diff --git a/bundles/org.eclipse.core.commands/.classpath b/bundles/org.eclipse.core.commands/.classpath
deleted file mode 100644
index ce0c7a5..0000000
--- a/bundles/org.eclipse.core.commands/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/CDC-1.0%Foundation-1.0"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.core.commands/.cvsignore b/bundles/org.eclipse.core.commands/.cvsignore
deleted file mode 100644
index fe99505..0000000
--- a/bundles/org.eclipse.core.commands/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-
diff --git a/bundles/org.eclipse.core.commands/.project b/bundles/org.eclipse.core.commands/.project
deleted file mode 100644
index d16fcce..0000000
--- a/bundles/org.eclipse.core.commands/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.commands</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.core.commands/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.core.commands/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 72e8a1b..0000000
--- a/bundles/org.eclipse.core.commands/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,80 +0,0 @@
-#Tue Sep 11 09:41:20 EDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.1
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.3
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.core.commands/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.core.commands/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 3f5ce1c..0000000
--- a/bundles/org.eclipse.core.commands/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Fri Oct 31 10:29:44 EDT 2008
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.5\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template></templates>
diff --git a/bundles/org.eclipse.core.commands/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.core.commands/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 3b2510f..0000000
--- a/bundles/org.eclipse.core.commands/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Nov 16 14:10:21 EST 2004
-compilers.p.unused-element-or-attribute=1
-compilers.p.unresolved-ex-points=0
-compilers.p.deprecated=0
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unknown-class=1
-compilers.p.unknown-attribute=0
-compilers.p.no-required-att=0
-eclipse.preferences.version=1
-compilers.p.unresolved-import=0
-compilers.p.not-externalized-att=0
-compilers.p.illegal-att-value=0
-compilers.use-project=true
diff --git a/bundles/org.eclipse.core.commands/META-INF/MANIFEST.MF b/bundles/org.eclipse.core.commands/META-INF/MANIFEST.MF
deleted file mode 100644
index 10327a9..0000000
--- a/bundles/org.eclipse.core.commands/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,18 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.core.commands
-Bundle-Version: 3.5.0.qualifier
-Bundle-ClassPath: .
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.core.commands,
- org.eclipse.core.commands.common,
- org.eclipse.core.commands.contexts,
- org.eclipse.core.commands.operations,
- org.eclipse.core.commands.util,
- org.eclipse.core.internal.commands.operations;x-internal:=true,
- org.eclipse.core.internal.commands.util;x-internal:=true
-Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.2.0,4.0.0)"
-Bundle-RequiredExecutionEnvironment: CDC-1.0/Foundation-1.0,
- J2SE-1.3
diff --git a/bundles/org.eclipse.core.commands/about.html b/bundles/org.eclipse.core.commands/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.core.commands/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.commands/build.properties b/bundles/org.eclipse.core.commands/build.properties
deleted file mode 100644
index f926fc5..0000000
--- a/bundles/org.eclipse.core.commands/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2004, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-src.includes = about.html
-bin.includes = about.html,\
-               plugin.properties,\
-               .,\
-               META-INF/
diff --git a/bundles/org.eclipse.core.commands/plugin.properties b/bundles/org.eclipse.core.commands/plugin.properties
deleted file mode 100644
index 45b6297..0000000
--- a/bundles/org.eclipse.core.commands/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2004,2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName = Commands
-providerName = Eclipse.org
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/AbstractHandler.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/AbstractHandler.java
deleted file mode 100644
index b703732..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/AbstractHandler.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-import org.eclipse.core.commands.common.EventManager;
-
-/**
- * <p>
- * This class is a partial implementation of <code>IHandler</code>. This
- * abstract implementation provides support for handler listeners. You should
- * subclass from this method unless you want to implement your own listener
- * support. Subclasses should call
- * {@link AbstractHandler#fireHandlerChanged(HandlerEvent)}when the handler
- * changes. Subclasses can also override {@link AbstractHandler#isEnabled()} and
- * {@link AbstractHandler#isHandled()}.
- * </p>
- * 
- * @since 3.1
- */
-public abstract class AbstractHandler extends EventManager implements IHandler2 {
-
-	/**
-	 * Track this base class enabled state.
-	 * 
-	 * @since 3.4
-	 */
-	private boolean baseEnabled = true;
-
-	/**
-	 * @see IHandler#addHandlerListener(IHandlerListener)
-	 */
-	public void addHandlerListener(final IHandlerListener handlerListener) {
-		addListenerObject(handlerListener);
-	}
-
-	/**
-	 * The default implementation does nothing. Subclasses who attach listeners
-	 * to other objects are encouraged to detach them in this method.
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#dispose()
-	 */
-	public void dispose() {
-		// Do nothing.
-	}
-
-	/**
-	 * Fires an event to all registered listeners describing changes to this
-	 * instance.
-	 * <p>
-	 * Subclasses may extend the definition of this method (i.e., if a different
-	 * type of listener can be attached to a subclass). This is used primarily
-	 * for support of <code>AbstractHandler</code> in
-	 * <code>org.eclipse.ui.workbench</code>, and clients should be wary of
-	 * overriding this behaviour. If this method is overridden, then the first
-	 * line of the method should be "<code>super.fireHandlerChanged(handlerEvent);</code>".
-	 * </p>
-	 * 
-	 * @param handlerEvent
-	 *            the event describing changes to this instance. Must not be
-	 *            <code>null</code>.
-	 */
-	protected void fireHandlerChanged(final HandlerEvent handlerEvent) {
-		if (handlerEvent == null) {
-			throw new NullPointerException();
-		}
-
-		final Object[] listeners = getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			final IHandlerListener listener = (IHandlerListener) listeners[i];
-			listener.handlerChanged(handlerEvent);
-		}
-	}
-
-	/**
-	 * Whether this handler is capable of executing at this time. Subclasses may
-	 * override this method. If clients override this method they should also
-	 * consider overriding {@link #setEnabled(Object)} so they can be notified
-	 * about framework execution contexts.
-	 * 
-	 * @return <code>true</code>
-	 * @see #setEnabled(Object)
-	 * @see #setBaseEnabled(boolean)
-	 */
-	public boolean isEnabled() {
-		return baseEnabled;
-	}
-
-	/**
-	 * Allow the default {@link #isEnabled()} to answer our enabled state. It
-	 * will fire a HandlerEvent if necessary. If clients use this method they
-	 * should also consider overriding {@link #setEnabled(Object)} so they can
-	 * be notified about framework execution contexts.
-	 * 
-	 * @param state
-	 *            the enabled state
-	 * @since 3.4
-	 */
-	protected void setBaseEnabled(boolean state) {
-		if (baseEnabled == state) {
-			return;
-		}
-		baseEnabled = state;
-		fireHandlerChanged(new HandlerEvent(this, true, false));
-	}
-
-	/**
-	 * Called by the framework to allow the handler to update its enabled state
-	 * by extracting the same information available at execution time. Clients
-	 * may override if they need to extract information from the application
-	 * context.
-	 * 
-	 * @param evaluationContext
-	 *            the application context. May be <code>null</code>
-	 * @since 3.4
-	 * @see #setBaseEnabled(boolean)
-	 */
-	public void setEnabled(Object evaluationContext) {
-	}
-
-	/**
-	 * Whether this handler is capable of handling delegated responsibilities at
-	 * this time. Subclasses may override this method.
-	 * 
-	 * @return <code>true</code>
-	 */
-	public boolean isHandled() {
-		return true;
-	}
-
-	/**
-	 * <p>
-	 * Returns true iff there is one or more IHandlerListeners attached to this
-	 * AbstractHandler.
-	 * </p>
-	 * <p>
-	 * Subclasses may extend the definition of this method (i.e., if a different
-	 * type of listener can be attached to a subclass). This is used primarily
-	 * for support of <code>AbstractHandler</code> in
-	 * <code>org.eclipse.ui.workbench</code>, and clients should be wary of
-	 * overriding this behaviour. If this method is overridden, then the return
-	 * value should include "<code>super.hasListeners() ||</code>".
-	 * </p>
-	 * 
-	 * @return true iff there is one or more IHandlerListeners attached to this
-	 *         AbstractHandler
-	 */
-	protected boolean hasListeners() {
-		return isListenerAttached();
-	}
-
-	/**
-	 * @see IHandler#removeHandlerListener(IHandlerListener)
-	 */
-	public void removeHandlerListener(final IHandlerListener handlerListener) {
-		removeListenerObject(handlerListener);
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/AbstractHandlerWithState.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/AbstractHandlerWithState.java
deleted file mode 100644
index 219c938..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/AbstractHandlerWithState.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * <p>
- * An abstract implementation of {@link IObjectWithState}. This provides basic
- * handling for adding and remove state. When state is added, the handler
- * attaches itself as a listener and fire a handleStateChange event to notify
- * this handler. When state is removed, the handler removes itself as a
- * listener.
- * </p>
- * <p>
- * Clients may extend this class.
- * </p>
- * 
- * @since 3.2
- */
-public abstract class AbstractHandlerWithState extends AbstractHandler
-		implements IObjectWithState, IStateListener {
-
-	/**
-	 * The map of states currently held by this handler. If this handler has no
-	 * state (generally, when inactive), then this will be <code>null</code>.
-	 */
-	private Map states = null;
-
-	/**
-	 * <p>
-	 * Adds a state to this handler. This will add this handler as a listener to
-	 * the state, and then fire a handleStateChange so that the handler can
-	 * respond to the incoming state.
-	 * </p>
-	 * <p>
-	 * Clients may extend this method, but they should call this super method
-	 * first before doing anything else.
-	 * </p>
-	 * 
-	 * @param stateId
-	 *            The identifier indicating the type of state being added; must
-	 *            not be <code>null</code>.
-	 * @param state
-	 *            The state to add; must not be <code>null</code>.
-	 */
-	public void addState(final String stateId, final State state) {
-		if (state == null) {
-			throw new NullPointerException("Cannot add a null state"); //$NON-NLS-1$
-		}
-
-		if (states == null) {
-			states = new HashMap(3);
-		}
-		states.put(stateId, state);
-		state.addListener(this);
-		handleStateChange(state, null);
-	}
-
-	public final State getState(final String stateId) {
-		if ((states == null) || (states.isEmpty())) {
-			return null;
-		}
-
-		return (State) states.get(stateId);
-	}
-
-	public final String[] getStateIds() {
-		if ((states == null) || (states.isEmpty())) {
-			return null;
-		}
-
-		final Set stateIds = states.keySet();
-		return (String[]) stateIds.toArray(new String[stateIds.size()]);
-	}
-
-	/**
-	 * <p>
-	 * Removes a state from this handler. This will remove this handler as a
-	 * listener to the state. No event is fired to notify the handler of this
-	 * change.
-	 * </p>
-	 * <p>
-	 * Clients may extend this method, but they should call this super method
-	 * first before doing anything else.
-	 * </p>
-	 * 
-	 * @param stateId
-	 *            The identifier of the state to remove; must not be
-	 *            <code>null</code>.
-	 */
-	public void removeState(final String stateId) {
-		if (stateId == null) {
-			throw new NullPointerException("Cannot remove a null state"); //$NON-NLS-1$
-		}
-
-		final State state = (State) states.get(stateId);
-		if (state != null) {
-			state.removeListener(this);
-			if (states != null) {
-				states.remove(state);
-				if (states.isEmpty()) {
-					states = null;
-				}
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/AbstractParameterValueConverter.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/AbstractParameterValueConverter.java
deleted file mode 100644
index bf79a3f..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/AbstractParameterValueConverter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-/**
- * <p>
- * Supports conversion between objects and strings for command parameter values.
- * Extenders must produce strings that identify objects (of a specific command
- * parameter type) as well as consume the strings to locate and return the
- * objects they identify.
- * </p>
- * <p>
- * This class offers multiple handlers of a command a consistent way of
- * converting string parameter values into the objects that the handlers would
- * prefer to deal with. This class also gives clients a way to serialize
- * object parameters as strings so that entire parameterized commands can be
- * serialized, stored and later deserialized and executed.
- * </p>
- * <p>
- * This class will typically be extended so the subclass can be referenced from
- * the <code>converter</code> attribute of the
- * <code>commandParameterType</code> elemement of the
- * <code>org.eclipse.ui.commands</code> extension-point. Objects implementing
- * this interface may also be passed directly to
- * {@link ParameterType#define(String, AbstractParameterValueConverter)} by
- * clients.
- * </p>
- * 
- * @see ParameterType#define(String, AbstractParameterValueConverter)
- * @see ParameterizedCommand#serialize()
- * @since 3.2
- */
-public abstract class AbstractParameterValueConverter {
-
-	/**
-	 * Converts a string encoded command parameter value into the parameter
-	 * value object.
-	 * 
-	 * @param parameterValue
-	 *            a command parameter value string describing an object; may be
-	 *            <code>null</code>
-	 * @return the object described by the command parameter value string; may
-	 *         be <code>null</code>
-	 * @throws ParameterValueConversionException
-	 *             if an object cannot be produced from the
-	 *             <code>parameterValue</code> string
-	 */
-	public abstract Object convertToObject(final String parameterValue)
-			throws ParameterValueConversionException;
-
-	/**
-	 * Converts a command parameter value object into a string that encodes a
-	 * reference to the object or serialization of the object.
-	 * 
-	 * @param parameterValue
-	 *            an object to convert into an identifying string; may be
-	 *            <code>null</code>
-	 * @return a string describing the provided object; may be <code>null</code>
-	 * @throws ParameterValueConversionException
-	 *             if a string reference or serialization cannot be provided for
-	 *             the <code>parameterValue</code>
-	 */
-	public abstract String convertToString(final Object parameterValue)
-			throws ParameterValueConversionException;
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/Category.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/Category.java
deleted file mode 100644
index e8c968f..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/Category.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.commands.common.NamedHandleObject;
-import org.eclipse.core.internal.commands.util.Util;
-
-/**
- * <p>
- * A logical group for a set of commands. A command belongs to exactly one
- * category. The category has no functional effect, but may be used in graphical
- * tools that want to group the set of commands somehow.
- * </p>
- * 
- * @since 3.1
- */
-public final class Category extends NamedHandleObject {
-
-	/**
-	 * A collection of objects listening to changes to this category. This
-	 * collection is <code>null</code> if there are no listeners.
-	 */
-	private Collection categoryListeners;
-
-	/**
-	 * Constructs a new instance of <code>Category</code> based on the given
-	 * identifier. When a category is first constructed, it is undefined.
-	 * Category should only be constructed by the <code>CommandManager</code>
-	 * to ensure that identifier remain unique.
-	 * 
-	 * @param id
-	 *            The identifier for the category. This value must not be
-	 *            <code>null</code>, and must be unique amongst all
-	 *            categories.
-	 */
-	Category(final String id) {
-		super(id);
-	}
-
-	/**
-	 * Adds a listener to this category that will be notified when this
-	 * category's state changes.
-	 * 
-	 * @param categoryListener
-	 *            The listener to be added; must not be <code>null</code>.
-	 */
-	public final void addCategoryListener(
-			final ICategoryListener categoryListener) {
-		if (categoryListener == null) {
-			throw new NullPointerException();
-		}
-		if (categoryListeners == null) {
-			categoryListeners = new ArrayList();
-		}
-		if (!categoryListeners.contains(categoryListener)) {
-			categoryListeners.add(categoryListener);
-		}
-	}
-
-	/**
-	 * <p>
-	 * Defines this category by giving it a name, and possibly a description as
-	 * well. The defined property automatically becomes <code>true</code>.
-	 * </p>
-	 * <p>
-	 * Notification is sent to all listeners that something has changed.
-	 * </p>
-	 * 
-	 * @param name
-	 *            The name of this command; must not be <code>null</code>.
-	 * @param description
-	 *            The description for this command; may be <code>null</code>.
-	 */
-	public final void define(final String name, final String description) {
-		if (name == null) {
-			throw new NullPointerException(
-					"The name of a command cannot be null"); //$NON-NLS-1$
-		}
-
-		final boolean definedChanged = !this.defined;
-		this.defined = true;
-
-		final boolean nameChanged = !Util.equals(this.name, name);
-		this.name = name;
-
-		final boolean descriptionChanged = !Util.equals(this.description,
-				description);
-		this.description = description;
-
-		fireCategoryChanged(new CategoryEvent(this, definedChanged,
-				descriptionChanged, nameChanged));
-	}
-
-	/**
-	 * Notifies the listeners for this category that it has changed in some way.
-	 * 
-	 * @param categoryEvent
-	 *            The event to send to all of the listener; must not be
-	 *            <code>null</code>.
-	 */
-	private final void fireCategoryChanged(final CategoryEvent categoryEvent) {
-		if (categoryEvent == null) {
-			throw new NullPointerException();
-		}
-		if (categoryListeners != null) {
-			final Iterator listenerItr = categoryListeners.iterator();
-			while (listenerItr.hasNext()) {
-				final ICategoryListener listener = (ICategoryListener) listenerItr
-						.next();
-				listener.categoryChanged(categoryEvent);
-			}
-		}
-	}
-
-	/**
-	 * Removes a listener from this category.
-	 * 
-	 * @param categoryListener
-	 *            The listener to be removed; must not be <code>null</code>.
-	 * 
-	 */
-	public final void removeCategoryListener(
-			final ICategoryListener categoryListener) {
-		if (categoryListener == null) {
-			throw new NullPointerException();
-		}
-
-		if (categoryListeners != null) {
-			categoryListeners.remove(categoryListener);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.common.HandleObject#toString()
-	 */
-	public String toString() {
-		if (string == null) {
-			final StringBuffer stringBuffer = new StringBuffer();
-			stringBuffer.append("Category("); //$NON-NLS-1$
-            stringBuffer.append(id);
-            stringBuffer.append(',');
-            stringBuffer.append(name);
-            stringBuffer.append(',');
-            stringBuffer.append(description);
-            stringBuffer.append(',');
-			stringBuffer.append(defined);
-            stringBuffer.append(')');
-			string = stringBuffer.toString();
-		}
-		return string;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.common.HandleObject#undefine()
-	 */
-	public void undefine() {
-		string = null;
-
-		final boolean definedChanged = defined;
-		defined = false;
-
-		final boolean nameChanged = name != null;
-		name = null;
-
-		final boolean descriptionChanged = description != null;
-		description = null;
-
-		fireCategoryChanged(new CategoryEvent(this, definedChanged,
-				descriptionChanged, nameChanged));
-	}
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/CategoryEvent.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/CategoryEvent.java
deleted file mode 100644
index 9675802..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/CategoryEvent.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-import org.eclipse.core.commands.common.AbstractNamedHandleEvent;
-
-/**
- * An instance of this class describes changes to an instance of
- * <code>Category</code>.
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.1
- * @see ICategoryListener#categoryChanged(CategoryEvent)
- */
-public final class CategoryEvent extends AbstractNamedHandleEvent {
-
-	/**
-	 * The category that has changed; this value is never <code>null</code>.
-	 */
-	private final Category category;
-
-	/**
-	 * Creates a new instance of this class.
-	 * 
-	 * @param category
-	 *            the instance of the interface that changed.
-	 * @param definedChanged
-	 *            true, iff the defined property changed.
-	 * @param descriptionChanged
-	 *            true, iff the description property changed.
-	 * @param nameChanged
-	 *            true, iff the name property changed.
-	 */
-	public CategoryEvent(final Category category, final boolean definedChanged,
-			final boolean descriptionChanged, final boolean nameChanged) {
-		super(definedChanged, descriptionChanged, nameChanged);
-
-		if (category == null) {
-			throw new NullPointerException();
-		}
-		this.category = category;
-	}
-
-	/**
-	 * Returns the instance of the interface that changed.
-	 * 
-	 * @return the instance of the interface that changed. Guaranteed not to be
-	 *         <code>null</code>.
-	 */
-	public final Category getCategory() {
-		return category;
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/Command.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/Command.java
deleted file mode 100644
index f3f25a4..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/Command.java
+++ /dev/null
@@ -1,1118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.StringWriter;
-
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.util.Tracing;
-import org.eclipse.core.internal.commands.util.Util;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-
-/**
- * <p>
- * A command is an abstract representation for some semantic behaviour. It is
- * not the actual implementation of this behaviour, nor is it the visual
- * appearance of this behaviour in the user interface. Instead, it is a bridge
- * between the two.
- * </p>
- * <p>
- * The concept of a command is based on the command design pattern. The notable
- * difference is how the command delegates responsibility for execution. Rather
- * than allowing concrete subclasses, it uses a handler mechanism (see the
- * <code>handlers</code> extension point). This provides another level of
- * indirection.
- * </p>
- * <p>
- * A command will exist in two states: defined and undefined. A command is
- * defined if it is declared in the XML of a resolved plug-in. If the plug-in is
- * unloaded or the command is simply not declared, then it is undefined. Trying
- * to reference an undefined command will succeed, but trying to access any of
- * its functionality will fail with a <code>NotDefinedException</code>. If
- * you need to know when a command changes from defined to undefined (or vice
- * versa), then attach a command listener.
- * </p>
- * <p>
- * Commands are mutable and will change as their definition changes.
- * </p>
- * 
- * @since 3.1
- */
-public final class Command extends NamedHandleObjectWithState implements
-		Comparable {
-
-	/**
-	 * This flag can be set to <code>true</code> if commands should print
-	 * information to <code>System.out</code> when executing.
-	 */
-	public static boolean DEBUG_COMMAND_EXECUTION = false;
-
-	/**
-	 * This flag can be set to <code>true</code> if commands should print
-	 * information to <code>System.out</code> when changing handlers.
-	 */
-	public static boolean DEBUG_HANDLERS = false;
-
-	/**
-	 * This flag can be set to a particular command identifier if only that
-	 * command should print information to <code>System.out</code> when
-	 * changing handlers.
-	 */
-	public static String DEBUG_HANDLERS_COMMAND_ID = null;
-
-	/**
-	 * The category to which this command belongs. This value should not be
-	 * <code>null</code> unless the command is undefined.
-	 */
-	private Category category = null;
-
-	/**
-	 * A collection of objects listening to the execution of this command. This
-	 * collection is <code>null</code> if there are no listeners.
-	 */
-	private transient ListenerList executionListeners = null;
-
-	/**
-	 * The handler currently associated with this command. This value may be
-	 * <code>null</code> if there is no handler currently.
-	 */
-	private transient IHandler handler = null;
-
-	/**
-	 * The help context identifier for this command. This can be
-	 * <code>null</code> if there is no help currently associated with the
-	 * command.
-	 * 
-	 * @since 3.2
-	 */
-	private String helpContextId;
-
-	/**
-	 * The ordered array of parameters understood by this command. This value
-	 * may be <code>null</code> if there are no parameters, or if the command
-	 * is undefined. It may also be empty.
-	 */
-	private IParameter[] parameters = null;
-
-	/**
-	 * The type of the return value of this command. This value may be
-	 * <code>null</code> if the command does not declare a return type.
-	 * 
-	 * @since 3.2
-	 */
-	private ParameterType returnType = null;
-
-	/**
-	 * Our command will listen to the active handler for enablement changes so
-	 * that they can be fired from the command itself.
-	 * 
-	 * @since 3.3
-	 */
-	private IHandlerListener handlerListener;
-
-	/**
-	 * Constructs a new instance of <code>Command</code> based on the given
-	 * identifier. When a command is first constructed, it is undefined.
-	 * Commands should only be constructed by the <code>CommandManager</code>
-	 * to ensure that the identifier remains unique.
-	 * 
-	 * @param id
-	 *            The identifier for the command. This value must not be
-	 *            <code>null</code>, and must be unique amongst all commands.
-	 */
-	Command(final String id) {
-		super(id);
-	}
-
-	/**
-	 * Adds a listener to this command that will be notified when this command's
-	 * state changes.
-	 * 
-	 * @param commandListener
-	 *            The listener to be added; must not be <code>null</code>.
-	 */
-	public final void addCommandListener(final ICommandListener commandListener) {
-		if (commandListener == null) {
-			throw new NullPointerException("Cannot add a null command listener"); //$NON-NLS-1$
-		}
-		addListenerObject(commandListener);
-	}
-
-	/**
-	 * Adds a listener to this command that will be notified when this command
-	 * is about to execute.
-	 * 
-	 * @param executionListener
-	 *            The listener to be added; must not be <code>null</code>.
-	 */
-	public final void addExecutionListener(
-			final IExecutionListener executionListener) {
-		if (executionListener == null) {
-			throw new NullPointerException(
-					"Cannot add a null execution listener"); //$NON-NLS-1$
-		}
-
-		if (executionListeners == null) {
-			executionListeners = new ListenerList(ListenerList.IDENTITY);
-		}
-
-		executionListeners.add(executionListener);
-	}
-
-	/**
-	 * <p>
-	 * Adds a state to this command. This will add this state to the active
-	 * handler, if the active handler is an instance of {@link IObjectWithState}.
-	 * </p>
-	 * <p>
-	 * A single instance of {@link State} cannot be registered with multiple
-	 * commands. Each command requires its own unique instance.
-	 * </p>
-	 * 
-	 * @param id
-	 *            The identifier of the state to add; must not be
-	 *            <code>null</code>.
-	 * @param state
-	 *            The state to add; must not be <code>null</code>.
-	 * @since 3.2
-	 */
-	public void addState(final String id, final State state) {
-		super.addState(id, state);
-		state.setId(id);
-		if (handler instanceof IObjectWithState) {
-			((IObjectWithState) handler).addState(id, state);
-		}
-	}
-
-	/**
-	 * Compares this command with another command by comparing each of its
-	 * non-transient attributes.
-	 * 
-	 * @param object
-	 *            The object with which to compare; must be an instance of
-	 *            <code>Command</code>.
-	 * @return A negative integer, zero or a postivie integer, if the object is
-	 *         greater than, equal to or less than this command.
-	 */
-	public final int compareTo(final Object object) {
-		final Command castedObject = (Command) object;
-		int compareTo = Util.compare(category, castedObject.category);
-		if (compareTo == 0) {
-			compareTo = Util.compare(defined, castedObject.defined);
-			if (compareTo == 0) {
-				compareTo = Util.compare(description, castedObject.description);
-				if (compareTo == 0) {
-					compareTo = Util.compare(handler, castedObject.handler);
-					if (compareTo == 0) {
-						compareTo = Util.compare(id, castedObject.id);
-						if (compareTo == 0) {
-							compareTo = Util.compare(name, castedObject.name);
-							if (compareTo == 0) {
-								compareTo = Util.compare(parameters,
-										castedObject.parameters);
-							}
-						}
-					}
-				}
-			}
-		}
-		return compareTo;
-	}
-
-	/**
-	 * <p>
-	 * Defines this command by giving it a name, and possibly a description as
-	 * well. The defined property automatically becomes <code>true</code>.
-	 * </p>
-	 * <p>
-	 * Notification is sent to all listeners that something has changed.
-	 * </p>
-	 * 
-	 * @param name
-	 *            The name of this command; must not be <code>null</code>.
-	 * @param description
-	 *            The description for this command; may be <code>null</code>.
-	 * @param category
-	 *            The category for this command; must not be <code>null</code>.
-	 * @since 3.2
-	 */
-	public final void define(final String name, final String description,
-			final Category category) {
-		define(name, description, category, null);
-	}
-
-	/**
-	 * <p>
-	 * Defines this command by giving it a name, and possibly a description as
-	 * well. The defined property automatically becomes <code>true</code>.
-	 * </p>
-	 * <p>
-	 * Notification is sent to all listeners that something has changed.
-	 * </p>
-	 * 
-	 * @param name
-	 *            The name of this command; must not be <code>null</code>.
-	 * @param description
-	 *            The description for this command; may be <code>null</code>.
-	 * @param category
-	 *            The category for this command; must not be <code>null</code>.
-	 * @param parameters
-	 *            The parameters understood by this command. This value may be
-	 *            either <code>null</code> or empty if the command does not
-	 *            accept parameters.
-	 */
-	public final void define(final String name, final String description,
-			final Category category, final IParameter[] parameters) {
-		define(name, description, category, parameters, null);
-	}
-
-	/**
-	 * <p>
-	 * Defines this command by giving it a name, and possibly a description as
-	 * well. The defined property automatically becomes <code>true</code>.
-	 * </p>
-	 * <p>
-	 * Notification is sent to all listeners that something has changed.
-	 * </p>
-	 * 
-	 * @param name
-	 *            The name of this command; must not be <code>null</code>.
-	 * @param description
-	 *            The description for this command; may be <code>null</code>.
-	 * @param category
-	 *            The category for this command; must not be <code>null</code>.
-	 * @param parameters
-	 *            The parameters understood by this command. This value may be
-	 *            either <code>null</code> or empty if the command does not
-	 *            accept parameters.
-	 * @param returnType
-	 *            The type of value returned by this command. This value may be
-	 *            <code>null</code> if the command does not declare a return
-	 *            type.
-	 * @since 3.2
-	 */
-	public final void define(final String name, final String description,
-			final Category category, final IParameter[] parameters,
-			ParameterType returnType) {
-		define(name, description, category, parameters, returnType, null);
-	}
-
-	/**
-	 * <p>
-	 * Defines this command by giving it a name, and possibly a description as
-	 * well. The defined property automatically becomes <code>true</code>.
-	 * </p>
-	 * <p>
-	 * Notification is sent to all listeners that something has changed.
-	 * </p>
-	 * 
-	 * @param name
-	 *            The name of this command; must not be <code>null</code>.
-	 * @param description
-	 *            The description for this command; may be <code>null</code>.
-	 * @param category
-	 *            The category for this command; must not be <code>null</code>.
-	 * @param parameters
-	 *            The parameters understood by this command. This value may be
-	 *            either <code>null</code> or empty if the command does not
-	 *            accept parameters.
-	 * @param returnType
-	 *            The type of value returned by this command. This value may be
-	 *            <code>null</code> if the command does not declare a return
-	 *            type.
-	 * @param helpContextId
-	 *            The identifier of the help context to associate with this
-	 *            command; may be <code>null</code> if this command does not
-	 *            have any help associated with it.
-	 * @since 3.2
-	 */
-	public final void define(final String name, final String description,
-			final Category category, final IParameter[] parameters,
-			ParameterType returnType, final String helpContextId) {
-		if (name == null) {
-			throw new NullPointerException(
-					"The name of a command cannot be null"); //$NON-NLS-1$
-		}
-
-		if (category == null) {
-			throw new NullPointerException(
-					"The category of a command cannot be null"); //$NON-NLS-1$
-		}
-
-		final boolean definedChanged = !this.defined;
-		this.defined = true;
-
-		final boolean nameChanged = !Util.equals(this.name, name);
-		this.name = name;
-
-		final boolean descriptionChanged = !Util.equals(this.description,
-				description);
-		this.description = description;
-
-		final boolean categoryChanged = !Util.equals(this.category, category);
-		this.category = category;
-
-		final boolean parametersChanged = !Util.equals(this.parameters,
-				parameters);
-		this.parameters = parameters;
-
-		final boolean returnTypeChanged = !Util.equals(this.returnType,
-				returnType);
-		this.returnType = returnType;
-
-		final boolean helpContextIdChanged = !Util.equals(this.helpContextId,
-				helpContextId);
-		this.helpContextId = helpContextId;
-
-		fireCommandChanged(new CommandEvent(this, categoryChanged,
-				definedChanged, descriptionChanged, false, nameChanged,
-				parametersChanged, returnTypeChanged, helpContextIdChanged));
-	}
-
-	/**
-	 * Executes this command by delegating to the current handler, if any. If
-	 * the debugging flag is set, then this method prints information about
-	 * which handler is selected for performing this command. This method will
-	 * succeed regardless of whether the command is enabled or defined. It is
-	 * generally preferred to call {@link #executeWithChecks(ExecutionEvent)}.
-	 * 
-	 * @param event
-	 *            An event containing all the information about the current
-	 *            state of the application; must not be <code>null</code>.
-	 * @return The result of the execution; may be <code>null</code>. This
-	 *         result will be available to the client executing the command, and
-	 *         execution listeners.
-	 * @throws ExecutionException
-	 *             If the handler has problems executing this command.
-	 * @throws NotHandledException
-	 *             If there is no handler.
-	 * @deprecated Please use {@link #executeWithChecks(ExecutionEvent)}
-	 *             instead.
-	 */
-	public final Object execute(final ExecutionEvent event)
-			throws ExecutionException, NotHandledException {
-		firePreExecute(event);
-		final IHandler handler = this.handler;
-
-		// Perform the execution, if there is a handler.
-		if ((handler != null) && (handler.isHandled())) {
-			try {
-				final Object returnValue = handler.execute(event);
-				firePostExecuteSuccess(returnValue);
-				return returnValue;
-			} catch (final ExecutionException e) {
-				firePostExecuteFailure(e);
-				throw e;
-			}
-		}
-
-		final NotHandledException e = new NotHandledException(
-				"There is no handler to execute. " + getId()); //$NON-NLS-1$
-		fireNotHandled(e);
-		throw e;
-	}
-
-	/**
-	 * Executes this command by delegating to the current handler, if any. If
-	 * the debugging flag is set, then this method prints information about
-	 * which handler is selected for performing this command. This does checks
-	 * to see if the command is enabled and defined. If it is not both enabled
-	 * and defined, then the execution listeners will be notified and an
-	 * exception thrown.
-	 * 
-	 * @param event
-	 *            An event containing all the information about the current
-	 *            state of the application; must not be <code>null</code>.
-	 * @return The result of the execution; may be <code>null</code>. This
-	 *         result will be available to the client executing the command, and
-	 *         execution listeners.
-	 * @throws ExecutionException
-	 *             If the handler has problems executing this command.
-	 * @throws NotDefinedException
-	 *             If the command you are trying to execute is not defined.
-	 * @throws NotEnabledException
-	 *             If the command you are trying to execute is not enabled.
-	 * @throws NotHandledException
-	 *             If there is no handler.
-	 * @since 3.2
-	 */
-	public final Object executeWithChecks(final ExecutionEvent event)
-			throws ExecutionException, NotDefinedException,
-			NotEnabledException, NotHandledException {
-		firePreExecute(event);
-		final IHandler handler = this.handler;
-
-		if (!isDefined()) {
-			final NotDefinedException exception = new NotDefinedException(
-					"Trying to execute a command that is not defined. " //$NON-NLS-1$
-							+ getId());
-			fireNotDefined(exception);
-			throw exception;
-		}
-
-		// Perform the execution, if there is a handler.
-		if ((handler != null) && (handler.isHandled())) {
-			setEnabled(event.getApplicationContext());
-			if (!isEnabled()) {
-				final NotEnabledException exception = new NotEnabledException(
-						"Trying to execute the disabled command " + getId()); //$NON-NLS-1$
-				fireNotEnabled(exception);
-				throw exception;
-			}
-
-			try {
-				final Object returnValue = handler.execute(event);
-				firePostExecuteSuccess(returnValue);
-				return returnValue;
-			} catch (final ExecutionException e) {
-				firePostExecuteFailure(e);
-				throw e;
-			}
-		}
-
-		final NotHandledException e = new NotHandledException(
-				"There is no handler to execute for command " + getId()); //$NON-NLS-1$
-		fireNotHandled(e);
-		throw e;
-	}
-
-	/**
-	 * Notifies the listeners for this command that it has changed in some way.
-	 * 
-	 * @param commandEvent
-	 *            The event to send to all of the listener; must not be
-	 *            <code>null</code>.
-	 */
-	private final void fireCommandChanged(final CommandEvent commandEvent) {
-		if (commandEvent == null) {
-			throw new NullPointerException("Cannot fire a null event"); //$NON-NLS-1$
-		}
-
-		final Object[] listeners = getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			final ICommandListener listener = (ICommandListener) listeners[i];
-			SafeRunner.run(new ISafeRunnable() {
-				public void handleException(Throwable exception) {
-				}
-
-				public void run() throws Exception {
-					listener.commandChanged(commandEvent);
-				}
-			});
-		}
-	}
-
-	/**
-	 * Notifies the execution listeners for this command that an attempt to
-	 * execute has failed because the command is not defined.
-	 * 
-	 * @param e
-	 *            The exception that is about to be thrown; never
-	 *            <code>null</code>.
-	 * @since 3.2
-	 */
-	private final void fireNotDefined(final NotDefinedException e) {
-		// Debugging output
-		if (DEBUG_COMMAND_EXECUTION) {
-			Tracing.printTrace("COMMANDS", "execute" + Tracing.SEPARATOR //$NON-NLS-1$ //$NON-NLS-2$
-					+ "not defined: id=" + getId() + "; exception=" + e); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		if (executionListeners != null) {
-			final Object[] listeners = executionListeners.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				final Object object = listeners[i];
-				if (object instanceof IExecutionListenerWithChecks) {
-					final IExecutionListenerWithChecks listener = (IExecutionListenerWithChecks) object;
-					listener.notDefined(getId(), e);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Notifies the execution listeners for this command that an attempt to
-	 * execute has failed because there is no handler.
-	 * 
-	 * @param e
-	 *            The exception that is about to be thrown; never
-	 *            <code>null</code>.
-	 * @since 3.2
-	 */
-	private final void fireNotEnabled(final NotEnabledException e) {
-		// Debugging output
-		if (DEBUG_COMMAND_EXECUTION) {
-			Tracing.printTrace("COMMANDS", "execute" + Tracing.SEPARATOR //$NON-NLS-1$ //$NON-NLS-2$
-					+ "not enabled: id=" + getId() + "; exception=" + e); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		if (executionListeners != null) {
-			final Object[] listeners = executionListeners.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				final Object object = listeners[i];
-				if (object instanceof IExecutionListenerWithChecks) {
-					final IExecutionListenerWithChecks listener = (IExecutionListenerWithChecks) object;
-					listener.notEnabled(getId(), e);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Notifies the execution listeners for this command that an attempt to
-	 * execute has failed because there is no handler.
-	 * 
-	 * @param e
-	 *            The exception that is about to be thrown; never
-	 *            <code>null</code>.
-	 */
-	private final void fireNotHandled(final NotHandledException e) {
-		// Debugging output
-		if (DEBUG_COMMAND_EXECUTION) {
-			Tracing.printTrace("COMMANDS", "execute" + Tracing.SEPARATOR //$NON-NLS-1$ //$NON-NLS-2$
-					+ "not handled: id=" + getId() + "; exception=" + e); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		if (executionListeners != null) {
-			final Object[] listeners = executionListeners.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				final IExecutionListener listener = (IExecutionListener) listeners[i];
-				listener.notHandled(getId(), e);
-			}
-		}
-	}
-
-	/**
-	 * Notifies the execution listeners for this command that an attempt to
-	 * execute has failed during the execution.
-	 * 
-	 * @param e
-	 *            The exception that has been thrown; never <code>null</code>.
-	 *            After this method completes, the exception will be thrown
-	 *            again.
-	 */
-	private final void firePostExecuteFailure(final ExecutionException e) {
-		// Debugging output
-		if (DEBUG_COMMAND_EXECUTION) {
-			Tracing.printTrace("COMMANDS", "execute" + Tracing.SEPARATOR //$NON-NLS-1$ //$NON-NLS-2$
-					+ "failure: id=" + getId() + "; exception=" + e); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		if (executionListeners != null) {
-			final Object[] listeners = executionListeners.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				final IExecutionListener listener = (IExecutionListener) listeners[i];
-				listener.postExecuteFailure(getId(), e);
-			}
-		}
-	}
-
-	/**
-	 * Notifies the execution listeners for this command that an execution has
-	 * completed successfully.
-	 * 
-	 * @param returnValue
-	 *            The return value from the command; may be <code>null</code>.
-	 */
-	private final void firePostExecuteSuccess(final Object returnValue) {
-		// Debugging output
-		if (DEBUG_COMMAND_EXECUTION) {
-			Tracing.printTrace("COMMANDS", "execute" + Tracing.SEPARATOR //$NON-NLS-1$ //$NON-NLS-2$
-					+ "success: id=" + getId() + "; returnValue=" //$NON-NLS-1$ //$NON-NLS-2$
-					+ returnValue);
-		}
-
-		if (executionListeners != null) {
-			final Object[] listeners = executionListeners.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				final IExecutionListener listener = (IExecutionListener) listeners[i];
-				listener.postExecuteSuccess(getId(), returnValue);
-			}
-		}
-	}
-
-	/**
-	 * Notifies the execution listeners for this command that an attempt to
-	 * execute is about to start.
-	 * 
-	 * @param event
-	 *            The execution event that will be used; never <code>null</code>.
-	 */
-	private final void firePreExecute(final ExecutionEvent event) {
-		// Debugging output
-		if (DEBUG_COMMAND_EXECUTION) {
-			Tracing.printTrace("COMMANDS", "execute" + Tracing.SEPARATOR //$NON-NLS-1$ //$NON-NLS-2$
-					+ "starting: id=" + getId() + "; event=" + event); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		if (executionListeners != null) {
-			final Object[] listeners = executionListeners.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				final IExecutionListener listener = (IExecutionListener) listeners[i];
-				listener.preExecute(getId(), event);
-			}
-		}
-	}
-
-	/**
-	 * Returns the category for this command.
-	 * 
-	 * @return The category for this command; never <code>null</code>.
-	 * @throws NotDefinedException
-	 *             If the handle is not currently defined.
-	 */
-	public final Category getCategory() throws NotDefinedException {
-		if (!isDefined()) {
-			throw new NotDefinedException(
-					"Cannot get the category from an undefined command. " //$NON-NLS-1$
-							+ id);
-		}
-
-		return category;
-	}
-
-	/**
-	 * Returns the current handler for this command. This is used by the command
-	 * manager for determining the appropriate help context identifiers and by
-	 * the command service to allow handlers to update elements.
-	 * <p>
-	 * This value can change at any time and should never be cached.
-	 * </p>
-	 * 
-	 * @return The current handler for this command; may be <code>null</code>.
-	 * @since 3.3
-	 */
-	public final IHandler getHandler() {
-		return handler;
-	}
-
-	/**
-	 * Returns the help context identifier associated with this command. This
-	 * method should not be called by clients. Clients should use
-	 * {@link CommandManager#getHelpContextId(Command)} instead.
-	 * 
-	 * @return The help context identifier for this command; may be
-	 *         <code>null</code> if there is none.
-	 * @since 3.2
-	 */
-	final String getHelpContextId() {
-		return helpContextId;
-	}
-
-	/**
-	 * Returns the parameter with the provided id or <code>null</code> if this
-	 * command does not have a parameter with the id.
-	 * 
-	 * @param parameterId
-	 *            The id of the parameter to retrieve.
-	 * @return The parameter with the provided id or <code>null</code> if this
-	 *         command does not have a parameter with the id.
-	 * @throws NotDefinedException
-	 *             If the handle is not currently defined.
-	 * @since 3.2
-	 */
-	public final IParameter getParameter(final String parameterId)
-			throws NotDefinedException {
-		if (!isDefined()) {
-			throw new NotDefinedException(
-					"Cannot get a parameter from an undefined command. " //$NON-NLS-1$
-							+ id);
-		}
-
-		if (parameters == null) {
-			return null;
-		}
-
-		for (int i = 0; i < parameters.length; i++) {
-			final IParameter parameter = parameters[i];
-			if (parameter.getId().equals(parameterId)) {
-				return parameter;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the parameters for this command. This call triggers provides a
-	 * copy of the array, so excessive calls to this method should be avoided.
-	 * 
-	 * @return The parameters for this command. This value might be
-	 *         <code>null</code>, if the command has no parameters.
-	 * @throws NotDefinedException
-	 *             If the handle is not currently defined.
-	 */
-	public final IParameter[] getParameters() throws NotDefinedException {
-		if (!isDefined()) {
-			throw new NotDefinedException(
-					"Cannot get the parameters from an undefined command. " //$NON-NLS-1$
-							+ id);
-		}
-
-		if ((parameters == null) || (parameters.length == 0)) {
-			return null;
-		}
-
-		final IParameter[] returnValue = new IParameter[parameters.length];
-		System.arraycopy(parameters, 0, returnValue, 0, parameters.length);
-		return returnValue;
-	}
-
-	/**
-	 * Returns the {@link ParameterType} for the parameter with the provided id
-	 * or <code>null</code> if this command does not have a parameter type
-	 * with the id.
-	 * 
-	 * @param parameterId
-	 *            The id of the parameter to retrieve the {@link ParameterType}
-	 *            of.
-	 * @return The {@link ParameterType} for the parameter with the provided id
-	 *         or <code>null</code> if this command does not have a parameter
-	 *         type with the provided id.
-	 * @throws NotDefinedException
-	 *             If the handle is not currently defined.
-	 * @since 3.2
-	 */
-	public final ParameterType getParameterType(final String parameterId)
-			throws NotDefinedException {
-		final IParameter parameter = getParameter(parameterId);
-		if (parameter instanceof ITypedParameter) {
-			final ITypedParameter parameterWithType = (ITypedParameter) parameter;
-			return parameterWithType.getParameterType();
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the {@link ParameterType} for the return value of this command or
-	 * <code>null</code> if this command does not declare a return value
-	 * parameter type.
-	 * 
-	 * @return The {@link ParameterType} for the return value of this command or
-	 *         <code>null</code> if this command does not declare a return
-	 *         value parameter type.
-	 * @throws NotDefinedException
-	 *             If the handle is not currently defined.
-	 * @since 3.2
-	 */
-	public final ParameterType getReturnType() throws NotDefinedException {
-		if (!isDefined()) {
-			throw new NotDefinedException(
-					"Cannot get the return type of an undefined command. " //$NON-NLS-1$
-							+ id);
-		}
-
-		return returnType;
-	}
-
-	/**
-	 * Returns whether this command has a handler, and whether this handler is
-	 * also handled and enabled.
-	 * 
-	 * @return <code>true</code> if the command is handled; <code>false</code>
-	 *         otherwise.
-	 */
-	public final boolean isEnabled() {
-		if (handler == null) {
-			return false;
-		}
-
-		try {
-			return handler.isEnabled();
-		} catch (Exception e) {
-			if (DEBUG_HANDLERS) {
-				// since this has the ability to generate megs of logs, only
-				// provide information if tracing
-				Tracing.printTrace("HANDLERS", "Handler " + handler  + " for "  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-						+ id + " threw unexpected exception"); //$NON-NLS-1$ 
-				e.printStackTrace(System.out);
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Called be the framework to allow the handler to update its enabled state.
-	 * 
-	 * @param evaluationContext
-	 *            the state to evaluate against. May be <code>null</code>
-	 *            which indicates that the handler can query whatever model that
-	 *            is necessary.  This context must not be cached.
-	 * @since 3.4
-	 */
-	public void setEnabled(Object evaluationContext) {
-		if (handler instanceof IHandler2) {
-			((IHandler2) handler).setEnabled(evaluationContext);
-		}
-	}
-
-	/**
-	 * Returns whether this command has a handler, and whether this handler is
-	 * also handled.
-	 * 
-	 * @return <code>true</code> if the command is handled; <code>false</code>
-	 *         otherwise.
-	 */
-	public final boolean isHandled() {
-		if (handler == null) {
-			return false;
-		}
-
-		return handler.isHandled();
-	}
-
-	/**
-	 * Removes a listener from this command.
-	 * 
-	 * @param commandListener
-	 *            The listener to be removed; must not be <code>null</code>.
-	 * 
-	 */
-	public final void removeCommandListener(
-			final ICommandListener commandListener) {
-		if (commandListener == null) {
-			throw new NullPointerException(
-					"Cannot remove a null command listener"); //$NON-NLS-1$
-		}
-
-		removeListenerObject(commandListener);
-	}
-
-	/**
-	 * Removes a listener from this command.
-	 * 
-	 * @param executionListener
-	 *            The listener to be removed; must not be <code>null</code>.
-	 * 
-	 */
-	public final void removeExecutionListener(
-			final IExecutionListener executionListener) {
-		if (executionListener == null) {
-			throw new NullPointerException(
-					"Cannot remove a null execution listener"); //$NON-NLS-1$
-		}
-
-		if (executionListeners != null) {
-			executionListeners.remove(executionListener);
-			if (executionListeners.isEmpty()) {
-				executionListeners = null;
-			}
-		}
-	}
-
-	/**
-	 * <p>
-	 * Removes a state from this command. This will remove the state from the
-	 * active handler, if the active handler is an instance of
-	 * {@link IObjectWithState}.
-	 * </p>
-	 * 
-	 * @param stateId
-	 *            The identifier of the state to remove; must not be
-	 *            <code>null</code>.
-	 * @since 3.2
-	 */
-	public void removeState(final String stateId) {
-		if (handler instanceof IObjectWithState) {
-			((IObjectWithState) handler).removeState(stateId);
-		}
-		super.removeState(stateId);
-	}
-
-	/**
-	 * Changes the handler for this command. This will remove all the state from
-	 * the currently active handler (if any), and add it to <code>handler</code>.
-	 * If debugging is turned on, then this will also print information about
-	 * the change to <code>System.out</code>.
-	 * 
-	 * @param handler
-	 *            The new handler; may be <code>null</code> if none.
-	 * @return <code>true</code> if the handler changed; <code>false</code>
-	 *         otherwise.
-	 */
-	public final boolean setHandler(final IHandler handler) {
-		if (Util.equals(handler, this.handler)) {
-			return false;
-		}
-
-		// Swap the state around.
-		final String[] stateIds = getStateIds();
-		if (stateIds != null) {
-			for (int i = 0; i < stateIds.length; i++) {
-				final String stateId = stateIds[i];
-				if (this.handler instanceof IObjectWithState) {
-					((IObjectWithState) this.handler).removeState(stateId);
-				}
-				if (handler instanceof IObjectWithState) {
-					final State stateToAdd = getState(stateId);
-					((IObjectWithState) handler).addState(stateId, stateToAdd);
-				}
-			}
-		}
-
-		boolean enabled = isEnabled();
-		if (this.handler != null) {
-			this.handler.removeHandlerListener(getHandlerListener());
-		}
-
-		// Update the handler, and flush the string representation.
-		this.handler = handler;
-		if (this.handler != null) {
-			this.handler.addHandlerListener(getHandlerListener());
-		}
-		string = null;
-
-		// Debugging output
-		if ((DEBUG_HANDLERS)
-				&& ((DEBUG_HANDLERS_COMMAND_ID == null) || (DEBUG_HANDLERS_COMMAND_ID
-						.equals(id)))) {
-			final StringBuffer buffer = new StringBuffer("Command('"); //$NON-NLS-1$
-			buffer.append(id);
-			buffer.append("') has changed to "); //$NON-NLS-1$
-			if (handler == null) {
-				buffer.append("no handler"); //$NON-NLS-1$
-			} else {
-				buffer.append('\'');
-				buffer.append(handler);
-				buffer.append("' as its handler"); //$NON-NLS-1$
-			}
-			Tracing.printTrace("HANDLERS", buffer.toString()); //$NON-NLS-1$
-		}
-
-		// Send notification
-		fireCommandChanged(new CommandEvent(this, false, false, false, true,
-				false, false, false, false, enabled != isEnabled()));
-
-		return true;
-	}
-
-	/**
-	 * @return the handler listener
-	 */
-	private IHandlerListener getHandlerListener() {
-		if (handlerListener == null) {
-			handlerListener = new IHandlerListener() {
-				public void handlerChanged(HandlerEvent handlerEvent) {
-					boolean enabledChanged = handlerEvent.isEnabledChanged();
-					boolean handledChanged = handlerEvent.isHandledChanged();
-					fireCommandChanged(new CommandEvent(Command.this, false,
-							false, false, handledChanged, false, false, false,
-							false, enabledChanged));
-				}
-			};
-		}
-		return handlerListener;
-	}
-
-	/**
-	 * The string representation of this command -- for debugging purposes only.
-	 * This string should not be shown to an end user.
-	 * 
-	 * @return The string representation; never <code>null</code>.
-	 */
-	public final String toString() {
-		if (string == null) {
-			final StringWriter sw = new StringWriter();
-			final BufferedWriter buffer = new BufferedWriter(sw);
-			try {
-				buffer.write("Command("); //$NON-NLS-1$
-				buffer.write(id);
-				buffer.write(',');
-				buffer.write(name==null?"":name); //$NON-NLS-1$
-				buffer.write(',');
-				buffer.newLine();
-				buffer.write("\t\t"); //$NON-NLS-1$
-				buffer.write(description==null?"":description); //$NON-NLS-1$
-				buffer.write(',');
-				buffer.newLine();
-				buffer.write("\t\t"); //$NON-NLS-1$
-				buffer.write(category==null?"":category.toString()); //$NON-NLS-1$
-				buffer.write(',');
-				buffer.newLine();
-				buffer.write("\t\t"); //$NON-NLS-1$
-				buffer.write(handler==null?"":handler.toString()); //$NON-NLS-1$
-				buffer.write(',');
-				buffer.newLine();
-				buffer.write("\t\t"); //$NON-NLS-1$
-				buffer.write(parameters==null?"":parameters.toString()); //$NON-NLS-1$
-				buffer.write(',');
-				buffer.write(returnType==null?"":returnType.toString()); //$NON-NLS-1$
-				buffer.write(',');
-				buffer.write(""+defined); //$NON-NLS-1$
-				buffer.write(')');
-				buffer.flush();
-			} catch (IOException e) {
-				// should never get this exception
-			}
-			string = sw.toString();
-		}
-		return string;
-	}
-
-	/**
-	 * Makes this command become undefined. This has the side effect of changing
-	 * the name and description to <code>null</code>. This also removes all
-	 * state and disposes of it. Notification is sent to all listeners.
-	 */
-	public final void undefine() {
-		boolean enabledChanged = isEnabled();
-
-		string = null;
-
-		final boolean definedChanged = defined;
-		defined = false;
-
-		final boolean nameChanged = name != null;
-		name = null;
-
-		final boolean descriptionChanged = description != null;
-		description = null;
-
-		final boolean categoryChanged = category != null;
-		category = null;
-
-		final boolean parametersChanged = parameters != null;
-		parameters = null;
-
-		final boolean returnTypeChanged = returnType != null;
-		returnType = null;
-
-		final String[] stateIds = getStateIds();
-		if (stateIds != null) {
-			if (handler instanceof IObjectWithState) {
-				final IObjectWithState handlerWithState = (IObjectWithState) handler;
-				for (int i = 0; i < stateIds.length; i++) {
-					final String stateId = stateIds[i];
-					handlerWithState.removeState(stateId);
-
-					final State state = getState(stateId);
-					removeState(stateId);
-					state.dispose();
-				}
-			} else {
-				for (int i = 0; i < stateIds.length; i++) {
-					final String stateId = stateIds[i];
-					final State state = getState(stateId);
-					removeState(stateId);
-					state.dispose();
-				}
-			}
-		}
-
-		fireCommandChanged(new CommandEvent(this, categoryChanged,
-				definedChanged, descriptionChanged, false, nameChanged,
-				parametersChanged, returnTypeChanged, false, enabledChanged));
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/CommandEvent.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/CommandEvent.java
deleted file mode 100644
index 20c5b8a..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/CommandEvent.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-import org.eclipse.core.commands.common.AbstractNamedHandleEvent;
-
-/**
- * An instance of this class describes changes to an instance of
- * <code>Command</code>.
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.1
- * @see ICommandListener#commandChanged(CommandEvent)
- */
-public final class CommandEvent extends AbstractNamedHandleEvent {
-
-	/**
-	 * The bit used to represent whether the command has changed its category.
-	 */
-	private static final int CHANGED_CATEGORY = LAST_USED_BIT << 1;
-
-	/**
-	 * The bit used to represent whether the command has changed its handler.
-	 */
-	private static final int CHANGED_HANDLED = LAST_USED_BIT << 2;
-
-	/**
-	 * The bit used to represent whether the command has changed its parameters.
-	 */
-	private static final int CHANGED_PARAMETERS = LAST_USED_BIT << 3;
-
-	/**
-	 * The bit used to represent whether the command has changed its return
-	 * type.
-	 * 
-	 * @since 3.2
-	 */
-	private static final int CHANGED_RETURN_TYPE = LAST_USED_BIT << 4;
-
-	/**
-	 * The bit used to represent whether the command has changed its help
-	 * context identifier.
-	 * 
-	 * @since 3.2
-	 */
-	private static final int CHANGED_HELP_CONTEXT_ID = LAST_USED_BIT << 5;
-
-	/**
-	 * The bit used to represent whether this commands active handler has
-	 * changed its enablement state.
-	 * 
-	 * @since 3.3
-	 */
-	private static final int CHANGED_ENABLED = LAST_USED_BIT << 6;
-
-	/**
-	 * The command that has changed; this value is never <code>null</code>.
-	 */
-	private final Command command;
-
-	/**
-	 * Creates a new instance of this class.
-	 * 
-	 * @param command
-	 *            the instance of the interface that changed.
-	 * @param categoryChanged
-	 *            <code>true</code>, iff the category property changed.
-	 * @param definedChanged
-	 *            <code>true</code>, iff the defined property changed.
-	 * @param descriptionChanged
-	 *            <code>true</code>, iff the description property changed.
-	 * @param handledChanged
-	 *            <code>true</code>, iff the handled property changed.
-	 * @param nameChanged
-	 *            <code>true</code>, iff the name property changed.
-	 * @param parametersChanged
-	 *            <code>true</code> if the parameters have changed;
-	 *            <code>false</code> otherwise.
-	 */
-	public CommandEvent(final Command command, final boolean categoryChanged,
-			final boolean definedChanged, final boolean descriptionChanged,
-			final boolean handledChanged, final boolean nameChanged,
-			final boolean parametersChanged) {
-		this(command, categoryChanged, definedChanged, descriptionChanged,
-				handledChanged, nameChanged, parametersChanged, false);
-	}
-
-	/**
-	 * Creates a new instance of this class.
-	 * 
-	 * @param command
-	 *            the instance of the interface that changed.
-	 * @param categoryChanged
-	 *            <code>true</code>, iff the category property changed.
-	 * @param definedChanged
-	 *            <code>true</code>, iff the defined property changed.
-	 * @param descriptionChanged
-	 *            <code>true</code>, iff the description property changed.
-	 * @param handledChanged
-	 *            <code>true</code>, iff the handled property changed.
-	 * @param nameChanged
-	 *            <code>true</code>, iff the name property changed.
-	 * @param parametersChanged
-	 *            <code>true</code> if the parameters have changed;
-	 *            <code>false</code> otherwise.
-	 * @param returnTypeChanged
-	 *            <code>true</code> iff the return type property changed;
-	 *            <code>false</code> otherwise.
-	 * @since 3.2
-	 */
-	public CommandEvent(final Command command, final boolean categoryChanged,
-			final boolean definedChanged, final boolean descriptionChanged,
-			final boolean handledChanged, final boolean nameChanged,
-			final boolean parametersChanged, final boolean returnTypeChanged) {
-		this(command, categoryChanged, definedChanged, descriptionChanged,
-				handledChanged, nameChanged, parametersChanged,
-				returnTypeChanged, false);
-	}
-
-	/**
-	 * Creates a new instance of this class.
-	 * 
-	 * @param command
-	 *            the instance of the interface that changed.
-	 * @param categoryChanged
-	 *            <code>true</code>, iff the category property changed.
-	 * @param definedChanged
-	 *            <code>true</code>, iff the defined property changed.
-	 * @param descriptionChanged
-	 *            <code>true</code>, iff the description property changed.
-	 * @param handledChanged
-	 *            <code>true</code>, iff the handled property changed.
-	 * @param nameChanged
-	 *            <code>true</code>, iff the name property changed.
-	 * @param parametersChanged
-	 *            <code>true</code> if the parameters have changed;
-	 *            <code>false</code> otherwise.
-	 * @param returnTypeChanged
-	 *            <code>true</code> iff the return type property changed;
-	 *            <code>false</code> otherwise.
-	 * @param helpContextIdChanged
-	 *            <code>true</code> iff the help context identifier changed;
-	 *            <code>false</code> otherwise.
-	 * @since 3.2
-	 */
-	public CommandEvent(final Command command, final boolean categoryChanged,
-			final boolean definedChanged, final boolean descriptionChanged,
-			final boolean handledChanged, final boolean nameChanged,
-			final boolean parametersChanged, final boolean returnTypeChanged,
-			final boolean helpContextIdChanged) {
-		this(command, categoryChanged, definedChanged, descriptionChanged,
-				handledChanged, nameChanged, parametersChanged,
-				returnTypeChanged, helpContextIdChanged, false);
-	}
-
-	/**
-	 * Creates a new instance of this class.
-	 * 
-	 * @param command
-	 *            the instance of the interface that changed.
-	 * @param categoryChanged
-	 *            <code>true</code>, iff the category property changed.
-	 * @param definedChanged
-	 *            <code>true</code>, iff the defined property changed.
-	 * @param descriptionChanged
-	 *            <code>true</code>, iff the description property changed.
-	 * @param handledChanged
-	 *            <code>true</code>, iff the handled property changed.
-	 * @param nameChanged
-	 *            <code>true</code>, iff the name property changed.
-	 * @param parametersChanged
-	 *            <code>true</code> if the parameters have changed;
-	 *            <code>false</code> otherwise.
-	 * @param returnTypeChanged
-	 *            <code>true</code> iff the return type property changed;
-	 *            <code>false</code> otherwise.
-	 * @param helpContextIdChanged
-	 *            <code>true</code> iff the help context identifier changed;
-	 *            <code>false</code> otherwise.
-	 * @param enabledChanged
-	 *            <code>true</code> iff the comand enablement changed;
-	 *            <code>false</code> otherwise.
-	 * @since 3.3
-	 */
-	public CommandEvent(final Command command, final boolean categoryChanged,
-			final boolean definedChanged, final boolean descriptionChanged,
-			final boolean handledChanged, final boolean nameChanged,
-			final boolean parametersChanged, final boolean returnTypeChanged,
-			final boolean helpContextIdChanged, final boolean enabledChanged) {
-		super(definedChanged, descriptionChanged, nameChanged);
-
-		if (command == null) {
-			throw new NullPointerException();
-		}
-		this.command = command;
-
-		if (categoryChanged) {
-			changedValues |= CHANGED_CATEGORY;
-		}
-		if (handledChanged) {
-			changedValues |= CHANGED_HANDLED;
-		}
-		if (parametersChanged) {
-			changedValues |= CHANGED_PARAMETERS;
-		}
-		if (returnTypeChanged) {
-			changedValues |= CHANGED_RETURN_TYPE;
-		}
-		if (helpContextIdChanged) {
-			changedValues |= CHANGED_HELP_CONTEXT_ID;
-		}
-		if (enabledChanged) {
-			changedValues |= CHANGED_ENABLED;
-		}
-	}
-
-	/**
-	 * Returns the instance of the interface that changed.
-	 * 
-	 * @return the instance of the interface that changed. Guaranteed not to be
-	 *         <code>null</code>.
-	 */
-	public final Command getCommand() {
-		return command;
-	}
-
-	/**
-	 * Returns whether or not the category property changed.
-	 * 
-	 * @return <code>true</code>, iff the category property changed.
-	 */
-	public final boolean isCategoryChanged() {
-		return ((changedValues & CHANGED_CATEGORY) != 0);
-	}
-
-	/**
-	 * Returns whether or not the handled property changed.
-	 * 
-	 * @return <code>true</code>, iff the handled property changed.
-	 */
-	public final boolean isHandledChanged() {
-		return ((changedValues & CHANGED_HANDLED) != 0);
-	}
-
-	/**
-	 * Returns whether or not the help context identifier changed.
-	 * 
-	 * @return <code>true</code>, iff the help context identifier changed.
-	 * @since 3.2
-	 */
-	public final boolean isHelpContextIdChanged() {
-		return ((changedValues & CHANGED_HELP_CONTEXT_ID) != 0);
-	}
-
-	/**
-	 * Returns whether or not the parameters have changed.
-	 * 
-	 * @return <code>true</code>, iff the parameters property changed.
-	 */
-	public final boolean isParametersChanged() {
-		return ((changedValues & CHANGED_PARAMETERS) != 0);
-	}
-
-	/**
-	 * Returns whether or not the return type property changed.
-	 * 
-	 * @return <code>true</code>, iff the return type property changed.
-	 * @since 3.2
-	 */
-	public final boolean isReturnTypeChanged() {
-		return ((changedValues & CHANGED_RETURN_TYPE) != 0);
-	}
-
-	/**
-	 * Return whether the enable property changed.
-	 * 
-	 * @return <code>true</code> iff the comand enablement changed
-	 * @since 3.3
-	 */
-	public final boolean isEnabledChanged() {
-		return ((changedValues & CHANGED_ENABLED) != 0);
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/CommandManager.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/CommandManager.java
deleted file mode 100644
index 1fa61a8..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/CommandManager.java
+++ /dev/null
@@ -1,1051 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.WeakHashMap;
-
-import org.eclipse.core.commands.common.HandleObjectManager;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.runtime.ListenerList;
-
-/**
- * <p>
- * A central repository for commands -- both in the defined and undefined
- * states. Commands can be created and retrieved using this manager. It is
- * possible to listen to changes in the collection of commands by attaching a
- * listener to the manager.
- * </p>
- * 
- * @see CommandManager#getCommand(String)
- * @since 3.1
- */
-public final class CommandManager extends HandleObjectManager implements
-		ICategoryListener, ICommandListener, IParameterTypeListener {
-
-	/**
-	 * A listener that forwards incoming execution events to execution listeners
-	 * on this manager. The execution events will come from any command on this
-	 * manager.
-	 * 
-	 * @since 3.1
-	 */
-	private final class ExecutionListener implements
-			IExecutionListenerWithChecks {
-
-		public void notDefined(String commandId, NotDefinedException exception) {
-			if (executionListeners != null) {
-				final Object[] listeners = executionListeners.getListeners();
-				for (int i = 0; i < listeners.length; i++) {
-					final Object object = listeners[i];
-					if (object instanceof IExecutionListenerWithChecks) {
-						final IExecutionListenerWithChecks listener = (IExecutionListenerWithChecks) object;
-						listener.notDefined(commandId, exception);
-					}
-				}
-			}
-		}
-
-		public void notEnabled(String commandId, NotEnabledException exception) {
-			if (executionListeners != null) {
-				final Object[] listeners = executionListeners.getListeners();
-				for (int i = 0; i < listeners.length; i++) {
-					final Object object = listeners[i];
-					if (object instanceof IExecutionListenerWithChecks) {
-						final IExecutionListenerWithChecks listener = (IExecutionListenerWithChecks) object;
-						listener.notEnabled(commandId, exception);
-					}
-				}
-			}
-		}
-
-		public final void notHandled(final String commandId,
-				final NotHandledException exception) {
-			if (executionListeners != null) {
-				final Object[] listeners = executionListeners.getListeners();
-				for (int i = 0; i < listeners.length; i++) {
-					final Object object = listeners[i];
-					if (object instanceof IExecutionListener) {
-						final IExecutionListener listener = (IExecutionListener) object;
-						listener.notHandled(commandId, exception);
-					}
-				}
-			}
-		}
-
-		public final void postExecuteFailure(final String commandId,
-				final ExecutionException exception) {
-			if (executionListeners != null) {
-				final Object[] listeners = executionListeners.getListeners();
-				for (int i = 0; i < listeners.length; i++) {
-					final Object object = listeners[i];
-					if (object instanceof IExecutionListener) {
-						final IExecutionListener listener = (IExecutionListener) object;
-						listener.postExecuteFailure(commandId, exception);
-					}
-				}
-			}
-		}
-
-		public final void postExecuteSuccess(final String commandId,
-				final Object returnValue) {
-			if (executionListeners != null) {
-				final Object[] listeners = executionListeners.getListeners();
-				for (int i = 0; i < listeners.length; i++) {
-					final Object object = listeners[i];
-					if (object instanceof IExecutionListener) {
-						final IExecutionListener listener = (IExecutionListener) object;
-						listener.postExecuteSuccess(commandId, returnValue);
-					}
-				}
-			}
-		}
-
-		public final void preExecute(final String commandId,
-				final ExecutionEvent event) {
-			if (executionListeners != null) {
-				final Object[] listeners = executionListeners.getListeners();
-				for (int i = 0; i < listeners.length; i++) {
-					final Object object = listeners[i];
-					if (object instanceof IExecutionListener) {
-						final IExecutionListener listener = (IExecutionListener) object;
-						listener.preExecute(commandId, event);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * The identifier of the category in which all auto-generated commands will
-	 * appear. This value must never be <code>null</code>.
-	 * 
-	 * @since 3.2
-	 */
-	public static final String AUTOGENERATED_CATEGORY_ID = "org.eclipse.core.commands.categories.autogenerated"; //$NON-NLS-1$
-
-	/**
-	 * The escape character to use for serialization and deserialization of
-	 * parameterized commands.
-	 */
-	static final char ESCAPE_CHAR = '%';
-
-	/**
-	 * The character that separates a parameter id from its value.
-	 */
-	static final char ID_VALUE_CHAR = '=';
-
-	/**
-	 * The character that indicates the end of a list of parameters.
-	 */
-	static final char PARAMETER_END_CHAR = ')';
-
-	/**
-	 * The character that separators parameters from each other.
-	 */
-	static final char PARAMETER_SEPARATOR_CHAR = ',';
-
-	/**
-	 * The character that indicates the start of a list of parameters.
-	 */
-	static final char PARAMETER_START_CHAR = '(';
-
-	/**
-	 * Unescapes special characters in the command id, parameter ids and
-	 * parameter values for {@link #deserialize(String)}. The special characters
-	 * {@link #PARAMETER_START_CHAR}, {@link #PARAMETER_END_CHAR},
-	 * {@link #ID_VALUE_CHAR}, {@link #PARAMETER_SEPARATOR_CHAR} and
-	 * {@link #ESCAPE_CHAR} are escaped by prepending an {@link #ESCAPE_CHAR}
-	 * character.
-	 * <p>
-	 * See also ParameterizedCommand.escape(String)
-	 * </p>
-	 * 
-	 * @param escapedText
-	 *            a <code>String</code> that may contain escaped special
-	 *            characters for command serialization.
-	 * @return a <code>String</code> representing <code>escapedText</code>
-	 *         with any escaped characters replaced by their literal values
-	 * @throws SerializationException
-	 *             if <code>escapedText</code> contains an invalid escape
-	 *             sequence
-	 * @since 3.2
-	 */
-	private static final String unescape(final String escapedText)
-			throws SerializationException {
-
-		// defer initialization of a StringBuffer until we know we need one
-		StringBuffer buffer = null;
-
-		for (int i = 0; i < escapedText.length(); i++) {
-
-			char c = escapedText.charAt(i);
-			if (c != ESCAPE_CHAR) {
-				// normal unescaped character
-				if (buffer != null) {
-					buffer.append(c);
-				}
-			} else {
-				if (buffer == null) {
-					buffer = new StringBuffer(escapedText.substring(0, i));
-				}
-
-				if (++i < escapedText.length()) {
-					c = escapedText.charAt(i);
-					switch (c) {
-					case PARAMETER_START_CHAR:
-					case PARAMETER_END_CHAR:
-					case ID_VALUE_CHAR:
-					case PARAMETER_SEPARATOR_CHAR:
-					case ESCAPE_CHAR:
-						buffer.append(c);
-						break;
-					default:
-						throw new SerializationException(
-								"Invalid character '" + c + "' in escape sequence"); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				} else {
-					throw new SerializationException(
-							"Unexpected termination of escape sequence"); //$NON-NLS-1$
-				}
-			}
-
-		}
-
-		if (buffer == null) {
-			return escapedText;
-		}
-
-		return buffer.toString();
-	}
-
-	/**
-	 * The map of category identifiers (<code>String</code>) to categories (
-	 * <code>Category</code>). This collection may be empty, but it is never
-	 * <code>null</code>.
-	 */
-	private final Map categoriesById = new HashMap();
-
-	/**
-	 * The set of identifiers for those categories that are defined. This value
-	 * may be empty, but it is never <code>null</code>.
-	 */
-	private final Set definedCategoryIds = new HashSet();
-
-	/**
-	 * The set of identifiers for those command parameter types that are
-	 * defined. This value may be empty, but it is never <code>null</code>.
-	 * 
-	 * @since 3.2
-	 */
-	private final Set definedParameterTypeIds = new HashSet();
-
-	/**
-	 * The execution listener for this command manager. This just forwards
-	 * events from commands controlled by this manager to listeners on this
-	 * manager.
-	 */
-	private IExecutionListenerWithChecks executionListener = null;
-
-	/**
-	 * The collection of execution listeners. This collection is
-	 * <code>null</code> if there are no listeners.
-	 */
-	private ListenerList executionListeners = null;
-
-	/**
-	 * The help context identifiers ({@link String}) for a handler ({@link IHandler}).
-	 * This map may be empty, but it is never <code>null</code>. Entries are
-	 * removed if all strong references to the handler are removed.
-	 * 
-	 * @since 3.2
-	 */
-	private final Map helpContextIdsByHandler = new WeakHashMap();
-
-	/**
-	 * The map of parameter type identifiers (<code>String</code>) to
-	 * parameter types ( <code>ParameterType</code>). This collection may be
-	 * empty, but it is never <code>null</code>.
-	 * 
-	 * @since 3.2
-	 */
-	private final Map parameterTypesById = new HashMap();
-
-	/**
-	 * Adds a listener to this command manager. The listener will be notified
-	 * when the set of defined commands changes. This can be used to track the
-	 * global appearance and disappearance of commands.
-	 * 
-	 * @param listener
-	 *            The listener to attach; must not be <code>null</code>.
-	 */
-	public final void addCommandManagerListener(
-			final ICommandManagerListener listener) {
-		addListenerObject(listener);
-	}
-
-	/**
-	 * Adds an execution listener to this manager. This listener will be
-	 * notified if any of the commands controlled by this manager execute. This
-	 * can be used to support macros and instrumentation of commands.
-	 * 
-	 * @param listener
-	 *            The listener to attach; must not be <code>null</code>.
-	 */
-	public final void addExecutionListener(final IExecutionListener listener) {
-		if (listener == null) {
-			throw new NullPointerException(
-					"Cannot add a null execution listener"); //$NON-NLS-1$
-		}
-
-		if (executionListeners == null) {
-			executionListeners = new ListenerList(ListenerList.IDENTITY);
-
-			// Add an execution listener to every command.
-			executionListener = new ExecutionListener();
-			final Iterator commandItr = handleObjectsById.values().iterator();
-			while (commandItr.hasNext()) {
-				final Command command = (Command) commandItr.next();
-				command.addExecutionListener(executionListener);
-			}
-
-		}
-
-		executionListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.ICategoryListener#categoryChanged(org.eclipse.core.commands.CategoryEvent)
-	 */
-	public final void categoryChanged(CategoryEvent categoryEvent) {
-		if (categoryEvent.isDefinedChanged()) {
-			final Category category = categoryEvent.getCategory();
-			final String categoryId = category.getId();
-			final boolean categoryIdAdded = category.isDefined();
-			if (categoryIdAdded) {
-				definedCategoryIds.add(categoryId);
-			} else {
-				definedCategoryIds.remove(categoryId);
-			}
-			if (isListenerAttached()) {
-				fireCommandManagerChanged(new CommandManagerEvent(this, null,
-						false, false, categoryId, categoryIdAdded, true));
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.commands.ICommandListener#commandChanged(org.eclipse.commands.CommandEvent)
-	 */
-	public final void commandChanged(final CommandEvent commandEvent) {
-		if (commandEvent.isDefinedChanged()) {
-			final Command command = commandEvent.getCommand();
-			final String commandId = command.getId();
-			final boolean commandIdAdded = command.isDefined();
-			if (commandIdAdded) {
-				definedHandleObjects.add(command);
-			} else {
-				definedHandleObjects.remove(command);
-			}
-			if (isListenerAttached()) {
-				fireCommandManagerChanged(new CommandManagerEvent(this,
-						commandId, commandIdAdded, true, null, false, false));
-			}
-		}
-	}
-
-	/**
-	 * Sets the name and description of the category for uncategorized commands.
-	 * This is the category that will be returned if
-	 * {@link #getCategory(String)} is called with <code>null</code>.
-	 * 
-	 * @param name
-	 *            The name of the category for uncategorized commands; must not
-	 *            be <code>null</code>.
-	 * @param description
-	 *            The description of the category for uncategorized commands;
-	 *            may be <code>null</code>.
-	 * @since 3.2
-	 */
-	public final void defineUncategorizedCategory(final String name,
-			final String description) {
-		final Category category = getCategory(AUTOGENERATED_CATEGORY_ID);
-		category.define(name, description);
-	}
-
-	/**
-	 * <p>
-	 * Returns a {@link ParameterizedCommand} with a command and
-	 * parameterizations as specified in the provided
-	 * <code>serializedParameterizedCommand</code> string. The
-	 * <code>serializedParameterizedCommand</code> must use the format
-	 * returned by {@link ParameterizedCommand#serialize()} and described in the
-	 * Javadoc for that method.
-	 * </p>
-	 * <p>
-	 * If a parameter id encoded in the
-	 * <code>serializedParameterizedCommand</code> does not exist in the
-	 * encoded command, that parameter id and value are ignored. A given
-	 * parameter id should not be used more than once in
-	 * <code>serializedParameterizedCommand</code>. This will not result in
-	 * an exception, but in this case the value of the parameter when the
-	 * command is executed is unspecified.
-	 * </p>
-	 * <p>
-	 * This method will never return <code>null</code>, however it may throw
-	 * an exception if there is a problem processing the serialization string or
-	 * the encoded command is undefined.
-	 * </p>
-	 * 
-	 * @param serializedParameterizedCommand
-	 *            a string representing a command id and parameter ids and
-	 *            values; must not be <code>null</code>
-	 * @return a {@link ParameterizedCommand} with the command and
-	 *         parameterizations encoded in the
-	 *         <code>serializedParameterizedCommand</code>; never
-	 *         <code>null</code>.
-	 * @throws NotDefinedException
-	 *             if the command indicated in
-	 *             <code>serializedParameterizedCommand</code> is not defined
-	 * @throws SerializationException
-	 *             if there is an error deserializing
-	 *             <code>serializedParameterizedCommand</code>
-	 * @see ParameterizedCommand#serialize()
-	 * @since 3.2
-	 */
-	public final ParameterizedCommand deserialize(
-			final String serializedParameterizedCommand)
-			throws NotDefinedException, SerializationException {
-
-		final int lparenPosition = unescapedIndexOf(
-				serializedParameterizedCommand, PARAMETER_START_CHAR);
-
-		final String commandIdEscaped;
-		final String serializedParameters;
-		if (lparenPosition == -1) {
-			commandIdEscaped = serializedParameterizedCommand;
-			serializedParameters = null;
-		} else {
-			commandIdEscaped = serializedParameterizedCommand.substring(0,
-					lparenPosition);
-
-			if (serializedParameterizedCommand
-					.charAt(serializedParameterizedCommand.length() - 1) != PARAMETER_END_CHAR) {
-				throw new SerializationException(
-						"Parentheses must be balanced in serialized ParameterizedCommand"); //$NON-NLS-1$
-			}
-
-			serializedParameters = serializedParameterizedCommand.substring(
-					lparenPosition + 1, // skip PARAMETER_START_CHAR
-					serializedParameterizedCommand.length() - 1); // skip
-			// PARAMETER_END_CHAR
-		}
-
-		final String commandId = unescape(commandIdEscaped);
-		final Command command = getCommand(commandId);
-		final IParameter[] parameters = command.getParameters();
-		final Parameterization[] parameterizations = getParameterizations(
-				serializedParameters, parameters);
-
-		return new ParameterizedCommand(command, parameterizations);
-	}
-
-	/**
-	 * Notifies all of the listeners to this manager that the set of defined
-	 * command identifiers has changed.
-	 * 
-	 * @param event
-	 *            The event to send to all of the listeners; must not be
-	 *            <code>null</code>.
-	 */
-	private final void fireCommandManagerChanged(final CommandManagerEvent event) {
-		if (event == null) {
-			throw new NullPointerException();
-		}
-
-		final Object[] listeners = getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			final ICommandManagerListener listener = (ICommandManagerListener) listeners[i];
-			listener.commandManagerChanged(event);
-		}
-	}
-
-	/**
-	 * Returns all of the commands known by this manager -- defined and
-	 * undefined.
-	 * 
-	 * @return All of the commands; may be empty, but never <code>null</code>.
-	 * @since 3.2
-	 */
-	public final Command[] getAllCommands() {
-		return (Command[]) handleObjectsById.values().toArray(
-				new Command[handleObjectsById.size()]);
-	}
-
-	/**
-	 * Gets the category with the given identifier. If no such category
-	 * currently exists, then the category will be created (but be undefined).
-	 * 
-	 * @param categoryId
-	 *            The identifier to find; must not be <code>null</code>. If
-	 *            the category is <code>null</code>, then a category suitable
-	 *            for uncategorized items is defined and returned.
-	 * @return The category with the given identifier; this value will never be
-	 *         <code>null</code>, but it might be undefined.
-	 * @see Category
-	 */
-	public final Category getCategory(final String categoryId) {
-		if (categoryId == null) {
-			return getCategory(AUTOGENERATED_CATEGORY_ID);
-		}
-
-		checkId(categoryId);
-
-		Category category = (Category) categoriesById.get(categoryId);
-		if (category == null) {
-			category = new Category(categoryId);
-			categoriesById.put(categoryId, category);
-			category.addCategoryListener(this);
-		}
-
-		return category;
-	}
-
-	/**
-	 * Gets the command with the given identifier. If no such command currently
-	 * exists, then the command will be created (but will be undefined).
-	 * 
-	 * @param commandId
-	 *            The identifier to find; must not be <code>null</code> and
-	 *            must not be zero-length.
-	 * @return The command with the given identifier; this value will never be
-	 *         <code>null</code>, but it might be undefined.
-	 * @see Command
-	 */
-	public final Command getCommand(final String commandId) {
-		checkId(commandId);
-
-		Command command = (Command) handleObjectsById.get(commandId);
-		if (command == null) {
-			command = new Command(commandId);
-			handleObjectsById.put(commandId, command);
-			command.addCommandListener(this);
-
-			if (executionListener != null) {
-				command.addExecutionListener(executionListener);
-			}
-		}
-
-		return command;
-	}
-
-	/**
-	 * Returns the categories that are defined.
-	 * 
-	 * @return The defined categories; this value may be empty, but it is never
-	 *         <code>null</code>.
-	 * @since 3.2
-	 */
-	public final Category[] getDefinedCategories() {
-		final Category[] categories = new Category[definedCategoryIds.size()];
-		final Iterator categoryIdItr = definedCategoryIds.iterator();
-		int i = 0;
-		while (categoryIdItr.hasNext()) {
-			String categoryId = (String) categoryIdItr.next();
-			categories[i++] = getCategory(categoryId);
-		}
-		return categories;
-	}
-
-	/**
-	 * Returns the set of identifiers for those category that are defined.
-	 * 
-	 * @return The set of defined category identifiers; this value may be empty,
-	 *         but it is never <code>null</code>.
-	 */
-	public final Set getDefinedCategoryIds() {
-		return Collections.unmodifiableSet(definedCategoryIds);
-	}
-
-	/**
-	 * Returns the set of identifiers for those commands that are defined.
-	 * 
-	 * @return The set of defined command identifiers; this value may be empty,
-	 *         but it is never <code>null</code>.
-	 */
-	public final Set getDefinedCommandIds() {
-		return getDefinedHandleObjectIds();
-	}
-
-	/**
-	 * Returns the commands that are defined.
-	 * 
-	 * @return The defined commands; this value may be empty, but it is never
-	 *         <code>null</code>.
-	 * @since 3.2
-	 */
-	public final Command[] getDefinedCommands() {
-		return (Command[]) definedHandleObjects
-				.toArray(new Command[definedHandleObjects.size()]);
-	}
-
-	/**
-	 * Returns the set of identifiers for those parameter types that are
-	 * defined.
-	 * 
-	 * @return The set of defined command parameter type identifiers; this value
-	 *         may be empty, but it is never <code>null</code>.
-	 * @since 3.2
-	 */
-	public final Set getDefinedParameterTypeIds() {
-		return Collections.unmodifiableSet(definedParameterTypeIds);
-	}
-
-	/**
-	 * Returns the command parameter types that are defined.
-	 * 
-	 * @return The defined command parameter types; this value may be empty, but
-	 *         it is never <code>null</code>.
-	 * @since 3.2
-	 */
-	public final ParameterType[] getDefinedParameterTypes() {
-		final ParameterType[] parameterTypes = new ParameterType[definedParameterTypeIds
-				.size()];
-		final Iterator iterator = definedParameterTypeIds.iterator();
-		int i = 0;
-		while (iterator.hasNext()) {
-			final String parameterTypeId = (String) iterator.next();
-			parameterTypes[i++] = getParameterType(parameterTypeId);
-		}
-		return parameterTypes;
-	}
-
-	/**
-	 * Gets the help context identifier for a particular command. The command's
-	 * handler is first checked for a help context identifier. If the handler
-	 * does not have a help context identifier, then the help context identifier
-	 * for the command is returned. If neither has a help context identifier,
-	 * then <code>null</code> is returned.
-	 * 
-	 * @param command
-	 *            The command for which the help context should be retrieved;
-	 *            must not be <code>null</code>.
-	 * @return The help context identifier to use for the given command; may be
-	 *         <code>null</code>.
-	 * @throws NotDefinedException
-	 *             If the given command is not defined.
-	 * @since 3.2
-	 */
-	public final String getHelpContextId(final Command command)
-			throws NotDefinedException {
-		// Check if the command is defined.
-		if (!command.isDefined()) {
-			throw new NotDefinedException("The command is not defined. " //$NON-NLS-1$
-					+ command.getId());
-		}
-
-		// Check the handler.
-		final IHandler handler = command.getHandler();
-		if (handler != null) {
-			final String helpContextId = (String) helpContextIdsByHandler
-					.get(handler);
-			if (helpContextId != null) {
-				return helpContextId;
-			}
-		}
-
-		// Simply return whatever the command has as a help context identifier.
-		return command.getHelpContextId();
-	}
-
-	/**
-	 * Returns an array of parameterizations for the provided command by
-	 * deriving the parameter ids and values from the provided
-	 * <code>serializedParameters</code> string.
-	 * 
-	 * @param serializedParameters
-	 *            a String encoding parameter ids and values; must not be
-	 *            <code>null</code>.
-	 * @param parameters
-	 *            array of parameters of the command being deserialized; may be
-	 *            <code>null</code>.
-	 * @return an array of parameterizations; may be <code>null</code>.
-	 * @throws SerializationException
-	 *             if there is an error deserializing the parameters
-	 * @since 3.2
-	 */
-	private final Parameterization[] getParameterizations(
-			String serializedParameters, final IParameter[] parameters)
-			throws SerializationException {
-
-		if (serializedParameters == null
-				|| (serializedParameters.length() == 0)) {
-			return null;
-		}
-
-		if ((parameters == null) || (parameters.length == 0)) {
-			return null;
-		}
-
-		final ArrayList paramList = new ArrayList();
-
-		int commaPosition; // split off each param by looking for ','
-		do {
-			commaPosition = unescapedIndexOf(serializedParameters, ',');
-
-			final String idEqualsValue;
-			if (commaPosition == -1) {
-				// no more parameters after this
-				idEqualsValue = serializedParameters;
-			} else {
-				// take the first parameter...
-				idEqualsValue = serializedParameters
-						.substring(0, commaPosition);
-
-				// ... and put the rest back into serializedParameters
-				serializedParameters = serializedParameters
-						.substring(commaPosition + 1);
-			}
-
-			final int equalsPosition = unescapedIndexOf(idEqualsValue, '=');
-
-			final String parameterId;
-			final String parameterValue;
-			if (equalsPosition == -1) {
-				// missing values are null
-				parameterId = unescape(idEqualsValue);
-				parameterValue = null;
-			} else {
-				parameterId = unescape(idEqualsValue.substring(0,
-						equalsPosition));
-				parameterValue = unescape(idEqualsValue
-						.substring(equalsPosition + 1));
-			}
-
-			for (int i = 0; i < parameters.length; i++) {
-				final IParameter parameter = parameters[i];
-				if (parameter.getId().equals(parameterId)) {
-					paramList.add(new Parameterization(parameter,
-							parameterValue));
-					break;
-				}
-			}
-
-		} while (commaPosition != -1);
-
-		return (Parameterization[]) paramList
-				.toArray(new Parameterization[paramList.size()]);
-	}
-
-	/**
-	 * Gets the command {@link ParameterType} with the given identifier. If no
-	 * such command parameter type currently exists, then the command parameter
-	 * type will be created (but will be undefined).
-	 * 
-	 * @param parameterTypeId
-	 *            The identifier to find; must not be <code>null</code> and
-	 *            must not be zero-length.
-	 * @return The {@link ParameterType} with the given identifier; this value
-	 *         will never be <code>null</code>, but it might be undefined.
-	 * @since 3.2
-	 */
-	public final ParameterType getParameterType(final String parameterTypeId) {
-		checkId(parameterTypeId);
-
-		ParameterType parameterType = (ParameterType) parameterTypesById
-				.get(parameterTypeId);
-		if (parameterType == null) {
-			parameterType = new ParameterType(parameterTypeId);
-			parameterTypesById.put(parameterTypeId, parameterType);
-			parameterType.addListener(this);
-		}
-
-		return parameterType;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * @since 3.2
-	 */
-	public final void parameterTypeChanged(
-			final ParameterTypeEvent parameterTypeEvent) {
-		if (parameterTypeEvent.isDefinedChanged()) {
-			final ParameterType parameterType = parameterTypeEvent
-					.getParameterType();
-			final String parameterTypeId = parameterType.getId();
-			final boolean parameterTypeIdAdded = parameterType.isDefined();
-			if (parameterTypeIdAdded) {
-				definedParameterTypeIds.add(parameterTypeId);
-			} else {
-				definedParameterTypeIds.remove(parameterTypeId);
-			}
-
-			fireCommandManagerChanged(new CommandManagerEvent(this,
-					parameterTypeId, parameterTypeIdAdded, true));
-		}
-	}
-
-	/**
-	 * Removes a listener from this command manager.
-	 * 
-	 * @param listener
-	 *            The listener to be removed; must not be <code>null</code>.
-	 */
-	public final void removeCommandManagerListener(
-			final ICommandManagerListener listener) {
-		removeListenerObject(listener);
-	}
-
-	/**
-	 * Removes an execution listener from this command manager.
-	 * 
-	 * @param listener
-	 *            The listener to be removed; must not be <code>null</code>.
-	 */
-	public final void removeExecutionListener(final IExecutionListener listener) {
-		if (listener == null) {
-			throw new NullPointerException("Cannot remove a null listener"); //$NON-NLS-1$
-		}
-
-		if (executionListeners == null) {
-			return;
-		}
-
-		executionListeners.remove(listener);
-
-		if (executionListeners.isEmpty()) {
-			executionListeners = null;
-
-			// Remove the execution listener to every command.
-			final Iterator commandItr = handleObjectsById.values().iterator();
-			while (commandItr.hasNext()) {
-				final Command command = (Command) commandItr.next();
-				command.removeExecutionListener(executionListener);
-			}
-			executionListener = null;
-
-		}
-	}
-
-	/**
-	 * Block updates all of the handlers for all of the commands. If the handler
-	 * is <code>null</code> or the command id does not exist in the map, then
-	 * the command becomes unhandled. Otherwise, the handler is set to the
-	 * corresponding value in the map.
-	 * 
-	 * @param handlersByCommandId
-	 *            A map of command identifiers (<code>String</code>) to
-	 *            handlers (<code>IHandler</code>). This map may be
-	 *            <code>null</code> if all handlers should be cleared.
-	 *            Similarly, if the map is empty, then all commands will become
-	 *            unhandled.
-	 */
-	public final void setHandlersByCommandId(final Map handlersByCommandId) {
-		// Make that all the reference commands are created.
-		final Iterator commandIdItr = handlersByCommandId.keySet().iterator();
-		while (commandIdItr.hasNext()) {
-			getCommand((String) commandIdItr.next());
-		}
-
-		// Now, set-up the handlers on all of the existing commands.
-		final Iterator commandItr = handleObjectsById.values().iterator();
-		while (commandItr.hasNext()) {
-			final Command command = (Command) commandItr.next();
-			final String commandId = command.getId();
-			final Object value = handlersByCommandId.get(commandId);
-			if (value instanceof IHandler) {
-				command.setHandler((IHandler) value);
-			} else {
-				command.setHandler(null);
-			}
-		}
-	}
-
-	/**
-	 * Sets the help context identifier to associate with a particular handler.
-	 * 
-	 * @param handler
-	 *            The handler with which to register a help context identifier;
-	 *            must not be <code>null</code>.
-	 * @param helpContextId
-	 *            The help context identifier to register; may be
-	 *            <code>null</code> if the help context identifier should be
-	 *            removed.
-	 * @since 3.2
-	 */
-	public final void setHelpContextId(final IHandler handler,
-			final String helpContextId) {
-		if (handler == null) {
-			throw new NullPointerException("The handler cannot be null"); //$NON-NLS-1$
-		}
-		if (helpContextId == null) {
-			helpContextIdsByHandler.remove(handler);
-		} else {
-			helpContextIdsByHandler.put(handler, helpContextId);
-		}
-	}
-
-	/**
-	 * Searches for the index of a <code>char</code> in a <code>String</code>
-	 * but disregards characters prefixed with the {@link #ESCAPE_CHAR} escape
-	 * character. This is used by {@link #deserialize(String)} and
-	 * {@link #getParameterizations(String, IParameter[])} to parse the
-	 * serialized parameterized command string.
-	 * 
-	 * @param escapedText
-	 *            the string to search for the index of <code>ch</code> in
-	 * @param ch
-	 *            a character to search for in <code>escapedText</code>
-	 * @return the index of the first unescaped occurrence of the character in
-	 *         <code>escapedText</code>, or <code>-1</code> if the
-	 *         character does not occur unescaped.
-	 * @see String#indexOf(int)
-	 */
-	private final int unescapedIndexOf(final String escapedText, final char ch) {
-
-		int pos = escapedText.indexOf(ch);
-
-		// first char can't be escaped
-		if (pos == 0) {
-			return pos;
-		}
-
-		while (pos != -1) {
-			// look back for the escape character
-			if (escapedText.charAt(pos - 1) != ESCAPE_CHAR) {
-				return pos;
-			}
-
-			// scan for the next instance of ch
-			pos = escapedText.indexOf(ch, pos + 1);
-		}
-
-		return pos;
-
-	}
-	
-	/**
-	 * Fires the <code>notEnabled</code> event for
-	 * <code>executionListeners</code>.
-	 * <p>
-	 * <b>Note:</b> This supports bridging actions to the command framework,
-	 * and should not be used outside the framework.
-	 * </p>
-	 * 
-	 * @param commandId
-	 *            The command id of the command about to execute, never
-	 *            <code>null</code>.
-	 * @param exception
-	 *            The exception, never <code>null</code>.
-	 * @since 3.4
-	 */
-	public void fireNotEnabled(String commandId, NotEnabledException exception) {
-		if (executionListener != null) {
-			executionListener.notEnabled(commandId, exception);
-		}
-	}
-	
-	/**
-	 * Fires the <code>notDefined</code> event for
-	 * <code>executionListeners</code>.
-	 * <p>
-	 * <b>Note:</b> This supports bridging actions to the command framework,
-	 * and should not be used outside the framework.
-	 * </p>
-	 * 
-	 * @param commandId
-	 *            The command id of the command about to execute, never
-	 *            <code>null</code>.
-	 * @param exception
-	 *            The exception, never <code>null</code>.
-	 * @since 3.4
-	 */
-	public void fireNotDefined(String commandId, NotDefinedException exception) {
-		if (executionListener != null) {
-			executionListener.notDefined(commandId, exception);
-		}
-	}
-	
-	/**
-	 * Fires the <code>preExecute</code> event for
-	 * <code>executionListeners</code>.
-	 * <p>
-	 * <b>Note:</b> This supports bridging actions to the command framework,
-	 * and should not be used outside the framework.
-	 * </p>
-	 * 
-	 * @param commandId
-	 *            The command id of the command about to execute, never
-	 *            <code>null</code>.
-	 * @param event
-	 *            The event that triggered the command, may be <code>null</code>.
-	 * @since 3.4
-	 */
-	public void firePreExecute(String commandId, ExecutionEvent event) {
-		if (executionListener != null) {
-			executionListener.preExecute(commandId, event);
-		}
-	}
-	
-	/**
-	 * Fires the <code>postExecuteSuccess</code> event for
-	 * <code>executionListeners</code>.
-	 * <p>
-	 * <b>Note:</b> This supports bridging actions to the command framework,
-	 * and should not be used outside the framework.
-	 * </p>
-	 * 
-	 * @param commandId
-	 *            The command id of the command executed, never
-	 *            <code>null</code>.
-	 * @param returnValue
-	 *            The value returned from the command, may be <code>null</code>.
-	 * @since 3.4
-	 */
-	public void firePostExecuteSuccess(String commandId, Object returnValue) {
-		if (executionListener != null) {
-			executionListener.postExecuteSuccess(commandId, returnValue);
-		}
-	}
-	
-	/**
-	 * Fires the <code>postExecuteFailure</code> event for
-	 * <code>executionListeners</code>.
-	 * <p>
-	 * <b>Note:</b> This supports bridging actions to the command framework,
-	 * and should not be used outside the framework.
-	 * </p>
-	 * 
-	 * @param commandId
-	 *            The command id of the command executed, never
-	 *            <code>null</code>.
-	 * @param exception
-	 *            The exception, never <code>null</code>.
-	 * @since 3.4
-	 */
-	public void firePostExecuteFailure(String commandId, 
-			ExecutionException exception) {
-		if (executionListener != null) {
-			executionListener.postExecuteFailure(commandId, exception);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/CommandManagerEvent.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/CommandManagerEvent.java
deleted file mode 100644
index 440e213..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/CommandManagerEvent.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-/**
- * <p>
- * An event indicating that the set of defined command identifiers has changed.
- * </p>
- * 
- * @since 3.1
- * @see ICommandManagerListener#commandManagerChanged(CommandManagerEvent)
- */
-public final class CommandManagerEvent {
-
-	/**
-	 * The bit used to represent whether the given category has become defined.
-	 * If this bit is not set and there is no category id, then no category has
-	 * become defined nor undefined. If this bit is not set and there is a
-	 * category id, then the category has become undefined.
-	 */
-	private static final int CHANGED_CATEGORY_DEFINED = 1;
-
-	/**
-     * The bit used to represent whether the given command has become defined.
-     * If this bit is not set and there is no command id, then no command has
-     * become defined nor undefined. If this bit is not set and there is a
-     * command id, then the command has become undefined.
-     */
-	private static final int CHANGED_COMMAND_DEFINED = 1 << 1;
-	
-	/**
-	 * The bit used to represent whether the given command parameter type has
-	 * become defined. If this bit is not set and there is no parameter type id,
-	 * then no parameter type has become defined nor undefined. If this bit is
-	 * not set and there is a parameter type id, then the parameter type has
-	 * become undefined.
-	 * 
-	 * @since 3.2
-	 */
-	private static final int CHANGED_PARAMETER_TYPE_DEFINED = 1 << 2;
-
-	/**
-	 * The category identifier that was added or removed from the list of
-	 * defined category identifiers. This value is <code>null</code> if the
-	 * list of defined category identifiers did not change.
-	 */
-	private final String categoryId;
-
-	/**
-	 * A collection of bits representing whether certain values have changed. A
-	 * bit is set (i.e., <code>1</code>) if the corresponding property has
-	 * changed.
-	 */
-	private final int changedValues;
-
-	/**
-	 * The command identifier that was added or removed from the list of defined
-	 * command identifiers. This value is <code>null</code> if the list of
-	 * defined command identifiers did not change.
-	 */
-	private final String commandId;
-	
-	/**
-	 * The command parameter type identifier that was added or removed from the
-	 * list of defined parameter type identifiers. This value is
-	 * <code>null</code> if the list of defined parameter type identifiers did
-	 * not change.
-	 * 
-	 * @since 3.2
-	 */
-	private final String parameterTypeId;
-
-	/**
-	 * The command manager that has changed.
-	 */
-	private final CommandManager commandManager;
-
-	/**
-	 * Creates a new <code>CommandManagerEvent</code> instance to describe
-	 * changes to commands and/or categories.
-	 * 
-	 * @param commandManager
-	 *            the instance of the interface that changed; must not be
-	 *            <code>null</code>.
-	 * @param commandId
-	 *            The command identifier that was added or removed; must not be
-	 *            <code>null</code> if commandIdChanged is <code>true</code>.
-	 * @param commandIdAdded
-	 *            Whether the command identifier became defined (otherwise, it
-	 *            became undefined).
-	 * @param commandIdChanged
-	 *            Whether the list of defined command identifiers has changed.
-	 * @param categoryId
-	 *            The category identifier that was added or removed; must not be
-	 *            <code>null</code> if categoryIdChanged is <code>true</code>.
-	 * @param categoryIdAdded
-	 *            Whether the category identifier became defined (otherwise, it
-	 *            became undefined).
-	 * @param categoryIdChanged
-	 *            Whether the list of defined category identifiers has changed.
-	 */
-	public CommandManagerEvent(final CommandManager commandManager,
-			final String commandId, final boolean commandIdAdded,
-			final boolean commandIdChanged, final String categoryId,
-			final boolean categoryIdAdded, final boolean categoryIdChanged) {
-		if (commandManager == null) {
-			throw new NullPointerException(
-					"An event must refer to its command manager"); //$NON-NLS-1$
-		}
-
-		if (commandIdChanged && (commandId == null)) {
-			throw new NullPointerException(
-					"If the list of defined commands changed, then the added/removed command must be mentioned"); //$NON-NLS-1$
-		}
-
-		if (categoryIdChanged && (categoryId == null)) {
-			throw new NullPointerException(
-					"If the list of defined categories changed, then the added/removed category must be mentioned"); //$NON-NLS-1$
-		}
-
-		this.commandManager = commandManager;
-		this.commandId = commandId;
-		this.categoryId = categoryId;
-		
-		// this constructor only works for changes to commands and categories
-		this.parameterTypeId = null;
-
-		int changedValues = 0;
-		if (categoryIdChanged && categoryIdAdded) {
-			changedValues |= CHANGED_CATEGORY_DEFINED;
-		}
-		if (commandIdChanged && commandIdAdded) {
-			changedValues |= CHANGED_COMMAND_DEFINED;
-		}
-		this.changedValues = changedValues;
-	}
-	
-	/**
-	 * Creates a new <code>CommandManagerEvent</code> instance to describe
-	 * changes to command parameter types.
-	 * 
-	 * @param commandManager
-	 *            the instance of the interface that changed; must not be
-	 *            <code>null</code>.
-	 * @param parameterTypeId
-	 *            The command parameter type identifier that was added or
-	 *            removed; must not be <code>null</code> if
-	 *            parameterTypeIdChanged is <code>true</code>.
-	 * @param parameterTypeIdAdded
-	 *            Whether the parameter type identifier became defined
-	 *            (otherwise, it became undefined).
-	 * @param parameterTypeIdChanged
-	 *            Whether the list of defined parameter type identifiers has
-	 *            changed.
-	 * 
-	 * @since 3.2
-	 */
-	public CommandManagerEvent(final CommandManager commandManager,
-			final String parameterTypeId, final boolean parameterTypeIdAdded,
-			final boolean parameterTypeIdChanged) {
-
-		if (commandManager == null) {
-			throw new NullPointerException(
-					"An event must refer to its command manager"); //$NON-NLS-1$
-		}
-
-		if (parameterTypeIdChanged && (parameterTypeId == null)) {
-			throw new NullPointerException(
-					"If the list of defined command parameter types changed, then the added/removed parameter type must be mentioned"); //$NON-NLS-1$
-		}
-
-		this.commandManager = commandManager;
-		this.commandId = null;
-		this.categoryId = null;
-
-		this.parameterTypeId = parameterTypeId;
-
-		int changedValues = 0;
-		if (parameterTypeIdChanged && parameterTypeIdAdded) {
-			changedValues |= CHANGED_PARAMETER_TYPE_DEFINED;
-		}
-
-		this.changedValues = changedValues;
-	}
-
-	/**
-	 * Returns the category identifier that was added or removed.
-	 * 
-	 * @return The category identifier that was added or removed; may be
-	 *         <code>null</code>.
-	 */
-	public final String getCategoryId() {
-		return categoryId;
-	}
-
-	/**
-	 * Returns the command identifier that was added or removed.
-	 * 
-	 * @return The command identifier that was added or removed; may be
-	 *         <code>null</code>.
-	 */
-	public final String getCommandId() {
-		return commandId;
-	}
-
-	/**
-	 * Returns the instance of the interface that changed.
-	 * 
-	 * @return the instance of the interface that changed. Guaranteed not to be
-	 *         <code>null</code>.
-	 */
-	public final CommandManager getCommandManager() {
-		return commandManager;
-	}
-	
-	/**
-	 * Returns the command parameter type identifier that was added or removed.
-	 * 
-	 * @return The command parameter type identifier that was added or removed;
-	 *         may be <code>null</code>.
-	 *         
-	 * @since 3.2
-	 */
-	public final String getParameterTypeId() {
-		return parameterTypeId;
-	}
-
-	/**
-	 * Returns whether the list of defined category identifiers has changed.
-	 * 
-	 * @return <code>true</code> if the list of category identifiers has
-	 *         changed; <code>false</code> otherwise.
-	 */
-	public final boolean isCategoryChanged() {
-		return (categoryId != null);
-	}
-
-	/**
-	 * Returns whether the category identifier became defined. Otherwise, the
-	 * category identifier became undefined.
-	 * 
-	 * @return <code>true</code> if the category identifier became defined;
-	 *         <code>false</code> if the category identifier became undefined.
-	 */
-	public final boolean isCategoryDefined() {
-		return (((changedValues & CHANGED_CATEGORY_DEFINED) != 0) && (categoryId != null));
-	}
-
-	/**
-	 * Returns whether the list of defined command identifiers has changed.
-	 * 
-	 * @return <code>true</code> if the list of command identifiers has
-	 *         changed; <code>false</code> otherwise.
-	 */
-	public final boolean isCommandChanged() {
-		return (commandId != null);
-	}
-
-	/**
-	 * Returns whether the command identifier became defined. Otherwise, the
-	 * command identifier became undefined.
-	 * 
-	 * @return <code>true</code> if the command identifier became defined;
-	 *         <code>false</code> if the command identifier became undefined.
-	 */
-	public final boolean isCommandDefined() {
-		return (((changedValues & CHANGED_COMMAND_DEFINED) != 0) && (commandId != null));
-	}
-	
-	/**
-	 * Returns whether the list of defined command parameter type identifiers
-	 * has changed.
-	 * 
-	 * @return <code>true</code> if the list of command parameter type
-	 *         identifiers has changed; <code>false</code> otherwise.
-	 * 
-	 * @since 3.2
-	 */
-	public final boolean isParameterTypeChanged() {
-		return (parameterTypeId != null);
-	}
-	
-	/**
-	 * Returns whether the command parameter type identifier became defined.
-	 * Otherwise, the command parameter type identifier became undefined.
-	 * 
-	 * @return <code>true</code> if the command parameter type identifier
-	 *         became defined; <code>false</code> if the command parameter
-	 *         type identifier became undefined.
-	 * 
-	 * @since 3.2
-	 */
-	public final boolean isParameterTypeDefined() {
-		return (((changedValues & CHANGED_PARAMETER_TYPE_DEFINED) != 0) && (parameterTypeId != null));
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ExecutionEvent.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ExecutionEvent.java
deleted file mode 100644
index 4a650f9..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ExecutionEvent.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-import java.util.Collections;
-import java.util.Map;
-
-import org.eclipse.core.commands.common.NotDefinedException;
-
-/**
- * <p>
- * The data object to pass to the command (and its handler) as it executes. This
- * carries information about the current state of the application, and the
- * application context in which the command was executed.
- * </p>
- * <p>
- * An execution event carries three blocks of data: the parameters, the trigger,
- * and the application context. How these blocks are used is application
- * dependent. In the Eclipse workbench, the trigger is an SWT event, and the
- * application context contains information about the selection and active part.
- * </p>
- * 
- * @since 3.1
- */
-public final class ExecutionEvent {
-
-	/**
-	 * The state of the application at the time the execution was triggered. In
-	 * the Eclipse workbench, this might contain information about the active
-	 * part of the active selection (for example). This value may be
-	 * <code>null</code>.
-	 */
-	private final Object applicationContext;
-
-	/**
-	 * The command being executed. This value may be <code>null</code>.
-	 */
-	private final Command command;
-
-	/**
-	 * The parameters to qualify the execution. For handlers that normally
-	 * prompt for additional information, these can be used to avoid prompting.
-	 * This value may be empty, but it is never <code>null</code>.
-	 */
-	private final Map parameters;
-
-	/**
-	 * The object that triggered the execution. In an event-driven architecture,
-	 * this is typically just another event. In the Eclipse workbench, this is
-	 * typically an SWT event. This value may be <code>null</code>.
-	 */
-	private final Object trigger;
-
-	/**
-	 * Constructs a new instance of <code>ExecutionEvent</code> with no
-	 * parameters, no trigger and no application context. This is just a
-	 * convenience method.
-	 * 
-	 * @since 3.2
-	 */
-	public ExecutionEvent() {
-		this(null, Collections.EMPTY_MAP, null, null);
-	}
-
-	/**
-	 * Constructs a new instance of <code>ExecutionEvent</code>.
-	 * 
-	 * @param parameters
-	 *            The parameters to qualify the execution; must not be
-	 *            <code>null</code>. This must be a map of parameter ids (<code>String</code>)
-	 *            to parameter values (<code>String</code>).
-	 * @param trigger
-	 *            The object that triggered the execution; may be
-	 *            <code>null</code>.
-	 * @param applicationContext
-	 *            The state of the application at the time the execution was
-	 *            triggered; may be <code>null</code>.
-	 * @deprecated use
-	 *             {@link ExecutionEvent#ExecutionEvent(Command, Map, Object, Object)}
-	 */
-	public ExecutionEvent(final Map parameters, final Object trigger,
-			final Object applicationContext) {
-		this(null, parameters, trigger, applicationContext);
-	}
-
-	/**
-	 * Constructs a new instance of <code>ExecutionEvent</code>.
-	 * 
-	 * @param command
-	 *            The command being executed; may be <code>null</code>.
-	 * @param parameters
-	 *            The parameters to qualify the execution; must not be
-	 *            <code>null</code>. This must be a map of parameter ids (<code>String</code>)
-	 *            to parameter values (<code>String</code>).
-	 * @param trigger
-	 *            The object that triggered the execution; may be
-	 *            <code>null</code>.
-	 * @param applicationContext
-	 *            The state of the application at the time the execution was
-	 *            triggered; may be <code>null</code>.
-	 * @since 3.2
-	 */
-	public ExecutionEvent(final Command command, final Map parameters,
-			final Object trigger, final Object applicationContext) {
-		if (parameters == null) {
-			throw new NullPointerException(
-					"An execution event must have a non-null map of parameters"); //$NON-NLS-1$
-		}
-
-		this.command = command;
-		this.parameters = parameters;
-		this.trigger = trigger;
-		this.applicationContext = applicationContext;
-	}
-
-	/**
-	 * Returns the state of the application at the time the execution was
-	 * triggered.
-	 * 
-	 * @return The application context; may be <code>null</code>.
-	 */
-	public final Object getApplicationContext() {
-		return applicationContext;
-	}
-
-	/**
-	 * Returns the command being executed.
-	 * 
-	 * @return The command being executed.
-	 * @since 3.2
-	 */
-	public final Command getCommand() {
-		return command;
-	}
-
-	/**
-	 * Returns the object represented by the string value of the parameter with
-	 * the provided id.
-	 * <p>
-	 * This is intended to be used in the scope of an
-	 * {@link IHandler#execute(ExecutionEvent)} method, so any problem getting
-	 * the object value causes <code>ExecutionException</code> to be thrown.
-	 * </p>
-	 * 
-	 * @param parameterId
-	 *            The id of a parameter to retrieve the object value of.
-	 * @return The object value of the parameter with the provided id.
-	 * @throws ExecutionException
-	 *             if the parameter object value could not be obtained for any
-	 *             reason
-	 * @since 3.2
-	 */
-	public final Object getObjectParameterForExecution(final String parameterId)
-			throws ExecutionException {
-		if (command == null) {
-			throw new ExecutionException(
-					"No command is associated with this execution event"); //$NON-NLS-1$
-		}
-
-		try {
-			final ParameterType parameterType = command
-					.getParameterType(parameterId);
-			if (parameterType == null) {
-				throw new ExecutionException(
-						"Command does not have a parameter type for the given parameter"); //$NON-NLS-1$
-			}
-			final AbstractParameterValueConverter valueConverter = parameterType
-					.getValueConverter();
-			if (valueConverter == null) {
-				throw new ExecutionException(
-						"Command does not have a value converter"); //$NON-NLS-1$
-			}
-			final String stringValue = getParameter(parameterId);
-			final Object objectValue = valueConverter
-					.convertToObject(stringValue);
-			return objectValue;
-		} catch (final NotDefinedException e) {
-			throw new ExecutionException("Command is not defined", e); //$NON-NLS-1$
-		} catch (final ParameterValueConversionException e) {
-			throw new ExecutionException(
-					"The parameter string could not be converted to an object", e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Returns the value of the parameter with the given id.
-	 * 
-	 * @param parameterId
-	 *            The id of the parameter to retrieve; may be <code>null</code>.
-	 * @return The parameter value; <code>null</code> if the parameter cannot
-	 *         be found.
-	 */
-	public final String getParameter(final String parameterId) {
-		return (String) parameters.get(parameterId);
-	}
-
-	/**
-	 * Returns all of the parameters.
-	 * 
-	 * @return The parameters; never <code>null</code>, but may be empty.
-	 */
-	public final Map getParameters() {
-		return parameters;
-	}
-
-	/**
-	 * Returns the object that triggered the execution
-	 * 
-	 * @return The trigger; <code>null</code> if there was no trigger.
-	 */
-	public final Object getTrigger() {
-		return trigger;
-	}
-
-	/**
-	 * The string representation of this execution event -- for debugging
-	 * purposes only. This string should not be shown to an end user.
-	 * 
-	 * @return The string representation; never <code>null</code>.
-	 */
-	public final String toString() {
-		final StringBuffer stringBuffer = new StringBuffer();
-		stringBuffer.append("ExecutionEvent("); //$NON-NLS-1$
-		stringBuffer.append(command);
-		stringBuffer.append(',');
-		stringBuffer.append(parameters);
-		stringBuffer.append(',');
-		stringBuffer.append(trigger);
-		stringBuffer.append(',');
-		stringBuffer.append(applicationContext);
-		stringBuffer.append(')');
-		return stringBuffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ExecutionException.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ExecutionException.java
deleted file mode 100644
index 37f222c..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ExecutionException.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-import org.eclipse.core.commands.common.CommandException;
-
-/**
- * Signals that an exception occured during the execution of a command.
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.1
- */
-public final class ExecutionException extends CommandException {
-
-    /**
-     * Generated serial version UID for this class.
-     * 
-     * @since 3.1
-     */
-    private static final long serialVersionUID = 3258130262767448120L;
-
-    /**
-	 * Creates a new instance of this class with the specified detail message.
-	 * 
-	 * @param message
-	 *            the detail message; may be <code>null</code>.
-	 * @since 3.2
-	 */
-	public ExecutionException(final String message) {
-		super(message);
-	}
-    
-    /**
-     * Creates a new instance of this class with the specified detail message
-     * and cause.
-     * 
-     * @param message
-     *            the detail message; may be <code>null</code>.
-     * @param cause
-     *            the cause; may be <code>null</code>.
-     */
-    public ExecutionException(final String message, final Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/HandlerEvent.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/HandlerEvent.java
deleted file mode 100644
index 46b9205..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/HandlerEvent.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-import org.eclipse.core.commands.common.AbstractBitSetEvent;
-
-/**
- * An instance of this class describes changes to an instance of
- * <code>IHandler</code>.
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.1
- * @see IHandlerListener#handlerChanged(HandlerEvent)
- */
-public final class HandlerEvent extends AbstractBitSetEvent {
-
-	/**
-	 * The bit used to represent whether the handler has changed its enabled
-	 * state.
-	 */
-	private static final int CHANGED_ENABLED = 1;
-
-	/**
-	 * The bit used to represent whether the handler has changed its handled
-	 * state.
-	 */
-	private static final int CHANGED_HANDLED = 1 << 1;
-
-	/**
-	 * The handler that changed; this value is never <code>null</code>.
-	 */
-	private final IHandler handler;
-
-	/**
-	 * Creates a new instance of this class.
-	 * 
-	 * @param handler
-	 *            the instance of the interface that changed; must not be
-     *            <code>null</code>.
-	 * @param enabledChanged
-	 *            Whether the enabled state of the handler has changed.
-	 * @param handledChanged
-	 *            Whether the handled state of the handler has changed.
-	 */
-	public HandlerEvent(final IHandler handler, final boolean enabledChanged,
-			final boolean handledChanged) {
-		if (handler == null) {
-			throw new NullPointerException();
-		}
-		this.handler = handler;
-
-		if (enabledChanged) {
-			changedValues |= CHANGED_ENABLED;
-		}
-		if (handledChanged) {
-			changedValues |= CHANGED_HANDLED;
-		}
-	}
-
-	/**
-	 * Returns the instance of the interface that changed.
-	 * 
-	 * @return the instance of the interface that changed. Guaranteed not to be
-	 *         <code>null</code>.
-	 */
-	public IHandler getHandler() {
-		return handler;
-	}
-
-	/**
-	 * Returns whether or not the enabled property changed.
-	 * 
-	 * @return <code>true</code>, iff the enabled property changed.
-	 */
-	public boolean isEnabledChanged() {
-		return ((changedValues & CHANGED_ENABLED) != 0);
-	}
-
-	/**
-	 * Returns whether or not the handled property changed.
-	 * 
-	 * @return <code>true</code>, iff the handled property changed.
-	 */
-	public boolean isHandledChanged() {
-		return ((changedValues & CHANGED_HANDLED) != 0);
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ICategoryListener.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ICategoryListener.java
deleted file mode 100644
index abd1b64..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ICategoryListener.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-/**
- * An instance of this interface can be used by clients to receive notification
- * of changes to one or more instances of <code>Category</code>.
- * <p>
- * This interface may be implemented by clients.
- * </p>
- * 
- * @since 3.1
- * @see Category#addCategoryListener(ICategoryListener)
- * @see Category#removeCategoryListener(ICategoryListener)
- */
-public interface ICategoryListener {
-
-	/**
-	 * Notifies that one or more properties of an instance of
-	 * <code>Category</code> have changed. Specific details are described in
-	 * the <code>CategoryEvent</code>.
-	 * 
-	 * @param categoryEvent
-	 *            the category event. Guaranteed not to be <code>null</code>.
-	 */
-	void categoryChanged(CategoryEvent categoryEvent);
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ICommandListener.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ICommandListener.java
deleted file mode 100644
index 061bc05..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ICommandListener.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-/**
- * An instance of this interface can be used by clients to receive notification
- * of changes to one or more instances of <code>Command</code>.
- * <p>
- * This interface may be implemented by clients.
- * </p>
- * 
- * @since 3.1
- * @see Command#addCommandListener(ICommandListener)
- * @see Command#removeCommandListener(ICommandListener)
- */
-public interface ICommandListener {
-
-    /**
-     * Notifies that one or more properties of an instance of
-     * <code>Command</code> have changed. Specific details are described in
-     * the <code>CommandEvent</code>.
-     * 
-     * @param commandEvent
-     *            the command event. Guaranteed not to be <code>null</code>.
-     */
-    void commandChanged(CommandEvent commandEvent);
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ICommandManagerListener.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ICommandManagerListener.java
deleted file mode 100644
index 0c665da..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ICommandManagerListener.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-/**
- * An instance of this interface can be used by clients to receive notification
- * of changes to one or more instances of <code>ICommandManager</code>.
- * <p>
- * This interface may be implemented by clients.
- * </p>
- * 
- * @since 3.1
- * @see CommandManager#addCommandManagerListener(ICommandManagerListener)
- * @see CommandManager#removeCommandManagerListener(ICommandManagerListener)
- */
-public interface ICommandManagerListener {
-
-    /**
-     * Notifies that one or more properties of an instance of
-     * <code>ICommandManager</code> have changed. Specific details are
-     * described in the <code>CommandManagerEvent</code>.
-     * 
-     * @param commandManagerEvent
-     *            the commandManager event. Guaranteed not to be
-     *            <code>null</code>.
-     */
-    void commandManagerChanged(CommandManagerEvent commandManagerEvent);
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IExecutionListener.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IExecutionListener.java
deleted file mode 100644
index 9ea4349..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IExecutionListener.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.commands;
-
-/**
- * <p>
- * A listener to the execution of commands. This listener will be notified if a
- * command is about to execute, and when that execution completes. It is not
- * possible for the listener to prevent the execution, only to respond to it in
- * some way.
- * </p>
- * 
- * @since 3.1
- */
-public interface IExecutionListener {
-
-	/**
-	 * Notifies the listener that an attempt was made to execute a command with
-	 * no handler.
-	 * 
-	 * @param commandId
-	 *            The identifier of command that is not handled; never
-	 *            <code>null</code>
-	 * @param exception
-	 *            The exception that occurred; never <code>null</code>.
-	 */
-	public void notHandled(String commandId, NotHandledException exception);
-
-	/**
-	 * Notifies the listener that a command has failed to complete execution.
-	 * 
-	 * @param commandId
-	 *            The identifier of the command that has executed; never
-	 *            <code>null</code>.
-	 * @param exception
-	 *            The exception that occurred; never <code>null</code>.
-	 */
-	public void postExecuteFailure(String commandId,
-			ExecutionException exception);
-
-	/**
-	 * Notifies the listener that a command has completed execution
-	 * successfully.
-	 * 
-	 * @param commandId
-	 *            The identifier of the command that has executed; never
-	 *            <code>null</code>.
-	 * @param returnValue
-	 *            The return value from the command; may be <code>null</code>.
-	 */
-	public void postExecuteSuccess(String commandId, Object returnValue);
-
-	/**
-	 * Notifies the listener that a command is about to execute.
-	 * 
-	 * @param commandId
-	 *            The identifier of the command that is about to execute, never
-	 *            <code>null</code>.
-	 * @param event
-	 *            The event that will be passed to the <code>execute</code>
-	 *            method; never <code>null</code>.
-	 */
-	public void preExecute(String commandId, ExecutionEvent event);
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IExecutionListenerWithChecks.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IExecutionListenerWithChecks.java
deleted file mode 100644
index 62b0442..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IExecutionListenerWithChecks.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands;
-
-import org.eclipse.core.commands.common.NotDefinedException;
-
-/**
- * <p>
- * A listener to the execution of commands. This listener will be notified if
- * someone tries to execute a command and it is not enabled or not defined. The
- * listener also be notified if a command is about to execute, and when that
- * execution completes. It is not possible for the listener to prevent the
- * execution, only to respond to it in some way.
- * </p>
- * <p>
- * Clients may implement, but must not extend.
- * </p>
- * 
- * @since 3.2
- */
-public interface IExecutionListenerWithChecks extends IExecutionListener {
-
-	/**
-	 * Notifies the listener that an attempt was made to execute a command that
-	 * is not defined.
-	 * 
-	 * @param commandId
-	 *            The identifier of command that is not defined; never
-	 *            <code>null</code>
-	 * @param exception
-	 *            The exception that occurred; never <code>null</code>.
-	 */
-	public void notDefined(String commandId, NotDefinedException exception);
-
-	/**
-	 * Notifies the listener that an attempt was made to execute a command that
-	 * is disabled.
-	 * 
-	 * @param commandId
-	 *            The identifier of command that is not enabled; never
-	 *            <code>null</code>
-	 * @param exception
-	 *            The exception that occurred; never <code>null</code>.
-	 */
-	public void notEnabled(String commandId, NotEnabledException exception);
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IHandler.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IHandler.java
deleted file mode 100644
index 6e977ef..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IHandler.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-/**
- * A handler is the pluggable piece of a command that handles execution. Each
- * command can have zero or more handlers associated with it (in general), of
- * which only one will be active at any given moment in time. When the command
- * is asked to execute, it will simply pass that request on to its active
- * handler, if any.
- * 
- * @see AbstractHandler
- * @since 3.1
- */
-public interface IHandler {
-
-	/**
-	 * Registers an instance of <code>IHandlerListener</code> to listen for
-	 * changes to properties of this instance.
-	 * 
-	 * @param handlerListener
-	 *            the instance to register. Must not be <code>null</code>. If
-	 *            an attempt is made to register an instance which is already
-	 *            registered with this instance, no operation is performed.
-	 */
-	void addHandlerListener(IHandlerListener handlerListener);
-
-	/**
-	 * Disposes of this handler. This method is run once when the object is no
-	 * longer referenced. This can be used as an opportunity to unhook listeners
-	 * from other objects.
-	 */
-	public void dispose();
-
-	/**
-	 * Executes with the map of parameter values by name.
-	 * 
-	 * @param event
-	 *            An event containing all the information about the current
-	 *            state of the application; must not be <code>null</code>.
-	 * @return the result of the execution. Reserved for future use, must be
-	 *         <code>null</code>.
-	 * @throws ExecutionException
-	 *             if an exception occurred during execution.
-	 */
-	Object execute(ExecutionEvent event) throws ExecutionException;
-
-	/**
-	 * Returns whether this handler is capable of executing at this moment in
-	 * time. If the enabled state is other than true clients should also
-	 * consider implementing IHandler2 so they can be notified about framework
-	 * execution contexts.
-	 * 
-	 * @return <code>true</code> if the command is enabled; <code>false</code>
-	 *         otherwise.
-	 * @see IHandler2#setEnabled(Object)
-	 */
-	public boolean isEnabled();
-
-	/**
-	 * Returns whether this handler is really capable of handling delegation. In
-	 * the case of a handler that is a composition of other handlers, this reply
-	 * is intended to indicate whether the handler is truly capable of receiving
-	 * delegated responsibilities at this time.
-	 * 
-	 * @return <code>true</code> if the handler is handled; <code>false</code>
-	 *         otherwise.
-	 */
-	public boolean isHandled();
-
-	/**
-	 * Unregisters an instance of <code>IHandlerListener</code> listening for
-	 * changes to properties of this instance.
-	 * 
-	 * @param handlerListener
-	 *            the instance to unregister. Must not be <code>null</code>.
-	 *            If an attempt is made to unregister an instance which is not
-	 *            already registered with this instance, no operation is
-	 *            performed.
-	 */
-	void removeHandlerListener(IHandlerListener handlerListener);
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IHandler2.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IHandler2.java
deleted file mode 100644
index c76b78c..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IHandler2.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.commands;
-
-/**
- * Extend the IHandler interface to provide some context for isEnabled()
- * requests. Clients should use {@link AbstractHandler} unless they need to
- * provide their own listener mechanism.
- * 
- * @since 3.4
- * @see AbstractHandler
- */
-public interface IHandler2 extends IHandler {
-	/**
-	 * Called by the framework to allow the handler to update its enabled state.
-	 * 
-	 * @param evaluationContext
-	 *            the state to evaluate against. May be <code>null</code>
-	 *            which indicates that the handler can query whatever model that
-	 *            is necessary. This context must not be cached.
-	 */
-	public void setEnabled(Object evaluationContext);
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IHandlerAttributes.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IHandlerAttributes.java
deleted file mode 100644
index 8eef7e5..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IHandlerAttributes.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-/**
- * <p>
- * Attribute constants that have special meanings within this package.  These
- * attributes can be used to communicate extra information from the handler to
- * either the command or the command manager.
- * </p>
- * 
- * @since 3.1
- */
-public interface IHandlerAttributes {
-
-	/**
-	 * <p>
-	 * The name of the attribute indicating whether the handler is handled.
-	 * This is intended largely for backward compatibility with the workbench
-	 * <code>RetargetAction</code> class.  It is used to indicate that while
-	 * the handler is handling a command, it should not be treated as such.
-	 * The command should act and behave as if it has no handler.
-	 * </p>
-	 */
-	public static final String ATTRIBUTE_HANDLED = "handled"; //$NON-NLS-1$
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IHandlerListener.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IHandlerListener.java
deleted file mode 100644
index 93bd38e..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IHandlerListener.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-/**
- * An instance of this interface can be used by clients to receive notification
- * of changes to one or more instances of <code>IHandler</code>.
- * <p>
- * This interface may be implemented by clients.
- * </p>
- * 
- * @since 3.1
- * @see IHandler#addHandlerListener(IHandlerListener)
- * @see IHandler#removeHandlerListener(IHandlerListener)
- */
-public interface IHandlerListener {
-
-    /**
-     * Notifies that one or more properties of an instance of
-     * <code>IHandler</code> have changed. Specific details are described in
-     * the <code>HandlerEvent</code>.
-     * 
-     * @param handlerEvent
-     *            the handler event. Guaranteed not to be <code>null</code>.
-     */
-    void handlerChanged(HandlerEvent handlerEvent);
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/INamedHandleStateIds.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/INamedHandleStateIds.java
deleted file mode 100644
index d93062c..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/INamedHandleStateIds.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands;
-
-/**
- * <p>
- * State identifiers that are understood by named handle objects that implement
- * {@link IObjectWithState}.
- * </p>
- * <p>
- * Clients may implement or extend this class.
- * </p>
- * 
- * @since 3.2
- */
-public interface INamedHandleStateIds {
-
-	/**
-	 * The state id used for overriding the description of a named handle
-	 * object. This state's value must return a {@link String}.
-	 */
-	public static String DESCRIPTION = "DESCRIPTION"; //$NON-NLS-1$
-
-	/**
-	 * The state id used for overriding the name of a named handle object. This
-	 * state's value must return a {@link String}.
-	 */
-	public static String NAME = "NAME"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IObjectWithState.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IObjectWithState.java
deleted file mode 100644
index d447c7a..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IObjectWithState.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands;
-
-/**
- * <p>
- * An object that holds zero or more state objects. This state information can
- * be shared between different instances of <code>IObjectWithState</code>.
- * </p>
- * <p>
- * Clients may implement, but must not extend this interface.
- * </p>
- * 
- * @see AbstractHandlerWithState
- * @since 3.2
- */
-public interface IObjectWithState {
-
-	/**
-	 * Adds state to this object.
-	 * 
-	 * @param id
-	 *            The identifier indicating the type of state being added; must
-	 *            not be <code>null</code>.
-	 * @param state
-	 *            The new state to add to this object; must not be
-	 *            <code>null</code>.
-	 */
-	public void addState(String id, State state);
-
-	/**
-	 * Gets the state with the given id.
-	 * 
-	 * @param stateId
-	 *            The identifier of the state to retrieve; must not be
-	 *            <code>null</code>.
-	 * @return The state; may be <code>null</code> if there is no state with
-	 *         the given id.
-	 */
-	public State getState(String stateId);
-
-	/**
-	 * Gets the identifiers for all of the state associated with this object.
-	 * 
-	 * @return All of the state identifiers; may be empty, but never
-	 *         <code>null</code>.
-	 */
-	public String[] getStateIds();
-
-	/**
-	 * Removes state from this object.
-	 * 
-	 * @param stateId
-	 *            The id of the state to remove from this object; must not be
-	 *            <code>null</code>.
-	 */
-	public void removeState(String stateId);
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IParameter.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IParameter.java
deleted file mode 100644
index 1bc9229..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IParameter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.commands;
-
-/**
- * <p>
- * A parameter for a command. A parameter identifies a type of information that
- * the command might accept. For example, a "Show View" command might accept the
- * id of a view for display. This parameter also identifies possible values, for
- * display in the user interface.
- * </p>
- * 
- * @since 3.1
- */
-public interface IParameter {
-
-	/**
-	 * Returns the identifier for this parameter.
-	 * 
-	 * @return The identifier; never <code>null</code>.
-	 */
-	public String getId();
-
-	/**
-	 * Returns the human-readable name for this parameter.
-	 * 
-	 * @return The parameter name; never <code>null</code>.
-	 */
-	public String getName();
-
-	/**
-	 * Returns the values associated with this parameter.
-	 * 
-	 * @return The values associated with this parameter. This must not be
-	 *         <code>null</code>.
-	 * @throws ParameterValuesException
-	 *             If the values can't be retrieved for some reason.
-	 */
-	public IParameterValues getValues() throws ParameterValuesException;
-
-	/**
-	 * Returns whether parameter is optional. Otherwise, it is required.
-	 * 
-	 * @return <code>true</code> if the parameter is optional;
-	 *         <code>false</code> if it is required.
-	 */
-	public boolean isOptional();
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IParameterTypeListener.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IParameterTypeListener.java
deleted file mode 100644
index efd4fa6..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IParameterTypeListener.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-/**
- * An instance of this interface can be used by clients to receive notification
- * of changes to one or more instances of {@link ParameterType}.
- * <p>
- * This interface may be implemented by clients.
- * </p>
- * 
- * @since 3.2
- * @see ParameterType#addListener(IParameterTypeListener)
- * @see ParameterType#removeListener(IParameterTypeListener)
- */
-public interface IParameterTypeListener {
-
-	/**
-	 * Notifies that one or more properties of an instance of
-	 * {@link ParameterType} have changed. Specific details are described in the
-	 * {@link ParameterTypeEvent}.
-	 * 
-	 * @param parameterTypeEvent
-	 *            the event. Guaranteed not to be <code>null</code>.
-	 */
-	void parameterTypeChanged(ParameterTypeEvent parameterTypeEvent);
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IParameterValues.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IParameterValues.java
deleted file mode 100644
index 9d5dec6..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IParameterValues.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.commands;
-
-import java.util.Map;
-
-/**
- * <p>
- * The parameters for a command. This interface will only be consulted if the
- * parameters need to be displayed to the user. Otherwise, they will be ignored.
- * </p>
- * 
- * @since 3.1
- */
-public interface IParameterValues {
-
-	/**
-	 * Returns a map keyed by externalized names for parameter values. These
-	 * names should be human-readable, and are generally for display to the user
-	 * in a user interface of some sort. The values should be actual values that
-	 * will be interpreted by the handler for the command.
-	 * 
-	 * @return A map of the externalizable name of the parameter value (<code>String</code>)
-	 *         to the actual value of the parameter (<code>String</code>).
-	 */
-	public Map getParameterValues();
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IStateListener.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IStateListener.java
deleted file mode 100644
index d45235c..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/IStateListener.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands;
-
-/**
- * <p>
- * A listener to changes in some state.
- * </p>
- * <p>
- * Clients may implement, but must not extend this interface.
- * </p>
- * 
- * @since 3.2
- */
-public interface IStateListener {
-
-	/**
-	 * Handles a change to the value in some state.
-	 * 
-	 * @param state
-	 *            The state that has changed; never <code>null</code>. The
-	 *            value for this state has been updated to the new value.
-	 * @param oldValue
-	 *            The old value; may be anything.
-	 */
-	public void handleStateChange(State state, Object oldValue);
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ITypedParameter.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ITypedParameter.java
deleted file mode 100644
index 86fc992..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ITypedParameter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-/**
- * A command parameter that has a declared type. This interface is intended to
- * be implemented by implementors of {@link IParameter} that will support
- * parameter types.
- * 
- * @since 3.2
- */
-public interface ITypedParameter {
-
-	/**
-	 * Returns the {@link ParameterType} associated with a command parameter or
-	 * <code>null</code> if the parameter does not declare a type.
-	 * <p>
-	 * Note that the parameter type returned may be undefined.
-	 * </p>
-	 * 
-	 * @return the parameter type associated with a command parameter or
-	 *         <code>null</code> if the parameter does not declare a type
-	 */
-	public ParameterType getParameterType();
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/NamedHandleObjectWithState.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/NamedHandleObjectWithState.java
deleted file mode 100644
index 89b6db5..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/NamedHandleObjectWithState.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.commands.common.NamedHandleObject;
-import org.eclipse.core.commands.common.NotDefinedException;
-
-/**
- * <p>
- * A named handle object that can carry state with it. This state can be used to
- * override the name or description.
- * </p>
- * <p>
- * Clients may neither instantiate nor extend this class.
- * </p>
- * 
- * @since 3.2
- */
-abstract class NamedHandleObjectWithState extends NamedHandleObject implements
-		IObjectWithState {
-
-	/**
-	 * An empty string array, which can be returned from {@link #getStateIds()}
-	 * if there is no state.
-	 */
-	private static final String[] NO_STATE = new String[0];
-
-	/**
-	 * The map of states currently held by this command. If this command has no
-	 * state, then this will be <code>null</code>.
-	 */
-	private Map states = null;
-
-	/**
-	 * Constructs a new instance of <code>NamedHandleObject<WithState/code>.
-	 * 
-	 * @param id
-	 *            The identifier for this handle; must not be <code>null</code>.
-	 */
-	protected NamedHandleObjectWithState(final String id) {
-		super(id);
-	}
-
-	public void addState(final String stateId, final State state) {
-		if (state == null) {
-			throw new NullPointerException("Cannot add a null state"); //$NON-NLS-1$
-		}
-
-		if (states == null) {
-			states = new HashMap(3);
-		}
-		states.put(stateId, state);
-	}
-
-	public final String getDescription() throws NotDefinedException {
-		final String description = super.getDescription(); // Trigger a NDE.
-
-		final State descriptionState = getState(INamedHandleStateIds.DESCRIPTION);
-		if (descriptionState != null) {
-			final Object value = descriptionState.getValue();
-			if (value != null) {
-				return value.toString();
-			}
-		}
-
-		return description;
-	}
-
-	public final String getName() throws NotDefinedException {
-		final String name = super.getName(); // Trigger a NDE, if necessary.
-
-		final State nameState = getState(INamedHandleStateIds.NAME);
-		if (nameState != null) {
-			final Object value = nameState.getValue();
-			if (value != null) {
-				return value.toString();
-			}
-		}
-
-		return name;
-	}
-
-	public final State getState(final String stateId) {
-		if ((states == null) || (states.isEmpty())) {
-			return null;
-		}
-
-		return (State) states.get(stateId);
-	}
-
-	public final String[] getStateIds() {
-		if ((states == null) || (states.isEmpty())) {
-			return NO_STATE;
-		}
-
-		final Set stateIds = states.keySet();
-		return (String[]) stateIds.toArray(new String[stateIds.size()]);
-	}
-
-	public void removeState(final String id) {
-		if (id == null) {
-			throw new NullPointerException("Cannot remove a null id"); //$NON-NLS-1$
-		}
-
-		if (states != null) {
-			states.remove(id);
-			if (states.isEmpty()) {
-				states = null;
-			}
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/NotEnabledException.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/NotEnabledException.java
deleted file mode 100644
index 3659eda..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/NotEnabledException.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-import org.eclipse.core.commands.common.CommandException;
-
-/**
- * Signals that an attempt was made to execute a command that is not enabled.
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.2
- */
-public final class NotEnabledException extends CommandException {
-
-    /**
-     * Generated serial version UID for this class.
-     * 
-     * @since 3.1
-     */
-    private static final long serialVersionUID = 3257572788998124596L;
-
-    /**
-     * Creates a new instance of this class with the specified detail message.
-     * 
-     * @param s
-     *            the detail message; may be <code>null</code>.
-     */
-    public NotEnabledException(final String s) {
-        super(s);
-    }
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/NotHandledException.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/NotHandledException.java
deleted file mode 100644
index 2b6bf34..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/NotHandledException.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-import org.eclipse.core.commands.common.CommandException;
-
-/**
- * Signals that an attempt was made to access the properties of an unhandled
- * object.
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.1
- */
-public final class NotHandledException extends CommandException {
-
-    /**
-     * Generated serial version UID for this class.
-     * 
-     * @since 3.1
-     */
-    private static final long serialVersionUID = 3256446914827726904L;
-
-    /**
-     * Creates a new instance of this class with the specified detail message.
-     * 
-     * @param s
-     *            the detail message.
-     */
-    public NotHandledException(final String s) {
-        super(s);
-    }
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ParameterType.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ParameterType.java
deleted file mode 100644
index cfc6c45..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ParameterType.java
+++ /dev/null
@@ -1,298 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-import org.eclipse.core.commands.common.HandleObject;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.internal.commands.util.Util;
-
-/**
- * <p>
- * Provides information about the type of a command parameter. Clients can use a
- * parameter type to check if an object matches the type of the parameter with
- * {@link #isCompatible(Object)} and can get an
- * {@link AbstractParameterValueConverter} to convert between objects matching
- * the parameter type and strings that encode the object's identity.
- * </p>
- * <p>
- * A command parameter is not required to declare a type. To determine if a
- * given parameter has a type, check if an {@link IParameter} implements
- * {@link ITypedParameter} and if so, use
- * {@link ITypedParameter#getParameterType()} like this:
- * </p>
- * 
- * <pre>
- *                   IParameter parameter = // ... get IParameter from Command
- *                   if (parameter instanceof ITypedParameter) {
- *                     ParameterType type = ((ITypedParameter)parameter).getParameterType();
- *                     if (type != null) {
- *                       // this parameter has a ParameterType
- *                     }
- *                   }
- * </pre>
- * 
- * @see IParameter
- * @see ITypedParameter#getParameterType()
- * @since 3.2
- */
-public final class ParameterType extends HandleObject implements Comparable {
-
-	/**
-	 * TODO: this was copied from
-	 * org.eclipse.core.internal.expressions.Expressions is there a better place
-	 * to reference this?
-	 * 
-	 * @param element
-	 *            The element to test; may be <code>null</code>.
-	 * @param type
-	 *            The type against which we are testing;may be <code>null</code>.
-	 * @return <code>true</code> if the <code>element</code> is an instance
-	 *         of <code>type</code>; <code>false</code> otherwise.
-	 */
-	private static final boolean isInstanceOf(final Object element,
-			final String type) {
-		// null isn't an instanceof of anything.
-		if (element == null) {
-			return false;
-		}
-		return isSubtype(element.getClass(), type);
-	}
-
-	/**
-	 * TODO: this was copied from
-	 * org.eclipse.core.internal.expressions.Expressions is there a better place
-	 * to reference this?
-	 * 
-	 * @param clazz
-	 *            The class to match; may be <code>null</code>.
-	 * @param type
-	 *            The type against which we are testing;may be <code>null</code>.
-	 * @return <code>true</code> if the <code>element</code> is an instance
-	 *         of <code>type</code>; <code>false</code> otherwise.
-	 */
-	private static final boolean isSubtype(final Class clazz, final String type) {
-		if (clazz.getName().equals(type)) {
-			return true;
-		}
-		final Class superClass = clazz.getSuperclass();
-		if (superClass != null && isSubtype(superClass, type)) {
-			return true;
-		}
-		final Class[] interfaces = clazz.getInterfaces();
-		for (int i = 0; i < interfaces.length; i++) {
-			if (isSubtype(interfaces[i], type)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * An {@link AbstractParameterValueConverter} for converting parameter
-	 * values between objects and strings. This may be <code>null</code>.
-	 */
-	private transient AbstractParameterValueConverter parameterTypeConverter;
-
-	/**
-	 * A string specifying the object type of this parameter type. This will be
-	 * <code>null</code> when the parameter type is undefined but never null
-	 * when it is defined.
-	 */
-	private transient String type = null;
-
-	/**
-	 * Constructs a new instance based on the given identifier. When a parameter
-	 * type is first constructed, it is undefined. Parameter types should only
-	 * be constructed by the {@link CommandManager} to ensure that the
-	 * identifier remains unique.
-	 * 
-	 * @param id
-	 *            The identifier for this type. This value must not be
-	 *            <code>null</code>, and must be unique amongst all parameter
-	 *            types.
-	 */
-	ParameterType(final String id) {
-		super(id);
-	}
-
-	/**
-	 * Adds a listener to this parameter type that will be notified when its
-	 * state changes.
-	 * 
-	 * @param listener
-	 *            The listener to be added; must not be <code>null</code>.
-	 */
-	public final void addListener(final IParameterTypeListener listener) {
-		addListenerObject(listener);
-	}
-
-	/**
-	 * Compares this parameter type with another object by comparing each of the
-	 * non-transient attributes.
-	 * 
-	 * @param object
-	 *            The object with which to compare; must be an instance of
-	 *            {@link ParameterType}.
-	 * @return A negative integer, zero or a positive integer, if the object is
-	 *         greater than, equal to or less than this parameter type.
-	 */
-	public final int compareTo(final Object object) {
-		final ParameterType castedObject = (ParameterType) object;
-		int compareTo = Util.compare(defined, castedObject.defined);
-		if (compareTo == 0) {
-			compareTo = Util.compare(id, castedObject.id);
-		}
-		return compareTo;
-	}
-
-	/**
-	 * <p>
-	 * Defines this parameter type, setting the defined property to
-	 * <code>true</code>.
-	 * </p>
-	 * <p>
-	 * Notification is sent to all listeners that something has changed.
-	 * </p>
-	 * 
-	 * @param type
-	 *            a string identifying the Java object type for this parameter
-	 *            type; <code>null</code> is interpreted as
-	 *            <code>"java.lang.Object"</code>
-	 * @param parameterTypeConverter
-	 *            an {@link AbstractParameterValueConverter} to perform
-	 *            string/object conversions for parameter values; may be
-	 *            <code>null</code>
-	 */
-	public final void define(final String type,
-			final AbstractParameterValueConverter parameterTypeConverter) {
-
-		final boolean definedChanged = !this.defined;
-		this.defined = true;
-
-		this.type = (type == null) ? Object.class.getName() : type;
-		this.parameterTypeConverter = parameterTypeConverter;
-
-		fireParameterTypeChanged(new ParameterTypeEvent(this, definedChanged));
-	}
-
-	/**
-	 * Notifies all listeners that this parameter type has changed. This sends
-	 * the given event to all of the listeners, if any.
-	 * 
-	 * @param event
-	 *            The event to send to the listeners; must not be
-	 *            <code>null</code>.
-	 */
-	private final void fireParameterTypeChanged(final ParameterTypeEvent event) {
-		if (event == null) {
-			throw new NullPointerException(
-					"Cannot send a null event to listeners."); //$NON-NLS-1$
-		}
-
-		if (!isListenerAttached()) {
-			return;
-		}
-
-		final Object[] listeners = getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			final IParameterTypeListener listener = (IParameterTypeListener) listeners[i];
-			listener.parameterTypeChanged(event);
-		}
-	}
-
-	/**
-	 * Returns the value converter associated with this parameter, if any.
-	 * 
-	 * @return The parameter value converter, or <code>null</code> if there is
-	 *         no value converter for this parameter.
-	 * @throws NotDefinedException
-	 *             if the parameter type is not currently defined
-	 */
-	public final AbstractParameterValueConverter getValueConverter()
-			throws NotDefinedException {
-		if (!isDefined()) {
-			throw new NotDefinedException(
-					"Cannot use getValueConverter() with an undefined ParameterType"); //$NON-NLS-1$
-		}
-
-		return parameterTypeConverter;
-	}
-
-	/**
-	 * Returns whether the provided value is compatible with this parameter
-	 * type. An object is compatible with a parameter type if the object is an
-	 * instance of the class defined as the parameter's type class.
-	 * 
-	 * @param value
-	 *            an object to check for compatibility with this parameter type;
-	 *            may be <code>null</code>.
-	 * @return <code>true</code> if the value is compatible with this type,
-	 *         <code>false</code> otherwise
-	 * @throws NotDefinedException
-	 *             if the parameter type is not currently defined
-	 */
-	public boolean isCompatible(Object value) throws NotDefinedException {
-		if (!isDefined()) {
-			throw new NotDefinedException(
-					"Cannot use isCompatible() with an undefined ParameterType"); //$NON-NLS-1$
-		}
-		return isInstanceOf(value, type);
-	}
-
-	/**
-	 * Unregisters listener for changes to properties of this parameter type.
-	 * 
-	 * @param listener
-	 *            the instance to unregister. Must not be <code>null</code>.
-	 *            If an attempt is made to unregister an instance which is not
-	 *            already registered with this instance, no operation is
-	 *            performed.
-	 */
-	public final void removeListener(final IParameterTypeListener listener) {
-		removeListenerObject(listener);
-	}
-
-	/**
-	 * The string representation of this parameter type. For debugging purposes
-	 * only. This string should not be shown to an end user.
-	 * 
-	 * @return The string representation; never <code>null</code>.
-	 */
-	public final String toString() {
-		if (string == null) {
-			final StringBuffer stringBuffer = new StringBuffer();
-			stringBuffer.append("ParameterType("); //$NON-NLS-1$
-			stringBuffer.append(id);
-			stringBuffer.append(',');
-			stringBuffer.append(defined);
-			stringBuffer.append(')');
-			string = stringBuffer.toString();
-		}
-		return string;
-	}
-
-	/**
-	 * Makes this parameter type become undefined. Notification is sent to all
-	 * listeners.
-	 */
-	public final void undefine() {
-		string = null;
-
-		final boolean definedChanged = defined;
-		defined = false;
-
-		type = null;
-		parameterTypeConverter = null;
-
-		fireParameterTypeChanged(new ParameterTypeEvent(this, definedChanged));
-	}
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ParameterTypeEvent.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ParameterTypeEvent.java
deleted file mode 100644
index cc51534..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ParameterTypeEvent.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-import org.eclipse.core.commands.common.AbstractHandleObjectEvent;
-
-/**
- * An instance of this class describes changes to an instance of
- * {@link ParameterType}.
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @see IParameterTypeListener#parameterTypeChanged(ParameterTypeEvent)
- * @since 3.2
- */
-public final class ParameterTypeEvent extends AbstractHandleObjectEvent {
-
-	/**
-	 * The parameter type that has changed. This value is never
-	 * <code>null</code>.
-	 */
-	private final ParameterType parameterType;
-
-	/**
-	 * Constructs a new instance.
-	 * 
-	 * @param parameterType
-	 *            The parameter type that changed; must not be <code>null</code>.
-	 * @param definedChanged
-	 *            <code>true</code>, iff the defined property changed.
-	 */
-	ParameterTypeEvent(final ParameterType parameterType,
-			final boolean definedChanged) {
-
-		super(definedChanged);
-
-		if (parameterType == null) {
-			throw new NullPointerException();
-		}
-
-		this.parameterType = parameterType;
-	}
-
-	/**
-	 * Returns the instance of the parameter type that changed.
-	 * 
-	 * @return the instance of the parameter type that changed. Guaranteed not
-	 *         to be <code>null</code>.
-	 */
-	public final ParameterType getParameterType() {
-		return parameterType;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ParameterValueConversionException.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ParameterValueConversionException.java
deleted file mode 100644
index f871558..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ParameterValueConversionException.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-import org.eclipse.core.commands.common.CommandException;
-
-/**
- * Signals that a problem occurred while converting a command parameter value
- * from string to object, or object to string.
- * 
- * @see AbstractParameterValueConverter
- * @since 3.2
- */
-public class ParameterValueConversionException extends CommandException {
-
-	/**
-	 * Generated serial version UID for this class.
-	 */
-	private static final long serialVersionUID = 4703077729505066104L;
-
-	/**
-	 * Creates a new instance of this class with the specified detail message.
-	 * 
-	 * @param message
-	 *            the detail message; may be <code>null</code>.
-	 */
-	public ParameterValueConversionException(final String message) {
-		super(message);
-	}
-	
-	/**
-	 * Creates a new instance of this class with the specified detail message
-	 * and cause.
-	 * 
-	 * @param message
-	 *            the detail message; may be <code>null</code>.
-	 * @param cause
-	 *            the cause; may be <code>null</code>.
-	 */
-	public ParameterValueConversionException(final String message,
-			final Throwable cause) {
-		super(message, cause);
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ParameterValuesException.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ParameterValuesException.java
deleted file mode 100644
index 4ec5183..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ParameterValuesException.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.commands;
-
-import org.eclipse.core.commands.common.CommandException;
-
-/**
- * <p>
- * Signals that a problem has occurred while trying to create an instance of
- * <code>IParameterValues</code>. In applications based on the registry
- * provided by core, this usually indicates a problem creating an
- * <code>IExecutableExtension</code>. For other applications, this exception
- * could be used to signify any general problem during initialization.
- * </p>
- * 
- * @since 3.1
- * 
- */
-public final class ParameterValuesException extends CommandException {
-
-	/**
-	 * Generated serial version UID for this class.
-	 */
-	private static final long serialVersionUID = 3618976793520845623L;
-
-	/**
-	 * Creates a new instance of this class with the specified detail message
-	 * and cause.
-	 * 
-	 * @param message
-	 *            the detail message; may be <code>null</code>.
-	 * @param cause
-	 *            the cause; may be <code>null</code>.
-	 */
-	public ParameterValuesException(final String message, final Throwable cause) {
-		super(message, cause);
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/Parameterization.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/Parameterization.java
deleted file mode 100644
index 3835ec2..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/Parameterization.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.commands;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.internal.commands.util.Util;
-
-/**
- * <p>
- * A parameter with a specific value. This is usually a part of a
- * <code>ParameterizedCommand</code>, which is used to refer to a command
- * with a collection of parameterizations.
- * </p>
- * 
- * @since 3.1
- */
-public final class Parameterization {
-
-	/**
-	 * The constant integer hash code value meaning the hash code has not yet
-	 * been computed.
-	 */
-	private static final int HASH_CODE_NOT_COMPUTED = -1;
-
-	/**
-	 * A factor for computing the hash code for all parameterized commands.
-	 */
-	private static final int HASH_FACTOR = 89;
-
-	/**
-	 * The seed for the hash code for all parameterized commands.
-	 */
-	private static final int HASH_INITIAL = Parameterization.class.getName()
-			.hashCode();
-
-	/**
-	 * The hash code for this object. This value is computed lazily, and marked
-	 * as invalid when one of the values on which it is based changes.
-	 */
-	private transient int hashCode = HASH_CODE_NOT_COMPUTED;
-
-	/**
-	 * The parameter that is being parameterized. This value is never
-	 * <code>null</code>.
-	 */
-	private final IParameter parameter;
-
-	/**
-	 * The value that defines the parameterization. This value may be
-	 * <code>null</code>.
-	 */
-	private final String value;
-
-	/**
-	 * Constructs a new instance of <code>Parameterization</code>.
-	 * 
-	 * @param parameter
-	 *            The parameter that is being parameterized; must not be
-	 *            <code>null</code>.
-	 * @param value
-	 *            The value for the parameter; may be <code>null</code>.
-	 */
-	public Parameterization(final IParameter parameter, final String value) {
-		if (parameter == null) {
-			throw new NullPointerException(
-					"You cannot parameterize a null parameter"); //$NON-NLS-1$
-		}
-
-		this.parameter = parameter;
-		this.value = value;
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public final boolean equals(final Object object) {
-		if (this == object) {
-			return true;
-		}
-
-		if (!(object instanceof Parameterization)) {
-			return false;
-		}
-
-		final Parameterization parameterization = (Parameterization) object;
-		if (!(Util.equals(this.parameter.getId(), parameterization.parameter
-				.getId()))) {
-			return false;
-		}
-
-		return Util.equals(this.value, parameterization.value);
-	}
-
-	/**
-	 * Returns the parameter that is being parameterized.
-	 * 
-	 * @return The parameter; never <code>null</code>.
-	 */
-	public final IParameter getParameter() {
-		return parameter;
-	}
-
-	/**
-	 * Returns the value for the parameter in this parameterization.
-	 * 
-	 * @return The value; may be <code>null</code>.
-	 */
-	public final String getValue() {
-		return value;
-	}
-
-	/**
-	 * Returns the human-readable name for the current value, if any. If the
-	 * name cannot be found, then it simply returns the value. It also ensures
-	 * that any <code>null</code> values are converted into an empty string.
-	 * 
-	 * @return The human-readable name of the value; never <code>null</code>.
-	 * @throws ParameterValuesException
-	 *             If the parameter needed to be initialized, but couldn't be.
-	 */
-	public final String getValueName() throws ParameterValuesException {
-		final Map parameterValues = parameter.getValues().getParameterValues();
-		final Iterator parameterValueItr = parameterValues.entrySet()
-				.iterator();
-		String returnValue = null;
-		while (parameterValueItr.hasNext()) {
-			final Map.Entry entry = (Map.Entry) parameterValueItr.next();
-			final String currentValue = (String) entry.getValue();
-			if (Util.equals(value, currentValue)) {
-				returnValue = (String) entry.getKey();
-				break;
-			}
-		}
-
-		if (returnValue == null) {
-			return Util.ZERO_LENGTH_STRING;
-		}
-
-		return returnValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public final int hashCode() {
-		if (hashCode == HASH_CODE_NOT_COMPUTED) {
-			hashCode = HASH_INITIAL * HASH_FACTOR + Util.hashCode(parameter);
-			hashCode = hashCode * HASH_FACTOR + Util.hashCode(value);
-			if (hashCode == HASH_CODE_NOT_COMPUTED) {
-				hashCode++;
-			}
-		}
-		return hashCode;
-
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ParameterizedCommand.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ParameterizedCommand.java
deleted file mode 100644
index fdcc471..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/ParameterizedCommand.java
+++ /dev/null
@@ -1,719 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Benjamin Muskalla - bug 222861 [Commands] ParameterizedCommand#equals broken
- *******************************************************************************/
-
-package org.eclipse.core.commands;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.internal.commands.util.Util;
-
-/**
- * <p>
- * A command that has had one or more of its parameters specified. This class
- * serves as a utility class for developers that need to manipulate commands
- * with parameters. It handles the behaviour of generating a parameter map and a
- * human-readable name.
- * </p>
- * 
- * @since 3.1
- */
-public final class ParameterizedCommand implements Comparable {
-
-	/**
-	 * The constant integer hash code value meaning the hash code has not yet
-	 * been computed.
-	 */
-	private static final int HASH_CODE_NOT_COMPUTED = -1;
-
-	/**
-	 * A factor for computing the hash code for all parameterized commands.
-	 */
-	private static final int HASH_FACTOR = 89;
-
-	/**
-	 * The seed for the hash code for all parameterized commands.
-	 */
-	private static final int HASH_INITIAL = ParameterizedCommand.class
-			.getName().hashCode();
-
-	/**
-	 * The index of the parameter id in the parameter values.
-	 * 
-	 * @deprecated no longer used
-	 */
-	public static final int INDEX_PARAMETER_ID = 0;
-
-	/**
-	 * The index of the human-readable name of the parameter itself, in the
-	 * parameter values.
-	 * 
-	 * @deprecated no longer used
-	 */
-	public static final int INDEX_PARAMETER_NAME = 1;
-
-	/**
-	 * The index of the human-readable name of the value of the parameter for
-	 * this command.
-	 * 
-	 * @deprecated no longer used
-	 */
-	public static final int INDEX_PARAMETER_VALUE_NAME = 2;
-
-	/**
-	 * The index of the value of the parameter that the command can understand.
-	 * 
-	 * @deprecated no longer used
-	 */
-	public static final int INDEX_PARAMETER_VALUE_VALUE = 3;
-
-	/**
-	 * Escapes special characters in the command id, parameter ids and parameter
-	 * values for {@link #serialize()}. The special characters
-	 * {@link CommandManager#PARAMETER_START_CHAR},
-	 * {@link CommandManager#PARAMETER_END_CHAR},
-	 * {@link CommandManager#ID_VALUE_CHAR},
-	 * {@link CommandManager#PARAMETER_SEPARATOR_CHAR} and
-	 * {@link CommandManager#ESCAPE_CHAR} are escaped by prepending a
-	 * {@link CommandManager#ESCAPE_CHAR} character.
-	 * 
-	 * @param rawText
-	 *            a <code>String</code> to escape special characters in for
-	 *            serialization.
-	 * @return a <code>String</code> representing <code>rawText</code> with
-	 *         special serialization characters escaped
-	 * @since 3.2
-	 */
-	private static final String escape(final String rawText) {
-
-		// defer initialization of a StringBuffer until we know we need one
-		StringBuffer buffer = null;
-
-		for (int i = 0; i < rawText.length(); i++) {
-
-			char c = rawText.charAt(i);
-			switch (c) {
-			case CommandManager.PARAMETER_START_CHAR:
-			case CommandManager.PARAMETER_END_CHAR:
-			case CommandManager.ID_VALUE_CHAR:
-			case CommandManager.PARAMETER_SEPARATOR_CHAR:
-			case CommandManager.ESCAPE_CHAR:
-				if (buffer == null) {
-					buffer = new StringBuffer(rawText.substring(0, i));
-				}
-				buffer.append(CommandManager.ESCAPE_CHAR);
-				buffer.append(c);
-				break;
-			default:
-				if (buffer != null) {
-					buffer.append(c);
-				}
-				break;
-			}
-
-		}
-
-		if (buffer == null) {
-			return rawText;
-		}
-		return buffer.toString();
-	}
-
-	/**
-	 * Generates every possible combination of parameter values for the given
-	 * parameters. Parameters values that cannot be initialized are just
-	 * ignored. Optional parameters are considered.
-	 * 
-	 * @param startIndex
-	 *            The index in the <code>parameters</code> that we should
-	 *            process. This must be a valid index.
-	 * @param parameters
-	 *            The parameters in to process; must not be <code>null</code>.
-	 * @return A collection (<code>Collection</code>) of combinations (<code>List</code>
-	 *         of <code>Parameterization</code>).
-	 */
-	private static final Collection expandParameters(final int startIndex,
-			final IParameter[] parameters) {
-		final int nextIndex = startIndex + 1;
-		final boolean noMoreParameters = (nextIndex >= parameters.length);
-
-		final IParameter parameter = parameters[startIndex];
-		final List parameterizations = new ArrayList();
-		if (parameter.isOptional()) {
-			parameterizations.add(null);
-		}
-
-		IParameterValues values = null;
-		try {
-			values = parameter.getValues();
-		} catch (final ParameterValuesException e) {
-			if (noMoreParameters) {
-				return parameterizations;
-			}
-
-			// Make recursive call
-			return expandParameters(nextIndex, parameters);
-		}
-		final Map parameterValues = values.getParameterValues();
-		final Iterator parameterValueItr = parameterValues.entrySet()
-				.iterator();
-		while (parameterValueItr.hasNext()) {
-			final Map.Entry entry = (Map.Entry) parameterValueItr.next();
-			final Parameterization parameterization = new Parameterization(
-					parameter, (String) entry.getValue());
-			parameterizations.add(parameterization);
-		}
-
-		// Check if another iteration will produce any more names.
-		final int parameterizationCount = parameterizations.size();
-		if (noMoreParameters) {
-			// This is it, so just return the current parameterizations.
-			for (int i = 0; i < parameterizationCount; i++) {
-				final Parameterization parameterization = (Parameterization) parameterizations
-						.get(i);
-				final List combination = new ArrayList(1);
-				combination.add(parameterization);
-				parameterizations.set(i, combination);
-			}
-			return parameterizations;
-		}
-
-		// Make recursive call
-		final Collection suffixes = expandParameters(nextIndex, parameters);
-		while (suffixes.remove(null)) {
-			// just keep deleting the darn things.
-		}
-		if (suffixes.isEmpty()) {
-			// This is it, so just return the current parameterizations.
-			for (int i = 0; i < parameterizationCount; i++) {
-				final Parameterization parameterization = (Parameterization) parameterizations
-						.get(i);
-				final List combination = new ArrayList(1);
-				combination.add(parameterization);
-				parameterizations.set(i, combination);
-			}
-			return parameterizations;
-		}
-		final Collection returnValue = new ArrayList();
-		final Iterator suffixItr = suffixes.iterator();
-		while (suffixItr.hasNext()) {
-			final List combination = (List) suffixItr.next();
-			final int combinationSize = combination.size();
-			for (int i = 0; i < parameterizationCount; i++) {
-				final Parameterization parameterization = (Parameterization) parameterizations
-						.get(i);
-				final List newCombination = new ArrayList(combinationSize + 1);
-				newCombination.add(parameterization);
-				newCombination.addAll(combination);
-				returnValue.add(newCombination);
-			}
-		}
-
-		return returnValue;
-	}
-
-	/**
-	 * <p>
-	 * Generates all the possible combinations of command parameterizations for
-	 * the given command. If the command has no parameters, then this is simply
-	 * a parameterized version of that command. If a parameter is optional, both
-	 * the included and not included cases are considered.
-	 * </p>
-	 * <p>
-	 * If one of the parameters cannot be loaded due to a
-	 * <code>ParameterValuesException</code>, then it is simply ignored.
-	 * </p>
-	 * 
-	 * @param command
-	 *            The command for which the parameter combinations should be
-	 *            generated; must not be <code>null</code>.
-	 * @return A collection of <code>ParameterizedCommand</code> instances
-	 *         representing all of the possible combinations. This value is
-	 *         never empty and it is never <code>null</code>.
-	 * @throws NotDefinedException
-	 *             If the command is not defined.
-	 */
-	public static final Collection generateCombinations(final Command command)
-			throws NotDefinedException {
-		final IParameter[] parameters = command.getParameters();
-		if (parameters == null) {
-			return Collections
-					.singleton(new ParameterizedCommand(command, null));
-		}
-
-		final Collection expansion = expandParameters(0, parameters);
-		final Collection combinations = new ArrayList(expansion.size());
-		final Iterator expansionItr = expansion.iterator();
-		while (expansionItr.hasNext()) {
-			final List combination = (List) expansionItr.next();
-			if (combination == null) {
-				combinations.add(new ParameterizedCommand(command, null));
-			} else {
-				while (combination.remove(null)) {
-					// Just keep removing while there are null entries left.
-				}
-				if (combination.isEmpty()) {
-					combinations.add(new ParameterizedCommand(command, null));
-				} else {
-					final Parameterization[] parameterizations = (Parameterization[]) combination
-							.toArray(new Parameterization[combination.size()]);
-					combinations.add(new ParameterizedCommand(command,
-							parameterizations));
-				}
-			}
-		}
-
-		return combinations;
-	}
-
-	/**
-	 * Take a command and a map of parameter IDs to values, and generate the
-	 * appropriate parameterized command.
-	 * 
-	 * @param command
-	 *            The command object. Must not be <code>null</code>.
-	 * @param parameters
-	 *            A map of String parameter ids to objects. May be
-	 *            <code>null</code>.
-	 * @return the parameterized command, or <code>null</code> if it could not
-	 *         be generated
-	 * @since 3.4
-	 */
-	public static final ParameterizedCommand generateCommand(Command command,
-			Map parameters) {
-		// no parameters
-		if (parameters == null || parameters.isEmpty()) {
-			return new ParameterizedCommand(command, null);
-		}
-
-		try {
-			ArrayList parms = new ArrayList();
-			Iterator i = parameters.keySet().iterator();
-
-			// iterate over given parameters
-			while (i.hasNext()) {
-				String key = (String) i.next();
-				IParameter parameter = null;
-				// get the parameter from the command
-				parameter = command.getParameter(key);
-
-				// if the parameter is defined add it to the parameter list
-				if (parameter == null) {
-					return null;
-				}
-				ParameterType parameterType = command.getParameterType(key);
-				if (parameterType == null) {
-					parms.add(new Parameterization(parameter,
-							(String) parameters.get(key)));
-				} else {
-					AbstractParameterValueConverter valueConverter = parameterType
-							.getValueConverter();
-					if (valueConverter != null) {
-						String val = valueConverter.convertToString(parameters
-								.get(key));
-						parms.add(new Parameterization(parameter, val));
-					} else {
-						parms.add(new Parameterization(parameter,
-								(String) parameters.get(key)));
-					}
-				}
-			}
-
-			// convert the parameters to an Parameterization array and create
-			// the command
-			return new ParameterizedCommand(command, (Parameterization[]) parms
-					.toArray(new Parameterization[parms.size()]));
-		} catch (NotDefinedException e) {
-		} catch (ParameterValueConversionException e) {
-		}
-		return null;
-	}
-
-	/**
-	 * The base command which is being parameterized. This value is never
-	 * <code>null</code>.
-	 */
-	private final Command command;
-
-	/**
-	 * The hash code for this object. This value is computed lazily, and marked
-	 * as invalid when one of the values on which it is based changes.
-	 */
-	private transient int hashCode = HASH_CODE_NOT_COMPUTED;
-
-	/**
-	 * This is an array of parameterization defined for this command. This value
-	 * may be <code>null</code> if the command has no parameters.
-	 */
-	private final Parameterization[] parameterizations;
-
-	private String name;
-
-	/**
-	 * Constructs a new instance of <code>ParameterizedCommand</code> with
-	 * specific values for zero or more of its parameters.
-	 * 
-	 * @param command
-	 *            The command that is parameterized; must not be
-	 *            <code>null</code>.
-	 * @param parameterizations
-	 *            An array of parameterizations binding parameters to values for
-	 *            the command. This value may be <code>null</code>.
-	 */
-	public ParameterizedCommand(final Command command,
-			final Parameterization[] parameterizations) {
-		if (command == null) {
-			throw new NullPointerException(
-					"A parameterized command cannot have a null command"); //$NON-NLS-1$
-		}
-
-		this.command = command;
-		IParameter[] parms = null;
-		try {
-			parms = command.getParameters();
-		} catch (NotDefinedException e) {
-			// This should not happen.
-		}
-		if (parameterizations != null && parameterizations.length>0 && parms != null) {
-			int parmIndex = 0;
-			Parameterization[] params = new Parameterization[parameterizations.length];
-			for (int j = 0; j < parms.length; j++) {
-				for (int i = 0; i < parameterizations.length; i++) {
-					Parameterization pm = parameterizations[i];
-					if (parms[j].equals(pm.getParameter())) {
-						params[parmIndex++] = pm;
-					}
-				}
-			}
-			this.parameterizations = params;
-		} else {
-			this.parameterizations = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Comparable#compareTo(java.lang.Object)
-	 */
-	public final int compareTo(final Object object) {
-		final ParameterizedCommand command = (ParameterizedCommand) object;
-		final boolean thisDefined = this.command.isDefined();
-		final boolean otherDefined = command.command.isDefined();
-		if (!thisDefined || !otherDefined) {
-			return Util.compare(thisDefined, otherDefined);
-		}
-
-		try {
-			final int compareTo = getName().compareTo(command.getName());
-			if (compareTo == 0) {
-				return getId().compareTo(command.getId());
-			}
-			return compareTo;
-		} catch (final NotDefinedException e) {
-			throw new Error(
-					"Concurrent modification of a command's defined state"); //$NON-NLS-1$
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public final boolean equals(final Object object) {
-		if (this == object) {
-			return true;
-		}
-
-		if (!(object instanceof ParameterizedCommand)) {
-			return false;
-		}
-
-		final ParameterizedCommand command = (ParameterizedCommand) object;
-		if (!Util.equals(this.command, command.command)) {
-			return false;
-		}
-
-		return Util.equals(this.parameterizations, command.parameterizations);
-	}
-
-	/**
-	 * Executes this command with its parameters. This method will succeed
-	 * regardless of whether the command is enabled or defined. It is
-	 * preferrable to use {@link #executeWithChecks(Object, Object)}.
-	 * 
-	 * @param trigger
-	 *            The object that triggered the execution; may be
-	 *            <code>null</code>.
-	 * @param applicationContext
-	 *            The state of the application at the time the execution was
-	 *            triggered; may be <code>null</code>.
-	 * @return The result of the execution; may be <code>null</code>.
-	 * @throws ExecutionException
-	 *             If the handler has problems executing this command.
-	 * @throws NotHandledException
-	 *             If there is no handler.
-	 * @deprecated Please use {@link #executeWithChecks(Object, Object)}
-	 *             instead.
-	 */
-	public final Object execute(final Object trigger,
-			final Object applicationContext) throws ExecutionException,
-			NotHandledException {
-		return command.execute(new ExecutionEvent(command, getParameterMap(),
-				trigger, applicationContext));
-	}
-
-	/**
-	 * Executes this command with its parameters. This does extra checking to
-	 * see if the command is enabled and defined. If it is not both enabled and
-	 * defined, then the execution listeners will be notified and an exception
-	 * thrown.
-	 * 
-	 * @param trigger
-	 *            The object that triggered the execution; may be
-	 *            <code>null</code>.
-	 * @param applicationContext
-	 *            The state of the application at the time the execution was
-	 *            triggered; may be <code>null</code>.
-	 * @return The result of the execution; may be <code>null</code>.
-	 * @throws ExecutionException
-	 *             If the handler has problems executing this command.
-	 * @throws NotDefinedException
-	 *             If the command you are trying to execute is not defined.
-	 * @throws NotEnabledException
-	 *             If the command you are trying to execute is not enabled.
-	 * @throws NotHandledException
-	 *             If there is no handler.
-	 * @since 3.2
-	 */
-	public final Object executeWithChecks(final Object trigger,
-			final Object applicationContext) throws ExecutionException,
-			NotDefinedException, NotEnabledException, NotHandledException {
-		return command.executeWithChecks(new ExecutionEvent(command,
-				getParameterMap(), trigger, applicationContext));
-	}
-
-	/**
-	 * Returns the base command. It is possible for more than one parameterized
-	 * command to have the same identifier.
-	 * 
-	 * @return The command; never <code>null</code>, but may be undefined.
-	 */
-	public final Command getCommand() {
-		return command;
-	}
-
-	/**
-	 * Returns the command's base identifier. It is possible for more than one
-	 * parameterized command to have the same identifier.
-	 * 
-	 * @return The command id; never <code>null</code>.
-	 */
-	public final String getId() {
-		return command.getId();
-	}
-
-	/**
-	 * Returns a human-readable representation of this command with all of its
-	 * parameterizations.
-	 * 
-	 * @return The human-readable representation of this parameterized command;
-	 *         never <code>null</code>.
-	 * @throws NotDefinedException
-	 *             If the underlying command is not defined.
-	 */
-	public final String getName() throws NotDefinedException {
-		if (name == null) {
-			final StringBuffer nameBuffer = new StringBuffer();
-			nameBuffer.append(command.getName());
-			if (parameterizations != null) {
-				nameBuffer.append(" ("); //$NON-NLS-1$
-				final int parameterizationCount = parameterizations.length;
-				for (int i = 0; i < parameterizationCount; i++) {
-					final Parameterization parameterization = parameterizations[i];
-					nameBuffer
-							.append(parameterization.getParameter().getName());
-					nameBuffer.append(": "); //$NON-NLS-1$
-					try {
-						nameBuffer.append(parameterization.getValueName());
-					} catch (final ParameterValuesException e) {
-						/*
-						 * Just let it go for now. If someone complains we can
-						 * add more info later.
-						 */
-					}
-
-					// If there is another item, append a separator.
-					if (i + 1 < parameterizationCount) {
-						nameBuffer.append(", "); //$NON-NLS-1$
-					}
-				}
-				nameBuffer.append(')');
-			}
-			name = nameBuffer.toString();
-		}
-		return name;
-	}
-
-	/**
-	 * Returns the parameter map, as can be used to construct an
-	 * <code>ExecutionEvent</code>.
-	 * 
-	 * @return The map of parameter ids (<code>String</code>) to parameter
-	 *         values (<code>String</code>). This map is never
-	 *         <code>null</code>, but may be empty.
-	 */
-	public final Map getParameterMap() {
-		if ((parameterizations == null) || (parameterizations.length == 0)) {
-			return Collections.EMPTY_MAP;
-		}
-
-		final Map parameterMap = new HashMap();
-		for (int i = 0; i < parameterizations.length; i++) {
-			final Parameterization parameterization = parameterizations[i];
-			parameterMap.put(parameterization.getParameter().getId(),
-					parameterization.getValue());
-		}
-		return parameterMap;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	public final int hashCode() {
-		if (hashCode == HASH_CODE_NOT_COMPUTED) {
-			hashCode = HASH_INITIAL * HASH_FACTOR + Util.hashCode(command);
-			hashCode = hashCode * HASH_FACTOR;
-			if (parameterizations != null) {
-				for (int i = 0; i < parameterizations.length; i++) {
-					hashCode += Util.hashCode(parameterizations[i]);
-				}
-			}
-			if (hashCode == HASH_CODE_NOT_COMPUTED) {
-				hashCode++;
-			}
-		}
-		return hashCode;
-	}
-
-	/**
-	 * Returns a {@link String} containing the command id, parameter ids and
-	 * parameter values for this {@link ParameterizedCommand}. The returned
-	 * {@link String} can be stored by a client and later used to reconstruct an
-	 * equivalent {@link ParameterizedCommand} using the
-	 * {@link CommandManager#deserialize(String)} method.
-	 * <p>
-	 * The syntax of the returned {@link String} is as follows:
-	 * </p>
-	 * 
-	 * <blockquote>
-	 * <code>serialization = <u>commandId</u> [ '(' parameters ')' ]</code><br>
-	 * <code>parameters = parameter [ ',' parameters ]</code><br>
-	 * <code>parameter = <u>parameterId</u> [ '=' <u>parameterValue</u> ]</code>
-	 * </blockquote>
-	 * 
-	 * <p>
-	 * In the syntax above, sections inside square-brackets are optional. The
-	 * characters in single quotes (<code>(</code>, <code>)</code>,
-	 * <code>,</code> and <code>=</code>) indicate literal characters.
-	 * </p>
-	 * <p>
-	 * <code><u>commandId</u></code> represents the command id encoded with
-	 * separator characters escaped. <code><u>parameterId</u></code> and
-	 * <code><u>parameterValue</u></code> represent the parameter ids and
-	 * values encoded with separator characters escaped. The separator
-	 * characters <code>(</code>, <code>)</code>, <code>,</code> and
-	 * <code>=</code> are escaped by prepending a <code>%</code>. This
-	 * requires <code>%</code> to be escaped, which is also done by prepending
-	 * a <code>%</code>.
-	 * </p>
-	 * <p>
-	 * The order of the parameters is not defined (and not important). A missing
-	 * <code><u>parameterValue</u></code> indicates that the value of the
-	 * parameter is <code>null</code>.
-	 * </p>
-	 * <p>
-	 * For example, the string shown below represents a serialized parameterized
-	 * command that can be used to show the Resource perspective:
-	 * </p>
-	 * <p>
-	 * <code>org.eclipse.ui.perspectives.showPerspective(org.eclipse.ui.perspectives.showPerspective.perspectiveId=org.eclipse.ui.resourcePerspective)</code>
-	 * </p>
-	 * <p>
-	 * This example shows the more general form with multiple parameters,
-	 * <code>null</code> value parameters, and escaped <code>=</code> in the
-	 * third parameter value.
-	 * </p>
-	 * <p>
-	 * <code>command.id(param1.id=value1,param2.id,param3.id=esc%=val3)</code>
-	 * </p>
-	 * 
-	 * @return A string containing the escaped command id, parameter ids and
-	 *         parameter values; never <code>null</code>.
-	 * @see CommandManager#deserialize(String)
-	 * @since 3.2
-	 */
-	public final String serialize() {
-		final String escapedId = escape(getId());
-
-		if ((parameterizations == null) || (parameterizations.length == 0)) {
-			return escapedId;
-		}
-
-		final StringBuffer buffer = new StringBuffer(escapedId);
-		buffer.append(CommandManager.PARAMETER_START_CHAR);
-
-		for (int i = 0; i < parameterizations.length; i++) {
-
-			if (i > 0) {
-				// insert separator between parameters
-				buffer.append(CommandManager.PARAMETER_SEPARATOR_CHAR);
-			}
-
-			final Parameterization parameterization = parameterizations[i];
-			final String parameterId = parameterization.getParameter().getId();
-			final String escapedParameterId = escape(parameterId);
-
-			buffer.append(escapedParameterId);
-
-			final String parameterValue = parameterization.getValue();
-			if (parameterValue != null) {
-				final String escapedParameterValue = escape(parameterValue);
-				buffer.append(CommandManager.ID_VALUE_CHAR);
-				buffer.append(escapedParameterValue);
-			}
-		}
-
-		buffer.append(CommandManager.PARAMETER_END_CHAR);
-
-		return buffer.toString();
-	}
-
-	public final String toString() {
-		final StringBuffer buffer = new StringBuffer();
-		buffer.append("ParameterizedCommand("); //$NON-NLS-1$
-		buffer.append(command);
-		buffer.append(',');
-		buffer.append(parameterizations);
-		buffer.append(')');
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/SerializationException.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/SerializationException.java
deleted file mode 100644
index 76da8a9..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/SerializationException.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands;
-
-import org.eclipse.core.commands.common.CommandException;
-
-/**
- * Signals that an exception occured while serializing a
- * {@link ParameterizedCommand} to a string or deserializing a String to a
- * {@link ParameterizedCommand}.
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.2
- */
-public final class SerializationException extends CommandException {
-
-	/**
-	 * Generated serial version UID for this class.
-	 */
-	private static final long serialVersionUID = 2691599674561684949L;
-
-	/**
-	 * Creates a new instance of this class with the specified detail message.
-	 * 
-	 * @param message
-	 *            the detail message; may be <code>null</code>.
-	 */
-	public SerializationException(final String message) {
-		super(message);
-	}
-	
-	/**
-	 * Creates a new instance of this class with the specified detail message
-	 * and cause.
-	 * 
-	 * @param message
-	 *            the detail message; may be <code>null</code>.
-	 * @param cause
-	 *            the cause; may be <code>null</code>.
-	 */
-	public SerializationException(final String message, final Throwable cause) {
-		super(message, cause);
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/State.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/State.java
deleted file mode 100644
index 7a82373..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/State.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands;
-
-import org.eclipse.core.commands.common.EventManager;
-import org.eclipse.core.internal.commands.util.Util;
-
-/**
- * <p>
- * A piece of state information that can be shared between objects, and might be
- * persisted between sessions. This can be used for commands that toggle between
- * two states and wish to pass this state information between different
- * handlers.
- * </p>
- * <p>
- * This state object can either be used as a single state object shared between
- * several commands, or one state object per command -- depending on the needs
- * of the application.
- * </p>
- * <p>
- * Clients may instantiate or extend this class.
- * </p>
- * 
- * @since 3.2
- */
-public class State extends EventManager {
-
-	/**
-	 * The identifier of the state; may be <code>null</code> if it has not
-	 * been initialized.
-	 */
-	private String id;
-
-	/**
-	 * The value held by this state; may be anything at all.
-	 */
-	private Object value;
-
-	/**
-	 * Adds a listener to changes for this state.
-	 * 
-	 * @param listener
-	 *            The listener to add; must not be <code>null</code>.
-	 */
-	public void addListener(final IStateListener listener) {
-		addListenerObject(listener);
-	}
-
-	/**
-	 * Disposes of this state. This allows the state to unregister itself with
-	 * any managers or as a listener.
-	 */
-	public void dispose() {
-		// The default implementation does nothing.
-	}
-
-	/**
-	 * Notifies listeners to this state that it has changed in some way.
-	 * 
-	 * @param oldValue
-	 *            The old value; may be anything.
-	 */
-	protected final void fireStateChanged(final Object oldValue) {
-		final Object[] listeners = getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			final IStateListener listener = (IStateListener) listeners[i];
-			listener.handleStateChange(this, oldValue);
-		}
-	}
-
-	/**
-	 * Returns the identifier for this state.
-	 * 
-	 * @return The id; may be <code>null</code>.
-	 */
-	public final String getId() {
-		return id;
-	}
-
-	/**
-	 * The current value associated with this state. This can be any type of
-	 * object, but implementations will usually restrict this value to a
-	 * particular type.
-	 * 
-	 * @return The current value; may be anything.
-	 */
-
-	public Object getValue() {
-		return value;
-	}
-
-	/**
-	 * Removes a listener to changes from this state.
-	 * 
-	 * @param listener
-	 *            The listener to remove; must not be <code>null</code>.
-	 */
-
-	public void removeListener(final IStateListener listener) {
-		removeListenerObject(listener);
-	}
-
-	/**
-	 * Sets the identifier for this object.  This method should only be called
-	 * by the command framework.  Clients should not call this method.
-	 * 
-	 * @param id
-	 *            The id; must not be <code>null</code>.
-	 */
-	public void setId(final String id) {
-		this.id = id;
-	}
-
-	/**
-	 * Sets the value for this state object.
-	 * 
-	 * @param value
-	 *            The value to set; may be anything.
-	 */
-	public void setValue(final Object value) {
-		if (!Util.equals(this.value, value)) {
-			final Object oldValue = this.value;
-			this.value = value;
-			fireStateChanged(oldValue);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/AbstractBitSetEvent.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/AbstractBitSetEvent.java
deleted file mode 100644
index c4a6a44..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/AbstractBitSetEvent.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.core.commands.common;
-
-/**
- * <p>
- * An event that carries with it two or more boolean values.  This provides a
- * single integer value which can then be used as a bit set.
- * </p>
- * 
- * @since 3.1
- */
-public abstract class AbstractBitSetEvent {
-
-	/**
-	 * A collection of bits representing whether certain values have changed. A
-	 * bit is set (i.e., <code>1</code>) if the corresponding property has
-	 * changed. It can be assumed that this value will be correctly initialized
-	 * by the superconstructor.
-	 */
-	protected int changedValues = 0;
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/AbstractHandleObjectEvent.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/AbstractHandleObjectEvent.java
deleted file mode 100644
index 250cfbc..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/AbstractHandleObjectEvent.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.commands.common;
-
-/**
- * <p>
- * An event fired from a <code>NamedHandleObject</code>. This provides
- * notification of changes to the defined state, the name and the description.
- * </p>
- * 
- * @since 3.2
- */
-public abstract class AbstractHandleObjectEvent extends AbstractBitSetEvent {
-
-	/**
-	 * The bit used to represent whether the category has changed its defined
-	 * state.
-	 */
-	protected static final int CHANGED_DEFINED = 1;
-
-	/**
-	 * The last used bit so that subclasses can add more properties.
-	 */
-	protected static final int LAST_BIT_USED_ABSTRACT_HANDLE = CHANGED_DEFINED;
-
-	/**
-	 * Constructs a new instance of <code>AbstractHandleObjectEvent</code>.
-	 * 
-	 * @param definedChanged
-	 *            <code>true</code>, iff the defined property changed.
-	 */
-	protected AbstractHandleObjectEvent(final boolean definedChanged) {
-		if (definedChanged) {
-			changedValues |= CHANGED_DEFINED;
-		}
-	}
-
-	/**
-	 * Returns whether or not the defined property changed.
-	 * 
-	 * @return <code>true</code>, iff the defined property changed.
-	 */
-	public final boolean isDefinedChanged() {
-		return ((changedValues & CHANGED_DEFINED) != 0);
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/AbstractNamedHandleEvent.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/AbstractNamedHandleEvent.java
deleted file mode 100644
index b76a796..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/AbstractNamedHandleEvent.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.commands.common;
-
-/**
- * <p>
- * An event fired from a <code>NamedHandleObject</code>. This provides
- * notification of changes to the defined state, the name and the description.
- * </p>
- * 
- * @since 3.1
- */
-public abstract class AbstractNamedHandleEvent extends
-		AbstractHandleObjectEvent {
-
-	/**
-	 * The bit used to represent whether the category has changed its
-	 * description.
-	 */
-	protected static final int CHANGED_DESCRIPTION = 1 << LAST_BIT_USED_ABSTRACT_HANDLE;
-
-	/**
-	 * The bit used to represent whether the category has changed its name.
-	 */
-	protected static final int CHANGED_NAME = 1 << LAST_BIT_USED_ABSTRACT_HANDLE;
-
-	/**
-	 * The last used bit so that subclasses can add more properties.
-	 */
-	protected static final int LAST_USED_BIT = CHANGED_NAME;
-
-	/**
-	 * Constructs a new instance of <code>AbstractHandleObjectEvent</code>.
-	 * 
-	 * @param definedChanged
-	 *            <code>true</code>, iff the defined property changed.
-	 * @param descriptionChanged
-	 *            <code>true</code>, iff the description property changed.
-	 * @param nameChanged
-	 *            <code>true</code>, iff the name property changed.
-	 */
-	protected AbstractNamedHandleEvent(final boolean definedChanged,
-			final boolean descriptionChanged, final boolean nameChanged) {
-		super(definedChanged);
-
-		if (descriptionChanged) {
-			changedValues |= CHANGED_DESCRIPTION;
-		}
-		if (nameChanged) {
-			changedValues |= CHANGED_NAME;
-		}
-	}
-
-	/**
-	 * Returns whether or not the description property changed.
-	 * 
-	 * @return <code>true</code>, iff the description property changed.
-	 */
-	public final boolean isDescriptionChanged() {
-		return ((changedValues & CHANGED_DESCRIPTION) != 0);
-	}
-
-	/**
-	 * Returns whether or not the name property changed.
-	 * 
-	 * @return <code>true</code>, iff the name property changed.
-	 */
-	public final boolean isNameChanged() {
-		return ((changedValues & CHANGED_NAME) != 0);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/CommandException.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/CommandException.java
deleted file mode 100644
index 253fa61..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/CommandException.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.common;
-
-/**
- * Signals that an exception occured within the command architecture.
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.1
- * @noextend This class is not intended to be subclassed by clients.
- */
-public abstract class CommandException extends Exception {
-	
-	/**
-	 * Generated serial version UID for this class.
-	 * 
-	 * @since 3.4
-	 */
-	private static final long serialVersionUID = 5389763628699257234L;
-	
-	/**
-	 * This member variable is required here to allow us to compile against JCL
-	 * foundation libraries.  The value may be <code>null</code>.
-	 */
-	private Throwable cause;
-	
-    /**
-     * Creates a new instance of this class with the specified detail message.
-     * 
-     * @param message
-     *            the detail message; may be <code>null</code>.
-     */
-    public CommandException(final String message) {
-        super(message);
-    }
-
-    /**
-     * Creates a new instance of this class with the specified detail message
-     * and cause.
-     * 
-     * @param message
-     *            the detail message; may be <code>null</code>.
-     * @param cause
-     *            the cause; may be <code>null</code>.
-     */
-    public CommandException(final String message, final Throwable cause) {
-        super(message);
-        // don't pass the cause to super, to allow compilation against JCL Foundation
-        this.cause = cause;
-    }
-    
-    /**
-     * Returns the cause of this throwable or <code>null</code> if the
-     * cause is nonexistent or unknown. 
-     * 
-     * @return the cause or <code>null</code>
-     */
-    public Throwable getCause() {
-        return cause;
-    }
-    
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/EventManager.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/EventManager.java
deleted file mode 100644
index 7c3406b..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/EventManager.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands.common;
-
-import org.eclipse.core.runtime.ListenerList;
-
-/**
- * <p>
- * A manager to which listeners can be attached. This handles the management of
- * a list of listeners -- optimizing memory and performance. All the methods on
- * this class are guaranteed to be thread-safe.
- * </p>
- * <p>
- * Clients may extend.
- * </p>
- * 
- * @since 3.2
- */
-public abstract class EventManager {
-
-	/**
-	 * An empty array that can be returned from a call to
-	 * {@link #getListeners()} when {@link #listenerList} is <code>null</code>.
-	 */
-	private static final Object[] EMPTY_ARRAY = new Object[0];
-
-	/**
-	 * A collection of objects listening to changes to this manager. This
-	 * collection is <code>null</code> if there are no listeners.
-	 */
-	private transient ListenerList listenerList = null;
-
-	/**
-	 * Adds a listener to this manager that will be notified when this manager's
-	 * state changes.
-	 * 
-	 * @param listener
-	 *            The listener to be added; must not be <code>null</code>.
-	 */
-	protected synchronized final void addListenerObject(final Object listener) {
-		if (listenerList == null) {
-			listenerList = new ListenerList(ListenerList.IDENTITY);
-		}
-
-		listenerList.add(listener);
-	}
-
-	/**
-	 * Clears all of the listeners from the listener list.
-	 */
-	protected synchronized final void clearListeners() {
-		if (listenerList != null) {
-			listenerList.clear();
-		}
-	}
-
-	/**
-	 * Returns the listeners attached to this event manager.
-	 * 
-	 * @return The listeners currently attached; may be empty, but never
-	 *         <code>null</code>
-	 */
-	protected final Object[] getListeners() {
-		final ListenerList list = listenerList;
-		if (list == null) {
-			return EMPTY_ARRAY;
-		}
-
-		return list.getListeners();
-	}
-
-	/**
-	 * Whether one or more listeners are attached to the manager.
-	 * 
-	 * @return <code>true</code> if listeners are attached to the manager;
-	 *         <code>false</code> otherwise.
-	 */
-	protected final boolean isListenerAttached() {
-		return listenerList != null;
-	}
-
-	/**
-	 * Removes a listener from this manager.
-	 * 
-	 * @param listener
-	 *            The listener to be removed; must not be <code>null</code>.
-	 */
-	protected synchronized final void removeListenerObject(final Object listener) {
-		if (listenerList != null) {
-			listenerList.remove(listener);
-
-			if (listenerList.isEmpty()) {
-				listenerList = null;
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/HandleObject.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/HandleObject.java
deleted file mode 100644
index bd01ede..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/HandleObject.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.common;
-
-import org.eclipse.core.internal.commands.util.Util;
-
-/**
- * <p>
- * An object that can exist in one of two states: defined and undefined. This is
- * used by APIs that want to give a handle to an object, even though the object
- * does not fully exist yet. This way, users can attach listeners to objects
- * before they come into existence. It also protects the API from users that do
- * not release references when they should.
- * </p>
- * <p>
- * To enforce good coding practice, all handle objects must implement
- * <code>equals</code> and <code>toString</code>. Please use
- * <code>string</code> to cache the result for <code>toString</code> once
- * calculated.
- * </p>
- * <p>
- * All handle objects are referred to using a single identifier. This identifier
- * is a instance of <code>String</code>. It is important that this identifier
- * remain unique within whatever context that handle object is being used. For
- * example, there should only ever be one instance of <code>Command</code>
- * with a given identifier.
- * </p>
- * 
- * @since 3.1
- */
-public abstract class HandleObject extends EventManager implements
-		IIdentifiable {
-
-	/**
-	 * The constant integer hash code value meaning the hash code has not yet
-	 * been computed.
-	 */
-	private static final int HASH_CODE_NOT_COMPUTED = -1;
-	
-    /**
-     * A factor for computing the hash code for all schemes.
-     */
-    private static final int HASH_FACTOR = 89;
-
-    /**
-     * The seed for the hash code for all schemes.
-     */
-    private static final int HASH_INITIAL = HandleObject.class.getName()
-            .hashCode();
-
-    /**
-     * Whether this object is defined. A defined object is one that has been
-     * fully initialized. By default, all objects start as undefined.
-     */
-    protected transient boolean defined = false;
-
-    /**
-     * The hash code for this object. This value is computed lazily, and marked
-     * as invalid when one of the values on which it is based changes.
-     */
-    private transient int hashCode = HASH_CODE_NOT_COMPUTED;
-
-    /**
-     * The identifier for this object. This identifier should be unique across
-     * all objects of the same type and should never change. This value will
-     * never be <code>null</code>.
-     */
-    protected final String id;
-
-    /**
-     * The string representation of this object. This string is for debugging
-     * purposes only, and is not meant to be displayed to the user. This value
-     * is computed lazily, and is cleared if one of its dependent values
-     * changes.
-     */
-    protected transient String string = null;
-
-    /**
-     * Constructs a new instance of <code>HandleObject</code>.
-     * 
-     * @param id
-     *            The id of this handle; must not be <code>null</code>.
-     */
-    protected HandleObject(final String id) {
-        if (id == null) {
-            throw new NullPointerException(
-                    "Cannot create a handle with a null id"); //$NON-NLS-1$
-        }
-
-        this.id = id;
-    }
-
-    /**
-     * Tests whether this object is equal to another object. A handle object is
-     * only equal to another handle object with the same id and the same class.
-     * 
-     * @param object
-     *            The object with which to compare; may be <code>null</code>.
-     * @return <code>true</code> if the objects are equal; <code>false</code>
-     *         otherwise.
-     */
-	public boolean equals(final Object object) {
-		// Check if they're the same.
-		if (object == this) {
-			return true;
-		}
-
-		// Check if they're the same type.
-		if (!(object instanceof HandleObject)) {
-			return false;
-		}
-
-		// Check each property in turn.
-		final HandleObject handle= (HandleObject) object;
-		return Util.equals(id, handle.id)
-				&& (this.getClass() == handle.getClass());
-	}
-	
-    public final String getId() {
-        return id;
-    }
-
-    /**
-     * Computes the hash code for this object based on the id.
-     * 
-     * @return The hash code for this object.
-     */
-    public final int hashCode() {
-        if (hashCode == HASH_CODE_NOT_COMPUTED) {
-			hashCode = HASH_INITIAL * HASH_FACTOR + Util.hashCode(id);
-			if (hashCode == HASH_CODE_NOT_COMPUTED) {
-				hashCode++;
-			}
-		}
-		return hashCode;
-    }
-
-    /**
-     * Whether this instance is defined. A defined instance is one that has been
-     * fully initialized. This allows objects to effectively disappear even
-     * though other objects may still have references to them.
-     * 
-     * @return <code>true</code> if this object is defined; <code>false</code>
-     *         otherwise.
-     */
-    public final boolean isDefined() {
-        return defined;
-    }
-
-    /**
-     * The string representation of this object -- for debugging purposes only.
-     * This string should not be shown to an end user.
-     * 
-     * @return The string representation; never <code>null</code>.
-     */
-    public abstract String toString();
-
-    /**
-     * Makes this object becomes undefined. This method should make any defined
-     * properties <code>null</code>. It should also send notification to any
-     * listeners that these properties have changed.
-     */
-    public abstract void undefine();
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/HandleObjectManager.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/HandleObjectManager.java
deleted file mode 100644
index c6071b0..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/HandleObjectManager.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands.common;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * <p>
- * A manager of {@link HandleObject} instances. This has some common behaviour
- * which is shared between all such managers.
- * </p>
- * <p>
- * Clients may extend.
- * </p>
- * 
- * @since 3.2
- */
-public abstract class HandleObjectManager extends EventManager {
-
-	/**
-	 * The set of handle objects that are defined. This value may be empty, but
-	 * it is never <code>null</code>.
-	 */
-	protected final Set definedHandleObjects = new HashSet();
-
-	/**
-	 * The map of identifiers (<code>String</code>) to handle objects (
-	 * <code>HandleObject</code>). This collection may be empty, but it is
-	 * never <code>null</code>.
-	 */
-	protected final Map handleObjectsById = new HashMap();
-
-	/**
-	 * Verifies that the identifier is valid. Exceptions will be thrown if the
-	 * identifier is invalid in some way.
-	 * 
-	 * @param id
-	 *            The identifier to validate; may be anything.
-	 */
-	protected final void checkId(final String id) {
-		if (id == null) {
-			throw new NullPointerException(
-					"A handle object may not have a null identifier"); //$NON-NLS-1$
-		}
-
-		if (id.length() < 1) {
-			throw new IllegalArgumentException(
-					"The handle object must not have a zero-length identifier"); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Returns the set of identifiers for those handle objects that are defined.
-	 * 
-	 * @return The set of defined handle object identifiers; this value may be
-	 *         empty, but it is never <code>null</code>.
-	 */
-	protected final Set getDefinedHandleObjectIds() {
-		final HashSet definedHandleObjectIds = new HashSet(definedHandleObjects
-				.size());
-		final Iterator handleObjectItr = definedHandleObjects.iterator();
-		while (handleObjectItr.hasNext()) {
-			final HandleObject handleObject = (HandleObject) handleObjectItr
-					.next();
-			final String id = handleObject.getId();
-			definedHandleObjectIds.add(id);
-		}
-		return definedHandleObjectIds;
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/IIdentifiable.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/IIdentifiable.java
deleted file mode 100644
index d8b0fa7..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/IIdentifiable.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands.common;
-
-/**
- * <p>
- * An object that is unique identifiable based on the combination of its class
- * and its identifier.
- * </p>
- * 
- * @see HandleObject
- * @since 3.2
- */
-public interface IIdentifiable {
-
-    /**
-     * Returns the identifier for this object.
-     * 
-     * @return The identifier; never <code>null</code>.
-     */
-	String getId();
-}
-
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/NamedHandleObject.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/NamedHandleObject.java
deleted file mode 100644
index c20c79c..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/NamedHandleObject.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.common;
-
-/**
- * A handle object that carries with it a name and a description. This type of
- * handle object is quite common across the commands code base. For example,
- * <code>Command</code>, <code>Context</code> and <code>Scheme</code>.
- * 
- * @since 3.1
- */
-public abstract class NamedHandleObject extends HandleObject {
-
-	/**
-	 * The description for this handle. This value may be <code>null</code> if
-	 * the handle is undefined or has no description.
-	 */
-	protected String description = null;
-
-	/**
-	 * The name of this handle. This valud should not be <code>null</code>
-	 * unless the handle is undefined.
-	 */
-	protected String name = null;
-
-	/**
-	 * Constructs a new instance of <code>NamedHandleObject</code>.
-	 * 
-	 * @param id
-	 *            The identifier for this handle; must not be <code>null</code>.
-	 */
-	protected NamedHandleObject(final String id) {
-		super(id);
-	}
-
-	/**
-	 * Returns the description for this handle.
-	 * 
-	 * @return The description; may be <code>null</code> if there is no
-	 *         description.
-	 * @throws NotDefinedException
-	 *             If the handle is not currently defined.
-	 */
-	public String getDescription() throws NotDefinedException {
-		if (!isDefined()) {
-			throw new NotDefinedException(
-					"Cannot get a description from an undefined object. " //$NON-NLS-1$
-					+ id);
-		}
-
-		return description;
-	}
-
-	/**
-	 * Returns the name for this handle.
-	 * 
-	 * @return The name for this handle; never <code>null</code>.
-	 * @throws NotDefinedException
-	 *             If the handle is not currently defined.
-	 */
-	public String getName() throws NotDefinedException {
-		if (!isDefined()) {
-			throw new NotDefinedException(
-					"Cannot get the name from an undefined object. " //$NON-NLS-1$
-					+ id);
-		}
-
-		return name;
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/NamedHandleObjectComparator.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/NamedHandleObjectComparator.java
deleted file mode 100644
index e2a54c1..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/NamedHandleObjectComparator.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands.common;
-
-import java.util.Comparator;
-
-import org.eclipse.core.internal.commands.util.Util;
-
-/**
- * Comparator for instances of <code>NamedHandleObject</code> for display to
- * an end user. The comparison is based on the name of the instances.
- * 
- * @since 3.2
- */
-public class NamedHandleObjectComparator implements Comparator {
-
-	/**
-	 * Compares to instances of NamedHandleObject based on their names. This is
-	 * useful is they are display to an end user.
-	 * 
-	 * @param left
-	 *            The first obect to compare; may be <code>null</code>.
-	 * @param right
-	 *            The second object to compare; may be <code>null</code>.
-	 * @return <code>-1</code> if <code>left</code> is <code>null</code>
-	 *         and <code>right</code> is not <code>null</code>;
-	 *         <code>0</code> if they are both <code>null</code>;
-	 *         <code>1</code> if <code>left</code> is not <code>null</code>
-	 *         and <code>right</code> is <code>null</code>. Otherwise, the
-	 *         result of <code>left.compareTo(right)</code>.
-	 */
-	public final int compare(final Object left, final Object right) {
-		final NamedHandleObject a = (NamedHandleObject) left;
-		final NamedHandleObject b = (NamedHandleObject) right;
-
-		String aName = null;
-		try {
-			aName = a.getName();
-		} catch (final NotDefinedException e) {
-			// Leave aName as null.
-		}
-		String bName = null;
-		try {
-			bName = b.getName();
-		} catch (final NotDefinedException e) {
-			// Leave bName as null.
-		}
-
-		return Util.compare(aName, bName);
-	}
-}
-
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/NotDefinedException.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/NotDefinedException.java
deleted file mode 100644
index 349209a..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/NotDefinedException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.common;
-
-/**
- * Signals that an attempt was made to access the properties of an undefined
- * object.
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.1
- */
-public final class NotDefinedException extends CommandException {
-
-    /**
-     * Generated serial version UID for this class.
-     * 
-     * @since 3.1
-     */
-    private static final long serialVersionUID = 3257572788998124596L;
-
-    /**
-     * Creates a new instance of this class with the specified detail message.
-     * 
-     * @param s
-     *            the detail message; may be <code>null</code>.
-     */
-    public NotDefinedException(final String s) {
-        super(s);
-    }
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/package.html b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/package.html
deleted file mode 100644
index 357bc22..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/common/package.html
+++ /dev/null
@@ -1,19 +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>Package-level Javadoc</title>
-<link rel="stylesheet" href="http://dev.eclipse.org/default_style.css"
-	type="text/css">
-</head>
-<body style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0)">
-Application programming interfaces for common base classes.
-<h2>Package Specification</h2>
-<p>
-This package provides some common base classes and exceptions that are used in
-one or more packages elsewhere.  Nothing in this package is intended to be
-directly subclassed, or used.  The code here only supports code in other
-packages.
-</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/Context.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/Context.java
deleted file mode 100644
index 75796f6..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/Context.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands.contexts;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.commands.common.NamedHandleObject;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.internal.commands.util.Util;
-
-/**
- * <p>
- * A context is an answer to the question "when". Other services can listen for
- * the activation and deactivation of contexts, and change their own state in
- * response to these changes. For example, Eclipse's key binding service listens
- * to context activation and deactivation to determine which key bindings should
- * be active.
- * </p>
- * <p>
- * An instance of this interface can be obtained from an instance of
- * <code>ContextManager</code> for any identifier, whether or not an context
- * with that identifier is defined in the extension registry.
- * </p>
- * <p>
- * The handle-based nature of this API allows it to work well with runtime
- * plugin activation and deactivation. If a context is defined, that means that
- * its corresponding plug-in is active. If the plug-in is then deactivated, the
- * context will still exist but it will be undefined. An attempts to use an
- * undefined context will result in a <code>NotDefinedException</code> being
- * thrown.
- * </p>
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.1
- * @see ContextManager
- */
-public final class Context extends NamedHandleObject implements Comparable {
-
-    /**
-     * The collection of all objects listening to changes on this context. This
-     * value is <code>null</code> if there are no listeners.
-     */
-    private Set listeners = null;
-
-    /**
-     * The parent identifier for this context. The meaning of a parent is
-     * dependent on the system using contexts. This value can be
-     * <code>null</code> if the context has no parent.
-     */
-    private String parentId = null;
-
-    /**
-     * Constructs a new instance of <code>Context</code>.
-     * 
-     * @param id
-     *            The id for this context; must not be <code>null</code>.
-     */
-    Context(final String id) {
-        super(id);
-    }
-
-    /**
-     * Registers an instance of <code>IContextListener</code> to listen for
-     * changes to properties of this instance.
-     * 
-     * @param listener
-     *            the instance to register. Must not be <code>null</code>. If
-     *            an attempt is made to register an instance which is already
-     *            registered with this instance, no operation is performed.
-     */
-    public final void addContextListener(final IContextListener listener) {
-        if (listener == null) {
-            throw new NullPointerException();
-        }
-
-        if (listeners == null) {
-            listeners = new HashSet();
-        }
-
-        listeners.add(listener);
-    } 
-    
-    /* (non-Javadoc)
-     * @see java.lang.Comparable#compareTo(java.lang.Object)
-     */
-    public final int compareTo(final Object object) {
-        final Context scheme = (Context) object;
-        int compareTo = Util.compare(this.id, scheme.id);
-        if (compareTo == 0) {
-            compareTo = Util.compare(this.name, scheme.name);
-            if (compareTo == 0) {
-                compareTo = Util.compare(this.parentId, scheme.parentId);
-                if (compareTo == 0) {
-                    compareTo = Util.compare(this.description,
-                            scheme.description);
-                    if (compareTo == 0) {
-                        compareTo = Util.compare(this.defined, scheme.defined);
-                    }
-                }
-            }
-        }
-
-        return compareTo;
-    }
-
-    /**
-     * <p>
-     * Defines this context by giving it a name, and possibly a description and
-     * a parent identifier as well. The defined property automatically becomes
-     * <code>true</code>.
-     * </p>
-     * <p>
-     * Notification is sent to all listeners that something has changed.
-     * </p>
-     * 
-     * @param name
-     *            The name of this context; must not be <code>null</code>.
-     * @param description
-     *            The description for this context; may be <code>null</code>.
-     * @param parentId
-     *            The parent identifier for this context; may be
-     *            <code>null</code>.
-     */
-    public final void define(final String name, final String description,
-            final String parentId) {
-        if (name == null) {
-            throw new NullPointerException(
-                    "The name of a scheme cannot be null"); //$NON-NLS-1$
-        }
-
-        final boolean definedChanged = !this.defined;
-        this.defined = true;
-
-        final boolean nameChanged = !Util.equals(this.name, name);
-        this.name = name;
-
-        final boolean descriptionChanged = !Util.equals(this.description,
-                description);
-        this.description = description;
-
-        final boolean parentIdChanged = !Util.equals(this.parentId, parentId);
-        this.parentId = parentId;
-
-        fireContextChanged(new ContextEvent(this, definedChanged, nameChanged,
-                descriptionChanged, parentIdChanged));
-    }
-
-    /**
-     * Notifies all listeners that this context has changed. This sends the
-     * given event to all of the listeners, if any.
-     * 
-     * @param event
-     *            The event to send to the listeners; must not be
-     *            <code>null</code>.
-     */
-    private final void fireContextChanged(final ContextEvent event) {
-        if (event == null) {
-            throw new NullPointerException(
-                    "Cannot send a null event to listeners."); //$NON-NLS-1$
-        }
-
-        if (listeners == null) {
-            return;
-        }
-
-        final Iterator listenerItr = listeners.iterator();
-        while (listenerItr.hasNext()) {
-            final IContextListener listener = (IContextListener) listenerItr
-                    .next();
-            listener.contextChanged(event);
-        }
-    }
-
-    /**
-     * Returns the identifier of the parent of this instance.
-     * <p>
-     * Notification is sent to all registered listeners if this property
-     * changes.
-     * </p>
-     * 
-     * @return the identifier of the parent of this instance. May be
-     *         <code>null</code>.
-     * @throws NotDefinedException
-     *             if this instance is not defined.
-     */
-    public final String getParentId() throws NotDefinedException {
-        if (!defined) {
-            throw new NotDefinedException(
-                    "Cannot get the parent identifier from an undefined context. " //$NON-NLS-1$
-            		+id);
-        }
-
-        return parentId;
-    }
-
-    /**
-     * Unregisters an instance of <code>IContextListener</code> listening for
-     * changes to properties of this instance.
-     * 
-     * @param contextListener
-     *            the instance to unregister. Must not be <code>null</code>.
-     *            If an attempt is made to unregister an instance which is not
-     *            already registered with this instance, no operation is
-     *            performed.
-     */
-    public final void removeContextListener(
-            final IContextListener contextListener) {
-        if (contextListener == null) {
-            throw new NullPointerException("Cannot remove a null listener."); //$NON-NLS-1$
-        }
-
-        if (listeners == null) {
-            return;
-        }
-
-        listeners.remove(contextListener);
-
-        if (listeners.isEmpty()) {
-            listeners = null;
-        }
-    }
-
-    /**
-     * The string representation of this context -- for debugging purposes only.
-     * This string should not be shown to an end user.
-     * 
-     * @return The string representation; never <code>null</code>.
-     */
-    public final String toString() {
-        if (string == null) {
-            final StringBuffer stringBuffer = new StringBuffer();
-            stringBuffer.append("Context("); //$NON-NLS-1$
-            stringBuffer.append(id);
-            stringBuffer.append(',');
-            stringBuffer.append(name);
-            stringBuffer.append(',');
-            stringBuffer.append(description);
-            stringBuffer.append(',');
-            stringBuffer.append(parentId);
-            stringBuffer.append(',');
-            stringBuffer.append(defined);
-            stringBuffer.append(')');
-            string = stringBuffer.toString();
-        }
-        return string;
-    }
-
-    /**
-     * Makes this context become undefined. This has the side effect of changing
-     * the name, description and parent identifier to <code>null</code>.
-     * Notification is sent to all listeners.
-     */
-    public final void undefine() {
-        string = null;
-
-        final boolean definedChanged = defined;
-        defined = false;
-
-        final boolean nameChanged = name != null;
-        name = null;
-
-        final boolean descriptionChanged = description != null;
-        description = null;
-
-        final boolean parentIdChanged = parentId != null;
-        parentId = null;
-
-        fireContextChanged(new ContextEvent(this, definedChanged, nameChanged,
-                descriptionChanged, parentIdChanged));
-    }
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/ContextEvent.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/ContextEvent.java
deleted file mode 100644
index d1dd2a7..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/ContextEvent.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands.contexts;
-
-import org.eclipse.core.commands.common.AbstractNamedHandleEvent;
-
-/**
- * An instance of this class describes changes to an instance of
- * <code>IContext</code>.
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.1
- * @see IContextListener#contextChanged(ContextEvent)
- */
-public final class ContextEvent extends AbstractNamedHandleEvent {
-
-	/**
-	 * The bit used to represent whether the context has changed its parent.
-	 */
-	private static final int CHANGED_PARENT_ID = LAST_USED_BIT << 1;
-
-	/**
-	 * The context that has changed. This value is never <code>null</code>.
-	 */
-	private final Context context;
-
-	/**
-     * Creates a new instance of this class.
-     * 
-     * @param context
-     *            the instance of the interface that changed; must not be
-     *            <code>null</code>.
-     * @param definedChanged
-     *            <code>true</code>, iff the defined property changed.
-     * @param nameChanged
-     *            <code>true</code>, iff the name property changed.
-     * @param descriptionChanged
-     *            <code>true</code>, iff the description property changed.
-     * @param parentIdChanged
-     *            <code>true</code>, iff the parentId property changed.
-     */
-	public ContextEvent(final Context context, final boolean definedChanged,
-			final boolean nameChanged, final boolean descriptionChanged,
-			final boolean parentIdChanged) {
-		super(definedChanged, descriptionChanged, nameChanged);
-		
-		if (context == null) {
-			throw new NullPointerException();
-		}
-		this.context = context;
-		
-		if (parentIdChanged) {
-			changedValues |= CHANGED_PARENT_ID;
-		}
-	}
-
-	/**
-	 * Returns the instance of the interface that changed.
-	 * 
-	 * @return the instance of the interface that changed. Guaranteed not to be
-	 *         <code>null</code>.
-	 */
-	public final Context getContext() {
-		return context;
-	}
-
-	/**
-	 * Returns whether or not the parentId property changed.
-	 * 
-	 * @return <code>true</code>, iff the parentId property changed.
-	 */
-	public final boolean isParentIdChanged() {
-		return ((changedValues & CHANGED_PARENT_ID) != 0);
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/ContextManager.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/ContextManager.java
deleted file mode 100644
index 48afa02..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/ContextManager.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands.contexts;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.commands.common.HandleObjectManager;
-import org.eclipse.core.commands.util.Tracing;
-import org.eclipse.core.internal.commands.util.Util;
-
-/**
- * <p>
- * A context manager tracks the sets of defined and enabled contexts within the
- * application. The manager sends notification events to listeners when these
- * sets change. It is also possible to retrieve any given context with its
- * identifier.
- * </p>
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.1
- */
-public final class ContextManager extends HandleObjectManager implements
-		IContextListener {
-	
-	/**
-	 * This flag can be set to <code>true</code> if the context manager should
-	 * print information to <code>System.out</code> when certain boundary
-	 * conditions occur.
-	 */
-	public static boolean DEBUG = false;
-
-	/**
-	 * The set of active context identifiers. This value may be empty, but it is
-	 * never <code>null</code>.
-	 */
-	private Set activeContextIds = new HashSet();
-
-	// allow the ContextManager to send one event for a larger delta
-	private boolean caching = false;
-	
-	private int cachingRef = 0;
-
-	private boolean activeContextsChange = false;
-	
-	private Set oldIds = null;
-
-	/**
-	 * Informs the manager that a batch operation has started.
-	 * <p>
-	 * <b>Note:</b> You must insure that if you call
-	 * <code>deferUpdates(true)</code> that nothing in your batched operation
-	 * will prevent the matching call to <code>deferUpdates(false)</code>.
-	 * </p>
-	 * 
-	 * @param defer
-	 *            true when starting a batch operation false when ending the
-	 *            operation
-	 * 
-	 * @since 3.5
-	 */
-	public void deferUpdates(boolean defer) {
-		if(defer) {
-			cachingRef++;
-			if (cachingRef==1) {
-				setEventCaching(true);
-			}
-		}else {
-			cachingRef--;
-			if (cachingRef==0) {
-				setEventCaching(false);
-			}
-		}
-	}
-	
-	
-	/**
-	 * Activates a context in this context manager.
-	 * 
-	 * @param contextId
-	 *            The identifier of the context to activate; must not be
-	 *            <code>null</code>.
-	 */
-	public final void addActiveContext(final String contextId) {
-		
-		if (activeContextIds.contains(contextId)) {
-			return;
-		}
-		activeContextsChange = true;
-
-		if (caching) {
-			activeContextIds.add(contextId);
-		} else {
-			final Set previouslyActiveContextIds = new HashSet(activeContextIds);
-			activeContextIds.add(contextId);
-
-			fireContextManagerChanged(new ContextManagerEvent(this, null,
-					false, true, previouslyActiveContextIds));
-		}
-
-		if (DEBUG) {
-			Tracing.printTrace("CONTEXTS", activeContextIds.toString()); //$NON-NLS-1$
-		}
-
-	}
-
-	/**
-	 * Adds a listener to this context manager. The listener will be notified
-	 * when the set of defined contexts changes. This can be used to track the
-	 * global appearance and disappearance of contexts.
-	 * 
-	 * @param listener
-	 *            The listener to attach; must not be <code>null</code>.
-	 */
-	public final void addContextManagerListener(
-			final IContextManagerListener listener) {
-		addListenerObject(listener);
-	}
-
-	public final void contextChanged(final ContextEvent contextEvent) {
-		if (contextEvent.isDefinedChanged()) {
-			final Context context = contextEvent.getContext();
-			final String contextId = context.getId();
-			final boolean contextIdAdded = context.isDefined();
-			if (contextIdAdded) {
-				definedHandleObjects.add(context);
-			} else {
-				definedHandleObjects.remove(context);
-			}
-			if (isListenerAttached()) {
-				fireContextManagerChanged(new ContextManagerEvent(this,
-						contextId, contextIdAdded, false, null));
-			}
-		}
-	}
-
-	/**
-	 * Notifies all of the listeners to this manager that the set of defined
-	 * context identifiers has changed.
-	 * 
-	 * @param event
-	 *            The event to send to all of the listeners; must not be
-	 *            <code>null</code>.
-	 */
-	private final void fireContextManagerChanged(final ContextManagerEvent event) {
-		if (event == null) {
-			throw new NullPointerException();
-		}
-
-		final Object[] listeners = getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			final IContextManagerListener listener = (IContextManagerListener) listeners[i];
-			listener.contextManagerChanged(event);
-		}
-	}
-
-	/**
-	 * Returns the set of active context identifiers.
-	 * 
-	 * @return The set of active context identifiers; this value may be
-	 *         <code>null</code> if no active contexts have been set yet. If
-	 *         the set is not <code>null</code>, then it contains only
-	 *         instances of <code>String</code>.
-	 */
-	public final Set getActiveContextIds() {
-		return Collections.unmodifiableSet(activeContextIds);
-	}
-
-	/**
-	 * Gets the context with the given identifier. If no such context currently
-	 * exists, then the context will be created (but be undefined).
-	 * 
-	 * @param contextId
-	 *            The identifier to find; must not be <code>null</code>.
-	 * @return The context with the given identifier; this value will never be
-	 *         <code>null</code>, but it might be undefined.
-	 * @see Context
-	 */
-	public final Context getContext(final String contextId) {
-		checkId(contextId);
-
-		Context context = (Context) handleObjectsById.get(contextId);
-		if (context == null) {
-			context = new Context(contextId);
-			handleObjectsById.put(contextId, context);
-			context.addContextListener(this);
-		}
-
-		return context;
-	}
-
-	/**
-	 * Returns the set of identifiers for those contexts that are defined.
-	 * 
-	 * @return The set of defined context identifiers; this value may be empty,
-	 *         but it is never <code>null</code>.
-	 */
-	public final Set getDefinedContextIds() {
-		return getDefinedHandleObjectIds();
-	}
-
-	/**
-	 * Returns the those contexts that are defined.
-	 * 
-	 * @return The defined contexts; this value may be empty, but it is never
-	 *         <code>null</code>.
-	 * @since 3.2
-	 */
-	public final Context[] getDefinedContexts() {
-		return (Context[]) definedHandleObjects
-				.toArray(new Context[definedHandleObjects.size()]);
-	}
-
-	/**
-	 * Deactivates a context in this context manager.
-	 * 
-	 * @param contextId
-	 *            The identifier of the context to deactivate; must not be
-	 *            <code>null</code>.
-	 */
-	public final void removeActiveContext(final String contextId) {
-		if (!activeContextIds.contains(contextId)) {
-			return;
-		}
-
-		activeContextsChange = true;
-		if (caching) {
-			activeContextIds.remove(contextId);
-		} else {
-			final Set previouslyActiveContextIds = new HashSet(activeContextIds);
-			activeContextIds.remove(contextId);
-
-			fireContextManagerChanged(new ContextManagerEvent(this, null,
-					false, true, previouslyActiveContextIds));
-		}
-
-		if (DEBUG) {
-			Tracing.printTrace("CONTEXTS", activeContextIds.toString()); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Removes a listener from this context manager.
-	 * 
-	 * @param listener
-	 *            The listener to be removed; must not be <code>null</code>.
-	 */
-	public final void removeContextManagerListener(
-			final IContextManagerListener listener) {
-		removeListenerObject(listener);
-	}
-
-	/**
-	 * Changes the set of active contexts for this context manager. The whole
-	 * set is required so that internal consistency can be maintained and so
-	 * that excessive recomputations do nothing occur.
-	 * 
-	 * @param activeContextIds
-	 *            The new set of active context identifiers; may be
-	 *            <code>null</code>.
-	 */
-	public final void setActiveContextIds(final Set activeContextIds) {
-		if (Util.equals(this.activeContextIds, activeContextIds)) {
-			return;
-		}
-
-		activeContextsChange = true;
-		
-		final Set previouslyActiveContextIds = this.activeContextIds;
-		if (activeContextIds != null) {
-			this.activeContextIds = new HashSet();
-			this.activeContextIds.addAll(activeContextIds);
-		} else {
-			this.activeContextIds = null;
-		}
-
-		if (DEBUG) {
-			Tracing.printTrace("CONTEXTS", (activeContextIds == null) ? "none" //$NON-NLS-1$ //$NON-NLS-2$
-					: activeContextIds.toString());
-		}
-
-		if (!caching) {
-			fireContextManagerChanged(new ContextManagerEvent(this, null,
-					false, true, previouslyActiveContextIds));
-		}
-	}
-	
-	/**
-	 * Set the manager to cache context id changes.
-	 * 
-	 * @param cache
-	 *            <code>true</code> to turn caching on, <code>false</code>
-	 *            to turn caching off and send an event if necessary.
-	 * @since 3.3
-	 */
-	private void setEventCaching(boolean cache) {
-		if (caching == cache) {
-			return;
-		}
-		caching = cache;
-		boolean fireChange = activeContextsChange;
-		Set holdOldIds = (oldIds==null?Collections.EMPTY_SET:oldIds);
-		
-		if (caching) {
-			oldIds = new HashSet(activeContextIds);
-		} else {
-			oldIds = null;
-		}
-		activeContextsChange = false;
-
-		if (!caching && fireChange) {
-			fireContextManagerChanged(new ContextManagerEvent(this, null,
-					false, true, holdOldIds));
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/ContextManagerEvent.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/ContextManagerEvent.java
deleted file mode 100644
index e5dfa5d..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/ContextManagerEvent.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.contexts;
-
-import java.util.Set;
-
-import org.eclipse.core.commands.common.AbstractBitSetEvent;
-
-/**
- * <p>
- * An event indicating that the set of defined context identifiers has changed.
- * </p>
- * 
- * @since 3.1
- * @see IContextManagerListener#contextManagerChanged(ContextManagerEvent)
- */
-public final class ContextManagerEvent extends AbstractBitSetEvent {
-
-	/**
-	 * The bit used to represent whether the set of defined contexts has
-	 * changed.
-	 */
-	private static final int CHANGED_CONTEXT_DEFINED = 1 << 1;
-
-	/**
-	 * The bit used to represent whether the set of active contexts has changed.
-	 */
-	private static final int CHANGED_CONTEXTS_ACTIVE = 1;
-
-	/**
-	 * The context identifier that was added or removed from the list of defined
-	 * context identifiers.
-	 */
-	private final String contextId;
-
-	/**
-	 * The context manager that has changed.
-	 */
-	private final ContextManager contextManager;
-
-	/**
-	 * The set of context identifiers (strings) that were active before the
-	 * change occurred. If the active contexts did not changed, then this value
-	 * is <code>null</code>.
-	 */
-	private final Set previouslyActiveContextIds;
-
-	/**
-	 * Creates a new instance of this class.
-	 * 
-	 * @param contextManager
-	 *            the instance of the interface that changed; must not be
-	 *            <code>null</code>.
-	 * @param contextId
-	 *            The context identifier that was added or removed; may be
-	 *            <code>null</code> if the active contexts are changing.
-	 * @param contextIdAdded
-	 *            Whether the context identifier became defined (otherwise, it
-	 *            became undefined).
-	 * @param activeContextsChanged
-	 *            Whether the list of active contexts has changed.
-	 * @param previouslyActiveContextIds
-	 *            the set of identifiers of previously active contexts. This set
-	 *            may be empty. If this set is not empty, it must only contain
-	 *            instances of <code>String</code>. This set must be
-	 *            <code>null</code> if activeContextChanged is
-	 *            <code>false</code> and must not be null if
-	 *            activeContextChanged is <code>true</code>.
-	 */
-	public ContextManagerEvent(final ContextManager contextManager,
-			final String contextId, final boolean contextIdAdded,
-			final boolean activeContextsChanged,
-			final Set previouslyActiveContextIds) {
-		if (contextManager == null) {
-			throw new NullPointerException();
-		}
-
-		this.contextManager = contextManager;
-		this.contextId = contextId;
-		this.previouslyActiveContextIds = previouslyActiveContextIds;
-
-		if (contextIdAdded) {
-			changedValues |= CHANGED_CONTEXT_DEFINED;
-		}
-		if (activeContextsChanged) {
-			changedValues |= CHANGED_CONTEXTS_ACTIVE;
-		}
-	}
-
-	/**
-	 * Returns the context identifier that was added or removed.
-	 * 
-	 * @return The context identifier that was added or removed. This value may
-	 *         be <code>null</code> if no context identifier was added or
-	 *         removed.
-	 */
-	public final String getContextId() {
-		return contextId;
-	}
-
-	/**
-	 * Returns the instance of the interface that changed.
-	 * 
-	 * @return the instance of the interface that changed. Guaranteed not to be
-	 *         <code>null</code>.
-	 */
-	public final ContextManager getContextManager() {
-		return contextManager;
-	}
-
-	/**
-     * Returns the set of identifiers to previously active contexts.
-     * 
-     * @return the set of identifiers to previously active contexts. This set
-     *         may be empty. If this set is not empty, it is guaranteed to only
-     *         contain instances of <code>String</code>. This set is
-     *         guaranteed to be <code>null</code> if
-     *         haveActiveContextChanged() is <code>false</code> and is
-     *         guaranteed to not be <code>null</code> if
-     *         haveActiveContextsChanged() is <code>true</code>.
-     */
-	public final Set getPreviouslyActiveContextIds() {
-		return previouslyActiveContextIds;
-	}
-
-	/**
-	 * Returns whether the active context identifiers have changed.
-	 * 
-	 * @return <code>true</code> if the collection of active contexts changed;
-	 *         <code>false</code> otherwise.
-	 */
-	public final boolean isActiveContextsChanged() {
-		return ((changedValues & CHANGED_CONTEXTS_ACTIVE) != 0);
-	}
-
-	/**
-	 * Returns whether the list of defined context identifiers has changed.
-	 * 
-	 * @return <code>true</code> if the list of context identifiers has
-	 *         changed; <code>false</code> otherwise.
-	 */
-	public final boolean isContextChanged() {
-		return (contextId != null);
-	}
-
-	/**
-	 * Returns whether the context identifier became defined. Otherwise, the
-	 * context identifier became undefined.
-	 * 
-	 * @return <code>true</code> if the context identifier became defined;
-	 *         <code>false</code> if the context identifier became undefined.
-	 */
-	public final boolean isContextDefined() {
-		return (((changedValues & CHANGED_CONTEXT_DEFINED) != 0) && (contextId != null));
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/IContextListener.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/IContextListener.java
deleted file mode 100644
index fe3f2e7..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/IContextListener.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands.contexts;
-
-/**
- * An instance of this interface can be used by clients to receive notification
- * of changes to one or more instances of <code>IContext</code>.
- * <p>
- * This interface may be implemented by clients.
- * </p>
- * 
- * @since 3.1
- * @see Context#addContextListener(IContextListener)
- * @see Context#removeContextListener(IContextListener)
- */
-public interface IContextListener {
-
-    /**
-     * Notifies that one or more properties of an instance of
-     * <code>IContext</code> have changed. Specific details are described in
-     * the <code>ContextEvent</code>.
-     * 
-     * @param contextEvent
-     *            the context event. Guaranteed not to be <code>null</code>.
-     */
-    void contextChanged(ContextEvent contextEvent);
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/IContextManagerListener.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/IContextManagerListener.java
deleted file mode 100644
index 5d23a34..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/IContextManagerListener.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands.contexts;
-
-/**
- * An instance of this interface can be used by clients to receive notification
- * of changes to one or more instances of <code>IContextManager</code>.
- * <p>
- * This interface may be implemented by clients.
- * </p>
- * 
- * @since 3.1
- * @see ContextManager#addContextManagerListener(IContextManagerListener)
- * @see ContextManager#removeContextManagerListener(IContextManagerListener)
- */
-public interface IContextManagerListener {
-
-    /**
-     * Notifies that one or more properties of an instance of
-     * <code>IContextManager</code> have changed. Specific details are
-     * described in the <code>ContextManagerEvent</code>.
-     * 
-     * @param contextManagerEvent
-     *            the context manager event. Guaranteed not to be
-     *            <code>null</code>.
-     */
-    void contextManagerChanged(ContextManagerEvent contextManagerEvent);
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/package.html b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/package.html
deleted file mode 100644
index f5d4ceb..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/contexts/package.html
+++ /dev/null
@@ -1,129 +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>Package-level Javadoc</title>
-<link rel="stylesheet" href="http://dev.eclipse.org/default_style.css"
-	type="text/css">
-</head>
-<body style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0)">
-Application programming interfaces for contexts.
-<h2>Package Specification</h2>
-<p>
-This package provides API and implementation classes to define abstract
-representations of application state.  These representations of application
-state can be used as an abstraction of the event-listener model -- where
-different sections of code do not (or cannot) refer to each directly.
-</p>
-<p>
-This package is designed so that its elements can be public and dynamic.  That
-is, elements in this package can appear and disappear over the life of the
-application.
-</p>
-<h3>Context</h3>
-<p>
-A context is an answer to the question, "When?"  For example, there might be a
-context called "server running".  When the server is running, then that context
-would be active.  If a program module other than the server wants to test for
-this, they can simply check to see if the context is active.  This allows the
-two program modules to be decoupled from each other.  In fact, a different
-server module could be dropped in place of the first.
-</p>
-<p>
-Contexts are managed by an instance of <code>ContextManager</code>.  In fact, a
-context cannot be constructed directly.  Contexts are constructed using the
-method <code>ContextManager.getContext(String)</code>.  This ensures that there
-is only ever one context with a given identifier ever associated with a context
-manager.
-</p>
-<p>
-When a context is first constructed, it is undefined.  An undefined context is
-one that is carrying no information except for an id.  Attempts to interact
-with a context that is undefined will result in a 
-<code>NotDefinedException</code>.  Through this mechanism, it is possible for
-clients to hold references to contexts, and still have those contexts
-"disappear" (i.e., become undefined).  This is particularly useful in a system
-built around dynamic components (e.g., plug-ins).
-</p>
-<p>
-It is also possible to attach listeners to both contexts and context managers.
-A listener on a context manager will be notified if the list of defined
-contexts changes.
-</p>
-<h4>Examples</h4>
-<blockquote><pre><code>
-	ContextManager manager = new ContextManager();
-	Context context = manager.getContext("contextId");
-	context.define("name", "description", null);
-</code></pre></blockquote>
-<p>
-This example shows how to create a context from scratch -- with no existing
-manager.
-</p>
-<blockquote><pre><code>
-	context.undefine();
-	context = null;
-</code></pre></blockquote>
-<p>
-If you wish to get rid of the context, then you simply undefine it.  This
-will send notification to the appropriate listeners, and future attempts to
-access it will fail.  If you are the only one holding on to the context, then
-it will be garbage collected.  However, if other people still have a reference
-to the context, then the stub will remain until they respond to the change.
-</p>
-<blockquote><pre><code>
-	String name;
-	try {
-		name = context.getName();
-	} catch (NotDefinedException e) {
-		// Clean-up my reference to the context.
-		context = null;
-		return;
-	}
-</code></pre></blockquote>
-<p>
-This shows one way of dealing with contexts.  Instead of listening for
-changes to the contexts, you can simply listen for the exceptions to be thrown.
-When a <code>NotDefinedException</code> is thrown, you can clean up your own
-code.  How you clean up is application dependent.  In this case, the reference
-is cleared and we return from the method.
-</p>
-<blockquote><pre><code>
-	try {
-		String name = context.getName();
-		
-		// Do all your work in the block.
-		
-	} catch (NotDefinedException e) {
-		// Ignore, or possibly throw an error
-	}
-	
-	...
-	
-	public contextChanged(ContextEvent e) {
-		if (e.hasDefinedChanged()) {
-			context.removeListener(this);
-			context = null;
-		}
-	}
-</code></pre></blockquote>
-<p>
-Another way is to attach a listener, and then simply ignore the exceptions.
-When the context becomes undefined, you will be notified.  This gives your the
-opportunity to unhook your listener and release your reference.
-</p>
-<blockquote><pre><code>
-	ContextManager manager = new ContextManager();
-	Context parent = manager.getContext("parentId");
-	parent.define("name", "description", null);
-	Context child = manager.getContext("childId");
-	child.define("name", "description", "parentId");
-</code></pre></blockquote>
-<p>
-Contexts can be related to each other with a parent-child relationship.  How
-your application deals with this is up to you.  In the case of the keyboard
-shortcuts in Eclipse, this is used to allow behaviour attributed to child
-contexts to override behaviour attributed to parent contexts.
-</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/AbstractOperation.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/AbstractOperation.java
deleted file mode 100644
index 90ab371..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/AbstractOperation.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * <p>
- * Abstract implementation for an undoable operation. At a minimum, subclasses
- * should implement behavior for
- * {@link IUndoableOperation#execute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)},
- * {@link IUndoableOperation#redo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)},
- * and
- * {@link IUndoableOperation#undo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)}.
- * </p>
- * 
- * @see org.eclipse.core.commands.operations.IUndoableOperation
- * 
- * @since 3.1
- */
-public abstract class AbstractOperation implements IUndoableOperation {
-	List contexts = new ArrayList();
-
-	private String label = ""; //$NON-NLS-1$
-
-	/**
-	 * Construct an operation that has the specified label.
-	 * 
-	 * @param label
-	 *            the label to be used for the operation. Should never be
-	 *            <code>null</code>.
-	 */
-	public AbstractOperation(String label) {
-		Assert.isNotNull(label);
-		this.label = label;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#addContext(org.eclipse.core.commands.operations.IUndoContext)
-	 * 
-	 * <p> Subclasses may override this method. </p>
-	 */
-	public void addContext(IUndoContext context) {
-		if (!contexts.contains(context)) {
-			contexts.add(context);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#canExecute()
-	 *      <p> Default implementation. Subclasses may override this method.
-	 *      </p>
-	 * 
-	 */
-	public boolean canExecute() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#canRedo()
-	 *      <p> Default implementation. Subclasses may override this method.
-	 *      </p>
-	 */
-	public boolean canRedo() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#canUndo()
-	 *      <p> Default implementation. Subclasses may override this method.
-	 *      </p>
-	 */
-	public boolean canUndo() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#dispose()
-	 *      <p> Default implementation. Subclasses may override this method.
-	 *      </p>
-	 */
-	public void dispose() {
-		// nothing to dispose.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#execute(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public abstract IStatus execute(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException;
-
-	public final IUndoContext[] getContexts() {
-		return (IUndoContext[]) contexts.toArray(new IUndoContext[contexts
-				.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#getLabel()
-	 *      <p> Default implementation. Subclasses may override this method.
-	 *      </p>
-	 */
-	public String getLabel() {
-		return label;
-	}
-
-	/**
-	 * Set the label of the operation to the specified name.
-	 * 
-	 * @param name
-	 *            the string to be used for the label. Should never be
-	 *            <code>null</code>.
-	 */
-	public void setLabel(String name) {
-		label = name;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#hasContext(org.eclipse.core.commands.operations.IUndoContext)
-	 */
-	public final boolean hasContext(IUndoContext context) {
-		Assert.isNotNull(context);
-		for (int i = 0; i < contexts.size(); i++) {
-			IUndoContext otherContext = (IUndoContext) contexts.get(i);
-			// have to check both ways because one context may be more general
-			// in
-			// its matching rules than another.
-			if (context.matches(otherContext) || otherContext.matches(context)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#redo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public abstract IStatus redo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#removeContext(org.eclipse.core.commands.operations.IUndoContext)
-	 *      <p> Default implementation. Subclasses may override this method.
-	 *      </p>
-	 */
-
-	public void removeContext(IUndoContext context) {
-		contexts.remove(context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#undo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public abstract IStatus undo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException;
-
-	/**
-	 * The string representation of this operation. Used for debugging purposes
-	 * only. This string should not be shown to an end user.
-	 * 
-	 * @return The string representation.
-	 */
-	public String toString() {
-		final StringBuffer stringBuffer = new StringBuffer();
-		stringBuffer.append(getLabel());
-		stringBuffer.append("("); //$NON-NLS-1$
-		IUndoContext[] contexts = getContexts();
-		for (int i = 0; i < contexts.length; i++) {
-			stringBuffer.append(contexts[i].toString());
-			if (i != contexts.length - 1) {
-				stringBuffer.append(',');
-			}
-		}
-		stringBuffer.append(')');
-		return stringBuffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/DefaultOperationHistory.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/DefaultOperationHistory.java
deleted file mode 100644
index 79bac28..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/DefaultOperationHistory.java
+++ /dev/null
@@ -1,1394 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.util.Tracing;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-
-/**
- * <p>
- * A base implementation of IOperationHistory that implements a linear undo and
- * redo model . The most recently added operation is available for undo, and the
- * most recently undone operation is available for redo.
- * </p>
- * <p>
- * If the operation eligible for undo is not in a state where it can be undone,
- * then no undo is available. No other operations are considered. Likewise, if
- * the operation available for redo cannot be redone, then no redo is available.
- * </p>
- * <p>
- * Implementations for the direct undo and redo of a specified operation are
- * available. If a strict linear undo is to be enforced, than an
- * IOperationApprover should be installed that prevents undo and redo of any
- * operation that is not the most recently undone or redone operation in all of
- * its undo contexts.
- * </p>
- * <p>
- * The data structures used by the DefaultOperationHistory are synchronized, and
- * entry points that modify the undo and redo history concurrently are also
- * synchronized. This means that the DefaultOperationHistory is relatively
- * "thread-friendly" in its implementation. Outbound notifications or operation
- * approval requests will occur on the thread that initiated the request.
- * Clients may use DefaultOperationHistory API from any thread; however,
- * listeners or operation approvers that receive notifications from the
- * DefaultOperationHistory must be prepared to receive these notifications from
- * a background thread. Any UI access occurring inside these notifications must
- * be properly synchronized using the techniques specified by the client's
- * widget library.
- * </p>
- * 
- * <p>
- * This implementation is not intended to be subclassed.
- * </p>
- * 
- * @see org.eclipse.core.commands.operations.IOperationHistory
- * @see org.eclipse.core.commands.operations.IOperationApprover
- * 
- * @since 3.1
- */
-public final class DefaultOperationHistory implements IOperationHistory {
-	/**
-	 * This flag can be set to <code>true</code> if the history should print
-	 * information to <code>System.out</code> whenever notifications about
-	 * changes to the history occur. This flag should be used for debug purposes
-	 * only.
-	 */
-	public static boolean DEBUG_OPERATION_HISTORY_NOTIFICATION = false;
-
-	/**
-	 * This flag can be set to <code>true</code> if the history should print
-	 * information to <code>System.out</code> whenever an unexpected condition
-	 * arises. This flag should be used for debug purposes only.
-	 */
-	public static boolean DEBUG_OPERATION_HISTORY_UNEXPECTED = false;
-
-	/**
-	 * This flag can be set to <code>true</code> if the history should print
-	 * information to <code>System.out</code> whenever an undo context is
-	 * disposed. This flag should be used for debug purposes only.
-	 */
-	public static boolean DEBUG_OPERATION_HISTORY_DISPOSE = false;
-
-	/**
-	 * This flag can be set to <code>true</code> if the history should print
-	 * information to <code>System.out</code> during the open/close sequence.
-	 * This flag should be used for debug purposes only.
-	 */
-	public static boolean DEBUG_OPERATION_HISTORY_OPENOPERATION = false;
-
-	/**
-	 * This flag can be set to <code>true</code> if the history should print
-	 * information to <code>System.out</code> whenever an operation is not
-	 * approved. This flag should be used for debug purposes only.
-	 */
-	public static boolean DEBUG_OPERATION_HISTORY_APPROVAL = false;
-
-	static final int DEFAULT_LIMIT = 20;
-
-	/**
-	 * the list of {@link IOperationApprover}s
-	 */
-	ListenerList approvers = new ListenerList(ListenerList.IDENTITY);
-
-	/**
-	 * a map of undo limits per context
-	 */
-	private Map limits = Collections.synchronizedMap(new HashMap());
-
-	/**
-	 * the list of {@link IOperationHistoryListener}s
-	 */
-	ListenerList listeners = new ListenerList(ListenerList.IDENTITY);
-
-	/**
-	 * the list of operations available for redo, LIFO
-	 */
-	private List redoList = Collections.synchronizedList(new ArrayList());
-
-	/**
-	 * the list of operations available for undo, LIFO
-	 */
-	private List undoList = Collections.synchronizedList(new ArrayList());
-
-	/**
-	 * a lock that is used to synchronize access between the undo and redo
-	 * history
-	 */
-	final Object undoRedoHistoryLock = new Object();
-
-	/**
-	 * An operation that is "absorbing" all other operations while it is open.
-	 * When this is not null, other operations added or executed are added to
-	 * this composite.
-	 * 
-	 */
-	private ICompositeOperation openComposite = null;
-
-	/**
-	 * a lock that is used to synchronize access to the open composite.
-	 */
-	final Object openCompositeLock = new Object();
-
-	/**
-	 * Create an instance of DefaultOperationHistory.
-	 */
-	public DefaultOperationHistory() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#add(org.eclipse.core.commands.operations.IUndoableOperation)
-	 */
-	public void add(IUndoableOperation operation) {
-		Assert.isNotNull(operation);
-
-		/*
-		 * If we are in the middle of executing an open batching operation, and
-		 * this is not that operation, then we need only add the context of the
-		 * new operation to the batch. The operation itself is disposed since we
-		 * will never undo or redo it. We consider it to be triggered by the
-		 * batching operation and assume that its undo will be triggered by the
-		 * batching operation undo.
-		 */
-		synchronized (openCompositeLock) {
-			if (openComposite != null && openComposite != operation) {
-				openComposite.add(operation);
-				return;
-			}
-		}
-
-		if (checkUndoLimit(operation)) {
-			synchronized (undoRedoHistoryLock) {
-				undoList.add(operation);
-			}
-			notifyAdd(operation);
-
-			// flush redo stack for related contexts
-			IUndoContext[] contexts = operation.getContexts();
-			for (int i = 0; i < contexts.length; i++) {
-				flushRedo(contexts[i]);
-			}
-		} else {
-			// Dispose the operation since we will not have a reference to it.
-			operation.dispose();
-		}
-	}
-
-	/**
-	 * <p>
-	 * Add the specified approver to the list of operation approvers consulted
-	 * by the operation history before an undo or redo is allowed to proceed.
-	 * This method has no effect if the instance being added is already in the
-	 * list.
-	 * </p>
-	 * <p>
-	 * Operation approvers must be prepared to receive these the operation
-	 * approval messages from a background thread. Any UI access occurring
-	 * inside the implementation must be properly synchronized using the
-	 * techniques specified by the client's widget library.
-	 * </p>
-	 * 
-	 * @param approver
-	 *            the IOperationApprover to be added as an approver.
-	 * 
-	 */
-
-	public void addOperationApprover(IOperationApprover approver) {
-		approvers.add(approver);
-	}
-
-	/**
-	 * <p>
-	 * Add the specified listener to the list of operation history listeners
-	 * that are notified about changes in the history or operations that are
-	 * executed, undone, or redone. This method has no effect if the instance
-	 * being added is already in the list.
-	 * </p>
-	 * <p>
-	 * Operation history listeners must be prepared to receive notifications
-	 * from a background thread. Any UI access occurring inside the
-	 * implementation must be properly synchronized using the techniques
-	 * specified by the client's widget library.
-	 * </p>
-	 * 
-	 * @param listener
-	 *            the IOperationHistoryListener to be added as a listener.
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistoryListener
-	 * @see org.eclipse.core.commands.operations.OperationHistoryEvent
-	 */
-	public void addOperationHistoryListener(IOperationHistoryListener listener) {
-		listeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#canRedo(org.eclipse.core.commands.operations.IUndoContext)
-	 */
-	public boolean canRedo(IUndoContext context) {
-		// null context is allowed and passed through
-		IUndoableOperation operation = getRedoOperation(context);
-		return (operation != null && operation.canRedo());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#canUndo(org.eclipse.core.commands.operations.IUndoContext)
-	 */
-	public boolean canUndo(IUndoContext context) {
-		// null context is allowed and passed through
-		IUndoableOperation operation = getUndoOperation(context);
-		return (operation != null && operation.canUndo());
-	}
-
-	/**
-	 * Check the redo limit before adding an operation. In theory the redo limit
-	 * should never be reached, because the redo items are transferred from the
-	 * undo history, which has the same limit. The redo history is cleared
-	 * whenever a new operation is added. We check for completeness since
-	 * implementations may change over time.
-	 * 
-	 * Return a boolean indicating whether the redo should proceed.
-	 */
-	private boolean checkRedoLimit(IUndoableOperation operation) {
-		IUndoContext[] contexts = operation.getContexts();
-		for (int i = 0; i < contexts.length; i++) {
-			int limit = getLimit(contexts[i]);
-			if (limit > 0) {
-				forceRedoLimit(contexts[i], limit - 1);
-			} else {
-				// this context has a 0 limit
-				operation.removeContext(contexts[i]);
-			}
-		}
-		return operation.getContexts().length > 0;
-	}
-
-	/**
-	 * Check the undo limit before adding an operation. Return a boolean
-	 * indicating whether the undo should proceed.
-	 */
-	private boolean checkUndoLimit(IUndoableOperation operation) {
-		IUndoContext[] contexts = operation.getContexts();
-		for (int i = 0; i < contexts.length; i++) {
-			int limit = getLimit(contexts[i]);
-			if (limit > 0) {
-				forceUndoLimit(contexts[i], limit - 1);
-			} else {
-				// this context has a 0 limit
-				operation.removeContext(contexts[i]);
-			}
-		}
-		return operation.getContexts().length > 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#dispose(org.eclipse.core.commands.operations.IUndoContext,
-	 *      boolean, boolean, boolean)
-	 */
-	public void dispose(IUndoContext context, boolean flushUndo,
-			boolean flushRedo, boolean flushContext) {
-		// dispose of any limit that was set for the context if it is not to be
-		// used again.
-		if (flushContext) {
-			if (DEBUG_OPERATION_HISTORY_DISPOSE) {
-				Tracing.printTrace("OPERATIONHISTORY", "Flushing context " //$NON-NLS-1$//$NON-NLS-2$
-						+ context);
-			}
-			flushUndo(context);
-			flushRedo(context);
-			limits.remove(context);
-			return;
-		}
-		if (flushUndo) {
-			flushUndo(context);
-		}
-		if (flushRedo) {
-			flushRedo(context);
-		}
-
-	}
-
-	/**
-	 * Perform the redo. All validity checks have already occurred.
-	 * 
-	 * @param monitor
-	 * @param operation
-	 */
-	private IStatus doRedo(IProgressMonitor monitor, IAdaptable info,
-			IUndoableOperation operation) throws ExecutionException {
-
-		IStatus status = getRedoApproval(operation, info);
-		if (status.isOK()) {
-			notifyAboutToRedo(operation);
-			try {
-				status = operation.redo(monitor, info);
-			} catch (OperationCanceledException e) {
-				status = Status.CANCEL_STATUS;
-			} catch (ExecutionException e) {
-				notifyNotOK(operation);
-				if (DEBUG_OPERATION_HISTORY_UNEXPECTED) {
-					Tracing.printTrace("OPERATIONHISTORY", //$NON-NLS-1$
-							"ExecutionException while redoing " + operation); //$NON-NLS-1$
-				}
-				throw e;
-			} catch (Exception e) {
-				notifyNotOK(operation);
-				if (DEBUG_OPERATION_HISTORY_UNEXPECTED) {
-					Tracing.printTrace("OPERATIONHISTORY", //$NON-NLS-1$
-							"Exception while redoing " + operation); //$NON-NLS-1$
-				}
-				throw new ExecutionException(
-						"While redoing the operation, an exception occurred", e); //$NON-NLS-1$
-			}
-		}
-
-		// if successful, the operation is removed from the redo history and
-		// placed back in the undo history.
-		if (status.isOK()) {
-			boolean addedToUndo = true;
-			synchronized (undoRedoHistoryLock) {
-				redoList.remove(operation);
-				if (checkUndoLimit(operation)) {
-					undoList.add(operation);
-				} else {
-					addedToUndo = false;
-				}
-			}
-			// dispose the operation since we could not add it to the
-			// stack and will no longer have a reference to it.
-			if (!addedToUndo) {
-				operation.dispose();
-			}
-
-			// notify listeners must happen after history is updated
-			notifyRedone(operation);
-		} else {
-			notifyNotOK(operation, status);
-		}
-
-		return status;
-	}
-
-	/**
-	 * Perform the undo. All validity checks have already occurred.
-	 * 
-	 * @param monitor
-	 * @param operation
-	 */
-	private IStatus doUndo(IProgressMonitor monitor, IAdaptable info,
-			IUndoableOperation operation) throws ExecutionException {
-		IStatus status = getUndoApproval(operation, info);
-		if (status.isOK()) {
-			notifyAboutToUndo(operation);
-			try {
-				status = operation.undo(monitor, info);
-			} catch (OperationCanceledException e) {
-				status = Status.CANCEL_STATUS;
-			} catch (ExecutionException e) {
-				notifyNotOK(operation);
-				if (DEBUG_OPERATION_HISTORY_UNEXPECTED) {
-					Tracing.printTrace("OPERATIONHISTORY", //$NON-NLS-1$
-							"ExecutionException while undoing " + operation); //$NON-NLS-1$
-				}
-				throw e;
-			} catch (Exception e) {
-				notifyNotOK(operation);
-				if (DEBUG_OPERATION_HISTORY_UNEXPECTED) {
-					Tracing.printTrace("OPERATIONHISTORY", //$NON-NLS-1$
-							"Exception while undoing " + operation); //$NON-NLS-1$
-				}
-				throw new ExecutionException(
-						"While undoing the operation, an exception occurred", e); //$NON-NLS-1$
-			}
-		}
-		// if successful, the operation is removed from the undo history and
-		// placed in the redo history.
-		if (status.isOK()) {
-			boolean addedToRedo = true;
-			synchronized (undoRedoHistoryLock) {
-				undoList.remove(operation);
-				if (checkRedoLimit(operation)) {
-					redoList.add(operation);
-				} else {
-					addedToRedo = false;
-				}
-			}
-			// dispose the operation since we could not add it to the
-			// stack and will no longer have a reference to it.
-			if (!addedToRedo) {
-				operation.dispose();
-			}
-			// notification occurs after the undo and redo histories are
-			// adjusted
-			notifyUndone(operation);
-		} else {
-			notifyNotOK(operation, status);
-		}
-		return status;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#execute(org.eclipse.core.commands.operations.IUndoableOperation,
-	 *      org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus execute(IUndoableOperation operation,
-			IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		Assert.isNotNull(operation);
-
-		// error if operation is invalid
-		if (!operation.canExecute()) {
-			return IOperationHistory.OPERATION_INVALID_STATUS;
-		}
-
-		// check with the operation approvers
-		IStatus status = getExecuteApproval(operation, info);
-		if (!status.isOK()) {
-			// not approved. No notifications are sent, just return the status.
-			return status;
-		}
-
-		/*
-		 * If we are in the middle of an open composite, then we will add this
-		 * operation to the open operation rather than add the operation to the
-		 * history. We will still execute it.
-		 */
-		boolean merging = false;
-		synchronized (openCompositeLock) {
-			if (openComposite != null) {
-				// the composite shouldn't be executed explicitly while it is
-				// still
-				// open
-				if (openComposite == operation) {
-					return IOperationHistory.OPERATION_INVALID_STATUS;
-				}
-				openComposite.add(operation);
-				merging = true;
-			}
-		}
-
-		/*
-		 * Execute the operation
-		 */
-		if (!merging) {
-			notifyAboutToExecute(operation);
-		}
-		try {
-			status = operation.execute(monitor, info);
-		} catch (OperationCanceledException e) {
-			status = Status.CANCEL_STATUS;
-		} catch (ExecutionException e) {
-			notifyNotOK(operation);
-			throw e;
-		} catch (Exception e) {
-			notifyNotOK(operation);
-			throw new ExecutionException(
-					"While executing the operation, an exception occurred", e); //$NON-NLS-1$
-		}
-
-		// if successful, the notify listeners are notified and the operation is
-		// added to the history
-		if (!merging) {
-			if (status.isOK()) {
-				notifyDone(operation);
-				add(operation);
-			} else {
-				notifyNotOK(operation, status);
-				// dispose the operation since we did not add it to the stack
-				// and will no longer have a reference to it.
-				operation.dispose();
-			}
-		}
-		// all other severities are not interpreted. Simply return the status.
-		return status;
-	}
-
-	/*
-	 * Filter the specified list to include only the specified undo context.
-	 */
-	private IUndoableOperation[] filter(List list, IUndoContext context) {
-		/*
-		 * This method is used whenever there is a need to filter the undo or
-		 * redo history on a particular context. Currently there are no caches
-		 * kept to optimize repeated requests for the same filter. If benchmarks
-		 * show this to be a common pattern that causes performances problems,
-		 * we could implement a filtered cache here that is nullified whenever
-		 * the global history changes.
-		 */
-
-		List filtered = new ArrayList();
-		Iterator iterator = list.iterator();
-		synchronized (undoRedoHistoryLock) {
-			while (iterator.hasNext()) {
-				IUndoableOperation operation = (IUndoableOperation) iterator
-						.next();
-				if (operation.hasContext(context)) {
-					filtered.add(operation);
-				}
-			}
-		}
-		return (IUndoableOperation[]) filtered
-				.toArray(new IUndoableOperation[filtered.size()]);
-	}
-
-	/*
-	 * Flush the redo stack of all operations that have the given context.
-	 */
-	private void flushRedo(IUndoContext context) {
-		if (DEBUG_OPERATION_HISTORY_DISPOSE) {
-			Tracing.printTrace("OPERATIONHISTORY", "Flushing redo history for " //$NON-NLS-1$ //$NON-NLS-2$
-					+ context);
-		}
-
-		synchronized (undoRedoHistoryLock) {
-			
-			Object[] filtered = filter(redoList, context);
-			for (int i = 0; i < filtered.length; i++) {
-				IUndoableOperation operation = (IUndoableOperation) filtered[i];
-				if (context == GLOBAL_UNDO_CONTEXT
-						|| operation.getContexts().length == 1) {
-					// remove the operation if it only has the context or we are
-					// flushing all
-					redoList.remove(operation);
-					internalRemove(operation);
-				} else {
-					// remove the reference to the context.
-					// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=161786
-					// It is not enough to simply remove the context. There could
-					// be one or more contexts that match the one we are trying to
-					// dispose.
-					IUndoContext[] contexts = operation.getContexts();
-					for (int j = 0; j < contexts.length; j++) {
-						if (contexts[j].matches(context)) {
-							operation.removeContext(contexts[j]);
-						}
-					}
-					if (operation.getContexts().length == 0) {
-						redoList.remove(operation);
-						internalRemove(operation);
-					}
-				}
-			}
-		}
-	}
-
-	/*
-	 * Flush the undo stack of all operations that have the given context.
-	 */
-	private void flushUndo(IUndoContext context) {
-		if (DEBUG_OPERATION_HISTORY_DISPOSE) {
-			Tracing.printTrace("OPERATIONHISTORY", "Flushing undo history for " //$NON-NLS-1$ //$NON-NLS-2$
-					+ context);
-		}
-
-		synchronized (undoRedoHistoryLock) {
-			
-			// Get all operations that have the context (or one that matches)
-			Object[] filtered = filter(undoList, context);
-			for (int i = 0; i < filtered.length; i++) {
-				IUndoableOperation operation = (IUndoableOperation) filtered[i];
-				if (context == GLOBAL_UNDO_CONTEXT
-						|| operation.getContexts().length == 1) {
-					// remove the operation if it only has the context or we are
-					// flushing all
-					undoList.remove(operation);
-					internalRemove(operation);
-				} else {
-					// remove the reference to the context.
-					// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=161786
-					// It is not enough to simply remove the context. There could
-					// be one or more contexts that match the one we are trying to
-					// dispose.
-					IUndoContext[] contexts = operation.getContexts();
-					for (int j = 0; j < contexts.length; j++) {
-						if (contexts[j].matches(context)) {
-							operation.removeContext(contexts[j]);
-						}
-					}
-					if (operation.getContexts().length == 0) {
-						undoList.remove(operation);
-						internalRemove(operation);
-					}
-				}
-			}
-		}
-		/*
-		 * There may be an open composite. If it has this context, then the
-		 * context must be removed. If it has only this context or we are
-		 * flushing all operations, then null it out and notify that we are
-		 * ending it. We don't remove it since it was never added.
-		 */
-		ICompositeOperation endedComposite = null;
-		synchronized (openCompositeLock) {
-			if (openComposite != null) {
-				if (openComposite.hasContext(context)) {
-					if (context == GLOBAL_UNDO_CONTEXT
-							|| openComposite.getContexts().length == 1) {
-						endedComposite = openComposite;
-						openComposite = null;
-					} else {
-						openComposite.removeContext(context);
-					}
-				}
-			}
-		}
-		// notify outside of the synchronized block.
-		if (endedComposite != null) {
-			notifyNotOK(endedComposite);
-		}
-	}
-
-	/*
-	 * Force the redo history for the given context to contain max or less
-	 * items.
-	 */
-	private void forceRedoLimit(IUndoContext context, int max) {
-		synchronized (undoRedoHistoryLock) {
-			Object[] filtered = filter(redoList, context);
-			int size = filtered.length;
-			if (size > 0) {
-				int index = 0;
-				while (size > max) {
-					IUndoableOperation removed = (IUndoableOperation) filtered[index];
-					if (context == GLOBAL_UNDO_CONTEXT
-							|| removed.getContexts().length == 1) {
-						/*
-						 * remove the operation if we are enforcing a global limit
-						 * or if the operation only has the specified context
-						 */
-						redoList.remove(removed);
-						internalRemove(removed);
-					} else {
-						/*
-						 * if the operation has multiple contexts and we've reached
-						 * the limit for only one of them, then just remove the
-						 * context, not the operation.
-						 */
-						removed.removeContext(context);
-					}
-					size--;
-					index++;
-				}
-			}
-		}
-	}
-
-	/*
-	 * Force the undo history for the given context to contain max or less
-	 * items.
-	 */
-	private void forceUndoLimit(IUndoContext context, int max) {
-		synchronized (undoRedoHistoryLock) {
-			Object[] filtered = filter(undoList, context);
-			int size = filtered.length;
-			if (size > 0) {
-				int index = 0;
-				while (size > max) {
-					IUndoableOperation removed = (IUndoableOperation) filtered[index];
-					if (context == GLOBAL_UNDO_CONTEXT
-							|| removed.getContexts().length == 1) {
-						/*
-						 * remove the operation if we are enforcing a global limit
-						 * or if the operation only has the specified context
-						 */
-						undoList.remove(removed);
-						internalRemove(removed);
-					} else {
-						/*
-						 * if the operation has multiple contexts and we've reached
-						 * the limit for only one of them, then just remove the
-						 * context, not the operation.
-						 */
-						removed.removeContext(context);
-					}
-					size--;
-					index++;
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#getLimit()
-	 */
-	public int getLimit(IUndoContext context) {
-		if (!limits.containsKey(context)) {
-			return DEFAULT_LIMIT;
-		}
-		return ((Integer) (limits.get(context))).intValue();
-	}
-
-	/*
-	 * Consult the IOperationApprovers to see if the proposed redo should be
-	 * allowed.
-	 */
-	private IStatus getRedoApproval(IUndoableOperation operation,
-			IAdaptable info) {
-
-		final Object[] approverArray = approvers.getListeners();
-
-		for (int i = 0; i < approverArray.length; i++) {
-			IOperationApprover approver = (IOperationApprover) approverArray[i];
-			IStatus approval = approver.proceedRedoing(operation, this, info);
-			if (!approval.isOK()) {
-				if (DEBUG_OPERATION_HISTORY_APPROVAL) {
-					Tracing.printTrace("OPERATIONHISTORY", //$NON-NLS-1$
-							"Redo not approved by " + approver //$NON-NLS-1$
-									+ "for operation " + operation //$NON-NLS-1$
-									+ " approved by " + approval); //$NON-NLS-1$
-				}
-				return approval;
-			}
-		}
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#getRedoHistory(org.eclipse.core.commands.operations.IUndoContext)
-	 */
-	public IUndoableOperation[] getRedoHistory(IUndoContext context) {
-		Assert.isNotNull(context);
-		return filter(redoList, context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#getOperation(org.eclipse.core.commands.operations.IUndoContext)
-	 */
-	public IUndoableOperation getRedoOperation(IUndoContext context) {
-		Assert.isNotNull(context);
-		synchronized (undoRedoHistoryLock) {
-			for (int i = redoList.size() - 1; i >= 0; i--) {
-				IUndoableOperation operation = (IUndoableOperation) redoList
-						.get(i);
-				if (operation.hasContext(context)) {
-					return operation;
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * Consult the IOperationApprovers to see if the proposed undo should be
-	 * allowed.
-	 */
-	private IStatus getUndoApproval(IUndoableOperation operation,
-			IAdaptable info) {
-
-		final Object[] approverArray = approvers.getListeners();
-
-		for (int i = 0; i < approverArray.length; i++) {
-			IOperationApprover approver = (IOperationApprover) approverArray[i];
-			IStatus approval = approver.proceedUndoing(operation, this, info);
-			if (!approval.isOK()) {
-				if (DEBUG_OPERATION_HISTORY_APPROVAL) {
-					Tracing.printTrace("OPERATIONHISTORY", //$NON-NLS-1$
-							"Undo not approved by " + approver //$NON-NLS-1$
-									+ "for operation " + operation //$NON-NLS-1$
-									+ " with status " + approval); //$NON-NLS-1$
-				}
-				return approval;
-			}
-		}
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#getUndoHistory(org.eclipse.core.commands.operations.IUndoContext)
-	 */
-	public IUndoableOperation[] getUndoHistory(IUndoContext context) {
-		Assert.isNotNull(context);
-		return filter(undoList, context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#getUndoOperation(org.eclipse.core.commands.operations.IUndoContext)
-	 */
-	public IUndoableOperation getUndoOperation(IUndoContext context) {
-		Assert.isNotNull(context);
-		synchronized (undoRedoHistoryLock) {
-			for (int i = undoList.size() - 1; i >= 0; i--) {
-				IUndoableOperation operation = (IUndoableOperation) undoList
-						.get(i);
-				if (operation.hasContext(context)) {
-					return operation;
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * Consult the IOperationApprovers to see if the proposed execution should
-	 * be allowed.
-	 * 
-	 * @since 3.2
-	 */
-	private IStatus getExecuteApproval(IUndoableOperation operation,
-			IAdaptable info) {
-
-		final Object[] approverArray = approvers.getListeners();
-
-		for (int i = 0; i < approverArray.length; i++) {
-			if (approverArray[i] instanceof IOperationApprover2) {
-				IOperationApprover2 approver = (IOperationApprover2) approverArray[i];
-				IStatus approval = approver.proceedExecuting(operation, this,
-						info);
-				if (!approval.isOK()) {
-					if (DEBUG_OPERATION_HISTORY_APPROVAL) {
-						Tracing.printTrace("OPERATIONHISTORY", //$NON-NLS-1$
-								"Execute not approved by " + approver //$NON-NLS-1$
-										+ "for operation " + operation //$NON-NLS-1$
-										+ " with status " + approval); //$NON-NLS-1$
-					}
-					return approval;
-				}
-			}
-		}
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * Remove the operation by disposing it and notifying listeners.
-	 */
-	private void internalRemove(IUndoableOperation operation) {
-		operation.dispose();
-		notifyRemoved(operation);
-	}
-
-	/*
-	 * Notify listeners of an operation event.
-	 */
-	private void notifyListeners(final OperationHistoryEvent event) {
-		if (event.getOperation() instanceof IAdvancedUndoableOperation) {
-			final IAdvancedUndoableOperation advancedOp = (IAdvancedUndoableOperation) event
-					.getOperation();
-			SafeRunner.run(new ISafeRunnable() {
-				public void handleException(Throwable exception) {
-					if (DEBUG_OPERATION_HISTORY_UNEXPECTED) {
-						Tracing
-								.printTrace(
-										"OPERATIONHISTORY", //$NON-NLS-1$
-										"Exception during notification callback " + exception); //$NON-NLS-1$
-					}
-				}
-
-				public void run() throws Exception {
-					advancedOp.aboutToNotify(event);
-				}
-			});
-		}
-		final Object[] listenerArray = listeners.getListeners();
-		for (int i = 0; i < listenerArray.length; i++) {
-			final IOperationHistoryListener listener = (IOperationHistoryListener) listenerArray[i];
-			SafeRunner.run(new ISafeRunnable() {
-				public void handleException(Throwable exception) {
-					if (DEBUG_OPERATION_HISTORY_UNEXPECTED) {
-						Tracing
-								.printTrace(
-										"OPERATIONHISTORY", //$NON-NLS-1$
-										"Exception during notification callback " + exception); //$NON-NLS-1$
-					}
-				}
-
-				public void run() throws Exception {
-					listener.historyNotification(event);
-				}
-			});
-		}
-	}
-
-	private void notifyAboutToExecute(IUndoableOperation operation) {
-		if (DEBUG_OPERATION_HISTORY_NOTIFICATION) {
-			Tracing.printTrace("OPERATIONHISTORY", "ABOUT_TO_EXECUTE " //$NON-NLS-1$ //$NON-NLS-2$
-					+ operation);
-		}
-
-		notifyListeners(new OperationHistoryEvent(
-				OperationHistoryEvent.ABOUT_TO_EXECUTE, this, operation));
-	}
-
-	/*
-	 * Notify listeners that an operation is about to redo.
-	 */
-	private void notifyAboutToRedo(IUndoableOperation operation) {
-		if (DEBUG_OPERATION_HISTORY_NOTIFICATION) {
-			Tracing.printTrace("OPERATIONHISTORY", "ABOUT_TO_REDO " //$NON-NLS-1$ //$NON-NLS-2$
-					+ operation);
-		}
-
-		notifyListeners(new OperationHistoryEvent(
-				OperationHistoryEvent.ABOUT_TO_REDO, this, operation));
-	}
-
-	/*
-	 * Notify listeners that an operation is about to undo.
-	 */
-	private void notifyAboutToUndo(IUndoableOperation operation) {
-		if (DEBUG_OPERATION_HISTORY_NOTIFICATION) {
-			Tracing.printTrace("OPERATIONHISTORY", "ABOUT_TO_UNDO " //$NON-NLS-1$ //$NON-NLS-2$
-					+ operation);
-		}
-
-		notifyListeners(new OperationHistoryEvent(
-				OperationHistoryEvent.ABOUT_TO_UNDO, this, operation));
-	}
-
-	/*
-	 * Notify listeners that an operation has been added.
-	 */
-	private void notifyAdd(IUndoableOperation operation) {
-		if (DEBUG_OPERATION_HISTORY_NOTIFICATION) {
-			Tracing.printTrace("OPERATIONHISTORY", "OPERATION_ADDED " //$NON-NLS-1$ //$NON-NLS-2$
-					+ operation);
-		}
-
-		notifyListeners(new OperationHistoryEvent(
-				OperationHistoryEvent.OPERATION_ADDED, this, operation));
-	}
-
-	/*
-	 * Notify listeners that an operation is done executing.
-	 */
-	private void notifyDone(IUndoableOperation operation) {
-		if (DEBUG_OPERATION_HISTORY_NOTIFICATION) {
-			Tracing.printTrace("OPERATIONHISTORY", "DONE " + operation); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		notifyListeners(new OperationHistoryEvent(OperationHistoryEvent.DONE,
-				this, operation));
-	}
-
-	/*
-	 * Notify listeners that an operation did not succeed after an attempt to
-	 * execute, undo, or redo was made.
-	 */
-	private void notifyNotOK(IUndoableOperation operation) {
-		notifyNotOK(operation, null);
-	}
-
-	/*
-	 * Notify listeners that an operation did not succeed after an attempt to
-	 * execute, undo, or redo was made. Include the status associated with the
-	 * attempt.
-	 * 
-	 * @since 3.2
-	 */
-	private void notifyNotOK(IUndoableOperation operation, IStatus status) {
-		if (DEBUG_OPERATION_HISTORY_NOTIFICATION) {
-			Tracing.printTrace("OPERATIONHISTORY", "OPERATION_NOT_OK " //$NON-NLS-1$ //$NON-NLS-2$
-					+ operation);
-		}
-
-		notifyListeners(new OperationHistoryEvent(
-				OperationHistoryEvent.OPERATION_NOT_OK, this, operation, status));
-	}
-
-	/*
-	 * Notify listeners that an operation was redone.
-	 */
-	private void notifyRedone(IUndoableOperation operation) {
-		if (DEBUG_OPERATION_HISTORY_NOTIFICATION) {
-			Tracing.printTrace("OPERATIONHISTORY", "REDONE " + operation); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		notifyListeners(new OperationHistoryEvent(OperationHistoryEvent.REDONE,
-				this, operation));
-	}
-
-	/*
-	 * Notify listeners that an operation has been removed from the history.
-	 */
-	private void notifyRemoved(IUndoableOperation operation) {
-		if (DEBUG_OPERATION_HISTORY_NOTIFICATION) {
-			Tracing.printTrace("OPERATIONHISTORY", "OPERATION_REMOVED " //$NON-NLS-1$ //$NON-NLS-2$
-					+ operation);
-		}
-
-		notifyListeners(new OperationHistoryEvent(
-				OperationHistoryEvent.OPERATION_REMOVED, this, operation));
-	}
-
-	/*
-	 * Notify listeners that an operation has been undone.
-	 */
-	private void notifyUndone(IUndoableOperation operation) {
-		if (DEBUG_OPERATION_HISTORY_NOTIFICATION) {
-			Tracing.printTrace("OPERATIONHISTORY", "UNDONE " + operation); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		notifyListeners(new OperationHistoryEvent(OperationHistoryEvent.UNDONE,
-				this, operation));
-	}
-
-	/*
-	 * Notify listeners that an operation has been undone.
-	 */
-	private void notifyChanged(IUndoableOperation operation) {
-		if (DEBUG_OPERATION_HISTORY_NOTIFICATION) {
-			Tracing.printTrace("OPERATIONHISTORY", "OPERATION_CHANGED " //$NON-NLS-1$//$NON-NLS-2$
-					+ operation);
-		}
-
-		notifyListeners(new OperationHistoryEvent(
-				OperationHistoryEvent.OPERATION_CHANGED, this, operation));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#redo(org.eclipse.core.commands.operations.IUndoContext,
-	 *      org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus redo(IUndoContext context, IProgressMonitor monitor,
-			IAdaptable info) throws ExecutionException {
-		Assert.isNotNull(context);
-		IUndoableOperation operation = getRedoOperation(context);
-
-		// info if there is no operation
-		if (operation == null) {
-			return IOperationHistory.NOTHING_TO_REDO_STATUS;
-		}
-
-		// error if operation is invalid
-		if (!operation.canRedo()) {
-			if (DEBUG_OPERATION_HISTORY_UNEXPECTED) {
-				Tracing.printTrace("OPERATIONHISTORY", //$NON-NLS-1$
-						"Redo operation not valid - " + operation); //$NON-NLS-1$
-			}
-
-			return IOperationHistory.OPERATION_INVALID_STATUS;
-		}
-
-		return doRedo(monitor, info, operation);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#redoOperation(org.eclipse.core.commands.operations.IUndoableOperation,
-	 *      org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-
-	public IStatus redoOperation(IUndoableOperation operation,
-			IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		Assert.isNotNull(operation);
-		IStatus status;
-		if (operation.canRedo()) {
-			status = doRedo(monitor, info, operation);
-		} else {
-			if (DEBUG_OPERATION_HISTORY_UNEXPECTED) {
-				Tracing.printTrace("OPERATIONHISTORY", //$NON-NLS-1$
-						"Redo operation not valid - " + operation); //$NON-NLS-1$
-			}
-			status = IOperationHistory.OPERATION_INVALID_STATUS;
-		}
-		return status;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#removeOperationApprover(org.eclipse.core.commands.operations.IOperationApprover)
-	 */
-	public void removeOperationApprover(IOperationApprover approver) {
-		approvers.remove(approver);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#removeOperationHistoryListener(org.eclipse.core.commands.operations.IOperationHistoryListener)
-	 */
-	public void removeOperationHistoryListener(
-			IOperationHistoryListener listener) {
-		listeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#replaceOperation(org.eclipse.core.commands.operations.IUndoableOperation,
-	 *      org.eclipse.core.commands.operations.IUndoableOperation [])
-	 */
-	public void replaceOperation(IUndoableOperation operation,
-			IUndoableOperation[] replacements) {
-		// check the undo history first.
-		boolean inUndo = false;
-		synchronized (undoRedoHistoryLock) {
-			int index = undoList.indexOf(operation);
-			if (index > -1) {
-				inUndo = true;
-				undoList.remove(operation);
-				// notify listeners after the lock on undoList is released
-				ArrayList allContexts = new ArrayList(replacements.length);
-				for (int i = 0; i < replacements.length; i++) {
-					IUndoContext[] opContexts = replacements[i].getContexts();
-					for (int j = 0; j < opContexts.length; j++) {
-						allContexts.add(opContexts[j]);
-					}
-					undoList.add(index, replacements[i]);
-					// notify listeners after the lock on the history is
-					// released
-				}
-				// recheck all the limits. We do this at the end so the index
-				// doesn't change during replacement
-				for (int i = 0; i < allContexts.size(); i++) {
-					IUndoContext context = (IUndoContext) allContexts.get(i);
-					forceUndoLimit(context, getLimit(context));
-				}
-			}
-		}
-		if (inUndo) {
-			// notify listeners of operations added and removed
-			internalRemove(operation);
-			for (int i = 0; i < replacements.length; i++) {
-				notifyAdd(replacements[i]);
-			}
-			return;
-		}
-
-		// operation was not in the undo history. Check the redo history.
-
-		synchronized (undoRedoHistoryLock) {
-			int index = redoList.indexOf(operation);
-			if (index == -1) {
-				return;
-			}
-			ArrayList allContexts = new ArrayList(replacements.length);
-			redoList.remove(operation);
-			// notify listeners after we release the lock on redoList
-			for (int i = 0; i < replacements.length; i++) {
-				IUndoContext[] opContexts = replacements[i].getContexts();
-				for (int j = 0; j < opContexts.length; j++) {
-					allContexts.add(opContexts[j]);
-				}
-				redoList.add(index, replacements[i]);
-				// notify listeners after we release the lock on redoList
-			}
-			// recheck all the limits. We do this at the end so the index
-			// doesn't change during replacement
-			for (int i = 0; i < allContexts.size(); i++) {
-				IUndoContext context = (IUndoContext) allContexts.get(i);
-				forceRedoLimit(context, getLimit(context));
-			}
-		}
-		// send listener notifications after we release the lock on the history
-		internalRemove(operation);
-		for (int i = 0; i < replacements.length; i++) {
-			notifyAdd(replacements[i]);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#setLimit(org.eclipse.core.commands.operations.IUndoContext,
-	 *      int)
-	 */
-	public void setLimit(IUndoContext context, int limit) {
-		Assert.isTrue(limit >= 0);
-		/*
-		 * The limit checking methods interpret a null context as a global limit
-		 * to be enforced. We do not wish to support a global limit in this
-		 * implementation, so we throw an exception for a null context. The rest
-		 * of the implementation can handle a null context, so subclasses can
-		 * override this if a global limit is desired.
-		 */
-		Assert.isNotNull(context);
-		limits.put(context, new Integer(limit));
-		synchronized (undoRedoHistoryLock) {
-			forceUndoLimit(context, limit);
-			forceRedoLimit(context, limit);
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#undo(org.eclipse.core.commands.operations.IUndoContext,
-	 *      org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus undo(IUndoContext context, IProgressMonitor monitor,
-			IAdaptable info) throws ExecutionException {
-		Assert.isNotNull(context);
-		IUndoableOperation operation = getUndoOperation(context);
-
-		// info if there is no operation
-		if (operation == null) {
-			return IOperationHistory.NOTHING_TO_UNDO_STATUS;
-		}
-
-		// error if operation is invalid
-		if (!operation.canUndo()) {
-			if (DEBUG_OPERATION_HISTORY_UNEXPECTED) {
-				Tracing.printTrace("OPERATIONHISTORY", //$NON-NLS-1$
-						"Undo operation not valid - " + operation); //$NON-NLS-1$
-			}
-			return IOperationHistory.OPERATION_INVALID_STATUS;
-		}
-
-		return doUndo(monitor, info, operation);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#undoOperation(org.eclipse.core.commands.operations.IUndoableOperation,
-	 *      org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus undoOperation(IUndoableOperation operation,
-			IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		Assert.isNotNull(operation);
-		IStatus status;
-		if (operation.canUndo()) {
-			status = doUndo(monitor, info, operation);
-		} else {
-			if (DEBUG_OPERATION_HISTORY_UNEXPECTED) {
-				Tracing.printTrace("OPERATIONHISTORY", //$NON-NLS-1$
-						"Undo operation not valid - " + operation); //$NON-NLS-1$
-			}
-			status = IOperationHistory.OPERATION_INVALID_STATUS;
-		}
-		return status;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#openOperation(org.eclipse.core.commands.operations.ICompositeOperation)
-	 */
-	public void openOperation(ICompositeOperation operation, int mode) {
-		synchronized (openCompositeLock) {
-			if (openComposite != null && openComposite != operation) {
-				// unexpected nesting of operations.
-				if (DEBUG_OPERATION_HISTORY_UNEXPECTED) {
-					Tracing.printTrace("OPERATIONHISTORY", //$NON-NLS-1$
-							"Open operation called while another operation is open.  old: " //$NON-NLS-1$
-									+ openComposite + "; new:  " + operation); //$NON-NLS-1$
-				}
-
-				throw new IllegalStateException(
-						"Cannot open an operation while one is already open"); //$NON-NLS-1$
-			}
-			openComposite = operation;
-		}
-		if (DEBUG_OPERATION_HISTORY_OPENOPERATION) {
-			Tracing.printTrace("OPERATIONHISTORY", "Opening operation " //$NON-NLS-1$ //$NON-NLS-2$
-					+ openComposite);
-		}
-
-		if (mode == EXECUTE) {
-			notifyAboutToExecute(openComposite);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#closeOperation(boolean,
-	 *      boolean)
-	 */
-	public void closeOperation(boolean operationOK, boolean addToHistory,
-			int mode) {
-		ICompositeOperation endedComposite = null;
-
-		synchronized (openCompositeLock) {
-			if (DEBUG_OPERATION_HISTORY_UNEXPECTED) {
-				if (openComposite == null) {
-					Tracing.printTrace("OPERATIONHISTORY", //$NON-NLS-1$
-							"Attempted to close operation when none was open"); //$NON-NLS-1$
-					return;
-				}
-			}
-			// notifications will occur outside the synchonized block
-			if (openComposite != null) {
-				if (DEBUG_OPERATION_HISTORY_OPENOPERATION) {
-					Tracing.printTrace("OPERATIONHISTORY", "Closing operation " //$NON-NLS-1$ //$NON-NLS-2$
-							+ openComposite);
-				}
-				endedComposite = openComposite;
-				openComposite = null;
-			}
-		}
-		// any mode other than EXECUTE was triggered by a request to undo or
-		// redo something already in the history, so undo and redo
-		// notification will occur at the end of that sequence.
-		if (endedComposite != null) {
-			if (operationOK) {
-				if (mode == EXECUTE) {
-					notifyDone(endedComposite);
-				}
-				if (addToHistory) {
-					add(endedComposite);
-				}
-			} else {
-				if (mode == EXECUTE) {
-					notifyNotOK(endedComposite);
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistory#operationChanged(org.eclipse.core.commands.operations.IUndoableOperation)
-	 */
-	public void operationChanged(IUndoableOperation operation) {
-		if (undoList.contains(operation) || redoList.contains(operation)) {
-			notifyChanged(operation);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IAdvancedUndoableOperation.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IAdvancedUndoableOperation.java
deleted file mode 100644
index ce6c80b..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IAdvancedUndoableOperation.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * <p>
- * IAdvancedUndoableOperation defines an interface for undoable operations that
- * modify one or more elements in a model and attempt to keep model listeners up
- * to date with changes that occur in the undo and redo history involving particular
- * model elements.  It also defines methods for computing the validity of an operation
- * for undo or redo before attempting to perform the undo or redo.
- * </p>
- * <p>
- * This interface is intended to be used by legacy frameworks that are adapting
- * their original undo and redo support to this framework. The methods in this
- * interface allow legacy clients to maintain features not supported in the
- * basic operations framework.
- * </p>
- * 
- * @since 3.1
- * 
- */
-public interface IAdvancedUndoableOperation {
-
-	/**
-	 * <p>
-	 * An operation history notification about this operation is about to be
-	 * sent to operation history listeners. Any preparation needed before
-	 * listeners are notified about this operation should be performed here.
-	 * 
-	 * <p>
-	 * This method has been added to support legacy undo frameworks that are
-	 * adapting to IUndoableOperation. Operations that previously relied on
-	 * notification from their containing history or stack before any listeners
-	 * are notified about changes to the operation should implement this
-	 * interface.
-	 * 
-	 * @param event 
-	 *            the event that is about to be sent with the pending
-	 *            notification
-	 * 
-	 */
-	void aboutToNotify(OperationHistoryEvent event);
-
-	/**
-	 * <p>
-	 * Return an array of objects that are affected by executing, undoing, or
-	 * redoing this operation. If it cannot be determined which objects are
-	 * affected, return null.
-	 * </p>
-	 * 
-	 * @return the array of Objects modified by this operation, or
-	 *         <code>null</code> if the affected objects cannot be determined.
-	 */
-	Object[] getAffectedObjects();
-
-	/**
-	 * Return a status indicating the projected outcome of undoing the receiver.
-	 * 
-	 * This method should be used to report the possible outcome of an undo and
-	 * is used when computing the validity of an undo is too expensive to
-	 * perform in {@link IUndoableOperation#canUndo()}. It is not called by the
-	 * operation history, but instead is used by clients (such as implementers
-	 * of {@link IOperationApprover}) who wish to perform advanced validation of
-	 * an operation before attempting to undo it.
-	 * 
-	 * If the result of this method is the discovery that an operation can in
-	 * fact not be undone, then the operation is expected to correctly answer
-	 * <code>false</code> on subsequent calls to
-	 * {@link IUndoableOperation#canUndo()}.
-	 * 
-	 * @param monitor 
-	 *            the progress monitor (or <code>null</code>) to use for
-	 *            reporting progress to the user while computing the validity.
-	 * 
-	 * @return the IStatus indicating the validity of the undo. The status
-	 *         severity should be set to <code>OK</code> if the undo can
-	 *         successfully be performed, and <code>ERROR</code> if it
-	 *         cannnot. Any other status is assumed to represent an ambiguous
-	 *         state.
-	 * @throws ExecutionException
-	 *             if an exception occurs while computing the validity.
-	 */
-	IStatus computeUndoableStatus(IProgressMonitor monitor)
-			throws ExecutionException;
-
-	/**
-	 * Return a status indicating the projected outcome of redoing the receiver.
-	 * 
-	 * This method should be used to report the possible outcome of a redo and
-	 * is used when computing the validity of a redo is too expensive to perform
-	 * in {@link IUndoableOperation#canRedo()}. It is not called by the
-	 * operation history, but instead is used by clients (such as implementers
-	 * of {@link IOperationApprover}) who wish to perform advanced validation of
-	 * an operation before attempting to redo it.
-	 * 
-	 * If the result of this method is the discovery that an operation can in
-	 * fact not be redone, then the operation is expected to correctly answer
-	 * <code>false</code> on subsequent calls to
-	 * {@link IUndoableOperation#canRedo()}.
-	 * 
-	 * @param monitor 
-	 *            the progress monitor (or <code>null</code>) to use for
-	 *            reporting progress to the user while computing the validity.
-	 * 
-	 * @return the IStatus indicating the validity of the redo. The status
-	 *         severity should be set to <code>OK</code> if the redo can
-	 *         successfully be performed, and <code>ERROR</code> if it
-	 *         cannnot. Any other status is assumed to represent an ambiguous
-	 *         state.
-	 * @throws ExecutionException
-	 *             if an exception occurs while computing the validity.
-	 */
-	IStatus computeRedoableStatus(IProgressMonitor monitor)
-			throws ExecutionException;
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IAdvancedUndoableOperation2.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IAdvancedUndoableOperation2.java
deleted file mode 100644
index 1cb4280..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IAdvancedUndoableOperation2.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * <p>
- * IAdvancedUndoableOperation2 defines a method for computing the validity of
- * executing an operation before attempting to execute it. It also defines a way
- * for clients to specify that computing status should be done quietly, without
- * consulting the user. This interface is useful when implementing
- * {@link IOperationApprover2}, or any other object that performs validation of
- * the undo history. It also allows operations to specify whether they should be
- * run in the UI thread.
- * </p>
- * 
- * @since 3.3
- * 
- */
-public interface IAdvancedUndoableOperation2 {
-	/**
-	 * Return a status indicating the projected outcome of executing the
-	 * receiver.
-	 * 
-	 * This method should be used to report the possible outcome of executing an
-	 * operation when computing the validity of an execute is too expensive to
-	 * perform in {@link IUndoableOperation#canExecute()}. It is not called by
-	 * the operation history, but instead is used by clients (such as
-	 * implementers of {@link IOperationApprover2}) who wish to perform
-	 * advanced validation of an operation before attempting to execute it.
-	 * 
-	 * If the result of this method is the discovery that an operation can in
-	 * fact not be executed, then the operation is expected to correctly answer
-	 * <code>false</code> on subsequent calls to
-	 * {@link IUndoableOperation#canExecute()}.
-	 * 
-	 * @param monitor
-	 *            the progress monitor (or <code>null</code>) to use for
-	 *            reporting progress to the user while computing the validity.
-	 * 
-	 * @return the IStatus indicating the validity of the execute. The status
-	 *         severity should be set to <code>OK</code> if the execute can
-	 *         successfully be performed, and <code>ERROR</code> if it cannot.
-	 *         Any other severity is assumed to represent an ambiguous state.
-	 * @throws ExecutionException
-	 *             if an exception occurs while computing the validity.
-	 */
-	IStatus computeExecutionStatus(IProgressMonitor monitor)
-			throws ExecutionException;
-
-	/**
-	 * Set a boolean that instructs whether the computation of the receiver's
-	 * execution, undo, or redo status should quietly compute status without
-	 * consulting or prompting the user. The default value is <code>false</code>.
-	 * This flag should only be set to <code>true</code> while the execution,
-	 * undo, or redo status computations are being performed in the background,
-	 * and should be restored to <code>false</code> when complete.
-	 * <p>
-	 * If the status computation methods typically need to consult the user in
-	 * order to determine the severity of a particular situation, the least
-	 * severe status that could be chosen by the user should be returned when
-	 * this flag is <code>true</code>. This can help to prevent overzealous
-	 * disposal of the operation history when an operation is in an ambiguous
-	 * state. Typically, the status computation methods are invoked with this
-	 * flag set to <code>false</code> just before the actual execution, undo,
-	 * or redo occurs, so the user can be consulted for the final outcome.
-	 * 
-	 * @param quiet
-	 *            <code>true</code> if it is inappropriate to consult or
-	 *            otherwise prompt the user while computing status, and
-	 *            <code>false</code> if the user may be prompted.
-	 * 
-	 * @see #computeExecutionStatus(IProgressMonitor)
-	 * @see IAdvancedUndoableOperation#computeUndoableStatus(IProgressMonitor)
-	 * @see IAdvancedUndoableOperation#computeRedoableStatus(IProgressMonitor)
-	 */
-	public void setQuietCompute(boolean quiet);
-
-	/**
-	 * Return a boolean that instructs whether the operation should be executed,
-	 * undone, or redone in a background thread.
-	 * 
-	 * @return <code>true</code> if the operation should be run in the
-	 *         background, <code>false</code> if it should not.
-	 */
-	public boolean runInBackground();
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/ICompositeOperation.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/ICompositeOperation.java
deleted file mode 100644
index 1653596..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/ICompositeOperation.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-/**
- * <p>
- * ICompositeOperation defines an undoable operation that is composed of child
- * operations. Requests to execute, undo, or redo a composite result in the the
- * execution, undo, or redo of the composite as a whole. Similarly, a request to 
- * dispose the composite should result in all child operations being disposed.
- * </p>
- * 
- * @since 3.1
- */
-public interface ICompositeOperation extends IUndoableOperation {
-
-	/**
-	 * <p>
-	 * Add the specified operation as a child of this operation.
-	 * </p>
-	 * 
-	 * @param operation
-	 *            the operation to be added. If the operation instance has
-	 *            already been added, this method will have no effect.
-	 */
-	void add(IUndoableOperation operation);
-
-	/**
-	 * <p>
-	 * Remove the specified operation from this operation.
-	 * </p>
-	 * <p>
-	 * The composite operation should dispose the operation as part of removing
-	 * it.
-	 * </p>
-	 * 
-	 * @param operation
-	 *            the operation to be removed. The operation should be disposed
-	 *            by the receiver. This method will have no effect if the
-	 *            operation instance is not already a child.
-	 */
-	void remove(IUndoableOperation operation);
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IContextReplacingOperation.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IContextReplacingOperation.java
deleted file mode 100644
index 1ca00eb..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IContextReplacingOperation.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-/**
- * IContextReplacingOperation defines an interface for undoable operations that
- * can replace one undo context with another undo context. It is used by
- * operations, such as composite operations, where removing and adding an undo
- * context would not have the same semantic as replacing one undo context with
- * another.
- * 
- * @since 3.2
- * 
- */
-public interface IContextReplacingOperation {
-
-	/**
-	 * Replace the undo context of the receiver with the provided replacement
-	 * undo context.
-	 * <p>
-	 * This message has no effect if the original undo context is not present in
-	 * the receiver.
-	 * 
-	 * @param original the undo context which is to be replaced
-	 * @param replacement the undo context which is replacing the original
-	 * 
-	 */
-	void replaceContext(IUndoContext original, IUndoContext replacement);
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IOperationApprover.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IOperationApprover.java
deleted file mode 100644
index 44446f8..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IOperationApprover.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * <p>
- * IOperationApprover defines an interface for approving the undo or redo of a
- * particular operation within an operation history. Operations that are
- * candidates for undo or redo have already been validated against their current
- * state and according to the rules of the history.
- * </p>
- * <p>
- * By the time an IOperationApprover is consulted, the undo has already been
- * requested. Approvers should return an <code>IStatus</code> object with
- * severity <code>OK</code> if the operation should proceed, and any other
- * severity if it should not. When an operation is not approved, it is expected
- * that the object not allowing the operation has already consulted the user if
- * necessary or otherwise provided any necessary information to the user about
- * the fact that the operation is not approved.
- * </p>
- * <p>
- * Operation approvers must be prepared to receive the approval messages from a
- * background thread. Any UI access occurring inside the implementation must be
- * properly synchronized using the techniques specified by the client's widget
- * library.
- * </p>
- * 
- * @since 3.1
- */
-public interface IOperationApprover {
-
-	/**
-	 * Return a status indicating whether the specified operation should be
-	 * redone. Any status that does not have severity <code>IStatus.OK</code>
-	 * will not be approved. Implementers should not assume that the redo will
-	 * be performed when the status is <code>OK</code>, since other operation
-	 * approvers may veto the redo.
-	 * 
-	 * @param operation 
-	 *            the operation to be redone
-	 * @param history 
-	 *            the history redoing the operation
-	 * @param info 
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it should minimally contain an adapter
-	 *            for the org.eclipse.swt.widgets.Shell.class. Even if UI
-	 *            information is provided, the implementation of this method
-	 *            must be prepared for being called from a background thread.
-	 *            Any UI access must be properly synchronized using the
-	 *            techniques specified by the client's widget library.
-	 * @return the IStatus describing whether the operation is approved. The
-	 *         redo will not proceed if the status severity is not
-	 *         <code>OK</code>, and the caller requesting the redo will be
-	 *         returned the status that caused the rejection. Any other status
-	 *         severities will not be interpreted by the history.
-	 */
-	IStatus proceedRedoing(IUndoableOperation operation,
-			IOperationHistory history, IAdaptable info);
-
-	/**
-	 * Return a status indicating whether the specified operation should be
-	 * undone. Any status that does not have severity <code>IStatus.OK</code>
-	 * will not be approved. Implementers should not assume that the undo will
-	 * be performed when the status is <code>OK</code>, since other operation
-	 * approvers can veto the undo.
-	 * 
-	 * @param operation 
-	 *            the operation to be undone
-	 * @param history 
-	 *            the history undoing the operation
-	 * @param info 
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it should minimally contain an adapter
-	 *            for the org.eclipse.swt.widgets.Shell.class. Even if UI
-	 *            information is provided, the implementation of this method
-	 *            must be prepared for being called from a background thread.
-	 *            Any UI access must be properly synchronized using the
-	 *            techniques specified by the client's widget library.
-	 * @return the IStatus describing whether the operation is approved. The
-	 *         undo will not proceed if the status severity is not
-	 *         <code>OK</code>, and the caller requesting the undo will be
-	 *         returned the status that caused the rejection. Any other status
-	 *         severities will not be interpreted by the history.
-	 */
-	IStatus proceedUndoing(IUndoableOperation operation,
-			IOperationHistory history, IAdaptable info);
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IOperationApprover2.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IOperationApprover2.java
deleted file mode 100644
index 7dbbd45..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IOperationApprover2.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Extends {@link IOperationApprover} to approve the execution of a particular
- * operation within an operation history. Operations that are candidates for
- * execution have already been validated against their current state and
- * according to the rules of the history. Prior to 3.2, an operation approver
- * was only consulted for undo and redo of an operation, not its initial
- * execution.
- * <p>
- * By the time an IOperationApprover2 is consulted, the execution has already
- * been requested and it has been determined that the operation is valid.
- * Approvers should return an <code>IStatus</code> object with severity
- * <code>OK</code> if the operation should proceed, and any other severity if
- * it should not. When an operation is not approved, it is expected that the
- * object not allowing the operation has already consulted the user if necessary
- * or otherwise provided any necessary information to the user about the fact
- * that the operation is not approved.
- * </p>
- * <p>
- * Like {@link IOperationApprover}, implementers of this extension must be
- * prepared to receive the approval messages from a background thread. Any UI
- * access occurring inside the implementation must be properly synchronized
- * using the techniques specified by the client's widget library.
- * </p>
- * 
- * @since 3.2
- */
-public interface IOperationApprover2 extends IOperationApprover {
-	/**
-	 * Return a status indicating whether the specified operation should be
-	 * executed. Any status that does not have severity <code>IStatus.OK</code>
-	 * will not be approved. Implementers should not assume that the execution
-	 * will be performed when the status is <code>OK</code>, since other
-	 * operation approvers may veto the execution.
-	 * 
-	 * @param operation
-	 *            the operation to be executed
-	 * @param history
-	 *            the history performing the execution of the operation
-	 * @param info
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it should minimally contain an adapter
-	 *            for the org.eclipse.swt.widgets.Shell.class. Even if UI
-	 *            information is provided, the implementation of this method
-	 *            must be prepared for being called from a background thread.
-	 *            Any UI access must be properly synchronized using the
-	 *            techniques specified by the client's widget library.
-	 * @return the IStatus describing whether the operation is approved. The
-	 *         execution will not proceed if the status severity is not
-	 *         <code>OK</code>, and the caller requesting the execution will
-	 *         be returned the status that caused the rejection. Any other
-	 *         status severities will not be interpreted by the history.
-	 */
-	IStatus proceedExecuting(IUndoableOperation operation,
-			IOperationHistory history, IAdaptable info);
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IOperationHistory.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IOperationHistory.java
deleted file mode 100644
index 3c11a3d..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IOperationHistory.java
+++ /dev/null
@@ -1,697 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.internal.commands.operations.GlobalUndoContext;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * <p>
- * IOperationHistory tracks a history of operations that can be undone or
- * redone. Operations are added to the history once they have been initially
- * executed. Clients may choose whether to have the operations history perform
- * the initial execution or to simply add an already-executed operation to the
- * history.
- * </p>
- * <p>
- * Once operations are added to the history, the methods
- * {@link #canRedo(IUndoContext)} and {@link #canUndo(IUndoContext)} are used to
- * determine whether there is an operation available for undo and redo in a
- * given undo context. The context-based protocol implies that there is only one
- * operation that can be undone or redone at a given time in a given context.
- * This is typical of a linear undo model, when only the most recently executed
- * operation is available for undo. When this protocol is used, a linear model
- * is enforced by the history.
- * </p>
- * <p>
- * It is up to clients to determine how to maintain a history that is invalid or
- * stale. For example, when the most recent operation for a context cannot be
- * performed, clients may wish to dispose the history for that context.
- * </p>
- * <p>
- * Additional protocol allows direct undo and redo of a specified operation,
- * regardless of its position in the history. When a more flexible undo model is
- * supported, these methods can be implemented to undo and redo directly
- * specified operations. If an implementer of IOperationHistory does not allow
- * direct undo and redo, these methods can return a status indicating that it is
- * not allowed.
- * </p>
- * <p>
- * Listeners ({@link IOperationHistoryListener}) can listen for notifications
- * about changes in the history (operations added or removed), and for
- * notification before and after any operation is executed, undone or redone.
- * Notification of operation execution only occurs when clients direct the
- * history to execute the operation. If the operation is added after it is
- * executed, there can be no notification of its execution.
- * </p>
- * <p>
- * {@link IOperationApprover} defines an interface for approving an undo or redo
- * before it occurs. This is useful for injecting policy-decisions into the undo
- * model - whether direct undo and redo are supported, or warning the user about
- * certain kinds of operations. It can also be used when clients maintain state
- * related to an operation and need to determine whether an undo or redo will
- * cause any conflicts with their local state.
- * </p>
- * 
- * @since 3.1
- */
-public interface IOperationHistory {
-
-	/**
-	 * An operation is to be opened or closed for execution. (value is 1).
-	 */
-	public static final int EXECUTE = 1;
-
-	/**
-	 * An operation is to be opened for undo. (value is 2).
-	 */
-	public static final int UNDO = 2;
-
-	/**
-	 * An operation is to be opened for redo. (value is 3).
-	 */
-	public static final int REDO = 3;
-
-	/**
-	 * An undo context that can be used to refer to the global undo history.
-	 * This context is not intended to be assigned to operations. Instead, it is
-	 * used for querying the history or performing an undo or redo on the entire
-	 * history, regardless of each operation's undo contexts.
-	 */
-	public static final IUndoContext GLOBAL_UNDO_CONTEXT = new GlobalUndoContext();
-
-	/**
-	 * An operation info status describing the condition that there is no
-	 * available operation for redo.
-	 */
-	public static final IStatus NOTHING_TO_REDO_STATUS = new OperationStatus(
-			IStatus.INFO, OperationStatus.DEFAULT_PLUGIN_ID,
-			OperationStatus.NOTHING_TO_REDO, "No operation to redo", null); //$NON-NLS-1$
-
-	/**
-	 * An operation info status describing the condition that there is no
-	 * available operation for undo.
-	 */
-	public static final IStatus NOTHING_TO_UNDO_STATUS = new OperationStatus(
-			IStatus.INFO, OperationStatus.DEFAULT_PLUGIN_ID,
-			OperationStatus.NOTHING_TO_UNDO, "No operation to undo", null); //$NON-NLS-1$
-
-	/**
-	 * An operation error status describing the condition that the operation
-	 * available for execution, undo or redo is not in a valid state for the
-	 * action to be performed.
-	 */
-	public static final IStatus OPERATION_INVALID_STATUS = new OperationStatus(
-			IStatus.ERROR, OperationStatus.DEFAULT_PLUGIN_ID,
-			OperationStatus.OPERATION_INVALID, "Operation is not valid", null); //$NON-NLS-1$
-
-	/**
-	 * <p>
-	 * Add the specified operation to the history without executing it. The
-	 * operation should have already been executed by the time it is added to
-	 * the history. Listeners will be notified that the operation was added to
-	 * the history (<code>OPERATION_ADDED</code>).
-	 * </p>
-	 * 
-	 * @param operation
-	 *            the operation to be added to the history
-	 */
-	void add(IUndoableOperation operation);
-
-	/**
-	 * <p>
-	 * Add the specified approver to the list of operation approvers consulted
-	 * by the operation history before an undo or redo is attempted.
-	 * </p>
-	 * 
-	 * @param approver
-	 *            the IOperationApprover to be added as an approver.the instance
-	 *            to remove. Must not be <code>null</code>. If an attempt is
-	 *            made to register an instance which is already registered with
-	 *            this instance, this method has no effect.
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationApprover
-	 */
-	void addOperationApprover(IOperationApprover approver);
-
-	/**
-	 * <p>
-	 * Add the specified listener to the list of operation history listeners
-	 * that are notified about changes in the history or operations that are
-	 * executed, undone, or redone.
-	 * </p>
-	 * 
-	 * @param listener
-	 *            the IOperationHistoryListener to be added as a listener. Must
-	 *            not be <code>null</code>. If an attempt is made to register
-	 *            an instance which is already registered with this instance,
-	 *            this method has no effect.
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationHistoryListener
-	 * @see org.eclipse.core.commands.operations.OperationHistoryEvent
-	 */
-	void addOperationHistoryListener(IOperationHistoryListener listener);
-
-	/**
-	 * <p>
-	 * Close the current operation. If the operation has successfully completed,
-	 * send listeners a <code>DONE</code>, <code>UNDONE</code>, or
-	 * <code>REDONE</code> notification, depending on the mode. Otherwise send
-	 * an <code>OPERATION_NOT_OK</code> notification. Add the operation to the
-	 * history if specified and send an <code>OPERATION_ADDED</code>
-	 * notification.
-	 * </p>
-	 * <p>
-	 * Any operations that are executed and added after this operation is closed
-	 * will no longer be considered part of this operation.
-	 * </p>
-	 * <p>
-	 * This method has no effect if the caller has not previously called
-	 * {@link #openOperation}.
-	 * </p>
-	 * 
-	 * @param operationOK
-	 *            <code>true</code> if the operation successfully completed.
-	 *            Listeners should be notified with <code>DONE</code>,
-	 *            <code>UNDONE</code>, or <code>REDONE</code>.
-	 *            <code>false</code> if the operation did not successfully
-	 *            complete. Listeners should be notified with
-	 *            <code>OPERATION_NOT_OK</code>.
-	 * @param addToHistory
-	 *            <code>true</code> if the operation should be added to the
-	 *            history, <code>false</code> if it should not. If the
-	 *            <code>operationOK</code> parameter is <code>false</code>,
-	 *            the operation will never be added to the history.
-	 * @param mode
-	 *            the mode the operation was opened in. Can be one of
-	 *            <code>EXECUTE</code>, <code>UNDO</code>, or
-	 *            <code>REDO</code>. This determines what notifications are
-	 *            sent.
-	 */
-	void closeOperation(boolean operationOK, boolean addToHistory, int mode);
-
-	/**
-	 * <p>
-	 * Return whether there is a valid redoable operation available in the given
-	 * context.
-	 * </p>
-	 * 
-	 * @param context
-	 *            the context to be checked
-	 * @return <code>true</code> if there is a redoable operation,
-	 *         <code>false</code> otherwise.
-	 */
-
-	boolean canRedo(IUndoContext context);
-
-	/**
-	 * <p>
-	 * Return whether there is a valid undoable operation available in the given
-	 * context
-	 * </p>
-	 * 
-	 * @param context
-	 *            the context to be checked
-	 * @return <code>true</code> if there is an undoable operation,
-	 *         <code>false</code> otherwise.
-	 */
-	boolean canUndo(IUndoContext context);
-
-	/**
-	 * <p>
-	 * Dispose of the specified context in the history. All operations that have
-	 * only the given context will be disposed. References to the context in
-	 * operations that have more than one context will also be removed. A
-	 * history notification for the removal of each operation being disposed
-	 * will be sent.
-	 * </p>
-	 * 
-	 * @param context
-	 *            the context to be disposed
-	 * @param flushUndo
-	 *            <code>true</code> if the context should be flushed from the
-	 *            undo history, <code>false</code> if it should not
-	 * @param flushRedo
-	 *            <code>true</code> if the context should be flushed from the
-	 *            redo history, <code>false</code> if it should not.
-	 * @param flushContext
-	 *            <code>true</code> if the context is no longer in use and
-	 *            references to it should be flushed.
-	 */
-	void dispose(IUndoContext context, boolean flushUndo, boolean flushRedo,
-			boolean flushContext);
-
-	/**
-	 * <p>
-	 * Execute the specified operation and add it to the operations history if
-	 * successful. This method is used by clients who wish operation history
-	 * listeners to receive notifications before and after the execution of the
-	 * operation. Execution of the operation is subject to approval by any
-	 * registered {@link IOperationApprover2}. If execution is approved,
-	 * listeners will be notified before (<code>ABOUT_TO_EXECUTE</code>) and
-	 * after (<code>DONE</code> or <code>OPERATION_NOT_OK</code>).
-	 * </p>
-	 * <p>
-	 * If the operation successfully executes, an additional notification that
-	 * the operation has been added to the history (<code>OPERATION_ADDED</code>)
-	 * will be sent.
-	 * </p>
-	 * 
-	 * @param operation
-	 *            the operation to be executed and then added to the history
-	 * 
-	 * @param monitor
-	 *            the progress monitor to be used (or <code>null</code>)
-	 *            during the operation.
-	 * 
-	 * @param info
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it should minimally contain an adapter
-	 *            for the org.eclipse.swt.widgets.Shell.class.
-	 * 
-	 * @return the IStatus indicating whether the execution succeeded.
-	 * 
-	 * <p>
-	 * The severity code in the returned status describes whether the operation
-	 * succeeded and whether it was added to the history. <code>OK</code>
-	 * severity indicates that the execute operation was successful and that the
-	 * operation has been added to the history. Listeners will receive
-	 * notifications about the operation's success (<code>DONE</code>) and
-	 * about the operation being added to the history (<code>OPERATION_ADDED</code>).
-	 * </p>
-	 * <p>
-	 * <code>CANCEL</code> severity indicates that the user cancelled the
-	 * operation and that the operation was not added to the history.
-	 * <code>ERROR</code> severity indicates that the operation did not
-	 * successfully execute and that it was not added to the history. Any other
-	 * severity code is not specifically interpreted by the history, and the
-	 * operation will not be added to the history. For all severities other than
-	 * <code>OK</code>, listeners will receive the
-	 * <code>OPERATION_NOT_OK</code> notification instead of the
-	 * <code>DONE</code> notification if the execution was approved and
-	 * attempted.
-	 * </p>
-	 * 
-	 * @throws ExecutionException
-	 *             if an exception occurred during execution.
-	 * 
-	 */
-	IStatus execute(IUndoableOperation operation, IProgressMonitor monitor,
-			IAdaptable info) throws ExecutionException;
-
-	/**
-	 * <p>
-	 * Return the limit on the undo and redo history for a particular context.
-	 * </p>
-	 * 
-	 * @param context
-	 *            the context whose limit is requested
-	 * 
-	 * @return the undo and redo history limit for the specified context.
-	 */
-	int getLimit(IUndoContext context);
-
-	/**
-	 * <p>
-	 * Get the array of operations in the redo history for a the specified undo
-	 * context. The operations are in the order that they were added to the
-	 * history, with the most recently undone operation appearing last in the
-	 * array. This history is used LIFO (last in, first out) when successive
-	 * "Redo" commands are invoked.
-	 * 
-	 * </p>
-	 * 
-	 * @param context
-	 *            the context for the redo
-	 * @return the array of operations in the history
-	 */
-	IUndoableOperation[] getRedoHistory(IUndoContext context);
-
-	/**
-	 * <p>
-	 * Get the operation that will next be redone in the given undo context.
-	 * </p>
-	 * 
-	 * @param context
-	 *            the context for the redo
-	 * @return the operation to be redone or <code>null</code> if there is no
-	 *         operation available. There is no guarantee that the returned
-	 *         operation is valid for redo.
-	 */
-	IUndoableOperation getRedoOperation(IUndoContext context);
-
-	/**
-	 * <p>
-	 * Get the array of operations in the undo history for the specified undo
-	 * context. The operations are in the order that they were added to the
-	 * history, with the most recently added operation appearing last in the
-	 * array. This history is used LIFO (last in, first out) when successive
-	 * "Undo" commands are invoked.
-	 * </p>
-	 * 
-	 * @param context
-	 *            the context for the undo
-	 * @return the array of operations in the history
-	 */
-	IUndoableOperation[] getUndoHistory(IUndoContext context);
-
-	/**
-	 * <p>
-	 * Open this composite operation and consider it an operation that contains
-	 * other related operations. Consider all operations that are subsequently
-	 * executed or added to be part of this operation. When an operation is
-	 * opened, listeners will immediately receive a notification for the opened
-	 * operation. The specific notification depends on the mode in which the
-	 * operation is opened (<code>ABOUT_TO_EXECUTE</code>,
-	 * <code>ABOUT_TO_UNDO</code>, <code>ABOUT_TO_REDO</code>).
-	 * Notifications for any other execute or add while this operation is open
-	 * will not occur. Instead, those operations will be added to the current
-	 * operation.
-	 * </p>
-	 * <p>
-	 * Note: This method is intended to be used by legacy undo frameworks that
-	 * do not expect related undo operations to appear in the same undo history
-	 * as the triggering undo operation. When an operation is open, any
-	 * subsequent requests to execute, add, undo, or redo another operation will
-	 * result in that operation being added to the open operation. Once the
-	 * operation is closed, the composite will be considered an atomic
-	 * operation. Clients should not modify the composite directly (by adding
-	 * and removing children) while it is open.
-	 * </p>
-	 * <p>
-	 * When a composite is open, operations that are added to the history will
-	 * be considered part of the open operation instead. Operations that are
-	 * executed while a composite is open will first be executed and then added
-	 * to the composite.
-	 * </p>
-	 * <p>
-	 * Open operations cannot be nested. If this method is called when a
-	 * different operation is open, it is presumed to be an application coding
-	 * error and this method will throw an IllegalStateException.
-	 * </p>
-	 * 
-	 * @param operation
-	 *            the composite operation to be considered as the parent for all
-	 *            subsequent operations.
-	 * @param mode
-	 *            the mode the operation is executing in. Can be one of
-	 *            <code>EXECUTE</code>, <code>UNDO</code>, or
-	 *            <code>REDO</code>. This determines what notifications are
-	 *            sent.
-	 */
-	void openOperation(ICompositeOperation operation, int mode);
-
-	/**
-	 * <p>
-	 * The specified operation has changed in some way since it was added to the
-	 * operation history. Notify listeners with an OPERATION_CHANGED event.
-	 * </p>
-	 * 
-	 * @param operation
-	 *            the operation that has changed.
-	 * 
-	 */
-	void operationChanged(IUndoableOperation operation);
-
-	/**
-	 * <p>
-	 * Get the operation that will next be undone in the given undo context.
-	 * </p>
-	 * 
-	 * @param context
-	 *            the context for the undo
-	 * @return the operation to be undone or <code>null</code> if there is no
-	 *         operation available. There is no guarantee that the available
-	 *         operation is valid for the undo.
-	 */
-	IUndoableOperation getUndoOperation(IUndoContext context);
-
-	/**
-	 * <p>
-	 * Redo the most recently undone operation in the given context. The redo of
-	 * the operation is subject to approval by any registered
-	 * {@link IOperationApprover} before it is attempted.
-	 * </p>
-	 * 
-	 * @param context
-	 *            the context to be redone
-	 * @param monitor
-	 *            the progress monitor to be used for the redo, or
-	 *            <code>null</code> if no progress monitor is provided.
-	 * @param info
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it should minimally contain an adapter
-	 *            for the org.eclipse.swt.widgets.Shell.class.
-	 * @return the IStatus indicating whether the redo succeeded.
-	 * 
-	 * <p>
-	 * The severity code in the returned status describes whether the operation
-	 * succeeded and whether it remains in the history. <code>OK</code>
-	 * severity indicates that the redo operation was successful and (since
-	 * release 3.2), that the operation will be placed in the undo history.
-	 * (Prior to 3.2, a successfully redone operation would not be placed on the
-	 * undo history if it could not be undone. Since 3.2, this is relaxed, and
-	 * all successfully redone operations are placed in the undo history.)
-	 * Listeners will receive the <code>REDONE</code> notification.
-	 * </p>
-	 * <p>
-	 * Other severity codes (<code>CANCEL</code>, <code>ERROR</code>,
-	 * <code>INFO</code>, etc.) are not specifically interpreted by the
-	 * history. The operation will remain in the history and the returned status
-	 * is simply passed back to the caller. For all severities other than
-	 * <code>OK</code>, listeners will receive the
-	 * <code>OPERATION_NOT_OK</code> notification instead of the
-	 * <code>REDONE</code> notification if the redo was approved and
-	 * attempted.
-	 * </p>
-	 * 
-	 * @throws ExecutionException
-	 *             if an exception occurred during redo.
-	 * 
-	 */
-	IStatus redo(IUndoContext context, IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException;
-
-	/**
-	 * <p>
-	 * Redo the specified operation. The redo of the operation is subject to
-	 * approval by any registered {@link IOperationApprover} before it is
-	 * attempted.
-	 * </p>
-	 * 
-	 * @param operation
-	 *            the operation to be redone
-	 * @param monitor
-	 *            the progress monitor to be used for the redo, or code>null</code>
-	 *            if no progress monitor is provided
-	 * @param info
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not <code>null</code>,
-	 *            it should minimally contain an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class.
-	 * 
-	 * @return the IStatus indicating whether the redo succeeded.
-	 * 
-	 * <p>
-	 * The severity code in the returned status describes whether the operation
-	 * succeeded and whether it remains in the history. <code>OK</code>
-	 * severity indicates that the redo operation was successful, and (since
-	 * release 3.2), that the operation will be placed in the undo history.
-	 * (Prior to 3.2, a successfully redone operation would not be placed on the
-	 * undo history if it could not be undone. Since 3.2, this is relaxed, and
-	 * all successfully redone operations are placed in the undo history.)
-	 * Listeners will receive the <code>REDONE</code> notification.
-	 * </p>
-	 * <p>
-	 * Other severity codes (<code>CANCEL</code>, <code>ERROR</code>,
-	 * <code>INFO</code>, etc.) are not specifically interpreted by the
-	 * history. The operation will remain in the history and the returned status
-	 * is simply passed back to the caller. For all severities other than <code>OK</code>,
-	 * listeners will receive the <code>OPERATION_NOT_OK</code> notification
-	 * instead of the <code>REDONE</code> notification if the redo was
-	 * approved and attempted.
-	 * </p>
-	 * 
-	 * @throws ExecutionException
-	 *             if an exception occurred during redo.
-	 */
-	IStatus redoOperation(IUndoableOperation operation,
-			IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException;
-
-	/**
-	 * <p>
-	 * Remove the specified operation approver from the list of operation
-	 * approvers that are consulted before an operation is undone or redone.
-	 * </p>
-	 * 
-	 * @param approver
-	 *            the IOperationApprover to be removed. Must not be
-	 *            <code>null</code>. If an attempt is made to remove an
-	 *            instance which is not already registered with this instance,
-	 *            this method has no effect.
-	 */
-	void removeOperationApprover(IOperationApprover approver);
-
-	/**
-	 * <p>
-	 * Remove the specified listener from the list of operation history
-	 * listeners.
-	 * </p>
-	 * 
-	 * @param listener
-	 *            The IOperationHistoryListener to be removed. Must not be
-	 *            <code>null</code>. If an attempt is made to remove an
-	 *            instance which is not already registered with this instance,
-	 *            this method has no effect.
-	 */
-	void removeOperationHistoryListener(IOperationHistoryListener listener);
-
-	/**
-	 * <p>
-	 * Replace the specified operation in the undo or redo history with the
-	 * provided list of replacements. This protocol is typically used when a
-	 * composite is broken up into its atomic parts. The replacements will be
-	 * inserted so that the first replacement will be the first of the
-	 * replacements to be undone or redone. Listeners will be notified about the
-	 * removal of the replaced element and the addition of each replacement.
-	 * </p>
-	 * 
-	 * @param operation
-	 *            The IUndoableOperation to be replaced
-	 * @param replacements
-	 *            the array of IUndoableOperation to replace the first operation
-	 */
-	void replaceOperation(IUndoableOperation operation,
-			IUndoableOperation[] replacements);
-
-	/**
-	 * <p>
-	 * Set the limit on the undo and redo history for a particular context.
-	 * </p>
-	 * 
-	 * @param context
-	 *            the context whose limit is being set.
-	 * 
-	 * @param limit
-	 *            the maximum number of operations that should be kept in the
-	 *            undo or redo history for the specified context. Must not be
-	 *            negative.
-	 */
-	void setLimit(IUndoContext context, int limit);
-
-	/**
-	 * <p>
-	 * Undo the most recently executed operation in the given context. The undo
-	 * of the operation is subject to approval by any registered
-	 * {@link IOperationApprover} before it is attempted.
-	 * </p>
-	 * 
-	 * @param context
-	 *            the context to be undone
-	 * @param monitor
-	 *            the progress monitor to be used for the undo, or
-	 *            <code>null</code> if no progress monitor is provided.
-	 * @param info
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it should minimally contain an adapter
-	 *            for the org.eclipse.swt.widgets.Shell.class.
-	 * 
-	 * @return the IStatus indicating whether the undo succeeded.
-	 * 
-	 * <p>
-	 * The severity code in the returned status describes whether the operation
-	 * succeeded and whether it remains in the history. <code>OK</code>
-	 * severity indicates that the undo operation was successful, and (since
-	 * release 3.2), that the operation will be placed on the redo history.
-	 * (Prior to 3.2, a successfully undone operation would not be placed on the
-	 * redo history if it could not be redone. Since 3.2, this is relaxed, and
-	 * all successfully undone operations are placed in the redo history.)
-	 * Listeners will receive the <code>UNDONE</code> notification.
-	 * </p>
-	 * <p>
-	 * Other severity codes (<code>CANCEL</code>, <code>ERROR</code>,
-	 * <code>INFO</code>, etc.) are not specifically interpreted by the
-	 * history. The operation will remain in the history and the returned status
-	 * is simply passed back to the caller. For all severities other than
-	 * <code>OK</code>, listeners will receive the
-	 * <code>OPERATION_NOT_OK</code> notification instead of the
-	 * <code>UNDONE</code> notification if the undo was approved and
-	 * attempted.
-	 * </p>
-	 * 
-	 * @throws ExecutionException
-	 *             if an exception occurred during undo.
-	 */
-
-	IStatus undo(IUndoContext context, IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException;
-
-	/**
-	 * <p>
-	 * Undo the specified operation. The undo of the operation is subject to
-	 * approval by any registered {@link IOperationApprover} before it is
-	 * attempted.
-	 * </p>
-	 * 
-	 * @param operation
-	 *            the operation to be undone
-	 * @param monitor
-	 *            the progress monitor to be used for the undo, or
-	 *            <code>null</code> if no progress monitor is provided
-	 * @param info
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it should minimally contain an adapter
-	 *            for the org.eclipse.swt.widgets.Shell.class.
-	 * 
-	 * @return the IStatus indicating whether the undo succeeded.
-	 * 
-	 * <p>
-	 * The severity code in the returned status describes whether the operation
-	 * succeeded and whether it remains in the history. <code>OK</code>
-	 * severity indicates that the undo operation was successful, and (since
-	 * release 3.2), that the operation will be placed on the redo history.
-	 * (Prior to 3.2, a successfully undone operation would not be placed on the
-	 * redo history if it could not be redone. Since 3.2, this is relaxed, and
-	 * all successfully undone operations are placed in the redo history.)
-	 * Listeners will receive the <code>UNDONE</code> notification.
-	 * </p>
-	 * <p>
-	 * Other severity codes (<code>CANCEL</code>, <code>ERROR</code>,
-	 * <code>INFO</code>, etc.) are not specifically interpreted by the
-	 * history. The operation will remain in the history and the returned status
-	 * is simply passed back to the caller. For all severities other than
-	 * <code>OK</code>, listeners will receive the
-	 * <code>OPERATION_NOT_OK</code> notification instead of the
-	 * <code>UNDONE</code> notification if the undo was approved and
-	 * attempted.
-	 * </p>
-	 * 
-	 * @throws ExecutionException
-	 *             if an exception occurred during undo.
-	 */
-	IStatus undoOperation(IUndoableOperation operation,
-			IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException;
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IOperationHistoryListener.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IOperationHistoryListener.java
deleted file mode 100644
index d665216..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IOperationHistoryListener.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-/**
- * <p>
- * This interface is used to listen to notifications from an IOperationHistory.
- * The supplied OperationHistoryEvent describes the particular notification.
- * </p>
- * <p>
- * Operation history listeners must be prepared to receive notifications from a
- * background thread. Any UI access occurring inside the implementation must be
- * properly synchronized using the techniques specified by the client's widget
- * library.
- * </p>
- * 
- * @since 3.1
- */
-public interface IOperationHistoryListener {
-	/**
-	 * Something of note has happened in the IOperationHistory. Listeners should
-	 * check the supplied event for details.
-	 * 
-	 * @param event 
-	 *            the OperationHistoryEvent that describes the particular
-	 *            notification.
-	 */
-	void historyNotification(OperationHistoryEvent event);
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IUndoContext.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IUndoContext.java
deleted file mode 100644
index 7b30cd5..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IUndoContext.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-/**
- * <p>
- * An undo context is used to "tag" operations as being applicable to a certain
- * context. The undo context is used to filter the history of operations
- * available for undo or redo so that only operations appropriate for a given
- * undo context are shown when the application is presenting that context.
- * </p>
- * <p>
- * The scope of an undo context is defined by the application that is making
- * undo and redo of operations available. Undo contexts may be related to
- * application models, or may be associated with UI objects that are providing
- * undo and redo support.
- * </p>
- * <p>
- * An undo context may be defined as "matching" another context. This allows
- * applications to provide specialized implementations of an undo context that
- * will appear in the operation history for their matching context.
- * 
- * @since 3.1
- */
-
-public interface IUndoContext {
-
-	/**
-	 * Get the label that describes the undo context.
-	 * 
-	 * @return the label for the context.
-	 */
-	public String getLabel();
-
-	/**
-	 * Return whether the specified context is considered a match for the
-	 * receiving context. When a context matches another context, operations
-	 * that have the context are considered to also have the matching context.
-	 * 
-	 * @param context 
-	 *            the context to be checked against the receiving context.
-	 * 
-	 * @return <code>true</code> if the receiving context can be considered a
-	 *         match for the specified context, and <code>false</code> if it
-	 *         cannot.
-	 */
-	public boolean matches(IUndoContext context);
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IUndoableOperation.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IUndoableOperation.java
deleted file mode 100644
index 4f7730f..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IUndoableOperation.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * <p>
- * IUndoableOperation defines an operation that can be executed, undone, and
- * redone. Operations typically have fully defined parameters. That is, they are
- * usually created after the user has been queried for any input needed to
- * define the operation.
- * </p>
- * <p>
- * Operations determine their ability to execute, undo, or redo according to the
- * current state of the application. They do not make decisions about their
- * validity based on where they occur in the operation history. That is left to
- * the particular operation history.
- * </p>
- * 
- * @since 3.1
- */
-public interface IUndoableOperation {
-
-	/**
-	 * <p>
-	 * Add the specified context to the operation. If a context equal to the
-	 * specified context is already present, do not add it again. Note that
-	 * determining whether a context is already present is based on equality,
-	 * not whether the context matches ({@link IUndoContext#matches(IUndoContext)})
-	 * another context.
-	 * </p>
-	 * 
-	 * @param context
-	 *            the context to be added
-	 */
-	void addContext(IUndoContext context);
-
-	/**
-	 * <p>
-	 * Returns whether the operation can be executed in its current state.
-	 * </p>
-	 * 
-	 * <p>
-	 * Note: The computation for this method must be fast, as it is called
-	 * frequently. If necessary, this method can be optimistic in its
-	 * computation (returning true) and later perform more time-consuming
-	 * computations during the actual execution of the operation, returning the
-	 * appropriate status if the operation cannot actually execute at that time.
-	 * </p>
-	 * 
-	 * @return <code>true</code> if the operation can be executed;
-	 *         <code>false</code> otherwise.
-	 */
-	boolean canExecute();
-
-	/**
-	 * <p>
-	 * Returns whether the operation can be redone in its current state.
-	 * </p>
-	 * 
-	 * <p>
-	 * Note: The computation for this method must be fast, as it is called
-	 * frequently. If necessary, this method can be optimistic in its
-	 * computation (returning true) and later perform more time-consuming
-	 * computations during the actual redo of the operation, returning the
-	 * appropriate status if the operation cannot actually be redone at that
-	 * time.
-	 * </p>
-	 * 
-	 * @return <code>true</code> if the operation can be redone;
-	 *         <code>false</code> otherwise.
-	 */
-	boolean canRedo();
-
-	/**
-	 * <p>
-	 * Returns whether the operation can be undone in its current state.
-	 * </p>
-	 * 
-	 * <p>
-	 * Note: The computation for this method must be fast, as it is called
-	 * frequently. If necessary, this method can be optimistic in its
-	 * computation (returning true) and later perform more time-consuming
-	 * computations during the actual undo of the operation, returning the
-	 * appropriate status if the operation cannot actually be undone at that
-	 * time.
-	 * </p>
-	 * 
-	 * @return <code>true</code> if the operation can be undone;
-	 *         <code>false</code> otherwise.
-	 */
-	boolean canUndo();
-
-	/**
-	 * Dispose of the operation. This method is used when the operation is no
-	 * longer kept in the history. Implementers of this method typically
-	 * unregister any listeners.
-	 * 
-	 */
-	void dispose();
-
-	/**
-	 * Execute the operation. This method should only be called the first time
-	 * that an operation is executed.
-	 * 
-	 * @param monitor
-	 *            the progress monitor (or <code>null</code>) to use for
-	 *            reporting progress to the user.
-	 * @param info
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it should minimally contain an adapter
-	 *            for the org.eclipse.swt.widgets.Shell.class.
-	 * 
-	 * @return the IStatus of the execution. The status severity should be set
-	 *         to <code>OK</code> if the operation was successful, and
-	 *         <code>ERROR</code> if it was not. Any other status is assumed
-	 *         to represent an incompletion of the execution.
-	 * @throws ExecutionException
-	 *             if an exception occurred during execution.
-	 */
-	IStatus execute(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException;
-
-	/**
-	 * <p>
-	 * Returns the array of contexts that have been assigned to the operation.
-	 * </p>
-	 * <p>
-	 * This method may be called by the operation history from inside a
-	 * synchronized block. To avoid deadlock conditions, implementers of this
-	 * method must avoid dispatching and waiting on threads that modify the
-	 * operation history during this method.
-	 * </p>
-	 * 
-	 * @return the array of contexts
-	 */
-	IUndoContext[] getContexts();
-
-	/**
-	 * Return the label that should be used to show the name of the operation to
-	 * the user. This label is typically combined with the command strings shown
-	 * to the user in "Undo" and "Redo" user interfaces.  
-	 * 
-	 * @return the String label.  Should never be <code>null</code>.
-	 */
-	String getLabel();
-
-	/**
-	 * <p>
-	 * Returns whether the operation has a matching context for the specified
-	 * context.
-	 * </p>
-	 * <p>
-	 * This method may be called by the operation history from inside a
-	 * synchronized block. To avoid deadlock conditions, implementers of this
-	 * method must avoid dispatching and waiting on threads that modify the
-	 * operation history during this method.
-	 * </p>
-	 * 
-	 * @see IUndoContext#matches(IUndoContext)
-	 * 
-	 * @param context
-	 *            the context in question
-	 * @return <code>true</code> if the context is present, <code>false</code>
-	 *         if it is not.
-	 */
-	boolean hasContext(IUndoContext context);
-
-	/**
-	 * Redo the operation. This method should only be called after an operation
-	 * has been undone.
-	 * 
-	 * @param monitor
-	 *            the progress monitor (or <code>null</code>) to use for
-	 *            reporting progress to the user.
-	 * @param info
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it should minimally contain an adapter
-	 *            for the org.eclipse.swt.widgets.Shell.class.
-	 * @return the IStatus of the redo. The status severity should be set to
-	 *         <code>OK</code> if the redo was successful, and
-	 *         <code>ERROR</code> if it was not. Any other status is assumed
-	 *         to represent an incompletion of the redo.
-	 * @throws ExecutionException
-	 *             if an exception occurred during redo.
-	 */
-
-	IStatus redo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException;
-
-	/**
-	 * Remove the specified context from the operation. This method has no
-	 * effect if the context is not equal to another context in the context
-	 * list. Note that determining whether a context is present when removing it
-	 * is based on equality, not whether the context matches ({@link
-	 * IUndoContext#matches(IUndoContext)}) another context.
-	 * 
-	 * @param context
-	 *            the context to be removed
-	 */
-	void removeContext(IUndoContext context);
-
-	/**
-	 * Undo the operation. This method should only be called after an operation
-	 * has been executed.
-	 * 
-	 * @param monitor
-	 *            the progress monitor (or <code>null</code>) to use for
-	 *            reporting progress to the user.
-	 * @param info
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it should minimally contain an adapter
-	 *            for the org.eclipse.swt.widgets.Shell.class.
-	 * @return the IStatus of the undo. The status severity should be set to
-	 *         <code>OK</code> if the redo was successful, and
-	 *         <code>ERROR</code> if it was not. Any other status is assumed
-	 *         to represent an incompletion of the undo.
-	 * @throws ExecutionException
-	 *             if an exception occurred during undo.
-	 */
-	IStatus undo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException;
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/LinearUndoEnforcer.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/LinearUndoEnforcer.java
deleted file mode 100644
index 03f0186..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/LinearUndoEnforcer.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * <p>
- * An operation approver that enforces a strict linear undo. It does not allow
- * the undo or redo of any operation that is not the latest available operation
- * in all of its undo contexts.  This class may be instantiated by clients.
- * </p>
- * 
- * @since 3.1
- */
-public final class LinearUndoEnforcer extends LinearUndoViolationDetector {
-	/**
-	 * Create an instance of LinearUndoEnforcer.
-	 */
-	public LinearUndoEnforcer() {
-		super();
-	}
-
-	/*
-	 * Return whether a linear redo violation is allowable.  A linear redo violation
-	 * is defined as a request to redo a particular operation even if it is not the most
-	 * recently added operation to the redo history.
-	 */
-	protected IStatus allowLinearRedoViolation(IUndoableOperation operation,
-			IUndoContext context, IOperationHistory history, IAdaptable uiInfo) {
-		return Status.CANCEL_STATUS;
-	}
-
-	/*
-	 * Return whether a linear undo violation is allowable.  A linear undo violation
-	 * is defined as a request to undo a particular operation even if it is not the most
-	 * recently added operation to the undo history.
-	 */
-	protected IStatus allowLinearUndoViolation(IUndoableOperation operation,
-			IUndoContext context, IOperationHistory history, IAdaptable uiInfo) {
-		return Status.CANCEL_STATUS;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/LinearUndoViolationDetector.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/LinearUndoViolationDetector.java
deleted file mode 100644
index fbd54d1..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/LinearUndoViolationDetector.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * <p>
- * An abstract class for detecting violations in a strict linear undo/redo
- * model. Once a violation is detected, subclasses implement the specific
- * behavior for indicating whether or not the undo/redo should proceed.
- * </p>
- * 
- * @since 3.1
- */
-public abstract class LinearUndoViolationDetector implements IOperationApprover {
-
-	/**
-	 * Create an instance of LinearUndoViolationDetector.
-	 */
-	public LinearUndoViolationDetector() {
-		super();
-	}
-
-	/**
-	 * Return a status indicating whether a linear redo violation is allowable.
-	 * A linear redo violation is defined as a request to redo a particular
-	 * operation even if it is not the most recently added operation to the redo
-	 * history.
-	 * 
-	 * @param operation
-	 *            the operation for which a linear redo violation has been
-	 *            detected.
-	 * @param context
-	 *            the undo context in which the linear redo violation exists
-	 * @param history
-	 *            the operation history containing the operation
-	 * @param info
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it should minimally contain an adapter
-	 *            for the org.eclipse.swt.widgets.Shell.class.
-	 * 
-	 * @return the IStatus describing whether the redo violation is allowed. The
-	 *         redo will not proceed if the status severity is not
-	 *         <code>OK</code>, and the caller requesting the redo will be
-	 *         returned the status that caused the rejection. Specific status
-	 *         severities will not be interpreted by the history.
-	 */
-
-	protected abstract IStatus allowLinearRedoViolation(
-			IUndoableOperation operation, IUndoContext context,
-			IOperationHistory history, IAdaptable info);
-
-	/**
-	 * Return a status indicating whether a linear undo violation is allowable.
-	 * A linear undo violation is defined as a request to undo a particular
-	 * operation even if it is not the most recently added operation to the undo
-	 * history.
-	 * 
-	 * @param operation
-	 *            the operation for which a linear undo violation has been
-	 *            detected.
-	 * @param context
-	 *            the undo context in which the linear undo violation exists
-	 * @param history
-	 *            the operation history containing the operation
-	 * @param info
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it should minimally contain an adapter
-	 *            for the org.eclipse.swt.widgets.Shell.class.
-	 * 
-	 * @return the IStatus describing whether the undo violation is allowed. The
-	 *         undo will not proceed if the status severity is not
-	 *         <code>OK</code>, and the caller requesting the undo will be
-	 *         returned the status that caused the rejection. Specific status
-	 *         severities will not be interpreted by the history.
-	 */
-	protected abstract IStatus allowLinearUndoViolation(
-			IUndoableOperation operation, IUndoContext context,
-			IOperationHistory history, IAdaptable info);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationApprover#proceedRedoing(org.eclipse.core.commands.operations.IUndoableOperation,
-	 *      org.eclipse.core.commands.operations.IOperationHistory,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public final IStatus proceedRedoing(IUndoableOperation operation,
-			IOperationHistory history, IAdaptable info) {
-		IUndoContext[] contexts = operation.getContexts();
-		for (int i = 0; i < contexts.length; i++) {
-			IUndoContext context = contexts[i];
-			if (history.getRedoOperation(context) != operation) {
-				IStatus status = allowLinearRedoViolation(operation, context,
-						history, info);
-				if (!status.isOK()) {
-					return status;
-				}
-			}
-		}
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationApprover#proceedUndoing(org.eclipse.core.commands.operations.IUndoableOperation,
-	 *      org.eclipse.core.commands.operations.IOperationHistory,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-
-	public final IStatus proceedUndoing(IUndoableOperation operation,
-			IOperationHistory history, IAdaptable info) {
-		IUndoContext[] contexts = operation.getContexts();
-		for (int i = 0; i < contexts.length; i++) {
-			IUndoContext context = contexts[i];
-			if (history.getUndoOperation(context) != operation) {
-				IStatus status = allowLinearUndoViolation(operation, context,
-						history, info);
-				if (!status.isOK()) {
-					return status;
-				}
-			}
-		}
-		return Status.OK_STATUS;
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/ObjectUndoContext.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/ObjectUndoContext.java
deleted file mode 100644
index e0d5eb6..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/ObjectUndoContext.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * <p>
- * An undo context that can be used to represent any given object. Clients
- * can add matching contexts to this context.  This class may be instantiated
- * by clients.
- * </p>
- * 
- * @since 3.1
- */
-public final class ObjectUndoContext extends UndoContext {
-
-	private Object object;
-
-	private String label;
-
-	private List children = new ArrayList();
-
-	/**
-	 * Construct an operation context that represents the given object.
-	 * 
-	 * @param object 
-	 *            the object to be represented.
-	 */
-	public ObjectUndoContext(Object object) {
-		this(object, null);
-	}
-
-	/**
-	 * Construct an operation context that represents the given object and has a
-	 * specialized label.
-	 * 
-	 * @param object 
-	 *            the object to be represented.
-	 * @param label 
-	 *            the label for the context
-	 */
-	public ObjectUndoContext(Object object, String label) {
-		super();
-		this.object = object;
-		this.label = label;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoContext#getLabel()
-	 */
-	public String getLabel() {
-		if (label != null) {
-			return label;
-		}
-		if (object != null) {
-			return object.toString();
-		}
-		return super.getLabel();
-	}
-
-	/**
-	 * Return the object that is represented by this context.
-	 * 
-	 * @return the object represented by this context.
-	 */
-	public Object getObject() {
-		return object;
-	}
-
-	/**
-	 * Add the specified context as a match of this context. Contexts added as
-	 * matches of this context will be interpreted as a match of this context
-	 * when the history is filtered for a particular context. Adding a match
-	 * allows components to create their own contexts for implementing
-	 * specialized behavior, yet have their operations appear in a more
-	 * global context.
-	 * 
-	 * @param context 
-	 *            the context to be added as a match of this context
-	 */
-	public void addMatch(IUndoContext context) {
-		children.add(context);
-	}
-
-	/**
-	 * Remove the specified context as a match of this context. The context will
-	 * no longer be interpreted as a match of this context when the history is
-	 * filtered for a particular context. This method has no effect if the
-	 * specified context was never previously added as a match.
-	 * 
-	 * @param context 
-	 *            the context to be removed from the list of matches for this
-	 *            context
-	 */
-	public void removeMatch(IUndoContext context) {
-		children.remove(context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoContext#matches(IUndoContext
-	 *      context)
-	 */
-	public boolean matches(IUndoContext context) {
-		// Check first for explicit matches that have been assigned.
-		if (children.contains(context)) {
-			return true;
-		}
-		// Contexts for equal objects are considered matching
-		if (context instanceof ObjectUndoContext && getObject() != null) {
-			return getObject().equals(((ObjectUndoContext)context).getObject());
-		}
-		// Use the normal matching implementation
-		return super.matches(context);
-	}
-	
-	/**
-	 * The string representation of this operation.  Used for debugging purposes only.
-	 * This string should not be shown to an end user.
-	 * 
-	 * @return The string representation.
-	 */
-	public String toString() {
-		return getLabel();
-	}
-
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/OperationHistoryEvent.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/OperationHistoryEvent.java
deleted file mode 100644
index cbaf6b9..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/OperationHistoryEvent.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * <p>
- * OperationHistoryEvent is used to communicate changes that occur in a
- * DefaultOperationHistory, including the addition or removal of operations, and
- * the execution, undo, and redo of operations.
- * </p>
- * <p>
- * Operation history listeners must be prepared to receive notifications from a
- * background thread. Any UI access occurring inside the implementation must be
- * properly synchronized using the techniques specified by the client's widget
- * library.
- * </p>
- * 
- * 
- * @since 3.1
- */
-public final class OperationHistoryEvent {
-
-	/**
-	 * ABOUT_TO_EXECUTE indicates that an operation is about to execute.
-	 * Listeners should prepare for the execution as appropriate. Listeners will
-	 * receive a DONE notification if the operation is successful, or an
-	 * OPERATION_NOT_OK notification if the execution is cancelled or otherwise
-	 * fails. This notification is only received for those operations executed
-	 * by the operation history. Operations that are added to the history after
-	 * execution do not trigger these notifications.
-	 * 
-	 * If the operation successfully executes, clients will also receive a
-	 * notification that it has been added to the history.
-	 * 
-	 * (value is 1).
-	 */
-
-	public static final int ABOUT_TO_EXECUTE = 1;
-
-	/**
-	 * ABOUT_TO_REDO indicates that an operation is about to be redone.
-	 * Listeners should prepare for the redo as appropriate. Listeners will
-	 * receive a REDONE notification if the operation is successful, or an
-	 * OPERATION_NOT_OK notification if the redo is cancelled or otherwise
-	 * fails.
-	 * 
-	 * (value is 2).
-	 */
-	public static final int ABOUT_TO_REDO = 2;
-
-	/**
-	 * ABOUT_TO_UNDO indicates that an operation is about to be undone.
-	 * Listeners should prepare for the undo as appropriate. Listeners will
-	 * receive an UNDONE notification if the operation is successful, or an
-	 * OPERATION_NOT_OK notification if the undo is cancelled or otherwise
-	 * fails.
-	 * 
-	 * (value is 3).
-	 */
-	public static final int ABOUT_TO_UNDO = 3;
-
-	/**
-	 * DONE indicates that an operation has been executed. Listeners can take
-	 * appropriate action, such as revealing any relevant state in the UI. This
-	 * notification is only received for those operations executed by the
-	 * operation history. Operations that are added to the history after
-	 * execution do not trigger this notification.
-	 * 
-	 * Clients will also receive a notification that the operation has been
-	 * added to the history.
-	 * 
-	 * (value is 4).
-	 */
-	public static final int DONE = 4;
-
-	/**
-	 * OPERATION_ADDED indicates that an operation was added to the history.
-	 * Listeners can use this notification to add their undo context to a new
-	 * operation as appropriate or otherwise record the operation.
-	 * 
-	 * (value is 5).
-	 */
-	public static final int OPERATION_ADDED = 5;
-
-	/**
-	 * OPERATION_CHANGED indicates that an operation has changed in some way
-	 * since it was added to the operations history.
-	 * 
-	 * (value is 6).
-	 */
-	public static final int OPERATION_CHANGED = 6;
-
-	/**
-	 * OPERATION_NOT_OK indicates that an operation was attempted and not
-	 * successful. Listeners typically use this when they have prepared for an
-	 * execute, undo, or redo, and need to know that the operation did not
-	 * successfully complete. For example, listeners that turn redraw off before
-	 * an operation is undone would turn redraw on when the operation completes,
-	 * or when this notification is received, since there will be no
-	 * notification of the completion.
-	 * 
-	 * (value is 7).
-	 */
-	public static final int OPERATION_NOT_OK = 7;
-
-	/**
-	 * OPERATION_REMOVED indicates an operation was removed from the history.
-	 * Listeners typically remove any record of the operation that they may have
-	 * kept in their own state. The operation has been disposed by the time
-	 * listeners receive this notification.
-	 * 
-	 * (value is 8).
-	 */
-	public static final int OPERATION_REMOVED = 8;
-
-	/**
-	 * REDONE indicates that an operation was redone. Listeners can take
-	 * appropriate action, such as revealing any relevant state in the UI.
-	 * 
-	 * (value is 9).
-	 */
-	public static final int REDONE = 9;
-
-	/**
-	 * UNDONE indicates that an operation was undone. Listeners can take
-	 * appropriate action, such as revealing any relevant state in the UI.
-	 * 
-	 * (value is 10).
-	 */
-	public static final int UNDONE = 10;
-
-	private int code = 0;
-
-	private IOperationHistory history;
-
-	private IUndoableOperation operation;
-
-	/* @since 3.2 */
-	private IStatus status;
-
-	/**
-	 * Construct an event for the specified operation history.
-	 * 
-	 * @param code
-	 *            the event code to be used.
-	 * @param history
-	 *            the history triggering the event.
-	 * @param operation
-	 *            the operation involved in the event.
-	 */
-	public OperationHistoryEvent(int code, IOperationHistory history,
-			IUndoableOperation operation) {
-		this(code, history, operation, null);
-	}
-
-	/**
-	 * Construct an event for the specified operation history.
-	 * 
-	 * @param code
-	 *            the event code to be used.
-	 * @param history
-	 *            the history triggering the event.
-	 * @param operation
-	 *            the operation involved in the event.
-	 * @param status
-	 *            the status associated with the event, or null if no status is
-	 *            available.
-	 * 
-	 * @since 3.2
-	 */
-	public OperationHistoryEvent(int code, IOperationHistory history,
-			IUndoableOperation operation, IStatus status) {
-		if (history == null) {
-			throw new NullPointerException();
-		}
-		if (operation == null) {
-			throw new NullPointerException();
-		}
-		this.code = code;
-		this.history = history;
-		this.operation = operation;
-		this.status = status;
-	}
-
-	/**
-	 * Return the type of event that is occurring.
-	 * 
-	 * @return the type code indicating the type of event.
-	 */
-	public int getEventType() {
-		return code;
-	}
-
-	/**
-	 * Return the operation history that triggered this event.
-	 * 
-	 * @return the operation history
-	 */
-
-	public IOperationHistory getHistory() {
-		return history;
-	}
-
-	/**
-	 * Return the operation associated with this event.
-	 * 
-	 * @return the operation
-	 */
-
-	public IUndoableOperation getOperation() {
-		return operation;
-	}
-
-	/**
-	 * Return the status associated with this event.
-	 * 
-	 * @return the status associated with this event. The status may be null.
-	 * 
-	 * @since 3.2
-	 */
-
-	public IStatus getStatus() {
-		return status;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/OperationHistoryFactory.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/OperationHistoryFactory.java
deleted file mode 100644
index b24d746..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/OperationHistoryFactory.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-/**
- * <p>
- * This class is used to maintain the instance of the operation history that
- * should be used by classes that access the undo or redo history and add
- * undoable operations to the history. 
- * 
- * <p>
- * It is intended that an application can create an operation history appropriate
- * for its needs and set it into this class.  Otherwise, a default operation history
- * will be created.  The operation history may only be set one time.  All classes that 
- * access an operations history use this class to obtain the correct instance.  
- * 
- * @since 3.1
- */
-public final class OperationHistoryFactory {
-
-	private static IOperationHistory operationHistory;
-
-	/**
-	 * Return the operation history to be used for managing undoable operations.
-	 * 
-	 * @return the operation history to be used for executing, undoing, and
-	 *         redoing operations.
-	 */
-	public static IOperationHistory getOperationHistory() {
-		if (operationHistory == null) {
-			operationHistory = new DefaultOperationHistory();
-		}
-		return operationHistory;
-	}
-
-	/**
-	 * Set the operation history to be used for managing undoable operations.
-	 * This method may only be called one time, and must be called before any 
-	 * request to get the history.  Attempts to set the operation history will
-	 * be ignored after it has been already set, or after a default one has 
-	 * been created.
-	 * 
-	 * @param history 
-	 *            the operation history to be used for executing, undoing, and
-	 *            redoing operations.
-	 */
-	public static void setOperationHistory(IOperationHistory history) {
-		// If one has already been set or created, ignore this request.
-		if (operationHistory == null) {
-			operationHistory = history;
-		}
-	}
-	
-	private OperationHistoryFactory() {
-		// may not be instantiated
-	}
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/OperationStatus.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/OperationStatus.java
deleted file mode 100644
index 9583d2a..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/OperationStatus.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-import org.eclipse.core.runtime.Status;
-
-/**
- * <p>
- * OperationStatus describes the status of a request to execute, undo, or redo
- * an operation.  This class may be instantiated by clients.
- * </p>
- * 
- * @since 3.1
- */
-public final class OperationStatus extends Status {
-	/**
-	 * NOTHING_TO_REDO indicates there was no operation available for redo.
-	 * 
-	 * (value is 1).
-	 */
-	public static final int NOTHING_TO_REDO = 1;
-
-	/**
-	 * NOTHING_TO_UNDO indicates there was no operation available for undo.
-	 * 
-	 * (value is 2).
-	 */
-	public static final int NOTHING_TO_UNDO = 2;
-
-	/**
-	 * OPERATION_INVALID indicates that the operation available for undo or redo
-	 * is not in a state to successfully perform the undo or redo.
-	 * 
-	 * (value is 3).
-	 */
-	public static final int OPERATION_INVALID = 3;
-
-	/**
-	 * DEFAULT_PLUGIN_ID identifies the default plugin reporting the status.
-	 * 
-	 * (value is "org.eclipse.core.commands").
-	 */
-	static String DEFAULT_PLUGIN_ID = "org.eclipse.core.commands"; //$NON-NLS-1$
-
-	/**
-	 * Creates a new operation status, specifying all properties.
-	 * 
-	 * @param severity
-	 *            the severity for the status
-	 * @param pluginId 
-	 *            the unique identifier of the relevant plug-in
-	 * @param code
-	 *            the informational code for the status
-	 * @param message
-	 *            a human-readable message, localized to the current locale
-	 * @param exception
-	 *            a low-level exception, or <code>null</code> if not
-	 *            applicable
-	 */
-	public OperationStatus(int severity, String pluginId, int code, String message, Throwable exception) {
-		super(severity, pluginId, code, message, exception);
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/TriggeredOperations.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/TriggeredOperations.java
deleted file mode 100644
index 8747181..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/TriggeredOperations.java
+++ /dev/null
@@ -1,465 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-
-/**
- * Triggered operations are a specialized implementation of a composite
- * operation that keeps track of operations triggered by the execution of some
- * primary operation. The composite knows which operation was the trigger for
- * subsequent operations, and adds all triggered operations as children. When
- * execution, undo, or redo is performed, only the triggered operation is
- * executed, undone, or redone if it is still present. If the trigger is removed
- * from the triggered operations, then the child operations will replace the
- * triggered operations in the history.
- * <p>
- * This class may be instantiated by clients.
- * </p>
- * 
- * @since 3.1
- */
-public final class TriggeredOperations extends AbstractOperation implements
-		ICompositeOperation, IAdvancedUndoableOperation,
-		IContextReplacingOperation {
-
-	private IUndoableOperation triggeringOperation;
-
-	private IOperationHistory history;
-
-	private List children = new ArrayList();
-
-	/**
-	 * Construct a composite triggered operations using the specified undoable
-	 * operation as the trigger. Use the label of this trigger as the label of
-	 * the operation.
-	 * 
-	 * @param operation
-	 *            the operation that will trigger other operations.
-	 * @param history
-	 *            the operation history containing the triggered operations.
-	 */
-	public TriggeredOperations(IUndoableOperation operation,
-			IOperationHistory history) {
-		super(operation.getLabel());
-		triggeringOperation = operation;
-		recomputeContexts();
-		this.history = history;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#add(org.eclipse.core.commands.operations.IUndoableOperation)
-	 */
-	public void add(IUndoableOperation operation) {
-		children.add(operation);
-		recomputeContexts();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#remove(org.eclipse.core.commands.operations.IUndoableOperation)
-	 */
-	public void remove(IUndoableOperation operation) {
-		if (operation == triggeringOperation) {
-			// the triggering operation is being removed, so we must replace
-			// this composite with its individual triggers.
-			triggeringOperation = null;
-			// save the children before replacing the operation, since this
-			// operation will be disposed as part of replacing it. We don't want
-			// the children to be disposed since they are to replace this
-			// operation.
-			List childrenToRestore = new ArrayList(children);
-			children = new ArrayList(0);
-			recomputeContexts();
-			operation.dispose();
-			// now replace the triggering operation
-			history.replaceOperation(this,
-					(IUndoableOperation[]) childrenToRestore
-							.toArray(new IUndoableOperation[childrenToRestore
-									.size()]));
-		} else {
-			children.remove(operation);
-			operation.dispose();
-			recomputeContexts();
-		}
-	}
-
-	/**
-	 * Remove the specified context from the receiver. This method is typically
-	 * invoked when the history is being flushed for a certain context. In the
-	 * case of triggered operations, if the only context for the triggering
-	 * operation is being removed, then the triggering operation must be
-	 * replaced in the operation history with the atomic operations that it
-	 * triggered. If the context being removed is not the only context for the
-	 * triggering operation, the triggering operation will remain, and the
-	 * children will each be similarly checked.
-	 * 
-	 * @param context
-	 *            the undo context being removed from the receiver.
-	 */
-	public void removeContext(IUndoContext context) {
-
-		boolean recompute = false;
-		// first check to see if we are removing the only context of the
-		// triggering operation
-		if (triggeringOperation != null
-				&& triggeringOperation.hasContext(context)) {
-			if (triggeringOperation.getContexts().length == 1) {
-				remove(triggeringOperation);
-				return;
-			}
-			triggeringOperation.removeContext(context);
-			recompute = true;
-		}
-		// the triggering operation remains, check all the children
-		ArrayList toBeRemoved = new ArrayList();
-		for (int i = 0; i < children.size(); i++) {
-			IUndoableOperation child = (IUndoableOperation) children.get(i);
-			if (child.hasContext(context)) {
-				if (child.getContexts().length == 1) {
-					toBeRemoved.add(child);
-				} else {
-					child.removeContext(context);
-				}
-				recompute = true;
-			}
-		}
-		for (int i = 0; i < toBeRemoved.size(); i++) {
-			remove((IUndoableOperation) toBeRemoved.get(i));
-		}
-		if (recompute) {
-			recomputeContexts();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#execute(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		if (triggeringOperation != null) {
-			history.openOperation(this, IOperationHistory.EXECUTE);
-			try {
-				IStatus status = triggeringOperation.execute(monitor, info);
-				history.closeOperation(status.isOK(), false,
-						IOperationHistory.EXECUTE);
-				return status;
-			} catch (ExecutionException e) {
-				history.closeOperation(false, false, IOperationHistory.EXECUTE);
-				throw e;
-			} catch (RuntimeException e) {
-				history.closeOperation(false, false, IOperationHistory.EXECUTE);
-				throw e;	
-			}
-
-		}
-		return IOperationHistory.OPERATION_INVALID_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#redo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus redo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		if (triggeringOperation != null) {
-			history.openOperation(this, IOperationHistory.REDO);
-			List childrenToRestore = new ArrayList(children);
-			try {
-				removeAllChildren();
-				IStatus status = triggeringOperation.redo(monitor, info);
-				if (!status.isOK()) {
-					children = childrenToRestore;
-				}
-				history.closeOperation(status.isOK(), false,
-						IOperationHistory.REDO);
-				return status;
-			} catch (ExecutionException e) {
-				children = childrenToRestore;
-				history.closeOperation(false, false, IOperationHistory.REDO);
-				throw e;
-			} catch (RuntimeException e) {
-				children = childrenToRestore;
-				history.closeOperation(false, false, IOperationHistory.REDO);
-				throw e;	
-			}
-		}
-		return IOperationHistory.OPERATION_INVALID_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#undo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus undo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		if (triggeringOperation != null) {
-			history.openOperation(this, IOperationHistory.UNDO);
-			List childrenToRestore = new ArrayList(children);
-			try {
-				removeAllChildren();
-				IStatus status = triggeringOperation.undo(monitor, info);
-				if (!status.isOK()) {
-					children = childrenToRestore;
-				}
-				history.closeOperation(status.isOK(), false,
-						IOperationHistory.UNDO);
-				return status;
-			} catch (ExecutionException e) {
-				children = childrenToRestore;
-				history.closeOperation(false, false, IOperationHistory.UNDO);
-				throw e;
-			} catch (RuntimeException e) {
-				children = childrenToRestore;
-				history.closeOperation(false, false, IOperationHistory.UNDO);
-				throw e;	
-			}
-		}
-		return IOperationHistory.OPERATION_INVALID_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#canUndo()
-	 */
-	public boolean canUndo() {
-		if (triggeringOperation != null) {
-			return triggeringOperation.canUndo();
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#canExecute()
-	 */
-	public boolean canExecute() {
-		if (triggeringOperation != null) {
-			return triggeringOperation.canExecute();
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#canRedo()
-	 */
-	public boolean canRedo() {
-		if (triggeringOperation != null) {
-			return triggeringOperation.canRedo();
-		}
-		return false;
-	}
-
-	/*
-	 * Dispose all operations in the receiver.
-	 */
-	public void dispose() {
-		for (int i = 0; i < children.size(); i++) {
-			((IUndoableOperation) (children.get(i))).dispose();
-		}
-		if (triggeringOperation != null) {
-			triggeringOperation.dispose();
-		}
-	}
-
-	/*
-	 * Recompute contexts in light of some change in the children
-	 */
-	private void recomputeContexts() {
-		ArrayList allContexts = new ArrayList();
-		if (triggeringOperation != null) {
-			IUndoContext[] contexts = triggeringOperation.getContexts();
-			for (int i = 0; i < contexts.length; i++) {
-				allContexts.add(contexts[i]);
-			}
-		}
-		for (int i = 0; i < children.size(); i++) {
-			IUndoContext[] contexts = ((IUndoableOperation) children.get(i))
-					.getContexts();
-			for (int j = 0; j < contexts.length; j++) {
-				if (!allContexts.contains(contexts[j])) {
-					allContexts.add(contexts[j]);
-				}
-			}
-		}
-		contexts = allContexts;
-
-	}
-
-	/*
-	 * Remove all non-triggering children
-	 */
-	private void removeAllChildren() {
-		IUndoableOperation[] nonTriggers = (IUndoableOperation[]) children
-				.toArray(new IUndoableOperation[children.size()]);
-		for (int i = 0; i < nonTriggers.length; i++) {
-			children.remove(nonTriggers[i]);
-			nonTriggers[i].dispose();
-		}
-	}
-
-	/**
-	 * Return the operation that triggered the other operations in this
-	 * composite.
-	 * 
-	 * @return the IUndoableOperation that triggered the other children.
-	 */
-	public IUndoableOperation getTriggeringOperation() {
-		return triggeringOperation;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IAdvancedModelOperation#getAffectedObjects()
-	 */
-	public Object[] getAffectedObjects() {
-		if (triggeringOperation instanceof IAdvancedUndoableOperation) {
-			return ((IAdvancedUndoableOperation) triggeringOperation)
-					.getAffectedObjects();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IAdvancedModelOperation#aboutToNotify(org.eclipse.core.commands.operations.OperationHistoryEvent)
-	 */
-	public void aboutToNotify(OperationHistoryEvent event) {
-		if (triggeringOperation instanceof IAdvancedUndoableOperation) {
-			((IAdvancedUndoableOperation) triggeringOperation)
-					.aboutToNotify(event);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation#computeUndoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeUndoableStatus(IProgressMonitor monitor)
-			throws ExecutionException {
-		if (triggeringOperation instanceof IAdvancedUndoableOperation) {
-			try {
-				return ((IAdvancedUndoableOperation) triggeringOperation)
-						.computeUndoableStatus(monitor);
-			} catch (OperationCanceledException e) {
-				return Status.CANCEL_STATUS;
-			}
-		}
-		return Status.OK_STATUS;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation#computeRedoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeRedoableStatus(IProgressMonitor monitor)
-			throws ExecutionException {
-		if (triggeringOperation instanceof IAdvancedUndoableOperation) {
-			try {
-				return ((IAdvancedUndoableOperation) triggeringOperation)
-						.computeRedoableStatus(monitor);
-			} catch (OperationCanceledException e) {
-				return Status.CANCEL_STATUS;
-			}
-		}
-		return Status.OK_STATUS;
-
-	}
-
-	/**
-	 * Replace the undo context of the receiver with the provided replacement
-	 * undo context. In the case of triggered operations, all contained
-	 * operations are checked and any occurrence of the original context is
-	 * replaced with the new undo context.
-	 * <p>
-	 * This message has no effect if the original undo context is not present in
-	 * the receiver.
-	 * 
-	 * @param original
-	 *            the undo context which is to be replaced
-	 * @param replacement
-	 *            the undo context which is replacing the original
-	 * @since 3.2
-	 */
-	public void replaceContext(IUndoContext original, IUndoContext replacement) {
-
-		// first check the triggering operation
-		if (triggeringOperation != null
-				&& triggeringOperation.hasContext(original)) {
-			if (triggeringOperation instanceof IContextReplacingOperation) {
-				((IContextReplacingOperation) triggeringOperation)
-						.replaceContext(original, replacement);
-			} else {
-				triggeringOperation.removeContext(original);
-				triggeringOperation.addContext(replacement);
-			}
-		}
-		// Now check all the children
-		for (int i = 0; i < children.size(); i++) {
-			IUndoableOperation child = (IUndoableOperation) children.get(i);
-			if (child.hasContext(original)) {
-				if (child instanceof IContextReplacingOperation) {
-					((IContextReplacingOperation) child).replaceContext(
-							original, replacement);
-				} else {
-					child.removeContext(original);
-					child.addContext(replacement);
-				}
-			}
-		}
-		recomputeContexts();
-	}
-
-	/**
-	 * Add the specified context to the operation. Overridden in
-	 * TriggeredOperations to add the specified undo context to the triggering
-	 * operation.
-	 * 
-	 * @param context
-	 *            the context to be added
-	 * 
-	 * @since 3.2
-	 */
-	public void addContext(IUndoContext context) {
-		if (triggeringOperation != null) {
-			triggeringOperation.addContext(context);
-			recomputeContexts();
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/UndoContext.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/UndoContext.java
deleted file mode 100644
index d0d5bae..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/UndoContext.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.commands.operations;
-
-/**
- * <p>
- * A simple, lightweight undo context that can be used to tag any operation. It
- * does not provided a specialized label. This class may be instantiated by
- * clients. This class may also be subclassed.
- * </p>
- * 
- * @since 3.1
- */
-public class UndoContext implements IUndoContext {
-
-	/**
-	 * <p>
-	 * Get the label that describes the undo context. The default implementation
-	 * returns the empty String. Subclasses may override.
-	 * </p>
-	 * 
-	 * @return the label for the context.
-	 */
-	public String getLabel() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * <p>
-	 * Return whether the specified context is considered a match for the
-	 * receiving context. When a context matches another context, operations
-	 * that have the context are considered to also have the matching context.
-	 * The default implementation checks whether the supplied context is
-	 * identical to this context. Subclasses may override.
-	 * </p>
-	 * 
-	 * @param context
-	 *            the context to be checked against the receiving context.
-	 * 
-	 * @return <code>true</code> if the receiving context can be considered a
-	 *         match for the specified context, and <code>false</code> if it
-	 *         cannot.
-	 */
-	public boolean matches(IUndoContext context) {
-		return context == this;
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/package.html b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/package.html
deleted file mode 100644
index 184442f..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/package.html
+++ /dev/null
@@ -1,26 +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.5 [en] (WinNT; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Classes for the creation of undoable operations which can be added to an operations
-history and later be undone and redone.
-<h2>
-Package Specification</h2>
-An <b>undoable operation</b> is a unit of work that can be executed, undone, and redone.
-Operations can be added to an <b>operation history</b> so that they can later be
-undone and redone according to the undo model for an application.  Operations may be 
-assigned one or more <b>undo contexts</b> which can be used to filter the available 
-operations for undo or redo in the operation history.  Clients may choose to provide
-undo and redo function for all operations in a history, or only for a particular
-undo context in that history.  Operation histories may be configured with an 
-<b>operation approver</b> so that applications can enforce any desired undo model, 
-such as strict linear (LIFO) undo.  This package provides the definition and a 
-basic implementation for operations, undo contexts, histories, and operation
-approvers.
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/package.html b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/package.html
deleted file mode 100644
index 14dabf4..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/package.html
+++ /dev/null
@@ -1,167 +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>Package-level Javadoc</title>
-<link rel="stylesheet" href="http://dev.eclipse.org/default_style.css"
-	type="text/css">
-</head>
-<body style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0)">
-Application programming interfaces for commands and handlers. 
-<h2>Package Specification</h2>
-<p>
-This package provides API and implementation classes to define abstract
-pieces of functionality.  These pieces of functionality are intended to
-provide a common way for plug-ins and the user interface to communicate
-potential behaviour.
-</p>
-<p>
-This package is designed so that its elements can be public and dynamic.  That
-is, elements in this package can appear and disappear over the life of the
-application.
-</p>
-<h3>Command</h3>
-<p>
-A command is an abstract representation for some semantic behaviour.  For
-example, there might be a "copy" command.  How this command actually
-behaves might be dependent on what state your application is in.  It is not
-the actual implementation of that behaviour, and it is not the visual
-representation of that behaviour.
-</p>
-<p>
-Commands are managed by an instance of <code>CommandManager</code>.  In fact, a
-command cannot be constructed directly.  Commands are constructed using the
-method <code>CommandManager.getCommand(String)</code>.  This ensures that there
-is only ever one command with a given identifier ever associated with a command.  
-manager.
-</p>
-<p>
-When a command is first constructed, it is undefined.  An undefined command is
-one that is carrying no information except for an id.  Attempts to interact
-with a command that is undefined will result in a 
-<code>NotDefinedException</code>.  Through this mechanism, it is possible for
-clients to hold references to commands, and still have those commands
-"disappear" (i.e., become undefined).  This is particularly useful in a system
-built around dynamic components (e.g., plug-ins).
-<p>
-Commands can be grouped into categories.  These categories are arbitrary
-groupings, and have no defined behaviour.  These categories might be used in a
-user interface for breaking up a large list of commands into semantically
-similar commands -- making the list easier to navigate.
-</p>
-<p>
-It is also possible to attach listeners to both commands and command managers.
-A listener on a command manager will be notified if the list of defined
-commands or categories changes.
-</p>
-<h4>Examples</h4>
-<blockquote><pre><code>
-	CommandManager manager = new CommandManager();
-	Category category = manager.getCategory("categoryId");
-	category.define("name", "description");
-	Command command = manager.getCommand("commandId");
-	command.define("name", "description", category);
-</code></pre></blockquote>
-<p>This example shows how to create a command from scratch -- with no existing
-manager or categories.</p>
-<blockquote><pre><code>
-	command.undefine();
-	command = null;
-	category.undefine();
-	category = null;
-</code></pre></blockquote>
-<p>If you wish to get rid of the command, then you simply undefine it.  This
-will send notification to the appropriate listeners, and future attempts to
-access it will fail.  If you are the only one holding on to the command, then
-it will be garbage collected.  However, if other people still have a reference
-to the command, then the stub will remain until they respond to the change.</p>
-<blockquote><pre><code>
-	String name;
-	try {
-		name = command.getName();
-	} catch (NotDefinedException e) {
-		// Clean-up my reference to the command.
-		command = null;
-		return;
-	}
-</code></pre></blockquote>
-<p>This shows one way of dealing with commands.  Instead of listening for
-changes to the command, you can simply listen for the exceptions to be thrown.
-When a <code>NotDefinedException</code> is thrown, you can clean up your own
-code.  How you clean up is application dependent.  In this case, the reference
-is cleared and we return from the method.</p>
-<blockquote><pre><code>
-	try {
-		String name = command.getName();
-		
-		// Do all your work in the block.
-		
-	} catch (NotDefinedException e) {
-		// Ignore, or possibly throw an error
-	}
-	
-	...
-	
-	public commandChanged(CommandEvent e) {
-		if (e.hasDefinedChanged()) {
-			command.removeListener(this);
-			command = null;
-		}
-	}
-</code></pre></blockquote>
-<p>Another way is to attach a listener, and then simply ignore the exceptions.
-When the command becomes undefined, you will be notified.  This gives your the
-opportunity to unhook your listener and release your reference.</p>
-
-<h3>Handler</h3>
-<p>
-A handler is the behaviour of a command at a particular point in time.  This is
-the piece that will actually interact with your application model.  For every
-command, there can be zero or more possible handlers.  However, at any one
-time, there is either one handler (i.e., handled) or no handler (i.e.,
-unhandled).
-</p>
-<p>
-Handlers must implement <code>IHandler</code>.  However, there is a convenient
-abstract class, <code>AbstractHandler</code> which provides default behaviour
-for some of the methods in the interface.  It is recommended that developers
-subclass <code>AbstractHandler</code>.
-</p>
-<p>
-Beside functional behaviour, a handler carries with it a map of attribute
-values.  This is a completely optionaly way of carrying extra data.  In the
-case of the <code>AbstractHandler</code>, this map is empty.  Some attributes
-have well defined meanings.  These attributes are defined in
-<code>IHandlerAttributes</code>.
-</p>
-<p>
-Like commands, handlers can have listeners attached to them.  Listeners will be
-notified when the attributes of the handler change.
-</p>
-<p>
-When a handler executes, it is passed an event object
-(<code>ExecutionEvent</code>) that carries with it some pieces of information.
-First of all, it contains the parameters for execution.  Parameters are simple
-key-value pairs that are intended to modify the execution in some way.  The
-event also carries with it a collection of contexts that were active at the
-time of execution.  The event also carries two untyped objects: the triggering
-event and the current application state.  In the case of a graphical tool, the
-triggering event is likely to be the underlying widget toolkit event.  The 
-application state might contain information like widget focus information.  In
-your own application, feel free to use whichever of these event attributes that
-fit your application.
-</p>
-<h4>Examples</h4>
-<blockquote><pre><code>
-	IHandler myHandler = createHandler();
-	command.setHandler(myHandler);
-	
-	ExecutionEvent e = new ExecutionEvent(parameters,contexts,trigger,state);
-	try {
-		command.execute(e);
-	} catch (ExecutionException ex) {
-		// Notify the user, log the problem, etc.
-	}
-</code></pre></blockquote>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/util/Tracing.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/util/Tracing.java
deleted file mode 100644
index 353f877..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/util/Tracing.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.commands.util;
-
-/**
- * <p>
- * A utility class for printing tracing output to the console.
- * </p>
- * <p>
- * Clients must not extend or instantiate this class.
- * </p>
- * 
- * @since 3.2
- */
-public final class Tracing {
-
-	/**
-	 * The separator to place between the component and the message.
-	 */
-	public static final String SEPARATOR = " >>> "; //$NON-NLS-1$
-
-	/**
-	 * <p>
-	 * Prints a tracing message to standard out. The message is prefixed by a
-	 * component identifier and some separator. See the example below.
-	 * </p>
-	 * 
-	 * <pre>
-	 *        BINDINGS &gt;&gt; There are 4 deletion markers
-	 * </pre>
-	 * 
-	 * @param component
-	 *            The component for which this tracing applies; may be
-	 *            <code>null</code>
-	 * @param message
-	 *            The message to print to standard out; may be <code>null</code>.
-	 */
-	public static final void printTrace(final String component,
-			final String message) {
-		StringBuffer buffer = new StringBuffer();
-		if (component != null) {
-			buffer.append(component);
-		}
-		if ((component != null) && (message != null)) {
-			buffer.append(SEPARATOR);
-		}
-		if (message != null) {
-			buffer.append(message);
-		}
-		System.out.println(buffer.toString());
-	}
-
-	/**
-	 * This class is not intended to be instantiated.
-	 */
-	private Tracing() {
-		// Do nothing.
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/internal/commands/operations/GlobalUndoContext.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/internal/commands/operations/GlobalUndoContext.java
deleted file mode 100644
index daae4b9..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/internal/commands/operations/GlobalUndoContext.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.commands.operations;
-
-import org.eclipse.core.commands.operations.IUndoContext;
-
-/**
- * <p>
- * An operation context that matches to any context.  It can be used to 
- * get an unfiltered (global) history.
- * </p>
- * 
- * @since 3.1
- */
-public class GlobalUndoContext implements IUndoContext {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.operations.IUndoContext#getLabel()
-	 */
-	public String getLabel() {
-		return "Global Undo Context"; //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.operations.IUndoContext#matches(IUndoContext context)
-	 */
-	public boolean matches(IUndoContext context) {
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.core.commands/src/org/eclipse/core/internal/commands/util/Util.java b/bundles/org.eclipse.core.commands/src/org/eclipse/core/internal/commands/util/Util.java
deleted file mode 100644
index 3d5d505..0000000
--- a/bundles/org.eclipse.core.commands/src/org/eclipse/core/internal/commands/util/Util.java
+++ /dev/null
@@ -1,357 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.commands.util;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-/**
- * A class providing utility functions for the commands plug-in.
- * 
- * @since 3.1
- */
-public final class Util {
-
-    /**
-     * A shared, unmodifiable, empty, sorted map. This value is guaranteed to
-     * always be the same.
-     */
-    public final static SortedMap EMPTY_SORTED_MAP = Collections
-            .unmodifiableSortedMap(new TreeMap());
-
-    /**
-     * A shared, unmodifiable, empty, sorted set. This value is guaranteed to
-     * always be the same.
-     */
-    public final static SortedSet EMPTY_SORTED_SET = Collections
-            .unmodifiableSortedSet(new TreeSet());
-
-    /**
-     * A shared, zero-length string -- for avoiding non-externalized string
-     * tags. This value is guaranteed to always be the same.
-     */
-    public final static String ZERO_LENGTH_STRING = ""; //$NON-NLS-1$
-
-    /**
-     * Asserts the the given object is an instance of the given class --
-     * optionally allowing the object to be <code>null</code>.
-     * 
-     * @param object
-     *            The object for which the type should be checked.
-     * @param c
-     *            The class that the object must be; fails if the class is
-     *            <code>null</code>.
-     * @param allowNull
-     *            Whether the object being <code>null</code> will not cause a
-     *            failure.
-     */
-    public static final void assertInstance(final Object object, final Class c,
-            final boolean allowNull) {
-        if (object == null && allowNull) {
-			return;
-		}
-
-        if (object == null || c == null) {
-			throw new NullPointerException();
-		} else if (!c.isInstance(object)) {
-			throw new IllegalArgumentException();
-		}
-    }
-
-    /**
-     * Compares two boolean values. <code>false</code> is considered to be
-     * less than <code>true</code>.
-     * 
-     * @param left
-     *            The left value to compare.
-     * @param right
-     *            The right value to compare.
-     * @return <code>-1</code> if <code>left</code> is <code>false</code>
-     *         and <code>right</code> is <code>true</code>;<code>0</code>
-     *         if they are equal; <code>1</code> if <code>left</code> is
-     *         <code>true</code> and <code>right</code> is
-     *         <code>false</code>
-     */
-    public static final int compare(final boolean left, final boolean right) {
-        return left == false ? (right == true ? -1 : 0) : (right == true ? 0
-                : 1);
-    }
-
-    /**
-     * Compares two comparable objects, but with protection against
-     * <code>null</code>.
-     * 
-     * @param left
-     *            The left value to compare; may be <code>null</code>.
-     * @param right
-     *            The right value to compare; may be <code>null</code>.
-     * @return <code>-1</code> if <code>left</code> is <code>null</code>
-     *         and <code>right</code> is not <code>null</code>;
-     *         <code>0</code> if they are both <code>null</code>;
-     *         <code>1</code> if <code>left</code> is not <code>null</code>
-     *         and <code>right</code> is <code>null</code>. Otherwise, the
-     *         result of <code>left.compareTo(right)</code>.
-     */
-    public static final int compare(final Comparable left,
-            final Comparable right) {
-        if (left == null && right == null) {
-			return 0;
-		} else if (left == null) {
-			return -1;
-		} else if (right == null) {
-			return 1;
-		} else {
-			return left.compareTo(right);
-		}
-    }
-
-    /**
-     * Compares two integer values. This method fails if the distance between
-     * <code>left</code> and <code>right</code> is greater than
-     * <code>Integer.MAX_VALUE</code>.
-     * 
-     * @param left
-     *            The left value to compare.
-     * @param right
-     *            The right value to compare.
-     * @return <code>left - right</code>
-     */
-    public static final int compare(final int left, final int right) {
-        return left - right;
-    }
-
-    /**
-     * Compares two objects that are not otherwise comparable. If neither object
-     * is <code>null</code>, then the string representation of each object is
-     * used.
-     * 
-     * @param left
-     *            The left value to compare. The string representation of this
-     *            value must not be <code>null</code>.
-     * @param right
-     *            The right value to compare. The string representation of this
-     *            value must not be <code>null</code>.
-     * @return <code>-1</code> if <code>left</code> is <code>null</code>
-     *         and <code>right</code> is not <code>null</code>;
-     *         <code>0</code> if they are both <code>null</code>;
-     *         <code>1</code> if <code>left</code> is not <code>null</code>
-     *         and <code>right</code> is <code>null</code>. Otherwise, the
-     *         result of
-     *         <code>left.toString().compareTo(right.toString())</code>.
-     */
-    public static final int compare(final Object left, final Object right) {
-        if (left == null && right == null) {
-			return 0;
-		} else if (left == null) {
-			return -1;
-		} else if (right == null) {
-			return 1;
-		} else {
-			return left.toString().compareTo(right.toString());
-		}
-    }
-
-    /**
-     * Decides whether two booleans are equal.
-     * 
-     * @param left
-     *            The first boolean to compare; may be <code>null</code>.
-     * @param right
-     *            The second boolean to compare; may be <code>null</code>.
-     * @return <code>true</code> if the booleans are equal; <code>false</code>
-     *         otherwise.
-     */
-    public static final boolean equals(final boolean left, final boolean right) {
-        return left == right;
-    }
-
-    /**
-     * Decides whether two objects are equal -- defending against
-     * <code>null</code>.
-     * 
-     * @param left
-     *            The first object to compare; may be <code>null</code>.
-     * @param right
-     *            The second object to compare; may be <code>null</code>.
-     * @return <code>true</code> if the objects are equals; <code>false</code>
-     *         otherwise.
-     */
-    public static final boolean equals(final Object left, final Object right) {
-        return left == null ? right == null : ((right != null) && left
-                .equals(right));
-    }
-
-	/**
-	 * Tests whether two arrays of objects are equal to each other. The arrays
-	 * must not be <code>null</code>, but their elements may be
-	 * <code>null</code>.
-	 * 
-	 * @param leftArray
-	 *            The left array to compare; may be <code>null</code>, and
-	 *            may be empty and may contain <code>null</code> elements.
-	 * @param rightArray
-	 *            The right array to compare; may be <code>null</code>, and
-	 *            may be empty and may contain <code>null</code> elements.
-	 * @return <code>true</code> if the arrays are equal length and the
-	 *         elements at the same position are equal; <code>false</code>
-	 *         otherwise.
-	 */
-	public static final boolean equals(final Object[] leftArray,
-			final Object[] rightArray) {
-		if (leftArray == null) {
-			return (rightArray == null);
-		} else if (rightArray == null) {
-			return false;
-		}
-
-		if (leftArray.length != rightArray.length) {
-			return false;
-		}
-
-		for (int i = 0; i < leftArray.length; i++) {
-			final Object left = leftArray[i];
-			final Object right = rightArray[i];
-			final boolean equal = (left == null) ? (right == null) : (left
-					.equals(right));
-			if (!equal) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-    /**
-     * Computes the hash code for an integer.
-     * 
-     * @param i
-     *            The integer for which a hash code should be computed.
-     * @return <code>i</code>.
-     */
-    public static final int hashCode(final int i) {
-        return i;
-    }
-
-    /**
-     * Computes the hash code for an object, but with defense against
-     * <code>null</code>.
-     * 
-     * @param object
-     *            The object for which a hash code is needed; may be
-     *            <code>null</code>.
-     * @return The hash code for <code>object</code>; or <code>0</code> if
-     *         <code>object</code> is <code>null</code>.
-     */
-    public static final int hashCode(final Object object) {
-        return object != null ? object.hashCode() : 0;
-    }
-
-    /**
-     * Makes a type-safe copy of the given map. This method should be used when
-     * a map is crossing an API boundary (i.e., from a hostile plug-in into
-     * internal code, or vice versa).
-     * 
-     * @param map
-     *            The map which should be copied; must not be <code>null</code>.
-     * @param keyClass
-     *            The class that all the keys must be; must not be
-     *            <code>null</code>.
-     * @param valueClass
-     *            The class that all the values must be; must not be
-     *            <code>null</code>.
-     * @param allowNullKeys
-     *            Whether <code>null</code> keys should be allowed.
-     * @param allowNullValues
-     *            Whether <code>null</code> values should be allowed.
-     * @return A copy of the map; may be empty, but never <code>null</code>.
-     */
-    public static final Map safeCopy(final Map map, final Class keyClass,
-            final Class valueClass, final boolean allowNullKeys,
-            final boolean allowNullValues) {
-        if (map == null || keyClass == null || valueClass == null) {
-			throw new NullPointerException();
-		}
-
-        final Map copy = Collections.unmodifiableMap(new HashMap(map));
-        final Iterator iterator = copy.entrySet().iterator();
-
-        while (iterator.hasNext()) {
-            final Map.Entry entry = (Map.Entry) iterator.next();
-            assertInstance(entry.getKey(), keyClass, allowNullKeys);
-            assertInstance(entry.getValue(), valueClass, allowNullValues);
-        }
-
-        return map;
-    }
-
-    /**
-     * Makes a type-safe copy of the given set. This method should be used when
-     * a set is crossing an API boundary (i.e., from a hostile plug-in into
-     * internal code, or vice versa).
-     * 
-     * @param set
-     *            The set which should be copied; must not be <code>null</code>.
-     * @param c
-     *            The class that all the values must be; must not be
-     *            <code>null</code>.
-     * @return A copy of the set; may be empty, but never <code>null</code>.
-     *         None of its element will be <code>null</code>.
-     */
-    public static final Set safeCopy(final Set set, final Class c) {
-        return safeCopy(set, c, false);
-    }
-
-    /**
-     * Makes a type-safe copy of the given set. This method should be used when
-     * a set is crossing an API boundary (i.e., from a hostile plug-in into
-     * internal code, or vice versa).
-     * 
-     * @param set
-     *            The set which should be copied; must not be <code>null</code>.
-     * @param c
-     *            The class that all the values must be; must not be
-     *            <code>null</code>.
-     * @param allowNullElements
-     *            Whether null values should be allowed.
-     * @return A copy of the set; may be empty, but never <code>null</code>.
-     */
-    public static final Set safeCopy(final Set set, final Class c,
-            final boolean allowNullElements) {
-        if (set == null || c == null) {
-			throw new NullPointerException();
-		}
-
-        final Set copy = Collections.unmodifiableSet(new HashSet(set));
-        final Iterator iterator = copy.iterator();
-
-        while (iterator.hasNext()) {
-			assertInstance(iterator.next(), c, allowNullElements);
-		}
-
-        return set;
-    }
-
-    /**
-     * The utility class is meant to just provide static members.
-     */
-    private Util() {
-        // Should not be called.
-    }
-}
diff --git a/bundles/org.eclipse.core.databinding.beans/.classpath b/bundles/org.eclipse.core.databinding.beans/.classpath
deleted file mode 100644
index ce73933..0000000
--- a/bundles/org.eclipse.core.databinding.beans/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.core.databinding.beans/.cvsignore b/bundles/org.eclipse.core.databinding.beans/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.core.databinding.beans/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.core.databinding.beans/.project b/bundles/org.eclipse.core.databinding.beans/.project
deleted file mode 100644
index 85f5bb3..0000000
--- a/bundles/org.eclipse.core.databinding.beans/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.databinding.beans</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.core.databinding.beans/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.core.databinding.beans/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index a274426..0000000
--- a/bundles/org.eclipse.core.databinding.beans/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,353 +0,0 @@
-#Mon Dec 03 13:50:43 EST 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=80
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=tab
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.core.databinding.beans/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.core.databinding.beans/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 7550681..0000000
--- a/bundles/org.eclipse.core.databinding.beans/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,116 +0,0 @@
-#Mon Dec 03 13:50:43 EST 2007
-cleanup.add_default_serial_version_id=true
-cleanup.add_generated_serial_version_id=false
-cleanup.add_missing_annotations=true
-cleanup.add_missing_deprecated_annotations=true
-cleanup.add_missing_methods=false
-cleanup.add_missing_nls_tags=false
-cleanup.add_missing_override_annotations=true
-cleanup.add_serial_version_id=false
-cleanup.always_use_blocks=true
-cleanup.always_use_parentheses_in_expressions=false
-cleanup.always_use_this_for_non_static_field_access=false
-cleanup.always_use_this_for_non_static_method_access=false
-cleanup.convert_to_enhanced_for_loop=false
-cleanup.correct_indentation=false
-cleanup.format_source_code=false
-cleanup.format_source_code_changes_only=false
-cleanup.make_local_variable_final=true
-cleanup.make_parameters_final=false
-cleanup.make_private_fields_final=true
-cleanup.make_variable_declarations_final=false
-cleanup.never_use_blocks=false
-cleanup.never_use_parentheses_in_expressions=true
-cleanup.organize_imports=false
-cleanup.qualify_static_field_accesses_with_declaring_class=false
-cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-cleanup.qualify_static_member_accesses_with_declaring_class=true
-cleanup.qualify_static_method_accesses_with_declaring_class=false
-cleanup.remove_private_constructors=true
-cleanup.remove_trailing_whitespaces=false
-cleanup.remove_trailing_whitespaces_all=true
-cleanup.remove_trailing_whitespaces_ignore_empty=false
-cleanup.remove_unnecessary_casts=true
-cleanup.remove_unnecessary_nls_tags=true
-cleanup.remove_unused_imports=true
-cleanup.remove_unused_local_variables=false
-cleanup.remove_unused_private_fields=true
-cleanup.remove_unused_private_members=false
-cleanup.remove_unused_private_methods=true
-cleanup.remove_unused_private_types=true
-cleanup.sort_members=false
-cleanup.sort_members_all=false
-cleanup.use_blocks=false
-cleanup.use_blocks_only_for_return_and_throw=false
-cleanup.use_parentheses_in_expressions=false
-cleanup.use_this_for_non_static_field_access=false
-cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-cleanup.use_this_for_non_static_method_access=false
-cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-cleanup_profile=org.eclipse.jdt.ui.default.eclipse_clean_up_profile
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=false
-formatter_profile=org.eclipse.jdt.ui.default.eclipse_profile
-formatter_settings_version=11
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.ignorelowercasenames=true
-org.eclipse.jdt.ui.importorder=java;javax;org;com;
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.ondemandthreshold=99
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.staticondemandthreshold=99
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} The ${bare_field_name} to set.\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n ******************************************************************************/\r\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @since 3.3\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template></templates>
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.format_source_code=false
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=false
-sp_cleanup.organize_imports=true
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=false
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/bundles/org.eclipse.core.databinding.beans/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.core.databinding.beans/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 4ea08b3..0000000
--- a/bundles/org.eclipse.core.databinding.beans/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,18 +0,0 @@
-#Mon Dec 03 13:51:14 EST 2007
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=0
-compilers.p.illegal-att-value=0
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=2
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=0
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=0
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/bundles/org.eclipse.core.databinding.beans/META-INF/MANIFEST.MF b/bundles/org.eclipse.core.databinding.beans/META-INF/MANIFEST.MF
deleted file mode 100644
index 1fb71fc..0000000
--- a/bundles/org.eclipse.core.databinding.beans/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,13 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.core.databinding.beans
-Bundle-Version: 1.2.0.qualifier
-Bundle-ClassPath: .
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.core.databinding.beans,
- org.eclipse.core.internal.databinding.beans;x-internal:=true
-Require-Bundle: org.eclipse.core.databinding;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.equinox.common;bundle-version="[3.2.0,4.0.0)"
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/bundles/org.eclipse.core.databinding.beans/about.html b/bundles/org.eclipse.core.databinding.beans/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.core.databinding.beans/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.databinding.beans/build.properties b/bundles/org.eclipse.core.databinding.beans/build.properties
deleted file mode 100644
index 6f0a513..0000000
--- a/bundles/org.eclipse.core.databinding.beans/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = .,\
-               META-INF/,\
-               plugin.properties,\
-               about.html
-output.databinding.jar = bin/
-src.includes = about.html
-source.. = src/
diff --git a/bundles/org.eclipse.core.databinding.beans/plugin.properties b/bundles/org.eclipse.core.databinding.beans/plugin.properties
deleted file mode 100644
index 083e360..0000000
--- a/bundles/org.eclipse.core.databinding.beans/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName = JFace Data Binding for JavaBeans
-providerName = Eclipse.org
diff --git a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/databinding/beans/BeansObservables.java b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/databinding/beans/BeansObservables.java
deleted file mode 100644
index ba7d621..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/databinding/beans/BeansObservables.java
+++ /dev/null
@@ -1,942 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bugs 164268, 171616, 147515
- *     Matthew Hall - bug 221704, 234686, 246625, 226289, 246782
- *     Thomas Kratz - bug 213787
- *******************************************************************************/
-package org.eclipse.core.databinding.beans;
-
-import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-
-import org.eclipse.core.databinding.BindingException;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.internal.databinding.Util;
-import org.eclipse.core.internal.databinding.beans.BeanObservableListDecorator;
-import org.eclipse.core.internal.databinding.beans.BeanObservableMapDecorator;
-import org.eclipse.core.internal.databinding.beans.BeanObservableSetDecorator;
-import org.eclipse.core.internal.databinding.beans.BeanObservableValueDecorator;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableList;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableMap;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableSet;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableValue;
-import org.eclipse.core.internal.databinding.beans.JavaBeanPropertyObservableMap;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * A factory for creating observable objects of Java objects that conform to the
- * <a href="http://java.sun.com/products/javabeans/docs/spec.html">JavaBean
- * specification</a> for bound properties.
- * 
- * @since 1.1
- * 
- */
-final public class BeansObservables {
-
-	/**
-	 * 
-	 */
-	public static final boolean DEBUG = true;
-
-	/**
-	 * Returns an observable value in the default realm tracking the current
-	 * value of the named property of the given bean.
-	 * 
-	 * @param bean
-	 *            the object
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable value tracking the current value of the named
-	 *         property of the given bean
-	 */
-	public static IObservableValue observeValue(Object bean, String propertyName) {
-		return observeValue(Realm.getDefault(), bean, propertyName);
-	}
-
-	/**
-	 * Returns an observable value in the given realm tracking the current value
-	 * of the named property of the given bean.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param bean
-	 *            the object
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable value tracking the current value of the named
-	 *         property of the given bean
-	 */
-	public static IObservableValue observeValue(Realm realm, Object bean,
-			String propertyName) {
-		PropertyDescriptor descriptor = getPropertyDescriptor(bean.getClass(),
-				propertyName);
-		return new JavaBeanObservableValue(realm, bean, descriptor);
-	}
-
-	/**
-	 * Returns an observable map in the default realm tracking the current
-	 * values of the named property for the beans in the given set.
-	 * 
-	 * @param domain
-	 *            the set of bean objects
-	 * @param beanClass
-	 *            the common base type of bean objects that may be in the set
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable map tracking the current values of the named
-	 *         property for the beans in the given domain set
-	 */
-	public static IObservableMap observeMap(IObservableSet domain,
-			Class beanClass, String propertyName) {
-		PropertyDescriptor descriptor = getPropertyDescriptor(beanClass,
-				propertyName);
-		return new JavaBeanObservableMap(domain, descriptor);
-	}
-
-	/**
-	 * Returns an observable map in the given realm tracking the map-typed named
-	 * property of the given bean object.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param bean
-	 *            the bean object
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable map tracking the map-typed named property of the
-	 *         given bean object
-	 * @since 1.1
-	 */
-	public static IObservableMap observeMap(Realm realm, Object bean,
-			String propertyName) {
-		return observeMap(realm, bean, propertyName, null, null);
-	}
-
-	/**
-	 * Returns an observable map in the given realm tracking the map-typed named
-	 * property of the given bean object.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param bean
-	 *            the bean object
-	 * @param propertyName
-	 *            the name of the property
-	 * @param keyType
-	 *            the element type of the observable map's key set, or
-	 *            <code>null</code> if untyped
-	 * @param valueType
-	 *            the element type of the observable map's values collection, or
-	 *            <code>null</code> if untyped
-	 * @return an observable map tracking the map-typed named property of the
-	 *         given bean object
-	 * @since 1.2
-	 */
-	public static IObservableMap observeMap(Realm realm, Object bean,
-			String propertyName, Class keyType, Class valueType) {
-		PropertyDescriptor descriptor = getPropertyDescriptor(bean.getClass(),
-				propertyName);
-		return new JavaBeanPropertyObservableMap(realm, bean, descriptor,
-				keyType, valueType);
-	}
-
-	/**
-	 * Returns an observable map in the default realm tracking the map-typed
-	 * named property of the given bean object.
-	 * 
-	 * @param bean
-	 *            the bean object
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable map tracking the map-typed named property of the
-	 *         given bean object
-	 * @since 1.2
-	 */
-	public static IObservableMap observeMap(Object bean, String propertyName) {
-		return observeMap(Realm.getDefault(), bean, propertyName, null, null);
-	}
-
-	/**
-	 * Returns an observable map in the default realm tracking the map-typed
-	 * named property of the given bean object.
-	 * 
-	 * @param bean
-	 *            the bean object
-	 * @param propertyName
-	 *            the name of the property
-	 * @param keyType
-	 *            the element type of the observable map's key set, or
-	 *            <code>null</code> if untyped
-	 * @param valueType
-	 *            the element type of the observable map's values collection, or
-	 *            <code>null</code> if untyped
-	 * @return an observable map tracking the map-typed named property of the
-	 *         given bean object
-	 * @since 1.2
-	 */
-	public static IObservableMap observeMap(Object bean, String propertyName, Class keyType, Class valueType) {
-		return observeMap(Realm.getDefault(), bean, propertyName, keyType, valueType);
-	}
-
-	/*package*/ static PropertyDescriptor getPropertyDescriptor(Class beanClass,
-			String propertyName) {
-		BeanInfo beanInfo;
-		try {
-			beanInfo = Introspector.getBeanInfo(beanClass);
-		} catch (IntrospectionException e) {
-			// cannot introspect, give up
-			return null;
-		}
-		PropertyDescriptor[] propertyDescriptors = beanInfo
-				.getPropertyDescriptors();
-		for (int i = 0; i < propertyDescriptors.length; i++) {
-			PropertyDescriptor descriptor = propertyDescriptors[i];
-			if (descriptor.getName().equals(propertyName)) {
-				return descriptor;
-			}
-		}
-		throw new BindingException(
-				"Could not find property with name " + propertyName + " in class " + beanClass); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Returns an array of observable maps in the default realm tracking the
-	 * current values of the named propertys for the beans in the given set.
-	 * 
-	 * @param domain
-	 *            the set of objects
-	 * @param beanClass
-	 *            the common base type of objects that may be in the set
-	 * @param propertyNames
-	 *            the array of property names
-	 * @return an array of observable maps tracking the current values of the
-	 *         named propertys for the beans in the given domain set
-	 */
-	public static IObservableMap[] observeMaps(IObservableSet domain,
-			Class beanClass, String[] propertyNames) {
-		IObservableMap[] result = new IObservableMap[propertyNames.length];
-		for (int i = 0; i < propertyNames.length; i++) {
-			result[i] = observeMap(domain, beanClass, propertyNames[i]);
-		}
-		return result;
-	}
-
-	/**
-	 * Returns an observable list in the given realm tracking the
-	 * collection-typed named property of the given bean object. The returned
-	 * list is mutable.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param bean
-	 *            the object
-	 * @param propertyName
-	 *            the name of the collection-typed property
-	 * @return an observable list tracking the collection-typed named property
-	 *         of the given bean object
-	 * @see #observeList(Realm, Object, String, Class)
-	 */
-	public static IObservableList observeList(Realm realm, Object bean,
-			String propertyName) {
-		return observeList(realm, bean, propertyName, null);
-	}
-
-	/**
-	 * Returns an observable list in the default realm tracking the
-	 * collection-typed named property of the given bean object. The returned
-	 * list is mutable.
-	 * 
-	 * @param bean
-	 *            the object
-	 * @param propertyName
-	 *            the name of the collection-typed property
-	 * @return an observable list tracking the collection-typed named property
-	 *         of the given bean object
-	 * @see #observeList(Realm, Object, String, Class)
-	 * @since 1.2
-	 */
-	public static IObservableList observeList(Object bean, String propertyName) {
-		return observeList(Realm.getDefault(), bean, propertyName);
-	}
-
-	/**
-	 * Returns an observable list in the given realm tracking the
-	 * collection-typed named property of the given bean object. The returned
-	 * list is mutable. When an item is added or removed the setter is invoked
-	 * for the list on the parent bean to provide notification to other
-	 * listeners via <code>PropertyChangeEvents</code>. This is done to
-	 * provide the same behavior as is expected from arrays as specified in the
-	 * bean spec in section 7.2.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param bean
-	 *            the bean object
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 *            type of the elements in the list. If <code>null</code> and
-	 *            the property is an array the type will be inferred. If
-	 *            <code>null</code> and the property type cannot be inferred
-	 *            element type will be <code>null</code>.
-	 * @return an observable list tracking the collection-typed named property
-	 *         of the given bean object
-	 */
-	public static IObservableList observeList(Realm realm, Object bean,
-			String propertyName, Class elementType) {
-		PropertyDescriptor propertyDescriptor = getPropertyDescriptor(bean
-				.getClass(), propertyName);
-		elementType = getCollectionElementType(elementType, propertyDescriptor);
-
-		return new JavaBeanObservableList(realm, bean, propertyDescriptor,
-				elementType);
-	}
-
-	/**
-	 * Returns an observable list in the default realm tracking the
-	 * collection-typed named property of the given bean object. The returned
-	 * list is mutable. When an item is added or removed the setter is invoked
-	 * for the list on the parent bean to provide notification to other
-	 * listeners via <code>PropertyChangeEvents</code>. This is done to provide
-	 * the same behavior as is expected from arrays as specified in the bean
-	 * spec in section 7.2.
-	 * 
-	 * @param bean
-	 *            the bean object
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 *            type of the elements in the list. If <code>null</code> and the
-	 *            property is an array the type will be inferred. If
-	 *            <code>null</code> and the property type cannot be inferred
-	 *            element type will be <code>null</code>.
-	 * @return an observable list tracking the collection-typed named property
-	 *         of the given bean object
-	 * @since 1.2
-	 */
-	public static IObservableList observeList(Object bean, String propertyName,
-			Class elementType) {
-		return observeList(Realm.getDefault(), bean, propertyName, elementType);
-	}
-
-	/**
-	 * Returns an observable set in the given realm tracking the
-	 * collection-typed named property of the given bean object
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param bean
-	 *            the bean object
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable set tracking the collection-typed named property of
-	 *         the given bean object
-	 */
-	public static IObservableSet observeSet(Realm realm, Object bean,
-			String propertyName) {
-		return observeSet(realm, bean, propertyName, null);
-	}
-
-	/**
-	 * Returns an observable set in the default realm tracking the
-	 * collection-typed named property of the given bean object
-	 * 
-	 * @param bean
-	 *            the bean object
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable set tracking the collection-typed named property of
-	 *         the given bean object
-	 * @since 1.2
-	 */
-	public static IObservableSet observeSet(Object bean, String propertyName) {
-		return observeSet(Realm.getDefault(), bean, propertyName);
-	}
-
-	/**
-	 * Returns a factory for creating observable values in the given realm,
-	 * tracking the given property of a particular bean object
-	 * 
-	 * @param realm
-	 *            the realm to use
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable value factory
-	 */
-	public static IObservableFactory valueFactory(final Realm realm,
-			final String propertyName) {
-		return new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return observeValue(realm, target, propertyName);
-			}
-		};
-	}
-
-	/**
-	 * Returns a factory for creating observable values in the current default
-	 * realm, tracking the given property of a particular bean object
-	 * 
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable value factory
-	 * @since 1.2
-	 */
-	public static IObservableFactory valueFactory(String propertyName) {
-		return valueFactory(Realm.getDefault(), propertyName);
-	}
-
-	/**
-	 * Returns a factory for creating observable lists in the given realm,
-	 * tracking the given property of a particular bean object
-	 * 
-	 * @param realm
-	 *            the realm to use
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 * @return an observable list factory
-	 */
-	public static IObservableFactory listFactory(final Realm realm,
-			final String propertyName, final Class elementType) {
-		return new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return observeList(realm, target, propertyName, elementType);
-			}
-		};
-	}
-
-	/**
-	 * Returns a factory for creating observable lists in the current default
-	 * realm, tracking the given property of a particular bean object
-	 * 
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 * @return an observable list factory
-	 * @since 1.2
-	 */
-	public static IObservableFactory listFactory(String propertyName,
-			Class elementType) {
-		return listFactory(Realm.getDefault(), propertyName, elementType);
-	}
-
-	/**
-	 * Returns a factory for creating observable sets in the given realm,
-	 * tracking the given property of a particular bean object
-	 * 
-	 * @param realm
-	 *            the realm to use
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable set factory
-	 */
-	public static IObservableFactory setFactory(final Realm realm,
-			final String propertyName) {
-		return new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return observeSet(realm, target, propertyName);
-			}
-		};
-	}
-
-	/**
-	 * Returns a factory for creating observable sets in the current default
-	 * realm, tracking the given property of a particular bean object
-	 * 
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable set factory
-	 * @since 1.2
-	 */
-	public static IObservableFactory setFactory(String propertyName) {
-		return setFactory(Realm.getDefault(), propertyName);
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailValue(master, valueFactory(realm,
-	 propertyName), propertyType)</code>
-	 * 
-	 * @param realm
-	 * @param master
-	 * @param propertyName
-	 * @param propertyType
-	 *            can be <code>null</code>
-	 * @return an observable value that tracks the current value of the named
-	 *         property for the current value of the master observable value
-	 * 
-	 * @see MasterDetailObservables
-	 * @deprecated Use
-	 *             {@link #observeDetailValue(IObservableValue, String, Class)}
-	 *             instead
-	 */
-	public static IObservableValue observeDetailValue(Realm realm,
-			IObservableValue master, String propertyName, Class propertyType) {
-		warnIfDifferentRealms(realm, master.getRealm());
-
-		IObservableValue value = MasterDetailObservables.detailValue(master,
-				valueFactory(realm, propertyName), propertyType);
-		BeanObservableValueDecorator decorator = new BeanObservableValueDecorator(
-				value, getValueTypePropertyDescriptor(master, propertyName));
-
-		return decorator;
-	}
-
-	/* package */static void warnIfDifferentRealms(Realm detailRealm,
-			Realm masterRealm) {
-		if (!Util.equals(detailRealm, masterRealm)) {
-			Throwable throwable = new Throwable();
-			throwable.fillInStackTrace();
-			String message = "Detail realm (" + detailRealm //$NON-NLS-1$
-					+ ") not equal to master realm (" //$NON-NLS-1$
-					+ masterRealm + ")"; //$NON-NLS-1$
-			Policy.getLog().log(
-					new Status(IStatus.WARNING, Policy.JFACE_DATABINDING,
-							message, throwable));
-		}
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailValue(master, valueFactory(master.getRealm(), propertyName), propertyType)</code>
-	 * 
-	 * @param master
-	 * @param propertyName
-	 * @param propertyType
-	 *            can be <code>null</code>
-	 * @return an observable value that tracks the current value of the named
-	 *         property for the current value of the master observable value
-	 * 
-	 * @see MasterDetailObservables
-	 * @since 1.2
-	 */
-	public static IObservableValue observeDetailValue(IObservableValue master,
-			String propertyName, Class propertyType) {
-		return observeDetailValue(master.getRealm(), master, propertyName,
-				propertyType);
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailValue(master, valueFactory(realm,
-	 * propertyName), propertyType)</code>.
-	 * This method returns an {@link IBeanObservable} with a
-	 * {@link PropertyDescriptor} based on the given master type and property
-	 * name.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param master
-	 *            the master observable value, for example tracking the
-	 *            selection in a list
-	 * @param masterType
-	 *            the type of the master observable value
-	 * @param propertyName
-	 *            the property name
-	 * @param propertyType
-	 *            can be <code>null</code>
-	 * @return an observable value that tracks the current value of the named
-	 *         property for the current value of the master observable value
-	 * 
-	 * @see MasterDetailObservables
-	 * @since 1.1
-	 * @deprecated Use
-	 *             {@link #observeDetailValue(IObservableValue, Class, String, Class)}
-	 *             instead.
-	 */
-	public static IObservableValue observeDetailValue(Realm realm,
-			IObservableValue master, Class masterType, String propertyName, Class propertyType) {
-		warnIfDifferentRealms(realm, master.getRealm());
-		Assert.isNotNull(masterType, "masterType cannot be null"); //$NON-NLS-1$
-		IObservableValue value = MasterDetailObservables.detailValue(master,
-				valueFactory(realm, propertyName), propertyType);
-		BeanObservableValueDecorator decorator = new BeanObservableValueDecorator(
-				value, getPropertyDescriptor(masterType, propertyName));
-
-		return decorator;
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailValue(master, valueFactory(master.getRealm(), propertyName), propertyType)</code>
-	 * . This method returns an {@link IBeanObservable} with a
-	 * {@link PropertyDescriptor} based on the given master type and property
-	 * name.
-	 * 
-	 * @param master
-	 *            the master observable value, for example tracking the
-	 *            selection in a list
-	 * @param masterType
-	 *            the type of the master observable value
-	 * @param propertyName
-	 *            the property name
-	 * @param propertyType
-	 *            can be <code>null</code>
-	 * @return an observable value that tracks the current value of the named
-	 *         property for the current value of the master observable value
-	 * 
-	 * @see MasterDetailObservables
-	 * @since 1.2
-	 */
-	public static IObservableValue observeDetailValue(IObservableValue master,
-			Class masterType, String propertyName, Class propertyType) {
-		return observeDetailValue(master.getRealm(), master, masterType,
-				propertyName, propertyType);
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailList(master, listFactory(realm,
-	 propertyName, propertyType), propertyType)</code>
-	 * 
-	 * @param realm
-	 * @param master
-	 * @param propertyName
-	 * @param propertyType
-	 *            can be <code>null</code>
-	 * @return an observable list that tracks the named property for the current
-	 *         value of the master observable value
-	 * 
-	 * @see MasterDetailObservables
-	 * @deprecated Use
-	 *             {@link #observeDetailList(IObservableValue, String, Class)}
-	 *             instead
-	 */
-	public static IObservableList observeDetailList(Realm realm,
-			IObservableValue master, String propertyName, Class propertyType) {
-		warnIfDifferentRealms(realm, master.getRealm());
-		IObservableList observableList = MasterDetailObservables.detailList(
-				master, listFactory(realm, propertyName, propertyType),
-				propertyType);
-		BeanObservableListDecorator decorator = new BeanObservableListDecorator(
-				observableList, getValueTypePropertyDescriptor(master,
-						propertyName));
-
-		return decorator;
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailList(master, listFactory(master.getRealm(), propertyName, propertyType), propertyType)</code>
-	 * 
-	 * @param master
-	 * @param propertyName
-	 * @param propertyType
-	 *            can be <code>null</code>
-	 * @return an observable list that tracks the named property for the current
-	 *         value of the master observable value
-	 * 
-	 * @see MasterDetailObservables
-	 * @since 1.2
-	 */
-	public static IObservableList observeDetailList(IObservableValue master,
-			String propertyName, Class propertyType) {
-		return observeDetailList(master.getRealm(), master, propertyName,
-				propertyType);
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailSet(master, setFactory(realm,
-	 propertyName), propertyType)</code>
-	 * 
-	 * @param realm
-	 * @param master
-	 * @param propertyName
-	 * @param propertyType
-	 *            can be <code>null</code>
-	 * @return an observable set that tracks the named property for the current
-	 *         value of the master observable value
-	 * 
-	 * @see MasterDetailObservables
-	 * @deprecated Use
-	 *             {@link #observeDetailSet(IObservableValue, String, Class)}
-	 *             instead.
-	 */
-	public static IObservableSet observeDetailSet(Realm realm,
-			IObservableValue master, String propertyName, Class propertyType) {
-		warnIfDifferentRealms(realm, master.getRealm());
-
-		IObservableSet observableSet = MasterDetailObservables.detailSet(
-				master, setFactory(realm, propertyName, propertyType),
-				propertyType);
-		BeanObservableSetDecorator decorator = new BeanObservableSetDecorator(
-				observableSet, getValueTypePropertyDescriptor(master,
-						propertyName));
-
-		return decorator;
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailSet(master, setFactory(master.getRealm(), propertyName), propertyType)</code>
-	 * 
-	 * @param master
-	 * @param propertyName
-	 * @param propertyType
-	 *            can be <code>null</code>
-	 * @return an observable set that tracks the named property for the current
-	 *         value of the master observable value
-	 * 
-	 * @see MasterDetailObservables
-	 * @since 1.2
-	 */
-	public static IObservableSet observeDetailSet(IObservableValue master,
-			String propertyName, Class propertyType) {
-		return observeDetailSet(master.getRealm(), master, propertyName,
-				propertyType);
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailMap(master, mapFactory(realm, propertyName))</code>
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param master
-	 * @param propertyName
-	 * @return an observable map that tracks the map-type named property for the
-	 *         current value of the master observable value.
-	 * @since 1.1
-	 * @deprecated Use {@link #observeDetailMap(IObservableValue, String)}
-	 *             instead
-	 */
-	public static IObservableMap observeDetailMap(Realm realm,
-			IObservableValue master, String propertyName) {
-		warnIfDifferentRealms(realm, master.getRealm());
-		IObservableMap observableMap = MasterDetailObservables.detailMap(
-				master, mapPropertyFactory(realm, propertyName));
-		BeanObservableMapDecorator decorator = new BeanObservableMapDecorator(
-				observableMap, getValueTypePropertyDescriptor(master,
-						propertyName));
-		return decorator;
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailMap(master, mapFactory(master.getRealm(), propertyName))</code>
-	 * 
-	 * @param master
-	 * @param propertyName
-	 * @return an observable map that tracks the map-type named property for the
-	 *         current value of the master observable value.
-	 * @since 1.2
-	 */
-	public static IObservableMap observeDetailMap(IObservableValue master,
-			String propertyName) {
-		return observeDetailMap(master.getRealm(), master, propertyName);
-	}
-
-	/**
-	 * Returns an observable set in the given realm tracking the
-	 * collection-typed named property of the given bean object. The returned
-	 * set is mutable. When an item is added or removed the setter is invoked
-	 * for the set on the parent bean to provide notification to other listeners
-	 * via <code>PropertyChangeEvents</code>. This is done to provide the same
-	 * behavior as is expected from arrays as specified in the bean spec in
-	 * section 7.2.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param bean
-	 *            the bean object
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 *            type of the elements in the set. If <code>null</code> and the
-	 *            property is an array the type will be inferred. If
-	 *            <code>null</code> and the property type cannot be inferred
-	 *            element type will be <code>null</code>.
-	 * @return an observable set tracking the collection-typed named property of
-	 *         the given bean object
-	 */
-	public static IObservableSet observeSet(Realm realm, Object bean,
-			String propertyName, Class elementType) {
-		PropertyDescriptor propertyDescriptor = getPropertyDescriptor(bean
-				.getClass(), propertyName);
-		elementType = getCollectionElementType(elementType, propertyDescriptor);
-
-		return new JavaBeanObservableSet(realm, bean, propertyDescriptor,
-				elementType);
-	}
-
-	/**
-	 * Returns an observable set in the current default realm tracking the
-	 * collection-typed named property of the given bean object. The returned
-	 * set is mutable. When an item is added or removed the setter is invoked
-	 * for the set on the parent bean to provide notification to other listeners
-	 * via <code>PropertyChangeEvents</code>. This is done to provide the same
-	 * behavior as is expected from arrays as specified in the bean spec in
-	 * section 7.2.
-	 * 
-	 * @param bean
-	 *            the bean object
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 *            type of the elements in the set. If <code>null</code> and the
-	 *            property is an array the type will be inferred. If
-	 *            <code>null</code> and the property type cannot be inferred
-	 *            element type will be <code>null</code>.
-	 * @return an observable set tracking the collection-typed named property of
-	 *         the given bean object
-	 * @since 1.2
-	 */
-	public static IObservableSet observeSet(Object bean, String propertyName,
-			Class elementType) {
-		return observeSet(Realm.getDefault(), bean, propertyName, elementType);
-	}
-
-	/**
-	 * Returns a factory for creating observable sets in the given realm,
-	 * tracking the given property of a particular bean object
-	 * 
-	 * @param realm
-	 *            the realm to use
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 *            type of the elements in the set. If <code>null</code> and the
-	 *            property is an array the type will be inferred. If
-	 *            <code>null</code> and the property type cannot be inferred
-	 *            element type will be <code>null</code>.
-	 * @return a factory for creating observable sets in the given realm,
-	 *         tracking the given property of a particular bean object
-	 */
-	public static IObservableFactory setFactory(final Realm realm,
-			final String propertyName, final Class elementType) {
-		return new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return observeSet(realm, target, propertyName, elementType);
-			}
-		};
-	}
-
-	/**
-	 * Returns a factory for creating observable sets in the current default
-	 * realm, tracking the given property of a particular bean object
-	 * 
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 *            type of the elements in the set. If <code>null</code> and the
-	 *            property is an array the type will be inferred. If
-	 *            <code>null</code> and the property type cannot be inferred
-	 *            element type will be <code>null</code>.
-	 * @return a factory for creating observable sets in the given realm,
-	 *         tracking the given property of a particular bean object
-	 * @since 1.2
-	 */
-	public static IObservableFactory setFactory(String propertyName,
-			Class elementType) {
-		return setFactory(Realm.getDefault(), propertyName, elementType);
-	}
-
-	/**
-	 * Returns a factory for creating an observable map. The factory, when
-	 * provided with an {@link IObservableSet}, will create an
-	 * {@link IObservableMap} in the same realm as the underlying set that
-	 * tracks the current values of the named property for the beans in the
-	 * given set.
-	 * 
-	 * @param beanClass
-	 *            the common base type of bean objects that may be in the set
-	 * @param propertyName
-	 *            the name of the property
-	 * @return a factory for creating {@link IObservableMap} objects
-	 *
-	 * @since 1.1
-	 */
-	public static IObservableFactory setToMapFactory(final Class beanClass, final String propertyName) {
-		return new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return observeMap((IObservableSet) target, beanClass, propertyName);
-			}
-		};
-	}
-	
-	/**
-	 * Returns a factory for creating an observable map. The factory, when
-	 * provided with a bean object, will create an {@link IObservableMap} in the
-	 * given realm that tracks the map-typed named property for the specified
-	 * bean.
-	 * 
-	 * @param realm
-	 *            the realm assigned to observables created by the returned
-	 *            factory.
-	 * @param propertyName
-	 *            the name of the property
-	 * @return a factory for creating {@link IObservableMap} objects.
-	 * @since 1.1
-	 */
-	public static IObservableFactory mapPropertyFactory(final Realm realm,
-			final String propertyName) {
-		return new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return observeMap(realm, target, propertyName);
-			}
-		};
-	}
-
-	/**
-	 * Returns a factory for creating an observable map. The factory, when
-	 * provided with a bean object, will create an {@link IObservableMap} in the
-	 * current default realm that tracks the map-typed named property for the
-	 * specified bean.
-	 * 
-	 * @param propertyName
-	 *            the name of the property
-	 * @return a factory for creating {@link IObservableMap} objects.
-	 * @since 1.2
-	 */
-	public static IObservableFactory mapPropertyFactory(String propertyName) {
-		return mapPropertyFactory(Realm.getDefault(), propertyName);
-	}
-
-	/**
-	 * @param elementType
-	 *            can be <code>null</code>
-	 * @param propertyDescriptor
-	 * @return type of the items in a collection/array property
-	 */
-	/*package*/ static Class getCollectionElementType(Class elementType,
-			PropertyDescriptor propertyDescriptor) {
-		if (elementType == null) {
-			Class propertyType = propertyDescriptor.getPropertyType();
-			elementType = propertyType.isArray() ? propertyType
-					.getComponentType() : Object.class;
-		}
-
-		return elementType;
-	}
-
-	/**
-	 * @param observable
-	 * @param propertyName
-	 * @return property descriptor or <code>null</code>
-	 */
-	/* package*/ static PropertyDescriptor getValueTypePropertyDescriptor(
-			IObservableValue observable, String propertyName) {
-		return (observable.getValueType() != null) ? getPropertyDescriptor(
-				(Class) observable.getValueType(), propertyName) : null;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/databinding/beans/IBeanObservable.java b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/databinding/beans/IBeanObservable.java
deleted file mode 100644
index c2545ef..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/databinding/beans/IBeanObservable.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Brad Reynolds - bug 147515
- ******************************************************************************/
-
-package org.eclipse.core.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-
-import org.eclipse.core.databinding.observable.IObserving;
-
-/**
- * Provides access to details of bean observables.
- * <p>
- * This interface is not meant to be implemented by clients.
- * </p>
- * 
- * @since 3.3
- */
-public interface IBeanObservable extends IObserving {
-	/**
-	 * @return property descriptor of the property being observed,
-	 *         <code>null</code> if the runtime time information was not
-	 *         provided on construction of the observable
-	 */
-	public PropertyDescriptor getPropertyDescriptor();
-}
diff --git a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/databinding/beans/PojoObservables.java b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/databinding/beans/PojoObservables.java
deleted file mode 100644
index 0a5e5f6..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/databinding/beans/PojoObservables.java
+++ /dev/null
@@ -1,763 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bugs 221704, 234686, 246625, 226289, 246782
- *******************************************************************************/
-
-package org.eclipse.core.databinding.beans;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyDescriptor;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.internal.databinding.beans.BeanObservableListDecorator;
-import org.eclipse.core.internal.databinding.beans.BeanObservableMapDecorator;
-import org.eclipse.core.internal.databinding.beans.BeanObservableSetDecorator;
-import org.eclipse.core.internal.databinding.beans.BeanObservableValueDecorator;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableList;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableMap;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableSet;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableValue;
-import org.eclipse.core.internal.databinding.beans.JavaBeanPropertyObservableMap;
-
-/**
- * A factory for creating observable objects for POJOs (plain old java objects)
- * that conform to idea of an object with getters and setters but does not
- * provide {@link PropertyChangeEvent property change events} on change. This
- * factory is identical to {@link BeansObservables} except for this fact.
- * 
- * @since 1.1
- */
-final public class PojoObservables {
-
-	/**
-	 * Returns an observable value in the default realm tracking the current
-	 * value of the named property of the given pojo.
-	 * 
-	 * @param pojo
-	 *            the object
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable value tracking the current value of the named
-	 *         property of the given pojo
-	 */
-	public static IObservableValue observeValue(Object pojo, String propertyName) {
-		return observeValue(Realm.getDefault(), pojo, propertyName);
-	}
-
-	/**
-	 * Returns an observable value in the given realm tracking the current value
-	 * of the named property of the given pojo.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param pojo
-	 *            the object
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable value tracking the current value of the named
-	 *         property of the given pojo
-	 */
-	public static IObservableValue observeValue(Realm realm, Object pojo,
-			String propertyName) {
-
-		PropertyDescriptor descriptor = BeansObservables.getPropertyDescriptor(
-				pojo.getClass(), propertyName);
-		return new JavaBeanObservableValue(realm, pojo, descriptor, false);
-	}
-
-	/**
-	 * Returns an observable map in the default realm tracking the current
-	 * values of the named property for the pojos in the given set.
-	 * 
-	 * @param domain
-	 *            the set of pojo objects
-	 * @param pojoClass
-	 *            the common base type of pojo objects that may be in the set
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable map tracking the current values of the named
-	 *         property for the pojos in the given domain set
-	 */
-	public static IObservableMap observeMap(IObservableSet domain,
-			Class pojoClass, String propertyName) {
-		PropertyDescriptor descriptor = BeansObservables.getPropertyDescriptor(
-				pojoClass, propertyName);
-		return new JavaBeanObservableMap(domain, descriptor, false);
-	}
-
-	/**
-	 * Returns an array of observable maps in the default realm tracking the
-	 * current values of the named propertys for the pojos in the given set.
-	 * 
-	 * @param domain
-	 *            the set of objects
-	 * @param pojoClass
-	 *            the common base type of objects that may be in the set
-	 * @param propertyNames
-	 *            the array of property names
-	 * @return an array of observable maps tracking the current values of the
-	 *         named propertys for the pojos in the given domain set
-	 */
-	public static IObservableMap[] observeMaps(IObservableSet domain,
-			Class pojoClass, String[] propertyNames) {
-		IObservableMap[] result = new IObservableMap[propertyNames.length];
-		for (int i = 0; i < propertyNames.length; i++) {
-			result[i] = observeMap(domain, pojoClass, propertyNames[i]);
-		}
-		return result;
-	}
-
-	/**
-	 * Returns an observable map in the given realm tracking the map-typed named
-	 * property of the given pojo object.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param pojo
-	 *            the pojo object
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable map tracking the map-typed named property of the
-	 *         given pojo object
-	 */
-	public static IObservableMap observeMap(Realm realm, Object pojo,
-			String propertyName) {
-		return observeMap(realm, pojo, propertyName, null, null);
-	}
-
-	/**
-	 * Returns an observable map in the given realm tracking the map-typed named
-	 * property of the given pojo object.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param pojo
-	 *            the pojo object
-	 * @param propertyName
-	 *            the name of the property
-	 * @param keyType
-	 *            the element type of the observable map's key set, or
-	 *            <code>null</code> if untyped
-	 * @param valueType
-	 *            the element type of the observable map's values collection, or
-	 *            <code>null</code> if untyped
-	 * @return an observable map tracking the map-typed named property of the
-	 *         given pojo object
-	 * @since 1.2
-	 */
-	public static IObservableMap observeMap(Realm realm, Object pojo,
-			String propertyName, Class keyType, Class valueType) {
-		PropertyDescriptor descriptor = BeansObservables.getPropertyDescriptor(
-				pojo.getClass(), propertyName);
-		return new JavaBeanPropertyObservableMap(realm, pojo, descriptor,
-				keyType, valueType, false);
-	}
-
-	/**
-	 * Returns an observable map in the default realm tracking the map-typed
-	 * named property of the given pojo object.
-	 * 
-	 * @param pojo
-	 *            the pojo object
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable map tracking the map-typed named property of the
-	 *         given pojo object
-	 * @since 1.2
-	 */
-	public static IObservableMap observeMap(Object pojo, String propertyName) {
-		return observeMap(Realm.getDefault(), pojo, propertyName, null, null);
-	}
-
-	/**
-	 * Returns an observable map in the default realm tracking the map-typed
-	 * named property of the given pojo object.
-	 * 
-	 * @param pojo
-	 *            the pojo object
-	 * @param propertyName
-	 *            the name of the property
-	 * @param keyType
-	 *            the element type of the observable map's key set, or
-	 *            <code>null</code> if untyped
-	 * @param valueType
-	 *            the element type of the observable map's values collection, or
-	 *            <code>null</code> if untyped
-	 * @return an observable map tracking the map-typed named property of the
-	 *         given pojo object
-	 * @since 1.2
-	 */
-	public static IObservableMap observeMap(Object pojo, String propertyName,
-			Class keyType, Class valueType) {
-		return observeMap(Realm.getDefault(), pojo, propertyName, keyType,
-				valueType);
-	}
-
-	/**
-	 * Returns an observable list in the given realm tracking the
-	 * collection-typed named property of the given pojo object. The returned
-	 * list is mutable.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param pojo
-	 *            the object
-	 * @param propertyName
-	 *            the name of the collection-typed property
-	 * @return an observable list tracking the collection-typed named property
-	 *         of the given pojo object
-	 * @see #observeList(Realm, Object, String, Class)
-	 */
-	public static IObservableList observeList(Realm realm, Object pojo,
-			String propertyName) {
-		return observeList(realm, pojo, propertyName, null);
-	}
-
-	/**
-	 * Returns an observable list in the default realm tracking the
-	 * collection-typed named property of the given pojo object. The returned
-	 * list is mutable.
-	 * 
-	 * @param pojo
-	 *            the object
-	 * @param propertyName
-	 *            the name of the collection-typed property
-	 * @return an observable list tracking the collection-typed named property
-	 *         of the given pojo object
-	 * @see #observeList(Realm, Object, String, Class)
-	 * @since 1.2
-	 */
-	public static IObservableList observeList(Object pojo, String propertyName) {
-		return observeList(Realm.getDefault(), pojo, propertyName);
-	}
-
-	/**
-	 * Returns an observable list in the given realm tracking the
-	 * collection-typed named property of the given bean object. The returned
-	 * list is mutable. When an item is added or removed the setter is invoked
-	 * for the list on the parent bean to provide notification to other
-	 * listeners via <code>PropertyChangeEvents</code>. This is done to
-	 * provide the same behavior as is expected from arrays as specified in the
-	 * bean spec in section 7.2.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param pojo
-	 *            the bean object
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 *            type of the elements in the list. If <code>null</code> and
-	 *            the property is an array the type will be inferred. If
-	 *            <code>null</code> and the property type cannot be inferred
-	 *            element type will be <code>null</code>.
-	 * @return an observable list tracking the collection-typed named property
-	 *         of the given bean object
-	 */
-	public static IObservableList observeList(Realm realm, Object pojo,
-			String propertyName, Class elementType) {
-		PropertyDescriptor propertyDescriptor = BeansObservables
-				.getPropertyDescriptor(pojo.getClass(), propertyName);
-		elementType = BeansObservables.getCollectionElementType(elementType,
-				propertyDescriptor);
-
-		return new JavaBeanObservableList(realm, pojo, propertyDescriptor,
-				elementType, false);
-	}
-
-	/**
-	 * Returns an observable list in the default realm tracking the
-	 * collection-typed named property of the given bean object. The returned
-	 * list is mutable. When an item is added or removed the setter is invoked
-	 * for the list on the parent bean to provide notification to other
-	 * listeners via <code>PropertyChangeEvents</code>. This is done to provide
-	 * the same behavior as is expected from arrays as specified in the bean
-	 * spec in section 7.2.
-	 * 
-	 * @param pojo
-	 *            the bean object
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 *            type of the elements in the list. If <code>null</code> and the
-	 *            property is an array the type will be inferred. If
-	 *            <code>null</code> and the property type cannot be inferred
-	 *            element type will be <code>null</code>.
-	 * @return an observable list tracking the collection-typed named property
-	 *         of the given bean object
-	 * @since 1.2
-	 */
-	public static IObservableList observeList(Object pojo, String propertyName,
-			Class elementType) {
-		return observeList(Realm.getDefault(), pojo, propertyName, elementType);
-	}
-
-	/**
-	 * Returns an observable set in the given realm tracking the
-	 * collection-typed named property of the given pojo object.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param pojo
-	 *            the pojo object
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable set tracking the collection-typed named property of
-	 *         the given pojo object
-	 */
-	public static IObservableSet observeSet(Realm realm, Object pojo,
-			String propertyName) {
-		return observeSet(realm, pojo, propertyName, null);
-	}
-
-	/**
-	 * Returns an observable set in the default realm tracking the
-	 * collection-typed named property of the given pojo object.
-	 * 
-	 * @param pojo
-	 *            the pojo object
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable set tracking the collection-typed named property of
-	 *         the given pojo object
-	 * @since 1.2
-	 */
-	public static IObservableSet observeSet(Object pojo, String propertyName) {
-		return observeSet(Realm.getDefault(), pojo, propertyName);
-	}
-
-	/**
-	 * Returns an observable set in the given realm tracking the
-	 * collection-typed named property of the given pojo object.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param pojo
-	 *            the pojo object
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 *            type of the elements in the set. If <code>null</code> and the
-	 *            property is an array the type will be inferred. If
-	 *            <code>null</code> and the property type cannot be inferred
-	 *            element type will be <code>null</code>.
-	 * @return an observable set that tracks the current value of the named
-	 *         property for given pojo object
-	 */
-	public static IObservableSet observeSet(Realm realm, Object pojo,
-			String propertyName, Class elementType) {
-		PropertyDescriptor propertyDescriptor = BeansObservables
-				.getPropertyDescriptor(pojo.getClass(), propertyName);
-		elementType = BeansObservables.getCollectionElementType(elementType,
-				propertyDescriptor);
-
-		return new JavaBeanObservableSet(realm, pojo, propertyDescriptor,
-				elementType, false);
-	}
-
-	/**
-	 * Returns an observable set in the default realm, tracking the
-	 * collection-typed named property of the given pojo object.
-	 * 
-	 * @param pojo
-	 *            the pojo object
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 *            type of the elements in the set. If <code>null</code> and the
-	 *            property is an array the type will be inferred. If
-	 *            <code>null</code> and the property type cannot be inferred
-	 *            element type will be <code>null</code>.
-	 * @return an observable set that tracks the current value of the named
-	 *         property for given pojo object
-	 * @since 1.2
-	 */
-	public static IObservableSet observeSet(Object pojo, String propertyName,
-			Class elementType) {
-		return observeSet(Realm.getDefault(), pojo, propertyName, elementType);
-	}
-
-	/**
-	 * Returns a factory for creating observable values in the given realm,
-	 * tracking the given property of a particular pojo object
-	 * 
-	 * @param realm
-	 *            the realm to use
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable value factory
-	 */
-	public static IObservableFactory valueFactory(final Realm realm,
-			final String propertyName) {
-		return new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return observeValue(realm, target, propertyName);
-			}
-		};
-	}
-
-	/**
-	 * Returns a factory for creating observable values in the current default
-	 * realm, tracking the given property of a particular pojo object
-	 * 
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable value factory
-	 * @since 1.2
-	 */
-	public static IObservableFactory valueFactory(String propertyName) {
-		return valueFactory(Realm.getDefault(), propertyName);
-	}
-
-	/**
-	 * Returns a factory for creating observable lists in the given realm,
-	 * tracking the given property of a particular pojo object
-	 * 
-	 * @param realm
-	 *            the realm to use
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 * @return an observable list factory
-	 */
-	public static IObservableFactory listFactory(final Realm realm,
-			final String propertyName, final Class elementType) {
-		return new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return observeList(realm, target, propertyName, elementType);
-			}
-		};
-	}
-
-	/**
-	 * Returns a factory for creating observable lists in the current default
-	 * realm, tracking the given property of a particular pojo object
-	 * 
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 * @return an observable list factory
-	 * @since 1.2
-	 */
-	public static IObservableFactory listFactory(String propertyName,
-			Class elementType) {
-		return listFactory(Realm.getDefault(), propertyName, elementType);
-	}
-
-	/**
-	 * Returns a factory for creating observable sets in the given realm,
-	 * tracking the given property of a particular pojo object
-	 * 
-	 * @param realm
-	 *            the realm to use
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable set factory
-	 */
-	public static IObservableFactory setFactory(final Realm realm,
-			final String propertyName) {
-		return new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return observeSet(realm, target, propertyName);
-			}
-		};
-	}
-
-	/**
-	 * Returns a factory for creating observable sets in the current default
-	 * realm, tracking the given property of a particular pojo object
-	 * 
-	 * @param propertyName
-	 *            the name of the property
-	 * @return an observable set factory
-	 * @since 1.2
-	 */
-	public static IObservableFactory setFactory(String propertyName) {
-		return setFactory(Realm.getDefault(), propertyName);
-	}
-
-	/**
-	 * Returns a factory for creating observable set in the given realm,
-	 * tracking the given property of a particular pojo object
-	 * 
-	 * @param realm
-	 *            the realm to use
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 *            type of the elements in the set. If <code>null</code> and the
-	 *            property is an array the type will be inferred. If
-	 *            <code>null</code> and the property type cannot be inferred
-	 *            element type will be <code>null</code>.
-	 * @return an observable set factory for creating observable sets
-	 */
-	public static IObservableFactory setFactory(final Realm realm,
-			final String propertyName, final Class elementType) {
-		return new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return observeSet(realm, target, propertyName, elementType);
-			}
-		};
-	}
-
-	/**
-	 * Returns a factory for creating observable set in the current default
-	 * realm, tracking the given property of a particular pojo object
-	 * 
-	 * @param propertyName
-	 *            the name of the property
-	 * @param elementType
-	 *            type of the elements in the set. If <code>null</code> and the
-	 *            property is an array the type will be inferred. If
-	 *            <code>null</code> and the property type cannot be inferred
-	 *            element type will be <code>null</code>.
-	 * @return an observable set factory for creating observable sets
-	 * @since 1.2
-	 */
-	public static IObservableFactory setFactory(String propertyName,
-			Class elementType) {
-		return setFactory(Realm.getDefault(), propertyName, elementType);
-	}
-
-	/**
-	 * Returns a factory for creating an observable map. The factory, when
-	 * provided with a pojo object, will create an {@link IObservableMap} in the
-	 * given realm that tracks the map-typed named property for the specified
-	 * pojo.
-	 * 
-	 * @param realm
-	 *            the realm assigned to observables created by the returned
-	 *            factory.
-	 * @param propertyName
-	 *            the name of the property
-	 * @return a factory for creating {@link IObservableMap} objects.
-	 */
-	public static IObservableFactory mapPropertyFactory(final Realm realm,
-			final String propertyName) {
-		return new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return observeMap(realm, target, propertyName);
-			}
-		};
-	}
-
-	/**
-	 * Returns a factory for creating an observable map. The factory, when
-	 * provided with a pojo object, will create an {@link IObservableMap} in the
-	 * current default realm that tracks the map-typed named property for the
-	 * specified pojo.
-	 * 
-	 * @param propertyName
-	 *            the name of the property
-	 * @return a factory for creating {@link IObservableMap} objects.
-	 * @since 1.2
-	 */
-	public static IObservableFactory mapPropertyFactory(String propertyName) {
-		return mapPropertyFactory(Realm.getDefault(), propertyName);
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailValue(master, valueFactory(realm,
-	 propertyName), propertyType)</code>
-	 * 
-	 * @param realm
-	 * @param master
-	 * @param propertyName
-	 * @param propertyType
-	 *            can be <code>null</code>
-	 * @return an observable value that tracks the current value of the named
-	 *         property for the current value of the master observable value
-	 * 
-	 * @see MasterDetailObservables
-	 * @deprecated Use
-	 *             {@link #observeDetailValue(IObservableValue, String, Class)}
-	 *             instead
-	 */
-	public static IObservableValue observeDetailValue(Realm realm,
-			IObservableValue master, String propertyName, Class propertyType) {
-		BeansObservables.warnIfDifferentRealms(realm, master.getRealm());
-
-		IObservableValue value = MasterDetailObservables.detailValue(master,
-				valueFactory(realm, propertyName), propertyType);
-		BeanObservableValueDecorator decorator = new BeanObservableValueDecorator(
-				value, BeansObservables.getValueTypePropertyDescriptor(master,
-						propertyName));
-
-		return decorator;
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailValue(master, valueFactory(master.getRealm, propertyName), propertyType)</code>
-	 * 
-	 * @param master
-	 * @param propertyName
-	 * @param propertyType
-	 *            can be <code>null</code>
-	 * @return an observable value that tracks the current value of the named
-	 *         property for the current value of the master observable value
-	 * 
-	 * @see MasterDetailObservables
-	 * @since 1.2
-	 */
-	public static IObservableValue observeDetailValue(IObservableValue master,
-			String propertyName, Class propertyType) {
-		return observeDetailValue(master.getRealm(), master, propertyName,
-				propertyType);
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailList(master, listFactory(realm,
-	 propertyName, propertyType), propertyType)</code>
-	 * 
-	 * @param realm
-	 * @param master
-	 * @param propertyName
-	 * @param propertyType
-	 *            can be <code>null</code>
-	 * @return an observable list that tracks the named property for the current
-	 *         value of the master observable value
-	 * 
-	 * @see MasterDetailObservables
-	 * @deprecated Use
-	 *             {@link #observeDetailList(IObservableValue, String, Class)}
-	 *             instead
-	 */
-	public static IObservableList observeDetailList(Realm realm,
-			IObservableValue master, String propertyName, Class propertyType) {
-		BeansObservables.warnIfDifferentRealms(realm, master.getRealm());
-		IObservableList observableList = MasterDetailObservables.detailList(
-				master, listFactory(realm, propertyName, propertyType),
-				propertyType);
-		BeanObservableListDecorator decorator = new BeanObservableListDecorator(
-				observableList, BeansObservables
-						.getValueTypePropertyDescriptor(master, propertyName));
-
-		return decorator;
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailList(master, listFactory(master.getRealm(), propertyName, propertyType), propertyType)</code>
-	 * 
-	 * @param master
-	 * @param propertyName
-	 * @param propertyType
-	 *            can be <code>null</code>
-	 * @return an observable list that tracks the named property for the current
-	 *         value of the master observable value
-	 * 
-	 * @see MasterDetailObservables
-	 * @since 1.2
-	 */
-	public static IObservableList observeDetailList(IObservableValue master,
-			String propertyName, Class propertyType) {
-		return observeDetailList(master.getRealm(), master, propertyName,
-				propertyType);
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailSet(master, setFactory(realm,
-	 propertyName), propertyType)</code>
-	 * 
-	 * @param realm
-	 * @param master
-	 * @param propertyName
-	 * @param propertyType
-	 *            can be <code>null</code>
-	 * @return an observable set that tracks the named property for the current
-	 *         value of the master observable value
-	 * 
-	 * @see MasterDetailObservables
-	 * @deprecated Use
-	 *             {@link #observeDetailSet(IObservableValue, String, Class)}
-	 *             instead.
-	 */
-	public static IObservableSet observeDetailSet(Realm realm,
-			IObservableValue master, String propertyName, Class propertyType) {
-		BeansObservables.warnIfDifferentRealms(realm, master.getRealm());
-
-		IObservableSet observableSet = MasterDetailObservables.detailSet(
-				master, setFactory(realm, propertyName, propertyType),
-				propertyType);
-		BeanObservableSetDecorator decorator = new BeanObservableSetDecorator(
-				observableSet, BeansObservables.getValueTypePropertyDescriptor(
-						master, propertyName));
-
-		return decorator;
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailSet(master, setFactory(master.getRealm(), propertyName), propertyType)</code>
-	 * 
-	 * @param master
-	 * @param propertyName
-	 * @param propertyType
-	 *            can be <code>null</code>
-	 * @return an observable set that tracks the named property for the current
-	 *         value of the master observable value
-	 * 
-	 * @see MasterDetailObservables
-	 * @since 1.2
-	 */
-	public static IObservableSet observeDetailSet(IObservableValue master,
-			String propertyName, Class propertyType) {
-		return observeDetailSet(master.getRealm(), master, propertyName,
-				propertyType);
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailMap(master, mapFactory(realm, propertyName))</code>
-	 * 
-	 * @param realm
-	 * @param master
-	 * @param propertyName
-	 * @return an observable map that tracks the map-type named property for the
-	 *         current value of the master observable value.
-	 * @deprecated Use {@link #observeDetailMap(IObservableValue, String)} instead
-	 */
-	public static IObservableMap observeDetailMap(Realm realm,
-			IObservableValue master, String propertyName) {
-		BeansObservables.warnIfDifferentRealms(realm, master.getRealm());
-		IObservableMap observableMap = MasterDetailObservables.detailMap(
-				master, mapPropertyFactory(realm, propertyName));
-		BeanObservableMapDecorator decorator = new BeanObservableMapDecorator(
-				observableMap, BeansObservables.getValueTypePropertyDescriptor(
-						master, propertyName));
-		return decorator;
-	}
-
-	/**
-	 * Helper method for
-	 * <code>MasterDetailObservables.detailMap(master, mapFactory(master.getRealm(), propertyName))</code>
-	 * 
-	 * @param master
-	 * @param propertyName
-	 * @return an observable map that tracks the map-type named property for the
-	 *         current value of the master observable value.
-	 * @since 1.2
-	 */
-	public static IObservableMap observeDetailMap(IObservableValue master,
-			String propertyName) {
-		return observeDetailMap(master.getRealm(), master, propertyName);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/databinding/beans/package.html b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/databinding/beans/package.html
deleted file mode 100644
index c290e49..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/databinding/beans/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes for observing JavaBeans(tm) objects.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that can be used to observe objects that conform to the <a href="http://java.sun.com/products/javabeans/docs/spec.html">JavaBean specification</a> for bound properties.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableListDecorator.java b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableListDecorator.java
deleted file mode 100644
index a1ef577..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableListDecorator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bugs 208858, 246625
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-
-import org.eclipse.core.databinding.beans.IBeanObservable;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObserving;
-import org.eclipse.core.databinding.observable.list.DecoratingObservableList;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-
-/**
- * {@link IBeanObservable} decorator for an {@link IObservableList}.
- * 
- * @since 3.3
- */
-public class BeanObservableListDecorator extends DecoratingObservableList
-		implements IBeanObservable {
-	private PropertyDescriptor propertyDescriptor;
-
-	/**
-	 * @param decorated
-	 * @param propertyDescriptor
-	 */
-	public BeanObservableListDecorator(IObservableList decorated,
-			PropertyDescriptor propertyDescriptor) {
-		super(decorated, true);
-		this.propertyDescriptor = propertyDescriptor;
-	}
-
-	public synchronized void dispose() {
-		this.propertyDescriptor = null;
-		super.dispose();
-	}
-
-	public Object getObserved() {
-		IObservable decorated = getDecorated();
-		if (decorated instanceof IObserving)
-			return ((IObserving) decorated).getObserved();
-		return null;
-	}
-
-	public PropertyDescriptor getPropertyDescriptor() {
-		return propertyDescriptor;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableMapDecorator.java b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableMapDecorator.java
deleted file mode 100644
index f48d193..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableMapDecorator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 221704)
- *     Matthew Hall - bug 246625
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-
-import org.eclipse.core.databinding.beans.IBeanObservable;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObserving;
-import org.eclipse.core.databinding.observable.map.DecoratingObservableMap;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-
-/**
- * {@link IBeanObservable} decorator for an {@link IObservableMap}.
- * 
- * @since 3.3
- */
-public class BeanObservableMapDecorator extends DecoratingObservableMap
-		implements IBeanObservable {
-	private PropertyDescriptor propertyDescriptor;
-
-	/**
-	 * @param decorated
-	 * @param propertyDescriptor
-	 */
-	public BeanObservableMapDecorator(IObservableMap decorated,
-			PropertyDescriptor propertyDescriptor) {
-		super(decorated, true);
-		this.propertyDescriptor = propertyDescriptor;
-	}
-
-	public synchronized void dispose() {
-		this.propertyDescriptor = null;
-		super.dispose();
-	}
-
-	public Object getObserved() {
-		IObservable decorated = getDecorated();
-		if (decorated instanceof IObserving)
-			return ((IObserving) decorated).getObserved();
-		return null;
-	}
-
-	public PropertyDescriptor getPropertyDescriptor() {
-		return propertyDescriptor;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableSetDecorator.java b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableSetDecorator.java
deleted file mode 100644
index 9df4d18..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableSetDecorator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 246625
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-
-import org.eclipse.core.databinding.beans.IBeanObservable;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObserving;
-import org.eclipse.core.databinding.observable.set.DecoratingObservableSet;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-
-/**
- * {@link IBeanObservable} decorator for an {@link IObservableSet}.
- * 
- * @since 3.3
- */
-public class BeanObservableSetDecorator extends DecoratingObservableSet
-		implements IBeanObservable {
-	private PropertyDescriptor propertyDescriptor;
-
-	/**
-	 * @param decorated
-	 * @param propertyDescriptor
-	 */
-	public BeanObservableSetDecorator(IObservableSet decorated,
-			PropertyDescriptor propertyDescriptor) {
-		super(decorated, true);
-		this.propertyDescriptor = propertyDescriptor;
-	}
-
-	public synchronized void dispose() {
-		this.propertyDescriptor = null;
-		super.dispose();
-	}
-
-	public Object getObserved() {
-		IObservable decorated = getDecorated();
-		if (decorated instanceof IObserving)
-			return ((IObserving) decorated).getObserved();
-		return null;
-	}
-
-	public PropertyDescriptor getPropertyDescriptor() {
-		return propertyDescriptor;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableValueDecorator.java b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableValueDecorator.java
deleted file mode 100644
index 0c58f56..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/BeanObservableValueDecorator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 246625
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-
-import org.eclipse.core.databinding.beans.IBeanObservable;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObserving;
-import org.eclipse.core.databinding.observable.value.DecoratingObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-
-/**
- * {@link IBeanObservable} decorator for an {@link IObservableValue}.
- * 
- * @since 3.3
- */
-public class BeanObservableValueDecorator extends DecoratingObservableValue
-		implements IBeanObservable {
-	private PropertyDescriptor propertyDescriptor;
-
-	/**
-	 * @param decorated
-	 * @param propertyDescriptor
-	 */
-	public BeanObservableValueDecorator(IObservableValue decorated,
-			PropertyDescriptor propertyDescriptor) {
-		super(decorated, true);
-		this.propertyDescriptor = propertyDescriptor;
-	}
-
-	public synchronized void dispose() {
-		this.propertyDescriptor = null;
-		super.dispose();
-	}
-
-	public Object getObserved() {
-		IObservable decorated = getDecorated();
-		if (decorated instanceof IObserving)
-			return ((IObserving) decorated).getObserved();
-		return null;
-	}
-
-	public PropertyDescriptor getPropertyDescriptor() {
-		return propertyDescriptor;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/IdentityWrapper.java b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/IdentityWrapper.java
deleted file mode 100644
index 5be5454..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/IdentityWrapper.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Daniel Kruegler - bug 137435
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.beans;
-
-/**
- * Used for wrapping objects that define their own implementations of equals()
- * and hashCode() when putting them in sets or hashmaps to ensure identity
- * comparison.
- * 
- * @since 1.0
- * 
- */
-public class IdentityWrapper {
-	final Object o;
-
-	/**
-	 * @param o
-	 */
-	public IdentityWrapper(Object o) {
-		this.o = o;
-	}
-	
-	/**
-	 * @return the unwrapped object
-	 */
-	public Object unwrap() {
-		return o;
-	}
-
-	public boolean equals(Object obj) {
-		if (obj == null || obj.getClass() != IdentityWrapper.class) {
-			return false;
-		}
-		return o == ((IdentityWrapper) obj).o;
-	}
-
-	public int hashCode() {
-		return System.identityHashCode(o);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableList.java b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableList.java
deleted file mode 100644
index 9300e2a..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableList.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 171616
- *     Matthew Hall - bugs 208858, 221351, 213145, 223164, 244098
- *     Mike Evans - bug 217558
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.beans;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.Array;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.databinding.BindingException;
-import org.eclipse.core.databinding.beans.IBeanObservable;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.databinding.observable.list.ObservableList;
-
-/**
- * @since 1.0
- * 
- */
-public class JavaBeanObservableList extends ObservableList implements
-		IBeanObservable {
-
-	private final Object object;
-
-	private boolean updating = false;
-
-	private PropertyDescriptor descriptor;
-
-	private ListenerSupport listenerSupport;
-
-	/**
-	 * @param realm
-	 * @param object
-	 * @param descriptor
-	 * @param elementType
-	 */
-	public JavaBeanObservableList(Realm realm, Object object,
-			PropertyDescriptor descriptor, Class elementType) {
-		this(realm, object, descriptor, elementType, true);
-	}
-
-	/**
-	 * @param realm
-	 * @param object
-	 * @param descriptor
-	 * @param elementType
-	 * @param attachListeners
-	 */
-	public JavaBeanObservableList(Realm realm, Object object,
-			PropertyDescriptor descriptor, Class elementType,
-			boolean attachListeners) {
-
-		super(realm, new ArrayList(), elementType);
-		this.object = object;
-		this.descriptor = descriptor;
-
-		if (attachListeners) {
-			PropertyChangeListener listener = new PropertyChangeListener() {
-				public void propertyChange(java.beans.PropertyChangeEvent event) {
-					if (!updating) {
-						getRealm().exec(new Runnable() {
-							public void run() {
-								updateWrappedList(new ArrayList(Arrays
-										.asList(getValues())));
-							}
-						});
-					}
-				}
-			};
-			this.listenerSupport = new ListenerSupport(listener,
-					descriptor.getName());
-			listenerSupport.hookListener(this.object);
-		}
-
-		// initialize list without firing events
-		wrappedList.addAll(Arrays.asList(getValues()));
-	}
-
-	public void dispose() {
-		if (listenerSupport != null) {
-			listenerSupport.dispose();
-			listenerSupport = null;
-		}
-		super.dispose();
-	}
-
-	private Object primGetValues() {
-		Exception ex = null;
-		try {
-			Method readMethod = descriptor.getReadMethod();
-			if (!readMethod.isAccessible()) {
-				readMethod.setAccessible(true);
-			}
-			return readMethod.invoke(object, new Object[0]);
-		} catch (IllegalArgumentException e) {
-			ex = e;
-		} catch (IllegalAccessException e) {
-			ex = e;
-		} catch (InvocationTargetException e) {
-			ex = e;
-		}
-		throw new BindingException("Could not read collection values", ex); //$NON-NLS-1$
-	}
-
-	private Object[] getValues() {
-		Object[] values = null;
-
-		Object result = primGetValues();
-		if (descriptor.getPropertyType().isArray())
-			values = (Object[]) result;
-		else {
-			// TODO add jUnit for POJO (var. SettableValue) collections
-			Collection list = (Collection) result;
-			if (list != null) {
-				values = list.toArray();
-			}
-		}
-		if (values == null)
-			values = new Object[0];
-		return values;
-	}
-
-	public Object getObserved() {
-		return object;
-	}
-
-	public PropertyDescriptor getPropertyDescriptor() {
-		return descriptor;
-	}
-
-	private void setValues() {
-		if (descriptor.getPropertyType().isArray()) {
-			Class componentType = descriptor.getPropertyType()
-					.getComponentType();
-			Object[] newArray = (Object[]) Array.newInstance(componentType,
-					wrappedList.size());
-			wrappedList.toArray(newArray);
-			primSetValues(newArray);
-		} else {
-			// assume that it is a java.util.List
-			primSetValues(new ArrayList(wrappedList));
-		}
-	}
-
-	private void primSetValues(Object newValue) {
-		Exception ex = null;
-		try {
-			Method writeMethod = descriptor.getWriteMethod();
-			if (!writeMethod.isAccessible()) {
-				writeMethod.setAccessible(true);
-			}
-			writeMethod.invoke(object, new Object[] { newValue });
-			return;
-		} catch (IllegalArgumentException e) {
-			ex = e;
-		} catch (IllegalAccessException e) {
-			ex = e;
-		} catch (InvocationTargetException e) {
-			ex = e;
-		}
-		throw new BindingException("Could not write collection values", ex); //$NON-NLS-1$
-	}
-
-	public Object set(int index, Object element) {
-		getterCalled();
-		updating = true;
-		try {
-			Object oldElement = wrappedList.set(index, element);
-			setValues();
-			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
-					index, false, oldElement), Diffs.createListDiffEntry(index,
-					true, element)));
-			return oldElement;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public Object move(int oldIndex, int newIndex) {
-		getterCalled();
-		updating = true;
-		try {
-			int size = wrappedList.size();
-			if (oldIndex < 0 || oldIndex >= size)
-				throw new IndexOutOfBoundsException(
-						"oldIndex: " + oldIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-			if (newIndex < 0 || newIndex >= size)
-				throw new IndexOutOfBoundsException(
-						"newIndex: " + newIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-			if (oldIndex == newIndex)
-				return wrappedList.get(oldIndex);
-			Object element = wrappedList.remove(oldIndex);
-			wrappedList.add(newIndex, element);
-			setValues();
-			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
-					oldIndex, false, element), Diffs.createListDiffEntry(
-					newIndex, true, element)));
-			return element;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public Object remove(int index) {
-		getterCalled();
-		updating = true;
-		try {
-			Object oldElement = wrappedList.remove(index);
-			setValues();
-			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
-					index, false, oldElement)));
-			return oldElement;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public boolean add(Object element) {
-		updating = true;
-		try {
-			int index = wrappedList.size();
-			boolean result = wrappedList.add(element);
-			setValues();
-			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
-					index, true, element)));
-			return result;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public void add(int index, Object element) {
-		updating = true;
-		try {
-			wrappedList.add(index, element);
-			setValues();
-			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
-					index, true, element)));
-		} finally {
-			updating = false;
-		}
-	}
-
-	public boolean addAll(Collection c) {
-		if (c.isEmpty()) {
-			return false;
-		}
-		updating = true;
-		try {
-			int index = wrappedList.size();
-			boolean result = wrappedList.addAll(c);
-			setValues();
-			ListDiffEntry[] entries = new ListDiffEntry[c.size()];
-			int i = 0;
-			for (Iterator it = c.iterator(); it.hasNext();) {
-				Object o = it.next();
-				entries[i++] = Diffs.createListDiffEntry(index++, true, o);
-			}
-			fireListChange(Diffs.createListDiff(entries));
-			return result;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public boolean addAll(int index, Collection c) {
-		if (c.isEmpty()) {
-			return false;
-		}
-		updating = true;
-		try {
-			boolean result = wrappedList.addAll(index, c);
-			setValues();
-			ListDiffEntry[] entries = new ListDiffEntry[c.size()];
-			int i = 0;
-			for (Iterator it = c.iterator(); it.hasNext();) {
-				Object o = it.next();
-				entries[i++] = Diffs.createListDiffEntry(index++, true, o);
-			}
-			fireListChange(Diffs.createListDiff(entries));
-			return result;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public boolean remove(Object o) {
-		getterCalled();
-		int index = wrappedList.indexOf(o);
-		if (index == -1) {
-			return false;
-		}
-		updating = true;
-		try {
-			Object oldElement = wrappedList.remove(index);
-			setValues();
-			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
-					index, false, oldElement)));
-			return true;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public boolean removeAll(Collection c) {
-		getterCalled();
-		boolean changed = false;
-		updating = true;
-		try {
-			List diffEntries = new ArrayList();
-			for (Iterator it = c.iterator(); it.hasNext();) {
-				Object o = it.next();
-				int index = wrappedList.indexOf(o);
-				if (index != -1) {
-					changed = true;
-					Object oldElement = wrappedList.remove(index);
-					diffEntries.add(Diffs.createListDiffEntry(index, false,
-							oldElement));
-				}
-			}
-			if (changed) {
-				setValues();
-				fireListChange(Diffs
-						.createListDiff((ListDiffEntry[]) diffEntries
-								.toArray(new ListDiffEntry[diffEntries.size()])));
-			}
-			return changed;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public boolean retainAll(Collection c) {
-		getterCalled();
-		boolean changed = false;
-		updating = true;
-		try {
-			List diffEntries = new ArrayList();
-			int index = 0;
-			for (Iterator it = wrappedList.iterator(); it.hasNext();) {
-				Object o = it.next();
-				boolean retain = c.contains(o);
-				if (retain) {
-					index++;
-				} else {
-					changed = true;
-					it.remove();
-					diffEntries.add(Diffs.createListDiffEntry(index, false, o));
-				}
-			}
-			if (changed) {
-				setValues();
-				fireListChange(Diffs
-						.createListDiff((ListDiffEntry[]) diffEntries
-								.toArray(new ListDiffEntry[diffEntries.size()])));
-			}
-			return changed;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public void clear() {
-		updating = true;
-		try {
-			List diffEntries = new ArrayList();
-			for (Iterator it = wrappedList.iterator(); it.hasNext();) {
-				Object o = it.next();
-				diffEntries.add(Diffs.createListDiffEntry(0, false, o));
-			}
-			wrappedList.clear();
-			setValues();
-			fireListChange(Diffs.createListDiff((ListDiffEntry[]) diffEntries
-					.toArray(new ListDiffEntry[diffEntries.size()])));
-		} finally {
-			updating = false;
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableMap.java b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableMap.java
deleted file mode 100644
index 23fc194..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableMap.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 171616
- *     Matthew hall - bugs 223164, 241585, 226289, 246103
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.beans;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.databinding.beans.IBeanObservable;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.map.ComputedObservableMap;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.internal.databinding.Util;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * @since 1.0
- * 
- */
-public class JavaBeanObservableMap extends ComputedObservableMap implements
-		IBeanObservable {
-
-	private PropertyDescriptor propertyDescriptor;
-	
-	private PropertyChangeListener elementListener = new PropertyChangeListener() {
-		public void propertyChange(final java.beans.PropertyChangeEvent event) {
-			if (!updating) {
-				getRealm().exec(new Runnable() {
-					public void run() {
-						Object source = event.getSource();
-						Object oldValue = event.getOldValue();
-						Object newValue = event.getNewValue();
-						if (oldValue == null && newValue == null) {
-							oldValue = cachedValues.get(new IdentityWrapper(
-									source));
-							newValue = doGet(source);
-						}
-						cachedValues.put(new IdentityWrapper(source), newValue);
-						if (!Util.equals(oldValue, newValue)) {
-							fireMapChange(Diffs.createMapDiffSingleChange(
-									source, oldValue, newValue));
-						}
-					}
-				});
-			}
-		}
-	};
-
-	private ListenerSupport listenerSupport;
-
-	private boolean updating = false;
-
-	private boolean attachListeners;
-
-	// Applicable only while hasListeners() == true
-	private Map cachedValues;
-
-	/**
-	 * @param domain
-	 * @param propertyDescriptor
-	 */
-	public JavaBeanObservableMap(IObservableSet domain,
-			PropertyDescriptor propertyDescriptor) {
-		this(domain, propertyDescriptor, true);
-	}
-
-	/**
-	 * @param domain
-	 * @param propertyDescriptor
-	 * @param attachListeners
-	 */
-	public JavaBeanObservableMap(IObservableSet domain,
-			PropertyDescriptor propertyDescriptor, boolean attachListeners) {
-		super(domain, propertyDescriptor.getPropertyType());
-
-		this.propertyDescriptor = propertyDescriptor;
-		this.attachListeners = attachListeners;
-		if (attachListeners) {
-			this.listenerSupport = new ListenerSupport(elementListener,
-					propertyDescriptor.getName());
-		}
-	}
-
-	protected void firstListenerAdded() {
-		if (attachListeners) {
-			cachedValues = new HashMap();
-		}
-		super.firstListenerAdded();
-	}
-
-	protected void lastListenerRemoved() {
-		super.lastListenerRemoved();
-		if (attachListeners) {
-			cachedValues = null;
-		}
-	}
-
-	protected void hookListener(Object domainElement) {
-		if (attachListeners && domainElement != null) {
-			listenerSupport.hookListener(domainElement);
-			cachedValues.put(new IdentityWrapper(domainElement),
-					doGet(domainElement));
-		}
-	}
-
-	protected void unhookListener(Object domainElement) {
-		if (attachListeners && domainElement != null) {
-			cachedValues.remove(new IdentityWrapper(domainElement));
-			listenerSupport.unhookListener(domainElement);
-		}
-	}
-
-	protected Object doGet(Object key) {
-		if (key == null) {
-			return null;
-		}
-		try {
-			Method readMethod = propertyDescriptor.getReadMethod();
-			if (!readMethod.isAccessible()) {
-				readMethod.setAccessible(true);
-			}
-			return readMethod.invoke(key, new Object[0]);
-		} catch (Exception e) {
-			Policy.getLog().log(
-					new Status(IStatus.ERROR, Policy.JFACE_DATABINDING,
-							IStatus.ERROR, "cannot get value", e)); //$NON-NLS-1$
-			throw new RuntimeException(e);
-		}
-	}
-
-	protected Object doPut(Object key, Object value) {
-		try {
-			Object oldValue = get(key);
-			if (!Util.equals(oldValue, value)) {
-				Method writeMethod = propertyDescriptor.getWriteMethod();
-				if (!writeMethod.isAccessible()) {
-					writeMethod.setAccessible(true);
-				}
-				writeMethod.invoke(key, new Object[] { value });
-			}
-
-			if (hasListeners()) {
-				// oldValue contains the live value which may be different from
-				// the cached value if the bean does not have listener API or
-				// does not fire events properly. For consistency we want to
-				// provide the cached value as the old value, rather than the
-				// live value so that consumers that hook/unhook listeners can
-				// do so without maintaining caches of their own.
-				Object newValue = doGet(key);
-				oldValue = cachedValues.put(new IdentityWrapper(key), newValue);
-
-				if (!Util.equals(oldValue, newValue)) {
-					fireSingleChange(key, oldValue, newValue);
-				}
-			}
-			return oldValue;
-		} catch (Exception e) {
-			Policy.getLog().log(
-					new Status(IStatus.ERROR, Policy.JFACE_DATABINDING,
-							IStatus.ERROR, "cannot set value", e)); //$NON-NLS-1$
-			throw new RuntimeException(e);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.databinding.beans.IBeanObservable#getObserved()
-	 */
-	public Object getObserved() {
-		return keySet();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.databinding.beans.IBeanObservable#getPropertyDescriptor()
-	 */
-	public PropertyDescriptor getPropertyDescriptor() {
-		return propertyDescriptor;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableSet.java b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableSet.java
deleted file mode 100644
index c717271..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableSet.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 171616
- *     Matthew Hall - bugs 221351, 223164, 244098
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.beans;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.Array;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.BindingException;
-import org.eclipse.core.databinding.beans.IBeanObservable;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.ObservableSet;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * @since 1.0
- * 
- */
-public class JavaBeanObservableSet extends ObservableSet implements IBeanObservable {
-
-	private final Object object;
-
-	private boolean updating = false;
-
-	private PropertyDescriptor descriptor;
-
-	private ListenerSupport listenerSupport;
-
-	/**
-	 * @param realm
-	 * @param object
-	 * @param descriptor
-	 * @param elementType
-	 */
-	public JavaBeanObservableSet(Realm realm, Object object,
-			PropertyDescriptor descriptor, Class elementType) {
-		this(realm, object, descriptor, elementType, true);
-	}
-
-	/**
-	 * @param realm
-	 * @param object
-	 * @param descriptor
-	 * @param elementType
-	 * @param attachListeners
-	 */
-	public JavaBeanObservableSet(Realm realm, Object object,
-			PropertyDescriptor descriptor, Class elementType,
-			boolean attachListeners) {
-		super(realm, new HashSet(), elementType);
-		this.object = object;
-		this.descriptor = descriptor;
-		if (attachListeners) {
-			PropertyChangeListener listener = new PropertyChangeListener() {
-				public void propertyChange(java.beans.PropertyChangeEvent event) {
-					if (!updating) {
-						getRealm().exec(new Runnable() {
-							public void run() {
-								Set newElements = new HashSet(Arrays
-										.asList(getValues()));
-								Set addedElements = new HashSet(newElements);
-								Set removedElements = new HashSet(wrappedSet);
-								// remove all new elements from old elements to
-								// compute
-								// the removed elements
-								removedElements.removeAll(newElements);
-								addedElements.removeAll(wrappedSet);
-								wrappedSet = newElements;
-								fireSetChange(Diffs.createSetDiff(
-										addedElements, removedElements));
-							}
-						});
-					}
-				}
-			};
-			this.listenerSupport = new ListenerSupport(listener, descriptor
-					.getName());
-			listenerSupport.hookListener(this.object);
-		}
-
-		wrappedSet.addAll(Arrays.asList(getValues()));
-	}
-
-	private Object primGetValues() {
-		try {
-			Method readMethod = descriptor.getReadMethod();
-			if (!readMethod.isAccessible()) {
-				readMethod.setAccessible(true);
-			}
-			return readMethod.invoke(object, new Object[0]);
-		} catch (IllegalArgumentException e) {
-		} catch (IllegalAccessException e) {
-		} catch (InvocationTargetException e) {
-		}
-		Assert.isTrue(false, "Could not read collection values"); //$NON-NLS-1$
-		return null;
-	}
-
-	private Object[] getValues() {
-		Object[] values = null;
-
-		Object result = primGetValues();
-		if (descriptor.getPropertyType().isArray())
-			values = (Object[]) result;
-		else {
-			// TODO add jUnit for POJO (var. SettableValue) collections
-			Collection list = (Collection) result;
-			if (list != null)
-				values = list.toArray();
-		}
-		if (values == null)
-			values = new Object[0];
-		return values;
-	}
-
-	private void setValues() {
-		if (descriptor.getPropertyType().isArray()) {
-			Class componentType = descriptor.getPropertyType()
-					.getComponentType();
-			Object[] newArray = (Object[]) Array.newInstance(componentType,
-					wrappedSet.size());
-			wrappedSet.toArray(newArray);
-			primSetValues(newArray);
-		} else {
-			// assume that it is a java.util.Set
-			primSetValues(new HashSet(wrappedSet));
-		}
-	}
-
-	public boolean add(Object o) {
-		getterCalled();
-		updating = true;
-		try {
-			boolean added = wrappedSet.add(o);
-			if (added) {
-				setValues();
-				fireSetChange(Diffs.createSetDiff(Collections.singleton(o),
-						Collections.EMPTY_SET));
-			}
-			return added;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public boolean remove(Object o) {
-		getterCalled();
-		updating = true;
-		try {
-			boolean removed = wrappedSet.remove(o);
-			if (removed) {
-				setValues();
-				fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET,
-						Collections.singleton(o)));
-			}
-			return removed;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public boolean addAll(Collection c) {
-		getterCalled();
-		updating = true;
-		try {
-			Set additions = new HashSet();
-			for (Iterator iterator = c.iterator(); iterator.hasNext();) {
-				Object element = iterator.next();
-				if (wrappedSet.add(element))
-					additions.add(element);
-			}
-			boolean changed = !additions.isEmpty();
-			if (changed) {
-				setValues();
-				fireSetChange(Diffs.createSetDiff(additions,
-						Collections.EMPTY_SET));
-			}
-			return changed;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public boolean removeAll(Collection c) {
-		getterCalled();
-		updating = true;
-		try {
-			Set removals = new HashSet();
-			for (Iterator iterator = c.iterator(); iterator.hasNext();) {
-				Object element = iterator.next();
-				if (wrappedSet.remove(element))
-					removals.add(element);
-			}
-			boolean changed = !removals.isEmpty();
-			if (changed) {
-				setValues();
-				fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET,
-						removals));
-			}
-			return changed;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public boolean retainAll(Collection c) {
-		getterCalled();
-		updating = true;
-		try {
-			Set removals = new HashSet();
-			for (Iterator iterator = wrappedSet.iterator(); iterator.hasNext();) {
-				Object element = iterator.next();
-				if (!c.contains(element)) {
-					iterator.remove();
-					removals.add(element);
-				}
-			}
-			boolean changed = !removals.isEmpty();
-			if (changed) {
-				setValues();
-				fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET,
-						removals));
-			}
-			return changed;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public void clear() {
-		getterCalled();
-		if (wrappedSet.isEmpty())
-			return;
-
-		updating = true;
-		try {
-			Set removals = new HashSet(wrappedSet);
-			wrappedSet.clear();
-			setValues();
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removals));
-		} finally {
-			updating = false;
-		}
-	}
-
-	private void primSetValues(Object newValue) {
-		Exception ex = null;
-		try {
-			Method writeMethod = descriptor.getWriteMethod();
-			if (!writeMethod.isAccessible()) {
-				writeMethod.setAccessible(true);
-			}
-			writeMethod.invoke(object, new Object[] { newValue });
-			return;
-		} catch (IllegalArgumentException e) {
-			ex = e;
-		} catch (IllegalAccessException e) {
-			ex = e;
-		} catch (InvocationTargetException e) {
-			ex = e;
-		}
-		throw new BindingException("Could not write collection values", ex); //$NON-NLS-1$
-	}
-
-	public Object getObserved() {
-		return object;
-	}
-
-	public PropertyDescriptor getPropertyDescriptor() {
-		return descriptor;
-	}
-
-	public synchronized void dispose() {
-		if (listenerSupport != null) {
-			listenerSupport.dispose();
-			listenerSupport = null;
-		}
-
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableValue.java b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableValue.java
deleted file mode 100644
index 66311d8..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableValue.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Brad Reynolds - bug 164134, 171616
- *     Matthew Hall - bug 246103
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.beans;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import org.eclipse.core.databinding.BindingException;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.beans.IBeanObservable;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.internal.databinding.Util;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * @since 1.0
- * 
- */
-public class JavaBeanObservableValue extends AbstractObservableValue implements IBeanObservable {
-	private final Object object;
-	private boolean updating = false;
-
-	private final PropertyDescriptor propertyDescriptor;
-	private ListenerSupport listenerSupport;
-
-	private boolean attachListeners;
-
-	// Applicable only while hasListeners() == true
-	private Object cachedValue;
-
-	/**
-	 * @param realm
-	 * @param object
-	 * @param descriptor
-	 */
-	public JavaBeanObservableValue(Realm realm, Object object,
-			PropertyDescriptor descriptor) {
-		this(realm, object, descriptor, true);
-	}
-
-	/**
-	 * @param realm
-	 * @param object
-	 * @param descriptor
-	 * @param attachListeners
-	 */
-	public JavaBeanObservableValue(Realm realm, Object object,
-			PropertyDescriptor descriptor, boolean attachListeners) {
-		super(realm);
-		this.object = object;
-		this.propertyDescriptor = descriptor;
-		this.attachListeners = attachListeners;
-	}
-
-	protected void firstListenerAdded() {
-		if (!attachListeners) {
-			return;
-		}
-
-		if (listenerSupport == null) {
-			PropertyChangeListener listener = new PropertyChangeListener() {
-				public void propertyChange(
-						final java.beans.PropertyChangeEvent event) {
-					if (!updating) {
-						getRealm().exec(new Runnable() {
-							public void run() {
-								Object oldValue = event.getOldValue();
-								Object newValue = event.getNewValue();
-								if (oldValue == null && newValue == null) {
-									// this condition is provided for in the
-									// bean spec, and indicates that an 
-									// unknown change occured.
-
-									oldValue = cachedValue;
-									newValue = doGetValue();
-								}
-								cachedValue = newValue;
-								if (!Util.equals(oldValue, newValue)) {
-									fireValueChange(Diffs.createValueDiff(
-											oldValue, newValue));
-								}
-							}
-						});
-					}
-				}
-			};
-			listenerSupport = new ListenerSupport(listener, propertyDescriptor
-					.getName());
-		}
-		
-		listenerSupport.hookListener(object);
-		cachedValue = doGetValue();
-	}
-
-	public void doSetValue(Object value) {
-		updating = true;
-		try {
-			Object oldValue = doGetValue();
-			
-			if (!Util.equals(oldValue, value)) {
-				Method writeMethod = propertyDescriptor.getWriteMethod();
-				if (!writeMethod.isAccessible()) {
-					writeMethod.setAccessible(true);
-				}
-				writeMethod.invoke(object, new Object[] { value });
-			}
-			
-			if (hasListeners()) {
-				// oldValue contains the live value which may be different from
-				// the cached value if the bean does not have listener API or
-				// does not fire events properly. For consistency we want to
-				// provide the cached value as the old value, rather than the
-				// live value so that consumers that hook/unhook listeners can
-				// do so without maintaining caches of their own.
-				oldValue = cachedValue;
-				cachedValue = doGetValue();
-				if (!Util.equals(oldValue, cachedValue)) {
-					fireValueChange(Diffs
-							.createValueDiff(oldValue, cachedValue));
-				}
-			}
-		} catch (InvocationTargetException e) {
-			/*
-			 * InvocationTargetException wraps any exception thrown by the
-			 * invoked method.
-			 */
-			throw new RuntimeException(e.getCause());
-		} catch (Exception e) {
-			if (BeansObservables.DEBUG) {
-				Policy
-						.getLog()
-						.log(
-								new Status(
-										IStatus.WARNING,
-										Policy.JFACE_DATABINDING,
-										IStatus.OK,
-										"Could not change value of " + object + "." + propertyDescriptor.getName(), e)); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		} finally {
-			updating = false;
-		}
-	}
-
-	public Object doGetValue() {
-		try {
-			Method readMethod = propertyDescriptor.getReadMethod();
-			if (readMethod == null) {
-				throw new BindingException(propertyDescriptor.getName()
-						+ " property does not have a read method."); //$NON-NLS-1$
-			}
-			if (!readMethod.isAccessible()) {
-				readMethod.setAccessible(true);
-			}
-			return readMethod.invoke(object, null);
-		} catch (InvocationTargetException e) {
-			/*
-			 * InvocationTargetException wraps any exception thrown by the
-			 * invoked method.
-			 */
-			throw new RuntimeException(e.getCause());
-		} catch (Exception e) {
-			if (BeansObservables.DEBUG) {
-				Policy
-						.getLog()
-						.log(
-								new Status(
-										IStatus.WARNING,
-										Policy.JFACE_DATABINDING,
-										IStatus.OK,
-										"Could not read value of " + object + "." + propertyDescriptor.getName(), e)); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			return null;
-		}
-	}
-
-	protected void lastListenerRemoved() {
-		unhookListener();
-	}
-
-	private void unhookListener() {
-		cachedValue = null;
-		if (listenerSupport != null) {
-			listenerSupport.dispose();
-			listenerSupport = null;
-		}
-	}
-
-	public Object getValueType() {
-		return propertyDescriptor.getPropertyType();
-	}
-
-	public Object getObserved() {
-		return object;
-	}
-
-	public PropertyDescriptor getPropertyDescriptor() {
-		return propertyDescriptor;
-	}
-
-	public synchronized void dispose() {
-		unhookListener();
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanPropertyObservableMap.java b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanPropertyObservableMap.java
deleted file mode 100644
index 16bf66a..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/JavaBeanPropertyObservableMap.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 221704)
- *     Matthew Hall - bug 223164, 226289, 244098, 246103
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.beans;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.BindingException;
-import org.eclipse.core.databinding.beans.IBeanObservable;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.map.ObservableMap;
-import org.eclipse.core.internal.databinding.Util;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * @since 1.0
- * 
- */
-public class JavaBeanPropertyObservableMap extends ObservableMap implements
-		IBeanObservable {
-
-	private final Object object;
-
-	private Object keyType;
-	private Object valueType;
-
-	private boolean updating = false;
-
-	private PropertyDescriptor descriptor;
-
-	private ListenerSupport listenerSupport;
-
-	/**
-	 * @param realm
-	 * @param object
-	 * @param descriptor
-	 * @param keyType
-	 * @param valueType
-	 */
-	public JavaBeanPropertyObservableMap(Realm realm, Object object,
-			PropertyDescriptor descriptor, Object keyType, Object valueType) {
-		this(realm, object, descriptor, keyType, valueType, true);
-	}
-
-	/**
-	 * @param realm
-	 * @param object
-	 * @param descriptor
-	 * @param keyType
-	 * @param valueType
-	 * @param attachListeners
-	 */
-	public JavaBeanPropertyObservableMap(Realm realm, Object object,
-			PropertyDescriptor descriptor, Object keyType, Object valueType,
-			boolean attachListeners) {
-		super(realm, new HashMap());
-		this.object = object;
-		this.descriptor = descriptor;
-		this.keyType = keyType;
-		this.valueType = valueType;
-		if (attachListeners) {
-			PropertyChangeListener listener = new PropertyChangeListener() {
-				public void propertyChange(final PropertyChangeEvent event) {
-					if (!updating) {
-						getRealm().exec(new Runnable() {
-							public void run() {
-								Map oldMap = (Map) event.getOldValue();
-								Map newMap = (Map) event.getNewValue();
-								if (oldMap == null && newMap == null) {
-									oldMap = wrappedMap;
-									newMap = getMap();
-								}
-
-								if (!Util.equals(oldMap, newMap)) {
-									wrappedMap = new HashMap(newMap);
-									fireMapChange(Diffs.computeMapDiff(oldMap,
-											newMap));
-								}
-							}
-						});
-					}
-				}
-			};
-
-			listenerSupport = new ListenerSupport(listener,
-					descriptor.getName());
-			listenerSupport.hookListener(this.object);
-		}
-
-		wrappedMap.putAll(getMap());
-	}
-
-	public Object getKeyType() {
-		return keyType;
-	}
-
-	public Object getValueType() {
-		return valueType;
-	}
-
-	private Object primGetMap() {
-		try {
-			Method readMethod = descriptor.getReadMethod();
-			if (!readMethod.isAccessible()) {
-				readMethod.setAccessible(true);
-			}
-			return readMethod.invoke(object, new Object[0]);
-		} catch (IllegalArgumentException e) {
-		} catch (IllegalAccessException e) {
-		} catch (InvocationTargetException e) {
-		}
-		Assert.isTrue(false, "Could not read collection values"); //$NON-NLS-1$
-		return null;
-	}
-
-	private void primSetMap(Object newValue) {
-		Exception ex = null;
-		try {
-			Method writeMethod = descriptor.getWriteMethod();
-			if (!writeMethod.isAccessible()) {
-				writeMethod.setAccessible(true);
-			}
-			writeMethod.invoke(object, new Object[] { newValue });
-			return;
-		} catch (IllegalArgumentException e) {
-			ex = e;
-		} catch (IllegalAccessException e) {
-			ex = e;
-		} catch (InvocationTargetException e) {
-			ex = e;
-		}
-		throw new BindingException("Could not write collection values", ex); //$NON-NLS-1$
-	}
-
-	private Map getMap() {
-		Map result = (Map) primGetMap();
-
-		if (result == null)
-			result = new HashMap();
-		return result;
-	}
-
-	private void setMap() {
-		primSetMap(new HashMap(wrappedMap));
-	}
-
-	public Object put(Object key, Object value) {
-		checkRealm();
-		updating = true;
-		try {
-			boolean add = !wrappedMap.containsKey(key);
-			Object result = wrappedMap.put(key, value);
-			if (!Util.equals(result, value)) {
-				setMap();
-				if (add) {
-					fireMapChange(Diffs.createMapDiffSingleAdd(key, value));
-				} else {
-					fireMapChange(Diffs.createMapDiffSingleChange(key, result,
-							value));
-				}
-			}
-			return result;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public void putAll(Map map) {
-		checkRealm();
-		updating = true;
-		try {
-			Set addedKeys = new HashSet(map.size());
-			Map changes = new HashMap(map.size());
-			for (Iterator it = map.entrySet().iterator(); it.hasNext();) {
-				Map.Entry entry = (Entry) it.next();
-				Object key = entry.getKey();
-				Object newValue = entry.getValue();
-				boolean add = !wrappedMap.containsKey(key);
-				Object oldValue = wrappedMap.put(key, newValue);
-				if (add) {
-					addedKeys.add(key);
-				} else if (!Util.equals(oldValue, newValue)) {
-					changes.put(key, oldValue);
-				}
-			}
-			if (!addedKeys.isEmpty() || !changes.isEmpty()) {
-				setMap();
-				fireMapChange(Diffs.createMapDiff(addedKeys,
-						Collections.EMPTY_SET, changes.keySet(), changes,
-						wrappedMap));
-			}
-		} finally {
-			updating = false;
-		}
-	}
-
-	public Object remove(Object key) {
-		checkRealm();
-		if (!wrappedMap.containsKey(key)) {
-			return null;
-		}
-		updating = true;
-		try {
-			Object result = wrappedMap.remove(key);
-			setMap();
-			fireMapChange(Diffs.createMapDiffSingleRemove(key, result));
-			return result;
-		} finally {
-			updating = false;
-		}
-	}
-
-	public void clear() {
-		checkRealm();
-		if (wrappedMap.isEmpty())
-			return;
-		updating = true;
-		try {
-			Map oldMap = wrappedMap;
-			wrappedMap = new HashMap();
-			setMap();
-			fireMapChange(Diffs.computeMapDiff(oldMap, Collections.EMPTY_MAP));
-		} finally {
-			updating = false;
-		}
-	}
-
-	public Object getObserved() {
-		return object;
-	}
-
-	public PropertyDescriptor getPropertyDescriptor() {
-		return descriptor;
-	}
-
-	public synchronized void dispose() {
-		if (listenerSupport != null) {
-			listenerSupport.dispose();
-			listenerSupport = null;
-		}
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/ListenerSupport.java b/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/ListenerSupport.java
deleted file mode 100644
index 6e82157..0000000
--- a/bundles/org.eclipse.core.databinding.beans/src/org/eclipse/core/internal/databinding/beans/ListenerSupport.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 118516
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.beans;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * This is a helper that will hook up and listen for <code>PropertyChangeEvent</code> events
- * for a set of target JavaBeans
- * 
- * @since 1.0
- */
-public class ListenerSupport {
-
-	private Set elementsListenedTo = new HashSet();
-	
-	private PropertyChangeListener listener;
-
-	private String propertyName;
-
-	/**
-	 * Constructs a new instance.
-	 * 
-	 * @param listener is the callback that will be called
-	 * 		when a <code>PropertyChangeEvent</code> is fired on any
-	 * 		of the target objects.  Will only receive change events 
-	 * 		when the provided <code>propertyName</code> changes.
-	 * @param propertyName
-	 */
-	public ListenerSupport(final PropertyChangeListener listener,
-			final String propertyName) {
-		Assert.isNotNull(listener, "Listener cannot be null"); //$NON-NLS-1$
-		Assert.isNotNull(propertyName, "Property name cannot be null"); //$NON-NLS-1$
-
-		this.propertyName = propertyName;
-		this.listener = new PropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent evt) {
-				if (propertyName.equals(evt.getPropertyName())) {
-					listener.propertyChange(evt);
-				}
-			}
-		};
-	}
-
-	/**
-	 * Start listen to target (if it supports the JavaBean property change listener pattern)
-	 * 
-	 * @param target
-	 */
-	public void hookListener(Object target) {
-		if (processListener(
-				"addPropertyChangeListener", "Could not attach listener to ", target)) { //$NON-NLS-1$ //$NON-NLS-2$
-			elementsListenedTo.add(new IdentityWrapper(target));
-		}
-	}
-		
-	/**
-	 * Add listeners for new targets (those this instance of<code>ListenerSupport</code> does not 
-	 * already listen to),
-	 * Stop to listen to those object that this instance listen to and is one of the object in targets 
-	 * 
-	 * @param targets 
-	 */
-	public void setHookTargets(Object[] targets) {		
-		Set elementsToUnhook = new HashSet(elementsListenedTo);
-		if (targets!=null) {
-			for (int i = 0; i < targets.length; i++) {
-				Object newValue = targets[i];
-				IdentityWrapper identityWrapper = new IdentityWrapper(newValue);
-				if(!elementsToUnhook.remove(identityWrapper)) 				
-					hookListener(newValue);
-			}
-		}
-			
-		for (Iterator it = elementsToUnhook.iterator(); it.hasNext();) {
-			Object o = it.next();
-			if (o.getClass()!=IdentityWrapper.class)
-				o = new IdentityWrapper(o);
-			elementsListenedTo.remove(o);
-			unhookListener(o);
-		}							
-	}
-	
-	/**
-	 * Stop listen to target
-	 * 
-	 * @param target
-	 */
-	public void unhookListener(Object target) {
-		if (target.getClass() == IdentityWrapper.class)
-			target = ((IdentityWrapper) target).unwrap();
-
-		if (processListener(
-				"removePropertyChangeListener", "Cound not remove listener from ", target)) { //$NON-NLS-1$//$NON-NLS-2$
-			elementsListenedTo.remove(new IdentityWrapper(target));
-		}
-	}
-	
-	
-	/**
-	 * 
-	 */
-	public void dispose() {
-		if (elementsListenedTo!=null) {
-			Object[] targets = elementsListenedTo.toArray();		
-			for (int i = 0; i < targets.length; i++) {		
-				unhookListener(targets[i]);
-			}			
-			elementsListenedTo=null;
-			listener=null;
-		}
-	}
-	
-	/**
-	 * @return elements that were registred to
-	 */
-	public Object[] getHookedTargets() {
-		Object[] targets = null;
-		if (elementsListenedTo!=null && elementsListenedTo.size()>0) {
-			Object[] identityList = elementsListenedTo.toArray();
-			targets = new Object[identityList.length];
-			for (int i = 0; i < identityList.length; i++) 
-				targets[i]=((IdentityWrapper)identityList[i]).unwrap();							
-		}
-		return targets;
-	}
-
-	/**
-	 * Invokes the method for the provided <code>methodName</code> attempting
-	 * to first use the method with the property name and then the unnamed
-	 * version.
-	 * 
-	 * @param methodName
-	 *            either addPropertyChangeListener or
-	 *            removePropertyChangeListener
-	 * @param message
-	 *            string that will be prefixed to the target in an error message
-	 * @param target
-	 *            object to invoke the method on
-	 * @return <code>true</code> if the method was invoked successfully
-	 */
-	private boolean processListener(String methodName, String message,
-			Object target) {
-		Method method = null;
-		Object[] parameters = null;
-
-		try {
-			try {
-				method = target.getClass().getMethod(
-						methodName,
-						new Class[] { String.class,
-								PropertyChangeListener.class });
-
-				parameters = new Object[] { propertyName, listener };
-			} catch (NoSuchMethodException e) {
-				method = target.getClass().getMethod(methodName,
-						new Class[] { PropertyChangeListener.class });
-
-				parameters = new Object[] { listener };
-			}
-		} catch (SecurityException e) {
-			// ignore
-		} catch (NoSuchMethodException e) {
-			log(IStatus.WARNING, message + target, e);
-		}
-
-		if (method != null) {
-			if (!method.isAccessible()) {
-				method.setAccessible(true);
-			}
-			try {
-				method.invoke(target, parameters);
-				return true;
-			} catch (IllegalArgumentException e) {
-				log(IStatus.WARNING, message + target, e);
-			} catch (IllegalAccessException e) {
-				log(IStatus.WARNING, message + target, e);
-			} catch (InvocationTargetException e) {
-				log(IStatus.WARNING, message + target, e);
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Logs a message to the Data Binding logger.
-	 */
-	private void log(int severity, String message, Throwable throwable) {
-		if (BeansObservables.DEBUG) {
-			Policy.getLog().log(
-					new Status(severity, Policy.JFACE_DATABINDING, IStatus.OK,
-							message, throwable));
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/.classpath b/bundles/org.eclipse.core.databinding.observable/.classpath
deleted file mode 100644
index 6f3b481..0000000
--- a/bundles/org.eclipse.core.databinding.observable/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/CDC-1.1%Foundation-1.1"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.core.databinding.observable/.project b/bundles/org.eclipse.core.databinding.observable/.project
deleted file mode 100644
index 29ba27f..0000000
--- a/bundles/org.eclipse.core.databinding.observable/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.databinding.observables</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.core.databinding.observable/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.core.databinding.observable/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 6ff29cd..0000000
--- a/bundles/org.eclipse.core.databinding.observable/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Mon Dec 01 17:17:53 MST 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.core.databinding.observable/META-INF/MANIFEST.MF b/bundles/org.eclipse.core.databinding.observable/META-INF/MANIFEST.MF
deleted file mode 100644
index 94e2810..0000000
--- a/bundles/org.eclipse.core.databinding.observable/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.core.databinding.observables
-Bundle-Version: 1.2.0.qualifier
-Bundle-Classpath: .
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Bundle-RequiredExecutionEnvironment: CDC-1.1/Foundation-1.1,
- J2SE-1.4
-Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.core.databinding.observable/build.properties b/bundles/org.eclipse.core.databinding.observable/build.properties
deleted file mode 100644
index 34d2e4d..0000000
--- a/bundles/org.eclipse.core.databinding.observable/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/bundles/org.eclipse.core.databinding.observable/plugin.properties b/bundles/org.eclipse.core.databinding.observable/plugin.properties
deleted file mode 100644
index 2969694..0000000
--- a/bundles/org.eclipse.core.databinding.observable/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName = JFace Data Binding Observables
-providerName = Eclipse.org
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/AbstractObservable.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/AbstractObservable.java
deleted file mode 100644
index 1297829..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/AbstractObservable.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Matthew Hall - bugs 118516, 146397
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.AssertionFailedException;
-
-/**
- * @since 1.0
- */
-public abstract class AbstractObservable extends ChangeManager implements IObservable {
-	private boolean disposed = false;
-
-	/**
-	 * @param realm
-	 */
-	public AbstractObservable(Realm realm) {
-		super(realm);
-	}
-
-	public synchronized void addChangeListener(IChangeListener listener) {
-		addListener(ChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeChangeListener(IChangeListener listener) {
-		removeListener(ChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void addStaleListener(IStaleListener listener) {
-		addListener(StaleEvent.TYPE, listener);
-	}
-
-	public synchronized void removeStaleListener(IStaleListener listener) {
-		removeListener(StaleEvent.TYPE, listener);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public synchronized void addDisposeListener(IDisposeListener listener) {
-		addListener(DisposeEvent.TYPE, listener);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public synchronized void removeDisposeListener(IDisposeListener listener) {
-		removeListener(DisposeEvent.TYPE, listener);
-	}
-
-	protected void fireChange() {
-		checkRealm();
-		fireEvent(new ChangeEvent(this));
-	}
-
-	protected void fireStale() {
-		checkRealm();
-		fireEvent(new StaleEvent(this));
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public boolean isDisposed() {
-		return disposed;
-	}
-
-	/**
-	 * 
-	 */
-	public synchronized void dispose() {
-		if (!disposed) {
-			disposed = true;
-			fireEvent(new DisposeEvent(this));
-			super.dispose();
-		}
-	}
-
-	/**
-	 * Asserts that the realm is the current realm.
-	 * 
-	 * @see Realm#isCurrent()
-	 * @throws AssertionFailedException if the realm is not the current realm
-	 */
-	protected void checkRealm() {
-		Assert.isTrue(getRealm().isCurrent(),
-				"This operation must be run within the observable's realm"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ChangeEvent.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ChangeEvent.java
deleted file mode 100644
index 60950cf..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ChangeEvent.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * Generic change event denoting that the state of an {@link IObservable} object
- * has changed. This event does not carry information about the kind of change
- * that occurred.
- * 
- * @since 1.0
- * 
- */
-public class ChangeEvent extends ObservableEvent {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -3241193109844979384L;
-	static final Object TYPE = new Object();
-
-	/**
-	 * Creates a new change event object.
-	 * 
-	 * @param source
-	 *            the observable that changed state
-	 */
-	public ChangeEvent(IObservable source) {
-		super(source);
-	}
-
-	protected void dispatch(IObservablesListener listener) {
-		((IChangeListener) listener).handleChange(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ChangeManager.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ChangeManager.java
deleted file mode 100644
index bf2be9a..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ChangeManager.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 118516
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ListenerList;
-
-/**
- * Listener management implementation. Exposed to subclasses in form of
- * {@link AbstractObservable} and {@link ChangeSupport}.
- * 
- * @since 1.0
- * 
- */
-/* package */ class ChangeManager {
-
-	ListenerList[] listenerLists = null;
-	Object listenerTypes[] = null;
-	private Realm realm;
-
-	/**
-	 * @param realm 
-	 * 
-	 */
-	/* package */ ChangeManager(Realm realm) {
-		Assert.isNotNull(realm, "Realm cannot be null"); //$NON-NLS-1$
-		this.realm = realm;
-	}
-
-	/**
-	 * @param listenerType
-	 * @param listener
-	 */
-	protected void addListener(Object listenerType,
-			IObservablesListener listener) {
-		int listenerTypeIndex = findListenerTypeIndex(listenerType);
-		if (listenerTypeIndex == -1) {
-			int length;
-			if (listenerTypes == null) {
-				length = 0;
-				listenerTypes = new Object[1];
-				listenerLists = new ListenerList[1];
-			} else {
-				length = listenerTypes.length;
-				System.arraycopy(listenerTypes, 0,
-						listenerTypes = new Object[length + 1], 0, length);
-				System
-						.arraycopy(listenerLists, 0,
-								listenerLists = new ListenerList[length + 1],
-								0, length);
-			}
-			listenerTypes[length] = listenerType;
-			listenerLists[length] = new ListenerList();
-			boolean hadListeners = hasListeners();
-			listenerLists[length].add(listener);
-			if (!hadListeners) {
-				this.firstListenerAdded();
-			}
-			return;
-		}
-		ListenerList listenerList = listenerLists[listenerTypeIndex];
-		boolean hadListeners = true;
-		if (listenerList.size() == 0) {
-			hadListeners = hasListeners();
-		}
-		listenerList.add(listener);
-		if (!hadListeners) {
-			firstListenerAdded();
-		}
-	}
-
-	/**
-	 * @param listenerType
-	 * @param listener
-	 */
-	protected void removeListener(Object listenerType,
-			IObservablesListener listener) {
-		int listenerTypeIndex = findListenerTypeIndex(listenerType);
-		if (listenerTypeIndex != -1) {
-			listenerLists[listenerTypeIndex].remove(listener);
-			if (listenerLists[listenerTypeIndex].size() == 0) {
-				if (!hasListeners()) {
-					this.lastListenerRemoved();
-				}
-			}
-		}
-	}
-
-	protected boolean hasListeners() {
-		if (listenerTypes == null) {
-			return false;
-		}
-		for (int i = 0; i < listenerTypes.length; i++) {
-			if (listenerLists[i].size() > 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private int findListenerTypeIndex(Object listenerType) {
-		if (listenerTypes != null) {
-			for (int i = 0; i < listenerTypes.length; i++) {
-				if (listenerTypes[i] == listenerType) {
-					return i;
-				}
-			}
-		}
-		return -1;
-	}
-
-	protected void fireEvent(ObservableEvent event) {
-		Object listenerType = event.getListenerType();
-		int listenerTypeIndex = findListenerTypeIndex(listenerType);
-		if (listenerTypeIndex != -1) {
-			Object[] listeners = listenerLists[listenerTypeIndex]
-					.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				event.dispatch((IObservablesListener) listeners[i]);
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	protected void firstListenerAdded() {
-	}
-
-	/**
-	 * 
-	 */
-	protected void lastListenerRemoved() {
-	}
-
-	/**
-	 * 
-	 */
-	public void dispose() {
-		listenerLists = null;
-		listenerTypes = null;
-		realm = null;
-	}
-
-	/**
-	 * @return Returns the realm.
-	 */
-	public Realm getRealm() {
-		return realm;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ChangeSupport.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ChangeSupport.java
deleted file mode 100644
index 5f47554..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ChangeSupport.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 146397
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * @since 1.0
- *
- */
-public abstract class ChangeSupport extends ChangeManager {
-
-	/**
-	 * @param realm 
-	 */
-	public ChangeSupport(Realm realm) {
-		super(realm);
-	}
-	
-	public void addListener(Object listenerType,
-			IObservablesListener listener) {
-		super.addListener(listenerType, listener);
-	}
-	
-	public void removeListener(Object listenerType,
-			IObservablesListener listener) {
-		super.removeListener(listenerType, listener);
-	}
-	
-	public void fireEvent(ObservableEvent event) {
-		super.fireEvent(event);
-	}
-	
-	/**
-	 * 
-	 */
-	protected abstract void firstListenerAdded();
-	
-	/**
-	 * 
-	 */
-	protected abstract void lastListenerRemoved();
-
-	/**
-	 * @param listener
-	 */
-	public void addChangeListener(IChangeListener listener) {
-		addListener(ChangeEvent.TYPE, listener);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void removeChangeListener(IChangeListener listener) {
-		removeListener(ChangeEvent.TYPE, listener);
-	}
-
-	/**
-	 * @param listener
-	 */
-	public void addStaleListener(IStaleListener listener) {
-		addListener(StaleEvent.TYPE, listener);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void removeStaleListener(IStaleListener listener) {
-		removeListener(StaleEvent.TYPE, listener);
-	}
-
-	/**
-	 * @param listener 
-	 * @since 1.2
-	 */
-	public void addDisposeListener(IDisposeListener listener) {
-		addListener(DisposeEvent.TYPE, listener);
-	}
-
-	/**
-	 * @param listener
-	 * @since 1.2
-	 */
-	public void removeDisposeListener(IDisposeListener listener) {
-		removeListener(DisposeEvent.TYPE, listener);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/DecoratingObservable.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/DecoratingObservable.java
deleted file mode 100644
index 642dfe6..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/DecoratingObservable.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237718)
- *     Matthew Hall - but 246626
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import org.eclipse.core.internal.databinding.Util;
-
-/**
- * An observable which decorates another observable
- * 
- * @since 1.2
- * 
- */
-public class DecoratingObservable extends AbstractObservable implements
-		IDecoratingObservable {
-
-	private IObservable decorated;
-
-	private IStaleListener staleListener;
-
-	private boolean disposedDecoratedOnDispose;
-
-	/**
-	 * Constructs a DecoratingObservable which decorates the given observable.
-	 * 
-	 * @param decorated
-	 *            the observable being decorated.
-	 * @param disposeDecoratedOnDispose
-	 *            whether the decorated observable should be disposed when the
-	 *            decorator is disposed
-	 */
-	public DecoratingObservable(IObservable decorated,
-			boolean disposeDecoratedOnDispose) {
-		super(decorated.getRealm());
-		this.decorated = decorated;
-		this.disposedDecoratedOnDispose = disposeDecoratedOnDispose;
-	}
-
-	public IObservable getDecorated() {
-		return decorated;
-	}
-
-	public boolean isStale() {
-		getterCalled();
-		return decorated.isStale();
-	}
-
-	protected void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	protected void firstListenerAdded() {
-		if (staleListener == null) {
-			staleListener = new IStaleListener() {
-				public void handleStale(StaleEvent staleEvent) {
-					DecoratingObservable.this.handleStaleEvent(staleEvent);
-				}
-			};
-		}
-		decorated.addStaleListener(staleListener);
-	}
-
-	protected void lastListenerRemoved() {
-		if (staleListener != null) {
-			decorated.removeStaleListener(staleListener);
-			staleListener = null;
-		}
-	}
-
-	/**
-	 * Called whenever a StaleEvent is received from the decorated observable.
-	 * By default, this method fires the stale event again, with the decorating
-	 * observable as the event source. Subclasses may override to provide
-	 * different behavior.
-	 * 
-	 * @param event
-	 *            the stale event received from the decorated observable
-	 */
-	protected void handleStaleEvent(StaleEvent event) {
-		fireStale();
-	}
-
-	public boolean equals(Object obj) {
-		getterCalled();
-		if (obj == this)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() == obj.getClass()) {
-			DecoratingObservable other = (DecoratingObservable) obj;
-			return Util.equals(this.decorated, other.decorated);
-		}
-		return Util.equals(decorated, obj);
-	}
-
-	public int hashCode() {
-		getterCalled();
-		return decorated.hashCode();
-	}
-
-	public synchronized void dispose() {
-		if (decorated != null && staleListener != null) {
-			decorated.removeStaleListener(staleListener);
-		}
-		if (decorated != null) {
-			if (disposedDecoratedOnDispose)
-				decorated.dispose();
-			decorated = null;
-		}
-		staleListener = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/DecoratingObservableCollection.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/DecoratingObservableCollection.java
deleted file mode 100644
index 2129e08..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/DecoratingObservableCollection.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237718)
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-/**
- * An observable collection which decorates another observable collection
- * 
- * @since 1.2
- */
-public class DecoratingObservableCollection extends DecoratingObservable
-		implements IObservableCollection {
-	private IObservableCollection decorated;
-
-	/**
-	 * @param decorated
-	 * @param disposeDecoratedOnDispose
-	 */
-	public DecoratingObservableCollection(IObservableCollection decorated,
-			boolean disposeDecoratedOnDispose) {
-		super(decorated, disposeDecoratedOnDispose);
-		this.decorated = decorated;
-	}
-
-	public boolean add(Object o) {
-		getterCalled();
-		return decorated.add(o);
-	}
-
-	public boolean addAll(Collection c) {
-		getterCalled();
-		return decorated.addAll(c);
-	}
-
-	public void clear() {
-		checkRealm();
-		decorated.clear();
-	}
-
-	public boolean contains(Object o) {
-		getterCalled();
-		return decorated.contains(o);
-	}
-
-	public boolean containsAll(Collection c) {
-		getterCalled();
-		return decorated.containsAll(c);
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		return decorated.isEmpty();
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final Iterator decoratedIterator = decorated.iterator();
-		return new Iterator() {
-			public void remove() {
-				decoratedIterator.remove();
-			}
-
-			public boolean hasNext() {
-				getterCalled();
-				return decoratedIterator.hasNext();
-			}
-
-			public Object next() {
-				getterCalled();
-				return decoratedIterator.next();
-			}
-		};
-	}
-
-	public boolean remove(Object o) {
-		getterCalled();
-		return decorated.remove(o);
-	}
-
-	public boolean removeAll(Collection c) {
-		getterCalled();
-		return decorated.removeAll(c);
-	}
-
-	public boolean retainAll(Collection c) {
-		getterCalled();
-		return decorated.retainAll(c);
-	}
-
-	public int size() {
-		getterCalled();
-		return decorated.size();
-	}
-
-	public Object[] toArray() {
-		getterCalled();
-		return decorated.toArray();
-	}
-
-	public Object[] toArray(Object[] a) {
-		getterCalled();
-		return decorated.toArray(a);
-	}
-
-	public Object getElementType() {
-		return decorated.getElementType();
-	}
-
-	public boolean equals(Object o) {
-		getterCalled();
-		return decorated.equals(o);
-	}
-
-	public int hashCode() {
-		getterCalled();
-		return decorated.hashCode();
-	}
-
-	public String toString() {
-		getterCalled();
-		return decorated.toString();
-	}
-
-	public synchronized void dispose() {
-		decorated = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/Diffs.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/Diffs.java
deleted file mode 100644
index 9500537..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/Diffs.java
+++ /dev/null
@@ -1,470 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 226216
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import org.eclipse.core.databinding.observable.list.ListDiff;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.databinding.observable.map.MapDiff;
-import org.eclipse.core.databinding.observable.set.SetDiff;
-import org.eclipse.core.databinding.observable.value.ValueDiff;
-import org.eclipse.core.internal.databinding.Util;
-
-/**
- * @since 1.0
- * 
- */
-public class Diffs {
-
-	/**
-	 * @param oldList
-	 * @param newList
-	 * @return the differences between oldList and newList
-	 */
-	public static ListDiff computeListDiff(List oldList, List newList) {
-		List diffEntries = new ArrayList();
-		createListDiffs(new ArrayList(oldList), newList, diffEntries);
-		ListDiff listDiff = createListDiff((ListDiffEntry[]) diffEntries
-				.toArray(new ListDiffEntry[diffEntries.size()]));
-		return listDiff;
-	}
-	
-	/**
-	 * adapted from EMF's ListDifferenceAnalyzer
-	 */
-	private static void createListDiffs(List oldList, List newList,
-			List listDiffs) {
-		int index = 0;
-		for (Iterator it = newList.iterator(); it.hasNext();) {
-			Object newValue = it.next();
-			if (oldList.size() <= index) {
-				// append newValue to newList 
-				listDiffs.add(createListDiffEntry(index, true, newValue));
-			} else {
-				boolean done;
-				do {
-					done = true;
-					Object oldValue = oldList.get(index);
-					if (oldValue == null ? newValue != null : !oldValue.equals(newValue)) {
-						int oldIndexOfNewValue = listIndexOf(oldList, newValue, index);
-						if (oldIndexOfNewValue != -1) {
-							int newIndexOfOldValue = listIndexOf(newList, oldValue, index);
-							if (newIndexOfOldValue == -1) {
-								// removing oldValue from list[index]
-								listDiffs.add(createListDiffEntry(index, false, oldValue));
-								oldList.remove(index);
-								done = false;
-							} else if (newIndexOfOldValue > oldIndexOfNewValue) {
-								// moving oldValue from list[index] to [newIndexOfOldValue] 
-								if (oldList.size() <= newIndexOfOldValue) {
-									// The element cannot be moved to the correct index
-									// now, however later iterations will insert elements
-									// in front of it, eventually moving it into the
-									// correct spot.
-									newIndexOfOldValue = oldList.size() - 1;
-								}
-								listDiffs.add(createListDiffEntry(index, false, oldValue));
-								oldList.remove(index);
-								listDiffs.add(createListDiffEntry(newIndexOfOldValue, true, oldValue));
-								oldList.add(newIndexOfOldValue, oldValue);
-								done = false;
-							} else {
-								// move newValue from list[oldIndexOfNewValue] to [index]
-								listDiffs.add(createListDiffEntry(oldIndexOfNewValue, false, newValue));
-								oldList.remove(oldIndexOfNewValue);
-								listDiffs.add(createListDiffEntry(index, true, newValue));
-								oldList.add(index, newValue);
-							}
-						} else {
-							// add newValue at list[index]
-							oldList.add(index, newValue);
-							listDiffs.add(createListDiffEntry(index, true, newValue));
-						}
-					}
-				} while (!done);
-			}
-			++index;
-		}
-		for (int i = oldList.size(); i > index;) {
-			// remove excess trailing elements not present in newList
-			listDiffs.add(createListDiffEntry(--i, false, oldList.get(i)));
-		}
-	}
-
-	/**
-	 * @param list
-	 * @param object
-	 * @param index
-	 * @return the index, or -1 if not found
-	 */
-	private static int listIndexOf(List list, Object object, int index) {
-		int size = list.size();
-		for (int i=index; i<size;i++) {
-			Object candidate = list.get(i);
-			if (candidate==null ? object==null : candidate.equals(object)) {
-				return i;
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * Checks whether the two objects are <code>null</code> -- allowing for
-	 * <code>null</code>.
-	 * 
-	 * @param left
-	 *            The left object to compare; may be <code>null</code>.
-	 * @param right
-	 *            The right object to compare; may be <code>null</code>.
-	 * @return <code>true</code> if the two objects are equivalent;
-	 *         <code>false</code> otherwise.
-	 */
-	public static final boolean equals(final Object left, final Object right) {
-		return left == null ? right == null : ((right != null) && left
-				.equals(right));
-	}
-
-	/**
-	 * @param oldSet
-	 * @param newSet
-	 * @return a set diff
-	 */
-	public static SetDiff computeSetDiff(Set oldSet, Set newSet) {
-		Set additions = new HashSet(newSet);
-		additions.removeAll(oldSet);
-		Set removals = new HashSet(oldSet);
-		removals.removeAll(newSet);
-		return createSetDiff(additions, removals);
-	}
-
-	/**
-	 * Computes the difference between two maps.
-	 * 
-	 * @param oldMap
-	 * @param newMap
-	 * @return a map diff representing the changes needed to turn oldMap into
-	 *         newMap
-	 */
-	public static MapDiff computeMapDiff(Map oldMap, Map newMap) {
-		// starts out with all keys from the new map, we will remove keys from
-		// the old map as we go
-		final Set addedKeys = new HashSet(newMap.keySet());
-		final Set removedKeys = new HashSet();
-		final Set changedKeys = new HashSet();
-		final Map oldValues = new HashMap();
-		final Map newValues = new HashMap();
-		for (Iterator it = oldMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry oldEntry = (Entry) it.next();
-			Object oldKey = oldEntry.getKey();
-			if (addedKeys.remove(oldKey)) {
-				// potentially changed key since it is in oldMap and newMap
-				Object oldValue = oldEntry.getValue();
-				Object newValue = newMap.get(oldKey);
-				if (!Util.equals(oldValue, newValue)) {
-					changedKeys.add(oldKey);
-					oldValues.put(oldKey, oldValue);
-					newValues.put(oldKey, newValue);
-				}
-			} else {
-				removedKeys.add(oldKey);
-				oldValues.put(oldKey, oldEntry.getValue());
-			}
-		}
-		for (Iterator it = addedKeys.iterator(); it.hasNext();) {
-			Object newKey = it.next();
-			newValues.put(newKey, newMap.get(newKey));
-		}
-		return new MapDiff() {
-			public Set getAddedKeys() {
-				return addedKeys;
-			}
-
-			public Set getChangedKeys() {
-				return changedKeys;
-			}
-
-			public Set getRemovedKeys() {
-				return removedKeys;
-			}
-
-			public Object getNewValue(Object key) {
-				return newValues.get(key);
-			}
-
-			public Object getOldValue(Object key) {
-				return oldValues.get(key);
-			}
-		};
-	}
-	
-	/**
-	 * @param oldValue
-	 * @param newValue
-	 * @return a value diff
-	 */
-	public static ValueDiff createValueDiff(final Object oldValue,
-			final Object newValue) {
-		return new ValueDiff() {
-
-			public Object getOldValue() {
-				return oldValue;
-			}
-
-			public Object getNewValue() {
-				return newValue;
-			}
-		};
-	}
-
-	/**
-	 * @param additions
-	 * @param removals
-	 * @return a set diff
-	 */
-	public static SetDiff createSetDiff(Set additions, Set removals) {
-		final Set unmodifiableAdditions = Collections
-				.unmodifiableSet(additions);
-		final Set unmodifiableRemovals = Collections.unmodifiableSet(removals);
-		return new SetDiff() {
-
-			public Set getAdditions() {
-				return unmodifiableAdditions;
-			}
-
-			public Set getRemovals() {
-				return unmodifiableRemovals;
-			}
-		};
-	}
-
-	/**
-	 * @param difference
-	 * @return a list diff with one differing entry
-	 */
-	public static ListDiff createListDiff(ListDiffEntry difference) {
-		return createListDiff(new ListDiffEntry[] { difference });
-	}
-
-	/**
-	 * @param difference1
-	 * @param difference2
-	 * @return a list diff with two differing entries
-	 */
-	public static ListDiff createListDiff(ListDiffEntry difference1,
-			ListDiffEntry difference2) {
-		return createListDiff(new ListDiffEntry[] { difference1, difference2 });
-	}
-
-	/**
-	 * @param differences
-	 * @return a list diff with the given entries
-	 */
-	public static ListDiff createListDiff(final ListDiffEntry[] differences) {
-		return new ListDiff() {
-			public ListDiffEntry[] getDifferences() {
-				return differences;
-			}
-		};
-	}
-
-	/**
-	 * @param position
-	 * @param isAddition
-	 * @param element
-	 * @return a list diff entry
-	 */
-	public static ListDiffEntry createListDiffEntry(final int position,
-			final boolean isAddition, final Object element) {
-		return new ListDiffEntry() {
-
-			public int getPosition() {
-				return position;
-			}
-
-			public boolean isAddition() {
-				return isAddition;
-			}
-
-			public Object getElement() {
-				return element;
-			}
-		};
-	}
-
-	/**
-	 * @param addedKey
-	 * @param newValue
-	 * @return a map diff
-	 */
-	public static MapDiff createMapDiffSingleAdd(final Object addedKey,
-			final Object newValue) {
-		return new MapDiff() {
-
-			public Set getAddedKeys() {
-				return Collections.singleton(addedKey);
-			}
-
-			public Set getChangedKeys() {
-				return Collections.EMPTY_SET;
-			}
-
-			public Object getNewValue(Object key) {
-				return newValue;
-			}
-
-			public Object getOldValue(Object key) {
-				return null;
-			}
-
-			public Set getRemovedKeys() {
-				return Collections.EMPTY_SET;
-			}
-		};
-	}
-
-	/**
-	 * @param existingKey
-	 * @param oldValue
-	 * @param newValue
-	 * @return a map diff
-	 */
-	public static MapDiff createMapDiffSingleChange(final Object existingKey,
-			final Object oldValue, final Object newValue) {
-		return new MapDiff() {
-
-			public Set getAddedKeys() {
-				return Collections.EMPTY_SET;
-			}
-
-			public Set getChangedKeys() {
-				return Collections.singleton(existingKey);
-			}
-
-			public Object getNewValue(Object key) {
-				return newValue;
-			}
-
-			public Object getOldValue(Object key) {
-				return oldValue;
-			}
-
-			public Set getRemovedKeys() {
-				return Collections.EMPTY_SET;
-			}
-		};
-	}
-
-	/**
-	 * @param removedKey
-	 * @param oldValue
-	 * @return a map diff
-	 */
-	public static MapDiff createMapDiffSingleRemove(final Object removedKey,
-			final Object oldValue) {
-		return new MapDiff() {
-
-			public Set getAddedKeys() {
-				return Collections.EMPTY_SET;
-			}
-
-			public Set getChangedKeys() {
-				return Collections.EMPTY_SET;
-			}
-
-			public Object getNewValue(Object key) {
-				return null;
-			}
-
-			public Object getOldValue(Object key) {
-				return oldValue;
-			}
-
-			public Set getRemovedKeys() {
-				return Collections.singleton(removedKey);
-			}
-		};
-	}
-
-	/**
-	 * @param copyOfOldMap
-	 * @return a map diff
-	 */
-	public static MapDiff createMapDiffRemoveAll(final Map copyOfOldMap) {
-		return new MapDiff() {
-
-			public Set getAddedKeys() {
-				return Collections.EMPTY_SET;
-			}
-
-			public Set getChangedKeys() {
-				return Collections.EMPTY_SET;
-			}
-
-			public Object getNewValue(Object key) {
-				return null;
-			}
-
-			public Object getOldValue(Object key) {
-				return copyOfOldMap.get(key);
-			}
-
-			public Set getRemovedKeys() {
-				return copyOfOldMap.keySet();
-			}
-		};
-	}
-
-	/**
-	 * @param addedKeys
-	 * @param removedKeys
-	 * @param changedKeys
-	 * @param oldValues
-	 * @param newValues
-	 * @return a map diff
-	 */
-	public static MapDiff createMapDiff(final Set addedKeys,
-			final Set removedKeys, final Set changedKeys, final Map oldValues,
-			final Map newValues) {
-		return new MapDiff() {
-
-			public Set getAddedKeys() {
-				return addedKeys;
-			}
-
-			public Set getChangedKeys() {
-				return changedKeys;
-			}
-
-			public Object getNewValue(Object key) {
-				return newValues.get(key);
-			}
-
-			public Object getOldValue(Object key) {
-				return oldValues.get(key);
-			}
-
-			public Set getRemovedKeys() {
-				return removedKeys;
-			}
-		};
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/DisposeEvent.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/DisposeEvent.java
deleted file mode 100644
index f99986e..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/DisposeEvent.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 146397)
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * Event denoting that an {@link IObservable} object was disposed.
- * 
- * @since 1.2
- */
-public class DisposeEvent extends ObservableEvent {
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -3241193109844979384L;
-
-	static final Object TYPE = new Object();
-
-	/**
-	 * Creates a new dispose event object.
-	 * 
-	 * @param source
-	 *            the observable that was disposed
-	 */
-	public DisposeEvent(IObservable source) {
-		super(source);
-	}
-
-	protected void dispatch(IObservablesListener listener) {
-		((IDisposeListener) listener).handleDispose(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IChangeListener.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IChangeListener.java
deleted file mode 100644
index d0a5cee..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IChangeListener.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-
-/**
- * Listener for generic change events. Note that the change events do not carry
- * information about the change, they only specify the affected observable. To
- * listen for specific change events, use more specific change listeners.
- * 
- * @see IValueChangeListener
- * @see IListChangeListener
- * @see ISetChangeListener
- * @see IMapChangeListener
- * 
- * @since 1.0
- */
-public interface IChangeListener extends IObservablesListener {
-
-	/**
-	 * Handle a generic change to the given observable. The given event object
-	 * must only be used locally in this method because it may be reused for
-	 * other change notifications.
-	 * 
-	 * @param event
-	 */
-	public void handleChange(ChangeEvent event);
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IDecoratingObservable.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IDecoratingObservable.java
deleted file mode 100644
index f66e2f8..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IDecoratingObservable.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237718)
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * Interface for observables which decorate other observables.
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the classes in the
- *              framework that implement this interface. Note that direct
- *              implementers of this interface outside of the framework will be
- *              broken in future releases when methods are added to this
- *              interface.
- * @since 1.2
- */
-public interface IDecoratingObservable extends IObservable {
-	/**
-	 * @return the observable that this observable decorates.
-	 */
-	public IObservable getDecorated();
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IDisposeListener.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IDisposeListener.java
deleted file mode 100644
index b48755a..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IDisposeListener.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 146397)
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * Listener for dispose events. An observable object is disposed if its
- * {@link IObservable#dispose()} method has been called.
- * 
- * @since 1.2
- */
-public interface IDisposeListener extends IObservablesListener {
-	/**
-	 * Handle the event that the given observable object has been disposed. The
-	 * given event object must only be used locally in this method because it
-	 * may be reused for other dispose notifications.
-	 * 
-	 * @param staleEvent
-	 */
-	public void handleDispose(DisposeEvent staleEvent);
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IObservable.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IObservable.java
deleted file mode 100644
index b402608..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IObservable.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bugs 237718, 146397
- *******************************************************************************/
-package org.eclipse.core.databinding.observable;
-
-/**
- * An object with state that allows to listen for state changes.
- * 
- * <p>
- * Implementations must not manage listeners themselves, listener management
- * must be delegated to a private instance of type {@link ChangeSupport} if it
- * is not inherited from {@link AbstractObservable}.
- * </p>
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the classes in the
- *              framework that implement this interface. Note that direct
- *              implementers of this interface outside of the framework will be
- *              broken in future releases when methods are added to this
- *              interface.
- * 
- * @since 1.0
- * 
- */
-public interface IObservable {
-
-	/**
-	 * Returns the realm for this observable. Unless otherwise specified,
-	 * getters and setters must be accessed from within this realm. Listeners
-	 * will be within this realm when they receive events from this observable.
-	 * <p>
-	 * Because observables can only be accessed from within one realm, and they
-	 * always fire events on that realm, their state can be observed in an
-	 * incremental way. It is always safe to call getters of an observable from
-	 * within a change listener attached to that observable.
-	 * </p>
-	 * 
-	 * @return the realm
-	 */
-	public Realm getRealm();
-
-	/**
-	 * Adds the given change listener to the list of change listeners. Change
-	 * listeners are notified about changes of the state of this observable in a
-	 * generic way, without specifying the change that happened. To get the
-	 * changed state, a change listener needs to query for the current state of
-	 * this observable.
-	 * 
-	 * @param listener
-	 */
-	public void addChangeListener(IChangeListener listener);
-
-	/**
-	 * Removes the given change listener from the list of change listeners. Has
-	 * no effect if the given listener is not registered as a change listener.
-	 * 
-	 * @param listener
-	 */
-	public void removeChangeListener(IChangeListener listener);
-
-	/**
-	 * Adds the given stale listener to the list of stale listeners. Stale
-	 * listeners are notified when an observable object becomes stale, not when
-	 * is becomes non-stale.
-	 * 
-	 * @param listener
-	 * 
-	 * @see #isStale()
-	 */
-	public void addStaleListener(IStaleListener listener);
-
-	/**
-	 * Removes the given stale listener from the list of stale listeners. Has no
-	 * effect if the given listener is not registered as a stale listener.
-	 * 
-	 * @param listener
-	 */
-	public void removeStaleListener(IStaleListener listener);
-
-	/**
-	 * Returns whether the state of this observable is stale and is expected to
-	 * change soon. A non-stale observable that becomes stale will notify its
-	 * stale listeners. A stale object that becomes non-stale does so by
-	 * changing its state and notifying its change listeners, it does <b>not</b>
-	 * notify its stale listeners about becoming non-stale. Clients that do not
-	 * expect asynchronous changes may ignore staleness of observable objects.
-	 * 
-	 * @return true if this observable's state is stale and will change soon.
-	 * 
-	 * @TrackedGetter - implementers must call
-	 *                {@link ObservableTracker#getterCalled(IObservable)}.
-	 */
-	public boolean isStale();
-
-	/**
-	 * Adds the given dispose listener to the list of dispose listeners. Dispose
-	 * listeners are notified when an observable has been disposed.
-	 * 
-	 * @param listener
-	 *            the listener to add
-	 * @since 1.2
-	 */
-	public void addDisposeListener(IDisposeListener listener);
-
-	/**
-	 * Removes the given dispose listener from the list of dispose listeners.
-	 * Has no effect if the given listener is not registered as a dispose
-	 * listener.
-	 * 
-	 * @param listener
-	 *            the listener to remove
-	 * @since 1.2
-	 */
-	public void removeDisposeListener(IDisposeListener listener);
-
-	/**
-	 * Returns whether the observable has been disposed
-	 * 
-	 * @return whether the observable has been disposed
-	 * @since 1.2
-	 */
-	public boolean isDisposed();
-
-	/**
-	 * Disposes of this observable object, removing all listeners registered
-	 * with this object, and all listeners this object might have registered on
-	 * other objects.
-	 */
-	public void dispose();
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IObservableCollection.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IObservableCollection.java
deleted file mode 100644
index 8d1ee9b..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IObservableCollection.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import java.util.Collection;
-
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-
-/**
- * Interface for observable collections. Only general change listeners can be
- * added to an observable collection. Listeners interested in incremental
- * changes have to be added using more concrete subtypes such as
- * {@link IObservableList} or {@link IObservableSet}.
- * 
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the classes that
- *              implement this interface. Note that direct implementers of this
- *              interface outside of the framework will be broken in future
- *              releases when methods are added to this interface. </p>
- * 
- * @since 1.0
- */
-public interface IObservableCollection extends IObservable, Collection {
-
-	/**
-	 * Returns the element type of this observable collection, or
-	 * <code>null</code> if this observable collection is untyped.
-	 * 
-	 * @return the element type of this observable collection, or
-	 *         <code>null</code> if this observable collection is untyped.
-	 */
-	Object getElementType();
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IObservablesListener.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IObservablesListener.java
deleted file mode 100644
index bc0687c..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IObservablesListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * Marker interface for all listener types in the observables framework.
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- * 
- * @since 1.0
- */
-public interface IObservablesListener {
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IObserving.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IObserving.java
deleted file mode 100644
index 1c9fc13..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IObserving.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * 
- * Mixin interface for IObservables that observe other objects.
- * 
- * @since 1.0
- * 
- */
-public interface IObserving {
-
-	/**
-	 * Returns the observed object, or <code>null</code> if this observing
-	 * object does not currently observe an object.
-	 * 
-	 * @return the observed object, or <code>null</code>
-	 */
-	public Object getObserved();
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IStaleListener.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IStaleListener.java
deleted file mode 100644
index 5729198..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/IStaleListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * Listener for staleness events. An observable object is stale if its state
- * will change eventually.
- * 
- * @since 1.0
- */
-public interface IStaleListener extends IObservablesListener {
-
-	/**
-	 * Handle the event that the given observable object is now stale. The given
-	 * event object must only be used locally in this method because it may be
-	 * reused for other change notifications.
-	 * 
-	 * @param staleEvent
-	 */
-	public void handleStale(StaleEvent staleEvent);
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ObservableEvent.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ObservableEvent.java
deleted file mode 100644
index 38a865c..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ObservableEvent.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import java.util.EventObject;
-
-/**
- * Abstract event object for events fired by {@link IObservable} objects. All
- * events fired by observables must be derived from this class so that the way
- * of dispatching events can be improved in later versions of the framework.
- * 
- * @since 1.0
- * 
- */
-public abstract class ObservableEvent extends EventObject {
-
-	/**
-	 * Creates a new observable event.
-	 * 
-	 * @param source
-	 */
-	public ObservableEvent(IObservable source) {
-		super(source);
-	}
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 7693906965267871813L;
-
-	/**
-	 * Returns the observable that generated this event.
-	 * 
-	 * @return the observable that generated this event
-	 */
-	public IObservable getObservable() {
-		return (IObservable) getSource();
-	}
-
-	/**
-	 * Dispatch this event to the given listener. Subclasses must implement this
-	 * method by calling the appropriate type-safe event handling method on the
-	 * given listener according to the type of this event.
-	 * 
-	 * @param listener
-	 *            the listener that should handle the event
-	 */
-	protected abstract void dispatch(IObservablesListener listener);
-
-	/**
-	 * Returns a unique object used for distinguishing this event type from
-	 * others.
-	 * 
-	 * @return a unique object representing the concrete type of this event.
-	 */
-	protected abstract Object getListenerType();
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ObservableTracker.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ObservableTracker.java
deleted file mode 100644
index 9c57bd5..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ObservableTracker.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bugs 210115, 146397
- *******************************************************************************/
-package org.eclipse.core.databinding.observable;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.internal.databinding.IdentityWrapper;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * This class makes it possible to monitor whenever an IObservable is read from.
- * This can be used to automatically attach and remove listeners. How to use it:
- * 
- * <p>
- * If you are implementing an IObservable, invoke getterCalled(this) whenever a
- * getter is called - that is, whenever your observable is read from. You only
- * need to do this once per method call. If one getter delegates to another, the
- * outer getter doesn't need to call the method since the inner one will.
- * </p>
- * 
- * <p>
- * If you want to determine what observables were used in a particular block of
- * code, call runAndMonitor(Runnable). This will execute the given runnable and
- * return the set of observables that were read from.
- * </p>
- * 
- * <p>
- * This can be used to automatically attach listeners. For example, imagine you
- * have a block of code that updates some widget by reading from a bunch of
- * observables. Whenever one of those observables changes, you want to re-run
- * the code and cause the widget to be refreshed. You could do this in the
- * traditional manner by attaching one listener to each observable and
- * re-running your widget update code whenever one of them changes, but this
- * code is repetitive and requires updating the listener code whenever you
- * refactor the widget updating code.
- * </p>
- * 
- * <p>
- * Alternatively, you could use a utility class that runs the code in a
- * runAndMonitor block and automatically attach listeners to any observable used
- * in updating the widget. The advantage of the latter approach is that it,
- * eliminates the code for attaching and detaching listeners and will always
- * stay in synch with changes to the widget update logic.
- * </p>
- * 
- * @since 1.0
- */
-public class ObservableTracker {
-
-	/**
-	 * Threadlocal storage pointing to the current Set of IObservables, or null
-	 * if none. Note that this is actually the top of a stack. Whenever a method
-	 * changes the current value, it remembers the old value as a local variable
-	 * and restores the old value when the method exits.
-	 */
-	private static ThreadLocal currentChangeListener = new ThreadLocal();
-
-	private static ThreadLocal currentStaleListener = new ThreadLocal();
-
-	private static ThreadLocal currentObservableSet = new ThreadLocal();
-
-	/**
-	 * Invokes the given runnable, and returns the set of IObservables that were
-	 * read by the runnable. If the runnable calls this method recursively, the
-	 * result will not contain IObservables that were used within the inner
-	 * runnable.
-	 * 
-	 * @param runnable
-	 *            runnable to execute
-	 * @param changeListener
-	 *            listener to register with all accessed observables
-	 * @param staleListener
-	 *            listener to register with all accessed observables, or
-	 *            <code>null</code> if no stale listener is to be registered
-	 * @return an array of unique observable objects
-	 */
-	public static IObservable[] runAndMonitor(Runnable runnable,
-			IChangeListener changeListener, IStaleListener staleListener) {
-		// Remember the previous value in the listener stack
-		Set lastObservableSet = (Set) currentObservableSet.get();
-		IChangeListener lastChangeListener = (IChangeListener) currentChangeListener
-				.get();
-		IStaleListener lastStaleListener = (IStaleListener) currentStaleListener
-				.get();
-
-		Set observableSet = new HashSet();
-		// Push the new listeners to the top of the stack
-		currentObservableSet.set(observableSet);
-		currentChangeListener.set(changeListener);
-		currentStaleListener.set(staleListener);
-		try {
-			runnable.run();
-		} finally {
-			// Pop the new listener off the top of the stack (by restoring the
-			// previous listener)
-			currentObservableSet.set(lastObservableSet);
-			currentChangeListener.set(lastChangeListener);
-			currentStaleListener.set(lastStaleListener);
-		}
-
-		int i = 0;
-		IObservable[] result = new IObservable[observableSet.size()];
-		for (Iterator it = observableSet.iterator(); it.hasNext();) {
-			IdentityWrapper wrapper = (IdentityWrapper) it.next();
-			result[i++] = (IObservable) wrapper.unwrap();
-		}
-
-		return result;
-	}
-	
-	/**
-	 * Runs the given runnable without tracking dependencies.
-	 * @param runnable
-	 * 
-	 * @since 1.1
-	 */
-	public static void runAndIgnore(Runnable runnable) {
-		// Remember the previous value in the listener stack
-		Set lastObservableSet = (Set) currentObservableSet.get();
-		IChangeListener lastChangeListener = (IChangeListener) currentChangeListener
-				.get();
-		IStaleListener lastStaleListener = (IStaleListener) currentStaleListener
-				.get();
-		currentObservableSet.set(null);
-		currentChangeListener.set(null);
-		currentStaleListener.set(null);
-		try {
-			runnable.run();
-		} finally {
-			// Pop the new listener off the top of the stack (by restoring the
-			// previous listener)
-			currentObservableSet.set(lastObservableSet);
-			currentChangeListener.set(lastChangeListener);
-			currentStaleListener.set(lastStaleListener);
-		}
-	}
-
-	/*
-	 * Returns the same string as the default Object.toString() implementation.
-	 * getterCalled() uses this method IObservable.toString() to avoid infinite
-	 * recursion and stack overflow.
-	 */
-	private static String toString(IObservable observable) {
-		return observable.getClass().getName() + "@" //$NON-NLS-1$
-				+ Integer.toHexString(System.identityHashCode(observable));
-	}
-
-	/**
-	 * Notifies the ObservableTracker that an observable was read from. The
-	 * JavaDoc for methods that invoke this method should include the following
-	 * tag: "@TrackedGetter This method will notify ObservableTracker that the
-	 * receiver has been read from". This lets callers know that they can rely
-	 * on automatic updates from the object without explicitly attaching a
-	 * listener.
-	 * 
-	 * @param observable
-	 */
-	public static void getterCalled(IObservable observable) {
-		if (observable.isDisposed())
-			Assert.isTrue(false, "Getter called on disposed observable " //$NON-NLS-1$
-					+ toString(observable));
-		Realm realm = observable.getRealm();
-		if (!realm.isCurrent())
-			Assert.isTrue(false, "Getter called outside realm of observable " //$NON-NLS-1$
-					+ toString(observable));
-
-		Set lastObservableSet = (Set) currentObservableSet.get();
-		if (lastObservableSet == null) {
-			return;
-		}
-		IChangeListener lastChangeListener = (IChangeListener) currentChangeListener
-				.get();
-		IStaleListener lastStaleListener = (IStaleListener) currentStaleListener
-				.get();
-
-		boolean added = false;
-		if (lastObservableSet != null) {
-			added = lastObservableSet.add(new IdentityWrapper(observable));
-		}
-
-		// If anyone is listening for observable usage...
-		if (added && lastChangeListener != null) {
-			observable.addChangeListener(lastChangeListener);
-		}
-		if (added && lastStaleListener != null) {
-			observable.addStaleListener(lastStaleListener);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/Observables.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/Observables.java
deleted file mode 100644
index fbc3ebf..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/Observables.java
+++ /dev/null
@@ -1,634 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 Cerner Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matt Carter - bug 212518 (constantObservableValue)
- *     Matthew Hall - bugs 208332, 212518, 219909, 184830, 237718, 245647,
- *         226289
- *     Marko Topolnik - bug 184830
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.list.DecoratingObservableList;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ObservableList;
-import org.eclipse.core.databinding.observable.map.DecoratingObservableMap;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
-import org.eclipse.core.databinding.observable.set.DecoratingObservableSet;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.ObservableSet;
-import org.eclipse.core.databinding.observable.value.DecoratingObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IVetoableValue;
-import org.eclipse.core.databinding.observable.value.ValueChangingEvent;
-import org.eclipse.core.internal.databinding.observable.ConstantObservableValue;
-import org.eclipse.core.internal.databinding.observable.DelayedObservableValue;
-import org.eclipse.core.internal.databinding.observable.EmptyObservableList;
-import org.eclipse.core.internal.databinding.observable.EmptyObservableSet;
-import org.eclipse.core.internal.databinding.observable.MapEntryObservableValue;
-import org.eclipse.core.internal.databinding.observable.StalenessObservableValue;
-import org.eclipse.core.internal.databinding.observable.UnmodifiableObservableList;
-import org.eclipse.core.internal.databinding.observable.UnmodifiableObservableMap;
-import org.eclipse.core.internal.databinding.observable.UnmodifiableObservableSet;
-import org.eclipse.core.internal.databinding.observable.UnmodifiableObservableValue;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * Contains static methods to operate on or return
- * {@link IObservable Observables}.
- * 
- * @since 1.0
- */
-public class Observables {
-	/**
-	 * Returns an observable which delays notification of value change events
-	 * from <code>observable</code> until <code>delay</code> milliseconds have
-	 * elapsed since the last change event. This observable helps to boost
-	 * performance in situations where an observable has computationally
-	 * expensive listeners or many dependencies. A common use of this observable
-	 * is to delay validation of user input until the user stops typing in a UI
-	 * field.
-	 * <p>
-	 * To notify about pending changes, the returned observable fires a stale
-	 * event when the wrapped observable value fires a change event, and remains
-	 * stale until the delay has elapsed and the value change is fired. A call
-	 * to {@link IObservableValue#getValue() getValue()} while a value change is
-	 * pending will fire the value change immediately, short-circuiting the
-	 * delay.
-	 * <p>
-	 * <b>Note:</b>
-	 * <ul>
-	 * <li>Use SWTObservables.observeDelayedValue() instead when the target
-	 * observable is observing a SWT Control, or
-	 * ViewersObservables.observeDelayedValue() when the target observable is
-	 * observing a JFace Viewer. These observables ensure that pending value
-	 * changes are fired when the underlying control loses focus. (Otherwise, it
-	 * is possible for pending changes to be lost if a window is closed before
-	 * the delay has elapsed.)
-	 * <li>This observable does not forward {@link ValueChangingEvent} events
-	 * from a wrapped {@link IVetoableValue}.
-	 * </ul>
-	 * 
-	 * @param delay
-	 *            the delay in milliseconds
-	 * @param observable
-	 *            the observable being delayed
-	 * @return an observable which delays notification of value change events
-	 *         from <code>observable</code> until <code>delay</code>
-	 *         milliseconds have elapsed since the last change event.
-	 * 
-	 * @since 1.2
-	 */
-	public static IObservableValue observeDelayedValue(int delay,
-			IObservableValue observable) {
-		return new DelayedObservableValue(delay, observable);
-	}
-
-	/**
-	 * Returns an unmodifiable observable value backed by the given observable
-	 * value.
-	 * 
-	 * @param value
-	 *            the value to wrap in an unmodifiable value
-	 * @return an unmodifiable observable value backed by the given observable
-	 *         value
-	 * @since 1.1
-	 */
-	public static IObservableValue unmodifiableObservableValue(
-			IObservableValue value) {
-		Assert.isNotNull(value, "Argument 'value' cannot be null"); //$NON-NLS-1$
-		return new UnmodifiableObservableValue(value);
-	}
-
-	/**
-	 * Returns an observable value with the given constant value.
-	 * 
-	 * @param realm
-	 *            the observable's realm
-	 * @param value
-	 *            the observable's constant value
-	 * @param valueType
-	 *            the observable's value type
-	 * @return an immutable observable value with the given constant value
-	 * @since 1.1
-	 */
-	public static IObservableValue constantObservableValue(Realm realm,
-			Object value, Object valueType) {
-		return new ConstantObservableValue(realm, value, valueType);
-	}
-
-	/**
-	 * Returns an observable value with the given constant value.
-	 * 
-	 * @param realm
-	 *            the observable's realm
-	 * @param value
-	 *            the observable's constant value
-	 * @return an immutable observable value with the given constant value
-	 * @since 1.1
-	 */
-	public static IObservableValue constantObservableValue(Realm realm,
-			Object value) {
-		return constantObservableValue(realm, value, null);
-	}
-
-	/**
-	 * Returns an observable value with the given constant value.
-	 * 
-	 * @param value
-	 *            the observable's constant value
-	 * @param valueType
-	 *            the observable's value type
-	 * @return an immutable observable value with the given constant value
-	 * @since 1.1
-	 */
-	public static IObservableValue constantObservableValue(Object value,
-			Object valueType) {
-		return constantObservableValue(Realm.getDefault(), value, valueType);
-	}
-
-	/**
-	 * Returns an observable value with the given constant value.
-	 * 
-	 * @param value
-	 *            the observable's constant value
-	 * @return an immutable observable value with the given constant value
-	 * @since 1.1
-	 */
-	public static IObservableValue constantObservableValue(Object value) {
-		return constantObservableValue(Realm.getDefault(), value, null);
-	}
-
-	/**
-	 * Returns an unmodifiable observable list backed by the given observable
-	 * list.
-	 * 
-	 * @param list
-	 *            the list to wrap in an unmodifiable list
-	 * @return an unmodifiable observable list backed by the given observable
-	 *         list
-	 */
-	public static IObservableList unmodifiableObservableList(
-			IObservableList list) {
-		if (list == null) {
-			throw new IllegalArgumentException("List parameter cannot be null."); //$NON-NLS-1$
-		}
-
-		return new UnmodifiableObservableList(list);
-	}
-
-	/**
-	 * Returns an unmodifiable observable set backed by the given observable
-	 * set.
-	 * 
-	 * @param set
-	 *            the set to wrap in an unmodifiable set
-	 * @return an unmodifiable observable set backed by the given observable set
-	 * @since 1.1
-	 */
-	public static IObservableSet unmodifiableObservableSet(IObservableSet set) {
-		if (set == null) {
-			throw new IllegalArgumentException("Set parameter cannot be null"); //$NON-NLS-1$
-		}
-
-		return new UnmodifiableObservableSet(set);
-	}
-
-	/**
-	 * Returns an unmodifiable observable map backed by the given observable
-	 * map.
-	 * 
-	 * @param map
-	 *            the map to wrap in an unmodifiable map
-	 * @return an unmodifiable observable map backed by the given observable
-	 *         map.
-	 * @since 1.2
-	 */
-	public static IObservableMap unmodifiableObservableMap(IObservableMap map) {
-		if (map == null) {
-			throw new IllegalArgumentException("Map parameter cannot be null"); //$NON-NLS-1$
-		}
-
-		return new UnmodifiableObservableMap(map);
-	}
-
-	/**
-	 * Returns an empty observable list. The returned list continues to work
-	 * after it has been disposed of and can be disposed of multiple times.
-	 * 
-	 * @return an empty observable list.
-	 */
-	public static IObservableList emptyObservableList() {
-		return emptyObservableList(Realm.getDefault(), null);
-	}
-
-	/**
-	 * Returns an empty observable list of the given element type. The returned
-	 * list continues to work after it has been disposed of and can be disposed
-	 * of multiple times.
-	 * 
-	 * @param elementType
-	 *            the element type of the returned list
-	 * @return an empty observable list
-	 * @since 1.1
-	 */
-	public static IObservableList emptyObservableList(Object elementType) {
-		return emptyObservableList(Realm.getDefault(), elementType);
-	}
-
-	/**
-	 * Returns an empty observable list belonging to the given realm. The
-	 * returned list continues to work after it has been disposed of and can be
-	 * disposed of multiple times.
-	 * 
-	 * @param realm
-	 *            the realm of the returned list
-	 * @return an empty observable list.
-	 */
-	public static IObservableList emptyObservableList(Realm realm) {
-		return emptyObservableList(realm, null);
-	}
-
-	/**
-	 * Returns an empty observable list of the given element type and belonging
-	 * to the given realm. The returned list continues to work after it has been
-	 * disposed of and can be disposed of multiple times.
-	 * 
-	 * @param realm
-	 *            the realm of the returned list
-	 * @param elementType
-	 *            the element type of the returned list
-	 * @return an empty observable list
-	 * @since 1.1
-	 */
-	public static IObservableList emptyObservableList(Realm realm,
-			Object elementType) {
-		return new EmptyObservableList(realm, elementType);
-	}
-
-	/**
-	 * Returns an empty observable set. The returned set continues to work after
-	 * it has been disposed of and can be disposed of multiple times.
-	 * 
-	 * @return an empty observable set.
-	 */
-	public static IObservableSet emptyObservableSet() {
-		return emptyObservableSet(Realm.getDefault(), null);
-	}
-
-	/**
-	 * Returns an empty observable set of the given element type. The returned
-	 * set continues to work after it has been disposed of and can be disposed
-	 * of multiple times.
-	 * 
-	 * @param elementType
-	 *            the element type of the returned set
-	 * @return an empty observable set
-	 * @since 1.1
-	 */
-	public static IObservableSet emptyObservableSet(Object elementType) {
-		return emptyObservableSet(Realm.getDefault(), elementType);
-	}
-
-	/**
-	 * Returns an empty observable set belonging to the given realm. The
-	 * returned set continues to work after it has been disposed of and can be
-	 * disposed of multiple times.
-	 * 
-	 * @param realm
-	 *            the realm of the returned set
-	 * @return an empty observable set.
-	 */
-	public static IObservableSet emptyObservableSet(Realm realm) {
-		return emptyObservableSet(realm, null);
-	}
-
-	/**
-	 * Returns an empty observable set of the given element type and belonging
-	 * to the given realm. The returned set continues to work after it has been
-	 * disposed of and can be disposed of multiple times.
-	 * 
-	 * @param realm
-	 *            the realm of the returned set
-	 * @param elementType
-	 *            the element type of the returned set
-	 * @return an empty observable set
-	 * @since 1.1
-	 */
-	public static IObservableSet emptyObservableSet(Realm realm,
-			Object elementType) {
-		return new EmptyObservableSet(realm, elementType);
-	}
-
-	/**
-	 * Returns an observable set backed by the given set.
-	 * 
-	 * @param set
-	 *            the set to wrap in an IObservableSet
-	 * @return an observable set backed by the given set
-	 */
-	public static IObservableSet staticObservableSet(Set set) {
-		return staticObservableSet(Realm.getDefault(), set, Object.class);
-	}
-
-	/**
-	 * Returns an observable set of the given element type, backed by the given
-	 * set.
-	 * 
-	 * @param set
-	 *            the set to wrap in an IObservableSet
-	 * @param elementType
-	 *            the element type of the returned set
-	 * @return Returns an observable set backed by the given unchanging set
-	 * @since 1.1
-	 */
-	public static IObservableSet staticObservableSet(Set set, Object elementType) {
-		return staticObservableSet(Realm.getDefault(), set, elementType);
-	}
-
-	/**
-	 * Returns an observable set belonging to the given realm, backed by the
-	 * given set.
-	 * 
-	 * @param realm
-	 *            the realm of the returned set
-	 * @param set
-	 *            the set to wrap in an IObservableSet
-	 * @return an observable set backed by the given unchanging set
-	 */
-	public static IObservableSet staticObservableSet(Realm realm, Set set) {
-		return staticObservableSet(realm, set, Object.class);
-	}
-
-	/**
-	 * Returns an observable set of the given element type and belonging to the
-	 * given realm, backed by the given set.
-	 * 
-	 * @param realm
-	 *            the realm of the returned set
-	 * @param set
-	 *            the set to wrap in an IObservableSet
-	 * @param elementType
-	 *            the element type of the returned set
-	 * @return an observable set backed by the given set
-	 * @since 1.1
-	 */
-	public static IObservableSet staticObservableSet(Realm realm, Set set,
-			Object elementType) {
-		return new ObservableSet(realm, set, elementType) {
-			public synchronized void addChangeListener(IChangeListener listener) {
-			}
-
-			public synchronized void addStaleListener(IStaleListener listener) {
-			}
-
-			public synchronized void addSetChangeListener(ISetChangeListener listener) {
-			}
-		};
-	}
-
-	/**
-	 * Returns an observable value that contains the same value as the given
-	 * observable, and fires the same events as the given observable, but can be
-	 * disposed of without disposing of the wrapped observable.
-	 * 
-	 * @param target
-	 *            the observable value to wrap
-	 * @return a disposable proxy for the given observable value.
-	 * @since 1.2
-	 */
-	public static IObservableValue proxyObservableValue(IObservableValue target) {
-		return new DecoratingObservableValue(target, false);
-	}
-
-	/**
-	 * Returns an observable set that contains the same elements as the given
-	 * set, and fires the same events as the given set, but can be disposed of
-	 * without disposing of the wrapped set.
-	 * 
-	 * @param target
-	 *            the set to wrap
-	 * @return a disposable proxy for the given observable set
-	 */
-	public static IObservableSet proxyObservableSet(IObservableSet target) {
-		return new DecoratingObservableSet(target, false);
-	}
-
-	/**
-	 * Returns an observable list that contains the same elements as the given
-	 * list, and fires the same events as the given list, but can be disposed of
-	 * without disposing of the wrapped list.
-	 * 
-	 * @param target
-	 *            the list to wrap
-	 * @return a disposable proxy for the given observable list
-	 * @since 1.1
-	 */
-	public static IObservableList proxyObservableList(IObservableList target) {
-		return new DecoratingObservableList(target, false);
-	}
-
-	/**
-	 * Returns an observable map that contains the same entries as the given
-	 * map, and fires the same events as the given map, but can be disposed of
-	 * without disposing of the wrapped map.
-	 * 
-	 * @param target
-	 *            the map to wrap
-	 * @return a disposable proxy for the given observable map
-	 * @since 1.2
-	 */
-	public static IObservableMap proxyObservableMap(IObservableMap target) {
-		return new DecoratingObservableMap(target, false);
-	}
-
-	/**
-	 * Returns an observable list backed by the given list.
-	 * 
-	 * @param list
-	 *            the list to wrap in an IObservableList
-	 * @return an observable list backed by the given unchanging list
-	 */
-	public static IObservableList staticObservableList(List list) {
-		return staticObservableList(Realm.getDefault(), list, Object.class);
-	}
-
-	/**
-	 * Returns an observable list of the given element type, backed by the given
-	 * list.
-	 * 
-	 * @param list
-	 *            the list to wrap in an IObservableList
-	 * @param elementType
-	 *            the element type of the returned list
-	 * @return an observable list backed by the given unchanging list
-	 * @since 1.1
-	 */
-	public static IObservableList staticObservableList(List list,
-			Object elementType) {
-		return staticObservableList(Realm.getDefault(), list, elementType);
-	}
-
-	/**
-	 * Returns an observable list belonging to the given realm, backed by the
-	 * given list.
-	 * 
-	 * @param realm
-	 *            the realm of the returned list
-	 * @param list
-	 *            the list to wrap in an IObservableList
-	 * @return an observable list backed by the given unchanging list
-	 */
-	public static IObservableList staticObservableList(Realm realm, List list) {
-		return staticObservableList(realm, list, Object.class);
-	}
-
-	/**
-	 * Returns an observable list of the given element type and belonging to the
-	 * given realm, backed by the given list.
-	 * 
-	 * @param realm
-	 *            the realm of the returned list
-	 * @param list
-	 *            the list to wrap in an IObservableList
-	 * @param elementType
-	 *            the element type of the returned list
-	 * @return an observable list backed by the given unchanging list
-	 * @since 1.1
-	 */
-	public static IObservableList staticObservableList(Realm realm, List list,
-			Object elementType) {
-		return new ObservableList(realm, list, elementType) {
-			public synchronized void addChangeListener(IChangeListener listener) {
-			}
-
-			public synchronized void addStaleListener(IStaleListener listener) {
-			}
-
-			public synchronized void addListChangeListener(IListChangeListener listener) {
-			}
-		};
-	}
-
-	/**
-	 * Returns an observable value of type <code>Boolean.TYPE</code> which
-	 * tracks whether the given observable is stale.
-	 * 
-	 * @param observable
-	 *            the observable to track
-	 * @return an observable value which tracks whether the given observable is
-	 *         stale
-	 * 
-	 * @since 1.1
-	 */
-	public static IObservableValue observeStale(IObservable observable) {
-		return new StalenessObservableValue(observable);
-	}
-
-	/**
-	 * Returns an observable value that tracks changes to the value of an
-	 * observable map's entry specified by its key.
-	 * <p>
-	 * The state where the key does not exist in the map is equivalent to the
-	 * state where the key exists and its value is <code>null</code>. The
-	 * transition between these two states is not considered a value change and
-	 * no event is fired.
-	 * 
-	 * @param map
-	 *            the observable map whose entry will be tracked.
-	 * @param key
-	 *            the key identifying the map entry to track.
-	 * @return an observable value that tracks the value associated with the
-	 *         specified key in the given map
-	 * @since 1.2
-	 */
-	public static IObservableValue observeMapEntry(IObservableMap map, Object key) {
-		return observeMapEntry(map, key, map.getValueType());
-	}
-
-	/**
-	 * Returns an observable value that tracks changes to the value of an
-	 * observable map's entry specified by its key.
-	 * <p>
-	 * The state where the key does not exist in the map is equivalent to the
-	 * state where the key exists and its value is <code>null</code>. The
-	 * transition between these two states is not considered a value change and
-	 * no event is fired.
-	 * 
-	 * @param map
-	 *            the observable map whose entry will be tracked.
-	 * @param key
-	 *            the key identifying the map entry to track.
-	 * @param valueType
-	 *            the type of the value. May be <code>null</code>, meaning
-	 *            the value is untyped.
-	 * @return an observable value that tracks the value associated with the
-	 *         specified key in the given map
-	 * @since 1.1
-	 */
-	public static IObservableValue observeMapEntry(IObservableMap map,
-			Object key, Object valueType) {
-		if (valueType == null)
-			valueType = map.getValueType();
-		return new MapEntryObservableValue(map, key, valueType);
-	}
-
-	/**
-	 * Returns a factory for creating obervable values tracking the value of the
-	 * {@link IObservableMap observable map} entry identified by a particular
-	 * key.
-	 * 
-	 * @param map
-	 *            the observable map whose entry will be tracked.
-	 * @param valueType
-	 *            the type of the value. May be <code>null</code>, meaning
-	 *            the value is untyped.
-	 * @return a factory for creating observable values tracking the value of
-	 *         the observable map entry identified by a particular key object.
-	 * @since 1.1
-	 */
-	public static IObservableFactory mapEntryValueFactory(
-			final IObservableMap map, final Object valueType) {
-		return new IObservableFactory() {
-			public IObservable createObservable(Object key) {
-				return observeMapEntry(map, key, valueType);
-			}
-		};
-	}
-
-	/**
-	 * Helper method for <code>MasterDetailObservables.detailValue(master,
-	 * mapEntryValueFactory(map, valueType), valueType)</code>.
-	 * 
-	 * @param map
-	 *            the observable map whose entry will be tracked.
-	 * @param master
-	 *            the observable value that identifies which map entry to track.
-	 * @param valueType
-	 *            the type of the value. May be <code>null</code>, meaning
-	 *            the value is untyped.
-	 * @return an observable value tracking the current value of the specified
-	 *         key in the given map an observable value that tracks the current
-	 *         value of the named property for the current value of the master
-	 *         observable value
-	 * @since 1.1
-	 */
-	public static IObservableValue observeDetailMapEntry(IObservableMap map,
-			IObservableValue master, Object valueType) {
-		return MasterDetailObservables.detailValue(master,
-				mapEntryValueFactory(map, valueType), valueType);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/Realm.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/Realm.java
deleted file mode 100644
index 4995028..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/Realm.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 168153
- *     Boris Bokowski - bug 245647
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import java.util.Timer;
-import java.util.TimerTask;
-
-import org.eclipse.core.databinding.Binding;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.internal.databinding.Queue;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-
-/**
- * A realm defines a context from which objects implementing {@link IObservable}
- * must be accessed, and on which these objects will notify their listeners. To
- * bridge between observables from different realms, subclasses of
- * {@link Binding} can be used.
- * <p>
- * A block of code is said to be executing within a realm if calling
- * {@link #isCurrent()} from that block returns true. Code reached by calling
- * methods from that block will execute within the same realm, with the
- * exception of methods on this class that can be used to execute code within a
- * specific realm. Clients can use {@link #syncExec(Runnable)},
- * {@link #asyncExec(Runnable)}, or {@link #exec(Runnable)} to execute a
- * runnable within this realm. Note that using {@link #syncExec(Runnable)} can
- * lead to deadlocks and should be avoided if the current thread holds any
- * locks.
- * </p>
- * <p>
- * It is instructive to think about possible implementations of Realm: It can be
- * based on executing on a designated thread such as a UI thread, or based on
- * holding a lock. In the former case, calling syncExec on a realm that is not
- * the current realm will execute the given runnable on a different thread (the
- * designated thread). In the latter case, calling syncExec may execute the
- * given runnable on the calling thread, but calling
- * {@link #asyncExec(Runnable)} will execute the given runnable on a different
- * thread. Therefore, no assumptions can be made about the thread that will
- * execute arguments to {@link #asyncExec(Runnable)},
- * {@link #syncExec(Runnable)}, or {@link #exec(Runnable)}.
- * </p>
- * <p>
- * It is possible that a block of code is executing within more than one realm.
- * This can happen for implementations of Realm that are based on holding a lock
- * but don't use a separate thread to run runnables given to
- * {@link #syncExec(Runnable)}. Realm implementations of this kind should be
- * appropriately documented because it increases the opportunity for deadlock.
- * </p>
- * <p>
- * Some implementations of {@link IObservable} provide constructors which do not
- * take a Realm argument and are specified to create the observable instance
- * with the current default realm. The default realm can be set for the
- * currently executing thread by using {@link #runWithDefault(Realm, Runnable)}.
- * Note that the default realm does not have to be the current realm.
- * </p>
- * <p>
- * Subclasses must override at least one of asyncExec()/syncExec(). For realms
- * based on a designated thread, it may be easier to implement asyncExec and
- * keep the default implementation of syncExec. For realms based on holding a
- * lock, it may be easier to implement syncExec and keep the default
- * implementation of asyncExec.
- * </p>
- * 
- * @since 1.0
- * 
- * @see IObservable
- */
-public abstract class Realm {
-
-	private static ThreadLocal defaultRealm = new ThreadLocal();
-
-	/**
-	 * Returns the default realm for the calling thread, or <code>null</code>
-	 * if no default realm has been set.
-	 * 
-	 * @return the default realm, or <code>null</code>
-	 */
-	public static Realm getDefault() {
-		return (Realm) defaultRealm.get();
-	}
-	
-	/**
-	 * Sets the default realm for the calling thread, returning the current
-	 * default thread. This method is inherently unsafe, it is recommended to
-	 * use {@link #runWithDefault(Realm, Runnable)} instead. This method is
-	 * exposed to subclasses to facilitate testing.
-	 * 
-	 * @param realm
-	 *            the new default realm, or <code>null</code>
-	 * @return the previous default realm, or <code>null</code>
-	 */
-	protected static Realm setDefault(Realm realm) {
-		Realm oldValue = getDefault();
-		defaultRealm.set(realm);
-		return oldValue;
-	}
-
-	/**
-	 * @return true if the caller is executing in this realm. This method must
-	 *         not have side-effects (such as, for example, implicitly placing
-	 *         the caller in this realm).
-	 */
-	abstract public boolean isCurrent();
-
-	private Thread workerThread;
-	
-	private volatile Timer timer;
-
-	Queue workQueue = new Queue();
-	
-	/**
-	 * Runs the given runnable. If an exception occurs within the runnable, it
-	 * is logged and not re-thrown. If the runnable implements
-	 * {@link ISafeRunnable}, the exception is passed to its
-	 * <code>handleException<code> method.
-	 * 
-	 * @param runnable
-	 */
-	protected static void safeRun(final Runnable runnable) {
-		ISafeRunnable safeRunnable;
-		if (runnable instanceof ISafeRunnable) {
-			safeRunnable = (ISafeRunnable) runnable;
-		} else {
-			safeRunnable = new ISafeRunnable() {
-				public void handleException(Throwable exception) {
-					Policy
-							.getLog()
-							.log(
-									new Status(
-											IStatus.ERROR,
-											Policy.JFACE_DATABINDING,
-											IStatus.OK,
-											"Unhandled exception: " + exception.getMessage(), exception)); //$NON-NLS-1$
-				}
-				public void run() throws Exception {
-					runnable.run();
-				}
-			};
-		}
-		SafeRunner.run(safeRunnable);
-	}
-
-	/**
-	 * Causes the <code>run()</code> method of the runnable to be invoked from
-	 * within this realm. If the caller is executing in this realm, the
-	 * runnable's run method is invoked directly, otherwise it is run at the
-	 * next reasonable opportunity using asyncExec.
-	 * <p>
-	 * If the given runnable is an instance of {@link ISafeRunnable}, its
-	 * exception handler method will be called if any exceptions occur while
-	 * running it. Otherwise, the exception will be logged.
-	 * </p>
-	 * 
-	 * @param runnable
-	 */
-	public void exec(Runnable runnable) {
-		if (isCurrent()) {
-			safeRun(runnable);
-		} else {
-			asyncExec(runnable);
-		}
-	}
-
-	/**
-	 * Causes the <code>run()</code> method of the runnable to be invoked from
-	 * within this realm at the next reasonable opportunity. The caller of this
-	 * method continues to run in parallel, and is not notified when the
-	 * runnable has completed.
-	 * <p>
-	 * If the given runnable is an instance of {@link ISafeRunnable}, its
-	 * exception handler method will be called if any exceptions occur while
-	 * running it. Otherwise, the exception will be logged.
-	 * </p>
-	 * <p>
-	 * Subclasses should use {@link #safeRun(Runnable)} to run the runnable.
-	 * </p>
-	 * 
-	 * @param runnable
-	 */
-	public void asyncExec(Runnable runnable) {
-		synchronized (workQueue) {
-			ensureWorkerThreadIsRunning();
-			workQueue.enqueue(runnable);
-			workQueue.notifyAll();
-		}
-	}
-
-	/**
-	 * Causes the <code>run()</code> method of the runnable to be invoked from
-	 * within this realm after the specified number of milliseconds have
-	 * elapsed. If milliseconds is less than zero, the runnable is not executed.
-	 * The caller of this method continues to run in parallel, and is not
-	 * notified when the runnable has completed.
-	 * <p>
-	 * If the given runnable is an instance of {@link ISafeRunnable}, its
-	 * exception handler method will be called if any exceptions occur while
-	 * running it. Otherwise, the exception will be logged.
-	 * </p>
-	 * <p>
-	 * Subclasses should use {@link #safeRun(Runnable)} to run the runnable.
-	 * </p>
-	 * 
-	 * @param milliseconds
-	 * @param runnable
-	 * @since 1.2
-	 */
-	public void timerExec(int milliseconds, final Runnable runnable) {
-		if (milliseconds < 0) {
-			return;
-		} else if (milliseconds == 0) {
-			asyncExec(runnable);
-		} else {
-			synchronized (workQueue) {
-				if (timer == null) {
-					timer = new Timer(true);
-				}
-				timer.schedule(new TimerTask() {
-					public void run() {
-						asyncExec(runnable);
-					}
-				}, milliseconds);
-			}
-		}
-
-	}
-
-	/**
-	 * 
-	 */
-	private void ensureWorkerThreadIsRunning() {
-		if (workerThread == null) {
-			workerThread = new Thread() {
-				public void run() {
-					try {
-						while (true) {
-							Runnable work = null;
-							synchronized (workQueue) {
-								while (workQueue.isEmpty()) {
-									workQueue.wait();
-								}
-								work = (Runnable) workQueue.dequeue();
-							}
-							syncExec(work);
-						}
-					} catch (InterruptedException e) {
-						// exit
-					}
-				}
-			};
-			workerThread.start();
-		}
-	}
-
-	/**
-	 * Causes the <code>run()</code> method of the runnable to be invoked from
-	 * within this realm at the next reasonable opportunity. This method is
-	 * blocking the caller until the runnable completes.
-	 * <p>
-	 * If the given runnable is an instance of {@link ISafeRunnable}, its
-	 * exception handler method will be called if any exceptions occur while
-	 * running it. Otherwise, the exception will be logged.
-	 * </p>
-	 * <p>
-	 * Subclasses should use {@link #safeRun(Runnable)} to run the runnable.
-	 * </p>
-	 * <p>
-	 * Note: This class is not meant to be called by clients and therefore has
-	 * only protected access.
-	 * </p>
-	 * 
-	 * @param runnable
-	 */
-	protected void syncExec(Runnable runnable) {
-		SyncRunnable syncRunnable = new SyncRunnable(runnable);
-		asyncExec(syncRunnable);
-		synchronized (syncRunnable) {
-			while (!syncRunnable.hasRun) {
-				try {
-					syncRunnable.wait();
-				} catch (InterruptedException e) {
-					Thread.currentThread().interrupt();
-				}
-			}
-		}
-	}
-
-	static class SyncRunnable implements Runnable {
-		boolean hasRun = false;
-
-		private Runnable runnable;
-
-		SyncRunnable(Runnable runnable) {
-			this.runnable = runnable;
-		}
-
-		public void run() {
-			try {
-				safeRun(runnable);
-			} finally {
-				synchronized (this) {
-					hasRun = true;
-					this.notifyAll();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Sets the provided <code>realm</code> as the default for the duration of
-	 * {@link Runnable#run()} and resets the previous realm after completion.
-	 * Note that this will not set the given realm as the current realm.
-	 * 
-	 * @param realm
-	 * @param runnable
-	 */
-	public static void runWithDefault(Realm realm, Runnable runnable) {
-		Realm oldRealm = Realm.getDefault();
-		try {
-			defaultRealm.set(realm);
-			runnable.run();
-		} finally {
-			defaultRealm.set(oldRealm);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/StaleEvent.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/StaleEvent.java
deleted file mode 100644
index 14e8c76..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/StaleEvent.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * Generic event denoting that the state of an {@link IObservable} object is
- * about to change. Note that this event is only fired when an observable
- * becomes stale, not when it becomes unstale; an observable that becomes
- * unstale should always fire a change event. Staleness can be used (for
- * example) to notify listeners when an observable has started a background
- * thread for updating its state. Clients can safely ignore staleness.
- * 
- * @see IObservable#isStale()
- * 
- * @since 1.0
- * 
- */
-public class StaleEvent extends ObservableEvent {
-
-	/**
-	 * Creates a new stale event.
-	 * 
-	 * @param source
-	 *            the source observable
-	 */
-	public StaleEvent(IObservable source) {
-		super(source);
-	}
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 3491012225431471077L;
-
-	static final Object TYPE = new Object();
-
-	protected void dispatch(IObservablesListener listener) {
-		((IStaleListener) listener).handleStale(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/AbstractObservableList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/AbstractObservableList.java
deleted file mode 100644
index 88506c7..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/AbstractObservableList.java
+++ /dev/null
@@ -1,348 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bugs 164653, 167204
- *     Matthew Hall - bugs 118516, 208858, 208332, 247367, 146397
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.AbstractList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.ChangeSupport;
-import org.eclipse.core.databinding.observable.DisposeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.AssertionFailedException;
-
-/**
- * Subclasses should override at least get(int index) and size().
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- * 
- */
-public abstract class AbstractObservableList extends AbstractList implements
-		IObservableList {
-
-	private ChangeSupport changeSupport;
-	private boolean disposed = false;
-
-	/**
-	 * @param realm 
-	 * 
-	 */
-	public AbstractObservableList(Realm realm) {
-		Assert.isNotNull(realm, "Realm cannot be null"); //$NON-NLS-1$
-		changeSupport = new ChangeSupport(realm){
-			protected void firstListenerAdded() {
-				AbstractObservableList.this.firstListenerAdded();
-			}
-			protected void lastListenerRemoved() {
-				AbstractObservableList.this.lastListenerRemoved();
-			}
-		};
-	}
-
-	/**
-	 * 
-	 */
-	public AbstractObservableList() {
-		this(Realm.getDefault());
-	}
-	
-	public boolean isStale() {
-		getterCalled();
-		return false;
-	}
-
-	public synchronized void addListChangeListener(IListChangeListener listener) {
-		if (!disposed)
-			changeSupport.addListener(ListChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeListChangeListener(IListChangeListener listener) {
-		if (!disposed)
-			changeSupport.removeListener(ListChangeEvent.TYPE, listener);
-	}
-
-	protected void fireListChange(ListDiff diff) {
-		// fire general change event first
-		fireChange();
-		changeSupport.fireEvent(new ListChangeEvent(this, diff));
-	}
-
-	public synchronized void addChangeListener(IChangeListener listener) {
-		if (!disposed)
-			changeSupport.addChangeListener(listener);
-	}
-
-	public synchronized void removeChangeListener(IChangeListener listener) {
-		if (!disposed)
-			changeSupport.removeChangeListener(listener);
-	}
-
-	public synchronized void addStaleListener(IStaleListener listener) {
-		if (!disposed)
-			changeSupport.addStaleListener(listener);
-	}
-
-	public synchronized void removeStaleListener(IStaleListener listener) {
-		if (!disposed)
-			changeSupport.removeStaleListener(listener);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public synchronized void addDisposeListener(IDisposeListener listener) {
-		if (changeSupport != null) {
-			changeSupport.addDisposeListener(listener);
-		}
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public synchronized void removeDisposeListener(IDisposeListener listener) {
-		if (changeSupport != null) {
-			changeSupport.removeDisposeListener(listener);
-		}
-	}
-
-	/**
-	 * Fires change event. Must be invoked from the current realm.
-	 */
-	protected void fireChange() {
-		checkRealm();
-		changeSupport.fireEvent(new ChangeEvent(this));
-	}
-
-	/**
-	 * Fires stale event. Must be invoked from the current realm.
-	 */
-	protected void fireStale() {
-		checkRealm();
-		changeSupport.fireEvent(new StaleEvent(this));
-	}
-
-	/**
-	 * 
-	 */
-	protected void firstListenerAdded() {
-	}
-
-	/**
-	 * 
-	 */
-	protected void lastListenerRemoved() {
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public boolean isDisposed() {
-		return disposed;
-	}
-
-	/**
-	 * 
-	 */
-	public synchronized void dispose() {
-		if (!disposed) {
-			disposed = true;
-			changeSupport.fireEvent(new DisposeEvent(this));
-			changeSupport.dispose();
-			changeSupport = null;
-			lastListenerRemoved();
-		}
-	}
-
-	public final int size() {
-		getterCalled();
-		return doGetSize();
-	}
-
-	/**
-	 * @return the size
-	 */
-	protected abstract int doGetSize();
-
-	/**
-	 * 
-	 */
-	private void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		return super.isEmpty();
-	}
-
-	public boolean contains(Object o) {
-		getterCalled();
-		return super.contains(o);
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final Iterator wrappedIterator = super.iterator();
-		return new Iterator() {
-			public void remove() {
-				wrappedIterator.remove();
-			}
-
-			public boolean hasNext() {
-				return wrappedIterator.hasNext();
-			}
-
-			public Object next() {
-				return wrappedIterator.next();
-			}
-		};
-	}
-
-	public Object[] toArray() {
-		getterCalled();
-		return super.toArray();
-	}
-
-	public Object[] toArray(Object a[]) {
-		getterCalled();
-		return super.toArray(a);
-	}
-
-	// Modification Operations
-
-	public boolean add(Object o) {
-		getterCalled();
-		return super.add(o);
-	}
-
-	/**
-	 * Moves the element located at <code>oldIndex</code> to
-	 * <code>newIndex</code>. This method is equivalent to calling
-	 * <code>add(newIndex, remove(oldIndex))</code>.
-	 * <p>
-	 * Subclasses should override this method to deliver list change
-	 * notification for the remove and add operations in the same
-	 * ListChangeEvent, as this allows {@link ListDiff#accept(ListDiffVisitor)}
-	 * to recognize the operation as a move.
-	 * 
-	 * @param oldIndex
-	 *            the element's position before the move. Must be within the
-	 *            range <code>0 &lt;= oldIndex &lt; size()</code>.
-	 * @param newIndex
-	 *            the element's position after the move. Must be within the
-	 *            range <code>0 &lt;= newIndex &lt; size()</code>.
-	 * @return the element that was moved.
-	 * @throws IndexOutOfBoundsException
-	 *             if either argument is out of range (<code>0 &lt;= index &lt; size()</code>).
-	 * @see ListDiffVisitor#handleMove(int, int, Object)
-	 * @see ListDiff#accept(ListDiffVisitor)
-	 * @since 1.1
-	 */
-	public Object move(int oldIndex, int newIndex) {
-		checkRealm();
-		int size = doGetSize();
-		if (oldIndex < 0 || oldIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"oldIndex: " + oldIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		if (newIndex < 0 || newIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"newIndex: " + newIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		Object element = remove(oldIndex);
-		add(newIndex, element);
-		return element;
-	}
-
-	public boolean remove(Object o) {
-		getterCalled();
-		return super.remove(o);
-	}
-
-	// Bulk Modification Operations
-
-	public boolean containsAll(Collection c) {
-		getterCalled();
-		return super.containsAll(c);
-	}
-
-	public boolean addAll(Collection c) {
-		getterCalled();
-		return super.addAll(c);
-	}
-
-	public boolean addAll(int index, Collection c) {
-		getterCalled();
-		return super.addAll(c);
-	}
-
-	public boolean removeAll(Collection c) {
-		getterCalled();
-		return super.removeAll(c);
-	}
-
-	public boolean retainAll(Collection c) {
-		getterCalled();
-		return super.retainAll(c);
-	}
-
-	// Comparison and hashing
-
-	public boolean equals(Object o) {
-		getterCalled();
-		return super.equals(o);
-	}
-
-	public int hashCode() {
-		getterCalled();
-		return super.hashCode();
-	}
-
-	public int indexOf(Object o) {
-		getterCalled();
-		return super.indexOf(o);
-	}
-
-	public int lastIndexOf(Object o) {
-		getterCalled();
-		return super.lastIndexOf(o);
-	}
-
-	public Realm getRealm() {
-		return changeSupport.getRealm();
-	}
-	
-	/**
-	 * Asserts that the realm is the current realm.
-	 * 
-	 * @see Realm#isCurrent()
-	 * @throws AssertionFailedException
-	 *             if the realm is not the current realm
-	 */
-	protected void checkRealm() {
-		Assert.isTrue(getRealm().isCurrent(),
-				"This operation must be run within the observable's realm"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ComputedList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ComputedList.java
deleted file mode 100644
index e7f6b2b..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ComputedList.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/************************************************************************************************************
- * Copyright (c) 2007 Matthew Hall and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Matthew Hall - initial API and implementation
- * 		IBM Corporation - initial API and implementation
- * 		Brad Reynolds - initial API and implementation (through bug 116920 and bug 147515)
- * 		Matthew Hall - bug 211786
- ***********************************************************************************************************/
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-
-/**
- * A Lazily calculated list that automatically computes and registers listeners
- * on its dependencies as long as all of its dependencies are IObservable
- * objects
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.1
- */
-public abstract class ComputedList extends AbstractObservableList {
-	private List cachedList = new ArrayList();
-
-	private boolean dirty = true;
-	private boolean stale = false;
-
-	private IObservable[] dependencies = new IObservable[0];
-
-	/**
-	 * Creates a computed list in the default realm and with an unknown (null)
-	 * element type.
-	 */
-	public ComputedList() {
-		this(Realm.getDefault(), null);
-	}
-
-	/**
-	 * Creates a computed list in the default realm and with the given element
-	 * type.
-	 * 
-	 * @param elementType
-	 *            the element type, may be <code>null</code> to indicate
-	 *            unknown element type
-	 */
-	public ComputedList(Object elementType) {
-		this(Realm.getDefault(), elementType);
-	}
-
-	/**
-	 * Creates a computed list in given realm and with an unknown (null) element
-	 * type.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * 
-	 */
-	public ComputedList(Realm realm) {
-		this(realm, null);
-	}
-
-	/**
-	 * Creates a computed list in the given realm and with the given element
-	 * type.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param elementType
-	 *            the element type, may be <code>null</code> to indicate
-	 *            unknown element type
-	 */
-	public ComputedList(Realm realm, Object elementType) {
-		super(realm);
-		this.elementType = elementType;
-	}
-
-	/**
-	 * Inner class that implements interfaces that we don't want to expose as
-	 * public API. Each interface could have been implemented using a separate
-	 * anonymous class, but we combine them here to reduce the memory overhead
-	 * and number of classes.
-	 * 
-	 * <p>
-	 * The Runnable calls calculate and stores the result in cachedList.
-	 * </p>
-	 * 
-	 * <p>
-	 * The IChangeListener stores each observable in the dependencies list. This
-	 * is registered as the listener when calling ObservableTracker, to detect
-	 * every observable that is used by computeValue.
-	 * </p>
-	 * 
-	 * <p>
-	 * The IChangeListener is attached to every dependency.
-	 * </p>
-	 * 
-	 */
-	private class PrivateInterface implements Runnable, IChangeListener,
-			IStaleListener {
-		public void run() {
-			cachedList = calculate();
-			if (cachedList == null)
-				cachedList = Collections.EMPTY_LIST;
-		}
-
-		public void handleStale(StaleEvent event) {
-			if (!dirty)
-				makeStale();
-		}
-
-		public void handleChange(ChangeEvent event) {
-			makeDirty();
-		}
-	}
-
-	private PrivateInterface privateInterface = new PrivateInterface();
-
-	private Object elementType;
-
-	protected int doGetSize() {
-		return doGetList().size();
-	}
-
-	public Object get(int index) {
-		getterCalled();
-		return doGetList().get(index);
-	}
-
-	private final List getList() {
-		getterCalled();
-		return doGetList();
-	}
-
-	final List doGetList() {
-		if (dirty) {
-			// This line will do the following:
-			// - Run the calculate method
-			// - While doing so, add any observable that is touched to the
-			// dependencies list
-			IObservable[] newDependencies = ObservableTracker.runAndMonitor(
-					privateInterface, privateInterface, null);
-
-			// If any dependencies are stale, a stale event will be fired here
-			// even if we were already stale before recomputing. This is in case
-			// clients assume that a list change is indicative of non-staleness.
-			stale = false;
-			for (int i = 0; i < newDependencies.length; i++) {
-				if (newDependencies[i].isStale()) {
-					makeStale();
-					break;
-				}
-			}
-
-			if (!stale) {
-				for (int i = 0; i < newDependencies.length; i++) {
-					newDependencies[i].addStaleListener(privateInterface);
-				}
-			}
-
-			dependencies = newDependencies;
-
-			dirty = false;
-		}
-
-		return cachedList;
-	}
-
-	private void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	/**
-	 * Subclasses must override this method to calculate the list contents.
-	 * 
-	 * @return the object's list.
-	 */
-	protected abstract List calculate();
-
-	private void makeDirty() {
-		if (!dirty) {
-			dirty = true;
-
-			makeStale();
-
-			stopListening();
-
-			// copy the old list
-			final List oldList = new ArrayList(cachedList);
-			// Fire the "dirty" event. This implementation recomputes the new
-			// list lazily.
-			fireListChange(new ListDiff() {
-				ListDiffEntry[] differences;
-
-				public ListDiffEntry[] getDifferences() {
-					if (differences == null)
-						differences = Diffs.computeListDiff(oldList, getList())
-								.getDifferences();
-					return differences;
-				}
-			});
-		}
-	}
-
-	private void stopListening() {
-		if (dependencies != null) {
-			for (int i = 0; i < dependencies.length; i++) {
-				IObservable observable = dependencies[i];
-
-				observable.removeChangeListener(privateInterface);
-				observable.removeStaleListener(privateInterface);
-			}
-			dependencies = null;
-		}
-	}
-
-	private void makeStale() {
-		if (!stale) {
-			stale = true;
-			fireStale();
-		}
-	}
-
-	public boolean isStale() {
-		// recalculate list if dirty, to ensure staleness is correct.
-		getList();
-		return stale;
-	}
-
-	public Object getElementType() {
-		return elementType;
-	}
-
-	public synchronized void addChangeListener(IChangeListener listener) {
-		super.addChangeListener(listener);
-		// If somebody is listening, we need to make sure we attach our own
-		// listeners
-		computeListForListeners();
-	}
-
-	public synchronized void addListChangeListener(IListChangeListener listener) {
-		super.addListChangeListener(listener);
-		// If somebody is listening, we need to make sure we attach our own
-		// listeners
-		computeListForListeners();
-	}
-
-	private void computeListForListeners() {
-		// Some clients just add a listener and expect to get notified even if
-		// they never called getValue(), so we have to call getValue() ourselves
-		// here to be sure. Need to be careful about realms though, this method
-		// can be called outside of our realm.
-		// See also bug 198211. If a client calls this outside of our realm,
-		// they may receive change notifications before the runnable below has
-		// been executed. It is their job to figure out what to do with those
-		// notifications.
-		getRealm().exec(new Runnable() {
-			public void run() {
-				if (dependencies == null) {
-					// We are not currently listening.
-					// But someone is listening for changes. Call getValue()
-					// to make sure we start listening to the observables we
-					// depend on.
-					getList();
-				}
-			}
-		});
-	}
-
-	public synchronized void dispose() {
-		stopListening();
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/DecoratingObservableList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/DecoratingObservableList.java
deleted file mode 100644
index e09a3b4..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/DecoratingObservableList.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237718)
- *     Matthew Hall - but 246626
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.databinding.observable.DecoratingObservableCollection;
-
-/**
- * An observable list which decorates another observable list.
- * 
- * @since 1.2
- */
-public class DecoratingObservableList extends DecoratingObservableCollection
-		implements IObservableList {
-
-	private IObservableList decorated;
-
-	private IListChangeListener listChangeListener;
-
-	/**
-	 * Constructs a DecoratingObservableList which decorates the given
-	 * observable.
-	 * 
-	 * @param decorated
-	 *            the observable list being decorated
-	 * @param disposeDecoratedOnDispose
-	 */
-	public DecoratingObservableList(IObservableList decorated,
-			boolean disposeDecoratedOnDispose) {
-		super(decorated, disposeDecoratedOnDispose);
-		this.decorated = decorated;
-	}
-
-	public synchronized void addListChangeListener(IListChangeListener listener) {
-		addListener(ListChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeListChangeListener(
-			IListChangeListener listener) {
-		removeListener(ListChangeEvent.TYPE, listener);
-	}
-
-	protected void fireListChange(ListDiff diff) {
-		// fire general change event first
-		super.fireChange();
-		fireEvent(new ListChangeEvent(this, diff));
-	}
-
-	protected void fireChange() {
-		throw new RuntimeException(
-				"fireChange should not be called, use fireListChange() instead"); //$NON-NLS-1$
-	}
-
-	protected void firstListenerAdded() {
-		if (listChangeListener == null) {
-			listChangeListener = new IListChangeListener() {
-				public void handleListChange(ListChangeEvent event) {
-					DecoratingObservableList.this.handleListChange(event);
-				}
-			};
-		}
-		decorated.addListChangeListener(listChangeListener);
-		super.firstListenerAdded();
-	}
-
-	protected void lastListenerRemoved() {
-		super.lastListenerRemoved();
-		if (listChangeListener != null) {
-			decorated.removeListChangeListener(listChangeListener);
-			listChangeListener = null;
-		}
-	}
-
-	/**
-	 * Called whenever a ListChangeEvent is received from the decorated
-	 * observable. By default, this method fires the list change event again,
-	 * with the decorating observable as the event source. Subclasses may
-	 * override to provide different behavior.
-	 * 
-	 * @param event
-	 *            the change event received from the decorated observable
-	 */
-	protected void handleListChange(final ListChangeEvent event) {
-		fireListChange(event.diff);
-	}
-
-	public void add(int index, Object o) {
-		checkRealm();
-		decorated.add(index, o);
-	}
-
-	public boolean addAll(int index, Collection c) {
-		checkRealm();
-		return decorated.addAll(index, c);
-	}
-
-	public Object get(int index) {
-		getterCalled();
-		return decorated.get(index);
-	}
-
-	public int indexOf(Object o) {
-		getterCalled();
-		return decorated.indexOf(o);
-	}
-
-	public int lastIndexOf(Object o) {
-		getterCalled();
-		return decorated.lastIndexOf(o);
-	}
-
-	public ListIterator listIterator() {
-		return listIterator(0);
-	}
-
-	public ListIterator listIterator(int index) {
-		getterCalled();
-		final ListIterator iterator = decorated.listIterator(index);
-		return new ListIterator() {
-
-			public void add(Object o) {
-				iterator.add(o);
-			}
-
-			public boolean hasNext() {
-				getterCalled();
-				return iterator.hasNext();
-			}
-
-			public boolean hasPrevious() {
-				getterCalled();
-				return iterator.hasPrevious();
-			}
-
-			public Object next() {
-				getterCalled();
-				return iterator.next();
-			}
-
-			public int nextIndex() {
-				getterCalled();
-				return iterator.nextIndex();
-			}
-
-			public Object previous() {
-				getterCalled();
-				return iterator.previous();
-			}
-
-			public int previousIndex() {
-				getterCalled();
-				return iterator.previousIndex();
-			}
-
-			public void remove() {
-				checkRealm();
-				iterator.remove();
-			}
-
-			public void set(Object o) {
-				checkRealm();
-				iterator.set(o);
-			}
-		};
-	}
-
-	public Object move(int oldIndex, int newIndex) {
-		checkRealm();
-		return decorated.move(oldIndex, newIndex);
-	}
-
-	public Object remove(int index) {
-		checkRealm();
-		return decorated.remove(index);
-	}
-
-	public Object set(int index, Object element) {
-		checkRealm();
-		return decorated.set(index, element);
-	}
-
-	public List subList(int fromIndex, int toIndex) {
-		getterCalled();
-		return decorated.subList(fromIndex, toIndex);
-	}
-
-	public synchronized void dispose() {
-		if (decorated != null && listChangeListener != null) {
-			decorated.removeListChangeListener(listChangeListener);
-		}
-		decorated = null;
-		listChangeListener = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/IListChangeListener.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/IListChangeListener.java
deleted file mode 100644
index 8372729..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/IListChangeListener.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-
-/**
- * Listener for changes to observable lists.
- * 
- * @since 1.0
- */
-public interface IListChangeListener extends IObservablesListener {
-
-	/**
-	 * Handle a change to an observable list. The change is described by the
-	 * diff object. The given event object must only be used locally in this
-	 * method because it may be reused for other change notifications. The diff
-	 * object referenced by the event is immutable and may be used non-locally.
-	 * 
-	 * @param event
-	 */
-	void handleListChange(ListChangeEvent event);
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/IObservableList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/IObservableList.java
deleted file mode 100644
index 858ae23..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/IObservableList.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 167204
- *     Matthew Hall - bugs 208858, 237718
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.databinding.observable.IObservableCollection;
-
-/**
- * A list whose changes can be tracked by list change listeners.
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the framework classes
- *              that implement this interface. Note that direct implementers of
- *              this interface outside of the framework will be broken in future
- *              releases when methods are added to this interface.
- * 
- * @see AbstractObservableList
- * @see ObservableList
- * 
- * @since 1.0
- */
-public interface IObservableList extends List, IObservableCollection {
-	
-	/**
-	 * Adds the given list change listener to the list of list change listeners.
-	 * @param listener
-	 */
-	public void addListChangeListener(IListChangeListener listener);
-	
-	/**
-	 * Removes the given list change listener from the list of list change listeners.
-	 * Has no effect if the given listener is not registered as a list change listener.
-	 * 
-	 * @param listener
-	 */
-	public void removeListChangeListener(IListChangeListener listener);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public int size();
-
-	/**
-	 * @TrackedGetter
-	 */
-    public boolean isEmpty();
-
-	/**
-	 * @TrackedGetter
-	 */
-    public boolean contains(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public Iterator iterator();
-
-	/**
-	 * @TrackedGetter
-	 */
-    public Object[] toArray();
-
-	/**
-	 * @TrackedGetter
-	 */
-    public Object[] toArray(Object a[]);
-
-	/**
-	 * 
-	 */
-    public boolean add(Object o);
-
-	/**
-	 * 
-	 */
-    public boolean remove(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public boolean containsAll(Collection c);
-
-	/**
-	 * 
-	 */
-    public boolean addAll(Collection c);
-
-	/**
-	 * 
-	 */
-    public boolean addAll(int index, Collection c);
-
-	/**
-	 * 
-	 */
-    public boolean removeAll(Collection c);
-
-	/**
-	 *
-	 */
-    public boolean retainAll(Collection c);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public boolean equals(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public int hashCode();
-
-	/**
-	 * @TrackedGetter
-	 */
-    public Object get(int index);
-
-	/**
-	 * 
-	 */
-    public Object set(int index, Object element);
-
-	/**
-	 * Moves the element located at <code>oldIndex</code> to
-	 * <code>newIndex</code>. This method is equivalent to calling
-	 * <code>add(newIndex, remove(oldIndex))</code>.
-	 * <p>
-	 * Implementors should deliver list change notification for the remove and
-	 * add operations in the same ListChangeEvent, as this allows
-	 * {@link ListDiff#accept(ListDiffVisitor)} to recognize the operation as a
-	 * move.
-	 * 
-	 * @param oldIndex
-	 *            the element's position before the move. Must be within the
-	 *            range <code>0 &lt;= oldIndex &lt; size()</code>.
-	 * @param newIndex
-	 *            the element's position after the move. Must be within the
-	 *            range <code>0 &lt;= newIndex &lt; size()</code>.
-	 * @return the element that was moved.
-	 * @throws IndexOutOfBoundsException
-	 *             if either argument is out of range (<code>0 &lt;= index &lt; size()</code>).
-	 * @see ListDiffVisitor#handleMove(int, int, Object)
-	 * @see ListDiff#accept(ListDiffVisitor)
-	 * @since 1.1
-	 */
-	public Object move(int oldIndex, int newIndex);
-
-	/**
-	 * 
-	 */
-    public Object remove(int index);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public int indexOf(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public int lastIndexOf(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public ListIterator listIterator();
-
-	/**
-	 * @TrackedGetter
-	 */
-    public ListIterator listIterator(int index);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public List subList(int fromIndex, int toIndex);
-
-	/**
-	 * @return the type of the elements or <code>null</code> if untyped
-	 */
-	Object getElementType();
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ListChangeEvent.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ListChangeEvent.java
deleted file mode 100644
index 1b2ce4d..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ListChangeEvent.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-import org.eclipse.core.databinding.observable.ObservableEvent;
-
-/**
- * List change event describing an incremental change of an
- * {@link IObservableList} object.
- * 
- * @since 1.0
- */
-public class ListChangeEvent extends ObservableEvent {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -9154315534258776672L;
-
-	static final Object TYPE = new Object();
-
-	/**
-	 * Description of the change to the source observable list. Listeners must
-	 * not change this field.
-	 */
-	public ListDiff diff;
-
-	/**
-	 * Creates a new list change event.
-	 * 
-	 * @param source
-	 *            the source observable list
-	 * @param diff
-	 *            the list change
-	 */
-	public ListChangeEvent(IObservableList source, ListDiff diff) {
-		super(source);
-		this.diff = diff;
-	}
-
-	/**
-	 * Returns the observable list from which this event originated.
-	 * 
-	 * @return the observable list from which this event originated
-	 */
-	public IObservableList getObservableList() {
-		return (IObservableList) getSource();
-	}
-
-	protected void dispatch(IObservablesListener listener) {
-		((IListChangeListener) listener).handleListChange(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ListDiff.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ListDiff.java
deleted file mode 100644
index 38f63c1..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ListDiff.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 208858, 251884
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.List;
-
-import org.eclipse.core.internal.databinding.Util;
-
-/**
- * Object describing a diff between two lists.
- * 
- * @since 1.0
- */
-public abstract class ListDiff {
-
-	/**
-	 * Returns a ListDiffEntry array representing the differences in the list,
-	 * in the order they are to be processed.
-	 * 
-	 * @return a ListDiffEntry array representing the differences in the list,
-	 *         in the order they are to be processed.
-	 */
-	public abstract ListDiffEntry[] getDifferences();
-
-	/**
-	 * Traverses the {@link #getDifferences()} array, calling the appropriate
-	 * method in <code>visitor</code> for each difference.
-	 * <ol>
-	 * <li>{@link ListDiffVisitor#handleReplace(int, Object, Object)} is called
-	 * whenever a remove entry is immediately followed by an add entry which
-	 * shares the same list index.
-	 * <li>{@link ListDiffVisitor#handleMove(int, int, Object)} is called
-	 * whenever a remove entry is immediately followed by an add entry with an
-	 * equivalent element.
-	 * <li>{@link ListDiffVisitor#handleRemove(int, Object)} is called whenever
-	 * a remove entry does not match conditions 1 or 2.
-	 * <li>{@link ListDiffVisitor#handleAdd(int, Object)} is called whenever an
-	 * add entry does not match conditions in 1 or 2.
-	 * </ol>
-	 * 
-	 * @param visitor
-	 *            the visitor to receive callbacks.
-	 * @see ListDiffVisitor
-	 * @since 1.1
-	 */
-	public void accept(ListDiffVisitor visitor) {
-		ListDiffEntry[] differences = getDifferences();
-		for (int i = 0; i < differences.length; i++) {
-			ListDiffEntry entry = differences[i];
-			int position = entry.getPosition();
-			Object element = entry.getElement();
-			boolean addition = entry.isAddition();
-
-			if (!addition && i + 1 < differences.length) {
-				ListDiffEntry entry2 = differences[i + 1];
-				if (entry2.isAddition()) {
-					int position2 = entry2.getPosition();
-					Object element2 = entry2.getElement();
-					if (position == position2) {
-						visitor.handleReplace(position, element, element2);
-						i++;
-						continue;
-					}
-					if (Util.equals(element, element2)) {
-						visitor.handleMove(position, position2, element);
-						i++;
-						continue;
-					}
-				}
-			}
-			if (addition)
-				visitor.handleAdd(position, element);
-			else
-				visitor.handleRemove(position, element);
-		}
-	}
-
-	/**
-	 * Returns true if the diff contains no added, removed, moved or replaced
-	 * elements.
-	 * 
-	 * @return true if the diff contains no added, removed, moved or replaced
-	 *         elements.
-	 * @since 1.2
-	 */
-	public boolean isEmpty() {
-		return getDifferences().length == 0;
-	}
-
-	/**
-	 * Applies the changes in this diff to the given list
-	 * 
-	 * @param list
-	 *            the list to which the diff will be applied
-	 * @since 1.2
-	 */
-	public void applyTo(final List list) {
-		accept(new ListDiffVisitor() {
-			public void handleAdd(int index, Object element) {
-				list.add(index, element);
-			}
-
-			public void handleRemove(int index, Object element) {
-				list.remove(index);
-			}
-
-			public void handleReplace(int index, Object oldElement,
-					Object newElement) {
-				list.set(index, newElement);
-			}
-		});
-	}
-
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		ListDiffEntry[] differences = getDifferences();
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(getClass().getName());
-		
-		if (differences == null || differences.length == 0) {
-			buffer
-				.append("{}"); //$NON-NLS-1$
-		} else {
-			buffer
-				.append("{"); //$NON-NLS-1$
-			
-			for (int i = 0; i < differences.length; i++) {
-				if (i > 0)
-					buffer.append(", "); //$NON-NLS-1$
-				
-				buffer
-					.append("difference[") //$NON-NLS-1$
-					.append(i)
-					.append("] [") //$NON-NLS-1$
-					.append(differences[i] != null ? differences[i].toString() : "null") //$NON-NLS-1$
-					.append("]"); //$NON-NLS-1$
-			}
-			buffer.append("}"); //$NON-NLS-1$
-		}
-		
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ListDiffEntry.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ListDiffEntry.java
deleted file mode 100644
index da2e79f..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ListDiffEntry.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-/**
- * A single addition of an element to a list or removal of an element from a list.
- *  
- * @since 1.0
- */
-public abstract class ListDiffEntry {
-	
-	/**
-	 * @return the 0-based position of the addition or removal
-	 */
-	public abstract int getPosition();
-	
-	/**
-	 * @return true if this represents an addition, false if this represents a removal
-	 */
-	public abstract boolean isAddition();
-	
-	/**
-	 * @return the element that was added or removed
-	 */
-	public abstract Object getElement();
-	
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer
-			.append(this.getClass().getName())
-			.append("{position [") //$NON-NLS-1$
-			.append(getPosition())
-			.append("], isAddition [") //$NON-NLS-1$
-			.append(isAddition())
-			.append("], element [") //$NON-NLS-1$
-			.append(getElement() != null ? getElement().toString() : "null") //$NON-NLS-1$
-			.append("]}"); //$NON-NLS-1$
-		
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ListDiffVisitor.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ListDiffVisitor.java
deleted file mode 100644
index e2d1389..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ListDiffVisitor.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 208858)
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.List;
-
-/**
- * A visitor for processing differences in a ListDiff.
- * 
- * @see ListDiff#accept(ListDiffVisitor)
- * @since 1.1
- */
-public abstract class ListDiffVisitor {
-	/**
-	 * Notifies the visitor that <code>element</code> was added to the list at
-	 * position <code>index</code>.
-	 * 
-	 * @param index
-	 *            the index where the element was added
-	 * @param element
-	 *            the element that was added
-	 */
-	public abstract void handleAdd(int index, Object element);
-
-	/**
-	 * Notifies the visitor that <code>element</code> was removed from the
-	 * list at position <code>index</code>.
-	 * 
-	 * @param index
-	 *            the index where the element was removed
-	 * @param element
-	 *            the element that was removed
-	 */
-	public abstract void handleRemove(int index, Object element);
-
-	/**
-	 * Notifies the visitor that <code>element</code> was moved in the list
-	 * from position <code>oldIndex</code> to position <code>newIndex</code>.
-	 * <p>
-	 * The default implementation of this method calls
-	 * {@link #handleRemove(int, Object)} with the old position, then
-	 * {@link #handleAdd(int, Object)} with the new position. Clients which are
-	 * interested in recognizing "moves" in a list (i.e. calls to
-	 * {@link IObservableList#move(int, int)}) should override this method.
-	 * 
-	 * @param oldIndex
-	 *            the index that the element was moved from.
-	 * @param newIndex
-	 *            the index that the element was moved to.
-	 * @param element
-	 *            the element that was moved
-	 * @see IObservableList#move(int, int)
-	 */
-	public void handleMove(int oldIndex, int newIndex, Object element) {
-		handleRemove(oldIndex, element);
-		handleAdd(newIndex, element);
-	}
-
-	/**
-	 * Notifies the visitor that <code>oldElement</code>, located at position
-	 * <code>index</code> in the list, was replaced by <code>newElement</code>.
-	 * <p>
-	 * The default implementation of this method calls
-	 * {@link #handleRemove(int, Object)} with the old element, then
-	 * {@link #handleAdd(int, Object)} with the new element. Clients which are
-	 * interested in recognizing "replaces" in a list (i.e. calls to
-	 * {@link List#set(int, Object)}) should override this method.
-	 * 
-	 * @param index
-	 *            the index where the element was replaced.
-	 * @param oldElement
-	 *            the element being replaced.
-	 * @param newElement
-	 *            the element that replaced oldElement.
-	 * @see List#set(int, Object)
-	 */
-	public void handleReplace(int index, Object oldElement, Object newElement) {
-		handleRemove(index, oldElement);
-		handleAdd(index, newElement);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/MultiList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/MultiList.java
deleted file mode 100644
index 453fcc7..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/MultiList.java
+++ /dev/null
@@ -1,567 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 222289)
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import java.lang.reflect.Array;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * An observable list backed by an array of observable lists. This class
- * supports all removal methods (including {@link #clear()}), as well as the
- * {@link #set(int, Object)} method. All other mutator methods (addition methods
- * and {@link #move(int, int)}) throw an {@link UnsupportedOperationException}.
- * 
- * @since 1.2
- */
-public class MultiList extends AbstractObservableList {
-	private IObservableList[] lists;
-	private Object elementType;
-
-	private IListChangeListener listChangeListener;
-	private IStaleListener staleListener;
-	private Boolean stale;
-
-	/**
-	 * Constructs a MultiList in the default realm, and backed by the given
-	 * observable lists.
-	 * 
-	 * @param lists
-	 *            the array of observable lists backing this MultiList.
-	 */
-	public MultiList(IObservableList[] lists) {
-		this(Realm.getDefault(), lists, null);
-	}
-
-	/**
-	 * Constructs a MultiList in the default realm backed by the given
-	 * observable lists.
-	 * 
-	 * @param lists
-	 *            the array of observable lists backing this MultiList.
-	 * @param elementType
-	 *            element type of the constructed list.
-	 */
-	public MultiList(IObservableList[] lists, Object elementType) {
-		this(Realm.getDefault(), lists, elementType);
-	}
-
-	/**
-	 * Constructs a MultiList belonging to the given realm, and backed by the
-	 * given observable lists.
-	 * 
-	 * @param realm
-	 *            the observable's realm
-	 * @param lists
-	 *            the array of observable lists backing this MultiList
-	 */
-	public MultiList(Realm realm, IObservableList[] lists) {
-		this(realm, lists, null);
-	}
-
-	/**
-	 * Constructs a MultiList belonging to the given realm, and backed by the
-	 * given observable lists.
-	 * 
-	 * @param realm
-	 *            the observable's realm
-	 * @param lists
-	 *            the array of observable lists backing this MultiList
-	 * @param elementType
-	 *            element type of the constructed list.
-	 */
-	public MultiList(Realm realm, IObservableList[] lists, Object elementType) {
-		super(realm);
-		this.lists = lists;
-		this.elementType = elementType;
-
-		for (int i = 0; i < lists.length; i++) {
-			Assert
-					.isTrue(realm.equals(lists[i].getRealm()),
-							"All source lists in a MultiList must belong to the same realm"); //$NON-NLS-1$
-		}
-	}
-
-	protected void firstListenerAdded() {
-		if (listChangeListener == null) {
-			listChangeListener = new IListChangeListener() {
-				public void handleListChange(final ListChangeEvent event) {
-					getRealm().exec(new Runnable() {
-						public void run() {
-							stale = null;
-							listChanged(event);
-							if (isStale())
-								fireStale();
-						}
-					});
-				}
-			};
-		}
-		if (staleListener == null) {
-			staleListener = new IStaleListener() {
-				public void handleStale(StaleEvent staleEvent) {
-					getRealm().exec(new Runnable() {
-						public void run() {
-							makeStale();
-						}
-					});
-				}
-			};
-		}
-
-		for (int i = 0; i < lists.length; i++) {
-			lists[i].addListChangeListener(listChangeListener);
-			lists[i].addStaleListener(staleListener);
-
-			// Determining staleness at this time prevents firing redundant
-			// stale events if MultiList happens to be stale now, and a sublist
-			// fires a stale event later.
-			this.stale = computeStaleness() ? Boolean.TRUE : Boolean.FALSE;
-		}
-	}
-
-	protected void lastListenerRemoved() {
-		if (listChangeListener != null) {
-			for (int i = 0; i < lists.length; i++) {
-				lists[i].removeListChangeListener(listChangeListener);
-			}
-			listChangeListener = null;
-		}
-		if (staleListener != null) {
-			for (int i = 0; i < lists.length; i++) {
-				lists[i].removeStaleListener(staleListener);
-			}
-			staleListener = null;
-		}
-		stale = null;
-	}
-
-	private void makeStale() {
-		if (stale == null || stale.booleanValue() == false) {
-			stale = Boolean.TRUE;
-			fireStale();
-		}
-	}
-
-	private void listChanged(ListChangeEvent event) {
-		IObservableList source = event.getObservableList();
-		int offset = 0;
-		for (int i = 0; i < lists.length; i++) {
-			if (source == lists[i]) {
-				fireListChange(offsetListDiff(offset, event.diff));
-				return;
-			}
-			offset += lists[i].size();
-		}
-		Assert
-				.isLegal(
-						false,
-						"MultiList received a ListChangeEvent from an observable list that is not one of its sources."); //$NON-NLS-1$
-	}
-
-	private ListDiff offsetListDiff(int offset, ListDiff diff) {
-		return Diffs.createListDiff(offsetListDiffEntries(offset, diff
-				.getDifferences()));
-	}
-
-	private ListDiffEntry[] offsetListDiffEntries(int offset,
-			ListDiffEntry[] entries) {
-		ListDiffEntry[] offsetEntries = new ListDiffEntry[entries.length];
-		for (int i = 0; i < entries.length; i++) {
-			offsetEntries[i] = offsetListDiffEntry(offset, entries[i]);
-		}
-		return offsetEntries;
-	}
-
-	private ListDiffEntry offsetListDiffEntry(int offset, ListDiffEntry entry) {
-		return Diffs.createListDiffEntry(offset + entry.getPosition(), entry
-				.isAddition(), entry.getElement());
-	}
-
-	protected int doGetSize() {
-		int size = 0;
-		for (int i = 0; i < lists.length; i++)
-			size += lists[i].size();
-		return size;
-	}
-
-	public Object getElementType() {
-		return elementType;
-	}
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void add(int index, Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean addAll(int index, Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		checkRealm();
-		for (int i = 0; i < lists.length; i++)
-			lists[i].clear();
-	}
-
-	public Object get(int index) {
-		getterCalled();
-		int offset = 0;
-		for (int i = 0; i < lists.length; i++) {
-			if (index - offset < lists[i].size())
-				return lists[i].get(index - offset);
-			offset += lists[i].size();
-		}
-		throw new IndexOutOfBoundsException("index: " + index + ", size: " //$NON-NLS-1$ //$NON-NLS-2$
-				+ offset);
-	}
-
-	public boolean contains(Object o) {
-		getterCalled();
-		for (int i = 0; i < lists.length; i++) {
-			if (lists[i].contains(o))
-				return true;
-		}
-		return false;
-	}
-
-	public boolean equals(Object o) {
-		getterCalled();
-		if (o == this)
-			return true;
-		if (o == null)
-			return false;
-		if (!(o instanceof List))
-			return false;
-		List that = (List) o;
-		if (doGetSize() != that.size())
-			return false;
-
-		int subListIndex = 0;
-		for (int i = 0; i < lists.length; i++) {
-			List subList = that.subList(subListIndex, subListIndex
-					+ lists[i].size());
-			if (!lists[i].equals(subList)) {
-				return false;
-			}
-			subListIndex += lists[i].size();
-		}
-		return true;
-	}
-
-	public int hashCode() {
-		getterCalled();
-		int result = 1;
-		for (int i = 0; i < lists.length; i++) {
-			result = result * 31 + lists[i].hashCode();
-		}
-		return result;
-	}
-
-	public int indexOf(Object o) {
-		getterCalled();
-		int offset = 0;
-		for (int i = 0; i < lists.length; i++) {
-			int index = lists[i].indexOf(o);
-			if (index != -1)
-				return offset + index;
-			offset += lists[i].size();
-		}
-		return -1;
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		for (int i = 0; i < lists.length; i++) {
-			if (!lists[i].isEmpty())
-				return false;
-		}
-		return true;
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		return new MultiListItr();
-	}
-
-	public int lastIndexOf(Object o) {
-		getterCalled();
-		int offset = size();
-		for (int i = 0; i < lists.length; i++) {
-			offset -= lists[i].size();
-			int index = lists[i].indexOf(o);
-			if (index != -1)
-				return offset + index;
-		}
-		return -1;
-	}
-
-	public ListIterator listIterator(int index) {
-		getterCalled();
-		return new MultiListListItr(index);
-	}
-
-	public Object move(int oldIndex, int newIndex) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean remove(Object o) {
-		checkRealm();
-		int i = indexOf(o);
-		if (i != -1) {
-			remove(i);
-			return true;
-		}
-		return false;
-	}
-
-	public Object remove(int index) {
-		int offset = 0;
-		for (int i = 0; i < lists.length; i++) {
-			if (index - offset < lists[i].size()) {
-				return lists[i].remove(index - offset);
-			}
-			offset += lists[i].size();
-		}
-		throw new IndexOutOfBoundsException("index: " + index + ", size: " //$NON-NLS-1$ //$NON-NLS-2$
-				+ offset);
-	}
-
-	public boolean removeAll(Collection c) {
-		boolean changed = false;
-		for (int i = 0; i < lists.length; i++) {
-			changed = changed | lists[i].removeAll(c);
-		}
-		return changed;
-	}
-
-	public boolean retainAll(Collection c) {
-		boolean changed = false;
-		for (int i = 0; i < lists.length; i++) {
-			changed = changed | lists[i].retainAll(c);
-		}
-		return changed;
-	}
-
-	public Object set(int index, Object o) {
-		int offset = 0;
-		for (int i = 0; i < lists.length; i++) {
-			if (index - offset < lists[i].size()) {
-				return lists[i].set(index - offset, o);
-			}
-			offset += lists[i].size();
-		}
-		throw new IndexOutOfBoundsException("index: " + index + ", size: " //$NON-NLS-1$ //$NON-NLS-2$
-				+ offset);
-	}
-
-	public Object[] toArray() {
-		getterCalled();
-		return toArray(new Object[doGetSize()]);
-	}
-
-	public Object[] toArray(Object[] a) {
-		getterCalled();
-		Object[] result = a;
-		if (result.length < doGetSize()) {
-			result = (Object[]) Array.newInstance(a.getClass()
-					.getComponentType(), doGetSize());
-		}
-		int offset = 0;
-		for (int i = 0; i < lists.length; i++) {
-			Object[] oa = lists[i].toArray();
-			System.arraycopy(oa, 0, result, offset, oa.length);
-			offset += lists[i].size();
-		}
-
-		return result;
-	}
-
-	public boolean isStale() {
-		getterCalled();
-
-		if (staleListener == null || listChangeListener == null) {
-			// this.stale is only updated in response to list change events or
-			// stale events on the sublists. If we are not listening to sublists
-			// then we must calculate staleness on every invocation.
-			return computeStaleness();
-		}
-
-		if (stale == null) {
-			this.stale = computeStaleness() ? Boolean.TRUE : Boolean.FALSE;
-		}
-
-		return stale.booleanValue();
-	}
-
-	private boolean computeStaleness() {
-		boolean stale = false;
-		for (int i = 0; i < lists.length; i++) {
-			if (lists[i].isStale()) {
-				stale = true;
-				break;
-			}
-		}
-		return stale;
-	}
-
-	private void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	public synchronized void dispose() {
-		if (lists != null) {
-			if (listChangeListener != null) {
-				for (int i = 0; i < lists.length; i++) {
-					lists[i].removeListChangeListener(listChangeListener);
-				}
-			}
-			if (staleListener != null) {
-				for (int i = 0; i < lists.length; i++) {
-					lists[i].removeStaleListener(staleListener);
-				}
-			}
-		}
-		listChangeListener = null;
-		staleListener = null;
-		lists = null;
-		elementType = null;
-		stale = null;
-		super.dispose();
-	}
-
-	private final class MultiListItr implements Iterator {
-		Iterator[] iters;
-		int iterIndex = 0;
-
-		MultiListItr() {
-			iters = new Iterator[lists.length];
-			for (int i = 0; i < lists.length; i++) {
-				iters[i] = lists[i].iterator();
-			}
-		}
-
-		public boolean hasNext() {
-			for (int i = iterIndex; i < iters.length; i++) {
-				if (iters[i].hasNext())
-					return true;
-			}
-			return false;
-		}
-
-		public Object next() {
-			while (iterIndex < iters.length && !iters[iterIndex].hasNext())
-				iterIndex++;
-			return iters[iterIndex].next();
-		}
-
-		public void remove() {
-			throw new UnsupportedOperationException();
-		}
-	}
-
-	private class MultiListListItr implements ListIterator {
-		ListIterator[] iters;
-		int iterIndex;
-
-		private MultiListListItr(int initialIndex) {
-			iters = new ListIterator[lists.length];
-			int offset = 0;
-			for (int i = 0; i < lists.length; i++) {
-				if (offset <= initialIndex) {
-					if (offset + lists[i].size() > initialIndex) {
-						// current list contains initial index
-						iters[i] = lists[i].listIterator(initialIndex - offset);
-						iterIndex = i;
-					} else {
-						// current list ends before initial index
-						iters[i] = lists[i].listIterator(lists[i].size());
-					}
-				} else {
-					// current list begins after initial index
-					iters[i] = lists[i].listIterator();
-				}
-				offset += lists[i].size();
-			}
-		}
-
-		public void add(Object o) {
-			throw new UnsupportedOperationException();
-		}
-
-		public boolean hasNext() {
-			for (int i = iterIndex; i < iters.length; i++) {
-				if (iters[i].hasNext())
-					return true;
-			}
-			return false;
-		}
-
-		public boolean hasPrevious() {
-			for (int i = iterIndex; i >= 0; i--) {
-				if (iters[i].hasPrevious())
-					return true;
-			}
-			return false;
-		}
-
-		public Object next() {
-			while (iterIndex < iters.length && !iters[iterIndex].hasNext())
-				iterIndex++;
-			return iters[iterIndex].next();
-		}
-
-		public int nextIndex() {
-			int offset = 0;
-			for (int i = 0; i < iterIndex; i++)
-				offset += iters[i].nextIndex();
-			return offset + iters[iterIndex].nextIndex();
-		}
-
-		public Object previous() {
-			while (iterIndex >= 0 && !iters[iterIndex].hasPrevious())
-				iterIndex--;
-			return iters[iterIndex].previous();
-		}
-
-		public int previousIndex() {
-			int offset = 0;
-			for (int i = 0; i < iterIndex; i++)
-				offset += iters[i].nextIndex();
-			return offset + iters[iterIndex].previousIndex();
-		}
-
-		public void remove() {
-			throw new UnsupportedOperationException();
-		}
-
-		public void set(Object o) {
-			iters[iterIndex].set(o);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ObservableList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ObservableList.java
deleted file mode 100644
index 0a6123b..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/ObservableList.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Brad Reynolds - bug 167204
- *     Matthew Hall - bug 208858
- *     Matthew Hall - bug 208332
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * 
- * Abstract implementation of {@link IObservableList}, based on an underlying regular list. 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- * 
- */
-public abstract class ObservableList extends AbstractObservable implements
-		IObservableList {
-
-	protected List wrappedList;
-
-	/**
-	 * Stale state of the list.  Access must occur in the current realm.
-	 */
-	private boolean stale = false;
-
-	private Object elementType;
-
-	protected ObservableList(List wrappedList, Object elementType) {
-		this(Realm.getDefault(), wrappedList, elementType);
-	}
-
-	protected ObservableList(Realm realm, List wrappedList, Object elementType) {
-		super(realm);
-		this.wrappedList = wrappedList;
-		this.elementType = elementType;
-	}
-
-	public synchronized void addListChangeListener(IListChangeListener listener) {
-		addListener(ListChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeListChangeListener(IListChangeListener listener) {
-		removeListener(ListChangeEvent.TYPE, listener);
-	}
-
-	protected void fireListChange(ListDiff diff) {
-		// fire general change event first
-		super.fireChange();
-		fireEvent(new ListChangeEvent(this, diff));
-	}
-	
-	public boolean contains(Object o) {
-		getterCalled();
-		return wrappedList.contains(o);
-	}
-
-	public boolean containsAll(Collection c) {
-		getterCalled();
-		return wrappedList.containsAll(c);
-	}
-
-	public boolean equals(Object o) {
-		getterCalled();
-		return wrappedList.equals(o);
-	}
-
-	public int hashCode() {
-		getterCalled();
-		return wrappedList.hashCode();
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		return wrappedList.isEmpty();
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final Iterator wrappedIterator = wrappedList.iterator();
-		return new Iterator() {
-
-			public void remove() {
-				throw new UnsupportedOperationException();
-			}
-
-			public boolean hasNext() {
-				return wrappedIterator.hasNext();
-			}
-
-			public Object next() {
-				return wrappedIterator.next();
-			}
-		};
-	}
-
-	public int size() {
-		getterCalled();
-		return wrappedList.size();
-	}
-
-	public Object[] toArray() {
-		getterCalled();
-		return wrappedList.toArray();
-	}
-
-	public Object[] toArray(Object[] a) {
-		getterCalled();
-		return wrappedList.toArray(a);
-	}
-
-	public String toString() {
-		getterCalled();
-		return wrappedList.toString();
-	}
-	
-	/**
-	 * @TrackedGetter
-	 */
-    public Object get(int index) {
-    	getterCalled();
-    	return wrappedList.get(index);
-    }
-
-	/**
-	 * @TrackedGetter
-	 */
-    public int indexOf(Object o) {
-    	getterCalled();
-    	return wrappedList.indexOf(o);
-    }
-
-	/**
-	 * @TrackedGetter
-	 */
-    public int lastIndexOf(Object o) {
-    	getterCalled();
-    	return wrappedList.lastIndexOf(o);
-    }
-
-    // List Iterators
-
-	/**
-	 * @TrackedGetter
-	 */
-    public ListIterator listIterator() {
-    	return listIterator(0);
-    }
-
-	/**
-	 * @TrackedGetter
-	 */
-    public ListIterator listIterator(int index) {
-    	getterCalled();
-		final ListIterator wrappedIterator = wrappedList.listIterator(index);
-		return new ListIterator() {
-
-			public int nextIndex() {
-				return wrappedIterator.nextIndex();
-			}
-
-			public int previousIndex() {
-				return wrappedIterator.previousIndex();
-			}
-
-			public void remove() {
-				throw new UnsupportedOperationException();
-			}
-
-			public boolean hasNext() {
-				return wrappedIterator.hasNext();
-			}
-
-			public boolean hasPrevious() {
-				return wrappedIterator.hasPrevious();
-			}
-
-			public Object next() {
-				return wrappedIterator.next();
-			}
-
-			public Object previous() {
-				return wrappedIterator.previous();
-			}
-
-			public void add(Object o) {
-				throw new UnsupportedOperationException();
-			}
-
-			public void set(Object o) {
-				throw new UnsupportedOperationException();
-			}
-		};
-    }
-
-
-    public List subList(final int fromIndex, final int toIndex) {
-    	getterCalled();
-    	if (fromIndex < 0 || fromIndex > toIndex || toIndex > size()) {
-			throw new IndexOutOfBoundsException();
-		}
-    	return new AbstractObservableList(getRealm()) {
-		
-			public Object getElementType() {
-				return ObservableList.this.getElementType();
-			}
-		
-			public Object get(int location) {
-				return ObservableList.this.get(fromIndex + location);
-			}
-		
-			protected int doGetSize() {
-				return toIndex - fromIndex;
-			}
-		};
-    }
-
-	protected void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-    public Object set(int index, Object element) {
-    	throw new UnsupportedOperationException();
-    }
-
-	/**
-	 * Moves the element located at <code>oldIndex</code> to
-	 * <code>newIndex</code>. This method is equivalent to calling
-	 * <code>add(newIndex, remove(oldIndex))</code>.
-	 * <p>
-	 * Subclasses should override this method to deliver list change
-	 * notification for the remove and add operations in the same
-	 * ListChangeEvent, as this allows {@link ListDiff#accept(ListDiffVisitor)}
-	 * to recognize the operation as a move.
-	 * 
-	 * @param oldIndex
-	 *            the element's position before the move. Must be within the
-	 *            range <code>0 &lt;= oldIndex &lt; size()</code>.
-	 * @param newIndex
-	 *            the element's position after the move. Must be within the
-	 *            range <code>0 &lt;= newIndex &lt; size()</code>.
-	 * @return the element that was moved.
-	 * @throws IndexOutOfBoundsException
-	 *             if either argument is out of range (<code>0 &lt;= index &lt; size()</code>).
-	 * @see ListDiffVisitor#handleMove(int, int, Object)
-	 * @see ListDiff#accept(ListDiffVisitor)
-	 * @since 1.1
-	 */
-	public Object move(int oldIndex, int newIndex) {
-		checkRealm();
-		int size = wrappedList.size();
-		if (oldIndex < 0 || oldIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"oldIndex: " + oldIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		if (newIndex < 0 || newIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"newIndex: " + newIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		Object element = remove(oldIndex);
-		add(newIndex, element);
-		return element;
-	}
-
-    public Object remove(int index) {
-    	throw new UnsupportedOperationException();
-    }
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void add(int index, Object element) {
-		throw new UnsupportedOperationException();
-	}
-	
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-    public boolean addAll(int index, Collection c) {
-    	throw new UnsupportedOperationException();
-    }
-
-	public boolean remove(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean removeAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean retainAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	/**
-	 * Returns the stale state.  Must be invoked from the current realm.
-	 * 
-	 * @return stale state
-	 */
-	public boolean isStale() {
-		getterCalled();
-		return stale;
-	}
-
-	/**
-	 * Sets the stale state.  Must be invoked from the current realm.
-	 * 
-	 * @param stale
-	 *            The stale state to list. This will fire a stale event if the
-	 *            given boolean is true and this observable list was not already
-	 *            stale.
-	 */
-	public void setStale(boolean stale) {
-		checkRealm();
-
-		boolean wasStale = this.stale;
-		this.stale = stale;
-		if (!wasStale && stale) {
-			fireStale();
-		}
-	}
-
-	protected void fireChange() {
-		throw new RuntimeException("fireChange should not be called, use fireListChange() instead"); //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.provisional.databinding.observable.AbstractObservable#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-	}
-	
-	public Object getElementType() {
-		return elementType;
-	}
-
-	protected void updateWrappedList(List newList) {
-		List oldList = wrappedList;
-		ListDiff listDiff = Diffs.computeListDiff(oldList, newList);
-		wrappedList = newList;
-		fireListChange(listDiff);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/WritableList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/WritableList.java
deleted file mode 100644
index ca0c750..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/WritableList.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Brad Reynolds - bug 167204
- *     Gautam Saggar - bug 169529
- *     Brad Reynolds - bug 147515
- *     Matthew Hall - bug 208858, 213145
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * Mutable observable list backed by an ArrayList.
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- */
-public class WritableList extends ObservableList {
-
-	/**
-	 * Creates an empty writable list in the default realm with a
-	 * <code>null</code> element type.
-	 * 
-	 */
-	public WritableList() {
-		this(Realm.getDefault());
-	}
-
-	/**
-	 * Creates an empty writable list with a <code>null</code> element type.
-	 * 
-	 * @param realm
-	 */
-	public WritableList(Realm realm) {
-		this(realm, new ArrayList(), null);
-	}
-
-	/**
-	 * Constructs a new instance with the default realm.
-	 * 
-	 * @param toWrap
-	 * @param elementType
-	 *            can be <code>null</code>
-	 */
-	public WritableList(List toWrap, Object elementType) {
-		this(Realm.getDefault(), toWrap, elementType);
-	}
-
-	/**
-	 * Creates a writable list containing elements of the given type, wrapping
-	 * an existing client-supplied list.
-	 * 
-	 * @param realm
-	 * @param toWrap
-	 *            The java.utilList to wrap
-	 * @param elementType
-	 *            can be <code>null</code>
-	 */
-	public WritableList(Realm realm, List toWrap, Object elementType) {
-		super(realm, toWrap, elementType);
-	}
-
-	public Object set(int index, Object element) {
-		checkRealm();
-		Object oldElement = wrappedList.set(index, element);
-		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				false, oldElement), Diffs.createListDiffEntry(index, true,
-				element)));
-		return oldElement;
-	}
-
-	/**
-	 * @since 1.1
-	 */
-	public Object move(int oldIndex, int newIndex) {
-		checkRealm();
-		int size = wrappedList.size();
-		if (oldIndex < 0 || oldIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"oldIndex: " + oldIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		if (newIndex < 0 || newIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"newIndex: " + newIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		if (oldIndex == newIndex)
-			return wrappedList.get(oldIndex);
-		Object element = wrappedList.remove(oldIndex);
-		wrappedList.add(newIndex, element);
-		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(oldIndex,
-				false, element), Diffs.createListDiffEntry(newIndex, true,
-				element)));
-		return element;
-	}
-
-	public Object remove(int index) {
-		checkRealm();
-		Object oldElement = wrappedList.remove(index);
-		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				false, oldElement)));
-		return oldElement;
-	}
-
-	public boolean add(Object element) {
-		checkRealm();
-		boolean added = wrappedList.add(element);
-		if (added) {
-			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
-					wrappedList.size() - 1, true, element)));
-		}
-		return added;
-	}
-
-	public void add(int index, Object element) {
-		checkRealm();
-		wrappedList.add(index, element);
-		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				true, element)));
-	}
-
-	public boolean addAll(Collection c) {
-		checkRealm();
-		ListDiffEntry[] entries = new ListDiffEntry[c.size()];
-		int i = 0;
-		int addIndex = wrappedList.size();
-		for (Iterator it = c.iterator(); it.hasNext();) {
-			Object element = it.next();
-			entries[i++] = Diffs.createListDiffEntry(addIndex++, true, element);
-		}
-		boolean added = wrappedList.addAll(c);
-		fireListChange(Diffs.createListDiff(entries));
-		return added;
-	}
-
-	public boolean addAll(int index, Collection c) {
-		checkRealm();
-		ListDiffEntry[] entries = new ListDiffEntry[c.size()];
-		int i = 0;
-		int addIndex = index;
-		for (Iterator it = c.iterator(); it.hasNext();) {
-			Object element = it.next();
-			entries[i++] = Diffs.createListDiffEntry(addIndex++, true, element);
-		}
-		boolean added = wrappedList.addAll(index, c);
-		fireListChange(Diffs.createListDiff(entries));
-		return added;
-	}
-
-	public boolean remove(Object o) {
-		checkRealm();
-		int index = wrappedList.indexOf(o);
-		if (index == -1) {
-			return false;
-		}
-		wrappedList.remove(index);
-		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				false, o)));
-		return true;
-	}
-
-	public boolean removeAll(Collection c) {
-		checkRealm();
-		List entries = new ArrayList();
-		for (Iterator it = c.iterator(); it.hasNext();) {
-			Object element = it.next();
-			int removeIndex = wrappedList.indexOf(element);
-			if (removeIndex != -1) {
-				wrappedList.remove(removeIndex);
-				entries.add(Diffs.createListDiffEntry(removeIndex, false,
-						element));
-			}
-		}
-		if (entries.size() > 0)
-			fireListChange(Diffs.createListDiff((ListDiffEntry[]) entries
-					.toArray(new ListDiffEntry[entries.size()])));
-		return entries.size() > 0;
-	}
-
-	public boolean retainAll(Collection c) {
-		checkRealm();
-		List entries = new ArrayList();
-		int removeIndex = 0;
-		for (Iterator it = wrappedList.iterator(); it.hasNext();) {
-			Object element = it.next();
-			if (!c.contains(element)) {
-				entries.add(Diffs.createListDiffEntry(removeIndex, false,
-						element));
-				it.remove();
-			} else {
-				// only increment if we haven't removed the current element
-				removeIndex++;
-			}
-		}
-		if (entries.size() > 0)
-			fireListChange(Diffs.createListDiff((ListDiffEntry[]) entries
-					.toArray(new ListDiffEntry[entries.size()])));
-		return entries.size() > 0;
-	}
-
-	public void clear() {
-		checkRealm();
-		List entries = new ArrayList();
-		for (Iterator it = wrappedList.iterator(); it.hasNext();) {
-			Object element = it.next();
-			// always report 0 as the remove index
-			entries.add(Diffs.createListDiffEntry(0, false, element));
-			it.remove();
-		}
-		fireListChange(Diffs.createListDiff((ListDiffEntry[]) entries
-				.toArray(new ListDiffEntry[entries.size()])));
-	}
-
-	/**
-	 * @param elementType
-	 *            can be <code>null</code>
-	 * @return new list with the default realm.
-	 */
-	public static WritableList withElementType(Object elementType) {
-		return new WritableList(Realm.getDefault(), new ArrayList(),
-				elementType);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/package.html b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/package.html
deleted file mode 100644
index 2c2f1db..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/list/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes for observing changes in lists.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes for observing changes in lists.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/AbstractObservableMap.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/AbstractObservableMap.java
deleted file mode 100644
index 55a6a7c..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/AbstractObservableMap.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Matthew Hall - bugs 118516, 146397, 226289, 246103
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.AbstractMap;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.ChangeSupport;
-import org.eclipse.core.databinding.observable.DisposeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.AssertionFailedException;
-
-/**
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- */
-public abstract class AbstractObservableMap extends AbstractMap implements
-		IObservableMap {
-
-	private final class PrivateChangeSupport extends ChangeSupport {
-		private PrivateChangeSupport(Realm realm) {
-			super(realm);
-		}
-
-		protected void firstListenerAdded() {
-			AbstractObservableMap.this.firstListenerAdded();
-		}
-
-		protected void lastListenerRemoved() {
-			AbstractObservableMap.this.lastListenerRemoved();
-		}
-
-		protected boolean hasListeners() {
-			return super.hasListeners();
-		}
-	}
-
-	private PrivateChangeSupport changeSupport;
-	private boolean disposed = false;
-
-	private boolean stale;
-
-	/**
-	 */
-	public AbstractObservableMap() {
-		this(Realm.getDefault());
-	}
-
-	/**
-	 * 
-	 */
-	protected void lastListenerRemoved() {
-	}
-
-	/**
-	 * 
-	 */
-	protected void firstListenerAdded() {
-	}
-
-	/**
-	 * @param realm
-	 */
-	public AbstractObservableMap(Realm realm) {
-		Assert.isNotNull(realm, "Realm cannot be null"); //$NON-NLS-1$
-		changeSupport = new PrivateChangeSupport(realm);
-	}
-
-	public synchronized void addMapChangeListener(IMapChangeListener listener) {
-		if (!disposed)
-			changeSupport.addListener(MapChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeMapChangeListener(IMapChangeListener listener) {
-		if (!disposed)
-			changeSupport.removeListener(MapChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void addChangeListener(IChangeListener listener) {
-		if (!disposed)
-			changeSupport.addChangeListener(listener);
-	}
-
-	public synchronized void addStaleListener(IStaleListener listener) {
-		if (!disposed)
-			changeSupport.addStaleListener(listener);
-	}
-
-	/**
-	 * @return whether the observable map has listeners registered
-	 * @since 1.2
-	 */
-	protected synchronized boolean hasListeners() {
-		return !disposed && changeSupport.hasListeners();
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public void addDisposeListener(IDisposeListener listener) {
-		if (!disposed)
-			changeSupport.addDisposeListener(listener);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public void removeDisposeListener(IDisposeListener listener) {
-		if (!disposed)
-			changeSupport.removeDisposeListener(listener);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public boolean isDisposed() {
-		return disposed;
-	}
-
-	public synchronized void dispose() {
-		if (!disposed) {
-			disposed = true;
-			changeSupport.fireEvent(new DisposeEvent(this));
-			changeSupport.dispose();
-			changeSupport = null;
-		}
-	}
-
-	public Realm getRealm() {
-		return changeSupport.getRealm();
-	}
-
-	public boolean isStale() {
-		checkRealm();
-		return stale;
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public Object getKeyType() {
-		return null;
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public Object getValueType() {
-		return null;
-	}
-
-	public synchronized void removeChangeListener(IChangeListener listener) {
-		changeSupport.removeChangeListener(listener);
-	}
-
-	public synchronized void removeStaleListener(IStaleListener listener) {
-		changeSupport.removeStaleListener(listener);
-	}
-
-	/**
-	 * Sets the stale state.  Must be invoked from the current realm.
-	 * 
-	 * @param stale
-	 */
-	public void setStale(boolean stale) {
-		checkRealm();
-		this.stale = stale;
-		if (stale) {
-			fireStale();
-		}
-	}
-
-	/**
-	 * Fires stale events.  Must be invoked from current realm.
-	 */
-	protected void fireStale() {
-		checkRealm();
-		changeSupport.fireEvent(new StaleEvent(this));
-	}
-
-	/**
-	 * Fires change events.  Must be invoked from current realm.
-	 */
-	protected void fireChange() {
-		checkRealm();
-		changeSupport.fireEvent(new ChangeEvent(this));
-	}
-
-	/**
-	 * Fires map change events.  Must be invoked from current realm.
-	 * 
-	 * @param diff
-	 */
-	protected void fireMapChange(MapDiff diff) {
-		checkRealm();
-		changeSupport.fireEvent(new MapChangeEvent(this, diff));
-	}
-
-	/**
-	 * Asserts that the realm is the current realm.
-	 * 
-	 * @see Realm#isCurrent()
-	 * @throws AssertionFailedException
-	 *             if the realm is not the current realm
-	 */
-	protected void checkRealm() {
-		Assert.isTrue(getRealm().isCurrent(),
-				"This operation must be run within the observable's realm"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/BidiObservableMap.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/BidiObservableMap.java
deleted file mode 100644
index 2d012eb..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/BidiObservableMap.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *         (through BidirectionalMap.java)
- *     Matthew Hall - bug 233306
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.internal.databinding.Util;
-
-/**
- * An
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.2
- */
-public class BidiObservableMap extends DecoratingObservableMap {
-	/**
-	 * Inverse of wrapped map. When multiple keys map to the same value, they
-	 * are combined into a Set. This field is null when no listeners are
-	 * registered on this observable.
-	 */
-	private Map valuesToKeys;
-
-	/**
-	 * Constructs a BidirectionalMap tracking the given observable map.
-	 * 
-	 * @param wrappedMap
-	 *            the observable map to track
-	 */
-	public BidiObservableMap(IObservableMap wrappedMap) {
-		super(wrappedMap, false);
-	}
-
-	protected void firstListenerAdded() {
-		valuesToKeys = new HashMap();
-		for (Iterator it = entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Entry) it.next();
-			addMapping(entry.getKey(), entry.getValue());
-		}
-		super.firstListenerAdded();
-	}
-
-	protected void lastListenerRemoved() {
-		super.lastListenerRemoved();
-		valuesToKeys.clear();
-		valuesToKeys = null;
-	}
-
-	protected void handleMapChange(MapChangeEvent event) {
-		MapDiff diff = event.diff;
-		for (Iterator it = diff.getAddedKeys().iterator(); it.hasNext();) {
-			Object addedKey = it.next();
-			addMapping(addedKey, diff.getNewValue(addedKey));
-		}
-		for (Iterator it = diff.getChangedKeys().iterator(); it.hasNext();) {
-			Object changedKey = it.next();
-			removeMapping(changedKey, diff.getOldValue(changedKey));
-			addMapping(changedKey, diff.getNewValue(changedKey));
-		}
-		for (Iterator it = diff.getRemovedKeys().iterator(); it.hasNext();) {
-			Object removedKey = it.next();
-			removeMapping(removedKey, diff.getOldValue(removedKey));
-		}
-		super.handleMapChange(event);
-	}
-
-	public boolean containsValue(Object value) {
-		getterCalled();
-		// Faster lookup
-		if (valuesToKeys != null)
-			return valuesToKeys.containsKey(value);
-		return super.containsValue(value);
-	}
-
-	/**
-	 * Adds a mapping from value to key in the valuesToKeys map.
-	 * 
-	 * @param key
-	 *            the key being mapped
-	 * @param value
-	 *            the value being mapped
-	 */
-	private void addMapping(Object key, Object value) {
-		if (!valuesToKeys.containsKey(value)) {
-			if (key instanceof Set)
-				key = new HashSet(Collections.singleton(key));
-			valuesToKeys.put(value, key);
-		} else {
-			Object elementOrSet = valuesToKeys.get(value);
-			Set set;
-			if (elementOrSet instanceof Set) {
-				set = (Set) elementOrSet;
-			} else {
-				set = new HashSet(Collections.singleton(elementOrSet));
-				valuesToKeys.put(value, set);
-			}
-			set.add(key);
-		}
-	}
-
-	/**
-	 * Removes a mapping from value to key in the valuesToKeys map.
-	 * 
-	 * @param key
-	 *            the key being unmapped
-	 * @param value
-	 *            the value being unmapped
-	 */
-	private void removeMapping(Object key, Object value) {
-		if (valuesToKeys.containsKey(value)) {
-			Object elementOrSet = valuesToKeys.get(value);
-			if (elementOrSet instanceof Set) {
-				Set set = (Set) elementOrSet;
-				set.remove(key);
-				if (set.isEmpty()) {
-					valuesToKeys.remove(value);
-				}
-			} else if (elementOrSet == key
-					|| (elementOrSet != null && elementOrSet.equals(key))) {
-				valuesToKeys.remove(value);
-			}
-		}
-	}
-
-	/**
-	 * Returns the Set of keys that currently map to the given value.
-	 * 
-	 * @param value
-	 *            the value associated with the keys in the returned Set.
-	 * @return the Set of keys that map to the given value. If no keys map to
-	 *         the given value, an empty set is returned.
-	 */
-	public Set getKeys(Object value) {
-		// valuesToKeys is null when no listeners are registered
-		if (valuesToKeys == null)
-			return findKeys(value);
-
-		if (!valuesToKeys.containsKey(value))
-			return Collections.EMPTY_SET;
-		Object elementOrSet = valuesToKeys.get(value);
-		if (elementOrSet instanceof Set)
-			return Collections.unmodifiableSet((Set) elementOrSet);
-		return Collections.singleton(elementOrSet);
-	}
-
-	/**
-	 * Iterates the map and returns the set of keys which currently map to the
-	 * given value.
-	 * 
-	 * @param value
-	 *            the value to search for
-	 * @return the set of keys which currently map to the specified value.
-	 */
-	private Set findKeys(Object value) {
-		Set keys = new HashSet();
-		for (Iterator it = entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Map.Entry) it.next();
-			if (Util.equals(entry.getValue(), value))
-				keys.add(entry.getKey());
-		}
-		return keys;
-	}
-
-	public synchronized void dispose() {
-		if (valuesToKeys != null) {
-			valuesToKeys.clear();
-			valuesToKeys = null;
-		}
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/BidirectionalMap.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/BidirectionalMap.java
deleted file mode 100644
index 55987f6..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/BidirectionalMap.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 233306
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.map;
-
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- * 
- * @deprecated This class is deprecated; use {@link BidiObservableMap} instead.
- */
-public class BidirectionalMap extends ObservableMap {
-	private IMapChangeListener mapListener = new IMapChangeListener() {
-		public void handleMapChange(MapChangeEvent event) {
-			fireMapChange(event.diff);
-		}
-	};
-
-	/**
-	 * @param wrappedMap
-	 */
-	public BidirectionalMap(IObservableMap wrappedMap) {
-		super(wrappedMap.getRealm(), wrappedMap);
-		wrappedMap.addMapChangeListener(mapListener);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/CompositeMap.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/CompositeMap.java
deleted file mode 100644
index 98fdf26..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/CompositeMap.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 233306, 226289
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * A read-only observable map formed by the composition of two observable maps.
- * If map1 maps keys a:A to values b1:B, and map2 maps keys b2:B to values c:C,
- * the composite map maps keys a:A to values c:C. For example, map1 could map
- * Order objects to their corresponding Customer objects, and map2 could map
- * Customer objects to their "last name" property of type String. The composite
- * map of map1 and map2 would then map Order objects to their customers' last
- * names.
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.1
- * 
- */
-public class CompositeMap extends ObservableMap {
-	// adds that need to go through the second map and thus will be picked up by
-	// secondMapListener.
-	private Set pendingAdds = new HashSet();
-
-	// Removes that need to go through the second map and thus will be picked up
-	// by secondMapListener. Maps from value being removed to key being removed.
-	private Map pendingRemoves = new HashMap();
-
-	// Changes that need to go through the second map and thus will be picked up
-	// by secondMapListener. Maps from old value to new value and new value to old
-	// value.
-	private Map pendingChanges = new HashMap();
-
-	private IMapChangeListener firstMapListener = new IMapChangeListener() {
-
-		public void handleMapChange(MapChangeEvent event) {
-			MapDiff diff = event.diff;
-			Set rangeSetAdditions = new HashSet();
-			Set rangeSetRemovals = new HashSet();
-			final Set adds = new HashSet();
-			final Set changes = new HashSet();
-			final Set removes = new HashSet();
-			final Map oldValues = new HashMap();
-
-			for (Iterator it = diff.getAddedKeys().iterator(); it.hasNext();) {
-				Object addedKey = it.next();
-				Object newValue = diff.getNewValue(addedKey);
-				if (!rangeSet.contains(newValue)) {
-					pendingAdds.add(newValue);
-					rangeSetAdditions.add(newValue);
-				} else {
-					adds.add(addedKey);
-					wrappedMap.put(addedKey, secondMap.get(newValue));
-				}
-			}
-			for (Iterator it = diff.getChangedKeys().iterator(); it.hasNext();) {
-				Object changedKey = it.next();
-				Object oldValue = diff.getOldValue(changedKey);
-				Object newValue = diff.getNewValue(changedKey);
-				boolean removed = firstMap.getKeys(oldValue).isEmpty();
-				boolean added = !rangeSet.contains(newValue);
-				if (removed) {
-					pendingRemoves.put(oldValue, changedKey);
-					rangeSetRemovals.add(oldValue);
-				}
-				if (added) {
-					pendingAdds.add(newValue);
-					rangeSetAdditions.add(newValue);
-				}
-				if (added || removed) {
-					pendingChanges.put(oldValue, newValue);
-					pendingChanges.put(newValue, oldValue);
-				} else {
-					changes.add(changedKey);
-					oldValues.put(changedKey, oldValue);
-					wrappedMap.put(changedKey, secondMap.get(newValue));
-				}
-			}
-			for (Iterator it = diff.getRemovedKeys().iterator(); it.hasNext();) {
-				Object removedKey = it.next();
-				Object oldValue = diff.getOldValue(removedKey);
-				if (firstMap.getKeys(oldValue).isEmpty()) {
-					pendingRemoves.put(oldValue, removedKey);
-					rangeSetRemovals.add(oldValue);
-				} else {
-					removes.add(removedKey);
-					oldValues.put(removedKey, secondMap.get(oldValue));
-					wrappedMap.remove(removedKey);
-				}
-			}
-
-			if (adds.size() > 0 || removes.size() > 0 || changes.size() > 0) {
-				fireMapChange(new MapDiff() {
-
-					public Set getAddedKeys() {
-						return adds;
-					}
-
-					public Set getChangedKeys() {
-						return changes;
-					}
-
-					public Object getNewValue(Object key) {
-						return wrappedMap.get(key);
-					}
-
-					public Object getOldValue(Object key) {
-						return oldValues.get(key);
-					}
-
-					public Set getRemovedKeys() {
-						return removes;
-					}
-				});
-			}
-
-			if (rangeSetAdditions.size() > 0 || rangeSetRemovals.size() > 0) {
-				rangeSet.addAndRemove(rangeSetAdditions, rangeSetRemovals);
-			}
-		}
-	};
-
-	private IMapChangeListener secondMapListener = new IMapChangeListener() {
-
-		public void handleMapChange(MapChangeEvent event) {
-			MapDiff diff = event.diff;
-			final Set adds = new HashSet();
-			final Set changes = new HashSet();
-			final Set removes = new HashSet();
-			final Map oldValues = new HashMap();
-			final Map newValues = new HashMap();
-			Set addedKeys = new HashSet(diff.getAddedKeys());
-			Set removedKeys = new HashSet(diff.getRemovedKeys());
-
-			for (Iterator it = addedKeys.iterator(); it.hasNext();) {
-				Object addedKey = it.next();
-				Set elements = firstMap.getKeys(addedKey);
-				Object newValue = diff.getNewValue(addedKey);
-				if (pendingChanges.containsKey(addedKey)) {
-					Object oldKey = pendingChanges.remove(addedKey);
-					Object oldValue;
-					if (removedKeys.remove(oldKey)) {
-						oldValue = diff.getOldValue(oldKey);
-					} else {
-						oldValue = secondMap.get(oldKey);
-					}
-					pendingChanges.remove(oldKey);
-					pendingAdds.remove(addedKey);
-					pendingRemoves.remove(oldKey);
-					for (Iterator it2 = elements.iterator(); it2.hasNext();) {
-						Object element = it2.next();
-						changes.add(element);
-						oldValues.put(element, oldValue);
-						newValues.put(element, newValue);
-						wrappedMap.put(element, newValue);
-					}
-				} else if (pendingAdds.remove(addedKey)) {
-					for (Iterator it2 = elements.iterator(); it2.hasNext();) {
-						Object element = it2.next();
-						adds.add(element);
-						newValues.put(element, newValue);
-						wrappedMap.put(element, newValue);
-					}
-				} else {
-					Assert.isTrue(false, "unexpected case"); //$NON-NLS-1$
-				}
-			}
-			for (Iterator it = diff.getChangedKeys().iterator(); it.hasNext();) {
-				Object changedKey = it.next();
-				Set elements = firstMap.getKeys(changedKey);
-				for (Iterator it2 = elements.iterator(); it2.hasNext();) {
-					Object element = it2.next();
-					changes.add(element);
-					oldValues.put(element, diff.getOldValue(changedKey));
-					Object newValue = diff.getNewValue(changedKey);
-					newValues.put(element, newValue);
-					wrappedMap.put(element, newValue);
-				}
-			}
-			for (Iterator it = removedKeys.iterator(); it.hasNext();) {
-				Object removedKey = it.next();
-				Object element = pendingRemoves.remove(removedKey);
-				if (element != null) {
-					if (pendingChanges.containsKey(removedKey)) {
-						Object newKey = pendingChanges.remove(removedKey);
-						pendingChanges.remove(newKey);
-						pendingAdds.remove(newKey);
-						pendingRemoves.remove(removedKey);
-						changes.add(element);
-						oldValues.put(element, diff.getOldValue(removedKey));
-						Object newValue = secondMap.get(newKey);
-						newValues.put(element, newValue);
-						wrappedMap.put(element, newValue);
-					} else {
-						removes.add(element);
-						Object oldValue = diff.getOldValue(removedKey);
-						oldValues.put(element, oldValue);
-						wrappedMap.remove(element);
-					}
-				} else {
-					Assert.isTrue(false, "unexpected case"); //$NON-NLS-1$
-				}
-			}
-
-			if (adds.size() > 0 || removes.size() > 0 || changes.size() > 0) {
-				fireMapChange(new MapDiff() {
-
-					public Set getAddedKeys() {
-						return adds;
-					}
-
-					public Set getChangedKeys() {
-						return changes;
-					}
-
-					public Object getNewValue(Object key) {
-						return newValues.get(key);
-					}
-
-					public Object getOldValue(Object key) {
-						return oldValues.get(key);
-					}
-
-					public Set getRemovedKeys() {
-						return removes;
-					}
-				});
-			}
-		}
-	};
-
-	private BidiObservableMap firstMap;
-	private IObservableMap secondMap;
-
-	private static class WritableSetPlus extends WritableSet {
-		void addAndRemove(Set additions, Set removals) {
-			wrappedSet.removeAll(removals);
-			wrappedSet.addAll(additions);
-			fireSetChange(Diffs.createSetDiff(additions, removals));
-		}
-	}
-
-	private WritableSetPlus rangeSet = new WritableSetPlus();
-
-	/**
-	 * Creates a new composite map. Because the key set of the second map is
-	 * determined by the value set of the given observable map
-	 * <code>firstMap</code>, it cannot be passed in as an argument. Instead,
-	 * the second map will be created by calling
-	 * <code>secondMapFactory.createObservable(valueSet())</code>.
-	 * 
-	 * @param firstMap
-	 *            the first map
-	 * @param secondMapFactory
-	 *            a factory that creates the second map when given an observable
-	 *            set representing the value set of <code>firstMap</code>.
-	 */
-	public CompositeMap(IObservableMap firstMap,
-			IObservableFactory secondMapFactory) {
-		super(firstMap.getRealm(), new HashMap());
-		this.firstMap = new BidiObservableMap(firstMap);
-		firstMap.addMapChangeListener(firstMapListener);
-		rangeSet.addAll(firstMap.values());
-		this.secondMap = (IObservableMap) secondMapFactory
-				.createObservable(rangeSet);
-		secondMap.addMapChangeListener(secondMapListener);
-		for (Iterator it = firstMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Entry) it.next();
-			wrappedMap.put(entry.getKey(), secondMap.get(entry.getValue()));
-		}
-	}
-
-	public Object getKeyType() {
-		return firstMap.getKeyType();
-	}
-
-	public Object getValueType() {
-		return secondMap.getValueType();
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-		if (firstMap != null) {
-			firstMap.removeMapChangeListener(firstMapListener);
-			firstMap = null;
-		}
-		if (secondMap != null) {
-			secondMap.dispose();
-			secondMap = null;
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/ComputedObservableMap.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/ComputedObservableMap.java
deleted file mode 100644
index baa57b0..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/ComputedObservableMap.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bugs 241585, 247394, 226289
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.AbstractSet;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-
-/**
- * Maps objects to one of their attributes. Tracks changes to the underlying
- * observable set of objects (keys), as well as changes to attribute values.
- */
-public abstract class ComputedObservableMap extends AbstractObservableMap {
-
-	private IObservableSet keySet;
-	
-	private Object valueType;
-
-	private ISetChangeListener setChangeListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			Set addedKeys = new HashSet(event.diff.getAdditions());
-			Set removedKeys = new HashSet(event.diff.getRemovals());
-			Map oldValues = new HashMap();
-			Map newValues = new HashMap();
-			for (Iterator it = removedKeys.iterator(); it.hasNext();) {
-				Object removedKey = it.next();
-				Object oldValue = doGet(removedKey);
-				unhookListener(removedKey);
-				if (oldValue != null) {
-					oldValues.put(removedKey, oldValue);
-				}
-			}
-			for (Iterator it = addedKeys.iterator(); it.hasNext();) {
-				Object addedKey = it.next();
-				hookListener(addedKey);
-				Object newValue = doGet(addedKey);
-				newValues.put(addedKey, newValue);
-			}
-			fireMapChange(Diffs.createMapDiff(addedKeys, removedKeys,
-					Collections.EMPTY_SET, oldValues, newValues));
-		}
-	};
-
-	private Set entrySet = new EntrySet();
-
-	private class EntrySet extends AbstractSet {
-
-		public Iterator iterator() {
-			final Iterator keyIterator = keySet.iterator();
-			return new Iterator() {
-
-				public boolean hasNext() {
-					return keyIterator.hasNext();
-				}
-
-				public Object next() {
-					final Object key = keyIterator.next();
-					return new Map.Entry() {
-
-						public Object getKey() {
-							return key;
-						}
-
-						public Object getValue() {
-							return get(getKey());
-						}
-
-						public Object setValue(Object value) {
-							return put(getKey(), value);
-						}
-					};
-				}
-
-				public void remove() {
-					keyIterator.remove();
-				}
-			};
-		}
-
-		public int size() {
-			return keySet.size();
-		}
-
-	}
-
-	/**
-	 * @param keySet
-	 */
-	public ComputedObservableMap(IObservableSet keySet) {
-		this(keySet, null);
-	}
-
-	/**
-	 * @param keySet 
-	 * @param valueType 
-	 * @since 1.2
-	 */
-	public ComputedObservableMap(IObservableSet keySet, Object valueType) {
-		super(keySet.getRealm());
-		this.keySet = keySet;
-		this.valueType = valueType;
-	}
-
-	/**
-	 * @deprecated Subclasses are no longer required to call this method.
-	 */
-	protected void init() {
-	}
-
-	protected void firstListenerAdded() {
-		hookListeners();
-	}
-
-	protected void lastListenerRemoved() {
-		unhookListeners();
-	}
-
-	private void hookListeners() {
-		if (keySet != null) {
-			keySet.addSetChangeListener(setChangeListener);
-			for (Iterator it = this.keySet.iterator(); it.hasNext();) {
-				Object key = it.next();
-				hookListener(key);
-			}
-		}
-	}
-
-	private void unhookListeners() {
-		if (keySet != null) {
-			keySet.removeSetChangeListener(setChangeListener);
-			Object[] keys = keySet.toArray();
-			for (int i = 0; i < keys.length; i++) {
-				unhookListener(keys[i]);
-			}
-		}
-	}
-
-	protected final void fireSingleChange(Object key, Object oldValue,
-			Object newValue) {
-		fireMapChange(Diffs.createMapDiffSingleChange(key, oldValue, newValue));
-	}
-
-	public Object getKeyType() {
-		return keySet.getElementType();
-	}
-
-	public Object getValueType() {
-		return valueType;
-	}
-
-	public Set entrySet() {
-		return entrySet;
-	}
-	
-	public Set keySet() {
-		return keySet;
-	}
-
-	final public Object get(Object key) {
-		if (!keySet.contains(key))
-			return null;
-		return doGet(key);
-	}
-
-	final public Object put(Object key, Object value) {
-		if (!keySet.contains(key))
-			return null;
-		return doPut(key, value);
-	}
-
-	/**
-	 * @param removedKey
-	 */
-	protected abstract void unhookListener(Object removedKey);
-
-	/**
-	 * @param addedKey
-	 */
-	protected abstract void hookListener(Object addedKey);
-
-	/**
-	 * @param key
-	 * @return the value for the given key
-	 */
-	protected abstract Object doGet(Object key);
-
-	/**
-	 * @param key
-	 * @param value
-	 * @return the old value for the given key
-	 */
-	protected abstract Object doPut(Object key, Object value);
-
-	public synchronized void dispose() {
-		unhookListeners();
-		entrySet = null;
-		keySet = null;
-		setChangeListener = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/DecoratingObservableMap.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/DecoratingObservableMap.java
deleted file mode 100644
index 2624c00..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/DecoratingObservableMap.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237718)
- *     Matthew Hall - but 246626, 226289
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.DecoratingObservable;
-
-/**
- * An observable map which decorates another observable map.
- * 
- * @since 1.2
- */
-public class DecoratingObservableMap extends DecoratingObservable implements
-		IObservableMap {
-	private IObservableMap decorated;
-
-	private IMapChangeListener mapChangeListener;
-
-	/**
-	 * Constructs a DecoratingObservableMap which decorates the given
-	 * observable.
-	 * 
-	 * @param decorated
-	 *            the observable map being decorated
-	 * @param disposeDecoratedOnDispose
-	 */
-	public DecoratingObservableMap(IObservableMap decorated,
-			boolean disposeDecoratedOnDispose) {
-		super(decorated, disposeDecoratedOnDispose);
-		this.decorated = decorated;
-	}
-
-	public synchronized void addMapChangeListener(IMapChangeListener listener) {
-		addListener(MapChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeMapChangeListener(IMapChangeListener listener) {
-		removeListener(MapChangeEvent.TYPE, listener);
-	}
-
-	public Object getKeyType() {
-		return decorated.getKeyType();
-	}
-
-	public Object getValueType() {
-		return decorated.getValueType();
-	}
-
-	protected void fireMapChange(MapDiff diff) {
-		// fire general change event first
-		super.fireChange();
-		fireEvent(new MapChangeEvent(this, diff));
-	}
-
-	protected void fireChange() {
-		throw new RuntimeException(
-				"fireChange should not be called, use fireListChange() instead"); //$NON-NLS-1$
-	}
-
-	protected void firstListenerAdded() {
-		if (mapChangeListener == null) {
-			mapChangeListener = new IMapChangeListener() {
-				public void handleMapChange(MapChangeEvent event) {
-					DecoratingObservableMap.this.handleMapChange(event);
-				}
-			};
-		}
-		decorated.addMapChangeListener(mapChangeListener);
-		super.firstListenerAdded();
-	}
-
-	protected void lastListenerRemoved() {
-		super.lastListenerRemoved();
-		if (mapChangeListener != null) {
-			decorated.removeMapChangeListener(mapChangeListener);
-			mapChangeListener = null;
-		}
-	}
-
-	/**
-	 * Called whenever a MapChangeEvent is received from the decorated
-	 * observable. By default, this method fires the map change event again,
-	 * with the decorating observable as the event source. Subclasses may
-	 * override to provide different behavior.
-	 * 
-	 * @param event
-	 *            the change event received from the decorated observable
-	 */
-	protected void handleMapChange(final MapChangeEvent event) {
-		fireMapChange(event.diff);
-	}
-
-	public void clear() {
-		checkRealm();
-		decorated.clear();
-	}
-
-	public boolean containsKey(Object key) {
-		getterCalled();
-		return decorated.containsKey(key);
-	}
-
-	public boolean containsValue(Object value) {
-		getterCalled();
-		return decorated.containsValue(value);
-	}
-
-	private class BackedCollection implements Collection {
-		private Collection collection;
-
-		BackedCollection(Collection set) {
-			this.collection = set;
-		}
-
-		public boolean add(Object o) {
-			throw new UnsupportedOperationException();
-		}
-
-		public boolean addAll(Collection arg0) {
-			throw new UnsupportedOperationException();
-		}
-
-		public void clear() {
-			checkRealm();
-			collection.clear();
-		}
-
-		public boolean contains(Object o) {
-			getterCalled();
-			return collection.contains(o);
-		}
-
-		public boolean containsAll(Collection c) {
-			getterCalled();
-			return collection.containsAll(c);
-		}
-
-		public boolean isEmpty() {
-			getterCalled();
-			return collection.isEmpty();
-		}
-
-		public Iterator iterator() {
-			final Iterator iterator = collection.iterator();
-			return new Iterator() {
-				public boolean hasNext() {
-					getterCalled();
-					return iterator.hasNext();
-				}
-
-				public Object next() {
-					getterCalled();
-					return iterator.next();
-				}
-
-				public void remove() {
-					checkRealm();
-					iterator.remove();
-				}
-			};
-		}
-
-		public boolean remove(Object o) {
-			getterCalled();
-			return collection.remove(o);
-		}
-
-		public boolean removeAll(Collection c) {
-			getterCalled();
-			return collection.removeAll(c);
-		}
-
-		public boolean retainAll(Collection c) {
-			getterCalled();
-			return collection.retainAll(c);
-		}
-
-		public int size() {
-			getterCalled();
-			return collection.size();
-		}
-
-		public Object[] toArray() {
-			getterCalled();
-			return collection.toArray();
-		}
-
-		public Object[] toArray(Object[] array) {
-			getterCalled();
-			return collection.toArray(array);
-		}
-
-		public boolean equals(Object obj) {
-			getterCalled();
-			return collection.equals(obj);
-		}
-
-		public int hashCode() {
-			getterCalled();
-			return collection.hashCode();
-		}
-
-		public String toString() {
-			getterCalled();
-			return collection.toString();
-		}
-	}
-
-	private class BackedSet extends BackedCollection implements Set {
-		BackedSet(Set set) {
-			super(set);
-		}
-	}
-
-	Set entrySet = null;
-
-	public Set entrySet() {
-		getterCalled();
-		if (entrySet == null) {
-			entrySet = new BackedSet(decorated.entrySet());
-		}
-		return entrySet;
-	}
-
-	public Object get(Object key) {
-		getterCalled();
-		return decorated.get(key);
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		return decorated.isEmpty();
-	}
-
-	Set keySet = null;
-
-	public Set keySet() {
-		getterCalled();
-		if (keySet == null) {
-			keySet = new BackedSet(decorated.keySet());
-		}
-		return keySet;
-	}
-
-	public Object put(Object key, Object value) {
-		checkRealm();
-		return decorated.put(key, value);
-	}
-
-	public void putAll(Map m) {
-		checkRealm();
-		decorated.putAll(m);
-	}
-
-	public Object remove(Object key) {
-		checkRealm();
-		return decorated.remove(key);
-	}
-
-	public int size() {
-		getterCalled();
-		return decorated.size();
-	}
-
-	Collection values;
-
-	public Collection values() {
-		getterCalled();
-		if (values == null) {
-			values = new BackedCollection(decorated.values());
-		}
-		return values;
-	}
-
-	public boolean equals(Object o) {
-		getterCalled();
-		return decorated.equals(o);
-	}
-
-	public int hashCode() {
-		getterCalled();
-		return decorated.hashCode();
-	}
-
-	public String toString() {
-		getterCalled();
-		return decorated.toString();
-	}
-
-	public synchronized void dispose() {
-		if (decorated != null && mapChangeListener != null) {
-			decorated.removeMapChangeListener(mapChangeListener);
-		}
-		decorated = null;
-		mapChangeListener = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/IMapChangeListener.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/IMapChangeListener.java
deleted file mode 100644
index 3bc829e..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/IMapChangeListener.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-
-/**
- * Listener for changes to observable maps.
- * 
- * @since 1.0
- * 
- */
-public interface IMapChangeListener extends IObservablesListener {
-
-	/**
-	 * Handle a change an observable map. The given event object must only be
-	 * used locally in this method because it may be reused for other change
-	 * notifications. The diff object referenced by the event is immutable and
-	 * may be used non-locally.
-	 * 
-	 * @param event
-	 *            the event
-	 */
-	void handleMapChange(MapChangeEvent event);
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/IObservableMap.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/IObservableMap.java
deleted file mode 100644
index 20c0138..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/IObservableMap.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Matthew Hall - bug 237718, 226289
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.IObservable;
-
-/**
- * Observable Map.
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the classes that
- *              implement this interface. Note that direct implementers of this
- *              interface outside of the framework will be broken in future
- *              releases when methods are added to this interface.
- *              
- * @see AbstractObservableMap
- * @see ObservableMap
- * 
- * @since 1.1
- */
-public interface IObservableMap extends Map, IObservable {
-	
-	/**
-	 * Returns the element type for the {@link #keySet() keyset} of this
-	 * observable map, or <code>null</code> if the keyset is untyped.
-	 * 
-	 * @return the element type for the {@link #keySet() keyset} of this
-	 *         observable map, or <code>null</code> if the keyset is untyped.
-	 * @since 1.2
-	 */
-	public Object getKeyType();
-
-	/**
-	 * Returns the element type for the {@link #values() values} of this
-	 * observable map, or <code>null</code> if the values collection is untyped.
-	 * 
-	 * @return the element type for the {@link #values() values} of this
-	 *         observable map, or <code>null</code> if the values collection is
-	 *         untyped.
-	 * @since 1.2
-	 */
-	public Object getValueType();
-
-	/**
-	 * @param listener
-	 */
-	public void addMapChangeListener(IMapChangeListener listener);
-
-	/**
-	 * @param listener
-	 */
-	public void removeMapChangeListener(IMapChangeListener listener);
-	
-	/**
-	 * @TrackedGetter
-	 */
-	public int size();
-
-	/**
-	 * @TrackedGetter
-	 */
-	public boolean isEmpty();
-
-	/**
-	 * @TrackedGetter
-	 */
-	public boolean containsKey(Object key);
-
-	/**
-	 * @TrackedGetter
-	 */
-	public boolean containsValue(Object value);
-
-	/**
-	 * @TrackedGetter
-	 */
-	public Object get(Object key);
-
-	/**
-	 * 
-	 */
-	public Object put(Object key, Object value);
-
-	/**
-	 * 
-	 */
-	public Object remove(Object key);
-
-	/**
-	 * @TrackedGetter
-	 */
-	public Set keySet();
-
-	/**
-	 * @TrackedGetter
-	 */
-	public Collection values();
-
-	/**
-	 * @TrackedGetter
-	 */
-	public Set entrySet();
-
-	/**
-	 * @TrackedGetter
-	 */
-	public boolean equals(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-	public int hashCode();
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/MapChangeEvent.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/MapChangeEvent.java
deleted file mode 100644
index 90bfef9..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/MapChangeEvent.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-import org.eclipse.core.databinding.observable.ObservableEvent;
-
-/**
- * Map change event describing an incremental change of an
- * {@link IObservableMap} object.
- * 
- * @since 1.0
- * 
- */
-public class MapChangeEvent extends ObservableEvent {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -8092347212410548463L;
-	static final Object TYPE = new Object();
-
-	/**
-	 * Description of the change to the source observable map. Listeners must
-	 * not change this field.
-	 */
-	public MapDiff diff;
-
-	/**
-	 * Creates a new map change event
-	 * 
-	 * @param source
-	 *            the source observable map
-	 * @param diff
-	 *            the map change
-	 */
-	public MapChangeEvent(IObservableMap source, MapDiff diff) {
-		super(source);
-		this.diff = diff;
-	}
-
-	/**
-	 * Returns the observable map from which this event originated.
-	 * 
-	 * @return the observable map from which this event originated
-	 */
-	public IObservableMap getObservableMap() {
-		return (IObservableMap) getSource();
-	}
-
-	protected void dispatch(IObservablesListener listener) {
-		((IMapChangeListener) listener).handleMapChange(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/MapDiff.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/MapDiff.java
deleted file mode 100644
index 9677567..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/MapDiff.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 251884
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @since 1.1
- * 
- */
-public abstract class MapDiff {
-	/**
-	 * Returns true if the diff has no added, removed or changed entries.
-	 * 
-	 * @return true if the diff has no added, removed or changed entries.
-	 * @since 1.2
-	 */
-	public boolean isEmpty() {
-		return getAddedKeys().isEmpty() && getRemovedKeys().isEmpty()
-				&& getChangedKeys().isEmpty();
-	}
-
-	/**
-	 * Applies the changes in this diff to the given map
-	 * 
-	 * @param map
-	 *            the map to which the diff will be applied
-	 * @since 1.2
-	 */
-	public void applyTo(Map map) {
-		for (Iterator it = getAddedKeys().iterator(); it.hasNext();) {
-			Object key = it.next();
-			map.put(key, getNewValue(key));
-		}
-		for (Iterator it = getChangedKeys().iterator(); it.hasNext();) {
-			Object key = it.next();
-			map.put(key, getNewValue(key));
-		}
-		for (Iterator it = getRemovedKeys().iterator(); it.hasNext();) {
-			map.remove(it.next());
-		}
-	}
-
-	/**
-	 * @return the set of keys which were added
-	 */
-	public abstract Set getAddedKeys();
-
-	/**
-	 * @return the set of keys which were removed
-	 */
-	public abstract Set getRemovedKeys();
-
-	/**
-	 * @return the set of keys for which the value has changed
-	 */
-	public abstract Set getChangedKeys();
-
-	/**
-	 * Returns the old value for the given key, which must be an element of
-	 * {@link #getRemovedKeys()} or {@link #getChangedKeys()}.
-	 * 
-	 * @param key
-	 * @return the old value for the given key.
-	 */
-	public abstract Object getOldValue(Object key);
-
-	/**
-	 * Returns the new value for the given key, which must be an element of
-	 * {@link #getChangedKeys()} or {@link #getAddedKeys()}.
-	 * 
-	 * @param key
-	 * @return the new value for the given key.
-	 */
-	public abstract Object getNewValue(Object key);
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/ObservableMap.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/ObservableMap.java
deleted file mode 100644
index e644bce..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/ObservableMap.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Matthew Hall - bug 226289
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- */
-public class ObservableMap extends AbstractObservable implements IObservableMap {
-
-	protected Map wrappedMap;
-
-	private boolean stale = false;
-	
-	/**
-	 * @param wrappedMap
-	 */
-	public ObservableMap(Map wrappedMap) {
-		this(Realm.getDefault(), wrappedMap);
-	}
-
-	/**
-	 * @param realm 
-	 * @param wrappedMap
-	 */
-	public ObservableMap(Realm realm, Map wrappedMap) {
-		super(realm);
-		this.wrappedMap = wrappedMap;
-	}
-	
-	public synchronized void addMapChangeListener(IMapChangeListener listener) {
-		addListener(MapChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeMapChangeListener(IMapChangeListener listener) {
-		removeListener(MapChangeEvent.TYPE, listener);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public Object getKeyType() {
-		return null;
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public Object getValueType() {
-		return null;
-	}
-
-	protected void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	protected void fireMapChange(MapDiff diff) {
-		checkRealm();
-		
-		// fire general change event first
-		super.fireChange();
-
-		fireEvent(new MapChangeEvent(this, diff));
-	}
-
-	public boolean containsKey(Object key) {
-		getterCalled();
-		return wrappedMap.containsKey(key);
-	}
-
-	public boolean containsValue(Object value) {
-		getterCalled();
-		return wrappedMap.containsValue(value);
-	}
-
-	public Set entrySet() {
-		getterCalled();
-		return wrappedMap.entrySet();
-	}
-
-	public Object get(Object key) {
-		getterCalled();
-		return wrappedMap.get(key);
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		return wrappedMap.isEmpty();
-	}
-
-	public Set keySet() {
-		getterCalled();
-		return wrappedMap.keySet();
-	}
-
-	public int size() {
-		getterCalled();
-		return wrappedMap.size();
-	}
-
-	public Collection values() {
-		getterCalled();
-		return wrappedMap.values();
-	}
-
-	/**
-	 * Returns the stale state.  Must be invoked from the current realm.
-	 * 
-	 * @return stale state
-	 */
-	public boolean isStale() {
-		checkRealm();
-		return stale;
-	}
-
-	/**
-	 * Sets the stale state.  Must be invoked from the current realm.
-	 * 
-	 * @param stale
-	 *            The stale state to set. This will fire a stale event if the
-	 *            given boolean is true and this observable set was not already
-	 *            stale.
-	 */
-	public void setStale(boolean stale) {
-		checkRealm();
-		boolean wasStale = this.stale;
-		this.stale = stale;
-		if (!wasStale && stale) {
-			fireStale();
-		}
-	}
-
-	public Object put(Object key, Object value) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Object remove(Object key) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	public void putAll(Map arg0) {
-		throw new UnsupportedOperationException();
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/WritableMap.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/WritableMap.java
deleted file mode 100644
index d5c8769..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/WritableMap.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Matthew Hall - bugs 184830, 233306, 226289
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.internal.databinding.Util;
-
-/**
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- */
-public class WritableMap extends ObservableMap {
-	private final Object keyType;
-	private final Object valueType;
-
-	/**
-	 * Constructs a new WritableMap on the default realm.
-	 */
-	public WritableMap() {
-		this(Realm.getDefault(), null, null);
-	}
-	
-	/**
-	 * Constructs a new WritableMap on the given realm.
-	 * 
-	 * @param realm
-	 *            the realm
-	 */
-	public WritableMap(Realm realm) {
-		this(realm, null, null);
-	}
-
-	/**
-	 * Constructs a new WritableMap on the default realm with the specified key
-	 * and value types.
-	 * 
-	 * @param keyType
-	 * @param valueType
-	 * @since 1.2
-	 */
-	public WritableMap(Object keyType, Object valueType) {
-		this(Realm.getDefault(), keyType, valueType);
-	}
-
-	/**
-	 * Constructs a new WritableMap on the given realm with the specified key
-	 * and value types.
-	 * 
-	 * @param realm
-	 * @param keyType
-	 * @param valueType
-	 * @since 1.2
-	 */
-	public WritableMap(Realm realm, Object keyType, Object valueType) {
-		super(realm, new HashMap());
-		this.keyType = keyType;
-		this.valueType = valueType;
-	}
-
-	public Object getKeyType() {
-		return keyType;
-	}
-
-	public Object getValueType() {
-		return valueType;
-	}
-
-	/**
-	 * Associates the provided <code>value</code> with the <code>key</code>.  Must be invoked from the current realm.
-	 */
-	public Object put(Object key, Object value) {
-		checkRealm();
-
-		boolean containedKeyBefore = wrappedMap.containsKey(key);
-		Object result = wrappedMap.put(key, value);
-		boolean containedKeyAfter = wrappedMap.containsKey(key);
-
-		if (containedKeyBefore != containedKeyAfter
-				|| !Util.equals(result, value)) {
-			MapDiff diff;
-			if (containedKeyBefore) {
-				if (containedKeyAfter) {
-					diff = Diffs
-							.createMapDiffSingleChange(key, result, value);
-				} else {
-					diff = Diffs.createMapDiffSingleRemove(key, result);
-				}
-			} else {
-				diff = Diffs.createMapDiffSingleAdd(key, value);
-			}
-			fireMapChange(diff);
-		}
-		return result;
-	}
-
-	/**
-	 * Removes the value with the provide <code>key</code>.  Must be invoked from the current realm.
-	 */
-	public Object remove(Object key) {
-		checkRealm();
-		if (wrappedMap.containsKey(key)) {
-			Object result = wrappedMap.remove(key);
-			fireMapChange(Diffs.createMapDiffSingleRemove(key, result));
-			return result;
-		}
-		return null;
-	}
-
-	/**
-	 * Clears the map.  Must be invoked from the current realm.
-	 */
-	public void clear() {
-		checkRealm();
-		if (!isEmpty()) {
-			Map copy = new HashMap(wrappedMap);
-			wrappedMap.clear();
-			fireMapChange(Diffs.createMapDiffRemoveAll(copy));
-		}
-	}
-
-	/**
-	 * Adds the provided <code>map</code>'s contents to this map.  Must be invoked from the current realm.
-	 */
-	public void putAll(Map map) {
-		checkRealm();
-		Set addedKeys = new HashSet(map.size());
-		Map changes = new HashMap(map.size());
-		for (Iterator it = map.entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Entry) it.next();
-			boolean add = !wrappedMap.containsKey(entry.getKey());
-			Object previousValue = wrappedMap.put(entry.getKey(), entry
-					.getValue());
-			if (add) {
-				addedKeys.add(entry.getKey());
-			} else {
-				changes.put(entry.getKey(), previousValue);
-			}
-		}
-		if (!addedKeys.isEmpty() || !changes.isEmpty()) {
-			fireMapChange(Diffs.createMapDiff(addedKeys, Collections.EMPTY_SET,
-					changes.keySet(), changes, wrappedMap));
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/package.html b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/package.html
deleted file mode 100644
index 22107ea..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/map/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes that can be used to observe changes in maps.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that can be used to observe changes in maps.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/masterdetail/IObservableFactory.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/masterdetail/IObservableFactory.java
deleted file mode 100644
index e113f14..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/masterdetail/IObservableFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.masterdetail;
-
-import org.eclipse.core.databinding.observable.IObservable;
-
-/**
- * Generates an {@link IObservable} when passed a target instance.
- * 
- * @since 1.0
- */
-public interface IObservableFactory {
-
-	/**
-	 * Creates an observable for the given target object.
-	 * 
-	 * @param target
-	 * @return the new observable
-	 */
-	public IObservable createObservable(Object target);
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/masterdetail/MasterDetailObservables.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/masterdetail/MasterDetailObservables.java
deleted file mode 100644
index e75dc53..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/masterdetail/MasterDetailObservables.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 147515
- *     Matthew Hall - bug 221704, 226289
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.masterdetail;
-
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableList;
-import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableMap;
-import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableSet;
-import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableValue;
-
-/**
- * Allows for the observation of an attribute, the detail, of an observable
- * representing selection or another transient instance, the master.
- * 
- * @since 1.0
- */
-public class MasterDetailObservables {
-	
-	/**
-	 * Creates a detail observable value from a master observable value and a
-	 * factory. This can be used to create observable values that represent a
-	 * property of a selected object in a table.
-	 * 
-	 * @param master
-	 *            the observable value to track
-	 * @param detailFactory
-	 *            a factory for creating {@link IObservableValue} instances
-	 *            given a current value of the master
-	 * @param detailType
-	 *            the value type of the detail observable value, typically of
-	 *            type java.lang.Class and can be <code>null</code>
-	 * @return an observable value of the given value type that, for any current
-	 *         value of the given master value, behaves like the observable
-	 *         value created by the factory for that current value.
-	 */
-	public static IObservableValue detailValue(IObservableValue master,
-			IObservableFactory detailFactory, Object detailType) {
-		return new DetailObservableValue(master, detailFactory, detailType);
-	}
-
-	/**
-	 * Creates a detail observable list from a master observable value and a
-	 * factory. This can be used to create observable lists that represent a
-	 * list property of a selected object in a table.
-	 * 
-	 * @param master
-	 *            the observable value to track
-	 * @param detailFactory
-	 *            a factory for creating {@link IObservableList} instances given
-	 *            a current value of the master
-	 * @param detailElementType
-	 *            the element type of the detail observable list, typically of
-	 *            type java.lang.Class and can be <code>null</code>
-	 * @return an observable list with the given element type that, for any
-	 *         current value of the given master value, behaves like the
-	 *         observable list created by the factory for that current value.
-	 */
-	public static IObservableList detailList(IObservableValue master,
-			IObservableFactory detailFactory, Object detailElementType) {
-		return new DetailObservableList(detailFactory, master,
-				detailElementType);
-	}
-
-	/**
-	 * Creates a detail observable set from a master observable value and a
-	 * factory. This can be used to create observable sets that represent a set
-	 * property of a selected object in a table.
-	 * 
-	 * @param master
-	 *            the observable value to track
-	 * @param detailFactory
-	 *            a factory for creating {@link IObservableSet} instances given
-	 *            a current value of the master
-	 * @param detailElementType
-	 *            the element type of the detail observable set, typically of
-	 *            type java.lang.Class and can be <code>null</code>
-	 * @return an observable set with the given element type that, for any
-	 *         current value of the given master value, behaves like the
-	 *         observable set created by the factory for that current value.
-	 */
-	public static IObservableSet detailSet(IObservableValue master,
-			IObservableFactory detailFactory, Object detailElementType) {
-		return new DetailObservableSet(detailFactory, master, detailElementType);
-	}
-
-	/**
-	 * Creates a detail observable map from a master observable value and a
-	 * factory. This can be used to create observable maps that represent a map
-	 * property of a selected object in a table.
-	 * 
-	 * @param master
-	 *            the observable value to track
-	 * @param detailFactory
-	 *            a factory for createing {@link IObservableMap} instances given
-	 *            a current value of the master
-	 * @return an observable map that, for any current value of the given master
-	 *         value, behaves like the observable map created by the factory for
-	 *         that current value.
-	 * @since 1.1
-	 */
-	public static IObservableMap detailMap(IObservableValue master,
-			IObservableFactory detailFactory) {
-		return detailMap(master, detailFactory, null, null);
-	}
-
-	/**
-	 * Creates a detail observable map from a master observable value and a
-	 * factory. This can be used to create observable maps that represent a map
-	 * property of a selected object in a table.
-	 * 
-	 * @param master
-	 *            the observable value to track
-	 * @param detailFactory
-	 *            a factory for createing {@link IObservableMap} instances given
-	 *            a current value of the master
-	 * @param detailKeyType
-	 *            the element type of the detail observable map's key set,
-	 *            typically of type java.lang.Class and can be <code>null</code>
-	 * @param detailValueType
-	 *            the element type of the detail observable map's values
-	 *            collection, typically of type java.lang.Class and can be
-	 *            <code>null</code>
-	 * @return an observable map that, for any current value of the given master
-	 *         value, behaves like the observable map created by the factory for
-	 *         that current value.
-	 * @since 1.2
-	 */
-	public static IObservableMap detailMap(IObservableValue master,
-			IObservableFactory detailFactory, Object detailKeyType,
-			Object detailValueType) {
-		return new DetailObservableMap(detailFactory, master, detailKeyType,
-				detailValueType);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/masterdetail/package.html b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/masterdetail/package.html
deleted file mode 100644
index 07b72e5..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/masterdetail/package.html
+++ /dev/null
@@ -1,17 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes that can be used to observe a detail of a master object.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that can be used to observe a detail of a master object.  
-A common use case for master detail is observing the detail (e.g. name) of a master (e.g. selected Person) of a list of elements.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/package.html b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/package.html
deleted file mode 100644
index 0739c1c..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides the core APIs for observing changes in objects.
-<h2>
-Package Specification</h2>
-<p>
-This package provides the core APIs for observing changes in objects.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/AbstractObservableSet.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/AbstractObservableSet.java
deleted file mode 100644
index 5c9d0b7..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/AbstractObservableSet.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 208332
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.ChangeSupport;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * 
- * Abstract implementation of {@link IObservableSet}.
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- */
-public abstract class AbstractObservableSet extends AbstractObservable implements
-		IObservableSet {
-
-	private ChangeSupport changeSupport;
-
-	private boolean stale = false;
-
-	protected AbstractObservableSet() {
-		this(Realm.getDefault());
-	}
-	
-	protected void firstListenerAdded() {
-		super.firstListenerAdded();
-	}
-
-	protected void lastListenerRemoved() {
-		super.lastListenerRemoved();
-	}
-	
-	protected AbstractObservableSet(Realm realm) {
-		super(realm);
-		changeSupport = new ChangeSupport(realm){
-			protected void firstListenerAdded() {
-				AbstractObservableSet.this.firstListenerAdded();
-			}
-			protected void lastListenerRemoved() {
-				AbstractObservableSet.this.lastListenerRemoved();
-			}
-		};
-	}
-	
-	public synchronized void addSetChangeListener(ISetChangeListener listener) {
-		changeSupport.addListener(SetChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeSetChangeListener(ISetChangeListener listener) {
-		changeSupport.removeListener(SetChangeEvent.TYPE, listener);
-	}
-
-	protected abstract Set getWrappedSet();
-	
-	protected void fireSetChange(SetDiff diff) {
-		// fire general change event first
-		super.fireChange();
-
-		changeSupport.fireEvent(new SetChangeEvent(this, diff));
-	}
-	
-	public boolean contains(Object o) {
-		getterCalled();
-		return getWrappedSet().contains(o);
-	}
-
-	public boolean containsAll(Collection c) {
-		getterCalled();
-		return getWrappedSet().containsAll(c);
-	}
-
-	public boolean equals(Object o) {
-		getterCalled();
-		return getWrappedSet().equals(o);
-	}
-
-	public int hashCode() {
-		getterCalled();
-		return getWrappedSet().hashCode();
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		return getWrappedSet().isEmpty();
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final Iterator wrappedIterator = getWrappedSet().iterator();
-		return new Iterator() {
-
-			public void remove() {
-				throw new UnsupportedOperationException();
-			}
-
-			public boolean hasNext() {
-				ObservableTracker.getterCalled(AbstractObservableSet.this);
-				return wrappedIterator.hasNext();
-			}
-
-			public Object next() {
-				ObservableTracker.getterCalled(AbstractObservableSet.this);
-				return wrappedIterator.next();
-			}
-		};
-	}
-
-	public int size() {
-		getterCalled();
-		return getWrappedSet().size();
-	}
-
-	public Object[] toArray() {
-		getterCalled();
-		return getWrappedSet().toArray();
-	}
-
-	public Object[] toArray(Object[] a) {
-		getterCalled();
-		return getWrappedSet().toArray(a);
-	}
-
-	public String toString() {
-		getterCalled();
-		return getWrappedSet().toString();
-	}
-
-	protected void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean remove(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean removeAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean retainAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	/**
-	 * @return Returns the stale state.
-	 */
-	public boolean isStale() {
-		getterCalled();
-		return stale;
-	}
-
-	/**
-	 * @param stale
-	 *            The stale state to set. This will fire a stale event if the
-	 *            given boolean is true and this observable set was not already
-	 *            stale.
-	 */
-	public void setStale(boolean stale) {
-		checkRealm();
-		boolean wasStale = this.stale;
-		this.stale = stale;
-		if (!wasStale && stale) {
-			fireStale();
-		}
-	}
-
-
-	protected void fireChange() {
-		throw new RuntimeException("fireChange should not be called, use fireSetChange() instead"); //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.provisional.databinding.observable.AbstractObservable#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-		
-		if (changeSupport != null) {
-			changeSupport.dispose();
-			changeSupport = null;
-		}
-	}
-	
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/ComputedSet.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/ComputedSet.java
deleted file mode 100644
index a8cd743..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/ComputedSet.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237703)
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-
-/**
- * A lazily calculated set that automatically computes and registers listeners
- * on its dependencies as long as all of its dependencies are IObservable
- * objects
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.2
- */
-public abstract class ComputedSet extends AbstractObservableSet {
-	private Set cachedSet = new HashSet();
-
-	private boolean dirty = true;
-	private boolean stale = false;
-
-	private IObservable[] dependencies = new IObservable[0];
-
-	/**
-	 * Creates a computed set in the default realm and with an unknown (null)
-	 * element type.
-	 */
-	public ComputedSet() {
-		this(Realm.getDefault(), null);
-	}
-
-	/**
-	 * Creates a computed set in the default realm and with the given element
-	 * type.
-	 * 
-	 * @param elementType
-	 *            the element type, may be <code>null</code> to indicate unknown
-	 *            element type
-	 */
-	public ComputedSet(Object elementType) {
-		this(Realm.getDefault(), elementType);
-	}
-
-	/**
-	 * Creates a computed set in given realm and with an unknown (null) element
-	 * type.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * 
-	 */
-	public ComputedSet(Realm realm) {
-		this(realm, null);
-	}
-
-	/**
-	 * Creates a computed set in the given realm and with the given element
-	 * type.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param elementType
-	 *            the element type, may be <code>null</code> to indicate unknown
-	 *            element type
-	 */
-	public ComputedSet(Realm realm, Object elementType) {
-		super(realm);
-		this.elementType = elementType;
-	}
-
-	/**
-	 * Inner class that implements interfaces that we don't want to expose as
-	 * public API. Each interface could have been implemented using a separate
-	 * anonymous class, but we combine them here to reduce the memory overhead
-	 * and number of classes.
-	 * 
-	 * <p>
-	 * The Runnable calls calculate and stores the result in cachedSet.
-	 * </p>
-	 * 
-	 * <p>
-	 * The IChangeListener stores each observable in the dependencies list. This
-	 * is registered as the listener when calling ObservableTracker, to detect
-	 * every observable that is used by computeValue.
-	 * </p>
-	 * 
-	 * <p>
-	 * The IChangeListener is attached to every dependency.
-	 * </p>
-	 * 
-	 */
-	private class PrivateInterface implements Runnable, IChangeListener,
-			IStaleListener {
-		public void run() {
-			cachedSet = calculate();
-			if (cachedSet == null)
-				cachedSet = Collections.EMPTY_SET;
-		}
-
-		public void handleStale(StaleEvent event) {
-			if (!dirty)
-				makeStale();
-		}
-
-		public void handleChange(ChangeEvent event) {
-			makeDirty();
-		}
-	}
-
-	private PrivateInterface privateInterface = new PrivateInterface();
-
-	private Object elementType;
-
-	protected int doGetSize() {
-		return doGetSet().size();
-	}
-
-	private final Set getSet() {
-		getterCalled();
-		return doGetSet();
-	}
-
-	protected Set getWrappedSet() {
-		return doGetSet();
-	}
-
-	final Set doGetSet() {
-		if (dirty) {
-			// This line will do the following:
-			// - Run the calculate method
-			// - While doing so, add any observable that is touched to the
-			// dependencies list
-			IObservable[] newDependencies = ObservableTracker.runAndMonitor(
-					privateInterface, privateInterface, null);
-
-			// If any dependencies are stale, a stale event will be fired here
-			// even if we were already stale before recomputing. This is in case
-			// clients assume that a set change is indicative of non-staleness.
-			stale = false;
-			for (int i = 0; i < newDependencies.length; i++) {
-				if (newDependencies[i].isStale()) {
-					makeStale();
-					break;
-				}
-			}
-
-			if (!stale) {
-				for (int i = 0; i < newDependencies.length; i++) {
-					newDependencies[i].addStaleListener(privateInterface);
-				}
-			}
-
-			dependencies = newDependencies;
-
-			dirty = false;
-		}
-
-		return cachedSet;
-	}
-
-	/**
-	 * Subclasses must override this method to calculate the set contents.
-	 * 
-	 * @return the object's set.
-	 */
-	protected abstract Set calculate();
-
-	private void makeDirty() {
-		if (!dirty) {
-			dirty = true;
-
-			makeStale();
-
-			stopListening();
-
-			// copy the old set
-			final Set oldSet = new HashSet(cachedSet);
-			// Fire the "dirty" event. This implementation recomputes the new
-			// set lazily.
-			fireSetChange(new SetDiff() {
-				SetDiff delegate;
-
-				private SetDiff getDelegate() {
-					if (delegate == null)
-						delegate = Diffs.computeSetDiff(oldSet, getSet());
-					return delegate;
-				}
-
-				public Set getAdditions() {
-					return getDelegate().getAdditions();
-				}
-
-				public Set getRemovals() {
-					return getDelegate().getRemovals();
-				}
-			});
-		}
-	}
-
-	private void stopListening() {
-		if (dependencies != null) {
-			for (int i = 0; i < dependencies.length; i++) {
-				IObservable observable = dependencies[i];
-
-				observable.removeChangeListener(privateInterface);
-				observable.removeStaleListener(privateInterface);
-			}
-			dependencies = null;
-		}
-	}
-
-	private void makeStale() {
-		if (!stale) {
-			stale = true;
-			fireStale();
-		}
-	}
-
-	public boolean isStale() {
-		// recalculate set if dirty, to ensure staleness is correct.
-		getSet();
-		return stale;
-	}
-
-	public Object getElementType() {
-		return elementType;
-	}
-
-	public synchronized void addChangeListener(IChangeListener listener) {
-		super.addChangeListener(listener);
-		// If somebody is listening, we need to make sure we attach our own
-		// listeners
-		computeSetForListeners();
-	}
-
-	public synchronized void addSetChangeListener(ISetChangeListener listener) {
-		super.addSetChangeListener(listener);
-		// If somebody is listening, we need to make sure we attach our own
-		// listeners
-		computeSetForListeners();
-	}
-
-	private void computeSetForListeners() {
-		// Some clients just add a listener and expect to get notified even if
-		// they never called getValue(), so we have to call getValue() ourselves
-		// here to be sure. Need to be careful about realms though, this method
-		// can be called outside of our realm.
-		// See also bug 198211. If a client calls this outside of our realm,
-		// they may receive change notifications before the runnable below has
-		// been executed. It is their job to figure out what to do with those
-		// notifications.
-		getRealm().exec(new Runnable() {
-			public void run() {
-				if (dependencies == null) {
-					// We are not currently listening.
-					// But someone is listening for changes. Call getValue()
-					// to make sure we start listening to the observables we
-					// depend on.
-					getSet();
-				}
-			}
-		});
-	}
-
-	public synchronized void dispose() {
-		stopListening();
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/DecoratingObservableSet.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/DecoratingObservableSet.java
deleted file mode 100644
index 38092bb..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/DecoratingObservableSet.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237718)
- *     Matthew Hall - bug 246626
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import org.eclipse.core.databinding.observable.DecoratingObservableCollection;
-
-/**
- * An observable set which decorates another observable set.
- * 
- * @since 1.2
- */
-public class DecoratingObservableSet extends DecoratingObservableCollection
-		implements IObservableSet {
-
-	private IObservableSet decorated;
-
-	private ISetChangeListener setChangeListener;
-
-	/**
-	 * Constructs a DecoratingObservableSet which decorates the given
-	 * observable.
-	 * 
-	 * @param decorated
-	 *            the observable set being decorated
-	 * @param disposeDecoratedOnDispose
-	 */
-	public DecoratingObservableSet(IObservableSet decorated,
-			boolean disposeDecoratedOnDispose) {
-		super(decorated, disposeDecoratedOnDispose);
-		this.decorated = decorated;
-	}
-
-	public void clear() {
-		getterCalled();
-		decorated.clear();
-	}
-
-	public synchronized void addSetChangeListener(ISetChangeListener listener) {
-		addListener(SetChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeSetChangeListener(ISetChangeListener listener) {
-		removeListener(SetChangeEvent.TYPE, listener);
-	}
-
-	protected void fireSetChange(SetDiff diff) {
-		// fire general change event first
-		super.fireChange();
-		fireEvent(new SetChangeEvent(this, diff));
-	}
-
-	protected void fireChange() {
-		throw new RuntimeException(
-				"fireChange should not be called, use fireSetChange() instead"); //$NON-NLS-1$
-	}
-
-	protected void firstListenerAdded() {
-		if (setChangeListener == null) {
-			setChangeListener = new ISetChangeListener() {
-				public void handleSetChange(SetChangeEvent event) {
-					DecoratingObservableSet.this.handleSetChange(event);
-				}
-			};
-		}
-		decorated.addSetChangeListener(setChangeListener);
-		super.firstListenerAdded();
-	}
-
-	protected void lastListenerRemoved() {
-		super.lastListenerRemoved();
-		if (setChangeListener != null) {
-			decorated.removeSetChangeListener(setChangeListener);
-			setChangeListener = null;
-		}
-	}
-
-	/**
-	 * Called whenever a SetChangeEvent is received from the decorated
-	 * observable. By default, this method fires the set change event again,
-	 * with the decorating observable as the event source. Subclasses may
-	 * override to provide different behavior.
-	 * 
-	 * @param event
-	 *            the change event received from the decorated observable
-	 */
-	protected void handleSetChange(final SetChangeEvent event) {
-		fireSetChange(event.diff);
-	}
-
-	public synchronized void dispose() {
-		if (decorated != null && setChangeListener != null) {
-			decorated.removeSetChangeListener(setChangeListener);
-		}
-		decorated = null;
-		setChangeListener = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/IObservableSet.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/IObservableSet.java
deleted file mode 100644
index 358cb0c..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/IObservableSet.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 237718
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.IObservableCollection;
-
-/**
- * A set whose changes can be tracked by set change listeners.
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the classes that
- *              implement this interface. Note that direct implementers of this
- *              interface outside of the framework will be broken in future
- *              releases when methods are added to this interface.
- * 
- * @see AbstractObservableSet
- * @see ObservableSet
- * 
- * @since 1.0
- * 
- */
-public interface IObservableSet extends Set, IObservableCollection {
-
-	/**
-	 * @param listener
-	 */
-	public void addSetChangeListener(ISetChangeListener listener);
-
-	/**
-	 * @param listener
-	 */
-	public void removeSetChangeListener(ISetChangeListener listener);
-
-	/**
-	 * @return the element type or <code>null</code> if untyped
-	 */
-	public Object getElementType();
-
-	/**
-	 * @TrackedGetter
-	 */
-	int size();
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean isEmpty();
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean contains(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-	Iterator iterator();
-
-	/**
-	 * @TrackedGetter
-	 */
-	Object[] toArray();
-
-	/**
-	 * @TrackedGetter
-	 */
-	Object[] toArray(Object a[]);
-
-	// Modification Operations
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean add(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean remove(Object o);
-
-	// Bulk Operations
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean containsAll(Collection c);
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean addAll(Collection c);
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean retainAll(Collection c);
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean removeAll(Collection c);
-
-	// Comparison and hashing
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean equals(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-	int hashCode();
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/ISetChangeListener.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/ISetChangeListener.java
deleted file mode 100644
index 51c429a..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/ISetChangeListener.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-
-/**
- * Listener for changes to observable sets.
- * 
- * @since 1.0
- * 
- */
-public interface ISetChangeListener extends IObservablesListener {
-
-	/**
-	 * Handle a change to an observable set. The given event object must only be
-	 * used locally in this method because it may be reused for other change
-	 * notifications. The diff object referenced by the event is immutable and
-	 * may be used non-locally.
-	 * 
-	 * @param event
-	 *            the event
-	 */
-	void handleSetChange(SetChangeEvent event);
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/ListToSetAdapter.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/ListToSetAdapter.java
deleted file mode 100644
index e145fb3..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/ListToSetAdapter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-
-/**
- * Observable set backed by an observable list. The wrapped list must not
- * contain duplicate elements.
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- * 
- */
-public class ListToSetAdapter extends ObservableSet {
-
-	private final IObservableList list;
-
-	private IListChangeListener listener = new IListChangeListener() {
-
-		public void handleListChange(ListChangeEvent event) {
-			Set added = new HashSet();
-			Set removed = new HashSet();
-			ListDiffEntry[] differences = event.diff.getDifferences();
-			for (int i = 0; i < differences.length; i++) {
-				ListDiffEntry entry = differences[i];
-				Object element = entry.getElement();
-				if (entry.isAddition()) {
-					if (wrappedSet.add(element)) {
-						if (!removed.remove(element))
-							added.add(element);
-					}
-				} else {
-					if (wrappedSet.remove(element)) {
-						removed.add(element);
-						added.remove(element);
-					}
-				}
-			}
-			fireSetChange(Diffs.createSetDiff(added, removed));
-		}
-	};
-
-	/**
-	 * @param list
-	 */
-	public ListToSetAdapter(IObservableList list) {
-		super(list.getRealm(), new HashSet(), list.getElementType());
-		this.list = list;
-		wrappedSet.addAll(list);
-		this.list.addListChangeListener(listener);
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-		if (list != null && listener != null) {
-			list.removeListChangeListener(listener);
-			listener = null;
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/MappedSet.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/MappedSet.java
deleted file mode 100644
index c51c0c5..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/MappedSet.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.map.MapChangeEvent;
-import org.eclipse.core.databinding.observable.map.MapDiff;
-
-/**
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- * 
- */
-public class MappedSet extends ObservableSet {
-
-	private final IObservableMap wrappedMap;
-
-	/*
-	 * Map from values (range elements) to Integer ref counts
-	 */
-	private Map valueCounts = new HashMap();
-
-	private ISetChangeListener domainListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			Set additions = new HashSet();
-			for (Iterator it = event.diff.getAdditions().iterator(); it.hasNext();) {
-				Object added = it.next();
-				Object mapValue = wrappedMap.get(added);
-				if (handleAddition(mapValue)) {
-					additions.add(mapValue);
-				}
-			}
-			Set removals = new HashSet();
-			for (Iterator it = event.diff.getRemovals().iterator(); it.hasNext();) {
-				Object removed = it.next();
-				Object mapValue = wrappedMap.get(removed);
-				if (handleRemoval(mapValue)) {
-					removals.add(mapValue);
-				}
-			}
-			fireSetChange(Diffs.createSetDiff(additions, removals));
-		}
-	};
-
-	private IMapChangeListener mapChangeListener = new IMapChangeListener() {
-		public void handleMapChange(MapChangeEvent event) {
-			MapDiff diff = event.diff;
-			Set additions = new HashSet();
-			Set removals = new HashSet();
-			for (Iterator it = diff.getRemovedKeys().iterator(); it.hasNext();) {
-				Object key = it.next();
-				Object oldValue = diff.getOldValue(key);
-				if (handleRemoval(oldValue)) {
-					removals.add(oldValue);
-				}
-			}
-			for (Iterator it = diff.getChangedKeys().iterator(); it.hasNext();) {
-				Object key = it.next();
-				Object oldValue = diff.getOldValue(key);
-				Object newValue = diff.getNewValue(key);
-				if (handleRemoval(oldValue)) {
-					removals.add(oldValue);
-				}
-				if (handleAddition(newValue)) {
-					additions.add(newValue);
-				}
-			}
-			for (Iterator it = diff.getAddedKeys().iterator(); it.hasNext();) {
-				Object key = it.next();
-				Object newValue = diff.getNewValue(key);
-				if (handleAddition(newValue)) {
-					additions.add(newValue);
-				}
-			}
-			fireSetChange(Diffs.createSetDiff(additions, removals));
-		}
-	};
-
-	private IObservableSet input;
-
-	/**
-	 * @param input
-	 * @param map
-	 */
-	public MappedSet(IObservableSet input, IObservableMap map) {
-		super(input.getRealm(), Collections.EMPTY_SET, Object.class);
-		setWrappedSet(valueCounts.keySet());
-		this.wrappedMap = map;
-		this.input = input;
-		for (Iterator it = input.iterator(); it.hasNext();) {
-			Object element = it.next();
-			Object functionValue = wrappedMap.get(element);
-			handleAddition(functionValue);
-		}
-		input.addSetChangeListener(domainListener);
-		map.addMapChangeListener(mapChangeListener);
-	}
-
-	/**
-	 * @param mapValue
-	 * @return true if the given mapValue was an addition
-	 */
-	protected boolean handleAddition(Object mapValue) {
-		Integer count = (Integer) valueCounts.get(mapValue);
-		if (count == null) {
-			valueCounts.put(mapValue, new Integer(1));
-			return true;
-		}
-		valueCounts.put(mapValue, new Integer(count.intValue() + 1));
-		return false;
-	}
-
-	/**
-	 * @param mapValue
-	 * @return true if the given mapValue has been removed
-	 */
-	protected boolean handleRemoval(Object mapValue) {
-		Integer count = (Integer) valueCounts.get(mapValue);
-		if (count.intValue() <= 1) {
-			valueCounts.remove(mapValue);
-			return true;
-		}
-		valueCounts.put(mapValue, new Integer(count.intValue() - 1));
-		return false;
-	}
-
-	public synchronized void dispose() {
-		wrappedMap.removeMapChangeListener(mapChangeListener);
-		input.removeSetChangeListener(domainListener);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/ObservableSet.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/ObservableSet.java
deleted file mode 100644
index 721df8c..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/ObservableSet.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 208332
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * 
- * Abstract implementation of {@link IObservableSet}. 
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- * 
- */
-public abstract class ObservableSet extends AbstractObservable implements
-		IObservableSet {
-
-	protected Set wrappedSet;
-
-	private boolean stale = false;
-
-	protected Object elementType;
-
-	protected ObservableSet(Set wrappedSet, Object elementType) {
-		this(Realm.getDefault(), wrappedSet, elementType);
-	}
-
-	protected ObservableSet(Realm realm, Set wrappedSet, Object elementType) {
-		super(realm);
-		this.wrappedSet = wrappedSet;
-		this.elementType = elementType;
-	}
-	
-	public synchronized void addSetChangeListener(ISetChangeListener listener) {
-		addListener(SetChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeSetChangeListener(ISetChangeListener listener) {
-		removeListener(SetChangeEvent.TYPE, listener);
-	}
-
-	protected void fireSetChange(SetDiff diff) {
-		// fire general change event first
-		super.fireChange();
-
-		fireEvent(new SetChangeEvent(this, diff));
-	}
-	
-	public boolean contains(Object o) {
-		getterCalled();
-		return wrappedSet.contains(o);
-	}
-
-	public boolean containsAll(Collection c) {
-		getterCalled();
-		return wrappedSet.containsAll(c);
-	}
-
-	public boolean equals(Object o) {
-		getterCalled();
-		return wrappedSet.equals(o);
-	}
-
-	public int hashCode() {
-		getterCalled();
-		return wrappedSet.hashCode();
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		return wrappedSet.isEmpty();
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final Iterator wrappedIterator = wrappedSet.iterator();
-		return new Iterator() {
-
-			public void remove() {
-				throw new UnsupportedOperationException();
-			}
-
-			public boolean hasNext() {
-				ObservableTracker.getterCalled(ObservableSet.this);
-				return wrappedIterator.hasNext();
-			}
-
-			public Object next() {
-				ObservableTracker.getterCalled(ObservableSet.this);
-				return wrappedIterator.next();
-			}
-		};
-	}
-
-	public int size() {
-		getterCalled();
-		return wrappedSet.size();
-	}
-
-	public Object[] toArray() {
-		getterCalled();
-		return wrappedSet.toArray();
-	}
-
-	public Object[] toArray(Object[] a) {
-		getterCalled();
-		return wrappedSet.toArray(a);
-	}
-
-	public String toString() {
-		getterCalled();
-		return wrappedSet.toString();
-	}
-
-	protected void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean remove(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean removeAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean retainAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	/**
-	 * @return Returns the stale state.
-	 */
-	public boolean isStale() {
-		getterCalled();
-		return stale;
-	}
-
-	/**
-	 * @param stale
-	 *            The stale state to set. This will fire a stale event if the
-	 *            given boolean is true and this observable set was not already
-	 *            stale.
-	 */
-	public void setStale(boolean stale) {
-		checkRealm();
-		boolean wasStale = this.stale;
-		this.stale = stale;
-		if (!wasStale && stale) {
-			fireStale();
-		}
-	}
-
-	/**
-	 * @param wrappedSet The wrappedSet to set.
-	 */
-	protected void setWrappedSet(Set wrappedSet) {
-		this.wrappedSet = wrappedSet;
-	}
-
-	protected void fireChange() {
-		throw new RuntimeException("fireChange should not be called, use fireSetChange() instead"); //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.provisional.databinding.observable.AbstractObservable#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-	}
-	
-	public Object getElementType() {
-		return elementType;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/SetChangeEvent.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/SetChangeEvent.java
deleted file mode 100644
index 4873885..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/SetChangeEvent.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-import org.eclipse.core.databinding.observable.ObservableEvent;
-
-/**
- * List change event describing an incremental change of an
- * {@link IObservableSet} object.
- * 
- * @since 1.0
- * 
- */
-public class SetChangeEvent extends ObservableEvent {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 7436547103857482256L;
-	static final Object TYPE = new Object();
-
-	/**
-	 * Description of the change to the source observable set. Listeners must
-	 * not change this field.
-	 */
-	public SetDiff diff;
-
-	/**
-	 * Creates a new set change event.
-	 * 
-	 * @param source
-	 *            the source observable set
-	 * @param diff
-	 *            the set change
-	 */
-	public SetChangeEvent(IObservableSet source, SetDiff diff) {
-		super(source);
-		this.diff = diff;
-	}
-
-	/**
-	 * Returns the observable set from which this event originated.
-	 * 
-	 * @return the observable set from which this event originated
-	 */
-	public IObservableSet getObservableSet() {
-		return (IObservableSet) getSource();
-	}
-
-	protected void dispatch(IObservablesListener listener) {
-		((ISetChangeListener) listener).handleSetChange(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/SetDiff.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/SetDiff.java
deleted file mode 100644
index 6e677ad..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/SetDiff.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 251884
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.Set;
-
-/**
- * @since 1.0
- *
- */
-public abstract class SetDiff {
-	
-	/**
-	 * @return the set of added elements
-	 */
-	public abstract Set getAdditions();
-	
-	/**
-	 * @return the set of removed elements
-	 */
-	public abstract Set getRemovals();
-	
-	/**
-	 * Returns true if the diff has no added or removed elements.
-	 * 
-	 * @return true if the diff has no added or removed elements.
-	 * @since 1.2
-	 */
-	public boolean isEmpty() {
-		return getAdditions().isEmpty() && getRemovals().isEmpty();
-	}
-
-	/**
-	 * Applies the changes in this diff to the given set
-	 * 
-	 * @param set
-	 *            the set to which the diff will be applied
-	 * @since 1.2
-	 */
-	public void applyTo(Set set) {
-		set.addAll(getAdditions());
-		set.removeAll(getRemovals());
-	}
-
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer
-			.append(getClass().getName())
-			.append("{additions [") //$NON-NLS-1$
-			.append(getAdditions() != null ? getAdditions().toString() : "null") //$NON-NLS-1$
-			.append("], removals [") //$NON-NLS-1$
-			.append(getRemovals() != null ? getRemovals().toString() : "null") //$NON-NLS-1$
-			.append("]}"); //$NON-NLS-1$
-		
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/UnionSet.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/UnionSet.java
deleted file mode 100644
index 768c62d..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/UnionSet.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 208332
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.internal.databinding.observable.IStalenessConsumer;
-import org.eclipse.core.internal.databinding.observable.StalenessTracker;
-
-/**
- * Represents a set consisting of the union of elements from one or more other
- * sets. This object does not need to be explicitly disposed. If nobody is
- * listening to the UnionSet, the set will remove its listeners.
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- */
-public final class UnionSet extends ObservableSet {
-
-	/**
-	 * child sets
-	 */
-	private IObservableSet[] childSets;
-
-	private boolean stale = false;
-
-	/**
-	 * Map of elements onto Integer reference counts. This map is constructed
-	 * when the first listener is added to the union set. Null if nobody is
-	 * listening to the UnionSet.
-	 */
-	private HashMap refCounts = null;
-
-	private StalenessTracker stalenessTracker;
-
-	/**
-	 * @param childSets
-	 */
-	public UnionSet(IObservableSet[] childSets) {
-		super(childSets[0].getRealm(), null, childSets[0].getElementType());
-		System.arraycopy(childSets, 0, this.childSets = new IObservableSet[childSets.length], 0, childSets.length);
-		this.stalenessTracker = new StalenessTracker(childSets,
-				stalenessConsumer);
-	}
-
-	private ISetChangeListener childSetChangeListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			processAddsAndRemoves(event.diff.getAdditions(), event.diff.getRemovals());
-		}
-	};
-
-	private IStalenessConsumer stalenessConsumer = new IStalenessConsumer() {
-		public void setStale(boolean stale) {
-			boolean oldStale = UnionSet.this.stale;
-			UnionSet.this.stale = stale;
-			if (stale && !oldStale) {
-				fireStale();
-			}
-		}
-	};
-
-	public boolean isStale() {
-		getterCalled();
-		if (refCounts != null) {
-			return stale;
-		}
-
-		for (int i = 0; i < childSets.length; i++) {
-			IObservableSet childSet = childSets[i];
-
-			if (childSet.isStale()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private void processAddsAndRemoves(Set adds, Set removes) {
-		Set addsToFire = new HashSet();
-		Set removesToFire = new HashSet();
-
-		for (Iterator iter = adds.iterator(); iter.hasNext();) {
-			Object added = iter.next();
-
-			Integer refCount = (Integer) refCounts.get(added);
-			if (refCount == null) {
-				refCounts.put(added, new Integer(1));
-				addsToFire.add(added);
-			} else {
-				int refs = refCount.intValue();
-				refCount = new Integer(refs + 1);
-				refCounts.put(added, refCount);
-			}
-		}
-
-		for (Iterator iter = removes.iterator(); iter.hasNext();) {
-			Object removed = iter.next();
-
-			Integer refCount = (Integer) refCounts.get(removed);
-			if (refCount != null) {
-				int refs = refCount.intValue();
-				if (refs <= 1) {
-					removesToFire.add(removed);
-					refCounts.remove(removed);
-				} else {
-					refCount = new Integer(refCount.intValue() - 1);
-					refCounts.put(removed, refCount);
-				}
-			}
-		}
-
-		// just in case the removes overlapped with the adds
-		addsToFire.removeAll(removesToFire);
-
-		if (addsToFire.size() > 0 || removesToFire.size() > 0) {
-			fireSetChange(Diffs.createSetDiff(addsToFire, removesToFire));
-		}
-	}
-
-	protected void firstListenerAdded() {
-		super.firstListenerAdded();
-
-		refCounts = new HashMap();
-		for (int i = 0; i < childSets.length; i++) {
-			IObservableSet next = childSets[i];
-			next.addSetChangeListener(childSetChangeListener);
-			incrementRefCounts(next);
-		}
-		stalenessTracker = new StalenessTracker(childSets, stalenessConsumer);
-		setWrappedSet(refCounts.keySet());
-	}
-
-	protected void lastListenerRemoved() {
-		super.lastListenerRemoved();
-
-		for (int i = 0; i < childSets.length; i++) {
-			IObservableSet next = childSets[i];
-
-			next.removeSetChangeListener(childSetChangeListener);
-			stalenessTracker.removeObservable(next);
-		}
-		refCounts = null;
-		stalenessTracker = null;
-		setWrappedSet(null);
-	}
-
-	private ArrayList incrementRefCounts(Collection added) {
-		ArrayList adds = new ArrayList();
-
-		for (Iterator iter = added.iterator(); iter.hasNext();) {
-			Object next = iter.next();
-
-			Integer refCount = (Integer) refCounts.get(next);
-			if (refCount == null) {
-				adds.add(next);
-				refCount = new Integer(1);
-				refCounts.put(next, refCount);
-			} else {
-				refCount = new Integer(refCount.intValue() + 1);
-				refCounts.put(next, refCount);
-			}
-		}
-		return adds;
-	}
-
-	protected void getterCalled() {
-		super.getterCalled();
-		if (refCounts == null) {
-			// no listeners, recompute
-			setWrappedSet(computeElements());
-		}
-	}
-
-	private Set computeElements() {
-		// If there is no cached value, compute the union from scratch
-		if (refCounts == null) {
-			Set result = new HashSet();
-			for (int i = 0; i < childSets.length; i++) {
-				result.addAll(childSets[i]);
-			}
-			return result;
-		}
-
-		// Else there is a cached value. Return it.
-		return refCounts.keySet();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/WritableSet.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/WritableSet.java
deleted file mode 100644
index 52ded9d..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/WritableSet.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 147515
- *     Matthew Hall - bug 221351
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * Mutable (writable) implementation of {@link IObservableSet}.
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- */
-public class WritableSet extends ObservableSet {
-
-	/**
-	 * Constructs a new empty instance in the default realm with a
-	 * <code>null</code> element type.
-	 * 
-	 */
-	public WritableSet() {
-		this(Realm.getDefault());
-	}
-
-	/**
-	 * Constructs a new instance in the default realm containing the
-	 * elements of the given collection. Changes to the given collection after
-	 * calling this method do not affect the contents of the created WritableSet.
-	 * 
-	 * @param c
-	 * @param elementType
-	 *            can be <code>null</code>
-	 */
-	public WritableSet(Collection c, Object elementType) {
-		this(Realm.getDefault(), new HashSet(c), elementType);
-	}
-
-	/**
-	 * Constructs a new empty instance in the given realm and a
-	 * <code>null</code> element type.
-	 * 
-	 * @param realm
-	 */
-	public WritableSet(Realm realm) {
-		this(realm, new HashSet(), null);
-	}
-
-	/**
-	 * Constructs a new instance in the default realm with the given element
-	 * type, containing the elements of the given collection. Changes to the
-	 * given collection after calling this method do not affect the contents of
-	 * the created WritableSet.
-	 * 
-	 * @param realm
-	 * @param c
-	 * @param elementType
-	 *            can be <code>null</code>
-	 */
-	public WritableSet(Realm realm, Collection c, Object elementType) {
-		super(realm, new HashSet(c), elementType);
-		this.elementType = elementType;
-	}
-
-	public boolean add(Object o) {
-		getterCalled();
-		boolean added = wrappedSet.add(o);
-		if (added) {
-			fireSetChange(Diffs.createSetDiff(Collections.singleton(o), Collections.EMPTY_SET));
-		}
-		return added;
-	}
-
-	public boolean addAll(Collection c) {
-		getterCalled();
-		Set additions = new HashSet();
-		Iterator it = c.iterator();
-		while (it.hasNext()) {
-			Object element = it.next();
-			if (wrappedSet.add(element)) {
-				additions.add(element);
-			}
-		}
-		if (additions.size() > 0) {
-			fireSetChange(Diffs.createSetDiff(additions, Collections.EMPTY_SET));
-			return true;
-		}
-		return false;
-	}
-
-	public boolean remove(Object o) {
-		getterCalled();
-		boolean removed = wrappedSet.remove(o);
-		if (removed) {
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, Collections
-					.singleton(o)));
-		}
-		return removed;
-	}
-
-	public boolean removeAll(Collection c) {
-		getterCalled();
-		Set removes = new HashSet();
-		Iterator it = c.iterator();
-		while (it.hasNext()) {
-			Object element = it.next();
-			if (wrappedSet.remove(element)) {
-				removes.add(element);
-			}
-		}
-		if (removes.size() > 0) {
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removes));
-			return true;
-		}
-		return false;
-	}
-
-	public boolean retainAll(Collection c) {
-		getterCalled();
-		Set removes = new HashSet();
-		Iterator it = wrappedSet.iterator();
-		while (it.hasNext()) {
-			Object element = it.next();
-			if (!c.contains(element)) {
-				it.remove();
-				removes.add(element);
-			}
-		}
-		if (removes.size() > 0) {
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removes));
-			return true;
-		}
-		return false;
-	}
-
-	public void clear() {
-		getterCalled();
-		Set removes = new HashSet(wrappedSet);
-		wrappedSet.clear();
-		fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removes));
-	}
-
-	/**
-	 * @param elementType can be <code>null</code>
-	 * @return new instance with the default realm
-	 */
-	public static WritableSet withElementType(Object elementType) {
-		return new WritableSet(Realm.getDefault(), new HashSet(), elementType);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/package.html b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/package.html
deleted file mode 100644
index 5a57448..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/set/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes that can be used to observe changes in sets.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that can be used to observe changes in sets.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/AbstractObservableValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/AbstractObservableValue.java
deleted file mode 100644
index 1c61589..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/AbstractObservableValue.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Matthew Hall - bug 208332
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- * 
- */
-abstract public class AbstractObservableValue extends AbstractObservable implements IObservableValue {
-	/**
-	 * Constructs a new instance with the default realm.
-	 */
-	public AbstractObservableValue() {
-		this(Realm.getDefault());
-	}
-
-	/**
-	 * @param realm
-	 */
-	public AbstractObservableValue(Realm realm) {
-		super(realm);
-	}
-
-	public synchronized void addValueChangeListener(IValueChangeListener listener) {
-		addListener(ValueChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeValueChangeListener(IValueChangeListener listener) {
-		removeListener(ValueChangeEvent.TYPE, listener);
-	}
-
-	final public void setValue(Object value) {
-		checkRealm();
-		doSetValue(value);
-	}
-
-	/**
-	 * Template method for setting the value of the observable. By default the
-	 * method throws an {@link UnsupportedOperationException}.
-	 * 
-	 * @param value
-	 */
-	protected void doSetValue(Object value) {
-		throw new UnsupportedOperationException();
-	}
-
-	protected void fireValueChange(ValueDiff diff) {
-		// fire general change event first
-		super.fireChange();
-		fireEvent(new ValueChangeEvent(this, diff));
-	}
-
-	public final Object getValue() {
-		getterCalled();
-		return doGetValue();
-	}
-
-	abstract protected Object doGetValue();
-
-	public boolean isStale() {
-		getterCalled();
-		return false;
-	}
-
-	private void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	protected void fireChange() {
-		throw new RuntimeException(
-				"fireChange should not be called, use fireValueChange() instead"); //$NON-NLS-1$
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/AbstractVetoableValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/AbstractVetoableValue.java
deleted file mode 100644
index d3cff74..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/AbstractVetoableValue.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.internal.databinding.Util;
-
-/**
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- * 
- */
-public abstract class AbstractVetoableValue extends AbstractObservableValue
-		implements IVetoableValue {
-
-	/**
-	 * Creates a new vetoable value.
-	 */
-	public AbstractVetoableValue() {
-		this(Realm.getDefault());
-	}
-
-	/**
-	 * @param realm
-	 */
-	public AbstractVetoableValue(Realm realm) {
-		super(realm);
-	}
-
-	final protected void doSetValue(Object value) {
-		Object currentValue = doGetValue();
-		ValueDiff diff = Diffs.createValueDiff(currentValue, value);
-		boolean okToProceed = fireValueChanging(diff);
-		if (!okToProceed) {
-			throw new ChangeVetoException("Change not permitted"); //$NON-NLS-1$
-		}
-		doSetApprovedValue(value);
-		
-		if (!Util.equals(diff.getOldValue(), diff.getNewValue())) {
-			fireValueChange(diff);
-		}
-	}
-
-	/**
-	 * Sets the value. Invoked after performing veto checks.  Should not fire change events.
-	 * 
-	 * @param value
-	 */
-	protected abstract void doSetApprovedValue(Object value);
-
-	public synchronized void addValueChangingListener(
-			IValueChangingListener listener) {
-		addListener(ValueChangingEvent.TYPE, listener);
-	}
-
-	public synchronized void removeValueChangingListener(
-			IValueChangingListener listener) {
-		removeListener(ValueChangingEvent.TYPE, listener);
-	}
-
-	/**
-	 * Notifies listeners about a pending change, and returns true if no
-	 * listener vetoed the change.
-	 * 
-	 * @param diff
-	 * @return false if the change was vetoed, true otherwise
-	 */
-	protected boolean fireValueChanging(ValueDiff diff) {
-		checkRealm();
-
-		ValueChangingEvent event = new ValueChangingEvent(this, diff);
-		fireEvent(event);
-		return !event.veto;
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/ChangeVetoException.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/ChangeVetoException.java
deleted file mode 100644
index 3c9261f..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/ChangeVetoException.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.value;
-
-/**
- * @since 1.0
- *
- */
-public class ChangeVetoException extends RuntimeException {
-	
-	/**
-	 * @param string
-	 */
-	public ChangeVetoException(String string) {
-		super(string);
-	}
-
-	private static final long serialVersionUID = 1L;
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/ComputedValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/ComputedValue.java
deleted file mode 100644
index 755063a..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/ComputedValue.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *     Brad Reynolds - bug 147515
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-
-/**
- * A Lazily calculated value that automatically computes and registers listeners
- * on its dependencies as long as all of its dependencies are IObservable
- * objects
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- */
-public abstract class ComputedValue extends AbstractObservableValue {
-
-	private boolean dirty = true;
-
-	private boolean stale = false;
-
-	private Object cachedValue = null;
-
-	/**
-	 * Array of observables this computed value depends on. This field has a
-	 * value of <code>null</code> if we are not currently listening.
-	 */
-	private IObservable[] dependencies = null;
-
-	/**
-	 * 
-	 */
-	public ComputedValue() {
-		this(Realm.getDefault(), null);
-	}
-
-	/**
-	 * @param valueType
-	 *            can be <code>null</code>
-	 */
-	public ComputedValue(Object valueType) {
-		this(Realm.getDefault(), valueType);
-	}
-
-	/**
-	 * @param realm
-	 * 
-	 */
-	public ComputedValue(Realm realm) {
-		this(realm, null);
-	}
-
-	/**
-	 * @param realm
-	 * @param valueType
-	 */
-	public ComputedValue(Realm realm, Object valueType) {
-		super(realm);
-		this.valueType = valueType;
-	}
-
-	/**
-	 * Inner class that implements interfaces that we don't want to expose as
-	 * public API. Each interface could have been implemented using a separate
-	 * anonymous class, but we combine them here to reduce the memory overhead
-	 * and number of classes.
-	 * 
-	 * <p>
-	 * The Runnable calls computeValue and stores the result in cachedValue.
-	 * </p>
-	 * 
-	 * <p>
-	 * The IChangeListener stores each observable in the dependencies list. This
-	 * is registered as the listener when calling ObservableTracker, to detect
-	 * every observable that is used by computeValue.
-	 * </p>
-	 * 
-	 * <p>
-	 * The IChangeListener is attached to every dependency.
-	 * </p>
-	 * 
-	 */
-	private class PrivateInterface implements Runnable, IChangeListener,
-			IStaleListener {
-		public void run() {
-			cachedValue = calculate();
-		}
-
-		public void handleStale(StaleEvent event) {
-			if (!dirty && !stale) {
-				stale = true;
-				fireStale();
-			}
-		}
-
-		public void handleChange(ChangeEvent event) {
-			makeDirty();
-		}
-	}
-
-	private PrivateInterface privateInterface = new PrivateInterface();
-
-	private Object valueType;
-
-	protected final Object doGetValue() {
-		if (dirty) {
-			// This line will do the following:
-			// - Run the calculate method
-			// - While doing so, add any observable that is touched to the
-			// dependencies list
-			IObservable[] newDependencies = ObservableTracker.runAndMonitor(
-					privateInterface, privateInterface, null);
-
-			stale = false;
-			for (int i = 0; i < newDependencies.length; i++) {
-				IObservable observable = newDependencies[i];
-				// Add a change listener to the new dependency.
-				if (observable.isStale()) {
-					stale = true;
-				} else {
-					observable.addStaleListener(privateInterface);
-				}
-			}
-
-			dependencies = newDependencies;
-
-			dirty = false;
-		}
-
-		return cachedValue;
-	}
-
-	/**
-	 * Subclasses must override this method to provide the object's value.
-	 * 
-	 * @return the object's value
-	 */
-	protected abstract Object calculate();
-
-	protected final void makeDirty() {
-		if (!dirty) {
-			dirty = true;
-
-			stopListening();
-
-			// copy the old value
-			final Object oldValue = cachedValue;
-			// Fire the "dirty" event. This implementation recomputes the new
-			// value lazily.
-			fireValueChange(new ValueDiff() {
-
-				public Object getOldValue() {
-					return oldValue;
-				}
-
-				public Object getNewValue() {
-					return getValue();
-				}
-			});
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void stopListening() {
-		// Stop listening for dependency changes.
-		if (dependencies != null) {
-			for (int i = 0; i < dependencies.length; i++) {
-				IObservable observable = dependencies[i];
-
-				observable.removeChangeListener(privateInterface);
-				observable.removeStaleListener(privateInterface);
-			}
-			dependencies = null;
-		}
-	}
-
-	public boolean isStale() {
-		// we need to recompute, otherwise staleness wouldn't mean anything
-		getValue();
-		return stale;
-	}
-
-	public Object getValueType() {
-		return valueType;
-	}
-
-	// this method exists here so that we can call it from the runnable below.
-	/**
-	 * @since 1.1
-	 */
-	protected boolean hasListeners() {
-		return super.hasListeners();
-	}
-
-	public synchronized void addChangeListener(IChangeListener listener) {
-		super.addChangeListener(listener);
-		// If somebody is listening, we need to make sure we attach our own
-		// listeners
-		computeValueForListeners();
-	}
-
-	/**
-	 * Some clients just add a listener and expect to get notified even if they
-	 * never called getValue(), so we have to call getValue() ourselves here to
-	 * be sure. Need to be careful about realms though, this method can be
-	 * called outside of our realm. See also bug 198211. If a client calls this
-	 * outside of our realm, they may receive change notifications before the
-	 * runnable below has been executed. It is their job to figure out what to
-	 * do with those notifications.
-	 */
-	private void computeValueForListeners() {
-		getRealm().exec(new Runnable() {
-			public void run() {
-				if (dependencies == null) {
-					// We are not currently listening.
-					if (hasListeners()) {
-						// But someone is listening for changes. Call getValue()
-						// to make sure we start listening to the observables we
-						// depend on.
-						getValue();
-					}
-				}
-			}
-		});
-	}
-
-	public synchronized void addValueChangeListener(
-			IValueChangeListener listener) {
-		super.addValueChangeListener(listener);
-		// If somebody is listening, we need to make sure we attach our own
-		// listeners
-		computeValueForListeners();
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-		stopListening();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/DecoratingObservableValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/DecoratingObservableValue.java
deleted file mode 100644
index 6ab290f..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/DecoratingObservableValue.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237718)
- *     Matthew Hall - but 246626
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.DecoratingObservable;
-
-/**
- * An observable value which decorates another observable value.
- * 
- * @since 1.2
- */
-public class DecoratingObservableValue extends DecoratingObservable implements
-		IObservableValue {
-	private IObservableValue decorated;
-
-	private IValueChangeListener valueChangeListener;
-
-	/**
-	 * Constructs a DecoratingObservableValue which decorates the given
-	 * observable.
-	 * 
-	 * @param decorated
-	 *            the observable value being decorated
-	 * @param disposeDecoratedOnDispose 
-	 */
-	public DecoratingObservableValue(IObservableValue decorated,
-			boolean disposeDecoratedOnDispose) {
-		super(decorated, disposeDecoratedOnDispose);
-		this.decorated = decorated;
-	}
-
-	public synchronized void addValueChangeListener(
-			IValueChangeListener listener) {
-		addListener(ValueChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeValueChangeListener(
-			IValueChangeListener listener) {
-		removeListener(ValueChangeEvent.TYPE, listener);
-	}
-
-	protected void fireValueChange(ValueDiff diff) {
-		// fire general change event first
-		super.fireChange();
-		fireEvent(new ValueChangeEvent(this, diff));
-	}
-
-	protected void fireChange() {
-		throw new RuntimeException(
-				"fireChange should not be called, use fireValueChange() instead"); //$NON-NLS-1$
-	}
-
-	protected void firstListenerAdded() {
-		if (valueChangeListener == null) {
-			valueChangeListener = new IValueChangeListener() {
-				public void handleValueChange(ValueChangeEvent event) {
-					DecoratingObservableValue.this.handleValueChange(event);
-				}
-			};
-		}
-		decorated.addValueChangeListener(valueChangeListener);
-		super.firstListenerAdded();
-	}
-
-	protected void lastListenerRemoved() {
-		super.lastListenerRemoved();
-		if (valueChangeListener != null) {
-			decorated.removeValueChangeListener(valueChangeListener);
-			valueChangeListener = null;
-		}
-	}
-
-	/**
-	 * Called whenever a ValueChangeEvent is received from the decorated
-	 * observable. By default, this method fires the value change event again,
-	 * with the decorating observable as the event source. Subclasses may
-	 * override to provide different behavior.
-	 * 
-	 * @param event
-	 *            the change event received from the decorated observable
-	 */
-	protected void handleValueChange(final ValueChangeEvent event) {
-		fireValueChange(event.diff);
-	}
-
-	public Object getValue() {
-		getterCalled();
-		return decorated.getValue();
-	}
-
-	public void setValue(Object value) {
-		checkRealm();
-		decorated.setValue(value);
-	}
-
-	public Object getValueType() {
-		return decorated.getValueType();
-	}
-
-	public synchronized void dispose() {
-		if (decorated != null && valueChangeListener != null) {
-			decorated.removeValueChangeListener(valueChangeListener);
-		}
-		decorated = null;
-		valueChangeListener = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/IObservableValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/IObservableValue.java
deleted file mode 100644
index 820fa93..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/IObservableValue.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 237718
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * A value whose changes can be tracked by value change listeners.
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the classes that
- *              implement this interface. Note that direct implementers of this
- *              interface outside of the framework will be broken in future
- *              releases when methods are added to this interface.
- * 
- * @see AbstractObservableValue
- * 
- * @since 1.0
- */
-public interface IObservableValue extends IObservable {
-
-	/**
-	 * The value type of this observable value, or <code>null</code> if this
-	 * observable value is untyped.
-	 * 
-	 * @return the value type, or <code>null</null>
-	 */
-	public Object getValueType();
-
-	/**
-	 * Returns the value.  Must be invoked in the {@link Realm} of the observable.
-	 * 
-	 * @return the current value
-	 * @TrackedGetter
-	 */
-	public Object getValue();
-
-	/**
-	 * Sets the value.  Must be invoked in the {@link Realm} of the observable.
-	 * 
-	 * @param value
-	 *            the value to set
-	 * @throws UnsupportedOperationException
-	 *             if this observable value cannot be set.
-	 */
-	public void setValue(Object value);
-
-	/**
-	 * 
-	 * @param listener
-	 */
-	public void addValueChangeListener(IValueChangeListener listener);
-
-	/**
-	 * @param listener
-	 */
-	public void removeValueChangeListener(IValueChangeListener listener);
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/IValueChangeListener.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/IValueChangeListener.java
deleted file mode 100644
index 7af5382..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/IValueChangeListener.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-
-/**
- * Listener for changes to observable values.
- * 
- * @since 1.0
- * 
- */
-public interface IValueChangeListener extends IObservablesListener {
-
-	/**
-	 * Handles a change to an observable value. The given event object must only
-	 * be used locally in this method because it may be reused for other change
-	 * notifications. The diff object referenced by the event is immutable and
-	 * may be used non-locally.
-	 * 
-	 * @param event
-	 *            the event
-	 */
-	void handleValueChange(ValueChangeEvent event);
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/IValueChangingListener.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/IValueChangingListener.java
deleted file mode 100644
index ceb07b7..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/IValueChangingListener.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-
-/**
- * Listener for pre-change events for observable values.
- * 
- * @since 1.0
- * 
- */
-public interface IValueChangingListener extends IObservablesListener {
-
-	/**
-	 * This method is called when the value is about to change and provides an
-	 * opportunity to veto the change. The given event object must only be used
-	 * locally in this method because it may be reused for other change
-	 * notifications. The diff object referenced by the event is immutable and
-	 * may be used non-locally.
-	 * 
-	 * @param event
-	 */
-	public void handleValueChanging(ValueChangingEvent event);
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/IVetoableValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/IVetoableValue.java
deleted file mode 100644
index 1b795ed..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/IVetoableValue.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.value;
-
-/**
- * An observable value whose changes can be vetoed by listeners.
- * 
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the classes that
- *              implement this interface. Note that direct implementers of this
- *              interface outside of the framework will be broken in future
- *              releases when methods are added to this interface.
- * 
- * @since 1.0
- * 
- */
-public interface IVetoableValue extends IObservableValue {
-	
-	/**
-	 * @param listener
-	 */
-	public void addValueChangingListener(IValueChangingListener listener);
-	
-	/**
-	 * @param listener
-	 */
-	public void removeValueChangingListener(IValueChangingListener listener);
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/ValueChangeEvent.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/ValueChangeEvent.java
deleted file mode 100644
index 3d4fba9..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/ValueChangeEvent.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-import org.eclipse.core.databinding.observable.ObservableEvent;
-
-/**
- * Value change event describing a change of an {@link IObservableValue}
- * object's current value.
- * 
- * @since 1.0
- * 
- */
-public class ValueChangeEvent extends ObservableEvent {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 2305345286999701156L;
-
-	static final Object TYPE = new Object();
-
-	/**
-	 * Description of the change to the source observable value. Listeners must
-	 * not change this field.
-	 */
-	public ValueDiff diff;
-
-	/**
-	 * Creates a new value change event.
-	 * 
-	 * @param source
-	 *            the source observable value
-	 * @param diff
-	 *            the value change
-	 */
-	public ValueChangeEvent(IObservableValue source, ValueDiff diff) {
-		super(source);
-		this.diff = diff;
-	}
-
-	/**
-	 * Returns the observable value from which this event originated.
-	 * 
-	 * @return returns the observable value from which this event originated
-	 */
-	public IObservableValue getObservableValue() {
-		return (IObservableValue) source;
-	}
-
-	protected void dispatch(IObservablesListener listener) {
-		((IValueChangeListener) listener).handleValueChange(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/ValueChangingEvent.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/ValueChangingEvent.java
deleted file mode 100644
index f92cde7..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/ValueChangingEvent.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-import org.eclipse.core.databinding.observable.ObservableEvent;
-
-/**
- * Value changing event describing a pending change of an
- * {@link IObservableValue} object's current value. Listeners can veto the
- * pending change by setting {@link #veto} to <code>true</code>.
- * 
- * @since 1.0
- * 
- */
-public class ValueChangingEvent extends ObservableEvent {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 2305345286999701156L;
-
-	static final Object TYPE = new Object();
-
-	/**
-	 * Description of the change to the source observable value. Listeners must
-	 * not change this field.
-	 */
-	public ValueDiff diff;
-
-	/**
-	 * Flag for vetoing this change. Default value is <code>false</code>, can
-	 * be set to <code>true</code> by listeners to veto this change.
-	 */
-	public boolean veto = false;
-
-	/**
-	 * Creates a new value changing event.
-	 * 
-	 * @param source
-	 *            the source observable value
-	 * @param diff
-	 *            the value change
-	 */
-	public ValueChangingEvent(IObservableValue source, ValueDiff diff) {
-		super(source);
-		this.diff = diff;
-	}
-
-	/**
-	 * @return the observable value from which this event originated
-	 */
-	public IObservableValue getObservableValue() {
-		return (IObservableValue) source;
-	}
-
-	protected void dispatch(IObservablesListener listener) {
-		((IValueChangingListener) listener).handleValueChanging(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/ValueDiff.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/ValueDiff.java
deleted file mode 100644
index 62a2f86..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/ValueDiff.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.Diffs;
-
-/**
- * @since 1.0
- * 
- */
-public abstract class ValueDiff {
-	/**
-	 * Creates a value diff.
-	 */
-	public ValueDiff() {
-	}
-
-	/**
-	 * @return the old value
-	 */
-	public abstract Object getOldValue();
-
-	/**
-	 * @return the new value
-	 */
-	public abstract Object getNewValue();
-
-	public boolean equals(Object obj) {
-		if (obj instanceof ValueDiff) {
-			ValueDiff val = (ValueDiff) obj;
-
-			return Diffs.equals(val.getNewValue(), getNewValue())
-					&& Diffs.equals(val.getOldValue(), getOldValue());
-
-		}
-		return false;
-	}
-		
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		Object nv = getNewValue();
-		Object ov = getOldValue();
-		result = prime * result + ((nv == null) ? 0 : nv.hashCode());
-		result = prime * result + ((ov == null) ? 0 : ov.hashCode());
-		return result;
-	}
-
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer
-			.append(getClass().getName())
-			.append("{oldValue [") //$NON-NLS-1$
-			.append(getOldValue() != null ? getOldValue().toString() : "null") //$NON-NLS-1$
-			.append("], newValue [") //$NON-NLS-1$
-			.append(getNewValue() != null ? getNewValue().toString() : "null") //$NON-NLS-1$
-			.append("]}"); //$NON-NLS-1$
-		
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/WritableValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/WritableValue.java
deleted file mode 100644
index 5d794f1..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/WritableValue.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 158687
- *     Brad Reynolds - bug 164653, 147515
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * Mutable (writable) implementation of {@link IObservableValue} that will maintain a value and fire
- * change events when the value changes.
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- */
-public class WritableValue extends AbstractObservableValue {
-
-	private final Object valueType;
-
-	/**
-	 * Constructs a new instance with the default realm, a <code>null</code>
-	 * value type, and a <code>null</code> value.
-	 */
-	public WritableValue() {
-		this(null, null);
-	}
-
-	/**
-	 * Constructs a new instance with the default realm.
-	 * 
-	 * @param initialValue
-	 *            can be <code>null</code>
-	 * @param valueType
-	 *            can be <code>null</code>
-	 */
-	public WritableValue(Object initialValue, Object valueType) {
-		this(Realm.getDefault(), initialValue, valueType);
-	}
-
-	/**
-	 * Constructs a new instance with the provided <code>realm</code>, a
-	 * <code>null</code> value type, and a <code>null</code> initial value.
-	 * 
-	 * @param realm
-	 */
-	public WritableValue(Realm realm) {
-		this(realm, null, null);
-	}
-
-	/**
-	 * Constructs a new instance.
-	 * 
-	 * @param realm
-	 * @param initialValue
-	 *            can be <code>null</code>
-	 * @param valueType
-	 *            can be <code>null</code>
-	 */
-	public WritableValue(Realm realm, Object initialValue, Object valueType) {
-		super(realm);
-		this.valueType = valueType;
-		this.value = initialValue;
-	}
-
-	private Object value = null;
-
-	public Object doGetValue() {
-		return value;
-	}
-
-	/**
-	 * @param value
-	 *            The value to set.
-	 */
-	public void doSetValue(Object value) {
-        boolean changed = false;
-
-        if (this.value == null && value != null) {
-            changed = true;
-        } else if (this.value != null && !this.value.equals(value)) {
-            changed = true;
-        }
-
-        if (changed) {
-            fireValueChange(Diffs.createValueDiff(this.value, this.value = value));
-        }
-	}
-
-	public Object getValueType() {
-		return valueType;
-	}
-
-	/**
-	 * @param elementType can be <code>null</code>
-	 * @return new instance with the default realm and a value of <code>null</code>
-	 */
-	public static WritableValue withValueType(Object elementType) {
-		return new WritableValue(Realm.getDefault(), null, elementType);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/package.html b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/package.html
deleted file mode 100644
index 4ce13df..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes that can be used to observe changes in discrete values.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that can be used to observe changes in discrete values.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/util/ILogger.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/util/ILogger.java
deleted file mode 100644
index 652d719..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/util/ILogger.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Chris Gross (schtoo@schtoo.com) - initial API and implementation
- *       (bug 49497 [RCP] JFace dependency on org.eclipse.core.runtime enlarges standalone JFace applications)
- *******************************************************************************/
-
-package org.eclipse.core.databinding.util;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * A mechanism to log errors throughout JFace Data Binding.
- * <p>
- * Clients may provide their own implementation to change how errors are logged
- * from within JFace Data Binding.
- * </p>
- * 
- * @see Policy#getLog()
- * @see Policy#setLog(ILogger)
- * @since 1.1
- */
-public interface ILogger {
-
-	/**
-	 * Logs the given status.
-	 * 
-	 * @param status
-	 *            the status to log
-	 */
-	public void log(IStatus status);
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/util/Policy.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/util/Policy.java
deleted file mode 100644
index 41162da..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/util/Policy.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Chris Gross (schtoo@schtoo.com) - support for ILogger added
- *       (bug 49497 [RCP] JFace dependency on org.eclipse.core.runtime enlarges standalone JFace applications)
- *     Brad Reynolds - bug 164653
- *     Tom Schindl <tom.schindl@bestsolution.at> - bug 194587
- *******************************************************************************/
-package org.eclipse.core.databinding.util;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * The Policy class handles settings for behaviour, debug flags and logging
- * within JFace Data Binding.
- * 
- * @since 1.1
- */
-public class Policy {
-
-	/**
-	 * Constant for the the default setting for debug options.
-	 */
-	public static final boolean DEFAULT = false;
-
-	/**
-	 * The unique identifier of the JFace plug-in.
-	 */
-	public static final String JFACE_DATABINDING = "org.eclipse.core.databinding";//$NON-NLS-1$
-
-	private static ILogger log;
-
-	/**
-	 * Returns the dummy log to use if none has been set
-	 */
-	private static ILogger getDummyLog() {
-		return new ILogger() {
-			public void log(IStatus status) {
-				System.err.println(status.toString());
-				if( status.getException() != null ) {
-					status.getException().printStackTrace(System.err);
-				}
-			}
-		};
-	}
-
-	/**
-	 * Sets the logger used by JFace Data Binding to log errors.
-	 * 
-	 * @param logger
-	 *            the logger to use, or <code>null</code> to use the default
-	 *            logger
-	 */
-	public static synchronized void setLog(ILogger logger) {
-		log = logger;
-	}
-
-	/**
-	 * Returns the logger used by JFace Data Binding to log errors.
-	 * <p>
-	 * The default logger prints the status to <code>System.err</code>.
-	 * </p>
-	 * 
-	 * @return the logger
-	 */
-	public static synchronized ILogger getLog() {
-		if (log == null) {
-			log = getDummyLog();
-		}
-		return log;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/util/package.html b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/util/package.html
deleted file mode 100644
index 0b186a7..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/util/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides general utilities for data binding.
-<h2>
-Package Specification</h2>
-<p>
-This package provides general utilities for data binding.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ConstantObservableValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ConstantObservableValue.java
deleted file mode 100644
index e631f2f..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ConstantObservableValue.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007-2008 Matt Carter and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matt Carter - initial API and implementation (bug 212518)
- *     Matthew Hall - bug 212518, 146397
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * An immutable {@link IObservableValue}.
- * 
- * @see WritableValue
- */
-public class ConstantObservableValue implements IObservableValue {
-	final Realm realm;
-	final Object value;
-	final Object type;
-
-	/**
-	 * Construct a constant value of the given type, in the default realm.
-	 * 
-	 * @param value
-	 *            immutable value
-	 * @param type
-	 *            type
-	 */
-	public ConstantObservableValue(Object value, Object type) {
-		this(Realm.getDefault(), value, type);
-	}
-
-	/**
-	 * Construct a constant value of the given type, in the given realm.
-	 * 
-	 * @param realm
-	 *            Realm
-	 * @param value
-	 *            immutable value
-	 * @param type
-	 *            type
-	 */
-	public ConstantObservableValue(Realm realm, Object value, Object type) {
-		Assert.isNotNull(realm, "Realm cannot be null"); //$NON-NLS-1$
-		this.realm = realm;
-		this.value = value;
-		this.type = type;
-	}
-
-	public Object getValueType() {
-		return type;
-	}
-
-	public Object getValue() {
-		ObservableTracker.getterCalled(this);
-		return value;
-	}
-
-	public void setValue(Object value) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void addValueChangeListener(IValueChangeListener listener) {
-		// ignore
-	}
-
-	public void removeValueChangeListener(IValueChangeListener listener) {
-		// ignore
-	}
-
-	public void addChangeListener(IChangeListener listener) {
-		// ignore
-	}
-
-	public void addDisposeListener(IDisposeListener listener) {
-		// ignore
-	}
-
-	public void addStaleListener(IStaleListener listener) {
-		// ignore
-	}
-
-	public boolean isDisposed() {
-		return false;
-	}
-
-	public void dispose() {
-		// nothing to dispose
-	}
-
-	public Realm getRealm() {
-		return realm;
-	}
-
-	public boolean isStale() {
-		return false;
-	}
-
-	public void removeChangeListener(IChangeListener listener) {
-		// ignore
-	}
-
-	public void removeDisposeListener(IDisposeListener listener) {
-		// ignore
-	}
-
-	public void removeStaleListener(IStaleListener listener) {
-		// ignore
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/DelayedObservableValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/DelayedObservableValue.java
deleted file mode 100644
index 24ff3e9..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/DelayedObservableValue.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Matthew Hall - initial API and implementation (bug 180746)
- * 		Boris Bokowski, IBM - initial API and implementation
- * 		Matthew Hall - bugs 212223, 208332, 245647
- *  	Will Horn - bug 215297
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.IVetoableValue;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.databinding.observable.value.ValueChangingEvent;
-import org.eclipse.core.databinding.observable.value.ValueDiff;
-import org.eclipse.core.internal.databinding.Util;
-
-/**
- * {@link IObservableValue} implementation that wraps an
- * {@link IObservableValue} and delays notification of value change events from
- * the wrapped observable value until a certain time has passed since the last
- * change event. This class helps to boost performance in bindings (both in
- * validation and in event firing) when the observed value is rapidly changing.
- * A common use of this class is to delay validation until the user stops typing
- * in an UI field. To notify about pending changes, a DelayedObservableValue
- * fires a stale event when the wrapped observable value fires a change event,
- * and remains stale as long as a value change is pending.
- * 
- * Note that this class will not forward {@link ValueChangingEvent} events from
- * a wrapped {@link IVetoableValue}.
- * 
- * @since 1.2
- */
-public class DelayedObservableValue extends AbstractObservableValue implements
-		IStaleListener, IValueChangeListener {
-	class ValueUpdater implements Runnable {
-		private final Object oldValue;
-
-		boolean cancel = false;
-		boolean running = false;
-
-		ValueUpdater(Object oldValue) {
-			this.oldValue = oldValue;
-		}
-
-		void cancel() {
-			cancel = true;
-		}
-
-		public void run() {
-			if (!cancel)
-				try {
-					running = true;
-					internalFireValueChange(oldValue);
-				} finally {
-					running = false;
-				}
-		}
-	}
-
-	private final int delay;
-	private IObservableValue observable;
-
-	private boolean dirty = true;
-	private Object cachedValue = null;
-
-	private boolean updating = false;
-
-	private ValueUpdater updater = null;
-
-	/**
-	 * Constructs a new instance bound to the given
-	 * <code>ISWTObservableValue</code> and configured to fire change events
-	 * once there have been no value changes in the observable for
-	 * <code>delay</code> milliseconds.
-	 * 
-	 * @param delayMillis
-	 * @param observable
-	 * @throws IllegalArgumentException
-	 *             if <code>updateEventType</code> is an incorrect type.
-	 */
-	public DelayedObservableValue(int delayMillis, IObservableValue observable) {
-		super(observable.getRealm());
-		this.delay = delayMillis;
-		this.observable = observable;
-
-		observable.addValueChangeListener(this);
-		observable.addStaleListener(this);
-
-		cachedValue = doGetValue();
-	}
-
-	public void handleValueChange(ValueChangeEvent event) {
-		if (!updating)
-			makeDirty();
-	}
-
-	public void handleStale(StaleEvent staleEvent) {
-		if (!updating)
-			fireStale();
-	}
-
-	protected Object doGetValue() {
-		if (dirty) {
-			cachedValue = observable.getValue();
-			dirty = false;
-
-			if (updater != null && !updater.running) {
-				fireValueChange(Diffs.createValueDiff(updater.oldValue,
-						cachedValue));
-				cancelScheduledUpdate();
-			}
-		}
-		return cachedValue;
-	}
-
-	protected void doSetValue(Object value) {
-		updating = true;
-		try {
-			// Principle of least surprise: setValue overrides any pending
-			// update from observable.
-			dirty = false;
-			cancelScheduledUpdate();
-
-			Object oldValue = cachedValue;
-			observable.setValue(value);
-			// Bug 215297 - target observable could veto or override value
-			// passed to setValue(). Make sure we cache whatever is set.
-			cachedValue = observable.getValue();
-
-			if (!Util.equals(oldValue, cachedValue))
-				fireValueChange(Diffs.createValueDiff(oldValue, cachedValue));
-		} finally {
-			updating = false;
-		}
-	}
-
-	public boolean isStale() {
-		ObservableTracker.getterCalled(this);
-		return (dirty && updater != null) || observable.isStale();
-	}
-
-	/**
-	 * Returns the type of the value from {@link #doGetValue()}, i.e.
-	 * String.class
-	 * 
-	 * @see org.eclipse.core.databinding.observable.value.IObservableValue#getValueType()
-	 */
-	public Object getValueType() {
-		return observable.getValueType();
-	}
-
-	public synchronized void dispose() {
-		cancelScheduledUpdate();
-		if (observable != null) {
-			observable.dispose();
-			observable = null;
-		}
-		super.dispose();
-	}
-
-	private void makeDirty() {
-		if (!dirty) {
-			dirty = true;
-			fireStale();
-		}
-		cancelScheduledUpdate(); // if any
-		scheduleUpdate();
-	}
-
-	private void cancelScheduledUpdate() {
-		if (updater != null) {
-			updater.cancel();
-			updater = null;
-		}
-	}
-
-	private void scheduleUpdate() {
-		updater = new ValueUpdater(cachedValue);
-		getRealm().timerExec(delay, updater);
-	}
-
-	private void internalFireValueChange(final Object oldValue) {
-		cancelScheduledUpdate();
-		fireValueChange(new ValueDiff() {
-			public Object getOldValue() {
-				return oldValue;
-			}
-
-			public Object getNewValue() {
-				return getValue();
-			}
-		});
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/EmptyObservableList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/EmptyObservableList.java
deleted file mode 100644
index 6d854e0..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/EmptyObservableList.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bugs 208858, 208332, 146397
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * Singleton empty list
- */
-public class EmptyObservableList implements IObservableList {
-
-	private static final List emptyList = Collections.EMPTY_LIST;
-
-	private Realm realm;
-	private Object elementType;
-
-	/**
-	 * Creates an empty list. This list may be disposed multiple times
-	 * without any side-effects.
-	 * 
-	 * @param realm
-	 *            the realm of the constructed list
-	 */
-	public EmptyObservableList(Realm realm) {
-		this(realm, null);
-	}
-
-	/**
-	 * Creates an empty list. This list may be disposed multiple times
-	 * without any side-effects.
-	 * 
-	 * @param realm
-	 *            the realm of the constructed list
-	 * @param elementType
-	 *            the element type of the constructed list
-	 * @since 1.1
-	 */
-	public EmptyObservableList(Realm realm, Object elementType) {
-		this.realm = realm;
-		this.elementType = elementType;
-	}
-
-	public void addListChangeListener(IListChangeListener listener) {
-		// ignore
-	}
-
-	public void removeListChangeListener(IListChangeListener listener) {
-		// ignore
-	}
-
-	public Object getElementType() {
-		return elementType;
-	}
-
-	public int size() {
-		checkRealm();
-		return 0;
-	}
-
-	void checkRealm() {
-		Assert.isTrue(realm.isCurrent(),
-				"Observable cannot be accessed outside its realm"); //$NON-NLS-1$
-	}
-
-	public boolean isEmpty() {
-		checkRealm();
-		return true;
-	}
-
-	public boolean contains(Object o) {
-		checkRealm();
-		return false;
-	}
-
-	public Iterator iterator() {
-		checkRealm();
-		return emptyList.iterator();
-	}
-
-	public Object[] toArray() {
-		checkRealm();
-		return emptyList.toArray();
-	}
-
-	public Object[] toArray(Object[] a) {
-		return emptyList.toArray(a);
-	}
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean remove(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean containsAll(Collection c) {
-		checkRealm();
-		return c.isEmpty();
-	}
-
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean retainAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean removeAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	public void addChangeListener(IChangeListener listener) {
-	}
-
-	public void removeChangeListener(IChangeListener listener) {
-	}
-
-	public void addStaleListener(IStaleListener listener) {
-	}
-
-	public void removeStaleListener(IStaleListener listener) {
-	}
-
-	public void addDisposeListener(IDisposeListener listener) {
-	}
-
-	public void removeDisposeListener(IDisposeListener listener) {
-	}
-
-	public boolean isStale() {
-		checkRealm();
-		return false;
-	}
-
-	public boolean isDisposed() {
-		return false;
-	}
-
-	public void dispose() {
-	}
-
-	public boolean addAll(int index, Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Object get(int index) {
-		return emptyList.get(index);
-	}
-
-	public int indexOf(Object o) {
-		return -1;
-	}
-
-	public int lastIndexOf(Object o) {
-		return -1;
-	}
-
-	public ListIterator listIterator() {
-		return emptyList.listIterator();
-	}
-
-	public ListIterator listIterator(int index) {
-		return emptyList.listIterator(index);
-	}
-
-	public Object remove(int index) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Object set(int index, Object element) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Object move(int oldIndex, int newIndex) {
-		throw new UnsupportedOperationException();
-	}
-
-	public List subList(int fromIndex, int toIndex) {
-		return emptyList.subList(fromIndex, toIndex);
-	}
-
-	public void add(int index, Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Realm getRealm() {
-		return realm;
-	}
-
-	public boolean equals(Object obj) {
-		checkRealm();
-		if (obj == this)
-			return true;
-		if (obj == null)
-			return false;
-		if (!(obj instanceof List))
-			return false;
-
-		return ((List) obj).isEmpty();
-	}
-
-	public int hashCode() {
-		checkRealm();
-		return 1;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/EmptyObservableSet.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/EmptyObservableSet.java
deleted file mode 100644
index 26cb0b8..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/EmptyObservableSet.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bugs 208332, 146397
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * Singleton empty set
- */
-public class EmptyObservableSet implements IObservableSet {
-
-	private static final Set emptySet = Collections.EMPTY_SET;
-
-	private Realm realm;
-	private Object elementType;
-
-	/**
-	 * Creates a singleton empty set. This set may be disposed multiple times
-	 * without any side-effects.
-	 * 
-	 * @param realm
-	 *            the realm of the constructed set
-	 */
-	public EmptyObservableSet(Realm realm) {
-		this(realm, null);
-	}
-
-	/**
-	 * Creates a singleton empty set. This set may be disposed multiple times
-	 * without any side-effects.
-	 * 
-	 * @param realm
-	 *            the realm of the constructed set
-	 * @param elementType
-	 *            the element type of the constructed set
-	 * @since 1.1
-	 */
-	public EmptyObservableSet(Realm realm, Object elementType) {
-		this.realm = realm;
-		this.elementType = elementType;
-	}
-
-	public void addSetChangeListener(ISetChangeListener listener) {
-	}
-
-	public void removeSetChangeListener(ISetChangeListener listener) {
-	}
-
-	public Object getElementType() {
-		return elementType;
-	}
-
-	public int size() {
-		checkRealm();
-		return 0;
-	}
-
-	private void checkRealm() {
-		Assert.isTrue(realm.isCurrent(),
-				"Observable cannot be accessed outside its realm"); //$NON-NLS-1$
-	}
-
-	public boolean isEmpty() {
-		checkRealm();
-		return true;
-	}
-
-	public boolean contains(Object o) {
-		checkRealm();
-		return false;
-	}
-
-	public Iterator iterator() {
-		checkRealm();
-		return emptySet.iterator();
-	}
-
-	public Object[] toArray() {
-		checkRealm();
-		return emptySet.toArray();
-	}
-
-	public Object[] toArray(Object[] a) {
-		return emptySet.toArray(a);
-	}
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean remove(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean containsAll(Collection c) {
-		checkRealm();
-		return c.isEmpty();
-	}
-
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean retainAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean removeAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	public void addChangeListener(IChangeListener listener) {
-	}
-
-	public void removeChangeListener(IChangeListener listener) {
-	}
-
-	public void addStaleListener(IStaleListener listener) {
-	}
-
-	public void removeStaleListener(IStaleListener listener) {
-	}
-
-	public void addDisposeListener(IDisposeListener listener) {
-	}
-
-	public void removeDisposeListener(IDisposeListener listener) {
-	}
-
-	public boolean isStale() {
-		checkRealm();
-		return false;
-	}
-
-	public boolean isDisposed() {
-		return false;
-	}
-
-	public void dispose() {
-	}
-
-	public Realm getRealm() {
-		return realm;
-	}
-
-	public boolean equals(Object obj) {
-		checkRealm();
-		if (obj == this)
-			return true;
-		if (obj == null)
-			return false;
-		if (!(obj instanceof Set))
-			return false;
-
-		return ((Set) obj).isEmpty();
-	}
-
-	public int hashCode() {
-		checkRealm();
-		return 0;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/IStalenessConsumer.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/IStalenessConsumer.java
deleted file mode 100644
index cfe5c61..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/IStalenessConsumer.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-/**
- * @since 1.0
- * 
- */
-public interface IStalenessConsumer {
-	/**
-	 * @param stale
-	 * 
-	 */
-	public void setStale(boolean stale);
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/MapEntryObservableValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/MapEntryObservableValue.java
deleted file mode 100644
index 3340eb6..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/MapEntryObservableValue.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Marko Topolnik and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Marko Topolnik - initial API and implementation (bug 184830)
- *     Matthew Hall - bug 184830
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.map.MapChangeEvent;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-
-/**
- * An {@link IObservableValue} that tracks the value of an entry in an
- * {@link IObservableMap}, identified by the entry's key.
- * 
- * @since 1.1
- */
-public class MapEntryObservableValue extends AbstractObservableValue {
-	private IObservableMap map;
-	private Object key;
-	private Object valueType;
-
-	private IMapChangeListener changeListener = new IMapChangeListener() {
-		public void handleMapChange(final MapChangeEvent event) {
-			if (event.diff.getAddedKeys().contains(key)) {
-				final Object newValue = event.diff.getNewValue(key);
-				if (newValue != null) {
-					fireValueChange(Diffs.createValueDiff(null, newValue));
-				}
-			} else if (event.diff.getChangedKeys().contains(key)) {
-				fireValueChange(Diffs.createValueDiff(event.diff
-						.getOldValue(key), event.diff.getNewValue(key)));
-			} else if (event.diff.getRemovedKeys().contains(key)) {
-				final Object oldValue = event.diff.getOldValue(key);
-				if (oldValue != null) {
-					fireValueChange(Diffs.createValueDiff(oldValue, null));
-				}
-			}
-		}
-	};
-
-	private IStaleListener staleListener = new IStaleListener() {
-		public void handleStale(StaleEvent staleEvent) {
-			fireStale();
-		}
-	};
-
-	/**
-	 * Creates a map entry observable.
-	 * 
-	 * @param map
-	 *            the observable map whose entry will be tracked
-	 * @param key
-	 *            the key identifying the entry whose value will be tracked
-	 * @param valueType
-	 *            the type of the value
-	 */
-	public MapEntryObservableValue(IObservableMap map, Object key,
-			Object valueType) {
-		super(map.getRealm());
-		this.map = map;
-		this.key = key;
-		this.valueType = valueType;
-
-		map.addMapChangeListener(changeListener);
-		map.addStaleListener(staleListener);
-	}
-
-	public Object getValueType() {
-		return this.valueType;
-	}
-
-	public boolean isStale() {
-		ObservableTracker.getterCalled(this);
-		return map.isStale();
-	}
-
-	public synchronized void dispose() {
-		if (map != null) {
-			map.removeMapChangeListener(changeListener);
-			map.removeStaleListener(staleListener);
-			map = null;
-			changeListener = null;
-			staleListener = null;
-		}
-		super.dispose();
-	}
-
-	protected Object doGetValue() {
-		return this.map.get(this.key);
-	}
-
-	protected void doSetValue(Object value) {
-		this.map.put(this.key, value);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/StalenessObservableValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/StalenessObservableValue.java
deleted file mode 100644
index 6a07fad..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/StalenessObservableValue.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Boris Bokowski, IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 212468
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-
-/**
- * An observable value that tracks the staleness of an {@link IObservable}.
- * 
- * @since 1.1
- */
-public class StalenessObservableValue extends AbstractObservableValue {
-
-	private class MyListener implements IChangeListener, IStaleListener {
-		public void handleChange(ChangeEvent event) {
-			if (stale && !event.getObservable().isStale()) {
-				stale = false;
-				fireValueChange(Diffs.createValueDiff(Boolean.TRUE,
-						Boolean.FALSE));
-			}
-		}
-
-		public void handleStale(StaleEvent staleEvent) {
-			if (!stale) {
-				stale = true;
-				fireValueChange(Diffs.createValueDiff(Boolean.FALSE,
-						Boolean.TRUE));
-			}
-		}
-	}
-
-	private IObservable tracked;
-	private boolean stale;
-	private MyListener listener = new MyListener();
-
-	/**
-	 * Constructs a StalenessObservableValue that tracks the staleness of the
-	 * given {@link IObservable}.
-	 * 
-	 * @param observable
-	 *            the observable to track
-	 */
-	public StalenessObservableValue(IObservable observable) {
-		super(observable.getRealm());
-		this.tracked = observable;
-		this.stale = observable.isStale();
-		tracked.addChangeListener(listener);
-		tracked.addStaleListener(listener);
-	}
-
-	protected Object doGetValue() {
-		return tracked.isStale() ? Boolean.TRUE : Boolean.FALSE;
-	}
-
-	public Object getValueType() {
-		return Boolean.TYPE;
-	}
-
-	public synchronized void dispose() {
-		if (tracked != null) {
-			tracked.removeChangeListener(listener);
-			tracked.removeStaleListener(listener);
-			tracked = null;
-			listener = null;
-		}
-		super.dispose();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/StalenessTracker.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/StalenessTracker.java
deleted file mode 100644
index 6324325..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/StalenessTracker.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.internal.databinding.IdentityWrapper;
-
-/**
- * @since 1.0
- * 
- */
-public class StalenessTracker {
-
-	private Map staleMap = new HashMap();
-
-	private int staleCount = 0;
-
-	private final IStalenessConsumer stalenessConsumer;
-
-	private class ChildListener implements IStaleListener, IChangeListener {
-		public void handleStale(StaleEvent event) {
-			processStalenessChange((IObservable) event.getSource(), true);
-		}
-
-		public void handleChange(ChangeEvent event) {
-			processStalenessChange((IObservable) event.getSource(), true);
-		}
-	}
-
-	private ChildListener childListener = new ChildListener();
-
-	/**
-	 * @param observables
-	 * @param stalenessConsumer 
-	 */
-	public StalenessTracker(IObservable[] observables,
-			IStalenessConsumer stalenessConsumer) {
-		this.stalenessConsumer = stalenessConsumer;
-		for (int i = 0; i < observables.length; i++) {
-			IObservable observable = observables[i];
-			doAddObservable(observable, false);
-		}
-		stalenessConsumer.setStale(staleCount > 0);
-	}
-
-	/**
-	 * @param child
-	 * @param callback
-	 */
-	public void processStalenessChange(IObservable child, boolean callback) {
-		boolean oldStale = staleCount > 0;
-		IdentityWrapper wrappedChild = new IdentityWrapper(child);
-		boolean oldChildStale = getOldChildStale(wrappedChild);
-		boolean newChildStale = child.isStale();
-		if (oldChildStale != newChildStale) {
-			if (oldChildStale) {
-				staleCount--;
-			} else {
-				staleCount++;
-			}
-			staleMap.put(wrappedChild, newChildStale ? Boolean.TRUE : Boolean.FALSE);
-		}
-		boolean newStale = staleCount > 0;
-		if (callback && (newStale != oldStale)) {
-			stalenessConsumer.setStale(newStale);
-		}
-	}
-
-	/**
-	 * @param wrappedChild
-	 */
-	private boolean getOldChildStale(IdentityWrapper wrappedChild) {
-		Object oldChildValue = staleMap.get(wrappedChild);
-		boolean oldChildStale = oldChildValue == null ? false
-				: ((Boolean) oldChildValue).booleanValue();
-		return oldChildStale;
-	}
-
-	/**
-	 * @param observable
-	 */
-	public void addObservable(IObservable observable) {
-		doAddObservable(observable, true);
-	}
-
-	private void doAddObservable(IObservable observable, boolean callback) {
-		processStalenessChange(observable, callback);
-		observable.addChangeListener(childListener);
-		observable.addStaleListener(childListener);
-	}
-
-	/**
-	 * @param observable
-	 */
-	public void removeObservable(IObservable observable) {
-		boolean oldStale = staleCount > 0;
-		IdentityWrapper wrappedChild = new IdentityWrapper(observable);
-		boolean oldChildStale = getOldChildStale(wrappedChild);
-		if (oldChildStale) {
-			staleCount--;
-		}
-		staleMap.remove(wrappedChild);
-		observable.removeChangeListener(childListener);
-		observable.removeStaleListener(childListener);
-		boolean newStale = staleCount > 0;
-		if (newStale != oldStale) {
-			stalenessConsumer.setStale(newStale);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableList.java
deleted file mode 100644
index 6a11d68..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableList.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 Cerner Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 208332, 237718
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.databinding.observable.list.DecoratingObservableList;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-
-/**
- * ObservableList implementation that prevents modification by consumers. Events
- * in the originating wrapped list are propagated and thrown from this instance
- * when appropriate.  All mutators throw an UnsupportedOperationException.
- * 
- * @since 1.0
- */
-public class UnmodifiableObservableList extends DecoratingObservableList {
-	private List unmodifiableList;
-
-	/**
-	 * @param decorated
-	 */
-	public UnmodifiableObservableList(IObservableList decorated) {
-		super(decorated, false);
-		this.unmodifiableList = Collections.unmodifiableList(decorated);
-	}
-
-	public void add(int index, Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean addAll(int index, Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		return unmodifiableList.iterator();
-	}
-
-	public ListIterator listIterator() {
-		return listIterator(0);
-	}
-
-	public ListIterator listIterator(int index) {
-		getterCalled();
-		return unmodifiableList.listIterator(index);
-	}
-
-	public Object move(int oldIndex, int newIndex) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Object remove(int index) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean remove(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean removeAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean retainAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Object set(int index, Object element) {
-		throw new UnsupportedOperationException();
-	}
-
-	public List subList(int fromIndex, int toIndex) {
-		getterCalled();
-		return unmodifiableList.subList(fromIndex, toIndex);
-	}
-
-	public synchronized void dispose() {
-		unmodifiableList = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableMap.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableMap.java
deleted file mode 100644
index ac6beb2..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableMap.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - bug 237718
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.map.DecoratingObservableMap;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-
-/**
- * IObservableMap implementation that prevents modification by consumers. Events
- * in the originating wrapped map are propagated and thrown from this instance
- * when appropriate. All mutators throw an UnsupportedOperationException.
- * 
- * @since 1.0
- */
-public class UnmodifiableObservableMap extends DecoratingObservableMap {
-	Map unmodifiableMap;
-
-	/**
-	 * @param decorated
-	 */
-	public UnmodifiableObservableMap(IObservableMap decorated) {
-		super(decorated, false);
-		this.unmodifiableMap = Collections.unmodifiableMap(decorated);
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	public Set entrySet() {
-		getterCalled();
-		return unmodifiableMap.entrySet();
-	}
-
-	public Set keySet() {
-		getterCalled();
-		return unmodifiableMap.keySet();
-	}
-
-	public Object put(Object key, Object value) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void putAll(Map m) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Object remove(Object key) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Collection values() {
-		getterCalled();
-		return unmodifiableMap.values();
-	}
-
-	public synchronized void dispose() {
-		unmodifiableMap = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableSet.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableSet.java
deleted file mode 100644
index 70df43c..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableSet.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 208332)
- *     Brad Reynolds - initial API and implementation
- *         (through UnmodifiableObservableList.java)
- *     Matthew Hall - bug 237718
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.set.DecoratingObservableSet;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-
-/**
- * ObservableList implementation that prevents modification by consumers. Events
- * in the originating wrapped list are propagated and thrown from this instance
- * when appropriate. All mutators throw an UnsupportedOperationException.
- * 
- * @since 1.1
- */
-public class UnmodifiableObservableSet extends DecoratingObservableSet {
-	private Set unmodifiableSet;
-
-	/**
-	 * @param decorated
-	 */
-	public UnmodifiableObservableSet(IObservableSet decorated) {
-		super(decorated, false);
-
-		this.unmodifiableSet = Collections.unmodifiableSet(decorated);
-	}
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		return unmodifiableSet.iterator();
-	}
-
-	public boolean remove(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean removeAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean retainAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public synchronized void dispose() {
-		unmodifiableSet = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableValue.java
deleted file mode 100644
index ae7ed17..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableValue.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 219909)
- *     Matthew Hall - bugs 237884, 237718
- *     Ovidio Mallo - bug 237163
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.value.DecoratingObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-
-/**
- * An unmodifiable wrapper class for IObservableValue instances.
- * @since 1.1
- */
-public class UnmodifiableObservableValue extends DecoratingObservableValue {
-	/**
-	 * Constructs an UnmodifiableObservableValue which wraps the given
-	 * observable value
-	 * 
-	 * @param wrappedValue
-	 *            the observable value to wrap in an unmodifiable instance.
-	 */
-	public UnmodifiableObservableValue(IObservableValue wrappedValue) {
-		super(wrappedValue, false);
-	}
-
-	public void setValue(Object value) {
-		throw new UnsupportedOperationException();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableList.java
deleted file mode 100644
index c1fa461..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableList.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 218269)
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiff;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.databinding.observable.list.ListDiffVisitor;
-import org.eclipse.core.databinding.observable.list.ObservableList;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * @since 3.3
- * 
- */
-public class ValidatedObservableList extends ObservableList {
-	private IObservableList target;
-	private IObservableValue validationStatus;
-
-	// Only true when out of sync with target due to validation status
-	private boolean stale;
-
-	// True when validaton status changes from invalid to valid.
-	private boolean computeNextDiff = false;
-
-	private boolean updatingTarget = false;
-
-	private IListChangeListener targetChangeListener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			if (updatingTarget)
-				return;
-			IStatus status = (IStatus) validationStatus.getValue();
-			if (isValid(status)) {
-				if (stale) {
-					// this.stale means we are out of sync with target,
-					// so reset wrapped list to exactly mirror target
-					stale = false;
-					updateWrappedList(new ArrayList(target));
-				} else {
-					ListDiff diff = event.diff;
-					if (computeNextDiff) {
-						diff = Diffs.computeListDiff(wrappedList, target);
-						computeNextDiff = false;
-					}
-					applyDiff(diff, wrappedList);
-					fireListChange(diff);
-				}
-			} else {
-				makeStale();
-			}
-		}
-	};
-
-	private static boolean isValid(IStatus status) {
-		return status.isOK() || status.matches(IStatus.INFO | IStatus.WARNING);
-	}
-
-	private IStaleListener targetStaleListener = new IStaleListener() {
-		public void handleStale(StaleEvent staleEvent) {
-			fireStale();
-		}
-	};
-
-	private IValueChangeListener validationStatusChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			IStatus oldStatus = (IStatus) event.diff.getOldValue();
-			IStatus newStatus = (IStatus) event.diff.getNewValue();
-			if (stale && !isValid(oldStatus) && isValid(newStatus)) {
-				// this.stale means we are out of sync with target,
-				// reset wrapped list to exactly mirror target
-				stale = false;
-				updateWrappedList(new ArrayList(target));
-
-				// If the validation status becomes valid because of a change in
-				// target observable
-				computeNextDiff = true;
-			}
-		}
-	};
-
-	/**
-	 * @param target
-	 * @param validationStatus
-	 */
-	public ValidatedObservableList(final IObservableList target,
-			final IObservableValue validationStatus) {
-		super(target.getRealm(), new ArrayList(target), target.getElementType());
-		Assert.isNotNull(validationStatus,
-				"Validation status observable cannot be null"); //$NON-NLS-1$
-		Assert
-				.isTrue(target.getRealm().equals(validationStatus.getRealm()),
-						"Target and validation status observables must be on the same realm"); //$NON-NLS-1$
-		this.target = target;
-		this.validationStatus = validationStatus;
-		target.addListChangeListener(targetChangeListener);
-		target.addStaleListener(targetStaleListener);
-		validationStatus.addValueChangeListener(validationStatusChangeListener);
-	}
-
-	private void makeStale() {
-		if (!stale) {
-			stale = true;
-			fireStale();
-		}
-	}
-
-	private void updateTargetList(ListDiff diff) {
-		updatingTarget = true;
-		try {
-			if (stale) {
-				stale = false;
-				applyDiff(Diffs.computeListDiff(target, wrappedList), target);
-			} else {
-				applyDiff(diff, target);
-			}
-		} finally {
-			updatingTarget = false;
-		}
-	}
-
-	private void applyDiff(ListDiff diff, final List list) {
-		diff.accept(new ListDiffVisitor() {
-			public void handleAdd(int index, Object element) {
-				list.add(index, element);
-			}
-
-			public void handleRemove(int index, Object element) {
-				list.remove(index);
-			}
-
-			public void handleReplace(int index, Object oldElement,
-					Object newElement) {
-				list.set(index, newElement);
-			}
-		});
-	}
-
-	public boolean isStale() {
-		ObservableTracker.getterCalled(this);
-		return stale || target.isStale();
-	}
-
-	public void add(int index, Object element) {
-		checkRealm();
-		wrappedList.add(index, element);
-		ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				true, element));
-		updateTargetList(diff);
-		fireListChange(diff);
-	}
-
-	public boolean add(Object o) {
-		checkRealm();
-		add(wrappedList.size(), o);
-		return true;
-	}
-
-	public boolean addAll(Collection c) {
-		checkRealm();
-		return addAll(wrappedList.size(), c);
-	}
-
-	public boolean addAll(int index, Collection c) {
-		checkRealm();
-		Object[] elements = c.toArray();
-		ListDiffEntry[] entries = new ListDiffEntry[elements.length];
-		for (int i = 0; i < elements.length; i++) {
-			wrappedList.add(index + i, elements[i]);
-			entries[i] = Diffs
-					.createListDiffEntry(index + i, true, elements[i]);
-		}
-		ListDiff diff = Diffs.createListDiff(entries);
-		updateTargetList(diff);
-		fireListChange(diff);
-		return true;
-	}
-
-	public void clear() {
-		checkRealm();
-		if (isEmpty())
-			return;
-		ListDiff diff = Diffs.computeListDiff(wrappedList,
-				Collections.EMPTY_LIST);
-		wrappedList.clear();
-		updateTargetList(diff);
-		fireListChange(diff);
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final ListIterator wrappedIterator = wrappedList.listIterator();
-		return new Iterator() {
-			Object last = null;
-
-			public boolean hasNext() {
-				return wrappedIterator.hasNext();
-			}
-
-			public Object next() {
-				return last = wrappedIterator.next();
-			}
-
-			public void remove() {
-				int index = wrappedIterator.previousIndex();
-				wrappedIterator.remove();
-				ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(
-						index, false, last));
-				updateTargetList(diff);
-				fireListChange(diff);
-			}
-		};
-	}
-
-	public ListIterator listIterator() {
-		return listIterator(0);
-	}
-
-	public ListIterator listIterator(int index) {
-		getterCalled();
-		final ListIterator wrappedIterator = wrappedList.listIterator(index);
-		return new ListIterator() {
-			int lastIndex = -1;
-			Object last = null;
-
-			public void add(Object o) {
-				wrappedIterator.add(o);
-				lastIndex = previousIndex();
-				ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(
-						lastIndex, true, o));
-				updateTargetList(diff);
-				fireListChange(diff);
-			}
-
-			public boolean hasNext() {
-				return wrappedIterator.hasNext();
-			}
-
-			public boolean hasPrevious() {
-				return wrappedIterator.hasPrevious();
-			}
-
-			public Object next() {
-				last = wrappedIterator.next();
-				lastIndex = previousIndex();
-				return last;
-			}
-
-			public int nextIndex() {
-				return wrappedIterator.nextIndex();
-			}
-
-			public Object previous() {
-				last = wrappedIterator.previous();
-				lastIndex = nextIndex();
-				return last;
-			}
-
-			public int previousIndex() {
-				return wrappedIterator.previousIndex();
-			}
-
-			public void remove() {
-				wrappedIterator.remove();
-				ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(
-						lastIndex, false, last));
-				lastIndex = -1;
-				updateTargetList(diff);
-				fireListChange(diff);
-			}
-
-			public void set(Object o) {
-				wrappedIterator.set(o);
-				ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(
-						lastIndex, false, last), Diffs.createListDiffEntry(
-						lastIndex, true, o));
-				last = o;
-				updateTargetList(diff);
-				fireListChange(diff);
-			}
-		};
-	}
-
-	public Object move(int oldIndex, int newIndex) {
-		checkRealm();
-		int size = wrappedList.size();
-		if (oldIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"oldIndex: " + oldIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		if (newIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"newIndex: " + newIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		if (oldIndex == newIndex)
-			return wrappedList.get(oldIndex);
-		Object element = wrappedList.remove(oldIndex);
-		wrappedList.add(newIndex, element);
-		ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(
-				oldIndex, false, element), Diffs.createListDiffEntry(newIndex,
-				true, element));
-		updateTargetList(diff);
-		fireListChange(diff);
-		return element;
-	}
-
-	public Object remove(int index) {
-		checkRealm();
-		Object element = wrappedList.remove(index);
-		ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				false, element));
-		updateTargetList(diff);
-		fireListChange(diff);
-		return element;
-	}
-
-	public boolean remove(Object o) {
-		checkRealm();
-		int index = wrappedList.indexOf(o);
-		if (index == -1)
-			return false;
-		remove(index);
-		return true;
-	}
-
-	public boolean removeAll(Collection c) {
-		checkRealm();
-		List list = new ArrayList(wrappedList);
-		boolean changed = list.removeAll(c);
-		if (changed) {
-			ListDiff diff = Diffs.computeListDiff(wrappedList, list);
-			wrappedList = list;
-			updateTargetList(diff);
-			fireListChange(diff);
-		}
-		return changed;
-	}
-
-	public boolean retainAll(Collection c) {
-		checkRealm();
-		List list = new ArrayList(wrappedList);
-		boolean changed = list.retainAll(c);
-		if (changed) {
-			ListDiff diff = Diffs.computeListDiff(wrappedList, list);
-			wrappedList = list;
-			updateTargetList(diff);
-			fireListChange(diff);
-		}
-		return changed;
-	}
-
-	public Object set(int index, Object element) {
-		checkRealm();
-		Object oldElement = wrappedList.set(index, element);
-		ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				false, oldElement), Diffs.createListDiffEntry(index, true,
-				element));
-		updateTargetList(diff);
-		fireListChange(diff);
-		return oldElement;
-	}
-
-	public synchronized void dispose() {
-		target.removeListChangeListener(targetChangeListener);
-		target.removeStaleListener(targetStaleListener);
-		validationStatus
-				.removeValueChangeListener(validationStatusChangeListener);
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableMap.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableMap.java
deleted file mode 100644
index 4026527..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableMap.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 218269)
- *     Matthew Hall - bug 226289
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.map.MapChangeEvent;
-import org.eclipse.core.databinding.observable.map.MapDiff;
-import org.eclipse.core.databinding.observable.map.ObservableMap;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * @since 3.3
- * 
- */
-public class ValidatedObservableMap extends ObservableMap {
-	private IObservableMap target;
-	private IObservableValue validationStatus;
-
-	// Only true when out of sync with target due to validation status
-	private boolean stale;
-
-	// True when validation status changes from invalid to valid.
-	private boolean computeNextDiff = false;
-
-	private boolean updatingTarget = false;
-
-	private IMapChangeListener targetChangeListener = new IMapChangeListener() {
-		public void handleMapChange(MapChangeEvent event) {
-			if (updatingTarget)
-				return;
-			IStatus status = (IStatus) validationStatus.getValue();
-			if (isValid(status)) {
-				if (stale) {
-					// this.stale means we are out of sync with target,
-					// so reset wrapped list to exactly mirror target
-					stale = false;
-					updateWrappedMap(new HashMap(target));
-				} else {
-					MapDiff diff = event.diff;
-					if (computeNextDiff) {
-						diff = Diffs.computeMapDiff(wrappedMap, target);
-						computeNextDiff = false;
-					}
-					applyDiff(diff, wrappedMap);
-					fireMapChange(diff);
-				}
-			} else {
-				makeStale();
-			}
-		}
-	};
-
-	private IStaleListener targetStaleListener = new IStaleListener() {
-		public void handleStale(StaleEvent staleEvent) {
-			fireStale();
-		}
-	};
-
-	private IValueChangeListener validationStatusChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			IStatus oldStatus = (IStatus) event.diff.getOldValue();
-			IStatus newStatus = (IStatus) event.diff.getNewValue();
-			if (stale && !isValid(oldStatus) && isValid(newStatus)) {
-				// this.stale means we are out of sync with target,
-				// reset wrapped map to exactly mirror target
-				stale = false;
-				updateWrappedMap(new HashMap(target));
-
-				// If the validation status becomes valid because of a change in
-				// target observable
-				computeNextDiff = true;
-			}
-		}
-	};
-
-	/**
-	 * @param target
-	 * @param validationStatus
-	 */
-	public ValidatedObservableMap(final IObservableMap target,
-			final IObservableValue validationStatus) {
-		super(target.getRealm(), new HashMap(target));
-		Assert.isNotNull(validationStatus,
-				"Validation status observable cannot be null"); //$NON-NLS-1$
-		Assert
-				.isTrue(target.getRealm().equals(validationStatus.getRealm()),
-						"Target and validation status observables must be on the same realm"); //$NON-NLS-1$
-		this.target = target;
-		this.validationStatus = validationStatus;
-		target.addMapChangeListener(targetChangeListener);
-		target.addStaleListener(targetStaleListener);
-		validationStatus.addValueChangeListener(validationStatusChangeListener);
-	}
-
-	private void updateWrappedMap(Map newMap) {
-		Map oldMap = wrappedMap;
-		MapDiff diff = Diffs.computeMapDiff(oldMap, newMap);
-		wrappedMap = newMap;
-		fireMapChange(diff);
-	}
-
-	private static boolean isValid(IStatus status) {
-		return status.isOK() || status.matches(IStatus.INFO | IStatus.WARNING);
-	}
-
-	private void applyDiff(MapDiff diff, Map map) {
-		for (Iterator iterator = diff.getRemovedKeys().iterator(); iterator
-				.hasNext();)
-			map.remove(iterator.next());
-		for (Iterator iterator = diff.getChangedKeys().iterator(); iterator
-				.hasNext();) {
-			Object key = iterator.next();
-			map.put(key, diff.getNewValue(key));
-		}
-		for (Iterator iterator = diff.getAddedKeys().iterator(); iterator
-				.hasNext();) {
-			Object key = iterator.next();
-			map.put(key, diff.getNewValue(key));
-		}
-	}
-
-	private void makeStale() {
-		if (!stale) {
-			stale = true;
-			fireStale();
-		}
-	}
-
-	private void updateTargetMap(MapDiff diff) {
-		updatingTarget = true;
-		try {
-			if (stale) {
-				stale = false;
-				applyDiff(Diffs.computeMapDiff(target, wrappedMap), target);
-			} else {
-				applyDiff(diff, target);
-			}
-		} finally {
-			updatingTarget = false;
-		}
-	}
-
-	public boolean isStale() {
-		getterCalled();
-		return stale || target.isStale();
-	}
-
-	public void clear() {
-		checkRealm();
-		if (isEmpty())
-			return;
-		MapDiff diff = Diffs.computeMapDiff(wrappedMap, Collections.EMPTY_MAP);
-		wrappedMap = new HashMap();
-		updateTargetMap(diff);
-		fireMapChange(diff);
-	}
-
-	public Object put(Object key, Object value) {
-		checkRealm();
-		MapDiff diff;
-		Object oldValue;
-		if (wrappedMap.containsKey(key)) {
-			oldValue = wrappedMap.put(key, value);
-			if (wrappedMap.containsKey(key)) { // Changed
-				diff = Diffs.createMapDiffSingleChange(key, oldValue, value);
-			} else { // Removed
-				diff = Diffs.createMapDiffSingleRemove(key, oldValue);
-			}
-		} else { // Added
-			oldValue = wrappedMap.put(key, value);
-			diff = Diffs.createMapDiffSingleAdd(key, value);
-		}
-		updateTargetMap(diff);
-		fireMapChange(diff);
-		return oldValue;
-	}
-
-	public void putAll(Map m) {
-		checkRealm();
-		Map map = new HashMap(wrappedMap);
-		map.putAll(m);
-		MapDiff diff = Diffs.computeMapDiff(wrappedMap, map);
-		wrappedMap = map;
-		updateTargetMap(diff);
-		fireMapChange(diff);
-	}
-
-	public Object remove(Object key) {
-		checkRealm();
-		if (!wrappedMap.containsKey(key))
-			return null;
-		Object oldValue = wrappedMap.remove(key);
-		MapDiff diff = Diffs.createMapDiffSingleRemove(key, oldValue);
-		updateTargetMap(diff);
-		fireMapChange(diff);
-		return oldValue;
-	}
-
-	public Object getKeyType() {
-		return target.getKeyType();
-	}
-
-	public Object getValueType() {
-		return target.getValueType();
-	}
-
-	public synchronized void dispose() {
-		target.removeMapChangeListener(targetChangeListener);
-		target.removeStaleListener(targetStaleListener);
-		validationStatus
-				.removeValueChangeListener(validationStatusChangeListener);
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableSet.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableSet.java
deleted file mode 100644
index bb7c6e6..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableSet.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 218269)
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.ObservableSet;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-import org.eclipse.core.databinding.observable.set.SetDiff;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * @since 3.3
- * 
- */
-public class ValidatedObservableSet extends ObservableSet {
-	private IObservableSet target;
-	private IObservableValue validationStatus;
-
-	// Only true when out of sync with target due to validation status
-	private boolean stale;
-
-	// True when validation status changes from invalid to valid.
-	private boolean computeNextDiff = false;
-
-	private boolean updatingTarget = false;
-
-	private ISetChangeListener targetChangeListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			if (updatingTarget)
-				return;
-			IStatus status = (IStatus) validationStatus.getValue();
-			if (isValid(status)) {
-				if (stale) {
-					// this.stale means we are out of sync with target,
-					// so reset wrapped list to exactly mirror target
-					stale = false;
-					updateWrappedSet(new HashSet(target));
-				} else {
-					SetDiff diff = event.diff;
-					if (computeNextDiff) {
-						diff = Diffs.computeSetDiff(wrappedSet, target);
-						computeNextDiff = false;
-					}
-					applyDiff(diff, wrappedSet);
-					fireSetChange(diff);
-				}
-			} else {
-				makeStale();
-			}
-		}
-	};
-
-	private IStaleListener targetStaleListener = new IStaleListener() {
-		public void handleStale(StaleEvent staleEvent) {
-			fireStale();
-		}
-	};
-
-	private IValueChangeListener validationStatusChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			IStatus oldStatus = (IStatus) event.diff.getOldValue();
-			IStatus newStatus = (IStatus) event.diff.getNewValue();
-			if (stale && !isValid(oldStatus) && isValid(newStatus)) {
-				// this.stale means we are out of sync with target,
-				// reset wrapped set to exactly mirror target
-				stale = false;
-				updateWrappedSet(new HashSet(target));
-
-				// If the validation status becomes valid because of a change in
-				// target observable
-				computeNextDiff = true;
-			}
-		}
-	};
-
-	/**
-	 * @param target
-	 * @param validationStatus
-	 */
-	public ValidatedObservableSet(final IObservableSet target,
-			final IObservableValue validationStatus) {
-		super(target.getRealm(), new HashSet(target), target.getElementType());
-		Assert.isNotNull(validationStatus,
-				"Validation status observable cannot be null"); //$NON-NLS-1$
-		Assert
-				.isTrue(target.getRealm().equals(validationStatus.getRealm()),
-						"Target and validation status observables must be on the same realm"); //$NON-NLS-1$
-		this.target = target;
-		this.validationStatus = validationStatus;
-		target.addSetChangeListener(targetChangeListener);
-		target.addStaleListener(targetStaleListener);
-		validationStatus.addValueChangeListener(validationStatusChangeListener);
-	}
-
-	private void updateWrappedSet(Set newSet) {
-		Set oldSet = wrappedSet;
-		SetDiff diff = Diffs.computeSetDiff(oldSet, newSet);
-		wrappedSet = newSet;
-		fireSetChange(diff);
-	}
-
-	private static boolean isValid(IStatus status) {
-		return status.isOK() || status.matches(IStatus.INFO | IStatus.WARNING);
-	}
-
-	private void applyDiff(SetDiff diff, Set set) {
-		for (Iterator iterator = diff.getRemovals().iterator(); iterator
-				.hasNext();) {
-			set.remove(iterator.next());
-		}
-		for (Iterator iterator = diff.getAdditions().iterator(); iterator
-				.hasNext();) {
-			set.add(iterator.next());
-		}
-	}
-
-	private void makeStale() {
-		if (!stale) {
-			stale = true;
-			fireStale();
-		}
-	}
-
-	private void updateTargetSet(SetDiff diff) {
-		updatingTarget = true;
-		try {
-			if (stale) {
-				stale = false;
-				applyDiff(Diffs.computeSetDiff(target, wrappedSet), target);
-			} else {
-				applyDiff(diff, target);
-			}
-		} finally {
-			updatingTarget = false;
-		}
-	}
-
-	public boolean isStale() {
-		getterCalled();
-		return stale || target.isStale();
-	}
-
-	public boolean add(Object o) {
-		getterCalled();
-		boolean changed = wrappedSet.add(o);
-		if (changed) {
-			SetDiff diff = Diffs.createSetDiff(Collections.singleton(o),
-					Collections.EMPTY_SET);
-			updateTargetSet(diff);
-			fireSetChange(diff);
-		}
-		return changed;
-	}
-
-	public boolean addAll(Collection c) {
-		getterCalled();
-		HashSet set = new HashSet(wrappedSet);
-		boolean changed = set.addAll(c);
-		if (changed) {
-			SetDiff diff = Diffs.computeSetDiff(wrappedSet, set);
-			wrappedSet = set;
-			updateTargetSet(diff);
-			fireSetChange(diff);
-		}
-		return changed;
-	}
-
-	public void clear() {
-		getterCalled();
-		if (isEmpty())
-			return;
-		SetDiff diff = Diffs.createSetDiff(Collections.EMPTY_SET, wrappedSet);
-		wrappedSet = new HashSet();
-		updateTargetSet(diff);
-		fireSetChange(diff);
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final Iterator wrappedIterator = wrappedSet.iterator();
-		return new Iterator() {
-			Object last = null;
-
-			public boolean hasNext() {
-				return wrappedIterator.hasNext();
-			}
-
-			public Object next() {
-				return last = wrappedIterator.next();
-			}
-
-			public void remove() {
-				wrappedIterator.remove();
-				SetDiff diff = Diffs.createSetDiff(Collections.EMPTY_SET,
-						Collections.singleton(last));
-				updateTargetSet(diff);
-				fireSetChange(diff);
-			}
-		};
-	}
-
-	public boolean remove(Object o) {
-		getterCalled();
-		boolean changed = wrappedSet.remove(o);
-		if (changed) {
-			SetDiff diff = Diffs.createSetDiff(Collections.EMPTY_SET,
-					Collections.singleton(o));
-			updateTargetSet(diff);
-			fireSetChange(diff);
-		}
-		return changed;
-	}
-
-	public boolean removeAll(Collection c) {
-		getterCalled();
-		Set set = new HashSet(wrappedSet);
-		boolean changed = set.removeAll(c);
-		if (changed) {
-			SetDiff diff = Diffs.computeSetDiff(wrappedSet, set);
-			wrappedSet = set;
-			updateTargetSet(diff);
-			fireSetChange(diff);
-		}
-		return changed;
-	}
-
-	public boolean retainAll(Collection c) {
-		getterCalled();
-		Set set = new HashSet(wrappedSet);
-		boolean changed = set.retainAll(c);
-		if (changed) {
-			SetDiff diff = Diffs.computeSetDiff(wrappedSet, set);
-			wrappedSet = set;
-			updateTargetSet(diff);
-			fireSetChange(diff);
-		}
-		return changed;
-	}
-
-	public synchronized void dispose() {
-		target.removeSetChangeListener(targetChangeListener);
-		target.removeStaleListener(targetStaleListener);
-		validationStatus
-				.removeValueChangeListener(validationStatusChangeListener);
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableValue.java
deleted file mode 100644
index 1164f53..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableValue.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 218269)
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.IVetoableValue;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.databinding.observable.value.ValueChangingEvent;
-import org.eclipse.core.internal.databinding.Util;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * An {@link IObservableValue} wrapper that stays in sync with the target
- * observable as long as a given validation status is valid.
- * <ul>
- * <li>While status is valid, ValidatedObservableValue stays in sync with its
- * target.
- * <li>When status becomes invalid, ValidatedObservableValue will retain the
- * last valid value of its target.
- * <li>While status is invalid, changes in the target observable cause
- * ValidatedObservableValue to fire a stale event, to indicate that changes are
- * pending.
- * <li>When status becomes valid, pending value changes are performed (if any)
- * and synchronization resumes.
- * </ul>
- * <p>
- * Note:
- * <ul>
- * <li>By default, a status is valid if its
- * {@link IStatus#getSeverity() severity} is {@link IStatus#OK OK},
- * {@link IStatus#INFO INFO}, or {@link IStatus#WARNING WARNING}
- * <li>Calls to {@link #setValue(Object)} on the validated observable changes
- * the value regardless of the validation status.
- * <li>This class will not forward {@link ValueChangingEvent} events from a
- * wrapped {@link IVetoableValue}.
- * </ul>
- * 
- * @since 1.2
- */
-public class ValidatedObservableValue extends AbstractObservableValue {
-	private IObservableValue target;
-	private IObservableValue validationStatus;
-
-	private Object cachedValue;
-	private boolean stale;
-	private boolean updatingTarget = false;
-
-	private IValueChangeListener targetChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			if (updatingTarget)
-				return;
-			IStatus status = (IStatus) validationStatus.getValue();
-			if (isValid(status))
-				internalSetValue(event.diff.getNewValue(), false);
-			else
-				makeStale();
-		}
-	};
-
-	private static boolean isValid(IStatus status) {
-		return status.isOK() || status.matches(IStatus.INFO | IStatus.WARNING);
-	}
-
-	private IStaleListener targetStaleListener = new IStaleListener() {
-		public void handleStale(StaleEvent staleEvent) {
-			fireStale();
-		}
-	};
-
-	private IValueChangeListener validationStatusChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			IStatus oldStatus = (IStatus) event.diff.getOldValue();
-			IStatus newStatus = (IStatus) event.diff.getNewValue();
-			if (stale && !isValid(oldStatus) && isValid(newStatus)) {
-				internalSetValue(target.getValue(), false);
-			}
-		}
-	};
-
-	/**
-	 * Constructs an observable value
-	 * 
-	 * @param target
-	 *            the observable value to be wrapped
-	 * @param validationStatus
-	 *            an observable value of type {@link IStatus}.class which
-	 *            contains the current validation status
-	 */
-	public ValidatedObservableValue(IObservableValue target,
-			IObservableValue validationStatus) {
-		super(target.getRealm());
-		Assert.isNotNull(validationStatus,
-				"Validation status observable cannot be null"); //$NON-NLS-1$
-		Assert
-				.isTrue(target.getRealm().equals(validationStatus.getRealm()),
-						"Target and validation status observables must be on the same realm"); //$NON-NLS-1$
-		this.target = target;
-		this.validationStatus = validationStatus;
-		this.cachedValue = target.getValue();
-
-		target.addValueChangeListener(targetChangeListener);
-		target.addStaleListener(targetStaleListener);
-		validationStatus.addValueChangeListener(validationStatusChangeListener);
-	}
-
-	private void makeStale() {
-		if (!stale) {
-			stale = true;
-			fireStale();
-		}
-	}
-
-	public boolean isStale() {
-		ObservableTracker.getterCalled(this);
-		return stale || target.isStale();
-	}
-
-	protected Object doGetValue() {
-		return cachedValue;
-	}
-
-	private void internalSetValue(Object value, boolean updateTarget) {
-		Object oldValue = cachedValue;
-		cachedValue = value;
-		if (updateTarget) {
-			updatingTarget = true;
-			try {
-				target.setValue(value);
-				cachedValue = target.getValue();
-			} finally {
-				updatingTarget = false;
-			}
-		}
-		stale = false;
-		if (!Util.equals(oldValue, cachedValue))
-			fireValueChange(Diffs.createValueDiff(oldValue, cachedValue));
-	}
-
-	protected void doSetValue(Object value) {
-		internalSetValue(value, true);
-	}
-
-	public Object getValueType() {
-		return target.getValueType();
-	}
-
-	public synchronized void dispose() {
-		target.removeValueChangeListener(targetChangeListener);
-		target.removeStaleListener(targetStaleListener);
-		validationStatus
-				.removeValueChangeListener(validationStatusChangeListener);
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableHelper.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableHelper.java
deleted file mode 100644
index 69f8ebd..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableHelper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 246782)
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.masterdetail;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.internal.databinding.Util;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/* package */class DetailObservableHelper {
-	/* package */static void warnIfDifferentRealms(Realm detailRealm,
-			Realm innerObservableRealm) {
-		if (!Util.equals(detailRealm, innerObservableRealm)) {
-			Throwable throwable = new Throwable();
-			throwable.fillInStackTrace();
-			String message = "Inner observable realm (" + innerObservableRealm //$NON-NLS-1$
-					+ ") not equal to detail realm (" //$NON-NLS-1$
-					+ detailRealm + ")"; //$NON-NLS-1$
-			Policy.getLog().log(
-					new Status(IStatus.WARNING, Policy.JFACE_DATABINDING,
-							message, throwable));
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableList.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableList.java
deleted file mode 100755
index 8d0598c..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableList.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 147515
- *     Matthew Hall - bug 221351, 247875, 246782
- *     Ovidio Mallo - bug 241318
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.masterdetail;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObserving;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ObservableList;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * @since 3.2
- * 
- */
-
-public class DetailObservableList extends ObservableList implements IObserving {
-
-	private boolean updating = false;
-
-	private IListChangeListener innerChangeListener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			if (!updating) {
-				fireListChange(event.diff);
-			}
-		}
-	};
-
-	private Object currentOuterValue;
-
-	private IObservableList innerObservableList;
-
-	private IObservableFactory factory;
-
-	private IObservableValue outerObservableValue;
-
-	private Object detailType;
-
-	/**
-	 * @param factory
-	 * @param outerObservableValue
-	 * @param detailType
-	 */
-	public DetailObservableList(IObservableFactory factory,
-			IObservableValue outerObservableValue, Object detailType) {
-		super(outerObservableValue.getRealm(), Collections.EMPTY_LIST, detailType);
-		this.factory = factory;
-		this.outerObservableValue = outerObservableValue;
-		this.detailType = detailType;
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				updateInnerObservableList();
-			}
-		});
-		outerObservableValue.addValueChangeListener(outerChangeListener);
-	}
-
-	IValueChangeListener outerChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			ObservableTracker.runAndIgnore(new Runnable() {
-				public void run() {
-					List oldList = new ArrayList(wrappedList);
-					updateInnerObservableList();
-					fireListChange(Diffs.computeListDiff(oldList, wrappedList));
-				}
-			});
-		}
-	};
-
-	private void updateInnerObservableList() {
-		if (innerObservableList != null) {
-			innerObservableList.removeListChangeListener(innerChangeListener);
-			innerObservableList.dispose();
-		}
-		currentOuterValue = outerObservableValue.getValue();
-		if (currentOuterValue == null) {
-			innerObservableList = null;
-			wrappedList = Collections.EMPTY_LIST;
-		} else {
-			this.innerObservableList = (IObservableList) factory
-					.createObservable(currentOuterValue);
-			DetailObservableHelper.warnIfDifferentRealms(getRealm(),
-					innerObservableList.getRealm());
-			wrappedList = innerObservableList;
-
-			if (detailType != null) {
-				Object innerValueType = innerObservableList.getElementType();
-				Assert.isTrue(getElementType().equals(innerValueType),
-						"Cannot change value type in a nested observable list"); //$NON-NLS-1$
-			}
-			innerObservableList.addListChangeListener(innerChangeListener);
-		}
-	}
-
-	public boolean add(final Object o) {
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.add(o);
-			}
-		});
-		return result[0];
-	}
-
-	public void add(final int index, final Object element) {
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				wrappedList.add(index, element);
-			}
-		});
-	}
-
-	public boolean remove(final Object o) {
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.remove(o);
-			}
-		});
-		return result[0];
-	}
-
-	public Object set(final int index, final Object element) {
-		final Object[] result = new Object[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.set(index, element);
-			}
-		});
-		return result[0];
-	}
-
-	public Object move(final int oldIndex, final int newIndex) {
-		if (innerObservableList != null) {
-			final Object[] result = new Object[1];
-			ObservableTracker.runAndIgnore(new Runnable() {
-				public void run() {
-					result[0] = innerObservableList.move(oldIndex, newIndex);
-				}
-			});
-			return result[0];
-		}
-		return super.move(oldIndex, newIndex);
-	}
-
-	public Object remove(final int index) {
-		final Object[] result = new Object[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.remove(index);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean addAll(final Collection c) {
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.addAll(c);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean addAll(final int index, final Collection c) {
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.addAll(index, c);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean removeAll(final Collection c) {
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.removeAll(c);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean retainAll(final Collection c) {
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.retainAll(c);
-			}
-		});
-		return result[0];
-	}
-
-	public void clear() {
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				wrappedList.clear();
-			}
-		});
-	}
-	
-	public synchronized void dispose() {
-		super.dispose();
-
-		if (outerObservableValue != null) {
-			outerObservableValue.removeValueChangeListener(outerChangeListener);
-		}
-		if (innerObservableList != null) {
-			innerObservableList.removeListChangeListener(innerChangeListener);
-			innerObservableList.dispose();
-		}
-		outerObservableValue = null;
-		outerChangeListener = null;
-		currentOuterValue = null;
-		factory = null;
-		innerObservableList = null;
-		innerChangeListener = null;
-	}
-
-	public Object getObserved() {
-		if (innerObservableList instanceof IObserving) {
-			return ((IObserving) innerObservableList).getObserved();
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableMap.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableMap.java
deleted file mode 100644
index 1cafa6b..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableMap.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 221704)
- *     Matthew Hall - bug 223114, 226289, 247875, 246782
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.masterdetail;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObserving;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.map.MapChangeEvent;
-import org.eclipse.core.databinding.observable.map.ObservableMap;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * @since 1.1
- * 
- */
-public class DetailObservableMap extends ObservableMap implements IObserving {
-	private boolean updating = false;
-
-	private IObservableValue master;
-	private IObservableFactory detailFactory;
-
-	private IObservableMap detailMap;
-
-	private Object detailKeyType;
-	private Object detailValueType;
-
-	private IValueChangeListener masterChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			ObservableTracker.runAndIgnore(new Runnable() {
-				public void run() {
-					Map oldMap = new HashMap(wrappedMap);
-					updateDetailMap();
-					fireMapChange(Diffs.computeMapDiff(oldMap, wrappedMap));
-				}
-			});
-		}
-	};
-
-	private IMapChangeListener detailChangeListener = new IMapChangeListener() {
-		public void handleMapChange(MapChangeEvent event) {
-			if (!updating) {
-				fireMapChange(event.diff);
-			}
-		}
-	};
-
-	/**
-	 * Constructs a new DetailObservableMap
-	 * 
-	 * @param detailFactory
-	 *            observable factory that creates IObservableMap instances given
-	 *            the current value of master observable value
-	 * @param master
-	 * @param keyType
-	 * @param valueType
-	 * 
-	 */
-	public DetailObservableMap(IObservableFactory detailFactory,
-			IObservableValue master, Object keyType, Object valueType) {
-		super(master.getRealm(), Collections.EMPTY_MAP);
-		this.master = master;
-		this.detailFactory = detailFactory;
-
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				updateDetailMap();
-			}
-		});
-		master.addValueChangeListener(masterChangeListener);
-	}
-
-	private void updateDetailMap() {
-		Object masterValue = master.getValue();
-		if (detailMap != null) {
-			detailMap.removeMapChangeListener(detailChangeListener);
-			detailMap.dispose();
-		}
-
-		if (masterValue == null) {
-			detailMap = null;
-			wrappedMap = Collections.EMPTY_MAP;
-		} else {
-			detailMap = (IObservableMap) detailFactory
-					.createObservable(masterValue);
-			DetailObservableHelper.warnIfDifferentRealms(getRealm(),
-					detailMap.getRealm());
-			wrappedMap = detailMap;
-
-			if (detailKeyType != null) {
-				Object innerKeyType = detailMap.getKeyType();
-
-				Assert.isTrue(detailKeyType.equals(innerKeyType),
-						"Cannot change key type in a nested observable map"); //$NON-NLS-1$
-			}
-
-			if (detailValueType != null) {
-				Object innerValueType = detailMap.getValueType();
-
-				Assert.isTrue(detailValueType.equals(innerValueType),
-						"Cannot change value type in a nested observable map"); //$NON-NLS-1$
-			}
-
-			detailMap.addMapChangeListener(detailChangeListener);
-		}
-	}
-
-	public Object getKeyType() {
-		return detailKeyType;
-	}
-
-	public Object getValueType() {
-		return detailValueType;
-	}
-
-	public Object put(final Object key, final Object value) {
-		final Object[] result = new Object[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = detailMap.put(key, value);
-			}
-		});
-		return result[0];
-	}
-
-	public void putAll(final Map map) {
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				detailMap.putAll(map);
-			}
-		});
-	}
-
-	public Object remove(final Object key) {
-		final Object[] result = new Object[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = detailMap.remove(key);
-			}
-		});
-		return result[0];
-	}
-
-	public void clear() {
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				detailMap.clear();
-			}
-		});
-	}
-
-	public synchronized void dispose() {
-		if (master != null) {
-			master.removeValueChangeListener(masterChangeListener);
-			master = null;
-			masterChangeListener = null;
-		}
-		detailFactory = null;
-		if (detailMap != null) {
-			detailMap.removeMapChangeListener(detailChangeListener);
-			detailMap.dispose();
-			detailMap = null;
-		}
-		detailChangeListener = null;
-		super.dispose();
-	}
-
-	public Object getObserved() {
-		if (detailMap instanceof IObserving) {
-			return ((IObserving) detailMap).getObserved();
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableSet.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableSet.java
deleted file mode 100755
index 297a144..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableSet.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 221351, 247875, 246782
- *     Ovidio Mallo - bug 241318
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.masterdetail;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObserving;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.ObservableSet;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * @since 3.2
- * 
- */
-public class DetailObservableSet extends ObservableSet implements IObserving {
-
-	private boolean updating = false;
-
-	private ISetChangeListener innerChangeListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			if (!updating) {
-				fireSetChange(event.diff);
-			}
-		}
-	};
-
-	private Object currentOuterValue;
-
-	private IObservableSet innerObservableSet;
-
-	private IObservableValue outerObservableValue;
-
-	private IObservableFactory factory;
-
-	/**
-	 * @param factory
-	 * @param outerObservableValue
-	 * @param detailType
-	 */
-	public DetailObservableSet(IObservableFactory factory,
-			IObservableValue outerObservableValue, Object detailType) {
-		super(outerObservableValue.getRealm(), Collections.EMPTY_SET,
-				detailType);
-		this.factory = factory;
-		this.outerObservableValue = outerObservableValue;
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				updateInnerObservableSet();
-			}
-		});
-
-		outerObservableValue.addValueChangeListener(outerChangeListener);
-	}
-
-	IValueChangeListener outerChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			ObservableTracker.runAndIgnore(new Runnable() {
-				public void run() {
-					Set oldSet = new HashSet(wrappedSet);
-					updateInnerObservableSet();
-					fireSetChange(Diffs.computeSetDiff(oldSet, wrappedSet));
-				}
-			});
-		}
-	};
-
-	private void updateInnerObservableSet() {
-		currentOuterValue = outerObservableValue.getValue();
-		if (innerObservableSet != null) {
-			innerObservableSet.removeSetChangeListener(innerChangeListener);
-			innerObservableSet.dispose();
-		}
-		if (currentOuterValue == null) {
-			innerObservableSet = null;
-			wrappedSet = Collections.EMPTY_SET;
-		} else {
-			this.innerObservableSet = (IObservableSet) factory
-					.createObservable(currentOuterValue);
-			DetailObservableHelper.warnIfDifferentRealms(getRealm(),
-					innerObservableSet.getRealm());
-			wrappedSet = innerObservableSet;
-
-			if (elementType != null) {
-				Object innerValueType = innerObservableSet.getElementType();
-
-				Assert.isTrue(elementType.equals(innerValueType),
-						"Cannot change value type in a nested observable set"); //$NON-NLS-1$
-			}
-
-			innerObservableSet.addSetChangeListener(innerChangeListener);
-		}
-	}
-
-	public boolean add(final Object o) {
-		getterCalled();
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedSet.add(o);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean remove(final Object o) {
-		getterCalled();
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedSet.remove(o);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean addAll(final Collection c) {
-		getterCalled();
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedSet.addAll(c);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean removeAll(final Collection c) {
-		getterCalled();
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedSet.removeAll(c);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean retainAll(final Collection c) {
-		getterCalled();
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedSet.retainAll(c);
-			}
-		});
-		return result[0];
-	}
-
-	public void clear() {
-		getterCalled();
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				wrappedSet.clear();
-			}
-		});
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-
-		if (outerObservableValue != null) {
-			outerObservableValue.removeValueChangeListener(outerChangeListener);
-		}
-		if (innerObservableSet != null) {
-			innerObservableSet.removeSetChangeListener(innerChangeListener);
-			innerObservableSet.dispose();
-		}
-		outerObservableValue = null;
-		outerChangeListener = null;
-		currentOuterValue = null;
-		factory = null;
-		innerObservableSet = null;
-		innerChangeListener = null;
-	}
-
-	public Object getObserved() {
-		if (innerObservableSet instanceof IObserving) {
-			return ((IObserving) innerObservableSet).getObserved();
-		}
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableValue.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableValue.java
deleted file mode 100755
index fed9ea7..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableValue.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Brad Reynolds - bug 147515
- *     Ovidio Mallo - bug 241318
- *     Matthew Hall - bug 247875, 246782
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.masterdetail;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObserving;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * @since 1.0
- * 
- */
-public class DetailObservableValue extends AbstractObservableValue implements IObserving {
-
-	private boolean updating = false;
-
-	private IValueChangeListener innerChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			if (!updating) {
-				fireValueChange(event.diff);
-			}
-		}
-	};
-
-	private Object currentOuterValue;
-
-	private IObservableValue innerObservableValue;
-
-	private Object detailType;
-
-	private IObservableValue outerObservableValue;
-
-	private IObservableFactory factory;
-
-	/**
-	 * @param outerObservableValue
-	 * @param factory
-	 * @param detailType
-	 */
-	public DetailObservableValue(IObservableValue outerObservableValue,
-			IObservableFactory factory, Object detailType) {
-		super(outerObservableValue.getRealm());
-		this.factory = factory;
-		this.detailType = detailType;
-		this.outerObservableValue = outerObservableValue;
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				updateInnerObservableValue();
-			}
-		});
-		outerObservableValue.addValueChangeListener(outerChangeListener);
-	}
-
-	IValueChangeListener outerChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			ObservableTracker.runAndIgnore(new Runnable() {
-				public void run() {
-					Object oldValue = doGetValue();
-					updateInnerObservableValue();
-					fireValueChange(Diffs.createValueDiff(oldValue,
-							doGetValue()));
-				}
-			});
-		}
-	};
-
-	private void updateInnerObservableValue() {
-		currentOuterValue = outerObservableValue.getValue();
-		if (innerObservableValue != null) {
-			innerObservableValue.removeValueChangeListener(innerChangeListener);
-			innerObservableValue.dispose();
-		}
-		if (currentOuterValue == null) {
-			innerObservableValue = null;
-		} else {
-			this.innerObservableValue = (IObservableValue) factory
-					.createObservable(currentOuterValue);
-			DetailObservableHelper.warnIfDifferentRealms(getRealm(),
-					innerObservableValue.getRealm());
-
-			if (detailType != null) {
-				Object innerValueType = innerObservableValue.getValueType();
-				Assert
-						.isTrue(
-								detailType.equals(innerValueType),
-								"Cannot change value type in a nested observable value, from " + innerValueType + " to " + detailType); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			innerObservableValue.addValueChangeListener(innerChangeListener);
-		}
-	}
-
-	public void doSetValue(final Object value) {
-		if (innerObservableValue != null) {
-			ObservableTracker.runAndIgnore(new Runnable() {
-				public void run() {
-					innerObservableValue.setValue(value);
-				}
-			});
-		}
-	}
-
-	public Object doGetValue() {
-		if (innerObservableValue == null)
-			return null;
-		final Object[] result = new Object[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = innerObservableValue.getValue();
-			}
-		});
-		return result[0];
-	}
-
-	public Object getValueType() {
-		return detailType;
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-
-		if (outerObservableValue != null) {
-			outerObservableValue.removeValueChangeListener(outerChangeListener);
-		}
-		if (innerObservableValue != null) {
-			innerObservableValue.removeValueChangeListener(innerChangeListener);
-			innerObservableValue.dispose();
-		}
-		outerObservableValue = null;
-		outerChangeListener = null;
-		currentOuterValue = null;
-		factory = null;
-		innerObservableValue = null;
-		innerChangeListener = null;
-	}
-
-	public Object getObserved() {
-		if (innerObservableValue instanceof IObserving) {
-			return ((IObserving)innerObservableValue).getObserved();
-		}
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/AbstractObservableTree.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/AbstractObservableTree.java
deleted file mode 100644
index e1226c9..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/AbstractObservableTree.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164134
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.internal.databinding.BindingMessages;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Status;
-
-/**
- * @since 3.3
- * 
- */
-public abstract class AbstractObservableTree extends AbstractObservable
-		implements IObservableTree {
-
-	private boolean stale;
-
-	private ListenerList treeListeners = new ListenerList(ListenerList.IDENTITY);
-
-	/**
-	 * @param realm
-	 */
-	public AbstractObservableTree(Realm realm) {
-		super(realm);
-	}
-
-	public void addChild(TreePath parentPath, Object childElement) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void addTreeChangeListener(ITreeChangeListener listener) {
-		treeListeners.add(listener);
-	}
-
-	public int getChildCount(TreePath parentPath) {
-		return getChildren(parentPath).length;
-	}
-
-	public boolean hasChildren(TreePath parentPath) {
-		return getChildCount(parentPath) > 0;
-	}
-
-	public void insertChild(TreePath parentPath, int index, Object childElement) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean isLazy() {
-		return false;
-	}
-
-	public boolean isOrdered() {
-		return false;
-	}
-
-	public void removeChild(TreePath parentPath, Object childElement) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void removeChild(TreePath parentPath, int index) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void removeTreeChangeListener(ITreeChangeListener listener) {
-		treeListeners.remove(listener);
-	}
-
-	public void setChildCount(TreePath parentPath, int count) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void setChildren(TreePath parentPath, Object[] children) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void updateChildren(IChildrenUpdate update) {
-		TreePath parent = update.getParent();
-		Object[] children = getChildren(parent);
-		for (int i = 0; i < update.getLength(); i++) {
-			int targetIndex = update.getOffset() + i;
-			if (targetIndex < children.length) {
-				update.setChild(children[targetIndex], targetIndex);
-			} else {
-				update
-						.setStatus(new Status(
-								IStatus.WARNING,
-								Policy.JFACE_DATABINDING, 
-								IStatus.OK,
-								BindingMessages
-										.getString(BindingMessages.INDEX_OUT_OF_RANGE), 
-										null));
-			}
-		}
-		update.done();
-	}
-
-	public void updateChildrenCount(IChildrenCountUpdate update) {
-		TreePath[] parents = update.getParents();
-		for (int i = 0; i < parents.length; i++) {
-			update.setChildCount(parents[i], getChildCount(parents[i]));
-		}
-		update.done();
-	}
-
-	public void updateHasChildren(IHasChildrenUpdate update) {
-		TreePath[] parents = update.getElements();
-		for (int i = 0; i < parents.length; i++) {
-			update.setHasChilren(parents[i], hasChildren(parents[i]));
-		}
-		update.done();
-	}
-
-	public boolean isStale() {
-		return stale;
-	}
-
-	/**
-	 * @param stale
-	 */
-	public void setStale(boolean stale) {
-		this.stale = stale;
-		if (stale) {
-			fireStale();
-		}
-	}
-
-	protected void fireTreeChange(TreeDiff diff) {
-		// fire general change event first
-		fireChange();
-
-		Object[] listeners = treeListeners.getListeners();
-		TreeChangeEvent event = new TreeChangeEvent(this, diff);
-		for (int i = 0; i < listeners.length; i++) {
-			((ITreeChangeListener) listeners[i]).handleTreeChange(event);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IChildrenCountUpdate.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IChildrenCountUpdate.java
deleted file mode 100644
index 331176a..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IChildrenCountUpdate.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.tree;
-
-/**
- * Request monitor used to collect the number of children for an element in a lazy
- * observable tree.
- * 
- * @since 3.3
- */
-public interface IChildrenCountUpdate extends IViewerUpdate {
-
-	/**
-	 * Returns the parent elements that children counts have been requested for
-	 * as tree paths. An empty path identifies the root element.
-	 * 
-	 * @return parent elements as tree paths
-	 */
-	public TreePath[] getParents();
-
-	/**
-	 * Sets the number of children for the given parent.
-	 * 
-	 * @param parentPath
-	 *            parent element or empty path for root element
-	 * @param numChildren
-	 *            number of children
-	 */
-	public void setChildCount(TreePath parentPath, int numChildren);
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IChildrenUpdate.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IChildrenUpdate.java
deleted file mode 100644
index 8d4b961..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IChildrenUpdate.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.tree;
-
-/**
- * Context sensitive children update request for a parent and subrange of its
- * children.
- *  
- * @since 3.3
- */
-public interface IChildrenUpdate extends IViewerUpdate {
-
-	/**
-	 * Returns the parent element that children are being requested for
-	 * as a tree path. An empty path identifies the root element.
-	 * 
-	 * @return parent element as a tree path
-	 */
-	public TreePath getParent();
-	
-	/**
-	 * Returns the offset at which children have been requested for. This is
-	 * the index of the first child being requested.
-	 * 
-	 * @return offset at which children have been requested for
-	 */
-	public int getOffset();
-	
-	/**
-	 * Returns the number of children requested.
-	 * 
-	 * @return number of children requested
-	 */
-	public int getLength();
-	
-	/**
-	 * Sets the child for this request's parent at the given offset.
-	 * 
-	 * @param child child
-	 * @param index child offset
-	 * 
-	 * TODO: what to do with <code>null</code>
-	 */
-	public void setChild(Object child, int index); 	
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IHasChildrenUpdate.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IHasChildrenUpdate.java
deleted file mode 100644
index f3eadd6..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IHasChildrenUpdate.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.tree;
-
-/**
- * Context sensitive update request for whether elements have children.
- * 
- * @since 3.3
- */
-public interface IHasChildrenUpdate extends IViewerUpdate {
-
-	/**
-	 * The elements this request is for specified as tree paths. An empty path
-	 * identifies the root element.
-	 * 
-	 * @return elements as tree paths
-	 */
-	public TreePath[] getElements();
-
-	/**
-	 * Sets whether the given element has children.
-	 * 
-	 * @param element
-	 *            tree path to element, or empty for root element
-	 * @param hasChildren
-	 *            whether it has children
-	 */
-	public void setHasChilren(TreePath element, boolean hasChildren);
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IObservableTree.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IObservableTree.java
deleted file mode 100644
index a877452..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IObservableTree.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-import org.eclipse.core.databinding.observable.IObservable;
-
-/**
- * 
- * A tree whose changes can be tracked by tree change listeners. If the tree is
- * ordered ({@link #isOrdered()}), the order of children for a given tree path
- * matters, and tree change notifications will always specify indices. If the
- * tree is unordered, the children of a tree path are an unordered set and
- * indices in change notifications are not specified.
- * 
- * <p>
- * This interface is not intended to be implemented by clients. Clients should
- * instead subclass one of the framework classes that implement this interface.
- * Note that direct implementers of this interface outside of the framework will
- * be broken in future releases when methods are added to this interface.
- * </p>
- * 
- * @since 1.1
- */
-public interface IObservableTree extends IObservable {
-	
-	/**
-	 * Element that can be returned from synchronous getters if this observable
-	 * tree is lazy.
-	 */
-	public final static Object UNKNOWN_ELEMENT = new Object();
-	
-	/**
-	 * @param listener
-	 */
-	public void addTreeChangeListener(ITreeChangeListener listener);
-
-	/**
-	 * @param listener
-	 */
-	public void removeTreeChangeListener(ITreeChangeListener listener);
-
-	/**
-	 * Returns whether the order of children for a given parent is important. If
-	 * this tree is ordered, tree change notifications will always specify
-	 * indices.
-	 * 
-	 * @return true if the order of children for a given parent is important
-	 */
-	public boolean isOrdered();
-	
-	/**
-	 * Returns whether this tree is optimized to fetch subsets of children
-	 * lazily and possibly asynchronously. Implies {@link #isOrdered()}.
-	 * 
-	 * @return true if this tree 
-	 */
-	public boolean isLazy();
-
-	/**
-	 * @param parentPath
-	 * @return the children at the given parent path
-	 */
-	public Object[] getChildren(TreePath parentPath);
-	
-	/**
-	 * @param parentPath
-	 * @param children
-	 */
-	public void setChildren(TreePath parentPath, Object[] children);
-	
-	/**
-	 * @param parentPath
-	 * @param childElement
-	 */
-	public void addChild(TreePath parentPath, Object childElement);
-	
-	/**
-	 * @param parentPath
-	 * @param childElement 
-	 */
-	public void removeChild(TreePath parentPath, Object childElement);
-	
-	/**
-	 * @param parentPath
-	 * @param index
-	 * @param childElement
-	 */
-	public void insertChild(TreePath parentPath, int index, Object childElement);
-	
-	/**
-	 * @param parentPath
-	 * @param index
-	 */
-	public void removeChild(TreePath parentPath, int index);
-	
-	/**
-	 * @param parentPath
-	 * @return <code>true</code> if the element at the given path has children
-	 */
-	public boolean hasChildren(TreePath parentPath);
-	
-	/**
-	 * @param parentPath
-	 * @return the number of children of the element at the given path 
-	 */
-	public int getChildCount(TreePath parentPath);
-	
-	/**
-	 * @param parentPath
-	 * @param count
-	 */
-	public void setChildCount(TreePath parentPath, int count);
-	
-	/**
-	 * Updates the number of children for the given parent elements in the
-	 * specified request.
-	 * 
-	 * @param update specifies counts to update and stores result
-	 */
-	public void updateChildrenCount(IChildrenCountUpdate update);
-	
-	/**
-	 * Updates children as requested by the update.
-	 * 
-	 * @param update specifies children to update and stores result
-	 */	
-	public void updateChildren(IChildrenUpdate update);
-	
-	/**
-	 * Updates whether elements have children.
-	 * 
-	 * @param update specifies elements to update and stores result
-	 */
-	public void updateHasChildren(IHasChildrenUpdate update);
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IOrderedTreeProvider.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IOrderedTreeProvider.java
deleted file mode 100644
index f60d561..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IOrderedTreeProvider.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-
-/**
- * Objects that implement this interface are capable of describing a tree by
- * returning the list of children of any given element in the tree.
- * 
- * @since 3.3
- */
-public interface IOrderedTreeProvider {
-	/**
-	 * Returns the children of the given element, or null if the element is a
-	 * leaf node. The caller of this method is expected to dispose the result
-	 * list when it is no longer needed.
-	 * 
-	 * @param element
-	 *            the tree path of the element to query
-	 * @return the children of the given element, or null if the element is a
-	 *         leaf node
-	 */
-	IObservableList createChildList(TreePath element);
-
-	/**
-	 * @return the realm shared by all child lists
-	 */
-	Realm getRealm();
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/ITreeChangeListener.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/ITreeChangeListener.java
deleted file mode 100644
index 8fe9f8f..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/ITreeChangeListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-/**
- * @since 3.3
- * 
- */
-public interface ITreeChangeListener {
-	/**
-	 * @param event
-	 */
-	void handleTreeChange(TreeChangeEvent event);
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IUnorderedTreeProvider.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IUnorderedTreeProvider.java
deleted file mode 100644
index 81941c8..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IUnorderedTreeProvider.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-
-/**
- * @since 1.0
- *
- */
-public interface IUnorderedTreeProvider {
-	/**
-	 * @return the realm for the createChildSet method
-	 */
-	public Realm getRealm();
-	
-	/**
-	 * Returns the children of the given element, or null if the element is a leaf node.
-	 * The caller of this method is expected to dispose the result set when it is no
-	 * longer needed.
-	 * 
-	 * @param element element to query
-	 * @return the children of the given element, or null if the element is a leaf node
-	 */
-	IObservableSet createChildSet(Object element);
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IViewerUpdate.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IViewerUpdate.java
deleted file mode 100644
index 26cadab..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/IViewerUpdate.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.tree;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * A context sensitive viewer update request.
- * 
- * @since 3.3
- */
-public interface IViewerUpdate extends IProgressMonitor {
-
-    /**
-     * Sets the status of this request, possibly <code>null</code>.
-     * When a request fails, the status indicates why the request failed.
-     * A <code>null</code> status is considered to be successful.
-     * 
-     * @param status request status
-     */
-    public void setStatus(IStatus status);
-    
-    /**
-     * Returns the status of this request, or <code>null</code>.
-     * 
-     * @return request status or <code>null</code>
-     */
-    public IStatus getStatus();	
-    
-    /**
-     * Returns the model element corresponding to the given tree path.
-     * Returns the root element for the empty path.
-     * 
-     * @param path viewer tree path
-     * @return corresponding model element
-     */
-    public Object getElement(TreePath path);
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/TreeChangeEvent.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/TreeChangeEvent.java
deleted file mode 100644
index b5051d5..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/TreeChangeEvent.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-import java.util.EventObject;
-
-/**
- * @since 3.3
- * 
- */
-public class TreeChangeEvent extends EventObject {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -3198503763995528027L;
-	/**
-	 * 
-	 */
-	public TreeDiff diff;
-
-	/**
-	 * @param source
-	 * @param diff
-	 */
-	public TreeChangeEvent(IObservableTree source, TreeDiff diff) {
-		super(source);
-		this.diff = diff;
-	}
-
-	/**
-	 * @return the observable tree from which this event originated
-	 */
-	public IObservableTree getObservable() {
-		return (IObservableTree) getSource();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiff.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiff.java
deleted file mode 100644
index 7c419ea..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiff.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-/**
- * Describes the difference between two trees as a tree of tree diff nodes.
- * 
- * @since 1.1
- * 
- */
-public abstract class TreeDiff extends TreeDiffNode {
-
-	/**
-	 * Returns the tree path (possibly empty) of the parent, or
-	 * <code>null</code> if the underlying tree is not lazy and never contains
-	 * duplicate elements.
-	 * 
-	 * @return the tree path (possibly empty) of the unchanged parent, or
-	 *         <code>null</code>
-	 */
-	public abstract TreePath getParentPath();
-
-	/**
-	 * @param visitor
-	 */
-	public void accept(TreeDiffVisitor visitor) {
-		doAccept(visitor, getParentPath());
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiffNode.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiffNode.java
deleted file mode 100644
index a8b8b8d..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiffNode.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-/**
- * @since 1.1
- * 
- */
-public abstract class TreeDiffNode {
-
-	/**
-	 * 
-	 */
-	public final static int NO_CHANGE = 0x00;
-
-	/**
-	 * 
-	 */
-	public final static int ADDED = 0x01;
-
-	/**
-	 * 
-	 */
-	public final static int REMOVED = 0x02;
-
-	/**
-	 * 
-	 */
-	public final static int REPLACED = 0x03;
-
-	/**
-	 * 
-	 */
-	public static final TreeDiffNode[] NO_CHILDREN = new TreeDiffNode[0];
-
-	/**
-	 * 
-	 */
-	public static final int INDEX_UNKNOWN = -1;
-
-	/**
-	 * @return the change type
-	 */
-	public abstract int getChangeType();
-
-	/**
-	 * @return the element that was removed, or the replaced element
-	 */
-	public abstract Object getOldElement();
-
-	/**
-	 * @return the element that was not changed, added, or the replacement
-	 *         element
-	 */
-	public abstract Object getNewElement();
-
-	/**
-	 * @return the index at which the element was added, removed, or replaced
-	 */
-	public abstract int getIndex();
-
-	/**
-	 * Returns the child tree diff objects that describe changes to children. If
-	 * the change type is REMOVED, there will be no children.
-	 * 
-	 * @return the nodes representing changes to children
-	 */
-	public abstract TreeDiffNode[] getChildren();
-
-	protected void doAccept(TreeDiffVisitor visitor, TreePath parentPath) {
-		TreePath currentPath = parentPath.createChildPath(getNewElement());
-		boolean recurse = visitor.visit(this, currentPath);
-		if (recurse) {
-			TreeDiffNode[] children = getChildren();
-			for (int i = 0; i < children.length; i++) {
-				TreeDiffNode child = children[i];
-				child.doAccept(visitor, currentPath);
-			}
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiffVisitor.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiffVisitor.java
deleted file mode 100644
index 837464d..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiffVisitor.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-/**
- * @since 3.3
- * 
- */
-public abstract class TreeDiffVisitor {
-
-	/**
-	 * Visits the given tree diff.
-	 * 
-	 * @param diff
-	 *            the diff to visit
-	 * @param currentPath
-	 *            the current path (the diff's element is the last segment of
-	 *            the path)
-	 * 
-	 * @return <code>true</code> if the tree diff's children should be
-	 *         visited; <code>false</code> if they should be skipped.
-	 */
-	public abstract boolean visit(TreeDiffNode diff, TreePath currentPath);
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/TreePath.java b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/TreePath.java
deleted file mode 100644
index 99e987c..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/TreePath.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 118516
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.tree;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * A tree path denotes a model element in a tree viewer. Tree path objects have
- * value semantics. A model element is represented by a path of elements in the
- * tree from the root element to the leaf element.
- * <p>
- * Clients may instantiate this class. Not intended to be subclassed.
- * </p>
- * 
- * @since 3.2
- */
-public final class TreePath {
-	
-	/**
-	 * Constant for representing an empty tree path.
-	 */
-	public static final TreePath EMPTY = new TreePath(new Object[0]);
-	
-	private Object[] segments;
-
-	private int hash;
-
-	/**
-	 * Constructs a path identifying a leaf node in a tree.
-	 * 
-	 * @param segments
-	 *            path of elements to a leaf node in a tree, starting with the
-	 *            root element
-	 */
-	public TreePath(Object[] segments) {
-		Assert.isNotNull(segments, "Segments array cannot be null"); //$NON-NLS-1$
-		this.segments = new Object[segments.length];
-		for (int i = 0; i < segments.length; i++) {
-			Assert.isNotNull(segments[i], "Segments array cannot contain null"); //$NON-NLS-1$
-			this.segments[i] = segments[i];
-		}
-	}
-
-	/**
-	 * Returns the element at the specified index in this path.
-	 * 
-	 * @param index
-	 *            index of element to return
-	 * @return element at the specified index
-	 */
-	public Object getSegment(int index) {
-		return segments[index];
-	}
-
-	/**
-	 * Returns the number of elements in this path.
-	 * 
-	 * @return the number of elements in this path
-	 */
-	public int getSegmentCount() {
-		return segments.length;
-	}
-
-	/**
-	 * Returns the first element in this path.
-	 * 
-	 * @return the first element in this path
-	 */
-	public Object getFirstSegment() {
-		if (segments.length == 0) {
-			return null;
-		}
-		return segments[0];
-	}
-
-	/**
-	 * Returns the last element in this path.
-	 * 
-	 * @return the last element in this path
-	 */
-	public Object getLastSegment() {
-		if (segments.length == 0) {
-			return null;
-		}
-		return segments[segments.length - 1];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object other) {
-		if (!(other instanceof TreePath)) {
-			return false;
-		}
-		TreePath otherPath = (TreePath) other;
-		if (segments.length != otherPath.segments.length) {
-			return false;
-		}
-		for (int i = 0; i < segments.length; i++) {
-				if (!segments[i].equals(otherPath.segments[i])) {
-					return false;
-				}
-		}
-		return true;
-	}
-
-	public int hashCode() {
-		if (hash == 0) {
-			for (int i = 0; i < segments.length; i++) {
-					hash += segments[i].hashCode();
-			}
-		}
-		return hash;
-	}
-
-	/**
-	 * Returns whether this path starts with the same segments as the given
-	 * path, using the given comparer to compare segments.
-	 * 
-	 * @param treePath
-	 *            path to compare to
-	 * @return whether the given path is a prefix of this path, or the same as
-	 *         this path
-	 */
-	public boolean startsWith(TreePath treePath) {
-		int thisSegmentCount = getSegmentCount();
-		int otherSegmentCount = treePath.getSegmentCount();
-		if (otherSegmentCount == thisSegmentCount) {
-			return equals(treePath);
-		}
-		if (otherSegmentCount > thisSegmentCount) {
-			return false;
-		}
-		for (int i = 0; i < otherSegmentCount; i++) {
-			Object otherSegment = treePath.getSegment(i);
-				if (!otherSegment.equals(segments[i])) {
-					return false;
-				}
-		}
-		return true;
-	}
-
-	/**
-	 * Returns a copy of this tree path with one segment removed from the end,
-	 * or <code>null</code> if this tree path has no segments.
-	 * @return a tree path
-	 */
-	public TreePath getParentPath() {
-		int segmentCount = getSegmentCount();
-		if (segmentCount <= 1) {
-			return null;
-		}
-		Object[] parentSegments = new Object[segmentCount - 1];
-		System.arraycopy(segments, 0, parentSegments, 0, segmentCount - 1);
-		return new TreePath(parentSegments);
-	}
-
-	/**
-	 * Returns a copy of this tree path with the given segment added at the end.
-	 * @param newSegment 
-	 * @return a tree path
-	 */
-	public TreePath createChildPath(Object newSegment) {
-		int segmentCount = getSegmentCount();
-		Object[] childSegments = new Object[segmentCount + 1];
-		if(segmentCount>0) {
-			System.arraycopy(segments, 0, childSegments, 0, segmentCount);
-		}
-		childSegments[segmentCount] = newSegment;
-		return new TreePath(childSegments);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/package.html b/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/package.html
deleted file mode 100644
index d720e2b..0000000
--- a/bundles/org.eclipse.core.databinding.observable/src/org/eclipse/core/internal/databinding/observable/tree/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-To be written.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that can be used to ...</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding/.classpath b/bundles/org.eclipse.core.databinding/.classpath
deleted file mode 100644
index 6f3b481..0000000
--- a/bundles/org.eclipse.core.databinding/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/CDC-1.1%Foundation-1.1"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.core.databinding/.cvsignore b/bundles/org.eclipse.core.databinding/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.core.databinding/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.core.databinding/.project b/bundles/org.eclipse.core.databinding/.project
deleted file mode 100644
index a52c8d9..0000000
--- a/bundles/org.eclipse.core.databinding/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.core.databinding</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.core.databinding/.settings/.api_filters b/bundles/org.eclipse.core.databinding/.settings/.api_filters
deleted file mode 100644
index 66b340f..0000000
--- a/bundles/org.eclipse.core.databinding/.settings/.api_filters
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<component id="org.eclipse.core.databinding" version="2">
-    <resource path="src/org/eclipse/core/databinding/conversion/StringToNumberConverter.java" type="org.eclipse.core.databinding.conversion.StringToNumberConverter">
-        <filter id="576720909">
-            <message_arguments>
-                <message_argument value="NumberFormatConverter"/>
-                <message_argument value="StringToNumberConverter"/>
-            </message_arguments>
-        </filter>
-    </resource>
-</component>
diff --git a/bundles/org.eclipse.core.databinding/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.core.databinding/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index b9fdb95..0000000
--- a/bundles/org.eclipse.core.databinding/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,353 +0,0 @@
-#Thu Apr 03 13:12:49 EDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=80
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=tab
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.core.databinding/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.core.databinding/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 0f5114f..0000000
--- a/bundles/org.eclipse.core.databinding/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,116 +0,0 @@
-#Mon Dec 03 13:49:43 EST 2007
-cleanup.add_default_serial_version_id=true
-cleanup.add_generated_serial_version_id=false
-cleanup.add_missing_annotations=true
-cleanup.add_missing_deprecated_annotations=true
-cleanup.add_missing_methods=false
-cleanup.add_missing_nls_tags=false
-cleanup.add_missing_override_annotations=true
-cleanup.add_serial_version_id=false
-cleanup.always_use_blocks=true
-cleanup.always_use_parentheses_in_expressions=false
-cleanup.always_use_this_for_non_static_field_access=false
-cleanup.always_use_this_for_non_static_method_access=false
-cleanup.convert_to_enhanced_for_loop=false
-cleanup.correct_indentation=false
-cleanup.format_source_code=false
-cleanup.format_source_code_changes_only=false
-cleanup.make_local_variable_final=true
-cleanup.make_parameters_final=false
-cleanup.make_private_fields_final=true
-cleanup.make_variable_declarations_final=false
-cleanup.never_use_blocks=false
-cleanup.never_use_parentheses_in_expressions=true
-cleanup.organize_imports=false
-cleanup.qualify_static_field_accesses_with_declaring_class=false
-cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-cleanup.qualify_static_member_accesses_with_declaring_class=true
-cleanup.qualify_static_method_accesses_with_declaring_class=false
-cleanup.remove_private_constructors=true
-cleanup.remove_trailing_whitespaces=false
-cleanup.remove_trailing_whitespaces_all=true
-cleanup.remove_trailing_whitespaces_ignore_empty=false
-cleanup.remove_unnecessary_casts=true
-cleanup.remove_unnecessary_nls_tags=true
-cleanup.remove_unused_imports=true
-cleanup.remove_unused_local_variables=false
-cleanup.remove_unused_private_fields=true
-cleanup.remove_unused_private_members=false
-cleanup.remove_unused_private_methods=true
-cleanup.remove_unused_private_types=true
-cleanup.sort_members=false
-cleanup.sort_members_all=false
-cleanup.use_blocks=false
-cleanup.use_blocks_only_for_return_and_throw=false
-cleanup.use_parentheses_in_expressions=false
-cleanup.use_this_for_non_static_field_access=false
-cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-cleanup.use_this_for_non_static_method_access=false
-cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-cleanup_profile=org.eclipse.jdt.ui.default.eclipse_clean_up_profile
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=false
-formatter_profile=org.eclipse.jdt.ui.default.eclipse_profile
-formatter_settings_version=11
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.ignorelowercasenames=true
-org.eclipse.jdt.ui.importorder=java;javax;org;com;
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.ondemandthreshold=99
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.staticondemandthreshold=99
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} The ${bare_field_name} to set.\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n ******************************************************************************/\r\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @since 3.3\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template></templates>
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.format_source_code=false
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=false
-sp_cleanup.organize_imports=true
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=false
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/bundles/org.eclipse.core.databinding/.settings/org.eclipse.pde.api.tools.prefs b/bundles/org.eclipse.core.databinding/.settings/org.eclipse.pde.api.tools.prefs
deleted file mode 100644
index 60843cb..0000000
--- a/bundles/org.eclipse.core.databinding/.settings/org.eclipse.pde.api.tools.prefs
+++ /dev/null
@@ -1,145 +0,0 @@
-#Wed Apr 02 17:10:39 EDT 2008
-ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
-ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
-ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
-ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
-ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
-ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
-ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
-ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
-API_LEAK=Warning
-API_PROFILE_ELEMENT_TYPE_REMOVED_API_COMPONENT=Error
-CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
-CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
-CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
-CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
-CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
-CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
-CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
-CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
-CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
-CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
-CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
-CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
-CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
-CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
-CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
-CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
-CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
-CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
-CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
-CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
-CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
-CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
-CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
-CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
-CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
-ENUM_ELEMENT_TYPE_ADDED_FIELD=Error
-ENUM_ELEMENT_TYPE_ADDED_METHOD=Error
-ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
-ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
-ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
-ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
-ENUM_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
-ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
-ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
-ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
-ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
-FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Ignore
-FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
-FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
-FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
-FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
-FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
-FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
-ILLEGAL_EXTEND=Warning
-ILLEGAL_IMPLEMENT=Warning
-ILLEGAL_INSTANTIATE=Warning
-ILLEGAL_OVERRIDE=Warning
-ILLEGAL_REFERENCE=Warning
-INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
-INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
-INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
-INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
-INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
-INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
-INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
-METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
-METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
-METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
-METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
-METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
-METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
-METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
-METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
-METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
-METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
-METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
-METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
-eclipse.preferences.version=1
-incompatible_api_component_version=Error
-invalid_since_tag_version=Error
-malformed_since_tag=Error
-missing_since_tag=Error
diff --git a/bundles/org.eclipse.core.databinding/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.core.databinding/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 4a56680..0000000
--- a/bundles/org.eclipse.core.databinding/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,18 +0,0 @@
-#Mon Dec 03 13:49:44 EST 2007
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=0
-compilers.p.illegal-att-value=0
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=2
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=0
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=0
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/bundles/org.eclipse.core.databinding/META-INF/MANIFEST.MF b/bundles/org.eclipse.core.databinding/META-INF/MANIFEST.MF
deleted file mode 100644
index a684556..0000000
--- a/bundles/org.eclipse.core.databinding/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,35 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.core.databinding
-Bundle-Version: 1.2.0.qualifier
-Bundle-ClassPath: .
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.core.databinding,
- org.eclipse.core.databinding.conversion;x-internal:=false,
- org.eclipse.core.databinding.observable,
- org.eclipse.core.databinding.observable.list;x-internal:=false,
- org.eclipse.core.databinding.observable.map,
- org.eclipse.core.databinding.observable.masterdetail,
- org.eclipse.core.databinding.observable.set;x-internal:=false,
- org.eclipse.core.databinding.observable.value;x-internal:=false,
- org.eclipse.core.databinding.util,
- org.eclipse.core.databinding.validation;x-internal:=false,
- org.eclipse.core.internal.databinding;x-friends:="org.eclipse.core.databinding.beans",
- org.eclipse.core.internal.databinding.conversion;x-friends:="org.eclipse.jface.tests.databinding",
- org.eclipse.core.internal.databinding.observable;x-internal:=true,
- org.eclipse.core.internal.databinding.observable.masterdetail;x-friends:="org.eclipse.jface.tests.databinding",
- org.eclipse.core.internal.databinding.observable.tree;x-friends:="org.eclipse.jface.databinding,org.eclipse.jface.tests.databinding",
- org.eclipse.core.internal.databinding.validation;x-friends:="org.eclipse.jface.tests.databinding"
-Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.2.0,4.0.0)"
-Import-Package-Comment: see http://wiki.eclipse.org/
-Import-Package: com.ibm.icu.math;resolution:=optional,
- com.ibm.icu.text,
- org.osgi.framework;version="[1.4.0,2.0.0)";resolution:=optional,
- org.osgi.util.tracker;version="[1.3.3,2.0.0)";resolution:=optional,
- org.eclipse.osgi.framework.log;version="[1.0.0,2.0.0)";resolution:=optional
-Bundle-RequiredExecutionEnvironment: CDC-1.1/Foundation-1.1,
- J2SE-1.4
-Bundle-Activator: org.eclipse.core.internal.databinding.Activator
-Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.core.databinding/about.html b/bundles/org.eclipse.core.databinding/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.core.databinding/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.databinding/build.properties b/bundles/org.eclipse.core.databinding/build.properties
deleted file mode 100644
index 67499e3..0000000
--- a/bundles/org.eclipse.core.databinding/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = .,\
-               META-INF/,\
-               plugin.properties,\
-               about.html
-output.databinding.jar = bin/
-src.includes = about.html
-source.. = src/
diff --git a/bundles/org.eclipse.core.databinding/plugin.properties b/bundles/org.eclipse.core.databinding/plugin.properties
deleted file mode 100644
index e18f395..0000000
--- a/bundles/org.eclipse.core.databinding/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName = JFace Data Binding
-providerName = Eclipse.org
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/AggregateValidationStatus.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/AggregateValidationStatus.java
deleted file mode 100644
index f3a7297..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/AggregateValidationStatus.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matt Carter - bug 182822
- *     Boris Bokowski - bug 218269
- *     Matthew Hall - bugs 218269, 146397
- *******************************************************************************/
-package org.eclipse.core.databinding;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.ComputedValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.internal.databinding.BindingMessages;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * This class can be used to aggregate status values from a data binding context
- * into a single status value. Instances of this class can be used as an
- * observable value with a value type of {@link IStatus}, or the static methods
- * can be called directly if an aggregated status result is only needed once.
- * 
- * @since 1.0
- * 
- */
-public final class AggregateValidationStatus implements IObservableValue {
-
-	private IObservableValue implementation;
-
-	/**
-	 * Constant denoting an aggregation strategy that merges multiple non-OK
-	 * status objects in a {@link MultiStatus}. Returns an OK status result if
-	 * all statuses from the given validation status providers are the an OK
-	 * status. Returns a single status if there is only one non-OK status.
-	 * 
-	 * @see #getStatusMerged(Collection)
-	 */
-	public static final int MERGED = 1;
-
-	/**
-	 * Constant denoting an aggregation strategy that always returns the most
-	 * severe status from the given validation status providers. If there is
-	 * more than one status at the same severity level, it picks the first one
-	 * it encounters.
-	 * 
-	 * @see #getStatusMaxSeverity(Collection)
-	 */
-	public static final int MAX_SEVERITY = 2;
-
-	/**
-	 * Creates a new aggregate validation status observable for the given data
-	 * binding context.
-	 * 
-	 * @param dbc
-	 *            a data binding context
-	 * @param strategy
-	 *            a strategy constant, one of {@link #MERGED} or
-	 *            {@link #MAX_SEVERITY}.
-	 * @since 1.1
-	 */
-	public AggregateValidationStatus(DataBindingContext dbc, int strategy) {
-		this(dbc.getValidationRealm(), dbc.getValidationStatusProviders(),
-				strategy);
-	}
-
-	/**
-	 * @param validationStatusProviders
-	 *            an observable collection containing elements of type
-	 *            {@link ValidationStatusProvider}
-	 * @param strategy
-	 *            a strategy constant, one of {@link #MERGED} or
-	 *            {@link #MAX_SEVERITY}.
-	 * @see DataBindingContext#getValidationStatusProviders()
-	 */
-	public AggregateValidationStatus(
-			final IObservableCollection validationStatusProviders, int strategy) {
-		this(Realm.getDefault(), validationStatusProviders, strategy);
-	}
-
-	/**
-	 * @param realm
-	 *            Realm
-	 * @param validationStatusProviders
-	 *            an observable collection containing elements of type
-	 *            {@link ValidationStatusProvider}
-	 * @param strategy
-	 *            a strategy constant, one of {@link #MERGED} or
-	 *            {@link #MAX_SEVERITY}.
-	 * @see DataBindingContext#getValidationStatusProviders()
-	 * @since 1.1
-	 */
-	public AggregateValidationStatus(final Realm realm,
-			final IObservableCollection validationStatusProviders, int strategy) {
-		if (strategy == MERGED) {
-			implementation = new ComputedValue(realm, IStatus.class) {
-				protected Object calculate() {
-					return getStatusMerged(validationStatusProviders);
-				}
-			};
-		} else {
-			implementation = new ComputedValue(realm, IStatus.class) {
-				protected Object calculate() {
-					return getStatusMaxSeverity(validationStatusProviders);
-				}
-			};
-		}
-	}
-
-	/**
-	 * @param listener
-	 * @see org.eclipse.core.databinding.observable.IObservable#addChangeListener(org.eclipse.core.databinding.observable.IChangeListener)
-	 */
-	public void addChangeListener(IChangeListener listener) {
-		implementation.addChangeListener(listener);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public void addDisposeListener(IDisposeListener listener) {
-		implementation.addDisposeListener(listener);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public void removeDisposeListener(IDisposeListener listener) {
-		implementation.removeDisposeListener(listener);
-	}
-
-	/**
-	 * @param listener
-	 * @see org.eclipse.core.databinding.observable.IObservable#addStaleListener(org.eclipse.core.databinding.observable.IStaleListener)
-	 */
-	public void addStaleListener(IStaleListener listener) {
-		implementation.addStaleListener(listener);
-	}
-
-	/**
-	 * @param listener
-	 * @see org.eclipse.core.databinding.observable.value.IObservableValue#addValueChangeListener(org.eclipse.core.databinding.observable.value.IValueChangeListener)
-	 */
-	public void addValueChangeListener(IValueChangeListener listener) {
-		implementation.addValueChangeListener(listener);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public boolean isDisposed() {
-		return implementation.isDisposed();
-	}
-
-	public void dispose() {
-		implementation.dispose();
-	}
-
-	public Realm getRealm() {
-		return implementation.getRealm();
-	}
-
-	public Object getValue() {
-		return implementation.getValue();
-	}
-
-	public Object getValueType() {
-		return implementation.getValueType();
-	}
-
-	public boolean isStale() {
-		return implementation.isStale();
-	}
-
-	public void removeChangeListener(IChangeListener listener) {
-		implementation.removeChangeListener(listener);
-	}
-
-	public void removeStaleListener(IStaleListener listener) {
-		implementation.removeStaleListener(listener);
-	}
-
-	public void removeValueChangeListener(IValueChangeListener listener) {
-		implementation.removeValueChangeListener(listener);
-	}
-
-	public void setValue(Object value) {
-		implementation.setValue(value);
-	}
-
-	/**
-	 * Returns a status object that merges multiple non-OK status objects in a
-	 * {@link MultiStatus}. Returns an OK status result if all statuses from
-	 * the given validation status providers are the an OK status. Returns a
-	 * single status if there is only one non-OK status.
-	 * 
-	 * @param validationStatusProviders
-	 *            a collection of validation status providers
-	 * @return a merged status
-	 */
-	public static IStatus getStatusMerged(Collection validationStatusProviders) {
-		List statuses = new ArrayList();
-		for (Iterator it = validationStatusProviders.iterator(); it.hasNext();) {
-			ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) it
-					.next();
-			IStatus status = (IStatus) validationStatusProvider
-					.getValidationStatus().getValue();
-			if (!status.isOK()) {
-				statuses.add(status);
-			}
-		}
-		if (statuses.size() == 1) {
-			return (IStatus) statuses.get(0);
-		}
-		if (!statuses.isEmpty()) {
-			MultiStatus result = new MultiStatus(Policy.JFACE_DATABINDING, 0,
-					BindingMessages
-							.getString(BindingMessages.MULTIPLE_PROBLEMS), null);
-			for (Iterator it = statuses.iterator(); it.hasNext();) {
-				IStatus status = (IStatus) it.next();
-				result.merge(status);
-			}
-			return result;
-		}
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Returns a status that always returns the most severe status from the
-	 * given validation status providers. If there is more than one status at
-	 * the same severity level, it picks the first one it encounters.
-	 * 
-	 * @param validationStatusProviders
-	 *            a collection of validation status providers
-	 * @return a single status reflecting the most severe status from the given
-	 *         validation status providers
-	 */
-	public static IStatus getStatusMaxSeverity(
-			Collection validationStatusProviders) {
-		int maxSeverity = IStatus.OK;
-		IStatus maxStatus = Status.OK_STATUS;
-		for (Iterator it = validationStatusProviders.iterator(); it.hasNext();) {
-			ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) it
-					.next();
-			IStatus status = (IStatus) validationStatusProvider
-					.getValidationStatus().getValue();
-			if (status.getSeverity() > maxSeverity) {
-				maxSeverity = status.getSeverity();
-				maxStatus = status;
-			}
-		}
-		return maxStatus;
-	}
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/Binding.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/Binding.java
deleted file mode 100644
index e764730..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/Binding.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 159768
- *     Boris Bokowski - bug 218269
- *     Matthew Hall - bug 218269, 254524
- *******************************************************************************/
-
-package org.eclipse.core.databinding;
-
-import java.util.Collections;
-
-import org.eclipse.core.databinding.observable.DisposeEvent;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-
-/**
- * This abstract class represents a binding between a model and a target. Newly
- * created instances need to be added to a data binding context using
- * {@link #init(DataBindingContext)}.
- * 
- * @since 1.0
- */
-public abstract class Binding extends ValidationStatusProvider {
-
-	protected DataBindingContext context;
-	private IObservable target;
-	private IObservable model;
-	private IDisposeListener disposeListener;
-	
-	/**
-	 * Creates a new binding.
-	 * 
-	 * @param target target observable
-	 * @param model model observable
-	 */
-	public Binding(IObservable target, IObservable model) {
-		this.target = target;
-		this.model = model;
-	}
-	
-	/**
-	 * Initializes this binding with the given context and adds it to the list
-	 * of bindings of the context.
-	 * <p>
-	 * Subclasses may extend, but must call the super implementation.
-	 * </p>
-	 * 
-	 * @param context
-	 */
-	public final void init(DataBindingContext context) {
-		this.context = context;
-		if (target.isDisposed())
-			throw new IllegalArgumentException("Target observable is disposed"); //$NON-NLS-1$
-		if (model.isDisposed())
-			throw new IllegalArgumentException("Model observable is disposed"); //$NON-NLS-1$
-		this.disposeListener = new IDisposeListener() {
-			public void handleDispose(DisposeEvent staleEvent) {
-				dispose();
-			}
-		};
-		target.addDisposeListener(disposeListener);
-		model.addDisposeListener(disposeListener);
-		preInit();
-		context.addBinding(this);
-		postInit();
-	}
-	
-	/**
-	 * Called by {@link #init(DataBindingContext)} after setting
-	 * {@link #context} but before adding this binding to the context.
-	 * Subclasses may use this method to perform initialization that could not
-	 * be done in the constructor. Care should be taken not to cause any events
-	 * while running this method.
-	 */
-	protected abstract void preInit();
-	
-	/**
-	 * Called by {@link #init(DataBindingContext)} after adding this binding to
-	 * the context. Subclasses may use this method to perform initialization
-	 * that may cause events to be fired, including BindingEvents that are
-	 * forwarded to the data binding context.
-	 */
-	protected abstract void postInit();
-
-	/**
-	 * @return an observable value containing the current validation status
-	 */
-	public abstract IObservableValue getValidationStatus();
-
-	/**
-	 * Updates the model's state from the target's state at the next reasonable
-	 * opportunity. There is no guarantee that the state will have been updated
-	 * by the time this call returns.
-	 */
-	public abstract void updateTargetToModel();
-
-	/**
-	 * Updates the target's state from the model's state at the next reasonable
-	 * opportunity. There is no guarantee that the state will have been updated
-	 * by the time this call returns.
-	 */
-	public abstract void updateModelToTarget();
-	
-	/**
-	 * Validates the target's state at the next reasonable
-	 * opportunity. There is no guarantee that the validation status will have been updated
-	 * by the time this call returns.
-	 */
-	public abstract void validateTargetToModel();
-	
-	/**
-	 * Validates the model's state at the next reasonable
-	 * opportunity. There is no guarantee that the validation status will have been updated
-	 * by the time this call returns.
-	 */
-	public abstract void validateModelToTarget();
-	
-	/**
-	 * Disposes of this Binding. Subclasses may extend, but must call super.dispose().
-	 */
-	public void dispose() {
-		if (context != null) {
-			context.removeBinding(this);
-		}
-		context = null;
-		if (disposeListener != null) {
-			if (target != null) {
-				target.removeDisposeListener(disposeListener);
-			}
-			if (model != null) {
-				model.removeDisposeListener(disposeListener);
-			}
-			disposeListener = null;
-		}
-		target = null;
-		model = null;
-		super.dispose();
-	}
-
-	/**
-	 * @param context
-	 */
-	/* package */ void setDataBindingContext(DataBindingContext context) {
-		this.context = context;
-	}
-
-	/**
-	 * @return target observable
-	 */
-	public IObservable getTarget() {
-		return target;
-	}
-
-	/**
-	 * @since 1.1
-	 */
-	public IObservableList getTargets() {
-		return Observables.staticObservableList(context.getValidationRealm(),
-				Collections.singletonList(target));
-	}
-
-	/**
-	 * @return model observable
-	 */
-	public IObservable getModel() {
-		return model;
-	}
-
-	/**
-	 * @since 1.1
-	 */
-	public IObservableList getModels() {
-		return Observables.staticObservableList(context.getValidationRealm(),
-				Collections.singletonList(model));
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/BindingException.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/BindingException.java
deleted file mode 100644
index ebe8624..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/BindingException.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.databinding;
-
-import java.io.PrintStream;
-import java.io.PrintWriter;
-
-/**
- * An unchecked exception indicating a binding problem.
- * 
- * @since 1.0
- */
-public class BindingException extends RuntimeException {
-
-	/*
-	 * Needed because all Throwables are Serializable.
-	 */
-	private static final long serialVersionUID = -4092828452936724217L;
-	private Throwable cause;
-
-	/**
-	 * Creates a new BindingException with the given message.
-	 * 
-	 * @param message
-	 */
-	public BindingException(String message) {
-		super(message);
-	}
-
-	/**
-	 * Creates a new BindingException with the given message and cause.
-	 * 
-	 * @param message
-	 * @param cause
-	 */
-	public BindingException(String message, Throwable cause) {
-		super(message);
-		this.cause = cause;
-	}
-
-	public void printStackTrace(PrintStream err) {
-		super.printStackTrace(err);
-		if (cause != null) {
-			err.println("caused by:"); //$NON-NLS-1$
-			cause.printStackTrace(err);
-		}
-	}
-
-	public void printStackTrace(PrintWriter err) {
-		super.printStackTrace(err);
-		if (cause != null) {
-			err.println("caused by:"); //$NON-NLS-1$
-			cause.printStackTrace(err);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/DataBindingContext.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/DataBindingContext.java
deleted file mode 100644
index 08acd66..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/DataBindingContext.java
+++ /dev/null
@@ -1,432 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 159539
- *     Brad Reynolds - bug 140644
- *     Brad Reynolds - bug 159940
- *     Brad Reynolds - bug 116920, 159768
- *     Matthew Hall - bugs 118516, 124684, 218269
- *     Boris Bokowski - bug 218269
- *******************************************************************************/
-package org.eclipse.core.databinding;
-
-import java.util.Iterator;
-
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.internal.databinding.ValidationStatusMap;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * A DataBindingContext is the point of contact for the creation and management
- * of {@link Binding bindings}, and aggregates validation statuses of its
- * bindings, or more generally, its validation status providers.
- * <p>
- * A DataBindingContext provides the following abilities:
- * <ul>
- * <li>Ability to create bindings between
- * {@link IObservableValue observable values}.</li>
- * <li>Ability to create bindings between
- * {@link IObservableList observable lists}.</li>
- * <li>Access to the bindings created by the instance.</li>
- * <li>Access to the list of validation status providers (this includes all
- * bindings).</li>
- * </ul>
- * </p>
- * <p>
- * Multiple contexts can be used at any point in time. One strategy for the
- * management of contexts is the aggregation of validation statuses. For example
- * an <code>IWizardPage</code> could use a single context and the statuses
- * could be aggregated to set the page status and fulfillment. Each page in the
- * <code>IWizard</code> would have its own context instance.
- * </p>
- * 
- * @since 1.0
- */
-public class DataBindingContext {
-	private WritableList bindings;
-	private WritableList validationStatusProviders;
-
-	/**
-	 * Unmodifiable version of {@link #bindings} for public exposure.
-	 */
-	private IObservableList unmodifiableBindings;
-	/**
-	 * Unmodifiable version of {@link #validationStatusProviders} for public
-	 * exposure.
-	 */
-	private IObservableList unmodifiableStatusProviders;
-
-	private IObservableMap validationStatusMap;
-
-	private Realm validationRealm;
-
-	/**
-	 * Creates a data binding context, using the current default realm for the
-	 * validation observables.
-	 * 
-	 * @see Realm
-	 */
-	public DataBindingContext() {
-		this(Realm.getDefault());
-	}
-
-	/**
-	 * Creates a data binding context using the given realm for the validation
-	 * observables.
-	 * 
-	 * @param validationRealm
-	 *            the realm to be used for the validation observables
-	 * 
-	 * @see Realm
-	 */
-	public DataBindingContext(Realm validationRealm) {
-		Assert.isNotNull(validationRealm, "Validation realm cannot be null"); //$NON-NLS-1$
-		this.validationRealm = validationRealm;
-
-		bindings = new WritableList(validationRealm);
-		unmodifiableBindings = Observables.unmodifiableObservableList(bindings);
-
-		validationStatusProviders = new WritableList(validationRealm);
-		unmodifiableStatusProviders = Observables
-				.unmodifiableObservableList(validationStatusProviders);
-
-		validationStatusMap = new ValidationStatusMap(validationRealm, bindings);
-	}
-
-	/**
-	 * Creates a {@link Binding} to synchronize the values of two
-	 * {@link IObservableValue observable values}. During synchronization
-	 * validation and conversion can be employed to customize the process. For
-	 * specifics on the customization of the process see
-	 * {@link UpdateValueStrategy}.
-	 * 
-	 * @param targetObservableValue
-	 *            target value, commonly a UI widget
-	 * @param modelObservableValue
-	 *            model value
-	 * @param targetToModel
-	 *            strategy to employ when the target is the source of the change
-	 *            and the model is the destination
-	 * @param modelToTarget
-	 *            strategy to employ when the model is the source of the change
-	 *            and the target is the destination
-	 * @return created binding
-	 * 
-	 * @see UpdateValueStrategy
-	 */
-	public final Binding bindValue(IObservableValue targetObservableValue,
-			IObservableValue modelObservableValue,
-			UpdateValueStrategy targetToModel, UpdateValueStrategy modelToTarget) {
-		UpdateValueStrategy targetToModelStrategy = targetToModel != null ? targetToModel
-						: createTargetToModelUpdateValueStrategy(targetObservableValue, modelObservableValue);
-		UpdateValueStrategy modelToTargetStrategy = modelToTarget != null ? modelToTarget
-				: createModelToTargetUpdateValueStrategy(modelObservableValue, targetObservableValue);
-		targetToModelStrategy.fillDefaults(targetObservableValue, modelObservableValue);
-		modelToTargetStrategy.fillDefaults(modelObservableValue, targetObservableValue);
-		ValueBinding result = new ValueBinding(targetObservableValue,
-				modelObservableValue, targetToModelStrategy,
-				modelToTargetStrategy);
-		result.init(this);
-		return result;
-	}
-
-	/**
-	 * Returns an update value strategy to be used for copying values from the
-	 * from value to the to value. Clients may override.
-	 * 
-	 * @param fromValue
-	 * @param toValue
-	 * @return a update value strategy
-	 */
-	protected UpdateValueStrategy createModelToTargetUpdateValueStrategy(
-			IObservableValue fromValue, IObservableValue toValue) {
-		return new UpdateValueStrategy();
-	}
-
-	/**
-	 * Returns an update value strategy to be used for copying values from the
-	 * from value to the to value. Clients may override.
-	 * 
-	 * @param fromValue
-	 * @param toValue
-	 * @return a update value strategy
-	 */
-	protected UpdateValueStrategy createTargetToModelUpdateValueStrategy(
-			IObservableValue fromValue, IObservableValue toValue) {
-		return new UpdateValueStrategy();
-	}
-	
-	/**
-	 * Creates a {@link Binding} to synchronize the values of two
-	 * {@link IObservableList observable lists}. During synchronization
-	 * validation and conversion can be employed to customize the process. For
-	 * specifics on the customization of the process see
-	 * {@link UpdateListStrategy}.
-	 * 
-	 * @param targetObservableList
-	 *            target list, commonly a list representing a list in the UI
-	 * @param modelObservableList
-	 *            model list
-	 * @param targetToModel
-	 *            strategy to employ when the target is the source of the change
-	 *            and the model is the destination
-	 * @param modelToTarget
-	 *            strategy to employ when the model is the source of the change
-	 *            and the target is the destination
-	 * @return created binding
-	 * 
-	 * @see UpdateListStrategy
-	 */
-	public final Binding bindList(IObservableList targetObservableList,
-			IObservableList modelObservableList,
-			UpdateListStrategy targetToModel, UpdateListStrategy modelToTarget) {
-		UpdateListStrategy targetToModelStrategy = targetToModel != null ? targetToModel
-				: createTargetToModelUpdateListStrategy(targetObservableList,
-						modelObservableList);
-		UpdateListStrategy modelToTargetStrategy = modelToTarget != null ? modelToTarget
-				: createModelToTargetUpdateListStrategy(modelObservableList,
-						targetObservableList);
-		targetToModelStrategy.fillDefaults(targetObservableList,
-				modelObservableList);
-		modelToTargetStrategy.fillDefaults(modelObservableList,
-				targetObservableList);
-		ListBinding result = new ListBinding(targetObservableList,
-				modelObservableList, targetToModelStrategy,
-				modelToTargetStrategy);
-		result.init(this);
-		return result;
-	}
-
-	/**
-	 * @param modelObservableList
-	 * @param targetObservableList
-	 * @return an update list strategy
-	 */
-	protected UpdateListStrategy createModelToTargetUpdateListStrategy(
-			IObservableList modelObservableList,
-			IObservableList targetObservableList) {
-		return new UpdateListStrategy();
-	}
-
-	/**
-	 * @param targetObservableList
-	 * @param modelObservableList
-	 * @return an update list strategy 
-	 */
-	protected UpdateListStrategy createTargetToModelUpdateListStrategy(
-			IObservableList targetObservableList,
-			IObservableList modelObservableList) {
-		return new UpdateListStrategy();
-	}
-
-	/**
-	 * Creates a {@link Binding} to synchronize the values of two
-	 * {@link IObservableSet observable sets}. During synchronization
-	 * validation and conversion can be employed to customize the process. For
-	 * specifics on the customization of the process see
-	 * {@link UpdateSetStrategy}.
-	 * 
-	 * @param targetObservableSet
-	 *            target set, commonly a set representing a set in the UI
-	 * @param modelObservableSet
-	 *            model set
-	 * @param targetToModel
-	 *            strategy to employ when the target is the source of the change
-	 *            and the model is the destination
-	 * @param modelToTarget
-	 *            strategy to employ when the model is the source of the change
-	 *            and the target is the destination
-	 * @return created binding
-	 * @since 1.1
-	 */
-	public final Binding bindSet(IObservableSet targetObservableSet,
-			IObservableSet modelObservableSet, UpdateSetStrategy targetToModel,
-			UpdateSetStrategy modelToTarget) {
-		if (targetToModel == null)
-			targetToModel = createTargetToModelUpdateSetStrategy(
-					targetObservableSet, modelObservableSet);
-		if (modelToTarget == null)
-			modelToTarget = createModelToTargetUpdateSetStrategy(
-					modelObservableSet, targetObservableSet);
-		targetToModel.fillDefaults(targetObservableSet, modelObservableSet);
-		modelToTarget.fillDefaults(modelObservableSet, targetObservableSet);
-		SetBinding result = new SetBinding(targetObservableSet,
-				modelObservableSet, targetToModel, modelToTarget);
-		result.init(this);
-		return result;
-	}
-
-	/**
-	 * @param targetObservableSet 
-	 * @param modelObservableSet 
-	 * @return a default set update strategy
-	 * @since 1.1
-	 */
-	protected UpdateSetStrategy createTargetToModelUpdateSetStrategy(
-			IObservableSet targetObservableSet,
-			IObservableSet modelObservableSet) {
-		return new UpdateSetStrategy();
-	}
-
-	/**
-	 * @param modelObservableSet 
-	 * @param targetObservableSet 
-	 * @return a default set update strategy 
-	 * @since 1.1
-	 */
-	protected UpdateSetStrategy createModelToTargetUpdateSetStrategy(
-			IObservableSet modelObservableSet,
-			IObservableSet targetObservableSet) {
-		return new UpdateSetStrategy();
-	}
-
-	/**
-	 * Disposes of this data binding context and all bindings and validation
-	 * status providers that were added to this context.
-	 */
-	public final void dispose() {
-		Binding[] bindingArray = (Binding[]) bindings.toArray(new Binding[bindings.size()]);
-		for (int i = 0; i < bindingArray.length; i++) {
-			bindingArray[i].dispose();
-		}
-		ValidationStatusProvider[] statusProviderArray = (ValidationStatusProvider[]) validationStatusProviders
-				.toArray(new ValidationStatusProvider[validationStatusProviders
-						.size()]);
-		for (int i = 0; i < statusProviderArray.length; i++) {
-			if (!statusProviderArray[i].isDisposed())
-				statusProviderArray[i].dispose();
-		}
-	}
-
-	/**
-	 * Returns an unmodifiable observable list with elements of type
-	 * {@link Binding}, ordered by time of addition.
-	 * 
-	 * @return the observable list containing all bindings
-	 */
-	public final IObservableList getBindings() {
-		return unmodifiableBindings;
-	}
-
-	/**
-	 * Returns an unmodifiable observable list with elements of type
-	 * {@link ValidationStatusProvider}, ordered by time of addition.
-	 * 
-	 * @return the observable list containing all bindings
-	 * @since 1.1
-	 */
-	public final IObservableList getValidationStatusProviders() {
-		return unmodifiableStatusProviders;
-	}
-
-	/**
-	 * Returns an observable map from bindings (type: {@link Binding}) to
-	 * statuses (type: {@link IStatus}). The keys of the map are the bindings
-	 * returned by {@link #getBindings()}, and the values are the current
-	 * validaion status objects for each binding.
-	 * 
-	 * @return the observable map from bindings to status objects.
-	 * 
-	 * @deprecated as of 1.1, please use {@link #getValidationStatusProviders()}
-	 */
-	public final IObservableMap getValidationStatusMap() {
-		return validationStatusMap;
-	}
-
-	/**
-	 * Adds the given binding to this data binding context. This will also add
-	 * the given binding to the list of validation status providers.
-	 * 
-	 * @param binding
-	 *            The binding to add.
-	 * @see #addValidationStatusProvider(ValidationStatusProvider)
-	 * @see #getValidationStatusProviders()
-	 */
-	public void addBinding(Binding binding) {
-		addValidationStatusProvider(binding);
-		bindings.add(binding);
-	}
-
-	/**
-	 * Adds the given validation status provider to this data binding context.
-	 * 
-	 * @param validationStatusProvider
-	 *            The validation status provider to add.
-	 * @since 1.1
-	 */
-	public void addValidationStatusProvider(
-			ValidationStatusProvider validationStatusProvider) {
-		validationStatusProviders.add(validationStatusProvider);
-	}
-
-	/**
-	 * Updates all model observable objects to reflect the current state of the
-	 * target observable objects.
-	 * 
-	 */
-	public final void updateModels() {
-		for (Iterator it = bindings.iterator(); it.hasNext();) {
-			Binding binding = (Binding) it.next();
-			binding.updateTargetToModel();
-		}
-	}
-
-	/**
-	 * Updates all target observable objects to reflect the current state of the
-	 * model observable objects.
-	 * 
-	 */
-	public final void updateTargets() {
-		for (Iterator it = bindings.iterator(); it.hasNext();) {
-			Binding binding = (Binding) it.next();
-			binding.updateModelToTarget();
-		}
-	}
-
-	/**
-	 * Removes the given binding.
-	 * 
-	 * @param binding
-	 * @return <code>true</code> if was associated with the context,
-	 *         <code>false</code> if not
-	 */
-	public boolean removeBinding(Binding binding) {
-		return bindings.remove(binding) && removeValidationStatusProvider(binding);
-	}
-
-	/**
-	 * Removes the validation status provider.
-	 * 
-	 * @param validationStatusProvider
-	 * @return <code>true</code> if was associated with the context,
-	 *         <code>false</code> if not
-	 * @since 1.1
-	 */
-	public boolean removeValidationStatusProvider(
-			ValidationStatusProvider validationStatusProvider) {
-		return validationStatusProviders.remove(validationStatusProvider);
-	}
-
-	/**
-	 * Returns the validation realm.
-	 * 
-	 * @return the realm for the validation observables
-	 * @see Realm
-	 */
-	public final Realm getValidationRealm() {
-		return validationRealm;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ListBinding.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ListBinding.java
deleted file mode 100644
index 459c524..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ListBinding.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.databinding;
-
-import java.util.Collections;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiff;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.internal.databinding.BindingStatus;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * @since 1.0
- * 
- */
-public class ListBinding extends Binding {
-
-	private UpdateListStrategy targetToModel;
-	private UpdateListStrategy modelToTarget;
-	private IObservableValue validationStatusObservable;
-	private boolean updatingTarget;
-	private boolean updatingModel;
-
-	private IListChangeListener targetChangeListener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			if (!updatingTarget) {
-				doUpdate((IObservableList) getTarget(),
-						(IObservableList) getModel(), event.diff,
-						targetToModel, false, false);
-			}
-		}
-	};
-	private IListChangeListener modelChangeListener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			if (!updatingModel) {
-				doUpdate((IObservableList) getModel(),
-						(IObservableList) getTarget(), event.diff,
-						modelToTarget, false, false);
-			}
-		}
-	};
-
-	/**
-	 * @param target
-	 * @param model
-	 * @param modelToTargetStrategy
-	 * @param targetToModelStrategy
-	 */
-	public ListBinding(IObservableList target, IObservableList model,
-			UpdateListStrategy targetToModelStrategy,
-			UpdateListStrategy modelToTargetStrategy) {
-		super(target, model);
-		this.targetToModel = targetToModelStrategy;
-		this.modelToTarget = modelToTargetStrategy;
-		if ((targetToModel.getUpdatePolicy() & UpdateValueStrategy.POLICY_UPDATE) != 0) {
-			target.addListChangeListener(targetChangeListener);
-		} else {
-			targetChangeListener = null;
-		}
-		if ((modelToTarget.getUpdatePolicy() & UpdateValueStrategy.POLICY_UPDATE) != 0) {
-			model.addListChangeListener(modelChangeListener);
-		} else {
-			modelChangeListener = null;
-		}
-	}
-
-	public IObservableValue getValidationStatus() {
-		return validationStatusObservable;
-	}
-
-	protected void preInit() {
-		validationStatusObservable = new WritableValue(context
-				.getValidationRealm(), Status.OK_STATUS, IStatus.class);
-	}
-
-	protected void postInit() {
-		if (modelToTarget.getUpdatePolicy() == UpdateListStrategy.POLICY_UPDATE) {
-			updateModelToTarget();
-		}
-		if (targetToModel.getUpdatePolicy() != UpdateListStrategy.POLICY_NEVER) {
-			validateTargetToModel();
-		}
-	}
-
-	public void updateModelToTarget() {
-		final IObservableList modelList = (IObservableList) getModel();
-		modelList.getRealm().exec(new Runnable() {
-			public void run() {
-				ListDiff diff = Diffs.computeListDiff(Collections.EMPTY_LIST,
-						modelList);
-				doUpdate(modelList, (IObservableList) getTarget(), diff,
-						modelToTarget, true, true);
-			}
-		});
-	}
-
-	public void updateTargetToModel() {
-		final IObservableList targetList = (IObservableList) getTarget();
-		targetList.getRealm().exec(new Runnable() {
-			public void run() {
-				ListDiff diff = Diffs.computeListDiff(Collections.EMPTY_LIST,
-						targetList);
-				doUpdate(targetList, (IObservableList) getModel(), diff,
-						targetToModel, true, true);
-			}
-		});
-	}
-
-	public void validateModelToTarget() {
-		// nothing for now
-	}
-
-	public void validateTargetToModel() {
-		// nothing for now
-	}
-
-	/*
-	 * This method may be moved to UpdateListStrategy in the future if clients
-	 * need more control over how the two lists are kept in sync.
-	 */
-	private void doUpdate(final IObservableList source,
-			final IObservableList destination, final ListDiff diff,
-			final UpdateListStrategy updateListStrategy,
-			final boolean explicit, final boolean clearDestination) {
-		final int policy = updateListStrategy.getUpdatePolicy();
-		if (policy != UpdateListStrategy.POLICY_NEVER) {
-			if (policy != UpdateListStrategy.POLICY_ON_REQUEST || explicit) {
-				destination.getRealm().exec(new Runnable() {
-					public void run() {
-						if (destination == getTarget()) {
-							updatingTarget = true;
-						} else {
-							updatingModel = true;
-						}
-						MultiStatus multiStatus = BindingStatus.ok();
-
-						try {
-							if (clearDestination) {
-								destination.clear();
-							}
-							ListDiffEntry[] diffEntries = diff.getDifferences();
-							for (int i = 0; i < diffEntries.length; i++) {
-								ListDiffEntry listDiffEntry = diffEntries[i];
-								if (listDiffEntry.isAddition()) {
-									IStatus setterStatus = updateListStrategy
-											.doAdd(
-													destination,
-													updateListStrategy
-															.convert(listDiffEntry
-																	.getElement()),
-													listDiffEntry.getPosition());
-
-									mergeStatus(multiStatus, setterStatus);
-									// TODO - at this point, the two lists
-									// will be out of sync if an error occurred...
-								} else {
-									IStatus setterStatus = updateListStrategy
-											.doRemove(destination,
-													listDiffEntry.getPosition());
-									
-									mergeStatus(multiStatus, setterStatus);
-									// TODO - at this point, the two lists
-									// will be out of sync if an error occurred...
-								}
-							}
-						} finally {
-							validationStatusObservable.setValue(multiStatus);
-
-							if (destination == getTarget()) {
-								updatingTarget = false;
-							} else {
-								updatingModel = false;
-							}
-						}
-					}
-				});
-			}
-		}
-	}
-
-	/**
-	 * Merges the provided <code>newStatus</code> into the
-	 * <code>multiStatus</code>.
-	 * 
-	 * @param multiStatus
-	 * @param newStatus
-	 */
-	/* package */void mergeStatus(MultiStatus multiStatus, IStatus newStatus) {
-		if (!newStatus.isOK()) {
-			multiStatus.add(newStatus);
-		}
-	}
-
-	public void dispose() {
-		if (targetChangeListener != null) {
-			((IObservableList)getTarget()).removeListChangeListener(targetChangeListener);
-			targetChangeListener = null;
-		}
-		if (modelChangeListener != null) {
-			((IObservableList)getModel()).removeListChangeListener(modelChangeListener);
-			modelChangeListener = null;
-		}
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ObservablesManager.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ObservablesManager.java
deleted file mode 100644
index 4efad45..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ObservablesManager.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Bob Smith - bug 198880
- *******************************************************************************/
-
-package org.eclipse.core.databinding;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.internal.databinding.Pair;
-
-/**
- * An observables manager can be used for lifecycle management of
- * {@link IObservable} objects.
- *
- * @noextend This class is not intended to be subclassed by clients.
- *
- * @since 1.0
- *
- */
-public class ObservablesManager {
-
-	private Set managedObservables = new HashSet();
-	private Set excludedObservables = new HashSet();
-	private Map contexts = new HashMap();
-
-	/**
-	 * Create a new observables manager.
-	 */
-	public ObservablesManager() {
-	}
-
-	/**
-	 * Adds the given observable to this manager.
-	 *
-	 * @param observable
-	 *            the observable
-	 */
-	public void addObservable(IObservable observable) {
-		managedObservables.add(observable);
-	}
-
-	/**
-	 * Adds the given observable to this manager's exclusion list. The given
-	 * observable will not be disposed of by this manager.
-	 *
-	 * @param observable
-	 *            the observable
-	 */
-	public void excludeObservable(IObservable observable) {
-		excludedObservables.add(observable);
-	}
-
-	/**
-	 * Adds the given data binding context's target and/or model observables to
-	 * this manager.
-	 *
-	 * @param context
-	 *            the data binding context
-	 * @param trackTargets
-	 *            <code>true</code> if the target observables of the context
-	 *            should be managed
-	 * @param trackModels
-	 *            <code>true</code> if the model observables of the context
-	 *            should be managed
-	 */
-	public void addObservablesFromContext(DataBindingContext context,
-			boolean trackTargets, boolean trackModels) {
-		if (trackTargets || trackModels) {
-			contexts.put(context, new Pair(new Boolean(trackTargets),
-					new Boolean(trackModels)));
-		}
-	}
-
-	/**
-	 * Disposes of this manager and all observables that it manages.
-	 */
-	public void dispose() {
-		Set observables = new HashSet();
-		observables.addAll(managedObservables);
-		for (Iterator it = contexts.keySet().iterator(); it.hasNext();) {
-			DataBindingContext context = (DataBindingContext) it.next();
-			Pair trackModelsOrTargets = (Pair) contexts.get(context);
-			boolean disposeTargets = ((Boolean) trackModelsOrTargets.a)
-					.booleanValue();
-			boolean disposeModels = ((Boolean) trackModelsOrTargets.b)
-					.booleanValue();
-			for (Iterator it2 = context.getBindings().iterator(); it2.hasNext();) {
-				Binding binding = (Binding) it2.next();
-				if (disposeTargets) {
-					observables.add(binding.getTarget());
-				}
-				if (disposeModels) {
-					observables.add(binding.getModel());
-				}
-			}
-		}
-		observables.removeAll(excludedObservables);
-		for (Iterator it = observables.iterator(); it.hasNext();) {
-			IObservable observable = (IObservable) it.next();
-			observable.dispose();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/SetBinding.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/SetBinding.java
deleted file mode 100644
index 9e3d747..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/SetBinding.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 124684)
- *     IBM Corporation - through ListBinding.java
- ******************************************************************************/
-
-package org.eclipse.core.databinding;
-
-import java.util.Collections;
-import java.util.Iterator;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-import org.eclipse.core.databinding.observable.set.SetDiff;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.internal.databinding.BindingStatus;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * @since 1.1
- * 
- */
-public class SetBinding extends Binding {
-
-	private UpdateSetStrategy targetToModel;
-	private UpdateSetStrategy modelToTarget;
-	private IObservableValue validationStatusObservable;
-	private boolean updatingTarget;
-	private boolean updatingModel;
-
-	private ISetChangeListener targetChangeListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			if (!updatingTarget) {
-				doUpdate((IObservableSet) getTarget(),
-						(IObservableSet) getModel(), event.diff, targetToModel,
-						false, false);
-			}
-		}
-	};
-
-	private ISetChangeListener modelChangeListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			if (!updatingModel) {
-				doUpdate((IObservableSet) getModel(),
-						(IObservableSet) getTarget(), event.diff,
-						modelToTarget, false, false);
-			}
-		}
-	};
-
-	/**
-	 * @param target
-	 * @param model
-	 * @param modelToTargetStrategy
-	 * @param targetToModelStrategy
-	 */
-	public SetBinding(IObservableSet target, IObservableSet model,
-			UpdateSetStrategy targetToModelStrategy,
-			UpdateSetStrategy modelToTargetStrategy) {
-		super(target, model);
-		this.targetToModel = targetToModelStrategy;
-		this.modelToTarget = modelToTargetStrategy;
-		if ((targetToModel.getUpdatePolicy() & UpdateSetStrategy.POLICY_UPDATE) != 0) {
-			target.addSetChangeListener(targetChangeListener);
-		} else {
-			targetChangeListener = null;
-		}
-		if ((modelToTarget.getUpdatePolicy() & UpdateSetStrategy.POLICY_UPDATE) != 0) {
-			model.addSetChangeListener(modelChangeListener);
-		} else {
-			modelChangeListener = null;
-		}
-	}
-
-	public IObservableValue getValidationStatus() {
-		return validationStatusObservable;
-	}
-
-	protected void preInit() {
-		validationStatusObservable = new WritableValue(context
-				.getValidationRealm(), Status.OK_STATUS, IStatus.class);
-	}
-
-	protected void postInit() {
-		if (modelToTarget.getUpdatePolicy() == UpdateSetStrategy.POLICY_UPDATE) {
-			updateModelToTarget();
-		}
-		if (targetToModel.getUpdatePolicy() != UpdateSetStrategy.POLICY_NEVER) {
-			validateTargetToModel();
-		}
-	}
-
-	public void updateModelToTarget() {
-		final IObservableSet modelSet = (IObservableSet) getModel();
-		modelSet.getRealm().exec(new Runnable() {
-			public void run() {
-				SetDiff diff = Diffs.computeSetDiff(Collections.EMPTY_SET,
-						modelSet);
-				doUpdate(modelSet, (IObservableSet) getTarget(), diff,
-						modelToTarget, true, true);
-			}
-		});
-	}
-
-	public void updateTargetToModel() {
-		final IObservableSet targetSet = (IObservableSet) getTarget();
-		targetSet.getRealm().exec(new Runnable() {
-			public void run() {
-				SetDiff diff = Diffs.computeSetDiff(Collections.EMPTY_SET,
-						targetSet);
-				doUpdate(targetSet, (IObservableSet) getModel(), diff,
-						targetToModel, true, true);
-			}
-		});
-	}
-
-	public void validateModelToTarget() {
-		// nothing for now
-	}
-
-	public void validateTargetToModel() {
-		// nothing for now
-	}
-
-	/*
-	 * This method may be moved to UpdateSetStrategy in the future if clients
-	 * need more control over how the two sets are kept in sync.
-	 */
-	private void doUpdate(final IObservableSet source,
-			final IObservableSet destination, final SetDiff diff,
-			final UpdateSetStrategy updateSetStrategy, final boolean explicit,
-			final boolean clearDestination) {
-		final int policy = updateSetStrategy.getUpdatePolicy();
-		if (policy == UpdateSetStrategy.POLICY_NEVER)
-			return;
-		if (policy == UpdateSetStrategy.POLICY_ON_REQUEST && !explicit)
-			return;
-		destination.getRealm().exec(new Runnable() {
-			public void run() {
-				if (destination == getTarget()) {
-					updatingTarget = true;
-				} else {
-					updatingModel = true;
-				}
-				MultiStatus multiStatus = BindingStatus.ok();
-
-				try {
-					if (clearDestination) {
-						destination.clear();
-					}
-
-					for (Iterator iterator = diff.getRemovals().iterator(); iterator
-							.hasNext();) {
-						IStatus setterStatus = updateSetStrategy.doRemove(
-								destination, updateSetStrategy.convert(iterator
-										.next()));
-
-						mergeStatus(multiStatus, setterStatus);
-						// TODO - at this point, the two sets
-						// will be out of sync if an error
-						// occurred...
-					}
-
-					for (Iterator iterator = diff.getAdditions().iterator(); iterator
-							.hasNext();) {
-						IStatus setterStatus = updateSetStrategy.doAdd(
-								destination, updateSetStrategy.convert(iterator
-										.next()));
-
-						mergeStatus(multiStatus, setterStatus);
-						// TODO - at this point, the two sets
-						// will be out of sync if an error
-						// occurred...
-					}
-				} finally {
-					validationStatusObservable.setValue(multiStatus);
-
-					if (destination == getTarget()) {
-						updatingTarget = false;
-					} else {
-						updatingModel = false;
-					}
-				}
-			}
-		});
-	}
-
-	/**
-	 * Merges the provided <code>newStatus</code> into the
-	 * <code>multiStatus</code>.
-	 * 
-	 * @param multiStatus
-	 * @param newStatus
-	 */
-	/* package */void mergeStatus(MultiStatus multiStatus, IStatus newStatus) {
-		if (!newStatus.isOK()) {
-			multiStatus.add(newStatus);
-		}
-	}
-
-	public void dispose() {
-		if (targetChangeListener != null) {
-			((IObservableSet) getTarget())
-					.removeSetChangeListener(targetChangeListener);
-			targetChangeListener = null;
-		}
-		if (modelChangeListener != null) {
-			((IObservableSet) getModel())
-					.removeSetChangeListener(modelChangeListener);
-			modelChangeListener = null;
-		}
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/UpdateListStrategy.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/UpdateListStrategy.java
deleted file mode 100644
index de8d949..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/UpdateListStrategy.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl<tom.schindl@bestsolution.at> - bugfix for 217940
- *******************************************************************************/
-
-package org.eclipse.core.databinding;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.BindingMessages;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * Customizes a {@link Binding} between two
- * {@link IObservableList observable lists}. The following behaviors can be
- * customized via the strategy:
- * <ul>
- * <li>Conversion</li>
- * <li>Automatic processing</li>
- * </ul>
- * <p>
- * Conversion:<br/> When elements are added they can be
- * {@link #convert(Object) converted} to the destination element type.
- * </p>
- * <p>
- * Automatic processing:<br/> The processing to perform when the source
- * observable changes. This behavior is configured via policies provided on
- * construction of the strategy (e.g. {@link #POLICY_NEVER},
- * {@link #POLICY_ON_REQUEST}, {@link #POLICY_UPDATE}).
- * </p>
- *
- *
- * @see DataBindingContext#bindList(IObservableList, IObservableList,
- *      UpdateListStrategy, UpdateListStrategy)
- * @see IConverter
- * @since 1.0
- */
-public class UpdateListStrategy extends UpdateStrategy {
-
-	/**
-	 * Policy constant denoting that the source observable's state should not be
-	 * tracked and that the destination observable's state should never be
-	 * updated.
-	 */
-	public static int POLICY_NEVER = notInlined(1);
-
-	/**
-	 * Policy constant denoting that the source observable's state should not be
-	 * tracked, but that conversion and updating the destination observable's
-	 * state should be performed when explicitly requested.
-	 */
-	public static int POLICY_ON_REQUEST = notInlined(2);
-
-	/**
-	 * Policy constant denoting that the source observable's state should be
-	 * tracked, and that conversion and updating the destination observable's
-	 * state should be performed automatically on every change of the source
-	 * observable state.
-	 */
-	public static int POLICY_UPDATE = notInlined(8);
-
-	/**
-	 * Helper method allowing API evolution of the above constant values. The
-	 * compiler will not inline constant values into client code if values are
-	 * "computed" using this helper.
-	 *
-	 * @param i
-	 *            an integer
-	 * @return the same integer
-	 */
-	private static int notInlined(int i) {
-		return i;
-	}
-
-	protected IConverter converter;
-
-	private int updatePolicy;
-
-	protected boolean provideDefaults;
-
-	/**
-	 * Creates a new update list strategy for automatically updating the
-	 * destination observable list whenever the source observable list changes.
-	 * A default converter will be provided. The defaults can be changed by
-	 * calling one of the setter methods.
-	 */
-	public UpdateListStrategy() {
-		this(true, POLICY_UPDATE);
-	}
-
-	/**
-	 * Creates a new update list strategy with a configurable update policy. A
-	 * default converter will be provided. The defaults can be changed by
-	 * calling one of the setter methods.
-	 *
-	 * @param updatePolicy
-	 *            one of {@link #POLICY_NEVER}, {@link #POLICY_ON_REQUEST}, or
-	 *            {@link #POLICY_UPDATE}
-	 */
-	public UpdateListStrategy(int updatePolicy) {
-		this(true, updatePolicy);
-	}
-
-	/**
-	 * Creates a new update list strategy with a configurable update policy. A
-	 * default converter will be provided if <code>provideDefaults</code> is
-	 * <code>true</code>. The defaults can be changed by calling one of the
-	 * setter methods.
-	 *
-	 * @param provideDefaults
-	 *            if <code>true</code>, default validators and a default
-	 *            converter will be provided based on the observable list's
-	 *            type.
-	 * @param updatePolicy
-	 *            one of {@link #POLICY_NEVER}, {@link #POLICY_ON_REQUEST}, or
-	 *            {@link #POLICY_UPDATE}
-	 */
-	public UpdateListStrategy(boolean provideDefaults, int updatePolicy) {
-		this.provideDefaults = provideDefaults;
-		this.updatePolicy = updatePolicy;
-	}
-
-	/**
-	 * When an element is added to the destination converts the element from the
-	 * source element type to the destination element type.
-	 * <p>
-	 * Default implementation will use the
-	 * {@link #setConverter(IConverter) converter} if one exists. If no
-	 * converter exists no conversion occurs.
-	 * </p>
-	 *
-	 * @param element
-	 * @return the converted element
-	 */
-	public Object convert(Object element) {
-		return converter == null ? element : converter.convert(element);
-	}
-
-	/**
-	 *
-	 * @param source
-	 * @param destination
-	 */
-	protected void fillDefaults(IObservableList source,
-			IObservableList destination) {
-		Object sourceType = source.getElementType();
-		Object destinationType = destination.getElementType();
-		if (provideDefaults && sourceType != null && destinationType != null) {
-			if (converter == null) {
-				setConverter(createConverter(sourceType, destinationType));
-			}
-		}
-		if (converter != null) {
-			if (sourceType != null) {
-				checkAssignable(converter.getFromType(), sourceType,
-						"converter does not convert from type " + sourceType); //$NON-NLS-1$
-			}
-			if (destinationType != null) {
-				checkAssignable(converter.getToType(), destinationType,
-						"converter does not convert to type " + destinationType); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * @return the update policy
-	 */
-	public int getUpdatePolicy() {
-		return updatePolicy;
-	}
-
-	/**
-	 * Sets the converter to be invoked when converting added elements from the
-	 * source element type to the destination element type.
-	 *
-	 * @param converter
-	 * @return the receiver, to enable method call chaining
-	 */
-	public UpdateListStrategy setConverter(IConverter converter) {
-		this.converter = converter;
-		return this;
-	}
-
-	/**
-	 * Adds the given element at the given index to the given observable list.
-	 * Clients may extend but must call the super implementation.
-	 *
-	 * @param observableList
-	 * @param element
-	 * @param index
-	 * @return a status
-	 */
-	protected IStatus doAdd(IObservableList observableList, Object element,
-			int index) {
-		try {
-			observableList.add(index, element);
-		} catch (Exception ex) {
-			return ValidationStatus.error(BindingMessages
-					.getString(BindingMessages.VALUEBINDING_ERROR_WHILE_SETTING_VALUE),
-					ex);
-		}
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Removes the element at the given index from the given observable list.
-	 * Clients may extend but must call the super implementation.
-	 *
-	 * @param observableList
-	 * @param index
-	 * @return a status
-	 */
-	protected IStatus doRemove(IObservableList observableList, int index) {
-		try {
-			observableList.remove(index);
-		} catch (Exception ex) {
-			return ValidationStatus.error(BindingMessages
-					.getString(BindingMessages.VALUEBINDING_ERROR_WHILE_SETTING_VALUE),
-					ex);
-		}
-		return Status.OK_STATUS;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/UpdateSetStrategy.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/UpdateSetStrategy.java
deleted file mode 100644
index 8867bbd..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/UpdateSetStrategy.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 124684)
- *     IBM Corporation - through UpdateListStrategy.java
- ******************************************************************************/
-
-package org.eclipse.core.databinding;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.BindingMessages;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * Customizes a {@link Binding} between two
- * {@link IObservableSet observable sets}. The following behaviors can be
- * customized via the strategy:
- * <ul>
- * <li>Conversion</li>
- * <li>Automatic processing</li>
- * </ul>
- * <p>
- * Conversion:<br/> When elements are added they can be
- * {@link #convert(Object) converted} to the destination element type.
- * </p>
- * <p>
- * Automatic processing:<br/> The processing to perform when the source
- * observable changes. This behavior is configured via policies provided on
- * construction of the strategy (e.g. {@link #POLICY_NEVER},
- * {@link #POLICY_ON_REQUEST}, {@link #POLICY_UPDATE}).
- * </p>
- * 
- * 
- * @see DataBindingContext#bindSet(IObservableSet, IObservableSet,
- *      UpdateSetStrategy, UpdateSetStrategy)
- * @see IConverter
- * @since 1.1
- */
-public class UpdateSetStrategy extends UpdateStrategy {
-
-	/**
-	 * Policy constant denoting that the source observable's state should not be
-	 * tracked and that the destination observable's state should never be
-	 * updated.
-	 */
-	public final static int POLICY_NEVER = notInlined(1);
-
-	/**
-	 * Policy constant denoting that the source observable's state should not be
-	 * tracked, but that conversion and updating the destination observable's
-	 * state should be performed when explicitly requested.
-	 */
-	public final static int POLICY_ON_REQUEST = notInlined(2);
-
-	/**
-	 * Policy constant denoting that the source observable's state should be
-	 * tracked, and that conversion and updating the destination observable's
-	 * state should be performed automatically on every change of the source
-	 * observable state.
-	 */
-	public final static int POLICY_UPDATE = notInlined(8);
-
-	/**
-	 * Helper method allowing API evolution of the above constant values. The
-	 * compiler will not inline constant values into client code if values are
-	 * "computed" using this helper.
-	 * 
-	 * @param i
-	 *            an integer
-	 * @return the same integer
-	 */
-	private static int notInlined(int i) {
-		return i;
-	}
-
-	protected IConverter converter;
-
-	private int updatePolicy;
-
-	protected boolean provideDefaults;
-
-	/**
-	 * Creates a new update list strategy for automatically updating the
-	 * destination observable list whenever the source observable list changes.
-	 * A default converter will be provided. The defaults can be changed by
-	 * calling one of the setter methods.
-	 */
-	public UpdateSetStrategy() {
-		this(true, POLICY_UPDATE);
-	}
-
-	/**
-	 * Creates a new update list strategy with a configurable update policy. A
-	 * default converter will be provided. The defaults can be changed by
-	 * calling one of the setter methods.
-	 * 
-	 * @param updatePolicy
-	 *            one of {@link #POLICY_NEVER}, {@link #POLICY_ON_REQUEST}, or
-	 *            {@link #POLICY_UPDATE}
-	 */
-	public UpdateSetStrategy(int updatePolicy) {
-		this(true, updatePolicy);
-	}
-
-	/**
-	 * Creates a new update list strategy with a configurable update policy. A
-	 * default converter will be provided if <code>provideDefaults</code> is
-	 * <code>true</code>. The defaults can be changed by calling one of the
-	 * setter methods.
-	 * 
-	 * @param provideDefaults
-	 *            if <code>true</code>, default validators and a default
-	 *            converter will be provided based on the observable list's
-	 *            type.
-	 * @param updatePolicy
-	 *            one of {@link #POLICY_NEVER}, {@link #POLICY_ON_REQUEST}, or
-	 *            {@link #POLICY_UPDATE}
-	 */
-	public UpdateSetStrategy(boolean provideDefaults, int updatePolicy) {
-		this.provideDefaults = provideDefaults;
-		this.updatePolicy = updatePolicy;
-	}
-
-	/**
-	 * When an element is added to the destination converts the element from the
-	 * source element type to the destination element type.
-	 * <p>
-	 * Default implementation will use the
-	 * {@link #setConverter(IConverter) converter} if one exists. If no
-	 * converter exists no conversion occurs.
-	 * </p>
-	 * 
-	 * @param element
-	 * @return the converted element
-	 */
-	public Object convert(Object element) {
-		return converter == null ? element : converter.convert(element);
-	}
-
-	/**
-	 * 
-	 * @param source
-	 * @param destination
-	 */
-	protected void fillDefaults(IObservableSet source,
-			IObservableSet destination) {
-		Object sourceType = source.getElementType();
-		Object destinationType = destination.getElementType();
-		if (provideDefaults && sourceType != null && destinationType != null) {
-			if (converter == null) {
-				setConverter(createConverter(sourceType, destinationType));
-			}
-		}
-		if (converter != null) {
-			if (sourceType != null) {
-				checkAssignable(converter.getFromType(), sourceType,
-						"converter does not convert from type " + sourceType); //$NON-NLS-1$
-			}
-			if (destinationType != null) {
-				checkAssignable(converter.getToType(), destinationType,
-						"converter does not convert to type " + destinationType); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * @return the update policy
-	 */
-	public int getUpdatePolicy() {
-		return updatePolicy;
-	}
-
-	/**
-	 * Sets the converter to be invoked when converting added elements from the
-	 * source element type to the destination element type.
-	 * 
-	 * @param converter
-	 * @return the receiver, to enable method call chaining
-	 */
-	public UpdateSetStrategy setConverter(IConverter converter) {
-		this.converter = converter;
-		return this;
-	}
-
-	/**
-	 * Adds the given element at the given index to the given observable list.
-	 * Clients may extend but must call the super implementation.
-	 * 
-	 * @param observableSet
-	 * @param element
-	 * @return a status
-	 */
-	protected IStatus doAdd(IObservableSet observableSet, Object element) {
-		try {
-			observableSet.add(element);
-		} catch (Exception ex) {
-			return ValidationStatus.error(BindingMessages
-					.getString("ValueBinding_ErrorWhileSettingValue"), //$NON-NLS-1$
-					ex);
-		}
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Removes the element at the given index from the given observable list.
-	 * Clients may extend but must call the super implementation.
-	 * 
-	 * @param observableSet
-	 * @param element 
-	 * @return a status
-	 */
-	protected IStatus doRemove(IObservableSet observableSet, Object element) {
-		try {
-			observableSet.remove(element);
-		} catch (Exception ex) {
-			return ValidationStatus.error(BindingMessages
-					.getString("ValueBinding_ErrorWhileSettingValue"), //$NON-NLS-1$
-					ex);
-		}
-		return Status.OK_STATUS;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/UpdateStrategy.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/UpdateStrategy.java
deleted file mode 100644
index 7c1744b..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/UpdateStrategy.java
+++ /dev/null
@@ -1,716 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matt Carter - bug 180392
- *                 - bug 197679 (Character support completed)
- *******************************************************************************/
-
-package org.eclipse.core.databinding;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.databinding.conversion.NumberToStringConverter;
-import org.eclipse.core.databinding.conversion.StringToNumberConverter;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.internal.databinding.ClassLookupSupport;
-import org.eclipse.core.internal.databinding.Pair;
-import org.eclipse.core.internal.databinding.conversion.CharacterToStringConverter;
-import org.eclipse.core.internal.databinding.conversion.IdentityConverter;
-import org.eclipse.core.internal.databinding.conversion.IntegerToStringConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToBigDecimalConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToBigIntegerConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToByteConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToDoubleConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToFloatConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToIntegerConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToLongConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToShortConverter;
-import org.eclipse.core.internal.databinding.conversion.ObjectToStringConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToByteConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToCharacterConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToShortConverter;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.0
- *
- */
-/* package */class UpdateStrategy {
-
-	private static final String BOOLEAN_TYPE = "java.lang.Boolean.TYPE"; //$NON-NLS-1$
-
-	private static final String SHORT_TYPE = "java.lang.Short.TYPE"; //$NON-NLS-1$
-
-	private static final String BYTE_TYPE = "java.lang.Byte.TYPE"; //$NON-NLS-1$
-
-	private static final String DOUBLE_TYPE = "java.lang.Double.TYPE"; //$NON-NLS-1$
-
-	private static final String FLOAT_TYPE = "java.lang.Float.TYPE"; //$NON-NLS-1$
-
-	private static final String INTEGER_TYPE = "java.lang.Integer.TYPE"; //$NON-NLS-1$
-
-	private static final String LONG_TYPE = "java.lang.Long.TYPE"; //$NON-NLS-1$
-
-	private static final String CHARACTER_TYPE = "java.lang.Character.TYPE"; //$NON-NLS-1$
-
-	private static Map converterMap;
-
-	private static Class autoboxed(Class clazz) {
-		if (clazz == Float.TYPE)
-			return Float.class;
-		else if (clazz == Double.TYPE)
-			return Double.class;
-		else if (clazz == Short.TYPE)
-			return Short.class;
-		else if (clazz == Integer.TYPE)
-			return Integer.class;
-		else if (clazz == Long.TYPE)
-			return Long.class;
-		else if (clazz == Byte.TYPE)
-			return Byte.class;
-		else if (clazz == Boolean.TYPE)
-			return Boolean.class;
-		else if (clazz == Character.TYPE)
-			return Character.class;
-		return clazz;
-	}
-
-	final protected void checkAssignable(Object toType, Object fromType,
-			String errorString) {
-		Boolean assignableFromModelToModelConverter = isAssignableFromTo(
-				fromType, toType);
-		if (assignableFromModelToModelConverter != null
-				&& !assignableFromModelToModelConverter.booleanValue()) {
-			throw new BindingException(errorString
-					+ " Expected: " + fromType + ", actual: " + toType); //$NON-NLS-1$//$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * Tries to create a converter that can convert from values of type
-	 * fromType. Returns <code>null</code> if no converter could be created.
-	 * Either toType or modelDescription can be <code>null</code>, but not
-	 * both.
-	 *
-	 * @param fromType
-	 * @param toType
-	 * @return an IConverter, or <code>null</code> if unsuccessful
-	 */
-	protected IConverter createConverter(Object fromType, Object toType) {
-		if (!(fromType instanceof Class) || !(toType instanceof Class)) {
-			return new DefaultConverter(fromType, toType);
-		}
-		Class toClass = (Class) toType;
-		Class originalToClass = toClass;
-		if (toClass.isPrimitive()) {
-			toClass = autoboxed(toClass);
-		}
-		Class fromClass = (Class) fromType;
-		Class originalFromClass = fromClass;
-		if (fromClass.isPrimitive()) {
-			fromClass = autoboxed(fromClass);
-		}
-		if (!((Class) toType).isPrimitive()
-				&& toClass.isAssignableFrom(fromClass)) {
-			return new IdentityConverter(originalFromClass, originalToClass);
-		}
-		if (((Class) fromType).isPrimitive() && ((Class) toType).isPrimitive()
-				&& fromType.equals(toType)) {
-			return new IdentityConverter(originalFromClass, originalToClass);
-		}
-		Map converterMap = getConverterMap();
-		Class[] supertypeHierarchyFlattened = ClassLookupSupport
-				.getTypeHierarchyFlattened(fromClass);
-		for (int i = 0; i < supertypeHierarchyFlattened.length; i++) {
-			Class currentFromClass = supertypeHierarchyFlattened[i];
-			if (currentFromClass == toType) {
-				// converting to toType is just a widening
-				return new IdentityConverter(fromClass, toClass);
-			}
-			Pair key = new Pair(getKeyForClass(fromType, currentFromClass),
-					getKeyForClass(toType, toClass));
-			Object converterOrClassname = converterMap.get(key);
-			if (converterOrClassname instanceof IConverter) {
-				return (IConverter) converterOrClassname;
-			} else if (converterOrClassname instanceof String) {
-				String classname = (String) converterOrClassname;
-				Class converterClass;
-				try {
-					converterClass = Class.forName(classname);
-					IConverter result = (IConverter) converterClass
-							.newInstance();
-					converterMap.put(key, result);
-					return result;
-				} catch (Exception e) {
-					Policy
-							.getLog()
-							.log(
-									new Status(
-											IStatus.ERROR,
-											Policy.JFACE_DATABINDING,
-											0,
-											"Error while instantiating default converter", e)); //$NON-NLS-1$
-				}
-			}
-		}
-		// Since we found no converter yet, try a "downcast" converter;
-		// the IdentityConverter will automatically check the actual types at
-		// runtime.
-		if (fromClass.isAssignableFrom(toClass)) {
-			return new IdentityConverter(originalFromClass, originalToClass);
-		}
-		return new DefaultConverter(fromType, toType);
-	}
-
-	private synchronized static Map getConverterMap() {
-		// using string-based lookup avoids loading of too many classes
-		if (converterMap == null) {
-			// NumberFormat to be shared across converters for the formatting of
-			// integer values
-			NumberFormat integerFormat = NumberFormat.getIntegerInstance();
-			// NumberFormat to be shared across converters for formatting non
-			// integer values
-			NumberFormat numberFormat = NumberFormat.getNumberInstance();
-
-			converterMap = new HashMap();
-			// Standard and Boxed Types
-			converterMap
-					.put(
-							new Pair("java.util.Date", "java.lang.String"), "org.eclipse.core.internal.databinding.conversion.DateToStringConverter"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			converterMap
-					.put(
-							new Pair("java.lang.String", "java.lang.Boolean"), "org.eclipse.core.internal.databinding.conversion.StringToBooleanConverter"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-			converterMap
-					.put(
-							new Pair("java.lang.String", "java.lang.Byte"), StringToByteConverter.toByte(integerFormat, false)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.lang.String", "java.util.Date"), "org.eclipse.core.internal.databinding.conversion.StringToDateConverter"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-			converterMap
-					.put(
-							new Pair("java.lang.String", "java.lang.Short"), StringToShortConverter.toShort(integerFormat, false)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.lang.String", "java.lang.Character"), StringToCharacterConverter.toCharacter(false)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.lang.String", "java.lang.Integer"), StringToNumberConverter.toInteger(integerFormat, false)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.lang.String", "java.lang.Double"), StringToNumberConverter.toDouble(numberFormat, false)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.lang.String", "java.lang.Long"), StringToNumberConverter.toLong(integerFormat, false)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.lang.String", "java.lang.Float"), StringToNumberConverter.toFloat(numberFormat, false)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.lang.String", "java.math.BigInteger"), StringToNumberConverter.toBigInteger(integerFormat)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.lang.String", "java.math.BigDecimal"), StringToNumberConverter.toBigDecimal(numberFormat)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.lang.Integer", "java.lang.String"), NumberToStringConverter.fromInteger(integerFormat, false)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.lang.Long", "java.lang.String"), NumberToStringConverter.fromLong(integerFormat, false)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.lang.Double", "java.lang.String"), NumberToStringConverter.fromDouble(numberFormat, false)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.lang.Float", "java.lang.String"), NumberToStringConverter.fromFloat(numberFormat, false)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.math.BigInteger", "java.lang.String"), NumberToStringConverter.fromBigInteger(integerFormat)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.math.BigDecimal", "java.lang.String"), NumberToStringConverter.fromBigDecimal(numberFormat)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.lang.Byte", "java.lang.String"), IntegerToStringConverter.fromByte(integerFormat, false)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.lang.Short", "java.lang.String"), IntegerToStringConverter.fromShort(integerFormat, false)); //$NON-NLS-1$//$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair("java.lang.Character", "java.lang.String"), CharacterToStringConverter.fromCharacter(false)); //$NON-NLS-1$//$NON-NLS-2$
-
-			converterMap
-					.put(
-							new Pair("java.lang.Object", "java.lang.String"), "org.eclipse.core.internal.databinding.conversion.ObjectToStringConverter"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-
-			// Integer.TYPE
-			converterMap
-					.put(
-							new Pair("java.lang.String", INTEGER_TYPE), StringToNumberConverter.toInteger(integerFormat, true)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(INTEGER_TYPE, "java.lang.Integer"), new IdentityConverter(Integer.TYPE, Integer.class)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(INTEGER_TYPE, "java.lang.Object"), new IdentityConverter(Integer.TYPE, Object.class)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(INTEGER_TYPE, "java.lang.String"), NumberToStringConverter.fromInteger(integerFormat, true)); //$NON-NLS-1$
-
-			// Byte.TYPE
-			converterMap
-					.put(
-							new Pair("java.lang.String", BYTE_TYPE), StringToByteConverter.toByte(integerFormat, true)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(BYTE_TYPE, "java.lang.Byte"), new IdentityConverter(Byte.TYPE, Byte.class)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(BYTE_TYPE, "java.lang.String"), IntegerToStringConverter.fromByte(integerFormat, true)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(BYTE_TYPE, "java.lang.Object"), new IdentityConverter(Byte.TYPE, Object.class)); //$NON-NLS-1$
-
-			// Double.TYPE
-			converterMap
-					.put(
-							new Pair("java.lang.String", DOUBLE_TYPE), StringToNumberConverter.toDouble(numberFormat, true)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(DOUBLE_TYPE, "java.lang.String"), NumberToStringConverter.fromDouble(numberFormat, true)); //$NON-NLS-1$
-
-			converterMap
-					.put(
-							new Pair(DOUBLE_TYPE, "java.lang.Double"), new IdentityConverter(Double.TYPE, Double.class)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(DOUBLE_TYPE, "java.lang.Object"), new IdentityConverter(Double.TYPE, Object.class)); //$NON-NLS-1$
-
-			// Boolean.TYPE
-			converterMap
-					.put(
-							new Pair("java.lang.String", BOOLEAN_TYPE), "org.eclipse.core.internal.databinding.conversion.StringToBooleanPrimitiveConverter"); //$NON-NLS-1$ //$NON-NLS-2$
-			converterMap
-					.put(
-							new Pair(BOOLEAN_TYPE, "java.lang.Boolean"), new IdentityConverter(Boolean.TYPE, Boolean.class)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(BOOLEAN_TYPE, "java.lang.String"), new ObjectToStringConverter(Boolean.TYPE)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(BOOLEAN_TYPE, "java.lang.Object"), new IdentityConverter(Boolean.TYPE, Object.class)); //$NON-NLS-1$
-
-			// Float.TYPE
-			converterMap
-					.put(
-							new Pair("java.lang.String", FLOAT_TYPE), StringToNumberConverter.toFloat(numberFormat, true)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(FLOAT_TYPE, "java.lang.String"), NumberToStringConverter.fromFloat(numberFormat, true)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(FLOAT_TYPE, "java.lang.Float"), new IdentityConverter(Float.TYPE, Float.class)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(FLOAT_TYPE, "java.lang.Object"), new IdentityConverter(Float.TYPE, Object.class)); //$NON-NLS-1$
-
-			// Short.TYPE
-			converterMap
-					.put(
-							new Pair("java.lang.String", SHORT_TYPE), StringToShortConverter.toShort(integerFormat, true)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(SHORT_TYPE, "java.lang.Short"), new IdentityConverter(Short.TYPE, Short.class)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(SHORT_TYPE, "java.lang.String"), IntegerToStringConverter.fromShort(integerFormat, true)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(SHORT_TYPE, "java.lang.Object"), new IdentityConverter(Short.TYPE, Object.class)); //$NON-NLS-1$
-
-			// Long.TYPE
-			converterMap
-					.put(
-							new Pair("java.lang.String", LONG_TYPE), StringToNumberConverter.toLong(integerFormat, true)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(LONG_TYPE, "java.lang.String"), NumberToStringConverter.fromLong(integerFormat, true)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(LONG_TYPE, "java.lang.Long"), new IdentityConverter(Long.TYPE, Long.class)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(LONG_TYPE, "java.lang.Object"), new IdentityConverter(Long.TYPE, Object.class)); //$NON-NLS-1$
-
-			// Character.TYPE
-			converterMap
-					.put(
-							new Pair("java.lang.String", CHARACTER_TYPE), StringToCharacterConverter.toCharacter(true)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(CHARACTER_TYPE, "java.lang.Character"), new IdentityConverter(Character.TYPE, Character.class)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(CHARACTER_TYPE, "java.lang.String"), CharacterToStringConverter.fromCharacter(true)); //$NON-NLS-1$
-			converterMap
-					.put(
-							new Pair(CHARACTER_TYPE, "java.lang.Object"), new IdentityConverter(Character.TYPE, Object.class)); //$NON-NLS-1$
-
-			// Miscellaneous
-			converterMap
-					.put(
-							new Pair(
-									"org.eclipse.core.runtime.IStatus", "java.lang.String"), "org.eclipse.core.internal.databinding.conversion.StatusToStringConverter"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-
-			addNumberToByteConverters(converterMap, integerFormat,
-					integerClasses);
-			addNumberToByteConverters(converterMap, numberFormat, floatClasses);
-
-			addNumberToShortConverters(converterMap, integerFormat,
-					integerClasses);
-			addNumberToShortConverters(converterMap, numberFormat, floatClasses);
-
-			addNumberToIntegerConverters(converterMap, integerFormat,
-					integerClasses);
-			addNumberToIntegerConverters(converterMap, numberFormat,
-					floatClasses);
-
-			addNumberToLongConverters(converterMap, integerFormat,
-					integerClasses);
-			addNumberToLongConverters(converterMap, numberFormat, floatClasses);
-
-			addNumberToFloatConverters(converterMap, integerFormat,
-					integerClasses);
-			addNumberToFloatConverters(converterMap, numberFormat, floatClasses);
-
-			addNumberToDoubleConverters(converterMap, integerFormat,
-					integerClasses);
-			addNumberToDoubleConverters(converterMap, numberFormat,
-					floatClasses);
-
-			addNumberToBigIntegerConverters(converterMap, integerFormat,
-					integerClasses);
-			addNumberToBigIntegerConverters(converterMap, numberFormat,
-					floatClasses);
-
-			addNumberToBigDecimalConverters(converterMap, integerFormat,
-					integerClasses);
-			addNumberToBigDecimalConverters(converterMap, numberFormat,
-					floatClasses);
-		}
-
-		return converterMap;
-	}
-
-	private static final Class[] integerClasses = new Class[] { Byte.TYPE,
-			Byte.class, Short.TYPE, Short.class, Integer.TYPE, Integer.class,
-			Long.TYPE, Long.class, BigInteger.class };
-
-	private static final Class[] floatClasses = new Class[] { Float.TYPE,
-			Float.class, Double.TYPE, Double.class, BigDecimal.class };
-
-	/**
-	 * Registers converters to boxed and unboxed types from a list of from
-	 * classes.
-	 *
-	 * @param map
-	 * @param numberFormat
-	 * @param fromTypes
-	 */
-	private static void addNumberToByteConverters(Map map,
-			NumberFormat numberFormat, Class[] fromTypes) {
-
-		for (int i = 0; i < fromTypes.length; i++) {
-			Class fromType = fromTypes[i];
-			if (!fromType.equals(Byte.class) && !fromType.equals(Byte.TYPE)) {
-				String fromName = (fromType.isPrimitive()) ? getKeyForClass(
-						fromType, null) : fromType.getName();
-
-				map
-						.put(new Pair(fromName, BYTE_TYPE),
-								new NumberToByteConverter(numberFormat,
-										fromType, true));
-				map
-						.put(new Pair(fromName, Byte.class.getName()),
-								new NumberToByteConverter(numberFormat,
-										fromType, false));
-			}
-		}
-	}
-
-	/**
-	 * Registers converters to boxed and unboxed types from a list of from
-	 * classes.
-	 *
-	 * @param map
-	 * @param numberFormat
-	 * @param fromTypes
-	 */
-	private static void addNumberToShortConverters(Map map,
-			NumberFormat numberFormat, Class[] fromTypes) {
-		for (int i = 0; i < fromTypes.length; i++) {
-			Class fromType = fromTypes[i];
-			if (!fromType.equals(Short.class) && !fromType.equals(Short.TYPE)) {
-				String fromName = (fromType.isPrimitive()) ? getKeyForClass(
-						fromType, null) : fromType.getName();
-
-				map
-						.put(new Pair(fromName, SHORT_TYPE),
-								new NumberToShortConverter(numberFormat,
-										fromType, true));
-				map.put(new Pair(fromName, Short.class.getName()),
-						new NumberToShortConverter(numberFormat, fromType,
-								false));
-			}
-		}
-	}
-
-	/**
-	 * Registers converters to boxed and unboxed types from a list of from
-	 * classes.
-	 *
-	 * @param map
-	 * @param numberFormat
-	 * @param fromTypes
-	 */
-	private static void addNumberToIntegerConverters(Map map,
-			NumberFormat numberFormat, Class[] fromTypes) {
-		for (int i = 0; i < fromTypes.length; i++) {
-			Class fromType = fromTypes[i];
-			if (!fromType.equals(Integer.class)
-					&& !fromType.equals(Integer.TYPE)) {
-				String fromName = (fromType.isPrimitive()) ? getKeyForClass(
-						fromType, null) : fromType.getName();
-
-				map.put(new Pair(fromName, INTEGER_TYPE),
-						new NumberToIntegerConverter(numberFormat, fromType,
-								true));
-				map.put(new Pair(fromName, Integer.class.getName()),
-						new NumberToIntegerConverter(numberFormat, fromType,
-								false));
-			}
-		}
-	}
-
-	/**
-	 * Registers converters to boxed and unboxed types from a list of from
-	 * classes.
-	 *
-	 * @param map
-	 * @param numberFormat
-	 * @param fromTypes
-	 */
-	private static void addNumberToLongConverters(Map map,
-			NumberFormat numberFormat, Class[] fromTypes) {
-		for (int i = 0; i < fromTypes.length; i++) {
-			Class fromType = fromTypes[i];
-			if (!fromType.equals(Long.class) && !fromType.equals(Long.TYPE)) {
-				String fromName = (fromType.isPrimitive()) ? getKeyForClass(
-						fromType, null) : fromType.getName();
-
-				map
-						.put(new Pair(fromName, LONG_TYPE),
-								new NumberToLongConverter(numberFormat,
-										fromType, true));
-				map
-						.put(new Pair(fromName, Long.class.getName()),
-								new NumberToLongConverter(numberFormat,
-										fromType, false));
-			}
-		}
-	}
-
-	/**
-	 * Registers converters to boxed and unboxed types from a list of from
-	 * classes.
-	 *
-	 * @param map
-	 * @param numberFormat
-	 * @param fromTypes
-	 */
-	private static void addNumberToFloatConverters(Map map,
-			NumberFormat numberFormat, Class[] fromTypes) {
-		for (int i = 0; i < fromTypes.length; i++) {
-			Class fromType = fromTypes[i];
-			if (!fromType.equals(Float.class) && !fromType.equals(Float.TYPE)) {
-				String fromName = (fromType.isPrimitive()) ? getKeyForClass(
-						fromType, null) : fromType.getName();
-
-				map
-						.put(new Pair(fromName, FLOAT_TYPE),
-								new NumberToFloatConverter(numberFormat,
-										fromType, true));
-				map.put(new Pair(fromName, Float.class.getName()),
-						new NumberToFloatConverter(numberFormat, fromType,
-								false));
-			}
-		}
-	}
-
-	/**
-	 * Registers converters to boxed and unboxed types from a list of from
-	 * classes.
-	 *
-	 * @param map
-	 * @param numberFormat
-	 * @param fromTypes
-	 */
-	private static void addNumberToDoubleConverters(Map map,
-			NumberFormat numberFormat, Class[] fromTypes) {
-		for (int i = 0; i < fromTypes.length; i++) {
-			Class fromType = fromTypes[i];
-			if (!fromType.equals(Double.class) && !fromType.equals(Double.TYPE)) {
-				String fromName = (fromType.isPrimitive()) ? getKeyForClass(
-						fromType, null) : fromType.getName();
-
-				map.put(new Pair(fromName, DOUBLE_TYPE),
-						new NumberToDoubleConverter(numberFormat, fromType,
-								true));
-				map.put(new Pair(fromName, Double.class.getName()),
-						new NumberToDoubleConverter(numberFormat, fromType,
-								false));
-			}
-		}
-	}
-
-	/**
-	 * Registers converters to boxed and unboxed types from a list of from
-	 * classes.
-	 *
-	 * @param map
-	 * @param numberFormat
-	 * @param fromTypes
-	 */
-	private static void addNumberToBigIntegerConverters(Map map,
-			NumberFormat numberFormat, Class[] fromTypes) {
-		for (int i = 0; i < fromTypes.length; i++) {
-			Class fromType = fromTypes[i];
-			if (!fromType.equals(BigInteger.class)) {
-				String fromName = (fromType.isPrimitive()) ? getKeyForClass(
-						fromType, null) : fromType.getName();
-
-				map
-						.put(new Pair(fromName, BigInteger.class.getName()),
-								new NumberToBigIntegerConverter(numberFormat,
-										fromType));
-			}
-		}
-	}
-
-	/**
-	 * Registers converters to boxed and unboxed types from a list of from
-	 * classes.
-	 *
-	 * @param map
-	 * @param numberFormat
-	 * @param fromTypes
-	 */
-	private static void addNumberToBigDecimalConverters(Map map,
-			NumberFormat numberFormat, Class[] fromTypes) {
-		for (int i = 0; i < fromTypes.length; i++) {
-			Class fromType = fromTypes[i];
-			if (!fromType.equals(BigDecimal.class)) {
-				String fromName = (fromType.isPrimitive()) ? getKeyForClass(
-						fromType, null) : fromType.getName();
-
-				map
-						.put(new Pair(fromName, BigDecimal.class.getName()),
-								new NumberToBigDecimalConverter(numberFormat,
-										fromType));
-			}
-		}
-	}
-
-	private static String getKeyForClass(Object originalValue,
-			Class filteredValue) {
-		if (originalValue instanceof Class) {
-			Class originalClass = (Class) originalValue;
-			if (originalClass.equals(Integer.TYPE)) {
-				return INTEGER_TYPE;
-			} else if (originalClass.equals(Byte.TYPE)) {
-				return BYTE_TYPE;
-			} else if (originalClass.equals(Boolean.TYPE)) {
-				return BOOLEAN_TYPE;
-			} else if (originalClass.equals(Double.TYPE)) {
-				return DOUBLE_TYPE;
-			} else if (originalClass.equals(Float.TYPE)) {
-				return FLOAT_TYPE;
-			} else if (originalClass.equals(Long.TYPE)) {
-				return LONG_TYPE;
-			} else if (originalClass.equals(Short.TYPE)) {
-				return SHORT_TYPE;
-			}
-		}
-		return filteredValue.getName();
-	}
-
-	/**
-	 * Returns {@link Boolean#TRUE} if the from type is assignable to the to
-	 * type, or {@link Boolean#FALSE} if it not, or <code>null</code> if
-	 * unknown.
-	 * 
-	 * @param fromType
-	 * @param toType
-	 * @return whether fromType is assignable to toType, or <code>null</code>
-	 *         if unknown
-	 */
-	protected Boolean isAssignableFromTo(Object fromType, Object toType) {
-		if (fromType instanceof Class && toType instanceof Class) {
-			Class toClass = (Class) toType;
-			if (toClass.isPrimitive()) {
-				toClass = autoboxed(toClass);
-			}
-			Class fromClass = (Class) fromType;
-			if (fromClass.isPrimitive()) {
-				fromClass = autoboxed(fromClass);
-			}
-			return toClass.isAssignableFrom(fromClass) ? Boolean.TRUE
-					: Boolean.FALSE;
-		}
-		return null;
-	}
-
-	/*
-	 * Default converter implementation, does not perform any conversion.
-	 */
-	protected static final class DefaultConverter implements IConverter {
-
-		private final Object toType;
-
-		private final Object fromType;
-
-		/**
-		 * @param fromType
-		 * @param toType
-		 */
-		DefaultConverter(Object fromType, Object toType) {
-			this.toType = toType;
-			this.fromType = fromType;
-		}
-
-		public Object convert(Object fromObject) {
-			return fromObject;
-		}
-
-		public Object getFromType() {
-			return fromType;
-		}
-
-		public Object getToType() {
-			return toType;
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/UpdateValueStrategy.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/UpdateValueStrategy.java
deleted file mode 100644
index 22a7a35..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/UpdateValueStrategy.java
+++ /dev/null
@@ -1,580 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matt Carter - Character support completed (bug 197679)
- *     Tom Schindl<tom.schindl@bestsolution.at> - bugfix for 217940
- *******************************************************************************/
-
-package org.eclipse.core.databinding;
-
-import java.util.Date;
-import java.util.HashMap;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.BindingMessages;
-import org.eclipse.core.internal.databinding.Pair;
-import org.eclipse.core.internal.databinding.conversion.NumberToBigDecimalConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToBigIntegerConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToByteConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToDoubleConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToFloatConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToIntegerConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToLongConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToNumberConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToShortConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToCharacterConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToDateConverter;
-import org.eclipse.core.internal.databinding.validation.NumberFormatConverter;
-import org.eclipse.core.internal.databinding.validation.NumberToByteValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToDoubleValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToFloatValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToIntegerValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToLongValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToShortValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToUnboundedNumberValidator;
-import org.eclipse.core.internal.databinding.validation.ObjectToPrimitiveValidator;
-import org.eclipse.core.internal.databinding.validation.StringToByteValidator;
-import org.eclipse.core.internal.databinding.validation.StringToCharacterValidator;
-import org.eclipse.core.internal.databinding.validation.StringToDateValidator;
-import org.eclipse.core.internal.databinding.validation.StringToDoubleValidator;
-import org.eclipse.core.internal.databinding.validation.StringToFloatValidator;
-import org.eclipse.core.internal.databinding.validation.StringToIntegerValidator;
-import org.eclipse.core.internal.databinding.validation.StringToLongValidator;
-import org.eclipse.core.internal.databinding.validation.StringToShortValidator;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * Customizes a {@link Binding} between two
- * {@link IObservableValue observable values}. The following behaviors can be
- * customized via the strategy:
- * <ul>
- * <li>Validation</li>
- * <li>Conversion</li>
- * <li>Automatic processing</li>
- * </ul>
- * <p>
- * The update phases are:
- * <ol>
- * <li>Validate after get - {@link #validateAfterGet(Object)}</li>
- * <li>Conversion - {@link #convert(Object)}</li>
- * <li>Validate after conversion - {@link #validateAfterConvert(Object)}</li>
- * <li>Validate before set - {@link #validateBeforeSet(Object)}</li>
- * <li>Value set - {@link #doSet(IObservableValue, Object)}</li>
- * </ol>
- * </p>
- * <p>
- * Validation:<br/> {@link IValidator Validators} validate the value at
- * multiple phases in the update process. Statuses returned from validators are
- * aggregated into a <code>MultiStatus</code> until a status of
- * <code>ERROR</code> or <code>CANCEL</code> is encountered. Either of these
- * statuses will abort the update process. These statuses are available as the
- * {@link Binding#getValidationStatus() binding validation status}.
- * </p>
- * <p>
- * Conversion:<br/> A {@link IConverter converter} will convert the value from
- * the type of the source observable into the type of the destination. The
- * strategy has the ability to default converters for common scenarios.
- * </p>
- * <p>
- * Automatic processing:<br/> The processing to perform when the source
- * observable changes. This behavior is configured via policies provided on
- * construction of the strategy (e.g. {@link #POLICY_NEVER},
- * {@link #POLICY_CONVERT}, {@link #POLICY_ON_REQUEST}, {@link #POLICY_UPDATE}).
- * </p>
- *
- * @see DataBindingContext#bindValue(IObservableValue, IObservableValue,
- *      UpdateValueStrategy, UpdateValueStrategy)
- * @see Binding#getValidationStatus()
- * @see IValidator
- * @see IConverter
- * @since 1.0
- */
-public class UpdateValueStrategy extends UpdateStrategy {
-
-	/**
-	 * Policy constant denoting that the source observable's state should not be
-	 * tracked and that the destination observable's value should never be
-	 * updated.
-	 */
-	public static int POLICY_NEVER = notInlined(1);
-
-	/**
-	 * Policy constant denoting that the source observable's state should not be
-	 * tracked, but that validation, conversion and updating the destination
-	 * observable's value should be performed when explicitly requested.
-	 */
-	public static int POLICY_ON_REQUEST = notInlined(2);
-
-	/**
-	 * Policy constant denoting that the source observable's state should be
-	 * tracked, including validating changes except for
-	 * {@link #validateBeforeSet(Object)}, but that the destination
-	 * observable's value should only be updated on request.
-	 */
-	public static int POLICY_CONVERT = notInlined(4);
-
-	/**
-	 * Policy constant denoting that the source observable's state should be
-	 * tracked, and that validation, conversion and updating the destination
-	 * observable's value should be performed automaticlly on every change of
-	 * the source observable value.
-	 */
-	public static int POLICY_UPDATE = notInlined(8);
-
-	/**
-	 * Helper method allowing API evolution of the above constant values. The
-	 * compiler will not inline constant values into client code if values are
-	 * "computed" using this helper.
-	 *
-	 * @param i
-	 *            an integer
-	 * @return the same integer
-	 */
-	private static int notInlined(int i) {
-		return i;
-	}
-
-	protected IValidator afterGetValidator;
-	protected IValidator afterConvertValidator;
-	protected IValidator beforeSetValidator;
-	protected IConverter converter;
-
-	private int updatePolicy;
-
-	private static ValidatorRegistry validatorRegistry = new ValidatorRegistry();
-	private static HashMap validatorsByConverter = new HashMap();
-
-	protected boolean provideDefaults;
-
-	/**
-	 * <code>true</code> if we defaulted the converter
-	 */
-	private boolean defaultedConverter = false;
-
-	/**
-	 * Creates a new update value strategy for automatically updating the
-	 * destination observable value whenever the source observable value
-	 * changes. Default validators and a default converter will be provided. The
-	 * defaults can be changed by calling one of the setter methods.
-	 */
-	public UpdateValueStrategy() {
-		this(true, POLICY_UPDATE);
-	}
-
-	/**
-	 * Creates a new update value strategy with a configurable update policy.
-	 * Default validators and a default converter will be provided. The defaults
-	 * can be changed by calling one of the setter methods.
-	 *
-	 * @param updatePolicy
-	 *            one of {@link #POLICY_NEVER}, {@link #POLICY_ON_REQUEST},
-	 *            {@link #POLICY_CONVERT}, or {@link #POLICY_UPDATE}
-	 */
-	public UpdateValueStrategy(int updatePolicy) {
-		this(true, updatePolicy);
-	}
-
-	/**
-	 * Creates a new update value strategy with a configurable update policy.
-	 * Default validators and a default converter will be provided if
-	 * <code>provideDefaults</code> is <code>true</code>. The defaults can
-	 * be changed by calling one of the setter methods.
-	 *
-	 * @param provideDefaults
-	 *            if <code>true</code>, default validators and a default
-	 *            converter will be provided based on the observable value's
-	 *            type.
-	 * @param updatePolicy
-	 *            one of {@link #POLICY_NEVER}, {@link #POLICY_ON_REQUEST},
-	 *            {@link #POLICY_CONVERT}, or {@link #POLICY_UPDATE}
-	 */
-	public UpdateValueStrategy(boolean provideDefaults, int updatePolicy) {
-		this.provideDefaults = provideDefaults;
-		this.updatePolicy = updatePolicy;
-	}
-
-	/**
-	 * Converts the value from the source type to the destination type.
-	 * <p>
-	 * Default implementation will use the
-	 * {@link #setConverter(IConverter) converter} if one exists. If no
-	 * converter exists no conversion occurs.
-	 * </p>
-	 *
-	 * @param value
-	 * @return the converted value
-	 */
-	public Object convert(Object value) {
-		return converter == null ? value : converter.convert(value);
-	}
-
-	/**
-	 * Tries to create a validator that can validate values of type fromType.
-	 * Returns <code>null</code> if no validator could be created. Either
-	 * toType or modelDescription can be <code>null</code>, but not both.
-	 *
-	 * @param fromType
-	 * @param toType
-	 * @return an IValidator, or <code>null</code> if unsuccessful
-	 */
-	protected IValidator createValidator(Object fromType, Object toType) {
-		if (fromType == null || toType == null) {
-			return new IValidator() {
-
-				public IStatus validate(Object value) {
-					return Status.OK_STATUS;
-				}
-			};
-		}
-
-		return findValidator(fromType, toType);
-	}
-
-	/**
-	 * Fills out default values based upon the provided <code>source</code>
-	 * and <code>destination</code>. If the strategy is to default values it
-	 * will attempt to default a converter. If the converter can be defaulted an
-	 * attempt is made to default the
-	 * {@link #validateAfterGet(Object) after get validator}. If a validator
-	 * cannot be defaulted it will be <code>null</code>.
-	 *
-	 * @param source
-	 * @param destination
-	 */
-	protected void fillDefaults(IObservableValue source,
-			IObservableValue destination) {
-		Object sourceType = source.getValueType();
-		Object destinationType = destination.getValueType();
-		if (provideDefaults && sourceType != null && destinationType != null) {
-			if (converter == null) {
-				IConverter converter = createConverter(sourceType,
-						destinationType);
-				defaultedConverter = (converter != null);
-				setConverter(converter);
-			}
-
-			if (afterGetValidator == null) {
-				afterGetValidator = createValidator(sourceType, destinationType);
-			}
-		}
-		if (converter != null) {
-			if (sourceType != null) {
-				checkAssignable(converter.getFromType(), sourceType,
-						"converter does not convert from type " + sourceType); //$NON-NLS-1$
-			}
-			if (destinationType != null) {
-				checkAssignable(converter.getToType(), destinationType,
-						"converter does not convert to type " + destinationType); //$NON-NLS-1$
-			}
-		}
-	}
-
-	private IValidator findValidator(Object fromType, Object toType) {
-		IValidator result = null;
-
-		// We only default the validator if we defaulted the converter since the
-		// two are tightly coupled.
-		if (defaultedConverter) {
-			if (String.class.equals(fromType)) {
-				result = (IValidator) validatorsByConverter.get(converter);
-
-				if (result == null) {
-					// TODO sring based lookup
-					if (Integer.class.equals(toType)
-							|| Integer.TYPE.equals(toType)) {
-						result = new StringToIntegerValidator(
-								(NumberFormatConverter) converter);
-					} else if (Long.class.equals(toType)
-							|| Long.TYPE.equals(toType)) {
-						result = new StringToLongValidator(
-								(NumberFormatConverter) converter);
-					} else if (Float.class.equals(toType)
-							|| Float.TYPE.equals(toType)) {
-						result = new StringToFloatValidator(
-								(NumberFormatConverter) converter);
-					} else if (Double.class.equals(toType)
-							|| Double.TYPE.equals(toType)) {
-						result = new StringToDoubleValidator(
-								(NumberFormatConverter) converter);
-					} else if (Byte.class.equals(toType)
-							|| Byte.TYPE.equals(toType)) {
-						result = new StringToByteValidator(
-								(NumberFormatConverter) converter);
-					} else if (Short.class.equals(toType)
-							|| Short.TYPE.equals(toType)) {
-						result = new StringToShortValidator(
-								(NumberFormatConverter) converter);
-					} else if (Character.class.equals(toType)
-							|| Character.TYPE.equals(toType)
-							&& converter instanceof StringToCharacterConverter) {
-						result = new StringToCharacterValidator(
-								(StringToCharacterConverter) converter);
-					} else if (Date.class.equals(toType)
-							&& converter instanceof StringToDateConverter) {
-						result = new StringToDateValidator(
-								(StringToDateConverter) converter);
-					}
-
-					if (result != null) {
-						validatorsByConverter.put(converter, result);
-					}
-				}
-			} else if (converter instanceof NumberToNumberConverter) {
-				result = (IValidator) validatorsByConverter.get(converter);
-
-				if (result == null) {
-					if (converter instanceof NumberToByteConverter) {
-						result = new NumberToByteValidator(
-								(NumberToByteConverter) converter);
-					} else if (converter instanceof NumberToShortConverter) {
-						result = new NumberToShortValidator(
-								(NumberToShortConverter) converter);
-					} else if (converter instanceof NumberToIntegerConverter) {
-						result = new NumberToIntegerValidator(
-								(NumberToIntegerConverter) converter);
-					} else if (converter instanceof NumberToLongConverter) {
-						result = new NumberToLongValidator(
-								(NumberToLongConverter) converter);
-					} else if (converter instanceof NumberToFloatConverter) {
-						result = new NumberToFloatValidator(
-								(NumberToFloatConverter) converter);
-					} else if (converter instanceof NumberToDoubleConverter) {
-						result = new NumberToDoubleValidator(
-								(NumberToDoubleConverter) converter);
-					} else if (converter instanceof NumberToBigIntegerConverter
-							|| converter instanceof NumberToBigDecimalConverter) {
-						result = new NumberToUnboundedNumberValidator(
-								(NumberToNumberConverter) converter);
-					}
-				}
-			}
-
-			if (result == null) {
-				// TODO string based lookup
-				result = validatorRegistry.get(fromType, toType);
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * @return the update policy
-	 */
-	public int getUpdatePolicy() {
-		return updatePolicy;
-	}
-
-	/**
-	 * Sets the validator to be invoked after the source value is converted to
-	 * the type of the destination observable.
-	 *
-	 * @param validator
-	 * @return the receiver, to enable method call chaining
-	 */
-	public UpdateValueStrategy setAfterConvertValidator(IValidator validator) {
-		this.afterConvertValidator = validator;
-		return this;
-	}
-
-	/**
-	 * Sets the validator to be invoked after the source value is retrieved at
-	 * the beginning of the synchronization process.
-	 *
-	 * @param validator
-	 * @return the receiver, to enable method call chaining
-	 */
-	public UpdateValueStrategy setAfterGetValidator(IValidator validator) {
-		this.afterGetValidator = validator;
-		return this;
-	}
-
-	/**
-	 * Sets the validator to be invoked before the value is to be set on the
-	 * destination at the end of the synchronization process.
-	 *
-	 * @param validator
-	 * @return the receiver, to enable method call chaining
-	 */
-	public UpdateValueStrategy setBeforeSetValidator(IValidator validator) {
-		this.beforeSetValidator = validator;
-		return this;
-	}
-
-	/**
-	 * Sets the converter to be invoked when converting from the source type to
-	 * the destination type.
-	 *
-	 * @param converter
-	 * @return the receiver, to enable method call chaining
-	 */
-	public UpdateValueStrategy setConverter(IConverter converter) {
-		this.converter = converter;
-		return this;
-	}
-
-	/**
-	 * Validates the value after it is converted.
-	 * <p>
-	 * Default implementation will use the
-	 * {@link #setAfterConvertValidator(IValidator) validator} if one exists. If
-	 * one does not exist no validation will occur.
-	 * </p>
-	 *
-	 * @param value
-	 * @return an ok status
-	 */
-	public IStatus validateAfterConvert(Object value) {
-		return afterConvertValidator == null ? Status.OK_STATUS
-				: afterConvertValidator.validate(value);
-	}
-
-	/**
-	 * Validates the value after it is retrieved from the source.
-	 * <p>
-	 * Default implementation will use the
-	 * {@link #setAfterGetValidator(IValidator) validator} if one exists. If one
-	 * does not exist no validation will occur.
-	 * </p>
-	 *
-	 * @param value
-	 * @return an ok status
-	 */
-	public IStatus validateAfterGet(Object value) {
-		return afterGetValidator == null ? Status.OK_STATUS : afterGetValidator
-				.validate(value);
-	}
-
-	/**
-	 * Validates the value before it is set on the destination.
-	 * <p>
-	 * Default implementation will use the
-	 * {@link #setBeforeSetValidator(IValidator) validator} if one exists. If
-	 * one does not exist no validation will occur.
-	 * </p>
-	 *
-	 * @param value
-	 * @return an ok status
-	 */
-	public IStatus validateBeforeSet(Object value) {
-		return beforeSetValidator == null ? Status.OK_STATUS
-				: beforeSetValidator.validate(value);
-	}
-
-	/**
-	 * Sets the current value of the given observable to the given value.
-	 * Clients may extend but must call the super implementation.
-	 *
-	 * @param observableValue
-	 * @param value
-	 * @return status
-	 */
-	protected IStatus doSet(IObservableValue observableValue, Object value) {
-		try {
-			observableValue.setValue(value);
-		} catch (Exception ex) {
-			return ValidationStatus.error(BindingMessages
-					.getString(BindingMessages.VALUEBINDING_ERROR_WHILE_SETTING_VALUE),
-					ex);
-		}
-		return Status.OK_STATUS;
-	}
-
-	private static class ValidatorRegistry {
-
-		private HashMap validators = new HashMap();
-
-		/**
-		 * Adds the system-provided validators to the current validator
-		 * registry. This is done automatically for the validator registry
-		 * singleton.
-		 */
-		private ValidatorRegistry() {
-			// Standalone validators here...
-			associate(Integer.class, Integer.TYPE,
-					new ObjectToPrimitiveValidator(Integer.TYPE));
-			associate(Byte.class, Byte.TYPE, new ObjectToPrimitiveValidator(
-					Byte.TYPE));
-			associate(Short.class, Short.TYPE, new ObjectToPrimitiveValidator(
-					Short.TYPE));
-			associate(Long.class, Long.TYPE, new ObjectToPrimitiveValidator(
-					Long.TYPE));
-			associate(Float.class, Float.TYPE, new ObjectToPrimitiveValidator(
-					Float.TYPE));
-			associate(Double.class, Double.TYPE,
-					new ObjectToPrimitiveValidator(Double.TYPE));
-			associate(Boolean.class, Boolean.TYPE,
-					new ObjectToPrimitiveValidator(Boolean.TYPE));
-
-			associate(Object.class, Integer.TYPE,
-					new ObjectToPrimitiveValidator(Integer.TYPE));
-			associate(Object.class, Byte.TYPE, new ObjectToPrimitiveValidator(
-					Byte.TYPE));
-			associate(Object.class, Short.TYPE, new ObjectToPrimitiveValidator(
-					Short.TYPE));
-			associate(Object.class, Long.TYPE, new ObjectToPrimitiveValidator(
-					Long.TYPE));
-			associate(Object.class, Float.TYPE, new ObjectToPrimitiveValidator(
-					Float.TYPE));
-			associate(Object.class, Double.TYPE,
-					new ObjectToPrimitiveValidator(Double.TYPE));
-			associate(Object.class, Boolean.TYPE,
-					new ObjectToPrimitiveValidator(Boolean.TYPE));
-		}
-
-		/**
-		 * Associate a particular validator that can validate the conversion
-		 * (fromClass, toClass)
-		 *
-		 * @param fromClass
-		 *            The Class to convert from
-		 * @param toClass
-		 *            The Class to convert to
-		 * @param validator
-		 *            The IValidator
-		 */
-		private void associate(Object fromClass, Object toClass,
-				IValidator validator) {
-			validators.put(new Pair(fromClass, toClass), validator);
-		}
-
-		/**
-		 * Return an IValidator for a specific fromClass and toClass.
-		 *
-		 * @param fromClass
-		 *            The Class to convert from
-		 * @param toClass
-		 *            The Class to convert to
-		 * @return An appropriate IValidator
-		 */
-		private IValidator get(Object fromClass, Object toClass) {
-			IValidator result = (IValidator) validators.get(new Pair(fromClass,
-					toClass));
-			if (result != null)
-				return result;
-			if (fromClass != null && toClass != null && fromClass == toClass) {
-				return new IValidator() {
-					public IStatus validate(Object value) {
-						return Status.OK_STATUS;
-					}
-				};
-			}
-			return new IValidator() {
-				public IStatus validate(Object value) {
-					return Status.OK_STATUS;
-				}
-			};
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ValidationStatusProvider.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ValidationStatusProvider.java
deleted file mode 100644
index 14ad6c7..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ValidationStatusProvider.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Boris Bokowski - initial API and implementation (bug 218269)
- *     Matthew Hall - bug 218269
- ******************************************************************************/
-
-package org.eclipse.core.databinding;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-
-/**
- * A validation status provider tracks the state of zero or more target
- * observables and zero or more model observables and produces a validation
- * result.
- * 
- * @since 1.1
- * 
- */
-public abstract class ValidationStatusProvider {
-
-	protected boolean disposed = false;
-
-	/**
-	 * @return an observable value containing the current validation status
-	 */
-	public abstract IObservableValue getValidationStatus();
-
-	/**
-	 * Returns the list of target observables (if any) that are being tracked by
-	 * this validation status provider.
-	 * 
-	 * @return an observable list of target {@link IObservable}s (may be empty)
-	 */
-	public abstract IObservableList getTargets();
-
-	/**
-	 * Returns the model observables (if any) that are being tracked by this
-	 * validation status provider.
-	 * 
-	 * @return an observable list of model {@link IObservable}s (may be empty)
-	 */
-	public abstract IObservableList getModels();
-
-	/**
-	 * Disposes of this ValidationStatusProvider. Subclasses may extend, but
-	 * must call super.dispose().
-	 */
-	public void dispose() {
-		disposed = true;
-	}
-
-	/**
-	 * @return true if the binding has been disposed. false otherwise.
-	 */
-	public boolean isDisposed() {
-		return disposed;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ValueBinding.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ValueBinding.java
deleted file mode 100644
index 8f33b87..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/ValueBinding.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 220700
- *******************************************************************************/
-
-package org.eclipse.core.databinding;
-
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.internal.databinding.BindingStatus;
-import org.eclipse.core.internal.databinding.Util;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * @since 1.0
- * 
- */
-class ValueBinding extends Binding {
-	private final UpdateValueStrategy targetToModel;
-	private final UpdateValueStrategy modelToTarget;
-	private WritableValue validationStatusObservable;
-	private IObservableValue target;
-	private IObservableValue model;
-
-	private boolean updatingTarget;
-	private boolean updatingModel;
-	private IValueChangeListener targetChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			if (!updatingTarget && !Util.equals(event.diff.getOldValue(), event.diff.getNewValue())) {
-				doUpdate(target, model, targetToModel, false, false);
-			}
-		}
-	};
-	private IValueChangeListener modelChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			if (!updatingModel && !Util.equals(event.diff.getOldValue(), event.diff.getNewValue())) {
-				doUpdate(model, target, modelToTarget, false, false);
-			}
-		}
-	};
-
-	/**
-	 * @param targetObservableValue
-	 * @param modelObservableValue
-	 * @param targetToModel
-	 * @param modelToTarget
-	 */
-	public ValueBinding(IObservableValue targetObservableValue,
-			IObservableValue modelObservableValue,
-			UpdateValueStrategy targetToModel, UpdateValueStrategy modelToTarget) {
-		super(targetObservableValue, modelObservableValue);
-		this.target = targetObservableValue;
-		this.model = modelObservableValue;
-		this.targetToModel = targetToModel;
-		this.modelToTarget = modelToTarget;
-		if ((targetToModel.getUpdatePolicy() & (UpdateValueStrategy.POLICY_CONVERT | UpdateValueStrategy.POLICY_UPDATE)) != 0) {
-			target.addValueChangeListener(targetChangeListener);
-		} else {
-			targetChangeListener = null;
-		}
-		if ((modelToTarget.getUpdatePolicy() & (UpdateValueStrategy.POLICY_CONVERT | UpdateValueStrategy.POLICY_UPDATE)) != 0) {
-			model.addValueChangeListener(modelChangeListener);
-		} else {
-			modelChangeListener = null;
-		}
-	}
-
-	protected void preInit() {
-		validationStatusObservable = new WritableValue(context
-				.getValidationRealm(), Status.OK_STATUS, IStatus.class);
-	}
-
-	protected void postInit() {
-		if (modelToTarget.getUpdatePolicy() == UpdateValueStrategy.POLICY_UPDATE) {
-			updateModelToTarget();
-		}
-		if (targetToModel.getUpdatePolicy() != UpdateValueStrategy.POLICY_NEVER) {
-			validateTargetToModel();
-		}
-	}
-
-	public IObservableValue getValidationStatus() {
-		return validationStatusObservable;
-	}
-
-	public void updateTargetToModel() {
-		doUpdate(target, model, targetToModel, true, false);
-	}
-
-	public void updateModelToTarget() {
-		doUpdate(model, target, modelToTarget, true, false);
-	}
-
-	/**
-	 * Incorporates the provided <code>newStats</code> into the
-	 * <code>multieStatus</code>.
-	 * 
-	 * @param multiStatus
-	 * @param newStatus
-	 * @return <code>true</code> if the update should proceed
-	 */
-	/* package */boolean mergeStatus(MultiStatus multiStatus, IStatus newStatus) {
-		if (!newStatus.isOK()) {
-			multiStatus.add(newStatus);
-			return multiStatus.getSeverity() < IStatus.ERROR;
-		}
-		return true;
-	}
-
-	/*
-	 * This method may be moved to UpdateValueStrategy in the future if clients
-	 * need more control over how the source value is copied to the destination
-	 * observable.
-	 */
-	private void doUpdate(final IObservableValue source,
-			final IObservableValue destination,
-			final UpdateValueStrategy updateValueStrategy,
-			final boolean explicit, final boolean validateOnly) {
-
-		final int policy = updateValueStrategy.getUpdatePolicy();
-		if (policy == UpdateValueStrategy.POLICY_NEVER)
-			return;
-		if (policy == UpdateValueStrategy.POLICY_ON_REQUEST && !explicit)
-			return;
-
-		source.getRealm().exec(new Runnable() {
-			public void run() {
-				boolean destinationRealmReached = false;
-				final MultiStatus multiStatus = BindingStatus.ok();
-				try {
-					// Get value
-					Object value = source.getValue();
-
-					// Validate after get
-					IStatus status = updateValueStrategy
-							.validateAfterGet(value);
-					if (!mergeStatus(multiStatus, status))
-						return;
-
-					// Convert value
-					final Object convertedValue = updateValueStrategy
-							.convert(value);
-
-					// Validate after convert
-					status = updateValueStrategy
-							.validateAfterConvert(convertedValue);
-					if (!mergeStatus(multiStatus, status))
-						return;
-					if (policy == UpdateValueStrategy.POLICY_CONVERT
-							&& !explicit)
-						return;
-
-					// Validate before set
-					status = updateValueStrategy
-							.validateBeforeSet(convertedValue);
-					if (!mergeStatus(multiStatus, status))
-						return;
-					if (validateOnly)
-						return;
-
-					// Set value
-					destinationRealmReached = true;
-					destination.getRealm().exec(new Runnable() {
-						public void run() {
-							if (destination == target) {
-								updatingTarget = true;
-							} else {
-								updatingModel = true;
-							}
-							try {
-								IStatus setterStatus = updateValueStrategy
-										.doSet(destination, convertedValue);
-
-								mergeStatus(multiStatus, setterStatus);
-							} finally {
-								if (destination == target) {
-									updatingTarget = false;
-								} else {
-									updatingModel = false;
-								}
-								setValidationStatus(multiStatus);
-							}
-						}
-					});
-				} catch (Exception ex) {
-					// This check is necessary as in 3.2.2 Status
-					// doesn't accept a null message (bug 177264).
-					String message = (ex.getMessage() != null) ? ex
-							.getMessage() : ""; //$NON-NLS-1$
-
-					mergeStatus(multiStatus, new Status(IStatus.ERROR,
-							Policy.JFACE_DATABINDING, IStatus.ERROR, message,
-							ex));
-				} finally {
-					if (!destinationRealmReached) {
-						setValidationStatus(multiStatus);
-					}
-
-				}
-			}
-		});
-	}
-
-	public void validateModelToTarget() {
-		doUpdate(model, target, modelToTarget, true, true);
-	}
-
-	public void validateTargetToModel() {
-		doUpdate(target, model, targetToModel, true, true);
-	}
-
-	private void setValidationStatus(final IStatus status) {
-		validationStatusObservable.getRealm().exec(new Runnable() {
-			public void run() {
-				validationStatusObservable.setValue(status);
-			}
-		});
-	}
-	
-	public void dispose() {
-		if (targetChangeListener != null) {
-			target.removeValueChangeListener(targetChangeListener);
-			targetChangeListener = null;
-		}
-		if (modelChangeListener != null) {
-			model.removeValueChangeListener(modelChangeListener);
-			modelChangeListener = null;
-		}
-		target = null;
-		model = null;
-		super.dispose();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/Converter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/Converter.java
deleted file mode 100644
index 5a344e4..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/Converter.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.conversion;
-
-
-/**
- * Abstract base class for converters.
- * 
- * @since 1.0
- *
- */
-public abstract class Converter implements IConverter {
-
-	private Object fromType;
-	private Object toType;
-
-	/**
-	 * @param fromType
-	 * @param toType
-	 */
-	public Converter(Object fromType, Object toType) {
-		this.fromType = fromType;
-		this.toType = toType;
-	}
-
-	public Object getFromType() {
-		return fromType;
-	}
-
-	public Object getToType() {
-		return toType;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/IConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/IConverter.java
deleted file mode 100644
index ebd21ae..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/IConverter.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.databinding.conversion;
-
-/**
- * A one-way converter.
- * 
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should subclass {@link Converter}.
- * 
- * @since 1.0
- * 
- */
-public interface IConverter {
-
-	/**
-	 * Returns the type whose instances can be converted by this converter. The
-	 * return type is Object rather than Class to optionally support richer type
-	 * systems than the one provided by Java reflection.
-	 * 
-	 * @return the type whose instances can be converted, or null if this
-	 *         converter is untyped
-	 */
-	public Object getFromType();
-
-	/**
-	 * Returns the type to which this converter can convert. The return type is
-	 * Object rather than Class to optionally support richer type systems than
-	 * the one provided by Java reflection.
-	 * 
-	 * @return the type to which this converter can convert, or null if this
-	 *         converter is untyped
-	 */
-	public Object getToType();
-
-	/**
-	 * Returns the result of the conversion of the given object.
-	 * 
-	 * @param fromObject
-	 *            the object to convert, of type {@link #getFromType()}
-	 * @return the converted object, of type {@link #getToType()}
-	 */
-	public Object convert(Object fromObject);
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/NumberToStringConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/NumberToStringConverter.java
deleted file mode 100644
index 2145bbf..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/NumberToStringConverter.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matt Carter - bug 180392
- ******************************************************************************/
-
-package org.eclipse.core.databinding.conversion;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import com.ibm.icu.text.DecimalFormat;
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * Converts a Number to a String using <code>NumberFormat.format(...)</code>.
- * This class is thread safe.
- * 
- * @since 1.0
- */
-public class NumberToStringConverter extends Converter {
-	private final NumberFormat numberFormat;
-	private final Class fromType;
-	private boolean fromTypeFitsLong;
-	private boolean fromTypeIsDecimalType;
-	private boolean fromTypeIsBigInteger;
-	private boolean fromTypeIsBigDecimal;
-
-	static Class icuBigDecimal = null;
-	static Constructor icuBigDecimalCtr = null; 
-	
-	{
-		/*
-		 * If the full ICU4J library is available, we use the ICU BigDecimal
-		 * class to support proper formatting and parsing of java.math.BigDecimal.
-		 * 
-		 * The version of ICU NumberFormat (DecimalFormat) included in eclipse excludes 
-		 * support for java.math.BigDecimal, and if used falls back to converting as
-		 * an unknown Number type via doubleValue(), which is undesirable.
-		 * 
-		 * See Bug #180392.
-		 */
-		try {
-			icuBigDecimal = Class.forName("com.ibm.icu.math.BigDecimal"); //$NON-NLS-1$
-			icuBigDecimalCtr = icuBigDecimal.getConstructor(new Class[] {BigInteger.class, int.class});
-//			System.out.println("DEBUG: Full ICU4J support state: icuBigDecimal="+(icuBigDecimal != null)+", icuBigDecimalCtr="+(icuBigDecimalCtr != null)); //$NON-NLS-1$ //$NON-NLS-2$
-		} 
-		catch(ClassNotFoundException e) {}
-		catch(NoSuchMethodException e) {}
-	}	
-	
-	/**
-	 * Constructs a new instance.
-	 * <p>
-	 * Private to restrict public instantiation.
-	 * </p>
-	 * 
-	 * @param numberFormat
-	 * @param fromType
-	 */
-	private NumberToStringConverter(NumberFormat numberFormat, Class fromType) {
-		super(fromType, String.class);
-
-		this.numberFormat = numberFormat;
-		this.fromType = fromType;
-
-		if (Integer.class.equals(fromType) || Integer.TYPE.equals(fromType)
-				|| Long.class.equals(fromType) || Long.TYPE.equals(fromType)
-				|| Short.class.equals(fromType) || Short.TYPE.equals(fromType)
-				|| Byte.class.equals(fromType) || Byte.TYPE.equals(fromType)) {
-			fromTypeFitsLong = true;
-		} else if (Float.class.equals(fromType) || Float.TYPE.equals(fromType)
-				|| Double.class.equals(fromType)
-				|| Double.TYPE.equals(fromType)) {
-			fromTypeIsDecimalType = true;
-		} else if (BigInteger.class.equals(fromType)) {
-			fromTypeIsBigInteger = true;
-		} else if (BigDecimal.class.equals(fromType)) {
-			fromTypeIsBigDecimal = true;
-		}
-	}
-
-	/**
-	 * Converts the provided <code>fromObject</code> to a <code>String</code>.
-	 * If the converter was constructed for an object type, non primitive, a
-	 * <code>fromObject</code> of <code>null</code> will be converted to an
-	 * empty string.
-	 * 
-	 * @param fromObject
-	 *            value to convert. May be <code>null</code> if the converter
-	 *            was constructed for a non primitive type.
-	 * @see org.eclipse.core.databinding.conversion.IConverter#convert(java.lang.Object)
-	 */
-	public Object convert(Object fromObject) {
-		// Null is allowed when the type is not primitve.
-		if (fromObject == null && !fromType.isPrimitive()) {
-			return ""; //$NON-NLS-1$
-		}
-
-		Number number = (Number) fromObject;
-		String result = null;
-		if (fromTypeFitsLong) {
-			synchronized (numberFormat) {
-				result = numberFormat.format(number.longValue());
-			}
-		} else if (fromTypeIsDecimalType) {
-			synchronized (numberFormat) {
-				result = numberFormat.format(number.doubleValue());
-			}
-		} else if (fromTypeIsBigInteger) {
-			synchronized (numberFormat) {
-				result = numberFormat.format((BigInteger) number);
-			}
-		} else if (fromTypeIsBigDecimal) {
-			if(icuBigDecimal != null && icuBigDecimalCtr != null && numberFormat instanceof DecimalFormat) {
-				// Full ICU4J present. Convert java.math.BigDecimal to ICU BigDecimal to format. Bug #180392.
-				BigDecimal o = (BigDecimal) fromObject;
-				try {
-					fromObject = icuBigDecimalCtr.newInstance(new Object[] {o.unscaledValue(), new Integer(o.scale())});
-				}
-				catch(InstantiationException e) {}
-				catch(InvocationTargetException e) {}
-				catch(IllegalAccessException e) {}
-				// Otherwise, replacement plugin present and supports java.math.BigDecimal.
-			}
-			synchronized (numberFormat) {
-				result = numberFormat.format(fromObject);
-			}
-		}
-		
-
-		return result;
-	}
-
-	/**
-	 * @param primitive
-	 *            <code>true</code> if the type is a double
-	 * @return Double converter for the default locale
-	 */
-	public static NumberToStringConverter fromDouble(boolean primitive) {
-		return fromDouble(NumberFormat.getNumberInstance(), primitive);
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return Double converter with the provided numberFormat
-	 */
-	public static NumberToStringConverter fromDouble(NumberFormat numberFormat,
-			boolean primitive) {
-		return new NumberToStringConverter(numberFormat,
-				(primitive) ? Double.TYPE : Double.class);
-	}
-
-	/**
-	 * @param primitive
-	 *            <code>true</code> if the type is a long
-	 * @return Long converter for the default locale
-	 */
-	public static NumberToStringConverter fromLong(boolean primitive) {
-		return fromLong(NumberFormat.getIntegerInstance(), primitive);
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return Long convert with the provided numberFormat
-	 */
-	public static NumberToStringConverter fromLong(NumberFormat numberFormat,
-			boolean primitive) {
-		return new NumberToStringConverter(numberFormat,
-				(primitive) ? Long.TYPE : Long.class);
-	}
-
-	/**
-	 * @param primitive
-	 *            <code>true</code> if the type is a float
-	 * @return Float converter for the default locale
-	 */
-	public static NumberToStringConverter fromFloat(boolean primitive) {
-		return fromFloat(NumberFormat.getNumberInstance(), primitive);
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return Float converter with the provided numberFormat
-	 */
-	public static NumberToStringConverter fromFloat(NumberFormat numberFormat,
-			boolean primitive) {
-		return new NumberToStringConverter(numberFormat,
-				(primitive) ? Float.TYPE : Float.class);
-	}
-
-	/**
-	 * @param primitive
-	 *            <code>true</code> if the type is a int
-	 * @return Integer converter for the default locale
-	 */
-	public static NumberToStringConverter fromInteger(boolean primitive) {
-		return fromInteger(NumberFormat.getIntegerInstance(), primitive);
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return Integer converter with the provided numberFormat
-	 */
-	public static NumberToStringConverter fromInteger(
-			NumberFormat numberFormat, boolean primitive) {
-		return new NumberToStringConverter(numberFormat,
-				(primitive) ? Integer.TYPE : Integer.class);
-	}
-
-	/**
-	 * @return BigInteger convert for the default locale
-	 */
-	public static NumberToStringConverter fromBigInteger() {
-		return fromBigInteger(NumberFormat.getIntegerInstance());
-	}
-
-	/**
-	 * @param numberFormat
-	 * @return BigInteger converter with the provided numberFormat
-	 */
-	public static NumberToStringConverter fromBigInteger(
-			NumberFormat numberFormat) {
-		return new NumberToStringConverter(numberFormat, BigInteger.class);
-	}
-	
-	/**
-	 * @return BigDecimal convert for the default locale
-	 * @since 1.2
-	 */
-	public static NumberToStringConverter fromBigDecimal() {
-		return fromBigDecimal(NumberFormat.getNumberInstance());
-	}
-
-	/**
-	 * @param numberFormat
-	 * @return BigDecimal converter with the provided numberFormat
-	 * @since 1.2
-	 */
-	public static NumberToStringConverter fromBigDecimal(
-			NumberFormat numberFormat) {
-		return new NumberToStringConverter(numberFormat, BigDecimal.class);
-	}
-	
-	/**
-	 * @param primitive
-	 *            <code>true</code> if the type is a short
-	 * @return Short converter for the default locale
-	 * @since 1.2
-	 */
-	public static NumberToStringConverter fromShort(boolean primitive) {
-		return fromShort(NumberFormat.getIntegerInstance(), primitive);
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return Short converter with the provided numberFormat
-	 * @since 1.2
-	 */
-	public static NumberToStringConverter fromShort(
-			NumberFormat numberFormat, boolean primitive) {
-		return new NumberToStringConverter(numberFormat,
-				(primitive) ? Short.TYPE : Short.class);
-	}
-	
-	/**
-	 * @param primitive
-	 *            <code>true</code> if the type is a byte
-	 * @return Byte converter for the default locale
-	 * @since 1.2
-	 */
-	public static NumberToStringConverter fromByte(boolean primitive) {
-		return fromByte(NumberFormat.getIntegerInstance(), primitive);
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return Byte converter with the provided numberFormat
-	 * @since 1.2
-	 */
-	public static NumberToStringConverter fromByte(
-			NumberFormat numberFormat, boolean primitive) {
-		return new NumberToStringConverter(numberFormat,
-				(primitive) ? Byte.TYPE : Byte.class);
-	}
-	
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/StringToNumberConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/StringToNumberConverter.java
deleted file mode 100644
index db52d11..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/StringToNumberConverter.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Michael Scharf - bug 240562
- *     Matt Carter - bug 180392
- ******************************************************************************/
-
-package org.eclipse.core.databinding.conversion;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser.ParseResult;
-import org.eclipse.core.internal.databinding.validation.NumberFormatConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * Converts a String to a Number using <code>NumberFormat.parse(...)</code>.
- * This class is thread safe.
- * 
- * @since 1.0
- */
-public class StringToNumberConverter extends NumberFormatConverter {
-	private Class toType;
-	/**
-	 * NumberFormat instance to use for conversion. Access must be synchronized.
-	 */
-	private NumberFormat numberFormat;
-
-	/**
-	 * Minimum possible value for the type. Can be <code>null</code> as
-	 * BigInteger doesn't have bounds.
-	 */
-	private final Number min;
-	/**
-	 * Maximum possible value for the type. Can be <code>null</code> as
-	 * BigInteger doesn't have bounds.
-	 */
-	private final Number max;
-
-	/**
-	 * The boxed type of the toType;
-	 */
-	private final Class boxedType;
-
-	private static final Integer MIN_INTEGER = new Integer(Integer.MIN_VALUE);
-	private static final Integer MAX_INTEGER = new Integer(Integer.MAX_VALUE);
-
-	// This code looks deceptive, but we can't use Double.MIN_VALUE because it
-	// is actually the smallest *positive* number.
-	private static final Double MIN_DOUBLE = new Double(-Double.MAX_VALUE);
-	private static final Double MAX_DOUBLE = new Double(Double.MAX_VALUE);
-
-	private static final Long MIN_LONG = new Long(Long.MIN_VALUE);
-	private static final Long MAX_LONG = new Long(Long.MAX_VALUE);
-
-	// This code looks deceptive, but we can't use Float.MIN_VALUE because it is
-	// actually the smallest *positive* number.
-	private static final Float MIN_FLOAT = new Float(-Float.MAX_VALUE);
-	private static final Float MAX_FLOAT = new Float(Float.MAX_VALUE);
-
-	private static final Short MIN_SHORT = new Short(Short.MIN_VALUE);
-	private static final Short MAX_SHORT = new Short(Short.MAX_VALUE);
-	
-	private static final Byte MIN_BYTE = new Byte(Byte.MIN_VALUE);
-	private static final Byte MAX_BYTE = new Byte(Byte.MAX_VALUE);
-	
-	static Class icuBigDecimal = null;
-	static Method icuBigDecimalScale = null;
-	static Method icuBigDecimalUnscaledValue = null;
-	
-	{
-		/*
-		 * If the full ICU4J library is available, we use the ICU BigDecimal
-		 * class to support proper formatting and parsing of java.math.BigDecimal.
-		 * 
-		 * The version of ICU NumberFormat (DecimalFormat) included in eclipse excludes 
-		 * support for java.math.BigDecimal, and if used falls back to converting as
-		 * an unknown Number type via doubleValue(), which is undesirable.
-		 * 
-		 * See Bug #180392.
-		 */
-		try {
-			icuBigDecimal = Class.forName("com.ibm.icu.math.BigDecimal"); //$NON-NLS-1$
-			icuBigDecimalScale = icuBigDecimal.getMethod("scale", null); //$NON-NLS-1$
-			icuBigDecimalUnscaledValue = icuBigDecimal.getMethod("unscaledValue", null); //$NON-NLS-1$
-/*			System.out.println("DEBUG: Full ICU4J support state: icuBigDecimal="+ //$NON-NLS-1$
-					(icuBigDecimal != null)+", icuBigDecimalScale="+(icuBigDecimalScale != null)+ //$NON-NLS-1$
-					", icuBigDecimalUnscaledValue="+(icuBigDecimalUnscaledValue != null)); //$NON-NLS-1$ */  
-		} 
-		catch(ClassNotFoundException e) {}
-		catch(NoSuchMethodException e) {}
-	}		
-	/**
-	 * @param numberFormat
-	 * @param toType
-	 * @param min
-	 *            minimum possible value for the type, can be <code>null</code>
-	 *            as BigInteger doesn't have bounds
-	 * @param max
-	 *            maximum possible value for the type, can be <code>null</code>
-	 *            as BigInteger doesn't have bounds
-	 * @param boxedType
-	 *            a convenience that allows for the checking against one type
-	 *            rather than boxed and unboxed types
-	 */
-	private StringToNumberConverter(NumberFormat numberFormat, Class toType,
-			Number min, Number max, Class boxedType) {
-		super(String.class, toType, numberFormat);
-
-		this.toType = toType;
-		this.numberFormat = numberFormat;
-		this.min = min;
-		this.max = max;
-		this.boxedType = boxedType;
-	}
-
-	/**
-	 * Converts the provided <code>fromObject</code> to the requested
-	 * {@link #getToType() to type}.
-	 * 
-	 * @see org.eclipse.core.databinding.conversion.IConverter#convert(java.lang.Object)
-	 * @throws IllegalArgumentException
-	 *             if the value isn't in the format required by the NumberFormat
-	 *             or the value is out of range for the
-	 *             {@link #getToType() to type}.
-	 * @throws IllegalArgumentException
-	 *             if conversion was not possible
-	 */
-	public Object convert(Object fromObject) {
-		ParseResult result = StringToNumberParser.parse(fromObject,
-				numberFormat, toType.isPrimitive());
-
-		if (result.getPosition() != null) {
-			// this shouldn't happen in the pipeline as validation should catch
-			// it but anyone can call convert so we should return a properly
-			// formatted message in an exception
-			throw new IllegalArgumentException(StringToNumberParser
-					.createParseErrorMessage((String) fromObject, result
-							.getPosition()));
-		} else if (result.getNumber() == null) {
-			// if an error didn't occur and the number is null then it's a boxed
-			// type and null should be returned
-			return null;
-		}
-
-		/*
-		 * Technically the checks for ranges aren't needed here because the
-		 * validator should have validated this already but we shouldn't assume
-		 * this has occurred.
-		 */
-		if (Integer.class.equals(boxedType)) {
-			if (StringToNumberParser.inIntegerRange(result.getNumber())) {
-				return new Integer(result.getNumber().intValue());
-			}
-		} else if (Double.class.equals(boxedType)) {
-			if (StringToNumberParser.inDoubleRange(result.getNumber())) {
-				return new Double(result.getNumber().doubleValue());
-			}
-		} else if (Long.class.equals(boxedType)) {
-			if (StringToNumberParser.inLongRange(result.getNumber())) {
-				return new Long(result.getNumber().longValue());
-			}
-		} else if (Float.class.equals(boxedType)) {
-			if (StringToNumberParser.inFloatRange(result.getNumber())) {
-				return new Float(result.getNumber().floatValue());
-			}
-		} else if (BigInteger.class.equals(boxedType)) {
-			Number n = result.getNumber();
-			if(n instanceof Long)
-				return BigInteger.valueOf(n.longValue());
-			else if(n instanceof BigInteger)
-				return n;
-			else if(n instanceof BigDecimal)
-				return ((BigDecimal) n).toBigInteger();
-			else
-				return new BigDecimal(n.doubleValue()).toBigInteger();
-		} else if (BigDecimal.class.equals(boxedType)) {
-			Number n = result.getNumber();
-			if(n instanceof Long)
-				return BigDecimal.valueOf(n.longValue());
-			else if(n instanceof BigInteger)
-				return new BigDecimal((BigInteger) n);
-			else if(n instanceof BigDecimal)
-				return n;
-			else if(icuBigDecimal != null && icuBigDecimal.isInstance(n)) {
-				try {
-					// Get ICU BigDecimal value and use to construct java.math.BigDecimal
-					int scale = ((Integer) icuBigDecimalScale.invoke(n, null)).intValue();
-					BigInteger unscaledValue = (BigInteger) icuBigDecimalUnscaledValue.invoke(n, null);
-					return new java.math.BigDecimal(unscaledValue, scale);
-				} catch(IllegalAccessException e) {
-					throw new IllegalArgumentException("Error (IllegalAccessException) converting BigDecimal using ICU"); //$NON-NLS-1$
-				} catch(InvocationTargetException e) {
-					throw new IllegalArgumentException("Error (InvocationTargetException) converting BigDecimal using ICU"); //$NON-NLS-1$
-				}
-			} else if(n instanceof Double) {
-				BigDecimal bd = new BigDecimal(n.doubleValue());
-				if(bd.scale() == 0) return bd;
-				throw new IllegalArgumentException("Non-integral Double value returned from NumberFormat " + //$NON-NLS-1$
-						"which cannot be accurately stored in a BigDecimal due to lost precision. " + //$NON-NLS-1$
-						"Consider using ICU4J or Java 5 which can properly format and parse these types."); //$NON-NLS-1$
-			}
-		} else if (Short.class.equals(boxedType)) {
-			if (StringToNumberParser.inShortRange(result.getNumber())) {
-				return new Short(result.getNumber().shortValue());
-			}
-		} else if (Byte.class.equals(boxedType)) {
-			if (StringToNumberParser.inByteRange(result.getNumber())) {
-				return new Byte(result.getNumber().byteValue());
-			}
-		}
-
-		if (min != null && max != null) {
-			throw new IllegalArgumentException(StringToNumberParser
-					.createOutOfRangeMessage(min, max, numberFormat));
-		}
-
-		/*
-		 * Fail safe. I don't think this could even be thrown but throwing the
-		 * exception is better than returning null and hiding the error.
-		 */
-		throw new IllegalArgumentException(
-				"Could not convert [" + fromObject + "] to type [" + toType + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-
-	/**
-	 * @param primitive
-	 *            <code>true</code> if the convert to type is an int
-	 * @return to Integer converter for the default locale
-	 */
-	public static StringToNumberConverter toInteger(boolean primitive) {
-		return toInteger(NumberFormat.getIntegerInstance(), primitive);
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return to Integer converter with the provided numberFormat
-	 */
-	public static StringToNumberConverter toInteger(NumberFormat numberFormat,
-			boolean primitive) {
-		return new StringToNumberConverter(numberFormat,
-				(primitive) ? Integer.TYPE : Integer.class, MIN_INTEGER,
-				MAX_INTEGER, Integer.class);
-	}
-
-	/**
-	 * @param primitive
-	 *            <code>true</code> if the convert to type is a double
-	 * @return to Double converter for the default locale
-	 */
-	public static StringToNumberConverter toDouble(boolean primitive) {
-		return toDouble(NumberFormat.getNumberInstance(), primitive);
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return to Double converter with the provided numberFormat
-	 */
-	public static StringToNumberConverter toDouble(NumberFormat numberFormat,
-			boolean primitive) {
-		return new StringToNumberConverter(numberFormat,
-				(primitive) ? Double.TYPE : Double.class, MIN_DOUBLE,
-				MAX_DOUBLE, Double.class);
-	}
-
-	/**
-	 * @param primitive
-	 *            <code>true</code> if the convert to type is a long
-	 * @return to Long converter for the default locale
-	 */
-	public static StringToNumberConverter toLong(boolean primitive) {
-		return toLong(NumberFormat.getIntegerInstance(), primitive);
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return to Long converter with the provided numberFormat
-	 */
-	public static StringToNumberConverter toLong(NumberFormat numberFormat,
-			boolean primitive) {
-		return new StringToNumberConverter(numberFormat,
-				(primitive) ? Long.TYPE : Long.class, MIN_LONG, MAX_LONG,
-				Long.class);
-	}
-
-	/**
-	 * @param primitive
-	 *            <code>true</code> if the convert to type is a float
-	 * @return to Float converter for the default locale
-	 */
-	public static StringToNumberConverter toFloat(boolean primitive) {
-		return toFloat(NumberFormat.getNumberInstance(), primitive);
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return to Float converter with the provided numberFormat
-	 */
-	public static StringToNumberConverter toFloat(NumberFormat numberFormat,
-			boolean primitive) {
-		return new StringToNumberConverter(numberFormat,
-				(primitive) ? Float.TYPE : Float.class, MIN_FLOAT, MAX_FLOAT,
-				Float.class);
-	}
-
-	/**
-	 * @return to BigInteger converter for the default locale
-	 */
-	public static StringToNumberConverter toBigInteger() {
-		return toBigInteger(NumberFormat.getIntegerInstance());
-	}
-
-	/**
-	 * @param numberFormat
-	 * @return to BigInteger converter with the provided numberFormat
-	 */
-	public static StringToNumberConverter toBigInteger(NumberFormat numberFormat) {
-		return new StringToNumberConverter(numberFormat, BigInteger.class,
-				null, null, BigInteger.class);
-	}
-
-	/**
-	 * @return to BigDecimal converter for the default locale
-	 * @since 1.2
-	 */
-	public static StringToNumberConverter toBigDecimal() {
-		return toBigDecimal(NumberFormat.getNumberInstance());
-	}
-	
-	/**
-	 * @param numberFormat
-	 * @return to BigDecimal converter with the provided numberFormat
-	 * @since 1.2
-	 */
-	public static StringToNumberConverter toBigDecimal(NumberFormat numberFormat) {
-		return new StringToNumberConverter(numberFormat, BigDecimal.class,
-				null, null, BigDecimal.class);
-	}
-	
-	/**
-	 * @param primitive
-	 *            <code>true</code> if the convert to type is a short
-	 * @return to Short converter for the default locale
-	 * @since 1.2
-	 */
-	public static StringToNumberConverter toShort(boolean primitive) {
-		return toShort(NumberFormat.getIntegerInstance(), primitive);
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return to Short converter with the provided numberFormat
-	 * @since 1.2
-	 */
-	public static StringToNumberConverter toShort(NumberFormat numberFormat,
-			boolean primitive) {
-		return new StringToNumberConverter(numberFormat,
-				(primitive) ? Short.TYPE : Short.class, MIN_SHORT,
-				MAX_SHORT, Short.class);
-	}
-	
-	/**
-	 * @param primitive
-	 *            <code>true</code> if the convert to type is a byte
-	 * @return to Byte converter for the default locale
-	 * @since 1.2
-	 */
-	public static StringToNumberConverter toByte(boolean primitive) {
-		return toByte(NumberFormat.getIntegerInstance(), primitive);
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return to Byte converter with the provided numberFormat
-	 * @since 1.2
-	 */
-	public static StringToNumberConverter toByte(NumberFormat numberFormat,
-			boolean primitive) {
-		return new StringToNumberConverter(numberFormat,
-				(primitive) ? Byte.TYPE : Byte.class, MIN_BYTE,
-				MAX_BYTE, Byte.class);
-	}
-	
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/package.html b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/package.html
deleted file mode 100644
index 06a1b53..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/conversion/package.html
+++ /dev/null
@@ -1,18 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides interfaces and classes for data type conversion.
-<h2>
-Package Specification</h2>
-<p>
-This package provides the <tt>IConverter</tt> interface along with classes
-that implement the interface to convert between common data types.
-<p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/AbstractObservable.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/AbstractObservable.java
deleted file mode 100644
index 1297829..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/AbstractObservable.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Matthew Hall - bugs 118516, 146397
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.AssertionFailedException;
-
-/**
- * @since 1.0
- */
-public abstract class AbstractObservable extends ChangeManager implements IObservable {
-	private boolean disposed = false;
-
-	/**
-	 * @param realm
-	 */
-	public AbstractObservable(Realm realm) {
-		super(realm);
-	}
-
-	public synchronized void addChangeListener(IChangeListener listener) {
-		addListener(ChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeChangeListener(IChangeListener listener) {
-		removeListener(ChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void addStaleListener(IStaleListener listener) {
-		addListener(StaleEvent.TYPE, listener);
-	}
-
-	public synchronized void removeStaleListener(IStaleListener listener) {
-		removeListener(StaleEvent.TYPE, listener);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public synchronized void addDisposeListener(IDisposeListener listener) {
-		addListener(DisposeEvent.TYPE, listener);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public synchronized void removeDisposeListener(IDisposeListener listener) {
-		removeListener(DisposeEvent.TYPE, listener);
-	}
-
-	protected void fireChange() {
-		checkRealm();
-		fireEvent(new ChangeEvent(this));
-	}
-
-	protected void fireStale() {
-		checkRealm();
-		fireEvent(new StaleEvent(this));
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public boolean isDisposed() {
-		return disposed;
-	}
-
-	/**
-	 * 
-	 */
-	public synchronized void dispose() {
-		if (!disposed) {
-			disposed = true;
-			fireEvent(new DisposeEvent(this));
-			super.dispose();
-		}
-	}
-
-	/**
-	 * Asserts that the realm is the current realm.
-	 * 
-	 * @see Realm#isCurrent()
-	 * @throws AssertionFailedException if the realm is not the current realm
-	 */
-	protected void checkRealm() {
-		Assert.isTrue(getRealm().isCurrent(),
-				"This operation must be run within the observable's realm"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ChangeEvent.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ChangeEvent.java
deleted file mode 100644
index 60950cf..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ChangeEvent.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * Generic change event denoting that the state of an {@link IObservable} object
- * has changed. This event does not carry information about the kind of change
- * that occurred.
- * 
- * @since 1.0
- * 
- */
-public class ChangeEvent extends ObservableEvent {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -3241193109844979384L;
-	static final Object TYPE = new Object();
-
-	/**
-	 * Creates a new change event object.
-	 * 
-	 * @param source
-	 *            the observable that changed state
-	 */
-	public ChangeEvent(IObservable source) {
-		super(source);
-	}
-
-	protected void dispatch(IObservablesListener listener) {
-		((IChangeListener) listener).handleChange(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ChangeManager.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ChangeManager.java
deleted file mode 100644
index bf2be9a..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ChangeManager.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 118516
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ListenerList;
-
-/**
- * Listener management implementation. Exposed to subclasses in form of
- * {@link AbstractObservable} and {@link ChangeSupport}.
- * 
- * @since 1.0
- * 
- */
-/* package */ class ChangeManager {
-
-	ListenerList[] listenerLists = null;
-	Object listenerTypes[] = null;
-	private Realm realm;
-
-	/**
-	 * @param realm 
-	 * 
-	 */
-	/* package */ ChangeManager(Realm realm) {
-		Assert.isNotNull(realm, "Realm cannot be null"); //$NON-NLS-1$
-		this.realm = realm;
-	}
-
-	/**
-	 * @param listenerType
-	 * @param listener
-	 */
-	protected void addListener(Object listenerType,
-			IObservablesListener listener) {
-		int listenerTypeIndex = findListenerTypeIndex(listenerType);
-		if (listenerTypeIndex == -1) {
-			int length;
-			if (listenerTypes == null) {
-				length = 0;
-				listenerTypes = new Object[1];
-				listenerLists = new ListenerList[1];
-			} else {
-				length = listenerTypes.length;
-				System.arraycopy(listenerTypes, 0,
-						listenerTypes = new Object[length + 1], 0, length);
-				System
-						.arraycopy(listenerLists, 0,
-								listenerLists = new ListenerList[length + 1],
-								0, length);
-			}
-			listenerTypes[length] = listenerType;
-			listenerLists[length] = new ListenerList();
-			boolean hadListeners = hasListeners();
-			listenerLists[length].add(listener);
-			if (!hadListeners) {
-				this.firstListenerAdded();
-			}
-			return;
-		}
-		ListenerList listenerList = listenerLists[listenerTypeIndex];
-		boolean hadListeners = true;
-		if (listenerList.size() == 0) {
-			hadListeners = hasListeners();
-		}
-		listenerList.add(listener);
-		if (!hadListeners) {
-			firstListenerAdded();
-		}
-	}
-
-	/**
-	 * @param listenerType
-	 * @param listener
-	 */
-	protected void removeListener(Object listenerType,
-			IObservablesListener listener) {
-		int listenerTypeIndex = findListenerTypeIndex(listenerType);
-		if (listenerTypeIndex != -1) {
-			listenerLists[listenerTypeIndex].remove(listener);
-			if (listenerLists[listenerTypeIndex].size() == 0) {
-				if (!hasListeners()) {
-					this.lastListenerRemoved();
-				}
-			}
-		}
-	}
-
-	protected boolean hasListeners() {
-		if (listenerTypes == null) {
-			return false;
-		}
-		for (int i = 0; i < listenerTypes.length; i++) {
-			if (listenerLists[i].size() > 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private int findListenerTypeIndex(Object listenerType) {
-		if (listenerTypes != null) {
-			for (int i = 0; i < listenerTypes.length; i++) {
-				if (listenerTypes[i] == listenerType) {
-					return i;
-				}
-			}
-		}
-		return -1;
-	}
-
-	protected void fireEvent(ObservableEvent event) {
-		Object listenerType = event.getListenerType();
-		int listenerTypeIndex = findListenerTypeIndex(listenerType);
-		if (listenerTypeIndex != -1) {
-			Object[] listeners = listenerLists[listenerTypeIndex]
-					.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				event.dispatch((IObservablesListener) listeners[i]);
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	protected void firstListenerAdded() {
-	}
-
-	/**
-	 * 
-	 */
-	protected void lastListenerRemoved() {
-	}
-
-	/**
-	 * 
-	 */
-	public void dispose() {
-		listenerLists = null;
-		listenerTypes = null;
-		realm = null;
-	}
-
-	/**
-	 * @return Returns the realm.
-	 */
-	public Realm getRealm() {
-		return realm;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ChangeSupport.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ChangeSupport.java
deleted file mode 100644
index 5f47554..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ChangeSupport.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 146397
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * @since 1.0
- *
- */
-public abstract class ChangeSupport extends ChangeManager {
-
-	/**
-	 * @param realm 
-	 */
-	public ChangeSupport(Realm realm) {
-		super(realm);
-	}
-	
-	public void addListener(Object listenerType,
-			IObservablesListener listener) {
-		super.addListener(listenerType, listener);
-	}
-	
-	public void removeListener(Object listenerType,
-			IObservablesListener listener) {
-		super.removeListener(listenerType, listener);
-	}
-	
-	public void fireEvent(ObservableEvent event) {
-		super.fireEvent(event);
-	}
-	
-	/**
-	 * 
-	 */
-	protected abstract void firstListenerAdded();
-	
-	/**
-	 * 
-	 */
-	protected abstract void lastListenerRemoved();
-
-	/**
-	 * @param listener
-	 */
-	public void addChangeListener(IChangeListener listener) {
-		addListener(ChangeEvent.TYPE, listener);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void removeChangeListener(IChangeListener listener) {
-		removeListener(ChangeEvent.TYPE, listener);
-	}
-
-	/**
-	 * @param listener
-	 */
-	public void addStaleListener(IStaleListener listener) {
-		addListener(StaleEvent.TYPE, listener);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void removeStaleListener(IStaleListener listener) {
-		removeListener(StaleEvent.TYPE, listener);
-	}
-
-	/**
-	 * @param listener 
-	 * @since 1.2
-	 */
-	public void addDisposeListener(IDisposeListener listener) {
-		addListener(DisposeEvent.TYPE, listener);
-	}
-
-	/**
-	 * @param listener
-	 * @since 1.2
-	 */
-	public void removeDisposeListener(IDisposeListener listener) {
-		removeListener(DisposeEvent.TYPE, listener);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/DecoratingObservable.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/DecoratingObservable.java
deleted file mode 100644
index 642dfe6..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/DecoratingObservable.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237718)
- *     Matthew Hall - but 246626
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import org.eclipse.core.internal.databinding.Util;
-
-/**
- * An observable which decorates another observable
- * 
- * @since 1.2
- * 
- */
-public class DecoratingObservable extends AbstractObservable implements
-		IDecoratingObservable {
-
-	private IObservable decorated;
-
-	private IStaleListener staleListener;
-
-	private boolean disposedDecoratedOnDispose;
-
-	/**
-	 * Constructs a DecoratingObservable which decorates the given observable.
-	 * 
-	 * @param decorated
-	 *            the observable being decorated.
-	 * @param disposeDecoratedOnDispose
-	 *            whether the decorated observable should be disposed when the
-	 *            decorator is disposed
-	 */
-	public DecoratingObservable(IObservable decorated,
-			boolean disposeDecoratedOnDispose) {
-		super(decorated.getRealm());
-		this.decorated = decorated;
-		this.disposedDecoratedOnDispose = disposeDecoratedOnDispose;
-	}
-
-	public IObservable getDecorated() {
-		return decorated;
-	}
-
-	public boolean isStale() {
-		getterCalled();
-		return decorated.isStale();
-	}
-
-	protected void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	protected void firstListenerAdded() {
-		if (staleListener == null) {
-			staleListener = new IStaleListener() {
-				public void handleStale(StaleEvent staleEvent) {
-					DecoratingObservable.this.handleStaleEvent(staleEvent);
-				}
-			};
-		}
-		decorated.addStaleListener(staleListener);
-	}
-
-	protected void lastListenerRemoved() {
-		if (staleListener != null) {
-			decorated.removeStaleListener(staleListener);
-			staleListener = null;
-		}
-	}
-
-	/**
-	 * Called whenever a StaleEvent is received from the decorated observable.
-	 * By default, this method fires the stale event again, with the decorating
-	 * observable as the event source. Subclasses may override to provide
-	 * different behavior.
-	 * 
-	 * @param event
-	 *            the stale event received from the decorated observable
-	 */
-	protected void handleStaleEvent(StaleEvent event) {
-		fireStale();
-	}
-
-	public boolean equals(Object obj) {
-		getterCalled();
-		if (obj == this)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() == obj.getClass()) {
-			DecoratingObservable other = (DecoratingObservable) obj;
-			return Util.equals(this.decorated, other.decorated);
-		}
-		return Util.equals(decorated, obj);
-	}
-
-	public int hashCode() {
-		getterCalled();
-		return decorated.hashCode();
-	}
-
-	public synchronized void dispose() {
-		if (decorated != null && staleListener != null) {
-			decorated.removeStaleListener(staleListener);
-		}
-		if (decorated != null) {
-			if (disposedDecoratedOnDispose)
-				decorated.dispose();
-			decorated = null;
-		}
-		staleListener = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/DecoratingObservableCollection.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/DecoratingObservableCollection.java
deleted file mode 100644
index 2129e08..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/DecoratingObservableCollection.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237718)
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-/**
- * An observable collection which decorates another observable collection
- * 
- * @since 1.2
- */
-public class DecoratingObservableCollection extends DecoratingObservable
-		implements IObservableCollection {
-	private IObservableCollection decorated;
-
-	/**
-	 * @param decorated
-	 * @param disposeDecoratedOnDispose
-	 */
-	public DecoratingObservableCollection(IObservableCollection decorated,
-			boolean disposeDecoratedOnDispose) {
-		super(decorated, disposeDecoratedOnDispose);
-		this.decorated = decorated;
-	}
-
-	public boolean add(Object o) {
-		getterCalled();
-		return decorated.add(o);
-	}
-
-	public boolean addAll(Collection c) {
-		getterCalled();
-		return decorated.addAll(c);
-	}
-
-	public void clear() {
-		checkRealm();
-		decorated.clear();
-	}
-
-	public boolean contains(Object o) {
-		getterCalled();
-		return decorated.contains(o);
-	}
-
-	public boolean containsAll(Collection c) {
-		getterCalled();
-		return decorated.containsAll(c);
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		return decorated.isEmpty();
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final Iterator decoratedIterator = decorated.iterator();
-		return new Iterator() {
-			public void remove() {
-				decoratedIterator.remove();
-			}
-
-			public boolean hasNext() {
-				getterCalled();
-				return decoratedIterator.hasNext();
-			}
-
-			public Object next() {
-				getterCalled();
-				return decoratedIterator.next();
-			}
-		};
-	}
-
-	public boolean remove(Object o) {
-		getterCalled();
-		return decorated.remove(o);
-	}
-
-	public boolean removeAll(Collection c) {
-		getterCalled();
-		return decorated.removeAll(c);
-	}
-
-	public boolean retainAll(Collection c) {
-		getterCalled();
-		return decorated.retainAll(c);
-	}
-
-	public int size() {
-		getterCalled();
-		return decorated.size();
-	}
-
-	public Object[] toArray() {
-		getterCalled();
-		return decorated.toArray();
-	}
-
-	public Object[] toArray(Object[] a) {
-		getterCalled();
-		return decorated.toArray(a);
-	}
-
-	public Object getElementType() {
-		return decorated.getElementType();
-	}
-
-	public boolean equals(Object o) {
-		getterCalled();
-		return decorated.equals(o);
-	}
-
-	public int hashCode() {
-		getterCalled();
-		return decorated.hashCode();
-	}
-
-	public String toString() {
-		getterCalled();
-		return decorated.toString();
-	}
-
-	public synchronized void dispose() {
-		decorated = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/Diffs.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/Diffs.java
deleted file mode 100644
index 9500537..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/Diffs.java
+++ /dev/null
@@ -1,470 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 226216
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import org.eclipse.core.databinding.observable.list.ListDiff;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.databinding.observable.map.MapDiff;
-import org.eclipse.core.databinding.observable.set.SetDiff;
-import org.eclipse.core.databinding.observable.value.ValueDiff;
-import org.eclipse.core.internal.databinding.Util;
-
-/**
- * @since 1.0
- * 
- */
-public class Diffs {
-
-	/**
-	 * @param oldList
-	 * @param newList
-	 * @return the differences between oldList and newList
-	 */
-	public static ListDiff computeListDiff(List oldList, List newList) {
-		List diffEntries = new ArrayList();
-		createListDiffs(new ArrayList(oldList), newList, diffEntries);
-		ListDiff listDiff = createListDiff((ListDiffEntry[]) diffEntries
-				.toArray(new ListDiffEntry[diffEntries.size()]));
-		return listDiff;
-	}
-	
-	/**
-	 * adapted from EMF's ListDifferenceAnalyzer
-	 */
-	private static void createListDiffs(List oldList, List newList,
-			List listDiffs) {
-		int index = 0;
-		for (Iterator it = newList.iterator(); it.hasNext();) {
-			Object newValue = it.next();
-			if (oldList.size() <= index) {
-				// append newValue to newList 
-				listDiffs.add(createListDiffEntry(index, true, newValue));
-			} else {
-				boolean done;
-				do {
-					done = true;
-					Object oldValue = oldList.get(index);
-					if (oldValue == null ? newValue != null : !oldValue.equals(newValue)) {
-						int oldIndexOfNewValue = listIndexOf(oldList, newValue, index);
-						if (oldIndexOfNewValue != -1) {
-							int newIndexOfOldValue = listIndexOf(newList, oldValue, index);
-							if (newIndexOfOldValue == -1) {
-								// removing oldValue from list[index]
-								listDiffs.add(createListDiffEntry(index, false, oldValue));
-								oldList.remove(index);
-								done = false;
-							} else if (newIndexOfOldValue > oldIndexOfNewValue) {
-								// moving oldValue from list[index] to [newIndexOfOldValue] 
-								if (oldList.size() <= newIndexOfOldValue) {
-									// The element cannot be moved to the correct index
-									// now, however later iterations will insert elements
-									// in front of it, eventually moving it into the
-									// correct spot.
-									newIndexOfOldValue = oldList.size() - 1;
-								}
-								listDiffs.add(createListDiffEntry(index, false, oldValue));
-								oldList.remove(index);
-								listDiffs.add(createListDiffEntry(newIndexOfOldValue, true, oldValue));
-								oldList.add(newIndexOfOldValue, oldValue);
-								done = false;
-							} else {
-								// move newValue from list[oldIndexOfNewValue] to [index]
-								listDiffs.add(createListDiffEntry(oldIndexOfNewValue, false, newValue));
-								oldList.remove(oldIndexOfNewValue);
-								listDiffs.add(createListDiffEntry(index, true, newValue));
-								oldList.add(index, newValue);
-							}
-						} else {
-							// add newValue at list[index]
-							oldList.add(index, newValue);
-							listDiffs.add(createListDiffEntry(index, true, newValue));
-						}
-					}
-				} while (!done);
-			}
-			++index;
-		}
-		for (int i = oldList.size(); i > index;) {
-			// remove excess trailing elements not present in newList
-			listDiffs.add(createListDiffEntry(--i, false, oldList.get(i)));
-		}
-	}
-
-	/**
-	 * @param list
-	 * @param object
-	 * @param index
-	 * @return the index, or -1 if not found
-	 */
-	private static int listIndexOf(List list, Object object, int index) {
-		int size = list.size();
-		for (int i=index; i<size;i++) {
-			Object candidate = list.get(i);
-			if (candidate==null ? object==null : candidate.equals(object)) {
-				return i;
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * Checks whether the two objects are <code>null</code> -- allowing for
-	 * <code>null</code>.
-	 * 
-	 * @param left
-	 *            The left object to compare; may be <code>null</code>.
-	 * @param right
-	 *            The right object to compare; may be <code>null</code>.
-	 * @return <code>true</code> if the two objects are equivalent;
-	 *         <code>false</code> otherwise.
-	 */
-	public static final boolean equals(final Object left, final Object right) {
-		return left == null ? right == null : ((right != null) && left
-				.equals(right));
-	}
-
-	/**
-	 * @param oldSet
-	 * @param newSet
-	 * @return a set diff
-	 */
-	public static SetDiff computeSetDiff(Set oldSet, Set newSet) {
-		Set additions = new HashSet(newSet);
-		additions.removeAll(oldSet);
-		Set removals = new HashSet(oldSet);
-		removals.removeAll(newSet);
-		return createSetDiff(additions, removals);
-	}
-
-	/**
-	 * Computes the difference between two maps.
-	 * 
-	 * @param oldMap
-	 * @param newMap
-	 * @return a map diff representing the changes needed to turn oldMap into
-	 *         newMap
-	 */
-	public static MapDiff computeMapDiff(Map oldMap, Map newMap) {
-		// starts out with all keys from the new map, we will remove keys from
-		// the old map as we go
-		final Set addedKeys = new HashSet(newMap.keySet());
-		final Set removedKeys = new HashSet();
-		final Set changedKeys = new HashSet();
-		final Map oldValues = new HashMap();
-		final Map newValues = new HashMap();
-		for (Iterator it = oldMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry oldEntry = (Entry) it.next();
-			Object oldKey = oldEntry.getKey();
-			if (addedKeys.remove(oldKey)) {
-				// potentially changed key since it is in oldMap and newMap
-				Object oldValue = oldEntry.getValue();
-				Object newValue = newMap.get(oldKey);
-				if (!Util.equals(oldValue, newValue)) {
-					changedKeys.add(oldKey);
-					oldValues.put(oldKey, oldValue);
-					newValues.put(oldKey, newValue);
-				}
-			} else {
-				removedKeys.add(oldKey);
-				oldValues.put(oldKey, oldEntry.getValue());
-			}
-		}
-		for (Iterator it = addedKeys.iterator(); it.hasNext();) {
-			Object newKey = it.next();
-			newValues.put(newKey, newMap.get(newKey));
-		}
-		return new MapDiff() {
-			public Set getAddedKeys() {
-				return addedKeys;
-			}
-
-			public Set getChangedKeys() {
-				return changedKeys;
-			}
-
-			public Set getRemovedKeys() {
-				return removedKeys;
-			}
-
-			public Object getNewValue(Object key) {
-				return newValues.get(key);
-			}
-
-			public Object getOldValue(Object key) {
-				return oldValues.get(key);
-			}
-		};
-	}
-	
-	/**
-	 * @param oldValue
-	 * @param newValue
-	 * @return a value diff
-	 */
-	public static ValueDiff createValueDiff(final Object oldValue,
-			final Object newValue) {
-		return new ValueDiff() {
-
-			public Object getOldValue() {
-				return oldValue;
-			}
-
-			public Object getNewValue() {
-				return newValue;
-			}
-		};
-	}
-
-	/**
-	 * @param additions
-	 * @param removals
-	 * @return a set diff
-	 */
-	public static SetDiff createSetDiff(Set additions, Set removals) {
-		final Set unmodifiableAdditions = Collections
-				.unmodifiableSet(additions);
-		final Set unmodifiableRemovals = Collections.unmodifiableSet(removals);
-		return new SetDiff() {
-
-			public Set getAdditions() {
-				return unmodifiableAdditions;
-			}
-
-			public Set getRemovals() {
-				return unmodifiableRemovals;
-			}
-		};
-	}
-
-	/**
-	 * @param difference
-	 * @return a list diff with one differing entry
-	 */
-	public static ListDiff createListDiff(ListDiffEntry difference) {
-		return createListDiff(new ListDiffEntry[] { difference });
-	}
-
-	/**
-	 * @param difference1
-	 * @param difference2
-	 * @return a list diff with two differing entries
-	 */
-	public static ListDiff createListDiff(ListDiffEntry difference1,
-			ListDiffEntry difference2) {
-		return createListDiff(new ListDiffEntry[] { difference1, difference2 });
-	}
-
-	/**
-	 * @param differences
-	 * @return a list diff with the given entries
-	 */
-	public static ListDiff createListDiff(final ListDiffEntry[] differences) {
-		return new ListDiff() {
-			public ListDiffEntry[] getDifferences() {
-				return differences;
-			}
-		};
-	}
-
-	/**
-	 * @param position
-	 * @param isAddition
-	 * @param element
-	 * @return a list diff entry
-	 */
-	public static ListDiffEntry createListDiffEntry(final int position,
-			final boolean isAddition, final Object element) {
-		return new ListDiffEntry() {
-
-			public int getPosition() {
-				return position;
-			}
-
-			public boolean isAddition() {
-				return isAddition;
-			}
-
-			public Object getElement() {
-				return element;
-			}
-		};
-	}
-
-	/**
-	 * @param addedKey
-	 * @param newValue
-	 * @return a map diff
-	 */
-	public static MapDiff createMapDiffSingleAdd(final Object addedKey,
-			final Object newValue) {
-		return new MapDiff() {
-
-			public Set getAddedKeys() {
-				return Collections.singleton(addedKey);
-			}
-
-			public Set getChangedKeys() {
-				return Collections.EMPTY_SET;
-			}
-
-			public Object getNewValue(Object key) {
-				return newValue;
-			}
-
-			public Object getOldValue(Object key) {
-				return null;
-			}
-
-			public Set getRemovedKeys() {
-				return Collections.EMPTY_SET;
-			}
-		};
-	}
-
-	/**
-	 * @param existingKey
-	 * @param oldValue
-	 * @param newValue
-	 * @return a map diff
-	 */
-	public static MapDiff createMapDiffSingleChange(final Object existingKey,
-			final Object oldValue, final Object newValue) {
-		return new MapDiff() {
-
-			public Set getAddedKeys() {
-				return Collections.EMPTY_SET;
-			}
-
-			public Set getChangedKeys() {
-				return Collections.singleton(existingKey);
-			}
-
-			public Object getNewValue(Object key) {
-				return newValue;
-			}
-
-			public Object getOldValue(Object key) {
-				return oldValue;
-			}
-
-			public Set getRemovedKeys() {
-				return Collections.EMPTY_SET;
-			}
-		};
-	}
-
-	/**
-	 * @param removedKey
-	 * @param oldValue
-	 * @return a map diff
-	 */
-	public static MapDiff createMapDiffSingleRemove(final Object removedKey,
-			final Object oldValue) {
-		return new MapDiff() {
-
-			public Set getAddedKeys() {
-				return Collections.EMPTY_SET;
-			}
-
-			public Set getChangedKeys() {
-				return Collections.EMPTY_SET;
-			}
-
-			public Object getNewValue(Object key) {
-				return null;
-			}
-
-			public Object getOldValue(Object key) {
-				return oldValue;
-			}
-
-			public Set getRemovedKeys() {
-				return Collections.singleton(removedKey);
-			}
-		};
-	}
-
-	/**
-	 * @param copyOfOldMap
-	 * @return a map diff
-	 */
-	public static MapDiff createMapDiffRemoveAll(final Map copyOfOldMap) {
-		return new MapDiff() {
-
-			public Set getAddedKeys() {
-				return Collections.EMPTY_SET;
-			}
-
-			public Set getChangedKeys() {
-				return Collections.EMPTY_SET;
-			}
-
-			public Object getNewValue(Object key) {
-				return null;
-			}
-
-			public Object getOldValue(Object key) {
-				return copyOfOldMap.get(key);
-			}
-
-			public Set getRemovedKeys() {
-				return copyOfOldMap.keySet();
-			}
-		};
-	}
-
-	/**
-	 * @param addedKeys
-	 * @param removedKeys
-	 * @param changedKeys
-	 * @param oldValues
-	 * @param newValues
-	 * @return a map diff
-	 */
-	public static MapDiff createMapDiff(final Set addedKeys,
-			final Set removedKeys, final Set changedKeys, final Map oldValues,
-			final Map newValues) {
-		return new MapDiff() {
-
-			public Set getAddedKeys() {
-				return addedKeys;
-			}
-
-			public Set getChangedKeys() {
-				return changedKeys;
-			}
-
-			public Object getNewValue(Object key) {
-				return newValues.get(key);
-			}
-
-			public Object getOldValue(Object key) {
-				return oldValues.get(key);
-			}
-
-			public Set getRemovedKeys() {
-				return removedKeys;
-			}
-		};
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/DisposeEvent.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/DisposeEvent.java
deleted file mode 100644
index f99986e..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/DisposeEvent.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 146397)
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * Event denoting that an {@link IObservable} object was disposed.
- * 
- * @since 1.2
- */
-public class DisposeEvent extends ObservableEvent {
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -3241193109844979384L;
-
-	static final Object TYPE = new Object();
-
-	/**
-	 * Creates a new dispose event object.
-	 * 
-	 * @param source
-	 *            the observable that was disposed
-	 */
-	public DisposeEvent(IObservable source) {
-		super(source);
-	}
-
-	protected void dispatch(IObservablesListener listener) {
-		((IDisposeListener) listener).handleDispose(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IChangeListener.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IChangeListener.java
deleted file mode 100644
index d0a5cee..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IChangeListener.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-
-/**
- * Listener for generic change events. Note that the change events do not carry
- * information about the change, they only specify the affected observable. To
- * listen for specific change events, use more specific change listeners.
- * 
- * @see IValueChangeListener
- * @see IListChangeListener
- * @see ISetChangeListener
- * @see IMapChangeListener
- * 
- * @since 1.0
- */
-public interface IChangeListener extends IObservablesListener {
-
-	/**
-	 * Handle a generic change to the given observable. The given event object
-	 * must only be used locally in this method because it may be reused for
-	 * other change notifications.
-	 * 
-	 * @param event
-	 */
-	public void handleChange(ChangeEvent event);
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IDecoratingObservable.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IDecoratingObservable.java
deleted file mode 100644
index f66e2f8..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IDecoratingObservable.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237718)
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * Interface for observables which decorate other observables.
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the classes in the
- *              framework that implement this interface. Note that direct
- *              implementers of this interface outside of the framework will be
- *              broken in future releases when methods are added to this
- *              interface.
- * @since 1.2
- */
-public interface IDecoratingObservable extends IObservable {
-	/**
-	 * @return the observable that this observable decorates.
-	 */
-	public IObservable getDecorated();
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IDisposeListener.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IDisposeListener.java
deleted file mode 100644
index b48755a..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IDisposeListener.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 146397)
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * Listener for dispose events. An observable object is disposed if its
- * {@link IObservable#dispose()} method has been called.
- * 
- * @since 1.2
- */
-public interface IDisposeListener extends IObservablesListener {
-	/**
-	 * Handle the event that the given observable object has been disposed. The
-	 * given event object must only be used locally in this method because it
-	 * may be reused for other dispose notifications.
-	 * 
-	 * @param staleEvent
-	 */
-	public void handleDispose(DisposeEvent staleEvent);
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IObservable.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IObservable.java
deleted file mode 100644
index b402608..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IObservable.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bugs 237718, 146397
- *******************************************************************************/
-package org.eclipse.core.databinding.observable;
-
-/**
- * An object with state that allows to listen for state changes.
- * 
- * <p>
- * Implementations must not manage listeners themselves, listener management
- * must be delegated to a private instance of type {@link ChangeSupport} if it
- * is not inherited from {@link AbstractObservable}.
- * </p>
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the classes in the
- *              framework that implement this interface. Note that direct
- *              implementers of this interface outside of the framework will be
- *              broken in future releases when methods are added to this
- *              interface.
- * 
- * @since 1.0
- * 
- */
-public interface IObservable {
-
-	/**
-	 * Returns the realm for this observable. Unless otherwise specified,
-	 * getters and setters must be accessed from within this realm. Listeners
-	 * will be within this realm when they receive events from this observable.
-	 * <p>
-	 * Because observables can only be accessed from within one realm, and they
-	 * always fire events on that realm, their state can be observed in an
-	 * incremental way. It is always safe to call getters of an observable from
-	 * within a change listener attached to that observable.
-	 * </p>
-	 * 
-	 * @return the realm
-	 */
-	public Realm getRealm();
-
-	/**
-	 * Adds the given change listener to the list of change listeners. Change
-	 * listeners are notified about changes of the state of this observable in a
-	 * generic way, without specifying the change that happened. To get the
-	 * changed state, a change listener needs to query for the current state of
-	 * this observable.
-	 * 
-	 * @param listener
-	 */
-	public void addChangeListener(IChangeListener listener);
-
-	/**
-	 * Removes the given change listener from the list of change listeners. Has
-	 * no effect if the given listener is not registered as a change listener.
-	 * 
-	 * @param listener
-	 */
-	public void removeChangeListener(IChangeListener listener);
-
-	/**
-	 * Adds the given stale listener to the list of stale listeners. Stale
-	 * listeners are notified when an observable object becomes stale, not when
-	 * is becomes non-stale.
-	 * 
-	 * @param listener
-	 * 
-	 * @see #isStale()
-	 */
-	public void addStaleListener(IStaleListener listener);
-
-	/**
-	 * Removes the given stale listener from the list of stale listeners. Has no
-	 * effect if the given listener is not registered as a stale listener.
-	 * 
-	 * @param listener
-	 */
-	public void removeStaleListener(IStaleListener listener);
-
-	/**
-	 * Returns whether the state of this observable is stale and is expected to
-	 * change soon. A non-stale observable that becomes stale will notify its
-	 * stale listeners. A stale object that becomes non-stale does so by
-	 * changing its state and notifying its change listeners, it does <b>not</b>
-	 * notify its stale listeners about becoming non-stale. Clients that do not
-	 * expect asynchronous changes may ignore staleness of observable objects.
-	 * 
-	 * @return true if this observable's state is stale and will change soon.
-	 * 
-	 * @TrackedGetter - implementers must call
-	 *                {@link ObservableTracker#getterCalled(IObservable)}.
-	 */
-	public boolean isStale();
-
-	/**
-	 * Adds the given dispose listener to the list of dispose listeners. Dispose
-	 * listeners are notified when an observable has been disposed.
-	 * 
-	 * @param listener
-	 *            the listener to add
-	 * @since 1.2
-	 */
-	public void addDisposeListener(IDisposeListener listener);
-
-	/**
-	 * Removes the given dispose listener from the list of dispose listeners.
-	 * Has no effect if the given listener is not registered as a dispose
-	 * listener.
-	 * 
-	 * @param listener
-	 *            the listener to remove
-	 * @since 1.2
-	 */
-	public void removeDisposeListener(IDisposeListener listener);
-
-	/**
-	 * Returns whether the observable has been disposed
-	 * 
-	 * @return whether the observable has been disposed
-	 * @since 1.2
-	 */
-	public boolean isDisposed();
-
-	/**
-	 * Disposes of this observable object, removing all listeners registered
-	 * with this object, and all listeners this object might have registered on
-	 * other objects.
-	 */
-	public void dispose();
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IObservableCollection.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IObservableCollection.java
deleted file mode 100644
index 8d1ee9b..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IObservableCollection.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import java.util.Collection;
-
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-
-/**
- * Interface for observable collections. Only general change listeners can be
- * added to an observable collection. Listeners interested in incremental
- * changes have to be added using more concrete subtypes such as
- * {@link IObservableList} or {@link IObservableSet}.
- * 
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the classes that
- *              implement this interface. Note that direct implementers of this
- *              interface outside of the framework will be broken in future
- *              releases when methods are added to this interface. </p>
- * 
- * @since 1.0
- */
-public interface IObservableCollection extends IObservable, Collection {
-
-	/**
-	 * Returns the element type of this observable collection, or
-	 * <code>null</code> if this observable collection is untyped.
-	 * 
-	 * @return the element type of this observable collection, or
-	 *         <code>null</code> if this observable collection is untyped.
-	 */
-	Object getElementType();
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IObservablesListener.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IObservablesListener.java
deleted file mode 100644
index bc0687c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IObservablesListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * Marker interface for all listener types in the observables framework.
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- * 
- * @since 1.0
- */
-public interface IObservablesListener {
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IObserving.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IObserving.java
deleted file mode 100644
index 1c9fc13..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IObserving.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * 
- * Mixin interface for IObservables that observe other objects.
- * 
- * @since 1.0
- * 
- */
-public interface IObserving {
-
-	/**
-	 * Returns the observed object, or <code>null</code> if this observing
-	 * object does not currently observe an object.
-	 * 
-	 * @return the observed object, or <code>null</code>
-	 */
-	public Object getObserved();
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IStaleListener.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IStaleListener.java
deleted file mode 100644
index 5729198..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/IStaleListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * Listener for staleness events. An observable object is stale if its state
- * will change eventually.
- * 
- * @since 1.0
- */
-public interface IStaleListener extends IObservablesListener {
-
-	/**
-	 * Handle the event that the given observable object is now stale. The given
-	 * event object must only be used locally in this method because it may be
-	 * reused for other change notifications.
-	 * 
-	 * @param staleEvent
-	 */
-	public void handleStale(StaleEvent staleEvent);
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ObservableEvent.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ObservableEvent.java
deleted file mode 100644
index 38a865c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ObservableEvent.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import java.util.EventObject;
-
-/**
- * Abstract event object for events fired by {@link IObservable} objects. All
- * events fired by observables must be derived from this class so that the way
- * of dispatching events can be improved in later versions of the framework.
- * 
- * @since 1.0
- * 
- */
-public abstract class ObservableEvent extends EventObject {
-
-	/**
-	 * Creates a new observable event.
-	 * 
-	 * @param source
-	 */
-	public ObservableEvent(IObservable source) {
-		super(source);
-	}
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 7693906965267871813L;
-
-	/**
-	 * Returns the observable that generated this event.
-	 * 
-	 * @return the observable that generated this event
-	 */
-	public IObservable getObservable() {
-		return (IObservable) getSource();
-	}
-
-	/**
-	 * Dispatch this event to the given listener. Subclasses must implement this
-	 * method by calling the appropriate type-safe event handling method on the
-	 * given listener according to the type of this event.
-	 * 
-	 * @param listener
-	 *            the listener that should handle the event
-	 */
-	protected abstract void dispatch(IObservablesListener listener);
-
-	/**
-	 * Returns a unique object used for distinguishing this event type from
-	 * others.
-	 * 
-	 * @return a unique object representing the concrete type of this event.
-	 */
-	protected abstract Object getListenerType();
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ObservableTracker.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ObservableTracker.java
deleted file mode 100644
index 9c57bd5..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/ObservableTracker.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bugs 210115, 146397
- *******************************************************************************/
-package org.eclipse.core.databinding.observable;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.internal.databinding.IdentityWrapper;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * This class makes it possible to monitor whenever an IObservable is read from.
- * This can be used to automatically attach and remove listeners. How to use it:
- * 
- * <p>
- * If you are implementing an IObservable, invoke getterCalled(this) whenever a
- * getter is called - that is, whenever your observable is read from. You only
- * need to do this once per method call. If one getter delegates to another, the
- * outer getter doesn't need to call the method since the inner one will.
- * </p>
- * 
- * <p>
- * If you want to determine what observables were used in a particular block of
- * code, call runAndMonitor(Runnable). This will execute the given runnable and
- * return the set of observables that were read from.
- * </p>
- * 
- * <p>
- * This can be used to automatically attach listeners. For example, imagine you
- * have a block of code that updates some widget by reading from a bunch of
- * observables. Whenever one of those observables changes, you want to re-run
- * the code and cause the widget to be refreshed. You could do this in the
- * traditional manner by attaching one listener to each observable and
- * re-running your widget update code whenever one of them changes, but this
- * code is repetitive and requires updating the listener code whenever you
- * refactor the widget updating code.
- * </p>
- * 
- * <p>
- * Alternatively, you could use a utility class that runs the code in a
- * runAndMonitor block and automatically attach listeners to any observable used
- * in updating the widget. The advantage of the latter approach is that it,
- * eliminates the code for attaching and detaching listeners and will always
- * stay in synch with changes to the widget update logic.
- * </p>
- * 
- * @since 1.0
- */
-public class ObservableTracker {
-
-	/**
-	 * Threadlocal storage pointing to the current Set of IObservables, or null
-	 * if none. Note that this is actually the top of a stack. Whenever a method
-	 * changes the current value, it remembers the old value as a local variable
-	 * and restores the old value when the method exits.
-	 */
-	private static ThreadLocal currentChangeListener = new ThreadLocal();
-
-	private static ThreadLocal currentStaleListener = new ThreadLocal();
-
-	private static ThreadLocal currentObservableSet = new ThreadLocal();
-
-	/**
-	 * Invokes the given runnable, and returns the set of IObservables that were
-	 * read by the runnable. If the runnable calls this method recursively, the
-	 * result will not contain IObservables that were used within the inner
-	 * runnable.
-	 * 
-	 * @param runnable
-	 *            runnable to execute
-	 * @param changeListener
-	 *            listener to register with all accessed observables
-	 * @param staleListener
-	 *            listener to register with all accessed observables, or
-	 *            <code>null</code> if no stale listener is to be registered
-	 * @return an array of unique observable objects
-	 */
-	public static IObservable[] runAndMonitor(Runnable runnable,
-			IChangeListener changeListener, IStaleListener staleListener) {
-		// Remember the previous value in the listener stack
-		Set lastObservableSet = (Set) currentObservableSet.get();
-		IChangeListener lastChangeListener = (IChangeListener) currentChangeListener
-				.get();
-		IStaleListener lastStaleListener = (IStaleListener) currentStaleListener
-				.get();
-
-		Set observableSet = new HashSet();
-		// Push the new listeners to the top of the stack
-		currentObservableSet.set(observableSet);
-		currentChangeListener.set(changeListener);
-		currentStaleListener.set(staleListener);
-		try {
-			runnable.run();
-		} finally {
-			// Pop the new listener off the top of the stack (by restoring the
-			// previous listener)
-			currentObservableSet.set(lastObservableSet);
-			currentChangeListener.set(lastChangeListener);
-			currentStaleListener.set(lastStaleListener);
-		}
-
-		int i = 0;
-		IObservable[] result = new IObservable[observableSet.size()];
-		for (Iterator it = observableSet.iterator(); it.hasNext();) {
-			IdentityWrapper wrapper = (IdentityWrapper) it.next();
-			result[i++] = (IObservable) wrapper.unwrap();
-		}
-
-		return result;
-	}
-	
-	/**
-	 * Runs the given runnable without tracking dependencies.
-	 * @param runnable
-	 * 
-	 * @since 1.1
-	 */
-	public static void runAndIgnore(Runnable runnable) {
-		// Remember the previous value in the listener stack
-		Set lastObservableSet = (Set) currentObservableSet.get();
-		IChangeListener lastChangeListener = (IChangeListener) currentChangeListener
-				.get();
-		IStaleListener lastStaleListener = (IStaleListener) currentStaleListener
-				.get();
-		currentObservableSet.set(null);
-		currentChangeListener.set(null);
-		currentStaleListener.set(null);
-		try {
-			runnable.run();
-		} finally {
-			// Pop the new listener off the top of the stack (by restoring the
-			// previous listener)
-			currentObservableSet.set(lastObservableSet);
-			currentChangeListener.set(lastChangeListener);
-			currentStaleListener.set(lastStaleListener);
-		}
-	}
-
-	/*
-	 * Returns the same string as the default Object.toString() implementation.
-	 * getterCalled() uses this method IObservable.toString() to avoid infinite
-	 * recursion and stack overflow.
-	 */
-	private static String toString(IObservable observable) {
-		return observable.getClass().getName() + "@" //$NON-NLS-1$
-				+ Integer.toHexString(System.identityHashCode(observable));
-	}
-
-	/**
-	 * Notifies the ObservableTracker that an observable was read from. The
-	 * JavaDoc for methods that invoke this method should include the following
-	 * tag: "@TrackedGetter This method will notify ObservableTracker that the
-	 * receiver has been read from". This lets callers know that they can rely
-	 * on automatic updates from the object without explicitly attaching a
-	 * listener.
-	 * 
-	 * @param observable
-	 */
-	public static void getterCalled(IObservable observable) {
-		if (observable.isDisposed())
-			Assert.isTrue(false, "Getter called on disposed observable " //$NON-NLS-1$
-					+ toString(observable));
-		Realm realm = observable.getRealm();
-		if (!realm.isCurrent())
-			Assert.isTrue(false, "Getter called outside realm of observable " //$NON-NLS-1$
-					+ toString(observable));
-
-		Set lastObservableSet = (Set) currentObservableSet.get();
-		if (lastObservableSet == null) {
-			return;
-		}
-		IChangeListener lastChangeListener = (IChangeListener) currentChangeListener
-				.get();
-		IStaleListener lastStaleListener = (IStaleListener) currentStaleListener
-				.get();
-
-		boolean added = false;
-		if (lastObservableSet != null) {
-			added = lastObservableSet.add(new IdentityWrapper(observable));
-		}
-
-		// If anyone is listening for observable usage...
-		if (added && lastChangeListener != null) {
-			observable.addChangeListener(lastChangeListener);
-		}
-		if (added && lastStaleListener != null) {
-			observable.addStaleListener(lastStaleListener);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/Observables.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/Observables.java
deleted file mode 100644
index fbc3ebf..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/Observables.java
+++ /dev/null
@@ -1,634 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 Cerner Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matt Carter - bug 212518 (constantObservableValue)
- *     Matthew Hall - bugs 208332, 212518, 219909, 184830, 237718, 245647,
- *         226289
- *     Marko Topolnik - bug 184830
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.list.DecoratingObservableList;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ObservableList;
-import org.eclipse.core.databinding.observable.map.DecoratingObservableMap;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
-import org.eclipse.core.databinding.observable.set.DecoratingObservableSet;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.ObservableSet;
-import org.eclipse.core.databinding.observable.value.DecoratingObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IVetoableValue;
-import org.eclipse.core.databinding.observable.value.ValueChangingEvent;
-import org.eclipse.core.internal.databinding.observable.ConstantObservableValue;
-import org.eclipse.core.internal.databinding.observable.DelayedObservableValue;
-import org.eclipse.core.internal.databinding.observable.EmptyObservableList;
-import org.eclipse.core.internal.databinding.observable.EmptyObservableSet;
-import org.eclipse.core.internal.databinding.observable.MapEntryObservableValue;
-import org.eclipse.core.internal.databinding.observable.StalenessObservableValue;
-import org.eclipse.core.internal.databinding.observable.UnmodifiableObservableList;
-import org.eclipse.core.internal.databinding.observable.UnmodifiableObservableMap;
-import org.eclipse.core.internal.databinding.observable.UnmodifiableObservableSet;
-import org.eclipse.core.internal.databinding.observable.UnmodifiableObservableValue;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * Contains static methods to operate on or return
- * {@link IObservable Observables}.
- * 
- * @since 1.0
- */
-public class Observables {
-	/**
-	 * Returns an observable which delays notification of value change events
-	 * from <code>observable</code> until <code>delay</code> milliseconds have
-	 * elapsed since the last change event. This observable helps to boost
-	 * performance in situations where an observable has computationally
-	 * expensive listeners or many dependencies. A common use of this observable
-	 * is to delay validation of user input until the user stops typing in a UI
-	 * field.
-	 * <p>
-	 * To notify about pending changes, the returned observable fires a stale
-	 * event when the wrapped observable value fires a change event, and remains
-	 * stale until the delay has elapsed and the value change is fired. A call
-	 * to {@link IObservableValue#getValue() getValue()} while a value change is
-	 * pending will fire the value change immediately, short-circuiting the
-	 * delay.
-	 * <p>
-	 * <b>Note:</b>
-	 * <ul>
-	 * <li>Use SWTObservables.observeDelayedValue() instead when the target
-	 * observable is observing a SWT Control, or
-	 * ViewersObservables.observeDelayedValue() when the target observable is
-	 * observing a JFace Viewer. These observables ensure that pending value
-	 * changes are fired when the underlying control loses focus. (Otherwise, it
-	 * is possible for pending changes to be lost if a window is closed before
-	 * the delay has elapsed.)
-	 * <li>This observable does not forward {@link ValueChangingEvent} events
-	 * from a wrapped {@link IVetoableValue}.
-	 * </ul>
-	 * 
-	 * @param delay
-	 *            the delay in milliseconds
-	 * @param observable
-	 *            the observable being delayed
-	 * @return an observable which delays notification of value change events
-	 *         from <code>observable</code> until <code>delay</code>
-	 *         milliseconds have elapsed since the last change event.
-	 * 
-	 * @since 1.2
-	 */
-	public static IObservableValue observeDelayedValue(int delay,
-			IObservableValue observable) {
-		return new DelayedObservableValue(delay, observable);
-	}
-
-	/**
-	 * Returns an unmodifiable observable value backed by the given observable
-	 * value.
-	 * 
-	 * @param value
-	 *            the value to wrap in an unmodifiable value
-	 * @return an unmodifiable observable value backed by the given observable
-	 *         value
-	 * @since 1.1
-	 */
-	public static IObservableValue unmodifiableObservableValue(
-			IObservableValue value) {
-		Assert.isNotNull(value, "Argument 'value' cannot be null"); //$NON-NLS-1$
-		return new UnmodifiableObservableValue(value);
-	}
-
-	/**
-	 * Returns an observable value with the given constant value.
-	 * 
-	 * @param realm
-	 *            the observable's realm
-	 * @param value
-	 *            the observable's constant value
-	 * @param valueType
-	 *            the observable's value type
-	 * @return an immutable observable value with the given constant value
-	 * @since 1.1
-	 */
-	public static IObservableValue constantObservableValue(Realm realm,
-			Object value, Object valueType) {
-		return new ConstantObservableValue(realm, value, valueType);
-	}
-
-	/**
-	 * Returns an observable value with the given constant value.
-	 * 
-	 * @param realm
-	 *            the observable's realm
-	 * @param value
-	 *            the observable's constant value
-	 * @return an immutable observable value with the given constant value
-	 * @since 1.1
-	 */
-	public static IObservableValue constantObservableValue(Realm realm,
-			Object value) {
-		return constantObservableValue(realm, value, null);
-	}
-
-	/**
-	 * Returns an observable value with the given constant value.
-	 * 
-	 * @param value
-	 *            the observable's constant value
-	 * @param valueType
-	 *            the observable's value type
-	 * @return an immutable observable value with the given constant value
-	 * @since 1.1
-	 */
-	public static IObservableValue constantObservableValue(Object value,
-			Object valueType) {
-		return constantObservableValue(Realm.getDefault(), value, valueType);
-	}
-
-	/**
-	 * Returns an observable value with the given constant value.
-	 * 
-	 * @param value
-	 *            the observable's constant value
-	 * @return an immutable observable value with the given constant value
-	 * @since 1.1
-	 */
-	public static IObservableValue constantObservableValue(Object value) {
-		return constantObservableValue(Realm.getDefault(), value, null);
-	}
-
-	/**
-	 * Returns an unmodifiable observable list backed by the given observable
-	 * list.
-	 * 
-	 * @param list
-	 *            the list to wrap in an unmodifiable list
-	 * @return an unmodifiable observable list backed by the given observable
-	 *         list
-	 */
-	public static IObservableList unmodifiableObservableList(
-			IObservableList list) {
-		if (list == null) {
-			throw new IllegalArgumentException("List parameter cannot be null."); //$NON-NLS-1$
-		}
-
-		return new UnmodifiableObservableList(list);
-	}
-
-	/**
-	 * Returns an unmodifiable observable set backed by the given observable
-	 * set.
-	 * 
-	 * @param set
-	 *            the set to wrap in an unmodifiable set
-	 * @return an unmodifiable observable set backed by the given observable set
-	 * @since 1.1
-	 */
-	public static IObservableSet unmodifiableObservableSet(IObservableSet set) {
-		if (set == null) {
-			throw new IllegalArgumentException("Set parameter cannot be null"); //$NON-NLS-1$
-		}
-
-		return new UnmodifiableObservableSet(set);
-	}
-
-	/**
-	 * Returns an unmodifiable observable map backed by the given observable
-	 * map.
-	 * 
-	 * @param map
-	 *            the map to wrap in an unmodifiable map
-	 * @return an unmodifiable observable map backed by the given observable
-	 *         map.
-	 * @since 1.2
-	 */
-	public static IObservableMap unmodifiableObservableMap(IObservableMap map) {
-		if (map == null) {
-			throw new IllegalArgumentException("Map parameter cannot be null"); //$NON-NLS-1$
-		}
-
-		return new UnmodifiableObservableMap(map);
-	}
-
-	/**
-	 * Returns an empty observable list. The returned list continues to work
-	 * after it has been disposed of and can be disposed of multiple times.
-	 * 
-	 * @return an empty observable list.
-	 */
-	public static IObservableList emptyObservableList() {
-		return emptyObservableList(Realm.getDefault(), null);
-	}
-
-	/**
-	 * Returns an empty observable list of the given element type. The returned
-	 * list continues to work after it has been disposed of and can be disposed
-	 * of multiple times.
-	 * 
-	 * @param elementType
-	 *            the element type of the returned list
-	 * @return an empty observable list
-	 * @since 1.1
-	 */
-	public static IObservableList emptyObservableList(Object elementType) {
-		return emptyObservableList(Realm.getDefault(), elementType);
-	}
-
-	/**
-	 * Returns an empty observable list belonging to the given realm. The
-	 * returned list continues to work after it has been disposed of and can be
-	 * disposed of multiple times.
-	 * 
-	 * @param realm
-	 *            the realm of the returned list
-	 * @return an empty observable list.
-	 */
-	public static IObservableList emptyObservableList(Realm realm) {
-		return emptyObservableList(realm, null);
-	}
-
-	/**
-	 * Returns an empty observable list of the given element type and belonging
-	 * to the given realm. The returned list continues to work after it has been
-	 * disposed of and can be disposed of multiple times.
-	 * 
-	 * @param realm
-	 *            the realm of the returned list
-	 * @param elementType
-	 *            the element type of the returned list
-	 * @return an empty observable list
-	 * @since 1.1
-	 */
-	public static IObservableList emptyObservableList(Realm realm,
-			Object elementType) {
-		return new EmptyObservableList(realm, elementType);
-	}
-
-	/**
-	 * Returns an empty observable set. The returned set continues to work after
-	 * it has been disposed of and can be disposed of multiple times.
-	 * 
-	 * @return an empty observable set.
-	 */
-	public static IObservableSet emptyObservableSet() {
-		return emptyObservableSet(Realm.getDefault(), null);
-	}
-
-	/**
-	 * Returns an empty observable set of the given element type. The returned
-	 * set continues to work after it has been disposed of and can be disposed
-	 * of multiple times.
-	 * 
-	 * @param elementType
-	 *            the element type of the returned set
-	 * @return an empty observable set
-	 * @since 1.1
-	 */
-	public static IObservableSet emptyObservableSet(Object elementType) {
-		return emptyObservableSet(Realm.getDefault(), elementType);
-	}
-
-	/**
-	 * Returns an empty observable set belonging to the given realm. The
-	 * returned set continues to work after it has been disposed of and can be
-	 * disposed of multiple times.
-	 * 
-	 * @param realm
-	 *            the realm of the returned set
-	 * @return an empty observable set.
-	 */
-	public static IObservableSet emptyObservableSet(Realm realm) {
-		return emptyObservableSet(realm, null);
-	}
-
-	/**
-	 * Returns an empty observable set of the given element type and belonging
-	 * to the given realm. The returned set continues to work after it has been
-	 * disposed of and can be disposed of multiple times.
-	 * 
-	 * @param realm
-	 *            the realm of the returned set
-	 * @param elementType
-	 *            the element type of the returned set
-	 * @return an empty observable set
-	 * @since 1.1
-	 */
-	public static IObservableSet emptyObservableSet(Realm realm,
-			Object elementType) {
-		return new EmptyObservableSet(realm, elementType);
-	}
-
-	/**
-	 * Returns an observable set backed by the given set.
-	 * 
-	 * @param set
-	 *            the set to wrap in an IObservableSet
-	 * @return an observable set backed by the given set
-	 */
-	public static IObservableSet staticObservableSet(Set set) {
-		return staticObservableSet(Realm.getDefault(), set, Object.class);
-	}
-
-	/**
-	 * Returns an observable set of the given element type, backed by the given
-	 * set.
-	 * 
-	 * @param set
-	 *            the set to wrap in an IObservableSet
-	 * @param elementType
-	 *            the element type of the returned set
-	 * @return Returns an observable set backed by the given unchanging set
-	 * @since 1.1
-	 */
-	public static IObservableSet staticObservableSet(Set set, Object elementType) {
-		return staticObservableSet(Realm.getDefault(), set, elementType);
-	}
-
-	/**
-	 * Returns an observable set belonging to the given realm, backed by the
-	 * given set.
-	 * 
-	 * @param realm
-	 *            the realm of the returned set
-	 * @param set
-	 *            the set to wrap in an IObservableSet
-	 * @return an observable set backed by the given unchanging set
-	 */
-	public static IObservableSet staticObservableSet(Realm realm, Set set) {
-		return staticObservableSet(realm, set, Object.class);
-	}
-
-	/**
-	 * Returns an observable set of the given element type and belonging to the
-	 * given realm, backed by the given set.
-	 * 
-	 * @param realm
-	 *            the realm of the returned set
-	 * @param set
-	 *            the set to wrap in an IObservableSet
-	 * @param elementType
-	 *            the element type of the returned set
-	 * @return an observable set backed by the given set
-	 * @since 1.1
-	 */
-	public static IObservableSet staticObservableSet(Realm realm, Set set,
-			Object elementType) {
-		return new ObservableSet(realm, set, elementType) {
-			public synchronized void addChangeListener(IChangeListener listener) {
-			}
-
-			public synchronized void addStaleListener(IStaleListener listener) {
-			}
-
-			public synchronized void addSetChangeListener(ISetChangeListener listener) {
-			}
-		};
-	}
-
-	/**
-	 * Returns an observable value that contains the same value as the given
-	 * observable, and fires the same events as the given observable, but can be
-	 * disposed of without disposing of the wrapped observable.
-	 * 
-	 * @param target
-	 *            the observable value to wrap
-	 * @return a disposable proxy for the given observable value.
-	 * @since 1.2
-	 */
-	public static IObservableValue proxyObservableValue(IObservableValue target) {
-		return new DecoratingObservableValue(target, false);
-	}
-
-	/**
-	 * Returns an observable set that contains the same elements as the given
-	 * set, and fires the same events as the given set, but can be disposed of
-	 * without disposing of the wrapped set.
-	 * 
-	 * @param target
-	 *            the set to wrap
-	 * @return a disposable proxy for the given observable set
-	 */
-	public static IObservableSet proxyObservableSet(IObservableSet target) {
-		return new DecoratingObservableSet(target, false);
-	}
-
-	/**
-	 * Returns an observable list that contains the same elements as the given
-	 * list, and fires the same events as the given list, but can be disposed of
-	 * without disposing of the wrapped list.
-	 * 
-	 * @param target
-	 *            the list to wrap
-	 * @return a disposable proxy for the given observable list
-	 * @since 1.1
-	 */
-	public static IObservableList proxyObservableList(IObservableList target) {
-		return new DecoratingObservableList(target, false);
-	}
-
-	/**
-	 * Returns an observable map that contains the same entries as the given
-	 * map, and fires the same events as the given map, but can be disposed of
-	 * without disposing of the wrapped map.
-	 * 
-	 * @param target
-	 *            the map to wrap
-	 * @return a disposable proxy for the given observable map
-	 * @since 1.2
-	 */
-	public static IObservableMap proxyObservableMap(IObservableMap target) {
-		return new DecoratingObservableMap(target, false);
-	}
-
-	/**
-	 * Returns an observable list backed by the given list.
-	 * 
-	 * @param list
-	 *            the list to wrap in an IObservableList
-	 * @return an observable list backed by the given unchanging list
-	 */
-	public static IObservableList staticObservableList(List list) {
-		return staticObservableList(Realm.getDefault(), list, Object.class);
-	}
-
-	/**
-	 * Returns an observable list of the given element type, backed by the given
-	 * list.
-	 * 
-	 * @param list
-	 *            the list to wrap in an IObservableList
-	 * @param elementType
-	 *            the element type of the returned list
-	 * @return an observable list backed by the given unchanging list
-	 * @since 1.1
-	 */
-	public static IObservableList staticObservableList(List list,
-			Object elementType) {
-		return staticObservableList(Realm.getDefault(), list, elementType);
-	}
-
-	/**
-	 * Returns an observable list belonging to the given realm, backed by the
-	 * given list.
-	 * 
-	 * @param realm
-	 *            the realm of the returned list
-	 * @param list
-	 *            the list to wrap in an IObservableList
-	 * @return an observable list backed by the given unchanging list
-	 */
-	public static IObservableList staticObservableList(Realm realm, List list) {
-		return staticObservableList(realm, list, Object.class);
-	}
-
-	/**
-	 * Returns an observable list of the given element type and belonging to the
-	 * given realm, backed by the given list.
-	 * 
-	 * @param realm
-	 *            the realm of the returned list
-	 * @param list
-	 *            the list to wrap in an IObservableList
-	 * @param elementType
-	 *            the element type of the returned list
-	 * @return an observable list backed by the given unchanging list
-	 * @since 1.1
-	 */
-	public static IObservableList staticObservableList(Realm realm, List list,
-			Object elementType) {
-		return new ObservableList(realm, list, elementType) {
-			public synchronized void addChangeListener(IChangeListener listener) {
-			}
-
-			public synchronized void addStaleListener(IStaleListener listener) {
-			}
-
-			public synchronized void addListChangeListener(IListChangeListener listener) {
-			}
-		};
-	}
-
-	/**
-	 * Returns an observable value of type <code>Boolean.TYPE</code> which
-	 * tracks whether the given observable is stale.
-	 * 
-	 * @param observable
-	 *            the observable to track
-	 * @return an observable value which tracks whether the given observable is
-	 *         stale
-	 * 
-	 * @since 1.1
-	 */
-	public static IObservableValue observeStale(IObservable observable) {
-		return new StalenessObservableValue(observable);
-	}
-
-	/**
-	 * Returns an observable value that tracks changes to the value of an
-	 * observable map's entry specified by its key.
-	 * <p>
-	 * The state where the key does not exist in the map is equivalent to the
-	 * state where the key exists and its value is <code>null</code>. The
-	 * transition between these two states is not considered a value change and
-	 * no event is fired.
-	 * 
-	 * @param map
-	 *            the observable map whose entry will be tracked.
-	 * @param key
-	 *            the key identifying the map entry to track.
-	 * @return an observable value that tracks the value associated with the
-	 *         specified key in the given map
-	 * @since 1.2
-	 */
-	public static IObservableValue observeMapEntry(IObservableMap map, Object key) {
-		return observeMapEntry(map, key, map.getValueType());
-	}
-
-	/**
-	 * Returns an observable value that tracks changes to the value of an
-	 * observable map's entry specified by its key.
-	 * <p>
-	 * The state where the key does not exist in the map is equivalent to the
-	 * state where the key exists and its value is <code>null</code>. The
-	 * transition between these two states is not considered a value change and
-	 * no event is fired.
-	 * 
-	 * @param map
-	 *            the observable map whose entry will be tracked.
-	 * @param key
-	 *            the key identifying the map entry to track.
-	 * @param valueType
-	 *            the type of the value. May be <code>null</code>, meaning
-	 *            the value is untyped.
-	 * @return an observable value that tracks the value associated with the
-	 *         specified key in the given map
-	 * @since 1.1
-	 */
-	public static IObservableValue observeMapEntry(IObservableMap map,
-			Object key, Object valueType) {
-		if (valueType == null)
-			valueType = map.getValueType();
-		return new MapEntryObservableValue(map, key, valueType);
-	}
-
-	/**
-	 * Returns a factory for creating obervable values tracking the value of the
-	 * {@link IObservableMap observable map} entry identified by a particular
-	 * key.
-	 * 
-	 * @param map
-	 *            the observable map whose entry will be tracked.
-	 * @param valueType
-	 *            the type of the value. May be <code>null</code>, meaning
-	 *            the value is untyped.
-	 * @return a factory for creating observable values tracking the value of
-	 *         the observable map entry identified by a particular key object.
-	 * @since 1.1
-	 */
-	public static IObservableFactory mapEntryValueFactory(
-			final IObservableMap map, final Object valueType) {
-		return new IObservableFactory() {
-			public IObservable createObservable(Object key) {
-				return observeMapEntry(map, key, valueType);
-			}
-		};
-	}
-
-	/**
-	 * Helper method for <code>MasterDetailObservables.detailValue(master,
-	 * mapEntryValueFactory(map, valueType), valueType)</code>.
-	 * 
-	 * @param map
-	 *            the observable map whose entry will be tracked.
-	 * @param master
-	 *            the observable value that identifies which map entry to track.
-	 * @param valueType
-	 *            the type of the value. May be <code>null</code>, meaning
-	 *            the value is untyped.
-	 * @return an observable value tracking the current value of the specified
-	 *         key in the given map an observable value that tracks the current
-	 *         value of the named property for the current value of the master
-	 *         observable value
-	 * @since 1.1
-	 */
-	public static IObservableValue observeDetailMapEntry(IObservableMap map,
-			IObservableValue master, Object valueType) {
-		return MasterDetailObservables.detailValue(master,
-				mapEntryValueFactory(map, valueType), valueType);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/Realm.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/Realm.java
deleted file mode 100644
index 4995028..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/Realm.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 168153
- *     Boris Bokowski - bug 245647
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-import java.util.Timer;
-import java.util.TimerTask;
-
-import org.eclipse.core.databinding.Binding;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.internal.databinding.Queue;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-
-/**
- * A realm defines a context from which objects implementing {@link IObservable}
- * must be accessed, and on which these objects will notify their listeners. To
- * bridge between observables from different realms, subclasses of
- * {@link Binding} can be used.
- * <p>
- * A block of code is said to be executing within a realm if calling
- * {@link #isCurrent()} from that block returns true. Code reached by calling
- * methods from that block will execute within the same realm, with the
- * exception of methods on this class that can be used to execute code within a
- * specific realm. Clients can use {@link #syncExec(Runnable)},
- * {@link #asyncExec(Runnable)}, or {@link #exec(Runnable)} to execute a
- * runnable within this realm. Note that using {@link #syncExec(Runnable)} can
- * lead to deadlocks and should be avoided if the current thread holds any
- * locks.
- * </p>
- * <p>
- * It is instructive to think about possible implementations of Realm: It can be
- * based on executing on a designated thread such as a UI thread, or based on
- * holding a lock. In the former case, calling syncExec on a realm that is not
- * the current realm will execute the given runnable on a different thread (the
- * designated thread). In the latter case, calling syncExec may execute the
- * given runnable on the calling thread, but calling
- * {@link #asyncExec(Runnable)} will execute the given runnable on a different
- * thread. Therefore, no assumptions can be made about the thread that will
- * execute arguments to {@link #asyncExec(Runnable)},
- * {@link #syncExec(Runnable)}, or {@link #exec(Runnable)}.
- * </p>
- * <p>
- * It is possible that a block of code is executing within more than one realm.
- * This can happen for implementations of Realm that are based on holding a lock
- * but don't use a separate thread to run runnables given to
- * {@link #syncExec(Runnable)}. Realm implementations of this kind should be
- * appropriately documented because it increases the opportunity for deadlock.
- * </p>
- * <p>
- * Some implementations of {@link IObservable} provide constructors which do not
- * take a Realm argument and are specified to create the observable instance
- * with the current default realm. The default realm can be set for the
- * currently executing thread by using {@link #runWithDefault(Realm, Runnable)}.
- * Note that the default realm does not have to be the current realm.
- * </p>
- * <p>
- * Subclasses must override at least one of asyncExec()/syncExec(). For realms
- * based on a designated thread, it may be easier to implement asyncExec and
- * keep the default implementation of syncExec. For realms based on holding a
- * lock, it may be easier to implement syncExec and keep the default
- * implementation of asyncExec.
- * </p>
- * 
- * @since 1.0
- * 
- * @see IObservable
- */
-public abstract class Realm {
-
-	private static ThreadLocal defaultRealm = new ThreadLocal();
-
-	/**
-	 * Returns the default realm for the calling thread, or <code>null</code>
-	 * if no default realm has been set.
-	 * 
-	 * @return the default realm, or <code>null</code>
-	 */
-	public static Realm getDefault() {
-		return (Realm) defaultRealm.get();
-	}
-	
-	/**
-	 * Sets the default realm for the calling thread, returning the current
-	 * default thread. This method is inherently unsafe, it is recommended to
-	 * use {@link #runWithDefault(Realm, Runnable)} instead. This method is
-	 * exposed to subclasses to facilitate testing.
-	 * 
-	 * @param realm
-	 *            the new default realm, or <code>null</code>
-	 * @return the previous default realm, or <code>null</code>
-	 */
-	protected static Realm setDefault(Realm realm) {
-		Realm oldValue = getDefault();
-		defaultRealm.set(realm);
-		return oldValue;
-	}
-
-	/**
-	 * @return true if the caller is executing in this realm. This method must
-	 *         not have side-effects (such as, for example, implicitly placing
-	 *         the caller in this realm).
-	 */
-	abstract public boolean isCurrent();
-
-	private Thread workerThread;
-	
-	private volatile Timer timer;
-
-	Queue workQueue = new Queue();
-	
-	/**
-	 * Runs the given runnable. If an exception occurs within the runnable, it
-	 * is logged and not re-thrown. If the runnable implements
-	 * {@link ISafeRunnable}, the exception is passed to its
-	 * <code>handleException<code> method.
-	 * 
-	 * @param runnable
-	 */
-	protected static void safeRun(final Runnable runnable) {
-		ISafeRunnable safeRunnable;
-		if (runnable instanceof ISafeRunnable) {
-			safeRunnable = (ISafeRunnable) runnable;
-		} else {
-			safeRunnable = new ISafeRunnable() {
-				public void handleException(Throwable exception) {
-					Policy
-							.getLog()
-							.log(
-									new Status(
-											IStatus.ERROR,
-											Policy.JFACE_DATABINDING,
-											IStatus.OK,
-											"Unhandled exception: " + exception.getMessage(), exception)); //$NON-NLS-1$
-				}
-				public void run() throws Exception {
-					runnable.run();
-				}
-			};
-		}
-		SafeRunner.run(safeRunnable);
-	}
-
-	/**
-	 * Causes the <code>run()</code> method of the runnable to be invoked from
-	 * within this realm. If the caller is executing in this realm, the
-	 * runnable's run method is invoked directly, otherwise it is run at the
-	 * next reasonable opportunity using asyncExec.
-	 * <p>
-	 * If the given runnable is an instance of {@link ISafeRunnable}, its
-	 * exception handler method will be called if any exceptions occur while
-	 * running it. Otherwise, the exception will be logged.
-	 * </p>
-	 * 
-	 * @param runnable
-	 */
-	public void exec(Runnable runnable) {
-		if (isCurrent()) {
-			safeRun(runnable);
-		} else {
-			asyncExec(runnable);
-		}
-	}
-
-	/**
-	 * Causes the <code>run()</code> method of the runnable to be invoked from
-	 * within this realm at the next reasonable opportunity. The caller of this
-	 * method continues to run in parallel, and is not notified when the
-	 * runnable has completed.
-	 * <p>
-	 * If the given runnable is an instance of {@link ISafeRunnable}, its
-	 * exception handler method will be called if any exceptions occur while
-	 * running it. Otherwise, the exception will be logged.
-	 * </p>
-	 * <p>
-	 * Subclasses should use {@link #safeRun(Runnable)} to run the runnable.
-	 * </p>
-	 * 
-	 * @param runnable
-	 */
-	public void asyncExec(Runnable runnable) {
-		synchronized (workQueue) {
-			ensureWorkerThreadIsRunning();
-			workQueue.enqueue(runnable);
-			workQueue.notifyAll();
-		}
-	}
-
-	/**
-	 * Causes the <code>run()</code> method of the runnable to be invoked from
-	 * within this realm after the specified number of milliseconds have
-	 * elapsed. If milliseconds is less than zero, the runnable is not executed.
-	 * The caller of this method continues to run in parallel, and is not
-	 * notified when the runnable has completed.
-	 * <p>
-	 * If the given runnable is an instance of {@link ISafeRunnable}, its
-	 * exception handler method will be called if any exceptions occur while
-	 * running it. Otherwise, the exception will be logged.
-	 * </p>
-	 * <p>
-	 * Subclasses should use {@link #safeRun(Runnable)} to run the runnable.
-	 * </p>
-	 * 
-	 * @param milliseconds
-	 * @param runnable
-	 * @since 1.2
-	 */
-	public void timerExec(int milliseconds, final Runnable runnable) {
-		if (milliseconds < 0) {
-			return;
-		} else if (milliseconds == 0) {
-			asyncExec(runnable);
-		} else {
-			synchronized (workQueue) {
-				if (timer == null) {
-					timer = new Timer(true);
-				}
-				timer.schedule(new TimerTask() {
-					public void run() {
-						asyncExec(runnable);
-					}
-				}, milliseconds);
-			}
-		}
-
-	}
-
-	/**
-	 * 
-	 */
-	private void ensureWorkerThreadIsRunning() {
-		if (workerThread == null) {
-			workerThread = new Thread() {
-				public void run() {
-					try {
-						while (true) {
-							Runnable work = null;
-							synchronized (workQueue) {
-								while (workQueue.isEmpty()) {
-									workQueue.wait();
-								}
-								work = (Runnable) workQueue.dequeue();
-							}
-							syncExec(work);
-						}
-					} catch (InterruptedException e) {
-						// exit
-					}
-				}
-			};
-			workerThread.start();
-		}
-	}
-
-	/**
-	 * Causes the <code>run()</code> method of the runnable to be invoked from
-	 * within this realm at the next reasonable opportunity. This method is
-	 * blocking the caller until the runnable completes.
-	 * <p>
-	 * If the given runnable is an instance of {@link ISafeRunnable}, its
-	 * exception handler method will be called if any exceptions occur while
-	 * running it. Otherwise, the exception will be logged.
-	 * </p>
-	 * <p>
-	 * Subclasses should use {@link #safeRun(Runnable)} to run the runnable.
-	 * </p>
-	 * <p>
-	 * Note: This class is not meant to be called by clients and therefore has
-	 * only protected access.
-	 * </p>
-	 * 
-	 * @param runnable
-	 */
-	protected void syncExec(Runnable runnable) {
-		SyncRunnable syncRunnable = new SyncRunnable(runnable);
-		asyncExec(syncRunnable);
-		synchronized (syncRunnable) {
-			while (!syncRunnable.hasRun) {
-				try {
-					syncRunnable.wait();
-				} catch (InterruptedException e) {
-					Thread.currentThread().interrupt();
-				}
-			}
-		}
-	}
-
-	static class SyncRunnable implements Runnable {
-		boolean hasRun = false;
-
-		private Runnable runnable;
-
-		SyncRunnable(Runnable runnable) {
-			this.runnable = runnable;
-		}
-
-		public void run() {
-			try {
-				safeRun(runnable);
-			} finally {
-				synchronized (this) {
-					hasRun = true;
-					this.notifyAll();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Sets the provided <code>realm</code> as the default for the duration of
-	 * {@link Runnable#run()} and resets the previous realm after completion.
-	 * Note that this will not set the given realm as the current realm.
-	 * 
-	 * @param realm
-	 * @param runnable
-	 */
-	public static void runWithDefault(Realm realm, Runnable runnable) {
-		Realm oldRealm = Realm.getDefault();
-		try {
-			defaultRealm.set(realm);
-			runnable.run();
-		} finally {
-			defaultRealm.set(oldRealm);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/StaleEvent.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/StaleEvent.java
deleted file mode 100644
index 14e8c76..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/StaleEvent.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable;
-
-/**
- * Generic event denoting that the state of an {@link IObservable} object is
- * about to change. Note that this event is only fired when an observable
- * becomes stale, not when it becomes unstale; an observable that becomes
- * unstale should always fire a change event. Staleness can be used (for
- * example) to notify listeners when an observable has started a background
- * thread for updating its state. Clients can safely ignore staleness.
- * 
- * @see IObservable#isStale()
- * 
- * @since 1.0
- * 
- */
-public class StaleEvent extends ObservableEvent {
-
-	/**
-	 * Creates a new stale event.
-	 * 
-	 * @param source
-	 *            the source observable
-	 */
-	public StaleEvent(IObservable source) {
-		super(source);
-	}
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 3491012225431471077L;
-
-	static final Object TYPE = new Object();
-
-	protected void dispatch(IObservablesListener listener) {
-		((IStaleListener) listener).handleStale(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/AbstractObservableList.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/AbstractObservableList.java
deleted file mode 100644
index 88506c7..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/AbstractObservableList.java
+++ /dev/null
@@ -1,348 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bugs 164653, 167204
- *     Matthew Hall - bugs 118516, 208858, 208332, 247367, 146397
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.AbstractList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.ChangeSupport;
-import org.eclipse.core.databinding.observable.DisposeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.AssertionFailedException;
-
-/**
- * Subclasses should override at least get(int index) and size().
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- * 
- */
-public abstract class AbstractObservableList extends AbstractList implements
-		IObservableList {
-
-	private ChangeSupport changeSupport;
-	private boolean disposed = false;
-
-	/**
-	 * @param realm 
-	 * 
-	 */
-	public AbstractObservableList(Realm realm) {
-		Assert.isNotNull(realm, "Realm cannot be null"); //$NON-NLS-1$
-		changeSupport = new ChangeSupport(realm){
-			protected void firstListenerAdded() {
-				AbstractObservableList.this.firstListenerAdded();
-			}
-			protected void lastListenerRemoved() {
-				AbstractObservableList.this.lastListenerRemoved();
-			}
-		};
-	}
-
-	/**
-	 * 
-	 */
-	public AbstractObservableList() {
-		this(Realm.getDefault());
-	}
-	
-	public boolean isStale() {
-		getterCalled();
-		return false;
-	}
-
-	public synchronized void addListChangeListener(IListChangeListener listener) {
-		if (!disposed)
-			changeSupport.addListener(ListChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeListChangeListener(IListChangeListener listener) {
-		if (!disposed)
-			changeSupport.removeListener(ListChangeEvent.TYPE, listener);
-	}
-
-	protected void fireListChange(ListDiff diff) {
-		// fire general change event first
-		fireChange();
-		changeSupport.fireEvent(new ListChangeEvent(this, diff));
-	}
-
-	public synchronized void addChangeListener(IChangeListener listener) {
-		if (!disposed)
-			changeSupport.addChangeListener(listener);
-	}
-
-	public synchronized void removeChangeListener(IChangeListener listener) {
-		if (!disposed)
-			changeSupport.removeChangeListener(listener);
-	}
-
-	public synchronized void addStaleListener(IStaleListener listener) {
-		if (!disposed)
-			changeSupport.addStaleListener(listener);
-	}
-
-	public synchronized void removeStaleListener(IStaleListener listener) {
-		if (!disposed)
-			changeSupport.removeStaleListener(listener);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public synchronized void addDisposeListener(IDisposeListener listener) {
-		if (changeSupport != null) {
-			changeSupport.addDisposeListener(listener);
-		}
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public synchronized void removeDisposeListener(IDisposeListener listener) {
-		if (changeSupport != null) {
-			changeSupport.removeDisposeListener(listener);
-		}
-	}
-
-	/**
-	 * Fires change event. Must be invoked from the current realm.
-	 */
-	protected void fireChange() {
-		checkRealm();
-		changeSupport.fireEvent(new ChangeEvent(this));
-	}
-
-	/**
-	 * Fires stale event. Must be invoked from the current realm.
-	 */
-	protected void fireStale() {
-		checkRealm();
-		changeSupport.fireEvent(new StaleEvent(this));
-	}
-
-	/**
-	 * 
-	 */
-	protected void firstListenerAdded() {
-	}
-
-	/**
-	 * 
-	 */
-	protected void lastListenerRemoved() {
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public boolean isDisposed() {
-		return disposed;
-	}
-
-	/**
-	 * 
-	 */
-	public synchronized void dispose() {
-		if (!disposed) {
-			disposed = true;
-			changeSupport.fireEvent(new DisposeEvent(this));
-			changeSupport.dispose();
-			changeSupport = null;
-			lastListenerRemoved();
-		}
-	}
-
-	public final int size() {
-		getterCalled();
-		return doGetSize();
-	}
-
-	/**
-	 * @return the size
-	 */
-	protected abstract int doGetSize();
-
-	/**
-	 * 
-	 */
-	private void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		return super.isEmpty();
-	}
-
-	public boolean contains(Object o) {
-		getterCalled();
-		return super.contains(o);
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final Iterator wrappedIterator = super.iterator();
-		return new Iterator() {
-			public void remove() {
-				wrappedIterator.remove();
-			}
-
-			public boolean hasNext() {
-				return wrappedIterator.hasNext();
-			}
-
-			public Object next() {
-				return wrappedIterator.next();
-			}
-		};
-	}
-
-	public Object[] toArray() {
-		getterCalled();
-		return super.toArray();
-	}
-
-	public Object[] toArray(Object a[]) {
-		getterCalled();
-		return super.toArray(a);
-	}
-
-	// Modification Operations
-
-	public boolean add(Object o) {
-		getterCalled();
-		return super.add(o);
-	}
-
-	/**
-	 * Moves the element located at <code>oldIndex</code> to
-	 * <code>newIndex</code>. This method is equivalent to calling
-	 * <code>add(newIndex, remove(oldIndex))</code>.
-	 * <p>
-	 * Subclasses should override this method to deliver list change
-	 * notification for the remove and add operations in the same
-	 * ListChangeEvent, as this allows {@link ListDiff#accept(ListDiffVisitor)}
-	 * to recognize the operation as a move.
-	 * 
-	 * @param oldIndex
-	 *            the element's position before the move. Must be within the
-	 *            range <code>0 &lt;= oldIndex &lt; size()</code>.
-	 * @param newIndex
-	 *            the element's position after the move. Must be within the
-	 *            range <code>0 &lt;= newIndex &lt; size()</code>.
-	 * @return the element that was moved.
-	 * @throws IndexOutOfBoundsException
-	 *             if either argument is out of range (<code>0 &lt;= index &lt; size()</code>).
-	 * @see ListDiffVisitor#handleMove(int, int, Object)
-	 * @see ListDiff#accept(ListDiffVisitor)
-	 * @since 1.1
-	 */
-	public Object move(int oldIndex, int newIndex) {
-		checkRealm();
-		int size = doGetSize();
-		if (oldIndex < 0 || oldIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"oldIndex: " + oldIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		if (newIndex < 0 || newIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"newIndex: " + newIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		Object element = remove(oldIndex);
-		add(newIndex, element);
-		return element;
-	}
-
-	public boolean remove(Object o) {
-		getterCalled();
-		return super.remove(o);
-	}
-
-	// Bulk Modification Operations
-
-	public boolean containsAll(Collection c) {
-		getterCalled();
-		return super.containsAll(c);
-	}
-
-	public boolean addAll(Collection c) {
-		getterCalled();
-		return super.addAll(c);
-	}
-
-	public boolean addAll(int index, Collection c) {
-		getterCalled();
-		return super.addAll(c);
-	}
-
-	public boolean removeAll(Collection c) {
-		getterCalled();
-		return super.removeAll(c);
-	}
-
-	public boolean retainAll(Collection c) {
-		getterCalled();
-		return super.retainAll(c);
-	}
-
-	// Comparison and hashing
-
-	public boolean equals(Object o) {
-		getterCalled();
-		return super.equals(o);
-	}
-
-	public int hashCode() {
-		getterCalled();
-		return super.hashCode();
-	}
-
-	public int indexOf(Object o) {
-		getterCalled();
-		return super.indexOf(o);
-	}
-
-	public int lastIndexOf(Object o) {
-		getterCalled();
-		return super.lastIndexOf(o);
-	}
-
-	public Realm getRealm() {
-		return changeSupport.getRealm();
-	}
-	
-	/**
-	 * Asserts that the realm is the current realm.
-	 * 
-	 * @see Realm#isCurrent()
-	 * @throws AssertionFailedException
-	 *             if the realm is not the current realm
-	 */
-	protected void checkRealm() {
-		Assert.isTrue(getRealm().isCurrent(),
-				"This operation must be run within the observable's realm"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ComputedList.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ComputedList.java
deleted file mode 100644
index e7f6b2b..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ComputedList.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/************************************************************************************************************
- * Copyright (c) 2007 Matthew Hall and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Matthew Hall - initial API and implementation
- * 		IBM Corporation - initial API and implementation
- * 		Brad Reynolds - initial API and implementation (through bug 116920 and bug 147515)
- * 		Matthew Hall - bug 211786
- ***********************************************************************************************************/
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-
-/**
- * A Lazily calculated list that automatically computes and registers listeners
- * on its dependencies as long as all of its dependencies are IObservable
- * objects
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.1
- */
-public abstract class ComputedList extends AbstractObservableList {
-	private List cachedList = new ArrayList();
-
-	private boolean dirty = true;
-	private boolean stale = false;
-
-	private IObservable[] dependencies = new IObservable[0];
-
-	/**
-	 * Creates a computed list in the default realm and with an unknown (null)
-	 * element type.
-	 */
-	public ComputedList() {
-		this(Realm.getDefault(), null);
-	}
-
-	/**
-	 * Creates a computed list in the default realm and with the given element
-	 * type.
-	 * 
-	 * @param elementType
-	 *            the element type, may be <code>null</code> to indicate
-	 *            unknown element type
-	 */
-	public ComputedList(Object elementType) {
-		this(Realm.getDefault(), elementType);
-	}
-
-	/**
-	 * Creates a computed list in given realm and with an unknown (null) element
-	 * type.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * 
-	 */
-	public ComputedList(Realm realm) {
-		this(realm, null);
-	}
-
-	/**
-	 * Creates a computed list in the given realm and with the given element
-	 * type.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param elementType
-	 *            the element type, may be <code>null</code> to indicate
-	 *            unknown element type
-	 */
-	public ComputedList(Realm realm, Object elementType) {
-		super(realm);
-		this.elementType = elementType;
-	}
-
-	/**
-	 * Inner class that implements interfaces that we don't want to expose as
-	 * public API. Each interface could have been implemented using a separate
-	 * anonymous class, but we combine them here to reduce the memory overhead
-	 * and number of classes.
-	 * 
-	 * <p>
-	 * The Runnable calls calculate and stores the result in cachedList.
-	 * </p>
-	 * 
-	 * <p>
-	 * The IChangeListener stores each observable in the dependencies list. This
-	 * is registered as the listener when calling ObservableTracker, to detect
-	 * every observable that is used by computeValue.
-	 * </p>
-	 * 
-	 * <p>
-	 * The IChangeListener is attached to every dependency.
-	 * </p>
-	 * 
-	 */
-	private class PrivateInterface implements Runnable, IChangeListener,
-			IStaleListener {
-		public void run() {
-			cachedList = calculate();
-			if (cachedList == null)
-				cachedList = Collections.EMPTY_LIST;
-		}
-
-		public void handleStale(StaleEvent event) {
-			if (!dirty)
-				makeStale();
-		}
-
-		public void handleChange(ChangeEvent event) {
-			makeDirty();
-		}
-	}
-
-	private PrivateInterface privateInterface = new PrivateInterface();
-
-	private Object elementType;
-
-	protected int doGetSize() {
-		return doGetList().size();
-	}
-
-	public Object get(int index) {
-		getterCalled();
-		return doGetList().get(index);
-	}
-
-	private final List getList() {
-		getterCalled();
-		return doGetList();
-	}
-
-	final List doGetList() {
-		if (dirty) {
-			// This line will do the following:
-			// - Run the calculate method
-			// - While doing so, add any observable that is touched to the
-			// dependencies list
-			IObservable[] newDependencies = ObservableTracker.runAndMonitor(
-					privateInterface, privateInterface, null);
-
-			// If any dependencies are stale, a stale event will be fired here
-			// even if we were already stale before recomputing. This is in case
-			// clients assume that a list change is indicative of non-staleness.
-			stale = false;
-			for (int i = 0; i < newDependencies.length; i++) {
-				if (newDependencies[i].isStale()) {
-					makeStale();
-					break;
-				}
-			}
-
-			if (!stale) {
-				for (int i = 0; i < newDependencies.length; i++) {
-					newDependencies[i].addStaleListener(privateInterface);
-				}
-			}
-
-			dependencies = newDependencies;
-
-			dirty = false;
-		}
-
-		return cachedList;
-	}
-
-	private void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	/**
-	 * Subclasses must override this method to calculate the list contents.
-	 * 
-	 * @return the object's list.
-	 */
-	protected abstract List calculate();
-
-	private void makeDirty() {
-		if (!dirty) {
-			dirty = true;
-
-			makeStale();
-
-			stopListening();
-
-			// copy the old list
-			final List oldList = new ArrayList(cachedList);
-			// Fire the "dirty" event. This implementation recomputes the new
-			// list lazily.
-			fireListChange(new ListDiff() {
-				ListDiffEntry[] differences;
-
-				public ListDiffEntry[] getDifferences() {
-					if (differences == null)
-						differences = Diffs.computeListDiff(oldList, getList())
-								.getDifferences();
-					return differences;
-				}
-			});
-		}
-	}
-
-	private void stopListening() {
-		if (dependencies != null) {
-			for (int i = 0; i < dependencies.length; i++) {
-				IObservable observable = dependencies[i];
-
-				observable.removeChangeListener(privateInterface);
-				observable.removeStaleListener(privateInterface);
-			}
-			dependencies = null;
-		}
-	}
-
-	private void makeStale() {
-		if (!stale) {
-			stale = true;
-			fireStale();
-		}
-	}
-
-	public boolean isStale() {
-		// recalculate list if dirty, to ensure staleness is correct.
-		getList();
-		return stale;
-	}
-
-	public Object getElementType() {
-		return elementType;
-	}
-
-	public synchronized void addChangeListener(IChangeListener listener) {
-		super.addChangeListener(listener);
-		// If somebody is listening, we need to make sure we attach our own
-		// listeners
-		computeListForListeners();
-	}
-
-	public synchronized void addListChangeListener(IListChangeListener listener) {
-		super.addListChangeListener(listener);
-		// If somebody is listening, we need to make sure we attach our own
-		// listeners
-		computeListForListeners();
-	}
-
-	private void computeListForListeners() {
-		// Some clients just add a listener and expect to get notified even if
-		// they never called getValue(), so we have to call getValue() ourselves
-		// here to be sure. Need to be careful about realms though, this method
-		// can be called outside of our realm.
-		// See also bug 198211. If a client calls this outside of our realm,
-		// they may receive change notifications before the runnable below has
-		// been executed. It is their job to figure out what to do with those
-		// notifications.
-		getRealm().exec(new Runnable() {
-			public void run() {
-				if (dependencies == null) {
-					// We are not currently listening.
-					// But someone is listening for changes. Call getValue()
-					// to make sure we start listening to the observables we
-					// depend on.
-					getList();
-				}
-			}
-		});
-	}
-
-	public synchronized void dispose() {
-		stopListening();
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/DecoratingObservableList.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/DecoratingObservableList.java
deleted file mode 100644
index e09a3b4..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/DecoratingObservableList.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237718)
- *     Matthew Hall - but 246626
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.databinding.observable.DecoratingObservableCollection;
-
-/**
- * An observable list which decorates another observable list.
- * 
- * @since 1.2
- */
-public class DecoratingObservableList extends DecoratingObservableCollection
-		implements IObservableList {
-
-	private IObservableList decorated;
-
-	private IListChangeListener listChangeListener;
-
-	/**
-	 * Constructs a DecoratingObservableList which decorates the given
-	 * observable.
-	 * 
-	 * @param decorated
-	 *            the observable list being decorated
-	 * @param disposeDecoratedOnDispose
-	 */
-	public DecoratingObservableList(IObservableList decorated,
-			boolean disposeDecoratedOnDispose) {
-		super(decorated, disposeDecoratedOnDispose);
-		this.decorated = decorated;
-	}
-
-	public synchronized void addListChangeListener(IListChangeListener listener) {
-		addListener(ListChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeListChangeListener(
-			IListChangeListener listener) {
-		removeListener(ListChangeEvent.TYPE, listener);
-	}
-
-	protected void fireListChange(ListDiff diff) {
-		// fire general change event first
-		super.fireChange();
-		fireEvent(new ListChangeEvent(this, diff));
-	}
-
-	protected void fireChange() {
-		throw new RuntimeException(
-				"fireChange should not be called, use fireListChange() instead"); //$NON-NLS-1$
-	}
-
-	protected void firstListenerAdded() {
-		if (listChangeListener == null) {
-			listChangeListener = new IListChangeListener() {
-				public void handleListChange(ListChangeEvent event) {
-					DecoratingObservableList.this.handleListChange(event);
-				}
-			};
-		}
-		decorated.addListChangeListener(listChangeListener);
-		super.firstListenerAdded();
-	}
-
-	protected void lastListenerRemoved() {
-		super.lastListenerRemoved();
-		if (listChangeListener != null) {
-			decorated.removeListChangeListener(listChangeListener);
-			listChangeListener = null;
-		}
-	}
-
-	/**
-	 * Called whenever a ListChangeEvent is received from the decorated
-	 * observable. By default, this method fires the list change event again,
-	 * with the decorating observable as the event source. Subclasses may
-	 * override to provide different behavior.
-	 * 
-	 * @param event
-	 *            the change event received from the decorated observable
-	 */
-	protected void handleListChange(final ListChangeEvent event) {
-		fireListChange(event.diff);
-	}
-
-	public void add(int index, Object o) {
-		checkRealm();
-		decorated.add(index, o);
-	}
-
-	public boolean addAll(int index, Collection c) {
-		checkRealm();
-		return decorated.addAll(index, c);
-	}
-
-	public Object get(int index) {
-		getterCalled();
-		return decorated.get(index);
-	}
-
-	public int indexOf(Object o) {
-		getterCalled();
-		return decorated.indexOf(o);
-	}
-
-	public int lastIndexOf(Object o) {
-		getterCalled();
-		return decorated.lastIndexOf(o);
-	}
-
-	public ListIterator listIterator() {
-		return listIterator(0);
-	}
-
-	public ListIterator listIterator(int index) {
-		getterCalled();
-		final ListIterator iterator = decorated.listIterator(index);
-		return new ListIterator() {
-
-			public void add(Object o) {
-				iterator.add(o);
-			}
-
-			public boolean hasNext() {
-				getterCalled();
-				return iterator.hasNext();
-			}
-
-			public boolean hasPrevious() {
-				getterCalled();
-				return iterator.hasPrevious();
-			}
-
-			public Object next() {
-				getterCalled();
-				return iterator.next();
-			}
-
-			public int nextIndex() {
-				getterCalled();
-				return iterator.nextIndex();
-			}
-
-			public Object previous() {
-				getterCalled();
-				return iterator.previous();
-			}
-
-			public int previousIndex() {
-				getterCalled();
-				return iterator.previousIndex();
-			}
-
-			public void remove() {
-				checkRealm();
-				iterator.remove();
-			}
-
-			public void set(Object o) {
-				checkRealm();
-				iterator.set(o);
-			}
-		};
-	}
-
-	public Object move(int oldIndex, int newIndex) {
-		checkRealm();
-		return decorated.move(oldIndex, newIndex);
-	}
-
-	public Object remove(int index) {
-		checkRealm();
-		return decorated.remove(index);
-	}
-
-	public Object set(int index, Object element) {
-		checkRealm();
-		return decorated.set(index, element);
-	}
-
-	public List subList(int fromIndex, int toIndex) {
-		getterCalled();
-		return decorated.subList(fromIndex, toIndex);
-	}
-
-	public synchronized void dispose() {
-		if (decorated != null && listChangeListener != null) {
-			decorated.removeListChangeListener(listChangeListener);
-		}
-		decorated = null;
-		listChangeListener = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/IListChangeListener.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/IListChangeListener.java
deleted file mode 100644
index 8372729..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/IListChangeListener.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-
-/**
- * Listener for changes to observable lists.
- * 
- * @since 1.0
- */
-public interface IListChangeListener extends IObservablesListener {
-
-	/**
-	 * Handle a change to an observable list. The change is described by the
-	 * diff object. The given event object must only be used locally in this
-	 * method because it may be reused for other change notifications. The diff
-	 * object referenced by the event is immutable and may be used non-locally.
-	 * 
-	 * @param event
-	 */
-	void handleListChange(ListChangeEvent event);
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/IObservableList.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/IObservableList.java
deleted file mode 100644
index 858ae23..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/IObservableList.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 167204
- *     Matthew Hall - bugs 208858, 237718
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.databinding.observable.IObservableCollection;
-
-/**
- * A list whose changes can be tracked by list change listeners.
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the framework classes
- *              that implement this interface. Note that direct implementers of
- *              this interface outside of the framework will be broken in future
- *              releases when methods are added to this interface.
- * 
- * @see AbstractObservableList
- * @see ObservableList
- * 
- * @since 1.0
- */
-public interface IObservableList extends List, IObservableCollection {
-	
-	/**
-	 * Adds the given list change listener to the list of list change listeners.
-	 * @param listener
-	 */
-	public void addListChangeListener(IListChangeListener listener);
-	
-	/**
-	 * Removes the given list change listener from the list of list change listeners.
-	 * Has no effect if the given listener is not registered as a list change listener.
-	 * 
-	 * @param listener
-	 */
-	public void removeListChangeListener(IListChangeListener listener);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public int size();
-
-	/**
-	 * @TrackedGetter
-	 */
-    public boolean isEmpty();
-
-	/**
-	 * @TrackedGetter
-	 */
-    public boolean contains(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public Iterator iterator();
-
-	/**
-	 * @TrackedGetter
-	 */
-    public Object[] toArray();
-
-	/**
-	 * @TrackedGetter
-	 */
-    public Object[] toArray(Object a[]);
-
-	/**
-	 * 
-	 */
-    public boolean add(Object o);
-
-	/**
-	 * 
-	 */
-    public boolean remove(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public boolean containsAll(Collection c);
-
-	/**
-	 * 
-	 */
-    public boolean addAll(Collection c);
-
-	/**
-	 * 
-	 */
-    public boolean addAll(int index, Collection c);
-
-	/**
-	 * 
-	 */
-    public boolean removeAll(Collection c);
-
-	/**
-	 *
-	 */
-    public boolean retainAll(Collection c);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public boolean equals(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public int hashCode();
-
-	/**
-	 * @TrackedGetter
-	 */
-    public Object get(int index);
-
-	/**
-	 * 
-	 */
-    public Object set(int index, Object element);
-
-	/**
-	 * Moves the element located at <code>oldIndex</code> to
-	 * <code>newIndex</code>. This method is equivalent to calling
-	 * <code>add(newIndex, remove(oldIndex))</code>.
-	 * <p>
-	 * Implementors should deliver list change notification for the remove and
-	 * add operations in the same ListChangeEvent, as this allows
-	 * {@link ListDiff#accept(ListDiffVisitor)} to recognize the operation as a
-	 * move.
-	 * 
-	 * @param oldIndex
-	 *            the element's position before the move. Must be within the
-	 *            range <code>0 &lt;= oldIndex &lt; size()</code>.
-	 * @param newIndex
-	 *            the element's position after the move. Must be within the
-	 *            range <code>0 &lt;= newIndex &lt; size()</code>.
-	 * @return the element that was moved.
-	 * @throws IndexOutOfBoundsException
-	 *             if either argument is out of range (<code>0 &lt;= index &lt; size()</code>).
-	 * @see ListDiffVisitor#handleMove(int, int, Object)
-	 * @see ListDiff#accept(ListDiffVisitor)
-	 * @since 1.1
-	 */
-	public Object move(int oldIndex, int newIndex);
-
-	/**
-	 * 
-	 */
-    public Object remove(int index);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public int indexOf(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public int lastIndexOf(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public ListIterator listIterator();
-
-	/**
-	 * @TrackedGetter
-	 */
-    public ListIterator listIterator(int index);
-
-	/**
-	 * @TrackedGetter
-	 */
-    public List subList(int fromIndex, int toIndex);
-
-	/**
-	 * @return the type of the elements or <code>null</code> if untyped
-	 */
-	Object getElementType();
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ListChangeEvent.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ListChangeEvent.java
deleted file mode 100644
index 1b2ce4d..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ListChangeEvent.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-import org.eclipse.core.databinding.observable.ObservableEvent;
-
-/**
- * List change event describing an incremental change of an
- * {@link IObservableList} object.
- * 
- * @since 1.0
- */
-public class ListChangeEvent extends ObservableEvent {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -9154315534258776672L;
-
-	static final Object TYPE = new Object();
-
-	/**
-	 * Description of the change to the source observable list. Listeners must
-	 * not change this field.
-	 */
-	public ListDiff diff;
-
-	/**
-	 * Creates a new list change event.
-	 * 
-	 * @param source
-	 *            the source observable list
-	 * @param diff
-	 *            the list change
-	 */
-	public ListChangeEvent(IObservableList source, ListDiff diff) {
-		super(source);
-		this.diff = diff;
-	}
-
-	/**
-	 * Returns the observable list from which this event originated.
-	 * 
-	 * @return the observable list from which this event originated
-	 */
-	public IObservableList getObservableList() {
-		return (IObservableList) getSource();
-	}
-
-	protected void dispatch(IObservablesListener listener) {
-		((IListChangeListener) listener).handleListChange(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ListDiff.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ListDiff.java
deleted file mode 100644
index 38f63c1..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ListDiff.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 208858, 251884
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.List;
-
-import org.eclipse.core.internal.databinding.Util;
-
-/**
- * Object describing a diff between two lists.
- * 
- * @since 1.0
- */
-public abstract class ListDiff {
-
-	/**
-	 * Returns a ListDiffEntry array representing the differences in the list,
-	 * in the order they are to be processed.
-	 * 
-	 * @return a ListDiffEntry array representing the differences in the list,
-	 *         in the order they are to be processed.
-	 */
-	public abstract ListDiffEntry[] getDifferences();
-
-	/**
-	 * Traverses the {@link #getDifferences()} array, calling the appropriate
-	 * method in <code>visitor</code> for each difference.
-	 * <ol>
-	 * <li>{@link ListDiffVisitor#handleReplace(int, Object, Object)} is called
-	 * whenever a remove entry is immediately followed by an add entry which
-	 * shares the same list index.
-	 * <li>{@link ListDiffVisitor#handleMove(int, int, Object)} is called
-	 * whenever a remove entry is immediately followed by an add entry with an
-	 * equivalent element.
-	 * <li>{@link ListDiffVisitor#handleRemove(int, Object)} is called whenever
-	 * a remove entry does not match conditions 1 or 2.
-	 * <li>{@link ListDiffVisitor#handleAdd(int, Object)} is called whenever an
-	 * add entry does not match conditions in 1 or 2.
-	 * </ol>
-	 * 
-	 * @param visitor
-	 *            the visitor to receive callbacks.
-	 * @see ListDiffVisitor
-	 * @since 1.1
-	 */
-	public void accept(ListDiffVisitor visitor) {
-		ListDiffEntry[] differences = getDifferences();
-		for (int i = 0; i < differences.length; i++) {
-			ListDiffEntry entry = differences[i];
-			int position = entry.getPosition();
-			Object element = entry.getElement();
-			boolean addition = entry.isAddition();
-
-			if (!addition && i + 1 < differences.length) {
-				ListDiffEntry entry2 = differences[i + 1];
-				if (entry2.isAddition()) {
-					int position2 = entry2.getPosition();
-					Object element2 = entry2.getElement();
-					if (position == position2) {
-						visitor.handleReplace(position, element, element2);
-						i++;
-						continue;
-					}
-					if (Util.equals(element, element2)) {
-						visitor.handleMove(position, position2, element);
-						i++;
-						continue;
-					}
-				}
-			}
-			if (addition)
-				visitor.handleAdd(position, element);
-			else
-				visitor.handleRemove(position, element);
-		}
-	}
-
-	/**
-	 * Returns true if the diff contains no added, removed, moved or replaced
-	 * elements.
-	 * 
-	 * @return true if the diff contains no added, removed, moved or replaced
-	 *         elements.
-	 * @since 1.2
-	 */
-	public boolean isEmpty() {
-		return getDifferences().length == 0;
-	}
-
-	/**
-	 * Applies the changes in this diff to the given list
-	 * 
-	 * @param list
-	 *            the list to which the diff will be applied
-	 * @since 1.2
-	 */
-	public void applyTo(final List list) {
-		accept(new ListDiffVisitor() {
-			public void handleAdd(int index, Object element) {
-				list.add(index, element);
-			}
-
-			public void handleRemove(int index, Object element) {
-				list.remove(index);
-			}
-
-			public void handleReplace(int index, Object oldElement,
-					Object newElement) {
-				list.set(index, newElement);
-			}
-		});
-	}
-
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		ListDiffEntry[] differences = getDifferences();
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(getClass().getName());
-		
-		if (differences == null || differences.length == 0) {
-			buffer
-				.append("{}"); //$NON-NLS-1$
-		} else {
-			buffer
-				.append("{"); //$NON-NLS-1$
-			
-			for (int i = 0; i < differences.length; i++) {
-				if (i > 0)
-					buffer.append(", "); //$NON-NLS-1$
-				
-				buffer
-					.append("difference[") //$NON-NLS-1$
-					.append(i)
-					.append("] [") //$NON-NLS-1$
-					.append(differences[i] != null ? differences[i].toString() : "null") //$NON-NLS-1$
-					.append("]"); //$NON-NLS-1$
-			}
-			buffer.append("}"); //$NON-NLS-1$
-		}
-		
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ListDiffEntry.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ListDiffEntry.java
deleted file mode 100644
index da2e79f..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ListDiffEntry.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-/**
- * A single addition of an element to a list or removal of an element from a list.
- *  
- * @since 1.0
- */
-public abstract class ListDiffEntry {
-	
-	/**
-	 * @return the 0-based position of the addition or removal
-	 */
-	public abstract int getPosition();
-	
-	/**
-	 * @return true if this represents an addition, false if this represents a removal
-	 */
-	public abstract boolean isAddition();
-	
-	/**
-	 * @return the element that was added or removed
-	 */
-	public abstract Object getElement();
-	
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer
-			.append(this.getClass().getName())
-			.append("{position [") //$NON-NLS-1$
-			.append(getPosition())
-			.append("], isAddition [") //$NON-NLS-1$
-			.append(isAddition())
-			.append("], element [") //$NON-NLS-1$
-			.append(getElement() != null ? getElement().toString() : "null") //$NON-NLS-1$
-			.append("]}"); //$NON-NLS-1$
-		
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ListDiffVisitor.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ListDiffVisitor.java
deleted file mode 100644
index e2d1389..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ListDiffVisitor.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 208858)
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.List;
-
-/**
- * A visitor for processing differences in a ListDiff.
- * 
- * @see ListDiff#accept(ListDiffVisitor)
- * @since 1.1
- */
-public abstract class ListDiffVisitor {
-	/**
-	 * Notifies the visitor that <code>element</code> was added to the list at
-	 * position <code>index</code>.
-	 * 
-	 * @param index
-	 *            the index where the element was added
-	 * @param element
-	 *            the element that was added
-	 */
-	public abstract void handleAdd(int index, Object element);
-
-	/**
-	 * Notifies the visitor that <code>element</code> was removed from the
-	 * list at position <code>index</code>.
-	 * 
-	 * @param index
-	 *            the index where the element was removed
-	 * @param element
-	 *            the element that was removed
-	 */
-	public abstract void handleRemove(int index, Object element);
-
-	/**
-	 * Notifies the visitor that <code>element</code> was moved in the list
-	 * from position <code>oldIndex</code> to position <code>newIndex</code>.
-	 * <p>
-	 * The default implementation of this method calls
-	 * {@link #handleRemove(int, Object)} with the old position, then
-	 * {@link #handleAdd(int, Object)} with the new position. Clients which are
-	 * interested in recognizing "moves" in a list (i.e. calls to
-	 * {@link IObservableList#move(int, int)}) should override this method.
-	 * 
-	 * @param oldIndex
-	 *            the index that the element was moved from.
-	 * @param newIndex
-	 *            the index that the element was moved to.
-	 * @param element
-	 *            the element that was moved
-	 * @see IObservableList#move(int, int)
-	 */
-	public void handleMove(int oldIndex, int newIndex, Object element) {
-		handleRemove(oldIndex, element);
-		handleAdd(newIndex, element);
-	}
-
-	/**
-	 * Notifies the visitor that <code>oldElement</code>, located at position
-	 * <code>index</code> in the list, was replaced by <code>newElement</code>.
-	 * <p>
-	 * The default implementation of this method calls
-	 * {@link #handleRemove(int, Object)} with the old element, then
-	 * {@link #handleAdd(int, Object)} with the new element. Clients which are
-	 * interested in recognizing "replaces" in a list (i.e. calls to
-	 * {@link List#set(int, Object)}) should override this method.
-	 * 
-	 * @param index
-	 *            the index where the element was replaced.
-	 * @param oldElement
-	 *            the element being replaced.
-	 * @param newElement
-	 *            the element that replaced oldElement.
-	 * @see List#set(int, Object)
-	 */
-	public void handleReplace(int index, Object oldElement, Object newElement) {
-		handleRemove(index, oldElement);
-		handleAdd(index, newElement);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/MultiList.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/MultiList.java
deleted file mode 100644
index 453fcc7..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/MultiList.java
+++ /dev/null
@@ -1,567 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 222289)
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import java.lang.reflect.Array;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * An observable list backed by an array of observable lists. This class
- * supports all removal methods (including {@link #clear()}), as well as the
- * {@link #set(int, Object)} method. All other mutator methods (addition methods
- * and {@link #move(int, int)}) throw an {@link UnsupportedOperationException}.
- * 
- * @since 1.2
- */
-public class MultiList extends AbstractObservableList {
-	private IObservableList[] lists;
-	private Object elementType;
-
-	private IListChangeListener listChangeListener;
-	private IStaleListener staleListener;
-	private Boolean stale;
-
-	/**
-	 * Constructs a MultiList in the default realm, and backed by the given
-	 * observable lists.
-	 * 
-	 * @param lists
-	 *            the array of observable lists backing this MultiList.
-	 */
-	public MultiList(IObservableList[] lists) {
-		this(Realm.getDefault(), lists, null);
-	}
-
-	/**
-	 * Constructs a MultiList in the default realm backed by the given
-	 * observable lists.
-	 * 
-	 * @param lists
-	 *            the array of observable lists backing this MultiList.
-	 * @param elementType
-	 *            element type of the constructed list.
-	 */
-	public MultiList(IObservableList[] lists, Object elementType) {
-		this(Realm.getDefault(), lists, elementType);
-	}
-
-	/**
-	 * Constructs a MultiList belonging to the given realm, and backed by the
-	 * given observable lists.
-	 * 
-	 * @param realm
-	 *            the observable's realm
-	 * @param lists
-	 *            the array of observable lists backing this MultiList
-	 */
-	public MultiList(Realm realm, IObservableList[] lists) {
-		this(realm, lists, null);
-	}
-
-	/**
-	 * Constructs a MultiList belonging to the given realm, and backed by the
-	 * given observable lists.
-	 * 
-	 * @param realm
-	 *            the observable's realm
-	 * @param lists
-	 *            the array of observable lists backing this MultiList
-	 * @param elementType
-	 *            element type of the constructed list.
-	 */
-	public MultiList(Realm realm, IObservableList[] lists, Object elementType) {
-		super(realm);
-		this.lists = lists;
-		this.elementType = elementType;
-
-		for (int i = 0; i < lists.length; i++) {
-			Assert
-					.isTrue(realm.equals(lists[i].getRealm()),
-							"All source lists in a MultiList must belong to the same realm"); //$NON-NLS-1$
-		}
-	}
-
-	protected void firstListenerAdded() {
-		if (listChangeListener == null) {
-			listChangeListener = new IListChangeListener() {
-				public void handleListChange(final ListChangeEvent event) {
-					getRealm().exec(new Runnable() {
-						public void run() {
-							stale = null;
-							listChanged(event);
-							if (isStale())
-								fireStale();
-						}
-					});
-				}
-			};
-		}
-		if (staleListener == null) {
-			staleListener = new IStaleListener() {
-				public void handleStale(StaleEvent staleEvent) {
-					getRealm().exec(new Runnable() {
-						public void run() {
-							makeStale();
-						}
-					});
-				}
-			};
-		}
-
-		for (int i = 0; i < lists.length; i++) {
-			lists[i].addListChangeListener(listChangeListener);
-			lists[i].addStaleListener(staleListener);
-
-			// Determining staleness at this time prevents firing redundant
-			// stale events if MultiList happens to be stale now, and a sublist
-			// fires a stale event later.
-			this.stale = computeStaleness() ? Boolean.TRUE : Boolean.FALSE;
-		}
-	}
-
-	protected void lastListenerRemoved() {
-		if (listChangeListener != null) {
-			for (int i = 0; i < lists.length; i++) {
-				lists[i].removeListChangeListener(listChangeListener);
-			}
-			listChangeListener = null;
-		}
-		if (staleListener != null) {
-			for (int i = 0; i < lists.length; i++) {
-				lists[i].removeStaleListener(staleListener);
-			}
-			staleListener = null;
-		}
-		stale = null;
-	}
-
-	private void makeStale() {
-		if (stale == null || stale.booleanValue() == false) {
-			stale = Boolean.TRUE;
-			fireStale();
-		}
-	}
-
-	private void listChanged(ListChangeEvent event) {
-		IObservableList source = event.getObservableList();
-		int offset = 0;
-		for (int i = 0; i < lists.length; i++) {
-			if (source == lists[i]) {
-				fireListChange(offsetListDiff(offset, event.diff));
-				return;
-			}
-			offset += lists[i].size();
-		}
-		Assert
-				.isLegal(
-						false,
-						"MultiList received a ListChangeEvent from an observable list that is not one of its sources."); //$NON-NLS-1$
-	}
-
-	private ListDiff offsetListDiff(int offset, ListDiff diff) {
-		return Diffs.createListDiff(offsetListDiffEntries(offset, diff
-				.getDifferences()));
-	}
-
-	private ListDiffEntry[] offsetListDiffEntries(int offset,
-			ListDiffEntry[] entries) {
-		ListDiffEntry[] offsetEntries = new ListDiffEntry[entries.length];
-		for (int i = 0; i < entries.length; i++) {
-			offsetEntries[i] = offsetListDiffEntry(offset, entries[i]);
-		}
-		return offsetEntries;
-	}
-
-	private ListDiffEntry offsetListDiffEntry(int offset, ListDiffEntry entry) {
-		return Diffs.createListDiffEntry(offset + entry.getPosition(), entry
-				.isAddition(), entry.getElement());
-	}
-
-	protected int doGetSize() {
-		int size = 0;
-		for (int i = 0; i < lists.length; i++)
-			size += lists[i].size();
-		return size;
-	}
-
-	public Object getElementType() {
-		return elementType;
-	}
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void add(int index, Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean addAll(int index, Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		checkRealm();
-		for (int i = 0; i < lists.length; i++)
-			lists[i].clear();
-	}
-
-	public Object get(int index) {
-		getterCalled();
-		int offset = 0;
-		for (int i = 0; i < lists.length; i++) {
-			if (index - offset < lists[i].size())
-				return lists[i].get(index - offset);
-			offset += lists[i].size();
-		}
-		throw new IndexOutOfBoundsException("index: " + index + ", size: " //$NON-NLS-1$ //$NON-NLS-2$
-				+ offset);
-	}
-
-	public boolean contains(Object o) {
-		getterCalled();
-		for (int i = 0; i < lists.length; i++) {
-			if (lists[i].contains(o))
-				return true;
-		}
-		return false;
-	}
-
-	public boolean equals(Object o) {
-		getterCalled();
-		if (o == this)
-			return true;
-		if (o == null)
-			return false;
-		if (!(o instanceof List))
-			return false;
-		List that = (List) o;
-		if (doGetSize() != that.size())
-			return false;
-
-		int subListIndex = 0;
-		for (int i = 0; i < lists.length; i++) {
-			List subList = that.subList(subListIndex, subListIndex
-					+ lists[i].size());
-			if (!lists[i].equals(subList)) {
-				return false;
-			}
-			subListIndex += lists[i].size();
-		}
-		return true;
-	}
-
-	public int hashCode() {
-		getterCalled();
-		int result = 1;
-		for (int i = 0; i < lists.length; i++) {
-			result = result * 31 + lists[i].hashCode();
-		}
-		return result;
-	}
-
-	public int indexOf(Object o) {
-		getterCalled();
-		int offset = 0;
-		for (int i = 0; i < lists.length; i++) {
-			int index = lists[i].indexOf(o);
-			if (index != -1)
-				return offset + index;
-			offset += lists[i].size();
-		}
-		return -1;
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		for (int i = 0; i < lists.length; i++) {
-			if (!lists[i].isEmpty())
-				return false;
-		}
-		return true;
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		return new MultiListItr();
-	}
-
-	public int lastIndexOf(Object o) {
-		getterCalled();
-		int offset = size();
-		for (int i = 0; i < lists.length; i++) {
-			offset -= lists[i].size();
-			int index = lists[i].indexOf(o);
-			if (index != -1)
-				return offset + index;
-		}
-		return -1;
-	}
-
-	public ListIterator listIterator(int index) {
-		getterCalled();
-		return new MultiListListItr(index);
-	}
-
-	public Object move(int oldIndex, int newIndex) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean remove(Object o) {
-		checkRealm();
-		int i = indexOf(o);
-		if (i != -1) {
-			remove(i);
-			return true;
-		}
-		return false;
-	}
-
-	public Object remove(int index) {
-		int offset = 0;
-		for (int i = 0; i < lists.length; i++) {
-			if (index - offset < lists[i].size()) {
-				return lists[i].remove(index - offset);
-			}
-			offset += lists[i].size();
-		}
-		throw new IndexOutOfBoundsException("index: " + index + ", size: " //$NON-NLS-1$ //$NON-NLS-2$
-				+ offset);
-	}
-
-	public boolean removeAll(Collection c) {
-		boolean changed = false;
-		for (int i = 0; i < lists.length; i++) {
-			changed = changed | lists[i].removeAll(c);
-		}
-		return changed;
-	}
-
-	public boolean retainAll(Collection c) {
-		boolean changed = false;
-		for (int i = 0; i < lists.length; i++) {
-			changed = changed | lists[i].retainAll(c);
-		}
-		return changed;
-	}
-
-	public Object set(int index, Object o) {
-		int offset = 0;
-		for (int i = 0; i < lists.length; i++) {
-			if (index - offset < lists[i].size()) {
-				return lists[i].set(index - offset, o);
-			}
-			offset += lists[i].size();
-		}
-		throw new IndexOutOfBoundsException("index: " + index + ", size: " //$NON-NLS-1$ //$NON-NLS-2$
-				+ offset);
-	}
-
-	public Object[] toArray() {
-		getterCalled();
-		return toArray(new Object[doGetSize()]);
-	}
-
-	public Object[] toArray(Object[] a) {
-		getterCalled();
-		Object[] result = a;
-		if (result.length < doGetSize()) {
-			result = (Object[]) Array.newInstance(a.getClass()
-					.getComponentType(), doGetSize());
-		}
-		int offset = 0;
-		for (int i = 0; i < lists.length; i++) {
-			Object[] oa = lists[i].toArray();
-			System.arraycopy(oa, 0, result, offset, oa.length);
-			offset += lists[i].size();
-		}
-
-		return result;
-	}
-
-	public boolean isStale() {
-		getterCalled();
-
-		if (staleListener == null || listChangeListener == null) {
-			// this.stale is only updated in response to list change events or
-			// stale events on the sublists. If we are not listening to sublists
-			// then we must calculate staleness on every invocation.
-			return computeStaleness();
-		}
-
-		if (stale == null) {
-			this.stale = computeStaleness() ? Boolean.TRUE : Boolean.FALSE;
-		}
-
-		return stale.booleanValue();
-	}
-
-	private boolean computeStaleness() {
-		boolean stale = false;
-		for (int i = 0; i < lists.length; i++) {
-			if (lists[i].isStale()) {
-				stale = true;
-				break;
-			}
-		}
-		return stale;
-	}
-
-	private void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	public synchronized void dispose() {
-		if (lists != null) {
-			if (listChangeListener != null) {
-				for (int i = 0; i < lists.length; i++) {
-					lists[i].removeListChangeListener(listChangeListener);
-				}
-			}
-			if (staleListener != null) {
-				for (int i = 0; i < lists.length; i++) {
-					lists[i].removeStaleListener(staleListener);
-				}
-			}
-		}
-		listChangeListener = null;
-		staleListener = null;
-		lists = null;
-		elementType = null;
-		stale = null;
-		super.dispose();
-	}
-
-	private final class MultiListItr implements Iterator {
-		Iterator[] iters;
-		int iterIndex = 0;
-
-		MultiListItr() {
-			iters = new Iterator[lists.length];
-			for (int i = 0; i < lists.length; i++) {
-				iters[i] = lists[i].iterator();
-			}
-		}
-
-		public boolean hasNext() {
-			for (int i = iterIndex; i < iters.length; i++) {
-				if (iters[i].hasNext())
-					return true;
-			}
-			return false;
-		}
-
-		public Object next() {
-			while (iterIndex < iters.length && !iters[iterIndex].hasNext())
-				iterIndex++;
-			return iters[iterIndex].next();
-		}
-
-		public void remove() {
-			throw new UnsupportedOperationException();
-		}
-	}
-
-	private class MultiListListItr implements ListIterator {
-		ListIterator[] iters;
-		int iterIndex;
-
-		private MultiListListItr(int initialIndex) {
-			iters = new ListIterator[lists.length];
-			int offset = 0;
-			for (int i = 0; i < lists.length; i++) {
-				if (offset <= initialIndex) {
-					if (offset + lists[i].size() > initialIndex) {
-						// current list contains initial index
-						iters[i] = lists[i].listIterator(initialIndex - offset);
-						iterIndex = i;
-					} else {
-						// current list ends before initial index
-						iters[i] = lists[i].listIterator(lists[i].size());
-					}
-				} else {
-					// current list begins after initial index
-					iters[i] = lists[i].listIterator();
-				}
-				offset += lists[i].size();
-			}
-		}
-
-		public void add(Object o) {
-			throw new UnsupportedOperationException();
-		}
-
-		public boolean hasNext() {
-			for (int i = iterIndex; i < iters.length; i++) {
-				if (iters[i].hasNext())
-					return true;
-			}
-			return false;
-		}
-
-		public boolean hasPrevious() {
-			for (int i = iterIndex; i >= 0; i--) {
-				if (iters[i].hasPrevious())
-					return true;
-			}
-			return false;
-		}
-
-		public Object next() {
-			while (iterIndex < iters.length && !iters[iterIndex].hasNext())
-				iterIndex++;
-			return iters[iterIndex].next();
-		}
-
-		public int nextIndex() {
-			int offset = 0;
-			for (int i = 0; i < iterIndex; i++)
-				offset += iters[i].nextIndex();
-			return offset + iters[iterIndex].nextIndex();
-		}
-
-		public Object previous() {
-			while (iterIndex >= 0 && !iters[iterIndex].hasPrevious())
-				iterIndex--;
-			return iters[iterIndex].previous();
-		}
-
-		public int previousIndex() {
-			int offset = 0;
-			for (int i = 0; i < iterIndex; i++)
-				offset += iters[i].nextIndex();
-			return offset + iters[iterIndex].previousIndex();
-		}
-
-		public void remove() {
-			throw new UnsupportedOperationException();
-		}
-
-		public void set(Object o) {
-			iters[iterIndex].set(o);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ObservableList.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ObservableList.java
deleted file mode 100644
index 0a6123b..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/ObservableList.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Brad Reynolds - bug 167204
- *     Matthew Hall - bug 208858
- *     Matthew Hall - bug 208332
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * 
- * Abstract implementation of {@link IObservableList}, based on an underlying regular list. 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- * 
- */
-public abstract class ObservableList extends AbstractObservable implements
-		IObservableList {
-
-	protected List wrappedList;
-
-	/**
-	 * Stale state of the list.  Access must occur in the current realm.
-	 */
-	private boolean stale = false;
-
-	private Object elementType;
-
-	protected ObservableList(List wrappedList, Object elementType) {
-		this(Realm.getDefault(), wrappedList, elementType);
-	}
-
-	protected ObservableList(Realm realm, List wrappedList, Object elementType) {
-		super(realm);
-		this.wrappedList = wrappedList;
-		this.elementType = elementType;
-	}
-
-	public synchronized void addListChangeListener(IListChangeListener listener) {
-		addListener(ListChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeListChangeListener(IListChangeListener listener) {
-		removeListener(ListChangeEvent.TYPE, listener);
-	}
-
-	protected void fireListChange(ListDiff diff) {
-		// fire general change event first
-		super.fireChange();
-		fireEvent(new ListChangeEvent(this, diff));
-	}
-	
-	public boolean contains(Object o) {
-		getterCalled();
-		return wrappedList.contains(o);
-	}
-
-	public boolean containsAll(Collection c) {
-		getterCalled();
-		return wrappedList.containsAll(c);
-	}
-
-	public boolean equals(Object o) {
-		getterCalled();
-		return wrappedList.equals(o);
-	}
-
-	public int hashCode() {
-		getterCalled();
-		return wrappedList.hashCode();
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		return wrappedList.isEmpty();
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final Iterator wrappedIterator = wrappedList.iterator();
-		return new Iterator() {
-
-			public void remove() {
-				throw new UnsupportedOperationException();
-			}
-
-			public boolean hasNext() {
-				return wrappedIterator.hasNext();
-			}
-
-			public Object next() {
-				return wrappedIterator.next();
-			}
-		};
-	}
-
-	public int size() {
-		getterCalled();
-		return wrappedList.size();
-	}
-
-	public Object[] toArray() {
-		getterCalled();
-		return wrappedList.toArray();
-	}
-
-	public Object[] toArray(Object[] a) {
-		getterCalled();
-		return wrappedList.toArray(a);
-	}
-
-	public String toString() {
-		getterCalled();
-		return wrappedList.toString();
-	}
-	
-	/**
-	 * @TrackedGetter
-	 */
-    public Object get(int index) {
-    	getterCalled();
-    	return wrappedList.get(index);
-    }
-
-	/**
-	 * @TrackedGetter
-	 */
-    public int indexOf(Object o) {
-    	getterCalled();
-    	return wrappedList.indexOf(o);
-    }
-
-	/**
-	 * @TrackedGetter
-	 */
-    public int lastIndexOf(Object o) {
-    	getterCalled();
-    	return wrappedList.lastIndexOf(o);
-    }
-
-    // List Iterators
-
-	/**
-	 * @TrackedGetter
-	 */
-    public ListIterator listIterator() {
-    	return listIterator(0);
-    }
-
-	/**
-	 * @TrackedGetter
-	 */
-    public ListIterator listIterator(int index) {
-    	getterCalled();
-		final ListIterator wrappedIterator = wrappedList.listIterator(index);
-		return new ListIterator() {
-
-			public int nextIndex() {
-				return wrappedIterator.nextIndex();
-			}
-
-			public int previousIndex() {
-				return wrappedIterator.previousIndex();
-			}
-
-			public void remove() {
-				throw new UnsupportedOperationException();
-			}
-
-			public boolean hasNext() {
-				return wrappedIterator.hasNext();
-			}
-
-			public boolean hasPrevious() {
-				return wrappedIterator.hasPrevious();
-			}
-
-			public Object next() {
-				return wrappedIterator.next();
-			}
-
-			public Object previous() {
-				return wrappedIterator.previous();
-			}
-
-			public void add(Object o) {
-				throw new UnsupportedOperationException();
-			}
-
-			public void set(Object o) {
-				throw new UnsupportedOperationException();
-			}
-		};
-    }
-
-
-    public List subList(final int fromIndex, final int toIndex) {
-    	getterCalled();
-    	if (fromIndex < 0 || fromIndex > toIndex || toIndex > size()) {
-			throw new IndexOutOfBoundsException();
-		}
-    	return new AbstractObservableList(getRealm()) {
-		
-			public Object getElementType() {
-				return ObservableList.this.getElementType();
-			}
-		
-			public Object get(int location) {
-				return ObservableList.this.get(fromIndex + location);
-			}
-		
-			protected int doGetSize() {
-				return toIndex - fromIndex;
-			}
-		};
-    }
-
-	protected void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-    public Object set(int index, Object element) {
-    	throw new UnsupportedOperationException();
-    }
-
-	/**
-	 * Moves the element located at <code>oldIndex</code> to
-	 * <code>newIndex</code>. This method is equivalent to calling
-	 * <code>add(newIndex, remove(oldIndex))</code>.
-	 * <p>
-	 * Subclasses should override this method to deliver list change
-	 * notification for the remove and add operations in the same
-	 * ListChangeEvent, as this allows {@link ListDiff#accept(ListDiffVisitor)}
-	 * to recognize the operation as a move.
-	 * 
-	 * @param oldIndex
-	 *            the element's position before the move. Must be within the
-	 *            range <code>0 &lt;= oldIndex &lt; size()</code>.
-	 * @param newIndex
-	 *            the element's position after the move. Must be within the
-	 *            range <code>0 &lt;= newIndex &lt; size()</code>.
-	 * @return the element that was moved.
-	 * @throws IndexOutOfBoundsException
-	 *             if either argument is out of range (<code>0 &lt;= index &lt; size()</code>).
-	 * @see ListDiffVisitor#handleMove(int, int, Object)
-	 * @see ListDiff#accept(ListDiffVisitor)
-	 * @since 1.1
-	 */
-	public Object move(int oldIndex, int newIndex) {
-		checkRealm();
-		int size = wrappedList.size();
-		if (oldIndex < 0 || oldIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"oldIndex: " + oldIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		if (newIndex < 0 || newIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"newIndex: " + newIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		Object element = remove(oldIndex);
-		add(newIndex, element);
-		return element;
-	}
-
-    public Object remove(int index) {
-    	throw new UnsupportedOperationException();
-    }
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void add(int index, Object element) {
-		throw new UnsupportedOperationException();
-	}
-	
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-    public boolean addAll(int index, Collection c) {
-    	throw new UnsupportedOperationException();
-    }
-
-	public boolean remove(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean removeAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean retainAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	/**
-	 * Returns the stale state.  Must be invoked from the current realm.
-	 * 
-	 * @return stale state
-	 */
-	public boolean isStale() {
-		getterCalled();
-		return stale;
-	}
-
-	/**
-	 * Sets the stale state.  Must be invoked from the current realm.
-	 * 
-	 * @param stale
-	 *            The stale state to list. This will fire a stale event if the
-	 *            given boolean is true and this observable list was not already
-	 *            stale.
-	 */
-	public void setStale(boolean stale) {
-		checkRealm();
-
-		boolean wasStale = this.stale;
-		this.stale = stale;
-		if (!wasStale && stale) {
-			fireStale();
-		}
-	}
-
-	protected void fireChange() {
-		throw new RuntimeException("fireChange should not be called, use fireListChange() instead"); //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.provisional.databinding.observable.AbstractObservable#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-	}
-	
-	public Object getElementType() {
-		return elementType;
-	}
-
-	protected void updateWrappedList(List newList) {
-		List oldList = wrappedList;
-		ListDiff listDiff = Diffs.computeListDiff(oldList, newList);
-		wrappedList = newList;
-		fireListChange(listDiff);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/WritableList.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/WritableList.java
deleted file mode 100644
index ca0c750..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/WritableList.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Brad Reynolds - bug 167204
- *     Gautam Saggar - bug 169529
- *     Brad Reynolds - bug 147515
- *     Matthew Hall - bug 208858, 213145
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.list;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * Mutable observable list backed by an ArrayList.
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- */
-public class WritableList extends ObservableList {
-
-	/**
-	 * Creates an empty writable list in the default realm with a
-	 * <code>null</code> element type.
-	 * 
-	 */
-	public WritableList() {
-		this(Realm.getDefault());
-	}
-
-	/**
-	 * Creates an empty writable list with a <code>null</code> element type.
-	 * 
-	 * @param realm
-	 */
-	public WritableList(Realm realm) {
-		this(realm, new ArrayList(), null);
-	}
-
-	/**
-	 * Constructs a new instance with the default realm.
-	 * 
-	 * @param toWrap
-	 * @param elementType
-	 *            can be <code>null</code>
-	 */
-	public WritableList(List toWrap, Object elementType) {
-		this(Realm.getDefault(), toWrap, elementType);
-	}
-
-	/**
-	 * Creates a writable list containing elements of the given type, wrapping
-	 * an existing client-supplied list.
-	 * 
-	 * @param realm
-	 * @param toWrap
-	 *            The java.utilList to wrap
-	 * @param elementType
-	 *            can be <code>null</code>
-	 */
-	public WritableList(Realm realm, List toWrap, Object elementType) {
-		super(realm, toWrap, elementType);
-	}
-
-	public Object set(int index, Object element) {
-		checkRealm();
-		Object oldElement = wrappedList.set(index, element);
-		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				false, oldElement), Diffs.createListDiffEntry(index, true,
-				element)));
-		return oldElement;
-	}
-
-	/**
-	 * @since 1.1
-	 */
-	public Object move(int oldIndex, int newIndex) {
-		checkRealm();
-		int size = wrappedList.size();
-		if (oldIndex < 0 || oldIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"oldIndex: " + oldIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		if (newIndex < 0 || newIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"newIndex: " + newIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		if (oldIndex == newIndex)
-			return wrappedList.get(oldIndex);
-		Object element = wrappedList.remove(oldIndex);
-		wrappedList.add(newIndex, element);
-		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(oldIndex,
-				false, element), Diffs.createListDiffEntry(newIndex, true,
-				element)));
-		return element;
-	}
-
-	public Object remove(int index) {
-		checkRealm();
-		Object oldElement = wrappedList.remove(index);
-		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				false, oldElement)));
-		return oldElement;
-	}
-
-	public boolean add(Object element) {
-		checkRealm();
-		boolean added = wrappedList.add(element);
-		if (added) {
-			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
-					wrappedList.size() - 1, true, element)));
-		}
-		return added;
-	}
-
-	public void add(int index, Object element) {
-		checkRealm();
-		wrappedList.add(index, element);
-		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				true, element)));
-	}
-
-	public boolean addAll(Collection c) {
-		checkRealm();
-		ListDiffEntry[] entries = new ListDiffEntry[c.size()];
-		int i = 0;
-		int addIndex = wrappedList.size();
-		for (Iterator it = c.iterator(); it.hasNext();) {
-			Object element = it.next();
-			entries[i++] = Diffs.createListDiffEntry(addIndex++, true, element);
-		}
-		boolean added = wrappedList.addAll(c);
-		fireListChange(Diffs.createListDiff(entries));
-		return added;
-	}
-
-	public boolean addAll(int index, Collection c) {
-		checkRealm();
-		ListDiffEntry[] entries = new ListDiffEntry[c.size()];
-		int i = 0;
-		int addIndex = index;
-		for (Iterator it = c.iterator(); it.hasNext();) {
-			Object element = it.next();
-			entries[i++] = Diffs.createListDiffEntry(addIndex++, true, element);
-		}
-		boolean added = wrappedList.addAll(index, c);
-		fireListChange(Diffs.createListDiff(entries));
-		return added;
-	}
-
-	public boolean remove(Object o) {
-		checkRealm();
-		int index = wrappedList.indexOf(o);
-		if (index == -1) {
-			return false;
-		}
-		wrappedList.remove(index);
-		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				false, o)));
-		return true;
-	}
-
-	public boolean removeAll(Collection c) {
-		checkRealm();
-		List entries = new ArrayList();
-		for (Iterator it = c.iterator(); it.hasNext();) {
-			Object element = it.next();
-			int removeIndex = wrappedList.indexOf(element);
-			if (removeIndex != -1) {
-				wrappedList.remove(removeIndex);
-				entries.add(Diffs.createListDiffEntry(removeIndex, false,
-						element));
-			}
-		}
-		if (entries.size() > 0)
-			fireListChange(Diffs.createListDiff((ListDiffEntry[]) entries
-					.toArray(new ListDiffEntry[entries.size()])));
-		return entries.size() > 0;
-	}
-
-	public boolean retainAll(Collection c) {
-		checkRealm();
-		List entries = new ArrayList();
-		int removeIndex = 0;
-		for (Iterator it = wrappedList.iterator(); it.hasNext();) {
-			Object element = it.next();
-			if (!c.contains(element)) {
-				entries.add(Diffs.createListDiffEntry(removeIndex, false,
-						element));
-				it.remove();
-			} else {
-				// only increment if we haven't removed the current element
-				removeIndex++;
-			}
-		}
-		if (entries.size() > 0)
-			fireListChange(Diffs.createListDiff((ListDiffEntry[]) entries
-					.toArray(new ListDiffEntry[entries.size()])));
-		return entries.size() > 0;
-	}
-
-	public void clear() {
-		checkRealm();
-		List entries = new ArrayList();
-		for (Iterator it = wrappedList.iterator(); it.hasNext();) {
-			Object element = it.next();
-			// always report 0 as the remove index
-			entries.add(Diffs.createListDiffEntry(0, false, element));
-			it.remove();
-		}
-		fireListChange(Diffs.createListDiff((ListDiffEntry[]) entries
-				.toArray(new ListDiffEntry[entries.size()])));
-	}
-
-	/**
-	 * @param elementType
-	 *            can be <code>null</code>
-	 * @return new list with the default realm.
-	 */
-	public static WritableList withElementType(Object elementType) {
-		return new WritableList(Realm.getDefault(), new ArrayList(),
-				elementType);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/package.html b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/package.html
deleted file mode 100644
index 2c2f1db..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/list/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes for observing changes in lists.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes for observing changes in lists.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/AbstractObservableMap.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/AbstractObservableMap.java
deleted file mode 100644
index 55a6a7c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/AbstractObservableMap.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Matthew Hall - bugs 118516, 146397, 226289, 246103
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.AbstractMap;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.ChangeSupport;
-import org.eclipse.core.databinding.observable.DisposeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.AssertionFailedException;
-
-/**
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- */
-public abstract class AbstractObservableMap extends AbstractMap implements
-		IObservableMap {
-
-	private final class PrivateChangeSupport extends ChangeSupport {
-		private PrivateChangeSupport(Realm realm) {
-			super(realm);
-		}
-
-		protected void firstListenerAdded() {
-			AbstractObservableMap.this.firstListenerAdded();
-		}
-
-		protected void lastListenerRemoved() {
-			AbstractObservableMap.this.lastListenerRemoved();
-		}
-
-		protected boolean hasListeners() {
-			return super.hasListeners();
-		}
-	}
-
-	private PrivateChangeSupport changeSupport;
-	private boolean disposed = false;
-
-	private boolean stale;
-
-	/**
-	 */
-	public AbstractObservableMap() {
-		this(Realm.getDefault());
-	}
-
-	/**
-	 * 
-	 */
-	protected void lastListenerRemoved() {
-	}
-
-	/**
-	 * 
-	 */
-	protected void firstListenerAdded() {
-	}
-
-	/**
-	 * @param realm
-	 */
-	public AbstractObservableMap(Realm realm) {
-		Assert.isNotNull(realm, "Realm cannot be null"); //$NON-NLS-1$
-		changeSupport = new PrivateChangeSupport(realm);
-	}
-
-	public synchronized void addMapChangeListener(IMapChangeListener listener) {
-		if (!disposed)
-			changeSupport.addListener(MapChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeMapChangeListener(IMapChangeListener listener) {
-		if (!disposed)
-			changeSupport.removeListener(MapChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void addChangeListener(IChangeListener listener) {
-		if (!disposed)
-			changeSupport.addChangeListener(listener);
-	}
-
-	public synchronized void addStaleListener(IStaleListener listener) {
-		if (!disposed)
-			changeSupport.addStaleListener(listener);
-	}
-
-	/**
-	 * @return whether the observable map has listeners registered
-	 * @since 1.2
-	 */
-	protected synchronized boolean hasListeners() {
-		return !disposed && changeSupport.hasListeners();
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public void addDisposeListener(IDisposeListener listener) {
-		if (!disposed)
-			changeSupport.addDisposeListener(listener);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public void removeDisposeListener(IDisposeListener listener) {
-		if (!disposed)
-			changeSupport.removeDisposeListener(listener);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public boolean isDisposed() {
-		return disposed;
-	}
-
-	public synchronized void dispose() {
-		if (!disposed) {
-			disposed = true;
-			changeSupport.fireEvent(new DisposeEvent(this));
-			changeSupport.dispose();
-			changeSupport = null;
-		}
-	}
-
-	public Realm getRealm() {
-		return changeSupport.getRealm();
-	}
-
-	public boolean isStale() {
-		checkRealm();
-		return stale;
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public Object getKeyType() {
-		return null;
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public Object getValueType() {
-		return null;
-	}
-
-	public synchronized void removeChangeListener(IChangeListener listener) {
-		changeSupport.removeChangeListener(listener);
-	}
-
-	public synchronized void removeStaleListener(IStaleListener listener) {
-		changeSupport.removeStaleListener(listener);
-	}
-
-	/**
-	 * Sets the stale state.  Must be invoked from the current realm.
-	 * 
-	 * @param stale
-	 */
-	public void setStale(boolean stale) {
-		checkRealm();
-		this.stale = stale;
-		if (stale) {
-			fireStale();
-		}
-	}
-
-	/**
-	 * Fires stale events.  Must be invoked from current realm.
-	 */
-	protected void fireStale() {
-		checkRealm();
-		changeSupport.fireEvent(new StaleEvent(this));
-	}
-
-	/**
-	 * Fires change events.  Must be invoked from current realm.
-	 */
-	protected void fireChange() {
-		checkRealm();
-		changeSupport.fireEvent(new ChangeEvent(this));
-	}
-
-	/**
-	 * Fires map change events.  Must be invoked from current realm.
-	 * 
-	 * @param diff
-	 */
-	protected void fireMapChange(MapDiff diff) {
-		checkRealm();
-		changeSupport.fireEvent(new MapChangeEvent(this, diff));
-	}
-
-	/**
-	 * Asserts that the realm is the current realm.
-	 * 
-	 * @see Realm#isCurrent()
-	 * @throws AssertionFailedException
-	 *             if the realm is not the current realm
-	 */
-	protected void checkRealm() {
-		Assert.isTrue(getRealm().isCurrent(),
-				"This operation must be run within the observable's realm"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/BidiObservableMap.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/BidiObservableMap.java
deleted file mode 100644
index 2d012eb..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/BidiObservableMap.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *         (through BidirectionalMap.java)
- *     Matthew Hall - bug 233306
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.internal.databinding.Util;
-
-/**
- * An
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.2
- */
-public class BidiObservableMap extends DecoratingObservableMap {
-	/**
-	 * Inverse of wrapped map. When multiple keys map to the same value, they
-	 * are combined into a Set. This field is null when no listeners are
-	 * registered on this observable.
-	 */
-	private Map valuesToKeys;
-
-	/**
-	 * Constructs a BidirectionalMap tracking the given observable map.
-	 * 
-	 * @param wrappedMap
-	 *            the observable map to track
-	 */
-	public BidiObservableMap(IObservableMap wrappedMap) {
-		super(wrappedMap, false);
-	}
-
-	protected void firstListenerAdded() {
-		valuesToKeys = new HashMap();
-		for (Iterator it = entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Entry) it.next();
-			addMapping(entry.getKey(), entry.getValue());
-		}
-		super.firstListenerAdded();
-	}
-
-	protected void lastListenerRemoved() {
-		super.lastListenerRemoved();
-		valuesToKeys.clear();
-		valuesToKeys = null;
-	}
-
-	protected void handleMapChange(MapChangeEvent event) {
-		MapDiff diff = event.diff;
-		for (Iterator it = diff.getAddedKeys().iterator(); it.hasNext();) {
-			Object addedKey = it.next();
-			addMapping(addedKey, diff.getNewValue(addedKey));
-		}
-		for (Iterator it = diff.getChangedKeys().iterator(); it.hasNext();) {
-			Object changedKey = it.next();
-			removeMapping(changedKey, diff.getOldValue(changedKey));
-			addMapping(changedKey, diff.getNewValue(changedKey));
-		}
-		for (Iterator it = diff.getRemovedKeys().iterator(); it.hasNext();) {
-			Object removedKey = it.next();
-			removeMapping(removedKey, diff.getOldValue(removedKey));
-		}
-		super.handleMapChange(event);
-	}
-
-	public boolean containsValue(Object value) {
-		getterCalled();
-		// Faster lookup
-		if (valuesToKeys != null)
-			return valuesToKeys.containsKey(value);
-		return super.containsValue(value);
-	}
-
-	/**
-	 * Adds a mapping from value to key in the valuesToKeys map.
-	 * 
-	 * @param key
-	 *            the key being mapped
-	 * @param value
-	 *            the value being mapped
-	 */
-	private void addMapping(Object key, Object value) {
-		if (!valuesToKeys.containsKey(value)) {
-			if (key instanceof Set)
-				key = new HashSet(Collections.singleton(key));
-			valuesToKeys.put(value, key);
-		} else {
-			Object elementOrSet = valuesToKeys.get(value);
-			Set set;
-			if (elementOrSet instanceof Set) {
-				set = (Set) elementOrSet;
-			} else {
-				set = new HashSet(Collections.singleton(elementOrSet));
-				valuesToKeys.put(value, set);
-			}
-			set.add(key);
-		}
-	}
-
-	/**
-	 * Removes a mapping from value to key in the valuesToKeys map.
-	 * 
-	 * @param key
-	 *            the key being unmapped
-	 * @param value
-	 *            the value being unmapped
-	 */
-	private void removeMapping(Object key, Object value) {
-		if (valuesToKeys.containsKey(value)) {
-			Object elementOrSet = valuesToKeys.get(value);
-			if (elementOrSet instanceof Set) {
-				Set set = (Set) elementOrSet;
-				set.remove(key);
-				if (set.isEmpty()) {
-					valuesToKeys.remove(value);
-				}
-			} else if (elementOrSet == key
-					|| (elementOrSet != null && elementOrSet.equals(key))) {
-				valuesToKeys.remove(value);
-			}
-		}
-	}
-
-	/**
-	 * Returns the Set of keys that currently map to the given value.
-	 * 
-	 * @param value
-	 *            the value associated with the keys in the returned Set.
-	 * @return the Set of keys that map to the given value. If no keys map to
-	 *         the given value, an empty set is returned.
-	 */
-	public Set getKeys(Object value) {
-		// valuesToKeys is null when no listeners are registered
-		if (valuesToKeys == null)
-			return findKeys(value);
-
-		if (!valuesToKeys.containsKey(value))
-			return Collections.EMPTY_SET;
-		Object elementOrSet = valuesToKeys.get(value);
-		if (elementOrSet instanceof Set)
-			return Collections.unmodifiableSet((Set) elementOrSet);
-		return Collections.singleton(elementOrSet);
-	}
-
-	/**
-	 * Iterates the map and returns the set of keys which currently map to the
-	 * given value.
-	 * 
-	 * @param value
-	 *            the value to search for
-	 * @return the set of keys which currently map to the specified value.
-	 */
-	private Set findKeys(Object value) {
-		Set keys = new HashSet();
-		for (Iterator it = entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Map.Entry) it.next();
-			if (Util.equals(entry.getValue(), value))
-				keys.add(entry.getKey());
-		}
-		return keys;
-	}
-
-	public synchronized void dispose() {
-		if (valuesToKeys != null) {
-			valuesToKeys.clear();
-			valuesToKeys = null;
-		}
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/BidirectionalMap.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/BidirectionalMap.java
deleted file mode 100644
index 55987f6..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/BidirectionalMap.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 233306
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.map;
-
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- * 
- * @deprecated This class is deprecated; use {@link BidiObservableMap} instead.
- */
-public class BidirectionalMap extends ObservableMap {
-	private IMapChangeListener mapListener = new IMapChangeListener() {
-		public void handleMapChange(MapChangeEvent event) {
-			fireMapChange(event.diff);
-		}
-	};
-
-	/**
-	 * @param wrappedMap
-	 */
-	public BidirectionalMap(IObservableMap wrappedMap) {
-		super(wrappedMap.getRealm(), wrappedMap);
-		wrappedMap.addMapChangeListener(mapListener);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/CompositeMap.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/CompositeMap.java
deleted file mode 100644
index 98fdf26..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/CompositeMap.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 233306, 226289
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * A read-only observable map formed by the composition of two observable maps.
- * If map1 maps keys a:A to values b1:B, and map2 maps keys b2:B to values c:C,
- * the composite map maps keys a:A to values c:C. For example, map1 could map
- * Order objects to their corresponding Customer objects, and map2 could map
- * Customer objects to their "last name" property of type String. The composite
- * map of map1 and map2 would then map Order objects to their customers' last
- * names.
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.1
- * 
- */
-public class CompositeMap extends ObservableMap {
-	// adds that need to go through the second map and thus will be picked up by
-	// secondMapListener.
-	private Set pendingAdds = new HashSet();
-
-	// Removes that need to go through the second map and thus will be picked up
-	// by secondMapListener. Maps from value being removed to key being removed.
-	private Map pendingRemoves = new HashMap();
-
-	// Changes that need to go through the second map and thus will be picked up
-	// by secondMapListener. Maps from old value to new value and new value to old
-	// value.
-	private Map pendingChanges = new HashMap();
-
-	private IMapChangeListener firstMapListener = new IMapChangeListener() {
-
-		public void handleMapChange(MapChangeEvent event) {
-			MapDiff diff = event.diff;
-			Set rangeSetAdditions = new HashSet();
-			Set rangeSetRemovals = new HashSet();
-			final Set adds = new HashSet();
-			final Set changes = new HashSet();
-			final Set removes = new HashSet();
-			final Map oldValues = new HashMap();
-
-			for (Iterator it = diff.getAddedKeys().iterator(); it.hasNext();) {
-				Object addedKey = it.next();
-				Object newValue = diff.getNewValue(addedKey);
-				if (!rangeSet.contains(newValue)) {
-					pendingAdds.add(newValue);
-					rangeSetAdditions.add(newValue);
-				} else {
-					adds.add(addedKey);
-					wrappedMap.put(addedKey, secondMap.get(newValue));
-				}
-			}
-			for (Iterator it = diff.getChangedKeys().iterator(); it.hasNext();) {
-				Object changedKey = it.next();
-				Object oldValue = diff.getOldValue(changedKey);
-				Object newValue = diff.getNewValue(changedKey);
-				boolean removed = firstMap.getKeys(oldValue).isEmpty();
-				boolean added = !rangeSet.contains(newValue);
-				if (removed) {
-					pendingRemoves.put(oldValue, changedKey);
-					rangeSetRemovals.add(oldValue);
-				}
-				if (added) {
-					pendingAdds.add(newValue);
-					rangeSetAdditions.add(newValue);
-				}
-				if (added || removed) {
-					pendingChanges.put(oldValue, newValue);
-					pendingChanges.put(newValue, oldValue);
-				} else {
-					changes.add(changedKey);
-					oldValues.put(changedKey, oldValue);
-					wrappedMap.put(changedKey, secondMap.get(newValue));
-				}
-			}
-			for (Iterator it = diff.getRemovedKeys().iterator(); it.hasNext();) {
-				Object removedKey = it.next();
-				Object oldValue = diff.getOldValue(removedKey);
-				if (firstMap.getKeys(oldValue).isEmpty()) {
-					pendingRemoves.put(oldValue, removedKey);
-					rangeSetRemovals.add(oldValue);
-				} else {
-					removes.add(removedKey);
-					oldValues.put(removedKey, secondMap.get(oldValue));
-					wrappedMap.remove(removedKey);
-				}
-			}
-
-			if (adds.size() > 0 || removes.size() > 0 || changes.size() > 0) {
-				fireMapChange(new MapDiff() {
-
-					public Set getAddedKeys() {
-						return adds;
-					}
-
-					public Set getChangedKeys() {
-						return changes;
-					}
-
-					public Object getNewValue(Object key) {
-						return wrappedMap.get(key);
-					}
-
-					public Object getOldValue(Object key) {
-						return oldValues.get(key);
-					}
-
-					public Set getRemovedKeys() {
-						return removes;
-					}
-				});
-			}
-
-			if (rangeSetAdditions.size() > 0 || rangeSetRemovals.size() > 0) {
-				rangeSet.addAndRemove(rangeSetAdditions, rangeSetRemovals);
-			}
-		}
-	};
-
-	private IMapChangeListener secondMapListener = new IMapChangeListener() {
-
-		public void handleMapChange(MapChangeEvent event) {
-			MapDiff diff = event.diff;
-			final Set adds = new HashSet();
-			final Set changes = new HashSet();
-			final Set removes = new HashSet();
-			final Map oldValues = new HashMap();
-			final Map newValues = new HashMap();
-			Set addedKeys = new HashSet(diff.getAddedKeys());
-			Set removedKeys = new HashSet(diff.getRemovedKeys());
-
-			for (Iterator it = addedKeys.iterator(); it.hasNext();) {
-				Object addedKey = it.next();
-				Set elements = firstMap.getKeys(addedKey);
-				Object newValue = diff.getNewValue(addedKey);
-				if (pendingChanges.containsKey(addedKey)) {
-					Object oldKey = pendingChanges.remove(addedKey);
-					Object oldValue;
-					if (removedKeys.remove(oldKey)) {
-						oldValue = diff.getOldValue(oldKey);
-					} else {
-						oldValue = secondMap.get(oldKey);
-					}
-					pendingChanges.remove(oldKey);
-					pendingAdds.remove(addedKey);
-					pendingRemoves.remove(oldKey);
-					for (Iterator it2 = elements.iterator(); it2.hasNext();) {
-						Object element = it2.next();
-						changes.add(element);
-						oldValues.put(element, oldValue);
-						newValues.put(element, newValue);
-						wrappedMap.put(element, newValue);
-					}
-				} else if (pendingAdds.remove(addedKey)) {
-					for (Iterator it2 = elements.iterator(); it2.hasNext();) {
-						Object element = it2.next();
-						adds.add(element);
-						newValues.put(element, newValue);
-						wrappedMap.put(element, newValue);
-					}
-				} else {
-					Assert.isTrue(false, "unexpected case"); //$NON-NLS-1$
-				}
-			}
-			for (Iterator it = diff.getChangedKeys().iterator(); it.hasNext();) {
-				Object changedKey = it.next();
-				Set elements = firstMap.getKeys(changedKey);
-				for (Iterator it2 = elements.iterator(); it2.hasNext();) {
-					Object element = it2.next();
-					changes.add(element);
-					oldValues.put(element, diff.getOldValue(changedKey));
-					Object newValue = diff.getNewValue(changedKey);
-					newValues.put(element, newValue);
-					wrappedMap.put(element, newValue);
-				}
-			}
-			for (Iterator it = removedKeys.iterator(); it.hasNext();) {
-				Object removedKey = it.next();
-				Object element = pendingRemoves.remove(removedKey);
-				if (element != null) {
-					if (pendingChanges.containsKey(removedKey)) {
-						Object newKey = pendingChanges.remove(removedKey);
-						pendingChanges.remove(newKey);
-						pendingAdds.remove(newKey);
-						pendingRemoves.remove(removedKey);
-						changes.add(element);
-						oldValues.put(element, diff.getOldValue(removedKey));
-						Object newValue = secondMap.get(newKey);
-						newValues.put(element, newValue);
-						wrappedMap.put(element, newValue);
-					} else {
-						removes.add(element);
-						Object oldValue = diff.getOldValue(removedKey);
-						oldValues.put(element, oldValue);
-						wrappedMap.remove(element);
-					}
-				} else {
-					Assert.isTrue(false, "unexpected case"); //$NON-NLS-1$
-				}
-			}
-
-			if (adds.size() > 0 || removes.size() > 0 || changes.size() > 0) {
-				fireMapChange(new MapDiff() {
-
-					public Set getAddedKeys() {
-						return adds;
-					}
-
-					public Set getChangedKeys() {
-						return changes;
-					}
-
-					public Object getNewValue(Object key) {
-						return newValues.get(key);
-					}
-
-					public Object getOldValue(Object key) {
-						return oldValues.get(key);
-					}
-
-					public Set getRemovedKeys() {
-						return removes;
-					}
-				});
-			}
-		}
-	};
-
-	private BidiObservableMap firstMap;
-	private IObservableMap secondMap;
-
-	private static class WritableSetPlus extends WritableSet {
-		void addAndRemove(Set additions, Set removals) {
-			wrappedSet.removeAll(removals);
-			wrappedSet.addAll(additions);
-			fireSetChange(Diffs.createSetDiff(additions, removals));
-		}
-	}
-
-	private WritableSetPlus rangeSet = new WritableSetPlus();
-
-	/**
-	 * Creates a new composite map. Because the key set of the second map is
-	 * determined by the value set of the given observable map
-	 * <code>firstMap</code>, it cannot be passed in as an argument. Instead,
-	 * the second map will be created by calling
-	 * <code>secondMapFactory.createObservable(valueSet())</code>.
-	 * 
-	 * @param firstMap
-	 *            the first map
-	 * @param secondMapFactory
-	 *            a factory that creates the second map when given an observable
-	 *            set representing the value set of <code>firstMap</code>.
-	 */
-	public CompositeMap(IObservableMap firstMap,
-			IObservableFactory secondMapFactory) {
-		super(firstMap.getRealm(), new HashMap());
-		this.firstMap = new BidiObservableMap(firstMap);
-		firstMap.addMapChangeListener(firstMapListener);
-		rangeSet.addAll(firstMap.values());
-		this.secondMap = (IObservableMap) secondMapFactory
-				.createObservable(rangeSet);
-		secondMap.addMapChangeListener(secondMapListener);
-		for (Iterator it = firstMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Entry) it.next();
-			wrappedMap.put(entry.getKey(), secondMap.get(entry.getValue()));
-		}
-	}
-
-	public Object getKeyType() {
-		return firstMap.getKeyType();
-	}
-
-	public Object getValueType() {
-		return secondMap.getValueType();
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-		if (firstMap != null) {
-			firstMap.removeMapChangeListener(firstMapListener);
-			firstMap = null;
-		}
-		if (secondMap != null) {
-			secondMap.dispose();
-			secondMap = null;
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/ComputedObservableMap.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/ComputedObservableMap.java
deleted file mode 100644
index baa57b0..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/ComputedObservableMap.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bugs 241585, 247394, 226289
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.AbstractSet;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-
-/**
- * Maps objects to one of their attributes. Tracks changes to the underlying
- * observable set of objects (keys), as well as changes to attribute values.
- */
-public abstract class ComputedObservableMap extends AbstractObservableMap {
-
-	private IObservableSet keySet;
-	
-	private Object valueType;
-
-	private ISetChangeListener setChangeListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			Set addedKeys = new HashSet(event.diff.getAdditions());
-			Set removedKeys = new HashSet(event.diff.getRemovals());
-			Map oldValues = new HashMap();
-			Map newValues = new HashMap();
-			for (Iterator it = removedKeys.iterator(); it.hasNext();) {
-				Object removedKey = it.next();
-				Object oldValue = doGet(removedKey);
-				unhookListener(removedKey);
-				if (oldValue != null) {
-					oldValues.put(removedKey, oldValue);
-				}
-			}
-			for (Iterator it = addedKeys.iterator(); it.hasNext();) {
-				Object addedKey = it.next();
-				hookListener(addedKey);
-				Object newValue = doGet(addedKey);
-				newValues.put(addedKey, newValue);
-			}
-			fireMapChange(Diffs.createMapDiff(addedKeys, removedKeys,
-					Collections.EMPTY_SET, oldValues, newValues));
-		}
-	};
-
-	private Set entrySet = new EntrySet();
-
-	private class EntrySet extends AbstractSet {
-
-		public Iterator iterator() {
-			final Iterator keyIterator = keySet.iterator();
-			return new Iterator() {
-
-				public boolean hasNext() {
-					return keyIterator.hasNext();
-				}
-
-				public Object next() {
-					final Object key = keyIterator.next();
-					return new Map.Entry() {
-
-						public Object getKey() {
-							return key;
-						}
-
-						public Object getValue() {
-							return get(getKey());
-						}
-
-						public Object setValue(Object value) {
-							return put(getKey(), value);
-						}
-					};
-				}
-
-				public void remove() {
-					keyIterator.remove();
-				}
-			};
-		}
-
-		public int size() {
-			return keySet.size();
-		}
-
-	}
-
-	/**
-	 * @param keySet
-	 */
-	public ComputedObservableMap(IObservableSet keySet) {
-		this(keySet, null);
-	}
-
-	/**
-	 * @param keySet 
-	 * @param valueType 
-	 * @since 1.2
-	 */
-	public ComputedObservableMap(IObservableSet keySet, Object valueType) {
-		super(keySet.getRealm());
-		this.keySet = keySet;
-		this.valueType = valueType;
-	}
-
-	/**
-	 * @deprecated Subclasses are no longer required to call this method.
-	 */
-	protected void init() {
-	}
-
-	protected void firstListenerAdded() {
-		hookListeners();
-	}
-
-	protected void lastListenerRemoved() {
-		unhookListeners();
-	}
-
-	private void hookListeners() {
-		if (keySet != null) {
-			keySet.addSetChangeListener(setChangeListener);
-			for (Iterator it = this.keySet.iterator(); it.hasNext();) {
-				Object key = it.next();
-				hookListener(key);
-			}
-		}
-	}
-
-	private void unhookListeners() {
-		if (keySet != null) {
-			keySet.removeSetChangeListener(setChangeListener);
-			Object[] keys = keySet.toArray();
-			for (int i = 0; i < keys.length; i++) {
-				unhookListener(keys[i]);
-			}
-		}
-	}
-
-	protected final void fireSingleChange(Object key, Object oldValue,
-			Object newValue) {
-		fireMapChange(Diffs.createMapDiffSingleChange(key, oldValue, newValue));
-	}
-
-	public Object getKeyType() {
-		return keySet.getElementType();
-	}
-
-	public Object getValueType() {
-		return valueType;
-	}
-
-	public Set entrySet() {
-		return entrySet;
-	}
-	
-	public Set keySet() {
-		return keySet;
-	}
-
-	final public Object get(Object key) {
-		if (!keySet.contains(key))
-			return null;
-		return doGet(key);
-	}
-
-	final public Object put(Object key, Object value) {
-		if (!keySet.contains(key))
-			return null;
-		return doPut(key, value);
-	}
-
-	/**
-	 * @param removedKey
-	 */
-	protected abstract void unhookListener(Object removedKey);
-
-	/**
-	 * @param addedKey
-	 */
-	protected abstract void hookListener(Object addedKey);
-
-	/**
-	 * @param key
-	 * @return the value for the given key
-	 */
-	protected abstract Object doGet(Object key);
-
-	/**
-	 * @param key
-	 * @param value
-	 * @return the old value for the given key
-	 */
-	protected abstract Object doPut(Object key, Object value);
-
-	public synchronized void dispose() {
-		unhookListeners();
-		entrySet = null;
-		keySet = null;
-		setChangeListener = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/DecoratingObservableMap.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/DecoratingObservableMap.java
deleted file mode 100644
index 2624c00..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/DecoratingObservableMap.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237718)
- *     Matthew Hall - but 246626, 226289
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.DecoratingObservable;
-
-/**
- * An observable map which decorates another observable map.
- * 
- * @since 1.2
- */
-public class DecoratingObservableMap extends DecoratingObservable implements
-		IObservableMap {
-	private IObservableMap decorated;
-
-	private IMapChangeListener mapChangeListener;
-
-	/**
-	 * Constructs a DecoratingObservableMap which decorates the given
-	 * observable.
-	 * 
-	 * @param decorated
-	 *            the observable map being decorated
-	 * @param disposeDecoratedOnDispose
-	 */
-	public DecoratingObservableMap(IObservableMap decorated,
-			boolean disposeDecoratedOnDispose) {
-		super(decorated, disposeDecoratedOnDispose);
-		this.decorated = decorated;
-	}
-
-	public synchronized void addMapChangeListener(IMapChangeListener listener) {
-		addListener(MapChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeMapChangeListener(IMapChangeListener listener) {
-		removeListener(MapChangeEvent.TYPE, listener);
-	}
-
-	public Object getKeyType() {
-		return decorated.getKeyType();
-	}
-
-	public Object getValueType() {
-		return decorated.getValueType();
-	}
-
-	protected void fireMapChange(MapDiff diff) {
-		// fire general change event first
-		super.fireChange();
-		fireEvent(new MapChangeEvent(this, diff));
-	}
-
-	protected void fireChange() {
-		throw new RuntimeException(
-				"fireChange should not be called, use fireListChange() instead"); //$NON-NLS-1$
-	}
-
-	protected void firstListenerAdded() {
-		if (mapChangeListener == null) {
-			mapChangeListener = new IMapChangeListener() {
-				public void handleMapChange(MapChangeEvent event) {
-					DecoratingObservableMap.this.handleMapChange(event);
-				}
-			};
-		}
-		decorated.addMapChangeListener(mapChangeListener);
-		super.firstListenerAdded();
-	}
-
-	protected void lastListenerRemoved() {
-		super.lastListenerRemoved();
-		if (mapChangeListener != null) {
-			decorated.removeMapChangeListener(mapChangeListener);
-			mapChangeListener = null;
-		}
-	}
-
-	/**
-	 * Called whenever a MapChangeEvent is received from the decorated
-	 * observable. By default, this method fires the map change event again,
-	 * with the decorating observable as the event source. Subclasses may
-	 * override to provide different behavior.
-	 * 
-	 * @param event
-	 *            the change event received from the decorated observable
-	 */
-	protected void handleMapChange(final MapChangeEvent event) {
-		fireMapChange(event.diff);
-	}
-
-	public void clear() {
-		checkRealm();
-		decorated.clear();
-	}
-
-	public boolean containsKey(Object key) {
-		getterCalled();
-		return decorated.containsKey(key);
-	}
-
-	public boolean containsValue(Object value) {
-		getterCalled();
-		return decorated.containsValue(value);
-	}
-
-	private class BackedCollection implements Collection {
-		private Collection collection;
-
-		BackedCollection(Collection set) {
-			this.collection = set;
-		}
-
-		public boolean add(Object o) {
-			throw new UnsupportedOperationException();
-		}
-
-		public boolean addAll(Collection arg0) {
-			throw new UnsupportedOperationException();
-		}
-
-		public void clear() {
-			checkRealm();
-			collection.clear();
-		}
-
-		public boolean contains(Object o) {
-			getterCalled();
-			return collection.contains(o);
-		}
-
-		public boolean containsAll(Collection c) {
-			getterCalled();
-			return collection.containsAll(c);
-		}
-
-		public boolean isEmpty() {
-			getterCalled();
-			return collection.isEmpty();
-		}
-
-		public Iterator iterator() {
-			final Iterator iterator = collection.iterator();
-			return new Iterator() {
-				public boolean hasNext() {
-					getterCalled();
-					return iterator.hasNext();
-				}
-
-				public Object next() {
-					getterCalled();
-					return iterator.next();
-				}
-
-				public void remove() {
-					checkRealm();
-					iterator.remove();
-				}
-			};
-		}
-
-		public boolean remove(Object o) {
-			getterCalled();
-			return collection.remove(o);
-		}
-
-		public boolean removeAll(Collection c) {
-			getterCalled();
-			return collection.removeAll(c);
-		}
-
-		public boolean retainAll(Collection c) {
-			getterCalled();
-			return collection.retainAll(c);
-		}
-
-		public int size() {
-			getterCalled();
-			return collection.size();
-		}
-
-		public Object[] toArray() {
-			getterCalled();
-			return collection.toArray();
-		}
-
-		public Object[] toArray(Object[] array) {
-			getterCalled();
-			return collection.toArray(array);
-		}
-
-		public boolean equals(Object obj) {
-			getterCalled();
-			return collection.equals(obj);
-		}
-
-		public int hashCode() {
-			getterCalled();
-			return collection.hashCode();
-		}
-
-		public String toString() {
-			getterCalled();
-			return collection.toString();
-		}
-	}
-
-	private class BackedSet extends BackedCollection implements Set {
-		BackedSet(Set set) {
-			super(set);
-		}
-	}
-
-	Set entrySet = null;
-
-	public Set entrySet() {
-		getterCalled();
-		if (entrySet == null) {
-			entrySet = new BackedSet(decorated.entrySet());
-		}
-		return entrySet;
-	}
-
-	public Object get(Object key) {
-		getterCalled();
-		return decorated.get(key);
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		return decorated.isEmpty();
-	}
-
-	Set keySet = null;
-
-	public Set keySet() {
-		getterCalled();
-		if (keySet == null) {
-			keySet = new BackedSet(decorated.keySet());
-		}
-		return keySet;
-	}
-
-	public Object put(Object key, Object value) {
-		checkRealm();
-		return decorated.put(key, value);
-	}
-
-	public void putAll(Map m) {
-		checkRealm();
-		decorated.putAll(m);
-	}
-
-	public Object remove(Object key) {
-		checkRealm();
-		return decorated.remove(key);
-	}
-
-	public int size() {
-		getterCalled();
-		return decorated.size();
-	}
-
-	Collection values;
-
-	public Collection values() {
-		getterCalled();
-		if (values == null) {
-			values = new BackedCollection(decorated.values());
-		}
-		return values;
-	}
-
-	public boolean equals(Object o) {
-		getterCalled();
-		return decorated.equals(o);
-	}
-
-	public int hashCode() {
-		getterCalled();
-		return decorated.hashCode();
-	}
-
-	public String toString() {
-		getterCalled();
-		return decorated.toString();
-	}
-
-	public synchronized void dispose() {
-		if (decorated != null && mapChangeListener != null) {
-			decorated.removeMapChangeListener(mapChangeListener);
-		}
-		decorated = null;
-		mapChangeListener = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/IMapChangeListener.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/IMapChangeListener.java
deleted file mode 100644
index 3bc829e..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/IMapChangeListener.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-
-/**
- * Listener for changes to observable maps.
- * 
- * @since 1.0
- * 
- */
-public interface IMapChangeListener extends IObservablesListener {
-
-	/**
-	 * Handle a change an observable map. The given event object must only be
-	 * used locally in this method because it may be reused for other change
-	 * notifications. The diff object referenced by the event is immutable and
-	 * may be used non-locally.
-	 * 
-	 * @param event
-	 *            the event
-	 */
-	void handleMapChange(MapChangeEvent event);
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/IObservableMap.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/IObservableMap.java
deleted file mode 100644
index 20c0138..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/IObservableMap.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Matthew Hall - bug 237718, 226289
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.IObservable;
-
-/**
- * Observable Map.
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the classes that
- *              implement this interface. Note that direct implementers of this
- *              interface outside of the framework will be broken in future
- *              releases when methods are added to this interface.
- *              
- * @see AbstractObservableMap
- * @see ObservableMap
- * 
- * @since 1.1
- */
-public interface IObservableMap extends Map, IObservable {
-	
-	/**
-	 * Returns the element type for the {@link #keySet() keyset} of this
-	 * observable map, or <code>null</code> if the keyset is untyped.
-	 * 
-	 * @return the element type for the {@link #keySet() keyset} of this
-	 *         observable map, or <code>null</code> if the keyset is untyped.
-	 * @since 1.2
-	 */
-	public Object getKeyType();
-
-	/**
-	 * Returns the element type for the {@link #values() values} of this
-	 * observable map, or <code>null</code> if the values collection is untyped.
-	 * 
-	 * @return the element type for the {@link #values() values} of this
-	 *         observable map, or <code>null</code> if the values collection is
-	 *         untyped.
-	 * @since 1.2
-	 */
-	public Object getValueType();
-
-	/**
-	 * @param listener
-	 */
-	public void addMapChangeListener(IMapChangeListener listener);
-
-	/**
-	 * @param listener
-	 */
-	public void removeMapChangeListener(IMapChangeListener listener);
-	
-	/**
-	 * @TrackedGetter
-	 */
-	public int size();
-
-	/**
-	 * @TrackedGetter
-	 */
-	public boolean isEmpty();
-
-	/**
-	 * @TrackedGetter
-	 */
-	public boolean containsKey(Object key);
-
-	/**
-	 * @TrackedGetter
-	 */
-	public boolean containsValue(Object value);
-
-	/**
-	 * @TrackedGetter
-	 */
-	public Object get(Object key);
-
-	/**
-	 * 
-	 */
-	public Object put(Object key, Object value);
-
-	/**
-	 * 
-	 */
-	public Object remove(Object key);
-
-	/**
-	 * @TrackedGetter
-	 */
-	public Set keySet();
-
-	/**
-	 * @TrackedGetter
-	 */
-	public Collection values();
-
-	/**
-	 * @TrackedGetter
-	 */
-	public Set entrySet();
-
-	/**
-	 * @TrackedGetter
-	 */
-	public boolean equals(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-	public int hashCode();
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/MapChangeEvent.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/MapChangeEvent.java
deleted file mode 100644
index 90bfef9..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/MapChangeEvent.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-import org.eclipse.core.databinding.observable.ObservableEvent;
-
-/**
- * Map change event describing an incremental change of an
- * {@link IObservableMap} object.
- * 
- * @since 1.0
- * 
- */
-public class MapChangeEvent extends ObservableEvent {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -8092347212410548463L;
-	static final Object TYPE = new Object();
-
-	/**
-	 * Description of the change to the source observable map. Listeners must
-	 * not change this field.
-	 */
-	public MapDiff diff;
-
-	/**
-	 * Creates a new map change event
-	 * 
-	 * @param source
-	 *            the source observable map
-	 * @param diff
-	 *            the map change
-	 */
-	public MapChangeEvent(IObservableMap source, MapDiff diff) {
-		super(source);
-		this.diff = diff;
-	}
-
-	/**
-	 * Returns the observable map from which this event originated.
-	 * 
-	 * @return the observable map from which this event originated
-	 */
-	public IObservableMap getObservableMap() {
-		return (IObservableMap) getSource();
-	}
-
-	protected void dispatch(IObservablesListener listener) {
-		((IMapChangeListener) listener).handleMapChange(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/MapDiff.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/MapDiff.java
deleted file mode 100644
index 9677567..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/MapDiff.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 251884
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @since 1.1
- * 
- */
-public abstract class MapDiff {
-	/**
-	 * Returns true if the diff has no added, removed or changed entries.
-	 * 
-	 * @return true if the diff has no added, removed or changed entries.
-	 * @since 1.2
-	 */
-	public boolean isEmpty() {
-		return getAddedKeys().isEmpty() && getRemovedKeys().isEmpty()
-				&& getChangedKeys().isEmpty();
-	}
-
-	/**
-	 * Applies the changes in this diff to the given map
-	 * 
-	 * @param map
-	 *            the map to which the diff will be applied
-	 * @since 1.2
-	 */
-	public void applyTo(Map map) {
-		for (Iterator it = getAddedKeys().iterator(); it.hasNext();) {
-			Object key = it.next();
-			map.put(key, getNewValue(key));
-		}
-		for (Iterator it = getChangedKeys().iterator(); it.hasNext();) {
-			Object key = it.next();
-			map.put(key, getNewValue(key));
-		}
-		for (Iterator it = getRemovedKeys().iterator(); it.hasNext();) {
-			map.remove(it.next());
-		}
-	}
-
-	/**
-	 * @return the set of keys which were added
-	 */
-	public abstract Set getAddedKeys();
-
-	/**
-	 * @return the set of keys which were removed
-	 */
-	public abstract Set getRemovedKeys();
-
-	/**
-	 * @return the set of keys for which the value has changed
-	 */
-	public abstract Set getChangedKeys();
-
-	/**
-	 * Returns the old value for the given key, which must be an element of
-	 * {@link #getRemovedKeys()} or {@link #getChangedKeys()}.
-	 * 
-	 * @param key
-	 * @return the old value for the given key.
-	 */
-	public abstract Object getOldValue(Object key);
-
-	/**
-	 * Returns the new value for the given key, which must be an element of
-	 * {@link #getChangedKeys()} or {@link #getAddedKeys()}.
-	 * 
-	 * @param key
-	 * @return the new value for the given key.
-	 */
-	public abstract Object getNewValue(Object key);
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/ObservableMap.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/ObservableMap.java
deleted file mode 100644
index e644bce..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/ObservableMap.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Matthew Hall - bug 226289
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- */
-public class ObservableMap extends AbstractObservable implements IObservableMap {
-
-	protected Map wrappedMap;
-
-	private boolean stale = false;
-	
-	/**
-	 * @param wrappedMap
-	 */
-	public ObservableMap(Map wrappedMap) {
-		this(Realm.getDefault(), wrappedMap);
-	}
-
-	/**
-	 * @param realm 
-	 * @param wrappedMap
-	 */
-	public ObservableMap(Realm realm, Map wrappedMap) {
-		super(realm);
-		this.wrappedMap = wrappedMap;
-	}
-	
-	public synchronized void addMapChangeListener(IMapChangeListener listener) {
-		addListener(MapChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeMapChangeListener(IMapChangeListener listener) {
-		removeListener(MapChangeEvent.TYPE, listener);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public Object getKeyType() {
-		return null;
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public Object getValueType() {
-		return null;
-	}
-
-	protected void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	protected void fireMapChange(MapDiff diff) {
-		checkRealm();
-		
-		// fire general change event first
-		super.fireChange();
-
-		fireEvent(new MapChangeEvent(this, diff));
-	}
-
-	public boolean containsKey(Object key) {
-		getterCalled();
-		return wrappedMap.containsKey(key);
-	}
-
-	public boolean containsValue(Object value) {
-		getterCalled();
-		return wrappedMap.containsValue(value);
-	}
-
-	public Set entrySet() {
-		getterCalled();
-		return wrappedMap.entrySet();
-	}
-
-	public Object get(Object key) {
-		getterCalled();
-		return wrappedMap.get(key);
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		return wrappedMap.isEmpty();
-	}
-
-	public Set keySet() {
-		getterCalled();
-		return wrappedMap.keySet();
-	}
-
-	public int size() {
-		getterCalled();
-		return wrappedMap.size();
-	}
-
-	public Collection values() {
-		getterCalled();
-		return wrappedMap.values();
-	}
-
-	/**
-	 * Returns the stale state.  Must be invoked from the current realm.
-	 * 
-	 * @return stale state
-	 */
-	public boolean isStale() {
-		checkRealm();
-		return stale;
-	}
-
-	/**
-	 * Sets the stale state.  Must be invoked from the current realm.
-	 * 
-	 * @param stale
-	 *            The stale state to set. This will fire a stale event if the
-	 *            given boolean is true and this observable set was not already
-	 *            stale.
-	 */
-	public void setStale(boolean stale) {
-		checkRealm();
-		boolean wasStale = this.stale;
-		this.stale = stale;
-		if (!wasStale && stale) {
-			fireStale();
-		}
-	}
-
-	public Object put(Object key, Object value) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Object remove(Object key) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	public void putAll(Map arg0) {
-		throw new UnsupportedOperationException();
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/WritableMap.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/WritableMap.java
deleted file mode 100644
index d5c8769..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/WritableMap.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Matthew Hall - bugs 184830, 233306, 226289
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.map;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.internal.databinding.Util;
-
-/**
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- */
-public class WritableMap extends ObservableMap {
-	private final Object keyType;
-	private final Object valueType;
-
-	/**
-	 * Constructs a new WritableMap on the default realm.
-	 */
-	public WritableMap() {
-		this(Realm.getDefault(), null, null);
-	}
-	
-	/**
-	 * Constructs a new WritableMap on the given realm.
-	 * 
-	 * @param realm
-	 *            the realm
-	 */
-	public WritableMap(Realm realm) {
-		this(realm, null, null);
-	}
-
-	/**
-	 * Constructs a new WritableMap on the default realm with the specified key
-	 * and value types.
-	 * 
-	 * @param keyType
-	 * @param valueType
-	 * @since 1.2
-	 */
-	public WritableMap(Object keyType, Object valueType) {
-		this(Realm.getDefault(), keyType, valueType);
-	}
-
-	/**
-	 * Constructs a new WritableMap on the given realm with the specified key
-	 * and value types.
-	 * 
-	 * @param realm
-	 * @param keyType
-	 * @param valueType
-	 * @since 1.2
-	 */
-	public WritableMap(Realm realm, Object keyType, Object valueType) {
-		super(realm, new HashMap());
-		this.keyType = keyType;
-		this.valueType = valueType;
-	}
-
-	public Object getKeyType() {
-		return keyType;
-	}
-
-	public Object getValueType() {
-		return valueType;
-	}
-
-	/**
-	 * Associates the provided <code>value</code> with the <code>key</code>.  Must be invoked from the current realm.
-	 */
-	public Object put(Object key, Object value) {
-		checkRealm();
-
-		boolean containedKeyBefore = wrappedMap.containsKey(key);
-		Object result = wrappedMap.put(key, value);
-		boolean containedKeyAfter = wrappedMap.containsKey(key);
-
-		if (containedKeyBefore != containedKeyAfter
-				|| !Util.equals(result, value)) {
-			MapDiff diff;
-			if (containedKeyBefore) {
-				if (containedKeyAfter) {
-					diff = Diffs
-							.createMapDiffSingleChange(key, result, value);
-				} else {
-					diff = Diffs.createMapDiffSingleRemove(key, result);
-				}
-			} else {
-				diff = Diffs.createMapDiffSingleAdd(key, value);
-			}
-			fireMapChange(diff);
-		}
-		return result;
-	}
-
-	/**
-	 * Removes the value with the provide <code>key</code>.  Must be invoked from the current realm.
-	 */
-	public Object remove(Object key) {
-		checkRealm();
-		if (wrappedMap.containsKey(key)) {
-			Object result = wrappedMap.remove(key);
-			fireMapChange(Diffs.createMapDiffSingleRemove(key, result));
-			return result;
-		}
-		return null;
-	}
-
-	/**
-	 * Clears the map.  Must be invoked from the current realm.
-	 */
-	public void clear() {
-		checkRealm();
-		if (!isEmpty()) {
-			Map copy = new HashMap(wrappedMap);
-			wrappedMap.clear();
-			fireMapChange(Diffs.createMapDiffRemoveAll(copy));
-		}
-	}
-
-	/**
-	 * Adds the provided <code>map</code>'s contents to this map.  Must be invoked from the current realm.
-	 */
-	public void putAll(Map map) {
-		checkRealm();
-		Set addedKeys = new HashSet(map.size());
-		Map changes = new HashMap(map.size());
-		for (Iterator it = map.entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Entry) it.next();
-			boolean add = !wrappedMap.containsKey(entry.getKey());
-			Object previousValue = wrappedMap.put(entry.getKey(), entry
-					.getValue());
-			if (add) {
-				addedKeys.add(entry.getKey());
-			} else {
-				changes.put(entry.getKey(), previousValue);
-			}
-		}
-		if (!addedKeys.isEmpty() || !changes.isEmpty()) {
-			fireMapChange(Diffs.createMapDiff(addedKeys, Collections.EMPTY_SET,
-					changes.keySet(), changes, wrappedMap));
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/package.html b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/package.html
deleted file mode 100644
index 22107ea..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/map/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes that can be used to observe changes in maps.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that can be used to observe changes in maps.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/masterdetail/IObservableFactory.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/masterdetail/IObservableFactory.java
deleted file mode 100644
index e113f14..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/masterdetail/IObservableFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.masterdetail;
-
-import org.eclipse.core.databinding.observable.IObservable;
-
-/**
- * Generates an {@link IObservable} when passed a target instance.
- * 
- * @since 1.0
- */
-public interface IObservableFactory {
-
-	/**
-	 * Creates an observable for the given target object.
-	 * 
-	 * @param target
-	 * @return the new observable
-	 */
-	public IObservable createObservable(Object target);
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/masterdetail/MasterDetailObservables.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/masterdetail/MasterDetailObservables.java
deleted file mode 100644
index e75dc53..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/masterdetail/MasterDetailObservables.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 147515
- *     Matthew Hall - bug 221704, 226289
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.masterdetail;
-
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableList;
-import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableMap;
-import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableSet;
-import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableValue;
-
-/**
- * Allows for the observation of an attribute, the detail, of an observable
- * representing selection or another transient instance, the master.
- * 
- * @since 1.0
- */
-public class MasterDetailObservables {
-	
-	/**
-	 * Creates a detail observable value from a master observable value and a
-	 * factory. This can be used to create observable values that represent a
-	 * property of a selected object in a table.
-	 * 
-	 * @param master
-	 *            the observable value to track
-	 * @param detailFactory
-	 *            a factory for creating {@link IObservableValue} instances
-	 *            given a current value of the master
-	 * @param detailType
-	 *            the value type of the detail observable value, typically of
-	 *            type java.lang.Class and can be <code>null</code>
-	 * @return an observable value of the given value type that, for any current
-	 *         value of the given master value, behaves like the observable
-	 *         value created by the factory for that current value.
-	 */
-	public static IObservableValue detailValue(IObservableValue master,
-			IObservableFactory detailFactory, Object detailType) {
-		return new DetailObservableValue(master, detailFactory, detailType);
-	}
-
-	/**
-	 * Creates a detail observable list from a master observable value and a
-	 * factory. This can be used to create observable lists that represent a
-	 * list property of a selected object in a table.
-	 * 
-	 * @param master
-	 *            the observable value to track
-	 * @param detailFactory
-	 *            a factory for creating {@link IObservableList} instances given
-	 *            a current value of the master
-	 * @param detailElementType
-	 *            the element type of the detail observable list, typically of
-	 *            type java.lang.Class and can be <code>null</code>
-	 * @return an observable list with the given element type that, for any
-	 *         current value of the given master value, behaves like the
-	 *         observable list created by the factory for that current value.
-	 */
-	public static IObservableList detailList(IObservableValue master,
-			IObservableFactory detailFactory, Object detailElementType) {
-		return new DetailObservableList(detailFactory, master,
-				detailElementType);
-	}
-
-	/**
-	 * Creates a detail observable set from a master observable value and a
-	 * factory. This can be used to create observable sets that represent a set
-	 * property of a selected object in a table.
-	 * 
-	 * @param master
-	 *            the observable value to track
-	 * @param detailFactory
-	 *            a factory for creating {@link IObservableSet} instances given
-	 *            a current value of the master
-	 * @param detailElementType
-	 *            the element type of the detail observable set, typically of
-	 *            type java.lang.Class and can be <code>null</code>
-	 * @return an observable set with the given element type that, for any
-	 *         current value of the given master value, behaves like the
-	 *         observable set created by the factory for that current value.
-	 */
-	public static IObservableSet detailSet(IObservableValue master,
-			IObservableFactory detailFactory, Object detailElementType) {
-		return new DetailObservableSet(detailFactory, master, detailElementType);
-	}
-
-	/**
-	 * Creates a detail observable map from a master observable value and a
-	 * factory. This can be used to create observable maps that represent a map
-	 * property of a selected object in a table.
-	 * 
-	 * @param master
-	 *            the observable value to track
-	 * @param detailFactory
-	 *            a factory for createing {@link IObservableMap} instances given
-	 *            a current value of the master
-	 * @return an observable map that, for any current value of the given master
-	 *         value, behaves like the observable map created by the factory for
-	 *         that current value.
-	 * @since 1.1
-	 */
-	public static IObservableMap detailMap(IObservableValue master,
-			IObservableFactory detailFactory) {
-		return detailMap(master, detailFactory, null, null);
-	}
-
-	/**
-	 * Creates a detail observable map from a master observable value and a
-	 * factory. This can be used to create observable maps that represent a map
-	 * property of a selected object in a table.
-	 * 
-	 * @param master
-	 *            the observable value to track
-	 * @param detailFactory
-	 *            a factory for createing {@link IObservableMap} instances given
-	 *            a current value of the master
-	 * @param detailKeyType
-	 *            the element type of the detail observable map's key set,
-	 *            typically of type java.lang.Class and can be <code>null</code>
-	 * @param detailValueType
-	 *            the element type of the detail observable map's values
-	 *            collection, typically of type java.lang.Class and can be
-	 *            <code>null</code>
-	 * @return an observable map that, for any current value of the given master
-	 *         value, behaves like the observable map created by the factory for
-	 *         that current value.
-	 * @since 1.2
-	 */
-	public static IObservableMap detailMap(IObservableValue master,
-			IObservableFactory detailFactory, Object detailKeyType,
-			Object detailValueType) {
-		return new DetailObservableMap(detailFactory, master, detailKeyType,
-				detailValueType);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/masterdetail/package.html b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/masterdetail/package.html
deleted file mode 100644
index 07b72e5..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/masterdetail/package.html
+++ /dev/null
@@ -1,17 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes that can be used to observe a detail of a master object.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that can be used to observe a detail of a master object.  
-A common use case for master detail is observing the detail (e.g. name) of a master (e.g. selected Person) of a list of elements.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/package.html b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/package.html
deleted file mode 100644
index 0739c1c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides the core APIs for observing changes in objects.
-<h2>
-Package Specification</h2>
-<p>
-This package provides the core APIs for observing changes in objects.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/AbstractObservableSet.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/AbstractObservableSet.java
deleted file mode 100644
index 5c9d0b7..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/AbstractObservableSet.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 208332
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.ChangeSupport;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * 
- * Abstract implementation of {@link IObservableSet}.
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- */
-public abstract class AbstractObservableSet extends AbstractObservable implements
-		IObservableSet {
-
-	private ChangeSupport changeSupport;
-
-	private boolean stale = false;
-
-	protected AbstractObservableSet() {
-		this(Realm.getDefault());
-	}
-	
-	protected void firstListenerAdded() {
-		super.firstListenerAdded();
-	}
-
-	protected void lastListenerRemoved() {
-		super.lastListenerRemoved();
-	}
-	
-	protected AbstractObservableSet(Realm realm) {
-		super(realm);
-		changeSupport = new ChangeSupport(realm){
-			protected void firstListenerAdded() {
-				AbstractObservableSet.this.firstListenerAdded();
-			}
-			protected void lastListenerRemoved() {
-				AbstractObservableSet.this.lastListenerRemoved();
-			}
-		};
-	}
-	
-	public synchronized void addSetChangeListener(ISetChangeListener listener) {
-		changeSupport.addListener(SetChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeSetChangeListener(ISetChangeListener listener) {
-		changeSupport.removeListener(SetChangeEvent.TYPE, listener);
-	}
-
-	protected abstract Set getWrappedSet();
-	
-	protected void fireSetChange(SetDiff diff) {
-		// fire general change event first
-		super.fireChange();
-
-		changeSupport.fireEvent(new SetChangeEvent(this, diff));
-	}
-	
-	public boolean contains(Object o) {
-		getterCalled();
-		return getWrappedSet().contains(o);
-	}
-
-	public boolean containsAll(Collection c) {
-		getterCalled();
-		return getWrappedSet().containsAll(c);
-	}
-
-	public boolean equals(Object o) {
-		getterCalled();
-		return getWrappedSet().equals(o);
-	}
-
-	public int hashCode() {
-		getterCalled();
-		return getWrappedSet().hashCode();
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		return getWrappedSet().isEmpty();
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final Iterator wrappedIterator = getWrappedSet().iterator();
-		return new Iterator() {
-
-			public void remove() {
-				throw new UnsupportedOperationException();
-			}
-
-			public boolean hasNext() {
-				ObservableTracker.getterCalled(AbstractObservableSet.this);
-				return wrappedIterator.hasNext();
-			}
-
-			public Object next() {
-				ObservableTracker.getterCalled(AbstractObservableSet.this);
-				return wrappedIterator.next();
-			}
-		};
-	}
-
-	public int size() {
-		getterCalled();
-		return getWrappedSet().size();
-	}
-
-	public Object[] toArray() {
-		getterCalled();
-		return getWrappedSet().toArray();
-	}
-
-	public Object[] toArray(Object[] a) {
-		getterCalled();
-		return getWrappedSet().toArray(a);
-	}
-
-	public String toString() {
-		getterCalled();
-		return getWrappedSet().toString();
-	}
-
-	protected void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean remove(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean removeAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean retainAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	/**
-	 * @return Returns the stale state.
-	 */
-	public boolean isStale() {
-		getterCalled();
-		return stale;
-	}
-
-	/**
-	 * @param stale
-	 *            The stale state to set. This will fire a stale event if the
-	 *            given boolean is true and this observable set was not already
-	 *            stale.
-	 */
-	public void setStale(boolean stale) {
-		checkRealm();
-		boolean wasStale = this.stale;
-		this.stale = stale;
-		if (!wasStale && stale) {
-			fireStale();
-		}
-	}
-
-
-	protected void fireChange() {
-		throw new RuntimeException("fireChange should not be called, use fireSetChange() instead"); //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.provisional.databinding.observable.AbstractObservable#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-		
-		if (changeSupport != null) {
-			changeSupport.dispose();
-			changeSupport = null;
-		}
-	}
-	
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/ComputedSet.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/ComputedSet.java
deleted file mode 100644
index a8cd743..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/ComputedSet.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237703)
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-
-/**
- * A lazily calculated set that automatically computes and registers listeners
- * on its dependencies as long as all of its dependencies are IObservable
- * objects
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.2
- */
-public abstract class ComputedSet extends AbstractObservableSet {
-	private Set cachedSet = new HashSet();
-
-	private boolean dirty = true;
-	private boolean stale = false;
-
-	private IObservable[] dependencies = new IObservable[0];
-
-	/**
-	 * Creates a computed set in the default realm and with an unknown (null)
-	 * element type.
-	 */
-	public ComputedSet() {
-		this(Realm.getDefault(), null);
-	}
-
-	/**
-	 * Creates a computed set in the default realm and with the given element
-	 * type.
-	 * 
-	 * @param elementType
-	 *            the element type, may be <code>null</code> to indicate unknown
-	 *            element type
-	 */
-	public ComputedSet(Object elementType) {
-		this(Realm.getDefault(), elementType);
-	}
-
-	/**
-	 * Creates a computed set in given realm and with an unknown (null) element
-	 * type.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * 
-	 */
-	public ComputedSet(Realm realm) {
-		this(realm, null);
-	}
-
-	/**
-	 * Creates a computed set in the given realm and with the given element
-	 * type.
-	 * 
-	 * @param realm
-	 *            the realm
-	 * @param elementType
-	 *            the element type, may be <code>null</code> to indicate unknown
-	 *            element type
-	 */
-	public ComputedSet(Realm realm, Object elementType) {
-		super(realm);
-		this.elementType = elementType;
-	}
-
-	/**
-	 * Inner class that implements interfaces that we don't want to expose as
-	 * public API. Each interface could have been implemented using a separate
-	 * anonymous class, but we combine them here to reduce the memory overhead
-	 * and number of classes.
-	 * 
-	 * <p>
-	 * The Runnable calls calculate and stores the result in cachedSet.
-	 * </p>
-	 * 
-	 * <p>
-	 * The IChangeListener stores each observable in the dependencies list. This
-	 * is registered as the listener when calling ObservableTracker, to detect
-	 * every observable that is used by computeValue.
-	 * </p>
-	 * 
-	 * <p>
-	 * The IChangeListener is attached to every dependency.
-	 * </p>
-	 * 
-	 */
-	private class PrivateInterface implements Runnable, IChangeListener,
-			IStaleListener {
-		public void run() {
-			cachedSet = calculate();
-			if (cachedSet == null)
-				cachedSet = Collections.EMPTY_SET;
-		}
-
-		public void handleStale(StaleEvent event) {
-			if (!dirty)
-				makeStale();
-		}
-
-		public void handleChange(ChangeEvent event) {
-			makeDirty();
-		}
-	}
-
-	private PrivateInterface privateInterface = new PrivateInterface();
-
-	private Object elementType;
-
-	protected int doGetSize() {
-		return doGetSet().size();
-	}
-
-	private final Set getSet() {
-		getterCalled();
-		return doGetSet();
-	}
-
-	protected Set getWrappedSet() {
-		return doGetSet();
-	}
-
-	final Set doGetSet() {
-		if (dirty) {
-			// This line will do the following:
-			// - Run the calculate method
-			// - While doing so, add any observable that is touched to the
-			// dependencies list
-			IObservable[] newDependencies = ObservableTracker.runAndMonitor(
-					privateInterface, privateInterface, null);
-
-			// If any dependencies are stale, a stale event will be fired here
-			// even if we were already stale before recomputing. This is in case
-			// clients assume that a set change is indicative of non-staleness.
-			stale = false;
-			for (int i = 0; i < newDependencies.length; i++) {
-				if (newDependencies[i].isStale()) {
-					makeStale();
-					break;
-				}
-			}
-
-			if (!stale) {
-				for (int i = 0; i < newDependencies.length; i++) {
-					newDependencies[i].addStaleListener(privateInterface);
-				}
-			}
-
-			dependencies = newDependencies;
-
-			dirty = false;
-		}
-
-		return cachedSet;
-	}
-
-	/**
-	 * Subclasses must override this method to calculate the set contents.
-	 * 
-	 * @return the object's set.
-	 */
-	protected abstract Set calculate();
-
-	private void makeDirty() {
-		if (!dirty) {
-			dirty = true;
-
-			makeStale();
-
-			stopListening();
-
-			// copy the old set
-			final Set oldSet = new HashSet(cachedSet);
-			// Fire the "dirty" event. This implementation recomputes the new
-			// set lazily.
-			fireSetChange(new SetDiff() {
-				SetDiff delegate;
-
-				private SetDiff getDelegate() {
-					if (delegate == null)
-						delegate = Diffs.computeSetDiff(oldSet, getSet());
-					return delegate;
-				}
-
-				public Set getAdditions() {
-					return getDelegate().getAdditions();
-				}
-
-				public Set getRemovals() {
-					return getDelegate().getRemovals();
-				}
-			});
-		}
-	}
-
-	private void stopListening() {
-		if (dependencies != null) {
-			for (int i = 0; i < dependencies.length; i++) {
-				IObservable observable = dependencies[i];
-
-				observable.removeChangeListener(privateInterface);
-				observable.removeStaleListener(privateInterface);
-			}
-			dependencies = null;
-		}
-	}
-
-	private void makeStale() {
-		if (!stale) {
-			stale = true;
-			fireStale();
-		}
-	}
-
-	public boolean isStale() {
-		// recalculate set if dirty, to ensure staleness is correct.
-		getSet();
-		return stale;
-	}
-
-	public Object getElementType() {
-		return elementType;
-	}
-
-	public synchronized void addChangeListener(IChangeListener listener) {
-		super.addChangeListener(listener);
-		// If somebody is listening, we need to make sure we attach our own
-		// listeners
-		computeSetForListeners();
-	}
-
-	public synchronized void addSetChangeListener(ISetChangeListener listener) {
-		super.addSetChangeListener(listener);
-		// If somebody is listening, we need to make sure we attach our own
-		// listeners
-		computeSetForListeners();
-	}
-
-	private void computeSetForListeners() {
-		// Some clients just add a listener and expect to get notified even if
-		// they never called getValue(), so we have to call getValue() ourselves
-		// here to be sure. Need to be careful about realms though, this method
-		// can be called outside of our realm.
-		// See also bug 198211. If a client calls this outside of our realm,
-		// they may receive change notifications before the runnable below has
-		// been executed. It is their job to figure out what to do with those
-		// notifications.
-		getRealm().exec(new Runnable() {
-			public void run() {
-				if (dependencies == null) {
-					// We are not currently listening.
-					// But someone is listening for changes. Call getValue()
-					// to make sure we start listening to the observables we
-					// depend on.
-					getSet();
-				}
-			}
-		});
-	}
-
-	public synchronized void dispose() {
-		stopListening();
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/DecoratingObservableSet.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/DecoratingObservableSet.java
deleted file mode 100644
index 38092bb..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/DecoratingObservableSet.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237718)
- *     Matthew Hall - bug 246626
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import org.eclipse.core.databinding.observable.DecoratingObservableCollection;
-
-/**
- * An observable set which decorates another observable set.
- * 
- * @since 1.2
- */
-public class DecoratingObservableSet extends DecoratingObservableCollection
-		implements IObservableSet {
-
-	private IObservableSet decorated;
-
-	private ISetChangeListener setChangeListener;
-
-	/**
-	 * Constructs a DecoratingObservableSet which decorates the given
-	 * observable.
-	 * 
-	 * @param decorated
-	 *            the observable set being decorated
-	 * @param disposeDecoratedOnDispose
-	 */
-	public DecoratingObservableSet(IObservableSet decorated,
-			boolean disposeDecoratedOnDispose) {
-		super(decorated, disposeDecoratedOnDispose);
-		this.decorated = decorated;
-	}
-
-	public void clear() {
-		getterCalled();
-		decorated.clear();
-	}
-
-	public synchronized void addSetChangeListener(ISetChangeListener listener) {
-		addListener(SetChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeSetChangeListener(ISetChangeListener listener) {
-		removeListener(SetChangeEvent.TYPE, listener);
-	}
-
-	protected void fireSetChange(SetDiff diff) {
-		// fire general change event first
-		super.fireChange();
-		fireEvent(new SetChangeEvent(this, diff));
-	}
-
-	protected void fireChange() {
-		throw new RuntimeException(
-				"fireChange should not be called, use fireSetChange() instead"); //$NON-NLS-1$
-	}
-
-	protected void firstListenerAdded() {
-		if (setChangeListener == null) {
-			setChangeListener = new ISetChangeListener() {
-				public void handleSetChange(SetChangeEvent event) {
-					DecoratingObservableSet.this.handleSetChange(event);
-				}
-			};
-		}
-		decorated.addSetChangeListener(setChangeListener);
-		super.firstListenerAdded();
-	}
-
-	protected void lastListenerRemoved() {
-		super.lastListenerRemoved();
-		if (setChangeListener != null) {
-			decorated.removeSetChangeListener(setChangeListener);
-			setChangeListener = null;
-		}
-	}
-
-	/**
-	 * Called whenever a SetChangeEvent is received from the decorated
-	 * observable. By default, this method fires the set change event again,
-	 * with the decorating observable as the event source. Subclasses may
-	 * override to provide different behavior.
-	 * 
-	 * @param event
-	 *            the change event received from the decorated observable
-	 */
-	protected void handleSetChange(final SetChangeEvent event) {
-		fireSetChange(event.diff);
-	}
-
-	public synchronized void dispose() {
-		if (decorated != null && setChangeListener != null) {
-			decorated.removeSetChangeListener(setChangeListener);
-		}
-		decorated = null;
-		setChangeListener = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/IObservableSet.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/IObservableSet.java
deleted file mode 100644
index 358cb0c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/IObservableSet.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 237718
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.IObservableCollection;
-
-/**
- * A set whose changes can be tracked by set change listeners.
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the classes that
- *              implement this interface. Note that direct implementers of this
- *              interface outside of the framework will be broken in future
- *              releases when methods are added to this interface.
- * 
- * @see AbstractObservableSet
- * @see ObservableSet
- * 
- * @since 1.0
- * 
- */
-public interface IObservableSet extends Set, IObservableCollection {
-
-	/**
-	 * @param listener
-	 */
-	public void addSetChangeListener(ISetChangeListener listener);
-
-	/**
-	 * @param listener
-	 */
-	public void removeSetChangeListener(ISetChangeListener listener);
-
-	/**
-	 * @return the element type or <code>null</code> if untyped
-	 */
-	public Object getElementType();
-
-	/**
-	 * @TrackedGetter
-	 */
-	int size();
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean isEmpty();
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean contains(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-	Iterator iterator();
-
-	/**
-	 * @TrackedGetter
-	 */
-	Object[] toArray();
-
-	/**
-	 * @TrackedGetter
-	 */
-	Object[] toArray(Object a[]);
-
-	// Modification Operations
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean add(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean remove(Object o);
-
-	// Bulk Operations
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean containsAll(Collection c);
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean addAll(Collection c);
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean retainAll(Collection c);
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean removeAll(Collection c);
-
-	// Comparison and hashing
-
-	/**
-	 * @TrackedGetter
-	 */
-	boolean equals(Object o);
-
-	/**
-	 * @TrackedGetter
-	 */
-	int hashCode();
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/ISetChangeListener.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/ISetChangeListener.java
deleted file mode 100644
index 51c429a..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/ISetChangeListener.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-
-/**
- * Listener for changes to observable sets.
- * 
- * @since 1.0
- * 
- */
-public interface ISetChangeListener extends IObservablesListener {
-
-	/**
-	 * Handle a change to an observable set. The given event object must only be
-	 * used locally in this method because it may be reused for other change
-	 * notifications. The diff object referenced by the event is immutable and
-	 * may be used non-locally.
-	 * 
-	 * @param event
-	 *            the event
-	 */
-	void handleSetChange(SetChangeEvent event);
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/ListToSetAdapter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/ListToSetAdapter.java
deleted file mode 100644
index e145fb3..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/ListToSetAdapter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-
-/**
- * Observable set backed by an observable list. The wrapped list must not
- * contain duplicate elements.
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- * 
- */
-public class ListToSetAdapter extends ObservableSet {
-
-	private final IObservableList list;
-
-	private IListChangeListener listener = new IListChangeListener() {
-
-		public void handleListChange(ListChangeEvent event) {
-			Set added = new HashSet();
-			Set removed = new HashSet();
-			ListDiffEntry[] differences = event.diff.getDifferences();
-			for (int i = 0; i < differences.length; i++) {
-				ListDiffEntry entry = differences[i];
-				Object element = entry.getElement();
-				if (entry.isAddition()) {
-					if (wrappedSet.add(element)) {
-						if (!removed.remove(element))
-							added.add(element);
-					}
-				} else {
-					if (wrappedSet.remove(element)) {
-						removed.add(element);
-						added.remove(element);
-					}
-				}
-			}
-			fireSetChange(Diffs.createSetDiff(added, removed));
-		}
-	};
-
-	/**
-	 * @param list
-	 */
-	public ListToSetAdapter(IObservableList list) {
-		super(list.getRealm(), new HashSet(), list.getElementType());
-		this.list = list;
-		wrappedSet.addAll(list);
-		this.list.addListChangeListener(listener);
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-		if (list != null && listener != null) {
-			list.removeListChangeListener(listener);
-			listener = null;
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/MappedSet.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/MappedSet.java
deleted file mode 100644
index c51c0c5..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/MappedSet.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.map.MapChangeEvent;
-import org.eclipse.core.databinding.observable.map.MapDiff;
-
-/**
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- * 
- */
-public class MappedSet extends ObservableSet {
-
-	private final IObservableMap wrappedMap;
-
-	/*
-	 * Map from values (range elements) to Integer ref counts
-	 */
-	private Map valueCounts = new HashMap();
-
-	private ISetChangeListener domainListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			Set additions = new HashSet();
-			for (Iterator it = event.diff.getAdditions().iterator(); it.hasNext();) {
-				Object added = it.next();
-				Object mapValue = wrappedMap.get(added);
-				if (handleAddition(mapValue)) {
-					additions.add(mapValue);
-				}
-			}
-			Set removals = new HashSet();
-			for (Iterator it = event.diff.getRemovals().iterator(); it.hasNext();) {
-				Object removed = it.next();
-				Object mapValue = wrappedMap.get(removed);
-				if (handleRemoval(mapValue)) {
-					removals.add(mapValue);
-				}
-			}
-			fireSetChange(Diffs.createSetDiff(additions, removals));
-		}
-	};
-
-	private IMapChangeListener mapChangeListener = new IMapChangeListener() {
-		public void handleMapChange(MapChangeEvent event) {
-			MapDiff diff = event.diff;
-			Set additions = new HashSet();
-			Set removals = new HashSet();
-			for (Iterator it = diff.getRemovedKeys().iterator(); it.hasNext();) {
-				Object key = it.next();
-				Object oldValue = diff.getOldValue(key);
-				if (handleRemoval(oldValue)) {
-					removals.add(oldValue);
-				}
-			}
-			for (Iterator it = diff.getChangedKeys().iterator(); it.hasNext();) {
-				Object key = it.next();
-				Object oldValue = diff.getOldValue(key);
-				Object newValue = diff.getNewValue(key);
-				if (handleRemoval(oldValue)) {
-					removals.add(oldValue);
-				}
-				if (handleAddition(newValue)) {
-					additions.add(newValue);
-				}
-			}
-			for (Iterator it = diff.getAddedKeys().iterator(); it.hasNext();) {
-				Object key = it.next();
-				Object newValue = diff.getNewValue(key);
-				if (handleAddition(newValue)) {
-					additions.add(newValue);
-				}
-			}
-			fireSetChange(Diffs.createSetDiff(additions, removals));
-		}
-	};
-
-	private IObservableSet input;
-
-	/**
-	 * @param input
-	 * @param map
-	 */
-	public MappedSet(IObservableSet input, IObservableMap map) {
-		super(input.getRealm(), Collections.EMPTY_SET, Object.class);
-		setWrappedSet(valueCounts.keySet());
-		this.wrappedMap = map;
-		this.input = input;
-		for (Iterator it = input.iterator(); it.hasNext();) {
-			Object element = it.next();
-			Object functionValue = wrappedMap.get(element);
-			handleAddition(functionValue);
-		}
-		input.addSetChangeListener(domainListener);
-		map.addMapChangeListener(mapChangeListener);
-	}
-
-	/**
-	 * @param mapValue
-	 * @return true if the given mapValue was an addition
-	 */
-	protected boolean handleAddition(Object mapValue) {
-		Integer count = (Integer) valueCounts.get(mapValue);
-		if (count == null) {
-			valueCounts.put(mapValue, new Integer(1));
-			return true;
-		}
-		valueCounts.put(mapValue, new Integer(count.intValue() + 1));
-		return false;
-	}
-
-	/**
-	 * @param mapValue
-	 * @return true if the given mapValue has been removed
-	 */
-	protected boolean handleRemoval(Object mapValue) {
-		Integer count = (Integer) valueCounts.get(mapValue);
-		if (count.intValue() <= 1) {
-			valueCounts.remove(mapValue);
-			return true;
-		}
-		valueCounts.put(mapValue, new Integer(count.intValue() - 1));
-		return false;
-	}
-
-	public synchronized void dispose() {
-		wrappedMap.removeMapChangeListener(mapChangeListener);
-		input.removeSetChangeListener(domainListener);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/ObservableSet.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/ObservableSet.java
deleted file mode 100644
index 721df8c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/ObservableSet.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 208332
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * 
- * Abstract implementation of {@link IObservableSet}. 
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- * 
- */
-public abstract class ObservableSet extends AbstractObservable implements
-		IObservableSet {
-
-	protected Set wrappedSet;
-
-	private boolean stale = false;
-
-	protected Object elementType;
-
-	protected ObservableSet(Set wrappedSet, Object elementType) {
-		this(Realm.getDefault(), wrappedSet, elementType);
-	}
-
-	protected ObservableSet(Realm realm, Set wrappedSet, Object elementType) {
-		super(realm);
-		this.wrappedSet = wrappedSet;
-		this.elementType = elementType;
-	}
-	
-	public synchronized void addSetChangeListener(ISetChangeListener listener) {
-		addListener(SetChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeSetChangeListener(ISetChangeListener listener) {
-		removeListener(SetChangeEvent.TYPE, listener);
-	}
-
-	protected void fireSetChange(SetDiff diff) {
-		// fire general change event first
-		super.fireChange();
-
-		fireEvent(new SetChangeEvent(this, diff));
-	}
-	
-	public boolean contains(Object o) {
-		getterCalled();
-		return wrappedSet.contains(o);
-	}
-
-	public boolean containsAll(Collection c) {
-		getterCalled();
-		return wrappedSet.containsAll(c);
-	}
-
-	public boolean equals(Object o) {
-		getterCalled();
-		return wrappedSet.equals(o);
-	}
-
-	public int hashCode() {
-		getterCalled();
-		return wrappedSet.hashCode();
-	}
-
-	public boolean isEmpty() {
-		getterCalled();
-		return wrappedSet.isEmpty();
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final Iterator wrappedIterator = wrappedSet.iterator();
-		return new Iterator() {
-
-			public void remove() {
-				throw new UnsupportedOperationException();
-			}
-
-			public boolean hasNext() {
-				ObservableTracker.getterCalled(ObservableSet.this);
-				return wrappedIterator.hasNext();
-			}
-
-			public Object next() {
-				ObservableTracker.getterCalled(ObservableSet.this);
-				return wrappedIterator.next();
-			}
-		};
-	}
-
-	public int size() {
-		getterCalled();
-		return wrappedSet.size();
-	}
-
-	public Object[] toArray() {
-		getterCalled();
-		return wrappedSet.toArray();
-	}
-
-	public Object[] toArray(Object[] a) {
-		getterCalled();
-		return wrappedSet.toArray(a);
-	}
-
-	public String toString() {
-		getterCalled();
-		return wrappedSet.toString();
-	}
-
-	protected void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean remove(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean removeAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean retainAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	/**
-	 * @return Returns the stale state.
-	 */
-	public boolean isStale() {
-		getterCalled();
-		return stale;
-	}
-
-	/**
-	 * @param stale
-	 *            The stale state to set. This will fire a stale event if the
-	 *            given boolean is true and this observable set was not already
-	 *            stale.
-	 */
-	public void setStale(boolean stale) {
-		checkRealm();
-		boolean wasStale = this.stale;
-		this.stale = stale;
-		if (!wasStale && stale) {
-			fireStale();
-		}
-	}
-
-	/**
-	 * @param wrappedSet The wrappedSet to set.
-	 */
-	protected void setWrappedSet(Set wrappedSet) {
-		this.wrappedSet = wrappedSet;
-	}
-
-	protected void fireChange() {
-		throw new RuntimeException("fireChange should not be called, use fireSetChange() instead"); //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.provisional.databinding.observable.AbstractObservable#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-	}
-	
-	public Object getElementType() {
-		return elementType;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/SetChangeEvent.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/SetChangeEvent.java
deleted file mode 100644
index 4873885..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/SetChangeEvent.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-import org.eclipse.core.databinding.observable.ObservableEvent;
-
-/**
- * List change event describing an incremental change of an
- * {@link IObservableSet} object.
- * 
- * @since 1.0
- * 
- */
-public class SetChangeEvent extends ObservableEvent {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 7436547103857482256L;
-	static final Object TYPE = new Object();
-
-	/**
-	 * Description of the change to the source observable set. Listeners must
-	 * not change this field.
-	 */
-	public SetDiff diff;
-
-	/**
-	 * Creates a new set change event.
-	 * 
-	 * @param source
-	 *            the source observable set
-	 * @param diff
-	 *            the set change
-	 */
-	public SetChangeEvent(IObservableSet source, SetDiff diff) {
-		super(source);
-		this.diff = diff;
-	}
-
-	/**
-	 * Returns the observable set from which this event originated.
-	 * 
-	 * @return the observable set from which this event originated
-	 */
-	public IObservableSet getObservableSet() {
-		return (IObservableSet) getSource();
-	}
-
-	protected void dispatch(IObservablesListener listener) {
-		((ISetChangeListener) listener).handleSetChange(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/SetDiff.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/SetDiff.java
deleted file mode 100644
index 6e677ad..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/SetDiff.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 251884
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.Set;
-
-/**
- * @since 1.0
- *
- */
-public abstract class SetDiff {
-	
-	/**
-	 * @return the set of added elements
-	 */
-	public abstract Set getAdditions();
-	
-	/**
-	 * @return the set of removed elements
-	 */
-	public abstract Set getRemovals();
-	
-	/**
-	 * Returns true if the diff has no added or removed elements.
-	 * 
-	 * @return true if the diff has no added or removed elements.
-	 * @since 1.2
-	 */
-	public boolean isEmpty() {
-		return getAdditions().isEmpty() && getRemovals().isEmpty();
-	}
-
-	/**
-	 * Applies the changes in this diff to the given set
-	 * 
-	 * @param set
-	 *            the set to which the diff will be applied
-	 * @since 1.2
-	 */
-	public void applyTo(Set set) {
-		set.addAll(getAdditions());
-		set.removeAll(getRemovals());
-	}
-
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer
-			.append(getClass().getName())
-			.append("{additions [") //$NON-NLS-1$
-			.append(getAdditions() != null ? getAdditions().toString() : "null") //$NON-NLS-1$
-			.append("], removals [") //$NON-NLS-1$
-			.append(getRemovals() != null ? getRemovals().toString() : "null") //$NON-NLS-1$
-			.append("]}"); //$NON-NLS-1$
-		
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/UnionSet.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/UnionSet.java
deleted file mode 100644
index 768c62d..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/UnionSet.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 208332
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.internal.databinding.observable.IStalenessConsumer;
-import org.eclipse.core.internal.databinding.observable.StalenessTracker;
-
-/**
- * Represents a set consisting of the union of elements from one or more other
- * sets. This object does not need to be explicitly disposed. If nobody is
- * listening to the UnionSet, the set will remove its listeners.
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- */
-public final class UnionSet extends ObservableSet {
-
-	/**
-	 * child sets
-	 */
-	private IObservableSet[] childSets;
-
-	private boolean stale = false;
-
-	/**
-	 * Map of elements onto Integer reference counts. This map is constructed
-	 * when the first listener is added to the union set. Null if nobody is
-	 * listening to the UnionSet.
-	 */
-	private HashMap refCounts = null;
-
-	private StalenessTracker stalenessTracker;
-
-	/**
-	 * @param childSets
-	 */
-	public UnionSet(IObservableSet[] childSets) {
-		super(childSets[0].getRealm(), null, childSets[0].getElementType());
-		System.arraycopy(childSets, 0, this.childSets = new IObservableSet[childSets.length], 0, childSets.length);
-		this.stalenessTracker = new StalenessTracker(childSets,
-				stalenessConsumer);
-	}
-
-	private ISetChangeListener childSetChangeListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			processAddsAndRemoves(event.diff.getAdditions(), event.diff.getRemovals());
-		}
-	};
-
-	private IStalenessConsumer stalenessConsumer = new IStalenessConsumer() {
-		public void setStale(boolean stale) {
-			boolean oldStale = UnionSet.this.stale;
-			UnionSet.this.stale = stale;
-			if (stale && !oldStale) {
-				fireStale();
-			}
-		}
-	};
-
-	public boolean isStale() {
-		getterCalled();
-		if (refCounts != null) {
-			return stale;
-		}
-
-		for (int i = 0; i < childSets.length; i++) {
-			IObservableSet childSet = childSets[i];
-
-			if (childSet.isStale()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private void processAddsAndRemoves(Set adds, Set removes) {
-		Set addsToFire = new HashSet();
-		Set removesToFire = new HashSet();
-
-		for (Iterator iter = adds.iterator(); iter.hasNext();) {
-			Object added = iter.next();
-
-			Integer refCount = (Integer) refCounts.get(added);
-			if (refCount == null) {
-				refCounts.put(added, new Integer(1));
-				addsToFire.add(added);
-			} else {
-				int refs = refCount.intValue();
-				refCount = new Integer(refs + 1);
-				refCounts.put(added, refCount);
-			}
-		}
-
-		for (Iterator iter = removes.iterator(); iter.hasNext();) {
-			Object removed = iter.next();
-
-			Integer refCount = (Integer) refCounts.get(removed);
-			if (refCount != null) {
-				int refs = refCount.intValue();
-				if (refs <= 1) {
-					removesToFire.add(removed);
-					refCounts.remove(removed);
-				} else {
-					refCount = new Integer(refCount.intValue() - 1);
-					refCounts.put(removed, refCount);
-				}
-			}
-		}
-
-		// just in case the removes overlapped with the adds
-		addsToFire.removeAll(removesToFire);
-
-		if (addsToFire.size() > 0 || removesToFire.size() > 0) {
-			fireSetChange(Diffs.createSetDiff(addsToFire, removesToFire));
-		}
-	}
-
-	protected void firstListenerAdded() {
-		super.firstListenerAdded();
-
-		refCounts = new HashMap();
-		for (int i = 0; i < childSets.length; i++) {
-			IObservableSet next = childSets[i];
-			next.addSetChangeListener(childSetChangeListener);
-			incrementRefCounts(next);
-		}
-		stalenessTracker = new StalenessTracker(childSets, stalenessConsumer);
-		setWrappedSet(refCounts.keySet());
-	}
-
-	protected void lastListenerRemoved() {
-		super.lastListenerRemoved();
-
-		for (int i = 0; i < childSets.length; i++) {
-			IObservableSet next = childSets[i];
-
-			next.removeSetChangeListener(childSetChangeListener);
-			stalenessTracker.removeObservable(next);
-		}
-		refCounts = null;
-		stalenessTracker = null;
-		setWrappedSet(null);
-	}
-
-	private ArrayList incrementRefCounts(Collection added) {
-		ArrayList adds = new ArrayList();
-
-		for (Iterator iter = added.iterator(); iter.hasNext();) {
-			Object next = iter.next();
-
-			Integer refCount = (Integer) refCounts.get(next);
-			if (refCount == null) {
-				adds.add(next);
-				refCount = new Integer(1);
-				refCounts.put(next, refCount);
-			} else {
-				refCount = new Integer(refCount.intValue() + 1);
-				refCounts.put(next, refCount);
-			}
-		}
-		return adds;
-	}
-
-	protected void getterCalled() {
-		super.getterCalled();
-		if (refCounts == null) {
-			// no listeners, recompute
-			setWrappedSet(computeElements());
-		}
-	}
-
-	private Set computeElements() {
-		// If there is no cached value, compute the union from scratch
-		if (refCounts == null) {
-			Set result = new HashSet();
-			for (int i = 0; i < childSets.length; i++) {
-				result.addAll(childSets[i]);
-			}
-			return result;
-		}
-
-		// Else there is a cached value. Return it.
-		return refCounts.keySet();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/WritableSet.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/WritableSet.java
deleted file mode 100644
index 52ded9d..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/WritableSet.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 147515
- *     Matthew Hall - bug 221351
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.set;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * Mutable (writable) implementation of {@link IObservableSet}.
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- */
-public class WritableSet extends ObservableSet {
-
-	/**
-	 * Constructs a new empty instance in the default realm with a
-	 * <code>null</code> element type.
-	 * 
-	 */
-	public WritableSet() {
-		this(Realm.getDefault());
-	}
-
-	/**
-	 * Constructs a new instance in the default realm containing the
-	 * elements of the given collection. Changes to the given collection after
-	 * calling this method do not affect the contents of the created WritableSet.
-	 * 
-	 * @param c
-	 * @param elementType
-	 *            can be <code>null</code>
-	 */
-	public WritableSet(Collection c, Object elementType) {
-		this(Realm.getDefault(), new HashSet(c), elementType);
-	}
-
-	/**
-	 * Constructs a new empty instance in the given realm and a
-	 * <code>null</code> element type.
-	 * 
-	 * @param realm
-	 */
-	public WritableSet(Realm realm) {
-		this(realm, new HashSet(), null);
-	}
-
-	/**
-	 * Constructs a new instance in the default realm with the given element
-	 * type, containing the elements of the given collection. Changes to the
-	 * given collection after calling this method do not affect the contents of
-	 * the created WritableSet.
-	 * 
-	 * @param realm
-	 * @param c
-	 * @param elementType
-	 *            can be <code>null</code>
-	 */
-	public WritableSet(Realm realm, Collection c, Object elementType) {
-		super(realm, new HashSet(c), elementType);
-		this.elementType = elementType;
-	}
-
-	public boolean add(Object o) {
-		getterCalled();
-		boolean added = wrappedSet.add(o);
-		if (added) {
-			fireSetChange(Diffs.createSetDiff(Collections.singleton(o), Collections.EMPTY_SET));
-		}
-		return added;
-	}
-
-	public boolean addAll(Collection c) {
-		getterCalled();
-		Set additions = new HashSet();
-		Iterator it = c.iterator();
-		while (it.hasNext()) {
-			Object element = it.next();
-			if (wrappedSet.add(element)) {
-				additions.add(element);
-			}
-		}
-		if (additions.size() > 0) {
-			fireSetChange(Diffs.createSetDiff(additions, Collections.EMPTY_SET));
-			return true;
-		}
-		return false;
-	}
-
-	public boolean remove(Object o) {
-		getterCalled();
-		boolean removed = wrappedSet.remove(o);
-		if (removed) {
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, Collections
-					.singleton(o)));
-		}
-		return removed;
-	}
-
-	public boolean removeAll(Collection c) {
-		getterCalled();
-		Set removes = new HashSet();
-		Iterator it = c.iterator();
-		while (it.hasNext()) {
-			Object element = it.next();
-			if (wrappedSet.remove(element)) {
-				removes.add(element);
-			}
-		}
-		if (removes.size() > 0) {
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removes));
-			return true;
-		}
-		return false;
-	}
-
-	public boolean retainAll(Collection c) {
-		getterCalled();
-		Set removes = new HashSet();
-		Iterator it = wrappedSet.iterator();
-		while (it.hasNext()) {
-			Object element = it.next();
-			if (!c.contains(element)) {
-				it.remove();
-				removes.add(element);
-			}
-		}
-		if (removes.size() > 0) {
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removes));
-			return true;
-		}
-		return false;
-	}
-
-	public void clear() {
-		getterCalled();
-		Set removes = new HashSet(wrappedSet);
-		wrappedSet.clear();
-		fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removes));
-	}
-
-	/**
-	 * @param elementType can be <code>null</code>
-	 * @return new instance with the default realm
-	 */
-	public static WritableSet withElementType(Object elementType) {
-		return new WritableSet(Realm.getDefault(), new HashSet(), elementType);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/package.html b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/package.html
deleted file mode 100644
index 5a57448..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/set/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes that can be used to observe changes in sets.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that can be used to observe changes in sets.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/AbstractObservableValue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/AbstractObservableValue.java
deleted file mode 100644
index 1c61589..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/AbstractObservableValue.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Matthew Hall - bug 208332
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- * 
- */
-abstract public class AbstractObservableValue extends AbstractObservable implements IObservableValue {
-	/**
-	 * Constructs a new instance with the default realm.
-	 */
-	public AbstractObservableValue() {
-		this(Realm.getDefault());
-	}
-
-	/**
-	 * @param realm
-	 */
-	public AbstractObservableValue(Realm realm) {
-		super(realm);
-	}
-
-	public synchronized void addValueChangeListener(IValueChangeListener listener) {
-		addListener(ValueChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeValueChangeListener(IValueChangeListener listener) {
-		removeListener(ValueChangeEvent.TYPE, listener);
-	}
-
-	final public void setValue(Object value) {
-		checkRealm();
-		doSetValue(value);
-	}
-
-	/**
-	 * Template method for setting the value of the observable. By default the
-	 * method throws an {@link UnsupportedOperationException}.
-	 * 
-	 * @param value
-	 */
-	protected void doSetValue(Object value) {
-		throw new UnsupportedOperationException();
-	}
-
-	protected void fireValueChange(ValueDiff diff) {
-		// fire general change event first
-		super.fireChange();
-		fireEvent(new ValueChangeEvent(this, diff));
-	}
-
-	public final Object getValue() {
-		getterCalled();
-		return doGetValue();
-	}
-
-	abstract protected Object doGetValue();
-
-	public boolean isStale() {
-		getterCalled();
-		return false;
-	}
-
-	private void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	protected void fireChange() {
-		throw new RuntimeException(
-				"fireChange should not be called, use fireValueChange() instead"); //$NON-NLS-1$
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/AbstractVetoableValue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/AbstractVetoableValue.java
deleted file mode 100644
index d3cff74..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/AbstractVetoableValue.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.internal.databinding.Util;
-
-/**
- * 
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- * 
- */
-public abstract class AbstractVetoableValue extends AbstractObservableValue
-		implements IVetoableValue {
-
-	/**
-	 * Creates a new vetoable value.
-	 */
-	public AbstractVetoableValue() {
-		this(Realm.getDefault());
-	}
-
-	/**
-	 * @param realm
-	 */
-	public AbstractVetoableValue(Realm realm) {
-		super(realm);
-	}
-
-	final protected void doSetValue(Object value) {
-		Object currentValue = doGetValue();
-		ValueDiff diff = Diffs.createValueDiff(currentValue, value);
-		boolean okToProceed = fireValueChanging(diff);
-		if (!okToProceed) {
-			throw new ChangeVetoException("Change not permitted"); //$NON-NLS-1$
-		}
-		doSetApprovedValue(value);
-		
-		if (!Util.equals(diff.getOldValue(), diff.getNewValue())) {
-			fireValueChange(diff);
-		}
-	}
-
-	/**
-	 * Sets the value. Invoked after performing veto checks.  Should not fire change events.
-	 * 
-	 * @param value
-	 */
-	protected abstract void doSetApprovedValue(Object value);
-
-	public synchronized void addValueChangingListener(
-			IValueChangingListener listener) {
-		addListener(ValueChangingEvent.TYPE, listener);
-	}
-
-	public synchronized void removeValueChangingListener(
-			IValueChangingListener listener) {
-		removeListener(ValueChangingEvent.TYPE, listener);
-	}
-
-	/**
-	 * Notifies listeners about a pending change, and returns true if no
-	 * listener vetoed the change.
-	 * 
-	 * @param diff
-	 * @return false if the change was vetoed, true otherwise
-	 */
-	protected boolean fireValueChanging(ValueDiff diff) {
-		checkRealm();
-
-		ValueChangingEvent event = new ValueChangingEvent(this, diff);
-		fireEvent(event);
-		return !event.veto;
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/ChangeVetoException.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/ChangeVetoException.java
deleted file mode 100644
index 3c9261f..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/ChangeVetoException.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.value;
-
-/**
- * @since 1.0
- *
- */
-public class ChangeVetoException extends RuntimeException {
-	
-	/**
-	 * @param string
-	 */
-	public ChangeVetoException(String string) {
-		super(string);
-	}
-
-	private static final long serialVersionUID = 1L;
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/ComputedValue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/ComputedValue.java
deleted file mode 100644
index 755063a..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/ComputedValue.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *     Brad Reynolds - bug 147515
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-
-/**
- * A Lazily calculated value that automatically computes and registers listeners
- * on its dependencies as long as all of its dependencies are IObservable
- * objects
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * 
- * @since 1.0
- */
-public abstract class ComputedValue extends AbstractObservableValue {
-
-	private boolean dirty = true;
-
-	private boolean stale = false;
-
-	private Object cachedValue = null;
-
-	/**
-	 * Array of observables this computed value depends on. This field has a
-	 * value of <code>null</code> if we are not currently listening.
-	 */
-	private IObservable[] dependencies = null;
-
-	/**
-	 * 
-	 */
-	public ComputedValue() {
-		this(Realm.getDefault(), null);
-	}
-
-	/**
-	 * @param valueType
-	 *            can be <code>null</code>
-	 */
-	public ComputedValue(Object valueType) {
-		this(Realm.getDefault(), valueType);
-	}
-
-	/**
-	 * @param realm
-	 * 
-	 */
-	public ComputedValue(Realm realm) {
-		this(realm, null);
-	}
-
-	/**
-	 * @param realm
-	 * @param valueType
-	 */
-	public ComputedValue(Realm realm, Object valueType) {
-		super(realm);
-		this.valueType = valueType;
-	}
-
-	/**
-	 * Inner class that implements interfaces that we don't want to expose as
-	 * public API. Each interface could have been implemented using a separate
-	 * anonymous class, but we combine them here to reduce the memory overhead
-	 * and number of classes.
-	 * 
-	 * <p>
-	 * The Runnable calls computeValue and stores the result in cachedValue.
-	 * </p>
-	 * 
-	 * <p>
-	 * The IChangeListener stores each observable in the dependencies list. This
-	 * is registered as the listener when calling ObservableTracker, to detect
-	 * every observable that is used by computeValue.
-	 * </p>
-	 * 
-	 * <p>
-	 * The IChangeListener is attached to every dependency.
-	 * </p>
-	 * 
-	 */
-	private class PrivateInterface implements Runnable, IChangeListener,
-			IStaleListener {
-		public void run() {
-			cachedValue = calculate();
-		}
-
-		public void handleStale(StaleEvent event) {
-			if (!dirty && !stale) {
-				stale = true;
-				fireStale();
-			}
-		}
-
-		public void handleChange(ChangeEvent event) {
-			makeDirty();
-		}
-	}
-
-	private PrivateInterface privateInterface = new PrivateInterface();
-
-	private Object valueType;
-
-	protected final Object doGetValue() {
-		if (dirty) {
-			// This line will do the following:
-			// - Run the calculate method
-			// - While doing so, add any observable that is touched to the
-			// dependencies list
-			IObservable[] newDependencies = ObservableTracker.runAndMonitor(
-					privateInterface, privateInterface, null);
-
-			stale = false;
-			for (int i = 0; i < newDependencies.length; i++) {
-				IObservable observable = newDependencies[i];
-				// Add a change listener to the new dependency.
-				if (observable.isStale()) {
-					stale = true;
-				} else {
-					observable.addStaleListener(privateInterface);
-				}
-			}
-
-			dependencies = newDependencies;
-
-			dirty = false;
-		}
-
-		return cachedValue;
-	}
-
-	/**
-	 * Subclasses must override this method to provide the object's value.
-	 * 
-	 * @return the object's value
-	 */
-	protected abstract Object calculate();
-
-	protected final void makeDirty() {
-		if (!dirty) {
-			dirty = true;
-
-			stopListening();
-
-			// copy the old value
-			final Object oldValue = cachedValue;
-			// Fire the "dirty" event. This implementation recomputes the new
-			// value lazily.
-			fireValueChange(new ValueDiff() {
-
-				public Object getOldValue() {
-					return oldValue;
-				}
-
-				public Object getNewValue() {
-					return getValue();
-				}
-			});
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void stopListening() {
-		// Stop listening for dependency changes.
-		if (dependencies != null) {
-			for (int i = 0; i < dependencies.length; i++) {
-				IObservable observable = dependencies[i];
-
-				observable.removeChangeListener(privateInterface);
-				observable.removeStaleListener(privateInterface);
-			}
-			dependencies = null;
-		}
-	}
-
-	public boolean isStale() {
-		// we need to recompute, otherwise staleness wouldn't mean anything
-		getValue();
-		return stale;
-	}
-
-	public Object getValueType() {
-		return valueType;
-	}
-
-	// this method exists here so that we can call it from the runnable below.
-	/**
-	 * @since 1.1
-	 */
-	protected boolean hasListeners() {
-		return super.hasListeners();
-	}
-
-	public synchronized void addChangeListener(IChangeListener listener) {
-		super.addChangeListener(listener);
-		// If somebody is listening, we need to make sure we attach our own
-		// listeners
-		computeValueForListeners();
-	}
-
-	/**
-	 * Some clients just add a listener and expect to get notified even if they
-	 * never called getValue(), so we have to call getValue() ourselves here to
-	 * be sure. Need to be careful about realms though, this method can be
-	 * called outside of our realm. See also bug 198211. If a client calls this
-	 * outside of our realm, they may receive change notifications before the
-	 * runnable below has been executed. It is their job to figure out what to
-	 * do with those notifications.
-	 */
-	private void computeValueForListeners() {
-		getRealm().exec(new Runnable() {
-			public void run() {
-				if (dependencies == null) {
-					// We are not currently listening.
-					if (hasListeners()) {
-						// But someone is listening for changes. Call getValue()
-						// to make sure we start listening to the observables we
-						// depend on.
-						getValue();
-					}
-				}
-			}
-		});
-	}
-
-	public synchronized void addValueChangeListener(
-			IValueChangeListener listener) {
-		super.addValueChangeListener(listener);
-		// If somebody is listening, we need to make sure we attach our own
-		// listeners
-		computeValueForListeners();
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-		stopListening();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/DecoratingObservableValue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/DecoratingObservableValue.java
deleted file mode 100644
index 6ab290f..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/DecoratingObservableValue.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237718)
- *     Matthew Hall - but 246626
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.DecoratingObservable;
-
-/**
- * An observable value which decorates another observable value.
- * 
- * @since 1.2
- */
-public class DecoratingObservableValue extends DecoratingObservable implements
-		IObservableValue {
-	private IObservableValue decorated;
-
-	private IValueChangeListener valueChangeListener;
-
-	/**
-	 * Constructs a DecoratingObservableValue which decorates the given
-	 * observable.
-	 * 
-	 * @param decorated
-	 *            the observable value being decorated
-	 * @param disposeDecoratedOnDispose 
-	 */
-	public DecoratingObservableValue(IObservableValue decorated,
-			boolean disposeDecoratedOnDispose) {
-		super(decorated, disposeDecoratedOnDispose);
-		this.decorated = decorated;
-	}
-
-	public synchronized void addValueChangeListener(
-			IValueChangeListener listener) {
-		addListener(ValueChangeEvent.TYPE, listener);
-	}
-
-	public synchronized void removeValueChangeListener(
-			IValueChangeListener listener) {
-		removeListener(ValueChangeEvent.TYPE, listener);
-	}
-
-	protected void fireValueChange(ValueDiff diff) {
-		// fire general change event first
-		super.fireChange();
-		fireEvent(new ValueChangeEvent(this, diff));
-	}
-
-	protected void fireChange() {
-		throw new RuntimeException(
-				"fireChange should not be called, use fireValueChange() instead"); //$NON-NLS-1$
-	}
-
-	protected void firstListenerAdded() {
-		if (valueChangeListener == null) {
-			valueChangeListener = new IValueChangeListener() {
-				public void handleValueChange(ValueChangeEvent event) {
-					DecoratingObservableValue.this.handleValueChange(event);
-				}
-			};
-		}
-		decorated.addValueChangeListener(valueChangeListener);
-		super.firstListenerAdded();
-	}
-
-	protected void lastListenerRemoved() {
-		super.lastListenerRemoved();
-		if (valueChangeListener != null) {
-			decorated.removeValueChangeListener(valueChangeListener);
-			valueChangeListener = null;
-		}
-	}
-
-	/**
-	 * Called whenever a ValueChangeEvent is received from the decorated
-	 * observable. By default, this method fires the value change event again,
-	 * with the decorating observable as the event source. Subclasses may
-	 * override to provide different behavior.
-	 * 
-	 * @param event
-	 *            the change event received from the decorated observable
-	 */
-	protected void handleValueChange(final ValueChangeEvent event) {
-		fireValueChange(event.diff);
-	}
-
-	public Object getValue() {
-		getterCalled();
-		return decorated.getValue();
-	}
-
-	public void setValue(Object value) {
-		checkRealm();
-		decorated.setValue(value);
-	}
-
-	public Object getValueType() {
-		return decorated.getValueType();
-	}
-
-	public synchronized void dispose() {
-		if (decorated != null && valueChangeListener != null) {
-			decorated.removeValueChangeListener(valueChangeListener);
-		}
-		decorated = null;
-		valueChangeListener = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/IObservableValue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/IObservableValue.java
deleted file mode 100644
index 820fa93..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/IObservableValue.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 237718
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * A value whose changes can be tracked by value change listeners.
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the classes that
- *              implement this interface. Note that direct implementers of this
- *              interface outside of the framework will be broken in future
- *              releases when methods are added to this interface.
- * 
- * @see AbstractObservableValue
- * 
- * @since 1.0
- */
-public interface IObservableValue extends IObservable {
-
-	/**
-	 * The value type of this observable value, or <code>null</code> if this
-	 * observable value is untyped.
-	 * 
-	 * @return the value type, or <code>null</null>
-	 */
-	public Object getValueType();
-
-	/**
-	 * Returns the value.  Must be invoked in the {@link Realm} of the observable.
-	 * 
-	 * @return the current value
-	 * @TrackedGetter
-	 */
-	public Object getValue();
-
-	/**
-	 * Sets the value.  Must be invoked in the {@link Realm} of the observable.
-	 * 
-	 * @param value
-	 *            the value to set
-	 * @throws UnsupportedOperationException
-	 *             if this observable value cannot be set.
-	 */
-	public void setValue(Object value);
-
-	/**
-	 * 
-	 * @param listener
-	 */
-	public void addValueChangeListener(IValueChangeListener listener);
-
-	/**
-	 * @param listener
-	 */
-	public void removeValueChangeListener(IValueChangeListener listener);
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/IValueChangeListener.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/IValueChangeListener.java
deleted file mode 100644
index 7af5382..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/IValueChangeListener.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-
-/**
- * Listener for changes to observable values.
- * 
- * @since 1.0
- * 
- */
-public interface IValueChangeListener extends IObservablesListener {
-
-	/**
-	 * Handles a change to an observable value. The given event object must only
-	 * be used locally in this method because it may be reused for other change
-	 * notifications. The diff object referenced by the event is immutable and
-	 * may be used non-locally.
-	 * 
-	 * @param event
-	 *            the event
-	 */
-	void handleValueChange(ValueChangeEvent event);
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/IValueChangingListener.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/IValueChangingListener.java
deleted file mode 100644
index ceb07b7..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/IValueChangingListener.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-
-/**
- * Listener for pre-change events for observable values.
- * 
- * @since 1.0
- * 
- */
-public interface IValueChangingListener extends IObservablesListener {
-
-	/**
-	 * This method is called when the value is about to change and provides an
-	 * opportunity to veto the change. The given event object must only be used
-	 * locally in this method because it may be reused for other change
-	 * notifications. The diff object referenced by the event is immutable and
-	 * may be used non-locally.
-	 * 
-	 * @param event
-	 */
-	public void handleValueChanging(ValueChangingEvent event);
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/IVetoableValue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/IVetoableValue.java
deleted file mode 100644
index 1b795ed..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/IVetoableValue.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.databinding.observable.value;
-
-/**
- * An observable value whose changes can be vetoed by listeners.
- * 
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- *              Clients should instead subclass one of the classes that
- *              implement this interface. Note that direct implementers of this
- *              interface outside of the framework will be broken in future
- *              releases when methods are added to this interface.
- * 
- * @since 1.0
- * 
- */
-public interface IVetoableValue extends IObservableValue {
-	
-	/**
-	 * @param listener
-	 */
-	public void addValueChangingListener(IValueChangingListener listener);
-	
-	/**
-	 * @param listener
-	 */
-	public void removeValueChangingListener(IValueChangingListener listener);
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/ValueChangeEvent.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/ValueChangeEvent.java
deleted file mode 100644
index 3d4fba9..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/ValueChangeEvent.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-import org.eclipse.core.databinding.observable.ObservableEvent;
-
-/**
- * Value change event describing a change of an {@link IObservableValue}
- * object's current value.
- * 
- * @since 1.0
- * 
- */
-public class ValueChangeEvent extends ObservableEvent {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 2305345286999701156L;
-
-	static final Object TYPE = new Object();
-
-	/**
-	 * Description of the change to the source observable value. Listeners must
-	 * not change this field.
-	 */
-	public ValueDiff diff;
-
-	/**
-	 * Creates a new value change event.
-	 * 
-	 * @param source
-	 *            the source observable value
-	 * @param diff
-	 *            the value change
-	 */
-	public ValueChangeEvent(IObservableValue source, ValueDiff diff) {
-		super(source);
-		this.diff = diff;
-	}
-
-	/**
-	 * Returns the observable value from which this event originated.
-	 * 
-	 * @return returns the observable value from which this event originated
-	 */
-	public IObservableValue getObservableValue() {
-		return (IObservableValue) source;
-	}
-
-	protected void dispatch(IObservablesListener listener) {
-		((IValueChangeListener) listener).handleValueChange(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/ValueChangingEvent.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/ValueChangingEvent.java
deleted file mode 100644
index f92cde7..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/ValueChangingEvent.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.IObservablesListener;
-import org.eclipse.core.databinding.observable.ObservableEvent;
-
-/**
- * Value changing event describing a pending change of an
- * {@link IObservableValue} object's current value. Listeners can veto the
- * pending change by setting {@link #veto} to <code>true</code>.
- * 
- * @since 1.0
- * 
- */
-public class ValueChangingEvent extends ObservableEvent {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 2305345286999701156L;
-
-	static final Object TYPE = new Object();
-
-	/**
-	 * Description of the change to the source observable value. Listeners must
-	 * not change this field.
-	 */
-	public ValueDiff diff;
-
-	/**
-	 * Flag for vetoing this change. Default value is <code>false</code>, can
-	 * be set to <code>true</code> by listeners to veto this change.
-	 */
-	public boolean veto = false;
-
-	/**
-	 * Creates a new value changing event.
-	 * 
-	 * @param source
-	 *            the source observable value
-	 * @param diff
-	 *            the value change
-	 */
-	public ValueChangingEvent(IObservableValue source, ValueDiff diff) {
-		super(source);
-		this.diff = diff;
-	}
-
-	/**
-	 * @return the observable value from which this event originated
-	 */
-	public IObservableValue getObservableValue() {
-		return (IObservableValue) source;
-	}
-
-	protected void dispatch(IObservablesListener listener) {
-		((IValueChangingListener) listener).handleValueChanging(this);
-	}
-
-	protected Object getListenerType() {
-		return TYPE;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/ValueDiff.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/ValueDiff.java
deleted file mode 100644
index 62a2f86..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/ValueDiff.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.Diffs;
-
-/**
- * @since 1.0
- * 
- */
-public abstract class ValueDiff {
-	/**
-	 * Creates a value diff.
-	 */
-	public ValueDiff() {
-	}
-
-	/**
-	 * @return the old value
-	 */
-	public abstract Object getOldValue();
-
-	/**
-	 * @return the new value
-	 */
-	public abstract Object getNewValue();
-
-	public boolean equals(Object obj) {
-		if (obj instanceof ValueDiff) {
-			ValueDiff val = (ValueDiff) obj;
-
-			return Diffs.equals(val.getNewValue(), getNewValue())
-					&& Diffs.equals(val.getOldValue(), getOldValue());
-
-		}
-		return false;
-	}
-		
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		Object nv = getNewValue();
-		Object ov = getOldValue();
-		result = prime * result + ((nv == null) ? 0 : nv.hashCode());
-		result = prime * result + ((ov == null) ? 0 : ov.hashCode());
-		return result;
-	}
-
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer
-			.append(getClass().getName())
-			.append("{oldValue [") //$NON-NLS-1$
-			.append(getOldValue() != null ? getOldValue().toString() : "null") //$NON-NLS-1$
-			.append("], newValue [") //$NON-NLS-1$
-			.append(getNewValue() != null ? getNewValue().toString() : "null") //$NON-NLS-1$
-			.append("]}"); //$NON-NLS-1$
-		
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/WritableValue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/WritableValue.java
deleted file mode 100644
index 5d794f1..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/WritableValue.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 158687
- *     Brad Reynolds - bug 164653, 147515
- *******************************************************************************/
-
-package org.eclipse.core.databinding.observable.value;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * Mutable (writable) implementation of {@link IObservableValue} that will maintain a value and fire
- * change events when the value changes.
- * <p>
- * This class is thread safe. All state accessing methods must be invoked from
- * the {@link Realm#isCurrent() current realm}. Methods for adding and removing
- * listeners may be invoked from any thread.
- * </p>
- * @since 1.0
- */
-public class WritableValue extends AbstractObservableValue {
-
-	private final Object valueType;
-
-	/**
-	 * Constructs a new instance with the default realm, a <code>null</code>
-	 * value type, and a <code>null</code> value.
-	 */
-	public WritableValue() {
-		this(null, null);
-	}
-
-	/**
-	 * Constructs a new instance with the default realm.
-	 * 
-	 * @param initialValue
-	 *            can be <code>null</code>
-	 * @param valueType
-	 *            can be <code>null</code>
-	 */
-	public WritableValue(Object initialValue, Object valueType) {
-		this(Realm.getDefault(), initialValue, valueType);
-	}
-
-	/**
-	 * Constructs a new instance with the provided <code>realm</code>, a
-	 * <code>null</code> value type, and a <code>null</code> initial value.
-	 * 
-	 * @param realm
-	 */
-	public WritableValue(Realm realm) {
-		this(realm, null, null);
-	}
-
-	/**
-	 * Constructs a new instance.
-	 * 
-	 * @param realm
-	 * @param initialValue
-	 *            can be <code>null</code>
-	 * @param valueType
-	 *            can be <code>null</code>
-	 */
-	public WritableValue(Realm realm, Object initialValue, Object valueType) {
-		super(realm);
-		this.valueType = valueType;
-		this.value = initialValue;
-	}
-
-	private Object value = null;
-
-	public Object doGetValue() {
-		return value;
-	}
-
-	/**
-	 * @param value
-	 *            The value to set.
-	 */
-	public void doSetValue(Object value) {
-        boolean changed = false;
-
-        if (this.value == null && value != null) {
-            changed = true;
-        } else if (this.value != null && !this.value.equals(value)) {
-            changed = true;
-        }
-
-        if (changed) {
-            fireValueChange(Diffs.createValueDiff(this.value, this.value = value));
-        }
-	}
-
-	public Object getValueType() {
-		return valueType;
-	}
-
-	/**
-	 * @param elementType can be <code>null</code>
-	 * @return new instance with the default realm and a value of <code>null</code>
-	 */
-	public static WritableValue withValueType(Object elementType) {
-		return new WritableValue(Realm.getDefault(), null, elementType);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/package.html b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/package.html
deleted file mode 100644
index 4ce13df..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes that can be used to observe changes in discrete values.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that can be used to observe changes in discrete values.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/package.html b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/package.html
deleted file mode 100644
index 9087bbf..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/package.html
+++ /dev/null
@@ -1,42 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes for binding observable objects, for example UI widgets and model objects.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that can be used to synchronize state between pairs of
-observable objects with optional data type conversion and validation.
-<p>
-A <tt>DataBindingContext</tt> is used to manage a list of <tt>Bindings</tt>
-with their validation results.
-</p>
-<p>
-Concrete subclasses of <tt>Binding</tt> synchronize state between two observables,
-called the target observable and the model observable.  Usually, the binding will
-first copy the current state of the model observable to the target observable and
-from then on track changes on both sides, reacting to changes on one side by
-performing the corresponding change on the other side.
-</p>
-<p>
-For each binding, two <tt>UpdateValueStrategy</tt> or <tt>UpdateListStrategy</tt> objects (one
-for each direction) is used to control how the binding should synchronize, and can be used to
-specify data type converters and validators.  
-</p>
-<p>
-<tt>AggregateValidationStatus</tt> allows clients to aggregate the current validation
-statuses of a list of bindings, typically obtained from a data binding context.  
-</p>
-<p>
-For advanced validation, conversion, or similar requirements that affect the way
-state is copied from one side to the other, subclasses of <tt>UpdateValueStrategy</tt>
-or <tt>UpdateListStrategy</tt> can be created.  
-</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/util/ILogger.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/util/ILogger.java
deleted file mode 100644
index 652d719..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/util/ILogger.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Chris Gross (schtoo@schtoo.com) - initial API and implementation
- *       (bug 49497 [RCP] JFace dependency on org.eclipse.core.runtime enlarges standalone JFace applications)
- *******************************************************************************/
-
-package org.eclipse.core.databinding.util;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * A mechanism to log errors throughout JFace Data Binding.
- * <p>
- * Clients may provide their own implementation to change how errors are logged
- * from within JFace Data Binding.
- * </p>
- * 
- * @see Policy#getLog()
- * @see Policy#setLog(ILogger)
- * @since 1.1
- */
-public interface ILogger {
-
-	/**
-	 * Logs the given status.
-	 * 
-	 * @param status
-	 *            the status to log
-	 */
-	public void log(IStatus status);
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/util/Policy.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/util/Policy.java
deleted file mode 100644
index 41162da..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/util/Policy.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Chris Gross (schtoo@schtoo.com) - support for ILogger added
- *       (bug 49497 [RCP] JFace dependency on org.eclipse.core.runtime enlarges standalone JFace applications)
- *     Brad Reynolds - bug 164653
- *     Tom Schindl <tom.schindl@bestsolution.at> - bug 194587
- *******************************************************************************/
-package org.eclipse.core.databinding.util;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * The Policy class handles settings for behaviour, debug flags and logging
- * within JFace Data Binding.
- * 
- * @since 1.1
- */
-public class Policy {
-
-	/**
-	 * Constant for the the default setting for debug options.
-	 */
-	public static final boolean DEFAULT = false;
-
-	/**
-	 * The unique identifier of the JFace plug-in.
-	 */
-	public static final String JFACE_DATABINDING = "org.eclipse.core.databinding";//$NON-NLS-1$
-
-	private static ILogger log;
-
-	/**
-	 * Returns the dummy log to use if none has been set
-	 */
-	private static ILogger getDummyLog() {
-		return new ILogger() {
-			public void log(IStatus status) {
-				System.err.println(status.toString());
-				if( status.getException() != null ) {
-					status.getException().printStackTrace(System.err);
-				}
-			}
-		};
-	}
-
-	/**
-	 * Sets the logger used by JFace Data Binding to log errors.
-	 * 
-	 * @param logger
-	 *            the logger to use, or <code>null</code> to use the default
-	 *            logger
-	 */
-	public static synchronized void setLog(ILogger logger) {
-		log = logger;
-	}
-
-	/**
-	 * Returns the logger used by JFace Data Binding to log errors.
-	 * <p>
-	 * The default logger prints the status to <code>System.err</code>.
-	 * </p>
-	 * 
-	 * @return the logger
-	 */
-	public static synchronized ILogger getLog() {
-		if (log == null) {
-			log = getDummyLog();
-		}
-		return log;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/util/package.html b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/util/package.html
deleted file mode 100644
index 0b186a7..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/util/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides general utilities for data binding.
-<h2>
-Package Specification</h2>
-<p>
-This package provides general utilities for data binding.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/IValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/IValidator.java
deleted file mode 100644
index a9c4b8b..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/IValidator.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.databinding.validation;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * A validator. This validator is responsible for determining if a given value
- * is valid. Validators can be used on target or model values. For example, a
- * String2IntValidator would only accept source Strings that can successfully be
- * converted to an integer value, and a PositiveIntegerValidator would only
- * accept positive integers.
- * 
- * @since 1.0
- * 
- */
-public interface IValidator {
-
-	/**
-	 * Determines if the given value is valid.
-	 * 
-	 * @param value
-	 *            the value to validate
-	 * @return a status object indicating whether the validation succeeded
-	 *         {@link IStatus#isOK()} or not. Never null.
-	 */
-	public IStatus validate(Object value);
-	
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/MultiValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/MultiValidator.java
deleted file mode 100644
index 86f6d7d..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/MultiValidator.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 218269)
- *     Boris Bokowski - bug 218269
- *     Matthew Hall - bug 237884, 240590, 251003
- *     Ovidio Mallo - bug 238909
- ******************************************************************************/
-
-package org.eclipse.core.databinding.validation;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.databinding.ValidationStatusProvider;
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiffVisitor;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.internal.databinding.Util;
-import org.eclipse.core.internal.databinding.observable.ValidatedObservableList;
-import org.eclipse.core.internal.databinding.observable.ValidatedObservableMap;
-import org.eclipse.core.internal.databinding.observable.ValidatedObservableSet;
-import org.eclipse.core.internal.databinding.observable.ValidatedObservableValue;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * A validator for cross-constraints between observables.
- * 
- * <p>
- * Some practical examples of cross-constraints:
- * <ul>
- * <li>A start date cannot be later than an end date
- * <li>A list of percentages should add up to 100%
- * </ul>
- * <p>
- * Example: require two integer fields to contain either both even or both odd
- * numbers.
- * 
- * <pre>
- * DataBindingContext dbc = new DataBindingContext();
- * 
- * IObservableValue target0 = SWTObservables.observeText(text0, SWT.Modify);
- * IObservableValue target1 = SWTObservables.observeText(text1, SWT.Modify);
- * 
- * // Binding in two stages (from target to middle, then from middle to model)
- * // simplifies the validation logic.  Using the middle observables saves
- * // the trouble of converting the target values (Strings) to the model type
- * // (integers) manually during validation.
- * final IObservableValue middle0 = new WritableValue(null, Integer.TYPE);
- * final IObservableValue middle1 = new WritableValue(null, Integer.TYPE);
- * dbc.bind(target0, middle0, null, null);
- * dbc.bind(target1, middle1, null, null);
- * 
- * // Create the multi-validator
- * MultiValidator validator = new MultiValidator() {
- * 	protected IStatus validate() {
- * 		// Calculate the validation status
- * 		Integer value0 = (Integer) middle0.getValue();
- * 		Integer value1 = (Integer) middle1.getValue();
- * 		if (Math.abs(value0.intValue()) % 2 != Math.abs(value1.intValue()) % 2)
- * 			return ValidationStatus
- * 					.error(&quot;Values must be both even or both odd&quot;);
- * 		return ValidationStatus.ok();
- * 	}
- * };
- * dbc.addValidationStatusProvider(validator);
- * 
- * // Bind the middle observables to the model observables. 
- * IObservableValue model0 = new WritableValue(new Integer(2), Integer.TYPE);
- * IObservableValue model1 = new WritableValue(new Integer(4), Integer.TYPE);
- * dbc.bind(middle0, model0, null, null);
- * dbc.bind(middle1, model1, null, null);
- * </pre>
- * 
- * <p>
- * MultiValidator can also prevent invalid data from being copied to model. This
- * is done by wrapping each target observable in a validated observable, and
- * then binding the validated observable to the model.
- * 
- * <pre>
- * 
- * ...
- * 
- * // Validated observables do not change value until the validator passes. 
- * IObservableValue validated0 = validator.observeValidatedValue(middle0);
- * IObservableValue validated1 = validator.observeValidatedValue(middle1);
- * IObservableValue model0 = new WritableValue(new Integer(2), Integer.TYPE);
- * IObservableValue model1 = new WritableValue(new Integer(4), Integer.TYPE);
- * // Bind to the validated value, not the middle/target
- * dbc.bind(validated0, model0, null, null);
- * dbc.bind(validated1, model1, null, null);
- * </pre>
- * 
- * Note: No guarantee is made as to the order of updates when multiple validated
- * observables change value at once (i.e. multiple updates pending when the
- * status becomes valid). Therefore the model may be in an invalid state after
- * the first but before the last pending update.
- * 
- * @since 1.1
- */
-public abstract class MultiValidator extends ValidationStatusProvider {
-	private Realm realm;
-	private ValidationStatusObservableValue validationStatus;
-	private IObservableValue unmodifiableValidationStatus;
-	private WritableList targets;
-	private IObservableList unmodifiableTargets;
-	private IObservableList models;
-
-	IListChangeListener targetsListener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			event.diff.accept(new ListDiffVisitor() {
-				public void handleAdd(int index, Object element) {
-					IObservable dependency = (IObservable) element;
-					dependency.addChangeListener(dependencyListener);
-					dependency.addStaleListener(dependencyListener);
-				}
-
-				public void handleRemove(int index, Object element) {
-					IObservable dependency = (IObservable) element;
-					dependency.removeChangeListener(dependencyListener);
-					dependency.removeStaleListener(dependencyListener);
-				}
-			});
-		}
-	};
-
-	private class DependencyListener implements IChangeListener, IStaleListener {
-		public void handleChange(ChangeEvent event) {
-			revalidate();
-		}
-
-		public void handleStale(StaleEvent staleEvent) {
-			validationStatus.makeStale();
-		}
-	}
-
-	private DependencyListener dependencyListener = new DependencyListener();
-
-	/**
-	 * Constructs a MultiValidator on the default realm.
-	 */
-	public MultiValidator() {
-		this(Realm.getDefault());
-	}
-
-	/**
-	 * Constructs a MultiValidator on the given realm.
-	 * 
-	 * @param realm
-	 *            the realm on which validation takes place.
-	 */
-	public MultiValidator(Realm realm) {
-		Assert.isNotNull(realm, "Realm cannot be null"); //$NON-NLS-1$
-		this.realm = realm;
-
-		validationStatus = new ValidationStatusObservableValue(realm);
-
-		targets = new WritableList(realm, new ArrayList(), IObservable.class);
-		targets.addListChangeListener(targetsListener);
-		unmodifiableTargets = Observables.unmodifiableObservableList(targets);
-
-		models = Observables.emptyObservableList(realm);
-	}
-
-	private void checkObservable(IObservable target) {
-		Assert.isNotNull(target, "Target observable cannot be null"); //$NON-NLS-1$
-		Assert
-				.isTrue(realm.equals(target.getRealm()),
-						"Target observable must be in the same realm as MultiValidator"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns an {@link IObservableValue} whose value is always the current
-	 * validation status of this MultiValidator. The returned observable is in
-	 * the same realm as this MultiValidator.
-	 * 
-	 * @return an {@link IObservableValue} whose value is always the current
-	 *         validation status of this MultiValidator.
-	 */
-	public IObservableValue getValidationStatus() {
-		if (unmodifiableValidationStatus == null) {
-			revalidate();
-			unmodifiableValidationStatus = Observables
-					.unmodifiableObservableValue(validationStatus);
-		}
-		return unmodifiableValidationStatus;
-	}
-
-	private void revalidate() {
-		class ValidationRunnable implements Runnable {
-			IStatus validationResult;
-
-			public void run() {
-				try {
-					validationResult = validate();
-					if (validationResult == null)
-						validationResult = ValidationStatus.ok();
-				} catch (RuntimeException e) {
-					// Usually an NPE as dependencies are init'ed
-					validationResult = ValidationStatus
-							.error(e.getMessage(), e);
-				}
-			}
-		}
-
-		ValidationRunnable validationRunnable = new ValidationRunnable();
-		final IObservable[] dependencies = ObservableTracker.runAndMonitor(
-				validationRunnable, null, null);
-
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				List newTargets = new ArrayList(Arrays.asList(dependencies));
-
-				// This loop is roughly equivalent to:
-				// targets.retainAll(newTargets);
-				// newTargets.removeAll(targets);
-				// Except that dependencies are compared by identity instead of
-				// equality
-				outer: for (int i = targets.size() - 1; i >= 0; i--) {
-					Object oldDependency = targets.get(i);
-					for (Iterator itNew = newTargets.iterator(); itNew
-							.hasNext();) {
-						Object newDependency = itNew.next();
-						if (oldDependency == newDependency) {
-							// Dependency is already known--remove from list of
-							// new dependencies
-							itNew.remove();
-							continue outer;
-						} else if (newDependency == validationStatus
-								|| newDependency == unmodifiableValidationStatus
-								|| newDependency == targets
-								|| newDependency == unmodifiableTargets
-								|| newDependency == models) {
-							// Internal observables should not be dependencies
-							// (prevent dependency loop)
-							itNew.remove();
-						}
-					}
-					// Old dependency is no longer a dependency--remove from
-					// targets
-					targets.remove(i);
-				}
-
-				targets.addAll(newTargets);
-			}
-		});
-
-		// Once the dependencies are up-to-date, we set the new status.
-		validationStatus.setValue(validationRunnable.validationResult);
-	}
-
-	/**
-	 * Return the current validation status.
-	 * <p>
-	 * Note: To ensure that the validation status is kept current, all
-	 * dependencies used to calculate status should be accessed through
-	 * {@link IObservable} instances. Each dependency observable must be in the
-	 * same realm as the MultiValidator.
-	 * 
-	 * @return the current validation status.
-	 */
-	protected abstract IStatus validate();
-
-	/**
-	 * Returns a wrapper {@link IObservableValue} which stays in sync with the
-	 * given target observable only when the validation status is valid.
-	 * Statuses of {@link IStatus#OK OK}, {@link IStatus#INFO INFO} or
-	 * {@link IStatus#WARNING WARNING} severity are considered valid.
-	 * <p>
-	 * The wrapper behaves as follows with respect to the validation status:
-	 * <ul>
-	 * <li>While valid, the wrapper stays in sync with its target observable.
-	 * <li>While invalid, the wrapper's value is the target observable's last
-	 * valid value. If the target changes value, a stale event is fired
-	 * signaling that a change is pending.
-	 * <li>When status changes from invalid to valid, the wrapper takes the
-	 * value of the target observable, and synchronization resumes.
-	 * </ul>
-	 * 
-	 * @param target
-	 *            the target observable being wrapped. Must be in the same realm
-	 *            as the MultiValidator.
-	 * @return an IObservableValue which stays in sync with the given target
-	 *         observable only with the validation status is valid.
-	 */
-	public IObservableValue observeValidatedValue(IObservableValue target) {
-		checkObservable(target);
-		return new ValidatedObservableValue(target, getValidationStatus());
-	}
-
-	/**
-	 * Returns a wrapper {@link IObservableList} which stays in sync with the
-	 * given target observable only when the validation status is valid.
-	 * Statuses of {@link IStatus#OK OK}, {@link IStatus#INFO INFO} or
-	 * {@link IStatus#WARNING WARNING} severity are considered valid.
-	 * <p>
-	 * The wrapper behaves as follows with respect to the validation status:
-	 * <ul>
-	 * <li>While valid, the wrapper stays in sync with its target observable.
-	 * <li>While invalid, the wrapper's elements are the target observable's
-	 * last valid elements. If the target changes elements, a stale event is
-	 * fired signaling that a change is pending.
-	 * <li>When status changes from invalid to valid, the wrapper takes the
-	 * elements of the target observable, and synchronization resumes.
-	 * </ul>
-	 * 
-	 * @param target
-	 *            the target observable being wrapped. Must be in the same realm
-	 *            as the MultiValidator.
-	 * @return an IObservableValue which stays in sync with the given target
-	 *         observable only with the validation status is valid.
-	 */
-	public IObservableList observeValidatedList(IObservableList target) {
-		checkObservable(target);
-		return new ValidatedObservableList(target, getValidationStatus());
-	}
-
-	/**
-	 * Returns a wrapper {@link IObservableSet} which stays in sync with the
-	 * given target observable only when the validation status is valid.
-	 * Statuses of {@link IStatus#OK OK}, {@link IStatus#INFO INFO} or
-	 * {@link IStatus#WARNING WARNING} severity are considered valid.
-	 * <p>
-	 * The wrapper behaves as follows with respect to the validation status:
-	 * <ul>
-	 * <li>While valid, the wrapper stays in sync with its target observable.
-	 * <li>While invalid, the wrapper's elements are the target observable's
-	 * last valid elements. If the target changes elements, a stale event is
-	 * fired signaling that a change is pending.
-	 * <li>When status changes from invalid to valid, the wrapper takes the
-	 * elements of the target observable, and synchronization resumes.
-	 * </ul>
-	 * 
-	 * @param target
-	 *            the target observable being wrapped. Must be in the same realm
-	 *            as the MultiValidator.
-	 * @return an IObservableValue which stays in sync with the given target
-	 *         observable only with the validation status is valid.
-	 */
-	public IObservableSet observeValidatedSet(IObservableSet target) {
-		checkObservable(target);
-		return new ValidatedObservableSet(target, getValidationStatus());
-	}
-
-	/**
-	 * Returns a wrapper {@link IObservableMap} which stays in sync with the
-	 * given target observable only when the validation status is valid.
-	 * Statuses of {@link IStatus#OK OK}, {@link IStatus#INFO INFO} or
-	 * {@link IStatus#WARNING WARNING} severity are considered valid.
-	 * <p>
-	 * The wrapper behaves as follows with respect to the validation status:
-	 * <ul>
-	 * <li>While valid, the wrapper stays in sync with its target observable.
-	 * <li>While invalid, the wrapper's entries are the target observable's
-	 * last valid entries. If the target changes entries, a stale event is fired
-	 * signaling that a change is pending.
-	 * <li>When status changes from invalid to valid, the wrapper takes the
-	 * entries of the target observable, and synchronization resumes.
-	 * </ul>
-	 * 
-	 * @param target
-	 *            the target observable being wrapped. Must be in the same realm
-	 *            as the MultiValidator.
-	 * @return an IObservableValue which stays in sync with the given target
-	 *         observable only with the validation status is valid.
-	 */
-	public IObservableMap observeValidatedMap(IObservableMap target) {
-		checkObservable(target);
-		return new ValidatedObservableMap(target, getValidationStatus());
-	}
-
-	public IObservableList getTargets() {
-		return unmodifiableTargets;
-	}
-
-	public IObservableList getModels() {
-		return models;
-	}
-
-	public void dispose() {
-		if (targets != null) {
-			targets.clear(); // Remove listeners from dependencies
-		}
-
-		if (unmodifiableValidationStatus != null) {
-			unmodifiableValidationStatus.dispose();
-			unmodifiableValidationStatus = null;
-		}
-
-		if (validationStatus != null) {
-			validationStatus.dispose();
-			validationStatus = null;
-		}
-
-		if (unmodifiableTargets != null) {
-			unmodifiableTargets.dispose();
-			unmodifiableTargets = null;
-		}
-
-		if (targets != null) {
-			targets.dispose();
-			targets = null;
-		}
-
-		if (models != null) {
-			models.dispose();
-			models = null;
-		}
-
-		realm = null;
-
-		super.dispose();
-	}
-
-	private class ValidationStatusObservableValue extends
-			AbstractObservableValue {
-		private Object value = ValidationStatus.ok();
-
-		private boolean stale = false;
-
-		public ValidationStatusObservableValue(Realm realm) {
-			super(realm);
-		}
-
-		protected Object doGetValue() {
-			return value;
-		}
-
-		protected void doSetValue(Object value) {
-			boolean oldStale = stale;
-
-			// Update the staleness state by checking whether any of the current
-			// dependencies is stale.
-			stale = false;
-			for (Iterator iter = targets.iterator(); iter.hasNext();) {
-				IObservable dependency = (IObservable) iter.next();
-				if (dependency.isStale()) {
-					stale = true;
-					break;
-				}
-			}
-
-			Object oldValue = this.value;
-			this.value = value;
-
-			// If either becoming non-stale or setting a new value, we must fire
-			// a value change event.
-			if ((oldStale && !stale) || !Util.equals(oldValue, value)) {
-				fireValueChange(Diffs.createValueDiff(oldValue, value));
-			} else if (!oldStale && stale) {
-				fireStale();
-			}
-		}
-
-		void makeStale() {
-			if (!stale) {
-				stale = true;
-				fireStale();
-			}
-		}
-
-		public boolean isStale() {
-			ObservableTracker.getterCalled(this);
-			return stale;
-		}
-
-		public Object getValueType() {
-			return IStatus.class;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/ValidationStatus.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/ValidationStatus.java
deleted file mode 100644
index d61cb19..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/ValidationStatus.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164134
- *******************************************************************************/
-package org.eclipse.core.databinding.validation;
-
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * Convenience class for creating status objects.
- * 
- * @since 3.3
- * 
- */
-public class ValidationStatus extends Status {
-
-	/**
-	 * Creates a new validation status with the given severity, message, and
-	 * exception.
-	 * 
-	 * @param severity
-	 * @param message
-	 * @param exception
-	 */
-	private ValidationStatus(int severity, String message, Throwable exception) {
-		super(severity, Policy.JFACE_DATABINDING, IStatus.OK, message, exception);
-	}
-
-	/**
-	 * Creates a new validation status with the given severity and message.
-	 * 
-	 * @param severity
-	 * @param message
-	 */
-	private ValidationStatus(int severity, String message) {
-		super(severity, Policy.JFACE_DATABINDING,IStatus.OK, message, null);
-	}
-
-	/**
-	 * Creates a new validation error status with the given message.
-	 * 
-	 * @param message
-	 * @return a new error status with the given message
-	 */
-	public static IStatus error(String message) {
-		return new ValidationStatus(IStatus.ERROR, message);
-	}
-
-	/**
-	 * Creates a new validation cancel status with the given message.
-	 * 
-	 * @param message
-	 * @return a new cancel status with the given message
-	 */
-	public static IStatus cancel(String message) {
-		return new ValidationStatus(IStatus.CANCEL, message);
-	}
-	
-	/**
-	 * Creates a new validation error status with the given message and
-	 * exception.
-	 * 
-	 * @param message
-	 * @param exception
-	 * @return a new error status with the given message and exception
-	 */
-	public static IStatus error(String message, Throwable exception) {
-		return new ValidationStatus(IStatus.ERROR, message, exception);
-	}
-
-	/**
-	 * Creates a new validation warning status with the given message.
-	 * 
-	 * @param message
-	 * @return a new warning status with the given message
-	 */
-	public static IStatus warning(String message) {
-		return new ValidationStatus(IStatus.WARNING, message);
-	}
-	
-	/**
-	 * Creates a new validation info status with the given message.
-	 * 
-	 * @param message
-	 * @return a new info status with the given message
-	 */
-	public static IStatus info(String message) {
-		return new ValidationStatus(IStatus.INFO, message);
-	}
-	
-	/**
-	 * Returns an OK status.
-	 * 
-	 * @return an ok status
-	 */
-	public static IStatus ok() {
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-
-		String message = getMessage();
-		int severity = getSeverity();
-		Throwable throwable = getException();
-
-		result = prime * result + ((message == null) ? 0 : message.hashCode());
-		result = prime * result + severity;
-		result = prime * result
-				+ ((throwable == null) ? 0 : throwable.hashCode());
-		return result;
-	}
-
-	/**
-	 * Equality is based upon instance equality rather than identity.
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		final ValidationStatus other = (ValidationStatus) obj;
-
-		if (getSeverity() != other.getSeverity())
-			return false;
-		if (getMessage() == null) {
-			if (other.getMessage() != null)
-				return false;
-		} else if (!getMessage().equals(other.getMessage()))
-			return false;
-		if (getException() == null) {
-			if (other.getException() != null)
-				return false;
-		} else if (!getException().equals(other.getException()))
-			return false;
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/package.html b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/package.html
deleted file mode 100644
index 3d98b2e..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/databinding/validation/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides the core APIs for validation.
-<h2>
-Package Specification</h2>
-<p>
-This package provides the core APIs for validation.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/Activator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/Activator.java
deleted file mode 100644
index 29db910..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/Activator.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.databinding.util.ILogger;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.osgi.framework.log.FrameworkLog;
-import org.eclipse.osgi.framework.log.FrameworkLogEntry;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.util.tracker.ServiceTracker;
-
-/**
- * @since 3.3
- * 
- */
-public class Activator implements BundleActivator {
-	/**
-	 * The plug-in ID
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.core.databinding"; //$NON-NLS-1$
-
-	private volatile static ServiceTracker _frameworkLogTracker;
-
-	/**
-	 * The constructor
-	 */
-	public Activator() {
-	}
-
-	public void start(BundleContext context) throws Exception {
-		_frameworkLogTracker = new ServiceTracker(context, FrameworkLog.class.getName(), null);
-		_frameworkLogTracker.open();
-
-		Policy.setLog(new ILogger() {
-
-			public void log(IStatus status) {
-				ServiceTracker frameworkLogTracker = _frameworkLogTracker;
-				FrameworkLog log = frameworkLogTracker == null ? null : (FrameworkLog) frameworkLogTracker.getService();
-				if (log != null) {
-					log.log(createLogEntry(status));
-				} else {
-					// fall back to System.err
-					System.err.println(status.getPlugin() + " - " + status.getCode() + " - " + status.getMessage());  //$NON-NLS-1$//$NON-NLS-2$
-					if( status.getException() != null ) {
-						status.getException().printStackTrace(System.err);
-					}
-				}
-			}
-
-		});
-	}
-	
-	// Code copied from PlatformLogWriter.getLog(). Why is logging an IStatus so
-	// hard?
-	FrameworkLogEntry createLogEntry(IStatus status) {
-		Throwable t = status.getException();
-		ArrayList childlist = new ArrayList();
-
-		int stackCode = t instanceof CoreException ? 1 : 0;
-		// ensure a substatus inside a CoreException is properly logged 
-		if (stackCode == 1) {
-			IStatus coreStatus = ((CoreException) t).getStatus();
-			if (coreStatus != null) {
-				childlist.add(createLogEntry(coreStatus));
-			}
-		}
-
-		if (status.isMultiStatus()) {
-			IStatus[] children = status.getChildren();
-			for (int i = 0; i < children.length; i++) {
-				childlist.add(createLogEntry(children[i]));
-			}
-		}
-
-		FrameworkLogEntry[] children = (FrameworkLogEntry[]) (childlist.size() == 0 ? null : childlist.toArray(new FrameworkLogEntry[childlist.size()]));
-
-		return new FrameworkLogEntry(status.getPlugin(), status.getSeverity(), status.getCode(), status.getMessage(), stackCode, t, children);
-	}
-
-	
-	public void stop(BundleContext context) throws Exception {
-		if (_frameworkLogTracker != null) {
-			_frameworkLogTracker.close();
-			_frameworkLogTracker = null;
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/BindingMessages.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/BindingMessages.java
deleted file mode 100644
index 3e93df2..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/BindingMessages.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl<tom.schindl@bestsolution.at> - bugfix for 217940
- *******************************************************************************/
-package org.eclipse.core.internal.databinding;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * @since 1.0
- *
- */
-public class BindingMessages {
-
-	/**
-	 * The Binding resource bundle; eagerly initialized.
-	 */
-	private static final ResourceBundle bundle = ResourceBundle
-			.getBundle("org.eclipse.core.internal.databinding.messages"); //$NON-NLS-1$
-
-	/**
-	 * Key to be used for an index out of range message.
-	 */
-	public static final String INDEX_OUT_OF_RANGE = "IndexOutOfRange"; //$NON-NLS-1$
-
-	/**
-	 * Key to be used for a "Multiple Problems." message.
-	 */
-	public static final String MULTIPLE_PROBLEMS = "MultipleProblems"; //$NON-NLS-1$
-
-	/**
-	 * Key to be used for a "ValueBinding_ErrorWhileSettingValue" message
-	 */
-	public static final String VALUEBINDING_ERROR_WHILE_SETTING_VALUE = "ValueBinding_ErrorWhileSettingValue"; //$NON-NLS-1$
-
-	/**
-	 * Key to be used for a "DateFormat_DateTime" message
-	 */
-	public static final String DATE_FORMAT_DATE_TIME = "DateFormat_DateTime"; //$NON-NLS-1$
-
-	/**
-	 * Key to be used for a "DateFormat_Time" message
-	 */
-	public static final String DATEFORMAT_TIME = "DateFormat_Time"; //$NON-NLS-1$
-
-	/**
-	 * Key to be used for a "ValueDelimiter" message
-	 */
-	public static final String VALUE_DELIMITER = "ValueDelimiter"; //$NON-NLS-1$
-
-	/**
-	 * Key to be used for a "TrueStringValues" message
-	 */
-	public static final String TRUE_STRING_VALUES = "TrueStringValues"; //$NON-NLS-1$
-
-	/**
-	 * Key to be used for a "FalseStringValues" message
-	 */
-	public static final String FALSE_STRING_VALUES = "FalseStringValues"; //$NON-NLS-1$
-
-	/**
-	 * Key to be used for a "Validate_NumberOutOfRangeError" message
-	 */
-	public static final String VALIDATE_NUMBER_OUT_OF_RANGE_ERROR = "Validate_NumberOutOfRangeError"; //$NON-NLS-1$
-
-	/**
-	 * Key to be used for a "Validate_NumberParseError" message
-	 */
-	public static final String VALIDATE_NUMBER_PARSE_ERROR = "Validate_NumberParseError"; //$NON-NLS-1$
-
-	/**
-	 * Key to be used for a "Validate_ConversionToPrimitive" message
-	 */
-	public static final String VALIDATE_CONVERSION_TO_PRIMITIVE = "Validate_ConversionToPrimitive"; //$NON-NLS-1$
-
-	/**
-	 * Key to be used for a "Validate_ConversionFromClassToPrimitive" message
-	 */
-	public static final String VALIDATE_CONVERSION_FROM_CLASS_TO_PRIMITIVE = "Validate_ConversionFromClassToPrimitive"; //$NON-NLS-1$
-
-	/**
-	 * Key to be used for a "Validate_NoChangeAllowedHelp" message
-	 */
-	public static final String VALIDATE_NO_CHANGE_ALLOWED_HELP = "Validate_NoChangeAllowedHelp"; //$NON-NLS-1$
-
-	/**
-	 * Key to be used for a "Validate_CharacterHelp" message
-	 */
-	public static final String VALIDATE_CHARACTER_HELP = "Validate_CharacterHelp"; //$NON-NLS-1$
-
-	/**
-	 * Key to be used for a "Examples" message
-	 */
-	public static final String EXAMPLES = "Examples"; //$NON-NLS-1$
-
-	/**
-	 * Key to be used for a "Validate_NumberParseErrorNoCharacter" message
-	 */
-	public static final String VALIDATE_NUMBER_PARSE_ERROR_NO_CHARACTER = "Validate_NumberParseErrorNoCharacter"; //$NON-NLS-1$
-
-	/**
-	 * Returns the resource object with the given key in the resource bundle for
-	 * JFace Data Binding. If there isn't any value under the given key, the key
-	 * is returned.
-	 *
-	 * @param key
-	 *            the resource name
-	 * @return the string
-	 */
-	public static String getString(String key) {
-		try {
-			return bundle.getString(key);
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns a formatted string with the given key in the resource bundle for
-	 * JFace Data Binding.
-	 *
-	 * @param key
-	 * @param arguments
-	 * @return formatted string, the key if the key is invalid
-	 */
-	public static String formatString(String key, Object[] arguments) {
-		try {
-			return MessageFormat.format(bundle.getString(key), arguments);
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/BindingStatus.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/BindingStatus.java
deleted file mode 100644
index 025b82c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/BindingStatus.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding;
-
-import java.util.Arrays;
-
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-
-/**
- * A <code>MultiStatus</code> implementation that copies that state of the
- * added status to this instance if it is >= the current severity.
- * 
- * @since 1.0
- */
-public class BindingStatus extends MultiStatus {
-	/**
-	 * Constructs a new instance.
-	 * 
-	 * @param pluginId
-	 * @param code
-	 * @param message
-	 * @param exception
-	 */
-	public BindingStatus(String pluginId, int code, String message,
-			Throwable exception) {
-		super(pluginId, code, message, exception);
-	}
-
-	/**
-	 * Adds the status to the multi status. The details of the status will be
-	 * copied to the multi status if the severity is >= the current severity.
-	 * 
-	 * @see org.eclipse.core.runtime.MultiStatus#add(org.eclipse.core.runtime.IStatus)
-	 */
-	public void add(IStatus status) {
-		if (status.getSeverity() >= getSeverity()) {
-			setMessage((status.getMessage() != null) ? status.getMessage() : ""); //$NON-NLS-1$
-			setException(status.getException());
-			setPlugin(status.getPlugin());
-			setCode(status.getCode());
-		}
-
-		super.add(status);
-	}
-
-	/**
-	 * Instance initialized with the following values:
-	 * <ul>
-	 * <li>plugin = Policy.JFACE_DATABINDING</li>
-	 * <li>severity = 0</li>
-	 * <li>code = 0</li>
-	 * <li>message = ""</li>
-	 * <li>exception = null</li>
-	 * </ul>
-	 * 
-	 * @return status
-	 */
-	public static BindingStatus ok() {
-		return new BindingStatus(Policy.JFACE_DATABINDING, 0, "", null); //$NON-NLS-1$
-	}
-	
-	private static int hashCode(Object[] array) {
-		final int prime = 31;
-		if (array == null)
-			return 0;
-		int result = 1;
-		for (int index = 0; index < array.length; index++) {
-			result = prime * result
-					+ (array[index] == null ? 0 : array[index].hashCode());
-		}
-		return result;
-	}
-	
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + BindingStatus.hashCode(getChildren());
-		return result;
-	}
-
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		final BindingStatus other = (BindingStatus) obj;
-		if (!Arrays.equals(getChildren(), other.getChildren()))
-			return false;
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/ClassLookupSupport.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/ClassLookupSupport.java
deleted file mode 100644
index 7b3e04a..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/ClassLookupSupport.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @since 1.0
- *
- */
-public class ClassLookupSupport {
-	
-	/*
-	 * code copied from AdapterManager.java
-	 */
-	private static HashMap classSearchOrderLookup;
-
-	/**
-	 * For a given class or interface, return an array containing the given type and all its direct and indirect supertypes.
-	 * @param type
-	 * @return an array containing the given type and all its direct and indirect supertypes
-	 */
-	public static Class[] getTypeHierarchyFlattened(Class type) {
-		List classes = null;
-		//cache reference to lookup to protect against concurrent flush
-		HashMap lookup = classSearchOrderLookup;
-		if (lookup != null)
-			classes = (List) lookup.get(type);
-		// compute class order only if it hasn't been cached before
-		if (classes == null) {
-			classes = new ArrayList();
-			computeClassOrder(type, classes);
-			if (lookup == null)
-				classSearchOrderLookup = lookup = new HashMap();
-			lookup.put(type, classes);
-		}
-		return (Class[]) classes.toArray(new Class[classes.size()]);
-	}
-
-	/**
-	 * Builds and returns a table of adapters for the given adaptable type.
-	 * The table is keyed by adapter class name. The
-	 * value is the <b>sole<b> factory that defines that adapter. Note that
-	 * if multiple adapters technically define the same property, only the
-	 * first found in the search order is considered.
-	 * 
-	 * Note that it is important to maintain a consistent class and interface
-	 * lookup order. See the class comment for more details.
-	 */
-	private static void computeClassOrder(Class adaptable, Collection classes) {
-		Class clazz = adaptable;
-		Set seen = new HashSet(4);
-		while (clazz != null) {
-			classes.add(clazz);
-			computeInterfaceOrder(clazz.getInterfaces(), classes, seen);
-			clazz = clazz.isInterface() ? Object.class : clazz.getSuperclass();
-		}
-	}
-
-	private static void computeInterfaceOrder(Class[] interfaces, Collection classes, Set seen) {
-		List newInterfaces = new ArrayList(interfaces.length);
-		for (int i = 0; i < interfaces.length; i++) {
-			Class interfac = interfaces[i];
-			if (seen.add(interfac)) {
-				//note we cannot recurse here without changing the resulting interface order
-				classes.add(interfac);
-				newInterfaces.add(interfac);
-			}
-		}
-		for (Iterator it = newInterfaces.iterator(); it.hasNext();)
-			computeInterfaceOrder(((Class) it.next()).getInterfaces(), classes, seen);
-	}
-
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/IdentityWrapper.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/IdentityWrapper.java
deleted file mode 100644
index 978c996..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/IdentityWrapper.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Daniel Kruegler - bug 137435
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding;
-
-/**
- * Used for wrapping objects that define their own implementations of equals()
- * and hashCode() when putting them in sets or hashmaps to ensure identity
- * comparison.
- * 
- * @since 1.0
- * 
- */
-public class IdentityWrapper {
-	final Object o;
-
-	/**
-	 * @param o
-	 */
-	public IdentityWrapper(Object o) {
-		this.o = o;
-	}
-	
-	/**
-	 * @return the unwrapped object
-	 */
-	public Object unwrap() {
-		return o;
-	}
-
-	public boolean equals(Object obj) {
-		if (obj == null || obj.getClass() != IdentityWrapper.class) {
-			return false;
-		}
-		return o == ((IdentityWrapper) obj).o;
-	}
-
-	public int hashCode() {
-		return System.identityHashCode(o);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/Pair.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/Pair.java
deleted file mode 100644
index aebed88..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/Pair.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.databinding;
-
-/**
- * Class Pair.  Represents a mathematical pair of objects (a, b).
- * @since 1.0
- */
-public class Pair {
-
-	/**
-	 * a in the pair (a, b)
-	 */
-	public final Object a;
-
-	/**
-	 * b in the pair (a, b)
-	 */
-	public final Object b;
-
-	/**
-	 * Construct a Pair(a, b)
-	 * 
-	 * @param a a in the pair (a, b)
-	 * @param b b in the pair (a, b)
-	 */
-	public Pair(Object a, Object b) {
-		this.a = a;
-		this.b = b;
-	}
-
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((a == null) ? 0 : a.hashCode());
-		result = prime * result + ((b == null) ? 0 : b.hashCode());
-		return result;
-	}
-
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		Pair other = (Pair) obj;
-		if (a == null) {
-			if (other.a != null)
-				return false;
-		} else if (!a.equals(other.a))
-			return false;
-		if (b == null) {
-			if (other.b != null)
-				return false;
-		} else if (!b.equals(other.b))
-			return false;
-		return true;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/Queue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/Queue.java
deleted file mode 100644
index cb4a507..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/Queue.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.databinding;
-
-/**
- * Created to avoid a dependency on java.util.LinkedList, see bug 205224.
- * 
- * @since 1.1
- * 
- */
-public class Queue {
-
-	static class Entry {
-		Object object;
-
-		Entry(Object o) {
-			this.object = o;
-		}
-
-		Entry next;
-	}
-
-	Entry first;
-	Entry last;
-
-	/**
-	 * Adds the given object to the end of the queue.
-	 * 
-	 * @param o
-	 */
-	public void enqueue(Object o) {
-		Entry oldLast = last;
-		last = new Entry(o);
-		if (oldLast != null) {
-			oldLast.next = last;
-		} else {
-			first = last;
-		}
-	}
-
-	/**
-	 * Returns the first object in the queue. The queue must not be empty.
-	 * 
-	 * @return the first object
-	 */
-	public Object dequeue() {
-		Entry oldFirst = first;
-		if (oldFirst == null) {
-			throw new IllegalStateException();
-		}
-		first = oldFirst.next;
-		if (first == null) {
-			last = null;
-		}
-		oldFirst.next = null;
-		return oldFirst.object;
-	}
-
-	/**
-	 * Returns <code>true</code> if the list is empty.
-	 * 
-	 * @return <code>true</code> if the list is empty
-	 */
-	public boolean isEmpty() {
-		return first == null;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/RandomAccessListIterator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/RandomAccessListIterator.java
deleted file mode 100644
index 8a560ad..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/RandomAccessListIterator.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     The Pampered Chef - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding;
-
-import java.util.List;
-import java.util.ListIterator;
-
-/**
- * Class RandomAccessListIterator.  A ListIterator implementation that also
- * provides access to individual elements based on the element's index.
- * 
- * @since 3.3
- */
-public class RandomAccessListIterator implements ListIterator {
-	private ListIterator delegate = null;
-
-	/**
-	 * @param iterator
-	 */
-	public RandomAccessListIterator(ListIterator iterator) {
-		this.delegate = iterator;
-	}
-
-	/**
-	 * @param list 
-	 */
-	public RandomAccessListIterator(List list) {
-		if (list == null) {
-			throw new IllegalArgumentException("list is null"); //$NON-NLS-1$
-		}
-		this.delegate = list.listIterator();
-	}
-
-	/* (non-Javadoc)
-	 * @see java.util.ListIterator#add(java.lang.Object)
-	 */
-	public void add(Object arg0) {
-		delegate.add(arg0);
-	}
-
-	/* (non-Javadoc)
-	 * @see java.util.ListIterator#hasNext()
-	 */
-	public boolean hasNext() {
-		return delegate.hasNext();
-	}
-
-	/* (non-Javadoc)
-	 * @see java.util.ListIterator#hasPrevious()
-	 */
-	public boolean hasPrevious() {
-		return delegate.hasPrevious();
-	}
-
-	/* (non-Javadoc)
-	 * @see java.util.ListIterator#next()
-	 */
-	public Object next() {
-		return delegate.next();
-	}
-
-	/* (non-Javadoc)
-	 * @see java.util.ListIterator#nextIndex()
-	 */
-	public int nextIndex() {
-		return delegate.nextIndex();
-	}
-
-	/* (non-Javadoc)
-	 * @see java.util.ListIterator#previous()
-	 */
-	public Object previous() {
-		return delegate.previous();
-	}
-
-	/* (non-Javadoc)
-	 * @see java.util.ListIterator#previousIndex()
-	 */
-	public int previousIndex() {
-		return delegate.previousIndex();
-	}
-
-	/* (non-Javadoc)
-	 * @see java.util.ListIterator#remove()
-	 */
-	public void remove() {
-		delegate.remove();
-	}
-
-	/* (non-Javadoc)
-	 * @see java.util.ListIterator#set(java.lang.Object)
-	 */
-	public void set(Object arg0) {
-		delegate.set(arg0);
-	}
-	
-	/**
-	 * Return the element at the specified position by moving the iterator
-	 * forward or backward in the list until it reaches the correct element.
-	 * The iterator's position after returning the element will be one after
-	 * the element returned.
-	 * 
-	 * @param index The (0-based) index of the element to return.
-	 * @return the Object at index
-	 */
-	public Object get(int index) {
-		if (delegate.nextIndex() == 0 && !delegate.hasNext()) {
-			throw new IndexOutOfBoundsException("Request for element from empty list"); //$NON-NLS-1$
-		}
-		if (index < 0) {
-			throw new IndexOutOfBoundsException("Request for negative element index"); //$NON-NLS-1$
-		}
-		
-		while (nextIndex() < index && hasNext()) {
-			next();
-		}
-		while (previousIndex() > index-1) {
-			previous();
-		}
-		if (!hasNext()) {
-			throw new IndexOutOfBoundsException("Request for element past end of list"); //$NON-NLS-1$
-		}
-		return next();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/Util.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/Util.java
deleted file mode 100644
index d027177..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/Util.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding;
-
-/**
- * @since 3.3
- * 
- */
-public class Util {
-
-	/**
-	 * Checks whether the two objects are <code>null</code> -- allowing for
-	 * <code>null</code>.
-	 * 
-	 * @param left
-	 *            The left object to compare; may be <code>null</code>.
-	 * @param right
-	 *            The right object to compare; may be <code>null</code>.
-	 * @return <code>true</code> if the two objects are equivalent;
-	 *         <code>false</code> otherwise.
-	 */
-	public static final boolean equals(final Object left, final Object right) {
-		return left == null ? right == null : ((right != null) && left
-				.equals(right));
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/ValidationStatusMap.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/ValidationStatusMap.java
deleted file mode 100644
index 8c0e4be..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/ValidationStatusMap.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 226289
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.Binding;
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.map.MapDiff;
-import org.eclipse.core.databinding.observable.map.ObservableMap;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * @since 1.0
- * 
- */
-public class ValidationStatusMap extends ObservableMap {
-
-	private boolean isDirty = true;
-
-	private final WritableList bindings;
-
-	private List dependencies = new ArrayList();
-
-	private IChangeListener markDirtyChangeListener = new IChangeListener() {
-		public void handleChange(ChangeEvent event) {
-			markDirty();
-		}
-	};
-
-	/**
-	 * @param realm
-	 * @param bindings
-	 */
-	public ValidationStatusMap(Realm realm, WritableList bindings) {
-		super(realm, new HashMap());
-		this.bindings = bindings;
-		bindings.addChangeListener(markDirtyChangeListener);
-	}
-
-	public Object getKeyType() {
-		return Binding.class;
-	}
-
-	public Object getValueType() {
-		return IStatus.class;
-	}
-
-	protected void getterCalled() {
-		recompute();
-		super.getterCalled();
-	}
-
-	private void markDirty() {
-		// since we are dirty, we don't need to listen anymore
-		removeElementChangeListener();
-		final Map oldMap = wrappedMap;
-		// lazy computation of diff
-		MapDiff mapDiff = new MapDiff() {
-			private MapDiff cachedDiff = null;
-
-			private void ensureCached() {
-				if (cachedDiff == null) {
-					recompute();
-					cachedDiff = Diffs.computeMapDiff(oldMap, wrappedMap);
-				}
-			}
-
-			public Set getAddedKeys() {
-				ensureCached();
-				return cachedDiff.getAddedKeys();
-			}
-
-			public Set getChangedKeys() {
-				ensureCached();
-				return cachedDiff.getChangedKeys();
-			}
-
-			public Object getNewValue(Object key) {
-				ensureCached();
-				return cachedDiff.getNewValue(key);
-			}
-
-			public Object getOldValue(Object key) {
-				ensureCached();
-				return cachedDiff.getOldValue(key);
-			}
-
-			public Set getRemovedKeys() {
-				ensureCached();
-				return cachedDiff.getRemovedKeys();
-			}
-		};
-		wrappedMap = new HashMap();
-		isDirty = true;
-		fireMapChange(mapDiff);
-	}
-
-	private void recompute() {
-		if (isDirty) {
-			Map newContents = new HashMap();
-			for (Iterator it = bindings.iterator(); it.hasNext();) {
-				Binding binding = (Binding) it.next();
-				IObservableValue validationError = binding
-						.getValidationStatus();
-				dependencies.add(validationError);
-				validationError.addChangeListener(markDirtyChangeListener);
-				IStatus validationStatusValue = (IStatus) validationError
-						.getValue();
-				newContents.put(binding, validationStatusValue);
-			}
-			wrappedMap.putAll(newContents);
-			isDirty = false;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.databinding.observable.list.ObservableList#dispose()
-	 */
-	public synchronized void dispose() {
-		bindings.removeChangeListener(markDirtyChangeListener);
-		removeElementChangeListener();
-		super.dispose();
-	}
-
-	private void removeElementChangeListener() {
-		for (Iterator it = dependencies.iterator(); it.hasNext();) {
-			IObservableValue observableValue = (IObservableValue) it.next();
-			observableValue.removeChangeListener(markDirtyChangeListener);
-		}
-	}
-	
-	public synchronized void addChangeListener(IChangeListener listener) {
-		// this ensures that the next change will be seen by the new listener.
-		recompute();
-		super.addChangeListener(listener);
-	}
-	
-	public synchronized void addMapChangeListener(IMapChangeListener listener) {
-		// this ensures that the next change will be seen by the new listener.
-		recompute();
-		super.addMapChangeListener(listener);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/CharacterToStringConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/CharacterToStringConverter.java
deleted file mode 100644
index e81091e..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/CharacterToStringConverter.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matt Carter and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matt Carter - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.conversion;
-
-import org.eclipse.core.databinding.conversion.Converter;
-
-/**
- * Converts a character to a string.
- */
-public class CharacterToStringConverter extends Converter {
-	private final boolean primitive;
-
-	/**
-	 * @param primitive
-	 */
-	private CharacterToStringConverter(boolean primitive) {
-		super(primitive ? Character.TYPE : Character.class, String.class);
-		this.primitive = primitive;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.databinding.conversion.IConverter#convert(java.lang.Object)
-	 */
-	public Object convert(Object fromObject) {
-		// Null is allowed when the type is not primitive.
-		if (fromObject == null) {
-			if (primitive)
-				throw new IllegalArgumentException(
-						"'fromObject' is null. Cannot convert to primitive char."); //$NON-NLS-1$
-			return ""; //$NON-NLS-1$
-		}
-
-		if (!(fromObject instanceof Character)) {
-			throw new IllegalArgumentException(
-					"'fromObject' is not of type [Character]."); //$NON-NLS-1$
-		}
-
-		return String.valueOf(((Character) fromObject).charValue());
-	}
-
-	/**
-	 * @param primitive
-	 * @return converter
-	 */
-	public static CharacterToStringConverter fromCharacter(boolean primitive) {
-		return new CharacterToStringConverter(primitive);
-	}
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/DateConversionSupport.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/DateConversionSupport.java
deleted file mode 100755
index 0fd191f..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/DateConversionSupport.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2005 db4objects Inc.  http://www.db4o.com
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     db4objects - Initial API and implementation
- *     Tom Schindl<tom.schindl@bestsolution.at> - bugfix for 217940
- */
-package org.eclipse.core.internal.databinding.conversion;
-
-import java.text.ParsePosition;
-import java.util.Date;
-
-import org.eclipse.core.internal.databinding.BindingMessages;
-
-import com.ibm.icu.text.DateFormat;
-import com.ibm.icu.text.SimpleDateFormat;
-
-/**
- * Base support for date/string conversion handling according to the default
- * locale or in plain long milliseconds.
- * <p>
- * NOTE: parse(format(date)) will generally *not* be equal to date, since the
- * string representation may not cover the sub-second range, time-only string
- * representations will be counted from the beginning of the era, etc.
- * </p>
- */
-public abstract class DateConversionSupport {
-	private final static int DATE_FORMAT=DateFormat.SHORT;
-	private final static int DEFAULT_FORMATTER_INDEX=0;
-
-	private final static int NUM_VIRTUAL_FORMATTERS=1;
-
-	/**
-	 * Alternative formatters for date, time and date/time.
-	 * Raw milliseconds are covered as a special case.
-	 */
-	// TODO: These could be shared, but would have to be synchronized.
-	private DateFormat[] formatters = {
-			new SimpleDateFormat(BindingMessages.getString(BindingMessages.DATE_FORMAT_DATE_TIME)),
-			new SimpleDateFormat(BindingMessages.getString(BindingMessages.DATEFORMAT_TIME)),
-			DateFormat.getDateTimeInstance(DATE_FORMAT, DateFormat.SHORT),
-			DateFormat.getDateInstance(DATE_FORMAT),
-			DateFormat.getTimeInstance(DateFormat.SHORT),
-            DateFormat.getDateTimeInstance(DATE_FORMAT,DateFormat.MEDIUM),
-            DateFormat.getTimeInstance(DateFormat.MEDIUM)
-	};
-
-	/**
-	 * Tries all available formatters to parse the given string according to the
-	 * default locale or as a raw millisecond value and returns the result of the
-	 * first successful run.
-	 *
-	 * @param str A string specifying a date according to the default locale or in raw milliseconds
-	 * @return The parsed date, or null, if no available formatter could interpret the input string
-	 */
-	protected Date parse(String str) {
-		for (int formatterIdx = 0; formatterIdx < formatters.length; formatterIdx++) {
-			Date parsed=parse(str,formatterIdx);
-			if(parsed!=null) {
-				return parsed;
-			}
-		}
-		return null;
-	}
-
-	protected Date parse(String str,int formatterIdx) {
-		if(formatterIdx>=0) {
-				ParsePosition pos=new ParsePosition(0);
-				if (str == null) {
-					return null;
-				}
-				Date date=formatters[formatterIdx].parse(str,pos);
-				if(pos.getErrorIndex()!=-1||pos.getIndex()!=str.length()) {
-					return null;
-				}
-				return date;
-		}
-		try {
-			long millisecs=Long.parseLong(str);
-			return new Date(millisecs);
-		}
-		catch(NumberFormatException exc) {
-		}
-		return null;
-	}
-
-	/**
-	 * Formats the given date with the default formatter according to the default locale.
-	 * @param date a date
-	 * @return a string representation of the given date according to the default locale
-	 */
-	protected String format(Date date) {
-		return format(date,DEFAULT_FORMATTER_INDEX);
-	}
-
-	protected String format(Date date,int formatterIdx) {
-		if(formatterIdx>=0) {
-			return formatters[formatterIdx].format(date);
-		}
-		return String.valueOf(date.getTime());
-	}
-
-	protected int numFormatters() {
-		return formatters.length+NUM_VIRTUAL_FORMATTERS;
-	}
-
-	/**
-	 * Returns the date format for the provided <code>index</code>.
-	 * <p>
-	 * This is for testing purposes only and should not be a part of the API if
-	 * this class was to be exposed.
-	 * </p>
-	 *
-	 * @param index
-	 * @return date format
-	 */
-	protected DateFormat getDateFormat(int index) {
-		if (index < 0 || index >= formatters.length) {
-			throw new IllegalArgumentException("'index' [" + index + "] is out of bounds.");  //$NON-NLS-1$//$NON-NLS-2$
-		}
-
-		return formatters[index];
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/DateToStringConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/DateToStringConverter.java
deleted file mode 100755
index 95a3e29..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/DateToStringConverter.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2005 db4objects Inc.  http://www.db4o.com
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     db4objects - Initial API and implementation
- */
-package org.eclipse.core.internal.databinding.conversion;
-
-import java.util.Date;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-
-
-/**
- * Converts a Java.util.Date to a String using the current locale.  Null date
- * values are converted to an empty string.
- * 
- * @since 1.0
- */
-public class DateToStringConverter extends DateConversionSupport implements IConverter {	
-	public Object convert(Object source) {
-		if (source != null)
-			return format((Date)source);
-		return ""; //$NON-NLS-1$
-	}
-
-	public Object getFromType() {
-		return Date.class;
-	}
-
-	public Object getToType() {
-		return String.class;
-	}	
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/IdentityConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/IdentityConverter.java
deleted file mode 100644
index 928aaba..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/IdentityConverter.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2005 db4objects Inc.  http://www.db4o.com  and others.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     db4objects - Initial API and implementation
- *     Matt Carter - Character support completed (bug 197679)
- */
-package org.eclipse.core.internal.databinding.conversion;
-
-import org.eclipse.core.databinding.BindingException;
-import org.eclipse.core.databinding.conversion.IConverter;
-
-/**
- * TheIdentityConverter. Returns the source value (the identity function).
- */
-public class IdentityConverter implements IConverter {
-
-	private Class fromType;
-
-	private Class toType;
-
-	/**
-	 * @param type
-	 */
-	public IdentityConverter(Class type) {
-		this.fromType = type;
-		this.toType = type;
-	}
-
-	/**
-	 * @param fromType
-	 * @param toType
-	 */
-	public IdentityConverter(Class fromType, Class toType) {
-		this.fromType = fromType;
-		this.toType = toType;
-	}
-
-	private Class[][] primitiveMap = new Class[][] {
-			{ Integer.TYPE, Integer.class }, { Short.TYPE, Short.class },
-			{ Long.TYPE, Long.class }, { Double.TYPE, Double.class },
-			{ Byte.TYPE, Byte.class }, { Float.TYPE, Float.class },
-			{ Boolean.TYPE, Boolean.class },
-			{ Character.TYPE, Character.class } };
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.binding.converter.IConverter#convert(java.lang.Object)
-	 */
-	public Object convert(Object source) {
-		if (toType.isPrimitive()) {
-			if (source == null) {
-				throw new BindingException("Cannot convert null to a primitive"); //$NON-NLS-1$
-			}
-		}
-		if (source != null) {
-			Class sourceClass = source.getClass();
-			if (toType.isPrimitive() || sourceClass.isPrimitive()) {
-				if (sourceClass.equals(toType)
-						|| isPrimitiveTypeMatchedWithBoxed(sourceClass, toType)) {
-					return source;
-				}
-				throw new BindingException(
-						"Boxed and unboxed types do not match"); //$NON-NLS-1$
-			}
-			if (!toType.isAssignableFrom(sourceClass)) {
-				throw new BindingException(sourceClass.getName()
-						+ " is not assignable to " + toType.getName()); //$NON-NLS-1$
-			}
-		}
-		return source;
-	}
-
-	/**
-	 * (Non-API) isPrimitiveTypeMatchedWithBoxed.
-	 * 
-	 * @param sourceClass
-	 * @param toClass
-	 * @return true if sourceClass and toType are matched primitive/boxed types
-	 */
-	public boolean isPrimitiveTypeMatchedWithBoxed(Class sourceClass,
-			Class toClass) {
-		for (int i = 0; i < primitiveMap.length; i++) {
-			if (toClass.equals(primitiveMap[i][0])
-					&& sourceClass.equals(primitiveMap[i][1])) {
-				return true;
-			}
-			if (sourceClass.equals(primitiveMap[i][0])
-					&& toClass.equals(primitiveMap[i][1])) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public Object getFromType() {
-		return fromType;
-	}
-
-	public Object getToType() {
-		return toType;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/IntegerToStringConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/IntegerToStringConverter.java
deleted file mode 100644
index c8b177c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/IntegerToStringConverter.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.conversion;
-
-import org.eclipse.core.databinding.conversion.Converter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * Converts a value that is an integer, non decimal, to a String using a
- * NumberFormat.
- * <p>
- * This class is a temporary as this ability exists in NumberToStringConverter
- * except that short and byte are missing.
- * </p>
- * 
- * @since 1.0
- */
-public class IntegerToStringConverter extends Converter {
-	private final boolean primitive;
-	private final NumberFormat numberFormat;
-	private final Class boxedType;
-
-	/**
-	 * @param numberFormat
-	 * @param fromType
-	 * @param boxedType
-	 */
-	private IntegerToStringConverter(NumberFormat numberFormat, Class fromType,
-			Class boxedType) {
-		super(fromType, String.class);
-		this.primitive = fromType.isPrimitive();
-		this.numberFormat = numberFormat;
-		this.boxedType = boxedType;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.databinding.conversion.IConverter#convert(java.lang.Object)
-	 */
-	public Object convert(Object fromObject) {
-		// Null is allowed when the type is not primitve.
-		if (fromObject == null && !primitive) {
-			return ""; //$NON-NLS-1$
-		}
-
-		if (!boxedType.isInstance(fromObject)) {
-			throw new IllegalArgumentException(
-					"'fromObject' is not of type [" + boxedType + "]."); //$NON-NLS-1$//$NON-NLS-2$
-		}
-
-		return numberFormat.format(((Number) fromObject).longValue());
-	}
-
-	/**
-	 * @param primitive
-	 * @return converter
-	 */
-	public static IntegerToStringConverter fromShort(boolean primitive) {
-		return fromShort(NumberFormat.getIntegerInstance(), primitive);
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return converter
-	 */
-	public static IntegerToStringConverter fromShort(NumberFormat numberFormat,
-			boolean primitive) {
-		return new IntegerToStringConverter(numberFormat,
-				primitive ? Short.TYPE : Short.class, Short.class);
-	}
-
-	/**
-	 * @param primitive
-	 * @return converter
-	 */
-	public static IntegerToStringConverter fromByte(boolean primitive) {
-		return fromByte(NumberFormat.getIntegerInstance(), primitive);
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return converter
-	 */
-	public static IntegerToStringConverter fromByte(NumberFormat numberFormat,
-			boolean primitive) {
-		return new IntegerToStringConverter(numberFormat, primitive ? Byte.TYPE
-				: Byte.class, Byte.class);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToBigDecimalConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToBigDecimalConverter.java
deleted file mode 100644
index 2d3e38a..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToBigDecimalConverter.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.conversion;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * Converts from a Number to a BigDecimal.
- * <p>
- * Class is thread safe.
- * </p>
- * 
- * @since 1.0
- */
-public class NumberToBigDecimalConverter extends NumberToNumberConverter {
-	/**
-	 * @param numberFormat
-	 * @param fromType
-	 */
-	public NumberToBigDecimalConverter(NumberFormat numberFormat, Class fromType) {		
-		super(numberFormat, fromType, BigDecimal.class);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.conversion.NumberToNumberConverter#doConvert(java.lang.Number)
-	 */
-	protected Number doConvert(Number number) {
-		if (number instanceof BigInteger) {
-			return new BigDecimal((BigInteger) number);
-		}
-		
-		return new BigDecimal(number.doubleValue());
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToBigIntegerConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToBigIntegerConverter.java
deleted file mode 100644
index 23f4261..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToBigIntegerConverter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.conversion;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * Converts from a Number to a BigInteger.
- * <p>
- * Class is thread safe.
- * </p>
- * 
- * @since 1.0
- */
-public class NumberToBigIntegerConverter extends NumberToNumberConverter {
-	/**
-	 * @param numberFormat
-	 * @param fromType
-	 */
-	public NumberToBigIntegerConverter(NumberFormat numberFormat, Class fromType) {
-		super(numberFormat, fromType, BigInteger.class);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.conversion.NumberToNumberConverter#doConvert(java.lang.Number)
-	 */
-	protected Number doConvert(Number number) {	
-		return toBigDecimal(number).toBigInteger();
-	}
-	
-	private static BigDecimal toBigDecimal(Number number) {
-		if (number instanceof BigDecimal) {
-			return (BigDecimal) number;
-		}
-		
-		return new BigDecimal(number.doubleValue());
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToByteConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToByteConverter.java
deleted file mode 100644
index 88bf643..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToByteConverter.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.conversion;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * Converts from a Number to a Byte.
- * <p>
- * Class is thread safe.
- * </p>
- * 
- * @since 1.0
- */
-public class NumberToByteConverter extends NumberToNumberConverter {
-	/**
-	 * @param numberFormat 
-	 * @param fromType
-	 * @param primitive
-	 */
-	public NumberToByteConverter(NumberFormat numberFormat, Class fromType,
-			boolean primitive) {
-		super(numberFormat, fromType, (primitive) ? Byte.TYPE : Byte.class);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.conversion.NumberToNumberConverter#doConvert(java.lang.Number)
-	 */
-	protected Number doConvert(Number number) {
-		if (StringToNumberParser.inByteRange(number)) {
-			return new Byte(number.byteValue());
-		}
-		
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToDoubleConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToDoubleConverter.java
deleted file mode 100644
index 4e30390..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToDoubleConverter.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.conversion;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * Converts from a Number to a Double.
- * <p>
- * Class is thread safe.
- * </p>
- * 
- * @since 1.0
- */
-public class NumberToDoubleConverter extends NumberToNumberConverter {
-
-	/**
-	 * @param numberFormat
-	 * @param fromType
-	 * @param primitive
-	 */
-	public NumberToDoubleConverter(NumberFormat numberFormat, Class fromType,
-			boolean primitive) {
-		super(numberFormat, fromType, (primitive) ? Double.TYPE : Double.class);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.conversion.NumberToNumberConverter#doConvert(java.lang.Number)
-	 */
-	protected Number doConvert(Number number) {
-		if (StringToNumberParser.inDoubleRange(number)) {
-			return new Double(number.doubleValue());
-		}
-		
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToFloatConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToFloatConverter.java
deleted file mode 100644
index 64745a5..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToFloatConverter.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.conversion;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * Converts from a Number to a Float.
- * <p>
- * Class is thread safe.
- * </p>
- * @since 1.0
- */
-public class NumberToFloatConverter extends NumberToNumberConverter {
-	/**
-	 * @param numberFormat
-	 * @param fromType
-	 * @param primitive
-	 */
-	public NumberToFloatConverter(NumberFormat numberFormat, Class fromType,
-			boolean primitive) {
-		super(numberFormat, fromType, (primitive) ? Float.TYPE : Float.class);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.conversion.NumberToNumberConverter#doConvert(java.lang.Number)
-	 */
-	protected Number doConvert(Number number) {
-		if (StringToNumberParser.inFloatRange(number)) {
-			return new Float(number.floatValue());
-		}
-		
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToIntegerConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToIntegerConverter.java
deleted file mode 100644
index fdcf23a..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToIntegerConverter.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.conversion;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * Converts from a Number to a Integer.
- * <p>
- * Class is thread safe.
- * </p>
- * @since 1.0
- */
-public class NumberToIntegerConverter extends NumberToNumberConverter implements
-		IConverter {
-
-	/**
-	 * @param numberFormat
-	 * @param fromType
-	 * @param primitive
-	 */
-	public NumberToIntegerConverter(NumberFormat numberFormat,
-			Class fromType, boolean primitive) {
-		super(numberFormat, fromType, (primitive) ? Integer.TYPE : Integer.class);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.conversion.NumberToNumberConverter#doConvert(java.lang.Number)
-	 */
-	protected Number doConvert(Number number) {
-		if (StringToNumberParser.inIntegerRange(number)) {
-			return new Integer(number.intValue());
-		}
-		
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToLongConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToLongConverter.java
deleted file mode 100644
index 6addb0e..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToLongConverter.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.conversion;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * Converts from a Number to a Long.
- * <p>
- * Class is thread safe.
- * </p>
- * @since 1.0
- */
-public class NumberToLongConverter extends NumberToNumberConverter {
-	/**
-	 * @param numberFormat
-	 * @param fromType
-	 * @param primitive
-	 */
-	public NumberToLongConverter(NumberFormat numberFormat, Class fromType,
-			boolean primitive) {
-		super(numberFormat, fromType, (primitive) ? Long.TYPE : Long.class);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.conversion.NumberToNumberConverter#doConvert(java.lang.Number)
-	 */
-	protected Number doConvert(Number number) {
-		if (StringToNumberParser.inLongRange(number)) {
-			return new Long(number.longValue());
-		}
-		
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToNumberConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToNumberConverter.java
deleted file mode 100644
index 89f763b..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToNumberConverter.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.conversion;
-
-import org.eclipse.core.databinding.conversion.Converter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * Base class for number to number converters.
- * <p>
- * This class is thread safe.
- * </p>
- * 
- * @since 1.0
- */
-public abstract class NumberToNumberConverter extends Converter {
-	private NumberFormat numberFormat;
-
-	private boolean primitive;
-
-	private String outOfRangeMessage;
-
-	protected NumberToNumberConverter(NumberFormat numberFormat,
-			Class fromType, Class toType) {
-		super(fromType, toType);
-		this.numberFormat = numberFormat;
-		this.primitive = toType.isPrimitive();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.databinding.conversion.IConverter#convert(java.lang.Object)
-	 */
-	public final Object convert(Object fromObject) {
-		if (fromObject == null) {
-			if (primitive) {
-				throw new IllegalArgumentException(
-						"Parameter 'fromObject' cannot be null."); //$NON-NLS-1$	
-			}
-
-			return null;
-		}
-
-		if (!(fromObject instanceof Number)) {
-			throw new IllegalArgumentException(
-					"Parameter 'fromObject' must be of type Number."); //$NON-NLS-1$
-		}
-
-		Number number = (Number) fromObject;
-		Number result = doConvert(number);
-
-		if (result != null) {
-			return result;
-		}
-
-		synchronized (this) {
-			if (outOfRangeMessage == null) {
-				outOfRangeMessage = StringToNumberParser
-						.createOutOfRangeMessage(new Short(Short.MIN_VALUE),
-								new Short(Short.MAX_VALUE), numberFormat);
-			}
-
-			throw new IllegalArgumentException(outOfRangeMessage);
-		}
-	}
-
-	/**
-	 * Invoked when the number should converted.
-	 * 
-	 * @param number
-	 * @return number if conversion was successfule, <code>null</code> if the
-	 *         number was out of range
-	 */
-	protected abstract Number doConvert(Number number);
-
-	/**
-	 * NumberFormat being used by the converter. Access to the format must be
-	 * synchronized on the number format instance.
-	 * 
-	 * @return number format
-	 */
-	public NumberFormat getNumberFormat() {
-		return numberFormat;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToShortConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToShortConverter.java
deleted file mode 100644
index badb8c0..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/NumberToShortConverter.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.conversion;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * Converts from a Number to a Short.
- * <p>
- * Class is thread safe.
- * </p>
- * @since 1.0
- */
-public class NumberToShortConverter extends NumberToNumberConverter {
-	/**
-	 * @param numberFormat
-	 * @param fromType
-	 * @param primitive
-	 */
-	public NumberToShortConverter(NumberFormat numberFormat, Class fromType,
-			boolean primitive) {
-
-		super(numberFormat, fromType, (primitive) ? Short.TYPE : Short.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.internal.databinding.conversion.NumberToNumberConverter#doConvert(java.lang.Number)
-	 */
-	protected Number doConvert(Number number) {
-		if (StringToNumberParser.inShortRange(number)) {
-			return new Short(number.shortValue());
-		}
-
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/ObjectToStringConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/ObjectToStringConverter.java
deleted file mode 100644
index 76b69d4..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/ObjectToStringConverter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2005 db4objects Inc.  http://www.db4o.com
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     db4objects - Initial API and implementation
- */
-package org.eclipse.core.internal.databinding.conversion;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-
-/**
- * Converts any object to a string by calling its toString() method.
- */
-public class ObjectToStringConverter implements IConverter {
-	private final Class fromClass;
-
-	/**
-	 * 
-	 */
-	public ObjectToStringConverter() {
-		this(Object.class);
-	}
-
-	/**
-	 * @param fromClass
-	 */
-	public ObjectToStringConverter(Class fromClass) {
-		this.fromClass = fromClass;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.binding.converter.IConverter#convert(java.lang.Object)
-	 */
-	public Object convert(Object source) {
-		if (source == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return source.toString();
-	}
-
-	public Object getFromType() {
-		return fromClass;
-	}
-
-	public Object getToType() {
-		return String.class;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StatusToStringConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StatusToStringConverter.java
deleted file mode 100644
index 72d7716..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StatusToStringConverter.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.conversion;
-
-import org.eclipse.core.databinding.conversion.Converter;
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Converts an IStatus into a String.  The message of the status is the returned value.
- * 
- * @since 1.0
- */
-public class StatusToStringConverter extends Converter implements IConverter {
-	/**
-	 * Constructs a new instance.
-	 */
-	public StatusToStringConverter() {
-		super(IStatus.class, String.class);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.databinding.conversion.IConverter#convert(java.lang.Object)
-	 */
-	public Object convert(Object fromObject) {
-		if (fromObject == null) {
-			throw new IllegalArgumentException("Parameter 'fromObject' was null."); //$NON-NLS-1$
-		}
-		
-		IStatus status = (IStatus) fromObject;
-		return status.getMessage();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToBooleanConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToBooleanConverter.java
deleted file mode 100755
index 7f67e76..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToBooleanConverter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2005 db4objects Inc.  http://www.db4o.com
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     db4objects - Initial API and implementation
- */
-package org.eclipse.core.internal.databinding.conversion;
-
-/**
- * StringToBooleanConverter.
- */
-public class StringToBooleanConverter extends StringToBooleanPrimitiveConverter {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.binding.converter.IConverter#convert(java.lang.Object)
-	 */
-	public Object convert(Object source) {
-		String sourceString = (String) source;
-		if ("".equals(sourceString.trim())) { //$NON-NLS-1$
-			return null;
-		}
-		return super.convert(source);
-	}
-
-	public Object getToType() {
-		return Boolean.class;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToBooleanPrimitiveConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToBooleanPrimitiveConverter.java
deleted file mode 100644
index f38300d..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToBooleanPrimitiveConverter.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2005 db4objects Inc.  http://www.db4o.com
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     db4objects - Initial API and implementation
- *     Tom Schindl<tom.schindl@bestsolution.at> - bugfix for 217940
- */
-package org.eclipse.core.internal.databinding.conversion;
-
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.internal.databinding.BindingMessages;
-
-/**
- * StringToBooleanPrimitiveConverter.
- */
-public class StringToBooleanPrimitiveConverter implements IConverter {
-	private static final String[] trueValues;
-
-	private static final String[] falseValues;
-
-	static {
-		String delimiter = BindingMessages.getString(BindingMessages.VALUE_DELIMITER);
-		String values = BindingMessages.getString(BindingMessages.TRUE_STRING_VALUES);
-		trueValues = valuesToSortedArray(delimiter, values);
-
-		values = BindingMessages.getString(BindingMessages.FALSE_STRING_VALUES);
-		falseValues = valuesToSortedArray(delimiter, values);
-	}
-
-	/**
-	 * Returns a sorted array with all values converted to upper case.
-	 *
-	 * @param delimiter
-	 * @param values
-	 * @return sorted array of values
-	 */
-	private static String[] valuesToSortedArray(String delimiter, String values) {
-		List list = new LinkedList();
-		StringTokenizer tokenizer = new StringTokenizer(values, delimiter);
-		while (tokenizer.hasMoreTokens()) {
-			list.add(tokenizer.nextToken().toUpperCase());
-		}
-
-		String[] array = (String[]) list.toArray(new String[list.size()]);
-		Arrays.sort(array);
-
-		return array;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.binding.converter.IConverter#convert(java.lang.Object)
-	 */
-	public Object convert(Object source) {
-		String s = (String) source;
-		s = s.toUpperCase();
-
-		if (Arrays.binarySearch(trueValues, s) > -1) {
-			return Boolean.TRUE;
-		}
-
-		if (Arrays.binarySearch(falseValues, s) > -1) {
-			return Boolean.FALSE;
-		}
-
-		throw new IllegalArgumentException(s + " is not a legal boolean value"); //$NON-NLS-1$
-	}
-
-	public Object getFromType() {
-		return String.class;
-	}
-
-	public Object getToType() {
-		return Boolean.TYPE;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToByteConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToByteConverter.java
deleted file mode 100755
index eef131d..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToByteConverter.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2005 db4objects Inc.  http://www.db4o.com
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     db4objects - Initial API and implementation
- */
-package org.eclipse.core.internal.databinding.conversion;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser.ParseResult;
-import org.eclipse.core.internal.databinding.validation.NumberFormatConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.0
- */
-public class StringToByteConverter extends NumberFormatConverter {	
-	private String outOfRangeMessage;
-	private NumberFormat numberFormat;
-	private boolean primitive;
-	
-	/**
-	 * @param numberFormat
-	 * @param toType
-	 */
-	private StringToByteConverter(NumberFormat numberFormat, Class toType) {
-		super(String.class, toType, numberFormat);
-		primitive = toType.isPrimitive();
-		this.numberFormat = numberFormat;
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return converter
-	 */
-	public static StringToByteConverter toByte(NumberFormat numberFormat,
-			boolean primitive) {
-		return new StringToByteConverter(numberFormat, (primitive) ? Byte.TYPE : Byte.class);
-	}
-
-	/**
-	 * @param primitive
-	 * @return converter
-	 */
-	public static StringToByteConverter toByte(boolean primitive) {
-		return toByte(NumberFormat.getIntegerInstance(), primitive);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.databinding.conversion.IConverter#convert(java.lang.Object)
-	 */
-	public Object convert(Object fromObject) {
-		ParseResult result = StringToNumberParser.parse(fromObject,
-				numberFormat, primitive);
-
-		if (result.getPosition() != null) {
-			// this shouldn't happen in the pipeline as validation should catch
-			// it but anyone can call convert so we should return a properly
-			// formatted message in an exception
-			throw new IllegalArgumentException(StringToNumberParser
-					.createParseErrorMessage((String) fromObject, result
-							.getPosition()));
-		} else if (result.getNumber() == null) {
-			// if an error didn't occur and the number is null then it's a boxed
-			// type and null should be returned
-			return null;
-		}
-
-		if (StringToNumberParser.inByteRange(result.getNumber())) {
-			return new Byte(result.getNumber().byteValue());
-		}
-		
-		synchronized (this) {
-			if (outOfRangeMessage == null) {
-				outOfRangeMessage = StringToNumberParser
-				.createOutOfRangeMessage(new Byte(Byte.MIN_VALUE), new Byte(Byte.MAX_VALUE), numberFormat);
-			}
-						
-			throw new IllegalArgumentException(outOfRangeMessage);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToCharacterConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToCharacterConverter.java
deleted file mode 100644
index ce71dc7..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToCharacterConverter.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2005 db4objects Inc.  http://www.db4o.com
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     db4objects - Initial API and implementation
- *     Matt Carter - Improved primitive conversion support (bug 197679)
- */
-package org.eclipse.core.internal.databinding.conversion;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-
-/**
- * StringToCharacterConverter.
- */
-public class StringToCharacterConverter implements IConverter {
-
-	private final boolean primitiveTarget;
-
-	/**
-	 * 
-	 * @param primitiveTarget
-	 */
-	public StringToCharacterConverter(boolean primitiveTarget) {
-		this.primitiveTarget = primitiveTarget;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.binding.converter.IConverter#convert(java.lang.Object)
-	 */
-	public Object convert(Object source) {
-		if (source != null && !(source instanceof String))
-			throw new IllegalArgumentException(
-					"String2Character: Expected type String, got type [" + source.getClass().getName() + "]"); //$NON-NLS-1$ //$NON-NLS-2$
-
-		String s = (String) source;
-		if (source == null || s.equals("")) { //$NON-NLS-1$
-			if (primitiveTarget)
-				throw new IllegalArgumentException(
-						"String2Character: cannot convert null/empty string to character primitive"); //$NON-NLS-1$
-			return null;
-		}
-		Character result;
-
-		if (s.length() > 1)
-			throw new IllegalArgumentException(
-					"String2Character: string too long: " + s); //$NON-NLS-1$
-
-		try {
-			result = new Character(s.charAt(0));
-		} catch (Exception e) {
-			throw new IllegalArgumentException(
-					"String2Character: " + e.getMessage() + ": " + s); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		return result;
-	}
-
-	public Object getFromType() {
-		return String.class;
-	}
-
-	public Object getToType() {
-		return primitiveTarget ? Character.TYPE : Character.class;
-	}
-
-	/**
-	 * @param primitive
-	 * @return converter
-	 */
-	public static StringToCharacterConverter toCharacter(boolean primitive) {
-		return new StringToCharacterConverter(primitive);
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToDateConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToDateConverter.java
deleted file mode 100644
index 47b55ce..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToDateConverter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2005 db4objects Inc.  http://www.db4o.com
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     db4objects - Initial API and implementation
- */
-package org.eclipse.core.internal.databinding.conversion;
-
-import java.util.Date;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-
-
-/**
- * Convert a String to a java.util.Date, respecting the current locale
- * 
- * @since 1.0
- */
-public class StringToDateConverter extends DateConversionSupport implements IConverter {
-	public Object convert(Object source) {
-		return parse(source.toString());
-	}
-
-	public Object getFromType() {
-		return String.class;
-	}
-
-	public Object getToType() {
-		return Date.class;
-	}	
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToNumberParser.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToNumberParser.java
deleted file mode 100644
index 595c845..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToNumberParser.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.conversion;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.text.ParsePosition;
-
-import org.eclipse.core.internal.databinding.BindingMessages;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * Utility class for the parsing of strings to numbers.
- *
- * @since 1.0
- */
-public class StringToNumberParser {
-	private static final BigDecimal FLOAT_MAX_BIG_DECIMAL = new BigDecimal(
-			Float.MAX_VALUE);
-	private static final BigDecimal FLOAT_MIN_BIG_DECIMAL = new BigDecimal(
-			-Float.MAX_VALUE);
-
-	private static final BigDecimal DOUBLE_MAX_BIG_DECIMAL = new BigDecimal(
-			Double.MAX_VALUE);
-	private static final BigDecimal DOUBLE_MIN_BIG_DECIMAL = new BigDecimal(
-			-Double.MAX_VALUE);
-
-	/**
-	 * @param value
-	 * @param numberFormat
-	 * @param primitive
-	 * @return result
-	 */
-	public static ParseResult parse(Object value, NumberFormat numberFormat,
-			boolean primitive) {
-		if (!(value instanceof String)) {
-			throw new IllegalArgumentException(
-					"Value to convert is not a String"); //$NON-NLS-1$
-		}
-
-		String source = (String) value;
-		ParseResult result = new ParseResult();
-		if (!primitive && source.trim().length() == 0) {
-			return result;
-		}
-
-		synchronized (numberFormat) {
-			ParsePosition position = new ParsePosition(0);
-			Number parseResult = null;
-			parseResult = numberFormat.parse(source, position);
-
-			if (position.getIndex() != source.length()
-					|| position.getErrorIndex() > -1) {
-
-				result.position = position;
-			} else {
-				result.number = parseResult;
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * The result of a parse operation.
-	 *
-	 * @since 1.0
-	 */
-	public static class ParseResult {
-		/* package */Number number;
-		/* package */ParsePosition position;
-
-		/**
-		 * The number as a result of the conversion. <code>null</code> if the
-		 * value could not be converted or if the type is not a primitive and
-		 * the value was an empty string.
-		 *
-		 * @return number
-		 */
-		public Number getNumber() {
-			return number;
-		}
-
-		/**
-		 * ParsePosition if an error occurred while parsing. <code>null</code>
-		 * if no error occurred.
-		 *
-		 * @return parse position
-		 */
-		public ParsePosition getPosition() {
-			return position;
-		}
-	}
-
-	/**
-	 * Formats an appropriate message for a parsing error.
-	 *
-	 * @param value
-	 * @param position
-	 * @return message
-	 */
-	public static String createParseErrorMessage(String value,
-			ParsePosition position) {
-		int errorIndex = (position.getErrorIndex() > -1) ? position
-				.getErrorIndex() : position.getIndex();
-
-		if (errorIndex < value.length()) {
-			return BindingMessages.formatString(BindingMessages.VALIDATE_NUMBER_PARSE_ERROR,
-					new Object[] { value, new Integer(errorIndex + 1),
-							new Character(value.charAt(errorIndex)) });
-		}
-		return BindingMessages.formatString(BindingMessages.VALIDATE_NUMBER_PARSE_ERROR_NO_CHARACTER,
-				new Object[] { value, new Integer(errorIndex + 1) });
-	}
-
-	/**
-	 * Formats an appropriate message for an out of range error.
-	 *
-	 * @param minValue
-	 * @param maxValue
-	 * @param numberFormat when accessed method synchronizes on instance
-	 * @return message
-	 */
-	public static String createOutOfRangeMessage(Number minValue,
-			Number maxValue, NumberFormat numberFormat) {
-		String min = null;
-		String max = null;
-
-		synchronized (numberFormat) {
-			min = numberFormat.format(minValue);
-			max = numberFormat.format(maxValue);
-		}
-
-		return BindingMessages.formatString(
-				"Validate_NumberOutOfRangeError", new Object[] { min, max }); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns <code>true</code> if the provided <code>number</code> is in
-	 * the range of a integer.
-	 *
-	 * @param number
-	 * @return <code>true</code> if a valid integer
-	 * @throws IllegalArgumentException
-	 *             if the number type is unsupported
-	 */
-	public static boolean inIntegerRange(Number number) {
-		return checkInteger(number, 31);
-	}
-
-	/**
-	 * Validates the range of the provided <code>number</code>.
-	 *
-	 * @param number
-	 * @param bitLength number of bits allowed to be in range
-	 * @return <code>true</code> if in range
-	 */
-	private static boolean checkInteger(Number number, int bitLength) {
-		BigInteger bigInteger = null;
-
-		if (number instanceof Integer || number instanceof Long) {
-			bigInteger = BigInteger.valueOf(number.longValue());
-		} else if (number instanceof Float || number instanceof Double) {
-			double doubleValue = number.doubleValue();
-			if (!Double.isNaN(doubleValue)
-					&& doubleValue != Double.NEGATIVE_INFINITY
-					&& doubleValue != Double.POSITIVE_INFINITY) {
-				bigInteger = new BigDecimal(doubleValue).toBigInteger();
-			} else {
-				return false;
-			}
-		} else if (number instanceof BigInteger) {
-			bigInteger = (BigInteger) number;
-		} else if (number instanceof BigDecimal) {
-			bigInteger = ((BigDecimal) number).toBigInteger();
-		} else {
-			/*
-			 * The else is necessary as the ICU4J plugin has it's own BigDecimal
-			 * implementation which isn't part of the replacement plugin. So
-			 * that this will work we fall back on the double value of the
-			 * number.
-			 */
-			bigInteger = new BigDecimal(number.doubleValue()).toBigInteger();
-		}
-
-		if (bigInteger != null) {
-			return bigInteger.bitLength() <= bitLength;
-		}
-
-		throw new IllegalArgumentException(
-				"Number of type [" + number.getClass().getName() + "] is not supported."); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Returns <code>true</code> if the provided <code>number</code> is in
-	 * the range of a long.
-	 *
-	 * @param number
-	 * @return <code>true</code> if in range
-	 * @throws IllegalArgumentException
-	 *             if the number type is unsupported
-	 */
-	public static boolean inLongRange(Number number) {
-		return checkInteger(number, 63);
-	}
-
-	/**
-	 * Returns <code>true</code> if the provided <code>number</code> is in
-	 * the range of a float.
-	 *
-	 * @param number
-	 * @return <code>true</code> if in range
-	 * @throws IllegalArgumentException
-	 *             if the number type is unsupported
-	 */
-	public static boolean inFloatRange(Number number) {
-		return checkDecimal(number, FLOAT_MIN_BIG_DECIMAL, FLOAT_MAX_BIG_DECIMAL);
-	}
-
-	private static boolean checkDecimal(Number number, BigDecimal min, BigDecimal max) {
-		BigDecimal bigDecimal = null;
-		if (number instanceof Integer || number instanceof Long) {
-			bigDecimal = new BigDecimal(number.doubleValue());
-		} else if (number instanceof Float || number instanceof Double) {
-			double doubleValue = number.doubleValue();
-
-			if (!Double.isNaN(doubleValue)
-					&& doubleValue != Double.NEGATIVE_INFINITY
-					&& doubleValue != Double.POSITIVE_INFINITY) {
-				bigDecimal = new BigDecimal(doubleValue);
-			} else {
-				return false;
-			}
-		} else if (number instanceof BigInteger) {
-			bigDecimal = new BigDecimal((BigInteger) number);
-		} else if (number instanceof BigDecimal) {
-			bigDecimal = (BigDecimal) number;
-		} else {
-			/*
-			 * The else is necessary as the ICU4J plugin has it's own BigDecimal
-			 * implementation which isn't part of the replacement plugin. So
-			 * that this will work we fall back on the double value of the
-			 * number.
-			 */
-			bigDecimal = new BigDecimal(number.doubleValue());
-		}
-
-		if (bigDecimal != null) {
-			return max.compareTo(bigDecimal) >= 0
-					&& min.compareTo(bigDecimal) <= 0;
-		}
-
-		throw new IllegalArgumentException(
-				"Number of type [" + number.getClass().getName() + "] is not supported."); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Returns <code>true</code> if the provided <code>number</code> is in
-	 * the range of a double.
-	 *
-	 * @param number
-	 * @return <code>true</code> if in range
-	 * @throws IllegalArgumentException
-	 *             if the number type is unsupported
-	 */
-	public static boolean inDoubleRange(Number number) {
-		return checkDecimal(number, DOUBLE_MIN_BIG_DECIMAL, DOUBLE_MAX_BIG_DECIMAL);
-	}
-
-	/**
-	 * Returns <code>true</code> if the provided <code>number</code> is in
-	 * the range of a short.
-	 *
-	 * @param number
-	 * @return <code>true</code> if in range
-	 */
-	public static boolean inShortRange(Number number) {
-		return checkInteger(number, 15);
-	}
-
-	/**
-	 * Returns <code>true</code> if the provided <code>number</code> is in
-	 * the range of a byte.
-	 *
-	 * @param number
-	 * @return <code>true</code> if in range
-	 */
-	public static boolean inByteRange(Number number) {
-		return checkInteger(number, 7);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToShortConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToShortConverter.java
deleted file mode 100755
index 3c05a5c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/conversion/StringToShortConverter.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.conversion;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser.ParseResult;
-import org.eclipse.core.internal.databinding.validation.NumberFormatConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.0
- */
-public class StringToShortConverter extends NumberFormatConverter {
-	private final NumberFormat numberFormat;
-	private final boolean primitive;
-	
-	private String outOfRangeMessage;
-
-	/**
-	 * Constructs a new instance.
-	 */
-	private StringToShortConverter(NumberFormat numberFormat, Class toType) {
-		super(String.class, toType, numberFormat);
-		this.numberFormat = numberFormat;
-		primitive = toType.isPrimitive();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.databinding.conversion.IConverter#convert(java.lang.Object)
-	 */
-	public Object convert(Object fromObject) {
-		ParseResult result = StringToNumberParser.parse(fromObject,
-				numberFormat, primitive);
-
-		if (result.getPosition() != null) {
-			// this shouldn't happen in the pipeline as validation should catch
-			// it but anyone can call convert so we should return a properly
-			// formatted message in an exception
-			throw new IllegalArgumentException(StringToNumberParser
-					.createParseErrorMessage((String) fromObject, result
-							.getPosition()));
-		} else if (result.getNumber() == null) {
-			// if an error didn't occur and the number is null then it's a boxed
-			// type and null should be returned
-			return null;
-		}
-
-		if (StringToNumberParser.inShortRange(result.getNumber())) {
-			return new Short(result.getNumber().shortValue());
-		}
-		
-		synchronized (this) {
-			if (outOfRangeMessage == null) {
-				outOfRangeMessage = StringToNumberParser
-				.createOutOfRangeMessage(new Short(Short.MIN_VALUE), new Short(Short.MAX_VALUE), numberFormat);
-			}
-						
-			throw new IllegalArgumentException(outOfRangeMessage);
-		}
-	}
-
-	/**
-	 * @param primitive
-	 *            <code>true</code> if the convert to type is a short
-	 * @return to Short converter for the default locale
-	 */
-	public static StringToShortConverter toShort(boolean primitive) {
-		return toShort(NumberFormat.getIntegerInstance(), primitive);
-	}
-
-	/**
-	 * @param numberFormat
-	 * @param primitive
-	 * @return to Short converter with the provided numberFormat
-	 */
-	public static StringToShortConverter toShort(NumberFormat numberFormat,
-			boolean primitive) {
-		return new StringToShortConverter(numberFormat,
-				(primitive) ? Short.TYPE : Short.class);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/messages.properties b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/messages.properties
deleted file mode 100644
index 7540ebc..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/messages.properties
+++ /dev/null
@@ -1,56 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS file for JFace Data Binding
-###############################################################################
-## Uneeded value
-#
-#Yes=Yes
-#yes=yes
-#No=No
-#no=no
-#True=True
-#true=true
-#False=False
-#false=false
-#and=and
-#or=or
-#Validate_BooleanHelp=Please type "Yes", "No", "True", or "False"
-#
-#Validate_RangeStart=Please enter a number between
-#Validate_Like=Please enter a number like
-#
-###############
-
-IndexOutOfRange=Index out of Range.
-MultipleProblems=Multiple Problems.
-
-ValueBinding_ErrorWhileSettingValue=An error occurred while setting the value.
-DateFormat_DateTime=dd.MM.yyyy HH:mm:ss.SSS Z
-DateFormat_Time=HH:mm:ss.SSS
-
-#ValueDelimiter should be used to separate multiple values that are stored in one key
-ValueDelimiter=,
-
-#Values must be separated by ValueDelimiter
-TrueStringValues=yes,true
-FalseStringValues=no,false
-
-Validate_NumberOutOfRangeError=Please enter a value between [{0}] and [{1}] and with a similar format.
-Validate_NumberParseError=Invalid character for value [{0}] at position [{1}] character [{2}].
-Validate_NumberParseErrorNoCharacter=Missing character for value [{0}] at position [{1}].
-
-Validate_ConversionToPrimitive="Null object values can not be converted to primitives."
-Validate_ConversionFromClassToPrimitive="Wrong object type to convert to primitive."
-
-Validate_NoChangeAllowedHelp=Changes are not allowed in this field
-Validate_CharacterHelp=Please type a character
-
-Examples=Examples
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ConstantObservableValue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ConstantObservableValue.java
deleted file mode 100644
index e631f2f..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ConstantObservableValue.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007-2008 Matt Carter and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matt Carter - initial API and implementation (bug 212518)
- *     Matthew Hall - bug 212518, 146397
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * An immutable {@link IObservableValue}.
- * 
- * @see WritableValue
- */
-public class ConstantObservableValue implements IObservableValue {
-	final Realm realm;
-	final Object value;
-	final Object type;
-
-	/**
-	 * Construct a constant value of the given type, in the default realm.
-	 * 
-	 * @param value
-	 *            immutable value
-	 * @param type
-	 *            type
-	 */
-	public ConstantObservableValue(Object value, Object type) {
-		this(Realm.getDefault(), value, type);
-	}
-
-	/**
-	 * Construct a constant value of the given type, in the given realm.
-	 * 
-	 * @param realm
-	 *            Realm
-	 * @param value
-	 *            immutable value
-	 * @param type
-	 *            type
-	 */
-	public ConstantObservableValue(Realm realm, Object value, Object type) {
-		Assert.isNotNull(realm, "Realm cannot be null"); //$NON-NLS-1$
-		this.realm = realm;
-		this.value = value;
-		this.type = type;
-	}
-
-	public Object getValueType() {
-		return type;
-	}
-
-	public Object getValue() {
-		ObservableTracker.getterCalled(this);
-		return value;
-	}
-
-	public void setValue(Object value) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void addValueChangeListener(IValueChangeListener listener) {
-		// ignore
-	}
-
-	public void removeValueChangeListener(IValueChangeListener listener) {
-		// ignore
-	}
-
-	public void addChangeListener(IChangeListener listener) {
-		// ignore
-	}
-
-	public void addDisposeListener(IDisposeListener listener) {
-		// ignore
-	}
-
-	public void addStaleListener(IStaleListener listener) {
-		// ignore
-	}
-
-	public boolean isDisposed() {
-		return false;
-	}
-
-	public void dispose() {
-		// nothing to dispose
-	}
-
-	public Realm getRealm() {
-		return realm;
-	}
-
-	public boolean isStale() {
-		return false;
-	}
-
-	public void removeChangeListener(IChangeListener listener) {
-		// ignore
-	}
-
-	public void removeDisposeListener(IDisposeListener listener) {
-		// ignore
-	}
-
-	public void removeStaleListener(IStaleListener listener) {
-		// ignore
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/DelayedObservableValue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/DelayedObservableValue.java
deleted file mode 100644
index 24ff3e9..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/DelayedObservableValue.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Matthew Hall - initial API and implementation (bug 180746)
- * 		Boris Bokowski, IBM - initial API and implementation
- * 		Matthew Hall - bugs 212223, 208332, 245647
- *  	Will Horn - bug 215297
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.IVetoableValue;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.databinding.observable.value.ValueChangingEvent;
-import org.eclipse.core.databinding.observable.value.ValueDiff;
-import org.eclipse.core.internal.databinding.Util;
-
-/**
- * {@link IObservableValue} implementation that wraps an
- * {@link IObservableValue} and delays notification of value change events from
- * the wrapped observable value until a certain time has passed since the last
- * change event. This class helps to boost performance in bindings (both in
- * validation and in event firing) when the observed value is rapidly changing.
- * A common use of this class is to delay validation until the user stops typing
- * in an UI field. To notify about pending changes, a DelayedObservableValue
- * fires a stale event when the wrapped observable value fires a change event,
- * and remains stale as long as a value change is pending.
- * 
- * Note that this class will not forward {@link ValueChangingEvent} events from
- * a wrapped {@link IVetoableValue}.
- * 
- * @since 1.2
- */
-public class DelayedObservableValue extends AbstractObservableValue implements
-		IStaleListener, IValueChangeListener {
-	class ValueUpdater implements Runnable {
-		private final Object oldValue;
-
-		boolean cancel = false;
-		boolean running = false;
-
-		ValueUpdater(Object oldValue) {
-			this.oldValue = oldValue;
-		}
-
-		void cancel() {
-			cancel = true;
-		}
-
-		public void run() {
-			if (!cancel)
-				try {
-					running = true;
-					internalFireValueChange(oldValue);
-				} finally {
-					running = false;
-				}
-		}
-	}
-
-	private final int delay;
-	private IObservableValue observable;
-
-	private boolean dirty = true;
-	private Object cachedValue = null;
-
-	private boolean updating = false;
-
-	private ValueUpdater updater = null;
-
-	/**
-	 * Constructs a new instance bound to the given
-	 * <code>ISWTObservableValue</code> and configured to fire change events
-	 * once there have been no value changes in the observable for
-	 * <code>delay</code> milliseconds.
-	 * 
-	 * @param delayMillis
-	 * @param observable
-	 * @throws IllegalArgumentException
-	 *             if <code>updateEventType</code> is an incorrect type.
-	 */
-	public DelayedObservableValue(int delayMillis, IObservableValue observable) {
-		super(observable.getRealm());
-		this.delay = delayMillis;
-		this.observable = observable;
-
-		observable.addValueChangeListener(this);
-		observable.addStaleListener(this);
-
-		cachedValue = doGetValue();
-	}
-
-	public void handleValueChange(ValueChangeEvent event) {
-		if (!updating)
-			makeDirty();
-	}
-
-	public void handleStale(StaleEvent staleEvent) {
-		if (!updating)
-			fireStale();
-	}
-
-	protected Object doGetValue() {
-		if (dirty) {
-			cachedValue = observable.getValue();
-			dirty = false;
-
-			if (updater != null && !updater.running) {
-				fireValueChange(Diffs.createValueDiff(updater.oldValue,
-						cachedValue));
-				cancelScheduledUpdate();
-			}
-		}
-		return cachedValue;
-	}
-
-	protected void doSetValue(Object value) {
-		updating = true;
-		try {
-			// Principle of least surprise: setValue overrides any pending
-			// update from observable.
-			dirty = false;
-			cancelScheduledUpdate();
-
-			Object oldValue = cachedValue;
-			observable.setValue(value);
-			// Bug 215297 - target observable could veto or override value
-			// passed to setValue(). Make sure we cache whatever is set.
-			cachedValue = observable.getValue();
-
-			if (!Util.equals(oldValue, cachedValue))
-				fireValueChange(Diffs.createValueDiff(oldValue, cachedValue));
-		} finally {
-			updating = false;
-		}
-	}
-
-	public boolean isStale() {
-		ObservableTracker.getterCalled(this);
-		return (dirty && updater != null) || observable.isStale();
-	}
-
-	/**
-	 * Returns the type of the value from {@link #doGetValue()}, i.e.
-	 * String.class
-	 * 
-	 * @see org.eclipse.core.databinding.observable.value.IObservableValue#getValueType()
-	 */
-	public Object getValueType() {
-		return observable.getValueType();
-	}
-
-	public synchronized void dispose() {
-		cancelScheduledUpdate();
-		if (observable != null) {
-			observable.dispose();
-			observable = null;
-		}
-		super.dispose();
-	}
-
-	private void makeDirty() {
-		if (!dirty) {
-			dirty = true;
-			fireStale();
-		}
-		cancelScheduledUpdate(); // if any
-		scheduleUpdate();
-	}
-
-	private void cancelScheduledUpdate() {
-		if (updater != null) {
-			updater.cancel();
-			updater = null;
-		}
-	}
-
-	private void scheduleUpdate() {
-		updater = new ValueUpdater(cachedValue);
-		getRealm().timerExec(delay, updater);
-	}
-
-	private void internalFireValueChange(final Object oldValue) {
-		cancelScheduledUpdate();
-		fireValueChange(new ValueDiff() {
-			public Object getOldValue() {
-				return oldValue;
-			}
-
-			public Object getNewValue() {
-				return getValue();
-			}
-		});
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/EmptyObservableList.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/EmptyObservableList.java
deleted file mode 100644
index 6d854e0..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/EmptyObservableList.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bugs 208858, 208332, 146397
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * Singleton empty list
- */
-public class EmptyObservableList implements IObservableList {
-
-	private static final List emptyList = Collections.EMPTY_LIST;
-
-	private Realm realm;
-	private Object elementType;
-
-	/**
-	 * Creates an empty list. This list may be disposed multiple times
-	 * without any side-effects.
-	 * 
-	 * @param realm
-	 *            the realm of the constructed list
-	 */
-	public EmptyObservableList(Realm realm) {
-		this(realm, null);
-	}
-
-	/**
-	 * Creates an empty list. This list may be disposed multiple times
-	 * without any side-effects.
-	 * 
-	 * @param realm
-	 *            the realm of the constructed list
-	 * @param elementType
-	 *            the element type of the constructed list
-	 * @since 1.1
-	 */
-	public EmptyObservableList(Realm realm, Object elementType) {
-		this.realm = realm;
-		this.elementType = elementType;
-	}
-
-	public void addListChangeListener(IListChangeListener listener) {
-		// ignore
-	}
-
-	public void removeListChangeListener(IListChangeListener listener) {
-		// ignore
-	}
-
-	public Object getElementType() {
-		return elementType;
-	}
-
-	public int size() {
-		checkRealm();
-		return 0;
-	}
-
-	void checkRealm() {
-		Assert.isTrue(realm.isCurrent(),
-				"Observable cannot be accessed outside its realm"); //$NON-NLS-1$
-	}
-
-	public boolean isEmpty() {
-		checkRealm();
-		return true;
-	}
-
-	public boolean contains(Object o) {
-		checkRealm();
-		return false;
-	}
-
-	public Iterator iterator() {
-		checkRealm();
-		return emptyList.iterator();
-	}
-
-	public Object[] toArray() {
-		checkRealm();
-		return emptyList.toArray();
-	}
-
-	public Object[] toArray(Object[] a) {
-		return emptyList.toArray(a);
-	}
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean remove(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean containsAll(Collection c) {
-		checkRealm();
-		return c.isEmpty();
-	}
-
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean retainAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean removeAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	public void addChangeListener(IChangeListener listener) {
-	}
-
-	public void removeChangeListener(IChangeListener listener) {
-	}
-
-	public void addStaleListener(IStaleListener listener) {
-	}
-
-	public void removeStaleListener(IStaleListener listener) {
-	}
-
-	public void addDisposeListener(IDisposeListener listener) {
-	}
-
-	public void removeDisposeListener(IDisposeListener listener) {
-	}
-
-	public boolean isStale() {
-		checkRealm();
-		return false;
-	}
-
-	public boolean isDisposed() {
-		return false;
-	}
-
-	public void dispose() {
-	}
-
-	public boolean addAll(int index, Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Object get(int index) {
-		return emptyList.get(index);
-	}
-
-	public int indexOf(Object o) {
-		return -1;
-	}
-
-	public int lastIndexOf(Object o) {
-		return -1;
-	}
-
-	public ListIterator listIterator() {
-		return emptyList.listIterator();
-	}
-
-	public ListIterator listIterator(int index) {
-		return emptyList.listIterator(index);
-	}
-
-	public Object remove(int index) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Object set(int index, Object element) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Object move(int oldIndex, int newIndex) {
-		throw new UnsupportedOperationException();
-	}
-
-	public List subList(int fromIndex, int toIndex) {
-		return emptyList.subList(fromIndex, toIndex);
-	}
-
-	public void add(int index, Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Realm getRealm() {
-		return realm;
-	}
-
-	public boolean equals(Object obj) {
-		checkRealm();
-		if (obj == this)
-			return true;
-		if (obj == null)
-			return false;
-		if (!(obj instanceof List))
-			return false;
-
-		return ((List) obj).isEmpty();
-	}
-
-	public int hashCode() {
-		checkRealm();
-		return 1;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/EmptyObservableSet.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/EmptyObservableSet.java
deleted file mode 100644
index 26cb0b8..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/EmptyObservableSet.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bugs 208332, 146397
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * Singleton empty set
- */
-public class EmptyObservableSet implements IObservableSet {
-
-	private static final Set emptySet = Collections.EMPTY_SET;
-
-	private Realm realm;
-	private Object elementType;
-
-	/**
-	 * Creates a singleton empty set. This set may be disposed multiple times
-	 * without any side-effects.
-	 * 
-	 * @param realm
-	 *            the realm of the constructed set
-	 */
-	public EmptyObservableSet(Realm realm) {
-		this(realm, null);
-	}
-
-	/**
-	 * Creates a singleton empty set. This set may be disposed multiple times
-	 * without any side-effects.
-	 * 
-	 * @param realm
-	 *            the realm of the constructed set
-	 * @param elementType
-	 *            the element type of the constructed set
-	 * @since 1.1
-	 */
-	public EmptyObservableSet(Realm realm, Object elementType) {
-		this.realm = realm;
-		this.elementType = elementType;
-	}
-
-	public void addSetChangeListener(ISetChangeListener listener) {
-	}
-
-	public void removeSetChangeListener(ISetChangeListener listener) {
-	}
-
-	public Object getElementType() {
-		return elementType;
-	}
-
-	public int size() {
-		checkRealm();
-		return 0;
-	}
-
-	private void checkRealm() {
-		Assert.isTrue(realm.isCurrent(),
-				"Observable cannot be accessed outside its realm"); //$NON-NLS-1$
-	}
-
-	public boolean isEmpty() {
-		checkRealm();
-		return true;
-	}
-
-	public boolean contains(Object o) {
-		checkRealm();
-		return false;
-	}
-
-	public Iterator iterator() {
-		checkRealm();
-		return emptySet.iterator();
-	}
-
-	public Object[] toArray() {
-		checkRealm();
-		return emptySet.toArray();
-	}
-
-	public Object[] toArray(Object[] a) {
-		return emptySet.toArray(a);
-	}
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean remove(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean containsAll(Collection c) {
-		checkRealm();
-		return c.isEmpty();
-	}
-
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean retainAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean removeAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	public void addChangeListener(IChangeListener listener) {
-	}
-
-	public void removeChangeListener(IChangeListener listener) {
-	}
-
-	public void addStaleListener(IStaleListener listener) {
-	}
-
-	public void removeStaleListener(IStaleListener listener) {
-	}
-
-	public void addDisposeListener(IDisposeListener listener) {
-	}
-
-	public void removeDisposeListener(IDisposeListener listener) {
-	}
-
-	public boolean isStale() {
-		checkRealm();
-		return false;
-	}
-
-	public boolean isDisposed() {
-		return false;
-	}
-
-	public void dispose() {
-	}
-
-	public Realm getRealm() {
-		return realm;
-	}
-
-	public boolean equals(Object obj) {
-		checkRealm();
-		if (obj == this)
-			return true;
-		if (obj == null)
-			return false;
-		if (!(obj instanceof Set))
-			return false;
-
-		return ((Set) obj).isEmpty();
-	}
-
-	public int hashCode() {
-		checkRealm();
-		return 0;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/IStalenessConsumer.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/IStalenessConsumer.java
deleted file mode 100644
index cfe5c61..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/IStalenessConsumer.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-/**
- * @since 1.0
- * 
- */
-public interface IStalenessConsumer {
-	/**
-	 * @param stale
-	 * 
-	 */
-	public void setStale(boolean stale);
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/MapEntryObservableValue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/MapEntryObservableValue.java
deleted file mode 100644
index 3340eb6..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/MapEntryObservableValue.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Marko Topolnik and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Marko Topolnik - initial API and implementation (bug 184830)
- *     Matthew Hall - bug 184830
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.map.MapChangeEvent;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-
-/**
- * An {@link IObservableValue} that tracks the value of an entry in an
- * {@link IObservableMap}, identified by the entry's key.
- * 
- * @since 1.1
- */
-public class MapEntryObservableValue extends AbstractObservableValue {
-	private IObservableMap map;
-	private Object key;
-	private Object valueType;
-
-	private IMapChangeListener changeListener = new IMapChangeListener() {
-		public void handleMapChange(final MapChangeEvent event) {
-			if (event.diff.getAddedKeys().contains(key)) {
-				final Object newValue = event.diff.getNewValue(key);
-				if (newValue != null) {
-					fireValueChange(Diffs.createValueDiff(null, newValue));
-				}
-			} else if (event.diff.getChangedKeys().contains(key)) {
-				fireValueChange(Diffs.createValueDiff(event.diff
-						.getOldValue(key), event.diff.getNewValue(key)));
-			} else if (event.diff.getRemovedKeys().contains(key)) {
-				final Object oldValue = event.diff.getOldValue(key);
-				if (oldValue != null) {
-					fireValueChange(Diffs.createValueDiff(oldValue, null));
-				}
-			}
-		}
-	};
-
-	private IStaleListener staleListener = new IStaleListener() {
-		public void handleStale(StaleEvent staleEvent) {
-			fireStale();
-		}
-	};
-
-	/**
-	 * Creates a map entry observable.
-	 * 
-	 * @param map
-	 *            the observable map whose entry will be tracked
-	 * @param key
-	 *            the key identifying the entry whose value will be tracked
-	 * @param valueType
-	 *            the type of the value
-	 */
-	public MapEntryObservableValue(IObservableMap map, Object key,
-			Object valueType) {
-		super(map.getRealm());
-		this.map = map;
-		this.key = key;
-		this.valueType = valueType;
-
-		map.addMapChangeListener(changeListener);
-		map.addStaleListener(staleListener);
-	}
-
-	public Object getValueType() {
-		return this.valueType;
-	}
-
-	public boolean isStale() {
-		ObservableTracker.getterCalled(this);
-		return map.isStale();
-	}
-
-	public synchronized void dispose() {
-		if (map != null) {
-			map.removeMapChangeListener(changeListener);
-			map.removeStaleListener(staleListener);
-			map = null;
-			changeListener = null;
-			staleListener = null;
-		}
-		super.dispose();
-	}
-
-	protected Object doGetValue() {
-		return this.map.get(this.key);
-	}
-
-	protected void doSetValue(Object value) {
-		this.map.put(this.key, value);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/StalenessObservableValue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/StalenessObservableValue.java
deleted file mode 100644
index 6a07fad..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/StalenessObservableValue.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Boris Bokowski, IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 212468
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-
-/**
- * An observable value that tracks the staleness of an {@link IObservable}.
- * 
- * @since 1.1
- */
-public class StalenessObservableValue extends AbstractObservableValue {
-
-	private class MyListener implements IChangeListener, IStaleListener {
-		public void handleChange(ChangeEvent event) {
-			if (stale && !event.getObservable().isStale()) {
-				stale = false;
-				fireValueChange(Diffs.createValueDiff(Boolean.TRUE,
-						Boolean.FALSE));
-			}
-		}
-
-		public void handleStale(StaleEvent staleEvent) {
-			if (!stale) {
-				stale = true;
-				fireValueChange(Diffs.createValueDiff(Boolean.FALSE,
-						Boolean.TRUE));
-			}
-		}
-	}
-
-	private IObservable tracked;
-	private boolean stale;
-	private MyListener listener = new MyListener();
-
-	/**
-	 * Constructs a StalenessObservableValue that tracks the staleness of the
-	 * given {@link IObservable}.
-	 * 
-	 * @param observable
-	 *            the observable to track
-	 */
-	public StalenessObservableValue(IObservable observable) {
-		super(observable.getRealm());
-		this.tracked = observable;
-		this.stale = observable.isStale();
-		tracked.addChangeListener(listener);
-		tracked.addStaleListener(listener);
-	}
-
-	protected Object doGetValue() {
-		return tracked.isStale() ? Boolean.TRUE : Boolean.FALSE;
-	}
-
-	public Object getValueType() {
-		return Boolean.TYPE;
-	}
-
-	public synchronized void dispose() {
-		if (tracked != null) {
-			tracked.removeChangeListener(listener);
-			tracked.removeStaleListener(listener);
-			tracked = null;
-			listener = null;
-		}
-		super.dispose();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/StalenessTracker.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/StalenessTracker.java
deleted file mode 100644
index 6324325..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/StalenessTracker.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.internal.databinding.IdentityWrapper;
-
-/**
- * @since 1.0
- * 
- */
-public class StalenessTracker {
-
-	private Map staleMap = new HashMap();
-
-	private int staleCount = 0;
-
-	private final IStalenessConsumer stalenessConsumer;
-
-	private class ChildListener implements IStaleListener, IChangeListener {
-		public void handleStale(StaleEvent event) {
-			processStalenessChange((IObservable) event.getSource(), true);
-		}
-
-		public void handleChange(ChangeEvent event) {
-			processStalenessChange((IObservable) event.getSource(), true);
-		}
-	}
-
-	private ChildListener childListener = new ChildListener();
-
-	/**
-	 * @param observables
-	 * @param stalenessConsumer 
-	 */
-	public StalenessTracker(IObservable[] observables,
-			IStalenessConsumer stalenessConsumer) {
-		this.stalenessConsumer = stalenessConsumer;
-		for (int i = 0; i < observables.length; i++) {
-			IObservable observable = observables[i];
-			doAddObservable(observable, false);
-		}
-		stalenessConsumer.setStale(staleCount > 0);
-	}
-
-	/**
-	 * @param child
-	 * @param callback
-	 */
-	public void processStalenessChange(IObservable child, boolean callback) {
-		boolean oldStale = staleCount > 0;
-		IdentityWrapper wrappedChild = new IdentityWrapper(child);
-		boolean oldChildStale = getOldChildStale(wrappedChild);
-		boolean newChildStale = child.isStale();
-		if (oldChildStale != newChildStale) {
-			if (oldChildStale) {
-				staleCount--;
-			} else {
-				staleCount++;
-			}
-			staleMap.put(wrappedChild, newChildStale ? Boolean.TRUE : Boolean.FALSE);
-		}
-		boolean newStale = staleCount > 0;
-		if (callback && (newStale != oldStale)) {
-			stalenessConsumer.setStale(newStale);
-		}
-	}
-
-	/**
-	 * @param wrappedChild
-	 */
-	private boolean getOldChildStale(IdentityWrapper wrappedChild) {
-		Object oldChildValue = staleMap.get(wrappedChild);
-		boolean oldChildStale = oldChildValue == null ? false
-				: ((Boolean) oldChildValue).booleanValue();
-		return oldChildStale;
-	}
-
-	/**
-	 * @param observable
-	 */
-	public void addObservable(IObservable observable) {
-		doAddObservable(observable, true);
-	}
-
-	private void doAddObservable(IObservable observable, boolean callback) {
-		processStalenessChange(observable, callback);
-		observable.addChangeListener(childListener);
-		observable.addStaleListener(childListener);
-	}
-
-	/**
-	 * @param observable
-	 */
-	public void removeObservable(IObservable observable) {
-		boolean oldStale = staleCount > 0;
-		IdentityWrapper wrappedChild = new IdentityWrapper(observable);
-		boolean oldChildStale = getOldChildStale(wrappedChild);
-		if (oldChildStale) {
-			staleCount--;
-		}
-		staleMap.remove(wrappedChild);
-		observable.removeChangeListener(childListener);
-		observable.removeStaleListener(childListener);
-		boolean newStale = staleCount > 0;
-		if (newStale != oldStale) {
-			stalenessConsumer.setStale(newStale);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableList.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableList.java
deleted file mode 100644
index 6a11d68..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableList.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 Cerner Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 208332, 237718
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.databinding.observable.list.DecoratingObservableList;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-
-/**
- * ObservableList implementation that prevents modification by consumers. Events
- * in the originating wrapped list are propagated and thrown from this instance
- * when appropriate.  All mutators throw an UnsupportedOperationException.
- * 
- * @since 1.0
- */
-public class UnmodifiableObservableList extends DecoratingObservableList {
-	private List unmodifiableList;
-
-	/**
-	 * @param decorated
-	 */
-	public UnmodifiableObservableList(IObservableList decorated) {
-		super(decorated, false);
-		this.unmodifiableList = Collections.unmodifiableList(decorated);
-	}
-
-	public void add(int index, Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean addAll(int index, Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		return unmodifiableList.iterator();
-	}
-
-	public ListIterator listIterator() {
-		return listIterator(0);
-	}
-
-	public ListIterator listIterator(int index) {
-		getterCalled();
-		return unmodifiableList.listIterator(index);
-	}
-
-	public Object move(int oldIndex, int newIndex) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Object remove(int index) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean remove(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean removeAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean retainAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Object set(int index, Object element) {
-		throw new UnsupportedOperationException();
-	}
-
-	public List subList(int fromIndex, int toIndex) {
-		getterCalled();
-		return unmodifiableList.subList(fromIndex, toIndex);
-	}
-
-	public synchronized void dispose() {
-		unmodifiableList = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableMap.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableMap.java
deleted file mode 100644
index ac6beb2..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableMap.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - bug 237718
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.map.DecoratingObservableMap;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-
-/**
- * IObservableMap implementation that prevents modification by consumers. Events
- * in the originating wrapped map are propagated and thrown from this instance
- * when appropriate. All mutators throw an UnsupportedOperationException.
- * 
- * @since 1.0
- */
-public class UnmodifiableObservableMap extends DecoratingObservableMap {
-	Map unmodifiableMap;
-
-	/**
-	 * @param decorated
-	 */
-	public UnmodifiableObservableMap(IObservableMap decorated) {
-		super(decorated, false);
-		this.unmodifiableMap = Collections.unmodifiableMap(decorated);
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	public Set entrySet() {
-		getterCalled();
-		return unmodifiableMap.entrySet();
-	}
-
-	public Set keySet() {
-		getterCalled();
-		return unmodifiableMap.keySet();
-	}
-
-	public Object put(Object key, Object value) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void putAll(Map m) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Object remove(Object key) {
-		throw new UnsupportedOperationException();
-	}
-
-	public Collection values() {
-		getterCalled();
-		return unmodifiableMap.values();
-	}
-
-	public synchronized void dispose() {
-		unmodifiableMap = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableSet.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableSet.java
deleted file mode 100644
index 70df43c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableSet.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 208332)
- *     Brad Reynolds - initial API and implementation
- *         (through UnmodifiableObservableList.java)
- *     Matthew Hall - bug 237718
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.set.DecoratingObservableSet;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-
-/**
- * ObservableList implementation that prevents modification by consumers. Events
- * in the originating wrapped list are propagated and thrown from this instance
- * when appropriate. All mutators throw an UnsupportedOperationException.
- * 
- * @since 1.1
- */
-public class UnmodifiableObservableSet extends DecoratingObservableSet {
-	private Set unmodifiableSet;
-
-	/**
-	 * @param decorated
-	 */
-	public UnmodifiableObservableSet(IObservableSet decorated) {
-		super(decorated, false);
-
-		this.unmodifiableSet = Collections.unmodifiableSet(decorated);
-	}
-
-	public boolean add(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean addAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		return unmodifiableSet.iterator();
-	}
-
-	public boolean remove(Object o) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean removeAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean retainAll(Collection c) {
-		throw new UnsupportedOperationException();
-	}
-
-	public synchronized void dispose() {
-		unmodifiableSet = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableValue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableValue.java
deleted file mode 100644
index ae7ed17..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/UnmodifiableObservableValue.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 219909)
- *     Matthew Hall - bugs 237884, 237718
- *     Ovidio Mallo - bug 237163
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.value.DecoratingObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-
-/**
- * An unmodifiable wrapper class for IObservableValue instances.
- * @since 1.1
- */
-public class UnmodifiableObservableValue extends DecoratingObservableValue {
-	/**
-	 * Constructs an UnmodifiableObservableValue which wraps the given
-	 * observable value
-	 * 
-	 * @param wrappedValue
-	 *            the observable value to wrap in an unmodifiable instance.
-	 */
-	public UnmodifiableObservableValue(IObservableValue wrappedValue) {
-		super(wrappedValue, false);
-	}
-
-	public void setValue(Object value) {
-		throw new UnsupportedOperationException();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableList.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableList.java
deleted file mode 100644
index c1fa461..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableList.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 218269)
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiff;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.databinding.observable.list.ListDiffVisitor;
-import org.eclipse.core.databinding.observable.list.ObservableList;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * @since 3.3
- * 
- */
-public class ValidatedObservableList extends ObservableList {
-	private IObservableList target;
-	private IObservableValue validationStatus;
-
-	// Only true when out of sync with target due to validation status
-	private boolean stale;
-
-	// True when validaton status changes from invalid to valid.
-	private boolean computeNextDiff = false;
-
-	private boolean updatingTarget = false;
-
-	private IListChangeListener targetChangeListener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			if (updatingTarget)
-				return;
-			IStatus status = (IStatus) validationStatus.getValue();
-			if (isValid(status)) {
-				if (stale) {
-					// this.stale means we are out of sync with target,
-					// so reset wrapped list to exactly mirror target
-					stale = false;
-					updateWrappedList(new ArrayList(target));
-				} else {
-					ListDiff diff = event.diff;
-					if (computeNextDiff) {
-						diff = Diffs.computeListDiff(wrappedList, target);
-						computeNextDiff = false;
-					}
-					applyDiff(diff, wrappedList);
-					fireListChange(diff);
-				}
-			} else {
-				makeStale();
-			}
-		}
-	};
-
-	private static boolean isValid(IStatus status) {
-		return status.isOK() || status.matches(IStatus.INFO | IStatus.WARNING);
-	}
-
-	private IStaleListener targetStaleListener = new IStaleListener() {
-		public void handleStale(StaleEvent staleEvent) {
-			fireStale();
-		}
-	};
-
-	private IValueChangeListener validationStatusChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			IStatus oldStatus = (IStatus) event.diff.getOldValue();
-			IStatus newStatus = (IStatus) event.diff.getNewValue();
-			if (stale && !isValid(oldStatus) && isValid(newStatus)) {
-				// this.stale means we are out of sync with target,
-				// reset wrapped list to exactly mirror target
-				stale = false;
-				updateWrappedList(new ArrayList(target));
-
-				// If the validation status becomes valid because of a change in
-				// target observable
-				computeNextDiff = true;
-			}
-		}
-	};
-
-	/**
-	 * @param target
-	 * @param validationStatus
-	 */
-	public ValidatedObservableList(final IObservableList target,
-			final IObservableValue validationStatus) {
-		super(target.getRealm(), new ArrayList(target), target.getElementType());
-		Assert.isNotNull(validationStatus,
-				"Validation status observable cannot be null"); //$NON-NLS-1$
-		Assert
-				.isTrue(target.getRealm().equals(validationStatus.getRealm()),
-						"Target and validation status observables must be on the same realm"); //$NON-NLS-1$
-		this.target = target;
-		this.validationStatus = validationStatus;
-		target.addListChangeListener(targetChangeListener);
-		target.addStaleListener(targetStaleListener);
-		validationStatus.addValueChangeListener(validationStatusChangeListener);
-	}
-
-	private void makeStale() {
-		if (!stale) {
-			stale = true;
-			fireStale();
-		}
-	}
-
-	private void updateTargetList(ListDiff diff) {
-		updatingTarget = true;
-		try {
-			if (stale) {
-				stale = false;
-				applyDiff(Diffs.computeListDiff(target, wrappedList), target);
-			} else {
-				applyDiff(diff, target);
-			}
-		} finally {
-			updatingTarget = false;
-		}
-	}
-
-	private void applyDiff(ListDiff diff, final List list) {
-		diff.accept(new ListDiffVisitor() {
-			public void handleAdd(int index, Object element) {
-				list.add(index, element);
-			}
-
-			public void handleRemove(int index, Object element) {
-				list.remove(index);
-			}
-
-			public void handleReplace(int index, Object oldElement,
-					Object newElement) {
-				list.set(index, newElement);
-			}
-		});
-	}
-
-	public boolean isStale() {
-		ObservableTracker.getterCalled(this);
-		return stale || target.isStale();
-	}
-
-	public void add(int index, Object element) {
-		checkRealm();
-		wrappedList.add(index, element);
-		ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				true, element));
-		updateTargetList(diff);
-		fireListChange(diff);
-	}
-
-	public boolean add(Object o) {
-		checkRealm();
-		add(wrappedList.size(), o);
-		return true;
-	}
-
-	public boolean addAll(Collection c) {
-		checkRealm();
-		return addAll(wrappedList.size(), c);
-	}
-
-	public boolean addAll(int index, Collection c) {
-		checkRealm();
-		Object[] elements = c.toArray();
-		ListDiffEntry[] entries = new ListDiffEntry[elements.length];
-		for (int i = 0; i < elements.length; i++) {
-			wrappedList.add(index + i, elements[i]);
-			entries[i] = Diffs
-					.createListDiffEntry(index + i, true, elements[i]);
-		}
-		ListDiff diff = Diffs.createListDiff(entries);
-		updateTargetList(diff);
-		fireListChange(diff);
-		return true;
-	}
-
-	public void clear() {
-		checkRealm();
-		if (isEmpty())
-			return;
-		ListDiff diff = Diffs.computeListDiff(wrappedList,
-				Collections.EMPTY_LIST);
-		wrappedList.clear();
-		updateTargetList(diff);
-		fireListChange(diff);
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final ListIterator wrappedIterator = wrappedList.listIterator();
-		return new Iterator() {
-			Object last = null;
-
-			public boolean hasNext() {
-				return wrappedIterator.hasNext();
-			}
-
-			public Object next() {
-				return last = wrappedIterator.next();
-			}
-
-			public void remove() {
-				int index = wrappedIterator.previousIndex();
-				wrappedIterator.remove();
-				ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(
-						index, false, last));
-				updateTargetList(diff);
-				fireListChange(diff);
-			}
-		};
-	}
-
-	public ListIterator listIterator() {
-		return listIterator(0);
-	}
-
-	public ListIterator listIterator(int index) {
-		getterCalled();
-		final ListIterator wrappedIterator = wrappedList.listIterator(index);
-		return new ListIterator() {
-			int lastIndex = -1;
-			Object last = null;
-
-			public void add(Object o) {
-				wrappedIterator.add(o);
-				lastIndex = previousIndex();
-				ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(
-						lastIndex, true, o));
-				updateTargetList(diff);
-				fireListChange(diff);
-			}
-
-			public boolean hasNext() {
-				return wrappedIterator.hasNext();
-			}
-
-			public boolean hasPrevious() {
-				return wrappedIterator.hasPrevious();
-			}
-
-			public Object next() {
-				last = wrappedIterator.next();
-				lastIndex = previousIndex();
-				return last;
-			}
-
-			public int nextIndex() {
-				return wrappedIterator.nextIndex();
-			}
-
-			public Object previous() {
-				last = wrappedIterator.previous();
-				lastIndex = nextIndex();
-				return last;
-			}
-
-			public int previousIndex() {
-				return wrappedIterator.previousIndex();
-			}
-
-			public void remove() {
-				wrappedIterator.remove();
-				ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(
-						lastIndex, false, last));
-				lastIndex = -1;
-				updateTargetList(diff);
-				fireListChange(diff);
-			}
-
-			public void set(Object o) {
-				wrappedIterator.set(o);
-				ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(
-						lastIndex, false, last), Diffs.createListDiffEntry(
-						lastIndex, true, o));
-				last = o;
-				updateTargetList(diff);
-				fireListChange(diff);
-			}
-		};
-	}
-
-	public Object move(int oldIndex, int newIndex) {
-		checkRealm();
-		int size = wrappedList.size();
-		if (oldIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"oldIndex: " + oldIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		if (newIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"newIndex: " + newIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		if (oldIndex == newIndex)
-			return wrappedList.get(oldIndex);
-		Object element = wrappedList.remove(oldIndex);
-		wrappedList.add(newIndex, element);
-		ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(
-				oldIndex, false, element), Diffs.createListDiffEntry(newIndex,
-				true, element));
-		updateTargetList(diff);
-		fireListChange(diff);
-		return element;
-	}
-
-	public Object remove(int index) {
-		checkRealm();
-		Object element = wrappedList.remove(index);
-		ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				false, element));
-		updateTargetList(diff);
-		fireListChange(diff);
-		return element;
-	}
-
-	public boolean remove(Object o) {
-		checkRealm();
-		int index = wrappedList.indexOf(o);
-		if (index == -1)
-			return false;
-		remove(index);
-		return true;
-	}
-
-	public boolean removeAll(Collection c) {
-		checkRealm();
-		List list = new ArrayList(wrappedList);
-		boolean changed = list.removeAll(c);
-		if (changed) {
-			ListDiff diff = Diffs.computeListDiff(wrappedList, list);
-			wrappedList = list;
-			updateTargetList(diff);
-			fireListChange(diff);
-		}
-		return changed;
-	}
-
-	public boolean retainAll(Collection c) {
-		checkRealm();
-		List list = new ArrayList(wrappedList);
-		boolean changed = list.retainAll(c);
-		if (changed) {
-			ListDiff diff = Diffs.computeListDiff(wrappedList, list);
-			wrappedList = list;
-			updateTargetList(diff);
-			fireListChange(diff);
-		}
-		return changed;
-	}
-
-	public Object set(int index, Object element) {
-		checkRealm();
-		Object oldElement = wrappedList.set(index, element);
-		ListDiff diff = Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				false, oldElement), Diffs.createListDiffEntry(index, true,
-				element));
-		updateTargetList(diff);
-		fireListChange(diff);
-		return oldElement;
-	}
-
-	public synchronized void dispose() {
-		target.removeListChangeListener(targetChangeListener);
-		target.removeStaleListener(targetStaleListener);
-		validationStatus
-				.removeValueChangeListener(validationStatusChangeListener);
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableMap.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableMap.java
deleted file mode 100644
index 4026527..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableMap.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 218269)
- *     Matthew Hall - bug 226289
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.map.MapChangeEvent;
-import org.eclipse.core.databinding.observable.map.MapDiff;
-import org.eclipse.core.databinding.observable.map.ObservableMap;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * @since 3.3
- * 
- */
-public class ValidatedObservableMap extends ObservableMap {
-	private IObservableMap target;
-	private IObservableValue validationStatus;
-
-	// Only true when out of sync with target due to validation status
-	private boolean stale;
-
-	// True when validation status changes from invalid to valid.
-	private boolean computeNextDiff = false;
-
-	private boolean updatingTarget = false;
-
-	private IMapChangeListener targetChangeListener = new IMapChangeListener() {
-		public void handleMapChange(MapChangeEvent event) {
-			if (updatingTarget)
-				return;
-			IStatus status = (IStatus) validationStatus.getValue();
-			if (isValid(status)) {
-				if (stale) {
-					// this.stale means we are out of sync with target,
-					// so reset wrapped list to exactly mirror target
-					stale = false;
-					updateWrappedMap(new HashMap(target));
-				} else {
-					MapDiff diff = event.diff;
-					if (computeNextDiff) {
-						diff = Diffs.computeMapDiff(wrappedMap, target);
-						computeNextDiff = false;
-					}
-					applyDiff(diff, wrappedMap);
-					fireMapChange(diff);
-				}
-			} else {
-				makeStale();
-			}
-		}
-	};
-
-	private IStaleListener targetStaleListener = new IStaleListener() {
-		public void handleStale(StaleEvent staleEvent) {
-			fireStale();
-		}
-	};
-
-	private IValueChangeListener validationStatusChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			IStatus oldStatus = (IStatus) event.diff.getOldValue();
-			IStatus newStatus = (IStatus) event.diff.getNewValue();
-			if (stale && !isValid(oldStatus) && isValid(newStatus)) {
-				// this.stale means we are out of sync with target,
-				// reset wrapped map to exactly mirror target
-				stale = false;
-				updateWrappedMap(new HashMap(target));
-
-				// If the validation status becomes valid because of a change in
-				// target observable
-				computeNextDiff = true;
-			}
-		}
-	};
-
-	/**
-	 * @param target
-	 * @param validationStatus
-	 */
-	public ValidatedObservableMap(final IObservableMap target,
-			final IObservableValue validationStatus) {
-		super(target.getRealm(), new HashMap(target));
-		Assert.isNotNull(validationStatus,
-				"Validation status observable cannot be null"); //$NON-NLS-1$
-		Assert
-				.isTrue(target.getRealm().equals(validationStatus.getRealm()),
-						"Target and validation status observables must be on the same realm"); //$NON-NLS-1$
-		this.target = target;
-		this.validationStatus = validationStatus;
-		target.addMapChangeListener(targetChangeListener);
-		target.addStaleListener(targetStaleListener);
-		validationStatus.addValueChangeListener(validationStatusChangeListener);
-	}
-
-	private void updateWrappedMap(Map newMap) {
-		Map oldMap = wrappedMap;
-		MapDiff diff = Diffs.computeMapDiff(oldMap, newMap);
-		wrappedMap = newMap;
-		fireMapChange(diff);
-	}
-
-	private static boolean isValid(IStatus status) {
-		return status.isOK() || status.matches(IStatus.INFO | IStatus.WARNING);
-	}
-
-	private void applyDiff(MapDiff diff, Map map) {
-		for (Iterator iterator = diff.getRemovedKeys().iterator(); iterator
-				.hasNext();)
-			map.remove(iterator.next());
-		for (Iterator iterator = diff.getChangedKeys().iterator(); iterator
-				.hasNext();) {
-			Object key = iterator.next();
-			map.put(key, diff.getNewValue(key));
-		}
-		for (Iterator iterator = diff.getAddedKeys().iterator(); iterator
-				.hasNext();) {
-			Object key = iterator.next();
-			map.put(key, diff.getNewValue(key));
-		}
-	}
-
-	private void makeStale() {
-		if (!stale) {
-			stale = true;
-			fireStale();
-		}
-	}
-
-	private void updateTargetMap(MapDiff diff) {
-		updatingTarget = true;
-		try {
-			if (stale) {
-				stale = false;
-				applyDiff(Diffs.computeMapDiff(target, wrappedMap), target);
-			} else {
-				applyDiff(diff, target);
-			}
-		} finally {
-			updatingTarget = false;
-		}
-	}
-
-	public boolean isStale() {
-		getterCalled();
-		return stale || target.isStale();
-	}
-
-	public void clear() {
-		checkRealm();
-		if (isEmpty())
-			return;
-		MapDiff diff = Diffs.computeMapDiff(wrappedMap, Collections.EMPTY_MAP);
-		wrappedMap = new HashMap();
-		updateTargetMap(diff);
-		fireMapChange(diff);
-	}
-
-	public Object put(Object key, Object value) {
-		checkRealm();
-		MapDiff diff;
-		Object oldValue;
-		if (wrappedMap.containsKey(key)) {
-			oldValue = wrappedMap.put(key, value);
-			if (wrappedMap.containsKey(key)) { // Changed
-				diff = Diffs.createMapDiffSingleChange(key, oldValue, value);
-			} else { // Removed
-				diff = Diffs.createMapDiffSingleRemove(key, oldValue);
-			}
-		} else { // Added
-			oldValue = wrappedMap.put(key, value);
-			diff = Diffs.createMapDiffSingleAdd(key, value);
-		}
-		updateTargetMap(diff);
-		fireMapChange(diff);
-		return oldValue;
-	}
-
-	public void putAll(Map m) {
-		checkRealm();
-		Map map = new HashMap(wrappedMap);
-		map.putAll(m);
-		MapDiff diff = Diffs.computeMapDiff(wrappedMap, map);
-		wrappedMap = map;
-		updateTargetMap(diff);
-		fireMapChange(diff);
-	}
-
-	public Object remove(Object key) {
-		checkRealm();
-		if (!wrappedMap.containsKey(key))
-			return null;
-		Object oldValue = wrappedMap.remove(key);
-		MapDiff diff = Diffs.createMapDiffSingleRemove(key, oldValue);
-		updateTargetMap(diff);
-		fireMapChange(diff);
-		return oldValue;
-	}
-
-	public Object getKeyType() {
-		return target.getKeyType();
-	}
-
-	public Object getValueType() {
-		return target.getValueType();
-	}
-
-	public synchronized void dispose() {
-		target.removeMapChangeListener(targetChangeListener);
-		target.removeStaleListener(targetStaleListener);
-		validationStatus
-				.removeValueChangeListener(validationStatusChangeListener);
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableSet.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableSet.java
deleted file mode 100644
index bb7c6e6..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableSet.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 218269)
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.ObservableSet;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-import org.eclipse.core.databinding.observable.set.SetDiff;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * @since 3.3
- * 
- */
-public class ValidatedObservableSet extends ObservableSet {
-	private IObservableSet target;
-	private IObservableValue validationStatus;
-
-	// Only true when out of sync with target due to validation status
-	private boolean stale;
-
-	// True when validation status changes from invalid to valid.
-	private boolean computeNextDiff = false;
-
-	private boolean updatingTarget = false;
-
-	private ISetChangeListener targetChangeListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			if (updatingTarget)
-				return;
-			IStatus status = (IStatus) validationStatus.getValue();
-			if (isValid(status)) {
-				if (stale) {
-					// this.stale means we are out of sync with target,
-					// so reset wrapped list to exactly mirror target
-					stale = false;
-					updateWrappedSet(new HashSet(target));
-				} else {
-					SetDiff diff = event.diff;
-					if (computeNextDiff) {
-						diff = Diffs.computeSetDiff(wrappedSet, target);
-						computeNextDiff = false;
-					}
-					applyDiff(diff, wrappedSet);
-					fireSetChange(diff);
-				}
-			} else {
-				makeStale();
-			}
-		}
-	};
-
-	private IStaleListener targetStaleListener = new IStaleListener() {
-		public void handleStale(StaleEvent staleEvent) {
-			fireStale();
-		}
-	};
-
-	private IValueChangeListener validationStatusChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			IStatus oldStatus = (IStatus) event.diff.getOldValue();
-			IStatus newStatus = (IStatus) event.diff.getNewValue();
-			if (stale && !isValid(oldStatus) && isValid(newStatus)) {
-				// this.stale means we are out of sync with target,
-				// reset wrapped set to exactly mirror target
-				stale = false;
-				updateWrappedSet(new HashSet(target));
-
-				// If the validation status becomes valid because of a change in
-				// target observable
-				computeNextDiff = true;
-			}
-		}
-	};
-
-	/**
-	 * @param target
-	 * @param validationStatus
-	 */
-	public ValidatedObservableSet(final IObservableSet target,
-			final IObservableValue validationStatus) {
-		super(target.getRealm(), new HashSet(target), target.getElementType());
-		Assert.isNotNull(validationStatus,
-				"Validation status observable cannot be null"); //$NON-NLS-1$
-		Assert
-				.isTrue(target.getRealm().equals(validationStatus.getRealm()),
-						"Target and validation status observables must be on the same realm"); //$NON-NLS-1$
-		this.target = target;
-		this.validationStatus = validationStatus;
-		target.addSetChangeListener(targetChangeListener);
-		target.addStaleListener(targetStaleListener);
-		validationStatus.addValueChangeListener(validationStatusChangeListener);
-	}
-
-	private void updateWrappedSet(Set newSet) {
-		Set oldSet = wrappedSet;
-		SetDiff diff = Diffs.computeSetDiff(oldSet, newSet);
-		wrappedSet = newSet;
-		fireSetChange(diff);
-	}
-
-	private static boolean isValid(IStatus status) {
-		return status.isOK() || status.matches(IStatus.INFO | IStatus.WARNING);
-	}
-
-	private void applyDiff(SetDiff diff, Set set) {
-		for (Iterator iterator = diff.getRemovals().iterator(); iterator
-				.hasNext();) {
-			set.remove(iterator.next());
-		}
-		for (Iterator iterator = diff.getAdditions().iterator(); iterator
-				.hasNext();) {
-			set.add(iterator.next());
-		}
-	}
-
-	private void makeStale() {
-		if (!stale) {
-			stale = true;
-			fireStale();
-		}
-	}
-
-	private void updateTargetSet(SetDiff diff) {
-		updatingTarget = true;
-		try {
-			if (stale) {
-				stale = false;
-				applyDiff(Diffs.computeSetDiff(target, wrappedSet), target);
-			} else {
-				applyDiff(diff, target);
-			}
-		} finally {
-			updatingTarget = false;
-		}
-	}
-
-	public boolean isStale() {
-		getterCalled();
-		return stale || target.isStale();
-	}
-
-	public boolean add(Object o) {
-		getterCalled();
-		boolean changed = wrappedSet.add(o);
-		if (changed) {
-			SetDiff diff = Diffs.createSetDiff(Collections.singleton(o),
-					Collections.EMPTY_SET);
-			updateTargetSet(diff);
-			fireSetChange(diff);
-		}
-		return changed;
-	}
-
-	public boolean addAll(Collection c) {
-		getterCalled();
-		HashSet set = new HashSet(wrappedSet);
-		boolean changed = set.addAll(c);
-		if (changed) {
-			SetDiff diff = Diffs.computeSetDiff(wrappedSet, set);
-			wrappedSet = set;
-			updateTargetSet(diff);
-			fireSetChange(diff);
-		}
-		return changed;
-	}
-
-	public void clear() {
-		getterCalled();
-		if (isEmpty())
-			return;
-		SetDiff diff = Diffs.createSetDiff(Collections.EMPTY_SET, wrappedSet);
-		wrappedSet = new HashSet();
-		updateTargetSet(diff);
-		fireSetChange(diff);
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final Iterator wrappedIterator = wrappedSet.iterator();
-		return new Iterator() {
-			Object last = null;
-
-			public boolean hasNext() {
-				return wrappedIterator.hasNext();
-			}
-
-			public Object next() {
-				return last = wrappedIterator.next();
-			}
-
-			public void remove() {
-				wrappedIterator.remove();
-				SetDiff diff = Diffs.createSetDiff(Collections.EMPTY_SET,
-						Collections.singleton(last));
-				updateTargetSet(diff);
-				fireSetChange(diff);
-			}
-		};
-	}
-
-	public boolean remove(Object o) {
-		getterCalled();
-		boolean changed = wrappedSet.remove(o);
-		if (changed) {
-			SetDiff diff = Diffs.createSetDiff(Collections.EMPTY_SET,
-					Collections.singleton(o));
-			updateTargetSet(diff);
-			fireSetChange(diff);
-		}
-		return changed;
-	}
-
-	public boolean removeAll(Collection c) {
-		getterCalled();
-		Set set = new HashSet(wrappedSet);
-		boolean changed = set.removeAll(c);
-		if (changed) {
-			SetDiff diff = Diffs.computeSetDiff(wrappedSet, set);
-			wrappedSet = set;
-			updateTargetSet(diff);
-			fireSetChange(diff);
-		}
-		return changed;
-	}
-
-	public boolean retainAll(Collection c) {
-		getterCalled();
-		Set set = new HashSet(wrappedSet);
-		boolean changed = set.retainAll(c);
-		if (changed) {
-			SetDiff diff = Diffs.computeSetDiff(wrappedSet, set);
-			wrappedSet = set;
-			updateTargetSet(diff);
-			fireSetChange(diff);
-		}
-		return changed;
-	}
-
-	public synchronized void dispose() {
-		target.removeSetChangeListener(targetChangeListener);
-		target.removeStaleListener(targetStaleListener);
-		validationStatus
-				.removeValueChangeListener(validationStatusChangeListener);
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableValue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableValue.java
deleted file mode 100644
index 1164f53..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/ValidatedObservableValue.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 218269)
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.IVetoableValue;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.databinding.observable.value.ValueChangingEvent;
-import org.eclipse.core.internal.databinding.Util;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * An {@link IObservableValue} wrapper that stays in sync with the target
- * observable as long as a given validation status is valid.
- * <ul>
- * <li>While status is valid, ValidatedObservableValue stays in sync with its
- * target.
- * <li>When status becomes invalid, ValidatedObservableValue will retain the
- * last valid value of its target.
- * <li>While status is invalid, changes in the target observable cause
- * ValidatedObservableValue to fire a stale event, to indicate that changes are
- * pending.
- * <li>When status becomes valid, pending value changes are performed (if any)
- * and synchronization resumes.
- * </ul>
- * <p>
- * Note:
- * <ul>
- * <li>By default, a status is valid if its
- * {@link IStatus#getSeverity() severity} is {@link IStatus#OK OK},
- * {@link IStatus#INFO INFO}, or {@link IStatus#WARNING WARNING}
- * <li>Calls to {@link #setValue(Object)} on the validated observable changes
- * the value regardless of the validation status.
- * <li>This class will not forward {@link ValueChangingEvent} events from a
- * wrapped {@link IVetoableValue}.
- * </ul>
- * 
- * @since 1.2
- */
-public class ValidatedObservableValue extends AbstractObservableValue {
-	private IObservableValue target;
-	private IObservableValue validationStatus;
-
-	private Object cachedValue;
-	private boolean stale;
-	private boolean updatingTarget = false;
-
-	private IValueChangeListener targetChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			if (updatingTarget)
-				return;
-			IStatus status = (IStatus) validationStatus.getValue();
-			if (isValid(status))
-				internalSetValue(event.diff.getNewValue(), false);
-			else
-				makeStale();
-		}
-	};
-
-	private static boolean isValid(IStatus status) {
-		return status.isOK() || status.matches(IStatus.INFO | IStatus.WARNING);
-	}
-
-	private IStaleListener targetStaleListener = new IStaleListener() {
-		public void handleStale(StaleEvent staleEvent) {
-			fireStale();
-		}
-	};
-
-	private IValueChangeListener validationStatusChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			IStatus oldStatus = (IStatus) event.diff.getOldValue();
-			IStatus newStatus = (IStatus) event.diff.getNewValue();
-			if (stale && !isValid(oldStatus) && isValid(newStatus)) {
-				internalSetValue(target.getValue(), false);
-			}
-		}
-	};
-
-	/**
-	 * Constructs an observable value
-	 * 
-	 * @param target
-	 *            the observable value to be wrapped
-	 * @param validationStatus
-	 *            an observable value of type {@link IStatus}.class which
-	 *            contains the current validation status
-	 */
-	public ValidatedObservableValue(IObservableValue target,
-			IObservableValue validationStatus) {
-		super(target.getRealm());
-		Assert.isNotNull(validationStatus,
-				"Validation status observable cannot be null"); //$NON-NLS-1$
-		Assert
-				.isTrue(target.getRealm().equals(validationStatus.getRealm()),
-						"Target and validation status observables must be on the same realm"); //$NON-NLS-1$
-		this.target = target;
-		this.validationStatus = validationStatus;
-		this.cachedValue = target.getValue();
-
-		target.addValueChangeListener(targetChangeListener);
-		target.addStaleListener(targetStaleListener);
-		validationStatus.addValueChangeListener(validationStatusChangeListener);
-	}
-
-	private void makeStale() {
-		if (!stale) {
-			stale = true;
-			fireStale();
-		}
-	}
-
-	public boolean isStale() {
-		ObservableTracker.getterCalled(this);
-		return stale || target.isStale();
-	}
-
-	protected Object doGetValue() {
-		return cachedValue;
-	}
-
-	private void internalSetValue(Object value, boolean updateTarget) {
-		Object oldValue = cachedValue;
-		cachedValue = value;
-		if (updateTarget) {
-			updatingTarget = true;
-			try {
-				target.setValue(value);
-				cachedValue = target.getValue();
-			} finally {
-				updatingTarget = false;
-			}
-		}
-		stale = false;
-		if (!Util.equals(oldValue, cachedValue))
-			fireValueChange(Diffs.createValueDiff(oldValue, cachedValue));
-	}
-
-	protected void doSetValue(Object value) {
-		internalSetValue(value, true);
-	}
-
-	public Object getValueType() {
-		return target.getValueType();
-	}
-
-	public synchronized void dispose() {
-		target.removeValueChangeListener(targetChangeListener);
-		target.removeStaleListener(targetStaleListener);
-		validationStatus
-				.removeValueChangeListener(validationStatusChangeListener);
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableHelper.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableHelper.java
deleted file mode 100644
index 69f8ebd..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableHelper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 246782)
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.masterdetail;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.internal.databinding.Util;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/* package */class DetailObservableHelper {
-	/* package */static void warnIfDifferentRealms(Realm detailRealm,
-			Realm innerObservableRealm) {
-		if (!Util.equals(detailRealm, innerObservableRealm)) {
-			Throwable throwable = new Throwable();
-			throwable.fillInStackTrace();
-			String message = "Inner observable realm (" + innerObservableRealm //$NON-NLS-1$
-					+ ") not equal to detail realm (" //$NON-NLS-1$
-					+ detailRealm + ")"; //$NON-NLS-1$
-			Policy.getLog().log(
-					new Status(IStatus.WARNING, Policy.JFACE_DATABINDING,
-							message, throwable));
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableList.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableList.java
deleted file mode 100755
index 8d0598c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableList.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 147515
- *     Matthew Hall - bug 221351, 247875, 246782
- *     Ovidio Mallo - bug 241318
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.masterdetail;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObserving;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ObservableList;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * @since 3.2
- * 
- */
-
-public class DetailObservableList extends ObservableList implements IObserving {
-
-	private boolean updating = false;
-
-	private IListChangeListener innerChangeListener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			if (!updating) {
-				fireListChange(event.diff);
-			}
-		}
-	};
-
-	private Object currentOuterValue;
-
-	private IObservableList innerObservableList;
-
-	private IObservableFactory factory;
-
-	private IObservableValue outerObservableValue;
-
-	private Object detailType;
-
-	/**
-	 * @param factory
-	 * @param outerObservableValue
-	 * @param detailType
-	 */
-	public DetailObservableList(IObservableFactory factory,
-			IObservableValue outerObservableValue, Object detailType) {
-		super(outerObservableValue.getRealm(), Collections.EMPTY_LIST, detailType);
-		this.factory = factory;
-		this.outerObservableValue = outerObservableValue;
-		this.detailType = detailType;
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				updateInnerObservableList();
-			}
-		});
-		outerObservableValue.addValueChangeListener(outerChangeListener);
-	}
-
-	IValueChangeListener outerChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			ObservableTracker.runAndIgnore(new Runnable() {
-				public void run() {
-					List oldList = new ArrayList(wrappedList);
-					updateInnerObservableList();
-					fireListChange(Diffs.computeListDiff(oldList, wrappedList));
-				}
-			});
-		}
-	};
-
-	private void updateInnerObservableList() {
-		if (innerObservableList != null) {
-			innerObservableList.removeListChangeListener(innerChangeListener);
-			innerObservableList.dispose();
-		}
-		currentOuterValue = outerObservableValue.getValue();
-		if (currentOuterValue == null) {
-			innerObservableList = null;
-			wrappedList = Collections.EMPTY_LIST;
-		} else {
-			this.innerObservableList = (IObservableList) factory
-					.createObservable(currentOuterValue);
-			DetailObservableHelper.warnIfDifferentRealms(getRealm(),
-					innerObservableList.getRealm());
-			wrappedList = innerObservableList;
-
-			if (detailType != null) {
-				Object innerValueType = innerObservableList.getElementType();
-				Assert.isTrue(getElementType().equals(innerValueType),
-						"Cannot change value type in a nested observable list"); //$NON-NLS-1$
-			}
-			innerObservableList.addListChangeListener(innerChangeListener);
-		}
-	}
-
-	public boolean add(final Object o) {
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.add(o);
-			}
-		});
-		return result[0];
-	}
-
-	public void add(final int index, final Object element) {
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				wrappedList.add(index, element);
-			}
-		});
-	}
-
-	public boolean remove(final Object o) {
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.remove(o);
-			}
-		});
-		return result[0];
-	}
-
-	public Object set(final int index, final Object element) {
-		final Object[] result = new Object[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.set(index, element);
-			}
-		});
-		return result[0];
-	}
-
-	public Object move(final int oldIndex, final int newIndex) {
-		if (innerObservableList != null) {
-			final Object[] result = new Object[1];
-			ObservableTracker.runAndIgnore(new Runnable() {
-				public void run() {
-					result[0] = innerObservableList.move(oldIndex, newIndex);
-				}
-			});
-			return result[0];
-		}
-		return super.move(oldIndex, newIndex);
-	}
-
-	public Object remove(final int index) {
-		final Object[] result = new Object[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.remove(index);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean addAll(final Collection c) {
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.addAll(c);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean addAll(final int index, final Collection c) {
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.addAll(index, c);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean removeAll(final Collection c) {
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.removeAll(c);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean retainAll(final Collection c) {
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedList.retainAll(c);
-			}
-		});
-		return result[0];
-	}
-
-	public void clear() {
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				wrappedList.clear();
-			}
-		});
-	}
-	
-	public synchronized void dispose() {
-		super.dispose();
-
-		if (outerObservableValue != null) {
-			outerObservableValue.removeValueChangeListener(outerChangeListener);
-		}
-		if (innerObservableList != null) {
-			innerObservableList.removeListChangeListener(innerChangeListener);
-			innerObservableList.dispose();
-		}
-		outerObservableValue = null;
-		outerChangeListener = null;
-		currentOuterValue = null;
-		factory = null;
-		innerObservableList = null;
-		innerChangeListener = null;
-	}
-
-	public Object getObserved() {
-		if (innerObservableList instanceof IObserving) {
-			return ((IObserving) innerObservableList).getObserved();
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableMap.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableMap.java
deleted file mode 100644
index 1cafa6b..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableMap.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 221704)
- *     Matthew Hall - bug 223114, 226289, 247875, 246782
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.masterdetail;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObserving;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.map.MapChangeEvent;
-import org.eclipse.core.databinding.observable.map.ObservableMap;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * @since 1.1
- * 
- */
-public class DetailObservableMap extends ObservableMap implements IObserving {
-	private boolean updating = false;
-
-	private IObservableValue master;
-	private IObservableFactory detailFactory;
-
-	private IObservableMap detailMap;
-
-	private Object detailKeyType;
-	private Object detailValueType;
-
-	private IValueChangeListener masterChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			ObservableTracker.runAndIgnore(new Runnable() {
-				public void run() {
-					Map oldMap = new HashMap(wrappedMap);
-					updateDetailMap();
-					fireMapChange(Diffs.computeMapDiff(oldMap, wrappedMap));
-				}
-			});
-		}
-	};
-
-	private IMapChangeListener detailChangeListener = new IMapChangeListener() {
-		public void handleMapChange(MapChangeEvent event) {
-			if (!updating) {
-				fireMapChange(event.diff);
-			}
-		}
-	};
-
-	/**
-	 * Constructs a new DetailObservableMap
-	 * 
-	 * @param detailFactory
-	 *            observable factory that creates IObservableMap instances given
-	 *            the current value of master observable value
-	 * @param master
-	 * @param keyType
-	 * @param valueType
-	 * 
-	 */
-	public DetailObservableMap(IObservableFactory detailFactory,
-			IObservableValue master, Object keyType, Object valueType) {
-		super(master.getRealm(), Collections.EMPTY_MAP);
-		this.master = master;
-		this.detailFactory = detailFactory;
-
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				updateDetailMap();
-			}
-		});
-		master.addValueChangeListener(masterChangeListener);
-	}
-
-	private void updateDetailMap() {
-		Object masterValue = master.getValue();
-		if (detailMap != null) {
-			detailMap.removeMapChangeListener(detailChangeListener);
-			detailMap.dispose();
-		}
-
-		if (masterValue == null) {
-			detailMap = null;
-			wrappedMap = Collections.EMPTY_MAP;
-		} else {
-			detailMap = (IObservableMap) detailFactory
-					.createObservable(masterValue);
-			DetailObservableHelper.warnIfDifferentRealms(getRealm(),
-					detailMap.getRealm());
-			wrappedMap = detailMap;
-
-			if (detailKeyType != null) {
-				Object innerKeyType = detailMap.getKeyType();
-
-				Assert.isTrue(detailKeyType.equals(innerKeyType),
-						"Cannot change key type in a nested observable map"); //$NON-NLS-1$
-			}
-
-			if (detailValueType != null) {
-				Object innerValueType = detailMap.getValueType();
-
-				Assert.isTrue(detailValueType.equals(innerValueType),
-						"Cannot change value type in a nested observable map"); //$NON-NLS-1$
-			}
-
-			detailMap.addMapChangeListener(detailChangeListener);
-		}
-	}
-
-	public Object getKeyType() {
-		return detailKeyType;
-	}
-
-	public Object getValueType() {
-		return detailValueType;
-	}
-
-	public Object put(final Object key, final Object value) {
-		final Object[] result = new Object[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = detailMap.put(key, value);
-			}
-		});
-		return result[0];
-	}
-
-	public void putAll(final Map map) {
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				detailMap.putAll(map);
-			}
-		});
-	}
-
-	public Object remove(final Object key) {
-		final Object[] result = new Object[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = detailMap.remove(key);
-			}
-		});
-		return result[0];
-	}
-
-	public void clear() {
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				detailMap.clear();
-			}
-		});
-	}
-
-	public synchronized void dispose() {
-		if (master != null) {
-			master.removeValueChangeListener(masterChangeListener);
-			master = null;
-			masterChangeListener = null;
-		}
-		detailFactory = null;
-		if (detailMap != null) {
-			detailMap.removeMapChangeListener(detailChangeListener);
-			detailMap.dispose();
-			detailMap = null;
-		}
-		detailChangeListener = null;
-		super.dispose();
-	}
-
-	public Object getObserved() {
-		if (detailMap instanceof IObserving) {
-			return ((IObserving) detailMap).getObserved();
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableSet.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableSet.java
deleted file mode 100755
index 297a144..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableSet.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 221351, 247875, 246782
- *     Ovidio Mallo - bug 241318
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.masterdetail;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObserving;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.ObservableSet;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * @since 3.2
- * 
- */
-public class DetailObservableSet extends ObservableSet implements IObserving {
-
-	private boolean updating = false;
-
-	private ISetChangeListener innerChangeListener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			if (!updating) {
-				fireSetChange(event.diff);
-			}
-		}
-	};
-
-	private Object currentOuterValue;
-
-	private IObservableSet innerObservableSet;
-
-	private IObservableValue outerObservableValue;
-
-	private IObservableFactory factory;
-
-	/**
-	 * @param factory
-	 * @param outerObservableValue
-	 * @param detailType
-	 */
-	public DetailObservableSet(IObservableFactory factory,
-			IObservableValue outerObservableValue, Object detailType) {
-		super(outerObservableValue.getRealm(), Collections.EMPTY_SET,
-				detailType);
-		this.factory = factory;
-		this.outerObservableValue = outerObservableValue;
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				updateInnerObservableSet();
-			}
-		});
-
-		outerObservableValue.addValueChangeListener(outerChangeListener);
-	}
-
-	IValueChangeListener outerChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			ObservableTracker.runAndIgnore(new Runnable() {
-				public void run() {
-					Set oldSet = new HashSet(wrappedSet);
-					updateInnerObservableSet();
-					fireSetChange(Diffs.computeSetDiff(oldSet, wrappedSet));
-				}
-			});
-		}
-	};
-
-	private void updateInnerObservableSet() {
-		currentOuterValue = outerObservableValue.getValue();
-		if (innerObservableSet != null) {
-			innerObservableSet.removeSetChangeListener(innerChangeListener);
-			innerObservableSet.dispose();
-		}
-		if (currentOuterValue == null) {
-			innerObservableSet = null;
-			wrappedSet = Collections.EMPTY_SET;
-		} else {
-			this.innerObservableSet = (IObservableSet) factory
-					.createObservable(currentOuterValue);
-			DetailObservableHelper.warnIfDifferentRealms(getRealm(),
-					innerObservableSet.getRealm());
-			wrappedSet = innerObservableSet;
-
-			if (elementType != null) {
-				Object innerValueType = innerObservableSet.getElementType();
-
-				Assert.isTrue(elementType.equals(innerValueType),
-						"Cannot change value type in a nested observable set"); //$NON-NLS-1$
-			}
-
-			innerObservableSet.addSetChangeListener(innerChangeListener);
-		}
-	}
-
-	public boolean add(final Object o) {
-		getterCalled();
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedSet.add(o);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean remove(final Object o) {
-		getterCalled();
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedSet.remove(o);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean addAll(final Collection c) {
-		getterCalled();
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedSet.addAll(c);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean removeAll(final Collection c) {
-		getterCalled();
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedSet.removeAll(c);
-			}
-		});
-		return result[0];
-	}
-
-	public boolean retainAll(final Collection c) {
-		getterCalled();
-		final boolean[] result = new boolean[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = wrappedSet.retainAll(c);
-			}
-		});
-		return result[0];
-	}
-
-	public void clear() {
-		getterCalled();
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				wrappedSet.clear();
-			}
-		});
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-
-		if (outerObservableValue != null) {
-			outerObservableValue.removeValueChangeListener(outerChangeListener);
-		}
-		if (innerObservableSet != null) {
-			innerObservableSet.removeSetChangeListener(innerChangeListener);
-			innerObservableSet.dispose();
-		}
-		outerObservableValue = null;
-		outerChangeListener = null;
-		currentOuterValue = null;
-		factory = null;
-		innerObservableSet = null;
-		innerChangeListener = null;
-	}
-
-	public Object getObserved() {
-		if (innerObservableSet instanceof IObserving) {
-			return ((IObserving) innerObservableSet).getObserved();
-		}
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableValue.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableValue.java
deleted file mode 100755
index fed9ea7..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/masterdetail/DetailObservableValue.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Brad Reynolds - bug 147515
- *     Ovidio Mallo - bug 241318
- *     Matthew Hall - bug 247875, 246782
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.masterdetail;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObserving;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * @since 1.0
- * 
- */
-public class DetailObservableValue extends AbstractObservableValue implements IObserving {
-
-	private boolean updating = false;
-
-	private IValueChangeListener innerChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			if (!updating) {
-				fireValueChange(event.diff);
-			}
-		}
-	};
-
-	private Object currentOuterValue;
-
-	private IObservableValue innerObservableValue;
-
-	private Object detailType;
-
-	private IObservableValue outerObservableValue;
-
-	private IObservableFactory factory;
-
-	/**
-	 * @param outerObservableValue
-	 * @param factory
-	 * @param detailType
-	 */
-	public DetailObservableValue(IObservableValue outerObservableValue,
-			IObservableFactory factory, Object detailType) {
-		super(outerObservableValue.getRealm());
-		this.factory = factory;
-		this.detailType = detailType;
-		this.outerObservableValue = outerObservableValue;
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				updateInnerObservableValue();
-			}
-		});
-		outerObservableValue.addValueChangeListener(outerChangeListener);
-	}
-
-	IValueChangeListener outerChangeListener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			ObservableTracker.runAndIgnore(new Runnable() {
-				public void run() {
-					Object oldValue = doGetValue();
-					updateInnerObservableValue();
-					fireValueChange(Diffs.createValueDiff(oldValue,
-							doGetValue()));
-				}
-			});
-		}
-	};
-
-	private void updateInnerObservableValue() {
-		currentOuterValue = outerObservableValue.getValue();
-		if (innerObservableValue != null) {
-			innerObservableValue.removeValueChangeListener(innerChangeListener);
-			innerObservableValue.dispose();
-		}
-		if (currentOuterValue == null) {
-			innerObservableValue = null;
-		} else {
-			this.innerObservableValue = (IObservableValue) factory
-					.createObservable(currentOuterValue);
-			DetailObservableHelper.warnIfDifferentRealms(getRealm(),
-					innerObservableValue.getRealm());
-
-			if (detailType != null) {
-				Object innerValueType = innerObservableValue.getValueType();
-				Assert
-						.isTrue(
-								detailType.equals(innerValueType),
-								"Cannot change value type in a nested observable value, from " + innerValueType + " to " + detailType); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			innerObservableValue.addValueChangeListener(innerChangeListener);
-		}
-	}
-
-	public void doSetValue(final Object value) {
-		if (innerObservableValue != null) {
-			ObservableTracker.runAndIgnore(new Runnable() {
-				public void run() {
-					innerObservableValue.setValue(value);
-				}
-			});
-		}
-	}
-
-	public Object doGetValue() {
-		if (innerObservableValue == null)
-			return null;
-		final Object[] result = new Object[1];
-		ObservableTracker.runAndIgnore(new Runnable() {
-			public void run() {
-				result[0] = innerObservableValue.getValue();
-			}
-		});
-		return result[0];
-	}
-
-	public Object getValueType() {
-		return detailType;
-	}
-
-	public synchronized void dispose() {
-		super.dispose();
-
-		if (outerObservableValue != null) {
-			outerObservableValue.removeValueChangeListener(outerChangeListener);
-		}
-		if (innerObservableValue != null) {
-			innerObservableValue.removeValueChangeListener(innerChangeListener);
-			innerObservableValue.dispose();
-		}
-		outerObservableValue = null;
-		outerChangeListener = null;
-		currentOuterValue = null;
-		factory = null;
-		innerObservableValue = null;
-		innerChangeListener = null;
-	}
-
-	public Object getObserved() {
-		if (innerObservableValue instanceof IObserving) {
-			return ((IObserving)innerObservableValue).getObserved();
-		}
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/AbstractObservableTree.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/AbstractObservableTree.java
deleted file mode 100644
index e1226c9..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/AbstractObservableTree.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164134
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.internal.databinding.BindingMessages;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Status;
-
-/**
- * @since 3.3
- * 
- */
-public abstract class AbstractObservableTree extends AbstractObservable
-		implements IObservableTree {
-
-	private boolean stale;
-
-	private ListenerList treeListeners = new ListenerList(ListenerList.IDENTITY);
-
-	/**
-	 * @param realm
-	 */
-	public AbstractObservableTree(Realm realm) {
-		super(realm);
-	}
-
-	public void addChild(TreePath parentPath, Object childElement) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void addTreeChangeListener(ITreeChangeListener listener) {
-		treeListeners.add(listener);
-	}
-
-	public int getChildCount(TreePath parentPath) {
-		return getChildren(parentPath).length;
-	}
-
-	public boolean hasChildren(TreePath parentPath) {
-		return getChildCount(parentPath) > 0;
-	}
-
-	public void insertChild(TreePath parentPath, int index, Object childElement) {
-		throw new UnsupportedOperationException();
-	}
-
-	public boolean isLazy() {
-		return false;
-	}
-
-	public boolean isOrdered() {
-		return false;
-	}
-
-	public void removeChild(TreePath parentPath, Object childElement) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void removeChild(TreePath parentPath, int index) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void removeTreeChangeListener(ITreeChangeListener listener) {
-		treeListeners.remove(listener);
-	}
-
-	public void setChildCount(TreePath parentPath, int count) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void setChildren(TreePath parentPath, Object[] children) {
-		throw new UnsupportedOperationException();
-	}
-
-	public void updateChildren(IChildrenUpdate update) {
-		TreePath parent = update.getParent();
-		Object[] children = getChildren(parent);
-		for (int i = 0; i < update.getLength(); i++) {
-			int targetIndex = update.getOffset() + i;
-			if (targetIndex < children.length) {
-				update.setChild(children[targetIndex], targetIndex);
-			} else {
-				update
-						.setStatus(new Status(
-								IStatus.WARNING,
-								Policy.JFACE_DATABINDING, 
-								IStatus.OK,
-								BindingMessages
-										.getString(BindingMessages.INDEX_OUT_OF_RANGE), 
-										null));
-			}
-		}
-		update.done();
-	}
-
-	public void updateChildrenCount(IChildrenCountUpdate update) {
-		TreePath[] parents = update.getParents();
-		for (int i = 0; i < parents.length; i++) {
-			update.setChildCount(parents[i], getChildCount(parents[i]));
-		}
-		update.done();
-	}
-
-	public void updateHasChildren(IHasChildrenUpdate update) {
-		TreePath[] parents = update.getElements();
-		for (int i = 0; i < parents.length; i++) {
-			update.setHasChilren(parents[i], hasChildren(parents[i]));
-		}
-		update.done();
-	}
-
-	public boolean isStale() {
-		return stale;
-	}
-
-	/**
-	 * @param stale
-	 */
-	public void setStale(boolean stale) {
-		this.stale = stale;
-		if (stale) {
-			fireStale();
-		}
-	}
-
-	protected void fireTreeChange(TreeDiff diff) {
-		// fire general change event first
-		fireChange();
-
-		Object[] listeners = treeListeners.getListeners();
-		TreeChangeEvent event = new TreeChangeEvent(this, diff);
-		for (int i = 0; i < listeners.length; i++) {
-			((ITreeChangeListener) listeners[i]).handleTreeChange(event);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IChildrenCountUpdate.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IChildrenCountUpdate.java
deleted file mode 100644
index 331176a..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IChildrenCountUpdate.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.tree;
-
-/**
- * Request monitor used to collect the number of children for an element in a lazy
- * observable tree.
- * 
- * @since 3.3
- */
-public interface IChildrenCountUpdate extends IViewerUpdate {
-
-	/**
-	 * Returns the parent elements that children counts have been requested for
-	 * as tree paths. An empty path identifies the root element.
-	 * 
-	 * @return parent elements as tree paths
-	 */
-	public TreePath[] getParents();
-
-	/**
-	 * Sets the number of children for the given parent.
-	 * 
-	 * @param parentPath
-	 *            parent element or empty path for root element
-	 * @param numChildren
-	 *            number of children
-	 */
-	public void setChildCount(TreePath parentPath, int numChildren);
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IChildrenUpdate.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IChildrenUpdate.java
deleted file mode 100644
index 8d4b961..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IChildrenUpdate.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.tree;
-
-/**
- * Context sensitive children update request for a parent and subrange of its
- * children.
- *  
- * @since 3.3
- */
-public interface IChildrenUpdate extends IViewerUpdate {
-
-	/**
-	 * Returns the parent element that children are being requested for
-	 * as a tree path. An empty path identifies the root element.
-	 * 
-	 * @return parent element as a tree path
-	 */
-	public TreePath getParent();
-	
-	/**
-	 * Returns the offset at which children have been requested for. This is
-	 * the index of the first child being requested.
-	 * 
-	 * @return offset at which children have been requested for
-	 */
-	public int getOffset();
-	
-	/**
-	 * Returns the number of children requested.
-	 * 
-	 * @return number of children requested
-	 */
-	public int getLength();
-	
-	/**
-	 * Sets the child for this request's parent at the given offset.
-	 * 
-	 * @param child child
-	 * @param index child offset
-	 * 
-	 * TODO: what to do with <code>null</code>
-	 */
-	public void setChild(Object child, int index); 	
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IHasChildrenUpdate.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IHasChildrenUpdate.java
deleted file mode 100644
index f3eadd6..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IHasChildrenUpdate.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.tree;
-
-/**
- * Context sensitive update request for whether elements have children.
- * 
- * @since 3.3
- */
-public interface IHasChildrenUpdate extends IViewerUpdate {
-
-	/**
-	 * The elements this request is for specified as tree paths. An empty path
-	 * identifies the root element.
-	 * 
-	 * @return elements as tree paths
-	 */
-	public TreePath[] getElements();
-
-	/**
-	 * Sets whether the given element has children.
-	 * 
-	 * @param element
-	 *            tree path to element, or empty for root element
-	 * @param hasChildren
-	 *            whether it has children
-	 */
-	public void setHasChilren(TreePath element, boolean hasChildren);
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IObservableTree.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IObservableTree.java
deleted file mode 100644
index a877452..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IObservableTree.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-import org.eclipse.core.databinding.observable.IObservable;
-
-/**
- * 
- * A tree whose changes can be tracked by tree change listeners. If the tree is
- * ordered ({@link #isOrdered()}), the order of children for a given tree path
- * matters, and tree change notifications will always specify indices. If the
- * tree is unordered, the children of a tree path are an unordered set and
- * indices in change notifications are not specified.
- * 
- * <p>
- * This interface is not intended to be implemented by clients. Clients should
- * instead subclass one of the framework classes that implement this interface.
- * Note that direct implementers of this interface outside of the framework will
- * be broken in future releases when methods are added to this interface.
- * </p>
- * 
- * @since 1.1
- */
-public interface IObservableTree extends IObservable {
-	
-	/**
-	 * Element that can be returned from synchronous getters if this observable
-	 * tree is lazy.
-	 */
-	public final static Object UNKNOWN_ELEMENT = new Object();
-	
-	/**
-	 * @param listener
-	 */
-	public void addTreeChangeListener(ITreeChangeListener listener);
-
-	/**
-	 * @param listener
-	 */
-	public void removeTreeChangeListener(ITreeChangeListener listener);
-
-	/**
-	 * Returns whether the order of children for a given parent is important. If
-	 * this tree is ordered, tree change notifications will always specify
-	 * indices.
-	 * 
-	 * @return true if the order of children for a given parent is important
-	 */
-	public boolean isOrdered();
-	
-	/**
-	 * Returns whether this tree is optimized to fetch subsets of children
-	 * lazily and possibly asynchronously. Implies {@link #isOrdered()}.
-	 * 
-	 * @return true if this tree 
-	 */
-	public boolean isLazy();
-
-	/**
-	 * @param parentPath
-	 * @return the children at the given parent path
-	 */
-	public Object[] getChildren(TreePath parentPath);
-	
-	/**
-	 * @param parentPath
-	 * @param children
-	 */
-	public void setChildren(TreePath parentPath, Object[] children);
-	
-	/**
-	 * @param parentPath
-	 * @param childElement
-	 */
-	public void addChild(TreePath parentPath, Object childElement);
-	
-	/**
-	 * @param parentPath
-	 * @param childElement 
-	 */
-	public void removeChild(TreePath parentPath, Object childElement);
-	
-	/**
-	 * @param parentPath
-	 * @param index
-	 * @param childElement
-	 */
-	public void insertChild(TreePath parentPath, int index, Object childElement);
-	
-	/**
-	 * @param parentPath
-	 * @param index
-	 */
-	public void removeChild(TreePath parentPath, int index);
-	
-	/**
-	 * @param parentPath
-	 * @return <code>true</code> if the element at the given path has children
-	 */
-	public boolean hasChildren(TreePath parentPath);
-	
-	/**
-	 * @param parentPath
-	 * @return the number of children of the element at the given path 
-	 */
-	public int getChildCount(TreePath parentPath);
-	
-	/**
-	 * @param parentPath
-	 * @param count
-	 */
-	public void setChildCount(TreePath parentPath, int count);
-	
-	/**
-	 * Updates the number of children for the given parent elements in the
-	 * specified request.
-	 * 
-	 * @param update specifies counts to update and stores result
-	 */
-	public void updateChildrenCount(IChildrenCountUpdate update);
-	
-	/**
-	 * Updates children as requested by the update.
-	 * 
-	 * @param update specifies children to update and stores result
-	 */	
-	public void updateChildren(IChildrenUpdate update);
-	
-	/**
-	 * Updates whether elements have children.
-	 * 
-	 * @param update specifies elements to update and stores result
-	 */
-	public void updateHasChildren(IHasChildrenUpdate update);
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IOrderedTreeProvider.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IOrderedTreeProvider.java
deleted file mode 100644
index f60d561..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IOrderedTreeProvider.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-
-/**
- * Objects that implement this interface are capable of describing a tree by
- * returning the list of children of any given element in the tree.
- * 
- * @since 3.3
- */
-public interface IOrderedTreeProvider {
-	/**
-	 * Returns the children of the given element, or null if the element is a
-	 * leaf node. The caller of this method is expected to dispose the result
-	 * list when it is no longer needed.
-	 * 
-	 * @param element
-	 *            the tree path of the element to query
-	 * @return the children of the given element, or null if the element is a
-	 *         leaf node
-	 */
-	IObservableList createChildList(TreePath element);
-
-	/**
-	 * @return the realm shared by all child lists
-	 */
-	Realm getRealm();
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/ITreeChangeListener.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/ITreeChangeListener.java
deleted file mode 100644
index 8fe9f8f..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/ITreeChangeListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-/**
- * @since 3.3
- * 
- */
-public interface ITreeChangeListener {
-	/**
-	 * @param event
-	 */
-	void handleTreeChange(TreeChangeEvent event);
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IUnorderedTreeProvider.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IUnorderedTreeProvider.java
deleted file mode 100644
index 81941c8..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IUnorderedTreeProvider.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-
-/**
- * @since 1.0
- *
- */
-public interface IUnorderedTreeProvider {
-	/**
-	 * @return the realm for the createChildSet method
-	 */
-	public Realm getRealm();
-	
-	/**
-	 * Returns the children of the given element, or null if the element is a leaf node.
-	 * The caller of this method is expected to dispose the result set when it is no
-	 * longer needed.
-	 * 
-	 * @param element element to query
-	 * @return the children of the given element, or null if the element is a leaf node
-	 */
-	IObservableSet createChildSet(Object element);
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IViewerUpdate.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IViewerUpdate.java
deleted file mode 100644
index 26cadab..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/IViewerUpdate.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.tree;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * A context sensitive viewer update request.
- * 
- * @since 3.3
- */
-public interface IViewerUpdate extends IProgressMonitor {
-
-    /**
-     * Sets the status of this request, possibly <code>null</code>.
-     * When a request fails, the status indicates why the request failed.
-     * A <code>null</code> status is considered to be successful.
-     * 
-     * @param status request status
-     */
-    public void setStatus(IStatus status);
-    
-    /**
-     * Returns the status of this request, or <code>null</code>.
-     * 
-     * @return request status or <code>null</code>
-     */
-    public IStatus getStatus();	
-    
-    /**
-     * Returns the model element corresponding to the given tree path.
-     * Returns the root element for the empty path.
-     * 
-     * @param path viewer tree path
-     * @return corresponding model element
-     */
-    public Object getElement(TreePath path);
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/TreeChangeEvent.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/TreeChangeEvent.java
deleted file mode 100644
index b5051d5..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/TreeChangeEvent.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-import java.util.EventObject;
-
-/**
- * @since 3.3
- * 
- */
-public class TreeChangeEvent extends EventObject {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -3198503763995528027L;
-	/**
-	 * 
-	 */
-	public TreeDiff diff;
-
-	/**
-	 * @param source
-	 * @param diff
-	 */
-	public TreeChangeEvent(IObservableTree source, TreeDiff diff) {
-		super(source);
-		this.diff = diff;
-	}
-
-	/**
-	 * @return the observable tree from which this event originated
-	 */
-	public IObservableTree getObservable() {
-		return (IObservableTree) getSource();
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiff.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiff.java
deleted file mode 100644
index 7c419ea..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiff.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-/**
- * Describes the difference between two trees as a tree of tree diff nodes.
- * 
- * @since 1.1
- * 
- */
-public abstract class TreeDiff extends TreeDiffNode {
-
-	/**
-	 * Returns the tree path (possibly empty) of the parent, or
-	 * <code>null</code> if the underlying tree is not lazy and never contains
-	 * duplicate elements.
-	 * 
-	 * @return the tree path (possibly empty) of the unchanged parent, or
-	 *         <code>null</code>
-	 */
-	public abstract TreePath getParentPath();
-
-	/**
-	 * @param visitor
-	 */
-	public void accept(TreeDiffVisitor visitor) {
-		doAccept(visitor, getParentPath());
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiffNode.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiffNode.java
deleted file mode 100644
index a8b8b8d..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiffNode.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-/**
- * @since 1.1
- * 
- */
-public abstract class TreeDiffNode {
-
-	/**
-	 * 
-	 */
-	public final static int NO_CHANGE = 0x00;
-
-	/**
-	 * 
-	 */
-	public final static int ADDED = 0x01;
-
-	/**
-	 * 
-	 */
-	public final static int REMOVED = 0x02;
-
-	/**
-	 * 
-	 */
-	public final static int REPLACED = 0x03;
-
-	/**
-	 * 
-	 */
-	public static final TreeDiffNode[] NO_CHILDREN = new TreeDiffNode[0];
-
-	/**
-	 * 
-	 */
-	public static final int INDEX_UNKNOWN = -1;
-
-	/**
-	 * @return the change type
-	 */
-	public abstract int getChangeType();
-
-	/**
-	 * @return the element that was removed, or the replaced element
-	 */
-	public abstract Object getOldElement();
-
-	/**
-	 * @return the element that was not changed, added, or the replacement
-	 *         element
-	 */
-	public abstract Object getNewElement();
-
-	/**
-	 * @return the index at which the element was added, removed, or replaced
-	 */
-	public abstract int getIndex();
-
-	/**
-	 * Returns the child tree diff objects that describe changes to children. If
-	 * the change type is REMOVED, there will be no children.
-	 * 
-	 * @return the nodes representing changes to children
-	 */
-	public abstract TreeDiffNode[] getChildren();
-
-	protected void doAccept(TreeDiffVisitor visitor, TreePath parentPath) {
-		TreePath currentPath = parentPath.createChildPath(getNewElement());
-		boolean recurse = visitor.visit(this, currentPath);
-		if (recurse) {
-			TreeDiffNode[] children = getChildren();
-			for (int i = 0; i < children.length; i++) {
-				TreeDiffNode child = children[i];
-				child.doAccept(visitor, currentPath);
-			}
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiffVisitor.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiffVisitor.java
deleted file mode 100644
index 837464d..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/TreeDiffVisitor.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.observable.tree;
-
-/**
- * @since 3.3
- * 
- */
-public abstract class TreeDiffVisitor {
-
-	/**
-	 * Visits the given tree diff.
-	 * 
-	 * @param diff
-	 *            the diff to visit
-	 * @param currentPath
-	 *            the current path (the diff's element is the last segment of
-	 *            the path)
-	 * 
-	 * @return <code>true</code> if the tree diff's children should be
-	 *         visited; <code>false</code> if they should be skipped.
-	 */
-	public abstract boolean visit(TreeDiffNode diff, TreePath currentPath);
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/TreePath.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/TreePath.java
deleted file mode 100644
index 99e987c..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/TreePath.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 118516
- *******************************************************************************/
-package org.eclipse.core.internal.databinding.observable.tree;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * A tree path denotes a model element in a tree viewer. Tree path objects have
- * value semantics. A model element is represented by a path of elements in the
- * tree from the root element to the leaf element.
- * <p>
- * Clients may instantiate this class. Not intended to be subclassed.
- * </p>
- * 
- * @since 3.2
- */
-public final class TreePath {
-	
-	/**
-	 * Constant for representing an empty tree path.
-	 */
-	public static final TreePath EMPTY = new TreePath(new Object[0]);
-	
-	private Object[] segments;
-
-	private int hash;
-
-	/**
-	 * Constructs a path identifying a leaf node in a tree.
-	 * 
-	 * @param segments
-	 *            path of elements to a leaf node in a tree, starting with the
-	 *            root element
-	 */
-	public TreePath(Object[] segments) {
-		Assert.isNotNull(segments, "Segments array cannot be null"); //$NON-NLS-1$
-		this.segments = new Object[segments.length];
-		for (int i = 0; i < segments.length; i++) {
-			Assert.isNotNull(segments[i], "Segments array cannot contain null"); //$NON-NLS-1$
-			this.segments[i] = segments[i];
-		}
-	}
-
-	/**
-	 * Returns the element at the specified index in this path.
-	 * 
-	 * @param index
-	 *            index of element to return
-	 * @return element at the specified index
-	 */
-	public Object getSegment(int index) {
-		return segments[index];
-	}
-
-	/**
-	 * Returns the number of elements in this path.
-	 * 
-	 * @return the number of elements in this path
-	 */
-	public int getSegmentCount() {
-		return segments.length;
-	}
-
-	/**
-	 * Returns the first element in this path.
-	 * 
-	 * @return the first element in this path
-	 */
-	public Object getFirstSegment() {
-		if (segments.length == 0) {
-			return null;
-		}
-		return segments[0];
-	}
-
-	/**
-	 * Returns the last element in this path.
-	 * 
-	 * @return the last element in this path
-	 */
-	public Object getLastSegment() {
-		if (segments.length == 0) {
-			return null;
-		}
-		return segments[segments.length - 1];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object other) {
-		if (!(other instanceof TreePath)) {
-			return false;
-		}
-		TreePath otherPath = (TreePath) other;
-		if (segments.length != otherPath.segments.length) {
-			return false;
-		}
-		for (int i = 0; i < segments.length; i++) {
-				if (!segments[i].equals(otherPath.segments[i])) {
-					return false;
-				}
-		}
-		return true;
-	}
-
-	public int hashCode() {
-		if (hash == 0) {
-			for (int i = 0; i < segments.length; i++) {
-					hash += segments[i].hashCode();
-			}
-		}
-		return hash;
-	}
-
-	/**
-	 * Returns whether this path starts with the same segments as the given
-	 * path, using the given comparer to compare segments.
-	 * 
-	 * @param treePath
-	 *            path to compare to
-	 * @return whether the given path is a prefix of this path, or the same as
-	 *         this path
-	 */
-	public boolean startsWith(TreePath treePath) {
-		int thisSegmentCount = getSegmentCount();
-		int otherSegmentCount = treePath.getSegmentCount();
-		if (otherSegmentCount == thisSegmentCount) {
-			return equals(treePath);
-		}
-		if (otherSegmentCount > thisSegmentCount) {
-			return false;
-		}
-		for (int i = 0; i < otherSegmentCount; i++) {
-			Object otherSegment = treePath.getSegment(i);
-				if (!otherSegment.equals(segments[i])) {
-					return false;
-				}
-		}
-		return true;
-	}
-
-	/**
-	 * Returns a copy of this tree path with one segment removed from the end,
-	 * or <code>null</code> if this tree path has no segments.
-	 * @return a tree path
-	 */
-	public TreePath getParentPath() {
-		int segmentCount = getSegmentCount();
-		if (segmentCount <= 1) {
-			return null;
-		}
-		Object[] parentSegments = new Object[segmentCount - 1];
-		System.arraycopy(segments, 0, parentSegments, 0, segmentCount - 1);
-		return new TreePath(parentSegments);
-	}
-
-	/**
-	 * Returns a copy of this tree path with the given segment added at the end.
-	 * @param newSegment 
-	 * @return a tree path
-	 */
-	public TreePath createChildPath(Object newSegment) {
-		int segmentCount = getSegmentCount();
-		Object[] childSegments = new Object[segmentCount + 1];
-		if(segmentCount>0) {
-			System.arraycopy(segments, 0, childSegments, 0, segmentCount);
-		}
-		childSegments[segmentCount] = newSegment;
-		return new TreePath(childSegments);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/package.html b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/package.html
deleted file mode 100644
index d720e2b..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/observable/tree/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-To be written.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that can be used to ...</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/AbstractStringToNumberValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/AbstractStringToNumberValidator.java
deleted file mode 100644
index 3cf8f0b..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/AbstractStringToNumberValidator.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser.ParseResult;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * Validates a number that is to be converted by a {@link NumberFormatConverter}.
- * Validation is comprised of parsing the String and range checks.
- * 
- * @since 1.0
- */
-public abstract class AbstractStringToNumberValidator implements IValidator {
-	private final NumberFormatConverter converter;
-	private final boolean toPrimitive;
-
-	private final Number min;
-	private final Number max;
-
-	private String outOfRangeMessage;
-
-	/**
-	 * Constructs a new instance.
-	 * 
-	 * @param converter converter and thus formatter to be used in validation
-	 * @param min minimum value, used for reporting a range error to the user
-	 * @param max maximum value, used for reporting a range error to the user
-	 */
-	protected AbstractStringToNumberValidator(NumberFormatConverter converter,
-			Number min, Number max) {
-		this.converter = converter;
-		this.min = min;
-		this.max = max;
-
-		if (converter.getToType() instanceof Class) {
-			Class clazz = (Class) converter.getToType();
-			toPrimitive = clazz.isPrimitive();
-		} else {
-			toPrimitive = false;
-		}
-	}
-
-	/**
-	 * Validates the provided <code>value</code>.  An error status is returned if:
-	 * <ul>
-	 * <li>The value cannot be parsed.</li>
-	 * <li>The value is out of range.</li>
-	 * </ul>
-	 * 
-	 * @see org.eclipse.core.databinding.validation.IValidator#validate(java.lang.Object)
-	 */
-	public final IStatus validate(Object value) {
-		ParseResult result = StringToNumberParser.parse(value, converter
-				.getNumberFormat(), toPrimitive);
-
-		if (result.getNumber() != null) {
-			if (!isInRange(result.getNumber())) {
-				if (outOfRangeMessage == null) {
-					outOfRangeMessage = StringToNumberParser
-							.createOutOfRangeMessage(min, max, converter
-									.getNumberFormat());
-				}
-
-				return ValidationStatus.error(outOfRangeMessage);
-			}
-		} else if (result.getPosition() != null) {
-			String parseErrorMessage = StringToNumberParser.createParseErrorMessage(
-					(String) value, result.getPosition());
-
-			return ValidationStatus.error(parseErrorMessage);
-		}
-
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Invoked by {@link #validate(Object)} when the range is to be validated.
-	 * 
-	 * @param number
-	 * @return <code>true</code> if in range
-	 */
-	protected abstract boolean isInRange(Number number);
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberFormatConverter.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberFormatConverter.java
deleted file mode 100644
index f849329..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberFormatConverter.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.databinding.conversion.Converter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * Converter that uses a number format for conversion.
- * 
- * @since 1.0
- */
-public abstract class NumberFormatConverter extends Converter {
-	private final NumberFormat numberFormat;
-	
-	/**
-	 * @param fromType
-	 * @param toType
-	 * @param numberFormat 
-	 */
-	public NumberFormatConverter(Object fromType, Object toType, NumberFormat numberFormat) {
-		super(fromType, toType);
-		
-		this.numberFormat = numberFormat;
-	}
-
-	/**
-	 * @return number format
-	 */
-	/*package */ NumberFormat getNumberFormat() {
-		return numberFormat;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToByteValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToByteValidator.java
deleted file mode 100644
index cdb16f5..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToByteValidator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.NumberToByteConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * Validates if a Number can fit in a Byte.
- * <p>
- * Class is thread safe.
- * </p>
- * 
- * @since 1.0
- */
-public class NumberToByteValidator extends NumberToNumberValidator {
-	private static final Byte MAX = new Byte(Byte.MAX_VALUE);
-	private static final Byte MIN = new Byte(Byte.MIN_VALUE);
-	
-	/**
-	 * @param converter
-	 */
-	public NumberToByteValidator(NumberToByteConverter converter) {
-		super(converter, MIN, MAX);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.validation.NumberToNumberValidator#inRange(java.lang.Number)
-	 */
-	protected boolean inRange(Number number) {
-		return StringToNumberParser.inByteRange(number);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToDoubleValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToDoubleValidator.java
deleted file mode 100644
index 4206520..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToDoubleValidator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.NumberToDoubleConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * Validates if a Number can fit in a Double.
- * <p>
- * Class is thread safe.
- * </p>
- * @since 1.0
- */
-public class NumberToDoubleValidator extends NumberToNumberValidator {
-	private static final Double MIN = new Double(Double.MIN_VALUE);
-	private static final Double MAX = new Double(Double.MAX_VALUE);
-	
-	/**
-	 * @param converter
-	 */
-	public NumberToDoubleValidator(NumberToDoubleConverter converter) {
-		super(converter, MIN, MAX);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.validation.NumberToNumberValidator#inRange(java.lang.Number)
-	 */
-	protected boolean inRange(Number number) {
-		return StringToNumberParser.inDoubleRange(number);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToFloatValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToFloatValidator.java
deleted file mode 100644
index 4fe3b8e..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToFloatValidator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.NumberToFloatConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * Validates if a Number can fit in a Float.
- * <p>
- * Class is thread safe.
- * </p>
- * @since 1.0
- */
-public class NumberToFloatValidator extends NumberToNumberValidator {
-	private static final Float MIN = new Float(Float.MIN_VALUE);
-	private static final Float MAX = new Float(Float.MAX_VALUE);
-	
-	/**
-	 * @param converter
-	 */
-	public NumberToFloatValidator(NumberToFloatConverter converter) {
-		super(converter, MIN, MAX);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.validation.NumberToNumberValidator#inRange(java.lang.Number)
-	 */
-	protected boolean inRange(Number number) {
-		return StringToNumberParser.inFloatRange(number);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToIntegerValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToIntegerValidator.java
deleted file mode 100644
index fe78bce..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToIntegerValidator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.NumberToIntegerConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * Validates if a Number can fit in a Integer.
- * <p>
- * Class is thread safe.
- * </p>
- * @since 1.0
- */
-public class NumberToIntegerValidator extends NumberToNumberValidator {
-	private static final Integer MIN = new Integer(Integer.MIN_VALUE);
-	private static final Integer MAX = new Integer(Integer.MAX_VALUE);
-	
-	/**
-	 * @param converter
-	 */
-	public NumberToIntegerValidator(NumberToIntegerConverter converter) {
-		super(converter, MIN, MAX);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.validation.NumberToNumberValidator#inRange(java.lang.Number)
-	 */
-	protected boolean inRange(Number number) {
-		return StringToNumberParser.inIntegerRange(number);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToLongValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToLongValidator.java
deleted file mode 100644
index 2c2fdb8..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToLongValidator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.NumberToLongConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * Validates if a Number can fit in a Long.
- * <p>
- * Class is thread safe.
- * </p>
- * @since 1.0
- */
-public class NumberToLongValidator extends NumberToNumberValidator {
-	private static final Long MIN = new Long(Long.MIN_VALUE);
-	private static final Long MAX = new Long(Long.MAX_VALUE);
-	
-	/**
-	 * @param converter
-	 */
-	public NumberToLongValidator(NumberToLongConverter converter) {
-		super(converter, MIN, MAX);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.validation.NumberToNumberValidator#inRange(java.lang.Number)
-	 */
-	protected boolean inRange(Number number) {
-		return StringToNumberParser.inLongRange(number);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToNumberValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToNumberValidator.java
deleted file mode 100644
index 957e75b..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToNumberValidator.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.conversion.NumberToNumberConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * Base class for validators that validate if a Number can fit in another Number type.
- * <p>
- * Class is thread safe.
- * </p>
- * 
- * @since 1.0
- */
-public abstract class NumberToNumberValidator implements IValidator {
-	private final NumberToNumberConverter converter;
-
-	private final Number min;
-
-	private final Number max;
-
-	private String outOfRangeMessage;
-
-	private final boolean primitive;
-
-	/**
-	 * @param converter
-	 * @param min
-	 *            can be <code>null</code>
-	 * @param max
-	 *            can be <code>null</code>
-	 */
-	protected NumberToNumberValidator(NumberToNumberConverter converter,
-			Number min, Number max) {
-		this.converter = converter;
-		this.min = min;
-		this.max = max;
-
-		primitive = ((Class) converter.getToType()).isPrimitive();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.databinding.validation.IValidator#validate(java.lang.Object)
-	 */
-	public final IStatus validate(Object value) {
-		if (value == null) {
-			if (primitive) {
-				throw new IllegalArgumentException(
-						"Parameter 'value' cannot be null."); //$NON-NLS-1$
-			}
-
-			return Status.OK_STATUS;
-		}
-
-		if (!(value instanceof Number)) {
-			throw new IllegalArgumentException(
-					"Parameter 'value' is not of type Number."); //$NON-NLS-1$
-		}
-
-		Number number = (Number) value;
-		if (inRange(number)) {
-			return Status.OK_STATUS;
-		}
-
-		synchronized (this) {
-			if (outOfRangeMessage == null && min != null && max != null) {
-				outOfRangeMessage = StringToNumberParser
-						.createOutOfRangeMessage(min, max, converter
-								.getNumberFormat());
-			}
-
-			return ValidationStatus.error(outOfRangeMessage);
-		}
-	}
-
-	/**
-	 * Invoked to determine if the value is in range.
-	 * 
-	 * @param number
-	 * @return <code>true</code> if in range
-	 */
-	protected abstract boolean inRange(Number number);
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToShortValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToShortValidator.java
deleted file mode 100644
index c7fa8d8..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToShortValidator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.NumberToShortConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * Validates if a Number can fit in a Short.
- * <p>
- * Class is thread safe.
- * </p>
- * 
- * @since 1.0
- */
-public class NumberToShortValidator extends NumberToNumberValidator {
-	private static final Short MIN = new Short(Short.MIN_VALUE);
-	private static final Short MAX = new Short(Short.MAX_VALUE);
-	
-	/**
-	 * @param converter
-	 */
-	public NumberToShortValidator(NumberToShortConverter converter) {
-		super(converter, MIN, MAX);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.validation.NumberToNumberValidator#inRange(java.lang.Number)
-	 */
-	protected boolean inRange(Number number) {
-		return StringToNumberParser.inShortRange(number);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToUnboundedNumberValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToUnboundedNumberValidator.java
deleted file mode 100644
index 7919c5a..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/NumberToUnboundedNumberValidator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.NumberToNumberConverter;
-
-/**
- * Validates if a Number can fit in an unbounded number (e.g. BigInteger, BigDecimal, etc.).
- * <p>
- * Class is thread safe.
- * </p>
- * 
- * @since 1.0
- */
-public class NumberToUnboundedNumberValidator extends NumberToNumberValidator {
-	/**
-	 * @param converter
-	 */
-	public NumberToUnboundedNumberValidator(NumberToNumberConverter converter) {
-		super(converter, null, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.internal.databinding.validation.NumberToNumberValidator#inRange(java.lang.Number)
-	 */
-	protected boolean inRange(Number number) {
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/ObjectToPrimitiveValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/ObjectToPrimitiveValidator.java
deleted file mode 100755
index 67b46f9..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/ObjectToPrimitiveValidator.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl<tom.schindl@bestsolution.at> - bugfix for 217940
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.BindingMessages;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * @since 3.2
- *
- */
-public class ObjectToPrimitiveValidator implements IValidator {
-
-	private Class toType;
-
-	private Class[][] primitiveMap = new Class[][] {
-			{ Integer.TYPE, Integer.class }, { Short.TYPE, Short.class },
-			{ Long.TYPE, Long.class }, { Double.TYPE, Double.class },
-			{ Byte.TYPE, Byte.class }, { Float.TYPE, Float.class },
-			{ Boolean.TYPE, Boolean.class },
-			{ Character.TYPE, Character.class } };
-
-	/**
-	 * @param toType
-	 */
-	public ObjectToPrimitiveValidator(Class toType) {
-		this.toType = toType;
-	}
-
-	protected Class getToType() {
-		return this.toType;
-	}
-
-	public IStatus validate(Object value) {
-		return doValidate(value);
-	}
-
-	private IStatus doValidate(Object value) {
-		if (value != null) {
-			if (!mapContainsValues(toType, value.getClass())) {
-				return ValidationStatus.error(getClassHint());
-			}
-			return Status.OK_STATUS;
-		}
-		return ValidationStatus.error(getNullHint());
-	}
-
-	private boolean mapContainsValues(Class toType, Class fromType) {
-		for (int i = 0; i < primitiveMap.length; i++) {
-			if ((primitiveMap[i][0].equals(toType))
-					&& (primitiveMap[i][1].equals(fromType))) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @return a hint string
-	 */
-	public String getNullHint() {
-		return BindingMessages.getString(BindingMessages.VALIDATE_CONVERSION_TO_PRIMITIVE);
-	}
-
-	/**
-	 * @return a hint string
-	 */
-	public String getClassHint() {
-		return BindingMessages
-				.getString(BindingMessages.VALIDATE_CONVERSION_FROM_CLASS_TO_PRIMITIVE);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/ReadOnlyValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/ReadOnlyValidator.java
deleted file mode 100755
index 8ebc651..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/ReadOnlyValidator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2005, 2006 db4objects Inc. (http://www.db4o.com) and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     db4objects - Initial API and implementation
- *     Boris Bokowski (IBM Corporation) - bug 118429
- *     Tom Schindl<tom.schindl@bestsolution.at> - bugfix for 217940
- */
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.BindingMessages;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * ReadOnlyValidator. A validator that can be used as a partial validator for read-only fields.
- */
-public class ReadOnlyValidator implements IValidator {
-
-	private static ReadOnlyValidator singleton = null;
-
-	/**
-	 * Returns the ReadOnlyValidator
-	 *
-	 * @return the ReadOnlyValidator
-	 */
-	public static ReadOnlyValidator getDefault() {
-		if (singleton == null) {
-			singleton = new ReadOnlyValidator();
-		}
-		return singleton;
-	}
-
-	public IStatus validate(Object value) {
-		// No changes are allowed
-		return ValidationStatus.error(BindingMessages
-				.getString(BindingMessages.VALIDATE_NO_CHANGE_ALLOWED_HELP));
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToByteValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToByteValidator.java
deleted file mode 100644
index 2b7bdc4..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToByteValidator.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * @since 1.0
- */
-public class StringToByteValidator extends AbstractStringToNumberValidator {
-	private static final Byte MIN = new Byte(Byte.MIN_VALUE);
-	private static final Byte MAX = new Byte(Byte.MAX_VALUE);
-	
-	/**
-	 * @param converter
-	 */
-	public StringToByteValidator(NumberFormatConverter converter) {
-		super(converter, MIN, MAX);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.validation.AbstractStringToNumberValidator#isInRange(java.lang.Number)
-	 */
-	protected boolean isInRange(Number number) {
-		return StringToNumberParser.inByteRange(number);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToCharacterValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToCharacterValidator.java
deleted file mode 100644
index fda38a9..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToCharacterValidator.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matt Carter and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matt Carter - initial API and implementation
- *     Tom Schindl<tom.schindl@bestsolution.at> - bugfix for 217940
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.BindingMessages;
-import org.eclipse.core.internal.databinding.conversion.StringToCharacterConverter;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * Validates a String to Character conversion.
- */
-public class StringToCharacterValidator implements IValidator {
-
-	private final StringToCharacterConverter converter;
-
-	/**
-	 * @param converter
-	 */
-	public StringToCharacterValidator(StringToCharacterConverter converter) {
-		this.converter = converter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.core.databinding.validation.IValidator#validate(java.lang.Object)
-	 */
-	public IStatus validate(Object value) {
-		try {
-			converter.convert(value);
-		} catch (IllegalArgumentException e) {
-			// The StringToCharacterConverter throws an IllegalArgumentException
-			// if it cannot convert.
-			return ValidationStatus.error(BindingMessages
-					.getString(BindingMessages.VALIDATE_CHARACTER_HELP));
-		}
-		return Status.OK_STATUS;
-	}
-
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToDateValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToDateValidator.java
deleted file mode 100644
index 9aaf642..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToDateValidator.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl<tom.schindl@bestsolution.at> - bugfix for 217940
- *******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import java.util.Date;
-
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.BindingMessages;
-import org.eclipse.core.internal.databinding.conversion.DateConversionSupport;
-import org.eclipse.core.internal.databinding.conversion.StringToDateConverter;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * @since 1.0
- */
-public class StringToDateValidator implements IValidator {
-	private final StringToDateConverter converter;
-
-	/**
-	 * @param converter
-	 */
-	public StringToDateValidator(StringToDateConverter converter) {
-		this.converter = converter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.core.databinding.validation.IValidator#validate(java.lang.Object)
-	 */
-	public IStatus validate(Object value) {
-		if (value instanceof String && ((String)value).trim().length()==0) {
-			return Status.OK_STATUS;
-		}
-		Object convertedValue = converter.convert(value);
-		//The StringToDateConverter returns null if it can't parse the date.
-		if (convertedValue == null) {
-			return ValidationStatus.error(getErrorMessage());
-		}
-
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.core.internal.databinding.validation.WrappedConverterValidator#getErrorMessage()
-	 */
-	protected String getErrorMessage() {
-		Date sampleDate = new Date();
-
-		// FIXME We need to use the information from the
-		// converter, not use another instance of DateConversionSupport.
-		FormatUtil util = new FormatUtil();
-		StringBuffer samples = new StringBuffer();
-		for (int formatterIdx = 1; formatterIdx < util.numFormatters() - 2; formatterIdx++) {
-			samples.append('\'');
-			samples.append(util.format(sampleDate, formatterIdx));
-			samples.append("', "); //$NON-NLS-1$
-		}
-		samples.append('\'');
-		samples.append(util.format(sampleDate, 0));
-		samples.append('\'');
-		return BindingMessages.getString(BindingMessages.EXAMPLES) + ": " + samples + ",..."; //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	private static class FormatUtil extends DateConversionSupport {
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.internal.databinding.conversion.DateConversionSupport#numFormatters()
-		 */
-		protected int numFormatters() {
-			return super.numFormatters();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.internal.databinding.conversion.DateConversionSupport#format(java.util.Date)
-		 */
-		protected String format(Date date) {
-			return super.format(date);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.internal.databinding.conversion.DateConversionSupport#format(java.util.Date,
-		 *      int)
-		 */
-		protected String format(Date date, int formatterIdx) {
-			return super.format(date, formatterIdx);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToDoubleValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToDoubleValidator.java
deleted file mode 100644
index 2e0d0fc..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToDoubleValidator.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * @since 1.0
- */
-public class StringToDoubleValidator extends AbstractStringToNumberValidator {
-	private static final Double MIN = new Double(-Double.MAX_VALUE);
-	private static final Double MAX = new Double(Double.MAX_VALUE);
-	
-	/**
-	 * @param converter
-	 */
-	public StringToDoubleValidator(NumberFormatConverter converter) {
-		super(converter, MIN, MAX);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.internal.databinding.validation.AbstractStringToNumberValidator#inRange(java.lang.Number)
-	 */
-	protected boolean isInRange(Number number) {
-		return StringToNumberParser.inDoubleRange(number);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToFloatValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToFloatValidator.java
deleted file mode 100644
index 6ce01e4..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToFloatValidator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * Validates that a string is of the appropriate format and is in the range of a
- * float.
- * 
- * @since 1.0
- */
-public class StringToFloatValidator extends AbstractStringToNumberValidator {
-
-	private static final Float MIN = new Float(-Float.MAX_VALUE);
-	private static final Float MAX = new Float(Float.MAX_VALUE);
-
-	/**
-	 * @param converter
-	 */
-	public StringToFloatValidator(NumberFormatConverter converter) {
-		super(converter, MIN, MAX);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.internal.databinding.validation.AbstractStringToNumberValidator#inRange(java.lang.Number)
-	 */
-	protected boolean isInRange(Number number) {
-		return StringToNumberParser.inFloatRange(number);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToIntegerValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToIntegerValidator.java
deleted file mode 100644
index 6b8fb24..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToIntegerValidator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-
-/**
- * Validates that a string is of the appropriate format and is in the range of
- * an integer.
- * 
- * @since 1.0
- */
-public class StringToIntegerValidator extends AbstractStringToNumberValidator {
-	private static final Integer MIN = new Integer(Integer.MIN_VALUE);
-	private static final Integer MAX = new Integer(Integer.MAX_VALUE);
-
-	/**
-	 * @param converter
-	 */
-	public StringToIntegerValidator(NumberFormatConverter converter) {
-		super(converter, MIN, MAX);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.validation.AbstractStringToNumberValidator#inRange(java.lang.Number)
-	 */
-	protected boolean isInRange(Number number) {
-		return StringToNumberParser.inIntegerRange(number);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToLongValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToLongValidator.java
deleted file mode 100644
index 10cd47f..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToLongValidator.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * Validates that a string is of the appropriate format and is in the range of
- * an long.
- * 
- * @since 1.0
- */
-public class StringToLongValidator extends AbstractStringToNumberValidator {
-	private static final Long MIN = new Long(Long.MIN_VALUE);
-	private static final Long MAX = new Long(Long.MAX_VALUE);
-
-	/**
-	 * @param converter
-	 */
-	public StringToLongValidator(NumberFormatConverter converter) {
-		super(converter, MIN, MAX);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.validation.AbstractStringToNumberValidator#inRange(java.lang.Number)
-	 */
-	protected boolean isInRange(Number number) {
-		return StringToNumberParser.inLongRange(number);
-	}
-}
diff --git a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToShortValidator.java b/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToShortValidator.java
deleted file mode 100644
index eaf16b2..0000000
--- a/bundles/org.eclipse.core.databinding/src/org/eclipse/core/internal/databinding/validation/StringToShortValidator.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * @since 1.0
- */
-public class StringToShortValidator extends AbstractStringToNumberValidator {
-	private static final Short MIN = new Short(Short.MIN_VALUE);
-	private static final Short MAX = new Short(Short.MAX_VALUE);
-	
-	/**
-	 * @param converter
-	 */
-	public StringToShortValidator(NumberFormatConverter converter) {
-		super(converter, MIN, MAX);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.internal.databinding.validation.AbstractStringToNumberValidator#inRange(java.lang.Number)
-	 */
-	protected boolean isInRange(Number number) {
-		return StringToNumberParser.inShortRange(number);
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/.classpath b/bundles/org.eclipse.jface.databinding/.classpath
deleted file mode 100644
index c2ce266..0000000
--- a/bundles/org.eclipse.jface.databinding/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/CDC-1.0%Foundation-1.0"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.jface.databinding/.cvsignore b/bundles/org.eclipse.jface.databinding/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.jface.databinding/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.jface.databinding/.project b/bundles/org.eclipse.jface.databinding/.project
deleted file mode 100644
index c1c9d28..0000000
--- a/bundles/org.eclipse.jface.databinding/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jface.databinding</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.jface.databinding/.settings/.api_filters b/bundles/org.eclipse.jface.databinding/.settings/.api_filters
deleted file mode 100644
index 991b6ca..0000000
--- a/bundles/org.eclipse.jface.databinding/.settings/.api_filters
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<component id="org.eclipse.jface.databinding" version="2">
-    <resource path="src/org/eclipse/jface/internal/databinding/provisional/swt/WorkQueue.java" type="org.eclipse.jface.internal.databinding.provisional.swt.WorkQueue">
-        <filter id="305365105">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.internal.databinding.provisional.swt.WorkQueue"/>
-                <message_argument value="org.eclipse.jface.databinding_1.2.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jface/internal/databinding/provisional/swt/TableUpdater.java" type="org.eclipse.jface.internal.databinding.provisional.swt.TableUpdater">
-        <filter id="305365105">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.internal.databinding.provisional.swt.TableUpdater"/>
-                <message_argument value="org.eclipse.jface.databinding_1.2.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jface/internal/databinding/provisional/swt/MenuUpdater.java" type="org.eclipse.jface.internal.databinding.provisional.swt.MenuUpdater">
-        <filter id="305365105">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.internal.databinding.provisional.swt.MenuUpdater"/>
-                <message_argument value="org.eclipse.jface.databinding_1.2.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jface/internal/databinding/provisional/swt/AbstractSWTObservableValue.java" type="org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue">
-        <filter id="305365105">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue"/>
-                <message_argument value="org.eclipse.jface.databinding_1.2.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jface/internal/databinding/provisional/viewers/UnorderedTreeContentProvider.java" type="org.eclipse.jface.internal.databinding.provisional.viewers.UnorderedTreeContentProvider">
-        <filter id="305365105">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.internal.databinding.provisional.viewers.UnorderedTreeContentProvider"/>
-                <message_argument value="org.eclipse.jface.databinding_1.2.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jface/internal/databinding/provisional/swt/ControlUpdater.java" type="org.eclipse.jface.internal.databinding.provisional.swt.ControlUpdater">
-        <filter id="305365105">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.internal.databinding.provisional.swt.ControlUpdater"/>
-                <message_argument value="org.eclipse.jface.databinding_1.2.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jface/internal/databinding/provisional/viewers/IParentProvider.java" type="org.eclipse.jface.internal.databinding.provisional.viewers.IParentProvider">
-        <filter id="305365105">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.internal.databinding.provisional.viewers.IParentProvider"/>
-                <message_argument value="org.eclipse.jface.databinding_1.2.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jface/internal/databinding/provisional/viewers/ViewerLabelProvider.java" type="org.eclipse.jface.internal.databinding.provisional.viewers.ViewerLabelProvider">
-        <filter id="305365105">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.internal.databinding.provisional.viewers.ViewerLabelProvider"/>
-                <message_argument value="org.eclipse.jface.databinding_1.2.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jface/internal/databinding/provisional/swt/SWTUtil.java" type="org.eclipse.jface.internal.databinding.provisional.swt.SWTUtil">
-        <filter id="305365105">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.internal.databinding.provisional.swt.SWTUtil"/>
-                <message_argument value="org.eclipse.jface.databinding_1.2.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jface/internal/databinding/provisional/swt/CompositeUpdater.java" type="org.eclipse.jface.internal.databinding.provisional.swt.CompositeUpdater">
-        <filter id="305365105">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.internal.databinding.provisional.swt.CompositeUpdater"/>
-                <message_argument value="org.eclipse.jface.databinding_1.2.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jface/databinding/viewers/ListeningLabelProvider.java" type="org.eclipse.jface.databinding.viewers.ListeningLabelProvider">
-        <filter id="576720909">
-            <message_arguments>
-                <message_argument value="ViewerLabelProvider"/>
-                <message_argument value="ListeningLabelProvider"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/jface/internal/databinding/provisional/swt/AbstractSWTVetoableValue.java" type="org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTVetoableValue">
-        <filter id="305365105">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTVetoableValue"/>
-                <message_argument value="org.eclipse.jface.databinding_1.2.0"/>
-            </message_arguments>
-        </filter>
-    </resource>
-</component>
diff --git a/bundles/org.eclipse.jface.databinding/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.jface.databinding/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 3328ba1..0000000
--- a/bundles/org.eclipse.jface.databinding/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,352 +0,0 @@
-#Thu Apr 03 13:12:14 EDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.1
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.3
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=80
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=tab
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.jface.databinding/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.jface.databinding/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index ebd0fd0..0000000
--- a/bundles/org.eclipse.jface.databinding/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,116 +0,0 @@
-#Mon Dec 03 13:51:53 EST 2007
-cleanup.add_default_serial_version_id=true
-cleanup.add_generated_serial_version_id=false
-cleanup.add_missing_annotations=true
-cleanup.add_missing_deprecated_annotations=true
-cleanup.add_missing_methods=false
-cleanup.add_missing_nls_tags=false
-cleanup.add_missing_override_annotations=true
-cleanup.add_serial_version_id=false
-cleanup.always_use_blocks=true
-cleanup.always_use_parentheses_in_expressions=false
-cleanup.always_use_this_for_non_static_field_access=false
-cleanup.always_use_this_for_non_static_method_access=false
-cleanup.convert_to_enhanced_for_loop=false
-cleanup.correct_indentation=false
-cleanup.format_source_code=false
-cleanup.format_source_code_changes_only=false
-cleanup.make_local_variable_final=true
-cleanup.make_parameters_final=false
-cleanup.make_private_fields_final=true
-cleanup.make_variable_declarations_final=false
-cleanup.never_use_blocks=false
-cleanup.never_use_parentheses_in_expressions=true
-cleanup.organize_imports=false
-cleanup.qualify_static_field_accesses_with_declaring_class=false
-cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-cleanup.qualify_static_member_accesses_with_declaring_class=true
-cleanup.qualify_static_method_accesses_with_declaring_class=false
-cleanup.remove_private_constructors=true
-cleanup.remove_trailing_whitespaces=false
-cleanup.remove_trailing_whitespaces_all=true
-cleanup.remove_trailing_whitespaces_ignore_empty=false
-cleanup.remove_unnecessary_casts=true
-cleanup.remove_unnecessary_nls_tags=true
-cleanup.remove_unused_imports=true
-cleanup.remove_unused_local_variables=false
-cleanup.remove_unused_private_fields=true
-cleanup.remove_unused_private_members=false
-cleanup.remove_unused_private_methods=true
-cleanup.remove_unused_private_types=true
-cleanup.sort_members=false
-cleanup.sort_members_all=false
-cleanup.use_blocks=false
-cleanup.use_blocks_only_for_return_and_throw=false
-cleanup.use_parentheses_in_expressions=false
-cleanup.use_this_for_non_static_field_access=false
-cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-cleanup.use_this_for_non_static_method_access=false
-cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-cleanup_profile=org.eclipse.jdt.ui.default.eclipse_clean_up_profile
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=false
-formatter_profile=org.eclipse.jdt.ui.default.eclipse_profile
-formatter_settings_version=11
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.ignorelowercasenames=true
-org.eclipse.jdt.ui.importorder=java;javax;org;com;
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.ondemandthreshold=99
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.staticondemandthreshold=99
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} The ${bare_field_name} to set.\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n ******************************************************************************/\r\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @since 3.3\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template></templates>
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.format_source_code=false
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=false
-sp_cleanup.organize_imports=true
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=false
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/bundles/org.eclipse.jface.databinding/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.jface.databinding/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 2ad454b..0000000
--- a/bundles/org.eclipse.jface.databinding/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,18 +0,0 @@
-#Mon Dec 03 13:51:53 EST 2007
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=0
-compilers.p.illegal-att-value=0
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=2
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=0
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=0
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/bundles/org.eclipse.jface.databinding/META-INF/MANIFEST.MF b/bundles/org.eclipse.jface.databinding/META-INF/MANIFEST.MF
deleted file mode 100644
index ce61e44..0000000
--- a/bundles/org.eclipse.jface.databinding/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,24 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jface.databinding
-Bundle-Version: 1.3.0.qualifier
-Bundle-ClassPath: .
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.jface.databinding.dialog,
- org.eclipse.jface.databinding.preference,
- org.eclipse.jface.databinding.swt,
- org.eclipse.jface.databinding.viewers,
- org.eclipse.jface.databinding.wizard,
- org.eclipse.jface.internal.databinding.provisional.swt;x-internal:=true,
- org.eclipse.jface.internal.databinding.provisional.viewers;x-internal:=true,
- org.eclipse.jface.internal.databinding.swt;x-internal:=true,
- org.eclipse.jface.internal.databinding.viewers;x-internal:=true
-Require-Bundle: org.eclipse.core.databinding;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.swt;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jface;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.equinox.common;bundle-version="[3.2.0,4.0.0)"
-Import-Package: com.ibm.icu.text
-Bundle-RequiredExecutionEnvironment: CDC-1.0/Foundation-1.0,
- J2SE-1.3
diff --git a/bundles/org.eclipse.jface.databinding/about.html b/bundles/org.eclipse.jface.databinding/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.jface.databinding/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.jface.databinding/build.properties b/bundles/org.eclipse.jface.databinding/build.properties
deleted file mode 100644
index 6f0a513..0000000
--- a/bundles/org.eclipse.jface.databinding/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = .,\
-               META-INF/,\
-               plugin.properties,\
-               about.html
-output.databinding.jar = bin/
-src.includes = about.html
-source.. = src/
diff --git a/bundles/org.eclipse.jface.databinding/plugin.properties b/bundles/org.eclipse.jface.databinding/plugin.properties
deleted file mode 100644
index 2880743..0000000
--- a/bundles/org.eclipse.jface.databinding/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName = JFace Data Binding for SWT and JFace
-providerName = Eclipse.org
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/dialog/DialogPageSupport.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/dialog/DialogPageSupport.java
deleted file mode 100644
index e7e35e9..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/dialog/DialogPageSupport.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *         (through WizardPageSupport.java)
- *     Matthew Hall - initial API and implementation (bug 239900)
- *     Matthew Hall - bug 237856
- *     Ovidio Mallo - bug 237856
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.dialog;
-
-import java.util.Iterator;
-
-import org.eclipse.core.databinding.AggregateValidationStatus;
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.ValidationStatusProvider;
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiff;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.DialogPage;
-import org.eclipse.jface.dialogs.IMessageProvider;
-
-/**
- * Connects the validation result from the given data binding context to the
- * given dialog page, updating the page's error message accordingly.
- * 
- * @since 1.3
- */
-public class DialogPageSupport {
-	/**
-	 * Connect the validation result from the given data binding context to the
-	 * given dialog page. The page's error message will not be set at time of
-	 * creation, ensuring that the dialog page does not show an error right
-	 * away. Upon any validation result change, the dialog page's error message
-	 * will be updated according to the current validation result.
-	 * 
-	 * @param wizardPage
-	 * @param dbc
-	 * @return an instance of WizardPageSupport
-	 */
-	public static DialogPageSupport create(DialogPage wizardPage,
-			DataBindingContext dbc) {
-		return new DialogPageSupport(wizardPage, dbc);
-	}
-
-	private DialogPage dialogPage;
-	private DataBindingContext dbc;
-	private IObservableValue aggregateStatus;
-	private boolean uiChanged = false;
-	private IChangeListener uiChangeListener = new IChangeListener() {
-		public void handleChange(ChangeEvent event) {
-			handleUIChanged();
-		}
-	};
-	private IListChangeListener validationStatusProvidersListener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			ListDiff diff = event.diff;
-			ListDiffEntry[] differences = diff.getDifferences();
-			for (int i = 0; i < differences.length; i++) {
-				ListDiffEntry listDiffEntry = differences[i];
-				ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) listDiffEntry
-						.getElement();
-				IObservableList targets = validationStatusProvider.getTargets();
-				if (listDiffEntry.isAddition()) {
-					targets
-							.addListChangeListener(validationStatusProviderTargetsListener);
-					for (Iterator it = targets.iterator(); it.hasNext();) {
-						((IObservable) it.next())
-								.addChangeListener(uiChangeListener);
-					}
-				} else {
-					targets
-							.removeListChangeListener(validationStatusProviderTargetsListener);
-					for (Iterator it = targets.iterator(); it.hasNext();) {
-						((IObservable) it.next())
-								.removeChangeListener(uiChangeListener);
-					}
-				}
-			}
-		}
-	};
-	private IListChangeListener validationStatusProviderTargetsListener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			ListDiff diff = event.diff;
-			ListDiffEntry[] differences = diff.getDifferences();
-			for (int i = 0; i < differences.length; i++) {
-				ListDiffEntry listDiffEntry = differences[i];
-				IObservable target = (IObservable) listDiffEntry.getElement();
-				if (listDiffEntry.isAddition()) {
-					target.addChangeListener(uiChangeListener);
-				} else {
-					target.removeChangeListener(uiChangeListener);
-				}
-			}
-		}
-	};
-	protected IStatus currentStatus;
-	protected boolean currentStatusStale;
-
-	/**
-	 * @param dialogPage
-	 * @param dbc
-	 * @noreference This constructor is not intended to be referenced by
-	 *              clients.
-	 */
-	protected DialogPageSupport(DialogPage dialogPage, DataBindingContext dbc) {
-		this.dialogPage = dialogPage;
-		this.dbc = dbc;
-		init();
-	}
-
-	/**
-	 * @return the dialog page
-	 * @noreference This method is not intended to be referenced by clients.
-	 */
-	protected DialogPage getDialogPage() {
-		return dialogPage;
-	}
-
-	/**
-	 * @noreference This method is not intended to be referenced by clients.
-	 */
-	protected void init() {
-		aggregateStatus = new AggregateValidationStatus(dbc
-				.getValidationStatusProviders(),
-				AggregateValidationStatus.MAX_SEVERITY);
-		aggregateStatus.addValueChangeListener(new IValueChangeListener() {
-			public void handleValueChange(ValueChangeEvent event) {
-				currentStatus = (IStatus) event.diff.getNewValue();
-				currentStatusStale = aggregateStatus.isStale();
-				handleStatusChanged();
-			}
-		});
-		aggregateStatus.addStaleListener(new IStaleListener() {
-			public void handleStale(StaleEvent staleEvent) {
-				currentStatusStale = true;
-				handleStatusChanged();
-			}
-		});
-		currentStatus = (IStatus) aggregateStatus.getValue();
-		currentStatusStale = aggregateStatus.isStale();
-		handleStatusChanged();
-		dbc.getValidationStatusProviders().addListChangeListener(
-				validationStatusProvidersListener);
-		for (Iterator it = dbc.getValidationStatusProviders().iterator(); it
-				.hasNext();) {
-			ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) it
-					.next();
-			IObservableList targets = validationStatusProvider.getTargets();
-			targets
-					.addListChangeListener(validationStatusProviderTargetsListener);
-			for (Iterator iter = targets.iterator(); iter.hasNext();) {
-				((IObservable) iter.next()).addChangeListener(uiChangeListener);
-			}
-		}
-	}
-
-	/**
-	 * @noreference This method is not intended to be referenced by clients.
-	 */
-	protected void handleUIChanged() {
-		uiChanged = true;
-		if (currentStatus != null) {
-			handleStatusChanged();
-		}
-		dbc.getValidationStatusProviders().removeListChangeListener(
-				validationStatusProvidersListener);
-		for (Iterator it = dbc.getValidationStatusProviders().iterator(); it
-				.hasNext();) {
-			ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) it
-					.next();
-			IObservableList targets = validationStatusProvider.getTargets();
-			targets
-					.removeListChangeListener(validationStatusProviderTargetsListener);
-			for (Iterator iter = targets.iterator(); iter.hasNext();) {
-				((IObservable) iter.next())
-						.removeChangeListener(uiChangeListener);
-			}
-		}
-	}
-
-	/**
-	 * @noreference This method is not intended to be referenced by clients.
-	 */
-	protected void handleStatusChanged() {
-		if (currentStatus != null
-				&& currentStatus.getSeverity() == IStatus.ERROR) {
-			dialogPage.setMessage(null);
-			dialogPage.setErrorMessage(uiChanged ? currentStatus.getMessage()
-					: null);
-			if (currentStatusHasException()) {
-				handleStatusException();
-			}
-		} else if (currentStatus != null
-				&& currentStatus.getSeverity() != IStatus.OK) {
-			int severity = currentStatus.getSeverity();
-			int type;
-			switch (severity) {
-			case IStatus.OK:
-				type = IMessageProvider.NONE;
-				break;
-			case IStatus.CANCEL:
-				type = IMessageProvider.NONE;
-				break;
-			case IStatus.INFO:
-				type = IMessageProvider.INFORMATION;
-				break;
-			case IStatus.WARNING:
-				type = IMessageProvider.WARNING;
-				break;
-			case IStatus.ERROR:
-				type = IMessageProvider.ERROR;
-				break;
-			default:
-				Assert.isTrue(false, "incomplete switch statement"); //$NON-NLS-1$
-				return; // unreachable
-			}
-			dialogPage.setErrorMessage(null);
-			dialogPage.setMessage(currentStatus.getMessage(), type);
-		} else {
-			dialogPage.setMessage(null);
-			dialogPage.setErrorMessage(null);
-		}
-	}
-
-	private boolean currentStatusHasException() {
-		boolean hasException = false;
-		if (currentStatus.getException() != null) {
-			hasException = true;
-		}
-		if (currentStatus instanceof MultiStatus) {
-			MultiStatus multiStatus = (MultiStatus) currentStatus;
-
-			for (int i = 0; i < multiStatus.getChildren().length; i++) {
-				IStatus status = multiStatus.getChildren()[i];
-				if (status.getException() != null) {
-					hasException = true;
-					break;
-				}
-			}
-		}
-		return hasException;
-	}
-
-	/**
-	 * @noreference This method is not intended to be referenced by clients.
-	 */
-	protected void handleStatusException() {
-		if (currentStatus.getException() != null) {
-			logThrowable(currentStatus.getException());
-		} else if (currentStatus instanceof MultiStatus) {
-			MultiStatus multiStatus = (MultiStatus) currentStatus;
-			for (int i = 0; i < multiStatus.getChildren().length; i++) {
-				IStatus status = multiStatus.getChildren()[i];
-				if (status.getException() != null) {
-					logThrowable(status.getException());
-				}
-			}
-		}
-	}
-
-	private void logThrowable(Throwable throwable) {
-		Policy
-				.getLog()
-				.log(
-						new Status(
-								IStatus.ERROR,
-								Policy.JFACE_DATABINDING,
-								IStatus.OK,
-								"Unhandled exception: " + throwable.getMessage(), throwable)); //$NON-NLS-1$
-	}
-
-	/**
-	 * Disposes of this wizard page support object, removing any listeners it
-	 * may have attached.
-	 */
-	public void dispose() {
-		aggregateStatus.dispose();
-		if (!uiChanged) {
-			for (Iterator it = dbc.getValidationStatusProviders().iterator(); it
-					.hasNext();) {
-				ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) it
-						.next();
-				IObservableList targets = validationStatusProvider.getTargets();
-				targets
-						.removeListChangeListener(validationStatusProviderTargetsListener);
-				for (Iterator iter = targets.iterator(); iter.hasNext();) {
-					((IObservable) iter.next())
-							.removeChangeListener(uiChangeListener);
-				}
-			}
-			dbc.getValidationStatusProviders().removeListChangeListener(
-					validationStatusProvidersListener);
-		}
-		aggregateStatus = null;
-		dbc = null;
-		uiChangeListener = null;
-		validationStatusProvidersListener = null;
-		validationStatusProviderTargetsListener = null;
-		dialogPage = null;
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/dialog/TitleAreaDialogSupport.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/dialog/TitleAreaDialogSupport.java
deleted file mode 100644
index ca629a1..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/dialog/TitleAreaDialogSupport.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *        (through WizardPageSupport.java)
- *     Matthew Hall - initial API and implementation (bug 239900)
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.dialog;
-
-import java.util.Iterator;
-
-import org.eclipse.core.databinding.AggregateValidationStatus;
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.ValidationStatusProvider;
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiff;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-
-/**
- * Connects the validation result from the given data binding context to the
- * given TitleAreaDialog, updating the dialog's error message accordingly.
- * 
- * @noextend This class is not intended to be subclassed by clients.
- * 
- * @since 1.3
- */
-public class TitleAreaDialogSupport {
-	/**
-	 * Connect the validation result from the given data binding context to the
-	 * given TitleAreaDialog. The page's error message will not be set at time
-	 * of creation, ensuring that the dialog does not show an error right away.
-	 * Upon any validation result change, the dialog's error message will be
-	 * updated according to the current validation result.
-	 * 
-	 * @param wizardPage
-	 * @param dbc
-	 * @return an instance of WizardPageSupport
-	 */
-	public static TitleAreaDialogSupport create(TitleAreaDialog wizardPage,
-			DataBindingContext dbc) {
-		return new TitleAreaDialogSupport(wizardPage, dbc);
-	}
-
-	private TitleAreaDialog dialog;
-	private DataBindingContext dbc;
-	private IObservableValue aggregateStatus;
-	private boolean uiChanged = false;
-	private IChangeListener uiChangeListener = new IChangeListener() {
-		public void handleChange(ChangeEvent event) {
-			handleUIChanged();
-		}
-	};
-	private IListChangeListener validationStatusProvidersListener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			ListDiff diff = event.diff;
-			ListDiffEntry[] differences = diff.getDifferences();
-			for (int i = 0; i < differences.length; i++) {
-				ListDiffEntry listDiffEntry = differences[i];
-				ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) listDiffEntry
-						.getElement();
-				IObservableList targets = validationStatusProvider.getTargets();
-				if (listDiffEntry.isAddition()) {
-					targets
-							.addListChangeListener(validationStatusProviderTargetsListener);
-					for (Iterator it = targets.iterator(); it.hasNext();) {
-						((IObservable) it.next())
-								.addChangeListener(uiChangeListener);
-					}
-				} else {
-					targets
-							.removeListChangeListener(validationStatusProviderTargetsListener);
-					for (Iterator it = targets.iterator(); it.hasNext();) {
-						((IObservable) it.next())
-								.removeChangeListener(uiChangeListener);
-					}
-				}
-			}
-		}
-	};
-	private IListChangeListener validationStatusProviderTargetsListener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			ListDiff diff = event.diff;
-			ListDiffEntry[] differences = diff.getDifferences();
-			for (int i = 0; i < differences.length; i++) {
-				ListDiffEntry listDiffEntry = differences[i];
-				IObservable target = (IObservable) listDiffEntry.getElement();
-				if (listDiffEntry.isAddition()) {
-					target.addChangeListener(uiChangeListener);
-				} else {
-					target.removeChangeListener(uiChangeListener);
-				}
-			}
-		}
-	};
-	private IStatus currentStatus;
-
-	private TitleAreaDialogSupport(TitleAreaDialog dialogPage,
-			DataBindingContext dbc) {
-		this.dialog = dialogPage;
-		this.dbc = dbc;
-		init();
-	}
-
-	private void init() {
-		aggregateStatus = new AggregateValidationStatus(dbc
-				.getValidationStatusProviders(),
-				AggregateValidationStatus.MAX_SEVERITY);
-		aggregateStatus.addValueChangeListener(new IValueChangeListener() {
-			public void handleValueChange(ValueChangeEvent event) {
-
-				currentStatus = (IStatus) event.diff.getNewValue();
-				handleStatusChanged();
-			}
-		});
-		currentStatus = (IStatus) aggregateStatus.getValue();
-		handleStatusChanged();
-		dbc.getValidationStatusProviders().addListChangeListener(
-				validationStatusProvidersListener);
-		for (Iterator it = dbc.getValidationStatusProviders().iterator(); it
-				.hasNext();) {
-			ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) it
-					.next();
-			IObservableList targets = validationStatusProvider.getTargets();
-			targets
-					.addListChangeListener(validationStatusProviderTargetsListener);
-			for (Iterator iter = targets.iterator(); iter.hasNext();) {
-				((IObservable) iter.next()).addChangeListener(uiChangeListener);
-			}
-		}
-	}
-
-	private void handleUIChanged() {
-		uiChanged = true;
-		if (currentStatus != null) {
-			handleStatusChanged();
-		}
-		dbc.getValidationStatusProviders().removeListChangeListener(
-				validationStatusProvidersListener);
-		for (Iterator it = dbc.getValidationStatusProviders().iterator(); it
-				.hasNext();) {
-			ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) it
-					.next();
-			IObservableList targets = validationStatusProvider.getTargets();
-			targets
-					.removeListChangeListener(validationStatusProviderTargetsListener);
-			for (Iterator iter = targets.iterator(); iter.hasNext();) {
-				((IObservable) iter.next())
-						.removeChangeListener(uiChangeListener);
-			}
-		}
-	}
-
-	private void handleStatusChanged() {
-		if (dialog.getShell() == null || dialog.getShell().isDisposed())
-			return;
-		if (currentStatus != null
-				&& currentStatus.getSeverity() == IStatus.ERROR) {
-			dialog.setMessage(null);
-			dialog.setErrorMessage(uiChanged ? currentStatus.getMessage()
-					: null);
-			if (currentStatusHasException()) {
-				handleStatusException();
-			}
-		} else if (currentStatus != null
-				&& currentStatus.getSeverity() != IStatus.OK) {
-			int severity = currentStatus.getSeverity();
-			int type;
-			switch (severity) {
-			case IStatus.OK:
-				type = IMessageProvider.NONE;
-				break;
-			case IStatus.CANCEL:
-				type = IMessageProvider.NONE;
-				break;
-			case IStatus.INFO:
-				type = IMessageProvider.INFORMATION;
-				break;
-			case IStatus.WARNING:
-				type = IMessageProvider.WARNING;
-				break;
-			case IStatus.ERROR:
-				type = IMessageProvider.ERROR;
-				break;
-			default:
-				Assert.isTrue(false, "incomplete switch statement"); //$NON-NLS-1$
-				return; // unreachable
-			}
-			dialog.setErrorMessage(null);
-			dialog.setMessage(currentStatus.getMessage(), type);
-		} else {
-			dialog.setMessage(null);
-			dialog.setErrorMessage(null);
-		}
-	}
-
-	private boolean currentStatusHasException() {
-		boolean hasException = false;
-		if (currentStatus.getException() != null) {
-			hasException = true;
-		}
-		if (currentStatus instanceof MultiStatus) {
-			MultiStatus multiStatus = (MultiStatus) currentStatus;
-
-			for (int i = 0; i < multiStatus.getChildren().length; i++) {
-				IStatus status = multiStatus.getChildren()[i];
-				if (status.getException() != null) {
-					hasException = true;
-					break;
-				}
-			}
-		}
-		return hasException;
-	}
-
-	/**
-	 * This is called when a Override to provide custom exception handling and
-	 * reporting.
-	 */
-	private void handleStatusException() {
-		if (currentStatus.getException() != null) {
-			logThrowable(currentStatus.getException());
-		} else if (currentStatus instanceof MultiStatus) {
-			MultiStatus multiStatus = (MultiStatus) currentStatus;
-			for (int i = 0; i < multiStatus.getChildren().length; i++) {
-				IStatus status = multiStatus.getChildren()[i];
-				if (status.getException() != null) {
-					logThrowable(status.getException());
-				}
-			}
-		}
-	}
-
-	private void logThrowable(Throwable throwable) {
-		Policy
-				.getLog()
-				.log(
-						new Status(
-								IStatus.ERROR,
-								Policy.JFACE_DATABINDING,
-								IStatus.OK,
-								"Unhandled exception: " + throwable.getMessage(), throwable)); //$NON-NLS-1$
-	}
-
-	/**
-	 * Disposes of this title area dialog support object, removing any listeners
-	 * it may have attached.
-	 */
-	public void dispose() {
-		aggregateStatus.dispose();
-		if (!uiChanged) {
-			for (Iterator it = dbc.getValidationStatusProviders().iterator(); it
-					.hasNext();) {
-				ValidationStatusProvider validationStatusProvider = (ValidationStatusProvider) it
-						.next();
-				IObservableList targets = validationStatusProvider.getTargets();
-				targets
-						.removeListChangeListener(validationStatusProviderTargetsListener);
-				for (Iterator iter = targets.iterator(); iter.hasNext();) {
-					((IObservable) iter.next())
-							.removeChangeListener(uiChangeListener);
-				}
-			}
-			dbc.getValidationStatusProviders().removeListChangeListener(
-					validationStatusProvidersListener);
-		}
-		aggregateStatus = null;
-		dbc = null;
-		uiChangeListener = null;
-		validationStatusProvidersListener = null;
-		validationStatusProviderTargetsListener = null;
-		dialog = null;
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/preference/PreferencePageSupport.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/preference/PreferencePageSupport.java
deleted file mode 100644
index 1fd1820..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/preference/PreferencePageSupport.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 239900)
- *******************************************************************************/
-package org.eclipse.jface.databinding.preference;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.databinding.dialog.DialogPageSupport;
-import org.eclipse.jface.preference.PreferencePage;
-
-/**
- * Connects the validation result from the given data binding context to the
- * given preference page, updating the preference page's valid state and its
- * error message accordingly.
- * 
- * @noextend This class is not intended to be subclassed by clients.
- * @since 1.3
- */
-public class PreferencePageSupport extends DialogPageSupport {
-	private PreferencePage preferencePage;
-
-	private PreferencePageSupport(PreferencePage preferencePage,
-			DataBindingContext dbc) {
-		super(preferencePage, dbc);
-		this.preferencePage = preferencePage;
-	}
-
-	/**
-	 * Connect the validation result from the given data binding context to the
-	 * given preference page. Upon creation, the preference page support will
-	 * use the context's validation result to determine whether the page is
-	 * valid. The page's error message will not be set at this time ensuring
-	 * that the preference page does not show an error right away. Upon any
-	 * validation result change, {@link PreferencePage#setValid(boolean)} will
-	 * be called reflecting the new validation result, and the preference page's
-	 * error message will be updated according to the current validation result.
-	 * 
-	 * @param preferencePage
-	 * @param dbc
-	 * @return an instance of PreferencePageSupport
-	 */
-	public static PreferencePageSupport create(PreferencePage preferencePage,
-			DataBindingContext dbc) {
-		return new PreferencePageSupport(preferencePage, dbc);
-	}
-
-	protected void handleStatusChanged() {
-		super.handleStatusChanged();
-		boolean valid = true;
-		if (currentStatusStale) {
-			valid = false;
-		} else if (currentStatus != null) {
-			valid = !currentStatus.matches(IStatus.ERROR | IStatus.CANCEL);
-		}
-		preferencePage.setValid(valid);
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/swt/ISWTObservable.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/swt/ISWTObservable.java
deleted file mode 100644
index f3a74f8..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/swt/ISWTObservable.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.swt;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * {@link IObservable} observing an SWT widget.
- * 
- * @since 1.1
- *
- */
-public interface ISWTObservable extends IObservable {
-	
-	/**
-	 * Returns the widget of this observable
-	 * 
-	 * @return the widget
-	 */
-	public Widget getWidget();
-
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/swt/ISWTObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/swt/ISWTObservableValue.java
deleted file mode 100644
index d25ba3a..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/swt/ISWTObservableValue.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.swt;
-
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-
-/**
- * {@link IObservableValue} observing an SWT widget.
- * 
- * @since 1.1
- *
- */
-public interface ISWTObservableValue extends ISWTObservable, IObservableValue {
-
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/swt/SWTObservables.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/swt/SWTObservables.java
deleted file mode 100644
index a429832..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/swt/SWTObservables.java
+++ /dev/null
@@ -1,588 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matt Carter - bug 170668
- *     Brad Reynolds - bug 170848
- *     Matthew Hall - bugs 180746, 207844, 245647, 248621, 232917
- *     Michael Krauter - bug 180223
- *     Boris Bokowski - bug 245647
- *******************************************************************************/
-package org.eclipse.jface.databinding.swt;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IVetoableValue;
-import org.eclipse.core.databinding.observable.value.ValueChangingEvent;
-import org.eclipse.jface.internal.databinding.internal.swt.LinkObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ButtonObservableValue;
-import org.eclipse.jface.internal.databinding.swt.CComboObservableList;
-import org.eclipse.jface.internal.databinding.swt.CComboObservableValue;
-import org.eclipse.jface.internal.databinding.swt.CComboSingleSelectionObservableValue;
-import org.eclipse.jface.internal.databinding.swt.CLabelObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ComboObservableList;
-import org.eclipse.jface.internal.databinding.swt.ComboObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ComboSingleSelectionObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ControlObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ItemObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ItemTooltipObservableValue;
-import org.eclipse.jface.internal.databinding.swt.LabelObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ListObservableList;
-import org.eclipse.jface.internal.databinding.swt.ListObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ListSingleSelectionObservableValue;
-import org.eclipse.jface.internal.databinding.swt.SWTDelayedObservableValueDecorator;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.jface.internal.databinding.swt.ScaleObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ShellObservableValue;
-import org.eclipse.jface.internal.databinding.swt.SpinnerObservableValue;
-import org.eclipse.jface.internal.databinding.swt.TableSingleSelectionObservableValue;
-import org.eclipse.jface.internal.databinding.swt.TextEditableObservableValue;
-import org.eclipse.jface.internal.databinding.swt.TextObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Scale;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Spinner;
-import org.eclipse.swt.widgets.TabItem;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.swt.widgets.TrayItem;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * A factory for creating observables for SWT widgets
- * 
- * @since 1.1
- * 
- */
-public class SWTObservables {
-
-	private static java.util.List realms = new ArrayList();
-
-	/**
-	 * Returns the realm representing the UI thread for the given display.
-	 * 
-	 * @param display
-	 * @return the realm representing the UI thread for the given display
-	 */
-	public static Realm getRealm(final Display display) {
-		synchronized (realms) {
-			for (Iterator it = realms.iterator(); it.hasNext();) {
-				DisplayRealm displayRealm = (DisplayRealm) it.next();
-				if (displayRealm.display == display) {
-					return displayRealm;
-				}
-			}
-			DisplayRealm result = new DisplayRealm(display);
-			realms.add(result);
-			return result;
-		}
-	}
-
-	/**
-	 * Returns an observable which delays notification of value change events
-	 * from <code>observable</code> until <code>delay</code> milliseconds have
-	 * elapsed since the last change event, or until a FocusOut event is
-	 * received from the underlying widget (whichever happens first). This
-	 * observable helps to boost performance in situations where an observable
-	 * has computationally expensive listeners (e.g. changing filters in a
-	 * viewer) or many dependencies (master fields with multiple detail fields).
-	 * A common use of this observable is to delay validation of user input
-	 * until the user stops typing in a UI field.
-	 * <p>
-	 * To notify about pending changes, the returned observable fires a stale
-	 * event when the wrapped observable value fires a change event, and remains
-	 * stale until the delay has elapsed and the value change is fired. A call
-	 * to {@link IObservableValue#getValue() getValue()} while a value change is
-	 * pending will fire the value change immediately, short-circuiting the
-	 * delay.
-	 * <p>
-	 * Note that this observable will not forward {@link ValueChangingEvent}
-	 * events from a wrapped {@link IVetoableValue}.
-	 * 
-	 * @param delay
-	 *            the delay in milliseconds
-	 * @param observable
-	 *            the observable being delayed
-	 * @return an observable which delays notification of value change events
-	 *         from <code>observable</code> until <code>delay</code>
-	 *         milliseconds have elapsed since the last change event.
-	 * 
-	 * @since 1.2
-	 */
-	public static ISWTObservableValue observeDelayedValue(int delay,
-			ISWTObservableValue observable) {
-		return new SWTDelayedObservableValueDecorator(Observables
-				.observeDelayedValue(delay, observable), observable.getWidget());
-	}
-
-	/**
-	 * @param control
-	 * @return an observable value tracking the enabled state of the given
-	 *         control
-	 */
-	public static ISWTObservableValue observeEnabled(Control control) {
-		return new ControlObservableValue(control, SWTProperties.ENABLED);
-	}
-
-	/**
-	 * @param control
-	 * @return an observable value tracking the visible state of the given
-	 *         control
-	 */
-	public static ISWTObservableValue observeVisible(Control control) {
-		return new ControlObservableValue(control, SWTProperties.VISIBLE);
-	}
-
-	/**
-	 * Returns an observable tracking the tooltip text of the given item. The supported types are:
-	 * <ul>
-	 * <li>org.eclipse.swt.widgets.Control</li>
-	 * <li>org.eclipse.swt.custom.CTabItem</li>
-	 * <li>org.eclipse.swt.widgets.TabItem</li>
-	 * <li>org.eclipse.swt.widgets.TableColumn</li>
-	 * <li>org.eclipse.swt.widgets.ToolItem</li>
-	 * <li>org.eclipse.swt.widgets.TrayItem</li>
-	 * <li>org.eclipse.swt.widgets.TreeColumn</li>
-	 * </ul>
-	 * @param widget
-	 * @return an observable value tracking the tooltip text of the given
-	 *         item
-	 * 
-	 * @since 1.3
-	 */
-	public static ISWTObservableValue observeTooltipText(Widget widget) {
-		if (widget instanceof Control) {
-			return new ControlObservableValue((Control)widget, SWTProperties.TOOLTIP_TEXT);
-		} else if (widget instanceof CTabItem
-				|| widget instanceof TabItem
-				|| widget instanceof TableColumn
-				|| widget instanceof ToolItem
-				|| widget instanceof TrayItem
-				|| widget instanceof TreeColumn) {
-			return new ItemTooltipObservableValue((Item) widget);
-		}
-		
-		throw new IllegalArgumentException(
-				"Item [" + widget.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * @param control
-	 * @return an observable value tracking the tooltip text of the given
-	 *         control
-	 */
-	public static ISWTObservableValue observeTooltipText(Control control) {
-		return observeTooltipText((Widget) control);
-	}
-
-	/**
-	 * Returns an observable observing the selection attribute of the provided
-	 * <code>control</code>. The supported types are:
-	 * <ul>
-	 * <li>org.eclipse.swt.widgets.Spinner</li>
-	 * <li>org.eclipse.swt.widgets.Button</li>
-	 * <li>org.eclipse.swt.widgets.Combo</li>
-	 * <li>org.eclipse.swt.custom.CCombo</li>
-	 * <li>org.eclipse.swt.widgets.List</li>
-	 * <li>org.eclipse.swt.widgets.Scale</li>
-	 * </ul>
-	 * 
-	 * @param control
-	 * @return observable value
-	 * @throws IllegalArgumentException
-	 *             if <code>control</code> type is unsupported
-	 */
-	public static ISWTObservableValue observeSelection(Control control) {
-		if (control instanceof Spinner) {
-			return new SpinnerObservableValue((Spinner) control,
-					SWTProperties.SELECTION);
-		} else if (control instanceof Button) {
-			return new ButtonObservableValue((Button) control);
-		} else if (control instanceof Combo) {
-			return new ComboObservableValue((Combo) control,
-					SWTProperties.SELECTION);
-		} else if (control instanceof CCombo) {
-			return new CComboObservableValue((CCombo) control,
-					SWTProperties.SELECTION);
-		} else if (control instanceof List) {
-			return new ListObservableValue((List) control);
-		} else if (control instanceof Scale) {
-			return new ScaleObservableValue((Scale) control,
-					SWTProperties.SELECTION);
-		}
-
-		throw new IllegalArgumentException(
-				"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * Returns an observable observing the minimum attribute of the provided
-	 * <code>control</code>. The supported types are:
-	 * <ul>
-	 * <li>org.eclipse.swt.widgets.Spinner</li>
-	 * <li>org.eclipse.swt.widgets.Scale</li>
-	 * </ul>
-	 * 
-	 * @param control
-	 * @return observable value
-	 * @throws IllegalArgumentException
-	 *             if <code>control</code> type is unsupported
-	 */
-	public static ISWTObservableValue observeMin(Control control) {
-		if (control instanceof Spinner) {
-			return new SpinnerObservableValue((Spinner) control,
-					SWTProperties.MIN);
-		} else if (control instanceof Scale) {
-			return new ScaleObservableValue((Scale) control, SWTProperties.MIN);
-		}
-
-		throw new IllegalArgumentException(
-				"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * Returns an observable observing the maximum attribute of the provided
-	 * <code>control</code>. The supported types are:
-	 * <ul>
-	 * <li>org.eclipse.swt.widgets.Spinner</li>
-	 * <li>org.eclipse.swt.widgets.Scale</li>
-	 * </ul>
-	 * 
-	 * @param control
-	 * @return observable value
-	 * @throws IllegalArgumentException
-	 *             if <code>control</code> type is unsupported
-	 */
-	public static ISWTObservableValue observeMax(Control control) {
-		if (control instanceof Spinner) {
-			return new SpinnerObservableValue((Spinner) control,
-					SWTProperties.MAX);
-		} else if (control instanceof Scale) {
-			return new ScaleObservableValue((Scale) control, SWTProperties.MAX);
-		}
-
-		throw new IllegalArgumentException(
-				"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * Returns an observable observing the text attribute of the provided
-	 * <code>control</code>. The supported types are:
-	 * <ul>
-	 * <li>org.eclipse.swt.widgets.Text</li>
-	 * </ul>
-	 * 
-	 * @param control
-	 * @param event event type to register for change events
-	 * @return observable value
-	 * @throws IllegalArgumentException
-	 *             if <code>control</code> type is unsupported
-	 */
-	public static ISWTObservableValue observeText(Control control, int event) {
-		if (control instanceof Text) {
-			return new TextObservableValue((Text) control, event);
-		}
-
-		throw new IllegalArgumentException(
-				"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * Returns an observable observing the text attribute of the provided
-	 * <code>widget</code>. The supported types are:
-	 * <ul>
-	 * <li>org.eclipse.swt.widgets.Label</li>
-	 * <li>org.eclipse.swt.widgets.Link</li>
-	 * <li>org.eclipse.swt.custom.Label</li>
-	 * <li>org.eclipse.swt.widgets.Combo</li>
-	 * <li>org.eclipse.swt.custom.CCombo</li>
-	 * <li>org.eclipse.swt.widgets.Shell</li>
-	 * <li>org.eclipse.swt.widgets.Text</li>
-	 * <li>org.eclipse.swt.widgets.Item</li>
-	 * </ul>
-	 * 
-	 * @param widget
-	 * @return observable value
-	 * @throws IllegalArgumentException
-	 *             if the type of <code>widget</code> is unsupported
-	 *             
-	 * @since 1.3
-	 */
-	public static ISWTObservableValue observeText(Widget widget) {
-		if (widget instanceof Label) {
-			return new LabelObservableValue((Label) widget);
-		} else if (widget instanceof Link) {
-			return new LinkObservableValue((Link) widget);
-		} else if (widget instanceof CLabel) {
-			return new CLabelObservableValue((CLabel) widget);
-		} else if (widget instanceof Combo) {
-			return new ComboObservableValue((Combo) widget, SWTProperties.TEXT);
-		} else if (widget instanceof CCombo) {
-			return new CComboObservableValue((CCombo) widget,
-					SWTProperties.TEXT);
-		} else if (widget instanceof Shell) {
-			return new ShellObservableValue((Shell) widget);
-		} else if (widget instanceof Text) {
-			return new TextObservableValue((Text) widget, SWT.None);
-		} else if (widget instanceof Item) {
-			return new ItemObservableValue((Item)widget);
-		}
-
-		throw new IllegalArgumentException(
-				"Widget [" + widget.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * Returns an observable observing the text attribute of the provided
-	 * <code>control</code>. The supported types are:
-	 * <ul>
-	 * <li>org.eclipse.swt.widgets.Label</li>
-	 * <li>org.eclipse.swt.widgets.Link (as of 1.2)</li>
-	 * <li>org.eclipse.swt.custom.Label</li>
-	 * <li>org.eclipse.swt.widgets.Combo</li>
-	 * <li>org.eclipse.swt.custom.CCombo</li>
-	 * <li>org.eclipse.swt.widgets.Shell</li>
-	 * <li>org.eclipse.swt.widgets.Text (as of 1.3)</li>
-	 * </ul>
-	 * 
-	 * @param control
-	 * @return observable value
-	 * @throws IllegalArgumentException
-	 *             if <code>control</code> type is unsupported
-	 */
-	public static ISWTObservableValue observeText(Control control) {
-		return observeText((Widget) control);
-	}
-
-	/**
-	 * Returns an observable observing the items attribute of the provided
-	 * <code>control</code>. The supported types are:
-	 * <ul>
-	 * <li>org.eclipse.swt.widgets.Combo</li>
-	 * <li>org.eclipse.swt.custom.CCombo</li>
-	 * <li>org.eclipse.swt.widgets.List</li>
-	 * </ul>
-	 * 
-	 * @param control
-	 * @return observable list
-	 * @throws IllegalArgumentException
-	 *             if <code>control</code> type is unsupported
-	 */
-	public static IObservableList observeItems(Control control) {
-		if (control instanceof Combo) {
-			return new ComboObservableList((Combo) control);
-		} else if (control instanceof CCombo) {
-			return new CComboObservableList((CCombo) control);
-		} else if (control instanceof List) {
-			return new ListObservableList((List) control);
-		}
-
-		throw new IllegalArgumentException(
-				"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * Returns an observable observing the single selection index attribute of
-	 * the provided <code>control</code>. The supported types are:
-	 * <ul>
-	 * <li>org.eclipse.swt.widgets.Table</li>
-	 * <li>org.eclipse.swt.widgets.Combo</li>
-	 * <li>org.eclipse.swt.custom.CCombo</li>
-	 * <li>org.eclipse.swt.widgets.List</li>
-	 * </ul>
-	 * 
-	 * @param control
-	 * @return observable value
-	 * @throws IllegalArgumentException
-	 *             if <code>control</code> type is unsupported
-	 */
-	public static ISWTObservableValue observeSingleSelectionIndex(
-			Control control) {
-		if (control instanceof Table) {
-			return new TableSingleSelectionObservableValue((Table) control);
-		} else if (control instanceof Combo) {
-			return new ComboSingleSelectionObservableValue((Combo) control);
-		} else if (control instanceof CCombo) {
-			return new CComboSingleSelectionObservableValue((CCombo) control);
-		} else if (control instanceof List) {
-			return new ListSingleSelectionObservableValue((List) control);
-		}
-
-		throw new IllegalArgumentException(
-				"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * @param control
-	 * @return an observable value tracking the foreground color of the given
-	 *         control
-	 */
-	public static ISWTObservableValue observeForeground(Control control) {
-		return new ControlObservableValue(control, SWTProperties.FOREGROUND);
-	}
-
-	/**
-	 * @param control
-	 * @return an observable value tracking the background color of the given
-	 *         control
-	 */
-	public static ISWTObservableValue observeBackground(Control control) {
-		return new ControlObservableValue(control, SWTProperties.BACKGROUND);
-	}
-
-	/**
-	 * @param control
-	 * @return an observable value tracking the font of the given control
-	 */
-	public static ISWTObservableValue observeFont(Control control) {
-		return new ControlObservableValue(control, SWTProperties.FONT);
-	}
-	
-	/**
-	 * @param control
-	 * @return an observable value tracking the size of the given control
-	 * @since 1.3
-	 */
-	public static ISWTObservableValue observeSize(Control control) {
-		return new ControlObservableValue(control,SWTProperties.SIZE);
-	}
-	
-	/**
-	 * @param control
-	 * @return an observable value tracking the location of the given control
-	 * @since 1.3
-	 */
-	public static ISWTObservableValue observeLocation(Control control) {
-		return new ControlObservableValue(control,SWTProperties.LOCATION);
-	}
-	
-	/**
-	 * @param control
-	 * @return an observable value tracking the focus of the given control
-	 * @since 1.3
-	 */
-	public static ISWTObservableValue observeFocus(Control control) {
-		return new ControlObservableValue(control,SWTProperties.FOCUS);
-	}
-	
-	/**
-	 * @param control
-	 * @return an observable value tracking the bounds of the given control
-	 * @since 1.3
-	 */
-	public static ISWTObservableValue observeBounds(Control control) {
-		return new ControlObservableValue(control,SWTProperties.BOUNDS);
-	}
-	
-	/**
-	 * Returns an observable observing the editable attribute of
-	 * the provided <code>control</code>. The supported types are:
-	 * <ul>
-	 * <li>org.eclipse.swt.widgets.Text</li>
-	 * </ul>
-	 * 
-	 * @param control
-	 * @return observable value
-	 * @throws IllegalArgumentException
-	 *             if <code>control</code> type is unsupported
-	 */
-	public static ISWTObservableValue observeEditable(Control control) {
-		if (control instanceof Text) {
-			return new TextEditableObservableValue((Text) control);
-		}
-		
-		throw new IllegalArgumentException(
-				"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	private static class DisplayRealm extends Realm {
-		private Display display;
-
-		/**
-		 * @param display
-		 */
-		private DisplayRealm(Display display) {
-			this.display = display;
-		}
-
-		public boolean isCurrent() {
-			return Display.getCurrent() == display;
-		}
-
-		public void asyncExec(final Runnable runnable) {
-			Runnable safeRunnable = new Runnable() {
-				public void run() {
-					safeRun(runnable);
-				}
-			};
-			if (!display.isDisposed()) {
-				display.asyncExec(safeRunnable);
-			}
-		}
-
-		public void timerExec(int milliseconds, final Runnable runnable) {
-			if (!display.isDisposed()) {
-				Runnable safeRunnable = new Runnable() {
-					public void run() {
-						safeRun(runnable);
-					}
-				};
-				display.timerExec(milliseconds, safeRunnable);
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.lang.Object#hashCode()
-		 */
-		public int hashCode() {
-			return (display == null) ? 0 : display.hashCode();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.lang.Object#equals(java.lang.Object)
-		 */
-		public boolean equals(Object obj) {
-			if (this == obj)
-				return true;
-			if (obj == null)
-				return false;
-			if (getClass() != obj.getClass())
-				return false;
-			final DisplayRealm other = (DisplayRealm) obj;
-			if (display == null) {
-				if (other.display != null)
-					return false;
-			} else if (!display.equals(other.display))
-				return false;
-			return true;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/swt/package.html b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/swt/package.html
deleted file mode 100644
index 139ca4f..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/swt/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes that can be used to observe changes in SWT widgets.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that can be used to observe changes in SWT widgets.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/IViewerObservable.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/IViewerObservable.java
deleted file mode 100644
index 50703cd..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/IViewerObservable.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.viewers;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * {@link IObservable} observing a JFace Viewer.
- * 
- * @since 1.2
- * 
- */
-public interface IViewerObservable extends IObservable {
-	/**
-	 * Returns the underlying viewer for this observable.
-	 * 
-	 * @return the viewer.
-	 */
-	public Viewer getViewer();
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/IViewerObservableList.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/IViewerObservableList.java
deleted file mode 100644
index 6b3ed4b..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/IViewerObservableList.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.viewers;
-
-import org.eclipse.core.databinding.observable.list.IObservableList;
-
-/**
- * {@link IObservableList} observing a JFace Viewer.
- * 
- * @since 1.2
- * 
- */
-public interface IViewerObservableList extends IObservableList,
-		IViewerObservable {
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/IViewerObservableSet.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/IViewerObservableSet.java
deleted file mode 100644
index b8f98e6..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/IViewerObservableSet.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 124684)
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.viewers;
-
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-
-/**
- * {@link IObservableSet} observing a JFace Viewer.
- * 
- * @since 1.2
- * 
- */
-public interface IViewerObservableSet extends IObservableSet, IViewerObservable {
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/IViewerObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/IViewerObservableValue.java
deleted file mode 100644
index 6c145cf..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/IViewerObservableValue.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.viewers;
-
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-
-/**
- * {@link IObservableValue} observing a JFace Viewer.
- * 
- * @since 1.2
- * 
- */
-public interface IViewerObservableValue extends IObservableValue,
-		IViewerObservable {
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ListeningLabelProvider.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ListeningLabelProvider.java
deleted file mode 100644
index 5588a6f..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ListeningLabelProvider.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.viewers;
-
-import java.util.Iterator;
-
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-import org.eclipse.jface.internal.databinding.provisional.viewers.ViewerLabelProvider;
-
-/**
- * @since 1.1
- * 
- */
-public abstract class ListeningLabelProvider extends ViewerLabelProvider {
-
-	private ISetChangeListener listener = new ISetChangeListener() {
-		public void handleSetChange(SetChangeEvent event) {
-			for (Iterator it = event.diff.getAdditions().iterator(); it.hasNext();) {
-				addListenerTo(it.next());
-			}
-			for (Iterator it = event.diff.getRemovals().iterator(); it.hasNext();) {
-				removeListenerFrom(it.next());
-			}
-		}
-	};
-
-	private IObservableSet items;
-
-	/**
-	 * @param itemsThatNeedLabels
-	 */
-	public ListeningLabelProvider(IObservableSet itemsThatNeedLabels) {
-		this.items = itemsThatNeedLabels;
-		items.addSetChangeListener(listener);
-		for (Iterator it = items.iterator(); it.hasNext();) {
-			addListenerTo(it.next());
-		}
-	}
-
-	/**
-	 * @param next
-	 */
-	protected abstract void removeListenerFrom(Object next);
-
-	/**
-	 * @param next
-	 */
-	protected abstract void addListenerTo(Object next);
-
-	public void dispose() {
-		for (Iterator iter = items.iterator(); iter.hasNext();) {
-			removeListenerFrom(iter.next());
-		}
-		items.removeSetChangeListener(listener);
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableListContentProvider.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableListContentProvider.java
deleted file mode 100644
index 7fbbd0b..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableListContentProvider.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl<tom.schindl@bestsolution.at> - bugfix in: 214355
- *     Matthew Hall - bugs 215531, 226765, 222991
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.viewers;
-
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiffVisitor;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.internal.databinding.viewers.ObservableCollectionContentProvider;
-import org.eclipse.jface.internal.databinding.viewers.ViewerElementSet;
-import org.eclipse.jface.viewers.AbstractListViewer;
-import org.eclipse.jface.viewers.AbstractTableViewer;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * A {@link IStructuredContentProvider content provider} for
- * {@link AbstractTableViewer} or {@link AbstractListViewer} that provides
- * elements of an {@link IObservableList} when set as the viewer's input.
- * Objects of this class listen for changes to the observable list, and will
- * insert and remove viewer elements to reflect observed changes.
- * 
- * <p>
- * This class is not intended to be subclassed by clients.
- * 
- * @since 1.1
- */
-public class ObservableListContentProvider implements
-		IStructuredContentProvider {
-	private ObservableCollectionContentProvider impl;
-
-	private static class Impl extends ObservableCollectionContentProvider
-			implements IListChangeListener {
-		protected void checkInput(Object input) {
-			Assert
-					.isTrue(input instanceof IObservableList,
-							"This content provider only works with input of type IObservableList"); //$NON-NLS-1$
-		}
-
-		protected void addCollectionChangeListener(
-				IObservableCollection collection) {
-			((IObservableList) collection).addListChangeListener(this);
-		}
-
-		protected void removeCollectionChangeListener(
-				IObservableCollection collection) {
-			((IObservableList) collection).removeListChangeListener(this);
-		}
-
-		public void handleListChange(ListChangeEvent event) {
-			if (isViewerDisposed())
-				return;
-
-			// Determine which elements were added and removed
-			final Set knownElementAdditions = ViewerElementSet
-					.withComparer(comparer);
-			final Set knownElementRemovals = ViewerElementSet
-					.withComparer(comparer);
-			event.diff.accept(new ListDiffVisitor() {
-				public void handleAdd(int index, Object element) {
-					knownElementAdditions.add(element);
-				}
-
-				public void handleRemove(int index, Object element) {
-					knownElementRemovals.add(element);
-				}
-			});
-			knownElementAdditions.removeAll(knownElements);
-			knownElementRemovals.removeAll(event.getObservableList());
-
-			knownElements.addAll(knownElementAdditions);
-			if (realizedElements != null) {
-				realizedElements.removeAll(knownElementRemovals);
-			}
-
-			event.diff.accept(new ListDiffVisitor() {
-				public void handleAdd(int index, Object element) {
-					viewerUpdater.insert(element, index);
-				}
-
-				public void handleRemove(int index, Object element) {
-					viewerUpdater.remove(element, index);
-				}
-
-				public void handleReplace(int index, Object oldElement,
-						Object newElement) {
-					viewerUpdater.replace(oldElement, newElement, index);
-				}
-
-				public void handleMove(int oldIndex, int newIndex,
-						Object element) {
-					viewerUpdater.move(element, oldIndex, newIndex);
-				}
-			});
-
-			if (realizedElements != null) {
-				realizedElements.addAll(knownElementAdditions);
-			}
-			knownElements.removeAll(knownElementRemovals);
-		}
-	}
-
-	/**
-	 * Constructs an ObservableListContentProvider
-	 */
-	public ObservableListContentProvider() {
-		impl = new Impl();
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		impl.inputChanged(viewer, oldInput, newInput);
-	}
-
-	public Object[] getElements(Object inputElement) {
-		return impl.getElements(inputElement);
-	}
-
-	public void dispose() {
-		impl.dispose();
-	}
-
-	/**
-	 * Returns the set of elements known to this content provider. Label
-	 * providers may track this set if they need to be notified about additions
-	 * before the viewer sees the added element, and notified about removals
-	 * after the element was removed from the viewer. This is intended for use
-	 * by label providers, as it will always return the items that need labels.
-	 * 
-	 * @return readableSet of items that will need labels
-	 */
-	public IObservableSet getKnownElements() {
-		return impl.getKnownElements();
-	}
-
-	/**
-	 * Returns the set of known elements which have been realized in the viewer.
-	 * Clients may track this set in order to perform custom actions on elements
-	 * while they are known to be present in the viewer.
-	 * 
-	 * @return the set of known elements which have been realized in the viewer.
-	 * @since 1.3
-	 */
-	public IObservableSet getRealizedElements() {
-		return impl.getRealizedElements();
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableListTreeContentProvider.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableListTreeContentProvider.java
deleted file mode 100644
index 789f4eb..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableListTreeContentProvider.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 207858)
- *     Matthew Hall - bugs 226765, 222991
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.viewers;
-
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.IObservablesListener;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiffVisitor;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.jface.internal.databinding.viewers.ObservableCollectionTreeContentProvider;
-import org.eclipse.jface.internal.databinding.viewers.ViewerElementSet;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * An {@link ITreeContentProvider} for use with an {@link AbstractTreeViewer},
- * which uses the provided {@link IObservableFactory list factory} to obtain the
- * elements of a tree. Object of this class listen for changes to each
- * {@link IObservableList} created by the factory, and will insert and remove
- * viewer elements to reflect the observed changes.
- * 
- * <p>
- * This class is not intended to be subclassed by clients.
- * 
- * @since 1.2
- */
-public class ObservableListTreeContentProvider implements ITreeContentProvider {
-	private final ObservableCollectionTreeContentProvider impl;
-
-	private static class Impl extends ObservableCollectionTreeContentProvider {
-		public Impl(IObservableFactory listFactory,
-				TreeStructureAdvisor structureAdvisor) {
-			super(listFactory, structureAdvisor);
-		}
-
-		private class ListChangeListener implements IListChangeListener {
-			final Object parentElement;
-
-			public ListChangeListener(Object parentElement) {
-				this.parentElement = parentElement;
-			}
-
-			public void handleListChange(ListChangeEvent event) {
-				if (isViewerDisposed())
-					return;
-
-				// Determine which elements are being added and removed
-				final Set localKnownElementAdditions = ViewerElementSet
-						.withComparer(comparer);
-				final Set localKnownElementRemovals = ViewerElementSet
-						.withComparer(comparer);
-				event.diff.accept(new ListDiffVisitor() {
-					public void handleAdd(int index, Object element) {
-						localKnownElementAdditions.add(element);
-					}
-
-					public void handleRemove(int index, Object element) {
-						localKnownElementRemovals.add(element);
-					}
-
-					public void handleMove(int oldIndex, int newIndex,
-							Object element) {
-						// ignore
-					}
-				});
-				localKnownElementRemovals.removeAll(event.getObservableList());
-
-				Set knownElementAdditions = ViewerElementSet
-						.withComparer(comparer);
-				knownElementAdditions.addAll(localKnownElementAdditions);
-				knownElementAdditions.removeAll(knownElements);
-
-				Set knownElementRemovals = findPendingRemovals(parentElement,
-						localKnownElementRemovals);
-				knownElementRemovals.retainAll(knownElements);
-
-				knownElements.addAll(knownElementAdditions);
-				if (realizedElements != null) {
-					realizedElements.removeAll(knownElementRemovals);
-				}
-
-				for (Iterator it = localKnownElementAdditions.iterator(); it
-						.hasNext();) {
-					getOrCreateNode(it.next()).addParent(parentElement);
-				}
-
-				event.diff.accept(new ListDiffVisitor() {
-					public void handleAdd(int index, Object child) {
-						viewerUpdater.insert(parentElement, child, index);
-					}
-
-					public void handleRemove(int index, Object child) {
-						viewerUpdater.remove(parentElement, child, index);
-					}
-
-					public void handleReplace(int index, Object oldChild,
-							Object newChild) {
-						viewerUpdater.replace(parentElement, oldChild,
-								newChild, index);
-					}
-
-					public void handleMove(int oldIndex, int newIndex,
-							Object child) {
-						viewerUpdater.move(parentElement, child, oldIndex,
-								newIndex);
-					}
-				});
-
-				for (Iterator it = localKnownElementRemovals.iterator(); it
-						.hasNext();) {
-					TreeNode node = getExistingNode(it.next());
-					if (node != null) {
-						node.removeParent(parentElement);
-					}
-				}
-
-				if (realizedElements != null) {
-					realizedElements.addAll(knownElementAdditions);
-				}
-				knownElements.removeAll(knownElementRemovals);
-			}
-		}
-
-		protected IObservablesListener createCollectionChangeListener(
-				Object parentElement) {
-			return new ListChangeListener(parentElement);
-		}
-
-		protected void addCollectionChangeListener(
-				IObservableCollection collection, IObservablesListener listener) {
-			IObservableList list = (IObservableList) collection;
-			IListChangeListener listListener = (IListChangeListener) listener;
-			list.addListChangeListener(listListener);
-		}
-
-		protected void removeCollectionChangeListener(
-				IObservableCollection collection, IObservablesListener listener) {
-			IObservableList list = (IObservableList) collection;
-			IListChangeListener listListener = (IListChangeListener) listener;
-			list.removeListChangeListener(listListener);
-		}
-	}
-
-	/**
-	 * Constructs an ObservableListTreeContentProvider using the given list
-	 * factory.
-	 * 
-	 * @param listFactory
-	 *            observable factory that produces an IObservableList of
-	 *            children for a given parent element. Observable lists created
-	 *            by this factory must be on the realm of the current display.
-	 * @param structureAdvisor
-	 *            an advisor that will be consulted from the implementations of
-	 *            the {@link #getParent(Object)} and
-	 *            {@link #hasChildren(Object)} methods, or <code>null</code>
-	 *            if no advisor is available. It is recommended that clients
-	 *            pass a non-null advisor if they can provide additional
-	 *            structural information about the tree.
-	 */
-	public ObservableListTreeContentProvider(IObservableFactory listFactory,
-			TreeStructureAdvisor structureAdvisor) {
-		impl = new Impl(listFactory, structureAdvisor);
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		impl.inputChanged(viewer, oldInput, newInput);
-	}
-
-	public Object[] getElements(Object inputElement) {
-		return impl.getElements(inputElement);
-	}
-
-	public boolean hasChildren(Object element) {
-		return impl.hasChildren(element);
-	}
-
-	public Object[] getChildren(Object parentElement) {
-		return impl.getChildren(parentElement);
-	}
-
-	public Object getParent(Object element) {
-		return impl.getParent(element);
-	}
-
-	public void dispose() {
-		impl.dispose();
-	}
-
-	/**
-	 * Returns the set of elements known to this content provider. Label
-	 * providers may track this set if they need to be notified about additions
-	 * before the viewer sees the added element, and notified about removals
-	 * after the element was removed from the viewer. This is intended for use
-	 * by label providers, as it will always return the items that need labels.
-	 * 
-	 * @return readableSet of items that will need labels
-	 */
-	public IObservableSet getKnownElements() {
-		return impl.getKnownElements();
-	}
-
-	/**
-	 * Returns the set of known elements which have been realized in the viewer.
-	 * Clients may track this set in order to perform custom actions on elements
-	 * while they are known to be present in the viewer.
-	 * 
-	 * @return the set of known elements which have been realized in the viewer.
-	 * @since 1.3
-	 */
-	public IObservableSet getRealizedElements() {
-		return impl.getRealizedElements();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableMapLabelProvider.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableMapLabelProvider.java
deleted file mode 100644
index 5d9d434..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableMapLabelProvider.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164247
- *     Brad Reynolds - bug 164134
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.viewers;
-
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.map.MapChangeEvent;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @since 1.1
- * 
- */
-public class ObservableMapLabelProvider extends LabelProvider
-		implements ILabelProvider, ITableLabelProvider {
-
-	private final IObservableMap[] attributeMaps;
-
-	private IMapChangeListener mapChangeListener = new IMapChangeListener() {
-		public void handleMapChange(MapChangeEvent event) {
-			Set affectedElements = event.diff.getChangedKeys();
-			LabelProviderChangedEvent newEvent = new LabelProviderChangedEvent(
-					ObservableMapLabelProvider.this, affectedElements
-							.toArray());
-			fireLabelProviderChanged(newEvent);
-		}
-	};
-
-	/**
-	 * @param attributeMap
-	 */
-	public ObservableMapLabelProvider(IObservableMap attributeMap) {
-		this(new IObservableMap[] { attributeMap });
-	}
-
-	/**
-	 * @param attributeMaps
-	 */
-	public ObservableMapLabelProvider(IObservableMap[] attributeMaps) {
-		System.arraycopy(attributeMaps, 0, this.attributeMaps = attributeMaps, 0, attributeMaps.length);
-		for (int i = 0; i < attributeMaps.length; i++) {
-			attributeMaps[i].addMapChangeListener(mapChangeListener);
-		}
-	}
-
-	public void dispose() {
-		for (int i = 0; i < attributeMaps.length; i++) {
-			attributeMaps[i].removeMapChangeListener(mapChangeListener);
-		}
-		super.dispose();
-	}
-
-	public Image getImage(Object element) {
-		return null;
-	}
-
-	public String getText(Object element) {
-		return getColumnText(element, 0);
-	}
-
-	public Image getColumnImage(Object element, int columnIndex) {
-		return null;
-	}
-
-	public String getColumnText(Object element, int columnIndex) {
-		if (columnIndex < attributeMaps.length) {
-			Object result = attributeMaps[columnIndex].get(element);
-			return result == null ? "" : result.toString(); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableSetContentProvider.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableSetContentProvider.java
deleted file mode 100644
index 872ba04..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableSetContentProvider.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *     Matthew Hall - bugs 215531, 226765, 222991
- *******************************************************************************/
-package org.eclipse.jface.databinding.viewers;
-
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.internal.databinding.viewers.ObservableCollectionContentProvider;
-import org.eclipse.jface.viewers.AbstractListViewer;
-import org.eclipse.jface.viewers.AbstractTableViewer;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * A {@link IStructuredContentProvider content provider} for
- * {@link AbstractTableViewer} or {@link AbstractListViewer} that provides
- * elements of an {@link IObservableSet} when set as the viewer's input. Objects
- * of this class listen for changes to the observable set, and will insert and
- * remove viewer elements to reflect observed changes.
- * 
- * <p>
- * This class is not intended to be subclassed by clients.
- * 
- * @since 1.1
- */
-public class ObservableSetContentProvider implements IStructuredContentProvider {
-	private ObservableCollectionContentProvider impl;
-
-	private static class Impl extends ObservableCollectionContentProvider
-			implements ISetChangeListener {
-		protected void checkInput(Object input) {
-			Assert
-					.isTrue(input instanceof IObservableSet,
-							"This content provider only works with input of type IObservableSet"); //$NON-NLS-1$
-		}
-
-		protected void addCollectionChangeListener(
-				IObservableCollection collection) {
-			((IObservableSet) collection).addSetChangeListener(this);
-		}
-
-		protected void removeCollectionChangeListener(
-				IObservableCollection collection) {
-			((IObservableSet) collection).removeSetChangeListener(this);
-		}
-
-		public void handleSetChange(SetChangeEvent event) {
-			if (isViewerDisposed())
-				return;
-
-			Set removals = event.diff.getRemovals();
-			Set additions = event.diff.getAdditions();
-
-			knownElements.addAll(additions);
-			realizedElements.removeAll(removals);
-
-			viewerUpdater.remove(removals.toArray());
-			viewerUpdater.add(additions.toArray());
-
-			realizedElements.addAll(additions);
-			knownElements.removeAll(removals);
-		}
-	}
-
-	/**
-	 * Constructs an ObservableSetContentProvider
-	 */
-	public ObservableSetContentProvider() {
-		impl = new Impl();
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		impl.inputChanged(viewer, oldInput, newInput);
-	}
-
-	public Object[] getElements(Object inputElement) {
-		return impl.getElements(inputElement);
-	}
-
-	public void dispose() {
-		impl.dispose();
-	}
-
-	/**
-	 * Returns the set of elements known to this content provider. Label
-	 * providers may track this set if they need to be notified about additions
-	 * before the viewer sees the added element, and notified about removals
-	 * after the element was removed from the viewer. This is intended for use
-	 * by label providers, as it will always return the items that need labels.
-	 * 
-	 * @return unmodifiable set of items that will need labels
-	 */
-	public IObservableSet getKnownElements() {
-		return impl.getKnownElements();
-	}
-
-	/**
-	 * Returns the set of known elements which have been realized in the viewer.
-	 * Clients may track this set in order to perform custom actions on elements
-	 * while they are known to be present in the viewer.
-	 * 
-	 * @return the set of known elements which have been realized in the viewer.
-	 * @since 1.3
-	 */
-	public IObservableSet getRealizedElements() {
-		return impl.getRealizedElements();
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableSetTreeContentProvider.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableSetTreeContentProvider.java
deleted file mode 100644
index 46084d0..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableSetTreeContentProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 207858)
- *     Matthew Hall - bugs 226765, 222991
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.viewers;
-
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.IObservablesListener;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-import org.eclipse.jface.internal.databinding.viewers.ObservableCollectionTreeContentProvider;
-import org.eclipse.jface.internal.databinding.viewers.ViewerElementSet;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * An {@link ITreeContentProvider} for use with an {@link AbstractTreeViewer},
- * which uses the provided {@link IObservableFactory set factory} to obtain the
- * elements of a tree. Objects of this class listen for changes to each
- * {@link IObservableSet} created by the factory, and will insert and remove
- * viewer elements to reflect the observed changes.
- * 
- * <p>
- * This class is not intended to be subclassed by clients.
- * 
- * @since 1.2
- */
-public class ObservableSetTreeContentProvider implements ITreeContentProvider {
-	private final ObservableCollectionTreeContentProvider impl;
-
-	private static class Impl extends ObservableCollectionTreeContentProvider {
-		Impl(IObservableFactory setFactory,
-				TreeStructureAdvisor structureAdvisor) {
-			super(setFactory, structureAdvisor);
-		}
-
-		private class SetChangeListener implements ISetChangeListener {
-			final Object parentElement;
-
-			public SetChangeListener(Object parentElement) {
-				this.parentElement = parentElement;
-			}
-
-			public void handleSetChange(SetChangeEvent event) {
-				if (isViewerDisposed())
-					return;
-
-				Set localAdditions = event.diff.getAdditions();
-				Set localRemovals = event.diff.getRemovals();
-
-				Set knownElementAdditions = ViewerElementSet
-						.withComparer(comparer);
-				knownElementAdditions.addAll(localAdditions);
-				knownElementAdditions.removeAll(knownElements);
-
-				Set knownElementRemovals = findPendingRemovals(parentElement,
-						localRemovals);
-				knownElementRemovals.retainAll(knownElements);
-
-				knownElements.addAll(knownElementAdditions);
-				if (realizedElements != null) {
-					realizedElements.removeAll(knownElementRemovals);
-				}
-
-				for (Iterator iterator = localAdditions.iterator(); iterator
-						.hasNext();) {
-					Object child = iterator.next();
-					getOrCreateNode(child).addParent(parentElement);
-				}
-
-				viewerUpdater.add(parentElement, localAdditions.toArray());
-				viewerUpdater.remove(parentElement, localRemovals.toArray());
-
-				for (Iterator iterator = localRemovals.iterator(); iterator
-						.hasNext();) {
-					Object child = iterator.next();
-					TreeNode childNode = getExistingNode(child);
-					if (childNode != null)
-						childNode.removeParent(parentElement);
-				}
-
-				if (realizedElements != null) {
-					realizedElements.addAll(knownElementAdditions);
-				}
-				knownElements.removeAll(knownElementRemovals);
-			}
-		}
-
-		protected IObservablesListener createCollectionChangeListener(
-				Object parentElement) {
-			return new SetChangeListener(parentElement);
-		}
-
-		protected void addCollectionChangeListener(
-				IObservableCollection collection, IObservablesListener listener) {
-			IObservableSet set = (IObservableSet) collection;
-			ISetChangeListener setListener = (ISetChangeListener) listener;
-			set.addSetChangeListener(setListener);
-		}
-
-		protected void removeCollectionChangeListener(
-				IObservableCollection collection, IObservablesListener listener) {
-			IObservableSet set = (IObservableSet) collection;
-			ISetChangeListener setListener = (ISetChangeListener) listener;
-			set.removeSetChangeListener(setListener);
-		}
-	}
-
-	/**
-	 * Constructs an ObservableListTreeContentProvider using the given list
-	 * factory.
-	 * 
-	 * @param setFactory
-	 *            observable factory that produces an IObservableSet of children
-	 *            for a given parent element. Observable sets created by this
-	 *            factory must be on the realm of the current display.
-	 * @param structureAdvisor
-	 *            an advisor that will be consulted from the implementations of
-	 *            the {@link #getParent(Object)} and
-	 *            {@link #hasChildren(Object)} methods, or <code>null</code>
-	 *            if no advisor is available. It is recommended that clients
-	 *            pass a non-null advisor if they can provide additional
-	 *            structural information about the tree.
-	 */
-	public ObservableSetTreeContentProvider(IObservableFactory setFactory,
-			TreeStructureAdvisor structureAdvisor) {
-		impl = new Impl(setFactory, structureAdvisor);
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		impl.inputChanged(viewer, oldInput, newInput);
-	}
-
-	public Object[] getElements(Object inputElement) {
-		return impl.getElements(inputElement);
-	}
-
-	public boolean hasChildren(Object element) {
-		return impl.hasChildren(element);
-	}
-
-	public Object[] getChildren(Object parentElement) {
-		return impl.getChildren(parentElement);
-	}
-
-	public Object getParent(Object element) {
-		return impl.getParent(element);
-	}
-
-	public void dispose() {
-		impl.dispose();
-	}
-
-	/**
-	 * Returns the set of elements known to this content provider. Label
-	 * providers may track this set if they need to be notified about additions
-	 * before the viewer sees the added element, and notified about removals
-	 * after the element was removed from the viewer. This is intended for use
-	 * by label providers, as it will always return the items that need labels.
-	 * 
-	 * @return readableSet of items that will need labels
-	 */
-	public IObservableSet getKnownElements() {
-		return impl.getKnownElements();
-	}
-
-	/**
-	 * Returns the set of known elements which have been realized in the viewer.
-	 * Clients may track this set in order to perform custom actions on elements
-	 * while they are known to be present in the viewer.
-	 * 
-	 * @return the set of known elements which have been realized in the viewer.
-	 * @since 1.3
-	 */
-	public IObservableSet getRealizedElements() {
-		return impl.getRealizedElements();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableValueEditingSupport.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableValueEditingSupport.java
deleted file mode 100644
index 3111c8d..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ObservableValueEditingSupport.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.viewers;
-
-import org.eclipse.core.databinding.Binding;
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.UpdateValueStrategy;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationListener;
-import org.eclipse.jface.viewers.ColumnViewerEditorDeactivationEvent;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.ViewerCell;
-
-/**
- * {@link EditingSupport} using the JFace Data Binding concepts to handle the
- * updating of an element from a {@link CellEditor}.
- * 
- * @since 1.2
- */
-public abstract class ObservableValueEditingSupport extends EditingSupport {
-	/**
-	 * Maintains references to the instances currently imployed while editing.
-	 * Will be <code>null</code> when not editing.
-	 */
-	private EditingState editingState;
-
-	private final ColumnViewerEditorActivationListenerHelper activationListener = new ColumnViewerEditorActivationListenerHelper();
-
-	private ColumnViewer viewer;
-
-	private DataBindingContext dbc;
-
-	/**
-	 * Constructs a new instance with the provided <code>viewer</code> and
-	 * <code>dbc</code>.
-	 * 
-	 * @param viewer
-	 *            viewer to edit
-	 * @param dbc
-	 *            dbc to create <code>Bindings</code>
-	 */
-	public ObservableValueEditingSupport(ColumnViewer viewer,
-			DataBindingContext dbc) {
-		super(viewer);
-
-		if (dbc == null) {
-			throw new IllegalArgumentException("Parameter dbc was null."); //$NON-NLS-1$
-		}
-
-		this.viewer = viewer;
-		this.dbc = dbc;
-	}
-
-	/**
-	 * Default implementation always returns <code>true</code>.
-	 * 
-	 * @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object)
-	 */
-	protected boolean canEdit(Object element) {
-		return true;
-	}
-
-	/**
-	 * Default implementation always returns <code>null</code> as this will be
-	 * handled by the Binding.
-	 * 
-	 * @see org.eclipse.jface.viewers.EditingSupport#getValue(java.lang.Object)
-	 */
-	protected Object getValue(Object element) {
-		// no op
-		return null;
-	}
-
-	/**
-	 * Default implementation does nothing as this will be handled by the
-	 * Binding.
-	 * 
-	 * @see org.eclipse.jface.viewers.EditingSupport#setValue(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	protected void setValue(Object element, Object value) {
-		// no op
-	}
-
-	/**
-	 * Creates a {@link Binding} between the editor and the element to be
-	 * edited. Invokes {@link #doCreateCellEditorObservable(CellEditor)},
-	 * {@link #doCreateElementObservable(Object, ViewerCell)}, and then
-	 * {@link #createBinding(IObservableValue, IObservableValue)}.
-	 */
-	final protected void initializeCellEditorValue(CellEditor cellEditor,
-			ViewerCell cell) {
-		IObservableValue target = doCreateCellEditorObservable(cellEditor);
-		Assert
-				.isNotNull(target,
-						"doCreateCellEditorObservable(...) did not return an observable"); //$NON-NLS-1$
-
-		IObservableValue model = doCreateElementObservable(cell.getElement(),
-				cell);
-		Assert.isNotNull(model,
-				"doCreateElementObservable(...) did not return an observable"); //$NON-NLS-1$
-
-		Binding binding = createBinding(target, model);
-		Assert
-				.isNotNull(binding,
-						"createBinding(...) did not return a binding"); //$NON-NLS-1$
-
-		editingState = new EditingState(binding, target, model);
-
-		getViewer().getColumnViewerEditor().addEditorActivationListener(
-				activationListener);
-	}
-
-	/**
-	 * Creates the observable value for the CellEditor.
-	 * 
-	 * @param cellEditor
-	 * @return observable value
-	 */
-	protected abstract IObservableValue doCreateCellEditorObservable(
-			CellEditor cellEditor);
-
-	/**
-	 * Creates the observable value for the element.
-	 * 
-	 * @param element
-	 * @param cell
-	 * @return observable value
-	 */
-	protected abstract IObservableValue doCreateElementObservable(
-			Object element, ViewerCell cell);
-
-	/**
-	 * Creates a new binding for the provided <code>target</code> and
-	 * <code>model</code>. Default
-	 * {@link UpdateValueStrategy value update strategies} are used with the
-	 * target to model updating on {@link UpdateValueStrategy#POLICY_CONVERT}.
-	 * 
-	 * @param target
-	 * @param model
-	 * @return binding
-	 */
-	protected Binding createBinding(IObservableValue target,
-			IObservableValue model) {
-		return dbc.bindValue(target, model, new UpdateValueStrategy(
-				UpdateValueStrategy.POLICY_CONVERT), null);
-	}
-
-	/**
-	 * Updates the model from the target.
-	 */
-	final protected void saveCellEditorValue(CellEditor cellEditor,
-			ViewerCell cell) {
-		editingState.binding.updateTargetToModel();
-	}
-
-	private class ColumnViewerEditorActivationListenerHelper extends
-			ColumnViewerEditorActivationListener {
-
-		public void afterEditorActivated(ColumnViewerEditorActivationEvent event) {
-			// do nothing
-		}
-
-		public void afterEditorDeactivated(
-				ColumnViewerEditorDeactivationEvent event) {
-			editingState.dispose();
-			editingState = null;
-
-			viewer.getColumnViewerEditor().removeEditorActivationListener(this);
-		}
-
-		public void beforeEditorActivated(
-				ColumnViewerEditorActivationEvent event) {
-			// do nothing
-		}
-
-		public void beforeEditorDeactivated(
-				ColumnViewerEditorDeactivationEvent event) {
-			// do nothing
-		}
-	}
-
-	/**
-	 * Maintains references to objects that only live for the length of the edit
-	 * cycle.
-	 */
-	private static class EditingState {
-		IObservableValue target;
-
-		IObservableValue model;
-
-		Binding binding;
-
-		EditingState(Binding binding, IObservableValue target,
-				IObservableValue model) {
-			this.binding = binding;
-			this.target = target;
-			this.model = model;
-		}
-
-		void dispose() {
-			target.dispose();
-			model.dispose();
-			binding.dispose();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/TreeStructureAdvisor.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/TreeStructureAdvisor.java
deleted file mode 100644
index ef56993..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/TreeStructureAdvisor.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jface.databinding.viewers;
-
-/**
- * Instances of this class can be used to improve accuracy and performance of an
- * {@link ObservableListTreeContentProvider} or an
- * {@link ObservableSetTreeContentProvider}. This class is intended to be
- * subclassed by clients.
- * 
- * @since 1.2
- * 
- */
-public abstract class TreeStructureAdvisor {
-
-	/**
-	 * Returns the parent for the given element, or <code>null</code>
-	 * indicating that the parent can't be computed. In this case the
-	 * tree-structured viewer can't expand a given node correctly if requested.
-	 * The default implementation returns null; clients should override.
-	 * 
-	 * @param element
-	 *            the element
-	 * @return the parent element, or <code>null</code> if it has none or if
-	 *         the parent cannot be computed
-	 */
-	public Object getParent(Object element) {
-		return null;
-	}
-
-	/**
-	 * Returns whether the given element has children, or <code>null</code> if
-	 * the actual children collection should be consulted. The default
-	 * implementation returns null; clients should override.
-	 * <p>
-	 * Intended as an optimization for when the viewer does not need the actual
-	 * children. Clients may be able to implement this more efficiently than
-	 * <code>getChildren</code>.
-	 * </p>
-	 * 
-	 * @param element
-	 *            the element
-	 * @return <code>Boolean.TRUE</code> if the given element has children,
-	 *         <code>Boolean.FALSE</code> if it has no children, or
-	 *         <code>null</code> if the children collection should be
-	 *         consulted.
-	 */
-	public Boolean hasChildren(Object element) {
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ViewersObservables.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ViewersObservables.java
deleted file mode 100644
index 2401a5b..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/ViewersObservables.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 206839, 124684, 239302, 245647
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.viewers;
-
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.swt.SWTDelayedObservableValueDecorator;
-import org.eclipse.jface.internal.databinding.viewers.CheckableCheckedElementsObservableSet;
-import org.eclipse.jface.internal.databinding.viewers.CheckboxViewerCheckedElementsObservableSet;
-import org.eclipse.jface.internal.databinding.viewers.SelectionProviderMultipleSelectionObservableList;
-import org.eclipse.jface.internal.databinding.viewers.SelectionProviderSingleSelectionObservableValue;
-import org.eclipse.jface.internal.databinding.viewers.ViewerFiltersObservableSet;
-import org.eclipse.jface.internal.databinding.viewers.ViewerInputObservableValue;
-import org.eclipse.jface.internal.databinding.viewers.ViewerMultipleSelectionObservableList;
-import org.eclipse.jface.internal.databinding.viewers.ViewerObservableValueDecorator;
-import org.eclipse.jface.internal.databinding.viewers.ViewerSingleSelectionObservableValue;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckable;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Factory methods for creating observables for JFace viewers
- * 
- * @since 1.1
- */
-public class ViewersObservables {
-	/**
-	 * Returns an observable which delays notification of value change events
-	 * from <code>observable</code> until <code>delay</code> milliseconds have
-	 * passed since the last change event, or until a FocusOut event is received
-	 * from the underlying viewer control (whichever happens earlier). This
-	 * class helps to delay validation until the user stops changing the value
-	 * (e.g. until a user stops changing a viewer selection). To notify about
-	 * pending changes, the returned observable value will fire a stale event
-	 * when the wrapped observable value fires a change event, but this change
-	 * is being delayed.
-	 * 
-	 * @param delay
-	 *            the delay in milliseconds
-	 * @param observable
-	 *            the observable being delayed
-	 * @return an observable which delays notification of value change events
-	 *         from <code>observable</code> until <code>delay</code>
-	 *         milliseconds have passed since the last change event.
-	 * 
-	 * @since 1.3
-	 */
-	public static IViewerObservableValue observeDelayedValue(int delay,
-			IViewerObservableValue observable) {
-		Viewer viewer = observable.getViewer();
-		return new ViewerObservableValueDecorator(
-				new SWTDelayedObservableValueDecorator(Observables
-						.observeDelayedValue(delay, observable), viewer
-						.getControl()), viewer);
-	}
-
-	/**
-	 * Returns an observable value that tracks the current selection of the
-	 * given selection provider. If the selection provider provides selections
-	 * of type {@link IStructuredSelection}, the observable value will be the
-	 * first element of the structured selection as returned by
-	 * {@link IStructuredSelection#getFirstElement()}.
-	 * 
-	 * @param selectionProvider
-	 * @return the observable value tracking the (single) selection of the given
-	 *         selection provider
-	 */
-	public static IObservableValue observeSingleSelection(
-			ISelectionProvider selectionProvider) {
-		if (selectionProvider instanceof Viewer) {
-			return observeSingleSelection((Viewer) selectionProvider);
-		}
-		return new SelectionProviderSingleSelectionObservableValue(
-				SWTObservables.getRealm(Display.getDefault()),
-				selectionProvider);
-	}
-
-	/**
-	 * Returns an observable list that tracks the current selection of the
-	 * given selection provider. Assumes that the selection provider provides
-	 * selections of type {@link IStructuredSelection}. Note that the
-	 * observable list will not honor the full contract of
-	 * <code>java.util.List</code> in that it may delete or reorder elements
-	 * based on what the selection provider returns from
-	 * {@link ISelectionProvider#getSelection()} after having called
-	 * {@link ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)}
-	 * based on the requested change to the observable list. The affected
-	 * methods are <code>add</code>, <code>addAll</code>, and
-	 * <code>set</code>.
-	 * 
-	 * @param selectionProvider
-	 * @return the observable value tracking the (multi) selection of the given
-	 *         selection provider
-	 * 
-	 * @since 1.2
-	 */
-	public static IObservableList observeMultiSelection(
-			ISelectionProvider selectionProvider) {
-		if (selectionProvider instanceof Viewer) {
-			return observeMultiSelection((Viewer) selectionProvider);
-		}
-		return new SelectionProviderMultipleSelectionObservableList(
-				SWTObservables.getRealm(Display.getDefault()),
-				selectionProvider, Object.class);
-	}
-
-	/**
-	 * Returns an observable value that tracks the current selection of the
-	 * given viewer. If the viewer provides selections of type
-	 * {@link IStructuredSelection}, the observable value will be the first
-	 * element of the structured selection as returned by
-	 * {@link IStructuredSelection#getFirstElement()}.
-	 * 
-	 * @param viewer
-	 *            the viewer
-	 * @return the observable value tracking the (single) selection of the given
-	 *         viewer
-	 * @since 1.2
-	 */
-	public static IViewerObservableValue observeSingleSelection(Viewer viewer) {
-		return new ViewerSingleSelectionObservableValue(
-				SWTObservables.getRealm(Display.getDefault()),
-				viewer);
-	}
-	
-	/**
-	 * Returns an observable list that tracks the current selection of the
-	 * given viewer. Assumes that the viewer provides
-	 * selections of type {@link IStructuredSelection}. Note that the
-	 * observable list will not honor the full contract of
-	 * <code>java.util.List</code> in that it may delete or reorder elements
-	 * based on what the viewer returns from
-	 * {@link ISelectionProvider#getSelection()} after having called
-	 * {@link ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)}
-	 * based on the requested change to the observable list. The affected
-	 * methods are <code>add</code>, <code>addAll</code>, and
-	 * <code>set</code>.
-	 * 
-	 * @param viewer
-	 * @return the observable value tracking the (multi) selection of the given
-	 *         selection provider
-	 * 
-	 * @since 1.2
-	 */
-	public static IViewerObservableList observeMultiSelection(
-			Viewer viewer) {
-		return new ViewerMultipleSelectionObservableList(
-				SWTObservables.getRealm(Display.getDefault()),
-				viewer, Object.class);
-	}
-	
-	/**
-	 * Returns an observable value that tracks the input of the given viewer.
-	 * <p>
-	 * The returned observer is blind to changes in the viewer's input unless
-	 * its {@link IObservableValue#setValue(Object)} method is called directly.
-	 * 
-	 * @param viewer
-	 *            the viewer to observe
-	 * @return an observable value tracking the input of the given viewer
-	 * @since 1.2
-	 */
-	public static IObservableValue observeInput(Viewer viewer) {
-		return new ViewerInputObservableValue(SWTObservables.getRealm(viewer
-				.getControl().getDisplay()), viewer);
-	}
-
-	/**
-	 * Returns an observable set that tracks the checked elements of the given
-	 * <code>ICheckable</code>.
-	 * 
-	 * @param checkable
-	 *            {@link ICheckable} containing the checked elements to track
-	 * @param elementType
-	 *            element type of the returned set
-	 * @return an observable set tracking the checked elements of the given
-	 *         checkable.
-	 * @since 1.2
-	 */
-	public static IObservableSet observeCheckedElements(ICheckable checkable,
-			Object elementType) {
-		if (checkable instanceof CheckboxTableViewer) {
-			return observeCheckedElements((CheckboxTableViewer) checkable,
-					elementType);
-		}
-		if (checkable instanceof CheckboxTreeViewer) {
-			return observeCheckedElements((CheckboxTreeViewer) checkable,
-					elementType);
-		}
-		return new CheckableCheckedElementsObservableSet(SWTObservables
-				.getRealm(Display.getDefault()), checkable, elementType);
-	}
-
-	/**
-	 * Returns an observable set that tracks the checked elements of the given
-	 * viewer. Assumes that the viewer implements {@link ICheckable}.
-	 * 
-	 * @param viewer
-	 *            {@link CheckboxTableViewer} containing the checked elements to
-	 *            track.
-	 * @param elementType
-	 *            element type of the returned set
-	 * @return an observable set that tracks the checked elements of the given
-	 *         viewer.
-	 * @since 1.2
-	 */
-	public static IViewerObservableSet observeCheckedElements(
-			CheckboxTableViewer viewer, Object elementType) {
-		return new CheckboxViewerCheckedElementsObservableSet(SWTObservables
-				.getRealm(viewer.getControl().getDisplay()), viewer,
-				elementType);
-	}
-
-	/**
-	 * Returns an observable set that tracks the checked elements of the given
-	 * viewer. Assumes that the viewer implements {@link ICheckable}.
-	 * 
-	 * @param viewer
-	 *            {@link CheckboxTreeViewer} containing the checked elements to
-	 *            track.
-	 * @param elementType
-	 *            element type of the returned set
-	 * @return an observable set that tracks the checked elements of the given
-	 *         viewer.
-	 * @since 1.2
-	 */
-	public static IViewerObservableSet observeCheckedElements(
-			CheckboxTreeViewer viewer, Object elementType) {
-		return new CheckboxViewerCheckedElementsObservableSet(SWTObservables
-				.getRealm(viewer.getControl().getDisplay()), viewer,
-				elementType);
-	}
-
-	/**
-	 * Returns an observable set that tracks the filters of the given viewer.
-	 * Note that the returned set will not track changes that are made using
-	 * direct API on StructuredViewer (by calling
-	 * {@link StructuredViewer#addFilter(org.eclipse.jface.viewers.ViewerFilter)
-	 * addFilter()},
-	 * {@link StructuredViewer#removeFilter(org.eclipse.jface.viewers.ViewerFilter)
-	 * removeFilter()}, or
-	 * {@link StructuredViewer#setFilters(org.eclipse.jface.viewers.ViewerFilter[])
-	 * setFilters()}) -- it is assumed that filters are only changed through the
-	 * returned set.
-	 * 
-	 * @param viewer
-	 *            viewer containing the filters to be tracked
-	 * @return an observable set that tracks the filters of the given viewer.
-	 * @since 1.3
-	 */
-	public static IViewerObservableSet observeFilters(StructuredViewer viewer) {
-		return new ViewerFiltersObservableSet(SWTObservables.getRealm(viewer
-				.getControl().getDisplay()), viewer);
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/package.html b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/package.html
deleted file mode 100644
index 2ebf748..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/viewers/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes that can be used to observe the JFace Viewer framework.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that can be used to observe the JFace Viewer framework.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/wizard/WizardPageSupport.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/wizard/WizardPageSupport.java
deleted file mode 100644
index 40fcde6..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/wizard/WizardPageSupport.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Boris Bokowski - bug 218269
- *     Matthew Hall - bug 218269, 240444, 239900
- *     Ashley Cambrell - bug 199179 
- *     Ovidio Mallo - bug 235195, 237856
- *******************************************************************************/
-package org.eclipse.jface.databinding.wizard;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.databinding.dialog.DialogPageSupport;
-import org.eclipse.jface.wizard.WizardPage;
-
-/**
- * Connects the validation result from the given data binding context to the
- * given wizard page, updating the wizard page's completion state and its error
- * message accordingly.
- * 
- * <p>
- * The completion state of the wizard page will only be set to <code>true</code>
- * if <i>all</i> of the following conditions are met:
- * <ul>
- * <li>The validation result from the data binding context has none of the
- * severities {@link IStatus#ERROR} or {@link IStatus#CANCEL}.</li>
- * <li>None of the validation status observables of the data binding context is
- * stale.</li>
- * </ul>
- * </p>
- * 
- * @noextend This class is not intended to be subclassed by clients.
- *
- * @since 1.1
- */
-public class WizardPageSupport extends DialogPageSupport {
-	private WizardPageSupport(WizardPage wizardPage, DataBindingContext dbc) {
-		super(wizardPage, dbc);
-	}
-
-	/**
-	 * Connect the validation result from the given data binding context to the
-	 * given wizard page. Upon creation, the wizard page support will use the
-	 * context's validation result to determine whether the page is complete.
-	 * The page's error message will not be set at this time ensuring that the
-	 * wizard page does not show an error right away. Upon any validation result
-	 * change, {@link WizardPage#setPageComplete(boolean)} will be called
-	 * reflecting the new validation result, and the wizard page's error message
-	 * will be updated according to the current validation result.
-	 * 
-	 * @param wizardPage
-	 * @param dbc
-	 * @return an instance of WizardPageSupport
-	 */
-	public static WizardPageSupport create(WizardPage wizardPage,
-			DataBindingContext dbc) {
-		return new WizardPageSupport(wizardPage, dbc);
-	}
-
-	protected void handleStatusChanged() {
-		super.handleStatusChanged();
-		boolean pageComplete = true;
-		if (currentStatusStale) {
-			pageComplete = false;
-		} else if (currentStatus != null) {
-			pageComplete = !currentStatus.matches(IStatus.ERROR
-					| IStatus.CANCEL);
-		}
-		((WizardPage) getDialogPage()).setPageComplete(pageComplete);
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/wizard/package.html b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/wizard/package.html
deleted file mode 100755
index b094981..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/wizard/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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes that bridge between data binding and the JFace Wizard framework.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that bridge between data binding and the JFace Wizard framework.</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/LinkObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/LinkObservableValue.java
deleted file mode 100644
index fac5372..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/internal/swt/LinkObservableValue.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Michael Krauter, Catuno GmbH and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Michael Krauter, Catuno GmbH - initial API and implementation (bug 180223)
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.internal.swt;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.swt.widgets.Link;
-
-/**
- * @since 1.2
- * 
- */
-public class LinkObservableValue extends AbstractSWTObservableValue {
-
-	private final Link link;
-
-	/**
-	 * @param link
-	 */
-	public LinkObservableValue(Link link) {
-		super(link);
-		this.link = link;
-	}
-
-	public void doSetValue(final Object value) {
-		String oldValue = link.getText();
-		link.setText(value == null ? "" : value.toString()); //$NON-NLS-1$
-		fireValueChange(Diffs.createValueDiff(oldValue, link.getText()));
-	}
-
-	public Object doGetValue() {
-		return link.getText();
-	}
-
-	public Object getValueType() {
-		return String.class;
-	}
-
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/AbstractSWTObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/AbstractSWTObservableValue.java
deleted file mode 100644
index 3f667fd..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/AbstractSWTObservableValue.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef, Inc. and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     The Pampered Chef, Inc. - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.provisional.swt;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.jface.databinding.swt.ISWTObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * NON-API - An abstract superclass for observable values that gurantees that the 
- * observable will be disposed when the control to which it is attached is
- * disposed.
- * 
- * @since 1.1
- */
-public abstract class AbstractSWTObservableValue extends AbstractObservableValue implements ISWTObservableValue {
-
-	private final Widget widget;
-
-	/**
-	 * Standard constructor for an SWT ObservableValue.  Makes sure that
-	 * the observable gets disposed when the SWT widget is disposed.
-	 * 
-	 * @param widget
-	 */
-	protected AbstractSWTObservableValue(Widget widget) {
-		this(SWTObservables.getRealm(widget.getDisplay()), widget);
-	}
-	
-	/**
-	 * Constructor that allows for the setting of the realm. Makes sure that the
-	 * observable gets disposed when the SWT widget is disposed.
-	 * 
-	 * @param realm
-	 * @param widget
-	 * @since 1.2
-	 */
-	protected AbstractSWTObservableValue(Realm realm, Widget widget) {
-		super(realm);
-		this.widget = widget;
-		widget.addDisposeListener(disposeListener);
-	}
-	
-	private DisposeListener disposeListener = new DisposeListener() {
-		public void widgetDisposed(DisposeEvent e) {
-			AbstractSWTObservableValue.this.dispose();
-		}
-	};
-
-	/**
-	 * @return Returns the widget.
-	 */
-	public Widget getWidget() {
-		return widget;
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/AbstractSWTVetoableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/AbstractSWTVetoableValue.java
deleted file mode 100644
index 7cf6954..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/AbstractSWTVetoableValue.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef, Inc. and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     The Pampered Chef, Inc. - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.provisional.swt;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.AbstractVetoableValue;
-import org.eclipse.jface.databinding.swt.ISWTObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * NON-API - An abstract superclass for vetoable values that gurantees that the 
- * observable will be disposed when the control to which it is attached is
- * disposed.
- * 
- * @since 1.1
- */
-public abstract class AbstractSWTVetoableValue extends AbstractVetoableValue implements ISWTObservableValue {
-
-	private final Widget widget;
-
-	/**
-	 * Standard constructor for an SWT VetoableValue.  Makes sure that
-	 * the observable gets disposed when the SWT widget is disposed.
-	 * 
-	 * @param widget
-	 */
-	protected AbstractSWTVetoableValue(Widget widget) {
-		this(SWTObservables.getRealm(widget.getDisplay()), widget);
-	}
-	
-	/**
-	 * Constructs a new instance for the provided <code>realm</code> and <code>widget</code>.
-	 * 
-	 * @param realm
-	 * @param widget
-	 * @since 1.2
-	 */
-	protected AbstractSWTVetoableValue(Realm realm, Widget widget) {
-		super(realm);
-		this.widget = widget;
-		if (widget == null) {
-			throw new IllegalArgumentException("The widget parameter is null."); //$NON-NLS-1$
-		}
-		widget.addDisposeListener(disposeListener);
-	}
-	
-	private DisposeListener disposeListener = new DisposeListener() {
-		public void widgetDisposed(DisposeEvent e) {
-			AbstractSWTVetoableValue.this.dispose();
-		}
-	};
-
-	/**
-	 * @return Returns the widget.
-	 */
-	public Widget getWidget() {
-		return widget;
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/CompositeUpdater.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/CompositeUpdater.java
deleted file mode 100644
index 2927e3d..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/CompositeUpdater.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Boris Bokowski, IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.provisional.swt;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * NON-API - This class can be used to update a composite with automatic dependency tracking.
- * @since 1.1
- * 
- */
-public abstract class CompositeUpdater {
-
-	private class UpdateRunnable implements Runnable, IChangeListener {
-		private Widget widget;
-		Object element;
-
-		private boolean dirty = true;
-
-		private IObservable[] dependencies = new IObservable[0];
-
-		UpdateRunnable(Widget widget, Object element) {
-			this.widget = widget;
-			this.element = element;
-		}
-
-		// Runnable implementation. This method runs at most once per repaint
-		// whenever the
-		// value gets marked as dirty.
-		public void run() {
-			if (theComposite != null && !theComposite.isDisposed()
-					&& widget != null && !widget.isDisposed()) {
-				updateIfNecessary();
-			}
-		}
-
-		private void updateIfNecessary() {
-			if (dirty) {
-				dependencies = ObservableTracker.runAndMonitor(new Runnable() {
-					public void run() {
-						updateWidget(widget, element);
-					}
-				}, this, null);
-				dirty = false;
-			}
-		}
-
-		// IChangeListener implementation (listening to any dependency)
-		public void handleChange(ChangeEvent event) {
-			// Whenever this updator becomes dirty, schedule the run() method
-			makeDirty();
-		}
-
-		protected final void makeDirty() {
-			if (!dirty) {
-				dirty = true;
-				stopListening();
-				if (!theComposite.isDisposed()) {
-					SWTUtil.runOnce(theComposite.getDisplay(), this);
-				}
-			}
-		}
-
-		private void stopListening() {
-			// Stop listening for dependency changes
-			for (int i = 0; i < dependencies.length; i++) {
-				IObservable observable = dependencies[i];
-
-				observable.removeChangeListener(this);
-			}
-		}
-	}
-	
-	private class LayoutRunnable implements Runnable {
-		private boolean posted = false;
-		private Set controlsToLayout = new HashSet();
-		void add(Control toLayout) {
-			controlsToLayout.add(toLayout);
-			if (!posted) {
-				posted = true;
-				theComposite.getDisplay().asyncExec(this);
-			}
-		}
-		public void run() {
-			posted = false;
-			theComposite.getShell().layout((Control[])controlsToLayout.toArray(new Control[controlsToLayout.size()]));
-			controlsToLayout.clear();
-		}
-	}
-	
-	private LayoutRunnable layoutRunnable = new LayoutRunnable();
-	
-	/**
-	 * To be called from {@link #updateWidget(Widget, Object)} or {@link #createWidget(int)}
-	 * if this updater's composite's layout may need to be updated. 
-	 * @param control
-	 * @since 1.2
-	 */
-	protected void requestLayout(Control control) {
-		layoutRunnable.add(control);
-	}
-
-	private class PrivateInterface implements DisposeListener,
-			IListChangeListener {
-
-		// DisposeListener implementation
-		public void widgetDisposed(DisposeEvent e) {
-			CompositeUpdater.this.dispose();
-		}
-
-		public void handleListChange(ListChangeEvent event) {
-			ListDiffEntry[] diffs = event.diff.getDifferences();
-			for (int i = 0; i < diffs.length; i++) {
-				ListDiffEntry listDiffEntry = diffs[i];
-				if (listDiffEntry.isAddition()) {
-					createChild(listDiffEntry.getElement(), listDiffEntry.getPosition());
-				} else {
-					disposeWidget(listDiffEntry.getPosition());
-				}
-			}
-			theComposite.layout();
-		}
-
-	}
-
-	private PrivateInterface privateInterface = new PrivateInterface();
-
-	private Composite theComposite;
-
-	private IObservableList model;
-
-	/**
-	 * Creates an updater for the given control and list. For each element of
-	 * the list, a child widget of the composite will be created using
-	 * {@link #createWidget(int)}.
-	 * 
-	 * @param toUpdate
-	 *            composite to update
-	 * @param model
-	 *            an observable list to track
-	 */
-	public CompositeUpdater(Composite toUpdate, IObservableList model) {
-		this.theComposite = toUpdate;
-		this.model = model;
-
-		model.addListChangeListener(privateInterface);
-		theComposite.addDisposeListener(privateInterface);
-		ObservableTracker.runAndIgnore(new Runnable(){
-			public void run() {
-				int index = 0;
-				for (Iterator it = CompositeUpdater.this.model.iterator(); it.hasNext();) {
-					Object element = it.next();
-					createChild(element, index++);
-				}
-			}
-		});
-	}
-
-	/**
-	 * @param position
-	 * @since 1.2
-	 */
-	protected void disposeWidget(int position) {
-		theComposite.getChildren()[position].dispose();
-	}
-
-	/**
-	 * This is called automatically when the control is disposed. It may also be
-	 * called explicitly to remove this updator from the control. Subclasses
-	 * will normally extend this method to detach any listeners they attached in
-	 * their constructor.
-	 */
-	public void dispose() {
-		theComposite.removeDisposeListener(privateInterface);
-		model.removeListChangeListener(privateInterface);
-	}
-
-	/**
-	 * Creates a new child widget for the target composite at the given index.
-	 * 
-	 * <p>
-	 * Subclasses should implement this method to provide the code that creates
-	 * a child widget at a specific index. Note that
-	 * {@link #updateWidget(Widget, Object)} will be called after this method
-	 * returns. Only those properties of the widget that don't change over time
-	 * should be set in this method.
-	 * </p>
-	 * 
-	 * @param index
-	 *            the at which to create the widget
-	 * @return the widget
-	 */
-	protected abstract Widget createWidget(int index);
-
-	/**
-	 * Updates the given widget based on the element found in the model list.
-	 * This method will be invoked once after the widget is created, and once
-	 * before any repaint during which the control is visible and dirty.
-	 * 
-	 * <p>
-	 * Subclasses should implement this method to provide any code that changes
-	 * the appearance of the widget.
-	 * </p>
-	 * 
-	 * @param widget
-	 *            the widget to update
-	 * @param element
-	 *            the element associated with the widget
-	 */
-	protected abstract void updateWidget(Widget widget, Object element);
-
-	void createChild(Object element, int index) {
-		Widget newChild = createWidget(index);
-		final UpdateRunnable updateRunnable = new UpdateRunnable(newChild, element);
-		newChild.setData(updateRunnable);
-		updateRunnable.updateIfNecessary();
-	}
-
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/ControlUpdater.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/ControlUpdater.java
deleted file mode 100644
index ca819b7..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/ControlUpdater.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.provisional.swt;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-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.widgets.Control;
-
-/**
- * NON-API - A ControlUpdater updates an SWT control in response to changes in the model.
- * By wrapping a block of code in a ControlUpdater, clients can rely on the fact
- * that the block of code will be re-executed whenever anything changes in the
- * model that might affect its behavior.
- *  
- * <p>
- * ControlUpdaters only execute when their controls are visible. If something changes
- * in the model while the control is invisible, the updator is flagged as dirty and
- * the updator stops listening to the model until the next time the control repaints.
- * This saves CPU cycles by deferring UI updates to widgets that are currently invisible.
- * </p>
- * 
- * <p>
- * Clients should subclass this when copying information from the model to
- * a control. Typical usage:
- * </p>
- * 
- * <ul>
- * <li>Override updateControl. It should do whatever is necessary to display
- *     the contents of the model in the control.</li>
- * <li>In the constructor, attach listeners to the model. The listeners should 
- *     call markDirty whenever anything changes in the model that affects 
- *     updateControl. Note: this step can be omitted when calling any method
- *     tagged with "@TrackedGetter" since ControlUpdater will automatically attach
- *     a listener to any object if a "@TrackedGetter" method is called in
- *     updateControl.</li>
- * <li>(optional)Extend dispose() to remove any listeners attached in the constructor</li>
- * </ul>
- * 
- * <p>
- * Example:
- * </p>
- * 
- * <code>
- * // Displays an observable value in a label and keeps the label in synch with changes
- * // in the value.
- * IReadableValue someValue = ...
- * final Label myLabel = new Label(parent, SWT.NONE);
- * new ControlUpdater(myLabel) {
- * 		protected void updateControl() {
- * 		   myLabel.setText(someValue.getValue().toString);
- *      }
- * }
- * // myLabel will display the value of someValue the next time it repaints, and will automatically
- * // be updated whenever someValue changes and the label is visible
- * </code>
- * 
- * @since 1.1
- */
-public abstract class ControlUpdater {
-	
-	private class PrivateInterface implements PaintListener, 
-		DisposeListener, Runnable, IChangeListener {
-		
-		// PaintListener implementation
-		public void paintControl(PaintEvent e) {
-			updateIfNecessary();
-		}
-
-		// DisposeListener implementation
-		public void widgetDisposed(DisposeEvent e) {
-			ControlUpdater.this.dispose();
-		}
-		
-		// Runnable implementation. This method runs at most once per repaint whenever the
-		// value gets marked as dirty.
-		public void run() {
-			if (theControl != null && !theControl.isDisposed() && theControl.isVisible()) {
-				updateIfNecessary();
-			}
-		}
-		
-		// IChangeListener implementation (listening to the ComputedValue)
-		public void handleChange(ChangeEvent event) {
-			// Whenever this updator becomes dirty, schedule the run() method 
-			makeDirty();
-		}
-		
-	}
-	
-	private Runnable updateRunnable = new Runnable() {
-		public void run() {
-			updateControl();
-		}
-	};
-	
-	private PrivateInterface privateInterface = new PrivateInterface();
-	private Control theControl;
-	private IObservable[] dependencies = new IObservable[0];
-	private boolean dirty = false;
-	
-	/**
-	 * Creates an updater for the given control.  
-	 * 
-	 * @param toUpdate control to update
-	 */
-	public ControlUpdater(Control toUpdate) {
-		theControl = toUpdate;
-		
-		theControl.addDisposeListener(privateInterface);
-		theControl.addPaintListener(privateInterface);
-		makeDirty();
-	}
-	
-	private void updateIfNecessary() {
-		if (dirty) {
-			dependencies = ObservableTracker.runAndMonitor(updateRunnable, privateInterface, null);
-			dirty = false;
-		}
-	}
-
-	/**
-	 * This is called automatically when the control is disposed. It may also
-	 * be called explicitly to remove this updator from the control. Subclasses
-	 * will normally extend this method to detach any listeners they attached
-	 * in their constructor.
-	 */
-	public void dispose() {
-		theControl.removeDisposeListener(privateInterface);
-		theControl.removePaintListener(privateInterface);
-
-		stopListening();
-	}
-
-	private void stopListening() {
-		// Stop listening for dependency changes
-		for (int i = 0; i < dependencies.length; i++) {
-			IObservable observable = dependencies[i];
-				
-			observable.removeChangeListener(privateInterface);
-		}
-	}
-
-	/**
-	 * Updates the control. This method will be invoked once after the
-	 * updator is created, and once before any repaint during which the 
-	 * control is visible and dirty.
-	 *  
-	 * <p>
-	 * Subclasses should overload this method to provide any code that 
-	 * changes the appearance of the widget.
-	 * </p>
-	 */
-	protected abstract void updateControl();
-	
-	/**
-	 * Marks this updator as dirty. Causes the updateControl method to
-	 * be invoked before the next time the control is repainted.
-	 */
-	protected final void makeDirty() {
-		if (!dirty) {
-			dirty = true;
-			stopListening();
-			SWTUtil.runOnce(theControl.getDisplay(), privateInterface);
-		}
-	}
-	
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/MenuUpdater.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/MenuUpdater.java
deleted file mode 100644
index a40060d..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/MenuUpdater.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.provisional.swt;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.MenuEvent;
-import org.eclipse.swt.events.MenuListener;
-import org.eclipse.swt.widgets.Menu;
-
-/**
- * NON-API - A MenuUpdater updates an SWT menu in response to changes in the model. By
- * wrapping a block of code in a MenuUpdater, clients can rely on the fact that
- * the block of code will be re-executed whenever anything changes in the model
- * that might affect its behavior.
- * 
- * <p>
- * MenuUpdaters only execute once their menus are shown. If something changes in
- * the model, the updater is flagged as dirty and it stops listening to the
- * model until the next time the menu is shown. If the menu is visible while the
- * model changes, it will be updated right away.
- * </p>
- * 
- * <p>
- * Clients should subclass this when copying information from the model to a
- * menu. Typical usage:
- * </p>
- * 
- * <ul>
- * <li>Override updateMenu. It should do whatever is necessary to display the
- * contents of the model in the menu.</li>
- * <li>In the constructor, attach listeners to the model. The listeners should
- * call markDirty whenever anything changes in the model that affects
- * updateMenu. Note: this step can be omitted when calling any method tagged
- * with "@TrackedGetter" since MenuUpdater will automatically attach a listener
- * to any object if a "@TrackedGetter" method is called in updateMenu.</li>
- * <li>(optional)Extend dispose() to remove any listeners attached in the
- * constructor</li>
- * </ul>
- * 
- * @since 1.1
- */
-public abstract class MenuUpdater {
-	
-	private class PrivateInterface implements MenuListener, 
-		DisposeListener, Runnable, IChangeListener {
-
-		// DisposeListener implementation
-		public void widgetDisposed(DisposeEvent e) {
-			MenuUpdater.this.dispose();
-		}
-		
-		// Runnable implementation. This method runs at most once per repaint whenever the
-		// value gets marked as dirty.
-		public void run() {
-			if (theMenu != null && !theMenu.isDisposed() && theMenu.isVisible()) {
-				updateIfNecessary();
-			}
-		}
-		
-		// IChangeListener implementation (listening to the ComputedValue)
-		public void handleChange(ChangeEvent event) {
-			// Whenever this updator becomes dirty, schedule the run() method 
-			makeDirty();
-		}
-
-		public void menuHidden(MenuEvent e) {
-			// do nothing
-		}
-
-		public void menuShown(MenuEvent e) {
-			updateIfNecessary();
-		}
-		
-	}
-	
-	private Runnable updateRunnable = new Runnable() {
-		public void run() {
-			updateMenu();
-		}
-	};
-	
-	private PrivateInterface privateInterface = new PrivateInterface();
-	private Menu theMenu;
-	private IObservable[] dependencies = new IObservable[0];
-	private boolean dirty = false;
-	
-	/**
-	 * Creates an updator for the given menu.  
-	 * 
-	 * @param toUpdate menu to update
-	 */
-	public MenuUpdater(Menu toUpdate) {
-		theMenu = toUpdate;
-		
-		theMenu.addDisposeListener(privateInterface);
-		theMenu.addMenuListener(privateInterface);
-		makeDirty();
-	}
-	
-	private void updateIfNecessary() {
-		if (dirty) {
-			dependencies = ObservableTracker.runAndMonitor(updateRunnable, privateInterface, null);
-			dirty = false;
-		}
-	}
-
-	/**
-	 * This is called automatically when the menu is disposed. It may also
-	 * be called explicitly to remove this updator from the menu. Subclasses
-	 * will normally extend this method to detach any listeners they attached
-	 * in their constructor.
-	 */
-	public void dispose() {
-		theMenu.removeDisposeListener(privateInterface);
-		theMenu.removeMenuListener(privateInterface);
-
-		stopListening();
-	}
-
-	private void stopListening() {
-		// Stop listening for dependency changes
-		for (int i = 0; i < dependencies.length; i++) {
-			IObservable observable = dependencies[i];
-				
-			observable.removeChangeListener(privateInterface);
-		}
-	}
-
-	/**
-	 * Updates the menu. This method will be invoked once after the
-	 * updater is created, and once for any SWT.Show event if this 
-	 * updater is marked as dirty at that time.
-	 *  
-	 * <p>
-	 * Subclasses should overload this method to provide any code that 
-	 * udates the menu.
-	 * </p>
-	 */
-	protected abstract void updateMenu();
-	
-	/**
-	 * Marks this updator as dirty. Causes the updateControl method to
-	 * be invoked before the next time the control is repainted.
-	 */
-	protected final void makeDirty() {
-		if (!dirty) {
-			dirty = true;
-			stopListening();
-			SWTUtil.runOnce(theMenu.getDisplay(), privateInterface);
-		}
-	}
-	
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/SWTUtil.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/SWTUtil.java
deleted file mode 100644
index 541711d..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/SWTUtil.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.provisional.swt;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * NON-API - Utility methods, mainly having to do with posting runnables to the UI thread
- * in a particular way.
- * @since 1.1
- * 
- */
-public class SWTUtil {
-    /**
-     * Stores a work queue for each display
-     */
-    private static Map mapDisplayOntoWorkQueue = new HashMap();
-
-    private SWTUtil() {
-    }
-
-    /**
-     * Runs the given runnable on the given display as soon as possible. If
-     * possible, the runnable will be executed before the next widget is
-     * repainted, but this behavior is not guaranteed. Use this method to
-     * schedule work will affect the way one or more widgets are drawn.
-     * 
-     * <p>
-     * This is threadsafe.
-     * </p>
-     * 
-     * @param d
-     *            display
-     * @param r
-     *            runnable to execute in the UI thread.
-     */
-    public static void greedyExec(Display d, Runnable r) {
-        if (d.isDisposed()) {
-            return;
-        }
-
-        // if (Display.getCurrent() == d) {
-        // r.run();
-        // } else {
-        WorkQueue queue = getQueueFor(d);
-        queue.asyncExec(r);
-        // }
-    }
-
-    /**
-     * Runs the given runnable on the given display as soon as possible. Unlike
-     * greedyExec, this has no effect if the given runnable has already been
-     * scheduled for execution. Use this method to schedule work that will
-     * affect the way one or more wigdets are drawn, but that should only happen
-     * once.
-     * 
-     * <p>
-     * This is threadsafe.
-     * </p>
-     * 
-     * @param d
-     *            display
-     * @param r
-     *            runnable to execute in the UI thread. Has no effect if the
-     *            given runnable has already been scheduled but has not yet run.
-     */
-    public static void runOnce(Display d, Runnable r) {
-        if (d.isDisposed()) {
-            return;
-        }
-        WorkQueue queue = getQueueFor(d);
-        queue.runOnce(r);
-    }
-
-    /**
-     * Cancels a greedyExec or runOnce that was previously scheduled on the
-     * given display. Has no effect if the given runnable is not in the queue
-     * for the given display
-     * 
-     * @param d
-     *            target display
-     * @param r
-     *            runnable to execute
-     */
-    public static void cancelExec(Display d, Runnable r) {
-        if (d.isDisposed()) {
-            return;
-        }
-        WorkQueue queue = getQueueFor(d);
-        queue.cancelExec(r);
-    }
-
-    /**
-     * Returns the work queue for the given display. Creates a work queue if
-     * none exists yet.
-     * 
-     * @param d
-     *            display to return queue for
-     * @return a work queue (never null)
-     */
-    private static WorkQueue getQueueFor(final Display d) {
-        WorkQueue result;
-        synchronized (mapDisplayOntoWorkQueue) {
-            // Look for existing queue
-            result = (WorkQueue) mapDisplayOntoWorkQueue.get(d);
-
-            if (result == null) {
-                // If none, create new queue
-                result = new WorkQueue(d);
-                final WorkQueue q = result;
-                mapDisplayOntoWorkQueue.put(d, result);
-                d.asyncExec(new Runnable() {
-                    public void run() {
-                        d.disposeExec(new Runnable() {
-                            public void run() {
-                                synchronized (mapDisplayOntoWorkQueue) {
-                                    q.cancelAll();
-                                    mapDisplayOntoWorkQueue.remove(d);
-                                }
-                            }
-                        });
-                    }
-                });
-            }
-            return result;
-        }
-    }
-    
-    /**
-     * @param rgb1
-     * @param rgb2
-     * @param ratio
-     * @return the RGB object
-     */
-    public static RGB mix(RGB rgb1, RGB rgb2, double ratio) {
-        return new RGB(interp(rgb1.red, rgb2.red, ratio), 
-                interp(rgb1.green, rgb2.green, ratio),
-                interp(rgb1.blue, rgb2.blue, ratio));
-    }
-    
-    private static int interp(int i1, int i2, double ratio) {
-        int result = (int)(i1 * ratio + i2 * (1.0d - ratio));
-        if (result < 0) result = 0;
-        if (result > 255) result = 255;
-        return result;
-    }
-    
-	/**
-	 * Logs an exception as though it was thrown by a SafeRunnable being run
-	 * with the default ISafeRunnableRunner. Will not open modal dialogs or spin
-	 * the event loop.
-	 * 
-	 * @param t
-	 *            throwable to log
-	 * @deprecated
-	 * @noreference This method is not intended to be referenced by clients. It
-	 *              remains here for API backwards compatibility.
-	 */
-	public static void logException(final Exception t) {
-		SafeRunnable.run(new SafeRunnable() {
-			public void run() throws Exception {
-				throw t;
-			}
-			public void handleException(Throwable e) {
-				// IMPORTANT: Do not call the super implementation, since
-				// it opens a modal dialog, and may cause *syncExecs to run
-				// too early.
-			}
-		});
-	}
-
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/TableUpdater.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/TableUpdater.java
deleted file mode 100644
index 8570a3c..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/TableUpdater.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.provisional.swt;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * NON-API - This class can be used to update a table with automatic dependency
- * tracking.
- * 
- * @since 1.1
- * 
- * @noextend This class is not intended to be subclassed by clients. (We do
- *           encourage experimentation for non-production code and are
- *           interested in feedback though.)
- * 
- */
-public abstract class TableUpdater {
-
-	private class UpdateRunnable implements Runnable, IChangeListener,
-			DisposeListener {
-		private TableItem item;
-
-		private boolean dirty = false;
-
-		private IObservable[] dependencies = new IObservable[0];
-
-		private final Object element;
-
-		UpdateRunnable(TableItem item, Object element) {
-			this.item = item;
-			this.element = element;
-			item.addDisposeListener(this);
-		}
-
-		// Runnable implementation. This method runs at most once per repaint
-		// whenever the
-		// value gets marked as dirty.
-		public void run() {
-			if (table != null && !table.isDisposed() && item != null
-					&& !item.isDisposed()) {
-				if (table.isVisible()) {
-					int tableHeight = table.getClientArea().height;
-					int numVisibleItems = tableHeight / table.getItemHeight();
-					int indexOfItem = table.indexOf(item);
-					int topIndex = table.getTopIndex();
-					if (indexOfItem >= topIndex
-							&& indexOfItem <= topIndex + numVisibleItems) {
-						updateIfNecessary(indexOfItem);
-						return;
-					}
-				}
-				table.clear(table.indexOf(item));
-			}
-		}
-
-		private void updateIfNecessary(final int indexOfItem) {
-			if (dirty) {
-				dependencies = ObservableTracker.runAndMonitor(new Runnable() {
-					public void run() {
-						updateItem(indexOfItem, item, element);
-					}
-				}, this, null);
-				dirty = false;
-			}
-		}
-
-		// IChangeListener implementation (listening to the ComputedValue)
-		public void handleChange(ChangeEvent event) {
-			// Whenever this updator becomes dirty, schedule the run() method
-			makeDirty();
-		}
-
-		protected final void makeDirty() {
-			if (!dirty) {
-				dirty = true;
-				stopListening();
-				SWTUtil.runOnce(table.getDisplay(), this);
-			}
-		}
-
-		private void stopListening() {
-			// Stop listening for dependency changes
-			for (int i = 0; i < dependencies.length; i++) {
-				IObservable observable = dependencies[i];
-
-				observable.removeChangeListener(this);
-			}
-		}
-
-		// DisposeListener implementation
-		public void widgetDisposed(DisposeEvent e) {
-			stopListening();
-			dependencies = null;
-			item = null;
-		}
-	}
-
-	private class PrivateInterface implements Listener, DisposeListener {
-
-		// Listener implementation
-		public void handleEvent(Event e) {
-			if (e.type == SWT.SetData) {
-				UpdateRunnable runnable = (UpdateRunnable) e.item.getData();
-				if (runnable == null) {
-					runnable = new UpdateRunnable((TableItem) e.item, list.get(e.index));
-					e.item.setData(runnable);
-					runnable.makeDirty();
-				} else {
-					runnable.updateIfNecessary(e.index);
-				}
-			}
-		}
-
-		// DisposeListener implementation
-		public void widgetDisposed(DisposeEvent e) {
-			TableUpdater.this.dispose();
-		}
-
-	}
-
-	private PrivateInterface privateInterface = new PrivateInterface();
-
-	private Table table;
-
-	private IListChangeListener listChangeListener = new IListChangeListener() {
-		public void handleListChange(ListChangeEvent event) {
-			ListDiffEntry[] differences = event.diff.getDifferences();
-			for (int i = 0; i < differences.length; i++) {
-				ListDiffEntry entry = differences[i];
-				if (entry.isAddition()) {
-					TableItem item = new TableItem(table, SWT.NONE, entry
-							.getPosition());
-					UpdateRunnable updateRunnable = new UpdateRunnable(item, entry.getElement());
-					item.setData(updateRunnable);
-					updateRunnable.makeDirty();
-				} else {
-					table.getItem(entry.getPosition()).dispose();
-				}
-			}
-		}
-	};
-
-	private IObservableList list;
-
-	/**
-	 * Creates an updator for the given control.
-	 * 
-	 * @param table
-	 *            table to update
-	 * @param list
-	 * @since 1.2
-	 */
-	public TableUpdater(Table table, IObservableList list) {
-		this.table = table;
-		this.list = list;
-		Assert.isLegal((table.getStyle() & SWT.VIRTUAL) != 0,
-				"TableUpdater requires virtual table"); //$NON-NLS-1$
-
-		table.setItemCount(list.size());
-		list.addListChangeListener(listChangeListener);
-
-		table.addDisposeListener(privateInterface);
-		table.addListener(SWT.SetData, privateInterface);
-	}
-
-	/**
-	 * This is called automatically when the control is disposed. It may also be
-	 * called explicitly to remove this updator from the control. Subclasses
-	 * will normally extend this method to detach any listeners they attached in
-	 * their constructor.
-	 */
-	public void dispose() {
-		table.removeDisposeListener(privateInterface);
-		table.removeListener(SWT.SetData, privateInterface);
-		list.removeListChangeListener(listChangeListener);
-		table = null;
-		list = null;
-	}
-
-	/**
-	 * Updates the control. This method will be invoked once after the updator
-	 * is created, and once before any repaint during which the control is
-	 * visible and dirty.
-	 * 
-	 * <p>
-	 * Subclasses should overload this method to provide any code that changes
-	 * the appearance of the widget.
-	 * </p>
-	 * 
-	 * @param index
-	 * @param item
-	 *            the item to update
-	 * @param element
-	 * @since 1.2
-	 */
-	protected abstract void updateItem(int index, TableItem item, Object element);
-
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/WorkQueue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/WorkQueue.java
deleted file mode 100644
index 9668f02..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/swt/WorkQueue.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.provisional.swt;
-
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Set;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * NON-API - Helper class to manage a queue of runnables to be posted to the UI thread in a way
- * that they are only run once.
- * @since 1.1
- *
- */
-public class WorkQueue {
-	
-    private boolean updateScheduled = false;
-
-    private boolean paintListenerAttached = false;
-
-    private LinkedList pendingWork = new LinkedList();
-
-    private Display d;
-
-    private Set pendingWorkSet = new HashSet();
-
-    private Runnable updateJob = new Runnable() {
-        public void run() {
-            doUpdate();
-            updateScheduled = false;
-        }
-    };
-
-    private Listener paintListener = new Listener() {
-        public void handleEvent(Event event) {
-            paintListenerAttached = false;
-            d.removeFilter(SWT.Paint, this);
-            doUpdate();
-        }
-    };
-
-    /**
-     * @param targetDisplay
-     */
-    public WorkQueue(Display targetDisplay) {
-        d = targetDisplay;
-    }
-
-    private void doUpdate() {
-        for (;;) {
-            Runnable next;
-            synchronized (pendingWork) {
-                if (pendingWork.isEmpty()) {
-                    break;
-                }
-                next = (Runnable) pendingWork.removeFirst();
-                pendingWorkSet.remove(next);
-            }
-
-            next.run();
-        }
-    }
-
-    /**
-     * Schedules some work to happen in the UI thread as soon as possible. If
-     * possible, the work will happen before the next control redraws. The given
-     * runnable will only be run once. Has no effect if this runnable has
-     * already been queued for execution.
-     * 
-     * @param work
-     *            runnable to execute
-     */
-    public void runOnce(Runnable work) {
-        synchronized (pendingWork) {
-            if (pendingWorkSet.contains(work)) {
-                return;
-            }
-
-            pendingWorkSet.add(work);
-
-            asyncExec(work);
-        }
-    }
-
-    /**
-     * Schedules some work to happen in the UI thread as soon as possible. If
-     * possible, the work will happen before the next control redraws. Unlike
-     * runOnce, calling asyncExec twice with the same runnable will cause that
-     * runnable to run twice.
-     * 
-     * @param work
-     *            runnable to execute
-     */
-    public void asyncExec(Runnable work) {
-        synchronized (pendingWork) {
-            pendingWork.add(work);
-            if (!updateScheduled) {
-                updateScheduled = true;
-                d.asyncExec(updateJob);
-            }
-
-            // If we're in the UI thread, add an event filter to ensure
-            // the work happens ASAP
-            if (Display.getCurrent() == d) {
-                if (!paintListenerAttached) {
-                    paintListenerAttached = true;
-                    d.addFilter(SWT.Paint, paintListener);
-                }
-            }
-        }
-    }
-
-    /**
-     * Cancels a previously-scheduled runnable. Has no effect if the given
-     * runnable was not previously scheduled or has already executed.
-     * 
-     * @param toCancel
-     *            runnable to cancel
-     */
-    public void cancelExec(Runnable toCancel) {
-        synchronized (pendingWork) {
-            pendingWork.remove(toCancel);
-            pendingWorkSet.remove(toCancel);
-        }
-    }
-
-    /**
-     * Cancels all pending work.
-     */
-    public void cancelAll() {
-        synchronized (pendingWork) {
-            pendingWork.clear();
-            pendingWorkSet.clear();
-        }
-    }
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/viewers/IParentProvider.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/viewers/IParentProvider.java
deleted file mode 100644
index 433cea1..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/viewers/IParentProvider.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Stefan Xenos, IBM - initial API and implementation
- *     Matthew Hall - bug 207858
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.provisional.viewers;
-
-/**
- * NON-API - Returns the parent of elements in a tree.
- * 
- * @since 1.1
- */
-public interface IParentProvider {
-	
-	/**
-	 * Returns the parent of the passed in child element, or null if unknown.
-	 * 
-	 * @param child
-	 *            the child element
-	 * @return the parent of the passed in child element, or null if unknown.
-	 */
-	public Object getParent(Object child);
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/viewers/TreeNode.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/viewers/TreeNode.java
deleted file mode 100644
index 39ce156..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/viewers/TreeNode.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Stefan Xenos, IBM - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.provisional.viewers;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-import org.eclipse.core.databinding.observable.set.SetDiff;
-import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableSetTreeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * 
- * @since 1.0
- * @deprecated Use {@link ObservableSetTreeContentProvider} or
- * {@link ObservableListTreeContentProvider} instead.
- */
-/* package */ class TreeNode implements ISetChangeListener, IStaleListener {
-    private UnorderedTreeContentProvider contentProvider;
-    private Object element;
-    
-    // Stores the set of parents (null if there are less than 2)
-    private HashSet parents = null;
-    
-    // Stores one representative parent. If there is more than one parent,
-    // the complete set of parents can be found in the parents set.
-    Object parent;
-    
-    /**
-     * Set of child elements.
-     */
-    private IObservableSet children;
-    
-    private boolean hasPendingNode = false;
-    private boolean isStale;
-    private boolean listeningToChildren = false;
-    private boolean prefetchEnqueued = false;
-    
-    /**
-     * @param element
-     * @param cp
-     */
-    public TreeNode(Object element, UnorderedTreeContentProvider cp) {
-        this.element = element;
-        this.contentProvider = cp;
-        children = contentProvider.createChildSet(element);
-        if (children == null) {
-            children = Observables.emptyObservableSet();
-            listeningToChildren = true;
-        }
-        hasPendingNode = children.isStale();
-    }
-    
-    /**
-     * @param parent
-     */
-    public void addParent(Object parent) {
-        if (this.parent == null) {
-            this.parent = parent;
-        } else {
-            if (parent.equals(this.parent)) {
-                return;
-            }
-            if (parents == null) {
-                parents = new HashSet();
-                parents.add(this.parent);
-            }
-            parents.add(parent);
-        }
-    }
-    
-    /**
-     * @param parent
-     */
-    public void removeParent(Object parent) {
-        if (this.parents != null) {
-            parents.remove(parent);
-        } 
-        
-        if (parent == this.parent) {
-            if (parents == null || parents.isEmpty()) {
-                this.parent = null;
-            } else {
-                this.parent = parents.iterator().next();
-            }
-        }
-        
-        if (this.parents != null && this.parents.size() <= 1) {
-            this.parents = null;
-        }
-    }
-    
-    /**
-     * Returns the set of children for this node. If new children are discovered later, they
-     * will be added directly to the viewer.
-     *  
-     * @return TODO
-     */
-    public Set getChildren() {
-        if (!listeningToChildren) {
-            listeningToChildren = true;
-            children.addSetChangeListener(this);
-            hasPendingNode = children.isEmpty() && children.isStale();
-            children.addStaleListener(this);
-            updateStale();
-        }
-        
-        // If the child set is stale and empty, show the "pending" node
-        if (hasPendingNode) {
-            Object pendingNode = contentProvider.getPendingNode();
-            return Collections.singleton(pendingNode);
-        }
-        return children;
-    }
-    
-    /**
-     * @return TODO
-     */
-    public IObservableSet getChildrenSet() {
-        return children;
-    }
-    
-    private void updateStale() {
-        boolean willBeStale = children.isStale();
-        if (willBeStale != isStale) {
-            isStale = willBeStale;
-            
-            contentProvider.changeStale(isStale? 1 : -1);
-        }
-    }
-    
-    /**
-     * @return TODO
-     */
-    public boolean isStale() {
-        return isStale;
-    }
-
-    /**
-     * Returns true if the viewer should show a plus sign for expanding this 
-     * node. 
-     * 
-     * @return TODO
-     */
-    public boolean shouldShowPlus() {
-        if (children == null) {
-//            if (!hasPendingNode) {
-//                hasPendingNode = true;
-//                contentProvider.add(element, Collections.singleton(contentProvider.getPendingNode()));
-//            }
-            return true;
-        }
-        if (!listeningToChildren && !prefetchEnqueued) {
-            prefetchEnqueued = true;
-            contentProvider.enqueuePrefetch(this);
-        }
-        return !listeningToChildren || hasPendingNode || !children.isEmpty();
-    }
-    
-    /**
-     * Disposes this node and removes all remaining children.
-     */
-    public void dispose() {
-        if (children != null) {
-            if (listeningToChildren) {
-                contentProvider.remove(element, children, true);
-                children.removeSetChangeListener(this);
-                children.removeStaleListener(this);
-            }
-            children.dispose();
-            children = null;
-            
-            if (listeningToChildren && isStale) {
-                contentProvider.changeStale(-1);
-            }
-        }
-    }
-    
-    /**
-     * @return TODO
-     */
-    public boolean isDisposed() {
-        return children == null;
-    }
-    
-    /**
-     * Returns one representative parent, or null if this node is unparented. Use
-     * getParents() to get the complete set of known parents.
-     * 
-     * @return TODO
-     */
-    public Object getParent() {
-        return parent;
-    }
-    
-    /**
-     * 
-     * @return the set of all known parents for this node
-     */
-    public Set getParents() {
-        if (parents == null) {
-            if (parent == null) {
-                return Collections.EMPTY_SET;
-            }
-			return Collections.singleton(parent);
-        }
-		return parents;
-    }
-    
-    /**
-     * Called when the child set changes. Should not be called directly by the viewer.
-     */
-    public void handleSetChange(SetChangeEvent event) {
-        SetDiff diff = event.diff;
-        TreeViewer viewer = this.contentProvider.getViewer();
-        if (viewer != null) {
-            Control control = viewer.getControl();
-            if (control != null) {
-                if (control.isDisposed()) {
-                    // If the widgetry was disposed without notifying the content provider, then
-                    // dispose the content provider now and stop processing events.
-                    contentProvider.dispose();
-                    return;
-                }
-            }
-        }
-        
-        boolean shouldHavePendingNode = children.isEmpty() && children.isStale();
-        
-        Set additions = diff.getAdditions();
-        // Check if we should add the pending node
-        if (shouldHavePendingNode && !hasPendingNode) {
-            HashSet newAdditions = new HashSet();
-            newAdditions.addAll(additions);
-            newAdditions.add(contentProvider.getPendingNode());
-            additions = newAdditions;
-            hasPendingNode = true;
-        }
-
-        Set removals = diff.getRemovals();
-        // Check if we should remove the pending node
-        if (!shouldHavePendingNode && hasPendingNode) {
-            HashSet newRemovals = new HashSet();
-            newRemovals.addAll(removals);
-            newRemovals.add(contentProvider.getPendingNode());
-            removals = newRemovals;
-            hasPendingNode = false;
-        }
-        if (!additions.isEmpty()) {
-            contentProvider.add(element, additions);
-        }
-        if (!removals.isEmpty()) {
-            contentProvider.remove(element, removals, children.isEmpty() && !hasPendingNode);
-        }
-        
-        updateStale();
-    }
-
-    public void handleStale(StaleEvent staleEvent) {
-        TreeViewer viewer = this.contentProvider.getViewer();
-        if (viewer != null) {
-            Control control = viewer.getControl();
-            if (control != null) {
-                if (control.isDisposed()) {
-                    // If the widgetry was disposed without notifying the content provider, then
-                    // dispose the content provider now and stop processing events.
-                    contentProvider.dispose();
-                    return;
-                }
-            }
-        }
-        
-        boolean shouldHavePendingNode = children.isEmpty() && children.isStale();
-        
-        // Check if we should add the pending node
-        if (shouldHavePendingNode && !hasPendingNode) {
-            hasPendingNode = shouldHavePendingNode;
-            contentProvider.add(element, Collections.singleton(contentProvider.getPendingNode()));
-        }
-        
-        // Check if we should remove the pending node
-        if (!shouldHavePendingNode && hasPendingNode) {
-            hasPendingNode = shouldHavePendingNode;
-            contentProvider.remove(element, Collections.singleton(contentProvider.getPendingNode()), true);
-        }
-        
-        updateStale();
-    }
-
-    /**
-     * @return TODO
-     */
-    public Object getElement() {
-        return element;
-    }
-
-    /**
-     * 
-     */
-    public void prefetch() {
-        TreeViewer viewer = this.contentProvider.getViewer();
-        if (viewer != null) {
-            Control control = viewer.getControl();
-            if (control != null) {
-                if (control.isDisposed()) {
-                    // If the widgetry has been disposed, then avoid sending anything
-                    // to the viewer.
-                    return;
-                }
-            }
-        }
-        
-        Set children = getChildren();
-        if (!children.isEmpty()) {
-            contentProvider.add(element, children);
-        } else {
-            // We need to remove the + sign, and adding/removing elements won't do the trick
-            contentProvider.getViewer().refresh(element);
-        }
-    }
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/viewers/UnorderedTreeContentProvider.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/viewers/UnorderedTreeContentProvider.java
deleted file mode 100644
index 627b60b..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/viewers/UnorderedTreeContentProvider.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Stefan Xenos, IBM - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.provisional.viewers;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.set.AbstractObservableSet;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.SetDiff;
-import org.eclipse.core.internal.databinding.observable.tree.IUnorderedTreeProvider;
-import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableSetTreeContentProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.ITreePathContentProvider;
-import org.eclipse.jface.viewers.ITreeViewerListener;
-import org.eclipse.jface.viewers.TreeExpansionEvent;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * NON-API - Generic tree content provider to be used with an AbstractTreeViewer based on a IUnorderedTreeProvider.
- * @since 1.1
- * @deprecated Use {@link ObservableSetTreeContentProvider} or
- * {@link ObservableListTreeContentProvider} instead.
- */
-public class UnorderedTreeContentProvider implements ITreeContentProvider, ITreePathContentProvider {
-
-    private HashMap mapElementToTreeNode = new HashMap();
-    private LinkedList enqueuedPrefetches = new LinkedList();
-    private IParentProvider rootParentProvider = null;
-    private boolean useTreePaths = false;
-    
-    class KnownElementsSet extends AbstractObservableSet {
-        
-        protected KnownElementsSet() {
-            super(); 
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.internal.databinding.provisional.observable.set.AbstractObservableSet#getWrappedSet()
-         */
-        protected Set getWrappedSet() {
-            return mapElementToTreeNode.keySet();
-        }
-        
-        void doFireDiff(Set added, Set removed) {
-            fireSetChange(Diffs.createSetDiff(added, removed));
-        }
-        
-        public void fireSetChange(SetDiff diff) {
-        	super.fireSetChange(diff);
-        }
-
-        void doFireStale(boolean isStale) {
-            if (isStale) {
-                fireStale();
-            } else {
-                fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, Collections.EMPTY_SET));
-            }
-        }
-        
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.internal.databinding.provisional.observable.set.IObservableSet#getElementType()
-         */
-        public Object getElementType() {
-            return new Object();
-        }
-    }
-    
-    KnownElementsSet elements = new KnownElementsSet();
-    
-    private ITreeViewerListener expandListener = new ITreeViewerListener() {
-        public void treeCollapsed(TreeExpansionEvent event) {
-        }
-
-        public void treeExpanded(TreeExpansionEvent event) {
-        }
-    };
-
-    private IUnorderedTreeProvider provider;
-    private Object pendingNode;
-
-    private int avoidViewerUpdates;
-
-    private TreeViewer treeViewer;
-
-    private int staleCount = 0;
-    private boolean useRefresh;
-    private int maxPrefetches = 0;
-
-    /**
-     * Constructs a content provider that will render the given tree in a TreeViewer. 
-     * 
-     * @param provider IObservableTree that provides the contents of the tree
-     * @param pendingNode element to insert whenever a node is being fetched in the background
-     * @param useRefresh true = notify the viewer of changes by calling refresh(...), false =
-     *        notify the viewer of changes by calling add(...) and remove(...). Using false
-     *        is more efficient, but may not work with TreeViewer subclasses. 
-     */
-    public UnorderedTreeContentProvider(IUnorderedTreeProvider provider, 
-            Object pendingNode, boolean useRefresh) {
-        this.provider = provider;
-        this.pendingNode = pendingNode;
-        this.useRefresh = useRefresh;
-    }
- 
-    /**
-     * Sets whether this content provider should add/remove elements using
-     * TreePaths (true) or elements (false).
-     * 
-     * <p></p>
-     * <p>When using elements:</p>
-     * 
-     * <ul>
-     * <li>Cycles are permitted (elements can be their own ancestor)</li>
-     * <li>Addition, removal, and refresh are slightly faster</li>
-     * <li>It is not possible to have more than one content provider per tree</li>
-     * <li>The setRootPath(...) method is ignored</li>
-     * </ul>
-     * 
-     * <p></p>
-     * <p>When using TreePaths:</p>
-     * 
-     * <ul>
-     * <li>Cycles are not permitted (elements cannot be their own parent)</li>
-     * <li>Addition, removal, and refresh are slightly slower</li>
-     * <li>It is possible to use more than one content provider in the same tree</li>
-     * <li>The setRootPath(...) method can be used to direct the output to a particular
-     *     subtree</li>
-     * </ul>
-     * 
-     * @param usePaths
-     */
-    public void useTreePaths(boolean usePaths) {
-        this.useTreePaths = usePaths;
-    }
-    
-    /**
-     * @param rootParentProvider
-     */
-    public void setRootPath(IParentProvider rootParentProvider) {
-    	this.rootParentProvider = rootParentProvider;
-    }
-    
-    /**
-     * @param maxPrefetches
-     */
-    public void setMaxPrefetches(int maxPrefetches) {
-        this.maxPrefetches = maxPrefetches; 
-    }
-    
-    /* package */ IObservableSet createChildSet(Object element) {
-        return provider.createChildSet(element);
-    }
-
-    /* package */ void remove(Object element, Set removals, boolean lastElement) {
-        if (removals.isEmpty()) {
-            return;
-        }
-        if (avoidViewerUpdates == 0) {
-            if (lastElement || useRefresh) {
-                doRefresh(element);
-            } else {
-                if (useTreePaths) {
-                    List toRemove = new ArrayList();
-                    TreePath[] parents = getParents(element);
-                    for (int i = 0; i < parents.length; i++) {
-                        TreePath parent = parents[i];
-
-                        for (Iterator iter = removals.iterator(); iter.hasNext();) {
-                            Object elementToRemove = iter.next();
-                            
-                            toRemove.add(parent.createChildPath(element).createChildPath(elementToRemove));
-                        }
-                    }
-                    
-                    treeViewer.remove(toRemove.toArray(new TreePath[toRemove.size()]));
-                } else {
-                    treeViewer.remove(element, removals.toArray());
-                }
-            }
-            for (Iterator iter = removals.iterator(); iter.hasNext();) {
-                Object next = iter.next();
-                
-                TreeNode nextNode = (TreeNode)mapElementToTreeNode.get(next);
-                if (nextNode != null) {
-                    nextNode.removeParent(element);
-                    removeIfUnused(nextNode);
-                }
-            }
-        }
-    }
-
-    /* package */ void add(Object element, Set additions) {
-        if (additions.isEmpty()) {
-            return;
-        }
-        if (avoidViewerUpdates == 0) {
-            // Handle new parents
-            addParent(element, additions);
-            if (useRefresh) {
-                doRefresh(element);
-            } else {
-                if (useTreePaths) {
-                    TreePath[] parents = getParents(element);
-                    for (int i = 0; i < parents.length; i++) {
-                        TreePath parent = parents[i];
-                        
-                        treeViewer.add(parent.createChildPath(element), additions.toArray());
-                    }
-                } else {
-                    treeViewer.add(element, additions.toArray());
-                }
-            }
-        }
-    }
-
-    private void doRefresh(Object element) {
-        treeViewer.refresh(element);
-    }
-    
-    /**
-     * Ensures that the given set of children have the given parent as 
-     * one of their parents.
-     *  
-     * @param parent
-     * @param children
-     */
-    private void addParent(Object parent, Set children) {
-        for (Iterator iter = children.iterator(); iter.hasNext();) {
-            Object next = iter.next();
-            
-            TreeNode nextNode = getNode(next);
-            nextNode.addParent(parent);
-        }
-    }
-
-    /**
-     * @return saouesnth
-     */
-    public final Object getPendingNode() {
-        return pendingNode;
-    }
-    
-    /**
-     * @param parent
-     * @return aueosnht
-     */
-    public IObservableSet getChildrenSet(Object parent) {
-        IObservableSet result = getNode(parent).getChildrenSet();
-        
-        return result;
-    }
-    
-    public void dispose() {
-        if (treeViewer != null) {
-            try {
-                avoidViewerUpdates++;
-                enqueuedPrefetches.clear();
-                Object[] keys = mapElementToTreeNode.keySet().toArray();
-    
-                for (int i = 0; i < keys.length; i++) {
-                    Object key = keys[i];
-    
-                    TreeNode result = (TreeNode)mapElementToTreeNode.get(key);
-                    if (result != null) {
-                        result.dispose();
-                    }
-                }
-                setViewer(null);
-            } finally {
-                avoidViewerUpdates--;
-            }
-        }
-    }
-    
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-        // This should only ever be called for a single viewer
-        setViewer(viewer);
-        
-        if (oldInput != null && newInput != null && oldInput.equals(newInput)) {
-            return;
-        }
-        
-        try {
-            avoidViewerUpdates++;
-            TreeNode oldNode = (TreeNode)mapElementToTreeNode.get(oldInput);
-            if (oldNode != null) {
-                removeIfUnused(oldNode);
-            }
-        } finally {
-            avoidViewerUpdates--;
-        }
-    }
-    
-    private void removeIfUnused(TreeNode toRemove) {
-        //TreeNode result = (TreeNode)mapElementToTreeNode.get(element);
-        Object element = toRemove.getElement();
-        if (toRemove.getParent() == null) {
-            mapElementToTreeNode.remove(element);
-            elements.doFireDiff(Collections.EMPTY_SET, Collections.singleton(element));
-            toRemove.dispose();
-        }
-    }
-
-    private void setViewer(Viewer viewer) {
-        if (viewer != null && !(viewer instanceof TreeViewer)) {
-            throw new IllegalArgumentException("This content provider can only be used with TreeViewers"); //$NON-NLS-1$
-        }
-        TreeViewer newTreeViewer = (TreeViewer) viewer;
-        
-        if (newTreeViewer != treeViewer) {
-            if (treeViewer != null) {
-                treeViewer.removeTreeListener(expandListener);
-            }
-            
-            this.treeViewer = newTreeViewer;
-            if (newTreeViewer != null) {
-                newTreeViewer.addTreeListener(expandListener);
-            }
-        }
-    }
-
-    public Object[] getChildren(Object parentElement) {
-        Set result = getNode(parentElement).getChildren();
-        
-        addParent(parentElement, result);
-        
-        return result.toArray();
-    }
-
-    private TreeNode getNode(Object parentElement) {
-        TreeNode result = (TreeNode)mapElementToTreeNode.get(parentElement);
-        if (result == null) {
-            result = new TreeNode(parentElement, this);
-            mapElementToTreeNode.put(parentElement, result);
-            elements.fireSetChange(Diffs.createSetDiff(Collections.singleton(parentElement), 
-                    Collections.EMPTY_SET));
-        }
-        return result;
-    }
-
-    public Object getParent(Object element) {
-        Object result = getNode(element).getParent();
-        if (result == null && rootParentProvider != null) {
-            result = rootParentProvider.getParent(element);
-        }
-        return result;
-    }
-
-    public boolean hasChildren(Object element) {
-        return getNode(element).shouldShowPlus();
-    }
-
-    public Object[] getElements(Object inputElement) {
-        return getChildren(inputElement);
-    }
-    
-    /**
-     * @return aouesnth
-     */
-    public IObservableSet getKnownElements() {
-        return elements;
-    }
-    
-    /* package */ void changeStale(int staleDelta) {
-        staleCount += staleDelta;
-        processPrefetches();
-        elements.setStale(staleCount != 0);
-    }
-
-    /**
-     * @return aoueesnth      
-     */
-    public TreeViewer getViewer() {
-        return treeViewer;
-    }
-
-    /**
-     * @param element
-     * @return aoeusnth
-     */
-    public boolean isDirty(Object element) {
-        return false;
-    }
-
-    /* package */ void enqueuePrefetch(TreeNode node) {
-        if (maxPrefetches > 0 || maxPrefetches == -1) {
-            if (staleCount == 0) {
-                // Call node.getChildren()... this will cause us to start listening to the 
-                // node and will trigger prefetching. Don't call prefetch since this method
-                // is intended to be called inside getters (which will simply return the
-                // fetched nodes) and prefetch() is intended to be called inside an asyncExec,
-                // which will notify the viewer directly of the newly discovered nodes.
-                node.getChildren();
-            } else {
-                enqueuedPrefetches.add(node);
-                while (maxPrefetches >= 0 && enqueuedPrefetches.size() > maxPrefetches) {
-                    enqueuedPrefetches.removeFirst();
-                }
-            }
-        }
-    }
-
-    private void processPrefetches() {
-        while (staleCount == 0 && !enqueuedPrefetches.isEmpty()) {
-            TreeNode next = (TreeNode)enqueuedPrefetches.removeLast();
-            
-            // Note that we don't remove nodes from the prefetch queue when they are disposed,
-            // so we may encounter disposed nodes at this time. 
-            if (!next.isDisposed()) {
-                next.prefetch();
-            }
-        }
-    }
-
-    public Object[] getChildren(TreePath parentPath) {
-        return getChildren(parentPath.getLastSegment());
-    }
-
-    public TreePath[] getParents(Object element) {
-        // Compute all paths that do not contain cycles
-    	/**
-    	 * List of Lists
-    	 */
-        List parentPaths = computeParents(element, new HashSet());
-        
-        /**
-         * List of TreePath
-         */
-        List result = new ArrayList();
-       
-        for (Iterator iterator = parentPaths.iterator(); iterator.hasNext();) {
-			List nextPath = (List) iterator.next();
-			            
-            LinkedList resultPath = new LinkedList();
-            resultPath.addAll(nextPath);
-        	Object nextParent = resultPath.isEmpty() ? element : resultPath.getFirst();
-            for(;nextParent != null;) {
-            	if (rootParentProvider != null) {
-            		nextParent = rootParentProvider.getParent(nextParent);
-                    if (nextParent != null) {
-                        resultPath.addFirst(nextParent);
-                    }
-            	} else {
-            		nextParent = null;
-            	}
-            }
-            
-            result.add(new TreePath(resultPath.toArray()));
-        }
-        
-        if (result.isEmpty() && rootParentProvider != null) {
-            Object nextParent = rootParentProvider.getParent(element);
-            if (nextParent != null) {
-                LinkedList resultPath = new LinkedList();
-                while (nextParent != null) {
-                    resultPath.addFirst(nextParent);
-                    nextParent = rootParentProvider.getParent(nextParent);
-                }
-                
-                result.add(new TreePath(resultPath.toArray()));
-            }
-            
-        }
-        
-        return (TreePath[]) result.toArray(new TreePath[result.size()]);
-    }
-    
-    /**
-     * 
-     * @param node
-     * @param toIgnore
-     * @return a list of Lists, indicating all known paths to the given node
-     */
-    private List computeParents(Object node, HashSet toIgnore) {
-        List result = new ArrayList();
-        boolean containedNode = toIgnore.add(node);
-        
-        TreeNode tn = getNode(node);
-        
-        HashSet parents = new HashSet();
-        parents.addAll(tn.getParents());
-        parents.removeAll(toIgnore);
-        if (parents.isEmpty()) {
-            ArrayList newPath = new ArrayList();
-            result.add(newPath);
-        } else {
-        	for (Iterator iterator = parents.iterator(); iterator.hasNext();) {
-				Object parent = iterator.next();
-				
-				List parentPaths = computeParents(parent, toIgnore);
-
-				for (Iterator iterator2 = parentPaths.iterator(); iterator2
-						.hasNext();) {
-					List parentPath = (List) iterator2.next();
-					
-                    parentPath.add(parent);
-                    result.add(parentPath);
-                }
-			}
-        }
-        
-        if (containedNode) {
-            toIgnore.remove(node);
-        }
-        return result;
-    }
-
-    public boolean hasChildren(TreePath path) {
-        return hasChildren(path.getLastSegment());
-    }
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/viewers/ViewerLabelProvider.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/viewers/ViewerLabelProvider.java
deleted file mode 100644
index bfc1a56..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/provisional/viewers/ViewerLabelProvider.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 223123
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.provisional.viewers;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.IViewerLabelProvider;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.jface.viewers.ViewerLabel;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * NON-API - Generic viewer label provider.
- * @since 1.1
- *
- */
-public class ViewerLabelProvider implements IViewerLabelProvider,
-		ILabelProvider {
-
-	private List listeners = new ArrayList();
-
-	/**
-	 * Subclasses should override this method. They should not call the base
-	 * class implementation.
-	 */
-	public void updateLabel(ViewerLabel label, Object element) {
-		label.setText(element.toString());
-	}
-
-	protected final void fireChangeEvent(Collection changes) {
-		final LabelProviderChangedEvent event = new LabelProviderChangedEvent(
-				this, changes.toArray());
-		ILabelProviderListener[] listenerArray = (ILabelProviderListener[]) listeners
-				.toArray(new ILabelProviderListener[listeners.size()]);
-		for (int i = 0; i < listenerArray.length; i++) {
-			ILabelProviderListener listener = listenerArray[i];
-			try {
-				listener.labelProviderChanged(event);
-			} catch (Exception e) {
-				Policy.getLog().log(
-						new Status(IStatus.ERROR, Policy.JFACE_DATABINDING, e
-								.getLocalizedMessage(), e));
-			}
-		}
-	}
-
-	public final Image getImage(Object element) {
-		ViewerLabel label = new ViewerLabel("", null); //$NON-NLS-1$
-		updateLabel(label, element);
-		return label.getImage();
-	}
-
-	public final String getText(Object element) {
-		ViewerLabel label = new ViewerLabel("", null); //$NON-NLS-1$
-		updateLabel(label, element);
-		return label.getText();
-	}
-
-	public void addListener(ILabelProviderListener listener) {
-		listeners.add(listener);
-	}
-
-	public void dispose() {
-		listeners.clear();
-	}
-
-	public final boolean isLabelProperty(Object element, String property) {
-		return true;
-	}
-
-	public void removeListener(ILabelProviderListener listener) {
-		listeners.remove(listener);
-	}
-
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ButtonObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ButtonObservableValue.java
deleted file mode 100644
index dee3392..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ButtonObservableValue.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Ashley Cambrell - bug 198904
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * @since 1.0
- * 
- */
-public class ButtonObservableValue extends AbstractSWTObservableValue {
-
-	private final Button button;
-
-	private boolean selectionValue;
-
-	private Listener updateListener = new Listener() {
-		public void handleEvent(Event event) {
-			boolean oldSelectionValue = selectionValue;
-			selectionValue = button.getSelection();
-						
-			notifyIfChanged(oldSelectionValue, selectionValue);
-		}
-	};
-
-	/**
-	 * @param button
-	 */
-	public ButtonObservableValue(Button button) {
-		super(button);
-		this.button = button;
-		init();
-	}
-	
-	/**
-	 * @param realm
-	 * @param button
-	 */
-	public ButtonObservableValue(Realm realm, Button button) {
-		super(realm, button);
-		this.button = button;
-		init();
-	}
-	
-	private void init() {
-		button.addListener(SWT.Selection, updateListener);
-		button.addListener(SWT.DefaultSelection, updateListener);
-		this.selectionValue = button.getSelection();
-	}
-
-	public void doSetValue(final Object value) {
-		boolean oldSelectionValue = selectionValue;
-		selectionValue = value == null ? false : ((Boolean) value)
-				.booleanValue();
-		
-		button.setSelection(selectionValue);
-		notifyIfChanged(oldSelectionValue, selectionValue);
-	}
-
-	public Object doGetValue() {
-		return button.getSelection() ? Boolean.TRUE : Boolean.FALSE;
-	}
-
-	public Object getValueType() {
-		return Boolean.TYPE;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-
-		if (!button.isDisposed()) {
-			button.removeListener(SWT.Selection, updateListener);
-			button.removeListener(SWT.DefaultSelection, updateListener);
-		}
-	}
-
-	/**
-	 * Notifies consumers with a value change event only if a change occurred.
-	 * 
-	 * @param oldValue
-	 * @param newValue
-	 */
-	private void notifyIfChanged(boolean oldValue, boolean newValue) {
-		if (oldValue != newValue) {
-			fireValueChange(Diffs.createValueDiff(oldValue ? Boolean.TRUE : Boolean.FALSE,
-					newValue ? Boolean.TRUE : Boolean.FALSE));
-		}		
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/CComboObservableList.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/CComboObservableList.java
deleted file mode 100644
index b38baea..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/CComboObservableList.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.custom.CCombo;
-
-/**
- * @since 3.2
- * 
- */
-public class CComboObservableList extends SWTObservableList {
-
-	private final CCombo ccombo;
-
-	/**
-	 * @param ccombo
-	 */
-	public CComboObservableList(CCombo ccombo) {
-		super(SWTObservables.getRealm(ccombo.getDisplay()));
-		this.ccombo = ccombo;
-	}
-
-	protected int getItemCount() {
-		return ccombo.getItemCount();
-	}
-
-	protected void setItems(String[] newItems) {
-		ccombo.setItems(newItems);
-	}
-
-	protected String[] getItems() {
-		return ccombo.getItems();
-	}
-
-	protected String getItem(int index) {
-		return ccombo.getItem(index);
-	}
-
-	protected void setItem(int index, String string) {
-		ccombo.setItem(index, string);
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/CComboObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/CComboObservableValue.java
deleted file mode 100644
index 7edd132..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/CComboObservableValue.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Ashley Cambrell - bug 198904
- *     Matthew Hall - bug 118516
- *     Eric Rizzo - bug 134884
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-
-/**
- * @since 3.2
- * 
- */
-public class CComboObservableValue extends AbstractSWTObservableValue {
-
-	/**
-	 * 
-	 */
-
-	private final CCombo ccombo;
-
-	private final String attribute;
-
-	private boolean updating = false;
-
-	private String currentValue;
-
-	private ModifyListener modifyListener;
-
-	/**
-	 * @param ccombo
-	 * @param attribute
-	 */
-	public CComboObservableValue(CCombo ccombo, String attribute) {
-		super(ccombo);
-		this.ccombo = ccombo;
-		this.attribute = attribute;
-		init();
-	}
-
-	/**
-	 * @param realm
-	 * @param ccombo
-	 * @param attribute
-	 */
-	public CComboObservableValue(Realm realm, CCombo ccombo, String attribute) {
-		super(realm, ccombo);
-		this.ccombo = ccombo;
-		this.attribute = attribute;
-		init();
-	}
-	
-	private void init() {		
-		if (attribute.equals(SWTProperties.SELECTION)
-				|| attribute.equals(SWTProperties.TEXT)) {
-			this.currentValue = ccombo.getText();
-			modifyListener = new ModifyListener() {
-
-				public void modifyText(ModifyEvent e) {
-					if (!updating) {
-						String oldValue = currentValue;
-						currentValue = CComboObservableValue.this.ccombo
-								.getText();
-						
-						notifyIfChanged(oldValue, currentValue);
-					}
-				}
-			};
-			ccombo.addModifyListener(modifyListener);
-		} else
-			throw new IllegalArgumentException();
-	}
-
-	public void doSetValue(final Object value) {
-		String oldValue = ccombo.getText();
-		try {
-			updating = true;
-			if (attribute.equals(SWTProperties.TEXT)) {
-				String stringValue = value != null ? value.toString() : ""; //$NON-NLS-1$
-				ccombo.setText(stringValue);
-			} else if (attribute.equals(SWTProperties.SELECTION)) {
-				String items[] = ccombo.getItems();
-				int index = -1;
-				if (value == null) {
-					ccombo.select(-1);
-				} else if (items != null) {
-					for (int i = 0; i < items.length; i++) {
-						if (value.equals(items[i])) {
-							index = i;
-							break;
-						}
-					}
-					if (index == -1) {
-						ccombo.setText((String) value);
-					} else {
-						ccombo.select(index); // -1 will not "unselect"
-					}
-				}
-			}
-		} finally {
-			updating = false;
-			currentValue = ccombo.getText();
-		}
-		
-		notifyIfChanged(oldValue, currentValue);
-	}
-
-	public Object doGetValue() {
-		if (attribute.equals(SWTProperties.TEXT))
-			return ccombo.getText();
-
-		Assert.isTrue(attribute.equals(SWTProperties.SELECTION),
-				"unexpected attribute: " + attribute); //$NON-NLS-1$
-		// The problem with a ccombo, is that it changes the text and
-		// fires before it update its selection index
-		return ccombo.getText();
-	}
-
-	public Object getValueType() {
-		Assert.isTrue(attribute.equals(SWTProperties.TEXT)
-				|| attribute.equals(SWTProperties.SELECTION),
-				"unexpected attribute: " + attribute); //$NON-NLS-1$
-		return String.class;
-	}
-
-	/**
-	 * @return attribute being observed
-	 */
-	public String getAttribute() {
-		return attribute;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-
-		if (modifyListener != null && !ccombo.isDisposed()) {
-			ccombo.removeModifyListener(modifyListener);
-		}
-	}
-	
-	private void notifyIfChanged(String oldValue, String newValue) {
-		if (!oldValue.equals(newValue)) {
-			fireValueChange(Diffs.createValueDiff(oldValue, ccombo.getText()));			
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/CComboSingleSelectionObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/CComboSingleSelectionObservableValue.java
deleted file mode 100644
index d10ad42..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/CComboSingleSelectionObservableValue.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Ashley Cambrell - bug 198904
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-
-/**
- * @since 1.0
- *
- */
-public class CComboSingleSelectionObservableValue extends
-		SingleSelectionObservableValue {
-
-	private SelectionListener selectionListener;
-
-	/**
-	 * @param combo
-	 */
-	public CComboSingleSelectionObservableValue(CCombo combo) {
-		super(combo);
-	}
-	
-	/**
-	 * @param realm
-	 * @param combo
-	 */
-	public CComboSingleSelectionObservableValue(Realm realm, CCombo combo) {
-		super(realm, combo);
-	}
-
-	private CCombo getCCombo() {
-		return (CCombo) getWidget();
-	}
-
-	protected void doAddSelectionListener(final Runnable runnable) {
-		selectionListener = new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {
-				runnable.run();
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				runnable.run();
-			}
-		};
-		getCCombo().addSelectionListener(selectionListener);
-	}
-
-	protected int doGetSelectionIndex() {
-		return getCCombo().getSelectionIndex();
-	}
-
-	protected void doSetSelectionIndex(int index) {
-		getCCombo().setText(getCCombo().getItem(index));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-		if (selectionListener != null && !getCCombo().isDisposed()) {
-			getCCombo().removeSelectionListener(selectionListener);
-		}
-
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/CLabelObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/CLabelObservableValue.java
deleted file mode 100644
index 106e07a..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/CLabelObservableValue.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.swt.custom.CLabel;
-
-/**
- * @since 1.0
- * 
- */
-public class CLabelObservableValue extends AbstractSWTObservableValue {
-
-	private final CLabel label;
-
-	/**
-	 * @param label
-	 */
-	public CLabelObservableValue(CLabel label) {
-		super(label);
-		this.label = label;
-	}
-	
-	/**
-	 * @param realm
-	 * @param label
-	 */
-	public CLabelObservableValue(Realm realm, CLabel label) {
-		super(realm, label);
-		this.label = label;
-	}
-
-	public void doSetValue(final Object value) {
-		String oldValue = label.getText();
-		String newValue = value == null ? "" : value.toString();  //$NON-NLS-1$
-		label.setText(newValue);
-
-		if (!newValue.equals(oldValue)) {
-			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
-		}
-	}
-
-	public Object doGetValue() {
-		return label.getText();
-	}
-
-	public Object getValueType() {
-		return String.class;
-	}
-
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ComboObservableList.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ComboObservableList.java
deleted file mode 100644
index 8bccc48..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ComboObservableList.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.widgets.Combo;
-
-/**
- * @since 3.2
- * 
- */
-public class ComboObservableList extends SWTObservableList {
-
-	private final Combo combo;
-
-	/**
-	 * @param combo
-	 */
-	public ComboObservableList(Combo combo) {
-		super(SWTObservables.getRealm(combo.getDisplay()));
-		this.combo = combo;
-	}
-
-	protected int getItemCount() {
-		return combo.getItemCount();
-	}
-
-	protected void setItems(String[] newItems) {
-		combo.setItems(newItems);
-	}
-
-	protected String[] getItems() {
-		return combo.getItems();
-	}
-
-	protected String getItem(int index) {
-		return combo.getItem(index);
-	}
-
-	protected void setItem(int index, String string) {
-		combo.setItem(index, string);
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ComboObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ComboObservableValue.java
deleted file mode 100644
index 885501b..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ComboObservableValue.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Ashley Cambrell - bug 198904
- *     Matthew Hall - bug 118516
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Combo;
-
-/**
- * @since 3.2
- * 
- */
-public class ComboObservableValue extends AbstractSWTObservableValue {
-
-	private final Combo combo;
-	private final String attribute;
-	private boolean updating = false;
-	private String currentValue;
-	private ModifyListener modifyListener;
-
-	/**
-	 * @param combo
-	 * @param attribute
-	 */
-	public ComboObservableValue(Combo combo, String attribute) {
-		super(combo);
-		this.combo = combo;
-		this.attribute = attribute;
-		init();
-	}
-		
-	/**
-	 * @param realm
-	 * @param combo
-	 * @param attribute
-	 */
-	public ComboObservableValue(Realm realm, Combo combo, String attribute) {
-		super(realm, combo);
-		this.combo = combo;
-		this.attribute = attribute;
-		init();
-	}
-	
-	private void init() {		
-		if (attribute.equals(SWTProperties.SELECTION)
-				|| attribute.equals(SWTProperties.TEXT)) {
-			this.currentValue = combo.getText();
-			modifyListener = new ModifyListener() {
-
-				public void modifyText(ModifyEvent e) {
-					if (!updating) {
-						String oldValue = currentValue;
-						currentValue = ComboObservableValue.this.combo
-								.getText();
-						
-						notifyIfChanged(oldValue, currentValue);
-					}
-				}
-			};
-			combo.addModifyListener(modifyListener);
-		} else
-			throw new IllegalArgumentException();
-	}
-
-	public void doSetValue(final Object value) {
-		String oldValue = combo.getText();
-		try {
-			updating = true;
-			if (attribute.equals(SWTProperties.TEXT)) {
-				String stringValue = value != null ? value.toString() : ""; //$NON-NLS-1$
-				combo.setText(stringValue);
-			} else if (attribute.equals(SWTProperties.SELECTION)) {
-				String items[] = combo.getItems();
-				int index = -1;
-				if (items != null && value != null) {
-					for (int i = 0; i < items.length; i++) {
-						if (value.equals(items[i])) {
-							index = i;
-							break;
-						}
-					}
-					if (index == -1) {
-						combo.setText((String) value);
-					} else {
-						combo.select(index); // -1 will not "unselect"
-					}
-				}
-			}
-		} finally {
-			updating = false;
-			currentValue = combo.getText();
-		}
-		
-		notifyIfChanged(oldValue, currentValue);
-	}
-
-	public Object doGetValue() {
-		if (attribute.equals(SWTProperties.TEXT))
-			return combo.getText();
-
-		Assert.isTrue(attribute.equals(SWTProperties.SELECTION),
-				"unexpected attribute: " + attribute); //$NON-NLS-1$
-		// The problem with a ccombo, is that it changes the text and
-		// fires before it update its selection index
-		return combo.getText();
-	}
-
-	public Object getValueType() {
-		Assert.isTrue(attribute.equals(SWTProperties.TEXT)
-				|| attribute.equals(SWTProperties.SELECTION),
-				"unexpected attribute: " + attribute); //$NON-NLS-1$
-		return String.class;
-	}
-
-	/**
-	 * @return attribute being observed
-	 */
-	public String getAttribute() {
-		return attribute;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-
-		if (modifyListener != null && !combo.isDisposed()) {
-			combo.removeModifyListener(modifyListener);
-		}
-	}
-	
-	private void notifyIfChanged(String oldValue, String newValue) {
-		if (!oldValue.equals(newValue)) {
-			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ComboSingleSelectionObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ComboSingleSelectionObservableValue.java
deleted file mode 100644
index 922bfc2..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ComboSingleSelectionObservableValue.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Ashley Cambrell - bugs 198903, 198904
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Combo;
-
-/**
- * @since 1.0
- *
- */
-public class ComboSingleSelectionObservableValue extends
-		SingleSelectionObservableValue {
-
-	private SelectionListener selectionListener;
-
-	/**
-	 * @param combo
-	 */
-	public ComboSingleSelectionObservableValue(Combo combo) {
-		super(combo);
-	}
-
-	private Combo getCombo() {
-		return (Combo) getWidget();
-	}
-
-	protected void doAddSelectionListener(final Runnable runnable) {
-		selectionListener = new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {
-				runnable.run();
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				runnable.run();
-			}
-		};
-		getCombo().addSelectionListener(selectionListener);
-	}
-
-	protected int doGetSelectionIndex() {
-		return getCombo().getSelectionIndex();
-	}
-
-	protected void doSetSelectionIndex(int index) {
-		getCombo().select(index);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-		if (selectionListener != null && !getCombo().isDisposed()) {
-			getCombo().removeSelectionListener(selectionListener);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ControlObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ControlObservableValue.java
deleted file mode 100644
index 9be5c32..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ControlObservableValue.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Matt Carter - bug 170668
- *     Brad Reynolds - bug 170848
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * @since 1.0
- * 
- */
-public class ControlObservableValue extends AbstractSWTObservableValue {
-
-	private final Control control;
-
-	private final String attribute;
-
-	private Object valueType;
-	
-	private FocusListener focusListener;
-
-	private ControlListener controlListener;
-
-	private Boolean currentFocus;
-
-	private Point currentPoint;
-
-	private Rectangle currentBounds;
-
-	private boolean updating;
-
-	
-	private static final Map SUPPORTED_ATTRIBUTES = new HashMap();
-	static {
-		SUPPORTED_ATTRIBUTES.put(SWTProperties.ENABLED, Boolean.TYPE);
-		SUPPORTED_ATTRIBUTES.put(SWTProperties.VISIBLE, Boolean.TYPE);
-		SUPPORTED_ATTRIBUTES.put(SWTProperties.TOOLTIP_TEXT, String.class);
-		SUPPORTED_ATTRIBUTES.put(SWTProperties.FOREGROUND, Color.class);
-		SUPPORTED_ATTRIBUTES.put(SWTProperties.BACKGROUND, Color.class);
-		SUPPORTED_ATTRIBUTES.put(SWTProperties.FONT, Font.class);
-		SUPPORTED_ATTRIBUTES.put(SWTProperties.LOCATION, Point.class);
-		SUPPORTED_ATTRIBUTES.put(SWTProperties.SIZE, Point.class);
-		SUPPORTED_ATTRIBUTES.put(SWTProperties.FOCUS, Boolean.class);
-		SUPPORTED_ATTRIBUTES.put(SWTProperties.BOUNDS, Rectangle.class);
-	}
-	
-	/**
-	 * @param control
-	 * @param attribute
-	 */
-	public ControlObservableValue(Control control, String attribute) {
-		super(control);
-		this.control = control;
-		this.attribute = attribute;
-		if (SUPPORTED_ATTRIBUTES.keySet().contains(attribute)) {
-			this.valueType = SUPPORTED_ATTRIBUTES.get(attribute); 
-		} else {
-			throw new IllegalArgumentException();
-		}
-		
-		init();
-	}
-	
-	/**
-	 * @param realm 
-	 * @param control
-	 * @param attribute
-	 */
-	public ControlObservableValue(Realm realm, Control control, String attribute) {
-		super(realm, control);
-		this.control = control;
-		this.attribute = attribute;
-		if (SUPPORTED_ATTRIBUTES.keySet().contains(attribute)) {
-			this.valueType = SUPPORTED_ATTRIBUTES.get(attribute); 
-		} else {
-			throw new IllegalArgumentException();
-		}
-		
-		init();
-	}
-
-	private void init() {
-		if (SWTProperties.SIZE.equals(attribute)
-				|| SWTProperties.LOCATION.equals(attribute)
-				|| SWTProperties.BOUNDS.equals(attribute)) {
-			this.currentPoint = SWTProperties.SIZE.equals(attribute) ? control
-					.getSize() : control.getLocation();
-
-			controlListener = new ControlListener() {
-
-				public void controlMoved(ControlEvent e) {
-					if (SWTProperties.LOCATION.equals(attribute)) {
-						if (!updating) {
-							Point oldValue = currentPoint;
-							currentPoint = control.getLocation();
-
-							notifyIfChanged(oldValue, currentPoint);
-						}
-					} else if (SWTProperties.BOUNDS.equals(attribute)) {
-						if (!updating) {
-							Rectangle oldValue = currentBounds;
-							currentBounds = control.getBounds();
-
-							notifyIfChanged(oldValue, currentBounds);
-						}
-					}
-				}
-
-				public void controlResized(ControlEvent e) {
-					if (SWTProperties.LOCATION.equals(attribute)) {
-						if (!updating) {
-							Point oldValue = currentPoint;
-							currentPoint = control.getSize();
-
-							notifyIfChanged(oldValue, currentPoint);
-						}
-					} else if (SWTProperties.BOUNDS.equals(attribute)) {
-						if (!updating) {
-							Rectangle oldValue = currentBounds;
-							currentBounds = control.getBounds();
-
-							notifyIfChanged(oldValue, currentBounds);
-						}
-					}
-				}
-			};
-			control.addControlListener(controlListener);
-		} else if (SWTProperties.FOCUS.equals(attribute)) {
-			this.currentFocus = control == control.getDisplay()
-					.getFocusControl() ? Boolean.TRUE : Boolean.FALSE;
-			focusListener = new FocusListener() {
-
-				public void focusGained(FocusEvent e) {
-					if (!updating) {
-						Boolean oldValue = currentFocus;
-						currentFocus = Boolean.TRUE;
-						notifyIfChanged(oldValue, currentFocus);
-					}
-				}
-
-				public void focusLost(FocusEvent e) {
-					if (!updating) {
-						Boolean oldValue = currentFocus;
-						currentFocus = Boolean.FALSE;
-						notifyIfChanged(oldValue, currentFocus);
-					}
-				}
-			};
-			control.addFocusListener(focusListener);
-		}
-	}
-	
-	public void doSetValue(Object value) {
-		Object oldValue = doGetValue();
-		
-		if (SWTProperties.SIZE.equals(attribute)) {
-			try {
-				updating = true;
-				control.setSize((Point) value);
-			} finally {
-				updating = false;
-				currentPoint = control.getSize();
-			}
-		} else if (SWTProperties.LOCATION.equals(attribute)) {
-			try {
-				updating = true;
-				control.setLocation((Point) value);
-			} finally {
-				updating = false;
-				currentPoint = control.getLocation();
-			}
-		} else if (SWTProperties.FOCUS.equals(attribute)) {
-			try {
-				updating = true;
-				if (Boolean.TRUE.equals(value)) {
-					currentFocus = control.setFocus() ? Boolean.TRUE
-							: Boolean.FALSE;
-				} else {
-					// TODO Not possible force the focus to leave the control
-					// Maybe focus should the move to the Shell containing the
-					// control
-					this.currentFocus = control == control.getDisplay()
-							.getFocusControl() ? Boolean.TRUE : Boolean.FALSE;
-				}
-			} finally {
-				updating = false;
-			}
-		} else if (SWTProperties.BOUNDS.equals(attribute)) {
-			try {
-				updating = true;
-				control.setBounds((Rectangle) value);
-			} finally {
-				updating = false;
-				currentBounds = control.getBounds();
-			}
-		} else if (attribute.equals(SWTProperties.ENABLED)) {
-			control.setEnabled(((Boolean) value).booleanValue());
-		} else if (attribute.equals(SWTProperties.VISIBLE)) {
-			control.setVisible(((Boolean) value).booleanValue());
-		} else if (attribute.equals(SWTProperties.TOOLTIP_TEXT)) {
-			control.setToolTipText((String) value);
-		} else if (attribute.equals(SWTProperties.FOREGROUND)) {
-			control.setForeground((Color) value);
-		} else if (attribute.equals(SWTProperties.BACKGROUND)) {
-			control.setBackground((Color) value);
-		} else if (attribute.equals(SWTProperties.FONT)) {
-			control.setFont((Font) value);
-		}
-		
-		notifyIfChanged(oldValue, value);
-	}
-
-	public Object doGetValue() {
-		if (attribute.equals(SWTProperties.ENABLED)) {
-			return control.getEnabled() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		if (attribute.equals(SWTProperties.VISIBLE)) {
-			return control.getVisible() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		if (attribute.equals(SWTProperties.TOOLTIP_TEXT)) {
-			return control.getToolTipText();			
-		}
-		if (attribute.equals(SWTProperties.FOREGROUND))	 {
-			return control.getForeground();
-		}
-		if (attribute.equals(SWTProperties.BACKGROUND)) {
-			return control.getBackground();
-		}
-		if (attribute.equals(SWTProperties.FONT)) {
-			return control.getFont();
-		}
-		if (SWTProperties.SIZE.equals(attribute)) {
-			return control.getSize();
-		}
-		if (SWTProperties.LOCATION.equals(attribute)) {
-			return control.getLocation();
-		}
-		if (SWTProperties.FOCUS.equals(attribute)) {
-			return control == control.getDisplay().getFocusControl() ? Boolean.TRUE
-					: Boolean.FALSE;
-		}
-		if (SWTProperties.BOUNDS.equals(attribute)) {
-			return control.getBounds();
-		}
-		
-		return null;
-	}
-
-	public Object getValueType() {
-		return valueType;
-	}
-	
-	private void notifyIfChanged(Object oldValue, Object newValue) {
-		if (!Util.equals(oldValue, newValue)) {
-			fireValueChange(Diffs.createValueDiff(oldValue, newValue));			
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ItemObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ItemObservableValue.java
deleted file mode 100644
index b99d3ae..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ItemObservableValue.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.swt.widgets.Item;
-
-/**
- * @since 3.5
- * 
- */
-public class ItemObservableValue extends AbstractSWTObservableValue {
-
-	private final Item item;
-
-	/**
-	 * @param item
-	 */
-	public ItemObservableValue(Item item) {
-		super(item);
-		this.item = item;
-	}
-	
-	/**
-	 * @param realm
-	 * @param item
-	 */
-	public ItemObservableValue(Realm realm, Item item) {
-		super(realm, item);
-		this.item = item;
-	}
-
-	public void doSetValue(final Object value) {
-		String oldValue = item.getText();
-		String newValue = value == null ? "" : value.toString(); //$NON-NLS-1$
-		item.setText(newValue);
-		
-		if (!newValue.equals(oldValue)) {
-			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
-		}
-	}
-
-	public Object doGetValue() {
-		return item.getText();
-	}
-
-	public Object getValueType() {
-		return String.class;
-	}
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ItemTooltipObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ItemTooltipObservableValue.java
deleted file mode 100644
index 637c38b..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ItemTooltipObservableValue.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.TabItem;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.swt.widgets.TrayItem;
-import org.eclipse.swt.widgets.TreeColumn;
-
-/**
- * @since 3.5
- * 
- */
-public class ItemTooltipObservableValue extends AbstractSWTObservableValue {
-
-	private final Item item;
-
-	/**
-	 * @param item
-	 */
-	public ItemTooltipObservableValue(Item item) {
-		super(item);
-		this.item = item;
-	}
-	
-	/**
-	 * @param realm
-	 * @param item
-	 */
-	public ItemTooltipObservableValue(Realm realm, Item item) {
-		super(realm, item);
-		this.item = item;
-	}
-
-	public void doSetValue(final Object value) {
-		String oldValue = (String) doGetValue();
-
-		String newValue = value == null ? "" : value.toString(); //$NON-NLS-1$
-		if (item instanceof CTabItem) {
-			((CTabItem)item).setToolTipText(newValue);
-		}
-		else if (item instanceof TabItem) {
-			((TabItem)item).setToolTipText(newValue);
-		}
-		else if (item instanceof TableColumn) {
-			((TableColumn)item).setToolTipText(newValue);
-		}
-		else if (item instanceof ToolItem) {
-			((ToolItem)item).setToolTipText(newValue);
-		}
-		else if (item instanceof TrayItem) {
-			((TrayItem)item).setToolTipText(newValue);
-		}
-		else if (item instanceof TreeColumn) {
-			((TreeColumn)item).setToolTipText(newValue);
-		}
-		
-		if (!newValue.equals(oldValue)) {
-			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
-		}
-	}
-
-	public Object doGetValue() {
-		if (item instanceof CTabItem) {
-			return ((CTabItem)item).getToolTipText();
-		}
-		else if (item instanceof TabItem) {
-			return ((TabItem)item).getToolTipText();
-		}
-		else if (item instanceof TableColumn) {
-			return ((TableColumn)item).getToolTipText();
-		}
-		else if (item instanceof ToolItem) {
-			return ((ToolItem)item).getToolTipText();
-		}
-		else if (item instanceof TrayItem) {
-			return ((TrayItem)item).getToolTipText();
-		}
-		else if (item instanceof TreeColumn) {
-			return ((TreeColumn)item).getToolTipText();
-		}
-		
-		return null;
-	}
-
-	public Object getValueType() {
-		return String.class;
-	}
-
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/LabelObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/LabelObservableValue.java
deleted file mode 100644
index 8dc7915..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/LabelObservableValue.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * @since 3.3
- * 
- */
-public class LabelObservableValue extends AbstractSWTObservableValue {
-
-	private final Label label;
-
-	/**
-	 * @param label
-	 */
-	public LabelObservableValue(Label label) {
-		super(label);
-		this.label = label;
-	}
-	
-	/**
-	 * @param realm
-	 * @param label
-	 */
-	public LabelObservableValue(Realm realm, Label label) {
-		super(realm, label);
-		this.label = label;
-	}
-
-	public void doSetValue(final Object value) {
-		String oldValue = label.getText();
-		String newValue = value == null ? "" : value.toString(); //$NON-NLS-1$
-		label.setText(newValue);
-		
-		if (!newValue.equals(oldValue)) {
-			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
-		}
-	}
-
-	public Object doGetValue() {
-		return label.getText();
-	}
-
-	public Object getValueType() {
-		return String.class;
-	}
-
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ListObservableList.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ListObservableList.java
deleted file mode 100644
index c6537f7..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ListObservableList.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.widgets.List;
-
-/**
- * @since 3.2
- * 
- */
-public class ListObservableList extends SWTObservableList {
-
-	private final List list;
-
-	/**
-	 * @param list
-	 */
-	public ListObservableList(List list) {
-		super(SWTObservables.getRealm(list.getDisplay()));
-		this.list = list;
-	}
-
-	protected int getItemCount() {
-		return list.getItemCount();
-	}
-
-	protected void setItems(String[] newItems) {
-		list.setItems(newItems);
-	}
-
-	protected String[] getItems() {
-		return list.getItems();
-	}
-
-	protected String getItem(int index) {
-		return list.getItem(index);
-	}
-
-	protected void setItem(int index, String string) {
-		list.setItem(index, string);
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ListObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ListObservableValue.java
deleted file mode 100644
index 7a00004..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ListObservableValue.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Ashley Cambrell - bug 198904
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * @since 3.2
- * 
- */
-public class ListObservableValue extends AbstractSWTObservableValue {
-
-	private final List list;
-
-	private boolean updating = false;
-
-	private String currentValue;
-
-	private Listener listener;
-
-	/**
-	 * @param list
-	 */
-	public ListObservableValue(List list) {
-		super(list);
-		this.list = list;
-		this.currentValue = (String) doGetValue();
-
-		if ((list.getStyle() & SWT.MULTI) > 0)
-			throw new IllegalArgumentException(
-					"SWT.SINGLE support only for a List selection"); //$NON-NLS-1$
-
-		listener = new Listener() {
-
-			public void handleEvent(Event event) {
-				if (!updating) {
-					Object oldValue = currentValue;
-					currentValue = (String) doGetValue();
-					fireValueChange(Diffs.createValueDiff(oldValue,
-							currentValue));
-				}
-			}
-
-		};
-		list.addListener(SWT.Selection, listener);
-	}
-
-	public void doSetValue(Object value) {
-		String oldValue = null;
-		if (list.getSelection() != null && list.getSelection().length > 0)
-			oldValue = list.getSelection()[0];
-		try {
-			updating = true;
-			String items[] = list.getItems();
-			int index = -1;
-			if (items != null && value != null) {
-				for (int i = 0; i < items.length; i++) {
-					if (value.equals(items[i])) {
-						index = i;
-						break;
-					}
-				}
-				list.select(index); // -1 will not "unselect"
-			}
-			currentValue = (String) value;
-		} finally {
-			updating = false;
-		}
-		fireValueChange(Diffs.createValueDiff(oldValue, value));
-	}
-
-	public Object doGetValue() {
-		int index = list.getSelectionIndex();
-		if (index >= 0)
-			return list.getItem(index);
-		return null;
-	}
-
-	public Object getValueType() {
-		return String.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-		if (listener != null && !list.isDisposed()) {
-			list.removeListener(SWT.Selection, listener);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ListSingleSelectionObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ListSingleSelectionObservableValue.java
deleted file mode 100644
index 05332de..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ListSingleSelectionObservableValue.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Ashley Cambrell - bug 198904
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.List;
-
-/**
- * @since 1.0
- * 
- */
-public class ListSingleSelectionObservableValue extends
-		SingleSelectionObservableValue {
-
-	private SelectionListener selectionListener;
-
-	/**
-	 * @param combo
-	 */
-	public ListSingleSelectionObservableValue(List combo) {
-		super(combo);
-	}
-
-	private List getList() {
-		return (List) getWidget();
-	}
-
-	protected void doAddSelectionListener(final Runnable runnable) {
-		selectionListener = new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {
-				runnable.run();
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				runnable.run();
-			}
-		};
-		getList().addSelectionListener(selectionListener);
-	}
-
-	protected int doGetSelectionIndex() {
-		return getList().getSelectionIndex();
-	}
-
-	protected void doSetSelectionIndex(int index) {
-		getList().setSelection(index);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-		if (selectionListener != null && !getList().isDisposed()) {
-			getList().removeSelectionListener(selectionListener);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SWTDelayedObservableValueDecorator.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SWTDelayedObservableValueDecorator.java
deleted file mode 100644
index 4a6459b..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SWTDelayedObservableValueDecorator.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Matthew Hall - initial API and implementation (bug 180746)
- * 		Boris Bokowski, IBM - initial API and implementation
- * 		Matthew Hall - bugs 212223, 208332, 245647
- *  	Will Horn - bug 215297
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IVetoableValue;
-import org.eclipse.core.databinding.observable.value.ValueChangingEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * {@link IObservableValue} implementation that wraps an
- * {@link IObservableValue} and delays notification of value change events from
- * the wrapped observable value until a certain time has passed since the last
- * change event, or until a FocusOut event is received from the underlying
- * widget, if any (whichever happens earlier). This class helps to delay
- * validation until the user stops typing. To notify about pending changes, a
- * delayed observable value will fire a stale event when the wrapped observable
- * value fires a change event, but this change is being delayed.
- * 
- * Note that this class will not forward {@link ValueChangingEvent} events from
- * a wrapped {@link IVetoableValue}.
- * 
- * @since 1.2
- */
-public class SWTDelayedObservableValueDecorator extends
-		SWTObservableValueDecorator {
-	private Control control;
-
-	/**
-	 * Constructs a new instance bound to the given
-	 * <code>ISWTObservableValue</code> and configured to fire change events
-	 * once there have been no value changes in the observable for
-	 * <code>delay</code> milliseconds.
-	 * 
-	 * @param decorated
-	 * @param widget
-	 * @throws IllegalArgumentException
-	 *             if <code>updateEventType</code> is an incorrect type.
-	 */
-	public SWTDelayedObservableValueDecorator(IObservableValue decorated,
-			Widget widget) {
-		super(decorated, widget);
-
-		if (widget instanceof Control) {
-			control = (Control) widget;
-			control.addListener(SWT.FocusOut, this);
-		}
-	}
-
-	public void handleEvent(Event event) {
-		// When the control loses focus..
-		if (event.type == SWT.FocusOut && isStale())
-			getValue(); // short-circuit the delay
-
-		super.handleEvent(event);
-	}
-
-	public synchronized void dispose() {
-		if (control != null) {
-			if (!control.isDisposed())
-				control.removeListener(SWT.FocusOut, this);
-			control = null;
-		}
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SWTObservableList.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SWTObservableList.java
deleted file mode 100644
index 499f74e..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SWTObservableList.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 208858
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.core.databinding.BindingException;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.AbstractObservableList;
-
-/**
- * Abstract base class of CComboObservableList, ComboObservableList, and
- * ListObservableList.
- * 
- * @since 3.2
- * 
- */
-public abstract class SWTObservableList extends AbstractObservableList {
-
-	/**
-	 * 
-	 */
-	public SWTObservableList() {
-		super();
-	}
-
-	/**
-	 * @param realm
-	 */
-	public SWTObservableList(Realm realm) {
-		super(realm);
-	}
-
-	public void add(int index, Object element) {
-		int size = doGetSize();
-		if (index < 0 || index > size)
-			index = size;
-		String[] newItems = new String[size + 1];
-		System.arraycopy(getItems(), 0, newItems, 0, index);
-		newItems[index] = (String) element;
-		System.arraycopy(getItems(), index, newItems, index + 1, size - index);
-		setItems(newItems);
-		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				true, element)));
-	}
-
-	public int doGetSize() {
-		return getItemCount();
-	}
-
-	public Object get(int index) {
-		getterCalled();
-		return getItem(index);
-	}
-
-	public Object getElementType() {
-		return String.class;
-	}
-
-	/**
-	 * @param index
-	 * @return the item at the given index
-	 */
-	protected abstract String getItem(int index);
-
-	/**
-	 * @return the item count
-	 */
-	protected abstract int getItemCount();
-
-	/**
-	 * @return the items
-	 */
-	protected abstract String[] getItems();
-
-	private void getterCalled() {
-		ObservableTracker.getterCalled(this);
-	}
-
-	public Object remove(int index) {
-		getterCalled();
-		int size = doGetSize();
-		if (index < 0 || index > size - 1)
-			throw new BindingException(
-					"Request to remove an element out of the collection bounds"); //$NON-NLS-1$
-
-		String[] newItems = new String[size - 1];
-		String oldElement = getItem(index);
-		if (newItems.length > 0) {
-			System.arraycopy(getItems(), 0, newItems, 0, index);
-			if (size - 1 > index) {
-				System.arraycopy(getItems(), index + 1, newItems, index, size
-						- index - 1);
-			}
-		}
-		setItems(newItems);
-		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				false, oldElement)));
-		return oldElement;
-	}
-
-	public Object set(int index, Object element) {
-		String oldElement = getItem(index);
-		setItem(index, (String) element);
-		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(index,
-				false, oldElement), Diffs.createListDiffEntry(index, true,
-				element)));
-		return oldElement;
-	}
-
-	public Object move(int oldIndex, int newIndex) {
-		checkRealm();
-		if (oldIndex == newIndex)
-			return get(oldIndex);
-		int size = doGetSize();
-		if (oldIndex < 0 || oldIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"oldIndex: " + oldIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-		if (newIndex < 0 || newIndex >= size)
-			throw new IndexOutOfBoundsException(
-					"newIndex: " + newIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
-
-		String[] items = getItems();
-		String[] newItems = new String[size];
-		String element = items[oldIndex];
-		if (newItems.length > 0) {
-			System.arraycopy(items, 0, newItems, 0, size);
-			if (oldIndex < newIndex) {
-				System.arraycopy(items, oldIndex + 1, newItems, oldIndex,
-						newIndex - oldIndex);
-			} else {
-				System.arraycopy(items, newIndex, newItems, newIndex + 1,
-						oldIndex - newIndex);
-			}
-			newItems[newIndex] = element;
-		}
-		setItems(newItems);
-		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(oldIndex,
-				false, element), Diffs.createListDiffEntry(newIndex, true,
-				element)));
-		return element;
-	}
-
-	public boolean removeAll(Collection c) {
-		checkRealm();
-		List oldItems = Arrays.asList(getItems());
-		List newItems = new ArrayList(oldItems);
-		boolean removedAll = newItems.removeAll(c);
-		if (removedAll) {
-			setItems((String[]) newItems.toArray(new String[newItems.size()]));
-			fireListChange(Diffs.computeListDiff(oldItems, newItems));
-		}
-		return removedAll;
-	}
-
-	public boolean retainAll(Collection c) {
-		checkRealm();
-		List oldItems = Arrays.asList(getItems());
-		List newItems = new ArrayList(oldItems);
-		boolean retainedAll = newItems.retainAll(c);
-		if (retainedAll) {
-			setItems((String[]) newItems.toArray(new String[newItems.size()]));
-			fireListChange(Diffs.computeListDiff(oldItems, newItems));
-		}
-		return retainedAll;
-	}
-
-	/**
-	 * @param index
-	 * @param string
-	 */
-	protected abstract void setItem(int index, String string);
-
-	/**
-	 * @param newItems
-	 */
-	protected abstract void setItems(String[] newItems);
-
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SWTObservableValueDecorator.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SWTObservableValueDecorator.java
deleted file mode 100644
index 1fb0d04..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SWTObservableValueDecorator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 245647)
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.value.DecoratingObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.swt.ISWTObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * @since 3.3
- * 
- */
-public class SWTObservableValueDecorator extends DecoratingObservableValue
-		implements ISWTObservableValue, Listener {
-	private Widget widget;
-
-	/**
-	 * @param decorated
-	 * @param widget
-	 */
-	public SWTObservableValueDecorator(IObservableValue decorated, Widget widget) {
-		super(decorated, true);
-		this.widget = widget;
-		widget.addListener(SWT.Dispose, this);
-	}
-
-	public void handleEvent(Event event) {
-		if (event.type == SWT.Dispose)
-			dispose();
-	}
-
-	public Widget getWidget() {
-		return widget;
-	}
-
-	public synchronized void dispose() {
-		if (widget != null) {
-			if (!widget.isDisposed())
-				widget.removeListener(SWT.Dispose, this);
-			widget = null;
-		}
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SWTProperties.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SWTProperties.java
deleted file mode 100644
index 2eb5b4d..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SWTProperties.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matt Carter - bug 170668
- *     Brad Reynolds - bug 170848
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-/**
- * Constants used to describe properties of SWT controls.
- * 
- * @since 1.0
- *
- */
-public interface SWTProperties {
-
-	/**
-	 * Applies to Control
-	 */
-	public static final String ENABLED = "enabled"; //$NON-NLS-1$
-	/**
-	 * Applies to Control
-	 */
-	public static final String VISIBLE = "visible"; //$NON-NLS-1$
-	/**
-	 * Applies to Control
-	 */
-	public static final String TOOLTIP_TEXT = "tooltip"; //$NON-NLS-1$	
-	/**
-	 * Applies to
-	 */
-	public static final String ITEMS = "items"; //$NON-NLS-1$
-	/**
-	 * Applies to Spinner
-	 */
-	public static final String MAX = "max"; //$NON-NLS-1$
-	/**
-	 * Applies to Spinner
-	 */
-	public static final String MIN = "min"; //$NON-NLS-1$
-	/**
-	 * Applies to Spinner, Button
-	 */
-	public static final String SELECTION = "selection"; //$NON-NLS-1$
-	/**
-	 * Applies to Spinner, Button
-	 */
-	public static final String SELECTION_INDEX = "index"; //$NON-NLS-1$
-	/**
-	 * Applies to Text, Label, Combo
-	 */
-	public static final String TEXT = "text"; //$NON-NLS-1$
-	
-	/**
-	 * Applies to Label, CLabel.
-	 */
-	public static final String IMAGE = "image"; //$NON-NLS-1$
-	/**
-	 * Applies to Control
-	 */
-	public static final String FOREGROUND = "foreground"; //$NON-NLS-1$
-	/**
-	 * Applies to Control
-	 */
-	public static final String BACKGROUND = "background"; //$NON-NLS-1$
-	/**
-	 * Applies to Control
-	 */
-	public static final String FONT = "font"; //$NON-NLS-1$
-	
-	/**
-	 * Applies to Control 
-	 */
-	public static final String SIZE = "size";  //$NON-NLS-1$
-	
-	/**
-	 * Applies to Control
-	 */
-	public static final String LOCATION = "location"; //$NON-NLS-1$
-	
-	/**
-	 * Applies to Control
-	 */
-	public static final String FOCUS = "focus"; //$NON-NLS-1$
-	
-	/**
-	 * Applies to Control
-	 */
-	public static final String BOUNDS = "bounds"; //$NON-NLS-1$
-
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ScaleObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ScaleObservableValue.java
deleted file mode 100644
index 8424662..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ScaleObservableValue.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Peter Centgraf - bug 175763
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Scale;
-
-/**
- * @since 1.0
- * 
- */
-public class ScaleObservableValue extends AbstractSWTObservableValue {
-
-	private final Scale scale;
-
-	private final String attribute;
-
-	private boolean updating = false;
-
-	private int currentSelection;
-	
-	private SelectionListener listener;
-
-	/**
-	 * @param scale
-	 * @param attribute
-	 */
-	public ScaleObservableValue(Scale scale, String attribute) {
-		super(scale);
-		this.scale = scale;
-		this.attribute = attribute;
-		init();
-	}
-	
-	/**
-	 * @param realm
-	 * @param scale
-	 * @param attribute
-	 */
-	public ScaleObservableValue(Realm realm, Scale scale, String attribute) {
-		super(realm, scale);
-		this.scale = scale;
-		this.attribute = attribute;
-		init();
-	}
-	
-	private void init() {		
-		if (attribute.equals(SWTProperties.SELECTION)) {
-			currentSelection = scale.getSelection();
-			scale.addSelectionListener(listener = new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					if (!updating) {
-						int newSelection = ScaleObservableValue.this.scale
-						.getSelection();
-						notifyIfChanged(currentSelection, newSelection);
-						currentSelection = newSelection;
-					}
-				}
-			});
-		} else if (!attribute.equals(SWTProperties.MIN)
-				&& !attribute.equals(SWTProperties.MAX)) {
-			throw new IllegalArgumentException(
-					"Attribute name not valid: " + attribute); //$NON-NLS-1$
-		}
-	}
-
-	public void doSetValue(final Object value) {
-		int oldValue;
-		int newValue;
-		try {
-			updating = true;
-			newValue = ((Integer) value).intValue();
-			if (attribute.equals(SWTProperties.SELECTION)) {
-				oldValue = scale.getSelection();
-				scale.setSelection(newValue);
-				currentSelection = newValue;
-			} else if (attribute.equals(SWTProperties.MIN)) {
-				oldValue = scale.getMinimum();
-				scale.setMinimum(newValue);
-			} else if (attribute.equals(SWTProperties.MAX)) {
-				oldValue = scale.getMaximum();
-				scale.setMaximum(newValue);
-			} else {
-				Assert.isTrue(false, "invalid attribute name:" + attribute); //$NON-NLS-1$
-				return;
-			}
-			
-			notifyIfChanged(oldValue, newValue);
-		} finally {
-			updating = false;
-		}
-	}
-
-	public Object doGetValue() {
-		int value = 0;
-		if (attribute.equals(SWTProperties.SELECTION)) {
-			value = scale.getSelection();
-		} else if (attribute.equals(SWTProperties.MIN)) {
-			value = scale.getMinimum();
-		} else if (attribute.equals(SWTProperties.MAX)) {
-			value = scale.getMaximum();
-		}
-		return new Integer(value);
-	}
-
-	public Object getValueType() {
-		return Integer.TYPE;
-	}
-
-	/**
-	 * @return attribute being observed
-	 */
-	public String getAttribute() {
-		return attribute;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-		
-		if (listener != null && !scale.isDisposed()) {
-			scale.removeSelectionListener(listener);
-		}
-		listener = null;
-	}
-	
-	private void notifyIfChanged(int oldValue, int newValue) {
-		if (oldValue != newValue) {
-			fireValueChange(Diffs.createValueDiff(new Integer(oldValue),
-					new Integer(newValue)));
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ShellObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ShellObservableValue.java
deleted file mode 100644
index a38091e..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/ShellObservableValue.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 207844)
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 212235
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * An {@link IObservableValue} that tracks the text of a Shell.
- * 
- * @since 1.2
- */
-public class ShellObservableValue extends AbstractSWTObservableValue {
-
-	private final Shell shell;
-
-	/**
-	 * Constructs a ShellObservableValue which tracks the text of the given
-	 * Shell.
-	 * 
-	 * @param shell
-	 *            the shell to track
-	 */
-	public ShellObservableValue(Shell shell) {
-		super(shell);
-		this.shell = shell;
-	}
-
-	/**
-	 * Constructs a ShellObservableValue belonging to the given realm, which
-	 * tracks the text of the given shell.
-	 * 
-	 * @param realm
-	 *            the realm of the constructed observable
-	 * @param shell
-	 *            the shell to track
-	 */
-	public ShellObservableValue(Realm realm, Shell shell) {
-		super(realm, shell);
-		this.shell = shell;
-	}
-
-	protected void doSetValue(final Object value) {
-		String oldValue = shell.getText();
-		String newValue = value == null ? "" : value.toString(); //$NON-NLS-1$
-		shell.setText(newValue);
-
-		if (!newValue.equals(oldValue)) {
-			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
-		}
-	}
-
-	protected Object doGetValue() {
-		return shell.getText();
-	}
-
-	public Object getValueType() {
-		return String.class;
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SingleSelectionObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SingleSelectionObservableValue.java
deleted file mode 100644
index 1f69137..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SingleSelectionObservableValue.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * @since 1.0
- * 
- */
-abstract public class SingleSelectionObservableValue extends
-		AbstractSWTObservableValue {
-
-	private boolean updating = false;
-
-	private int currentSelection;
-
-	/**
-	 * @param control
-	 *            the control
-	 */
-	public SingleSelectionObservableValue(Control control) {
-		super(control);
-		init();
-	}
-	
-	/**
-	 * @param realm
-	 * @param control
-	 */
-	public SingleSelectionObservableValue(Realm realm, Control control) {
-		super(realm, control);
-		init();
-	}
-	
-	private void init() {		
-		currentSelection = doGetSelectionIndex();
-		doAddSelectionListener(new Runnable(){
-			public void run() {
-				if (!updating) {
-					int newSelection = doGetSelectionIndex();
-					notifyIfChanged(currentSelection, newSelection);
-					currentSelection = newSelection;
-				}
-			}
-		});
-	}
-
-	/**
-	 * @param runnable
-	 */
-	protected abstract void doAddSelectionListener(Runnable runnable);
-
-	public void doSetValue(Object value) {
-		try {
-			updating = true;
-			int intValue = ((Integer) value).intValue();
-			doSetSelectionIndex(intValue);
-			notifyIfChanged(currentSelection, intValue);
-			currentSelection = intValue;
-		} finally {
-			updating = false;
-		}
-	}
-
-	/**
-	 * @param intValue
-	 *            the selection index
-	 */
-	protected abstract void doSetSelectionIndex(int intValue);
-
-	public Object doGetValue() {
-		return new Integer(doGetSelectionIndex());
-	}
-
-	/**
-	 * @return the selection index
-	 */
-	protected abstract int doGetSelectionIndex();
-
-	public Object getValueType() {
-		return Integer.TYPE;
-	}
-
-	private void notifyIfChanged(int oldValue, int newValue) {
-		if (oldValue != newValue) {
-			fireValueChange(Diffs.createValueDiff(new Integer(
-					oldValue), new Integer(newValue)));
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SpinnerObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SpinnerObservableValue.java
deleted file mode 100644
index 89c34b9..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/SpinnerObservableValue.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Ashley Cambrell - bug 198904
- *     Matthew Hall - bug 118516
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Spinner;
-
-/**
- * @since 1.0
- * 
- */
-public class SpinnerObservableValue extends AbstractSWTObservableValue {
-
-	private final Spinner spinner;
-
-	private final String attribute;
-
-	private boolean updating = false;
-
-	private int currentSelection;
-
-	private ModifyListener modifyListener;
-
-	/**
-	 * @param spinner
-	 * @param attribute
-	 */
-	public SpinnerObservableValue(Spinner spinner, String attribute) {
-		super(spinner);
-		this.spinner = spinner;
-		this.attribute = attribute;
-		init();
-	}
-	
-	/**
-	 * @param realm
-	 * @param spinner
-	 * @param attribute
-	 */
-	public SpinnerObservableValue(Realm realm, Spinner spinner, String attribute) {
-		super(realm, spinner);
-		this.spinner = spinner;
-		this.attribute = attribute;
-		init();
-	}
-	
-	private void init() {		
-		if (attribute.equals(SWTProperties.SELECTION)) {
-			currentSelection = spinner.getSelection();
-			modifyListener = new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					if (!updating) {
-						int newSelection = SpinnerObservableValue.this.spinner
-						.getSelection();
-						notifyIfChanged(currentSelection, newSelection);
-						currentSelection = newSelection;
-					}
-				}
-			};
-			spinner.addModifyListener(modifyListener);
-		} else if (!attribute.equals(SWTProperties.MIN)
-				&& !attribute.equals(SWTProperties.MAX)) {
-			throw new IllegalArgumentException(
-					"Attribute name not valid: " + attribute); //$NON-NLS-1$
-		}
-	}
-
-	public void doSetValue(final Object value) {
-		int oldValue;
-		int newValue;
-		try {
-			updating = true;
-			newValue = ((Integer) value).intValue();
-			if (attribute.equals(SWTProperties.SELECTION)) {
-				oldValue = spinner.getSelection();
-				spinner.setSelection(newValue);
-				currentSelection = newValue;
-			} else if (attribute.equals(SWTProperties.MIN)) {
-				oldValue = spinner.getMinimum();
-				spinner.setMinimum(newValue);
-			} else if (attribute.equals(SWTProperties.MAX)) {
-				oldValue = spinner.getMaximum();
-				spinner.setMaximum(newValue);
-			} else {
-				Assert.isTrue(false, "invalid attribute name:" + attribute); //$NON-NLS-1$
-				return;
-			}
-			notifyIfChanged(oldValue, newValue);
-		} finally {
-			updating = false;
-		}
-	}
-
-	public Object doGetValue() {
-		int value = 0;
-		if (attribute.equals(SWTProperties.SELECTION)) {
-			value = spinner.getSelection();
-		} else if (attribute.equals(SWTProperties.MIN)) {
-			value = spinner.getMinimum();
-		} else if (attribute.equals(SWTProperties.MAX)) {
-			value = spinner.getMaximum();
-		}
-		return new Integer(value);
-	}
-
-	public Object getValueType() {
-		return Integer.TYPE;
-	}
-
-	/**
-	 * @return attribute being observed
-	 */
-	public String getAttribute() {
-		return attribute;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-		if (modifyListener != null && !spinner.isDisposed()) {
-			spinner.removeModifyListener(modifyListener);
-		}
-	}
-	
-	private void notifyIfChanged(int oldValue, int newValue) {
-		if (oldValue != newValue) {
-			fireValueChange(Diffs.createValueDiff(new Integer(oldValue),
-					new Integer(newValue)));
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/TableSingleSelectionObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/TableSingleSelectionObservableValue.java
deleted file mode 100644
index dd7d12c..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/TableSingleSelectionObservableValue.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *     Ashley Cambrell - bug 198904
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Table;
-
-/**
- * @since 1.0
- * 
- */
-public class TableSingleSelectionObservableValue extends
-		SingleSelectionObservableValue {
-
-	private SelectionListener selectionListener;
-
-	/**
-	 * @param table
-	 */
-	public TableSingleSelectionObservableValue(Table table) {
-		super(table);
-	}
-	
-	/**
-	 * @param realm
-	 * @param table
-	 */
-	public TableSingleSelectionObservableValue(Realm realm, Table table) {
-		super(realm, table);
-	}
-
-	private Table getTable() {
-		return (Table) getWidget();
-	}
-
-	protected void doAddSelectionListener(final Runnable runnable) {
-		selectionListener = new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {
-				runnable.run();
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				runnable.run();
-			}
-		};
-		getTable().addSelectionListener(selectionListener);
-	}
-
-	protected int doGetSelectionIndex() {
-		return getTable().getSelectionIndex();
-	}
-
-	protected void doSetSelectionIndex(int index) {
-		getTable().setSelection(index);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
-	 */
-	public synchronized void dispose() {
-		super.dispose();
-		if (selectionListener != null && !getTable().isDisposed()) {
-			getTable().removeSelectionListener(selectionListener);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/TextEditableObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/TextEditableObservableValue.java
deleted file mode 100644
index 3457c0a..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/TextEditableObservableValue.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Observable value for the editable property of a Text.
- * 
- * @since 1.1
- */
-public class TextEditableObservableValue extends AbstractSWTObservableValue {
-	private Text text;
-	
-	/**
-	 * @param text
-	 */
-	public TextEditableObservableValue(Text text) {
-		super(text);	
-		this.text = text;
-	}
-	
-	/**
-	 * @param realm
-	 * @param text
-	 */
-	public TextEditableObservableValue(Realm realm, Text text) {
-		super(realm, text);
-		this.text = text;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#doGetValue()
-	 */
-	protected Object doGetValue() {
-		return (text.getEditable()) ? Boolean.TRUE : Boolean.FALSE;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.databinding.observable.value.IObservableValue#getValueType()
-	 */
-	public Object getValueType() {
-		return Boolean.TYPE;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#doSetValue(java.lang.Object)
-	 */
-	protected void doSetValue(Object value) {
-		if (value == null) {
-			throw new IllegalArgumentException("Parameter value was null."); //$NON-NLS-1$
-		}
-		
-		Boolean oldValue = new Boolean(text.getEditable());
-		Boolean newValue = (Boolean) value;
-		
-		text.setEditable(newValue.booleanValue());
-		
-		if (!oldValue.equals(newValue)) {
-			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/TextObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/TextObservableValue.java
deleted file mode 100644
index 2f6caa1..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/swt/TextObservableValue.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds (bug 135446)
- *     Brad Reynolds - bug 164653
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTVetoableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.events.VerifyListener;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * {@link IObservable} implementation that wraps a {@link Text} widget. The time
- * at which listeners should be notified about changes to the text is specified
- * on construction.
- * 
- * <dl>
- * <dt>Events:</dt>
- * <dd> If the update event type (specified on construction) is
- * <code>SWT.Modify</code> a value change event will be fired on every key
- * stroke. If the update event type is <code>SWT.FocusOut</code> a value
- * change event will be fired on focus out. When in either mode if the user is
- * entering text and presses [Escape] the value will be reverted back to the
- * last value set using doSetValue(). Regardless of the update event type a
- * value changing event will fire on verify to enable vetoing of changes.</dd>
- * </dl>
- * 
- * @since 1.0
- */
-public class TextObservableValue extends AbstractSWTVetoableValue {
-
-	/**
-	 * {@link Text} widget that this is being observed.
-	 */
-	private final Text text;
-
-	/**
-	 * Flag to track when the model is updating the widget. When
-	 * <code>true</code> the handlers for the SWT events should not process
-	 * the event as this would cause an infinite loop.
-	 */
-	private boolean updating = false;
-
-	/**
-	 * SWT event that on firing this observable will fire change events to its
-	 * listeners.
-	 */
-	private final int updateEventType;
-
-	/**
-	 * Valid types for the {@link #updateEventType}.
-	 */
-	private static final int[] validUpdateEventTypes = new int[] { SWT.Modify,
-			SWT.FocusOut, SWT.None };
-
-	/**
-	 * Previous value of the Text.
-	 */
-	private String oldValue;
-
-	private Listener updateListener = new Listener() {
-		public void handleEvent(Event event) {
-			if (!updating) {
-				String newValue = text.getText();
-
-				if (!newValue.equals(oldValue)) {
-					fireValueChange(Diffs.createValueDiff(oldValue, newValue));					
-					oldValue = newValue;
-				}
-			}
-		}
-	};
-
-	private VerifyListener verifyListener;
-
-	/**
-	 * Constructs a new instance bound to the given <code>text</code> widget
-	 * and configured to fire change events to its listeners at the time of the
-	 * <code>updateEventType</code>.
-	 * 
-	 * @param text
-	 * @param updateEventType
-	 *            SWT event constant as to what SWT event to update the model in
-	 *            response to. Appropriate values are: <code>SWT.Modify</code>,
-	 *            <code>SWT.FocusOut</code>, <code>SWT.None</code>.
-	 * @throws IllegalArgumentException
-	 *             if <code>updateEventType</code> is an incorrect type.
-	 */
-	public TextObservableValue(final Text text, int updateEventType) {
-		this(SWTObservables.getRealm(text.getDisplay()), text, updateEventType);
-	}
-	
-	/**
-	 * Constructs a new instance.
-	 * 
-	 * @param realm can not be <code>null</code>
-	 * @param text
-	 * @param updateEventType
-	 */
-	public TextObservableValue(final Realm realm, Text text, int updateEventType) {
-		super(realm, text);
-		
-		boolean eventValid = false;
-		for (int i = 0; !eventValid && i < validUpdateEventTypes.length; i++) {
-			eventValid = (updateEventType == validUpdateEventTypes[i]);
-		}
-		if (!eventValid) {
-			throw new IllegalArgumentException(
-					"UpdateEventType [" + updateEventType + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
-		}
-		this.text = text;
-		this.updateEventType = updateEventType;
-		if (updateEventType != SWT.None) {
-			text.addListener(updateEventType, updateListener);
-		}
-		
-		oldValue = text.getText();
-		
-		verifyListener = new VerifyListener() {
-			public void verifyText(VerifyEvent e) {
-				if (!updating) {
-					String currentText = TextObservableValue.this.text
-							.getText();
-					String newText = currentText.substring(0, e.start) + e.text
-							+ currentText.substring(e.end);
-					if (!fireValueChanging(Diffs.createValueDiff(currentText,
-							newText))) {
-						e.doit = false;
-					}
-				}
-			}
-		};
-		text.addVerifyListener(verifyListener);
-	}
-
-	/**
-	 * Sets the bound {@link Text Text's} text to the passed <code>value</code>.
-	 * 
-	 * @param value
-	 *            new value, String expected
-	 * @see org.eclipse.core.databinding.observable.value.AbstractVetoableValue#doSetApprovedValue(java.lang.Object)
-	 * @throws ClassCastException
-	 *             if the value is anything other than a String
-	 */
-	protected void doSetApprovedValue(final Object value) {
-		try {
-			updating = true;
-			text.setText(value == null ? "" : value.toString()); //$NON-NLS-1$
-			oldValue = text.getText();
-		} finally {
-			updating = false;
-		}
-	}
-
-	/**
-	 * Returns the current value of the {@link Text}.
-	 * 
-	 * @see org.eclipse.core.databinding.observable.value.AbstractVetoableValue#doGetValue()
-	 */
-	public Object doGetValue() {
-		return oldValue = text.getText();
-	}
-
-	/**
-	 * Returns the type of the value from {@link #doGetValue()}, i.e.
-	 * String.class
-	 * 
-	 * @see org.eclipse.core.databinding.observable.value.IObservableValue#getValueType()
-	 */
-	public Object getValueType() {
-		return String.class;
-	}
-
-	public synchronized void dispose() {
-		if (!text.isDisposed()) {
-			if (updateEventType != SWT.None) {
-				text.removeListener(updateEventType, updateListener);
-			}
-			text.removeVerifyListener(verifyListener);
-		}
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/CheckableCheckedElementsObservableSet.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/CheckableCheckedElementsObservableSet.java
deleted file mode 100644
index da84d94..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/CheckableCheckedElementsObservableSet.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 124684)
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.AbstractObservableSet;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ICheckable;
-
-/**
- * 
- * @since 1.2
- */
-public class CheckableCheckedElementsObservableSet extends
-		AbstractObservableSet {
-	private ICheckable checkable;
-	private Set wrappedSet;
-	private Object elementType;
-	private ICheckStateListener listener;
-
-	/**
-	 * Constructs a new instance on the given realm and checkable.
-	 * 
-	 * @param realm
-	 *            the observable's realm
-	 * @param checkable
-	 *            the ICheckable to track
-	 * @param elementType
-	 *            type of elements in the set
-	 */
-	public CheckableCheckedElementsObservableSet(Realm realm,
-			ICheckable checkable, Object elementType) {
-		this(realm, checkable, elementType, new HashSet());
-	}
-
-	/**
-	 * Constructs a new instance of the given realm, and checkable,
-	 * 
-	 * @param realm
-	 *            the observable's realm
-	 * @param checkable
-	 *            the ICheckable to track
-	 * @param elementType
-	 *            type of elements in the set
-	 * @param wrappedSet
-	 *            the set being wrapped
-	 */
-	public CheckableCheckedElementsObservableSet(Realm realm,
-			ICheckable checkable, Object elementType, final Set wrappedSet) {
-		super(realm);
-		Assert.isNotNull(checkable, "Checkable cannot be null"); //$NON-NLS-1$
-		Assert.isNotNull(wrappedSet, "Wrapped set cannot be null"); //$NON-NLS-1$
-		this.checkable = checkable;
-		this.wrappedSet = wrappedSet;
-		this.elementType = elementType;
-
-		listener = new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				Object element = event.getElement();
-				if (event.getChecked()) {
-					if (wrappedSet.add(element))
-						fireSetChange(Diffs.createSetDiff(Collections
-								.singleton(element), Collections.EMPTY_SET));
-				} else {
-					if (wrappedSet.remove(element))
-						fireSetChange(Diffs.createSetDiff(
-								Collections.EMPTY_SET, Collections
-										.singleton(element)));
-				}
-			}
-		};
-		checkable.addCheckStateListener(listener);
-	}
-
-	protected Set getWrappedSet() {
-		return wrappedSet;
-	}
-
-	Set createDiffSet() {
-		return new HashSet();
-	}
-
-	public Object getElementType() {
-		return elementType;
-	}
-
-	public boolean add(Object o) {
-		getterCalled();
-		boolean added = wrappedSet.add(o);
-		if (added) {
-			checkable.setChecked(o, true);
-			fireSetChange(Diffs.createSetDiff(Collections.singleton(o),
-					Collections.EMPTY_SET));
-		}
-		return added;
-	}
-
-	public boolean remove(Object o) {
-		getterCalled();
-		boolean removed = wrappedSet.remove(o);
-		if (removed) {
-			checkable.setChecked(o, false);
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET,
-					Collections.singleton(o)));
-		}
-		return removed;
-	}
-
-	public boolean addAll(Collection c) {
-		getterCalled();
-		Set additions = createDiffSet();
-		for (Iterator iterator = c.iterator(); iterator.hasNext();) {
-			Object element = iterator.next();
-			if (wrappedSet.add(element)) {
-				checkable.setChecked(element, true);
-				additions.add(element);
-			}
-		}
-		boolean changed = !additions.isEmpty();
-		if (changed)
-			fireSetChange(Diffs.createSetDiff(additions, Collections.EMPTY_SET));
-		return changed;
-	}
-
-	public boolean removeAll(Collection c) {
-		getterCalled();
-		Set removals = createDiffSet();
-		for (Iterator iterator = c.iterator(); iterator.hasNext();) {
-			Object element = iterator.next();
-			if (wrappedSet.remove(element)) {
-				checkable.setChecked(element, false);
-				removals.add(element);
-			}
-		}
-		boolean changed = !removals.isEmpty();
-		if (changed)
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removals));
-		return changed;
-	}
-
-	public boolean retainAll(Collection c) {
-		getterCalled();
-
-		// To ensure that elements are compared correctly, e.g. ViewerElementSet
-		Set toRetain = createDiffSet();
-		toRetain.addAll(c);
-
-		Set removals = createDiffSet();
-		for (Iterator iterator = wrappedSet.iterator(); iterator.hasNext();) {
-			Object element = iterator.next();
-			if (!toRetain.contains(element)) {
-				iterator.remove();
-				checkable.setChecked(element, false);
-				removals.add(element);
-			}
-		}
-		boolean changed = !removals.isEmpty();
-		if (changed)
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removals));
-		return changed;
-	}
-
-	public void clear() {
-		removeAll(wrappedSet);
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final Iterator wrappedIterator = wrappedSet.iterator();
-		return new Iterator() {
-			private Object last = null;
-
-			public boolean hasNext() {
-				getterCalled();
-				return wrappedIterator.hasNext();
-			}
-
-			public Object next() {
-				getterCalled();
-				return last = wrappedIterator.next();
-			}
-
-			public void remove() {
-				getterCalled();
-				wrappedIterator.remove();
-				checkable.setChecked(last, false);
-				fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET,
-						Collections.singleton(last)));
-			}
-		};
-	}
-
-	public synchronized void dispose() {
-		if (checkable != null) {
-			checkable.removeCheckStateListener(listener);
-			checkable = null;
-			listener = null;
-		}
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/CheckboxViewerCheckedElementsObservableSet.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/CheckboxViewerCheckedElementsObservableSet.java
deleted file mode 100644
index eba454c..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/CheckboxViewerCheckedElementsObservableSet.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 124684)
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import java.util.Arrays;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.databinding.viewers.IViewerObservableSet;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * An observable set that tracks the checked elements in a CheckboxTableViewer
- * or CheckboxTreeViewer
- * 
- * @since 1.2
- */
-public class CheckboxViewerCheckedElementsObservableSet extends
-		CheckableCheckedElementsObservableSet implements IViewerObservableSet {
-	private StructuredViewer viewer;
-
-	/**
-	 * Constructs a new instance on the given realm and checkable.
-	 * 
-	 * @param realm
-	 *            the observable's realm
-	 * @param viewer
-	 *            the CheckboxTableViewer viewer to track.
-	 * @param elementType
-	 *            type of elements in the set
-	 */
-	public CheckboxViewerCheckedElementsObservableSet(Realm realm,
-			CheckboxTableViewer viewer, Object elementType) {
-		super(realm, viewer, elementType, createElementSet(viewer));
-		this.viewer = viewer;
-	}
-
-	/**
-	 * Constructs a new instance on the given realm and checkable.
-	 * 
-	 * @param realm
-	 *            the observable's realm
-	 * @param viewer
-	 *            the CheckboxTreeViewer viewer to track.
-	 * @param elementType
-	 *            type of elements in the set
-	 */
-	public CheckboxViewerCheckedElementsObservableSet(Realm realm,
-			CheckboxTreeViewer viewer, Object elementType) {
-		super(realm, viewer, elementType, createElementSet(viewer));
-		this.viewer = viewer;
-	}
-
-	Set createDiffSet() {
-		return ViewerElementSet.withComparer(viewer.getComparer());
-	}
-
-	private static Set createElementSet(CheckboxTableViewer viewer) {
-		Set set = ViewerElementSet.withComparer(viewer.getComparer());
-		set.addAll(Arrays.asList(viewer.getCheckedElements()));
-		return set;
-	}
-
-	private static Set createElementSet(CheckboxTreeViewer viewer) {
-		Set set = ViewerElementSet.withComparer(viewer.getComparer());
-		set.addAll(Arrays.asList(viewer.getCheckedElements()));
-		return set;
-	}
-
-	public Viewer getViewer() {
-		return viewer;
-	}
-
-	public synchronized void dispose() {
-		viewer = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/LeafNodesSet.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/LeafNodesSet.java
deleted file mode 100644
index 4ffa912..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/LeafNodesSet.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.viewers;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.set.AbstractObservableSet;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-import org.eclipse.core.databinding.observable.set.SetDiff;
-import org.eclipse.core.internal.databinding.observable.tree.IUnorderedTreeProvider;
-import org.eclipse.core.internal.databinding.observable.tree.TreePath;
-
-/**
- * This set consists of all leaf nodes from the given tree (that is, all nodes
- * for which ITreeProvider.createChildSet returns null).
- */
-public class LeafNodesSet extends AbstractObservableSet {
-
-	private HashSet leafNodes = new HashSet();
-
-	private HashMap mapElementsOntoNodeInfo = new HashMap();
-
-	private IUnorderedTreeProvider tree;
-
-	private Object input;
-
-	private int staleCount = 0;
-
-	private class NodeInfo implements IStaleListener, ISetChangeListener {
-		// Number of times the element occurs in the tree
-		private int count;
-
-		// Element
-		private TreePath treePath;
-
-		// Children set (or null if this is a leaf node)
-		IObservableSet children;
-
-		private boolean wasStale = false;
-
-		/**
-		 * @param treePath
-		 */
-		public NodeInfo(TreePath treePath) {
-			this.treePath = treePath;
-			children = tree.createChildSet(this.treePath);
-			if (children != null) {
-				children.addStaleListener(this);
-				children.addSetChangeListener(this);
-			}
-			count = 1;
-		}
-
-		public void handleSetChange(SetChangeEvent event) {
-			processDiff(treePath, event.diff);
-		}
-
-		public void handleStale(StaleEvent event) {
-			if (wasStale != children.isStale()) {
-				if (wasStale) {
-					staleCount--;
-				} else {
-					staleCount++;
-				}
-				wasStale = !wasStale;
-			}
-			setStale(staleCount > 0);
-		}
-
-		/**
-		 * 
-		 */
-		public void dispose() {
-			if (children != null) {
-				children.dispose();
-				children = null;
-				if (wasStale) {
-					staleCount--;
-				}
-			}
-		}
-	}
-
-	/**
-	 * Creates a set that will contain the leaf nodes from the given tree
-	 * 
-	 * @param tree
-	 *            tree whose leaf nodes will be computed
-	 */
-	public LeafNodesSet(IUnorderedTreeProvider tree) {
-		this(null, tree);
-	}
-
-	/**
-	 * Creates a set that will contain the leaf nodes from the given tree, and
-	 * sets the root of the tree to the given element.
-	 * 
-	 * @param initialInput
-	 *            root of the tree
-	 * @param tree
-	 *            tree whose leaf nodes will be computed
-	 */
-	public LeafNodesSet(Object initialInput, IUnorderedTreeProvider tree) {
-		super(tree.getRealm());
-		this.tree = tree;
-		if (initialInput != null) {
-			setInput(initialInput);
-		}
-	}
-
-	private void processDiff(TreePath treePath, SetDiff diff) {
-		Set removals = new HashSet();
-		HashSet additions = new HashSet();
-
-		for (Iterator iter = diff.getRemovals().iterator(); iter.hasNext();) {
-			Object next = iter.next();
-
-			elementRemoved(treePath.createChildPath(next), removals);
-		}
-
-		for (Iterator iter = diff.getAdditions().iterator(); iter.hasNext();) {
-			Object next = iter.next();
-
-			elementDiscovered(treePath.createChildPath(next), additions);
-		}
-
-		HashSet newRemovals = new HashSet();
-		newRemovals.addAll(removals);
-		newRemovals.removeAll(additions);
-
-		HashSet newAdditions = new HashSet();
-		newAdditions.addAll(additions);
-		newAdditions.removeAll(removals);
-
-		leafNodes.addAll(newAdditions);
-		leafNodes.removeAll(newRemovals);
-
-		if (!newAdditions.isEmpty() || !newRemovals.isEmpty()) {
-			setStale(staleCount > 0);
-			fireSetChange(Diffs.createSetDiff(newAdditions, newRemovals));
-		}
-	}
-
-	/**
-	 * Sets the root of the tree to the given element.
-	 * 
-	 * @param input
-	 *            new root of the tree
-	 */
-	public void setInput(Object input) {
-		Set removals = Collections.EMPTY_SET;
-		Set additions = Collections.EMPTY_SET;
-		if (this.input != null) {
-			removals = Collections.singleton(this.input);
-		} else if (input != null) {
-			additions = Collections.singleton(input);
-		}
-		this.input = input;
-		processDiff(TreePath.EMPTY, Diffs.createSetDiff(additions, removals));
-	}
-
-	/**
-	 * Called when an element is removed from the tree. The given HashSet will
-	 * be filled in with all removed leaf nodes.
-	 * 
-	 * @param treePath
-	 * @param removals
-	 */
-	private void elementRemoved(TreePath treePath, Set removals) {
-		NodeInfo newNode = (NodeInfo) mapElementsOntoNodeInfo.get(treePath);
-
-		if (newNode != null) {
-			newNode = new NodeInfo(treePath);
-			newNode.count--;
-			if (newNode.count == 0) {
-				mapElementsOntoNodeInfo.remove(treePath);
-				if (newNode.children != null) {
-					for (Iterator iter = newNode.children.iterator(); iter
-							.hasNext();) {
-						Object next = iter.next();
-
-						elementRemoved(treePath.createChildPath(next), removals);
-					}
-					newNode.children.dispose();
-				} else {
-					removals.add(treePath);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Called when a new element is discovered in the tree. The given HashSet
-	 * will be filled in with all newly discovered leaf nodes.
-	 * 
-	 * @param treePath
-	 * @param additions
-	 */
-	private void elementDiscovered(TreePath treePath, HashSet additions) {
-		NodeInfo newNode = (NodeInfo) mapElementsOntoNodeInfo.get(treePath);
-
-		if (newNode == null) {
-			newNode = new NodeInfo(treePath);
-			mapElementsOntoNodeInfo.put(treePath, newNode);
-			if (newNode.children != null) {
-				for (Iterator iter = newNode.children.iterator(); iter
-						.hasNext();) {
-					Object next = iter.next();
-
-					elementDiscovered(treePath.createChildPath(next), additions);
-				}
-			} else {
-				additions.add(treePath);
-			}
-		} else {
-			// If this node was already known, increment the reference count.
-			newNode.count++;
-		}
-	}
-
-	protected Set getWrappedSet() {
-		return leafNodes;
-	}
-
-	public Object getElementType() {
-		return Object.class;
-	}
-
-	public synchronized void dispose() {
-		for (Iterator iter = mapElementsOntoNodeInfo.values().iterator(); iter
-				.hasNext();) {
-			NodeInfo next = (NodeInfo) iter.next();
-
-			if (next.children != null) {
-				next.dispose();
-			}
-		}
-
-		mapElementsOntoNodeInfo.clear();
-		leafNodes.clear();
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ListViewerUpdater.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ListViewerUpdater.java
deleted file mode 100644
index 015669d..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ListViewerUpdater.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 215531)
- *     Matthew Hall - bug 226765
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import org.eclipse.jface.viewers.AbstractListViewer;
-
-/**
- * NON-API - A {@link ViewerUpdater} that updates {@link AbstractListViewer}
- * instances.
- * 
- * @since 1.2
- */
-class ListViewerUpdater extends ViewerUpdater {
-	private AbstractListViewer viewer;
-
-	ListViewerUpdater(AbstractListViewer viewer) {
-		super(viewer);
-		this.viewer = viewer;
-	}
-
-	public void insert(Object element, int position) {
-		viewer.insert(element, position);
-	}
-
-	public void remove(Object element, int position) {
-		viewer.remove(element);
-	}
-
-	public void add(Object[] elements) {
-		viewer.add(elements);
-	}
-
-	public void remove(Object[] elements) {
-		viewer.remove(elements);
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ObservableCollectionContentProvider.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ObservableCollectionContentProvider.java
deleted file mode 100644
index 18ab455..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ObservableCollectionContentProvider.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 215531)
- *     Matthew Hall - bugs 226765, 222991
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.viewers.AbstractListViewer;
-import org.eclipse.jface.viewers.AbstractTableViewer;
-import org.eclipse.jface.viewers.IElementComparer;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * NON-API - Abstract base class for content providers where the viewer input is
- * expected to be an {@link IObservableCollection}.
- * 
- * @since 1.2
- */
-public abstract class ObservableCollectionContentProvider implements
-		IStructuredContentProvider {
-	private Display display;
-
-	private IObservableValue viewerObservable;
-
-	/**
-	 * Element comparer used by the viewer (may be null).
-	 */
-	protected IElementComparer comparer;
-
-	private IObservableFactory elementSetFactory;
-
-	/**
-	 * Interface for sending updates to the viewer.
-	 */
-	protected ViewerUpdater viewerUpdater;
-
-	/**
-	 * Observable set of all elements known to the content provider. Subclasses
-	 * must add new elements to this set <b>before</b> adding them to the
-	 * viewer, and must remove old elements from this set <b>after</b> removing
-	 * them from the viewer.
-	 */
-	protected IObservableSet knownElements;
-	private IObservableSet unmodifiableKnownElements;
-
-	/**
-	 * Observable set of known elements which have been realized in the viewer.
-	 * Subclasses must add new elements to this set <b>after</b> adding them to
-	 * the viewer, and must remove old elements from this set <b>before</b>
-	 * removing them from the viewer.
-	 */
-	protected IObservableSet realizedElements;
-	private IObservableSet unmodifiableRealizedElements;
-
-	private IObservableCollection observableCollection;
-
-	/**
-	 * Constructs an ObservableCollectionContentProvider
-	 */
-	protected ObservableCollectionContentProvider() {
-		display = Display.getDefault();
-		viewerObservable = new WritableValue(SWTObservables.getRealm(display));
-		viewerUpdater = null;
-
-		elementSetFactory = new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				IElementComparer comparer = null;
-				if (target instanceof StructuredViewer)
-					comparer = ((StructuredViewer) target).getComparer();
-				return ObservableViewerElementSet.withComparer(SWTObservables
-						.getRealm(display), null, comparer);
-			}
-		};
-		knownElements = MasterDetailObservables.detailSet(viewerObservable,
-				elementSetFactory, null);
-		unmodifiableKnownElements = Observables
-				.unmodifiableObservableSet(knownElements);
-
-		observableCollection = null;
-	}
-
-	public Object[] getElements(Object inputElement) {
-		if (observableCollection == null)
-			return new Object[0];
-
-		if (realizedElements != null) {
-			if (!realizedElements.equals(knownElements)) {
-				asyncUpdateRealizedElements();
-			}
-		}
-
-		return observableCollection.toArray();
-	}
-
-	private void asyncUpdateRealizedElements() {
-		if (realizedElements == null)
-			return;
-		display.asyncExec(new Runnable() {
-			public void run() {
-				if (realizedElements != null) {
-					realizedElements.addAll(knownElements);
-				}
-			}
-		});
-	}
-
-	public void dispose() {
-		if (observableCollection != null)
-			removeCollectionChangeListener(observableCollection);
-
-		if (viewerObservable != null) {
-			viewerObservable.setValue(null);
-			viewerObservable.dispose();
-			viewerObservable = null;
-		}
-		viewerUpdater = null;
-		knownElements = null;
-		unmodifiableKnownElements = null;
-		realizedElements = null;
-		unmodifiableRealizedElements = null;
-		display = null;
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		setViewer(viewer);
-		setInput(newInput);
-	}
-
-	private void setViewer(Viewer viewer) {
-		viewerUpdater = createViewerUpdater(viewer);
-		comparer = getElementComparer(viewer);
-		viewerObservable.setValue(viewer); // (clears knownElements)
-	}
-
-	private static IElementComparer getElementComparer(Viewer viewer) {
-		if (viewer instanceof StructuredViewer)
-			return ((StructuredViewer) viewer).getComparer();
-		return null;
-	}
-
-	ViewerUpdater createViewerUpdater(Viewer viewer) {
-		if (viewer instanceof AbstractListViewer)
-			return new ListViewerUpdater((AbstractListViewer) viewer);
-		if (viewer instanceof AbstractTableViewer)
-			return new TableViewerUpdater((AbstractTableViewer) viewer);
-		throw new IllegalArgumentException(
-				"This content provider only works with AbstractTableViewer or AbstractListViewer"); //$NON-NLS-1$
-	}
-
-	void setInput(Object input) {
-		if (observableCollection != null) {
-			removeCollectionChangeListener(observableCollection);
-			observableCollection = null;
-		}
-
-		if (input != null) {
-			checkInput(input);
-			Assert.isTrue(input instanceof IObservableCollection,
-					"Input must be an IObservableCollection"); //$NON-NLS-1$
-			observableCollection = (IObservableCollection) input;
-			addCollectionChangeListener(observableCollection);
-			knownElements.addAll(observableCollection);
-		}
-	}
-
-	/**
-	 * Throws an exception if the input is not the correct type.
-	 * 
-	 * @param input
-	 *            the input to check
-	 */
-	protected abstract void checkInput(Object input);
-
-	/**
-	 * Register for change event notification from the given collection.
-	 * 
-	 * @param collection
-	 *            observable collection to listen to
-	 */
-	protected abstract void addCollectionChangeListener(
-			IObservableCollection collection);
-
-	/**
-	 * Deregisters from change events notification on the given collection.
-	 * 
-	 * @param collection
-	 *            observable collection to stop listening to
-	 */
-	protected abstract void removeCollectionChangeListener(
-			IObservableCollection collection);
-
-	/**
-	 * Returns whether the viewer is disposed. Collection change listeners in
-	 * subclasses should verify that the viewer is not disposed before sending
-	 * any updates to the {@link ViewerUpdater viewer updater}.
-	 * 
-	 * @return whether the viewer is disposed.
-	 */
-	protected final boolean isViewerDisposed() {
-		Viewer viewer = (Viewer) viewerObservable.getValue();
-		return viewer == null || viewer.getControl() == null
-				|| viewer.getControl().isDisposed();
-	}
-
-	/**
-	 * Returns the set of elements known to this content provider. Label
-	 * providers may track this set if they need to be notified about additions
-	 * before the viewer sees the added element, and notified about removals
-	 * after the element was removed from the viewer. This is intended for use
-	 * by label providers, as it will always return the items that need labels.
-	 * 
-	 * @return unmodifiable observable set of items that will need labels
-	 */
-	public IObservableSet getKnownElements() {
-		return unmodifiableKnownElements;
-	}
-
-	/**
-	 * Returns the set of known elements which have been realized in the viewer.
-	 * Clients may track this set in order to perform custom actions on elements
-	 * while they are known to be present in the viewer.
-	 * 
-	 * @return the set of known elements which have been realized in the viewer.
-	 * @since 1.3
-	 */
-	public IObservableSet getRealizedElements() {
-		if (realizedElements == null) {
-			realizedElements = MasterDetailObservables.detailSet(
-					viewerObservable, elementSetFactory, null);
-			unmodifiableRealizedElements = Observables
-					.unmodifiableObservableSet(realizedElements);
-			asyncUpdateRealizedElements();
-		}
-		return unmodifiableRealizedElements;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ObservableCollectionTreeContentProvider.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ObservableCollectionTreeContentProvider.java
deleted file mode 100644
index 379685b..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ObservableCollectionTreeContentProvider.java
+++ /dev/null
@@ -1,506 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 207858)
- *     Matthew Hall - bugs 226765, 239015, 222991
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.IObservablesListener;
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.TreeStructureAdvisor;
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.IElementComparer;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * NON-API - Abstract base class for {@link ITreeContentProvider}s which use an
- * {@link IObservableFactory observable collection factory} to provide the
- * elements of a tree. Each observable collection obtained from the factory is
- * observed such that changes in the collection are reflected in the viewer.
- * 
- * @since 1.2
- */
-public abstract class ObservableCollectionTreeContentProvider implements
-		ITreeContentProvider {
-	private Realm realm;
-
-	private Display display;
-
-	private IObservableValue viewerObservable;
-
-	/**
-	 * Element comparer used by the viewer (may be null).
-	 */
-	protected IElementComparer comparer;
-
-	private IObservableFactory elementSetFactory;
-
-	/**
-	 * Interfaces for sending updates to the viewer.
-	 */
-	protected TreeViewerUpdater viewerUpdater;
-
-	/**
-	 * Observable set of all elements known to the content provider. Subclasses
-	 * must add new elements to this set <b>before</b> adding them to the
-	 * viewer, and must remove old elements from this set <b>after</b> removing
-	 * them from the viewer.
-	 */
-	protected IObservableSet knownElements;
-	private IObservableSet unmodifiableKnownElements;
-
-	/**
-	 * Observable set of known elements which have been realized in the viewer.
-	 * Subclasses must add new elements to this set <b>after</b> adding them to
-	 * the viewer, and must remove old elements from this set <b>before</b>
-	 * removing them from the viewer.
-	 */
-	protected IObservableSet realizedElements;
-	private IObservableSet unmodifiableRealizedElements;
-
-	private IObservableFactory /* <IObservableCollection> */collectionFactory;
-
-	private Map /* <Object element, TreeNode node> */elementNodes;
-
-	private TreeStructureAdvisor structureAdvisor;
-
-	/**
-	 * Constructs an ObservableCollectionTreeContentProvider using the given
-	 * parent provider and collection factory.
-	 * 
-	 * @param collectionFactory
-	 *            observable factory that produces an IObservableList of
-	 *            children for a given parent element.
-	 * @param structureAdvisor
-	 */
-	protected ObservableCollectionTreeContentProvider(
-			IObservableFactory collectionFactory,
-			TreeStructureAdvisor structureAdvisor) {
-		this.structureAdvisor = structureAdvisor;
-		display = Display.getDefault();
-		realm = SWTObservables.getRealm(display);
-		viewerObservable = new WritableValue(realm);
-		viewerUpdater = null;
-
-		elementSetFactory = new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return ObservableViewerElementSet.withComparer(realm, null,
-						getElementComparer((Viewer) target));
-			}
-		};
-		knownElements = MasterDetailObservables.detailSet(viewerObservable,
-				elementSetFactory, null);
-		unmodifiableKnownElements = Observables
-				.unmodifiableObservableSet(knownElements);
-
-		Assert
-				.isNotNull(collectionFactory,
-						"Collection factory cannot be null"); //$NON-NLS-1$
-		this.collectionFactory = collectionFactory;
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		if (elementNodes != null && !elementNodes.isEmpty()) {
-			// Ensure we flush any observable collection listeners
-			TreeNode[] oldNodes = new TreeNode[elementNodes.size()];
-			elementNodes.values().toArray(oldNodes);
-			for (int i = 0; i < oldNodes.length; i++)
-				oldNodes[i].dispose();
-			elementNodes.clear();
-			elementNodes = null;
-		}
-
-		setViewer(viewer);
-	}
-
-	private void setViewer(Viewer viewer) {
-		viewerUpdater = createViewerUpdater(viewer);
-		comparer = getElementComparer(viewer);
-		elementNodes = ViewerElementMap.withComparer(comparer);
-		viewerObservable.setValue(viewer); // (clears knownElements)
-	}
-
-	private static IElementComparer getElementComparer(Viewer viewer) {
-		if (viewer instanceof StructuredViewer)
-			return ((StructuredViewer) viewer).getComparer();
-		return null;
-	}
-
-	private static TreeViewerUpdater createViewerUpdater(Viewer viewer) {
-		if (viewer instanceof AbstractTreeViewer)
-			return new TreeViewerUpdater((AbstractTreeViewer) viewer);
-		throw new IllegalArgumentException(
-				"This content provider only works with AbstractTreeViewer"); //$NON-NLS-1$
-	}
-
-	public Object getParent(Object element) {
-		if (structureAdvisor != null) {
-			Object parentFromAdvisor = structureAdvisor.getParent(element);
-			if (parentFromAdvisor != null) {
-				return parentFromAdvisor;
-			}
-		}
-		TreeNode node = getExistingNode(element);
-		if (node != null)
-			return node.getParent();
-		return null;
-	}
-
-	public Object[] getElements(Object input) {
-		return getChildren(input, true);
-	}
-
-	public Object[] getChildren(Object element) {
-		return getChildren(element, false);
-	}
-
-	private Object[] getChildren(Object element, boolean input) {
-		TreeNode node = getOrCreateNode(element, input);
-		Object[] children = node.getChildren().toArray();
-		for (int i = 0; i < children.length; i++)
-			getOrCreateNode(children[i], false).addParent(element);
-		knownElements.addAll(node.getChildren());
-		asyncUpdateRealizedElements();
-		return children;
-	}
-
-	boolean asyncUpdatePending;
-	Runnable asyncUpdateRunnable;
-
-	private void asyncUpdateRealizedElements() {
-		if (realizedElements == null)
-			return;
-		if (asyncUpdatePending)
-			return;
-		if (!realizedElements.equals(knownElements)) {
-			if (asyncUpdateRunnable == null) {
-				asyncUpdateRunnable = new Runnable() {
-					public void run() {
-						asyncUpdatePending = false;
-						if (realizedElements != null) {
-							realizedElements.addAll(knownElements);
-						}
-					}
-				};
-			}
-			asyncUpdatePending = true;
-			display.asyncExec(asyncUpdateRunnable);
-		}
-	}
-
-	public boolean hasChildren(Object element) {
-		if (structureAdvisor != null) {
-			Boolean hasChildren = structureAdvisor.hasChildren(element);
-			if (hasChildren != null) {
-				return hasChildren.booleanValue();
-			}
-		}
-		return getOrCreateNode(element, false).hasChildren();
-	}
-
-	protected TreeNode getOrCreateNode(Object element) {
-		return getOrCreateNode(element, false);
-	}
-
-	private TreeNode getOrCreateNode(Object element, boolean input) {
-		TreeNode node = getExistingNode(element);
-		if (node == null) {
-			node = new TreeNode(element);
-			elementNodes.put(element, node);
-		}
-		// In case the input element is also a visible node in the tree.
-		if (!input)
-			knownElements.add(element);
-		return node;
-	}
-
-	protected TreeNode getExistingNode(Object element) {
-		TreeNode node = (TreeNode) elementNodes.get(element);
-		return node;
-	}
-
-	protected boolean isViewerDisposed() {
-		Viewer viewer = (Viewer) viewerObservable.getValue();
-		return viewer == null || viewer.getControl() == null
-				|| viewer.getControl().isDisposed();
-	}
-
-	public void dispose() {
-		if (elementNodes != null) {
-			if (!elementNodes.isEmpty()) {
-				TreeNode[] nodes = new TreeNode[elementNodes.size()];
-				elementNodes.values().toArray(nodes);
-				for (int i = 0; i < nodes.length; i++) {
-					nodes[i].dispose();
-				}
-				elementNodes.clear();
-			}
-			elementNodes = null;
-		}
-		if (viewerObservable != null) {
-			viewerObservable.setValue(null);
-			viewerObservable.dispose();
-			viewerObservable = null;
-		}
-		viewerUpdater = null;
-		comparer = null;
-		knownElements = null;
-		unmodifiableKnownElements = null;
-		collectionFactory = null;
-		asyncUpdateRunnable = null;
-	}
-
-	/**
-	 * Returns the set of elements known to this content provider. Label
-	 * providers may track this set if they need to be notified about additions
-	 * before the viewer sees the added element, and notified about removals
-	 * after the element was removed from the viewer. This is intended for use
-	 * by label providers, as it will always return the items that need labels.
-	 * 
-	 * @return unmodifiable observable set of items that will need labels
-	 */
-	public IObservableSet getKnownElements() {
-		return unmodifiableKnownElements;
-	}
-
-	/**
-	 * Returns the set of known elements which have been realized in the viewer.
-	 * Clients may track this set in order to perform custom actions on elements
-	 * while they are known to be present in the viewer.
-	 * 
-	 * @return the set of known elements which have been realized in the viewer.
-	 * @since 1.3
-	 */
-	public IObservableSet getRealizedElements() {
-		if (realizedElements == null) {
-			realizedElements = MasterDetailObservables.detailSet(
-					viewerObservable, elementSetFactory, null);
-			unmodifiableRealizedElements = Observables
-					.unmodifiableObservableSet(realizedElements);
-			asyncUpdateRealizedElements();
-		}
-		return unmodifiableRealizedElements;
-	}
-
-	/**
-	 * Returns the set of all elements that would be removed from the known
-	 * elements set if the given elements were removed as children of the given
-	 * parent element.
-	 * 
-	 * @param parent
-	 *            the parent element of the elements being removed
-	 * @param elementsToBeRemoved
-	 *            the elements being removed
-	 * @return the set of all elements that would be removed from the known
-	 *         elements set
-	 */
-	protected Set findPendingRemovals(Object parent,
-			Collection elementsToBeRemoved) {
-		Set result = ViewerElementSet.withComparer(comparer);
-		Set parents = ViewerElementSet.withComparer(comparer);
-		parents.add(parent);
-		accumulatePendingRemovals(result, parents, elementsToBeRemoved);
-		return result;
-	}
-
-	private void accumulatePendingRemovals(Set removals, Set parents,
-			Collection elementsToRemove) {
-		for (Iterator it = elementsToRemove.iterator(); it.hasNext();) {
-			Object element = it.next();
-			TreeNode node = getExistingNode(element);
-			if (node != null) {
-				if (parents.containsAll(node.getParents())) {
-					removals.add(element);
-					parents.add(element);
-					Collection children = node.getChildren();
-					accumulatePendingRemovals(removals, parents, children);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns a listener which, when a collection change event is received,
-	 * updates the tree viewer through the {@link #viewerUpdater} field, and
-	 * maintains the adds and removes parents from the appropriate tree nodes.
-	 * 
-	 * @param parentElement
-	 *            the element that is the parent element of all elements in the
-	 *            observable collection.
-	 * @return a listener which updates the viewer when change events occur.
-	 */
-	protected abstract IObservablesListener createCollectionChangeListener(
-			Object parentElement);
-
-	/**
-	 * Registers the change listener to receive change events for the specified
-	 * observable collection.
-	 * 
-	 * @param collection
-	 *            the collection to observe for changes
-	 * @param listener
-	 *            the listener that will receive collection change events.
-	 */
-	protected abstract void addCollectionChangeListener(
-			IObservableCollection collection, IObservablesListener listener);
-
-	/**
-	 * Unregisters the change listener from receving change events for the
-	 * specified observable collection.
-	 * 
-	 * @param collection
-	 *            the collection to stop observing.
-	 * @param listener
-	 *            the listener to remove
-	 */
-	protected abstract void removeCollectionChangeListener(
-			IObservableCollection collection, IObservablesListener listener);
-
-	protected boolean equal(Object left, Object right) {
-		if (comparer == null)
-			return Util.equals(left, right);
-		return comparer.equals(left, right);
-	}
-
-	protected final class TreeNode {
-		private Object element;
-
-		private Object parent;
-		private Set parentSet;
-
-		private IObservableCollection children;
-
-		private IObservablesListener listener;
-
-		TreeNode(Object element) {
-			Assert.isNotNull(element, "element cannot be null"); //$NON-NLS-1$
-			this.element = element;
-		}
-
-		Object getElement() {
-			return element;
-		}
-
-		public void addParent(Object newParent) {
-			if (parent == null) {
-				parent = newParent;
-			} else if (!equal(parent, newParent)) {
-				if (parentSet == null) {
-					parentSet = ViewerElementSet.withComparer(comparer);
-					parentSet.add(parent);
-				}
-				parentSet.add(newParent);
-			}
-		}
-
-		public void removeParent(Object oldParent) {
-			if (parentSet != null) {
-				parentSet.remove(oldParent);
-				if (parentSet.isEmpty())
-					parentSet = null;
-			}
-
-			if (equal(parent, oldParent)) {
-				if (parentSet == null) {
-					parent = null;
-				} else {
-					parent = parentSet.iterator().next();
-				}
-			}
-
-			if (parent == null) {
-				dispose();
-			}
-		}
-
-		private Object getParent() {
-			return parent;
-		}
-
-		public Set getParents() {
-			if (parentSet != null)
-				return parentSet;
-			if (parent != null)
-				return Collections.singleton(parent);
-			return Collections.EMPTY_SET;
-		}
-
-		private void initChildren() {
-			if (children == null) {
-				children = (IObservableCollection) collectionFactory
-						.createObservable(element);
-				if (children == null) {
-					listener = null;
-					children = Observables.emptyObservableSet(realm);
-				} else {
-					Assert
-							.isTrue(Util.equals(realm, children.getRealm()),
-									"Children observable collection must be on the Display realm"); //$NON-NLS-1$
-					listener = createCollectionChangeListener(element);
-					addCollectionChangeListener(children, listener);
-				}
-			}
-		}
-
-		boolean hasChildren() {
-			initChildren();
-			return !children.isEmpty();
-		}
-
-		public Collection getChildren() {
-			initChildren();
-			return children;
-		}
-
-		private void dispose() {
-			if (element != null) {
-				elementNodes.remove(element);
-			}
-			if (children != null) {
-				for (Iterator iterator = children.iterator(); iterator
-						.hasNext();) {
-					TreeNode child = getExistingNode(iterator.next());
-					if (child != null)
-						child.removeParent(element);
-				}
-				if (listener != null)
-					removeCollectionChangeListener(children, listener);
-				children.dispose();
-				children = null;
-			}
-			element = null;
-			parent = null;
-			if (parentSet != null) {
-				parentSet.clear();
-				parentSet = null;
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ObservableViewerElementSet.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ObservableViewerElementSet.java
deleted file mode 100644
index 2f8b197..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ObservableViewerElementSet.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 215531)
- *     Matthew Hall - bug 230267
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.AbstractObservableSet;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.IElementComparer;
-import org.eclipse.jface.viewers.StructuredViewer;
-
-/**
- * An {@link IObservableSet} of elements in a {@link StructuredViewer}.
- * Elements of the set are compared using an {@link IElementComparer} instead of
- * {@link #equals(Object)}.
- * <p>
- * This class is <i>not</i> a strict implementation the {@link IObservableSet}
- * interface. It intentionally violates the {@link Set} contract, which requires
- * the use of {@link #equals(Object)} when comparing elements. This class is
- * designed for use with {@link StructuredViewer} which uses
- * {@link IElementComparer} for element comparisons.
- * 
- * 
- * @since 1.2
- */
-public class ObservableViewerElementSet extends AbstractObservableSet {
-	private Set wrappedSet;
-	private Object elementType;
-	private IElementComparer comparer;
-
-	/**
-	 * Constructs an ObservableViewerElementSet on the given {@link Realm} which
-	 * uses the given {@link IElementComparer} to compare elements.
-	 * 
-	 * @param realm
-	 *            the realm of the constructed set.
-	 * @param elementType
-	 *            the element type of the constructed set.
-	 * @param comparer
-	 *            the {@link IElementComparer} used to compare elements.
-	 */
-	public ObservableViewerElementSet(Realm realm, Object elementType,
-			IElementComparer comparer) {
-		super(realm);
-
-		Assert.isNotNull(comparer);
-		this.wrappedSet = new ViewerElementSet(comparer);
-		this.elementType = elementType;
-		this.comparer = comparer;
-	}
-
-	protected Set getWrappedSet() {
-		return wrappedSet;
-	}
-
-	public Object getElementType() {
-		return elementType;
-	}
-
-	public Iterator iterator() {
-		getterCalled();
-		final Iterator wrappedIterator = wrappedSet.iterator();
-		return new Iterator() {
-			Object last;
-
-			public boolean hasNext() {
-				getterCalled();
-				return wrappedIterator.hasNext();
-			}
-
-			public Object next() {
-				getterCalled();
-				return last = wrappedIterator.next();
-			}
-
-			public void remove() {
-				getterCalled();
-				wrappedIterator.remove();
-				fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET,
-						Collections.singleton(last)));
-			}
-		};
-	}
-
-	public boolean add(Object o) {
-		getterCalled();
-		boolean changed = wrappedSet.add(o);
-		if (changed)
-			fireSetChange(Diffs.createSetDiff(Collections.singleton(o),
-					Collections.EMPTY_SET));
-		return changed;
-	}
-
-	public boolean addAll(Collection c) {
-		getterCalled();
-		Set additions = new ViewerElementSet(comparer);
-		for (Iterator iterator = c.iterator(); iterator.hasNext();) {
-			Object element = iterator.next();
-			if (wrappedSet.add(element))
-				additions.add(element);
-		}
-		boolean changed = !additions.isEmpty();
-		if (changed)
-			fireSetChange(Diffs.createSetDiff(additions, Collections.EMPTY_SET));
-		return changed;
-	}
-
-	public boolean remove(Object o) {
-		getterCalled();
-		boolean changed = wrappedSet.remove(o);
-		if (changed)
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET,
-					Collections.singleton(o)));
-		return changed;
-	}
-
-	public boolean removeAll(Collection c) {
-		getterCalled();
-		Set removals = new ViewerElementSet(comparer);
-		for (Iterator iterator = c.iterator(); iterator.hasNext();) {
-			Object element = iterator.next();
-			if (wrappedSet.remove(element))
-				removals.add(element);
-		}
-		boolean changed = !removals.isEmpty();
-		if (changed)
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removals));
-		return changed;
-	}
-
-	public boolean retainAll(Collection c) {
-		getterCalled();
-		Set removals = new ViewerElementSet(comparer);
-		Object[] toRetain = c.toArray();
-		outer: for (Iterator iterator = wrappedSet.iterator(); iterator
-				.hasNext();) {
-			Object element = iterator.next();
-			// Cannot rely on c.contains(element) because we must compare
-			// elements using IElementComparer.
-			for (int i = 0; i < toRetain.length; i++) {
-				if (comparer.equals(element, toRetain[i]))
-					continue outer;
-			}
-			iterator.remove();
-			removals.add(element);
-		}
-		boolean changed = !removals.isEmpty();
-		if (changed)
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removals));
-		return changed;
-	}
-
-	public void clear() {
-		getterCalled();
-		if (!wrappedSet.isEmpty()) {
-			Set removals = wrappedSet;
-			wrappedSet = new ViewerElementSet(comparer);
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removals));
-		}
-	}
-
-	/**
-	 * Returns an {@link IObservableSet} for holding viewer elements, using the
-	 * given {@link IElementComparer} for comparisons.
-	 * 
-	 * @param realm
-	 *            the realm of the returned observable
-	 * @param elementType
-	 *            the element type of the returned set
-	 * @param comparer
-	 *            the element comparer to use in element comparisons (may be
-	 *            null). If null, the returned set will compare elements
-	 *            according to the standard contract for {@link Set} interface
-	 *            contract.
-	 * @return a Set for holding viewer elements, using the given
-	 *         {@link IElementComparer} for comparisons.
-	 */
-	public static IObservableSet withComparer(Realm realm, Object elementType,
-			IElementComparer comparer) {
-		if (comparer == null)
-			return new WritableSet(realm, Collections.EMPTY_SET, elementType);
-		return new ObservableViewerElementSet(realm, elementType, comparer);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/SelectionProviderMultipleSelectionObservableList.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/SelectionProviderMultipleSelectionObservableList.java
deleted file mode 100644
index d067ed9..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/SelectionProviderMultipleSelectionObservableList.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Peter Centgraf and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Peter Centgraf - initial API and implementation, bug 124683
- *     Boris Bokowski, IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.databinding.viewers;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.ListDiff;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-/**
- * Observes multiple-selection of an {@link ISelectionProvider}.
- * 
- * @since 1.2
- */
-public class SelectionProviderMultipleSelectionObservableList extends
-		WritableList {
-
-	protected ISelectionProvider selectionProvider;
-	protected boolean handlingSelection;
-	protected boolean updating;
-	protected SelectionListener selectionListener = new SelectionListener();
-
-	class SelectionListener implements ISelectionChangedListener {
-		public void selectionChanged(SelectionChangedEvent event) {
-			if (updating) {
-				return;
-			}
-			handlingSelection = true;
-			try {
-				updateWrappedList(new ArrayList(getSelectionList(event.getSelection())));
-			} finally {
-				handlingSelection = false;
-			}
-		}
-	}
-
-	/**
-	 * Create a new observable list based on the current selection of the given
-	 * selection provider. Assumes that the selection provider provides
-	 * structured selections.
-	 * 
-	 * @param realm
-	 * @param selectionProvider
-	 * @param elementType
-	 */
-	public SelectionProviderMultipleSelectionObservableList(Realm realm,
-			ISelectionProvider selectionProvider, Object elementType) {
-		super(realm, new ArrayList(getSelectionList(selectionProvider)), elementType);
-		this.selectionProvider = selectionProvider;
-		selectionProvider.addSelectionChangedListener(selectionListener);
-	}
-
-	protected void fireListChange(ListDiff diff) {
-		if (handlingSelection) {
-			super.fireListChange(diff);
-		} else {
-			// this is a bit of a hack - we are changing the diff to match the order
-			// of elements returned by the selection provider after we've set the
-			// selection.
-			updating = true;
-			try {
-				List oldList = getSelectionList(selectionProvider);
-				selectionProvider
-						.setSelection(new StructuredSelection(wrappedList));
-				wrappedList = new ArrayList(getSelectionList(selectionProvider));
-				super.fireListChange(Diffs.computeListDiff(oldList, wrappedList));
-			} finally {
-				updating = false;
-			}
-		}
-	}
-
-	protected static List getSelectionList(ISelectionProvider selectionProvider) {
-		if (selectionProvider == null) {
-			throw new IllegalArgumentException();
-		}
-		return getSelectionList(selectionProvider.getSelection());
-	}
-
-	protected static List getSelectionList(ISelection sel) {
-		if (sel instanceof IStructuredSelection) {
-			return ((IStructuredSelection) sel).toList();
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	public synchronized void dispose() {
-		selectionProvider.removeSelectionChangedListener(selectionListener);
-		selectionProvider = null;
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/SelectionProviderSingleSelectionObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/SelectionProviderSingleSelectionObservableValue.java
deleted file mode 100644
index 4ecc6b5..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/SelectionProviderSingleSelectionObservableValue.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 137877
- *     Brad Reynolds - bug 164653
- *     Brad Reynolds - bug 147515
- *     Ashley Cambrell - bug 198906
- *******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-/**
- * Observes single selection of an <code>ISelectionProvider</code>.
- *
- * @since 1.1
- */
-public class SelectionProviderSingleSelectionObservableValue extends
-		AbstractObservableValue {
-
-	private final ISelectionProvider selectionProvider;
-
-	private boolean updating = false;
-
-	private Object currentSelection;
-
-	private ISelectionChangedListener selectionChangedListener;
-
-	/**
-	 * Constructs a new instance associated with the provided
-	 * <code>selectionProvider</code>. In order to initialize itself properly
-	 * the constructor invokes {@link #doGetValue()}. This could be dangerous
-	 * for subclasses, see {@link #doGetValue()} for an explanation.
-	 *
-	 * @param realm
-	 *
-	 * @param selectionProvider
-	 * @see #doGetValue()
-	 */
-	public SelectionProviderSingleSelectionObservableValue(Realm realm,
-			ISelectionProvider selectionProvider) {
-		super(realm);
-		if (selectionProvider == null) {
-			throw new IllegalArgumentException(
-					"The 'selectionProvider' parameter is null."); //$NON-NLS-1$
-		}
-
-		this.selectionProvider = selectionProvider;
-		this.currentSelection = doGetValue();
-
-		selectionChangedListener = new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				if (!updating) {
-					Object oldSelection = currentSelection;
-					currentSelection = doGetValue();
-					fireValueChange(Diffs.createValueDiff(oldSelection,
-							currentSelection));
-				}
-			}
-		};
-		selectionProvider.addSelectionChangedListener(selectionChangedListener);
-	}
-
-	/**
-	 * Sets the selection to the provided <code>value</code>. Value change
-	 * events are fired after selection is set in the selection provider.
-	 *
-	 * @param value
-	 *            object to set as selected, <code>null</code> if wanting to
-	 *            remove selection
-	 */
-	public void doSetValue(final Object value) {
-		try {
-			updating = true;
-
-			Object oldSelection = currentSelection;
-			selectionProvider
-					.setSelection(value == null ? StructuredSelection.EMPTY
-							: new StructuredSelection(value));
-			currentSelection = doGetValue();
-			if (!Util.equals(oldSelection, currentSelection)) {
-				fireValueChange(Diffs.createValueDiff(oldSelection,
-						currentSelection));
-			}
-		} finally {
-			updating = false;
-		}
-	}
-
-	/**
-	 * Retrieves the current selection.
-	 * <p>
-	 * If a subclass overrides this method it must not depend upon the subclass
-	 * to have been fully initialized before this method is invoked.
-	 * <code>doGetValue()</code> is invoked by the
-	 * {@link #SelectionProviderSingleSelectionObservableValue(Realm, ISelectionProvider) constructor}
-	 * which means the subclass's constructor will not have fully executed
-	 * before this method is invoked.
-	 * </p>
-	 *
-	 * @return selection will be an instance of
-	 *         <code>IStructuredSelection</code> if a selection exists,
-	 *         <code>null</code> if no selection
-	 * @see #SelectionProviderSingleSelectionObservableValue(Realm,
-	 *      ISelectionProvider)
-	 */
-	protected Object doGetValue() {
-		ISelection selection = selectionProvider.getSelection();
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection sel = (IStructuredSelection) selection;
-			return sel.getFirstElement();
-		}
-
-		return null;
-	}
-
-	public Object getValueType() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
-	 */
-	public synchronized void dispose() {
-		selectionProvider
-				.removeSelectionChangedListener(selectionChangedListener);
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/TableViewerUpdater.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/TableViewerUpdater.java
deleted file mode 100644
index 25a8a10..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/TableViewerUpdater.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 215531)
- *     Matthew Hall - bugs 226765, 230296
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import org.eclipse.jface.viewers.AbstractTableViewer;
-
-/**
- * NON-API - A {@link ViewerUpdater} that updates {@link AbstractTableViewer}
- * instances.
- * 
- * @since 1.2
- */
-class TableViewerUpdater extends ViewerUpdater {
-	private AbstractTableViewer viewer;
-
-	TableViewerUpdater(AbstractTableViewer viewer) {
-		super(viewer);
-		this.viewer = viewer;
-	}
-
-	public void insert(Object element, int position) {
-		viewer.insert(element, position);
-	}
-
-	public void remove(Object element, int position) {
-		viewer.remove(element);
-	}
-
-	public void replace(Object oldElement, Object newElement, int position) {
-		if (isElementOrderPreserved())
-			viewer.replace(newElement, position);
-		else {
-			super.replace(oldElement, newElement, position);
-		}
-	}
-
-	public void add(Object[] elements) {
-		viewer.add(elements);
-	}
-
-	public void remove(Object[] elements) {
-		viewer.remove(elements);
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/TreeViewerUpdater.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/TreeViewerUpdater.java
deleted file mode 100644
index 44b952f..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/TreeViewerUpdater.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 207858)
- *     Matthew Hall - bugs 226765, 230296
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.IElementComparer;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeViewer;
-
-/**
- * NON-API - An interface for sending updates to an {@link AbstractTreeViewer}.
- * 
- * @since 1.2
- */
-public class TreeViewerUpdater {
-	private final AbstractTreeViewer viewer;
-	private final TreeViewer treeViewer;
-
-	/**
-	 * Constructs an ITreeViewerUpdater for updating the given viewer.
-	 * 
-	 * @param viewer
-	 *            the viewer that will be updated
-	 */
-	public TreeViewerUpdater(AbstractTreeViewer viewer) {
-		this.viewer = viewer;
-		if (viewer instanceof TreeViewer)
-			treeViewer = (TreeViewer) viewer;
-		else
-			treeViewer = null;
-	}
-
-	/**
-	 * Insert the element into the viewer as a child of the specified parent
-	 * element, at the specified position.
-	 * 
-	 * @param parent
-	 *            the parent of the element being inserted
-	 * @param element
-	 *            the element to insert
-	 * @param position
-	 *            the position where the element is inserted
-	 */
-	public void insert(Object parent, Object element, int position) {
-		viewer.insert(parent, element, position);
-	}
-
-	/**
-	 * Replaces the specified element whenever it appears as a child of the
-	 * specified parent element, at the given position with the new element.
-	 * 
-	 * @param parent
-	 *            the parent of the element being replaced
-	 * @param oldElement
-	 *            the element being replaced
-	 * @param newElement
-	 *            the element that replaces <code>oldElement</code>
-	 * @param position
-	 *            the position of the element being replaced.
-	 */
-	public void replace(Object parent, Object oldElement, Object newElement,
-			int position) {
-		if (treeViewer != null && isElementOrderPreserved()) {
-			treeViewer.replace(parent, position, newElement);
-		} else {
-			remove(parent, oldElement, position);
-			insert(parent, newElement, position);
-		}
-	}
-
-	private boolean isElementOrderPreserved() {
-		return viewer.getComparator() == null
-				&& viewer.getFilters().length == 0;
-	}
-
-	/**
-	 * Moves the specified element from the specified old position to the
-	 * specified new position, whenever it appears as a child of the specified
-	 * parent element. No action is taken if the viewer has a sorter or
-	 * filter(s).
-	 * 
-	 * @param parent
-	 *            the parent of the element being moved
-	 * @param element
-	 *            the element being moved
-	 * @param oldPosition
-	 *            the position of the element before it is moved
-	 * @param newPosition
-	 *            the position of the element after it is moved
-	 */
-	public void move(Object parent, Object element, int oldPosition,
-			int newPosition) {
-		if (isElementOrderPreserved()) {
-			ITreeSelection selection = (ITreeSelection) viewer.getSelection();
-
-			remove(parent, element, oldPosition);
-			insert(parent, element, newPosition);
-
-			// If the moved element is selected (or is an ancestor of a selected
-			// element), restore the selection.
-			if (selectionContains(selection, parent, element))
-				viewer.setSelection(selection);
-		}
-	}
-
-	private boolean selectionContains(ITreeSelection selection, Object parent,
-			Object element) {
-		if (!selection.isEmpty()) {
-			IElementComparer comparer = viewer.getComparer();
-			TreePath[] paths = selection.getPaths();
-			for (int i = 0; i < paths.length; i++) {
-				TreePath path = paths[i];
-				for (int j = 0; j < path.getSegmentCount() - 1; j++) {
-					Object pathParent = path.getSegment(j);
-					Object pathElement = path.getSegment(j + 1);
-					if (eq(comparer, parent, pathParent)
-							&& eq(comparer, element, pathElement)) {
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	private boolean eq(IElementComparer comparer, Object o1, Object o2) {
-		return comparer == null ? Util.equals(o1, o2) : comparer.equals(o1, o2);
-	}
-
-	/**
-	 * Removes the element from the from whenever it appears as a child of the
-	 * specified parent element, at the specified position.
-	 * 
-	 * @param parent
-	 *            the parent of the element being removed
-	 * @param element
-	 *            the element to remove
-	 * @param position
-	 *            the position where the element is located
-	 */
-	public void remove(Object parent, Object element, int position) {
-		if (treeViewer != null && viewer.getComparator() == null
-				&& viewer.getFilters().length == 0) {
-			// Only TreeViewer has a remove-by-index method.  
-			treeViewer.remove(parent, position);
-		} else {
-			viewer.remove(parent, new Object[] { element });
-		}
-	}
-
-	/**
-	 * Add the elements into the viewer as children of the specified parent
-	 * element.
-	 * 
-	 * @param parent
-	 *            the parent of the element being inserted
-	 * @param elements
-	 *            the elements to insert
-	 */
-	public void add(Object parent, Object[] elements) {
-		viewer.add(parent, elements);
-	}
-
-	/**
-	 * Remove the elements from the viewer wherever they appear as children of
-	 * the specified parent element.
-	 * 
-	 * @param parent
-	 *            the parent of the elements being removed
-	 * @param elements
-	 *            the elements to remove
-	 */
-	public void remove(Object parent, Object[] elements) {
-		viewer.remove(parent, elements);
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerElementMap.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerElementMap.java
deleted file mode 100644
index 6a8a03b..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerElementMap.java
+++ /dev/null
@@ -1,432 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 215531)
- *     Matthew Hall - bug 228125
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import java.lang.reflect.Array;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.IElementComparer;
-import org.eclipse.jface.viewers.StructuredViewer;
-
-/**
- * A {@link Map} whose keys are elements in a {@link StructuredViewer}. The
- * keys in the map are compared using an {@link IElementComparer} instead of
- * {@link #equals(Object)}.
- * <p>
- * This class is <i>not</i> a strict implementation the {@link Map} interface.
- * It intentionally violates the {@link Map} contract, which requires the use of
- * {@link #equals(Object)} when comparing keys. This class is designed for use
- * with {@link StructuredViewer} which uses {@link IElementComparer} for element
- * comparisons.
- * 
- * @since 1.2
- */
-public class ViewerElementMap implements Map { 
-	private Map wrappedMap;
-	private IElementComparer comparer;
-
-	/**
-	 * Constructs a ViewerElementMap using the given {@link IElementComparer}.
-	 * 
-	 * @param comparer
-	 *            the {@link IElementComparer} used for comparing keys.
-	 */
-	public ViewerElementMap(IElementComparer comparer) {
-		Assert.isNotNull(comparer);
-		this.wrappedMap = new HashMap();
-		this.comparer = comparer;
-	}
-
-	/**
-	 * Constructs a ViewerElementMap containing all the entries in the specified
-	 * map.
-	 * 
-	 * @param map
-	 *            the map whose entries are to be added to this map.
-	 * @param comparer
-	 *            the {@link IElementComparer} used for comparing keys.
-	 */
-	public ViewerElementMap(Map map, IElementComparer comparer) {
-		this(comparer);
-		Assert.isNotNull(map);
-		putAll(map);
-	}
-
-	public void clear() {
-		wrappedMap.clear();
-	}
-
-	public boolean containsKey(Object key) {
-		return wrappedMap.containsKey(new ViewerElementWrapper(key, comparer));
-	}
-
-	public boolean containsValue(Object value) {
-		return wrappedMap.containsValue(value);
-	}
-
-	public Set entrySet() {
-		final Set wrappedEntrySet = wrappedMap.entrySet();
-		return new Set() {
-			public boolean add(Object o) {
-				throw new UnsupportedOperationException();
-			}
-
-			public boolean addAll(Collection c) {
-				throw new UnsupportedOperationException();
-			}
-
-			public void clear() {
-				wrappedEntrySet.clear();
-			}
-
-			public boolean contains(Object o) {
-				for (Iterator iterator = iterator(); iterator.hasNext();)
-					if (iterator.next().equals(o))
-						return true;
-				return false;
-			}
-
-			public boolean containsAll(Collection c) {
-				for (Iterator iterator = c.iterator(); iterator.hasNext();)
-					if (!contains(iterator.next()))
-						return false;
-				return true;
-			}
-
-			public boolean isEmpty() {
-				return wrappedEntrySet.isEmpty();
-			}
-
-			public Iterator iterator() {
-				final Iterator wrappedIterator = wrappedEntrySet.iterator();
-				return new Iterator() {
-					public boolean hasNext() {
-						return wrappedIterator.hasNext();
-					}
-
-					public Object next() {
-						final Map.Entry wrappedEntry = (Map.Entry) wrappedIterator
-								.next();
-						return new Map.Entry() {
-							public Object getKey() {
-								return ((ViewerElementWrapper) wrappedEntry.getKey())
-										.unwrap();
-							}
-
-							public Object getValue() {
-								return wrappedEntry.getValue();
-							}
-
-							public Object setValue(Object value) {
-								return wrappedEntry.setValue(value);
-							}
-
-							public boolean equals(Object obj) {
-								if (obj == this)
-									return true;
-								if (obj == null || !(obj instanceof Map.Entry))
-									return false;
-								Map.Entry that = (Map.Entry) obj;
-								return comparer.equals(this.getKey(), that
-										.getKey())
-										&& Util.equals(this.getValue(), that
-												.getValue());
-							}
-
-							public int hashCode() {
-								return wrappedEntry.hashCode();
-							}
-						};
-					}
-
-					public void remove() {
-						wrappedIterator.remove();
-					}
-				};
-			}
-
-			public boolean remove(Object o) {
-				final Map.Entry unwrappedEntry = (Map.Entry) o;
-				final ViewerElementWrapper wrappedKey = new ViewerElementWrapper(
-						unwrappedEntry.getKey(), comparer);
-				Map.Entry wrappedEntry = new Map.Entry() {
-					public Object getKey() {
-						return wrappedKey;
-					}
-
-					public Object getValue() {
-						return unwrappedEntry.getValue();
-					}
-
-					public Object setValue(Object value) {
-						throw new UnsupportedOperationException();
-					}
-
-					public boolean equals(Object obj) {
-						if (obj == this)
-							return true;
-						if (obj == null || !(obj instanceof Map.Entry))
-							return false;
-						Map.Entry that = (Map.Entry) obj;
-						return Util.equals(wrappedKey, that.getKey())
-								&& Util
-										.equals(this.getValue(), that
-												.getValue());
-					}
-
-					public int hashCode() {
-						return wrappedKey.hashCode()
-								^ (getValue() == null ? 0 : getValue()
-										.hashCode());
-					}
-				};
-				return wrappedEntrySet.remove(wrappedEntry);
-			}
-
-			public boolean removeAll(Collection c) {
-				boolean changed = false;
-				for (Iterator iterator = c.iterator(); iterator.hasNext();)
-					changed |= remove(iterator.next());
-				return changed;
-			}
-
-			public boolean retainAll(Collection c) {
-				boolean changed = false;
-				Object[] toRetain = c.toArray();
-				outer: for (Iterator iterator = iterator(); iterator.hasNext();) {
-					Object entry = iterator.next();
-					for (int i = 0; i < toRetain.length; i++)
-						if (entry.equals(toRetain[i]))
-							continue outer;
-					iterator.remove();
-					changed = true;
-				}
-				return changed;
-			}
-
-			public int size() {
-				return wrappedEntrySet.size();
-			}
-
-			public Object[] toArray() {
-				return toArray(new Object[size()]);
-			}
-
-			public Object[] toArray(Object[] a) {
-				int size = size();
-				if (a.length < size) {
-					a = (Object[]) Array.newInstance(a.getClass()
-							.getComponentType(), size);
-				}
-				int i = 0;
-				for (Iterator iterator = iterator(); iterator.hasNext();) {
-					a[i] = iterator.next();
-					i++;
-				}
-				return a;
-			}
-
-			public boolean equals(Object obj) {
-				if (obj == this)
-					return true;
-				if (obj == null || !(obj instanceof Set))
-					return false;
-				Set that = (Set) obj;
-				return this.size() == that.size() && containsAll(that);
-			}
-
-			public int hashCode() {
-				return wrappedEntrySet.hashCode();
-			}
-		};
-	}
-
-	public Object get(Object key) {
-		return wrappedMap.get(new ViewerElementWrapper(key, comparer));
-	}
-
-	public boolean isEmpty() {
-		return wrappedMap.isEmpty();
-	}
-
-	public Set keySet() {
-		final Set wrappedKeySet = wrappedMap.keySet();
-		return new Set() {
-			public boolean add(Object o) {
-				throw new UnsupportedOperationException();
-			}
-
-			public boolean addAll(Collection c) {
-				throw new UnsupportedOperationException();
-			}
-
-			public void clear() {
-				wrappedKeySet.clear();
-			}
-
-			public boolean contains(Object o) {
-				return wrappedKeySet.contains(new ViewerElementWrapper(o, comparer));
-			}
-
-			public boolean containsAll(Collection c) {
-				for (Iterator iterator = c.iterator(); iterator.hasNext();)
-					if (!wrappedKeySet.contains(new ViewerElementWrapper(iterator.next(), comparer)))
-						return false;
-				return true;
-			}
-
-			public boolean isEmpty() {
-				return wrappedKeySet.isEmpty();
-			}
-
-			public Iterator iterator() {
-				final Iterator wrappedIterator = wrappedKeySet.iterator();
-				return new Iterator() {
-					public boolean hasNext() {
-						return wrappedIterator.hasNext();
-					}
-
-					public Object next() {
-						return ((ViewerElementWrapper) wrappedIterator.next()).unwrap();
-					}
-
-					public void remove() {
-						wrappedIterator.remove();
-					}
-				};
-			}
-
-			public boolean remove(Object o) {
-				return wrappedKeySet.remove(new ViewerElementWrapper(o, comparer));
-			}
-
-			public boolean removeAll(Collection c) {
-				boolean changed = false;
-				for (Iterator iterator = c.iterator(); iterator.hasNext();)
-					changed |= wrappedKeySet
-							.remove(new ViewerElementWrapper(iterator.next(), comparer));
-				return changed;
-			}
-
-			public boolean retainAll(Collection c) {
-				boolean changed = false;
-				Object[] toRetain = c.toArray();
-				outer: for (Iterator iterator = iterator(); iterator.hasNext();) {
-					Object element = iterator.next();
-					for (int i = 0; i < toRetain.length; i++)
-						if (comparer.equals(element, toRetain[i]))
-							continue outer;
-					// element not contained in collection, remove.
-					remove(element);
-					changed = true;
-				}
-				return changed;
-			}
-
-			public int size() {
-				return wrappedKeySet.size();
-			}
-
-			public Object[] toArray() {
-				return toArray(new Object[wrappedKeySet.size()]);
-			}
-
-			public Object[] toArray(Object[] a) {
-				int size = wrappedKeySet.size();
-				ViewerElementWrapper[] wrappedArray = (ViewerElementWrapper[]) wrappedKeySet
-						.toArray(new ViewerElementWrapper[size]);
-				Object[] result = a;
-				if (a.length < size) {
-					result = (Object[]) Array.newInstance(a.getClass()
-							.getComponentType(), size);
-				}
-				for (int i = 0; i < size; i++)
-					result[i] = wrappedArray[i].unwrap();
-				return result;
-			}
-
-			public boolean equals(Object obj) {
-				if (obj == this)
-					return true;
-				if (obj == null || !(obj instanceof Set))
-					return false;
-				Set that = (Set) obj;
-				return this.size() == that.size() && containsAll(that);
-			}
-
-			public int hashCode() {
-				return wrappedKeySet.hashCode();
-			}
-		};
-	}
-
-	public Object put(Object key, Object value) {
-		return wrappedMap.put(new ViewerElementWrapper(key, comparer), value);
-	}
-
-	public void putAll(Map other) {
-		for (Iterator iterator = other.entrySet().iterator(); iterator
-				.hasNext();) {
-			Map.Entry entry = (Map.Entry) iterator.next();
-			wrappedMap.put(new ViewerElementWrapper(entry.getKey(), comparer), entry.getValue());
-		}
-	}
-
-	public Object remove(Object key) {
-		return wrappedMap.remove(new ViewerElementWrapper(key, comparer));
-	}
-
-	public int size() {
-		return wrappedMap.size();
-	}
-
-	public Collection values() {
-		return wrappedMap.values();
-	}
-
-	public boolean equals(Object obj) {
-		if (obj == this)
-			return true;
-		if (obj == null || !(obj instanceof Map))
-			return false;
-		Map that = (Map) obj;
-		return this.entrySet().equals(that.entrySet());
-	}
-
-	public int hashCode() {
-		return wrappedMap.hashCode();
-	}
-
-	/**
-	 * Returns a Map for mapping viewer elements as keys to values, using the
-	 * given {@link IElementComparer} for key comparisons.
-	 * 
-	 * @param comparer
-	 *            the element comparer to use in key comparisons. If null, the
-	 *            returned map will compare keys according to the standard
-	 *            contract for {@link Map} interface contract.
-	 * @return a Map for mapping viewer elements as keys to values, using the
-	 *         given {@link IElementComparer} for key comparisons.
-	 */
-	public static Map withComparer(IElementComparer comparer) {
-		if (comparer == null)
-			return new HashMap();
-		return new ViewerElementMap(comparer);
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerElementSet.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerElementSet.java
deleted file mode 100644
index b9a0b1e..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerElementSet.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 215531)
- *     Matthew Hall - bug 124684
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import java.lang.reflect.Array;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.IElementComparer;
-import org.eclipse.jface.viewers.StructuredViewer;
-
-/**
- * A {@link Set} of elements in a {@link StructuredViewer}. Elements of the set
- * are compared using an {@link IElementComparer} instead of
- * {@link #equals(Object)}.
- * <p>
- * This class is <i>not</i> a strict implementation the {@link Set} interface.
- * It intentionally violates the {@link Set} contract, which requires the use of
- * {@link #equals(Object)} when comparing elements. This class is designed for
- * use with {@link StructuredViewer} which uses {@link IElementComparer} for
- * element comparisons.
- * 
- * @since 1.2
- */
-public class ViewerElementSet implements Set {
-	private final Set wrappedSet;
-	private final IElementComparer comparer;
-
-	/**
-	 * Constructs a ViewerElementSet using the given {@link IElementComparer}.
-	 * 
-	 * @param comparer
-	 *            the {@link IElementComparer} used for comparing elements.
-	 */
-	public ViewerElementSet(IElementComparer comparer) {
-		Assert.isNotNull(comparer);
-		this.wrappedSet = new HashSet();
-		this.comparer = comparer;
-	}
-
-	/**
-	 * Constructs a ViewerElementSet containing all the elements in the
-	 * specified collection.
-	 * 
-	 * @param collection
-	 *            the collection whose elements are to be added to this set.
-	 * @param comparer
-	 *            the {@link IElementComparer} used for comparing elements.
-	 */
-	public ViewerElementSet(Collection collection, IElementComparer comparer) {
-		this(comparer);
-		addAll(collection);
-	}
-
-	public boolean add(Object o) {
-		return wrappedSet.add(new ViewerElementWrapper(o, comparer));
-	}
-
-	public boolean addAll(Collection c) {
-		boolean changed = false;
-		for (Iterator iterator = c.iterator(); iterator.hasNext();)
-			changed |= wrappedSet.add(new ViewerElementWrapper(iterator.next(),
-					comparer));
-		return changed;
-	}
-
-	public void clear() {
-		wrappedSet.clear();
-	}
-
-	public boolean contains(Object o) {
-		return wrappedSet.contains(new ViewerElementWrapper(o, comparer));
-	}
-
-	public boolean containsAll(Collection c) {
-		for (Iterator iterator = c.iterator(); iterator.hasNext();)
-			if (!wrappedSet.contains(new ViewerElementWrapper(iterator.next(),
-					comparer)))
-				return false;
-		return true;
-	}
-
-	public boolean isEmpty() {
-		return wrappedSet.isEmpty();
-	}
-
-	public Iterator iterator() {
-		final Iterator wrappedIterator = wrappedSet.iterator();
-		return new Iterator() {
-			public boolean hasNext() {
-				return wrappedIterator.hasNext();
-			}
-
-			public Object next() {
-				return ((ViewerElementWrapper) wrappedIterator.next()).unwrap();
-			}
-
-			public void remove() {
-				wrappedIterator.remove();
-			}
-		};
-	}
-
-	public boolean remove(Object o) {
-		return wrappedSet.remove(new ViewerElementWrapper(o, comparer));
-	}
-
-	public boolean removeAll(Collection c) {
-		boolean changed = false;
-		for (Iterator iterator = c.iterator(); iterator.hasNext();)
-			changed |= remove(iterator.next());
-		return changed;
-	}
-
-	public boolean retainAll(Collection c) {
-		// Have to do this the slow way to ensure correct comparisons. i.e.
-		// cannot delegate to c.contains(it) since we can't be sure will
-		// compare elements the way we want.
-		boolean changed = false;
-		Object[] retainAll = c.toArray();
-		outer: for (Iterator iterator = iterator(); iterator.hasNext();) {
-			Object element = iterator.next();
-			for (int i = 0; i < retainAll.length; i++) {
-				if (comparer.equals(element, retainAll[i])) {
-					continue outer;
-				}
-			}
-			iterator.remove();
-			changed = true;
-		}
-		return changed;
-	}
-
-	public int size() {
-		return wrappedSet.size();
-	}
-
-	public Object[] toArray() {
-		return toArray(new Object[wrappedSet.size()]);
-	}
-
-	public Object[] toArray(Object[] a) {
-		int size = wrappedSet.size();
-		ViewerElementWrapper[] wrappedArray = (ViewerElementWrapper[]) wrappedSet
-				.toArray(new ViewerElementWrapper[size]);
-		Object[] result = a;
-		if (a.length < size) {
-			result = (Object[]) Array.newInstance(a.getClass()
-					.getComponentType(), size);
-		}
-		for (int i = 0; i < size; i++)
-			result[i] = wrappedArray[i].unwrap();
-		return result;
-	}
-
-	public boolean equals(Object obj) {
-		if (obj == this)
-			return true;
-		if (!(obj instanceof Set))
-			return false;
-		Set that = (Set) obj;
-		return size() == that.size() && containsAll(that);
-	}
-
-	public int hashCode() {
-		int hash = 0;
-		for (Iterator iterator = iterator(); iterator.hasNext();) {
-			Object element = iterator.next();
-			hash += element == null ? 0 : element.hashCode();
-		}
-		return hash;
-	}
-
-	/**
-	 * Returns a Set for holding viewer elements, using the given
-	 * {@link IElementComparer} for comparisons.
-	 * 
-	 * @param comparer
-	 *            the element comparer to use in element comparisons. If null,
-	 *            the returned set will compare elements according to the
-	 *            standard contract for {@link Set} interface contract.
-	 * @return a Set for holding viewer elements, using the given
-	 *         {@link IElementComparer} for comparisons.
-	 */
-	public static Set withComparer(IElementComparer comparer) {
-		if (comparer == null)
-			return new HashSet();
-		return new ViewerElementSet(comparer);
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerElementWrapper.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerElementWrapper.java
deleted file mode 100644
index c2645ae..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerElementWrapper.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 215531)
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import org.eclipse.jface.viewers.IElementComparer;
-
-/**
- * A wrapper class for viewer elements, which uses an {@link IElementComparer}
- * for computing {@link Object#equals(Object) equality} and
- * {@link Object#hashCode() hashes}.
- * 
- * @since 1.2
- */
-public class ViewerElementWrapper {
-	private final Object element;
-	private final IElementComparer comparer;
-
-	/**
-	 * Constructs a ViewerElementWrapper wrapping the given element
-	 * 
-	 * @param element
-	 *            the element being wrapped
-	 * @param comparer
-	 *            the comparer to use for computing equality and hash codes.
-	 */
-	public ViewerElementWrapper(Object element, IElementComparer comparer) {
-		if (comparer == null)
-			throw new NullPointerException();
-		this.element = element;
-		this.comparer = comparer;
-	}
-
-	public boolean equals(Object obj) {
-		if (!(obj instanceof ViewerElementWrapper)) {
-			return false;
-		}
-		return comparer.equals(element, ((ViewerElementWrapper) obj).element);
-	}
-
-	public int hashCode() {
-		return comparer.hashCode(element);
-	}
-
-	Object unwrap() {
-		return element;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerFiltersObservableSet.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerFiltersObservableSet.java
deleted file mode 100644
index e5538eb..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerFiltersObservableSet.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 239302)
- *******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.ObservableSet;
-import org.eclipse.jface.databinding.viewers.IViewerObservableSet;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-/**
- * An observable set that tracks the filters of the given viewer. Note that this
- * set will not track changes that are made using direct API on StructuredViewer
- * (by calling
- * {@link StructuredViewer#addFilter(org.eclipse.jface.viewers.ViewerFilter)
- * addFilter()},
- * {@link StructuredViewer#removeFilter(org.eclipse.jface.viewers.ViewerFilter)
- * removeFilter()}, or
- * {@link StructuredViewer#setFilters(org.eclipse.jface.viewers.ViewerFilter[])
- * setFilters()}) -- it is assumed that filters are only changed through the
- * set.
- * 
- * @since 1.2
- */
-public class ViewerFiltersObservableSet extends ObservableSet implements
-		IViewerObservableSet {
-
-	private StructuredViewer viewer;
-
-	/**
-	 * @param realm
-	 * @param viewer
-	 */
-	public ViewerFiltersObservableSet(Realm realm, StructuredViewer viewer) {
-		super(realm, new HashSet(Arrays.asList(viewer.getFilters())),
-				ViewerFilter.class);
-		this.viewer = viewer;
-	}
-
-	public Viewer getViewer() {
-		return viewer;
-	}
-
-	private void replaceFilters() {
-		viewer.getControl().setRedraw(false);
-		try {
-			viewer.setFilters((ViewerFilter[]) wrappedSet
-					.toArray(new ViewerFilter[wrappedSet.size()]));
-		} finally {
-			viewer.getControl().setRedraw(true);
-		}
-	}
-
-	private void addFilter(ViewerFilter filter) {
-		viewer.getControl().setRedraw(false);
-		try {
-			viewer.addFilter(filter);
-		} finally {
-			viewer.getControl().setRedraw(true);
-		}
-	}
-
-	private void removeFilter(ViewerFilter filter) {
-		viewer.getControl().setRedraw(false);
-		try {
-			viewer.removeFilter(filter);
-		} finally {
-			viewer.getControl().setRedraw(true);
-		}
-	}
-
-	public boolean add(Object element) {
-		checkRealm();
-		boolean added = wrappedSet.add(element);
-		if (added) {
-			addFilter((ViewerFilter) element);
-			fireSetChange(Diffs.createSetDiff(Collections.singleton(element),
-					Collections.EMPTY_SET));
-		}
-		return added;
-	}
-
-	public boolean addAll(Collection c) {
-		getterCalled();
-		Set additions = new HashSet();
-		Iterator it = c.iterator();
-		while (it.hasNext()) {
-			Object element = it.next();
-			if (wrappedSet.add(element)) {
-				additions.add(element);
-			}
-		}
-		if (additions.size() > 0) {
-			replaceFilters();
-			fireSetChange(Diffs.createSetDiff(additions, Collections.EMPTY_SET));
-			return true;
-		}
-		return false;
-	}
-
-	public void clear() {
-		getterCalled();
-		Set removes = new HashSet(wrappedSet);
-		wrappedSet.clear();
-		replaceFilters();
-		fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removes));
-	}
-
-	public boolean remove(Object o) {
-		getterCalled();
-		boolean removed = wrappedSet.remove(o);
-		if (removed) {
-			removeFilter((ViewerFilter) o);
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET,
-					Collections.singleton(o)));
-		}
-		return removed;
-	}
-
-	public boolean removeAll(Collection c) {
-		getterCalled();
-		Set removes = new HashSet();
-		Iterator it = c.iterator();
-		while (it.hasNext()) {
-			Object element = it.next();
-			if (wrappedSet.remove(element)) {
-				removes.add(element);
-			}
-		}
-		if (removes.size() > 0) {
-			replaceFilters();
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removes));
-			return true;
-		}
-		return false;
-	}
-
-	public boolean retainAll(Collection c) {
-		getterCalled();
-		Set removes = new HashSet();
-		Iterator it = wrappedSet.iterator();
-		while (it.hasNext()) {
-			Object element = it.next();
-			if (!c.contains(element)) {
-				it.remove();
-				removes.add(element);
-			}
-		}
-		if (removes.size() > 0) {
-			replaceFilters();
-			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removes));
-			return true;
-		}
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerInputObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerInputObservableValue.java
deleted file mode 100644
index 1a9ee02..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerInputObservableValue.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 206839)
- *******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Observes the input of a <code>Viewer</code>.
- * <p>
- * This observer is blind to changes in the viewer's input unless its
- * {@link #setValue(Object)} method is called directly.
- * 
- * @since 1.2
- */
-public class ViewerInputObservableValue extends AbstractObservableValue {
-
-  private final Viewer viewer;
-
-  /**
-   * Constructs a new instance associated with the provided <code>viewer</code>.
-   * 
-   * @param realm
-   * @param viewer
-   */
-  public ViewerInputObservableValue( Realm realm, Viewer viewer ) {
-    super( realm );
-    if ( viewer == null ) {
-      throw new IllegalArgumentException( "The 'viewer' parameter is null." ); //$NON-NLS-1$
-    }
-
-    this.viewer = viewer;
-  }
-
-  /**
-   * Sets the input to the provided <code>value</code>. Value change events are
-   * fired after input is set in the viewer.
-   * 
-   * @param value object to set as input
-   */
-  protected void doSetValue( final Object value ) {
-    Object oldValue = doGetValue();
-    viewer.setInput( value );
-    if ( !Util.equals( oldValue, value ) ) {
-      fireValueChange( Diffs.createValueDiff( oldValue, value ) );
-    }
-  }
-
-  /**
-   * Retrieves the current input.
-   * 
-   * @return the current input
-   */
-  protected Object doGetValue() {
-    return viewer.getInput();
-  }
-
-  public Object getValueType() {
-    return null;
-  }
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerMultipleSelectionObservableList.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerMultipleSelectionObservableList.java
deleted file mode 100644
index 2dafff2..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerMultipleSelectionObservableList.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 137877
- *     Brad Reynolds - bug 164653
- *     Brad Reynolds - bug 147515
- *     Ashley Cambrell - bug 198906
- *******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.databinding.viewers.IViewerObservableList;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Observes single selection of a <code>Viewer</code>.
- * 
- * @since 1.2
- */
-public class ViewerMultipleSelectionObservableList extends
-		SelectionProviderMultipleSelectionObservableList implements
-		IViewerObservableList {
-
-	private Viewer viewer;
-
-	/**
-	 * @param realm
-	 * @param viewer
-	 * @param elementType
-	 */
-	public ViewerMultipleSelectionObservableList(Realm realm, Viewer viewer,
-			Object elementType) {
-		super(realm, viewer, elementType);
-		this.viewer = viewer;
-	}
-
-	public Viewer getViewer() {
-		return viewer;
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerObservableValueDecorator.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerObservableValueDecorator.java
deleted file mode 100644
index f14c351..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerObservableValueDecorator.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 245647)
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import org.eclipse.core.databinding.observable.value.DecoratingObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.viewers.IViewerObservableValue;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * @since 3.3
- * 
- */
-public class ViewerObservableValueDecorator extends DecoratingObservableValue
-		implements IViewerObservableValue, Listener {
-	private Viewer viewer;
-
-	/**
-	 * @param decorated
-	 * @param viewer
-	 */
-	public ViewerObservableValueDecorator(IObservableValue decorated,
-			Viewer viewer) {
-		super(decorated, true);
-		this.viewer = viewer;
-		viewer.getControl().addListener(SWT.Dispose, this);
-	}
-
-	public void handleEvent(Event event) {
-		if (event.type == SWT.Dispose)
-			dispose();
-	}
-
-	public Viewer getViewer() {
-		return viewer;
-	}
-
-	public synchronized void dispose() {
-		if (viewer != null) {
-			Control control = viewer.getControl();
-			if (control != null && !control.isDisposed()) {
-				control.removeListener(SWT.Dispose, this);
-			}
-			viewer = null;
-		}
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerSingleSelectionObservableValue.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerSingleSelectionObservableValue.java
deleted file mode 100644
index 648e369..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerSingleSelectionObservableValue.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 137877
- *     Brad Reynolds - bug 164653
- *     Brad Reynolds - bug 147515
- *     Ashley Cambrell - bug 198906
- *******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.databinding.viewers.IViewerObservableValue;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Observes single selection of a <code>Viewer</code>.
- * 
- * @since 1.2
- */
-public class ViewerSingleSelectionObservableValue extends
-		SelectionProviderSingleSelectionObservableValue implements
-		IViewerObservableValue {
-
-	private Viewer viewer;
-
-	/**
-	 * @param realm
-	 * @param viewer
-	 */
-	public ViewerSingleSelectionObservableValue(Realm realm, Viewer viewer) {
-		super(realm, viewer);
-		this.viewer = viewer;
-	}
-
-	public Viewer getViewer() {
-		return viewer;
-	}
-}
diff --git a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerUpdater.java b/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerUpdater.java
deleted file mode 100644
index aaca6dd..0000000
--- a/bundles/org.eclipse.jface.databinding/src/org/eclipse/jface/internal/databinding/viewers/ViewerUpdater.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 226765)
- *     Matthew Hall - bug 230296
- ******************************************************************************/
-
-package org.eclipse.jface.internal.databinding.viewers;
-
-import java.util.Iterator;
-
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.IElementComparer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-
-/**
- * NON-API - An interface for updating a viewer's elements.
- * 
- * @since 1.2
- */
-public abstract class ViewerUpdater {
-	private final StructuredViewer viewer;
-
-	/**
-	 * Constructs a ViewerUpdater for updating the specified viewer.
-	 * 
-	 * @param viewer
-	 *            the viewer which will be updated through this instance.
-	 */
-	protected ViewerUpdater(StructuredViewer viewer) {
-		this.viewer = viewer;
-	}
-
-	/**
-	 * Insert the element into the viewer at the specified position.
-	 * 
-	 * @param element
-	 *            the element to add
-	 * @param position
-	 *            the position of the element
-	 */
-	public abstract void insert(Object element, int position);
-
-	/**
-	 * Remove the element from the viewer
-	 * 
-	 * @param element
-	 *            the element to remove
-	 * @param position
-	 *            the position of the element
-	 */
-	public abstract void remove(Object element, int position);
-
-	/**
-	 * Replace the specified element at the given position with the new element.
-	 * 
-	 * @param oldElement
-	 *            the element being replaced
-	 * @param newElement
-	 *            the element that replaces <code>oldElement</code>
-	 * @param position
-	 *            the position of the element being replaced.
-	 */
-	public void replace(Object oldElement, Object newElement, int position) {
-		remove(oldElement, position);
-		insert(newElement, position);
-	}
-
-	/**
-	 * Moves the specified element from the specified old position to the
-	 * specified new position. No action is taken if the viewer has a sorter or
-	 * filter(s).
-	 * 
-	 * @param element
-	 *            the element being moved
-	 * @param oldPosition
-	 *            the position of the element before it is moved
-	 * @param newPosition
-	 *            the position of the element after it is moved
-	 */
-	public void move(Object element, int oldPosition, int newPosition) {
-		if (isElementOrderPreserved()) {
-			IStructuredSelection selection = (IStructuredSelection) viewer
-					.getSelection();
-
-			remove(element, oldPosition);
-			insert(element, newPosition);
-
-			// Preserve selection
-			if (selectionContains(selection, element)) {
-				viewer.setSelection(selection);
-			}
-		}
-	}
-
-	boolean isElementOrderPreserved() {
-		return viewer.getComparator() == null
-				&& viewer.getFilters().length == 0;
-	}
-
-	private boolean selectionContains(IStructuredSelection selection,
-			Object element) {
-		if (!selection.isEmpty()) {
-			IElementComparer comparer = viewer.getComparer();
-			for (Iterator iter = selection.iterator(); iter.hasNext();) {
-				Object selectionElement = iter.next();
-				if (comparer == null ? Util.equals(element, selectionElement)
-						: comparer.equals(element, selectionElement)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Adds the elements to the viewer.
-	 * 
-	 * @param elements
-	 *            the elements to add
-	 */
-	public abstract void add(Object[] elements);
-
-	/**
-	 * Removes the elements from the viewer
-	 * 
-	 * @param elements
-	 *            the elements to remove
-	 */
-	public abstract void remove(Object[] elements);
-}
diff --git a/bundles/org.eclipse.jface/.classpath b/bundles/org.eclipse.jface/.classpath
deleted file mode 100644
index ce73933..0000000
--- a/bundles/org.eclipse.jface/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.jface/.cvsignore b/bundles/org.eclipse.jface/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.jface/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.jface/.options b/bundles/org.eclipse.jface/.options
deleted file mode 100644
index f62a68c..0000000
--- a/bundles/org.eclipse.jface/.options
+++ /dev/null
@@ -1,20 +0,0 @@
-# Debugging options for the org.eclipse.jface plugin.
-
-# Turn on debugging for the org.eclipse.ui plugin.
-org.eclipse.jface/debug=false
-
-# Log a message if a dialog is opened without a parent
-org.eclipse.jface/debug/dialog/noparent=false
-
-# Always log reentrant calls to viewers (if set to false, it just logs the first reentrant call)
-org.eclipse.jface/debug/viewers/reentrantViewerCalls=false
-
-# Show the jface new look for the preferences dialog
-org.eclipse.jface/newlook/preferences/showNewLook=false
-
-# Report when a tool bar contribution item is asked its visibility after being
-# disposed.  TODO Remove this option?  Bug 51000
-org.eclipse.jface/trace/toolbarDisposal=false
-
-# Reports the time to run an action
-org.eclipse.jface/trace/actions=false
\ No newline at end of file
diff --git a/bundles/org.eclipse.jface/.project b/bundles/org.eclipse.jface/.project
deleted file mode 100644
index b541893..0000000
--- a/bundles/org.eclipse.jface/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jface</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.jface/.settings/.api_filters b/bundles/org.eclipse.jface/.settings/.api_filters
deleted file mode 100644
index 1215f8c..0000000
--- a/bundles/org.eclipse.jface/.settings/.api_filters
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<component id="org.eclipse.jface" version="2">
-    <resource path="src/org/eclipse/jface/dialogs/PopupDialog.java" type="org.eclipse.jface.dialogs.PopupDialog">
-        <filter id="388194388">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.dialogs.PopupDialog"/>
-                <message_argument value="HOVER_SHELLSTYLE"/>
-                <message_argument value="540680"/>
-            </message_arguments>
-        </filter>
-        <filter id="388194388">
-            <message_arguments>
-                <message_argument value="org.eclipse.jface.dialogs.PopupDialog"/>
-                <message_argument value="INFOPOPUP_SHELLSTYLE"/>
-                <message_argument value="8"/>
-            </message_arguments>
-        </filter>
-    </resource>
-</component>
diff --git a/bundles/org.eclipse.jface/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.jface/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index e6751d1..0000000
--- a/bundles/org.eclipse.jface/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,72 +0,0 @@
-#Mon Oct 22 10:29:11 EDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.jface/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.jface/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 3efbe7b..0000000
--- a/bundles/org.eclipse.jface/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Mon Oct 22 10:29:11 EDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.4\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template></templates>
diff --git a/bundles/org.eclipse.jface/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.jface/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index fee4b04..0000000
--- a/bundles/org.eclipse.jface/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Sat Mar 19 15:31:31 EST 2005
-compilers.p.deprecated=0
-compilers.p.illegal-att-value=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=0
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=0
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/bundles/org.eclipse.jface/META-INF/MANIFEST.MF b/bundles/org.eclipse.jface/META-INF/MANIFEST.MF
deleted file mode 100644
index bba2e1a..0000000
--- a/bundles/org.eclipse.jface/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,46 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jface
-Bundle-Version: 3.5.0.qualifier
-Bundle-ClassPath: .
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.jface,
- org.eclipse.jface.action,
- org.eclipse.jface.action.images,
- org.eclipse.jface.bindings,
- org.eclipse.jface.bindings.keys,
- org.eclipse.jface.bindings.keys.formatting,
- org.eclipse.jface.commands,
- org.eclipse.jface.contexts,
- org.eclipse.jface.dialogs,
- org.eclipse.jface.dialogs.images,
- org.eclipse.jface.fieldassist,
- org.eclipse.jface.fieldassist.images,
- org.eclipse.jface.images,
- org.eclipse.jface.internal;x-friends:="org.eclipse.ui.workbench",
- org.eclipse.jface.internal.provisional.action;x-friends:="org.eclipse.ui.workbench",
- org.eclipse.jface.layout,
- org.eclipse.jface.menus,
- org.eclipse.jface.operation,
- org.eclipse.jface.preference,
- org.eclipse.jface.preference.images,
- org.eclipse.jface.resource,
- org.eclipse.jface.util,
- org.eclipse.jface.viewers,
- org.eclipse.jface.viewers.deferred,
- org.eclipse.jface.window,
- org.eclipse.jface.wizard,
- org.eclipse.jface.wizard.images
-Require-Bundle: org.eclipse.swt;bundle-version="[3.4.0,4.0.0)";visibility:=reexport,
- org.eclipse.core.commands;bundle-version="[3.4.0,4.0.0)";visibility:=reexport,
- org.eclipse.equinox.common;bundle-version="[3.2.0,4.0.0)"
-Bundle-RequiredExecutionEnvironment: J2SE-1.4,
- CDC-1.1/Foundation-1.1
-Import-Package: javax.xml.parsers,
- org.osgi.framework,
- org.w3c.dom,
- org.xml.sax
-Bundle-Activator: org.eclipse.jface.internal.JFaceActivator
-Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.jface/about.html b/bundles/org.eclipse.jface/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.jface/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.jface/build.properties b/bundles/org.eclipse.jface/build.properties
deleted file mode 100644
index 2c04303..0000000
--- a/bundles/org.eclipse.jface/build.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = plugin.properties,\
-               about.html,\
-               .,\
-               META-INF/
-src.includes = about.html
-source.. = src/
diff --git a/bundles/org.eclipse.jface/icons/full/help.gif b/bundles/org.eclipse.jface/icons/full/help.gif
deleted file mode 100644
index f637410..0000000
--- a/bundles/org.eclipse.jface/icons/full/help.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/icons/full/message_error.gif b/bundles/org.eclipse.jface/icons/full/message_error.gif
deleted file mode 100644
index 2ff6678..0000000
--- a/bundles/org.eclipse.jface/icons/full/message_error.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/icons/full/message_info.gif b/bundles/org.eclipse.jface/icons/full/message_info.gif
deleted file mode 100644
index b484d9b..0000000
--- a/bundles/org.eclipse.jface/icons/full/message_info.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/icons/full/message_warning.gif b/bundles/org.eclipse.jface/icons/full/message_warning.gif
deleted file mode 100644
index 8e054d0..0000000
--- a/bundles/org.eclipse.jface/icons/full/message_warning.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/icons/full/page.gif b/bundles/org.eclipse.jface/icons/full/page.gif
deleted file mode 100644
index 4ed90dc..0000000
--- a/bundles/org.eclipse.jface/icons/full/page.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/icons/full/pref_dialog_title.gif b/bundles/org.eclipse.jface/icons/full/pref_dialog_title.gif
deleted file mode 100644
index 672442f..0000000
--- a/bundles/org.eclipse.jface/icons/full/pref_dialog_title.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/icons/full/title_banner.png b/bundles/org.eclipse.jface/icons/full/title_banner.png
deleted file mode 100644
index 01e187c..0000000
--- a/bundles/org.eclipse.jface/icons/full/title_banner.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/plugin.properties b/bundles/org.eclipse.jface/plugin.properties
deleted file mode 100644
index 528303e..0000000
--- a/bundles/org.eclipse.jface/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName = JFace
-providerName = Eclipse.org
diff --git a/bundles/org.eclipse.jface/scripts/exportplugin.xml b/bundles/org.eclipse.jface/scripts/exportplugin.xml
deleted file mode 100644
index 2ea417c..0000000
--- a/bundles/org.eclipse.jface/scripts/exportplugin.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<project name="Export JFace" default="export" basedir="..">
-	<target name="init">
-		<tstamp/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="plugin"  value="org.eclipse.jface" />
-		<property name="version"  value="_2.1.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}/jface.jar"
-			basedir="bin"
-		/>
-		<copy file="plugin.xml" todir="${dest}"/>
-		<copy file="plugin.properties" todir="${dest}"/>
-		<zip zipfile="${dest}/jfacesrc.zip">
-		    <fileset dir="src" />
-  		</zip>				
-	</target>
-</project>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/AbstractAction.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/AbstractAction.java
deleted file mode 100644
index a389387..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/AbstractAction.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.action;
-
-import org.eclipse.core.commands.common.EventManager;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * <p>
- * Some common functionality to share between implementations of
- * <code>IAction</code>. This functionality deals with the property change
- * event mechanism.
- * </p>
- * <p>
- * Clients may neither instantiate nor extend this class.
- * </p>
- * 
- * @since 3.2
- */
-public abstract class AbstractAction extends EventManager implements IAction {
-
-	public void addPropertyChangeListener(final IPropertyChangeListener listener) {
-		addListenerObject(listener);
-	}
-
-	/**
-	 * Notifies any property change listeners that a property has changed. Only
-	 * listeners registered at the time this method is called are notified.
-	 * 
-	 * @param event
-	 *            the property change event
-	 * 
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(PropertyChangeEvent)
-	 */
-	protected final void firePropertyChange(final PropertyChangeEvent event) {
-		final Object[] list = getListeners();
-		for (int i = 0; i < list.length; ++i) {
-			((IPropertyChangeListener) list[i]).propertyChange(event);
-		}
-	}
-
-	/**
-	 * Notifies any property change listeners that a property has changed. Only
-	 * listeners registered at the time this method is called are notified. This
-	 * method avoids creating an event object if there are no listeners
-	 * registered, but calls
-	 * <code>firePropertyChange(PropertyChangeEvent)</code> if there are.
-	 * 
-	 * @param propertyName
-	 *            the name of the property that has changed
-	 * @param oldValue
-	 *            the old value of the property, or <code>null</code> if none
-	 * @param newValue
-	 *            the new value of the property, or <code>null</code> if none
-	 * 
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(PropertyChangeEvent)
-	 */
-	protected final void firePropertyChange(final String propertyName,
-			final Object oldValue, final Object newValue) {
-		if (isListenerAttached()) {
-			firePropertyChange(new PropertyChangeEvent(this, propertyName,
-					oldValue, newValue));
-		}
-	}
-
-	public void removePropertyChangeListener(
-			final IPropertyChangeListener listener) {
-		removeListenerObject(listener);
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/AbstractGroupMarker.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/AbstractGroupMarker.java
deleted file mode 100644
index e0e5679..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/AbstractGroupMarker.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * Abstract superclass for group marker classes.
- * <p>
- * This class is not intended to be subclassed outside the framework.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public abstract class AbstractGroupMarker extends ContributionItem {
-    /**
-     * Constructor for use by subclasses.
-     */
-    protected AbstractGroupMarker() {
-    }
-
-    /**
-     * Create a new group marker with the given name.
-     * The group name must not be <code>null</code> or the empty string.
-     * The group name is also used as the item id.
-     * 
-     * @param groupName the name of the group
-     */
-    protected AbstractGroupMarker(String groupName) {
-        super(groupName);
-        Assert.isTrue(groupName != null && groupName.length() > 0);
-    }
-
-    /**
-     * Returns the group name.
-     *
-     * @return the group name
-     */
-    public String getGroupName() {
-        return getId();
-    }
-
-    /**
-     * The <code>AbstractGroupMarker</code> implementation of this <code>IContributionItem</code>
-     * method returns <code>true</code> iff the id is not <code>null</code>. Subclasses may override.
-     */
-    public boolean isGroupMarker() {
-        return getId() != null;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/Action.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/Action.java
deleted file mode 100644
index 5be541b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/Action.java
+++ /dev/null
@@ -1,697 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.events.HelpListener;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Menu;
-
-/**
- * The standard abstract implementation of an action.
- * <p>
- * Subclasses must implement the <code>IAction.run</code> method to carry out
- * the action's semantics.
- * </p>
- */
-public abstract class Action extends AbstractAction implements IAction {
-
-	private static final IMenuCreator VAL_DROP_DOWN_MENU = new IMenuCreator() {
-		public void dispose() {
-			// do nothing
-		}
-
-		public Menu getMenu(Control parent) {
-			// do nothing
-			return null;
-		}
-
-		public Menu getMenu(Menu parent) {
-			// do nothing
-			return null;
-		}
-	};
-
-	/*
-	 * The list of default values the action can have. These values will
-	 * determine the style of the action.
-	 */
-	private static final String VAL_PUSH_BTN = "PUSH_BTN"; //$NON-NLS-1$
-
-	private static final Integer VAL_RADIO_BTN_OFF = new Integer(0);
-
-	private static final Integer VAL_RADIO_BTN_ON = new Integer(1);
-
-	private static final Boolean VAL_TOGGLE_BTN_OFF = Boolean.FALSE;
-
-	private static final Boolean VAL_TOGGLE_BTN_ON = Boolean.TRUE;
-
-	/**
-	 * Converts an accelerator key code to a string representation.
-	 * 
-	 * @param keyCode
-	 *            the key code to be translated
-	 * @return a string representation of the key code
-	 */
-	public static String convertAccelerator(int keyCode) {
-		return LegacyActionTools.convertAccelerator(keyCode);
-	}
-
-	/**
-	 * Parses the given accelerator text, and converts it to an accelerator key
-	 * code.
-	 * 
-	 * @param acceleratorText
-	 *            the accelerator text
-	 * @return the SWT key code, or 0 if there is no accelerator
-	 */
-	public static int convertAccelerator(String acceleratorText) {
-		return LegacyActionTools.convertAccelerator(acceleratorText);
-	}
-
-	/**
-	 * Maps a standard keyboard key name to an SWT key code. Key names are
-	 * converted to upper case before comparison. If the key name is a single
-	 * letter, for example "S", its character code is returned.
-	 * <p>
-	 * The following key names are known (case is ignored):
-	 * <ul>
-	 * <li><code>"BACKSPACE"</code></li>
-	 * <li><code>"TAB"</code></li>
-	 * <li><code>"RETURN"</code></li>
-	 * <li><code>"ENTER"</code></li>
-	 * <li><code>"ESC"</code></li>
-	 * <li><code>"ESCAPE"</code></li>
-	 * <li><code>"DELETE"</code></li>
-	 * <li><code>"SPACE"</code></li>
-	 * <li><code>"ARROW_UP"</code>, <code>"ARROW_DOWN"</code>,
-	 * <code>"ARROW_LEFT"</code>, and <code>"ARROW_RIGHT"</code></li>
-	 * <li><code>"PAGE_UP"</code> and <code>"PAGE_DOWN"</code></li>
-	 * <li><code>"HOME"</code></li>
-	 * <li><code>"END"</code></li>
-	 * <li><code>"INSERT"</code></li>
-	 * <li><code>"F1"</code>, <code>"F2"</code> through <code>"F12"</code></li>
-	 * </ul>
-	 * </p>
-	 * 
-	 * @param token
-	 *            the key name
-	 * @return the SWT key code, <code>-1</code> if no match was found
-	 * @see org.eclipse.swt.SWT
-	 */
-	public static int findKeyCode(String token) {
-		return LegacyActionTools.findKeyCode(token);
-	}
-
-	/**
-	 * Maps an SWT key code to a standard keyboard key name. The key code is
-	 * stripped of modifiers (SWT.CTRL, SWT.ALT, SWT.SHIFT, and SWT.COMMAND). If
-	 * the key code is not an SWT code (for example if it a key code for the key
-	 * 'S'), a string containing a character representation of the key code is
-	 * returned.
-	 * 
-	 * @param keyCode
-	 *            the key code to be translated
-	 * @return the string representation of the key code
-	 * @see org.eclipse.swt.SWT
-	 * @since 2.0
-	 */
-	public static String findKeyString(int keyCode) {
-		return LegacyActionTools.findKeyString(keyCode);
-	}
-
-	/**
-	 * Maps standard keyboard modifier key names to the corresponding SWT
-	 * modifier bit. The following modifier key names are recognized (case is
-	 * ignored): <code>"CTRL"</code>, <code>"SHIFT"</code>,
-	 * <code>"ALT"</code>, and <code>"COMMAND"</code>. The given modifier
-	 * key name is converted to upper case before comparison.
-	 * 
-	 * @param token
-	 *            the modifier key name
-	 * @return the SWT modifier bit, or <code>0</code> if no match was found
-	 * @see org.eclipse.swt.SWT
-	 */
-	public static int findModifier(String token) {
-		return LegacyActionTools.findModifier(token);
-	}
-
-	/**
-	 * Returns a string representation of an SWT modifier bit (SWT.CTRL,
-	 * SWT.ALT, SWT.SHIFT, and SWT.COMMAND). Returns <code>null</code> if the
-	 * key code is not an SWT modifier bit.
-	 * 
-	 * @param keyCode
-	 *            the SWT modifier bit to be translated
-	 * @return the string representation of the SWT modifier bit, or
-	 *         <code>null</code> if the key code was not an SWT modifier bit
-	 * @see org.eclipse.swt.SWT
-	 * @since 2.0
-	 */
-	public static String findModifierString(int keyCode) {
-		return LegacyActionTools.findModifierString(keyCode);
-	}
-
-	/**
-	 * Convenience method for removing any optional accelerator text from the
-	 * given string. The accelerator text appears at the end of the text, and is
-	 * separated from the main part by a single tab character <code>'\t'</code>.
-	 * 
-	 * @param text
-	 *            the text
-	 * @return the text sans accelerator
-	 */
-	public static String removeAcceleratorText(String text) {
-		return LegacyActionTools.removeAcceleratorText(text);
-	}
-
-	/**
-	 * Convenience method for removing any mnemonics from the given string. For
-	 * example, <code>removeMnemonics("&Open")</code> will return
-	 * <code>"Open"</code>.
-	 * 
-	 * @param text
-	 *            the text
-	 * @return the text sans mnemonics
-	 * 
-	 * @since 3.0
-	 */
-	public static String removeMnemonics(String text) {
-		return LegacyActionTools.removeMnemonics(text);
-	}
-
-	/**
-	 * This action's accelerator; <code>0</code> means none.
-	 */
-	private int accelerator = 0;
-
-	/**
-	 * This action's action definition id, or <code>null</code> if none.
-	 */
-	private String actionDefinitionId;
-
-	/**
-	 * This action's description, or <code>null</code> if none.
-	 */
-	private String description;
-
-	/**
-	 * This action's disabled image, or <code>null</code> if none.
-	 */
-	private ImageDescriptor disabledImage;
-
-	/**
-	 * Indicates this action is enabled.
-	 */
-	private boolean enabled = true;
-
-	/**
-	 * An action's help listener, or <code>null</code> if none.
-	 */
-	private HelpListener helpListener;
-
-	/**
-	 * This action's hover image, or <code>null</code> if none.
-	 */
-	private ImageDescriptor hoverImage;
-
-	/**
-	 * This action's id, or <code>null</code> if none.
-	 */
-	private String id;
-
-	/**
-	 * This action's image, or <code>null</code> if none.
-	 */
-	private ImageDescriptor image;
-
-	/**
-	 * This action's text, or <code>null</code> if none.
-	 */
-	private String text;
-
-	/**
-	 * This action's tool tip text, or <code>null</code> if none.
-	 */
-	private String toolTipText;
-
-	/**
-	 * Holds the action's menu creator (an IMenuCreator) or checked state (a
-	 * Boolean for toggle button, or an Integer for radio button), or
-	 * <code>null</code> if neither have been set.
-	 * <p>
-	 * The value of this field affects the value of <code>getStyle()</code>.
-	 * </p>
-	 */
-	private Object value = null;
-
-	/**
-	 * Creates a new action with no text and no image.
-	 * <p>
-	 * Configure the action later using the set methods.
-	 * </p>
-	 */
-	protected Action() {
-		// do nothing
-	}
-
-	/**
-	 * Creates a new action with the given text and no image. Calls the zero-arg
-	 * constructor, then <code>setText</code>.
-	 * 
-	 * @param text
-	 *            the string used as the text for the action, or
-	 *            <code>null</code> if there is no text
-	 * @see #setText
-	 */
-	protected Action(String text) {
-		this();
-		setText(text);
-	}
-
-	/**
-	 * Creates a new action with the given text and image. Calls the zero-arg
-	 * constructor, then <code>setText</code> and
-	 * <code>setImageDescriptor</code>.
-	 * 
-	 * @param text
-	 *            the action's text, or <code>null</code> if there is no text
-	 * @param image
-	 *            the action's image, or <code>null</code> if there is no
-	 *            image
-	 * @see #setText
-	 * @see #setImageDescriptor
-	 */
-	protected Action(String text, ImageDescriptor image) {
-		this(text);
-		setImageDescriptor(image);
-	}
-
-	/**
-	 * Creates a new action with the given text and style.
-	 * 
-	 * @param text
-	 *            the action's text, or <code>null</code> if there is no text
-	 * @param style
-	 *            one of <code>AS_PUSH_BUTTON</code>,
-	 *            <code>AS_CHECK_BOX</code>, <code>AS_DROP_DOWN_MENU</code>,
-	 *            <code>AS_RADIO_BUTTON</code>, and
-	 *            <code>AS_UNSPECIFIED</code>.
-	 */
-	protected Action(String text, int style) {
-		this(text);
-		switch (style) {
-		case AS_PUSH_BUTTON:
-			value = VAL_PUSH_BTN;
-			break;
-		case AS_CHECK_BOX:
-			value = VAL_TOGGLE_BTN_OFF;
-			break;
-		case AS_DROP_DOWN_MENU:
-			value = VAL_DROP_DOWN_MENU;
-			break;
-		case AS_RADIO_BUTTON:
-			value = VAL_RADIO_BTN_OFF;
-			break;
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public int getAccelerator() {
-		return accelerator;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 * 
-	 */
-	public String getActionDefinitionId() {
-		return actionDefinitionId;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public String getDescription() {
-		if (description != null) {
-			return description;
-		}
-		return getToolTipText();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public ImageDescriptor getDisabledImageDescriptor() {
-		return disabledImage;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public HelpListener getHelpListener() {
-		return helpListener;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public ImageDescriptor getHoverImageDescriptor() {
-		return hoverImage;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return image;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public IMenuCreator getMenuCreator() {
-		// The default drop down menu value is only used
-		// to mark this action requested style. So do not
-		// return it. For backward compatibility reasons.
-		if (value == VAL_DROP_DOWN_MENU) {
-			return null;
-		}
-		if (value instanceof IMenuCreator) {
-			return (IMenuCreator) value;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public int getStyle() {
-		// Infer the style from the value field.
-		if (value == VAL_PUSH_BTN || value == null) {
-			return AS_PUSH_BUTTON;
-		}
-		if (value == VAL_TOGGLE_BTN_ON || value == VAL_TOGGLE_BTN_OFF) {
-			return AS_CHECK_BOX;
-		}
-		if (value == VAL_RADIO_BTN_ON || value == VAL_RADIO_BTN_OFF) {
-			return AS_RADIO_BUTTON;
-		}
-		if (value instanceof IMenuCreator) {
-			return AS_DROP_DOWN_MENU;
-		}
-
-		// We should never get to this line...
-		return AS_PUSH_BUTTON;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public String getText() {
-		return text;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public String getToolTipText() {
-		return toolTipText;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public boolean isChecked() {
-		return value == VAL_TOGGLE_BTN_ON || value == VAL_RADIO_BTN_ON;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public boolean isEnabled() {
-		return enabled;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public boolean isHandled() {
-		return true;
-	}
-
-	/**
-	 * Reports the outcome of the running of this action via the
-	 * {@link IAction#RESULT} property.
-	 * 
-	 * @param success
-	 *            <code>true</code> if the action succeeded and
-	 *            <code>false</code> if the action failed or was not completed
-	 * @see IAction#RESULT
-	 * @since 3.0
-	 */
-	public final void notifyResult(boolean success) {
-		// avoid Boolean.valueOf(boolean) to allow compilation against JCL
-		// Foundation (bug 80059)
-		firePropertyChange(RESULT, null, success ? Boolean.TRUE : Boolean.FALSE);
-	}
-
-	/**
-	 * The default implementation of this <code>IAction</code> method does
-	 * nothing. Subclasses should override this method if they do not need
-	 * information from the triggering event, or override
-	 * <code>runWithEvent(Event)</code> if they do.
-	 */
-	public void run() {
-		// do nothing
-	}
-
-	/**
-	 * The default implementation of this <code>IAction</code> method ignores
-	 * the event argument, and simply calls <code>run()</code>. Subclasses
-	 * should override this method if they need information from the triggering
-	 * event, or override <code>run()</code> if not.
-	 * 
-	 * @param event
-	 *            the SWT event which triggered this action being run
-	 * @since 2.0
-	 */
-	public void runWithEvent(Event event) {
-		run();
-	}
-
-	/*
-	 * @see IAction#setAccelerator(int)
-	 */
-	public void setAccelerator(int keycode) {
-		this.accelerator = keycode;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public void setActionDefinitionId(String id) {
-		actionDefinitionId = id;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public void setChecked(boolean checked) {
-		Object newValue = null;
-
-		// For backward compatibility, if the style is not
-		// set yet, then convert it to a toggle button.
-		if (value == null || value == VAL_TOGGLE_BTN_ON
-				|| value == VAL_TOGGLE_BTN_OFF) {
-			newValue = checked ? VAL_TOGGLE_BTN_ON : VAL_TOGGLE_BTN_OFF;
-		} else if (value == VAL_RADIO_BTN_ON || value == VAL_RADIO_BTN_OFF) {
-			newValue = checked ? VAL_RADIO_BTN_ON : VAL_RADIO_BTN_OFF;
-		} else {
-			// Some other style already, so do nothing.
-			return;
-		}
-
-		if (newValue != value) {
-			value = newValue;
-			if (checked) {
-				firePropertyChange(CHECKED, Boolean.FALSE, Boolean.TRUE);
-			} else {
-				firePropertyChange(CHECKED, Boolean.TRUE, Boolean.FALSE);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public void setDescription(String text) {
-
-		if ((description == null && text != null)
-				|| (description != null && text == null)
-				|| (description != null && text != null && !text
-						.equals(description))) {
-			String oldDescription = description;
-			description = text;
-			firePropertyChange(DESCRIPTION, oldDescription, description);
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public void setDisabledImageDescriptor(ImageDescriptor newImage) {
-		if (disabledImage != newImage) {
-			ImageDescriptor oldImage = disabledImage;
-			disabledImage = newImage;
-			firePropertyChange(IMAGE, oldImage, newImage);
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public void setEnabled(boolean enabled) {
-		if (enabled != this.enabled) {
-			Boolean oldVal = this.enabled ? Boolean.TRUE : Boolean.FALSE;
-			Boolean newVal = enabled ? Boolean.TRUE : Boolean.FALSE;
-			this.enabled = enabled;
-			firePropertyChange(ENABLED, oldVal, newVal);
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public void setHelpListener(HelpListener listener) {
-		helpListener = listener;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public void setHoverImageDescriptor(ImageDescriptor newImage) {
-		if (hoverImage != newImage) {
-			ImageDescriptor oldImage = hoverImage;
-			hoverImage = newImage;
-			firePropertyChange(IMAGE, oldImage, newImage);
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public void setId(String id) {
-		this.id = id;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public void setImageDescriptor(ImageDescriptor newImage) {
-		if (image != newImage) {
-			ImageDescriptor oldImage = image;
-			image = newImage;
-			firePropertyChange(IMAGE, oldImage, newImage);
-		}
-	}
-
-	/**
-	 * Sets the menu creator for this action.
-	 * <p>
-	 * Note that if this method is called, it overrides the check status.
-	 * </p>
-	 * 
-	 * @param creator
-	 *            the menu creator, or <code>null</code> if none
-	 */
-	public void setMenuCreator(IMenuCreator creator) {
-		// For backward compatibility, if the style is not
-		// set yet, then convert it to a drop down menu.
-		if (value == null) {
-			value = creator;
-			return;
-		}
-
-		if (value instanceof IMenuCreator) {
-			value = creator == null ? VAL_DROP_DOWN_MENU : creator;
-		}
-	}
-
-	/**
-	 * Sets the text for this action.
-	 * <p>
-	 * Fires a property change event for the <code>TEXT</code> property if the
-	 * text actually changes as a consequence.
-	 * </p>
-	 * <p>
-	 * The accelerator is identified by the last index of a tab character. If
-	 * there are no tab characters, then it is identified by the last index of a
-	 * '@' character. If neither, then there is no accelerator text. Note that
-	 * if you want to insert a '@' character into the text (but no accelerator,
-	 * you can simply insert a '@' or a tab at the end of the text.
-	 * </p>
-	 * 
-	 * @param text
-	 *            the text, or <code>null</code> if none
-	 */
-	public void setText(String text) {
-		String oldText = this.text;
-		int oldAccel = this.accelerator;
-		this.text = text;
-		if (text != null) {
-			String acceleratorText = LegacyActionTools
-					.extractAcceleratorText(text);
-			if (acceleratorText != null) {
-				int newAccelerator = LegacyActionTools
-						.convertLocalizedAccelerator(acceleratorText);
-				// Be sure to not wipe out the accelerator if nothing found
-				if (newAccelerator > 0) {
-					setAccelerator(newAccelerator);
-				}
-			}
-		}
-		if (!(this.accelerator == oldAccel && (oldText == null ? this.text == null
-				: oldText.equals(this.text)))) {
-			firePropertyChange(TEXT, oldText, this.text);
-		}
-	}
-
-	/**
-	 * Sets the tool tip text for this action.
-	 * <p>
-	 * Fires a property change event for the <code>TOOL_TIP_TEXT</code>
-	 * property if the tool tip text actually changes as a consequence.
-	 * </p>
-	 * 
-	 * @param toolTipText
-	 *            the tool tip text, or <code>null</code> if none
-	 */
-	public void setToolTipText(String toolTipText) {
-		String oldToolTipText = this.toolTipText;
-		if (!(oldToolTipText == null ? toolTipText == null : oldToolTipText
-				.equals(toolTipText))) {
-			this.toolTipText = toolTipText;
-			firePropertyChange(TOOL_TIP_TEXT, oldToolTipText, toolTipText);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ActionContributionItem.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ActionContributionItem.java
deleted file mode 100644
index eab5620..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ActionContributionItem.java
+++ /dev/null
@@ -1,1366 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.NotEnabledException;
-import org.eclipse.jface.action.ExternalActionManager.IBindingManagerCallback;
-import org.eclipse.jface.bindings.Trigger;
-import org.eclipse.jface.bindings.TriggerSequence;
-import org.eclipse.jface.bindings.keys.IKeyLookup;
-import org.eclipse.jface.bindings.keys.KeyLookupFactory;
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.resource.LocalResourceManager;
-import org.eclipse.jface.resource.ResourceManager;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * A contribution item which delegates to an action.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ActionContributionItem extends ContributionItem {
- 
-	/**
-	 * Mode bit: Show text on tool items or buttons, even if an image is
-	 * present. If this mode bit is not set, text is only shown on tool items if
-	 * there is no image present.
-	 * 
-	 * @since 3.0
-	 */
-	public static int MODE_FORCE_TEXT = 1;
-
-	/** a string inserted in the middle of text that has been shortened */
-	private static final String ellipsis = "..."; //$NON-NLS-1$
-
-	/**
-	 * Stores the result of the action. False when the action returned failure.
-	 */
-	private Boolean result = null;
-
-	private static boolean USE_COLOR_ICONS = true;
-
-	/**
-	 * Returns whether color icons should be used in toolbars.
-	 * 
-	 * @return <code>true</code> if color icons should be used in toolbars,
-	 *         <code>false</code> otherwise
-	 */
-	public static boolean getUseColorIconsInToolbars() {
-		return USE_COLOR_ICONS;
-	}
-
-	/**
-	 * Sets whether color icons should be used in toolbars.
-	 * 
-	 * @param useColorIcons
-	 *            <code>true</code> if color icons should be used in toolbars,
-	 *            <code>false</code> otherwise
-	 */
-	public static void setUseColorIconsInToolbars(boolean useColorIcons) {
-		USE_COLOR_ICONS = useColorIcons;
-	}
-
-	/**
-	 * The presentation mode.
-	 */
-	private int mode = 0;
-
-	/**
-	 * The action.
-	 */
-	private IAction action;
-
-	/**
-	 * The listener for changes to the text of the action contributed by an
-	 * external source.
-	 */
-	private final IPropertyChangeListener actionTextListener = new IPropertyChangeListener() {
-
-		/**
-		 * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
-		 */
-		public void propertyChange(PropertyChangeEvent event) {
-			update(event.getProperty());
-		}
-	};
-
-	/**
-	 * Remembers all images in use by this contribution item
-	 */
-	private LocalResourceManager imageManager;
-
-	/**
-	 * Listener for SWT button widget events.
-	 */
-	private Listener buttonListener;
-
-	/**
-	 * Listener for SWT menu item widget events.
-	 */
-	private Listener menuItemListener;
-
-	/**
-	 * Listener for action property change notifications.
-	 */
-	private final IPropertyChangeListener propertyListener = new IPropertyChangeListener() {
-		public void propertyChange(PropertyChangeEvent event) {
-			actionPropertyChange(event);
-		}
-	};
-
-	/**
-	 * Listener for SWT tool item widget events.
-	 */
-	private Listener toolItemListener;
-
-	/**
-	 * The widget created for this item; <code>null</code> before creation and
-	 * after disposal.
-	 */
-	private Widget widget = null;
-
-	private Listener menuCreatorListener;
-
-	/**
-	 * Creates a new contribution item from the given action. The id of the
-	 * action is used as the id of the item.
-	 * 
-	 * @param action
-	 *            the action
-	 */
-	public ActionContributionItem(IAction action) {
-		super(action.getId());
-		this.action = action;
-	}
-
-	/**
-	 * Handles a property change event on the action (forwarded by nested
-	 * listener).
-	 */
-	private void actionPropertyChange(final PropertyChangeEvent e) {
-		// This code should be removed. Avoid using free asyncExec
-
-		if (isVisible() && widget != null) {
-			Display display = widget.getDisplay();
-			if (display.getThread() == Thread.currentThread()) {
-				update(e.getProperty());
-			} else {
-				display.asyncExec(new Runnable() {
-					public void run() {
-						update(e.getProperty());
-					}
-				});
-			}
-
-		}
-	}
-
-	/**
-	 * Compares this action contribution item with another object. Two action
-	 * contribution items are equal if they refer to the identical Action.
-	 */
-	public boolean equals(Object o) {
-		if (!(o instanceof ActionContributionItem)) {
-			return false;
-		}
-		return action.equals(((ActionContributionItem) o).action);
-	}
-
-	/**
-	 * The <code>ActionContributionItem</code> implementation of this
-	 * <code>IContributionItem</code> method creates an SWT
-	 * <code>Button</code> for the action using the action's style. If the
-	 * action's checked property has been set, the button is created and primed
-	 * to the value of the checked property.
-	 */
-	public void fill(Composite parent) {
-		if (widget == null && parent != null) {
-			int flags = SWT.PUSH;
-			if (action != null) {
-				if (action.getStyle() == IAction.AS_CHECK_BOX) {
-					flags = SWT.TOGGLE;
-				}
-				if (action.getStyle() == IAction.AS_RADIO_BUTTON) {
-					flags = SWT.RADIO;
-				}
-			}
-
-			Button b = new Button(parent, flags);
-			b.setData(this);
-			b.addListener(SWT.Dispose, getButtonListener());
-			// Don't hook a dispose listener on the parent
-			b.addListener(SWT.Selection, getButtonListener());
-			if (action.getHelpListener() != null) {
-				b.addHelpListener(action.getHelpListener());
-			}
-			widget = b;
-
-			update(null);
-
-			// Attach some extra listeners.
-			action.addPropertyChangeListener(propertyListener);
-			if (action != null) {
-				String commandId = action.getActionDefinitionId();
-				ExternalActionManager.ICallback callback = ExternalActionManager
-						.getInstance().getCallback();
-
-				if ((callback != null) && (commandId != null)) {
-					callback.addPropertyChangeListener(commandId,
-							actionTextListener);
-				}
-			}
-		}
-	}
-
-	/**
-	 * The <code>ActionContributionItem</code> implementation of this
-	 * <code>IContributionItem</code> method creates an SWT
-	 * <code>MenuItem</code> for the action using the action's style. If the
-	 * action's checked property has been set, a button is created and primed to
-	 * the value of the checked property. If the action's menu creator property
-	 * has been set, a cascading submenu is created.
-	 */
-	public void fill(Menu parent, int index) {
-		if (widget == null && parent != null) {
-			int flags = SWT.PUSH;
-			if (action != null) {
-				int style = action.getStyle();
-				if (style == IAction.AS_CHECK_BOX) {
-					flags = SWT.CHECK;
-				} else if (style == IAction.AS_RADIO_BUTTON) {
-					flags = SWT.RADIO;
-				} else if (style == IAction.AS_DROP_DOWN_MENU) {
-					flags = SWT.CASCADE;
-				}
-			}
-
-			MenuItem mi = null;
-			if (index >= 0) {
-				mi = new MenuItem(parent, flags, index);
-			} else {
-				mi = new MenuItem(parent, flags);
-			}
-			widget = mi;
-
-			mi.setData(this);
-			mi.addListener(SWT.Dispose, getMenuItemListener());
-			mi.addListener(SWT.Selection, getMenuItemListener());
-			if (action.getHelpListener() != null) {
-				mi.addHelpListener(action.getHelpListener());
-			}
-
-			if (flags == SWT.CASCADE) {
-				// just create a proxy for now, if the user shows it then 
-				// fill it in
-				Menu subMenu = new Menu(parent);
-				subMenu.addListener(SWT.Show, getMenuCreatorListener());
-				subMenu.addListener(SWT.Hide, getMenuCreatorListener());
-				mi.setMenu(subMenu);
-			}
-
-			update(null);
-
-			// Attach some extra listeners.
-			action.addPropertyChangeListener(propertyListener);
-			if (action != null) {
-				String commandId = action.getActionDefinitionId();
-				ExternalActionManager.ICallback callback = ExternalActionManager
-						.getInstance().getCallback();
-
-				if ((callback != null) && (commandId != null)) {
-					callback.addPropertyChangeListener(commandId,
-							actionTextListener);
-				}
-			}
-		}
-	}
-
-	/**
-	 * The <code>ActionContributionItem</code> implementation of this ,
-	 * <code>IContributionItem</code> method creates an SWT
-	 * <code>ToolItem</code> for the action using the action's style. If the
-	 * action's checked property has been set, a button is created and primed to
-	 * the value of the checked property. If the action's menu creator property
-	 * has been set, a drop-down tool item is created.
-	 */
-	public void fill(ToolBar parent, int index) {
-		if (widget == null && parent != null) {
-			int flags = SWT.PUSH;
-			if (action != null) {
-				int style = action.getStyle();
-				if (style == IAction.AS_CHECK_BOX) {
-					flags = SWT.CHECK;
-				} else if (style == IAction.AS_RADIO_BUTTON) {
-					flags = SWT.RADIO;
-				} else if (style == IAction.AS_DROP_DOWN_MENU) {
-					flags = SWT.DROP_DOWN;
-				}
-			}
-
-			ToolItem ti = null;
-			if (index >= 0) {
-				ti = new ToolItem(parent, flags, index);
-			} else {
-				ti = new ToolItem(parent, flags);
-			}
-			ti.setData(this);
-			ti.addListener(SWT.Selection, getToolItemListener());
-			ti.addListener(SWT.Dispose, getToolItemListener());
-
-			widget = ti;
-
-			update(null);
-
-			// Attach some extra listeners.
-			action.addPropertyChangeListener(propertyListener);
-			if (action != null) {
-				String commandId = action.getActionDefinitionId();
-				ExternalActionManager.ICallback callback = ExternalActionManager
-						.getInstance().getCallback();
-
-				if ((callback != null) && (commandId != null)) {
-					callback.addPropertyChangeListener(commandId,
-							actionTextListener);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns the action associated with this contribution item.
-	 * 
-	 * @return the action
-	 */
-	public IAction getAction() {
-		return action;
-	}
-
-	/**
-	 * Returns the listener for SWT button widget events.
-	 * 
-	 * @return a listener for button events
-	 */
-	private Listener getButtonListener() {
-		if (buttonListener == null) {
-			buttonListener = new Listener() {
-				public void handleEvent(Event event) {
-					switch (event.type) {
-					case SWT.Dispose:
-						handleWidgetDispose(event);
-						break;
-					case SWT.Selection:
-						Widget ew = event.widget;
-						if (ew != null) {
-							handleWidgetSelection(event, ((Button) ew)
-									.getSelection());
-						}
-						break;
-					}
-				}
-			};
-		}
-		return buttonListener;
-	}
-
-	/**
-	 * Returns the listener for SWT menu item widget events.
-	 * 
-	 * @return a listener for menu item events
-	 */
-	private Listener getMenuItemListener() {
-		if (menuItemListener == null) {
-			menuItemListener = new Listener() {
-				public void handleEvent(Event event) {
-					switch (event.type) {
-					case SWT.Dispose:
-						handleWidgetDispose(event);
-						break;
-					case SWT.Selection:
-						Widget ew = event.widget;
-						if (ew != null) {
-							handleWidgetSelection(event, ((MenuItem) ew)
-									.getSelection());
-						}
-						break;
-					}
-				}
-			};
-		}
-		return menuItemListener;
-	}
-
-	/**
-	 * Returns the presentation mode, which is the bitwise-or of the
-	 * <code>MODE_*</code> constants. The default mode setting is 0, meaning
-	 * that for menu items, both text and image are shown (if present), but for
-	 * tool items, the text is shown only if there is no image.
-	 * 
-	 * @return the presentation mode settings
-	 * 
-	 * @since 3.0
-	 */
-	public int getMode() {
-		return mode;
-	}
-
-	/**
-	 * Returns the listener for SWT tool item widget events.
-	 * 
-	 * @return a listener for tool item events
-	 */
-	private Listener getToolItemListener() {
-		if (toolItemListener == null) {
-			toolItemListener = new Listener() {
-				public void handleEvent(Event event) {
-					switch (event.type) {
-					case SWT.Dispose:
-						handleWidgetDispose(event);
-						break;
-					case SWT.Selection:
-						Widget ew = event.widget;
-						if (ew != null) {
-							handleWidgetSelection(event, ((ToolItem) ew)
-									.getSelection());
-						}
-						break;
-					}
-				}
-			};
-		}
-		return toolItemListener;
-	}
-
-	/**
-	 * Handles a widget dispose event for the widget corresponding to this item.
-	 */
-	private void handleWidgetDispose(Event e) {
-		// Check if our widget is the one being disposed.
-		if (e.widget == widget) {
-			// Dispose of the menu creator.
-			if (action.getStyle() == IAction.AS_DROP_DOWN_MENU
-					&& menuCreatorCalled) {
-				IMenuCreator mc = action.getMenuCreator();
-				if (mc != null) {
-					mc.dispose();
-				}
-			}
-
-			// Unhook all of the listeners.
-			action.removePropertyChangeListener(propertyListener);
-			if (action != null) {
-				String commandId = action.getActionDefinitionId();
-				ExternalActionManager.ICallback callback = ExternalActionManager
-						.getInstance().getCallback();
-
-				if ((callback != null) && (commandId != null)) {
-					callback.removePropertyChangeListener(commandId,
-							actionTextListener);
-				}
-			}
-
-			// Clear the widget field.
-			widget = null;
-
-			disposeOldImages();
-		}
-	}
-
-	/**
-	 * Handles a widget selection event.
-	 */
-	private void handleWidgetSelection(Event e, boolean selection) {
-
-		Widget item = e.widget;
-		if (item != null) {
-			int style = item.getStyle();
-
-			if ((style & (SWT.TOGGLE | SWT.CHECK)) != 0) {
-				if (action.getStyle() == IAction.AS_CHECK_BOX) {
-					action.setChecked(selection);
-				}
-			} else if ((style & SWT.RADIO) != 0) {
-				if (action.getStyle() == IAction.AS_RADIO_BUTTON) {
-					action.setChecked(selection);
-				}
-			} else if ((style & SWT.DROP_DOWN) != 0) {
-				if (e.detail == 4) { // on drop-down button
-					if (action.getStyle() == IAction.AS_DROP_DOWN_MENU) {
-						IMenuCreator mc = action.getMenuCreator();
-						menuCreatorCalled = true;
-						ToolItem ti = (ToolItem) item;
-						// we create the menu as a sub-menu of "dummy" so that
-						// we can use
-						// it in a cascading menu too.
-						// If created on a SWT control we would get an SWT
-						// error...
-						// Menu dummy= new Menu(ti.getParent());
-						// Menu m= mc.getMenu(dummy);
-						// dummy.dispose();
-						if (mc != null) {
-							Menu m = mc.getMenu(ti.getParent());
-							if (m != null) {
-								// position the menu below the drop down item
-								Point point = ti.getParent().toDisplay(
-										new Point(e.x, e.y));
-								m.setLocation(point.x, point.y); // waiting
-																	// for SWT
-								// 0.42
-								m.setVisible(true);
-								return; // we don't fire the action
-							}
-						}
-					}
-				}
-			}
-
-			ExternalActionManager.IExecuteCallback callback = null;
-			String actionDefinitionId = action.getActionDefinitionId();
-			if (actionDefinitionId != null) {
-				Object obj = ExternalActionManager.getInstance()
-						.getCallback();
-				if (obj instanceof ExternalActionManager.IExecuteCallback) {
-					callback = (ExternalActionManager.IExecuteCallback) obj;
-				}
-			}
-
-			// Ensure action is enabled first.
-			// See 1GAN3M6: ITPUI:WINNT - Any IAction in the workbench can be
-			// executed while disabled.
-			if (action.isEnabled()) {
-				boolean trace = Policy.TRACE_ACTIONS;
-
-				long ms = 0L;
-				if (trace) {
-					ms = System.currentTimeMillis();
-					System.out.println("Running action: " + action.getText()); //$NON-NLS-1$
-				}				
-				
-				IPropertyChangeListener resultListener = null;
-				if (callback != null) {
-					resultListener = new IPropertyChangeListener() {
-						public void propertyChange(PropertyChangeEvent event) {
-							// Check on result
-							if (event.getProperty().equals(IAction.RESULT)) {
-								if (event.getNewValue() instanceof Boolean) {
-									result = (Boolean) event.getNewValue();
-								}
-							}
-						}
-					};
-					action.addPropertyChangeListener(resultListener);
-					callback.preExecute(action, e);
-				}
-
-				action.runWithEvent(e);
-
-				if (callback != null) {
-					if (result == null || result.equals(Boolean.TRUE)) {
-						callback.postExecuteSuccess(action, Boolean.TRUE);
-					} else {
-						callback.postExecuteFailure(action,
-								new ExecutionException(action.getText()
-										+ " returned failure.")); //$NON-NLS-1$
-					}
-				}
-
-				if (resultListener!=null) {
-					result = null;
-					action.removePropertyChangeListener(resultListener);
-				}
-				if (trace) {
-					System.out.println((System.currentTimeMillis() - ms)
-							+ " ms to run action: " + action.getText()); //$NON-NLS-1$
-				}
-			} else {
-				if (callback != null) {
-					callback.notEnabled(action, new NotEnabledException(action
-							.getText()
-							+ " is not enabled.")); //$NON-NLS-1$
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Object.
-	 */
-	public int hashCode() {
-		return action.hashCode();
-	}
-
-	/**
-	 * Returns whether the given action has any images.
-	 * 
-	 * @param actionToCheck
-	 *            the action
-	 * @return <code>true</code> if the action has any images,
-	 *         <code>false</code> if not
-	 */
-	private boolean hasImages(IAction actionToCheck) {
-		return actionToCheck.getImageDescriptor() != null
-				|| actionToCheck.getHoverImageDescriptor() != null
-				|| actionToCheck.getDisabledImageDescriptor() != null;
-	}
-
-	/**
-	 * Returns whether the command corresponding to this action is active.
-	 */
-	private boolean isCommandActive() {
-		IAction actionToCheck = getAction();
-
-		if (actionToCheck != null) {
-			String commandId = actionToCheck.getActionDefinitionId();
-			ExternalActionManager.ICallback callback = ExternalActionManager
-					.getInstance().getCallback();
-
-			if (callback != null) {
-				return callback.isActive(commandId);
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * The action item implementation of this <code>IContributionItem</code>
-	 * method returns <code>true</code> for menu items and <code>false</code>
-	 * for everything else.
-	 */
-	public boolean isDynamic() {
-		if (widget instanceof MenuItem) {
-			// Optimization. Only recreate the item is the check or radio style
-			// has changed.
-			boolean itemIsCheck = (widget.getStyle() & SWT.CHECK) != 0;
-			boolean actionIsCheck = getAction() != null
-					&& getAction().getStyle() == IAction.AS_CHECK_BOX;
-			boolean itemIsRadio = (widget.getStyle() & SWT.RADIO) != 0;
-			boolean actionIsRadio = getAction() != null
-					&& getAction().getStyle() == IAction.AS_RADIO_BUTTON;
-			return (itemIsCheck != actionIsCheck)
-					|| (itemIsRadio != actionIsRadio);
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionItem.
-	 */
-	public boolean isEnabled() {
-		return action != null && action.isEnabled();
-	}
-
-	/**
-	 * Returns <code>true</code> if this item is allowed to enable,
-	 * <code>false</code> otherwise.
-	 * 
-	 * @return if this item is allowed to be enabled
-	 * @since 2.0
-	 */
-	protected boolean isEnabledAllowed() {
-		if (getParent() == null) {
-			return true;
-		}
-		Boolean value = getParent().getOverrides().getEnabled(this);
-		return (value == null) ? true : value.booleanValue();
-	}
-
-	/**
-	 * The <code>ActionContributionItem</code> implementation of this
-	 * <code>ContributionItem</code> method extends the super implementation
-	 * by also checking whether the command corresponding to this action is
-	 * active.
-	 */
-	public boolean isVisible() {
-		return super.isVisible() && isCommandActive();
-	}
-
-	/**
-	 * Sets the presentation mode, which is the bitwise-or of the
-	 * <code>MODE_*</code> constants.
-	 * 
-	 * @param mode
-	 *            the presentation mode settings
-	 * 
-	 * @since 3.0
-	 */
-	public void setMode(int mode) {
-		this.mode = mode;
-		update();
-	}
-
-	/**
-	 * The action item implementation of this <code>IContributionItem</code>
-	 * method calls <code>update(null)</code>.
-	 */
-	public final void update() {
-		update(null);
-	}
-
-	/**
-	 * Synchronizes the UI with the given property.
-	 * 
-	 * @param propertyName
-	 *            the name of the property, or <code>null</code> meaning all
-	 *            applicable properties
-	 */
-	public void update(String propertyName) {
-		if (widget != null) {
-			// determine what to do
-			boolean textChanged = propertyName == null
-					|| propertyName.equals(IAction.TEXT);
-			boolean imageChanged = propertyName == null
-					|| propertyName.equals(IAction.IMAGE);
-			boolean tooltipTextChanged = propertyName == null
-					|| propertyName.equals(IAction.TOOL_TIP_TEXT);
-			boolean enableStateChanged = propertyName == null
-					|| propertyName.equals(IAction.ENABLED)
-					|| propertyName
-							.equals(IContributionManagerOverrides.P_ENABLED);
-			boolean checkChanged = (action.getStyle() == IAction.AS_CHECK_BOX || action
-					.getStyle() == IAction.AS_RADIO_BUTTON)
-					&& (propertyName == null || propertyName
-							.equals(IAction.CHECKED));
-
-			if (widget instanceof ToolItem) {
-				ToolItem ti = (ToolItem) widget;
-				String text = action.getText();
-				// the set text is shown only if there is no image or if forced
-				// by MODE_FORCE_TEXT
-				boolean showText = text != null
-						&& ((getMode() & MODE_FORCE_TEXT) != 0 || !hasImages(action));
-
-				// only do the trimming if the text will be used
-				if (showText && text != null) {
-					text = Action.removeAcceleratorText(text);
-					text = Action.removeMnemonics(text);
-				}
-
-				if (textChanged) {
-					String textToSet = showText ? text : ""; //$NON-NLS-1$
-					boolean rightStyle = (ti.getParent().getStyle() & SWT.RIGHT) != 0;
-					if (rightStyle || !ti.getText().equals(textToSet)) {
-						// In addition to being required to update the text if
-						// it
-						// gets nulled out in the action, this is also a
-						// workaround
-						// for bug 50151: Using SWT.RIGHT on a ToolBar leaves
-						// blank space
-						ti.setText(textToSet);
-					}
-				}
-
-				if (imageChanged) {
-					// only substitute a missing image if it has no text
-					updateImages(!showText);
-				}
-
-				if (tooltipTextChanged || textChanged) {
-					String toolTip = action.getToolTipText();
-					if ((toolTip == null) || (toolTip.length() == 0)) {
-						toolTip = text;
-					}
-
-					ExternalActionManager.ICallback callback = ExternalActionManager
-							.getInstance().getCallback();
-					String commandId = action.getActionDefinitionId();
-					if ((callback != null) && (commandId != null)
-							&& (toolTip != null)) {
-						String acceleratorText = callback
-								.getAcceleratorText(commandId);
-						if (acceleratorText != null
-								&& acceleratorText.length() != 0) {
-							toolTip = JFaceResources.format(
-									"Toolbar_Tooltip_Accelerator", //$NON-NLS-1$
-									new Object[] { toolTip, acceleratorText });
-						}
-					}
-
-					// if the text is showing, then only set the tooltip if
-					// different
-					if (!showText || toolTip != null && !toolTip.equals(text)) {
-						ti.setToolTipText(toolTip);
-					} else {
-						ti.setToolTipText(null);
-					}
-				}
-
-				if (enableStateChanged) {
-					boolean shouldBeEnabled = action.isEnabled()
-							&& isEnabledAllowed();
-
-					if (ti.getEnabled() != shouldBeEnabled) {
-						ti.setEnabled(shouldBeEnabled);
-					}
-				}
-
-				if (checkChanged) {
-					boolean bv = action.isChecked();
-
-					if (ti.getSelection() != bv) {
-						ti.setSelection(bv);
-					}
-				}
-				return;
-			}
-
-			if (widget instanceof MenuItem) {
-				MenuItem mi = (MenuItem) widget;
-
-				if (textChanged) {
-					int accelerator = 0;
-					String acceleratorText = null;
-					IAction updatedAction = getAction();
-					String text = null;
-					accelerator = updatedAction.getAccelerator();
-					ExternalActionManager.ICallback callback = ExternalActionManager
-							.getInstance().getCallback();
-
-					// Block accelerators that are already in use.
-					if ((accelerator != 0) && (callback != null)
-							&& (callback.isAcceleratorInUse(accelerator))) {
-						accelerator = 0;
-					}
-
-					/*
-					 * Process accelerators on GTK in a special way to avoid Bug
-					 * 42009. We will override the native input method by
-					 * allowing these reserved accelerators to be placed on the
-					 * menu. We will only do this for "Ctrl+Shift+[0-9A-FU]".
-					 */
-					final String commandId = updatedAction
-							.getActionDefinitionId();
-					if ((Util.isGtk()) && (callback instanceof IBindingManagerCallback)
-							&& (commandId != null)) {
-						final IBindingManagerCallback bindingManagerCallback = (IBindingManagerCallback) callback;
-						final IKeyLookup lookup = KeyLookupFactory.getDefault();
-						final TriggerSequence[] triggerSequences = bindingManagerCallback
-								.getActiveBindingsFor(commandId);
-						for (int i = 0; i < triggerSequences.length; i++) {
-							final TriggerSequence triggerSequence = triggerSequences[i];
-							final Trigger[] triggers = triggerSequence
-									.getTriggers();
-							if (triggers.length == 1) {
-								final Trigger trigger = triggers[0];
-								if (trigger instanceof KeyStroke) {
-									final KeyStroke currentKeyStroke = (KeyStroke) trigger;
-									final int currentNaturalKey = currentKeyStroke
-											.getNaturalKey();
-									if ((currentKeyStroke.getModifierKeys() == (lookup
-											.getCtrl() | lookup.getShift()))
-											&& ((currentNaturalKey >= '0' && currentNaturalKey <= '9')
-													|| (currentNaturalKey >= 'A' && currentNaturalKey <= 'F') || (currentNaturalKey == 'U'))) {
-										accelerator = currentKeyStroke
-												.getModifierKeys()
-												| currentNaturalKey;
-										acceleratorText = triggerSequence
-												.format();
-										break;
-									}
-								}
-							}
-						}
-					}
-
-					if (accelerator == 0) {
-						if ((callback != null) && (commandId != null)) {
-							acceleratorText = callback
-									.getAcceleratorText(commandId);
-						}
-					}
-
-					IContributionManagerOverrides overrides = null;
-
-					if (getParent() != null) {
-						overrides = getParent().getOverrides();
-					}
-
-					if (overrides != null) {
-						text = getParent().getOverrides().getText(this);
-					}
-
-					mi.setAccelerator(accelerator);
-
-					if (text == null) {
-						text = updatedAction.getText();
-					}
-
-					if (text != null && acceleratorText == null) {
-						// use extracted accelerator text in case accelerator
-						// cannot be fully represented in one int (e.g.
-						// multi-stroke keys)
-						acceleratorText = LegacyActionTools
-								.extractAcceleratorText(text);
-						if (acceleratorText == null && accelerator != 0) {
-							acceleratorText = Action
-									.convertAccelerator(accelerator);
-						}
-					}
-
-					if (text == null) {
-						text = ""; //$NON-NLS-1$
-					} else {
-						text = Action.removeAcceleratorText(text);
-					}
-
-					if (acceleratorText == null) {
-						mi.setText(text);
-					} else {
-						mi.setText(text + '\t' + acceleratorText);
-					}
-				}
-
-				if (imageChanged) {
-					updateImages(false);
-				}
-
-				if (enableStateChanged) {
-					boolean shouldBeEnabled = action.isEnabled()
-							&& isEnabledAllowed();
-
-					if (mi.getEnabled() != shouldBeEnabled) {
-						mi.setEnabled(shouldBeEnabled);
-					}
-				}
-
-				if (checkChanged) {
-					boolean bv = action.isChecked();
-
-					if (mi.getSelection() != bv) {
-						mi.setSelection(bv);
-					}
-				}
-
-				return;
-			}
-
-			if (widget instanceof Button) {
-				Button button = (Button) widget;
-
-				if (imageChanged) {
-					updateImages(false);
-				}
-
-				if (textChanged) {
-					String text = action.getText();
-					boolean showText = text != null && ((getMode() & MODE_FORCE_TEXT) != 0 || !hasImages(action));
-					// only do the trimming if the text will be used
-					if (showText) {
-						text = Action.removeAcceleratorText(text);
-					}
-					String textToSet = showText ? text : ""; //$NON-NLS-1$
-					button.setText(textToSet);
-				}
-
-				if (tooltipTextChanged) {
-					button.setToolTipText(action.getToolTipText());
-				}
-
-				if (enableStateChanged) {
-					boolean shouldBeEnabled = action.isEnabled()
-							&& isEnabledAllowed();
-
-					if (button.getEnabled() != shouldBeEnabled) {
-						button.setEnabled(shouldBeEnabled);
-					}
-				}
-
-				if (checkChanged) {
-					boolean bv = action.isChecked();
-
-					if (button.getSelection() != bv) {
-						button.setSelection(bv);
-					}
-				}
-				return;
-			}
-		}
-	}
-
-	/**
-	 * Updates the images for this action.
-	 * 
-	 * @param forceImage
-	 *            <code>true</code> if some form of image is compulsory, and
-	 *            <code>false</code> if it is acceptable for this item to have
-	 *            no image
-	 * @return <code>true</code> if there are images for this action,
-	 *         <code>false</code> if not
-	 */
-	private boolean updateImages(boolean forceImage) {
-
-		ResourceManager parentResourceManager = JFaceResources.getResources();
-
-		if (widget instanceof ToolItem) {
-			if (USE_COLOR_ICONS) {
-				ImageDescriptor image = action.getHoverImageDescriptor();
-				if (image == null) {
-					image = action.getImageDescriptor();
-				}
-				ImageDescriptor disabledImage = action
-						.getDisabledImageDescriptor();
-
-				// Make sure there is a valid image.
-				if (image == null && forceImage) {
-					image = ImageDescriptor.getMissingImageDescriptor();
-				}
-
-				LocalResourceManager localManager = new LocalResourceManager(
-						parentResourceManager);
-
-				// performance: more efficient in SWT to set disabled and hot
-				// image before regular image
-				((ToolItem) widget)
-						.setDisabledImage(disabledImage == null ? null
-								: localManager
-										.createImageWithDefault(disabledImage));
-				((ToolItem) widget).setImage(image == null ? null
-						: localManager.createImageWithDefault(image));
-
-				disposeOldImages();
-				imageManager = localManager;
-
-				return image != null;
-			}
-			ImageDescriptor image = action.getImageDescriptor();
-			ImageDescriptor hoverImage = action.getHoverImageDescriptor();
-			ImageDescriptor disabledImage = action.getDisabledImageDescriptor();
-
-			// If there is no regular image, but there is a hover image,
-			// convert the hover image to gray and use it as the regular image.
-			if (image == null && hoverImage != null) {
-				image = ImageDescriptor.createWithFlags(action
-						.getHoverImageDescriptor(), SWT.IMAGE_GRAY);
-			} else {
-				// If there is no hover image, use the regular image as the
-				// hover image,
-				// and convert the regular image to gray
-				if (hoverImage == null && image != null) {
-					hoverImage = image;
-					image = ImageDescriptor.createWithFlags(action
-							.getImageDescriptor(), SWT.IMAGE_GRAY);
-				}
-			}
-
-			// Make sure there is a valid image.
-			if (hoverImage == null && image == null && forceImage) {
-				image = ImageDescriptor.getMissingImageDescriptor();
-			}
-
-			// Create a local resource manager to remember the images we've
-			// allocated for this tool item
-			LocalResourceManager localManager = new LocalResourceManager(
-					parentResourceManager);
-
-			// performance: more efficient in SWT to set disabled and hot image
-			// before regular image
-			((ToolItem) widget).setDisabledImage(disabledImage == null ? null
-					: localManager.createImageWithDefault(disabledImage));
-			((ToolItem) widget).setHotImage(hoverImage == null ? null
-					: localManager.createImageWithDefault(hoverImage));
-			((ToolItem) widget).setImage(image == null ? null : localManager
-					.createImageWithDefault(image));
-
-			// Now that we're no longer referencing the old images, clear them
-			// out.
-			disposeOldImages();
-			imageManager = localManager;
-
-			return image != null;
-		} else if (widget instanceof Item || widget instanceof Button) {
-
-			// Use hover image if there is one, otherwise use regular image.
-			ImageDescriptor image = action.getHoverImageDescriptor();
-			if (image == null) {
-				image = action.getImageDescriptor();
-			}
-			// Make sure there is a valid image.
-			if (image == null && forceImage) {
-				image = ImageDescriptor.getMissingImageDescriptor();
-			}
-
-			// Create a local resource manager to remember the images we've
-			// allocated for this widget
-			LocalResourceManager localManager = new LocalResourceManager(
-					parentResourceManager);
-
-			if (widget instanceof Item) {
-				((Item) widget).setImage(image == null ? null : localManager
-						.createImageWithDefault(image));
-			} else if (widget instanceof Button) {
-				((Button) widget).setImage(image == null ? null : localManager
-						.createImageWithDefault(image));
-			}
-
-			// Now that we're no longer referencing the old images, clear them
-			// out.
-			disposeOldImages();
-			imageManager = localManager;
-
-			return image != null;
-		}
-		return false;
-	}
-
-	/**
-	 * Dispose any images allocated for this contribution item
-	 */
-	private void disposeOldImages() {
-		if (imageManager != null) {
-			imageManager.dispose();
-			imageManager = null;
-		}
-	}
-
-	/**
-	 * Shorten the given text <code>t</code> so that its length doesn't exceed
-	 * the width of the given ToolItem.The default implementation replaces
-	 * characters in the center of the original string with an ellipsis ("...").
-	 * Override if you need a different strategy.
-	 * 
-	 * @param textValue
-	 *            the text to shorten
-	 * @param item
-	 *            the tool item the text belongs to
-	 * @return the shortened string
-	 * 
-	 */
-	protected String shortenText(String textValue, ToolItem item) {
-		if (textValue == null) {
-			return null;
-		}
-
-		GC gc = new GC(item.getParent());
-
-		int maxWidth = item.getImage().getBounds().width * 4;
-
-		if (gc.textExtent(textValue).x < maxWidth) {
-			gc.dispose();
-			return textValue;
-		}
-
-		for (int i = textValue.length(); i > 0; i--) {
-			String test = textValue.substring(0, i);
-			test = test + ellipsis;
-			if (gc.textExtent(test).x < maxWidth) {
-				gc.dispose();
-				return test;
-			}
-
-		}
-		gc.dispose();
-		// If for some reason we fall through abort
-		return textValue;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.ContributionItem#dispose()
-	 */
-	public void dispose() {
-		if (widget != null) {
-			widget.dispose();
-			widget = null;
-		}
-		holdMenu = null;
-	}
-	
-	/**
-	 * Handle show and hide on the proxy menu for IAction.AS_DROP_DOWN_MENU
-	 * actions.
-	 * 
-	 * @return the appropriate listener
-	 * @since 3.4
-	 */
-	private Listener getMenuCreatorListener() {
-		if (menuCreatorListener == null) {
-			menuCreatorListener = new Listener() {
-				public void handleEvent(Event event) {
-					switch (event.type) {
-					case SWT.Show:
-						handleShowProxy((Menu) event.widget);
-						break;
-					case SWT.Hide:
-						handleHideProxy((Menu) event.widget);
-						break;
-					}
-				}
-			};
-		}
-		return menuCreatorListener;
-	}
-	
-	/**
-	 * This is the easiest way to hold the menu until we can swap it in to the
-	 * proxy.
-	 */
-	private Menu holdMenu = null;
-
-	private boolean menuCreatorCalled = false;
-	
-	/**
-	 * The proxy menu is being shown, we better get the real menu.
-	 * 
-	 * @param proxy
-	 *            the proxy menu
-	 * @since 3.4
-	 */
-	private void handleShowProxy(Menu proxy) {
-		proxy.removeListener(SWT.Show, getMenuCreatorListener());
-		IMenuCreator mc = action.getMenuCreator();
-		menuCreatorCalled  = true;
-		if (mc == null) {
-			return;
-		}
-		holdMenu = mc.getMenu(proxy.getParentMenu());
-		if (holdMenu == null) {
-			return;
-		}
-		copyMenu(holdMenu, proxy);
-	}
-
-	/**
-	 * Create MenuItems in the proxy menu that can execute the real menu items
-	 * if selected. Create proxy menus for any real item submenus.
-	 * 
-	 * @param realMenu
-	 *            the real menu to copy from
-	 * @param proxy
-	 *            the proxy menu to populate
-	 * @since 3.4
-	 */
-	private void copyMenu(Menu realMenu, Menu proxy) {
-		if (realMenu.isDisposed() || proxy.isDisposed()) {
-			return;
-		}
-		
-		// we notify the real menu so it can populate itself if it was
-		// listening for SWT.Show
-		realMenu.notifyListeners(SWT.Show, null);
-
-		final Listener passThrough = new Listener() {
-			public void handleEvent(Event event) {
-				if (!event.widget.isDisposed()) {
-					Widget realItem = (Widget) event.widget.getData();
-					if (!realItem.isDisposed()) {
-						int style = event.widget.getStyle();
-						if (event.type == SWT.Selection
-								&& ((style & (SWT.TOGGLE | SWT.CHECK | SWT.RADIO)) != 0)
-								&& realItem instanceof MenuItem) {
-							((MenuItem) realItem)
-									.setSelection(((MenuItem) event.widget)
-											.getSelection());
-						}
-						event.widget = realItem;
-						realItem.notifyListeners(event.type, event);
-					}
-				}
-			}
-		};
-
-		MenuItem[] items = realMenu.getItems();
-		for (int i = 0; i < items.length; i++) {
-			final MenuItem realItem = items[i];
-			final MenuItem proxyItem = new MenuItem(proxy, realItem.getStyle());
-			proxyItem.setData(realItem);
-			proxyItem.setAccelerator(realItem.getAccelerator());
-			proxyItem.setEnabled(realItem.getEnabled());
-			proxyItem.setImage(realItem.getImage());
-			proxyItem.setSelection(realItem.getSelection());
-			proxyItem.setText(realItem.getText());
-
-			// pass through any events
-			proxyItem.addListener(SWT.Selection, passThrough);
-			proxyItem.addListener(SWT.Arm, passThrough);
-			proxyItem.addListener(SWT.Help, passThrough);
-
-			final Menu itemMenu = realItem.getMenu();
-			if (itemMenu != null) {
-				// create a proxy for any sub menu items
-				final Menu subMenu = new Menu(proxy);
-				subMenu.setData(itemMenu);
-				proxyItem.setMenu(subMenu);
-				subMenu.addListener(SWT.Show, new Listener() {
-					public void handleEvent(Event event) {
-						event.widget.removeListener(SWT.Show, this);
-						if (event.type == SWT.Show) {
-							copyMenu(itemMenu, subMenu);
-						}
-					}
-				});
-				subMenu.addListener(SWT.Help, passThrough);
-				subMenu.addListener(SWT.Hide, passThrough);
-			}
-		}
-	}
-	
-	/**
-	 * The proxy menu is being hidden, so we need to make it go away.
-	 * 
-	 * @param proxy
-	 *            the proxy menu
-	 * @since 3.4
-	 */
-	private void handleHideProxy(final Menu proxy) {
-		proxy.removeListener(SWT.Hide, getMenuCreatorListener());
-		proxy.getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				if (!proxy.isDisposed()) {
-					MenuItem parentItem = proxy.getParentItem();
-					proxy.dispose();
-					parentItem.setMenu(holdMenu);
-				}
-				if (holdMenu != null && !holdMenu.isDisposed()) {
-					holdMenu.notifyListeners(SWT.Hide, null);
-				}
-				holdMenu = null;
-			}
-		});
-	}
-	
-	/**
-	 * Return the widget associated with this contribution item. It should not
-	 * be cached, as it can be disposed and re-created by its containing
-	 * ContributionManager, which controls all of the widgets lifecycle methods.
-	 * <p>
-	 * This can be used to set layout data on the widget if appropriate. The
-	 * actual type of the widget can be any valid control for this
-	 * ContributionItem's current ContributionManager.
-	 * </p>
-	 * 
-	 * @return the widget, or <code>null</code> depending on the lifecycle.
-	 * @since 3.4
-	 */
-	public Widget getWidget() {
-		return widget;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ContributionItem.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ContributionItem.java
deleted file mode 100644
index 7a46946..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ContributionItem.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.CoolBar;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolBar;
-
-/**
- * An abstract base implementation for contribution items.
- */
-public abstract class ContributionItem implements IContributionItem {
-
-    /**
-     * The identifier for this contribution item, of <code>null</code> if none.
-     */
-    private String id = null;
-
-    /**
-     * Indicates this item is visible in its manager; <code>true</code> 
-     * by default.
-     */
-    private boolean visible = true;
-
-    /**
-     * The parent contribution manager for this item
-     */
-    private IContributionManager parent;
-
-    /**
-     * Creates a contribution item with a <code>null</code> id.
-     * Calls <code>this(String)</code> with <code>null</code>.
-     */
-    protected ContributionItem() {
-        this(null);
-    }
-
-    /**
-     * Creates a contribution item with the given (optional) id.
-     * The given id is used to find items in a contribution manager,
-     * and for positioning items relative to other items.
-     *
-     * @param id the contribution item identifier, or <code>null</code>
-     */
-    protected ContributionItem(String id) {
-        this.id = id;
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * method does nothing. Subclasses may override.
-     */
-    public void dispose() {
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * method does nothing. Subclasses may override.
-     */
-    public void fill(Composite parent) {
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * method does nothing. Subclasses may override.
-     */
-    public void fill(Menu menu, int index) {
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * method does nothing. Subclasses may override.
-     */
-    public void fill(ToolBar parent, int index) {
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * method does nothing. Subclasses may override.
-     * 
-     * @since 3.0
-     */
-    public void fill(CoolBar parent, int index) {
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * method does nothing. Subclasses may override.
-     * 
-     * @since 3.0
-     */
-    public void saveWidgetState() {
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * Returns the parent contribution manager, or <code>null</code> if this 
-     * contribution item is not currently added to a contribution manager.
-     * 
-     * @return the parent contribution manager, or <code>null</code>
-     * @since 2.0
-     */
-    public IContributionManager getParent() {
-        return parent;
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * method returns <code>false</code>. Subclasses may override.
-     */
-    public boolean isDirty() {
-        // @issue should this be false instead of calling isDynamic()?
-        return isDynamic();
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * method returns <code>true</code>. Subclasses may override.
-     */
-    public boolean isEnabled() {
-        return true;
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * method returns <code>false</code>. Subclasses may override.
-     */
-    public boolean isDynamic() {
-        return false;
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * method returns <code>false</code>. Subclasses may override.
-     */
-    public boolean isGroupMarker() {
-        return false;
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * method returns <code>false</code>. Subclasses may override.
-     */
-    public boolean isSeparator() {
-        return false;
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * method returns the value recorded in an internal state variable,
-     * which is <code>true</code> by default. <code>setVisible</code>
-     * should be used to change this setting.
-     */
-    public boolean isVisible() {
-        return visible;
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * method stores the value in an internal state variable,
-     * which is <code>true</code> by default.
-     */
-    public void setVisible(boolean visible) {
-        this.visible = visible;
-    }
-
-    /**
-     * Returns a string representation of this contribution item 
-     * suitable only for debugging.
-     */
-    public String toString() {
-        return getClass().getName() + "(id=" + getId() + ")";//$NON-NLS-2$//$NON-NLS-1$
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * method does nothing. Subclasses may override.
-     */
-    public void update() {
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public void setParent(IContributionManager parent) {
-        this.parent = parent;
-    }
-
-    /**
-     * The <code>ContributionItem</code> implementation of this 
-     * method declared on <code>IContributionItem</code> does nothing.
-     * Subclasses should override to update their state.
-     */
-    public void update(String id) {
-    }
-    
-    /**
-	 * The ID for this contribution item. It should be set once either in the
-	 * constructor or using this method.
-	 * 
-	 * @param itemId
-	 * @since 3.4
-	 * @see #getId()
-	 */
-    public void setId(String itemId) {
-    	id = itemId;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ContributionManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ContributionManager.java
deleted file mode 100644
index 003ef8b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ContributionManager.java
+++ /dev/null
@@ -1,577 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.Policy;
-
-/**
- * Abstract base class for all contribution managers, and standard
- * implementation of <code>IContributionManager</code>. This class provides
- * functionality common across the specific managers defined by this framework.
- * <p>
- * This class maintains a list of contribution items and a dirty flag, both as
- * internal state. In addition to providing implementations of most
- * <code>IContributionManager</code> methods, this class automatically
- * coalesces adjacent separators, hides beginning and ending separators, and
- * deals with dynamically changing sets of contributions. When the set of
- * contributions does change dynamically, the changes are propagated to the
- * control via the <code>update</code> method, which subclasses must
- * implement.
- * </p>
- * <p>
- * Note: A <code>ContributionItem</code> cannot be shared between different
- * <code>ContributionManager</code>s.
- * </p>
- */
-public abstract class ContributionManager implements IContributionManager {
-
-	// Internal debug flag.
-	// protected static final boolean DEBUG = false;
-
-	/**
-	 * The list of contribution items.
-	 */
-	private List contributions = new ArrayList();
-
-	/**
-	 * Indicates whether the widgets are in sync with the contributions.
-	 */
-	private boolean isDirty = true;
-
-	/**
-	 * Number of dynamic contribution items.
-	 */
-	private int dynamicItems = 0;
-
-	/**
-	 * The overrides for items of this manager
-	 */
-	private IContributionManagerOverrides overrides;
-
-	/**
-	 * Creates a new contribution manager.
-	 */
-	protected ContributionManager() {
-		// Do nothing.
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public void add(IAction action) {
-		Assert.isNotNull(action, "Action must not be null"); //$NON-NLS-1$
-		add(new ActionContributionItem(action));
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public void add(IContributionItem item) {
-		Assert.isNotNull(item, "Item must not be null"); //$NON-NLS-1$
-		if (allowItem(item)) {
-			contributions.add(item);
-			itemAdded(item);
-		}
-	}
-
-	/**
-	 * Adds a contribution item to the start or end of the group with the given
-	 * name.
-	 * 
-	 * @param groupName
-	 *            the name of the group
-	 * @param item
-	 *            the contribution item
-	 * @param append
-	 *            <code>true</code> to add to the end of the group, and
-	 *            <code>false</code> to add the beginning of the group
-	 * @exception IllegalArgumentException
-	 *                if there is no group with the given name
-	 */
-	private void addToGroup(String groupName, IContributionItem item,
-			boolean append) {
-		int i;
-		Iterator items = contributions.iterator();
-		for (i = 0; items.hasNext(); i++) {
-			IContributionItem o = (IContributionItem) items.next();
-			if (o.isGroupMarker()) {
-				String id = o.getId();
-				if (id != null && id.equalsIgnoreCase(groupName)) {
-					i++;
-					if (append) {
-						for (; items.hasNext(); i++) {
-							IContributionItem ci = (IContributionItem) items
-									.next();
-							if (ci.isGroupMarker()) {
-								break;
-							}
-						}
-					}
-					if (allowItem(item)) {
-						contributions.add(i, item);
-						itemAdded(item);
-					}
-					return;
-				}
-			}
-		}
-		throw new IllegalArgumentException("Group not found: " + groupName);//$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public void appendToGroup(String groupName, IAction action) {
-		addToGroup(groupName, new ActionContributionItem(action), true);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public void appendToGroup(String groupName, IContributionItem item) {
-		addToGroup(groupName, item, true);
-	}
-
-	/**
-	 * This method allows subclasses of <code>ContributionManager</code> to
-	 * prevent certain items in the contributions list.
-	 * <code>ContributionManager</code> will either block or allow an addition
-	 * based on the result of this method call. This can be used to prevent
-	 * duplication, for example.
-	 * 
-	 * @param itemToAdd
-	 *            The contribution item to be added; may be <code>null</code>.
-	 * @return <code>true</code> if the addition should be allowed;
-	 *         <code>false</code> otherwise. The default implementation allows
-	 *         all items.
-	 * @since 3.0
-	 */
-	protected boolean allowItem(IContributionItem itemToAdd) {
-		return true;
-	}
-
-	/**
-	 * Internal debug method for printing statistics about this manager to
-	 * <code>System.out</code>.
-	 */
-	protected void dumpStatistics() {
-		int size = 0;
-		if (contributions != null) {
-			size = contributions.size();
-		}
-
-		System.out.println(this.toString());
-		System.out.println("   Number of elements: " + size);//$NON-NLS-1$
-		int sum = 0;
-		for (int i = 0; i < size; i++) {
-			if (((IContributionItem) contributions.get(i)).isVisible()) {
-				sum++;
-			}
-		}
-		System.out.println("   Number of visible elements: " + sum);//$NON-NLS-1$
-		System.out.println("   Is dirty: " + isDirty()); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public IContributionItem find(String id) {
-		Iterator e = contributions.iterator();
-		while (e.hasNext()) {
-			IContributionItem item = (IContributionItem) e.next();
-			String itemId = item.getId();
-			if (itemId != null && itemId.equalsIgnoreCase(id)) {
-				return item;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public IContributionItem[] getItems() {
-		IContributionItem[] items = new IContributionItem[contributions.size()];
-		contributions.toArray(items);
-		return items;
-	}
-	
-	/**
-	 * Return the number of contributions in this manager.
-	 * 
-	 * @return the number of contributions in this manager
-	 * @since 3.3
-	 */
-	public int getSize() {
-		return contributions.size();
-	}
-
-	/**
-	 * The <code>ContributionManager</code> implementation of this method
-	 * declared on <code>IContributionManager</code> returns the current
-	 * overrides. If there is no overrides it lazily creates one which overrides
-	 * no item state.
-	 * 
-	 * @since 2.0
-	 */
-	public IContributionManagerOverrides getOverrides() {
-		if (overrides == null) {
-			overrides = new IContributionManagerOverrides() {
-				public Boolean getEnabled(IContributionItem item) {
-					return null;
-				}
-
-				public Integer getAccelerator(IContributionItem item) {
-					return null;
-				}
-
-				public String getAcceleratorText(IContributionItem item) {
-					return null;
-				}
-
-				public String getText(IContributionItem item) {
-					return null;
-				}
-
-				public Boolean getVisible(IContributionItem item) {
-					return null;
-				}
-			};
-		}
-		return overrides;
-	}
-
-	/**
-	 * Returns whether this contribution manager contains dynamic items. A
-	 * dynamic contribution item contributes items conditionally, dependent on
-	 * some internal state.
-	 * 
-	 * @return <code>true</code> if this manager contains dynamic items, and
-	 *         <code>false</code> otherwise
-	 */
-	protected boolean hasDynamicItems() {
-		return (dynamicItems > 0);
-	}
-
-	/**
-	 * Returns the index of the item with the given id.
-	 * 
-	 * @param id
-	 *            The id of the item whose index is requested.
-	 * 
-	 * @return <code>int</code> the index or -1 if the item is not found
-	 */
-	public int indexOf(String id) {
-		for (int i = 0; i < contributions.size(); i++) {
-			IContributionItem item = (IContributionItem) contributions.get(i);
-			String itemId = item.getId();
-			if (itemId != null && itemId.equalsIgnoreCase(id)) {
-				return i;
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * Returns the index of the object in the internal structure. This is
-	 * different from <code>indexOf(String id)</code> since some contribution
-	 * items may not have an id.
-	 * 
-	 * @param item
-	 *            The contribution item
-	 * @return the index, or -1 if the item is not found
-	 * @since 3.0
-	 */
-	protected int indexOf(IContributionItem item) {
-		return contributions.indexOf(item);
-	}
-
-	/**
-	 * Insert the item at the given index.
-	 * 
-	 * @param index
-	 *            The index to be used for insertion
-	 * @param item
-	 *            The item to be inserted
-	 */
-	public void insert(int index, IContributionItem item) {
-		if (index > contributions.size()) {
-			throw new IndexOutOfBoundsException(
-					"inserting " + item.getId() + " at " + index); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		if (allowItem(item)) {
-			contributions.add(index, item);
-			itemAdded(item);
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public void insertAfter(String ID, IAction action) {
-		insertAfter(ID, new ActionContributionItem(action));
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public void insertAfter(String ID, IContributionItem item) {
-		IContributionItem ci = find(ID);
-		if (ci == null) {
-			throw new IllegalArgumentException("can't find ID" + ID);//$NON-NLS-1$
-		}
-		int ix = contributions.indexOf(ci);
-		if (ix >= 0) {
-			// System.out.println("insert after: " + ix);
-			if (allowItem(item)) {
-				contributions.add(ix + 1, item);
-				itemAdded(item);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public void insertBefore(String ID, IAction action) {
-		insertBefore(ID, new ActionContributionItem(action));
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public void insertBefore(String ID, IContributionItem item) {
-		IContributionItem ci = find(ID);
-		if (ci == null) {
-			throw new IllegalArgumentException("can't find ID " + ID);//$NON-NLS-1$
-		}
-		int ix = contributions.indexOf(ci);
-		if (ix >= 0) {
-			// System.out.println("insert before: " + ix);
-			if (allowItem(item)) {
-				contributions.add(ix, item);
-				itemAdded(item);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public boolean isDirty() {
-		if (isDirty) {
-			return true;
-		}
-		if (hasDynamicItems()) {
-			for (Iterator iter = contributions.iterator(); iter.hasNext();) {
-				IContributionItem item = (IContributionItem) iter.next();
-				if (item.isDirty()) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public boolean isEmpty() {
-		return contributions.isEmpty();
-	}
-
-	/**
-	 * The given item was added to the list of contributions. Marks the manager
-	 * as dirty and updates the number of dynamic items, and the memento.
-	 * 
-	 * @param item
-	 *            the item to be added
-	 * 
-	 */
-	protected void itemAdded(IContributionItem item) {
-		item.setParent(this);
-		markDirty();
-		if (item.isDynamic()) {
-			dynamicItems++;
-		}
-	}
-
-	/**
-	 * The given item was removed from the list of contributions. Marks the
-	 * manager as dirty and updates the number of dynamic items.
-	 * 
-	 * @param item
-	 *            remove given parent from list of contributions
-	 */
-	protected void itemRemoved(IContributionItem item) {
-		item.setParent(null);
-		markDirty();
-		if (item.isDynamic()) {
-			dynamicItems--;
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public void markDirty() {
-		setDirty(true);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public void prependToGroup(String groupName, IAction action) {
-		addToGroup(groupName, new ActionContributionItem(action), false);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public void prependToGroup(String groupName, IContributionItem item) {
-		addToGroup(groupName, item, false);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public IContributionItem remove(String ID) {
-		IContributionItem ci = find(ID);
-		if (ci == null) {
-			return null;
-		}
-		return remove(ci);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public IContributionItem remove(IContributionItem item) {
-		if (contributions.remove(item)) {
-			itemRemoved(item);
-			return item;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public void removeAll() {
-		IContributionItem[] items = getItems();
-		contributions.clear();
-		for (int i = 0; i < items.length; i++) {
-			IContributionItem item = items[i];
-			itemRemoved(item);
-		}
-		dynamicItems = 0;
-		markDirty();
-	}
-
-	/**
-	 * Replaces the item of the given identifier with another contribution item.
-	 * This can be used, for example, to replace large contribution items with
-	 * placeholders to avoid memory leaks. If the identifier cannot be found in
-	 * the current list of items, then this does nothing. If multiple
-	 * occurrences are found, then the replacement items is put in the first
-	 * position and the other positions are removed.
-	 * 
-	 * @param identifier
-	 *            The identifier to look for in the list of contributions;
-	 *            should not be <code>null</code>.
-	 * @param replacementItem
-	 *            The contribution item to replace the old item; must not be
-	 *            <code>null</code>. Use
-	 *            {@link org.eclipse.jface.action.ContributionManager#remove(java.lang.String) remove}
-	 *            if that is what you want to do.
-	 * @return <code>true</code> if the given identifier can be; <code>
-	 * @since 3.0
-	 */
-	public boolean replaceItem(final String identifier,
-			final IContributionItem replacementItem) {
-		if (identifier == null) {
-			return false;
-		}
-
-		final int index = indexOf(identifier);
-		if (index < 0) {
-			return false; // couldn't find the item.
-		}
-
-		// Remove the old item.
-		final IContributionItem oldItem = (IContributionItem) contributions
-				.get(index);
-		itemRemoved(oldItem);
-
-		// Add the new item.
-		contributions.set(index, replacementItem);
-		itemAdded(replacementItem); // throws NPE if (replacementItem == null)
-
-		// Go through and remove duplicates.
-		for (int i = contributions.size() - 1; i > index; i--) {
-			IContributionItem item = (IContributionItem) contributions.get(i);
-			if ((item != null) && (identifier.equals(item.getId()))) {
-				if (Policy.TRACE_TOOLBAR) {
-					System.out
-							.println("Removing duplicate on replace: " + identifier); //$NON-NLS-1$
-				}
-				contributions.remove(i);
-				itemRemoved(item);
-			}
-		}
-
-		return true; // success
-	}
-
-	/**
-	 * Sets whether this manager is dirty. When dirty, the list of contributions
-	 * is not accurately reflected in the corresponding widgets.
-	 * 
-	 * @param dirty
-	 *            <code>true</code> if this manager is dirty, and
-	 *            <code>false</code> if it is up-to-date
-	 */
-	protected void setDirty(boolean dirty) {
-		isDirty = dirty;
-	}
-
-	/**
-	 * Sets the overrides for this contribution manager
-	 * 
-	 * @param newOverrides
-	 *            the overrides for the items of this manager
-	 * @since 2.0
-	 */
-	public void setOverrides(IContributionManagerOverrides newOverrides) {
-		overrides = newOverrides;
-	}
-
-	/**
-	 * An internal method for setting the order of the contribution items.
-	 * 
-	 * @param items
-	 *            the contribution items in the specified order
-	 * @since 3.0
-	 */
-	protected void internalSetItems(IContributionItem[] items) {
-		contributions.clear();
-		for (int i = 0; i < items.length; i++) {
-			if (allowItem(items[i])) {
-				contributions.add(items[i]);
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ControlContribution.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ControlContribution.java
deleted file mode 100644
index 0af50ce..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ControlContribution.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * An abstract contribution item implementation for adding an arbitrary 
- * SWT control to a tool bar. 
- * Note, however, that these items cannot be contributed to menu bars.
- * <p>
- * The <code>createControl</code> framework method must be implemented
- * by concrete subclasses.
- * </p>
- */
-public abstract class ControlContribution extends ContributionItem {
-    /**
-     * Creates a control contribution item with the given id.
-     *
-     * @param id the contribution item id
-     */
-    protected ControlContribution(String id) {
-        super(id);
-    }
-
-    /**
-     * Computes the width of the given control which is being added
-     * to a tool bar.  This is needed to determine the width of the tool bar item
-     * containing the given control.
-     * <p>
-     * The default implementation of this framework method returns 
-     * <code>control.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x</code>.
-     * Subclasses may override if required.
-     * </p>
-     *
-     * @param control the control being added
-     * @return the width of the control
-     */
-    protected int computeWidth(Control control) {
-        return control.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x;
-    }
-
-    /**
-     * Creates and returns the control for this contribution item
-     * under the given parent composite.
-     * <p>
-     * This framework method must be implemented by concrete
-     * subclasses.
-     * </p>
-     *
-     * @param parent the parent composite
-     * @return the new control
-     */
-    protected abstract Control createControl(Composite parent);
-
-    /**
-     * The control item implementation of this <code>IContributionItem</code>
-     * method calls the <code>createControl</code> framework method.
-     * Subclasses must implement <code>createControl</code> rather than
-     * overriding this method.
-     */
-    public final void fill(Composite parent) {
-        createControl(parent);
-    }
-
-    /**
-     * The control item implementation of this <code>IContributionItem</code>
-     * method throws an exception since controls cannot be added to menus.
-     */
-    public final void fill(Menu parent, int index) {
-        Assert.isTrue(false, "Can't add a control to a menu");//$NON-NLS-1$
-    }
-
-    /**
-     * The control item implementation of this <code>IContributionItem</code>
-     * method calls the <code>createControl</code> framework method to
-     * create a control under the given parent, and then creates
-     * a new tool item to hold it.
-     * Subclasses must implement <code>createControl</code> rather than
-     * overriding this method.
-     */
-    public final void fill(ToolBar parent, int index) {
-        Control control = createControl(parent);
-        ToolItem ti = new ToolItem(parent, SWT.SEPARATOR, index);
-        ti.setControl(control);
-        ti.setWidth(computeWidth(control));
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/CoolBarManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/CoolBarManager.java
deleted file mode 100644
index 29e9ccb..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/CoolBarManager.java
+++ /dev/null
@@ -1,1062 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.internal.provisional.action.IToolBarManager2;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.CoolBar;
-import org.eclipse.swt.widgets.CoolItem;
-import org.eclipse.swt.widgets.Menu;
-
-/**
- * A cool bar manager is a contribution manager which realizes itself and its
- * items in a cool bar control.
- * <p>
- * This class may be instantiated; it may also be subclassed.
- * </p>
- * 
- * @since 3.0
- */
-public class CoolBarManager extends ContributionManager implements
-        ICoolBarManager {
-
-    /**
-     * A separator created by the end user.
-     */
-    public final static String USER_SEPARATOR = "UserSeparator"; //$NON-NLS-1$
-
-    /**
-     * The original creation order of the contribution items.
-     */
-    private ArrayList cbItemsCreationOrder = new ArrayList();
-
-    /**
-     * MenuManager for cool bar pop-up menu, or null if none.
-     */
-    private MenuManager contextMenuManager = null;
-
-    /**
-     * The cool bar control; <code>null</code> before creation and after
-     * disposal.
-     */
-    private CoolBar coolBar = null;
-
-    /**
-     * The cool bar items style; <code>SWT.NONE</code> by default.
-     */
-    private int itemStyle = SWT.NONE;
-
-    /**
-     * Creates a new cool bar manager with the default style. Equivalent to
-     * <code>CoolBarManager(SWT.NONE)</code>.
-     */
-    public CoolBarManager() {
-        // do nothing
-    }
-
-    /**
-     * Creates a cool bar manager for an existing cool bar control. This
-     * manager becomes responsible for the control, and will dispose of it when
-     * the manager is disposed.
-     * 
-     * @param coolBar
-     *            the cool bar control
-     */
-    public CoolBarManager(CoolBar coolBar) {
-        this();
-        Assert.isNotNull(coolBar);
-        this.coolBar = coolBar;
-        itemStyle = coolBar.getStyle();
-    }
-
-    /**
-     * Creates a cool bar manager with the given SWT style. Calling <code>createControl</code>
-     * will create the cool bar control.
-     * 
-     * @param style
-     *            the cool bar item style; see
-     *            {@link org.eclipse.swt.widgets.CoolBar CoolBar}for for valid
-     *            style bits
-     */
-    public CoolBarManager(int style) {
-        itemStyle = style;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.ICoolBarManager#add(org.eclipse.jface.action.IToolBarManager)
-     */
-    public void add(IToolBarManager toolBarManager) {
-        Assert.isNotNull(toolBarManager);
-        super.add(new ToolBarContributionItem(toolBarManager));
-    }
-
-    /**
-     * Collapses consecutive separators and removes a separator from the
-     * beginning and end of the list.
-     * 
-     * @param contributionList
-     *            the list of contributions; must not be <code>null</code>.
-     * @return The contribution list provided with extraneous separators
-     *         removed; this value is never <code>null</code>, but may be
-     *         empty.
-     */
-    private ArrayList adjustContributionList(ArrayList contributionList) {
-        IContributionItem item;
-        // Fist remove a separator if it is the first element of the list
-        if (contributionList.size() != 0) {
-            item = (IContributionItem) contributionList.get(0);
-            if (item.isSeparator()) {
-                contributionList.remove(0);
-            }
-
-            ListIterator iterator = contributionList.listIterator();
-            // collapse consecutive separators
-            while (iterator.hasNext()) {
-                item = (IContributionItem) iterator.next();
-                if (item.isSeparator()) {
-                    while (iterator.hasNext()) {
-                        item = (IContributionItem) iterator.next();
-                        if (item.isSeparator()) {
-                            iterator.remove();
-                        } else {
-                            break;
-                        }
-                    }
-
-                }
-            }
-            // Now check last element to see if there is a separator
-            item = (IContributionItem) contributionList.get(contributionList
-                    .size() - 1);
-            if (item.isSeparator()) {
-                contributionList.remove(contributionList.size() - 1);
-            }
-        }
-        return contributionList;
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.ContributionManager#checkDuplication(org.eclipse.jface.action.IContributionItem)
-     */
-    protected boolean allowItem(IContributionItem itemToAdd) {
-        /* We will allow as many null entries as they like, though there should
-         * be none.
-         */
-        if (itemToAdd == null) {
-            return true;
-        }
-
-        /* Null identifiers can be expected in generic contribution items.
-         */
-        String firstId = itemToAdd.getId();
-        if (firstId == null) {
-            return true;
-        }
-
-        // Cycle through the current list looking for duplicates.
-        IContributionItem[] currentItems = getItems();
-        for (int i = 0; i < currentItems.length; i++) {
-            IContributionItem currentItem = currentItems[i];
-
-            // We ignore null entries.
-            if (currentItem == null) {
-                continue;
-            }
-
-            String secondId = currentItem.getId();
-            if (firstId.equals(secondId)) {
-                if (Policy.TRACE_TOOLBAR) { 
-                    System.out.println("Trying to add a duplicate item."); //$NON-NLS-1$
-                    new Exception().printStackTrace(System.out);
-                    System.out.println("DONE --------------------------"); //$NON-NLS-1$
-                }
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Positions the list iterator to the end of all the separators. Calling
-     * <code>next()</code> the iterator should return the immediate object
-     * following the last separator.
-     * 
-     * @param iterator
-     *            the list iterator.
-     */
-    private void collapseSeparators(ListIterator iterator) {
-
-        while (iterator.hasNext()) {
-            IContributionItem item = (IContributionItem) iterator.next();
-            if (!item.isSeparator()) {
-                iterator.previous();
-                return;
-            }
-        }
-    }
-
-    /**
-     * Returns whether the cool bar control has been created and not yet
-     * disposed.
-     * 
-     * @return <code>true</code> if the control has been created and not yet
-     *         disposed, <code>false</code> otherwise
-     */
-    private boolean coolBarExist() {
-        return coolBar != null && !coolBar.isDisposed();
-    }
-
-    /**
-     * Creates and returns this manager's cool bar control. Does not create a
-     * new control if one already exists.
-     * 
-     * @param parent
-     *            the parent control
-     * @return the cool bar control
-     */
-    public CoolBar createControl(Composite parent) {
-        Assert.isNotNull(parent);
-        if (!coolBarExist()) {
-            coolBar = new CoolBar(parent, itemStyle);
-            coolBar.setMenu(getContextMenuControl());
-            coolBar.setLocked(false);
-            update(false);
-        }
-        return coolBar;
-    }
-
-    /**
-     * Disposes of this cool bar manager and frees all allocated SWT resources.
-     * Notifies all contribution items of the dispose. Note that this method
-     * does not clean up references between this cool bar manager and its
-     * associated contribution items. Use <code>removeAll</code> for that
-     * purpose.
-     */
-    public void dispose() {
-        if (coolBarExist()) {
-            coolBar.dispose();
-            coolBar = null;
-        }
-        IContributionItem[] items = getItems();
-        for (int i = 0; i < items.length; i++) {
-            // Disposes of the contribution item.
-            // If Contribution Item is a toolbar then it will dispose of
-            // all the nested
-            // contribution items.
-            items[i].dispose();
-        }
-        // If a context menu existed then dispose of it.
-        if (contextMenuManager != null) {
-            contextMenuManager.dispose();
-            contextMenuManager = null;
-        }
-
-    }
-
-    /**
-     * Disposes the given cool item.
-     * 
-     * @param item
-     *            the cool item to dispose
-     */
-    private void dispose(CoolItem item) {
-        if ((item != null) && !item.isDisposed()) {
-
-            item.setData(null);
-            Control control = item.getControl();
-            // if the control is already disposed, setting the coolitem
-            // control to null will cause an SWT exception, workaround
-            // for 19630
-            if ((control != null) && !control.isDisposed()) {
-                item.setControl(null);
-            }
-            item.dispose();
-        }
-    }
-
-    /**
-     * Finds the cool item associated with the given contribution item.
-     * 
-     * @param item
-     *            the contribution item
-     * @return the associated cool item, or <code>null</code> if not found
-     */
-    private CoolItem findCoolItem(IContributionItem item) {
-        CoolItem[] coolItems = (coolBar == null) ? null : coolBar.getItems(); 
-        return findCoolItem(coolItems, item);
-    }
-    
-    private CoolItem findCoolItem(CoolItem[] items, IContributionItem item) {
-        if (items == null) {
-			return null;
-		}
-
-        for (int i = 0; i < items.length; i++) {
-            CoolItem coolItem = items[i];
-            IContributionItem data = (IContributionItem) coolItem.getData();
-            if (data != null && data.equals(item)) {
-				return coolItem;
-			}
-        }
-        return null;
-    }
-
-    /**
-     * Return a consistent set of wrap indices. The return value will always
-     * include at least one entry and the first entry will always be zero.
-     * CoolBar.getWrapIndices() is inconsistent in whether or not it returns an
-     * index for the first row.
-     * 
-     * @param wraps
-     *            the wrap indicies from the cool bar widget
-     * @return the adjusted wrap indicies.
-     */
-    private int[] getAdjustedWrapIndices(int[] wraps) {
-        int[] adjustedWrapIndices;
-        if (wraps.length == 0) {
-            adjustedWrapIndices = new int[] { 0 };
-        } else {
-            if (wraps[0] != 0) {
-                adjustedWrapIndices = new int[wraps.length + 1];
-                adjustedWrapIndices[0] = 0;
-                for (int i = 0; i < wraps.length; i++) {
-                    adjustedWrapIndices[i + 1] = wraps[i];
-                }
-            } else {
-                adjustedWrapIndices = wraps;
-            }
-        }
-        return adjustedWrapIndices;
-    }
-
-    /**
-     * Returns the control of the Menu Manager. If the menu manager does not
-     * have a control then one is created.
-     * 
-     * @return menu control associated with manager, or null if none
-     */
-    private Menu getContextMenuControl() {
-        if ((contextMenuManager != null) && (coolBar != null)) {
-            Menu menuWidget = contextMenuManager.getMenu();
-            if ((menuWidget == null) || (menuWidget.isDisposed())) {
-                menuWidget = contextMenuManager.createContextMenu(coolBar);
-            }
-            return menuWidget;
-        }
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.ICoolBarManager#isLayoutLocked()
-     */
-    public IMenuManager getContextMenuManager() {
-        return contextMenuManager;
-    }
-
-    /**
-     * Returns the cool bar control for this manager.
-     * 
-     * @return the cool bar control, or <code>null</code> if none
-     */
-    public CoolBar getControl() {
-        return coolBar;
-    }
-
-    /**
-     * Returns an array list of all the contribution items in the manager.
-     * 
-     * @return an array list of contribution items.
-     */
-    private ArrayList getItemList() {
-        IContributionItem[] cbItems = getItems();
-        ArrayList list = new ArrayList(cbItems.length);
-        for (int i = 0; i < cbItems.length; i++) {
-            list.add(cbItems[i]);
-        }
-        return list;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.ICoolBarManager#isLayoutLocked()
-     */
-    public boolean getLockLayout() {
-        if (!coolBarExist()) {
-            return false;
-        }
-        return coolBar.getLocked();
-    }
-
-    /**
-     * Returns the number of rows that should be displayed visually.
-     * 
-     * @param items
-     *            the array of contributin items
-     * @return the number of rows
-     */
-    private int getNumRows(IContributionItem[] items) {
-        int numRows = 1;
-        boolean separatorFound = false;
-        for (int i = 0; i < items.length; i++) {
-            if (items[i].isSeparator()) {
-                separatorFound = true;
-            }
-            if ((separatorFound) && (isChildVisible(items[i]))
-                    && (!items[i].isGroupMarker()) && (!items[i].isSeparator())) {
-                numRows++;
-                separatorFound = false;
-            }
-        }
-        return numRows;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.ICoolBarManager#getStyle()
-     */
-    public int getStyle() {
-        return itemStyle;
-    }
-
-    /**
-     * Subclasses may extend this <code>ContributionManager</code> method,
-     * but must call <code>super.itemAdded</code>.
-     * 
-     * @see org.eclipse.jface.action.ContributionManager#itemAdded(org.eclipse.jface.action.IContributionItem)
-     */
-    protected void itemAdded(IContributionItem item) {
-        Assert.isNotNull(item);
-        super.itemAdded(item);
-        int insertedAt = indexOf(item);
-        boolean replaced = false;
-        final int size = cbItemsCreationOrder.size();
-        for (int i = 0; i < size; i++) {
-            IContributionItem created = (IContributionItem) cbItemsCreationOrder
-                    .get(i);
-            if (created.getId() != null && created.getId().equals(item.getId())) {
-                cbItemsCreationOrder.set(i, item);
-                replaced = true;
-                break;
-            }
-        }
-
-        if (!replaced) {
-            cbItemsCreationOrder.add(Math.min(Math.max(insertedAt, 0),
-                    cbItemsCreationOrder.size()), item);
-        }
-    }
-
-    /**
-     * Subclasses may extend this <code>ContributionManager</code> method,
-     * but must call <code>super.itemRemoved</code>.
-     * 
-     * @see org.eclipse.jface.action.ContributionManager#itemRemoved(org.eclipse.jface.action.IContributionItem)
-     */
-    protected void itemRemoved(IContributionItem item) {
-        Assert.isNotNull(item);
-        super.itemRemoved(item);
-        CoolItem coolItem = findCoolItem(item);
-        if (coolItem != null) {
-            coolItem.setData(null);
-        }
-    }
-
-    /**
-     * Positions the list iterator to the starting of the next row. By calling
-     * next on the returned iterator, it will return the first element of the
-     * next row.
-     * 
-     * @param iterator
-     *            the list iterator of contribution items
-     * @param ignoreCurrentItem
-     *            Whether the current item in the iterator should be considered
-     *            (as well as subsequent items).
-     */
-    private void nextRow(ListIterator iterator, boolean ignoreCurrentItem) {
-
-        IContributionItem currentElement = null;
-        if (!ignoreCurrentItem && iterator.hasPrevious()) {
-            currentElement = (IContributionItem) iterator.previous();
-            iterator.next();
-        }
-
-        if ((currentElement != null) && (currentElement.isSeparator())) {
-            collapseSeparators(iterator);
-            return;
-        } 
-
-        //Find next separator
-        while (iterator.hasNext()) {
-            IContributionItem item = (IContributionItem) iterator.next();
-            if (item.isSeparator()) {
-                // we we find a separator, collapse any consecutive
-                // separators
-                // and return
-                collapseSeparators(iterator);
-                return;
-            }
-        }
-    }
-
-    /*
-     * Used for debuging. Prints all the items in the internal structures.
-     */
-    //    private void printContributions(ArrayList contributionList) {
-    //        int index = 0;
-    //        System.out.println("----------------------------------\n"); //$NON-NLS-1$
-    //        for (Iterator i = contributionList.iterator(); i.hasNext(); index++) {
-    //            IContributionItem item = (IContributionItem) i.next();
-    //            if (item.isSeparator()) {
-    //                System.out.println("Separator"); //$NON-NLS-1$
-    //            } else {
-    //                System.out.println(index + ". Item id: " + item.getId() //$NON-NLS-1$
-    //                        + " - is Visible: " //$NON-NLS-1$
-    //                        + item.isVisible());
-    //            }
-    //        }
-    //    }
-    /**
-     * Synchronizes the visual order of the cool items in the control with this
-     * manager's internal data structures. This method should be called before
-     * requesting the order of the contribution items to ensure that the order
-     * is accurate.
-     * <p>
-     * Note that <code>update()</code> and <code>refresh()</code> are
-     * converses: <code>update()</code> changes the visual order to match the
-     * internal structures, and <code>refresh</code> changes the internal
-     * structures to match the visual order.
-     * </p>
-     */
-    public void refresh() {
-        if (!coolBarExist()) {
-            return;
-        }
-
-        // Retreives the list of contribution items as an array list
-        ArrayList contributionList = getItemList();
-
-        // Check the size of the list
-        if (contributionList.size() == 0) {
-			return;
-		}
-
-        // The list of all the cool items in their visual order
-        CoolItem[] coolItems = coolBar.getItems();
-        // The wrap indicies of the coolbar
-        int[] wrapIndicies = getAdjustedWrapIndices(coolBar.getWrapIndices());
-
-        int row = 0;
-        int coolItemIndex = 0;
-
-        // Traverse through all cool items in the coolbar add them to a new
-        // data structure
-        // in the correct order
-        ArrayList displayedItems = new ArrayList(coolBar.getItemCount());
-        for (int i = 0; i < coolItems.length; i++) {
-            CoolItem coolItem = coolItems[i];
-            if (coolItem.getData() instanceof IContributionItem) {
-                IContributionItem cbItem = (IContributionItem) coolItem
-                        .getData();
-                displayedItems.add(Math.min(i, displayedItems.size()), cbItem);
-            }
-        }
-
-        // Add separators to the displayed Items data structure
-        int offset = 0;
-        for (int i = 1; i < wrapIndicies.length; i++) {
-            int insertAt = wrapIndicies[i] + offset;
-            displayedItems.add(insertAt, new Separator(USER_SEPARATOR));
-            offset++;
-        }
-
-        // Determine which rows are invisible
-        ArrayList existingVisibleRows = new ArrayList(4);
-        ListIterator rowIterator = contributionList.listIterator();
-        collapseSeparators(rowIterator);
-        int numRow = 0;
-        while (rowIterator.hasNext()) {
-            // Scan row
-            while (rowIterator.hasNext()) {
-                IContributionItem cbItem = (IContributionItem) rowIterator
-                        .next();
-                if (displayedItems.contains(cbItem)) {
-                    existingVisibleRows.add(new Integer(numRow));
-                    break;
-                }
-                if (cbItem.isSeparator()) {
-                    break;
-                }
-            }
-            nextRow(rowIterator, false);
-            numRow++;
-        }
-
-        Iterator existingRows = existingVisibleRows.iterator();
-        // Adjust row number to the first visible
-        if (existingRows.hasNext()) {
-            row = ((Integer) existingRows.next()).intValue();
-        }
-
-        HashMap itemLocation = new HashMap();
-        for (ListIterator locationIterator = displayedItems.listIterator(); locationIterator
-                .hasNext();) {
-            IContributionItem item = (IContributionItem) locationIterator
-                    .next();
-            if (item.isSeparator()) {
-                if (existingRows.hasNext()) {
-                    Integer value = (Integer) existingRows.next();
-                    row = value.intValue();
-                } else {
-                    row++;
-                }
-            } else {
-                itemLocation.put(item, new Integer(row));
-            }
-
-        }
-
-        // Insert the contribution items in their correct location
-        for (ListIterator iterator = displayedItems.listIterator(); iterator
-                .hasNext();) {
-            IContributionItem cbItem = (IContributionItem) iterator.next();
-            if (cbItem.isSeparator()) {
-                coolItemIndex = 0;
-            } else {
-                relocate(cbItem, coolItemIndex, contributionList, itemLocation);
-                cbItem.saveWidgetState();
-                coolItemIndex++;
-            }
-        }
-
-        if (contributionList.size() != 0) {
-            contributionList = adjustContributionList(contributionList);
-            IContributionItem[] array = new IContributionItem[contributionList
-                    .size() - 1];
-            array = (IContributionItem[]) contributionList.toArray(array);
-            internalSetItems(array);
-        }
-
-    }
-
-    /**
-     * Relocates the given contribution item to the specified index.
-     * 
-     * @param cbItem
-     *            the conribution item to relocate
-     * @param index
-     *            the index to locate this item
-     * @param contributionList
-     *            the current list of conrtributions
-     * @param itemLocation
-     */
-    private void relocate(IContributionItem cbItem, int index,
-            ArrayList contributionList, HashMap itemLocation) {
-
-        if (!(itemLocation.get(cbItem) instanceof Integer)) {
-			return;
-		}
-        int targetRow = ((Integer) itemLocation.get(cbItem)).intValue();
-
-        int cbInternalIndex = contributionList.indexOf(cbItem);
-
-        //	by default add to end of list
-        int insertAt = contributionList.size();
-        // Find the row to place this item in.
-        ListIterator iterator = contributionList.listIterator();
-        // bypass any separators at the begining
-        collapseSeparators(iterator);
-        int currentRow = -1;
-        while (iterator.hasNext()) {
-
-            currentRow++;
-            if (currentRow == targetRow) {
-                // We found the row to insert the item
-                int virtualIndex = 0;
-                insertAt = iterator.nextIndex();
-                // first check the position of the current element (item)
-                // then get the next element
-                while (iterator.hasNext()) {
-                    IContributionItem item = (IContributionItem) iterator
-                            .next();
-                    Integer itemRow = (Integer) itemLocation.get(item);
-                    if (item.isSeparator()) {
-						break;
-					}
-                    // if the item has an associate widget
-                    if ((itemRow != null) && (itemRow.intValue() == targetRow)) {
-                        // if the next element is the index we are looking for
-                        // then break
-                        if (virtualIndex >= index) {
-							break;
-						}
-                        virtualIndex++;
-
-                    }
-                    insertAt++;
-                }
-                // If we don't need to move it then we return
-                if (cbInternalIndex == insertAt) {
-					return;
-				}
-                break;
-            }
-            nextRow(iterator, true);
-        }
-        contributionList.remove(cbItem);
-
-        // Adjust insertAt index
-        if (cbInternalIndex < insertAt) {
-            insertAt--;
-        }
-
-        // if we didn't find the row then add a new row
-        if (currentRow != targetRow) {
-            contributionList.add(new Separator(USER_SEPARATOR));
-            insertAt = contributionList.size();
-        }
-        insertAt = Math.min(insertAt, contributionList.size());
-        contributionList.add(insertAt, cbItem);
-
-    }
-
-    /**
-     * Restores the canonical order of this cool bar manager. The canonical
-     * order is the order in which the contribution items where added.
-     */
-    public void resetItemOrder() {
-        for (ListIterator iterator = cbItemsCreationOrder.listIterator(); iterator
-                .hasNext();) {
-            IContributionItem item = (IContributionItem) iterator.next();
-            // if its a user separator then do not include in original order.
-            if ((item.getId() != null) && (item.getId().equals(USER_SEPARATOR))) {
-                iterator.remove();
-            }
-        }
-        IContributionItem[] itemsToSet = new IContributionItem[cbItemsCreationOrder
-                .size()];
-        cbItemsCreationOrder.toArray(itemsToSet);
-        setItems(itemsToSet);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.ICoolBarManager#setContextMenuManager(org.eclipse.jface.action.IMenuManager)
-     */
-    public void setContextMenuManager(IMenuManager contextMenuManager) {
-        this.contextMenuManager = (MenuManager) contextMenuManager;
-        if (coolBar != null) {
-            coolBar.setMenu(getContextMenuControl());
-        }
-    }
-
-    /**
-     * Replaces the current items with the given items.
-     * Forces an update.
-     * 
-     * @param newItems the items with which to replace the current items
-     */
-    public void setItems(IContributionItem[] newItems) {
-        // dispose of all the cool items on the cool bar manager
-        if (coolBar != null) {
-            CoolItem[] coolItems = coolBar.getItems();
-            for (int i = 0; i < coolItems.length; i++) {
-                dispose(coolItems[i]);
-            }
-        }
-        // Set the internal structure to this order
-        internalSetItems(newItems);
-        // Force and update
-        update(true);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.ICoolBarManager#lockLayout(boolean)
-     */
-    public void setLockLayout(boolean value) {
-        if (!coolBarExist()) {
-            return;
-        }
-        coolBar.setLocked(value);
-    }
-
-    /**
-     * Subclasses may extend this <code>IContributionManager</code> method,
-     * but must call <code>super.update</code>.
-     * 
-     * @see org.eclipse.jface.action.IContributionManager#update(boolean)
-     */
-    public void update(boolean force) {
-        if ((!isDirty() && !force) || (!coolBarExist())) {
-            return;
-        }
-
-        boolean relock = false;
-        boolean changed = false;
-
-        try {
-            coolBar.setRedraw(false);
-
-            // Refresh the widget data with the internal data structure.
-            refresh();
-
-            if (coolBar.getLocked()) {
-                coolBar.setLocked(false);
-                relock = true;
-            }
-
-            /*
-             * Make a list of items including only those items that are
-             * visible. Separators should stay because they mark line breaks in
-             * a cool bar.
-             */
-            final IContributionItem[] items = getItems();
-            final List visibleItems = new ArrayList(items.length);
-            for (int i = 0; i < items.length; i++) {
-                final IContributionItem item = items[i];
-                if (isChildVisible(item)) {
-                    visibleItems.add(item);
-                }
-            }
-
-            /*
-             * Make a list of CoolItem widgets in the cool bar for which there
-             * is no current visible contribution item. These are the widgets
-             * to be disposed. Dynamic items are also removed.
-             */
-            CoolItem[] coolItems = coolBar.getItems();
-            final ArrayList coolItemsToRemove = new ArrayList(coolItems.length);
-            for (int i = 0; i < coolItems.length; i++) {
-                final Object data = coolItems[i].getData();
-                if ((data == null)
-                        || (!visibleItems.contains(data))
-                        || ((data instanceof IContributionItem) && ((IContributionItem) data)
-                                .isDynamic())) {
-                    coolItemsToRemove.add(coolItems[i]);
-                }
-            }
-
-            // Dispose of any items in the list to be removed.
-            for (int i = coolItemsToRemove.size() - 1; i >= 0; i--) {
-                CoolItem coolItem = (CoolItem) coolItemsToRemove.get(i);
-                if (!coolItem.isDisposed()) {
-                    Control control = coolItem.getControl();
-                    if (control != null) {
-                        coolItem.setControl(null);
-                        control.dispose();
-                    }
-                    coolItem.dispose();
-                }
-            }
-
-            // Add any new items by telling them to fill.
-            coolItems = coolBar.getItems();
-            IContributionItem sourceItem;
-            IContributionItem destinationItem;
-            int sourceIndex = 0;
-            int destinationIndex = 0;
-            final Iterator visibleItemItr = visibleItems.iterator();
-            while (visibleItemItr.hasNext()) {
-                sourceItem = (IContributionItem) visibleItemItr.next();
-
-                // Retrieve the corresponding contribution item from SWT's
-                // data.
-                if (sourceIndex < coolItems.length) {
-                    destinationItem = (IContributionItem) coolItems[sourceIndex]
-                            .getData();
-                } else {
-                    destinationItem = null;
-                }
-
-                // The items match is they are equal or both separators.
-                if (destinationItem != null) {
-                    if (sourceItem.equals(destinationItem)) {
-                        sourceIndex++;
-                        destinationIndex++;
-                        sourceItem.update();
-                        continue;
-
-                    } else if ((destinationItem.isSeparator())
-                            && (sourceItem.isSeparator())) {
-                        coolItems[sourceIndex].setData(sourceItem);
-                        sourceIndex++;
-                        destinationIndex++;
-                        sourceItem.update();
-                        continue;
-
-                    }
-                }
-
-                // Otherwise, a new item has to be added.
-                final int start = coolBar.getItemCount();
-                IToolBarManager manager = ((ToolBarContributionItem)sourceItem).getToolBarManager();
-            	if(manager instanceof IToolBarManager2) {
-            		((IToolBarManager2)manager).setOverrides(getOverrides());
-            	}
-                sourceItem.fill(coolBar, destinationIndex);
-                final int newItems = coolBar.getItemCount() - start;
-                for (int i = 0; i < newItems; i++) {
-                    coolBar.getItem(destinationIndex++).setData(sourceItem);
-                }
-                changed = true;
-            }
-
-            // Remove any old widgets not accounted for.
-            for (int i = coolItems.length - 1; i >= sourceIndex; i--) {
-                final CoolItem item = coolItems[i];
-                if (!item.isDisposed()) {
-                    Control control = item.getControl();
-                    if (control != null) {
-                        item.setControl(null);
-                        control.dispose();
-                    }
-                    item.dispose();
-                    changed = true;
-                }
-            }
-
-            // Update wrap indices.
-            updateWrapIndices();
-
-            // Update the sizes.
-            for (int i = 0; i < items.length; i++) {
-                IContributionItem item = items[i];
-                item.update(SIZE);
-            }
-
-            // if the coolBar was previously locked then lock it
-            if (relock) {
-                coolBar.setLocked(true);
-            }
-
-            if (changed) {
-                updateTabOrder();
-            }
-
-            // We are no longer dirty.
-            setDirty(false);
-        } finally {
-            coolBar.setRedraw(true);
-        }
-    }
-
-    /**
-     * Sets the tab order of the coolbar to the visual order of its items.
-     */
-    /* package */void updateTabOrder() {
-        if (coolBar != null) {
-            CoolItem[] items = coolBar.getItems();
-            if (items != null) {
-                ArrayList children = new ArrayList(items.length);
-                for (int i = 0; i < items.length; i++) {
-                    if ((items[i].getControl() != null)
-                            && (!items[i].getControl().isDisposed())) {
-                        children.add(items[i].getControl());
-                    }
-                }
-                // Convert array
-                Control[] childrenArray = new Control[0];
-                childrenArray = (Control[]) children.toArray(childrenArray);
-
-                if (childrenArray != null) {
-                    coolBar.setTabList(childrenArray);
-                }
-
-            }
-        }
-    }
-
-    /**
-     * Updates the indices at which the cool bar should wrap.
-     */
-    private void updateWrapIndices() {
-        final IContributionItem[] items = getItems();
-        final int numRows = getNumRows(items) - 1;
-
-        // Generate the list of wrap indices.
-        final int[] wrapIndices = new int[numRows];
-        boolean foundSeparator = false;
-        int j = 0;
-        CoolItem[] coolItems = (coolBar == null) ? null : coolBar.getItems();
-
-        for (int i = 0; i < items.length; i++) {
-            IContributionItem item = items[i];
-            CoolItem coolItem = findCoolItem(coolItems, item);
-            if (item.isSeparator()) {
-                foundSeparator = true;
-            }
-            if ((!item.isSeparator()) && (!item.isGroupMarker())
-                    && (isChildVisible(item)) && (coolItem != null)
-                    && (foundSeparator)) {
-                wrapIndices[j] = coolBar.indexOf(coolItem);
-                j++;
-                foundSeparator = false;
-            }
-        }
-
-        /*
-         * Check to see if these new wrap indices are different than the old
-         * ones.
-         */
-        final int[] oldIndices = coolBar.getWrapIndices();
-        boolean shouldUpdate = false;
-        if (oldIndices.length == wrapIndices.length) {
-            for (int i = 0; i < oldIndices.length; i++) {
-                if (oldIndices[i] != wrapIndices[i]) {
-                    shouldUpdate = true;
-                    break;
-                }
-            }
-        } else {
-            shouldUpdate = true;
-        }
-
-        if (shouldUpdate) {
-            coolBar.setWrapIndices(wrapIndices);
-        }
-    }
-    
-	private boolean isChildVisible(IContributionItem item) {
-		Boolean v;
-		
-		IContributionManagerOverrides overrides = getOverrides();
-		if(overrides == null) {
-			v = null;
-		} else {
-			v = getOverrides().getVisible(item); 
-		}
-		
-		if (v != null) {
-			return v.booleanValue();
-		}
-		return item.isVisible();
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ExternalActionManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ExternalActionManager.java
deleted file mode 100644
index 058ce7a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ExternalActionManager.java
+++ /dev/null
@@ -1,789 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.action;
-
-import java.text.MessageFormat;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.ResourceBundle;
-import java.util.Set;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.CommandEvent;
-import org.eclipse.core.commands.CommandManager;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.ICommandListener;
-import org.eclipse.core.commands.NotEnabledException;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.bindings.BindingManager;
-import org.eclipse.jface.bindings.BindingManagerEvent;
-import org.eclipse.jface.bindings.IBindingManagerListener;
-import org.eclipse.jface.bindings.Trigger;
-import org.eclipse.jface.bindings.TriggerSequence;
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.jface.bindings.keys.SWTKeySupport;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.widgets.Event;
-
-/**
- * <p>
- * A manager for a callback facility which is capable of querying external
- * interfaces for additional information about actions and action contribution
- * items. This information typically includes things like accelerators and
- * textual representations.
- * </p>
- * <p>
- * <em>It is only necessary to use this mechanism if you will be using a mix of
- * actions and commands, and wish the interactions to work properly.</em>
- * </p>
- * <p>
- * For example, in the Eclipse workbench, this mechanism is used to allow the
- * command architecture to override certain values in action contribution items.
- * </p>
- * <p>
- * This class is not intended to be called or extended by any external clients.
- * </p>
- * 
- * @since 3.0
- */
-public final class ExternalActionManager {
-
-	/**
-	 * A simple implementation of the <code>ICallback</code> mechanism that
-	 * simply takes a <code>BindingManager</code> and a
-	 * <code>CommandManager</code>.
-	 * <p>
-	 * <b>Note:</b> this class is not intended to be subclassed by clients.
-	 * </p>
-	 * 
-	 * @since 3.1
-	 */
-	public static class CommandCallback implements
-			IBindingManagerListener, IBindingManagerCallback, IExecuteCallback {
-
-		/**
-		 * The internationalization bundle for text produced by this class.
-		 */
-		private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-				.getBundle(ExternalActionManager.class.getName());
-
-		/**
-		 * The callback capable of responding to whether a command is active.
-		 */
-		private final IActiveChecker activeChecker;
-		
-		/**
-		 * Check the applicability of firing an execution event for an action.
-		 */
-		private final IExecuteApplicable applicabilityChecker;
-
-		/**
-		 * The binding manager for your application. Must not be
-		 * <code>null</code>.
-		 */
-		private final BindingManager bindingManager;
-
-		/**
-		 * Whether a listener has been attached to the binding manager yet.
-		 */
-		private boolean bindingManagerListenerAttached = false;
-
-		/**
-		 * The command manager for your application. Must not be
-		 * <code>null</code>.
-		 */
-		private final CommandManager commandManager;
-
-		/**
-		 * A set of all the command identifiers that have been logged as broken
-		 * so far. For each of these, there will be a listener on the
-		 * corresponding command. If the command ever becomes defined, the item
-		 * will be removed from this set and the listener removed. This value
-		 * may be empty, but never <code>null</code>.
-		 */
-		private final Set loggedCommandIds = new HashSet();
-
-		/**
-		 * The list of listeners that have registered for property change
-		 * notification. This is a map of command identifiers (<code>String</code>)
-		 * to listeners (<code>IPropertyChangeListener</code> or
-		 * <code>ListenerList</code> of <code>IPropertyChangeListener</code>).
-		 */
-		private final Map registeredListeners = new HashMap();
-
-		/**
-		 * Constructs a new instance of <code>CommandCallback</code> with the
-		 * workbench it should be using. All commands will be considered active.
-		 * 
-		 * @param bindingManager
-		 *            The binding manager which will provide the callback; must
-		 *            not be <code>null</code>.
-		 * @param commandManager
-		 *            The command manager which will provide the callback; must
-		 *            not be <code>null</code>.
-		 * 
-		 * @since 3.1
-		 */
-		public CommandCallback(final BindingManager bindingManager,
-				final CommandManager commandManager) {
-			this(bindingManager, commandManager, new IActiveChecker() {
-				public boolean isActive(String commandId) {
-					return true;
-				}
-
-			}, new IExecuteApplicable() {
-				public boolean isApplicable(IAction action) {
-					return true;
-				}
-			});
-		}
-		/**
-		 * Constructs a new instance of <code>CommandCallback</code> with the
-		 * workbench it should be using.
-		 * 
-		 * @param bindingManager
-		 *            The binding manager which will provide the callback; must
-		 *            not be <code>null</code>.
-		 * @param commandManager
-		 *            The command manager which will provide the callback; must
-		 *            not be <code>null</code>.
-		 * @param activeChecker
-		 *            The callback mechanism for checking whether a command is
-		 *            active; must not be <code>null</code>.
-		 * 
-		 * @since 3.1
-		 */
-		public CommandCallback(final BindingManager bindingManager,
-				final CommandManager commandManager,
-				final IActiveChecker activeChecker) {
-			this(bindingManager, commandManager, activeChecker,
-					new IExecuteApplicable() {
-				public boolean isApplicable(IAction action) {
-					return true;
-				}
-			});
-		}
-		/**
-		 * Constructs a new instance of <code>CommandCallback</code> with the
-		 * workbench it should be using.
-		 * 
-		 * @param bindingManager
-		 *            The binding manager which will provide the callback; must
-		 *            not be <code>null</code>.
-		 * @param commandManager
-		 *            The command manager which will provide the callback; must
-		 *            not be <code>null</code>.
-		 * @param activeChecker
-		 *            The callback mechanism for checking whether a command is
-		 *            active; must not be <code>null</code>.
-		 * @param checker
-		 *            The callback to check if an IAction should fire execution
-		 *            events.
-		 * 
-		 * @since 3.4
-		 */
-		public CommandCallback(final BindingManager bindingManager,
-				final CommandManager commandManager,
-				final IActiveChecker activeChecker,
-				final IExecuteApplicable checker) {
-			if (bindingManager == null) {
-				throw new NullPointerException(
-						"The callback needs a binding manager"); //$NON-NLS-1$
-			}
-
-			if (commandManager == null) {
-				throw new NullPointerException(
-						"The callback needs a command manager"); //$NON-NLS-1$
-			}
-
-			if (activeChecker == null) {
-				throw new NullPointerException(
-						"The callback needs an active callback"); //$NON-NLS-1$
-			}
-			if (checker == null) {
-				throw new NullPointerException(
-						"The callback needs an applicable callback"); //$NON-NLS-1$
-			}
-
-			this.activeChecker = activeChecker;
-			this.bindingManager = bindingManager;
-			this.commandManager = commandManager;
-			this.applicabilityChecker = checker;
-		}
-
-		/**
-		 * @see org.eclipse.jface.action.ExternalActionManager.ICallback#addPropertyChangeListener(String,
-		 *      IPropertyChangeListener)
-		 */
-		public final void addPropertyChangeListener(final String commandId,
-				final IPropertyChangeListener listener) {
-			Object existing = registeredListeners.get(commandId);
-			if (existing instanceof ListenerList) {
-				((ListenerList) existing).add(listener);
-			} else if (existing != null) {
-				ListenerList listeners = new ListenerList(ListenerList.IDENTITY);
-				listeners.add(existing);
-				listeners.add(listener);
-				registeredListeners.put(commandId, listeners);
-			} else {
-				registeredListeners.put(commandId, listener);
-			}
-			if (!bindingManagerListenerAttached) {
-				bindingManager.addBindingManagerListener(this);
-				bindingManagerListenerAttached = true;
-			}
-		}
-
-		public final void bindingManagerChanged(final BindingManagerEvent event) {
-			if (event.isActiveBindingsChanged()) {
-				final Iterator listenerItr = registeredListeners.entrySet()
-						.iterator();
-				while (listenerItr.hasNext()) {
-					final Map.Entry entry = (Map.Entry) listenerItr.next();
-					final String commandId = (String) entry.getKey();
-					final Command command = commandManager
-							.getCommand(commandId);
-					final ParameterizedCommand parameterizedCommand = new ParameterizedCommand(
-							command, null);
-					if (event.isActiveBindingsChangedFor(parameterizedCommand)) {
-						Object value = entry.getValue();
-						PropertyChangeEvent propertyChangeEvent = new PropertyChangeEvent(event
-								.getManager(), IAction.TEXT, null, null);
-						if (value instanceof ListenerList) {
-							Object[] listeners= ((ListenerList) value).getListeners();
-							for (int i = 0; i < listeners.length; i++) {
-								final IPropertyChangeListener listener = (IPropertyChangeListener) listeners[i];
-								listener.propertyChange(propertyChangeEvent);
-							}
-						} else {
-							final IPropertyChangeListener listener = (IPropertyChangeListener) value;
-							listener.propertyChange(propertyChangeEvent);
-						}
-					}
-				}
-			}
-		}
-
-		/**
-		 * @see org.eclipse.jface.action.ExternalActionManager.ICallback#getAccelerator(String)
-		 */
-		public final Integer getAccelerator(final String commandId) {
-			final TriggerSequence triggerSequence = bindingManager
-					.getBestActiveBindingFor(commandId);
-			if (triggerSequence != null) {
-				final Trigger[] triggers = triggerSequence.getTriggers();
-				if (triggers.length == 1) {
-					final Trigger trigger = triggers[0];
-					if (trigger instanceof KeyStroke) {
-						final KeyStroke keyStroke = (KeyStroke) trigger;
-						final int accelerator = SWTKeySupport
-								.convertKeyStrokeToAccelerator(keyStroke);
-						return new Integer(accelerator);
-					}
-				}
-			}
-
-			return null;
-		}
-
-		/**
-		 * @see org.eclipse.jface.action.ExternalActionManager.ICallback#getAcceleratorText(String)
-		 */
-		public final String getAcceleratorText(final String commandId) {
-			final TriggerSequence triggerSequence = bindingManager
-					.getBestActiveBindingFor(commandId);
-			if (triggerSequence == null) {
-				return null;
-			}
-
-			return triggerSequence.format();
-		}
-
-		/**
-		 * Returns the active bindings for a particular command identifier.
-		 * 
-		 * @param commandId
-		 *            The identifier of the command whose bindings are
-		 *            requested. This argument may be <code>null</code>. It
-		 *            is assumed that the command has no parameters.
-		 * @return The array of active triggers (<code>TriggerSequence</code>)
-		 *         for a particular command identifier. This value is guaranteed
-		 *         not to be <code>null</code>, but it may be empty.
-		 * @since 3.2
-		 */
-		public final TriggerSequence[] getActiveBindingsFor(
-				final String commandId) {
-			return bindingManager.getActiveBindingsFor(commandId);
-		}
-
-		/**
-		 * @see org.eclipse.jface.action.ExternalActionManager.ICallback#isAcceleratorInUse(int)
-		 */
-		public final boolean isAcceleratorInUse(final int accelerator) {
-			final KeySequence keySequence = KeySequence
-					.getInstance(SWTKeySupport
-							.convertAcceleratorToKeyStroke(accelerator));
-			return bindingManager.isPerfectMatch(keySequence)
-					|| bindingManager.isPartialMatch(keySequence);
-		}
-
-		/**
-		 * {@inheritDoc}
-		 * 
-		 * Calling this method with an undefined command id will generate a log
-		 * message.
-		 */
-		public final boolean isActive(final String commandId) {
-			if (commandId != null) {
-				final Command command = commandManager.getCommand(commandId);
-
-				if (!command.isDefined()
-						&& (!loggedCommandIds.contains(commandId))) {
-					// The command is not yet defined, so we should log this.
-					final String message = MessageFormat.format(Util
-							.translateString(RESOURCE_BUNDLE,
-									"undefinedCommand.WarningMessage", null), //$NON-NLS-1$
-							new String[] { command.getId() });
-					IStatus status = new Status(IStatus.ERROR,
-							"org.eclipse.jface", //$NON-NLS-1$
-							0, message, new Exception());
-					Policy.getLog().log(status);
-
-					// And remember this item so we don't log it again.
-					loggedCommandIds.add(commandId);
-					command.addCommandListener(new ICommandListener() {
-						/*
-						 * (non-Javadoc)
-						 * 
-						 * @see org.eclipse.ui.commands.ICommandListener#commandChanged(org.eclipse.ui.commands.CommandEvent)
-						 */
-						public final void commandChanged(
-								final CommandEvent commandEvent) {
-							if (command.isDefined()) {
-								command.removeCommandListener(this);
-								loggedCommandIds.remove(commandId);
-							}
-						}
-					});
-
-					return true;
-				}
-
-				return activeChecker.isActive(commandId);
-			}
-
-			return true;
-		}
-
-		/**
-		 * @see org.eclipse.jface.action.ExternalActionManager.ICallback#removePropertyChangeListener(String,
-		 *      IPropertyChangeListener)
-		 */
-		public final void removePropertyChangeListener(final String commandId,
-				final IPropertyChangeListener listener) {
-			Object existing= registeredListeners.get(commandId);
-			if (existing == listener) {
-				registeredListeners.remove(commandId);
-				if (registeredListeners.isEmpty()) {
-					bindingManager.removeBindingManagerListener(this);
-					bindingManagerListenerAttached = false;
-				}
-			} else if (existing instanceof ListenerList) {
-				ListenerList existingList = (ListenerList) existing;
-				existingList.remove(listener);
-				if (existingList.size() == 1) {
-					registeredListeners.put(commandId, existingList.getListeners()[0]);
-				}
-			}
-		}
-
-		/**
-		 * @since 3.4
-		 */
-		public void preExecute(IAction action, Event event) {
-			String actionDefinitionId = action.getActionDefinitionId();
-			if (actionDefinitionId==null 
-					|| !applicabilityChecker.isApplicable(action)) {
-				return;
-			}
-			Command command = commandManager.getCommand(actionDefinitionId);
-			ExecutionEvent executionEvent = new ExecutionEvent(command,
-					Collections.EMPTY_MAP, event, null);
-
-			commandManager.firePreExecute(actionDefinitionId, executionEvent);
-		}
-
-		/**
-		 * @since 3.4
-		 */
-		public void postExecuteSuccess(IAction action, Object returnValue) {
-			String actionDefinitionId = action.getActionDefinitionId();
-			if (actionDefinitionId==null 
-					|| !applicabilityChecker.isApplicable(action)) {
-				return;
-			}
-			commandManager.firePostExecuteSuccess(actionDefinitionId, returnValue);
-		}
-
-		/**
-		 * @since 3.4
-		 */
-		public void postExecuteFailure(IAction action,
-				ExecutionException exception) {
-			String actionDefinitionId = action.getActionDefinitionId();
-			if (actionDefinitionId==null 
-					|| !applicabilityChecker.isApplicable(action)) {
-				return;
-			}
-			commandManager.firePostExecuteFailure(actionDefinitionId, exception);
-		}
-
-		/**
-		 * @since 3.4
-		 */
-		public void notDefined(IAction action, NotDefinedException exception) {
-			String actionDefinitionId = action.getActionDefinitionId();
-			if (actionDefinitionId==null 
-					|| !applicabilityChecker.isApplicable(action)) {
-				return;
-			}
-			commandManager.fireNotDefined(actionDefinitionId, exception);
-		}
-
-		/**
-		 * @since 3.4
-		 */
-		public void notEnabled(IAction action, NotEnabledException exception) {
-			String actionDefinitionId = action.getActionDefinitionId();
-			if (actionDefinitionId==null 
-					|| !applicabilityChecker.isApplicable(action)) {
-				return;
-			}
-			commandManager.fireNotEnabled(actionDefinitionId, exception);
-		}
-	}
-
-	/**
-	 * Defines a callback mechanism for developer who wish to further control
-	 * the visibility of legacy action-based contribution items.
-	 * 
-	 * @since 3.1
-	 */
-	public static interface IActiveChecker {
-		/**
-		 * Checks whether the command with the given identifier should be
-		 * considered active. This can be used in systems using some kind of
-		 * user interface filtering (e.g., activities in the Eclipse workbench).
-		 * 
-		 * @param commandId
-		 *            The identifier for the command; must not be
-		 *            <code>null</code>
-		 * @return <code>true</code> if the command is active;
-		 *         <code>false</code> otherwise.
-		 */
-		public boolean isActive(String commandId);
-	}
-
-	/**
-	 * <p>
-	 * A callback which communicates with the applications binding manager. This
-	 * interface provides more information from the binding manager, which
-	 * allows greater integration. Implementing this interface is preferred over
-	 * {@link ExternalActionManager.ICallback}.
-	 * </p>
-	 * <p>
-	 * Clients may implement this interface, but must not extend.
-	 * </p>
-	 * 
-	 * @since 3.2
-	 */
-	public static interface IBindingManagerCallback extends ICallback {
-
-		/**
-		 * <p>
-		 * Returns the active bindings for a particular command identifier.
-		 * </p>
-		 * 
-		 * @param commandId
-		 *            The identifier of the command whose bindings are
-		 *            requested. This argument may be <code>null</code>. It
-		 *            is assumed that the command has no parameters.
-		 * @return The array of active triggers (<code>TriggerSequence</code>)
-		 *         for a particular command identifier. This value is guaranteed
-		 *         not to be <code>null</code>, but it may be empty.
-		 */
-		public TriggerSequence[] getActiveBindingsFor(String commandId);
-	}
-	
-	/**
-	 * An overridable mechanism to filter certain IActions from the execution
-	 * bridge.
-	 * 
-	 * @since 3.4
-	 */
-	public static interface IExecuteApplicable {
-		/**
-		 * Allow the callback to filter out actions that should not fire
-		 * execution events.
-		 * 
-		 * @param action
-		 *            The action with an actionDefinitionId
-		 * @return true if this action should be considered.
-		 */
-		public boolean isApplicable(IAction action);
-	}
-	
-	/**
-	 * <p>
-	 * A callback for executing execution events. Allows
-	 * <code>ActionContributionItems</code> to fire useful events.
-	 * </p>
-	 * <p>
-	 * Clients must not implement this interface and must not extend.
-	 * </p>
-	 * 
-	 * @since 3.4
-	 * 
-	 */
-	public static interface IExecuteCallback {
-		
-		/**
-		 * Fires a <code>NotEnabledException</code> because the action was not
-		 * enabled.
-		 * 
-		 * @param action
-		 * 			The action contribution that caused the exception,
-		 * 			never <code>null</code>.
-		 * @param exception
-		 * 			The <code>NotEnabledException</code>, never <code>null</code>.
-		 */
-		public void notEnabled(IAction action, NotEnabledException exception);
-
-		/**
-		 * Fires a <code>NotDefinedException</code> because the action was not
-		 * defined.
-		 * 
-		 * @param action
-		 * 			The action contribution that caused the exception,
-		 * 			never <code>null</code>.
-		 * @param exception
-		 * 			The <code>NotDefinedException</code>, never <code>null</code>.
-		 */
-		public void notDefined(IAction action, NotDefinedException exception);
-		
-		/**
-		 * Fires an execution event before an action is run.
-		 * 
-		 * @param action
-		 *            The action contribution that requires an
-		 *            execution event to be fired. Cannot be <code>null</code>.
-		 * @param e
-		 *            The SWT Event, may be <code>null</code>.
-		 * 
-		 */
-		public void preExecute(IAction action,
-				Event e);
-		
-		/**
-		 * Fires an execution event when the action returned a success.
-		 * 
-		 * @param action
-		 *            The action contribution that requires an
-		 *            execution event to be fired. Cannot be <code>null</code>.
-		 * @param returnValue
-		 *            The command's result, may be <code>null</code>.
-		 * 
-		 */
-		public void postExecuteSuccess(IAction action,
-				Object returnValue);
-		
-		/**
-		 * Creates an <code>ExecutionException</code> when the action returned
-		 * a failure.
-		 * 
-		 * @param action
-		 * 			The action contribution that caused the exception,
-		 * 			never <code>null</code>.
-		 * @param exception
-		 * 			The <code>ExecutionException</code>, never <code>null</code>.
-		 */
-		public void postExecuteFailure(IAction action,
-				ExecutionException exception);
-	}
-
-	/**
-	 * A callback mechanism for some external tool to communicate extra
-	 * information to actions and action contribution items.
-	 * 
-	 * @since 3.0
-	 */
-	public static interface ICallback {
-
-		/**
-		 * <p>
-		 * Adds a listener to the object referenced by <code>identifier</code>.
-		 * This listener will be notified if a property of the item is to be
-		 * changed. This identifier is specific to mechanism being used. In the
-		 * case of the Eclipse workbench, this is the command identifier.
-		 * </p>
-		 * <p>
-		 * Has no effect if an identical listener has already been added for
-		 * the <code>identifier</code>.
-		 * </p>
-		 * 
-		 * @param identifier
-		 *            The identifier of the item to which the listener should be
-		 *            attached; must not be <code>null</code>.
-		 * @param listener
-		 *            The listener to be added; must not be <code>null</code>.
-		 */
-		public void addPropertyChangeListener(String identifier,
-				IPropertyChangeListener listener);
-
-		/**
-		 * An accessor for the accelerator associated with the item indicated by
-		 * the identifier. This identifier is specific to mechanism being used.
-		 * In the case of the Eclipse workbench, this is the command identifier.
-		 * 
-		 * @param identifier
-		 *            The identifier of the item from which the accelerator
-		 *            should be obtained ; must not be <code>null</code>.
-		 * @return An integer representation of the accelerator. This is the
-		 *         same accelerator format used by SWT.
-		 */
-		public Integer getAccelerator(String identifier);
-
-		/**
-		 * An accessor for the accelerator text associated with the item
-		 * indicated by the identifier. This identifier is specific to mechanism
-		 * being used. In the case of the Eclipse workbench, this is the command
-		 * identifier.
-		 * 
-		 * @param identifier
-		 *            The identifier of the item from which the accelerator text
-		 *            should be obtained ; must not be <code>null</code>.
-		 * @return A string representation of the accelerator. This is the
-		 *         string representation that should be displayed to the user.
-		 */
-		public String getAcceleratorText(String identifier);
-
-		/**
-		 * Checks to see whether the given accelerator is being used by some
-		 * other mechanism (outside of the menus controlled by JFace). This is
-		 * used to keep JFace from trying to grab accelerators away from someone
-		 * else.
-		 * 
-		 * @param accelerator
-		 *            The accelerator to check -- in SWT's internal accelerator
-		 *            format.
-		 * @return <code>true</code> if the accelerator is already being used
-		 *         and shouldn't be used again; <code>false</code> otherwise.
-		 */
-		public boolean isAcceleratorInUse(int accelerator);
-
-		/**
-		 * Checks whether the item matching this identifier is active. This is
-		 * used to decide whether a contribution item with this identifier
-		 * should be made visible. An inactive item is not visible.
-		 * 
-		 * @param identifier
-		 *            The identifier of the item from which the active state
-		 *            should be retrieved; must not be <code>null</code>.
-		 * @return <code>true</code> if the item is active; <code>false</code>
-		 *         otherwise.
-		 */
-		public boolean isActive(String identifier);
-
-		/**
-		 * Removes a listener from the object referenced by
-		 * <code>identifier</code>. This identifier is specific to mechanism
-		 * being used. In the case of the Eclipse workbench, this is the command
-		 * identifier.
-		 * 
-		 * @param identifier
-		 *            The identifier of the item to from the listener should be
-		 *            removed; must not be <code>null</code>.
-		 * @param listener
-		 *            The listener to be removed; must not be <code>null</code>.
-		 */
-		public void removePropertyChangeListener(String identifier,
-				IPropertyChangeListener listener);
-
-	}
-
-	/**
-	 * The singleton instance of this class. This value may be <code>null</code>--
-	 * if it has not yet been initialized.
-	 */
-	private static ExternalActionManager instance;
-
-	/**
-	 * Retrieves the current singleton instance of this class.
-	 * 
-	 * @return The singleton instance; this value is never <code>null</code>.
-	 */
-	public static ExternalActionManager getInstance() {
-		if (instance == null) {
-			instance = new ExternalActionManager();
-		}
-
-		return instance;
-	}
-
-	/**
-	 * The callback mechanism to use to retrieve extra information.
-	 */
-	private ICallback callback;
-
-	/**
-	 * Constructs a new instance of <code>ExternalActionManager</code>.
-	 */
-	private ExternalActionManager() {
-		// This is a singleton class. Only this class should create an instance.
-	}
-
-	/**
-	 * An accessor for the current call back.
-	 * 
-	 * @return The current callback mechanism being used. This is the callback
-	 *         that should be queried for extra information about actions and
-	 *         action contribution items. This value may be <code>null</code>
-	 *         if there is no extra information.
-	 */
-	public ICallback getCallback() {
-		return callback;
-	}
-
-	/**
-	 * A mutator for the current call back
-	 * 
-	 * @param callbackToUse
-	 *            The new callback mechanism to use; this value may be
-	 *            <code>null</code> if the default is acceptable (i.e., no
-	 *            extra information will provided to actions).
-	 */
-	public void setCallback(ICallback callbackToUse) {
-		callback = callbackToUse;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ExternalActionManager.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ExternalActionManager.properties
deleted file mode 100644
index 6e9b96e..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ExternalActionManager.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-undefinedCommand.WarningMessage = The command ("{0}") is undefined
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/GroupMarker.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/GroupMarker.java
deleted file mode 100644
index 6f86d22..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/GroupMarker.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-/**
- * A group marker is a special kind of contribution item denoting
- * the beginning of a group. These groups are used to structure
- * the list of items. Unlike regular contribution items and
- * separators, group markers have no visual representation.
- * The name of the group is synonymous with the contribution item id.
- * <p>
- * This class may be instantiated; it is not intended to be 
- * subclassed outside the framework.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class GroupMarker extends AbstractGroupMarker {
-    /**
-     * Create a new group marker with the given name.
-     * The group name must not be <code>null</code> or the empty string.
-     * The group name is also used as the item id.
-     * 
-     * @param groupName the name of the group
-     */
-    public GroupMarker(String groupName) {
-        super(groupName);
-    }
-
-    /**
-     * The <code>GroupMarker</code> implementation of this method
-     * returns <code>false</code> since group markers are always invisible.
-     */
-    public boolean isVisible() {
-        return false;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IAction.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IAction.java
deleted file mode 100644
index 91cbb21..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IAction.java
+++ /dev/null
@@ -1,525 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import org.eclipse.core.commands.IHandlerAttributes;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.swt.events.HelpListener;
-import org.eclipse.swt.widgets.Event;
-
-/**
- * An action represents the non-UI side of a command which can be triggered
- * by the end user. Actions are typically associated with buttons, menu items,
- * and items in tool bars. The controls for a command are built by some container,
- * which furnished the context where these controls appear and configures 
- * them with data from properties declared by the action. When the end user
- * triggers the command via its control, the action's <code>run</code>
- * method is invoked to do the real work.
- * <p>
- * Actions support a predefined set of properties (and possibly others as well).
- * Clients of an action may register property change listeners so that they get 
- * notified whenever the value of a property changes.
- * </p>
- * <p>
- * Clients should subclass the abstract base class <code>Action</code> to define 
- * concrete actions rather than implementing <code>IAction</code> from scratch.
- * </p>
- * <p>
- * This interface exists only to define the API for actions.
- * It is not intended to be implemented by clients.
- * </p>
- * 
- * @see Action
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IAction {
-
-    /**
-     * Action style constant (value <code>0</code>) indicating action style 
-     * is not specified yet. By default, the action will assume a push button
-     * style. If <code>setChecked</code> is called, then the style will change
-     * to a check box, or if <code>setMenuCreator</code> is called, then the
-     * style will change to a drop down menu.
-     * 
-     * @since 2.1
-     */
-    public static int AS_UNSPECIFIED = 0x00;
-
-    /**
-     * Action style constant (value <code>1</code>) indicating action is 
-     * a simple push button.
-     */
-    public static int AS_PUSH_BUTTON = 0x01;
-
-    /**
-     * Action style constant (value <code>2</code>) indicating action is 
-     * a check box (or a toggle button).
-     */
-    public static int AS_CHECK_BOX = 0x02;
-
-    /**
-     * Action style constant (value <code>4</code>) indicating action is 
-     * a drop down menu.
-     */
-    public static int AS_DROP_DOWN_MENU = 0x04;
-
-    /**
-     * Action style constant (value <code>8</code>) indicating action is 
-     * a radio button.
-     * 
-     * @since 2.1
-     */
-    public static int AS_RADIO_BUTTON = 0x08;
-
-    /**
-     * Property name of an action's text (value <code>"text"</code>).
-     */
-    public static final String TEXT = "text"; //$NON-NLS-1$
-
-    /**
-     * Property name of an action's enabled state
-     * (value <code>"enabled"</code>).
-     */
-    public static final String ENABLED = "enabled"; //$NON-NLS-1$
-
-    /**
-     * Property name of an action's image (value <code>"image"</code>).
-     */
-    public static final String IMAGE = "image"; //$NON-NLS-1$
-
-    /**
-     * Property name of an action's tooltip text (value <code>"toolTipText"</code>).
-     */
-    public static final String TOOL_TIP_TEXT = "toolTipText"; //$NON-NLS-1$
-
-    /**
-     * Property name of an action's description (value <code>"description"</code>).
-     * Typically the description is shown as a (longer) help text in the status line.
-     */
-    public static final String DESCRIPTION = "description"; //$NON-NLS-1$
-
-    /**
-     * Property name of an action's checked status (value
-     * <code>"checked"</code>). Applicable when the style is
-     * <code>AS_CHECK_BOX</code> or <code>AS_RADIO_BUTTON</code>.
-     */
-    public static final String CHECKED = "checked"; //$NON-NLS-1$
-
-    /**
-     * Property name of an action's success/fail result
-     * (value <code>"result"</code>). The values are
-     * <code>Boolean.TRUE</code> if running the action succeeded and 
-     * <code>Boolean.FALSE</code> if running the action failed or did not
-     * complete.
-     * <p>
-     * Not all actions report whether they succeed or fail. This property
-     * is provided for use by actions that may be invoked by clients that can
-     * take advantage of this information when present (for example, actions
-     * used in cheat sheets). Clients should always assume that running the
-     * action succeeded in the absence of notification to the contrary. 
-     * </p>
-     * 
-     * @since 3.0
-     */
-    public static final String RESULT = "result"; //$NON-NLS-1$
-    
-    /**
-     * Property name of an action's handler. Some actions delegate some or all
-     * of their behaviour or state to another object. In this case, if the
-     * object to which behaviour has been delegated changes, then a property
-     * change event should be sent with this name.
-     * 
-     * This is used to support backward compatibility of actions within the
-     * commands framework.
-     * 
-     * @since 3.1
-     */
-	public static final String HANDLED = IHandlerAttributes.ATTRIBUTE_HANDLED;
-
-    /**
-     * Adds a property change listener to this action.
-     * Has no effect if an identical listener is already registered.
-     *
-     * @param listener a property change listener
-     */
-    public void addPropertyChangeListener(IPropertyChangeListener listener);
-
-    /**
-     * Returns the accelerator keycode for this action.
-     * The result is the bit-wise OR of zero or more modifier masks
-     * and a key, as explained in <code>MenuItem.getAccelerator</code>.
-     *
-     * @return the accelerator keycode
-     * @see org.eclipse.swt.widgets.MenuItem#getAccelerator()
-     */
-    public int getAccelerator();
-
-    /**
-     * Returns the action definition id of this action.
-     * 
-     * @return the action definition id of this action, or
-     * <code>null</code> if none
-     * @since 2.0
-     */
-    public String getActionDefinitionId();
-
-    /**
-     * Returns the action's description if it has one.
-     * Otherwise it returns <code>getToolTipText()</code>.
-     * 
-     * @return a description for the action; may be <code>null</code> 
-     */
-    public String getDescription();
-
-    /**
-     * Returns the disabled image for this action as an image descriptor.
-     * <p>
-     * This method is associated with the <code>IMAGE</code> property;
-     * property change events are reported when its value changes.
-     * </p>
-     *
-     * @return the image, or <code>null</code> if this action has no image
-     * @see #IMAGE
-     */
-    public ImageDescriptor getDisabledImageDescriptor();
-
-    /**
-     * Returns a help listener for this action. 
-     *
-     * @return a help listener for this action
-     */
-    public HelpListener getHelpListener();
-
-    /**
-     * Returns the hover image for this action as an image descriptor.
-     * <p>
-     * Hover images will be used on platforms that support changing the image
-     * when the user hovers over the item. This method is associated with 
-     * the <code>IMAGE</code> property;
-     * property change events are reported when its value changes.
-     * </p>
-     *
-     * @return the image, or <code>null</code> if this action has no image
-     * @see #IMAGE
-     */
-    public ImageDescriptor getHoverImageDescriptor();
-
-    /**
-     * Returns a unique identifier for this action, or <code>null</code> if it has
-     * none.
-     *
-     * @return the action id, or <code>null</code> if none
-     */
-    public String getId();
-
-    /**
-     * Returns the image for this action as an image descriptor.
-     * <p>
-     * This method is associated with the <code>IMAGE</code> property;
-     * property change events are reported when its value changes.
-     * </p>
-     *
-     * @return the image, or <code>null</code> if this action has no image
-     * @see #IMAGE
-     */
-    public ImageDescriptor getImageDescriptor();
-
-    /**
-     * Returns the menu creator for this action.
-     *
-     * @return the menu creator, or <code>null</code> if none
-     */
-    public IMenuCreator getMenuCreator();
-
-    /**
-     * Return this action's style.
-     *
-     * @return one of <code>AS_PUSH_BUTTON</code>, <code>AS_CHECK_BOX</code>,
-     * <code>AS_RADIO_BUTTON</code> and <code>AS_DROP_DOWN_MENU</code>.
-     */
-    public int getStyle();
-
-    /**
-     * Returns the text for this action.
-     * <p>
-     * This method is associated with the <code>TEXT</code> property;
-     * property change events are reported when its value changes.
-     * </p>
-     *
-     * @return the text, or <code>null</code> if none
-     * @see #TEXT
-     */
-    public String getText();
-
-    /**
-     * Returns the tool tip text for this action.
-     * <p>
-     * This method is associated with the <code>TOOL_TIP_TEXT</code> property;
-     * property change events are reported when its value changes.
-     * </p>
-     *
-     * @return the tool tip text, or <code>null</code> if none
-     * @see #TOOL_TIP_TEXT
-     */
-    public String getToolTipText();
-
-    /**
-     * Returns the checked status of this action. Applicable only if the style is
-     * <code>AS_CHECK_BOX</code> or <code>AS_RADIO_BUTTON</code>.
-     * <p>
-     * This method is associated with the <code>CHECKED</code> property;
-     * property change events are reported when its value changes.
-     * </p>
-     *
-     * @return the checked status
-     * @see #CHECKED
-     */
-    public boolean isChecked();
-
-    /**
-     * Returns whether this action is enabled.
-     * <p>
-     * This method is associated with the <code>ENABLED</code> property;
-     * property change events are reported when its value changes.
-     * </p>
-     *
-     * @return <code>true</code> if enabled, and
-     *   <code>false</code> if disabled
-     * @see #ENABLED
-     */
-    public boolean isEnabled();
-
-    /**
-	 * Returns whether this action is handled. In the default case, this is
-	 * always <code>true</code>. However, if the action delegates some of its
-	 * behaviour to some other object, then this method should answer whether
-	 * such an object is currently available.
-	 * 
-	 * @return <code>true</code> if all of the action's behaviour is
-	 *         available; <code>false</code> otherwise.
-	 * @since 3.1
-	 */
-	public boolean isHandled();
-
-    /**
-     * Removes the given listener from this action.
-     * Has no effect if an identical listener is not registered.
-     *
-     * @param listener a property change listener
-     */
-    public void removePropertyChangeListener(IPropertyChangeListener listener);
-
-    /**
-     * Runs this action.
-     * Each action implementation must define the steps needed to carry out this action.
-     * The default implementation of this method in <code>Action</code>
-     * does nothing.
-     */
-    public void run();
-
-    /**
-     * Runs this action, passing the triggering SWT event.
-     * As of 2.0, <code>ActionContributionItem</code> calls this method
-     * instead of <code>run()</code>.  
-     * The default implementation of this method in <code>Action</code>
-     * simply calls <code>run()</code> for backwards compatibility.
-     * 
-     * @param event the SWT event which triggered this action being run 
-     * @since 2.0
-     */
-    public void runWithEvent(Event event);
-
-    /**
-     * Sets the action definition id of this action.
-     * 
-     * @param id the action definition id
-     * @since 2.0
-     */
-    public void setActionDefinitionId(String id);
-
-    /**
-     * Sets the checked status of this action. Applicable for the styles
-     * <code>AS_CHECK_BOX</code> or <code>AS_RADIO_BUTTON</code>.
-     * <p>
-     * Fires a property change event for the <code>CHECKED</code> property
-     * if the checked status actually changes as a consequence.
-     * </p>
-     *
-     * @param checked the new checked status
-     * @see #CHECKED
-     */
-    public void setChecked(boolean checked);
-
-    /**
-     * Sets this action's description.
-     * Typically the description is shown as a (longer) help text in the status line.
-     * <p>
-     * Fires a property change event for the <code>DESCRIPTION</code> property
-     * if the description actually changes as a consequence.
-     * </p>
-     *
-     * @param text the description, or <code>null</code> to clear the description
-     * @see #DESCRIPTION
-     */
-    public void setDescription(String text);
-
-    /**
-     * Sets the disabled image for this action, as an image descriptor.
-     * <p>
-     * Disabled images will be used on platforms that support changing the image
-     * when the item is disabled.Fires a property change event for 
-     * the <code>IMAGE</code> property
-     * if the image actually changes as a consequence.
-     * </p>
-     *
-     * @param newImage the image, or <code>null</code> if this 
-     *   action should not have an image
-     * @see #IMAGE
-     */
-    public void setDisabledImageDescriptor(ImageDescriptor newImage);
-
-    /**
-     * Sets the enabled state of this action.
-     * <p>
-     * When an action is in the enabled state, the control associated with 
-     * it is active; triggering it will end up inkoking this action's 
-     * <code>run</code> method.
-     * </p>
-     * <p>
-     * Fires a property change event for the <code>ENABLED</code> property
-     * if the enabled state actually changes as a consequence.
-     * </p>
-     *
-     * @param enabled <code>true</code> to enable, and
-     *   <code>false</code> to disable
-     * @see #ENABLED
-     */
-    public void setEnabled(boolean enabled);
-
-    /**
-     * Sets a help listener for this action. 
-     *
-     * @param listener a help listener for this action
-     */
-    public void setHelpListener(HelpListener listener);
-
-    /**
-     * Sets the hover image for this action, as an image descriptor.
-     * <p>
-     * Hover images will be used on platforms that support changing the image
-     * when the user hovers over the item.Fires a property change event for 
-     * the <code>IMAGE</code> property
-     * if the image actually changes as a consequence.
-     * </p>
-     *
-     * @param newImage the image, or <code>null</code> if this 
-     *   action should not have an image
-     * @see #IMAGE
-     */
-    public void setHoverImageDescriptor(ImageDescriptor newImage);
-
-    /**
-     * Sets the unique identifier for this action. This is used to identify actions
-     * when added to a contribution manager.
-     * It should be set when the action is created.  It should not be modified once
-     * the action is part of an action contribution item.
-     *
-     * @param id the action id
-     *
-     * @see ActionContributionItem
-     * @see IContributionItem#getId
-     */
-    public void setId(String id);
-
-	/**
-	 * Sets the image for this action, as an image descriptor.
-	 * <p>
-	 * Fires a property change event for the <code>IMAGE</code> property if the
-	 * image actually changes as a consequence.
-	 * </p>
-	 * <p>
-	 * Note: This operation is a hint and is not supported in all contexts on
-	 * platforms that do not have this concept (for example, Windows NT).
-	 * Furthermore, some platforms (such as GTK), cannot display both a check
-	 * box and an image at the same time. Instead, they hide the image and
-	 * display the check box.
-	 * </p>
-	 * 
-	 * @param newImage
-	 *            the image, or <code>null</code> if this action should not have
-	 *            an image
-	 * @see #IMAGE
-	 */
-    public void setImageDescriptor(ImageDescriptor newImage);
-
-    /**
-     * Sets the menu creator for this action. Applicable for style
-     * <code>AS_DROP_DOWN_MENU</code>.
-     *
-     * @param creator the menu creator, or <code>null</code> if none
-     */
-    public void setMenuCreator(IMenuCreator creator);
-
-    /**
-     * Sets the text for this action.
-     * <p>
-     * An accelerator specification may follow the actual text, separated from it by
-     * an '@' or a '\t' character.  An accelerator specification consists of zero or more 
-     * modifier tokens followed by a key code token.  The tokens are separated by a '+' character.
-     * </p>
-     * <p>
-     * Fires a property change event for the <code>TEXT</code> property
-     * if the text actually changes as a consequence.
-     * </p>
-     *
-     * @param text the text, or <code>null</code> if none
-     * @see #TEXT
-     * @see Action#findModifier
-     * @see Action#findKeyCode
-     */
-    public void setText(String text);
-
-    /**
-     * Sets the tool tip text for this action.
-     * <p>
-     * Fires a property change event for the <code>TOOL_TIP_TEXT</code> property
-     * if the tool tip text actually changes as a consequence.
-     * </p>
-     *
-     * @param text the tool tip text, or <code>null</code> if none
-     * @see #TOOL_TIP_TEXT
-     */
-    public void setToolTipText(String text);
-
-    /**
-     * <p>
-     * Sets the accelerator keycode that this action maps to. This is a bitwise OR
-     * of zero or more SWT key modifier masks (i.e. SWT.CTRL or SWT.ALT) and a
-     * character code. For example, for Ctrl+Z, use <code>SWT.CTRL | 'Z'</code>.
-     * Use 0 for no accelerator.
-     * </p>
-     * <p>
-     * This method should no longer be used for actions in the Eclipse workbench.
-     * <code>IWorkbenchCommandSupport</code> and
-     * <code>IWorkbenchContextSupport</code> provide all the functionality
-     * required for key bindings. If you set an accelerator using this method, then
-     * it will not work in the workbench if it conflicts any existing key binding,
-     * or if there is a different key binding defined for this action's definition
-     * id. The definition id should be used instead -- referring to the command in
-     * the workbench from which the key binding should be retrieved.
-     * </p>
-     * 
-     * @param keycode
-     *            the keycode to be accepted.
-     */
-    public void setAccelerator(int keycode);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IContributionItem.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IContributionItem.java
deleted file mode 100644
index d34ccc0..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IContributionItem.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.action;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.CoolBar;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolBar;
-
-/**
- * A contribution item represents a contribution to a shared UI resource such as a
- * menu or tool bar. More generally, contribution items are managed by a contribution
- * manager.
- * For instance, in a tool bar a contribution item is a tool bar button or a separator.
- * In a menu bar a contribution item is a menu, and in a menu a contribution item 
- * is a menu item or separator.
- * <p>
- * A contribution item can realize itself in different SWT widgets, using the different 
- * <code>fill</code> methods.  The same type of contribution item can be used with a 
- * <code>MenuBarManager</code>, <code>ToolBarManager</code>, <code>CoolBarManager</code>, 
- * </code>or a <code>StatusLineManager</code>.
- * </p>
- * <p>
- * This interface is internal to the framework; it should not be implemented outside
- * the framework.
- * </p>
- *
- * @see IContributionManager
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IContributionItem {
-
-    /**
-     * Disposes of this contribution item. Called by the parent
-     * contribution manager when the manager is being disposed.
-     * Clients should not call this method directly, unless they
-     * have removed this contribution item from the containing
-     * IContributionManager before the contribution lifecycle
-     * has ended.
-     * 
-     * @since 2.1
-     */
-    public void dispose();
-
-    /**
-     * Fills the given composite control with controls representing this 
-     * contribution item.  Used by <code>StatusLineManager</code>.
-     *
-     * @param parent the parent control
-     */
-    public void fill(Composite parent);
-
-    /**
-     * Fills the given menu with controls representing this contribution item.
-     * Used by <code>MenuManager</code>.
-     *
-     * @param parent the parent menu
-     * @param index the index where the controls are inserted,
-     *   or <code>-1</code> to insert at the end
-     */
-    public void fill(Menu parent, int index);
-
-    /**
-     * Fills the given tool bar with controls representing this contribution item.
-     * Used by <code>ToolBarManager</code>.
-     *
-     * @param parent the parent tool bar
-     * @param index the index where the controls are inserted,
-     *   or <code>-1</code> to insert at the end
-     */
-    public void fill(ToolBar parent, int index);
-
-    /**
-     * Fills the given cool bar with controls representing this contribution item.
-     * Used by <code>CoolBarManager</code>.
-     *
-     * @param parent the parent cool bar
-     * @param index the index where the controls are inserted,
-     *   or <code>-1</code> to insert at the end
-     * @since 3.0
-     */
-    public void fill(CoolBar parent, int index);
-
-    /**
-     * Returns the identifier of this contribution item.
-     * The id is used for retrieving an item from its manager.
-     *
-     * @return the contribution item identifier, or <code>null</code>
-     *   if none
-     */
-    public String getId();
-
-    /**
-     * Returns whether this contribution item is enabled.
-     * 
-     * @return <code>true</code> if this item is enabled
-     */
-    public boolean isEnabled();
-
-    /**
-     * Returns whether this contribution item is dirty. A dirty item will be
-     * recreated when the action bar is updated.
-     * 
-     * @return <code>true</code> if this item is dirty
-     */
-    public boolean isDirty();
-
-    /**
-     * Returns whether this contribution item is dynamic. A dynamic contribution
-     * item contributes items conditionally, dependent on some internal state.
-     *
-     * @return <code>true</code> if this item is dynamic, and
-     *  <code>false</code> for normal items
-     */
-    public boolean isDynamic();
-
-    /**
-     * Returns whether this contribution item is a group marker.
-     * This information is used when adding items to a group.
-     *
-     * @return <code>true</code> if this item is a group marker, and
-     *  <code>false</code> for normal items
-     *
-     * @see GroupMarker
-     * @see IContributionManager#appendToGroup(String, IContributionItem)
-     * @see IContributionManager#prependToGroup(String, IContributionItem)
-     */
-    public boolean isGroupMarker();
-
-    /**
-     * Returns whether this contribution item is a separator.
-     * This information is used to enable hiding of unnecessary separators.
-     *
-     * @return <code>true</code> if this item is a separator, and
-     *  <code>false</code> for normal items
-     * @see Separator
-     */
-    public boolean isSeparator();
-
-    /**
-     * Returns whether this contribution item is visibile within its manager.
-     *
-     * @return <code>true</code> if this item is visible, and
-     *  <code>false</code> otherwise
-     */
-    public boolean isVisible();
-
-    /**
-     * Saves any state information of the control(s) owned by this contribution item.
-     * The contribution manager calls this method before disposing of the controls.
-     * 
-     * @since 3.0
-     */
-    public void saveWidgetState();
-
-    /**
-     * Sets the parent manager of this item
-     * 
-     * @param parent the parent contribution manager
-     * @since 2.0
-     */
-    public void setParent(IContributionManager parent);
-
-    /**
-     * Sets whether this contribution item is visibile within its manager.
-     *
-     * @param visible <code>true</code> if this item should be visible, and
-     *  <code>false</code> otherwise
-     */
-    public void setVisible(boolean visible);
-
-    /**
-     * Updates any SWT controls cached by this contribution item with any
-     * changes which have been made to this contribution item since the last update.
-     * Called by contribution manager update methods.
-     */
-    public void update();
-
-    /**
-     * Updates any SWT controls cached by this contribution item with changes
-     * for the the given property. 
-     * 
-     * @param id the id of the changed property
-     * @since 2.0
-     */
-    public void update(String id);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IContributionManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IContributionManager.java
deleted file mode 100644
index e63cf89..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IContributionManager.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-/**
- * A contribution manager organizes contributions to such UI components
- * as menus, toolbars and status lines.
- * <p>
- * A contribution manager keeps track of a list of contribution
- * items. Each contribution item may has an optional identifier, which can be used
- * to retrieve items from a manager, and for positioning items relative to
- * each other. The list of contribution items can be subdivided into named groups 
- * using special contribution items that serve as group markers.
- * </p>
- * <p>
- * The <code>IContributionManager</code> interface provides general
- * protocol for adding, removing, and retrieving contribution items.
- * It also provides convenience methods that make it convenient
- * to contribute actions. This interface should be implemented
- * by all objects that wish to manage contributions.
- * </p>
- * <p>
- * There are several implementions of this interface in this package,
- * including ones for menus ({@link MenuManager <code>MenuManager</code>}),
- * tool bars ({@link ToolBarManager <code>ToolBarManager</code>}),
- * and status lines ({@link StatusLineManager <code>StatusLineManager</code>}).
- * </p>
- */
-public interface IContributionManager {
-    /**
-     * Adds an action as a contribution item to this manager.
-     * Equivalent to <code>add(new ActionContributionItem(action))</code>.
-     *
-     * @param action the action, this cannot be <code>null</code>
-     */
-    public void add(IAction action);
-
-    /**
-     * Adds a contribution item to this manager.
-     *
-     * @param item the contribution item, this cannot be <code>null</code>
-     */
-    public void add(IContributionItem item);
-
-    /**
-     * Adds a contribution item for the given action at the end of the group
-     * with the given name.
-     * Equivalent to
-     * <code>appendToGroup(groupName,new ActionContributionItem(action))</code>.
-     *
-     * @param groupName the name of the group
-     * @param action the action
-     * @exception IllegalArgumentException if there is no group with
-     *   the given name
-     */
-    public void appendToGroup(String groupName, IAction action);
-
-    /**
-     * Adds a contribution item to this manager at the end of the group
-     * with the given name.
-     *
-     * @param groupName the name of the group
-     * @param item the contribution item
-     * @exception IllegalArgumentException if there is no group with
-     *   the given name
-     */
-    public void appendToGroup(String groupName, IContributionItem item);
-
-    /**
-     * Finds the contribution item with the given id.
-     *
-     * @param id the contribution item id
-     * @return the contribution item, or <code>null</code> if
-     *   no item with the given id can be found
-     */
-    public IContributionItem find(String id);
-
-    /**
-     * Returns all contribution items known to this manager.
-     *
-     * @return a list of contribution items
-     */
-    public IContributionItem[] getItems();
-
-    /**
-     * Returns the overrides for the items of this manager.
-     * 
-     * @return the overrides for the items of this manager
-     * @since 2.0 
-     */
-    public IContributionManagerOverrides getOverrides();
-
-    /**
-     * Inserts a contribution item for the given action after the item 
-     * with the given id.
-     * Equivalent to
-     * <code>insertAfter(id,new ActionContributionItem(action))</code>.
-     *
-     * @param id the contribution item id
-     * @param action the action to insert
-     * @exception IllegalArgumentException if there is no item with
-     *   the given id
-     */
-    public void insertAfter(String id, IAction action);
-
-    /**
-     * Inserts a contribution item after the item with the given id.
-     *
-     * @param id the contribution item id
-     * @param item the contribution item to insert
-     * @exception IllegalArgumentException if there is no item with
-     *   the given id
-     */
-    public void insertAfter(String id, IContributionItem item);
-
-    /**
-     * Inserts a contribution item for the given action before the item 
-     * with the given id.
-     * Equivalent to
-     * <code>insertBefore(id,new ActionContributionItem(action))</code>.
-     *
-     * @param id the contribution item id
-     * @param action the action to insert
-     * @exception IllegalArgumentException if there is no item with
-     *   the given id
-     */
-    public void insertBefore(String id, IAction action);
-
-    /**
-     * Inserts a contribution item before the item with the given id.
-     *
-     * @param id the contribution item id
-     * @param item the contribution item to insert
-     * @exception IllegalArgumentException if there is no item with
-     *   the given id
-     */
-    public void insertBefore(String id, IContributionItem item);
-
-    /**
-     * Returns whether the list of contributions has recently changed and
-     * has yet to be reflected in the corresponding widgets.
-     *
-     * @return <code>true</code> if this manager is dirty, and <code>false</code>
-     *   if it is up-to-date
-     */
-    public boolean isDirty();
-
-    /**
-     * Returns whether this manager has any contribution items.
-     *
-     * @return <code>true</code> if there are no items, and
-     *   <code>false</code> otherwise
-     */
-    public boolean isEmpty();
-
-    /**
-     * Marks this contribution manager as dirty.
-     */
-    public void markDirty();
-
-    /**
-     * Adds a contribution item for the given action at the beginning of the 
-     * group with the given name.
-     * Equivalent to
-     * <code>prependToGroup(groupName,new ActionContributionItem(action))</code>.
-     *
-     * @param groupName the name of the group
-     * @param action the action
-     * @exception IllegalArgumentException if there is no group with
-     *   the given name
-     */
-    public void prependToGroup(String groupName, IAction action);
-
-    /**
-     * Adds a contribution item to this manager at the beginning of the 
-     * group with the given name.
-     *
-     * @param groupName the name of the group
-     * @param item the contribution item
-     * @exception IllegalArgumentException if there is no group with
-     *   the given name
-     */
-    public void prependToGroup(String groupName, IContributionItem item);
-
-    /**
-     * Removes and returns the contribution item with the given id from this manager.  
-     * Returns <code>null</code> if this manager has no contribution items
-     * with the given id.
-     *
-     * @param id the contribution item id
-     * @return the item that was found and removed, or <code>null</code> if none
-     */
-    public IContributionItem remove(String id);
-
-    /**
-     * Removes the given contribution item from the contribution items
-     * known to this manager.
-     *
-     * @param item the contribution item
-     * @return the <code>item</code> parameter if the item was removed,
-     *   and <code>null</code> if it was not found
-     */
-    public IContributionItem remove(IContributionItem item);
-
-    /**
-     * Removes all contribution items from this manager.
-     */
-    public void removeAll();
-
-    /**
-     * Updates this manager's underlying widget(s) with any changes which
-     * have been made to it or its items.  Normally changes to a contribution
-     * manager merely mark it as dirty, without updating the underlying widgets.
-     * This brings the underlying widgets up to date with any changes.
-     *
-     * @param force <code>true</code> means update even if not dirty,
-     *   and <code>false</code> for normal incremental updating
-     */
-    public void update(boolean force);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IContributionManagerOverrides.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IContributionManagerOverrides.java
deleted file mode 100644
index f41c041..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IContributionManagerOverrides.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-/**
- * This interface is used by instances of <code>IContributionItem</code>
- * to determine if the values for certain properties have been overriden
- * by their manager.
- * <p>
- * This interface is internal to the framework; it should not be implemented outside
- * the framework.
- * </p>
- * 
- * @since 2.0
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IContributionManagerOverrides {
-    /**
-     * Id for the enabled property. Value is <code>"enabled"</code>.
-     * 
-     * @since 2.0
-     */
-    public final static String P_ENABLED = "enabled"; //$NON-NLS-1$
-
-    /**
-     * Find out the enablement of the item
-     * @param item the contribution item for which the enable override value is 
-     * determined
-     * @return <ul>
-     * 				<li><code>Boolean.TRUE</code> if the given contribution item should be enabled</li>
-     * 				<li><code>Boolean.FALSE</code> if the item should be disabled</li>
-     * 				<li><code>null</code> if the item may determine its own enablement</li>
-     * 			</ul>
-     * @since 2.0 
-     */
-    public Boolean getEnabled(IContributionItem item);
-
-    /**
-     * This is not intended to be called outside of the workbench. This method
-     * is intended to be deprecated in 3.1.
-     * 
-     * TODO deprecate for 3.1 
-     * @param item the contribution item for which the accelerator value is determined
-     * @return the accelerator
-     */
-    public Integer getAccelerator(IContributionItem item);
-
-    /**
-     * This is not intended to be called outside of the workbench. This method
-     * is intended to be deprecated in 3.1.
-     * 
-     * TODO deprecate for 3.1
-     * @param item the contribution item for which the accelerator text is determined
-     * @return the text for the accelerator
-     */
-    public String getAcceleratorText(IContributionItem item);
-
-    /**
-     * This is not intended to be called outside of the workbench. This method
-     * is intended to be deprecated in 3.1.
-     * 
-     * TODO deprecate for 3.1
-     * @param item the contribution item for which the text is determined
-     * @return the text
-     */
-    public String getText(IContributionItem item);
-    
-    /**
-     * Visiblity override.
-     * 
-     * @param item the contribution item in question
-     * @return  <ul>
-     * 				<li><code>Boolean.TRUE</code> if the given contribution item should be visible</li>
-     * 				<li><code>Boolean.FALSE</code> if the item should not be visible</li>
-     * 				<li><code>null</code> if the item may determine its own visibility</li>
-     * 			</ul>
-     * @since 3.5
-     */
-    public Boolean getVisible(IContributionItem item);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ICoolBarManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ICoolBarManager.java
deleted file mode 100644
index 85173e7..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ICoolBarManager.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import org.eclipse.swt.widgets.CoolBar;
-
-/**
- * The <code>ICoolBarManager</code> interface provides protocol for managing
- * contributions to a cool bar. A cool bar manager delegates responsibility for
- * creating child controls to its contribution items by calling
- * {@link IContributionItem#fill(CoolBar, int)}.
- * <p>
- * This interface is internal to the framework; it should not be implemented
- * outside the framework. This package provides a concrete cool bar manager
- * implementation, {@link CoolBarManager}, which
- * clients may instantiate or subclass.
- * </p>
- * 
- * @see ToolBarContributionItem
- * @since 3.0
- */
-public interface ICoolBarManager extends IContributionManager {
-
-    /**
-     * Property name of a cool item's size (value <code>"size"</code>).
-     * <p>
-     * The cool bar manager uses this property to tell its cool items to update
-     * their size.
-     * </p>
-     * 
-     * @see IContributionItem#update(String) @issue consider declaring this
-     *      constant elsewhere
-     */
-    public static final String SIZE = "size"; //$NON-NLS-1$
-
-    /**
-     * A convenience method to add a tool bar as a contribution item to this
-     * cool bar manager. Equivalent to <code>add(new ToolBarContributionManager(toolBarManager))</code>.
-     * 
-     * @param toolBarManager
-     *            the tool bar manager to be added
-     * @see ToolBarContributionItem
-     */
-    public void add(IToolBarManager toolBarManager);
-
-    /**
-     * Returns the context menu manager used by this cool bar manager. This
-     * context menu manager is used by the cool bar manager except for cool
-     * items that provide their own.
-     * 
-     * @return the context menu manager, or <code>null</code> if none
-     * @see #setContextMenuManager
-     */
-    public IMenuManager getContextMenuManager();
-
-    /**
-     * Returns whether the layout of the underlying cool bar widget is locked.
-     * 
-     * @return <code>true</code> if cool bar layout is locked, <code>false</code>
-     *         otherwise
-     */
-    public boolean getLockLayout();
-
-    /**
-     * Returns the style of the underlying cool bar widget.
-     * 
-     * @return the style of the cool bar
-     */
-    public int getStyle();
-
-    /**
-     * Sets the context menu of this cool bar manager to the given menu
-     * manager.
-     * 
-     * @param menuManager
-     *            the context menu manager, or <code>null</code> if none
-     * @see #getContextMenuManager
-     */
-    public void setContextMenuManager(IMenuManager menuManager);
-
-    /**
-     * Locks or unlocks the layout of the underlying cool bar widget. Once the
-     * cool bar is locked, cool items cannot be repositioned by the user.
-     * <p>
-     * Note that items can be added or removed programmatically even while the
-     * cool bar is locked.
-     * </p>
-     * 
-     * @param value
-     *            <code>true</code> to lock the cool bar, <code>false</code>
-     *            to unlock
-     */
-    public void setLockLayout(boolean value);
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IMenuCreator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IMenuCreator.java
deleted file mode 100644
index a4fa76a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IMenuCreator.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-
-/**
- * Interface for something that creates and disposes of SWT menus.  Note that
- * it is the responsibility of the implementor to dispose of SWT menus it
- * creates. 
- */
-public interface IMenuCreator {
-    /**
-     * Disposes the menu returned by <code>getMenu</code>. Does nothing
-     * if there is no menu.  This method will be executed only when the
-     * parent of the menu is disposed.  
-     */
-    public void dispose();
-
-    /**
-     * Returns the SWT menu, created as a pop up menu parented by the
-     * given control.  In most cases, this menu can be created once, cached and reused
-     * when the pop-up/drop-down action occurs.  If the menu must be dynamically
-     * created (i.e., each time it is popped up or dropped down), the old menu
-     * should be disposed of before replacing it with the new menu.
-     *
-     * @param parent the parent control
-     * @return the menu, or <code>null</code> if the menu could not
-     *  be created
-     */
-    public Menu getMenu(Control parent);
-
-    /**
-     * Returns an SWT menu created as a drop down menu parented by the
-     * given menu.  In most cases, this menu can be created once, cached and reused
-     * when the pop-up/drop-down action occurs.  If the menu must be dynamically
-     * created (i.e., each time it is popped up or dropped down), the old menu
-     * should be disposed of before replacing it with the new menu.
-     *
-     * @param parent the parent menu
-     * @return the menu, or <code>null</code> if the menu could not
-     *  be created
-     */
-    public Menu getMenu(Menu parent);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IMenuListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IMenuListener.java
deleted file mode 100644
index 2ddec63..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IMenuListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-/**
- * A menu listener that gets informed when a menu is about to show.
- *
- * @see MenuManager#addMenuListener
- */
-public interface IMenuListener {
-    /**
-     * Notifies this listener that the menu is about to be shown by
-     * the given menu manager.
-     *
-     * @param manager the menu manager
-     */
-    public void menuAboutToShow(IMenuManager manager);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IMenuListener2.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IMenuListener2.java
deleted file mode 100644
index 4c57bcc..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IMenuListener2.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-/**
- * A menu listener that gets informed when a menu is about to hide.
- *
- * @see MenuManager#addMenuListener
- * @since 3.2
- */
-public interface IMenuListener2 extends IMenuListener {
-    /**
-     * Notifies this listener that the menu is about to be hidden by
-     * the given menu manager.
-     *
-     * @param manager the menu manager
-     */
-    public void menuAboutToHide(IMenuManager manager);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IMenuManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IMenuManager.java
deleted file mode 100644
index aaa2b8b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IMenuManager.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-/**
- * The <code>IMenuManager</code> interface provides protocol for managing
- * contributions to a menu bar and its sub menus.
- * An <code>IMenuManager</code> is also an <code>IContributionItem</code>,
- * allowing sub-menus to be nested in parent menus.
- * <p>
- * This interface is internal to the framework; it should not be implemented outside
- * the framework.
- * </p>
- * <p>
- * This package provides a concrete menu manager implementation,
- * {@link MenuManager <code>MenuManager</code>}.
- * </p>
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IMenuManager extends IContributionManager, IContributionItem {
-    /**
-     * Adds a menu listener to this menu.
-     * Has no effect if an identical listener is already registered.
-     *
-     * @param listener a menu listener
-     */
-    public void addMenuListener(IMenuListener listener);
-
-    /**
-     * Finds the manager for the menu at the given path. A path
-     * consists of contribution item ids separated by the separator 
-     * character.  The path separator character is <code>'/'</code>.
-     * <p>
-     * Convenience for <code>findUsingPath(path)</code> which
-     * extracts an <code>IMenuManager</code> if possible.
-     * </p>
-     *
-     * @param path the path string
-     * @return the menu contribution item, or <code>null</code>
-     *   if there is no such contribution item or if the item does
-     *   not have an associated menu manager
-     */
-    public IMenuManager findMenuUsingPath(String path);
-
-    /**
-     * Finds the contribution item at the given path. A path
-     * consists of contribution item ids separated by the separator 
-     * character. The path separator character is <code>'/'</code>.
-     *
-     * @param path the path string
-     * @return the contribution item, or <code>null</code> if there is no
-     *   such contribution item
-     */
-    public IContributionItem findUsingPath(String path);
-
-    /**
-	 * Returns whether all items should be removed when the menu is about to
-	 * show, but before notifying menu listeners. The default is
-	 * <code>false</code>.
-	 * 
-	 * @return <code>true</code> if all items should be removed when shown,
-	 *         <code>false</code> if not
-	 */
-    public boolean getRemoveAllWhenShown();
-
-    /**
-     * Returns whether this menu should be enabled or not.
-     *
-     * @return <code>true</code> if enabled, and
-     *   <code>false</code> if disabled
-     */
-    public boolean isEnabled();
-
-    /**
-     * Removes the given menu listener from this menu.
-     * Has no effect if an identical listener is not registered.
-     *
-     * @param listener the menu listener
-     */
-    public void removeMenuListener(IMenuListener listener);
-
-    /**
-	 * Sets whether all items should be removed when the menu is about to show,
-	 * but before notifying menu listeners.
-	 * 
-	 * @param removeAll
-	 *            <code>true</code> if all items should be removed when shown,
-	 *            <code>false</code> if not
-	 */
-    public void setRemoveAllWhenShown(boolean removeAll);
-
-    /**
-     * Incrementally builds the menu from the contribution items, and
-     * does so recursively for all submenus.
-     *
-     * @param force <code>true</code> means update even if not dirty,
-     *   and <code>false</code> for normal incremental updating
-     */
-    public void updateAll(boolean force);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IStatusLineManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IStatusLineManager.java
deleted file mode 100644
index 4a44994..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IStatusLineManager.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The <code>IStatusLineManager</code> interface provides protocol
- * for displaying messages on a status line, for monitoring progress,
- * and for managing contributions to the status line.
- * <p>
- * <b>Note:</b> An error message overrides the current message until
- * the error message is cleared.
- * </p><p>
- * This package also provides a concrete status line manager implementation,
- * {@link StatusLineManager <code>StatusLineManager</code>}.
- * </p>
- */
-public interface IStatusLineManager extends IContributionManager {
-	/**
-	 * Returns a progress monitor which reports progress in the status line.
-	 * Note that the returned progress monitor may only be accessed from the UI
-	 * thread.
-	 * 
-	 * @return the progress monitor
-	 * 
-	 *         Note: There is a delay after a beginTask message before the
-	 *         monitor is shown. This may not be appropriate for all apps.
-	 */
-    public IProgressMonitor getProgressMonitor();
-
-    /**
-     * Returns whether the cancel button on the status line's progress monitor
-     * is enabled.
-     *
-     * @return <code>true</code> if the cancel button is enabled, or <code>false</code> if not
-     */
-    public boolean isCancelEnabled();
-
-    /**
-     * Sets whether the cancel button on the status line's progress monitor
-     * is enabled.
-     *
-     * @param enabled <code>true</code> if the cancel button is enabled, or <code>false</code> if not
-     */
-    public void setCancelEnabled(boolean enabled);
-
-    /**
-     * Sets the error message text to be displayed on the status line.
-     * The image on the status line is cleared.
-     * <p>
-     * An error message overrides the current message until the error 
-     * message is cleared (set to <code>null</code>).
-     * </p>
-     *
-     * @param message the error message, or <code>null</code> to clear
-     * 		the current error message.
-     */
-    public void setErrorMessage(String message);
-
-    /**
-     * Sets the image and error message to be displayed on the status line.
-     * <p>
-     * An error message overrides the current message until the error 
-     * message is cleared (set to <code>null</code>).
-     * </p>
-     *
-     * @param image the image to use, or <code>null</code> for no image
-     * @param message the error message, or <code>null</code> to clear
-     * 		the current error message.
-     */
-    public void setErrorMessage(Image image, String message);
-
-    /**
-     * Sets the message text to be displayed on the status line.
-     * The image on the status line is cleared.
-     * <p>
-     * This method replaces the current message but does not affect the 
-     * error message. That is, the error message, if set, will continue
-     * to be displayed until it is cleared (set to <code>null</code>).
-     * </p>
-     *
-     * @param message the message, or <code>null</code> for no message
-     */
-    public void setMessage(String message);
-
-    /**
-     * Sets the image and message to be displayed on the status line.
-     * <p>
-     * This method replaces the current message but does not affect the 
-     * error message. That is, the error message, if set, will continue
-     * to be displayed until it is cleared (set to <code>null</code>).
-     * </p>
-     *
-     * @param image the image to use, or <code>null</code> for no image
-     * @param message the message, or <code>null</code> for no message
-     */
-    public void setMessage(Image image, String message);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IToolBarManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IToolBarManager.java
deleted file mode 100644
index f7711cf..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/IToolBarManager.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-/**
- * The <code>IToolBarManager</code> interface provides protocol for managing
- * contributions to a tool bar. It extends <code>IContributionManager</code>
- * but does not declare any new members; it exists only to increase the
- * readability of code using tool bars.
- * <p>
- * This package also provides a concrete tool bar manager implementation,
- * {@link ToolBarManager <code>ToolBarManager</code>}.
- * </p>
- */
-public interface IToolBarManager extends IContributionManager {
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/LegacyActionTools.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/LegacyActionTools.java
deleted file mode 100644
index 53ae441..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/LegacyActionTools.java
+++ /dev/null
@@ -1,738 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.action;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-
-/**
- * <p>
- * Some static utility methods for handling labels on actions. This includes
- * mnemonics and accelerators.
- * </p>
- * <p>
- * Clients may neither instantiate this class nor extend.
- * </p>
- * 
- * @since 3.2
- */
-public final class LegacyActionTools {
-
-	/**
-	 * Table of key codes (key type: <code>String</code>, value type:
-	 * <code>Integer</code>); <code>null</code> if not yet initialized.
-	 * 
-	 * @see #findKeyCode
-	 */
-	private static Map keyCodes = null;
-
-	/**
-	 * Table of string representations of keys (key type: <code>Integer</code>,
-	 * value type: <code>String</code>); <code>null</code>> if not yet
-	 * initialized.
-	 * 
-	 * @see #findKeyString
-	 */
-	private static Map keyStrings = null;
-
-	/**
-	 * The localized uppercase version of ALT
-	 */
-	private static String localizedAlt;
-
-	/**
-	 * The localized uppercase version of COMMAND
-	 */
-	private static String localizedCommand;
-
-	/**
-	 * The localized uppercase version of CTRL
-	 */
-	private static String localizedCtrl;
-
-	/**
-	 * Table of key codes (key type: <code>String</code>, value type:
-	 * <code>Integer</code>); <code>null</code> if not yet initialized. The
-	 * key is the localalized name of the key as it appears in menus.
-	 * 
-	 * @see #findLocalizedKeyCode
-	 */
-	private static Map localizedKeyCodes = null;
-
-	/**
-	 * The localized uppercase version of SHIFT
-	 */
-	private static String localizedShift;
-
-	/**
-	 * The constant to use if there is no mnemonic for this location.
-	 */
-	public static final char MNEMONIC_NONE = 0;
-
-	/**
-	 * Converts an accelerator key code to a string representation.
-	 * 
-	 * @param keyCode
-	 *            the key code to be translated
-	 * @return a string representation of the key code
-	 */
-	public static final String convertAccelerator(final int keyCode) {
-		String modifier = getModifierString(keyCode);
-		String fullKey;
-		if (modifier.equals("")) { //$NON-NLS-1$
-			fullKey = findKeyString(keyCode);
-		} else {
-			fullKey = modifier + "+" + findKeyString(keyCode); //$NON-NLS-1$
-		}
-		return fullKey;
-	}
-
-	/**
-	 * Parses the given accelerator text, and converts it to an accelerator key
-	 * code.
-	 * 
-	 * @param acceleratorText
-	 *            the accelerator text
-	 * @return the SWT key code, or 0 if there is no accelerator
-	 */
-	public static final int convertAccelerator(final String acceleratorText) {
-		int accelerator = 0;
-		StringTokenizer stok = new StringTokenizer(acceleratorText, "+"); //$NON-NLS-1$
-
-		int keyCode = -1;
-
-		boolean hasMoreTokens = stok.hasMoreTokens();
-		while (hasMoreTokens) {
-			String token = stok.nextToken();
-			hasMoreTokens = stok.hasMoreTokens();
-			// Every token except the last must be one of the modifiers
-			// Ctrl, Shift, Alt, or Command
-			if (hasMoreTokens) {
-				int modifier = findModifier(token);
-				if (modifier != 0) {
-					accelerator |= modifier;
-				} else { // Leave if there are none
-					return 0;
-				}
-			} else {
-				keyCode = findKeyCode(token);
-			}
-		}
-		if (keyCode != -1) {
-			accelerator |= keyCode;
-		}
-		return accelerator;
-	}
-
-	/**
-	 * Parses the given accelerator text, and converts it to an accelerator key
-	 * code.
-	 * 
-	 * Support for localized modifiers is for backwards compatibility with 1.0.
-	 * Use setAccelerator(int) to set accelerators programatically or the
-	 * <code>accelerator</code> tag in action definitions in plugin.xml.
-	 * 
-	 * @param acceleratorText
-	 *            the accelerator text localized to the current locale
-	 * @return the SWT key code, or 0 if there is no accelerator
-	 */
-	static final int convertLocalizedAccelerator(final String acceleratorText) {
-		int accelerator = 0;
-		StringTokenizer stok = new StringTokenizer(acceleratorText, "+"); //$NON-NLS-1$
-
-		int keyCode = -1;
-
-		boolean hasMoreTokens = stok.hasMoreTokens();
-		while (hasMoreTokens) {
-			String token = stok.nextToken();
-			hasMoreTokens = stok.hasMoreTokens();
-			// Every token except the last must be one of the modifiers
-			// Ctrl, Shift, Alt, or Command
-			if (hasMoreTokens) {
-				int modifier = findLocalizedModifier(token);
-				if (modifier != 0) {
-					accelerator |= modifier;
-				} else { // Leave if there are none
-					return 0;
-				}
-			} else {
-				keyCode = findLocalizedKeyCode(token);
-			}
-		}
-		if (keyCode != -1) {
-			accelerator |= keyCode;
-		}
-		return accelerator;
-	}
-
-	/**
-	 * Extracts the accelerator text from the given text. Returns
-	 * <code>null</code> if there is no accelerator text, and the empty string
-	 * if there is no text after the accelerator delimeter (tab or '@').
-	 * 
-	 * @param text
-	 *            the text for the action; may be <code>null</code>.
-	 * @return the accelerator text, or <code>null</code>
-	 */
-	public static final String extractAcceleratorText(final String text) {
-		if (text == null) {
-			return null;
-		}
-
-		int index = text.lastIndexOf('\t');
-		if (index == -1) {
-			index = text.lastIndexOf('@');
-		}
-		if (index >= 0) {
-			return text.substring(index + 1);
-		}
-		return null;
-	}
-
-	/**
-	 * Extracts the mnemonic text from the given string.
-	 * 
-	 * @param text
-	 *            The text from which the mnemonic should be extracted; may be
-	 *            <code>null</code>
-	 * @return The text of the mnemonic; will be {@link #MNEMONIC_NONE} if there
-	 *         is no mnemonic;
-	 */
-	public static final char extractMnemonic(final String text) {
-		if (text == null) {
-			return MNEMONIC_NONE;
-		}
-
-		int index = text.indexOf('&');
-		if (index == -1) {
-			return MNEMONIC_NONE;
-		}
-
-		final int textLength = text.length();
-
-		// Ignore '&' at the end of the string.
-		if (index == textLength - 1) {
-			return MNEMONIC_NONE;
-		}
-
-		// Ignore two consecutive ampersands.
-		while (text.charAt(index + 1) == '&') {
-			index = text.indexOf('&', ++index);
-			if (index == textLength - 1) {
-				return MNEMONIC_NONE;
-			}
-		}
-
-		return text.charAt(index + 1);
-	}
-
-	/**
-	 * Maps a standard keyboard key name to an SWT key code. Key names are
-	 * converted to upper case before comparison. If the key name is a single
-	 * letter, for example "S", its character code is returned.
-	 * <p>
-	 * The following key names are known (case is ignored):
-	 * <ul>
-	 * <li><code>"BACKSPACE"</code></li>
-	 * <li><code>"TAB"</code></li>
-	 * <li><code>"RETURN"</code></li>
-	 * <li><code>"ENTER"</code></li>
-	 * <li><code>"ESC"</code></li>
-	 * <li><code>"ESCAPE"</code></li>
-	 * <li><code>"DELETE"</code></li>
-	 * <li><code>"SPACE"</code></li>
-	 * <li><code>"ARROW_UP"</code>, <code>"ARROW_DOWN"</code>,
-	 * <code>"ARROW_LEFT"</code>, and <code>"ARROW_RIGHT"</code></li>
-	 * <li><code>"PAGE_UP"</code> and <code>"PAGE_DOWN"</code></li>
-	 * <li><code>"HOME"</code></li>
-	 * <li><code>"END"</code></li>
-	 * <li><code>"INSERT"</code></li>
-	 * <li><code>"F1"</code>, <code>"F2"</code> through <code>"F12"</code></li>
-	 * </ul>
-	 * </p>
-	 * 
-	 * @param token
-	 *            the key name
-	 * @return the SWT key code, <code>-1</code> if no match was found
-	 * @see SWT
-	 */
-	public static final int findKeyCode(String token) {
-		if (keyCodes == null) {
-			initKeyCodes();
-		}
-		token = token.toUpperCase();
-		Integer i = (Integer) keyCodes.get(token);
-		if (i != null) {
-			return i.intValue();
-		}
-		if (token.length() == 1) {
-			return token.charAt(0);
-		}
-		return -1;
-	}
-
-	/**
-	 * Maps an SWT key code to a standard keyboard key name. The key code is
-	 * stripped of modifiers (SWT.CTRL, SWT.ALT, SWT.SHIFT, and SWT.COMMAND). If
-	 * the key code is not an SWT code (for example if it a key code for the key
-	 * 'S'), a string containing a character representation of the key code is
-	 * returned.
-	 * 
-	 * @param keyCode
-	 *            the key code to be translated
-	 * @return the string representation of the key code
-	 * @see SWT
-	 * @since 2.0
-	 */
-	public static final String findKeyString(final int keyCode) {
-		if (keyStrings == null) {
-			initKeyStrings();
-		}
-		int i = keyCode & ~(SWT.CTRL | SWT.ALT | SWT.SHIFT | SWT.COMMAND);
-		Integer integer = new Integer(i);
-		String result = (String) keyStrings.get(integer);
-		if (result != null) {
-			return result;
-		}
-		result = new String(new char[] { (char) i });
-		return result;
-	}
-
-	/**
-	 * Find the supplied code for a localized key. As #findKeyCode but localized
-	 * to the current locale.
-	 * 
-	 * Support for localized modifiers is for backwards compatibility with 1.0.
-	 * Use setAccelerator(int) to set accelerators programatically or the
-	 * <code>accelerator</code> tag in action definitions in plugin.xml.
-	 * 
-	 * @param token
-	 *            the localized key name
-	 * @return the SWT key code, <code>-1</code> if no match was found
-	 * @see #findKeyCode
-	 */
-	private static final int findLocalizedKeyCode(String token) {
-		if (localizedKeyCodes == null) {
-			initLocalizedKeyCodes();
-		}
-		token = token.toUpperCase();
-		Integer i = (Integer) localizedKeyCodes.get(token);
-		if (i != null) {
-			return i.intValue();
-		}
-		if (token.length() == 1) {
-			return token.charAt(0);
-		}
-		return -1;
-	}
-
-	/**
-	 * Maps the localized modifier names to a code in the same manner as
-	 * #findModifier.
-	 * 
-	 * Support for localized modifiers is for backwards compatibility with 1.0.
-	 * Use setAccelerator(int) to set accelerators programatically or the
-	 * <code>accelerator</code> tag in action definitions in plugin.xml.
-	 * 
-	 * @see #findModifier
-	 */
-	private static final int findLocalizedModifier(String token) {
-		if (localizedCtrl == null) {
-			initLocalizedModifiers();
-		}
-
-		token = token.toUpperCase();
-		if (token.equals(localizedCtrl)) {
-			return SWT.CTRL;
-		}
-		if (token.equals(localizedShift)) {
-			return SWT.SHIFT;
-		}
-		if (token.equals(localizedAlt)) {
-			return SWT.ALT;
-		}
-		if (token.equals(localizedCommand)) {
-			return SWT.COMMAND;
-		}
-		return 0;
-	}
-
-	/**
-	 * Maps standard keyboard modifier key names to the corresponding SWT
-	 * modifier bit. The following modifier key names are recognized (case is
-	 * ignored): <code>"CTRL"</code>, <code>"SHIFT"</code>,
-	 * <code>"ALT"</code>, and <code>"COMMAND"</code>. The given modifier
-	 * key name is converted to upper case before comparison.
-	 * 
-	 * @param token
-	 *            the modifier key name
-	 * @return the SWT modifier bit, or <code>0</code> if no match was found
-	 * @see SWT
-	 */
-	public static final int findModifier(String token) {
-		token = token.toUpperCase();
-		if (token.equals("CTRL")) { //$NON-NLS-1$
-			return SWT.CTRL;
-		}
-		if (token.equals("SHIFT")) { //$NON-NLS-1$
-			return SWT.SHIFT;
-		}
-		if (token.equals("ALT")) { //$NON-NLS-1$
-			return SWT.ALT;
-		}
-		if (token.equals("COMMAND")) { //$NON-NLS-1$
-			return SWT.COMMAND;
-		}
-		return 0;
-	}
-
-	/**
-	 * Returns a string representation of an SWT modifier bit (SWT.CTRL,
-	 * SWT.ALT, SWT.SHIFT, and SWT.COMMAND). Returns <code>null</code> if the
-	 * key code is not an SWT modifier bit.
-	 * 
-	 * @param keyCode
-	 *            the SWT modifier bit to be translated
-	 * @return the string representation of the SWT modifier bit, or
-	 *         <code>null</code> if the key code was not an SWT modifier bit
-	 * @see SWT
-	 */
-	public static final String findModifierString(final int keyCode) {
-		if (keyCode == SWT.CTRL) {
-			return JFaceResources.getString("Ctrl"); //$NON-NLS-1$
-		}
-		if (keyCode == SWT.ALT) {
-			return JFaceResources.getString("Alt"); //$NON-NLS-1$
-		}
-		if (keyCode == SWT.SHIFT) {
-			return JFaceResources.getString("Shift"); //$NON-NLS-1$
-		}
-		if (keyCode == SWT.COMMAND) {
-			return JFaceResources.getString("Command"); //$NON-NLS-1$		
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the string representation of the modifiers (Ctrl, Alt, Shift,
-	 * Command) of the key event.
-	 * 
-	 * @param keyCode
-	 *            The key code for which the modifier string is desired.
-	 * @return The string representation of the key code; never
-	 *         <code>null</code>.
-	 */
-	private static String getModifierString(int keyCode) {
-		String modString = ""; //$NON-NLS-1$
-
-		if ((keyCode & SWT.CTRL) != 0) {
-			modString = findModifierString(keyCode & SWT.CTRL);
-		}
-
-		if ((keyCode & SWT.ALT) != 0) {
-			if (modString.equals("")) { //$NON-NLS-1$
-				modString = findModifierString(keyCode & SWT.ALT);
-			} else {
-				modString = modString
-						+ "+" + findModifierString(keyCode & SWT.ALT); //$NON-NLS-1$
-			}
-		}
-
-		if ((keyCode & SWT.SHIFT) != 0) {
-			if (modString.equals("")) { //$NON-NLS-1$
-				modString = findModifierString(keyCode & SWT.SHIFT);
-			} else {
-				modString = modString
-						+ "+" + findModifierString(keyCode & SWT.SHIFT); //$NON-NLS-1$
-			}
-		}
-
-		if ((keyCode & SWT.COMMAND) != 0) {
-			if (modString.equals("")) { //$NON-NLS-1$
-				modString = findModifierString(keyCode & SWT.COMMAND);
-			} else {
-				modString = modString
-						+ "+" + findModifierString(keyCode & SWT.COMMAND); //$NON-NLS-1$
-			}
-		}
-
-		return modString;
-	}
-
-	/**
-	 * Initializes the internal key code table.
-	 */
-	private static final void initKeyCodes() {
-		keyCodes = new HashMap(40);
-
-		keyCodes.put("BACKSPACE", new Integer(8)); //$NON-NLS-1$
-		keyCodes.put("TAB", new Integer(9)); //$NON-NLS-1$
-		keyCodes.put("RETURN", new Integer(13)); //$NON-NLS-1$
-		keyCodes.put("ENTER", new Integer(13)); //$NON-NLS-1$
-		keyCodes.put("ESCAPE", new Integer(27)); //$NON-NLS-1$
-		keyCodes.put("ESC", new Integer(27)); //$NON-NLS-1$
-		keyCodes.put("DELETE", new Integer(127)); //$NON-NLS-1$
-
-		keyCodes.put("SPACE", new Integer(' ')); //$NON-NLS-1$
-		keyCodes.put("ARROW_UP", new Integer(SWT.ARROW_UP)); //$NON-NLS-1$
-		keyCodes.put("ARROW_DOWN", new Integer(SWT.ARROW_DOWN)); //$NON-NLS-1$
-		keyCodes.put("ARROW_LEFT", new Integer(SWT.ARROW_LEFT)); //$NON-NLS-1$
-		keyCodes.put("ARROW_RIGHT", new Integer(SWT.ARROW_RIGHT)); //$NON-NLS-1$
-		keyCodes.put("PAGE_UP", new Integer(SWT.PAGE_UP)); //$NON-NLS-1$
-		keyCodes.put("PAGE_DOWN", new Integer(SWT.PAGE_DOWN)); //$NON-NLS-1$
-		keyCodes.put("HOME", new Integer(SWT.HOME)); //$NON-NLS-1$
-		keyCodes.put("END", new Integer(SWT.END)); //$NON-NLS-1$
-		keyCodes.put("INSERT", new Integer(SWT.INSERT)); //$NON-NLS-1$
-		keyCodes.put("F1", new Integer(SWT.F1)); //$NON-NLS-1$
-		keyCodes.put("F2", new Integer(SWT.F2)); //$NON-NLS-1$
-		keyCodes.put("F3", new Integer(SWT.F3)); //$NON-NLS-1$
-		keyCodes.put("F4", new Integer(SWT.F4)); //$NON-NLS-1$
-		keyCodes.put("F5", new Integer(SWT.F5)); //$NON-NLS-1$
-		keyCodes.put("F6", new Integer(SWT.F6)); //$NON-NLS-1$
-		keyCodes.put("F7", new Integer(SWT.F7)); //$NON-NLS-1$
-		keyCodes.put("F8", new Integer(SWT.F8)); //$NON-NLS-1$
-		keyCodes.put("F9", new Integer(SWT.F9)); //$NON-NLS-1$
-		keyCodes.put("F10", new Integer(SWT.F10)); //$NON-NLS-1$
-		keyCodes.put("F11", new Integer(SWT.F11)); //$NON-NLS-1$
-		keyCodes.put("F12", new Integer(SWT.F12)); //$NON-NLS-1$
-	}
-
-	/**
-	 * Initializes the internal key string table.
-	 */
-	private static void initKeyStrings() {
-		keyStrings = new HashMap(40);
-
-		keyStrings.put(new Integer(8), JFaceResources.getString("Backspace")); //$NON-NLS-1$
-		keyStrings.put(new Integer(9), JFaceResources.getString("Tab")); //$NON-NLS-1$
-		keyStrings.put(new Integer(13), JFaceResources.getString("Return")); //$NON-NLS-1$
-		keyStrings.put(new Integer(13), JFaceResources.getString("Enter")); //$NON-NLS-1$
-		keyStrings.put(new Integer(27), JFaceResources.getString("Escape")); //$NON-NLS-1$
-		keyStrings.put(new Integer(27), JFaceResources.getString("Esc")); //$NON-NLS-1$
-		keyStrings.put(new Integer(127), JFaceResources.getString("Delete")); //$NON-NLS-1$
-
-		keyStrings.put(new Integer(' '), JFaceResources.getString("Space")); //$NON-NLS-1$
-
-		keyStrings.put(new Integer(SWT.ARROW_UP), JFaceResources
-				.getString("Arrow_Up")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.ARROW_DOWN), JFaceResources
-				.getString("Arrow_Down")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.ARROW_LEFT), JFaceResources
-				.getString("Arrow_Left")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.ARROW_RIGHT), JFaceResources
-				.getString("Arrow_Right")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.PAGE_UP), JFaceResources
-				.getString("Page_Up")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.PAGE_DOWN), JFaceResources
-				.getString("Page_Down")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.HOME), JFaceResources.getString("Home")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.END), JFaceResources.getString("End")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.INSERT), JFaceResources
-				.getString("Insert")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.F1), JFaceResources.getString("F1")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.F2), JFaceResources.getString("F2")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.F3), JFaceResources.getString("F3")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.F4), JFaceResources.getString("F4")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.F5), JFaceResources.getString("F5")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.F6), JFaceResources.getString("F6")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.F7), JFaceResources.getString("F7")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.F8), JFaceResources.getString("F8")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.F9), JFaceResources.getString("F9")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.F10), JFaceResources.getString("F10")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.F11), JFaceResources.getString("F11")); //$NON-NLS-1$
-		keyStrings.put(new Integer(SWT.F12), JFaceResources.getString("F12")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Initializes the localized internal key code table.
-	 */
-	private static void initLocalizedKeyCodes() {
-		localizedKeyCodes = new HashMap(40);
-
-		localizedKeyCodes.put(JFaceResources
-				.getString("Backspace").toUpperCase(), new Integer(8)); //$NON-NLS-1$
-		localizedKeyCodes.put(
-				JFaceResources.getString("Tab").toUpperCase(), new Integer(9)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("Return").toUpperCase(), new Integer(13)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("Enter").toUpperCase(), new Integer(13)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("Escape").toUpperCase(), new Integer(27)); //$NON-NLS-1$
-		localizedKeyCodes.put(
-				JFaceResources.getString("Esc").toUpperCase(), new Integer(27)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("Delete").toUpperCase(), new Integer(127)); //$NON-NLS-1$
-
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("Space").toUpperCase(), new Integer(' ')); //$NON-NLS-1$
-
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("Arrow_Up").toUpperCase(), new Integer(SWT.ARROW_UP)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("Arrow_Down").toUpperCase(), new Integer(SWT.ARROW_DOWN)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("Arrow_Left").toUpperCase(), new Integer(SWT.ARROW_LEFT)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("Arrow_Right").toUpperCase(), new Integer(SWT.ARROW_RIGHT)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("Page_Up").toUpperCase(), new Integer(SWT.PAGE_UP)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("Page_Down").toUpperCase(), new Integer(SWT.PAGE_DOWN)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("Home").toUpperCase(), new Integer(SWT.HOME)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("End").toUpperCase(), new Integer(SWT.END)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("Insert").toUpperCase(), new Integer(SWT.INSERT)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("F1").toUpperCase(), new Integer(SWT.F1)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("F2").toUpperCase(), new Integer(SWT.F2)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("F3").toUpperCase(), new Integer(SWT.F3)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("F4").toUpperCase(), new Integer(SWT.F4)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("F5").toUpperCase(), new Integer(SWT.F5)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("F6").toUpperCase(), new Integer(SWT.F6)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("F7").toUpperCase(), new Integer(SWT.F7)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("F8").toUpperCase(), new Integer(SWT.F8)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("F9").toUpperCase(), new Integer(SWT.F9)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("F10").toUpperCase(), new Integer(SWT.F10)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("F11").toUpperCase(), new Integer(SWT.F11)); //$NON-NLS-1$
-		localizedKeyCodes
-				.put(
-						JFaceResources.getString("F12").toUpperCase(), new Integer(SWT.F12)); //$NON-NLS-1$
-	}
-
-	/**
-	 * Initialize the list of localized modifiers
-	 */
-	private static void initLocalizedModifiers() {
-		localizedCtrl = JFaceResources.getString("Ctrl").toUpperCase(); //$NON-NLS-1$
-		localizedShift = JFaceResources.getString("Shift").toUpperCase(); //$NON-NLS-1$
-		localizedAlt = JFaceResources.getString("Alt").toUpperCase(); //$NON-NLS-1$
-		localizedCommand = JFaceResources.getString("Command").toUpperCase(); //$NON-NLS-1$	
-	}
-
-	/**
-	 * Convenience method for removing any optional accelerator text from the
-	 * given string. The accelerator text appears at the end of the text, and is
-	 * separated from the main part by a single tab character <code>'\t'</code>.
-	 * 
-	 * @param text
-	 *            the text
-	 * @return the text sans accelerator
-	 */
-	public static final String removeAcceleratorText(final String text) {
-		int index = text.lastIndexOf('\t');
-		if (index == -1) {
-			index = text.lastIndexOf('@');
-		}
-		if (index >= 0) {
-			return text.substring(0, index);
-		}
-		return text;
-	}
-
-	/**
-	 * Convenience method for removing any mnemonics from the given string. For
-	 * example, <code>removeMnemonics("&Open")</code> will return
-	 * <code>"Open"</code>.
-	 * 
-	 * @param text
-	 *            the text
-	 * @return the text sans mnemonics
-	 */
-	public static final String removeMnemonics(final String text) {
-		int index = text.indexOf('&');
-		if (index == -1) {
-			return text;
-		}
-		int len = text.length();
-		StringBuffer sb = new StringBuffer(len);
-		int lastIndex = 0;
-		while (index != -1) {
-			// ignore & at the end
-			if (index == len - 1) {
-				break;
-			}
-			// handle the && case
-			if (text.charAt(index + 1) == '&') {
-				++index;
-			}
-
-			// DBCS languages use "(&X)" format
-			if (index > 0 && text.charAt(index - 1) == '('
-					&& text.length() >= index + 3
-					&& text.charAt(index + 2) == ')') {
-				sb.append(text.substring(lastIndex, index - 1));
-				index += 3;
-			} else {
-				sb.append(text.substring(lastIndex, index));
-				// skip the &
-				++index;
-			}
-
-			lastIndex = index;
-			index = text.indexOf('&', index);
-		}
-		if (lastIndex < len) {
-			sb.append(text.substring(lastIndex, len));
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * This class cannot be instantiated.
-	 */
-	private LegacyActionTools() {
-		// Does nothing
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/MenuManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/MenuManager.java
deleted file mode 100644
index 270cce5..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/MenuManager.java
+++ /dev/null
@@ -1,984 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Remy Chi Jian Suen <remy.suen@gmail.com> - Bug 12116 [Contributions] widgets: MenuManager.setImageDescriptor() method needed
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.resource.LocalResourceManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MenuAdapter;
-import org.eclipse.swt.events.MenuEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.CoolBar;
-import org.eclipse.swt.widgets.Decorations;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.ToolBar;
-
-/**
- * A menu manager is a contribution manager which realizes itself and its items
- * in a menu control; either as a menu bar, a sub-menu, or a context menu.
- * <p>
- * This class may be instantiated; it may also be subclassed.
- * </p>
- */
-public class MenuManager extends ContributionManager implements IMenuManager {
-
-    /**
-     * The menu id.
-     */
-    private String id;
-
-    /**
-     * List of registered menu listeners (element type: <code>IMenuListener</code>).
-     */
-    private ListenerList listeners = new ListenerList();
-
-    /**
-     * The menu control; <code>null</code> before
-     * creation and after disposal.
-     */
-    private Menu menu = null;
-
-    /**
-     * The menu item widget; <code>null</code> before
-     * creation and after disposal. This field is used
-     * when this menu manager is a sub-menu.
-     */
-    private MenuItem menuItem;
-
-    /**
-     * The text for a sub-menu.
-     */
-    private String menuText;
-    
-    /**
-     * The image for a sub-menu.
-     */
-    private ImageDescriptor image;
-    
-    /**
-     * A resource manager to remember all of the images that have been used by this menu.
-     */
-    private LocalResourceManager imageManager;
-
-    /**
-     * The overrides for items of this manager
-     */
-    private IContributionManagerOverrides overrides;
-
-    /**
-     * The parent contribution manager.
-     */
-    private IContributionManager parent;
-
-    /**
-     * Indicates whether <code>removeAll</code> should be
-     * called just before the menu is displayed.
-     */
-    private boolean removeAllWhenShown = false;
-
-    /**
-     * Indicates this item is visible in its manager; <code>true</code> 
-     * by default.
-     * @since 3.3
-     */
-    protected boolean visible = true;
-
-	/**
-	 * allows a submenu to display a shortcut key. This is often used with the
-	 * QuickMenu command or action which can pop up a menu using the shortcut.
-	 */
-	private String definitionId = null;
-
-    /**
-     * Creates a menu manager.  The text and id are <code>null</code>.
-     * Typically used for creating a context menu, where it doesn't need to be referred to by id.
-     */
-    public MenuManager() {
-        this(null, null, null);
-    }
-
-    /**
-     * Creates a menu manager with the given text. The id of the menu
-     * is <code>null</code>.
-     * Typically used for creating a sub-menu, where it doesn't need to be referred to by id.
-     *
-     * @param text the text for the menu, or <code>null</code> if none
-     */
-    public MenuManager(String text) {
-        this(text, null, null);
-    }
-
-    /**
-     * Creates a menu manager with the given text and id.
-     * Typically used for creating a sub-menu, where it needs to be referred to by id.
-     *
-     * @param text the text for the menu, or <code>null</code> if none
-     * @param id the menu id, or <code>null</code> if it is to have no id
-     */
-    public MenuManager(String text, String id) {
-        this(text, null, id);
-    }
-
-    /**
-     * Creates a menu manager with the given text, image, and id.
-     * Typically used for creating a sub-menu, where it needs to be referred to by id.
-     * 
-     * @param text the text for the menu, or <code>null</code> if none
-     * @param image the image for the menu, or <code>null</code> if none
-     * @param id the menu id, or <code>null</code> if it is to have no id
-     * @since 3.4
-     */
-    public MenuManager(String text, ImageDescriptor image, String id) {
-        this.menuText = text;
-        this.image = image;
-        this.id = id;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuManager#addMenuListener(org.eclipse.jface.action.IMenuListener)
-     */
-    public void addMenuListener(IMenuListener listener) {
-        listeners.add(listener);
-    }
-
-    /**
-     * Creates and returns an SWT context menu control for this menu,
-     * and installs all registered contributions.
-     * Does not create a new control if one already exists.
-     * <p>
-     * Note that the menu is not expected to be dynamic.
-     * </p>
-     *
-     * @param parent the parent control
-     * @return the menu control
-     */
-    public Menu createContextMenu(Control parent) {
-        if (!menuExist()) {
-            menu = new Menu(parent);
-            initializeMenu();
-        }
-        return menu;
-    }
-
-    /**
-     * Creates and returns an SWT menu bar control for this menu,
-     * for use in the given <code>Decorations</code>, and installs all registered
-     * contributions. Does not create a new control if one already exists.
-     *
-     * @param parent the parent decorations
-     * @return the menu control
-     * @since 2.1
-     */
-    public Menu createMenuBar(Decorations parent) {
-        if (!menuExist()) {
-            menu = new Menu(parent, SWT.BAR);
-            update(false);
-        }
-        return menu;
-    }
-
-    /**
-     * Creates and returns an SWT menu bar control for this menu, for use in the
-     * given <code>Shell</code>, and installs all registered contributions. Does not
-     * create a new control if one already exists. This implementation simply calls
-     * the <code>createMenuBar(Decorations)</code> method
-     *
-     * @param parent the parent decorations
-     * @return the menu control
-     * @deprecated use <code>createMenuBar(Decorations)</code> instead.
-     */
-    public Menu createMenuBar(Shell parent) {
-        return createMenuBar((Decorations) parent);
-    }
-
-    /**
-     * Disposes of this menu manager and frees all allocated SWT resources.
-     * Notifies all contribution items of the dispose. Note that this method does
-     * not clean up references between this menu manager and its associated
-     * contribution items. Use <code>removeAll</code> for that purpose.
-     */
-    public void dispose() {
-        if (menuExist()) {
-			menu.dispose();
-		}
-        menu = null;
-
-        if (menuItem != null) {
-            menuItem.dispose();
-            menuItem = null;
-        }
-
-        disposeOldImages();
-        
-        IContributionItem[] items = getItems();
-        for (int i = 0; i < items.length; i++) {
-            items[i].dispose();
-        }
-        
-        markDirty();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#fill(org.eclipse.swt.widgets.Composite)
-     */
-    public void fill(Composite parent) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#fill(org.eclipse.swt.widgets.CoolBar, int)
-     */
-    public void fill(CoolBar parent, int index) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#fill(org.eclipse.swt.widgets.Menu, int)
-     */
-    public void fill(Menu parent, int index) {
-        if (menuItem == null || menuItem.isDisposed()) {
-            if (index >= 0) {
-				menuItem = new MenuItem(parent, SWT.CASCADE, index);
-			} else {
-				menuItem = new MenuItem(parent, SWT.CASCADE);
-			}
-
-            menuItem.setText(getMenuText());
-
-            if (image != null) {
-				LocalResourceManager localManager = new LocalResourceManager(
-						JFaceResources.getResources());
-				menuItem.setImage(localManager.createImage(image));
-				disposeOldImages();
-				imageManager = localManager;
-			}
-
-            if (!menuExist()) {
-				menu = new Menu(parent);
-			}
-
-            menuItem.setMenu(menu);
-
-            initializeMenu();
-
-            setDirty(true);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#fill(org.eclipse.swt.widgets.ToolBar, int)
-     */
-    public void fill(ToolBar parent, int index) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuManager#findMenuUsingPath(java.lang.String)
-     */
-    public IMenuManager findMenuUsingPath(String path) {
-        IContributionItem item = findUsingPath(path);
-        if (item instanceof IMenuManager) {
-			return (IMenuManager) item;
-		}
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuManager#findUsingPath(java.lang.String)
-     */
-    public IContributionItem findUsingPath(String path) {
-        String id = path;
-        String rest = null;
-        int separator = path.indexOf('/');
-        if (separator != -1) {
-            id = path.substring(0, separator);
-            rest = path.substring(separator + 1);
-        } else {
-            return super.find(path);
-        }
-
-        IContributionItem item = super.find(id);
-        if (item instanceof IMenuManager) {
-            IMenuManager manager = (IMenuManager) item;
-            return manager.findUsingPath(rest);
-        }
-        return null;
-    }
-
-    /**
-     * Notifies any menu listeners that a menu is about to show.
-     * Only listeners registered at the time this method is called are notified.
-     *
-     * @param manager the menu manager
-     *
-     * @see IMenuListener#menuAboutToShow
-     */
-    private void fireAboutToShow(IMenuManager manager) {
-        Object[] listeners = this.listeners.getListeners();
-        for (int i = 0; i < listeners.length; ++i) {
-            ((IMenuListener) listeners[i]).menuAboutToShow(manager);
-        }
-    }
-
-    /**
-     * Notifies any menu listeners that a menu is about to hide.
-     * Only listeners registered at the time this method is called are notified.
-     *
-     * @param manager the menu manager
-     *
-     */
-    private void fireAboutToHide(IMenuManager manager) {
-        final Object[] listeners = this.listeners.getListeners();
-        for (int i = 0; i < listeners.length; ++i) {
-        	final Object listener = listeners[i];
-			if (listener instanceof IMenuListener2) {
-				final IMenuListener2 listener2 = (IMenuListener2) listener;
-				listener2.menuAboutToHide(manager);
-			}
-        }
-    }
-
-    /**
-	 * Returns the menu id. The menu id is used when creating a contribution
-	 * item for adding this menu as a sub menu of another.
-	 * 
-	 * @return the menu id
-	 */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * Returns the SWT menu control for this menu manager.
-     *
-     * @return the menu control
-     */
-    public Menu getMenu() {
-        return menu;
-    }
-
-    /**
-     * Returns the text shown in the menu, potentially with a shortcut
-     * appended.
-     *
-     * @return the menu text
-     */
-    public String getMenuText() {
-		if (definitionId == null) {
-			return menuText;
-		}
-		ExternalActionManager.ICallback callback = ExternalActionManager
-				.getInstance().getCallback();
-		if (callback != null) {
-			String shortCut = callback.getAcceleratorText(definitionId);
-			if (shortCut == null) {
-				return menuText;
-			}
-			return menuText + "\t" + shortCut; //$NON-NLS-1$
-		}
-		return menuText;
-	}
-    
-    /**
-	 * Returns the image for this menu as an image descriptor.
-	 * 
-	 * @return the image, or <code>null</code> if this menu has no image
-	 * @since 3.4
-	 */
-    public ImageDescriptor getImageDescriptor() {
-    	return image;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionManager#getOverrides()
-     */
-    public IContributionManagerOverrides getOverrides() {
-        if (overrides == null) {
-            if (parent == null) {
-                overrides = new IContributionManagerOverrides() {
-                    public Integer getAccelerator(IContributionItem item) {
-                        return null;
-                    }
-
-                    public String getAcceleratorText(IContributionItem item) {
-                        return null;
-                    }
-
-                    public Boolean getEnabled(IContributionItem item) {
-                        return null;
-                    }
-
-                    public String getText(IContributionItem item) {
-                        return null;
-                    }
-    				public Boolean getVisible(IContributionItem item) {
-    					return null;
-    				}
-                };
-            } else {
-                overrides = parent.getOverrides();
-            }
-            super.setOverrides(overrides);
-        }
-        return overrides;
-    }
-
-    /**
-     * Returns the parent contribution manager of this manger.
-     * 
-     * @return the parent contribution manager
-     * @since 2.0
-     */
-    public IContributionManager getParent() {
-        return parent;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuManager#getRemoveAllWhenShown()
-     */
-    public boolean getRemoveAllWhenShown() {
-        return removeAllWhenShown;
-    }
-
-    /**
-     * Notifies all listeners that this menu is about to appear.
-     */
-    private void handleAboutToShow() {
-        if (removeAllWhenShown) {
-			removeAll();
-		}
-        fireAboutToShow(this);
-        update(false, false);
-    }
-
-    /**
-     * Notifies all listeners that this menu is about to disappear.
-     */
-    private void handleAboutToHide() {
-        fireAboutToHide(this);
-    }
-
-    /**
-     * Initializes the menu control.
-     */
-    private void initializeMenu() {
-        menu.addMenuListener(new MenuAdapter() {
-            public void menuHidden(MenuEvent e) {
-                //			ApplicationWindow.resetDescription(e.widget);
-            	handleAboutToHide();
-            }
-
-            public void menuShown(MenuEvent e) {
-                handleAboutToShow();
-            }
-        });
-        // Don't do an update(true) here, in case menu is never opened.
-        // Always do it lazily in handleAboutToShow().
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#isDynamic()
-     */
-    public boolean isDynamic() {
-        return false;
-    }
-
-    /**
-     * Returns whether this menu should be enabled or not.
-     * Used to enable the menu item containing this menu when it is realized as a sub-menu.
-     * <p>
-     * The default implementation of this framework method
-     * returns <code>true</code>. Subclasses may reimplement.
-     * </p>
-     *
-     * @return <code>true</code> if enabled, and
-     *   <code>false</code> if disabled
-     */
-    public boolean isEnabled() {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#isGroupMarker()
-     */
-    public boolean isGroupMarker() {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#isSeparator()
-     */
-    public boolean isSeparator() {
-        return false;
-    }
-
-    /**
-     * Check if the contribution is item is a subsitute for ourselves
-     * 
-     * @param item the contribution item
-     * @return <code>true</code> if give item is a substitution for ourselves 
-     * @deprecated this method is no longer a part of the 
-     *   {@link org.eclipse.jface.action.IContributionItem} API.
-     */
-    public boolean isSubstituteFor(IContributionItem item) {
-        return this.equals(item);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#isVisible()
-     */
-    public boolean isVisible() {
-        if (!visible) {
-			return false; // short circuit calculations in this case
-		}
-
-        if (removeAllWhenShown) {
-        	// we have no way of knowing if the menu has children
-        	return true;
-        }
-        
-        // menus aren't visible if all of its children are invisible (or only contains visible separators).
-        IContributionItem[] childItems = getItems();
-        boolean visibleChildren = false;
-        for (int j = 0; j < childItems.length; j++) {
-            if (isChildVisible(childItems[j]) && !childItems[j].isSeparator()) {
-                visibleChildren = true;
-                break;
-            }
-        }
-
-        return visibleChildren;
-    }
-
-    
-    /**
-     * The <code>MenuManager</code> implementation of this <code>ContributionManager</code> method
-     * also propagates the dirty flag up the parent chain.
-     * 
-     * @since 3.1
-     */
-    public void markDirty() {
-        super.markDirty();
-        // Can't optimize by short-circuiting when the first dirty manager is encountered,
-        // since non-visible children are not even processed.
-        // That is, it's possible to have a dirty sub-menu under a non-dirty parent menu
-        // even after the parent menu has been updated. 
-        // If items are added/removed in the sub-menu, we still need to propagate the dirty flag up,
-        // even if the sub-menu is already dirty, since the result of isVisible() may change
-        // due to the added/removed items.
-        IContributionManager parent = getParent();
-        if (parent != null) {
-            parent.markDirty();
-        }
-    }
-    
-    /**
-     * Returns whether the menu control is created
-     * and not disposed.
-     * 
-     * @return <code>true</code> if the control is created
-     *	and not disposed, <code>false</code> otherwise
-	 * @since 3.4 protected, was added in 3.1 as private method
-     */
-    protected boolean menuExist() {
-        return menu != null && !menu.isDisposed();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuManager#removeMenuListener(org.eclipse.jface.action.IMenuListener)
-     */
-    public void removeMenuListener(IMenuListener listener) {
-        listeners.remove(listener);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#saveWidgetState()
-     */
-    public void saveWidgetState() {
-    }
-
-    /**
-     * Sets the overrides for this contribution manager
-     * 
-     * @param newOverrides the overrides for the items of this manager
-     * @since 2.0
-     */
-    public void setOverrides(IContributionManagerOverrides newOverrides) {
-        overrides = newOverrides;
-        super.setOverrides(overrides);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#setParent(org.eclipse.jface.action.IContributionManager)
-     */
-    public void setParent(IContributionManager manager) {
-        parent = manager;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuManager#setRemoveAllWhenShown(boolean)
-     */
-    public void setRemoveAllWhenShown(boolean removeAll) {
-        this.removeAllWhenShown = removeAll;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#setVisible(boolean)
-     */
-    public void setVisible(boolean visible) {
-        this.visible = visible;
-    }
-    
-    /**
-	 * Sets the action definition id of this action. This simply allows the menu
-	 * item text to include a short cut if available.  It can be used to
-	 * notify a user of a key combination that will open a quick menu.
-	 * 
-	 * @param definitionId
-	 *            the command definition id
-	 * @since 3.4
-	 */
-    public void setActionDefinitionId(String definitionId) {
-    	this.definitionId = definitionId; 
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#update()
-     */
-    public void update() {
-        updateMenuItem();
-    }
-
-    /**
-     * The <code>MenuManager</code> implementation of this <code>IContributionManager</code>
-     * updates this menu, but not any of its submenus.
-     *
-     * @see #updateAll
-     */
-    public void update(boolean force) {
-        update(force, false);
-    }
-
-    /**
-	 * Get all the items from the implementation's widget.
-	 * 
-	 * @return the menu items
-	 * @since 3.4
-	 */
-    protected Item[] getMenuItems() {
-    	if (menu != null) {
-    		return menu.getItems();
-    	}
-    	return null;
-    }
-
-    /**
-	 * Get an item from the implementation's widget.
-	 * 
-	 * @param index
-	 *            of the item
-	 * @return the menu item
-	 * @since 3.4
-	 */
-    protected Item getMenuItem(int index) {
-    	if (menu !=null) {
-    		return menu.getItem(index);
-    	}
-    	return null;
-    }
-
-    /**
-     * Get the menu item count for the implementation's widget.
-     * 
-     * @return the number of items
-     * @since 3.4
-     */
-    protected int getMenuItemCount() {
-    	if (menu != null) {
-    		return menu.getItemCount();
-    	}
-    	return 0;
-    }
-
-    /**
-	 * Call an <code>IContributionItem</code>'s fill method with the
-	 * implementation's widget. The default is to use the <code>Menu</code>
-	 * widget.<br>
-	 * <code>fill(Menu menu, int index)</code>
-	 * 
-	 * @param ci
-	 *            An <code>IContributionItem</code> whose <code>fill()</code>
-	 *            method should be called.
-	 * @param index
-	 *            The position the <code>fill()</code> method should start
-	 *            inserting at.
-	 * @since 3.4
-	 */
-    protected void doItemFill(IContributionItem ci, int index) {
-        ci.fill(menu, index);
-    }
-
-    /**
-     * Incrementally builds the menu from the contribution items.
-     * This method leaves out double separators and separators in the first 
-     * or last position.
-     *
-     * @param force <code>true</code> means update even if not dirty,
-     *   and <code>false</code> for normal incremental updating
-     * @param recursive <code>true</code> means recursively update 
-     *   all submenus, and <code>false</code> means just this menu
-     */
-    protected void update(boolean force, boolean recursive) {
-        if (isDirty() || force) {
-            if (menuExist()) {
-                // clean contains all active items without double separators
-                IContributionItem[] items = getItems();
-                List clean = new ArrayList(items.length);
-                IContributionItem separator = null;
-                for (int i = 0; i < items.length; ++i) {
-                    IContributionItem ci = items[i];
-                    if (!isChildVisible(ci)) {
-						continue;
-					}
-                    if (ci.isSeparator()) {
-                        // delay creation until necessary 
-                        // (handles both adjacent separators, and separator at end)
-                        separator = ci;
-                    } else {
-                        if (separator != null) {
-                            if (clean.size() > 0) {
-								clean.add(separator);
-							}
-                            separator = null;
-                        }
-                        clean.add(ci);
-                    }
-                }
-
-                // remove obsolete (removed or non active)
-                Item[] mi = getMenuItems();
-
-                for (int i = 0; i < mi.length; i++) {
-                    Object data = mi[i].getData();
-
-                    if (data == null || !clean.contains(data)) {
-                        mi[i].dispose();
-                    } else if (data instanceof IContributionItem
-                            && ((IContributionItem) data).isDynamic()
-                            && ((IContributionItem) data).isDirty()) {
-                        mi[i].dispose();
-                    }
-                }
-
-                // add new
-                mi = getMenuItems();
-                int srcIx = 0;
-                int destIx = 0;
-
-                for (Iterator e = clean.iterator(); e.hasNext();) {
-                    IContributionItem src = (IContributionItem) e.next();
-                    IContributionItem dest;
-
-                    // get corresponding item in SWT widget
-                    if (srcIx < mi.length) {
-						dest = (IContributionItem) mi[srcIx].getData();
-					} else {
-						dest = null;
-					}
-
-                    if (dest != null && src.equals(dest)) {
-                        srcIx++;
-                        destIx++;
-                    } else if (dest != null && dest.isSeparator()
-                            && src.isSeparator()) {
-                        mi[srcIx].setData(src);
-                        srcIx++;
-                        destIx++;
-                    } else {
-                        int start = getMenuItemCount();
-                        doItemFill(src, destIx);
-                        int newItems = getMenuItemCount() - start;
-                        for (int i = 0; i < newItems; i++) {
-                            Item item = getMenuItem(destIx++);
-                            item.setData(src);
-                        }
-                    }
-
-                    // May be we can optimize this call. If the menu has just
-                    // been created via the call src.fill(fMenuBar, destIx) then
-                    // the menu has already been updated with update(true) 
-                    // (see MenuManager). So if force is true we do it again. But
-                    // we can't set force to false since then information for the
-                    // sub sub menus is lost.
-                    if (recursive) {
-                        IContributionItem item = src;
-                        if (item instanceof SubContributionItem) {
-							item = ((SubContributionItem) item).getInnerItem();
-						}
-                        if (item instanceof IMenuManager) {
-							((IMenuManager) item).updateAll(force);
-						}
-                    }
-
-                }
-
-                // remove any old menu items not accounted for
-                for (; srcIx < mi.length; srcIx++) {
-					mi[srcIx].dispose();
-				}
-
-                setDirty(false);
-            }
-        } else {
-            // I am not dirty. Check if I must recursivly walk down the hierarchy.
-            if (recursive) {
-                IContributionItem[] items = getItems();
-                for (int i = 0; i < items.length; ++i) {
-                    IContributionItem ci = items[i];
-                    if (ci instanceof IMenuManager) {
-                        IMenuManager mm = (IMenuManager) ci;
-                        if (isChildVisible(mm)) {
-                            mm.updateAll(force);
-                        }
-                    }
-                }
-            }
-        }
-        updateMenuItem();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#update(java.lang.String)
-     */
-    public void update(String property) {
-        IContributionItem items[] = getItems();
-
-        for (int i = 0; i < items.length; i++) {
-			items[i].update(property);
-		}
-        
-        if (menu != null && !menu.isDisposed() && menu.getParentItem() != null) {
-        	if (IAction.TEXT.equals(property)) {
-                String text = getOverrides().getText(this);
-
-                if (text == null) {
-    				text = getMenuText();
-    			}
-
-                if (text != null) {
-                    ExternalActionManager.ICallback callback = ExternalActionManager
-                            .getInstance().getCallback();
-
-                    if (callback != null) {
-                        int index = text.indexOf('&');
-
-                        if (index >= 0 && index < text.length() - 1) {
-                            char character = Character.toUpperCase(text
-                                    .charAt(index + 1));
-
-                            if (callback.isAcceleratorInUse(SWT.ALT | character)) {
-                                if (index == 0) {
-    								text = text.substring(1);
-    							} else {
-    								text = text.substring(0, index)
-                                            + text.substring(index + 1);
-    							}
-                            }
-                        }
-                    }
-
-                    menu.getParentItem().setText(text);
-                }
-        	} else if (IAction.IMAGE.equals(property) && image != null) {
-    			LocalResourceManager localManager = new LocalResourceManager(JFaceResources
-    					.getResources());
-    			menu.getParentItem().setImage(localManager.createImage(image));
-    			disposeOldImages();
-    			imageManager = localManager;
-        	}
-        }
-    }
-
-	/**
-	 * Dispose any images allocated for this menu
-	 */
-	private void disposeOldImages() {
-		if (imageManager != null) {
-			imageManager.dispose();
-			imageManager = null;
-		}
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuManager#updateAll(boolean)
-     */
-    public void updateAll(boolean force) {
-        update(force, true);
-    }
-
-    /**
-     * Updates the menu item for this sub menu.
-     * The menu item is disabled if this sub menu is empty.
-     * Does nothing if this menu is not a submenu.
-     */
-    private void updateMenuItem() {
-        /*
-         * Commented out until proper solution to enablement of
-         * menu item for a sub-menu is found. See bug 30833 for
-         * more details.
-         *  
-         if (menuItem != null && !menuItem.isDisposed() && menuExist()) {
-         IContributionItem items[] = getItems();
-         boolean enabled = false;
-         for (int i = 0; i < items.length; i++) {
-         IContributionItem item = items[i];
-         enabled = item.isEnabled();
-         if(enabled) break;
-         }
-         // Workaround for 1GDDCN2: SWT:Linux - MenuItem.setEnabled() always causes a redraw
-         if (menuItem.getEnabled() != enabled)
-         menuItem.setEnabled(enabled);
-         }
-         */
-        // Partial fix for bug #34969 - diable the menu item if no
-        // items in sub-menu (for context menus).
-        if (menuItem != null && !menuItem.isDisposed() && menuExist()) {
-            boolean enabled = removeAllWhenShown || menu.getItemCount() > 0;
-            // Workaround for 1GDDCN2: SWT:Linux - MenuItem.setEnabled() always causes a redraw
-            if (menuItem.getEnabled() != enabled) {
-                // We only do this for context menus (for bug #34969)
-                Menu topMenu = menu;
-                while (topMenu.getParentMenu() != null) {
-					topMenu = topMenu.getParentMenu();
-				}
-                if ((topMenu.getStyle() & SWT.BAR) == 0) {
-					menuItem.setEnabled(enabled);
-				}
-            }
-        }
-    }
-    
-	private boolean isChildVisible(IContributionItem item) {
-		Boolean v = getOverrides().getVisible(item);
-		if (v != null) {
-			return v.booleanValue();
-		}
-		return item.isVisible();
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/Separator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/Separator.java
deleted file mode 100644
index 5f120ee..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/Separator.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * A separator is a special kind of contribution item which acts
- * as a visual separator and, optionally, acts as a group marker.
- * Unlike group markers, separators do have a visual representation for
- * menus and toolbars.
- * <p>
- * This class may be instantiated; it is not intended to be 
- * subclassed outside the framework.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class Separator extends AbstractGroupMarker {
-    /**
-     * Creates a separator which does not start a new group.
-     */
-    public Separator() {
-        super();
-    }
-
-    /**
-     * Creates a new separator which also defines a new group having the given group name.
-     * The group name must not be <code>null</code> or the empty string.
-     * The group name is also used as the item id.
-     * 
-     * @param groupName the group name of the separator
-     */
-    public Separator(String groupName) {
-        super(groupName);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     * Fills the given menu with a SWT separator MenuItem.
-     */
-    public void fill(Menu menu, int index) {
-        if (index >= 0) {
-			new MenuItem(menu, SWT.SEPARATOR, index);
-		} else {
-			new MenuItem(menu, SWT.SEPARATOR);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     * Fills the given tool bar with a SWT separator ToolItem.
-     */
-    public void fill(ToolBar toolbar, int index) {
-        if (index >= 0) {
-			new ToolItem(toolbar, SWT.SEPARATOR, index);
-		} else {
-			new ToolItem(toolbar, SWT.SEPARATOR);
-		}
-    }
-
-    /** 
-     * The <code>Separator</code> implementation of this <code>IContributionItem</code> 
-     * method returns <code>true</code>
-     */
-    public boolean isSeparator() {
-        return true;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/StatusLine.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/StatusLine.java
deleted file mode 100644
index bb2dbe2..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/StatusLine.java
+++ /dev/null
@@ -1,679 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.action;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.ProgressIndicator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceColors;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Font;
-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.Layout;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * A StatusLine control is a SWT Composite with a horizontal layout which hosts
- * a number of status indication controls. Typically it is situated below the
- * content area of the window.
- * <p>
- * By default a StatusLine has two predefined status controls: a MessageLine and
- * a ProgressIndicator and it provides API for easy access.
- * </p>
- * <p>
- * This is an internal class, not intended to be used outside the JFace
- * framework.
- * </p>
- */
-/* package */class StatusLine extends Composite implements IProgressMonitor {
-
-	/** Horizontal gaps between items. */
-	public static final int GAP = 3;
-
-	/** Progress bar creation is delayed by this ms */
-	public static final int DELAY_PROGRESS = 500;
-
-	/** visibility state of the progressbar */
-	protected boolean fProgressIsVisible = false;
-
-	/** visibility state of the cancle button */
-	protected boolean fCancelButtonIsVisible = false;
-
-	/** enablement state of the cancle button */
-	protected boolean fCancelEnabled = false;
-
-	/** name of the task */
-	protected String fTaskName;
-
-	/** is the task is cancled */
-	protected boolean fIsCanceled;
-
-	/** the start time of the task */
-	protected long fStartTime;
-
-	private Cursor fStopButtonCursor;
-
-	/** the message text */
-	protected String fMessageText;
-
-	/** the message image */
-	protected Image fMessageImage;
-
-	/** the error text */
-	protected String fErrorText;
-
-	/** the error image */
-	protected Image fErrorImage;
-
-	/** the message label */
-	protected CLabel fMessageLabel;
-
-	/** the composite parent of the progress bar */
-	protected Composite fProgressBarComposite;
-
-	/** the progress bar */
-	protected ProgressIndicator fProgressBar;
-
-	/** the toolbar */
-	protected ToolBar fToolBar;
-
-	/** the cancle button */
-	protected ToolItem fCancelButton;
-
-	/** stop image descriptor */
-	protected static ImageDescriptor fgStopImage = ImageDescriptor
-			.createFromFile(StatusLine.class, "images/stop.gif");//$NON-NLS-1$
-	static {
-		JFaceResources.getImageRegistry().put(
-				"org.eclipse.jface.parts.StatusLine.stopImage", fgStopImage);//$NON-NLS-1$
-	}
-
-	/**
-	 * Layout the contribution item controls on the status line.
-	 */
-	public class StatusLineLayout extends Layout {
-		private final StatusLineLayoutData DEFAULT_DATA = new StatusLineLayoutData();
-
-		public Point computeSize(Composite composite, int wHint, int hHint,
-				boolean changed) {
-
-			if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT) {
-				return new Point(wHint, hHint);
-			}
-
-			Control[] children = composite.getChildren();
-			int totalWidth = 0;
-			int maxHeight = 0;
-			int totalCnt = 0;
-			for (int i = 0; i < children.length; i++) {
-				boolean useWidth = true;
-				Control w = children[i];
-				if (w == fProgressBarComposite && !fProgressIsVisible) {
-					useWidth = false;
-				} else if (w == fToolBar && !fCancelButtonIsVisible) {
-					useWidth = false;
-				}
-				StatusLineLayoutData data = (StatusLineLayoutData) w
-						.getLayoutData();
-				if (data == null) {
-					data = DEFAULT_DATA;
-				}
-				Point e = w.computeSize(data.widthHint, data.heightHint,
-						changed);
-				if (useWidth) {
-					totalWidth += e.x;
-					totalCnt++;
-				}
-				maxHeight = Math.max(maxHeight, e.y);
-			}
-			if (totalCnt > 0) {
-				totalWidth += (totalCnt - 1) * GAP;
-			}
-			if (totalWidth <= 0) {
-				totalWidth = maxHeight * 4;
-			}
-			return new Point(totalWidth, maxHeight);
-		}
-
-		public void layout(Composite composite, boolean flushCache) {
-
-			if (composite == null) {
-				return;
-			}
-
-			// StatusLineManager skips over the standard status line widgets
-			// in its update method. There is thus a dependency
-			// between the layout of the standard widgets and the update method.
-
-			// Make sure cancel button and progress bar are before
-			// contributions.
-			fMessageLabel.moveAbove(null);
-			fToolBar.moveBelow(fMessageLabel);
-			fProgressBarComposite.moveBelow(fToolBar);
-
-			Rectangle rect = composite.getClientArea();
-			Control[] children = composite.getChildren();
-			int count = children.length;
-
-			int ws[] = new int[count];
-
-			int h = rect.height;
-			int totalWidth = -GAP;
-			for (int i = 0; i < count; i++) {
-				Control w = children[i];
-				if (w == fProgressBarComposite && !fProgressIsVisible) {
-					continue;
-				}
-				if (w == fToolBar && !fCancelButtonIsVisible) {
-					continue;
-				}
-				StatusLineLayoutData data = (StatusLineLayoutData) w
-						.getLayoutData();
-				if (data == null) {
-					data = DEFAULT_DATA;
-				}
-				int width = w.computeSize(data.widthHint, h, flushCache).x;
-				ws[i] = width;
-				totalWidth += width + GAP;
-			}
-
-			int diff = rect.width - totalWidth;
-			ws[0] += diff; // make the first StatusLabel wider
-
-			// Check against minimum recommended width
-			final int msgMinWidth = rect.width / 3;
-			if (ws[0] < msgMinWidth) {
-				diff = ws[0] - msgMinWidth;
-				ws[0] = msgMinWidth;
-			} else {
-				diff = 0;
-			}
-
-			// Take space away from the contributions first.
-			for (int i = count - 1; i >= 0 && diff < 0; --i) {
-				int min = Math.min(ws[i], -diff);
-				ws[i] -= min;
-				diff += min + GAP;
-			}
-
-			int x = rect.x;
-			int y = rect.y;
-			for (int i = 0; i < count; i++) {
-				Control w = children[i];
-				/*
-				 * Workaround for Linux Motif: Even if the progress bar and
-				 * cancel button are not set to be visible ad of width 0, they
-				 * still draw over the first pixel of the editor contributions.
-				 * 
-				 * The fix here is to draw the progress bar and cancel button
-				 * off screen if they are not visible.
-				 */
-				if (w == fProgressBarComposite && !fProgressIsVisible
-						|| w == fToolBar && !fCancelButtonIsVisible) {
-					w.setBounds(x + rect.width, y, ws[i], h);
-					continue;
-				}
-				w.setBounds(x, y, ws[i], h);
-				if (ws[i] > 0) {
-					x += ws[i] + GAP;
-				}
-			}
-		}
-	}
-
-	/**
-	 * Create a new StatusLine as a child of the given parent.
-	 * 
-	 * @param parent
-	 *            the parent for this Composite
-	 * @param style
-	 *            the style used to create this widget
-	 */
-	public StatusLine(Composite parent, int style) {
-		super(parent, style);
-
-		addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				handleDispose();
-			}
-		});
-
-		// StatusLineManager skips over the standard status line widgets
-		// in its update method. There is thus a dependency
-		// between this code defining the creation and layout of the standard
-		// widgets and the update method.
-
-		setLayout(new StatusLineLayout());
-
-		fMessageLabel = new CLabel(this, SWT.NONE);// SWT.SHADOW_IN);
-		// Color[] colors = new Color[2];
-		// colors[0] =
-		// parent.getDisplay().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW);
-		// colors[1] = fMessageLabel.getBackground();
-		// int[] gradient = new int[] {JFaceColors.STATUS_PERCENT};
-		// fMessageLabel.setBackground(colors, gradient);
-
-		fProgressIsVisible = false;
-		fCancelEnabled = false;
-
-		fToolBar = new ToolBar(this, SWT.FLAT);
-		fCancelButton = new ToolItem(fToolBar, SWT.PUSH);
-		fCancelButton.setImage(fgStopImage.createImage());
-		fCancelButton.setToolTipText(JFaceResources
-				.getString("Cancel_Current_Operation")); //$NON-NLS-1$
-		fCancelButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				setCanceled(true);
-			}
-		});
-		fCancelButton.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				Image i = fCancelButton.getImage();
-				if ((i != null) && (!i.isDisposed())) {
-					i.dispose();
-				}
-			}
-		});
-
-		// We create a composite to create the progress bar in
-		// so that it can be centered. See bug #32331
-		fProgressBarComposite = new Composite(this, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.horizontalSpacing = 0;
-		layout.verticalSpacing = 0;
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		fProgressBarComposite.setLayout(layout);
-		fProgressBar = new ProgressIndicator(fProgressBarComposite);
-		fProgressBar.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
-				| GridData.GRAB_VERTICAL));
-
-		fStopButtonCursor = new Cursor(getDisplay(), SWT.CURSOR_ARROW);
-	}
-
-	/**
-	 * Notifies that the main task is beginning.
-	 * 
-	 * @param name
-	 *            the name (or description) of the main task
-	 * @param totalWork
-	 *            the total number of work units into which the main task is
-	 *            been subdivided. If the value is 0 or UNKNOWN the
-	 *            implemenation is free to indicate progress in a way which
-	 *            doesn't require the total number of work units in advance. In
-	 *            general users should use the UNKNOWN value if they don't know
-	 *            the total amount of work units.
-	 */
-	public void beginTask(String name, int totalWork) {
-		final long timestamp = System.currentTimeMillis();
-		fStartTime = timestamp;
-		final boolean animated = (totalWork == UNKNOWN || totalWork == 0);
-		// make sure the progress bar is made visible while
-		// the task is running. Fixes bug 32198 for the non-animated case.
-		Runnable timer = new Runnable() {
-			public void run() {
-				StatusLine.this.startTask(timestamp, animated);
-			}
-		};
-		if (fProgressBar == null) {
-			return;
-		}
-
-		fProgressBar.getDisplay().timerExec(DELAY_PROGRESS, timer);
-		if (!animated) {
-			fProgressBar.beginTask(totalWork);
-		}
-		if (name == null) {
-			fTaskName = Util.ZERO_LENGTH_STRING;
-		} else {
-			fTaskName = name;
-		}
-		setMessage(fTaskName);
-	}
-
-	/**
-	 * Notifies that the work is done; that is, either the main task is
-	 * completed or the user cancelled it. Done() can be called more than once;
-	 * an implementation should be prepared to handle this case.
-	 */
-	public void done() {
-
-		fStartTime = 0;
-
-		if (fProgressBar != null) {
-			fProgressBar.sendRemainingWork();
-			fProgressBar.done();
-		}
-		setMessage(null);
-
-		hideProgress();
-	}
-
-	/**
-	 * Returns the status line's progress monitor
-	 * 
-	 * @return {@link IProgressMonitor} the progress monitor
-	 */
-	public IProgressMonitor getProgressMonitor() {
-		return this;
-	}
-
-	/**
-	 * @private
-	 */
-	protected void handleDispose() {
-		if (fStopButtonCursor != null) {
-			fStopButtonCursor.dispose();
-			fStopButtonCursor = null;
-		}
-		if (fProgressBar != null) {
-			fProgressBar.dispose();
-			fProgressBar = null;
-		}
-	}
-
-	/**
-	 * Hides the Cancel button and ProgressIndicator.
-	 * 
-	 */
-	protected void hideProgress() {
-
-		if (fProgressIsVisible && !isDisposed()) {
-			fProgressIsVisible = false;
-			fCancelEnabled = false;
-			fCancelButtonIsVisible = false;
-			if (fToolBar != null && !fToolBar.isDisposed()) {
-				fToolBar.setVisible(false);
-			}
-			if (fProgressBarComposite != null
-					&& !fProgressBarComposite.isDisposed()) {
-				fProgressBarComposite.setVisible(false);
-			}
-			layout();
-		}
-	}
-
-	/**
-	 * @see IProgressMonitor#internalWorked(double)
-	 */
-	public void internalWorked(double work) {
-		if (!fProgressIsVisible) {
-			if (System.currentTimeMillis() - fStartTime > DELAY_PROGRESS) {
-				showProgress();
-			}
-		}
-
-		if (fProgressBar != null) {
-			fProgressBar.worked(work);
-		}
-	}
-
-	/**
-	 * Returns true if the user does some UI action to cancel this operation.
-	 * (like hitting the Cancel button on the progress dialog). The long running
-	 * operation typically polls isCanceled().
-	 */
-	public boolean isCanceled() {
-		return fIsCanceled;
-	}
-
-	/**
-	 * Returns
-	 * <code>true</true> if the ProgressIndication provides UI for canceling
-	 * a long running operation.
-	 * @return <code>true</true> if the ProgressIndication provides UI for canceling
-	 */
-	public boolean isCancelEnabled() {
-		return fCancelEnabled;
-	}
-
-	/**
-	 * Sets the cancel status. This method is usually called with the argument
-	 * false if a client wants to abort a cancel action.
-	 */
-	public void setCanceled(boolean b) {
-		fIsCanceled = b;
-		if (fCancelButton != null) {
-			fCancelButton.setEnabled(!b);
-		}
-	}
-
-	/**
-	 * Controls whether the ProgressIndication provides UI for canceling a long
-	 * running operation. If the ProgressIndication is currently visible calling
-	 * this method may have a direct effect on the layout because it will make a
-	 * cancel button visible.
-	 * 
-	 * @param enabled
-	 *            <code>true</true> if cancel should be enabled
-	 */
-	public void setCancelEnabled(boolean enabled) {
-		fCancelEnabled = enabled;
-		if (fProgressIsVisible && !fCancelButtonIsVisible && enabled) {
-			showButton();
-			layout();
-		}
-		if (fCancelButton != null && !fCancelButton.isDisposed()) {
-			fCancelButton.setEnabled(enabled);
-		}
-	}
-
-	/**
-	 * Sets the error message text to be displayed on the status line. The image
-	 * on the status line is cleared.
-	 * 
-	 * @param message
-	 *            the error message, or <code>null</code> for no error message
-	 */
-	public void setErrorMessage(String message) {
-		setErrorMessage(null, message);
-	}
-
-	/**
-	 * Sets an image and error message text to be displayed on the status line.
-	 * 
-	 * @param image
-	 *            the image to use, or <code>null</code> for no image
-	 * @param message
-	 *            the error message, or <code>null</code> for no error message
-	 */
-	public void setErrorMessage(Image image, String message) {
-		fErrorText = trim(message);
-		fErrorImage = image;
-		updateMessageLabel();
-	}
-
-	/**
-	 * Applies the given font to this status line.
-	 */
-	public void setFont(Font font) {
-		super.setFont(font);
-		Control[] children = getChildren();
-		for (int i = 0; i < children.length; i++) {
-			children[i].setFont(font);
-		}
-	}
-
-	/**
-	 * Sets the message text to be displayed on the status line. The image on
-	 * the status line is cleared.
-	 * 
-	 * @param message
-	 *            the error message, or <code>null</code> for no error message
-	 */
-	public void setMessage(String message) {
-		setMessage(null, message);
-	}
-
-	/**
-	 * Sets an image and a message text to be displayed on the status line.
-	 * 
-	 * @param image
-	 *            the image to use, or <code>null</code> for no image
-	 * @param message
-	 *            the message, or <code>null</code> for no message
-	 */
-	public void setMessage(Image image, String message) {
-		fMessageText = trim(message);
-		fMessageImage = image;
-		updateMessageLabel();
-	}
-
-	/**
-	 * @see IProgressMonitor#setTaskName(java.lang.String)
-	 */
-	public void setTaskName(String name) {
-		if (name == null)
-			fTaskName = Util.ZERO_LENGTH_STRING;
-		else
-			fTaskName = name;
-	}
-
-	/**
-	 * Makes the Cancel button visible.
-	 * 
-	 */
-	protected void showButton() {
-		if (fToolBar != null && !fToolBar.isDisposed()) {
-			fToolBar.setVisible(true);
-			fToolBar.setEnabled(true);
-			fToolBar.setCursor(fStopButtonCursor);
-			fCancelButtonIsVisible = true;
-		}
-	}
-
-	/**
-	 * Shows the Cancel button and ProgressIndicator.
-	 * 
-	 */
-	protected void showProgress() {
-		if (!fProgressIsVisible && !isDisposed()) {
-			fProgressIsVisible = true;
-			if (fCancelEnabled) {
-				showButton();
-			}
-			if (fProgressBarComposite != null
-					&& !fProgressBarComposite.isDisposed()) {
-				fProgressBarComposite.setVisible(true);
-			}
-			layout();
-		}
-	}
-
-	/**
-	 * @private
-	 */
-	void startTask(final long timestamp, final boolean animated) {
-		if (!fProgressIsVisible && fStartTime == timestamp) {
-			showProgress();
-			if (animated) {
-				if (fProgressBar != null && !fProgressBar.isDisposed()) {
-					fProgressBar.beginAnimatedTask();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Notifies that a subtask of the main task is beginning. Subtasks are
-	 * optional; the main task might not have subtasks.
-	 * 
-	 * @param name
-	 *            the name (or description) of the subtask
-	 * @see IProgressMonitor#subTask(String)
-	 */
-	public void subTask(String name) {
-
-		String newName;
-		if (name == null)
-			newName = Util.ZERO_LENGTH_STRING;
-		else
-			newName = name;
-
-		String text;
-		if (fTaskName == null || fTaskName.length() == 0) {
-			text = newName;
-		} else {
-			text = JFaceResources.format(
-					"Set_SubTask", new Object[] { fTaskName, newName });//$NON-NLS-1$
-		}
-		setMessage(text);
-	}
-
-	/**
-	 * Trims the message to be displayable in the status line. This just pulls
-	 * out the first line of the message. Allows null.
-	 */
-	String trim(String message) {
-		if (message == null) {
-			return null;
-		}
-		message = Util.replaceAll(message, "&", "&&"); //$NON-NLS-1$//$NON-NLS-2$
-		int cr = message.indexOf('\r');
-		int lf = message.indexOf('\n');
-		if (cr == -1 && lf == -1) {
-			return message;
-		}
-		int len;
-		if (cr == -1) {
-			len = lf;
-		} else if (lf == -1) {
-			len = cr;
-		} else {
-			len = Math.min(cr, lf);
-		}
-		return message.substring(0, len);
-	}
-
-	/**
-	 * Updates the message label widget.
-	 */
-	protected void updateMessageLabel() {
-		if (fMessageLabel != null && !fMessageLabel.isDisposed()) {
-			Display display = fMessageLabel.getDisplay();
-			if ((fErrorText != null && fErrorText.length() > 0)
-					|| fErrorImage != null) {
-				fMessageLabel.setForeground(JFaceColors.getErrorText(display));
-				fMessageLabel.setText(fErrorText);
-				fMessageLabel.setImage(fErrorImage);
-			} else {
-				fMessageLabel.setForeground(display
-						.getSystemColor(SWT.COLOR_WIDGET_FOREGROUND));
-				fMessageLabel.setText(fMessageText == null ? "" : fMessageText); //$NON-NLS-1$
-				fMessageLabel.setImage(fMessageImage);
-			}
-		}
-	}
-
-	/**
-	 * @see IProgressMonitor#worked(int)
-	 */
-	public void worked(int work) {
-		internalWorked(work);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/StatusLineContributionItem.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/StatusLineContributionItem.java
deleted file mode 100644
index 6ccc79b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/StatusLineContributionItem.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.action;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * A contribution item to be used with status line managers.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @since 3.4
- */
-public class StatusLineContributionItem extends ContributionItem {
-
-	private final static int DEFAULT_CHAR_WIDTH = 40;
-
-	private int charWidth;
-
-	private CLabel label;
-
-	/**
-	 * The composite into which this contribution item has been placed. This
-	 * will be <code>null</code> if this instance has not yet been
-	 * initialized.
-	 */
-	private Composite statusLine = null;
-
-	private String text = Util.ZERO_LENGTH_STRING;
-
-	private int widthHint = -1;
-
-	private int heightHint = -1;
-
-	/**
-	 * Creates a status line contribution item with the given id.
-	 * 
-	 * @param id
-	 *            the contribution item's id, or <code>null</code> if it is to
-	 *            have no id
-	 */
-	public StatusLineContributionItem(String id) {
-		this(id, DEFAULT_CHAR_WIDTH);
-	}
-
-	/**
-	 * Creates a status line contribution item with the given id that displays
-	 * the given number of characters.
-	 * 
-	 * @param id
-	 *            the contribution item's id, or <code>null</code> if it is to
-	 *            have no id
-	 * @param charWidth
-	 *            the number of characters to display
-	 */
-	public StatusLineContributionItem(String id, int charWidth) {
-		super(id);
-		this.charWidth = charWidth;
-		setVisible(false); // no text to start with
-	}
-
-	public void fill(Composite parent) {
-		statusLine = parent;
-
-		Label sep = new Label(parent, SWT.SEPARATOR);
-		label = new CLabel(statusLine, SWT.SHADOW_NONE);
-
-		if (widthHint < 0) {
-			GC gc = new GC(statusLine);
-			gc.setFont(statusLine.getFont());
-			FontMetrics fm = gc.getFontMetrics();
-			widthHint = fm.getAverageCharWidth() * charWidth;
-			heightHint = fm.getHeight();
-			gc.dispose();
-		}
-
-		StatusLineLayoutData data = new StatusLineLayoutData();
-		data.widthHint = widthHint;
-		label.setLayoutData(data);
-		label.setText(text);
-
-		data = new StatusLineLayoutData();
-		data.heightHint = heightHint;
-		sep.setLayoutData(data);
-	}
-
-	/**
-	 * An accessor for the current location of this status line contribution
-	 * item -- relative to the display.
-	 * 
-	 * @return The current location of this status line; <code>null</code> if
-	 *         not yet initialized.
-	 */
-	public Point getDisplayLocation() {
-		if ((label != null) && (statusLine != null)) {
-			return statusLine.toDisplay(label.getLocation());
-		}
-
-		return null;
-	}
-
-	/**
-	 * Retrieves the text that is being displayed in the status line.
-	 * 
-	 * @return the text that is currently being displayed
-	 */
-	public String getText() {
-		return text;
-	}
-
-	/**
-	 * Sets the text to be displayed in the status line.
-	 * 
-	 * @param text
-	 *            the text to be displayed, must not be <code>null</code>
-	 */
-	public void setText(String text) {
-		Assert.isNotNull(text);
-
-		this.text = escape(text);
-
-		if (label != null && !label.isDisposed()) {
-			label.setText(this.text);
-		}
-
-		if (this.text.length() == 0) {
-			if (isVisible()) {
-				setVisible(false);
-				IContributionManager contributionManager = getParent();
-
-				if (contributionManager != null) {
-					contributionManager.update(true);
-				}
-			}
-		} else {
-			if (!isVisible()) {
-				setVisible(true);
-				IContributionManager contributionManager = getParent();
-
-				if (contributionManager != null) {
-					contributionManager.update(true);
-				}
-			}
-		}
-	}
-
-	private String escape(String text) {
-		return Util.replaceAll(text, "&", "&&");  //$NON-NLS-1$//$NON-NLS-2$
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/StatusLineLayoutData.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/StatusLineLayoutData.java
deleted file mode 100644
index df93ec5..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/StatusLineLayoutData.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.action;
-
-import org.eclipse.swt.SWT;
-
-/**
- * Represents the layout data object for <code>Control</code> within the status line.
- * To set a <code>StatusLineLayoutData</code> object into a <code>Control</code>, use
- * the <code>setLayoutData()</code> method. 
- * <p>
- * NOTE: Do not reuse <code>StatusLineLayoutData</code> objects. Every control in the
- * status line must have a unique <code>StatusLineLayoutData</code> instance or
- * <code>null</code>.
- * </p>
- * 
- * @since 2.1
- */
-public class StatusLineLayoutData {
-    /**
-     * The <code>widthHint</code> specifies a minimum width for
-     * the <code>Control</code>. A value of <code>SWT.DEFAULT</code>
-     * indicates that no minimum width is specified.
-     *
-     * The default value is <code>SWT.DEFAULT</code>.
-     */
-    public int widthHint = SWT.DEFAULT;
-
-    /**
-     * The <code>heightHint</code> specifies a minimum height for
-     * the <code>Control</code>. A value of <code>SWT.DEFAULT</code>
-     * indicates that no minimum height is specified.
-     *
-     * The default value is <code>SWT.DEFAULT</code>.
-     */
-    public int heightHint = SWT.DEFAULT;
-
-    /**
-     * Creates an initial status line layout data object.
-     */
-    public StatusLineLayoutData() {
-        super();
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/StatusLineManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/StatusLineManager.java
deleted file mode 100644
index a7a92f5..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/StatusLineManager.java
+++ /dev/null
@@ -1,346 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IProgressMonitorWithBlocking;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A status line manager is a contribution manager which realizes itself and its items
- * in a status line control.
- * <p>
- * This class may be instantiated; it may also be subclassed if a more
- * sophisticated layout is required.
- * </p>
- */
-public class StatusLineManager extends ContributionManager implements
-        IStatusLineManager {
-
-    /**
-     * Identifier of group marker used to position contributions at the beginning
-     * of the status line.
-     * 
-     * @since 3.0
-     */
-    public static final String BEGIN_GROUP = "BEGIN_GROUP"; //$NON-NLS-1$
-
-    /**
-     * Identifier of group marker used to position contributions in the middle
-     * of the status line.
-     * 
-     * @since 3.0
-     */
-    public static final String MIDDLE_GROUP = "MIDDLE_GROUP"; //$NON-NLS-1$
-
-    /**
-     * Identifier of group marker used to position contributions at the end
-     * of the status line.
-     * 
-     * @since 3.0
-     */
-    public static final String END_GROUP = "END_GROUP"; //$NON-NLS-1$
-
-    /**
-     * The status line control; <code>null</code> before
-     * creation and after disposal.
-     */
-    private Composite statusLine = null;
-
-    /**
-     * Creates a new status line manager.
-     * Use the <code>createControl</code> method to create the 
-     * status line control.
-     */
-    public StatusLineManager() {
-    	add(new GroupMarker(BEGIN_GROUP));
-        add(new GroupMarker(MIDDLE_GROUP));
-        add(new GroupMarker(END_GROUP));
-    }
-
-    /**
-     * Creates and returns this manager's status line control. 
-     * Does not create a new control if one already exists.
-     * <p>
-     * Note: Since 3.0 the return type is <code>Control</code>.  Before 3.0, the return type was 
-     *   the package-private class <code>StatusLine</code>.
-     * </p>
-     *
-     * @param parent the parent control
-     * @return the status line control
-     */
-    public Control createControl(Composite parent) {
-        return createControl(parent, SWT.NONE);
-    }
-
-    /**
-     * Creates and returns this manager's status line control. 
-     * Does not create a new control if one already exists.
-     *
-     * @param parent the parent control
-     * @param style the style for the control
-     * @return the status line control
-     * @since 3.0
-     */
-    public Control createControl(Composite parent, int style) {
-        if (!statusLineExist() && parent != null) {
-            statusLine = new StatusLine(parent, style);
-            update(false);
-        }
-        return statusLine;
-    }
-
-    /**
-     * Disposes of this status line manager and frees all allocated SWT resources.
-     * Notifies all contribution items of the dispose. Note that this method does
-     * not clean up references between this status line manager and its associated
-     * contribution items. Use <code>removeAll</code> for that purpose.
-     */
-    public void dispose() {
-        if (statusLineExist()) {
-			statusLine.dispose();
-		}
-        statusLine = null;
-
-        IContributionItem items[] = getItems();
-        for (int i = 0; i < items.length; i++) {
-            items[i].dispose();
-        }
-    }
-
-    /**
-     * Returns the control used by this StatusLineManager.
-     * 
-     * @return the control used by this manager
-     */
-    public Control getControl() {
-        return statusLine;
-    }
-
-    /**
-     * Returns the progress monitor delegate. Override this method
-     * to provide your own object used to handle progress.
-     * 
-     * @return the IProgressMonitor delegate
-     * @since 3.0
-     */
-    protected IProgressMonitor getProgressMonitorDelegate() {
-        return (IProgressMonitor) getControl();
-    }
-
-    /*
-     * (non-Javadoc)
-     * Method declared on IStatusLineManager
-     */
-    public IProgressMonitor getProgressMonitor() {
-
-        return new IProgressMonitorWithBlocking() {
-
-            IProgressMonitor progressDelegate = getProgressMonitorDelegate();
-
-            /* (non-Javadoc)
-             * @see org.eclipse.core.runtime.IProgressMonitor#beginTask(java.lang.String, int)
-             */
-            public void beginTask(String name, int totalWork) {
-                progressDelegate.beginTask(name, totalWork);
-
-            }
-
-            /* (non-Javadoc)
-             * @see org.eclipse.core.runtime.IProgressMonitor#done()
-             */
-            public void done() {
-                progressDelegate.done();
-            }
-
-            /* (non-Javadoc)
-             * @see org.eclipse.core.runtime.IProgressMonitor#internalWorked(double)
-             */
-            public void internalWorked(double work) {
-                progressDelegate.internalWorked(work);
-
-            }
-
-            /* (non-Javadoc)
-             * @see org.eclipse.core.runtime.IProgressMonitor#isCanceled()
-             */
-            public boolean isCanceled() {
-                return progressDelegate.isCanceled();
-            }
-
-            /* (non-Javadoc)
-             * @see org.eclipse.core.runtime.IProgressMonitor#setCanceled(boolean)
-             */
-            public void setCanceled(boolean value) {
-                //Don't bother updating for disposed status
-                if (statusLine.isDisposed()) {
-					return;
-				}
-                progressDelegate.setCanceled(value);
-
-            }
-
-            /* (non-Javadoc)
-             * @see org.eclipse.core.runtime.IProgressMonitor#setTaskName(java.lang.String)
-             */
-            public void setTaskName(String name) {
-                progressDelegate.setTaskName(name);
-
-            }
-
-            /* (non-Javadoc)
-             * @see org.eclipse.core.runtime.IProgressMonitor#subTask(java.lang.String)
-             */
-            public void subTask(String name) {
-                progressDelegate.subTask(name);
-
-            }
-
-            /* (non-Javadoc)
-             * @see org.eclipse.core.runtime.IProgressMonitor#worked(int)
-             */
-            public void worked(int work) {
-                progressDelegate.worked(work);
-            }
-
-            /* (non-Javadoc)
-             * @see org.eclipse.core.runtime.IProgressMonitorWithBlocking#clearBlocked()
-             */
-            public void clearBlocked() {
-                //Do nothing here as we let the modal context handle it
-            }
-
-            /* (non-Javadoc)
-             * @see org.eclipse.core.runtime.IProgressMonitorWithBlocking#setBlocked(org.eclipse.core.runtime.IStatus)
-             */
-            public void setBlocked(IStatus reason) {
-                //			Do nothing here as we let the modal context handle it
-            }
-        };
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStatueLineManager
-     */
-    public boolean isCancelEnabled() {
-        return statusLineExist() && ((StatusLine) statusLine).isCancelEnabled();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStatueLineManager
-     */
-    public void setCancelEnabled(boolean enabled) {
-        if (statusLineExist()) {
-			((StatusLine) statusLine).setCancelEnabled(enabled);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStatusLineManager.
-     */
-    public void setErrorMessage(String message) {
-        if (statusLineExist()) {
-			((StatusLine) statusLine).setErrorMessage(message);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStatusLineManager.
-     */
-    public void setErrorMessage(Image image, String message) {
-        if (statusLineExist()) {
-			((StatusLine) statusLine).setErrorMessage(image, message);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStatusLineManager.
-     */
-    public void setMessage(String message) {
-        if (statusLineExist()) {
-			((StatusLine) statusLine).setMessage(message);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStatusLineManager.
-     */
-    public void setMessage(Image image, String message) {
-        if (statusLineExist()) {
-			((StatusLine) statusLine).setMessage(image, message);
-		}
-    }
-
-    /**
-     * Returns whether the status line control is created
-     * and not disposed.
-     * 
-     * @return <code>true</code> if the control is created
-     *	and not disposed, <code>false</code> otherwise
-     */
-    private boolean statusLineExist() {
-        return statusLine != null && !statusLine.isDisposed();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public void update(boolean force) {
-
-        //boolean DEBUG= false;
-
-        if (isDirty() || force) {
-
-            if (statusLineExist()) {
-                statusLine.setRedraw(false);
-
-                // NOTE: the update algorithm is non-incremental.
-                // An incremental algorithm requires that SWT items can be created in the middle of the list
-                // but the ContributionItem.fill(Composite) method used here does not take an index, so this
-                // is not possible.
-
-                Control ws[] = statusLine.getChildren();
-                for (int i = 0; i < ws.length; i++) {
-                    Control w = ws[i];
-                    Object data = w.getData();
-                    if (data instanceof IContributionItem) {
-                        w.dispose();
-                    }
-                }
-
-                int oldChildCount = statusLine.getChildren().length;
-                IContributionItem[] items = getItems();
-                for (int i = 0; i < items.length; ++i) {
-                    IContributionItem ci = items[i];
-                    if (ci.isVisible()) {
-                        ci.fill(statusLine);
-                        // associate controls with contribution item
-                        Control[] newChildren = statusLine.getChildren();
-                        for (int j = oldChildCount; j < newChildren.length; j++) {
-                            newChildren[j].setData(ci);
-                        }
-                        oldChildCount = newChildren.length;
-                    }
-                }
-
-                setDirty(false);
-
-                statusLine.layout();
-                statusLine.setRedraw(true);
-            }
-        }
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubContributionItem.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubContributionItem.java
deleted file mode 100644
index f1cb77d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubContributionItem.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.CoolBar;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolBar;
-
-/**
- * A <code>SubContributionItem</code> is a wrapper for an <code>IContributionItem</code>.  
- * It is used within a <code>SubContributionManager</code> to control the visibility
- * of items.
- * <p>
- * This class is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class SubContributionItem implements IContributionItem {
-    /**
-     * The visibility of the item.
-     */
-    private boolean visible;
-
-    /**
-     * The inner item for this contribution.  
-     */
-    private IContributionItem innerItem;
-
-    /**
-     * Creates a new <code>SubContributionItem</code>.
-     * @param item the contribution item to be wrapped
-     */
-    public SubContributionItem(IContributionItem item) {
-        innerItem = item;
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * delegates to the inner item. Subclasses may override.
-     */
-    public void dispose() {
-        innerItem.dispose();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public void fill(Composite parent) {
-        if (visible) {
-			innerItem.fill(parent);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public void fill(Menu parent, int index) {
-        if (visible) {
-			innerItem.fill(parent, index);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public void fill(ToolBar parent, int index) {
-        if (visible) {
-			innerItem.fill(parent, index);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public String getId() {
-        return innerItem.getId();
-    }
-
-    /**
-     * Returns the inner contribution item.
-     *
-     * @return the inner contribution item
-     */
-    public IContributionItem getInnerItem() {
-        return innerItem;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public boolean isEnabled() {
-        return innerItem.isEnabled();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public boolean isDirty() {
-        return innerItem.isDirty();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public boolean isDynamic() {
-        return innerItem.isDynamic();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public boolean isGroupMarker() {
-        return innerItem.isGroupMarker();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public boolean isSeparator() {
-        return innerItem.isSeparator();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public boolean isVisible() {
-        return visible && innerItem.isVisible();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public void setParent(IContributionManager parent) {
-        // do nothing, the parent of our inner item
-        // is its SubContributionManager
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public void setVisible(boolean visible) {
-        this.visible = visible;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public void update() {
-        innerItem.update();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionItem.
-     */
-    public void update(String id) {
-        innerItem.update(id);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#fill(org.eclipse.swt.widgets.CoolBar, int)
-     */
-    public void fill(CoolBar parent, int index) {
-        if (visible) {
-			innerItem.fill(parent, index);
-		}
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#saveWidgetState()
-     */
-    public void saveWidgetState() {
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubContributionManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubContributionManager.java
deleted file mode 100644
index 705b2ba..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubContributionManager.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * A <code>SubContributionManager</code> is used to define a set of contribution
- * items within a parent manager.  Once defined, the visibility of the entire set can 
- * be changed as a unit.
- */
-public abstract class SubContributionManager implements IContributionManager {
-    /**
-     * The parent contribution manager.
-     */
-    private IContributionManager parentMgr;
-
-    /**
-     * Maps each item in the manager to a wrapper.  The wrapper is used to 
-     * control the visibility of each item.
-     */
-    private Map mapItemToWrapper = new HashMap();
-
-    /**
-     * The visibility of the manager,
-     */
-    private boolean visible = false;
-
-    /**
-     * Constructs a new <code>SubContributionManager</code>
-     *
-     * @param mgr the parent contribution manager.  All contributions made to the
-     *      <code>SubContributionManager</code> are forwarded and appear in the
-     *      parent manager.
-     */
-    public SubContributionManager(IContributionManager mgr) {
-        super();
-        parentMgr = mgr;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public void add(IAction action) {
-        add(new ActionContributionItem(action));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public void add(IContributionItem item) {
-        item.setParent(this);
-        SubContributionItem wrap = wrap(item);
-        wrap.setVisible(visible);
-        parentMgr.add(wrap);
-        itemAdded(item, wrap);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public void appendToGroup(String groupName, IAction action) {
-        appendToGroup(groupName, new ActionContributionItem(action));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public void appendToGroup(String groupName, IContributionItem item) {
-        item.setParent(this);
-        SubContributionItem wrap = wrap(item);
-        wrap.setVisible(visible);
-        parentMgr.appendToGroup(groupName, wrap);
-        itemAdded(item, wrap);
-    }
-
-    /**
-     * Disposes this sub contribution manager, removing all its items
-     * and cleaning up any other resources allocated by it.
-     * This must leave no trace of this sub contribution manager
-     * in the parent manager.  Subclasses may extend.
-     * 
-     * @since 3.0
-     */
-    public void disposeManager() {
-        Iterator it = mapItemToWrapper.values().iterator();
-        // Dispose items in addition to removing them.
-        // See bugs 64024 and 73715 for details.
-	    // Do not use getItems() here as subclasses can override that in bad ways.
-        while (it.hasNext()) {
-            IContributionItem item = (IContributionItem) it.next();
-            item.dispose();
-        }
-        removeAll();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     *
-     * Returns the item passed to us, not the wrapper.
-     */
-    public IContributionItem find(String id) {
-        IContributionItem item = parentMgr.find(id);
-        // Return the item passed to us, not the wrapper.
-        item = unwrap(item);
-        return item;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     *
-     * Returns the items passed to us, not the wrappers.
-     */
-    public IContributionItem[] getItems() {
-        IContributionItem[] result = new IContributionItem[mapItemToWrapper
-                .size()];
-        mapItemToWrapper.keySet().toArray(result);
-        return result;
-    }
-
-    /**
-     * Returns the parent manager.
-     *
-     * @return the parent manager
-     */
-    public IContributionManager getParent() {
-        return parentMgr;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public IContributionManagerOverrides getOverrides() {
-        return parentMgr.getOverrides();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public void insertAfter(String id, IAction action) {
-        insertAfter(id, new ActionContributionItem(action));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public void insertAfter(String id, IContributionItem item) {
-        item.setParent(this);
-        SubContributionItem wrap = wrap(item);
-        wrap.setVisible(visible);
-        parentMgr.insertAfter(id, wrap);
-        itemAdded(item, wrap);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public void insertBefore(String id, IAction action) {
-        insertBefore(id, new ActionContributionItem(action));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public void insertBefore(String id, IContributionItem item) {
-        item.setParent(this);
-        SubContributionItem wrap = wrap(item);
-        wrap.setVisible(visible);
-        parentMgr.insertBefore(id, wrap);
-        itemAdded(item, wrap);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public boolean isDirty() {
-        return parentMgr.isDirty();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public boolean isEmpty() {
-        return parentMgr.isEmpty();
-    }
-
-    /**
-     * Returns whether the contribution list is visible.
-     * If the visibility is <code>true</code> then each item within the manager 
-     * appears within the parent manager.  Otherwise, the items are not visible.
-     *
-     * @return <code>true</code> if the manager is visible
-     */
-    public boolean isVisible() {
-        return visible;
-    }
-
-    /**
-     * Notifies that an item has been added.
-     * <p>
-     * Subclasses are not expected to override this method.
-     * </p>
-     *
-     * @param item the item contributed by the client
-     * @param wrap the item contributed to the parent manager as a proxy for the item
-     *      contributed by the client
-     */
-    protected void itemAdded(IContributionItem item, SubContributionItem wrap) {
-        mapItemToWrapper.put(item, wrap);
-    }
-
-    /**
-     * Notifies that an item has been removed.
-     * <p>
-     * Subclasses are not expected to override this method.
-     * </p>
-     *
-     * @param item the item contributed by the client
-     */
-    protected void itemRemoved(IContributionItem item) {
-        mapItemToWrapper.remove(item);
-    }
-
-    /**
-     * @return fetch all enumeration of wrappers for the item
-     * @deprecated Use getItems(String value) instead.
-     */
-    public Enumeration items() {
-        final Iterator i = mapItemToWrapper.values().iterator();
-        return new Enumeration() {
-            public boolean hasMoreElements() {
-                return i.hasNext();
-            }
-
-            public Object nextElement() {
-                return i.next();
-            }
-        };
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public void markDirty() {
-        parentMgr.markDirty();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public void prependToGroup(String groupName, IAction action) {
-        prependToGroup(groupName, new ActionContributionItem(action));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public void prependToGroup(String groupName, IContributionItem item) {
-        item.setParent(this);
-        SubContributionItem wrap = wrap(item);
-        wrap.setVisible(visible);
-        parentMgr.prependToGroup(groupName, wrap);
-        itemAdded(item, wrap);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public IContributionItem remove(String id) {
-        IContributionItem result = parentMgr.remove(id);
-        if (result != null) {
-			itemRemoved(result);
-		}
-        return result;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public IContributionItem remove(IContributionItem item) {
-        SubContributionItem wrap = (SubContributionItem) mapItemToWrapper
-                .get(item);
-        if (wrap == null) {
-			return null;
-		}
-        IContributionItem result = parentMgr.remove(wrap);
-        if (result == null) {
-			return null;
-		}
-        itemRemoved(item);
-        return item;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     */
-    public void removeAll() {
-        Iterator it = mapItemToWrapper.values().iterator();
-        while (it.hasNext()) {
-            IContributionItem item = (IContributionItem) it.next();
-            parentMgr.remove(item);
-        }
-        mapItemToWrapper.clear();
-    }
-
-    /**
-     * Sets the visibility of the manager.  If the visibility is <code>true</code>
-     * then each item within the manager appears within the parent manager.
-     * Otherwise, the items are not visible.
-     *
-     * @param visible the new visibility
-     */
-    public void setVisible(boolean visible) {
-        this.visible = visible;
-        if (mapItemToWrapper.size() > 0) {
-            Iterator it = mapItemToWrapper.values().iterator();
-            while (it.hasNext()) {
-                IContributionItem item = (IContributionItem) it.next();
-                item.setVisible(visible);
-            }
-            parentMgr.markDirty();
-        }
-    }
-
-    /**
-     * Wraps a contribution item in a sub contribution item, and returns the new wrapper.
-     * @param item the contribution item to be wrapped
-     * @return the wrapped item
-     */
-    protected SubContributionItem wrap(IContributionItem item) {
-        return new SubContributionItem(item);
-    }
-
-    /**
-     * Unwraps a nested contribution item. If the contribution item is an
-     * instance of <code>SubContributionItem</code>, then its inner item is
-     * returned. Otherwise, the item itself is returned.
-     * 
-     * @param item
-     *            The item to unwrap; may be <code>null</code>.
-     * @return The inner item of <code>item</code>, if <code>item</code> is
-     *         a <code>SubContributionItem</code>;<code>item</code>
-     *         otherwise.
-     */
-    protected IContributionItem unwrap(IContributionItem item) {
-        if (item instanceof SubContributionItem) {
-            return ((SubContributionItem) item).getInnerItem();
-        }
-
-        return item;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubCoolBarManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubCoolBarManager.java
deleted file mode 100644
index f5a179a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubCoolBarManager.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * A <code>SubCoolBarManager</code> monitors the additional and removal of 
- * items from a parent manager so that visibility of the entire set can be changed as a
- * unit.
- * 
- * @since 3.0
- */
-public class SubCoolBarManager extends SubContributionManager implements
-        ICoolBarManager {
-
-    /**
-     * Constructs a new manager.
-     *
-     * @param mgr the parent manager.  All contributions made to the 
-     *      <code>SubCoolBarManager</code> are forwarded and appear in the
-     *      parent manager.
-     */
-    public SubCoolBarManager(ICoolBarManager mgr) {
-        super(mgr);
-        Assert.isNotNull(mgr);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.ICoolBarManager#add(org.eclipse.jface.action.IToolBarManager)
-     */
-    public void add(IToolBarManager toolBarManager) {
-        Assert.isNotNull(toolBarManager);
-        super.add(new ToolBarContributionItem(toolBarManager));
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.ICoolBarManager#getStyle()
-     */
-    public int getStyle() {
-        // It is okay to cast down since we only accept coolBarManager objects in the
-        // constructor
-        return ((ICoolBarManager) getParent()).getStyle();
-    }
-
-    /**
-     * Returns the parent cool bar manager that this sub-manager contributes to.
-     * 
-     * @return the parent cool bar manager 
-     */
-    protected final ICoolBarManager getParentCoolBarManager() {
-        // Cast is ok because that's the only
-        // thing we accept in the construtor.
-        return (ICoolBarManager) getParent();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.ICoolBarManager#isLayoutLocked()
-     */
-    public boolean getLockLayout() {
-        return getParentCoolBarManager().getLockLayout();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.ICoolBarManager#lockLayout(boolean)
-     */
-    public void setLockLayout(boolean value) {
-    }
-
-    /* (non-Javadoc)
-     * SubCoolBarManagers do not have control of the global context menu.
-     */
-    public IMenuManager getContextMenuManager() {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * In SubCoolBarManager we do nothing.
-     */
-    public void setContextMenuManager(IMenuManager menuManager) {
-        // do nothing
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionManager#update(boolean)
-     */
-    public void update(boolean force) {
-        // This method is not governed by visibility.  The client may
-        // call <code>setVisible</code> and then force an update.  At that
-        // point we need to update the parent.
-        getParentCoolBarManager().update(force);
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubMenuManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubMenuManager.java
deleted file mode 100644
index 33c9b43..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubMenuManager.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.CoolBar;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolBar;
-
-/**
- * A <code>SubMenuManager</code> is used to define a set of contribution
- * items within a parent manager.  Once defined, the visibility of the entire set can 
- * be changed as a unit.
- * <p>
- * A client may ask for and make additions to a submenu.  The visibility of these items
- * is also controlled by the visibility of the <code>SubMenuManager</code>.
- * </p>
- */
-public class SubMenuManager extends SubContributionManager implements
-        IMenuManager {
-
-    /**
-     * Maps each submenu in the manager to a wrapper.  The wrapper is used to
-     * monitor additions and removals.  If the visibility of the manager is modified
-     * the visibility of the submenus is also modified.
-     */
-    private Map mapMenuToWrapper;
-
-    /**
-     * List of registered menu listeners (element type: <code>IMenuListener</code>).
-     */
-    private ListenerList menuListeners = new ListenerList();
-
-    /**
-     * The menu listener added to the parent.  Lazily initialized
-     * in addMenuListener.
-     */
-    private IMenuListener menuListener;
-
-    /**
-     * Constructs a new manager.
-     *
-     * @param mgr the parent manager.  All contributions made to the 
-     *      <code>SubMenuManager</code> are forwarded and appear in the
-     *      parent manager.
-     */
-    public SubMenuManager(IMenuManager mgr) {
-        super(mgr);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuManager#addMenuListener(org.eclipse.jface.action.IMenuListener)
-     */
-    public void addMenuListener(IMenuListener listener) {
-        menuListeners.add(listener);
-        if (menuListener == null) {
-            menuListener = new IMenuListener() {
-                public void menuAboutToShow(IMenuManager manager) {
-                    Object[] listeners = menuListeners.getListeners();
-                    for (int i = 0; i < listeners.length; ++i) {
-                        ((IMenuListener) listeners[i])
-                                .menuAboutToShow(SubMenuManager.this);
-                    }
-                }
-            };
-        }
-        getParentMenuManager().addMenuListener(menuListener);
-    }
-
-    /**
-     * The default implementation of this <code>IContributionItem</code>
-     * method does nothing. Subclasses may override.
-     */
-    public void dispose() {
-        // do nothing
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.SubContributionManager#disposeManager()
-     */
-    public void disposeManager() {
-        if (menuListener != null) {
-            getParentMenuManager().removeMenuListener(menuListener);
-            menuListener = null;
-            menuListeners.clear();
-        }
-        // Dispose wrapped menus in addition to removing them.
-        // See bugs 64024 and 73715 for details.
-        // important to dispose menu wrappers before call to super,
-        // otherwise super's call to removeAll will remove them
-        // before they can be disposed
-        if (mapMenuToWrapper != null) {
-            Iterator iter = mapMenuToWrapper.values().iterator();
-            while (iter.hasNext()) {
-                SubMenuManager wrapper = (SubMenuManager) iter.next();
-                wrapper.disposeManager();
-            }
-            mapMenuToWrapper.clear();
-            mapMenuToWrapper = null;
-        }
-        super.disposeManager();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#fill(org.eclipse.swt.widgets.Composite)
-     */
-    public void fill(Composite parent) {
-        if (isVisible()) {
-			getParentMenuManager().fill(parent);
-		}
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#fill(org.eclipse.swt.widgets.CoolBar, int)
-     */
-    public void fill(CoolBar parent, int index) {
-        // do nothing
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#fill(org.eclipse.swt.widgets.Menu, int)
-     */
-    public void fill(Menu parent, int index) {
-        if (isVisible()) {
-			getParentMenuManager().fill(parent, index);
-		}
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#fill(org.eclipse.swt.widgets.ToolBar, int)
-     */
-    public void fill(ToolBar parent, int index) {
-        if (isVisible()) {
-			getParentMenuManager().fill(parent, index);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContributionManager.
-     *
-     * Returns the item passed to us, not the wrapper.
-     * In the case of menu's not added by this manager,
-     * ensure that we return a wrapper for the menu.
-     */
-    public IContributionItem find(String id) {
-        IContributionItem item = getParentMenuManager().find(id);
-        if (item instanceof SubContributionItem) {
-			// Return the item passed to us, not the wrapper.
-            item = unwrap(item);
-		}
-
-        if (item instanceof IMenuManager) {
-            // if it is a menu manager wrap it before returning
-            IMenuManager menu = (IMenuManager) item;
-            item = getWrapper(menu);
-        }
-
-        return item;
-    }
-
-    /**
-     * <p>
-     * The menu returned is wrapped within a <code>SubMenuManager</code> to
-     * monitor additions and removals.  If the visibility of this menu is modified
-     * the visibility of the submenus is also modified.
-     * </p>
-     */
-    public IMenuManager findMenuUsingPath(String path) {
-        IContributionItem item = findUsingPath(path);
-        if (item instanceof IMenuManager) {
-            return (IMenuManager) item;
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IMenuManager.
-     *
-     * Returns the item passed to us, not the wrapper.
-     *
-     * We use use the same algorithm as MenuManager.findUsingPath, but unwrap
-     * submenus along so that SubMenuManagers are visible.
-     */
-    public IContributionItem findUsingPath(String path) {
-        String id = path;
-        String rest = null;
-        int separator = path.indexOf('/');
-        if (separator != -1) {
-            id = path.substring(0, separator);
-            rest = path.substring(separator + 1);
-        }
-        IContributionItem item = find(id); // unwraps item
-        if (rest != null && item instanceof IMenuManager) {
-            IMenuManager menu = (IMenuManager) item;
-            item = menu.findUsingPath(rest);
-        }
-        return item;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#getId()
-     */
-    public String getId() {
-        return getParentMenuManager().getId();
-    }
-
-    /**
-     * @return the parent menu manager that this sub-manager contributes to. 
-     */
-    protected final IMenuManager getParentMenuManager() {
-        // Cast is ok because that's the only
-        // thing we accept in the construtor.
-        return (IMenuManager) getParent();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuManager#getRemoveAllWhenShown()
-     */
-    public boolean getRemoveAllWhenShown() {
-        return false;
-    }
-
-    /**
-     * Returns the menu wrapper for a menu manager.
-     * <p>
-     * The sub menus within this menu are wrapped within a <code>SubMenuManager</code> to
-     * monitor additions and removals.  If the visibility of this menu is modified
-     * the visibility of the sub menus is also modified.
-     * <p>
-     * @param mgr the menu manager to be wrapped
-     *
-     * @return the menu wrapper
-     */
-    protected IMenuManager getWrapper(IMenuManager mgr) {
-        if (mapMenuToWrapper == null) {
-            mapMenuToWrapper = new HashMap(4);
-        }
-        SubMenuManager wrapper = (SubMenuManager) mapMenuToWrapper.get(mgr);
-        if (wrapper == null) {
-            wrapper = wrapMenu(mgr);
-            mapMenuToWrapper.put(mgr, wrapper);
-        }
-        return wrapper;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#isDynamic()
-     */
-    public boolean isDynamic() {
-        return getParentMenuManager().isDynamic();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#isEnabled()
-     */
-    public boolean isEnabled() {
-        return isVisible() && getParentMenuManager().isEnabled();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#isGroupMarker()
-     */
-    public boolean isGroupMarker() {
-        return getParentMenuManager().isGroupMarker();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#isSeparator()
-     */
-    public boolean isSeparator() {
-        return getParentMenuManager().isSeparator();
-    }
-
-    /**
-     * Remove all contribution items.
-     */
-    public void removeAll() {
-        super.removeAll();
-        if (mapMenuToWrapper != null) {
-            Iterator iter = mapMenuToWrapper.values().iterator();
-            while (iter.hasNext()) {
-                SubMenuManager wrapper = (SubMenuManager) iter.next();
-                wrapper.removeAll();
-            }
-            mapMenuToWrapper.clear();
-            mapMenuToWrapper = null;
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuManager#removeMenuListener(org.eclipse.jface.action.IMenuListener)
-     */
-    public void removeMenuListener(IMenuListener listener) {
-        menuListeners.remove(listener);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#saveWidgetState()
-     */
-    public void saveWidgetState() {
-        // do nothing
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#setParent(org.eclipse.jface.action.IContributionManager)
-     */
-    public void setParent(IContributionManager parent) {
-        // do nothing, our "parent manager's" parent 
-        // is set when it is added to a manager
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuManager#setRemoveAllWhenShown(boolean)
-     */
-    public void setRemoveAllWhenShown(boolean removeAll) {
-        Assert.isTrue(false, "Should not be called on submenu manager"); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.SubContributionManager#setVisible(boolean)
-     */
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        if (mapMenuToWrapper != null) {
-            Iterator iter = mapMenuToWrapper.values().iterator();
-            while (iter.hasNext()) {
-                SubMenuManager wrapper = (SubMenuManager) iter.next();
-                wrapper.setVisible(visible);
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#update()
-     */
-    public void update() {
-        // This method is not governed by visibility.  The client may
-        // call <code>setVisible</code> and then force an update.  At that
-        // point we need to update the parent.
-        getParentMenuManager().update();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionManager#update(boolean)
-     */
-    public void update(boolean force) {
-        // This method is not governed by visibility.  The client may
-        // call <code>setVisible</code> and then force an update.  At that
-        // point we need to update the parent.
-        getParentMenuManager().update(force);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#update(java.lang.String)
-     */
-    public void update(String id) {
-        getParentMenuManager().update(id);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IMenuManager#updateAll(boolean)
-     */
-    public void updateAll(boolean force) {
-        // This method is not governed by visibility.  The client may
-        // call <code>setVisible</code> and then force an update.  At that
-        // point we need to update the parent.
-        getParentMenuManager().updateAll(force);
-    }
-
-    /**
-     * Wraps a menu manager in a sub menu manager, and returns the new wrapper.
-     * @param menu the menu manager to wrap
-     * @return the new wrapped menu manager
-     */
-    protected SubMenuManager wrapMenu(IMenuManager menu) {
-        SubMenuManager mgr = new SubMenuManager(menu);
-        mgr.setVisible(isVisible());
-        return mgr;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubStatusLineManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubStatusLineManager.java
deleted file mode 100644
index 8f7f967..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubStatusLineManager.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A <code>SubStatusLineManager</code> is used to define a set of contribution
- * items within a parent manager.  Once defined, the visibility of the entire set can 
- * be changed as a unit.
- */
-public class SubStatusLineManager extends SubContributionManager implements
-        IStatusLineManager {
-    /**
-     * Current status line message.
-     */
-    private String message;
-
-    /**
-     * Current status line error message.
-     */
-    private String errorMessage;
-
-    /**
-     * Current status line message image.
-     */
-    private Image messageImage;
-
-    /**
-     * Current status line error image
-     */
-    private Image errorImage;
-
-    /**
-     * Constructs a new manager.
-     *
-     * @param mgr the parent manager.  All contributions made to the 
-     *      <code>SubStatusLineManager</code> are forwarded and appear in the
-     *      parent manager.
-     */
-    public SubStatusLineManager(IStatusLineManager mgr) {
-        super(mgr);
-    }
-
-    /**
-     * @return the parent status line manager that this sub-manager contributes
-     * to 
-     */
-    protected final IStatusLineManager getParentStatusLineManager() {
-        // Cast is ok because that's the only
-        // thing we accept in the construtor.
-        return (IStatusLineManager) getParent();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStatusLineManager.
-     */
-    public IProgressMonitor getProgressMonitor() {
-        return getParentStatusLineManager().getProgressMonitor();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStatusLineManager.
-     */
-    public boolean isCancelEnabled() {
-        return getParentStatusLineManager().isCancelEnabled();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStatusLineManager.
-     */
-    public void setCancelEnabled(boolean enabled) {
-        getParentStatusLineManager().setCancelEnabled(enabled);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStatusLineManager.
-     */
-    public void setErrorMessage(String message) {
-        this.errorImage = null;
-        this.errorMessage = message;
-        if (isVisible()) {
-			getParentStatusLineManager().setErrorMessage(errorMessage);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStatusLineManager.
-     */
-    public void setErrorMessage(Image image, String message) {
-        this.errorImage = image;
-        this.errorMessage = message;
-        if (isVisible()) {
-			getParentStatusLineManager().setErrorMessage(errorImage,
-                    errorMessage);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStatusLineManager.
-     */
-    public void setMessage(String message) {
-        this.messageImage = null;
-        this.message = message;
-        if (isVisible()) {
-			getParentStatusLineManager().setMessage(message);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStatusLineManager.
-     */
-    public void setMessage(Image image, String message) {
-        this.messageImage = image;
-        this.message = message;
-        if (isVisible()) {
-			getParentStatusLineManager().setMessage(messageImage, message);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on SubContributionManager.
-     */
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        if (visible) {
-            getParentStatusLineManager().setErrorMessage(errorImage,
-                    errorMessage);
-            getParentStatusLineManager().setMessage(messageImage, message);
-        } else {
-            getParentStatusLineManager().setMessage(null, null);
-            getParentStatusLineManager().setErrorMessage(null, null);
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStatusLineManager.
-     */
-    public void update(boolean force) {
-        // This method is not governed by visibility.  The client may
-        // call <code>setVisible</code> and then force an update.  At that
-        // point we need to update the parent.
-        getParentStatusLineManager().update(force);
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubToolBarManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubToolBarManager.java
deleted file mode 100644
index b88627a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/SubToolBarManager.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-/**
- * A <code>SubToolBarManager</code> monitors the additional and removal of 
- * items from a parent manager so that visibility of the entire set can be changed as a
- * unit.
- */
-public class SubToolBarManager extends SubContributionManager implements
-        IToolBarManager {
-
-    /**
-     * Constructs a new manager.
-     *
-     * @param mgr the parent manager.  All contributions made to the 
-     *      <code>SubToolBarManager</code> are forwarded and appear in the
-     *      parent manager.
-     */
-    public SubToolBarManager(IToolBarManager mgr) {
-        super(mgr);
-    }
-
-    /**
-     * @return the parent toolbar manager that this sub-manager contributes to
-     */
-    protected final IToolBarManager getParentToolBarManager() {
-        // Cast is ok because that's the only
-        // thing we accept in the construtor.
-        return (IToolBarManager) getParent();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IToolBarManager.
-     */
-    public void update(boolean force) {
-        // This method is not governed by visibility.  The client may
-        // call <code>setVisible</code> and then force an update.  At that
-        // point we need to update the parent.
-        getParentToolBarManager().update(force);
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ToolBarContributionItem.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ToolBarContributionItem.java
deleted file mode 100644
index 08c5ddc..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ToolBarContributionItem.java
+++ /dev/null
@@ -1,673 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.action;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.jface.internal.provisional.action.IToolBarContributionItem;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.CoolBar;
-import org.eclipse.swt.widgets.CoolItem;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * The <code>ToolBarContributionItem</code> class provides a wrapper for tool
- * bar managers when used in cool bar managers. It extends <code>ContributionItem</code>
- * but and provides some additional methods to customize the size of the cool
- * item and to retrieve the underlying tool bar manager.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @since 3.0
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ToolBarContributionItem extends ContributionItem implements IToolBarContributionItem {
-
-    /**
-     * A constant used by <code>setMinimumItemsToShow</code> and <code>getMinimumItemsToShow</code>
-     * to indicate that all tool items should be shown in the cool item.
-     */
-    public static final int SHOW_ALL_ITEMS = -1;
-
-    /**
-     * The pull down menu used to list all hidden tool items if the current
-     * size is less than the preffered size.
-     */
-    private MenuManager chevronMenuManager = null;
-
-    /**
-     * The widget created for this item; <code>null</code> before creation
-     * and after disposal.
-     */
-    private CoolItem coolItem = null;
-
-    /**
-     * Current height of cool item
-     */
-    private int currentHeight = -1;
-
-    /**
-     * Current width of cool item.
-     */
-    private int currentWidth = -1;
-
-    /**
-     * A flag indicating that this item has been disposed. This prevents future
-     * method invocations from doing things they shouldn't.
-     */
-    private boolean disposed = false;
-
-    /**
-     * Mininum number of tool items to show in the cool item widget.
-     */
-    private int minimumItemsToShow = SHOW_ALL_ITEMS;
-
-    /**
-     * The tool bar manager used to manage the tool items contained in the cool
-     * item widget.
-     */
-    private ToolBarManager toolBarManager = null;
-
-    /**
-     * Enable/disable chevron support.
-     */
-    private boolean useChevron = true;
-
-    /**
-     * Convenience method equivalent to <code>ToolBarContributionItem(new ToolBarManager(), null)</code>.
-     */
-    public ToolBarContributionItem() {
-        this(new ToolBarManager(), null);
-    }
-
-    /**
-     * Convenience method equivalent to <code>ToolBarContributionItem(toolBarManager, null)</code>.
-     * 
-     * @param toolBarManager
-     *            the tool bar manager
-     */
-    public ToolBarContributionItem(IToolBarManager toolBarManager) {
-        this(toolBarManager, null);
-    }
-
-    /**
-     * Creates a tool bar contribution item.
-     * 
-     * @param toolBarManager
-     *            the tool bar manager to wrap
-     * @param id
-     *            the contribution item id, or <code>null</code> if none
-     */
-    public ToolBarContributionItem(IToolBarManager toolBarManager, String id) {
-        super(id);
-        Assert.isTrue(toolBarManager instanceof ToolBarManager);
-        this.toolBarManager = (ToolBarManager) toolBarManager;
-    }
-
-    /**
-     * Checks whether this contribution item has been disposed. If it has, and
-     * the tracing options are active, then it prints some debugging
-     * information.
-     * 
-     * @return <code>true</code> if the item is disposed; <code>false</code>
-     *         otherwise.
-     *  
-     */
-    private final boolean checkDisposed() {
-        if (disposed) {
-            if (Policy.TRACE_TOOLBAR) {
-                System.out
-                        .println("Method invocation on a disposed tool bar contribution item."); //$NON-NLS-1$
-                new Exception().printStackTrace(System.out);
-            }
-
-            return true;
-        }
-
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.IContributionItem#dispose()
-     */
-    public void dispose() {
-        // Dispose of the ToolBar and all its contributions
-        if (toolBarManager != null) {
-            toolBarManager.dispose();
-            toolBarManager = null;
-        }
-
-        /*
-         * We need to dispose the cool item or we might be left holding a cool
-         * item with a disposed control.
-         */
-        if ((coolItem != null) && (!coolItem.isDisposed())) {
-            coolItem.dispose();
-            coolItem = null;
-        }
-
-        // Mark this item as disposed.
-        disposed = true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.IContributionItem#fill(org.eclipse.swt.widgets.CoolBar,
-     *      int)
-     */
-    public void fill(CoolBar coolBar, int index) {
-        if (checkDisposed()) {
-            return;
-        }
-
-        if (coolItem == null && coolBar != null) {
-            ToolBar oldToolBar = toolBarManager.getControl();
-            ToolBar toolBar = toolBarManager.createControl(coolBar);
-            if ((oldToolBar != null) && (oldToolBar.equals(toolBar))) {
-                // We are using an old tool bar, so we need to update.
-                toolBarManager.update(true);
-            }
-
-            // Do not create a coolItem if the toolbar is empty
-            if (toolBar.getItemCount() < 1) {
-				return;
-			}
-            int flags = SWT.DROP_DOWN;
-            if (index >= 0) {
-                coolItem = new CoolItem(coolBar, flags, index);
-            } else {
-                coolItem = new CoolItem(coolBar, flags);
-            }
-            // sets the back reference
-            coolItem.setData(this);
-            // Add the toolbar to the CoolItem widget
-            coolItem.setControl(toolBar);
-
-            // Handle Context Menu
-            // ToolBarManager.createControl can actually return a pre-existing control.
-            // Only add the listener if the toolbar was newly created (bug 62097).
-            if (oldToolBar != toolBar) {
-	            toolBar.addListener(SWT.MenuDetect, new Listener() {
-	
-	                public void handleEvent(Event event) {
-	                    // if the toolbar does not have its own context menu then
-	                    // handle the event
-	                    if (toolBarManager.getContextMenuManager() == null) {
-	                        handleContextMenu(event);
-	                    }
-	                }
-	            });
-            }
-
-            // Handle for chevron clicking
-            if (getUseChevron()) {
-                // Chevron Support
-                coolItem.addSelectionListener(new SelectionAdapter() {
-
-                    public void widgetSelected(SelectionEvent event) {
-                        if (event.detail == SWT.ARROW) {
-                            handleChevron(event);
-                        }
-                    }
-                });
-            }
-
-            // Handle for disposal
-            coolItem.addDisposeListener(new DisposeListener() {
-
-                public void widgetDisposed(DisposeEvent event) {
-                    handleWidgetDispose(event);
-                }
-            });
-
-            // Sets the size of the coolItem
-            updateSize(true);
-        }
-    }
-
-    /**
-     * Returns a consistent set of wrap indices. The return value will always
-     * include at least one entry and the first entry will always be zero.
-     * CoolBar.getWrapIndices() is inconsistent in whether or not it returns an
-     * index for the first row.
-     */
-    private int[] getAdjustedWrapIndices(int[] wraps) {
-        int[] adjustedWrapIndices;
-        if (wraps.length == 0) {
-            adjustedWrapIndices = new int[] { 0 };
-        } else {
-            if (wraps[0] != 0) {
-                adjustedWrapIndices = new int[wraps.length + 1];
-                adjustedWrapIndices[0] = 0;
-                for (int i = 0; i < wraps.length; i++) {
-                    adjustedWrapIndices[i + 1] = wraps[i];
-                }
-            } else {
-                adjustedWrapIndices = wraps;
-            }
-        }
-        return adjustedWrapIndices;
-    }
-
-    /**
-     * Returns the current height of the corresponding cool item.
-     * 
-     * @return the current height
-     */
-    public int getCurrentHeight() {
-        if (checkDisposed()) {
-            return -1;
-        }
-        return currentHeight;
-    }
-
-    /**
-     * Returns the current width of the corresponding cool item.
-     * 
-     * @return the current size
-     */
-    public int getCurrentWidth() {
-        if (checkDisposed()) {
-            return -1;
-        }
-        return currentWidth;
-    }
-
-    /**
-     * Returns the minimum number of tool items to show in the cool item.
-     * 
-     * @return the minimum number of tool items to show, or <code>SHOW_ALL_ITEMS</code>
-     *         if a value was not set
-     * @see #setMinimumItemsToShow(int)
-     */
-    public int getMinimumItemsToShow() {
-        if (checkDisposed()) {
-            return -1;
-        }
-        return minimumItemsToShow;
-    }
-
-    /**
-     * Returns the internal tool bar manager of the contribution item.
-     * 
-     * @return the tool bar manager, or <code>null</code> if one is not
-     *         defined.
-     * @see IToolBarManager
-     */
-    public IToolBarManager getToolBarManager() {
-        if (checkDisposed()) {
-            return null;
-        }
-        return toolBarManager;
-    }
-
-    /**
-     * Returns whether chevron support is enabled.
-     * 
-     * @return <code>true</code> if chevron support is enabled, <code>false</code>
-     *         otherwise
-     */
-    public boolean getUseChevron() {
-        if (checkDisposed()) {
-            return false;
-        }
-        return useChevron;
-    }
-
-    /**
-     * Create and display the chevron menu.
-     */
-    private void handleChevron(SelectionEvent event) {
-        CoolItem item = (CoolItem) event.widget;
-        Control control = item.getControl();
-        if ((control instanceof ToolBar) == false) {
-            return;
-        }
-        CoolBar coolBar = item.getParent();
-        ToolBar toolBar = (ToolBar) control;
-        Rectangle toolBarBounds = toolBar.getBounds();
-        ToolItem[] items = toolBar.getItems();
-        ArrayList hidden = new ArrayList();
-        for (int i = 0; i < items.length; ++i) {
-            Rectangle itemBounds = items[i].getBounds();
-            if (!((itemBounds.x + itemBounds.width <= toolBarBounds.width) && (itemBounds.y
-                    + itemBounds.height <= toolBarBounds.height))) {
-                hidden.add(items[i]);
-            }
-        }
-
-        // Create a pop-up menu with items for each of the hidden buttons.
-        if (chevronMenuManager != null) {
-            chevronMenuManager.dispose();
-        }
-        chevronMenuManager = new MenuManager();
-        for (Iterator i = hidden.iterator(); i.hasNext();) {
-            ToolItem toolItem = (ToolItem) i.next();
-            IContributionItem data = (IContributionItem) toolItem.getData();
-            if (data instanceof ActionContributionItem) {
-                ActionContributionItem contribution = new ActionContributionItem(
-                        ((ActionContributionItem) data).getAction());
-                chevronMenuManager.add(contribution);
-            } else if (data instanceof SubContributionItem) {
-                IContributionItem innerData = ((SubContributionItem) data)
-                        .getInnerItem();
-                if (innerData instanceof ActionContributionItem) {
-                    ActionContributionItem contribution = new ActionContributionItem(
-                            ((ActionContributionItem) innerData).getAction());
-                    chevronMenuManager.add(contribution);
-                }
-            } else if (data.isSeparator()) {
-                chevronMenuManager.add(new Separator());
-            }
-        }
-        Menu popup = chevronMenuManager.createContextMenu(coolBar);
-        Point chevronPosition = coolBar.toDisplay(event.x, event.y);
-        popup.setLocation(chevronPosition.x, chevronPosition.y);
-        popup.setVisible(true);
-    }
-
-    /**
-     * Handles the event when the toobar item does not have its own context
-     * menu.
-     * 
-     * @param event
-     *            the event object
-     */
-    private void handleContextMenu(Event event) {
-        ToolBar toolBar = toolBarManager.getControl();
-        // If parent has a menu then use that one
-        Menu parentMenu = toolBar.getParent().getMenu();
-        if ((parentMenu != null) && (!parentMenu.isDisposed())) {
-            toolBar.setMenu(parentMenu);
-            // Hook listener to remove menu once it has disapeared
-            parentMenu.addListener(SWT.Hide, new Listener() {
-
-                public void handleEvent(Event innerEvent) {
-                    ToolBar innerToolBar = toolBarManager.getControl();
-                    if (innerToolBar != null) {
-                        innerToolBar.setMenu(null);
-                        Menu innerParentMenu = innerToolBar.getParent()
-                                .getMenu();
-                        if (innerParentMenu != null) {
-                            innerParentMenu.removeListener(SWT.Hide, this);
-                        }
-                    }
-                }
-            });
-        }
-    }
-
-    /**
-     * Handles the disposal of the widget.
-     * 
-     * @param event
-     *            the event object
-     */
-    private void handleWidgetDispose(DisposeEvent event) {
-        coolItem = null;
-    }
-
-    /**
-     * A contribution item is visible iff its internal state is visible <em>or</em>
-     * the tool bar manager contains something other than group markers and
-     * separators.
-     * 
-     * @return <code>true</code> if the tool bar manager contains something
-     *         other than group marks and separators, and the internal state is
-     *         set to be visible.
-     */
-    public boolean isVisible() {
-        if (checkDisposed()) {
-            return false;
-        }
-
-        boolean visibleItem = false;
-        if (toolBarManager != null) {
-            IContributionItem[] contributionItems = toolBarManager.getItems();
-            for (int i = 0; i < contributionItems.length; i++) {
-                IContributionItem contributionItem = contributionItems[i];
-                if ((!contributionItem.isGroupMarker())
-                        && (!contributionItem.isSeparator())) {
-                    visibleItem = true;
-                    break;
-                }
-            }
-        }
-
-        return (visibleItem || super.isVisible());
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.IContributionItem#saveWidgetState()
-     */
-    public void saveWidgetState() {
-        if (checkDisposed()) {
-            return;
-        }
-        if (coolItem == null) {
-			return;
-		}
-
-        //1. Save current size
-        CoolBar coolBar = coolItem.getParent();
-        boolean isLastOnRow = false;
-        int lastIndex = coolBar.getItemCount() - 1;
-        int coolItemIndex = coolBar.indexOf(coolItem);
-        int[] wrapIndicies = getAdjustedWrapIndices(coolBar.getWrapIndices());
-        // Traverse through all wrap indicies backwards
-        for (int row = wrapIndicies.length - 1; row >= 0; row--) {
-            if (wrapIndicies[row] <= coolItemIndex) {
-
-                int nextRow = row + 1;
-                int nextRowStartIndex;
-                if (nextRow > (wrapIndicies.length - 1)) {
-                    nextRowStartIndex = lastIndex + 1;
-                } else {
-                    nextRowStartIndex = wrapIndicies[nextRow];
-                }
-
-                // Check to see if its the last item on the row
-                if (coolItemIndex == (nextRowStartIndex - 1)) {
-                    isLastOnRow = true;
-                }
-                break;
-            }
-        }
-
-        // Save the preferred size as actual size for the last item on a row
-        int nCurrentWidth;
-        if (isLastOnRow) {
-            nCurrentWidth = coolItem.getPreferredSize().x;
-        } else {
-            nCurrentWidth = coolItem.getSize().x;
-        }
-        setCurrentWidth(nCurrentWidth);
-        setCurrentHeight(coolItem.getSize().y);
-    }
-
-    /**
-     * Sets the current height of the cool item. Update(SIZE) should be called
-     * to adjust the widget.
-     * 
-     * @param currentHeight
-     *            the current height to set
-     */
-    public void setCurrentHeight(int currentHeight) {
-        if (checkDisposed()) {
-            return;
-        }
-        this.currentHeight = currentHeight;
-    }
-
-    /**
-     * Sets the current width of the cool item. Update(SIZE) should be called
-     * to adjust the widget.
-     * 
-     * @param currentWidth
-     *            the current width to set
-     */
-    public void setCurrentWidth(int currentWidth) {
-        if (checkDisposed()) {
-            return;
-        }
-        this.currentWidth = currentWidth;
-    }
-
-    /**
-     * Sets the minimum number of tool items to show in the cool item. If this
-     * number is less than the total tool items, a chevron will appear and the
-     * hidden tool items appear in a drop down menu. By default, all the tool
-     * items are shown in the cool item.
-     * 
-     * @param minimumItemsToShow
-     *            the minimum number of tool items to show.
-     * @see #getMinimumItemsToShow()
-     * @see #setUseChevron(boolean)
-     */
-    public void setMinimumItemsToShow(int minimumItemsToShow) {
-        if (checkDisposed()) {
-            return;
-        }
-        this.minimumItemsToShow = minimumItemsToShow;
-    }
-
-    /**
-     * Enables or disables chevron support for the cool item. By default,
-     * chevron support is enabled.
-     * 
-     * @param value
-     *            <code>true</code> to enable chevron support, <code>false</code>
-     *            otherwise.
-     */
-    public void setUseChevron(boolean value) {
-        if (checkDisposed()) {
-            return;
-        }
-        useChevron = value;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.IContributionItem#update(java.lang.String)
-     */
-    public void update(String propertyName) {
-        if (checkDisposed()) {
-            return;
-        }
-        if (coolItem != null) {
-            IToolBarManager manager = getToolBarManager();
-            if (manager != null) {
-                manager.update(true);
-            }
-
-            if ((propertyName == null)
-                    || propertyName.equals(ICoolBarManager.SIZE)) {
-                updateSize(true);
-            }
-        }
-    }
-
-    /**
-     * Updates the cool items' preferred, minimum, and current size. The
-     * preferred size is calculated based on the tool bar size and extra trim.
-     * 
-     * @param changeCurrentSize
-     *            <code>true</code> if the current size should be changed to
-     *            the preferred size, <code>false</code> to not change the
-     *            current size
-     */
-    private void updateSize(boolean changeCurrentSize) {
-        if (checkDisposed()) {
-            return;
-        }
-        // cannot set size if coolItem is null
-        if (coolItem == null || coolItem.isDisposed()) {
-            return;
-        }
-        boolean locked = false;
-        CoolBar coolBar = coolItem.getParent();
-        try {
-            // Fix odd behaviour with locked tool bars
-            if (coolBar != null) {
-                if (coolBar.getLocked()) {
-                    coolBar.setLocked(false);
-                    locked = true;
-                }
-            }
-            ToolBar toolBar = (ToolBar) coolItem.getControl();
-            if ((toolBar == null) || (toolBar.isDisposed())
-                    || (toolBar.getItemCount() <= 0)) {
-                // if the toolbar does not contain any items then dispose of
-                // coolItem
-                coolItem.setData(null);
-                Control control = coolItem.getControl();
-                if ((control != null) && !control.isDisposed()) {
-                    control.dispose();
-                    coolItem.setControl(null);
-                }
-                if (!coolItem.isDisposed()) {
-                    coolItem.dispose();
-                }
-            } else {
-                // If the toolbar item exists then adjust the size of the cool
-                // item
-                Point toolBarSize = toolBar.computeSize(SWT.DEFAULT,
-                        SWT.DEFAULT);
-                // Set the preffered size to the size of the toolbar plus trim
-                Point preferredSize = coolItem.computeSize(toolBarSize.x,
-                        toolBarSize.y);
-                coolItem.setPreferredSize(preferredSize);
-                // note setMinimumSize must be called before setSize, see PR
-                // 15565
-                // Set minimum size
-                if (getMinimumItemsToShow() != SHOW_ALL_ITEMS) {
-                    int toolItemWidth = toolBar.getItems()[0].getWidth();
-                    int minimumWidth = toolItemWidth * getMinimumItemsToShow();
-                    coolItem.setMinimumSize(minimumWidth, toolBarSize.y);
-                } else {
-                    coolItem.setMinimumSize(toolBarSize.x, toolBarSize.y);
-                }
-                if (changeCurrentSize) {
-                    // Set current size to preferred size
-                    coolItem.setSize(preferredSize);
-                }
-            }
-        } finally {
-            // If the cool bar was locked, then set it back to locked
-            if ((locked) && (coolBar != null)) {
-                coolBar.setLocked(true);
-            }
-        }
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ToolBarManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ToolBarManager.java
deleted file mode 100644
index aea7f3b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/ToolBarManager.java
+++ /dev/null
@@ -1,455 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.action;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.ACC;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.accessibility.AccessibleListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.CoolBar;
-import org.eclipse.swt.widgets.CoolItem;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * A tool bar manager is a contribution manager which realizes itself and its
- * items in a tool bar control.
- * <p>
- * This class may be instantiated; it may also be subclassed if a more
- * sophisticated layout is required.
- * </p>
- */
-public class ToolBarManager extends ContributionManager implements
-		IToolBarManager {
-
-	/**
-	 * The tool bar items style; <code>SWT.NONE</code> by default.
-	 */
-	private int itemStyle = SWT.NONE;
-
-	/**
-	 * The tool bat control; <code>null</code> before creation and after
-	 * disposal.
-	 */
-	private ToolBar toolBar = null;
-
-	/**
-	 * The menu manager to the context menu associated with the toolbar.
-	 * 
-	 * @since 3.0
-	 */
-	private MenuManager contextMenuManager = null;
-
-	/**
-	 * Creates a new tool bar manager with the default SWT button style. Use the
-	 * {@link #createControl(Composite)} method to create the tool bar control.
-	 * 
-	 */
-	public ToolBarManager() {
-		//Do nothing if there are no parameters
-	}
-
-	/**
-	 * Creates a tool bar manager with the given SWT button style. Use the
-	 * <code>createControl</code> method to create the tool bar control.
-	 * 
-	 * @param style
-	 *            the tool bar item style
-	 * @see org.eclipse.swt.widgets.ToolBar for valid style bits
-	 */
-	public ToolBarManager(int style) {
-		itemStyle = style;
-	}
-
-	/**
-	 * Creates a tool bar manager for an existing tool bar control. This manager
-	 * becomes responsible for the control, and will dispose of it when the
-	 * manager is disposed.
-	 * <strong>NOTE</strong> When creating a ToolBarManager from an existing
-	 * {@link ToolBar} you will not get the accessible listener provided by
-	 * JFace.
-	 * @see #ToolBarManager()
-	 * @see #ToolBarManager(int)
-	 * 
-	 * @param toolbar
-	 *            the tool bar control
-	 */
-	public ToolBarManager(ToolBar toolbar) {
-		this();
-		this.toolBar = toolbar;
-	}
-
-	/**
-	 * Creates and returns this manager's tool bar control. Does not create a
-	 * new control if one already exists. Also create an {@link AccessibleListener}
-	 * for the {@link ToolBar}.
-	 * 
-	 * @param parent
-	 *            the parent control
-	 * @return the tool bar control
-	 */
-	public ToolBar createControl(Composite parent) {
-		if (!toolBarExist() && parent != null) {
-			toolBar = new ToolBar(parent, itemStyle);
-			toolBar.setMenu(getContextMenuControl());
-			update(true);
-			
-			toolBar.getAccessible().addAccessibleListener(getAccessibleListener());
-		}
-
-		return toolBar;
-	}
-
-	/**
-	 * Get the accessible listener for the tool bar.
-	 * 
-	 * @return AccessibleListener
-	 * 
-	 * @since 3.1
-	 */
-	private AccessibleListener getAccessibleListener() {
-		return new AccessibleAdapter() {
-			public void getName(AccessibleEvent e) {
-				if (e.childID != ACC.CHILDID_SELF) {
-					ToolItem item = toolBar.getItem(e.childID);
-					if (item != null) {
-						String toolTip = item.getToolTipText();
-						if (toolTip != null) {
-							e.result = toolTip;
-						}
-					}
-				}
-			}
-		};
-
-	}
-
-	/**
-	 * Disposes of this tool bar manager and frees all allocated SWT resources.
-	 * Notifies all contribution items of the dispose. Note that this method
-	 * does not clean up references between this tool bar manager and its
-	 * associated contribution items. Use <code>removeAll</code> for that
-	 * purpose.
-	 */
-	public void dispose() {
-
-		if (toolBarExist()) {
-			toolBar.dispose();
-		}
-		toolBar = null;
-
-		IContributionItem[] items = getItems();
-		for (int i = 0; i < items.length; i++) {
-			items[i].dispose();
-		}
-
-		if (getContextMenuManager() != null) {
-			getContextMenuManager().dispose();
-			setContextMenuManager(null);
-		}
-	}
-
-	/**
-	 * Returns the tool bar control for this manager.
-	 * 
-	 * @return the tool bar control, or <code>null</code> if none (before
-	 *         creating or after disposal)
-	 */
-	public ToolBar getControl() {
-		return toolBar;
-	}
-
-	/**
-	 * Re-lays out the tool bar.
-	 * <p>
-	 * The default implementation of this framework method re-lays out the
-	 * parent when the number of items are different and the new count != 0
-	 * 
-	 * @param layoutBar
-	 *            the tool bar control
-	 * @param oldCount
-	 *            the old number of items
-	 * @param newCount
-	 *            the new number of items
-	 */
-	protected void relayout(ToolBar layoutBar, int oldCount, int newCount) {
-		if ((oldCount != newCount) && (newCount!=0)) {
-			Point beforePack = layoutBar.getSize();
-			layoutBar.pack(true);
-			Point afterPack = layoutBar.getSize();
-			
-			// If the TB didn't change size then we're done
-			if (beforePack.equals(afterPack))
-				return;
-			
-			// OK, we need to re-layout the TB
-			layoutBar.getParent().layout();
-			
-			// Now, if we're in a CoolBar then change the CoolItem size as well
-			if (layoutBar.getParent() instanceof CoolBar) {
-				CoolBar cb = (CoolBar) layoutBar.getParent();
-				CoolItem[] items = cb.getItems();
-				for (int i = 0; i < items.length; i++) {
-					if (items[i].getControl() == layoutBar) {
-						Point curSize = items[i].getSize();
-						items[i].setSize(curSize.x+ (afterPack.x - beforePack.x),
-									curSize.y+ (afterPack.y - beforePack.y));
-						return;
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns whether the tool bar control is created and not disposed.
-	 * 
-	 * @return <code>true</code> if the control is created and not disposed,
-	 *         <code>false</code> otherwise
-	 */
-	private boolean toolBarExist() {
-		return toolBar != null && !toolBar.isDisposed();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContributionManager.
-	 */
-	public void update(boolean force) {
-
-		//	long startTime= 0;
-		//	if (DEBUG) {
-		//		dumpStatistics();
-		//		startTime= (new Date()).getTime();
-		//	}
-
-		if (isDirty() || force) {
-
-			if (toolBarExist()) {
-
-				int oldCount = toolBar.getItemCount();
-
-				// clean contains all active items without double separators
-				IContributionItem[] items = getItems();
-				ArrayList clean = new ArrayList(items.length);
-				IContributionItem separator = null;
-				//			long cleanStartTime= 0;
-				//			if (DEBUG) {
-				//				cleanStartTime= (new Date()).getTime();
-				//			}
-				for (int i = 0; i < items.length; ++i) {
-					IContributionItem ci = items[i];
-					if (!isChildVisible(ci)) {
-						continue;
-					}
-					if (ci.isSeparator()) {
-						// delay creation until necessary
-						// (handles both adjacent separators, and separator at
-						// end)
-						separator = ci;
-					} else {
-						if (separator != null) {
-							if (clean.size() > 0) {
-								clean.add(separator);
-							}
-							separator = null;
-						}
-						clean.add(ci);
-					}
-				}
-				//			if (DEBUG) {
-				//				System.out.println(" Time needed to build clean vector: " +
-				// ((new Date()).getTime() - cleanStartTime));
-				//			}
-
-				// determine obsolete items (removed or non active)
-				ToolItem[] mi = toolBar.getItems();
-				ArrayList toRemove = new ArrayList(mi.length);
-				for (int i = 0; i < mi.length; i++) {
-					Object data = mi[i].getData();
-					if (data == null
-							|| !clean.contains(data)
-							|| (data instanceof IContributionItem && ((IContributionItem) data)
-									.isDynamic())) {
-						toRemove.add(mi[i]);
-					}
-				}
-
-				// Turn redraw off if the number of items to be added
-				// is above a certain threshold, to minimize flicker,
-				// otherwise the toolbar can be seen to redraw after each item.
-				// Do this before any modifications are made.
-				// We assume each contribution item will contribute at least one
-				// toolbar item.
-				boolean useRedraw = (clean.size() - (mi.length - toRemove
-						.size())) >= 3;
-                try {
-                    if (useRedraw) {
-                        toolBar.setRedraw(false);
-                    }
-
-                    // remove obsolete items
-                    for (int i = toRemove.size(); --i >= 0;) {
-                        ToolItem item = (ToolItem) toRemove.get(i);
-                        if (!item.isDisposed()) {
-                            Control ctrl = item.getControl();
-                            if (ctrl != null) {
-                                item.setControl(null);
-                                ctrl.dispose();
-                            }
-                            item.dispose();
-                        }
-                    }
-
-                    // add new items
-                    IContributionItem src, dest;
-                    mi = toolBar.getItems();
-                    int srcIx = 0;
-                    int destIx = 0;
-                    for (Iterator e = clean.iterator(); e.hasNext();) {
-                        src = (IContributionItem) e.next();
-
-                        // get corresponding item in SWT widget
-                        if (srcIx < mi.length) {
-							dest = (IContributionItem) mi[srcIx].getData();
-						} else {
-							dest = null;
-						}
-
-                        if (dest != null && src.equals(dest)) {
-                            srcIx++;
-                            destIx++;
-                            continue;
-                        }
-
-                        if (dest != null && dest.isSeparator()
-                                && src.isSeparator()) {
-                            mi[srcIx].setData(src);
-                            srcIx++;
-                            destIx++;
-                            continue;
-                        }
-
-                        int start = toolBar.getItemCount();
-                        src.fill(toolBar, destIx);
-                        int newItems = toolBar.getItemCount() - start;
-                        for (int i = 0; i < newItems; i++) {
-                            ToolItem item = toolBar.getItem(destIx++);
-                            item.setData(src);
-                        }
-                    }
-
-                    // remove any old tool items not accounted for
-                    for (int i = mi.length; --i >= srcIx;) {
-                        ToolItem item = mi[i];
-                        if (!item.isDisposed()) {
-                            Control ctrl = item.getControl();
-                            if (ctrl != null) {
-                                item.setControl(null);
-                                ctrl.dispose();
-                            }
-                            item.dispose();
-                        }
-                    }
-
-                    setDirty(false);
-
-                    // turn redraw back on if we turned it off above
-                } finally {
-                    if (useRedraw) {
-                        toolBar.setRedraw(true);
-                    }
-                }
-
-				int newCount = toolBar.getItemCount();
-				
-				// If we're forcing a change then ensure that we re-layout everything
-				if (force)
-					oldCount = newCount+1;
-				
-				relayout(toolBar, oldCount, newCount);
-			}
-
-		}
-
-		//	if (DEBUG) {
-		//		System.out.println(" Time needed for update: " + ((new
-		// Date()).getTime() - startTime));
-		//		System.out.println();
-		//	}
-	}
-
-	/**
-	 * Returns the control of the Menu Manager. If the menu manager does not
-	 * have a control then one is created.
-	 * 
-	 * @return menu widget associated with manager
-	 */
-	private Menu getContextMenuControl() {
-		if ((contextMenuManager != null) && (toolBar != null)) {
-			Menu menuWidget = contextMenuManager.getMenu();
-			if ((menuWidget == null) || (menuWidget.isDisposed())) {
-				menuWidget = contextMenuManager.createContextMenu(toolBar);
-			}
-			return menuWidget;
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the context menu manager for this tool bar manager.
-	 * 
-	 * @return the context menu manager, or <code>null</code> if none
-	 * @since 3.0
-	 */
-	public MenuManager getContextMenuManager() {
-		return contextMenuManager;
-	}
-
-	/**
-	 * Sets the context menu manager for this tool bar manager to the given menu
-	 * manager. If the tool bar control exists, it also adds the menu control to
-	 * the tool bar.
-	 * 
-	 * @param contextMenuManager
-	 *            the context menu manager, or <code>null</code> if none
-	 * @since 3.0
-	 */
-	public void setContextMenuManager(MenuManager contextMenuManager) {
-		this.contextMenuManager = contextMenuManager;
-		if (toolBar != null) {
-			toolBar.setMenu(getContextMenuControl());
-		}
-	}
-
-	private boolean isChildVisible(IContributionItem item) {
-		Boolean v;
-		
-		IContributionManagerOverrides overrides = getOverrides();
-		if(overrides == null) {
-			v = null;
-		} else {
-			v = getOverrides().getVisible(item); 
-		}
-		
-		if (v != null) {
-			return v.booleanValue();
-		}
-		return item.isVisible();
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/images/stop.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/images/stop.gif
deleted file mode 100644
index dc47edf..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/images/stop.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/action/package.html
deleted file mode 100644
index b9f7ac7..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/action/package.html
+++ /dev/null
@@ -1,31 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides support for shared UI resources such as menus,
-tool bars, and status lines.
-<h2>
-Package Specification</h2>
-Contribution managers coordinate contributions to shared UI resources such
-as menus, menu bars, tool bars, and status lines. <tt>ContributionManager</tt>
-maintains the contributions as a dynamic list of contribution items (<tt>IContributionItems</tt>).
-Separators (<tt>Separator</tt>) can be included in contribution lists to
-break up the list's visual representation. Internally, contribution lists
-can be organized into named groups via special group markers (<tt>GroupMarker</tt>)
-to facilitate programatic insertion at specific positions within the list.
-<p>Three specific contribution managers are provided: a status line manager
-(<tt>StatusLineManager</tt>), a tool bar manager (<tt>ToolBarManager</tt>),
-and a hierarchical menu manager (<tt>MenuManager</tt>).
-<p>Actions (<tt>IAction</tt>) are commands which can be triggered from
-the UI, like the ones found in menus, toolbars, and buttons. Menus and
-tools bars are typically populated with contribution items that delegate
-to actions (<tt>ActionContributionItem</tt>).
-<p>Note: None of the classes in this package maintain global state.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/Binding.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/Binding.java
deleted file mode 100644
index 4b32100..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/Binding.java
+++ /dev/null
@@ -1,417 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.bindings;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.StringWriter;
-
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.jface.util.Util;
-
-/**
- * <p>
- * A binding is a link between user input and the triggering of a particular
- * command. The most common example of a binding is a keyboard shortcut, but
- * there are also mouse and gesture bindings.
- * </p>
- * <p>
- * Bindings are linked to particular conditions within the application. Some of
- * these conditions change infrequently (e.g., locale, scheme), while some will
- * tend to change quite frequently (e.g., context). This allows the bindings to
- * be tailored to particular situations. For example, a set of bindings may be
- * appropriate only inside a text editor.  Or, perhaps, a set of bindings might
- * be appropriate only for a given locale, such as bindings that coexist with
- * the Input Method Editor (IME) on Chinese locales.
- * </p>
- * <p>
- * It is also possible to remove a particular binding. This is typically done as
- * part of user configuration (e.g., user changing keyboard shortcuts). However,
- * it can also be helpful when trying to change a binding on a particular locale
- * or platform. An "unbinding" is really just a binding with no command
- * identifier. For it to unbind a particular binding, it must match that binding
- * in its context identifier and scheme identifier. Subclasses (e.g.,
- * <code>KeyBinding</code>) may require other properties to match (e.g.,
- * <code>keySequence</code>). If these properties match, then this is an
- * unbinding. Note: the locale and platform can be different.
- * </p>
- * <p>
- * For example, imagine you have a key binding that looks like this:
- * </p>
- * <code><pre>
- * KeyBinding(command, scheme, context, &quot;Ctrl+Shift+F&quot;)
- * </pre></code>
- * <p>
- * On GTK+, the "Ctrl+Shift+F" interferes with some native behaviour. To change
- * the binding, we first unbind the "Ctrl+Shift+F" key sequence by 
- * assigning it a null command on the gtk platform.  We then create a new binding
- * that maps the command to the "Esc Ctrl+F" key sequence.
- * </p>
- * <code><pre>
- *     KeyBinding("Ctrl+Shift+F",null,scheme,context,null,gtk,null,SYSTEM)
- *     KeyBinding("Esc Ctrl+F",parameterizedCommand,scheme,context,null,gtk,SYSTEM)
- * </pre></code>
- * <p>
- * Bindings are intended to be immutable objects.
- * </p>
- * 
- * @since 3.1
- */
-public abstract class Binding {
-
-	/**
-	 * The constant integer hash code value meaning the hash code has not yet
-	 * been computed.
-	 */
-	private static final int HASH_CODE_NOT_COMPUTED = -1;
-
-	/**
-	 * A factor for computing the hash code for all key bindings.
-	 */
-	private final static int HASH_FACTOR = 89;
-
-	/**
-	 * The seed for the hash code for all key bindings.
-	 */
-	private final static int HASH_INITIAL = Binding.class.getName().hashCode();
-
-	/**
-	 * The type of binding that is defined by the system (i.e., by the
-	 * application developer). In the case of an application based on the
-	 * Eclipse workbench, this is the registry.
-	 */
-	public static final int SYSTEM = 0;
-
-	/**
-	 * The type of binding that is defined by the user (i.e., by the end user of
-	 * the application). In the case of an application based on the Eclipse
-	 * workbench, this is the preference store.
-	 */
-	public static final int USER = 1;
-
-	/**
-	 * The parameterized command to which this binding applies. This value may
-	 * be <code>null</code> if this binding is meant to "unbind" an existing
-	 * binding.
-	 */
-	private final ParameterizedCommand command;
-
-	/**
-	 * The context identifier to which this binding applies. This context must
-	 * be active before this key binding becomes active. This value will never
-	 * be <code>null</code>.
-	 */
-	private final String contextId;
-
-	/**
-	 * The hash code for this key binding. This value is computed lazily, and
-	 * marked as invalid when one of the values on which it is based changes.
-	 */
-	private transient int hashCode = HASH_CODE_NOT_COMPUTED;
-
-	/**
-	 * The locale in which this binding applies. This value may be
-	 * <code>null</code> if this binding is meant to apply to all locales.
-	 * This string should be in the same format returned by
-	 * <code>Locale.getDefault().toString()</code>.
-	 */
-	private final String locale;
-
-	/**
-	 * The platform on which this binding applies. This value may be
-	 * <code>null</code> if this binding is meant to apply to all platforms.
-	 * This string should be in the same format returned by
-	 * <code>SWT.getPlatform</code>.
-	 */
-	private final String platform;
-
-	/**
-	 * The identifier of the scheme in which this binding applies. This value
-	 * will never be <code>null</code>.
-	 */
-	private final String schemeId;
-
-	/**
-	 * The string representation of this binding. This string is for debugging
-	 * purposes only, and is not meant to be displayed to the user. This value
-	 * is computed lazily.
-	 */
-	protected transient String string = null;
-
-	/**
-	 * The type of binding this represents. This is used to distinguish between
-	 * different priority levels for bindings. For example, in our case,
-	 * <code>USER</code> bindings override <code>SYSTEM</code> bindings.
-	 */
-	private final int type;
-
-	/**
-	 * Constructs a new instance of <code>Binding</code>.
-	 * 
-	 * @param command
-	 *            The parameterized command to which this binding applies; this
-	 *            value may be <code>null</code> if the binding is meant to
-	 *            "unbind" a previously defined binding.
-	 * @param schemeId
-	 *            The scheme to which this binding belongs; this value must not
-	 *            be <code>null</code>.
-	 * @param contextId
-	 *            The context to which this binding applies; this value must not
-	 *            be <code>null</code>.
-	 * @param locale
-	 *            The locale to which this binding applies; this value may be
-	 *            <code>null</code> if it applies to all locales.
-	 * @param platform
-	 *            The platform to which this binding applies; this value may be
-	 *            <code>null</code> if it applies to all platforms.
-	 * @param windowManager
-	 *            The window manager to which this binding applies; this value
-	 *            may be <code>null</code> if it applies to all window
-	 *            managers. This value is currently ignored.
-	 * @param type
-	 *            The type of binding. This should be either <code>SYSTEM</code>
-	 *            or <code>USER</code>.
-	 */
-	protected Binding(final ParameterizedCommand command,
-			final String schemeId, final String contextId, final String locale,
-			final String platform, final String windowManager, final int type) {
-		if (schemeId == null) {
-			throw new NullPointerException("The scheme cannot be null"); //$NON-NLS-1$
-		}
-
-		if (contextId == null) {
-			throw new NullPointerException("The context cannot be null"); //$NON-NLS-1$
-		}
-
-		if ((type != SYSTEM) && (type != USER)) {
-			throw new IllegalArgumentException(
-					"The type must be SYSTEM or USER"); //$NON-NLS-1$
-		}
-
-		this.command = command;
-		this.schemeId = schemeId.intern();
-		this.contextId = contextId.intern();
-		this.locale = (locale == null) ? null : locale.intern();
-		this.platform = (platform == null) ? null : platform.intern();
-		this.type = type;
-	}
-
-	/**
-	 * Tests whether this binding is intended to delete another binding. The
-	 * receiver must have a <code>null</code> command identifier.
-	 * 
-	 * @param binding
-	 *            The binding to test; must not be <code>null</code>.
-	 *            This binding must be a <code>SYSTEM</code> binding.
-	 * @return <code>true</code> if the receiver deletes the binding defined by
-	 * 			the argument.
-	 */
-	final boolean deletes(final Binding binding) {
-		boolean deletes = true;
-		deletes &= Util.equals(getContextId(), binding.getContextId());
-		deletes &= Util.equals(getTriggerSequence(), binding
-				.getTriggerSequence());
-		if (getLocale() != null) {
-			deletes &= !Util.equals(getLocale(), binding.getLocale());
-		}
-		if (getPlatform() != null) {
-			deletes &= !Util.equals(getPlatform(), binding.getPlatform());
-		}
-		deletes &= (binding.getType() == SYSTEM);
-		deletes &= Util.equals(getParameterizedCommand(), null);
-
-		return deletes;
-	}
-
-	/**
-	 * Tests whether this binding is equal to another object. Bindings are only
-	 * equal to other bindings with equivalent values.
-	 * 
-	 * @param object
-	 *            The object with which to compare; may be <code>null</code>.
-	 * @return <code>true</code> if the object is a binding with equivalent
-	 *         values for all of its properties; <code>false</code> otherwise.
-	 */
-	public final boolean equals(final Object object) {
-		if (this == object) {
-			return true;
-
-		}
-		if (!(object instanceof Binding)) {
-			return false;
-		}
-
-		final Binding binding = (Binding) object;
-		if (!Util.equals(getParameterizedCommand(), binding
-				.getParameterizedCommand())) {
-			return false;
-		}
-		if (!Util.equals(getContextId(), binding.getContextId())) {
-			return false;
-		}
-		if (!Util.equals(getTriggerSequence(), binding.getTriggerSequence())) {
-			return false;
-		}
-		if (!Util.equals(getLocale(), binding.getLocale())) {
-			return false;
-		}
-		if (!Util.equals(getPlatform(), binding.getPlatform())) {
-			return false;
-		}
-		if (!Util.equals(getSchemeId(), binding.getSchemeId())) {
-			return false;
-		}
-		return (getType() == binding.getType());
-	}
-
-	/**
-	 * Returns the parameterized command to which this binding applies. If the
-	 * identifier is <code>null</code>, then this binding is "unbinding" an
-	 * existing binding.
-	 * 
-	 * @return The fully-parameterized command; may be <code>null</code>.
-	 */
-	public final ParameterizedCommand getParameterizedCommand() {
-		return command;
-	}
-
-	/**
-	 * Returns the identifier of the context in which this binding applies.
-	 * 
-	 * @return The context identifier; never <code>null</code>.
-	 */
-	public final String getContextId() {
-		return contextId;
-	}
-
-	/**
-	 * Returns the locale in which this binding applies. If the locale is
-	 * <code>null</code>, then this binding applies to all locales. This
-	 * string is the same format as returned by
-	 * <code>Locale.getDefault().toString()</code>.
-	 * 
-	 * @return The locale; may be <code>null</code>.
-	 */
-	public final String getLocale() {
-		return locale;
-	}
-
-	/**
-	 * Returns the platform on which this binding applies. If the platform is
-	 * <code>null</code>, then this binding applies to all platforms. This
-	 * string is the same format as returned by <code>SWT.getPlatform()</code>.
-	 * 
-	 * @return The platform; may be <code>null</code>.
-	 */
-	public final String getPlatform() {
-		return platform;
-	}
-
-	/**
-	 * Returns the identifier of the scheme in which this binding applies.
-	 * 
-	 * @return The scheme identifier; never <code>null</code>.
-	 */
-	public final String getSchemeId() {
-		return schemeId;
-	}
-
-	/**
-	 * Returns the sequence of trigger for a given binding. The triggers can be
-	 * anything, but above all it must be hashable. This trigger sequence is
-	 * used by the binding manager to distinguish between different bindings.
-	 * 
-	 * @return The object representing an input event that will trigger this
-	 *         binding; must not be <code>null</code>.
-	 */
-	public abstract TriggerSequence getTriggerSequence();
-
-	/**
-	 * Returns the type for this binding. As it stands now, this value will
-	 * either be <code>SYSTEM</code> or <code>USER</code>. In the future,
-	 * more types might be added.
-	 * 
-	 * @return The type for this binding.
-	 */
-	public final int getType() {
-		return type;
-	}
-
-	/**
-	 * Computes the hash code for this key binding based on all of its
-	 * attributes.
-	 * 
-	 * @return The hash code for this key binding.
-	 */
-	public final int hashCode() {
-		if (hashCode == HASH_CODE_NOT_COMPUTED) {
-			hashCode = HASH_INITIAL;
-			hashCode = hashCode * HASH_FACTOR
-					+ Util.hashCode(getParameterizedCommand());
-			hashCode = hashCode * HASH_FACTOR + Util.hashCode(getContextId());
-			hashCode = hashCode * HASH_FACTOR
-					+ Util.hashCode(getTriggerSequence());
-			hashCode = hashCode * HASH_FACTOR + Util.hashCode(getLocale());
-			hashCode = hashCode * HASH_FACTOR + Util.hashCode(getPlatform());
-			hashCode = hashCode * HASH_FACTOR + Util.hashCode(getSchemeId());
-			hashCode = hashCode * HASH_FACTOR + Util.hashCode(getType());
-			if (hashCode == HASH_CODE_NOT_COMPUTED) {
-				hashCode++;
-			}
-		}
-
-		return hashCode;
-	}
-
-	/**
-	 * The string representation of this binding -- for debugging purposes only.
-	 * This string should not be shown to an end user. This should be overridden
-	 * by subclasses that add properties.
-	 * 
-	 * @return The string representation; never <code>null</code>.
-	 */
-	public String toString() {
-		if (string == null) {
-			
-			final StringWriter sw = new StringWriter();
-			final BufferedWriter stringBuffer = new BufferedWriter(sw);
-			try {
-				stringBuffer.write("Binding("); //$NON-NLS-1$
-				stringBuffer.write(getTriggerSequence().toString());
-				stringBuffer.write(',');
-				stringBuffer.newLine();
-				stringBuffer.write('\t');
-				stringBuffer.write(command==null?"":command.toString()); //$NON-NLS-1$
-				stringBuffer.write(',');
-				stringBuffer.newLine();
-				stringBuffer.write('\t');
-				stringBuffer.write(schemeId);
-				stringBuffer.write(',');
-				stringBuffer.newLine();
-				stringBuffer.write('\t');
-				stringBuffer.write(contextId);
-				stringBuffer.write(',');
-				stringBuffer.write(locale==null?"":locale); //$NON-NLS-1$
-				stringBuffer.write(',');
-				stringBuffer.write(platform==null?"":platform); //$NON-NLS-1$
-				stringBuffer.write(',');
-				stringBuffer.write((type == SYSTEM) ? "system" : "user"); //$NON-NLS-1$//$NON-NLS-2$
-				stringBuffer.write(')');
-				stringBuffer.flush();
-			} catch (IOException e) {
-				// shouldn't get this
-			}
-			string = sw.toString();
-		}
-
-		return string;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/BindingManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/BindingManager.java
deleted file mode 100644
index 14fcc18..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/BindingManager.java
+++ /dev/null
@@ -1,2343 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.bindings;
-
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.commands.CommandManager;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.HandleObjectManager;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.contexts.Context;
-import org.eclipse.core.commands.contexts.ContextManager;
-import org.eclipse.core.commands.contexts.ContextManagerEvent;
-import org.eclipse.core.commands.contexts.IContextManagerListener;
-import org.eclipse.core.commands.util.Tracing;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.bindings.keys.IKeyLookup;
-import org.eclipse.jface.bindings.keys.KeyLookupFactory;
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.jface.contexts.IContextIds;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.jface.util.Util;
-
-/**
- * <p>
- * A central repository for bindings -- both in the defined and undefined
- * states. Schemes and bindings can be created and retrieved using this manager.
- * It is possible to listen to changes in the collection of schemes and bindings
- * by adding a listener to the manager.
- * </p>
- * <p>
- * The binding manager is very sensitive to performance. Misusing the manager
- * can render an application unenjoyable to use. As such, each of the public
- * methods states the current run-time performance. In future releases, it is
- * guaranteed that the method will run in at least the stated time constraint --
- * though it might get faster. Where possible, we have also tried to be memory
- * efficient.
- * </p>
- * 
- * @since 3.1
- */
-public final class BindingManager extends HandleObjectManager implements
-		IContextManagerListener, ISchemeListener {
-
-	/**
-	 * This flag can be set to <code>true</code> if the binding manager should
-	 * print information to <code>System.out</code> when certain boundary
-	 * conditions occur.
-	 */
-	public static boolean DEBUG = false;
-
-	/**
-	 * Returned for optimized lookup.
-	 */
-	private static final TriggerSequence[] EMPTY_TRIGGER_SEQUENCE = new TriggerSequence[0];
-
-	/**
-	 * The separator character used in locales.
-	 */
-	private static final String LOCALE_SEPARATOR = "_"; //$NON-NLS-1$
-
-	private Map currentConflicts = null;
-
-	/**
-	 * </p>
-	 * A utility method for adding entries to a map. The map is checked for
-	 * entries at the key. If such an entry exists, it is expected to be a
-	 * <code>Collection</code>. The value is then appended to the collection.
-	 * If no such entry exists, then a collection is created, and the value
-	 * added to the collection.
-	 * </p>
-	 * 
-	 * @param map
-	 *            The map to modify; if this value is <code>null</code>, then
-	 *            this method simply returns.
-	 * @param key
-	 *            The key to look up in the map; may be <code>null</code>.
-	 * @param value
-	 *            The value to look up in the map; may be <code>null</code>.
-	 */
-	private static final void addReverseLookup(final Map map, final Object key,
-			final Object value) {
-		if (map == null) {
-			return;
-		}
-
-		final Object currentValue = map.get(key);
-		if (currentValue != null) {
-			final Collection values = (Collection) currentValue;
-			values.add(value);
-		} else { // currentValue == null
-			final Collection values = new ArrayList(1);
-			values.add(value);
-			map.put(key, values);
-		}
-	}
-
-	/**
-	 * <p>
-	 * Takes a fully-specified string, and converts it into an array of
-	 * increasingly less-specific strings. So, for example, "en_GB" would become
-	 * ["en_GB", "en", "", null].
-	 * </p>
-	 * <p>
-	 * This method runs in linear time (O(n)) over the length of the string.
-	 * </p>
-	 * 
-	 * @param string
-	 *            The string to break apart into its less specific components;
-	 *            should not be <code>null</code>.
-	 * @param separator
-	 *            The separator that indicates a separation between a degrees of
-	 *            specificity; should not be <code>null</code>.
-	 * @return An array of strings from the most specific (i.e.,
-	 *         <code>string</code>) to the least specific (i.e.,
-	 *         <code>null</code>).
-	 */
-	private static final String[] expand(String string, final String separator) {
-		// Test for boundary conditions.
-		if (string == null || separator == null) {
-			return new String[0];
-		}
-
-		final List strings = new ArrayList();
-		final StringBuffer stringBuffer = new StringBuffer();
-		string = string.trim(); // remove whitespace
-		if (string.length() > 0) {
-			final StringTokenizer stringTokenizer = new StringTokenizer(string,
-					separator);
-			while (stringTokenizer.hasMoreElements()) {
-				if (stringBuffer.length() > 0) {
-					stringBuffer.append(separator);
-				}
-				stringBuffer.append(((String) stringTokenizer.nextElement())
-						.trim());
-				strings.add(stringBuffer.toString());
-			}
-		}
-		Collections.reverse(strings);
-		strings.add(Util.ZERO_LENGTH_STRING);
-		strings.add(null);
-		return (String[]) strings.toArray(new String[strings.size()]);
-	}
-
-	/**
-	 * The active bindings. This is a map of triggers (
-	 * <code>TriggerSequence</code>) to bindings (<code>Binding</code>).
-	 * This value will only be <code>null</code> if the active bindings have
-	 * not yet been computed. Otherwise, this value may be empty.
-	 */
-	private Map activeBindings = null;
-
-	/**
-	 * The active bindings indexed by fully-parameterized commands. This is a
-	 * map of fully-parameterized commands (<code>ParameterizedCommand</code>)
-	 * to triggers ( <code>TriggerSequence</code>). This value will only be
-	 * <code>null</code> if the active bindings have not yet been computed.
-	 * Otherwise, this value may be empty.
-	 */
-	private Map activeBindingsByParameterizedCommand = null;
-	
-	private Set triggerConflicts = new HashSet();
-
-	/**
-	 * The scheme that is currently active. An active scheme is the one that is
-	 * currently dictating which bindings will actually work. This value may be
-	 * <code>null</code> if there is no active scheme. If the active scheme
-	 * becomes undefined, then this should automatically revert to
-	 * <code>null</code>.
-	 */
-	private Scheme activeScheme = null;
-
-	/**
-	 * The array of scheme identifiers, starting with the active scheme and
-	 * moving up through its parents. This value may be <code>null</code> if
-	 * there is no active scheme.
-	 */
-	private String[] activeSchemeIds = null;
-
-	/**
-	 * The number of bindings in the <code>bindings</code> array.
-	 */
-	private int bindingCount = 0;
-
-	/**
-	 * A cache of context IDs that weren't defined.
-	 */
-	private Set bindingErrors = new HashSet();
-
-	/**
-	 * The array of all bindings currently handled by this manager. This array
-	 * is the raw list of bindings, as provided to this manager. This value may
-	 * be <code>null</code> if there are no bindings. The size of this array
-	 * is not necessarily the number of bindings.
-	 */
-	private Binding[] bindings = null;
-
-	/**
-	 * A cache of the bindings previously computed by this manager. This value
-	 * may be empty, but it is never <code>null</code>. This is a map of
-	 * <code>CachedBindingSet</code> to <code>CachedBindingSet</code>.
-	 */
-	private Map cachedBindings = new HashMap();
-
-	/**
-	 * The command manager for this binding manager. This manager is only needed
-	 * for the <code>getActiveBindingsFor(String)</code> method. This value is
-	 * guaranteed to never be <code>null</code>.
-	 */
-	private final CommandManager commandManager;
-
-	/**
-	 * The context manager for this binding manager. For a binding manager to
-	 * function, it needs to listen for changes to the contexts. This value is
-	 * guaranteed to never be <code>null</code>.
-	 */
-	private final ContextManager contextManager;
-
-	/**
-	 * The locale for this manager. This defaults to the current locale. The
-	 * value will never be <code>null</code>.
-	 */
-	private String locale = Locale.getDefault().toString();
-
-	/**
-	 * The array of locales, starting with the active locale and moving up
-	 * through less specific representations of the locale. For example,
-	 * ["en_US", "en", "", null]. This value will never be <code>null</code>.
-	 */
-	private String[] locales = expand(locale, LOCALE_SEPARATOR);
-
-	/**
-	 * The platform for this manager. This defaults to the current platform. The
-	 * value will never be <code>null</code>.
-	 */
-	private String platform = Util.getWS();
-
-	/**
-	 * The array of platforms, starting with the active platform and moving up
-	 * through less specific representations of the platform. For example,
-	 * ["gtk", "", null]. This value will never be <code>null,/code>.
-	 */
-	private String[] platforms = expand(platform, Util.ZERO_LENGTH_STRING);
-
-	/**
-	 * A map of prefixes (<code>TriggerSequence</code>) to a map of
-	 * available completions (possibly <code>null</code>, which means there
-	 * is an exact match). The available completions is a map of trigger (<code>TriggerSequence</code>)
-	 * to bindings (<code>Binding</code>). This value may be
-	 * <code>null</code> if there is no existing solution.
-	 */
-	private Map prefixTable = null;
-
-	/**
-	 * <p>
-	 * Constructs a new instance of <code>BindingManager</code>.
-	 * </p>
-	 * <p>
-	 * This method completes in amortized constant time (O(1)).
-	 * </p>
-	 * 
-	 * @param contextManager
-	 *            The context manager that will support this binding manager.
-	 *            This value must not be <code>null</code>.
-	 * @param commandManager
-	 *            The command manager that will support this binding manager.
-	 *            This value must not be <code>null</code>.
-	 */
-	public BindingManager(final ContextManager contextManager,
-			final CommandManager commandManager) {
-		if (contextManager == null) {
-			throw new NullPointerException(
-					"A binding manager requires a context manager"); //$NON-NLS-1$
-		}
-
-		if (commandManager == null) {
-			throw new NullPointerException(
-					"A binding manager requires a command manager"); //$NON-NLS-1$
-		}
-
-		this.contextManager = contextManager;
-		contextManager.addContextManagerListener(this);
-		this.commandManager = commandManager;
-	}
-
-	/**
-	 * <p>
-	 * Adds a single new binding to the existing array of bindings. If the array
-	 * is currently <code>null</code>, then a new array is created and this
-	 * binding is added to it. This method does not detect duplicates.
-	 * </p>
-	 * <p>
-	 * This method completes in amortized <code>O(1)</code>.
-	 * </p>
-	 * 
-	 * @param binding
-	 *            The binding to be added; must not be <code>null</code>.
-	 */
-	public final void addBinding(final Binding binding) {
-		if (binding == null) {
-			throw new NullPointerException("Cannot add a null binding"); //$NON-NLS-1$
-		}
-
-		if (bindings == null) {
-			bindings = new Binding[1];
-		} else if (bindingCount >= bindings.length) {
-			final Binding[] oldBindings = bindings;
-			bindings = new Binding[oldBindings.length * 2];
-			System.arraycopy(oldBindings, 0, bindings, 0, oldBindings.length);
-		}
-		bindings[bindingCount++] = binding;
-		clearCache();
-	}
-
-	/**
-	 * <p>
-	 * Adds a listener to this binding manager. The listener will be notified
-	 * when the set of defined schemes or bindings changes. This can be used to
-	 * track the global appearance and disappearance of bindings.
-	 * </p>
-	 * <p>
-	 * This method completes in amortized constant time (<code>O(1)</code>).
-	 * </p>
-	 * 
-	 * @param listener
-	 *            The listener to attach; must not be <code>null</code>.
-	 */
-	public final void addBindingManagerListener(
-			final IBindingManagerListener listener) {
-		addListenerObject(listener);
-	}
-
-	/**
-	 * <p>
-	 * Builds a prefix table look-up for a map of active bindings.
-	 * </p>
-	 * <p>
-	 * This method takes <code>O(mn)</code>, where <code>m</code> is the
-	 * length of the trigger sequences and <code>n</code> is the number of
-	 * bindings.
-	 * </p>
-	 * 
-	 * @param activeBindings
-	 *            The map of triggers (<code>TriggerSequence</code>) to
-	 *            command ids (<code>String</code>) which are currently
-	 *            active. This value may be <code>null</code> if there are no
-	 *            active bindings, and it may be empty. It must not be
-	 *            <code>null</code>.
-	 * @return A map of prefixes (<code>TriggerSequence</code>) to a map of
-	 *         available completions (possibly <code>null</code>, which means
-	 *         there is an exact match). The available completions is a map of
-	 *         trigger (<code>TriggerSequence</code>) to command identifier (<code>String</code>).
-	 *         This value will never be <code>null</code>, but may be empty.
-	 */
-	private final Map buildPrefixTable(final Map activeBindings) {
-		final Map prefixTable = new HashMap();
-
-		final Iterator bindingItr = activeBindings.entrySet().iterator();
-		while (bindingItr.hasNext()) {
-			final Map.Entry entry = (Map.Entry) bindingItr.next();
-			final TriggerSequence triggerSequence = (TriggerSequence) entry
-					.getKey();
-
-			// Add the perfect match.
-			if (!prefixTable.containsKey(triggerSequence)) {
-				prefixTable.put(triggerSequence, null);
-			}
-
-			final TriggerSequence[] prefixes = triggerSequence.getPrefixes();
-			final int prefixesLength = prefixes.length;
-			if (prefixesLength == 0) {
-				continue;
-			}
-
-			// Break apart the trigger sequence.
-			final Binding binding = (Binding) entry.getValue();
-			for (int i = 0; i < prefixesLength; i++) {
-				final TriggerSequence prefix = prefixes[i];
-				final Object value = prefixTable.get(prefix);
-				if ((prefixTable.containsKey(prefix)) && (value instanceof Map)) {
-					((Map) value).put(triggerSequence, binding);
-				} else {
-					final Map map = new HashMap();
-					prefixTable.put(prefix, map);
-					map.put(triggerSequence, binding);
-				}
-			}
-		}
-
-		return prefixTable;
-	}
-
-	/**
-	 * <p>
-	 * Clears the cache, and the existing solution. If debugging is turned on,
-	 * then this will also print a message to standard out.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>.
-	 * </p>
-	 */
-	private final void clearCache() {
-		if (DEBUG) {
-			Tracing.printTrace("BINDINGS", "Clearing cache"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		cachedBindings.clear();
-		clearSolution();
-	}
-
-	/**
-	 * <p>
-	 * Clears the existing solution.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>.
-	 */
-	private final void clearSolution() {
-		setActiveBindings(null, null, null, null);
-	}
-
-	/**
-	 * Compares the identifier of two schemes, and decides which scheme is the
-	 * youngest (i.e., the child) of the two. Both schemes should be active
-	 * schemes.
-	 * 
-	 * @param schemeId1
-	 *            The identifier of the first scheme; must not be
-	 *            <code>null</code>.
-	 * @param schemeId2
-	 *            The identifier of the second scheme; must not be
-	 *            <code>null</code>.
-	 * @return <code>0</code> if the two schemes are equal of if neither
-	 *         scheme is active; <code>1</code> if the second scheme is the
-	 *         youngest; and <code>-1</code> if the first scheme is the
-	 *         youngest.
-	 * @since 3.2
-	 */
-	private final int compareSchemes(final String schemeId1,
-			final String schemeId2) {
-		if (!schemeId2.equals(schemeId1)) {
-			for (int i = 0; i < activeSchemeIds.length; i++) {
-				final String schemePointer = activeSchemeIds[i];
-				if (schemeId2.equals(schemePointer)) {
-					return 1;
-
-				} else if (schemeId1.equals(schemePointer)) {
-					return -1;
-
-				}
-
-			}
-		}
-
-		return 0;
-	}
-
-	/**
-	 * <p>
-	 * Computes the bindings given the context tree, and inserts them into the
-	 * <code>commandIdsByTrigger</code>. It is assumed that
-	 * <code>locales</code>,<code>platforsm</code> and
-	 * <code>schemeIds</code> correctly reflect the state of the application.
-	 * This method does not deal with caching.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n)</code>, where <code>n</code> is
-	 * the number of bindings.
-	 * </p>
-	 * 
-	 * @param activeContextTree
-	 *            The map representing the tree of active contexts. The map is
-	 *            one of child to parent, each being a context id (
-	 *            <code>String</code>). The keys are never <code>null</code>,
-	 *            but the values may be (i.e., no parent). This map may be
-	 *            empty. It may be <code>null</code> if we shouldn't consider
-	 *            contexts.
-	 * @param bindingsByTrigger
-	 *            The empty of map that is intended to be filled with triggers (
-	 *            <code>TriggerSequence</code>) to bindings (
-	 *            <code>Binding</code>). This value must not be
-	 *            <code>null</code> and must be empty.
-	 * @param triggersByCommandId
-	 *            The empty of map that is intended to be filled with command
-	 *            identifiers (<code>String</code>) to triggers (
-	 *            <code>TriggerSequence</code>). This value must either be
-	 *            <code>null</code> (indicating that these values are not
-	 *            needed), or empty (indicating that this map should be
-	 *            computed).
-	 */
-	private final void computeBindings(final Map activeContextTree,
-			final Map bindingsByTrigger, final Map triggersByCommandId, 
-			final Map conflictsByTrigger) {
-		/*
-		 * FIRST PASS: Remove all of the bindings that are marking deletions.
-		 */
-		final Binding[] trimmedBindings = removeDeletions(bindings);
-
-		/*
-		 * SECOND PASS: Just throw in bindings that match the current state. If
-		 * there is more than one match for a binding, then create a list.
-		 */
-		final Map possibleBindings = new HashMap();
-		final int length = trimmedBindings.length;
-		for (int i = 0; i < length; i++) {
-			final Binding binding = trimmedBindings[i];
-			boolean found;
-
-			// Check the context.
-			final String contextId = binding.getContextId();
-			if ((activeContextTree != null)
-					&& (!activeContextTree.containsKey(contextId))) {
-				continue;
-			}
-
-			// Check the locale.
-			if (!localeMatches(binding)) {
-				continue;
-			}
-
-			// Check the platform.
-			if (!platformMatches(binding)) {
-				continue;
-			}
-
-			// Check the scheme ids.
-			final String schemeId = binding.getSchemeId();
-			found = false;
-			if (activeSchemeIds != null) {
-				for (int j = 0; j < activeSchemeIds.length; j++) {
-					if (Util.equals(schemeId, activeSchemeIds[j])) {
-						found = true;
-						break;
-					}
-				}
-			}
-			if (!found) {
-				continue;
-			}
-
-			// Insert the match into the list of possible matches.
-			final TriggerSequence trigger = binding.getTriggerSequence();
-			final Object existingMatch = possibleBindings.get(trigger);
-			if (existingMatch instanceof Binding) {
-				possibleBindings.remove(trigger);
-				final Collection matches = new ArrayList();
-				matches.add(existingMatch);
-				matches.add(binding);
-				possibleBindings.put(trigger, matches);
-
-			} else if (existingMatch instanceof Collection) {
-				final Collection matches = (Collection) existingMatch;
-				matches.add(binding);
-
-			} else {
-				possibleBindings.put(trigger, binding);
-			}
-		}
-
-		MultiStatus conflicts = new MultiStatus("org.eclipse.jface", 0, //$NON-NLS-1$
-				"Keybinding conflicts occurred.  They may interfere with normal accelerator operation.", //$NON-NLS-1$
-				null);
-		/*
-		 * THIRD PASS: In this pass, we move any non-conflicting bindings
-		 * directly into the map. In the case of conflicts, we apply some
-		 * further logic to try to resolve them. If the conflict can't be
-		 * resolved, then we log the problem.
-		 */
-		final Iterator possibleBindingItr = possibleBindings.entrySet()
-				.iterator();
-		while (possibleBindingItr.hasNext()) {
-			final Map.Entry entry = (Map.Entry) possibleBindingItr.next();
-			final TriggerSequence trigger = (TriggerSequence) entry.getKey();
-			final Object match = entry.getValue();
-			/*
-			 * What we do depends slightly on whether we are trying to build a
-			 * list of all possible bindings (disregarding context), or a flat
-			 * map given the currently active contexts.
-			 */
-			if (activeContextTree == null) {
-				// We are building the list of all possible bindings.
-				final Collection bindings = new ArrayList();
-				if (match instanceof Binding) {
-					bindings.add(match);
-					bindingsByTrigger.put(trigger, bindings);
-					addReverseLookup(triggersByCommandId, ((Binding) match)
-							.getParameterizedCommand(), trigger);
-
-				} else if (match instanceof Collection) {
-					bindings.addAll((Collection) match);
-					bindingsByTrigger.put(trigger, bindings);
-
-					final Iterator matchItr = bindings.iterator();
-					while (matchItr.hasNext()) {
-						addReverseLookup(triggersByCommandId,
-								((Binding) matchItr.next())
-										.getParameterizedCommand(), trigger);
-					}
-				}
-
-			} else {
-				// We are building the flat map of trigger to commands.
-				if (match instanceof Binding) {
-					final Binding binding = (Binding) match;
-					bindingsByTrigger.put(trigger, binding);
-					addReverseLookup(triggersByCommandId, binding
-							.getParameterizedCommand(), trigger);
-
-				} else if (match instanceof Collection) {
-					final Binding winner = resolveConflicts((Collection) match,
-							activeContextTree);
-					if (winner == null) {
-						// warn once ... so as not to flood the logs
-						conflictsByTrigger.put(trigger, match);
-						if (triggerConflicts.add(trigger)) {
-							final StringWriter sw = new StringWriter();
-							final BufferedWriter buffer = new BufferedWriter(sw);
-							try {
-								buffer.write("A conflict occurred for "); //$NON-NLS-1$
-								buffer.write(trigger.toString());
-								buffer.write(':');
-								Iterator i = ((Collection) match).iterator();
-								while (i.hasNext()) {
-									buffer.newLine();
-									buffer.write(i.next().toString());
-								}
-								buffer.flush();
-							} catch (IOException e) {
-								// we should not get this
-							}
-							conflicts.add(new Status(IStatus.WARNING,
-									"org.eclipse.jface", //$NON-NLS-1$
-									sw.toString()));
-						}
-						if (DEBUG) {
-							Tracing.printTrace("BINDINGS", //$NON-NLS-1$
-									"A conflict occurred for " + trigger); //$NON-NLS-1$
-							Tracing.printTrace("BINDINGS", "    " + match); //$NON-NLS-1$ //$NON-NLS-2$
-						}
-					} else {
-						bindingsByTrigger.put(trigger, winner);
-						addReverseLookup(triggersByCommandId, winner
-								.getParameterizedCommand(), trigger);
-					}
-				}
-			}
-		}
-		if (conflicts.getSeverity() != IStatus.OK) {
-			Policy.getLog().log(conflicts);
-		}
-	}
-
-	/**
-	 * <p>
-	 * Notifies this manager that the context manager has changed. This method
-	 * is intended for internal use only.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>.
-	 * </p>
-	 */
-	public final void contextManagerChanged(
-			final ContextManagerEvent contextManagerEvent) {
-		if (contextManagerEvent.isActiveContextsChanged()) {
-// clearSolution();
-			recomputeBindings();
-		}
-	}
-
-	/**
-	 * Returns the number of strokes in an array of triggers. It is assumed that
-	 * there is one natural key per trigger. The strokes are counted based on
-	 * the type of key. Natural keys are worth one; ctrl is worth two; shift is
-	 * worth four; and alt is worth eight.
-	 * 
-	 * @param triggers
-	 *            The triggers on which to count strokes; must not be
-	 *            <code>null</code>.
-	 * @return The value of the strokes in the triggers.
-	 * @since 3.2
-	 */
-	private final int countStrokes(final Trigger[] triggers) {
-		int strokeCount = triggers.length;
-		for (int i = 0; i < triggers.length; i++) {
-			final Trigger trigger = triggers[i];
-			if (trigger instanceof KeyStroke) {
-				final KeyStroke keyStroke = (KeyStroke) trigger;
-				final int modifierKeys = keyStroke.getModifierKeys();
-				final IKeyLookup lookup = KeyLookupFactory.getDefault();
-				if ((modifierKeys & lookup.getAlt()) != 0) {
-					strokeCount += 8;
-				}
-				if ((modifierKeys & lookup.getCtrl()) != 0) {
-					strokeCount += 2;
-				}
-				if ((modifierKeys & lookup.getShift()) != 0) {
-					strokeCount += 4;
-				}
-				if ((modifierKeys & lookup.getCommand()) != 0) {
-					strokeCount += 2;
-				}
-			} else {
-				strokeCount += 99;
-			}
-		}
-
-		return strokeCount;
-	}
-
-	/**
-	 * <p>
-	 * Creates a tree of context identifiers, representing the hierarchical
-	 * structure of the given contexts. The tree is structured as a mapping from
-	 * child to parent.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n)</code>, where <code>n</code> is
-	 * the height of the context tree.
-	 * </p>
-	 * 
-	 * @param contextIds
-	 *            The set of context identifiers to be converted into a tree;
-	 *            must not be <code>null</code>.
-	 * @return The tree of contexts to use; may be empty, but never
-	 *         <code>null</code>. The keys and values are both strings.
-	 */
-	private final Map createContextTreeFor(final Set contextIds) {
-		final Map contextTree = new HashMap();
-
-		final Iterator contextIdItr = contextIds.iterator();
-		while (contextIdItr.hasNext()) {
-			String childContextId = (String) contextIdItr.next();
-			while (childContextId != null) {
-				// Check if we've already got the part of the tree from here up.
-				if (contextTree.containsKey(childContextId)) {
-					break;
-				}
-
-				// Retrieve the context.
-				final Context childContext = contextManager
-						.getContext(childContextId);
-
-				// Add the child-parent pair to the tree.
-				try {
-					final String parentContextId = childContext.getParentId();
-					contextTree.put(childContextId, parentContextId);
-					childContextId = parentContextId;
-				} catch (final NotDefinedException e) {
-					break; // stop ascending
-				}
-			}
-		}
-
-		return contextTree;
-	}
-
-	/**
-	 * <p>
-	 * Creates a tree of context identifiers, representing the hierarchical
-	 * structure of the given contexts. The tree is structured as a mapping from
-	 * child to parent. In this tree, the key binding specific filtering of
-	 * contexts will have taken place.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n^2)</code>, where <code>n</code>
-	 * is the height of the context tree.
-	 * </p>
-	 * 
-	 * @param contextIds
-	 *            The set of context identifiers to be converted into a tree;
-	 *            must not be <code>null</code>.
-	 * @return The tree of contexts to use; may be empty, but never
-	 *         <code>null</code>. The keys and values are both strings.
-	 */
-	private final Map createFilteredContextTreeFor(final Set contextIds) {
-		// Check to see whether a dialog or window is active.
-		boolean dialog = false;
-		boolean window = false;
-		Iterator contextIdItr = contextIds.iterator();
-		while (contextIdItr.hasNext()) {
-			final String contextId = (String) contextIdItr.next();
-			if (IContextIds.CONTEXT_ID_DIALOG.equals(contextId)) {
-				dialog = true;
-				continue;
-			}
-			if (IContextIds.CONTEXT_ID_WINDOW.equals(contextId)) {
-				window = true;
-				continue;
-			}
-		}
-
-		/*
-		 * Remove all context identifiers for contexts whose parents are dialog
-		 * or window, and the corresponding dialog or window context is not
-		 * active.
-		 */
-		contextIdItr = contextIds.iterator();
-		while (contextIdItr.hasNext()) {
-			String contextId = (String) contextIdItr.next();
-			Context context = contextManager.getContext(contextId);
-			try {
-				String parentId = context.getParentId();
-				while (parentId != null) {
-					if (IContextIds.CONTEXT_ID_DIALOG.equals(parentId)) {
-						if (!dialog) {
-							contextIdItr.remove();
-						}
-						break;
-					}
-					if (IContextIds.CONTEXT_ID_WINDOW.equals(parentId)) {
-						if (!window) {
-							contextIdItr.remove();
-						}
-						break;
-					}
-					if (IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW
-							.equals(parentId)) {
-						if ((!window) && (!dialog)) {
-							contextIdItr.remove();
-						}
-						break;
-					}
-
-					context = contextManager.getContext(parentId);
-					parentId = context.getParentId();
-				}
-			} catch (NotDefinedException e) {
-				// since this context was part of an undefined hierarchy,
-				// I'm going to yank it out as a bad bet
-				contextIdItr.remove();
-
-				// This is a logging optimization, only log the error once.
-				if (context == null || !bindingErrors.contains(context.getId())) {
-					if (context != null) {
-						bindingErrors.add(context.getId());
-					}
-
-					// now log like you've never logged before!
-					Policy
-							.getLog()
-							.log(
-									new Status(
-											IStatus.ERROR,
-											Policy.JFACE,
-											IStatus.OK,
-											"Undefined context while filtering dialog/window contexts", //$NON-NLS-1$
-											e));
-				}
-			}
-		}
-
-		return createContextTreeFor(contextIds);
-	}
-
-	/**
-	 * <p>
-	 * Notifies all of the listeners to this manager that the defined or active
-	 * schemes of bindings have changed.
-	 * </p>
-	 * <p>
-	 * The time this method takes to complete is dependent on external
-	 * listeners.
-	 * </p>
-	 * 
-	 * @param event
-	 *            The event to send to all of the listeners; must not be
-	 *            <code>null</code>.
-	 */
-	private final void fireBindingManagerChanged(final BindingManagerEvent event) {
-		if (event == null) {
-			throw new NullPointerException();
-		}
-
-		final Object[] listeners = getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			final IBindingManagerListener listener = (IBindingManagerListener) listeners[i];
-			listener.bindingManagerChanged(event);
-		}
-	}
-
-	/**
-	 * <p>
-	 * Returns the active bindings. The caller must not modify the returned map.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>. If the active bindings are
-	 * not yet computed, then this completes in <code>O(nn)</code>, where
-	 * <code>n</code> is the number of bindings.
-	 * </p>
-	 * 
-	 * @return The map of triggers (<code>TriggerSequence</code>) to
-	 *         bindings (<code>Binding</code>) which are currently active.
-	 *         This value may be <code>null</code> if there are no active
-	 *         bindings, and it may be empty.
-	 */
-	private final Map getActiveBindings() {
-		if (activeBindings == null) {
-			recomputeBindings();
-		}
-
-		return activeBindings;
-	}
-
-	/**
-	 * <p>
-	 * Returns the active bindings indexed by command identifier. The caller
-	 * must not modify the returned map.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>. If the active bindings are
-	 * not yet computed, then this completes in <code>O(nn)</code>, where
-	 * <code>n</code> is the number of bindings.
-	 * </p>
-	 * 
-	 * @return The map of fully-parameterized commands (<code>ParameterizedCommand</code>)
-	 *         to triggers (<code>TriggerSequence</code>) which are
-	 *         currently active. This value may be <code>null</code> if there
-	 *         are no active bindings, and it may be empty.
-	 */
-	private final Map getActiveBindingsByParameterizedCommand() {
-		if (activeBindingsByParameterizedCommand == null) {
-			recomputeBindings();
-		}
-
-		return activeBindingsByParameterizedCommand;
-	}
-
-	/**
-	 * <p>
-	 * Computes the bindings for the current state of the application, but
-	 * disregarding the current contexts. This can be useful when trying to
-	 * display all the possible bindings.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n)</code>, where <code>n</code> is
-	 * the number of bindings.
-	 * </p>
-	 * 
-	 * @return A map of trigger (<code>TriggerSequence</code>) to bindings (
-	 *         <code>Collection</code> containing <code>Binding</code>).
-	 *         This map may be empty, but it is never <code>null</code>.
-	 */
-	public final Map getActiveBindingsDisregardingContext() {
-		if (bindings == null) {
-			// Not yet initialized. This is happening too early. Do nothing.
-			return Collections.EMPTY_MAP;
-		}
-
-		// Build a cached binding set for that state.
-		final CachedBindingSet bindingCache = new CachedBindingSet(null,
-				locales, platforms, activeSchemeIds);
-
-		/*
-		 * Check if the cached binding set already exists. If so, simply set the
-		 * active bindings and return.
-		 */
-		CachedBindingSet existingCache = (CachedBindingSet) cachedBindings
-				.get(bindingCache);
-		if (existingCache == null) {
-			existingCache = bindingCache;
-			cachedBindings.put(existingCache, existingCache);
-		}
-		Map commandIdsByTrigger = existingCache.getBindingsByTrigger();
-		if (commandIdsByTrigger != null) {
-			if (DEBUG) {
-				Tracing.printTrace("BINDINGS", "Cache hit"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			return Collections.unmodifiableMap(commandIdsByTrigger);
-		}
-
-		// There is no cached entry for this.
-		if (DEBUG) {
-			Tracing.printTrace("BINDINGS", "Cache miss"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		// Compute the active bindings.
-		commandIdsByTrigger = new HashMap();
-		final Map triggersByParameterizedCommand = new HashMap();
-		final Map conflictsByTrigger = new HashMap();
-		computeBindings(null, commandIdsByTrigger,
-				triggersByParameterizedCommand, conflictsByTrigger);
-		existingCache.setBindingsByTrigger(commandIdsByTrigger);
-		existingCache.setTriggersByCommandId(triggersByParameterizedCommand);
-		existingCache.setConflictsByTrigger(conflictsByTrigger);
-		return Collections.unmodifiableMap(commandIdsByTrigger);
-	}
-
-	/**
-	 * <p>
-	 * Computes the bindings for the current state of the application, but
-	 * disregarding the current contexts. This can be useful when trying to
-	 * display all the possible bindings.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n)</code>, where <code>n</code> is
-	 * the number of bindings.
-	 * </p>
-	 * 
-	 * @return A map of trigger (<code>TriggerSequence</code>) to bindings (
-	 *         <code>Collection</code> containing <code>Binding</code>).
-	 *         This map may be empty, but it is never <code>null</code>.
-	 * @since 3.2
-	 */
-	private final Map getActiveBindingsDisregardingContextByParameterizedCommand() {
-		if (bindings == null) {
-			// Not yet initialized. This is happening too early. Do nothing.
-			return Collections.EMPTY_MAP;
-		}
-
-		// Build a cached binding set for that state.
-		final CachedBindingSet bindingCache = new CachedBindingSet(null,
-				locales, platforms, activeSchemeIds);
-
-		/*
-		 * Check if the cached binding set already exists. If so, simply set the
-		 * active bindings and return.
-		 */
-		CachedBindingSet existingCache = (CachedBindingSet) cachedBindings
-				.get(bindingCache);
-		if (existingCache == null) {
-			existingCache = bindingCache;
-			cachedBindings.put(existingCache, existingCache);
-		}
-		Map triggersByParameterizedCommand = existingCache
-				.getTriggersByCommandId();
-		if (triggersByParameterizedCommand != null) {
-			if (DEBUG) {
-				Tracing.printTrace("BINDINGS", "Cache hit"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			return Collections.unmodifiableMap(triggersByParameterizedCommand);
-		}
-
-		// There is no cached entry for this.
-		if (DEBUG) {
-			Tracing.printTrace("BINDINGS", "Cache miss"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		// Compute the active bindings.
-		final Map commandIdsByTrigger = new HashMap();
-		final Map conflictsByTrigger = new HashMap();
-		triggersByParameterizedCommand = new HashMap();
-		computeBindings(null, commandIdsByTrigger,
-				triggersByParameterizedCommand, conflictsByTrigger);
-		existingCache.setBindingsByTrigger(commandIdsByTrigger);
-		existingCache.setTriggersByCommandId(triggersByParameterizedCommand);
-		existingCache.setConflictsByTrigger(conflictsByTrigger);
-
-		return Collections.unmodifiableMap(triggersByParameterizedCommand);
-	}
-
-	/**
-	 * <p>
-	 * Computes the bindings for the current state of the application, but
-	 * disregarding the current contexts. This can be useful when trying to
-	 * display all the possible bindings.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n)</code>, where <code>n</code> is
-	 * the number of bindings.
-	 * </p>
-	 * 
-	 * @return All of the active bindings (<code>Binding</code>), not sorted
-	 *         in any fashion. This collection may be empty, but it is never
-	 *         <code>null</code>.
-	 */
-	public final Collection getActiveBindingsDisregardingContextFlat() {
-		final Collection bindingCollections = getActiveBindingsDisregardingContext()
-				.values();
-		final Collection mergedBindings = new ArrayList();
-		final Iterator bindingCollectionItr = bindingCollections.iterator();
-		while (bindingCollectionItr.hasNext()) {
-			final Collection bindingCollection = (Collection) bindingCollectionItr
-					.next();
-			if ((bindingCollection != null) && (!bindingCollection.isEmpty())) {
-				mergedBindings.addAll(bindingCollection);
-			}
-		}
-
-		return mergedBindings;
-	}
-
-	/**
-	 * <p>
-	 * Returns the active bindings for a particular command identifier, but
-	 * discounting the current contexts. This method operates in O(n) time over
-	 * the number of bindings.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>. If the active bindings are
-	 * not yet computed, then this completes in <code>O(nn)</code>, where
-	 * <code>n</code> is the number of bindings.
-	 * </p>
-	 * 
-	 * @param parameterizedCommand
-	 *            The fully-parameterized command whose bindings are requested.
-	 *            This argument may be <code>null</code>.
-	 * @return The array of active triggers (<code>TriggerSequence</code>)
-	 *         for a particular command identifier. This value is guaranteed to
-	 *         never be <code>null</code>, but it may be empty.
-	 * @since 3.2
-	 */
-	public final TriggerSequence[] getActiveBindingsDisregardingContextFor(
-			final ParameterizedCommand parameterizedCommand) {
-		final Object object = getActiveBindingsDisregardingContextByParameterizedCommand()
-				.get(parameterizedCommand);
-		if (object instanceof Collection) {
-			final Collection collection = (Collection) object;
-			return (TriggerSequence[]) collection
-					.toArray(new TriggerSequence[collection.size()]);
-		}
-
-		return EMPTY_TRIGGER_SEQUENCE;
-	}
-
-	/**
-	 * <p>
-	 * Returns the active bindings for a particular command identifier. This
-	 * method operates in O(n) time over the number of bindings.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>. If the active bindings are
-	 * not yet computed, then this completes in <code>O(nn)</code>, where
-	 * <code>n</code> is the number of bindings.
-	 * </p>
-	 * 
-	 * @param parameterizedCommand
-	 *            The fully-parameterized command whose bindings are requested.
-	 *            This argument may be <code>null</code>.
-	 * @return The array of active triggers (<code>TriggerSequence</code>)
-	 *         for a particular command identifier. This value is guaranteed to
-	 *         never be <code>null</code>, but it may be empty.
-	 */
-	public final TriggerSequence[] getActiveBindingsFor(
-			final ParameterizedCommand parameterizedCommand) {
-		final Object object = getActiveBindingsByParameterizedCommand().get(
-				parameterizedCommand);
-		if (object instanceof Collection) {
-			final Collection collection = (Collection) object;
-			return (TriggerSequence[]) collection
-					.toArray(new TriggerSequence[collection.size()]);
-		}
-
-		return EMPTY_TRIGGER_SEQUENCE;
-	}
-
-	/**
-	 * <p>
-	 * Returns the active bindings for a particular command identifier. This
-	 * method operates in O(n) time over the number of bindings.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>. If the active bindings are
-	 * not yet computed, then this completes in <code>O(nn)</code>, where
-	 * <code>n</code> is the number of bindings.
-	 * </p>
-	 * 
-	 * @param commandId
-	 *            The identifier of the command whose bindings are requested.
-	 *            This argument may be <code>null</code>. It is assumed that
-	 *            the command has no parameters.
-	 * @return The array of active triggers (<code>TriggerSequence</code>)
-	 *         for a particular command identifier. This value is guaranteed not
-	 *         to be <code>null</code>, but it may be empty.
-	 */
-	public final TriggerSequence[] getActiveBindingsFor(final String commandId) {
-		final ParameterizedCommand parameterizedCommand = new ParameterizedCommand(
-				commandManager.getCommand(commandId), null);
-		return getActiveBindingsFor(parameterizedCommand);
-	}
-
-	/**
-	 * A variation on {@link BindingManager#getActiveBindingsFor(String)} that
-	 * returns an array of bindings, rather than trigger sequences. This method
-	 * is needed for doing "best" calculations on the active bindings.
-	 * 
-	 * @param commandId
-	 *            The identifier of the command for which the active bindings
-	 *            should be retrieved; must not be <code>null</code>.
-	 * @return The active bindings for the given command; this value may be
-	 *         <code>null</code> if there are no active bindings.
-	 * @since 3.2
-	 */
-	private final Binding[] getActiveBindingsFor1(final ParameterizedCommand command) {
-		final TriggerSequence[] triggers = getActiveBindingsFor(command);
-		if (triggers.length == 0) {
-			return null;
-		}
-
-		final Map activeBindings = getActiveBindings();
-		if (activeBindings != null) {
-			final Binding[] bindings = new Binding[triggers.length];
-			for (int i = 0; i < triggers.length; i++) {
-				final TriggerSequence triggerSequence = triggers[i];
-				final Object object = activeBindings.get(triggerSequence);
-				final Binding binding = (Binding) object;
-				bindings[i] = binding;
-			}
-			return bindings;
-		}
-
-		return null;
-	}
-
-	/**
-	 * <p>
-	 * Gets the currently active scheme.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>.
-	 * </p>
-	 * 
-	 * @return The active scheme; may be <code>null</code> if there is no
-	 *         active scheme. If a scheme is returned, it is guaranteed to be
-	 *         defined.
-	 */
-	public final Scheme getActiveScheme() {
-		return activeScheme;
-	}
-
-	/**
-	 * Gets the best active binding for a command. The best binding is the one
-	 * that would be most appropriate to show in a menu. Bindings which belong
-	 * to a child scheme are given preference over those in a parent scheme.
-	 * Bindings which belong to a particular locale or platform are given
-	 * preference over those that do not. The rest of the calculaton is based
-	 * most on various concepts of "length", as well as giving some modifier
-	 * keys preference (e.g., <code>Alt</code> is less likely to appear than
-	 * <code>Ctrl</code>).
-	 * 
-	 * @param commandId
-	 *            The identifier of the command for which the best active
-	 *            binding should be retrieved; must not be <code>null</code>.
-	 * @return The trigger sequence for the best binding; may be
-	 *         <code>null</code> if no bindings are active for the given
-	 *         command.
-	 * @since 3.2
-	 */
-	public final TriggerSequence getBestActiveBindingFor(final String commandId) {
-		return getBestActiveBindingFor(new ParameterizedCommand(commandManager.getCommand(commandId), null));
-	}
-	
-	/**
-	 * @param command
-	 * @return
-	 * 		a trigger sequence, or <code>null</code>
-	 * @since 3.4
-	 */
-	public final TriggerSequence getBestActiveBindingFor(final ParameterizedCommand command) {
-		final Binding[] bindings = getActiveBindingsFor1(command);
-		if ((bindings == null) || (bindings.length == 0)) {
-			return null;
-		}
-
-		Binding bestBinding = bindings[0];
-		int compareTo;
-		for (int i = 1; i < bindings.length; i++) {
-			final Binding currentBinding = bindings[i];
-
-			// Bindings in a child scheme are always given preference.
-			final String bestSchemeId = bestBinding.getSchemeId();
-			final String currentSchemeId = currentBinding.getSchemeId();
-			compareTo = compareSchemes(bestSchemeId, currentSchemeId);
-			if (compareTo > 0) {
-				bestBinding = currentBinding;
-			}
-			if (compareTo != 0) {
-				continue;
-			}
-
-			/*
-			 * Bindings with a locale are given preference over those that do
-			 * not.
-			 */
-			final String bestLocale = bestBinding.getLocale();
-			final String currentLocale = currentBinding.getLocale();
-			if ((bestLocale == null) && (currentLocale != null)) {
-				bestBinding = currentBinding;
-			}
-			if (!(Util.equals(bestLocale, currentLocale))) {
-				continue;
-			}
-
-			/*
-			 * Bindings with a platform are given preference over those that do
-			 * not.
-			 */
-			final String bestPlatform = bestBinding.getPlatform();
-			final String currentPlatform = currentBinding.getPlatform();
-			if ((bestPlatform == null) && (currentPlatform != null)) {
-				bestBinding = currentBinding;
-			}
-			if (!(Util.equals(bestPlatform, currentPlatform))) {
-				continue;
-			}
-
-			/*
-			 * Check to see which has the least number of triggers in the
-			 * trigger sequence.
-			 */
-			final TriggerSequence bestTriggerSequence = bestBinding
-					.getTriggerSequence();
-			final TriggerSequence currentTriggerSequence = currentBinding
-					.getTriggerSequence();
-			final Trigger[] bestTriggers = bestTriggerSequence.getTriggers();
-			final Trigger[] currentTriggers = currentTriggerSequence
-					.getTriggers();
-			compareTo = bestTriggers.length - currentTriggers.length;
-			if (compareTo > 0) {
-				bestBinding = currentBinding;
-			}
-			if (compareTo != 0) {
-				continue;
-			}
-
-			/*
-			 * Compare the number of keys pressed in each trigger sequence. Some
-			 * types of keys count less than others (i.e., some types of
-			 * modifiers keys are less likely to be chosen).
-			 */
-			compareTo = countStrokes(bestTriggers)
-					- countStrokes(currentTriggers);
-			if (compareTo > 0) {
-				bestBinding = currentBinding;
-			}
-			if (compareTo != 0) {
-				continue;
-			}
-
-			// If this is still a tie, then just chose the shortest text.
-			compareTo = bestTriggerSequence.format().length()
-					- currentTriggerSequence.format().length();
-			if (compareTo > 0) {
-				bestBinding = currentBinding;
-			}
-		}
-
-		return bestBinding.getTriggerSequence();
-	}
-
-	/**
-	 * Gets the formatted string representing the best active binding for a
-	 * command. The best binding is the one that would be most appropriate to
-	 * show in a menu. Bindings which belong to a child scheme are given
-	 * preference over those in a parent scheme. The rest of the calculaton is
-	 * based most on various concepts of "length", as well as giving some
-	 * modifier keys preference (e.g., <code>Alt</code> is less likely to
-	 * appear than <code>Ctrl</code>).
-	 * 
-	 * @param commandId
-	 *            The identifier of the command for which the best active
-	 *            binding should be retrieved; must not be <code>null</code>.
-	 * @return The formatted string for the best binding; may be
-	 *         <code>null</code> if no bindings are active for the given
-	 *         command.
-	 * @since 3.2
-	 */
-	public final String getBestActiveBindingFormattedFor(final String commandId) {
-		final TriggerSequence binding = getBestActiveBindingFor(commandId);
-		if (binding != null) {
-			return binding.format();
-		}
-
-		return null;
-	}
-	/**
-	 * <p>
-	 * Returns the set of all bindings managed by this class.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>.
-	 * </p>
-	 * 
-	 * @return The array of all bindings. This value may be <code>null</code>
-	 *         and it may be empty.
-	 */
-	public final Binding[] getBindings() {
-		if (bindings == null) {
-			return null;
-		}
-
-		final Binding[] returnValue = new Binding[bindingCount];
-		System.arraycopy(bindings, 0, returnValue, 0, bindingCount);
-		return returnValue;
-	}
-
-	/**
-	 * <p>
-	 * Returns the array of schemes that are defined.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>.
-	 * </p>
-	 * 
-	 * @return The array of defined schemes; this value may be empty or
-	 *         <code>null</code>.
-	 */
-	public final Scheme[] getDefinedSchemes() {
-		return (Scheme[]) definedHandleObjects
-				.toArray(new Scheme[definedHandleObjects.size()]);
-	}
-
-	/**
-	 * <p>
-	 * Returns the active locale for this binding manager. The locale is in the
-	 * same format as <code>Locale.getDefault().toString()</code>.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>.
-	 * </p>
-	 * 
-	 * @return The active locale; never <code>null</code>.
-	 */
-	public final String getLocale() {
-		return locale;
-	}
-
-	/**
-	 * <p>
-	 * Returns all of the possible bindings that start with the given trigger
-	 * (but are not equal to the given trigger).
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>. If the bindings aren't
-	 * currently computed, then this completes in <code>O(n)</code>, where
-	 * <code>n</code> is the number of bindings.
-	 * </p>
-	 * 
-	 * @param trigger
-	 *            The prefix to look for; must not be <code>null</code>.
-	 * @return A map of triggers (<code>TriggerSequence</code>) to bindings (<code>Binding</code>).
-	 *         This map may be empty, but it is never <code>null</code>.
-	 */
-	public final Map getPartialMatches(final TriggerSequence trigger) {
-		final Map partialMatches = (Map) getPrefixTable().get(trigger);
-		if (partialMatches == null) {
-			return Collections.EMPTY_MAP;
-		}
-
-		return partialMatches;
-	}
-
-	/**
-	 * <p>
-	 * Returns the command identifier for the active binding matching this
-	 * trigger, if any.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>. If the bindings aren't
-	 * currently computed, then this completes in <code>O(n)</code>, where
-	 * <code>n</code> is the number of bindings.
-	 * </p>
-	 * 
-	 * @param trigger
-	 *            The trigger to match; may be <code>null</code>.
-	 * @return The binding that matches, if any; <code>null</code> otherwise.
-	 */
-	public final Binding getPerfectMatch(final TriggerSequence trigger) {
-		return (Binding) getActiveBindings().get(trigger);
-	}
-
-	/**
-	 * <p>
-	 * Returns the active platform for this binding manager. The platform is in
-	 * the same format as <code>SWT.getPlatform()</code>.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>.
-	 * </p>
-	 * 
-	 * @return The active platform; never <code>null</code>.
-	 */
-	public final String getPlatform() {
-		return platform;
-	}
-
-	/**
-	 * <p>
-	 * Returns the prefix table. The caller must not modify the returned map.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>. If the active bindings are
-	 * not yet computed, then this completes in <code>O(n)</code>, where
-	 * <code>n</code> is the number of bindings.
-	 * </p>
-	 * 
-	 * @return A map of prefixes (<code>TriggerSequence</code>) to a map of
-	 *         available completions (possibly <code>null</code>, which means
-	 *         there is an exact match). The available completions is a map of
-	 *         trigger (<code>TriggerSequence</code>) to binding (<code>Binding</code>).
-	 *         This value will never be <code>null</code> but may be empty.
-	 */
-	private final Map getPrefixTable() {
-		if (prefixTable == null) {
-			recomputeBindings();
-		}
-
-		return prefixTable;
-	}
-
-	/**
-	 * <p>
-	 * Gets the scheme with the given identifier. If the scheme does not already
-	 * exist, then a new (undefined) scheme is created with that identifier.
-	 * This guarantees that schemes will remain unique.
-	 * </p>
-	 * <p>
-	 * This method completes in amortized <code>O(1)</code>.
-	 * </p>
-	 * 
-	 * @param schemeId
-	 *            The identifier for the scheme to retrieve; must not be
-	 *            <code>null</code>.
-	 * @return A scheme with the given identifier.
-	 */
-	public final Scheme getScheme(final String schemeId) {
-		checkId(schemeId);
-
-		Scheme scheme = (Scheme) handleObjectsById.get(schemeId);
-		if (scheme == null) {
-			scheme = new Scheme(schemeId);
-			handleObjectsById.put(schemeId, scheme);
-			scheme.addSchemeListener(this);
-		}
-
-		return scheme;
-	}
-
-	/**
-	 * <p>
-	 * Ascends all of the parents of the scheme until no more parents are found.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n)</code>, where <code>n</code> is
-	 * the height of the context tree.
-	 * </p>
-	 * 
-	 * @param schemeId
-	 *            The id of the scheme for which the parents should be found;
-	 *            may be <code>null</code>.
-	 * @return The array of scheme ids (<code>String</code>) starting with
-	 *         <code>schemeId</code> and then ascending through its ancestors.
-	 */
-	private final String[] getSchemeIds(String schemeId) {
-		final List strings = new ArrayList();
-		while (schemeId != null) {
-			strings.add(schemeId);
-			try {
-				schemeId = getScheme(schemeId).getParentId();
-			} catch (final NotDefinedException e) {
-				Policy.getLog().log(
-						new Status(IStatus.ERROR, Policy.JFACE, IStatus.OK,
-								"Failed ascending scheme parents", //$NON-NLS-1$
-								e));
-				return new String[0];
-			}
-		}
-
-		return (String[]) strings.toArray(new String[strings.size()]);
-	}
-
-	/**
-	 * <p>
-	 * Returns whether the given trigger sequence is a partial match for the
-	 * given sequence.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>. If the bindings aren't
-	 * currently computed, then this completes in <code>O(n)</code>, where
-	 * <code>n</code> is the number of bindings.
-	 * </p>
-	 * 
-	 * @param trigger
-	 *            The sequence which should be the prefix for some binding;
-	 *            should not be <code>null</code>.
-	 * @return <code>true</code> if the trigger can be found in the active
-	 *         bindings; <code>false</code> otherwise.
-	 */
-	public final boolean isPartialMatch(final TriggerSequence trigger) {
-		return (getPrefixTable().get(trigger) != null);
-	}
-
-	/**
-	 * <p>
-	 * Returns whether the given trigger sequence is a perfect match for the
-	 * given sequence.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>. If the bindings aren't
-	 * currently computed, then this completes in <code>O(n)</code>, where
-	 * <code>n</code> is the number of bindings.
-	 * </p>
-	 * 
-	 * @param trigger
-	 *            The sequence which should match exactly; should not be
-	 *            <code>null</code>.
-	 * @return <code>true</code> if the trigger can be found in the active
-	 *         bindings; <code>false</code> otherwise.
-	 */
-	public final boolean isPerfectMatch(final TriggerSequence trigger) {
-		return getActiveBindings().containsKey(trigger);
-	}
-
-	/**
-	 * <p>
-	 * Tests whether the locale for the binding matches one of the active
-	 * locales.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n)</code>, where <code>n</code> is
-	 * the number of active locales.
-	 * </p>
-	 * 
-	 * @param binding
-	 *            The binding with which to test; must not be <code>null</code>.
-	 * @return <code>true</code> if the binding's locale matches;
-	 *         <code>false</code> otherwise.
-	 */
-	private final boolean localeMatches(final Binding binding) {
-		boolean matches = false;
-
-		final String locale = binding.getLocale();
-		if (locale == null) {
-			return true; // shortcut a common case
-		}
-
-		for (int i = 0; i < locales.length; i++) {
-			if (Util.equals(locales[i], locale)) {
-				matches = true;
-				break;
-			}
-		}
-
-		return matches;
-	}
-
-	/**
-	 * <p>
-	 * Tests whether the platform for the binding matches one of the active
-	 * platforms.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n)</code>, where <code>n</code> is
-	 * the number of active platforms.
-	 * </p>
-	 * 
-	 * @param binding
-	 *            The binding with which to test; must not be <code>null</code>.
-	 * @return <code>true</code> if the binding's platform matches;
-	 *         <code>false</code> otherwise.
-	 */
-	private final boolean platformMatches(final Binding binding) {
-		boolean matches = false;
-
-		final String platform = binding.getPlatform();
-		if (platform == null) {
-			return true; // shortcut a common case
-		}
-
-		for (int i = 0; i < platforms.length; i++) {
-			if (Util.equals(platforms[i], platform)) {
-				matches = true;
-				break;
-			}
-		}
-
-		return matches;
-	}
-
-	/**
-	 * <p>
-	 * This recomputes the bindings based on changes to the state of the world.
-	 * This computation can be triggered by changes to contexts, the active
-	 * scheme, the locale, or the platform. This method tries to use the cache
-	 * of pre-computed bindings, if possible. When this method completes,
-	 * <code>activeBindings</code> will be set to the current set of bindings
-	 * and <code>cachedBindings</code> will contain an instance of
-	 * <code>CachedBindingSet</code> representing these bindings.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n+pn)</code>, where <code>n</code>
-	 * is the number of bindings, and <code>p</code> is the average number of
-	 * triggers in a trigger sequence.
-	 * </p>
-	 */
-	private final void recomputeBindings() {
-		if (bindings == null) {
-			// Not yet initialized. This is happening too early. Do nothing.
-			setActiveBindings(Collections.EMPTY_MAP, Collections.EMPTY_MAP,
-					Collections.EMPTY_MAP, Collections.EMPTY_MAP);
-			return;
-		}
-
-		// Figure out the current state.
-		final Set activeContextIds = new HashSet(contextManager
-				.getActiveContextIds());
-		final Map activeContextTree = createFilteredContextTreeFor(activeContextIds);
-
-		// Build a cached binding set for that state.
-		final CachedBindingSet bindingCache = new CachedBindingSet(
-				activeContextTree, locales, platforms, activeSchemeIds);
-
-		/*
-		 * Check if the cached binding set already exists. If so, simply set the
-		 * active bindings and return.
-		 */
-		CachedBindingSet existingCache = (CachedBindingSet) cachedBindings
-				.get(bindingCache);
-		if (existingCache == null) {
-			existingCache = bindingCache;
-			cachedBindings.put(existingCache, existingCache);
-		}
-		Map commandIdsByTrigger = existingCache.getBindingsByTrigger();
-		if (commandIdsByTrigger != null) {
-			if (DEBUG) {
-				Tracing.printTrace("BINDINGS", "Cache hit"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			setActiveBindings(commandIdsByTrigger, existingCache
-					.getTriggersByCommandId(), existingCache.getPrefixTable(),
-					existingCache.getConflictsByTrigger());
-			return;
-		}
-
-		// There is no cached entry for this.
-		if (DEBUG) {
-			Tracing.printTrace("BINDINGS", "Cache miss"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		// Compute the active bindings.
-		commandIdsByTrigger = new HashMap();
-		final Map triggersByParameterizedCommand = new HashMap();
-		final Map conflictsByTrigger = new HashMap();
-		computeBindings(activeContextTree, commandIdsByTrigger,
-				triggersByParameterizedCommand, conflictsByTrigger);
-		existingCache.setBindingsByTrigger(commandIdsByTrigger);
-		existingCache.setTriggersByCommandId(triggersByParameterizedCommand);
-		existingCache.setConflictsByTrigger(conflictsByTrigger);
-		setActiveBindings(commandIdsByTrigger, triggersByParameterizedCommand,
-				buildPrefixTable(commandIdsByTrigger),
-				conflictsByTrigger);
-		existingCache.setPrefixTable(prefixTable);
-	}
-
-	/**
-	 * <p>
-	 * Remove the specific binding by identity. Does nothing if the binding is
-	 * not in the manager.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n)</code>, where <code>n</code> is
-	 * the number of bindings.
-	 * </p>
-	 * 
-	 * @param binding
-	 *            The binding to be removed; must not be <code>null</code>.
-	 * @since 3.2
-	 */
-	public final void removeBinding(final Binding binding) {
-		if (bindings == null || bindings.length < 1) {
-			return;
-		}
-
-		final Binding[] newBindings = new Binding[bindings.length];
-		boolean bindingsChanged = false;
-		int index = 0;
-		for (int i = 0; i < bindingCount; i++) {
-			final Binding b = bindings[i];
-			if (b == binding) {
-				bindingsChanged = true;
-			} else {
-				newBindings[index++] = b;
-			}
-		}
-
-		if (bindingsChanged) {
-			this.bindings = newBindings;
-			bindingCount = index;
-			clearCache();
-		}
-	}
-
-	/**
-	 * <p>
-	 * Removes a listener from this binding manager.
-	 * </p>
-	 * <p>
-	 * This method completes in amortized <code>O(1)</code>.
-	 * </p>
-	 * 
-	 * @param listener
-	 *            The listener to be removed; must not be <code>null</code>.
-	 */
-	public final void removeBindingManagerListener(
-			final IBindingManagerListener listener) {
-		removeListenerObject(listener);
-	}
-
-	/**
-	 * <p>
-	 * Removes any binding that matches the given values -- regardless of
-	 * command identifier.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n)</code>, where <code>n</code> is
-	 * the number of bindings.
-	 * </p>
-	 * 
-	 * @param sequence
-	 *            The sequence to match; may be <code>null</code>.
-	 * @param schemeId
-	 *            The scheme id to match; may be <code>null</code>.
-	 * @param contextId
-	 *            The context id to match; may be <code>null</code>.
-	 * @param locale
-	 *            The locale to match; may be <code>null</code>.
-	 * @param platform
-	 *            The platform to match; may be <code>null</code>.
-	 * @param windowManager
-	 *            The window manager to match; may be <code>null</code>. TODO
-	 *            Currently ignored.
-	 * @param type
-	 *            The type to look for.
-	 * 
-	 */
-	public final void removeBindings(final TriggerSequence sequence,
-			final String schemeId, final String contextId, final String locale,
-			final String platform, final String windowManager, final int type) {
-		if ((bindings == null) || (bindingCount < 1)) {
-			return;
-		}
-
-		final Binding[] newBindings = new Binding[bindings.length];
-		boolean bindingsChanged = false;
-		int index = 0;
-		for (int i = 0; i < bindingCount; i++) {
-			final Binding binding = bindings[i];
-			boolean equals = true;
-			equals &= Util.equals(sequence, binding.getTriggerSequence());
-			equals &= Util.equals(schemeId, binding.getSchemeId());
-			equals &= Util.equals(contextId, binding.getContextId());
-			equals &= Util.equals(locale, binding.getLocale());
-			equals &= Util.equals(platform, binding.getPlatform());
-			equals &= (type == binding.getType());
-			if (equals) {
-				bindingsChanged = true;
-			} else {
-				newBindings[index++] = binding;
-			}
-		}
-
-		if (bindingsChanged) {
-			this.bindings = newBindings;
-			bindingCount = index;
-			clearCache();
-		}
-	}
-
-	/**
-	 * <p>
-	 * Attempts to remove deletion markers from the collection of bindings.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n)</code>, where <code>n</code> is
-	 * the number of bindings.
-	 * </p>
-	 * 
-	 * @param bindings
-	 *            The bindings from which the deleted items should be removed.
-	 *            This array should not be <code>null</code>, but may be
-	 *            empty.
-	 * @return The array of bindings with the deletions removed; never
-	 *         <code>null</code>, but may be empty. Contains only instances
-	 *         of <code>Binding</code>.
-	 */
-	private final Binding[] removeDeletions(final Binding[] bindings) {
-		final Map deletions = new HashMap();
-		final Binding[] bindingsCopy = new Binding[bindingCount];
-		System.arraycopy(bindings, 0, bindingsCopy, 0, bindingCount);
-		int deletedCount = 0;
-
-		// Extract the deletions.
-		for (int i = 0; i < bindingCount; i++) {
-			final Binding binding = bindingsCopy[i];
-			if ((binding.getParameterizedCommand() == null)
-					&& (localeMatches(binding)) && (platformMatches(binding))) {
-				final TriggerSequence sequence = binding.getTriggerSequence();
-				final Object currentValue = deletions.get(sequence);
-				if (currentValue instanceof Binding) {
-					final Collection collection = new ArrayList(2);
-					collection.add(currentValue);
-					collection.add(binding);
-					deletions.put(sequence, collection);
-				} else if (currentValue instanceof Collection) {
-					final Collection collection = (Collection) currentValue;
-					collection.add(binding);
-				} else {
-					deletions.put(sequence, binding);
-				}
-				bindingsCopy[i] = null;
-				deletedCount++;
-			}
-		}
-
-		if (DEBUG) {
-			Tracing.printTrace("BINDINGS", "There are " + deletions.size() //$NON-NLS-1$ //$NON-NLS-2$
-					+ " deletion markers"); //$NON-NLS-1$
-		}
-
-		// Remove the deleted items.
-		for (int i = 0; i < bindingCount; i++) {
-			final Binding binding = bindingsCopy[i];
-			if (binding != null) {
-				final Object deletion = deletions.get(binding
-						.getTriggerSequence());
-				if (deletion instanceof Binding) {
-					if (((Binding) deletion).deletes(binding)) {
-						bindingsCopy[i] = null;
-						deletedCount++;
-					}
-
-				} else if (deletion instanceof Collection) {
-					final Collection collection = (Collection) deletion;
-					final Iterator iterator = collection.iterator();
-					while (iterator.hasNext()) {
-						final Object deletionBinding = iterator.next();
-						if (deletionBinding instanceof Binding) {
-							if (((Binding) deletionBinding).deletes(binding)) {
-								bindingsCopy[i] = null;
-								deletedCount++;
-								break;
-							}
-						}
-					}
-
-				}
-			}
-		}
-
-		// Compact the array.
-		final Binding[] returnValue = new Binding[bindingCount - deletedCount];
-		int index = 0;
-		for (int i = 0; i < bindingCount; i++) {
-			final Binding binding = bindingsCopy[i];
-			if (binding != null) {
-				returnValue[index++] = binding;
-			}
-		}
-
-		return returnValue;
-	}
-
-	/**
-	 * <p>
-	 * Attempts to resolve the conflicts for the given bindings.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n)</code>, where <code>n</code> is
-	 * the number of bindings.
-	 * </p>
-	 * 
-	 * @param bindings
-	 *            The bindings which all match the same trigger sequence; must
-	 *            not be <code>null</code>, and should contain at least two
-	 *            items. This collection should only contain instances of
-	 *            <code>Binding</code> (i.e., no <code>null</code> values).
-	 * @param activeContextTree
-	 *            The tree of contexts to be used for all of the comparison. All
-	 *            of the keys should be active context identifiers (i.e., never
-	 *            <code>null</code>). The values will be their parents (i.e.,
-	 *            possibly <code>null</code>). Both keys and values are
-	 *            context identifiers (<code>String</code>). This map should
-	 *            never be empty, and must never be <code>null</code>.
-	 * @return The binding which best matches the current state. If there is a
-	 *         tie, then return <code>null</code>.
-	 */
-	private final Binding resolveConflicts(final Collection bindings,
-			final Map activeContextTree) {
-		/*
-		 * This flag is used to indicate when the bestMatch binding conflicts
-		 * with another binding. We keep the best match binding so that we know
-		 * if we find a better binding. However, if we don't find a better
-		 * binding, then we known to return null.
-		 */
-		boolean conflict = false;
-
-		final Iterator bindingItr = bindings.iterator();
-		Binding bestMatch = (Binding) bindingItr.next();
-
-		/*
-		 * Iterate over each binding and compare it with the best match. If a
-		 * better match is found, then replace the best match and set the
-		 * conflict flag to false. If a conflict is found, then leave the best
-		 * match and set the conflict flag. Otherwise, just continue.
-		 */
-		while (bindingItr.hasNext()) {
-			final Binding current = (Binding) bindingItr.next();
-
-			/*
-			 * SCHEME: Test whether the current is in a child scheme. Bindings
-			 * defined in a child scheme will always take priority over bindings
-			 * defined in a parent scheme.
-			 */
-			final String currentSchemeId = current.getSchemeId();
-			final String bestSchemeId = bestMatch.getSchemeId();
-			final int compareTo = compareSchemes(bestSchemeId, currentSchemeId);
-			if (compareTo > 0) {
-				bestMatch = current;
-				conflict = false;
-			}
-			if (compareTo != 0) {
-				continue;
-			}
-
-			/*
-			 * CONTEXTS: Check for context superiority. Bindings defined in a
-			 * child context will take priority over bindings defined in a
-			 * parent context -- assuming that the schemes lead to a conflict.
-			 */
-			final String currentContext = current.getContextId();
-			final String bestContext = bestMatch.getContextId();
-			if (!currentContext.equals(bestContext)) {
-				boolean goToNextBinding = false;
-
-				// Ascend the current's context tree.
-				String contextPointer = currentContext;
-				while (contextPointer != null) {
-					if (contextPointer.equals(bestContext)) {
-						// the current wins
-						bestMatch = current;
-						conflict = false;
-						goToNextBinding = true;
-						break;
-					}
-					contextPointer = (String) activeContextTree
-							.get(contextPointer);
-				}
-
-				// Ascend the best match's context tree.
-				contextPointer = bestContext;
-				while (contextPointer != null) {
-					if (contextPointer.equals(currentContext)) {
-						// the best wins
-						goToNextBinding = true;
-						break;
-					}
-					contextPointer = (String) activeContextTree
-							.get(contextPointer);
-				}
-
-				if (goToNextBinding) {
-					continue;
-				}
-			}
-
-			/*
-			 * TYPE: Test for type superiority.
-			 */
-			if (current.getType() > bestMatch.getType()) {
-				bestMatch = current;
-				conflict = false;
-				continue;
-			} else if (bestMatch.getType() > current.getType()) {
-				continue;
-			}
-
-			// We could not resolve the conflict between these two.
-			conflict = true;
-		}
-
-		// If the best match represents a conflict, then return null.
-		if (conflict) {
-			return null;
-		}
-
-		// Otherwise, we have a winner....
-		return bestMatch;
-	}
-
-	/**
-	 * <p>
-	 * Notifies this manager that a scheme has changed. This method is intended
-	 * for internal use only.
-	 * </p>
-	 * <p>
-	 * This method calls out to listeners, and so the time it takes to complete
-	 * is dependent on third-party code.
-	 * </p>
-	 * 
-	 * @param schemeEvent
-	 *            An event describing the change in the scheme.
-	 */
-	public final void schemeChanged(final SchemeEvent schemeEvent) {
-		if (schemeEvent.isDefinedChanged()) {
-			final Scheme scheme = schemeEvent.getScheme();
-			final boolean schemeIdAdded = scheme.isDefined();
-			boolean activeSchemeChanged = false;
-			if (schemeIdAdded) {
-				definedHandleObjects.add(scheme);
-			} else {
-				definedHandleObjects.remove(scheme);
-
-				if (activeScheme == scheme) {
-					activeScheme = null;
-					activeSchemeIds = null;
-					activeSchemeChanged = true;
-
-					// Clear the binding solution.
-					clearSolution();
-				}
-			}
-
-			if (isListenerAttached()) {
-				fireBindingManagerChanged(new BindingManagerEvent(this, false,
-						null, activeSchemeChanged, scheme, schemeIdAdded,
-						false, false));
-			}
-		}
-	}
-
-	/**
-	 * Sets the active bindings and the prefix table. This ensures that the two
-	 * values change at the same time, and that any listeners are notified
-	 * appropriately.
-	 * 
-	 * @param activeBindings
-	 *            This is a map of triggers ( <code>TriggerSequence</code>)
-	 *            to bindings (<code>Binding</code>). This value will only
-	 *            be <code>null</code> if the active bindings have not yet
-	 *            been computed. Otherwise, this value may be empty.
-	 * @param activeBindingsByCommandId
-	 *            This is a map of fully-parameterized commands (<code>ParameterizedCommand</code>)
-	 *            to triggers ( <code>TriggerSequence</code>). This value
-	 *            will only be <code>null</code> if the active bindings have
-	 *            not yet been computed. Otherwise, this value may be empty.
-	 * @param prefixTable
-	 *            A map of prefixes (<code>TriggerSequence</code>) to a map
-	 *            of available completions (possibly <code>null</code>, which
-	 *            means there is an exact match). The available completions is a
-	 *            map of trigger (<code>TriggerSequence</code>) to binding (<code>Binding</code>).
-	 *            This value may be <code>null</code> if there is no existing
-	 *            solution.
-	 */
-	private final void setActiveBindings(final Map activeBindings,
-			final Map activeBindingsByCommandId, final Map prefixTable,
-			final Map conflicts) {
-		this.activeBindings = activeBindings;
-		final Map previousBindingsByParameterizedCommand = this.activeBindingsByParameterizedCommand;
-		this.activeBindingsByParameterizedCommand = activeBindingsByCommandId;
-		this.prefixTable = prefixTable;
-		currentConflicts = conflicts;
-
-		fireBindingManagerChanged(new BindingManagerEvent(this, true,
-				previousBindingsByParameterizedCommand, false, null, false,
-				false, false));
-	}
-
-	/**
-	 * Provides the current conflicts in the bindings as a Map The key will
-	 * be {@link TriggerSequence} and the value will be the {@link Collection} of
-	 * {@link Binding}
-	 * 
-	 * @return Read-only {@link Map} of the current conflicts. If no conflicts,
-	 *         then return an empty map. Never <code>null</code>
-	 * @since 3.5
-	 */
-	public Map getCurrentConflicts() {
-		if (currentConflicts == null)
-			return Collections.EMPTY_MAP;
-		return Collections.unmodifiableMap(currentConflicts);
-	}
-	
-	/**
-	 * Provides the current conflicts in the keybindings for the given 
-	 * TriggerSequence as a {@link Collection} of {@link Binding}
-	 * 
-	 * @param sequence The sequence for which conflict info is required
-	 * 
-	 * @return Collection of KeyBinding. If no conflicts,
-	 *         then returns a <code>null</code>
-	 * @since 3.5
-	 */
-	public Collection getConflictsFor(TriggerSequence sequence) {
-		return (Collection) getCurrentConflicts().get(sequence);
-	}
-
-
-	/**
-	 * <p>
-	 * Selects one of the schemes as the active scheme. This scheme must be
-	 * defined.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n)</code>, where <code>n</code> is
-	 * the height of the context tree.
-	 * </p>
-	 * 
-	 * @param scheme
-	 *            The scheme to become active; must not be <code>null</code>.
-	 * @throws NotDefinedException
-	 *             If the given scheme is currently undefined.
-	 */
-	public final void setActiveScheme(final Scheme scheme)
-			throws NotDefinedException {
-		if (scheme == null) {
-			throw new NullPointerException("Cannot activate a null scheme"); //$NON-NLS-1$
-		}
-
-		if ((scheme == null) || (!scheme.isDefined())) {
-			throw new NotDefinedException(
-					"Cannot activate an undefined scheme. " //$NON-NLS-1$
-							+ scheme.getId());
-		}
-
-		if (Util.equals(activeScheme, scheme)) {
-			return;
-		}
-
-		activeScheme = scheme;
-		activeSchemeIds = getSchemeIds(activeScheme.getId());
-		clearSolution();
-		fireBindingManagerChanged(new BindingManagerEvent(this, false, null,
-				true, null, false, false, false));
-	}
-
-	/**
-	 * <p>
-	 * Changes the set of bindings for this binding manager. Changing the set of
-	 * bindings all at once ensures that: (1) duplicates are removed; and (2)
-	 * avoids unnecessary intermediate computations. This method clears the
-	 * existing bindings, but does not trigger a recomputation (other method
-	 * calls are required to do that).
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(n)</code>, where <code>n</code> is
-	 * the number of bindings.
-	 * </p>
-	 * 
-	 * @param bindings
-	 *            The new array of bindings; may be <code>null</code>. This
-	 *            set is copied into a local data structure.
-	 */
-	public final void setBindings(final Binding[] bindings) {
-		if (Arrays.equals(this.bindings, bindings)) {
-			return; // nothing has changed
-		}
-
-		if ((bindings == null) || (bindings.length == 0)) {
-			this.bindings = null;
-			bindingCount = 0;
-		} else {
-			final int bindingsLength = bindings.length;
-			this.bindings = new Binding[bindingsLength];
-			System.arraycopy(bindings, 0, this.bindings, 0, bindingsLength);
-			bindingCount = bindingsLength;
-		}
-		clearCache();
-	}
-
-	/**
-	 * <p>
-	 * Changes the locale for this binding manager. The locale can be used to
-	 * provide locale-specific bindings. If the locale is different than the
-	 * current locale, this will force a recomputation of the bindings. The
-	 * locale is in the same format as
-	 * <code>Locale.getDefault().toString()</code>.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>.
-	 * </p>
-	 * 
-	 * @param locale
-	 *            The new locale; must not be <code>null</code>.
-	 * @see Locale#getDefault()
-	 */
-	public final void setLocale(final String locale) {
-		if (locale == null) {
-			throw new NullPointerException("The locale cannot be null"); //$NON-NLS-1$
-		}
-
-		if (!Util.equals(this.locale, locale)) {
-			this.locale = locale;
-			this.locales = expand(locale, LOCALE_SEPARATOR);
-			clearSolution();
-			fireBindingManagerChanged(new BindingManagerEvent(this, false,
-					null, false, null, false, true, false));
-		}
-	}
-
-	/**
-	 * <p>
-	 * Changes the platform for this binding manager. The platform can be used
-	 * to provide platform-specific bindings. If the platform is different than
-	 * the current platform, then this will force a recomputation of the
-	 * bindings. The locale is in the same format as
-	 * <code>SWT.getPlatform()</code>.
-	 * </p>
-	 * <p>
-	 * This method completes in <code>O(1)</code>.
-	 * </p>
-	 * 
-	 * @param platform
-	 *            The new platform; must not be <code>null</code>.
-	 * @see org.eclipse.swt.SWT#getPlatform()
-	 * @see Util#getWS()
-	 */
-	public final void setPlatform(final String platform) {
-		if (platform == null) {
-			throw new NullPointerException("The platform cannot be null"); //$NON-NLS-1$
-		}
-
-		if (!Util.equals(this.platform, platform)) {
-			this.platform = platform;
-			this.platforms = expand(platform, Util.ZERO_LENGTH_STRING);
-			clearSolution();
-			fireBindingManagerChanged(new BindingManagerEvent(this, false,
-					null, false, null, false, false, true));
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/BindingManagerEvent.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/BindingManagerEvent.java
deleted file mode 100644
index 7e4815b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/BindingManagerEvent.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings;
-
-import java.util.Collection;
-import java.util.Map;
-
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.AbstractBitSetEvent;
-import org.eclipse.jface.util.Util;
-
-/**
- * An instance of this class describes changes to an instance of
- * <code>BindingManager</code>.
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.1
- * @see IBindingManagerListener#bindingManagerChanged(BindingManagerEvent)
- */
-public final class BindingManagerEvent extends AbstractBitSetEvent {
-
-	/**
-	 * The bit used to represent whether the map of active bindings has changed.
-	 */
-	private static final int CHANGED_ACTIVE_BINDINGS = 1;
-
-	/**
-	 * The bit used to represent whether the active scheme has changed.
-	 */
-	private static final int CHANGED_ACTIVE_SCHEME = 1 << 1;
-
-	/**
-	 * The bit used to represent whether the active locale has changed.
-	 */
-	private static final int CHANGED_LOCALE = 1 << 2;
-
-	/**
-	 * The bit used to represent whether the active platform has changed.
-	 */
-	private static final int CHANGED_PLATFORM = 1 << 3;
-
-	/**
-	 * The bit used to represent whether the scheme's defined state has changed.
-	 */
-	private static final int CHANGED_SCHEME_DEFINED = 1 << 4;
-
-	/**
-	 * The binding manager that has changed; this value is never
-	 * <code>null</code>.
-	 */
-	private final BindingManager manager;
-
-	/**
-	 * The map of triggers (<code>Collection</code> of
-	 * <code>TriggerSequence</code>) by parameterized command (<code>ParameterizedCommand</code>)
-	 * before the change occurred. This map may be empty and it may be
-	 * <code>null</code>.
-	 */
-	private final Map previousTriggersByParameterizedCommand;
-
-	/**
-	 * The scheme that became defined or undefined. This value may be
-	 * <code>null</code> if no scheme changed its defined state.
-	 */
-	private final Scheme scheme;
-
-	/**
-	 * Creates a new instance of this class.
-	 * 
-	 * @param manager
-	 *            the instance of the binding manager that changed; must not be
-	 *            <code>null</code>.
-	 * @param activeBindingsChanged
-	 *            Whether the active bindings have changed.
-	 * @param previousTriggersByParameterizedCommand
-	 *            The map of triggers (<code>TriggerSequence</code>) by
-	 *            fully-parameterized command (<code>ParameterizedCommand</code>)
-	 *            before the change occured. This map may be <code>null</code>
-	 *            or empty.
-	 * @param activeSchemeChanged
-	 *            true, iff the active scheme changed.
-	 * @param scheme
-	 *            The scheme that became defined or undefined; <code>null</code>
-	 *            if no scheme changed state.
-	 * @param schemeDefined
-	 *            <code>true</code> if the given scheme became defined;
-	 *            <code>false</code> otherwise.
-	 * @param localeChanged
-	 *            <code>true</code> iff the active locale changed
-	 * @param platformChanged
-	 *            <code>true</code> iff the active platform changed
-	 */
-	public BindingManagerEvent(final BindingManager manager,
-			final boolean activeBindingsChanged,
-			final Map previousTriggersByParameterizedCommand,
-			final boolean activeSchemeChanged, final Scheme scheme,
-			final boolean schemeDefined, final boolean localeChanged,
-			final boolean platformChanged) {
-		if (manager == null) {
-			throw new NullPointerException(
-					"A binding manager event needs a binding manager"); //$NON-NLS-1$
-		}
-		this.manager = manager;
-
-		if (schemeDefined && (scheme == null)) {
-			throw new NullPointerException(
-					"If a scheme changed defined state, then there should be a scheme identifier"); //$NON-NLS-1$
-		}
-		this.scheme = scheme;
-
-		this.previousTriggersByParameterizedCommand = previousTriggersByParameterizedCommand;
-
-		if (activeBindingsChanged) {
-			changedValues |= CHANGED_ACTIVE_BINDINGS;
-		}
-		if (activeSchemeChanged) {
-			changedValues |= CHANGED_ACTIVE_SCHEME;
-		}
-		if (localeChanged) {
-			changedValues |= CHANGED_LOCALE;
-		}
-		if (platformChanged) {
-			changedValues |= CHANGED_PLATFORM;
-		}
-		if (schemeDefined) {
-			changedValues |= CHANGED_SCHEME_DEFINED;
-		}
-	}
-
-	/**
-	 * Returns the instance of the manager that changed.
-	 * 
-	 * @return the instance of the manager that changed. Guaranteed not to be
-	 *         <code>null</code>.
-	 */
-	public final BindingManager getManager() {
-		return manager;
-	}
-
-	/**
-	 * Returns the scheme that changed.
-	 * 
-	 * @return The changed scheme
-	 */
-	public final Scheme getScheme() {
-		return scheme;
-	}
-
-	/**
-	 * Returns whether the active bindings have changed.
-	 * 
-	 * @return <code>true</code> if the active bindings have changed;
-	 *         <code>false</code> otherwise.
-	 */
-	public final boolean isActiveBindingsChanged() {
-		return ((changedValues & CHANGED_ACTIVE_BINDINGS) != 0);
-	}
-
-	/**
-	 * Computes whether the active bindings have changed for a given command
-	 * identifier.
-	 * 
-	 * @param parameterizedCommand
-	 *            The fully-parameterized command whose bindings might have
-	 *            changed; must not be <code>null</code>.
-	 * @return <code>true</code> if the active bindings have changed for the
-	 *         given command identifier; <code>false</code> otherwise.
-	 */
-	public final boolean isActiveBindingsChangedFor(
-			final ParameterizedCommand parameterizedCommand) {
-		final TriggerSequence[] currentBindings = manager
-				.getActiveBindingsFor(parameterizedCommand);
-		final TriggerSequence[] previousBindings;
-		if (previousTriggersByParameterizedCommand != null) {
-			final Collection previousBindingCollection = (Collection) previousTriggersByParameterizedCommand
-					.get(parameterizedCommand);
-			if (previousBindingCollection == null) {
-				previousBindings = null;
-			} else {
-				previousBindings = (TriggerSequence[]) previousBindingCollection
-						.toArray(new TriggerSequence[previousBindingCollection
-								.size()]);
-			}
-		} else {
-			previousBindings = null;
-		}
-
-		return !Util.equals(currentBindings, previousBindings);
-	}
-
-	/**
-	 * Returns whether or not the active scheme changed.
-	 * 
-	 * @return true, iff the active scheme property changed.
-	 */
-	public final boolean isActiveSchemeChanged() {
-		return ((changedValues & CHANGED_ACTIVE_SCHEME) != 0);
-	}
-
-	/**
-	 * Returns whether the locale has changed
-	 * 
-	 * @return <code>true</code> if the locale changed; <code>false</code>
-	 *         otherwise.
-	 */
-	public boolean isLocaleChanged() {
-		return ((changedValues & CHANGED_LOCALE) != 0);
-	}
-
-	/**
-	 * Returns whether the platform has changed
-	 * 
-	 * @return <code>true</code> if the platform changed; <code>false</code>
-	 *         otherwise.
-	 */
-	public boolean isPlatformChanged() {
-		return ((changedValues & CHANGED_PLATFORM) != 0);
-	}
-
-	/**
-	 * Returns whether the list of defined scheme identifiers has changed.
-	 * 
-	 * @return <code>true</code> if the list of scheme identifiers has
-	 *         changed; <code>false</code> otherwise.
-	 */
-	public final boolean isSchemeChanged() {
-		return (scheme != null);
-	}
-
-	/**
-	 * Returns whether or not the scheme became defined
-	 * 
-	 * @return <code>true</code> if the scheme became defined.
-	 */
-	public final boolean isSchemeDefined() {
-		return (((changedValues & CHANGED_SCHEME_DEFINED) != 0) && (scheme != null));
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/CachedBindingSet.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/CachedBindingSet.java
deleted file mode 100644
index 1da7b67..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/CachedBindingSet.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.bindings;
-
-import java.util.Map;
-
-import org.eclipse.jface.util.Util;
-
-/**
- * <p>
- * A resolution of bindings for a given state. To see if we already have a
- * cached binding set, just create one of these binding sets and then look it up
- * in a map. If it is not already there, then add it and set the cached binding
- * resolution.
- * </p>
- * 
- * @since 3.1
- */
-final class CachedBindingSet {
-
-	/**
-	 * A factor for computing the hash code for all cached binding sets.
-	 */
-	private final static int HASH_FACTOR = 89;
-
-	/**
-	 * The seed for the hash code for all cached binding sets.
-	 */
-	private final static int HASH_INITIAL = CachedBindingSet.class.getName()
-			.hashCode();
-
-	/**
-	 * <p>
-	 * A representation of the tree of active contexts at the time this cached
-	 * binding set was computed. It is a map of context id (<code>String</code>)
-	 * to context id (<code>String</code>). Each key represents one of the
-	 * active contexts or one of its ancestors, while each value represents its
-	 * parent. This is a way of perserving information about what the hierarchy
-	 * looked like.
-	 * </p>
-	 * <p>
-	 * This value will be <code>null</code> if the contexts were disregarded
-	 * in the computation. It may also be empty. All of the keys are guaranteed
-	 * to be non- <code>null</code>, but the values can be <code>null</code>
-	 * (i.e., no parent).
-	 * </p>
-	 */
-	private final Map activeContextTree;
-
-	/**
-	 * The map representing the resolved state of the bindings. This is a map of
-	 * a trigger (<code>TriggerSequence</code>) to binding (<code>Binding</code>).
-	 * This value may be <code>null</code> if it has not yet been initialized.
-	 */
-	private Map bindingsByTrigger = null;
-
-	/**
-	 * A map of triggers to collections of bindings. If this binding set
-	 * contains conflicts, they are logged here.
-	 * 
-	 * @since 3.3
-	 */
-	private Map conflictsByTrigger = null;
-
-	/**
-	 * The hash code for this object. This value is computed lazily, and marked
-	 * as invalid when one of the values on which it is based changes.
-	 */
-	private transient int hashCode;
-
-	/**
-	 * Whether <code>hashCode</code> still contains a valid value.
-	 */
-	private transient boolean hashCodeComputed = false;
-
-	/**
-	 * <p>
-	 * The list of locales that were active at the time this binding set was
-	 * computed. This list starts with the most specific representation of the
-	 * locale, and moves to more general representations. For example, this
-	 * array might look like ["en_US", "en", "", null].
-	 * </p>
-	 * <p>
-	 * This value will never be <code>null</code>, and it will never be
-	 * empty. It must contain at least one element, but its elements can be
-	 * <code>null</code>.
-	 * </p>
-	 */
-	private final String[] locales;
-
-	/**
-	 * <p>
-	 * The list of platforms that were active at the time this binding set was
-	 * computed. This list starts with the most specific representation of the
-	 * platform, and moves to more general representations. For example, this
-	 * array might look like ["gtk", "", null].
-	 * </p>
-	 * <p>
-	 * This value will never be <code>null</code>, and it will never be
-	 * empty. It must contain at least one element, but its elements can be
-	 * <code>null</code>.
-	 * </p>
-	 */
-	private final String[] platforms;
-
-	/**
-	 * A map of prefixes (<code>TriggerSequence</code>) to a map of
-	 * available completions (possibly <code>null</code>, which means there
-	 * is an exact match). The available completions is a map of trigger (<code>TriggerSequence</code>)
-	 * to command identifier (<code>String</code>). This value is
-	 * <code>null</code> if it has not yet been initialized.
-	 */
-	private Map prefixTable = null;
-
-	/**
-	 * <p>
-	 * The list of schemes that were active at the time this binding set was
-	 * computed. This list starts with the active scheme, and then continues
-	 * with all of its ancestors -- in order. For example, this might look like
-	 * ["emacs", "default"].
-	 * </p>
-	 * <p>
-	 * This value will never be <code>null</code>, and it will never be
-	 * empty. It must contain at least one element. Its elements cannot be
-	 * <code>null</code>.
-	 * </p>
-	 */
-	private final String[] schemeIds;
-
-	/**
-	 * The map representing the resolved state of the bindings. This is a map of
-	 * a command id (<code>String</code>) to triggers (<code>Collection</code>
-	 * of <code>TriggerSequence</code>). This value may be <code>null</code>
-	 * if it has not yet been initialized.
-	 */
-	private Map triggersByCommandId = null;
-
-	/**
-	 * Constructs a new instance of <code>CachedBindingSet</code>.
-	 * 
-	 * @param activeContextTree
-	 *            The set of context identifiers that were active when this
-	 *            binding set was calculated; may be empty. If it is
-	 *            <code>null</code>, then the contexts were disregarded in
-	 *            the computation. This is a map of context id (
-	 *            <code>String</code>) to parent context id (
-	 *            <code>String</code>). This is a way of caching the look of
-	 *            the context tree at the time the binding set was computed.
-	 * @param locales
-	 *            The locales that were active when this binding set was
-	 *            calculated. The first element is the currently active locale,
-	 *            and it is followed by increasingly more general locales. This
-	 *            must not be <code>null</code> and must contain at least one
-	 *            element. The elements can be <code>null</code>, though.
-	 * @param platforms
-	 *            The platform that were active when this binding set was
-	 *            calculated. The first element is the currently active
-	 *            platform, and it is followed by increasingly more general
-	 *            platforms. This must not be <code>null</code> and must
-	 *            contain at least one element. The elements can be
-	 *            <code>null</code>, though.
-	 * @param schemeIds
-	 *            The scheme that was active when this binding set was
-	 *            calculated, followed by its ancestors. This may be
-	 *            <code>null</code or empty. The
-	 *            elements cannot be <code>null</code>.
-	 */
-	CachedBindingSet(final Map activeContextTree, final String[] locales,
-			final String[] platforms, final String[] schemeIds) {
-		if (locales == null) {
-			throw new NullPointerException("The locales cannot be null."); //$NON-NLS-1$
-		}
-
-		if (locales.length == 0) {
-			throw new NullPointerException("The locales cannot be empty."); //$NON-NLS-1$
-		}
-
-		if (platforms == null) {
-			throw new NullPointerException("The platforms cannot be null."); //$NON-NLS-1$
-		}
-
-		if (platforms.length == 0) {
-			throw new NullPointerException("The platforms cannot be empty."); //$NON-NLS-1$
-		}
-
-		this.activeContextTree = activeContextTree;
-		this.locales = locales;
-		this.platforms = platforms;
-		this.schemeIds = schemeIds;
-	}
-
-	/**
-	 * Compares this binding set with another object. The objects will be equal
-	 * if they are both instance of <code>CachedBindingSet</code> and have
-	 * equivalent values for all of their properties.
-	 * 
-	 * @param object
-	 *            The object with which to compare; may be <code>null</code>.
-	 * @return <code>true</code> if they are both instances of
-	 *         <code>CachedBindingSet</code> and have the same values for all
-	 *         of their properties; <code>false</code> otherwise.
-	 */
-	public final boolean equals(final Object object) {
-		if (!(object instanceof CachedBindingSet)) {
-			return false;
-		}
-
-		final CachedBindingSet other = (CachedBindingSet) object;
-
-		if (!Util.equals(activeContextTree, other.activeContextTree)) {
-			return false;
-		}
-		if (!Util.equals(locales, other.locales)) {
-			return false;
-		}
-		if (!Util.equals(platforms, other.platforms)) {
-			return false;
-		}
-		return Util.equals(schemeIds, other.schemeIds);
-	}
-
-	/**
-	 * Returns the map of command identifiers indexed by trigger sequence.
-	 * 
-	 * @return A map of triggers (<code>TriggerSequence</code>) to bindings (<code>Binding</code>).
-	 *         This value may be <code>null</code> if this was not yet
-	 *         initialized.
-	 */
-	final Map getBindingsByTrigger() {
-		return bindingsByTrigger;
-	}
-
-	/**
-	 * Returns a map of conflicts for this set of contexts.
-	 * 
-	 * @return A map of trigger to a collection of Bindings. May be
-	 *         <code>null</code>.
-	 * @since 3.3
-	 */
-	final Map getConflictsByTrigger() {
-		return conflictsByTrigger;
-	}
-
-	/**
-	 * Returns the map of prefixes to a map of trigger sequence to command
-	 * identifiers.
-	 * 
-	 * @return A map of prefixes (<code>TriggerSequence</code>) to a map of
-	 *         available completions (possibly <code>null</code>, which means
-	 *         there is an exact match). The available completions is a map of
-	 *         trigger (<code>TriggerSequence</code>) to command identifier (<code>String</code>).
-	 *         This value may be <code>null</code> if it has not yet been
-	 *         initialized.
-	 */
-	final Map getPrefixTable() {
-		return prefixTable;
-	}
-
-	/**
-	 * Returns the map of triggers indexed by command identifiers.
-	 * 
-	 * @return A map of command identifiers (<code>String</code>) to
-	 *         triggers (<code>Collection</code> of
-	 *         <code>TriggerSequence</code>). This value may be
-	 *         <code>null</code> if this was not yet initialized.
-	 */
-	final Map getTriggersByCommandId() {
-		return triggersByCommandId;
-	}
-
-	/**
-	 * Computes the hash code for this cached binding set. The hash code is
-	 * based only on the immutable values. This allows the set to be created and
-	 * checked for in a hashed collection <em>before</em> doing any
-	 * computation.
-	 * 
-	 * @return The hash code for this cached binding set.
-	 */
-	public final int hashCode() {
-		if (!hashCodeComputed) {
-			hashCode = HASH_INITIAL;
-			hashCode = hashCode * HASH_FACTOR
-					+ Util.hashCode(activeContextTree);
-			hashCode = hashCode * HASH_FACTOR + Util.hashCode(locales);
-			hashCode = hashCode * HASH_FACTOR + Util.hashCode(platforms);
-			hashCode = hashCode * HASH_FACTOR + Util.hashCode(schemeIds);
-			hashCodeComputed = true;
-		}
-
-		return hashCode;
-	}
-
-	/**
-	 * Sets the map of command identifiers indexed by trigger.
-	 * 
-	 * @param commandIdsByTrigger
-	 *            The map to set; must not be <code>null</code>. This is a
-	 *            map of triggers (<code>TriggerSequence</code>) to binding (<code>Binding</code>).
-	 */
-	final void setBindingsByTrigger(final Map commandIdsByTrigger) {
-		if (commandIdsByTrigger == null) {
-			throw new NullPointerException(
-					"Cannot set a null binding resolution"); //$NON-NLS-1$
-		}
-
-		this.bindingsByTrigger = commandIdsByTrigger;
-	}
-
-	/**
-	 * Sets the map of conflicting bindings by trigger.
-	 * 
-	 * @param conflicts
-	 *            The map to set; must not be <code>null</code>.
-	 * @since 3.3
-	 */
-	final void setConflictsByTrigger(final Map conflicts) {
-		if (conflicts == null) {
-			throw new NullPointerException(
-					"Cannot set a null binding conflicts"); //$NON-NLS-1$
-		}
-		conflictsByTrigger = conflicts;
-	}
-
-	/**
-	 * Sets the map of prefixes to a map of trigger sequence to command
-	 * identifiers.
-	 * 
-	 * @param prefixTable
-	 *            A map of prefixes (<code>TriggerSequence</code>) to a map
-	 *            of available completions (possibly <code>null</code>, which
-	 *            means there is an exact match). The available completions is a
-	 *            map of trigger (<code>TriggerSequence</code>) to command
-	 *            identifier (<code>String</code>). Must not be
-	 *            <code>null</code>.
-	 */
-	final void setPrefixTable(final Map prefixTable) {
-		if (prefixTable == null) {
-			throw new NullPointerException("Cannot set a null prefix table"); //$NON-NLS-1$
-		}
-
-		this.prefixTable = prefixTable;
-	}
-
-	/**
-	 * Sets the map of triggers indexed by command identifiers.
-	 * 
-	 * @param triggersByCommandId
-	 *            The map to set; must not be <code>null</code>. This is a
-	 *            map of command identifiers (<code>String</code>) to
-	 *            triggers (<code>Collection</code> of
-	 *            <code>TriggerSequence</code>).
-	 */
-	final void setTriggersByCommandId(final Map triggersByCommandId) {
-		if (triggersByCommandId == null) {
-			throw new NullPointerException(
-					"Cannot set a null binding resolution"); //$NON-NLS-1$
-		}
-
-		this.triggersByCommandId = triggersByCommandId;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/IBindingManagerListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/IBindingManagerListener.java
deleted file mode 100644
index 3263fa5..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/IBindingManagerListener.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings;
-
-/**
- * <p>
- * An instance of <code>BindingManagerListener</code> can be used by clients to
- * receive notification of changes to an instance of
- * <code>BindingManager</code>. 
- * </p>
- * <p>
- * This interface may be implemented by clients.
- * </p>
- * 
- * @since 3.1
- * @see BindingManager#addBindingManagerListener(IBindingManagerListener)
- * @see org.eclipse.jface.bindings.BindingManager#addBindingManagerListener(IBindingManagerListener)
- * @see BindingManagerEvent
- */
-public interface IBindingManagerListener {
-
-	/**
-	 * Notifies that attributes inside an instance of <code>BindingManager</code> have changed. 
-	 * Specific details are described in the <code>BindingManagerEvent</code>.  Changes in the
-	 * binding manager can cause the set of defined or active schemes or bindings to change.
-	 * 
-	 * @param event
-	 *            the binding manager event. Guaranteed not to be <code>null</code>.
-	 */
-	void bindingManagerChanged(BindingManagerEvent event);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/ISchemeListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/ISchemeListener.java
deleted file mode 100644
index cb889e9..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/ISchemeListener.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings;
-
-/**
- * <p>
- * An instance of <code>ISchemeListener</code> can be used by clients to
- * receive notification of changes to one or more instances of
- * <code>IScheme</code>.
- * </p>
- * <p>
- * This interface may be implemented by clients.
- * </p>
- * 
- * @since 3.1
- * @see Scheme#addSchemeListener(ISchemeListener)
- * @see Scheme#removeSchemeListener(ISchemeListener)
- * @see SchemeEvent
- */
-public interface ISchemeListener {
-
-    /**
-     * Notifies that one or more attributes of an instance of
-     * <code>IScheme</code> have changed. Specific details are described in
-     * the <code>SchemeEvent</code>.
-     * 
-     * @param schemeEvent
-     *            the scheme event. Guaranteed not to be <code>null</code>.
-     */
-    void schemeChanged(SchemeEvent schemeEvent);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/Scheme.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/Scheme.java
deleted file mode 100644
index d0c77c4..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/Scheme.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.commands.common.NamedHandleObject;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.jface.util.Util;
-
-/**
- * <p>
- * An instance of <code>IScheme</code> is a handle representing a binding
- * scheme as defined by the extension point <code>org.eclipse.ui.bindings</code>.
- * The identifier of the handle is the identifier of the scheme being represented.
- * </p>
- * <p>
- * An instance of <code>IScheme</code> can be obtained from an instance of
- * <code>ICommandManager</code> for any identifier, whether or not a scheme
- * with that identifier is defined in the plugin registry.
- * </p>
- * <p>
- * The handle-based nature of this API allows it to work well with runtime
- * plugin activation and deactivation. If a scheme is defined, that means that
- * its corresponding plug-in is active. If the plug-in is then deactivated, the
- * scheme will still exist but it will be undefined. An attempt to use an
- * undefined scheme will result in a <code>NotDefinedException</code>
- * being thrown.
- * </p>
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.1
- * @see ISchemeListener
- * @see org.eclipse.core.commands.CommandManager
- */
-public final class Scheme extends NamedHandleObject implements Comparable {
-
-    /**
-     * The collection of all objects listening to changes on this scheme. This
-     * value is <code>null</code> if there are no listeners.
-     */
-    private Set listeners = null;
-
-    /**
-     * The parent identifier for this scheme. This is the identifier of the
-     * scheme from which this scheme inherits some of its bindings. This value
-     * can be <code>null</code> if the scheme has no parent.
-     */
-    private String parentId = null;
-
-    /**
-     * Constructs a new instance of <code>Scheme</code> with an identifier.
-     * 
-     * @param id
-     *            The identifier to create; must not be <code>null</code>.
-     */
-    Scheme(final String id) {
-        super(id);
-    }
-
-    /**
-     * Registers an instance of <code>ISchemeListener</code> to listen for
-     * changes to attributes of this instance.
-     * 
-     * @param schemeListener
-     *            the instance of <code>ISchemeListener</code> to register.
-     *            Must not be <code>null</code>. If an attempt is made to
-     *            register an instance of <code>ISchemeListener</code> which
-     *            is already registered with this instance, no operation is
-     *            performed.
-     */
-    public final void addSchemeListener(final ISchemeListener schemeListener) {
-        if (schemeListener == null) {
-            throw new NullPointerException("Can't add a null scheme listener."); //$NON-NLS-1$
-        }
-
-        if (listeners == null) {
-            listeners = new HashSet();
-        }
-
-        listeners.add(schemeListener);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see java.lang.Comparable#compareTo(java.lang.Object)
-     */
-    public final int compareTo(final Object object) {
-        final Scheme scheme = (Scheme) object;
-        int compareTo = Util.compare(this.id, scheme.id);
-        if (compareTo == 0) {
-            compareTo = Util.compare(this.name, scheme.name);
-            if (compareTo == 0) {
-                compareTo = Util.compare(this.parentId, scheme.parentId);
-                if (compareTo == 0) {
-                    compareTo = Util.compare(this.description,
-                            scheme.description);
-                    if (compareTo == 0) {
-                        compareTo = Util.compare(this.defined, scheme.defined);
-                    }
-                }
-            }
-        }
-
-        return compareTo;
-    }
-
-    /**
-     * <p>
-     * Defines this scheme by giving it a name, and possibly a description and a
-     * parent identifier as well. The defined property for the scheme automatically 
-     * becomes <code>true</code>.
-     * </p>
-     * <p>
-     * Notification is sent to all listeners that something has changed.
-     * </p>
-     * 
-     * @param name
-     *            The name of this scheme; must not be <code>null</code>.
-     * @param description
-     *            The description for this scheme; may be <code>null</code>.
-     * @param parentId
-     *            The parent identifier for this scheme; may be
-     *            <code>null</code>.
-     */
-    public final void define(final String name, final String description,
-            final String parentId) {
-        if (name == null) {
-            throw new NullPointerException(
-                    "The name of a scheme cannot be null"); //$NON-NLS-1$
-        }
-
-        final boolean definedChanged = !this.defined;
-        this.defined = true;
-
-        final boolean nameChanged = !Util.equals(this.name, name);
-        this.name = name;
-
-        final boolean descriptionChanged = !Util.equals(this.description,
-                description);
-        this.description = description;
-
-        final boolean parentIdChanged = !Util.equals(this.parentId, parentId);
-        this.parentId = parentId;
-
-        fireSchemeChanged(new SchemeEvent(this, definedChanged, nameChanged,
-                descriptionChanged, parentIdChanged));
-    }
-
-    /**
-     * Notifies all listeners that this scheme has changed. This sends the given
-     * event to all of the listeners, if any.
-     * 
-     * @param event
-     *            The event to send to the listeners; must not be
-     *            <code>null</code>.
-     */
-    private final void fireSchemeChanged(final SchemeEvent event) {
-        if (event == null) {
-            throw new NullPointerException(
-                    "Cannot send a null event to listeners."); //$NON-NLS-1$
-        }
-
-        if (listeners == null) {
-            return;
-        }
-
-        final Iterator listenerItr = listeners.iterator();
-        while (listenerItr.hasNext()) {
-            final ISchemeListener listener = (ISchemeListener) listenerItr
-                    .next();
-            listener.schemeChanged(event);
-        }
-    }
-
-    /**
-     * <p>
-     * Returns the identifier of the parent of the scheme represented by this
-     * handle.
-     * </p>
-     * <p>
-     * Notification is sent to all registered listeners if this attribute
-     * changes.
-     * </p>
-     * 
-     * @return the identifier of the parent of the scheme represented by this
-     *         handle. May be <code>null</code>.
-     * @throws NotDefinedException
-     *             if the scheme represented by this handle is not defined.
-     */
-    public final String getParentId() throws NotDefinedException {
-        if (!defined) {
-            throw new NotDefinedException(
-                    "Cannot get the parent identifier from an undefined scheme. "  //$NON-NLS-1$
-            		+ id);
-        }
-
-        return parentId;
-    }
-
-    /**
-     * Unregisters an instance of <code>ISchemeListener</code> listening for
-     * changes to attributes of this instance.
-     * 
-     * @param schemeListener
-     *            the instance of <code>ISchemeListener</code> to unregister.
-     *            Must not be <code>null</code>. If an attempt is made to
-     *            unregister an instance of <code>ISchemeListener</code> which
-     *            is not already registered with this instance, no operation is
-     *            performed.
-     */
-    public final void removeSchemeListener(final ISchemeListener schemeListener) {
-        if (schemeListener == null) {
-            throw new NullPointerException("Cannot remove a null listener."); //$NON-NLS-1$
-        }
-
-        if (listeners == null) {
-            return;
-        }
-
-        listeners.remove(schemeListener);
-
-        if (listeners.isEmpty()) {
-            listeners = null;
-        }
-    }
-
-    /**
-     * The string representation of this command -- for debugging purposes only.
-     * This string should not be shown to an end user.
-     * 
-     * @return The string representation; never <code>null</code>.
-     */
-    public final String toString() {
-        if (string == null) {
-            final StringBuffer stringBuffer = new StringBuffer();
-            stringBuffer.append("Scheme("); //$NON-NLS-1$
-            stringBuffer.append(id);
-            stringBuffer.append(',');
-            stringBuffer.append(name);
-            stringBuffer.append(',');
-            stringBuffer.append(description);
-            stringBuffer.append(',');
-            stringBuffer.append(parentId);
-            stringBuffer.append(',');
-            stringBuffer.append(defined);
-            stringBuffer.append(')');
-            string = stringBuffer.toString();
-        }
-        return string;
-    }
-
-    /**
-     * Makes this scheme become undefined. This has the side effect of changing
-     * the name, description and parent identifier to <code>null</code>.
-     * Notification is sent to all listeners.
-     */
-    public final void undefine() {
-        string = null;
-
-        final boolean definedChanged = defined;
-        defined = false;
-
-        final boolean nameChanged = name != null;
-        name = null;
-
-        final boolean descriptionChanged = description != null;
-        description = null;
-
-        final boolean parentIdChanged = parentId != null;
-        parentId = null;
-
-        fireSchemeChanged(new SchemeEvent(this, definedChanged, nameChanged,
-                descriptionChanged, parentIdChanged));
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/SchemeEvent.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/SchemeEvent.java
deleted file mode 100644
index d1fdf78..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/SchemeEvent.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings;
-
-import org.eclipse.core.commands.common.AbstractNamedHandleEvent;
-
-/**
- * An instance of this class describes changes to an instance of
- * <code>IScheme</code>.
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.1
- * @see ISchemeListener#schemeChanged(SchemeEvent)
- */
-public final class SchemeEvent extends AbstractNamedHandleEvent {
-
-	/**
-	 * The bit used to represent whether the scheme has changed its parent.
-	 */
-	private static final int CHANGED_PARENT_ID = LAST_USED_BIT << 1;
-
-	/**
-	 * The scheme that has changed; this value is never <code>null</code>.
-	 */
-	private final Scheme scheme;
-
-	/**
-	 * Creates a new instance of this class.
-	 * 
-	 * @param scheme
-	 *            the instance of the interface that changed; must not be
-	 *            <code>null</code>.
-	 * @param definedChanged
-	 *            true, iff the defined property changed.
-	 * @param nameChanged
-	 *            true, iff the name property changed.
-	 * @param descriptionChanged
-	 *            <code>true</code> if the description property changed;
-	 *            <code>false</code> otherwise.
-	 * @param parentIdChanged
-	 *            true, iff the parentId property changed.
-	 */
-	public SchemeEvent(Scheme scheme, boolean definedChanged,
-			boolean nameChanged, boolean descriptionChanged,
-			boolean parentIdChanged) {
-		super(definedChanged, descriptionChanged, nameChanged);
-
-		if (scheme == null) {
-			throw new NullPointerException();
-		}
-		this.scheme = scheme;
-
-		if (parentIdChanged) {
-			changedValues |= CHANGED_PARENT_ID;
-		}
-	}
-
-	/**
-	 * Returns the instance of the scheme that changed.
-	 * 
-	 * @return the instance of the scheme that changed. Guaranteed not to be
-	 *         <code>null</code>.
-	 */
-	public final Scheme getScheme() {
-		return scheme;
-	}
-
-	/**
-	 * Returns whether or not the parentId property changed.
-	 * 
-	 * @return true, iff the parentId property changed.
-	 */
-	public final boolean isParentIdChanged() {
-		return ((changedValues & CHANGED_PARENT_ID) != 0);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/Trigger.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/Trigger.java
deleted file mode 100644
index 58dce3b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/Trigger.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.bindings;
-
-/**
- * <p>
- * The abstract class for any object that can be used as a trigger for a binding. 
- * This ensures that trigger conform to certain minimum requirements. Namely, triggers 
- * need to be hashable.
- * </p>
- * 
- * @since 3.1
- */
-public abstract class Trigger implements Comparable {
-
-    /**
-     * Tests whether this object is equal to another object. A handle object is
-     * only equal to another trigger with the same properties.
-     * 
-     * @param object
-     *            The object with which to compare; may be <code>null</code>.
-     * @return <code>true</code> if the objects are equal; <code>false</code>
-     *         otherwise.
-     */
-    public abstract boolean equals(final Object object);
-
-    /**
-     * Computes the hash code for this object.
-     * 
-     * @return The hash code for this object.
-     */
-    public abstract int hashCode();
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/TriggerSequence.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/TriggerSequence.java
deleted file mode 100644
index 93d1c3a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/TriggerSequence.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.bindings;
-
-import org.eclipse.jface.util.Util;
-
-/**
- * <p>
- * A sequence of one or more triggers. None of these triggers may be
- * <code>null</code>.
- * </p>
- * 
- * @since 3.1
- */
-public abstract class TriggerSequence {
-	
-	/**
-	 * The value to see that hash code to if the hash code is not yet computed.
-	 */
-	private static final int HASH_CODE_NOT_COMPUTED = -1;
-
-	/**
-	 * A factor for computing the hash code for all trigger sequences.
-	 */
-	private static final int HASH_FACTOR = 89;
-
-	/**
-	 * An internal constant used only in this object's hash code algorithm.
-	 */
-	private static final int HASH_INITIAL = TriggerSequence.class.getName()
-			.hashCode();
-
-	/**
-	 * The hash code for this object. This value is computed lazily, and marked
-	 * as invalid when one of the values on which it is based changes.  This
-	 * values is <code>HASH_CODE_NOT_COMPUTED</code> iff the hash code has not
-	 * yet been computed.
-	 */
-	protected transient int hashCode = HASH_CODE_NOT_COMPUTED;
-
-	/**
-	 * The list of trigger in this sequence. This value is never
-	 * <code>null</code>, and never contains <code>null</code> elements.
-	 */
-	protected final Trigger[] triggers;
-
-	/**
-	 * Constructs a new instance of <code>TriggerSequence</code>.
-	 * 
-	 * @param triggers
-	 *            The triggers contained within this sequence; must not be
-	 *            <code>null</code> or contain <code>null</code> elements.
-	 *            May be empty.
-	 */
-	public TriggerSequence(final Trigger[] triggers) {
-		if (triggers == null) {
-			throw new NullPointerException("The triggers cannot be null"); //$NON-NLS-1$
-		}
-
-		for (int i = 0; i < triggers.length; i++) {
-			if (triggers[i] == null) {
-				throw new IllegalArgumentException(
-						"All triggers in a trigger sequence must be an instance of Trigger"); //$NON-NLS-1$
-			}
-		}
-
-		final int triggerLength = triggers.length;
-		this.triggers = new Trigger[triggerLength];
-		System.arraycopy(triggers, 0, this.triggers, 0, triggerLength);
-	}
-
-	/**
-	 * Returns whether or not this key sequence ends with the given key
-	 * sequence.
-	 * 
-	 * @param triggerSequence
-	 *            a trigger sequence. Must not be <code>null</code>.
-	 * @param equals
-	 *            whether or not an identical trigger sequence should be
-	 *            considered as a possible match.
-	 * @return <code>true</code>, iff the given trigger sequence ends with
-	 *         this trigger sequence.
-	 */
-	public final boolean endsWith(final TriggerSequence triggerSequence,
-			final boolean equals) {
-		if (triggerSequence == null) {
-			throw new NullPointerException(
-					"Cannot end with a null trigger sequence"); //$NON-NLS-1$
-		}
-
-		return Util.endsWith(triggers, triggerSequence.triggers, equals);
-	}
-
-	public final boolean equals(final Object object) {
-		// Check if they're the same.
-		if (object == this) {
-			return true;
-		}
-
-		// Check if they're the same type.
-		if (!(object instanceof TriggerSequence)) {
-			return false;
-		}
-
-		final TriggerSequence triggerSequence = (TriggerSequence) object;
-		return Util.equals(triggers, triggerSequence.triggers);
-	}
-
-	/**
-	 * Formats this trigger sequence into the current default look.
-	 * 
-	 * @return A string representation for this trigger sequence using the
-	 *         default look; never <code>null</code>.
-	 */
-	public abstract String format();
-
-	/**
-	 * <p>
-	 * Returns a list of prefixes for the current sequence. A prefix is any
-	 * leading subsequence in a <code>TriggerSequence</code>. A prefix is
-	 * also an instance of <code>TriggerSequence</code>.
-	 * </p>
-	 * <p>
-	 * For example, consider a trigger sequence that consists of four triggers:
-	 * A, B, C and D. The prefixes would be "", "A", "A B", and "A B C". The
-	 * list of prefixes must always be the same as the size of the trigger list.
-	 * </p>
-	 * 
-	 * @return The array of possible prefixes for this sequence. This array must
-	 *         not be <code>null</code>, but may be empty. It must only
-	 *         contains instances of <code>TriggerSequence</code>.
-	 */
-	public abstract TriggerSequence[] getPrefixes();
-
-	/**
-	 * Returns the list of triggers.
-	 * 
-	 * @return The triggers; never <code>null</code> and guaranteed to only
-	 *         contain instances of <code>Trigger</code>.
-	 */
-	public final Trigger[] getTriggers() {
-		final int triggerLength = triggers.length;
-		final Trigger[] triggerCopy = new Trigger[triggerLength];
-		System.arraycopy(triggers, 0, triggerCopy, 0, triggerLength);
-		return triggerCopy;
-	}
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see java.lang.Object#hashCode()
-	 */
-	public final int hashCode() {
-		if (hashCode == HASH_CODE_NOT_COMPUTED) {
-			hashCode = HASH_INITIAL;
-			hashCode = hashCode * HASH_FACTOR + Util.hashCode(triggers);
-			if (hashCode == HASH_CODE_NOT_COMPUTED) {
-				hashCode++;
-			}
-		}
-
-		return hashCode;
-	}
-
-	/**
-	 * Returns whether or not this trigger sequence is empty.
-	 * 
-	 * @return <code>true</code>, iff the trigger sequence is empty.
-	 */
-	public final boolean isEmpty() {
-		return (triggers.length == 0);
-	}
-
-	/**
-	 * Returns whether or not this trigger sequence starts with the given
-	 * trigger sequence.
-	 * 
-	 * @param triggerSequence
-	 *            a trigger sequence. Must not be <code>null</code>.
-	 * @param equals
-	 *            whether or not an identical trigger sequence should be
-	 *            considered as a possible match.
-	 * @return <code>true</code>, iff the given trigger sequence starts with
-	 *         this key sequence.
-	 */
-	public final boolean startsWith(final TriggerSequence triggerSequence,
-			final boolean equals) {
-		if (triggerSequence == null) {
-			throw new NullPointerException(
-					"A trigger sequence cannot start with null"); //$NON-NLS-1$
-		}
-
-		return Util.startsWith(triggers, triggerSequence.triggers, equals);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/IKeyLookup.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/IKeyLookup.java
deleted file mode 100644
index ad057aa..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/IKeyLookup.java
+++ /dev/null
@@ -1,457 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.bindings.keys;
-
-/**
- * <p>
- * A facilitiy for converting the formal representation for key strokes
- * (i.e., used in persistence) into real key stroke instances.
- * </p>
- * 
- * @since 3.1
- */
-public interface IKeyLookup {
-	/**
-	 * The formal name of the 'Alt' key.
-	 */
-	public static final String ALT_NAME = "ALT"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Arrow Down' key.
-	 */
-	public static final String ARROW_DOWN_NAME = "ARROW_DOWN"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Arrow Left' key.
-	 */
-	public static final String ARROW_LEFT_NAME = "ARROW_LEFT"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Arrow Right' key.
-	 */
-	public static final String ARROW_RIGHT_NAME = "ARROW_RIGHT"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Arrow Up' key.
-	 */
-	public static final String ARROW_UP_NAME = "ARROW_UP"; //$NON-NLS-1$
-	
-	/**
-	 * An alternate name for the backspace key.
-	 */
-	public static final String BACKSPACE_NAME = "BACKSPACE"; //$NON-NLS-1$
-
-	/**
-	 * The formal name for the 'Break' key.
-	 */
-	public static final String BREAK_NAME = "BREAK"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the backspace key.
-	 */
-	public static final String BS_NAME = "BS"; //$NON-NLS-1$
-
-	/**
-	 * The formal name for the 'Caps Lock' key.
-	 */
-	public static final String CAPS_LOCK_NAME = "CAPS_LOCK"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Command' key.
-	 */
-	public static final String COMMAND_NAME = "COMMAND"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the carriage return (U+000D)
-	 */
-	public static final String CR_NAME = "CR"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Ctrl' key.
-	 */
-	public static final String CTRL_NAME = "CTRL"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the delete (U+007F) key
-	 */
-	public static final String DEL_NAME = "DEL"; //$NON-NLS-1$
-	
-	/**
-	 * An alternative name for the delete key.
-	 */
-	public static final String DELETE_NAME = "DELETE"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'End' key.
-	 */
-	public static final String END_NAME = "END"; //$NON-NLS-1$
-	
-	/**
-	 * An alternative name for the enter key.
-	 */
-	public static final String ENTER_NAME = "ENTER"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the escape (U+001B) key.
-	 */
-	public static final String ESC_NAME = "ESC"; //$NON-NLS-1$
-	
-	/**
-	 * An alternative name for the escape key.
-	 */
-	public static final String ESCAPE_NAME = "ESCAPE"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'F1' key.
-	 */
-	public static final String F1_NAME = "F1"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'F10' key.
-	 */
-	public static final String F10_NAME = "F10"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'F11' key.
-	 */
-	public static final String F11_NAME = "F11"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'F12' key.
-	 */
-	public static final String F12_NAME = "F12"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'F13' key.
-	 */
-	public static final String F13_NAME = "F13"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'F14' key.
-	 */
-	public static final String F14_NAME = "F14"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'F15' key.
-	 */
-	public static final String F15_NAME = "F15"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'F2' key.
-	 */
-	public static final String F2_NAME = "F2"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'F3' key.
-	 */
-	public static final String F3_NAME = "F3"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'F4' key.
-	 */
-	public static final String F4_NAME = "F4"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'F5' key.
-	 */
-	public static final String F5_NAME = "F5"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'F6' key.
-	 */
-	public static final String F6_NAME = "F6"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'F7' key.
-	 */
-	public static final String F7_NAME = "F7"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'F8' key.
-	 */
-	public static final String F8_NAME = "F8"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'F9' key.
-	 */
-	public static final String F9_NAME = "F9"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the form feed (U+000C) key.
-	 */
-	public static final String FF_NAME = "FF"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Home' key.
-	 */
-	public static final String HOME_NAME = "HOME"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Insert' key.
-	 */
-	public static final String INSERT_NAME = "INSERT"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the line feed (U+000A) key.
-	 */
-	public static final String LF_NAME = "LF"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'M1' key.
-	 */
-	public static final String M1_NAME = "M1"; //$NON-NLS-1$	
-
-	/**
-	 * The formal name of the 'M2' key.
-	 */
-	public static final String M2_NAME = "M2"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'M3' key.
-	 */
-	public static final String M3_NAME = "M3"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'M4' key.
-	 */
-	public static final String M4_NAME = "M4"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the null (U+0000) key.
-	 */
-	public static final String NUL_NAME = "NUL"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'NumLock' key.
-	 */
-	public static final String NUM_LOCK_NAME = "NUM_LOCK"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the '0' key on the numpad.
-	 */
-	public static final String NUMPAD_0_NAME = "NUMPAD_0"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the '1' key on the numpad.
-	 */
-	public static final String NUMPAD_1_NAME = "NUMPAD_1"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the '2' key on the numpad.
-	 */
-	public static final String NUMPAD_2_NAME = "NUMPAD_2"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the '3' key on the numpad.
-	 */
-	public static final String NUMPAD_3_NAME = "NUMPAD_3"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the '4' key on the numpad.
-	 */
-	public static final String NUMPAD_4_NAME = "NUMPAD_4"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the '5' key on the numpad.
-	 */
-	public static final String NUMPAD_5_NAME = "NUMPAD_5"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the '6' key on the numpad.
-	 */
-	public static final String NUMPAD_6_NAME = "NUMPAD_6"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the '7' key on the numpad.
-	 */
-	public static final String NUMPAD_7_NAME = "NUMPAD_7"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the '8' key on the numpad.
-	 */
-	public static final String NUMPAD_8_NAME = "NUMPAD_8"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the '9' key on the numpad.
-	 */
-	public static final String NUMPAD_9_NAME = "NUMPAD_9"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Add' key on the numpad.
-	 */
-	public static final String NUMPAD_ADD_NAME = "NUMPAD_ADD"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Decimal' key on the numpad.
-	 */
-	public static final String NUMPAD_DECIMAL_NAME = "NUMPAD_DECIMAL"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Divide' key on the numpad.
-	 */
-	public static final String NUMPAD_DIVIDE_NAME = "NUMPAD_DIVIDE"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Enter' key on the numpad.
-	 */
-	public static final String NUMPAD_ENTER_NAME = "NUMPAD_ENTER"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the '=' key on the numpad.
-	 */
-	public static final String NUMPAD_EQUAL_NAME = "NUMPAD_EQUAL"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Multiply' key on the numpad.
-	 */
-	public static final String NUMPAD_MULTIPLY_NAME = "NUMPAD_MULTIPLY"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Subtract' key on the numpad.
-	 */
-	public static final String NUMPAD_SUBTRACT_NAME = "NUMPAD_SUBTRACT"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Page Down' key.
-	 */
-	public static final String PAGE_DOWN_NAME = "PAGE_DOWN"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the 'Page Up' key.
-	 */
-	public static final String PAGE_UP_NAME = "PAGE_UP"; //$NON-NLS-1$
-
-	/**
-	 * The formal name for the 'Pause' key.
-	 */
-	public static final String PAUSE_NAME = "PAUSE"; //$NON-NLS-1$
-
-	/**
-	 * The formal name for the 'Print Screen' key.
-	 */
-	public static final String PRINT_SCREEN_NAME = "PRINT_SCREEN"; //$NON-NLS-1$
-	
-	/**
-	 * An alternative name for the enter key.
-	 */
-	public static final String RETURN_NAME = "RETURN"; //$NON-NLS-1$
-
-	/**
-	 * The formal name for the 'Scroll Lock' key.
-	 */
-	public static final String SCROLL_LOCK_NAME = "SCROLL_LOCK"; //$NON-NLS-1$		
-
-	/**
-	 * The formal name of the 'Shift' key.
-	 */
-	public static final String SHIFT_NAME = "SHIFT"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the space (U+0020) key.
-	 */
-	public static final String SPACE_NAME = "SPACE"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the tab (U+0009) key.
-	 */
-	public static final String TAB_NAME = "TAB"; //$NON-NLS-1$
-
-	/**
-	 * The formal name of the vertical tab (U+000B) key.
-	 */
-	public static final String VT_NAME = "VT"; //$NON-NLS-1$	
-
-	/**
-	 * Looks up a single natural key by its formal name, and returns the integer
-	 * representation for this natural key
-	 * 
-	 * @param name
-	 *            The formal name of the natural key to look-up; must not be
-	 *            <code>null</code>.
-	 * @return The integer representation of this key. If the natural key cannot
-	 *         be found, then this method returns <code>0</code>.
-	 */
-	public int formalKeyLookup(String name);	
-
-	/**
-	 * Looks up a single natural key by its formal name, and returns the integer
-	 * representation for this natural key
-	 * 
-	 * @param name
-	 *            The formal name of the natural key to look-up; must not be
-	 *            <code>null</code>.
-	 * @return The integer representation of this key. If the natural key cannot
-	 *         be found, then this method returns <code>0</code>.
-	 */
-	public Integer formalKeyLookupInteger(String name);
-
-	/**
-	 * Looks up a single modifier key by its formal name, and returns the integer
-	 * representation for this modifier key
-	 * 
-	 * @param name
-	 *            The formal name of the modifier key to look-up; must not be
-	 *            <code>null</code>.
-	 * @return The integer representation of this key. If the modifier key
-	 *         cannot be found, then this method returns <code>0</code>.
-	 */
-	public int formalModifierLookup(String name);
-
-	/**
-	 * Looks up a key value, and returns the formal string representation for
-	 * that key
-	 * 
-	 * @param key
-	 *            The key to look-up.
-	 * @return The formal string representation of this key. If this key cannot
-	 *         be found, then it is simply the character corresponding to that
-	 *         integer value.
-	 */
-	public String formalNameLookup(int key);
-
-	/**
-	 * Returns the integer representation of the ALT key.
-	 * 
-	 * @return The ALT key
-	 */
-	public int getAlt();
-
-	/**
-	 * Returns the integer representation of the COMMAND key.
-	 * 
-	 * @return The COMMAND key
-	 */
-	public int getCommand();
-
-	/**
-	 * Returns the integer representation of the CTRL key.
-	 * 
-	 * @return The CTRL key
-	 */
-	public int getCtrl();
-
-	/**
-	 * Returns the integer representation of the SHIFT key.
-	 * 
-	 * @return The SHIFT key
-	 */
-	public int getShift();
-
-	/**
-	 * Returns whether the given key is a modifier key.
-	 * 
-	 * @param key
-	 *            The integer value of the key to check.
-	 * @return <code>true</code> if the key is one of the modifier keys;
-	 *         <code>false</code> otherwise.
-	 */
-	public boolean isModifierKey(int key);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/KeyBinding.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/KeyBinding.java
deleted file mode 100644
index 157a05d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/KeyBinding.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.bindings.keys;
-
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.jface.bindings.Binding;
-import org.eclipse.jface.bindings.TriggerSequence;
-
-/**
- * <p>
- * A keyboard shortcut. This is a binding between some keyboard input and the
- * triggering of a command. This object is immutable.
- * </p>
- * 
- * @since 3.1
- */
-public final class KeyBinding extends Binding {
-
-	/**
-	 * The key sequence which triggers this binding. This sequence is never
-	 * <code>null</code>.
-	 */
-	private final KeySequence keySequence;
-
-	/**
-	 * Constructs a new instance of <code>KeyBinding</code>.
-	 * 
-	 * @param keySequence
-	 *            The key sequence which should trigger this binding. This value
-	 *            must not be <code>null</code>. It also must be a complete,
-	 *            non-empty key sequence.
-	 * @param command
-	 *            The parameterized command to which this binding applies; this
-	 *            value may be <code>null</code> if the binding is meant to
-	 *            "unbind" a previously defined binding.
-	 * @param schemeId
-	 *            The scheme to which this binding belongs; this value must not
-	 *            be <code>null</code>.
-	 * @param contextId
-	 *            The context to which this binding applies; this value must not
-	 *            be <code>null</code>.
-	 * @param locale
-	 *            The locale to which this binding applies; this value may be
-	 *            <code>null</code> if it applies to all locales.
-	 * @param platform
-	 *            The platform to which this binding applies; this value may be
-	 *            <code>null</code> if it applies to all platforms.
-	 * @param windowManager
-	 *            The window manager to which this binding applies; this value
-	 *            may be <code>null</code> if it applies to all window
-	 *            managers. This value is currently ignored.
-	 * @param type
-	 *            The type of binding. This should be either <code>SYSTEM</code>
-	 *            or <code>USER</code>.
-	 */
-	public KeyBinding(final KeySequence keySequence,
-			final ParameterizedCommand command, final String schemeId,
-			final String contextId, final String locale, final String platform,
-			final String windowManager, final int type) {
-		super(command, schemeId, contextId, locale, platform, windowManager,
-				type);
-
-		if (keySequence == null) {
-			throw new NullPointerException("The key sequence cannot be null"); //$NON-NLS-1$
-		}
-
-		if (!keySequence.isComplete()) {
-			throw new IllegalArgumentException(
-					"Cannot bind to an incomplete key sequence"); //$NON-NLS-1$
-		}
-
-		if (keySequence.isEmpty()) {
-			throw new IllegalArgumentException(
-					"Cannot bind to an empty key sequence"); //$NON-NLS-1$
-		}
-
-		this.keySequence = keySequence;
-	}
-
-	/**
-	 * Returns the key sequence which triggers this binding. The key sequence
-	 * will not be <code>null</code>, empty or incomplete.
-	 * 
-	 * @return The key sequence; never <code>null</code>.
-	 */
-	public final KeySequence getKeySequence() {
-		return keySequence;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.Binding#getTriggerSequence()
-	 */
-	public TriggerSequence getTriggerSequence() {
-		return getKeySequence();
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/KeyLookupFactory.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/KeyLookupFactory.java
deleted file mode 100644
index f280ea1..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/KeyLookupFactory.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.bindings.keys;
-
-
-/**
- * <p>
- * A factory class for <code>ILookup</code> instances. This factory can be
- * used to retrieve instances of look-ups defined by this package. It also
- * allows you to define your own look-up for use in the classes.
- * </p>
- * 
- * @since 3.1
- */
-public final class KeyLookupFactory {
-
-	/**
-	 * The SWT key look-up defined by this package.
-	 */
-	private static final SWTKeyLookup SWT_KEY_LOOKUP = new SWTKeyLookup();
-
-	/**
-	 * The instance that should be used by <code>KeyStroke</code> in
-	 * converting string representations to instances.
-	 */
-	private static IKeyLookup defaultLookup = SWT_KEY_LOOKUP;
-
-	/**
-	 * Provides an instance of <code>SWTKeyLookup</code>.
-	 * 
-	 * @return The SWT look-up table for key stroke format information; never
-	 *         <code>null</code>.
-	 */
-	public static final IKeyLookup getSWTKeyLookup() {
-		return SWT_KEY_LOOKUP;
-	}
-
-	/**
-	 * An accessor for the current default look-up.
-	 * 
-	 * @return The default look-up; never <code>null</code>.
-	 */
-	public static final IKeyLookup getDefault() {
-		return defaultLookup;
-	}
-
-	/**
-	 * Sets the default look-up.
-	 * 
-	 * @param defaultLookup
-	 *            the default look-up. Must not be <code>null</code>.
-	 */
-	public static final void setDefault(final IKeyLookup defaultLookup) {
-		if (defaultLookup == null) {
-			throw new NullPointerException("The look-up must not be null"); //$NON-NLS-1$
-		}
-
-		KeyLookupFactory.defaultLookup = defaultLookup;
-	}
-
-	/**
-	 * This class should not be instantiated.
-	 */
-	private KeyLookupFactory() {
-		// Not to be constructred.
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/KeySequence.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/KeySequence.java
deleted file mode 100644
index abf927f..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/KeySequence.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings.keys;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jface.bindings.TriggerSequence;
-import org.eclipse.jface.bindings.keys.formatting.KeyFormatterFactory;
-import org.eclipse.jface.util.Util;
-
-/**
- * <p>
- * A <code>KeySequence</code> is defined as a list of zero or more
- * <code>KeyStrokes</code>, with the stipulation that all
- * <code>KeyStroke</code> objects must be complete, save for the last one,
- * whose completeness is optional. A <code>KeySequence</code> is said to be
- * complete if all of its <code>KeyStroke</code> objects are complete.
- * </p>
- * <p>
- * All <code>KeySequence</code> objects have a formal string representation
- * available via the <code>toString()</code> method. There are a number of
- * methods to get instances of <code>KeySequence</code> objects, including one
- * which can parse this formal string representation.
- * </p>
- * <p>
- * All <code>KeySequence</code> objects, via the <code>format()</code>
- * method, provide a version of their formal string representation translated by
- * platform and locale, suitable for display to a user.
- * </p>
- * <p>
- * <code>KeySequence</code> objects are immutable. Clients are not permitted
- * to extend this class.
- * </p>
- * 
- * @since 3.1
- */
-public final class KeySequence extends TriggerSequence implements Comparable {
-
-	/**
-	 * An empty key sequence instance for use by everyone.
-	 */
-	private final static KeySequence EMPTY_KEY_SEQUENCE = new KeySequence(
-			new KeyStroke[0]);
-
-	/**
-	 * The delimiter between multiple key strokes in a single key sequence --
-	 * expressed in the formal key stroke grammar. This is not to be displayed
-	 * to the user. It is only intended as an internal representation.
-	 */
-	public final static String KEY_STROKE_DELIMITER = "\u0020"; //$NON-NLS-1$
-
-	/**
-	 * The set of delimiters for <code>KeyStroke</code> objects allowed during
-	 * parsing of the formal string representation.
-	 */
-	public final static String KEY_STROKE_DELIMITERS = KEY_STROKE_DELIMITER
-			+ "\b\r\u007F\u001B\f\n\0\t\u000B"; //$NON-NLS-1$
-
-	/**
-	 * Gets an instance of <code>KeySequence</code>.
-	 * 
-	 * @return a key sequence. This key sequence will have no key strokes.
-	 *         Guaranteed not to be <code>null</code>.
-	 */
-	public static final KeySequence getInstance() {
-		return EMPTY_KEY_SEQUENCE;
-	}
-
-	/**
-	 * Creates an instance of <code>KeySequence</code> given a key sequence
-	 * and a key stroke.
-	 * 
-	 * @param keySequence
-	 *            a key sequence. Must not be <code>null</code>.
-	 * @param keyStroke
-	 *            a key stroke. Must not be <code>null</code>.
-	 * @return a key sequence that is equal to the given key sequence with the
-	 *         given key stroke appended to the end. Guaranteed not to be
-	 *         <code>null</code>.
-	 */
-	public static final KeySequence getInstance(final KeySequence keySequence,
-			final KeyStroke keyStroke) {
-		if (keySequence == null || keyStroke == null) {
-			throw new NullPointerException();
-		}
-
-		final KeyStroke[] oldKeyStrokes = keySequence.getKeyStrokes();
-		final int oldKeyStrokeLength = oldKeyStrokes.length;
-		final KeyStroke[] newKeyStrokes = new KeyStroke[oldKeyStrokeLength + 1];
-		System
-				.arraycopy(oldKeyStrokes, 0, newKeyStrokes, 0,
-						oldKeyStrokeLength);
-		newKeyStrokes[oldKeyStrokeLength] = keyStroke;
-		return new KeySequence(newKeyStrokes);
-	}
-
-	/**
-	 * Creates an instance of <code>KeySequence</code> given a single key
-	 * stroke.
-	 * 
-	 * @param keyStroke
-	 *            a single key stroke. Must not be <code>null</code>.
-	 * @return a key sequence. Guaranteed not to be <code>null</code>.
-	 */
-	public static final KeySequence getInstance(final KeyStroke keyStroke) {
-		return new KeySequence(new KeyStroke[] { keyStroke });
-	}
-
-	/**
-	 * Creates an instance of <code>KeySequence</code> given an array of key
-	 * strokes.
-	 * 
-	 * @param keyStrokes
-	 *            the array of key strokes. This array may be empty, but it must
-	 *            not be <code>null</code>. This array must not contain
-	 *            <code>null</code> elements.
-	 * @return a key sequence. Guaranteed not to be <code>null</code>.
-	 */
-	public static final KeySequence getInstance(final KeyStroke[] keyStrokes) {
-		return new KeySequence(keyStrokes);
-	}
-
-	/**
-	 * Creates an instance of <code>KeySequence</code> given a list of key
-	 * strokes.
-	 * 
-	 * @param keyStrokes
-	 *            the list of key strokes. This list may be empty, but it must
-	 *            not be <code>null</code>. If this list is not empty, it
-	 *            must only contain instances of <code>KeyStroke</code>.
-	 * @return a key sequence. Guaranteed not to be <code>null</code>.
-	 */
-	public static final KeySequence getInstance(final List keyStrokes) {
-		return new KeySequence((KeyStroke[]) keyStrokes
-				.toArray(new KeyStroke[keyStrokes.size()]));
-	}
-
-	/**
-	 * Creates an instance of <code>KeySequence</code> by parsing a given
-	 * formal string representation.
-	 * 
-	 * @param string
-	 *            the formal string representation to parse.
-	 * @return a key sequence. Guaranteed not to be <code>null</code>.
-	 * @throws ParseException
-	 *             if the given formal string representation could not be parsed
-	 *             to a valid key sequence.
-	 */
-	public static final KeySequence getInstance(final String string)
-			throws ParseException {
-		if (string == null) {
-			throw new NullPointerException();
-		}
-
-		final List keyStrokes = new ArrayList();
-		final StringTokenizer stringTokenizer = new StringTokenizer(string,
-				KEY_STROKE_DELIMITERS);
-
-		try {
-			while (stringTokenizer.hasMoreTokens()) {
-				keyStrokes.add(KeyStroke.getInstance(stringTokenizer
-						.nextToken()));
-			}
-
-			final KeyStroke[] keyStrokeArray = (KeyStroke[]) keyStrokes
-					.toArray(new KeyStroke[keyStrokes.size()]);
-			return new KeySequence(keyStrokeArray);
-		} catch (final IllegalArgumentException e) {
-			throw new ParseException(
-					"Could not construct key sequence with these key strokes: " //$NON-NLS-1$
-							+ keyStrokes);
-		} catch (final NullPointerException e) {
-			throw new ParseException(
-					"Could not construct key sequence with these key strokes: " //$NON-NLS-1$
-							+ keyStrokes);
-		}
-	}
-
-	/**
-	 * Constructs an instance of <code>KeySequence</code> given a list of key
-	 * strokes.
-	 * 
-	 * @param keyStrokes
-	 *            the list of key strokes. This list may be empty, but it must
-	 *            not be <code>null</code>. If this list is not empty, it
-	 *            must only contain instances of <code>KeyStroke</code>.
-	 */
-	protected KeySequence(final KeyStroke[] keyStrokes) {
-		super(keyStrokes);
-
-		for (int i = 0; i < triggers.length - 1; i++) {
-			KeyStroke keyStroke = (KeyStroke) triggers[i];
-
-			if (!keyStroke.isComplete()) {
-				throw new IllegalArgumentException();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#compareTo(java.lang.Object)
-	 */
-	public final int compareTo(final Object object) {
-		final KeySequence castedObject = (KeySequence) object;
-		return Util.compare(triggers, castedObject.triggers);
-	}
-
-	/**
-	 * Formats this key sequence into the current default look.
-	 * 
-	 * @return A string representation for this key sequence using the default
-	 *         look; never <code>null</code>.
-	 */
-	public final String format() {
-		return KeyFormatterFactory.getDefault().format(this);
-	}
-
-	/**
-	 * Returns the list of key strokes for this key sequence.
-	 * 
-	 * @return the list of key strokes keys. This list may be empty, but is
-	 *         guaranteed not to be <code>null</code>. If this list is not
-	 *         empty, it is guaranteed to only contain instances of
-	 *         <code>KeyStroke</code>.
-	 */
-	public final KeyStroke[] getKeyStrokes() {
-		final int triggerLength = triggers.length;
-		final KeyStroke[] keyStrokes = new KeyStroke[triggerLength];
-		System.arraycopy(triggers, 0, keyStrokes, 0, triggerLength);
-		return keyStrokes;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.TriggerSequence#getPrefixes()
-	 */
-	public final TriggerSequence[] getPrefixes() {
-		final int numberOfPrefixes = triggers.length;
-		final TriggerSequence[] prefixes = new TriggerSequence[numberOfPrefixes];
-		prefixes[0] = KeySequence.getInstance();
-		for (int i = 0; i < numberOfPrefixes - 1; i++) {
-			final KeyStroke[] prefixKeyStrokes = new KeyStroke[i + 1];
-			System.arraycopy(triggers, 0, prefixKeyStrokes, 0, i + 1);
-			prefixes[i + 1] = KeySequence.getInstance(prefixKeyStrokes);
-		}
-
-		return prefixes;
-	}
-
-	/**
-	 * Returns whether or not this key sequence is complete. Key sequences are
-	 * complete iff all of their key strokes are complete.
-	 * 
-	 * @return <code>true</code>, iff the key sequence is complete.
-	 */
-	public final boolean isComplete() {
-		final int triggersLength = triggers.length;
-		for (int i = 0; i < triggersLength; i++) {
-			if (!((KeyStroke) triggers[i]).isComplete()) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * Returns the formal string representation for this key sequence.
-	 * 
-	 * @return The formal string representation for this key sequence.
-	 *         Guaranteed not to be <code>null</code>.
-	 * @see java.lang.Object#toString()
-	 */
-	public final String toString() {
-		return KeyFormatterFactory.getFormalKeyFormatter().format(this);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/KeySequenceText.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/KeySequenceText.java
deleted file mode 100644
index dfab24b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/KeySequenceText.java
+++ /dev/null
@@ -1,961 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings.keys;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.TreeSet;
-
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * <p>
- * A wrapper around the SWT text widget that traps literal key presses and
- * converts them into key sequences for display. There are two types of key
- * strokes that are displayed: complete and incomplete. A complete key stroke is
- * one with a natural key, while an incomplete one has no natural key.
- * Incomplete key strokes are only displayed until they are made complete or
- * their component key presses are released.
- * </p>
- * 
- * @since 3.1
- */
-public final class KeySequenceText {
-
-	/**
-	 * A key listener that traps incoming events and displays them in the
-	 * wrapped text field. It has no effect on traversal operations.
-	 */
-	private class KeyTrapListener implements Listener {
-		/**
-		 * The index at which insertion should occur. This is used if there is a
-		 * replacement occurring in the middle of the stroke, and the first key
-		 * stroke was incomplete.
-		 */
-		private int insertionIndex = -1;
-
-		/**
-		 * Resets the insertion index to point nowhere. In other words, it is
-		 * set to <code>-1</code>.
-		 */
-		void clearInsertionIndex() {
-			insertionIndex = -1;
-		}
-
-		/**
-		 * Deletes the current selection. If there is no selection, then it
-		 * deletes the last key stroke.
-		 * 
-		 * @param keyStrokes
-		 *            The key strokes from which to delete. This list must not
-		 *            be <code>null</code>, and must represent a valid key
-		 *            sequence.
-		 * @return An array of keystrokes minus the keystrokes that were
-		 *         deleted.
-		 */
-		private final KeyStroke[] deleteKeyStroke(final KeyStroke[] keyStrokes) {
-			clearInsertionIndex();
-
-			if (hasSelection()) {
-				/*
-				 * Delete the current selection -- disallowing incomplete
-				 * strokes in the middle of the sequence.
-				 */
-				final KeyStroke[][] deletedKeyStrokes = new KeyStroke[1][];
-				deleteSelection(keyStrokes, false, deletedKeyStrokes);
-				return deletedKeyStrokes[0];
-			}
-
-			// Remove the last key stroke.
-			if (keyStrokes.length > 0) {
-				final int newKeyStrokesLength = keyStrokes.length - 1;
-				final KeyStroke[] newKeyStrokes = new KeyStroke[newKeyStrokesLength];
-				System.arraycopy(keyStrokes, 0, newKeyStrokes, 0,
-						newKeyStrokesLength);
-				return newKeyStrokes;
-			}
-
-			return keyStrokes;
-		}
-
-		/**
-		 * Handles the key pressed and released events on the wrapped text
-		 * widget. This makes sure to either add the pressed key to the
-		 * temporary key stroke, or complete the current temporary key stroke
-		 * and prompt for the next. In the case of a key release, this makes
-		 * sure that the temporary stroke is correctly displayed --
-		 * corresponding with modifier keys that may have been released.
-		 * 
-		 * @param event
-		 *            The triggering event; must not be <code>null</code>.
-		 */
-		public void handleEvent(Event event) {
-			KeyStroke[] keyStrokes = getKeySequence().getKeyStrokes();
-
-			// Dispatch the event to the correct handler.
-			if (event.type == SWT.KeyDown) {
-				keyStrokes = handleKeyDown(event, keyStrokes);
-			} else if (event.type == SWT.KeyUp) {
-				keyStrokes = handleKeyUp(event, keyStrokes);
-			}
-
-			// Update the underlying widget.
-			setKeySequence(KeySequence.getInstance(keyStrokes));
-
-			// Prevent the event from reaching the widget.
-			event.doit = false;
-		}
-
-		/**
-		 * Handles the case where the key event is an <code>SWT.KeyDown</code>
-		 * event. This either causes a deletion (if it is an unmodified
-		 * backspace key stroke), or an insertion (if it is any other key).
-		 * 
-		 * @param event
-		 *            The trigger key down event; must not be <code>null</code>.
-		 * @param keyStrokes
-		 *            The current list of key strokes. This valud must not be
-		 *            <code>null</code>, and it must represent a valid key
-		 *            sequence.
-		 */
-		private KeyStroke[] handleKeyDown(Event event, KeyStroke[] keyStrokes) {
-			// Is it an unmodified backspace character?
-			if ((event.character == SWT.BS || event.character == SWT.DEL) && (event.stateMask == 0)) {
-				return deleteKeyStroke(keyStrokes);
-			}
-
-			return insertKeyStroke(event, keyStrokes);
-		}
-
-		/**
-		 * Handles the case where the key event is an <code>SWT.KeyUp</code>
-		 * event. This resets the insertion index. If there is an incomplete
-		 * stroke, then that incomplete stroke is modified to match the keys
-		 * that are still held. If no keys are held, then the incomplete stroke
-		 * is removed.
-		 * 
-		 * @param event
-		 *            The triggering event; must not be <code>null</code>
-		 * @param keyStrokes
-		 *            The key strokes that are part of the current key sequence;
-		 *            these key strokes are guaranteed to represent a valid key
-		 *            sequence. This value must not be <code>null</code>.
-		 */
-		private final KeyStroke[] handleKeyUp(final Event event,
-				final KeyStroke[] keyStrokes) {
-			if (hasIncompleteStroke()) {
-				/*
-				 * Figure out the SWT integer representation of the remaining
-				 * values.
-				 */
-				Event mockEvent = new Event();
-				if ((event.keyCode & SWT.MODIFIER_MASK) != 0) {
-					// This key up is a modifier key being released.
-					mockEvent.stateMask = event.stateMask - event.keyCode;
-				} else {
-					/*
-					 * This key up is the other end of a key down that was
-					 * trapped by the operating system or window manager.
-					 */
-					mockEvent.stateMask = event.stateMask;
-				}
-
-				/*
-				 * Get a reasonable facsimile of the stroke that is still
-				 * pressed.
-				 */
-				int key = SWTKeySupport
-						.convertEventToUnmodifiedAccelerator(mockEvent);
-				KeyStroke remainingStroke = SWTKeySupport
-						.convertAcceleratorToKeyStroke(key);
-				final int keyStrokesLength = keyStrokes.length;
-				final KeyStroke[] newKeyStrokes;
-				if ((keyStrokesLength > 0)
-						&& (remainingStroke.getModifierKeys() != 0)) {
-					newKeyStrokes = new KeyStroke[keyStrokesLength];
-					System.arraycopy(keyStrokes, 0, newKeyStrokes, 0,
-							keyStrokesLength - 1);
-					newKeyStrokes[keyStrokesLength - 1] = remainingStroke;
-
-				} else if (keyStrokesLength > 0) {
-					newKeyStrokes = new KeyStroke[keyStrokesLength - 1];
-					System.arraycopy(keyStrokes, 0, newKeyStrokes, 0,
-							keyStrokesLength - 1);
-
-				} else if (remainingStroke.getModifierKeys() != 0) {
-					newKeyStrokes = new KeyStroke[keyStrokesLength + 1];
-					System.arraycopy(keyStrokes, 0, newKeyStrokes, 0,
-							keyStrokesLength);
-					newKeyStrokes[keyStrokesLength] = remainingStroke;
-
-				} else {
-					newKeyStrokes = keyStrokes;
-
-				}
-
-				return newKeyStrokes;
-			}
-
-			return keyStrokes;
-		}
-
-		/**
-		 * <p>
-		 * Handles the case where a key down event is leading to a key stroke
-		 * being inserted. The current selection is deleted, and an invalid
-		 * remanents of the stroke are also removed. The insertion is carried
-		 * out at the cursor position.
-		 * </p>
-		 * <p>
-		 * If only a natural key is selected (as part of a larger key stroke),
-		 * then it is possible for the user to press a natural key to replace
-		 * the old natural key. In this situation, pressing any modifier keys
-		 * will replace the whole thing.
-		 * </p>
-		 * <p>
-		 * If the insertion point is not at the end of the sequence, then
-		 * incomplete strokes will not be immediately inserted. Only when the
-		 * sequence is completed is the stroke inserted. This is a requirement
-		 * as the widget must always represent a valid key sequence. The
-		 * insertion point is tracked using <code>insertionIndex</code>,
-		 * which is an index into the key stroke array.
-		 * </p>
-		 * 
-		 * @param event
-		 *            The triggering key down event; must not be
-		 *            <code>null</code>.
-		 * @param keyStrokes
-		 *            The key strokes into which the current stroke should be
-		 *            inserted. This value must not be <code>null</code>, and
-		 *            must represent a valid key sequence.
-		 */
-		private final KeyStroke[] insertKeyStroke(final Event event,
-				KeyStroke[] keyStrokes) {
-			// Compute the key stroke to insert.
-			int key = SWTKeySupport.convertEventToUnmodifiedAccelerator(event);
-			KeyStroke stroke = SWTKeySupport.convertAcceleratorToKeyStroke(key);
-
-			/*
-			 * Only insert the stroke if it is *not ScrollLock. Let's not get
-			 * silly
-			 */
-			if ((SWT.NUM_LOCK == stroke.getNaturalKey())
-					|| (SWT.CAPS_LOCK == stroke.getNaturalKey())
-					|| (SWT.SCROLL_LOCK == stroke.getNaturalKey())) {
-				return keyStrokes;
-			}
-
-			if (insertionIndex != -1) {
-				// There is a previous replacement still going on.
-				if (stroke.isComplete()) {
-					keyStrokes = insertStrokeAt(keyStrokes, stroke,
-							insertionIndex);
-					clearInsertionIndex();
-				}
-
-			} else if (hasSelection()) {
-				// There is a selection that needs to be replaced.
-				final KeyStroke[][] deletedKeyStrokes = new KeyStroke[1][];
-				insertionIndex = deleteSelection(keyStrokes, stroke
-						.isComplete(), deletedKeyStrokes);
-				keyStrokes = deletedKeyStrokes[0];
-				if ((stroke.isComplete())
-						|| (insertionIndex >= keyStrokes.length)) {
-					keyStrokes = insertStrokeAt(keyStrokes, stroke,
-							insertionIndex);
-					clearInsertionIndex();
-				}
-
-			} else {
-				// No selection, so remove the incomplete stroke, if any
-				if ((hasIncompleteStroke()) && (keyStrokes.length > 0)) {
-					final KeyStroke[] newKeyStrokes = new KeyStroke[keyStrokes.length - 1];
-					System.arraycopy(keyStrokes, 0, newKeyStrokes, 0,
-							keyStrokes.length - 1);
-					keyStrokes = newKeyStrokes;
-				}
-
-				// And then add the new stroke.
-				if ((keyStrokes.length == 0)
-						|| (insertionIndex >= keyStrokes.length)
-						|| (isCursorInLastPosition())) {
-					keyStrokes = insertStrokeAt(keyStrokes, stroke,
-							keyStrokes.length);
-					clearInsertionIndex();
-				} else {
-					/*
-					 * I'm just getting the insertionIndex here. No actual
-					 * deletion should occur.
-					 */
-					final KeyStroke[][] deletedKeyStrokes = new KeyStroke[1][];
-					insertionIndex = deleteSelection(keyStrokes, stroke
-							.isComplete(), deletedKeyStrokes);
-					keyStrokes = deletedKeyStrokes[0];
-					if (stroke.isComplete()) {
-						keyStrokes = insertStrokeAt(keyStrokes, stroke,
-								insertionIndex);
-						clearInsertionIndex();
-					}
-				}
-
-			}
-
-			return keyStrokes;
-		}
-	}
-
-	/**
-	 * A traversal listener that blocks all traversal except for tabs and arrow
-	 * keys.
-	 */
-	private class TraversalFilter implements Listener {
-		/**
-		 * Handles the traverse event on the text field wrapped by this class.
-		 * It swallows all traverse events example for tab and arrow key
-		 * navigation. The other forms of navigation can be reached by tabbing
-		 * off of the control.
-		 * 
-		 * @param event
-		 *            The trigger event; must not be <code>null</code>.
-		 */
-		public void handleEvent(Event event) {
-			switch (event.detail) {
-			case SWT.TRAVERSE_ESCAPE:
-			case SWT.TRAVERSE_MNEMONIC:
-			case SWT.TRAVERSE_NONE:
-			case SWT.TRAVERSE_PAGE_NEXT:
-			case SWT.TRAVERSE_PAGE_PREVIOUS:
-			case SWT.TRAVERSE_RETURN:
-				event.type = SWT.None;
-				event.doit = false;
-				break;
-
-			case SWT.TRAVERSE_TAB_NEXT:
-			case SWT.TRAVERSE_TAB_PREVIOUS:
-				// Check if modifiers other than just 'Shift' were
-				// down.
-				if ((event.stateMask & (SWT.MODIFIER_MASK ^ SWT.SHIFT)) != 0) {
-					// Modifiers other than shift were down.
-					event.type = SWT.None;
-					event.doit = false;
-					break;
-				}
-
-				//$FALL-THROUGH$ -- either no modifiers, or just shift.
-			case SWT.TRAVERSE_ARROW_NEXT:
-			case SWT.TRAVERSE_ARROW_PREVIOUS:
-			default:
-				// Let the traversal happen, but clear the incomplete
-				// stroke
-				if (hasIncompleteStroke()) {
-					final KeyStroke[] oldKeyStrokes = getKeySequence()
-							.getKeyStrokes();
-					final int newKeyStrokesLength = oldKeyStrokes.length - 1;
-					if (newKeyStrokesLength >= 1) {
-						final KeyStroke[] newKeyStrokes = new KeyStroke[newKeyStrokesLength];
-						System.arraycopy(oldKeyStrokes, 0, newKeyStrokes, 0,
-								newKeyStrokesLength);
-						setKeySequence(KeySequence.getInstance(newKeyStrokes));
-					} else {
-						setKeySequence(KeySequence.getInstance());
-					}
-				}
-			}
-
-		}
-	}
-
-	/**
-	 * The manager resposible for installing and removing the traversal filter
-	 * when the key sequence entry widget gains and loses focus.
-	 */
-	private class TraversalFilterManager implements FocusListener {
-		/** The managed filter. We only need one instance. */
-		private TraversalFilter filter = new TraversalFilter();
-		
-		private boolean filtering = false;
-
-		/**
-		 * Attaches the global traversal filter.
-		 * 
-		 * @param event
-		 *            Ignored.
-		 */
-		public void focusGained(FocusEvent event) {
-			Display.getCurrent().addFilter(SWT.Traverse, filter);
-			filtering = true;
-		}
-
-		/**
-		 * Detaches the global traversal filter.
-		 * 
-		 * @param event
-		 *            Ignored.
-		 */
-		public void focusLost(FocusEvent event) {
-			Display.getCurrent().removeFilter(SWT.Traverse, filter);
-			filtering = false;
-		}
-		
-		/**
-		 * Remove the traverse filter if we close without focusOut.
-		 */
-		public void dispose() {
-			if (filtering) {
-				Display.getCurrent().removeFilter(SWT.Traverse, filter);
-			}
-		}
-	}
-
-	/**
-	 * A modification listener that makes sure that external events to this
-	 * class (i.e., direct modification of the underlying text) do not break
-	 * this class' view of the world.
-	 */
-	private class UpdateSequenceListener implements ModifyListener {
-		/**
-		 * Handles the modify event on the underlying text widget.
-		 * 
-		 * @param event
-		 *            The triggering event; ignored.
-		 */
-		public void modifyText(ModifyEvent event) {
-			try {
-				// The original sequence.
-				KeySequence originalSequence = getKeySequence();
-
-				// The new sequence drawn from the text.
-				String contents = getText();
-				KeySequence newSequence = KeySequence.getInstance(contents);
-
-				// Check to see if they're the same.
-				if (!originalSequence.equals(newSequence)) {
-					setKeySequence(newSequence);
-				}
-
-			} catch (ParseException e) {
-				// Abort any cut/paste-driven modifications
-				setKeySequence(getKeySequence());
-			}
-		}
-	}
-
-	static {
-		TreeSet trappedKeys = new TreeSet();
-		trappedKeys.add(SWTKeySupport.convertAcceleratorToKeyStroke(SWT.TAB));
-		trappedKeys.add(SWTKeySupport.convertAcceleratorToKeyStroke(SWT.TAB
-				| SWT.SHIFT));
-		trappedKeys.add(SWTKeySupport.convertAcceleratorToKeyStroke(SWT.BS));
-		List trappedKeyList = new ArrayList(trappedKeys);
-		TRAPPED_KEYS = Collections.unmodifiableList(trappedKeyList);
-	}
-
-	/** An empty string instance for use in clearing text values. */
-	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
-
-	/**
-	 * The special integer value for the maximum number of strokes indicating
-	 * that an infinite number should be allowed.
-	 */
-	public static final int INFINITE = -1;
-
-	/**
-	 * The name of the property representing the current key sequence in this
-	 * key sequence widget.
-	 * 
-	 * @since 3.2
-	 */
-	public static final String P_KEY_SEQUENCE = "org.eclipse.jface.bindings.keys.KeySequenceText.KeySequence"; //$NON-NLS-1$
-
-	/**
-	 * The keys trapped by this widget. This list is guaranteed to be roughly
-	 * accurate. Perfection is not possible, as SWT does not export traversal
-	 * keys as constants.
-	 */
-	public static final List TRAPPED_KEYS;
-
-	/**
-	 * The key filter attached to the underlying widget that traps key events.
-	 */
-	private final KeyTrapListener keyFilter = new KeyTrapListener();
-
-	/**
-	 * The text of the key sequence -- containing only the complete key strokes.
-	 */
-	private KeySequence keySequence = KeySequence.getInstance();
-
-	/**
-	 * Those listening to changes to the key sequence in this widget. This value
-	 * may be <code>null</code> if there are no listeners.
-	 */
-	private Collection listeners = null;
-
-	/** The maximum number of key strokes permitted in the sequence. */
-	private int maxStrokes = INFINITE;
-
-	/** The text widget that is wrapped for this class. */
-	private final Text text;
-
-	/**
-	 * The listener that makes sure that the text widget remains up-to-date with
-	 * regards to external modification of the text (e.g., cut & pasting).
-	 */
-	private final UpdateSequenceListener updateSequenceListener = new UpdateSequenceListener();
-
-	/**
-	 * Constructs an instance of <code>KeySequenceTextField</code> with the
-	 * text field to use. If the platform is carbon (MacOS X), then the font is
-	 * set to be the same font used to display accelerators in the menus.
-	 * 
-	 * @param wrappedText
-	 *            The text widget to wrap; must not be <code>null</code>.
-	 */
-	public KeySequenceText(Text wrappedText) {
-		text = wrappedText;
-
-		// Set the font if the platform is carbon.
-		if (Util.isMac()) {
-			// Don't worry about this font name here; it is the official menu
-			// font and point size on the Mac.
-			final Font font = new Font(text.getDisplay(),
-					"Lucida Grande", 13, SWT.NORMAL); //$NON-NLS-1$
-			text.setFont(font);
-			text.addDisposeListener(new DisposeListener() {
-				public void widgetDisposed(DisposeEvent e) {
-					font.dispose();
-				}
-			});
-		}
-
-		// Add the key listener.
-		text.addListener(SWT.KeyUp, keyFilter);
-		text.addListener(SWT.KeyDown, keyFilter);
-
-		final TraversalFilterManager traversalFilterManager = new TraversalFilterManager();
-		text.addFocusListener(traversalFilterManager);
-		text.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				traversalFilterManager.dispose();
-			} 
-		});
-
-		// Add an internal modify listener.
-		text.addModifyListener(updateSequenceListener);
-	}
-
-	/**
-	 * Adds a property change listener to this key sequence widget. It will be
-	 * notified when the key sequence changes.
-	 * 
-	 * @param listener
-	 *            The listener to be notified when changes occur; must not be
-	 *            <code>null</code>.
-	 * @since 3.2
-	 */
-	public final void addPropertyChangeListener(
-			final IPropertyChangeListener listener) {
-		if (listener == null) {
-			return;
-		}
-
-		if (listeners == null) {
-			listeners = new ArrayList(1);
-		}
-
-		listeners.add(listener);
-	}
-
-	/**
-	 * Clears the text field and resets all the internal values.
-	 */
-	public void clear() {
-		final KeySequence oldKeySequence = keySequence;
-		keySequence = KeySequence.getInstance();
-		text.setText(EMPTY_STRING);
-		firePropertyChangeEvent(oldKeySequence);
-	}
-
-	/**
-	 * Removes the key strokes from the list corresponding the selection. If
-	 * <code>allowIncomplete</code>, then invalid key sequences will be
-	 * allowed (i.e., those with incomplete strokes in the non-terminal
-	 * position). Otherwise, incomplete strokes will be removed. This modifies
-	 * <code>keyStrokes</code> in place, and has no effect on the text widget
-	 * this class wraps.
-	 * 
-	 * @param keyStrokes
-	 *            The list of key strokes from which the selection should be
-	 *            removed; must not be <code>null</code>.
-	 * @param allowIncomplete
-	 *            Whether incomplete strokes should be allowed to exist in the
-	 *            list after the deletion.
-	 * @param deletedKeyStrokes
-	 *            The list of keystrokes that were deleted by this operation.
-	 *            Declared as final since it will hold a reference to the new
-	 *            keyStroke array that has deleted the selected keystrokes.
-	 * @return The index at which a subsequent insert should occur. This index
-	 *         only has meaning to the <code>insertStrokeAt</code> method.
-	 */
-	private final int deleteSelection(final KeyStroke[] keyStrokes,
-			final boolean allowIncomplete, final KeyStroke[][] deletedKeyStrokes) {
-		// Get the current selection.
-		Point selection = text.getSelection();
-		int start = selection.x;
-		int end = selection.y;
-
-		/*
-		 * Using the key sequence format method, discover the point at which
-		 * adding key strokes passes or equals the start of the selection. In
-		 * other words, find the first stroke that is part of the selection.
-		 * Keep track of the text range under which the stroke appears (i.e.,
-		 * startTextIndex->string.length() is the first selected stroke).
-		 */
-		String string = new String();
-		List currentStrokes = new ArrayList();
-		int startTextIndex = 0; // keeps track of the start of the stroke
-		final int keyStrokesLength = keyStrokes.length;
-		int i;
-		for (i = 0; (i < keyStrokesLength) && (string.length() < start); i++) {
-			startTextIndex = string.length();
-			currentStrokes.add(keyStrokes[i]);
-			string = KeySequence.getInstance(currentStrokes).format();
-		}
-
-		/*
-		 * If string.length() == start, then the cursor is positioned between
-		 * strokes (i.e., selection is outside of a stroke).
-		 */
-		int startStrokeIndex;
-		if (string.length() == start) {
-			startStrokeIndex = currentStrokes.size();
-		} else {
-			startStrokeIndex = currentStrokes.size() - 1;
-		}
-
-		/*
-		 * Check to see if the cursor is only positioned, rather than actually
-		 * selecting something. We only need to compute the end if there is a
-		 * selection.
-		 */
-		int endStrokeIndex;
-		if (start == end) {
-			// return the current keystrokes, nothing has to be deleted
-			deletedKeyStrokes[0] = keyStrokes;
-			return startStrokeIndex;
-		}
-
-		for (; (i < keyStrokesLength) && (string.length() < end); i++) {
-			currentStrokes.add(keyStrokes[i]);
-			string = KeySequence.getInstance(currentStrokes).format();
-		}
-		endStrokeIndex = currentStrokes.size() - 1;
-		if (endStrokeIndex < 0) {
-			endStrokeIndex = 0;
-		}
-
-		/*
-		 * Remove the strokes that are touched by the selection. Keep track of
-		 * the first stroke removed.
-		 */
-		final int newLength = keyStrokesLength
-				- (endStrokeIndex - startStrokeIndex + 1);
-		deletedKeyStrokes[0] = new KeyStroke[newLength];
-		final KeyStroke startStroke = keyStrokes[startStrokeIndex];
-		KeyStroke keyStrokeResult[] = new KeyStroke[newLength];
-		System.arraycopy(keyStrokes, 0, keyStrokeResult, 0, startStrokeIndex);
-		System.arraycopy(keyStrokes, endStrokeIndex + 1, keyStrokeResult,
-				startStrokeIndex, keyStrokesLength - endStrokeIndex - 1);
-		System.arraycopy(keyStrokeResult, 0, deletedKeyStrokes[0], 0, newLength);
-
-		/*
-		 * Allow the first stroke removed to be replaced by an incomplete
-		 * stroke.
-		 */
-		if (allowIncomplete) {
-			final int modifierKeys = startStroke.getModifierKeys();
-			KeyStroke incompleteStroke = KeyStroke.getInstance(modifierKeys,
-					KeyStroke.NO_KEY);
-			int incompleteStrokeLength = incompleteStroke.format().length();
-			if ((startTextIndex + incompleteStrokeLength) <= start) {
-				final KeyStroke[] added = new KeyStroke[newLength + 1];
-				System.arraycopy(deletedKeyStrokes[0], 0, added, 0,
-						startStrokeIndex);
-				added[startStrokeIndex] = incompleteStroke;
-				System.arraycopy(deletedKeyStrokes[0], startStrokeIndex, added,
-						startStrokeIndex + 1, newLength - startStrokeIndex);
-				deletedKeyStrokes[0] = added;
-			}
-		}
-
-		return startStrokeIndex;
-	}
-
-	/**
-	 * Fires a property change event to all of the listeners.
-	 * 
-	 * @param oldKeySequence
-	 *            The old key sequence; must not be <code>null</code>.
-	 * @since 3.2
-	 */
-	protected final void firePropertyChangeEvent(
-			final KeySequence oldKeySequence) {
-		if (listeners != null) {
-			final Iterator listenerItr = listeners.iterator();
-			final PropertyChangeEvent event = new PropertyChangeEvent(this,
-					P_KEY_SEQUENCE, oldKeySequence, getKeySequence());
-			while (listenerItr.hasNext()) {
-				final IPropertyChangeListener listener = (IPropertyChangeListener) listenerItr
-						.next();
-				listener.propertyChange(event);
-			}
-		}
-	}
-
-	/**
-	 * An accessor for the <code>KeySequence</code> that corresponds to the
-	 * current state of the text field. This includes incomplete strokes.
-	 * 
-	 * @return The key sequence representation; never <code>null</code>.
-	 */
-	public KeySequence getKeySequence() {
-		return keySequence;
-	}
-
-	/**
-	 * An accessor for the underlying text widget's contents.
-	 * 
-	 * @return The text contents of this entry; never <code>null</code>.
-	 */
-	private String getText() {
-		return text.getText();
-	}
-
-	/**
-	 * Tests whether the current key sequence has a stroke with no natural key.
-	 * 
-	 * @return <code>true</code> is there is an incomplete stroke;
-	 *         <code>false</code> otherwise.
-	 */
-	private boolean hasIncompleteStroke() {
-		return !keySequence.isComplete();
-	}
-
-	/**
-	 * Tests whether the current text widget has some text selection.
-	 * 
-	 * @return <code>true</code> if the number of selected characters it
-	 *         greater than zero; <code>false</code> otherwise.
-	 */
-	private boolean hasSelection() {
-		return (text.getSelectionCount() > 0);
-	}
-
-	/**
-	 * Inserts the key stroke at the current insertion point. This does a
-	 * regular delete and insert, as if the key had been pressed.
-	 * 
-	 * @param stroke
-	 *            The key stroke to insert; must not be <code>null</code>.
-	 */
-	public void insert(KeyStroke stroke) {
-		if (!stroke.isComplete()) {
-			return;
-		}
-
-		// Copy the key strokes in the current key sequence.
-		final KeySequence keySequence = getKeySequence();
-		final KeyStroke[] oldKeyStrokes = keySequence.getKeyStrokes();
-		final KeyStroke[] newKeyStrokes;
-		if ((hasIncompleteStroke()) && (!keySequence.isEmpty())) {
-			final int newKeyStrokesLength = oldKeyStrokes.length - 1;
-			newKeyStrokes = new KeyStroke[newKeyStrokesLength];
-			System.arraycopy(oldKeyStrokes, 0, newKeyStrokes, 0,
-					newKeyStrokesLength);
-		} else {
-			newKeyStrokes = oldKeyStrokes;
-		}
-
-		KeyStroke[][] deletedKeyStrokes = new KeyStroke[1][];
-		int index = deleteSelection(newKeyStrokes, false, deletedKeyStrokes);
-		if (index == -1) {
-			index = 0;
-		}
-
-		final KeyStroke[] keyStrokes = insertStrokeAt(newKeyStrokes, stroke, index);
-		keyFilter.clearInsertionIndex();
-		setKeySequence(KeySequence.getInstance(keyStrokes));
-	}
-
-	/**
-	 * Inserts the stroke at the given index in the list of strokes. If the
-	 * stroke currently at that index is incomplete, then it tries to merge the
-	 * two strokes. If merging is a complete failure (unlikely), then it will
-	 * simply overwrite the incomplete stroke. If the stroke at the index is
-	 * complete, then it simply inserts the stroke independently.
-	 * 
-	 * @param keyStrokes
-	 *            The list of key strokes in which the key stroke should be
-	 *            appended; must not be <code>null</code>.
-	 * @param stroke
-	 *            The stroke to insert; should not be <code>null</code>.
-	 * @param index
-	 *            The index at which to insert; must be a valid index into the
-	 *            list of key strokes.
-	 */
-	private final KeyStroke[] insertStrokeAt(final KeyStroke[] keyStrokes,
-			KeyStroke stroke, int index) {
-		final int keyStrokesLength = keyStrokes.length;
-		final KeyStroke currentStroke = (index >= keyStrokesLength) ? null
-				: keyStrokes[index];
-		if ((currentStroke != null) && (!currentStroke.isComplete())) {
-			int modifierKeys = currentStroke.getModifierKeys();
-			final int naturalKey = stroke.getNaturalKey();
-			modifierKeys |= stroke.getModifierKeys();
-			keyStrokes[index] = KeyStroke.getInstance(modifierKeys, naturalKey);
-			return keyStrokes;
-		}
-
-		final KeyStroke[] newKeyStrokes = new KeyStroke[keyStrokesLength + 1];
-		System.arraycopy(keyStrokes, 0, newKeyStrokes, 0, index);
-		newKeyStrokes[index] = stroke;
-		if (index < keyStrokesLength) {
-			System.arraycopy(keyStrokes, index, newKeyStrokes, index + 1,
-					keyStrokesLength-index);
-		}
-		return newKeyStrokes;
-	}
-
-	/**
-	 * Tests whether the cursor is in the last position. This means that the
-	 * selection extends to the last position.
-	 * 
-	 * @return <code>true</code> if the selection extends to the last
-	 *         position; <code>false</code> otherwise.
-	 */
-	private boolean isCursorInLastPosition() {
-		return (text.getSelection().y >= getText().length());
-	}
-
-	/**
-	 * Removes the given listener from this key sequence widget.
-	 * 
-	 * @param listener
-	 *            The listener to be removed; must not be <code>null</code>.
-	 * @since 3.2
-	 */
-	public final void removePropertyChangeListener(
-			final IPropertyChangeListener listener) {
-		if ((listener == null) || (listeners == null)) {
-			return;
-		}
-
-		listeners.remove(listener);
-	}
-
-	/**
-	 * <p>
-	 * A mutator for the key sequence stored within this widget. The text and
-	 * caret position are updated.
-	 * </p>
-	 * <p>
-	 * All sequences are limited to maxStrokes number of strokes in length. If
-	 * there are already that number of strokes, then it does not show
-	 * incomplete strokes, and does not keep track of them.
-	 * </p>
-	 * 
-	 * @param newKeySequence
-	 *            The new key sequence for this widget; may be <code>null</code>
-	 *            if none.
-	 */
-	public void setKeySequence(KeySequence newKeySequence) {
-		final KeySequence oldKeySequence = keySequence;
-
-		if (newKeySequence == null) {
-			text.setText(""); //$NON-NLS-1$
-		} else {
-			keySequence = newKeySequence;			
-		}
-		
-		// Trim any extra strokes.
-		if (maxStrokes != INFINITE) {
-			final KeyStroke[] oldKeyStrokes = keySequence.getKeyStrokes();
-			if (maxStrokes < oldKeyStrokes.length) {
-				final KeyStroke[] newKeyStrokes = new KeyStroke[maxStrokes];
-				System
-						.arraycopy(oldKeyStrokes, 0, newKeyStrokes, 0,
-								maxStrokes);
-				keySequence = KeySequence.getInstance(newKeyStrokes);
-			}
-		}
-
-		// Check to see if the text has changed.
-		String currentString = getText();
-		String newString = keySequence.format();
-		if (!currentString.equals(newString)) {
-			// We need to update the text
-			text.removeModifyListener(updateSequenceListener);
-			text.setText(keySequence.format());
-			text.addModifyListener(updateSequenceListener);
-			text.setSelection(getText().length());
-		}
-
-		firePropertyChangeEvent(oldKeySequence);
-	}
-
-	/**
-	 * Returns the maximum number of strokes that are permitted in this widget
-	 * at one time.
-	 * 
-	 * @return The maximum number of strokes; will be a positive integer or
-	 *         <code>INFINITE</code>.
-	 */
-	public int getKeyStrokeLimit() {
-		return maxStrokes;
-	}
-
-	/**
-	 * A mutator for the maximum number of strokes that are permitted in this
-	 * widget at one time.
-	 * 
-	 * @param keyStrokeLimit
-	 *            The maximum number of strokes; must be a positive integer or
-	 *            <code>INFINITE</code>.
-	 */
-	public void setKeyStrokeLimit(int keyStrokeLimit) {
-		if (keyStrokeLimit > 0 || keyStrokeLimit == INFINITE) {
-			this.maxStrokes = keyStrokeLimit;
-		} else {
-			throw new IllegalArgumentException();
-		}
-
-		// Make sure we are obeying the new limit.
-		setKeySequence(getKeySequence());
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/KeyStroke.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/KeyStroke.java
deleted file mode 100644
index f5e6451..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/KeyStroke.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings.keys;
-
-import java.util.StringTokenizer;
-
-import org.eclipse.jface.bindings.Trigger;
-import org.eclipse.jface.bindings.keys.formatting.KeyFormatterFactory;
-import org.eclipse.jface.util.Util;
-
-/**
- * <p>
- * A <code>KeyStroke</code> is defined as an optional set of modifier keys
- * followed optionally by a natural key. A <code>KeyStroke</code> is said to
- * be complete if it contains a natural key. A natural key is any Unicode
- * character (e.g., "backspace", etc.), any character belonging to a natural
- * language (e.g., "A", "1", "[", etc.), or any special control character
- * specific to computers (e.g., "F10", "PageUp", etc.).
- * </p>
- * <p>
- * All <code>KeyStroke</code> objects have a formal string representation
- * available via the <code>toString()</code> method. There are a number of
- * methods to get instances of <code>KeyStroke</code> objects, including one
- * which can parse this formal string representation.
- * </p>
- * <p>
- * All <code>KeyStroke</code> objects, via the <code>format()</code> method,
- * provide a version of their formal string representation translated by
- * platform and locale, suitable for display to a user.
- * </p>
- * <p>
- * <code>KeyStroke</code> objects are immutable. Clients are not permitted to
- * extend this class.
- * </p>
- * 
- * @since 3.1
- */
-public final class KeyStroke extends Trigger implements Comparable {
-
-	/**
-	 * The delimiter between multiple keys in a single key strokes -- expressed
-	 * in the formal key stroke grammar. This is not to be displayed to the
-	 * user. It is only intended as an internal representation.
-	 */
-	public static final String KEY_DELIMITER = "\u002B"; //$NON-NLS-1$
-
-	/**
-	 * The set of delimiters for <code>Key</code> objects allowed during
-	 * parsing of the formal string representation.
-	 */
-	public static final String KEY_DELIMITERS = KEY_DELIMITER;
-
-	/**
-	 * The representation for no key.
-	 */
-	public static final int NO_KEY = 0;
-
-	/**
-	 * Creates an instance of <code>KeyStroke</code> given a natural key.
-	 * 
-	 * @param naturalKey
-	 *            the natural key. The format of this integer is defined by
-	 *            whichever widget toolkit you are using; <code>NO_KEY</code>
-	 *            always means no natural key.
-	 * @return a key stroke. This key stroke will have no modifier keys.
-	 *         Guaranteed not to be <code>null</code>.
-	 * @see SWTKeySupport
-	 */
-	public static final KeyStroke getInstance(final int naturalKey) {
-		return new KeyStroke(NO_KEY, naturalKey);
-	}
-
-	/**
-	 * Creates an instance of <code>KeyStroke</code> given a set of modifier keys
-	 * and a natural key.
-	 * 
-	 * @param modifierKeys
-	 *            the modifier keys. The format of this integer is defined by
-	 *            whichever widget toolkit you are using; <code>NO_KEY</code>
-	 *            always means no modifier keys.
-	 * @param naturalKey
-	 *            the natural key. The format of this integer is defined by
-	 *            whichever widget toolkit you are using; <code>NO_KEY</code>
-	 *            always means no natural key.
-	 * @return a key stroke. Guaranteed not to be <code>null</code>.
-	 * @see SWTKeySupport
-	 */
-	public static final KeyStroke getInstance(final int modifierKeys,
-			final int naturalKey) {
-		return new KeyStroke(modifierKeys, naturalKey);
-	}
-
-	/**
-	 * Creates an instance of <code>KeyStroke</code> by parsing a given a formal
-	 * string representation.
-	 * 
-	 * @param string
-	 *            the formal string representation to parse.
-	 * @return a key stroke. Guaranteed not to be <code>null</code>.
-	 * @throws ParseException
-	 *             if the given formal string representation could not be parsed
-	 *             to a valid key stroke.
-	 */
-	public static final KeyStroke getInstance(final String string)
-			throws ParseException {
-		if (string == null) {
-			throw new NullPointerException("Cannot parse a null string"); //$NON-NLS-1$
-		}
-
-		final IKeyLookup lookup = KeyLookupFactory.getDefault();
-		int modifierKeys = NO_KEY;
-		int naturalKey = NO_KEY;
-		final StringTokenizer stringTokenizer = new StringTokenizer(string,
-				KEY_DELIMITERS, true);
-		int i = 0;
-
-		while (stringTokenizer.hasMoreTokens()) {
-			String token = stringTokenizer.nextToken();
-
-			if (i % 2 == 0) {
-				if (stringTokenizer.hasMoreTokens()) {
-					token = token.toUpperCase();
-					final int modifierKey = lookup.formalModifierLookup(token);
-					if (modifierKey == NO_KEY) {
-						throw new ParseException(
-								"Cannot create key stroke with duplicate or non-existent modifier key: " //$NON-NLS-1$
-										+ token);
-					}
-
-					modifierKeys |= modifierKey;
-
-				} else if (token.length() == 1) {
-					naturalKey = token.charAt(0);
-
-				} else {
-					token = token.toUpperCase();
-					naturalKey = lookup.formalKeyLookup(token);
-				}
-			}
-
-			i++;
-		}
-
-		return new KeyStroke(modifierKeys, naturalKey);
-	}
-
-	/**
-	 * An integer representation of the modifier keys; <code>NO_KEY</code>
-	 * means that there is no modifier key.
-	 */
-	private final int modifierKeys;
-
-	/**
-	 * The natural key for this key stroke. This value is <code>NO_KEY</code>
-	 * if the key stroke is incomplete (i.e., has no natural key).
-	 */
-	private final int naturalKey;
-
-	/**
-	 * Constructs an instance of <code>KeyStroke</code> given a set of
-	 * modifier keys and a natural key.
-	 * 
-	 * @param modifierKeys
-	 *            the modifier keys. The format of this integer is defined by
-	 *            whichever widget toolkit you are using; <code>NO_KEY</code>
-	 *            always means no modifier keys.
-	 * @param naturalKey
-	 *            the natural key. The format of this integer is defined by
-	 *            whichever widget toolkit you are using; <code>NO_KEY</code>
-	 *            always means no natural key.
-	 * @see SWTKeySupport
-	 */
-	private KeyStroke(final int modifierKeys, final int naturalKey) {
-		this.modifierKeys = modifierKeys;
-		this.naturalKey = naturalKey;
-	}
-
-    /*
-     * (non-Javadoc)
-     * 
-	 * @see java.lang.Comparable#compareTo(java.lang.Object)
-	 */
-	public final int compareTo(final Object object) {
-		final KeyStroke keyStroke = (KeyStroke) object;
-		int compareTo = Util.compare(modifierKeys, keyStroke.modifierKeys);
-
-		if (compareTo == 0) {
-			compareTo = Util.compare(naturalKey, keyStroke.naturalKey);
-		}
-
-		return compareTo;
-	}
-
-    /*
-     * (non-Javadoc)
-     * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public final boolean equals(final Object object) {
-		if (!(object instanceof KeyStroke)) {
-			return false;
-		}
-
-		final KeyStroke keyStroke = (KeyStroke) object;
-		if (modifierKeys != keyStroke.modifierKeys) {
-			return false;
-		}
-
-		return (naturalKey == keyStroke.naturalKey);
-	}
-
-	/**
-	 * Formats this key stroke into the current default look.
-	 * 
-	 * @return A string representation for this key stroke using the default
-	 *         look; never <code>null</code>.
-	 */
-	public final String format() {
-		return KeyFormatterFactory.getDefault().format(this);
-	}
-
-	/**
-	 * Returns the modifier keys for this key stroke.
-	 * 
-	 * @return the bit mask of modifier keys; <code>NO_KEY</code> means that
-	 *         there is no modifier key.
-	 */
-	public final int getModifierKeys() {
-		return modifierKeys;
-	}
-
-	/**
-	 * Returns the natural key for this key stroke.
-	 * 
-	 * @return The natural key for this key stroke. This value is
-	 *         <code>NO_KEY</code> if the key stroke is incomplete (i.e., has
-	 *         no natural key).
-	 */
-	public final int getNaturalKey() {
-		return naturalKey;
-	}
-
-    /*
-     * (non-Javadoc)
-     * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	public final int hashCode() {
-		return modifierKeys << 4 + naturalKey;
-	}
-
-	/**
-	 * Returns whether or not this key stroke is complete. Key strokes are
-	 * complete iff they have a natural key which is not <code>NO_KEY</code>.
-	 * 
-	 * @return <code>true</code>, iff the key stroke is complete.
-	 */
-	public final boolean isComplete() {
-		return (naturalKey != NO_KEY);
-	}
-
-	/**
-	 * Returns the formal string representation for this key stroke.
-	 * 
-	 * @return The formal string representation for this key stroke. Guaranteed
-	 *         not to be <code>null</code>.
-	 * @see java.lang.Object#toString()
-	 */
-	public final String toString() {
-		return KeyFormatterFactory.getFormalKeyFormatter().format(this);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/ParseException.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/ParseException.java
deleted file mode 100644
index 920ed15..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/ParseException.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings.keys;
-
-/**
- * <p>
- * An exception indicating problems while parsing formal string representations
- * of either <code>KeyStroke</code> or <code>KeySequence</code> objects.
- * </p>
- * <p>
- * <code>ParseException</code> objects are immutable. Clients are not
- * permitted to extend this class.
- * </p>
- * 
- * @since 3.1
- */
-public final class ParseException extends Exception {
-
-    /**
-     * Generated serial version UID for this class.
-     * 
-     * @since 3.1
-     */
-    private static final long serialVersionUID = 3257009864814376241L;
-
-    /**
-     * Constructs a <code>ParseException</code> with the specified detail
-     * message.
-     * 
-     * @param s
-     *            the detail message.
-     */
-    public ParseException(final String s) {
-        super(s);
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/SWTKeyLookup.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/SWTKeyLookup.java
deleted file mode 100644
index d63a441..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/SWTKeyLookup.java
+++ /dev/null
@@ -1,370 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.bindings.keys;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.SWT;
-
-/**
- * <p>
- * A look-up table for the formal grammar for keys, and the integer values they
- * represent. This look-up table is hard-coded to use SWT representations. By
- * replacing this class (and
- * {@link org.eclipse.jface.bindings.keys.SWTKeySupport}), you can remove the
- * dependency on SWT.
- * </p>
- * 
- * @since 3.1
- * @see org.eclipse.jface.bindings.keys.KeyLookupFactory
- */
-public final class SWTKeyLookup implements IKeyLookup {
-
-	/**
-	 * The look-up table for modifier keys. This is a map of formal name (<code>String</code>)
-	 * to integer value (<code>Integer</code>).
-	 */
-	private final Map modifierKeyTable = new HashMap();
-
-	/**
-	 * The look-up table for formal names. This is a map of integer value (<code>Integer</code>)
-	 * to formal name (<code>String</code>).
-	 */
-	private final Map nameTable = new HashMap();
-
-	/**
-	 * The look-up table for natural keys. This is a map of formal name (<code>String</code>)
-	 * to integer value (<code>Integer</code>).
-	 */
-	private final Map naturalKeyTable = new HashMap();
-
-	/**
-	 * Constructs a new look-up class. This should only be done by the look-up
-	 * factory.
-	 * 
-	 * @see KeyLookupFactory
-	 */
-	SWTKeyLookup() {
-		final Integer alt = new Integer(SWT.ALT);
-		final Integer command = new Integer(SWT.COMMAND);
-		final Integer ctrl = new Integer(SWT.CTRL);
-		final Integer shift = new Integer(SWT.SHIFT);
-		modifierKeyTable.put(ALT_NAME, alt);
-		nameTable.put(alt, ALT_NAME);
-		modifierKeyTable.put(COMMAND_NAME, command);
-		nameTable.put(command, COMMAND_NAME);
-		modifierKeyTable.put(CTRL_NAME, ctrl);
-		nameTable.put(ctrl, CTRL_NAME);
-		modifierKeyTable.put(SHIFT_NAME, shift);
-		nameTable.put(shift, SHIFT_NAME);
-		modifierKeyTable.put(M1_NAME,
-				Util.isMac() ? command : ctrl);
-		modifierKeyTable.put(M2_NAME, shift);
-		modifierKeyTable.put(M3_NAME, alt);
-		modifierKeyTable.put(M4_NAME, Util.isMac() ? ctrl 
-				: command);
-
-		final Integer arrowDown = new Integer(SWT.ARROW_DOWN);
-		naturalKeyTable.put(ARROW_DOWN_NAME, arrowDown);
-		nameTable.put(arrowDown, ARROW_DOWN_NAME);
-		final Integer arrowLeft = new Integer(SWT.ARROW_LEFT);
-		naturalKeyTable.put(ARROW_LEFT_NAME, arrowLeft);
-		nameTable.put(arrowLeft, ARROW_LEFT_NAME);
-		final Integer arrowRight = new Integer(SWT.ARROW_RIGHT);
-		naturalKeyTable.put(ARROW_RIGHT_NAME, arrowRight);
-		nameTable.put(arrowRight, ARROW_RIGHT_NAME);
-		final Integer arrowUp = new Integer(SWT.ARROW_UP);
-		naturalKeyTable.put(ARROW_UP_NAME, arrowUp);
-		nameTable.put(arrowUp, ARROW_UP_NAME);
-		final Integer breakKey = new Integer(SWT.BREAK);
-		naturalKeyTable.put(BREAK_NAME, breakKey);
-		nameTable.put(breakKey, BREAK_NAME);
-		final Integer bs = new Integer(SWT.BS);
-		naturalKeyTable.put(BS_NAME, bs);
-		nameTable.put(bs, BS_NAME);
-		naturalKeyTable.put(BACKSPACE_NAME, bs);
-		final Integer capsLock = new Integer(SWT.CAPS_LOCK);
-		naturalKeyTable.put(CAPS_LOCK_NAME, capsLock);
-		nameTable.put(capsLock, CAPS_LOCK_NAME);
-		final Integer cr = new Integer(SWT.CR);
-		naturalKeyTable.put(CR_NAME, cr);
-		nameTable.put(cr, CR_NAME);
-		naturalKeyTable.put(ENTER_NAME, cr);
-		naturalKeyTable.put(RETURN_NAME, cr);
-		final Integer del = new Integer(SWT.DEL);
-		naturalKeyTable.put(DEL_NAME, del);
-		nameTable.put(del, DEL_NAME);
-		naturalKeyTable.put(DELETE_NAME, del);
-		final Integer end = new Integer(SWT.END);
-		naturalKeyTable.put(END_NAME, end);
-		nameTable.put(end, END_NAME);
-		final Integer esc = new Integer(SWT.ESC);
-		naturalKeyTable.put(ESC_NAME, esc);
-		nameTable.put(esc, ESC_NAME);
-		naturalKeyTable.put(ESCAPE_NAME, esc);
-		final Integer f1 = new Integer(SWT.F1);
-		naturalKeyTable.put(F1_NAME, f1);
-		nameTable.put(f1, F1_NAME);
-		final Integer f2 = new Integer(SWT.F2);
-		naturalKeyTable.put(F2_NAME, new Integer(SWT.F2));
-		nameTable.put(f2, F2_NAME);
-		final Integer f3 = new Integer(SWT.F3);
-		naturalKeyTable.put(F3_NAME, new Integer(SWT.F3));
-		nameTable.put(f3, F3_NAME);
-		final Integer f4 = new Integer(SWT.F4);
-		naturalKeyTable.put(F4_NAME, new Integer(SWT.F4));
-		nameTable.put(f4, F4_NAME);
-		final Integer f5 = new Integer(SWT.F5);
-		naturalKeyTable.put(F5_NAME, new Integer(SWT.F5));
-		nameTable.put(f5, F5_NAME);
-		final Integer f6 = new Integer(SWT.F6);
-		naturalKeyTable.put(F6_NAME, new Integer(SWT.F6));
-		nameTable.put(f6, F6_NAME);
-		final Integer f7 = new Integer(SWT.F7);
-		naturalKeyTable.put(F7_NAME, new Integer(SWT.F7));
-		nameTable.put(f7, F7_NAME);
-		final Integer f8 = new Integer(SWT.F8);
-		naturalKeyTable.put(F8_NAME, new Integer(SWT.F8));
-		nameTable.put(f8, F8_NAME);
-		final Integer f9 = new Integer(SWT.F9);
-		naturalKeyTable.put(F9_NAME, new Integer(SWT.F9));
-		nameTable.put(f9, F9_NAME);
-		final Integer f10 = new Integer(SWT.F10);
-		naturalKeyTable.put(F10_NAME, new Integer(SWT.F10));
-		nameTable.put(f10, F10_NAME);
-		final Integer f11 = new Integer(SWT.F11);
-		naturalKeyTable.put(F11_NAME, new Integer(SWT.F11));
-		nameTable.put(f11, F11_NAME);
-		final Integer f12 = new Integer(SWT.F12);
-		naturalKeyTable.put(F12_NAME, new Integer(SWT.F12));
-		nameTable.put(f12, F12_NAME);
-		final Integer f13 = new Integer(SWT.F13);
-		naturalKeyTable.put(F13_NAME, new Integer(SWT.F13));
-		nameTable.put(f13, F13_NAME);
-		final Integer f14 = new Integer(SWT.F14);
-		naturalKeyTable.put(F14_NAME, new Integer(SWT.F14));
-		nameTable.put(f14, F14_NAME);
-		final Integer f15 = new Integer(SWT.F15);
-		naturalKeyTable.put(F15_NAME, new Integer(SWT.F15));
-		nameTable.put(f15, F15_NAME);
-		final Integer ff = new Integer(12); // ASCII 0x0C
-		naturalKeyTable.put(FF_NAME, ff);
-		nameTable.put(ff, FF_NAME);
-		final Integer home = new Integer(SWT.HOME);
-		naturalKeyTable.put(HOME_NAME, home);
-		nameTable.put(home, HOME_NAME);
-		final Integer insert = new Integer(SWT.INSERT);
-		naturalKeyTable.put(INSERT_NAME, insert);
-		nameTable.put(insert, INSERT_NAME);
-		final Integer lf = new Integer(SWT.LF);
-		naturalKeyTable.put(LF_NAME, lf);
-		nameTable.put(lf, LF_NAME);
-		final Integer nul = new Integer(SWT.NULL);
-		naturalKeyTable.put(NUL_NAME, nul);
-		nameTable.put(nul, NUL_NAME);
-		final Integer numLock = new Integer(SWT.NUM_LOCK);
-		naturalKeyTable.put(NUM_LOCK_NAME, numLock);
-		nameTable.put(numLock, NUM_LOCK_NAME);
-		final Integer keypad0 = new Integer(SWT.KEYPAD_0);
-		naturalKeyTable.put(NUMPAD_0_NAME, keypad0);
-		nameTable.put(keypad0, NUMPAD_0_NAME);
-		final Integer keypad1 = new Integer(SWT.KEYPAD_1);
-		naturalKeyTable.put(NUMPAD_1_NAME, keypad1);
-		nameTable.put(keypad1, NUMPAD_1_NAME);
-		final Integer keypad2 = new Integer(SWT.KEYPAD_2);
-		naturalKeyTable.put(NUMPAD_2_NAME, keypad2);
-		nameTable.put(keypad2, NUMPAD_2_NAME);
-		final Integer keypad3 = new Integer(SWT.KEYPAD_3);
-		naturalKeyTable.put(NUMPAD_3_NAME, keypad3);
-		nameTable.put(keypad3, NUMPAD_3_NAME);
-		final Integer keypad4 = new Integer(SWT.KEYPAD_4);
-		naturalKeyTable.put(NUMPAD_4_NAME, keypad4);
-		nameTable.put(keypad4, NUMPAD_4_NAME);
-		final Integer keypad5 = new Integer(SWT.KEYPAD_5);
-		naturalKeyTable.put(NUMPAD_5_NAME, keypad5);
-		nameTable.put(keypad5, NUMPAD_5_NAME);
-		final Integer keypad6 = new Integer(SWT.KEYPAD_6);
-		naturalKeyTable.put(NUMPAD_6_NAME, keypad6);
-		nameTable.put(keypad6, NUMPAD_6_NAME);
-		final Integer keypad7 = new Integer(SWT.KEYPAD_7);
-		naturalKeyTable.put(NUMPAD_7_NAME, keypad7);
-		nameTable.put(keypad7, NUMPAD_7_NAME);
-		final Integer keypad8 = new Integer(SWT.KEYPAD_8);
-		naturalKeyTable.put(NUMPAD_8_NAME, keypad8);
-		nameTable.put(keypad8, NUMPAD_8_NAME);
-		final Integer keypad9 = new Integer(SWT.KEYPAD_9);
-		naturalKeyTable.put(NUMPAD_9_NAME, keypad9);
-		nameTable.put(keypad9, NUMPAD_9_NAME);
-		final Integer keypadAdd = new Integer(SWT.KEYPAD_ADD);
-		naturalKeyTable.put(NUMPAD_ADD_NAME, keypadAdd);
-		nameTable.put(keypadAdd, NUMPAD_ADD_NAME);
-		final Integer keypadDecimal = new Integer(SWT.KEYPAD_DECIMAL);
-		naturalKeyTable.put(NUMPAD_DECIMAL_NAME, keypadDecimal);
-		nameTable.put(keypadDecimal, NUMPAD_DECIMAL_NAME);
-		final Integer keypadDivide = new Integer(SWT.KEYPAD_DIVIDE);
-		naturalKeyTable.put(NUMPAD_DIVIDE_NAME, keypadDivide);
-		nameTable.put(keypadDivide, NUMPAD_DIVIDE_NAME);
-		final Integer keypadCr = new Integer(SWT.KEYPAD_CR);
-		naturalKeyTable.put(NUMPAD_ENTER_NAME, keypadCr);
-		nameTable.put(keypadCr, NUMPAD_ENTER_NAME);
-		final Integer keypadEqual = new Integer(SWT.KEYPAD_EQUAL);
-		naturalKeyTable.put(NUMPAD_EQUAL_NAME, keypadEqual);
-		nameTable.put(keypadEqual, NUMPAD_EQUAL_NAME);
-		final Integer keypadMultiply = new Integer(SWT.KEYPAD_MULTIPLY);
-		naturalKeyTable.put(NUMPAD_MULTIPLY_NAME, keypadMultiply);
-		nameTable.put(keypadMultiply, NUMPAD_MULTIPLY_NAME);
-		final Integer keypadSubtract = new Integer(SWT.KEYPAD_SUBTRACT);
-		naturalKeyTable.put(NUMPAD_SUBTRACT_NAME, keypadSubtract);
-		nameTable.put(keypadSubtract, NUMPAD_SUBTRACT_NAME);
-		final Integer pageDown = new Integer(SWT.PAGE_DOWN);
-		naturalKeyTable.put(PAGE_DOWN_NAME, pageDown);
-		nameTable.put(pageDown, PAGE_DOWN_NAME);
-		final Integer pageUp = new Integer(SWT.PAGE_UP);
-		naturalKeyTable.put(PAGE_UP_NAME, pageUp);
-		nameTable.put(pageUp, PAGE_UP_NAME);
-		final Integer pause = new Integer(SWT.PAUSE);
-		naturalKeyTable.put(PAUSE_NAME, pause);
-		nameTable.put(pause, PAUSE_NAME);
-		final Integer printScreen = new Integer(SWT.PRINT_SCREEN);
-		naturalKeyTable.put(PRINT_SCREEN_NAME, printScreen);
-		nameTable.put(printScreen, PRINT_SCREEN_NAME);
-		final Integer scrollLock = new Integer(SWT.SCROLL_LOCK);
-		naturalKeyTable.put(SCROLL_LOCK_NAME, scrollLock);
-		nameTable.put(scrollLock, SCROLL_LOCK_NAME);
-		final Integer space = new Integer(' ');
-		naturalKeyTable.put(SPACE_NAME, space);
-		nameTable.put(space, SPACE_NAME);
-		final Integer tab = new Integer(SWT.TAB);
-		naturalKeyTable.put(TAB_NAME, tab);
-		nameTable.put(tab, TAB_NAME);
-		final Integer vt = new Integer(11); // ASCII 0x0B
-		naturalKeyTable.put(VT_NAME, vt);
-		nameTable.put(vt, VT_NAME);
-	}
-
-	/*
-     * (non-Javadoc)
-     * 
- 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#formalKeyLookup(java.lang.String)
- 	 * 
-	 */	
-	public final int formalKeyLookup(final String name) {
-		final Object value = naturalKeyTable.get(name);
-		if (value instanceof Integer) {
-			return ((Integer) value).intValue();
-		}
-		
-		if (name.length() > 0) {
-			throw new IllegalArgumentException("Unrecognized formal key name: " //$NON-NLS-1$
-					+ name);
-		}
-
-		return name.charAt(0);
-	}
-
-	/*
-     * (non-Javadoc)
-     * 
- 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#formalKeyLookupInteger(java.lang.String)
- 	 * 
-	 */	
-	public final Integer formalKeyLookupInteger(final String name) {
-		final Object value = naturalKeyTable.get(name);
-		if (value instanceof Integer) {
-			return (Integer) value;
-		}
-
-		return new Integer(name.charAt(0));
-	}
-
-	/*
-     * (non-Javadoc)
-     * 
- 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#formalModifierLookup(java.lang.String)
- 	 * 
-	 */	
-	public final int formalModifierLookup(final String name) {
-		final Object value = modifierKeyTable.get(name);
-		if (value instanceof Integer) {
-			return ((Integer) value).intValue();
-		}
-
-		return 0;
-	}
-
-	/*
-     * (non-Javadoc)
-     * 
- 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#formalNameLookup(int)
- 	 * 
-	 */	
-	public final String formalNameLookup(final int key) {
-		final Integer keyObject = new Integer(key);
-		final Object value = nameTable.get(keyObject);
-		if (value instanceof String) {
-			return (String) value;
-		}
-
-		return Util.ZERO_LENGTH_STRING + ((char) key);
-	}
-
-	/*
-     * (non-Javadoc)
-     * 
- 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#getAlt()
- 	 * 
-	 */	
-	public final int getAlt() {
-		return SWT.ALT;
-	}
-
-	/*
-     * (non-Javadoc)
-     * 
- 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#getCommand()
- 	 * 
-	 */	
-	public final int getCommand() {
-		return SWT.COMMAND;
-	}
-
-	/*
-     * (non-Javadoc)
-     * 
- 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#getCtrl()
- 	 * 
-	 */	
-	public final int getCtrl() {
-		return SWT.CTRL;
-	}
-
-	/*
-     * (non-Javadoc)
-     * 
- 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#getShift()
- 	 * 
-	 */	
-	public final int getShift() {
-		return SWT.SHIFT;
-	}
-
-	/*
-     * (non-Javadoc)
-     * 
- 	 * @see org.eclipse.jface.bindings.keys.IKeyLookup#isModifierKey(int)
- 	 * 
-	 */	
-	public final boolean isModifierKey(final int key) {
-		return ((key & SWT.MODIFIER_MASK) != 0);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/SWTKeySupport.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/SWTKeySupport.java
deleted file mode 100644
index c5429b9..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/SWTKeySupport.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings.keys;
-
-import org.eclipse.jface.bindings.keys.formatting.IKeyFormatter;
-import org.eclipse.jface.bindings.keys.formatting.NativeKeyFormatter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Event;
-
-/**
- * <p>
- * A utility class for converting SWT events into key strokes.
- * </p>
- * 
- * @since 3.1
- */
-public final class SWTKeySupport {
-
-	/**
-	 * A formatter that displays key sequences in a style native to the
-	 * platform.
-	 */
-	private static final IKeyFormatter NATIVE_FORMATTER = new NativeKeyFormatter();
-
-	/**
-	 * Given an SWT accelerator value, provide the corresponding key stroke.
-	 * 
-	 * @param accelerator
-	 *            The accelerator to convert; should be a valid SWT accelerator
-	 *            value.
-	 * @return The equivalent key stroke; never <code>null</code>.
-	 */
-	public static final KeyStroke convertAcceleratorToKeyStroke(int accelerator) {
-		final int modifierKeys = accelerator & SWT.MODIFIER_MASK;
-		final int naturalKey;
-		if (accelerator == modifierKeys) {
-			naturalKey = KeyStroke.NO_KEY;
-		} else {
-			naturalKey = accelerator - modifierKeys;
-		}
-		
-		return KeyStroke.getInstance(modifierKeys, naturalKey);
-	}
-
-	/**
-	 * <p>
-	 * Converts the given event into an SWT accelerator value -- considering the
-	 * modified character with the shift modifier. This is the third accelerator
-	 * value that should be checked when processing incoming key events.
-	 * </p>
-	 * <p>
-	 * For example, on a standard US keyboard, "Ctrl+Shift+5" would be viewed as
-	 * "Ctrl+Shift+%".
-	 * </p>
-	 * 
-	 * @param event
-	 *            The event to be converted; must not be <code>null</code>.
-	 * @return The combination of the state mask and the unmodified character.
-	 */
-	public static final int convertEventToModifiedAccelerator(final Event event) {
-		int modifiers = event.stateMask & SWT.MODIFIER_MASK;
-		char character = topKey(event);
-		return modifiers + toUpperCase(character);
-	}
-
-	/**
-	 * <p>
-	 * Converts the given event into an SWT accelerator value -- considering the
-	 * unmodified character with all modifier keys. This is the first
-	 * accelerator value that should be checked when processing incoming key
-	 * events. However, all alphabetic characters are considered as their
-	 * uppercase equivalents.
-	 * </p>
-	 * <p>
-	 * For example, on a standard US keyboard, "Ctrl+Shift+5" would be viewed as
-	 * "Ctrl+Shift+5".
-	 * </p>
-	 * 
-	 * @param event
-	 *            The event to be converted; must not be <code>null</code>.
-	 * @return The combination of the state mask and the unmodified character.
-	 */
-	public static final int convertEventToUnmodifiedAccelerator(
-			final Event event) {
-		return convertEventToUnmodifiedAccelerator(event.stateMask,
-				event.keyCode);
-	}
-
-	/**
-	 * <p>
-	 * Converts the given state mask and key code into an SWT accelerator value --
-	 * considering the unmodified character with all modifier keys. All
-	 * alphabetic characters are considered as their uppercase equivalents.
-	 * </p>
-	 * <p>
-	 * For example, on a standard US keyboard, "Ctrl+Shift+5" would be viewed as
-	 * "Ctrl+Shift+5".
-	 * </p>
-	 * 
-	 * @param stateMask
-	 *            The integer mask of modifiers keys depressed when this was
-	 *            pressed.
-	 * @param keyCode
-	 *            The key that was pressed, before being modified.
-	 * @return The combination of the state mask and the unmodified character.
-	 */
-	private static final int convertEventToUnmodifiedAccelerator(
-			final int stateMask, final int keyCode) {
-		int modifiers = stateMask & SWT.MODIFIER_MASK;
-		int character = keyCode;
-		return modifiers + toUpperCase(character);
-	}
-
-	/**
-	 * <p>
-	 * Converts the given event into an SWT accelerator value -- considering the
-	 * unmodified character with all modifier keys. This is the first
-	 * accelerator value that should be checked. However, all alphabetic
-	 * characters are considered as their uppercase equivalents.
-	 * </p>
-	 * <p>
-	 * For example, on a standard US keyboard, "Ctrl+Shift+5" would be viewed as
-	 * "Ctrl+%".
-	 * </p>
-	 * 
-	 * @param event
-	 *            The event to be converted; must not be <code>null</code>.
-	 * @return The combination of the state mask and the unmodified character.
-	 */
-	public static final int convertEventToUnmodifiedAccelerator(
-			final KeyEvent event) {
-		return convertEventToUnmodifiedAccelerator(event.stateMask,
-				event.keyCode);
-	}
-
-	/**
-	 * Converts the given event into an SWT accelerator value -- considering the
-	 * modified character without the shift modifier. This is the second
-	 * accelerator value that should be checked when processing incoming key
-	 * events. Key strokes with alphabetic natural keys are run through
-	 * <code>convertEventToUnmodifiedAccelerator</code>.
-	 * 
-	 * @param event
-	 *            The event to be converted; must not be <code>null</code>.
-	 * @return The combination of the state mask without shift, and the modified
-	 *         character.
-	 */
-	public static final int convertEventToUnshiftedModifiedAccelerator(
-			final Event event) {
-		// Disregard alphabetic key strokes.
-		if (Character.isLetter((char) event.keyCode)) {
-			return convertEventToUnmodifiedAccelerator(event);
-		}
-
-		int modifiers = event.stateMask & (SWT.MODIFIER_MASK ^ SWT.SHIFT);
-		char character = topKey(event);
-		return modifiers + toUpperCase(character);
-	}
-
-	/**
-	 * Given a key stroke, this method provides the equivalent SWT accelerator
-	 * value. The functional inverse of
-	 * <code>convertAcceleratorToKeyStroke</code>.
-	 * 
-	 * @param keyStroke
-	 *            The key stroke to convert; must not be <code>null</code>.
-	 * @return The SWT accelerator value
-	 */
-	public static final int convertKeyStrokeToAccelerator(
-			final KeyStroke keyStroke) {
-		return keyStroke.getModifierKeys() + keyStroke.getNaturalKey();
-	}
-
-	/**
-	 * Provides an instance of <code>IKeyFormatter</code> appropriate for the
-	 * current instance.
-	 * 
-	 * @return an instance of <code>IKeyFormatter</code> appropriate for the
-	 *         current instance; never <code>null</code>.
-	 */
-	public static IKeyFormatter getKeyFormatterForPlatform() {
-		return NATIVE_FORMATTER;
-	}
-
-	/**
-	 * Makes sure that a fully-modified character is converted to the normal
-	 * form. This means that "Ctrl+" key strokes must reverse the modification
-	 * caused by control-escaping. Also, all lower case letters are converted to
-	 * uppercase.
-	 * 
-	 * @param event
-	 *            The event from which the fully-modified character should be
-	 *            pulled.
-	 * @return The modified character, uppercase and without control-escaping.
-	 */
-	private static final char topKey(final Event event) {
-		char character = event.character;
-		boolean ctrlDown = (event.stateMask & SWT.CTRL) != 0;
-
-		if (ctrlDown && event.character != event.keyCode
-				&& event.character < 0x20 
-				&& (event.keyCode & SWT.KEYCODE_BIT) == 0) {
-			character += 0x40;
-		}
-
-		return character;
-	}
-
-	/**
-	 * Makes the given character uppercase if it is a letter.
-	 * 
-	 * @param keyCode
-	 *            The character to convert.
-	 * @return The uppercase equivalent, if any; otherwise, the character
-	 *         itself.
-	 */
-	private static final int toUpperCase(int keyCode) {
-		// Will this key code be truncated?
-		if (keyCode > 0xFFFF) {
-			return keyCode;
-		}
-
-		// Downcast in safety. Only make characters uppercase.
-		final char character = (char) keyCode;
-		return Character.isLetter(character) ? Character.toUpperCase(character)
-				: keyCode;
-	}
-
-	/**
-	 * This class should never be instantiated.
-	 */
-	protected SWTKeySupport() {
-		// This class should never be instantiated.
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/AbstractKeyFormatter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/AbstractKeyFormatter.java
deleted file mode 100644
index c609ec3..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/AbstractKeyFormatter.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings.keys.formatting;
-
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.ResourceBundle;
-import java.util.Set;
-
-import org.eclipse.jface.bindings.keys.IKeyLookup;
-import org.eclipse.jface.bindings.keys.KeyLookupFactory;
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.jface.util.Util;
-
-/**
- * <p>
- * An abstract implementation of a key formatter that provides a lot of common
- * key formatting functionality. It is recommended that implementations of
- * <code>IKeyFormatter</code> subclass from here, rather than implementing
- * <code>IKeyFormatter</code> directly.
- * </p>
- * 
- * @since 3.1
- */
-public abstract class AbstractKeyFormatter implements IKeyFormatter {
-
-	/**
-	 * The key for the delimiter between keys. This is used in the
-	 * internationalization bundles.
-	 */
-	protected static final String KEY_DELIMITER_KEY = "KEY_DELIMITER"; //$NON-NLS-1$
-
-	/**
-	 * The key for the delimiter between key strokes. This is used in the
-	 * internationalization bundles.
-	 */
-	protected static final String KEY_STROKE_DELIMITER_KEY = "KEY_STROKE_DELIMITER"; //$NON-NLS-1$
-
-	/**
-	 * An empty integer array that can be used in
-	 * <code>sortModifierKeys(int)</code>.
-	 */
-	protected static final int[] NO_MODIFIER_KEYS = new int[0];
-
-	/**
-	 * The bundle in which to look up the internationalized text for all of the
-	 * individual keys in the system. This is the platform-agnostic version of
-	 * the internationalized strings. Some platforms (namely Carbon) provide
-	 * special Unicode characters and glyphs for some keys.
-	 */
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(AbstractKeyFormatter.class.getName());
-
-	/**
-	 * The keys in the resource bundle. This is used to avoid missing resource
-	 * exceptions when they aren't necessary.
-	 */
-	private static final Set resourceBundleKeys = new HashSet();
-
-	static {
-		final Enumeration keyEnumeration = RESOURCE_BUNDLE.getKeys();
-		while (keyEnumeration.hasMoreElements()) {
-			final Object element = keyEnumeration.nextElement();
-			resourceBundleKeys.add(element);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.keysKeyFormatter#format(org.eclipse.jface.bindings.keys.KeySequence)
-	 */
-	public String format(final int key) {
-		final IKeyLookup lookup = KeyLookupFactory.getDefault();
-		final String name = lookup.formalNameLookup(key);
-
-		if (resourceBundleKeys.contains(name)) {
-			return Util.translateString(RESOURCE_BUNDLE, name, name);
-		}
-		
-		return name;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.keys.KeyFormatter#format(org.eclipse.jface.bindings.keys.KeySequence)
-	 */
-	public String format(KeySequence keySequence) {
-		StringBuffer stringBuffer = new StringBuffer();
-
-		final KeyStroke[] keyStrokes = keySequence.getKeyStrokes();
-		final int keyStrokesLength = keyStrokes.length;
-		for (int i = 0; i < keyStrokesLength; i++) {
-			stringBuffer.append(format(keyStrokes[i]));
-
-			if (i + 1 < keyStrokesLength) {
-				stringBuffer.append(getKeyStrokeDelimiter());
-			}
-		}
-
-		return stringBuffer.toString();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.keys.KeyFormatter#formatKeyStroke(org.eclipse.jface.bindings.keys.KeyStroke)
-	 */
-	public String format(final KeyStroke keyStroke) {
-		final String keyDelimiter = getKeyDelimiter();
-
-		// Format the modifier keys, in sorted order.
-		final int modifierKeys = keyStroke.getModifierKeys();
-		final int[] sortedModifierKeys = sortModifierKeys(modifierKeys);
-		final StringBuffer stringBuffer = new StringBuffer();
-		if (sortedModifierKeys != null) {
-			for (int i = 0; i < sortedModifierKeys.length; i++) {
-				final int modifierKey = sortedModifierKeys[i];
-				if (modifierKey != KeyStroke.NO_KEY) {
-					stringBuffer.append(format(modifierKey));
-					stringBuffer.append(keyDelimiter);
-				}
-			}
-		}
-
-		// Format the natural key, if any.
-		final int naturalKey = keyStroke.getNaturalKey();
-		if (naturalKey != 0) {
-			stringBuffer.append(format(naturalKey));
-		}
-
-		return stringBuffer.toString();
-
-	}
-
-	/**
-	 * An accessor for the delimiter you wish to use between keys. This is used
-	 * by the default format implementations to determine the key delimiter.
-	 * 
-	 * @return The delimiter to use between keys; should not be
-	 *         <code>null</code>.
-	 */
-	protected abstract String getKeyDelimiter();
-
-	/**
-	 * An accessor for the delimiter you wish to use between key strokes. This
-	 * used by the default format implementations to determine the key stroke
-	 * delimiter.
-	 * 
-	 * @return The delimiter to use between key strokes; should not be
-	 *         <code>null</code>.
-	 */
-	protected abstract String getKeyStrokeDelimiter();
-
-	/**
-	 * Separates the modifier keys from each other, and then places them in an
-	 * array in some sorted order. The sort order is dependent on the type of
-	 * formatter.
-	 * 
-	 * @param modifierKeys
-	 *            The modifier keys from the key stroke.
-	 * @return An array of modifier key values -- separated and sorted in some
-	 *         order. Any values in this array that are
-	 *         <code>KeyStroke.NO_KEY</code> should be ignored.
-	 */
-	protected abstract int[] sortModifierKeys(final int modifierKeys);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/AbstractKeyFormatter.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/AbstractKeyFormatter.properties
deleted file mode 100644
index 1949c93..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/AbstractKeyFormatter.properties
+++ /dev/null
@@ -1,74 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-# Modifier keys
-ALT=Alt
-COMMAND=Command
-CTRL=Ctrl
-SHIFT=Shift
-
-# Special keys
-ARROW_DOWN=Down
-ARROW_LEFT=Left
-ARROW_RIGHT=Right
-ARROW_UP=Up
-BREAK=Break
-CAPS_LOCK=CapsLock
-END=End
-F1=F1
-F10=F10
-F11=F11
-F12=F12
-F2=F2
-F3=F3
-F4=F4
-F5=F5
-F6=F6
-F7=F7
-F8=F8
-F9=F9
-HOME=Home
-INSERT=Insert
-NUM_LOCK=NumLock
-NUMPAD_0=Numpad_0
-NUMPAD_1=Numpad_1
-NUMPAD_2=Numpad_2
-NUMPAD_3=Numpad_3
-NUMPAD_4=Numpad_4
-NUMPAD_5=Numpad_5
-NUMPAD_6=Numpad_6
-NUMPAD_7=Numpad_7
-NUMPAD_8=Numpad_8
-NUMPAD_9=Numpad_9
-NUMPAD_ADD=Numpad_Add
-NUMPAD_DECIMAL=Numpad_Decimal
-NUMPAD_DIVIDE=Numpad_Divide
-NUMPAD_ENTER=Numpad_Enter
-NUMPAD_EQUAL=Numpad_Equal
-NUMPAD_MULTIPLY=Numpad_Multiply
-NUMPAD_SUBTRACT=Numpad_Subtract
-PAGE_DOWN=PageDown
-PAGE_UP=PageUp
-PAUSE=Pause
-PRINT_SCREEN=PrintScreen
-SCROLL_LOCK=ScrollLock
-
-# Character keys
-BS=Backspace
-CR=Enter
-DEL=Delete
-ESC=Esc
-FF=FormFeed
-LF=LineFeed
-NUL=Null
-SPACE=Space
-TAB=Tab
-VT=VerticalTab
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/EmacsKeyFormatter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/EmacsKeyFormatter.java
deleted file mode 100644
index ab22d3d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/EmacsKeyFormatter.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings.keys.formatting;
-
-import java.util.ResourceBundle;
-
-import org.eclipse.jface.bindings.keys.IKeyLookup;
-import org.eclipse.jface.bindings.keys.KeyLookupFactory;
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.jface.util.Util;
-
-/**
- * <p>
- * A key formatter providing the Emacs-style accelerators using single letters
- * to represent the modifier keys.
- * </p>
- * 
- * @since 3.1
- */
-public final class EmacsKeyFormatter extends AbstractKeyFormatter {
-
-	/**
-	 * The resource bundle used by <code>format()</code> to translate formal
-	 * string representations by locale.
-	 */
-	private final static ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(EmacsKeyFormatter.class.getName());
-
-	/**
-	 * Formats an individual key into a human readable format. This converts the
-	 * key into a format similar to Xemacs.
-	 * 
-	 * @param key
-	 *            The key to format; must not be <code>null</code>.
-	 * @return The key formatted as a string; should not be <code>null</code>.
-	 */
-	public String format(final int key) {
-		final IKeyLookup lookup = KeyLookupFactory.getDefault();
-		if (lookup.isModifierKey(key)) {
-			String formattedName = Util.translateString(RESOURCE_BUNDLE, lookup
-					.formalNameLookup(key), null);
-			if (formattedName != null) {
-				return formattedName;
-			}
-		}
-
-		return super.format(key).toLowerCase();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.keys.AbstractKeyFormatter#getKeyDelimiter()
-	 */
-	protected String getKeyDelimiter() {
-		return Util.translateString(RESOURCE_BUNDLE, KEY_DELIMITER_KEY,
-				KeyStroke.KEY_DELIMITER);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.keys.AbstractKeyFormatter#getKeyStrokeDelimiter()
-	 */
-	protected String getKeyStrokeDelimiter() {
-		return Util.translateString(RESOURCE_BUNDLE, KEY_STROKE_DELIMITER_KEY,
-				KeySequence.KEY_STROKE_DELIMITER);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.keys.AbstractKeyFormatter#sortModifierKeys(int)
-	 */
-	protected int[] sortModifierKeys(int modifierKeys) {
-		final IKeyLookup lookup = KeyLookupFactory.getDefault();
-		final int[] sortedKeys = new int[4];
-		int index = 0;
-
-		if ((modifierKeys & lookup.getAlt()) != 0) {
-			sortedKeys[index++] = lookup.getAlt();
-		}
-		if ((modifierKeys & lookup.getCommand()) != 0) {
-			sortedKeys[index++] = lookup.getCommand();
-		}
-		if ((modifierKeys & lookup.getCtrl()) != 0) {
-			sortedKeys[index++] = lookup.getCtrl();
-		}
-		if ((modifierKeys & lookup.getShift()) != 0) {
-			sortedKeys[index++] = lookup.getShift();
-		}
-
-		return sortedKeys;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/EmacsKeyFormatter.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/EmacsKeyFormatter.properties
deleted file mode 100644
index b9529a9..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/EmacsKeyFormatter.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-# Modifier keys
-ALT=M
-COMMAND=D
-CTRL=C
-SHIFT=S
-
-# Delimiters
-KEY_DELIMITER=-
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/FormalKeyFormatter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/FormalKeyFormatter.java
deleted file mode 100644
index 4cf85e7..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/FormalKeyFormatter.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings.keys.formatting;
-
-import org.eclipse.jface.bindings.keys.IKeyLookup;
-import org.eclipse.jface.bindings.keys.KeyLookupFactory;
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.KeyStroke;
-
-/**
- * <p>
- * Formats the keys in the internal key sequence grammar. This is used for
- * persistence, and is not really intended for display to the user.
- * </p>
- * 
- * @since 3.1
- */
-public final class FormalKeyFormatter extends AbstractKeyFormatter {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.keys.KeyFormatter#format(org.eclipse.ui.keys.KeySequence)
-	 */
-	public String format(final int key) {
-		final IKeyLookup lookup = KeyLookupFactory.getDefault();
-		return lookup.formalNameLookup(key);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.keys.AbstractKeyFormatter#getKeyDelimiter()
-	 */
-	protected String getKeyDelimiter() {
-		return KeyStroke.KEY_DELIMITER;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.keys.AbstractKeyFormatter#getKeyStrokeDelimiter()
-	 */
-	protected String getKeyStrokeDelimiter() {
-		return KeySequence.KEY_STROKE_DELIMITER;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.keys.AbstractKeyFormatter#sortModifierKeys(int)
-	 */
-	protected int[] sortModifierKeys(final int modifierKeys) {
-		final IKeyLookup lookup = KeyLookupFactory.getDefault();
-		final int[] sortedKeys = new int[4];
-		int index = 0;
-
-		if ((modifierKeys & lookup.getAlt()) != 0) {
-			sortedKeys[index++] = lookup.getAlt();
-		}
-		if ((modifierKeys & lookup.getCommand()) != 0) {
-			sortedKeys[index++] = lookup.getCommand();
-		}
-		if ((modifierKeys & lookup.getCtrl()) != 0) {
-			sortedKeys[index++] = lookup.getCtrl();
-		}
-		if ((modifierKeys & lookup.getShift()) != 0) {
-			sortedKeys[index++] = lookup.getShift();
-		}
-
-		return sortedKeys;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/IKeyFormatter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/IKeyFormatter.java
deleted file mode 100644
index 7bc870d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/IKeyFormatter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings.keys.formatting;
-
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.KeyStroke;
-
-/**
- * <p>
- * Any formatter capable of taking a key sequence or a key stroke and converting
- * it into a string. These formatters are used to produce the strings that the
- * user sees in the keys preference page and the menus, as well as the strings
- * that are used for persistent storage.
- * </p>
- * 
- * @since 3.1
- */
-public interface IKeyFormatter {
-
-	/**
-	 * Formats an individual key into a human readable format. This uses an
-	 * internationalization resource bundle to look up the key. This does not do
-	 * any platform-specific formatting (e.g., Carbon's command character).
-	 * 
-	 * @param key
-	 *            The key to format.
-	 * @return The key formatted as a string; should not be <code>null</code>.
-	 */
-	String format(int key);
-
-	/**
-	 * Format the given key sequence into a string. The manner of the conversion
-	 * is dependent on the formatter. It is required that unequal key sequences
-	 * return unequal strings.
-	 * 
-	 * @param keySequence
-	 *            The key sequence to convert; must not be <code>null</code>.
-	 * @return A string representation of the key sequence; must not be
-	 *         <code>null</code>.
-	 */
-	String format(KeySequence keySequence);
-
-	/**
-	 * Format the given key strokes into a string. The manner of the conversion
-	 * is dependent on the formatter. It is required that unequal key strokes
-	 * return unequal strings.
-	 * 
-	 * @param keyStroke
-	 *            The key stroke to convert; must not be <Code>null</code>.
-	 * @return A string representation of the key stroke; must not be <code>
-	 *         null</code>
-	 */
-	String format(KeyStroke keyStroke);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/KeyFormatterFactory.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/KeyFormatterFactory.java
deleted file mode 100644
index e313b82..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/KeyFormatterFactory.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings.keys.formatting;
-
-
-
-/**
- * <p>
- * A cache for formatters. It keeps a few instances of pre-defined instances of
- * <code>IKeyFormatter</code> available for use. It also allows the default
- * formatter to be changed.
- * </p>
- * 
- * @since 3.1
- * @see org.eclipse.jface.bindings.keys.formatting.IKeyFormatter
- */
-public final class KeyFormatterFactory {
-
-    /**
-     * The formatter that renders key bindings in a platform-dependent manner.
-     */
-    private static final IKeyFormatter FORMAL_KEY_FORMATTER = new FormalKeyFormatter();
-
-    /**
-     * The formatter that renders key bindings in a form similar to XEmacs
-     */
-    private static final IKeyFormatter EMACS_KEY_FORMATTER = new EmacsKeyFormatter();
-
-    /**
-     * The default formatter. This is normally the formal key formatter, but can
-     * be changed by users of this API.
-     */
-    private static IKeyFormatter defaultKeyFormatter = FORMAL_KEY_FORMATTER;
-
-    /**
-     * An accessor for the current default key formatter.
-     * 
-     * @return The default formatter; never <code>null</code>.
-     */
-    public static final IKeyFormatter getDefault() {
-        return defaultKeyFormatter;
-    }
-
-    /**
-     * Provides an instance of <code>EmacsKeyFormatter</code>.
-     * 
-     * @return The Xemacs formatter; never <code>null</code>.
-     */
-    public static final IKeyFormatter getEmacsKeyFormatter() {
-        return EMACS_KEY_FORMATTER;
-    }
-
-    /**
-     * Provides an instance of <code>FormalKeyFormatter</code>.
-     * 
-     * @return The formal formatter; never <code>null</code>.
-     */
-    public static final IKeyFormatter getFormalKeyFormatter() {
-        return FORMAL_KEY_FORMATTER;
-    }
-
-    /**
-     * Sets the default key formatter.
-     * 
-     * @param defaultKeyFormatter
-     *            the default key formatter. Must not be <code>null</code>.
-     */
-    public static final void setDefault(final IKeyFormatter defaultKeyFormatter) {
-        if (defaultKeyFormatter == null) {
-			throw new NullPointerException();
-		}
-
-        KeyFormatterFactory.defaultKeyFormatter = defaultKeyFormatter;
-    }
-
-    /**
-     * This class should not be instantiated.
-     */
-    private KeyFormatterFactory() {
-        // Not to be constructred.
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/NativeKeyFormatter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/NativeKeyFormatter.java
deleted file mode 100644
index 2d9bb46..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/NativeKeyFormatter.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.bindings.keys.formatting;
-
-import java.util.HashMap;
-import java.util.ResourceBundle;
-
-import org.eclipse.jface.bindings.keys.IKeyLookup;
-import org.eclipse.jface.bindings.keys.KeyLookupFactory;
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.jface.util.Util;
-
-/**
- * <p>
- * Formats the key sequences and key strokes into the native human-readable
- * format. This is typically what you would see on the menus for the given
- * platform and locale.
- * </p>
- * 
- * @since 3.1
- */
-public final class NativeKeyFormatter extends AbstractKeyFormatter {
-
-	/**
-	 * The key into the internationalization resource bundle for the delimiter
-	 * to use between keys (on the Carbon platform).
-	 */
-	private final static String CARBON_KEY_DELIMITER_KEY = "CARBON_KEY_DELIMITER"; //$NON-NLS-1$
-
-	/**
-	 * A look-up table for the string representations of various carbon keys.
-	 */
-	private final static HashMap CARBON_KEY_LOOK_UP = new HashMap();
-
-	/**
-	 * The resource bundle used by <code>format()</code> to translate formal
-	 * string representations by locale.
-	 */
-	private final static ResourceBundle RESOURCE_BUNDLE;
-
-	/**
-	 * The key into the internationalization resource bundle for the delimiter
-	 * to use between key strokes (on the Win32 platform).
-	 */
-	private final static String WIN32_KEY_STROKE_DELIMITER_KEY = "WIN32_KEY_STROKE_DELIMITER"; //$NON-NLS-1$
-
-	static {
-		RESOURCE_BUNDLE = ResourceBundle.getBundle(NativeKeyFormatter.class
-				.getName());
-
-		final String carbonBackspace = "\u232B"; //$NON-NLS-1$
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.BS_NAME, carbonBackspace);
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.BACKSPACE_NAME, carbonBackspace);
-		CARBON_KEY_LOOK_UP
-				.put(IKeyLookup.CR_NAME, "\u21A9"); //$NON-NLS-1$
-		final String carbonDelete = "\u2326"; //$NON-NLS-1$
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.DEL_NAME, carbonDelete);
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.DELETE_NAME, carbonDelete);
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.SPACE_NAME, "\u2423"); //$NON-NLS-1$
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.ALT_NAME, "\u2325"); //$NON-NLS-1$
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.COMMAND_NAME, "\u2318"); //$NON-NLS-1$
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.CTRL_NAME, "\u2303"); //$NON-NLS-1$
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.SHIFT_NAME, "\u21E7"); //$NON-NLS-1$
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.ARROW_DOWN_NAME, "\u2193"); //$NON-NLS-1$
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.ARROW_LEFT_NAME, "\u2190"); //$NON-NLS-1$
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.ARROW_RIGHT_NAME, "\u2192"); //$NON-NLS-1$
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.ARROW_UP_NAME, "\u2191"); //$NON-NLS-1$
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.END_NAME, "\u2198"); //$NON-NLS-1$
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.NUMPAD_ENTER_NAME, "\u2324"); //$NON-NLS-1$
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.HOME_NAME, "\u2196"); //$NON-NLS-1$
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.PAGE_DOWN_NAME, "\u21DF"); //$NON-NLS-1$
-		CARBON_KEY_LOOK_UP.put(IKeyLookup.PAGE_UP_NAME, "\u21DE"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Formats an individual key into a human readable format. This uses an
-	 * internationalization resource bundle to look up the key. This does the
-	 * platform-specific formatting for Carbon.
-	 * 
-	 * @param key
-	 *            The key to format.
-	 * @return The key formatted as a string; should not be <code>null</code>.
-	 */
-	public final String format(final int key) {
-		final IKeyLookup lookup = KeyLookupFactory.getDefault();
-		final String name = lookup.formalNameLookup(key);
-
-		// TODO consider platform-specific resource bundles
-		if (Util.isMac()) {    	
-			String formattedName = (String) CARBON_KEY_LOOK_UP.get(name);
-			if (formattedName != null) {
-				return formattedName;
-			}
-		}
-
-		return super.format(key);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.keys.AbstractKeyFormatter#getKeyDelimiter()
-	 */
-	protected String getKeyDelimiter() {
-		// We must do the look up every time, as our locale might change.
-		if (Util.isMac()) {
-			return Util.translateString(RESOURCE_BUNDLE,
-					CARBON_KEY_DELIMITER_KEY, Util.ZERO_LENGTH_STRING);
-		}
-
-		return Util.translateString(RESOURCE_BUNDLE, KEY_DELIMITER_KEY,
-				KeyStroke.KEY_DELIMITER);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.keys.AbstractKeyFormatter#getKeyStrokeDelimiter()
-	 */
-	protected String getKeyStrokeDelimiter() {
-		// We must do the look up every time, as our locale might change.
-		if (Util.isWindows()) {
-			return Util.translateString(RESOURCE_BUNDLE,
-					WIN32_KEY_STROKE_DELIMITER_KEY,
-					KeySequence.KEY_STROKE_DELIMITER);
-		}
-
-		return Util.translateString(RESOURCE_BUNDLE, KEY_STROKE_DELIMITER_KEY,
-				KeySequence.KEY_STROKE_DELIMITER);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.keys.AbstractKeyFormatter#sortModifierKeys(int)
-	 */
-	protected int[] sortModifierKeys(final int modifierKeys) {
-		final IKeyLookup lookup = KeyLookupFactory.getDefault();
-		final int[] sortedKeys = new int[4];
-		int index = 0;
-
-		if (Util.isWindows()) {
-			if ((modifierKeys & lookup.getCtrl()) != 0) {
-				sortedKeys[index++] = lookup.getCtrl();
-			}
-			if ((modifierKeys & lookup.getAlt()) != 0) {
-				sortedKeys[index++] = lookup.getAlt();
-			}
-			if ((modifierKeys & lookup.getShift()) != 0) {
-				sortedKeys[index++] = lookup.getShift();
-			}
-
-		} else if (Util.isGtk() || Util.isMotif()) {
-			if ((modifierKeys & lookup.getShift()) != 0) {
-				sortedKeys[index++] = lookup.getShift();
-			}
-			if ((modifierKeys & lookup.getCtrl()) != 0) {
-				sortedKeys[index++] = lookup.getCtrl();
-			}
-			if ((modifierKeys & lookup.getAlt()) != 0) {
-				sortedKeys[index++] = lookup.getAlt();
-			}
-
-		} else if (Util.isMac()) {
-			if ((modifierKeys & lookup.getShift()) != 0) {
-				sortedKeys[index++] = lookup.getShift();
-			}
-			if ((modifierKeys & lookup.getCtrl()) != 0) {
-				sortedKeys[index++] = lookup.getCtrl();
-			}
-			if ((modifierKeys & lookup.getAlt()) != 0) {
-				sortedKeys[index++] = lookup.getAlt();
-			}
-			if ((modifierKeys & lookup.getCommand()) != 0) {
-				sortedKeys[index++] = lookup.getCommand();
-			}
-
-		}
-
-		return sortedKeys;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/NativeKeyFormatter.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/NativeKeyFormatter.properties
deleted file mode 100644
index c997e2f..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/NativeKeyFormatter.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-KEY_DELIMITER=+
-CARBON_KEY_DELIMITER=
-WIN32_KEY_STROKE_DELIMITER=, 
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/package.html
deleted file mode 100644
index 77d3c49..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/formatting/package.html
+++ /dev/null
@@ -1,31 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-<p>Provides support for formatting key sequences.</p>
-
-<h2>Package Specification</h2>
-<p>
-This is a collection fo various formatters for key sequences.  The formatters
-are accessible through the <code>KeyFormatterFactory</code>.  To change how
-keys are formatted in the user interface, call
-<code>KeyFormatterFactory.setDefault(IKeyFormatter)</code>.  They provided
-formatters are:
-</p>
-<dl>
-<dt>FormalKeyFormatter</dt>
-<dd>Provides a formal grammar for reading and writing key sequences.</dd>
-<dt>NativeKeyFormatter</dt>
-<dd>Provide a native-looking, human-readable format for keys.</dd>
-<dt>CompactKeyFormatter</dt>
-<dd>A variation of the native formatter that provides a more compact representation.</dd>
-<dt>EmacsKeyFormatter</dt>
-<dd>An Xemacs-style formatter (e.g., C^x C^x).</dd>
-</dl>
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/package.html
deleted file mode 100644
index 24514f4..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/keys/package.html
+++ /dev/null
@@ -1,38 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-<p>Provides support for bindings between commands and keys.</p>
-
-<h2>Package Specification</h2>
-<p>
-This just a key-specific implementation of the generic bindings and trigger
-support.  This package provides an abstraction layer between the SWT key events
-and key bindings within JFace.
-</p>
-<p>
-<code>KeySequence</code> is a <code>TriggerSequence</code> that has
-<code>KeyStroke</code> instances as triggers.  A <code>KeyStroke</code> is
-composed of one or more keys held down at the same time.  A key stroke ends
-when the keys are released.  A key stroke can contain zero or more modifiers
-keys, but it always contains exactly one natural key.  A modifier key is one of
-Ctrl, Shift, Alt, or Command.  A natural key is anything else.</p>
-<p>
-Natural keys are further subdivided into special keys and character keys.
-Character keys are keys that have an ASCII representation (e.g., Space, 'A' and
-Backspace).  Special keys are ones that do not (e.g., Arrow Up, F11, and
-NumLock).
-</p>
-<p>
-<code>SWTKeySupport</code> is a static class that provides the link between SWT
-and these internal representations.  It has methods for converting between SWT
-key events and the internal representation, and vice versa.  It also provides
-access to the native-style key formatting facilities.
-</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/package.html
deleted file mode 100644
index 2896e85..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/bindings/package.html
+++ /dev/null
@@ -1,38 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-<p>Provides support for bindings between commands and various user input events
-(e.g., keyboard shortcuts).</p>
-
-<h2>Package Specification</h2>
-<p>
-This package provides the common classes and abstract classes required to
-provide binding support.
-</p>
-<p>
-All the real work in this package is carried out by the
-<code>BindingManager</code>, and most work with bindings can be carried out
-directly with it.  The binding manager manages a collection of bindings, and
-decides which bindings are active at any point in time.  By changes the various
-properties of the manager, the active bindings will change.  The binding
-manager implements a caching scheme that is optimized for an infreqeuntly
-changing set of bindings, but frequently changing properties.
-</p>
-<p>
-The binding manager also manages schemes.  A scheme is a grouping of bindings.
-To create a scheme, use <code>BindingManager.getScheme(String)</code>.  The
-scheme must then be defined before it can be used.
-</p>
-<p>
-If you wish to implement your own type of binding, then you must subclass
-<code>Trigger</code> and <code>TriggerSequence</code>.  Then, simply use these
-subclasses with the <code>BindingManager</code>.
-</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/commands/ActionHandler.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/commands/ActionHandler.java
deleted file mode 100644
index 5e3223f..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/commands/ActionHandler.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.commands;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.HandlerEvent;
-import org.eclipse.core.commands.IHandlerListener;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.widgets.Event;
-
-/**
- * <p>
- * This class adapts instances of <code>IAction</code> to
- * <code>IHandler</code>.
- * </p>
- * 
- * @since 3.1
- */
-public final class ActionHandler extends AbstractHandler {
-
-	/**
-	 * The wrapped action. This value is never <code>null</code>.
-	 */
-	private final IAction action;
-
-	/**
-	 * The property change listener hooked on to the action. This is initialized
-	 * when the first listener is attached to this handler, and is removed when
-	 * the handler is disposed or the last listener is removed.
-	 */
-	private IPropertyChangeListener propertyChangeListener;
-
-	/**
-	 * Creates a new instance of this class given an instance of
-	 * <code>IAction</code>.
-	 * 
-	 * @param action
-	 *            the action. Must not be <code>null</code>.
-	 */
-	public ActionHandler(final IAction action) {
-		if (action == null) {
-			throw new NullPointerException();
-		}
-
-		this.action = action;
-	}
-
-	public final void addHandlerListener(final IHandlerListener handlerListener) {
-		if (!hasListeners()) {
-			attachListener();
-		}
-
-		super.addHandlerListener(handlerListener);
-	}
-
-	/**
-	 * When a listener is attached to this handler, then this registers a
-	 * listener with the underlying action.
-	 * 
-	 * @since 3.1
-	 */
-	private final void attachListener() {
-		if (propertyChangeListener == null) {
-			propertyChangeListener = new IPropertyChangeListener() {
-				public final void propertyChange(
-						final PropertyChangeEvent propertyChangeEvent) {
-					final String property = propertyChangeEvent.getProperty();
-					fireHandlerChanged(new HandlerEvent(ActionHandler.this,
-							IAction.ENABLED.equals(property), IAction.HANDLED
-									.equals(property)));
-				}
-			};
-		}
-
-		this.action.addPropertyChangeListener(propertyChangeListener);
-	}
-
-	/**
-	 * When no more listeners are registered, then this is used to removed the
-	 * property change listener from the underlying action.
-	 */
-	private final void detachListener() {
-		this.action.removePropertyChangeListener(propertyChangeListener);
-		propertyChangeListener = null;
-	}
-
-	/**
-	 * Removes the property change listener from the action.
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#dispose()
-	 */
-	public final void dispose() {
-		if (hasListeners()) {
-			action.removePropertyChangeListener(propertyChangeListener);
-		}
-	}
-	
-	public final Object execute(final ExecutionEvent event)
-			throws ExecutionException {
-		if ((action.getStyle() == IAction.AS_CHECK_BOX)
-				|| (action.getStyle() == IAction.AS_RADIO_BUTTON)) {
-			action.setChecked(!action.isChecked());
-		}
-		final Object trigger = event.getTrigger();
-		try {
-			if (trigger instanceof Event) {
-				action.runWithEvent((Event) trigger);
-			} else {
-				action.runWithEvent(new Event());
-			}
-		} catch (Exception e) {
-			throw new ExecutionException(
-					"While executing the action, an exception occurred", e); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the action associated with this handler
-	 * 
-	 * @return the action associated with this handler (not null)
-	 * @since 3.1
-	 */
-	public final IAction getAction() {
-		return action;
-	}
-	
-	public final boolean isEnabled() {
-		return action.isEnabled();
-	}
-	
-	public final boolean isHandled() {
-		return action.isHandled();
-	}
-	
-	public final void removeHandlerListener(
-			final IHandlerListener handlerListener) {
-		super.removeHandlerListener(handlerListener);
-
-		if (!hasListeners()) {
-			detachListener();
-		}
-	}
-	
-	public final String toString() {
-		final StringBuffer buffer = new StringBuffer();
-
-		buffer.append("ActionHandler("); //$NON-NLS-1$
-		buffer.append(action);
-		buffer.append(')');
-
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/commands/PersistentState.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/commands/PersistentState.java
deleted file mode 100644
index 5681efa..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/commands/PersistentState.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.commands;
-
-import org.eclipse.core.commands.State;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * <p>
- * This is a state that can be made persistent. A state is persisted to a
- * preference store.
- * </p>
- * <p>
- * Clients may extend this class.
- * </p>
- * 
- * @since 3.2
- */
-public abstract class PersistentState extends State {
-
-	/**
-	 * Whether this state should be persisted.
-	 */
-	private boolean persisted;
-
-	/**
-	 * Loads this state from the preference store, given the location at which
-	 * to look. This method must be symmetric with a call to
-	 * {@link #save(IPreferenceStore, String)}.
-	 * 
-	 * @param store
-	 *            The store from which to read; must not be <code>null</code>.
-	 * @param preferenceKey
-	 *            The key at which the state is stored; must not be
-	 *            <code>null</code>.
-	 */
-	public abstract void load(final IPreferenceStore store,
-			final String preferenceKey);
-
-	/**
-	 * Saves this state to the preference store, given the location at which to
-	 * write. This method must be symmetric with a call to
-	 * {@link #load(IPreferenceStore, String)}.
-	 * 
-	 * @param store
-	 *            The store to which the state should be written; must not be
-	 *            <code>null</code>.
-	 * @param preferenceKey
-	 *            The key at which the state should be stored; must not be
-	 *            <code>null</code>.
-	 */
-	public abstract void save(final IPreferenceStore store,
-			final String preferenceKey);
-
-	/**
-	 * Sets whether this state should be persisted.
-	 * 
-	 * @param persisted
-	 *            Whether this state should be persisted.
-	 */
-	public void setShouldPersist(final boolean persisted) {
-		this.persisted = persisted;
-	}
-
-	/**
-	 * Whether this state should be persisted. Subclasses should check this
-	 * method before loading or saving.
-	 * 
-	 * @return <code>true</code> if this state should be persisted;
-	 *         <code>false</code> otherwise.
-	 */
-	public boolean shouldPersist() {
-		return persisted;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/commands/RadioState.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/commands/RadioState.java
deleted file mode 100644
index 334240a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/commands/RadioState.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.commands;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.commands.IStateListener;
-import org.eclipse.core.commands.State;
-import org.eclipse.jface.menus.IMenuStateIds;
-
-/**
- * <p>
- * A piece of boolean state grouped with other boolean states. Of these states,
- * only one may have a value of {@link Boolean#TRUE} at any given point in time.
- * The values of all other states must be {@link Boolean#FALSE}.
- * </p>
- * <p>
- * If this state is registered using {@link IMenuStateIds#STYLE}, then it will
- * control the presentation of the command if displayed in the menus, tool bars
- * or status line.
- * </p>
- * <p>
- * Clients may instantiate or extend this interface.
- * </p>
- * 
- * @since 3.2
- */
-public class RadioState extends ToggleState {
-
-	/**
-	 * The manager of radio groups within the application. This ensures that
-	 * only one member of a radio group is active at any one time, and tracks
-	 * group memberships.
-	 */
-	private static final class RadioStateManager {
-
-		/**
-		 * A group of radio states with the same identifier.
-		 */
-		private static final class RadioGroup implements IStateListener {
-
-			/**
-			 * The active state. If there is no active state, then this value is
-			 * <code>null</code>.
-			 */
-			private RadioState active = null;
-
-			/**
-			 * The current members in this group. If there are no members, then
-			 * this value is <code>nlistenerull</code>.
-			 */
-			private Set members = null;
-
-			/**
-			 * Activates a memeber. This checks to see if there are any other
-			 * active members. If there are, they are deactivated.
-			 * 
-			 * @param state
-			 *            The state that should become active; must not be
-			 *            <code>null</code>.
-			 */
-			private final void activateMember(final RadioState state) {
-				if (active!=null && active != state) {
-					active.setValue(Boolean.FALSE);
-				}
-				active = state;
-			}
-
-			/**
-			 * Adds a member to this radio group. If the state being added is
-			 * active, then it replaces the currently active group memeber as
-			 * the active state.
-			 * 
-			 * @param state
-			 *            The state to add; must not be <code>null</code>.
-			 */
-			private final void addMember(final RadioState state) {
-				if (members == null) {
-					members = new HashSet(5);
-				}
-
-				members.add(state);
-				state.addListener(this);
-
-				final Object value = state.getValue();
-				if (value instanceof Boolean) {
-					if (((Boolean) value).booleanValue()) {
-						activateMember(state);
-					}
-				}
-			}
-
-			public final void handleStateChange(final State state,
-					final Object oldValue) {
-				final Object newValue = state.getValue();
-				if (newValue instanceof Boolean) {
-					if (((Boolean) newValue).booleanValue()) {
-						activateMember((RadioState) state);
-					}
-				}
-			}
-
-			/**
-			 * Removes a member from this radio group. If the state was the
-			 * active state, then there will be no active state.
-			 * 
-			 * @param state
-			 *            The state to remove; must not be <code>null</code>.
-			 */
-			private final void removeMember(final RadioState state) {
-				state.removeListener(this);
-				if (active == state) {
-					active = null;
-				}
-
-				if (members == null) {
-					return;
-				}
-				members.remove(state);
-			}
-		}
-
-		/**
-		 * The map of radio states indexed by identifier (<code>String</code>).
-		 * The radio states is either a single <code>RadioState</code>
-		 * instance or a <code>Collection</code> of <code>RadioState</code>
-		 * instances.
-		 */
-		private static Map radioStatesById = null;
-
-		/**
-		 * Activates a particular state within a given group.
-		 * 
-		 * @param identifier
-		 *            The identifier of the group to which the state belongs;
-		 *            must not be <code>null</code>.
-		 * @param state
-		 *            The state to activate; must not be <code>null</code>.
-		 */
-		private static final void activateGroup(final String identifier,
-				final RadioState state) {
-			if (radioStatesById == null) {
-				return;
-			}
-
-			final Object currentValue = radioStatesById.get(identifier);
-			if (currentValue instanceof RadioGroup) {
-				final RadioGroup radioGroup = (RadioGroup) currentValue;
-				radioGroup.activateMember(state);
-			}
-		}
-
-		/**
-		 * Registers a piece of state with the radio manager.
-		 * 
-		 * @param identifier
-		 *            The identifier of the radio group; must not be
-		 *            <code>null</code>.
-		 * @param state
-		 *            The state to register; must not be <code>null</code>.
-		 */
-		private static final void registerState(final String identifier,
-				final RadioState state) {
-			if (radioStatesById == null) {
-				radioStatesById = new HashMap();
-			}
-
-			final Object currentValue = radioStatesById.get(identifier);
-			final RadioGroup radioGroup;
-			if (currentValue instanceof RadioGroup) {
-				radioGroup = (RadioGroup) currentValue;
-			} else {
-				radioGroup = new RadioGroup();
-			}
-			radioGroup.addMember(state);
-		}
-
-		/**
-		 * Unregisters a piece of state from the radio manager.
-		 * 
-		 * @param identifier
-		 *            The identifier of the radio group; must not be
-		 *            <code>null</code>.
-		 * @param state
-		 *            The state to unregister; must not be <code>null</code>.
-		 */
-		private static final void unregisterState(final String identifier,
-				final RadioState state) {
-			if (radioStatesById == null) {
-				return;
-			}
-
-			final Object currentValue = radioStatesById.get(identifier);
-			if (currentValue instanceof RadioGroup) {
-				final RadioGroup radioGroup = (RadioGroup) currentValue;
-				radioGroup.removeMember(state);
-			}
-		}
-	}
-
-	/**
-	 * The identifier of the radio group to which this state belongs. This value
-	 * may be <code>null</code> if this state doesn't really belong to a group
-	 * (yet).
-	 */
-	private String radioGroupIdentifier = null;
-
-	/**
-	 * Unregisters this state from the manager, which detaches the listeners.
-	 */
-	public void dispose() {
-		setRadioGroupIdentifier(null);
-	}
-
-	/**
-	 * Sets the identifier of the radio group for this piece of state. If the
-	 * identifier is cleared, then the state is unregistered.
-	 * 
-	 * @param identifier
-	 *            The identifier of the radio group for this state; may be
-	 *            <code>null</code> if the identifier is being cleared.
-	 * 
-	 */
-	public final void setRadioGroupIdentifier(final String identifier) {
-		if (identifier == null) {
-			RadioStateManager.unregisterState(radioGroupIdentifier, this);
-			radioGroupIdentifier = null;
-		} else {
-			radioGroupIdentifier = identifier;
-			RadioStateManager.registerState(identifier, this);
-		}
-	}
-
-	/**
-	 * Sets the value for this object. This notifies the radio state manager of
-	 * the change.
-	 * 
-	 * @param value
-	 *            The new value; should be a <code>Boolean</code>.
-	 */
-	public void setValue(final Object value) {
-		if (!(value instanceof Boolean)) {
-			throw new IllegalArgumentException(
-					"RadioState takes a Boolean as a value"); //$NON-NLS-1$
-		}
-
-		if (((Boolean) value).booleanValue() && (radioGroupIdentifier != null)) {
-			RadioStateManager.activateGroup(radioGroupIdentifier, this);
-		}
-
-		super.setValue(value);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/commands/ToggleState.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/commands/ToggleState.java
deleted file mode 100644
index 71d6131..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/commands/ToggleState.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.commands;
-
-import org.eclipse.jface.menus.IMenuStateIds;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * <p>
- * A piece of state storing a {@link Boolean}.
- * </p>
- * <p>
- * If this state is registered using {@link IMenuStateIds#STYLE}, then it will
- * control the presentation of the command if displayed in the menus, tool bars
- * or status line.
- * </p>
- * <p>
- * Clients may instantiate this class, but must not extend.
- * </p>
- * 
- * @since 3.2
- */
-public class ToggleState extends PersistentState {
-
-	/**
-	 * Constructs a new <code>ToggleState</code>. By default, the toggle is
-	 * off (e.g., <code>false</code>).
-	 */
-	public ToggleState() {
-		setValue(Boolean.FALSE);
-	}
-
-	public final void load(final IPreferenceStore store,
-			final String preferenceKey) {
-		final boolean currentValue = ((Boolean) getValue()).booleanValue(); 
-		store.setDefault(preferenceKey, currentValue);
-		if (shouldPersist() && (store.contains(preferenceKey))) {
-			final boolean value = store.getBoolean(preferenceKey);
-			setValue(value ? Boolean.TRUE : Boolean.FALSE);
-		}
-	}
-
-	public final void save(final IPreferenceStore store,
-			final String preferenceKey) {
-		if (shouldPersist()) {
-			final Object value = getValue();
-			if (value instanceof Boolean) {
-				store.setValue(preferenceKey, ((Boolean) value).booleanValue());
-			}
-		}
-	}
-
-	public void setValue(final Object value) {
-		if (!(value instanceof Boolean)) {
-			throw new IllegalArgumentException(
-					"ToggleState takes a Boolean as a value"); //$NON-NLS-1$
-		}
-
-		super.setValue(value);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/commands/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/commands/package.html
deleted file mode 100644
index d0e2c2f..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/commands/package.html
+++ /dev/null
@@ -1,18 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-<p>Provides JFace-specific support for commands.</p>
-
-<h2>Package Specification</h2>
-<p>
-This package provides a handler that wraps a legacy instance of
-<code>IAction</code>, as well as a manager for associating images with commands.
-</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/contexts/IContextIds.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/contexts/IContextIds.java
deleted file mode 100644
index 3011235..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/contexts/IContextIds.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.contexts;
-
-/**
- * <p>
- * A list of well-known context identifiers. The context identifiers use the
- * prefix "org.eclipse.ui" for historical reasons. These contexts exist as part 
- * of JFace.
- * </p>
- * <p>
- * This interface should not be implemented or extended by clients.
- * </p>
- * 
- * @since 3.1
- */
-public interface IContextIds {
-
-	/**
-	 * The identifier for the context that is active when a shell registered as
-	 * a dialog.
-	 */
-	public static final String CONTEXT_ID_DIALOG = "org.eclipse.ui.contexts.dialog"; //$NON-NLS-1$
-
-	/**
-	 * The identifier for the context that is active when a shell is registered
-	 * as either a window or a dialog.
-	 */
-	public static final String CONTEXT_ID_DIALOG_AND_WINDOW = "org.eclipse.ui.contexts.dialogAndWindow"; //$NON-NLS-1$
-
-	/**
-	 * The identifier for the context that is active when a shell is registered
-	 * as a window.
-	 */
-	public static final String CONTEXT_ID_WINDOW = "org.eclipse.ui.contexts.window"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/contexts/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/contexts/package.html
deleted file mode 100644
index f09c5cf..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/contexts/package.html
+++ /dev/null
@@ -1,18 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-<p>Provides JFace-specific support for contexts.</p>
-
-<h2>Package Specification</h2>
-<p>
-This package provides some context identifiers that have special meaning in the
-context of JFace.
-</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/AnimatorFactory.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/AnimatorFactory.java
deleted file mode 100644
index 76d8e9e..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/AnimatorFactory.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.swt.widgets.Control;
-
-
-/**
- * Factory for control animators used by JFace to animate the display of an SWT
- * Control. Through the use of the method
- * {@link org.eclipse.jface.util.Policy#setAnimatorFactory(AnimatorFactory)} 
- * a new type of animator factory can be plugged into JFace.
- * 
- * @since 3.2
- * @deprecated as of 3.3, this class is no longer used.
- */
-public class AnimatorFactory {
-	/**
-	 * Creates a new ControlAnimator for use by JFace in animating
-	 * the display of an SWT Control. <p>
-	 * Subclasses should override this method.
-	 * 
-	 * @param control the SWT Control to de displayed 
-	 * @return the ControlAnimator.
-	 * @since 3.2
-	 */
-	public ControlAnimator createAnimator(Control control) {
-		return new ControlAnimator(control);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ControlAnimator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ControlAnimator.java
deleted file mode 100644
index be05086..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ControlAnimator.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * ControlAnimator provides a simple implementation to display or hide a control
- * at the bottom of the parent composite. Other animations will be written as
- * subclasses of this class. <p>
- * Instances of this class can be created using an AnimatorFactory.
- * 
- * @since 3.2
- */
-
-
-public class ControlAnimator {
-	/** the control that will be displayed or hidden */
-	protected Control control;	
-	
-	/**
-	 * Constructs a new ControlAnimator instance and passes along the
-	 * control that will be displayed or hidden.
-	 * 
-	 * @param control the control that will be displayed or hidden.
-	 */
-	public ControlAnimator(Control control) {
-		this.control = control;
-	}
-
-	/**
-	 * Displays or hides a control at the bottom of the parent composite
-	 * and makes use of the control's SWT visible flag.<p>
-	 * Subclasses should override this method.</p>
-	 * 
-	 * @param visible <code>true</code> if the control should be shown, 
-	 * 		  and <code>false</code> otherwise.
-	 */
-	public void setVisible(boolean visible){
-		// Using the SWT visible flag to determine if the control has
-		// already been displayed or hidden. Return if already displayed
-		// and visible is true, or if already hidden and visible is false.
-		if (!(control.isVisible() ^ visible))
-			return;
-		control.setVisible(visible);
-		Rectangle parentBounds = control.getParent().getBounds();
-		int bottom = parentBounds.height;		
-		final int endY = visible ? bottom - control.getBounds().height
-				: bottom;
-		Point loc = control.getLocation();
-		control.setLocation(loc.x,endY);
-	}
-	
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ControlEnableState.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ControlEnableState.java
deleted file mode 100644
index cba792b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ControlEnableState.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * Helper class to save the enable/disable state of a control including all its
- * descendent controls.
- */
-public class ControlEnableState {
-    /**
-     * List of exception controls (element type: <code>Control</code>);
-     * <code>null</code> if none.
-     */
-    private List exceptions = null;
-
-    /**
-     * List of saved states (element type: <code>ItemState</code>).
-     */
-    private List states;
-
-    /**
-     * Internal class for recording the enable/disable state of a single
-     * control.
-     */
-    private class ItemState {
-    	/** the control */
-        protected Control item;
-
-        /** the state */
-        protected boolean state;
-
-        /**
-         * Create a new instance of the receiver.
-         * 
-         * @param item
-         * @param state
-         */
-        public ItemState(Control item, boolean state) {
-            this.item = item;
-            this.state = state;
-        }
-
-        /**
-         * Restore the enabled state to the original value.
-         *  
-         */
-        public void restore() {
-            if (item == null || item.isDisposed()) {
-				return;
-			}
-            item.setEnabled(state);
-        }
-    }
-
-    /**
-     * Creates a new object and saves in it the current enable/disable state of
-     * the given control and its descendents; the controls that are saved are
-     * also disabled.
-     * 
-     * @param w
-     *            the control
-     */
-    protected ControlEnableState(Control w) {
-        this(w, null);
-    }
-
-    /**
-     * Creates a new object and saves in it the current enable/disable state of
-     * the given control and its descendents except for the given list of
-     * exception cases; the controls that are saved are also disabled.
-     * 
-     * @param w
-     *            the control
-     * @param exceptions
-     *            the list of controls to not disable (element type:
-     *            <code>Control</code>), or <code>null</code> if none
-     */
-    protected ControlEnableState(Control w, List exceptions) {
-        super();
-        states = new ArrayList();
-        this.exceptions = exceptions;
-        readStateForAndDisable(w);
-    }
-
-    /**
-     * Saves the current enable/disable state of the given control and its
-     * descendents in the returned object; the controls are all disabled.
-     * 
-     * @param w
-     *            the control
-     * @return an object capturing the enable/disable state
-     */
-    public static ControlEnableState disable(Control w) {
-        return new ControlEnableState(w);
-    }
-
-    /**
-     * Saves the current enable/disable state of the given control and its
-     * descendents in the returned object except for the given list of exception
-     * cases; the controls that are saved are also disabled.
-     * 
-     * @param w
-     *            the control
-     * @param exceptions
-     *            the list of controls to not disable (element type:
-     *            <code>Control</code>)
-     * @return an object capturing the enable/disable state
-     */
-    public static ControlEnableState disable(Control w, List exceptions) {
-        return new ControlEnableState(w, exceptions);
-    }
-
-    /**
-     * Recursively reads the enable/disable state for the given window and
-     * disables all controls.
-     * @param control Control
-     */
-    private void readStateForAndDisable(Control control) {
-        if ((exceptions != null && exceptions.contains(control))) {
-			return;
-		}
-        if (control instanceof Composite) {
-            Composite c = (Composite) control;
-            Control[] children = c.getChildren();
-            for (int i = 0; i < children.length; i++) {
-                readStateForAndDisable(children[i]);
-            }
-        }
-        // XXX: Workaround for 1G2Q8SS: ITPUI:Linux - Combo box is not enabled
-        // in "File->New->Solution"
-        states.add(new ItemState(control, control.getEnabled()));
-        control.setEnabled(false);
-    }
-
-    /**
-     * Restores the window enable state saved in this object.
-     */
-    public void restore() {
-        int size = states.size();
-        for (int i = 0; i < size; i++) {
-            ((ItemState) states.get(i)).restore();
-        }
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/Dialog.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/Dialog.java
deleted file mode 100644
index bbbbf0c..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/Dialog.java
+++ /dev/null
@@ -1,1307 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Remy Chi Jian Suen <remy.suen@gmail.com> - Bug 218553 [JFace] mis-spelling of their in applyDialogFont(...)
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import java.util.Arrays;
-import java.util.HashMap;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.jface.window.SameShellProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FormData;
-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.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A dialog is a specialized window used for narrow-focused communication with
- * the user.
- * <p>
- * Dialogs are usually modal. Consequently, it is generally bad practice to open
- * a dialog without a parent. A modal dialog without a parent is not prevented
- * from disappearing behind the application's other windows, making it very
- * confusing for the user.
- * </p>
- * <p>
- * If there is more than one modal dialog is open the second one should be
- * parented off of the shell of the first one otherwise it is possible that the
- * OS will give focus to the first dialog potentially blocking the UI.
- * </p>
- */
-public abstract class Dialog extends Window {
-	/**
-	 * Image registry key for error image (value
-	 * <code>"dialog_error_image"</code>).
-	 * 
-	 * @deprecated use
-	 *             org.eclipse.swt.widgets.Display.getSystemImage(SWT.ICON_ERROR)
-	 */
-	public static final String DLG_IMG_ERROR = "dialog_error_image"; //$NON-NLS-1$
-
-	/**
-	 * Image registry key for info image (value <code>"dialog_info_image"</code>).
-	 * 
-	 * @deprecated use
-	 *             org.eclipse.swt.widgets.Display.getSystemImage(SWT.ICON_INFORMATION)
-	 */
-	public static final String DLG_IMG_INFO = "dialog_info_imageg"; //$NON-NLS-1$
-
-	/**
-	 * Image registry key for question image (value
-	 * <code>"dialog_question_image"</code>).
-	 * 
-	 * @deprecated org.eclipse.swt.widgets.Display.getSystemImage(SWT.ICON_QUESTION)
-	 */
-	public static final String DLG_IMG_QUESTION = "dialog_question_image"; //$NON-NLS-1$
-
-	/**
-	 * Image registry key for warning image (value
-	 * <code>"dialog_warning_image"</code>).
-	 * 
-	 * @deprecated use
-	 *             org.eclipse.swt.widgets.Display.getSystemImage(SWT.ICON_WARNING)
-	 */
-	public static final String DLG_IMG_WARNING = "dialog_warning_image"; //$NON-NLS-1$
-
-	/**
-	 * Image registry key for info message image (value
-	 * <code>"dialog_messasge_info_image"</code>).
-	 * 
-	 * @since 2.0
-	 */
-	public static final String DLG_IMG_MESSAGE_INFO = "dialog_messasge_info_image"; //$NON-NLS-1$
-
-	/**
-	 * Image registry key for info message image (value
-	 * <code>"dialog_messasge_warning_image"</code>).
-	 * 
-	 * @since 2.0
-	 */
-	public static final String DLG_IMG_MESSAGE_WARNING = "dialog_messasge_warning_image"; //$NON-NLS-1$
-
-	/**
-	 * Image registry key for info message image (value
-	 * <code>"dialog_message_error_image"</code>).
-	 * 
-	 * @since 2.0
-	 */
-	public static final String DLG_IMG_MESSAGE_ERROR = "dialog_message_error_image"; //$NON-NLS-1$
-
-	/**
-	 * Image registry key for help image (value
-	 * <code>"dialog_help_image"</code>).
-	 * 
-	 * @since 3.2
-	 */
-	public static final String DLG_IMG_HELP = "dialog_help_image"; //$NON-NLS-1$
-
-	/**
-	 * The ellipsis is the string that is used to represent shortened text.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String ELLIPSIS = "..."; //$NON-NLS-1$
-
-	/**
-	 * The dialog settings key name for stored dialog x location.
-	 * 
-	 * @since 3.2
-	 */
-	private static final String DIALOG_ORIGIN_X = "DIALOG_X_ORIGIN"; //$NON-NLS-1$
-
-	/**
-	 * The dialog settings key name for stored dialog y location.
-	 * 
-	 * @since 3.2
-	 */
-	private static final String DIALOG_ORIGIN_Y = "DIALOG_Y_ORIGIN"; //$NON-NLS-1$
-
-	/**
-	 * The dialog settings key name for stored dialog width.
-	 * 
-	 * @since 3.2
-	 */
-	private static final String DIALOG_WIDTH = "DIALOG_WIDTH"; //$NON-NLS-1$
-
-	/**
-	 * The dialog settings key name for stored dialog height.
-	 * 
-	 * @since 3.2
-	 */
-	private static final String DIALOG_HEIGHT = "DIALOG_HEIGHT"; //$NON-NLS-1$
-	
-	/**
-	 * The dialog settings key name for the font used when the dialog
-	 * height and width was stored.
-	 *
-	 *@since 3.2
-	 */
-	private static final String DIALOG_FONT_DATA = "DIALOG_FONT_NAME"; //$NON-NLS-1$
-	
-	/**
-	 * A value that can be used for stored dialog width or height that
-	 * indicates that the default bounds should be used.
-	 * 
-	 * @since 3.2
-	 */
-	public static final int DIALOG_DEFAULT_BOUNDS = -1;
-
-	/**
-	 * Constants that can be used for specifying the strategy for persisting
-	 * dialog bounds.  These constants represent bit masks that can be used
-	 * together.
-	 *
-	 *@since 3.2
-	 */
-	
-	/**
-	 * Persist the last location of the dialog.
-	 * @since 3.2
-	 */
-	public static final int DIALOG_PERSISTLOCATION = 0x0001;
-	/**
-	 * Persist the last known size of the dialog.
-	 * @since 3.2
-	 */
-	public static final int DIALOG_PERSISTSIZE = 0x0002;
-	
-	/**
-	 * The dialog area; <code>null</code> until dialog is layed out.
-	 */
-	protected Control dialogArea;
-
-	/**
-	 * The button bar; <code>null</code> until dialog is layed out.
-	 */
-	public Control buttonBar;
-	
-	/**
-	 * Collection of buttons created by the <code>createButton</code> method.
-	 */
-	private HashMap buttons = new HashMap();
-
-	/**
-	 * Font metrics to use for determining pixel sizes.
-	 */
-	private FontMetrics fontMetrics;
-	
-	/**
-	 * Number of horizontal dialog units per character, value <code>4</code>.
-	 */
-	private static final int HORIZONTAL_DIALOG_UNIT_PER_CHAR = 4;
-
-	/**
-	 * Number of vertical dialog units per character, value <code>8</code>.
-	 */
-	private static final int VERTICAL_DIALOG_UNITS_PER_CHAR = 8;
-
-	/**
-	 * Returns the number of pixels corresponding to the height of the given
-	 * number of characters.
-	 * <p>
-	 * The required <code>FontMetrics</code> parameter may be created in the
-	 * following way: <code>
-	 * 	GC gc = new GC(control);
-	 *	gc.setFont(control.getFont());
-	 *	fontMetrics = gc.getFontMetrics();
-	 *	gc.dispose();
-	 * </code>
-	 * </p>
-	 * 
-	 * @param fontMetrics
-	 *            used in performing the conversion
-	 * @param chars
-	 *            the number of characters
-	 * @return the number of pixels
-	 * @since 2.0
-	 */
-	public static int convertHeightInCharsToPixels(FontMetrics fontMetrics,
-			int chars) {
-		return fontMetrics.getHeight() * chars;
-	}
-
-	/**
-	 * Returns the number of pixels corresponding to the given number of
-	 * horizontal dialog units.
-	 * <p>
-	 * The required <code>FontMetrics</code> parameter may be created in the
-	 * following way: <code>
-	 * 	GC gc = new GC(control);
-	 *	gc.setFont(control.getFont());
-	 *	fontMetrics = gc.getFontMetrics();
-	 *	gc.dispose();
-	 * </code>
-	 * </p>
-	 * 
-	 * @param fontMetrics
-	 *            used in performing the conversion
-	 * @param dlus
-	 *            the number of horizontal dialog units
-	 * @return the number of pixels
-	 * @since 2.0
-	 */
-	public static int convertHorizontalDLUsToPixels(FontMetrics fontMetrics,
-			int dlus) {
-		// round to the nearest pixel
-		return (fontMetrics.getAverageCharWidth() * dlus + HORIZONTAL_DIALOG_UNIT_PER_CHAR / 2)
-				/ HORIZONTAL_DIALOG_UNIT_PER_CHAR;
-	}
-
-	/**
-	 * Returns the number of pixels corresponding to the given number of
-	 * vertical dialog units.
-	 * <p>
-	 * The required <code>FontMetrics</code> parameter may be created in the
-	 * following way: <code>
-	 * 	GC gc = new GC(control);
-	 *	gc.setFont(control.getFont());
-	 *	fontMetrics = gc.getFontMetrics();
-	 *	gc.dispose();
-	 * </code>
-	 * </p>
-	 * 
-	 * @param fontMetrics
-	 *            used in performing the conversion
-	 * @param dlus
-	 *            the number of vertical dialog units
-	 * @return the number of pixels
-	 * @since 2.0
-	 */
-	public static int convertVerticalDLUsToPixels(FontMetrics fontMetrics,
-			int dlus) {
-		// round to the nearest pixel
-		return (fontMetrics.getHeight() * dlus + VERTICAL_DIALOG_UNITS_PER_CHAR / 2)
-				/ VERTICAL_DIALOG_UNITS_PER_CHAR;
-	}
-
-	/**
-	 * Returns the number of pixels corresponding to the width of the given
-	 * number of characters.
-	 * <p>
-	 * The required <code>FontMetrics</code> parameter may be created in the
-	 * following way: <code>
-	 * 	GC gc = new GC(control);
-	 *	gc.setFont(control.getFont());
-	 *	fontMetrics = gc.getFontMetrics();
-	 *	gc.dispose();
-	 * </code>
-	 * </p>
-	 * 
-	 * @param fontMetrics
-	 *            used in performing the conversion
-	 * @param chars
-	 *            the number of characters
-	 * @return the number of pixels
-	 * @since 2.0
-	 */
-	public static int convertWidthInCharsToPixels(FontMetrics fontMetrics,
-			int chars) {
-		return fontMetrics.getAverageCharWidth() * chars;
-	}
-
-	/**
-	 * Shortens the given text <code>textValue</code> so that its width in
-	 * pixels does not exceed the width of the given control. Overrides
-	 * characters in the center of the original string with an ellipsis ("...")
-	 * if necessary. If a <code>null</code> value is given, <code>null</code>
-	 * is returned.
-	 * 
-	 * @param textValue
-	 *            the original string or <code>null</code>
-	 * @param control
-	 *            the control the string will be displayed on
-	 * @return the string to display, or <code>null</code> if null was passed
-	 *         in
-	 * 
-	 * @since 3.0
-	 */
-	public static String shortenText(String textValue, Control control) {
-		if (textValue == null) {
-			return null;
-		}
-		GC gc = new GC(control);
-		int maxWidth = control.getBounds().width - 5;
-		int maxExtent = gc.textExtent(textValue).x;
-		if (maxExtent < maxWidth) {
-			gc.dispose();
-			return textValue;
-		}
-		int length = textValue.length();
-		int charsToClip = Math.round(0.95f*length * (1 - ((float)maxWidth/maxExtent)));
-		int pivot = length / 2;
-		int start = pivot - (charsToClip/2);
-		int end = pivot + (charsToClip/2) + 1;
-		while (start >= 0 && end < length) {
-			String s1 = textValue.substring(0, start);
-			String s2 = textValue.substring(end, length);
-			String s = s1 + ELLIPSIS + s2;
-			int l = gc.textExtent(s).x;
-			if (l < maxWidth) {
-				gc.dispose();
-				return s;
-			}
-			start--;
-			end++;
-		}
-		gc.dispose();
-		return textValue;
-	}
-
-	/**
-	 * Create a default instance of the blocked handler which does not do
-	 * anything.
-	 */
-	public static IDialogBlockedHandler blockedHandler = new IDialogBlockedHandler() {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.dialogs.IDialogBlockedHandler#clearBlocked()
-		 */
-		public void clearBlocked() {
-			// No default behaviour
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.dialogs.IDialogBlockedHandler#showBlocked(org.eclipse.core.runtime.IProgressMonitor,
-		 *      org.eclipse.core.runtime.IStatus, java.lang.String)
-		 */
-		public void showBlocked(IProgressMonitor blocking,
-				IStatus blockingStatus, String blockedName) {
-			// No default behaviour
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.dialogs.IDialogBlockedHandler#showBlocked(org.eclipse.swt.widgets.Shell,
-		 *      org.eclipse.core.runtime.IProgressMonitor,
-		 *      org.eclipse.core.runtime.IStatus, java.lang.String)
-		 */
-		public void showBlocked(Shell parentShell, IProgressMonitor blocking,
-				IStatus blockingStatus, String blockedName) {
-			// No default behaviour
-		}
-	};
-
-	/**
-	 * Creates a dialog instance. Note that the window will have no visual
-	 * representation (no widgets) until it is told to open. By default,
-	 * <code>open</code> blocks for dialogs.
-	 * 
-	 * @param parentShell
-	 *            the parent shell, or <code>null</code> to create a top-level
-	 *            shell
-	 */
-	protected Dialog(Shell parentShell) {
-		this(new SameShellProvider(parentShell));
-		if (parentShell == null && Policy.DEBUG_DIALOG_NO_PARENT) {
-			Policy.getLog().log(
-					new Status(IStatus.INFO, Policy.JFACE, IStatus.INFO, this
-							.getClass()
-							+ " created with no shell",//$NON-NLS-1$
-							new Exception()));
-		}
-	}
-
-	/**
-	 * Creates a dialog with the given parent.
-	 * 
-	 * @param parentShell
-	 *            object that returns the current parent shell
-	 * 
-	 * @since 3.1
-	 */
-	protected Dialog(IShellProvider parentShell) {
-		super(parentShell);
-		if (isResizable()) {
-			setShellStyle(SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.MAX | SWT.RESIZE
-					| getDefaultOrientation());
-		} else {
-			setShellStyle(SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL
-					| getDefaultOrientation());
-		}
-		setBlockOnOpen(true);
-	}
-
-	/**
-	 * Notifies that this dialog's button with the given id has been pressed.
-	 * <p>
-	 * The <code>Dialog</code> implementation of this framework method calls
-	 * <code>okPressed</code> if the ok button is the pressed, and
-	 * <code>cancelPressed</code> if the cancel button is the pressed. All
-	 * other button presses are ignored. Subclasses may override to handle other
-	 * buttons, but should call <code>super.buttonPressed</code> if the
-	 * default handling of the ok and cancel buttons is desired.
-	 * </p>
-	 * 
-	 * @param buttonId
-	 *            the id of the button that was pressed (see
-	 *            <code>IDialogConstants.*_ID</code> constants)
-	 */
-	protected void buttonPressed(int buttonId) {
-		if (IDialogConstants.OK_ID == buttonId) {
-			okPressed();
-		} else if (IDialogConstants.CANCEL_ID == buttonId) {
-			cancelPressed();
-		}
-	}
-
-	/**
-	 * Notifies that the cancel button of this dialog has been pressed.
-	 * <p>
-	 * The <code>Dialog</code> implementation of this framework method sets
-	 * this dialog's return code to <code>Window.CANCEL</code> and closes the
-	 * dialog. Subclasses may override if desired.
-	 * </p>
-	 */
-	protected void cancelPressed() {
-		setReturnCode(CANCEL);
-		close();
-	}
-
-	/**
-	 * Returns the number of pixels corresponding to the height of the given
-	 * number of characters.
-	 * <p>
-	 * This method may only be called after <code>initializeDialogUnits</code>
-	 * has been called.
-	 * </p>
-	 * <p>
-	 * Clients may call this framework method, but should not override it.
-	 * </p>
-	 * 
-	 * @param chars
-	 *            the number of characters
-	 * @return the number of pixels
-	 */
-	protected int convertHeightInCharsToPixels(int chars) {
-		// test for failure to initialize for backward compatibility
-		if (fontMetrics == null) {
-			return 0;
-		}
-		return convertHeightInCharsToPixels(fontMetrics, chars);
-	}
-
-	/**
-	 * Returns the number of pixels corresponding to the given number of
-	 * horizontal dialog units.
-	 * <p>
-	 * This method may only be called after <code>initializeDialogUnits</code>
-	 * has been called.
-	 * </p>
-	 * <p>
-	 * Clients may call this framework method, but should not override it.
-	 * </p>
-	 * 
-	 * @param dlus
-	 *            the number of horizontal dialog units
-	 * @return the number of pixels
-	 */
-	protected int convertHorizontalDLUsToPixels(int dlus) {
-		// test for failure to initialize for backward compatibility
-		if (fontMetrics == null) {
-			return 0;
-		}
-		return convertHorizontalDLUsToPixels(fontMetrics, dlus);
-	}
-
-	/**
-	 * Returns the number of pixels corresponding to the given number of
-	 * vertical dialog units.
-	 * <p>
-	 * This method may only be called after <code>initializeDialogUnits</code>
-	 * has been called.
-	 * </p>
-	 * <p>
-	 * Clients may call this framework method, but should not override it.
-	 * </p>
-	 * 
-	 * @param dlus
-	 *            the number of vertical dialog units
-	 * @return the number of pixels
-	 */
-	protected int convertVerticalDLUsToPixels(int dlus) {
-		// test for failure to initialize for backward compatibility
-		if (fontMetrics == null) {
-			return 0;
-		}
-		return convertVerticalDLUsToPixels(fontMetrics, dlus);
-	}
-
-	/**
-	 * Returns the number of pixels corresponding to the width of the given
-	 * number of characters.
-	 * <p>
-	 * This method may only be called after <code>initializeDialogUnits</code>
-	 * has been called.
-	 * </p>
-	 * <p>
-	 * Clients may call this framework method, but should not override it.
-	 * </p>
-	 * 
-	 * @param chars
-	 *            the number of characters
-	 * @return the number of pixels
-	 */
-	protected int convertWidthInCharsToPixels(int chars) {
-		// test for failure to initialize for backward compatibility
-		if (fontMetrics == null) {
-			return 0;
-		}
-		return convertWidthInCharsToPixels(fontMetrics, chars);
-	}
-
-	/**
-	 * Creates a new button with the given id.
-	 * <p>
-	 * The <code>Dialog</code> implementation of this framework method creates
-	 * a standard push button, registers it for selection events including
-	 * button presses, and registers default buttons with its shell. The button
-	 * id is stored as the button's client data. If the button id is
-	 * <code>IDialogConstants.CANCEL_ID</code>, the new button will be
-	 * accessible from <code>getCancelButton()</code>. If the button id is
-	 * <code>IDialogConstants.OK_ID</code>, the new button will be accesible
-	 * from <code>getOKButton()</code>. Note that the parent's layout is
-	 * assumed to be a <code>GridLayout</code> and the number of columns in
-	 * this layout is incremented. Subclasses may override.
-	 * </p>
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param id
-	 *            the id of the button (see <code>IDialogConstants.*_ID</code>
-	 *            constants for standard dialog button ids)
-	 * @param label
-	 *            the label from the button
-	 * @param defaultButton
-	 *            <code>true</code> if the button is to be the default button,
-	 *            and <code>false</code> otherwise
-	 * 
-	 * @return the new button
-	 * 
-	 * @see #getCancelButton
-	 * @see #getOKButton()
-	 */
-	protected Button createButton(Composite parent, int id, String label,
-			boolean defaultButton) {
-		// increment the number of columns in the button bar
-		((GridLayout) parent.getLayout()).numColumns++;
-		Button button = new Button(parent, SWT.PUSH);
-		button.setText(label);
-		button.setFont(JFaceResources.getDialogFont());
-		button.setData(new Integer(id));
-		button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				buttonPressed(((Integer) event.widget.getData()).intValue());
-			}
-		});
-		if (defaultButton) {
-			Shell shell = parent.getShell();
-			if (shell != null) {
-				shell.setDefaultButton(button);
-			}
-		}
-		buttons.put(new Integer(id), button);
-		setButtonLayoutData(button);
-		return button;
-	}
-
-	/**
-	 * Creates and returns the contents of this dialog's button bar.
-	 * <p>
-	 * The <code>Dialog</code> implementation of this framework method lays
-	 * out a button bar and calls the <code>createButtonsForButtonBar</code>
-	 * framework method to populate it. Subclasses may override.
-	 * </p>
-	 * <p>
-	 * The returned control's layout data must be an instance of
-	 * <code>GridData</code>.
-	 * </p>
-	 * 
-	 * @param parent
-	 *            the parent composite to contain the button bar
-	 * @return the button bar control
-	 */
-	protected Control createButtonBar(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		// create a layout with spacing and margins appropriate for the font
-		// size.
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 0; // this is incremented by createButton
-		layout.makeColumnsEqualWidth = true;
-		layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-		layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
-		layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
-		composite.setLayout(layout);
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END
-				| GridData.VERTICAL_ALIGN_CENTER);
-		composite.setLayoutData(data);
-		composite.setFont(parent.getFont());
-		
-		// Add the buttons to the button bar.
-		createButtonsForButtonBar(composite);
-		return composite;
-	}
-
-	/**
-	 * Adds buttons to this dialog's button bar.
-	 * <p>
-	 * The <code>Dialog</code> implementation of this framework method adds
-	 * standard ok and cancel buttons using the <code>createButton</code>
-	 * framework method. These standard buttons will be accessible from
-	 * <code>getCancelButton</code>, and <code>getOKButton</code>.
-	 * Subclasses may override.
-	 * </p>
-	 * 
-	 * @param parent
-	 *            the button bar composite
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		// create OK and Cancel buttons by default
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-	}
-
-	/*
-	 * @see Window.initializeBounds()
-	 */
-	protected void initializeBounds() {
-		if (Util.isMac()) {
-			// On Mac OS X the default button must be the right-most button
-			Shell shell = getShell();
-			if (shell != null) {
-				Button defaultButton = shell.getDefaultButton();
-				if (defaultButton != null
-						&& isContained(buttonBar, defaultButton)) {
-					defaultButton.moveBelow(null);
-				}
-			}
-		}
-		
-		super.initializeBounds();
-	}
-
-	/**
-	 * Returns true if the given Control is a direct or indirect child of
-	 * container.
-	 * 
-	 * @param container
-	 *            the potential parent
-	 * @param control
-	 * @return boolean <code>true</code> if control is a child of container
-	 */
-	private boolean isContained(Control container, Control control) {
-		Composite parent;
-		while ((parent = control.getParent()) != null) {
-			if (parent == container) {
-				return true;
-			}
-			control = parent;
-		}
-		return false;
-	}
-
-	/**
-	 * The <code>Dialog</code> implementation of this <code>Window</code>
-	 * method creates and lays out the top level composite for the dialog, and
-	 * determines the appropriate horizontal and vertical dialog units based on
-	 * the font size. It then calls the <code>createDialogArea</code> and
-	 * <code>createButtonBar</code> methods to create the dialog area and
-	 * button bar, respectively. Overriding <code>createDialogArea</code> and
-	 * <code>createButtonBar</code> are recommended rather than overriding
-	 * this method.
-	 */
-	protected Control createContents(Composite parent) {
-		// create the top level composite for the dialog
-		Composite composite = new Composite(parent, 0);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		layout.verticalSpacing = 0;
-		composite.setLayout(layout);
-		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-		applyDialogFont(composite);
-		// initialize the dialog units
-		initializeDialogUnits(composite);
-		// create the dialog area and button bar
-		dialogArea = createDialogArea(composite);
-		buttonBar = createButtonBar(composite);
-				
-		return composite;
-	}
-
-	/**
-	 * Creates and returns the contents of the upper part of this dialog (above
-	 * the button bar).
-	 * <p>
-	 * The <code>Dialog</code> implementation of this framework method creates
-	 * and returns a new <code>Composite</code> with standard margins and
-	 * spacing.
-	 * </p>
-	 * <p>
-	 * The returned control's layout data must be an instance of
-	 * <code>GridData</code>. This method must not modify the parent's
-	 * layout.
-	 * </p>
-	 * <p>
-	 * Subclasses must override this method but may call <code>super</code> as
-	 * in the following example:
-	 * </p>
-	 * 
-	 * <pre>
-	 * Composite composite = (Composite) super.createDialogArea(parent);
-	 * //add controls to composite as necessary
-	 * return composite;
-	 * </pre>
-	 * 
-	 * @param parent
-	 *            the parent composite to contain the dialog area
-	 * @return the dialog area control
-	 */
-	protected Control createDialogArea(Composite parent) {
-		// create a composite with standard margins and spacing
-		Composite composite = new Composite(parent, SWT.NONE);
-		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));
-		applyDialogFont(composite);
-		return composite;
-	}
-
-	/**
-	 * Returns the button created by the method <code>createButton</code> for
-	 * the specified ID as defined on <code>IDialogConstants</code>. If
-	 * <code>createButton</code> was never called with this ID, or if
-	 * <code>createButton</code> is overridden, this method will return
-	 * <code>null</code>.
-	 * 
-	 * @param id
-	 *            the id of the button to look for
-	 * 
-	 * @return the button for the ID or <code>null</code>
-	 * 
-	 * @see #createButton(Composite, int, String, boolean)
-	 * @since 2.0
-	 */
-	protected Button getButton(int id) {
-		return (Button) buttons.get(new Integer(id));
-	}
-
-	/**
-	 * Returns the button bar control.
-	 * <p>
-	 * Clients may call this framework method, but should not override it.
-	 * </p>
-	 * 
-	 * @return the button bar, or <code>null</code> if the button bar has not
-	 *         been created yet
-	 */
-	protected Control getButtonBar() {
-		return buttonBar;
-	}
-
-	/**
-	 * Returns the button created when <code>createButton</code> is called
-	 * with an ID of <code>IDialogConstants.CANCEL_ID</code>. If
-	 * <code>createButton</code> was never called with this parameter, or if
-	 * <code>createButton</code> is overridden, <code>getCancelButton</code>
-	 * will return <code>null</code>.
-	 * 
-	 * @return the cancel button or <code>null</code>
-	 * 
-	 * @see #createButton(Composite, int, String, boolean)
-	 * @since 2.0
-	 * @deprecated Use <code>getButton(IDialogConstants.CANCEL_ID)</code>
-	 *             instead. This method will be removed soon.
-	 */
-	protected Button getCancelButton() {
-		return getButton(IDialogConstants.CANCEL_ID);
-	}
-
-	/**
-	 * Returns the dialog area control.
-	 * <p>
-	 * Clients may call this framework method, but should not override it.
-	 * </p>
-	 * 
-	 * @return the dialog area, or <code>null</code> if the dialog area has
-	 *         not been created yet
-	 */
-	protected Control getDialogArea() {
-		return dialogArea;
-	}
-
-	/**
-	 * Returns the standard dialog image with the given key. Note that these
-	 * images are managed by the dialog framework, and must not be disposed by
-	 * another party.
-	 * 
-	 * @param key
-	 *            one of the <code>Dialog.DLG_IMG_* </code> constants
-	 * @return the standard dialog image
-	 * 
-	 * NOTE: Dialog does not use the following images in the registry
-	 * DLG_IMG_ERROR DLG_IMG_INFO DLG_IMG_QUESTION DLG_IMG_WARNING
-	 * 
-	 * They are now coming directly from SWT, see ImageRegistry. For backwards
-	 * compatibility they are still supported, however new code should use SWT
-	 * for these.
-	 * 
-	 * @see Display#getSystemImage(int)
-	 */
-	public static Image getImage(String key) {
-		return JFaceResources.getImageRegistry().get(key);
-	}
-
-	/**
-	 * Returns the button created when <code>createButton</code> is called
-	 * with an ID of <code>IDialogConstants.OK_ID</code>. If
-	 * <code>createButton</code> was never called with this parameter, or if
-	 * <code>createButton</code> is overridden, <code>getOKButton</code>
-	 * will return <code>null</code>.
-	 * 
-	 * @return the OK button or <code>null</code>
-	 * 
-	 * @see #createButton(Composite, int, String, boolean)
-	 * @since 2.0
-	 * @deprecated Use <code>getButton(IDialogConstants.OK_ID)</code> instead.
-	 *             This method will be removed soon.
-	 */
-	protected Button getOKButton() {
-		return getButton(IDialogConstants.OK_ID);
-	}
-
-	/**
-	 * Initializes the computation of horizontal and vertical dialog units based
-	 * on the size of current font.
-	 * <p>
-	 * This method must be called before any of the dialog unit based conversion
-	 * methods are called.
-	 * </p>
-	 * 
-	 * @param control
-	 *            a control from which to obtain the current font
-	 */
-	protected void initializeDialogUnits(Control control) {
-		// Compute and store a font metric
-		GC gc = new GC(control);
-		gc.setFont(JFaceResources.getDialogFont());
-		fontMetrics = gc.getFontMetrics();
-		gc.dispose();
-	}
-
-	/**
-	 * Notifies that the ok button of this dialog has been pressed.
-	 * <p>
-	 * The <code>Dialog</code> implementation of this framework method sets
-	 * this dialog's return code to <code>Window.OK</code> and closes the
-	 * dialog. Subclasses may override.
-	 * </p>
-	 */
-	protected void okPressed() {
-		setReturnCode(OK);
-		close();
-	}
-
-	/**
-	 * Set the layout data of the button to a GridData with appropriate heights
-	 * and widths.
-	 * 
-	 * @param button
-	 */
-	protected void setButtonLayoutData(Button button) {
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-		Point minSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-		data.widthHint = Math.max(widthHint, minSize.x);
-		button.setLayoutData(data);
-	}
-
-	/**
-	 * Set the layout data of the button to a FormData with appropriate heights
-	 * and widths.
-	 * 
-	 * @param button
-	 */
-	protected void setButtonLayoutFormData(Button button) {
-		FormData data = new FormData();
-		int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-		Point minSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-		data.width = Math.max(widthHint, minSize.x);
-		button.setLayoutData(data);
-	}
-
-	/**
-	 * @see org.eclipse.jface.window.Window#close()
-	 */
-	public boolean close() {
-		if (getShell() != null && !getShell().isDisposed()) {
-			saveDialogBounds(getShell());
-		}
-
-		boolean returnValue = super.close();
-		if (returnValue) {
-			buttons = new HashMap();
-			buttonBar = null;
-			dialogArea = null;
-		}
-		return returnValue;
-	}
-
-	/**
-	 * Applies the dialog font to all controls that currently have the default
-	 * font.
-	 * 
-	 * @param control
-	 *            the control to apply the font to. Font will also be applied to
-	 *            its children. If the control is <code>null</code> nothing
-	 *            happens.
-	 */
-	public static void applyDialogFont(Control control) {
-		if (control == null || dialogFontIsDefault()) {
-			return;
-		}
-		Font dialogFont = JFaceResources.getDialogFont();
-		applyDialogFont(control, dialogFont);
-	}
-
-	/**
-	 * Sets the dialog font on the control and any of its children if their font
-	 * is not otherwise set.
-	 * 
-	 * @param control
-	 *            the control to apply the font to. Font will also be applied to
-	 *            its children.
-	 * @param dialogFont
-	 *            the dialog font to set
-	 */
-	private static void applyDialogFont(Control control, Font dialogFont) {
-		if (hasDefaultFont(control)) {
-			control.setFont(dialogFont);
-		}
-		if (control instanceof Composite) {
-			Control[] children = ((Composite) control).getChildren();
-			for (int i = 0; i < children.length; i++) {
-				applyDialogFont(children[i], dialogFont);
-			}
-		}
-	}
-
-	/**
-	 * Return whether or not this control has the same font as it's default.
-	 * 
-	 * @param control
-	 *            Control
-	 * @return boolean
-	 */
-	private static boolean hasDefaultFont(Control control) {
-		FontData[] controlFontData = control.getFont().getFontData();
-		FontData[] defaultFontData = getDefaultFont(control).getFontData();
-		if (controlFontData.length == defaultFontData.length) {
-			for (int i = 0; i < controlFontData.length; i++) {
-				if (controlFontData[i].equals(defaultFontData[i])) {
-					continue;
-				}
-				return false;
-			}
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Get the default font for this type of control.
-	 * 
-	 * @param control
-	 * @return the default font
-	 */
-	private static Font getDefaultFont(Control control) {
-		String fontName = "DEFAULT_FONT_" + control.getClass().getName(); //$NON-NLS-1$
-		if (JFaceResources.getFontRegistry().hasValueFor(fontName)) {
-			return JFaceResources.getFontRegistry().get(fontName);
-		}
-		Font cached = control.getFont();
-		control.setFont(null);
-		Font defaultFont = control.getFont();
-		control.setFont(cached);
-		JFaceResources.getFontRegistry().put(fontName,
-				defaultFont.getFontData());
-		return defaultFont;
-	}
-
-	/**
-	 * Return whether or not the dialog font is currently the same as the
-	 * default font.
-	 * 
-	 * @return boolean if the two are the same
-	 */
-	protected static boolean dialogFontIsDefault() {
-		FontData[] dialogFontData = JFaceResources.getFontRegistry()
-				.getFontData(JFaceResources.DIALOG_FONT);
-		FontData[] defaultFontData = JFaceResources.getFontRegistry()
-				.getFontData(JFaceResources.DEFAULT_FONT);
-		return Arrays.equals(dialogFontData, defaultFontData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#create()
-	 */
-	public void create() {
-		super.create();
-		applyDialogFont(buttonBar);
-	}
-
-	/**
-	 * Get the IDialogBlockedHandler to be used by WizardDialogs and
-	 * ModalContexts.
-	 * 
-	 * @return Returns the blockedHandler.
-	 */
-	public static IDialogBlockedHandler getBlockedHandler() {
-		return blockedHandler;
-	}
-
-	/**
-	 * Set the IDialogBlockedHandler to be used by WizardDialogs and
-	 * ModalContexts.
-	 * 
-	 * @param blockedHandler
-	 *            The blockedHandler for the dialogs.
-	 */
-	public static void setBlockedHandler(IDialogBlockedHandler blockedHandler) {
-		Dialog.blockedHandler = blockedHandler;
-	}
-
-	/**
-	 * Gets the dialog settings that should be used for remembering the bounds of
-	 * of the dialog, according to the dialog bounds strategy.
-	 * 
-	 * @return settings the dialog settings used to store the dialog's location
-	 *         and/or size, or <code>null</code> if the dialog's bounds should
-	 *         never be stored.
-	 * 
-	 * @since 3.2
-	 * @see Dialog#getDialogBoundsStrategy()
-	 */
-	protected IDialogSettings getDialogBoundsSettings() {
-		return null;
-	}
-
-	/**
-	 * Get the integer constant that describes the strategy for persisting the
-	 * dialog bounds. This strategy is ignored if the implementer does not also
-	 * specify the dialog settings for storing the bounds in
-	 * Dialog.getDialogBoundsSettings().
-	 * 
-	 * @return the constant describing the strategy for persisting the dialog
-	 *         bounds.
-	 * 
-	 * @since 3.2
-	 * @see Dialog#DIALOG_PERSISTLOCATION
-	 * @see Dialog#DIALOG_PERSISTSIZE
-	 * @see Dialog#getDialogBoundsSettings()
-	 */
-	protected int getDialogBoundsStrategy() {
-		return DIALOG_PERSISTLOCATION | DIALOG_PERSISTSIZE;
-	}
-
-	/**
-	 * Saves the bounds of the shell in the appropriate dialog settings. The
-	 * bounds are recorded relative to the parent shell, if there is one, or
-	 * display coordinates if there is no parent shell.
-	 * 
-	 * @param shell
-	 *            The shell whose bounds are to be stored
-	 * 
-	 * @since 3.2
-	 */
-	private void saveDialogBounds(Shell shell) {		
-		IDialogSettings settings = getDialogBoundsSettings();
-		if (settings != null) {
-			Point shellLocation = shell.getLocation();
-			Point shellSize = shell.getSize();
-			Shell parent = getParentShell();
-			if (parent != null) {
-				Point parentLocation = parent.getLocation();
-				shellLocation.x -= parentLocation.x;
-				shellLocation.y -= parentLocation.y;
-			}
-			int strategy = getDialogBoundsStrategy();
-			if ((strategy & DIALOG_PERSISTLOCATION) != 0) {
-				settings.put(DIALOG_ORIGIN_X, shellLocation.x);
-				settings.put(DIALOG_ORIGIN_Y, shellLocation.y);
-			}
-			if ((strategy & DIALOG_PERSISTSIZE) != 0) {
-				settings.put(DIALOG_WIDTH, shellSize.x);
-				settings.put(DIALOG_HEIGHT, shellSize.y);
-				FontData [] fontDatas = JFaceResources.getDialogFont().getFontData();
-				if (fontDatas.length > 0) {
-					settings.put(DIALOG_FONT_DATA, fontDatas[0].toString());
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns the initial size to use for the shell. Overridden
-	 * to check whether a size has been stored in dialog settings.
-	 * If a size has been stored, it is returned.
-	 * 
-	 * @return the initial size of the shell
-	 * 
-	 * @since 3.2
-	 * @see #getDialogBoundsSettings()
-	 * @see #getDialogBoundsStrategy()
-	 */
-	protected Point getInitialSize() {
-		Point result = super.getInitialSize();
-		
-		// Check the dialog settings for a stored size.
-		if ((getDialogBoundsStrategy() & DIALOG_PERSISTSIZE)!= 0) {
-			IDialogSettings settings = getDialogBoundsSettings();
-			if (settings != null) {
-				// Check that the dialog font matches the font used
-				// when the bounds was stored.  If the font has changed,
-				// we do not honor the stored settings.  
-				// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=132821
-				boolean useStoredBounds = true;
-				String previousDialogFontData = settings.get(DIALOG_FONT_DATA);
-				// There is a previously stored font, so we will check it.
-				// Note that if we haven't stored the font before, then we will
-				// use the stored bounds.  This allows restoring of dialog bounds 
-				// that were stored before we started storing the fontdata.
-				if (previousDialogFontData != null && previousDialogFontData.length() > 0) {
-					FontData [] fontDatas = JFaceResources.getDialogFont().getFontData();
-					if (fontDatas.length > 0) {
-						String currentDialogFontData = fontDatas[0].toString();
-						useStoredBounds = currentDialogFontData.equalsIgnoreCase(previousDialogFontData);
-					}
-				}
-				if (useStoredBounds) {
-					try {
-						// Get the stored width and height.
-						int width = settings.getInt(DIALOG_WIDTH);
-						if (width != DIALOG_DEFAULT_BOUNDS) {
-							result.x = width;
-						}
-						int height = settings.getInt(DIALOG_HEIGHT);
-						if (height != DIALOG_DEFAULT_BOUNDS) {
-							result.y = height;
-						}
-		
-					} catch (NumberFormatException e) {
-					}
-				}
-			}
-		}
-		// No attempt is made to constrain the bounds. The default
-		// constraining behavior in Window will be used.
-		return result;
-	}
-
-	/**
-	 * Returns the initial location to use for the shell. Overridden
-	 * to check whether the bounds of the dialog have been stored in
-	 * dialog settings.  If a location has been stored, it is returned.
-	 * 
-	 * @param initialSize
-	 *            the initial size of the shell, as returned by
-	 *            <code>getInitialSize</code>.
-	 * @return the initial location of the shell
-	 * 
-	 * @since 3.2
-	 * @see #getDialogBoundsSettings()
-	 * @see #getDialogBoundsStrategy()
-	 */
-	protected Point getInitialLocation(Point initialSize) {
-		Point result = super.getInitialLocation(initialSize);
-		if ((getDialogBoundsStrategy() & DIALOG_PERSISTLOCATION)!= 0) {
-			IDialogSettings settings = getDialogBoundsSettings();
-			if (settings != null) {
-				try {
-					int x = settings.getInt(DIALOG_ORIGIN_X);
-					int y = settings.getInt(DIALOG_ORIGIN_Y);
-					result = new Point(x, y);
-					// The coordinates were stored relative to the parent shell.
-					// Convert to display coordinates.
-					Shell parent = getParentShell();
-					if (parent != null) {
-						Point parentLocation = parent.getLocation();
-						result.x += parentLocation.x;
-						result.y += parentLocation.y;
-					}
-				} catch (NumberFormatException e) {
-				}
-			}
-		}
-		// No attempt is made to constrain the bounds. The default
-		// constraining behavior in Window will be used.
-		return result;
-	}
-	
-	/**
-	 * Returns a boolean indicating whether the dialog should be
-	 * considered resizable when the shell style is initially
-	 * set.  
-	 * 
-	 * This method is used to ensure that all style 
-	 * bits appropriate for resizable dialogs are added to the 
-	 * shell style.  Individual dialogs may always set the shell 
-	 * style to ensure that a dialog is resizable, but using this
-	 * method ensures that resizable dialogs will be created with
-	 * the same set of style bits.
-	 * 
-	 * Style bits will never be removed based on the return value 
-	 * of this method.  For example, if a dialog returns 
-	 * <code>false</code>, but also sets a style bit for a 
-	 * SWT.RESIZE border, the style bit will be honored.
-	 * 
-	 * @return a boolean indicating whether the dialog is 
-	 * resizable and should have the default style bits for
-	 * resizable dialogs
-	 * 
-	 * @since 3.4
-	 */
-	protected boolean isResizable() {
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/DialogMessageArea.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/DialogMessageArea.java
deleted file mode 100644
index 14a0927..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/DialogMessageArea.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-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;
-
-/**
- * The DialogMessageArea is a resusable component for adding an accessible
- * message area to a dialog.
- * 
- * When the message is normal a CLabel is used but an errors replaces the
- * message area with a non editable text that can take focus for use by screen
- * readers.
- * 
- * @since 3.0
- */
-public class DialogMessageArea extends Object {
-    private Text messageText;
-
-    private Label messageImageLabel;
-
-    private Composite messageComposite;
-
-    private String lastMessageText;
-
-    private int lastMessageType;
-
-    private CLabel titleLabel;
-
-    /**
-     * Create a new instance of the receiver.
-     */
-    public DialogMessageArea() {
-        //No initial behaviour
-    }
-
-    /**
-     * Create the contents for the receiver.
-     * 
-     * @param parent
-     *            the Composite that the children will be created in
-     */
-    public void createContents(Composite parent) {
-       
-        // Message label
-        titleLabel = new CLabel(parent, SWT.NONE);
-        titleLabel.setFont(JFaceResources.getBannerFont());
-        messageComposite = new Composite(parent, SWT.NONE);
-        GridLayout messageLayout = new GridLayout();
-        messageLayout.numColumns = 2;
-        messageLayout.marginWidth = 0;
-        messageLayout.marginHeight = 0;
-        messageLayout.makeColumnsEqualWidth = false;
-        messageComposite.setLayout(messageLayout);
-        messageImageLabel = new Label(messageComposite, SWT.NONE);
-        messageImageLabel.setImage(JFaceResources
-                .getImage(Dialog.DLG_IMG_MESSAGE_INFO));
-        messageImageLabel.setLayoutData(new GridData(
-                GridData.VERTICAL_ALIGN_CENTER));
-  
-        messageText = new Text(messageComposite, SWT.NONE);
-        messageText.setEditable(false);
-  
-        GridData textData = new GridData(GridData.GRAB_HORIZONTAL
-                | GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER);
-        messageText.setLayoutData(textData);
-  
-    }
-
-    /**
-     * Set the layoutData for the title area. In most cases this will be a copy
-     * of the layoutData used in setMessageLayoutData.
-     * 
-     * @param layoutData
-     *            the layoutData for the title
-     * @see #setMessageLayoutData(Object)
-     */
-    public void setTitleLayoutData(Object layoutData) {
-        titleLabel.setLayoutData(layoutData);
-    }
-
-    /**
-     * Set the layoutData for the messageArea. In most cases this will be a copy
-     * of the layoutData used in setTitleLayoutData.
-     * 
-     * @param layoutData
-     *            the layoutData for the message area composite.
-     * @see #setTitleLayoutData(Object)
-     */
-    public void setMessageLayoutData(Object layoutData) {
-        messageComposite.setLayoutData(layoutData);
-    }
-
-    /**
-     * Show the title.
-     * 
-     * @param titleMessage
-     *            String for the titke
-     * @param titleImage
-     *            Image or <code>null</code>
-     */
-    public void showTitle(String titleMessage, Image titleImage) {
-        titleLabel.setImage(titleImage);
-        titleLabel.setText(titleMessage);
-        restoreTitle();
-        return;
-    }
-
-    /**
-     * Enable the title and disable the message text and image.
-     */
-    public void restoreTitle() {
-        titleLabel.setVisible(true);
-        messageComposite.setVisible(false);
-        lastMessageText = null;
-        lastMessageType = IMessageProvider.NONE;
-    }
-
-    /**
-     * Show the new message in the message text and update the image. Base the
-     * background color on whether or not there are errors.
-     * 
-     * @param newMessage
-     *            The new value for the message
-     * @param newType
-     *            One of the IMessageProvider constants. If newType is
-     *            IMessageProvider.NONE show the title.
-     * @see IMessageProvider
-     */
-    public void updateText(String newMessage, int newType) {
-        Image newImage = null;
-        switch (newType) {
-        case IMessageProvider.NONE:
-            if (newMessage == null) {
-				restoreTitle();
-			} else {
-				showTitle(newMessage, null);
-			}
-            return;
-        case IMessageProvider.INFORMATION:
-            newImage = JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_INFO);
-            break;
-        case IMessageProvider.WARNING:
-            newImage = JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING);
-            break;
-        case IMessageProvider.ERROR:
-            newImage = JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_ERROR);
-
-            break;
-        }
-        messageComposite.setVisible(true);
-        titleLabel.setVisible(false);
-        // Any more updates required?
-        // If the message text equals the tooltip (i.e. non-shortened text is the same)
-        // and shortened text is the same (i.e. not a resize)
-        // and the image is the same then nothing to do
-        String shortText = Dialog.shortenText(newMessage,messageText);
-        if (newMessage.equals(messageText.getToolTipText())
-                && newImage == messageImageLabel.getImage()
-                	&& shortText.equals(messageText.getText())) {
-			return;
-		}
-        messageImageLabel.setImage(newImage);
-        messageText.setText(Dialog.shortenText(newMessage,messageText));
-        messageText.setToolTipText(newMessage);
-        lastMessageText = newMessage;
- 
-    }
-
-
-    /**
-     * Clear the error message. Restore the previously displayed message if
-     * there is one, if not restore the title label.
-     *  
-     */
-    public void clearErrorMessage() {
-        if (lastMessageText == null) {
-			restoreTitle();
-		} else {
-			updateText(lastMessageText, lastMessageType);
-		}
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/DialogPage.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/DialogPage.java
deleted file mode 100644
index 51a3fff..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/DialogPage.java
+++ /dev/null
@@ -1,472 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Abstract base implementation of a dialog page. All dialog pages are
- * subclasses of this one.
- */
-public abstract class DialogPage implements IDialogPage, IMessageProvider {
-    /**
-     * The control for this dialog page.
-     */
-    private Control control;
-
-    /**
-     * Optional title; <code>null</code> if none.
-     * 
-     * @see #setTitle
-     */
-    private String title = null;
-
-    /**
-     * Optional description; <code>null</code> if none.
-     * 
-     * @see #setDescription
-     */
-    private String description = null;
-
-    /**
-     * Cached image; <code>null</code> if none.
-     * 
-     * @see #setImageDescriptor(ImageDescriptor)
-     */
-    private Image image = null;
-
-    /**
-     * Optional image; <code>null</code> if none.
-     * 
-     * @see #setImageDescriptor(ImageDescriptor)
-     */
-    private ImageDescriptor imageDescriptor = null;
-
-    /**
-     * The current message; <code>null</code> if none.
-     */
-    private String message = null;
-
-    /**
-     * The current message type; default value <code>NONE</code>.
-     */
-    private int messageType = NONE;
-
-    /**
-     * The current error message; <code>null</code> if none.
-     */
-    private String errorMessage = null;
-
-    /**
-     * Font metrics to use for determining pixel sizes.
-     */
-    private FontMetrics fontMetrics;
-
-    /**
-     * Creates a new empty dialog page.
-     */
-    protected DialogPage() {
-        //No initial behaviour
-    }
-
-    /**
-     * Creates a new dialog page with the given title.
-     * 
-     * @param title
-     *            the title of this dialog page, or <code>null</code> if none
-     */
-    protected DialogPage(String title) {
-        this.title = title;
-    }
-
-    /**
-     * Creates a new dialog page with the given title and image.
-     * 
-     * @param title
-     *            the title of this dialog page, or <code>null</code> if none
-     * @param image
-     *            the image for this dialog page, or <code>null</code> if none
-     */
-    protected DialogPage(String title, ImageDescriptor image) {
-        this(title);
-        imageDescriptor = image;
-    }
-
-    /**
-     * Returns the number of pixels corresponding to the height of the given
-     * number of characters.
-     * <p>
-     * This method may only be called after <code>initializeDialogUnits</code>
-     * has been called.
-     * </p>
-     * <p>
-     * Clients may call this framework method, but should not override it.
-     * </p>
-     * 
-     * @param chars
-     *            the number of characters
-     * @return the number of pixels
-     */
-    protected int convertHeightInCharsToPixels(int chars) {
-        // test for failure to initialize for backward compatibility
-        if (fontMetrics == null) {
-			return 0;
-		}
-        return Dialog.convertHeightInCharsToPixels(fontMetrics, chars);
-    }
-
-    /**
-     * Returns the number of pixels corresponding to the given number of
-     * horizontal dialog units.
-     * <p>
-     * This method may only be called after <code>initializeDialogUnits</code>
-     * has been called.
-     * </p>
-     * <p>
-     * Clients may call this framework method, but should not override it.
-     * </p>
-     * 
-     * @param dlus
-     *            the number of horizontal dialog units
-     * @return the number of pixels
-     */
-    protected int convertHorizontalDLUsToPixels(int dlus) {
-        // test for failure to initialize for backward compatibility
-        if (fontMetrics == null) {
-			return 0;
-		}
-        return Dialog.convertHorizontalDLUsToPixels(fontMetrics, dlus);
-    }
-
-    /**
-     * Returns the number of pixels corresponding to the given number of
-     * vertical dialog units.
-     * <p>
-     * This method may only be called after <code>initializeDialogUnits</code>
-     * has been called.
-     * </p>
-     * <p>
-     * Clients may call this framework method, but should not override it.
-     * </p>
-     * 
-     * @param dlus
-     *            the number of vertical dialog units
-     * @return the number of pixels
-     */
-    protected int convertVerticalDLUsToPixels(int dlus) {
-        // test for failure to initialize for backward compatibility
-        if (fontMetrics == null) {
-			return 0;
-		}
-        return Dialog.convertVerticalDLUsToPixels(fontMetrics, dlus);
-    }
-
-    /**
-     * Returns the number of pixels corresponding to the width of the given
-     * number of characters.
-     * <p>
-     * This method may only be called after <code>initializeDialogUnits</code>
-     * has been called.
-     * </p>
-     * <p>
-     * Clients may call this framework method, but should not override it.
-     * </p>
-     * 
-     * @param chars
-     *            the number of characters
-     * @return the number of pixels
-     */
-    protected int convertWidthInCharsToPixels(int chars) {
-        // test for failure to initialize for backward compatibility
-        if (fontMetrics == null) {
-			return 0;
-		}
-        return Dialog.convertWidthInCharsToPixels(fontMetrics, chars);
-    }
-
-    /**
-     * The <code>DialogPage</code> implementation of this
-     * <code>IDialogPage</code> method disposes of the page
-     * image if it has one. 
-     * Subclasses may extend.
-     */
-    public void dispose() {
-        // deallocate SWT resources
-        if (image != null) {
-            image.dispose();
-            image = null;
-        }
-    }
-
-    /**
-     * Returns the top level control for this dialog page.
-     * 
-     * @return the top level control
-     */
-    public Control getControl() {
-        return control;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IDialogPage.
-     */
-    public String getDescription() {
-        return description;
-    }
-
-    /**
-     * Returns the symbolic font name used by dialog pages.
-     * 
-     * @return the symbolic font name
-     */
-    protected String getDialogFontName() {
-        return JFaceResources.DIALOG_FONT;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IDialogPage.
-     */
-    public String getErrorMessage() {
-        return errorMessage;
-    }
-
-    /**
-     * Returns the default font to use for this dialog page.
-     * 
-     * @return the font
-     */
-    protected Font getFont() {
-        return JFaceResources.getFontRegistry().get(getDialogFontName());
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IDialogPage.
-     */
-    public Image getImage() {
-        if (image == null) {
-            if (imageDescriptor != null) {
-                image = imageDescriptor.createImage();
-            }
-        }
-        return image;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IDialogPage.
-     */
-    public String getMessage() {
-        return message;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IMessageProvider.
-     */
-    public int getMessageType() {
-        return messageType;
-    }
-
-    /**
-     * Returns this dialog page's shell. Convenience method for
-     * <code>getControl().getShell()</code>. This method may only be called
-     * after the page's control has been created.
-     * 
-     * @return the shell
-     */
-    public Shell getShell() {
-        return getControl().getShell();
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IDialogPage.
-     */
-    public String getTitle() {
-        return title;
-    }
-
-    /**
-     * Returns the tool tip text for the widget with the given id.
-     * <p>
-     * The default implementation of this framework method does nothing and
-     * returns <code>null</code>. Subclasses may override.
-     * </p>
-     * 
-     * @param widgetId
-     *            the id of the widget for which hover help is requested
-     * @return the tool tip text, or <code>null</code> if none
-     * @deprecated 
-     */
-    protected final String getToolTipText(int widgetId) {
-        // return nothing by default
-        return null;
-    }
-
-    /**
-     * Initializes the computation of horizontal and vertical dialog units based
-     * on the size of current font.
-     * <p>
-     * This method must be called before any of the dialog unit based conversion
-     * methods are called.
-     * </p>
-     * 
-     * @param testControl
-     *            a control from which to obtain the current font
-     */
-    protected void initializeDialogUnits(Control testControl) {
-        // Compute and store a font metric
-        GC gc = new GC(testControl);
-        gc.setFont(JFaceResources.getDialogFont());
-        fontMetrics = gc.getFontMetrics();
-        gc.dispose();
-    }
-
-    /**
-     * Sets the <code>GridData</code> on the specified button to be one that
-     * is spaced for the current dialog page units. The method
-     * <code>initializeDialogUnits</code> must be called once before calling
-     * this method for the first time.
-     * 
-     * @param button
-     *            the button to set the <code>GridData</code>
-     * @return the <code>GridData</code> set on the specified button
-     */
-    protected GridData setButtonLayoutData(Button button) {
-        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-        Point minSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-        data.widthHint = Math.max(widthHint, minSize.x);
-        button.setLayoutData(data);
-        return data;
-    }
-
-    /**
-     * Tests whether this page's UI content has already been created.
-     * 
-     * @return <code>true</code> if the control has been created, and
-     *         <code>false</code> if not
-     */
-    protected boolean isControlCreated() {
-        return control != null;
-    }
-
-    /**
-     * This default implementation of an <code>IDialogPage</code> method does
-     * nothing. Subclasses should override to take some action in response to a
-     * help request.
-     */
-    public void performHelp() {
-        //No default help
-    }
-
-    /**
-     * Set the control for the receiver.
-     * @param newControl
-     */
-    protected void setControl(Control newControl) {
-        control = newControl;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IDialogPage.
-     */
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    /**
-     * Sets or clears the error message for this page.
-     * 
-     * @param newMessage
-     *            the message, or <code>null</code> to clear the error message
-     */
-    public void setErrorMessage(String newMessage) {
-        errorMessage = newMessage;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IDialogPage.
-     */
-    public void setImageDescriptor(ImageDescriptor desc) {
-        imageDescriptor = desc;
-        if (image != null) {
-            image.dispose();
-            image = null;
-        }
-    }
-
-    /**
-     * Sets or clears the message for this page.
-     * <p>
-     * This is a shortcut for <code>setMessage(newMesasge, NONE)</code>
-     * </p>
-     * 
-     * @param newMessage
-     *            the message, or <code>null</code> to clear the message
-     */
-    public void setMessage(String newMessage) {
-        setMessage(newMessage, NONE);
-    }
-
-    /**
-     * Sets the message for this page with an indication of what type of message
-     * it is.
-     * <p>
-     * The valid message types are one of <code>NONE</code>,
-     * <code>INFORMATION</code>,<code>WARNING</code>, or
-     * <code>ERROR</code>.
-     * </p>
-     * <p>
-     * Note that for backward compatibility, a message of type
-     * <code>ERROR</code> is different than an error message (set using
-     * <code>setErrorMessage</code>). An error message overrides the current
-     * message until the error message is cleared. This method replaces the
-     * current message and does not affect the error message.
-     * </p>
-     * 
-     * @param newMessage
-     *            the message, or <code>null</code> to clear the message
-     * @param newType
-     *            the message type
-     * @since 2.0
-     */
-    public void setMessage(String newMessage, int newType) {
-        message = newMessage;
-        messageType = newType;
-    }
-
-    /**
-     * The <code>DialogPage</code> implementation of this
-     * <code>IDialogPage</code> method remembers the title in an internal
-     * state variable. Subclasses may extend.
-     */
-    public void setTitle(String title) {
-        this.title = title;
-    }
-
-    /**
-     * The <code>DialogPage</code> implementation of this
-     * <code>IDialogPage</code> method sets the control to the given
-     * visibility state. Subclasses may extend.
-     */
-    public void setVisible(boolean visible) {
-        control.setVisible(visible);
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/DialogSettings.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/DialogSettings.java
deleted file mode 100644
index 22ae5e6..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/DialogSettings.java
+++ /dev/null
@@ -1,563 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Concrete implementation of a dialog settings (<code>IDialogSettings</code>)
- * using a hash table and XML. The dialog store can be read
- * from and saved to a stream. All keys and values must be strings or array of
- * strings. Primitive types are converted to strings.
- * <p>
- * This class was not designed to be subclassed.
- *
- * Here is an example of using a DialogSettings:
- * </p>
- * <pre>
- * <code>
- * DialogSettings settings = new DialogSettings("root");
- * settings.put("Boolean1",true);
- * settings.put("Long1",100);
- * settings.put("Array1",new String[]{"aaaa1","bbbb1","cccc1"});
- * DialogSettings section = new DialogSettings("sectionName");
- * settings.addSection(section);
- * section.put("Int2",200);
- * section.put("Float2",1.1);
- * section.put("Array2",new String[]{"aaaa2","bbbb2","cccc2"});
- * settings.save("c:\\temp\\test\\dialog.xml");
- * </code>
- * </pre>
- * @noextend This class is not intended to be subclassed by clients.
- */
-
-public class DialogSettings implements IDialogSettings {
-    // The name of the DialogSettings.
-    private String name;
-
-    /* A Map of DialogSettings representing each sections in a DialogSettings.
-     It maps the DialogSettings' name to the DialogSettings */
-    private Map sections;
-
-    /* A Map with all the keys and values of this sections.
-     Either the keys an values are restricted to strings. */
-    private Map items;
-
-    // A Map with all the keys mapped to array of strings.
-    private Map arrayItems;
-
-    private static final String TAG_SECTION = "section";//$NON-NLS-1$
-
-    private static final String TAG_NAME = "name";//$NON-NLS-1$
-
-    private static final String TAG_KEY = "key";//$NON-NLS-1$
-
-    private static final String TAG_VALUE = "value";//$NON-NLS-1$
-
-    private static final String TAG_LIST = "list";//$NON-NLS-1$
-
-    private static final String TAG_ITEM = "item";//$NON-NLS-1$
-
-    /**
-     * Create an empty dialog settings which loads and saves its
-     * content to a file.
-     * Use the methods <code>load(String)</code> and <code>store(String)</code>
-     * to load and store this dialog settings.
-     *
-     * @param sectionName the name of the section in the settings.
-     */
-    public DialogSettings(String sectionName) {
-        name = sectionName;
-        items = new HashMap();
-        arrayItems = new HashMap();
-        sections = new HashMap();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public IDialogSettings addNewSection(String sectionName) {
-        DialogSettings section = new DialogSettings(sectionName);
-        addSection(section);
-        return section;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public void addSection(IDialogSettings section) {
-        sections.put(section.getName(), section);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public String get(String key) {
-        return (String) items.get(key);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public String[] getArray(String key) {
-        return (String[]) arrayItems.get(key);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public boolean getBoolean(String key) {
-        return Boolean.valueOf((String) items.get(key)).booleanValue();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public double getDouble(String key) throws NumberFormatException {
-        String setting = (String) items.get(key);
-        if (setting == null) {
-			throw new NumberFormatException(
-                    "There is no setting associated with the key \"" + key + "\"");//$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-        return new Double(setting).doubleValue();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public float getFloat(String key) throws NumberFormatException {
-        String setting = (String) items.get(key);
-        if (setting == null) {
-			throw new NumberFormatException(
-                    "There is no setting associated with the key \"" + key + "\"");//$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-        return new Float(setting).floatValue();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public int getInt(String key) throws NumberFormatException {
-        String setting = (String) items.get(key);
-        if (setting == null) {
-            //new Integer(null) will throw a NumberFormatException and meet our spec, but this message
-            //is clearer.
-            throw new NumberFormatException(
-                    "There is no setting associated with the key \"" + key + "\"");//$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        return new Integer(setting).intValue();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public long getLong(String key) throws NumberFormatException {
-        String setting = (String) items.get(key);
-        if (setting == null) {
-            //new Long(null) will throw a NumberFormatException and meet our spec, but this message
-            //is clearer.
-            throw new NumberFormatException(
-                    "There is no setting associated with the key \"" + key + "\"");//$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        return new Long(setting).longValue();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public String getName() {
-        return name;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public IDialogSettings getSection(String sectionName) {
-        return (IDialogSettings) sections.get(sectionName);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public IDialogSettings[] getSections() {
-        Collection values = sections.values();
-        DialogSettings[] result = new DialogSettings[values.size()];
-        values.toArray(result);
-        return result;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public void load(Reader r) {
-        Document document = null;
-        try {
-            DocumentBuilder parser = DocumentBuilderFactory.newInstance()
-                    .newDocumentBuilder();
-            //		parser.setProcessNamespace(true);
-            document = parser.parse(new InputSource(r));
-
-            //Strip out any comments first
-            Node root = document.getFirstChild();
-            while (root.getNodeType() == Node.COMMENT_NODE) {
-                document.removeChild(root);
-                root = document.getFirstChild();
-            }
-            load(document, (Element) root);
-        } catch (ParserConfigurationException e) {
-            // ignore
-        } catch (IOException e) {
-            // ignore
-        } catch (SAXException e) {
-            // ignore
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public void load(String fileName) throws IOException {
-        FileInputStream stream = new FileInputStream(fileName);
-        BufferedReader reader = new BufferedReader(new InputStreamReader(
-                stream, "utf-8"));//$NON-NLS-1$
-        load(reader);
-        reader.close();
-    }
-
-    /* (non-Javadoc)
-     * Load the setting from the <code>document</code>
-     */
-    private void load(Document document, Element root) {
-        name = root.getAttribute(TAG_NAME);
-        NodeList l = root.getElementsByTagName(TAG_ITEM);
-        for (int i = 0; i < l.getLength(); i++) {
-            Node n = l.item(i);
-            if (root == n.getParentNode()) {
-                String key = ((Element) l.item(i)).getAttribute(TAG_KEY);
-                String value = ((Element) l.item(i)).getAttribute(TAG_VALUE);
-                items.put(key, value);
-            }
-        }
-        l = root.getElementsByTagName(TAG_LIST);
-        for (int i = 0; i < l.getLength(); i++) {
-            Node n = l.item(i);
-            if (root == n.getParentNode()) {
-                Element child = (Element) l.item(i);
-                String key = child.getAttribute(TAG_KEY);
-                NodeList list = child.getElementsByTagName(TAG_ITEM);
-                List valueList = new ArrayList();
-                for (int j = 0; j < list.getLength(); j++) {
-                    Element node = (Element) list.item(j);
-                    if (child == node.getParentNode()) {
-                        valueList.add(node.getAttribute(TAG_VALUE));
-                    }
-                }
-                String[] value = new String[valueList.size()];
-                valueList.toArray(value);
-                arrayItems.put(key, value);
-            }
-        }
-        l = root.getElementsByTagName(TAG_SECTION);
-        for (int i = 0; i < l.getLength(); i++) {
-            Node n = l.item(i);
-            if (root == n.getParentNode()) {
-                DialogSettings s = new DialogSettings("NoName");//$NON-NLS-1$
-                s.load(document, (Element) n);
-                addSection(s);
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public void put(String key, String[] value) {
-        arrayItems.put(key, value);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public void put(String key, double value) {
-        put(key, String.valueOf(value));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public void put(String key, float value) {
-        put(key, String.valueOf(value));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public void put(String key, int value) {
-        put(key, String.valueOf(value));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public void put(String key, long value) {
-        put(key, String.valueOf(value));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public void put(String key, String value) {
-        items.put(key, value);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public void put(String key, boolean value) {
-        put(key, String.valueOf(value));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-	public void save(Writer writer) {
-    	save(new XMLWriter(writer));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogSettings.
-     */
-    public void save(String fileName) throws IOException {
-        FileOutputStream stream = new FileOutputStream(fileName);
-        XMLWriter writer = new XMLWriter(stream);
-        save(writer);
-        writer.close();
-    }
-
-    /* (non-Javadoc)
-     * Save the settings in the <code>document</code>.
-     */
-    private void save(XMLWriter out) {
-    	HashMap attributes = new HashMap(2);
-    	attributes.put(TAG_NAME, name == null ? "" : name); //$NON-NLS-1$
-        out.startTag(TAG_SECTION, attributes);
-        attributes.clear();
-
-        for (Iterator i = items.keySet().iterator(); i.hasNext();) {
-            String key = (String) i.next();
-            attributes.put(TAG_KEY, key == null ? "" : key); //$NON-NLS-1$
-            String string = (String) items.get(key);
-            attributes.put(TAG_VALUE, string == null ? "" : string); //$NON-NLS-1$
-            out.printTag(TAG_ITEM, attributes, true);
-        }
-
-        attributes.clear();
-        for (Iterator i = arrayItems.keySet().iterator(); i.hasNext();) {
-            String key = (String) i.next();
-            attributes.put(TAG_KEY, key == null ? "" : key); //$NON-NLS-1$
-            out.startTag(TAG_LIST, attributes);
-            String[] value = (String[]) arrayItems.get(key);
-            attributes.clear();
-            if (value != null) {
-                for (int index = 0; index < value.length; index++) {
-                    String string = value[index];
-                    attributes.put(TAG_VALUE, string == null ? "" : string); //$NON-NLS-1$
-                    out.printTag(TAG_ITEM, attributes, true);
-                }
-            }
-            out.endTag(TAG_LIST);
-            attributes.clear();
-        }
-        for (Iterator i = sections.values().iterator(); i.hasNext();) {
-            ((DialogSettings) i.next()).save(out);
-        }
-        out.endTag(TAG_SECTION);
-    }
-    
-    /**
-     * A simple XML writer.  Using this instead of the javax.xml.transform classes allows
-     * compilation against JCL Foundation (bug 80059).
-     */
-    private static class XMLWriter extends PrintWriter {
-    	/** current number of tabs to use for ident */
-    	protected int tab;
-
-    	/** the xml header */
-    	protected static final String XML_VERSION = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; //$NON-NLS-1$
-
-    	/**
-    	 * Create a new XMLWriter
-    	 * @param output the stream to write the output to
-    	 * @throws UnsupportedEncodingException thrown if charset is not supported
-    	 */
-    	public XMLWriter(OutputStream output) throws UnsupportedEncodingException {
-    		super(new OutputStreamWriter(output, "UTF8")); //$NON-NLS-1$
-    		tab = 0;
-    		println(XML_VERSION);
-    	}
-
-    	/**
-    	 * Create a new XMLWriter
-    	 * @param output the write to used when writing to
-    	 */
-    	public XMLWriter(Writer output) {
-    		super(output);
-    		tab = 0;
-    		println(XML_VERSION);
-    	}
-
-    	/**
-    	 * write the intended end tag
-    	 * @param name the name of the tag to end
-    	 */
-    	public void endTag(String name) {
-    		tab--;
-    		printTag("/" + name, null, false); //$NON-NLS-1$
-    	}
-
-    	private void printTabulation() {
-    		for (int i = 0; i < tab; i++) {
-				super.print('\t');
-			}
-    	}
-
-    	/**
-    	 * write the tag to the stream and format it by itending it and add new line after the tag
-    	 * @param name the name of the tag
-    	 * @param parameters map of parameters
-    	 * @param close should the tag be ended automatically (=> empty tag)
-    	 */
-    	public void printTag(String name, HashMap parameters, boolean close) {
-    		printTag(name, parameters, true, true, close);
-    	}
-
-    	private void printTag(String name, HashMap parameters, boolean shouldTab, boolean newLine, boolean close) {
-    		StringBuffer sb = new StringBuffer();
-    		sb.append('<');
-    		sb.append(name);
-    		if (parameters != null) {
-				for (Enumeration e = Collections.enumeration(parameters.keySet()); e.hasMoreElements();) {
-    				sb.append(" "); //$NON-NLS-1$
-    				String key = (String) e.nextElement();
-    				sb.append(key);
-    				sb.append("=\""); //$NON-NLS-1$
-    				sb.append(getEscaped(String.valueOf(parameters.get(key))));
-    				sb.append("\""); //$NON-NLS-1$
-    			}
-			}
-    		if (close) {
-				sb.append('/');
-			}
-    		sb.append('>');
-    		if (shouldTab) {
-				printTabulation();
-			}
-    		if (newLine) {
-				println(sb.toString());
-			} else {
-				print(sb.toString());
-			}
-    	}
-
-    	/**
-    	 * start the tag
-    	 * @param name the name of the tag
-    	 * @param parameters map of parameters
-    	 */
-    	public void startTag(String name, HashMap parameters) {
-    		startTag(name, parameters, true);
-    		tab++;
-    	}
-
-    	private void startTag(String name, HashMap parameters, boolean newLine) {
-    		printTag(name, parameters, true, newLine, false);
-    	}
-
-    	private static void appendEscapedChar(StringBuffer buffer, char c) {
-    		String replacement = getReplacement(c);
-    		if (replacement != null) {
-    			buffer.append('&');
-    			buffer.append(replacement);
-    			buffer.append(';');
-    		} else {
-    			buffer.append(c);
-    		}
-    	}
-
-    	private static String getEscaped(String s) {
-    		StringBuffer result = new StringBuffer(s.length() + 10);
-    		for (int i = 0; i < s.length(); ++i) {
-				appendEscapedChar(result, s.charAt(i));
-			}
-    		return result.toString();
-    	}
-
-    	private static String getReplacement(char c) {
-    		// Encode special XML characters into the equivalent character references.
-    		// The first five are defined by default for all XML documents.
-    		// The next three (#xD, #xA, #x9) are encoded to avoid them
-			// being converted to spaces on deserialization
-    		switch (c) {
-    			case '<' :
-    				return "lt"; //$NON-NLS-1$
-    			case '>' :
-    				return "gt"; //$NON-NLS-1$
-    			case '"' :
-    				return "quot"; //$NON-NLS-1$
-    			case '\'' :
-    				return "apos"; //$NON-NLS-1$
-    			case '&' :
-    				return "amp"; //$NON-NLS-1$
-    			case '\r':
-					return "#x0D"; //$NON-NLS-1$
-				case '\n':
-					return "#x0A"; //$NON-NLS-1$
-				case '\u0009':
-					return "#x09"; //$NON-NLS-1$
-    		}
-    		return null;
-    	}
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/DialogTray.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/DialogTray.java
deleted file mode 100644
index 444ae1d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/DialogTray.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * <p>
- * This class is the abstract superclass of all dialog trays. A tray can be opened
- * in any <code>TrayDialog</code>.
- * </p>
- * 
- * @see org.eclipse.jface.dialogs.TrayDialog
- * @since 3.2
- */
-public abstract class DialogTray {
-
-	/**
-	 * Creates the contents (widgets) that will be contained in the tray.
-	 * <p>
-	 * Tray implementions must not set a layout on the parent composite, or assume
-	 * a particular layout on the parent. The tray dialog will allocate space
-	 * according to the natural size of the tray, and will fill the tray area with the
-	 * tray's contents.
-	 * </p>
-	 * 
-	 * @param parent the composite that will contain the tray
-	 * @return the contents of the tray, as a <code>Control</code>
-	 */
-	protected abstract Control createContents(Composite parent);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ErrorDialog.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ErrorDialog.java
deleted file mode 100644
index 7f8fc23..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ErrorDialog.java
+++ /dev/null
@@ -1,692 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * 		IBM Corporation - initial API and implementation 
- * 		Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog font should
- * 			be activated and used by other components.
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-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.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A dialog to display one or more errors to the user, as contained in an
- * <code>IStatus</code> object. If an error contains additional detailed
- * information then a Details button is automatically supplied, which shows or
- * hides an error details viewer when pressed by the user.
- * 
- * @see org.eclipse.core.runtime.IStatus
- */
-public class ErrorDialog extends IconAndMessageDialog {
-	/**
-	 * Static to prevent opening of error dialogs for automated testing.
-	 */
-	public static boolean AUTOMATED_MODE = false;
-
-	/**
-	 * Reserve room for this many list items.
-	 */
-	private static final int LIST_ITEM_COUNT = 7;
-
-	/**
-	 * The nesting indent.
-	 */
-	private static final String NESTING_INDENT = "  "; //$NON-NLS-1$
-
-	/**
-	 * The Details button.
-	 */
-	private Button detailsButton;
-
-	/**
-	 * The title of the dialog.
-	 */
-	private String title;
-
-	/**
-	 * The SWT list control that displays the error details.
-	 */
-	private List list;
-
-	/**
-	 * Indicates whether the error details viewer is currently created.
-	 */
-	private boolean listCreated = false;
-
-	/**
-	 * Filter mask for determining which status items to display.
-	 */
-	private int displayMask = 0xFFFF;
-
-	/**
-	 * The main status object.
-	 */
-	private IStatus status;
-
-	/**
-	 * The current clipboard. To be disposed when closing the dialog.
-	 */
-	private Clipboard clipboard;
-
-	private boolean shouldIncludeTopLevelErrorInDetails = false;
-
-
-	/**
-	 * Creates an error dialog. Note that the dialog will have no visual
-	 * representation (no widgets) until it is told to open.
-	 * <p>
-	 * Normally one should use <code>openError</code> to create and open one
-	 * of these. This constructor is useful only if the error object being
-	 * displayed contains child items <it>and </it> you need to specify a mask
-	 * which will be used to filter the displaying of these children. The error
-	 * dialog will only be displayed if there is at least one child status
-	 * matching the mask.
-	 * </p>
-	 * 
-	 * @param parentShell
-	 *            the shell under which to create this dialog
-	 * @param dialogTitle
-	 *            the title to use for this dialog, or <code>null</code> to
-	 *            indicate that the default title should be used
-	 * @param message
-	 *            the message to show in this dialog, or <code>null</code> to
-	 *            indicate that the error's message should be shown as the
-	 *            primary message
-	 * @param status
-	 *            the error to show to the user
-	 * @param displayMask
-	 *            the mask to use to filter the displaying of child items, as
-	 *            per <code>IStatus.matches</code>
-	 * @see org.eclipse.core.runtime.IStatus#matches(int)
-	 */
-	public ErrorDialog(Shell parentShell, String dialogTitle, String message,
-			IStatus status, int displayMask) {
-		super(parentShell);
-		this.title = dialogTitle == null ? JFaceResources
-				.getString("Problem_Occurred") : //$NON-NLS-1$
-				dialogTitle;
-		this.message = message == null ? status.getMessage()
-				: JFaceResources
-						.format(
-								"Reason", new Object[] { message, status.getMessage() }); //$NON-NLS-1$
-		this.status = status;
-		this.displayMask = displayMask;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog. Handles the pressing of the Ok
-	 * or Details button in this dialog. If the Ok button was pressed then close
-	 * this dialog. If the Details button was pressed then toggle the displaying
-	 * of the error details area. Note that the Details button will only be
-	 * visible if the error being displayed specifies child details.
-	 */
-	protected void buttonPressed(int id) {
-		if (id == IDialogConstants.DETAILS_ID) {
-			// was the details button pressed?
-			toggleDetailsArea();
-		} else {
-			super.buttonPressed(id);
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in Window.
-	 */
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		shell.setText(title);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		// create OK and Details buttons
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-		createDetailsButton(parent);
-	}
-
-	/**
-	 * Create the area for extra error support information.
-	 * 
-	 * @param parent
-	 */
-	private void createSupportArea(Composite parent) {
-
-		ErrorSupportProvider provider = Policy.getErrorSupportProvider();
-
-		if (provider == null)
-			return;
-
-		Composite supportArea = new Composite(parent, SWT.NONE);
-		provider.createSupportArea(supportArea, status);
-
-		GridData supportData = new GridData(SWT.FILL, SWT.FILL, true, true);
-		supportData.verticalSpan = 3;
-		supportArea.setLayoutData(supportData);
-		if (supportArea.getLayout() == null){
-			GridLayout layout = new GridLayout();
-			layout.marginWidth = 0;
-			layout.marginHeight = 0;
-			supportArea.setLayout(layout); // Give it a default layout if one isn't set
-		}
-
-
-	}
-
-	/**
-	 * Create the details button if it should be included.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @since 3.2
-	 */
-	protected void createDetailsButton(Composite parent) {
-		if (shouldShowDetailsButton()) {
-			detailsButton = createButton(parent, IDialogConstants.DETAILS_ID,
-					IDialogConstants.SHOW_DETAILS_LABEL, false);
-		}
-	}
-
-	/**
-	 * This implementation of the <code>Dialog</code> framework method creates
-	 * and lays out a composite. Subclasses that require a different dialog area
-	 * may either override this method, or call the <code>super</code>
-	 * implementation and add controls to the created composite.
-	 * 
-	 * Note:  Since 3.4, the created composite no longer grabs excess vertical space.
-	 * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=72489.
-	 * If the old behavior is desired by subclasses, get the returned composite's
-	 * layout data and set grabExcessVerticalSpace to true.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		// Create a composite with standard margins and spacing
-		// Add the messageArea to this composite so that as subclasses add widgets to the messageArea
-		// and dialogArea, the number of children of parent remains fixed and with consistent layout.
-		// Fixes bug #240135
-		Composite composite = new Composite(parent, SWT.NONE);
-		createMessageArea(composite);
-		createSupportArea(parent);
-		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);
-		layout.numColumns = 2;
-		composite.setLayout(layout);
-		GridData childData = new GridData(GridData.FILL_BOTH);
-		childData.horizontalSpan = 2;
-		childData.grabExcessVerticalSpace = false;
-		composite.setLayoutData(childData);
-		composite.setFont(parent.getFont());
-
-		return composite;
-	}
-
-	/*
-	 * @see IconAndMessageDialog#createDialogAndButtonArea(Composite)
-	 */
-	protected void createDialogAndButtonArea(Composite parent) {
-		super.createDialogAndButtonArea(parent);
-		if (this.dialogArea instanceof Composite) {
-			// Create a label if there are no children to force a smaller layout
-			Composite dialogComposite = (Composite) dialogArea;
-			if (dialogComposite.getChildren().length == 0) {
-				new Label(dialogComposite, SWT.NULL);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IconAndMessageDialog#getImage()
-	 */
-	protected Image getImage() {
-		if (status != null) {
-			if (status.getSeverity() == IStatus.WARNING) {
-				return getWarningImage();
-			}
-			if (status.getSeverity() == IStatus.INFO) {
-				return getInfoImage();
-			}
-		}
-		// If it was not a warning or an error then return the error image
-		return getErrorImage();
-	}
-
-	/**
-	 * Create this dialog's drop-down list component.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @return the drop-down list component
-	 */
-	protected List createDropDownList(Composite parent) {
-		// create the list
-		list = new List(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.MULTI);
-		// fill the list
-		populateList(list);
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL
-				| GridData.GRAB_VERTICAL);
-		data.heightHint = list.getItemHeight() * LIST_ITEM_COUNT;
-		data.horizontalSpan = 2;
-		list.setLayoutData(data);
-		list.setFont(parent.getFont());
-		Menu copyMenu = new Menu(list);
-		MenuItem copyItem = new MenuItem(copyMenu, SWT.NONE);
-		copyItem.addSelectionListener(new SelectionListener() {
-			/*
-			 * @see SelectionListener.widgetSelected (SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				copyToClipboard();
-			}
-
-			/*
-			 * @see SelectionListener.widgetDefaultSelected(SelectionEvent)
-			 */
-			public void widgetDefaultSelected(SelectionEvent e) {
-				copyToClipboard();
-			}
-		});
-		copyItem.setText(JFaceResources.getString("copy")); //$NON-NLS-1$
-		list.setMenu(copyMenu);
-		listCreated = true;
-		return list;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Window.
-	 */
-	/**
-	 * Extends <code>Window.open()</code>. Opens an error dialog to display
-	 * the error. If you specified a mask to filter the displaying of these
-	 * children, the error dialog will only be displayed if there is at least
-	 * one child status matching the mask.
-	 */
-	public int open() {
-		if (!AUTOMATED_MODE && shouldDisplay(status, displayMask)) {
-			return super.open();
-		}
-		setReturnCode(OK);
-		return OK;
-	}
-
-	/**
-	 * Opens an error dialog to display the given error. Use this method if the
-	 * error object being displayed does not contain child items, or if you wish
-	 * to display all such items without filtering.
-	 * 
-	 * @param parent
-	 *            the parent shell of the dialog, or <code>null</code> if none
-	 * @param dialogTitle
-	 *            the title to use for this dialog, or <code>null</code> to
-	 *            indicate that the default title should be used
-	 * @param message
-	 *            the message to show in this dialog, or <code>null</code> to
-	 *            indicate that the error's message should be shown as the
-	 *            primary message
-	 * @param status
-	 *            the error to show to the user
-	 * @return the code of the button that was pressed that resulted in this
-	 *         dialog closing. This will be <code>Dialog.OK</code> if the OK
-	 *         button was pressed, or <code>Dialog.CANCEL</code> if this
-	 *         dialog's close window decoration or the ESC key was used.
-	 */
-	public static int openError(Shell parent, String dialogTitle,
-			String message, IStatus status) {
-		return openError(parent, dialogTitle, message, status, IStatus.OK
-				| IStatus.INFO | IStatus.WARNING | IStatus.ERROR);
-	}
-
-	/**
-	 * Opens an error dialog to display the given error. Use this method if the
-	 * error object being displayed contains child items <it>and </it> you wish
-	 * to specify a mask which will be used to filter the displaying of these
-	 * children. The error dialog will only be displayed if there is at least
-	 * one child status matching the mask.
-	 * 
-	 * @param parentShell
-	 *            the parent shell of the dialog, or <code>null</code> if none
-	 * @param title
-	 *            the title to use for this dialog, or <code>null</code> to
-	 *            indicate that the default title should be used
-	 * @param message
-	 *            the message to show in this dialog, or <code>null</code> to
-	 *            indicate that the error's message should be shown as the
-	 *            primary message
-	 * @param status
-	 *            the error to show to the user
-	 * @param displayMask
-	 *            the mask to use to filter the displaying of child items, as
-	 *            per <code>IStatus.matches</code>
-	 * @return the code of the button that was pressed that resulted in this
-	 *         dialog closing. This will be <code>Dialog.OK</code> if the OK
-	 *         button was pressed, or <code>Dialog.CANCEL</code> if this
-	 *         dialog's close window decoration or the ESC key was used.
-	 * @see org.eclipse.core.runtime.IStatus#matches(int)
-	 */
-	public static int openError(Shell parentShell, String title,
-			String message, IStatus status, int displayMask) {
-		ErrorDialog dialog = new ErrorDialog(parentShell, title, message,
-				status, displayMask);
-		return dialog.open();
-	}
-
-	/**
-	 * Populates the list using this error dialog's status object. This walks
-	 * the child static of the status object and displays them in a list. The
-	 * format for each entry is status_path : status_message If the status's
-	 * path was null then it (and the colon) are omitted.
-	 * 
-	 * @param listToPopulate
-	 *            The list to fill.
-	 */
-	private void populateList(List listToPopulate) {
-		populateList(listToPopulate, status, 0,
-				shouldIncludeTopLevelErrorInDetails);
-	}
-
-	/**
-	 * Populate the list with the messages from the given status. Traverse the
-	 * children of the status deeply and also traverse CoreExceptions that
-	 * appear in the status.
-	 * 
-	 * @param listToPopulate
-	 *            the list to populate
-	 * @param buildingStatus
-	 *            the status being displayed
-	 * @param nesting
-	 *            the nesting level (increases one level for each level of
-	 *            children)
-	 * @param includeStatus
-	 *            whether to include the buildingStatus in the display or just
-	 *            its children
-	 */
-	private void populateList(List listToPopulate, IStatus buildingStatus,
-			int nesting, boolean includeStatus) {
-
-		if (!buildingStatus.matches(displayMask)) {
-			return;
-		}
-
-		Throwable t = buildingStatus.getException();
-		boolean isCoreException = t instanceof CoreException;
-		boolean incrementNesting = false;
-
-		if (includeStatus) {
-			StringBuffer sb = new StringBuffer();
-			for (int i = 0; i < nesting; i++) {
-				sb.append(NESTING_INDENT);
-			}
-			String message = buildingStatus.getMessage();
-			sb.append(message);
-			listToPopulate.add(sb.toString());
-			incrementNesting = true;
-		}
-
-		if (!isCoreException && t != null) {
-			// Include low-level exception message
-			StringBuffer sb = new StringBuffer();
-			for (int i = 0; i < nesting; i++) {
-				sb.append(NESTING_INDENT);
-			}
-			String message = t.getLocalizedMessage();
-			if (message == null) {
-				message = t.toString();
-			}
-
-			sb.append(message);
-			listToPopulate.add(sb.toString());
-			incrementNesting = true;
-		}
-
-		if (incrementNesting) {
-			nesting++;
-		}
-
-		// Look for a nested core exception
-		if (isCoreException) {
-			CoreException ce = (CoreException) t;
-			IStatus eStatus = ce.getStatus();
-			// Only print the exception message if it is not contained in the
-			// parent message
-			if (message == null || message.indexOf(eStatus.getMessage()) == -1) {
-				populateList(listToPopulate, eStatus, nesting, true);
-			}
-		}
-
-		// Look for child status
-		IStatus[] children = buildingStatus.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			populateList(listToPopulate, children[i], nesting, true);
-		}
-	}
-
-	/**
-	 * Returns whether the given status object should be displayed.
-	 * 
-	 * @param status
-	 *            a status object
-	 * @param mask
-	 *            a mask as per <code>IStatus.matches</code>
-	 * @return <code>true</code> if the given status should be displayed, and
-	 *         <code>false</code> otherwise
-	 * @see org.eclipse.core.runtime.IStatus#matches(int)
-	 */
-	protected static boolean shouldDisplay(IStatus status, int mask) {
-		IStatus[] children = status.getChildren();
-		if (children == null || children.length == 0) {
-			return status.matches(mask);
-		}
-		for (int i = 0; i < children.length; i++) {
-			if (children[i].matches(mask)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Toggles the unfolding of the details area. This is triggered by the user
-	 * pressing the details button.
-	 */
-	private void toggleDetailsArea() {
-		Point windowSize = getShell().getSize();
-		Point oldSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		if (listCreated) {
-			list.dispose();
-			listCreated = false;
-			detailsButton.setText(IDialogConstants.SHOW_DETAILS_LABEL);
-		} else {
-			list = createDropDownList((Composite) getContents());
-			detailsButton.setText(IDialogConstants.HIDE_DETAILS_LABEL);
-			getContents().getShell().layout();
-		}
-		Point newSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		getShell()
-				.setSize(
-						new Point(windowSize.x, windowSize.y
-								+ (newSize.y - oldSize.y)));
-	}
-
-	/**
-	 * Put the details of the status of the error onto the stream.
-	 * 
-	 * @param buildingStatus
-	 * @param buffer
-	 * @param nesting
-	 */
-	private void populateCopyBuffer(IStatus buildingStatus,
-			StringBuffer buffer, int nesting) {
-		if (!buildingStatus.matches(displayMask)) {
-			return;
-		}
-		for (int i = 0; i < nesting; i++) {
-			buffer.append(NESTING_INDENT);
-		}
-		buffer.append(buildingStatus.getMessage());
-		buffer.append("\n"); //$NON-NLS-1$
-
-		// Look for a nested core exception
-		Throwable t = buildingStatus.getException();
-		if (t instanceof CoreException) {
-			CoreException ce = (CoreException) t;
-			populateCopyBuffer(ce.getStatus(), buffer, nesting + 1);
-		} else if (t != null) {
-			// Include low-level exception message
-			for (int i = 0; i < nesting; i++) {
-				buffer.append(NESTING_INDENT);
-			}
-			String message = t.getLocalizedMessage();
-			if (message == null) {
-				message = t.toString();
-			}
-			buffer.append(message);
-			buffer.append("\n"); //$NON-NLS-1$
-		}
-
-		IStatus[] children = buildingStatus.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			populateCopyBuffer(children[i], buffer, nesting + 1);
-		}
-	}
-
-	/**
-	 * Copy the contents of the statuses to the clipboard.
-	 */
-	private void copyToClipboard() {
-		if (clipboard != null) {
-			clipboard.dispose();
-		}
-		StringBuffer statusBuffer = new StringBuffer();
-		populateCopyBuffer(status, statusBuffer, 0);
-		clipboard = new Clipboard(list.getDisplay());
-		clipboard.setContents(new Object[] { statusBuffer.toString() },
-				new Transfer[] { TextTransfer.getInstance() });
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#close()
-	 */
-	public boolean close() {
-		if (clipboard != null) {
-			clipboard.dispose();
-		}
-		return super.close();
-	}
-
-	/**
-	 * Show the details portion of the dialog if it is not already visible. This
-	 * method will only work when it is invoked after the control of the dialog
-	 * has been set. In other words, after the <code>createContents</code>
-	 * method has been invoked and has returned the control for the content area
-	 * of the dialog. Invoking the method before the content area has been set
-	 * or after the dialog has been disposed will have no effect.
-	 * 
-	 * @since 3.1
-	 */
-	protected final void showDetailsArea() {
-		if (!listCreated) {
-			Control control = getContents();
-			if (control != null && !control.isDisposed()) {
-				toggleDetailsArea();
-			}
-		}
-	}
-
-	/**
-	 * Return whether the Details button should be included. This method is
-	 * invoked once when the dialog is built. By default, the Details button is
-	 * only included if the status used when creating the dialog was a
-	 * multi-status or if the status contains an exception. Subclasses may
-	 * override.
-	 * 
-	 * @return whether the Details button should be included
-	 * @since 3.1
-	 */
-	protected boolean shouldShowDetailsButton() {
-		return status.isMultiStatus() || status.getException() != null;
-	}
-
-	/**
-	 * Set the status displayed by this error dialog to the given status. This
-	 * only affects the status displayed by the Details list. The message, image
-	 * and title should be updated by the subclass, if desired.
-	 * 
-	 * @param status
-	 *            the status to be displayed in the details list
-	 * @since 3.1
-	 */
-	protected final void setStatus(IStatus status) {
-		if (this.status != status) {
-			this.status = status;
-		}
-		shouldIncludeTopLevelErrorInDetails = true;
-		if (listCreated) {
-			repopulateList();
-		}
-	}
-
-	/**
-	 * Repopulate the supplied list widget.
-	 */
-	private void repopulateList() {
-		if (list != null && !list.isDisposed()) {
-			list.removeAll();
-			populateList(list);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IconAndMessageDialog#getColumnCount()
-	 */
-	int getColumnCount() {
-		if (Policy.getErrorSupportProvider() == null)
-			return 2;
-		return 3;
-	}
-	
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#isResizable()
-     */
-    protected boolean isResizable() {
-    	return true;
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ErrorSupportProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ErrorSupportProvider.java
deleted file mode 100644
index 9293ac9..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ErrorSupportProvider.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A ErrorSupportProvider defines the area to be shown in an error dialog for extra support information.
- * @since 3.3
- *
- */
-public abstract class ErrorSupportProvider {
-	
-	
-		/**
-		 * Create an area for adding support components as a child of parent.
-		 * @param parent The parent {@link Composite}
-		 * @param status The {@link IStatus} that is being displayed.
-		 * @return Control
-		 */
-		public abstract Control createSupportArea(Composite parent, IStatus status);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IDialogBlockedHandler.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IDialogBlockedHandler.java
deleted file mode 100644
index 5affefc..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IDialogBlockedHandler.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * The IDialogBlockedHandler is the handler used by
- * JFace to provide extra information when a
- * blocking has occured. There is one static instance
- * of this class used by WizardDialog and ModalContext.
- * @see org.eclipse.core.runtime.IProgressMonitorWithBlocking#clearBlocked()
- * @see  org.eclipse.core.runtime.IProgressMonitorWithBlocking#setBlocked(IStatus)
- * @see WizardDialog
- * @since 3.0
- */
-public interface IDialogBlockedHandler {
-    /**
-     * The blockage has been cleared. Clear the
-     * extra information and resume.
-     */
-    public void clearBlocked();
-
-    /**
-     * A blockage has occured. Show the blockage and 
-     * forward any actions to blockingMonitor. 
-     * <b>NOTE:</b> This will open any blocked notification immediately
-     * even if there is a modal shell open.
-     * 
-     * @param parentShell The shell this is being sent from. If the parent
-     * shell is <code>null</code> the behavior will be the same as
-     * IDialogBlockedHandler#showBlocked(IProgressMonitor, IStatus, String)
-     * 
-     * @param blocking The monitor to forward to. This is most
-     * important for calls to <code>cancel()</code>.
-     * @param blockingStatus The status that describes the blockage
-     * @param blockedName The name of the locked operation.
-     * @see IDialogBlockedHandler#showBlocked(IProgressMonitor, IStatus, String)
-     */
-    public void showBlocked(Shell parentShell, IProgressMonitor blocking,
-            IStatus blockingStatus, String blockedName);
-
-    /**
-     * A blockage has occured. Show the blockage when there is 
-     * no longer any modal shells in the UI and forward any actions 
-     * to blockingMonitor. 
-     * 
-     * <b>NOTE:</b> As no shell has been specified this method will
-     * not open any blocked notification until all other modal shells
-     * have been closed.
-     * 
-     * @param blocking The monitor to forward to. This is most
-     * important for calls to <code>cancel()</code>.
-     * @param blockingStatus The status that describes the blockage
-     * @param blockedName The name of the locked operation.
-     */
-    public void showBlocked(IProgressMonitor blocking, IStatus blockingStatus,
-            String blockedName);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IDialogConstants.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IDialogConstants.java
deleted file mode 100644
index 883a4c2..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IDialogConstants.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-/**
- * Various dialog-related constants.
- * <p>
- * Within the dialog framework, all buttons are referred to by a button id.
- * Various common buttons, like "OK", "Cancel", and "Finish", have pre-assigned
- * button ids for convenience. If an application requires other dialog buttons,
- * they should be assigned application-specific button ids counting up from
- * <code>CLIENT_ID</code>.
- * </p>
- * <p>
- * Button label constants are also provided for the common buttons. JFace
- * automatically localizes these strings to the current locale; that is,
- * <code>YES_LABEL</code> would be bound to the string <code>"Si"</code> in
- * a Spanish locale, but to <code>"Oui"</code> in a French one.
- * </p>
- * <p>
- * All margins, spacings, and sizes are given in "dialog units" (DLUs), where
- * <ul>
- * <li>1 horizontal DLU = 1/4 average character width</li>
- * <li>1 vertical DLU = 1/8 average character height</li>
- * </ul>
- * </p>
- */
-import org.eclipse.jface.resource.JFaceResources;
-
-/**
- * IDialogConstants is the interface for common dialog strings and ids
- * used throughout JFace.
- * It is recommended that you use these labels and ids whereever 
- * for consistency with the JFace dialogs.
- */
-public interface IDialogConstants {
-    // button ids
-	
-	// Note:  if new button ids are added, see 
-	// MessageDialogWithToggle.mapButtonLabelToButtonID(String, int)
-    /**
-     * Button id for an "Ok" button (value 0).
-     */
-    public int OK_ID = 0;
-
-    /**
-     * Button id for a "Cancel" button (value 1).
-     */
-    public int CANCEL_ID = 1;
-
-    /**
-     * Button id for a "Yes" button (value 2).
-     */
-    public int YES_ID = 2;
-
-    /**
-     * Button id for a "No" button (value 3).
-     */
-    public int NO_ID = 3;
-
-    /**
-     * Button id for a "Yes to All" button (value 4).
-     */
-    public int YES_TO_ALL_ID = 4;
-
-    /**
-     * Button id for a "Skip" button (value 5).
-     */
-    public int SKIP_ID = 5;
-
-    /**
-     * Button id for a "Stop" button (value 6).
-     */
-    public int STOP_ID = 6;
-
-    /**
-     * Button id for an "Abort" button (value 7).
-     */
-    public int ABORT_ID = 7;
-
-    /**
-     * Button id for a "Retry" button (value 8).
-     */
-    public int RETRY_ID = 8;
-
-    /**
-     * Button id for an "Ignore" button (value 9).
-     */
-    public int IGNORE_ID = 9;
-
-    /**
-     * Button id for a "Proceed" button (value 10).
-     */
-    public int PROCEED_ID = 10;
-
-    /**
-     * Button id for an "Open" button (value 11).
-     */
-    public int OPEN_ID = 11;
-
-    /**
-     * Button id for a "Close" button (value 12).
-     */
-    public int CLOSE_ID = 12;
-
-    /**
-     * Button id for a "Details" button (value 13).
-     */
-    public int DETAILS_ID = 13;
-
-    /**
-     * Button id for a "Back" button (value 14).
-     */
-    public int BACK_ID = 14;
-
-    /**
-     * Button id for a "Next" button (value 15).
-     */
-    public int NEXT_ID = 15;
-
-    /**
-     * Button id for a "Finish" button (value 16).
-     */
-    public int FINISH_ID = 16;
-
-    /**
-     * Button id for a "Help" button (value 17).
-     */
-    public int HELP_ID = 17;
-
-    /**
-     * Button id for a "Select All" button (value 18).
-     */
-    public int SELECT_ALL_ID = 18;
-
-    /**
-     * Button id for a "Deselect All" button (value 19).
-     */
-    public int DESELECT_ALL_ID = 19;
-
-    /**
-     * Button id for a "Select types" button (value 20).
-     */
-    public int SELECT_TYPES_ID = 20;
-
-    /**
-     * Button id for a "No to All" button (value 21).
-     */
-    public int NO_TO_ALL_ID = 21;
-
-    /**
-     * Starting button id reserved for internal use by JFace (value 256). JFace
-     * classes make ids by adding to this number.
-     */
-    public int INTERNAL_ID = 256;
-
-    /**
-     * Starting button id reserved for use by clients of JFace (value 1024).
-     * Clients of JFace should make ids by adding to this number.
-     */
-    public int CLIENT_ID = 1024;
-
-    // button labels
-    /**
-     * The label for OK buttons.
-     */
-    public String OK_LABEL = JFaceResources.getString("ok"); //$NON-NLS-1$
-
-    /**
-     * The label for cancel buttons.
-     */
-    public String CANCEL_LABEL = JFaceResources.getString("cancel"); //$NON-NLS-1$
-
-    /**
-     * The label for yes buttons.
-     */
-    public String YES_LABEL = JFaceResources.getString("yes"); //$NON-NLS-1$
-
-    /**
-     * The label for no buttons.
-     */
-    public String NO_LABEL = JFaceResources.getString("no"); //$NON-NLS-1$
-
-    /**
-     * The label for not to all buttons.
-     */
-    public String NO_TO_ALL_LABEL = JFaceResources.getString("notoall"); //$NON-NLS-1$
-
-    /**
-     * The label for yes to all buttons.
-     */
-    public String YES_TO_ALL_LABEL = JFaceResources.getString("yestoall"); //$NON-NLS-1$
-
-    /**
-     * The label for skip buttons.
-     */
-    public String SKIP_LABEL = JFaceResources.getString("skip"); //$NON-NLS-1$
-
-    /**
-     * The label for stop buttons.
-     */
-    public String STOP_LABEL = JFaceResources.getString("stop"); //$NON-NLS-1$
-
-    /**
-     * The label for abort buttons.
-     */
-    public String ABORT_LABEL = JFaceResources.getString("abort"); //$NON-NLS-1$
-
-    /**
-     * The label for retry buttons.
-     */
-    public String RETRY_LABEL = JFaceResources.getString("retry"); //$NON-NLS-1$
-
-    /**
-     * The label for ignore buttons.
-     */
-    public String IGNORE_LABEL = JFaceResources.getString("ignore"); //$NON-NLS-1$
-
-    /**
-     * The label for proceed buttons.
-     */
-    public String PROCEED_LABEL = JFaceResources.getString("proceed"); //$NON-NLS-1$
-
-    /**
-     * The label for open buttons.
-     */
-    public String OPEN_LABEL = JFaceResources.getString("open"); //$NON-NLS-1$
-
-    /**
-     * The label for close buttons.
-     */
-    public String CLOSE_LABEL = JFaceResources.getString("close"); //$NON-NLS-1$
-
-    /**
-     * The label for show details buttons.
-     */
-    public String SHOW_DETAILS_LABEL = JFaceResources.getString("showDetails"); //$NON-NLS-1$
-
-    /**
-     * The label for hide details buttons.
-     */
-    public String HIDE_DETAILS_LABEL = JFaceResources.getString("hideDetails"); //$NON-NLS-1$
-
-    /**
-     * The label for back buttons.
-     */
-    public String BACK_LABEL = JFaceResources.getString("backButton"); //$NON-NLS-1$
-
-    /**
-     * The label for next buttons.
-     */
-    public String NEXT_LABEL = JFaceResources.getString("nextButton"); //$NON-NLS-1$
-
-    /**
-     * The label for finish buttons.
-     */
-    public String FINISH_LABEL = JFaceResources.getString("finish"); //$NON-NLS-1$
-
-    /**
-     * The label for help buttons.
-     */
-    public String HELP_LABEL = JFaceResources.getString("help"); //$NON-NLS-1$
-
-    // Margins, spacings, and sizes
-    /**
-     * Vertical margin in dialog units (value 7).
-     */
-    public int VERTICAL_MARGIN = 7;
-
-    /**
-     * Vertical spacing in dialog units (value 4).
-     */
-    public int VERTICAL_SPACING = 4;
-
-    /**
-     * Horizontal margin in dialog units (value 7).
-     */
-    public int HORIZONTAL_MARGIN = 7;
-
-    /**
-     * Horizontal spacing in dialog units (value 4).
-     */
-    public int HORIZONTAL_SPACING = 4;
-
-    /**
-     * Height of button bar in dialog units (value 25).
-     */
-    public int BUTTON_BAR_HEIGHT = 25;
-
-    /**
-     * Left margin in dialog units (value 20).
-     */
-    public int LEFT_MARGIN = 20;
-
-    /**
-     * Button margin in dialog units (value 4).
-     */
-    public int BUTTON_MARGIN = 4;
-
-    /**
-     * Button height in dialog units (value 14).
-     * 
-     * @deprecated This constant is no longer in use.
-     * The button heights are now determined by the layout.
-     */
-    public int BUTTON_HEIGHT = 14;
-
-    /**
-     * Button width in dialog units (value 61).
-     */
-    public int BUTTON_WIDTH = 61;
-
-    /**
-     * Indent in dialog units (value 21).
-     */
-    public int INDENT = 21;
-
-    /**
-     * Small indent in dialog units (value 7).
-     */
-    public int SMALL_INDENT = 7;
-
-    /**
-     * Entry field width in dialog units (value 200).
-     */
-    public int ENTRY_FIELD_WIDTH = 200;
-
-    /**
-     * Minimum width of message area in dialog units (value 300).
-     */
-    public int MINIMUM_MESSAGE_AREA_WIDTH = 300;
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IDialogPage.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IDialogPage.java
deleted file mode 100644
index 19f73b4..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IDialogPage.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * Interface for a page in a multi-page dialog.
- */
-public interface IDialogPage {
-    /**
-     * Creates the top level control for this dialog
-     * page under the given parent composite.
-     * <p>
-     * Implementors are responsible for ensuring that
-     * the created control can be accessed via <code>getControl</code>
-     * </p>
-     *
-     * @param parent the parent composite
-     */
-    public void createControl(Composite parent);
-
-    /**
-     * Disposes the SWT resources allocated by this
-     * dialog page.
-     */
-    public void dispose();
-
-    /**
-     * Returns the top level control for this dialog page.
-     * <p>
-     * May return <code>null</code> if the control
-     * has not been created yet.
-     * </p>
-     *
-     * @return the top level control or <code>null</code>
-     */
-    public Control getControl();
-
-    /**
-     * Returns this dialog page's description text.
-     *
-     * @return the description text for this dialog page, 
-     *  or <code>null</code> if none
-     */
-    public String getDescription();
-
-    /**
-     * Returns the current error message for this dialog page.
-     * May be <code>null</code> to indicate no error message.
-     * <p>
-     * An error message should describe some error state,
-     * as opposed to a message which may simply provide instruction
-     * or information to the user.
-     * </p>
-     * 
-     * @return the error message, or <code>null</code> if none
-     */
-    public String getErrorMessage();
-
-    /**
-     * Returns this dialog page's image.
-     *
-     * @return the image for this dialog page, or <code>null</code>
-     *  if none
-     */
-    public Image getImage();
-
-    /**
-     * Returns the current message for this wizard page.
-     * <p>
-     * A message provides instruction or information to the 
-     * user, as opposed to an error message which should 
-     * describe some error state.
-     * </p>
-     * 
-     * @return the message, or <code>null</code> if none
-     */
-    public String getMessage();
-
-    /**
-     * Returns this dialog page's title.
-     *
-     * @return the title of this dialog page, 
-     *  or <code>null</code> if none
-     */
-    public String getTitle();
-
-    /**
-     * Notifies that help has been requested for this dialog page.
-     */
-    public void performHelp();
-
-    /**
-     * Sets this dialog page's description text.
-     * 
-     * @param description the description text for this dialog
-     *  page, or <code>null</code> if none
-     */
-    public void setDescription(String description);
-
-    /**
-     * Sets this dialog page's image.
-     *
-     * @param image the image for this dialog page, 
-     *  or <code>null</code> if none
-     */
-    public void setImageDescriptor(ImageDescriptor image);
-
-    /**
-     * Set this dialog page's title.
-     *
-     * @param title the title of this dialog page, 
-     *  or <code>null</code> if none
-     */
-    public void setTitle(String title);
-
-    /**
-     * Sets the visibility of this dialog page.
-     *
-     * @param visible <code>true</code> to make this page visible,
-     *  and <code>false</code> to hide it
-     */
-    public void setVisible(boolean visible);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IDialogSettings.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IDialogSettings.java
deleted file mode 100644
index 70933ea..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IDialogSettings.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.io.Writer;
-
-/**
- * An interface to a storage mechanism for making dialog settings persistent.
- * The store manages a collection of key/value pairs. The keys must be strings
- * and the values can be either, strings or array of strings. Convenience API to
- * convert primitive types to strings is provided.
- */
-public interface IDialogSettings {
-    /**
-     * Create a new section in the receiver and return it.
-     * 
-     * @param name
-     *            the name of the new section
-     * @return the new section
-     */
-    public IDialogSettings addNewSection(String name);
-
-    /**
-     * Add a section in the receiver.
-     * 
-     * @param section
-     *            the section to be added
-     */
-    public void addSection(IDialogSettings section);
-
-    /**
-     * Returns the value of the given key in this dialog settings.
-     * 
-     * @param key
-     *            the key
-     * @return the value, or <code>null</code> if none
-     */
-    public String get(String key);
-
-    /**
-     * Returns the value, an array of strings, of the given key in this dialog
-     * settings.
-     * 
-     * @param key
-     *            the key
-     * @return the array of string, or <code>null</code> if none
-     */
-    public String[] getArray(String key);
-
-    /**
-     * Convenience API. Convert the value of the given key in this dialog
-     * settings to a boolean and return it.
-     * 
-     * @param key
-     *            the key
-     * @return the boolean value, or <code>false</code> if none
-     */
-    public boolean getBoolean(String key);
-
-    /**
-     * Convenience API. Convert the value of the given key in this dialog
-     * settings to a double and return it.
-     * 
-     * @param key
-     *            the key
-     * @return the value coverted to double, or throws
-     *         <code>NumberFormatException</code> if none
-     * 
-     * @exception NumberFormatException
-     *                if the string value does not contain a parsable number.
-     * @see java.lang.Double#valueOf(java.lang.String)
-     */
-    public double getDouble(String key) throws NumberFormatException;
-
-    /**
-     * Convenience API. Convert the value of the given key in this dialog
-     * settings to a float and return it.
-     * 
-     * @param key
-     *            the key
-     * @return the value coverted to float, or throws
-     *         <code>NumberFormatException</code> if none
-     * 
-     * @exception NumberFormatException
-     *                if the string value does not contain a parsable number.
-     * @see java.lang.Float#valueOf(java.lang.String)
-     */
-    public float getFloat(String key) throws NumberFormatException;
-
-    /**
-     * Convenience API. Convert the value of the given key in this dialog
-     * settings to a int and return it.
-     * 
-     * @param key
-     *            the key
-     * @return the value coverted to int, or throws
-     *         <code>NumberFormatException</code> if none
-     * 
-     * @exception NumberFormatException
-     *                if the string value does not contain a parsable number.
-     * @see java.lang.Integer#valueOf(java.lang.String)
-     */
-    public int getInt(String key) throws NumberFormatException;
-
-    /**
-     * Convenience API. Convert the value of the given key in this dialog
-     * settings to a long and return it.
-     * 
-     * @param key
-     *            the key
-     * @return the value coverted to long, or throws
-     *         <code>NumberFormatException</code> if none
-     * 
-     * @exception NumberFormatException
-     *                if the string value does not contain a parsable number.
-     * @see java.lang.Long#valueOf(java.lang.String)
-     */
-    public long getLong(String key) throws NumberFormatException;
-
-    /**
-     * Returns the IDialogSettings name.
-     * 
-     * @return the name
-     */
-    public String getName();
-
-    /**
-     * Returns the section with the given name in this dialog settings.
-     * 
-     * @param sectionName
-     *            the key
-     * @return IDialogSettings (the section), or <code>null</code> if none
-     */
-    public IDialogSettings getSection(String sectionName);
-
-    /**
-     * Returns all the sections in this dialog settings.
-     * 
-     * @return the section, or <code>null</code> if none
-     */
-    public IDialogSettings[] getSections();
-
-    /**
-     * Load a dialog settings from a stream and fill the receiver with its
-     * content.
-     * 
-     * @param reader
-     *            a Reader specifying the stream where the settings are read
-     *            from.
-     * @throws IOException
-     */
-    public void load(Reader reader) throws IOException;
-
-    /**
-     * Load a dialog settings from a file and fill the receiver with its
-     * content.
-     * 
-     * @param fileName
-     *            the name of the file the settings are read from.
-     * @throws IOException
-     */
-    public void load(String fileName) throws IOException;
-
-    /**
-     * Adds the pair <code>key/value</code> to this dialog settings.
-     * 
-     * @param key
-     *            the key.
-     * @param value
-     *            the value to be associated with the <code>key</code>
-     */
-    public void put(String key, String[] value);
-
-    /**
-     * Convenience API. Converts the double <code>value</code> to a string and
-     * adds the pair <code>key/value</code> to this dialog settings.
-     * 
-     * @param key
-     *            the key.
-     * @param value
-     *            the value to be associated with the <code>key</code>
-     */
-    public void put(String key, double value);
-
-    /**
-     * Convenience API. Converts the float <code>value</code> to a string and
-     * adds the pair <code>key/value</code> to this dialog settings.
-     * 
-     * @param key
-     *            the key.
-     * @param value
-     *            the value to be associated with the <code>key</code>
-     */
-    public void put(String key, float value);
-
-    /**
-     * Convenience API. Converts the int <code>value</code> to a string and
-     * adds the pair <code>key/value</code> to this dialog settings.
-     * 
-     * @param key
-     *            the key.
-     * @param value
-     *            the value to be associated with the <code>key</code>
-     */
-    public void put(String key, int value);
-
-    /**
-     * Convenience API. Converts the long <code>value</code> to a string and
-     * adds the pair <code>key/value</code> to this dialog settings.
-     * 
-     * @param key
-     *            the key.
-     * @param value
-     *            the value to be associated with the <code>key</code>
-     */
-    public void put(String key, long value);
-
-    /**
-     * Adds the pair <code>key/value</code> to this dialog settings.
-     * 
-     * @param key
-     *            the key.
-     * @param value
-     *            the value to be associated with the <code>key</code>
-     */
-    public void put(String key, String value);
-
-    /**
-     * Convenience API. Converts the boolean <code>value</code> to a string
-     * and adds the pair <code>key/value</code> to this dialog settings.
-     * 
-     * @param key
-     *            the key.
-     * @param value
-     *            the value to be associated with the <code>key</code>
-     */
-    public void put(String key, boolean value);
-
-    /**
-     * Save a dialog settings to a stream
-     * 
-     * @param writer
-     *            a Writer specifying the stream the settings are written in.
-     * @throws IOException
-     */
-    public void save(Writer writer) throws IOException;
-
-    /**
-     * Save a dialog settings to a file.
-     * 
-     * @param fileName
-     *            the name of the file the settings are written in.
-     * @throws IOException
-     */
-    public void save(String fileName) throws IOException;
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IInputValidator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IInputValidator.java
deleted file mode 100644
index f87abae..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IInputValidator.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-/**
- * The IInputValidator is the interface for simple validators. 
- * @see org.eclipse.jface.dialogs.InputDialog
- */
-public interface IInputValidator {
-    /**
-     * Validates the given string.  Returns an error message to display
-     * if the new text is invalid.  Returns <code>null</code> if there
-     * is no error.  Note that the empty string is not treated the same
-     * as <code>null</code>; it indicates an error state but with no message
-     * to display.
-     * 
-     * @param newText the text to check for validity
-     * 
-     * @return an error message or <code>null</code> if no error
-     */
-    public String isValid(String newText);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IMessageProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IMessageProvider.java
deleted file mode 100644
index 6f6b6b3..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IMessageProvider.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-/**
- * Minimal interface to a message provider. Used for dialog pages which can
- * provide a message with an icon.
- * 
- * @since 2.0
- */
-public interface IMessageProvider {
-    /**
-     * Constant for a regular message (value 0).
-     * <p>
-     * Typically this indicates that the message should be shown without an
-     * icon.
-     * </p>
-     */
-    public final static int NONE = 0;
-
-    /**
-     * Constant for an info message (value 1).
-     */
-    public final static int INFORMATION = 1;
-
-    /**
-     * Constant for a warning message (value 2).
-     */
-    public final static int WARNING = 2;
-
-    /**
-     * Constant for an error message (value 3).
-     */
-    public final static int ERROR = 3;
-
-    /**
-     * Returns the current message for this message provider.
-     * <p>
-     * A message provides instruction or information to the user.
-     * </p>
-     * 
-     * @return the message, or <code>null</code> if none
-     */
-    public String getMessage();
-
-    /**
-     * Returns a value indicating if the message is a an information message, a
-     * warning message, or an error message.
-     * <p>
-     * Returns one of <code>NONE</code>,<code>INFORMATION</code>,
-     * <code>WARNING</code>, or <code>ERROR</code>.
-     * </p>
-     * 
-     * @return the message type
-     */
-    public int getMessageType();
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IPageChangeProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IPageChangeProvider.java
deleted file mode 100644
index 2f63de0..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IPageChangeProvider.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-/**
- * Minimal interface to a page change provider. Used for dialogs which can
- * switch between multiple pages.
- * 
- * @since 3.1
- */
-public interface IPageChangeProvider {
-	/**
-	 * Returns the currently selected page in the dialog.
-	 * 
-	 * @return the selected page in the dialog or <code>null</code> if none is
-	 *         selected. The type may be domain specific. In 
-	 *         the JFace provided dialogs this will be an instance of 
-	 *         <code>IDialogPage</code>. 
-	 */
-	Object getSelectedPage();
-
-	/**
-	 * Adds a listener for page changes in this page change provider. Has no
-	 * effect if an identical listener is already registered.
-	 * 
-	 * @param listener
-	 *            a page changed listener
-	 */
-	void addPageChangedListener(IPageChangedListener listener);
-
-	/**
-	 * Removes the given page change listener from this page change provider.
-	 * Has no effect if an identical listener is not registered.
-	 * 
-	 * @param listener
-	 *            a page changed listener
-	 */
-	void removePageChangedListener(IPageChangedListener listener);
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IPageChangedListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IPageChangedListener.java
deleted file mode 100644
index 28cb144..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IPageChangedListener.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-/**
- * A listener which is notified when the current page of the multi-page dialog
- * is changed.
- * 
- * @see IPageChangeProvider
- * @see PageChangedEvent
- * 
- * @since 3.1
- */
-public interface IPageChangedListener {
-	/**
-	 * Notifies that the selected page has changed.
-	 * 
-	 * @param event
-	 *            event object describing the change
-	 */
-	public void pageChanged(PageChangedEvent event);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IPageChangingListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IPageChangingListener.java
deleted file mode 100644
index fc3c993..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IPageChangingListener.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Chris Gross (schtoo@schtoo.com) - initial API and implementation for bug 16179
- *     IBM Corporation - revisions to initial contribution
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-/**
- * A listener which is notified when the current page of a multi-page dialog is
- * changing. Use this listener to perform long-running work that should only be
- * executed once, when the page is in the process of changing, rather then
- * during validation of page controls.
- * 
- * @see PageChangingEvent
- * @since 3.3
- */
-public interface IPageChangingListener {
-	
-	/**
-	 * Handle the an <code>IDialogPage</code> changing.
-	 * 
-	 * The <code>doit</code> field of the <code>PageChangingEvent</code>
-	 * must be set to false to prevent the page from changing.
-	 * 
-	 * @param event
-	 *            event object describing the change
-	 */
-	public void handlePageChanging(PageChangingEvent event);
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IconAndMessageDialog.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IconAndMessageDialog.java
deleted file mode 100644
index 808e082..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/IconAndMessageDialog.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Stefan Xenos, IBM - bug 156790: Adopt GridLayoutFactory within JFace
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.layout.LayoutConstants;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * The IconAndMessageDialog is the abstract superclass of dialogs that have an
- * icon and a message as the first two widgets. In this dialog the icon and
- * message are direct children of the shell in order that they can be read by
- * accessibility tools more easily.
- * <p>
- * <strong>Note:</strong> Clients are expected to call {@link #createMessageArea(Composite)},
- * otherwise neither the icon nor the message will appear.
- * </p>
- */
-public abstract class IconAndMessageDialog extends Dialog {
-	/**
-	 * Message (a localized string).
-	 */
-	protected String message;
-
-	/**
-	 * Message label is the label the message is shown on.
-	 */
-	protected Label messageLabel;
-
-	/**
-	 * Return the label for the image.
-	 */
-	protected Label imageLabel;
-
-	/**
-	 * Constructor for IconAndMessageDialog.
-	 * 
-	 * @param parentShell
-	 *            the parent shell, or <code>null</code> to create a top-level
-	 *            shell
-	 */
-	public IconAndMessageDialog(Shell parentShell) {
-		super(parentShell);
-	}
-
-	/**
-	 * Create the area the message will be shown in.
-	 * <p>
-	 * The parent composite is assumed to use GridLayout as its layout manager,
-	 * since the parent is typically the composite created in
-	 * {@link Dialog#createDialogArea}.
-	 * </p>
-	 * <p>
-	 * <strong>Note:</strong> Clients are expected to call this method, otherwise
-	 * neither the icon nor the message will appear.
-	 * </p>
-	 * 
-	 * @param composite
-	 *            The composite to parent from.
-	 * @return Control
-	 */
-	protected Control createMessageArea(Composite composite) {
-		// create composite
-		// create image
-		Image image = getImage();
-		if (image != null) {
-			imageLabel = new Label(composite, SWT.NULL);
-			image.setBackground(imageLabel.getBackground());
-			imageLabel.setImage(image);
-			addAccessibleListeners(imageLabel, image);
-			GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.BEGINNING)
-					.applyTo(imageLabel);
-		}
-		// create message
-		if (message != null) {
-			messageLabel = new Label(composite, getMessageLabelStyle());
-			messageLabel.setText(message);
-			GridDataFactory
-					.fillDefaults()
-					.align(SWT.FILL, SWT.BEGINNING)
-					.grab(true, false)
-					.hint(
-							convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH),
-							SWT.DEFAULT).applyTo(messageLabel);
-		}
-		return composite;
-	}
-
-	private String getAccessibleMessageFor(Image image) {
-		if (image.equals(getErrorImage())) {
-			return JFaceResources.getString("error");//$NON-NLS-1$
-		}
-
-		if (image.equals(getWarningImage())) {
-			return JFaceResources.getString("warning");//$NON-NLS-1$
-		}
-
-		if (image.equals(getInfoImage())) {
-			return JFaceResources.getString("info");//$NON-NLS-1$
-		}
-
-		if (image.equals(getQuestionImage())) {
-			return JFaceResources.getString("question"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-	/**
-	 * Add an accessible listener to the label if it can be inferred from the
-	 * image.
-	 * 
-	 * @param label
-	 * @param image
-	 */
-	private void addAccessibleListeners(Label label, final Image image) {
-		label.getAccessible().addAccessibleListener(new AccessibleAdapter() {
-			public void getName(AccessibleEvent event) {
-				final String accessibleMessage = getAccessibleMessageFor(image);
-				if (accessibleMessage == null) {
-					return;
-				}
-				event.result = accessibleMessage;
-			}
-		});
-	}
-
-	/**
-	 * Returns the style for the message label.
-	 * 
-	 * @return the style for the message label
-	 * 
-	 * @since 3.0
-	 */
-	protected int getMessageLabelStyle() {
-		return SWT.WRAP;
-	}
-
-	/*
-	 * @see Dialog.createButtonBar()
-	 */
-	protected Control createButtonBar(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayoutFactory.fillDefaults().numColumns(0) // this is incremented
-				// by createButton
-				.equalWidth(true).applyTo(composite);
-
-		GridDataFactory.fillDefaults().align(SWT.END, SWT.CENTER).span(2, 1)
-				.applyTo(composite);
-		composite.setFont(parent.getFont());
-		// Add the buttons to the button bar.
-		createButtonsForButtonBar(composite);
-		return composite;
-	}
-
-	/**
-	 * Returns the image to display beside the message in this dialog.
-	 * <p>
-	 * Subclasses may override.
-	 * </p>
-	 * 
-	 * @return the image to display beside the message
-	 * @since 2.0
-	 */
-	protected abstract Image getImage();
-
-	/*
-	 * @see Dialog.createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		// initialize the dialog units
-		initializeDialogUnits(parent);
-		Point defaultSpacing = LayoutConstants.getSpacing();
-		GridLayoutFactory.fillDefaults().margins(LayoutConstants.getMargins())
-				.spacing(defaultSpacing.x * 2,
-				defaultSpacing.y).numColumns(getColumnCount()).applyTo(parent);
-
-		GridDataFactory.fillDefaults().grab(true, true).applyTo(parent);
-		createDialogAndButtonArea(parent);
-		return parent;
-	}
-
-	/**
-	 * Get the number of columns in the layout of the Shell of the dialog.
-	 * 
-	 * @return int
-	 * @since 3.3
-	 */
-	int getColumnCount() {
-		return 2;
-	}
-
-	/**
-	 * Create the dialog area and the button bar for the receiver.
-	 * 
-	 * @param parent
-	 */
-	protected void createDialogAndButtonArea(Composite parent) {
-		// create the dialog area and button bar
-		dialogArea = createDialogArea(parent);
-		buttonBar = createButtonBar(parent);
-		// Apply to the parent so that the message gets it too.
-		applyDialogFont(parent);
-	}
-
-	/**
-	 * Return the <code>Image</code> to be used when displaying an error.
-	 * 
-	 * @return image the error image
-	 */
-	public Image getErrorImage() {
-		return getSWTImage(SWT.ICON_ERROR);
-	}
-
-	/**
-	 * Return the <code>Image</code> to be used when displaying a warning.
-	 * 
-	 * @return image the warning image
-	 */
-	public Image getWarningImage() {
-		return getSWTImage(SWT.ICON_WARNING);
-	}
-
-	/**
-	 * Return the <code>Image</code> to be used when displaying information.
-	 * 
-	 * @return image the information image
-	 */
-	public Image getInfoImage() {
-		return getSWTImage(SWT.ICON_INFORMATION);
-	}
-
-	/**
-	 * Return the <code>Image</code> to be used when displaying a question.
-	 * 
-	 * @return image the question image
-	 */
-	public Image getQuestionImage() {
-		return getSWTImage(SWT.ICON_QUESTION);
-	}
-
-	/**
-	 * Get an <code>Image</code> from the provide SWT image constant.
-	 * 
-	 * @param imageID
-	 *            the SWT image constant
-	 * @return image the image
-	 */
-	private Image getSWTImage(final int imageID) {
-		Shell shell = getShell();
-		final Display display;
-		if (shell == null || shell.isDisposed()) {
-			shell = getParentShell();
-		}
-		if (shell == null || shell.isDisposed()) {
-			display = Display.getCurrent();
-		} else {
-			display = shell.getDisplay();
-		}
-
-		final Image[] image = new Image[1];
-		display.syncExec(new Runnable() {
-			public void run() {
-				image[0] = display.getSystemImage(imageID);
-			}
-		});
-
-		return image[0];
-
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ImageAndMessageArea.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ImageAndMessageArea.java
deleted file mode 100644
index 6c9eea2..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ImageAndMessageArea.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.jface.fieldassist.DecoratedField;
-import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
-import org.eclipse.jface.fieldassist.TextControlCreator;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-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.Layout;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Instances of this class provide a message area to display a message and an
- * associated image.
- * <p>
- * This class is not intended to be extended by clients.
- * </p>
- * 
- * @since 3.2
- * @deprecated As of 3.3, this class is no longer necessary.
- * 
- */
-public class ImageAndMessageArea extends Composite {
-
-	private int BORDER_MARGIN = IDialogConstants.HORIZONTAL_SPACING / 2;
-
-	private DecoratedField messageField;
-
-	private Composite container;
-
-	/**
-	 * Constructs a new ImageAndMessageArea with an empty decorated field. Calls
-	 * to <code>setText(String text)</code> and
-	 * <code>setImage(Image image)</code> are required in order to fill the
-	 * message area. Also, the instance will be invisible when initially
-	 * created.
-	 * <p>
-	 * The style bit <code>SWT.WRAP</code> should be used if a larger message
-	 * area is desired.
-	 * </p>
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param style
-	 *            the SWT style bits. Using SWT.WRAP will create a larger
-	 *            message area.
-	 */
-	public ImageAndMessageArea(Composite parent, int style) {
-		super(parent, style);
-		container = new Composite(this, style);
-		GridLayout glayout = new GridLayout();
-		glayout.numColumns = 2;
-		glayout.marginWidth = 0;
-		glayout.marginHeight = 0;
-		glayout.marginTop = BORDER_MARGIN;
-		glayout.marginBottom = BORDER_MARGIN;
-		container.setLayout(glayout);
-
-		messageField = new DecoratedField(container, SWT.READ_ONLY | style,
-				new TextControlCreator());
-		setFont(JFaceResources.getDialogFont());
-
-		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
-		int lineHeight = ((Text) messageField.getControl()).getLineHeight();
-		if ((style & SWT.WRAP) > 0)
-			gd.heightHint = 2 * lineHeight;
-		else
-			gd.heightHint = lineHeight;
-
-		messageField.getLayoutControl().setLayoutData(gd);
-
-		addPaintListener(new PaintListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.PaintListener#paintControl(org.eclipse.swt.events.PaintEvent)
-			 */
-			public void paintControl(PaintEvent e) {
-				onPaint(e);
-			}
-		});
-
-		// sets the layout and size to account for the BORDER_MARGIN between
-		// the border drawn around the container and the decorated field.
-		setLayout(new Layout() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.widgets.Layout#layout(org.eclipse.swt.widgets.Composite,
-			 *      boolean)
-			 */
-			public void layout(Composite parent, boolean changed) {
-				Rectangle carea = getClientArea();
-				container.setBounds(carea.x + BORDER_MARGIN, carea.y
-						+ BORDER_MARGIN, carea.width - (2 * BORDER_MARGIN),
-						carea.height - (2 * BORDER_MARGIN));
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.widgets.Layout#computeSize(org.eclipse.swt.widgets.Composite,
-			 *      int, int, boolean)
-			 */
-			public Point computeSize(Composite parent, int wHint, int hHint,
-					boolean changed) {
-				Point size;
-				size = container.computeSize(wHint, hHint, changed);
-
-				// size set to account for the BORDER_MARGIN on
-				// all sides of the decorated field
-				size.x += 4;
-				size.y += 4;
-				return size;
-			}
-		});
-		setVisible(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.widgets.Control#setBackground(org.eclipse.swt.graphics.Color)
-	 */
-	public void setBackground(Color bg) {
-		super.setBackground(bg);
-		messageField.getLayoutControl().setBackground(bg);
-		messageField.getControl().setBackground(bg);
-		container.setBackground(bg);
-	}
-
-	/**
-	 * Sets the text in the decorated field which will be displayed in the
-	 * message area.
-	 * 
-	 * @param text
-	 *            the text to be displayed in the message area
-	 * 
-	 * @see org.eclipse.swt.widgets.Text#setText(String string)
-	 */
-	public void setText(String text) {
-		((Text) messageField.getControl()).setText(text);
-	}
-
-	/**
-	 * Adds an image to decorated field to be shown in the message area.
-	 * 
-	 * @param image
-	 *            desired image to be shown in the ImageAndMessageArea
-	 */
-	public void setImage(Image image) {
-		FieldDecorationRegistry registry = FieldDecorationRegistry.getDefault();
-		registry.registerFieldDecoration("messageImage", null, image); //$NON-NLS-1$
-		messageField.addFieldDecoration(registry
-				.getFieldDecoration("messageImage"), //$NON-NLS-1$
-				SWT.LEFT | SWT.TOP, false);
-	}
-
-	/**
-	 * Draws the message area composite with rounded corners.
-	 */
-	private void onPaint(PaintEvent e) {
-		Rectangle carea = getClientArea();
-		e.gc.setForeground(getForeground());
-
-		// draws the polyline to be rounded in a 2 pixel squared area
-		e.gc.drawPolyline(new int[] { carea.x, carea.y + carea.height - 1,
-				carea.x, carea.y + 2, carea.x + 2, carea.y,
-				carea.x + carea.width - 3, carea.y, carea.x + carea.width - 1,
-				carea.y + 2, carea.x + carea.width - 1,
-				carea.y + carea.height - 1 });
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.widgets.Control#setFont(org.eclipse.swt.graphics.Font)
-	 */
-	public void setFont(Font font) {
-		super.setFont(font);
-		((Text) messageField.getControl()).setFont(font);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.widgets.Control#setToolTipText(java.lang.String)
-	 */
-	public void setToolTipText(String text) {
-		super.setToolTipText(text);
-		((Text) messageField.getControl()).setToolTipText(text);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/InputDialog.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/InputDialog.java
deleted file mode 100644
index f0ff4c8..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/InputDialog.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.jface.resource.StringConverter;
-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.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.Text;
-
-/**
- * A simple input dialog for soliciting an input string from the user.
- * <p>
- * This concrete dialog class can be instantiated as is, or further subclassed as
- * required.
- * </p>
- */
-public class InputDialog extends Dialog {
-    /**
-     * The title of the dialog.
-     */
-    private String title;
-
-    /**
-     * The message to display, or <code>null</code> if none.
-     */
-    private String message;
-
-    /**
-     * The input value; the empty string by default.
-     */
-    private String value = "";//$NON-NLS-1$
-
-    /**
-     * The input validator, or <code>null</code> if none.
-     */
-    private IInputValidator validator;
-
-    /**
-     * Ok button widget.
-     */
-    private Button okButton;
-
-    /**
-     * Input text widget.
-     */
-    private Text text;
-
-    /**
-     * Error message label widget.
-     */
-    private Text errorMessageText;
-    
-    /**
-     * Error message string.
-     */
-    private String errorMessage;
-
-    /**
-     * Creates an input dialog with OK and Cancel buttons. Note that the dialog
-     * will have no visual representation (no widgets) until it is told to open.
-     * <p>
-     * Note that the <code>open</code> method blocks for input dialogs.
-     * </p>
-     * 
-     * @param parentShell
-     *            the parent shell, or <code>null</code> to create a top-level
-     *            shell
-     * @param dialogTitle
-     *            the dialog title, or <code>null</code> if none
-     * @param dialogMessage
-     *            the dialog message, or <code>null</code> if none
-     * @param initialValue
-     *            the initial input value, or <code>null</code> if none
-     *            (equivalent to the empty string)
-     * @param validator
-     *            an input validator, or <code>null</code> if none
-     */
-    public InputDialog(Shell parentShell, String dialogTitle,
-            String dialogMessage, String initialValue, IInputValidator validator) {
-        super(parentShell);
-        this.title = dialogTitle;
-        message = dialogMessage;
-        if (initialValue == null) {
-			value = "";//$NON-NLS-1$
-		} else {
-			value = initialValue;
-		}
-        this.validator = validator;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on Dialog.
-     */
-    protected void buttonPressed(int buttonId) {
-        if (buttonId == IDialogConstants.OK_ID) {
-            value = text.getText();
-        } else {
-            value = null;
-        }
-        super.buttonPressed(buttonId);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-     */
-    protected void configureShell(Shell shell) {
-        super.configureShell(shell);
-        if (title != null) {
-			shell.setText(title);
-		}
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-     */
-    protected void createButtonsForButtonBar(Composite parent) {
-        // create OK and Cancel buttons by default
-        okButton = createButton(parent, IDialogConstants.OK_ID,
-                IDialogConstants.OK_LABEL, true);
-        createButton(parent, IDialogConstants.CANCEL_ID,
-                IDialogConstants.CANCEL_LABEL, false);
-        //do this here because setting the text will set enablement on the ok
-        // button
-        text.setFocus();
-        if (value != null) {
-            text.setText(value);
-            text.selectAll();
-        }
-    }
-
-    /*
-     * (non-Javadoc) Method declared on Dialog.
-     */
-    protected Control createDialogArea(Composite parent) {
-        // create composite
-        Composite composite = (Composite) super.createDialogArea(parent);
-        // create message
-        if (message != null) {
-            Label label = new Label(composite, SWT.WRAP);
-            label.setText(message);
-            GridData data = new GridData(GridData.GRAB_HORIZONTAL
-                    | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL
-                    | GridData.VERTICAL_ALIGN_CENTER);
-            data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
-            label.setLayoutData(data);
-            label.setFont(parent.getFont());
-        }
-        text = new Text(composite, getInputTextStyle());
-        text.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
-                | GridData.HORIZONTAL_ALIGN_FILL));
-        text.addModifyListener(new ModifyListener() {
-            public void modifyText(ModifyEvent e) {
-                validateInput();
-            }
-        });
-        errorMessageText = new Text(composite, SWT.READ_ONLY | SWT.WRAP);
-        errorMessageText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
-                | GridData.HORIZONTAL_ALIGN_FILL));
-        errorMessageText.setBackground(errorMessageText.getDisplay()
-                .getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-        // Set the error message text
-        // See https://bugs.eclipse.org/bugs/show_bug.cgi?id=66292
-        setErrorMessage(errorMessage);
-
-        applyDialogFont(composite);
-        return composite;
-    }
-
-    /**
-     * Returns the error message label.
-     * 
-     * @return the error message label
-     * @deprecated use setErrorMessage(String) instead
-     */
-    protected Label getErrorMessageLabel() {
-        return null;
-    }
-
-    /**
-     * Returns the ok button.
-     * 
-     * @return the ok button
-     */
-    protected Button getOkButton() {
-        return okButton;
-    }
-
-    /**
-     * Returns the text area.
-     * 
-     * @return the text area
-     */
-    protected Text getText() {
-        return text;
-    }
-
-    /**
-     * Returns the validator.
-     * 
-     * @return the validator
-     */
-    protected IInputValidator getValidator() {
-        return validator;
-    }
-
-    /**
-     * Returns the string typed into this input dialog.
-     * 
-     * @return the input string
-     */
-    public String getValue() {
-        return value;
-    }
-
-    /**
-     * Validates the input.
-     * <p>
-     * The default implementation of this framework method delegates the request
-     * to the supplied input validator object; if it finds the input invalid,
-     * the error message is displayed in the dialog's message line. This hook
-     * method is called whenever the text changes in the input field.
-     * </p>
-     */
-    protected void validateInput() {
-        String errorMessage = null;
-        if (validator != null) {
-            errorMessage = validator.isValid(text.getText());
-        }
-        // Bug 16256: important not to treat "" (blank error) the same as null
-        // (no error)
-        setErrorMessage(errorMessage);
-    }
-
-    /**
-     * Sets or clears the error message.
-     * If not <code>null</code>, the OK button is disabled.
-     * 
-     * @param errorMessage
-     *            the error message, or <code>null</code> to clear
-     * @since 3.0
-     */
-    public void setErrorMessage(String errorMessage) {
-    	this.errorMessage = errorMessage;
-    	if (errorMessageText != null && !errorMessageText.isDisposed()) {
-    		errorMessageText.setText(errorMessage == null ? " \n " : errorMessage); //$NON-NLS-1$
-    		// Disable the error message text control if there is no error, or
-    		// no error text (empty or whitespace only).  Hide it also to avoid
-    		// color change.
-    		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=130281
-    		boolean hasError = errorMessage != null && (StringConverter.removeWhiteSpaces(errorMessage)).length() > 0;
-    		errorMessageText.setEnabled(hasError);
-    		errorMessageText.setVisible(hasError);
-    		errorMessageText.getParent().update();
-    		// Access the ok button by id, in case clients have overridden button creation.
-    		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=113643
-    		Control button = getButton(IDialogConstants.OK_ID);
-    		if (button != null) {
-    			button.setEnabled(errorMessage == null);
-    		}
-    	}
-    }
-    
-	/**
-	 * Returns the style bits that should be used for the input text field.
-	 * Defaults to a single line entry. Subclasses may override.
-	 * 
-	 * @return the integer style bits that should be used when creating the
-	 *         input text
-	 * 
-	 * @since 3.4
-	 */
-	protected int getInputTextStyle() {
-		return SWT.SINGLE | SWT.BORDER;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/MessageDialog.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/MessageDialog.java
deleted file mode 100644
index 8da627f..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/MessageDialog.java
+++ /dev/null
@@ -1,502 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-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.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A dialog for showing messages to the user.
- * <p>
- * This concrete dialog class can be instantiated as is, or further subclassed
- * as required.
- * </p>
- */
-public class MessageDialog extends IconAndMessageDialog {
-    /**
-     * Constant for a dialog with no image (value 0).
-     */
-    public final static int NONE = 0;
-
-    /**
-     * Constant for a dialog with an error image (value 1).
-     */
-    public final static int ERROR = 1;
-
-    /**
-     * Constant for a dialog with an info image (value 2).
-     */
-    public final static int INFORMATION = 2;
-
-    /**
-     * Constant for a dialog with a question image (value 3).
-     */
-    public final static int QUESTION = 3;
-
-    /**
-     * Constant for a dialog with a warning image (value 4).
-     */
-    public final static int WARNING = 4;
-
-    /**
-     * Labels for buttons in the button bar (localized strings).
-     */
-    private String[] buttonLabels;
-
-    /**
-     * The buttons. Parallels <code>buttonLabels</code>.
-     */
-    private Button[] buttons;
-
-    /**
-     * Index into <code>buttonLabels</code> of the default button.
-     */
-    private int defaultButtonIndex;
-
-    /**
-     * Dialog title (a localized string).
-     */
-    private String title;
-
-    /**
-     * Dialog title image.
-     */
-    private Image titleImage;
-
-    /**
-     * Image, or <code>null</code> if none.
-     */
-    private Image image = null;
-
-    /**
-     * The custom dialog area.
-     */
-    private Control customArea;
-
-    /**
-     * Create a message dialog. Note that the dialog will have no visual
-     * representation (no widgets) until it is told to open.
-     * <p>
-     * The labels of the buttons to appear in the button bar are supplied in
-     * this constructor as an array. The <code>open</code> method will return
-     * the index of the label in this array corresponding to the button that was
-     * pressed to close the dialog.
-     * </p>
-     * <p>
-     * <strong>Note:</strong> If the dialog was dismissed without pressing
-     * a button (ESC key, close box, etc.) then {@link SWT#DEFAULT} is returned.
-     * Note that the <code>open</code> method blocks.
-     * </p>
-     *
-     * @param parentShell
-     *            the parent shell
-     * @param dialogTitle
-     *            the dialog title, or <code>null</code> if none
-     * @param dialogTitleImage
-     *            the dialog title image, or <code>null</code> if none
-     * @param dialogMessage
-     *            the dialog message
-     * @param dialogImageType
-     *            one of the following values:
-     *            <ul>
-     *            <li><code>MessageDialog.NONE</code> for a dialog with no
-     *            image</li>
-     *            <li><code>MessageDialog.ERROR</code> for a dialog with an
-     *            error image</li>
-     *            <li><code>MessageDialog.INFORMATION</code> for a dialog
-     *            with an information image</li>
-     *            <li><code>MessageDialog.QUESTION </code> for a dialog with a
-     *            question image</li>
-     *            <li><code>MessageDialog.WARNING</code> for a dialog with a
-     *            warning image</li>
-     *            </ul>
-     * @param dialogButtonLabels
-     *            an array of labels for the buttons in the button bar
-     * @param defaultIndex
-     *            the index in the button label array of the default button
-     */
-    public MessageDialog(Shell parentShell, String dialogTitle,
-            Image dialogTitleImage, String dialogMessage, int dialogImageType,
-            String[] dialogButtonLabels, int defaultIndex) {
-        super(parentShell);
-        this.title = dialogTitle;
-        this.titleImage = dialogTitleImage;
-        this.message = dialogMessage;
-
-        switch (dialogImageType) {
-        case ERROR: {
-            this.image = getErrorImage();
-            break;
-        }
-        case INFORMATION: {
-            this.image = getInfoImage();
-            break;
-        }
-        case QUESTION: {
-            this.image = getQuestionImage();
-            break;
-        }
-        case WARNING: {
-            this.image = getWarningImage();
-            break;
-        }
-        }
-        this.buttonLabels = dialogButtonLabels;
-        this.defaultButtonIndex = defaultIndex;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
-     */
-    protected void buttonPressed(int buttonId) {
-        setReturnCode(buttonId);
-        close();
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-     */
-    protected void configureShell(Shell shell) {
-        super.configureShell(shell);
-        if (title != null) {
-			shell.setText(title);
-		}
-        if (titleImage != null) {
-			shell.setImage(titleImage);
-		}
-    }
-
-    /*
-     * (non-Javadoc) Method declared on Dialog.
-     */
-    protected void createButtonsForButtonBar(Composite parent) {
-        buttons = new Button[buttonLabels.length];
-        for (int i = 0; i < buttonLabels.length; i++) {
-            String label = buttonLabels[i];
-            Button button = createButton(parent, i, label,
-                    defaultButtonIndex == i);
-            buttons[i] = button;
-        }
-    }
-
-    /**
-     * Creates and returns the contents of an area of the dialog which appears
-     * below the message and above the button bar.
-     * <p>
-     * The default implementation of this framework method returns
-     * <code>null</code>. Subclasses may override.
-     * </p>
-     * 
-     * @param parent
-     *            parent composite to contain the custom area
-     * @return the custom area control, or <code>null</code>
-     */
-    protected Control createCustomArea(Composite parent) {
-        return null;
-    }
-
-    /**
-     * This implementation of the <code>Dialog</code> framework method creates
-     * and lays out a composite and calls <code>createMessageArea</code> and
-     * <code>createCustomArea</code> to populate it. Subclasses should
-     * override <code>createCustomArea</code> to add contents below the
-     * message.
-     */
-    protected Control createDialogArea(Composite parent) {
-        // create message area
-        createMessageArea(parent);
-        // create the top level composite for the dialog area
-        Composite composite = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.marginHeight = 0;
-        layout.marginWidth = 0;
-        composite.setLayout(layout);
-        GridData data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 2;
-        composite.setLayoutData(data);
-        // allow subclasses to add custom controls
-        customArea = createCustomArea(composite);
-        //If it is null create a dummy label for spacing purposes
-        if (customArea == null) {
-			customArea = new Label(composite, SWT.NULL);
-		}
-        return composite;
-    }
-
-    /**
-     * Gets a button in this dialog's button bar.
-     * 
-     * @param index
-     *            the index of the button in the dialog's button bar
-     * @return a button in the dialog's button bar
-     */
-    protected Button getButton(int index) {
-        return buttons[index];
-    }
-
-    /**
-     * Returns the minimum message area width in pixels This determines the
-     * minimum width of the dialog.
-     * <p>
-     * Subclasses may override.
-     * </p>
-     * 
-     * @return the minimum message area width (in pixels)
-     */
-    protected int getMinimumMessageWidth() {
-        return convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
-    }
-
-    /**
-     * Handle the shell close. Set the return code to <code>SWT.DEFAULT</code>
-     * as there has been no explicit close by the user.
-     * 
-     * @see org.eclipse.jface.window.Window#handleShellCloseEvent()
-     */
-    protected void handleShellCloseEvent() {
-        //Sets a return code of SWT.DEFAULT since none of the dialog buttons
-        // were pressed to close the dialog.
-        super.handleShellCloseEvent();
-        setReturnCode(SWT.DEFAULT);
-    }
-
-	/**
-	 * Opens this message dialog, creating it first if it has not yet been created.
-	 * <p>
-	 * This method waits until the dialog is closed by the end user, and then it
-	 * returns the dialog's return code. The dialog's return code is either the
-	 * index of the button the user pressed, or {@link SWT#DEFAULT} if the dialog
-	 * has been closed by other means.
-	 * </p>
-	 *
-	 * @return the return code
-	 *
-	 * @see org.eclipse.jface.window.Window#open()
-	 */
-    public int open() {
-    	return super.open();
-    }
-
-    /**
-     * Convenience method to open a simple confirm (OK/Cancel) dialog.
-     * 
-     * @param parent
-     *            the parent shell of the dialog, or <code>null</code> if none
-     * @param title
-     *            the dialog's title, or <code>null</code> if none
-     * @param message
-     *            the message
-     * @return <code>true</code> if the user presses the OK button,
-     *         <code>false</code> otherwise
-     */
-    public static boolean openConfirm(Shell parent, String title, String message) {
-        MessageDialog dialog = new MessageDialog(parent, title, null, // accept
-                // the
-                // default
-                // window
-                // icon
-                message, QUESTION, new String[] { IDialogConstants.OK_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0); // OK is the
-        // default
-        return dialog.open() == 0;
-    }
-
-    /**
-     * Convenience method to open a standard error dialog.
-     * 
-     * @param parent
-     *            the parent shell of the dialog, or <code>null</code> if none
-     * @param title
-     *            the dialog's title, or <code>null</code> if none
-     * @param message
-     *            the message
-     */
-    public static void openError(Shell parent, String title, String message) {
-        MessageDialog dialog = new MessageDialog(parent, title, null, // accept
-                // the
-                // default
-                // window
-                // icon
-                message, ERROR, new String[] { IDialogConstants.OK_LABEL }, 0); // ok
-        // is
-        // the
-        // default
-        dialog.open();
-        return;
-    }
-
-    /**
-     * Convenience method to open a standard information dialog.
-     * 
-     * @param parent
-     *            the parent shell of the dialog, or <code>null</code> if none
-     * @param title
-     *            the dialog's title, or <code>null</code> if none
-     * @param message
-     *            the message
-     */
-    public static void openInformation(Shell parent, String title,
-            String message) {
-        MessageDialog dialog = new MessageDialog(parent, title, null, // accept
-                // the
-                // default
-                // window
-                // icon
-                message, INFORMATION,
-                new String[] { IDialogConstants.OK_LABEL }, 0);
-        // ok is the default
-        dialog.open();
-        return;
-    }
-
-    /**
-     * Convenience method to open a simple Yes/No question dialog.
-     * 
-     * @param parent
-     *            the parent shell of the dialog, or <code>null</code> if none
-     * @param title
-     *            the dialog's title, or <code>null</code> if none
-     * @param message
-     *            the message
-     * @return <code>true</code> if the user presses the Yes button,
-     *         <code>false</code> otherwise
-     */
-    public static boolean openQuestion(Shell parent, String title,
-            String message) {
-        MessageDialog dialog = new MessageDialog(parent, title, null, // accept
-                // the
-                // default
-                // window
-                // icon
-                message, QUESTION, new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.NO_LABEL }, 0); // yes is the default
-        return dialog.open() == 0;
-    }
-
-    /**
-     * Convenience method to open a standard warning dialog.
-     * 
-     * @param parent
-     *            the parent shell of the dialog, or <code>null</code> if none
-     * @param title
-     *            the dialog's title, or <code>null</code> if none
-     * @param message
-     *            the message
-     */
-    public static void openWarning(Shell parent, String title, String message) {
-        MessageDialog dialog = new MessageDialog(parent, title, null, // accept
-                // the
-                // default
-                // window
-                // icon
-                message, WARNING, new String[] { IDialogConstants.OK_LABEL }, 0); // ok
-        // is
-        // the
-        // default
-        dialog.open();
-        return;
-    }
-
-    /*
-     * @see org.eclipse.jface.dialogs.Dialog#createButton(org.eclipse.swt.widgets.Composite,
-     *      int, java.lang.String, boolean)
-     */
-    protected Button createButton(Composite parent, int id, String label,
-            boolean defaultButton) {
-        Button button = super.createButton(parent, id, label, defaultButton);
-        //Be sure to set the focus if the custom area cannot so as not
-        //to lose the defaultButton.
-        if (defaultButton && !customShouldTakeFocus()) {
-			button.setFocus();
-		}
-        return button;
-    }
-
-    /**
-     * Return whether or not we should apply the workaround where we take focus
-     * for the default button or if that should be determined by the dialog. By
-     * default only return true if the custom area is a label or CLabel that
-     * cannot take focus.
-     * 
-     * @return boolean
-     */
-    protected boolean customShouldTakeFocus() {
-        if (customArea instanceof Label) {
-			return false;
-		}
-        if (customArea instanceof CLabel) {
-			return (customArea.getStyle() & SWT.NO_FOCUS) > 0;
-		}
-        return true;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.IconAndMessageDialog#getImage()
-     */
-    public Image getImage() {
-        return image;
-    }
-
-    /**
-     * An accessor for the labels to use on the buttons.
-     * 
-     * @return The button labels to used; never <code>null</code>.
-     */
-    protected String[] getButtonLabels() {
-        return buttonLabels;
-    }
-
-    /**
-     * An accessor for the index of the default button in the button array.
-     * 
-     * @return The default button index.
-     */
-    protected int getDefaultButtonIndex() {
-        return defaultButtonIndex;
-    }
-
-    /**
-     * A mutator for the array of buttons in the button bar.
-     * 
-     * @param buttons
-     *            The buttons in the button bar; must not be <code>null</code>.
-     */
-    protected void setButtons(Button[] buttons) {
-        if (buttons == null) {
-            throw new NullPointerException(
-                    "The array of buttons cannot be null.");} //$NON-NLS-1$
-        this.buttons = buttons;
-    }
-
-    /**
-     * A mutator for the button labels.
-     * 
-     * @param buttonLabels
-     *            The button labels to use; must not be <code>null</code>.
-     */
-    protected void setButtonLabels(String[] buttonLabels) {
-        if (buttonLabels == null) {
-            throw new NullPointerException(
-                    "The array of button labels cannot be null.");} //$NON-NLS-1$
-        this.buttonLabels = buttonLabels;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/MessageDialogWithToggle.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/MessageDialogWithToggle.java
deleted file mode 100644
index daa1115..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/MessageDialogWithToggle.java
+++ /dev/null
@@ -1,712 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-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.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * <p>
- * A message dialog which also allows the user to adjust a toggle setting. If a
- * preference store is provided and the user selects the toggle, then the user's
- * answer (yes/ok or no) will be persisted in the store. If no store is
- * provided, then this information can be queried after the dialog closes.
- * </p>
- * <p>
- * This type of dialog should be used whenever you want to user to be able to
- * avoid being prompted in the future. It is <strong>strongly </strong>
- * recommended that a cancel option be provided, so that the user has the option
- * of making the decision at a later point in time. The semantic for a cancel
- * button should be to cancel the operation (if it has not yet started), or stop
- * the operation (if it has already started).
- * </p>
- * <p>
- * It is the responsibility of the developer to provide a mechanism for the user
- * to change this preference at some later point in time (e.g., through a
- * preference page).
- * </p>
- * 
- * @since 3.0
- */
-public class MessageDialogWithToggle extends MessageDialog {
-
-    /**
-     * The value of the preference when the user has asked that the answer to
-     * the question always be "okay" or "yes".
-     */
-    public static final String ALWAYS = "always"; //$NON-NLS-1$
-
-    /**
-     * The value of the preference when the user has asked that the answer to
-     * the question always be "no".
-     */
-    public static final String NEVER = "never"; //$NON-NLS-1$
-
-    /**
-     * The value of the preference when the user wishes to prompted for an
-     * answer every time the question is to be asked.
-     */
-    public static final String PROMPT = "prompt"; //$NON-NLS-1$
-
-    /**
-     * Convenience method to open a standard error dialog.
-     * 
-     * @param parent
-     *            the parent shell of the dialog, or <code>null</code> if none
-     * @param title
-     *            the dialog's title, or <code>null</code> if none
-     * @param message
-     *            the message
-     * @param toggleMessage
-     *            the message for the toggle control, or <code>null</code> for
-     *            the default message
-     * @param toggleState
-     *            the initial state for the toggle
-     * @param store
-     *            the IPreference store in which the user's preference should be
-     *            persisted; <code>null</code> if you don't want it persisted
-     *            automatically.
-     * @param key
-     *            the key to use when persisting the user's preference;
-     *            <code>null</code> if you don't want it persisted.
-     * @return the dialog, after being closed by the user, which the client can
-     *         only call <code>getReturnCode()</code> or
-     *         <code>getToggleState()</code>
-     */
-    public static MessageDialogWithToggle openError(Shell parent, String title,
-            String message, String toggleMessage, boolean toggleState,
-            IPreferenceStore store, String key) {
-        MessageDialogWithToggle dialog = new MessageDialogWithToggle(parent,
-                title, null, // accept the default window icon
-                message, ERROR, new String[] { IDialogConstants.OK_LABEL }, 0, // ok
-                // is
-                // the
-                // default
-                toggleMessage, toggleState);
-        dialog.prefStore = store;
-        dialog.prefKey = key;
-        dialog.open();
-        return dialog;
-    }
-
-    /**
-     * Convenience method to open a standard information dialog.
-     * 
-     * @param parent
-     *            the parent shell of the dialog, or <code>null</code> if none
-     * @param title
-     *            the dialog's title, or <code>null</code> if none
-     * @param message
-     *            the message
-     * @param toggleMessage
-     *            the message for the toggle control, or <code>null</code> for
-     *            the default message
-     * @param toggleState
-     *            the initial state for the toggle
-     * @param store
-     *            the IPreference store in which the user's preference should be
-     *            persisted; <code>null</code> if you don't want it persisted
-     *            automatically.
-     * @param key
-     *            the key to use when persisting the user's preference;
-     *            <code>null</code> if you don't want it persisted.
-     * 
-     * @return the dialog, after being closed by the user, which the client can
-     *         only call <code>getReturnCode()</code> or
-     *         <code>getToggleState()</code>
-     */
-    public static MessageDialogWithToggle openInformation(Shell parent,
-            String title, String message, String toggleMessage,
-            boolean toggleState, IPreferenceStore store, String key) {
-        MessageDialogWithToggle dialog = new MessageDialogWithToggle(parent,
-                title, null, // accept the default window icon
-                message, INFORMATION,
-                new String[] { IDialogConstants.OK_LABEL }, 0, // ok is the
-                // default
-                toggleMessage, toggleState);
-        dialog.prefStore = store;
-        dialog.prefKey = key;
-        dialog.open();
-        return dialog;
-    }
-
-    /**
-     * Convenience method to open a simple confirm (OK/Cancel) dialog.
-     * 
-     * @param parent
-     *            the parent shell of the dialog, or <code>null</code> if none
-     * @param title
-     *            the dialog's title, or <code>null</code> if none
-     * @param message
-     *            the message
-     * @param toggleMessage
-     *            the message for the toggle control, or <code>null</code> for
-     *            the default message
-     * @param toggleState
-     *            the initial state for the toggle
-     * @param store
-     *            the IPreference store in which the user's preference should be
-     *            persisted; <code>null</code> if you don't want it persisted
-     *            automatically.
-     * @param key
-     *            the key to use when persisting the user's preference;
-     *            <code>null</code> if you don't want it persisted.
-     * @return the dialog, after being closed by the user, which the client can
-     *         only call <code>getReturnCode()</code> or
-     *         <code>getToggleState()</code>
-     */
-    public static MessageDialogWithToggle openOkCancelConfirm(Shell parent,
-            String title, String message, String toggleMessage,
-            boolean toggleState, IPreferenceStore store, String key) {
-        MessageDialogWithToggle dialog = new MessageDialogWithToggle(parent,
-                title, null, // accept the default window icon
-                message, QUESTION, new String[] { IDialogConstants.OK_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0, // OK is the default
-                toggleMessage, toggleState);
-        dialog.prefStore = store;
-        dialog.prefKey = key;
-        dialog.open();
-        return dialog;
-    }
-
-    /**
-     * Convenience method to open a standard warning dialog.
-     * 
-     * @param parent
-     *            the parent shell of the dialog, or <code>null</code> if none
-     * @param title
-     *            the dialog's title, or <code>null</code> if none
-     * @param message
-     *            the message
-     * @param toggleMessage
-     *            the message for the toggle control, or <code>null</code> for
-     *            the default message
-     * @param toggleState
-     *            the initial state for the toggle
-     * @param store
-     *            the IPreference store in which the user's preference should be
-     *            persisted; <code>null</code> if you don't want it persisted
-     *            automatically.
-     * @param key
-     *            the key to use when persisting the user's preference;
-     *            <code>null</code> if you don't want it persisted.
-     * @return the dialog, after being closed by the user, which the client can
-     *         only call <code>getReturnCode()</code> or
-     *         <code>getToggleState()</code>
-     */
-    public static MessageDialogWithToggle openWarning(Shell parent,
-            String title, String message, String toggleMessage,
-            boolean toggleState, IPreferenceStore store, String key) {
-        MessageDialogWithToggle dialog = new MessageDialogWithToggle(parent,
-                title, null, // accept the default window icon
-                message, WARNING, new String[] { IDialogConstants.OK_LABEL },
-                0, // ok is the default
-                toggleMessage, toggleState);
-        dialog.prefStore = store;
-        dialog.prefKey = key;
-        dialog.open();
-        return dialog;
-    }
-
-    /**
-     * Convenience method to open a simple question Yes/No/Cancel dialog.
-     * 
-     * @param parent
-     *            the parent shell of the dialog, or <code>null</code> if none
-     * @param title
-     *            the dialog's title, or <code>null</code> if none
-     * @param message
-     *            the message
-     * @param toggleMessage
-     *            the message for the toggle control, or <code>null</code> for
-     *            the default message
-     * @param toggleState
-     *            the initial state for the toggle
-     * @param store
-     *            the IPreference store in which the user's preference should be
-     *            persisted; <code>null</code> if you don't want it persisted
-     *            automatically.
-     * @param key
-     *            the key to use when persisting the user's preference;
-     *            <code>null</code> if you don't want it persisted.
-     * @return the dialog, after being closed by the user, which the client can
-     *         only call <code>getReturnCode()</code> or
-     *         <code>getToggleState()</code>
-     */
-    public static MessageDialogWithToggle openYesNoCancelQuestion(Shell parent,
-            String title, String message, String toggleMessage,
-            boolean toggleState, IPreferenceStore store, String key) {
-        MessageDialogWithToggle dialog = new MessageDialogWithToggle(parent,
-                title, null, // accept the default window icon
-                message, QUESTION, new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0, // YES is the
-                // default
-                toggleMessage, toggleState);
-        dialog.prefStore = store;
-        dialog.prefKey = key;
-        dialog.open();
-        return dialog;
-    }
-
-    /**
-     * Convenience method to open a simple Yes/No question dialog.
-     * 
-     * @param parent
-     *            the parent shell of the dialog, or <code>null</code> if none
-     * @param title
-     *            the dialog's title, or <code>null</code> if none
-     * @param message
-     *            the message
-     * @param toggleMessage
-     *            the message for the toggle control, or <code>null</code> for
-     *            the default message
-     * @param toggleState
-     *            the initial state for the toggle
-     * @param store
-     *            the IPreference store in which the user's preference should be
-     *            persisted; <code>null</code> if you don't want it persisted
-     *            automatically.
-     * @param key
-     *            the key to use when persisting the user's preference;
-     *            <code>null</code> if you don't want it persisted.
-     * 
-     * @return the dialog, after being closed by the user, which the client can
-     *         only call <code>getReturnCode()</code> or
-     *         <code>getToggleState()</code>
-     */
-    public static MessageDialogWithToggle openYesNoQuestion(Shell parent,
-            String title, String message, String toggleMessage,
-            boolean toggleState, IPreferenceStore store, String key) {
-        MessageDialogWithToggle dialog = new MessageDialogWithToggle(parent,
-                title, null, // accept the default window icon
-                message, QUESTION, new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.NO_LABEL }, 0, // yes is the default
-                toggleMessage, toggleState);
-        dialog.prefStore = store;
-        dialog.prefKey = key;
-        dialog.open();
-        return dialog;
-    }
-
-    /**
-     * The key at which the toggle state should be stored within the
-     * preferences. This value may be <code>null</code>, which indicates that
-     * no preference should be updated automatically. It is then the
-     * responsibility of the user of this API to use the information from the
-     * toggle. Note: a <code>prefStore</code> is also needed.
-     */
-    private String prefKey = null;
-
-    /**
-     * The preference store which will be affected by the toggle button. This
-     * value may be <code>null</code>, which indicates that no preference
-     * should be updated automatically. It is then the responsibility of the
-     * user of this API to use the information from the toggle. Note: a
-     * <code>prefKey</code> is also needed.
-     */
-    private IPreferenceStore prefStore = null;
-
-    /**
-     * The toggle button (widget). This value is <code>null</code> until the
-     * dialog is created.
-     */
-    private Button toggleButton = null;
-
-    /**
-     * The message displayed to the user, with the toggle button. This is the
-     * text besides the toggle. If it is <code>null</code>, this means that
-     * the default text for the toggle should be used.
-     */
-    private String toggleMessage;
-
-    /**
-     * The initial selected state of the toggle.
-     */
-    private boolean toggleState;
-
-    /**
-     * Creates a message dialog with a toggle. See the superclass constructor
-     * for info on the other parameters.
-     * 
-     * @param parentShell
-     *            the parent shell
-     * @param dialogTitle
-     *            the dialog title, or <code>null</code> if none
-     * @param image
-     *            the dialog title image, or <code>null</code> if none
-     * @param message
-     *            the dialog message
-     * @param dialogImageType
-     *            one of the following values:
-     *            <ul>
-     *            <li><code>MessageDialog.NONE</code> for a dialog with no
-     *            image</li>
-     *            <li><code>MessageDialog.ERROR</code> for a dialog with an
-     *            error image</li>
-     *            <li><code>MessageDialog.INFORMATION</code> for a dialog
-     *            with an information image</li>
-     *            <li><code>MessageDialog.QUESTION </code> for a dialog with a
-     *            question image</li>
-     *            <li><code>MessageDialog.WARNING</code> for a dialog with a
-     *            warning image</li>
-     *            </ul>
-     * @param dialogButtonLabels
-     *            an array of labels for the buttons in the button bar
-     * @param defaultIndex
-     *            the index in the button label array of the default button
-     * @param toggleMessage
-     *            the message for the toggle control, or <code>null</code> for
-     *            the default message
-     * @param toggleState
-     *            the initial state for the toggle
-     *  
-     */
-    public MessageDialogWithToggle(Shell parentShell, String dialogTitle,
-            Image image, String message, int dialogImageType,
-            String[] dialogButtonLabels, int defaultIndex,
-            String toggleMessage, boolean toggleState) {
-        super(parentShell, dialogTitle, image, message, dialogImageType,
-                dialogButtonLabels, defaultIndex);
-        this.toggleMessage = toggleMessage;
-        this.toggleState = toggleState;
-        setButtonLabels(dialogButtonLabels);
-    }
-
-    /**
-     * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
-     */
-    protected void buttonPressed(int buttonId) {
-        super.buttonPressed(buttonId);
-
-        if (buttonId != IDialogConstants.CANCEL_ID && toggleState
-                && prefStore != null && prefKey != null) {
-            switch (buttonId) {
-            case IDialogConstants.YES_ID:
-            case IDialogConstants.YES_TO_ALL_ID:
-            case IDialogConstants.PROCEED_ID:
-            case IDialogConstants.OK_ID:
-                prefStore.setValue(prefKey, ALWAYS);
-                break;
-            case IDialogConstants.NO_ID:
-            case IDialogConstants.NO_TO_ALL_ID:
-                prefStore.setValue(prefKey, NEVER);
-                break;
-            }
-        }
-    }
-
-    /**
-     * @see Dialog#createButtonBar(Composite)
-     */
-    protected void createButtonsForButtonBar(Composite parent) {
-        final String[] buttonLabels = getButtonLabels();
-        final Button[] buttons = new Button[buttonLabels.length];
-        final int defaultButtonIndex = getDefaultButtonIndex();
-
-        int suggestedId = IDialogConstants.INTERNAL_ID;
-        for (int i = 0; i < buttonLabels.length; i++) {
-            String label = buttonLabels[i];
-            // get the JFace button ID that matches the label, or use the specified
-            // id if there is no match.
-            int id = mapButtonLabelToButtonID(label, suggestedId);
-            
-            // if the suggested id was used, increment the default for next use
-            if (id == suggestedId) {
-				suggestedId++;
-			}
- 
-            Button button = createButton(parent, id, label,
-                    defaultButtonIndex == i);
-            buttons[i] = button;
- 
-        }
-        setButtons(buttons);
-    }
-
-    /**
-     * @see Dialog#createDialogArea(Composite)
-     */
-    protected Control createDialogArea(Composite parent) {
-        Composite dialogAreaComposite = (Composite) super
-                .createDialogArea(parent);
-        setToggleButton(createToggleButton(dialogAreaComposite));
-        return dialogAreaComposite;
-    }
-
-    /**
-     * Creates a toggle button without any text or state.  The text and state
-     * will be created by <code>createDialogArea</code>. 
-     * 
-     * @param parent
-     *            The composite in which the toggle button should be placed;
-     *            must not be <code>null</code>.
-     * @return The added toggle button; never <code>null</code>.
-     */
-    protected Button createToggleButton(Composite parent) {
-        final Button button = new Button(parent, SWT.CHECK | SWT.LEFT);
-
-        GridData data = new GridData(SWT.NONE);
-        data.horizontalSpan = 2;
-        button.setLayoutData(data);
-        button.setFont(parent.getFont());
-
-        button.addSelectionListener(new SelectionAdapter() {
-
-            public void widgetSelected(SelectionEvent e) {
-                toggleState = button.getSelection();
-            }
-
-        });
-
-        return button;
-    }
-
-    /**
-     * Returns the toggle button.
-     * 
-     * @return the toggle button
-     */
-    protected Button getToggleButton() {
-        return toggleButton;
-    }
-
-    /**
-     * An accessor for the current preference store for this dialog.
-     * 
-     * @return The preference store; this value may be <code>null</code> if no
-     *         preference is being used.
-     */
-    public IPreferenceStore getPrefStore() {
-        return prefStore;
-    }
-
-    /**
-     * An accessor for the current key of the toggle preference.
-     * 
-     * @return The preference key; this value may be <code>null</code> if no
-     *         preference is being used.
-     */
-    public String getPrefKey() {
-        return prefKey;
-    }
-
-    /**
-     * Returns the toggle state. This can be called even after the dialog is
-     * closed.
-     * 
-     * @return <code>true</code> if the toggle button is checked,
-     *         <code>false</code> if not
-     */
-    public boolean getToggleState() {
-        return toggleState;
-    }
-
-    /**
-     * A mutator for the key of the preference to be modified by the toggle
-     * button.
-     * 
-     * @param prefKey
-     *            The prefKey to set. If this value is <code>null</code>,
-     *            then no preference will be modified.
-     */
-    public void setPrefKey(String prefKey) {
-        this.prefKey = prefKey;
-    }
-
-    /**
-     * A mutator for the preference store to be modified by the toggle button.
-     * 
-     * @param prefStore
-     *            The prefStore to set. If this value is <code>null</code>,
-     *            then no preference will be modified.
-     */
-    public void setPrefStore(IPreferenceStore prefStore) {
-        this.prefStore = prefStore;
-    }
-
-    /**
-     * A mutator for the button providing the toggle option. If the button
-     * exists, then it will automatically get the text set to the current toggle
-     * message, and its selection state set to the current selection state.
-     * 
-     * @param button
-     *            The button to use; must not be <code>null</code>.
-     */
-    protected void setToggleButton(Button button) {
-        if (button == null) {
-            throw new NullPointerException(
-                    "A message dialog with toggle may not have a null toggle button.");} //$NON-NLS-1$
-
-        if (!button.isDisposed()) {
-            final String text;
-            if (toggleMessage == null) {
-                text = JFaceResources
-                        .getString("MessageDialogWithToggle.defaultToggleMessage"); //$NON-NLS-1$
-            } else {
-                text = toggleMessage;
-            }
-            button.setText(text);
-            button.setSelection(toggleState);
-        }
-
-        this.toggleButton = button;
-    }
-
-    /**
-     * A mutator for the text on the toggle button. The button will
-     * automatically get updated with the new text, if it exists.
-     * 
-     * @param message
-     *            The new text of the toggle button; if it is <code>null</code>,
-     *            then used the default toggle message.
-     */
-    protected void setToggleMessage(String message) {
-        this.toggleMessage = message;
-
-        if ((toggleButton != null) && (!toggleButton.isDisposed())) {
-            final String text;
-            if (toggleMessage == null) {
-                text = JFaceResources
-                        .getString("MessageDialogWithToggle.defaultToggleMessage"); //$NON-NLS-1$
-            } else {
-                text = toggleMessage;
-            }
-            toggleButton.setText(text);
-        }
-    }
-
-    /**
-     * A mutator for the state of the toggle button. This method will update the
-     * button, if it exists.
-     * 
-     * @param toggleState
-     *            The desired state of the toggle button (<code>true</code>
-     *            means the toggle should be selected).
-     */
-    public void setToggleState(boolean toggleState) {
-        this.toggleState = toggleState;
-
-        // Update the button, if it exists.
-        if ((toggleButton != null) && (!toggleButton.isDisposed())) {
-            toggleButton.setSelection(toggleState);
-        }
-    }
-    
-    /**
-     * Attempt to find a standard JFace button id that matches the specified button
-     * label.  If no match can be found, use the default id provided.
-     * 
-     * @param buttonLabel the button label whose id is sought
-     * @param defaultId the id to use for the button if there is no standard id
-     * @return the id for the specified button label
-     */
-    private int mapButtonLabelToButtonID(String buttonLabel, int defaultId) {
-    	// Not pretty but does the job...
-    	if (IDialogConstants.OK_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.OK_ID;
-		}
-    	
-	    if (IDialogConstants.YES_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.YES_ID;
-		}
-	    
-	    if (IDialogConstants.NO_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.NO_ID;
-		}
-	    
-	    if (IDialogConstants.CANCEL_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.CANCEL_ID;
-		}
-	    
-	    if (IDialogConstants.YES_TO_ALL_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.YES_TO_ALL_ID;
-		}
-	    
-	    if (IDialogConstants.SKIP_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.SKIP_ID;
-		}
-	    
-	    if (IDialogConstants.STOP_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.STOP_ID;
-		}
-	    
-	    if (IDialogConstants.ABORT_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.ABORT_ID;
-		}
-	    
-	    if (IDialogConstants.RETRY_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.RETRY_ID;
-		}
-	    
-	    if (IDialogConstants.IGNORE_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.IGNORE_ID;
-		}
-	    
-	    if (IDialogConstants.PROCEED_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.PROCEED_ID;
-		}
-	    
-	    if (IDialogConstants.OPEN_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.OPEN_ID;
-		}
-	    
-	    if (IDialogConstants.CLOSE_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.CLOSE_ID;
-		}
-	    
-	    if (IDialogConstants.BACK_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.BACK_ID;
-		}
-	    
-	    if (IDialogConstants.NEXT_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.NEXT_ID;
-		}
-	    
-	    if (IDialogConstants.FINISH_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.FINISH_ID;
-		}
-	    
-	    if (IDialogConstants.HELP_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.HELP_ID;
-		}
-	    
-	    if (IDialogConstants.NO_TO_ALL_LABEL.equals(buttonLabel)) {
-			return IDialogConstants.NO_TO_ALL_ID;
-		}
-	    
-	    if (IDialogConstants.SHOW_DETAILS_LABEL.equals(buttonLabel)) {
-	    	return IDialogConstants.DETAILS_ID;
-	    }
-	    
-	    if (IDialogConstants.HIDE_DETAILS_LABEL.equals(buttonLabel)) {
-	    	return IDialogConstants.DETAILS_ID;
-	    }
-        
-        //          No XXX_LABEL in IDialogConstants for these. Unlikely
-        //            they would be used in a message dialog though.
-        //        	public int SELECT_ALL_ID = 18;
-        //        	public int DESELECT_ALL_ID = 19;
-        //        	public int SELECT_TYPES_ID = 20;
-
-	    return defaultId;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/PageChangedEvent.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/PageChangedEvent.java
deleted file mode 100644
index d4a6a92..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/PageChangedEvent.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import java.util.EventObject;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * Event object describing a page selection change. The source of these events
- * is a page change provider.
- * 
- * @see IPageChangeProvider
- * @see IPageChangedListener
- * 
- * @since 3.1
- */
-public class PageChangedEvent extends EventObject {
-
-	/**
-	 * Generated serial version UID for this class.
-	 * 
-	 * @since 3.1
-	 */
-	private static final long serialVersionUID = 3835149545519723574L;
-
-	/**
-	 * The selected page.
-	 */
-	protected Object selectedPage;
-
-	/**
-	 * Creates a new event for the given source and selected page.
-	 * 
-	 * @param source
-	 *            the page change provider
-	 * @param selectedPage
-	 *            the selected page. In the JFace provided dialogs this
-	 *            will be an <code>IDialogPage</code>.
-	 */
-	public PageChangedEvent(IPageChangeProvider source,
-			Object selectedPage) {
-		super(source);
-		Assert.isNotNull(selectedPage);
-		this.selectedPage = selectedPage;
-	}
-
-	/**
-	 * Returns the selected page.
-	 * 
-	 * @return the selected page. In dialogs implemented by JFace, 
-	 * 		this will be an <code>IDialogPage</code>.
-	 */
-	public Object getSelectedPage() {
-		return selectedPage;
-	}
-
-	/**
-	 * Returns the page change provider that is the source of this event.
-	 * 
-	 * @return the originating page change provider
-	 */
-	public IPageChangeProvider getPageChangeProvider() {
-		return (IPageChangeProvider) getSource();
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/PageChangingEvent.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/PageChangingEvent.java
deleted file mode 100644
index 4b78ac0..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/PageChangingEvent.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Chris Gross (schtoo@schtoo.com) - initial API and implementation for bug 16179
- *     IBM Corporation - revisions to initial contribution
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import java.util.EventObject;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * Event object describing an <code>IDialogPage</code> in the midst of changing.
- * 
- * @see IPageChangingListener
- * @since 3.3
- */
-public class PageChangingEvent extends EventObject {
-
-
-	private static final long serialVersionUID = 1L;
-	
-	private Object currentPage;
-	
-	private Object targetPage;
-	
-	/**
-	 * Public field that dictates if the page change will successfully change.
-	 * 
-	 * Set this field to <code>false</code> to prevent the page from changing.
-	 *   
-	 * Default value is <code>true</code>.
-	 */
-	public boolean doit = true;
-
-	/**
-	 * Creates a new event for the given source, selected (current) page and
-	 * direction.
-	 * 
-	 * @param source
-	 *            the page changing provider (the source of this event)
-	 * @param currentPage
-	 *            the current page. In the JFace provided dialogs this will be
-	 *            an <code>IDialogPage</code>.
-	 * @param targetPage
-	 *            the target page. In the JFace provided dialogs this will be an
-	 *            <code>IDialogPage</code>.
-	 */
-	public PageChangingEvent(Object source, Object currentPage, Object targetPage) {
-		super(source);
-		Assert.isNotNull(currentPage);
-		Assert.isNotNull(targetPage);
-		this.currentPage = currentPage;
-		this.targetPage = targetPage;
-	}
-
-	/**
-	 * Returns the current page from which the page change originates.
-	 * 
-	 * @return the current page. In dialogs implemented by JFace, 
-	 * 		this will be an <code>IDialogPage</code>.
-	 */
-	public Object getCurrentPage() {
-		return currentPage;
-	}
-
-	/**
-	 * Returns the target page to change to.
-	 * 
-	 * @return the target page. In dialogs implemented by JFace, 
-	 * 		this will be an <code>IDialogPage</code>.
-	 */
-	public Object getTargetPage() {
-		return targetPage;
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/PopupDialog.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/PopupDialog.java
deleted file mode 100644
index b2f6df6..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/PopupDialog.java
+++ /dev/null
@@ -1,1598 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Stefan Xenos, IBM - bug 156790: Adopt GridLayoutFactory within JFace
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-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.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.swt.widgets.Tracker;
-
-/**
- * A lightweight, transient dialog that is popped up to show contextual or
- * temporal information and is easily dismissed. Clients control whether the
- * dialog should be able to receive input focus. An optional title area at the
- * top and an optional info area at the bottom can be used to provide additional
- * information.
- * <p>
- * Because the dialog is short-lived, most of the configuration of the dialog is
- * done in the constructor. Set methods are only provided for those values that
- * are expected to be dynamically computed based on a particular instance's
- * internal state.
- * <p>
- * Clients are expected to override the creation of the main dialog area, and
- * may optionally override the creation of the title area and info area in order
- * to add content. In general, however, the creation of stylistic features, such
- * as the dialog menu, separator styles, and fonts, is kept private so that all
- * popup dialogs will have a similar appearance.
- * 
- * @since 3.2
- */
-public class PopupDialog extends Window {
-
-	/**
-	 * 
-	 */
-	private static final GridDataFactory LAYOUTDATA_GRAB_BOTH = GridDataFactory
-			.fillDefaults().grab(true, true);
-
-	/**
-	 * The dialog settings key name for stored dialog x location.
-	 */
-	private static final String DIALOG_ORIGIN_X = "DIALOG_X_ORIGIN"; //$NON-NLS-1$
-
-	/**
-	 * The dialog settings key name for stored dialog y location.
-	 */
-	private static final String DIALOG_ORIGIN_Y = "DIALOG_Y_ORIGIN"; //$NON-NLS-1$
-
-	/**
-	 * The dialog settings key name for stored dialog width.
-	 */
-	private static final String DIALOG_WIDTH = "DIALOG_WIDTH"; //$NON-NLS-1$
-
-	/**
-	 * The dialog settings key name for stored dialog height.
-	 */
-	private static final String DIALOG_HEIGHT = "DIALOG_HEIGHT"; //$NON-NLS-1$
-
-	/**
-	 * The dialog settings key name for remembering if the persisted bounds
-	 * should be accessed.
-	 * 
-	 * @deprecated Since 3.4, this is retained only for backward compatibility.
-	 */
-	private static final String DIALOG_USE_PERSISTED_BOUNDS = "DIALOG_USE_PERSISTED_BOUNDS"; //$NON-NLS-1$
-
-	/**
-	 * The dialog settings key name for remembering if the bounds persisted
-	 * prior to 3.4 have been migrated to the 3.4 settings.
-	 * 
-	 * @since 3.4
-	 * @deprecated This is marked deprecated at its introduction to discourage
-	 *             future dependency
-	 */
-	private static final String DIALOG_VALUE_MIGRATED_TO_34 = "hasBeenMigratedTo34"; //$NON-NLS-1$
-
-	/**
-	 * The dialog settings key name for remembering if the persisted size should
-	 * be accessed.
-	 */
-	private static final String DIALOG_USE_PERSISTED_SIZE = "DIALOG_USE_PERSISTED_SIZE"; //$NON-NLS-1$
-
-	/**
-	 * The dialog settings key name for remembering if the persisted location
-	 * should be accessed.
-	 */
-	private static final String DIALOG_USE_PERSISTED_LOCATION = "DIALOG_USE_PERSISTED_LOCATION"; //$NON-NLS-1$
-
-	/**
-	 * Move action for the dialog.
-	 */
-	private class MoveAction extends Action {
-
-		MoveAction() {
-			super(JFaceResources.getString("PopupDialog.move"), //$NON-NLS-1$
-					IAction.AS_PUSH_BUTTON);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.IAction#run()
-		 */
-		public void run() {
-			performTrackerAction(SWT.NONE);
-		}
-
-	}
-
-	/**
-	 * Resize action for the dialog.
-	 */
-	private class ResizeAction extends Action {
-
-		ResizeAction() {
-			super(JFaceResources.getString("PopupDialog.resize"), //$NON-NLS-1$
-					IAction.AS_PUSH_BUTTON);
-		}
-
-		/*
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			performTrackerAction(SWT.RESIZE);
-		}
-	}
-
-	/**
-	 * 
-	 * Remember bounds action for the dialog.
-	 */
-	private class PersistBoundsAction extends Action {
-
-		PersistBoundsAction() {
-			super(JFaceResources.getString("PopupDialog.persistBounds"), //$NON-NLS-1$
-					IAction.AS_CHECK_BOX);
-			setChecked(persistLocation && persistSize);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.IAction#run()
-		 */
-		public void run() {
-			persistSize = isChecked();
-			persistLocation = persistSize;
-		}
-	}
-
-	/**
-	 * 
-	 * Remember bounds action for the dialog.
-	 */
-	private class PersistSizeAction extends Action {
-
-		PersistSizeAction() {
-			super(JFaceResources.getString("PopupDialog.persistSize"), //$NON-NLS-1$
-					IAction.AS_CHECK_BOX);
-			setChecked(persistSize);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.IAction#run()
-		 */
-		public void run() {
-			persistSize = isChecked();
-		}
-	}
-
-	/**
-	 * 
-	 * Remember location action for the dialog.
-	 */
-	private class PersistLocationAction extends Action {
-
-		PersistLocationAction() {
-			super(JFaceResources.getString("PopupDialog.persistLocation"), //$NON-NLS-1$
-					IAction.AS_CHECK_BOX);
-			setChecked(persistLocation);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.IAction#run()
-		 */
-		public void run() {
-			persistLocation = isChecked();
-		}
-	}
-
-	/**
-	 * Shell style appropriate for a simple hover popup that cannot get focus.
-	 * 
-	 */
-	public final static int HOVER_SHELLSTYLE = SWT.NO_FOCUS | SWT.ON_TOP
-			| SWT.TOOL;
-
-	/**
-	 * Shell style appropriate for an info popup that can get focus.
-	 */
-	public final static int INFOPOPUP_SHELLSTYLE = SWT.TOOL;
-
-	/**
-	 * Shell style appropriate for a resizable info popup that can get focus.
-	 */
-	public final static int INFOPOPUPRESIZE_SHELLSTYLE = SWT.RESIZE;
-
-	/**
-	 * Margin width (in pixels) to be used in layouts inside popup dialogs
-	 * (value is 0).
-	 */
-	public final static int POPUP_MARGINWIDTH = 0;
-
-	/**
-	 * Margin height (in pixels) to be used in layouts inside popup dialogs
-	 * (value is 0).
-	 */
-	public final static int POPUP_MARGINHEIGHT = 0;
-
-	/**
-	 * Vertical spacing (in pixels) between cells in the layouts inside popup
-	 * dialogs (value is 1).
-	 */
-	public final static int POPUP_VERTICALSPACING = 1;
-
-	/**
-	 * Vertical spacing (in pixels) between cells in the layouts inside popup
-	 * dialogs (value is 1).
-	 */
-	public final static int POPUP_HORIZONTALSPACING = 1;
-
-	/**
-	 * Image registry key for menu image.
-	 * 
-	 * @since 3.4
-	 */
-	public static final String POPUP_IMG_MENU = "popup_menu_image"; //$NON-NLS-1$
-
-	/**
-	 * Image registry key for disabled menu image.
-	 * 
-	 * @since 3.4
-	 */
-	public static final String POPUP_IMG_MENU_DISABLED = "popup_menu_image_diabled"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	private static final GridLayoutFactory POPUP_LAYOUT_FACTORY = GridLayoutFactory
-			.fillDefaults().margins(POPUP_MARGINWIDTH, POPUP_MARGINHEIGHT)
-			.spacing(POPUP_HORIZONTALSPACING, POPUP_VERTICALSPACING);
-
-	/**
-	 * The dialog's toolbar for the move and resize capabilities.
-	 */
-	private ToolBar toolBar = null;
-
-	/**
-	 * The dialog's menu manager.
-	 */
-	private MenuManager menuManager = null;
-
-	/**
-	 * The control representing the main dialog area.
-	 */
-	private Control dialogArea;
-
-	/**
-	 * Labels that contain title and info text. Cached so they can be updated
-	 * dynamically if possible.
-	 */
-	private Label titleLabel, infoLabel;
-
-	/**
-	 * Separator controls. Cached so they can be excluded from color changes.
-	 */
-	private Control titleSeparator, infoSeparator;
-
-	/**
-	 * Font to be used for the info area text. Computed based on the dialog's
-	 * font.
-	 */
-	private Font infoFont;
-
-	/**
-	 * Font to be used for the title area text. Computed based on the dialog's
-	 * font.
-	 */
-	private Font titleFont;
-
-	/**
-	 * Flags indicating whether we are listening for shell deactivate events,
-	 * either those or our parent's. Used to prevent closure when a menu command
-	 * is chosen or a secondary popup is launched.
-	 */
-	private boolean listenToDeactivate;
-
-	private boolean listenToParentDeactivate;
-
-	private Listener parentDeactivateListener;
-
-	/**
-	 * Flag indicating whether focus should be taken when the dialog is opened.
-	 */
-	private boolean takeFocusOnOpen = false;
-
-	/**
-	 * Flag specifying whether a menu should be shown that allows the user to
-	 * move and resize.
-	 */
-	private boolean showDialogMenu = false;
-
-	/**
-	 * Flag specifying whether menu actions allowing the user to choose whether
-	 * the dialog bounds and location should be persisted are to be shown.
-	 */
-	private boolean showPersistActions = false;
-
-	/**
-	 * Flag specifying whether the size of the popup should be persisted. This
-	 * flag is used as initial default and updated by the menu if it is shown.
-	 */
-	private boolean persistSize = false;
-
-	/**
-	 * Flag specifying whether the location of the popup should be persisted.
-	 * This flag is used as initial default and updated by the menu if it is
-	 * shown.
-	 */
-	private boolean persistLocation = false;
-	/**
-	 * Flag specifying whether to use new 3.4 API instead of the old one.
-	 * 
-	 * @since 3.4
-	 */
-	private boolean isUsing34API = true;
-
-	/**
-	 * Text to be shown in an optional title area (on top).
-	 */
-	private String titleText;
-
-	/**
-	 * Text to be shown in an optional info area (at the bottom).
-	 */
-	private String infoText;
-
-	/**
-	 * Constructs a new instance of <code>PopupDialog</code>.
-	 * 
-	 * @param parent
-	 *            The parent shell.
-	 * @param shellStyle
-	 *            The shell style.
-	 * @param takeFocusOnOpen
-	 *            A boolean indicating whether focus should be taken by this
-	 *            popup when it opens.
-	 * @param persistBounds
-	 *            A boolean indicating whether the bounds (size and location) of
-	 *            the dialog should be persisted upon close of the dialog. The
-	 *            bounds can only be persisted if the dialog settings for
-	 *            persisting the bounds are also specified. If a menu action
-	 *            will be provided that allows the user to control this feature,
-	 *            then the last known value of the user's setting will be used
-	 *            instead of this flag.
-	 * @param showDialogMenu
-	 *            A boolean indicating whether a menu for moving and resizing
-	 *            the popup should be provided.
-	 * @param showPersistActions
-	 *            A boolean indicating whether actions allowing the user to
-	 *            control the persisting of the dialog size and location should
-	 *            be shown in the dialog menu. This parameter has no effect if
-	 *            <code>showDialogMenu</code> is <code>false</code>.
-	 * @param titleText
-	 *            Text to be shown in an upper title area, or <code>null</code>
-	 *            if there is no title.
-	 * @param infoText
-	 *            Text to be shown in a lower info area, or <code>null</code>
-	 *            if there is no info area.
-	 * 
-	 * @see PopupDialog#getDialogSettings()
-	 * @deprecated As of 3.4, replaced by
-	 *             {@link #PopupDialog(Shell, int, boolean, boolean, boolean, boolean, boolean, String, String)}
-	 */
-	public PopupDialog(Shell parent, int shellStyle, boolean takeFocusOnOpen,
-			boolean persistBounds, boolean showDialogMenu,
-			boolean showPersistActions, String titleText, String infoText) {
-		this(parent, shellStyle, takeFocusOnOpen, persistBounds, persistBounds,
-				showDialogMenu, showPersistActions, titleText, infoText, false);
-	}
-
-	/**
-	 * Constructs a new instance of <code>PopupDialog</code>.
-	 * 
-	 * @param parent
-	 *            The parent shell.
-	 * @param shellStyle
-	 *            The shell style.
-	 * @param takeFocusOnOpen
-	 *            A boolean indicating whether focus should be taken by this
-	 *            popup when it opens.
-	 * @param persistSize
-	 *            A boolean indicating whether the size should be persisted upon
-	 *            close of the dialog. The size can only be persisted if the
-	 *            dialog settings for persisting the bounds are also specified.
-	 *            If a menu action will be provided that allows the user to
-	 *            control this feature and the user hasn't changed that setting,
-	 *            then this flag is used as initial default for the menu.
-	 * @param persistLocation
-	 *            A boolean indicating whether the location should be persisted
-	 *            upon close of the dialog. The location can only be persisted
-	 *            if the dialog settings for persisting the bounds are also
-	 *            specified. If a menu action will be provided that allows the
-	 *            user to control this feature and the user hasn't changed that
-	 *            setting, then this flag is used as initial default for the
-	 *            menu. default for the menu until the user changed it.
-	 * @param showDialogMenu
-	 *            A boolean indicating whether a menu for moving and resizing
-	 *            the popup should be provided.
-	 * @param showPersistActions
-	 *            A boolean indicating whether actions allowing the user to
-	 *            control the persisting of the dialog bounds and location
-	 *            should be shown in the dialog menu. This parameter has no
-	 *            effect if <code>showDialogMenu</code> is <code>false</code>.
-	 * @param titleText
-	 *            Text to be shown in an upper title area, or <code>null</code>
-	 *            if there is no title.
-	 * @param infoText
-	 *            Text to be shown in a lower info area, or <code>null</code>
-	 *            if there is no info area.
-	 * 
-	 * @see PopupDialog#getDialogSettings()
-	 * 
-	 * @since 3.4
-	 */
-	public PopupDialog(Shell parent, int shellStyle, boolean takeFocusOnOpen,
-			boolean persistSize, boolean persistLocation,
-			boolean showDialogMenu, boolean showPersistActions,
-			String titleText, String infoText) {
-		this(parent, shellStyle, takeFocusOnOpen, persistSize, persistLocation,
-				showDialogMenu, showPersistActions, titleText, infoText, true);
-
-	}
-
-	/**
-	 * Constructs a new instance of <code>PopupDialog</code>.
-	 * 
-	 * @param parent
-	 *            The parent shell.
-	 * @param shellStyle
-	 *            The shell style.
-	 * @param takeFocusOnOpen
-	 *            A boolean indicating whether focus should be taken by this
-	 *            popup when it opens.
-	 * @param persistSize
-	 *            A boolean indicating whether the size should be persisted upon
-	 *            close of the dialog. The size can only be persisted if the
-	 *            dialog settings for persisting the bounds are also specified.
-	 *            If a menu action will be provided that allows the user to
-	 *            control this feature and the user hasn't changed that setting,
-	 *            then this flag is used as initial default for the menu.
-	 * @param persistLocation
-	 *            A boolean indicating whether the location should be persisted
-	 *            upon close of the dialog. The location can only be persisted
-	 *            if the dialog settings for persisting the bounds are also
-	 *            specified. If a menu action will be provided that allows the
-	 *            user to control this feature and the user hasn't changed that
-	 *            setting, then this flag is used as initial default for the
-	 *            menu. default for the menu until the user changed it.
-	 * @param showDialogMenu
-	 *            A boolean indicating whether a menu for moving and resizing
-	 *            the popup should be provided.
-	 * @param showPersistActions
-	 *            A boolean indicating whether actions allowing the user to
-	 *            control the persisting of the dialog bounds and location
-	 *            should be shown in the dialog menu. This parameter has no
-	 *            effect if <code>showDialogMenu</code> is <code>false</code>.
-	 * @param titleText
-	 *            Text to be shown in an upper title area, or <code>null</code>
-	 *            if there is no title.
-	 * @param infoText
-	 *            Text to be shown in a lower info area, or <code>null</code>
-	 *            if there is no info area.
-	 * @param use34API
-	 *            <code>true</code> if 3.4 API should be used
-	 * 
-	 * @see PopupDialog#getDialogSettings()
-	 * 
-	 * @since 3.4
-	 */
-	private PopupDialog(Shell parent, int shellStyle, boolean takeFocusOnOpen,
-			boolean persistSize, boolean persistLocation,
-			boolean showDialogMenu, boolean showPersistActions,
-			String titleText, String infoText, boolean use34API) {
-		super(parent);
-		// Prior to 3.4, we encouraged use of SWT.NO_TRIM and provided a
-		// border using a black composite background and margin. Now we
-		// use SWT.TOOL to get the border for some cases and this conflicts
-		// with SWT.NO_TRIM. Clients who previously have used SWT.NO_TRIM
-		// and still had a border drawn for them would find their border go
-		// away unless we do the following:
-		// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=219743
-		if ((shellStyle & SWT.NO_TRIM) != 0) {
-			shellStyle &= ~(SWT.NO_TRIM | SWT.SHELL_TRIM);
-		}
-
-		setShellStyle(shellStyle);
-		this.takeFocusOnOpen = takeFocusOnOpen;
-		this.showDialogMenu = showDialogMenu;
-		this.showPersistActions = showPersistActions;
-		this.titleText = titleText;
-		this.infoText = infoText;
-
-		setBlockOnOpen(false);
-
-		this.isUsing34API = use34API;
-
-		this.persistSize = persistSize;
-		this.persistLocation = persistLocation;
-
-		migrateBoundsSetting();
-
-		initializeWidgetState();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#configureShell(Shell)
-	 */
-	protected void configureShell(Shell shell) {
-		GridLayoutFactory.fillDefaults().margins(0, 0).spacing(5, 5).applyTo(
-				shell);
-
-		shell.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event event) {
-				/*
-				 * Close if we are deactivating and have no child shells. If we
-				 * have child shells, we are deactivating due to their opening.
-				 * On X, we receive this when a menu child (such as the system
-				 * menu) of the shell opens, but I have not found a way to
-				 * distinguish that case here. Hence bug #113577 still exists.
-				 */
-				if (listenToDeactivate && event.widget == getShell()
-						&& getShell().getShells().length == 0) {
-					asyncClose();
-				} else {
-					/*
-					 * We typically ignore deactivates to work around
-					 * platform-specific event ordering. Now that we've ignored
-					 * whatever we were supposed to, start listening to
-					 * deactivates. Example issues can be found in
-					 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=123392
-					 */
-					listenToDeactivate = true;
-				}
-			}
-		});
-		// Set this true whenever we activate. It may have been turned
-		// off by a menu or secondary popup showing.
-		shell.addListener(SWT.Activate, new Listener() {
-			public void handleEvent(Event event) {
-				// ignore this event if we have launched a child
-				if (event.widget == getShell()
-						&& getShell().getShells().length == 0) {
-					listenToDeactivate = true;
-					// Typically we start listening for parent deactivate after
-					// we are activated, except on the Mac, where the deactivate
-					// is received after activate.
-					// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=100668
-					listenToParentDeactivate = !Util.isMac();
-				}
-			}
-		});
-
-		if ((getShellStyle() & SWT.ON_TOP) != 0 && shell.getParent() != null) {
-			parentDeactivateListener = new Listener() {
-				public void handleEvent(Event event) {
-					if (listenToParentDeactivate) {
-						asyncClose();
-					} else {
-						// Our first deactivate, now start listening on the Mac.
-						listenToParentDeactivate = listenToDeactivate;
-					}
-				}
-			};
-			shell.getParent().addListener(SWT.Deactivate,
-					parentDeactivateListener);
-		}
-
-		shell.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent event) {
-				handleDispose();
-			}
-		});
-	}
-
-	private void asyncClose() {
-		// workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=152010
-		getShell().getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				close();
-			}
-		});
-	}
-
-	/**
-	 * The <code>PopupDialog</code> implementation of this <code>Window</code>
-	 * method creates and lays out the top level composite for the dialog. It
-	 * then calls the <code>createTitleMenuArea</code>,
-	 * <code>createDialogArea</code>, and <code>createInfoTextArea</code>
-	 * methods to create an optional title and menu area on the top, a dialog
-	 * area in the center, and an optional info text area at the bottom.
-	 * Overriding <code>createDialogArea</code> and (optionally)
-	 * <code>createTitleMenuArea</code> and <code>createTitleMenuArea</code>
-	 * are recommended rather than overriding this method.
-	 * 
-	 * @param parent
-	 *            the composite used to parent the contents.
-	 * 
-	 * @return the control representing the contents.
-	 */
-	protected Control createContents(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		POPUP_LAYOUT_FACTORY.applyTo(composite);
-		LAYOUTDATA_GRAB_BOTH.applyTo(composite);
-
-		// Title area
-		if (hasTitleArea()) {
-			createTitleMenuArea(composite);
-			titleSeparator = createHorizontalSeparator(composite);
-		}
-		// Content
-		dialogArea = createDialogArea(composite);
-		// Create a grid data layout data if one was not provided.
-		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=118025
-		if (dialogArea.getLayoutData() == null) {
-			LAYOUTDATA_GRAB_BOTH.applyTo(dialogArea);
-		}
-
-		// Info field
-		if (hasInfoArea()) {
-			infoSeparator = createHorizontalSeparator(composite);
-			createInfoTextArea(composite);
-		}
-
-		applyColors(composite);
-		applyFonts(composite);
-		return composite;
-	}
-
-	/**
-	 * Creates and returns the contents of the dialog (the area below the title
-	 * area and above the info text area.
-	 * <p>
-	 * The <code>PopupDialog</code> implementation of this framework method
-	 * creates and returns a new <code>Composite</code> with standard margins
-	 * and spacing.
-	 * <p>
-	 * The returned control's layout data must be an instance of
-	 * <code>GridData</code>. This method must not modify the parent's
-	 * layout.
-	 * <p>
-	 * Subclasses must override this method but may call <code>super</code> as
-	 * in the following example:
-	 * 
-	 * <pre>
-	 * Composite composite = (Composite) super.createDialogArea(parent);
-	 * //add controls to composite as necessary
-	 * return composite;
-	 * </pre>
-	 * 
-	 * @param parent
-	 *            the parent composite to contain the dialog area
-	 * @return the dialog area control
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		POPUP_LAYOUT_FACTORY.applyTo(composite);
-		LAYOUTDATA_GRAB_BOTH.applyTo(composite);
-		return composite;
-	}
-
-	/**
-	 * Returns the control that should get initial focus. Subclasses may
-	 * override this method.
-	 * 
-	 * @return the Control that should receive focus when the popup opens.
-	 */
-	protected Control getFocusControl() {
-		return dialogArea;
-	}
-
-	/**
-	 * Sets the tab order for the popup. Clients should override to introduce
-	 * specific tab ordering.
-	 * 
-	 * @param composite
-	 *            the composite in which all content, including the title area
-	 *            and info area, was created. This composite's parent is the
-	 *            shell.
-	 */
-	protected void setTabOrder(Composite composite) {
-		// default is to do nothing
-	}
-
-	/**
-	 * Returns a boolean indicating whether the popup should have a title area
-	 * at the top of the dialog. Subclasses may override. Default behavior is to
-	 * have a title area if there is to be a menu or title text.
-	 * 
-	 * @return <code>true</code> if a title area should be created,
-	 *         <code>false</code> if it should not.
-	 */
-	protected boolean hasTitleArea() {
-		return titleText != null || showDialogMenu;
-	}
-
-	/**
-	 * Returns a boolean indicating whether the popup should have an info area
-	 * at the bottom of the dialog. Subclasses may override. Default behavior is
-	 * to have an info area if info text was provided at the time of creation.
-	 * 
-	 * @return <code>true</code> if a title area should be created,
-	 *         <code>false</code> if it should not.
-	 */
-	protected boolean hasInfoArea() {
-		return infoText != null;
-	}
-
-	/**
-	 * Creates the title and menu area. Subclasses typically need not override
-	 * this method, but instead should use the constructor parameters
-	 * <code>showDialogMenu</code> and <code>showPersistAction</code> to
-	 * indicate whether a menu should be shown, and
-	 * <code>createTitleControl</code> to to customize the presentation of the
-	 * title.
-	 * 
-	 * <p>
-	 * If this method is overridden, the returned control's layout data must be
-	 * an instance of <code>GridData</code>. This method must not modify the
-	 * parent's layout.
-	 * 
-	 * @param parent
-	 *            The parent composite.
-	 * @return The Control representing the title and menu area.
-	 */
-	protected Control createTitleMenuArea(Composite parent) {
-
-		Composite titleAreaComposite = new Composite(parent, SWT.NONE);
-		POPUP_LAYOUT_FACTORY.copy().numColumns(2).applyTo(titleAreaComposite);
-		GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true,
-				false).applyTo(titleAreaComposite);
-
-		createTitleControl(titleAreaComposite);
-
-		if (showDialogMenu) {
-			createDialogMenu(titleAreaComposite);
-		}
-		return titleAreaComposite;
-	}
-
-	/**
-	 * Creates the control to be used to represent the dialog's title text.
-	 * Subclasses may override if a different control is desired for
-	 * representing the title text, or if something different than the title
-	 * should be displayed in location where the title text typically is shown.
-	 * 
-	 * <p>
-	 * If this method is overridden, the returned control's layout data must be
-	 * an instance of <code>GridData</code>. This method must not modify the
-	 * parent's layout.
-	 * 
-	 * @param parent
-	 *            The parent composite.
-	 * @return The Control representing the title area.
-	 */
-	protected Control createTitleControl(Composite parent) {
-		titleLabel = new Label(parent, SWT.NONE);
-
-		GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true,
-				false).span(showDialogMenu ? 1 : 2, 1).applyTo(titleLabel);
-
-		if (titleText != null) {
-			titleLabel.setText(titleText);
-		}
-		return titleLabel;
-	}
-
-	/**
-	 * Creates the optional info text area. This method is only called if the
-	 * <code>hasInfoArea()</code> method returns true. Subclasses typically
-	 * need not override this method, but may do so.
-	 * 
-	 * <p>
-	 * If this method is overridden, the returned control's layout data must be
-	 * an instance of <code>GridData</code>. This method must not modify the
-	 * parent's layout.
-	 * 
-	 * 
-	 * @param parent
-	 *            The parent composite.
-	 * @return The control representing the info text area.
-	 * 
-	 * @see PopupDialog#hasInfoArea()
-	 * @see PopupDialog#createTitleControl(Composite)
-	 */
-	protected Control createInfoTextArea(Composite parent) {
-		// Status label
-		infoLabel = new Label(parent, SWT.RIGHT);
-		infoLabel.setText(infoText);
-		
-		GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL,
-				SWT.BEGINNING).applyTo(infoLabel);
-		infoLabel.setForeground(parent.getDisplay().getSystemColor(
-				SWT.COLOR_WIDGET_DARK_SHADOW));
-		return infoLabel;
-	}
-
-	/**
-	 * Create a horizontal separator for the given parent.
-	 * 
-	 * @param parent
-	 *            The parent composite.
-	 * @return The Control representing the horizontal separator.
-	 */
-	private Control createHorizontalSeparator(Composite parent) {
-		Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL
-				| SWT.LINE_DOT);
-		GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true,
-				false).applyTo(separator);
-		return separator;
-	}
-
-	/**
-	 * Create the dialog's menu for the move and resize actions.
-	 * 
-	 * @param parent
-	 *            The parent composite.
-	 */
-	private void createDialogMenu(Composite parent) {
-
-		toolBar = new ToolBar(parent, SWT.FLAT);
-		ToolItem viewMenuButton = new ToolItem(toolBar, SWT.PUSH, 0);
-
-		GridDataFactory.fillDefaults().align(SWT.END, SWT.CENTER).applyTo(
-				toolBar);
-		viewMenuButton.setImage(JFaceResources.getImage(POPUP_IMG_MENU));
-		viewMenuButton.setDisabledImage(JFaceResources
-				.getImage(POPUP_IMG_MENU_DISABLED));
-		viewMenuButton.setToolTipText(JFaceResources
-				.getString("PopupDialog.menuTooltip")); //$NON-NLS-1$
-		viewMenuButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				showDialogMenu();
-			}
-		});
-		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=177183
-		toolBar.addMouseListener(new MouseAdapter() {
-			public void mouseDown(MouseEvent e) {
-				showDialogMenu();
-			}
-		});
-	}
-
-	/**
-	 * Fill the dialog's menu. Subclasses may extend or override.
-	 * 
-	 * @param dialogMenu
-	 *            The dialog's menu.
-	 */
-	protected void fillDialogMenu(IMenuManager dialogMenu) {
-		dialogMenu.add(new GroupMarker("SystemMenuStart")); //$NON-NLS-1$
-		dialogMenu.add(new MoveAction());
-		dialogMenu.add(new ResizeAction());
-		if (showPersistActions) {
-			if (isUsing34API) {
-				dialogMenu.add(new PersistLocationAction());
-				dialogMenu.add(new PersistSizeAction());
-			} else {
-				dialogMenu.add(new PersistBoundsAction());
-			}
-		}
-		dialogMenu.add(new Separator("SystemMenuEnd")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Perform the requested tracker action (resize or move).
-	 * 
-	 * @param style
-	 *            The track style (resize or move).
-	 */
-	private void performTrackerAction(int style) {
-		Shell shell = getShell();
-		if (shell == null || shell.isDisposed()) {
-			return;
-		}
-
-		Tracker tracker = new Tracker(shell.getDisplay(), style);
-		tracker.setStippled(true);
-		Rectangle[] r = new Rectangle[] { shell.getBounds() };
-		tracker.setRectangles(r);
-
-		// Ignore any deactivate events caused by opening the tracker.
-		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=120656
-		boolean oldListenToDeactivate = listenToDeactivate;
-		listenToDeactivate = false;
-		if (tracker.open()) {
-			if (shell != null && !shell.isDisposed()) {
-				shell.setBounds(tracker.getRectangles()[0]);
-			}
-		}
-		listenToDeactivate = oldListenToDeactivate;
-	}
-
-	/**
-	 * Show the dialog's menu. This message has no effect if the receiver was
-	 * not configured to show a menu. Clients may call this method in order to
-	 * trigger the menu via keystrokes or other gestures. Subclasses typically
-	 * do not override method.
-	 */
-	protected void showDialogMenu() {
-		if (!showDialogMenu) {
-			return;
-		}
-
-		if (menuManager == null) {
-			menuManager = new MenuManager();
-			fillDialogMenu(menuManager);
-		}
-		// Setting this flag works around a problem that remains on X only,
-		// whereby activating the menu deactivates our shell.
-		listenToDeactivate = !Util.isGtk();
-
-		Menu menu = menuManager.createContextMenu(getShell());
-		Rectangle bounds = toolBar.getBounds();
-		Point topLeft = new Point(bounds.x, bounds.y + bounds.height);
-		topLeft = getShell().toDisplay(topLeft);
-		menu.setLocation(topLeft.x, topLeft.y);
-		menu.setVisible(true);
-	}
-
-	/**
-	 * Set the text to be shown in the popup's info area. This message has no
-	 * effect if there was no info text supplied when the dialog first opened.
-	 * Subclasses may override this method.
-	 * 
-	 * @param text
-	 *            the text to be shown when the info area is displayed.
-	 * 
-	 */
-	protected void setInfoText(String text) {
-		infoText = text;
-		if (infoLabel != null) {
-			infoLabel.setText(text);
-		}
-	}
-
-	/**
-	 * Set the text to be shown in the popup's title area. This message has no
-	 * effect if there was no title label specified when the dialog was
-	 * originally opened. Subclasses may override this method.
-	 * 
-	 * @param text
-	 *            the text to be shown when the title area is displayed.
-	 * 
-	 */
-	protected void setTitleText(String text) {
-		titleText = text;
-		if (titleLabel != null) {
-			titleLabel.setText(text);
-		}
-	}
-
-	/**
-	 * Return a boolean indicating whether this dialog will persist its bounds.
-	 * This value is initially set in the dialog's constructor, but can be
-	 * modified if the persist bounds action is shown on the menu and the user
-	 * has changed its value. Subclasses may override this method.
-	 * 
-	 * @return <code>true</code> if the dialog's bounds will be persisted,
-	 *         <code>false</code> if it will not.
-	 * 
-	 * @deprecated As of 3.4, please use {@link #getPersistLocation()} or
-	 *             {@link #getPersistSize()} to determine separately whether
-	 *             size or location should be persisted.
-	 */
-	protected boolean getPersistBounds() {
-		return persistLocation && persistSize;
-	}
-
-	/**
-	 * Return a boolean indicating whether this dialog will persist its
-	 * location. This value is initially set in the dialog's constructor, but
-	 * can be modified if the persist location action is shown on the menu and
-	 * the user has changed its value. Subclasses may override this method.
-	 * 
-	 * @return <code>true</code> if the dialog's location will be persisted,
-	 *         <code>false</code> if it will not.
-	 * 
-	 * @see #getPersistSize()
-	 * @since 3.4
-	 */
-	protected boolean getPersistLocation() {
-		return persistLocation;
-	}
-
-	/**
-	 * Return a boolean indicating whether this dialog will persist its size.
-	 * This value is initially set in the dialog's constructor, but can be
-	 * modified if the persist size action is shown on the menu and the user has
-	 * changed its value. Subclasses may override this method.
-	 * 
-	 * @return <code>true</code> if the dialog's size will be persisted,
-	 *         <code>false</code> if it will not.
-	 * 
-	 * @see #getPersistLocation()
-	 * @since 3.4
-	 */
-	protected boolean getPersistSize() {
-		return persistSize;
-	}
-
-	/**
-	 * Opens this window, creating it first if it has not yet been created.
-	 * <p>
-	 * This method is reimplemented for special configuration of PopupDialogs.
-	 * It never blocks on open, immediately returning <code>OK</code> if the
-	 * open is successful, or <code>CANCEL</code> if it is not. It provides
-	 * framework hooks that allow subclasses to set the focus and tab order, and
-	 * avoids the use of <code>shell.open()</code> in cases where the focus
-	 * should not be given to the shell initially.
-	 * 
-	 * @return the return code
-	 * 
-	 * @see org.eclipse.jface.window.Window#open()
-	 */
-	public int open() {
-
-		Shell shell = getShell();
-		if (shell == null || shell.isDisposed()) {
-			shell = null;
-			// create the window
-			create();
-			shell = getShell();
-		}
-
-		// provide a hook for adjusting the bounds. This is only
-		// necessary when there is content driven sizing that must be
-		// adjusted each time the dialog is opened.
-		adjustBounds();
-
-		// limit the shell size to the display size
-		constrainShellSize();
-
-		// set up the tab order for the dialog
-		setTabOrder((Composite) getContents());
-
-		// initialize flags for listening to deactivate
-		listenToDeactivate = false;
-		listenToParentDeactivate = false;
-
-		// open the window
-		if (takeFocusOnOpen) {
-			shell.open();
-			getFocusControl().setFocus();
-		} else {
-			shell.setVisible(true);
-		}
-
-		return OK;
-
-	}
-
-	/**
-	 * Closes this window, disposes its shell, and removes this window from its
-	 * window manager (if it has one).
-	 * <p>
-	 * This method is extended to save the dialog bounds and initialize widget
-	 * state so that the widgets can be recreated if the dialog is reopened.
-	 * This method may be extended (<code>super.close</code> must be called).
-	 * </p>
-	 * 
-	 * @return <code>true</code> if the window is (or was already) closed, and
-	 *         <code>false</code> if it is still open
-	 */
-	public boolean close() {
-		// If already closed, there is nothing to do.
-		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=127505
-		if (getShell() == null || getShell().isDisposed()) {
-			return true;
-		}
-
-		saveDialogBounds(getShell());
-		// Widgets are about to be disposed, so null out any state
-		// related to them that was not handled in dispose listeners.
-		// We do this before disposal so that any received activate or
-		// deactivate events are duly ignored.
-		initializeWidgetState();
-
-		if (parentDeactivateListener != null) {
-			getShell().getParent().removeListener(SWT.Deactivate,
-					parentDeactivateListener);
-			parentDeactivateListener = null;
-		}
-
-		return super.close();
-	}
-
-	/**
-	 * Gets the dialog settings that should be used for remembering the bounds
-	 * of the dialog. Subclasses should override this method when they wish to
-	 * persist the bounds of the dialog.
-	 * 
-	 * @return settings the dialog settings used to store the dialog's location
-	 *         and/or size, or <code>null</code> if the dialog's bounds should
-	 *         never be stored.
-	 */
-	protected IDialogSettings getDialogSettings() {
-		return null;
-	}
-
-	/**
-	 * Saves the bounds of the shell in the appropriate dialog settings. The
-	 * bounds are recorded relative to the parent shell, if there is one, or
-	 * display coordinates if there is no parent shell. Subclasses typically
-	 * need not override this method, but may extend it (calling
-	 * <code>super.saveDialogBounds</code> if additional bounds information
-	 * should be stored. Clients may also call this method to persist the bounds
-	 * at times other than closing the dialog.
-	 * 
-	 * @param shell
-	 *            The shell whose bounds are to be stored
-	 */
-	protected void saveDialogBounds(Shell shell) {
-		IDialogSettings settings = getDialogSettings();
-		if (settings != null) {
-			Point shellLocation = shell.getLocation();
-			Point shellSize = shell.getSize();
-			Shell parent = getParentShell();
-			if (parent != null) {
-				Point parentLocation = parent.getLocation();
-				shellLocation.x -= parentLocation.x;
-				shellLocation.y -= parentLocation.y;
-			}
-			String prefix = getClass().getName();
-			if (persistSize) {
-				settings.put(prefix + DIALOG_WIDTH, shellSize.x);
-				settings.put(prefix + DIALOG_HEIGHT, shellSize.y);
-			}
-			if (persistLocation) {
-				settings.put(prefix + DIALOG_ORIGIN_X, shellLocation.x);
-				settings.put(prefix + DIALOG_ORIGIN_Y, shellLocation.y);
-			}
-			if (showPersistActions && showDialogMenu) {
-				settings.put(getClass().getName() + DIALOG_USE_PERSISTED_SIZE,
-						persistSize);
-				settings.put(getClass().getName()
-						+ DIALOG_USE_PERSISTED_LOCATION, persistLocation);
-
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point result = getDefaultSize();
-		if (persistSize) {
-			IDialogSettings settings = getDialogSettings();
-			if (settings != null) {
-				try {
-					int width = settings.getInt(getClass().getName()
-							+ DIALOG_WIDTH);
-					int height = settings.getInt(getClass().getName()
-							+ DIALOG_HEIGHT);
-					result = new Point(width, height);
-
-				} catch (NumberFormatException e) {
-				}
-			}
-		}
-		// No attempt is made to constrain the bounds. The default
-		// constraining behavior in Window will be used.
-		return result;
-	}
-
-	/**
-	 * Return the default size to use for the shell. This default size is used
-	 * if the dialog does not have any persisted size to restore. The default
-	 * implementation returns the preferred size of the shell. Subclasses should
-	 * override this method when an alternate default size is desired, rather
-	 * than overriding {@link #getInitialSize()}.
-	 * 
-	 * @return the initial size of the shell
-	 * 
-	 * @see #getPersistSize()
-	 * @since 3.4
-	 */
-	protected Point getDefaultSize() {
-		return super.getInitialSize();
-	}
-
-	/**
-	 * Returns the default location to use for the shell. This default location
-	 * is used if the dialog does not have any persisted location to restore.
-	 * The default implementation uses the location computed by
-	 * {@link org.eclipse.jface.window.Window#getInitialLocation(Point)}.
-	 * Subclasses should override this method when an alternate default location
-	 * is desired, rather than overriding {@link #getInitialLocation(Point)}.
-	 * 
-	 * @param initialSize
-	 *            the initial size of the shell, as returned by
-	 *            <code>getInitialSize</code>.
-	 * @return the initial location of the shell
-	 * 
-	 * @see #getPersistLocation()
-	 * @since 3.4
-	 */
-	protected Point getDefaultLocation(Point initialSize) {
-		return super.getInitialLocation(initialSize);
-	}
-
-	/**
-	 * Adjust the bounds of the popup as necessary prior to opening the dialog.
-	 * Default is to do nothing, which honors any bounds set directly by clients
-	 * or those that have been saved in the dialog settings. Subclasses should
-	 * override this method when there are bounds computations that must be
-	 * checked each time the dialog is opened.
-	 */
-	protected void adjustBounds() {
-	}
-
-	/**
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#getInitialLocation(org.eclipse.swt.graphics.Point)
-	 */
-	protected Point getInitialLocation(Point initialSize) {
-		Point result = getDefaultLocation(initialSize);
-		if (persistLocation) {
-			IDialogSettings settings = getDialogSettings();
-			if (settings != null) {
-				try {
-					int x = settings.getInt(getClass().getName()
-							+ DIALOG_ORIGIN_X);
-					int y = settings.getInt(getClass().getName()
-							+ DIALOG_ORIGIN_Y);
-					result = new Point(x, y);
-					// The coordinates were stored relative to the parent shell.
-					// Convert to display coordinates.
-					Shell parent = getParentShell();
-					if (parent != null) {
-						Point parentLocation = parent.getLocation();
-						result.x += parentLocation.x;
-						result.y += parentLocation.y;
-					}
-				} catch (NumberFormatException e) {
-				}
-			}
-		}
-		// No attempt is made to constrain the bounds. The default
-		// constraining behavior in Window will be used.
-		return result;
-	}
-
-	/**
-	 * Apply any desired color to the specified composite and its children.
-	 * 
-	 * @param composite
-	 *            the contents composite
-	 */
-	private void applyColors(Composite composite) {
-		// The getForeground() and getBackground() methods
-		// should not answer null, but IColorProvider clients
-		// are accustomed to null meaning use the default, so we guard
-		// against this assumption.
-		Color color = getForeground();
-		if (color == null)
-			color = getDefaultForeground();
-		applyForegroundColor(color, composite, getForegroundColorExclusions());
-		color = getBackground();
-		if (color == null)
-			color = getDefaultBackground();
-		applyBackgroundColor(color, composite, getBackgroundColorExclusions());
-	}
-
-	/**
-	 * Get the foreground color that should be used for this popup. Subclasses
-	 * may override.
-	 * 
-	 * @return the foreground color to be used. Should not be <code>null</code>.
-	 * 
-	 * @since 3.4
-	 * 
-	 * @see #getForegroundColorExclusions()
-	 */
-	protected Color getForeground() {
-		return getDefaultForeground();
-	}
-
-	/**
-	 * Get the background color that should be used for this popup. Subclasses
-	 * may override.
-	 * 
-	 * @return the background color to be used. Should not be <code>null</code>.
-	 * 
-	 * @since 3.4
-	 * 
-	 * @see #getBackgroundColorExclusions()
-	 */
-	protected Color getBackground() {
-		return getDefaultBackground();
-	}
-
-	/**
-	 * Return the default foreground color used for popup dialogs.
-	 * 
-	 * @return the default foreground color.
-	 */
-	private Color getDefaultForeground() {
-		return getShell().getDisplay()
-				.getSystemColor(SWT.COLOR_INFO_FOREGROUND);
-	}
-
-	/**
-	 * Return the default background color used for popup dialogs.
-	 * 
-	 * @return the default background color
-	 */
-	private Color getDefaultBackground() {
-		return getShell().getDisplay()
-				.getSystemColor(SWT.COLOR_INFO_BACKGROUND);
-	}
-
-	/**
-	 * Apply any desired fonts to the specified composite and its children.
-	 * 
-	 * @param composite
-	 *            the contents composite
-	 */
-	private void applyFonts(Composite composite) {
-		Dialog.applyDialogFont(composite);
-
-		if (titleLabel != null) {
-			Font font = titleLabel.getFont();
-			FontData[] fontDatas = font.getFontData();
-			for (int i = 0; i < fontDatas.length; i++) {
-				fontDatas[i].setStyle(SWT.BOLD);
-			}
-			titleFont = new Font(titleLabel.getDisplay(), fontDatas);
-			titleLabel.setFont(titleFont);
-		}
-
-		if (infoLabel != null) {
-			Font font = infoLabel.getFont();
-			FontData[] fontDatas = font.getFontData();
-			for (int i = 0; i < fontDatas.length; i++) {
-				fontDatas[i].setHeight(fontDatas[i].getHeight() * 9 / 10);
-			}
-			infoFont = new Font(infoLabel.getDisplay(), fontDatas);
-			infoLabel.setFont(infoFont);
-		}
-	}
-
-	/**
-	 * Set the specified foreground color for the specified control and all of
-	 * its children, except for those specified in the list of exclusions.
-	 * 
-	 * @param color
-	 *            the color to use as the foreground color
-	 * @param control
-	 *            the control whose color is to be changed
-	 * @param exclusions
-	 *            a list of controls who are to be excluded from getting their
-	 *            color assigned
-	 */
-	private void applyForegroundColor(Color color, Control control,
-			List exclusions) {
-		if (!exclusions.contains(control)) {
-			control.setForeground(color);
-		}
-		if (control instanceof Composite) {
-			Control[] children = ((Composite) control).getChildren();
-			for (int i = 0; i < children.length; i++) {
-				applyForegroundColor(color, children[i], exclusions);
-			}
-		}
-	}
-
-	/**
-	 * Set the specified background color for the specified control and all of
-	 * its children, except for those specified in the list of exclusions.
-	 * 
-	 * @param color
-	 *            the color to use as the background color
-	 * @param control
-	 *            the control whose color is to be changed
-	 * @param exclusions
-	 *            a list of controls who are to be excluded from getting their
-	 *            color assigned
-	 */
-	private void applyBackgroundColor(Color color, Control control,
-			List exclusions) {
-		if (!exclusions.contains(control)) {
-			control.setBackground(color);
-		}
-		if (control instanceof Composite) {
-			Control[] children = ((Composite) control).getChildren();
-			for (int i = 0; i < children.length; i++) {
-				applyBackgroundColor(color, children[i], exclusions);
-			}
-		}
-	}
-
-	/**
-	 * Set the specified foreground color for the specified control and all of
-	 * its children. Subclasses may override this method, but typically do not.
-	 * If a subclass wishes to exclude a particular control in its contents from
-	 * getting the specified foreground color, it may instead override
-	 * {@link #getForegroundColorExclusions()}.
-	 * 
-	 * @param color
-	 *            the color to use as the foreground color
-	 * @param control
-	 *            the control whose color is to be changed
-	 * @see PopupDialog#getForegroundColorExclusions()
-	 */
-	protected void applyForegroundColor(Color color, Control control) {
-		applyForegroundColor(color, control, getForegroundColorExclusions());
-	}
-
-	/**
-	 * Set the specified background color for the specified control and all of
-	 * its children. Subclasses may override this method, but typically do not.
-	 * If a subclass wishes to exclude a particular control in its contents from
-	 * getting the specified background color, it may instead override
-	 * {@link #getBackgroundColorExclusions()}
-	 * 
-	 * @param color
-	 *            the color to use as the background color
-	 * @param control
-	 *            the control whose color is to be changed
-	 * @see PopupDialog#getBackgroundColorExclusions()
-	 */
-	protected void applyBackgroundColor(Color color, Control control) {
-		applyBackgroundColor(color, control, getBackgroundColorExclusions());
-	}
-
-	/**
-	 * Return a list of controls which should never have their foreground color
-	 * reset. Subclasses may extend this method, but should always call
-	 * <code>super.getForegroundColorExclusions</code> to aggregate the list.
-	 * 
-	 * 
-	 * @return the List of controls
-	 */
-	protected List getForegroundColorExclusions() {
-		List list = new ArrayList(3);
-		if (infoLabel != null) {
-			list.add(infoLabel);
-		}
-		if (titleSeparator != null) {
-			list.add(titleSeparator);
-		}
-		if (infoSeparator != null) {
-			list.add(infoSeparator);
-		}
-		return list;
-	}
-
-	/**
-	 * Return a list of controls which should never have their background color
-	 * reset. Subclasses may extend this method, but should always call
-	 * <code>super.getBackgroundColorExclusions</code> to aggregate the list.
-	 * 
-	 * @return the List of controls
-	 */
-	protected List getBackgroundColorExclusions() {
-		List list = new ArrayList(2);
-		if (titleSeparator != null) {
-			list.add(titleSeparator);
-		}
-		if (infoSeparator != null) {
-			list.add(infoSeparator);
-		}
-		return list;
-	}
-
-	/**
-	 * Initialize any state related to the widgetry that should be set up each
-	 * time widgets are created.
-	 */
-	private void initializeWidgetState() {
-		menuManager = null;
-		dialogArea = null;
-		titleLabel = null;
-		titleSeparator = null;
-		infoSeparator = null;
-		infoLabel = null;
-		toolBar = null;
-
-		// If the menu item for persisting bounds is displayed, use the stored
-		// value to determine whether any persisted bounds should be honored at
-		// all.
-		if (showDialogMenu && showPersistActions) {
-			IDialogSettings settings = getDialogSettings();
-			if (settings != null) {
-				String key = getClass().getName() + DIALOG_USE_PERSISTED_SIZE;
-				if (settings.get(key) != null || !isUsing34API)
-					persistSize = settings.getBoolean(key);
-				key = getClass().getName() + DIALOG_USE_PERSISTED_LOCATION;
-				if (settings.get(key) != null || !isUsing34API)
-					persistLocation = settings.getBoolean(key);
-			}
-		}
-	}
-
-	private void migrateBoundsSetting() {
-		IDialogSettings settings = getDialogSettings();
-		if (settings == null)
-			return;
-
-		final String className = getClass().getName();
-
-		String key = className + DIALOG_USE_PERSISTED_BOUNDS;
-		String value = settings.get(key);
-		if (value == null || DIALOG_VALUE_MIGRATED_TO_34.equals(value))
-			return;
-
-		boolean storeBounds = settings.getBoolean(key);
-		settings.put(className + DIALOG_USE_PERSISTED_LOCATION, storeBounds);
-		settings.put(className + DIALOG_USE_PERSISTED_SIZE, storeBounds);
-		settings.put(key, DIALOG_VALUE_MIGRATED_TO_34);
-	}
-
-	/**
-	 * The dialog is being disposed. Dispose of any resources allocated.
-	 * 
-	 */
-	private void handleDispose() {
-		if (infoFont != null && !infoFont.isDisposed()) {
-			infoFont.dispose();
-		}
-		infoFont = null;
-		if (titleFont != null && !titleFont.isDisposed()) {
-			titleFont.dispose();
-		}
-		titleFont = null;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ProgressIndicator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ProgressIndicator.java
deleted file mode 100644
index a006a4b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ProgressIndicator.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Mark Siegel <mark.siegel@businessobjects.com> - Fix for Bug 184533
- *     			[Progress] ProgressIndicator uses hardcoded style for ProgressBar
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StackLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.ProgressBar;
-
-/**
- * A control for showing progress feedback for a long running operation. This
- * control supports both determinate and indeterminate SWT progress bars. For
- * indeterminate progress, we don't have to know the total amount of work in
- * advance and no <code>worked</code> method needs to be called.
- */
-public class ProgressIndicator extends Composite {
-    private final static int PROGRESS_MAX = 1000; // value to use for max in
-
-    // progress bar
-    private boolean animated = true;
-
-    private StackLayout layout;
-
-    private ProgressBar determinateProgressBar;
-
-    private ProgressBar indeterminateProgressBar;
-
-    private double totalWork;
-
-    private double sumWorked;
-
-    /**
-     * Create a ProgressIndicator as a child under the given parent.
-     * 
-     * @param parent
-     *            The widgets parent
-     */
-    public ProgressIndicator(Composite parent) {
-        this(parent, SWT.NONE);      
-    }
-    
-    /**
-     * Create a ProgressIndicator as a child under the given parent.
-     * 
-     * @param parent
-     *            The widgets parent
-     * @param style the SWT style constants for progress monitors created 
-     * 	by the receiver.
-     * @since 3.4
-     */
-    public ProgressIndicator(Composite parent, int style) {
-    	super(parent, SWT.NULL);
-    	
-    	 // Enforce horizontal only if vertical isn't set
-        if ((style & SWT.VERTICAL) == 0)
-            style |= SWT.HORIZONTAL;
-
-        determinateProgressBar = new ProgressBar(this, style);
-        indeterminateProgressBar = new ProgressBar(this, style
-                | SWT.INDETERMINATE);
-        layout = new StackLayout();
-        setLayout(layout);
-    }
-
-    /**
-     * Initialize the progress bar to be animated.
-     */
-    public void beginAnimatedTask() {
-        done();
-        layout.topControl = indeterminateProgressBar;
-        layout();
-        animated = true;
-    }
-
-    /**
-     * Initialize the progress bar.
-     * 
-     * @param max
-     *            The maximum value.
-     */
-    public void beginTask(int max) {
-        done();
-        this.totalWork = max;
-        this.sumWorked = 0;
-        determinateProgressBar.setMinimum(0);
-        determinateProgressBar.setMaximum(PROGRESS_MAX);
-        determinateProgressBar.setSelection(0);
-        layout.topControl = determinateProgressBar;
-        layout();
-        animated = false;
-    }
-
-    /**
-     * Progress is done.
-     */
-    public void done() {
-        if (!animated) {
-            determinateProgressBar.setMinimum(0);
-            determinateProgressBar.setMaximum(0);
-            determinateProgressBar.setSelection(0);
-        }
-        layout.topControl = null;
-        layout();
-    }
-
-    /**
-     * Moves the progress indicator to the end.
-     */
-    public void sendRemainingWork() {
-        worked(totalWork - sumWorked);
-    }
-
-    /**
-     * Moves the progress indicator by the given amount of work units
-     * @param work the amount of work to increment by.
-     */
-    public void worked(double work) {
-        if (work == 0 || animated) {
-            return;
-        }
-        sumWorked += work;
-        if (sumWorked > totalWork) {
-            sumWorked = totalWork;
-        }
-        if (sumWorked < 0) {
-            sumWorked = 0;
-        }
-        int value = (int) (sumWorked / totalWork * PROGRESS_MAX);
-        if (determinateProgressBar.getSelection() < value) {
-            determinateProgressBar.setSelection(value);
-        }
-    }
-
-    /**
-	 * Show the receiver as showing an error.
-	 * @since 3.4
-	 */
-	public void showError() {
-		determinateProgressBar.setState(SWT.ERROR);
-		indeterminateProgressBar.setState(SWT.ERROR);
-	}
-	
-	/**
-	 * Show the receiver as being paused.
-	 * @since 3.4
-	 */
-	public void showPaused() {
-		determinateProgressBar.setState(SWT.PAUSED);
-		indeterminateProgressBar.setState(SWT.PAUSED);
-	}
-
-	/**
-	 * Reset the progress bar to it's normal style.
-	 * @since 3.4
-	 */
-	public void showNormal() {
-		determinateProgressBar.setState(SWT.NORMAL);
-		indeterminateProgressBar.setState(SWT.NORMAL);
-		
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ProgressMonitorDialog.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ProgressMonitorDialog.java
deleted file mode 100644
index 465bd9f..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/ProgressMonitorDialog.java
+++ /dev/null
@@ -1,685 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IProgressMonitorWithBlocking;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.operation.ModalContext;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-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;
-
-/**
- * A modal dialog that displays progress during a long running operation.
- * <p>
- * This concrete dialog class can be instantiated as is, or further subclassed
- * as required.
- * </p>
- * <p>
- * Typical usage is:
- * 
- * <pre>
- *  
- *   
- *    try {
- *       IRunnableWithProgress op = ...;
- *       new ProgressMonitorDialog(activeShell).run(true, true, op);
- *    } catch (InvocationTargetException e) {
- *       // handle exception
- *    } catch (InterruptedException e) {
- *       // handle cancelation
- *    }
- *    
- *   
- * </pre>
- * 
- * </p>
- * <p>
- * Note that the ProgressMonitorDialog is not intended to be used with multiple
- * runnables - this dialog should be discarded after completion of one
- * IRunnableWithProgress and a new one instantiated for use by a second or
- * sebsequent IRunnableWithProgress to ensure proper initialization.
- * </p>
- * <p>
- * Note that not forking the process will result in it running in the UI which
- * may starve the UI. The most obvious symptom of this problem is non
- * responsiveness of the cancel button. If you are running within the UI Thread
- * you should do the bulk of your work in another Thread to prevent starvation.
- * It is recommended that fork is set to true in most cases.
- * </p>
- */
-public class ProgressMonitorDialog extends IconAndMessageDialog implements
-		IRunnableContext {
-	/**
-	 * Name to use for task when normal task name is empty string.
-	 */
-	private static String DEFAULT_TASKNAME = JFaceResources
-			.getString("ProgressMonitorDialog.message"); //$NON-NLS-1$
-
-	/**
-	 * Constants for label and monitor size
-	 */
-	private static int LABEL_DLUS = 21;
-
-	private static int BAR_DLUS = 9;
-
-	/**
-	 * The progress indicator control.
-	 */
-	protected ProgressIndicator progressIndicator;
-
-	/**
-	 * The label control for the task. Kept for backwards compatibility.
-	 */
-	protected Label taskLabel;
-
-	/**
-	 * The label control for the subtask.
-	 */
-	protected Label subTaskLabel;
-
-	/**
-	 * The Cancel button control.
-	 */
-	protected Button cancel;
-
-	/**
-	 * Indicates whether the Cancel button is to be shown.
-	 */
-	protected boolean operationCancelableState = false;
-
-	/**
-	 * Indicates whether the Cancel button is to be enabled.
-	 */
-	protected boolean enableCancelButton;
-
-	/**
-	 * The progress monitor.
-	 */
-	private ProgressMonitor progressMonitor = new ProgressMonitor();
-
-	/**
-	 * The name of the current task (used by ProgressMonitor).
-	 */
-	private String task;
-
-	/**
-	 * The nesting depth of currently running runnables.
-	 */
-	private int nestingDepth;
-
-	/**
-	 * The cursor used in the cancel button;
-	 */
-	protected Cursor arrowCursor;
-
-	/**
-	 * The cursor used in the shell;
-	 */
-	private Cursor waitCursor;
-
-	/**
-	 * Flag indicating whether to open or merely create the dialog before run.
-	 */
-	private boolean openOnRun = true;
-
-	/**
-	 * Internal progress monitor implementation.
-	 */
-	private class ProgressMonitor implements IProgressMonitorWithBlocking {
-		private String fSubTask = "";//$NON-NLS-1$
-
-		private boolean fIsCanceled;
-
-		/**
-		 * is the process forked
-		 */
-		protected boolean forked = false;
-
-		/**
-		 * is locked
-		 */
-		protected boolean locked = false;
-
-		public void beginTask(String name, int totalWork) {
-			if (progressIndicator.isDisposed()) {
-				return;
-			}
-			if (name == null) {
-				task = "";//$NON-NLS-1$
-			} else {
-				task = name;
-			}
-			String s = task;
-			if (s.length() <= 0) {
-				s = DEFAULT_TASKNAME;
-			}
-			setMessage(s, false);
-			if (!forked) {
-				update();
-			}
-			if (totalWork == UNKNOWN) {
-				progressIndicator.beginAnimatedTask();
-			} else {
-				progressIndicator.beginTask(totalWork);
-			}
-		}
-
-		public void done() {
-			if (!progressIndicator.isDisposed()) {
-				progressIndicator.sendRemainingWork();
-				progressIndicator.done();
-			}
-		}
-
-		public void setTaskName(String name) {
-			if (name == null) {
-				task = "";//$NON-NLS-1$
-			} else {
-				task = name;
-			}
-			String s = task;
-			if (s.length() <= 0) {
-				s = DEFAULT_TASKNAME;
-			}
-			setMessage(s, false);
-			if (!forked) {
-				update();
-			}
-		}
-
-		public boolean isCanceled() {
-			return fIsCanceled;
-		}
-
-		public void setCanceled(boolean b) {
-			fIsCanceled = b;
-			if (locked) {
-				clearBlocked();
-			}
-		}
-
-		public void subTask(String name) {
-			if (subTaskLabel.isDisposed()) {
-				return;
-			}
-			if (name == null) {
-				fSubTask = "";//$NON-NLS-1$
-			} else {
-				fSubTask = name;
-			}
-			subTaskLabel.setText(shortenText(fSubTask, subTaskLabel));
-			if (!forked) {
-				subTaskLabel.update();
-			}
-		}
-
-		public void worked(int work) {
-			internalWorked(work);
-		}
-
-		public void internalWorked(double work) {
-			if (!progressIndicator.isDisposed()) {
-				progressIndicator.worked(work);
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.runtime.IProgressMonitorWithBlocking#clearBlocked()
-		 */
-		public void clearBlocked() {
-			if (getShell() == null || getShell().isDisposed())
-				return;
-			locked = false;
-			updateForClearBlocked();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.runtime.IProgressMonitorWithBlocking#setBlocked(org.eclipse.core.runtime.IStatus)
-		 */
-		public void setBlocked(IStatus reason) {
-			if (getShell() == null || getShell().isDisposed())
-				return;
-			locked = true;
-			updateForSetBlocked(reason);
-		}
-	}
-
-	/**
-	 * Clear blocked state from the receiver.
-	 */
-	protected void updateForClearBlocked() {
-		progressIndicator.showNormal();
-		setMessage(task, true);
-		imageLabel.setImage(getImage());
-		
-	}
-
-	/**
-	 * Set blocked state from the receiver.
-	 * 
-	 * @param reason
-	 *            IStatus that gives the details
-	 */
-	protected void updateForSetBlocked(IStatus reason) {
-		progressIndicator.showPaused();
-		setMessage(reason.getMessage(), true);
-		imageLabel.setImage(getImage());
-		
-	}
-
-	/**
-	 * Creates a progress monitor dialog under the given shell. The dialog has a
-	 * standard title and no image. <code>open</code> is non-blocking.
-	 * 
-	 * @param parent
-	 *            the parent shell, or <code>null</code> to create a top-level
-	 *            shell
-	 */
-	public ProgressMonitorDialog(Shell parent) {
-		super(parent);
-		// no close button on the shell style
-		if (isResizable()) {
-			setShellStyle(getDefaultOrientation() | SWT.BORDER | SWT.TITLE
-					| SWT.APPLICATION_MODAL | SWT.RESIZE | SWT.MAX);
-		} else {
-			setShellStyle(getDefaultOrientation() | SWT.BORDER | SWT.TITLE
-					| SWT.APPLICATION_MODAL);
-		}
-		setBlockOnOpen(false);
-	}
-
-	/**
-	 * Enables the cancel button (asynchronously).
-	 * 
-	 * @param b
-	 *            The state to set the button to.
-	 */
-	private void asyncSetOperationCancelButtonEnabled(final boolean b) {
-		if (getShell() != null) {
-			getShell().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					setOperationCancelButtonEnabled(b);
-				}
-			});
-		}
-	}
-
-	/**
-	 * The cancel button has been pressed.
-	 * 
-	 * @since 3.0
-	 */
-	protected void cancelPressed() {
-		// NOTE: this was previously done from a listener installed on the
-		// cancel button. On GTK, the listener installed by
-		// Dialog.createButton is called first and this was throwing an
-		// exception because the cancel button was already disposed
-		cancel.setEnabled(false);
-		progressMonitor.setCanceled(true);
-		super.cancelPressed();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Window.
-	 */
-	/**
-	 * The <code>ProgressMonitorDialog</code> implementation of this method
-	 * only closes the dialog if there are no currently running runnables.
-	 */
-	public boolean close() {
-		if (getNestingDepth() <= 0) {
-			clearCursors();
-			return super.close();
-		}
-		return false;
-	}
-
-	/**
-	 * Clear the cursors in the dialog.
-	 * 
-	 * @since 3.0
-	 */
-	protected void clearCursors() {
-		if (cancel != null && !cancel.isDisposed()) {
-			cancel.setCursor(null);
-		}
-		Shell shell = getShell();
-		if (shell != null && !shell.isDisposed()) {
-			shell.setCursor(null);
-		}
-		if (arrowCursor != null) {
-			arrowCursor.dispose();
-		}
-		if (waitCursor != null) {
-			waitCursor.dispose();
-		}
-		arrowCursor = null;
-		waitCursor = null;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in Window.
-	 */
-	protected void configureShell(final Shell shell) {
-		super.configureShell(shell);
-		shell.setText(JFaceResources.getString("ProgressMonitorDialog.title")); //$NON-NLS-1$
-		if (waitCursor == null) {
-			waitCursor = new Cursor(shell.getDisplay(), SWT.CURSOR_WAIT);
-		}
-		shell.setCursor(waitCursor);
-		// Add a listener to set the message properly when the dialog becomes
-		// visible
-		shell.addListener(SWT.Show, new Listener() {
-			public void handleEvent(Event event) {
-				// We need to async the message update since the Show precedes
-				// visibility
-				shell.getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						setMessage(message, true);
-					}
-				});
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		// cancel button
-		createCancelButton(parent);
-	}
-
-	/**
-	 * Creates the cancel button.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @since 3.0
-	 */
-	protected void createCancelButton(Composite parent) {
-		cancel = createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, true);
-		if (arrowCursor == null) {
-			arrowCursor = new Cursor(cancel.getDisplay(), SWT.CURSOR_ARROW);
-		}
-		cancel.setCursor(arrowCursor);
-		setOperationCancelButtonEnabled(enableCancelButton);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		setMessage(DEFAULT_TASKNAME, false);
-		createMessageArea(parent);
-		// Only set for backwards compatibility
-		taskLabel = messageLabel;
-		// progress indicator
-		progressIndicator = new ProgressIndicator(parent);
-		GridData gd = new GridData();
-		gd.heightHint = convertVerticalDLUsToPixels(BAR_DLUS);
-		gd.horizontalAlignment = GridData.FILL;
-		gd.grabExcessHorizontalSpace = true;
-		gd.horizontalSpan = 2;
-		progressIndicator.setLayoutData(gd);
-		// label showing current task
-		subTaskLabel = new Label(parent, SWT.LEFT | SWT.WRAP);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.heightHint = convertVerticalDLUsToPixels(LABEL_DLUS);
-		gd.horizontalSpan = 2;
-		subTaskLabel.setLayoutData(gd);
-		subTaskLabel.setFont(parent.getFont());
-		return parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point calculatedSize = super.getInitialSize();
-		if (calculatedSize.x < 450) {
-			calculatedSize.x = 450;
-		}
-		return calculatedSize;
-	}
-
-	/**
-	 * Returns the progress monitor to use for operations run in this progress
-	 * dialog.
-	 * 
-	 * @return the progress monitor
-	 */
-	public IProgressMonitor getProgressMonitor() {
-		return progressMonitor;
-	}
-
-	/**
-	 * This implementation of IRunnableContext#run(boolean, boolean,
-	 * IRunnableWithProgress) runs the given <code>IRunnableWithProgress</code>
-	 * using the progress monitor for this progress dialog and blocks until the
-	 * runnable has been run, regardless of the value of <code>fork</code>.
-	 * The dialog is opened before the runnable is run, and closed after it
-	 * completes. It is recommended that <code>fork</code> is set to true in
-	 * most cases. If <code>fork</code> is set to <code>false</code>, the
-	 * runnable will run in the UI thread and it is the runnable's
-	 * responsibility to call <code>Display.readAndDispatch()</code> to ensure
-	 * UI responsiveness.
-	 */
-	public void run(boolean fork, boolean cancelable,
-			IRunnableWithProgress runnable) throws InvocationTargetException,
-			InterruptedException {
-		setCancelable(cancelable);
-		try {
-			aboutToRun();
-			// Let the progress monitor know if they need to update in UI Thread
-			progressMonitor.forked = fork;
-			ModalContext.run(runnable, fork, getProgressMonitor(), getShell()
-					.getDisplay());
-		} finally {
-			finishedRun();
-		}
-	}
-
-	/**
-	 * Returns whether the dialog should be opened before the operation is run.
-	 * Defaults to <code>true</code>
-	 * 
-	 * @return <code>true</code> to open the dialog before run,
-	 *         <code>false</code> to only create the dialog, but not open it
-	 * @since 3.0
-	 */
-	public boolean getOpenOnRun() {
-		return openOnRun;
-	}
-
-	/**
-	 * Sets whether the dialog should be opened before the operation is run.
-	 * NOTE: Setting this to false and not forking a process may starve any
-	 * asyncExec that tries to open the dialog later.
-	 * 
-	 * @param openOnRun
-	 *            <code>true</code> to open the dialog before run,
-	 *            <code>false</code> to only create the dialog, but not open
-	 *            it
-	 * @since 3.0
-	 */
-	public void setOpenOnRun(boolean openOnRun) {
-		this.openOnRun = openOnRun;
-	}
-
-	/**
-	 * Returns the nesting depth of running operations.
-	 * 
-	 * @return the nesting depth of running operations
-	 * @since 3.0
-	 */
-	protected int getNestingDepth() {
-		return nestingDepth;
-	}
-
-	/**
-	 * Increments the nesting depth of running operations.
-	 * 
-	 * @since 3.0
-	 */
-	protected void incrementNestingDepth() {
-		nestingDepth++;
-	}
-
-	/**
-	 * Decrements the nesting depth of running operations.
-	 * 
-	 * @since 3.0
-	 * 
-	 */
-	protected void decrementNestingDepth() {
-		nestingDepth--;
-	}
-
-	/**
-	 * Called just before the operation is run. Default behaviour is to open or
-	 * create the dialog, based on the setting of <code>getOpenOnRun</code>,
-	 * and increment the nesting depth.
-	 * 
-	 * @since 3.0
-	 */
-	protected void aboutToRun() {
-		if (getOpenOnRun()) {
-			open();
-		} else {
-			create();
-		}
-		incrementNestingDepth();
-	}
-
-	/**
-	 * Called just after the operation is run. Default behaviour is to decrement
-	 * the nesting depth, and close the dialog.
-	 * 
-	 * @since 3.0
-	 */
-	protected void finishedRun() {
-		decrementNestingDepth();
-		close();
-	}
-
-	/**
-	 * Sets whether the progress dialog is cancelable or not.
-	 * 
-	 * @param cancelable
-	 *            <code>true</code> if the end user can cancel this progress
-	 *            dialog, and <code>false</code> if it cannot be canceled
-	 */
-	public void setCancelable(boolean cancelable) {
-		if (cancel == null) {
-			enableCancelButton = cancelable;
-		} else {
-			asyncSetOperationCancelButtonEnabled(cancelable);
-		}
-	}
-
-	/**
-	 * Helper to enable/disable Cancel button for this dialog.
-	 * 
-	 * @param b
-	 *            <code>true</code> to enable the cancel button, and
-	 *            <code>false</code> to disable it
-	 * @since 3.0
-	 */
-	protected void setOperationCancelButtonEnabled(boolean b) {
-		operationCancelableState = b;
-		cancel.setEnabled(b);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IconAndMessageDialog#getImage()
-	 */
-	protected Image getImage() {
-		return getInfoImage();
-	}
-
-	/**
-	 * Set the message in the message label.
-	 * 
-	 * @param messageString
-	 *            The string for the new message.
-	 * @param force
-	 *            If force is true then always set the message text.
-	 */
-	private void setMessage(String messageString, boolean force) {
-		// must not set null text in a label
-		message = messageString == null ? "" : messageString; //$NON-NLS-1$
-		if (messageLabel == null || messageLabel.isDisposed()) {
-			return;
-		}
-		if (force || messageLabel.isVisible()) {
-			messageLabel.setToolTipText(message);
-			messageLabel.setText(shortenText(message, messageLabel));
-		}
-	}
-
-	/**
-	 * Update the message label. Required if the monitor is forked.
-	 */
-	private void update() {
-		if (messageLabel == null || messageLabel.isDisposed()) {
-			return;
-		}
-		messageLabel.update();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#open()
-	 */
-	public int open() {
-		// Check to be sure it is not already done. If it is just return OK.
-		if (!getOpenOnRun()) {
-			if (getNestingDepth() == 0) {
-				return OK;
-			}
-		}
-		int result = super.open();
-		// update message label just in case beginTask() has been invoked
-		// already
-		if (task == null || task.length() == 0)
-			setMessage(DEFAULT_TASKNAME, true);
-		else
-			setMessage(task, true);
-		return result;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/StatusDialog.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/StatusDialog.java
deleted file mode 100644
index 7c7f436..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/StatusDialog.java
+++ /dev/null
@@ -1,298 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.JFaceColors;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.graphics.Color;
-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.Shell;
-
-/**
- * An abstract base class for dialogs with a status bar and OK/CANCEL buttons.
- * The status message is specified in an IStatus which can be of severity ERROR,
- * WARNING, INFO or OK. The OK button is enabled or disabled depending on the
- * status.
- * 
- * @since 3.1
- */
-public abstract class StatusDialog extends TrayDialog {
-
-	private Button fOkButton;
-
-	private MessageLine fStatusLine;
-
-	private IStatus fLastStatus;
-
-	private String fTitle;
-
-	private Image fImage;
-
-	private boolean fStatusLineAboveButtons = true;
-
-	/**
-	 * A message line displaying a status.
-	 */
-	private class MessageLine extends CLabel {
-
-		private Color fNormalMsgAreaBackground;
-
-		/**
-		 * Creates a new message line as a child of the given parent.
-		 * 
-		 * @param parent
-		 */
-		public MessageLine(Composite parent) {
-			this(parent, SWT.LEFT);
-		}
-
-		/**
-		 * Creates a new message line as a child of the parent and with the
-		 * given SWT stylebits.
-		 * 
-		 * @param parent
-		 * @param style
-		 */
-		public MessageLine(Composite parent, int style) {
-			super(parent, style);
-			fNormalMsgAreaBackground = getBackground();
-		}
-
-		/**
-		 * Find an image assocated with the status.
-		 * 
-		 * @param status
-		 * @return Image
-		 */
-		private Image findImage(IStatus status) {
-			if (status.isOK()) {
-				return null;
-			} else if (status.matches(IStatus.ERROR)) {
-				return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_ERROR);
-			} else if (status.matches(IStatus.WARNING)) {
-				return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING);
-			} else if (status.matches(IStatus.INFO)) {
-				return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_INFO);
-			}
-			return null;
-		}
-
-		/**
-		 * Sets the message and image to the given status.
-		 * 
-		 * @param status
-		 *            IStatus or <code>null</code>. <code>null</code> will
-		 *            set the empty text and no image.
-		 */
-		public void setErrorStatus(IStatus status) {
-			if (status != null && !status.isOK()) {
-				String message = status.getMessage();
-				if (message != null && message.length() > 0) {
-					setText(message);
-					// unqualified call of setImage is too ambiguous for
-					// Foundation 1.0 compiler
-					// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=140576
-					MessageLine.this.setImage(findImage(status));
-					setBackground(JFaceColors.getErrorBackground(getDisplay()));
-					return;
-				}
-			}
-			setText(""); //$NON-NLS-1$	
-			// unqualified call of setImage is too ambiguous for Foundation 1.0
-			// compiler
-			// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=140576
-			MessageLine.this.setImage(null);
-			setBackground(fNormalMsgAreaBackground);
-		}
-	}
-
-	/**
-	 * Creates an instance of a status dialog.
-	 * 
-	 * @param parent
-	 *            the parent Shell of the dialog
-	 */
-	public StatusDialog(Shell parent) {
-		super(parent);
-		fLastStatus = new Status(IStatus.OK, Policy.JFACE, IStatus.OK,
-				Util.ZERO_LENGTH_STRING, null);
-	}
-
-	/**
-	 * Specifies whether status line appears to the left of the buttons
-	 * (default) or above them.
-	 * 
-	 * @param aboveButtons
-	 *            if <code>true</code> status line is placed above buttons; if
-	 *            <code>false</code> to the right
-	 */
-	public void setStatusLineAboveButtons(boolean aboveButtons) {
-		fStatusLineAboveButtons = aboveButtons;
-	}
-
-	/**
-	 * Update the dialog's status line to reflect the given status. It is safe
-	 * to call this method before the dialog has been opened.
-	 * 
-	 * @param status
-	 *            the status to set
-	 */
-	protected void updateStatus(IStatus status) {
-		fLastStatus = status;
-		if (fStatusLine != null && !fStatusLine.isDisposed()) {
-			updateButtonsEnableState(status);
-			fStatusLine.setErrorStatus(status);
-		}
-	}
-
-	/**
-	 * Returns the last status.
-	 * 
-	 * @return IStatus
-	 */
-	public IStatus getStatus() {
-		return fLastStatus;
-	}
-
-	/**
-	 * Updates the status of the ok button to reflect the given status.
-	 * Subclasses may override this method to update additional buttons.
-	 * 
-	 * @param status
-	 *            the status.
-	 */
-	protected void updateButtonsEnableState(IStatus status) {
-		if (fOkButton != null && !fOkButton.isDisposed()) {
-			fOkButton.setEnabled(!status.matches(IStatus.ERROR));
-		}
-	}
-
-	/*
-	 * @see Window#create(Shell)
-	 */
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		if (fTitle != null) {
-			shell.setText(fTitle);
-		}
-	}
-
-	/*
-	 * @see Window#create()
-	 */
-	public void create() {
-		super.create();
-		if (fLastStatus != null) {
-			// policy: dialogs are not allowed to come up with an error message
-			if (fLastStatus.matches(IStatus.ERROR)) {
-				// remove the message
-				fLastStatus = new Status(IStatus.ERROR,
-						fLastStatus.getPlugin(), fLastStatus.getCode(),
-						"", fLastStatus.getException()); //$NON-NLS-1$
-			}
-			updateStatus(fLastStatus);
-		}
-	}
-
-	/*
-	 * @see Dialog#createButtonsForButtonBar(Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		fOkButton = createButton(parent, IDialogConstants.OK_ID,
-				IDialogConstants.OK_LABEL, true);
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-	}
-
-	/*
-	 * @see Dialog#createButtonBar(Composite)
-	 */
-	protected Control createButtonBar(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-
-		if (fStatusLineAboveButtons) {
-			layout.numColumns = 1;
-		} else {
-			layout.numColumns = 2;
-		}
-
-		layout.marginHeight = 0;
-		layout.marginLeft = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-		layout.marginWidth = 0;
-		composite.setLayout(layout);
-		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		if (!fStatusLineAboveButtons && isHelpAvailable()) {
-			createHelpControl(composite);
-		}
-		fStatusLine = new MessageLine(composite);
-		fStatusLine.setAlignment(SWT.LEFT);
-		GridData statusData = new GridData(GridData.FILL_HORIZONTAL);
-		fStatusLine.setErrorStatus(null);
-		if (fStatusLineAboveButtons && isHelpAvailable()) {
-			statusData.horizontalSpan = 2;
-			createHelpControl(composite);
-		}
-		fStatusLine.setLayoutData(statusData);
-		applyDialogFont(composite);
-
-		/*
-		 * Create the rest of the button bar, but tell it not to create a help
-		 * button (we've already created it).
-		 */
-		boolean helpAvailable = isHelpAvailable();
-		setHelpAvailable(false);
-		super.createButtonBar(composite);
-		setHelpAvailable(helpAvailable);
-		return composite;
-	}
-
-	/**
-	 * Sets the title for this dialog.
-	 * 
-	 * @param title
-	 *            the title.
-	 */
-	public void setTitle(String title) {
-		fTitle = title != null ? title : ""; //$NON-NLS-1$
-		Shell shell = getShell();
-		if ((shell != null) && !shell.isDisposed()) {
-			shell.setText(fTitle);
-		}
-	}
-
-	/**
-	 * Sets the image for this dialog.
-	 * 
-	 * @param image
-	 *            the image.
-	 */
-	public void setImage(Image image) {
-		fImage = image;
-		Shell shell = getShell();
-		if ((shell != null) && !shell.isDisposed()) {
-			shell.setImage(fImage);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/TitleAreaDialog.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/TitleAreaDialog.java
deleted file mode 100644
index 3ce8bbf..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/TitleAreaDialog.java
+++ /dev/null
@@ -1,624 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Konstantin Scheglov <scheglov_ke@nlmk.ru > - Fix for bug 41172
- *     [Dialogs] Bug with Image in TitleAreaDialog
- *     Sebastian Davids <sdavids@gmx.de> - Fix for bug 82064
- *     [Dialogs] TitleAreaDialog#setTitleImage cannot be called before open()
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.jface.resource.JFaceColors;
-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.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-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.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A dialog that has a title area for displaying a title and an image as well as
- * a common area for displaying a description, a message, or an error message.
- * <p>
- * This dialog class may be subclassed.
- */
-public class TitleAreaDialog extends TrayDialog {
-	/**
-	 * Image registry key for error message image.
-	 */
-	public static final String DLG_IMG_TITLE_ERROR = DLG_IMG_MESSAGE_ERROR;
-
-	/**
-	 * Image registry key for banner image (value
-	 * <code>"dialog_title_banner_image"</code>).
-	 */
-	public static final String DLG_IMG_TITLE_BANNER = "dialog_title_banner_image";//$NON-NLS-1$
-
-	/**
-	 * Message type constant used to display an info icon with the message.
-	 * 
-	 * @since 2.0
-	 * @deprecated
-	 */
-	public final static String INFO_MESSAGE = "INFO_MESSAGE"; //$NON-NLS-1$
-
-	/**
-	 * Message type constant used to display a warning icon with the message.
-	 * 
-	 * @since 2.0
-	 * @deprecated
-	 */
-	public final static String WARNING_MESSAGE = "WARNING_MESSAGE"; //$NON-NLS-1$
-
-	// Space between an image and a label
-	private static final int H_GAP_IMAGE = 5;
-
-	// Minimum dialog width (in dialog units)
-	private static final int MIN_DIALOG_WIDTH = 350;
-
-	// Minimum dialog height (in dialog units)
-	private static final int MIN_DIALOG_HEIGHT = 150;
-
-	private Label titleLabel;
-
-	private Label titleImageLabel;
-
-	private Label bottomFillerLabel;
-
-	private Label leftFillerLabel;
-
-	private RGB titleAreaRGB;
-
-	Color titleAreaColor;
-
-	private String message = ""; //$NON-NLS-1$
-
-	private String errorMessage;
-
-	private Text messageLabel;
-
-	private Composite workArea;
-
-	private Label messageImageLabel;
-
-	private Image messageImage;
-
-	private boolean showingError = false;
-
-	private boolean titleImageLargest = true;
-
-	private int messageLabelHeight;
-
-	private Image titleAreaImage;
-
-	/**
-	 * Instantiate a new title area dialog.
-	 * 
-	 * @param parentShell
-	 *            the parent SWT shell
-	 */
-	public TitleAreaDialog(Shell parentShell) {
-		super(parentShell);
-	}
-
-	/*
-	 * @see Dialog.createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		// create the overall composite
-		Composite contents = new Composite(parent, SWT.NONE);
-		contents.setLayoutData(new GridData(GridData.FILL_BOTH));
-		// initialize the dialog units
-		initializeDialogUnits(contents);
-		FormLayout layout = new FormLayout();
-		contents.setLayout(layout);
-		// Now create a work area for the rest of the dialog
-		workArea = new Composite(contents, SWT.NONE);
-		GridLayout childLayout = new GridLayout();
-		childLayout.marginHeight = 0;
-		childLayout.marginWidth = 0;
-		childLayout.verticalSpacing = 0;
-		workArea.setLayout(childLayout);
-		Control top = createTitleArea(contents);
-		resetWorkAreaAttachments(top);
-		workArea.setFont(JFaceResources.getDialogFont());
-		// initialize the dialog units
-		initializeDialogUnits(workArea);
-		// create the dialog area and button bar
-		dialogArea = createDialogArea(workArea);
-		buttonBar = createButtonBar(workArea);
-		return contents;
-	}
-
-	/**
-	 * Creates and returns the contents of the upper part of this dialog (above
-	 * the button bar).
-	 * <p>
-	 * The <code>Dialog</code> implementation of this framework method creates
-	 * and returns a new <code>Composite</code> with no margins and spacing.
-	 * Subclasses should override.
-	 * </p>
-	 * 
-	 * @param parent
-	 *            The parent composite to contain the dialog area
-	 * @return the dialog area control
-	 */
-	protected Control createDialogArea(Composite parent) {
-		// create the top level composite for the dialog area
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		layout.verticalSpacing = 0;
-		layout.horizontalSpacing = 0;
-		composite.setLayout(layout);
-		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-		composite.setFont(parent.getFont());
-		// Build the separator line
-		Label titleBarSeparator = new Label(composite, SWT.HORIZONTAL
-				| SWT.SEPARATOR);
-		titleBarSeparator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		return composite;
-	}
-
-	/**
-	 * Creates the dialog's title area.
-	 * 
-	 * @param parent
-	 *            the SWT parent for the title area widgets
-	 * @return Control with the highest x axis value.
-	 */
-	private Control createTitleArea(Composite parent) {
-
-		// add a dispose listener
-		parent.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				if (titleAreaColor != null) {
-					titleAreaColor.dispose();
-				}
-			}
-		});
-		// Determine the background color of the title bar
-		Display display = parent.getDisplay();
-		Color background;
-		Color foreground;
-		if (titleAreaRGB != null) {
-			titleAreaColor = new Color(display, titleAreaRGB);
-			background = titleAreaColor;
-			foreground = null;
-		} else {
-			background = JFaceColors.getBannerBackground(display);
-			foreground = JFaceColors.getBannerForeground(display);
-		}
-
-		parent.setBackground(background);
-		int verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
-		int horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		// Dialog image @ right
-		titleImageLabel = new Label(parent, SWT.CENTER);
-		titleImageLabel.setBackground(background);
-		if (titleAreaImage == null)
-			titleImageLabel.setImage(JFaceResources
-					.getImage(DLG_IMG_TITLE_BANNER));
-		else
-			titleImageLabel.setImage(titleAreaImage);
-
-		FormData imageData = new FormData();
-		imageData.top = new FormAttachment(0, 0);
-		// Note: do not use horizontalSpacing on the right as that would be a
-		// regression from
-		// the R2.x style where there was no margin on the right and images are
-		// flush to the right
-		// hand side. see reopened comments in 41172
-		imageData.right = new FormAttachment(100, 0); // horizontalSpacing
-		titleImageLabel.setLayoutData(imageData);
-		// Title label @ top, left
-		titleLabel = new Label(parent, SWT.LEFT);
-		JFaceColors.setColors(titleLabel, foreground, background);
-		titleLabel.setFont(JFaceResources.getBannerFont());
-		titleLabel.setText(" ");//$NON-NLS-1$
-		FormData titleData = new FormData();
-		titleData.top = new FormAttachment(0, verticalSpacing);
-		titleData.right = new FormAttachment(titleImageLabel);
-		titleData.left = new FormAttachment(0, horizontalSpacing);
-		titleLabel.setLayoutData(titleData);
-		// Message image @ bottom, left
-		messageImageLabel = new Label(parent, SWT.CENTER);
-		messageImageLabel.setBackground(background);
-		// Message label @ bottom, center
-		messageLabel = new Text(parent, SWT.WRAP | SWT.READ_ONLY);
-		JFaceColors.setColors(messageLabel, foreground, background);
-		messageLabel.setText(" \n "); // two lines//$NON-NLS-1$
-		messageLabel.setFont(JFaceResources.getDialogFont());
-		messageLabelHeight = messageLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
-		// Filler labels
-		leftFillerLabel = new Label(parent, SWT.CENTER);
-		leftFillerLabel.setBackground(background);
-		bottomFillerLabel = new Label(parent, SWT.CENTER);
-		bottomFillerLabel.setBackground(background);
-		setLayoutsForNormalMessage(verticalSpacing, horizontalSpacing);
-		determineTitleImageLargest();
-		if (titleImageLargest)
-			return titleImageLabel;
-		return messageLabel;
-	}
-
-	/**
-	 * Determine if the title image is larger than the title message and message
-	 * area. This is used for layout decisions.
-	 */
-	private void determineTitleImageLargest() {
-		int titleY = titleImageLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
-		int verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
-		int labelY = titleLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
-		labelY += verticalSpacing;
-		labelY += messageLabelHeight;
-		labelY += verticalSpacing;
-		titleImageLargest = titleY > labelY;
-	}
-
-	/**
-	 * Set the layout values for the messageLabel, messageImageLabel and
-	 * fillerLabel for the case where there is a normal message.
-	 * 
-	 * @param verticalSpacing
-	 *            int The spacing between widgets on the vertical axis.
-	 * @param horizontalSpacing
-	 *            int The spacing between widgets on the horizontal axis.
-	 */
-	private void setLayoutsForNormalMessage(int verticalSpacing,
-			int horizontalSpacing) {
-		FormData messageImageData = new FormData();
-		messageImageData.top = new FormAttachment(titleLabel, verticalSpacing);
-		messageImageData.left = new FormAttachment(0, H_GAP_IMAGE);
-		messageImageLabel.setLayoutData(messageImageData);
-		FormData messageLabelData = new FormData();
-		messageLabelData.top = new FormAttachment(titleLabel, verticalSpacing);
-		messageLabelData.right = new FormAttachment(titleImageLabel);
-		messageLabelData.left = new FormAttachment(messageImageLabel,
-				horizontalSpacing);
-		messageLabelData.height = messageLabelHeight;
-		if (titleImageLargest)
-			messageLabelData.bottom = new FormAttachment(titleImageLabel, 0,
-					SWT.BOTTOM);
-		messageLabel.setLayoutData(messageLabelData);
-		FormData fillerData = new FormData();
-		fillerData.left = new FormAttachment(0, horizontalSpacing);
-		fillerData.top = new FormAttachment(messageImageLabel, 0);
-		fillerData.bottom = new FormAttachment(messageLabel, 0, SWT.BOTTOM);
-		bottomFillerLabel.setLayoutData(fillerData);
-		FormData data = new FormData();
-		data.top = new FormAttachment(messageImageLabel, 0, SWT.TOP);
-		data.left = new FormAttachment(0, 0);
-		data.bottom = new FormAttachment(messageImageLabel, 0, SWT.BOTTOM);
-		data.right = new FormAttachment(messageImageLabel, 0);
-		leftFillerLabel.setLayoutData(data);
-	}
-
-	/**
-	 * The <code>TitleAreaDialog</code> implementation of this
-	 * <code>Window</code> methods returns an initial size which is at least
-	 * some reasonable minimum.
-	 * 
-	 * @return the initial size of the dialog
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				Math.max(convertVerticalDLUsToPixels(MIN_DIALOG_HEIGHT),
-						shellSize.y));
-	}
-
-	/**
-	 * Retained for backward compatibility.
-	 * 
-	 * Returns the title area composite. There is no composite in this
-	 * implementation so the shell is returned.
-	 * 
-	 * @return Composite
-	 * @deprecated
-	 */
-	protected Composite getTitleArea() {
-		return getShell();
-	}
-
-	/**
-	 * Returns the title image label.
-	 * 
-	 * @return the title image label
-	 */
-	protected Label getTitleImageLabel() {
-		return titleImageLabel;
-	}
-
-	/**
-	 * Display the given error message. The currently displayed message is saved
-	 * and will be redisplayed when the error message is set to
-	 * <code>null</code>.
-	 * 
-	 * @param newErrorMessage
-	 *            the newErrorMessage to display or <code>null</code>
-	 */
-	public void setErrorMessage(String newErrorMessage) {
-		// Any change?
-		if (errorMessage == null ? newErrorMessage == null : errorMessage
-				.equals(newErrorMessage))
-			return;
-		errorMessage = newErrorMessage;
-
-		// Clear or set error message.
-		if (errorMessage == null) {
-			if (showingError) {
-				// we were previously showing an error
-				showingError = false;
-			}
-			// show the message
-			// avoid calling setMessage in case it is overridden to call
-			// setErrorMessage,
-			// which would result in a recursive infinite loop
-			if (message == null) // this should probably never happen since
-				// setMessage does this conversion....
-				message = ""; //$NON-NLS-1$
-			updateMessage(message);
-			messageImageLabel.setImage(messageImage);
-			setImageLabelVisible(messageImage != null);
-		} else {
-			// Add in a space for layout purposes but do not
-			// change the instance variable
-			String displayedErrorMessage = " " + errorMessage; //$NON-NLS-1$
-			updateMessage(displayedErrorMessage);
-			if (!showingError) {
-				// we were not previously showing an error
-				showingError = true;
-				messageImageLabel.setImage(JFaceResources
-						.getImage(DLG_IMG_TITLE_ERROR));
-				setImageLabelVisible(true);
-			}
-		}
-		layoutForNewMessage();
-	}
-
-	/**
-	 * Re-layout the labels for the new message.
-	 */
-	private void layoutForNewMessage() {
-		int verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
-		int horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		// If there are no images then layout as normal
-		if (errorMessage == null && messageImage == null) {
-			setImageLabelVisible(false);
-			setLayoutsForNormalMessage(verticalSpacing, horizontalSpacing);
-		} else {
-			messageImageLabel.setVisible(true);
-			bottomFillerLabel.setVisible(true);
-			leftFillerLabel.setVisible(true);
-			/**
-			 * Note that we do not use horizontalSpacing here as when the
-			 * background of the messages changes there will be gaps between the
-			 * icon label and the message that are the background color of the
-			 * shell. We add a leading space elsewhere to compendate for this.
-			 */
-			FormData data = new FormData();
-			data.left = new FormAttachment(0, H_GAP_IMAGE);
-			data.top = new FormAttachment(titleLabel, verticalSpacing);
-			messageImageLabel.setLayoutData(data);
-			data = new FormData();
-			data.top = new FormAttachment(messageImageLabel, 0);
-			data.left = new FormAttachment(0, 0);
-			data.bottom = new FormAttachment(messageLabel, 0, SWT.BOTTOM);
-			data.right = new FormAttachment(messageImageLabel, 0, SWT.RIGHT);
-			bottomFillerLabel.setLayoutData(data);
-			data = new FormData();
-			data.top = new FormAttachment(messageImageLabel, 0, SWT.TOP);
-			data.left = new FormAttachment(0, 0);
-			data.bottom = new FormAttachment(messageImageLabel, 0, SWT.BOTTOM);
-			data.right = new FormAttachment(messageImageLabel, 0);
-			leftFillerLabel.setLayoutData(data);
-			FormData messageLabelData = new FormData();
-			messageLabelData.top = new FormAttachment(titleLabel,
-					verticalSpacing);
-			messageLabelData.right = new FormAttachment(titleImageLabel);
-			messageLabelData.left = new FormAttachment(messageImageLabel, 0);
-			messageLabelData.height = messageLabelHeight;
-			if (titleImageLargest)
-				messageLabelData.bottom = new FormAttachment(titleImageLabel,
-						0, SWT.BOTTOM);
-			messageLabel.setLayoutData(messageLabelData);
-		}
-		// Do not layout before the dialog area has been created
-		// to avoid incomplete calculations.
-		if (dialogArea != null)
-			workArea.getParent().layout(true);
-	}
-
-	/**
-	 * Set the message text. If the message line currently displays an error,
-	 * the message is saved and will be redisplayed when the error message is
-	 * set to <code>null</code>.
-	 * <p>
-	 * Shortcut for <code>setMessage(newMessage, IMessageProvider.NONE)</code>
-	 * </p>
-	 * This method should be called after the dialog has been opened as it
-	 * updates the message label immediately.
-	 * 
-	 * @param newMessage
-	 *            the message, or <code>null</code> to clear the message
-	 */
-	public void setMessage(String newMessage) {
-		setMessage(newMessage, IMessageProvider.NONE);
-	}
-
-	/**
-	 * Sets the message for this dialog with an indication of what type of
-	 * message it is.
-	 * <p>
-	 * The valid message types are one of <code>NONE</code>,
-	 * <code>INFORMATION</code>,<code>WARNING</code>, or
-	 * <code>ERROR</code>.
-	 * </p>
-	 * <p>
-	 * Note that for backward compatibility, a message of type
-	 * <code>ERROR</code> is different than an error message (set using
-	 * <code>setErrorMessage</code>). An error message overrides the current
-	 * message until the error message is cleared. This method replaces the
-	 * current message and does not affect the error message.
-	 * </p>
-	 * 
-	 * @param newMessage
-	 *            the message, or <code>null</code> to clear the message
-	 * @param newType
-	 *            the message type
-	 * @since 2.0
-	 */
-	public void setMessage(String newMessage, int newType) {
-		Image newImage = null;
-		if (newMessage != null) {
-			switch (newType) {
-			case IMessageProvider.NONE:
-				break;
-			case IMessageProvider.INFORMATION:
-				newImage = JFaceResources.getImage(DLG_IMG_MESSAGE_INFO);
-				break;
-			case IMessageProvider.WARNING:
-				newImage = JFaceResources.getImage(DLG_IMG_MESSAGE_WARNING);
-				break;
-			case IMessageProvider.ERROR:
-				newImage = JFaceResources.getImage(DLG_IMG_MESSAGE_ERROR);
-				break;
-			}
-		}
-		showMessage(newMessage, newImage);
-	}
-
-	/**
-	 * Show the new message and image.
-	 * 
-	 * @param newMessage
-	 * @param newImage
-	 */
-	private void showMessage(String newMessage, Image newImage) {
-		// Any change?
-		if (message.equals(newMessage) && messageImage == newImage) {
-			return;
-		}
-		message = newMessage;
-		if (message == null)
-			message = "";//$NON-NLS-1$
-		// Message string to be shown - if there is an image then add in
-		// a space to the message for layout purposes
-		String shownMessage = (newImage == null) ? message : " " + message; //$NON-NLS-1$  
-		messageImage = newImage;
-		if (!showingError) {
-			// we are not showing an error
-			updateMessage(shownMessage);
-			messageImageLabel.setImage(messageImage);
-			setImageLabelVisible(messageImage != null);
-			layoutForNewMessage();
-		}
-	}
-
-	/**
-	 * Update the contents of the messageLabel.
-	 * 
-	 * @param newMessage
-	 *            the message to use
-	 */
-	private void updateMessage(String newMessage) {
-		messageLabel.setText(newMessage);
-	}
-
-	/**
-	 * Sets the title to be shown in the title area of this dialog.
-	 * 
-	 * @param newTitle
-	 *            the title show
-	 */
-	public void setTitle(String newTitle) {
-		if (titleLabel == null)
-			return;
-		String title = newTitle;
-		if (title == null)
-			title = "";//$NON-NLS-1$
-		titleLabel.setText(title);
-	}
-
-	/**
-	 * Sets the title bar color for this dialog.
-	 * 
-	 * @param color
-	 *            the title bar color
-	 */
-	public void setTitleAreaColor(RGB color) {
-		titleAreaRGB = color;
-	}
-
-	/**
-	 * Sets the title image to be shown in the title area of this dialog.
-	 * 
-	 * @param newTitleImage
-	 *            the title image to be shown
-	 */
-	public void setTitleImage(Image newTitleImage) {
-
-		titleAreaImage = newTitleImage;
-		if (titleImageLabel != null) {
-			titleImageLabel.setImage(newTitleImage);
-			determineTitleImageLargest();
-			Control top;
-			if (titleImageLargest)
-				top = titleImageLabel;
-			else
-				top = messageLabel;
-			resetWorkAreaAttachments(top);
-		}
-	}
-
-	/**
-	 * Make the label used for displaying error images visible depending on
-	 * boolean.
-	 * 
-	 * @param visible
-	 *            If <code>true</code> make the image visible, if not then
-	 *            make it not visible.
-	 */
-	private void setImageLabelVisible(boolean visible) {
-		messageImageLabel.setVisible(visible);
-		bottomFillerLabel.setVisible(visible);
-		leftFillerLabel.setVisible(visible);
-	}
-
-	/**
-	 * Reset the attachment of the workArea to now attach to top as the top
-	 * control.
-	 * 
-	 * @param top
-	 */
-	private void resetWorkAreaAttachments(Control top) {
-		FormData childData = new FormData();
-		childData.top = new FormAttachment(top);
-		childData.right = new FormAttachment(100, 0);
-		childData.left = new FormAttachment(0, 0);
-		childData.bottom = new FormAttachment(100, 0);
-		workArea.setLayoutData(childData);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/TrayDialog.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/TrayDialog.java
deleted file mode 100644
index da2103a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/TrayDialog.java
+++ /dev/null
@@ -1,433 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.dialogs;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.window.IShellProvider;
-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.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Image;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Sash;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * A <code>TrayDialog</code> is a specialized <code>Dialog</code> that can contain
- * a tray on its side. The tray's content is provided as a <code>DialogTray</code>.
- * <p>
- * It is recommended to subclass this class instead of <code>Dialog</code> in all
- * cases except where the dialog should never show a tray. For example, dialogs
- * which are very short, simple, and quick to dismiss (e.g. a message dialog with
- * an OK button) should subclass <code>Dialog</code>.
- * </p>
- * <p>
- * Note: Trays are not supported on dialogs that use a custom layout on the <code>
- * Shell</code> by overriding <code>Window#getLayout()</code>.
- * </p>
- * 
- * @see org.eclipse.jface.dialogs.DialogTray
- * @see org.eclipse.jface.window.Window#getLayout()
- * @since 3.2
- */
-public abstract class TrayDialog extends Dialog {
-
-	private final class ResizeListener extends ControlAdapter {
-
-		private final GridData data;
-		private final Shell shell;
-		private final int TRAY_RATIO = 100; // Percentage of extra width devoted to tray when resizing
-		private int remainder = 0; // Used to prevent rounding errors from accumulating
-
-		private ResizeListener(GridData data, Shell shell) {
-			this.data = data;
-			this.shell = shell;
-		}
-
-		public void controlResized (ControlEvent event) {
-				int newWidth = shell.getSize().x;
-				if (newWidth != shellWidth) {					
-					int shellWidthIncrease = newWidth - shellWidth;
-					int trayWidthIncreaseTimes100 = (shellWidthIncrease * TRAY_RATIO) + remainder;
-					int trayWidthIncrease = trayWidthIncreaseTimes100/100;
-					remainder = trayWidthIncreaseTimes100 - (100 * trayWidthIncrease);
-					data.widthHint = data.widthHint + trayWidthIncrease;
-					shellWidth = newWidth;
-					if (!shell.isDisposed()) {
-						shell.layout();
-					}
-				}
-		  }
-	}
-
-	private static boolean dialogHelpAvailable;
-
-	/*
-	 * The dialog's tray (null if none).
-	 */
-	private DialogTray tray;
-
-	/*
-	 * The tray's control.
-	 */
-	private Control trayControl;
-	
-	/*
-	 * The separator to the left of the sash.
-	 */
-	private Label leftSeparator;
-	
-	/*
-	 * The separator to the right of the sash.
-	 */
-	private Label rightSeparator;
-	
-	/*
-	 * The sash that allows the user to resize the tray.
-	 */
-	private Sash sash;
-	
-	/*
-	 * Whether or not help is available for this dialog.
-	 */
-	private boolean helpAvailable = isDialogHelpAvailable();
-	
-	private int shellWidth;
-
-	private ControlAdapter resizeListener;
-
-	/**
-	 * Creates a tray dialog instance. Note that the window will have no visual
-	 * representation (no widgets) until it is told to open.
-	 * 
-	 * @param shell the parent shell, or <code>null</code> to create a top-level shell
-	 */
-	protected TrayDialog(Shell shell) {
-		super(shell);
-	}
-	
-	/**
-	 * Creates a tray dialog with the given parent.
-	 * 
-	 * @param parentShell the object that returns the current parent shell
-	 */
-	protected TrayDialog(IShellProvider parentShell) {
-		super(parentShell);
-	}
-
-	/**
-	 * Closes this dialog's tray, disposing its widgets.
-	 * 
-	 * @throws IllegalStateException if the tray was not open
-	 */
-	public void closeTray() throws IllegalStateException {
-		if (getTray() == null) {
-			throw new IllegalStateException("Tray was not open"); //$NON-NLS-1$
-		}
-		Shell shell = getShell();
-		shell.removeControlListener (resizeListener);
-		resizeListener = null;
-		int trayWidth = trayControl.getSize().x + leftSeparator.getSize().x + sash.getSize().x + rightSeparator.getSize().x;
-		trayControl.dispose();
-		trayControl = null;
-		tray = null;
-		leftSeparator.dispose();
-		leftSeparator = null;
-		rightSeparator.dispose();
-		rightSeparator = null;
-		sash.dispose();
-		sash = null;
-		Rectangle bounds = shell.getBounds();
-		shell.setBounds(bounds.x + ((getDefaultOrientation() == SWT.RIGHT_TO_LEFT) ? trayWidth : 0), bounds.y, bounds.width - trayWidth, bounds.height);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#close()
-	 */
-	public boolean close() {
-		/*
-		 * Close the tray to ensure that those dialogs that remember their
-		 * size do not store the tray size.
-		 */
-		if (getTray() != null) {
-			closeTray();
-		}
-		return super.close();
-	}
-	
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite)
-     */
-	protected Control createButtonBar(Composite parent) {
-    	Composite composite = new Composite(parent, SWT.NONE);
-    	GridLayout layout = new GridLayout();
-    	layout.marginWidth = 0;
-    	layout.marginHeight = 0;
-    	layout.horizontalSpacing = 0;
-    	composite.setLayout(layout);
-    	composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
-    	composite.setFont(parent.getFont());
-
-		// create help control if needed
-        if (isHelpAvailable()) {
-        	Control helpControl = createHelpControl(composite);
-        	((GridData) helpControl.getLayoutData()).horizontalIndent = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-		}
-        Control buttonSection = super.createButtonBar(composite);
-        ((GridData) buttonSection.getLayoutData()).grabExcessHorizontalSpace = true;
-        return composite;
-	}
-
-	/**
-	 * Creates a new help control that provides access to context help.
-	 * <p>
-	 * The <code>TrayDialog</code> implementation of this method creates
-	 * the control, registers it for selection events including selection,
-	 * Note that the parent's layout is assumed to be a <code>GridLayout</code>
-	 * and the number of columns in this layout is incremented. Subclasses may
-	 * override.
-	 * </p>
-	 * 
-	 * @param parent the parent composite
-	 * @return the help control
-	 */
-    protected Control createHelpControl(Composite parent) {
-		Image helpImage = JFaceResources.getImage(DLG_IMG_HELP);
-		if (helpImage != null) {
-			return createHelpImageButton(parent, helpImage);
-		}
-		return createHelpLink(parent);
-    }
-    
-    /*
-     * Creates a button with a help image. This is only used if there
-     * is an image available.
-     */
-	private ToolBar createHelpImageButton(Composite parent, Image image) {
-        ToolBar toolBar = new ToolBar(parent, SWT.FLAT | SWT.NO_FOCUS);
-        ((GridLayout) parent.getLayout()).numColumns++;
-		toolBar.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
-		final Cursor cursor = new Cursor(parent.getDisplay(), SWT.CURSOR_HAND);
-		toolBar.setCursor(cursor);
-		toolBar.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				cursor.dispose();
-			}
-		});		
-        ToolItem item = new ToolItem(toolBar, SWT.NONE);
-		item.setImage(image);
-		item.setToolTipText(JFaceResources.getString("helpToolTip")); //$NON-NLS-1$
-		item.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-				helpPressed();
-            }
-        });
-		return toolBar;
-	}
-
-	/*
-	 * Creates a help link. This is used when there is no help image
-	 * available.
-	 */
-	private Link createHelpLink(Composite parent) {
-		Link link = new Link(parent, SWT.WRAP | SWT.NO_FOCUS);
-        ((GridLayout) parent.getLayout()).numColumns++;
-		link.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
-		link.setText("<a>"+IDialogConstants.HELP_LABEL+"</a>"); //$NON-NLS-1$ //$NON-NLS-2$
-		link.setToolTipText(IDialogConstants.HELP_LABEL);
-		link.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-				helpPressed();
-            }
-        });
-		return link;
-	}	
-	
-	/*
-	 * Returns whether or not the given layout can support the addition of a tray.
-	 */
-	private boolean isCompatibleLayout(Layout layout) {
-		if (layout != null && layout instanceof GridLayout) {
-			GridLayout grid = (GridLayout)layout;
-			return !grid.makeColumnsEqualWidth && (grid.horizontalSpacing == 0) &&
-					(grid.marginWidth == 0) && (grid.marginHeight == 0) &&
-					(grid.numColumns == 5);
-		}
-		return false;
-	}
-
-	/**
-	 * Returns whether or not context help is available for this dialog. This
-	 * can affect whether or not the dialog will display additional help
-	 * mechanisms such as a help control in the button bar.
-	 * 
-	 * @return whether or not context help is available for this dialog
-	 */
-	public boolean isHelpAvailable() {
-		return helpAvailable;
-	}
-	
-	/**
-	 * The tray dialog's default layout is a modified version of the default
-	 * <code>Window</code> layout that can accomodate a tray, however it still
-	 * conforms to the description of the <code>Window</code> default layout.
-	 * <p>
-	 * Note: Trays may not be supported with all custom layouts on the dialog's
-	 * Shell. To avoid problems, use a single outer <code>Composite</code> for
-	 * your dialog area, and set your custom layout on that <code>Composite</code>.
-	 * </p>
-	 * 
-	 * @see org.eclipse.jface.window.Window#getLayout()
-	 * @return a newly created layout or <code>null</code> for no layout
-	 */
-	protected Layout getLayout() {
-		GridLayout layout = (GridLayout)super.getLayout();
-		layout.numColumns = 5;
-		layout.horizontalSpacing = 0;
-		return layout;
-	}
-	
-	/**
-	 * Returns the tray currently shown in the dialog, or <code>null</code>
-	 * if there is no tray.
-	 * 
-	 * @return the dialog's current tray, or <code>null</code> if there is none
-	 */
-	public DialogTray getTray() {
-		return tray;
-	}
-	
-	/*
-	 * Called when the help control is invoked. This emulates the keyboard
-	 * context help behavior (e.g. F1 on Windows). It traverses the widget
-	 * tree upward until it finds a widget that has a help listener on it,
-	 * then invokes a help event on that widget.
-	 */
-	private void helpPressed() {
-    	if (getShell() != null) {
-	    	Control c = getShell().getDisplay().getFocusControl();
-	    	while (c != null) {
-	    		if (c.isListening(SWT.Help)) {
-	    			c.notifyListeners(SWT.Help, new Event());
-	    			break;
-	    		}
-	    		c = c.getParent();
-	    	}
-    	}
-	}
-	
-	/**
-	 * Constructs the tray's widgets and displays the tray in this dialog. The
-	 * dialog's size will be adjusted to accomodate the tray.
-	 * 
-	 * @param tray the tray to show in this dialog
-	 * @throws IllegalStateException if the dialog already has a tray open
-	 * @throws UnsupportedOperationException if the dialog does not support trays,
-	 *            for example if it uses a custom layout.
-	 */
-	public void openTray(DialogTray tray) throws IllegalStateException, UnsupportedOperationException {
-		if (tray == null) {
-			throw new NullPointerException("Tray was null"); //$NON-NLS-1$
-		}
-		if (getTray() != null) {
-			throw new IllegalStateException("Tray was already open"); //$NON-NLS-1$
-		}
-		if (!isCompatibleLayout(getShell().getLayout())) {
-			throw new UnsupportedOperationException("Trays not supported with custom layouts"); //$NON-NLS-1$
-		}
-		final Shell shell = getShell();
-		leftSeparator = new Label(shell, SWT.SEPARATOR | SWT.VERTICAL);
-		leftSeparator.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-		sash = new Sash(shell, SWT.VERTICAL);
-		sash.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-		rightSeparator = new Label(shell, SWT.SEPARATOR | SWT.VERTICAL);
-		rightSeparator.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-		trayControl = tray.createContents(shell);
-		Rectangle clientArea = shell.getClientArea();
-		final GridData data = new GridData(GridData.FILL_VERTICAL);
-		data.widthHint = trayControl.computeSize(SWT.DEFAULT, clientArea.height).x;
-		trayControl.setLayoutData(data);
-		int trayWidth = leftSeparator.computeSize(SWT.DEFAULT, clientArea.height).x + sash.computeSize(SWT.DEFAULT, clientArea.height).x + rightSeparator.computeSize(SWT.DEFAULT, clientArea.height).x + data.widthHint;
-		Rectangle bounds = shell.getBounds();
-		shell.setBounds(bounds.x - ((getDefaultOrientation() == SWT.RIGHT_TO_LEFT) ? trayWidth : 0), bounds.y, bounds.width + trayWidth, bounds.height);
-		sash.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event event) {
-				if (event.detail != SWT.DRAG) {
-					Rectangle clientArea = shell.getClientArea();
-					int newWidth = clientArea.width - event.x - (sash.getSize().x + rightSeparator.getSize().x);
-					if (newWidth != data.widthHint) {
-						data.widthHint = newWidth;
-						shell.layout();
-					}
-				}
-			}
-		});
-		shellWidth = shell.getSize().x;
-		
-		resizeListener = new ResizeListener(data, shell);
-		shell.addControlListener (resizeListener);
-		   
-		this.tray = tray;
-	}
-	
-	/**
-	 * Sets whether or not context help is available for this dialog. This
-	 * can affect whether or not the dialog will display additional help
-	 * mechanisms such as a help control in the button bar.
-	 * 
-	 * @param helpAvailable whether or not context help is available for the dialog
-	 */
-	public void setHelpAvailable(boolean helpAvailable) {
-		this.helpAvailable = helpAvailable;
-	}
-	
-	/**
-	 * Tests if dialogs that have help control should show it
-	 * all the time or only when explicitly requested for
-	 * each dialog instance.
-	 * 
-	 * @return <code>true</code> if dialogs that support help
-	 * control should show it by default, <code>false</code> otherwise.
-	 * @since 3.2
-	 */
-	public static boolean isDialogHelpAvailable() {
-		return dialogHelpAvailable;
-	}
-	
-	/**
-	 * Sets whether JFace dialogs that support help control should
-	 * show the control by default. If set to <code>false</code>, 
-	 * help control can still be shown on a per-dialog basis.
-	 * 
-	 * @param helpAvailable <code>true</code> to show the help
-	 * control, <code>false</code> otherwise.
-	 * @since 3.2
-	 */
-	public static void setDialogHelpAvailable(boolean helpAvailable) {
-		dialogHelpAvailable = helpAvailable;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/help.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/help.gif
deleted file mode 100644
index f637410..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/help.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/message_error.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/message_error.gif
deleted file mode 100644
index 2ff6678..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/message_error.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/message_info.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/message_info.gif
deleted file mode 100644
index b484d9b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/message_info.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/message_warning.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/message_warning.gif
deleted file mode 100644
index 8e054d0..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/message_warning.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/popup_menu.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/popup_menu.gif
deleted file mode 100644
index bd37eb5..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/popup_menu.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/popup_menu_disabled.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/popup_menu_disabled.gif
deleted file mode 100644
index 5d13485..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/popup_menu_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/title_banner.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/title_banner.gif
deleted file mode 100644
index 4ed90dc..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/images/title_banner.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/package.html
deleted file mode 100644
index e376429..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/package.html
+++ /dev/null
@@ -1,28 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides support for dialogs.
-<h2>
-Package Specification</h2>
-A dialog is a specialized window, typically consisting of a dialog area
-and a button bar, designed for narrow-focussed communication with the user.
-<p>The dialog framework consists of an abstract base class (<tt>Dialog</tt>),
-along with more concrete dialog subclasses for displaying messages (<tt>MessageDialog</tt>),
-soliciting text input (<tt>InputDialog</tt>), and displaying progress during
-a long-running operation (<tt>ProgressMonitorDialog</tt>).
-<p>Dialog stores (<tt>IDialogStore</tt>, <tt>DialogStore</tt>) provide
-a general framework for organizing a dialog's settings into key/value pairs.
-Multi-page dialogs are made easier through the use of dialog pages (<tt>IDialogPage</tt>,
-<tt>DialogPage</tt>).
-<p>Note: None of the classes in this package maintain global state.
-<br>&nbsp;
-<br>&nbsp;
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/AutoCompleteField.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/AutoCompleteField.java
deleted file mode 100644
index 8d22823..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/AutoCompleteField.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-import org.eclipse.swt.widgets.Control;
-
-/**
- * AutoCompleteField is a class which attempts to auto-complete a user's
- * keystrokes by activating a popup that filters a list of proposals according
- * to the content typed by the user.
- * 
- * @see ContentProposalAdapter
- * @see SimpleContentProposalProvider
- * 
- * @since 3.3
- */
-public class AutoCompleteField {
-
-	private SimpleContentProposalProvider proposalProvider;
-	private ContentProposalAdapter adapter;
-
-	/**
-	 * Construct an AutoComplete field on the specified control, whose
-	 * completions are characterized by the specified array of Strings.
-	 * 
-	 * @param control
-	 *            the control for which autocomplete is desired. May not be
-	 *            <code>null</code>.
-	 * @param controlContentAdapter
-	 *            the <code>IControlContentAdapter</code> used to obtain and
-	 *            update the control's contents. May not be <code>null</code>.
-	 * @param proposals
-	 *            the array of Strings representing valid content proposals for
-	 *            the field.
-	 */
-	public AutoCompleteField(Control control,
-			IControlContentAdapter controlContentAdapter, String[] proposals) {
-		proposalProvider = new SimpleContentProposalProvider(proposals);
-		proposalProvider.setFiltering(true);
-		adapter = new ContentProposalAdapter(control, controlContentAdapter,
-				proposalProvider, null, null);
-		adapter.setPropagateKeys(true);
-		adapter
-				.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
-	}
-
-	/**
-	 * Set the Strings to be used as content proposals.
-	 * 
-	 * @param proposals
-	 *            the array of Strings to be used as proposals.
-	 */
-	public void setProposals(String[] proposals) {
-		proposalProvider.setProposals(proposals);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/ComboContentAdapter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/ComboContentAdapter.java
deleted file mode 100644
index 7c688ff..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/ComboContentAdapter.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * An {@link IControlContentAdapter} for SWT Combo controls. This is a
- * convenience class for easily creating a {@link ContentProposalAdapter} for
- * combo fields.
- * 
- * @since 3.2
- */
-public class ComboContentAdapter implements IControlContentAdapter,
-		IControlContentAdapter2 {
-	
-	/*
-	 * Set to <code>true</code> if we should compute the text
-	 * vertical bounds rather than just use the field size.
-	 * Workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=164748
-	 * The corresponding SWT bug is
-	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=44072
-	 */
-	private static final boolean COMPUTE_TEXT_USING_CLIENTAREA = !Util.isCarbon();
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.taskassistance.IControlContentAdapter#getControlContents(org.eclipse.swt.widgets.Control)
-	 */
-	public String getControlContents(Control control) {
-		return ((Combo) control).getText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.fieldassist.IControlContentAdapter#setControlContents(org.eclipse.swt.widgets.Control,
-	 *      java.lang.String, int)
-	 */
-	public void setControlContents(Control control, String text,
-			int cursorPosition) {
-		((Combo) control).setText(text);
-		((Combo) control)
-				.setSelection(new Point(cursorPosition, cursorPosition));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.fieldassist.IControlContentAdapter#insertControlContents(org.eclipse.swt.widgets.Control,
-	 *      java.lang.String, int)
-	 */
-	public void insertControlContents(Control control, String text,
-			int cursorPosition) {
-		Combo combo = (Combo) control;
-		String contents = combo.getText();
-		Point selection = combo.getSelection();
-		StringBuffer sb = new StringBuffer();
-		sb.append(contents.substring(0, selection.x));
-		sb.append(text);
-		if (selection.y < contents.length()) {
-			sb.append(contents.substring(selection.y, contents.length()));
-		}
-		combo.setText(sb.toString());
-		selection.x = selection.x + cursorPosition;
-		selection.y = selection.x;
-		combo.setSelection(selection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.fieldassist.IControlContentAdapter#getCursorPosition(org.eclipse.swt.widgets.Control)
-	 */
-	public int getCursorPosition(Control control) {
-		return ((Combo) control).getSelection().x;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.fieldassist.IControlContentAdapter#getInsertionBounds(org.eclipse.swt.widgets.Control)
-	 */
-	public Rectangle getInsertionBounds(Control control) {
-		// This doesn't take horizontal scrolling into affect. 
-		// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=204599
-		Combo combo = (Combo) control;
-		int position = combo.getSelection().y;
-		String contents = combo.getText();
-		GC gc = new GC(combo);
-		gc.setFont(combo.getFont());
-		Point extent = gc.textExtent(contents.substring(0, Math.min(position,
-				contents.length())));
-		gc.dispose();
-		if (COMPUTE_TEXT_USING_CLIENTAREA) {
-			return new Rectangle(combo.getClientArea().x + extent.x, combo
-				.getClientArea().y, 1, combo.getClientArea().height);
-		}
-		return new Rectangle(extent.x, 0, 1, combo.getSize().y);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.fieldassist.IControlContentAdapter#setCursorPosition(org.eclipse.swt.widgets.Control,
-	 *      int)
-	 */
-	public void setCursorPosition(Control control, int index) {
-		((Combo) control).setSelection(new Point(index, index));
-	}
-
-	/**
-	 * @see org.eclipse.jface.fieldassist.IControlContentAdapter2#getSelection(org.eclipse.swt.widgets.Control)
-	 * 
-	 * @since 3.4
-	 */
-	public Point getSelection(Control control) {
-		return ((Combo) control).getSelection();
-	}
-
-	/**
-	 * @see org.eclipse.jface.fieldassist.IControlContentAdapter2#setSelection(org.eclipse.swt.widgets.Control,
-	 *      org.eclipse.swt.graphics.Point)
-	 * 
-	 * @since 3.4
-	 */
-	public void setSelection(Control control, Point range) {
-		((Combo) control).setSelection(range);
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/ContentProposalAdapter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/ContentProposalAdapter.java
deleted file mode 100644
index bd0e9f7..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/ContentProposalAdapter.java
+++ /dev/null
@@ -1,2154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.jface.dialogs.PopupDialog;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.preference.JFacePreferences;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-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.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.ScrollBar;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * ContentProposalAdapter can be used to attach content proposal behavior to a
- * control. This behavior includes obtaining proposals, opening a popup dialog,
- * managing the content of the control relative to the selections in the popup,
- * and optionally opening up a secondary popup to further describe proposals.
- * <p>
- * A number of configurable options are provided to determine how the control
- * content is altered when a proposal is chosen, how the content proposal popup
- * is activated, and whether any filtering should be done on the proposals as
- * the user types characters.
- * <p>
- * This class is not intended to be subclassed.
- * 
- * @since 3.2
- */
-public class ContentProposalAdapter {
-
-	/*
-	 * The lightweight popup used to show content proposals for a text field. If
-	 * additional information exists for a proposal, then selecting that
-	 * proposal will result in the information being displayed in a secondary
-	 * popup.
-	 */
-	class ContentProposalPopup extends PopupDialog {
-		/*
-		 * The listener we install on the popup and related controls to
-		 * determine when to close the popup. Some events (move, resize, close,
-		 * deactivate) trigger closure as soon as they are received, simply
-		 * because one of the registered listeners received them. Other events
-		 * depend on additional circumstances.
-		 */
-		private final class PopupCloserListener implements Listener {
-			private boolean scrollbarClicked = false;
-
-			public void handleEvent(final Event e) {
-
-				// If focus is leaving an important widget or the field's
-				// shell is deactivating
-				if (e.type == SWT.FocusOut) {
-					scrollbarClicked = false;
-					/*
-					 * Ignore this event if it's only happening because focus is
-					 * moving between the popup shells, their controls, or a
-					 * scrollbar. Do this in an async since the focus is not
-					 * actually switched when this event is received.
-					 */
-					e.display.asyncExec(new Runnable() {
-						public void run() {
-							if (isValid()) {
-								if (scrollbarClicked || hasFocus()) {
-									return;
-								}
-								// Workaround a problem on X and Mac, whereby at
-								// this point, the focus control is not known.
-								// This can happen, for example, when resizing
-								// the popup shell on the Mac.
-								// Check the active shell.
-								Shell activeShell = e.display.getActiveShell();
-								if (activeShell == getShell()
-										|| (infoPopup != null && infoPopup
-												.getShell() == activeShell)) {
-									return;
-								}
-								/*
-								 * System.out.println(e);
-								 * System.out.println(e.display.getFocusControl());
-								 * System.out.println(e.display.getActiveShell());
-								 */
-								close();
-							}
-						}
-					});
-					return;
-				}
-
-				// Scroll bar has been clicked. Remember this for focus event
-				// processing.
-				if (e.type == SWT.Selection) {
-					scrollbarClicked = true;
-					return;
-				}
-				// For all other events, merely getting them dictates closure.
-				close();
-			}
-
-			// Install the listeners for events that need to be monitored for
-			// popup closure.
-			void installListeners() {
-				// Listeners on this popup's table and scroll bar
-				proposalTable.addListener(SWT.FocusOut, this);
-				ScrollBar scrollbar = proposalTable.getVerticalBar();
-				if (scrollbar != null) {
-					scrollbar.addListener(SWT.Selection, this);
-				}
-
-				// Listeners on this popup's shell
-				getShell().addListener(SWT.Deactivate, this);
-				getShell().addListener(SWT.Close, this);
-
-				// Listeners on the target control
-				control.addListener(SWT.MouseDoubleClick, this);
-				control.addListener(SWT.MouseDown, this);
-				control.addListener(SWT.Dispose, this);
-				control.addListener(SWT.FocusOut, this);
-				// Listeners on the target control's shell
-				Shell controlShell = control.getShell();
-				controlShell.addListener(SWT.Move, this);
-				controlShell.addListener(SWT.Resize, this);
-
-			}
-
-			// Remove installed listeners
-			void removeListeners() {
-				if (isValid()) {
-					proposalTable.removeListener(SWT.FocusOut, this);
-					ScrollBar scrollbar = proposalTable.getVerticalBar();
-					if (scrollbar != null) {
-						scrollbar.removeListener(SWT.Selection, this);
-					}
-
-					getShell().removeListener(SWT.Deactivate, this);
-					getShell().removeListener(SWT.Close, this);
-				}
-
-				if (control != null && !control.isDisposed()) {
-
-					control.removeListener(SWT.MouseDoubleClick, this);
-					control.removeListener(SWT.MouseDown, this);
-					control.removeListener(SWT.Dispose, this);
-					control.removeListener(SWT.FocusOut, this);
-
-					Shell controlShell = control.getShell();
-					controlShell.removeListener(SWT.Move, this);
-					controlShell.removeListener(SWT.Resize, this);
-				}
-			}
-		}
-
-		/*
-		 * The listener we will install on the target control.
-		 */
-		private final class TargetControlListener implements Listener {
-			// Key events from the control
-			public void handleEvent(Event e) {
-				if (!isValid()) {
-					return;
-				}
-
-				char key = e.character;
-
-				// Traverse events are handled depending on whether the
-				// event has a character.
-				if (e.type == SWT.Traverse) {
-					// If the traverse event contains a legitimate character,
-					// then we must set doit false so that the widget will
-					// receive the key event. We return immediately so that
-					// the character is handled only in the key event.
-					// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=132101
-					if (key != 0) {
-						e.doit = false;
-						return;
-					}
-					// Traversal does not contain a character. Set doit true
-					// to indicate TRAVERSE_NONE will occur and that no key
-					// event will be triggered. We will check for navigation
-					// keys below.
-					e.detail = SWT.TRAVERSE_NONE;
-					e.doit = true;
-				} else {
-					// Default is to only propagate when configured that way.
-					// Some keys will always set doit to false anyway.
-					e.doit = propagateKeys;
-				}
-
-				// No character. Check for navigation keys.
-
-				if (key == 0) {
-					int newSelection = proposalTable.getSelectionIndex();
-					int visibleRows = (proposalTable.getSize().y / proposalTable
-							.getItemHeight()) - 1;
-					switch (e.keyCode) {
-					case SWT.ARROW_UP:
-						newSelection -= 1;
-						if (newSelection < 0) {
-							newSelection = proposalTable.getItemCount() - 1;
-						}
-						// Not typical - usually we get this as a Traverse and
-						// therefore it never propagates. Added for consistency.
-						if (e.type == SWT.KeyDown) {
-							// don't propagate to control
-							e.doit = false;
-						}
-
-						break;
-
-					case SWT.ARROW_DOWN:
-						newSelection += 1;
-						if (newSelection > proposalTable.getItemCount() - 1) {
-							newSelection = 0;
-						}
-						// Not typical - usually we get this as a Traverse and
-						// therefore it never propagates. Added for consistency.
-						if (e.type == SWT.KeyDown) {
-							// don't propagate to control
-							e.doit = false;
-						}
-
-						break;
-
-					case SWT.PAGE_DOWN:
-						newSelection += visibleRows;
-						if (newSelection >= proposalTable.getItemCount()) {
-							newSelection = proposalTable.getItemCount() - 1;
-						}
-						if (e.type == SWT.KeyDown) {
-							// don't propagate to control
-							e.doit = false;
-						}
-						break;
-
-					case SWT.PAGE_UP:
-						newSelection -= visibleRows;
-						if (newSelection < 0) {
-							newSelection = 0;
-						}
-						if (e.type == SWT.KeyDown) {
-							// don't propagate to control
-							e.doit = false;
-						}
-						break;
-
-					case SWT.HOME:
-						newSelection = 0;
-						if (e.type == SWT.KeyDown) {
-							// don't propagate to control
-							e.doit = false;
-						}
-						break;
-
-					case SWT.END:
-						newSelection = proposalTable.getItemCount() - 1;
-						if (e.type == SWT.KeyDown) {
-							// don't propagate to control
-							e.doit = false;
-						}
-						break;
-
-					// If received as a Traverse, these should propagate
-					// to the control as keydown. If received as a keydown,
-					// proposals should be recomputed since the cursor
-					// position has changed.
-					case SWT.ARROW_LEFT:
-					case SWT.ARROW_RIGHT:
-						if (e.type == SWT.Traverse) {
-							e.doit = false;
-						} else {
-							e.doit = true;
-							String contents = getControlContentAdapter()
-									.getControlContents(getControl());
-							// If there are no contents, changes in cursor
-							// position have no effect. Note also that we do 
-							// not affect the filter text on ARROW_LEFT as 
-							// we would with BS.
-							if (contents.length() > 0) {
-								asyncRecomputeProposals(filterText);
-							}
-						}
-						break;
-
-					// Any unknown keycodes will cause the popup to close.
-					// Modifier keys are explicitly checked and ignored because
-					// they are not complete yet (no character).
-					default:
-						if (e.keyCode != SWT.CAPS_LOCK && e.keyCode != SWT.MOD1
-								&& e.keyCode != SWT.MOD2
-								&& e.keyCode != SWT.MOD3
-								&& e.keyCode != SWT.MOD4) {
-							close();
-						}
-						return;
-					}
-
-					// If any of these navigation events caused a new selection,
-					// then handle that now and return.
-					if (newSelection >= 0) {
-						selectProposal(newSelection);
-					}
-					return;
-				}
-
-				// key != 0
-				// Check for special keys involved in cancelling, accepting, or
-				// filtering the proposals.
-				switch (key) {
-				case SWT.ESC:
-					e.doit = false;
-					close();
-					break;
-
-				case SWT.LF:
-				case SWT.CR:
-					e.doit = false;
-					Object p = getSelectedProposal();
-					if (p != null) {
-						acceptCurrentProposal();
-					} else {
-						close();
-					}
-					break;
-
-				case SWT.TAB:
-					e.doit = false;
-					getShell().setFocus();
-					return;
-
-				case SWT.BS:
-					// Backspace should back out of any stored filter text
-					if (filterStyle != FILTER_NONE) {
-						// We have no filter to back out of, so do nothing
-						if (filterText.length() == 0) {
-							return;
-						}
-						// There is filter to back out of
-						filterText = filterText.substring(0, filterText
-								.length() - 1);
-						asyncRecomputeProposals(filterText);
-						return;
-					}
-					// There is no filtering provided by us, but some
-					// clients provide their own filtering based on content.
-					// Recompute the proposals if the cursor position
-					// will change (is not at 0).
-					int pos = getControlContentAdapter().getCursorPosition(
-							getControl());
-					// We rely on the fact that the contents and pos do not yet
-					// reflect the result of the BS. If the contents were
-					// already empty, then BS should not cause
-					// a recompute.
-					if (pos > 0) {
-						asyncRecomputeProposals(filterText);
-					}
-					break;
-
-				default:
-					// If the key is a defined unicode character, and not one of
-					// the special cases processed above, update the filter text
-					// and filter the proposals.
-					if (Character.isDefined(key)) {
-						if (filterStyle == FILTER_CUMULATIVE) {
-							filterText = filterText + String.valueOf(key);
-						} else if (filterStyle == FILTER_CHARACTER) {
-							filterText = String.valueOf(key);
-						}
-						// Recompute proposals after processing this event.
-						asyncRecomputeProposals(filterText);
-					}
-					break;
-				}
-			}
-		}
-
-		/*
-		 * Internal class used to implement the secondary popup.
-		 */
-		private class InfoPopupDialog extends PopupDialog {
-
-			/*
-			 * The text control that displays the text.
-			 */
-			private Text text;
-
-			/*
-			 * The String shown in the popup.
-			 */
-			private String contents = EMPTY;
-
-			/*
-			 * Construct an info-popup with the specified parent.
-			 */
-			InfoPopupDialog(Shell parent) {
-				super(parent, PopupDialog.HOVER_SHELLSTYLE, false, false, false,
-						false, false, null, null);
-			}
-
-			/*
-			 * Create a text control for showing the info about a proposal.
-			 */
-			protected Control createDialogArea(Composite parent) {
-				text = new Text(parent, SWT.MULTI | SWT.READ_ONLY | SWT.WRAP
-						| SWT.NO_FOCUS);
-
-				// Use the compact margins employed by PopupDialog.
-				GridData gd = new GridData(GridData.BEGINNING
-						| GridData.FILL_BOTH);
-				gd.horizontalIndent = PopupDialog.POPUP_HORIZONTALSPACING;
-				gd.verticalIndent = PopupDialog.POPUP_VERTICALSPACING;
-				text.setLayoutData(gd);
-				text.setText(contents);
-
-				// since SWT.NO_FOCUS is only a hint...
-				text.addFocusListener(new FocusAdapter() {
-					public void focusGained(FocusEvent event) {
-						ContentProposalPopup.this.close();
-					}
-				});
-				return text;
-			}
-
-			/*
-			 * Adjust the bounds so that we appear adjacent to our parent shell
-			 */
-			protected void adjustBounds() {
-				Rectangle parentBounds = getParentShell().getBounds();
-				Rectangle proposedBounds;
-				// Try placing the info popup to the right
-				Rectangle rightProposedBounds = new Rectangle(parentBounds.x
-						+ parentBounds.width
-						+ PopupDialog.POPUP_HORIZONTALSPACING, parentBounds.y
-						+ PopupDialog.POPUP_VERTICALSPACING,
-						parentBounds.width, parentBounds.height);
-				rightProposedBounds = getConstrainedShellBounds(rightProposedBounds);
-				// If it won't fit on the right, try the left
-				if (rightProposedBounds.intersects(parentBounds)) {
-					Rectangle leftProposedBounds = new Rectangle(parentBounds.x
-							- parentBounds.width - POPUP_HORIZONTALSPACING - 1,
-							parentBounds.y, parentBounds.width,
-							parentBounds.height);
-					leftProposedBounds = getConstrainedShellBounds(leftProposedBounds);
-					// If it won't fit on the left, choose the proposed bounds
-					// that fits the best
-					if (leftProposedBounds.intersects(parentBounds)) {
-						if (rightProposedBounds.x - parentBounds.x >= parentBounds.x
-								- leftProposedBounds.x) {
-							rightProposedBounds.x = parentBounds.x
-									+ parentBounds.width
-									+ PopupDialog.POPUP_HORIZONTALSPACING;
-							proposedBounds = rightProposedBounds;
-						} else {
-							leftProposedBounds.width = parentBounds.x
-									- POPUP_HORIZONTALSPACING
-									- leftProposedBounds.x;
-							proposedBounds = leftProposedBounds;
-						}
-					} else {
-						// use the proposed bounds on the left
-						proposedBounds = leftProposedBounds;
-					}
-				} else {
-					// use the proposed bounds on the right
-					proposedBounds = rightProposedBounds;
-				}
-				getShell().setBounds(proposedBounds);
-			}
-			
-			/*
-			 * (non-Javadoc)
-			 * @see org.eclipse.jface.dialogs.PopupDialog#getForeground()
-			 */
-			protected Color getForeground() {
-				return control.getDisplay().
-						getSystemColor(SWT.COLOR_INFO_FOREGROUND);
-			}
-			
-			/*
-			 * (non-Javadoc)
-			 * @see org.eclipse.jface.dialogs.PopupDialog#getBackground()
-			 */
-			protected Color getBackground() {
-				return control.getDisplay().
-						getSystemColor(SWT.COLOR_INFO_BACKGROUND);
-			}
-
-			/*
-			 * Set the text contents of the popup.
-			 */
-			void setContents(String newContents) {
-				if (newContents == null) {
-					newContents = EMPTY;
-				}
-				this.contents = newContents;
-				if (text != null && !text.isDisposed()) {
-					text.setText(contents);
-				}
-			}
-
-			/*
-			 * Return whether the popup has focus.
-			 */
-			boolean hasFocus() {
-				if (text == null || text.isDisposed()) {
-					return false;
-				}
-				return text.getShell().isFocusControl()
-						|| text.isFocusControl();
-			}
-		}
-
-		/*
-		 * The listener installed on the target control.
-		 */
-		private Listener targetControlListener;
-
-		/*
-		 * The listener installed in order to close the popup.
-		 */
-		private PopupCloserListener popupCloser;
-
-		/*
-		 * The table used to show the list of proposals.
-		 */
-		private Table proposalTable;
-
-		/*
-		 * The proposals to be shown (cached to avoid repeated requests).
-		 */
-		private IContentProposal[] proposals;
-
-		/*
-		 * Secondary popup used to show detailed information about the selected
-		 * proposal..
-		 */
-		private InfoPopupDialog infoPopup;
-
-		/*
-		 * Flag indicating whether there is a pending secondary popup update.
-		 */
-		private boolean pendingDescriptionUpdate = false;
-
-		/*
-		 * Filter text - tracked while popup is open, only if we are told to
-		 * filter
-		 */
-		private String filterText = EMPTY;
-
-		/**
-		 * Constructs a new instance of this popup, specifying the control for
-		 * which this popup is showing content, and how the proposals should be
-		 * obtained and displayed.
-		 * 
-		 * @param infoText
-		 *            Text to be shown in a lower info area, or
-		 *            <code>null</code> if there is no info area.
-		 */
-		ContentProposalPopup(String infoText, IContentProposal[] proposals) {
-			// IMPORTANT: Use of SWT.ON_TOP is critical here for ensuring
-			// that the target control retains focus on Mac and Linux. Without
-			// it, the focus will disappear, keystrokes will not go to the
-			// popup, and the popup closer will wrongly close the popup.
-			// On platforms where SWT.ON_TOP overrides SWT.RESIZE, we will live
-			// with this.
-			// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=126138
-			super(control.getShell(), SWT.RESIZE | SWT.ON_TOP, false, false, false,
-					false, false, null, infoText);
-			this.proposals = proposals;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.dialogs.PopupDialog#getForeground()
-		 */
-		protected Color getForeground() {
-			return JFaceResources.getColorRegistry().get(
-					JFacePreferences.CONTENT_ASSIST_FOREGROUND_COLOR);
-		}
-		
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.dialogs.PopupDialog#getBackground()
-		 */
-		protected Color getBackground() {
-			return JFaceResources.getColorRegistry().get(
-					JFacePreferences.CONTENT_ASSIST_BACKGROUND_COLOR);
-		}
-
-		/*
-		 * Creates the content area for the proposal popup. This creates a table
-		 * and places it inside the composite. The table will contain a list of
-		 * all the proposals.
-		 * 
-		 * @param parent The parent composite to contain the dialog area; must
-		 * not be <code>null</code>.
-		 */
-		protected final Control createDialogArea(final Composite parent) {
-			// Use virtual where appropriate (see flag definition).
-			if (USE_VIRTUAL) {
-				proposalTable = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL
-						| SWT.VIRTUAL);
-
-				Listener listener = new Listener() {
-					public void handleEvent(Event event) {
-						handleSetData(event);
-					}
-				};
-				proposalTable.addListener(SWT.SetData, listener);
-			} else {
-				proposalTable = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL);
-			}
-
-			// set the proposals to force population of the table.
-			setProposals(filterProposals(proposals, filterText));
-
-			proposalTable.setHeaderVisible(false);
-			proposalTable.addSelectionListener(new SelectionListener() {
-
-				public void widgetSelected(SelectionEvent e) {
-					// If a proposal has been selected, show it in the secondary
-					// popup. Otherwise close the popup.
-					if (e.item == null) {
-						if (infoPopup != null) {
-							infoPopup.close();
-						}
-					} else {
-						showProposalDescription();
-					}
-				}
-
-				// Default selection was made. Accept the current proposal.
-				public void widgetDefaultSelected(SelectionEvent e) {
-					acceptCurrentProposal();
-				}
-			});
-			return proposalTable;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.dialogs.PopupDialog.adjustBounds()
-		 */
-		protected void adjustBounds() {
-			// Get our control's location in display coordinates.
-			Point location = control.getDisplay().map(control.getParent(),
-					null, control.getLocation());
-			int initialX = location.x + POPUP_OFFSET;
-			int initialY = location.y + control.getSize().y + POPUP_OFFSET;
-			// If we are inserting content, use the cursor position to
-			// position the control.
-			if (getProposalAcceptanceStyle() == PROPOSAL_INSERT) {
-				Rectangle insertionBounds = controlContentAdapter
-						.getInsertionBounds(control);
-				initialX = initialX + insertionBounds.x;
-				initialY = location.y + insertionBounds.y
-						+ insertionBounds.height;
-			}
-
-			// If there is no specified size, force it by setting
-			// up a layout on the table.
-			if (popupSize == null) {
-				GridData data = new GridData(GridData.FILL_BOTH);
-				data.heightHint = proposalTable.getItemHeight()
-						* POPUP_CHAR_HEIGHT;
-				data.widthHint = Math.max(control.getSize().x,
-						POPUP_MINIMUM_WIDTH);
-				proposalTable.setLayoutData(data);
-				getShell().pack();
-				popupSize = getShell().getSize();
-			}
-			getShell().setBounds(initialX, initialY, popupSize.x, popupSize.y);
-
-			// Now set up a listener to monitor any changes in size.
-			getShell().addListener(SWT.Resize, new Listener() {
-				public void handleEvent(Event e) {
-					popupSize = getShell().getSize();
-					if (infoPopup != null) {
-						infoPopup.adjustBounds();
-					}
-				}
-			});
-		}
-
-		/*
-		 * Handle the set data event. Set the item data of the requested item to
-		 * the corresponding proposal in the proposal cache.
-		 */
-		private void handleSetData(Event event) {
-			TableItem item = (TableItem) event.item;
-			int index = proposalTable.indexOf(item);
-
-			if (0 <= index && index < proposals.length) {
-				IContentProposal current = proposals[index];
-				item.setText(getString(current));
-				item.setImage(getImage(current));
-				item.setData(current);
-			} else {
-				// this should not happen, but does on win32
-			}
-		}
-
-		/*
-		 * Caches the specified proposals and repopulates the table if it has
-		 * been created.
-		 */
-		private void setProposals(IContentProposal[] newProposals) {
-			if (newProposals == null || newProposals.length == 0) {
-				newProposals = getEmptyProposalArray();
-			}
-			this.proposals = newProposals;
-
-			// If there is a table
-			if (isValid()) {
-				final int newSize = newProposals.length;
-				if (USE_VIRTUAL) {
-					// Set and clear the virtual table. Data will be
-					// provided in the SWT.SetData event handler.
-					proposalTable.setItemCount(newSize);
-					proposalTable.clearAll();
-				} else {
-					// Populate the table manually
-					proposalTable.setRedraw(false);
-					proposalTable.setItemCount(newSize);
-					TableItem[] items = proposalTable.getItems();
-					for (int i = 0; i < items.length; i++) {
-						TableItem item = items[i];
-						IContentProposal proposal = newProposals[i];
-						item.setText(getString(proposal));
-						item.setImage(getImage(proposal));
-						item.setData(proposal);
-					}
-					proposalTable.setRedraw(true);
-				}
-				// Default to the first selection if there is content.
-				if (newProposals.length > 0) {
-					selectProposal(0);
-				} else {
-					// No selection, close the secondary popup if it was open
-					if (infoPopup != null) {
-						infoPopup.close();
-					}
-
-				}
-			}
-		}
-
-		/*
-		 * Get the string for the specified proposal. Always return a String of
-		 * some kind.
-		 */
-		private String getString(IContentProposal proposal) {
-			if (proposal == null) {
-				return EMPTY;
-			}
-			if (labelProvider == null) {
-				return proposal.getLabel() == null ? proposal.getContent()
-						: proposal.getLabel();
-			}
-			return labelProvider.getText(proposal);
-		}
-
-		/*
-		 * Get the image for the specified proposal. If there is no image
-		 * available, return null.
-		 */
-		private Image getImage(IContentProposal proposal) {
-			if (proposal == null || labelProvider == null) {
-				return null;
-			}
-			return labelProvider.getImage(proposal);
-		}
-
-		/*
-		 * Return an empty array. Used so that something always shows in the
-		 * proposal popup, even if no proposal provider was specified.
-		 */
-		private IContentProposal[] getEmptyProposalArray() {
-			return new IContentProposal[0];
-		}
-
-		/*
-		 * Answer true if the popup is valid, which means the table has been
-		 * created and not disposed.
-		 */
-		private boolean isValid() {
-			return proposalTable != null && !proposalTable.isDisposed();
-		}
-
-		/*
-		 * Return whether the receiver has focus. Since 3.4, this includes a
-		 * check for whether the info popup has focus.
-		 */
-		private boolean hasFocus() {
-			if (!isValid()) {
-				return false;
-			}
-			if (getShell().isFocusControl() || proposalTable.isFocusControl()) {
-				return true;
-			}
-			if (infoPopup != null && infoPopup.hasFocus()) {
-				return true;
-			}
-			return false;
-		}
-
-		/*
-		 * Return the current selected proposal.
-		 */
-		private IContentProposal getSelectedProposal() {
-			if (isValid()) {
-				int i = proposalTable.getSelectionIndex();
-				if (proposals == null || i < 0 || i >= proposals.length) {
-					return null;
-				}
-				return proposals[i];
-			}
-			return null;
-		}
-
-		/*
-		 * Select the proposal at the given index.
-		 */
-		private void selectProposal(int index) {
-			Assert
-					.isTrue(index >= 0,
-							"Proposal index should never be negative"); //$NON-NLS-1$
-			if (!isValid() || proposals == null || index >= proposals.length) {
-				return;
-			}
-			proposalTable.setSelection(index);
-			proposalTable.showSelection();
-
-			showProposalDescription();
-		}
-
-		/**
-		 * Opens this ContentProposalPopup. This method is extended in order to
-		 * add the control listener when the popup is opened and to invoke the
-		 * secondary popup if applicable.
-		 * 
-		 * @return the return code
-		 * 
-		 * @see org.eclipse.jface.window.Window#open()
-		 */
-		public int open() {
-			int value = super.open();
-			if (popupCloser == null) {
-				popupCloser = new PopupCloserListener();
-			}
-			popupCloser.installListeners();
-			IContentProposal p = getSelectedProposal();
-			if (p != null) {
-				showProposalDescription();
-			}
-			return value;
-		}
-
-		/**
-		 * Closes this popup. This method is extended to remove the control
-		 * listener.
-		 * 
-		 * @return <code>true</code> if the window is (or was already) closed,
-		 *         and <code>false</code> if it is still open
-		 */
-		public boolean close() {
-			popupCloser.removeListeners();
-			if (infoPopup != null) {
-				infoPopup.close();
-			}
-			boolean ret = super.close();
-			notifyPopupClosed();
-			return ret;
-		}
-
-		/*
-		 * Show the currently selected proposal's description in a secondary
-		 * popup.
-		 */
-		private void showProposalDescription() {
-			// If we do not already have a pending update, then
-			// create a thread now that will show the proposal description
-			if (!pendingDescriptionUpdate) {
-				// Create a thread that will sleep for the specified delay
-				// before creating the popup. We do not use Jobs since this
-				// code must be able to run independently of the Eclipse
-				// runtime.
-				Runnable runnable = new Runnable() {
-					public void run() {
-						pendingDescriptionUpdate = true;
-						try {
-							Thread.sleep(POPUP_DELAY);
-						} catch (InterruptedException e) {
-						}
-						if (!isValid()) {
-							return;
-						}
-						getShell().getDisplay().syncExec(new Runnable() {
-							public void run() {
-								// Query the current selection since we have
-								// been delayed
-								IContentProposal p = getSelectedProposal();
-								if (p != null) {
-									String description = p.getDescription();
-									if (description != null) {
-										if (infoPopup == null) {
-											infoPopup = new InfoPopupDialog(
-													getShell());
-											infoPopup.open();
-											infoPopup
-													.getShell()
-													.addDisposeListener(
-															new DisposeListener() {
-																public void widgetDisposed(
-																		DisposeEvent event) {
-																	infoPopup = null;
-																}
-															});
-										}
-										infoPopup.setContents(p
-												.getDescription());
-									} else if (infoPopup != null) {
-										infoPopup.close();
-									}
-									pendingDescriptionUpdate = false;
-
-								}
-							}
-						});
-					}
-				};
-				Thread t = new Thread(runnable);
-				t.start();
-			}
-		}
-
-		/*
-		 * Accept the current proposal.
-		 */
-		private void acceptCurrentProposal() {
-			// Close before accepting the proposal. This is important
-			// so that the cursor position can be properly restored at
-			// acceptance, which does not work without focus on some controls.
-			// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=127108
-			IContentProposal proposal = getSelectedProposal();
-			close();
-			proposalAccepted(proposal);
-		}
-
-		/*
-		 * Request the proposals from the proposal provider, and recompute any
-		 * caches. Repopulate the popup if it is open.
-		 */
-		private void recomputeProposals(String filterText) {
-			IContentProposal[] allProposals = getProposals();
-			// If the non-filtered proposal list is empty, we should
-			// close the popup.
-			// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=147377
-			if (allProposals.length == 0) {
-				proposals = allProposals;
-				close();
-			} else {
-				// Keep the popup open, but filter by any provided filter text
-				setProposals(filterProposals(allProposals, filterText));
-			}
-		}
-
-		/*
-		 * In an async block, request the proposals. This is used when clients
-		 * are in the middle of processing an event that affects the widget
-		 * content. By using an async, we ensure that the widget content is up
-		 * to date with the event.
-		 */
-		private void asyncRecomputeProposals(final String filterText) {
-			if (isValid()) {
-				control.getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						recordCursorPosition();
-						recomputeProposals(filterText);
-					}
-				});
-			} else {
-				recomputeProposals(filterText);
-			}
-		}
-
-		/*
-		 * Filter the provided list of content proposals according to the filter
-		 * text.
-		 */
-		private IContentProposal[] filterProposals(
-				IContentProposal[] proposals, String filterString) {
-			if (filterString.length() == 0) {
-				return proposals;
-			}
-
-			// Check each string for a match. Use the string displayed to the
-			// user, not the proposal content.
-			ArrayList list = new ArrayList();
-			for (int i = 0; i < proposals.length; i++) {
-				String string = getString(proposals[i]);
-				if (string.length() >= filterString.length()
-						&& string.substring(0, filterString.length())
-								.equalsIgnoreCase(filterString)) {
-					list.add(proposals[i]);
-				}
-
-			}
-			return (IContentProposal[]) list.toArray(new IContentProposal[list
-					.size()]);
-		}
-
-		Listener getTargetControlListener() {
-			if (targetControlListener == null) {
-				targetControlListener = new TargetControlListener();
-			}
-			return targetControlListener;
-		}
-	}
-
-	/**
-	 * Flag that controls the printing of debug info.
-	 */
-	public static final boolean DEBUG = false;
-
-	/**
-	 * Indicates that a chosen proposal should be inserted into the field.
-	 */
-	public static final int PROPOSAL_INSERT = 1;
-
-	/**
-	 * Indicates that a chosen proposal should replace the entire contents of
-	 * the field.
-	 */
-	public static final int PROPOSAL_REPLACE = 2;
-
-	/**
-	 * Indicates that the contents of the control should not be modified when a
-	 * proposal is chosen. This is typically used when a client needs more
-	 * specialized behavior when a proposal is chosen. In this case, clients
-	 * typically register an IContentProposalListener so that they are notified
-	 * when a proposal is chosen.
-	 */
-	public static final int PROPOSAL_IGNORE = 3;
-
-	/**
-	 * Indicates that there should be no filter applied as keys are typed in the
-	 * popup.
-	 */
-	public static final int FILTER_NONE = 1;
-
-	/**
-	 * Indicates that a single character filter applies as keys are typed in the
-	 * popup.
-	 */
-	public static final int FILTER_CHARACTER = 2;
-
-	/**
-	 * Indicates that a cumulative filter applies as keys are typed in the
-	 * popup. That is, each character typed will be added to the filter.
-	 * 
-	 * @deprecated As of 3.4, filtering that is sensitive to changes in the
-	 *             control content should be performed by the supplied
-	 *             {@link IContentProposalProvider}, such as that performed by
-	 *             {@link SimpleContentProposalProvider}
-	 */
-	public static final int FILTER_CUMULATIVE = 3;
-
-	/*
-	 * Set to <code>true</code> to use a Table with SWT.VIRTUAL. This is a
-	 * workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=98585#c40
-	 * The corresponding SWT bug is
-	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=90321
-	 */
-	private static final boolean USE_VIRTUAL = !Util.isMotif();
-
-	/*
-	 * The delay before showing a secondary popup.
-	 */
-	private static final int POPUP_DELAY = 750;
-
-	/*
-	 * The character height hint for the popup. May be overridden by using
-	 * setInitialPopupSize.
-	 */
-	private static final int POPUP_CHAR_HEIGHT = 10;
-
-	/*
-	 * The minimum pixel width for the popup. May be overridden by using
-	 * setInitialPopupSize.
-	 */
-	private static final int POPUP_MINIMUM_WIDTH = 300;
-
-	/*
-	 * The pixel offset of the popup from the bottom corner of the control.
-	 */
-	private static final int POPUP_OFFSET = 3;
-
-	/*
-	 * Empty string.
-	 */
-	private static final String EMPTY = ""; //$NON-NLS-1$
-
-	/*
-	 * The object that provides content proposals.
-	 */
-	private IContentProposalProvider proposalProvider;
-
-	/*
-	 * A label provider used to display proposals in the popup, and to extract
-	 * Strings from non-String proposals.
-	 */
-	private ILabelProvider labelProvider;
-
-	/*
-	 * The control for which content proposals are provided.
-	 */
-	private Control control;
-
-	/*
-	 * The adapter used to extract the String contents from an arbitrary
-	 * control.
-	 */
-	private IControlContentAdapter controlContentAdapter;
-
-	/*
-	 * The popup used to show proposals.
-	 */
-	private ContentProposalPopup popup;
-
-	/*
-	 * The keystroke that signifies content proposals should be shown.
-	 */
-	private KeyStroke triggerKeyStroke;
-
-	/*
-	 * The String containing characters that auto-activate the popup.
-	 */
-	private String autoActivateString;
-
-	/*
-	 * Integer that indicates how an accepted proposal should affect the
-	 * control. One of PROPOSAL_IGNORE, PROPOSAL_INSERT, or PROPOSAL_REPLACE.
-	 * Default value is PROPOSAL_INSERT.
-	 */
-	private int proposalAcceptanceStyle = PROPOSAL_INSERT;
-
-	/*
-	 * A boolean that indicates whether key events received while the proposal
-	 * popup is open should also be propagated to the control. Default value is
-	 * true.
-	 */
-	private boolean propagateKeys = true;
-
-	/*
-	 * Integer that indicates the filtering style. One of FILTER_CHARACTER,
-	 * FILTER_CUMULATIVE, FILTER_NONE.
-	 */
-	private int filterStyle = FILTER_NONE;
-
-	/*
-	 * The listener we install on the control.
-	 */
-	private Listener controlListener;
-
-	/*
-	 * The list of IContentProposalListener listeners.
-	 */
-	private ListenerList proposalListeners = new ListenerList();
-
-	/*
-	 * The list of IContentProposalListener2 listeners.
-	 */
-	private ListenerList proposalListeners2 = new ListenerList();
-
-	/*
-	 * Flag that indicates whether the adapter is enabled. In some cases,
-	 * adapters may be installed but depend upon outside state.
-	 */
-	private boolean isEnabled = true;
-
-	/*
-	 * The delay in milliseconds used when autoactivating the popup.
-	 */
-	private int autoActivationDelay = 0;
-
-	/*
-	 * A boolean indicating whether a keystroke has been received. Used to see
-	 * if an autoactivation delay was interrupted by a keystroke.
-	 */
-	private boolean receivedKeyDown;
-
-	/*
-	 * The desired size in pixels of the proposal popup.
-	 */
-	private Point popupSize;
-
-	/*
-	 * The remembered position of the insertion position. Not all controls will
-	 * restore the insertion position if the proposal popup gets focus, so we
-	 * need to remember it.
-	 */
-	private int insertionPos = -1;
-
-	/*
-	 * The remembered selection range. Not all controls will restore the
-	 * selection position if the proposal popup gets focus, so we need to
-	 * remember it.
-	 */
-	private Point selectionRange = new Point(-1, -1);
-
-	/*
-	 * A flag that indicates that we are watching modify events
-	 */
-	private boolean watchModify = false;
-
-	/**
-	 * Construct a content proposal adapter that can assist the user with
-	 * choosing content for the field.
-	 * 
-	 * @param control
-	 *            the control for which the adapter is providing content assist.
-	 *            May not be <code>null</code>.
-	 * @param controlContentAdapter
-	 *            the <code>IControlContentAdapter</code> used to obtain and
-	 *            update the control's contents as proposals are accepted. May
-	 *            not be <code>null</code>.
-	 * @param proposalProvider
-	 *            the <code>IContentProposalProvider</code> used to obtain
-	 *            content proposals for this control, or <code>null</code> if
-	 *            no content proposal is available.
-	 * @param keyStroke
-	 *            the keystroke that will invoke the content proposal popup. If
-	 *            this value is <code>null</code>, then proposals will be
-	 *            activated automatically when any of the auto activation
-	 *            characters are typed.
-	 * @param autoActivationCharacters
-	 *            An array of characters that trigger auto-activation of content
-	 *            proposal. If specified, these characters will trigger
-	 *            auto-activation of the proposal popup, regardless of whether
-	 *            an explicit invocation keyStroke was specified. If this
-	 *            parameter is <code>null</code>, then only a specified
-	 *            keyStroke will invoke content proposal. If this parameter is
-	 *            <code>null</code> and the keyStroke parameter is
-	 *            <code>null</code>, then all alphanumeric characters will
-	 *            auto-activate content proposal.
-	 */
-	public ContentProposalAdapter(Control control,
-			IControlContentAdapter controlContentAdapter,
-			IContentProposalProvider proposalProvider, KeyStroke keyStroke,
-			char[] autoActivationCharacters) {
-		super();
-		// We always assume the control and content adapter are valid.
-		Assert.isNotNull(control);
-		Assert.isNotNull(controlContentAdapter);
-		this.control = control;
-		this.controlContentAdapter = controlContentAdapter;
-
-		// The rest of these may be null
-		this.proposalProvider = proposalProvider;
-		this.triggerKeyStroke = keyStroke;
-		if (autoActivationCharacters != null) {
-			this.autoActivateString = new String(autoActivationCharacters);
-		}
-		addControlListener(control);
-	}
-
-	/**
-	 * Get the control on which the content proposal adapter is installed.
-	 * 
-	 * @return the control on which the proposal adapter is installed.
-	 */
-	public Control getControl() {
-		return control;
-	}
-
-	/**
-	 * Get the label provider that is used to show proposals.
-	 * 
-	 * @return the {@link ILabelProvider} used to show proposals, or
-	 *         <code>null</code> if one has not been installed.
-	 */
-	public ILabelProvider getLabelProvider() {
-		return labelProvider;
-	}
-
-	/**
-	 * Return a boolean indicating whether the receiver is enabled.
-	 * 
-	 * @return <code>true</code> if the adapter is enabled, and
-	 *         <code>false</code> if it is not.
-	 */
-	public boolean isEnabled() {
-		return isEnabled;
-	}
-
-	/**
-	 * Set the label provider that is used to show proposals. The lifecycle of
-	 * the specified label provider is not managed by this adapter. Clients must
-	 * dispose the label provider when it is no longer needed.
-	 * 
-	 * @param labelProvider
-	 *            the (@link ILabelProvider} used to show proposals.
-	 */
-	public void setLabelProvider(ILabelProvider labelProvider) {
-		this.labelProvider = labelProvider;
-	}
-
-	/**
-	 * Return the proposal provider that provides content proposals given the
-	 * current content of the field. A value of <code>null</code> indicates
-	 * that there are no content proposals available for the field.
-	 * 
-	 * @return the {@link IContentProposalProvider} used to show proposals. May
-	 *         be <code>null</code>.
-	 */
-	public IContentProposalProvider getContentProposalProvider() {
-		return proposalProvider;
-	}
-
-	/**
-	 * Set the content proposal provider that is used to show proposals.
-	 * 
-	 * @param proposalProvider
-	 *            the {@link IContentProposalProvider} used to show proposals
-	 */
-	public void setContentProposalProvider(
-			IContentProposalProvider proposalProvider) {
-		this.proposalProvider = proposalProvider;
-	}
-
-	/**
-	 * Return the array of characters on which the popup is autoactivated.
-	 * 
-	 * @return An array of characters that trigger auto-activation of content
-	 *         proposal. If specified, these characters will trigger
-	 *         auto-activation of the proposal popup, regardless of whether an
-	 *         explicit invocation keyStroke was specified. If this parameter is
-	 *         <code>null</code>, then only a specified keyStroke will invoke
-	 *         content proposal. If this value is <code>null</code> and the
-	 *         keyStroke value is <code>null</code>, then all alphanumeric
-	 *         characters will auto-activate content proposal.
-	 */
-	public char[] getAutoActivationCharacters() {
-		if (autoActivateString == null) {
-			return null;
-		}
-		return autoActivateString.toCharArray();
-	}
-
-	/**
-	 * Set the array of characters that will trigger autoactivation of the
-	 * popup.
-	 * 
-	 * @param autoActivationCharacters
-	 *            An array of characters that trigger auto-activation of content
-	 *            proposal. If specified, these characters will trigger
-	 *            auto-activation of the proposal popup, regardless of whether
-	 *            an explicit invocation keyStroke was specified. If this
-	 *            parameter is <code>null</code>, then only a specified
-	 *            keyStroke will invoke content proposal. If this parameter is
-	 *            <code>null</code> and the keyStroke value is
-	 *            <code>null</code>, then all alphanumeric characters will
-	 *            auto-activate content proposal.
-	 * 
-	 */
-	public void setAutoActivationCharacters(char[] autoActivationCharacters) {
-		if (autoActivationCharacters == null) {
-			this.autoActivateString = null;
-		} else {
-			this.autoActivateString = new String(autoActivationCharacters);
-		}
-	}
-
-	/**
-	 * Set the delay, in milliseconds, used before any autoactivation is
-	 * triggered.
-	 * 
-	 * @return the time in milliseconds that will pass before a popup is
-	 *         automatically opened
-	 */
-	public int getAutoActivationDelay() {
-		return autoActivationDelay;
-
-	}
-
-	/**
-	 * Set the delay, in milliseconds, used before autoactivation is triggered.
-	 * 
-	 * @param delay
-	 *            the time in milliseconds that will pass before a popup is
-	 *            automatically opened
-	 */
-	public void setAutoActivationDelay(int delay) {
-		autoActivationDelay = delay;
-
-	}
-
-	/**
-	 * Get the integer style that indicates how an accepted proposal affects the
-	 * control's content.
-	 * 
-	 * @return a constant indicating how an accepted proposal should affect the
-	 *         control's content. Should be one of <code>PROPOSAL_INSERT</code>,
-	 *         <code>PROPOSAL_REPLACE</code>, or <code>PROPOSAL_IGNORE</code>.
-	 *         (Default is <code>PROPOSAL_INSERT</code>).
-	 */
-	public int getProposalAcceptanceStyle() {
-		return proposalAcceptanceStyle;
-	}
-
-	/**
-	 * Set the integer style that indicates how an accepted proposal affects the
-	 * control's content.
-	 * 
-	 * @param acceptance
-	 *            a constant indicating how an accepted proposal should affect
-	 *            the control's content. Should be one of
-	 *            <code>PROPOSAL_INSERT</code>, <code>PROPOSAL_REPLACE</code>,
-	 *            or <code>PROPOSAL_IGNORE</code>
-	 */
-	public void setProposalAcceptanceStyle(int acceptance) {
-		proposalAcceptanceStyle = acceptance;
-	}
-
-	/**
-	 * Return the integer style that indicates how keystrokes affect the content
-	 * of the proposal popup while it is open.
-	 * 
-	 * @return a constant indicating how keystrokes in the proposal popup affect
-	 *         filtering of the proposals shown. <code>FILTER_NONE</code>
-	 *         specifies that no filtering will occur in the content proposal
-	 *         list as keys are typed. <code>FILTER_CHARACTER</code> specifies
-	 *         the content of the popup will be filtered by the most recently
-	 *         typed character. <code>FILTER_CUMULATIVE</code> is deprecated
-	 *         and no longer recommended. It specifies that the content of the
-	 *         popup will be filtered by a string containing all the characters
-	 *         typed since the popup has been open. The default is
-	 *         <code>FILTER_NONE</code>.
-	 */
-	public int getFilterStyle() {
-		return filterStyle;
-	}
-
-	/**
-	 * Set the integer style that indicates how keystrokes affect the content of
-	 * the proposal popup while it is open. Popup-based filtering is useful for
-	 * narrowing and navigating the list of proposals provided once the popup is
-	 * open. Filtering of the proposals will occur even when the control content
-	 * is not affected by user typing. Note that automatic filtering is not used
-	 * to achieve content-sensitive filtering such as auto-completion. Filtering
-	 * that is sensitive to changes in the control content should be performed
-	 * by the supplied {@link IContentProposalProvider}.
-	 * 
-	 * @param filterStyle
-	 *            a constant indicating how keystrokes received in the proposal
-	 *            popup affect filtering of the proposals shown.
-	 *            <code>FILTER_NONE</code> specifies that no automatic
-	 *            filtering of the content proposal list will occur as keys are
-	 *            typed in the popup. <code>FILTER_CHARACTER</code> specifies
-	 *            that the content of the popup will be filtered by the most
-	 *            recently typed character. <code>FILTER_CUMULATIVE</code> is
-	 *            deprecated and no longer recommended. It specifies that the
-	 *            content of the popup will be filtered by a string containing
-	 *            all the characters typed since the popup has been open.
-	 */
-	public void setFilterStyle(int filterStyle) {
-		this.filterStyle = filterStyle;
-	}
-
-	/**
-	 * Return the size, in pixels, of the content proposal popup.
-	 * 
-	 * @return a Point specifying the last width and height, in pixels, of the
-	 *         content proposal popup.
-	 */
-	public Point getPopupSize() {
-		return popupSize;
-	}
-
-	/**
-	 * Set the size, in pixels, of the content proposal popup. This size will be
-	 * used the next time the content proposal popup is opened.
-	 * 
-	 * @param size
-	 *            a Point specifying the desired width and height, in pixels, of
-	 *            the content proposal popup.
-	 */
-	public void setPopupSize(Point size) {
-		popupSize = size;
-	}
-
-	/**
-	 * Get the boolean that indicates whether key events (including
-	 * auto-activation characters) received by the content proposal popup should
-	 * also be propagated to the adapted control when the proposal popup is
-	 * open.
-	 * 
-	 * @return a boolean that indicates whether key events (including
-	 *         auto-activation characters) should be propagated to the adapted
-	 *         control when the proposal popup is open. Default value is
-	 *         <code>true</code>.
-	 */
-	public boolean getPropagateKeys() {
-		return propagateKeys;
-	}
-
-	/**
-	 * Set the boolean that indicates whether key events (including
-	 * auto-activation characters) received by the content proposal popup should
-	 * also be propagated to the adapted control when the proposal popup is
-	 * open.
-	 * 
-	 * @param propagateKeys
-	 *            a boolean that indicates whether key events (including
-	 *            auto-activation characters) should be propagated to the
-	 *            adapted control when the proposal popup is open.
-	 */
-	public void setPropagateKeys(boolean propagateKeys) {
-		this.propagateKeys = propagateKeys;
-	}
-
-	/**
-	 * Return the content adapter that can get or retrieve the text contents
-	 * from the adapter's control. This method is used when a client, such as a
-	 * content proposal listener, needs to update the control's contents
-	 * manually.
-	 * 
-	 * @return the {@link IControlContentAdapter} which can update the control
-	 *         text.
-	 */
-	public IControlContentAdapter getControlContentAdapter() {
-		return controlContentAdapter;
-	}
-
-	/**
-	 * Set the boolean flag that determines whether the adapter is enabled.
-	 * 
-	 * @param enabled
-	 *            <code>true</code> if the adapter is enabled and responding
-	 *            to user input, <code>false</code> if it is ignoring user
-	 *            input.
-	 * 
-	 */
-	public void setEnabled(boolean enabled) {
-		// If we are disabling it while it's proposing content, close the
-		// content proposal popup.
-		if (isEnabled && !enabled) {
-			if (popup != null) {
-				popup.close();
-			}
-		}
-		isEnabled = enabled;
-	}
-
-	/**
-	 * Add the specified listener to the list of content proposal listeners that
-	 * are notified when content proposals are chosen.
-	 * </p>
-	 * 
-	 * @param listener
-	 *            the IContentProposalListener to be added as a listener. Must
-	 *            not be <code>null</code>. If an attempt is made to register
-	 *            an instance which is already registered with this instance,
-	 *            this method has no effect.
-	 * 
-	 * @see org.eclipse.jface.fieldassist.IContentProposalListener
-	 */
-	public void addContentProposalListener(IContentProposalListener listener) {
-		proposalListeners.add(listener);
-	}
-
-	/**
-	 * Removes the specified listener from the list of content proposal
-	 * listeners that are notified when content proposals are chosen.
-	 * </p>
-	 * 
-	 * @param listener
-	 *            the IContentProposalListener to be removed as a listener. Must
-	 *            not be <code>null</code>. If the listener has not already
-	 *            been registered, this method has no effect.
-	 * 
-	 * @since 3.3
-	 * @see org.eclipse.jface.fieldassist.IContentProposalListener
-	 */
-	public void removeContentProposalListener(IContentProposalListener listener) {
-		proposalListeners.remove(listener);
-	}
-
-	/**
-	 * Add the specified listener to the list of content proposal listeners that
-	 * are notified when a content proposal popup is opened or closed.
-	 * </p>
-	 * 
-	 * @param listener
-	 *            the IContentProposalListener2 to be added as a listener. Must
-	 *            not be <code>null</code>. If an attempt is made to register
-	 *            an instance which is already registered with this instance,
-	 *            this method has no effect.
-	 * 
-	 * @since 3.3
-	 * @see org.eclipse.jface.fieldassist.IContentProposalListener2
-	 */
-	public void addContentProposalListener(IContentProposalListener2 listener) {
-		proposalListeners2.add(listener);
-	}
-
-	/**
-	 * Remove the specified listener from the list of content proposal listeners
-	 * that are notified when a content proposal popup is opened or closed.
-	 * </p>
-	 * 
-	 * @param listener
-	 *            the IContentProposalListener2 to be removed as a listener.
-	 *            Must not be <code>null</code>. If the listener has not
-	 *            already been registered, this method has no effect.
-	 * 
-	 * @since 3.3
-	 * @see org.eclipse.jface.fieldassist.IContentProposalListener2
-	 */
-	public void removeContentProposalListener(IContentProposalListener2 listener) {
-		proposalListeners2.remove(listener);
-	}
-
-	/*
-	 * Add our listener to the control. Debug information to be left in until
-	 * this support is stable on all platforms.
-	 */
-	private void addControlListener(Control control) {
-		if (DEBUG) {
-			System.out
-					.println("ContentProposalListener#installControlListener()"); //$NON-NLS-1$
-		}
-
-		if (controlListener != null) {
-			return;
-		}
-		controlListener = new Listener() {
-			public void handleEvent(Event e) {
-				if (!isEnabled) {
-					return;
-				}
-
-				switch (e.type) {
-				case SWT.Traverse:
-				case SWT.KeyDown:
-					if (DEBUG) {
-						StringBuffer sb;
-						if (e.type == SWT.Traverse) {
-							sb = new StringBuffer("Traverse"); //$NON-NLS-1$
-						} else {
-							sb = new StringBuffer("KeyDown"); //$NON-NLS-1$
-						}
-						sb.append(" received by adapter"); //$NON-NLS-1$
-						dump(sb.toString(), e);
-					}
-					// If the popup is open, it gets first shot at the
-					// keystroke and should set the doit flags appropriately.
-					if (popup != null) {
-						popup.getTargetControlListener().handleEvent(e);
-						if (DEBUG) {
-							StringBuffer sb;
-							if (e.type == SWT.Traverse) {
-								sb = new StringBuffer("Traverse"); //$NON-NLS-1$
-							} else {
-								sb = new StringBuffer("KeyDown"); //$NON-NLS-1$
-							}
-							sb.append(" after being handled by popup"); //$NON-NLS-1$
-							dump(sb.toString(), e);
-						}
-						// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=192633
-						// If the popup is open and this is a valid character, we
-						// want to watch for the modified text.
-						if (propagateKeys && e.character != 0)
-							watchModify = true;
-
-						return;
-					}
-
-					// We were only listening to traverse events for the popup
-					if (e.type == SWT.Traverse) {
-						return;
-					}
-
-					// The popup is not open. We are looking at keydown events
-					// for a trigger to open the popup.
-					if (triggerKeyStroke != null) {
-						// Either there are no modifiers for the trigger and we
-						// check the character field...
-						if ((triggerKeyStroke.getModifierKeys() == KeyStroke.NO_KEY && triggerKeyStroke
-								.getNaturalKey() == e.character)
-								||
-								// ...or there are modifiers, in which case the
-								// keycode and state must match
-								(triggerKeyStroke.getNaturalKey() == e.keyCode && ((triggerKeyStroke
-										.getModifierKeys() & e.stateMask) == triggerKeyStroke
-										.getModifierKeys()))) {
-							// We never propagate the keystroke for an explicit
-							// keystroke invocation of the popup
-							e.doit = false;
-							openProposalPopup(false);
-							return;
-						}
-					}
-					/*
-					 * The triggering keystroke was not invoked. If a character
-					 * was typed, compare it to the autoactivation characters.
-					 */
-					if (e.character != 0) {
-						if (autoActivateString != null) {
-							if (autoActivateString.indexOf(e.character) >= 0) {
-								autoActivate();
-							} else {
-								// No autoactivation occurred, so record the key
-								// down as a means to interrupt any
-								// autoactivation that is pending due to
-								// autoactivation delay.
-								receivedKeyDown = true;
-								// watch the modify so we can close the popup in
-								// cases where there is no longer a trigger
-								// character in the content
-								watchModify = true;
-							}
-						} else {
-							// The autoactivate string is null. If the trigger
-							// is also null, we want to act on any modification
-							// to the content. Set a flag so we'll catch this
-							// in the modify event.
-							if (triggerKeyStroke == null) {
-								watchModify = true;
-							}
-						}
-					}
-					break;
-
-
-					// There are times when we want to monitor content changes
-					// rather than individual keystrokes to determine whether
-					// the popup should be closed or opened based on the entire
-					// content of the control.
-					// The watchModify flag ensures that we don't autoactivate if
-					// the content change was caused by something other than typing.
-					// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=183650
-					case SWT.Modify:
-						if (triggerKeyStroke == null && watchModify) {
-							if (DEBUG) {
-								dump("Modify event triggers popup open or close", e); //$NON-NLS-1$
-							}
-							watchModify = false;
-							// We are in autoactivation mode, either for specific
-							// characters or for all characters. In either case, 
-							// we should close the proposal popup
-							// if there is no content in the control.
-							if (isControlContentEmpty()) {
-								// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=192633
-								closeProposalPopup();
-							} else {
-								// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=147377
-								// Given that we will close the popup when there are
-								// no valid proposals, we must consider reopening it on any
-								// content change when there are no particular autoActivation
-								// characters
-								if (autoActivateString == null) {
-									autoActivate();
-								} else {
-									// Autoactivation characters are defined, but this
-									// modify event does not involve one of them.  See
-									// if any of the autoactivation characters are left
-									// in the content and close the popup if none remain.
-									if (!controlContentContainsAutoActivationCharacter())
-										closeProposalPopup();
-								}
-							}
-						}
-						break;
-				default:
-					break;
-				}
-			}
-
-			/**
-			 * Dump the given events to "standard" output.
-			 * 
-			 * @param who
-			 *            who is dumping the event
-			 * @param e
-			 *            the event
-			 */
-			private void dump(String who, Event e) {
-				StringBuffer sb = new StringBuffer(
-						"--- [ContentProposalAdapter]\n"); //$NON-NLS-1$
-				sb.append(who);
-				sb.append(" - e: keyCode=" + e.keyCode + hex(e.keyCode)); //$NON-NLS-1$
-				sb.append("; character=" + e.character + hex(e.character)); //$NON-NLS-1$
-				sb.append("; stateMask=" + e.stateMask + hex(e.stateMask)); //$NON-NLS-1$
-				sb.append("; doit=" + e.doit); //$NON-NLS-1$
-				sb.append("; detail=" + e.detail + hex(e.detail)); //$NON-NLS-1$
-				sb.append("; widget=" + e.widget); //$NON-NLS-1$
-				System.out.println(sb);
-			}
-
-			private String hex(int i) {
-				return "[0x" + Integer.toHexString(i) + ']'; //$NON-NLS-1$
-			}
-		};
-		control.addListener(SWT.KeyDown, controlListener);
-		control.addListener(SWT.Traverse, controlListener);
-		control.addListener(SWT.Modify, controlListener);
-
-		if (DEBUG) {
-			System.out
-					.println("ContentProposalAdapter#installControlListener() - installed"); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Open the proposal popup and display the proposals provided by the
-	 * proposal provider. If there are no proposals to be shown, do not show the
-	 * popup. This method returns immediately. That is, it does not wait for the
-	 * popup to open or a proposal to be selected.
-	 * 
-	 * @param autoActivated
-	 *            a boolean indicating whether the popup was autoactivated. If
-	 *            false, a beep will sound when no proposals can be shown.
-	 */
-	private void openProposalPopup(boolean autoActivated) {
-		if (isValid()) {
-			if (popup == null) {
-				// Check whether there are any proposals to be shown.
-				recordCursorPosition(); // must be done before getting proposals
-				IContentProposal[] proposals = getProposals();
-				if (proposals.length > 0) {
-					if (DEBUG) {
-						System.out.println("POPUP OPENED BY PRECEDING EVENT"); //$NON-NLS-1$
-					}
-					recordCursorPosition();
-					popup = new ContentProposalPopup(null, proposals);
-					popup.open();
-					popup.getShell().addDisposeListener(new DisposeListener() {
-						public void widgetDisposed(DisposeEvent event) {
-							popup = null;
-						}
-					});
-					internalPopupOpened();
-					notifyPopupOpened();
-				} else if (!autoActivated) {
-					getControl().getDisplay().beep();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Open the proposal popup and display the proposals provided by the
-	 * proposal provider. This method returns immediately. That is, it does not
-	 * wait for a proposal to be selected. This method is used by subclasses to
-	 * explicitly invoke the opening of the popup. If there are no proposals to
-	 * show, the popup will not open and a beep will be sounded.
-	 */
-	protected void openProposalPopup() {
-		openProposalPopup(false);
-	}
-
-	/**
-	 * Close the proposal popup without accepting a proposal. This method
-	 * returns immediately, and has no effect if the proposal popup was not
-	 * open. This method is used by subclasses to explicitly close the popup
-	 * based on additional logic.
-	 * 
-	 * @since 3.3
-	 */
-	protected void closeProposalPopup() {
-		if (popup != null) {
-			popup.close();
-		}
-	}
-
-	/*
-	 * A content proposal has been accepted. Update the control contents
-	 * accordingly and notify any listeners.
-	 * 
-	 * @param proposal the accepted proposal
-	 */
-	private void proposalAccepted(IContentProposal proposal) {
-		switch (proposalAcceptanceStyle) {
-		case (PROPOSAL_REPLACE):
-			setControlContent(proposal.getContent(), proposal
-					.getCursorPosition());
-			break;
-		case (PROPOSAL_INSERT):
-			insertControlContent(proposal.getContent(), proposal
-					.getCursorPosition());
-			break;
-		default:
-			// do nothing. Typically a listener is installed to handle this in
-			// a custom way.
-			break;
-		}
-
-		// In all cases, notify listeners of an accepted proposal.
-		notifyProposalAccepted(proposal);
-	}
-
-	/*
-	 * Set the text content of the control to the specified text, setting the
-	 * cursorPosition at the desired location within the new contents.
-	 */
-	private void setControlContent(String text, int cursorPosition) {
-		if (isValid()) {
-			// should already be false, but just in case.
-			watchModify = false;
-			controlContentAdapter.setControlContents(control, text,
-					cursorPosition);
-		}
-	}
-
-	/*
-	 * Insert the specified text into the control content, setting the
-	 * cursorPosition at the desired location within the new contents.
-	 */
-	private void insertControlContent(String text, int cursorPosition) {
-		if (isValid()) {
-			// should already be false, but just in case.
-			watchModify = false;
-			// Not all controls preserve their selection index when they lose
-			// focus, so we must set it explicitly here to what it was before
-			// the popup opened.
-			// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=127108
-			// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=139063
-			if (controlContentAdapter instanceof IControlContentAdapter2
-					&& selectionRange.x != -1) {
-				((IControlContentAdapter2) controlContentAdapter).setSelection(
-						control, selectionRange);
-			} else if (insertionPos != -1) {
-				controlContentAdapter.setCursorPosition(control, insertionPos);
-			}
-			controlContentAdapter.insertControlContents(control, text,
-					cursorPosition);
-		}
-	}
-
-	/*
-	 * Check that the control and content adapter are valid.
-	 */
-	private boolean isValid() {
-		return control != null && !control.isDisposed()
-				&& controlContentAdapter != null;
-	}
-
-	/*
-	 * Record the control's cursor position.
-	 */
-	private void recordCursorPosition() {
-		if (isValid()) {
-			IControlContentAdapter adapter = getControlContentAdapter();
-			insertionPos = adapter.getCursorPosition(control);
-			// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=139063
-			if (adapter instanceof IControlContentAdapter2) {
-				selectionRange = ((IControlContentAdapter2) adapter)
-						.getSelection(control);
-			}
-
-		}
-	}
-
-	/*
-	 * Get the proposals from the proposal provider. Gets all of the proposals
-	 * without doing any filtering.
-	 */
-	private IContentProposal[] getProposals() {
-		if (proposalProvider == null || !isValid()) {
-			return null;
-		}
-		if (DEBUG) {
-			System.out.println(">>> obtaining proposals from provider"); //$NON-NLS-1$
-		}
-		int position = insertionPos;
-		if (position == -1) {
-			position = getControlContentAdapter().getCursorPosition(
-					getControl());
-		}
-		String contents = getControlContentAdapter().getControlContents(
-				getControl());
-		IContentProposal[] proposals = proposalProvider.getProposals(contents,
-				position);
-		return proposals;
-	}
-
-	/**
-	 * Autoactivation has been triggered. Open the popup using any specified
-	 * delay.
-	 */
-	private void autoActivate() {
-		if (autoActivationDelay > 0) {
-			Runnable runnable = new Runnable() {
-				public void run() {
-					receivedKeyDown = false;
-					try {
-						Thread.sleep(autoActivationDelay);
-					} catch (InterruptedException e) {
-					}
-					if (!isValid() || receivedKeyDown) {
-						return;
-					}
-					getControl().getDisplay().syncExec(new Runnable() {
-						public void run() {
-							openProposalPopup(true);
-						}
-					});
-				}
-			};
-			Thread t = new Thread(runnable);
-			t.start();
-		} else {
-			// Since we do not sleep, we must open the popup
-			// in an async exec. This is necessary because
-			// this method may be called in the middle of handling
-			// some event that will cause the cursor position or
-			// other important info to change as a result of this
-			// event occurring.
-			getControl().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					if (isValid()) {
-						openProposalPopup(true);
-					}
-				}
-			});
-		}
-	}
-
-	/*
-	 * A proposal has been accepted. Notify interested listeners.
-	 */
-	private void notifyProposalAccepted(IContentProposal proposal) {
-		if (DEBUG) {
-			System.out.println("Notify listeners - proposal accepted."); //$NON-NLS-1$
-		}
-		final Object[] listenerArray = proposalListeners.getListeners();
-		for (int i = 0; i < listenerArray.length; i++) {
-			((IContentProposalListener) listenerArray[i])
-					.proposalAccepted(proposal);
-		}
-	}
-
-	/*
-	 * The proposal popup has opened. Notify interested listeners.
-	 */
-	private void notifyPopupOpened() {
-		if (DEBUG) {
-			System.out.println("Notify listeners - popup opened."); //$NON-NLS-1$
-		}
-		final Object[] listenerArray = proposalListeners2.getListeners();
-		for (int i = 0; i < listenerArray.length; i++) {
-			((IContentProposalListener2) listenerArray[i])
-					.proposalPopupOpened(this);
-		}
-	}
-
-	/*
-	 * The proposal popup has closed. Notify interested listeners.
-	 */
-	private void notifyPopupClosed() {
-		if (DEBUG) {
-			System.out.println("Notify listeners - popup closed."); //$NON-NLS-1$
-		}
-		final Object[] listenerArray = proposalListeners2.getListeners();
-		for (int i = 0; i < listenerArray.length; i++) {
-			((IContentProposalListener2) listenerArray[i])
-					.proposalPopupClosed(this);
-		}
-	}
-
-	/**
-	 * Returns whether the content proposal popup has the focus. This includes
-	 * both the primary popup and any secondary info popup that may have focus.
-	 * 
-	 * @return <code>true</code> if the proposal popup or its secondary info
-	 *         popup has the focus
-	 * @since 3.4
-	 */
-	public boolean hasProposalPopupFocus() {
-		return popup != null && popup.hasFocus();
-	}
-
-	/*
-	 * Return whether the control content is empty
-	 */
-	private boolean isControlContentEmpty() {
-		return getControlContentAdapter().getControlContents(getControl())
-				.length() == 0;
-	}
-	
-	/*
-	 * The popup has just opened, but listeners have not yet
-	 * been notified.  Perform any cleanup that is needed.
-	 */
-	private void internalPopupOpened() {
-		// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=243612
-		if (control instanceof Combo) {
-			((Combo)control).setListVisible(false);
-		}
-	}
-	
-	/*
-	 * Return whether the control content contains explicit auto
-	 * activation characters.  Used to determine whether the popup
-	 * should be closed when no auto activation characters remain.
-	 * Note that this method does *not* return true if autoactivation
-	 * should occur on any character.  In other words, this method
-	 * should not be used to determine whether autoactivation should
-	 * occur at all.
-	 */
-	private boolean controlContentContainsAutoActivationCharacter() {
-		if (autoActivateString == null || autoActivateString.length() == 0)
-			return false;
-		String content = getControlContentAdapter().getControlContents(getControl());
-		for (int i=0; i<autoActivateString.length(); i++) {
-			if (content.indexOf(autoActivateString.charAt(i)) >= 0)
-				return true;
-		}
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/ControlDecoration.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/ControlDecoration.java
deleted file mode 100644
index cca32b8..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/ControlDecoration.java
+++ /dev/null
@@ -1,1226 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.MenuDetectEvent;
-import org.eclipse.swt.events.MenuDetectListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.graphics.Region;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * ControlDecoration renders an image decoration near a control. It allows
- * clients to specify an image and a position for the image relative to the
- * control. A ControlDecoration may be assigned description text, which can
- * optionally be shown when the user hovers over the image. Clients can decorate
- * any kind of control.
- * <p>
- * Decoration images always appear on the left or right side of the field, never
- * above or below it. Decorations can be positioned at the top, center, or
- * bottom of either side of the control. Future implementations may provide
- * additional positioning options for decorations.
- * <p>
- * ControlDecoration renders the image adjacent to the specified (already
- * created) control, with no guarantee that it won't be clipped or otherwise
- * obscured or overlapped by adjacent controls, including another
- * ControlDecoration placed in the same location. Clients should ensure that
- * there is adequate space adjacent to the control to show the decoration
- * properly.
- * <p>
- * Clients using ControlDecoration should typically ensure that enough margin
- * space is reserved for a decoration by altering the layout data margins,
- * although this is not assumed or required by the ControlDecoration
- * implementation.
- * <p>
- * This class is intended to be instantiated and used by clients. It is not
- * intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- * @see FieldDecoration
- * @see FieldDecorationRegistry
- */
-public class ControlDecoration {
-	/**
-	 * Debug flag for tracing
-	 */
-	private static boolean DEBUG = false;
-
-	/**
-	 * Cached platform flags for dealing with platform-specific issues.
-	 */
-	private static boolean CARBON = Util.isCarbon();
-
-	/**
-	 * The associated control
-	 */
-	private Control control;
-
-	/**
-	 * The composite on which to render the decoration and hook mouse events, or
-	 * null if we are hooking all parent composites.
-	 */
-	private Composite composite;
-
-	/**
-	 * The associated image.
-	 */
-	private Image image;
-
-	/**
-	 * The associated description text.
-	 */
-	private String descriptionText;
-	/**
-	 * The position of the decoration.
-	 */
-	private int position;
-
-	/**
-	 * The decoration's visibility flag
-	 */
-	private boolean visible = true;
-
-	/**
-	 * Boolean indicating whether the decoration should only be shown when the
-	 * control has focus
-	 */
-	private boolean showOnlyOnFocus = false;
-
-	/**
-	 * Boolean indicating whether the decoration should show its description
-	 * text in a hover when the user hovers over the decoration.
-	 */
-	private boolean showHover = true;
-
-	/**
-	 * Margin width used between the decorator and the control.
-	 */
-	private int marginWidth = 0;
-
-	/**
-	 * Registered selection listeners.
-	 */
-	private ListenerList selectionListeners = new ListenerList();
-
-	/**
-	 * Registered menu detect listeners.
-	 */
-	private ListenerList menuDetectListeners = new ListenerList();
-
-	/**
-	 * The focus listener
-	 */
-	private FocusListener focusListener;
-
-	/**
-	 * The dispose listener
-	 */
-	private DisposeListener disposeListener;
-
-	/**
-	 * The paint listener installed for drawing the decoration
-	 */
-	private PaintListener paintListener;
-
-	/**
-	 * The mouse listener installed for tracking the hover
-	 */
-	private MouseTrackListener mouseTrackListener;
-
-	/**
-	 * The mouse move listener installed for tracking the hover
-	 */
-	private MouseMoveListener mouseMoveListener;
-
-	/**
-	 * The untyped listener installed for notifying external listeners
-	 */
-	private Listener compositeListener;
-
-	/**
-	 * Control that we last installed a move listener on. We only want one at a
-	 * time.
-	 */
-	private Control moveListeningTarget = null;
-
-	/**
-	 * Debug counter used to match add and remove listeners
-	 */
-	private int listenerInstalls = 0;
-
-	/**
-	 * The current rectangle used for tracking mouse moves
-	 */
-	private Rectangle decorationRectangle;
-	
-	/**
-	 * The rectangle of the previously used image.  Used
-	 * for redrawing in the case where a smaller image replaces
-	 * a larger one.
-	 * 
-	 * @since 3.5
-	 */
-	private Rectangle previousDecorationRectangle;
-
-	/**
-	 * An internal flag tracking whether we have focus. We use this rather than
-	 * isFocusControl() so that we can set the flag as soon as we get the focus
-	 * callback, rather than having to do an asyncExec in the middle of a focus
-	 * callback to ensure that isFocusControl() represents the outcome of the
-	 * event.
-	 */
-	private boolean hasFocus = false;
-
-	/**
-	 * The hover used for showing description text
-	 */
-	private Hover hover;
-
-	/**
-	 * The hover used to show a decoration image's description.
-	 */
-	class Hover {
-		private static final String EMPTY = ""; //$NON-NLS-1$
-
-		/**
-		 * Offset of info hover arrow from the left or right side.
-		 */
-		private int hao = 10;
-
-		/**
-		 * Width of info hover arrow.
-		 */
-		private int haw = 8;
-
-		/**
-		 * Height of info hover arrow.
-		 */
-		private int hah = 10;
-
-		/**
-		 * Margin around info hover text.
-		 */
-		private int hm = 2;
-
-		/**
-		 * This info hover's shell.
-		 */
-		Shell hoverShell;
-
-		/**
-		 * The info hover text.
-		 */
-		String text = EMPTY;
-
-		/**
-		 * The region used to manage the shell shape
-		 */
-		Region region;
-
-		/**
-		 * Boolean indicating whether the last computed polygon location had an
-		 * arrow on left. (true if left, false if right).
-		 */
-		boolean arrowOnLeft = true;
-
-		/*
-		 * Create a hover parented by the specified shell.
-		 */
-		Hover(Shell parent) {
-			final Display display = parent.getDisplay();
-			hoverShell = new Shell(parent, SWT.NO_TRIM | SWT.ON_TOP
-					| SWT.NO_FOCUS | SWT.TOOL);
-			hoverShell.setBackground(display
-					.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-			hoverShell.setForeground(display
-					.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
-			hoverShell.addPaintListener(new PaintListener() {
-				public void paintControl(PaintEvent pe) {
-					pe.gc.drawText(text, hm, hm);
-					if (!CARBON) {
-						pe.gc.drawPolygon(getPolygon(true));
-					}
-				}
-			});
-			hoverShell.addMouseListener(new MouseAdapter() {
-				public void mouseDown(MouseEvent e) {
-					hideHover();
-				}
-			});
-		}
-
-		/*
-		 * Compute a polygon that represents a hover with an arrow pointer. If
-		 * border is true, compute the polygon inset by 1-pixel border. Consult
-		 * the arrowOnLeft flag to determine which side the arrow is on.
-		 */
-		int[] getPolygon(boolean border) {
-			Point e = getExtent();
-			int b = border ? 1 : 0;
-			if (arrowOnLeft) {
-				return new int[] { 0, 0, e.x - b, 0, e.x - b, e.y - b,
-						hao + haw, e.y - b, hao + haw / 2, e.y + hah - b, hao,
-						e.y - b, 0, e.y - b, 0, 0 };
-			}
-			return new int[] { 0, 0, e.x - b, 0, e.x - b, e.y - b,
-					e.x - hao - b, e.y - b, e.x - hao - haw / 2, e.y + hah - b,
-					e.x - hao - haw, e.y - b, 0, e.y - b, 0, 0 };
-		}
-
-		/*
-		 * Dispose the hover, it is no longer needed. Dispose any resources
-		 * allocated by the hover.
-		 */
-		void dispose() {
-			if (!hoverShell.isDisposed()) {
-				hoverShell.dispose();
-			}
-			if (region != null) {
-				region.dispose();
-			}
-		}
-
-		/*
-		 * Set the visibility of the hover.
-		 */
-		void setVisible(boolean visible) {
-			if (visible) {
-				if (!hoverShell.isVisible()) {
-					hoverShell.setVisible(true);
-				}
-			} else {
-				if (hoverShell.isVisible()) {
-					hoverShell.setVisible(false);
-				}
-			}
-		}
-
-		/*
-		 * Set the text of the hover to the specified text. Recompute the size
-		 * and location of the hover to hover near the decoration rectangle,
-		 * pointing the arrow toward the target control.
-		 */
-		void setText(String t, Rectangle decorationRectangle,
-				Control targetControl) {
-			if (t == null) {
-				t = EMPTY;
-			}
-			if (!t.equals(text)) {
-				Point oldSize = getExtent();
-				text = t;
-				hoverShell.redraw();
-				Point newSize = getExtent();
-				if (!oldSize.equals(newSize)) {
-					// set a flag that indicates the direction of arrow
-					arrowOnLeft = decorationRectangle.x <= targetControl
-							.getLocation().x;
-					setNewShape();
-				}
-			}
-
-			Point extent = getExtent();
-			int y = -extent.y - hah + 1;
-			int x = arrowOnLeft ? -hao + haw / 2 : -extent.x + hao + haw / 2;
-
-			hoverShell.setLocation(control.getParent().toDisplay(
-					decorationRectangle.x + x, decorationRectangle.y + y));
-		}
-
-		/*
-		 * Return whether or not the hover (shell) is visible.
-		 */
-		boolean isVisible() {
-			return hoverShell.isVisible();
-		}
-
-		/*
-		 * Compute the extent of the hover for the current text.
-		 */
-		Point getExtent() {
-			GC gc = new GC(hoverShell);
-			Point e = gc.textExtent(text);
-			gc.dispose();
-			e.x += hm * 2;
-			e.y += hm * 2;
-			return e;
-		}
-
-		/*
-		 * Compute a new shape for the hover shell.
-		 */
-		void setNewShape() {
-			Region oldRegion = region;
-			region = new Region();
-			region.add(getPolygon(false));
-			hoverShell.setRegion(region);
-			if (oldRegion != null) {
-				oldRegion.dispose();
-			}
-
-		}
-	}
-
-	/**
-	 * Construct a ControlDecoration for decorating the specified control at the
-	 * specified position relative to the control. Render the decoration on top
-	 * of any Control that happens to appear at the specified location.
-	 * <p>
-	 * SWT constants are used to specify the position of the decoration relative
-	 * to the control. The position should include style bits describing both
-	 * the vertical and horizontal orientation. <code>SWT.LEFT</code> and
-	 * <code>SWT.RIGHT</code> describe the horizontal placement of the
-	 * decoration relative to the control, and the constants
-	 * <code>SWT.TOP</code>, <code>SWT.CENTER</code>, and
-	 * <code>SWT.BOTTOM</code> describe the vertical alignment of the
-	 * decoration relative to the control. Decorations always appear on either
-	 * the left or right side of the control, never above or below it. For
-	 * example, a decoration appearing on the left side of the field, at the
-	 * top, is specified as SWT.LEFT | SWT.TOP. If no position style bits are
-	 * specified, the control decoration will be positioned to the left and
-	 * center of the control (<code>SWT.LEFT | SWT.CENTER</code>).
-	 * </p>
-	 * 
-	 * @param control
-	 *            the control to be decorated
-	 * @param position
-	 *            bit-wise or of position constants (<code>SWT.TOP</code>,
-	 *            <code>SWT.BOTTOM</code>, <code>SWT.LEFT</code>,
-	 *            <code>SWT.RIGHT</code>, and <code>SWT.CENTER</code>).
-	 */
-	public ControlDecoration(Control control, int position) {
-		this(control, position, null);
-
-	}
-
-	/**
-	 * Construct a ControlDecoration for decorating the specified control at the
-	 * specified position relative to the control. Render the decoration only on
-	 * the specified Composite or its children. The decoration will be clipped
-	 * if it does not appear within the visible bounds of the composite or its
-	 * child composites.
-	 * <p>
-	 * SWT constants are used to specify the position of the decoration relative
-	 * to the control. The position should include style bits describing both
-	 * the vertical and horizontal orientation. <code>SWT.LEFT</code> and
-	 * <code>SWT.RIGHT</code> describe the horizontal placement of the
-	 * decoration relative to the control, and the constants
-	 * <code>SWT.TOP</code>, <code>SWT.CENTER</code>, and
-	 * <code>SWT.BOTTOM</code> describe the vertical alignment of the
-	 * decoration relative to the control. Decorations always appear on either
-	 * the left or right side of the control, never above or below it. For
-	 * example, a decoration appearing on the left side of the field, at the
-	 * top, is specified as SWT.LEFT | SWT.TOP. If no position style bits are
-	 * specified, the control decoration will be positioned to the left and
-	 * center of the control (<code>SWT.LEFT | SWT.CENTER</code>).
-	 * </p>
-	 * 
-	 * @param control
-	 *            the control to be decorated
-	 * @param position
-	 *            bit-wise or of position constants (<code>SWT.TOP</code>,
-	 *            <code>SWT.BOTTOM</code>, <code>SWT.LEFT</code>,
-	 *            <code>SWT.RIGHT</code>, and <code>SWT.CENTER</code>).
-	 * @param composite
-	 *            The SWT composite within which the decoration should be
-	 *            rendered. The decoration will be clipped to this composite,
-	 *            but it may be rendered on a child of the composite. The
-	 *            decoration will not be visible if the specified composite or
-	 *            its child composites are not visible in the space relative to
-	 *            the control, where the decoration is to be rendered. If this
-	 *            value is <code>null</code>, then the decoration will be
-	 *            rendered on whichever composite (or composites) are located in
-	 *            the specified position.
-	 */
-	public ControlDecoration(Control control, int position, Composite composite) {
-		this.position = position;
-		this.control = control;
-		this.composite = composite;
-
-		addControlListeners();
-
-	}
-
-	/**
-	 * Adds the listener to the collection of listeners who will be notified
-	 * when the platform-specific context menu trigger has occurred, by sending
-	 * it one of the messages defined in the <code>MenuDetectListener</code>
-	 * interface.
-	 * <p>
-	 * The <code>widget</code> field in the SelectionEvent will contain the
-	 * Composite on which the decoration is rendered that received the click.
-	 * The <code>x</code> and <code>y</code> fields will be in coordinates
-	 * relative to the display. The <code>data</code> field will contain the
-	 * decoration that received the event.
-	 * </p>
-	 * 
-	 * @param listener
-	 *            the listener which should be notified
-	 * 
-	 * @see org.eclipse.swt.events.MenuDetectListener
-	 * @see org.eclipse.swt.events.MenuDetectEvent
-	 * @see #removeMenuDetectListener
-	 */
-	public void addMenuDetectListener(MenuDetectListener listener) {
-		menuDetectListeners.add(listener);
-	}
-
-	/**
-	 * Removes the listener from the collection of listeners who will be
-	 * notified when the platform-specific context menu trigger has occurred.
-	 * 
-	 * @param listener
-	 *            the listener which should no longer be notified. This message
-	 *            has no effect if the listener was not previously added to the
-	 *            receiver.
-	 * 
-	 * @see org.eclipse.swt.events.MenuDetectListener
-	 * @see #addMenuDetectListener
-	 */
-	public void removeMenuDetectListener(MenuDetectListener listener) {
-		menuDetectListeners.remove(listener);
-	}
-
-	/**
-	 * Adds the listener to the collection of listeners who will be notified
-	 * when the decoration is selected, by sending it one of the messages
-	 * defined in the <code>SelectionListener</code> interface.
-	 * <p>
-	 * <code>widgetSelected</code> is called when the decoration is selected
-	 * (by mouse click). <code>widgetDefaultSelected</code> is called when the
-	 * decoration is double-clicked.
-	 * </p>
-	 * <p>
-	 * The <code>widget</code> field in the SelectionEvent will contain the
-	 * Composite on which the decoration is rendered that received the click.
-	 * The <code>x</code> and <code>y</code> fields will be in coordinates
-	 * relative to that widget. The <code>data</code> field will contain the
-	 * decoration that received the event.
-	 * </p>
-	 * 
-	 * @param listener
-	 *            the listener which should be notified
-	 * 
-	 * @see org.eclipse.swt.events.SelectionListener
-	 * @see org.eclipse.swt.events.SelectionEvent
-	 * @see #removeSelectionListener
-	 */
-	public void addSelectionListener(SelectionListener listener) {
-		selectionListeners.add(listener);
-	}
-
-	/**
-	 * Removes the listener from the collection of listeners who will be
-	 * notified when the decoration is selected.
-	 * 
-	 * @param listener
-	 *            the listener which should no longer be notified. This message
-	 *            has no effect if the listener was not previously added to the
-	 *            receiver.
-	 * 
-	 * @see org.eclipse.swt.events.SelectionListener
-	 * @see #addSelectionListener
-	 */
-	public void removeSelectionListener(SelectionListener listener) {
-		selectionListeners.remove(listener);
-	}
-
-	/**
-	 * Dispose this ControlDecoration. Unhook any listeners that have been
-	 * installed on the target control. This method has no effect if the
-	 * receiver is already disposed.
-	 */
-	public void dispose() {
-		if (control == null) {
-			return;
-		}
-		if (hover != null) {
-			hover.dispose();
-			hover = null;
-		}
-		removeControlListeners();
-		control = null;
-	}
-
-	/**
-	 * Get the control that is decorated by the receiver.
-	 * 
-	 * @return the Control decorated by the receiver. May be <code>null</code>
-	 *         if the control has been uninstalled.
-	 */
-	public Control getControl() {
-		return control;
-	}
-
-	/**
-	 * Add any listeners needed on the target control and on the composite where
-	 * the decoration is to be rendered.
-	 */
-	private void addControlListeners() {
-		disposeListener = new DisposeListener() {
-			public void widgetDisposed(DisposeEvent event) {
-				dispose();
-			}
-		};
-		printAddListener(control, "DISPOSE"); //$NON-NLS-1$
-		control.addDisposeListener(disposeListener);
-
-		focusListener = new FocusListener() {
-			public void focusGained(FocusEvent event) {
-				hasFocus = true;
-				if (showOnlyOnFocus) {
-					update();
-				}
-			}
-
-			public void focusLost(FocusEvent event) {
-				hasFocus = false;
-				if (showOnlyOnFocus) {
-					update();
-				}
-			}
-		};
-		printAddListener(control, "FOCUS"); //$NON-NLS-1$
-		control.addFocusListener(focusListener);
-
-		// Listener for painting the decoration
-		paintListener = new PaintListener() {
-			public void paintControl(PaintEvent event) {
-				Control control = (Control) event.widget;
-				Rectangle rect = getDecorationRectangle(control);
-				if (shouldShowDecoration()) {
-					event.gc.drawImage(getImage(), rect.x, rect.y);
-				}
-			}
-		};
-
-		// Listener for tracking the end of a hover. Only installed
-		// after a hover begins.
-		mouseMoveListener = new MouseMoveListener() {
-			public void mouseMove(MouseEvent event) {
-				if (showHover) {
-					if (!decorationRectangle.contains(event.x, event.y)) {
-						hideHover();
-						// No need to listen any longer
-						printRemoveListener(event.widget, "MOUSEMOVE"); //$NON-NLS-1$
-						((Control) event.widget)
-								.removeMouseMoveListener(mouseMoveListener);
-						moveListeningTarget = null;
-					}
-				}
-			}
-		};
-
-		// Listener for tracking the beginning of a hover. Always installed.
-		mouseTrackListener = new MouseTrackListener() {
-			public void mouseExit(MouseEvent event) {
-				// Just in case we didn't catch it before.
-				Control target = (Control) event.widget;
-				if (target == moveListeningTarget) {
-					printRemoveListener(target, "MOUSEMOVE"); //$NON-NLS-1$
-					target.removeMouseMoveListener(mouseMoveListener);
-					moveListeningTarget = null;
-				}
-				hideHover();
-			}
-
-			public void mouseHover(MouseEvent event) {
-				if (showHover) {
-					decorationRectangle = getDecorationRectangle((Control) event.widget);
-					if (decorationRectangle.contains(event.x, event.y)) {
-						showHoverText(getDescriptionText());
-						Control target = (Control) event.widget;
-						if (moveListeningTarget == null) {
-							printAddListener(target, "MOUSEMOVE"); //$NON-NLS-1$
-							target.addMouseMoveListener(mouseMoveListener);
-							moveListeningTarget = target;
-						} else if (target != moveListeningTarget) {
-							printRemoveListener(moveListeningTarget,
-									"MOUSEMOVE"); //$NON-NLS-1$
-							moveListeningTarget
-									.removeMouseMoveListener(mouseMoveListener);
-							printAddListener(target, "MOUSEMOVE"); //$NON-NLS-1$
-							target.addMouseMoveListener(mouseMoveListener);
-							moveListeningTarget = target;
-						} else {
-							// It is already installed on this control.
-						}
-					}
-				}
-			}
-
-			public void mouseEnter(MouseEvent event) {
-				// Nothing to do until a hover occurs.
-			}
-		};
-
-		compositeListener = new Listener() {
-			public void handleEvent(Event event) {
-				// Don't forward events if decoration is not showing
-				if (!visible) {
-					return;
-				}
-				// Notify listeners if any are registered.
-				switch (event.type) {
-				case SWT.MouseDown:
-					if (!selectionListeners.isEmpty())
-						notifySelectionListeners(event);
-					break;
-				case SWT.MouseDoubleClick:
-					if (!selectionListeners.isEmpty())
-						notifySelectionListeners(event);
-					break;
-				case SWT.MenuDetect:
-					if (!menuDetectListeners.isEmpty())
-						notifyMenuDetectListeners(event);
-					break;
-				}
-			}
-		};
-
-		// We do not know which parent in the control hierarchy
-		// is providing the decoration space, so hook all the way up, until
-		// the shell or the specified parent composite is reached.
-		Composite c = control.getParent();
-		while (c != null) {
-			installCompositeListeners(c);
-			if (composite != null && composite == c) {
-				// We just installed on the specified composite, so stop.
-				c = null;
-			} else if (c instanceof Shell) {
-				// We just installed on a shell, so don't go further
-				c = null;
-			} else {
-				c = c.getParent();
-			}
-		}
-		// force a redraw of the decoration area so our paint listener
-		// is notified.
-		update();
-	}
-
-	/*
-	 * Install the listeners used to paint and track mouse events on the
-	 * composite.
-	 */
-	private void installCompositeListeners(Composite c) {
-		if (!c.isDisposed()) {
-			printAddListener(c, "PAINT"); //$NON-NLS-1$
-			c.addPaintListener(paintListener);
-			printAddListener(c, "MOUSETRACK"); //$NON-NLS-1$
-			c.addMouseTrackListener(mouseTrackListener);
-			printAddListener(c, "SWT.MenuDetect"); //$NON-NLS-1$
-			c.addListener(SWT.MenuDetect, compositeListener);
-			printAddListener(c, "SWT.MouseDown"); //$NON-NLS-1$
-			c.addListener(SWT.MouseDown, compositeListener);
-			printAddListener(c, "SWT.MouseDoubleClick"); //$NON-NLS-1$
-			c.addListener(SWT.MouseDoubleClick, compositeListener);
-		}
-	}
-
-	/*
-	 * Remove the listeners used to paint and track mouse events on the
-	 * composite.
-	 */
-	private void removeCompositeListeners(Composite c) {
-		if (!c.isDisposed()) {
-			printRemoveListener(c, "PAINT"); //$NON-NLS-1$
-			c.removePaintListener(paintListener);
-			printRemoveListener(c, "MOUSETRACK"); //$NON-NLS-1$
-			c.removeMouseTrackListener(mouseTrackListener);
-			printRemoveListener(c, "SWT.MenuDetect"); //$NON-NLS-1$
-			c.removeListener(SWT.MenuDetect, compositeListener);
-			printRemoveListener(c, "SWT.MouseDown"); //$NON-NLS-1$
-			c.removeListener(SWT.MouseDown, compositeListener);
-			printRemoveListener(c, "SWT.MouseDoubleClick"); //$NON-NLS-1$
-			c.removeListener(SWT.MouseDoubleClick, compositeListener);
-		}
-	}
-
-	private void notifySelectionListeners(Event event) {
-		if (!(event.widget instanceof Control)) {
-			return;
-		}
-		if (getDecorationRectangle((Control) event.widget).contains(event.x,
-				event.y)) {
-			SelectionEvent clientEvent = new SelectionEvent(event);
-			clientEvent.data = this;
-			if (getImage() != null) {
-				clientEvent.height = getImage().getBounds().height;
-				clientEvent.width = getImage().getBounds().width;
-			}
-			Object[] listeners;
-			switch (event.type) {
-			case SWT.MouseDoubleClick:
-				if (event.button == 1) {
-					listeners = selectionListeners.getListeners();
-					for (int i = 0; i < listeners.length; i++) {
-						((SelectionListener) listeners[i])
-								.widgetDefaultSelected(clientEvent);
-					}
-				}
-				break;
-			case SWT.MouseDown:
-				if (event.button == 1) {
-					listeners = selectionListeners.getListeners();
-					for (int i = 0; i < listeners.length; i++) {
-						((SelectionListener) listeners[i])
-								.widgetSelected(clientEvent);
-					}
-				}
-				break;
-			}
-		}
-	}
-
-	private void notifyMenuDetectListeners(Event event) {
-		if (getDecorationRectangle(null).contains(event.x, event.y)) {
-			MenuDetectEvent clientEvent = new MenuDetectEvent(event);
-			clientEvent.data = this;
-			Object[] listeners = menuDetectListeners.getListeners();
-			for (int i = 0; i < listeners.length; i++) {
-				((MenuDetectListener) listeners[i]).menuDetected(clientEvent);
-
-			}
-		}
-	}
-
-	/**
-	 * Show the specified text using the same hover dialog as is used to show
-	 * decorator descriptions. When {@link #setShowHover(boolean)} has been set
-	 * to <code>true</code>, a decoration's description text will be shown in
-	 * an info hover over the field's control whenever the mouse hovers over the
-	 * decoration. This method can be used to show a decoration's description
-	 * text at other times (such as when the control receives focus), or to show
-	 * other text associated with the field. The hover will not be shown if the
-	 * decoration is hidden.
-	 * 
-	 * @param text
-	 *            the text to be shown in the info hover, or <code>null</code>
-	 *            if no text should be shown.
-	 */
-	public void showHoverText(String text) {
-		if (control == null) {
-			return;
-		}
-		showHoverText(text, control);
-	}
-
-	/**
-	 * Hide any hover popups that are currently showing on the control. When
-	 * {@link #setShowHover(boolean)} has been set to <code>true</code>, a
-	 * decoration's description text will be shown in an info hover over the
-	 * field's control as long as the mouse hovers over the decoration, and will
-	 * be hidden when the mouse exits the decoration. This method can be used to
-	 * hide a hover, whether it was shown explicitly using
-	 * {@link #showHoverText(String)}, or was showing because the user was
-	 * hovering in the decoration.
-	 * <p>
-	 * This message has no effect if there is no current hover.
-	 * 
-	 */
-	public void hideHover() {
-		if (hover != null) {
-			hover.setVisible(false);
-		}
-	}
-
-	/**
-	 * Show the control decoration. This message has no effect if the decoration
-	 * is already showing. If {@link #setShowOnlyOnFocus(boolean)} is set to
-	 * <code>true</code>, the decoration will only be shown if the control
-	 * has focus.
-	 */
-	public void show() {
-		if (!visible) {
-			visible = true;
-			update();
-		}
-	}
-
-	/**
-	 * Hide the control decoration and any associated hovers. This message has
-	 * no effect if the decoration is already hidden.
-	 */
-	public void hide() {
-		if (visible) {
-			visible = false;
-			hideHover();
-			update();
-		}
-	}
-
-	/**
-	 * Get the description text that may be shown in a hover for this
-	 * decoration.
-	 * 
-	 * @return the text to be shown as a description for the decoration, or
-	 *         <code>null</code> if none has been set.
-	 */
-	public String getDescriptionText() {
-		return descriptionText;
-	}
-
-	/**
-	 * Set the image shown in this control decoration. Update the rendered
-	 * decoration.
-	 * 
-	 * @param text
-	 *            the text to be shown as a description for the decoration, or
-	 *            <code>null</code> if none has been set.
-	 */
-	public void setDescriptionText(String text) {
-		this.descriptionText = text;
-		update();
-	}
-
-	/**
-	 * Get the image shown in this control decoration.
-	 * 
-	 * @return the image to be shown adjacent to the control, or
-	 *         <code>null</code> if one has not been set.
-	 */
-	public Image getImage() {
-		return image;
-	}
-
-	/**
-	 * Set the image shown in this control decoration. Update the rendered
-	 * decoration.
-	 * 
-	 * @param image
-	 *            the image to be shown adjacent to the control. Should never be
-	 *            <code>null</code>.
-	 */
-	public void setImage(Image image) {
-		previousDecorationRectangle = getDecorationRectangle(control.getShell());
-		this.image = image;
-		update();
-	}
-
-	/**
-	 * Get the boolean that controls whether the decoration is shown only when
-	 * the control has focus. The default value of this setting is
-	 * <code>false</code>.
-	 * 
-	 * @return <code>true</code> if the decoration should only be shown when
-	 *         the control has focus, and <code>false</code> if it should
-	 *         always be shown. Note that if the control is not capable of
-	 *         receiving focus (<code>SWT.NO_FOCUS</code>), then the
-	 *         decoration will never show when this value is <code>true</code>.
-	 */
-	public boolean getShowOnlyOnFocus() {
-		return showOnlyOnFocus;
-	}
-
-	/**
-	 * Set the boolean that controls whether the decoration is shown only when
-	 * the control has focus. The default value of this setting is
-	 * <code>false</code>.
-	 * 
-	 * @param showOnlyOnFocus
-	 *            <code>true</code> if the decoration should only be shown
-	 *            when the control has focus, and <code>false</code> if it
-	 *            should always be shown. Note that if the control is not
-	 *            capable of receiving focus (<code>SWT.NO_FOCUS</code>),
-	 *            then the decoration will never show when this value is
-	 *            <code>true</code>.
-	 */
-	public void setShowOnlyOnFocus(boolean showOnlyOnFocus) {
-		this.showOnlyOnFocus = showOnlyOnFocus;
-		update();
-	}
-
-	/**
-	 * Get the boolean that controls whether the decoration's description text
-	 * should be shown in a hover when the user hovers over the decoration. The
-	 * default value of this setting is <code>true</code>.
-	 * 
-	 * @return <code>true</code> if a hover popup containing the decoration's
-	 *         description text should be shown when the user hovers over the
-	 *         decoration, and <code>false</code> if a hover should not be
-	 *         shown.
-	 */
-	public boolean getShowHover() {
-		return showHover;
-	}
-
-	/**
-	 * Set the boolean that controls whether the decoration's description text
-	 * should be shown in a hover when the user hovers over the decoration. The
-	 * default value of this setting is <code>true</code>.
-	 * 
-	 * @param showHover
-	 *            <code>true</code> if a hover popup containing the
-	 *            decoration's description text should be shown when the user
-	 *            hovers over the decoration, and <code>false</code> if a
-	 *            hover should not be shown.
-	 */
-	public void setShowHover(boolean showHover) {
-		this.showHover = showHover;
-		update();
-	}
-
-	/**
-	 * Get the margin width in pixels that should be used between the decorator
-	 * and the horizontal edge of the control. The default value of this setting
-	 * is <code>0</code>.
-	 * 
-	 * @return the number of pixels that should be reserved between the
-	 *         horizontal edge of the control and the adjacent edge of the
-	 *         decoration.
-	 */
-	public int getMarginWidth() {
-		return marginWidth;
-	}
-
-	/**
-	 * Set the margin width in pixels that should be used between the decorator
-	 * and the horizontal edge of the control. The default value of this setting
-	 * is <code>0</code>.
-	 * 
-	 * @param marginWidth
-	 *            the number of pixels that should be reserved between the
-	 *            horizontal edge of the control and the adjacent edge of the
-	 *            decoration.
-	 */
-	public void setMarginWidth(int marginWidth) {
-		previousDecorationRectangle = getDecorationRectangle(control.getShell());
-		this.marginWidth = marginWidth;
-		update();
-	}
-
-	/**
-	 * Something has changed, requiring redraw. Redraw the decoration and update
-	 * the hover text if appropriate.
-	 */
-	protected void update() {
-		if (control == null || control.isDisposed()) {
-			return;
-		}
-		Rectangle rect = getDecorationRectangle(control.getShell());
-		// If this update is happening due to an image reset, we need to make
-		// sure we clear the area from the old image.
-		// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=212501
-		if (previousDecorationRectangle != null) {
-			rect = rect.union(previousDecorationRectangle);
-		}
-		// Redraw this rectangle in all children
-		control.getShell()
-				.redraw(rect.x, rect.y, rect.width, rect.height, true);
-		control.getShell().update();
-		if (hover != null && getDescriptionText() != null) {
-			hover.setText(getDescriptionText(), getDecorationRectangle(control
-					.getParent()), control);
-		}
-		previousDecorationRectangle = null;
-	}
-
-	/*
-	 * Show the specified text in the hover, positioning the hover near the
-	 * specified control.
-	 */
-	private void showHoverText(String text, Control hoverNear) {
-		// If we aren't to show a hover, don't do anything.
-		if (!showHover) {
-			return;
-		}
-
-		// If we are not visible, don't show the hover.
-		if (!visible) {
-			return;
-		}
-		// If there is no text, don't do anything.
-		if (text == null) {
-			hideHover();
-			return;
-		}
-
-		// If there is no control, nothing to do
-		if (control == null) {
-			return;
-		}
-		// Create the hover if it's not showing
-		if (hover == null) {
-			hover = new Hover(hoverNear.getShell());
-		}
-		hover.setText(text, getDecorationRectangle(control.getParent()),
-				control);
-		hover.setVisible(true);
-	}
-
-	/*
-	 * Remove any listeners installed on the controls.
-	 */
-	private void removeControlListeners() {
-		if (control == null) {
-			return;
-		}
-		printRemoveListener(control, "FOCUS"); //$NON-NLS-1$
-		control.removeFocusListener(focusListener);
-		focusListener = null;
-
-		printRemoveListener(control, "DISPOSE"); //$NON-NLS-1$
-		control.removeDisposeListener(disposeListener);
-		disposeListener = null;
-
-		Composite c = control.getParent();
-		while (c != null) {
-			removeCompositeListeners(c);
-			if (composite != null && composite == c) {
-				// We previously installed listeners only to the specified
-				// composite, so stop.
-				c = null;
-			} else if (c instanceof Shell) {
-				// We previously installed listeners only up to the first Shell
-				// encountered, so stop.
-				c = null;
-			} else {
-				c = c.getParent();
-			}
-		}
-		paintListener = null;
-		mouseTrackListener = null;
-		compositeListener = null;
-
-		// We may have a remaining mouse move listener installed
-		if (moveListeningTarget != null) {
-			printRemoveListener(moveListeningTarget, "MOUSEMOVE"); //$NON-NLS-1$
-			moveListeningTarget.removeMouseMoveListener(mouseMoveListener);
-			moveListeningTarget = null;
-			mouseMoveListener = null;
-		}
-		if (DEBUG) {
-			if (listenerInstalls > 0) {
-				System.out.println("LISTENER LEAK>>>CHECK TRACE ABOVE"); //$NON-NLS-1$
-			} else if (listenerInstalls < 0) {
-				System.out
-						.println("REMOVED UNREGISTERED LISTENERS>>>CHECK TRACE ABOVE"); //$NON-NLS-1$
-			} else {
-				System.out.println("ALL INSTALLED LISTENERS WERE REMOVED."); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * Return the rectangle in which the decoration should be rendered, in
-	 * coordinates relative to the specified control. If the specified control
-	 * is null, return the rectangle in display coordinates.
-	 * 
-	 * @param targetControl
-	 *            the control whose coordinates should be used
-	 * @return the rectangle in which the decoration should be rendered
-	 */
-	protected Rectangle getDecorationRectangle(Control targetControl) {
-		if (getImage() == null || control == null) {
-			return new Rectangle(0, 0, 0, 0);
-		}
-		// Compute the bounds first relative to the control's parent.
-		Rectangle imageBounds = getImage().getBounds();
-		Rectangle controlBounds = control.getBounds();
-		int x, y;
-		// Compute x
-		if ((position & SWT.RIGHT) == SWT.RIGHT) {
-			x = controlBounds.x + controlBounds.width + marginWidth;
-		} else {
-			// default is left
-			x = controlBounds.x - imageBounds.width - marginWidth;
-		}
-		// Compute y
-		if ((position & SWT.TOP) == SWT.TOP) {
-			y = controlBounds.y;
-		} else if ((position & SWT.BOTTOM) == SWT.BOTTOM) {
-			y = controlBounds.y + control.getBounds().height
-					- imageBounds.height;
-		} else {
-			// default is center
-			y = controlBounds.y
-					+ (control.getBounds().height - imageBounds.height) / 2;
-		}
-
-		// Now convert to coordinates relative to the target control.
-		Point globalPoint = control.getParent().toDisplay(x, y);
-		Point targetPoint;
-		if (targetControl == null) {
-			targetPoint = globalPoint;
-		} else {
-			targetPoint = targetControl.toControl(globalPoint);
-		}
-		return new Rectangle(targetPoint.x, targetPoint.y, imageBounds.width,
-				imageBounds.height);
-	}
-
-	/*
-	 * Return true if the decoration should be shown, false if it should not.
-	 */
-	private boolean shouldShowDecoration() {
-		if (!visible) {
-			return false;
-		}
-		if (control == null || control.isDisposed() || getImage() == null) {
-			return false;
-		}
-
-		if (!control.isVisible()) {
-			return false;
-		}
-		if (showOnlyOnFocus) {
-			return hasFocus;
-		}
-		return true;
-	}
-
-	/*
-	 * If in debug mode, print info about adding the specified listener.
-	 */
-	private void printAddListener(Widget widget, String listenerType) {
-		listenerInstalls++;
-		if (DEBUG) {
-			System.out
-					.println("Added listener>>>" + listenerType + " to>>>" + widget); //$NON-NLS-1$//$NON-NLS-2$
-		}
-	}
-
-	/*
-	 * If in debug mode, print info about adding the specified listener.
-	 */
-	private void printRemoveListener(Widget widget, String listenerType) {
-		listenerInstalls--;
-		if (DEBUG) {
-			System.out
-					.println("Removed listener>>>" + listenerType + " from>>>" + widget); //$NON-NLS-1$//$NON-NLS-2$
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/DecoratedField.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/DecoratedField.java
deleted file mode 100644
index 171c01e..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/DecoratedField.java
+++ /dev/null
@@ -1,874 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Region;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * DecoratedField manages image decorations around a control. It allows clients
- * to specify an image decoration and a position for the decoration relative to
- * the field. Decorations may be assigned descriptions, which are shown when the
- * user hovers over the decoration. Clients can decorate any kind of control by
- * supplying a {@link IControlCreator} to create the control that is decorated.
- * <p>
- * Decorations always appear on either horizontal side of the field, never above
- * or below it. Decorations can be positioned at the top or bottom of either
- * side. Future implementations may provide additional positioning options for
- * decorations.
- * <p>
- * By default, DecoratedField will consult the {@link FieldDecorationRegistry}
- * to determine how much space should be reserved for each decoration. This
- * allows fields with decorations from different sources to align properly on
- * the same dialog, since the registry tracks the size of all decorations
- * registered. Therefore, it is recommended, but not required, that clients of
- * DecoratedField register the decorations used. In cases where alignment
- * between different fields is not a concern, clients can use
- * <code>setUseMaximumDecorationWidth(false)</code> and need not register
- * their decorations.
- * <p>
- * This class is not intended to be subclassed.
- * 
- * @since 3.2
- * @deprecated As of 3.3, clients should use {@link ControlDecoration} instead.
- */
-public class DecoratedField {
-
-	/**
-	 * Cached platform flags for dealing with platform-specific issues.
-	 */
-	private static boolean CARBON = Util.isCarbon();
-
-	/**
-	 * Constants describing the array indices used to hold the decorations in
-	 * array slots.
-	 */
-
-	private static final int LEFT_TOP = 0;
-
-	private static final int LEFT_BOTTOM = 1;
-
-	private static final int RIGHT_TOP = 2;
-
-	private static final int RIGHT_BOTTOM = 3;
-
-	private static final int DECORATION_SLOTS = 4;
-
-	/**
-	 * Simple data structure class for specifying the internals for a field
-	 * decoration. This class contains data specific to the implementation of
-	 * field decorations as labels attached to the field. Clients should use
-	 * <code>FieldDecoration</code> for specifying a decoration.
-	 */
-	private class FieldDecorationData {
-
-		/* Package */FieldDecoration decoration;
-
-		/* Package */Label label;
-
-		/* Package */FormData data;
-
-		/* Package */boolean showOnFocus;
-
-		/* Package */boolean visible = true;
-
-		/**
-		 * Create a decoration data representing the specified decoration, using
-		 * the specified label and form data for its representation.
-		 * 
-		 * @param decoration
-		 *            the decoration whose data is kept.
-		 * @param label
-		 *            the label used to represent the decoration.
-		 * @param formData
-		 *            the form data used to attach the decoration to its field.
-		 * @param showOnFocus
-		 *            a boolean specifying whether the decoration should only be
-		 *            shown when the field has focus.
-		 */
-		FieldDecorationData(FieldDecoration decoration, Label label,
-				FormData formData, boolean showOnFocus) {
-			this.decoration = decoration;
-			this.label = label;
-			this.data = formData;
-			this.showOnFocus = showOnFocus;
-		}
-	}
-
-	/**
-	 * Decorations keyed by position.
-	 */
-	private FieldDecorationData[] decDatas = new FieldDecorationData[DECORATION_SLOTS];
-
-	/**
-	 * The associated control
-	 */
-	private Control control;
-
-	/**
-	 * The composite with form layout used to manage decorations.
-	 */
-	private Composite form;
-
-	/**
-	 * The boolean that indicates whether the maximum decoration width is used
-	 * when allocating space for decorations.
-	 */
-	private boolean useMaxDecorationWidth = true;
-
-	/**
-	 * The hover used for showing description text
-	 */
-	private Hover hover;
-
-	/**
-	 * The hover used to show a decoration image's description.
-	 */
-	class Hover {
-		private static final String EMPTY = ""; //$NON-NLS-1$
-
-		/**
-		 * Offset of info hover arrow from the left or right side.
-		 */
-		private int hao = 10;
-
-		/**
-		 * Width of info hover arrow.
-		 */
-		private int haw = 8;
-
-		/**
-		 * Height of info hover arrow.
-		 */
-		private int hah = 10;
-
-		/**
-		 * Margin around info hover text.
-		 */
-		private int hm = 2;
-
-		/**
-		 * This info hover's shell.
-		 */
-		Shell hoverShell;
-
-		/**
-		 * The info hover text.
-		 */
-		String text = EMPTY;
-
-		/**
-		 * The region used to manage the shell shape
-		 */
-		Region region;
-
-		/**
-		 * Boolean indicating whether the last computed polygon location had an
-		 * arrow on left. (true if left, false if right).
-		 */
-		boolean arrowOnLeft = true;
-
-		/*
-		 * Create a hover parented by the specified shell.
-		 */
-		Hover(Shell parent) {
-			final Display display = parent.getDisplay();
-			hoverShell = new Shell(parent, SWT.NO_TRIM | SWT.ON_TOP
-					| SWT.NO_FOCUS | SWT.TOOL);
-			hoverShell.setBackground(display
-					.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-			hoverShell.setForeground(display
-					.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
-			hoverShell.addPaintListener(new PaintListener() {
-				public void paintControl(PaintEvent pe) {
-					pe.gc.drawString(text, hm, hm);
-					if (!CARBON) {
-						pe.gc.drawPolygon(getPolygon(true));
-					}
-				}
-			});
-			hoverShell.addMouseListener(new MouseAdapter() {
-				public void mouseDown(MouseEvent e) {
-					hideHover();
-				}
-			});
-		}
-
-		/*
-		 * Compute a polygon that represents a hover with an arrow pointer. If
-		 * border is true, compute the polygon inset by 1-pixel border. Consult
-		 * the arrowOnLeft flag to determine which side the arrow is on.
-		 */
-		int[] getPolygon(boolean border) {
-			Point e = getExtent();
-			int b = border ? 1 : 0;
-			if (arrowOnLeft) {
-				return new int[] { 0, 0, e.x - b, 0, e.x - b, e.y - b,
-						hao + haw, e.y - b, hao + haw / 2, e.y + hah - b, hao,
-						e.y - b, 0, e.y - b, 0, 0 };
-			}
-			return new int[] { 0, 0, e.x - b, 0, e.x - b, e.y - b,
-					e.x - hao - b, e.y - b, e.x - hao - haw / 2, e.y + hah - b,
-					e.x - hao - haw, e.y - b, 0, e.y - b, 0, 0 };
-		}
-
-		/*
-		 * Dispose the hover, it is no longer needed. Dispose any resources
-		 * allocated by the hover.
-		 */
-		void dispose() {
-			if (!hoverShell.isDisposed()) {
-				hoverShell.dispose();
-			}
-			if (region != null) {
-				region.dispose();
-			}
-		}
-
-		/*
-		 * Set the visibility of the hover.
-		 */
-		void setVisible(boolean visible) {
-			if (visible) {
-				if (!hoverShell.isVisible()) {
-					hoverShell.setVisible(true);
-				}
-			} else {
-				if (hoverShell.isVisible()) {
-					hoverShell.setVisible(false);
-				}
-			}
-		}
-
-		/*
-		 * Set the text of the hover to the specified text. Recompute the size
-		 * and location of the hover to hover near the specified control,
-		 * pointing the arrow toward the target control.
-		 */
-		void setText(String t, Control hoverNear, Control targetControl) {
-			if (t == null) {
-				t = EMPTY;
-			}
-			if (!t.equals(text)) {
-				Point oldSize = getExtent();
-				text = t;
-				hoverShell.redraw();
-				Point newSize = getExtent();
-				if (!oldSize.equals(newSize)) {
-					// set a flag that indicates the direction of arrow
-					arrowOnLeft = hoverNear.getLocation().x <= targetControl
-							.getLocation().x;
-					setNewShape();
-				}
-			}
-
-			if (hoverNear != null) {
-				Point extent = getExtent();
-				int y = -extent.y - hah + 1;
-				int x = arrowOnLeft ? -hao + haw / 2 : -extent.x + hao + haw
-						/ 2;
-
-				hoverShell.setLocation(hoverNear.toDisplay(x, y));
-			}
-
-		}
-
-		/*
-		 * Return whether or not the hover (shell) is visible.
-		 */
-		boolean isVisible() {
-			return hoverShell.isVisible();
-		}
-
-		/*
-		 * Compute the extent of the hover for the current text.
-		 */
-		Point getExtent() {
-			GC gc = new GC(hoverShell);
-			Point e = gc.textExtent(text);
-			gc.dispose();
-			e.x += hm * 2;
-			e.y += hm * 2;
-			return e;
-		}
-
-		/*
-		 * Compute a new shape for the hover shell.
-		 */
-		void setNewShape() {
-			Region oldRegion = region;
-			region = new Region();
-			region.add(getPolygon(false));
-			hoverShell.setRegion(region);
-			if (oldRegion != null) {
-				oldRegion.dispose();
-			}
-
-		}
-	}
-
-	/**
-	 * Construct a decorated field which is parented by the specified composite
-	 * and has the given style bits. Use the controlCreator to create the
-	 * specific kind of control that is decorated inside the field.
-	 * 
-	 * @param parent
-	 *            the parent of the decorated field.
-	 * @param style
-	 *            the desired style bits for the field.
-	 * @param controlCreator
-	 *            the IControlCreator used to specify the specific kind of
-	 *            control that is to be decorated.
-	 * 
-	 * @see IControlCreator
-	 */
-	public DecoratedField(Composite parent, int style,
-			IControlCreator controlCreator) {
-		this.form = createForm(parent);
-		this.control = controlCreator.createControl(form, style);
-
-		addControlListeners();
-		form.setTabList(new Control[] { control });
-
-		// Set up the initial layout data.
-		FormData data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.top = new FormAttachment(0, 0);
-		data.right = new FormAttachment(100, 0);
-		data.bottom = new FormAttachment(100, 0);
-		control.setLayoutData(data);
-
-	}
-
-	/**
-	 * Adds an image decoration to the field.
-	 * 
-	 * @param decoration
-	 *            A FieldDecoration describing the image and description for the
-	 *            decoration
-	 * 
-	 * @param position
-	 *            The SWT constant indicating the position of the decoration
-	 *            relative to the field's control. The position should include
-	 *            style bits describing both the vertical and horizontal
-	 *            orientation. <code>SWT.LEFT</code> and
-	 *            <code>SWT.RIGHT</code> describe the horizontal placement of
-	 *            the decoration relative to the field, and the constants
-	 *            <code>SWT.TOP</code> and <code>SWT.BOTTOM</code> describe
-	 *            the vertical alignment of the decoration relative to the
-	 *            field. Decorations always appear on either horizontal side of
-	 *            the field, never above or below it. For example, a decoration
-	 *            appearing on the left side of the field, at the top, is
-	 *            specified as SWT.LEFT | SWT.TOP. If an image decoration
-	 *            already exists in the specified position, it will be replaced
-	 *            by the one specified.
-	 * @param showOnFocus
-	 *            <code>true</code> if the decoration should only be shown
-	 *            when the associated control has focus, <code>false</code> if
-	 *            it should always be shown.
-	 * 
-	 */
-	public void addFieldDecoration(FieldDecoration decoration, int position,
-			boolean showOnFocus) {
-		final Label label;
-		FormData formData;
-		int i = indexForPosition(position);
-		if (decDatas[i] == null) {
-			formData = createFormDataForIndex(i, decoration.getImage());
-			label = new Label(form, SWT.HORIZONTAL | SWT.VERTICAL | SWT.CENTER);
-			label.addMouseTrackListener(new MouseTrackListener() {
-				public void mouseHover(MouseEvent event) {
-					FieldDecorationData decData = (FieldDecorationData) event.widget
-							.getData();
-					String desc = decData.decoration.getDescription();
-					if (desc != null) {
-						showHoverText(desc, label);
-					}
-				}
-
-				public void mouseEnter(MouseEvent event) {
-				}
-
-				public void mouseExit(MouseEvent event) {
-					hideHover();
-				}
-			});
-			decDatas[i] = new FieldDecorationData(decoration, label, formData,
-					showOnFocus);
-		} else {
-			label = decDatas[i].label;
-			formData = decDatas[i].data;
-			decDatas[i].decoration = decoration;
-			decDatas[i].showOnFocus = showOnFocus;
-		}
-		label.setImage(decDatas[i].decoration.getImage());
-		label.setData(decDatas[i]);
-		label.setLayoutData(formData);
-		label.setVisible(!showOnFocus);
-
-		// Since sizes may have changed or there could be a new position
-		// defined, we need to update layout data on the control.
-		updateControlAttachments(i, decDatas[i]);
-	}
-
-	/*
-	 * A decoration at the specified index has been added. Update the control's
-	 * attachments if it has not previously been attached on that side or if it
-	 * was attached to a decoration with a lesser width.
-	 */
-	private void updateControlAttachments(int index, FieldDecorationData decData) {
-		FormData formData = (FormData) control.getLayoutData();
-		int newWidth = widthOf(decData.decoration.getImage());
-		// opposing represents the location of the decoration above or below
-		// the one in question.
-		int opposing;
-
-		switch (index) {
-		case LEFT_TOP:
-		case LEFT_BOTTOM:
-			if (index == LEFT_TOP) {
-				opposing = LEFT_BOTTOM;
-			} else {
-				opposing = LEFT_TOP;
-			}
-			if (decDatas[opposing] == null) {
-				// No decorator on the opposing side.
-				// Attach the control to this decorator
-				formData.left = new FormAttachment(decData.label);
-			} else if (decDatas[opposing].data.width < newWidth) {
-				// Decorator on opposing side is the smaller one. Attach
-				// control to the new one.
-				formData.left = new FormAttachment(decData.label);
-				// Center align the smaller one relative to the larger one.
-				decDatas[opposing].data.left.alignment = SWT.CENTER;
-				decDatas[opposing].data.left.control = decData.label;
-			} else {
-				// The new decorator is the smaller one. Keep the
-				// control attached to the opposing one.
-				formData = null;
-				// Horizontally center the smaller one relative to the larger
-				// one.
-				decData.data.left.alignment = SWT.CENTER;
-				decData.data.left.control = decDatas[opposing].label;
-			}
-			break;
-		/*
-		 * The only real difference in right side cases is that we are attaching
-		 * the right side of the control to the wider decoration rather than the
-		 * left side of the control. Other concerns (horizontally aligning the
-		 * smaller decoration relative to the larger one) are the same.
-		 */
-		case RIGHT_TOP:
-		case RIGHT_BOTTOM:
-			if (index == RIGHT_TOP) {
-				opposing = RIGHT_BOTTOM;
-			} else {
-				opposing = RIGHT_TOP;
-			}
-			if (decDatas[opposing] == null) {
-				// No decorator on the opposing side.
-				// Attach the control to this decorator.
-				formData.right = new FormAttachment(decData.label);
-			} else if (decDatas[opposing].data.width < newWidth) {
-				// Decorator on opposing side is the smaller one. Attach
-				// control to the new one.
-				formData.right = new FormAttachment(decData.label);
-				// Center align the smaller one to the larger one.
-				// Note that this could be done using the left or right
-				// attachment, we use the right since it is already
-				// created for all right-side decorations.
-				decDatas[opposing].data.right.alignment = SWT.CENTER;
-				decDatas[opposing].data.right.control = decData.label;
-			} else {
-				// The new decorator is the smaller one. Keep the
-				// control attached to the opposing one.
-				formData = null;
-				// Horizontally center align the smaller one to the
-				// larger one.
-				decData.data.right.alignment = SWT.CENTER;
-				decData.data.right.control = decDatas[opposing].label;
-			}
-			break;
-		default:
-			return;
-		}
-		if (formData != null) {
-			// Form data was updated.
-			control.setLayoutData(formData);
-			form.layout();
-		}
-	}
-
-	/**
-	 * Get the control that is decorated by the receiver.
-	 * 
-	 * @return the Control decorated by the receiver, or <code>null</code> if
-	 *         none has been created yet.
-	 */
-	public Control getControl() {
-		return control;
-	}
-
-	/**
-	 * Get the control that represents the decorated field. This composite
-	 * should be used to lay out the field within its parent.
-	 * 
-	 * @return the Control that should be layed out in the field's parent's
-	 *         layout. This is typically not the control itself, since
-	 *         additional controls are used to represent the decorations.
-	 */
-	public Control getLayoutControl() {
-		return form;
-	}
-
-	/**
-	 * Create the parent composite and a form layout that will be used to manage
-	 * decorations.
-	 */
-	private Composite createForm(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NO_FOCUS);
-		// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=126553
-		composite.setBackgroundMode(SWT.INHERIT_DEFAULT);
-		composite.setLayout(new FormLayout());
-		return composite;
-	}
-
-	/**
-	 * Add any listeners needed on the target control.
-	 */
-	private void addControlListeners() {
-		control.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent event) {
-				if (hover != null) {
-					hover.dispose();
-				}
-			}
-		});
-		control.addFocusListener(new FocusListener() {
-			public void focusGained(FocusEvent event) {
-				controlFocusGained();
-			}
-
-			public void focusLost(FocusEvent event) {
-				controlFocusLost();
-			}
-
-		});
-	}
-
-	/*
-	 * Return the index in the array of decoration datas that represents the
-	 * specified SWT position.
-	 * 
-	 * @param position The SWT constant indicating the position of the
-	 * decoration relative to the field's control. The position should include
-	 * style bits describing both the vertical and horizontal orientation.
-	 * <code>SWT.LEFT</code> and <code>SWT.RIGHT</code> describe the
-	 * horizontal placement of the decoration relative to the field, and the
-	 * constants <code>SWT.TOP</code> and <code>SWT.BOTTOM</code> describe
-	 * the vertical alignment of the decoration relative to the field.
-	 * Decorations always appear on either horizontal side of the field, never
-	 * above or below it. For example, a decoration appearing on the left side
-	 * of the field, at the top, is specified as SWT.LEFT | SWT.TOP.
-	 * 
-	 * @return index the index in the array of decorations that represents the
-	 * specified SWT position. If the position is not an expected position, the
-	 * index representing the top left position will be returned.
-	 * 
-	 */
-	private int indexForPosition(int position) {
-		switch (position) {
-		case SWT.LEFT | SWT.BOTTOM:
-			return LEFT_BOTTOM;
-		case SWT.RIGHT | SWT.TOP:
-			return RIGHT_TOP;
-		case SWT.RIGHT | SWT.BOTTOM:
-			return RIGHT_BOTTOM;
-		default:
-			return LEFT_TOP;
-		}
-	}
-
-	/*
-	 * Create a form data that will place the decoration at the specified
-	 * position.
-	 * 
-	 * @param index the index in the decDatas describing the position of the
-	 * decoration.
-	 * 
-	 * @param image the image shown in the decoration.
-	 * 
-	 */
-	private FormData createFormDataForIndex(int index, Image image) {
-		Assert.isTrue(index >= 0 && index < DECORATION_SLOTS,
-				"Index out of range"); //$NON-NLS-1$
-
-		FormData data = new FormData();
-		switch (index) {
-		case LEFT_TOP:
-			data.left = new FormAttachment(0, 0);
-			data.top = new FormAttachment(0, 0);
-			break;
-		case LEFT_BOTTOM:
-			data.left = new FormAttachment(0, 0);
-			data.bottom = new FormAttachment(100, 0);
-			break;
-		case RIGHT_TOP:
-			data.right = new FormAttachment(100, 0);
-			data.top = new FormAttachment(0, 0);
-			break;
-		case RIGHT_BOTTOM:
-			data.right = new FormAttachment(100, 0);
-			data.bottom = new FormAttachment(100, 0);
-			break;
-		}
-		data.width = widthOf(image);
-		data.height = SWT.DEFAULT;
-
-		return data;
-	}
-
-	/**
-	 * Show the specified text using the same hover dialog as is used to show
-	 * decorator descriptions. Normally, a decoration's description text will be
-	 * shown in an info hover over the field's control whenever the mouse hovers
-	 * over the decoration. This method can be used to show a decoration's
-	 * description text at other times (such as when the control receives
-	 * focus), or to show other text associated with the field.
-	 * 
-	 * <p>
-	 * If there is currently a hover visible, the hover's text will be replaced
-	 * with the specified text.
-	 * 
-	 * @param text
-	 *            the text to be shown in the info hover, or <code>null</code>
-	 *            if no text should be shown.
-	 */
-	public void showHoverText(String text) {
-		showHoverText(text, control);
-	}
-
-	/**
-	 * Hide any hover popups that are currently showing on the control.
-	 * Normally, a decoration's description text will be shown in an info hover
-	 * over the field's control as long as the mouse hovers over the decoration,
-	 * and will be hidden when the mouse exits the control. This method can be
-	 * used to hide a hover that was shown using <code>showHoverText</code>,
-	 * or to programatically hide the current decoration hover.
-	 * 
-	 * <p>
-	 * This message has no effect if there is no current hover.
-	 * 
-	 */
-	public void hideHover() {
-		if (hover != null) {
-			hover.setVisible(false);
-		}
-	}
-
-	/*
-	 * The target control gained focus. Any decorations that should show only
-	 * when they have the focus should be shown here.
-	 */
-	private void controlFocusGained() {
-		for (int i = 0; i < DECORATION_SLOTS; i++) {
-			if (decDatas[i] != null && decDatas[i].showOnFocus) {
-				setVisible(decDatas[i], true);
-			}
-		}
-	}
-
-	/*
-	 * The target control lost focus. Any decorations that should show only when
-	 * they have the focus should be hidden here.
-	 */
-	private void controlFocusLost() {
-		for (int i = 0; i < DECORATION_SLOTS; i++) {
-			if (decDatas[i] != null && decDatas[i].showOnFocus) {
-				setVisible(decDatas[i], false);
-			}
-		}
-	}
-
-	/**
-	 * Show the specified decoration. This message has no effect if the
-	 * decoration is already showing, or was not already added to the field
-	 * using <code>addFieldDecoration</code>.
-	 * 
-	 * @param decoration
-	 *            the decoration to be shown.
-	 */
-	public void showDecoration(FieldDecoration decoration) {
-		FieldDecorationData data = getDecorationData(decoration);
-		if (data == null) {
-			return;
-		}
-		// record the fact that client would like it to be visible
-		data.visible = true;
-		// even if it is supposed to be shown, if the field does not have focus,
-		// do not show it (yet)
-		if (!data.showOnFocus || control.isFocusControl()) {
-			setVisible(data, true);
-		}
-	}
-
-	/**
-	 * Hide the specified decoration. This message has no effect if the
-	 * decoration is already hidden, or was not already added to the field using
-	 * <code>addFieldDecoration</code>.
-	 * 
-	 * @param decoration
-	 *            the decoration to be hidden.
-	 */
-	public void hideDecoration(FieldDecoration decoration) {
-		FieldDecorationData data = getDecorationData(decoration);
-		if (data == null) {
-			return;
-		}
-		// Store the desired visibility in the decData. We remember the
-		// client's instructions so that changes in visibility caused by
-		// field focus changes won't violate the client's visibility setting.
-		data.visible = false;
-		setVisible(data, false);
-	}
-
-	/**
-	 * Update the specified decoration. This message should be used if the image
-	 * or description in the decoration have changed. This message has no
-	 * immediate effect if the decoration is not visible, and no effect at all
-	 * if the decoration was not previously added to the field.
-	 * 
-	 * @param decoration
-	 *            the decoration to be hidden.
-	 */
-	public void updateDecoration(FieldDecoration decoration) {
-		FieldDecorationData data = getDecorationData(decoration);
-		if (data == null) {
-			return;
-		}
-		if (data.label != null) {
-			data.label.setImage(decoration.getImage());
-			// If the decoration is being shown, and a hover is active,
-			// update the hover text to display the new description.
-			if (data.label.getVisible() == true && hover != null) {
-				showHoverText(decoration.getDescription(), data.label);
-			}
-		}
-	}
-
-	/*
-	 * Set the visibility of the specified decoration data. This method does not
-	 * change the visibility value stored in the decData, but instead consults
-	 * it to determine how the visibility should be changed. This method is
-	 * called any time visibility of a decoration might change, whether by
-	 * client API or focus changes.
-	 */
-	private void setVisible(FieldDecorationData decData, boolean visible) {
-		// Check the decData visibility flag, since it contains the client's
-		// instructions for visibility.
-		if (visible && decData.visible) {
-			decData.label.setVisible(true);
-		} else {
-			decData.label.setVisible(false);
-		}
-	}
-
-	/*
-	 * Get the FieldDecorationData that corresponds to the given decoration.
-	 */
-	private FieldDecorationData getDecorationData(FieldDecoration dec) {
-		for (int i = 0; i < DECORATION_SLOTS; i++) {
-			if (decDatas[i] != null && dec == decDatas[i].decoration
-					&& decDatas[i].label != null
-					&& !decDatas[i].label.isDisposed()) {
-				return decDatas[i];
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * Show the specified text in the hover, positioning the hover near the
-	 * specified control.
-	 */
-	private void showHoverText(String text, Control hoverNear) {
-		if (text == null) {
-			hideHover();
-			return;
-		}
-
-		if (hover == null) {
-			hover = new Hover(hoverNear.getShell());
-		}
-		hover.setText(text, hoverNear, control);
-		hover.setVisible(true);
-	}
-
-	/**
-	 * Set a boolean that indicates whether the receiver should use the
-	 * decoration registry's maximum decoration width when allocating space for
-	 * decorations. The default value is <code>true</code>. Using the maximum
-	 * decoration width is useful so that decorated fields on the same dialog
-	 * that have different decoration widths will all align. This also allows
-	 * client dialogs to align non-decorated fields with decorated fields by
-	 * consulting the maximum decoration width.
-	 * </p>
-	 * <p>
-	 * Clients may wish to set this value to <code>false</code> in cases where
-	 * space usage is more important than alignment of fields. This value must
-	 * be set before the decorations are added in order to ensure proper
-	 * alignment.
-	 * </p>
-	 * 
-	 * @param useMaximumWidth
-	 *            <code>true</code> if the maximum decoration width should be
-	 *            used as the size for all decorations, <code>false</code> if
-	 *            only the decoration size should be used.
-	 * 
-	 * @see FieldDecorationRegistry#getMaximumDecorationWidth()
-	 */
-	public void setUseMaximumDecorationWidth(boolean useMaximumWidth) {
-		useMaxDecorationWidth = useMaximumWidth;
-	}
-
-	/*
-	 * Return the width appropriate for the specified decoration image.
-	 */
-	private int widthOf(Image image) {
-		if (image == null) {
-			return 0;
-		}
-		return useMaxDecorationWidth ? FieldDecorationRegistry.getDefault()
-				.getMaximumDecorationWidth() : image.getBounds().width;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/FieldAssistColors.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/FieldAssistColors.java
deleted file mode 100644
index 7fcd603..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/FieldAssistColors.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.resource.JFaceColors;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * FieldAssistColors defines protocol for retrieving colors that can be used to
- * provide visual cues with fields. For consistency with JFace dialogs and
- * wizards, it is recommended that FieldAssistColors is used when colors are
- * used to annotate fields.
- * <p>
- * Color resources that are returned using methods in this class are maintained
- * in the JFace color registries, or by SWT. Users of any color resources
- * provided by this class are not responsible for the lifecycle of the color.
- * Colors provided by this class should never be disposed by clients. In some
- * cases, clients are provided information, such as RGB values, in order to
- * create their own color resources. In these cases, the client should manage
- * the lifecycle of any created resource.
- * 
- * @since 3.2
- * @deprecated As of 3.3, this class is no longer necessary.
- */
-public class FieldAssistColors {
-
-	private static boolean DEBUG = false;
-
-	/*
-	 * Keys are background colors, values are the color with the alpha value
-	 * applied
-	 */
-	private static Map requiredFieldColorMap = new HashMap();
-
-	/*
-	 * Keys are colors we have created, values are the displays on which they
-	 * were created.
-	 */
-	private static Map displays = new HashMap();
-
-	/**
-	 * Compute the RGB of the color that should be used for the background of a
-	 * control to indicate that the control has an error. Because the color
-	 * suitable for indicating an error depends on the colors set into the
-	 * control, this color is always computed dynamically and provided as an RGB
-	 * value. Clients who use this RGB to create a Color resource are
-	 * responsible for managing the life cycle of the color.
-	 * <p>
-	 * This color is computed dynamically each time that it is queried. Clients
-	 * should typically call this method once, create a color from the RGB
-	 * provided, and dispose of the color when finished using it.
-	 * 
-	 * @param control
-	 *            the control for which the background color should be computed.
-	 * @return the RGB value indicating a background color appropriate for
-	 *         indicating an error in the control.
-	 */
-	public static RGB computeErrorFieldBackgroundRGB(Control control) {
-		/*
-		 * Use a 10% alpha of the error color applied on top of the widget
-		 * background color.
-		 */
-		Color dest = control.getBackground();
-		Color src = JFaceColors.getErrorText(control.getDisplay());
-		int destRed = dest.getRed();
-		int destGreen = dest.getGreen();
-		int destBlue = dest.getBlue();
-
-		// 10% alpha
-		int alpha = (int) (0xFF * 0.10f);
-		// Alpha blending math
-		destRed += (src.getRed() - destRed) * alpha / 0xFF;
-		destGreen += (src.getGreen() - destGreen) * alpha / 0xFF;
-		destBlue += (src.getBlue() - destBlue) * alpha / 0xFF;
-
-		return new RGB(destRed, destGreen, destBlue);
-	}
-
-	/**
-	 * Return the color that should be used for the background of a control to
-	 * indicate that the control is a required field and does not have content.
-	 * <p>
-	 * This color is managed by FieldAssistResources and should never be
-	 * disposed by clients.
-	 * 
-	 * @param control
-	 *            the control on which the background color will be used.
-	 * @return the color used to indicate that a field is required.
-	 */
-	public static Color getRequiredFieldBackgroundColor(Control control) {
-		final Display display = control.getDisplay();
-
-		// If we are in high contrast mode, then don't apply an alpha
-		if (display.getHighContrast()) {
-			return control.getBackground();
-		}
-
-		// See if a color has already been computed
-		Object storedColor = requiredFieldColorMap.get(control.getBackground());
-		if (storedColor != null) {
-			return (Color) storedColor;
-		}
-
-		// There is no color already created, so we must create one.
-		// Use a 15% alpha of yellow on top of the widget background.
-		Color dest = control.getBackground();
-		Color src = display.getSystemColor(SWT.COLOR_YELLOW);
-		int destRed = dest.getRed();
-		int destGreen = dest.getGreen();
-		int destBlue = dest.getBlue();
-
-		// 15% alpha
-		int alpha = (int) (0xFF * 0.15f);
-		// Alpha blending math
-		destRed += (src.getRed() - destRed) * alpha / 0xFF;
-		destGreen += (src.getGreen() - destGreen) * alpha / 0xFF;
-		destBlue += (src.getBlue() - destBlue) * alpha / 0xFF;
-
-		// create the color
-		Color color = new Color(display, destRed, destGreen, destBlue);
-		// record the color in a map using the original color as the key
-		requiredFieldColorMap.put(dest, color);
-		// If we have never created a color on this display before, install
-		// a dispose exec on the display.
-		if (!displays.containsValue(display)) {
-			display.disposeExec(new Runnable() {
-				public void run() {
-					disposeColors(display);
-				}
-			});
-		}
-		// Record the color and its display in a map for later disposal.
-		displays.put(color, display);
-		return color;
-	}
-
-	/*
-	 * Dispose any colors that were allocated for the given display.
-	 */
-	private static void disposeColors(Display display) {
-		List toBeRemoved = new ArrayList(1);
-
-		if (DEBUG) {
-			System.out.println("Display map is " + displays.toString()); //$NON-NLS-1$
-			System.out
-					.println("Color map is " + requiredFieldColorMap.toString()); //$NON-NLS-1$
-		}
-
-		// Look for any stored colors that were created on this display
-		for (Iterator i = displays.keySet().iterator(); i.hasNext();) {
-			Color color = (Color) i.next();
-			if (((Display) displays.get(color)).equals(display)) {
-				// The color is on this display. Mark it for removal.
-				toBeRemoved.add(color);
-
-				// Now look for any references to it in the required field color
-				// map
-				List toBeRemovedFromRequiredMap = new ArrayList(1);
-				for (Iterator iter = requiredFieldColorMap.keySet().iterator(); iter
-						.hasNext();) {
-					Color bgColor = (Color) iter.next();
-					if (((Color) requiredFieldColorMap.get(bgColor))
-							.equals(color)) {
-						// mark it for removal from the required field color map
-						toBeRemovedFromRequiredMap.add(bgColor);
-					}
-				}
-				// Remove references in the required field map now that
-				// we are done iterating.
-				for (int j = 0; j < toBeRemovedFromRequiredMap.size(); j++) {
-					requiredFieldColorMap.remove(toBeRemovedFromRequiredMap
-							.get(j));
-				}
-			}
-		}
-		// Remove references in the display map now that we are
-		// done iterating
-		for (int i = 0; i < toBeRemoved.size(); i++) {
-			Color color = (Color) toBeRemoved.get(i);
-			// Removing from the display map must be done before disposing the
-			// color or else the comparison between this color and the one
-			// in the map will fail.
-			displays.remove(color);
-			// Dispose it
-			if (DEBUG) {
-				System.out.println("Disposing color " + color.toString()); //$NON-NLS-1$
-			}
-			color.dispose();
-		}
-		if (DEBUG) {
-			System.out.println("Display map is " + displays.toString()); //$NON-NLS-1$
-			System.out
-					.println("Color map is " + requiredFieldColorMap.toString()); //$NON-NLS-1$
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/FieldDecoration.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/FieldDecoration.java
deleted file mode 100644
index 597661c..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/FieldDecoration.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * FieldDecoration is a simple data structure class for specifying a decoration
- * for a field. A decoration may be rendered in different ways depending on the
- * type of field it is used with.
- * 
- * @see FieldDecorationRegistry
- * 
- * @since 3.2
- */
-public class FieldDecoration {
-
-	/*
-	 * The image to be shown in the decoration.
-	 */
-	private Image image;
-
-	/*
-	 * The description to show in the decoration's hover.
-	 */
-	private String description;
-
-	/**
-	 * Create a decoration for a field with the specified image and description
-	 * text.
-	 * 
-	 * @param image
-	 *            the image shown in the decoration. A <code>null</code> image
-	 *            will result in a blank decoration, which may be used to
-	 *            reserve space near the field.
-	 * @param description
-	 *            the description shown when the user hovers over the
-	 *            decoration. A <code>null</code> description indicates that
-	 *            there will be no hover for the decoration.
-	 */
-	public FieldDecoration(Image image, String description) {
-		this.image = image;
-		this.description = description;
-	}
-
-	/**
-	 * Return the image shown in the decoration, or <code>null</code> if no
-	 * image is specified.
-	 * 
-	 * @return the image shown in the decoration. A return value of
-	 *         <code>null</code> signifies a blank decoration.
-	 */
-	public Image getImage() {
-		return image;
-	}
-
-	/**
-	 * Set the image shown in the decoration, or <code>null</code> if no image
-	 * is specified. It is up to the caller to update any decorated fields that
-	 * are showing the description in order to display the new image.
-	 * 
-	 * @param image
-	 *            the image shown in the decoration. A value of
-	 *            <code>null</code> signifies a blank decoration.
-	 */
-	public void setImage(Image image) {
-		this.image = image;
-	}
-
-	/**
-	 * Return the description for the decoration shown when the user hovers over
-	 * the decoration.
-	 * 
-	 * @return the String description of the decoration. A return value of
-	 *         <code>null</code> indicates that no description will be shown.
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	/**
-	 * Set the description for the decoration shown when the user hovers over
-	 * the decoration. It is up to the caller to update any decorated fields
-	 * showing the description.
-	 * 
-	 * @param description
-	 *            the String description of the decoration. A value of
-	 *            <code>null</code> indicates that no description will be
-	 *            shown.
-	 */
-	public void setDescription(String description) {
-		this.description = description;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/FieldDecorationRegistry.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/FieldDecorationRegistry.java
deleted file mode 100644
index b70a6d9..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/FieldDecorationRegistry.java
+++ /dev/null
@@ -1,409 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-import java.util.HashMap;
-import java.util.Iterator;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * FieldDecorationRegistry is a common registry used to define shared field
- * decorations within an application. Unlike resource registries, the
- * FieldDecorationRegistry does not perform any lifecycle management of the
- * decorations.
- * </p>
- * <p>
- * Clients may specify images for the decorations in several different ways.
- * Images may be described by their image id in a specified
- * {@link ImageRegistry}. In this case, the life cycle of the image is managed
- * by the image registry, and the decoration registry will not attempt to obtain
- * an image from the image registry until the decoration is actually requested.
- * In cases where the client has access to an already-created image, the image
- * itself can be specified when registering the decoration. In this case, the
- * life cycle should be managed by the specifying client.
- * </p>
- * 
- * @see FieldDecoration
- * @see ImageRegistry
- * 
- * @since 3.2
- */
-public class FieldDecorationRegistry {
-
-	/**
-	 * Decoration id for the decoration that should be used to cue the user that
-	 * content proposals are available.
-	 */
-	public static final String DEC_CONTENT_PROPOSAL = "DEC_CONTENT_PROPOSAL"; //$NON-NLS-1$
-
-	/**
-	 * Decoration id for the decoration that should be used to cue the user that
-	 * a field is required.
-	 */
-	public static final String DEC_REQUIRED = "DEC_REQUIRED"; //$NON-NLS-1$
-
-	/**
-	 * Decoration id for the decoration that should be used to cue the user that
-	 * a field has an error.
-	 */
-	public static final String DEC_ERROR = "DEC_ERROR"; //$NON-NLS-1$
-
-	/**
-	 * Decoration id for the decoration that should be used to cue the user that
-	 * a field has a warning.
-	 */
-	public static final String DEC_WARNING = "DEC_WARNING"; //$NON-NLS-1$
-
-	/**
-	 * Decoration id for the decoration that should be used to cue the user that
-	 * a field has additional information.
-	 * 
-	 * @since 3.3
-	 */
-	public static final String DEC_INFORMATION = "DEC_INFORMATION"; //$NON-NLS-1$
-
-	/**
-	 * Decoration id for the decoration that should be used to cue the user that
-	 * a field has an error with quick fix available.
-	 * 
-	 * @since 3.3
-	 */
-	public static final String DEC_ERROR_QUICKFIX = "DEC_ERRORQUICKFIX"; //$NON-NLS-1$
-
-	/*
-	 * Image id's
-	 */
-	private static final String IMG_DEC_FIELD_CONTENT_PROPOSAL = "org.eclipse.jface.fieldassist.IMG_DEC_FIELD_CONTENT_PROPOSAL"; //$NON-NLS-1$
-
-	private static final String IMG_DEC_FIELD_REQUIRED = "org.eclipse.jface.fieldassist.IMG_DEC_FIELD_REQUIRED"; //$NON-NLS-1$
-
-	private static final String IMG_DEC_FIELD_ERROR = "org.eclipse.jface.fieldassist.IMG_DEC_FIELD_ERROR"; //$NON-NLS-1$
-	
-	private static final String IMG_DEC_FIELD_ERROR_QUICKFIX = "org.eclipse.jface.fieldassist.IMG_DEC_FIELD_ERROR_QUICKFIX"; //$NON-NLS-1$
-
-	private static final String IMG_DEC_FIELD_WARNING = "org.eclipse.jface.fieldassist.IMG_DEC_FIELD_WARNING"; //$NON-NLS-1$
-
-	private static final String IMG_DEC_FIELD_INFO = "org.eclipse.jface.fieldassist.IMG_DEC_FIELD_INFO"; //$NON-NLS-1$
-
-	/*
-	 * Declare images and decorations immediately.
-	 */
-	static {
-		ImageRegistry imageRegistry = JFaceResources.getImageRegistry();
-
-		// Define the images used in the standard decorations.
-		imageRegistry.put(IMG_DEC_FIELD_CONTENT_PROPOSAL, ImageDescriptor
-				.createFromFile(FieldDecorationRegistry.class,
-						"images/contassist_ovr.gif"));//$NON-NLS-1$
-		imageRegistry.put(IMG_DEC_FIELD_ERROR, ImageDescriptor.createFromFile(
-				FieldDecorationRegistry.class, "images/error_ovr.gif"));//$NON-NLS-1$
-
-		imageRegistry.put(IMG_DEC_FIELD_WARNING, ImageDescriptor
-				.createFromFile(FieldDecorationRegistry.class,
-						"images/warn_ovr.gif"));//$NON-NLS-1$
-
-		imageRegistry.put(IMG_DEC_FIELD_REQUIRED, ImageDescriptor
-				.createFromFile(FieldDecorationRegistry.class,
-						"images/required_field_cue.gif"));//$NON-NLS-1$	
-		
-		imageRegistry.put(IMG_DEC_FIELD_ERROR_QUICKFIX, ImageDescriptor
-				.createFromFile(FieldDecorationRegistry.class,
-						"images/errorqf_ovr.gif"));//$NON-NLS-1$
-		
-		imageRegistry.put(IMG_DEC_FIELD_INFO, ImageDescriptor
-				.createFromFile(FieldDecorationRegistry.class,
-						"images/info_ovr.gif"));//$NON-NLS-1$		
-
-		// Define the standard decorations. Some do not have standard
-		// descriptions. Use null in these cases.
-		getDefault()
-				.registerFieldDecoration(
-						DEC_CONTENT_PROPOSAL,
-						JFaceResources
-								.getString("FieldDecorationRegistry.contentAssistMessage"), //$NON-NLS-1$
-						IMG_DEC_FIELD_CONTENT_PROPOSAL, imageRegistry);
-
-		getDefault().registerFieldDecoration(
-				DEC_ERROR,
-				JFaceResources
-						.getString("FieldDecorationRegistry.errorMessage"), //$NON-NLS-1$
-				IMG_DEC_FIELD_ERROR, imageRegistry);
-		
-		getDefault().registerFieldDecoration(
-				DEC_ERROR_QUICKFIX,
-				JFaceResources
-						.getString("FieldDecorationRegistry.errorQuickFixMessage"), //$NON-NLS-1$
-				IMG_DEC_FIELD_ERROR_QUICKFIX, imageRegistry);
-
-		getDefault().registerFieldDecoration(DEC_WARNING, null,
-				IMG_DEC_FIELD_WARNING, imageRegistry);
-		
-		getDefault().registerFieldDecoration(DEC_INFORMATION, null,
-				IMG_DEC_FIELD_INFO, imageRegistry);
-
-		getDefault()
-				.registerFieldDecoration(
-						DEC_REQUIRED,
-						JFaceResources
-								.getString("FieldDecorationRegistry.requiredFieldMessage"), //$NON-NLS-1$
-						IMG_DEC_FIELD_REQUIRED, imageRegistry);
-
-	}
-
-	/*
-	 * Data structure that holds onto the decoration image info and description,
-	 * and can produce a decorator on request.
-	 */
-	class Entry {
-		private String description;
-
-		private String imageId;
-
-		private ImageRegistry imageRegistry;
-
-		private Image image;
-
-		private FieldDecoration decoration;
-
-		Entry(String description, String imageId, ImageRegistry registry) {
-			this.description = description;
-			this.imageId = imageId;
-			this.imageRegistry = registry;
-		}
-
-		Entry(String description, Image image) {
-			this.description = description;
-			this.image = image;
-		}
-
-		FieldDecoration getDecoration() {
-			if (decoration == null) {
-				if (image == null) {
-					if (imageRegistry == null) {
-						imageRegistry = JFaceResources.getImageRegistry();
-					}
-					image = imageRegistry.get(imageId);
-				}
-				decoration = new FieldDecoration(image, description);
-			}
-			// Null out all other fields now that the decoration has an image
-			description = null;
-			imageId = null;
-			imageRegistry = null;
-			image = null;
-
-			return decoration;
-		}
-	}
-
-	/**
-	 * Default instance of the registry. Applications may install their own
-	 * registry.
-	 */
-	private static FieldDecorationRegistry defaultInstance;
-
-	/**
-	 * Maximum width and height used by decorations in this registry. Clients
-	 * may use these values to reserve space in dialogs for decorations or to
-	 * adjust layouts so that decorated and non-decorated fields line up.
-	 */
-	private int maxDecorationWidth = 0;
-	private int maxDecorationHeight = 0;
-
-	private HashMap /* <String id, FieldDecoration> */decorations = new HashMap();
-
-	/**
-	 * Get the default FieldDecorationRegistry.
-	 * 
-	 * @return the singleton FieldDecorationRegistry that is used to manage
-	 *         shared field decorations.
-	 */
-	public static FieldDecorationRegistry getDefault() {
-		if (defaultInstance == null) {
-			defaultInstance = new FieldDecorationRegistry();
-		}
-		return defaultInstance;
-	}
-
-	/**
-	 * Set the default FieldDecorationRegistry.
-	 * 
-	 * @param defaultRegistry
-	 *            the singleton FieldDecorationRegistry that is used to manage
-	 *            shared field decorations.
-	 */
-	public static void setDefault(FieldDecorationRegistry defaultRegistry) {
-		defaultInstance = defaultRegistry;
-	}
-
-	/**
-	 * Construct a FieldDecorationRegistry.
-	 */
-	public FieldDecorationRegistry() {
-		maxDecorationWidth = 0;
-		maxDecorationHeight = 0;
-	}
-
-	/**
-	 * Get the maximum width (in pixels) of any decoration retrieved so far in
-	 * the registry. This value changes as decorations are added and retrieved.
-	 * This value can be used by clients to reserve space or otherwise compute
-	 * margins when aligning non-decorated fields with decorated fields.
-	 * 
-	 * @return the maximum width in pixels of any accessed decoration
-	 */
-	public int getMaximumDecorationWidth() {
-		return maxDecorationWidth;
-	}
-
-	/**
-	 * Get the maximum height (in pixels) of any decoration retrieved so far in
-	 * the registry. This value changes as decorations are added and retrieved.
-	 * This value can be used by clients to reserve space or otherwise compute
-	 * margins when aligning non-decorated fields with decorated fields.
-	 * 
-	 * 
-	 * @return the maximum height in pixels of any accessed decoration
-	 */
-	public int getMaximumDecorationHeight() {
-		return maxDecorationHeight;
-	}
-
-	/**
-	 * Registers a field decoration using the specified id. The lifecyle of the
-	 * supplied image should be managed by the client. That is, it will never be
-	 * disposed by this registry and the decoration should be removed from the
-	 * registry if the image is ever disposed elsewhere.
-	 * 
-	 * @param id
-	 *            the String id used to identify and access the decoration.
-	 * @param description
-	 *            the String description to be used in the decoration, or
-	 *            <code>null</code> if the decoration has no description.
-	 * @param image
-	 *            the image to be used in the decoration
-	 */
-	public void registerFieldDecoration(String id, String description,
-			Image image) {
-		decorations.put(id, new Entry(description, image));
-		// Recompute the maximums since this might be a replacement
-		recomputeMaximums();
-	}
-
-	/**
-	 * Registers a field decoration using the specified id. An image id of an
-	 * image located in the default JFaceResources image registry is supplied.
-	 * The image will not be created until the decoration is requested.
-	 * 
-	 * @param id
-	 *            the String id used to identify and access the decoration.
-	 * @param description
-	 *            the String description to be used in the decoration, or
-	 *            <code>null</code> if the decoration has no description. *
-	 * @param imageId
-	 *            the id of the image in the JFaceResources image registry that
-	 *            is used for this decorator
-	 */
-	public void registerFieldDecoration(String id, String description,
-			String imageId) {
-		decorations.put(id, new Entry(description, imageId, JFaceResources
-				.getImageRegistry()));
-		// Recompute the maximums as this could be a replacement of a previous
-		// image.
-		recomputeMaximums();
-	}
-
-	/**
-	 * Registers a field decoration using the specified id. An image id and an
-	 * image registry are supplied. The image will not be created until the
-	 * decoration is requested.
-	 * 
-	 * @param id
-	 *            the String id used to identify and access the decoration.
-	 * @param description
-	 *            the String description to be used in the decoration, or
-	 *            <code>null</code> if the decoration has no description. *
-	 * @param imageId
-	 *            the id of the image in the supplied image registry that is
-	 *            used for this decorator
-	 * @param imageRegistry
-	 *            the registry used to obtain the image
-	 */
-	public void registerFieldDecoration(String id, String description,
-			String imageId, ImageRegistry imageRegistry) {
-		decorations.put(id, new Entry(description, imageId, imageRegistry));
-		// Recompute the maximums since this could be a replacement
-		recomputeMaximums();
-	}
-
-	/**
-	 * Unregisters the field decoration with the specified id. No lifecycle
-	 * management is performed on the decoration's image. This message has no
-	 * effect if no field decoration with the specified id was previously
-	 * registered.
-	 * </p>
-	 * <p>
-	 * This method need not be called if the registered decoration's image is
-	 * managed in an image registry. In that case, leaving the decoration in the
-	 * registry will do no harm since the image will remain valid and will be
-	 * properly disposed when the application is shut down. This method should
-	 * be used in cases where the caller intends to dispose of the image
-	 * referred to by the decoration, or otherwise determines that the
-	 * decoration should no longer be used.
-	 * 
-	 * @param id
-	 *            the String id of the decoration to be unregistered.
-	 */
-	public void unregisterFieldDecoration(String id) {
-		decorations.remove(id);
-		recomputeMaximums();
-	}
-
-	/**
-	 * Returns the field decoration registered by the specified id .
-	 * 
-	 * @param id
-	 *            the String id used to access the decoration.
-	 * @return the FieldDecoration with the specified id, or <code>null</code>
-	 *         if there is no decoration with the specified id.
-	 */
-	public FieldDecoration getFieldDecoration(String id) {
-		Object entry = decorations.get(id);
-		if (entry == null) {
-			return null;
-		}
-		return ((Entry) entry).getDecoration();
-
-	}
-
-	/*
-	 * The maximum decoration width and height must be recomputed. Typically
-	 * called in response to adding, removing, or replacing a decoration.
-	 */
-	private void recomputeMaximums() {
-		Iterator entries = decorations.values().iterator();
-		
-		maxDecorationHeight = 0;
-		maxDecorationWidth = 0;
-		while (entries.hasNext()) {
-			Image image = ((Entry)entries.next()).getDecoration().getImage();
-			if (image != null) {
-				maxDecorationHeight = Math.max(maxDecorationHeight, image.getBounds().height);
-				maxDecorationWidth = Math.max(maxDecorationWidth, image.getBounds().width);
-			}
-		}
-
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IContentProposal.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IContentProposal.java
deleted file mode 100644
index 538e7f6..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IContentProposal.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-/**
- * IContentProposal describes a content proposal to be shown. It consists of the
- * content that will be provided if the proposal is accepted, an optional label
- * used to describe the content to the user, and an optional description that
- * further elaborates the meaning of the proposal.
- * 
- * @since 3.2
- */
-public interface IContentProposal {
-	/**
-	 * Return the content represented by this proposal.
-	 * 
-	 * @return the String content represented by this proposal.
-	 */
-	public String getContent();
-
-	/**
-	 * Return the integer position within the contents that the cursor should be
-	 * placed after the proposal is accepted.
-	 * 
-	 * @return the zero-based index position within the contents where the
-	 *         cursor should be placed after the proposal is accepted.
-	 */
-	public int getCursorPosition();
-
-	/**
-	 * Return the label used to describe this proposal.
-	 * 
-	 * @return the String label used to display the proposal. If
-	 *         <code>null</code>, then the content will be displayed as the
-	 *         label.
-	 */
-	public String getLabel();
-
-	/**
-	 * Return a description that describes this proposal.
-	 * 
-	 * @return the String label used to further the proposal. If
-	 *         <code>null</code>, then no description will be displayed.
-	 */
-	public String getDescription();
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IContentProposalListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IContentProposalListener.java
deleted file mode 100644
index 61a2310..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IContentProposalListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-/**
- * This interface is used to listen to notifications from a
- * {@link ContentProposalAdapter}.
- * 
- * @since 3.2
- */
-public interface IContentProposalListener {
-	/**
-	 * A content proposal has been accepted.
-	 * 
-	 * @param proposal
-	 *            the accepted content proposal
-	 */
-	public void proposalAccepted(IContentProposal proposal);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IContentProposalListener2.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IContentProposalListener2.java
deleted file mode 100644
index 31c0d4d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IContentProposalListener2.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-/**
- * This interface is used to listen to additional notifications from a
- * {@link ContentProposalAdapter}.
- * 
- * @since 3.3
- */
-public interface IContentProposalListener2 {
-	/**
-	 * A content proposal popup has been opened for content proposal assistance.
-	 * 
-	 * @param adapter
-	 *            the ContentProposalAdapter which is providing content proposal
-	 *            behavior to a control
-	 */
-	public void proposalPopupOpened(ContentProposalAdapter adapter);
-
-	/**
-	 * A content proposal popup has been closed.
-	 * 
-	 * @param adapter
-	 *            the ContentProposalAdapter which is providing content proposal
-	 *            behavior to a control
-	 */
-	public void proposalPopupClosed(ContentProposalAdapter adapter);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IContentProposalProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IContentProposalProvider.java
deleted file mode 100644
index 55983e0..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IContentProposalProvider.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-/**
- * IContentProposalProvider provides an array of IContentProposals that are
- * appropriate for a textual dialog field, given the field's current content and
- * the current cursor position. 
- * 
- * @since 3.2
- */
-public interface IContentProposalProvider {
-
-	/**
-	 * Return an array of Objects representing the valid content proposals for a
-	 * field.
-	 * 
-	 * @param contents
-	 *            the current contents of the text field
-	 * @param position
-	 *            the current position of the cursor in the contents
-	 * 
-	 * @return the array of {@link IContentProposal} that represent valid
-	 *         proposals for the field.
-	 */
-	IContentProposal[] getProposals(String contents, int position);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IControlContentAdapter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IControlContentAdapter.java
deleted file mode 100644
index b76025c..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IControlContentAdapter.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * This interface is used to set and retrieve text content from an arbitrary
- * control. Clients are expected to implement this interface when defining a
- * {@link ContentProposalAdapter}, in order to specify how to retrieve and set
- * the contents of the control being adapted.
- * 
- * @since 3.2
- */
-public interface IControlContentAdapter {
-	/**
-	 * Set the contents of the specified control to the specified text. Must not
-	 * be <code>null</code>.
-	 * 
-	 * @param control
-	 *            the control whose contents are to be set (replaced).
-	 * @param contents
-	 *            the String specifying the new control content.
-	 * @param cursorPosition
-	 *            the zero-based index representing the desired cursor position
-	 *            in the control's contents after the contents are set.
-	 */
-	public void setControlContents(Control control, String contents,
-			int cursorPosition);
-
-	/**
-	 * Insert the specified contents into the control's current contents. Must
-	 * not be <code>null</code>.
-	 * 
-	 * @param control
-	 *            the control whose contents are to be altered.
-	 * @param contents
-	 *            the String to be inserted into the control contents.
-	 * @param cursorPosition
-	 *            the zero-based index representing the desired cursor position
-	 *            within the inserted contents after the insertion is made.
-	 */
-	public void insertControlContents(Control control, String contents,
-			int cursorPosition);
-
-	/**
-	 * Get the text contents of the control.
-	 * 
-	 * @param control
-	 *            the control whose contents are to be retrieved.
-	 * @return the String contents of the control.
-	 */
-	public String getControlContents(Control control);
-
-	/**
-	 * Get the current cursor position in the control. The position is specified
-	 * as a zero-based index into the string. Valid ranges are from 0 to N,
-	 * where N is the size of the contents string. A value of N indicates that
-	 * the cursor is at the end of the contents.
-	 * 
-	 * @param control
-	 *            the control whose position is to be retrieved.
-	 * @return the zero-based index representing the cursor position in the
-	 *         control's contents.
-	 */
-	public int getCursorPosition(Control control);
-
-	/**
-	 * Get the bounds (in pixels) of the insertion point for the control
-	 * content. This is a rectangle, in coordinates relative to the control,
-	 * where the insertion point is displayed. If the implementer does not have
-	 * an insertion point, or cannot determine the location of the insertion
-	 * point, it is appropriate to return the bounds of the entire control. This
-	 * value may be used to position a content proposal popup.
-	 * 
-	 * @param control
-	 *            the control whose offset is to be retrieved.
-	 * @return the pixel width representing the distance between the edge of the
-	 *         control and the insertion point.
-	 */
-	public Rectangle getInsertionBounds(Control control);
-
-	/**
-	 * Set the current cursor position in the control. The position is specified
-	 * as a zero-based index into the string. Valid ranges are from 0 to N,
-	 * where N is the size of the contents string. A value of N indicates that
-	 * the cursor is at the end of the contents.
-	 * 
-	 * @param control
-	 *            the control whose cursor position is to be set.
-	 * @param index
-	 *            the zero-based index representing the cursor position in the
-	 *            control's contents.
-	 */
-	public void setCursorPosition(Control control, int index);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IControlContentAdapter2.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IControlContentAdapter2.java
deleted file mode 100644
index bc6192b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IControlContentAdapter2.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * This interface is used by a {@link ContentProposalAdapter} in order to
- * retrieve and set the selection range in a control.
- * 
- * @since 3.4
- */
-public interface IControlContentAdapter2 {
-	/**
-	 * Get the current selection range in the control. The x coordinate of the
-	 * returned point is the position of the first selected character and the y
-	 * coordinate of the returned point is the position of the last selected
-	 * character. The positions are specified as a zero-based index into the
-	 * string. Valid ranges are from 0 to N, where N is the size of the contents
-	 * string. A value of N indicates that the last character is in the
-	 * selection.
-	 * 
-	 * @param control
-	 *            the control whose position is to be retrieved.
-	 * @return a point representing the selection start and end
-	 */
-	public Point getSelection(Control control);
-
-	/**
-	 * Set the current selection range in the control. The x coordinate of the
-	 * provided point is the position of the first selected character and the y
-	 * coordinate of the point is the position of the last selected character.
-	 * The positions are specified as a zero-based index into the string. Valid
-	 * ranges are from 0 to N, where N is the size of the contents string. A
-	 * value of N indicates that the last character is in the selection. If the
-	 * x and y coordinates are the same, then there is no selection.
-	 * 
-	 * @param control
-	 *            the control whose position is to be retrieved.
-	 * @param range
-	 *            a point representing the selection start and end
-	 */
-	public void setSelection(Control control, Point range);
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IControlCreator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IControlCreator.java
deleted file mode 100644
index d083e42..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/IControlCreator.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * This interface is used to create a control with a specific parent and style
- * bits. It is used by {@link DecoratedField} to create the control to be
- * decorated. Clients are expected to implement this interface in order to
- * create a particular kind of control for decoration.
- * 
- * @since 3.2
- * @deprecated As of 3.3, clients should use {@link ControlDecoration} instead
- *             of {@link DecoratedField}.
- * 
- */
-public interface IControlCreator {
-	/**
-	 * Create a control with the specified parent and style bits.
-	 * 
-	 * @param parent
-	 *            the parent of the control
-	 * @param style
-	 *            the style of the control
-	 * 
-	 * @return the Control that was created.
-	 */
-	public Control createControl(Composite parent, int style);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/SimpleContentProposalProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/SimpleContentProposalProvider.java
deleted file mode 100644
index 89819ad..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/SimpleContentProposalProvider.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Amir Kouchekinia <amir@pyrus.us> - bug 200762
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-import java.util.ArrayList;
-
-/**
- * SimpleContentProposalProvider is a class designed to map a static list of
- * Strings to content proposals.
- * 
- * @see IContentProposalProvider
- * @since 3.2
- * 
- */
-public class SimpleContentProposalProvider implements IContentProposalProvider {
-
-	/*
-	 * The proposals provided.
-	 */
-	private String[] proposals;
-
-	/*
-	 * The proposals mapped to IContentProposal. Cached for speed in the case
-	 * where filtering is not used.
-	 */
-	private IContentProposal[] contentProposals;
-
-	/*
-	 * Boolean that tracks whether filtering is used.
-	 */
-	private boolean filterProposals = false;
-
-	/**
-	 * Construct a SimpleContentProposalProvider whose content proposals are
-	 * always the specified array of Objects.
-	 * 
-	 * @param proposals
-	 *            the array of Strings to be returned whenever proposals are
-	 *            requested.
-	 */
-	public SimpleContentProposalProvider(String[] proposals) {
-		super();
-		this.proposals = proposals;
-	}
-
-	/**
-	 * Return an array of Objects representing the valid content proposals for a
-	 * field. 
-	 * 
-	 * @param contents
-	 *            the current contents of the field (only consulted if filtering
-	 *            is set to <code>true</code>)
-	 * @param position
-	 *            the current cursor position within the field (ignored)
-	 * @return the array of Objects that represent valid proposals for the field
-	 *         given its current content.
-	 */
-	public IContentProposal[] getProposals(String contents, int position) {
-		if (filterProposals) {
-			ArrayList list = new ArrayList();
-			for (int i = 0; i < proposals.length; i++) {
-				if (proposals[i].length() >= contents.length()
-						&& proposals[i].substring(0, contents.length())
-								.equalsIgnoreCase(contents)) {
-					list.add(makeContentProposal(proposals[i]));
-				}
-			}
-			return (IContentProposal[]) list.toArray(new IContentProposal[list
-					.size()]);
-		}
-		if (contentProposals == null) {
-			contentProposals = new IContentProposal[proposals.length];
-			for (int i = 0; i < proposals.length; i++) {
-				contentProposals[i] = makeContentProposal(proposals[i]);
-			}
-		}
-		return contentProposals;
-	}
-
-	/**
-	 * Set the Strings to be used as content proposals.
-	 * 
-	 * @param items
-	 *            the array of Strings to be used as proposals.
-	 */
-	public void setProposals(String[] items) {
-		this.proposals = items;
-		contentProposals = null;
-	}
-
-	/**
-	 * Set the boolean that controls whether proposals are filtered according to
-	 * the current field content.
-	 * 
-	 * @param filterProposals
-	 *            <code>true</code> if the proposals should be filtered to
-	 *            show only those that match the current contents of the field,
-	 *            and <code>false</code> if the proposals should remain the
-	 *            same, ignoring the field content.
-	 * @since 3.3
-	 */
-	public void setFiltering(boolean filterProposals) {
-		this.filterProposals = filterProposals;
-		// Clear any cached proposals.
-		contentProposals = null;
-	}
-
-	/*
-	 * Make an IContentProposal for showing the specified String.
-	 */
-	private IContentProposal makeContentProposal(final String proposal) {
-		return new IContentProposal() {
-			public String getContent() {
-				return proposal;
-			}
-
-			public String getDescription() {
-				return null;
-			}
-
-			public String getLabel() {
-				return null;
-			}
-
-			public int getCursorPosition() {
-				return proposal.length();
-			}
-		};
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/TextContentAdapter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/TextContentAdapter.java
deleted file mode 100644
index 5620085..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/TextContentAdapter.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * An {@link IControlContentAdapter} for SWT Text controls. This is a
- * convenience class for easily creating a {@link ContentProposalAdapter} for
- * text fields.
- * 
- * @since 3.2
- */
-public class TextContentAdapter implements IControlContentAdapter,
-		IControlContentAdapter2 {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.taskassistance.IControlContentAdapter#getControlContents(org.eclipse.swt.widgets.Control)
-	 */
-	public String getControlContents(Control control) {
-		return ((Text) control).getText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.fieldassist.IControlContentAdapter#setControlContents(org.eclipse.swt.widgets.Control,
-	 *      java.lang.String, int)
-	 */
-	public void setControlContents(Control control, String text,
-			int cursorPosition) {
-		((Text) control).setText(text);
-		((Text) control).setSelection(cursorPosition, cursorPosition);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.fieldassist.IControlContentAdapter#insertControlContents(org.eclipse.swt.widgets.Control,
-	 *      java.lang.String, int)
-	 */
-	public void insertControlContents(Control control, String text,
-			int cursorPosition) {
-		Point selection = ((Text) control).getSelection();
-		((Text) control).insert(text);
-		// Insert will leave the cursor at the end of the inserted text. If this
-		// is not what we wanted, reset the selection.
-		if (cursorPosition < text.length()) {
-			((Text) control).setSelection(selection.x + cursorPosition,
-					selection.x + cursorPosition);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.fieldassist.IControlContentAdapter#getCursorPosition(org.eclipse.swt.widgets.Control)
-	 */
-	public int getCursorPosition(Control control) {
-		return ((Text) control).getCaretPosition();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.fieldassist.IControlContentAdapter#getInsertionBounds(org.eclipse.swt.widgets.Control)
-	 */
-	public Rectangle getInsertionBounds(Control control) {
-		Text text = (Text) control;
-		Point caretOrigin = text.getCaretLocation();
-		// We fudge the y pixels due to problems with getCaretLocation
-		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=52520
-		return new Rectangle(caretOrigin.x + text.getClientArea().x,
-				caretOrigin.y + text.getClientArea().y + 3, 1, text.getLineHeight());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.fieldassist.IControlContentAdapter#setCursorPosition(org.eclipse.swt.widgets.Control,
-	 *      int)
-	 */
-	public void setCursorPosition(Control control, int position) {
-		((Text) control).setSelection(new Point(position, position));
-	}
-
-	/**
-	 * @see org.eclipse.jface.fieldassist.IControlContentAdapter2#getSelection(org.eclipse.swt.widgets.Control)
-	 * 
-	 * @since 3.4
-	 */
-	public Point getSelection(Control control) {
-		return ((Text) control).getSelection();
-	}
-
-	/**
-	 * @see org.eclipse.jface.fieldassist.IControlContentAdapter2#setSelection(org.eclipse.swt.widgets.Control,
-	 *      org.eclipse.swt.graphics.Point)
-	 * 
-	 * @since 3.4
-	 */
-	public void setSelection(Control control, Point range) {
-		((Text) control).setSelection(range);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/TextControlCreator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/TextControlCreator.java
deleted file mode 100644
index 509437d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/TextControlCreator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.fieldassist;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * An {@link IControlCreator} for SWT Text controls. This is a convenience class
- * for creating text controls to be supplied to a decorated field.
- * 
- * @since 3.2
- * @deprecated As of 3.3, clients should use {@link ControlDecoration} instead
- *             of {@link DecoratedField}.
- * 
- */
-public class TextControlCreator implements IControlCreator {
-
-	public Control createControl(Composite parent, int style) {
-		return new Text(parent, style);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/contassist_ovr.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/contassist_ovr.gif
deleted file mode 100644
index 5c68bdb..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/contassist_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/error_ovr.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/error_ovr.gif
deleted file mode 100644
index 7291a53..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/error_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/errorqf_ovr.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/errorqf_ovr.gif
deleted file mode 100644
index 2468e99..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/errorqf_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/info_ovr.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/info_ovr.gif
deleted file mode 100644
index d485366..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/info_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/required_field_cue.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/required_field_cue.gif
deleted file mode 100644
index d94a8f8..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/required_field_cue.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/warn_ovr.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/warn_ovr.gif
deleted file mode 100644
index 6f46bf9..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/images/warn_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/package.html
deleted file mode 100644
index 7e6c849..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/fieldassist/package.html
+++ /dev/null
@@ -1,51 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides classes that help communicate proper content for fields in dialogs and wizards.
-<h2>
-Package Specification</h2>
-<p>
-This package provides classes that can be used to guide a dialog user through choosing
-appropriate content for fields in a dialog or wizard.
-<p>
-A <tt>ContentProposalAdapter</tt> can be attached to an arbitrary control to provide 
-a popup showing content proposals.  These proposals appear when the defined
-assist keystroke is invoked.  The <tt>ContentProposalAdapter</tt> manages the creation, 
-hiding, and showing of the proposal popup, as well as the proper handling of key events
-between the adapted control and its popup.  Implementors of <tt>IControlContentAdapter</tt>
-allow the adapter to set and retrieve the contents of the supplied control.
-</p>
-<p>
-An <tt>AutoCompleteField</tt> configures a <tt>ContentProposalAdapter</tt> in a manner
-that supports automatic field completion popups that filter based on the control's
-contents.
-</p>
-<p>
-<tt>ControlDecoration</tt> can be used to decorate an arbitrary control with 
-an image that communicates information about the control's content.  Decorations can be
-used to show additional information about a field, such as its status, or a cue
-that shows availability of content proposals.  Decorations are defined in pre-defined
-locations relative to the control, and can be set up to show at all times, or only
-when the control has focus.  It is up to the client to ensure there is enough
-space allocated to render the control decoration.  Decorations can optionally show 
-descriptive text when the user hovers over them.  
-</p>
-<p>
-<tt>DecoratedField</tt> can also be used to decorate a control.  The main difference
-is that decorated fields reserve space for multiple decorations in particular
-locations around the control.  To do this, the field manages the creation of the 
-field's control, using a specialized layout to ensure there is adequate space 
-reserved for decorations around the control. Other than using the field to manage 
-the decorations themselves, clients are expected to interact 
-directly with the control.  
-</p>
-
-<p>Note: None of the classes in this package maintain global state.
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/images/dots_button.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/images/dots_button.gif
deleted file mode 100644
index 5552219..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/images/dots_button.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/ConfigureColumnsDialog.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/ConfigureColumnsDialog.java
deleted file mode 100644
index 42869b0..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/ConfigureColumnsDialog.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.internal;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-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.Item;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-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.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-
-/**
- * NON-API - This class is internal and will be moved to another package in 3.5.
- * 
- */
-public class ConfigureColumnsDialog extends Dialog {
-
-	private Control targetControl;
-	private ColumnObject[] columnObjects;
-	private Table table;
-	private Button upButton;
-	private Button downButton;
-	private Text text;
-	private boolean moveableColumnsFound;
-
-	class ColumnObject {
-		Item column;
-		int index;
-		String name;
-		Image image;
-		boolean visible;
-		int width;
-		boolean moveable;
-		boolean resizable;
-
-		ColumnObject(Item column, int index, String text, Image image,
-				int width, boolean moveable, boolean resizable, boolean visible) {
-			this.column = column;
-			this.index = index;
-			this.name = text;
-			this.image = image;
-			this.width = width;
-			this.moveable = moveable;
-			this.resizable = resizable;
-			this.visible = visible;
-		}
-	}
-
-	/**
-	 * NON-API - This class is internal and will be moved to another package in
-	 * 3.5. Creates a new dialog for configuring columns of the given column
-	 * viewer. The column viewer must have an underlying {@link Tree} or {@link
-	 * Table}, other controls are not supported.
-	 * 
-	 * @param shellProvider
-	 * @param table
-	 */
-	public ConfigureColumnsDialog(IShellProvider shellProvider, Table table) {
-		this(shellProvider, (Control) table);
-	}
-
-	/**
-	 * NON-API - This class is internal and will be moved to another package in
-	 * 3.5. Creates a new dialog for configuring columns of the given column
-	 * viewer. The column viewer must have an underlying {@link Tree} or {@link
-	 * Table}, other controls are not supported.
-	 * 
-	 * @param shellProvider
-	 * @param tree
-	 */
-	public ConfigureColumnsDialog(IShellProvider shellProvider, Tree tree) {
-		this(shellProvider, (Control) tree);
-	}
-
-	/**
-	 * @param shellProvider
-	 * @param control
-	 */
-	private ConfigureColumnsDialog(IShellProvider shellProvider, Control control) {
-		super(shellProvider);
-		this.targetControl = control;
-		this.moveableColumnsFound = createColumnObjects();
-	}
-
-	protected boolean isResizable() {
-		return true;
-	}
-
-	public void create() {
-		super.create();
-		getShell().setText(
-				JFaceResources.getString("ConfigureColumnsDialog_Title")); //$NON-NLS-1$
-	}
-	
-	protected void initializeBounds() {
-		super.initializeBounds();
-		table.setSelection(0);
-		handleSelectionChanged(0);
-	}
-
-	/**
-	 * Returns true if any of the columns is moveable (can be reordered).
-	 */
-	private boolean createColumnObjects() {
-		boolean result = true;
-		Item[] columns = getViewerColumns();
-		ColumnObject[] cObjects = new ColumnObject[columns.length];
-		for (int i = 0; i < columns.length; i++) {
-			Item c = columns[i];
-			boolean moveable = getMoveable(c);
-			result = result && moveable;
-			cObjects[i] = new ColumnObject(c, i, getColumnName(c),
-					getColumnImage(c), getColumnWidth(c), moveable,
-					getResizable(c), true);
-		}
-		int[] columnOrder = getColumnOrder();
-		columnObjects = new ColumnObject[columns.length];
-		for (int i = 0; i < columnOrder.length; i++) {
-			columnObjects[i] = cObjects[columnOrder[i]];
-		}
-		return result;
-	}
-
-	/**
-	 * @param c
-	 * @return
-	 */
-	private Image getColumnImage(Item item) {
-		if (item instanceof TableColumn) {
-			return ((TableColumn) item).getImage();
-		} else if (item instanceof TreeColumn) {
-			return ((TreeColumn) item).getImage();
-		}
-		return null;
-	}
-
-	/**
-	 * @return
-	 */
-	private int[] getColumnOrder() {
-		if (targetControl instanceof Table) {
-			return ((Table) targetControl).getColumnOrder();
-		} else if (targetControl instanceof Tree) {
-			return ((Tree) targetControl).getColumnOrder();
-		}
-		return new int[0];
-	}
-
-	/**
-	 * @param c
-	 * @return
-	 */
-	private boolean getMoveable(Item item) {
-		if (item instanceof TableColumn) {
-			return ((TableColumn) item).getMoveable();
-		} else if (item instanceof TreeColumn) {
-			return ((TreeColumn) item).getMoveable();
-		}
-		return false;
-	}
-
-	/**
-	 * @param c
-	 * @return
-	 */
-	private boolean getResizable(Item item) {
-		if (item instanceof TableColumn) {
-			return ((TableColumn) item).getResizable();
-		} else if (item instanceof TreeColumn) {
-			return ((TreeColumn) item).getResizable();
-		}
-		return false;
-	}
-
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite) super.createDialogArea(parent);
-
-		table = new Table(composite, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL
-				| SWT.H_SCROLL /*
-													 * | SWT.CHECK
-													 */);
-		for (int i = 0; i < columnObjects.length; i++) {
-			TableItem tableItem = new TableItem(table, SWT.NONE);
-			tableItem.setText(columnObjects[i].name);
-			tableItem.setImage(columnObjects[i].image);
-			tableItem.setData(columnObjects[i]);
-		}
-
-		GridDataFactory.defaultsFor(table)
-				.span(1, moveableColumnsFound ? 3 : 1).applyTo(table);
-
-		if (moveableColumnsFound) {
-			upButton = new Button(composite, SWT.PUSH);
-			upButton.setText(JFaceResources
-					.getString("ConfigureColumnsDialog_up")); //$NON-NLS-1$
-			upButton.addListener(SWT.Selection, new Listener() {
-				public void handleEvent(Event event) {
-					handleMove(table, true);
-				}
-			});
-			setButtonLayoutData(upButton);
-			downButton = new Button(composite, SWT.PUSH);
-			downButton.setText(JFaceResources
-					.getString("ConfigureColumnsDialog_down")); //$NON-NLS-1$
-			downButton.addListener(SWT.Selection, new Listener() {
-				public void handleEvent(Event event) {
-					handleMove(table, false);
-				}
-			});
-			setButtonLayoutData(downButton);
-
-			// filler label
-			createLabel(composite, ""); //$NON-NLS-1$
-		}
-
-		Composite widthComposite = new Composite(composite, SWT.NONE);
-		createLabel(widthComposite, JFaceResources
-				.getString("ConfigureColumnsDialog_WidthOfSelectedColumn")); //$NON-NLS-1$
-
-		text = new Text(widthComposite, SWT.SINGLE | SWT.BORDER);
-		// see #initializeBounds
-		text.setText(Integer.toString(1000));
-
-		GridLayoutFactory.fillDefaults().numColumns(2).applyTo(widthComposite);
-
-		int numColumns = moveableColumnsFound ? 2 : 1;
-
-		GridDataFactory.defaultsFor(widthComposite).grab(false, false).span(
-				numColumns, 1).applyTo(widthComposite);
-
-		GridLayoutFactory.swtDefaults().numColumns(numColumns).applyTo(
-				composite);
-
-		table.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event event) {
-				handleSelectionChanged(table.indexOf((TableItem) event.item));
-			}
-		});
-		text.addListener(SWT.Modify, new Listener() {
-			public void handleEvent(Event event) {
-				ColumnObject columnObject = columnObjects[table
-						.getSelectionIndex()];
-				if (!columnObject.resizable) {
-					return;
-				}
-				try {
-					int width = Integer.parseInt(text.getText());
-					columnObject.width = width;
-				} catch (NumberFormatException ex) {
-					// ignore for now
-				}
-			}
-		});
-
-		Dialog.applyDialogFont(composite);
-
-		return composite;
-	}
-
-	/**
-	 * @param table
-	 * @param up
-	 */
-	protected void handleMove(Table table, boolean up) {
-		int index = table.getSelectionIndex();
-		int newIndex = index + (up ? -1 : 1);
-		if (index < 0 || index >= table.getItemCount()) {
-			return;
-		}
-		ColumnObject columnObject = columnObjects[index];
-		columnObjects[index] = columnObjects[newIndex];
-		columnObjects[newIndex] = columnObject;
-		table.getItem(index).dispose();
-		TableItem newItem = new TableItem(table, SWT.NONE, newIndex);
-		newItem.setText(columnObject.name);
-		newItem.setImage(columnObject.image);
-		newItem.setData(columnObject);
-		table.setSelection(newIndex);
-		handleSelectionChanged(newIndex);
-	}
-
-	private void createLabel(final Composite composite, String string) {
-		Label label = new Label(composite, SWT.NONE);
-		label.setText(string);
-	}
-
-	/**
-	 * @param item
-	 * @return
-	 */
-	private String getColumnName(Item item) {
-		String result = ""; //$NON-NLS-1$
-		if (item instanceof TableColumn) {
-			result = ((TableColumn) item).getText();
-			if (result.trim().equals("")) { //$NON-NLS-1$
-				result = ((TableColumn) item).getToolTipText();
-			}
-		} else if (item instanceof TreeColumn) {
-			result = ((TreeColumn) item).getText();
-			if (result.trim().equals("")) { //$NON-NLS-1$
-				result = ((TreeColumn) item).getToolTipText();
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param item
-	 * @return
-	 */
-	private int getColumnWidth(Item item) {
-		if (item instanceof TableColumn) {
-			return ((TableColumn) item).getWidth();
-		} else if (item instanceof TreeColumn) {
-			return ((TreeColumn) item).getWidth();
-		}
-		return 0;
-	}
-
-	/**
-	 * @return
-	 */
-	private Item[] getViewerColumns() {
-		if (targetControl instanceof Table) {
-			return ((Table) targetControl).getColumns();
-		} else if (targetControl instanceof Tree) {
-			return ((Tree) targetControl).getColumns();
-		}
-		return new Item[0];
-	}
-
-	private void handleSelectionChanged(int index) {
-		ColumnObject c = columnObjects[index];
-		text.setText(Integer.toString(c.width));
-		text.setEnabled(c.resizable);
-		if (moveableColumnsFound) {
-			upButton.setEnabled(c.moveable && index > 0);
-			downButton.setEnabled(c.moveable
-					&& index + 1 < table.getItemCount());
-		}
-	}
-
-	protected void okPressed() {
-		int[] columnOrder = new int[columnObjects.length];
-		for (int i = 0; i < columnObjects.length; i++) {
-			ColumnObject columnObject = columnObjects[i];
-			columnOrder[i] = columnObject.index;
-			setColumnWidth(columnObject.column, columnObject.width);
-		}
-		setColumnOrder(columnOrder);
-		super.okPressed();
-	}
-
-	/**
-	 * @param column
-	 * @param width
-	 */
-	private void setColumnWidth(Item item, int width) {
-		if (item instanceof TableColumn) {
-			((TableColumn) item).setWidth(width);
-		} else if (item instanceof TreeColumn) {
-			((TreeColumn) item).setWidth(width);
-		}
-	}
-
-	/**
-	 * @param columnOrder
-	 */
-	private void setColumnOrder(int[] order) {
-		if (targetControl instanceof Table) {
-			((Table) targetControl).setColumnOrder(order);
-		} else if (targetControl instanceof Tree) {
-			((Tree) targetControl).setColumnOrder(order);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/InternalPolicy.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/InternalPolicy.java
deleted file mode 100644
index ce0ab80..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/InternalPolicy.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jface.internal;
-
-
-/**
- * Internal class used for non-API debug flags.
- * 
- * @since 3.3
- */
-public class InternalPolicy {
-
-	/**
-	 * (NON-API) A flag to indicate whether reentrant viewer calls should always be
-	 * logged. If false, only the first reentrant call will cause a log entry.
-	 * 
-	 * @since 3.3
-	 */
-	public static boolean DEBUG_LOG_REENTRANT_VIEWER_CALLS = false;
-
-	/**
-	 * (NON-API) A flag to indicate whether label provider changed notifications
-	 * should always be logged when the underlying control has been disposed. If
-	 * false, only the first notification when disposed will cause a log entry.
-	 * 
-	 * @since 3.5
-	 */
-	public static boolean DEBUG_LOG_LABEL_PROVIDER_NOTIFICATIONS_WHEN_DISPOSED = false;
-	
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/JFaceActivator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/JFaceActivator.java
deleted file mode 100644
index b4229f0..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/JFaceActivator.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jface.internal;
-
-import org.osgi.framework.*;
-
-/**
- * JFaceActivator is the activator class for the JFace plug-in when it is being used
- * within a full Eclipse install.
- * @since 3.3
- *
- */
-public class JFaceActivator implements BundleActivator {
-
-	private static BundleContext bundleContext;
-
-	/* (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		bundleContext = context;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		bundleContext = null;
-	}
-
-	/**
-	 * Return the bundle context for this bundle, or <code>null</code> if
-	 * there is not one. (for instance if the bundle is not activated or we aren't
-	 * running OSGi.
-	 * 
-	 * @return the bundle context or <code>null</code>
-	 */
-	public static BundleContext getBundleContext() {
-		return bundleContext;
-	}
-
-	/**
-	 * Return the Bundle object for JFace. Returns <code>null</code> if it is not
-	 * available.
-	 * 
-	 * @return the bundle or <code>null</code>
-	 */
-	public static Bundle getBundle() {
-		return bundleContext == null ? null : bundleContext.getBundle();
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/CoolBarManager2.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/CoolBarManager2.java
deleted file mode 100644
index a76b80d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/CoolBarManager2.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.internal.provisional.action;
-
-import org.eclipse.jface.action.CoolBarManager;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.CoolBar;
-
-/**
- * Extends <code>CoolBarManager</code> to implement <code>ICoolBarManager2</code>
- * 
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
-*/
-public class CoolBarManager2 extends CoolBarManager implements ICoolBarManager2 {
-
-    /**
-     * Creates a new cool bar manager with the default style. Equivalent to
-     * <code>CoolBarManager(SWT.NONE)</code>.
-     */
-    public CoolBarManager2() {
-        super();
-    }
-
-    /**
-     * Creates a cool bar manager for an existing cool bar control. This
-     * manager becomes responsible for the control, and will dispose of it when
-     * the manager is disposed.
-     * 
-     * @param coolBar
-     *            the cool bar control
-     */
-    public CoolBarManager2(CoolBar coolBar) {
-        super(coolBar);
-    }
-
-    /**
-     * Creates a cool bar manager with the given SWT style. Calling <code>createControl</code>
-     * will create the cool bar control.
-     * 
-     * @param style
-     *            the cool bar item style; see
-     *            {@link org.eclipse.swt.widgets.CoolBar CoolBar}for for valid
-     *            style bits
-     */
-    public CoolBarManager2(int style) {
-       super(style);
-    }
-    
-    /**
-     * Creates and returns this manager's cool bar control. Does not create a
-     * new control if one already exists.
-     * 
-     * @param parent
-     *            the parent control
-     * @return the cool bar control
-	 * @since 3.2
-     */
-    public Control createControl2(Composite parent) {
-        return createControl(parent);
-    }
-    
-    /**
-     * Returns the control for this manager.
-     * 
-     * @return the control, or <code>null</code> if none
-	 * @since 3.2
-     */
-    public Control getControl2() {
-        return getControl();
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/ICoolBarManager2.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/ICoolBarManager2.java
deleted file mode 100644
index 17f1d35..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/ICoolBarManager2.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.provisional.action;
-
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IContributionManagerOverrides;
-import org.eclipse.jface.action.ICoolBarManager;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * Extends <code>ICoolBarManager</code> to allow clients to be decoupled
- * from the actual kind of control used.
- * 
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- */
-public interface ICoolBarManager2 extends ICoolBarManager {
-
-    /**
-     * Creates and returns this manager's control. Does not create a
-     * new control if one already exists.
-     * 
-     * 
-     * @param parent
-     *            the parent control
-     * @return the control
-	 * @since 3.2
-     */
-    public Control createControl2(Composite parent);
-
-    /**
-     * Returns the bar control for this manager.
-     * 
-	 * <p>
-	 * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
-	 * part of a work in progress. There is a guarantee neither that this API will
-	 * work nor that it will remain the same. Please do not use this API without
-	 * consulting with the Platform/UI team.
-	 * </p>
-     *  
-     * @return the bar control, or <code>null</code> if none
-	 * @since 3.2
-     */
-    public Control getControl2();
-
-    /**
-     * Synchronizes the visual order of the cool items in the control with this
-     * manager's internal data structures. This method should be called before
-     * requesting the order of the contribution items to ensure that the order
-     * is accurate.
-     * <p>
-     * Note that <code>update()</code> and <code>refresh()</code> are
-     * converses: <code>update()</code> changes the visual order to match the
-     * internal structures, and <code>refresh</code> changes the internal
-     * structures to match the visual order.
-     * </p>
-     * 
-	 * <p>
-	 * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
-	 * part of a work in progress. There is a guarantee neither that this API will
-	 * work nor that it will remain the same. Please do not use this API without
-	 * consulting with the Platform/UI team.
-	 * </p>
-     * 
-	 * @since 3.2
-     */
-    public void refresh();
-    
-    /**
-	 * Disposes the resources for this manager.
-     * 
-	 * <p>
-	 * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
-	 * part of a work in progress. There is a guarantee neither that this API will
-	 * work nor that it will remain the same. Please do not use this API without
-	 * consulting with the Platform/UI team.
-	 * </p>
-     * 
-     * @since 3.2 
-     */
-    public void dispose();
-
-    /**
-     * Restores the canonical order of this cool bar manager. The canonical
-     * order is the order in which the contribution items where added.
-     * 
-	 * <p>
-	 * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
-	 * part of a work in progress. There is a guarantee neither that this API will
-	 * work nor that it will remain the same. Please do not use this API without
-	 * consulting with the Platform/UI team.
-	 * </p>
-     * 
-	 * @since 3.2     
-	 */
-    public void resetItemOrder();
-
-    /**
-     * Replaces the current items with the given items.
-     * Forces an update.
-     * 
-	 * <p>
-	 * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
-	 * part of a work in progress. There is a guarantee neither that this API will
-	 * work nor that it will remain the same. Please do not use this API without
-	 * consulting with the Platform/UI team.
-	 * </p>
-     * 
-     * @param newItems the items with which to replace the current items
-     * @since 3.2
-	 */
-    public void setItems(IContributionItem[] newItems);
-    
-	/**
-	 * Sets the overrides for this contribution manager
-	 * 
-	 * @param newOverrides
-	 *            the overrides for the items of this manager
-	 * @since 3.5
-	 */
-	public void setOverrides(IContributionManagerOverrides newOverrides);
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/IToolBarContributionItem.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/IToolBarContributionItem.java
deleted file mode 100644
index cec2a35..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/IToolBarContributionItem.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.internal.provisional.action;
-
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IContributionManager;
-import org.eclipse.jface.action.IToolBarManager;
-
-/**
- * The intention of this interface is to provide in interface for 
- * ToolBarContributionItem so that the implementation can be replaced.
- * 
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- */
-public interface IToolBarContributionItem extends IContributionItem {
-
-    /**
-     * Returns the current height of the corresponding cool item.
-     * 
-     * @return the current height
-     */
-    public int getCurrentHeight();
-
-    /**
-     * Returns the current width of the corresponding cool item.
-     * 
-     * @return the current size
-     */
-    public int getCurrentWidth();
-
-    /**
-     * Returns the minimum number of tool items to show in the cool item.
-     * 
-     * @return the minimum number of tool items to show, or <code>SHOW_ALL_ITEMS</code>
-     *         if a value was not set
-     * @see #setMinimumItemsToShow(int)
-     */
-    public int getMinimumItemsToShow();
-    
-    /**
-     * Returns whether chevron support is enabled.
-     * 
-     * @return <code>true</code> if chevron support is enabled, <code>false</code>
-     *         otherwise
-     */
-    public boolean getUseChevron();
-    
-    /**
-     * Sets the current height of the cool item. Update(SIZE) should be called
-     * to adjust the widget.
-     * 
-     * @param currentHeight
-     *            the current height to set
-     */
-    public void setCurrentHeight(int currentHeight);
-
-    /**
-     * Sets the current width of the cool item. Update(SIZE) should be called
-     * to adjust the widget.
-     * 
-     * @param currentWidth
-     *            the current width to set
-     */
-    public void setCurrentWidth(int currentWidth);
-
-    /**
-     * Sets the minimum number of tool items to show in the cool item. If this
-     * number is less than the total tool items, a chevron will appear and the
-     * hidden tool items appear in a drop down menu. By default, all the tool
-     * items are shown in the cool item.
-     * 
-     * @param minimumItemsToShow
-     *            the minimum number of tool items to show.
-     * @see #getMinimumItemsToShow()
-     * @see #setUseChevron(boolean)
-     */
-    public void setMinimumItemsToShow(int minimumItemsToShow);
-
-    /**
-     * Enables or disables chevron support for the cool item. By default,
-     * chevron support is enabled.
-     * 
-     * @param value
-     *            <code>true</code> to enable chevron support, <code>false</code>
-     *            otherwise.
-     */
-    public void setUseChevron(boolean value);
-    
-    /**
-     * Returns the internal tool bar manager of the contribution item.
-     * 
-     * @return the tool bar manager, or <code>null</code> if one is not
-     *         defined.
-     * @see IToolBarManager
-     */
-    public IToolBarManager getToolBarManager();
-    
-    /**
-     * Returns the parent contribution manager, or <code>null</code> if this 
-     * contribution item is not currently added to a contribution manager.
-     * 
-     * @return the parent contribution manager, or <code>null</code>
-     * 
-     * TODO may not need this, getToolBarManager may be enough.
-     */
-    public IContributionManager getParent();
-    
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/IToolBarManager2.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/IToolBarManager2.java
deleted file mode 100644
index 5f65571..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/IToolBarManager2.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.internal.provisional.action;
-
-import org.eclipse.jface.action.IContributionManagerOverrides;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.ToolBar;
-
-/**
- * The <code>IToolBarManager2</code> extends <code>IToolBarManager</code> to
- * allow clients to be isolated from the actual kind of SWT control used by the
- * manager.
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- */
-public interface IToolBarManager2 extends IToolBarManager {
-
-	/**
-	 * The property id for changes to the control's layout
-	 */
-	public static final String PROP_LAYOUT = "PROP_LAYOUT"; //$NON-NLS-1$
-
-	/**
-	 * Creates and returns this manager's toolbar control. Does not create a new
-	 * control if one already exists.
-	 * 
-	 * @param parent
-	 *            the parent control
-	 * @return the toolbar control
-	 */
-	public ToolBar createControl(Composite parent);
-
-	/**
-	 * Creates and returns this manager's control. Does not create a new control
-	 * if one already exists.
-	 * 
-	 * @param parent
-	 *            the parent control
-	 * @return the control
-	 */
-	public Control createControl2(Composite parent);
-
-	/**
-	 * Returns the toolbar control for this manager.
-	 * 
-	 * @return the toolbar control, or <code>null</code> if none
-	 */
-	public ToolBar getControl();
-
-	/**
-	 * Returns the control for this manager.
-	 * 
-	 * @return the control, or <code>null</code> if none
-	 */
-	public Control getControl2();
-
-	/**
-	 * Disposes the resources for this manager.
-	 */
-	public void dispose();
-
-	/**
-	 * Returns the item count of the control used by this manager.
-	 * 
-	 * @return the number of items in the control
-	 */
-	public int getItemCount();
-
-	/**
-	 * Registers a property change listner with this manager.
-	 * 
-	 * @param listener
-	 */
-	public void addPropertyChangeListener(IPropertyChangeListener listener);
-
-	/**
-	 * Removes a property change listner from this manager.
-	 * 
-	 * @param listener
-	 */
-	public void removePropertyChangeListener(IPropertyChangeListener listener);
-
-	/**
-	 * Sets the overrides for this contribution manager
-	 * 
-	 * @param newOverrides
-	 *            the overrides for the items of this manager
-	 */
-	public void setOverrides(IContributionManagerOverrides newOverrides);
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/ToolBarContributionItem2.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/ToolBarContributionItem2.java
deleted file mode 100644
index 2ff1239..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/ToolBarContributionItem2.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.internal.provisional.action;
-
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.ToolBarContributionItem;
-
-/**
- * Extends <code>ToolBarContributionItem</code> to implement <code>IToolBarContributionItem</code>.
- * 
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- */
-public class ToolBarContributionItem2 extends ToolBarContributionItem implements
-		IToolBarContributionItem {
-
-	/**
-	 * 
-	 */
-	public ToolBarContributionItem2() {
-		super();
-	}
-
-	/**
-	 * @param toolBarManager
-	 */
-	public ToolBarContributionItem2(IToolBarManager toolBarManager) {
-		super(toolBarManager);
-	}
-
-	/**
-	 * @param toolBarManager
-	 * @param id
-	 */
-	public ToolBarContributionItem2(IToolBarManager toolBarManager, String id) {
-		super(toolBarManager, id);
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/ToolBarManager2.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/ToolBarManager2.java
deleted file mode 100644
index d026d64..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/internal/provisional/action/ToolBarManager2.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.internal.provisional.action;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.ToolBar;
-
-/**
- * Extends <code>ToolBarManager</code> to implement <code>IToolBarManager2</code>.
- * 
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- */
-public class ToolBarManager2 extends ToolBarManager implements IToolBarManager2 {
-
-	/**
-	 * A collection of objects listening to changes to this manager. This
-	 * collection is <code>null</code> if there are no listeners.
-	 */
-	private transient ListenerList listenerList = null;
-	
-	/**
-	 * Creates a new tool bar manager with the default SWT button style. Use the
-	 * <code>createControl</code> method to create the tool bar control.
-	 */
-	public ToolBarManager2() {
-		super();
-	}
-
-	/**
-	 * Creates a tool bar manager with the given SWT button style. Use the
-	 * <code>createControl</code> method to create the tool bar control.
-	 * 
-	 * @param style
-	 *            the tool bar item style
-	 * @see org.eclipse.swt.widgets.ToolBar for valid style bits
-	 */
-	public ToolBarManager2(int style) {
-		super(style);
-	}
-
-	/**
-	 * Creates a tool bar manager for an existing tool bar control. This manager
-	 * becomes responsible for the control, and will dispose of it when the
-	 * manager is disposed.
-	 * 
-	 * @param toolbar
-	 *            the tool bar control
-	 */
-	public ToolBarManager2(ToolBar toolbar) {
-		super(toolbar);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IToolBarManager2#createControl2(org.eclipse.swt.widgets.Composite)
-	 */
-	public Control createControl2(Composite parent) {
-		return createControl(parent);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IToolBarManager2#getControl2()
-	 */
-	public Control getControl2() {
-		return getControl();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IToolBarManager2#getItemCount()
-	 */
-	public int getItemCount() {
-		ToolBar toolBar = getControl();
-		if (toolBar == null || toolBar.isDisposed()) {
-			return 0;
-		}
-		return toolBar.getItemCount();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IToolBarManager2#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
-	public void addPropertyChangeListener(IPropertyChangeListener listener) {
-		if (listenerList == null) {
-			listenerList = new ListenerList(ListenerList.IDENTITY);
-		}
-
-		listenerList.add(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IToolBarManager2#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
-	public void removePropertyChangeListener(IPropertyChangeListener listener) {
-		if (listenerList != null) {
-			listenerList.remove(listener);
-
-			if (listenerList.isEmpty()) {
-				listenerList = null;
-			}
-		}
-	}
-	
-	/**
-	 * @return the listeners attached to this event manager.
-	 * The listeners currently attached; may be empty, but never
-	 * null.
-	 * 
-	 */
-	protected final Object[] getListeners() {
-		final ListenerList list = listenerList;
-		if (list == null) {
-			return new Object[0];
-		}
-
-		return list.getListeners();
-	}
-
-	/*
-	 * Notifies any property change listeners that a property has changed. Only
-	 * listeners registered at the time this method is called are notified.
-	 */
-	private void firePropertyChange(final PropertyChangeEvent event) {
-		final Object[] list = getListeners();
-		for (int i = 0; i < list.length; ++i) {
-			((IPropertyChangeListener) list[i]).propertyChange(event);
-		}
-	}
-
-	/*
-	 * Notifies any property change listeners that a property has changed. Only
-	 * listeners registered at the time this method is called are notified. This
-	 * method avoids creating an event object if there are no listeners
-	 * registered, but calls firePropertyChange(PropertyChangeEvent) if there are.
-	 */
-	private void firePropertyChange(final String propertyName,
-			final Object oldValue, final Object newValue) {
-		if (listenerList != null) {
-			firePropertyChange(new PropertyChangeEvent(this, propertyName,
-					oldValue, newValue));
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.ToolBarManager#relayout(org.eclipse.swt.widgets.ToolBar, int, int)
-	 */
-	protected void relayout(ToolBar layoutBar, int oldCount, int newCount) {
-		super.relayout(layoutBar, oldCount, newCount);
-		firePropertyChange(PROP_LAYOUT, new Integer(oldCount), new Integer(newCount));
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/AbstractColumnLayout.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/AbstractColumnLayout.java
deleted file mode 100644
index ce16c92..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/AbstractColumnLayout.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation (original file org.eclipse.ui.texteditor.templates.ColumnLayout)
- *     Tom Schindl <tom.schindl@bestsolution.at> - refactored to be widget independent (bug 171824)
- *                                               - fix for bug 178280, 184342, 184045, 208014, 214532
- *     Micah Hainline <micah_hainline@yahoo.com> - fix in bug: 208335
- *******************************************************************************/
-package org.eclipse.jface.layout;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.TableLayout;
-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.Event;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Scrollable;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * The AbstractColumnLayout is a {@link Layout} used to set the size of a table
- * in a consistent way even during a resize unlike a {@link TableLayout} which
- * only sets initial sizes.
- *
- * <p>
- * <b>You can only add the layout to a container whose only child is the
- * table/tree control you want the layouts applied to.</b>
- * </p>
- *
- * @since 3.4
- */
-public abstract class AbstractColumnLayout extends Layout {
-	private static int COLUMN_TRIM;
-	static {
-		if (Util.isWindows()) {
-			COLUMN_TRIM = 4;
-		} else if (Util.isMac()) {
-			COLUMN_TRIM = 24;
-		} else {
-			COLUMN_TRIM = 3;
-		}
-	}
-
-	static final boolean IS_GTK = Util.isGtk();
-
-	static final String LAYOUT_DATA = Policy.JFACE + ".LAYOUT_DATA"; //$NON-NLS-1$
-
-	private boolean inupdateMode = false;
-
-	private boolean relayout = true;
-
-	private Listener resizeListener = new Listener() {
-
-		public void handleEvent(Event event) {
-			if (!inupdateMode) {
-				updateColumnData(event.widget);
-			}
-		}
-
-	};
-
-	/**
-	 * Adds a new column of data to this table layout.
-	 *
-	 * @param column
-	 *            the column
-	 *
-	 * @param data
-	 *            the column layout data
-	 */
-	public void setColumnData(Widget column, ColumnLayoutData data) {
-
-		if (column.getData(LAYOUT_DATA) == null) {
-			column.addListener(SWT.Resize, resizeListener);
-		}
-
-		column.setData(LAYOUT_DATA, data);
-	}
-
-	/**
-	 * Compute the size of the table or tree based on the ColumnLayoutData and
-	 * the width and height hint.
-	 *
-	 * @param scrollable
-	 *            the widget to compute
-	 * @param wHint
-	 *            the width hint
-	 * @param hHint
-	 *            the height hint
-	 * @return Point where x is the width and y is the height
-	 */
-	private Point computeTableTreeSize(Scrollable scrollable, int wHint,
-			int hHint) {
-		Point result = scrollable.computeSize(wHint, hHint);
-
-		int width = 0;
-		int size = getColumnCount(scrollable);
-		for (int i = 0; i < size; ++i) {
-			ColumnLayoutData layoutData = getLayoutData(scrollable, i);
-			if (layoutData instanceof ColumnPixelData) {
-				ColumnPixelData col = (ColumnPixelData) layoutData;
-				width += col.width;
-				if (col.addTrim) {
-					width += getColumnTrim();
-				}
-			} else if (layoutData instanceof ColumnWeightData) {
-				ColumnWeightData col = (ColumnWeightData) layoutData;
-				width += col.minimumWidth;
-			} else {
-				Assert.isTrue(false, "Unknown column layout data"); //$NON-NLS-1$
-			}
-		}
-		if (width > result.x)
-			result.x = width;
-
-		return result;
-	}
-
-	/**
-	 * Layout the scrollable based on the supplied width and area. Only increase
-	 * the size of the scrollable if increase is <code>true</code>.
-	 *
-	 * @param scrollable
-	 * @param width
-	 * @param area
-	 * @param increase
-	 */
-	private void layoutTableTree(final Scrollable scrollable, final int width,
-			final Rectangle area, final boolean increase) {
-		final int numberOfColumns = getColumnCount(scrollable);
-		final int[] widths = new int[numberOfColumns];
-
-		final int[] weightColumnIndices = new int[numberOfColumns];
-		int numberOfWeightColumns = 0;
-
-		int fixedWidth = 0;
-		int totalWeight = 0;
-
-		// First calc space occupied by fixed columns
-		for (int i = 0; i < numberOfColumns; i++) {
-			ColumnLayoutData col = getLayoutData(scrollable, i);
-			if (col instanceof ColumnPixelData) {
-				ColumnPixelData cpd = (ColumnPixelData) col;
-				int pixels = cpd.width;
-				if (cpd.addTrim) {
-					pixels += getColumnTrim();
-				}
-				widths[i] = pixels;
-				fixedWidth += pixels;
-			} else if (col instanceof ColumnWeightData) {
-				ColumnWeightData cw = (ColumnWeightData) col;
-				weightColumnIndices[numberOfWeightColumns] = i;
-				numberOfWeightColumns++;
-				totalWeight += cw.weight;
-			} else {
-				Assert.isTrue(false, "Unknown column layout data"); //$NON-NLS-1$
-			}
-		}
-
-		boolean recalculate;
-		do {
-			recalculate = false;
-			for (int i = 0; i < numberOfWeightColumns; i++) {
-				int colIndex = weightColumnIndices[i];
-				ColumnWeightData cw = (ColumnWeightData) getLayoutData(
-						scrollable, colIndex);
-				final int minWidth = cw.minimumWidth;
-				final int allowedWidth = totalWeight == 0 ? 0 : (width - fixedWidth) * cw.weight
-						/ totalWeight;
-				if (allowedWidth < minWidth) {
-					/*
-					 * if the width assigned by weight is less than the minimum,
-					 * then treat this column as fixed, remove it from weight
-					 * calculations, and recalculate other weights.
-					 */
-					numberOfWeightColumns--;
-					totalWeight -= cw.weight;
-					fixedWidth += minWidth;
-					widths[colIndex] = minWidth;
-					System.arraycopy(weightColumnIndices, i + 1,
-							weightColumnIndices, i, numberOfWeightColumns - i);
-					recalculate = true;
-					break;
-				}
-				widths[colIndex] = allowedWidth;
-			}
-		} while (recalculate);
-
-		if (increase) {
-			scrollable.setSize(area.width, area.height);
-		}
-
-		inupdateMode = true;
-		setColumnWidths(scrollable, widths);
-		scrollable.update();
-		inupdateMode = false;
-
-		if (!increase) {
-			scrollable.setSize(area.width, area.height);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.swt.widgets.Layout#computeSize(org.eclipse.swt.widgets.Composite,
-	 *      int, int, boolean)
-	 */
-	protected Point computeSize(Composite composite, int wHint, int hHint,
-			boolean flushCache) {
-		return computeTableTreeSize(getControl(composite), wHint, hHint);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.swt.widgets.Layout#layout(org.eclipse.swt.widgets.Composite,
-	 *      boolean)
-	 */
-	protected void layout(Composite composite, boolean flushCache) {
-		Rectangle area = composite.getClientArea();
-		Scrollable table = getControl(composite);
-		int tableWidth = table.getSize().x;
-		int trim = computeTrim(area, table, tableWidth);
-		int width = Math.max(0, area.width - trim);
-
-		if (width > 1)
-			layoutTableTree(table, width, area, tableWidth < area.width);
-
-		// For the first time we need to relayout because Scrollbars are not
-		// calculate appropriately
-		if (relayout) {
-			relayout = false;
-			composite.layout();
-		}
-	}
-
-	/**
-	 * Compute the area required for trim.
-	 *
-	 * @param area
-	 * @param scrollable
-	 * @param currentWidth
-	 * @return int
-	 */
-	private int computeTrim(Rectangle area, Scrollable scrollable,
-			int currentWidth) {
-		int trim;
-
-		if (currentWidth > 1) {
-			trim = currentWidth - scrollable.getClientArea().width;
-		} else {
-			// initially, the table has no extend and no client area - use the
-			// border with
-			// plus some padding as educated guess
-			trim = 2 * scrollable.getBorderWidth() + 1;
-		}
-
-		return trim;
-	}
-
-	/**
-	 * Get the control being laid out.
-	 *
-	 * @param composite
-	 *            the composite with the layout
-	 * @return {@link Scrollable}
-	 */
-	Scrollable getControl(Composite composite) {
-		return (Scrollable) composite.getChildren()[0];
-	}
-
-	/**
-	 * Get the number of columns for the receiver.
-	 *
-	 * @return the number of columns
-	 */
-	abstract int getColumnCount(Scrollable tableTree);
-
-	/**
-	 * Set the widths of the columns.
-	 *
-	 * @param widths
-	 */
-	abstract void setColumnWidths(Scrollable tableTree, int[] widths);
-
-	abstract ColumnLayoutData getLayoutData(Scrollable tableTree,
-			int columnIndex);
-
-	abstract void updateColumnData(Widget column);
-
-	/**
-	 * The number of extra pixels taken as horizontal trim by the table column.
-	 * To ensure there are N pixels available for the content of the column,
-	 * assign N+COLUMN_TRIM for the column width.
-	 *
-	 * @return the trim used by the columns
-	 * @since 3.4
-	 */
-	protected int getColumnTrim() {
-		return COLUMN_TRIM;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/GridDataFactory.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/GridDataFactory.java
deleted file mode 100644
index af4d61d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/GridDataFactory.java
+++ /dev/null
@@ -1,478 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Stefan Xenos, IBM - initial implementation, bug 178888
- *******************************************************************************/
-package org.eclipse.jface.layout;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * This class provides a convienient shorthand for creating and initializing
- * GridData. This offers several benefits over creating GridData normal way:
- * 
- * <ul>
- * <li>The same factory can be used many times to create several GridData instances</li>
- * <li>The setters on GridDataFactory all return "this", allowing them to be chained</li> 
- * <li>GridDataFactory uses vector setters (it accepts Points), making it easy to
- *     set X and Y values together</li>
- * </ul>
- * 
- * <p>
- * GridDataFactory instances are created using one of the static methods on this class. 
- * </p>
- * 
- * <p>
- * Example usage:
- * </p>
- * <code><pre>
- * 
- * ////////////////////////////////////////////////////////////
- * // Example 1: Typical grid data for a non-wrapping label
- * 
- *     // GridDataFactory version
- *     GridDataFactory.fillDefaults().applyTo(myLabel);
- * 
- *     // Equivalent SWT version
- *     GridData labelData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
- *     myLabel.setLayoutData(labelData);
- * 
- * ///////////////////////////////////////////////////////////
- * // Example 2: Typical grid data for a wrapping label
- * 
- *     // GridDataFactory version
- *     GridDataFactory.fillDefaults()
- *          .align(SWT.FILL, SWT.CENTER)
- *    	    .hint(150, SWT.DEFAULT)
- *    	    .grab(true, false)
- *          .applyTo(wrappingLabel);
- *      
- *     // Equivalent SWT version
- *     GridData wrappingLabelData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER);
- *     wrappingLabelData.minimumWidth = 1;
- *     wrappingLabelData.widthHint = 150;
- *     wrappingLabel.setLayoutData(wrappingLabelData);
- * 
- * //////////////////////////////////////////////////////////////
- * // Example 3: Typical grid data for a scrollable control (a list box, tree, table, etc.)
- * 
- *     // GridDataFactory version
- *     GridDataFactory.fillDefaults().grab(true, true).hint(150, 150).applyTo(listBox);
- * 
- *     // Equivalent SWT version
- *     GridData listBoxData = new GridData(GridData.FILL_BOTH);
- *     listBoxData.widthHint = 150;
- *     listBoxData.heightHint = 150;
- *     listBoxData.minimumWidth = 1;
- *     listBoxData.minimumHeight = 1;
- *     listBox.setLayoutData(listBoxData);
- * 
- * /////////////////////////////////////////////////////////////
- * // Example 4: Typical grid data for a button
- *
- *     // GridDataFactory version
- *     Point preferredSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, false);
- *     Point hint = Geometry.max(LayoutConstants.getMinButtonSize(), preferredSize);
- *     GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).hint(hint).applyTo(button);
- *
- *     // Equivalent SWT version
- *     Point preferredSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, false);
- *     Point hint = Geometry.max(LayoutConstants.getMinButtonSize(), preferredSize);
- *     GridData buttonData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
- *     buttonData.widthHint = hint.x;
- *     buttonData.heightHint = hint.y;
- *     button.setLayoutData(buttonData);
- *     
- * /////////////////////////////////////////////////////////////
- * // Example 5: Generated GridData
- *
- *     // Generates GridData a wrapping label that spans 2 columns
- *     GridDataFactory.generate(wrappingLabel, 2, 1);
- *     
- *     // Generates GridData for a listbox. and adjusts the preferred size to 300x400 pixels
- *     GridDataFactory.defaultsFor(listBox).hint(300, 400).applyTo(listBox);
- *     
- *     // Generates GridData equivalent to example 4
- *     GridDataFactory.generate(button, 1, 1);
- *          
- * </pre></code>
- * 
- * @since 3.2
- */
-public final class GridDataFactory {
-    private GridData data;
-    
-    /**
-     * Creates a GridDataFactory that creates copes of the given GridData. 
-     * 
-     * @param d template GridData to copy
-     */
-    private GridDataFactory(GridData d) {
-        this.data = d;
-    }
-    
-    /**
-     * Creates a new GridDataFactory initialized with the SWT defaults.
-     * This factory will generate GridData that is equivalent to 
-     * "new GridData()".
-     * 
-     * <p>
-     * Initial values are:
-     * </p>
-     * 
-     * <ul>
-     * <li>align(SWT.BEGINNING, SWT.CENTER)</li>
-     * <li>exclude(false)</li>
-     * <li>grab(false, false)</li>
-     * <li>hint(SWT.DEFAULT, SWT.DEFAULT)</li>
-     * <li>indent(0,0)</li>
-     * <li>minSize(0,0)</li>
-     * <li>span(1,1)</li>
-     * </ul>
-     * 
-     * @return a new GridDataFactory instance
-     * @see #fillDefaults()
-     */
-    public static GridDataFactory swtDefaults() {
-    	return new GridDataFactory(new GridData());
-    }
-    
-    /**
-     * Creates a new GridDataFactory that creates copies of the given GridData
-     * by default.
-     * 
-     * @param data GridData to copy
-     * @return a new GridDataFactory that creates copies of the argument by default
-     */
-    public static GridDataFactory createFrom(GridData data) {
-    	return new GridDataFactory(copyData(data));
-    }
-    
-    /**
-     * Creates a GridDataFactory initialized with defaults that will cause
-     * the control to fill its cell. The minimum size is set to the smallest possible
-     * minimum size supported by SWT. Currently, the smallest supported minimum size
-     * is (1,1) so this is the default. If GridLayout ever adds support for grid data
-     * with no minimum size, this will be changed to 0,0 in the future. 
-     * 
-     * <p>
-     * Initial values are:
-     * </p>
-     * 
-     * <ul>
-     * <li>align(SWT.FILL, SWT.FILL)</li>
-     * <li>exclude(false)</li>
-     * <li>grab(false, false)</li>
-     * <li>hint(SWT.DEFAULT, SWT.DEFAULT)</li>
-     * <li>indent(0,0)</li>
-     * <li>minSize(1,1)</li>
-     * <li>span(1,1)</li>
-     * </ul>
-     *  
-     * @return a GridDataFactory that makes controls fill their grid by default
-     * 
-     * @see #swtDefaults()
-     */
-    public static GridDataFactory fillDefaults() {
-    	GridData data = new GridData();
-        data.minimumWidth = 1;
-        data.minimumHeight = 1;
-        data.horizontalAlignment = SWT.FILL;
-        data.verticalAlignment = SWT.FILL;
-        
-    	return new GridDataFactory(data);
-    }
-    
-    /**
-     * Returns a GridDataFactory initialized with heuristicly generated defaults for the given control.
-     * To be precise, this method picks the default values that GridLayoutFactory.generateLayout
-     * would have assigned to the control. Does not attach GridData to the control. Callers must
-     * additionally call applyTo(theControl) if they wish to use the generated values.
-     * 
-     * <p>
-     * This method is intended for situations where generateLayout is generating layout data
-     * for a particular control that is not quite right for the desired layout.
-     * This allows callers to start with the generated values and tweak one or two settings
-     * before applying the GridData to the control.
-     * </p> 
-     * 
-     * @see GridLayoutFactory#generateLayout(org.eclipse.swt.widgets.Composite)
-     * @param theControl 
-     * @return a GridLayoutFactory initialized with defaults that GridLayoutFactory would have 
-     * @since 3.3
-     */
-    public static GridDataFactory defaultsFor(Control theControl) {
-    	return LayoutGenerator.defaultsFor(theControl);
-    }
-    
-    /**
-     * Generates layout data to the given control, given the number of cells
-     * spanned by the control. Attaches a GridData to the control. This method 
-     * allows generated layout data to be used with controls that span multiple cells. 
-     * <p>
-     * The generated layout data is the same as what would be generated by 
-     * GridLayoutFactory.generateLayout, except that the span is configurable
-     * </p>  
-     * 
-     * @see GridLayoutFactory#generateLayout(org.eclipse.swt.widgets.Composite)
-     * @param theControl
-     * @param hSpan number of columns spanned by the control
-     * @param vSpan number of rows spanned by the control
-     * @since 3.3
-     */
-    public static void generate(Control theControl, int hSpan, int vSpan) {
-    	defaultsFor(theControl).span(hSpan, vSpan).applyTo(theControl);
-    }
-
-    /**
-     * Generates layout data to the given control, given the number of cells
-     * spanned by the control. Attaches GridData to the control. This method 
-     * allows generated layout data to be used with controls that span multiple cells. 
-     * <p>
-     * The generated layout data is the same as what would be generated by 
-     * GridLayoutFactory.generateLayout, except that the span is configurable
-     * </p>  
-     * 
-     * @see GridLayoutFactory#generateLayout(org.eclipse.swt.widgets.Composite)
-     * @param theControl
-     * @param span The x coordinate indicates the number of
-     * columns spanned, and the y coordinate indicates the number of rows.
-     * @since 3.3
-     */
-    public static void generate(Control theControl, Point span) {
-    	defaultsFor(theControl).span(span).applyTo(theControl);
-    }
-    
-    /**
-     * Sets the GridData span. The span controls how many cells
-     * are filled by the control. 
-     * 
-     * @param hSpan number of columns spanned by the control
-     * @param vSpan number of rows spanned by the control
-     * @return this
-     */
-    public GridDataFactory span(int hSpan, int vSpan) {
-        data.horizontalSpan = hSpan;
-        data.verticalSpan = vSpan;
-        return this;
-    }
-
-    /**
-     * Sets the GridData span. The span controls how many cells
-     * are filled by the control. 
-     * 
-     * @param span the new span. The x coordinate indicates the number of
-     * columns spanned, and the y coordinate indicates the number of rows.
-     * @return this
-     */
-    public GridDataFactory span(Point span) {
-        data.horizontalSpan = span.x;
-        data.verticalSpan = span.y;
-        return this;
-    }
-
-    /**
-     * Sets the width and height hints. The width and height hints override
-     * the control's preferred size. If either hint is set to SWT.DEFAULT,
-     * the control's preferred size is used. 
-     * 
-     * @param xHint horizontal hint (pixels), or SWT.DEFAULT to use the control's preferred size
-     * @param yHint vertical hint (pixels), or SWT.DEFAULT to use the control's preferred size
-     * @return this
-     */
-    public GridDataFactory hint(int xHint, int yHint) {
-        data.widthHint = xHint;
-        data.heightHint = yHint;
-        return this;
-    }
-
-    /**
-     * Sets the width and height hints. The width and height hints override
-     * the control's preferred size. If either hint is set to SWT.DEFAULT,
-     * the control's preferred size is used.
-     * 
-     * @param hint size (pixels) to be used instead of the control's preferred size. If
-     * the x or y values are set to SWT.DEFAULT, the control's computeSize() method will
-     * be used to obtain that dimension of the preferred size.
-     * @return this
-     */
-    public GridDataFactory hint(Point hint) {
-        data.widthHint = hint.x;
-        data.heightHint = hint.y;
-        return this;
-    }
-
-    /**
-     * Sets the alignment of the control within its cell.
-     * 
-     * @param hAlign horizontal alignment. One of SWT.BEGINNING, SWT.CENTER, SWT.END, or SWT.FILL.
-     * @param vAlign vertical alignment. One of SWT.BEGINNING, SWT.CENTER, SWT.END, or SWT.FILL.
-     * @return this
-     */
-    public GridDataFactory align(int hAlign, int vAlign) {
-    	if (hAlign != SWT.BEGINNING && hAlign != SWT.CENTER && hAlign != GridData.CENTER && hAlign != SWT.END && hAlign != GridData.END && hAlign != SWT.FILL && hAlign != SWT.LEFT && hAlign != SWT.RIGHT) {
-    		throw new IllegalArgumentException();
-    	}
-    	if (vAlign != SWT.BEGINNING && vAlign != SWT.CENTER && vAlign != GridData.CENTER && vAlign != SWT.END && vAlign != GridData.END && vAlign != SWT.FILL && vAlign != SWT.TOP && vAlign != SWT.BOTTOM) {
-    		throw new IllegalArgumentException();
-    	}
-        data.horizontalAlignment = hAlign;
-        data.verticalAlignment = vAlign;
-        return this;
-    }
-
-    /**
-     * Sets the indent of the control within the cell. Moves the position of the control
-     * by the given number of pixels. Positive values move toward the lower-right, negative
-     * values move toward the upper-left.
-     * 
-     * @param hIndent distance to move to the right (negative values move left)
-     * @param vIndent distance to move down (negative values move up)
-     * @return this
-     */
-    public GridDataFactory indent(int hIndent, int vIndent) {
-        data.horizontalIndent = hIndent;
-        data.verticalIndent = vIndent;
-        return this;
-    }
-
-    /**
-     * Sets the indent of the control within the cell. Moves the position of the control
-     * by the given number of pixels. Positive values move toward the lower-right, negative
-     * values move toward the upper-left.
-     * 
-     * @param indent offset to move the control
-     * @return this
-     */
-    public GridDataFactory indent(Point indent) {
-        data.horizontalIndent = indent.x;
-        data.verticalIndent = indent.y;
-        return this;
-    }
-
-    /**
-     * Determines whether extra horizontal or vertical space should be allocated to
-     * this control's column when the layout resizes. If any control in the column
-     * is set to grab horizontal then the whole column will grab horizontal space.
-     * If any control in the row is set to grab vertical then the whole row will grab
-     * vertical space.
-     * 
-     * @param horizontal true if the control's column should grow horizontally
-     * @param vertical true if the control's row should grow vertically
-     * @return this
-     */
-    public GridDataFactory grab(boolean horizontal, boolean vertical) {
-        data.grabExcessHorizontalSpace = horizontal;
-        data.grabExcessVerticalSpace = vertical;
-        return this;
-    }
-
-    /**
-     * Sets the minimum size for the control. The control will not be permitted
-     * to shrink below this size. Note: GridLayout treats a minimum size of 0
-     * as an undocumented special value, so the smallest possible minimum size 
-     * is a size of 1. A minimum size of SWT.DEFAULT indicates that the result
-     * of computeSize(int, int, boolean) should be used as the control's minimum
-     * size.
-     * 
-     * 
-     * @param minX minimum a value of 1 or more is a horizontal size of the control (pixels). 
-     *        SWT.DEFAULT indicates that the control's preferred size should be used. A size
-     *        of 0 has special semantics defined by GridLayout. 
-     * @param minY minimum a value of 1 or more is a vertical size of the control (pixels). SWT.DEFAULT
-     *        indicates that the control's preferred size should be used. A size
-     *        of 0 has special semantics defined by GridLayout.
-     * @return this
-     */
-    public GridDataFactory minSize(int minX, int minY) {
-        data.minimumWidth = minX;
-        data.minimumHeight = minY;
-        return this;
-    }
-
-    /**
-     * Sets the minimum size for the control. The control will not be permitted
-     * to shrink below this size. Note: GridLayout treats a minimum size of 0
-     * as an undocumented special value, so the smallest possible minimum size 
-     * is a size of 1. A minimum size of SWT.DEFAULT indicates that the result
-     * of computeSize(int, int, boolean) should be used as the control's minimum
-     * size.
-     * 
-     * @param min minimum size of the control
-     * @return this
-     */
-    public GridDataFactory minSize(Point min) {
-        data.minimumWidth = min.x;
-        data.minimumHeight = min.y;
-        return this;
-    }
-
-    /**
-     * Instructs the GridLayout to ignore this control when performing layouts. 
-     * 
-     * @param shouldExclude true iff the control should be excluded from layouts
-     * @return this
-     */
-    public GridDataFactory exclude(boolean shouldExclude) {
-        data.exclude = shouldExclude;
-        return this;
-    }
-
-    /**
-     * Creates a new GridData instance. All attributes of the GridData instance
-     * will be initialized by the factory.
-     * 
-     * @return a new GridData instance
-     */
-    public GridData create() {
-        return copyData(data);
-    }
-
-    /**
-     * Creates a copy of the receiver.
-     * 
-     * @return a copy of the receiver
-     */
-    public GridDataFactory copy() {
-    	return new GridDataFactory(create());
-    }
-    
-    /**
-     * Returns a copy of the given GridData 
-     * 
-     * @param data GridData to copy
-     * @return a copy of the argument
-     */
-    public static GridData copyData(GridData data) {
-        GridData newData = new GridData(data.horizontalAlignment, data.verticalAlignment, data.grabExcessHorizontalSpace, data.grabExcessVerticalSpace, data.horizontalSpan,
-                data.verticalSpan);
-        newData.exclude = data.exclude;
-        newData.heightHint = data.heightHint;
-        newData.horizontalIndent = data.horizontalIndent;
-        newData.minimumHeight = data.minimumHeight;
-        newData.minimumWidth = data.minimumWidth;
-        newData.verticalIndent = data.verticalIndent;
-        newData.widthHint = data.widthHint;
-
-        return newData;
-    }
-
-    /**
-     * Sets the layout data on the given control. Creates a new GridData instance and
-     * assigns it to the control by calling control.setLayoutData.
-     *  
-     * @param control control whose layout data will be initialized
-     */
-    public void applyTo(Control control) {
-        control.setLayoutData(create());
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/GridLayoutFactory.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/GridLayoutFactory.java
deleted file mode 100644
index f956bfe..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/GridLayoutFactory.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Stefan Xenos, IBM - initial implementation, bug 178888
- *     Karsten Stoeckmann - bug 156982
- *******************************************************************************/
-package org.eclipse.jface.layout;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * GridLayoutFactory creates and initializes grid layouts. There are two ways to use GridLayoutFactory.
- * Normally, it is used as a shorthand for writing "new GridLayout()" and initializing a bunch 
- * of fields. In this case the main benefit is a more concise syntax and the ability to create more
- * than one identical GridLayout from the same factory. Changing a property of the factory will affect
- * future layouts created by the factory, but has no effect on layouts that have already been created.
- * 
- * <p>
- * GridLayoutFactory can also generate grid data for all the controls in a layout. This is done with
- * the generateLayout method. To use this feature:
- * </p>
- * 
- * <ol>
- * <li>Create the composite</li>
- * <li>Create all the controls in the composite</li>
- * <li>Call generateLayout</li>
- * </ol>
- * 
- * <p>
- * The order here is important. generateLayout must be called after all the child controls have
- * been created. generateLayout will not change any layout data that has already been attached
- * to a child control and it will not recurse into nested composites. 
- * </p>
- *
- * @since 3.2
- */
-public final class GridLayoutFactory {
-	
-	/**
-	 * Template layout. The factory will create copies of this layout. 
-	 */
-    private GridLayout l;
-
-    /**
-     * Creates a new GridLayoutFactory that will create copies of the given layout.
-     * 
-     * @param l layout to copy
-     */
-    private GridLayoutFactory(GridLayout l) {
-        this.l = l;
-    }
-
-    /**
-     * Creates a factory that creates copies of the given layout.
-     * 
-     * @param l layout to copy
-     * @return a new GridLayoutFactory instance that creates copies of the given layout
-     */
-    public static GridLayoutFactory createFrom(GridLayout l) {
-    	return new GridLayoutFactory(copyLayout(l));
-    }
-    
-    /**
-     * Creates a copy of the reciever.
-     * 
-     * @return a copy of the reciever
-     */
-    public GridLayoutFactory copy() {
-    	return new GridLayoutFactory(create());
-    }
-    
-    /**
-     * Creates a GridLayoutFactory that creates GridLayouts with the default SWT
-     * values.
-     * 
-     * <p>
-     * Initial values are:
-     * </p>
-     * 
-     * <ul>
-     * <li>numColumns(1)</li>
-     * <li>margins(5,5)</li>
-     * <li>extendedMargins(0,0,0,0)</li>
-     * <li>spacing(5,5)</li>
-     * <li>equalWidth(false)</li>
-     * </ul>
-     * 
-     * @return a GridLayoutFactory that creates GridLayouts as though created with
-     * their default constructor
-     * @see #fillDefaults
-     */
-    public static GridLayoutFactory swtDefaults() {
-    	return new GridLayoutFactory(new GridLayout());
-    }
-
-    /**
-     * Creates a GridLayoutFactory that creates GridLayouts with no margins and 
-     * default dialog spacing.
-     * 
-     * <p>
-     * Initial values are:
-     * </p>
-     * 
-     * <ul>
-     * <li>numColumns(1)</li>
-     * <li>margins(0,0)</li>
-     * <li>extendedMargins(0,0,0,0)</li>
-     * <li>spacing(LayoutConstants.getSpacing())</li>
-     * <li>equalWidth(false)</li>
-     * </ul>
-     * 
-     * @return a GridLayoutFactory that creates GridLayouts as though created with
-     * their default constructor
-     * @see #swtDefaults
-     */
-    public static GridLayoutFactory fillDefaults() {
-    	GridLayout layout = new GridLayout();
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        Point defaultSpacing = LayoutConstants.getSpacing();
-        layout.horizontalSpacing = defaultSpacing.x;
-        layout.verticalSpacing = defaultSpacing.y;
-        return new GridLayoutFactory(layout);
-    }
-    
-    /**
-     * Sets whether the columns should be forced to be equal width
-     * 
-     * @param equal true iff the columns should be forced to be equal width
-     * @return this
-     */
-    public GridLayoutFactory equalWidth(boolean equal) {
-        l.makeColumnsEqualWidth = equal;
-        return this;
-    }
-
-    /**
-     * Sets the spacing for layouts created with this factory. The spacing
-     * is the distance between cells within the layout. 
-     * 
-     * @param hSpacing horizontal spacing (pixels)
-     * @param vSpacing vertical spacing (pixels)
-     * @return this
-     * @see #margins(Point)
-     * @see #margins(int, int)
-     */
-    public GridLayoutFactory spacing(int hSpacing, int vSpacing) {
-        l.horizontalSpacing = hSpacing;
-        l.verticalSpacing = vSpacing;
-        return this;
-    }
-
-    /**
-     * Sets the spacing for layouts created with this factory. The spacing
-     * is the distance between cells within the layout. 
-     * 
-     * @param spacing space between controls in the layout (pixels)
-     * @return this
-     * @see #margins(Point)
-     * @see #margins(int, int)
-     */
-    public GridLayoutFactory spacing(Point spacing) {
-        l.horizontalSpacing = spacing.x;
-        l.verticalSpacing = spacing.y;
-        return this;
-    }
-
-    /**
-     * Sets the margins for layouts created with this factory. The margins
-     * are the distance between the outer cells and the edge of the layout.
-     * 
-     * @param margins margin size (pixels)
-     * @return this
-     * @see #spacing(Point)
-     * @see #spacing(int, int)
-     */
-    public GridLayoutFactory margins(Point margins) {
-        l.marginWidth = margins.x;
-        l.marginHeight = margins.y;
-        return this;
-    }
-
-    /**
-	 * Sets the margins for layouts created with this factory. The margins
-	 * specify the number of pixels of horizontal and vertical margin that will
-	 * be placed along the left/right and top/bottom edges of the layout. Note
-	 * that thes margins will be added to the ones specified by
-	 * {@link #extendedMargins(int, int, int, int)}.
-	 * 
-	 * @param width
-	 *            margin width (pixels)
-	 * @param height
-	 *            margin height (pixels)
-	 * @return this
-	 * @see #spacing(Point)
-	 * * @see #spacing(int, int)
-	 */
-    public GridLayoutFactory margins(int width, int height) {
-        l.marginWidth = width;
-        l.marginHeight = height;
-        return this;
-    }
-
-    /**
-	 * Sets the margins for layouts created with this factory. The margins
-	 * specify the number of pixels of horizontal and vertical margin that will
-	 * be placed along the left, right, top, and bottom edges of the layout.
-	 * Note that thes margins will be added to the ones specified by
-	 * {@link #margins(int, int)}.
-	 * 
-	 * @param left
-	 *            left margin size (pixels)
-	 * @param right
-	 *            right margin size (pixels)
-	 * @param top
-	 *            top margin size (pixels)
-	 * @param bottom
-	 *            bottom margin size (pixels)
-	 * @return this
-	 * @see #spacing(Point)
-	 * @see #spacing(int, int)
-	 * 
-	 * @since 3.3
-	 */
-    public GridLayoutFactory extendedMargins(int left, int right, int top, int bottom) {
-        l.marginLeft = left;
-        l.marginRight = right;
-        l.marginTop = top;
-        l.marginBottom = bottom;
-        return this;
-    }
-
-    /**
-	 * Sets the margins for layouts created with this factory. The margins
-	 * specify the number of pixels of horizontal and vertical margin that will
-	 * be placed along the left, right, top, and bottom edges of the layout.
-	 * Note that thes margins will be added to the ones specified by
-	 * {@link #margins(int, int)}.
-	 * 
-     * <code><pre>
-     *     // Construct a GridLayout whose left, right, top, and bottom 
-     *     // margin sizes are 10, 5, 0, and 15 respectively
-     *      
-     *     Rectangle margins = Geometry.createDiffRectangle(10,5,0,15);
-     *     GridLayoutFactory.fillDefaults().extendedMargins(margins).applyTo(composite1);
-     * </pre></code>
-	 * 
-	 * @param differenceRect rectangle which, when added to the client area of the
-	 *        layout, returns the outer area of the layout. The x and y values of
-	 *        the rectangle correspond to the position of the bounds of the 
-	 *        layout with respect to the client area. They should be negative. 
-	 *        The width and height correspond to the relative size of the bounds
-	 *        of the layout with respect to the client area, and should be positive. 
-	 * @return this
-	 * @see #spacing(Point)
-	 * @see #spacing(int, int)
-	 * 
-	 * @since 3.3
-	 */
-    public GridLayoutFactory extendedMargins(Rectangle differenceRect) {
-        l.marginLeft = -differenceRect.x;
-        l.marginTop = -differenceRect.y;
-        l.marginBottom = differenceRect.y + differenceRect.height;
-        l.marginRight = differenceRect.x + differenceRect.width;
-        return this;
-    }
-    
-    /**
-     * Sets the number of columns in the layout
-     * 
-     * @param numColumns number of columns in the layout
-     * @return this
-     */
-    public GridLayoutFactory numColumns(int numColumns) {
-        l.numColumns = numColumns;
-        return this;
-    }
-
-    /**
-     * Creates a new GridLayout, and initializes it with values from the factory.
-     * 
-     * @return a new initialized GridLayout.
-     * @see #applyTo
-     */
-    public GridLayout create() {
-        return copyLayout(l);
-    }
-
-    /**
-     * Creates a new GridLayout and attaches it to the given composite.
-     * Does not create the GridData of any of the controls in the composite.
-     * 
-     * @param c composite whose layout will be set
-     * @see #generateLayout
-     * @see #create
-     * @see GridLayoutFactory
-     */
-    public void applyTo(Composite c) {
-        c.setLayout(copyLayout(l));
-    }
-
-    /**
-     * Copies the given GridLayout instance
-     * 
-     * @param l layout to copy
-     * @return a new GridLayout
-     */
-    public static GridLayout copyLayout(GridLayout l) {
-        GridLayout result = new GridLayout(l.numColumns, l.makeColumnsEqualWidth);
-        result.horizontalSpacing = l.horizontalSpacing;
-        result.marginBottom = l.marginBottom;
-        result.marginHeight = l.marginHeight;
-        result.marginLeft = l.marginLeft;
-        result.marginRight = l.marginRight;
-        result.marginTop = l.marginTop;
-        result.marginWidth = l.marginWidth;
-        result.verticalSpacing = l.verticalSpacing;
-
-        return result;
-    }
-
-    /**
-     * Applies this layout to the given composite, and attaches default GridData
-     * to all immediate children that don't have one. The layout is generated using 
-     * heuristics based on the widget types. In most cases, it will create exactly the same
-     * layout that would have been hardcoded by the programmer. In any situation
-     * where it does not produce the desired layout, the GridData for any child can be 
-     * overridden by attaching the layout data before calling this method. In these cases,
-     * the special-case layout data can be hardcoded and the algorithm can supply defaults
-     * to the rest.
-     * 
-     * <p>
-     * This must be called <b>AFTER</b> all of the child controls have been created and their
-     * layouts attached. This method will attach a layout to the given composite. If any new 
-     * children are created after calling this method, their GridData must be created manually. 
-     * The algorithm does not recurse into child composites. To generate all the layouts in
-     * a widget hierarchy, the method must be called bottom-up for each Composite.   
-     * </p>
-     * 
-     * <p>
-     * All controls are made to span a single cell. The algorithm tries to classify controls into one 
-     * of the following categories:
-     * </p>
-     * 
-     * <ul>
-     * <li>Pushbuttons: Set to a constant size large enough to fit their text and no smaller
-     * than the default button size.</li>
-     * <li>Wrapping with text (labels, read-only text boxes, etc.): override the preferred horizontal 
-     *     size with the default wrapping point, fill horizontally, grab horizontal space, keep the
-     *     preferred vertical size</li>
-     * <li>Wrapping without text (toolbars, coolbars, etc.): fill align, don't grab, use the preferred size</li>
-     * <li>Horizontally scrolling controls (anything with horizontal scrollbars or where the user edits
-     *     text and can cursor through it from left-to-right): override the preferred horizontal size with
-     *     a constant, grab horizontal, fill horizontal.</li>
-     * <li>Vertically scrolling controls (anything with vertical scrollbars or where the user edits
-     *     text and can cursor through it up and down): override the preferred vertical size with a constant,
-     *     grab vertical, fill vertical</li>
-     * <li>Nested layouts: fill align both directions, grab along any dimension if the layout would
-     *     be able to expand along that dimension.</li>
-     * <li>Non-wrapping non-scrollable read-only text: fill horizontally, center vertically, default size, don't grab </li>
-     * <li>Non-wrapping non-scrollable non-text: fill both, default size, don't grab</li>
-     * </ul>
-     * 
-     * @param c composite whose layout will be generated
-     */
-    public void generateLayout(Composite c) {
-        applyTo(c);
-        LayoutGenerator.generateLayout(c);
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/LayoutConstants.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/LayoutConstants.java
deleted file mode 100644
index 6c540ea..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/LayoutConstants.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.layout;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Contains various layout constants
- * 
- * @since 3.2
- */
-public final class LayoutConstants {
-	private static Point dialogMargins = null;
-	private static Point dialogSpacing = null;
-	private static Point minButtonSize = null;
-	
-	private static void initializeConstants() {
-		if (dialogMargins != null) {
-			return;
-		}
-		
-		GC gc = new GC(Display.getCurrent());
-		gc.setFont(JFaceResources.getDialogFont());
-		FontMetrics fontMetrics = gc.getFontMetrics();
-
-		dialogMargins = new Point(Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.HORIZONTAL_MARGIN),
-				Dialog.convertVerticalDLUsToPixels(fontMetrics, IDialogConstants.VERTICAL_MARGIN));
-
-		dialogSpacing = new Point(Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.HORIZONTAL_SPACING),
-				Dialog.convertVerticalDLUsToPixels(fontMetrics, IDialogConstants.VERTICAL_SPACING));
-
-		minButtonSize  = new Point(Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.BUTTON_WIDTH), 0);
-		
-		gc.dispose();
-	}
-	
-	/**
-	 * Returns the default dialog margins, in pixels
-	 * 
-	 * @return the default dialog margins, in pixels
-	 */
-    public static final Point getMargins() {
-    	initializeConstants();
-    	return dialogMargins;
-    }
-
-    /**
-     * Returns the default dialog spacing, in pixels
-     * 
-     * @return the default dialog spacing, in pixels
-     */
-    public static final Point getSpacing() {
-    	initializeConstants();
-    	return dialogSpacing;
-    }
-
-    /**
-     * Returns the default minimum button size, in pixels
-     * 
-     * @return the default minimum button size, in pixels
-     */
-    public static final Point getMinButtonSize() {
-    	initializeConstants();
-    	return minButtonSize;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/LayoutGenerator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/LayoutGenerator.java
deleted file mode 100644
index c4e33e2..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/LayoutGenerator.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.layout;
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyListener;
-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.Layout;
-import org.eclipse.swt.widgets.Scrollable;
-
-/* package */class LayoutGenerator {
-
-    /**
-     * Default size for controls with varying contents
-     */
-    private static final Point defaultSize = new Point(150, 150);
-
-    /**
-     * Default wrapping size for wrapped labels
-     */
-    private static final int wrapSize = 350;
-
-    private static final GridDataFactory nonWrappingLabelData = GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.CENTER).grab(false, false);
-
-    private static boolean hasStyle(Control c, int style) {
-        return (c.getStyle() & style) != 0;
-    }
-
-    /**
-     * Generates a GridLayout for the given composite by examining its child
-     * controls and attaching layout data to any immediate children that do not
-     * already have layout data.
-     * 
-     * @param toGenerate
-     *            composite to generate a layout for
-     */
-    public static void generateLayout(Composite toGenerate) {
-        Control[] children = toGenerate.getChildren();
-
-        for (int i = 0; i < children.length; i++) {
-            Control control = children[i];
-
-            // Skip any children that already have layout data
-            if (control.getLayoutData() != null) {
-                continue;
-            }
-
-            applyLayoutDataTo(control);
-        }
-    }
-
-    private static void applyLayoutDataTo(Control control) {
-    	defaultsFor(control).applyTo(control);
-    }
-    
-    /**
-     * Creates default factory for this control types:
-     * <ul>
-     * 	<li>{@link Button} with {@link SWT#CHECK}</li>
-     * 	<li>{@link Button}</li>
-     * 	<li>{@link Composite}</li>
-     * </ul>
-     * @param control the control the factory is search for
-     * @return a default factory for the control
-     */
-    public static GridDataFactory defaultsFor(Control control) {
-        if (control instanceof Button) {
-            Button button = (Button) control;
-
-            if (hasStyle(button, SWT.CHECK)) {
-                return nonWrappingLabelData.copy();
-            } else {
-                return GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).hint(Geometry.max(button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true), LayoutConstants.getMinButtonSize()));
-            }
-        }
-
-        if (control instanceof Scrollable) {
-            Scrollable scrollable = (Scrollable) control;
-
-            if (scrollable instanceof Composite) {
-                Composite composite = (Composite) control;
-
-                Layout theLayout = composite.getLayout();
-                if (theLayout instanceof GridLayout) {
-                    boolean growsHorizontally = false;
-                    boolean growsVertically = false;
-
-                    Control[] children = composite.getChildren();
-                    for (int i = 0; i < children.length; i++) {
-                        Control child = children[i];
-
-                        GridData data = (GridData) child.getLayoutData();
-
-                        if (data != null) {
-                            if (data.grabExcessHorizontalSpace) {
-                                growsHorizontally = true;
-                            }
-                            if (data.grabExcessVerticalSpace) {
-                                growsVertically = true;
-                            }
-                        }
-                    }
-
-                    return GridDataFactory.fillDefaults().grab(growsHorizontally, growsVertically);
-                }
-            }
-        }
-
-        boolean wrapping = hasStyle(control, SWT.WRAP);
-
-        // Assume any control with the H_SCROLL or V_SCROLL flags are
-        // horizontally or vertically
-        // scrollable, respectively.
-        boolean hScroll = hasStyle(control, SWT.H_SCROLL);
-        boolean vScroll = hasStyle(control, SWT.V_SCROLL);
-
-        boolean containsText = hasMethod(control, "setText", new Class[] { String.class }); //$NON-NLS-1$
-
-        // If the control has a setText method, an addModifyListener method, and
-        // does not have
-        // the SWT.READ_ONLY flag, assume it contains user-editable text.
-        boolean userEditable = !hasStyle(control, SWT.READ_ONLY) && containsText && hasMethod(control, "addModifyListener", new Class[] { ModifyListener.class }); //$NON-NLS-1$
-
-        // For controls containing user-editable text...
-        if (userEditable) {
-            if (hasStyle(control, SWT.MULTI)) {
-                vScroll = true;
-            }
-
-            if (!wrapping) {
-                hScroll = true;
-            }
-        }
-
-        // Compute the horizontal hint
-        int hHint = SWT.DEFAULT;
-        boolean grabHorizontal = hScroll;
-
-        // For horizontally-scrollable controls, override their horizontal
-        // preferred size
-        // with a constant
-        if (hScroll) {
-            hHint = defaultSize.x;
-        } else {
-            // For wrapping controls, there are two cases.
-            // 1. For controls that contain text (like wrapping labels,
-            // read-only text boxes,
-            // etc.) override their preferred size with the preferred wrapping
-            // point and
-            // make them grab horizontal space.
-            // 2. For non-text controls (like wrapping toolbars), assume that
-            // their non-wrapped
-            // size is best.
-
-            if (wrapping) {
-                if (containsText) {
-                    hHint = wrapSize;
-                    grabHorizontal = true;
-                }
-            }
-        }
-
-        int vAlign = SWT.FILL;
-
-        // Heuristic for labels: Controls that contain non-wrapping read-only
-        // text should be
-        // center-aligned rather than fill-aligned
-        if (!vScroll && !wrapping && !userEditable && containsText) {
-            vAlign = SWT.CENTER;
-        }
-
-        return GridDataFactory.fillDefaults().grab(grabHorizontal, vScroll).align(SWT.FILL, vAlign).hint(hHint, vScroll ? defaultSize.y : SWT.DEFAULT);
-    }
-
-    private static boolean hasMethod(Control control, String name, Class[] parameterTypes) {
-        Class c = control.getClass();
-        try {
-            return c.getMethod(name, parameterTypes) != null;
-        } catch (SecurityException e) {
-            return false;
-        } catch (NoSuchMethodException e) {
-            return false;
-        }
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/PixelConverter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/PixelConverter.java
deleted file mode 100644
index d8e8460..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/PixelConverter.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.layout;
-
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Control;
-
-import org.eclipse.jface.dialogs.Dialog;
-
-/**
- * PixelConverter performs various conversions from device-independent units
- * (such as DLUs or characters) to pixels. It can be associated with a control or
- * a font. In the case of a control, the font used by the control at the time
- * the PixelConverter is created is used for the pixel calculations. In the case
- * of a specific font, the supplied font is used for the calculations.
- * 
- * The control and/or font must not be disposed at the time the PixelConverter
- * is created.
- * 
- * @since 3.5
- */
-public class PixelConverter {
-
-	private final FontMetrics fontMetrics;
-
-	/**
-	 * Create a PixelConverter which will convert device-independent units to
-	 * pixels using the font of the specified control.
-	 * 
-	 * @param control
-	 *            the control whose font should be used for pixel conversions.
-	 *            Note that the font used by the control at the time this
-	 *            constructor is called is the font that will be used for all
-	 *            calculations. If the font of the specified control is changed
-	 *            after this PixelConverter is created, then the conversions
-	 *            from this instance will not produce the desired effect.
-	 */
-	public PixelConverter(Control control) {
-		this(control.getFont());
-	}
-
-	/**
-	 * Create a PixelConverter which will convert device-independent units to
-	 * pixels using the specified font.
-	 * 
-	 * @param font
-	 *            the font that should be used for pixel conversions.
-	 */
-	public PixelConverter(Font font) {
-		GC gc = new GC(font.getDevice());
-		gc.setFont(font);
-		fontMetrics = gc.getFontMetrics();
-		gc.dispose();
-	}
-
-	/**
-	 * Returns the number of pixels corresponding to the height of the given
-	 * number of characters.
-	 * 
-	 * @param chars
-	 *            the number of characters
-	 * @return the number of pixels
-	 */
-	public int convertHeightInCharsToPixels(int chars) {
-		return Dialog.convertHeightInCharsToPixels(fontMetrics, chars);
-	}
-
-	/**
-	 * Returns the number of pixels corresponding to the given number of
-	 * horizontal dialog units.
-	 * 
-	 * @param dlus
-	 *            the number of horizontal dialog units
-	 * @return the number of pixels
-	 */
-	public int convertHorizontalDLUsToPixels(int dlus) {
-		return Dialog.convertHorizontalDLUsToPixels(fontMetrics, dlus);
-	}
-
-	/**
-	 * Returns the number of pixels corresponding to the given number of
-	 * vertical dialog units.
-	 * 
-	 * @param dlus
-	 *            the number of vertical dialog units
-	 * @return the number of pixels
-	 */
-	public int convertVerticalDLUsToPixels(int dlus) {
-		return Dialog.convertVerticalDLUsToPixels(fontMetrics, dlus);
-	}
-
-	/**
-	 * Returns the number of pixels corresponding to the width of the given
-	 * number of characters.
-	 * 
-	 * @param chars
-	 *            the number of characters
-	 * @return the number of pixels
-	 */
-	public int convertWidthInCharsToPixels(int chars) {
-		return Dialog.convertWidthInCharsToPixels(fontMetrics, chars);
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/RowDataFactory.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/RowDataFactory.java
deleted file mode 100644
index baa5c8d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/RowDataFactory.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Stefan Xenos, IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.layout;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.RowData;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * This class provides a convenient shorthand for creating and initialising
- * RowData. This offers several benefits over creating RowData the normal way:
- * 
- * <ul>
- * <li>The same factory can be used many times to create several RowData
- * instances</li>
- * <li>The setters on RowDataFactory all return "this", allowing them to be
- * chained</li>
- * </ul>
- * 
- * @since 3.5
- */
-public final class RowDataFactory {
-	private RowData data;
-
-	/**
-	 * Creates a RowDataFactory that creates copies of the given RowData.
-	 * 
-	 * @param data
-	 *            object to be copied
-	 */
-	private RowDataFactory(RowData data) {
-		this.data = data;
-	}
-
-	/**
-	 * Creates a new RowDataFactory initialized with the SWT defaults.
-	 * 
-	 * <p>
-	 * Initial values are:
-	 * </p>
-	 * 
-	 * <ul>
-	 * <li>exclude(false)</li>
-	 * <li>hint(SWT.DEFAULT, SWT.DEFAULT)</li>
-	 * </ul>
-	 * 
-	 * @return a new GridDataFactory instance
-	 */
-	public static RowDataFactory swtDefaults() {
-		return new RowDataFactory(new RowData());
-	}
-
-	/**
-	 * Creates a new RowDataFactory that creates copies of the given RowData by
-	 * default.
-	 * 
-	 * @param data
-	 *            RowData to copy
-	 * @return a new RowDataFactory that creates copies of the argument by
-	 *         default
-	 */
-	public static RowDataFactory createFrom(RowData data) {
-		return new RowDataFactory(copyData(data));
-	}
-
-	/**
-	 * Returns a copy of the given RowData
-	 * 
-	 * @param data
-	 *            RowData to copy
-	 * @return a copy of the argument
-	 */
-	public static RowData copyData(RowData data) {
-		RowData newData = new RowData(data.width, data.height);
-		newData.exclude = data.exclude;
-
-		return newData;
-	}
-
-	/**
-	 * Instructs the GridLayout to ignore this control when performing layouts.
-	 * 
-	 * @param shouldExclude
-	 *            true iff the control should be excluded from layouts
-	 * @return this
-	 */
-	public RowDataFactory exclude(boolean shouldExclude) {
-		data.exclude = shouldExclude;
-		return this;
-	}
-
-	/**
-	 * Creates a new GridData instance. All attributes of the GridData instance
-	 * will be initialised by the factory.
-	 * 
-	 * @return a new GridData instance
-	 */
-	public RowData create() {
-		return copyData(data);
-	}
-
-	/**
-	 * Creates a copy of the receiver.
-	 * 
-	 * @return a copy of the receiver
-	 */
-	public RowDataFactory copy() {
-		return new RowDataFactory(create());
-	}
-
-	/**
-	 * Sets the layout data on the given control. Creates a new RowData instance
-	 * and assigns it to the control by calling control.setLayoutData.
-	 * 
-	 * @param control
-	 *            control whose layout data will be initialised
-	 */
-	public void applyTo(Control control) {
-		control.setLayoutData(create());
-	}
-
-	/**
-	 * Sets the width and height hints. The width and height hints override the
-	 * control's preferred size. If either hint is set to SWT.DEFAULT, the
-	 * control's preferred size is used.
-	 * 
-	 * @param xHint
-	 *            horizontal hint (pixels), or SWT.DEFAULT to use the control's
-	 *            preferred size
-	 * @param yHint
-	 *            vertical hint (pixels), or SWT.DEFAULT to use the control's
-	 *            preferred size
-	 * @return this
-	 */
-	public RowDataFactory hint(int xHint, int yHint) {
-		data.width = xHint;
-		data.height = yHint;
-		return this;
-	}
-
-	/**
-	 * Sets the width and height hints. The width and height hints override the
-	 * control's preferred size. If either hint is set to SWT.DEFAULT, the
-	 * control's preferred size is used.
-	 * 
-	 * @param hint
-	 *            size (pixels) to be used instead of the control's preferred
-	 *            size. If the x or y values are set to SWT.DEFAULT, the
-	 *            control's computeSize() method will be used to obtain that
-	 *            dimension of the preferred size.
-	 * @return this
-	 */
-	public RowDataFactory hint(Point hint) {
-		data.width = hint.x;
-		data.height = hint.y;
-		return this;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/RowLayoutFactory.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/RowLayoutFactory.java
deleted file mode 100644
index 5cf6c6b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/RowLayoutFactory.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Micah Hainline and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Micah Hainline - initial API and implementation
- *     Stefan Xenos, IBM Corporation - review, javadoc, and extendedMargins(Rectangle)
- *******************************************************************************/
-package org.eclipse.jface.layout;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * RowLayoutFactory creates and initializes row layouts. There are two ways to
- * use RowLayoutFactory. Normally, it is used as a shorthand for writing
- * "new RowLayout()" and initializing a bunch of fields. In this case the main
- * benefit is a more concise syntax and the ability to create more than one
- * identical RowLayout from the same factory. Changing a property of the factory
- * will affect future layouts created by the factory, but has no effect on
- * layouts that have already been created.
- * 
- * @since 3.5
- */
-public final class RowLayoutFactory {
-	/**
-	 * Template layout. The factory will create copies of this layout.
-	 */
-	private RowLayout layout;
-
-	/**
-	 * Creates a new RowLayoutFactory that will create copies of the given
-	 * layout.
-	 * 
-	 * @param layout
-	 *            layout to copy
-	 */
-	private RowLayoutFactory(RowLayout layout) {
-		this.layout = layout;
-	}
-
-	/**
-	 * Creates a factory that creates copies of the given layout.
-	 * 
-	 * @param layout
-	 *            layout to copy
-	 * @return a new RowLayoutFactory instance that creates copies of the given
-	 *         layout
-	 */
-	public static RowLayoutFactory createFrom(RowLayout layout) {
-		return new RowLayoutFactory(copyLayout(layout));
-	}
-
-	/**
-	 * Creates a copy of the receiver.
-	 * 
-	 * @return a copy of the receiver
-	 */
-	public RowLayoutFactory copy() {
-		return new RowLayoutFactory(create());
-	}
-
-	/**
-	 * Creates a RowLayoutFactory that creates RowLayouts with the default SWT
-	 * values.
-	 * 
-	 * <p>
-	 * Initial values are:
-	 * </p>
-	 * 
-	 * <ul>
-	 * <li>margins(0,0)</li>
-	 * <li>extendedMargins(3,3,3,3)</li>
-	 * <li>wrap(true)</li>
-	 * <li>pack(true)</li>
-	 * <li>fill(false)</li>
-	 * <li>justify(false)</li>
-	 * <li>spacing(3)</li>
-	 * </ul>
-	 * 
-	 * @return a RowLayoutFactory that creates RowLayouts as though created with
-	 *         their default constructor
-	 * @see #fillDefaults
-	 */
-	public static RowLayoutFactory swtDefaults() {
-		return new RowLayoutFactory(new RowLayout());
-	}
-
-	/**
-	 * Creates a RowLayoutFactory that creates RowLayouts with no margins, fill
-	 * behavior, and default dialog spacing.
-	 * 
-	 * <p>
-	 * Initial values are:
-	 * </p>
-	 * 
-	 * <ul>
-	 * <li>margins(0,0)</li>
-	 * <li>extendedMargins(0,0,0,0)</li>
-	 * <li>wrap(true)</li>
-	 * <li>pack(true)</li>
-	 * <li>fill(false)</li>
-	 * <li>justify(false)</li>
-	 * <li>spacing(LayoutConstants.getSpacing().x</li>
-	 * </ul>
-	 * 
-	 * @return a RowLayoutFactory that creates RowLayouts with no margins
-	 * @see #swtDefaults
-	 */
-	public static RowLayoutFactory fillDefaults() {
-		RowLayout layout = new RowLayout();
-		layout.marginTop = 0;
-		layout.marginBottom = 0;
-		layout.marginLeft = 0;
-		layout.marginRight = 0;
-		layout.spacing = LayoutConstants.getSpacing().x;
-		return new RowLayoutFactory(layout);
-	}
-
-	/**
-	 * Sets the spacing for layouts created with this factory. The spacing is
-	 * the distance between items within the layout.
-	 * 
-	 * @param spacing
-	 *            spacing (pixels)
-	 * @return this
-	 * @see #margins(Point)
-	 * @see #margins(int, int)
-	 */
-	public RowLayoutFactory spacing(int spacing) {
-		layout.spacing = spacing;
-		return this;
-	}
-
-	/**
-	 * Sets the margins for layouts created with this factory. The margins are
-	 * the distance between the outer cells and the edge of the layout.
-	 * 
-	 * @param margins
-	 *            margin size (pixels)
-	 * @return this
-	 * @see #spacing(int)
-	 */
-	public RowLayoutFactory margins(Point margins) {
-		layout.marginWidth = margins.x;
-		layout.marginHeight = margins.y;
-		return this;
-	}
-
-	/**
-	 * Sets the margins for layouts created with this factory. The margins
-	 * specify the number of pixels of horizontal and vertical margin that will
-	 * be placed along the left/right and top/bottom edges of the layout. Note
-	 * that these margins will be added to the ones specified by
-	 * {@link #extendedMargins(int, int, int, int)}.
-	 * 
-	 * @param width
-	 *            margin width (pixels)
-	 * @param height
-	 *            margin height (pixels)
-	 * @return this
-	 * @see #spacing(int)
-	 */
-	public RowLayoutFactory margins(int width, int height) {
-		layout.marginWidth = width;
-		layout.marginHeight = height;
-		return this;
-	}
-
-	/**
-	 * Sets the margins for layouts created with this factory. The margins
-	 * specify the number of pixels of horizontal and vertical margin that will
-	 * be placed along the left, right, top, and bottom edges of the layout.
-	 * Note that these margins will be added to the ones specified by
-	 * {@link #margins(int, int)}.
-	 * 
-	 * @param left
-	 *            left margin size (pixels)
-	 * @param right
-	 *            right margin size (pixels)
-	 * @param top
-	 *            top margin size (pixels)
-	 * @param bottom
-	 *            bottom margin size (pixels)
-	 * @return this
-	 * @see #spacing(int)
-	 * 
-	 * @since 3.3
-	 */
-	public RowLayoutFactory extendedMargins(int left, int right, int top,
-			int bottom) {
-		layout.marginLeft = left;
-		layout.marginRight = right;
-		layout.marginTop = top;
-		layout.marginBottom = bottom;
-		return this;
-	}
-
-	/**
-	 * Fill specifies whether the controls in a row should be all the same
-	 * height for horizontal layouts, or the same width for vertical layouts.
-	 * 
-	 * @param fill
-	 *            the fill status
-	 * @return this
-	 */
-	public RowLayoutFactory fill(boolean fill) {
-		layout.fill = fill;
-		return this;
-	}
-
-	/**
-	 * Justify specifies whether the controls in a row should be fully
-	 * justified, with any extra space placed between the controls.
-	 * 
-	 * @param justify
-	 *            the justify status
-	 * @return this
-	 */
-	public RowLayoutFactory justify(boolean justify) {
-		layout.justify = justify;
-		return this;
-	}
-
-	/**
-	 * Pack specifies whether all controls in the layout take their preferred
-	 * size. If pack is false, all controls will have the same size which is the
-	 * size required to accommodate the largest preferred height and the largest
-	 * preferred width of all the controls in the layout.
-	 * 
-	 * @param pack
-	 *            the pack status
-	 * @return this
-	 */
-	public RowLayoutFactory pack(boolean pack) {
-		layout.pack = pack;
-		return this;
-	}
-
-	/**
-	 * Wrap specifies whether a control will be wrapped to the next row if there
-	 * is insufficient space on the current row.
-	 * 
-	 * @param wrap
-	 *            the wrap status
-	 * @return this
-	 */
-	public RowLayoutFactory wrap(boolean wrap) {
-		layout.wrap = wrap;
-		return this;
-	}
-
-	/**
-	 * type specifies whether the layout places controls in rows or columns.
-	 * 
-	 * Possible values are:
-	 * <ul>
-	 * <li>HORIZONTAL: Position the controls horizontally from left to right</li>
-	 * <li>VERTICAL: Position the controls vertically from top to bottom</li>
-	 * </ul>
-	 * 
-	 * @param type
-	 *            One of SWT.HORIZONTAL or SWT.VERTICAL
-	 * @return this
-	 * 
-	 * @throws IllegalArgumentException
-	 *             if type is not one of HORIZONTAL or VERTICAL
-	 */
-	public RowLayoutFactory type(int type) {
-		if (type != SWT.HORIZONTAL && type != SWT.VERTICAL) {
-			throw new IllegalArgumentException();
-		}
-		layout.type = type;
-		return this;
-	}
-
-	/**
-	 * Creates a new RowLayout, and initializes it with values from the factory.
-	 * 
-	 * @return a new initialized RowLayout.
-	 * @see #applyTo
-	 */
-	public RowLayout create() {
-		return copyLayout(layout);
-	}
-
-	/**
-	 * Creates a new RowLayout and attaches it to the given composite. Does not
-	 * create the rowData of any of the controls in the composite.
-	 * 
-	 * @param c
-	 *            composite whose layout will be set
-	 * @see #create
-	 * @see RowLayoutFactory
-	 */
-	public void applyTo(Composite c) {
-		c.setLayout(copyLayout(layout));
-	}
-
-	/**
-	 * Copies the given RowLayout instance
-	 * 
-	 * @param layout
-	 *            layout to copy
-	 * @return a new RowLayout
-	 */
-	public static RowLayout copyLayout(RowLayout layout) {
-		RowLayout result = new RowLayout(layout.type);
-		result.marginBottom = layout.marginBottom;
-		result.marginTop = layout.marginTop;
-		result.marginLeft = layout.marginLeft;
-		result.marginRight = layout.marginRight;
-		result.marginHeight = layout.marginHeight;
-		result.marginWidth = layout.marginWidth;
-
-		result.fill = layout.fill;
-		result.justify = layout.justify;
-		result.pack = layout.pack;
-		result.spacing = layout.spacing;
-		result.wrap = layout.wrap;
-
-		result.type = layout.type;
-
-		return result;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/TableColumnLayout.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/TableColumnLayout.java
deleted file mode 100644
index 92f6895..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/TableColumnLayout.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * 	   Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *                                               - fix for bug 178280
- *     IBM Corporation - API refactoring and general maintenance
- *******************************************************************************/
-
-package org.eclipse.jface.layout;
-
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Scrollable;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * The TableColumnLayout is the {@link Layout} used to maintain
- * {@link TableColumn} sizes in a {@link Table}.
- * 
- * <p>
- * <b>You can only add the {@link Layout} to a container whose <i>only</i>
- * child is the {@link Table} control you want the {@link Layout} applied to.
- * Don't assign the layout directly the {@link Table}</b>
- * </p>
- * 
- * @since 3.3
- */
-public class TableColumnLayout extends AbstractColumnLayout {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.layout.AbstractColumnLayout#getColumnCount(org.eclipse.swt.widgets.Scrollable)
-	 */
-	int getColumnCount(Scrollable tableTree) {
-		return ((Table) tableTree).getColumnCount();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.layout.AbstractColumnLayout#setColumnWidths(org.eclipse.swt.widgets.Scrollable,
-	 *      int[])
-	 */
-	void setColumnWidths(Scrollable tableTree, int[] widths) {
-		TableColumn[] columns = ((Table) tableTree).getColumns();
-		for (int i = 0; i < widths.length; i++) {
-			columns[i].setWidth(widths[i]);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.layout.AbstractColumnLayout#getLayoutData(int)
-	 */
-	ColumnLayoutData getLayoutData(Scrollable tableTree, int columnIndex) {
-		TableColumn column = ((Table) tableTree).getColumn(columnIndex);
-		return (ColumnLayoutData) column.getData(LAYOUT_DATA);
-	}
-
-	Composite getComposite(Widget column) {
-		return ((TableColumn) column).getParent().getParent();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.layout.AbstractColumnLayout#updateColumnData(org.eclipse.swt.widgets.Widget)
-	 */
-	void updateColumnData(Widget column) {
-		TableColumn tColumn = (TableColumn) column;
-		Table t = tColumn.getParent();
-		
-		if( ! IS_GTK || t.getColumn(t.getColumnCount()-1) != tColumn ){
-			tColumn.setData(LAYOUT_DATA,new ColumnPixelData(tColumn.getWidth()));
-			layout(t.getParent(), true);
-		}	
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/TreeColumnLayout.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/TreeColumnLayout.java
deleted file mode 100644
index 7258acb..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/TreeColumnLayout.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * 	   Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *                                               - fix for bug 178280, 183999, 184609
- *     IBM Corporation - API refactoring and general maintenance
- *******************************************************************************/
-
-package org.eclipse.jface.layout;
-
-
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.swt.events.TreeEvent;
-import org.eclipse.swt.events.TreeListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Scrollable;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * The TreeColumnLayout is the {@link Layout} used to maintain {@link TreeColumn} sizes in a 
- * {@link Tree}.
- * 
- * <p>
- * <b>You can only add the {@link Layout} to a container whose <i>only</i>
- * child is the {@link Tree} control you want the {@link Layout} applied to.
- * Don't assign the layout directly the {@link Tree}</b>
- * </p>
- * 
- * @since 3.3
- */
-public class TreeColumnLayout extends AbstractColumnLayout {
-	private boolean addListener = true;
-	
-	private static class TreeLayoutListener implements TreeListener {
-
-		public void treeCollapsed(TreeEvent e) {
-			update((Tree) e.widget);
-		}
-
-		public void treeExpanded(TreeEvent e) {
-			update((Tree) e.widget);
-		}
-		
-		private void update(final Tree tree) {
-			tree.getDisplay().asyncExec(new Runnable() {
-
-				public void run() {
-					tree.update();
-					tree.getParent().layout();
-				}
-				
-			});
-		}
-		
-	}
-	
-	private static final TreeLayoutListener listener = new TreeLayoutListener();
-	
-	protected void layout(Composite composite, boolean flushCache) {
-		super.layout(composite, flushCache);
-		if( addListener ) {
-			addListener=false;
-			((Tree)getControl(composite)).addTreeListener(listener);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.layout.AbstractColumnLayout#getColumnCount(org.eclipse.swt.widgets.Scrollable)
-	 */
-	int getColumnCount(Scrollable tree) {
-		return ((Tree) tree).getColumnCount();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.layout.AbstractColumnLayout#setColumnWidths(org.eclipse.swt.widgets.Scrollable, int[])
-	 */
-	void setColumnWidths(Scrollable tree, int[] widths) {
-		TreeColumn[] columns = ((Tree) tree).getColumns();
-		for (int i = 0; i < widths.length; i++) {
-			columns[i].setWidth(widths[i]);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.layout.AbstractColumnLayout#getLayoutData(org.eclipse.swt.widgets.Scrollable, int)
-	 */
-	ColumnLayoutData getLayoutData(Scrollable tableTree, int columnIndex) {
-		TreeColumn column = ((Tree) tableTree).getColumn(columnIndex);
-		return (ColumnLayoutData) column.getData(LAYOUT_DATA);
-	}
-	
-	void updateColumnData(Widget column) {
-		TreeColumn tColumn = (TreeColumn) column;
-		Tree t = tColumn.getParent();
-		
-		if( ! IS_GTK || t.getColumn(t.getColumnCount()-1) != tColumn ){
-			tColumn.setData(LAYOUT_DATA,new ColumnPixelData(tColumn.getWidth()));
-			layout(t.getParent(), true);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/package.html
deleted file mode 100644
index c4de2b3..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/layout/package.html
+++ /dev/null
@@ -1,15 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides support for layout generation. 
-<h2>
-Package Specification</h2>
-<p> This package provides classes that can be used to generate layouts.
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/menus/AbstractTrimWidget.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/menus/AbstractTrimWidget.java
deleted file mode 100644
index d22ea16..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/menus/AbstractTrimWidget.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.menus;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.CoolBar;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolBar;
-
-/**
- * This extension to the {@link IWidget} interface allows clients adding
- * elements to the trim to receive notifications if the User moves the widget to
- * another trim area.
- * <p>
- * This class is intended to be the base for any trim contributions.
- * </p>
- * @since 3.2
- * 
- */
-public abstract class AbstractTrimWidget implements IWidget {
-	/**
-	 * This method is called to initially construct the widget and is also
-	 * called whenever the widget's composite has been moved to a trim area on a
-	 * different side of the workbench. It is the client's responsibility to
-	 * control the life-cycle of the Control it manages.
-	 * <p>
-	 * For example: If the implementation is constructing a {@link ToolBar} and
-	 * the orientation were to change from horizontal to vertical it would have
-	 * to <code>dispose</code> its old ToolBar and create a new one with the
-	 * correct orientation.
-	 * </p>
-	 * <p>
-	 * The sides can be one of:
-	 * <ul>
-	 * <li>{@link SWT#TOP}</li>
-	 * <li>{@link SWT#BOTTOM}</li>
-	 * <li>{@link SWT#LEFT}</li>
-	 * <li>{@link SWT#RIGHT}</li>
-	 * </ul>
-	 * </p>
-	 * <p>
-	 * 
-	 * @param parent
-	 *            The parent to (re)create the widget under
-	 * 
-	 * @param oldSide
-	 *            The previous side ({@link SWT#DEFAULT} on the initial fill)
-	 * @param newSide
-	 *            The current side
-	 */
-	public abstract void fill(Composite parent, int oldSide, int newSide);
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.menus.IWidget#dispose()
-	 */
-	public abstract void dispose();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.menus.IWidget#fill(org.eclipse.swt.widgets.Composite)
-	 */
-	public void fill(Composite parent) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.menus.IWidget#fill(org.eclipse.swt.widgets.Menu, int)
-	 */
-	public void fill(Menu parent, int index) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.menus.IWidget#fill(org.eclipse.swt.widgets.ToolBar, int)
-	 */
-	public void fill(ToolBar parent, int index) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.menus.IWidget#fill(org.eclipse.swt.widgets.CoolBar, int)
-	 */
-	public void fill(CoolBar parent, int index) {
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/menus/IMenuStateIds.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/menus/IMenuStateIds.java
deleted file mode 100644
index 219c6f7..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/menus/IMenuStateIds.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.menus;
-
-import org.eclipse.core.commands.INamedHandleStateIds;
-import org.eclipse.jface.commands.RadioState;
-import org.eclipse.jface.commands.ToggleState;
-
-/**
- * <p>
- * State identifiers that should be understood by items and renderers of items.
- * The state is associated with the command, and then interpreted by the menu
- * renderer.
- * </p>
- * <p>
- * Clients may implement or extend this class.
- * </p>
- * 
- * @since 3.2
- */
-public interface IMenuStateIds extends INamedHandleStateIds {
-
-	/**
-	 * The state id used for indicating the widget style of a command presented
-	 * in the menus and tool bars. This state must be an instance of
-	 * {@link ToggleState} or {@link RadioState}.
-	 */
-	public static String STYLE = "STYLE"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/menus/IWidget.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/menus/IWidget.java
deleted file mode 100644
index c7c2285..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/menus/IWidget.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.menus;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.CoolBar;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolBar;
-
-/**
- * <p>
- * Provides a hook by which third-party code can contribute SWT widgets to a
- * menu, tool bar or status line. This can be used, for example, to add a combo
- * box to the status line, or a "Location" bar to the tool bar.
- * </p>
- * <p>
- * It is possible for fill and dispose to be called multiple times for a single
- * instance of <code>IWidget</code>.
- * </p>
- * <p>
- * Clients may implement, but must not extend.
- * </p>
- * 
- * @since 3.2
- */
-public interface IWidget {
-
-	/**
-	 * Disposes of the underlying widgets. This can be called when the widget is
-	 * becoming hidden.
-	 */
-	public void dispose();
-
-	/**
-	 * Fills the given composite control with controls representing this widget.
-	 * 
-	 * @param parent
-	 *            the parent control
-	 */
-	public void fill(Composite parent);
-
-	/**
-	 * Fills the given menu with controls representing this widget.
-	 * 
-	 * @param parent
-	 *            the parent menu
-	 * @param index
-	 *            the index where the controls are inserted, or <code>-1</code>
-	 *            to insert at the end
-	 */
-	public void fill(Menu parent, int index);
-
-	/**
-	 * Fills the given tool bar with controls representing this contribution
-	 * item.
-	 * 
-	 * @param parent
-	 *            the parent tool bar
-	 * @param index
-	 *            the index where the controls are inserted, or <code>-1</code>
-	 *            to insert at the end
-	 */
-	public void fill(ToolBar parent, int index);
-
-	/**
-	 * Fills the given cool bar with controls representing this contribution
-	 * item.
-	 * 
-	 * @param parent
-	 *            the parent cool bar
-	 * @param index
-	 *            the index where the controls are inserted, or <code>-1</code>
-	 *            to insert at the end
-	 */
-	public void fill(CoolBar parent, int index);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/menus/TextState.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/menus/TextState.java
deleted file mode 100644
index 4b10b05..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/menus/TextState.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.menus;
-
-import org.eclipse.core.commands.INamedHandleStateIds;
-import org.eclipse.jface.commands.PersistentState;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * <p>
- * A piece of state carrying a single {@link String}.
- * </p>
- * <p>
- * If this state is registered using {@link INamedHandleStateIds#NAME} or
- * {@link INamedHandleStateIds#DESCRIPTION}, then this allows the handler to
- * communicate a textual change for a given command. This is typically used by
- * graphical applications to allow more specific text to be displayed in the
- * menus. For example, "Undo" might become "Undo Typing" through the use of a
- * {@link TextState}.
- * </p>
- * <p>
- * Clients may instantiate this class, but must not extend.
- * </p>
- * 
- * @since 3.2
- * @see INamedHandleStateIds
- */
-public class TextState extends PersistentState {
-
-	public final void load(final IPreferenceStore store,
-			final String preferenceKey) {
-		final String value = store.getString(preferenceKey);
-		setValue(value);
-	}
-
-	public final void save(final IPreferenceStore store,
-			final String preferenceKey) {
-		final Object value = getValue();
-		if (value instanceof String) {
-			store.setValue(preferenceKey, ((String) value));
-		}
-	}
-
-	public void setValue(final Object value) {
-		if (!(value instanceof String)) {
-			throw new IllegalArgumentException(
-					"TextState takes a String as a value"); //$NON-NLS-1$
-		}
-
-		super.setValue(value);
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/menus/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/menus/package.html
deleted file mode 100644
index 15c0893..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/menus/package.html
+++ /dev/null
@@ -1,15 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides support for trim specification. 
-<h2>
-Package Specification</h2>
-<p> This package provides classes for trim widgets.
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/messages.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/messages.properties
deleted file mode 100644
index b97ee05..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/messages.properties
+++ /dev/null
@@ -1,219 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS file for JFace
-#############################################################
-
-#############################################################
-# Global label definitions
-#############################################################
-ok=OK
-cancel=Cancel
-yes=&Yes
-yestoall=Yes To &All
-skip=S&kip
-stop=&Stop
-abort=&Abort
-retry=&Retry
-ignore=&Ignore
-proceed=&Proceed
-open=&Open
-close=&Close
-showDetails=&Details >>
-hideDetails=<< &Details
-backButton=< &Back
-nextButton=&Next >
-finish=&Finish
-help=&Help
-helpToolTip=Help
-no=&No
-notoall=No &To All
-finish=&Finish
-help=&Help
-defaults=Restore &Defaults
-apply=&Apply
-openBrowse=&Browse...
-
-openChange=&Change...
-help=&Help
-close=&Close
-copy = &Copy
-
-error=Error
-warning=Warning
-info=Info
-question=Question
-
-##############################################################
-# Wizard Closing Dialog
-##############################################################
-WizardClosingDialog.title=Wizard Closing
-WizardClosingDialog.message=Wizard can not be closed due to an active operation. You must cancel the operation before you can close the wizard.
-
-##############################################################
-# Wizard Dialog
-##############################################################
-WizardDialog.missingSetControl = {0} has no page control
-
-##############################################################
-# The Progress Monitor Dialog
-##############################################################
-ProgressMonitorDialog.title=Progress Information
-ProgressMonitorDialog.message=Operation in progress...
-
-##############################################################
-# Preference Dialog
-##############################################################
-PreferenceDialog.title=Preferences
-PreferenceDialog.saveErrorTitle=Problem Saving Preferences
-PreferenceDialog.saveErrorMessage=A problem was encountered saving the page {0}.\n{1}
-
-##############################################################
-# Change Errors
-##############################################################
-PreferenceStore.changeError=Error notifying a preference change listener. Check the log for details.
-FontRegistry.changeError=Error notifying a font registry change listener. Check the log for details.
-		
-##############################################################
-# Abort Page Flipping Dialog
-##############################################################
-AbortPageFlippingDialog.title=Could Not Accept Changes 
-AbortPageFlippingDialog.message=The currently displayed page contains invalid values.
-
-##############################################################
-# Field editors
-##############################################################
-StringFieldEditor.errorMessage=Field contains an invalid value
-IntegerFieldEditor.errorMessage=Value must be an Integer
-IntegerFieldEditor.errorMessageRange=Value must be an Integer between {0} and {1}
-FileFieldEditor.errorMessage=Value must be an existing file
-FileFieldEditor.errorMessage2=Value must be an absolute path
-DirectoryFieldEditor.errorMessage=Value must be an existing directory
-ListEditor.add = Ne&w...
-ListEditor.remove = &Remove
-ListEditor.up = &Up
-ListEditor.down = Dow&n
-
-##############################################################
-# Error messages for TextViewer
-##############################################################
-TextViewer.invalidRangeArg=Invalid range argument
-TextViewer.invalidVisibleRegionArg=Invalid visible region argument
-
-#############################################################
-# org.eclipse.jface.action 
-#############################################################
-Cancel_Current_Operation = Cancel Current Operation
-Set_SubTask = {0}: {1}
-Toolbar_Tooltip_Accelerator = {0} ({1})
-
-#############################################################
-# org.eclipse.jface.dialog
-############################################################
-Problem_Occurred = Problem Occurred
-Reason = {0}\n\nReason:\n{1}
-MessageDialogWithToggle.defaultToggleMessage = &Remember my decision
-PopupDialog.resize = &Resize
-PopupDialog.move = &Move
-PopupDialog.persistBounds = R&emember Size and Location
-PopupDialog.persistSize = Remember Si&ze
-PopupDialog.persistLocation = Remember &Location
-PopupDialog.menuTooltip = Menu
-
-############################################################
-
-Image_not_found = Image not found
-<empty_selection> = <empty selection>
-
-########################################################
-# Font properties labels for displaying a font
-#######################################################
-BoldItalicFont = bold italic
-BoldFont = bold
-ItalicFont = italic
-RegularFont = regular
-
-#############################################################
-# String representations of keys for Status line messages
-############################################################
-Ctrl = Ctrl
-Command = Command
-Alt = Alt
-Shift = Shift
-Backspace = Backspace
-Tab = Tab
-Return = Return
-Enter = Enter
-Escape = Escape
-Esc = Esc
-Delete = Delete
-Space = Space
-Arrow_Up = Arrow Up
-Arrow_Down = Arrow Down
-Arrow_Left = Arrow Left
-Arrow_Right = Arrow Right
-Page_Up = Page Up
-Page_Down = Page Down
-Home = Home
-End = End
-Insert = Insert
-F1 = F1
-F2 = F2
-F3 = F3
-F4 = F4
-F5 = F5
-F6 = F6
-F7 = F7
-F8 = F8
-F9 = F9
-F10 = F10
-F11 = F11
-F12 = F12
-
-##############################################
-# Safe Runnable
-##############################################
-SafeRunnable.errorMessage = An error has occurred. See error log for more details.
-ColorSelector.Name=Color Selector
-
-#############################################################
-# org.eclipse.jface.viewers.deferred 
-#############################################################
-Sorting = sorting
-
-
-#############################################################
-# org.eclipse.jface.util 
-#############################################################
-LocalSelectionTransfer.errorMessage=Received wrong transfer data. 
-
-#############################################################
-# org.eclipse.jface.fieldAssist
-#############################################################
-FieldDecorationRegistry.errorMessage=Error in field content
-FieldDecorationRegistry.contentAssistMessage=Content Assist Available 
-FieldDecorationRegistry.requiredFieldMessage=Required Field
-FieldDecorationRegistry.errorQuickFixMessage=Error in field content.  Quick Fix Available.
-
-###############################################################
-# org.eclipse.jface.util.SafeRunnableDialog
-#############################################################
-SafeRunnableDialog_reason=Reason
-SafeRunnableDialog_checkDetailsMessage=Check the details
-SafeRunnableDialog_MultipleErrorsTitle=Multiple Errors have Occurred
-SafeRunnableDialog_MultipleErrorsMessage=Multiple operations have reported errors. Select an error to view its details.
-
-#############################################################
-# org.eclipse.jface.internal.ConfigureColumnsDialog
-#############################################################
-ConfigureColumnsDialog_Title=Configure Columns
-ConfigureColumnsDialog_WidthOfSelectedColumn=&Width of selected column:
-ConfigureColumnsDialog_up = &Up
-ConfigureColumnsDialog_down = &Down
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/AccumulatingProgressMonitor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/AccumulatingProgressMonitor.java
deleted file mode 100644
index 63f6554..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/AccumulatingProgressMonitor.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.operation;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IProgressMonitorWithBlocking;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ProgressMonitorWrapper;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * A progress monitor that accumulates <code>worked</code> and <code>subtask</code> 
- * calls in the following way by wrapping a standard progress monitor:
- * <ul>
- * <li> When a <code>worked</code> or <code>subtask</code> call occurs the first time,
- *		the progress monitor posts a runnable into the asynchronous SWT event queue.
- * </li>
- * <li> Subsequent calls to <code>worked</code> or <code>subtask</code> do not post
- *		a new runnable as long as a previous runnable still exists in the SWT event
- *		queue. In this case, the progress monitor just updates the internal state of
- *		the runnable that waits in the SWT event queue for its execution. If no runnable
- *		exists, a new one is created and posted into the event queue.
- * </ul>
- * <p>
- * This class is internal to the framework; clients outside JFace should not
- * use this class.
- * </p>
- */
-/* package */class AccumulatingProgressMonitor extends ProgressMonitorWrapper {
-
-    /**
-     * The display.
-     */
-    private Display display;
-
-    /**
-     * The collector, or <code>null</code> if none.
-     */
-    private Collector collector;
-
-    private String currentTask = ""; //$NON-NLS-1$
-
-    private class Collector implements Runnable {
-        private String subTask;
-
-        private double worked;
-
-        private IProgressMonitor monitor;
-
-        /**
-         * Create a new collector.
-         * @param subTask
-         * @param work
-         * @param monitor
-         */
-        public Collector(String subTask, double work, IProgressMonitor monitor) {
-            this.subTask = subTask;
-            this.worked = work;
-            this.monitor = monitor;
-        }
-
-        /**
-         * Add worked to the work.
-         * @param workedIncrement
-         */
-        public void worked(double workedIncrement) {
-            this.worked = this.worked + workedIncrement;
-        }
-
-        /**
-         * Set the subTask name.
-         * @param subTaskName
-         */
-        public void subTask(String subTaskName) {
-            this.subTask = subTaskName;
-        }
-
-        /**
-         * Run the collector.
-         */
-        public void run() {
-            clearCollector(this);
-            if (subTask != null) {
-				monitor.subTask(subTask);
-			}
-            if (worked > 0) {
-				monitor.internalWorked(worked);
-			}
-        }
-    }
-
-    /**
-     * Creates an accumulating progress monitor wrapping the given one
-     * that uses the given display.
-     * 
-     * @param monitor the actual progress monitor to be wrapped
-     * @param display the SWT display used to forward the calls 
-     *  to the wrapped progress monitor
-     */
-    public AccumulatingProgressMonitor(IProgressMonitor monitor, Display display) {
-        super(monitor);
-        Assert.isNotNull(display);
-        this.display = display;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IProgressMonitor.
-     */
-    public void beginTask(final String name, final int totalWork) {
-        synchronized (this) {
-            collector = null;
-        }
-        display.asyncExec(new Runnable() {
-            public void run() {
-                currentTask = name;
-                getWrappedProgressMonitor().beginTask(name, totalWork);
-            }
-        });
-    }
-
-    /**
-     * Clears the collector object used to accumulate work and subtask calls
-     * if it matches the given one.
-     * @param collectorToClear
-     */
-    private synchronized void clearCollector(Collector collectorToClear) {
-        // Check if the accumulator is still using the given collector.
-        // If not, don't clear it.
-        if (this.collector == collectorToClear) {
-			this.collector = null;
-		}
-    }
-
-    /**
-     *  Creates a collector object to accumulate work and subtask calls.
-     * @param subTask
-     * @param work
-     */
-    private void createCollector(String subTask, double work) {
-        collector = new Collector(subTask, work, getWrappedProgressMonitor());
-        display.asyncExec(collector);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IProgressMonitor.
-     */
-    public void done() {
-        synchronized (this) {
-            collector = null;
-        }
-        display.asyncExec(new Runnable() {
-            public void run() {
-                getWrappedProgressMonitor().done();
-            }
-        });
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IProgressMonitor.
-     */
-    public synchronized void internalWorked(final double work) {
-        if (collector == null) {
-            createCollector(null, work);
-        } else {
-            collector.worked(work);
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IProgressMonitor.
-     */
-    public void setTaskName(final String name) {
-        synchronized (this) {
-            collector = null;
-        }
-        display.asyncExec(new Runnable() {
-            public void run() {
-                currentTask = name;
-                getWrappedProgressMonitor().setTaskName(name);
-            }
-        });
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IProgressMonitor.
-     */
-    public synchronized void subTask(final String name) {
-        if (collector == null) {
-            createCollector(name, 0);
-        } else {
-            collector.subTask(name);
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IProgressMonitor.
-     */
-    public synchronized void worked(int work) {
-        internalWorked(work);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.ProgressMonitorWrapper#clearBlocked()
-     */
-    public void clearBlocked() {
-
-        //If this is a monitor that can report blocking do so.
-        //Don't bother with a collector as this should only ever
-        //happen once and prevent any more progress.
-        final IProgressMonitor pm = getWrappedProgressMonitor();
-        if (!(pm instanceof IProgressMonitorWithBlocking)) {
-			return;
-		}
-
-        display.asyncExec(new Runnable() {
-            /* (non-Javadoc)
-             * @see java.lang.Runnable#run()
-             */
-            public void run() {
-                ((IProgressMonitorWithBlocking) pm).clearBlocked();
-                Dialog.getBlockedHandler().clearBlocked();
-            }
-        });
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.ProgressMonitorWrapper#setBlocked(org.eclipse.core.runtime.IStatus)
-     */
-    public void setBlocked(final IStatus reason) {
-        //If this is a monitor that can report blocking do so.
-        //Don't bother with a collector as this should only ever
-        //happen once and prevent any more progress.
-        final IProgressMonitor pm = getWrappedProgressMonitor();
-        if (!(pm instanceof IProgressMonitorWithBlocking)) {
-			return;
-		}
-
-        display.asyncExec(new Runnable() {
-            /* (non-Javadoc)
-             * @see java.lang.Runnable#run()
-             */
-            public void run() {
-                ((IProgressMonitorWithBlocking) pm).setBlocked(reason);
-                //Do not give a shell as we want it to block until it opens.
-                Dialog.getBlockedHandler().showBlocked(pm, reason, currentTask);
-            }
-        });
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/IRunnableContext.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/IRunnableContext.java
deleted file mode 100644
index 9dee304..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/IRunnableContext.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.operation;
-
-import java.lang.reflect.InvocationTargetException;
-
-/**
- * Interface for UI components which can execute a long-running operation
- * in the form of an <code>IRunnableWithProgress</code>.
- * The context is responsible for displaying a progress indicator and Cancel
- * button to the end user while the operation is in progress; the context
- * supplies a progress monitor to be used from code running inside the operation.
- * Note that an <code>IRunnableContext</code> is not a runnable itself.
- * <p>
- * For examples of UI components which implement this interface,
- * see <code>ApplicationWindow</code>, <code>ProgressMonitorDialog</code>,
- * and <code>WizardDialog</code>.
- * </p>
- *
- * @see IRunnableWithProgress
- * @see org.eclipse.jface.window.ApplicationWindow
- * @see org.eclipse.jface.dialogs.ProgressMonitorDialog
- * @see org.eclipse.jface.wizard.WizardDialog
- */
-public interface IRunnableContext {
-    /**
-     * <p>
-     * Runs the given <code>IRunnableWithProgress</code> in this context.
-     * For example, if this is a <code>ProgressMonitorDialog</code> then the runnable
-     * is run using this dialog's progress monitor.
-     * </p>
-     * <p>
-     * If <code>fork</code> is <code>false</code>, the current thread is used
-     * to run the runnable. Note that if <code>fork</code> is <code>true</code>,
-     * it is unspecified whether or not this method blocks until the runnable
-     * has been run. Implementers should document whether the runnable is run
-     * synchronously (blocking) or asynchronously (non-blocking), or if no
-     * assumption can be made about the blocking behaviour.
-     * </p>
-     *
-     * @param fork <code>true</code> if the runnable should be run in a separate thread,
-     *  and <code>false</code> to run in the same thread
-     * @param cancelable <code>true</code> to enable the cancelation, and
-     *  <code>false</code> to make the operation uncancellable
-     * @param runnable the runnable to run
-     *
-     * @exception InvocationTargetException wraps any exception or error which occurs 
-     *  while running the runnable
-     * @exception InterruptedException propagated by the context if the runnable 
-     *  acknowledges cancelation by throwing this exception.  This should not be thrown
-     *  if cancelable is <code>false</code>.
-     */
-    public void run(boolean fork, boolean cancelable,
-            IRunnableWithProgress runnable) throws InvocationTargetException,
-            InterruptedException;
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/IRunnableWithProgress.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/IRunnableWithProgress.java
deleted file mode 100644
index e3ae65d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/IRunnableWithProgress.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.operation;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * The <code>IRunnableWithProgress</code> interface should be implemented by any
- * class whose instances are intended to be executed as a long-running operation.
- * Long-running operations are typically presented at the UI via a modal dialog
- * showing a progress indicator and a Cancel button.
- * The class must define a <code>run</code> method that takes a progress monitor.
- * The <code>run</code> method is usually not invoked directly, but rather by
- * passing the <code>IRunnableWithProgress</code> to the <code>run</code> method of
- * an <code>IRunnableContext</code>, which provides the UI for the progress monitor
- * and Cancel button.
- *
- * @see IRunnableContext
- */
-public interface IRunnableWithProgress {
-    /**
-     * Runs this operation.  Progress should be reported to the given progress monitor.
-     * This method is usually invoked by an <code>IRunnableContext</code>'s <code>run</code> method,
-     * which supplies the progress monitor.
-     * A request to cancel the operation should be honored and acknowledged 
-     * by throwing <code>InterruptedException</code>.
-     *
-     * @param monitor the progress monitor to use to display progress and receive
-     *   requests for cancelation
-     * @exception InvocationTargetException if the run method must propagate a checked exception,
-     * 	it should wrap it inside an <code>InvocationTargetException</code>; runtime exceptions are automatically
-     *  wrapped in an <code>InvocationTargetException</code> by the calling context
-     * @exception InterruptedException if the operation detects a request to cancel, 
-     *  using <code>IProgressMonitor.isCanceled()</code>, it should exit by throwing 
-     *  <code>InterruptedException</code>
-     *
-     * @see IRunnableContext#run
-     */
-    public void run(IProgressMonitor monitor) throws InvocationTargetException,
-            InterruptedException;
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/IThreadListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/IThreadListener.java
deleted file mode 100644
index ee9ba64..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/IThreadListener.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.operation;
-
-/**
- * A thread listener is an object that is interested in receiving notifications
- * of thread changes.  For example, a thread listener can be used to notify a 
- * runnable of the thread that will execute it, allowing the runnable to transfer
- * thread-local state from the calling thread before control passes to the new thread.
- * 
- * @since 3.1
- */
-public interface IThreadListener {
-	/**
-	 * Notification that a thread change is occurring.
-	 * 
-	 * @param thread The new thread
-	 */
-	public void threadChange(Thread thread);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/ModalContext.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/ModalContext.java
deleted file mode 100644
index f8b54a5..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/ModalContext.java
+++ /dev/null
@@ -1,505 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.operation;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.ProgressMonitorWrapper;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Utility class for supporting modal operations. The runnable passed to the
- * <code>run</code> method is executed in a separate thread, depending on the
- * value of the passed fork argument. If the runnable is executed in a separate
- * thread then the current thread either waits until the new thread ends or, if
- * the current thread is the UI thread, it polls the SWT event queue and
- * dispatches each event.
- * <p>
- * This class is not intended to be subclassed.
- * </p>
- * @noinstantiate This class is not intended to be instantiated by clients.
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ModalContext {
-
-	/**
-	 * Indicated whether ModalContext is in debug mode; <code>false</code> by
-	 * default.
-	 */
-	private static boolean debug = false;
-
-	/**
-	 * The number of nested modal runs, or 0 if not inside a modal run. This is
-	 * global state.
-	 */
-	private static int modalLevel = 0;
-
-	/**
-	 * Indicates whether operations should be run in a separate thread. Defaults
-	 * to true. For internal debugging use, set to false to run operations in
-	 * the calling thread.
-	 */
-	private static boolean runInSeparateThread = true;
-
-	/**
-	 * Thread which runs the modal context.
-	 */
-	private static class ModalContextThread extends Thread {
-		/**
-		 * The operation to be run.
-		 */
-		private IRunnableWithProgress runnable;
-
-		/**
-		 * The exception thrown by the operation starter.
-		 */
-		private Throwable throwable;
-
-		/**
-		 * The progress monitor used for progress and cancelation.
-		 */
-		private IProgressMonitor progressMonitor;
-
-		/**
-		 * The display used for event dispatching.
-		 */
-		private Display display;
-
-		/**
-		 * Indicates whether to continue event queue dispatching.
-		 */
-		private volatile boolean continueEventDispatching = true;
-
-		/**
-		 * The thread that forked this modal context thread.
-		 * 
-		 * @since 3.1
-		 */
-		private Thread callingThread;
-
-		/**
-		 * Creates a new modal context.
-		 * 
-		 * @param operation
-		 *            the runnable to run
-		 * @param monitor
-		 *            the progress monitor to use to display progress and
-		 *            receive requests for cancelation
-		 * @param display
-		 *            the display to be used to read and dispatch events
-		 */
-		private ModalContextThread(IRunnableWithProgress operation,
-				IProgressMonitor monitor, Display display) {
-			super("ModalContext"); //$NON-NLS-1$
-			Assert.isTrue(monitor != null && display != null);
-			runnable = operation;
-			progressMonitor = new AccumulatingProgressMonitor(monitor, display);
-			this.display = display;
-			this.callingThread = Thread.currentThread();
-		}
-
-		/*
-		 * (non-Javadoc) Method declared on Thread.
-		 */
-		public void run() {
-			try {
-				if (runnable != null) {
-					runnable.run(progressMonitor);
-				}
-			} catch (InvocationTargetException e) {
-				throwable = e;
-			} catch (InterruptedException e) {
-				throwable = e;
-			} catch (RuntimeException e) {
-				throwable = e;
-			} catch (ThreadDeath e) {
-				// Make sure to propagate ThreadDeath, or threads will never
-				// fully terminate
-				throw e;
-			} catch (Error e) {
-				throwable = e;
-			} finally {
-				// notify the operation of change of thread of control
-				if (runnable instanceof IThreadListener) {
-					Throwable exception = 
-						invokeThreadListener(((IThreadListener) runnable), callingThread);
-					
-					//Forward it if we don't already have one
-					if(exception != null && throwable == null)
-						throwable = exception;
-				}
-
-				// Make sure that all events in the asynchronous event queue
-				// are dispatched.
-				display.syncExec(new Runnable() {
-					public void run() {
-						// do nothing
-					}
-				});
-
-				// Stop event dispatching
-				continueEventDispatching = false;
-
-				// Force the event loop to return from sleep () so that
-				// it stops event dispatching.
-				display.asyncExec(null);
-			}
-		}
-
-		/**
-		 * Processes events or waits until this modal context thread terminates.
-		 */
-		public void block() {
-			if (display == Display.getCurrent()) {
-				int exceptionCount = 0;
-				while (continueEventDispatching) {
-					// Run the event loop. Handle any uncaught exceptions caused
-					// by UI events.
-					try {
-						if (!display.readAndDispatch()) {
-							display.sleep();
-						}
-						exceptionCount = 0;
-					}
-					// ThreadDeath is a normal error when the thread is dying.
-					// We must
-					// propagate it in order for it to properly terminate.
-					catch (ThreadDeath e) {
-						throw (e);
-					}
-					// For all other exceptions, log the problem.
-					catch (Throwable t) {
-						exceptionCount++;
-						if (exceptionCount > 2 || display.isDisposed()) {
-			                if (t instanceof RuntimeException) {
-								throw (RuntimeException) t;
-							} else if (t instanceof Error) {
-								throw (Error) t;
-							} else {
-								throw new RuntimeException(t);
-							}
-						}
-						Policy
-								.getLog()
-								.log(
-										new Status(
-												IStatus.ERROR,
-												Policy.JFACE,
-												"Unhandled event loop exception during blocked modal context.",//$NON-NLS-1$
-												t));
-					}
-				}
-			} else {
-				try {
-					join();
-				} catch (InterruptedException e) {
-					throwable = e;
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns whether the first progress monitor is the same as, or a wrapper
-	 * around, the second progress monitor.
-	 * 
-	 * @param monitor1
-	 *            the first progress monitor
-	 * @param monitor2
-	 *            the second progress monitor
-	 * @return <code>true</code> if the first is the same as, or a wrapper
-	 *         around, the second
-	 * @see ProgressMonitorWrapper
-	 */
-	public static boolean canProgressMonitorBeUsed(IProgressMonitor monitor1,
-			IProgressMonitor monitor2) {
-		if (monitor1 == monitor2) {
-			return true;
-		}
-
-		while (monitor1 instanceof ProgressMonitorWrapper) {
-			monitor1 = ((ProgressMonitorWrapper) monitor1)
-					.getWrappedProgressMonitor();
-			if (monitor1 == monitor2) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Checks with the given progress monitor and throws
-	 * <code>InterruptedException</code> if it has been canceled.
-	 * <p>
-	 * Code in a long-running operation should call this method regularly so
-	 * that a request to cancel will be honored.
-	 * </p>
-	 * <p>
-	 * Convenience for:
-	 * 
-	 * <pre>
-	 * if (monitor.isCanceled())
-	 * 	throw new InterruptedException();
-	 * </pre>
-	 * 
-	 * </p>
-	 * 
-	 * @param monitor
-	 *            the progress monitor
-	 * @exception InterruptedException
-	 *                if cancelling the operation has been requested
-	 * @see IProgressMonitor#isCanceled()
-	 */
-	public static void checkCanceled(IProgressMonitor monitor)
-			throws InterruptedException {
-		if (monitor.isCanceled()) {
-			throw new InterruptedException();
-		}
-	}
-
-	/**
-	 * Returns the currently active modal context thread, or null if no modal
-	 * context is active.
-	 */
-	private static ModalContextThread getCurrentModalContextThread() {
-		Thread t = Thread.currentThread();
-		if (t instanceof ModalContextThread) {
-			return (ModalContextThread) t;
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the modal nesting level.
-	 * <p>
-	 * The modal nesting level increases by one each time the
-	 * <code>ModalContext.run</code> method is called within the dynamic scope
-	 * of another call to <code>ModalContext.run</code>.
-	 * </p>
-	 * 
-	 * @return the modal nesting level, or <code>0</code> if this method is
-	 *         called outside the dynamic scope of any invocation of
-	 *         <code>ModalContext.run</code>
-	 */
-	public static int getModalLevel() {
-		return modalLevel;
-	}
-
-	/**
-	 * Returns whether the given thread is running a modal context.
-	 * 
-	 * @param thread
-	 *            The thread to be checked
-	 * @return <code>true</code> if the given thread is running a modal
-	 *         context, <code>false</code> if not
-	 */
-	public static boolean isModalContextThread(Thread thread) {
-		return thread instanceof ModalContextThread;
-	}
-
-	/**
-	 * Runs the given runnable in a modal context, passing it a progress
-	 * monitor.
-	 * <p>
-	 * The modal nesting level is increased by one from the perspective of the
-	 * given runnable.
-	 * </p>
-	 * <p>
-	 * If the supplied operation implements <code>IThreadListener</code>, it
-	 * will be notified of any thread changes required to execute the operation.
-	 * Specifically, the operation will be notified of the thread that will call
-	 * its <code>run</code> method before it is called, and will be notified
-	 * of the change of control back to the thread calling this method when the
-	 * operation completes. These thread change notifications give the operation
-	 * an opportunity to transfer any thread-local state to the execution thread
-	 * before control is transferred to the new thread.
-	 * </p>
-	 * 
-	 * @param operation
-	 *            the runnable to run
-	 * @param fork
-	 *            <code>true</code> if the runnable should run in a separate
-	 *            thread, and <code>false</code> if in the same thread
-	 * @param monitor
-	 *            the progress monitor to use to display progress and receive
-	 *            requests for cancelation
-	 * @param display
-	 *            the display to be used to read and dispatch events
-	 * @exception InvocationTargetException
-	 *                if the run method must propagate a checked exception, it
-	 *                should wrap it inside an
-	 *                <code>InvocationTargetException</code>; runtime
-	 *                exceptions and errors are automatically wrapped in an
-	 *                <code>InvocationTargetException</code> by this method
-	 * @exception InterruptedException
-	 *                if the operation detects a request to cancel, using
-	 *                <code>IProgressMonitor.isCanceled()</code>, it should
-	 *                exit by throwing <code>InterruptedException</code>;
-	 *                this method propagates the exception
-	 */
-	public static void run(IRunnableWithProgress operation, boolean fork,
-			IProgressMonitor monitor, Display display)
-			throws InvocationTargetException, InterruptedException {
-		Assert.isTrue(operation != null && monitor != null);
-
-		modalLevel++;
-		try {
-			if (monitor != null) {
-				monitor.setCanceled(false);
-			}
-			// Is the runnable supposed to be execute in the same thread.
-			if (!fork || !runInSeparateThread) {
-				runInCurrentThread(operation, monitor);
-			} else {
-				ModalContextThread t = getCurrentModalContextThread();
-				if (t != null) {
-					Assert.isTrue(canProgressMonitorBeUsed(monitor,
-							t.progressMonitor));
-					runInCurrentThread(operation, monitor);
-				} else {
-					t = new ModalContextThread(operation, monitor, display);
-					Throwable listenerException = null;
-					if (operation instanceof IThreadListener) {
-						listenerException = invokeThreadListener((IThreadListener) operation, t);
-					}
-					
-					if(listenerException == null){
-						t.start();
-						t.block();
-					}
-					else {
-						if(t.throwable == null)
-							t.throwable = listenerException;
-					}
-					Throwable throwable = t.throwable;
-					if (throwable != null) {
-						if (debug
-								&& !(throwable instanceof InterruptedException)
-								&& !(throwable instanceof OperationCanceledException)) {
-							System.err
-									.println("Exception in modal context operation:"); //$NON-NLS-1$
-							throwable.printStackTrace();
-							System.err.println("Called from:"); //$NON-NLS-1$
-							// Don't create the InvocationTargetException on the
-							// throwable,
-							// otherwise it will print its stack trace (from the
-							// other thread).
-							new InvocationTargetException(null)
-									.printStackTrace();
-						}
-						if (throwable instanceof InvocationTargetException) {
-							throw (InvocationTargetException) throwable;
-						} else if (throwable instanceof InterruptedException) {
-							throw (InterruptedException) throwable;
-						} else if (throwable instanceof OperationCanceledException) {
-							// See 1GAN3L5: ITPUI:WIN2000 - ModalContext
-							// converts OperationCancelException into
-							// InvocationTargetException
-							throw new InterruptedException(throwable
-									.getMessage());
-						} else {
-							throw new InvocationTargetException(throwable);
-						}
-					}
-				}
-			}
-		} finally {
-			modalLevel--;
-		}
-	}
-
-	/**
-	 * Invoke the ThreadListener if there are any errors or RuntimeExceptions
-	 * return them.
-	 * 
-	 * @param listener
-	 * @param switchingThread
-	 *            the {@link Thread} being switched to
-	 */
-	static Throwable invokeThreadListener(IThreadListener listener,
-			Thread switchingThread) {
-		try {
-			listener.threadChange(switchingThread);
-		} catch (ThreadDeath e) {
-			// Make sure to propagate ThreadDeath, or threads will never
-			// fully terminate
-			throw e;
-		} catch (Error e) {
-			return e;
-		}catch (RuntimeException e) {
-			return e;
-		}
-		return null;
-	}
-
-	/**
-	 * Run a runnable. Convert all thrown exceptions to either
-	 * InterruptedException or InvocationTargetException
-	 */
-	private static void runInCurrentThread(IRunnableWithProgress runnable,
-			IProgressMonitor progressMonitor) throws InterruptedException,
-			InvocationTargetException {
-		try {
-			if (runnable != null) {
-				runnable.run(progressMonitor);
-			}
-		} catch (InvocationTargetException e) {
-			throw e;
-		} catch (InterruptedException e) {
-			throw e;
-		} catch (OperationCanceledException e) {
-			throw new InterruptedException();
-		} catch (ThreadDeath e) {
-			// Make sure to propagate ThreadDeath, or threads will never fully
-			// terminate
-			throw e;
-		} catch (RuntimeException e) {
-			throw new InvocationTargetException(e);
-		} catch (Error e) {
-			throw new InvocationTargetException(e);
-		}
-	}
-
-	/**
-	 * Sets whether ModalContext is running in debug mode.
-	 * 
-	 * @param debugMode
-	 *            <code>true</code> for debug mode, and <code>false</code>
-	 *            for normal mode (the default)
-	 */
-	public static void setDebugMode(boolean debugMode) {
-		debug = debugMode;
-	}
-
-	/**
-	 * Sets whether ModalContext may process events (by calling
-	 * <code>Display.readAndDispatch()</code>) while running operations. By
-	 * default, ModalContext will process events while running operations. Use
-	 * this method to disallow event processing temporarily.
-	 * 
-	 * @param allowReadAndDispatch
-	 *            <code>true</code> (the default) if events may be processed
-	 *            while running an operation, <code>false</code> if
-	 *            Display.readAndDispatch() should not be called from
-	 *            ModalContext.
-	 * @since 3.2
-	 */
-	public static void setAllowReadAndDispatch(boolean allowReadAndDispatch) {
-		// use a separate thread if and only if it is OK to spin the event loop
-		runInSeparateThread = allowReadAndDispatch;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/package.html
deleted file mode 100644
index 1680896..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/operation/package.html
+++ /dev/null
@@ -1,26 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides JFace support for long-running operations.
-<h2>
-Package Specification</h2>
-Long-running operations must be dealt with specially in order to keep the
-UI helpful and responsive. Typically this involves temporarily disabling
-most controls and displaying a busy cursor and progress indicator; while
-the operation is in progress, the only requests that will be accepted will
-be ones to cancel the operation.
-<p>The <tt>IRunnableWithProgress</tt> interface should be implemented by
-any class whose instances are intended to be executed as long-running operations.
-These objects can then be run in any runnable context (<tt>IRunnableContext</tt>),
-including such standard JFace UI components as application windows (<tt>ApplicationWindow</tt>),
-wizard dialogs (<tt>WizardDialog</tt>), and progress monitor dialogs (<tt>ProgressMonitorDialog</tt>).
-The utility class <tt>ModalContext</tt> defines the basic mechanism and
-UI event loop for modal operations.
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/BooleanFieldEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/BooleanFieldEditor.java
deleted file mode 100644
index 8f6a73a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/BooleanFieldEditor.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * A field editor for a boolean type preference.
- */
-public class BooleanFieldEditor extends FieldEditor {
-
-    /**
-     * Style constant (value <code>0</code>) indicating the default
-     * layout where the field editor's check box appears to the left
-     * of the label.
-     */
-    public static final int DEFAULT = 0;
-
-    /**
-     * Style constant (value <code>1</code>) indicating a layout 
-     * where the field editor's label appears on the left
-     * with a check box on the right.
-     */
-    public static final int SEPARATE_LABEL = 1;
-
-    /**
-     * Style bits. Either <code>DEFAULT</code> or
-     * <code>SEPARATE_LABEL</code>.
-     */
-    private int style;
-
-    /**
-     * The previously selected, or "before", value.
-     */
-    private boolean wasSelected;
-
-    /**
-     * The checkbox control, or <code>null</code> if none.
-     */
-    private Button checkBox = null;
-
-    /**
-     * Creates a new boolean field editor 
-     */
-    protected BooleanFieldEditor() {
-    }
-
-    /**
-     * Creates a boolean field editor in the given style.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param style the style, either <code>DEFAULT</code> or
-     *   <code>SEPARATE_LABEL</code>
-     * @param parent the parent of the field editor's control
-     * @see #DEFAULT
-     * @see #SEPARATE_LABEL
-     */
-    public BooleanFieldEditor(String name, String labelText, int style,
-            Composite parent) {
-        init(name, labelText);
-        this.style = style;
-        createControl(parent);
-    }
-
-    /**
-     * Creates a boolean field editor in the default style.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param label the label text of the field editor
-     * @param parent the parent of the field editor's control
-     */
-    public BooleanFieldEditor(String name, String label, Composite parent) {
-        this(name, label, DEFAULT, parent);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void adjustForNumColumns(int numColumns) {
-        if (style == SEPARATE_LABEL) {
-			numColumns--;
-		}
-        ((GridData) checkBox.getLayoutData()).horizontalSpan = numColumns;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doFillIntoGrid(Composite parent, int numColumns) {
-        String text = getLabelText();
-        switch (style) {
-        case SEPARATE_LABEL:
-            getLabelControl(parent);
-            numColumns--;
-            text = null;
-            //$FALL-THROUGH$
-		default:
-            checkBox = getChangeControl(parent);
-            GridData gd = new GridData();
-            gd.horizontalSpan = numColumns;
-            checkBox.setLayoutData(gd);
-            if (text != null) {
-				checkBox.setText(text);
-			}
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     * Loads the value from the preference store and sets it to
-     * the check box.
-     */
-    protected void doLoad() {
-        if (checkBox != null) {
-            boolean value = getPreferenceStore()
-                    .getBoolean(getPreferenceName());
-            checkBox.setSelection(value);
-            wasSelected = value;
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     * Loads the default value from the preference store and sets it to
-     * the check box.
-     */
-    protected void doLoadDefault() {
-        if (checkBox != null) {
-            boolean value = getPreferenceStore().getDefaultBoolean(
-                    getPreferenceName());
-            checkBox.setSelection(value);
-            wasSelected = value;
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doStore() {
-        getPreferenceStore().setValue(getPreferenceName(),
-                checkBox.getSelection());
-    }
-
-    /**
-     * Returns this field editor's current value.
-     *
-     * @return the value
-     */
-    public boolean getBooleanValue() {
-        return checkBox.getSelection();
-    }
-
-    /**
-     * Returns the change button for this field editor.
-     * @param parent The Composite to create the receiver in.
-     *
-     * @return the change button
-     */
-    protected Button getChangeControl(Composite parent) {
-        if (checkBox == null) {
-            checkBox = new Button(parent, SWT.CHECK | SWT.LEFT);
-            checkBox.setFont(parent.getFont());
-            checkBox.addSelectionListener(new SelectionAdapter() {
-                public void widgetSelected(SelectionEvent e) {
-                    boolean isSelected = checkBox.getSelection();
-                    valueChanged(wasSelected, isSelected);
-                    wasSelected = isSelected;
-                }
-            });
-            checkBox.addDisposeListener(new DisposeListener() {
-                public void widgetDisposed(DisposeEvent event) {
-                    checkBox = null;
-                }
-            });
-        } else {
-            checkParent(checkBox, parent);
-        }
-        return checkBox;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    public int getNumberOfControls() {
-        switch (style) {
-        case SEPARATE_LABEL:
-            return 2;
-        default:
-            return 1;
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    public void setFocus() {
-        if (checkBox != null) {
-            checkBox.setFocus();
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    public void setLabelText(String text) {
-        super.setLabelText(text);
-        Label label = getLabelControl();
-        if (label == null && checkBox != null) {
-            checkBox.setText(text);
-        }
-    }
-
-    /**
-     * Informs this field editor's listener, if it has one, about a change
-     * to the value (<code>VALUE</code> property) provided that the old and
-     * new values are different.
-     *
-     * @param oldValue the old value
-     * @param newValue the new value
-     */
-    protected void valueChanged(boolean oldValue, boolean newValue) {
-        setPresentsDefaultValue(false);
-        if (oldValue != newValue) {
-			fireStateChanged(VALUE, oldValue, newValue);
-		}
-    }
-
-    /*
-     * @see FieldEditor.setEnabled
-     */
-    public void setEnabled(boolean enabled, Composite parent) {
-        //Only call super if there is a label already
-        if (style == SEPARATE_LABEL) {
-			super.setEnabled(enabled, parent);
-		}
-        getChangeControl(parent).setEnabled(enabled);
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/BooleanPropertyAction.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/BooleanPropertyAction.java
deleted file mode 100644
index 9751ab8..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/BooleanPropertyAction.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.preference;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * The BooleanPropertyAction is an action that set the values of a 
- * boolean property in the preference store.
- */
-
-public class BooleanPropertyAction extends Action {
-
-    private IPreferenceStore preferenceStore;
-
-    private String property;
-
-    /**
-     * Create a new instance of the receiver.
-     * @param title The displayable name of the action.
-     * @param preferenceStore The preference store to propogate changes to
-     * @param property The property that is being updated
-     * @throws IllegalArgumentException Thrown if preferenceStore or
-     * property are <code>null</code>.
-     */
-    public BooleanPropertyAction(String title,
-            IPreferenceStore preferenceStore, String property)
-            throws IllegalArgumentException {
-        super(title, AS_CHECK_BOX);
-
-        if (preferenceStore == null || property == null) {
-			throw new IllegalArgumentException();
-		}
-
-        this.preferenceStore = preferenceStore;
-        this.property = property;
-        final String finalProprety = property;
-
-        preferenceStore
-                .addPropertyChangeListener(new IPropertyChangeListener() {
-                    public void propertyChange(PropertyChangeEvent event) {
-                        if (finalProprety.equals(event.getProperty())) {
-							setChecked(Boolean.TRUE.equals(event.getNewValue()));
-						}
-                    }
-                });
-
-        setChecked(preferenceStore.getBoolean(property));
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#run()
-     */
-    public void run() {
-        preferenceStore.setValue(property, isChecked());
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/ColorFieldEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/ColorFieldEditor.java
deleted file mode 100644
index 36ffcd4..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/ColorFieldEditor.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A field editor for a color type preference.
- */
-public class ColorFieldEditor extends FieldEditor {
-
-	/**
-	 * The color selector, or <code>null</code> if none.
-	 */
-	private ColorSelector colorSelector;
-
-	/**
-	 * Creates a new color field editor
-	 */
-	protected ColorFieldEditor() {
-		//No default behavior
-	}
-
-	/**
-	 * Creates a color field editor.
-	 * 
-	 * @param name
-	 *            the name of the preference this field editor works on
-	 * @param labelText
-	 *            the label text of the field editor
-	 * @param parent
-	 *            the parent of the field editor's control
-	 */
-	public ColorFieldEditor(String name, String labelText, Composite parent) {
-		super(name, labelText, parent);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on FieldEditor.
-	 */
-	protected void adjustForNumColumns(int numColumns) {
-		((GridData) colorSelector.getButton().getLayoutData()).horizontalSpan = numColumns - 1;
-	}
-
-	/**
-	 * Computes the size of the color image displayed on the button.
-	 * <p>
-	 * This is an internal method and should not be called by clients.
-	 * </p>
-	 * 
-	 * @param window
-	 *            the window to create a GC on for calculation.
-	 * @return Point The image size
-	 *  
-	 */
-	protected Point computeImageSize(Control window) {
-		// Make the image height as high as a corresponding character. This
-		// makes sure that the button has the same size as a "normal" text
-		// button.
-		GC gc = new GC(window);
-		Font f = JFaceResources.getFontRegistry().get(
-				JFaceResources.DEFAULT_FONT);
-		gc.setFont(f);
-		int height = gc.getFontMetrics().getHeight();
-		gc.dispose();
-		Point p = new Point(height * 3 - 6, height);
-		return p;
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.FieldEditor#doFillIntoGrid(org.eclipse.swt.widgets.Composite, int)
-	 */
-	protected void doFillIntoGrid(Composite parent, int numColumns) {
-		Control control = getLabelControl(parent);
-		GridData gd = new GridData();
-		gd.horizontalSpan = numColumns - 1;
-		control.setLayoutData(gd);
-
-		Button colorButton = getChangeControl(parent);
-		colorButton.setLayoutData(new GridData());
-		
-	}
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.FieldEditor#doLoad()
-	 */
-	protected void doLoad() {
-		if (colorSelector == null) {
-			return;
-		}
-		colorSelector.setColorValue(PreferenceConverter.getColor(
-				getPreferenceStore(), getPreferenceName()));
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on FieldEditor.
-	 */
-	protected void doLoadDefault() {
-		if (colorSelector == null) {
-			return;
-		}
-		colorSelector.setColorValue(PreferenceConverter.getDefaultColor(
-				getPreferenceStore(), getPreferenceName()));
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on FieldEditor.
-	 */
-	protected void doStore() {
-		PreferenceConverter.setValue(getPreferenceStore(), getPreferenceName(),
-				colorSelector.getColorValue());
-	}
-
-	/**
-	 * Get the color selector used by the receiver.
-	 * 
-	 * @return ColorSelector/
-	 */
-	public ColorSelector getColorSelector() {
-		return colorSelector;
-	}
-
-	/**
-	 * Returns the change button for this field editor.
-	 * 
-	 * @param parent
-	 *            The control to create the button in if required.
-	 * @return the change button
-	 */
-	protected Button getChangeControl(Composite parent) {
-		if (colorSelector == null) {
-			colorSelector = new ColorSelector(parent);
-			colorSelector.addListener(new IPropertyChangeListener() {
-				// forward the property change of the color selector
-				public void propertyChange(PropertyChangeEvent event) {
-					ColorFieldEditor.this.fireValueChanged(event.getProperty(),
-							event.getOldValue(), event.getNewValue());
-					setPresentsDefaultValue(false);
-				}
-			});
-
-		} else {
-			checkParent(colorSelector.getButton(), parent);
-		}
-		return colorSelector.getButton();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on FieldEditor.
-	 */
-	public int getNumberOfControls() {
-		return 2;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.FieldEditor#setEnabled(boolean,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void setEnabled(boolean enabled, Composite parent) {
-		super.setEnabled(enabled, parent);
-		getChangeControl(parent).setEnabled(enabled);
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/ColorSelector.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/ColorSelector.java
deleted file mode 100644
index 45daaec..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/ColorSelector.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.core.commands.common.EventManager;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.ColorDialog;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * The <code>ColorSelector</code> is a wrapper for a button that displays a
- * selected <code>Color</code> and allows the user to change the selection.
- */
-public class ColorSelector extends EventManager {
-    /**
-     * Property name that signifies the selected color of this
-     * <code>ColorSelector</code> has changed.
-     * 
-     * @since 3.0
-     */
-    public static final String PROP_COLORCHANGE = "colorValue"; //$NON-NLS-1$
-
-    private Button fButton;
-
-    private Color fColor;
-
-    private RGB fColorValue;
-
-    private Point fExtent;
-
-    private Image fImage;
-
-    /**
-     * Create a new instance of the reciever and the button that it wrappers in
-     * the supplied parent <code>Composite</code>.
-     * 
-     * @param parent
-     *            The parent of the button.
-     */
-    public ColorSelector(Composite parent) {
-        fButton = new Button(parent, SWT.PUSH);
-        fExtent = computeImageSize(parent);
-        fImage = new Image(parent.getDisplay(), fExtent.x, fExtent.y);
-        GC gc = new GC(fImage);
-        gc.setBackground(fButton.getBackground());
-        gc.fillRectangle(0, 0, fExtent.x, fExtent.y);
-        gc.dispose();
-        fButton.setImage(fImage);
-        fButton.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent event) {
-                open();
-            }
-        });
-        fButton.addDisposeListener(new DisposeListener() {
-            public void widgetDisposed(DisposeEvent event) {
-                if (fImage != null) {
-                    fImage.dispose();
-                    fImage = null;
-                }
-                if (fColor != null) {
-                    fColor.dispose();
-                    fColor = null;
-                }
-            }
-        });
-        fButton.getAccessible().addAccessibleListener(new AccessibleAdapter() {
-            /*
-             * (non-Javadoc)
-             * 
-             * @see org.eclipse.swt.accessibility.AccessibleAdapter#getName(org.eclipse.swt.accessibility.AccessibleEvent)
-             */
-            public void getName(AccessibleEvent e) {
-                e.result = JFaceResources.getString("ColorSelector.Name"); //$NON-NLS-1$
-            }
-        });
-    }
-
-    /**
-     * Adds a property change listener to this <code>ColorSelector</code>.
-     * Events are fired when the color in the control changes via the user
-     * clicking an selecting a new one in the color dialog. No event is fired in
-     * the case where <code>setColorValue(RGB)</code> is invoked.
-     * 
-     * @param listener
-     *            a property change listener
-     * @since 3.0
-     */
-    public void addListener(IPropertyChangeListener listener) {
-        addListenerObject(listener);
-    }
-
-    /**
-     * Compute the size of the image to be displayed.
-     * 
-     * @param window -
-     *            the window used to calculate
-     * @return <code>Point</code>
-     */
-    private Point computeImageSize(Control window) {
-        GC gc = new GC(window);
-        Font f = JFaceResources.getFontRegistry().get(
-                JFaceResources.DIALOG_FONT);
-        gc.setFont(f);
-        int height = gc.getFontMetrics().getHeight();
-        gc.dispose();
-        Point p = new Point(height * 3 - 6, height);
-        return p;
-    }
-
-    /**
-     * Get the button control being wrappered by the selector.
-     * 
-     * @return <code>Button</code>
-     */
-    public Button getButton() {
-        return fButton;
-    }
-
-    /**
-     * Return the currently displayed color.
-     * 
-     * @return <code>RGB</code>
-     */
-    public RGB getColorValue() {
-        return fColorValue;
-    }
-
-    /**
-     * Removes the given listener from this <code>ColorSelector</code>. Has
-     * no affect if the listener is not registered.
-     * 
-     * @param listener
-     *            a property change listener
-     * @since 3.0
-     */
-    public void removeListener(IPropertyChangeListener listener) {
-        removeListenerObject(listener);
-    }
-
-    /**
-     * Set the current color value and update the control.
-     * 
-     * @param rgb
-     *            The new color.
-     */
-    public void setColorValue(RGB rgb) {
-        fColorValue = rgb;
-        updateColorImage();
-    }
-
-    /**
-     * Set whether or not the button is enabled.
-     * 
-     * @param state
-     *            the enabled state.
-     */
-    public void setEnabled(boolean state) {
-        getButton().setEnabled(state);
-    }
-
-    /**
-     * Update the image being displayed on the button using the current color
-     * setting.
-     */
-    protected void updateColorImage() {
-        Display display = fButton.getDisplay();
-        GC gc = new GC(fImage);
-        gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
-        gc.drawRectangle(0, 2, fExtent.x - 1, fExtent.y - 4);
-        if (fColor != null) {
-			fColor.dispose();
-		}
-        fColor = new Color(display, fColorValue);
-        gc.setBackground(fColor);
-        gc.fillRectangle(1, 3, fExtent.x - 2, fExtent.y - 5);
-        gc.dispose();
-        fButton.setImage(fImage);
-    }
-
-    /**
-	 * Activate the editor for this selector. This causes the color selection
-	 * dialog to appear and wait for user input.
-	 * 
-	 * @since 3.2
-	 */
-	public void open() {
-		ColorDialog colorDialog = new ColorDialog(fButton.getShell());
-		colorDialog.setRGB(fColorValue);
-		RGB newColor = colorDialog.open();
-		if (newColor != null) {
-		    RGB oldValue = fColorValue;
-		    fColorValue = newColor;
-		    final Object[] finalListeners = getListeners();
-		    if (finalListeners.length > 0) {
-		        PropertyChangeEvent pEvent = new PropertyChangeEvent(
-		                this, PROP_COLORCHANGE, oldValue, newColor);
-		        for (int i = 0; i < finalListeners.length; ++i) {
-		            IPropertyChangeListener listener = (IPropertyChangeListener) finalListeners[i];
-		            listener.propertyChange(pEvent);
-		        }
-		    }
-		    updateColorImage();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/ComboFieldEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/ComboFieldEditor.java
deleted file mode 100644
index 81bb5b7..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/ComboFieldEditor.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Remy Chi Jian Suen <remy.suen@gmail.com> - Bug 214392 missing implementation of ComboFieldEditor.setEnabled
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-
-import org.eclipse.core.runtime.Assert;
-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.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A field editor for a combo box that allows the drop-down selection of one of
- * a list of items.
- * 
- * @since 3.3
- */
-public class ComboFieldEditor extends FieldEditor {
-
-	/**
-	 * The <code>Combo</code> widget.
-	 */
-	private Combo fCombo;
-	
-	/**
-	 * The value (not the name) of the currently selected item in the Combo widget.
-	 */
-	private String fValue;
-	
-	/**
-	 * The names (labels) and underlying values to populate the combo widget.  These should be
-	 * arranged as: { {name1, value1}, {name2, value2}, ...}
-	 */
-	private String[][] fEntryNamesAndValues;
-
-	/**
-	 * Create the combo box field editor.
-	 * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-	 * @param entryNamesAndValues the names (labels) and underlying values to populate the combo widget.  These should be
-	 * arranged as: { {name1, value1}, {name2, value2}, ...}
-	 * @param parent the parent composite
-	 */
-	public ComboFieldEditor(String name, String labelText, String[][] entryNamesAndValues, Composite parent) {
-		init(name, labelText);
-		Assert.isTrue(checkArray(entryNamesAndValues));
-		fEntryNamesAndValues = entryNamesAndValues;
-		createControl(parent);		
-	}
-
-	/**
-	 * Checks whether given <code>String[][]</code> is of "type" 
-	 * <code>String[][2]</code>.
-	 *
-	 * @return <code>true</code> if it is ok, and <code>false</code> otherwise
-	 */
-	private boolean checkArray(String[][] table) {
-		if (table == null) {
-			return false;
-		}
-		for (int i = 0; i < table.length; i++) {
-			String[] array = table[i];
-			if (array == null || array.length != 2) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.FieldEditor#adjustForNumColumns(int)
-	 */
-	protected void adjustForNumColumns(int numColumns) {
-		if (numColumns > 1) {
-			Control control = getLabelControl();
-			int left = numColumns;
-			if (control != null) {
-				((GridData)control.getLayoutData()).horizontalSpan = 1;
-				left = left - 1;
-			}
-			((GridData)fCombo.getLayoutData()).horizontalSpan = left;
-		} else {
-			Control control = getLabelControl();
-			if (control != null) {
-				((GridData)control.getLayoutData()).horizontalSpan = 1;
-			}
-			((GridData)fCombo.getLayoutData()).horizontalSpan = 1;			
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.FieldEditor#doFillIntoGrid(org.eclipse.swt.widgets.Composite, int)
-	 */
-	protected void doFillIntoGrid(Composite parent, int numColumns) {
-		int comboC = 1;
-		if (numColumns > 1) {
-			comboC = numColumns - 1;
-		}
-		Control control = getLabelControl(parent);
-		GridData gd = new GridData();
-		gd.horizontalSpan = 1;
-		control.setLayoutData(gd);
-		control = getComboBoxControl(parent);
-		gd = new GridData();
-		gd.horizontalSpan = comboC;
-		gd.horizontalAlignment = GridData.FILL;
-		control.setLayoutData(gd);
-		control.setFont(parent.getFont());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.FieldEditor#doLoad()
-	 */
-	protected void doLoad() {
-		updateComboForValue(getPreferenceStore().getString(getPreferenceName()));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.FieldEditor#doLoadDefault()
-	 */
-	protected void doLoadDefault() {
-		updateComboForValue(getPreferenceStore().getDefaultString(getPreferenceName()));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.FieldEditor#doStore()
-	 */
-	protected void doStore() {
-		if (fValue == null) {
-			getPreferenceStore().setToDefault(getPreferenceName());
-			return;
-		}
-		getPreferenceStore().setValue(getPreferenceName(), fValue);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.FieldEditor#getNumberOfControls()
-	 */
-	public int getNumberOfControls() {
-		return 2;
-	}
-
-	/*
-	 * Lazily create and return the Combo control.
-	 */
-	private Combo getComboBoxControl(Composite parent) {
-		if (fCombo == null) {
-			fCombo = new Combo(parent, SWT.READ_ONLY);
-			fCombo.setFont(parent.getFont());
-			for (int i = 0; i < fEntryNamesAndValues.length; i++) {
-				fCombo.add(fEntryNamesAndValues[i][0], i);
-			}
-			
-			fCombo.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent evt) {
-					String oldValue = fValue;
-					String name = fCombo.getText();
-					fValue = getValueForName(name);
-					setPresentsDefaultValue(false);
-					fireValueChanged(VALUE, oldValue, fValue);					
-				}
-			});
-		}
-		return fCombo;
-	}
-	
-	/*
-	 * Given the name (label) of an entry, return the corresponding value.
-	 */
-	private String getValueForName(String name) {
-		for (int i = 0; i < fEntryNamesAndValues.length; i++) {
-			String[] entry = fEntryNamesAndValues[i];
-			if (name.equals(entry[0])) {
-				return entry[1];
-			}
-		}
-		return fEntryNamesAndValues[0][0];
-	}
-	
-	/*
-	 * Set the name in the combo widget to match the specified value.
-	 */
-	private void updateComboForValue(String value) {
-		fValue = value;
-		for (int i = 0; i < fEntryNamesAndValues.length; i++) {
-			if (value.equals(fEntryNamesAndValues[i][1])) {
-				fCombo.setText(fEntryNamesAndValues[i][0]);
-				return;
-			}
-		}
-		if (fEntryNamesAndValues.length > 0) {
-			fValue = fEntryNamesAndValues[0][1];
-			fCombo.setText(fEntryNamesAndValues[0][0]);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.FieldEditor#setEnabled(boolean,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void setEnabled(boolean enabled, Composite parent) {
-		super.setEnabled(enabled, parent);
-		getComboBoxControl(parent).setEnabled(enabled);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/DirectoryFieldEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/DirectoryFieldEditor.java
deleted file mode 100644
index bad39f1..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/DirectoryFieldEditor.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import java.io.File;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-
-/**
- * A field editor for a directory path type preference. A standard directory
- * dialog appears when the user presses the change button.
- */
-public class DirectoryFieldEditor extends StringButtonFieldEditor {
-    /**
-     * Creates a new directory field editor 
-     */
-    protected DirectoryFieldEditor() {
-    }
-
-    /**
-     * Creates a directory field editor.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param parent the parent of the field editor's control
-     */
-    public DirectoryFieldEditor(String name, String labelText, Composite parent) {
-        init(name, labelText);
-        setErrorMessage(JFaceResources
-                .getString("DirectoryFieldEditor.errorMessage"));//$NON-NLS-1$
-        setChangeButtonText(JFaceResources.getString("openBrowse"));//$NON-NLS-1$
-        setValidateStrategy(VALIDATE_ON_FOCUS_LOST);
-        createControl(parent);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on StringButtonFieldEditor.
-     * Opens the directory chooser dialog and returns the selected directory.
-     */
-    protected String changePressed() {
-        File f = new File(getTextControl().getText());
-        if (!f.exists()) {
-			f = null;
-		}
-        File d = getDirectory(f);
-        if (d == null) {
-			return null;
-		}
-
-        return d.getAbsolutePath();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on StringFieldEditor.
-     * Checks whether the text input field contains a valid directory.
-     */
-    protected boolean doCheckState() {
-        String fileName = getTextControl().getText();
-        fileName = fileName.trim();
-        if (fileName.length() == 0 && isEmptyStringAllowed()) {
-			return true;
-		}
-        File file = new File(fileName);
-        return file.isDirectory();
-    }
-
-    /**
-     * Helper that opens the directory chooser dialog.
-     * @param startingDirectory The directory the dialog will open in.
-     * @return File File or <code>null</code>.
-     * 
-     */
-    private File getDirectory(File startingDirectory) {
-
-        DirectoryDialog fileDialog = new DirectoryDialog(getShell(), SWT.OPEN);
-        if (startingDirectory != null) {
-			fileDialog.setFilterPath(startingDirectory.getPath());
-		}
-        String dir = fileDialog.open();
-        if (dir != null) {
-            dir = dir.trim();
-            if (dir.length() > 0) {
-				return new File(dir);
-			}
-        }
-
-        return null;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/FieldEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/FieldEditor.java
deleted file mode 100644
index 1444511..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/FieldEditor.java
+++ /dev/null
@@ -1,715 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.jface.dialogs.DialogPage;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-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;
-
-/**
- * Abstract base class for all field editors.
- * <p>
- * A field editor presents the value of a preference to the end 
- * user. The value is loaded from a preference store; if
- * modified by the end user, the value is validated and eventually
- * stored back to the preference store. A field editor reports
- * an event when the value, or the validity of the value, changes.
- * </p>
- * <p>
- * Field editors should be used in conjunction with a field 
- * editor preference page (<code>FieldEditorPreferencePage</code>)
- * which coordinates everything and provides the message line
- * which display messages emanating from the editor.
- * </p>
- * <p>
- * This package contains ready-to-use field editors for various
- * types of preferences:
- * <ul>
- *   <li><code>BooleanFieldEditor</code> - booleans</li>
- *   <li><code>IntegerFieldEditor</code> - integers</li>
- *   <li><code>StringFieldEditor</code> - text strings</li>
- *   <li><code>RadioGroupFieldEditor</code> - enumerations</li>
- *   <li><code>ColorFieldEditor</code> - RGB colors</li>
- *   <li><code>FontFieldEditor</code> - fonts</li>
- *   <li><code>DirectoryFieldEditor</code> - directories</li>
- *   <li><code>FileFieldEditor</code> - files</li>
- *   <li><code>PathEditor</code> - paths</li>
- * </ul>
- * </p>
- */
-public abstract class FieldEditor {
-
-    /**
-     * Property name constant (value <code>"field_editor_is_valid"</code>)
-     * to signal a change in the validity of the value of this field editor.
-     */
-    public static final String IS_VALID = "field_editor_is_valid";//$NON-NLS-1$
-
-    /**
-     * Property name constant (value <code>"field_editor_value"</code>)
-     * to signal a change in the value of this field editor.
-     */
-    public static final String VALUE = "field_editor_value";//$NON-NLS-1$
-
-    /** 
-     * Gap between label and control.
-     */
-    protected static final int HORIZONTAL_GAP = 8;
-
-    /**
-     * The preference store, or <code>null</code> if none.
-     */
-    private IPreferenceStore preferenceStore = null;
-
-    /**
-     * The name of the preference displayed in this field editor.
-     */
-    private String preferenceName;
-
-    /**
-     * Indicates whether the default value is currently displayed,
-     * initially <code>false</code>.
-     */
-    private boolean isDefaultPresented = false;
-
-    /**
-     * The label's text.
-     */
-    private String labelText;
-
-    /**
-     * The label control.
-     */
-    private Label label;
-
-    /**
-     * Listener, or <code>null</code> if none
-     */
-    private IPropertyChangeListener propertyChangeListener;
-
-    /** 
-     * The page containing this field editor
-     */
-    private DialogPage page;
-
-    /**
-     * Creates a new field editor.
-     */
-    protected FieldEditor() {
-    }
-
-    /**
-     * Creates a new field editor.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param parent the parent of the field editor's control
-     */
-    protected FieldEditor(String name, String labelText, Composite parent) {
-        init(name, labelText);
-        createControl(parent);
-    }
-
-    /**
-     * Adjusts the horizontal span of this field editor's basic controls.
-     * <p>
-     * Subclasses must implement this method to adjust the horizontal span 
-     * of controls so they appear correct in the given number of columns.
-     * </p>
-     * <p>
-     * The number of columns will always be equal to or greater than the 
-     * value returned by this editor's <code>getNumberOfControls</code> method.
-     *
-     * @param numColumns the number of columns
-     */
-    protected abstract void adjustForNumColumns(int numColumns);
-
-    /**
-     * Applies a font.
-     * <p>
-     * The default implementation of this framework method
-     * does nothing. Subclasses should override this method
-     * if they want to change the font of the SWT control to
-     * a value different than the standard dialog font.
-     * </p>
-     */
-    protected void applyFont() {
-    }
-
-    /**
-     * Checks if the given parent is the current parent of the
-     * supplied control; throws an (unchecked) exception if they
-     * are not correctly related.
-     *
-     * @param control the control
-     * @param parent the parent control
-     */
-    protected void checkParent(Control control, Composite parent) {
-        Assert.isTrue(control.getParent() == parent, "Different parents");//$NON-NLS-1$
-    }
-
-    /**
-     * Clears the error message from the message line.
-     */
-    protected void clearErrorMessage() {
-        if (page != null) {
-			page.setErrorMessage(null);
-		}
-    }
-
-    /**
-     * Clears the normal message from the message line.
-     */
-    protected void clearMessage() {
-        if (page != null) {
-			page.setMessage(null);
-		}
-    }
-
-    /**
-     * Returns the number of pixels corresponding to the
-     * given number of horizontal dialog units.
-     * <p>
-     * Clients may call this framework method, but should not override it.
-     * </p>
-     *
-     * @param control the control being sized
-     * @param dlus the number of horizontal dialog units
-     * @return the number of pixels
-     */
-    protected int convertHorizontalDLUsToPixels(Control control, int dlus) {
-        GC gc = new GC(control);
-        gc.setFont(control.getFont());
-        int averageWidth = gc.getFontMetrics().getAverageCharWidth();
-        gc.dispose();
-
-        double horizontalDialogUnitSize = averageWidth * 0.25;
-
-        return (int) Math.round(dlus * horizontalDialogUnitSize);
-    }
-
-    /**
-     * Returns the number of pixels corresponding to the
-     * given number of vertical dialog units.
-     * <p>
-     * Clients may call this framework method, but should not override it.
-     * </p>
-     *
-     * @param control the control being sized
-     * @param dlus the number of vertical dialog units
-     * @return the number of pixels
-     */
-    protected int convertVerticalDLUsToPixels(Control control, int dlus) {
-        GC gc = new GC(control);
-        gc.setFont(control.getFont());
-        int height = gc.getFontMetrics().getHeight();
-        gc.dispose();
-
-        double verticalDialogUnitSize = height * 0.125;
-
-        return (int) Math.round(dlus * verticalDialogUnitSize);
-    }
-
-    /**
-     * Creates this field editor's main control containing all of its
-     * basic controls.
-     *
-     * @param parent the parent control
-     */
-    protected void createControl(Composite parent) {
-        GridLayout layout = new GridLayout();
-        layout.numColumns = getNumberOfControls();
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        layout.horizontalSpacing = HORIZONTAL_GAP;
-        parent.setLayout(layout);
-        doFillIntoGrid(parent, layout.numColumns);
-    }
-
-    /**
-     * Disposes the SWT resources used by this field editor.
-     */
-    public void dispose() {
-        // nothing to dispose
-    }
-
-    /**
-     * Fills this field editor's basic controls into the given parent.
-     * <p>
-     * Subclasses must implement this method to create the controls
-     * for this field editor.
-     * </p>
-     *
-     * @param parent the composite used as a parent for the basic controls;
-     *	the parent's layout must be a <code>GridLayout</code>
-     * @param numColumns the number of columns
-     */
-    protected abstract void doFillIntoGrid(Composite parent, int numColumns);
-
-    /**
-     * Initializes this field editor with the preference value from
-     * the preference store.
-     * <p>
-     * Subclasses must implement this method to properly initialize 
-     * the field editor.
-     * </p>
-     */
-    protected abstract void doLoad();
-
-    /**
-     * Initializes this field editor with the default preference value from
-     * the preference store.
-     * <p>
-     * Subclasses must implement this method to properly initialize 
-     * the field editor.
-     * </p>
-     */
-    protected abstract void doLoadDefault();
-
-    /**
-     * Stores the preference value from this field editor into
-     * the preference store.
-     * <p>
-     * Subclasses must implement this method to save the entered value
-     * into the preference store.
-     * </p>
-     */
-    protected abstract void doStore();
-
-    /**
-     * Fills this field editor's basic controls into the given parent. 
-     *
-     * @param parent the composite used as a parent for the basic controls;
-     *	the parent's layout must be a <code>GridLayout</code>
-     * @param numColumns the number of columns
-     */
-    public void fillIntoGrid(Composite parent, int numColumns) {
-        Assert.isTrue(numColumns >= getNumberOfControls());
-        Assert.isTrue(parent.getLayout() instanceof GridLayout);
-        doFillIntoGrid(parent, numColumns);
-    }
-
-    /**
-     * Informs this field editor's listener, if it has one, about a change to
-     * one of this field editor's boolean-valued properties. Does nothing
-     * if the old and new values are the same.
-     *
-     * @param property the field editor property name, 
-     *   such as <code>VALUE</code> or <code>IS_VALID</code>
-     * @param oldValue the old value
-     * @param newValue the new value
-     */
-    protected void fireStateChanged(String property, boolean oldValue,
-            boolean newValue) {
-        if (oldValue == newValue) {
-			return;
-		}
-        fireValueChanged(property, oldValue ? Boolean.TRUE : Boolean.FALSE, newValue ? Boolean.TRUE : Boolean.FALSE);
-    }
-
-    /**
-     * Informs this field editor's listener, if it has one, about a change to
-     * one of this field editor's properties.
-     *
-     * @param property the field editor property name, 
-     *   such as <code>VALUE</code> or <code>IS_VALID</code>
-     * @param oldValue the old value object, or <code>null</code>
-     * @param newValue the new value, or <code>null</code>
-     */
-    protected void fireValueChanged(String property, Object oldValue,
-            Object newValue) {
-        if (propertyChangeListener == null) {
-			return;
-		}
-        propertyChangeListener.propertyChange(new PropertyChangeEvent(this,
-                property, oldValue, newValue));
-    }
-
-    /**
-     * Returns the symbolic font name used by this field editor.
-     *
-     * @return the symbolic font name
-     */
-    public String getFieldEditorFontName() {
-        return JFaceResources.DIALOG_FONT;
-    }
-
-    /**
-     * Returns the label control. 
-     *
-     * @return the label control, or <code>null</code>
-     *  if no label control has been created
-     */
-    protected Label getLabelControl() {
-        return label;
-    }
-
-    /**
-     * Returns this field editor's label component.
-     * <p>
-     * The label is created if it does not already exist
-     * </p>
-     *
-     * @param parent the parent
-     * @return the label control
-     */
-    public Label getLabelControl(Composite parent) {
-        if (label == null) {
-            label = new Label(parent, SWT.LEFT);
-            label.setFont(parent.getFont());
-            String text = getLabelText();
-            if (text != null) {
-				label.setText(text);
-			}
-            label.addDisposeListener(new DisposeListener() {
-                public void widgetDisposed(DisposeEvent event) {
-                    label = null;
-                }
-            });
-        } else {
-            checkParent(label, parent);
-        }
-        return label;
-    }
-
-    /**
-     * Returns this field editor's label text.
-     *
-     * @return the label text
-     */
-    public String getLabelText() {
-        return labelText;
-    }
-
-    /**
-     * Returns the number of basic controls this field editor consists of.
-     *
-     * @return the number of controls
-     */
-    public abstract int getNumberOfControls();
-
-    /**
-     * Returns the name of the preference this field editor operates on.
-     *
-     * @return the name of the preference
-     */
-    public String getPreferenceName() {
-        return preferenceName;
-    }
-
-    /**
-     * Returns the preference page in which this field editor
-     * appears.
-     *
-     * @return the preference page, or <code>null</code> if none
-     * @deprecated use #getPage()
-     */
-    protected PreferencePage getPreferencePage() {
-    	if(page != null && page instanceof PreferencePage) {
-			return (PreferencePage) page;
-		}
-    	return null;
-    }
-    
-    /**
-     * Return the DialogPage that the receiver is sending
-     * updates to.
-     * 
-     * @return DialogPage or <code>null</code> if it 
-     * has not been set.
-     * 
-     * @since 3.1
-     */
-    protected DialogPage getPage(){
-    	return page;
-    }
-
-    /**
-     * Returns the preference store used by this field editor.
-     *
-     * @return the preference store, or <code>null</code> if none
-     * @see #setPreferenceStore
-     */
-    public IPreferenceStore getPreferenceStore() {
-        return preferenceStore;
-    }
-
-    /**
-     * Initialize the field editor with the given preference name and label.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param text the label text of the field editor
-     */
-    protected void init(String name, String text) {
-        Assert.isNotNull(name);
-        Assert.isNotNull(text);
-        preferenceName = name;
-        this.labelText = text;
-    }
-
-    /**
-     * Returns whether this field editor contains a valid value.
-     * <p>
-     * The default implementation of this framework method
-     * returns <code>true</code>. Subclasses wishing to perform
-     * validation should override both this method and
-     * <code>refreshValidState</code>.
-     * </p>
-     * 
-     * @return <code>true</code> if the field value is valid,
-     *   and <code>false</code> if invalid
-     * @see #refreshValidState()
-     */
-    public boolean isValid() {
-        return true;
-    }
-
-    /**
-     * Initializes this field editor with the preference value from
-     * the preference store.
-     */
-    public void load() {
-        if (preferenceStore != null) {
-            isDefaultPresented = false;
-            doLoad();
-            refreshValidState();
-        }
-    }
-
-    /**
-     * Initializes this field editor with the default preference value
-     * from the preference store.
-     */
-    public void loadDefault() {
-        if (preferenceStore != null) {
-            isDefaultPresented = true;
-            doLoadDefault();
-            refreshValidState();
-        }
-    }
-
-    /**
-     * Returns whether this field editor currently presents the
-     * default value for its preference.
-     * 
-     * @return <code>true</code> if the default value is presented,
-     *   and <code>false</code> otherwise
-     */
-    public boolean presentsDefaultValue() {
-        return isDefaultPresented;
-    }
-
-    /**
-     * Refreshes this field editor's valid state after a value change
-     * and fires an <code>IS_VALID</code> property change event if
-     * warranted.
-     * <p>
-     * The default implementation of this framework method does
-     * nothing. Subclasses wishing to perform validation should override
-     * both this method and <code>isValid</code>.
-     * </p>
-     *
-     * @see #isValid
-     */
-    protected void refreshValidState() {
-    }
-
-    /**
-     * Sets the focus to this field editor.
-     * <p>
-     * The default implementation of this framework method
-     * does nothing. Subclasses may reimplement.
-     * </p>
-     */
-    public void setFocus() {
-        // do nothing;
-    }
-
-    /**
-     * Sets this field editor's label text.
-     * The label is typically presented to the left of the entry field.
-     *
-     * @param text the label text
-     */
-    public void setLabelText(String text) {
-        Assert.isNotNull(text);
-        labelText = text;
-        if (label != null) {
-			label.setText(text);
-		}
-    }
-
-    /**
-     * Sets the name of the preference this field editor operates on.
-     * <p>
-     * The ability to change this allows the same field editor object
-     * to be reused for different preferences.
-     * </p>
-     * <p>
-     * For example: <p>
-     * <pre>
-     * 	...
-     *  editor.setPreferenceName("font");
-     * 	editor.load();
-     * </pre>
-     * </p>
-     *
-     * @param name the name of the preference
-     */
-    public void setPreferenceName(String name) {
-        preferenceName = name;
-    }
-
-    /**
-     * Sets the preference page in which this field editor
-     * appears.
-     *
-     * @param preferencePage the preference page, or <code>null</code> if none
-     * @deprecated use #setPage(DialogPage)
-     */
-    public void setPreferencePage(PreferencePage preferencePage) {
-        setPage(preferencePage);
-    }
-    
-
-    /**
-     * Set the page to be the receiver.
-	 * @param dialogPage
-	 * 
-	 * @since 3.1
-	 */
-	public void setPage(DialogPage dialogPage) {
-		page = dialogPage;
-		
-	}
-
-	/**
-     * Sets the preference store used by this field editor.
-     *
-     * @param store the preference store, or <code>null</code> if none
-     * @see #getPreferenceStore
-     */
-    public void setPreferenceStore(IPreferenceStore store) {
-        preferenceStore = store;
-    }
-
-    /**
-     * Sets whether this field editor is presenting the default value.
-     *
-     * @param booleanValue <code>true</code> if the default value is being presented,
-     *  and <code>false</code> otherwise
-     */
-    protected void setPresentsDefaultValue(boolean booleanValue) {
-        isDefaultPresented = booleanValue;
-    }
-
-    /**
-     * Sets or removes the property change listener for this field editor.
-     * <p>
-     * Note that field editors can support only a single listener.
-     * </p>
-     *
-     * @param listener a property change listener, or <code>null</code>
-     *  to remove
-     */
-    public void setPropertyChangeListener(IPropertyChangeListener listener) {
-        propertyChangeListener = listener;
-    }
-
-    /**
-     * Shows the given error message in the page for this
-     * field editor if it has one.
-     *
-     * @param msg the error message
-     */
-    protected void showErrorMessage(String msg) {
-        if (page != null) {
-			page.setErrorMessage(msg);
-		}
-    }
-
-    /**
-     * Shows the given message in the page for this
-     * field editor if it has one.
-     *
-     * @param msg the message
-     */
-    protected void showMessage(String msg) {
-        if (page != null) {
-			page.setErrorMessage(msg);
-		}
-    }
-
-    /**
-     * Stores this field editor's value back into the preference store.
-     */
-    public void store() {
-        if (preferenceStore == null) {
-			return;
-		}
-
-        if (isDefaultPresented) {
-            preferenceStore.setToDefault(preferenceName);
-        } else {
-            doStore();
-        }
-    }
-
-    /**
-     * Set the GridData on button to be one that is spaced for the
-     * current font.
-     * @param button the button the data is being set on.
-     */
-
-    protected void setButtonLayoutData(Button button) {
-
-        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-
-        // Compute and store a font metric
-        GC gc = new GC(button);
-        gc.setFont(button.getFont());
-        FontMetrics fontMetrics = gc.getFontMetrics();
-        gc.dispose();
-
-        int widthHint = org.eclipse.jface.dialogs.Dialog
-                .convertVerticalDLUsToPixels(fontMetrics,
-                        IDialogConstants.BUTTON_WIDTH);
-        data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT,
-                SWT.DEFAULT, true).x);
-        button.setLayoutData(data);
-    }
-
-    /**
-     * Set whether or not the controls in the field editor
-     * are enabled.
-     * @param enabled The enabled state.
-     * @param parent The parent of the controls in the group.
-     *  Used to create the controls if required.
-     */
-    public void setEnabled(boolean enabled, Composite parent) {
-        getLabelControl(parent).setEnabled(enabled);
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/FieldEditorPreferencePage.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/FieldEditorPreferencePage.java
deleted file mode 100644
index 1863709..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/FieldEditorPreferencePage.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- * 	   Chris Tilt (chris@tilts.net) - Bug 38547 - [Preferences] Changing preferences 
- * 			ignored after "Restore defaults" pressed.
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-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.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A special abstract preference page to host field editors.
- * <p>
- * Subclasses must implement the <code>createFieldEditors</code> method
- * and should override <code>createLayout</code> if a special layout of the field
- * editors is needed.
- * </p>
- */
-public abstract class FieldEditorPreferencePage extends PreferencePage
-        implements IPropertyChangeListener {
-
-    /**
-     * Layout constant (value <code>0</code>) indicating that
-     * each field editor is handled as a single component.
-     */
-    public static final int FLAT = 0;
-
-    /**
-     * Layout constant (value <code>1</code>) indicating that
-     * the field editors' basic controls are put into a grid layout.
-     */
-    public static final int GRID = 1;
-
-    /** 
-     * The vertical spacing used by layout styles <code>FLAT</code> 
-     * and <code>GRID</code>.
-     */
-    protected static final int VERTICAL_SPACING = 10;
-
-    /** 
-     * The margin width used by layout styles <code>FLAT</code> 
-     * and <code>GRID</code>.
-     */
-    protected static final int MARGIN_WIDTH = 0;
-
-    /** 
-     * The margin height used by layout styles <code>FLAT</code> 
-     * and <code>GRID</code>.
-     */
-    protected static final int MARGIN_HEIGHT = 0;
-
-    /**
-     * The field editors, or <code>null</code> if not created yet.
-     */
-    private List fields = null;
-
-    /**
-     * The layout style; either <code>FLAT</code> or <code>GRID</code>.
-     */
-    private int style;
-
-    /** 
-     * The first invalid field editor, or <code>null</code>
-     * if all field editors are valid.
-     */
-    private FieldEditor invalidFieldEditor = null;
-
-    /**
-     * The parent composite for field editors
-     */
-    private Composite fieldEditorParent;
-
-    /**
-	 * Create a new instance of the reciever.
-	 */
-	public FieldEditorPreferencePage() {
-		this(FLAT);
-	}
-
-	/**
-     * Creates a new field editor preference page with the given style,
-     * an empty title, and no image.
-     *
-     * @param style either <code>GRID</code> or <code>FLAT</code>
-     */
-    protected FieldEditorPreferencePage(int style) {
-        super();
-        this.style = style;
-    }
-
-    /**
-     * Creates a new field editor preference page with the given title 
-     * and style, but no image.
-     *
-     * @param title the title of this preference page
-     * @param style either <code>GRID</code> or <code>FLAT</code>
-     */
-    protected FieldEditorPreferencePage(String title, int style) {
-        super(title);
-        this.style = style;
-    }
-
-    /**
-     * Creates a new field editor preference page with the given title,
-     * image, and style.
-     *
-     * @param title the title of this preference page
-     * @param image the image for this preference page, or 
-     *   <code>null</code> if none
-     * @param style either <code>GRID</code> or <code>FLAT</code>
-     */
-    protected FieldEditorPreferencePage(String title, ImageDescriptor image,
-            int style) {
-        super(title, image);
-        this.style = style;
-    }
-
-    /**
-     * Adds the given field editor to this page.
-     *
-     * @param editor the field editor
-     */
-    protected void addField(FieldEditor editor) {
-        if (fields == null) {
-			fields = new ArrayList();
-		}
-        fields.add(editor);
-    }
-
-    /**
-     * Adjust the layout of the field editors so that
-     * they are properly aligned.
-     */
-    protected void adjustGridLayout() {
-        int numColumns = calcNumberOfColumns();
-        ((GridLayout) fieldEditorParent.getLayout()).numColumns = numColumns;
-        if (fields != null) {
-            for (int i = 0; i < fields.size(); i++) {
-                FieldEditor fieldEditor = (FieldEditor) fields.get(i);
-                fieldEditor.adjustForNumColumns(numColumns);
-            }
-        }
-    }
-
-    /**
-     * Applys the font to the field editors managed by this page.
-     */
-    protected void applyFont() {
-        if (fields != null) {
-            Iterator e = fields.iterator();
-            while (e.hasNext()) {
-                FieldEditor pe = (FieldEditor) e.next();
-                pe.applyFont();
-            }
-        }
-    }
-
-    /**
-     * Calculates the number of columns needed to host all field editors.
-     *
-     * @return the number of columns
-     */
-    private int calcNumberOfColumns() {
-        int result = 0;
-        if (fields != null) {
-            Iterator e = fields.iterator();
-            while (e.hasNext()) {
-                FieldEditor pe = (FieldEditor) e.next();
-                result = Math.max(result, pe.getNumberOfControls());
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Recomputes the page's error state by calling <code>isValid</code> for
-     * every field editor.
-     */
-    protected void checkState() {
-        boolean valid = true;
-        invalidFieldEditor = null;
-        // The state can only be set to true if all
-        // field editors contain a valid value. So we must check them all
-        if (fields != null) {
-            int size = fields.size();
-            for (int i = 0; i < size; i++) {
-                FieldEditor editor = (FieldEditor) fields.get(i);
-                valid = valid && editor.isValid();
-                if (!valid) {
-                    invalidFieldEditor = editor;
-                    break;
-                }
-            }
-        }
-        setValid(valid);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on PreferencePage.
-     */
-    protected Control createContents(Composite parent) {
-        fieldEditorParent = new Composite(parent, SWT.NULL);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 1;
-        layout.marginHeight = 0;
-        layout.marginWidth = 0;
-        fieldEditorParent.setLayout(layout);
-        fieldEditorParent.setFont(parent.getFont());
-
-        createFieldEditors();
-
-        if (style == GRID) {
-			adjustGridLayout();
-		}
-
-        initialize();
-        checkState();
-        return fieldEditorParent;
-    }
-
-    /**
-     * Creates the page's field editors.
-     * <p>
-     * The default implementation of this framework method
-     * does nothing. Subclass must implement this method to
-     * create the field editors.
-     * </p>
-     * <p>
-     * Subclasses should call <code>getFieldEditorParent</code>
-     * to obtain the parent control for each field editor.
-     * This same parent should not be used for more than
-     * one editor as the parent may change for each field
-     * editor depending on the layout style of the page
-     * </p>
-     */
-    protected abstract void createFieldEditors();
-
-    /**	
-     * The field editor preference page implementation of an <code>IDialogPage</code>
-     * method disposes of this page's controls and images.
-     * Subclasses may override to release their own allocated SWT
-     * resources, but must call <code>super.dispose</code>.
-     */
-    public void dispose() {
-        super.dispose();
-        if (fields != null) {
-            Iterator e = fields.iterator();
-            while (e.hasNext()) {
-                FieldEditor pe = (FieldEditor) e.next();
-                pe.setPage(null);
-                pe.setPropertyChangeListener(null);
-                pe.setPreferenceStore(null);
-            }
-        }
-    }
-
-    /**
-     * Returns a parent composite for a field editor.
-     * <p>
-     * This value must not be cached since a new parent
-     * may be created each time this method called. Thus
-     * this method must be called each time a field editor
-     * is constructed.
-     * </p>
-     *
-     * @return a parent
-     */
-    protected Composite getFieldEditorParent() {
-        if (style == FLAT) {
-            // Create a new parent for each field editor
-            Composite parent = new Composite(fieldEditorParent, SWT.NULL);
-            parent.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            return parent;
-        }
-        // Just return the parent
-        return fieldEditorParent;
-    }
-
-    /**
-     * Initializes all field editors.
-     */
-    protected void initialize() {
-        if (fields != null) {
-            Iterator e = fields.iterator();
-            while (e.hasNext()) {
-                FieldEditor pe = (FieldEditor) e.next();
-                pe.setPage(this);
-                pe.setPropertyChangeListener(this);
-                pe.setPreferenceStore(getPreferenceStore());
-                pe.load();
-            }
-        }
-    }
-
-    /**	
-     * The field editor preference page implementation of a <code>PreferencePage</code>
-     * method loads all the field editors with their default values.
-     */
-    protected void performDefaults() {
-        if (fields != null) {
-            Iterator e = fields.iterator();
-            while (e.hasNext()) {
-                FieldEditor pe = (FieldEditor) e.next();
-                pe.loadDefault();
-            }
-        }
-        // Force a recalculation of my error state.
-        checkState();
-        super.performDefaults();
-    }
-
-    /** 
-     * The field editor preference page implementation of this 
-     * <code>PreferencePage</code> method saves all field editors by
-     * calling <code>FieldEditor.store</code>. Note that this method
-     * does not save the preference store itself; it just stores the
-     * values back into the preference store.
-     *
-     * @see FieldEditor#store()
-     */
-    public boolean performOk() {
-        if (fields != null) {
-            Iterator e = fields.iterator();
-            while (e.hasNext()) {
-                FieldEditor pe = (FieldEditor) e.next();
-                pe.store();
-                pe.setPresentsDefaultValue(false);
-            }
-        }
-        return true;
-    }
-
-    /**
-     * The field editor preference page implementation of this <code>IPreferencePage</code>
-     * (and <code>IPropertyChangeListener</code>) method intercepts <code>IS_VALID</code> 
-     * events but passes other events on to its superclass.
-     */
-    public void propertyChange(PropertyChangeEvent event) {
-
-        if (event.getProperty().equals(FieldEditor.IS_VALID)) {
-            boolean newValue = ((Boolean) event.getNewValue()).booleanValue();
-            // If the new value is true then we must check all field editors.
-            // If it is false, then the page is invalid in any case.
-            if (newValue) {
-                checkState();
-            } else {
-                invalidFieldEditor = (FieldEditor) event.getSource();
-                setValid(newValue);
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialog.
-     */
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        if (visible && invalidFieldEditor != null) {
-            invalidFieldEditor.setFocus();
-        }
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/FileFieldEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/FileFieldEditor.java
deleted file mode 100644
index d3cb7cc..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/FileFieldEditor.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import java.io.File;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-
-/**
- * A field editor for a file path type preference. A standard file 
- * dialog appears when the user presses the change button.
- */
-public class FileFieldEditor extends StringButtonFieldEditor {
-
-    /**
-     * List of legal file extension suffixes, or <code>null</code>
-     * for system defaults.
-     */
-    private String[] extensions = null;
-
-    /**
-     * Indicates whether the path must be absolute;
-     * <code>false</code> by default.
-     */
-    private boolean enforceAbsolute = false;
-
-    /**
-     * Creates a new file field editor 
-     */
-    protected FileFieldEditor() {
-    }
-
-    /**
-     * Creates a file field editor.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param parent the parent of the field editor's control
-     */
-    public FileFieldEditor(String name, String labelText, Composite parent) {
-        this(name, labelText, false, parent);
-    }
-    
-    /**
-     * Creates a file field editor.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param enforceAbsolute <code>true</code> if the file path
-     *  must be absolute, and <code>false</code> otherwise
-     * @param parent the parent of the field editor's control
-     */
-    public FileFieldEditor(String name, String labelText, boolean enforceAbsolute, Composite parent) {
-        this(name, labelText, enforceAbsolute, VALIDATE_ON_FOCUS_LOST, parent);
-    }
-    /**
-     * Creates a file field editor.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param enforceAbsolute <code>true</code> if the file path
-     *  must be absolute, and <code>false</code> otherwise
-     * @param validationStrategy either {@link StringButtonFieldEditor#VALIDATE_ON_KEY_STROKE}
-     *  to perform on the fly checking, or {@link StringButtonFieldEditor#VALIDATE_ON_FOCUS_LOST}
-     *  (the default) to perform validation only after the text has been typed in
-     * @param parent the parent of the field editor's control.
-     * @since 3.4
-     * @see StringButtonFieldEditor#VALIDATE_ON_KEY_STROKE
-     * @see StringButtonFieldEditor#VALIDATE_ON_FOCUS_LOST
-     */
-    public FileFieldEditor(String name, String labelText,
-            boolean enforceAbsolute, int validationStrategy, Composite parent) {
-        init(name, labelText);
-        this.enforceAbsolute = enforceAbsolute;
-        setErrorMessage(JFaceResources
-                .getString("FileFieldEditor.errorMessage"));//$NON-NLS-1$
-        setChangeButtonText(JFaceResources.getString("openBrowse"));//$NON-NLS-1$
-        setValidateStrategy(validationStrategy);
-        createControl(parent);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on StringButtonFieldEditor.
-     * Opens the file chooser dialog and returns the selected file.
-     */
-    protected String changePressed() {
-        File f = new File(getTextControl().getText());
-        if (!f.exists()) {
-			f = null;
-		}
-        File d = getFile(f);
-        if (d == null) {
-			return null;
-		}
-
-        return d.getAbsolutePath();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on StringFieldEditor.
-     * Checks whether the text input field specifies an existing file.
-     */
-    protected boolean checkState() {
-
-        String msg = null;
-
-        String path = getTextControl().getText();
-        if (path != null) {
-			path = path.trim();
-		} else {
-			path = "";//$NON-NLS-1$
-		}
-        if (path.length() == 0) {
-            if (!isEmptyStringAllowed()) {
-				msg = getErrorMessage();
-			}
-        } else {
-            File file = new File(path);
-            if (file.isFile()) {
-                if (enforceAbsolute && !file.isAbsolute()) {
-					msg = JFaceResources
-                            .getString("FileFieldEditor.errorMessage2");//$NON-NLS-1$
-				}
-            } else {
-                msg = getErrorMessage();
-            }
-        }
-
-        if (msg != null) { // error
-            showErrorMessage(msg);
-            return false;
-        }
-
-        // OK!
-        clearErrorMessage();
-        return true;
-    }
-
-    /**
-     * Helper to open the file chooser dialog.
-     * @param startingDirectory the directory to open the dialog on.
-     * @return File The File the user selected or <code>null</code> if they
-     * do not.
-     */
-    private File getFile(File startingDirectory) {
-
-        FileDialog dialog = new FileDialog(getShell(), SWT.OPEN);
-        if (startingDirectory != null) {
-			dialog.setFileName(startingDirectory.getPath());
-		}
-        if (extensions != null) {
-			dialog.setFilterExtensions(extensions);
-		}
-        String file = dialog.open();
-        if (file != null) {
-            file = file.trim();
-            if (file.length() > 0) {
-				return new File(file);
-			}
-        }
-
-        return null;
-    }
-
-    /**
-     * Sets this file field editor's file extension filter.
-     *
-     * @param extensions a list of file extension, or <code>null</code> 
-     * to set the filter to the system's default value
-     */
-    public void setFileExtensions(String[] extensions) {
-        this.extensions = extensions;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/FontFieldEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/FontFieldEditor.java
deleted file mode 100644
index fd3fc6d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/FontFieldEditor.java
+++ /dev/null
@@ -1,420 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.resource.StringConverter;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.FontDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A field editor for a font type preference.
- */
-public class FontFieldEditor extends FieldEditor {
-
-    /**
-     * The change font button, or <code>null</code> if none
-     * (before creation and after disposal).
-     */
-    private Button changeFontButton = null;
-
-    /**
-     * The text for the change font button, or <code>null</code>
-     * if missing.
-     */
-    private String changeButtonText;
-
-    /**
-     * The text for the preview, or <code>null</code> if no preview is desired
-     */
-    private String previewText;
-
-    /**
-     * Font data for the chosen font button, or <code>null</code> if none.
-     */
-    private FontData[] chosenFont;
-
-    /**
-     * The label that displays the selected font, or <code>null</code> if none.
-     */
-    private Label valueControl;
-
-    /**
-     * The previewer, or <code>null</code> if none.
-     */
-    private DefaultPreviewer previewer;
-
-    /**
-     * Internal font previewer implementation.
-     */
-    private static class DefaultPreviewer {
-        private Text text;
-
-        private String string;
-
-        private Font font;
-
-        /**
-         * Constructor for the previewer.
-         * @param s
-         * @param parent
-         */
-        public DefaultPreviewer(String s, Composite parent) {
-            string = s;
-            text = new Text(parent, SWT.READ_ONLY | SWT.BORDER);
-            text.addDisposeListener(new DisposeListener() {
-                public void widgetDisposed(DisposeEvent e) {
-                    if (font != null) {
-						font.dispose();
-					}
-                }
-            });
-            if (string != null) {
-				text.setText(string);
-			}
-        }
-
-        /**
-         * @return the control the previewer is using
-         */
-        public Control getControl() {
-            return text;
-        }
-
-        /**
-         * Set the font to display with
-         * @param fontData
-         */
-        public void setFont(FontData[] fontData) {
-            if (font != null) {
-				font.dispose();
-			}
-            font = new Font(text.getDisplay(), fontData);
-            text.setFont(font);
-        }
-
-        /**
-         * @return the preferred size of the previewer.
-         */
-        public int getPreferredExtent() {
-            return 40;
-        }
-    }
-
-    /**
-     * Creates a new font field editor 
-     */
-    protected FontFieldEditor() {
-    }
-
-    /**
-     * Creates a font field editor with an optional preview area.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param previewAreaText the text used for the preview window. If it is
-     * <code>null</code> there will be no preview area,
-     * @param parent the parent of the field editor's control
-     */
-    public FontFieldEditor(String name, String labelText,
-            String previewAreaText, Composite parent) {
-        init(name, labelText);
-        previewText = previewAreaText;
-        changeButtonText = JFaceResources.getString("openChange"); //$NON-NLS-1$
-        createControl(parent);
-
-    }
-
-    /**
-     * Creates a font field editor without a preview.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param parent the parent of the field editor's control
-     */
-    public FontFieldEditor(String name, String labelText, Composite parent) {
-        this(name, labelText, null, parent);
-
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void adjustForNumColumns(int numColumns) {
-
-        GridData data = new GridData();
-        if (valueControl.getLayoutData() != null) {
-			data = (GridData) valueControl.getLayoutData();
-		}
-
-        data.horizontalSpan = numColumns - getNumberOfControls() + 1;
-        valueControl.setLayoutData(data);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void applyFont() {
-        if (chosenFont != null && previewer != null) {
-			previewer.setFont(chosenFont);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doFillIntoGrid(Composite parent, int numColumns) {
-        getLabelControl(parent);
-
-        valueControl = getValueControl(parent);
-
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL
-                | GridData.GRAB_HORIZONTAL);
-        gd.horizontalSpan = numColumns - getNumberOfControls() + 1;
-        valueControl.setLayoutData(gd);
-        if (previewText != null) {
-            previewer = new DefaultPreviewer(previewText, parent);
-            gd = new GridData(GridData.FILL_HORIZONTAL);
-            gd.heightHint = previewer.getPreferredExtent();
-            gd.widthHint = previewer.getPreferredExtent();
-            previewer.getControl().setLayoutData(gd);
-        }
-
-        changeFontButton = getChangeControl(parent);
-        gd = new GridData();
-        int widthHint = convertHorizontalDLUsToPixels(changeFontButton,
-                IDialogConstants.BUTTON_WIDTH);
-        gd.widthHint = Math.max(widthHint, changeFontButton.computeSize(
-                SWT.DEFAULT, SWT.DEFAULT, true).x);
-        changeFontButton.setLayoutData(gd);
-
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doLoad() {
-        if (changeFontButton == null) {
-			return;
-		}
-        updateFont(PreferenceConverter.getFontDataArray(getPreferenceStore(),
-                getPreferenceName()));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doLoadDefault() {
-        if (changeFontButton == null) {
-			return;
-		}
-        updateFont(PreferenceConverter.getDefaultFontDataArray(
-                getPreferenceStore(), getPreferenceName()));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doStore() {
-        if (chosenFont != null) {
-			PreferenceConverter.setValue(getPreferenceStore(),
-                    getPreferenceName(), chosenFont);
-		}
-    }
-
-    /**
-     * Returns the change button for this field editor.
-     *
-     * @param parent The Composite to create the button in if required.
-     * @return the change button
-     */
-    protected Button getChangeControl(Composite parent) {
-        if (changeFontButton == null) {
-            changeFontButton = new Button(parent, SWT.PUSH);
-            if (changeButtonText != null) {
-				changeFontButton.setText(changeButtonText);
-			}
-            changeFontButton.addSelectionListener(new SelectionAdapter() {
-                public void widgetSelected(SelectionEvent event) {
-                    FontDialog fontDialog = new FontDialog(changeFontButton
-                            .getShell());
-                    if (chosenFont != null) {
-						fontDialog.setFontList(chosenFont);
-					}
-                    FontData font = fontDialog.open();
-                    if (font != null) {
-                        FontData[] oldFont = chosenFont;
-                        if (oldFont == null) {
-							oldFont = JFaceResources.getDefaultFont()
-                                    .getFontData();
-						}
-                        setPresentsDefaultValue(false);
-                        FontData[] newData = new FontData[1];
-                        newData[0] = font;
-                        updateFont(newData);
-                        fireValueChanged(VALUE, oldFont[0], font);
-                    }
-
-                }
-            });
-            changeFontButton.addDisposeListener(new DisposeListener() {
-                public void widgetDisposed(DisposeEvent event) {
-                    changeFontButton = null;
-                }
-            });
-            changeFontButton.setFont(parent.getFont());
-            setButtonLayoutData(changeFontButton);
-        } else {
-            checkParent(changeFontButton, parent);
-        }
-        return changeFontButton;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    public int getNumberOfControls() {
-        if (previewer == null) {
-			return 3;
-		}
-        
-        return 4;
-    }
-
-    /**
-     * Returns the preferred preview height. 
-     *
-     * @return the height, or <code>-1</code> if no previewer
-     *  is installed
-     */
-    public int getPreferredPreviewHeight() {
-        if (previewer == null) {
-			return -1;
-		}
-        return previewer.getPreferredExtent();
-    }
-
-    /**
-     * Returns the preview control for this field editor.
-     *
-     * @return the preview control
-     */
-    public Control getPreviewControl() {
-        if (previewer == null) {
-			return null;
-		}
-
-        return previewer.getControl();
-    }
-
-    /**
-     * Returns the value control for this field editor. The value control
-     * displays the currently selected font name.
-     * @param parent The Composite to create the viewer in if required
-     * @return the value control
-     */
-    protected Label getValueControl(Composite parent) {
-        if (valueControl == null) {
-            valueControl = new Label(parent, SWT.LEFT);
-            valueControl.setFont(parent.getFont());
-            valueControl.addDisposeListener(new DisposeListener() {
-                public void widgetDisposed(DisposeEvent event) {
-                    valueControl = null;
-                }
-            });
-        } else {
-            checkParent(valueControl, parent);
-        }
-        return valueControl;
-    }
-
-    /**
-     * Sets the text of the change button.
-     *
-     * @param text the new text
-     */
-    public void setChangeButtonText(String text) {
-        Assert.isNotNull(text);
-        changeButtonText = text;
-        if (changeFontButton != null) {
-			changeFontButton.setText(text);
-		}
-    }
-
-    /**
-     * Updates the change font button and the previewer to reflect the
-     * newly selected font.
-     * @param font The FontData[] to update with.
-     */
-    private void updateFont(FontData font[]) {
-        FontData[] bestFont = JFaceResources.getFontRegistry().filterData(
-                font, valueControl.getDisplay());
-
-        //if we have nothing valid do as best we can
-        if (bestFont == null) {
-			bestFont = getDefaultFontData();
-		}
-
-        //Now cache this value in the receiver
-        this.chosenFont = bestFont;
-
-        if (valueControl != null) {
-            valueControl.setText(StringConverter.asString(chosenFont[0]));
-        }
-        if (previewer != null) {
-            previewer.setFont(bestFont);
-        }
-    }
-
-    /**
-     * Store the default preference for the field
-     * being edited
-     */
-    protected void setToDefault() {
-        FontData[] defaultFontData = PreferenceConverter
-                .getDefaultFontDataArray(getPreferenceStore(),
-                        getPreferenceName());
-        PreferenceConverter.setValue(getPreferenceStore(), getPreferenceName(),
-                defaultFontData);
-    }
-
-    /**
-     * Get the system default font data.
-     * @return FontData[]
-     */
-    private FontData[] getDefaultFontData() {
-        return valueControl.getDisplay().getSystemFont().getFontData();
-    }
-
-    /*
-     * @see FieldEditor.setEnabled(boolean,Composite).
-     */
-    public void setEnabled(boolean enabled, Composite parent) {
-        super.setEnabled(enabled, parent);
-        getChangeControl(parent).setEnabled(enabled);
-        getValueControl(parent).setEnabled(enabled);
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IPersistentPreferenceStore.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IPersistentPreferenceStore.java
deleted file mode 100644
index e17c0dd..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IPersistentPreferenceStore.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import java.io.IOException;
-
-/**
- * IPersistentPreferenceStore is a preference store that can 
- * be saved.
- */
-public interface IPersistentPreferenceStore extends IPreferenceStore {
-
-    /**
-     * Saves the non-default-valued preferences known to this preference
-     * store to the file from which they were originally loaded.
-     *
-     * @exception java.io.IOException if there is a problem saving this store
-     */
-    public void save() throws IOException;
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IPreferenceNode.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IPreferenceNode.java
deleted file mode 100644
index b399cc6..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IPreferenceNode.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Interface to a node in a preference dialog. 
- * A preference node maintains a label and image used to display the
- * node in a preference dialog (usually in the form of a tree), 
- * as well as the preference page this node stands for.
- *
- * The node may use lazy creation for its page
- *
- * Note that all preference nodes must be dispose their resources.
- * The node must dispose the page managed by this node, and any SWT resources
- * allocated by this node (Images, Fonts, etc).
- * However the node itself may be reused.
- */
-public interface IPreferenceNode {
-    /**
-     * Adds the given preference node as a subnode of this
-     * preference node.
-     *
-     * @param node the node to add
-     */
-    public void add(IPreferenceNode node);
-
-    /**
-     * Creates the preference page for this node.
-     */
-    public void createPage();
-
-    /**
-     * Release the page managed by this node, and any SWT resources
-     * held onto by this node (Images, Fonts, etc).  
-     *
-     * Note that nodes are reused so this is not a call to dispose the
-     * node itself.
-     */
-    public void disposeResources();
-
-    /**
-     * Returns the subnode of this contribution node with the given node id.
-     *
-     * @param id the preference node id
-     * @return the subnode, or <code>null</code> if none
-     */
-    public IPreferenceNode findSubNode(String id);
-
-    /**
-     * Returns the id of this contribution node.
-     * This id identifies a contribution node relative to its parent.
-     *
-     * @return the node id
-     */
-    public String getId();
-
-    /**
-     * Returns the image used to present this node in a preference dialog.
-     *
-     * @return the image for this node, or <code>null</code>
-     *   if there is no image for this node
-     */
-    public Image getLabelImage();
-
-    /**
-     * Returns the text label used to present this node in a preference dialog.
-     *
-     * @return the text label for this node, or <code>null</code>
-     *   if there is no label for this node
-     */
-    public String getLabelText();
-
-    /**
-     * Returns the preference page for this node.
-     *
-     * @return the preference page
-     */
-    public IPreferencePage getPage();
-
-    /**
-     * Returns an iterator over the subnodes (immediate children)
-     * of this contribution node.
-     *
-     * @return an IPreferenceNode array containing the child nodes
-     */
-    public IPreferenceNode[] getSubNodes();
-
-    /**
-     * Removes the subnode of this preference node with the given node id.
-     *
-     * @param id the subnode id
-     * @return the removed subnode, or <code>null</code> if none
-     */
-    public IPreferenceNode remove(String id);
-
-    /**
-     * Removes the given preference node from the list of subnodes
-     * (immediate children) of this node.
-     *
-     * @param node the node to remove
-     * @return <code>true</code> if the node was removed,
-     *  and <code>false</code> otherwise
-     */
-    public boolean remove(IPreferenceNode node);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IPreferencePage.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IPreferencePage.java
deleted file mode 100644
index dd42905..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IPreferencePage.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.jface.dialogs.IDialogPage;
-import org.eclipse.swt.graphics.Point;
-
-/**
- * An interface for a preference page. This interface
- * is used primarily by the page's container 
- */
-public interface IPreferencePage extends IDialogPage {
-
-    /**
-     * Computes a size for this page's UI component. 
-     *
-     * @return the size of the preference page encoded as
-     *   <code>new Point(width,height)</code>, or 
-     *   <code>(0,0)</code> if the page doesn't currently have any UI component
-     */
-    public Point computeSize();
-
-    /**
-     * Returns whether this dialog page is in a valid state.
-     * 
-     * @return <code>true</code> if the page is in a valid state,
-     *   and <code>false</code> if invalid
-     */
-    public boolean isValid();
-
-    /**
-     * Checks whether it is alright to leave this page.
-     * 
-     * @return <code>false</code> to abort page flipping and the
-     *  have the current page remain visible, and <code>true</code>
-     *  to allow the page flip
-     */
-    public boolean okToLeave();
-
-    /**
-     * Notifies that the container of this preference page has been canceled.
-     * 
-     * @return <code>false</code> to abort the container's cancel 
-     *  procedure and <code>true</code> to allow the cancel to happen
-     */
-    public boolean performCancel();
-
-    /**
-     * Notifies that the OK button of this page's container has been pressed.
-     * 
-     * @return <code>false</code> to abort the container's OK
-     *  processing and <code>true</code> to allow the OK to happen
-     */
-    public boolean performOk();
-
-    /**
-     * Sets or clears the container of this page.
-     *
-     * @param preferencePageContainer the preference page container, or <code>null</code> 
-     */
-    public void setContainer(IPreferencePageContainer preferencePageContainer);
-
-    /**
-     * Sets the size of this page's UI component.
-     *
-     * @param size the size of the preference page encoded as
-     *   <code>new Point(width,height)</code>
-     */
-    public void setSize(Point size);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IPreferencePageContainer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IPreferencePageContainer.java
deleted file mode 100644
index 770e4f7..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IPreferencePageContainer.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-/**
- * An interface used by a preference page to talk to
- * its dialog.
- */
-public interface IPreferencePageContainer {
-    /**
-     * Returns the preference store.
-     *
-     * @return the preference store, or <code>null</code> if none
-     */
-    public IPreferenceStore getPreferenceStore();
-
-    /**
-     * Adjusts the enable state of the OK 
-     * button to reflect the state of the currently active 
-     * page in this container.
-     * <p>
-     * This method is called by the container itself
-     * when its preference page changes and may be called
-     * by the page at other times to force a button state
-     * update.
-     * </p>
-     */
-    public void updateButtons();
-
-    /**
-     * Updates the message (or error message) shown in the message line to 
-     * reflect the state of the currently active page in this container.
-     * <p>
-     * This method is called by the container itself
-     * when its preference page changes and may be called
-     * by the page at other times to force a message 
-     * update.
-     * </p>
-     */
-    public void updateMessage();
-
-    /**
-     * Updates the title to reflect the state of the 
-     * currently active page in this container.
-     * <p>
-     * This method is called by the container itself
-     * when its page changes and may be called
-     * by the page at other times to force a title  
-     * update.
-     * </p>
-     */
-    public void updateTitle();
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IPreferenceStore.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IPreferenceStore.java
deleted file mode 100644
index b15af78..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IPreferenceStore.java
+++ /dev/null
@@ -1,583 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.jface.util.IPropertyChangeListener;
-
-/**
- * The <code>IPreferenceStore</code> interface represents a table mapping
- * named preferences to values. If there is no value for a given name, 
- * then that preferences's default value is returned; and if there is no
- * default value for that preference, then a default-default value is returned.
- * The default-default values for the primitive types are as follows:
- * <ul>
- * 	<li><code>boolean</code> = <code>false</code></li>
- * 	<li><code>double</code> = <code>0.0</code></li>
- * 	<li><code>float</code> = <code>0.0f</code></li>
- * 	<li><code>int</code> = <code>0</code></li>
- *  <li><code>long</code> = <code>0</code></li>
- * 	<li><code>String</code> = <code>""</code> (the empty string)</li>
- * </ul>
- * <p>
- * Thus a preference store maintains two values for each of a set of
- * names: a current value and a default value.
- * The typical usage is to establish the defaults for all known preferences
- * and then restore previously stored values for preferences whose values 
- * were different from their defaults. After the current values of
- * the preferences have been modified, it is a simple matter to write
- * out only those preferences whose values are different from their defaults.
- * This two-tiered approach to saving and restoring preference setting
- * minimized the number of preferences that need to be persisted; indeed,
- * the normal starting state does not require storing any preferences
- * at all.
- * </p>
- * <p>
- * A property change event is reported whenever a preferences current
- * value actually changes (whether through <code>setValue</code>,
- * <code>setToDefault</code>, or other unspecified means). Note, however,
- * that manipulating default values (with <code>setDefault</code>)
- * does not cause such events to be reported.
- * </p>
- * <p>
- * Clients who need a preference store may implement this interface or 
- * instantiate the standard implementation <code>PreferenceStore</code>.
- * </p>
- *
- * @see PreferenceStore
- */
-public interface IPreferenceStore {
-
-    /**
-     * The default-default value for boolean preferences (<code>false</code>).
-     */
-    public static final boolean BOOLEAN_DEFAULT_DEFAULT = false;
-
-    /**
-     * The default-default value for double preferences (<code>0.0</code>).
-     */
-    public static final double DOUBLE_DEFAULT_DEFAULT = 0.0;
-
-    /**
-     * The default-default value for float preferences (<code>0.0f</code>).
-     */
-    public static final float FLOAT_DEFAULT_DEFAULT = 0.0f;
-
-    /**
-     * The default-default value for int preferences (<code>0</code>).
-     */
-    public static final int INT_DEFAULT_DEFAULT = 0;
-
-    /**
-     * The default-default value for long preferences (<code>0L</code>).
-     */
-    public static final long LONG_DEFAULT_DEFAULT = 0L;
-
-    /**
-     * The default-default value for String preferences (<code>""</code>).
-     */
-    public static final String STRING_DEFAULT_DEFAULT = ""; //$NON-NLS-1$
-
-    /**
-     * The string representation used for <code>true</code> (<code>"true"</code>).
-     */
-    public static final String TRUE = "true"; //$NON-NLS-1$
-
-    /**
-     * The string representation used for <code>false</code> (<code>"false"</code>).
-     */
-    public static final String FALSE = "false"; //$NON-NLS-1$
-
-    /**
-     * <p>
-     * Adds a property change listener to this preference store.
-     * </p>
-     * <p>
-     * <b>Note</b> The types of the oldValue and newValue of the
-     * generated PropertyChangeEvent are determined by whether
-     * or not the typed API in IPreferenceStore was called.
-     * If values are changed via setValue(name,type) the 
-     * values in the PropertyChangedEvent will be of that type.
-     * If they are set using a non typed API (i.e. #setToDefault
-     * or using the OSGI Preferences) the values will be unconverted
-     * Strings.
-     * </p>
-     * <p>
-     * A listener will be called in the same Thread
-     * that it is invoked in. Any Thread dependant listeners (such as 
-     * those who update an SWT widget) will need to update in the
-     * correct Thread. In the case of an SWT update you can update
-     * using Display#syncExec(Runnable) or Display#asyncExec(Runnable).
-     * </p>
-     * <p>  
-     * Likewise any application that updates an IPreferenceStore 
-     * from a Thread other than the UI Thread should be aware of
-     * any listeners that require an update in the UI Thread. 
-     * </p>
-     *
-     * @param listener a property change listener
-     * @see org.eclipse.jface.util.PropertyChangeEvent
-     * @see #setToDefault(String)
-     * @see #setValue(String, boolean)
-     * @see #setValue(String, double)
-     * @see #setValue(String, float)
-     * @see #setValue(String, int)
-     * @see #setValue(String, long)
-     * @see #setValue(String, String)
-     */
-    public void addPropertyChangeListener(IPropertyChangeListener listener);
-
-    /**
-     * Returns whether the named preference is known to this preference
-     * store.
-     *
-     * @param name the name of the preference
-     * @return <code>true</code> if either a current value or a default
-     *  value is known for the named preference, and <code>false</code> otherwise
-     */
-    public boolean contains(String name);
-
-    /**
-     * Fires a property change event corresponding to a change to the
-     * current value of the preference with the given name.
-     * <p>
-     * This method is provided on this interface to simplify the implementation 
-     * of decorators. There is normally no need to call this method since
-     * <code>setValue</code> and <code>setToDefault</code> report such
-     * events in due course. Implementations should funnel all preference
-     * changes through this method.
-     * </p>
-     *
-     * @param name the name of the preference, to be used as the property
-     *  in the event object
-     * @param oldValue the old value
-     * @param newValue the new value
-     */
-    public void firePropertyChangeEvent(String name, Object oldValue,
-            Object newValue);
-
-    /**
-     * Returns the current value of the boolean-valued preference with the
-     * given name.
-     * Returns the default-default value (<code>false</code>) if there
-     * is no preference with the given name, or if the current value 
-     * cannot be treated as a boolean.
-     *
-     * @param name the name of the preference
-     * @return the boolean-valued preference
-     */
-    public boolean getBoolean(String name);
-
-    /**
-     * Returns the default value for the boolean-valued preference
-     * with the given name.
-     * Returns the default-default value (<code>false</code>) if there
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a boolean.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public boolean getDefaultBoolean(String name);
-
-    /**
-     * Returns the default value for the double-valued preference
-     * with the given name.
-     * Returns the default-default value (<code>0.0</code>) if there
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a double.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public double getDefaultDouble(String name);
-
-    /**
-     * Returns the default value for the float-valued preference
-     * with the given name.
-     * Returns the default-default value (<code>0.0f</code>) if there
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a float.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public float getDefaultFloat(String name);
-
-    /**
-     * Returns the default value for the integer-valued preference
-     * with the given name.
-     * Returns the default-default value (<code>0</code>) if there
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as an integer.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public int getDefaultInt(String name);
-
-    /**
-     * Returns the default value for the long-valued preference
-     * with the given name.
-     * Returns the default-default value (<code>0L</code>) if there
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a long.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public long getDefaultLong(String name);
-
-    /**
-     * Returns the default value for the string-valued preference
-     * with the given name.
-     * Returns the default-default value (the empty string <code>""</code>) 
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a string.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public String getDefaultString(String name);
-
-    /**
-     * Returns the current value of the double-valued preference with the
-     * given name.
-     * Returns the default-default value (<code>0.0</code>) if there
-     * is no preference with the given name, or if the current value 
-     * cannot be treated as a double.
-     *
-     * @param name the name of the preference
-     * @return the double-valued preference
-     */
-    public double getDouble(String name);
-
-    /**
-     * Returns the current value of the float-valued preference with the
-     * given name.
-     * Returns the default-default value (<code>0.0f</code>) if there
-     * is no preference with the given name, or if the current value 
-     * cannot be treated as a float.
-     *
-     * @param name the name of the preference
-     * @return the float-valued preference
-     */
-    public float getFloat(String name);
-
-    /**
-     * Returns the current value of the integer-valued preference with the
-     * given name.
-     * Returns the default-default value (<code>0</code>) if there
-     * is no preference with the given name, or if the current value 
-     * cannot be treated as an integter.
-     *
-     * @param name the name of the preference
-     * @return the int-valued preference
-     */
-    public int getInt(String name);
-
-    /**
-     * Returns the current value of the long-valued preference with the
-     * given name.
-     * Returns the default-default value (<code>0L</code>) if there
-     * is no preference with the given name, or if the current value 
-     * cannot be treated as a long.
-     *
-     * @param name the name of the preference
-     * @return the long-valued preference
-     */
-    public long getLong(String name);
-
-    /**
-     * Returns the current value of the string-valued preference with the
-     * given name.
-     * Returns the default-default value (the empty string <code>""</code>)
-     * if there is no preference with the given name, or if the current value 
-     * cannot be treated as a string.
-     *
-     * @param name the name of the preference
-     * @return the string-valued preference
-     */
-    public String getString(String name);
-
-    /**
-     * Returns whether the current value of the preference with the given name
-     * has the default value.
-     *
-     * @param name the name of the preference
-     * @return <code>true</code> if the preference has a known default value
-     * and its current value is the same, and <code>false</code> otherwise
-     * (including the case where the preference is unknown to this store)
-     */
-    public boolean isDefault(String name);
-
-    /**
-     * Returns whether the current values in this property store
-     * require saving.
-     *
-     * @return <code>true</code> if at least one of values of 
-     *  the preferences known to this store has changed and 
-     *  requires saving, and <code>false</code> otherwise.
-     */
-    public boolean needsSaving();
-
-    /**
-     * Sets the current value of the preference with the given name to
-     * the given string value without sending a property change.
-     * <p>
-     * This method does not fire a property change event and 
-     * should only be used for setting internal preferences 
-     * that are not meant to be processed by listeners.
-     * Normal clients should instead call #setValue.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void putValue(String name, String value);
-
-    /**
-     * Removes the given listener from this preference store.
-     * Has no affect if the listener is not registered.
-     *
-     * @param listener a property change listener
-     */
-    public void removePropertyChangeListener(IPropertyChangeListener listener);
-
-    /**
-     * Sets the default value for the double-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new default value for the preference
-     */
-    public void setDefault(String name, double value);
-
-    /**
-     * Sets the default value for the float-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new default value for the preference
-     */
-    public void setDefault(String name, float value);
-
-    /**
-     * Sets the default value for the integer-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new default value for the preference
-     */
-    public void setDefault(String name, int value);
-
-    /**
-     * Sets the default value for the long-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new default value for the preference
-     */
-    public void setDefault(String name, long value);
-
-    /**
-     * Sets the default value for the string-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param defaultObject the new default value for the preference
-     */
-    public void setDefault(String name, String defaultObject);
-
-    /**
-     * Sets the default value for the boolean-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new default value for the preference
-     */
-    public void setDefault(String name, boolean value);
-
-    /**
-     * Sets the current value of the preference with the given name back
-     * to its default value.
-     * <p>
-     * Note that the preferred way of re-initializing a preference to the
-     * appropriate default value is to call <code>setToDefault</code>.
-     * This is implemented by removing the named value from the store, 
-     * thereby exposing the default value.
-     * </p>
-     *
-     * @param name the name of the preference
-     */
-    public void setToDefault(String name);
-
-    /**
-     * Sets the current value of the double-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, double value);
-
-    /**
-     * Sets the current value of the float-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, float value);
-
-    /**
-     * Sets the current value of the integer-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, int value);
-
-    /**
-     * Sets the current value of the long-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, long value);
-
-    /**
-     * Sets the current value of the string-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, String value);
-
-    /**
-     * Sets the current value of the boolean-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, boolean value);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IntegerFieldEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IntegerFieldEditor.java
deleted file mode 100644
index d9b45fb..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/IntegerFieldEditor.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     <sgandon@nds.com> - Fix for bug 109389 - IntegerFieldEditor
- *     does not fire property change all the time
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A field editor for an integer type preference.
- */
-public class IntegerFieldEditor extends StringFieldEditor {
-    private int minValidValue = 0;
-
-    private int maxValidValue = Integer.MAX_VALUE;
-
-    private static final int DEFAULT_TEXT_LIMIT = 10;
-
-    /**
-     * Creates a new integer field editor 
-     */
-    protected IntegerFieldEditor() {
-    }
-
-    /**
-     * Creates an integer field editor.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param parent the parent of the field editor's control
-     */
-    public IntegerFieldEditor(String name, String labelText, Composite parent) {
-        this(name, labelText, parent, DEFAULT_TEXT_LIMIT);
-    }
-
-    /**
-     * Creates an integer field editor.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param parent the parent of the field editor's control
-     * @param textLimit the maximum number of characters in the text.
-     */
-    public IntegerFieldEditor(String name, String labelText, Composite parent,
-            int textLimit) {
-        init(name, labelText);
-        setTextLimit(textLimit);
-        setEmptyStringAllowed(false);
-        setErrorMessage(JFaceResources
-                .getString("IntegerFieldEditor.errorMessage"));//$NON-NLS-1$
-        createControl(parent);
-    }
-
-    /**
-     * Sets the range of valid values for this field.
-     * 
-     * @param min the minimum allowed value (inclusive)
-     * @param max the maximum allowed value (inclusive)
-     */
-    public void setValidRange(int min, int max) {
-        minValidValue = min;
-        maxValidValue = max;
-        setErrorMessage(JFaceResources.format(
-        		"IntegerFieldEditor.errorMessageRange", //$NON-NLS-1$
-        		new Object[] { new Integer(min), new Integer(max) }));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on StringFieldEditor.
-     * Checks whether the entered String is a valid integer or not.
-     */
-    protected boolean checkState() {
-
-        Text text = getTextControl();
-
-        if (text == null) {
-			return false;
-		}
-
-        String numberString = text.getText();
-        try {
-            int number = Integer.valueOf(numberString).intValue();
-            if (number >= minValidValue && number <= maxValidValue) {
-				clearErrorMessage();
-				return true;
-			}
-            
-			showErrorMessage();
-			return false;
-			
-        } catch (NumberFormatException e1) {
-            showErrorMessage();
-        }
-
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doLoad() {
-        Text text = getTextControl();
-        if (text != null) {
-            int value = getPreferenceStore().getInt(getPreferenceName());
-            text.setText("" + value);//$NON-NLS-1$
-            oldValue = "" + value; //$NON-NLS-1$
-        }
-
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doLoadDefault() {
-        Text text = getTextControl();
-        if (text != null) {
-            int value = getPreferenceStore().getDefaultInt(getPreferenceName());
-            text.setText("" + value);//$NON-NLS-1$
-        }
-        valueChanged();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doStore() {
-        Text text = getTextControl();
-        if (text != null) {
-            Integer i = new Integer(text.getText());
-            getPreferenceStore().setValue(getPreferenceName(), i.intValue());
-        }
-    }
-
-    /**
-     * Returns this field editor's current value as an integer.
-     *
-     * @return the value
-     * @exception NumberFormatException if the <code>String</code> does not
-     *   contain a parsable integer
-     */
-    public int getIntValue() throws NumberFormatException {
-        return new Integer(getStringValue()).intValue();
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/JFacePreferences.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/JFacePreferences.java
deleted file mode 100644
index fd41cc5..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/JFacePreferences.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-/**
- * 
- * JFacePreferences is a class used to administer the preferences used by JFace
- * objects.
- */
-public final class JFacePreferences {
-
-	/**
-	 * Identifier for the Error Color
-	 */
-	public static final String ERROR_COLOR = "ERROR_COLOR"; //$NON-NLS-1$
-
-	/**
-	 * Identifier for the Hyperlink Color
-	 */
-	public static final String HYPERLINK_COLOR = "HYPERLINK_COLOR"; //$NON-NLS-1$
-
-	/**
-	 * Identifier for the Active Hyperlink Colour
-	 */
-	public static final String ACTIVE_HYPERLINK_COLOR = "ACTIVE_HYPERLINK_COLOR"; //$NON-NLS-1$
-
-	/**
-	 * Identifier for the color used to show extra informations in labels, as a
-	 * qualified name. For example in 'Foo.txt - myproject/bar', the qualifier
-	 * is '- myproject/bar'.
-	 * 
-	 * @since 3.4
-	 */
-	public static final String QUALIFIER_COLOR = "QUALIFIER_COLOR"; //$NON-NLS-1$
-
-	/**
-	 * Identifier for the color used to show label decorations For example in
-	 * 'Foo.txt [1.16]', the decoration is '[1.16]'.
-	 * 
-	 * @since 3.4
-	 */
-	public static final String DECORATIONS_COLOR = "DECORATIONS_COLOR"; //$NON-NLS-1$
-
-	/**
-	 * Identifier for the color used to counter informations For example in
-	 * 'Foo.txt (2 matches)', the counter information is '(2 matches)'.
-	 * 
-	 * @since 3.4
-	 */
-	public static final String COUNTER_COLOR = "COUNTER_COLOR"; //$NON-NLS-1$
-
-	
-	/**
-	 * Identifier for the color used for the background of content assist
-	 * popup dialogs.
-	 * 
-	 * @since 3.4
-	 */
-	public static final String CONTENT_ASSIST_BACKGROUND_COLOR = "CONTENT_ASSIST_BACKGROUND_COLOR"; //$NON-NLS-1$
-
-	/**
-	 * Identifier for the color used for the foreground of content assist
-	 * popup dialogs.
-	 * 
-	 * @since 3.4
-	 */
-	public static final String CONTENT_ASSIST_FOREGROUND_COLOR = "CONTENT_ASSIST_FOREGROUND_COLOR"; //$NON-NLS-1$
-
-
-
-	private static IPreferenceStore preferenceStore;
-
-	/**
-	 * Prevent construction.
-	 */
-	private JFacePreferences() {
-	}
-
-	/**
-	 * Return the preference store for the receiver.
-	 * 
-	 * @return IPreferenceStore or null
-	 */
-	public static IPreferenceStore getPreferenceStore() {
-		return preferenceStore;
-	}
-
-	/**
-	 * Set the preference store for the receiver.
-	 * 
-	 * @param store
-	 *            IPreferenceStore
-	 */
-	public static void setPreferenceStore(IPreferenceStore store) {
-		preferenceStore = store;
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/ListEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/ListEditor.java
deleted file mode 100644
index 6c74841..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/ListEditor.java
+++ /dev/null
@@ -1,510 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-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.List;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * An abstract field editor that manages a list of input values. 
- * The editor displays a list containing the values, buttons for
- * adding and removing values, and Up and Down buttons to adjust
- * the order of elements in the list.
- * <p>
- * Subclasses must implement the <code>parseString</code>,
- * <code>createList</code>, and <code>getNewInputObject</code>
- * framework methods.
- * </p>
- */
-public abstract class ListEditor extends FieldEditor {
-
-    /**
-     * The list widget; <code>null</code> if none
-     * (before creation or after disposal).
-     */
-    private List list;
-
-    /**
-     * The button box containing the Add, Remove, Up, and Down buttons;
-     * <code>null</code> if none (before creation or after disposal).
-     */
-    private Composite buttonBox;
-
-    /**
-     * The Add button.
-     */
-    private Button addButton;
-
-    /**
-     * The Remove button.
-     */
-    private Button removeButton;
-
-    /**
-     * The Up button.
-     */
-    private Button upButton;
-
-    /**
-     * The Down button.
-     */
-    private Button downButton;
-
-    /**
-     * The selection listener.
-     */
-    private SelectionListener selectionListener;
-
-    /**
-     * Creates a new list field editor 
-     */
-    protected ListEditor() {
-    }
-
-    /**
-     * Creates a list field editor.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param parent the parent of the field editor's control
-     */
-    protected ListEditor(String name, String labelText, Composite parent) {
-        init(name, labelText);
-        createControl(parent);
-    }
-
-    /**
-     * Notifies that the Add button has been pressed.
-     */
-    private void addPressed() {
-        setPresentsDefaultValue(false);
-        String input = getNewInputObject();
-
-        if (input != null) {
-            int index = list.getSelectionIndex();
-            if (index >= 0) {
-				list.add(input, index + 1);
-			} else {
-				list.add(input, 0);
-			}
-            selectionChanged();
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void adjustForNumColumns(int numColumns) {
-        Control control = getLabelControl();
-        ((GridData) control.getLayoutData()).horizontalSpan = numColumns;
-        ((GridData) list.getLayoutData()).horizontalSpan = numColumns - 1;
-    }
-
-    /**
-     * Creates the Add, Remove, Up, and Down button in the given button box.
-     *
-     * @param box the box for the buttons
-     */
-    private void createButtons(Composite box) {
-        addButton = createPushButton(box, "ListEditor.add");//$NON-NLS-1$
-        removeButton = createPushButton(box, "ListEditor.remove");//$NON-NLS-1$
-        upButton = createPushButton(box, "ListEditor.up");//$NON-NLS-1$
-        downButton = createPushButton(box, "ListEditor.down");//$NON-NLS-1$
-    }
-
-    /**
-     * Combines the given list of items into a single string.
-     * This method is the converse of <code>parseString</code>. 
-     * <p>
-     * Subclasses must implement this method.
-     * </p>
-     *
-     * @param items the list of items
-     * @return the combined string
-     * @see #parseString
-     */
-    protected abstract String createList(String[] items);
-
-    /**
-     * Helper method to create a push button.
-     * 
-     * @param parent the parent control
-     * @param key the resource name used to supply the button's label text
-     * @return Button
-     */
-    private Button createPushButton(Composite parent, String key) {
-        Button button = new Button(parent, SWT.PUSH);
-        button.setText(JFaceResources.getString(key));
-        button.setFont(parent.getFont());
-        GridData data = new GridData(GridData.FILL_HORIZONTAL);
-        int widthHint = convertHorizontalDLUsToPixels(button,
-                IDialogConstants.BUTTON_WIDTH);
-        data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT,
-                SWT.DEFAULT, true).x);
-        button.setLayoutData(data);
-        button.addSelectionListener(getSelectionListener());
-        return button;
-    }
-
-    /**
-     * Creates a selection listener.
-     */
-    public void createSelectionListener() {
-        selectionListener = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent event) {
-                Widget widget = event.widget;
-                if (widget == addButton) {
-                    addPressed();
-                } else if (widget == removeButton) {
-                    removePressed();
-                } else if (widget == upButton) {
-                    upPressed();
-                } else if (widget == downButton) {
-                    downPressed();
-                } else if (widget == list) {
-                    selectionChanged();
-                }
-            }
-        };
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doFillIntoGrid(Composite parent, int numColumns) {
-        Control control = getLabelControl(parent);
-        GridData gd = new GridData();
-        gd.horizontalSpan = numColumns;
-        control.setLayoutData(gd);
-
-        list = getListControl(parent);
-        gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.verticalAlignment = GridData.FILL;
-        gd.horizontalSpan = numColumns - 1;
-        gd.grabExcessHorizontalSpace = true;
-        list.setLayoutData(gd);
-
-        buttonBox = getButtonBoxControl(parent);
-        gd = new GridData();
-        gd.verticalAlignment = GridData.BEGINNING;
-        buttonBox.setLayoutData(gd);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doLoad() {
-        if (list != null) {
-            String s = getPreferenceStore().getString(getPreferenceName());
-            String[] array = parseString(s);
-            for (int i = 0; i < array.length; i++) {
-                list.add(array[i]);
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doLoadDefault() {
-        if (list != null) {
-            list.removeAll();
-            String s = getPreferenceStore().getDefaultString(
-                    getPreferenceName());
-            String[] array = parseString(s);
-            for (int i = 0; i < array.length; i++) {
-                list.add(array[i]);
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doStore() {
-        String s = createList(list.getItems());
-        if (s != null) {
-			getPreferenceStore().setValue(getPreferenceName(), s);
-		}
-    }
-
-    /**
-     * Notifies that the Down button has been pressed.
-     */
-    private void downPressed() {
-        swap(false);
-    }
-
-    /**
-     * Returns this field editor's button box containing the Add, Remove,
-     * Up, and Down button.
-     *
-     * @param parent the parent control
-     * @return the button box
-     */
-    public Composite getButtonBoxControl(Composite parent) {
-        if (buttonBox == null) {
-            buttonBox = new Composite(parent, SWT.NULL);
-            GridLayout layout = new GridLayout();
-            layout.marginWidth = 0;
-            buttonBox.setLayout(layout);
-            createButtons(buttonBox);
-            buttonBox.addDisposeListener(new DisposeListener() {
-                public void widgetDisposed(DisposeEvent event) {
-                    addButton = null;
-                    removeButton = null;
-                    upButton = null;
-                    downButton = null;
-                    buttonBox = null;
-                }
-            });
-
-        } else {
-            checkParent(buttonBox, parent);
-        }
-
-        selectionChanged();
-        return buttonBox;
-    }
-
-    /**
-     * Returns this field editor's list control.
-     *
-     * @param parent the parent control
-     * @return the list control
-     */
-    public List getListControl(Composite parent) {
-        if (list == null) {
-            list = new List(parent, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL
-                    | SWT.H_SCROLL);
-            list.setFont(parent.getFont());
-            list.addSelectionListener(getSelectionListener());
-            list.addDisposeListener(new DisposeListener() {
-                public void widgetDisposed(DisposeEvent event) {
-                    list = null;
-                }
-            });
-        } else {
-            checkParent(list, parent);
-        }
-        return list;
-    }
-
-    /**
-     * Creates and returns a new item for the list.
-     * <p>
-     * Subclasses must implement this method.
-     * </p>
-     *
-     * @return a new item
-     */
-    protected abstract String getNewInputObject();
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    public int getNumberOfControls() {
-        return 2;
-    }
-
-    /**
-     * Returns this field editor's selection listener.
-     * The listener is created if nessessary.
-     *
-     * @return the selection listener
-     */
-    private SelectionListener getSelectionListener() {
-        if (selectionListener == null) {
-			createSelectionListener();
-		}
-        return selectionListener;
-    }
-
-    /**
-     * Returns this field editor's shell.
-     * <p>
-     * This method is internal to the framework; subclassers should not call
-     * this method.
-     * </p>
-     *
-     * @return the shell
-     */
-    protected Shell getShell() {
-        if (addButton == null) {
-			return null;
-		}
-        return addButton.getShell();
-    }
-
-    /**
-     * Splits the given string into a list of strings.
-     * This method is the converse of <code>createList</code>. 
-     * <p>
-     * Subclasses must implement this method.
-     * </p>
-     *
-     * @param stringList the string
-     * @return an array of <code>String</code>
-     * @see #createList
-     */
-    protected abstract String[] parseString(String stringList);
-
-    /**
-     * Notifies that the Remove button has been pressed.
-     */
-    private void removePressed() {
-        setPresentsDefaultValue(false);
-        int index = list.getSelectionIndex();
-        if (index >= 0) {
-            list.remove(index);
-            selectionChanged();
-        }
-    }
-
-	/**
-	 * Invoked when the selection in the list has changed.
-	 * 
-	 * <p>
-	 * The default implementation of this method utilizes the selection index
-	 * and the size of the list to toggle the enablement of the up, down and
-	 * remove buttons.
-	 * </p>
-	 * 
-	 * <p>
-	 * Sublcasses may override.
-	 * </p>
-	 * 
-	 * @since 3.5
-	 */
-    protected void selectionChanged() {
-
-        int index = list.getSelectionIndex();
-        int size = list.getItemCount();
-
-        removeButton.setEnabled(index >= 0);
-        upButton.setEnabled(size > 1 && index > 0);
-        downButton.setEnabled(size > 1 && index >= 0 && index < size - 1);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    public void setFocus() {
-        if (list != null) {
-            list.setFocus();
-        }
-    }
-
-    /**
-     * Moves the currently selected item up or down.
-     *
-     * @param up <code>true</code> if the item should move up,
-     *  and <code>false</code> if it should move down
-     */
-    private void swap(boolean up) {
-        setPresentsDefaultValue(false);
-        int index = list.getSelectionIndex();
-        int target = up ? index - 1 : index + 1;
-
-        if (index >= 0) {
-            String[] selection = list.getSelection();
-            Assert.isTrue(selection.length == 1);
-            list.remove(index);
-            list.add(selection[0], target);
-            list.setSelection(target);
-        }
-        selectionChanged();
-    }
-
-    /**
-     * Notifies that the Up button has been pressed.
-     */
-    private void upPressed() {
-        swap(true);
-    }
-
-    /*
-     * @see FieldEditor.setEnabled(boolean,Composite).
-     */
-    public void setEnabled(boolean enabled, Composite parent) {
-        super.setEnabled(enabled, parent);
-        getListControl(parent).setEnabled(enabled);
-        addButton.setEnabled(enabled);
-        removeButton.setEnabled(enabled);
-        upButton.setEnabled(enabled);
-        downButton.setEnabled(enabled);
-    }
-    
-    /**
-     * Return the Add button.  
-     * 
-     * @return the button
-     * @since 3.5
-     */
-    protected Button getAddButton() {
-    	return addButton;
-    }
-    
-    /**
-     * Return the Remove button.  
-     * 
-     * @return the button
-     * @since 3.5
-     */
-    protected Button getRemoveButton() {
-    	return removeButton;
-    }
-    
-    /**
-     * Return the Up button.  
-     * 
-     * @return the button
-     * @since 3.5
-     */
-    protected Button getUpButton() {
-    	return upButton;
-    }
-    
-    /**
-     * Return the Down button.  
-     * 
-     * @return the button
-     * @since 3.5
-     */
-    protected Button getDownButton() {
-    	return downButton;
-    }
-    
-    /**
-     * Return the List.
-     * 
-     * @return the list
-     * @since 3.5
-     */
-    protected List getList() {
-    	return list;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PathEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PathEditor.java
deleted file mode 100644
index 606a97e..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PathEditor.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.StringTokenizer;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-
-/**
- * A field editor to edit directory paths.
- */
-public class PathEditor extends ListEditor {
-
-    /**
-     * The last path, or <code>null</code> if none.
-     */
-    private String lastPath;
-
-    /**
-     * The special label text for directory chooser, 
-     * or <code>null</code> if none.
-     */
-    private String dirChooserLabelText;
-
-    /**
-     * Creates a new path field editor 
-     */
-    protected PathEditor() {
-    }
-
-    /**
-     * Creates a path field editor.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param dirChooserLabelText the label text displayed for the directory chooser
-     * @param parent the parent of the field editor's control
-     */
-    public PathEditor(String name, String labelText,
-            String dirChooserLabelText, Composite parent) {
-        init(name, labelText);
-        this.dirChooserLabelText = dirChooserLabelText;
-        createControl(parent);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ListEditor.
-     * Creates a single string from the given array by separating each
-     * string with the appropriate OS-specific path separator.
-     */
-    protected String createList(String[] items) {
-        StringBuffer path = new StringBuffer("");//$NON-NLS-1$
-
-        for (int i = 0; i < items.length; i++) {
-            path.append(items[i]);
-            path.append(File.pathSeparator);
-        }
-        return path.toString();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ListEditor.
-     * Creates a new path element by means of a directory dialog.
-     */
-    protected String getNewInputObject() {
-
-        DirectoryDialog dialog = new DirectoryDialog(getShell());
-        if (dirChooserLabelText != null) {
-			dialog.setMessage(dirChooserLabelText);
-		}
-        if (lastPath != null) {
-            if (new File(lastPath).exists()) {
-				dialog.setFilterPath(lastPath);
-			}
-        }
-        String dir = dialog.open();
-        if (dir != null) {
-            dir = dir.trim();
-            if (dir.length() == 0) {
-				return null;
-			}
-            lastPath = dir;
-        }
-        return dir;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ListEditor.
-     */
-    protected String[] parseString(String stringList) {
-        StringTokenizer st = new StringTokenizer(stringList, File.pathSeparator
-                + "\n\r");//$NON-NLS-1$
-        ArrayList v = new ArrayList();
-        while (st.hasMoreElements()) {
-            v.add(st.nextElement());
-        }
-        return (String[]) v.toArray(new String[v.size()]);
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceContentProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceContentProvider.java
deleted file mode 100644
index 6e8ebe7..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceContentProvider.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Provides a tree model for <code>PreferenceManager</code> content.
- * 
- * @since 3.0
- */
-public class PreferenceContentProvider implements ITreeContentProvider {
-
-    private PreferenceManager manager;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-     */
-    public void dispose() {
-        manager = null;
-    }
-
-    /**
-     * Find the parent of the provided node.  Will search recursivly through the
-     * preference tree.
-     * 
-     * @param parent the possible parent node.
-     * @param target the target child node.
-     * @return the parent node of the child node.
-     */
-    private IPreferenceNode findParent(IPreferenceNode parent,
-            IPreferenceNode target) {
-        if (parent.getId().equals(target.getId())) {
-			return null;
-		}
-
-        IPreferenceNode found = parent.findSubNode(target.getId());
-        if (found != null) {
-			return parent;
-		}
-
-        IPreferenceNode[] children = parent.getSubNodes();
-
-        for (int i = 0; i < children.length; i++) {
-            found = findParent(children[i], target);
-            if (found != null) {
-				return found;
-			}
-        }
-
-        return null;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-     */
-    public Object[] getChildren(Object parentElement) {//must be an instance of <code>IPreferenceNode</code>.
-        return ((IPreferenceNode) parentElement).getSubNodes();
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-     */
-    public Object[] getElements(Object inputElement) {// must be an instance of <code>PreferenceManager</code>.
-        return getChildren(((PreferenceManager) inputElement).getRoot());
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-     */
-    public Object getParent(Object element) {//must be an instance of <code>IPreferenceNode</code>.
-        IPreferenceNode targetNode = (IPreferenceNode) element;
-        IPreferenceNode root = manager.getRoot();
-        return findParent(root, targetNode);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-     */
-    public boolean hasChildren(Object element) {
-        return getChildren(element).length > 0;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-     */
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-        manager = (PreferenceManager) newInput;
-    }
-	/**
-	 * Set the manager for the preferences.
-	 * @param manager The manager to set.
-	 * 
-	 * @since 3.1
-	 */
-	protected void setManager(PreferenceManager manager) {
-		this.manager = manager;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceConverter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceConverter.java
deleted file mode 100644
index 5e7cfb8..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceConverter.java
+++ /dev/null
@@ -1,555 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import java.util.Arrays;
-import java.util.StringTokenizer;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.resource.StringConverter;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * A utility class for dealing with preferences whose values are
- * common SWT objects (color, points, rectangles, and font data).
- * The static methods on this class handle the conversion between
- * the SWT objects and their string representations.
- * <p>
- * Usage:
- * <pre>
- * IPreferenceStore store = ...;
- * PreferenceConverter.setValue(store, "bg", new RGB(127,127,127));
- * ...
- * RBG bgColor = PreferenceConverter.getValue(store, "bg");
- * </pre>
- * </p>
- * <p>
- * This class contains static methods and fields only and cannot 
- * be instantiated.
- * </p>
- * Note: touching this class has the side effect of creating a display (static initializer).
- * @noinstantiate This class is not intended to be instantiated by clients.
- */
-public class PreferenceConverter {
-
-    /**
-     * The default-default value for point preferences
-     * (the origin, <code>(0,0)</code>).
-     */
-    public static final Point POINT_DEFAULT_DEFAULT = new Point(0, 0);
-
-    /**
-     * The default-default value for rectangle preferences
-     * (the empty rectangle <code>(0,0,0,0)</code>).
-     */
-    public static final Rectangle RECTANGLE_DEFAULT_DEFAULT = new Rectangle(0,
-            0, 0, 0);
-
-    /**
-     * The default-default value for color preferences 
-     * (black, <code>RGB(0,0,0)</code>).
-     */
-    public static final RGB COLOR_DEFAULT_DEFAULT = new RGB(0, 0, 0);
-
-    private static final String ENTRY_SEPARATOR = ";"; //$NON-NLS-1$
-
-    /**
-     * The default-default value for <code>FontData[]</code> preferences.
-     */
-    public static final FontData[] FONTDATA_ARRAY_DEFAULT_DEFAULT;
-
-    /**
-     * The default-default value for <code>FontData</code> preferences.
-     */
-    public static final FontData FONTDATA_DEFAULT_DEFAULT;
-    static {
-		Display display = Display.getCurrent();
-		if (display == null) {
-			display = Display.getDefault ();
-		}
-		
-        FONTDATA_ARRAY_DEFAULT_DEFAULT = display.getSystemFont().getFontData();
-        /**
-         * The default-default value for <code>FontData</code> preferences.
-         * This is left in for compatibility purposes. It is recommended that
-         * FONTDATA_ARRAY_DEFAULT_DEFAULT is actually used.
-         */
-
-        FONTDATA_DEFAULT_DEFAULT = FONTDATA_ARRAY_DEFAULT_DEFAULT[0];
-    }
-
-    /* (non-Javadoc)
-     * private constructor to prevent instantiation.
-     */
-    private PreferenceConverter() {
-        //no-op
-    }
-
-    /**
-     * Helper method to construct a color from the given string.
-     * @param value the indentifier for the color
-     * @return RGB
-     */
-    private static RGB basicGetColor(String value) {
-
-        if (IPreferenceStore.STRING_DEFAULT_DEFAULT.equals(value)) {
-			return COLOR_DEFAULT_DEFAULT;
-		}
-
-        RGB color = StringConverter.asRGB(value, null);
-        if (color == null) {
-			return COLOR_DEFAULT_DEFAULT;
-		}
-        return color;
-    }
-
-    /**
-     * Helper method to construct a <code>FontData</code> from the given string.
-     * String is in the form FontData;FontData; in order that
-     * multiple FontDatas can be defined.
-     * @param value the identifier for the font
-     * @return FontData[]
-     * 
-     * @since 3.0
-     */
-    public static FontData[] basicGetFontData(String value) {
-        if (IPreferenceStore.STRING_DEFAULT_DEFAULT.equals(value)) {
-			return FONTDATA_ARRAY_DEFAULT_DEFAULT;
-		}
-
-        //Read in all of them to get the value
-        StringTokenizer tokenizer = new StringTokenizer(value, ENTRY_SEPARATOR);
-        int numTokens = tokenizer.countTokens();
-        FontData[] fontData = new FontData[numTokens];
-
-        for (int i = 0; i < numTokens; i++) {
-            try {
-                fontData[i] = new FontData(tokenizer.nextToken());
-            } catch (SWTException error) {
-                return FONTDATA_ARRAY_DEFAULT_DEFAULT;
-            } catch (IllegalArgumentException error) {
-                return FONTDATA_ARRAY_DEFAULT_DEFAULT;
-            }
-        }
-        return fontData;
-    }
-
-    /**
-     * Reads the supplied string and returns its corresponding
-     * FontData. If it cannot be read then the default FontData
-     * will be returned.
-     * 
-     * @param fontDataValue the string value for the font data  
-     * @return the font data
-     */
-    public static FontData[] readFontData(String fontDataValue) {
-        return basicGetFontData(fontDataValue);
-    }
-
-    /**
-     * Helper method to construct a point from the given string.
-     * @param value
-     * @return Point
-     */
-    private static Point basicGetPoint(String value) {
-        Point dp = new Point(POINT_DEFAULT_DEFAULT.x, POINT_DEFAULT_DEFAULT.y);
-        if (IPreferenceStore.STRING_DEFAULT_DEFAULT.equals(value)) {
-			return dp;
-		}
-        return StringConverter.asPoint(value, dp);
-    }
-
-    /**
-     *  Helper method to construct a rectangle from the given string.
-     * @param value
-     * @return Rectangle
-     */
-    private static Rectangle basicGetRectangle(String value) {
-        // We can't just return RECTANGLE_DEFAULT_DEFAULT because
-        // a rectangle object doesn't have value semantik.
-        Rectangle dr = new Rectangle(RECTANGLE_DEFAULT_DEFAULT.x,
-                RECTANGLE_DEFAULT_DEFAULT.y, RECTANGLE_DEFAULT_DEFAULT.width,
-                RECTANGLE_DEFAULT_DEFAULT.height);
-
-        if (IPreferenceStore.STRING_DEFAULT_DEFAULT.equals(value)) {
-			return dr;
-		}
-        return StringConverter.asRectangle(value, dr);
-    }
-
-    /**
-     * Returns the current value of the color-valued preference with the
-     * given name in the given preference store.
-     * Returns the default-default value (<code>COLOR_DEFAULT_DEFAULT</code>) 
-     * if there is no preference with the given name, or if the current value 
-     * cannot be treated as a color.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @return the color-valued preference
-     */
-    public static RGB getColor(IPreferenceStore store, String name) {
-        return basicGetColor(store.getString(name));
-    }
-
-    /**
-     * Returns the default value for the color-valued preference
-     * with the given name in the given preference store.
-     * Returns the default-default value (<code>COLOR_DEFAULT_DEFAULT</code>) 
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a color.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @return the default value of the preference
-     */
-    public static RGB getDefaultColor(IPreferenceStore store, String name) {
-        return basicGetColor(store.getDefaultString(name));
-    }
-
-    /**
-     * Returns the default value array for the font-valued preference
-     * with the given name in the given preference store.
-     * Returns the default-default value (<code>FONTDATA_ARRAY_DEFAULT_DEFAULT</code>) 
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as font data.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @return the default value of the preference
-     */
-    public static FontData[] getDefaultFontDataArray(IPreferenceStore store,
-            String name) {
-        return basicGetFontData(store.getDefaultString(name));
-    }
-
-    /**
-     * Returns a single default value for the font-valued preference
-     * with the given name in the given preference store.
-     * Returns the default-default value (<code>FONTDATA_DEFAULT_DEFAULT</code>) 
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as font data.
-     * This method is provided for backwards compatibility. It is
-     * recommended that <code>getDefaultFontDataArray</code> is
-     * used instead.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @return the default value of the preference
-     */
-    public static FontData getDefaultFontData(IPreferenceStore store,
-            String name) {
-        return getDefaultFontDataArray(store, name)[0];
-    }
-
-    /**
-     * Returns the default value for the point-valued preference
-     * with the given name in the given preference store.
-     * Returns the default-default value (<code>POINT_DEFAULT_DEFAULT</code>) 
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a point.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @return the default value of the preference
-     */
-    public static Point getDefaultPoint(IPreferenceStore store, String name) {
-        return basicGetPoint(store.getDefaultString(name));
-    }
-
-    /**
-     * Returns the default value for the rectangle-valued preference
-     * with the given name in the given preference store.
-     * Returns the default-default value (<code>RECTANGLE_DEFAULT_DEFAULT</code>) 
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a rectangle.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @return the default value of the preference
-     */
-    public static Rectangle getDefaultRectangle(IPreferenceStore store,
-            String name) {
-        return basicGetRectangle(store.getDefaultString(name));
-    }
-
-    /**
-     * Returns the current value of the font-valued preference with the
-     * given name in the given preference store.
-     * Returns the default-default value (<code>FONTDATA_ARRAY_DEFAULT_DEFAULT</code>) 
-     * if there is no preference with the given name, or if the current value 
-     * cannot be treated as font data.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @return the font-valued preference
-     */
-    public static FontData[] getFontDataArray(IPreferenceStore store,
-            String name) {
-        return basicGetFontData(store.getString(name));
-    }
-
-    /**
-     * Returns the current value of the first entry of the
-     * font-valued preference with the
-     * given name in the given preference store.
-     * Returns the default-default value (<code>FONTDATA_ARRAY_DEFAULT_DEFAULT</code>) 
-     * if there is no preference with the given name, or if the current value 
-     * cannot be treated as font data.
-     * This API is provided for backwards compatibility. It is
-     * recommended that <code>getFontDataArray</code> is used instead.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @return the font-valued preference
-     */
-    public static FontData getFontData(IPreferenceStore store, String name) {
-        return getFontDataArray(store, name)[0];
-    }
-
-    /**
-     * Returns the current value of the point-valued preference with the
-     * given name in the given preference store.
-     * Returns the default-default value (<code>POINT_DEFAULT_DEFAULT</code>) 
-     * if there is no preference with the given name, or if the current value 
-     * cannot be treated as a point.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @return the point-valued preference
-     */
-    public static Point getPoint(IPreferenceStore store, String name) {
-        return basicGetPoint(store.getString(name));
-    }
-
-    /**
-     * Returns the current value of the rectangle-valued preference with the
-     * given name in the given preference store.
-     * Returns the default-default value (<code>RECTANGLE_DEFAULT_DEFAULT</code>) 
-     * if there is no preference with the given name, or if the current value 
-     * cannot be treated as a rectangle.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @return the rectangle-valued preference
-     */
-    public static Rectangle getRectangle(IPreferenceStore store, String name) {
-        return basicGetRectangle(store.getString(name));
-    }
-
-    /**
-     * Sets the default value of the preference with the given name
-     * in the given preference store. As FontDatas are stored as 
-     * arrays this method is only provided for backwards compatibility.
-     * Use <code>setDefault(IPreferenceStore, String, FontData[])</code>
-     * instead.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @param value the new default value of the preference
-     */
-    public static void setDefault(IPreferenceStore store, String name,
-            FontData value) {
-        FontData[] fontDatas = new FontData[1];
-        fontDatas[0] = value;
-        setDefault(store, name, fontDatas);
-    }
-
-    /**
-     * Sets the default value of the preference with the given name
-     * in the given preference store.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @param value the new default value of the preference
-     */
-    public static void setDefault(IPreferenceStore store, String name,
-            FontData[] value) {
-        store.setDefault(name, getStoredRepresentation(value));
-    }
-
-    /**
-     * Sets the default value of the preference with the given name
-     * in the given preference store.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @param value the new default value of the preference
-     */
-    public static void setDefault(IPreferenceStore store, String name,
-            Point value) {
-        store.setDefault(name, StringConverter.asString(value));
-    }
-
-    /**
-     * Sets the default value of the preference with the given name
-     * in the given preference store.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @param value the new default value of the preference
-     */
-    public static void setDefault(IPreferenceStore store, String name,
-            Rectangle value) {
-        store.setDefault(name, StringConverter.asString(value));
-    }
-
-    /**
-     * Sets the default value of the preference with the given name
-     * in the given preference store.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @param value the new default value of the preference
-     */
-    public static void setDefault(IPreferenceStore store, String name, RGB value) {
-        store.setDefault(name, StringConverter.asString(value));
-    }
-
-    /**
-     * Sets the current value of the preference with the given name
-     * in the given preference store. 
-     * <p>
-     * Included for backwards compatibility.  This method is equivalent to
-     * </code>setValue(store, name, new FontData[]{value})</code>.
-     * </p>
-     * 
-     * @param store the preference store
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public static void setValue(IPreferenceStore store, String name,
-            FontData value) {
-        setValue(store, name, new FontData[] { value });
-    }
-
-    /**
-     * Sets the current value of the preference with the given name
-     * in the given preference store. This method also sets the corresponding
-     * key in the JFace font registry to the value and fires a 
-     * property change event to listeners on the preference store.
-     * 
-     * <p>
-     * Note that this API does not update any other settings that may
-     * be dependant upon it. Only the value in the preference store 
-     * and in the font registry is updated.
-     * </p> 
-     * @param store the preference store
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     * 
-     * @see #putValue(IPreferenceStore, String, FontData[])
-     */
-    public static void setValue(IPreferenceStore store, String name,
-            FontData[] value) {
-        FontData[] oldValue = getFontDataArray(store, name);
-        // see if the font has changed
-        if (!Arrays.equals(oldValue, value)) {
-            store.putValue(name, getStoredRepresentation(value));
-            JFaceResources.getFontRegistry().put(name, value);
-            store.firePropertyChangeEvent(name, oldValue, value);
-        }
-    }
-
-    /**
-     * Sets the current value of the preference with the given name
-     * in the given preference store. This method does not update
-     * the font registry or fire a property change event.
-     * 
-     * @param store the preference store
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     * 
-     * @see PreferenceConverter#setValue(IPreferenceStore, String, FontData[])
-     */
-    public static void putValue(IPreferenceStore store, String name,
-            FontData[] value) {
-        FontData[] oldValue = getFontDataArray(store, name);
-        // see if the font has changed
-        if (!Arrays.equals(oldValue, value)) {
-            store.putValue(name, getStoredRepresentation(value));
-        }
-    }
-
-    /**
-     * Returns the stored representation of the given array of FontData objects.
-     * The stored representation has the form FontData;FontData;
-     * Only includes the non-null entries.
-     * 
-     * @param fontData the array of FontData objects
-     * @return the stored representation of the FontData objects
-     * @since 3.0
-     */
-    public static String getStoredRepresentation(FontData[] fontData) {
-        StringBuffer buffer = new StringBuffer();
-        for (int i = 0; i < fontData.length; i++) {
-            if (fontData[i] != null) {
-                buffer.append(fontData[i].toString());
-                buffer.append(ENTRY_SEPARATOR);
-            }
-        }
-        return buffer.toString();
-    }
-
-    /**
-     * Sets the current value of the preference with the given name
-     * in the given preference store.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public static void setValue(IPreferenceStore store, String name, Point value) {
-        Point oldValue = getPoint(store, name);
-        if (oldValue == null || !oldValue.equals(value)) {
-            store.putValue(name, StringConverter.asString(value));
-            store.firePropertyChangeEvent(name, oldValue, value);
-        }
-    }
-
-    /**
-     * Sets the current value of the preference with the given name
-     * in the given preference store.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public static void setValue(IPreferenceStore store, String name,
-            Rectangle value) {
-        Rectangle oldValue = getRectangle(store, name);
-        if (oldValue == null || !oldValue.equals(value)) {
-            store.putValue(name, StringConverter.asString(value));
-            store.firePropertyChangeEvent(name, oldValue, value);
-        }
-    }
-
-    /**
-     * Sets the current value of the preference with the given name
-     * in the given preference store.
-     *
-     * @param store the preference store
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public static void setValue(IPreferenceStore store, String name, RGB value) {
-        RGB oldValue = getColor(store, name);
-        if (oldValue == null || !oldValue.equals(value)) {
-            store.putValue(name, StringConverter.asString(value));
-            store.firePropertyChangeEvent(name, oldValue, value);
-        }
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceDialog.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceDialog.java
deleted file mode 100644
index 7e6e5db..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceDialog.java
+++ /dev/null
@@ -1,1528 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Teddy Walker <teddy.walker@googlemail.com> 
- *     	- Bug 188056 [Preferences] PreferencePages have to less indent in PreferenceDialog
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.DialogMessageArea;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.IPageChangeProvider;
-import org.eclipse.jface.dialogs.IPageChangedListener;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.PageChangedEvent;
-import org.eclipse.jface.dialogs.TrayDialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.custom.ScrolledComposite;
-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.HelpEvent;
-import org.eclipse.swt.events.HelpListener;
-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.Font;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-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.Layout;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Sash;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-
-/**
- * A preference dialog is a hierarchical presentation of preference pages. Each
- * page is represented by a node in the tree shown on the left hand side of the
- * dialog; when a node is selected, the corresponding page is shown on the right
- * hand side.
- */
-public class PreferenceDialog extends TrayDialog implements IPreferencePageContainer, IPageChangeProvider {
-	/**
-	 * Layout for the page container.
-	 *  
-	 */
-	private class PageLayout extends Layout {
-		public Point computeSize(Composite composite, int wHint, int hHint, boolean force) {
-			if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT) {
-				return new Point(wHint, hHint);
-			}
-			int x = minimumPageSize.x;
-			int y = minimumPageSize.y;
-			Control[] children = composite.getChildren();
-			for (int i = 0; i < children.length; i++) {
-				Point size = children[i].computeSize(SWT.DEFAULT, SWT.DEFAULT, force);
-				x = Math.max(x, size.x);
-				y = Math.max(y, size.y);
-			}
-			
-			//As pages can implement thier own computeSize
-			//take it into account
-			if(currentPage != null){
-				Point size = currentPage.computeSize();
-				x = Math.max(x, size.x);
-				y = Math.max(y, size.y);
-			}
-			
-			if (wHint != SWT.DEFAULT) {
-				x = wHint;
-			}
-			if (hHint != SWT.DEFAULT) {
-				y = hHint;
-			}
-			return new Point(x, y);
-		}
-
-		public void layout(Composite composite, boolean force) {
-			Rectangle rect = composite.getClientArea();
-			Control[] children = composite.getChildren();
-			for (int i = 0; i < children.length; i++) {
-				children[i].setSize(rect.width, rect.height);
-			}
-		}
-	}
-
-	//The id of the last page that was selected
-	private static String lastPreferenceId = null;
-
-	//The last known tree width
-	private static int lastTreeWidth = 180;
-
-	/**
-	 * Indentifier for the error image
-	 */
-	public static final String PREF_DLG_IMG_TITLE_ERROR = DLG_IMG_MESSAGE_ERROR;
-
-	/**
-	 * Title area fields
-	 */
-	public static final String PREF_DLG_TITLE_IMG = "preference_dialog_title_image"; //$NON-NLS-1$
-
-	/**
-	 * Return code used when dialog failed
-	 */
-	protected static final int FAILED = 2;
-	
-	/**
-	 * The current preference page, or <code>null</code> if there is none.
-	 */
-	private IPreferencePage currentPage;
-
-	private DialogMessageArea messageArea;
-
-	private Point lastShellSize;
-
-	private IPreferenceNode lastSuccessfulNode;
-
-	/**
-	 * The minimum page size; 400 by 400 by default.
-	 * 
-	 * @see #setMinimumPageSize(Point)
-	 */
-	private Point minimumPageSize = new Point(400, 400);
-
-	/**
-	 * The OK button.
-	 */
-	private Button okButton;
-
-	/**
-	 * The Composite in which a page is shown.
-	 */
-	private Composite pageContainer;
-
-	/**
-	 * The preference manager.
-	 */
-	private PreferenceManager preferenceManager;
-
-	/**
-	 * Flag for the presence of the error message.
-	 */
-	private boolean showingError = false;
-
-	/**
-	 * Preference store, initially <code>null</code> meaning none.
-	 * 
-	 * @see #setPreferenceStore
-	 */
-	private IPreferenceStore preferenceStore;
-
-	private Composite titleArea;
-
-	/**
-	 * The tree viewer.
-	 */
-	private TreeViewer treeViewer;
-	
-    private ListenerList pageChangedListeners = new ListenerList();
-
-    /**
-     *  Composite with a FormLayout to contain the title area
-     */
-    Composite formTitleComposite;
-
-	private ScrolledComposite scrolled;
-
-	/**
-	 * Creates a new preference dialog under the control of the given preference
-	 * manager.
-	 * 
-	 * @param parentShell
-	 *            the parent shell
-	 * @param manager
-	 *            the preference manager
-	 */
-	public PreferenceDialog(Shell parentShell, PreferenceManager manager) {
-		super(parentShell);
-		preferenceManager = manager;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
-	 */
-	protected void buttonPressed(int buttonId) {
-		switch (buttonId) {
-		case IDialogConstants.OK_ID: {
-			okPressed();
-			return;
-		}
-		case IDialogConstants.CANCEL_ID: {
-			cancelPressed();
-			return;
-		}
-		case IDialogConstants.HELP_ID: {
-			helpPressed();
-			return;
-		}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
-	 */
-	protected void cancelPressed() {
-		// Inform all pages that we are cancelling
-		Iterator nodes = preferenceManager.getElements(PreferenceManager.PRE_ORDER).iterator();
-		while (nodes.hasNext()) {
-			final IPreferenceNode node = (IPreferenceNode) nodes.next();
-			if (getPage(node) != null) {
-				SafeRunnable.run(new SafeRunnable() {
-					public void run() {
-						if (!getPage(node).performCancel()) {
-							return;
-						}
-					}
-				});
-			}
-		}
-		setReturnCode(CANCEL);
-		close();
-	}
-
-	/**
-	 * Clear the last selected node. This is so that we not chache the last
-	 * selection in case of an error.
-	 */
-	void clearSelectedNode() {
-		setSelectedNodePreference(null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#close()
-	 */
-	public boolean close() {
-		
-		//Do this is in a SafeRunnable as it may run client code
-		SafeRunnable runnable = new SafeRunnable(){
-			/* (non-Javadoc)
-			 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-			 */
-			public void run() throws Exception {
-				List nodes = preferenceManager.getElements(PreferenceManager.PRE_ORDER);
-				for (int i = 0; i < nodes.size(); i++) {
-					IPreferenceNode node = (IPreferenceNode) nodes.get(i);
-					node.disposeResources();
-				}
-				
-			}
-			
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.util.SafeRunnable#handleException(java.lang.Throwable)
-			 */
-			public void handleException(Throwable e) {
-				super.handleException(e);
-				clearSelectedNode();//Do not cache a node with problems
-			}
-		};
-		
-		SafeRunner.run(runnable);
-		
-		return super.close();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(JFaceResources.getString("PreferenceDialog.title")); //$NON-NLS-1$
-		newShell.addShellListener(new ShellAdapter() {
-			public void shellActivated(ShellEvent e) {
-				if (lastShellSize == null) {
-					lastShellSize = getShell().getSize();
-				}
-			}
-
-		});
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#constrainShellSize()
-	 */
-	protected void constrainShellSize() {
-		super.constrainShellSize();
-		// record opening shell size
-		if (lastShellSize == null) {
-			lastShellSize = getShell().getSize();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		// create OK and Cancel buttons by default
-		okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
-		getShell().setDefaultButton(okButton);
-		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(final Composite parent) {
-		final Control[] control = new Control[1];
-		BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
-			public void run() {
-				control[0] = PreferenceDialog.super.createContents(parent);
-				// Add the first page
-				selectSavedItem();
-			}
-		});
-
-		return control[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		final Composite composite = (Composite) super.createDialogArea(parent);
-		GridLayout parentLayout = ((GridLayout) composite.getLayout());
-		parentLayout.numColumns = 4;
-		parentLayout.marginHeight = 0;
-		parentLayout.marginWidth = 0;
-		parentLayout.verticalSpacing = 0;
-		parentLayout.horizontalSpacing = 0;
-		
-		composite.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-		
-		Control treeControl = createTreeAreaContents(composite);
-		createSash(composite,treeControl);
-		
-		Label versep = new Label(composite, SWT.SEPARATOR | SWT.VERTICAL);
-		GridData verGd = new GridData(GridData.FILL_VERTICAL | GridData.GRAB_VERTICAL);
-	
-		versep.setLayoutData(verGd);
-		versep.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true));
-		
-		Composite pageAreaComposite = new Composite(composite, SWT.NONE);
-		pageAreaComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-		GridLayout layout = new GridLayout(1, true);
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		layout.verticalSpacing = 0;
-		pageAreaComposite.setLayout(layout);
-		
-		formTitleComposite = new Composite(pageAreaComposite, SWT.NONE);
-		FormLayout titleLayout = new FormLayout();
-		titleLayout.marginWidth = 0;
-		titleLayout.marginHeight = 0;
-		formTitleComposite.setLayout(titleLayout);
-		
-		GridData titleGridData = new GridData(GridData.FILL_HORIZONTAL);
-		titleGridData.horizontalIndent = IDialogConstants.HORIZONTAL_MARGIN;
-		formTitleComposite.setLayoutData(titleGridData);
-		
-		// Build the title area and separator line
-		Composite titleComposite = new Composite(formTitleComposite, SWT.NONE);
-		layout = new GridLayout();
-		layout.marginBottom = 5;
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		layout.horizontalSpacing = 0;
-		titleComposite.setLayout(layout);
-		
-		FormData titleFormData = new FormData();
-	   	titleFormData.top = new FormAttachment(0,0);
-    	titleFormData.left = new FormAttachment(0,0);
-    	titleFormData.right = new FormAttachment(100,0);
-    	titleFormData.bottom = new FormAttachment(100,0);
-		
-		titleComposite.setLayoutData(titleFormData);
-		createTitleArea(titleComposite);
-		
-		Label separator = new Label(pageAreaComposite, SWT.HORIZONTAL | SWT.SEPARATOR);
-
-		separator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
-		
-		
-		// Build the Page container
-		pageContainer = createPageContainer(pageAreaComposite);
-		GridData pageContainerData = new GridData(GridData.FILL_BOTH);
-		pageContainerData.horizontalIndent = IDialogConstants.HORIZONTAL_MARGIN;
-		pageContainer.setLayoutData(pageContainerData);
-		// Build the separator line
-		Label bottomSeparator = new Label(parent, SWT.HORIZONTAL | SWT.SEPARATOR);
-		bottomSeparator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
-		return composite;
-	}
-
-	/**
-	 * Create the sash with right control on the right. Note 
-	 * that this method assumes GridData for the layout data
-	 * of the rightControl.
-	 * @param composite
-	 * @param rightControl
-	 * @return Sash
-	 * 
-	 * @since 3.1
-	 */
-	protected Sash createSash(final Composite composite, final Control rightControl) {
-		final Sash sash = new Sash(composite, SWT.VERTICAL);
-		sash.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-		sash.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-		// the following listener resizes the tree control based on sash deltas.
-		// If necessary, it will also grow/shrink the dialog.
-		sash.addListener(SWT.Selection, new Listener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-			 */
-			public void handleEvent(Event event) {
-				if (event.detail == SWT.DRAG) {
-					return;
-				}
-				int shift = event.x - sash.getBounds().x;
-				GridData data = (GridData) rightControl.getLayoutData();
-				int newWidthHint = data.widthHint + shift;
-				if (newWidthHint < 20) {
-					return;
-				}
-				Point computedSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT);
-				Point currentSize = getShell().getSize();
-				// if the dialog wasn't of a custom size we know we can shrink
-				// it if necessary based on sash movement.
-				boolean customSize = !computedSize.equals(currentSize);
-				data.widthHint = newWidthHint;
-				setLastTreeWidth(newWidthHint);
-				composite.layout(true);
-				// recompute based on new widget size
-				computedSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT);
-				// if the dialog was of a custom size then increase it only if
-				// necessary.
-				if (customSize) {
-					computedSize.x = Math.max(computedSize.x, currentSize.x);
-				}
-				computedSize.y = Math.max(computedSize.y, currentSize.y);
-				if (computedSize.equals(currentSize)) {
-					return;
-				}
-				setShellSize(computedSize.x, computedSize.y);
-				lastShellSize = getShell().getSize();
-			}
-		});
-		return sash;
-	}
-
-	/**
-	 * Creates the inner page container.
-	 * 
-	 * @param parent
-	 * @return Composite
-	 */
-	protected Composite createPageContainer(Composite parent) {
-	
-		Composite outer = new Composite(parent, SWT.NONE);
-		
-		GridData outerData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL
-				| GridData.GRAB_VERTICAL);
-		outerData.horizontalIndent = IDialogConstants.HORIZONTAL_MARGIN;
-				
-		outer.setLayout(new GridLayout());
-		outer.setLayoutData(outerData);
-		
-		//Create an outer composite for spacing
-		scrolled = new ScrolledComposite(outer, SWT.V_SCROLL | SWT.H_SCROLL);
-
-		// always show the focus control
-		scrolled.setShowFocusedControl(true);
-		scrolled.setExpandHorizontal(true);
-		scrolled.setExpandVertical(true);
-		
-		GridData scrolledData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL
-				| GridData.GRAB_VERTICAL);
-				
-		scrolled.setLayoutData(scrolledData);
-		
-		Composite result = new Composite(scrolled, SWT.NONE);
-		
-		GridData resultData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL
-				| GridData.GRAB_VERTICAL);
-				
-		result.setLayout(getPageLayout());
-		result.setLayoutData(resultData);
-		
-		scrolled.setContent(result);
-		
-		return result;
-	}
-
-	/**
-	 * Return the layout for the composite that contains
-	 * the pages.
-	 * @return PageLayout
-	 * 
-	 * @since 3.1
-	 */
-	protected Layout getPageLayout() {
-		return new PageLayout();
-	}
-
-	/**
-	 * Creates the wizard's title area.
-	 * 
-	 * @param parent
-	 *            the SWT parent for the title area composite.
-	 * @return the created title area composite.
-	 */
-	protected Composite createTitleArea(Composite parent) {
-		// Create the title area which will contain
-		// a title, message, and image.
-		int margins = 2;
-		titleArea = new Composite(parent, SWT.NONE);
-		FormLayout layout = new FormLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = margins;
-		titleArea.setLayout(layout);
-
-		
-		GridData layoutData = new GridData(GridData.FILL_HORIZONTAL);
-		layoutData.verticalAlignment = SWT.TOP;
-		titleArea.setLayoutData(layoutData);
-
-		// Message label
-		messageArea = new DialogMessageArea();
-		messageArea.createContents(titleArea);
-
-		titleArea.addControlListener(new ControlAdapter() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.swt.events.ControlAdapter#controlResized(org.eclipse.swt.events.ControlEvent)
-			 */
-			public void controlResized(ControlEvent e) {
-				updateMessage();
-			}
-		});
-
-		final IPropertyChangeListener fontListener = new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				if (JFaceResources.BANNER_FONT.equals(event.getProperty())) {
-					updateMessage();
-				}
-				if (JFaceResources.DIALOG_FONT.equals(event.getProperty())) {
-					updateMessage();
-					Font dialogFont = JFaceResources.getDialogFont();
-					updateTreeFont(dialogFont);
-					Control[] children = ((Composite) buttonBar).getChildren();
-					for (int i = 0; i < children.length; i++) {
-						children[i].setFont(dialogFont);
-					}
-				}
-			}
-		};
-
-		titleArea.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent event) {
-				JFaceResources.getFontRegistry().removeListener(fontListener);
-			}
-		});
-		JFaceResources.getFontRegistry().addListener(fontListener);
-		messageArea.setTitleLayoutData(createMessageAreaData());
-		messageArea.setMessageLayoutData(createMessageAreaData());
-		return titleArea;
-	}
-
-	/**
-	 * Create the layout data for the message area.
-	 * 
-	 * @return FormData for the message area.
-	 */
-	private FormData createMessageAreaData() {
-		FormData messageData = new FormData();
-		messageData.top = new FormAttachment(0);
-		messageData.bottom = new FormAttachment(100);
-		messageData.right = new FormAttachment(100);
-		messageData.left = new FormAttachment(0);
-		return messageData;
-	}
-
-	/**
-	 * @param parent
-	 *            the SWT parent for the tree area controls.
-	 * @return the new <code>Control</code>.
-	 * @since 3.0
-	 */
-	protected Control createTreeAreaContents(Composite parent) {
-		// Build the tree an put it into the composite.
-		treeViewer = createTreeViewer(parent);
-		treeViewer.setInput(getPreferenceManager());
-		updateTreeFont(JFaceResources.getDialogFont());
-		layoutTreeAreaControl(treeViewer.getControl());
-		return treeViewer.getControl();
-	}
-
-	/**
-	 * Create a new <code>TreeViewer</code>.
-	 * 
-	 * @param parent
-	 *            the parent <code>Composite</code>.
-	 * @return the <code>TreeViewer</code>.
-	 * @since 3.0
-	 */
-	protected TreeViewer createTreeViewer(Composite parent) {
-		final TreeViewer viewer = new TreeViewer(parent, SWT.NONE);
-		addListeners(viewer);
-		viewer.setLabelProvider(new PreferenceLabelProvider());
-		viewer.setContentProvider(new PreferenceContentProvider());
-		return viewer;
-	}
-
-	/**
-	 * Add the listeners to the tree viewer.
-	 * @param viewer
-	 * 
-	 * @since 3.1
-	 */
-	protected void addListeners(final TreeViewer viewer) {
-		viewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
-			private void handleError() {
-				try {
-					// remove the listener temporarily so that the events caused
-					// by the error handling dont further cause error handling
-					// to occur.
-					viewer.removePostSelectionChangedListener(this);
-					showPageFlippingAbortDialog();
-					selectCurrentPageAgain();
-					clearSelectedNode();
-				} finally {
-					viewer.addPostSelectionChangedListener(this);
-				}
-			}
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				final Object selection = getSingleSelection(event.getSelection());
-				if (selection instanceof IPreferenceNode) {
-					BusyIndicator.showWhile(getShell().getDisplay(), new Runnable(){
-						public void run() {
-							if (!isCurrentPageValid()) {
-								handleError();
-							} else if (!showPage((IPreferenceNode) selection)) {
-								// Page flipping wasn't successful
-								handleError();
-							} else {
-								// Everything went well
-								lastSuccessfulNode = (IPreferenceNode) selection;
-							}
-						}
-					});
-				}
-			}
-		});
-		((Tree) viewer.getControl()).addSelectionListener(new SelectionAdapter() {
-			public void widgetDefaultSelected(final SelectionEvent event) {
-				ISelection selection = viewer.getSelection();
-				if (selection.isEmpty()) {
-					return;
-				}
-				IPreferenceNode singleSelection = getSingleSelection(selection);
-				boolean expanded = viewer.getExpandedState(singleSelection);
-				viewer.setExpandedState(singleSelection, !expanded);
-			}
-		});
-		//Register help listener on the tree to use context sensitive help
-		viewer.getControl().addHelpListener(new HelpListener() {
-			public void helpRequested(HelpEvent event) {
-				// call perform help on the current page
-				if (currentPage != null) {
-					currentPage.performHelp();
-				}
-			}
-		});
-	}
-
-	/**
-	 * Find the <code>IPreferenceNode</code> that has data the same id as the
-	 * supplied value.
-	 * 
-	 * @param nodeId
-	 *            the id to search for.
-	 * @return <code>IPreferenceNode</code> or <code>null</code> if not
-	 *         found.
-	 */
-	protected IPreferenceNode findNodeMatching(String nodeId) {
-		List nodes = preferenceManager.getElements(PreferenceManager.POST_ORDER);
-		for (Iterator i = nodes.iterator(); i.hasNext();) {
-			IPreferenceNode node = (IPreferenceNode) i.next();
-			if (node.getId().equals(nodeId)) {
-				return node;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Get the last known right side width.
-	 * 
-	 * @return the width.
-	 */
-	protected int getLastRightWidth() {
-		return lastTreeWidth;
-	}
-
-	/**
-	 * Returns the preference mananger used by this preference dialog.
-	 * 
-	 * @return the preference mananger
-	 */
-	public PreferenceManager getPreferenceManager() {
-		return preferenceManager;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferencePageContainer#getPreferenceStore()
-	 */
-	public IPreferenceStore getPreferenceStore() {
-		return preferenceStore;
-	}
-
-	/**
-	 * Get the name of the selected item preference
-	 * 
-	 * @return String
-	 */
-	protected String getSelectedNodePreference() {
-		return lastPreferenceId;
-	}
-
-	/**
-	 * @param selection
-	 *            the <code>ISelection</code> to examine.
-	 * @return the first element, or null if empty.
-	 */
-	protected IPreferenceNode getSingleSelection(ISelection selection) {
-		if (!selection.isEmpty()) {
-			IStructuredSelection structured = (IStructuredSelection) selection;
-			if (structured.getFirstElement() instanceof IPreferenceNode) {
-				return (IPreferenceNode) structured.getFirstElement();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @return the <code>TreeViewer</code> for this dialog.
-	 * @since 3.3
-	 */
-	public TreeViewer getTreeViewer() {
-		return treeViewer;
-	}
-
-	/**
-	 * Save the values specified in the pages.
-	 * <p>
-	 * The default implementation of this framework method saves all pages of
-	 * type <code>PreferencePage</code> (if their store needs saving and is a
-	 * <code>PreferenceStore</code>).
-	 * </p>
-	 * <p>
-	 * Subclasses may override.
-	 * </p>
-	 */
-	protected void handleSave() {
-		Iterator nodes = preferenceManager.getElements(PreferenceManager.PRE_ORDER).iterator();
-		while (nodes.hasNext()) {
-			IPreferenceNode node = (IPreferenceNode) nodes.next();
-			IPreferencePage page = node.getPage();
-			if (page instanceof PreferencePage) {
-				// Save now in case tbe workbench does not shutdown cleanly
-				IPreferenceStore store = ((PreferencePage) page).getPreferenceStore();
-				if (store != null && store.needsSaving()
-						&& store instanceof IPersistentPreferenceStore) {
-					try {
-						((IPersistentPreferenceStore) store).save();
-					} catch (IOException e) {
-						String message =JFaceResources.format(
-                                "PreferenceDialog.saveErrorMessage", new Object[] { page.getTitle(), e.getMessage() }); //$NON-NLS-1$ 
-			            Policy.getStatusHandler().show(
-			                    new Status(IStatus.ERROR, Policy.JFACE, message, e),
-			                    JFaceResources.getString("PreferenceDialog.saveErrorTitle")); //$NON-NLS-1$                              			                   
-										
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Notifies that the window's close button was pressed, the close menu was
-	 * selected, or the ESCAPE key pressed.
-	 * <p>
-	 * The default implementation of this framework method sets the window's
-	 * return code to <code>CANCEL</code> and closes the window using
-	 * <code>close</code>. Subclasses may extend or reimplement.
-	 * </p>
-	 */
-	protected void handleShellCloseEvent() {
-		// handle the same as pressing cancel
-		cancelPressed();
-	}
-
-	/**
-	 * Notifies of the pressing of the Help button.
-	 * <p>
-	 * The default implementation of this framework method calls
-	 * <code>performHelp</code> on the currently active page.
-	 * </p>
-	 */
-	protected void helpPressed() {
-		if (currentPage != null) {
-			currentPage.performHelp();
-		}
-	}
-
-	/**
-	 * Returns whether the current page is valid.
-	 * 
-	 * @return <code>false</code> if the current page is not valid, or or
-	 *         <code>true</code> if the current page is valid or there is no
-	 *         current page
-	 */
-	protected boolean isCurrentPageValid() {
-		if (currentPage == null) {
-			return true;
-		}
-		return currentPage.isValid();
-	}
-
-	/**
-	 * @param control
-	 *            the <code>Control</code> to lay out.
-	 * @since 3.0
-	 */
-	protected void layoutTreeAreaControl(Control control) {
-		GridData gd = new GridData(GridData.FILL_VERTICAL);
-		gd.widthHint = getLastRightWidth();
-		gd.verticalSpan = 1;
-		control.setLayoutData(gd);
-	}
-
-	/**
-	 * The preference dialog implementation of this <code>Dialog</code>
-	 * framework method sends <code>performOk</code> to all pages of the
-	 * preference dialog, then calls <code>handleSave</code> on this dialog to
-	 * save any state, and then calls <code>close</code> to close this dialog.
-	 */
-	protected void okPressed() {
-		SafeRunnable.run(new SafeRunnable() {
-			private boolean errorOccurred;
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-			 */
-			public void run() {
-				getButton(IDialogConstants.OK_ID).setEnabled(false);
-				errorOccurred = false;
-				boolean hasFailedOK = false;
-				try {
-					// Notify all the pages and give them a chance to abort
-					Iterator nodes = preferenceManager.getElements(PreferenceManager.PRE_ORDER)
-							.iterator();
-					while (nodes.hasNext()) {
-						IPreferenceNode node = (IPreferenceNode) nodes.next();
-						IPreferencePage page = node.getPage();
-						if (page != null) {
-							if (!page.performOk()){
-								hasFailedOK = true;
-								return;
-							}
-						}
-					}
-				} catch (Exception e) {
-					handleException(e);
-				} finally {
-					//Don't bother closing if the OK failed
-					if(hasFailedOK){
-						setReturnCode(FAILED);
-						getButton(IDialogConstants.OK_ID).setEnabled(true);
-						return;
-					}
-					
-					if (!errorOccurred) {
-						//Give subclasses the choice to save the state of the
-					    //preference pages.
-						handleSave();
-					}
-					setReturnCode(OK);
-					close();
-				}
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-			 */
-			public void handleException(Throwable e) {
-				errorOccurred = true;
-				
-				Policy.getLog().log(new Status(IStatus.ERROR, Policy.JFACE, 0, e.toString(), e));
-
-				clearSelectedNode();
-				String message = JFaceResources.getString("SafeRunnable.errorMessage"); //$NON-NLS-1$
-
-                Policy.getStatusHandler().show(
-                        new Status(IStatus.ERROR, Policy.JFACE, message, e),
-                        JFaceResources.getString("Error")); //$NON-NLS-1$                                                             
-
-			}
-		});
-	}
-
-	/**
-	 * Selects the page determined by <code>lastSuccessfulNode</code> in the
-	 * page hierarchy.
-	 */
-	void selectCurrentPageAgain() {
-		if (lastSuccessfulNode == null) {
-			return;
-		}
-		getTreeViewer().setSelection(new StructuredSelection(lastSuccessfulNode));
-		currentPage.setVisible(true);
-	}
-
-	/**
-	 * Selects the saved item in the tree of preference pages. If it cannot do
-	 * this it saves the first one.
-	 */
-	protected void selectSavedItem() {
-		IPreferenceNode node = findNodeMatching(getSelectedNodePreference());
-		if (node == null) {
-			IPreferenceNode[] nodes = preferenceManager.getRootSubNodes();
-			ViewerComparator comparator = getTreeViewer().getComparator();
-			if (comparator != null)	{
-				comparator.sort(null, nodes);
-			}
-			ViewerFilter[] filters = getTreeViewer().getFilters();
-			for (int i = 0; i < nodes.length; i++) {
-				IPreferenceNode selectedNode = nodes[i];
-				// See if it passes all filters
-				for (int j = 0; j < filters.length; j++) {
-					if (!filters[j].select(this.treeViewer, preferenceManager
-							.getRoot(), selectedNode)) {
-						selectedNode = null;
-						break;
-					}
-				}
-				// if it passes all filters select it
-				if (selectedNode != null) {
-					node = selectedNode;
-					break;
-				}
-			}
-		}
-		if (node != null) {
-			getTreeViewer().setSelection(new StructuredSelection(node), true);
-			// Keep focus in tree. See bugs 2692, 2621, and 6775.
-			getTreeViewer().getControl().setFocus();
-		}
-	}
-
-	/**
-	 * Display the given error message. The currently displayed message is saved
-	 * and will be redisplayed when the error message is set to
-	 * <code>null</code>.
-	 * 
-	 * @param newErrorMessage
-	 *            the errorMessage to display or <code>null</code>
-	 */
-	public void setErrorMessage(String newErrorMessage) {
-		if (newErrorMessage == null) {
-			messageArea.clearErrorMessage();
-		} else {
-			messageArea.updateText(newErrorMessage, IMessageProvider.ERROR);
-		}
-	}
-
-	/**
-	 * Save the last known tree width.
-	 * 
-	 * @param width
-	 *            the width.
-	 */
-	private void setLastTreeWidth(int width) {
-		lastTreeWidth = width;
-	}
-
-	/**
-	 * Set the message text. If the message line currently displays an error,
-	 * the message is stored and will be shown after a call to clearErrorMessage
-	 * <p>
-	 * Shortcut for <code>setMessage(newMessage, NONE)</code>
-	 * </p>
-	 * 
-	 * @param newMessage
-	 *            the message, or <code>null</code> to clear the message
-	 */
-	public void setMessage(String newMessage) {
-		setMessage(newMessage, IMessageProvider.NONE);
-	}
-
-	/**
-	 * Sets the message for this dialog with an indication of what type of
-	 * message it is.
-	 * <p>
-	 * The valid message types are one of <code>NONE</code>,
-	 * <code>INFORMATION</code>,<code>WARNING</code>, or
-	 * <code>ERROR</code>.
-	 * </p>
-	 * <p>
-	 * Note that for backward compatibility, a message of type
-	 * <code>ERROR</code> is different than an error message (set using
-	 * <code>setErrorMessage</code>). An error message overrides the current
-	 * message until the error message is cleared. This method replaces the
-	 * current message and does not affect the error message.
-	 * </p>
-	 * 
-	 * @param newMessage
-	 *            the message, or <code>null</code> to clear the message
-	 * @param newType
-	 *            the message type
-	 * @since 2.0
-	 */
-	public void setMessage(String newMessage, int newType) {
-		messageArea.updateText(newMessage, newType);
-	}
-
-	/**
-	 * Sets the minimum page size.
-	 * 
-	 * @param minWidth
-	 *            the minimum page width
-	 * @param minHeight
-	 *            the minimum page height
-	 * @see #setMinimumPageSize(Point)
-	 */
-	public void setMinimumPageSize(int minWidth, int minHeight) {
-		minimumPageSize.x = minWidth;
-		minimumPageSize.y = minHeight;
-	}
-
-	/**
-	 * Sets the minimum page size.
-	 * 
-	 * @param size
-	 *            the page size encoded as <code>new Point(width,height)</code>
-	 * @see #setMinimumPageSize(int,int)
-	 */
-	public void setMinimumPageSize(Point size) {
-		minimumPageSize.x = size.x;
-		minimumPageSize.y = size.y;
-	}
-
-	/**
-	 * Sets the preference store for this preference dialog.
-	 * 
-	 * @param store
-	 *            the preference store
-	 * @see #getPreferenceStore
-	 */
-	public void setPreferenceStore(IPreferenceStore store) {
-		Assert.isNotNull(store);
-		preferenceStore = store;
-	}
-
-	/**
-	 * Save the currently selected node.
-	 */
-	private void setSelectedNode() {
-		String storeValue = null;
-		IStructuredSelection selection = (IStructuredSelection) getTreeViewer().getSelection();
-		if (selection.size() == 1) {
-			IPreferenceNode node = (IPreferenceNode) selection.getFirstElement();
-			storeValue = node.getId();
-		}
-		setSelectedNodePreference(storeValue);
-	}
-
-	/**
-	 * Sets the name of the selected item preference. Public equivalent to
-	 * <code>setSelectedNodePreference</code>.
-	 * 
-	 * @param pageId
-	 *            The identifier for the page
-	 * @since 3.0
-	 */
-	public void setSelectedNode(String pageId) {
-		setSelectedNodePreference(pageId);
-	}
-
-	/**
-	 * Sets the name of the selected item preference.
-	 * 
-	 * @param pageId
-	 *            The identifier for the page
-	 */
-	protected void setSelectedNodePreference(String pageId) {
-		lastPreferenceId = pageId;
-	}
-
-	/**
-	 * Changes the shell size to the given size, ensuring that it is no larger
-	 * than the display bounds.
-	 * 
-	 * @param width
-	 *            the shell width
-	 * @param height
-	 *            the shell height
-	 */
-	private void setShellSize(int width, int height) {
-		Rectangle preferred = getShell().getBounds();
-		preferred.width = width;
-		preferred.height = height;
-		getShell().setBounds(getConstrainedShellBounds(preferred));
-	}
-
-	/**
-	 * Shows the preference page corresponding to the given preference node.
-	 * Does nothing if that page is already current.
-	 * 
-	 * @param node
-	 *            the preference node, or <code>null</code> if none
-	 * @return <code>true</code> if the page flip was successful, and
-	 *         <code>false</code> is unsuccessful
-	 */
-	protected boolean showPage(IPreferenceNode node) {
-		if (node == null) {
-			return false;
-		}
-		// Create the page if nessessary
-		if (node.getPage() == null) {
-			createPage(node);
-		}
-		if (node.getPage() == null) {
-			return false;
-		}
-		IPreferencePage newPage = getPage(node);
-		if (newPage == currentPage) {
-			return true;
-		}
-		if (currentPage != null) {
-			if (!currentPage.okToLeave()) {
-				return false;
-			}
-		}
-		IPreferencePage oldPage = currentPage;
-		currentPage = newPage;
-		// Set the new page's container
-		currentPage.setContainer(this);
-		// Ensure that the page control has been created
-		// (this allows lazy page control creation)
-		if (currentPage.getControl() == null) {
-			final boolean[] failed = { false };
-			SafeRunnable.run(new ISafeRunnable() {
-				public void handleException(Throwable e) {
-					failed[0] = true;
-				}
-
-				public void run() {
-					createPageControl(currentPage, pageContainer);
-				}
-			});
-			if (failed[0]) {
-				return false;
-			}
-			// the page is responsible for ensuring the created control is
-			// accessable
-			// via getControl.
-			Assert.isNotNull(currentPage.getControl());
-		}
-		// Force calculation of the page's description label because
-		// label can be wrapped.
-		final Point[] size = new Point[1];
-		final Point failed = new Point(-1, -1);
-		SafeRunnable.run(new ISafeRunnable() {
-			public void handleException(Throwable e) {
-				size[0] = failed;
-			}
-
-			public void run() {
-				size[0] = currentPage.computeSize();
-			}
-		});
-		if (size[0].equals(failed)) {
-			return false;
-		}
-		Point contentSize = size[0];
-		// Do we need resizing. Computation not needed if the
-		// first page is inserted since computing the dialog's
-		// size is done by calling dialog.open().
-		// Also prevent auto resize if the user has manually resized
-		Shell shell = getShell();
-		Point shellSize = shell.getSize();
-		if (oldPage != null) {
-			Rectangle rect = pageContainer.getClientArea();
-			Point containerSize = new Point(rect.width, rect.height);
-			int hdiff = contentSize.x - containerSize.x;
-			int vdiff = contentSize.y - containerSize.y;
-			if ((hdiff > 0 || vdiff > 0) && shellSize.equals(lastShellSize)) {
-					hdiff = Math.max(0, hdiff);
-					vdiff = Math.max(0, vdiff);
-					setShellSize(shellSize.x + hdiff, shellSize.y + vdiff);
-					lastShellSize = shell.getSize();
-					if (currentPage.getControl().getSize().x == 0) {
-						currentPage.getControl().setSize(containerSize);
-					}
-				
-			} else {
-				currentPage.setSize(containerSize);
-			}
-		}
-		
-		scrolled.setMinSize(contentSize);
-		// Ensure that all other pages are invisible
-		// (including ones that triggered an exception during
-		// their creation).
-		Control[] children = pageContainer.getChildren();
-		Control currentControl = currentPage.getControl();
-		for (int i = 0; i < children.length; i++) {
-			if (children[i] != currentControl) {
-				children[i].setVisible(false);
-			}
-		}
-		// Make the new page visible
-		currentPage.setVisible(true);
-		if (oldPage != null) {
-			oldPage.setVisible(false);
-		}
-		// update the dialog controls
-		update();
-		return true;
-	}
-
-	/**
-	 * Create the page for the node.
-	 * @param node
-	 * 
-	 * @since 3.1
-	 */
-	protected void createPage(IPreferenceNode node) {
-		node.createPage();
-	}
-
-	/**
-	 * Get the page for the node.
-	 * @param node
-	 * @return IPreferencePage
-	 * 
-	 * @since 3.1
-	 */
-	protected IPreferencePage getPage(IPreferenceNode node) {
-		return node.getPage();
-	}
-
-	/**
-	 * Shows the "Page Flipping abort" dialog.
-	 */
-	void showPageFlippingAbortDialog() {
-		MessageDialog.openError(getShell(), JFaceResources
-				.getString("AbortPageFlippingDialog.title"), //$NON-NLS-1$
-				JFaceResources.getString("AbortPageFlippingDialog.message")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Updates this dialog's controls to reflect the current page.
-	 */
-	protected void update() {
-		// Update the title bar
-		updateTitle();
-		// Update the message line
-		updateMessage();
-		// Update the buttons
-		updateButtons();
-		//Saved the selected node in the preferences
-		setSelectedNode();
-		firePageChanged(new PageChangedEvent(this, getCurrentPage()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferencePageContainer#updateButtons()
-	 */
-	public void updateButtons() {
-		okButton.setEnabled(isCurrentPageValid());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferencePageContainer#updateMessage()
-	 */
-	public void updateMessage() {
-		String message = null;
-		String errorMessage = null;
-		if(currentPage != null){
-			message = currentPage.getMessage();
-			errorMessage = currentPage.getErrorMessage();
-		}
-		int messageType = IMessageProvider.NONE;
-		if (message != null && currentPage instanceof IMessageProvider) {
-			messageType = ((IMessageProvider) currentPage).getMessageType();
-		}
-
-		if (errorMessage == null){
-			if (showingError) {
-				// we were previously showing an error
-				showingError = false;
-			}
-		}
-		else {
-			message = errorMessage;
-			messageType = IMessageProvider.ERROR;
-			if (!showingError) {
-				// we were not previously showing an error
-				showingError = true;
-			}
-		}  
-		messageArea.updateText(message,messageType);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferencePageContainer#updateTitle()
-	 */
-	public void updateTitle() {
-		if(currentPage == null) {
-			return;
-		}
-		messageArea.showTitle(currentPage.getTitle(), currentPage.getImage());
-	}
-
-	/**
-	 * Update the tree to use the specified <code>Font</code>.
-	 * 
-	 * @param dialogFont
-	 *            the <code>Font</code> to use.
-	 * @since 3.0
-	 */
-	protected void updateTreeFont(Font dialogFont) {
-		getTreeViewer().getControl().setFont(dialogFont);
-	}
-
-	/**
-	 * Returns the currentPage.
-	 * @return IPreferencePage
-	 * @since 3.1
-	 */
-	protected IPreferencePage getCurrentPage() {
-		return currentPage;
-	}
-
-	/**
-	 * Sets the current page.
-	 * @param currentPage
-	 * 
-	 * @since 3.1
-	 */
-	protected void setCurrentPage(IPreferencePage currentPage) {
-		this.currentPage = currentPage;
-	}
-
-	/**
-	 * Set the treeViewer.
-	 * @param treeViewer
-	 * 
-	 * @since 3.1
-	 */
-	protected void setTreeViewer(TreeViewer treeViewer) {
-		this.treeViewer = treeViewer;
-	}
-
-	/**
-	 * Get the composite that is showing the page.
-	 *
-	 * @return Composite.
-	 * 
-	 * @since 3.1
-	 */
-	protected Composite getPageContainer() {
-		return this.pageContainer;
-	}
-
-	/**
-	 * Set the composite that is showing the page.
-	 * @param pageContainer Composite
-	 * 
-	 * @since 3.1
-	 */
-	protected void setPageContainer(Composite pageContainer) {
-		this.pageContainer = pageContainer;
-	}
-	/**
-	 * Create the page control for the supplied page.
-	 * 
-	 * @param page - the preference page to be shown
-	 * @param parent - the composite to parent the page
-	 * 
-	 * @since 3.1
-	 */
-	protected void createPageControl(IPreferencePage page, Composite parent) {
-		page.createControl(parent);
-	}
-	
-	/**
-	 * @see org.eclipse.jface.dialogs.IPageChangeProvider#getSelectedPage()
-	 * 
-	 * @since 3.1
-	 */
-	public Object getSelectedPage() {
-			return getCurrentPage();
-		}
-	
-	/**
-	 * @see org.eclipse.jface.dialogs.IPageChangeProvider#addPageChangedListener(org.eclipse.jface.dialogs.IPageChangedListener)
-	 * @since 3.1
-	 */
-	public void addPageChangedListener(IPageChangedListener listener) {
-		pageChangedListeners.add(listener);
-	}
-	
-	/**
-	 * @see org.eclipse.jface.dialogs.IPageChangeProvider#removePageChangedListener(org.eclipse.jface.dialogs.IPageChangedListener)
-	 * @since 3.1
-	 */
-	public void removePageChangedListener(IPageChangedListener listener) {
-		pageChangedListeners.remove(listener);
-		
-	}
-
-	/**
-     * Notifies any selection changed listeners that the selected page
-     * has changed.
-     * Only listeners registered at the time this method is called are notified.
-     *
-     * @param event a selection changed event
-     *
-     * @see IPageChangedListener#pageChanged
-     * 
-     * @since 3.1
-     */
-    protected void firePageChanged(final PageChangedEvent event) {
-        Object[] listeners = pageChangedListeners.getListeners();
-        for (int i = 0; i < listeners.length; i++) {
-            final IPageChangedListener l = (IPageChangedListener) listeners[i];
-            SafeRunnable.run(new SafeRunnable() {
-                public void run() {
-                    l.pageChanged(event);
-                }
-            });
-        }
-    }	
-    
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#isResizable()
-     */
-    protected boolean isResizable() {
-    	return true;
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceLabelProvider.java
deleted file mode 100644
index e20b0bc..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceLabelProvider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Provides labels for <code>IPreferenceNode</code> objects.
- * 
- * @since 3.0
- */
-public class PreferenceLabelProvider extends LabelProvider {
-
-    /**
-     * @param element must be an instance of <code>IPreferenceNode</code>.
-     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-     */
-    public String getText(Object element) {
-        return ((IPreferenceNode) element).getLabelText();
-    }
-
-    /**
-     * @param element must be an instance of <code>IPreferenceNode</code>.
-     * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-     */
-    public Image getImage(Object element) {
-        return ((IPreferenceNode) element).getLabelImage();
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceManager.java
deleted file mode 100644
index 4b809b1..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceManager.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jan-Hendrik Diederich, Bredex GmbH - bug 201052
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * A preference manager maintains a hierarchy of preference nodes and
- * associated preference pages.
- */
-public class PreferenceManager {
-    /**
-     * Pre-order traversal means visit the root first,
-     * then the children.
-     */
-    public static final int PRE_ORDER = 0;
-
-    /**
-     * Post-order means visit the children, and then the root.
-     */
-    public static final int POST_ORDER = 1;
-    
-    /**
-     * The id of the root node.
-     */
-    private final static String ROOT_NODE_ID = ""; //$NON-NLS-1$
-
-    /**
-     * The root node.
-     * Note that the root node is a special internal node
-     * that is used to collect together all the nodes that
-     * have no parent; it is not given out to clients.
-     */
-    PreferenceNode root;
-
-    /**
-     * The path separator character.
-     */
-    String separator;
-
-    /**
-     * Creates a new preference manager.
-     */
-    public PreferenceManager() {
-        this('.', new PreferenceNode(ROOT_NODE_ID));
-    }
-    
-    /**
-     * Creates a new preference manager with the given
-     * path separator.
-     * 
-     * @param separatorChar
-     */
-    public PreferenceManager(final char separatorChar) { 
-    	this(separatorChar, new PreferenceNode(ROOT_NODE_ID));
-    }
-
-    /**
-     * Creates a new preference manager with the given
-     * path separator and root node.
-     *
-     * @param separatorChar the separator character
-     * @param rootNode the root node. 
-     *
-     * @since 3.4
-     */
-    public PreferenceManager(final char separatorChar, PreferenceNode rootNode) {
-        separator = new String(new char[] { separatorChar });
-        this.root = rootNode;
-    }
-
-    /**
-     * Adds the given preference node as a subnode of the
-     * node at the given path.
-     *
-     * @param path the path
-     * @param node the node to add
-     * @return <code>true</code> if the add was successful,
-     *  and <code>false</code> if there is no contribution at
-     *  the given path
-     */
-    public boolean addTo(String path, IPreferenceNode node) {
-        IPreferenceNode target = find(path);
-        if (target == null) {
-			return false;
-		}
-        target.add(node);
-        return true;
-    }
-
-    /**
-     * Adds the given preference node as a subnode of the
-     * root.
-     *
-     * @param node the node to add, which must implement 
-     *   <code>IPreferenceNode</code>
-     */
-    public void addToRoot(IPreferenceNode node) {
-        Assert.isNotNull(node);
-        root.add(node);
-    }
-
-    /**
-     * Recursively enumerates all nodes at or below the given node
-     * and adds them to the given list in the given order.
-     * 
-     * @param node the starting node
-     * @param sequence a read-write list of preference nodes
-     *  (element type: <code>IPreferenceNode</code>)
-     *  in the given order
-     * @param order the traversal order, one of 
-     *	<code>PRE_ORDER</code> and <code>POST_ORDER</code>
-     */
-    protected void buildSequence(IPreferenceNode node, List sequence, int order) {
-        if (order == PRE_ORDER) {
-			sequence.add(node);
-		}
-        IPreferenceNode[] subnodes = node.getSubNodes();
-        for (int i = 0; i < subnodes.length; i++) {
-            buildSequence(subnodes[i], sequence, order);
-        }
-        if (order == POST_ORDER) {
-			sequence.add(node);
-		}
-    }
-
-    /**
-     * Finds and returns the contribution node at the given path.
-     *
-     * @param path the path
-     * @return the node, or <code>null</code> if none
-     */
-    public IPreferenceNode find(String path) {
-       return find(path,root);
-    }
-    
-    /**
-     * Finds and returns the preference node directly
-     * below the top at the given path.
-     *
-     * @param path the path
-     * @param top top at the given path
-     * @return the node, or <code>null</code> if none
-     * 
-     * @since 3.1
-     */
-    protected IPreferenceNode find(String path,IPreferenceNode top){
-    	 Assert.isNotNull(path);
-         StringTokenizer stok = new StringTokenizer(path, separator);
-         IPreferenceNode node = top;
-         while (stok.hasMoreTokens()) {
-             String id = stok.nextToken();
-             node = node.findSubNode(id);
-             if (node == null) {
-				return null;
-			}
-         }
-         if (node == top) {
-			return null;
-		}
-         return node;
-    }
-
-    /**
-     * Returns all preference nodes managed by this
-     * manager.
-     *
-     * @param order the traversal order, one of 
-     *	<code>PRE_ORDER</code> and <code>POST_ORDER</code>
-     * @return a list of preference nodes
-     *  (element type: <code>IPreferenceNode</code>)
-     *  in the given order
-     */
-    public List getElements(int order) {
-        Assert.isTrue(order == PRE_ORDER || order == POST_ORDER,
-                "invalid traversal order");//$NON-NLS-1$
-        ArrayList sequence = new ArrayList();
-        IPreferenceNode[] subnodes = getRoot().getSubNodes();
-        for (int i = 0; i < subnodes.length; i++) {
-			buildSequence(subnodes[i], sequence, order);
-		}
-        return sequence;
-    }
-
-    /**
-     * Returns the root node.
-     * Note that the root node is a special internal node
-     * that is used to collect together all the nodes that
-     * have no parent; it is not given out to clients.
-     *
-     * @return the root node
-     */
-    protected IPreferenceNode getRoot() {
-        return root;
-    }
-
-	/**
-	 * Returns the root level nodes of this preference manager.
-	 * 
-	 * @return an array containing the root nodes
-	 * @since 3.2
-	 */
-	public final IPreferenceNode[] getRootSubNodes() {
-		return getRoot().getSubNodes();
-	}
-
-    /**
-	 * Removes the preference node at the given path.
-	 * 
-	 * @param path
-	 *            the path
-	 * @return the node that was removed, or <code>null</code> if there was no
-	 *         node at the given path
-	 */
-    public IPreferenceNode remove(String path) {
-        Assert.isNotNull(path);
-        int index = path.lastIndexOf(separator);
-        if (index == -1) {
-			return root.remove(path);
-		}
-        // Make sure that the last character in the string isn't the "."
-        Assert.isTrue(index < path.length() - 1, "Path can not end with a dot");//$NON-NLS-1$
-        String parentPath = path.substring(0, index);
-        String id = path.substring(index + 1);
-        IPreferenceNode parentNode = find(parentPath);
-        if (parentNode == null) {
-			return null;
-		}
-        return parentNode.remove(id);
-    }
-
-    /**
-     * Removes the given prefreence node if it is managed by
-     * this contribution manager.
-     *
-     * @param node the node to remove
-     * @return <code>true</code> if the node was removed,
-     *  and <code>false</code> otherwise
-     */
-    public boolean remove(IPreferenceNode node) {
-        Assert.isNotNull(node);
-
-        return root.remove(node);
-    }
-
-    /**
-     * Removes all contribution nodes known to this manager.
-     */
-    public void removeAll() {
-        root = new PreferenceNode("");//$NON-NLS-1$
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceNode.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceNode.java
deleted file mode 100644
index 5644cbd..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceNode.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A concrete implementation of a node in a preference dialog tree. This class
- * also supports lazy creation of the node's preference page.
- */
-public class PreferenceNode implements IPreferenceNode {
-    /**
-     * Preference page, or <code>null</code> if not yet loaded.
-     */
-    private IPreferencePage page;
-
-    /**
-     * The list of subnodes (immediate children) of this node (element type:
-     * <code>IPreferenceNode</code>).
-     */
-    private List subNodes;
-
-    /**
-     * Name of a class that implements <code>IPreferencePage</code>, or
-     * <code>null</code> if none.
-     */
-    private String classname;
-
-    /**
-     * The id of this node.
-     */
-    private String id;
-
-    /**
-     * Text label for this node. Note that this field is only used prior to the
-     * creation of the preference page.
-     */
-    private String label;
-
-    /**
-     * Image descriptor for this node, or <code>null</code> if none.
-     */
-    private ImageDescriptor imageDescriptor;
-
-    /**
-     * Cached image, or <code>null</code> if none.
-     */
-    private Image image;
-
-    /**
-     * Creates a new preference node with the given id. The new node has no
-     * subnodes.
-     * 
-     * @param id
-     *            the node id
-     */
-    public PreferenceNode(String id) {
-        Assert.isNotNull(id);
-        this.id = id;
-    }
-
-    /**
-     * Creates a preference node with the given id, label, and image, and
-     * lazily-loaded preference page. The preference node assumes (sole)
-     * responsibility for disposing of the image; this will happen when the node
-     * is disposed.
-     * 
-     * @param id
-     *            the node id
-     * @param label
-     *            the label used to display the node in the preference dialog's
-     *            tree
-     * @param image
-     *            the image displayed left of the label in the preference
-     *            dialog's tree, or <code>null</code> if none
-     * @param className
-     *            the class name of the preference page; this class must
-     *            implement <code>IPreferencePage</code>
-     */
-    public PreferenceNode(String id, String label, ImageDescriptor image,
-            String className) {
-        this(id);
-        this.imageDescriptor = image;
-        Assert.isNotNull(label);
-        this.label = label;
-        this.classname = className;
-    }
-
-    /**
-     * Creates a preference node with the given id and preference page. The
-     * title of the preference page is used for the node label. The node will
-     * not have an image.
-     * 
-     * @param id
-     *            the node id
-     * @param preferencePage
-     *            the preference page
-     */
-    public PreferenceNode(String id, IPreferencePage preferencePage) {
-        this(id);
-        Assert.isNotNull(preferencePage);
-        page = preferencePage;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IPreferenceNode.
-     */
-    public void add(IPreferenceNode node) {
-        if (subNodes == null) {
-			subNodes = new ArrayList();
-		}
-        subNodes.add(node);
-    }
-
-    /**
-     * Creates a new instance of the given class <code>className</code>.
-     * 
-     * @param className
-     * @return new Object or <code>null</code> in case of failures.
-     */
-    private Object createObject(String className) {
-        Assert.isNotNull(className);
-        try {
-            Class cl = Class.forName(className);
-            if (cl != null) {
-				return cl.newInstance();
-			}
-        } catch (ClassNotFoundException e) {
-            return null;
-        } catch (InstantiationException e) {
-            return null;
-        } catch (IllegalAccessException e) {
-            return null;
-        } catch (NoSuchMethodError e) {
-            return null;
-        }
-        return null;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IPreferenceNode.
-     */
-    public void createPage() {
-        page = (IPreferencePage) createObject(classname);
-        if (getLabelImage() != null) {
-			page.setImageDescriptor(imageDescriptor);
-		}
-        page.setTitle(label);
-    }
-
-    /**
-     * (non-Javadoc) Method declared on IPreferenceNode.
-     */
-    public void disposeResources() {
-        if (image != null) {
-            image.dispose();
-            image = null;
-        }
-        if (page != null) {
-            page.dispose();
-            page = null;
-        }
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IContributionNode.
-     */
-    public IPreferenceNode findSubNode(String id) {
-        Assert.isNotNull(id);
-        Assert.isTrue(id.length() > 0);
-        if (subNodes == null) {
-			return null;
-		}
-        int size = subNodes.size();
-        for (int i = 0; i < size; i++) {
-            IPreferenceNode node = (IPreferenceNode) subNodes.get(i);
-            if (id.equals(node.getId())) {
-				return node;
-			}
-        }
-        return null;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IPreferenceNode.
-     */
-    public String getId() {
-        return this.id;
-    }
-
-    /**
-     * Returns the image descriptor for this node.
-     * 
-     * @return the image descriptor
-     */
-    protected ImageDescriptor getImageDescriptor() {
-        return imageDescriptor;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IPreferenceNode.
-     */
-    public Image getLabelImage() {
-        if (image == null && imageDescriptor != null) {
-            image = imageDescriptor.createImage();
-        }
-        return image;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IPreferenceNode.
-     */
-    public String getLabelText() {
-        if (page != null) {
-			return page.getTitle();
-		}
-        return label;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IPreferenceNode.
-     */
-    public IPreferencePage getPage() {
-        return page;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IPreferenceNode.
-     */
-    public IPreferenceNode[] getSubNodes() {
-        if (subNodes == null) {
-			return new IPreferenceNode[0];
-		}
-        return (IPreferenceNode[]) subNodes
-                .toArray(new IPreferenceNode[subNodes.size()]);
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IPreferenceNode.
-     */
-    public IPreferenceNode remove(String id) {
-        IPreferenceNode node = findSubNode(id);
-        if (node != null) {
-			remove(node);
-		}
-        return node;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IPreferenceNode.
-     */
-    public boolean remove(IPreferenceNode node) {
-        if (subNodes == null) {
-			return false;
-		}
-        return subNodes.remove(node);
-    }
-
-    /**
-     * Set the current page to be newPage.
-     * 
-     * @param newPage
-     */
-    public void setPage(IPreferencePage newPage) {
-        page = newPage;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferencePage.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferencePage.java
deleted file mode 100644
index cd23b2a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferencePage.java
+++ /dev/null
@@ -1,663 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- * 	   Sebastian Davids <sdavids@gmx.de> - Fix for bug 38729 - [Preferences]
- * 			 NPE PreferencePage isValid.
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.DialogPage;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogPage;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * Abstract base implementation for all preference page implementations.
- * <p>
- * Subclasses must implement the <code>createContents</code> framework
- * method to supply the page's main control.
- * </p>
- * <p>
- * Subclasses should extend the <code>doComputeSize</code> framework
- * method to compute the size of the page's control.
- * </p>
- * <p>
- * Subclasses may override the <code>performOk</code>, <code>performApply</code>, 
- * <code>performDefaults</code>, <code>performCancel</code>, and <code>performHelp</code>
- * framework methods to react to the standard button events.
- * </p>
- * <p>
- * Subclasses may call the <code>noDefaultAndApplyButton</code> framework
- * method before the page's control has been created to suppress
- * the standard Apply and Defaults buttons.
- * </p>
- */
-public abstract class PreferencePage extends DialogPage implements
-        IPreferencePage {
-
-    /**
-     * Preference store, or <code>null</code>.
-     */
-    private IPreferenceStore preferenceStore;
-
-    /**
-     * Valid state for this page; <code>true</code> by default.
-     *
-     * @see #isValid
-     */
-    private boolean isValid = true;
-
-    /**
-     * Body of page.
-     */
-    private Control body;
-
-    /**
-     * Whether this page has the standard Apply and Defaults buttons; 
-     * <code>true</code> by default.
-     *
-     * @see #noDefaultAndApplyButton
-     */
-    private boolean createDefaultAndApplyButton = true;
-
-    /**
-     * Standard Defaults button, or <code>null</code> if none.
-     * This button has id <code>DEFAULTS_ID</code>.
-     */
-    private Button defaultsButton = null;
-
-    /**
-     * The container this preference page belongs to; <code>null</code>
-     * if none.
-     */
-    private IPreferencePageContainer container = null;
-
-    /**
-     * Standard Apply button, or <code>null</code> if none.
-     * This button has id <code>APPLY_ID</code>.
-     */
-    private Button applyButton = null;
-
-    /**
-     * Description label.
-     * 
-     * @see #createDescriptionLabel(Composite)
-     */
-    private Label descriptionLabel;
-
-    /**
-     * Caches size of page.
-     */
-    private Point size = null;
-
-   
-    /**
-     * Creates a new preference page with an empty title and no image.
-     */
-    protected PreferencePage() {
-        this(""); //$NON-NLS-1$
-    }
-
-    /**
-     * Creates a new preference page with the given title and no image.
-     *
-     * @param title the title of this preference page
-     */
-    protected PreferencePage(String title) {
-        super(title);
-    }
-
-    /**
-     * Creates a new abstract preference page with the given title and image.
-     *
-     * @param title the title of this preference page
-     * @param image the image for this preference page,
-     *  or <code>null</code> if none
-     */
-    protected PreferencePage(String title, ImageDescriptor image) {
-        super(title, image);
-    }
-
-    /**
-     * Computes the size for this page's UI control.
-     * <p>
-     * The default implementation of this <code>IPreferencePage</code>
-     * method returns the size set by <code>setSize</code>; if no size
-     * has been set, but the page has a UI control, the framework
-     * method <code>doComputeSize</code> is called to compute the size.
-     * </p>
-     *
-     * @return the size of the preference page encoded as
-     *   <code>new Point(width,height)</code>, or 
-     *   <code>(0,0)</code> if the page doesn't currently have any UI component
-     */
-    public Point computeSize() {
-        if (size != null) {
-			return size;
-		}
-        Control control = getControl();
-        if (control != null) {
-            size = doComputeSize();
-            return size;
-        }
-        return new Point(0, 0);
-    }
-
-    /**
-     * Contributes additional buttons to the given composite.
-     * <p>
-     * The default implementation of this framework hook method does
-     * nothing. Subclasses should override this method to contribute buttons 
-     * to this page's button bar. For each button a subclass contributes,
-     * it must also increase the parent's grid layout number of columns
-     * by one; that is,
-     * <pre>
-     * ((GridLayout) parent.getLayout()).numColumns++);
-     * </pre>
-     * </p>
-     *
-     * @param parent the button bar
-     */
-    protected void contributeButtons(Composite parent) {
-    }
-
-    /**
-     * Creates and returns the SWT control for the customized body 
-     * of this preference page under the given parent composite.
-     * <p>
-     * This framework method must be implemented by concrete subclasses. Any
-     * subclass returning a <code>Composite</code> object whose <code>Layout</code>
-     * has default margins (for example, a <code>GridLayout</code>) are expected to
-     * set the margins of this <code>Layout</code> to 0 pixels. 
-     * </p>
-     *
-     * @param parent the parent composite
-     * @return the new control
-     */
-    protected abstract Control createContents(Composite parent);
-
-    /**
-     * The <code>PreferencePage</code> implementation of this 
-     * <code>IDialogPage</code> method creates a description label
-     * and button bar for the page. It calls <code>createContents</code>
-     * to create the custom contents of the page.
-     * <p>
-     * If a subclass that overrides this method creates a <code>Composite</code>
-     * that has a layout with default margins (for example, a <code>GridLayout</code>)
-     * it is expected to set the margins of this <code>Layout</code> to 0 pixels.
-     * @see IDialogPage#createControl(Composite)
-     */
-    public void createControl(Composite parent){
-
-        GridData gd;
-        Composite content = new Composite(parent, SWT.NONE);
-        setControl(content);
-        GridLayout layout = new GridLayout();
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        content.setLayout(layout);
-        //Apply the font on creation for backward compatibility
-        applyDialogFont(content);
-
-        // initialize the dialog units
-        initializeDialogUnits(content);
-
-        descriptionLabel = createDescriptionLabel(content);
-        if (descriptionLabel != null) {
-            descriptionLabel.setLayoutData(new GridData(
-                    GridData.FILL_HORIZONTAL));
-        }
-
-        body = createContents(content);
-        if (body != null) {
-			// null is not a valid return value but support graceful failure
-            body.setLayoutData(new GridData(GridData.FILL_BOTH));
-		}
-
-        Composite buttonBar = new Composite(content, SWT.NONE);
-        layout = new GridLayout();
-        layout.numColumns = 0;
-        layout.marginHeight = 0;
-        layout.marginWidth = 0;
-        layout.makeColumnsEqualWidth = false;
-        buttonBar.setLayout(layout);
-        
-        gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
-        
-        buttonBar.setLayoutData(gd);
-
-        contributeButtons(buttonBar);
-        
-        if (createDefaultAndApplyButton) {
-            layout.numColumns = layout.numColumns + 2;
-			String[] labels = JFaceResources.getStrings(new String[] {
-					"defaults", "apply" }); //$NON-NLS-2$//$NON-NLS-1$
-			int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-			defaultsButton = new Button(buttonBar, SWT.PUSH);
-			defaultsButton.setText(labels[0]);
-			Dialog.applyDialogFont(defaultsButton);
-			GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-			Point minButtonSize = defaultsButton.computeSize(SWT.DEFAULT,
-					SWT.DEFAULT, true);
-			data.widthHint = Math.max(widthHint, minButtonSize.x);
-			defaultsButton.setLayoutData(data);
-			defaultsButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					performDefaults();
-				}
-			});
-
-            applyButton = new Button(buttonBar, SWT.PUSH);
-			applyButton.setText(labels[1]);
-			Dialog.applyDialogFont(applyButton);
-			data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-			minButtonSize = applyButton.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-					true);
-			data.widthHint = Math.max(widthHint, minButtonSize.x);
-			applyButton.setLayoutData(data);
-			applyButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					performApply();
-				}
-			});
-            applyButton.setEnabled(isValid());
-            applyDialogFont(buttonBar);
-        } else {
-            /* Check if there are any other buttons on the button bar.
-             * If not, throw away the button bar composite.  Otherwise
-             * there is an unusually large button bar.
-             */
-            if (buttonBar.getChildren().length < 1) {
-				buttonBar.dispose();
-			}
-        }
-    }
-
-	
-
-	/**
-     * Apply the dialog font to the composite and it's children
-     * if it is set. Subclasses may override if they wish to
-     * set the font themselves.
-     * @param composite
-     */
-    protected void applyDialogFont(Composite composite) {
-        Dialog.applyDialogFont(composite);
-    }
-
-    /**
-     * Creates and returns an SWT label under the given composite.
-     *
-     * @param parent the parent composite
-     * @return the new label
-     */
-    protected Label createDescriptionLabel(Composite parent) {
-        Label result = null;
-        String description = getDescription();
-        if (description != null) {
-            result = new Label(parent, SWT.WRAP);
-            result.setFont(parent.getFont());
-            result.setText(description);
-        }
-        return result;
-    }
-
-    /**
-     * Computes the size needed by this page's UI control.
-     * <p>
-     * All pages should override this method and set the appropriate sizes
-     * of their widgets, and then call <code>super.doComputeSize</code>.
-     * </p>
-     *
-     * @return the size of the preference page encoded as
-     *   <code>new Point(width,height)</code>
-     */
-    protected Point doComputeSize() {
-        if (descriptionLabel != null && body != null) {
-            Point bodySize = body.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-            GridData gd = (GridData) descriptionLabel.getLayoutData();
-            gd.widthHint = bodySize.x;
-        }
-        return getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-    }
-
-    /**
-     * Returns the preference store of this preference page.
-     * <p>
-     * This is a framework hook method for subclasses to return a
-     * page-specific preference store. The default implementation
-     * returns <code>null</code>.
-     * </p>
-     *
-     * @return the preference store, or <code>null</code> if none
-     */
-    protected IPreferenceStore doGetPreferenceStore() {
-        return null;
-    }
-
-    /**
-     * Returns the container of this page.
-     *
-     * @return the preference page container, or <code>null</code> if this
-     *   page has yet to be added to a container
-     */
-    public IPreferencePageContainer getContainer() {
-        return container;
-    }
-
-    /**
-     * Returns the preference store of this preference page.
-     *
-     * @return the preference store , or <code>null</code> if none
-     */
-    public IPreferenceStore getPreferenceStore() {
-        if (preferenceStore == null) {
-			preferenceStore = doGetPreferenceStore();
-		}
-        if (preferenceStore != null) {
-			return preferenceStore;
-		} else if (container != null) {
-			return container.getPreferenceStore();
-		}
-        return null;
-    }
-
-    /**	
-     * The preference page implementation of an <code>IPreferencePage</code>
-     * method returns whether this preference page is valid. Preference
-     * pages are considered valid by default; call <code>setValid(false)</code>
-     * to make a page invalid.
-     * @see IPreferencePage#isValid()
-     */
-    public boolean isValid() {
-        return isValid;
-    }
-
-    /**
-     * Suppresses creation of the standard Default and Apply buttons
-     * for this page.
-     * <p>
-     * Subclasses wishing a preference page without these buttons
-     * should call this framework method before the page's control
-     * has been created.
-     * </p>
-     */
-    protected void noDefaultAndApplyButton() {
-        createDefaultAndApplyButton = false;
-    }
-
-    /**
-     * The <code>PreferencePage</code> implementation of this 
-     * <code>IPreferencePage</code> method returns <code>true</code>
-     * if the page is valid.
-     * @see IPreferencePage#okToLeave()
-     */
-    public boolean okToLeave() {
-        return isValid();
-    }
-
-    /**
-     * Performs special processing when this page's Apply button has been pressed.
-     * <p>
-     * This is a framework hook method for sublcasses to do special things when
-     * the Apply button has been pressed.
-     * The default implementation of this framework method simply calls
-     * <code>performOk</code> to simulate the pressing of the page's OK button.
-     * </p>
-     * 
-     * @see #performOk
-     */
-    protected void performApply() {
-        performOk();
-    }
-
-    /**	
-     * The preference page implementation of an <code>IPreferencePage</code>
-     * method performs special processing when this page's Cancel button has
-     * been pressed.
-     * <p>
-     * This is a framework hook method for subclasses to do special things when
-     * the Cancel button has been pressed. The default implementation of this
-     * framework method does nothing and returns <code>true</code>.
-     * @see IPreferencePage#performCancel()
-     */
-    public boolean performCancel() {
-        return true;
-    }
-
-    /**
-     * Performs special processing when this page's Defaults button has been pressed.
-     * <p>
-     * This is a framework hook method for subclasses to do special things when
-     * the Defaults button has been pressed.
-     * Subclasses may override, but should call <code>super.performDefaults</code>.
-     * </p>
-     */
-    protected void performDefaults() {
-        updateApplyButton();
-    }
-
-   
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.preference.IPreferencePage#performOk()
-     */
-    public boolean performOk() {
-        return true;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.preference.IPreferencePage#setContainer(org.eclipse.jface.preference.IPreferencePageContainer)
-     */
-    public void setContainer(IPreferencePageContainer container) {
-        this.container = container;
-    }
-
-    /**
-     * Sets the preference store for this preference page.
-     * <p>
-     * If preferenceStore is set to null, getPreferenceStore
-     * will invoke doGetPreferenceStore the next time it is called.
-     * </p>
-     *
-     * @param store the preference store, or <code>null</code>
-     * @see #getPreferenceStore
-     */
-    public void setPreferenceStore(IPreferenceStore store) {
-        preferenceStore = store;
-    }
-
-   
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.preference.IPreferencePage#setSize(org.eclipse.swt.graphics.Point)
-     */
-    public void setSize(Point uiSize) {
-        Control control = getControl();
-        if (control != null) {
-            control.setSize(uiSize);
-            size = uiSize;
-        }
-    }
-
-    /**
-     * The <code>PreferencePage</code> implementation of this <code>IDialogPage</code>
-     * method extends the <code>DialogPage</code> implementation to update
-     * the preference page container title. Subclasses may extend.
-     * @see IDialogPage#setTitle(String)
-     */
-    public void setTitle(String title) {
-        super.setTitle(title);
-        if (getContainer() != null) {
-			getContainer().updateTitle();
-		}
-    }
-
-    /**
-     * Sets whether this page is valid.
-     * The enable state of the container buttons and the
-     * apply button is updated when a page's valid state 
-     * changes.
-     * <p>
-     *
-     * @param b the new valid state
-     */
-    public void setValid(boolean b) {
-        boolean oldValue = isValid;
-        isValid = b;
-        if (oldValue != isValid) {
-            // update container state
-            if (getContainer() != null) {
-				getContainer().updateButtons();
-			}
-            // update page state
-            updateApplyButton();
-        }
-    }
-
-   
-    /* (non-Javadoc)
-     * @see java.lang.Object#toString()
-     */
-    public String toString() {
-        return getTitle();
-    }
-
-    /**
-     * Updates the enabled state of the Apply button to reflect whether 
-     * this page is valid.
-     */
-    protected void updateApplyButton() {
-        if (applyButton != null) {
-			applyButton.setEnabled(isValid());
-		}
-    }
-
-    /**
-     * Creates a composite with a highlighted Note entry and a message text.
-     * This is designed to take up the full width of the page.
-     * 
-     * @param font the font to use
-     * @param composite the parent composite
-     * @param title the title of the note
-     * @param message the message for the note
-     * @return the composite for the note
-     */
-    protected Composite createNoteComposite(Font font, Composite composite,
-            String title, String message) {
-        Composite messageComposite = new Composite(composite, SWT.NONE);
-        GridLayout messageLayout = new GridLayout();
-        messageLayout.numColumns = 2;
-        messageLayout.marginWidth = 0;
-        messageLayout.marginHeight = 0;
-        messageComposite.setLayout(messageLayout);
-        messageComposite.setLayoutData(new GridData(
-                GridData.HORIZONTAL_ALIGN_FILL));
-        messageComposite.setFont(font);
-
-        final Label noteLabel = new Label(messageComposite, SWT.BOLD);
-        noteLabel.setText(title);
-        noteLabel.setFont(JFaceResources.getFontRegistry().getBold(
-				JFaceResources.DEFAULT_FONT));	
-        noteLabel
-                .setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
-
-        final IPropertyChangeListener fontListener = new IPropertyChangeListener() {
-            public void propertyChange(PropertyChangeEvent event) {
-                if (JFaceResources.BANNER_FONT.equals(event.getProperty())) {
-                    noteLabel.setFont(JFaceResources
-                            .getFont(JFaceResources.BANNER_FONT));
-                }
-            }
-        };
-        JFaceResources.getFontRegistry().addListener(fontListener);
-        noteLabel.addDisposeListener(new DisposeListener() {
-            public void widgetDisposed(DisposeEvent event) {
-                JFaceResources.getFontRegistry().removeListener(fontListener);
-            }
-        });
-
-        Label messageLabel = new Label(messageComposite, SWT.WRAP);
-        messageLabel.setText(message);
-        messageLabel.setFont(font);
-        return messageComposite;
-    }
-
-    /**
-     * Returns the Apply button.
-     * 
-     * @return the Apply button
-     */
-    protected Button getApplyButton() {
-        return applyButton;
-    }
-
-    /**
-     * Returns the Restore Defaults button.
-     * 
-     * @return the Restore Defaults button
-     */
-    protected Button getDefaultsButton() {
-        return defaultsButton;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.IDialogPage#performHelp()
-     */
-    public void performHelp() {
-        getControl().notifyListeners(SWT.Help, new Event());
-    }
-
-	/**
-	 * Apply the data to the receiver. By default do nothing.
-	 * @param data
-	 * @since 3.1
-	 */
-	public void applyData(Object data) {
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.DialogPage#setErrorMessage(java.lang.String)
-	 */
-	public void setErrorMessage(String newMessage) {
-		super.setErrorMessage(newMessage);
-		if (getContainer() != null) {
-			getContainer().updateMessage();
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.DialogPage#setMessage(java.lang.String, int)
-	 */
-	public void setMessage(String newMessage, int newType) {
-		super.setMessage(newMessage, newType);
-		if (getContainer() != null) {
-			getContainer().updateMessage();
-		}
-	}	
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceStore.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceStore.java
deleted file mode 100644
index 29259ba..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceStore.java
+++ /dev/null
@@ -1,712 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Properties;
-
-import org.eclipse.core.commands.common.EventManager;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.util.SafeRunnable;
-
-/**
- * A concrete preference store implementation based on an internal
- * <code>java.util.Properties</code> object, with support for persisting the
- * non-default preference values to files or streams.
- * <p>
- * This class was not designed to be subclassed.
- * </p>
- * 
- * @see IPreferenceStore
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class PreferenceStore extends EventManager implements
-		IPersistentPreferenceStore {
-
-	/**
-	 * The mapping from preference name to preference value (represented as
-	 * strings).
-	 */
-	private Properties properties;
-
-	/**
-	 * The mapping from preference name to default preference value (represented
-	 * as strings); <code>null</code> if none.
-	 */
-	private Properties defaultProperties;
-
-	/**
-	 * Indicates whether a value as been changed by <code>setToDefault</code>
-	 * or <code>setValue</code>; initially <code>false</code>.
-	 */
-	private boolean dirty = false;
-
-	/**
-	 * The file name used by the <code>load</code> method to load a property
-	 * file. This filename is used to save the properties file when
-	 * <code>save</code> is called.
-	 */
-	private String filename;
-
-	/**
-	 * Creates an empty preference store.
-	 * <p>
-	 * Use the methods <code>load(InputStream)</code> and
-	 * <code>save(InputStream)</code> to load and store this preference store.
-	 * </p>
-	 * 
-	 * @see #load(InputStream)
-	 * @see #save(OutputStream, String)
-	 */
-	public PreferenceStore() {
-		defaultProperties = new Properties();
-		properties = new Properties(defaultProperties);
-	}
-
-	/**
-	 * Creates an empty preference store that loads from and saves to the a
-	 * file.
-	 * <p>
-	 * Use the methods <code>load()</code> and <code>save()</code> to load
-	 * and store this preference store.
-	 * </p>
-	 * 
-	 * @param filename
-	 *            the file name
-	 * @see #load()
-	 * @see #save()
-	 */
-	public PreferenceStore(String filename) {
-		this();
-		Assert.isNotNull(filename);
-		this.filename = filename;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void addPropertyChangeListener(IPropertyChangeListener listener) {
-		addListenerObject(listener);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public boolean contains(String name) {
-		return (properties.containsKey(name) || defaultProperties
-				.containsKey(name));
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void firePropertyChangeEvent(String name, Object oldValue,
-			Object newValue) {
-		final Object[] finalListeners = getListeners();
-		// Do we need to fire an event.
-		if (finalListeners.length > 0
-				&& (oldValue == null || !oldValue.equals(newValue))) {
-			final PropertyChangeEvent pe = new PropertyChangeEvent(this, name,
-					oldValue, newValue);
-			for (int i = 0; i < finalListeners.length; ++i) {
-				final IPropertyChangeListener l = (IPropertyChangeListener) finalListeners[i];
-				SafeRunnable.run(new SafeRunnable(JFaceResources
-						.getString("PreferenceStore.changeError")) { //$NON-NLS-1$
-							public void run() {
-								l.propertyChange(pe);
-							}
-						});
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public boolean getBoolean(String name) {
-		return getBoolean(properties, name);
-	}
-
-	/**
-	 * Helper function: gets boolean for a given name.
-	 * 
-	 * @param p
-	 * @param name
-	 * @return boolean
-	 */
-	private boolean getBoolean(Properties p, String name) {
-		String value = p != null ? p.getProperty(name) : null;
-		if (value == null) {
-			return BOOLEAN_DEFAULT_DEFAULT;
-		}
-		if (value.equals(IPreferenceStore.TRUE)) {
-			return true;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public boolean getDefaultBoolean(String name) {
-		return getBoolean(defaultProperties, name);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public double getDefaultDouble(String name) {
-		return getDouble(defaultProperties, name);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public float getDefaultFloat(String name) {
-		return getFloat(defaultProperties, name);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public int getDefaultInt(String name) {
-		return getInt(defaultProperties, name);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public long getDefaultLong(String name) {
-		return getLong(defaultProperties, name);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public String getDefaultString(String name) {
-		return getString(defaultProperties, name);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public double getDouble(String name) {
-		return getDouble(properties, name);
-	}
-
-	/**
-	 * Helper function: gets double for a given name.
-	 * 
-	 * @param p
-	 * @param name
-	 * @return double
-	 */
-	private double getDouble(Properties p, String name) {
-		String value = p != null ? p.getProperty(name) : null;
-		if (value == null) {
-			return DOUBLE_DEFAULT_DEFAULT;
-		}
-		double ival = DOUBLE_DEFAULT_DEFAULT;
-		try {
-			ival = new Double(value).doubleValue();
-		} catch (NumberFormatException e) {
-		}
-		return ival;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public float getFloat(String name) {
-		return getFloat(properties, name);
-	}
-
-	/**
-	 * Helper function: gets float for a given name.
-	 * 
-	 * @param p
-	 * @param name
-	 * @return float
-	 */
-	private float getFloat(Properties p, String name) {
-		String value = p != null ? p.getProperty(name) : null;
-		if (value == null) {
-			return FLOAT_DEFAULT_DEFAULT;
-		}
-		float ival = FLOAT_DEFAULT_DEFAULT;
-		try {
-			ival = new Float(value).floatValue();
-		} catch (NumberFormatException e) {
-		}
-		return ival;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public int getInt(String name) {
-		return getInt(properties, name);
-	}
-
-	/**
-	 * Helper function: gets int for a given name.
-	 * 
-	 * @param p
-	 * @param name
-	 * @return int
-	 */
-	private int getInt(Properties p, String name) {
-		String value = p != null ? p.getProperty(name) : null;
-		if (value == null) {
-			return INT_DEFAULT_DEFAULT;
-		}
-		int ival = 0;
-		try {
-			ival = Integer.parseInt(value);
-		} catch (NumberFormatException e) {
-		}
-		return ival;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public long getLong(String name) {
-		return getLong(properties, name);
-	}
-
-	/**
-	 * Helper function: gets long for a given name.
-	 * 
-	 * @param p
-	 *            the properties storage (may be <code>null</code>)
-	 * @param name
-	 *            the name of the property
-	 * @return the long or a default value of if:
-	 *         <ul>
-	 *         <li>properties storage is <code>null</code></li>
-	 *         <li>property is not found</li>
-	 *         <li>property value is not a number</li>
-	 *         </ul>
-	 * @see IPreferenceStore#LONG_DEFAULT_DEFAULT
-	 */
-	private long getLong(Properties p, String name) {
-		String value = p != null ? p.getProperty(name) : null;
-		if (value == null) {
-			return LONG_DEFAULT_DEFAULT;
-		}
-		long ival = LONG_DEFAULT_DEFAULT;
-		try {
-			ival = Long.parseLong(value);
-		} catch (NumberFormatException e) {
-		}
-		return ival;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public String getString(String name) {
-		return getString(properties, name);
-	}
-
-	/**
-	 * Helper function: gets string for a given name.
-	 * 
-	 * @param p
-	 *            the properties storage (may be <code>null</code>)
-	 * @param name
-	 *            the name of the property
-	 * @return the value or a default value of if:
-	 *         <ul>
-	 *         <li>properties storage is <code>null</code></li>
-	 *         <li>property is not found</li>
-	 *         <li>property value is not a number</li>
-	 *         </ul>
-	 * @see IPreferenceStore#STRING_DEFAULT_DEFAULT
-	 */
-	private String getString(Properties p, String name) {
-		String value = p != null ? p.getProperty(name) : null;
-		if (value == null) {
-			return STRING_DEFAULT_DEFAULT;
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public boolean isDefault(String name) {
-		return (!properties.containsKey(name) && defaultProperties
-				.containsKey(name));
-	}
-
-	/**
-	 * Prints the contents of this preference store to the given print stream.
-	 * 
-	 * @param out
-	 *            the print stream
-	 */
-	public void list(PrintStream out) {
-		properties.list(out);
-	}
-
-	/**
-	 * Prints the contents of this preference store to the given print writer.
-	 * 
-	 * @param out
-	 *            the print writer
-	 */
-	public void list(PrintWriter out) {
-		properties.list(out);
-	}
-
-	/**
-	 * Loads this preference store from the file established in the constructor
-	 * <code>PreferenceStore(java.lang.String)</code> (or by
-	 * <code>setFileName</code>). Default preference values are not affected.
-	 * 
-	 * @exception java.io.IOException
-	 *                if there is a problem loading this store
-	 */
-	public void load() throws IOException {
-		if (filename == null) {
-			throw new IOException("File name not specified");//$NON-NLS-1$
-		}
-		FileInputStream in = new FileInputStream(filename);
-		load(in);
-		in.close();
-	}
-
-	/**
-	 * Loads this preference store from the given input stream. Default
-	 * preference values are not affected.
-	 * 
-	 * @param in
-	 *            the input stream
-	 * @exception java.io.IOException
-	 *                if there is a problem loading this store
-	 */
-	public void load(InputStream in) throws IOException {
-		properties.load(in);
-		dirty = false;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public boolean needsSaving() {
-		return dirty;
-	}
-
-	/**
-	 * Returns an enumeration of all preferences known to this store which have
-	 * current values other than their default value.
-	 * 
-	 * @return an array of preference names
-	 */
-	public String[] preferenceNames() {
-		ArrayList list = new ArrayList();
-		Enumeration it = properties.propertyNames();
-		while (it.hasMoreElements()) {
-			list.add(it.nextElement());
-		}
-		return (String[]) list.toArray(new String[list.size()]);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void putValue(String name, String value) {
-		String oldValue = getString(name);
-		if (oldValue == null || !oldValue.equals(value)) {
-			setValue(properties, name, value);
-			dirty = true;
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void removePropertyChangeListener(IPropertyChangeListener listener) {
-		removeListenerObject(listener);
-	}
-
-	/**
-	 * Saves the non-default-valued preferences known to this preference store
-	 * to the file from which they were originally loaded.
-	 * 
-	 * @exception java.io.IOException
-	 *                if there is a problem saving this store
-	 */
-	public void save() throws IOException {
-		if (filename == null) {
-			throw new IOException("File name not specified");//$NON-NLS-1$
-		}
-		FileOutputStream out = null;
-		try {
-			out = new FileOutputStream(filename);
-			save(out, null);
-		} finally {
-			if (out != null) {
-				out.close();
-			}
-		}
-	}
-
-	/**
-	 * Saves this preference store to the given output stream. The given string
-	 * is inserted as header information.
-	 * 
-	 * @param out
-	 *            the output stream
-	 * @param header
-	 *            the header
-	 * @exception java.io.IOException
-	 *                if there is a problem saving this store
-	 */
-	public void save(OutputStream out, String header) throws IOException {
-		properties.store(out, header);
-		dirty = false;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void setDefault(String name, double value) {
-		setValue(defaultProperties, name, value);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void setDefault(String name, float value) {
-		setValue(defaultProperties, name, value);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void setDefault(String name, int value) {
-		setValue(defaultProperties, name, value);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void setDefault(String name, long value) {
-		setValue(defaultProperties, name, value);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void setDefault(String name, String value) {
-		setValue(defaultProperties, name, value);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void setDefault(String name, boolean value) {
-		setValue(defaultProperties, name, value);
-	}
-
-	/**
-	 * Sets the name of the file used when loading and storing this preference
-	 * store.
-	 * <p>
-	 * Afterward, the methods <code>load()</code> and <code>save()</code>
-	 * can be used to load and store this preference store.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the file name
-	 * @see #load()
-	 * @see #save()
-	 */
-	public void setFilename(String name) {
-		filename = name;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void setToDefault(String name) {
-		Object oldValue = properties.get(name);
-		properties.remove(name);
-		dirty = true;
-		Object newValue = null;
-		if (defaultProperties != null) {
-			newValue = defaultProperties.get(name);
-		}
-		firePropertyChangeEvent(name, oldValue, newValue);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void setValue(String name, double value) {
-		double oldValue = getDouble(name);
-		if (oldValue != value) {
-			setValue(properties, name, value);
-			dirty = true;
-			firePropertyChangeEvent(name, new Double(oldValue), new Double(
-					value));
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void setValue(String name, float value) {
-		float oldValue = getFloat(name);
-		if (oldValue != value) {
-			setValue(properties, name, value);
-			dirty = true;
-			firePropertyChangeEvent(name, new Float(oldValue), new Float(value));
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void setValue(String name, int value) {
-		int oldValue = getInt(name);
-		if (oldValue != value) {
-			setValue(properties, name, value);
-			dirty = true;
-			firePropertyChangeEvent(name, new Integer(oldValue), new Integer(
-					value));
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void setValue(String name, long value) {
-		long oldValue = getLong(name);
-		if (oldValue != value) {
-			setValue(properties, name, value);
-			dirty = true;
-			firePropertyChangeEvent(name, new Long(oldValue), new Long(value));
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void setValue(String name, String value) {
-		String oldValue = getString(name);
-		if (oldValue == null || !oldValue.equals(value)) {
-			setValue(properties, name, value);
-			dirty = true;
-			firePropertyChangeEvent(name, oldValue, value);
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPreferenceStore.
-	 */
-	public void setValue(String name, boolean value) {
-		boolean oldValue = getBoolean(name);
-		if (oldValue != value) {
-			setValue(properties, name, value);
-			dirty = true;
-			firePropertyChangeEvent(name, oldValue ? Boolean.TRUE
-					: Boolean.FALSE, value ? Boolean.TRUE : Boolean.FALSE);
-		}
-	}
-
-	/**
-	 * Helper method: sets value for a given name.
-	 * 
-	 * @param p
-	 * @param name
-	 * @param value
-	 */
-	private void setValue(Properties p, String name, double value) {
-		Assert.isTrue(p != null);
-		p.put(name, Double.toString(value));
-	}
-
-	/**
-	 * Helper method: sets value for a given name.
-	 * 
-	 * @param p
-	 * @param name
-	 * @param value
-	 */
-	private void setValue(Properties p, String name, float value) {
-		Assert.isTrue(p != null);
-		p.put(name, Float.toString(value));
-	}
-
-	/**
-	 * Helper method: sets value for a given name.
-	 * 
-	 * @param p
-	 * @param name
-	 * @param value
-	 */
-	private void setValue(Properties p, String name, int value) {
-		Assert.isTrue(p != null);
-		p.put(name, Integer.toString(value));
-	}
-
-	/**
-	 * Helper method: sets the value for a given name.
-	 * 
-	 * @param p
-	 * @param name
-	 * @param value
-	 */
-	private void setValue(Properties p, String name, long value) {
-		Assert.isTrue(p != null);
-		p.put(name, Long.toString(value));
-	}
-
-	/**
-	 * Helper method: sets the value for a given name.
-	 * 
-	 * @param p
-	 * @param name
-	 * @param value
-	 */
-	private void setValue(Properties p, String name, String value) {
-		Assert.isTrue(p != null && value != null);
-		p.put(name, value);
-	}
-
-	/**
-	 * Helper method: sets the value for a given name.
-	 * 
-	 * @param p
-	 * @param name
-	 * @param value
-	 */
-	private void setValue(Properties p, String name, boolean value) {
-		Assert.isTrue(p != null);
-		p.put(name, value == true ? IPreferenceStore.TRUE
-				: IPreferenceStore.FALSE);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/RadioGroupFieldEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/RadioGroupFieldEditor.java
deleted file mode 100644
index 826f0c4..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/RadioGroupFieldEditor.java
+++ /dev/null
@@ -1,349 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-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;
-
-/**
- * A field editor for an enumeration type preference.
- * The choices are presented as a list of radio buttons.
- */
-public class RadioGroupFieldEditor extends FieldEditor {
-
-    /**
-     * List of radio button entries of the form [label,value].
-     */
-    private String[][] labelsAndValues;
-
-    /**
-     * Number of columns into which to arrange the radio buttons.
-     */
-    private int numColumns;
-
-    /**
-     * Indent used for the first column of the radion button matrix.
-     */
-    private int indent = HORIZONTAL_GAP;
-
-    /**
-     * The current value, or <code>null</code> if none.
-     */
-    private String value;
-
-    /**
-     * The box of radio buttons, or <code>null</code> if none
-     * (before creation and after disposal).
-     */
-    private Composite radioBox;
-
-    /**
-     * The radio buttons, or <code>null</code> if none
-     * (before creation and after disposal).
-     */
-    private Button[] radioButtons;
-
-    /**
-     * Whether to use a Group control.
-     */
-    private boolean useGroup;
-
-    /**
-     * Creates a new radio group field editor 
-     */
-    protected RadioGroupFieldEditor() {
-    }
-
-    /**
-     * Creates a radio group field editor.  
-     * This constructor does not use a <code>Group</code> to contain the radio buttons.
-     * It is equivalent to using the following constructor with <code>false</code>
-     * for the <code>useGroup</code> argument.
-     * <p>
-     * Example usage:
-     * <pre>
-     *		RadioGroupFieldEditor editor= new RadioGroupFieldEditor(
-     *			"GeneralPage.DoubleClick", resName, 1,
-     *			new String[][] {
-     *				{"Open Browser", "open"},
-     *				{"Expand Tree", "expand"}
-     *			},
-     *          parent);	
-     * </pre>
-     * </p>
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param numColumns the number of columns for the radio button presentation
-     * @param labelAndValues list of radio button [label, value] entries;
-     *  the value is returned when the radio button is selected
-     * @param parent the parent of the field editor's control
-     */
-    public RadioGroupFieldEditor(String name, String labelText, int numColumns,
-            String[][] labelAndValues, Composite parent) {
-        this(name, labelText, numColumns, labelAndValues, parent, false);
-    }
-
-    /**
-     * Creates a radio group field editor.
-     * <p>
-     * Example usage:
-     * <pre>
-     *		RadioGroupFieldEditor editor= new RadioGroupFieldEditor(
-     *			"GeneralPage.DoubleClick", resName, 1,
-     *			new String[][] {
-     *				{"Open Browser", "open"},
-     *				{"Expand Tree", "expand"}
-     *			},
-     *          parent,
-     *          true);	
-     * </pre>
-     * </p>
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param numColumns the number of columns for the radio button presentation
-     * @param labelAndValues list of radio button [label, value] entries;
-     *  the value is returned when the radio button is selected
-     * @param parent the parent of the field editor's control
-     * @param useGroup whether to use a Group control to contain the radio buttons
-     */
-    public RadioGroupFieldEditor(String name, String labelText, int numColumns,
-            String[][] labelAndValues, Composite parent, boolean useGroup) {
-        init(name, labelText);
-        Assert.isTrue(checkArray(labelAndValues));
-        this.labelsAndValues = labelAndValues;
-        this.numColumns = numColumns;
-        this.useGroup = useGroup;
-        createControl(parent);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void adjustForNumColumns(int numColumns) {
-        Control control = getLabelControl();
-        if (control != null) {
-            ((GridData) control.getLayoutData()).horizontalSpan = numColumns;
-        }
-        ((GridData) radioBox.getLayoutData()).horizontalSpan = numColumns;
-    }
-
-    /**
-     * Checks whether given <code>String[][]</code> is of "type" 
-     * <code>String[][2]</code>.
-     * @param table
-     *
-     * @return <code>true</code> if it is ok, and <code>false</code> otherwise
-     */
-    private boolean checkArray(String[][] table) {
-        if (table == null) {
-			return false;
-		}
-        for (int i = 0; i < table.length; i++) {
-            String[] array = table[i];
-            if (array == null || array.length != 2) {
-				return false;
-			}
-        }
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doFillIntoGrid(Composite parent, int numColumns) {
-        if (useGroup) {
-            Control control = getRadioBoxControl(parent);
-            GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-            control.setLayoutData(gd);
-        } else {
-            Control control = getLabelControl(parent);
-            GridData gd = new GridData();
-            gd.horizontalSpan = numColumns;
-            control.setLayoutData(gd);
-            control = getRadioBoxControl(parent);
-            gd = new GridData();
-            gd.horizontalSpan = numColumns;
-            gd.horizontalIndent = indent;
-            control.setLayoutData(gd);
-        }
-
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doLoad() {
-        updateValue(getPreferenceStore().getString(getPreferenceName()));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doLoadDefault() {
-        updateValue(getPreferenceStore().getDefaultString(getPreferenceName()));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doStore() {
-        if (value == null) {
-            getPreferenceStore().setToDefault(getPreferenceName());
-            return;
-        }
-
-        getPreferenceStore().setValue(getPreferenceName(), value);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    public int getNumberOfControls() {
-        return 1;
-    }
-
-    /**
-     * Returns this field editor's radio group control.
-     * @param parent The parent to create the radioBox in
-     * @return the radio group control
-     */
-    public Composite getRadioBoxControl(Composite parent) {
-        if (radioBox == null) {
-
-            Font font = parent.getFont();
-
-            if (useGroup) {
-                Group group = new Group(parent, SWT.NONE);
-                group.setFont(font);
-                String text = getLabelText();
-                if (text != null) {
-					group.setText(text);
-				}
-                radioBox = group;
-                GridLayout layout = new GridLayout();
-                layout.horizontalSpacing = HORIZONTAL_GAP;
-                layout.numColumns = numColumns;
-                radioBox.setLayout(layout);
-            } else {
-                radioBox = new Composite(parent, SWT.NONE);
-                GridLayout layout = new GridLayout();
-                layout.marginWidth = 0;
-                layout.marginHeight = 0;
-                layout.horizontalSpacing = HORIZONTAL_GAP;
-                layout.numColumns = numColumns;
-                radioBox.setLayout(layout);
-                radioBox.setFont(font);
-            }
-
-            radioButtons = new Button[labelsAndValues.length];
-            for (int i = 0; i < labelsAndValues.length; i++) {
-                Button radio = new Button(radioBox, SWT.RADIO | SWT.LEFT);
-                radioButtons[i] = radio;
-                String[] labelAndValue = labelsAndValues[i];
-                radio.setText(labelAndValue[0]);
-                radio.setData(labelAndValue[1]);
-                radio.setFont(font);
-                radio.addSelectionListener(new SelectionAdapter() {
-                    public void widgetSelected(SelectionEvent event) {
-                        String oldValue = value;
-                        value = (String) event.widget.getData();
-                        setPresentsDefaultValue(false);
-                        fireValueChanged(VALUE, oldValue, value);
-                    }
-                });
-            }
-            radioBox.addDisposeListener(new DisposeListener() {
-                public void widgetDisposed(DisposeEvent event) {
-                    radioBox = null;
-                    radioButtons = null;
-                }
-            });
-        } else {
-            checkParent(radioBox, parent);
-        }
-        return radioBox;
-    }
-
-    /**
-     * Sets the indent used for the first column of the radion button matrix.
-     *
-     * @param indent the indent (in pixels)
-     */
-    public void setIndent(int indent) {
-        if (indent < 0) {
-			this.indent = 0;
-		} else {
-			this.indent = indent;
-		}
-    }
-
-    /**
-     * Select the radio button that conforms to the given value.
-     *
-     * @param selectedValue the selected value
-     */
-    private void updateValue(String selectedValue) {
-        this.value = selectedValue;
-        if (radioButtons == null) {
-			return;
-		}
-
-        if (this.value != null) {
-            boolean found = false;
-            for (int i = 0; i < radioButtons.length; i++) {
-                Button radio = radioButtons[i];
-                boolean selection = false;
-                if (((String) radio.getData()).equals(this.value)) {
-                    selection = true;
-                    found = true;
-                }
-                radio.setSelection(selection);
-            }
-            if (found) {
-				return;
-			}
-        }
-
-        // We weren't able to find the value. So we select the first
-        // radio button as a default.
-        if (radioButtons.length > 0) {
-            radioButtons[0].setSelection(true);
-            this.value = (String) radioButtons[0].getData();
-        }
-        return;
-    }
-
-    /*
-     * @see FieldEditor.setEnabled(boolean,Composite).
-     */
-    public void setEnabled(boolean enabled, Composite parent) {
-        if (!useGroup) {
-			super.setEnabled(enabled, parent);
-		}
-        for (int i = 0; i < radioButtons.length; i++) {
-            radioButtons[i].setEnabled(enabled);
-        }
-
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/ScaleFieldEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/ScaleFieldEditor.java
deleted file mode 100644
index 1a9269f..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/ScaleFieldEditor.java
+++ /dev/null
@@ -1,380 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Scale;
-
-/**
- * A field editor for an integer type preference. This class may be used as is,
- * or subclassed as required.
- * 
- * @since 3.0
- */
-public class ScaleFieldEditor extends FieldEditor {
-
-    /**
-     * Value that will feed Scale.setIncrement(int).
-     */
-    private int incrementValue;
-
-    /**
-     * Value that will feed Scale.setMaximum(int).
-     */
-    private int maxValue;
-
-    /**
-     * Value that will feed Scale.setMinimum(int).
-     */
-    private int minValue;
-
-    /**
-     * Old integer value.
-     */
-    private int oldValue;
-
-    /**
-     * Value that will feed Scale.setPageIncrement(int).
-     */
-    private int pageIncrementValue;
-
-    /**
-     * The scale, or <code>null</code> if none.
-     */
-    protected Scale scale;
-
-    /**
-     * Creates a scale field editor.
-     * 
-     * @param name
-     *            the name of the preference this field editor works on
-     * @param labelText
-     *            the label text of the field editor
-     * @param parent
-     *            the parent of the field editor's control
-     */
-    public ScaleFieldEditor(String name, String labelText, Composite parent) {
-        super(name, labelText, parent);
-        setDefaultValues();
-    }
-
-    /**
-     * Creates a scale field editor with particular scale values.
-     * 
-     * @param name
-     *            the name of the preference this field editor works on
-     * @param labelText
-     *            the label text of the field editor
-     * @param parent
-     *            the parent of the field editor's control
-     * @param min
-     *            the value used for Scale.setMinimum(int).
-     * @param max
-     *            the value used for Scale.setMaximum(int).
-     * @param increment
-     *            the value used for Scale.setIncrement(int).
-     * @param pageIncrement
-     *            the value used for Scale.setPageIncrement(int).
-     */
-    public ScaleFieldEditor(String name, String labelText, Composite parent,
-            int min, int max, int increment, int pageIncrement) {
-        super(name, labelText, parent);
-        setValues(min, max, increment, pageIncrement);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.preference.FieldEditor#adjustForNumColumns(int)
-     */
-    protected void adjustForNumColumns(int numColumns) {
-        ((GridData) scale.getLayoutData()).horizontalSpan = numColumns - 1;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.preference.FieldEditor#doFillIntoGrid(org.eclipse.swt.widgets.Composite,
-     *      int)
-     */
-    protected void doFillIntoGrid(Composite parent, int numColumns) {
-        Control control = getLabelControl(parent);
-        GridData gd = new GridData();
-        control.setLayoutData(gd);
-
-        scale = getScaleControl(parent);
-        gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.verticalAlignment = GridData.FILL;
-        gd.horizontalSpan = numColumns - 1;
-        gd.grabExcessHorizontalSpace = true;
-        scale.setLayoutData(gd);
-        updateScale();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.preference.FieldEditor#doLoad()
-     */
-    protected void doLoad() {
-        if (scale != null) {
-            int value = getPreferenceStore().getInt(getPreferenceName());
-            scale.setSelection(value);
-            oldValue = value;
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.preference.FieldEditor#doLoadDefault()
-     */
-    protected void doLoadDefault() {
-        if (scale != null) {
-            int value = getPreferenceStore().getDefaultInt(getPreferenceName());
-            scale.setSelection(value);
-        }
-        valueChanged();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.preference.FieldEditor#doStore()
-     */
-    protected void doStore() {
-        getPreferenceStore()
-                .setValue(getPreferenceName(), scale.getSelection());
-    }
-
-    /**
-     * Returns the value that will be used for Scale.setIncrement(int).
-     * 
-     * @return the value.
-     * @see org.eclipse.swt.widgets.Scale#setIncrement(int)
-     */
-    public int getIncrement() {
-        return incrementValue;
-    }
-
-    /**
-     * Returns the value that will be used for Scale.setMaximum(int).
-     * 
-     * @return the value.
-     * @see org.eclipse.swt.widgets.Scale#setMaximum(int)
-     */
-    public int getMaximum() {
-        return maxValue;
-    }
-
-    /**
-     * Returns the value that will be used for Scale.setMinimum(int).
-     * 
-     * @return the value.
-     * @see org.eclipse.swt.widgets.Scale#setMinimum(int)
-     */
-    public int getMinimum() {
-        return minValue;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.preference.FieldEditor#getNumberOfControls()
-     */
-    public int getNumberOfControls() {
-        return 2;
-    }
-
-    /**
-     * Returns the value that will be used for Scale.setPageIncrement(int).
-     * 
-     * @return the value.
-     * @see org.eclipse.swt.widgets.Scale#setPageIncrement(int)
-     */
-    public int getPageIncrement() {
-        return pageIncrementValue;
-    }
-
-    /**
-     * Returns this field editor's scale control.
-     * 
-     * @return the scale control, or <code>null</code> if no scale field is
-     *         created yet
-     */
-    public Scale getScaleControl() {
-        return scale;
-    }
-
-    /**
-     * Returns this field editor's scale control. The control is created if it
-     * does not yet exist.
-     * 
-     * @param parent
-     *            the parent
-     * @return the scale control
-     */
-    private Scale getScaleControl(Composite parent) {
-        if (scale == null) {
-            scale = new Scale(parent, SWT.HORIZONTAL);
-            scale.setFont(parent.getFont());
-            scale.addSelectionListener(new SelectionAdapter() {
-                public void widgetSelected(SelectionEvent event) {
-                    valueChanged();
-                }
-            });
-            scale.addDisposeListener(new DisposeListener() {
-                public void widgetDisposed(DisposeEvent event) {
-                    scale = null;
-                }
-            });
-        } else {
-            checkParent(scale, parent);
-        }
-        return scale;
-    }
-
-    /**
-     * Set default values for the various scale fields.  These defaults are:<br>
-     * <ul>
-     * <li>Minimum  = 0
-     * <li>Maximim = 10
-     * <li>Increment = 1
-     * <li>Page Increment = 1
-     * </ul> 
-     */
-    private void setDefaultValues() {
-        setValues(0, 10, 1, 1);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.preference.FieldEditor#setFocus()
-     */
-    public void setFocus() {
-        if (scale != null && !scale.isDisposed()) {
-            scale.setFocus();
-        }
-    }
-
-    /**
-     * Set the value to be used for Scale.setIncrement(int) and update the
-     * scale.
-     * 
-     * @param increment
-     *            a value greater than 0.
-     * @see org.eclipse.swt.widgets.Scale#setIncrement(int)
-     */
-    public void setIncrement(int increment) {
-        this.incrementValue = increment;
-        updateScale();
-    }
-
-    /**
-     * Set the value to be used for Scale.setMaximum(int) and update the
-     * scale.
-     * 
-     * @param max
-     *            a value greater than 0.
-     * @see org.eclipse.swt.widgets.Scale#setMaximum(int)
-     */
-    public void setMaximum(int max) {
-        this.maxValue = max;
-        updateScale();
-    }
-
-    /**
-     * Set the value to be used for Scale.setMinumum(int) and update the
-     * scale.
-     * 
-     * @param min
-     *            a value greater than 0.
-     * @see org.eclipse.swt.widgets.Scale#setMinimum(int)
-     */
-    public void setMinimum(int min) {
-        this.minValue = min;
-        updateScale();
-    }
-
-    /**
-     * Set the value to be used for Scale.setPageIncrement(int) and update the
-     * scale.
-     * 
-     * @param pageIncrement
-     *            a value greater than 0.
-     * @see org.eclipse.swt.widgets.Scale#setPageIncrement(int)
-     */
-    public void setPageIncrement(int pageIncrement) {
-        this.pageIncrementValue = pageIncrement;
-        updateScale();
-    }
-
-    /**
-     * Set all Scale values.
-     * 
-     * @param min
-     *            the value used for Scale.setMinimum(int).
-     * @param max
-     *            the value used for Scale.setMaximum(int).
-     * @param increment
-     *            the value used for Scale.setIncrement(int).
-     * @param pageIncrement
-     *            the value used for Scale.setPageIncrement(int).
-     */
-    private void setValues(int min, int max, int increment, int pageIncrement) {
-        this.incrementValue = increment;
-        this.maxValue = max;
-        this.minValue = min;
-        this.pageIncrementValue = pageIncrement;
-        updateScale();
-    }
-
-    /**
-     * Update the scale particulars with set values.
-     */
-    private void updateScale() {
-        if (scale != null && !scale.isDisposed()) {
-            scale.setMinimum(getMinimum());
-            scale.setMaximum(getMaximum());
-            scale.setIncrement(getIncrement());
-            scale.setPageIncrement(getPageIncrement());
-        }
-    }
-
-    /**
-     * Informs this field editor's listener, if it has one, about a change to
-     * the value (<code>VALUE</code> property) provided that the old and new
-     * values are different.
-     * <p>
-     * This hook is <em>not</em> called when the scale is initialized (or
-     * reset to the default value) from the preference store.
-     * </p>
-     */
-    protected void valueChanged() {
-        setPresentsDefaultValue(false);
-
-        int newValue = scale.getSelection();
-        if (newValue != oldValue) {
-            fireStateChanged(IS_VALID, false, true);
-            fireValueChanged(VALUE, new Integer(oldValue),
-                    new Integer(newValue));
-            oldValue = newValue;
-        }
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/StringButtonFieldEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/StringButtonFieldEditor.java
deleted file mode 100644
index 9fbae8a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/StringButtonFieldEditor.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Thierry Lach - thierry.lach@bbdodetroit.com - Fix for Bug 37155
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * An abstract field editor for a string type preference that presents
- * a string input field with a change button to its right to edit the
- * input field's content. When the user presses the change button, the
- * abstract framework method <code>changePressed()</code> gets called
- * to compute a new string.
- */
-public abstract class StringButtonFieldEditor extends StringFieldEditor {
-
-    /**
-     * The change button, or <code>null</code> if none
-     * (before creation and after disposal).
-     */
-    private Button changeButton;
-
-    /**
-     * The text for the change button, or <code>null</code> if missing.
-     */
-    private String changeButtonText;
-
-    /**
-     * Creates a new string button field editor 
-     */
-    protected StringButtonFieldEditor() {
-    }
-
-    /**
-     * Creates a string button field editor.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param parent the parent of the field editor's control
-     */
-    protected StringButtonFieldEditor(String name, String labelText,
-            Composite parent) {
-        init(name, labelText);
-        createControl(parent);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void adjustForNumColumns(int numColumns) {
-        ((GridData) getTextControl().getLayoutData()).horizontalSpan = numColumns - 2;
-    }
-
-    /**
-     * Notifies that this field editor's change button has been pressed.
-     * <p>
-     * Subclasses must implement this method to provide a corresponding
-     * new string for the text field. If the returned value is <code>null</code>,
-     * the currently displayed value remains.
-     * </p>
-     *
-     * @return the new string to display, or <code>null</code> to leave the
-     *  old string showing
-     */
-    protected abstract String changePressed();
-
-    /* (non-Javadoc)
-     * Method declared on StringFieldEditor (and FieldEditor).
-     */
-    protected void doFillIntoGrid(Composite parent, int numColumns) {
-        super.doFillIntoGrid(parent, numColumns - 1);
-        changeButton = getChangeControl(parent);
-        GridData gd = new GridData();
-        gd.horizontalAlignment = GridData.FILL;
-        int widthHint = convertHorizontalDLUsToPixels(changeButton,
-                IDialogConstants.BUTTON_WIDTH);
-        gd.widthHint = Math.max(widthHint, changeButton.computeSize(
-                SWT.DEFAULT, SWT.DEFAULT, true).x);
-        changeButton.setLayoutData(gd);
-    }
-
-    /**
-     * Get the change control. Create it in parent if required.
-     * @param parent
-     * @return Button
-     */
-    protected Button getChangeControl(Composite parent) {
-        if (changeButton == null) {
-            changeButton = new Button(parent, SWT.PUSH);
-            if (changeButtonText == null) {
-				changeButtonText = JFaceResources.getString("openChange"); //$NON-NLS-1$
-			}
-            changeButton.setText(changeButtonText);
-            changeButton.setFont(parent.getFont());
-            changeButton.addSelectionListener(new SelectionAdapter() {
-                public void widgetSelected(SelectionEvent evt) {
-                    String newValue = changePressed();
-                    if (newValue != null) {
-                        setStringValue(newValue);
-                    }
-                }
-            });
-            changeButton.addDisposeListener(new DisposeListener() {
-                public void widgetDisposed(DisposeEvent event) {
-                    changeButton = null;
-                }
-            });
-        } else {
-            checkParent(changeButton, parent);
-        }
-        return changeButton;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    public int getNumberOfControls() {
-        return 3;
-    }
-
-    /**
-     * Returns this field editor's shell.
-     *
-     * @return the shell
-     */
-    protected Shell getShell() {
-        if (changeButton == null) {
-			return null;
-		}
-        return changeButton.getShell();
-    }
-
-    /**
-     * Sets the text of the change button.
-     *
-     * @param text the new text
-     */
-    public void setChangeButtonText(String text) {
-        Assert.isNotNull(text);
-        changeButtonText = text;
-        if (changeButton != null) {
-			changeButton.setText(text);
-			Point prefSize = changeButton.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-			GridData data = (GridData)changeButton.getLayoutData();
-			data.widthHint = Math.max(SWT.DEFAULT, prefSize.x);
-		}
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.preference.FieldEditor#setEnabled(boolean, org.eclipse.swt.widgets.Composite)
-     */
-    public void setEnabled(boolean enabled, Composite parent) {
-        super.setEnabled(enabled, parent);
-        if (changeButton != null) {
-            changeButton.setEnabled(enabled);
-        }
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/StringFieldEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/StringFieldEditor.java
deleted file mode 100644
index 485da67..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/StringFieldEditor.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.preference;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-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.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A field editor for a string type preference.
- * <p>
- * This class may be used as is, or subclassed as required.
- * </p>
- */
-public class StringFieldEditor extends FieldEditor {
-
-    /**
-     * Validation strategy constant (value <code>0</code>) indicating that
-     * the editor should perform validation after every key stroke.
-     *
-     * @see #setValidateStrategy
-     */
-    public static final int VALIDATE_ON_KEY_STROKE = 0;
-
-    /**
-     * Validation strategy constant (value <code>1</code>) indicating that
-     * the editor should perform validation only when the text widget 
-     * loses focus.
-     *
-     * @see #setValidateStrategy
-     */
-    public static final int VALIDATE_ON_FOCUS_LOST = 1;
-
-    /**
-     * Text limit constant (value <code>-1</code>) indicating unlimited
-     * text limit and width.
-     */
-    public static int UNLIMITED = -1;
-
-    /**
-     * Cached valid state.
-     */
-    private boolean isValid;
-
-    /**
-     * Old text value.
-     * @since 3.4 this field is protected.
-     */
-    protected String oldValue;
-
-    /**
-     * The text field, or <code>null</code> if none.
-     */
-    Text textField;
-
-    /**
-     * Width of text field in characters; initially unlimited.
-     */
-    private int widthInChars = UNLIMITED;
-
-    /**
-     * Text limit of text field in characters; initially unlimited.
-     */
-    private int textLimit = UNLIMITED;
-
-    /**
-     * The error message, or <code>null</code> if none.
-     */
-    private String errorMessage;
-
-    /**
-     * Indicates whether the empty string is legal;
-     * <code>true</code> by default.
-     */
-    private boolean emptyStringAllowed = true;
-
-    /**
-     * The validation strategy; 
-     * <code>VALIDATE_ON_KEY_STROKE</code> by default.
-     */
-    private int validateStrategy = VALIDATE_ON_KEY_STROKE;
-
-    /**
-     * Creates a new string field editor 
-     */
-    protected StringFieldEditor() {
-    }
-
-    /**
-     * Creates a string field editor.
-     * Use the method <code>setTextLimit</code> to limit the text.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param width the width of the text input field in characters,
-     *  or <code>UNLIMITED</code> for no limit
-     * @param strategy either <code>VALIDATE_ON_KEY_STROKE</code> to perform
-     *  on the fly checking (the default), or <code>VALIDATE_ON_FOCUS_LOST</code> to
-     *  perform validation only after the text has been typed in
-     * @param parent the parent of the field editor's control
-     * @since 2.0
-     */
-    public StringFieldEditor(String name, String labelText, int width,
-            int strategy, Composite parent) {
-        init(name, labelText);
-        widthInChars = width;
-        setValidateStrategy(strategy);
-        isValid = false;
-        errorMessage = JFaceResources
-                .getString("StringFieldEditor.errorMessage");//$NON-NLS-1$
-        createControl(parent);
-    }
-
-    /**
-     * Creates a string field editor.
-     * Use the method <code>setTextLimit</code> to limit the text.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param width the width of the text input field in characters,
-     *  or <code>UNLIMITED</code> for no limit
-     * @param parent the parent of the field editor's control
-     */
-    public StringFieldEditor(String name, String labelText, int width,
-            Composite parent) {
-        this(name, labelText, width, VALIDATE_ON_KEY_STROKE, parent);
-    }
-
-    /**
-     * Creates a string field editor of unlimited width.
-     * Use the method <code>setTextLimit</code> to limit the text.
-     * 
-     * @param name the name of the preference this field editor works on
-     * @param labelText the label text of the field editor
-     * @param parent the parent of the field editor's control
-     */
-    public StringFieldEditor(String name, String labelText, Composite parent) {
-        this(name, labelText, UNLIMITED, parent);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void adjustForNumColumns(int numColumns) {
-        GridData gd = (GridData) textField.getLayoutData();
-        gd.horizontalSpan = numColumns - 1;
-        // We only grab excess space if we have to
-        // If another field editor has more columns then
-        // we assume it is setting the width.
-        gd.grabExcessHorizontalSpace = gd.horizontalSpan == 1;
-    }
-
-    /**
-     * Checks whether the text input field contains a valid value or not.
-     *
-     * @return <code>true</code> if the field value is valid,
-     *   and <code>false</code> if invalid
-     */
-    protected boolean checkState() {
-        boolean result = false;
-        if (emptyStringAllowed) {
-			result = true;
-		}
-
-        if (textField == null) {
-			result = false;
-		}
-
-        String txt = textField.getText();
-
-        result = (txt.trim().length() > 0) || emptyStringAllowed;
-
-        // call hook for subclasses
-        result = result && doCheckState();
-
-        if (result) {
-			clearErrorMessage();
-		} else {
-			showErrorMessage(errorMessage);
-		}
-
-        return result;
-    }
-
-    /**
-     * Hook for subclasses to do specific state checks.
-     * <p>
-     * The default implementation of this framework method does
-     * nothing and returns <code>true</code>.  Subclasses should 
-     * override this method to specific state checks.
-     * </p>
-     *
-     * @return <code>true</code> if the field value is valid,
-     *   and <code>false</code> if invalid
-     */
-    protected boolean doCheckState() {
-        return true;
-    }
-
-    /**
-     * Fills this field editor's basic controls into the given parent.
-     * <p>
-     * The string field implementation of this <code>FieldEditor</code>
-     * framework method contributes the text field. Subclasses may override
-     * but must call <code>super.doFillIntoGrid</code>.
-     * </p>
-     */
-    protected void doFillIntoGrid(Composite parent, int numColumns) {
-        getLabelControl(parent);
-
-        textField = getTextControl(parent);
-        GridData gd = new GridData();
-        gd.horizontalSpan = numColumns - 1;
-        if (widthInChars != UNLIMITED) {
-            GC gc = new GC(textField);
-            try {
-                Point extent = gc.textExtent("X");//$NON-NLS-1$
-                gd.widthHint = widthInChars * extent.x;
-            } finally {
-                gc.dispose();
-            }
-        } else {
-            gd.horizontalAlignment = GridData.FILL;
-            gd.grabExcessHorizontalSpace = true;
-        }
-        textField.setLayoutData(gd);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doLoad() {
-        if (textField != null) {
-            String value = getPreferenceStore().getString(getPreferenceName());
-            textField.setText(value);
-            oldValue = value;
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doLoadDefault() {
-        if (textField != null) {
-            String value = getPreferenceStore().getDefaultString(
-                    getPreferenceName());
-            textField.setText(value);
-        }
-        valueChanged();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void doStore() {
-        getPreferenceStore().setValue(getPreferenceName(), textField.getText());
-    }
-
-    /**
-     * Returns the error message that will be displayed when and if 
-     * an error occurs.
-     *
-     * @return the error message, or <code>null</code> if none
-     */
-    public String getErrorMessage() {
-        return errorMessage;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    public int getNumberOfControls() {
-        return 2;
-    }
-
-    /**
-     * Returns the field editor's value.
-     *
-     * @return the current value
-     */
-    public String getStringValue() {
-        if (textField != null) {
-			return textField.getText();
-		}
-        
-        return getPreferenceStore().getString(getPreferenceName());
-    }
-
-    /**
-     * Returns this field editor's text control.
-     *
-     * @return the text control, or <code>null</code> if no
-     * text field is created yet
-     */
-    protected Text getTextControl() {
-        return textField;
-    }
-
-    /**
-     * Returns this field editor's text control.
-     * <p>
-     * The control is created if it does not yet exist
-     * </p>
-     *
-     * @param parent the parent
-     * @return the text control
-     */
-    public Text getTextControl(Composite parent) {
-        if (textField == null) {
-            textField = new Text(parent, SWT.SINGLE | SWT.BORDER);
-            textField.setFont(parent.getFont());
-            switch (validateStrategy) {
-            case VALIDATE_ON_KEY_STROKE:
-                textField.addKeyListener(new KeyAdapter() {
-
-                    /* (non-Javadoc)
-                     * @see org.eclipse.swt.events.KeyAdapter#keyReleased(org.eclipse.swt.events.KeyEvent)
-                     */
-                    public void keyReleased(KeyEvent e) {
-                        valueChanged();
-                    }
-                });
-                textField.addFocusListener(new FocusAdapter() {
-                	// Ensure that the value is checked on focus loss in case we
-                	// missed a keyRelease or user hasn't released key.
-                	// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=214716
-                    public void focusLost(FocusEvent e) {
-                        valueChanged();
-                    }
-                });
- 
-
-                break;
-            case VALIDATE_ON_FOCUS_LOST:
-                textField.addKeyListener(new KeyAdapter() {
-                    public void keyPressed(KeyEvent e) {
-                        clearErrorMessage();
-                    }
-                });
-                textField.addFocusListener(new FocusAdapter() {
-                    public void focusGained(FocusEvent e) {
-                        refreshValidState();
-                    }
-
-                    public void focusLost(FocusEvent e) {
-                        valueChanged();
-                        clearErrorMessage();
-                    }
-                });
-                break;
-            default:
-                Assert.isTrue(false, "Unknown validate strategy");//$NON-NLS-1$
-            }
-            textField.addDisposeListener(new DisposeListener() {
-                public void widgetDisposed(DisposeEvent event) {
-                    textField = null;
-                }
-            });
-            if (textLimit > 0) {//Only set limits above 0 - see SWT spec
-                textField.setTextLimit(textLimit);
-            }
-        } else {
-            checkParent(textField, parent);
-        }
-        return textField;
-    }
-
-    /**
-     * Returns whether an empty string is a valid value.
-     *
-     * @return <code>true</code> if an empty string is a valid value, and
-     *  <code>false</code> if an empty string is invalid
-     * @see #setEmptyStringAllowed
-     */
-    public boolean isEmptyStringAllowed() {
-        return emptyStringAllowed;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    public boolean isValid() {
-        return isValid;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    protected void refreshValidState() {
-        isValid = checkState();
-    }
-
-    /**
-     * Sets whether the empty string is a valid value or not.
-     *
-     * @param b <code>true</code> if the empty string is allowed,
-     *  and <code>false</code> if it is considered invalid
-     */
-    public void setEmptyStringAllowed(boolean b) {
-        emptyStringAllowed = b;
-    }
-
-    /**
-     * Sets the error message that will be displayed when and if 
-     * an error occurs.
-     *
-     * @param message the error message
-     */
-    public void setErrorMessage(String message) {
-        errorMessage = message;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on FieldEditor.
-     */
-    public void setFocus() {
-        if (textField != null) {
-            textField.setFocus();
-        }
-    }
-
-    /**
-     * Sets this field editor's value.
-     *
-     * @param value the new value, or <code>null</code> meaning the empty string
-     */
-    public void setStringValue(String value) {
-        if (textField != null) {
-            if (value == null) {
-				value = "";//$NON-NLS-1$
-			}
-            oldValue = textField.getText();
-            if (!oldValue.equals(value)) {
-                textField.setText(value);
-                valueChanged();
-            }
-        }
-    }
-
-    /**
-     * Sets this text field's text limit.
-     *
-     * @param limit the limit on the number of character in the text
-     *  input field, or <code>UNLIMITED</code> for no limit
-
-     */
-    public void setTextLimit(int limit) {
-        textLimit = limit;
-        if (textField != null) {
-			textField.setTextLimit(limit);
-		}
-    }
-
-    /**
-     * Sets the strategy for validating the text.
-     * <p>
-     * Calling this method has no effect after <code>createPartControl</code>
-     * is called. Thus this method is really only useful for subclasses to call
-     * in their constructor. However, it has public visibility for backward 
-     * compatibility.
-     * </p>
-     *
-     * @param value either <code>VALIDATE_ON_KEY_STROKE</code> to perform
-     *  on the fly checking (the default), or <code>VALIDATE_ON_FOCUS_LOST</code> to
-     *  perform validation only after the text has been typed in
-     */
-    public void setValidateStrategy(int value) {
-        Assert.isTrue(value == VALIDATE_ON_FOCUS_LOST
-                || value == VALIDATE_ON_KEY_STROKE);
-        validateStrategy = value;
-    }
-
-    /**
-     * Shows the error message set via <code>setErrorMessage</code>.
-     */
-    public void showErrorMessage() {
-        showErrorMessage(errorMessage);
-    }
-
-    /**
-     * Informs this field editor's listener, if it has one, about a change
-     * to the value (<code>VALUE</code> property) provided that the old and
-     * new values are different.
-     * <p>
-     * This hook is <em>not</em> called when the text is initialized 
-     * (or reset to the default value) from the preference store.
-     * </p>
-     */
-    protected void valueChanged() {
-        setPresentsDefaultValue(false);
-        boolean oldState = isValid;
-        refreshValidState();
-
-        if (isValid != oldState) {
-			fireStateChanged(IS_VALID, oldState, isValid);
-		}
-
-        String newValue = textField.getText();
-        if (!newValue.equals(oldValue)) {
-            fireValueChanged(VALUE, oldValue, newValue);
-            oldValue = newValue;
-        }
-    }
-
-    /*
-     * @see FieldEditor.setEnabled(boolean,Composite).
-     */
-    public void setEnabled(boolean enabled, Composite parent) {
-        super.setEnabled(enabled, parent);
-        getTextControl(parent).setEnabled(enabled);
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/images/pref_dialog_title.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/images/pref_dialog_title.gif
deleted file mode 100644
index 672442f..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/images/pref_dialog_title.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/package.html
deleted file mode 100644
index 0ddc967..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/preference/package.html
+++ /dev/null
@@ -1,67 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides a framework for preferences.
-<h2>
-Package Specification</h2>
-A <b>preference manager</b> (class <tt>PreferenceManager</tt>) maintains
-a tree of <b>preference nodes</b>. Preferences are presented to the end
-user in a <b>preference dialog</b> consisting of <b>preference pages</b>.
-A preference page consists of multiple preference fields, which can be
-displayed and modified though <b>field editors</b>. The framework contains
-an abstract base class for preference dialogs (<tt>PreferenceDialog</tt>),
-and an abstract preference page class (<tt>FieldEditorPreferencePage</tt>)
-for hosting these field editors.
-<p>The individual preference values are maintained in a <b>preference store</b>
-(<tt>IPreferenceStore</tt>). Each preference has a current value and a
-default value use to (re-)initialize it. The framework provides a concrete
-preference store implementation (<tt>PreferenceStore</tt>) based on an
-internal <tt>java.util.Properties</tt> object, with support for persisting
-the non-default preference values to files or streams.
-<p>A field editor presents the value of a single preference to the end
-user. The value is loaded from the preference store; if modified by the
-end user, the value is validated and eventually stored back to the preference
-store.
-<p>This package contains ready-to-use field editors for various types of
-preferences:
-<ul>
-<li>
-<tt>BooleanFieldEditor</tt> - booleans</li>
-
-<li>
-<tt>IntegerFieldEditor</tt> - integers</li>
-
-<li>
-<tt>StringFieldEditor</tt> - text strings</li>
-
-<li>
-<tt>RadioGroupFieldEditor</tt> - enumerations</li>
-
-<li>
-<tt>ColorFieldEditor</tt> - RGB colors</li>
-
-<li>
-<tt>FontFieldEditor</tt> - fonts</li>
-
-<li>
-<tt>DirectoryFieldEditor</tt> - directories</li>
-
-<li>
-<tt>FileFieldEditor</tt> - files</li>
-
-<li>
-<tt>PathEditor</tt> - paths</li>
-</ul>
-All field editors are subclasses of the abstract base class <tt>FieldEditor</tt>;
-the framework allows new kinds of field editors to be defined by subclassing
-this class or one of its subclasses.
-<p>Note: None of the classes in this package maintain global state.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/AbstractResourceManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/AbstractResourceManager.java
deleted file mode 100644
index 4fb7391..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/AbstractResourceManager.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * Abstract implementation of ResourceManager. Maintains reference counts for all previously
- * allocated SWT resources. Delegates to the abstract method allocate(...) the first time a resource
- * is referenced and delegates to the abstract method deallocate(...) the last time a reference is
- * removed.
- * 
- * @since 3.1
- */
-abstract class AbstractResourceManager extends ResourceManager {
-
-    /**
-     * Map of ResourceDescriptor onto RefCount. (null when empty)
-     */
-    private HashMap map = null;
-    
-    /**
-     * Holds a reference count for a previously-allocated resource
-     */
-    private static class RefCount {
-        Object resource;
-        int count = 1;
-        
-        RefCount(Object resource) {
-            this.resource = resource;
-        }
-    }
-    
-    /**
-     * Called the first time a resource is requested. Should allocate and return a resource
-     * of the correct type. 
-     * 
-     * @since 3.1 
-     *
-     * @param descriptor identifier for the resource to allocate
-     * @return the newly allocated resource
-     * @throws DeviceResourceException Thrown when allocation of an SWT device resource fails 
-     */
-    protected abstract Object allocate(DeviceResourceDescriptor descriptor) throws DeviceResourceException;
-
-    /**
-     * Called the last time a resource is dereferenced. Should release any resources reserved by
-     * allocate(...).
-     * 
-     * @since 3.1 
-     *
-     * @param resource resource being deallocated
-     * @param descriptor identifier for the resource
-     */
-    protected abstract void deallocate(Object resource, DeviceResourceDescriptor descriptor); 
-    
-    /* (non-Javadoc)
-     * @see ResourceManager#create(DeviceResourceDescriptor)
-     */
-    public final Object create(DeviceResourceDescriptor descriptor) throws DeviceResourceException {
-
-        // Lazily allocate the map
-        if (map == null) {
-            map = new HashMap();
-        }
-        
-        // Get the current reference count
-        RefCount count = (RefCount)map.get(descriptor);
-        if (count != null) {
-            // If this resource already exists, increment the reference count and return
-            // the existing resource.
-            count.count++;
-            return count.resource;
-        }
-        
-        // Allocate and return a new resource (with ref count = 1)
-        Object resource = allocate(descriptor);
-        
-        count = new RefCount(resource);
-        map.put(descriptor, count);
-        
-        return resource;
-    }
-
-    /* (non-Javadoc)
-     * @see ResourceManager#destroy(DeviceResourceDescriptor)
-     */
-    public final void destroy(DeviceResourceDescriptor descriptor) {
-        // If the map is empty (null) then there are no resources to dispose
-        if (map == null) {
-            return;
-        }
-        
-        // Find the existing resource
-        RefCount count = (RefCount)map.get(descriptor);
-        if (count != null) {
-            // If the resource exists, decrement the reference count.
-            count.count--;
-            if (count.count == 0) {
-                // If this was the last reference, deallocate it.
-                deallocate(count.resource, descriptor);
-                map.remove(descriptor);
-            }
-        }
-        
-        // Null out the map when empty to save a small amount of memory
-        if (map.isEmpty()) {
-            map = null;
-        }
-    }
-
-    /**
-     * Deallocates any resources allocated by this registry that have not yet been
-     * deallocated.
-     * 
-     * @since 3.1 
-     */
-    public void dispose() {
-        super.dispose();
-        
-        if (map == null) {
-            return;
-        }
-        
-        Collection entries = map.entrySet();
-
-        for (Iterator iter = entries.iterator(); iter.hasNext();) {
-            Map.Entry next = (Map.Entry) iter.next();
-            
-            Object key = next.getKey();
-            RefCount val = (RefCount)next.getValue();
-            
-            deallocate(val.resource, (DeviceResourceDescriptor)key);
-        }
-        
-        map = null;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.ResourceManager#find(org.eclipse.jface.resource.DeviceResourceDescriptor)
-     */
-    public Object find(DeviceResourceDescriptor descriptor) {
-        if (map == null) {
-            return null;
-        }
-        RefCount refCount = (RefCount)map.get(descriptor);
-        if (refCount == null)
-        	return null;
-		return refCount.resource;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ArrayFontDescriptor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ArrayFontDescriptor.java
deleted file mode 100644
index 8c057aa..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ArrayFontDescriptor.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-
-/**
- * Describes a Font using an array of FontData
- * 
- * @since 3.1
- */
-final class ArrayFontDescriptor extends FontDescriptor {
-
-    private FontData[] data;
-    private Font originalFont = null;
-    
-    /**
-     * Creates a font descriptor for a font with the given name, height,
-     * and style. These arguments are passed directly to the constructor
-     * of Font.
-     * 
-     * @param data FontData describing the font to create
-     * 
-     * @see org.eclipse.swt.graphics.Font#Font(org.eclipse.swt.graphics.Device, org.eclipse.swt.graphics.FontData)
-     * @since 3.1
-     */
-    public ArrayFontDescriptor(FontData[] data) {
-        this.data = data;
-    }
- 
-    /**
-     * Creates a font descriptor that describes the given font.
-     * 
-     * @param originalFont font to be described
-     * 
-     * @see FontDescriptor#createFrom(org.eclipse.swt.graphics.Font)
-     * @since 3.1
-     */
-    public ArrayFontDescriptor(Font originalFont) {
-        this(originalFont.getFontData());
-        this.originalFont = originalFont;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.FontDescriptor#getFontData()
-     */
-    public FontData[] getFontData() {
-    	// Copy the original array to ensure that callers will not modify it
-    	return copy(data);
-    }
-    
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.FontDescriptor#createFont(org.eclipse.swt.graphics.Device)
-     */
-    public Font createFont(Device device) {
-        
-        // If this descriptor is an existing font, then we can return the original font
-        // if this is the same device.
-        if (originalFont != null) {         
-            // If we're allocating on the same device as the original font, return the original.
-            if (originalFont.getDevice() == device) {
-                return originalFont;
-            }
-        }
-        
-        return new Font(device, data);
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    public boolean equals(Object obj) {
-        if ((obj.getClass() == ArrayFontDescriptor.class)) {
-            ArrayFontDescriptor descr = (ArrayFontDescriptor)obj;
-            
-            if (descr.originalFont != originalFont) {
-                return false;
-            }
-            
-            if (originalFont != null) {
-                return true;
-            }
-            
-            if (data.length != descr.data.length) {
-                return false;
-            }
-            
-            for (int i = 0; i < data.length; i++) {
-                FontData fd = data[i];
-                FontData fd2 = descr.data[i];
-                
-                if (!fd.equals(fd2)) {
-                    return false;
-                }
-            }
-            
-            return true;
-        }
-        
-        return false;
-    }
-    
-    /* (non-Javadoc)
-     * @see java.lang.Object#hashCode()
-     */
-    public int hashCode() {
-        if (originalFont != null) {
-            return originalFont.hashCode();
-        }
-        
-        int code = 0;
-        
-        for (int i = 0; i < data.length; i++) {
-            FontData fd = data[i];
-            code += fd.hashCode();
-        }
-        return code;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.FontDescriptor#destroyFont(org.eclipse.swt.graphics.Font)
-     */
-    public void destroyFont(Font previouslyCreatedFont) {
-        if (previouslyCreatedFont == originalFont) {
-            return;
-        }
-        previouslyCreatedFont.dispose();
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ColorDescriptor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ColorDescriptor.java
deleted file mode 100644
index ab5875e..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ColorDescriptor.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * Lightweight descriptor for an SWT color. Each ColorDescriptor will create a particular SWT 
- * Color on demand. This object will be compared so hashCode(...) and equals(...) must 
- * return meaningful values.
- * 
- * @since 3.1
- */
-public abstract class ColorDescriptor extends DeviceResourceDescriptor {
-    
-    /**
-     * Creates a ColorDescriptor from an existing Color, given the Device associated
-     * with the original Color. This is the usual way to convert a Color into
-     * a ColorDescriptor. Note that the returned ColorDescriptor depends on the
-     * original Color, and disposing the Color will invalidate the ColorDescriptor.
-     * 
-     * @deprecated use {@link ColorDescriptor#createFrom(Color)}
-     * 
-     * @since 3.1
-     *
-     * @param toCreate Color to convert into a ColorDescriptor.
-     * @param originalDevice this must be the same Device that was passed into the
-     * original Color's constructor.
-     * @return a newly created ColorDescriptor that describes the given Color.
-     */
-    public static ColorDescriptor createFrom(Color toCreate, Device originalDevice) {
-        return new RGBColorDescriptor(toCreate);
-    }
-    
-    /**
-     * Creates a ColorDescriptor from an existing color. 
-     * 
-     * The returned ColorDescriptor depends on the original Color. Disposing
-     * the original colour while the color descriptor is still in use may cause 
-     * SWT to throw a graphic disposed exception.
-     * 
-     * @since 3.1
-     *
-     * @param toCreate Color to generate a ColorDescriptor from
-     * @return a newly created ColorDescriptor
-     */
-    public static ColorDescriptor createFrom(Color toCreate) {
-        return new RGBColorDescriptor(toCreate);
-    }
-    
-    /**
-     * Returns a color descriptor for the given RGB values
-     * @since 3.1 
-     *
-     * @param toCreate RGB values to create
-     * @return a new ColorDescriptor
-     */
-    public static ColorDescriptor createFrom(RGB toCreate) {
-        return new RGBColorDescriptor(toCreate);
-    }
-    
-    /**
-     * Returns the Color described by this descriptor.
-     * 
-     * @param device SWT device on which to allocate the Color
-     * @return a newly allocated SWT Color object (never null)
-     * @throws DeviceResourceException if unable to allocate the Color
-     */
-    public abstract Color createColor(Device device) throws DeviceResourceException;
-    
-    /**
-     * Undoes whatever was done by createColor. 
-     * 
-     * @since 3.1 
-     *
-     * @param toDestroy a Color that was previously allocated by an equal ColorDescriptor
-     */
-    public abstract void destroyColor(Color toDestroy);
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.DeviceResourceDescriptor#createResource(org.eclipse.swt.graphics.Device)
-     */
-    public final Object createResource(Device device) throws DeviceResourceException {
-        return createColor(device);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.DeviceResourceDescriptor#destroyResource(java.lang.Object)
-     */
-    public final void destroyResource(Object previouslyCreatedObject) {
-        destroyColor((Color)previouslyCreatedObject);
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ColorRegistry.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ColorRegistry.java
deleted file mode 100644
index e38b88b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ColorRegistry.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * A color registry maintains a mapping between symbolic color names and SWT 
- * <code>Color</code>s.
- * <p>
- * A color registry owns all of the <code>Color</code> objects registered with 
- * it, and automatically disposes of them when the SWT Display that creates the 
- * <code>Color</code>s is disposed. Because of this, clients do not need to 
- * (indeed, must not attempt to) dispose of <code>Color</code> objects 
- * themselves.
- * </p>
- * <p>
- * Methods are provided for registering listeners that will be kept
- * apprised of changes to list of registed colors.
- * </p>
- * <p>
- * Clients may instantiate this class (it was not designed to be subclassed).
- * </p>
- * 
- * @since 3.0
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ColorRegistry extends ResourceRegistry {
-
-	/**
-	 * Default color value.  This is cyan (very unappetizing). 
-	 * @since 3.4
-	 */
-    private static final ColorDescriptor DEFAULT_COLOR = new RGBColorDescriptor(new RGB(0, 255, 255));
-
-	/**
-     * This registries <code>Display</code>. All colors will be allocated using 
-     * it.
-     */
-    protected Display display;
-
-    /**
-     * Collection of <code>Color</code> that are now stale to be disposed when 
-     * it is safe to do so (i.e. on shutdown).
-     */
-    private List staleColors = new ArrayList();
-
-    /**
-     * Table of known colors, keyed by symbolic color name (key type: <code>String</code>,
-     * value type: <code>org.eclipse.swt.graphics.Color</code>.
-     */
-    private Map stringToColor = new HashMap(7);
-
-    /**
-     * Table of known color data, keyed by symbolic color name (key type:
-     * <code>String</code>, value type: <code>org.eclipse.swt.graphics.RGB</code>).
-     */
-    private Map stringToRGB = new HashMap(7);
-
-    /**
-     * Runnable that cleans up the manager on disposal of the display.
-     */
-    protected Runnable displayRunnable = new Runnable() {
-        public void run() {
-            clearCaches();
-        }
-    };
-
-	private final boolean cleanOnDisplayDisposal;
-
-    /**
-     * Create a new instance of the receiver that is hooked to the current 
-     * display.
-     * 
-     * @see org.eclipse.swt.widgets.Display#getCurrent()
-     */
-    public ColorRegistry() {
-        this(Display.getCurrent(), true);
-    }
-
-    /**
-     * Create a new instance of the receiver.
-     * 
-     * @param display the <code>Display</code> to hook into.
-     */
-    public ColorRegistry(Display display) {
-    	this (display, true);
-    }
-
-    /**
-     * Create a new instance of the receiver.
-     * 
-     * @param display the <code>Display</code> to hook into
-     * @param cleanOnDisplayDisposal
-	 *            whether all fonts allocated by this <code>ColorRegistry</code>
-	 *            should be disposed when the display is disposed
-     * @since 3.1
-     */
-    public ColorRegistry(Display display, boolean cleanOnDisplayDisposal) {
-		Assert.isNotNull(display);
-        this.display = display;
-        this.cleanOnDisplayDisposal = cleanOnDisplayDisposal;
-        if (cleanOnDisplayDisposal) {
-			hookDisplayDispose();
-		}
-    }
-
-    /**
-     * Create a new <code>Color</code> on the receivers <code>Display</code>.
-     * 
-     * @param rgb the <code>RGB</code> data for the color.
-     * @return the new <code>Color</code> object.
-     * 
-     * @since 3.1
-     */
-    private Color createColor(RGB rgb) {
-    	if (this.display == null) {
-    		Display display = Display.getCurrent();
-    		if (display == null) {
-    			throw new IllegalStateException();
-    		}
-    		this.display = display;
-    		if (cleanOnDisplayDisposal) {
-    			hookDisplayDispose();
-    		}
-    	}
-        return new Color(display, rgb);
-    }
-
-    /**
-     * Dispose of all of the <code>Color</code>s in this iterator.
-     * 
-     * @param iterator over <code>Collection</code> of <code>Color</code>
-     */
-    private void disposeColors(Iterator iterator) {
-        while (iterator.hasNext()) {
-            Object next = iterator.next();
-            ((Color) next).dispose();
-        }
-    }
-
-    /**
-     * Returns the <code>color</code> associated with the given symbolic color 
-     * name, or <code>null</code> if no such definition exists.
-     * 
-     * @param symbolicName symbolic color name
-     * @return the <code>Color</code> or <code>null</code>
-     */
-    public Color get(String symbolicName) {
-
-        Assert.isNotNull(symbolicName);
-        Object result = stringToColor.get(symbolicName);
-        if (result != null) {
-			return (Color) result;
-		}
-
-        Color color = null;
-
-        result = stringToRGB.get(symbolicName);
-        if (result == null) {
-			return null;
-		}
-
-        color = createColor((RGB) result);
-
-        stringToColor.put(symbolicName, color);
-
-        return color;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.ResourceRegistry#getKeySet()
-     */
-    public Set getKeySet() {
-        return Collections.unmodifiableSet(stringToRGB.keySet());
-    }
-
-    /**
-     * Returns the color data associated with the given symbolic color name.
-     *
-     * @param symbolicName symbolic color name.
-     * @return the <code>RGB</code> data, or <code>null</code> if the symbolic name
-     * is not valid.
-     */
-    public RGB getRGB(String symbolicName) {
-        Assert.isNotNull(symbolicName);
-        return (RGB) stringToRGB.get(symbolicName);
-    }
-    
-    /**
-	 * Returns the color descriptor associated with the given symbolic color
-	 * name. As of 3.4 if this color is not defined then an unspecified color
-	 * is returned. Users that wish to ensure a reasonable default value should
-	 * use {@link #getColorDescriptor(String, ColorDescriptor)} instead.
-	 * 
-	 * @since 3.1
-	 * 
-	 * @param symbolicName
-	 * @return the color descriptor associated with the given symbolic color
-	 *         name or an unspecified sentinel.
-	 */
-	public ColorDescriptor getColorDescriptor(String symbolicName) {
-		return getColorDescriptor(symbolicName, DEFAULT_COLOR);
-	}
-    
-    /**
-	 * Returns the color descriptor associated with the given symbolic color
-	 * name. If this name does not exist within the registry the supplied
-	 * default value will be used.
-	 * 
-	 * @param symbolicName
-	 * @param defaultValue
-	 * @return the color descriptor associated with the given symbolic color
-	 *         name or the default
-	 * @since 3.4
-	 */
-	public ColorDescriptor getColorDescriptor(String symbolicName,
-			ColorDescriptor defaultValue) {
-		RGB rgb = getRGB(symbolicName);
-		if (rgb == null)
-			return defaultValue;
-		return ColorDescriptor.createFrom(rgb);
-	}
-
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.resource.ResourceRegistry#clearCaches()
-	 */
-    protected void clearCaches() {
-        disposeColors(stringToColor.values().iterator());
-        disposeColors(staleColors.iterator());
-        stringToColor.clear();
-        staleColors.clear();
-        display = null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.ResourceRegistry#hasValueFor(java.lang.String)
-     */
-    public boolean hasValueFor(String colorKey) {
-        return stringToRGB.containsKey(colorKey);
-    }
-
-    /**
-     * Hook a dispose listener on the SWT display.
-     */
-    private void hookDisplayDispose() {
-        display.disposeExec(displayRunnable);
-    }
-
-    /**
-     * Adds (or replaces) a color to this color registry under the given 
-     * symbolic name.
-     * <p>
-     * A property change event is reported whenever the mapping from a symbolic
-     * name to a color changes. The source of the event is this registry; the
-     * property name is the symbolic color name.
-     * </p>
-     * 
-     * @param symbolicName the symbolic color name
-     * @param colorData an <code>RGB</code> object
-     */
-    public void put(String symbolicName, RGB colorData) {
-        put(symbolicName, colorData, true);
-    }
-
-    /**
-     * Adds (or replaces) a color to this color registry under the given 
-     * symbolic name.
-     * <p>
-     * A property change event is reported whenever the mapping from a symbolic
-     * name to a color changes. The source of the event is this registry; the
-     * property name is the symbolic color name.
-     * </p>
-     * 
-     * @param symbolicName the symbolic color name
-     * @param colorData an <code>RGB</code> object
-     * @param update - fire a color mapping changed if true. False if this
-     *            method is called from the get method as no setting has
-     *            changed.
-     */
-    private void put(String symbolicName, RGB colorData, boolean update) {
-
-        Assert.isNotNull(symbolicName);
-        Assert.isNotNull(colorData);
-
-        RGB existing = (RGB) stringToRGB.get(symbolicName);
-        if (colorData.equals(existing)) {
-			return;
-		}
-
-        Color oldColor = (Color) stringToColor.remove(symbolicName);
-        stringToRGB.put(symbolicName, colorData);
-        if (update) {
-			fireMappingChanged(symbolicName, existing, colorData);
-		}
-
-        if (oldColor != null) {
-			staleColors.add(oldColor);
-		}
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/CompositeImageDescriptor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/CompositeImageDescriptor.java
deleted file mode 100644
index 9db0480..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/CompositeImageDescriptor.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * Abstract base class for image descriptors that synthesize an image from other
- * images in order to simulate the effect of custom drawing. For example, this
- * could be used to superimpose a red bar dexter symbol across an image to
- * indicate that something was disallowed.
- * <p>
- * Subclasses must implement the <code>getSize</code> and <code>fill</code>
- * methods. Little or no work happens until the image descriptor's image is
- * actually requested by a call to <code>createImage</code> (or to
- * <code>getImageData</code> directly).
- * </p>
- */
-public abstract class CompositeImageDescriptor extends ImageDescriptor {
-
-	/**
-	 * The image data for this composite image.
-	 */
-	private ImageData imageData;
-
-	/**
-	 * Constructs an uninitialized composite image.
-	 */
-	protected CompositeImageDescriptor() {
-	}
-
-	/**
-	 * Draw the composite images.
-	 * <p>
-	 * Subclasses must implement this framework method to paint images within
-	 * the given bounds using one or more calls to the <code>drawImage</code>
-	 * framework method.
-	 * </p>
-	 * 
-	 * @param width
-	 *            the width
-	 * @param height
-	 *            the height
-	 */
-	protected abstract void drawCompositeImage(int width, int height);
-
-	/**
-	 * Draws the given source image data into this composite image at the given
-	 * position.
-	 * <p>
-	 * Call this internal framework method to superimpose another image atop
-	 * this composite image.
-	 * </p>
-	 * 
-	 * @param src
-	 *            the source image data
-	 * @param ox
-	 *            the x position
-	 * @param oy
-	 *            the y position
-	 */
-	final protected void drawImage(ImageData src, int ox, int oy) {
-		ImageData dst = imageData;
-		PaletteData srcPalette = src.palette;
-		ImageData srcMask = null;
-		int alphaMask = 0, alphaShift = 0;
-		if (src.maskData != null) {
-			srcMask = src.getTransparencyMask ();
-			if (src.depth == 32) {
-				alphaMask = ~(srcPalette.redMask | srcPalette.greenMask | srcPalette.blueMask);
-				while (alphaMask != 0 && ((alphaMask >>> alphaShift) & 1) == 0) alphaShift++;
-			}
-		}
-		for (int srcY = 0, dstY = srcY + oy; srcY < src.height; srcY++, dstY++) {
-			for (int srcX = 0, dstX = srcX + ox; srcX < src.width; srcX++, dstX++) {
-				if (!(0 <= dstX && dstX < dst.width && 0 <= dstY && dstY < dst.height)) continue;
-				int srcPixel = src.getPixel(srcX, srcY);
-				int srcAlpha = 255;
-				if (src.maskData != null) {
-					if (src.depth == 32) {
-						srcAlpha = (srcPixel & alphaMask) >>> alphaShift;
-						if (srcAlpha == 0) {
-							srcAlpha = srcMask.getPixel(srcX, srcY) != 0 ? 255 : 0;
-						}
-					} else {
-						if (srcMask.getPixel(srcX, srcY) == 0) srcAlpha = 0;
-					}
-				} else if (src.transparentPixel != -1) {
-					if (src.transparentPixel == srcPixel) srcAlpha = 0;
-				} else if (src.alpha != -1) {
-					srcAlpha = src.alpha;
-				} else if (src.alphaData != null) {
-					srcAlpha = src.getAlpha(srcX, srcY);
-				}
-				if (srcAlpha == 0) continue;
-				int srcRed, srcGreen, srcBlue;
-				if (srcPalette.isDirect) {
-					srcRed = srcPixel & srcPalette.redMask;
-					srcRed = (srcPalette.redShift < 0) ? srcRed >>> -srcPalette.redShift : srcRed << srcPalette.redShift;
-					srcGreen = srcPixel & srcPalette.greenMask;
-					srcGreen = (srcPalette.greenShift < 0) ? srcGreen >>> -srcPalette.greenShift : srcGreen << srcPalette.greenShift;
-					srcBlue = srcPixel & srcPalette.blueMask;
-					srcBlue = (srcPalette.blueShift < 0) ? srcBlue >>> -srcPalette.blueShift : srcBlue << srcPalette.blueShift;
-				} else {
-					RGB rgb = srcPalette.getRGB(srcPixel);
-					srcRed = rgb.red;
-					srcGreen = rgb.green;
-					srcBlue = rgb.blue;
-				}
-				int dstRed, dstGreen, dstBlue, dstAlpha;
-				if (srcAlpha == 255) {
-					dstRed = srcRed;
-					dstGreen = srcGreen;
-					dstBlue= srcBlue;
-					dstAlpha = srcAlpha;
-				} else {
-					int dstPixel = dst.getPixel(dstX, dstY);
-					dstAlpha = dst.getAlpha(dstX, dstY);
-					dstRed = (dstPixel & 0xFF) >>> 0;
-					dstGreen = (dstPixel & 0xFF00) >>> 8;
-					dstBlue = (dstPixel & 0xFF0000) >>> 16;
-					dstRed += (srcRed - dstRed) * srcAlpha / 255;
-					dstGreen += (srcGreen - dstGreen) * srcAlpha / 255;
-					dstBlue += (srcBlue - dstBlue) * srcAlpha / 255;
-					dstAlpha += (srcAlpha - dstAlpha) * srcAlpha / 255;
-				}
-				dst.setPixel(dstX, dstY, ((dstRed & 0xFF) << 0) | ((dstGreen & 0xFF) << 8) | ((dstBlue & 0xFF) << 16));
-				dst.setAlpha(dstX, dstY, dstAlpha);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on ImageDesciptor.
-	 */
-	public ImageData getImageData() {
-		Point size = getSize();		
-		
-		/* Create a 24 bit image data with alpha channel */
-		imageData = new ImageData(size.x, size.y, 24, new PaletteData(0xFF, 0xFF00, 0xFF0000));
-		imageData.alphaData = new byte[imageData.width * imageData.height];
-		
-		drawCompositeImage(size.x, size.y);
-		
-		/* Detect minimum transparency */
-		boolean transparency = false;
-		byte[] alphaData = imageData.alphaData;
-		for (int i = 0; i < alphaData.length; i++) {
-			int alpha = alphaData[i] & 0xFF;
-			if (!(alpha == 0 || alpha == 255)) {
-				/* Full alpha channel transparency */
-				return imageData;
-			}
-			if (!transparency && alpha == 0) transparency = true;
-		}
-		if (transparency) {
-			/* Reduce to 1-bit alpha channel transparency */
-			PaletteData palette = new PaletteData(new RGB[]{new RGB(0, 0, 0), new RGB(255, 255, 255)});
-			ImageData mask = new ImageData(imageData.width, imageData.height, 1, palette);
-			for (int y = 0; y < mask.height; y++) {
-				for (int x = 0; x < mask.width; x++) {
-					mask.setPixel(x, y, imageData.getAlpha(x, y) == 255 ? 1 : 0);
-				}
-			}
-		} else {
-			/* no transparency */
-			imageData.alphaData = null;
-		}
-		return imageData;
-	}
-	
-
-	/**
-	 * Return the transparent pixel for the receiver.
-	 * <strong>NOTE</strong> This value is not currently in use in the 
-	 * default implementation.
-	 * @return int
-	 * @since 3.3
-	 */
-	protected int getTransparentPixel() {
-		return 0;
-	}
-
-	/**
-	 * Return the size of this composite image.
-	 * <p>
-	 * Subclasses must implement this framework method.
-	 * </p>
-	 * 
-	 * @return the x and y size of the image expressed as a point object
-	 */
-	protected abstract Point getSize();
-
-	/**
-	 * @param imageData The imageData to set.
-	 * @since 3.3
-	 */
-	protected void setImageData(ImageData imageData) {
-		this.imageData = imageData;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DataFormatException.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DataFormatException.java
deleted file mode 100644
index 2732cb9..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DataFormatException.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-/**
- * An exception indicating that a string value could not be
- * converted into the requested data type.
- *
- * @see StringConverter
- */
-public class DataFormatException extends IllegalArgumentException {
-    
-    /**
-     * Generated serial version UID for this class.
-     * @since 3.1
-     */
-    private static final long serialVersionUID = 3544955467404031538L;
-
-    /**
-     * Creates a new exception.
-     */
-    public DataFormatException() {
-        super();
-    }
-
-    /**
-     * Creates a new exception.
-     *
-     * @param message the message
-     */
-    public DataFormatException(String message) {
-        super(message);
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DerivedImageDescriptor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DerivedImageDescriptor.java
deleted file mode 100644
index 4e0379d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DerivedImageDescriptor.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * An image descriptor which creates images based on another ImageDescriptor, but with
- * additional SWT flags. Note that this is only intended for compatibility. 
- * 
- * @since 3.1
- */
-final class DerivedImageDescriptor extends ImageDescriptor {
-
-    private ImageDescriptor original;
-    private int flags;
-    
-    /**
-     * Create a new image descriptor
-     * @param original the original one
-     * @param swtFlags flags to be used when image is created {@link Image#Image(Device, Image, int)}
-     * @see SWT#IMAGE_COPY
-     * @see SWT#IMAGE_DISABLE
-     * @see SWT#IMAGE_GRAY
-     */
-    public DerivedImageDescriptor(ImageDescriptor original, int swtFlags) {
-        this.original = original;
-        flags = swtFlags;
-    }
-    
-    public Object createResource(Device device) throws DeviceResourceException {
-        try {
-            return internalCreateImage(device);
-        } catch (SWTException e) {
-            throw new DeviceResourceException(this, e);
-        }
-    }
-    
-    public Image createImage(Device device) {
-        return internalCreateImage(device);
-    }
-    
-    public int hashCode() {
-        return original.hashCode() + flags;
-    }
-    
-    public boolean equals(Object arg0) {
-        if (arg0 instanceof DerivedImageDescriptor) {
-            DerivedImageDescriptor desc = (DerivedImageDescriptor)arg0;
-            
-            return desc.original == original && flags == desc.flags;
-        }
-        
-        return false;
-    }
-    
-    /**
-     * Creates a new Image on the given device. Note that we defined a new
-     * method rather than overloading createImage since this needs to be
-     * called by getImageData(), and we want to be absolutely certain not
-     * to cause infinite recursion if the base class gets refactored. 
-     *
-     * @param device device to create the image on
-     * @return a newly allocated Image. Must be disposed by calling image.dispose().
-     */
-    private final Image internalCreateImage(Device device) {
-        Image originalImage = original.createImage(device);
-        Image result = new Image(device, originalImage, flags);
-        original.destroyResource(originalImage);
-        return result;
-    }
-    
-    public ImageData getImageData() {
-        Image image = internalCreateImage(Display.getCurrent());
-        ImageData result = image.getImageData();
-        image.dispose();
-        return result;
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DeviceResourceDescriptor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DeviceResourceDescriptor.java
deleted file mode 100644
index b7ce8c5..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DeviceResourceDescriptor.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import org.eclipse.swt.graphics.Device;
-
-/**
- * Instances of this class can allocate and dispose SWT resources. Each
- * instance describes a particular resource (such as a Color, Font, or Image)
- * and can create and destroy that resource on demand. DeviceResourceDescriptors
- * are managed by a ResourceRegistry.
- * 
- * @see org.eclipse.jface.resource.ResourceManager
- * 
- * @since 3.1
- */
-public abstract class DeviceResourceDescriptor {
-    /**
-     * Creates the resource described by this descriptor
-     * 
-     * @since 3.1 
-     *
-     * @param device the Device on which to allocate the resource
-     * @return the newly allocated resource (not null)
-     * @throws DeviceResourceException if unable to allocate the resource
-     */
-    public abstract Object createResource(Device device);
-    
-    /**
-     * Undoes everything that was done by a previous call to create(...), given
-     * the object that was returned by create(...).
-     * 
-     * @since 3.1 
-     *
-     * @param previouslyCreatedObject an object that was returned by an equal 
-     * descriptor in a previous call to createResource(...).
-     */
-    public abstract void destroyResource(Object previouslyCreatedObject);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DeviceResourceException.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DeviceResourceException.java
deleted file mode 100644
index 4907b0a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DeviceResourceException.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-
-/**
- * Thrown when allocation of an SWT device resource fails
- * 
- * @since 3.1
- */
-public class DeviceResourceException extends RuntimeException {
-    
-	private Throwable cause;
-
-	/**
-	 * All serializable objects should have a stable serialVersionUID
-	 */
-	private static final long serialVersionUID = 11454598756198L;
-    
-	/**
-	 * Creates a DeviceResourceException indicating an error attempting to
-	 * create a resource and an embedded low-level exception describing the cause 
-	 * 
-	 * @param missingResource
-     * @param cause cause of the exception (or null if none)
-	 */
-    public DeviceResourceException(DeviceResourceDescriptor missingResource, Throwable cause) {
-        super("Unable to create resource " + missingResource.toString()); //$NON-NLS-1$
-        // don't pass the cause to super, to allow compilation against JCL Foundation (bug 80059)
-        this.cause = cause;
-    }
-    
-    /**
-     * Creates a DeviceResourceException indicating an error attempting to
-     * create a resource 
-     * 
-     * @param missingResource
-     */
-    public DeviceResourceException(DeviceResourceDescriptor missingResource) {
-        this(missingResource, null);
-    }
-    
-    /**
-     * Returns the cause of this throwable or <code>null</code> if the
-     * cause is nonexistent or unknown. 
-     * 
-     * @return the cause or <code>null</code>
-     * @since 3.1
-     */
-    public Throwable getCause() {
-        return cause;
-    }
-    
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DeviceResourceManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DeviceResourceManager.java
deleted file mode 100644
index db02255..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/DeviceResourceManager.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Manages SWT resources for a particular device.
- *  
- * <p>
- * IMPORTANT: in most cases clients should use a <code>LocalResourceManager</code> instead of a
- * <code>DeviceResourceManager</code>. To create a resource manager on a particular display, 
- * use <code>new LocalResourceManager(JFaceResources.getResources(myDisplay))</code>.
- * <code>DeviceResourceManager</code> should only be used directly when managing
- * resources for a device other than a Display (such as a printer).  
- * </p>
- * 
- * @see LocalResourceManager
- * 
- * @since 3.1
- */
-public final class DeviceResourceManager extends AbstractResourceManager {
-    
-    private Device device;
-    private Image missingImage;
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.ResourceManager#getDevice()
-     */
-    public Device getDevice() {
-        return device;
-    }
-    
-    /**
-     * Creates a new registry for the given device.
-     * 
-     * @param device device to manage
-     */
-    public DeviceResourceManager(Device device) {
-        this.device = device;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.AbstractResourceManager#allocate(org.eclipse.jface.resource.DeviceResourceDescriptor)
-     */
-    protected Object allocate(DeviceResourceDescriptor descriptor) throws DeviceResourceException {
-        return descriptor.createResource(device);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.AbstractResourceManager#deallocate(java.lang.Object, org.eclipse.jface.resource.DeviceResourceDescriptor)
-     */
-    protected void deallocate(Object resource, DeviceResourceDescriptor descriptor) {
-        descriptor.destroyResource(resource);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.ResourceManager#getDefaultImage()
-     */
-    protected Image getDefaultImage() {
-        if (missingImage == null) {
-            missingImage = ImageDescriptor.getMissingImageDescriptor().createImage();
-        }
-        return missingImage;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.AbstractResourceManager#dispose()
-     */
-    public void dispose() {
-        super.dispose();
-        if (missingImage != null) {
-            missingImage.dispose();
-            missingImage = null;
-        }
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/FileImageDescriptor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/FileImageDescriptor.java
deleted file mode 100644
index f7dd117..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/FileImageDescriptor.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import java.io.BufferedInputStream;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.internal.JFaceActivator;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-
-/**
- * An image descriptor that loads its image information from a file.
- */
-class FileImageDescriptor extends ImageDescriptor {
-
-	/**
-	 * The class whose resource directory contain the file, or <code>null</code>
-	 * if none.
-	 */
-	private Class location;
-
-	/**
-	 * The name of the file.
-	 */
-	private String name;
-
-	/**
-	 * Creates a new file image descriptor. The file has the given file name and
-	 * is located in the given class's resource directory. If the given class is
-	 * <code>null</code>, the file name must be absolute.
-	 * <p>
-	 * Note that the file is not accessed until its <code>getImageDate</code>
-	 * method is called.
-	 * </p>
-	 * 
-	 * @param clazz
-	 *            class for resource directory, or <code>null</code>
-	 * @param filename
-	 *            the name of the file
-	 */
-	FileImageDescriptor(Class clazz, String filename) {
-		this.location = clazz;
-		this.name = filename;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Object.
-	 */
-	public boolean equals(Object o) {
-		if (!(o instanceof FileImageDescriptor)) {
-			return false;
-		}
-		FileImageDescriptor other = (FileImageDescriptor) o;
-		if (location != null) {
-			if (!location.equals(other.location)) {
-				return false;
-			}
-		} else {
-			if (other.location != null) {
-				return false;
-			}
-		}
-		return name.equals(other.name);
-	}
-
-	/**
-	 * @see org.eclipse.jface.resource.ImageDescriptor#getImageData() The
-	 *      FileImageDescriptor implementation of this method is not used by
-	 *      {@link ImageDescriptor#createImage(boolean, Device)} as of version
-	 *      3.4 so that the SWT OS optimised loading can be used.
-	 */
-	public ImageData getImageData() {
-		InputStream in = getStream();
-		ImageData result = null;
-		if (in != null) {
-			try {
-				result = new ImageData(in);
-			} catch (SWTException e) {
-				if (e.code != SWT.ERROR_INVALID_IMAGE) {
-					throw e;
-					// fall through otherwise
-				}
-			} finally {
-				try {
-					in.close();
-				} catch (IOException e) {
-					// System.err.println(getClass().getName()+".getImageData():
-					// "+
-					// "Exception while closing InputStream : "+e);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns a stream on the image contents. Returns null if a stream could
-	 * not be opened.
-	 * 
-	 * @return the buffered stream on the file or <code>null</code> if the
-	 *         file cannot be found
-	 */
-	private InputStream getStream() {
-		InputStream is = null;
-
-		if (location != null) {
-			is = location.getResourceAsStream(name);
-
-		} else {
-			try {
-				is = new FileInputStream(name);
-			} catch (FileNotFoundException e) {
-				return null;
-			}
-		}
-		if (is == null) {
-			return null;
-		}
-		return new BufferedInputStream(is);
-
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Object.
-	 */
-	public int hashCode() {
-		int code = name.hashCode();
-		if (location != null) {
-			code += location.hashCode();
-		}
-		return code;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Object.
-	 */
-	/**
-	 * The <code>FileImageDescriptor</code> implementation of this
-	 * <code>Object</code> method returns a string representation of this
-	 * object which is suitable only for debugging.
-	 */
-	public String toString() {
-		return "FileImageDescriptor(location=" + location + ", name=" + name + ")";//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.resource.ImageDescriptor#createImage(boolean,
-	 *      org.eclipse.swt.graphics.Device)
-	 */
-	public Image createImage(boolean returnMissingImageOnError, Device device) {
-		String path = getFilePath();
-		if (path == null)
-			return createDefaultImage(returnMissingImageOnError, device);
-		try {			
-			return new Image(device, path);
-		} catch (SWTException exception) {
-			//if we fail try the default way using a stream
-		}
-		return super.createImage(returnMissingImageOnError, device);
-	}
-
-	/**
-	 * Return default image if returnMissingImageOnError is true.
-	 * 
-	 * @param device
-	 * @return Image or <code>null</code>
-	 */
-	private Image createDefaultImage(boolean returnMissingImageOnError,
-			Device device) {
-		try {
-			if (returnMissingImageOnError)
-				return new Image(device, DEFAULT_IMAGE_DATA);
-		} catch (SWTException nextException) {
-			return null;
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the filename for the ImageData.
-	 * 
-	 * @return {@link String} or <code>null</code> if the file cannot be found
-	 */
-	private String getFilePath() {
-
-		if (location == null)
-			return new Path(name).toOSString();
-
-		URL resource = location.getResource(name);
-
-		if (resource == null)
-			return null;
-		try {
-			if (JFaceActivator.getBundleContext() == null) {// Stand-alone case
-
-				return new Path(resource.getFile()).toOSString();
-			}
-			return new Path(FileLocator.toFileURL(resource).getPath()).toOSString();
-		} catch (IOException e) {
-			Policy.logException(e);
-			return null;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/FontDescriptor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/FontDescriptor.java
deleted file mode 100644
index a3fca83..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/FontDescriptor.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Lightweight descriptor for a font. Creates the described font on demand.
- * Subclasses can implement different ways of describing a font. These objects
- * will be compared, so hashCode(...) and equals(...) must return something 
- * meaningful.
- * 
- * @since 3.1
- */
-public abstract class FontDescriptor extends DeviceResourceDescriptor {
-    
-    /**
-     * Creates a FontDescriptor that describes an existing font. The resulting
-     * descriptor depends on the Font. Disposing the Font while the descriptor
-     * is still in use may throw a graphic disposed exception.
-     * 
-     * @since 3.1
-     *
-     * @deprecated use {@link FontDescriptor#createFrom(Font)}
-     *
-     * @param font a font to describe
-     * @param originalDevice must be the same Device that was passed into
-     * the font's constructor when it was first created.
-     * @return a newly created FontDescriptor.
-     */
-    public static FontDescriptor createFrom(Font font, Device originalDevice) {
-        return new ArrayFontDescriptor(font);
-    }
-    
-    /**
-     * Creates a FontDescriptor that describes an existing font. The resulting
-     * descriptor depends on the original Font, and disposing the original Font
-     * while the descriptor is still in use may cause SWT to throw a graphic
-     * disposed exception.
-     * 
-     * @since 3.1
-     *
-     * @param font font to create
-     * @return a newly created FontDescriptor that describes the given font
-     */
-    public static FontDescriptor createFrom(Font font) {
-        return new ArrayFontDescriptor(font);
-    }
-    
-    /**
-     * Creates a new FontDescriptor given the an array of FontData that describes 
-     * the font.
-     * 
-     * @since 3.1
-     *
-     * @param data an array of FontData that describes the font (will be passed into
-     * the Font's constructor)
-     * @return a FontDescriptor that describes the given font
-     */
-    public static FontDescriptor createFrom(FontData[] data) {
-        return new ArrayFontDescriptor(data);
-    }
-    
-    /**
-     * Creates a new FontDescriptor given the associated FontData
-     * 
-     * @param data FontData describing the font to create
-     * @return a newly created FontDescriptor
-     */
-    public static FontDescriptor createFrom(FontData data) {
-        return new ArrayFontDescriptor(new FontData[]{data});
-    }
-    
-    /**
-     * Creates a new FontDescriptor given an OS-specific font name, height, and style.
-     * 
-     * @see Font#Font(org.eclipse.swt.graphics.Device, java.lang.String, int, int)
-     *
-     * @param name os-specific font name
-     * @param height height (pixels)
-     * @param style a bitwise combination of NORMAL, BOLD, ITALIC 
-     * @return a new FontDescriptor
-     */
-    public static FontDescriptor createFrom(String name, int height, int style) {
-        return createFrom(new FontData(name, height, style));
-    }
-    
-    /**
-     * Returns the set of FontData associated with this font. Modifying the elements
-     * in the returned array has no effect on the original FontDescriptor.
-     * 
-     * @return the set of FontData associated with this font
-     * @since 3.3
-     */
-    public FontData[] getFontData() {
-    	Font tempFont = createFont(Display.getCurrent());
-    	FontData[] result = tempFont.getFontData();
-    	destroyFont(tempFont);
-    	return result;
-    }
-    
-    /**
-     * Returns an array of FontData containing copies of the FontData
-     * from the original. 
-     * 
-     * @param original array to copy
-     * @return a deep copy of the original array
-     * @since 3.3
-     */
-    public static FontData[] copy(FontData[] original) {
-    	FontData[] result = new FontData[original.length];
-    	for (int i = 0; i < original.length; i++) {
-			FontData next = original[i];
-			
-			result[i] = copy(next);
-		}
-    	
-    	return result;
-    }
-    
-    /**
-     * Returns a copy of the original FontData
-     * 
-	 * @param next FontData to copy
-	 * @return a copy of the given FontData
-     * @since 3.3
-	 */
-	public static FontData copy(FontData next) {
-		FontData result = new FontData(next.getName(), next.getHeight(), next.getStyle());
-		result.setLocale(next.getLocale());
-		return result;
-	}
-
-	/**
-     * Returns a FontDescriptor that is equivalent to the reciever, but uses
-     * the given style bits. 
-     * 
-     * <p>Does not modify the reciever.</p>
-     * 
-     * @param style a bitwise combination of SWT.NORMAL, SWT.ITALIC and SWT.BOLD
-     * @return a new FontDescriptor with the given style
-     * 
-     * @since 3.3
-     */
-    public final FontDescriptor setStyle(int style) {
-    	FontData[] data = getFontData();
-    	
-    	for (int i = 0; i < data.length; i++) {
-			FontData next = data[i];
-			
-			next.setStyle(style);
-		}
-
-    	// Optimization: avoid holding onto extra instances by returning the reciever if
-    	// if it is exactly the same as the result
-    	FontDescriptor result = new ArrayFontDescriptor(data);
-    	if (result.equals(this)) {
-    		return this;
-    	}
-    	
-    	return result;
-    }
-    
-    /**
-     * <p>Returns a FontDescriptor that is equivalent to the reciever, but
-     * has the given style bits, in addition to any styles the reciever already has.</p>
-     * 
-     * <p>Does not modify the reciever.</p>
-     * 
-     * @param style a bitwise combination of SWT.NORMAL, SWT.ITALIC and SWT.BOLD
-     * @return a new FontDescriptor with the given additional style bits
-     * @since 3.3
-     */
-    public final FontDescriptor withStyle(int style) {
-    	FontData[] data = getFontData();
-    	
-    	for (int i = 0; i < data.length; i++) {
-			FontData next = data[i];
-			
-			next.setStyle(next.getStyle() | style);
-		}
-    	
-    	// Optimization: avoid allocating extra instances by returning the reciever if
-    	// if it is exactly the same as the result
-    	FontDescriptor result = new ArrayFontDescriptor(data);
-    	if (result.equals(this)) {
-    		return this;
-    	}
-    	
-    	return result;    	
-    }
-    
-    /**
-     * <p>Returns a new FontDescriptor that is equivalent to the reciever, but
-     * has the given height.</p>
-     * 
-     * <p>Does not modify the reciever.</p>
-     * 
-     * @param height a height, in points
-     * @return a new FontDescriptor with the height, in points
-     * @since 3.3
-     */
-    public final FontDescriptor setHeight(int height) {
-    	FontData[] data = getFontData();
-    	
-    	for (int i = 0; i < data.length; i++) {
-			FontData next = data[i];
-			
-			next.setHeight(height);
-		}
-    	
-    	// Optimization: avoid holding onto extra instances by returning the reciever if
-    	// if it is exactly the same as the result
-    	FontDescriptor result = new ArrayFontDescriptor(data);
-    	if (result.equals(this)) {
-    		return this;
-    	}
-    	
-    	return result;    	
-    }
-
-    /**
-     * <p>Returns a FontDescriptor that is equivalent to the reciever, but whose height
-     * is larger by the given number of points.</p>
-     * 
-     * <p>Does not modify the reciever.</p>
-     * 
-     * @param heightDelta a change in height, in points. Negative values will return smaller
-     * fonts. 
-     * @return a FontDescriptor whose height differs from the reciever by the given number
-     * of points. 
-     * @since 3.3
-     */
-    public final FontDescriptor increaseHeight(int heightDelta) {
-    	if (heightDelta == 0) {
-    		return this;
-    	}
-    	FontData[] data = getFontData();
-    	
-    	for (int i = 0; i < data.length; i++) {
-			FontData next = data[i];
-			
-			next.setHeight(next.getHeight() + heightDelta);
-		}
-    	
-    	return new ArrayFontDescriptor(data);    	
-    }
-    
-    /**
-     * Creates the Font described by this descriptor. 
-     * 
-     * @since 3.1 
-     *
-     * @param device device on which to allocate the font
-     * @return a newly allocated Font (never null)
-     * @throws DeviceResourceException if unable to allocate the Font
-     */
-    public abstract Font createFont(Device device) throws DeviceResourceException;
-    
-    /**
-     * Deallocates anything that was allocated by createFont, given a font
-     * that was allocated by an equal FontDescriptor.
-     * 
-     * @since 3.1 
-     *
-     * @param previouslyCreatedFont previously allocated font
-     */
-    public abstract void destroyFont(Font previouslyCreatedFont);
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.DeviceResourceDescriptor#create(org.eclipse.swt.graphics.Device)
-     */
-    public final Object createResource(Device device) throws DeviceResourceException {
-        return createFont(device);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.DeviceResourceDescriptor#destroy(java.lang.Object)
-     */
-    public final void destroyResource(Object previouslyCreatedObject) {
-        destroyFont((Font)previouslyCreatedObject);
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/FontRegistry.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/FontRegistry.java
deleted file mode 100644
index 7371a72..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/FontRegistry.java
+++ /dev/null
@@ -1,840 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A font registry maintains a mapping between symbolic font names 
- * and SWT fonts.
- * <p>
- * A font registry owns all of the font objects registered
- * with it, and automatically disposes of them when the SWT Display
- * that creates the fonts is disposed. Because of this, clients do 
- * not need to (indeed, must not attempt to) dispose of font 
- * objects themselves.
- * </p>
- * <p>
- * A special constructor is provided for populating a font registry
- * from a property files using the standard Java resource bundle mechanism.
- * </p>
- * <p>
- * Methods are provided for registering listeners that will be kept
- * apprised of changes to list of registed fonts.
- * </p>
- * <p>
- * Clients may instantiate this class (it was not designed to be subclassed).
- * </p>
- * 
- * Since 3.0 this class extends ResourceRegistry.
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class FontRegistry extends ResourceRegistry {
-
-    /**
-     * FontRecord is a private helper class that holds onto a font
-     * and can be used to generate its bold and italic version. 
-     */
-    private class FontRecord {
-
-        Font baseFont;
-
-        Font boldFont;
-
-        Font italicFont;
-
-        FontData[] baseData;
-
-        /**
-         * Create a new instance of the receiver based on the 
-         * plain font and the data for it.
-         * @param plainFont The base looked up font.
-         * @param data The data used to look it up.
-         */
-        FontRecord(Font plainFont, FontData[] data) {
-            baseFont = plainFont;
-            baseData = data;
-        }
-
-        /**
-         * Dispose any of the fonts created for this record.
-         */
-        void dispose() {
-            baseFont.dispose();
-            if (boldFont != null) {
-				boldFont.dispose();
-			}
-            if (italicFont != null) {
-				italicFont.dispose();
-			}
-        }
-
-        /**
-         * Return the base Font.
-         * @return Font
-         */
-        public Font getBaseFont() {
-            return baseFont;
-        }
-
-        /**
-         * Return the bold Font. Create a bold version
-         * of the base font to get it.
-         * @return Font
-         */
-        public Font getBoldFont() {
-            if (boldFont != null) {
-				return boldFont;
-			}
-
-            FontData[] boldData = getModifiedFontData(SWT.BOLD);
-            boldFont = new Font(Display.getCurrent(), boldData);
-            return boldFont;
-        }
-
-        /**
-         * Get a version of the base font data with the specified 
-         * style.
-         * @param style the new style
-         * @return the font data with the style {@link FontData#FontData(String, int, int)}
-         * @see SWT#ITALIC
-         * @see SWT#NORMAL
-         * @see SWT#BOLD
-         * @todo Generated comment
-         */
-        private FontData[] getModifiedFontData(int style) {
-            FontData[] styleData = new FontData[baseData.length];
-            for (int i = 0; i < styleData.length; i++) {
-                FontData base = baseData[i];
-                styleData[i] = new FontData(base.getName(), base.getHeight(),
-                        base.getStyle() | style);
-            }
-
-            return styleData;
-        }
-
-        /**
-         * Return the italic Font. Create an italic version of the
-         * base font to get it.
-         * @return Font
-         */
-        public Font getItalicFont() {
-            if (italicFont != null) {
-				return italicFont;
-			}
-
-            FontData[] italicData = getModifiedFontData(SWT.ITALIC);
-            italicFont = new Font(Display.getCurrent(), italicData);
-            return italicFont;
-        }
-
-        /**
-         * Add any fonts that were allocated for this record to the
-         * stale fonts. Anything that matches the default font will
-         * be skipped.
-         * @param defaultFont The system default.
-         */
-        void addAllocatedFontsToStale(Font defaultFont) {
-            //Return all of the fonts allocated by the receiver.
-            //if any of them are the defaultFont then don't bother.
-            if (defaultFont != baseFont && baseFont != null) {
-				staleFonts.add(baseFont);
-			}
-            if (defaultFont != boldFont && boldFont != null) {
-				staleFonts.add(boldFont);
-			}
-            if (defaultFont != italicFont && italicFont != null) {
-				staleFonts.add(italicFont);
-			}
-        }
-    }
-
-    /**
-     * Table of known fonts, keyed by symbolic font name
-     * (key type: <code>String</code>, 
-     *  value type: <code>FontRecord</code>.
-     */
-    private Map stringToFontRecord = new HashMap(7);
-
-    /**
-     * Table of known font data, keyed by symbolic font name
-     * (key type: <code>String</code>, 
-     *  value type: <code>org.eclipse.swt.graphics.FontData[]</code>).
-     */
-    private Map stringToFontData = new HashMap(7);
-
-    /**
-     * Collection of Fonts that are now stale to be disposed
-     * when it is safe to do so (i.e. on shutdown).
-     * @see List
-     */
-    private List staleFonts = new ArrayList();
-
-    /**
-     * Runnable that cleans up the manager on disposal of the display.
-     */
-    protected Runnable displayRunnable = new Runnable() {
-        public void run() {
-            clearCaches();
-        }
-    };
-
-	private boolean displayDisposeHooked;
-
-	private final boolean cleanOnDisplayDisposal;
-
-    /**
-     * Creates an empty font registry.
-     * <p>
-     * There must be an SWT Display created in the current 
-     * thread before calling this method.
-     * </p>
-     */
-    public FontRegistry() {
-    	this(Display.getCurrent(), true);
-    }
-
-    /**
-     * Creates a font registry and initializes its content from
-     * a property file.
-     * <p>
-     * There must be an SWT Display created in the current 
-     * thread before calling this method.
-     * </p>
-     * <p>
-     * The OS name (retrieved using <code>System.getProperty("os.name")</code>)
-     * is converted to lowercase, purged of whitespace, and appended 
-     * as suffix (separated by an underscore <code>'_'</code>) to the given 
-     * location string to yield the base name of a resource bundle
-     * acceptable to <code>ResourceBundle.getBundle</code>.
-     * The standard Java resource bundle mechanism is then used to locate
-     * and open the appropriate properties file, taking into account
-     * locale specific variations.
-     * </p>
-     * <p>
-     * For example, on the Windows 2000 operating system the location string
-     * <code>"com.example.myapp.Fonts"</code> yields the base name 
-     * <code>"com.example.myapp.Fonts_windows2000"</code>. For the US English locale,
-     * this further elaborates to the resource bundle name
-     * <code>"com.example.myapp.Fonts_windows2000_en_us"</code>.
-     * </p>
-     * <p>
-     * If no appropriate OS-specific resource bundle is found, the
-     * process is repeated using the location as the base bundle name.
-     * </p>
-     * <p>
-     * The property file contains entries that look like this:
-     * <pre>
-     *	textfont.0=MS Sans Serif-regular-10
-     *	textfont.1=Times New Roman-regular-10
-     *	
-     *	titlefont.0=MS Sans Serif-regular-12
-     *	titlefont.1=Times New Roman-regular-12
-     * </pre>
-     * Each entry maps a symbolic font names (the font registry keys) with
-     * a "<code>.<it>n</it></code> suffix to standard font names
-     * on the right. The suffix indicated order of preference: 
-     * "<code>.0</code>" indicates the first choice,
-     * "<code>.1</code>" indicates the second choice, and so on.
-     * </p>
-     * The following example shows how to use the font registry:
-     * <pre>
-     *	FontRegistry registry = new FontRegistry("com.example.myapp.fonts");
-     *  Font font = registry.get("textfont");
-     *  control.setFont(font);
-     *  ...
-     * </pre>
-     *
-     * @param location the name of the resource bundle
-     * @param loader the ClassLoader to use to find the resource bundle
-     * @exception MissingResourceException if the resource bundle cannot be found
-     * @since 2.1
-     */
-    public FontRegistry(String location, ClassLoader loader)
-            throws MissingResourceException {
-        Display display = Display.getCurrent();
-        Assert.isNotNull(display);
-        // FIXE: need to respect loader
-        //readResourceBundle(location, loader);
-        readResourceBundle(location);
-
-        cleanOnDisplayDisposal = true;
-        hookDisplayDispose(display);
-    }
-
-    /**
-     * Load the FontRegistry using the ClassLoader from the PlatformUI
-     * plug-in
-     * @param location the location to read the resource bundle from
-     * @throws MissingResourceException Thrown if a resource is missing
-     */
-    public FontRegistry(String location) throws MissingResourceException {
-        // FIXE:
-        //	this(location, WorkbenchPlugin.getDefault().getDescriptor().getPluginClassLoader());
-        this(location, null);
-    }
-
-    /**
-     * Read the resource bundle at location. Look for a file with the
-     * extension _os_ws first, then _os then just the name.
-     * @param location - String - the location of the file.
-     */
-
-    private void readResourceBundle(String location) {
-        String osname = System.getProperty("os.name").trim(); //$NON-NLS-1$
-        String wsname = Util.getWS();
-        osname = StringConverter.removeWhiteSpaces(osname).toLowerCase();
-        wsname = StringConverter.removeWhiteSpaces(wsname).toLowerCase();
-        String OSLocation = location;
-        String WSLocation = location;
-        ResourceBundle bundle = null;
-        if (osname != null) {
-            OSLocation = location + "_" + osname; //$NON-NLS-1$
-            if (wsname != null) {
-				WSLocation = OSLocation + "_" + wsname; //$NON-NLS-1$
-			}
-        }
-
-        try {
-            bundle = ResourceBundle.getBundle(WSLocation);
-            readResourceBundle(bundle, WSLocation);
-        } catch (MissingResourceException wsException) {
-            try {
-                bundle = ResourceBundle.getBundle(OSLocation);
-                readResourceBundle(bundle, WSLocation);
-            } catch (MissingResourceException osException) {
-                if (location != OSLocation) {
-                    bundle = ResourceBundle.getBundle(location);
-                    readResourceBundle(bundle, WSLocation);
-                } else {
-					throw osException;
-				}
-            }
-        }
-    }
-
-    /**
-     * Creates an empty font registry.
-     *
-     * @param display the Display
-     */
-    public FontRegistry(Display display) {
-        this(display, true);
-    }
-    
-    /**
-	 * Creates an empty font registry.
-	 * 
-	 * @param display
-	 *            the <code>Display</code>
-	 * @param cleanOnDisplayDisposal
-	 *            whether all fonts allocated by this <code>FontRegistry</code>
-	 *            should be disposed when the display is disposed
-	 * @since 3.1
-	 */
-	public FontRegistry(Display display, boolean cleanOnDisplayDisposal) {
-		Assert.isNotNull(display);
-		this.cleanOnDisplayDisposal = cleanOnDisplayDisposal;
-		if (cleanOnDisplayDisposal) {
-			hookDisplayDispose(display);
-		}
-	}
-
-    /**
-	 * Find the first valid fontData in the provided list. If none are valid
-	 * return the first one regardless. If the list is empty return null. Return
-	 * <code>null</code> if one cannot be found.
-	 * 
-     * @param fonts the font list
-     * @param display the display used 
-     * @return the font data of the like describe above
-	 * 
-	 * @deprecated use bestDataArray in order to support Motif multiple entry
-	 *             fonts.
-	 */
-    public FontData bestData(FontData[] fonts, Display display) {
-        for (int i = 0; i < fonts.length; i++) {
-            FontData fd = fonts[i];
-
-            if (fd == null) {
-				break;
-			}
-
-            FontData[] fixedFonts = display.getFontList(fd.getName(), false);
-            if (isFixedFont(fixedFonts, fd)) {
-                return fd;
-            }
-
-            FontData[] scalableFonts = display.getFontList(fd.getName(), true);
-            if (scalableFonts.length > 0) {
-                return fd;
-            }
-        }
-
-        //None of the provided datas are valid. Return the
-        //first one as it is at least the first choice.
-        if (fonts.length > 0) {
-			return fonts[0];
-		}
-        
-        //Nothing specified 
-        return null;
-    }
-
-    /**
-     * Find the first valid fontData in the provided list. 
-     * If none are valid return the first one regardless.
-     * If the list is empty return <code>null</code>.
-     * 
-     * @param fonts list of fonts
-     * @param display the display
-     * @return font data like described above
-     * @deprecated use filterData in order to preserve 
-     * multiple entry fonts on Motif
-     */
-    public FontData[] bestDataArray(FontData[] fonts, Display display) {
-
-        FontData bestData = bestData(fonts, display);
-        if (bestData == null) {
-			return null;
-		}
-        
-        FontData[] datas = new FontData[1];
-        datas[0] = bestData;
-        return datas;
-    }
-    
-    /**
-     * Removes from the list all fonts that do not exist in this system.  
-     * If none are valid, return the first irregardless.  If the list is 
-     * empty return <code>null</code>.
-     * 
-     * @param fonts the fonts to check
-     * @param display the display to check against
-     * @return the list of fonts that have been found on this system
-     * @since 3.1
-     */
-    public FontData [] filterData(FontData [] fonts, Display display) {
-    	ArrayList good = new ArrayList(fonts.length);
-    	for (int i = 0; i < fonts.length; i++) {
-            FontData fd = fonts[i];
-
-            if (fd == null) {
-				continue;
-			}
-
-            FontData[] fixedFonts = display.getFontList(fd.getName(), false);
-            if (isFixedFont(fixedFonts, fd)) {
-                good.add(fd);
-            }
-
-            FontData[] scalableFonts = display.getFontList(fd.getName(), true);
-            if (scalableFonts.length > 0) {
-                good.add(fd);
-            }
-        }
-
-    	
-        //None of the provided datas are valid. Return the
-        //first one as it is at least the first choice.
-        if (good.isEmpty() && fonts.length > 0) {
-        	good.add(fonts[0]);
-        }
-        else if (fonts.length == 0) {
-        	return null;
-        }
-        
-        return (FontData[]) good.toArray(new FontData[good.size()]);    	
-    }
-    
-
-    /**
-     * Creates a new font with the given font datas or <code>null</code>
-     * if there is no data.
-     * @return FontRecord for the new Font or <code>null</code>.
-     */
-    private FontRecord createFont(String symbolicName, FontData[] fonts) {
-        Display display = Display.getCurrent();
-        if (display == null) {
-        	return null;
-        }
-        if (cleanOnDisplayDisposal && !displayDisposeHooked) {
-        	hookDisplayDispose(display);
-        }
-
-        FontData[] validData = filterData(fonts, display);
-        if (validData.length == 0) {
-            //Nothing specified 
-            return null;
-        } 
-
-        //Do not fire the update from creation as it is not a property change
-        put(symbolicName, validData, false);
-        Font newFont = new Font(display, validData);
-        return new FontRecord(newFont, validData);
-    }
-
-    /**
-     * Calculates the default font and returns the result.
-     * This method creates a font that must be disposed.
-     */
-    Font calculateDefaultFont() {
-        Display current = Display.getCurrent();
-        if (current == null) {
-            Shell shell = new Shell();
-            Font font = new Font(null, shell.getFont().getFontData());
-            shell.dispose();
-            return font;
-        }
-		return new Font(current, current.getSystemFont().getFontData());
-    }
-
-    /**
-     * Returns the default font data.  Creates it if necessary.
-     * @return Font
-     */
-    public Font defaultFont() {
-        return defaultFontRecord().getBaseFont();
-    }
-
-    /**
-     * Returns the font descriptor for the font with the given symbolic
-     * font name. Returns the default font if there is no special value
-     * associated with that name
-     * 
-     * @param symbolicName symbolic font name
-     * @return the font descriptor (never null)
-     * 
-     * @since 3.3
-     */
-    public FontDescriptor getDescriptor(String symbolicName) {
-        Assert.isNotNull(symbolicName);
-        return FontDescriptor.createFrom(getFontData(symbolicName));
-    }
-    
-    
-    
-    /**
-     * Returns the default font record.
-     */
-    private FontRecord defaultFontRecord() {
-
-        FontRecord record = (FontRecord) stringToFontRecord
-                .get(JFaceResources.DEFAULT_FONT);
-        if (record == null) {
-            Font defaultFont = calculateDefaultFont();
-            record = createFont(JFaceResources.DEFAULT_FONT, defaultFont
-                    .getFontData());
-            defaultFont.dispose();
-            stringToFontRecord.put(JFaceResources.DEFAULT_FONT, record);
-        }
-        return record;
-    }
-
-    /**
-     * Returns the default font data.  Creates it if necessary.
-     */
-    private FontData[] defaultFontData() {
-        return defaultFontRecord().baseData;
-    }
-
-    /**
-     * Returns the font data associated with the given symbolic font name.
-     * Returns the default font data if there is no special value associated
-     * with that name.
-     *
-     * @param symbolicName symbolic font name
-     * @return the font
-     */
-    public FontData[] getFontData(String symbolicName) {
-
-        Assert.isNotNull(symbolicName);
-        Object result = stringToFontData.get(symbolicName);
-        if (result == null) {
-			return defaultFontData();
-		}
-
-        return (FontData[]) result;
-    }
-
-    /**
-     * Returns the font associated with the given symbolic font name.
-     * Returns the default font if there is no special value associated
-     * with that name.
-     *
-     * @param symbolicName symbolic font name
-     * @return the font
-     */
-    public Font get(String symbolicName) {
-
-        return getFontRecord(symbolicName).getBaseFont();
-    }
-
-    /**
-     * Returns the bold font associated with the given symbolic font name.
-     * Returns the bolded default font if there is no special value associated
-     * with that name.
-     *
-     * @param symbolicName symbolic font name
-     * @return the font
-     * @since 3.0
-     */
-    public Font getBold(String symbolicName) {
-
-        return getFontRecord(symbolicName).getBoldFont();
-    }
-
-    /**
-     * Returns the italic font associated with the given symbolic font name.
-     * Returns the italic default font if there is no special value associated
-     * with that name.
-     *
-     * @param symbolicName symbolic font name
-     * @return the font
-     * @since 3.0
-     */
-    public Font getItalic(String symbolicName) {
-
-        return getFontRecord(symbolicName).getItalicFont();
-    }
-
-    /**
-     * Return the font record for the key.
-     * @param symbolicName The key for the record.
-     * @return FontRecird
-     */
-    private FontRecord getFontRecord(String symbolicName) {
-        Assert.isNotNull(symbolicName);
-        Object result = stringToFontRecord.get(symbolicName);
-        if (result != null) {
-			return (FontRecord) result;
-		}
-
-        result = stringToFontData.get(symbolicName);
-
-        FontRecord fontRecord;
-
-        if (result == null) {
-			fontRecord = defaultFontRecord();
-		} else {
-			fontRecord = createFont(symbolicName, (FontData[]) result);
-		}
-
-        if (fontRecord == null) {
-			fontRecord = defaultFontRecord();
-		}
-
-        stringToFontRecord.put(symbolicName, fontRecord);
-        return fontRecord;
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.ResourceRegistry#getKeySet()
-     */
-    public Set getKeySet() {
-        return Collections.unmodifiableSet(stringToFontData.keySet());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.ResourceRegistry#hasValueFor(java.lang.String)
-     */
-    public boolean hasValueFor(String fontKey) {
-        return stringToFontData.containsKey(fontKey);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.ResourceRegistry#clearCaches()
-     */
-    protected void clearCaches() {
-
-        Iterator iterator = stringToFontRecord.values().iterator();
-        while (iterator.hasNext()) {
-            Object next = iterator.next();
-            ((FontRecord) next).dispose();
-        }
-
-        disposeFonts(staleFonts.iterator());
-        stringToFontRecord.clear();
-        staleFonts.clear();
-        
-        displayDisposeHooked = false;
-    }
-
-    /**
-     * Dispose of all of the fonts in this iterator.
-     * @param iterator over Collection of Font
-     */
-    private void disposeFonts(Iterator iterator) {
-        while (iterator.hasNext()) {
-            Object next = iterator.next();
-            ((Font) next).dispose();
-        }
-    }
-
-    /**
-     * Hook a dispose listener on the SWT display.
-     */
-    private void hookDisplayDispose(Display display) {
-    	displayDisposeHooked = true;
-    	display.disposeExec(displayRunnable);
-    }
-
-    /**
-     * Checks whether the given font is in the list of fixed fonts.
-     */
-    private boolean isFixedFont(FontData[] fixedFonts, FontData fd) {
-        // Can't use FontData.equals() since some values aren't
-        // set if a fontdata isn't used.
-        int height = fd.getHeight();
-        String name = fd.getName();
-        for (int i = 0; i < fixedFonts.length; i++) {
-            FontData fixed = fixedFonts[i];
-            if (fixed.getHeight() == height && fixed.getName().equals(name)) {
-				return true;
-			}
-        }
-        return false;
-    }
-
-    /**
-     * Converts a String into a FontData object.
-     */
-    private FontData makeFontData(String value) throws MissingResourceException {
-        try {
-            return StringConverter.asFontData(value.trim());
-        } catch (DataFormatException e) {
-            throw new MissingResourceException(
-                    "Wrong font data format. Value is: \"" + value + "\"", getClass().getName(), value); //$NON-NLS-2$//$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Adds (or replaces) a font to this font registry under the given
-     * symbolic name.
-     * <p>
-     * A property change event is reported whenever the mapping from
-     * a symbolic name to a font changes. The source of the event is
-     * this registry; the property name is the symbolic font name.
-     * </p>
-     *
-     * @param symbolicName the symbolic font name
-     * @param fontData an Array of FontData
-     */
-    public void put(String symbolicName, FontData[] fontData) {
-        put(symbolicName, fontData, true);
-    }
-
-    /**
-     * Adds (or replaces) a font to this font registry under the given
-     * symbolic name.
-     * <p>
-     * A property change event is reported whenever the mapping from
-     * a symbolic name to a font changes. The source of the event is
-     * this registry; the property name is the symbolic font name.
-     * </p>
-     *
-     * @param symbolicName the symbolic font name
-     * @param fontData an Array of FontData
-     * @param update - fire a font mapping changed if true. False
-     * 	if this method is called from the get method as no setting
-     *  has changed.
-     */
-    private void put(String symbolicName, FontData[] fontData, boolean update) {
-
-        Assert.isNotNull(symbolicName);
-        Assert.isNotNull(fontData);
-
-        FontData[] existing = (FontData[]) stringToFontData.get(symbolicName);
-        if (Arrays.equals(existing, fontData)) {
-			return;
-		}
-
-        FontRecord oldFont = (FontRecord) stringToFontRecord
-                .remove(symbolicName);
-        stringToFontData.put(symbolicName, fontData);
-        if (update) {
-			fireMappingChanged(symbolicName, existing, fontData);
-		}
-
-        if (oldFont != null) {
-			oldFont.addAllocatedFontsToStale(defaultFontRecord().getBaseFont());
-		}
-    }
-
-    /**
-     * Reads the resource bundle.  This puts FontData[] objects
-     * in the mapping table.  These will lazily be turned into
-     * real Font objects when requested.
-     */
-    private void readResourceBundle(ResourceBundle bundle, String bundleName)
-            throws MissingResourceException {
-        Enumeration keys = bundle.getKeys();
-        while (keys.hasMoreElements()) {
-            String key = (String) keys.nextElement();
-            int pos = key.lastIndexOf('.');
-            if (pos == -1) {
-                stringToFontData.put(key, new FontData[] { makeFontData(bundle
-                        .getString(key)) });
-            } else {
-                String name = key.substring(0, pos);
-                int i = 0;
-                try {
-                    i = Integer.parseInt(key.substring(pos + 1));
-                } catch (NumberFormatException e) {
-                    //Panic the file can not be parsed.
-                    throw new MissingResourceException(
-                            "Wrong key format ", bundleName, key); //$NON-NLS-1$
-                }
-                FontData[] elements = (FontData[]) stringToFontData.get(name);
-                if (elements == null) {
-                    elements = new FontData[8];
-                    stringToFontData.put(name, elements);
-                }
-                if (i > elements.length) {
-                    FontData[] na = new FontData[i + 8];
-                    System.arraycopy(elements, 0, na, 0, elements.length);
-                    elements = na;
-                    stringToFontData.put(name, elements);
-                }
-                elements[i] = makeFontData(bundle.getString(key));
-            }
-        }
-    }
-
-	/**
-	 * Returns the font descriptor for the JFace default font.
-	 * 
-	 * @return the font descriptor for the JFace default font
-     * @since 3.3
-	 */
-	public FontDescriptor defaultFontDescriptor() {
-		return FontDescriptor.createFrom(defaultFontData());
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ImageDataImageDescriptor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ImageDataImageDescriptor.java
deleted file mode 100644
index 45d1b93..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ImageDataImageDescriptor.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-
-/**
- * @since 3.1
- */
-class ImageDataImageDescriptor extends ImageDescriptor {
-
-    private ImageData data;
-    
-    /**
-     * Original image being described, or null if this image is described
-     * completely using its ImageData
-     */
-    private Image originalImage = null;
-    
-    /**
-     * Creates an image descriptor, given an image and the device it was created on.
-     * 
-     * @param originalImage
-     */
-    ImageDataImageDescriptor(Image originalImage) {
-        this(originalImage.getImageData());
-        this.originalImage = originalImage;
-    }
-    
-    /**
-     * Creates an image descriptor, given some image data.
-     * 
-     * @param data describing the image
-     */
-
-    ImageDataImageDescriptor(ImageData data) {
-        this.data = data;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.DeviceResourceDescriptor#create(org.eclipse.swt.graphics.Device)
-     */
-    public Object createResource(Device device) throws DeviceResourceException {
-
-        // If this descriptor is an existing font, then we can return the original font
-        // if this is the same device.
-        if (originalImage != null) {
-            // If we're allocating on the same device as the original font, return the original.
-            if (originalImage.getDevice() == device) {
-                return originalImage;
-            }
-        }
-        
-        return super.createResource(device);
-    }
-	
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.DeviceResourceDescriptor#destroy(java.lang.Object)
-     */
-    public void destroyResource(Object previouslyCreatedObject) {
-        if (previouslyCreatedObject == originalImage) {
-            return;
-        }
-        
-        super.destroyResource(previouslyCreatedObject);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.ImageDescriptor#getImageData()
-     */
-    public ImageData getImageData() {
-        return data;
-    }
-    
-    /* (non-Javadoc)
-     * @see Object#hashCode
-     */
-    public int hashCode() {
-    	 if (originalImage != null) {
-             return System.identityHashCode(originalImage);
-         }
-         return data.hashCode();
-    }
-
-    /* (non-Javadoc)
-     * @see Object#equals
-     */
-    public boolean equals(Object obj) {
-        if (!(obj instanceof ImageDataImageDescriptor)) {
-			return false;
-		} 
-        
-        ImageDataImageDescriptor imgWrap = (ImageDataImageDescriptor) obj;
-        
-        //Intentionally using == instead of equals() as Image.hashCode() changes
-        //when the image is disposed and so leaks may occur with equals()
-       
-        if (originalImage != null) {
-            return imgWrap.originalImage == originalImage;
-        }
-        
-        return (imgWrap.originalImage == null && data.equals(imgWrap.data));
-    }
-    
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ImageDescriptor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ImageDescriptor.java
deleted file mode 100644
index f0f8011..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ImageDescriptor.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import java.net.URL;
-
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * An image descriptor is an object that knows how to create
- * an SWT image.  It does not hold onto images or cache them,
- * but rather just creates them on demand.  An image descriptor
- * is intended to be a lightweight representation of an image
- * that can be manipulated even when no SWT display exists.
- * <p>
- * This package defines a concrete image descriptor implementation
- * which reads an image from a file (<code>FileImageDescriptor</code>).
- * It also provides abstract framework classes (this one and
- * <code>CompositeImageDescriptor</code>) which may be subclassed to define
- * news kinds of image descriptors.
- * </p>
- * <p>
- * Using this abstract class involves defining a concrete subclass
- * and providing an implementation for the <code>getImageData</code>
- * method.
- * </p>
- * <p>
- * There are two ways to get an Image from an ImageDescriptor. The method
- * createImage will always return a new Image which must be disposed by
- * the caller. Alternatively, createResource() returns a shared
- * Image. When the caller is done with an image obtained from createResource,
- * they must call destroyResource() rather than disposing the Image directly.
- * The result of createResource() can be safely cast to an Image. 
- * </p>
- *
- * @see org.eclipse.swt.graphics.Image
- */
-public abstract class ImageDescriptor extends DeviceResourceDescriptor {
-
-    /** 
-     * A small red square used to warn that an image cannot be created.
-     * <p>
-     */
-    protected static final ImageData DEFAULT_IMAGE_DATA = new ImageData(6, 6,
-            1, new PaletteData(new RGB[] { new RGB(255, 0, 0) }));
-
-    /**
-     * Constructs an image descriptor.
-     */
-    protected ImageDescriptor() {
-        // do nothing
-    }
-
-    /**
-     * Creates and returns a new image descriptor from a file.
-     * Convenience method for
-     * <code>new FileImageDescriptor(location,filename)</code>.
-     *
-     * @param location the class whose resource directory contain the file
-     * @param filename the file name
-     * @return a new image descriptor
-     */
-    public static ImageDescriptor createFromFile(Class location, String filename) {
-        return new FileImageDescriptor(location, filename);
-    }
-    
-    /**
-     * Creates and returns a new image descriptor given ImageData
-     * describing the image.
-     * 
-     * @since 3.1 
-     *
-     * @param data contents of the image
-     * @return newly created image descriptor
-     */
-    public static ImageDescriptor createFromImageData(ImageData data) {
-        return new ImageDataImageDescriptor(data);
-    }
-    
-    /**
-     * Creates and returns a new image descriptor for the given image. Note 
-     * that disposing the original Image will cause the descriptor to become invalid.
-     * 
-     * @since 3.1 
-     *
-     * @param img image to create
-     * @return a newly created image descriptor
-     */
-    public static ImageDescriptor createFromImage(Image img) {
-        return new ImageDataImageDescriptor(img);
-    }
-    
-    /**
-     * Creates an ImageDescriptor based on the given original descriptor, but with additional
-     * SWT flags.
-     *  
-     * <p>
-     * Note that this sort of ImageDescriptor is slower and consumes more resources than
-     * a regular image descriptor. It will also never generate results that look as nice as
-     * a hand-drawn image. Clients are encouraged to supply their own disabled/grayed/etc. images
-     * rather than using a default image and transforming it.
-     * </p>
-     * 
-     * @param originalImage image to transform
-     * @param swtFlags any flag that can be passed to the flags argument of Image#Image(Device, Image, int)
-     * @return an ImageDescriptor that creates new images by transforming the given image descriptor
-     * 
-     * @see Image#Image(Device, Image, int) 
-     * @since 3.1 
-     *
-     */
-    public static ImageDescriptor createWithFlags(ImageDescriptor originalImage, int swtFlags) {
-        return new DerivedImageDescriptor(originalImage, swtFlags);
-    }
-
-    /**
-     * Creates and returns a new image descriptor for the given image. This
-     * method takes the Device that created the Image as an argument, allowing
-     * the original Image to be reused if the descriptor is asked for another
-     * Image on the same device. Note that disposing the original Image will 
-     * cause the descriptor to become invalid.
-     * 
-     * @deprecated use {@link ImageDescriptor#createFromImage(Image)}
-     * @since 3.1 
-     *
-     * @param img image to create
-     * @param theDevice the device that was used to create the Image
-     * @return a newly created image descriptor
-     */
-    public static ImageDescriptor createFromImage(Image img, Device theDevice) {
-        return new ImageDataImageDescriptor(img);
-    }
-    
-    /**
-     * Creates and returns a new image descriptor from a URL.
-     *
-     * @param url The URL of the image file.
-     * @return a new image descriptor
-     */
-    public static ImageDescriptor createFromURL(URL url) {
-        if (url == null) {
-            return getMissingImageDescriptor();
-        }
-        return new URLImageDescriptor(url);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.DeviceResourceDescriptor#createResource(org.eclipse.swt.graphics.Device)
-     */
-    public Object createResource(Device device) throws DeviceResourceException {
-        Image result = createImage(false, device);
-        if (result == null) {
-            throw new DeviceResourceException(this);
-        }
-        return result;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.DeviceResourceDescriptor#destroyResource(Object)
-     */
-    public void destroyResource(Object previouslyCreatedObject) {
-        ((Image)previouslyCreatedObject).dispose();
-    }
-    
-    /**
-	 * Creates and returns a new SWT image for this image descriptor. Note that
-	 * each call returns a new SWT image object. The returned image must be
-	 * explicitly disposed using the image's dispose call. The image will not be
-	 * automatically garbage collected. A default image is returned in the event
-	 * of an error.
-     * 
-     * <p>
-     * Note: this method differs from createResource(Device) in that the returned image
-     * must be disposed directly, whereas an image obtained from createResource(...)
-     * must be disposed by calling destroyResource(...). It is not possible to 
-     * mix-and-match. If you obtained the Image from this method, you must not dispose
-     * it by calling destroyResource. Clients are encouraged to use 
-     * create/destroyResource and downcast the result to Image rather than using 
-     * createImage.
-     * </p>
-     * 
-	 * <p>
-	 * Note: it is still possible for this method to return <code>null</code>
-	 * in extreme cases, for example if SWT runs out of image handles.
-	 * </p>
-	 * 
-	 * @return a new image or <code>null</code> if the image could not be
-	 *         created
-	 */
-    public Image createImage() {
-        return createImage(true);
-    }
-
-    /**
-	 * Creates and returns a new SWT image for this image descriptor. The
-	 * returned image must be explicitly disposed using the image's dispose
-	 * call. The image will not be automatically garbage collected. In the event
-	 * of an error, a default image is returned if
-	 * <code>returnMissingImageOnError</code> is true, otherwise
-	 * <code>null</code> is returned.
-	 * <p>
-	 * Note: Even if <code>returnMissingImageOnError</code> is true, it is
-	 * still possible for this method to return <code>null</code> in extreme
-	 * cases, for example if SWT runs out of image handles.
-	 * </p>
-	 * 
-	 * @param returnMissingImageOnError
-	 *            flag that determines if a default image is returned on error
-	 * @return a new image or <code>null</code> if the image could not be
-	 *         created
-	 */
-    public Image createImage(boolean returnMissingImageOnError) {
-        return createImage(returnMissingImageOnError, Display.getCurrent());
-    }
-
-    /**
-	 * Creates and returns a new SWT image for this image descriptor. The
-	 * returned image must be explicitly disposed using the image's dispose
-	 * call. The image will not be automatically garbage collected. A default
-	 * image is returned in the event of an error.
-	 * <p>
-	 * Note: it is still possible for this method to return <code>null</code>
-	 * in extreme cases, for example if SWT runs out of image handles.
-	 * </p>
-	 * 
-	 * @param device
-	 *            the device on which to create the image
-	 * @return a new image or <code>null</code> if the image could not be
-	 *         created
-	 * @since 2.0
-	 */
-    public Image createImage(Device device) {
-        return createImage(true, device);
-    }
-
-    /**
-	 * Creates and returns a new SWT image for this image descriptor. The
-	 * returned image must be explicitly disposed using the image's dispose
-	 * call. The image will not be automatically garbage collected. In the even
-	 * of an error, a default image is returned if
-	 * <code>returnMissingImageOnError</code> is true, otherwise
-	 * <code>null</code> is returned.
-	 * <p>
-	 * Note: Even if <code>returnMissingImageOnError</code> is true, it is
-	 * still possible for this method to return <code>null</code> in extreme
-	 * cases, for example if SWT runs out of image handles.
-	 * </p>
-	 * 
-	 * @param returnMissingImageOnError
-	 *            flag that determines if a default image is returned on error
-	 * @param device
-	 *            the device on which to create the image
-	 * @return a new image or <code>null</code> if the image could not be
-	 *         created
-	 * @since 2.0
-	 */
-    public Image createImage(boolean returnMissingImageOnError, Device device) {
-
-        ImageData data = getImageData();
-        if (data == null) {
-            if (!returnMissingImageOnError) {
-                return null;
-            }
-            data = DEFAULT_IMAGE_DATA;
-        }
-
-        /*
-         * Try to create the supplied image. If there is an SWT Exception try and create
-         * the default image if that was requested. Return null if this fails.
-         */
-
-        try {
-            if (data.transparentPixel >= 0) {
-                ImageData maskData = data.getTransparencyMask();
-                return new Image(device, data, maskData);
-            }
-            return new Image(device, data);
-        } catch (SWTException exception) {
-            if (returnMissingImageOnError) {
-                try {
-                    return new Image(device, DEFAULT_IMAGE_DATA);
-                } catch (SWTException nextException) {
-                    return null;
-                }
-            }
-            return null;
-        }
-    }
-
-    /**
-     * Creates and returns a new SWT <code>ImageData</code> object
-     * for this image descriptor.
-     * Note that each call returns a new SWT image data object.
-     * <p>
-     * This framework method is declared public so that it is
-     * possible to request an image descriptor's image data without
-     * creating an SWT image object.
-     * </p>
-     * <p>
-     * Returns <code>null</code> if the image data could not be created.
-     * </p>
-     *
-     * @return a new image data or <code>null</code>
-     */
-    public abstract ImageData getImageData();
-
-    /**
-     * Returns the shared image descriptor for a missing image.
-     *
-     * @return the missing image descriptor
-     */
-    public static ImageDescriptor getMissingImageDescriptor() {
-        return MissingImageDescriptor.getInstance();
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ImageRegistry.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ImageRegistry.java
deleted file mode 100644
index 54b0c02..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ImageRegistry.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Steven Ketcham (sketcham@dsicdi.com) - Bug 42451
- *     [Dialogs] ImageRegistry throws null pointer exception in
- *     application with multiple Display's
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * An image registry maintains a mapping between symbolic image names 
- * and SWT image objects or special image descriptor objects which
- * defer the creation of SWT image objects until they are needed.
- * <p>
- * An image registry owns all of the image objects registered
- * with it, and automatically disposes of them when the SWT Display
- * that creates the images is disposed. Because of this, clients do not 
- * need to (indeed, must not attempt to) dispose of these images themselves.
- * </p>
- * <p>
- * Clients may instantiate this class (it was not designed to be subclassed).
- * </p>
- * <p>
- * Unlike the FontRegistry, it is an error to replace images. As a result
- * there are no events that fire when values are changed in the registry
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ImageRegistry {
-    /**
-     * display used when getting images
-     */
-    private Display display;
-
-    private ResourceManager manager;
-
-    private Map table;
-    
-    private Runnable disposeRunnable = new Runnable() {
-        public void run() {
-            dispose();
-        }
-    };
-    
-    /**
-     * Contains the data for an entry in the registry. 
-     */
-    private static class Entry {
-    	/** the image */
-        protected Image image;
-
-        /** the descriptor */
-        protected ImageDescriptor descriptor;
-    }
-    
-    private static class OriginalImageDescriptor extends ImageDescriptor {
-        private Image original;
-        private int refCount = 0;
-        private Device originalDisplay;
-        
-        /**
-         * @param original the original image
-         * @param originalDisplay the device the image is part of
-         */
-        public OriginalImageDescriptor(Image original, Device originalDisplay) {
-            this.original = original;
-            this.originalDisplay = originalDisplay;
-        }
-        
-        public Object createResource(Device device) throws DeviceResourceException {
-            if (device == originalDisplay) {
-                refCount++;
-                return original;
-            }
-            return super.createResource(device);
-        }
-        
-        public void destroyResource(Object toDispose) {
-            if (original == toDispose) {
-                refCount--;
-                if (refCount == 0) {
-                    original.dispose();
-                    original = null;
-                }
-            } else {
-                super.destroyResource(toDispose);
-            }
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.resource.ImageDescriptor#getImageData()
-         */
-        public ImageData getImageData() {
-            return original.getImageData();
-        }
-    }
-        
-    /**
-     * Creates an empty image registry.
-     * <p>
-     * There must be an SWT Display created in the current 
-     * thread before calling this method.
-     * </p>
-     */
-    public ImageRegistry() {
-        this(Display.getCurrent());
-    }
-
-    /**
-     * Creates an empty image registry using the given resource manager to allocate images.
-     * 
-     * @param manager the resource manager used to allocate images
-     * 
-     * @since 3.1
-     */
-    public ImageRegistry(ResourceManager manager) {
-        Assert.isNotNull(manager);
-        Device dev = manager.getDevice();
-        if (dev instanceof Display) {
-            this.display = (Display)dev;
-        }
-        this.manager = manager;
-        manager.disposeExec(disposeRunnable);
-    }
-    
-    /**
-     * Creates an empty image registry.
-     * 
-     * @param display this <code>Display</code> must not be 
-     *        <code>null</code> and must not be disposed in order
-     *        to use this registry
-     */
-    public ImageRegistry(Display display) {
-        this(JFaceResources.getResources(display));
-    }
-    
-    /**
-     * Returns the image associated with the given key in this registry, 
-     * or <code>null</code> if none.
-     * 
-     * @param key the key
-     * @return the image, or <code>null</code> if none
-     */
-    public Image get(String key) {
-
-        // can be null
-        if (key == null) {
-            return null;
-        }
-        
-        if (display != null) {
-            /**
-             * NOTE, for backwards compatibility the following images are supported
-             * here, they should never be disposed, hence we explicitly return them 
-             * rather then registering images that SWT will dispose.  
-             * 
-             * Applications should go direclty to SWT for these icons.
-             * 
-             * @see Display.getSystemIcon(int ID)
-             */
-            int swtKey = -1;
-            if (key.equals(Dialog.DLG_IMG_INFO)) {
-                swtKey = SWT.ICON_INFORMATION;
-            }
-            if (key.equals(Dialog.DLG_IMG_QUESTION)) {
-                swtKey = SWT.ICON_QUESTION;
-            }
-            if (key.equals(Dialog.DLG_IMG_WARNING)) {
-                swtKey = SWT.ICON_WARNING;
-            }
-            if (key.equals(Dialog.DLG_IMG_ERROR)) {
-                swtKey = SWT.ICON_ERROR;
-            }
-            // if we actually just want to return an SWT image do so without
-            // looking in the registry
-            if (swtKey != -1) {
-                final Image[] image = new Image[1];
-                final int id = swtKey;
-                display.syncExec(new Runnable() {
-                    public void run() {
-                        image[0] = display.getSystemImage(id);
-                    }
-                });
-                return image[0];
-            }
-        }
-
-        Entry entry = getEntry(key);
-        if (entry == null) {
-            return null;
-        }
-        
-        if (entry.image == null) {
-            entry.image = manager.createImageWithDefault(entry.descriptor);
-        }
-        
-        return entry.image;
-    }
-
-    /**
-     * Returns the descriptor associated with the given key in this registry, 
-     * or <code>null</code> if none.
-     *
-     * @param key the key
-     * @return the descriptor, or <code>null</code> if none
-     * @since 2.1
-     */
-    public ImageDescriptor getDescriptor(String key) {
-        Entry entry = getEntry(key);
-        if (entry == null) {
-            return null;
-        }
-        
-        return entry.descriptor;
-    }
-
-    /**
-     * Adds (or replaces) an image descriptor to this registry. The first time
-     * this new entry is retrieved, the image descriptor's image will be computed 
-     * (via </code>ImageDescriptor.createImage</code>) and remembered. 
-     * This method replaces an existing image descriptor associated with the 
-     * given key, but fails if there is a real image associated with it.
-     *
-     * @param key the key
-     * @param descriptor the ImageDescriptor
-     * @exception IllegalArgumentException if the key already exists
-     */
-    public void put(String key, ImageDescriptor descriptor) {
-        Entry entry = getEntry(key);
-        if (entry == null) {
-            entry = new Entry();
-            getTable().put(key, entry);
-        }
-        
-        if (entry.image != null) {
-            throw new IllegalArgumentException(
-                    "ImageRegistry key already in use: " + key); //$NON-NLS-1$            
-        }
-        
-        entry.descriptor = descriptor;
-    }
-
-    /**
-     * Adds an image to this registry.  This method fails if there
-     * is already an image or descriptor for the given key.
-     * <p>
-     * Note that an image registry owns all of the image objects registered
-     * with it, and automatically disposes of them when the SWT Display is disposed. 
-     * Because of this, clients must not register an image object
-     * that is managed by another object.
-     * </p>
-     *
-     * @param key the key
-     * @param image the image, should not be <code>null</code>
-     * @exception IllegalArgumentException if the key already exists
-     */
-    public void put(String key, Image image) {
-        Entry entry = getEntry(key);
-        
-        if (entry == null) {
-            entry = new Entry();
-            putEntry(key, entry);
-        }
-        
-        if (entry.image != null || entry.descriptor != null) {
-            throw new IllegalArgumentException(
-                    "ImageRegistry key already in use: " + key); //$NON-NLS-1$            
-        }
-        
-        // Check for a null image here, otherwise the problem won't appear
-        // until dispose.
-        // See https://bugs.eclipse.org/bugs/show_bug.cgi?id=130315
-        Assert.isNotNull(image, "Cannot register a null image."); //$NON-NLS-1$
-        entry.image = image;
-        entry.descriptor = new OriginalImageDescriptor(image, manager.getDevice());
-        
-        try {
-            manager.create(entry.descriptor);
-        } catch (DeviceResourceException e) {            
-        }
-    }
-
-    /**
-     * Removes an image from this registry.  
-     * If an SWT image was allocated, it is disposed.
-     * This method has no effect if there is no image or descriptor for the given key.
-     * @param key the key
-     */
-    public void remove(String key) {
-        ImageDescriptor descriptor = getDescriptor(key);
-        if (descriptor != null) {
-            manager.destroy(descriptor);
-            getTable().remove(key);
-        }
-    }
-
-    private Entry getEntry(String key) {
-        return (Entry) getTable().get(key);
-    }
-
-    private void putEntry(String key, Entry entry) {
-        getTable().put(key, entry);
-    }
-
-    private Map getTable() {
-        if (table == null) {
-            table = new HashMap(10);
-        }
-        return table;
-    }
-    
-    /**
-     * Disposes this image registry, disposing any images
-     * that were allocated for it, and clearing its entries.
-     * 
-     * @since 3.1
-     */
-    public void dispose() {
-        manager.cancelDisposeExec(disposeRunnable);
-        
-        if (table != null) {
-            for (Iterator i = table.values().iterator(); i.hasNext();) {
-                Entry entry = (Entry) i.next();
-                if (entry.image != null) {
-                    manager.destroyImage(entry.descriptor);
-                }
-            }
-            table = null;
-        }
-        display = null;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/JFaceColors.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/JFaceColors.java
deleted file mode 100644
index 95561ea..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/JFaceColors.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import org.eclipse.jface.preference.JFacePreferences;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * JFaceColors is the class that stores references
- * to all of the colors used by JFace.
- */
-public class JFaceColors {
-
-    /**
-     * @param display the display the color is from
-     * @return the Color used for banner backgrounds
-     * @see SWT#COLOR_LIST_BACKGROUND
-     * @see Display#getSystemColor(int)
-     */
-    public static Color getBannerBackground(Display display) {
-        return display.getSystemColor(SWT.COLOR_LIST_BACKGROUND);
-    }
-
-    /**
-     * @param display the display the color is from
-     * @return the Color used for banner foregrounds
-     * @see SWT#COLOR_LIST_FOREGROUND
-     * @see Display#getSystemColor(int)
-     */
-    public static Color getBannerForeground(Display display) {
-        return display.getSystemColor(SWT.COLOR_LIST_FOREGROUND);
-    }
-
-    /**
-     * @param display the display the color is from
-     * @return the background Color for widgets that display errors.
-     * @see SWT#COLOR_WIDGET_BACKGROUND
-     * @see Display#getSystemColor(int)
-     */
-    public static Color getErrorBackground(Display display) {
-        return display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
-    }
-
-    /**
-     * @param display the display the color is from
-     * @return the border Color for widgets that display errors.
-     * @see SWT#COLOR_WIDGET_DARK_SHADOW
-     * @see Display#getSystemColor(int)
-     */
-    public static Color getErrorBorder(Display display) {
-        return display.getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW);
-    }
-
-    /**
-     * @param display the display the color is from
-     * @return the default color to use for displaying errors.
-     * @see ColorRegistry#get(String)
-     * @see JFacePreferences#ERROR_COLOR
-     */
-    public static Color getErrorText(Display display) {
-        return JFaceResources.getColorRegistry().get(
-                JFacePreferences.ERROR_COLOR);
-    }
-
-    /**
-     * @param display the display the color is from
-     * @return the default color to use for displaying hyperlinks.
-     * @see ColorRegistry#get(String)
-     * @see JFacePreferences#HYPERLINK_COLOR
-     */
-    public static Color getHyperlinkText(Display display) {
-        return JFaceResources.getColorRegistry().get(
-                JFacePreferences.HYPERLINK_COLOR);
-    }
-
-    /**
-     * @param display the display the color is from
-     * @return the default color to use for displaying active hyperlinks.
-     * @see ColorRegistry#get(String)
-     * @see JFacePreferences#ACTIVE_HYPERLINK_COLOR
-     */
-    public static Color getActiveHyperlinkText(Display display) {
-        return JFaceResources.getColorRegistry().get(
-                JFacePreferences.ACTIVE_HYPERLINK_COLOR);
-    }
-
-    /**
-     * Clear out the cached color for name. This is generally
-     * done when the color preferences changed and any cached colors
-     * may be disposed. Users of the colors in this class should add a IPropertyChangeListener
-     * to detect when any of these colors change.
-     * @param colorName name of the color
-     * 
-     * @deprecated JFaceColors no longer maintains a cache of colors.  This job 
-     * is now handled by the ColorRegistry.
-     */
-    public static void clearColor(String colorName) {
-        //no-op
-    }
-
-    /**
-     * Dispose of all allocated colors. Called on workbench
-     * shutdown.
-     * 
-     * @deprecated JFaceColors no longer maintains a cache of colors.  This job 
-     * is now handled by the ColorRegistry.
-     */
-    public static void disposeColors() {
-        //no-op
-    }
-
-    /**
-     * Set the foreground and background colors of the
-     * control to the specified values. If the values are
-     * null than ignore them. 
-     * @param control the control the foreground and/or background color should be set
-     * 
-     * @param foreground Color the foreground color (maybe <code>null</code>)
-     * @param background Color the background color (maybe <code>null</code>)
-     */
-    public static void setColors(Control control, Color foreground,
-            Color background) {
-        if (foreground != null) {
-			control.setForeground(foreground);
-		}
-        if (background != null) {
-			control.setBackground(background);
-		}
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/JFaceResources.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/JFaceResources.java
deleted file mode 100644
index 6428926..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/JFaceResources.java
+++ /dev/null
@@ -1,596 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import java.net.URL;
-import java.text.MessageFormat;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.PopupDialog;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.jface.internal.JFaceActivator;
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.osgi.framework.Bundle;
-
-/**
- * Utility methods to access JFace-specific resources.
- * <p>
- * All methods declared on this class are static. This class cannot be
- * instantiated.
- * </p>
- * <p>
- * The following global state is also maintained by this class:
- * <ul>
- * <li>a font registry</li>
- * <li>a color registry</li>
- * <li>an image registry</li>
- * <li>a resource bundle</li>
- * </ul>
- * </p>
- * @noinstantiate This class is not intended to be instantiated by clients.
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class JFaceResources {
-
-	/**
-	 * The path to the icons in the resources.
-	 */
-	private final static String ICONS_PATH = "$nl$/icons/full/";//$NON-NLS-1$
-
-	/**
-	 * Map of Display onto DeviceResourceManager. Holds all the resources for
-	 * the associated display.
-	 */
-	private static final Map registries = new HashMap();
-
-	/**
-	 * The symbolic font name for the banner font (value
-	 * <code>"org.eclipse.jface.bannerfont"</code>).
-	 */
-	public static final String BANNER_FONT = "org.eclipse.jface.bannerfont"; //$NON-NLS-1$
-
-	/**
-	 * The JFace resource bundle; eagerly initialized.
-	 */
-	private static final ResourceBundle bundle = ResourceBundle
-			.getBundle("org.eclipse.jface.messages"); //$NON-NLS-1$
-
-	/**
-	 * The JFace color registry; <code>null</code> until lazily initialized or
-	 * explicitly set.
-	 */
-	private static ColorRegistry colorRegistry;
-
-	/**
-	 * The symbolic font name for the standard font (value
-	 * <code>"org.eclipse.jface.defaultfont"</code>).
-	 */
-	public static final String DEFAULT_FONT = "org.eclipse.jface.defaultfont"; //$NON-NLS-1$
-
-	/**
-	 * The symbolic font name for the dialog font (value
-	 * <code>"org.eclipse.jface.dialogfont"</code>).
-	 */
-	public static final String DIALOG_FONT = "org.eclipse.jface.dialogfont"; //$NON-NLS-1$
-
-	/**
-	 * The JFace font registry; <code>null</code> until lazily initialized or
-	 * explicitly set.
-	 */
-	private static FontRegistry fontRegistry = null;
-
-	/**
-	 * The symbolic font name for the header font (value
-	 * <code>"org.eclipse.jface.headerfont"</code>).
-	 */
-	public static final String HEADER_FONT = "org.eclipse.jface.headerfont"; //$NON-NLS-1$
-
-	/**
-	 * The JFace image registry; <code>null</code> until lazily initialized.
-	 */
-	private static ImageRegistry imageRegistry = null;
-
-	/**
-	 * The symbolic font name for the text font (value
-	 * <code>"org.eclipse.jface.textfont"</code>).
-	 */
-	public static final String TEXT_FONT = "org.eclipse.jface.textfont"; //$NON-NLS-1$
-
-	/**
-	 * The symbolic font name for the viewer font (value
-	 * <code>"org.eclipse.jface.viewerfont"</code>).
-	 * 
-	 * @deprecated This font is not in use
-	 */
-	public static final String VIEWER_FONT = "org.eclipse.jface.viewerfont"; //$NON-NLS-1$
-
-	/**
-	 * The symbolic font name for the window font (value
-	 * <code>"org.eclipse.jface.windowfont"</code>).
-	 * 
-	 * @deprecated This font is not in use
-	 */
-	public static final String WINDOW_FONT = "org.eclipse.jface.windowfont"; //$NON-NLS-1$
-
-	/**
-	 * Returns the formatted message for the given key in JFace's resource
-	 * bundle.
-	 * 
-	 * @param key
-	 *            the resource name
-	 * @param args
-	 *            the message arguments
-	 * @return the string
-	 */
-	public static String format(String key, Object[] args) {
-		return MessageFormat.format(getString(key), args);
-	}
-
-	/**
-	 * Returns the JFace's banner font. Convenience method equivalent to
-	 * 
-	 * <pre>
-	 * JFaceResources.getFontRegistry().get(JFaceResources.BANNER_FONT)
-	 * </pre>
-	 * 
-	 * @return the font
-	 */
-	public static Font getBannerFont() {
-		return getFontRegistry().get(BANNER_FONT);
-	}
-
-	/**
-	 * Returns the resource bundle for JFace itself. The resouble bundle is
-	 * obtained from
-	 * <code>ResourceBundle.getBundle("org.eclipse.jface.jface_nls")</code>.
-	 * <p>
-	 * Note that several static convenience methods are also provided on this
-	 * class for directly accessing resources in this bundle.
-	 * </p>
-	 * 
-	 * @return the resource bundle
-	 */
-	public static ResourceBundle getBundle() {
-		return bundle;
-	}
-
-	/**
-	 * Returns the color registry for JFace itself.
-	 * <p>
-	 * 
-	 * @return the <code>ColorRegistry</code>.
-	 * @since 3.0
-	 */
-	public static ColorRegistry getColorRegistry() {
-		if (colorRegistry == null) {
-			colorRegistry = new ColorRegistry();
-			initializeDefaultColors();
-		}
-		return colorRegistry;
-	}
-
-	/**
-	 * Returns the global resource manager for the given display
-	 * 
-	 * @since 3.1
-	 * 
-	 * @param toQuery
-	 *            display to query
-	 * @return the global resource manager for the given display
-	 */
-	public static ResourceManager getResources(final Display toQuery) {
-		ResourceManager reg = (ResourceManager) registries.get(toQuery);
-
-		if (reg == null) {
-			final DeviceResourceManager mgr = new DeviceResourceManager(toQuery);
-			reg = mgr;
-			registries.put(toQuery, reg);
-			toQuery.disposeExec(new Runnable() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see java.lang.Runnable#run()
-				 */
-				public void run() {
-					mgr.dispose();
-					registries.remove(toQuery);
-				}
-			});
-		}
-
-		return reg;
-	}
-
-	/**
-	 * Returns the ResourceManager for the current display. May only be called
-	 * from a UI thread.
-	 * 
-	 * @since 3.1
-	 * 
-	 * @return the global ResourceManager for the current display
-	 */
-	public static ResourceManager getResources() {
-		return getResources(Display.getCurrent());
-	}
-
-	/**
-	 * Returns JFace's standard font. Convenience method equivalent to
-	 * 
-	 * <pre>
-	 * JFaceResources.getFontRegistry().get(JFaceResources.DEFAULT_FONT)
-	 * </pre>
-	 * 
-	 * @return the font
-	 */
-	public static Font getDefaultFont() {
-		return getFontRegistry().defaultFont();
-	}
-
-	/**
-	 * Returns the descriptor for JFace's standard font. Convenience method
-	 * equivalent to
-	 * 
-	 * <pre>
-	 * JFaceResources.getFontRegistry().getDescriptor(JFaceResources.DEFAULT_FONT)
-	 * </pre>
-	 * 
-	 * @return the font
-	 * @since 3.3
-	 */
-	public static FontDescriptor getDefaultFontDescriptor() {
-		return getFontRegistry().defaultFontDescriptor();
-	}
-
-	/**
-	 * Returns the JFace's dialog font. Convenience method equivalent to
-	 * 
-	 * <pre>
-	 * JFaceResources.getFontRegistry().get(JFaceResources.DIALOG_FONT)
-	 * </pre>
-	 * 
-	 * @return the font
-	 */
-	public static Font getDialogFont() {
-		return getFontRegistry().get(DIALOG_FONT);
-	}
-
-	/**
-	 * Returns the descriptor for JFace's dialog font. Convenience method
-	 * equivalent to
-	 * 
-	 * <pre>
-	 * JFaceResources.getFontRegistry().getDescriptor(JFaceResources.DIALOG_FONT)
-	 * </pre>
-	 * 
-	 * @return the font
-	 * @since 3.3
-	 */
-	public static FontDescriptor getDialogFontDescriptor() {
-		return getFontRegistry().getDescriptor(DIALOG_FONT);
-	}
-
-	/**
-	 * Returns the font in JFace's font registry with the given symbolic font
-	 * name. Convenience method equivalent to
-	 * 
-	 * <pre>
-	 * JFaceResources.getFontRegistry().get(symbolicName)
-	 * </pre>
-	 * 
-	 * If an error occurs, return the default font.
-	 * 
-	 * @param symbolicName
-	 *            the symbolic font name
-	 * @return the font
-	 */
-	public static Font getFont(String symbolicName) {
-		return getFontRegistry().get(symbolicName);
-	}
-
-	/**
-	 * Returns the font descriptor for in JFace's font registry with the given
-	 * symbolic name. Convenience method equivalent to
-	 * 
-	 * <pre>
-	 * JFaceResources.getFontRegistry().getDescriptor(symbolicName)
-	 * </pre>
-	 * 
-	 * If an error occurs, return the default font.
-	 * 
-	 * @param symbolicName
-	 *            the symbolic font name
-	 * @return the font descriptor (never null)
-	 * @since 3.3
-	 */
-	public static FontDescriptor getFontDescriptor(String symbolicName) {
-		return getFontRegistry().getDescriptor(symbolicName);
-	}
-
-	/**
-	 * Returns the font registry for JFace itself. If the value has not been
-	 * established by an earlier call to <code>setFontRegistry</code>, is it
-	 * initialized to
-	 * <code>new FontRegistry("org.eclipse.jface.resource.jfacefonts")</code>.
-	 * <p>
-	 * Note that several static convenience methods are also provided on this
-	 * class for directly accessing JFace's standard fonts.
-	 * </p>
-	 * 
-	 * @return the JFace font registry
-	 */
-	public static FontRegistry getFontRegistry() {
-		if (fontRegistry == null) {
-			fontRegistry = new FontRegistry(
-					"org.eclipse.jface.resource.jfacefonts"); //$NON-NLS-1$
-		}
-		return fontRegistry;
-	}
-
-	/**
-	 * Returns the JFace's header font. Convenience method equivalent to
-	 * 
-	 * <pre>
-	 * JFaceResources.getFontRegistry().get(JFaceResources.HEADER_FONT)
-	 * </pre>
-	 * 
-	 * @return the font
-	 */
-	public static Font getHeaderFont() {
-		return getFontRegistry().get(HEADER_FONT);
-	}
-
-	/**
-	 * Returns the descriptor for JFace's header font. Convenience method
-	 * equivalent to
-	 * 
-	 * <pre>
-	 * JFaceResources.getFontRegistry().get(JFaceResources.HEADER_FONT)
-	 * </pre>
-	 * 
-	 * @return the font descriptor (never null)
-	 * @since 3.3
-	 */
-	public static FontDescriptor getHeaderFontDescriptor() {
-		return getFontRegistry().getDescriptor(HEADER_FONT);
-	}
-
-	/**
-	 * Returns the image in JFace's image registry with the given key, or
-	 * <code>null</code> if none. Convenience method equivalent to
-	 * 
-	 * <pre>
-	 * JFaceResources.getImageRegistry().get(key)
-	 * </pre>
-	 * 
-	 * @param key
-	 *            the key
-	 * @return the image, or <code>null</code> if none
-	 */
-	public static Image getImage(String key) {
-		return getImageRegistry().get(key);
-	}
-
-	/**
-	 * Returns the image registry for JFace itself.
-	 * <p>
-	 * Note that the static convenience method <code>getImage</code> is also
-	 * provided on this class.
-	 * </p>
-	 * 
-	 * @return the JFace image registry
-	 */
-	public static ImageRegistry getImageRegistry() {
-		if (imageRegistry == null) {
-			imageRegistry = new ImageRegistry(
-					getResources(Display.getCurrent()));
-			initializeDefaultImages();
-		}
-		return imageRegistry;
-	}
-
-	/**
-	 * Initialize default images in JFace's image registry.
-	 * 
-	 */
-	private static void initializeDefaultImages() {
-
-		Object bundle = null;
-		try {
-			bundle = JFaceActivator.getBundle();
-		} catch (NoClassDefFoundError exception) {
-			// Test to see if OSGI is present
-		}
-		declareImage(bundle, Wizard.DEFAULT_IMAGE, ICONS_PATH + "page.gif", //$NON-NLS-1$
-				Wizard.class, "images/page.gif"); //$NON-NLS-1$
-
-		// register default images for dialogs
-		declareImage(bundle, Dialog.DLG_IMG_MESSAGE_INFO, ICONS_PATH
-				+ "message_info.gif", Dialog.class, "images/message_info.gif"); //$NON-NLS-1$ //$NON-NLS-2$
-		declareImage(bundle, Dialog.DLG_IMG_MESSAGE_WARNING, ICONS_PATH
-				+ "message_warning.gif", Dialog.class, //$NON-NLS-1$
-				"images/message_warning.gif"); //$NON-NLS-1$
-		declareImage(bundle, Dialog.DLG_IMG_MESSAGE_ERROR, ICONS_PATH
-				+ "message_error.gif", Dialog.class, "images/message_error.gif");//$NON-NLS-1$ //$NON-NLS-2$
-		declareImage(bundle, Dialog.DLG_IMG_HELP,
-				ICONS_PATH + "help.gif", Dialog.class, "images/help.gif");//$NON-NLS-1$ //$NON-NLS-2$
-		declareImage(
-				bundle,
-				TitleAreaDialog.DLG_IMG_TITLE_BANNER,
-				ICONS_PATH + "title_banner.png", TitleAreaDialog.class, "images/title_banner.gif");//$NON-NLS-1$ //$NON-NLS-2$
-		declareImage(
-				bundle,
-				PreferenceDialog.PREF_DLG_TITLE_IMG,
-				ICONS_PATH + "pref_dialog_title.gif", PreferenceDialog.class, "images/pref_dialog_title.gif");//$NON-NLS-1$ //$NON-NLS-2$
-		declareImage(bundle, PopupDialog.POPUP_IMG_MENU, ICONS_PATH
-				+ "popup_menu.gif", PopupDialog.class, "images/popup_menu.gif");//$NON-NLS-1$ //$NON-NLS-2$
-		declareImage(
-				bundle,
-				PopupDialog.POPUP_IMG_MENU_DISABLED,
-				ICONS_PATH + "popup_menu_disabled.gif", PopupDialog.class, "images/popup_menu_disabled.gif");//$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Declares a JFace image given the path of the image file (relative to the
-	 * JFace plug-in). This is a helper method that creates the image descriptor
-	 * and passes it to the main <code>declareImage</code> method.
-	 * 
-	 * @param bundle
-	 *            the {@link Bundle} or <code>null</code> of the Bundle cannot
-	 *            be found
-	 * @param key
-	 *            the symbolic name of the image
-	 * @param path
-	 *            the path of the image file relative to the base of the
-	 *            workbench plug-ins install directory
-	 * @param fallback
-	 *            the {@link Class} where the fallback implementation of the
-	 *            image is relative to
-	 * @param fallbackPath
-	 *            the path relative to the fallback {@link Class}
-	 * 
-	 */
-	private static final void declareImage(Object bundle, String key,
-			String path, Class fallback, String fallbackPath) {
-
-		ImageDescriptor descriptor = null;
-
-		if (bundle != null) {
-			URL url = FileLocator.find((Bundle) bundle, new Path(path), null);
-			if (url != null)
-				descriptor = ImageDescriptor.createFromURL(url);
-		}
-
-		// If we failed then load from the backup file
-		if (descriptor == null)
-			descriptor = ImageDescriptor.createFromFile(fallback, fallbackPath);
-
-		imageRegistry.put(key, descriptor);
-	}
-
-	/**
-	 * Returns the resource object with the given key in JFace's resource
-	 * bundle. If there isn't any value under the given key, the key is
-	 * returned.
-	 * 
-	 * @param key
-	 *            the resource name
-	 * @return the string
-	 */
-	public static String getString(String key) {
-		try {
-			return bundle.getString(key);
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns a list of string values corresponding to the given list of keys.
-	 * The lookup is done with <code>getString</code>. The values are in the
-	 * same order as the keys.
-	 * 
-	 * @param keys
-	 *            a list of keys
-	 * @return a list of corresponding string values
-	 */
-	public static String[] getStrings(String[] keys) {
-		Assert.isNotNull(keys);
-		int length = keys.length;
-		String[] result = new String[length];
-		for (int i = 0; i < length; i++) {
-			result[i] = getString(keys[i]);
-		}
-		return result;
-	}
-
-	/**
-	 * Returns JFace's text font. Convenience method equivalent to
-	 * 
-	 * <pre>
-	 * JFaceResources.getFontRegistry().get(JFaceResources.TEXT_FONT)
-	 * </pre>
-	 * 
-	 * @return the font
-	 */
-	public static Font getTextFont() {
-		return getFontRegistry().get(TEXT_FONT);
-	}
-
-	/**
-	 * Returns the descriptor for JFace's text font. Convenience method
-	 * equivalent to
-	 * 
-	 * <pre>
-	 * JFaceResources.getFontRegistry().getDescriptor(JFaceResources.TEXT_FONT)
-	 * </pre>
-	 * 
-	 * @return the font descriptor (never null)
-	 * @since 3.3
-	 */
-	public static FontDescriptor getTextFontDescriptor() {
-		return getFontRegistry().getDescriptor(TEXT_FONT);
-	}
-
-	/**
-	 * Returns JFace's viewer font. Convenience method equivalent to
-	 * 
-	 * <pre>
-	 * JFaceResources.getFontRegistry().get(JFaceResources.VIEWER_FONT)
-	 * </pre>
-	 * 
-	 * @return the font
-	 * @deprecated This font is not in use
-	 */
-	public static Font getViewerFont() {
-		return getFontRegistry().get(VIEWER_FONT);
-	}
-
-	/**
-	 * Sets JFace's font registry to the given value. This method may only be
-	 * called once; the call must occur before
-	 * <code>JFaceResources.getFontRegistry</code> is invoked (either directly
-	 * or indirectly).
-	 * 
-	 * @param registry
-	 *            a font registry
-	 */
-	public static void setFontRegistry(FontRegistry registry) {
-		Assert.isTrue(fontRegistry == null,
-				"Font registry can only be set once."); //$NON-NLS-1$
-		fontRegistry = registry;
-	}
-
-	/*
-	 * (non-Javadoc) Declare a private constructor to block instantiation.
-	 */
-	private JFaceResources() {
-		// no-op
-	}
-
-	/*
-	 * Initialize any JFace colors that may not be initialized via a client.
-	 */
-	private static void initializeDefaultColors() {
-		// JFace Colors that may not be defined in a workbench theme should be
-		// defined here.
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/LocalResourceManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/LocalResourceManager.java
deleted file mode 100644
index 757ae58..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/LocalResourceManager.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Control;
-
-
-/**
- * A local registry that shares its resources with some global registry.
- * LocalResourceManager is typically used to safeguard against leaks. Clients
- * can use a nested registry to allocate and deallocate resources in the
- * global registry. Calling dispose() on the nested registry will deallocate
- * everything allocated for the nested registry without affecting the rest
- * of the global registry.
- * <p>
- * A nested registry can be used to manage the resources for, say, a dialog
- * box.
- * </p>
- * @since 3.1
- */
-public final class LocalResourceManager extends AbstractResourceManager {
-
-    private ResourceManager parentRegistry;
-    
-    /**
-     * Creates a local registry that delegates to the given global registry
-     * for all resource allocation and deallocation. 
-     * 
-     * @param parentRegistry global registry 
-     */
-    public LocalResourceManager(ResourceManager parentRegistry) {
-        this.parentRegistry = parentRegistry;
-    }
-    
-    /**
-     * Creates a local registry that wraps the given global registry. Anything
-     * allocated by this registry will be automatically cleaned up with the given
-     * control is disposed. Note that registries created in this way should not
-     * be used to allocate any resource that must outlive the given control.
-     * 
-     * @param parentRegistry global registry that handles resource allocation
-     * @param owner control whose disposal will trigger cleanup of everything 
-     * in the registry.
-     */
-    public LocalResourceManager(ResourceManager parentRegistry, Control owner) {
-        this(parentRegistry);
-        
-        owner.addDisposeListener(new DisposeListener() {
-	        /* (non-Javadoc)
-	         * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
-	         */
-	        public void widgetDisposed(DisposeEvent e) {
-	            LocalResourceManager.this.dispose();
-	        } 
-        });
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.ResourceManager#getDevice()
-     */
-    public Device getDevice() {
-        return parentRegistry.getDevice();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.AbstractResourceManager#allocate(org.eclipse.jface.resource.DeviceResourceDescriptor)
-     */
-    protected Object allocate(DeviceResourceDescriptor descriptor)
-            throws DeviceResourceException {
-        return parentRegistry.create(descriptor);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.AbstractResourceManager#deallocate(java.lang.Object, org.eclipse.jface.resource.DeviceResourceDescriptor)
-     */
-    protected void deallocate(Object resource,
-            DeviceResourceDescriptor descriptor) {
-        
-        parentRegistry.destroy(descriptor);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.ResourceManager#getDefaultImage()
-     */
-    protected Image getDefaultImage() {
-        return parentRegistry.getDefaultImage();
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/MissingImageDescriptor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/MissingImageDescriptor.java
deleted file mode 100644
index 84f5977..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/MissingImageDescriptor.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import org.eclipse.swt.graphics.ImageData;
-
-/**
- * The image descriptor for a missing image.
- * <p>
- * Use <code>MissingImageDescriptor.getInstance</code> to
- * access the singleton instance maintained in an
- * internal state variable. 
- * </p>
- */
-class MissingImageDescriptor extends ImageDescriptor {
-    private static MissingImageDescriptor instance;
-
-    /**
-     * Constructs a new missing image descriptor.
-     */
-    private MissingImageDescriptor() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ImageDesciptor.
-     */
-    public ImageData getImageData() {
-        return DEFAULT_IMAGE_DATA;
-    }
-
-    /**
-     * Returns the shared missing image descriptor instance.
-     *
-     * @return the image descriptor for a missing image
-     */
-    static MissingImageDescriptor getInstance() {
-        if (instance == null) {
-            instance = new MissingImageDescriptor();
-        }
-        return instance;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/RGBColorDescriptor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/RGBColorDescriptor.java
deleted file mode 100644
index a96b20a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/RGBColorDescriptor.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * Describes a color by its RGB values.
- * 
- * @since 3.1
- */
-class RGBColorDescriptor extends ColorDescriptor {
-
-    private RGB color;
-    
-    /**
-     * Color being copied, or null if none
-     */
-    private Color originalColor = null;
-    
-    /**
-     * Creates a new RGBColorDescriptor given some RGB values
-     * 
-     * @param color RGB values (not null)
-     */
-    public RGBColorDescriptor(RGB color) {
-        this.color = color;
-    }
-    
-	/**
-     * Creates a new RGBColorDescriptor that describes an existing color. 
-     * 
-     * @since 3.1
-     *
-     * @param originalColor a color to describe
-     */
-    public RGBColorDescriptor(Color originalColor) {
-        this(originalColor.getRGB());
-        this.originalColor = originalColor;
-    }
-    
-    /* (non-Javadoc)
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    public boolean equals(Object obj) {
-        if (obj instanceof RGBColorDescriptor) {
-            RGBColorDescriptor other = (RGBColorDescriptor) obj;
-            
-            return other.color.equals(color) && other.originalColor == originalColor;
-        }
-        
-        return false;
-    }
-    
-    /* (non-Javadoc)
-     * @see java.lang.Object#hashCode()
-     */
-    public int hashCode() {
-        return color.hashCode();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resources.ColorDescriptor#createColor()
-     */
-    public Color createColor(Device device) {
-        // If this descriptor is wrapping an existing color, then we can return the original color
-        // if this is the same device.
-        if (originalColor != null) {
-            // If we're allocating on the same device as the original color, return the original.
-            if (originalColor.getDevice() == device) {
-                return originalColor;
-            }            
-        }
-        
-        return new Color(device, color);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.ColorDescriptor#destroyColor(org.eclipse.swt.graphics.Color)
-     */
-    public void destroyColor(Color toDestroy) {
-        if (toDestroy == originalColor) {
-            return;
-        }
-        
-        toDestroy.dispose();
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ResourceManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ResourceManager.java
deleted file mode 100644
index 14df30f..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ResourceManager.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * This class manages SWT resources. It manages reference-counted instances of resources
- * such as Fonts, Images, and Colors, and allows them to be accessed using descriptors.
- * Everything allocated through the registry should also be disposed through the registry.
- * Since the resources are shared and reference counted, they should never be disposed
- * directly.
- * <p>
- * ResourceManager handles correct allocation and disposal of resources. It differs from 
- * the various JFace *Registry classes, which also map symbolic IDs onto resources. In 
- * general, you should use a *Registry class to map IDs onto descriptors, and use a 
- * ResourceManager to convert the descriptors into real Images/Fonts/etc.
- * </p>
- * 
- * @since 3.1
- */
-public abstract class ResourceManager {
-    
-	/**
-	 * List of Runnables scheduled to run when the ResourceManager is disposed.
-	 * null if empty.
-	 */
-    private List disposeExecs = null;
-    
-    /**
-     * Returns the Device for which this ResourceManager will create resources 
-     * 
-     * @since 3.1
-     *
-     * @return the Device associated with this ResourceManager
-     */
-    public abstract Device getDevice();
-    
-    /**
-     * Returns the resource described by the given descriptor. If the resource already
-     * exists, the reference count is incremented and the exiting resource is returned.
-     * Otherwise, a new resource is allocated. Every call to this method should have
-     * a corresponding call to {@link #destroy(DeviceResourceDescriptor)}.
-     * 
-     * <p>If the resource is intended to live for entire lifetime of the resource manager, 
-     * a subsequent call to {@link #destroy(DeviceResourceDescriptor)} may be omitted and the
-     * resource will be cleaned up when the resource manager is disposed. This pattern
-     * is useful for short-lived {@link LocalResourceManager}s, but should never be used 
-     * with the global resource manager since doing so effectively leaks the resource.</p>
-     * 
-     * <p>The resources returned from this method are reference counted and may be shared 
-     * internally with other resource managers. They should never be disposed outside of the 
-     * ResourceManager framework, or it will cause exceptions in other code that shares
-     * them. For example, never call {@link org.eclipse.swt.graphics.Resource#dispose()} 
-     * on anything returned from this method.</p>
-     * 
-     * <p>Callers may safely downcast the result to the resource type associated with 
-     * the descriptor. For example, when given an ImageDescriptor, the return
-     * value of this method will always be an Image.</p>
-     * 
-     * @since 3.1 
-     *
-     * @param descriptor descriptor for the resource to allocate
-     * @return the newly allocated resource (not null)
-     * @throws DeviceResourceException if unable to allocate the resource
-     */
-    public abstract Object create(DeviceResourceDescriptor descriptor);
-    
-    /**
-     * Deallocates a resource previously allocated by {@link #create(DeviceResourceDescriptor)}. 
-     * Descriptors are compared by equality, not identity. If the same resource was 
-     * created multiple times, this may decrement a reference count rather than 
-     * disposing the actual resource.  
-     * 
-     * @since 3.1 
-     *
-     * @param descriptor identifier for the resource
-     */
-    public abstract void destroy(DeviceResourceDescriptor descriptor);
-    
-    /**
-     * <p>Returns a previously-allocated resource or allocates a new one if none
-     * exists yet. The resource will remain allocated for at least the lifetime
-     * of this resource manager. If necessary, the resource will be deallocated 
-     * automatically when the resource manager is disposed.</p>
-     * 
-     * <p>The resources returned from this method are reference counted and may be shared 
-     * internally with other resource managers. They should never be disposed outside of the 
-     * ResourceManager framework, or it will cause exceptions in other code that shares
-     * them. For example, never call {@link org.eclipse.swt.graphics.Resource#dispose()} 
-     * on anything returned from this method.</p>
-     * 
-     * <p>
-     * Callers may safely downcast the result to the resource type associated with 
-     * the descriptor. For example, when given an ImageDescriptor, the return
-     * value of this method may be downcast to Image.
-     * </p>
-     * 
-     * <p>
-     * This method should only be used for resources that should remain
-     * allocated for the lifetime of the resource manager. To allocate shorter-lived
-     * resources, manage them with <code>create</code>, and <code>destroy</code>
-     * rather than this method.
-     * </p>
-     * 
-     * <p>
-     * This method should never be called on the global resource manager,
-     * since all resources will remain allocated for the lifetime of the app and
-     * will be effectively leaked.
-     * </p>
-     * 
-     * @param descriptor identifier for the requested resource
-     * @return the requested resource. Never null.
-     * @throws DeviceResourceException if the resource does not exist yet and cannot
-     * be created for any reason.
-     * 
-     * @since 3.3
-     */
-    public final Object get(DeviceResourceDescriptor descriptor) {
-    	Object result = find(descriptor);
-    	
-    	if (result == null) {
-    		result = create(descriptor);
-    	}
-    	
-    	return result;
-    }
-    
-    /**
-     * <p>Creates an image, given an image descriptor. Images allocated in this manner must
-     * be disposed by {@link #destroyImage(ImageDescriptor)}, and never by calling 
-     * {@link Image#dispose()}.</p>
-     * 
-     * <p>
-     * If the image is intended to remain allocated for the lifetime of the ResourceManager,
-     * the call to destroyImage may be omitted and the image will be cleaned up automatically
-     * when the ResourceManager is disposed. This should only be done with short-lived ResourceManagers,
-     * as doing so with the global manager effectively leaks the resource.
-     * </p>
-     * 
-     * @since 3.1 
-     *
-     * @param descriptor descriptor for the image to create
-     * @return the Image described by this descriptor (possibly shared by other equivalent
-     * ImageDescriptors)
-     * @throws DeviceResourceException if unable to allocate the Image
-     */
-    public final Image createImage(ImageDescriptor descriptor) {
-    	// Assertion added to help diagnose client bugs.  See bug #83711 and bug #90454.
-    	Assert.isNotNull(descriptor);
-    	
-        return (Image)create(descriptor);
-    }
-    
-    /**
-     * Creates an image, given an image descriptor. Images allocated in this manner must
-     * be disposed by {@link #destroyImage(ImageDescriptor)}, and never by calling 
-     * {@link Image#dispose()}.
-     * 
-     * @since 3.1 
-     *
-     * @param descriptor descriptor for the image to create
-     * @return the Image described by this descriptor (possibly shared by other equivalent
-     * ImageDescriptors)
-     */
-    public final Image createImageWithDefault(ImageDescriptor descriptor) {
-        if (descriptor == null) {
-        	return getDefaultImage();
-        }
-        
-        try {
-			return (Image) create(descriptor);
-		} catch (DeviceResourceException e) {
-			Policy.getLog().log(
-					new Status(IStatus.WARNING, "org.eclipse.jface", 0, //$NON-NLS-1$
-							"The image could not be loaded: " + descriptor, //$NON-NLS-1$
-							e));
-			return getDefaultImage();
-		} catch (SWTException e) {
-			Policy.getLog().log(
-					new Status(IStatus.WARNING, "org.eclipse.jface", 0, //$NON-NLS-1$
-							"The image could not be loaded: " + descriptor, //$NON-NLS-1$
-							e));
-			return getDefaultImage();
-		}
-    }
-    
-    /**
-     * Returns the default image that will be returned in the event that the intended
-     * image is missing.
-     * 
-     * @since 3.1
-     *
-     * @return a default image that will be returned in the event that the intended
-     * image is missing.
-     */
-    protected abstract Image getDefaultImage();
-
-    /**
-     * Undoes everything that was done by {@link #createImage(ImageDescriptor)}.
-     * 
-     * @since 3.1 
-     *
-     * @param descriptor identifier for the image to dispose
-     */
-    public final void destroyImage(ImageDescriptor descriptor) {
-        destroy(descriptor);
-    }
-
-    /**
-     * Allocates a color, given a color descriptor. Any color allocated in this
-     * manner must be disposed by calling {@link #destroyColor(ColorDescriptor)}, 
-     * or by an eventual call to {@link #dispose()}. {@link Color#dispose()} must
-     * never been called directly on the returned color.
-     * 
-     * @since 3.1 
-     *
-     * @param descriptor descriptor for the color to create
-     * @return the Color described by the given ColorDescriptor (not null)
-     * @throws DeviceResourceException if unable to create the color
-     */
-    public final Color createColor(ColorDescriptor descriptor) {
-        return (Color)create(descriptor);
-    }
-
-    /**
-     * Allocates a color, given its RGB value. Any color allocated in this
-     * manner must be disposed by calling {@link #destroyColor(RGB)}, 
-     * or by an eventual call to {@link #dispose()}. {@link Color#dispose()} must
-     * never been called directly on the returned color.
-     * 
-     * @since 3.1 
-     *
-     * @param descriptor descriptor for the color to create
-     * @return the Color described by the given ColorDescriptor (not null)
-     * @throws DeviceResourceException if unable to create the color
-     */
-    public final Color createColor(RGB descriptor) {
-        return createColor(new RGBColorDescriptor(descriptor));
-    }
-    
-    /**
-     * Undoes everything that was done by a call to {@link #createColor(RGB)}.
-     * 
-     * @since 3.1 
-     *
-     * @param descriptor RGB value of the color to dispose
-     */
-    public final void destroyColor(RGB descriptor) {
-        destroyColor(new RGBColorDescriptor(descriptor));
-    }
-
-    /**
-     * Undoes everything that was done by a call to {@link #createColor(ColorDescriptor)}.
-     * 
-     * 
-     * @since 3.1 
-     *
-     * @param descriptor identifier for the color to dispose
-     */
-    public final void destroyColor(ColorDescriptor descriptor) {
-        destroy(descriptor);
-    }
-    
-    /**
-     * Returns the Font described by the given FontDescriptor. Any Font
-     * allocated in this manner must be deallocated by calling disposeFont(...),
-     * or by an eventual call to {@link #dispose()}.  The method {@link Font#dispose()}
-     * must never be called directly on the returned font.
-     * 
-     * @since 3.1 
-     *
-     * @param descriptor description of the font to create
-     * @return the Font described by the given descriptor
-     * @throws DeviceResourceException if unable to create the font
-     */
-    public final Font createFont(FontDescriptor descriptor) {
-        return (Font)create(descriptor);
-    }
-    
-    /**
-     * Undoes everything that was done by a previous call to {@link #createFont(FontDescriptor)}.
-     * 
-     * @since 3.1 
-     *
-     * @param descriptor description of the font to destroy
-     */
-    public final void destroyFont(FontDescriptor descriptor) {
-        destroy(descriptor);
-    }
-    
-    /**
-     * Disposes any remaining resources allocated by this manager. 
-     */
-    public void dispose() {
-        if (disposeExecs == null) {
-            return;
-        }
-        
-        // If one of the runnables throws an exception, we need to propagate it.
-        // However, this should not prevent the remaining runnables from being 
-        // notified. If any runnables throw an exception, we remember one of them
-        // here and throw it at the end of the method.
-        RuntimeException foundException = null;
-        
-        Runnable[] execs = (Runnable[]) disposeExecs.toArray(new Runnable[disposeExecs.size()]);
-        for (int i = 0; i < execs.length; i++) {
-            Runnable exec = execs[i];            
-            
-            try {
-                exec.run();
-            } catch (RuntimeException e) {
-                // Ensure that we propagate an exception, but don't stop notifying
-                // the remaining runnables.
-                foundException = e;
-            }
-        }
-        
-        if (foundException != null) {
-            // If any runnables threw an exception, propagate one of them.
-            throw foundException;
-        }
-    }
-    
-    /**
-     * Returns a previously allocated resource associated with the given descriptor, or
-     * null if none exists yet. 
-     * 
-     * @since 3.1
-     *
-     * @param descriptor descriptor to find
-     * @return a previously allocated resource for the given descriptor or null if none.
-     */
-    public abstract Object find(DeviceResourceDescriptor descriptor);
-    
-    /**
-     * Causes the <code>run()</code> method of the runnable to
-     * be invoked just before the receiver is disposed. The runnable
-     * can be subsequently canceled by a call to <code>cancelDisposeExec</code>.
-     * 
-     * @param r runnable to execute.
-     */
-    public void disposeExec(Runnable r) {
-        Assert.isNotNull(r);
-        
-        if (disposeExecs == null) {
-            disposeExecs = new ArrayList();
-        }
-        
-        disposeExecs.add(r);
-    }
-    
-    /**
-     * Cancels a runnable that was previously scheduled with <code>disposeExec</code>.
-     * Has no effect if the given runnable was not previously registered with
-     * disposeExec.
-     * 
-     * @param r runnable to cancel
-     */
-    public void cancelDisposeExec(Runnable r) {
-        Assert.isNotNull(r);
-        
-        if (disposeExecs == null) {
-            return;
-        }
-        
-        disposeExecs.remove(r);
-        
-        if (disposeExecs.isEmpty()) {
-            disposeExecs = null;
-        }
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ResourceRegistry.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ResourceRegistry.java
deleted file mode 100644
index 82184b8..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/ResourceRegistry.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import java.util.Set;
-
-import org.eclipse.core.commands.common.EventManager;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * Abstract base class for various JFace registries.
- * 
- * @since 3.0
- */
-public abstract class ResourceRegistry extends EventManager {
-
-    /**
-     * Adds a property change listener to this registry.
-     * 
-     * @param listener a property change listener
-     */
-    public void addListener(IPropertyChangeListener listener) {
-        addListenerObject(listener);
-    }
-
-    /**
-     * Disposes all currently allocated resources.
-     */
-    protected abstract void clearCaches();
-
-    /** 
-     * @return the set of keys this manager knows about.  This collection 
-     * should be immutable.
-     */
-    public abstract Set getKeySet();
-
-    /**
-     * Return whether or not the receiver has a value for the supplied key.
-     * 
-     * @param key the key
-     * @return <code>true</code> if there is a value for this key
-     */
-    public abstract boolean hasValueFor(String key);
-
-    /**
-     * Fires a <code>PropertyChangeEvent</code>.
-     * 
-     * @param name the name of the symbolic value that is changing.
-     * @param oldValue the old value.
-     * @param newValue the new value.
-     */
-    protected void fireMappingChanged(String name, Object oldValue,
-            Object newValue) {
-        final Object[] myListeners = getListeners();
-        if (myListeners.length > 0) {
-            PropertyChangeEvent event = new PropertyChangeEvent(this, name,
-                    oldValue, newValue);
-            for (int i = 0; i < myListeners.length; ++i) {
-                try {
-                    ((IPropertyChangeListener) myListeners[i])
-                            .propertyChange(event);
-                } catch (Exception e) {
-                    // TODO: how to log?
-                }
-            }
-        }
-    }
-
-    /**
-     * Removes the given listener from this registry. Has no affect if the
-     * listener is not registered.
-     * 
-     * @param listener a property change listener
-     */
-    public void removeListener(IPropertyChangeListener listener) {
-        removeListenerObject(listener);
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/StringConverter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/StringConverter.java
deleted file mode 100644
index 35ab2fb..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/StringConverter.java
+++ /dev/null
@@ -1,887 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import java.util.ArrayList;
-import java.util.NoSuchElementException;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.Rectangle;
-
-/**
- * Helper class for converting various data types to and from
- * strings. Supported types include:
- * <ul>
- *   <li><code>boolean</code></li>
- *   <li><code>int</code></li>
- *   <li><code>long</code></li>
- *   <li><code>float</code></li>
- *   <li><code>double</code></li>
- *   <li><code>org.eclipse.swt.graphics.Point</code></li>
- *   <li><code>org.eclipse.swt.graphics.Rectangle</code></li>
- *   <li><code>org.eclipse.swt.graphics.RGB</code></li>
- *   <li><code>org.eclipse.swt.graphics.FontData</code></li>
- * </ul>
- * <p>
- * All methods declared on this class are static. This
- * class cannot be instantiated.
- * </p>
- * @noinstantiate This class is not intended to be instantiated by clients.
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class StringConverter {
-
-    /**
-     * Internal font style constant for regular fonts.
-     */
-    private static final String REGULAR = "regular"; //$NON-NLS-1$
-
-    /**
-     * Internal font style constant for bold fonts.
-     */
-    private static final String BOLD = "bold"; //$NON-NLS-1$
-
-    /**
-     * Internal font style constant for italic fonts.
-     */
-    private static final String ITALIC = "italic"; //$NON-NLS-1$
-
-    /**
-     * Internal font style constant for bold italic fonts.
-     */
-    private static final String BOLD_ITALIC = "bold italic"; //$NON-NLS-1$
-
-    /**
-     * Internal constant for the separator character used in
-     * font specifications.
-     */
-    private static final char SEPARATOR = '-';
-
-    /**
-     * Internal constant for the seperator character used in font list
-     * specifications.
-     */
-    private static final String FONT_SEPARATOR = ";"; //$NON-NLS-1$
-
-    /* (non-Javadoc)
-     * Declare a private constructor to block instantiation.
-     */
-    private StringConverter() {
-        //no-op
-    }
-
-    /**
-     * Breaks out space-separated words into an array of words.
-     * For example: <code>"no comment"</code> into an array 
-     * <code>a[0]="no"</code> and <code>a[1]= "comment"</code>.
-     *
-     * @param value the string to be converted
-     * @return the list of words
-     * @throws DataFormatException thrown if request string could not seperated
-     */
-    public static String[] asArray(String value) throws DataFormatException {
-        ArrayList list = new ArrayList();
-        StringTokenizer stok = new StringTokenizer(value);
-        while (stok.hasMoreTokens()) {
-            list.add(stok.nextToken());
-        }
-        String result[] = new String[list.size()];
-        list.toArray(result);
-        return result;
-    }
-
-    /**
-     /**
-     * Breaks out space-separated words into an array of words.
-     * For example: <code>"no comment"</code> into an array 
-     * <code>a[0]="no"</code> and <code>a[1]= "comment"</code>.
-     * Returns the given default value if the value cannot be parsed.
-     *
-     * @param value the string to be converted
-     * @param dflt the default value
-     * @return the list of words, or the default value
-     */
-    public static String[] asArray(String value, String[] dflt) {
-        try {
-            return asArray(value);
-        } catch (DataFormatException e) {
-            return dflt;
-        }
-    }
-
-    /**
-     * Converts the given value into a boolean.
-     * This method fails if the value does not represent a boolean.
-     * <p>
-     * Valid representations of <code>true</code> include the strings
-     * "<code>t</code>", "<code>true</code>", or equivalent in mixed
-     * or upper case.
-     * Similarly, valid representations of <code>false</code> include the strings
-     * "<code>f</code>", "<code>false</code>", or equivalent in mixed
-     * or upper case. 
-     * </p>
-     *
-     * @param value the value to be converted
-     * @return the value as a boolean
-     * @exception DataFormatException if the given value does not represent
-     *	a boolean
-     */
-    public static boolean asBoolean(String value) throws DataFormatException {
-        String v = value.toLowerCase();
-        if (v.equals("t") || v.equals("true")) { //$NON-NLS-1$ //$NON-NLS-2$
-			return true;
-		}
-        if (value.equals("f") || v.equals("false")) { //$NON-NLS-1$ //$NON-NLS-2$
-			return false;
-		}
-        throw new DataFormatException(
-                "Value " + value + "doesn't represent a boolean"); //$NON-NLS-2$//$NON-NLS-1$
-    }
-
-    /**
-     * Converts the given value into a boolean.
-     * Returns the given default value if the 
-     * value does not represent a boolean.
-     *
-     * @param value the value to be converted
-     * @param dflt the default value
-     * @return the value as a boolean, or the default value
-     */
-    public static boolean asBoolean(String value, boolean dflt) {
-        try {
-            return asBoolean(value);
-        } catch (DataFormatException e) {
-            return dflt;
-        }
-    }
-
-    /**
-     * Converts the given value into a double.
-     * This method fails if the value does not represent a double.
-     *
-     * @param value the value to be converted
-     * @return the value as a double
-     * @exception DataFormatException if the given value does not represent
-     *	a double
-     */
-    public static double asDouble(String value) throws DataFormatException {
-        try {
-            return (Double.valueOf(value)).doubleValue();
-        } catch (NumberFormatException e) {
-            throw new DataFormatException(e.getMessage());
-        }
-    }
-
-    /**
-     * Converts the given value into a double.
-     * Returns the given default value if the 
-     * value does not represent a double.
-     *
-     * @param value the value to be converted
-     * @param dflt the default value
-     * @return the value as a double, or the default value
-     */
-    public static double asDouble(String value, double dflt) {
-        try {
-            return asDouble(value);
-        } catch (DataFormatException e) {
-            return dflt;
-        }
-    }
-
-    /**
-     * Converts the given value into a float.
-     * This method fails if the value does not represent a float.
-     *
-     * @param value the value to be converted
-     * @return the value as a float
-     * @exception DataFormatException if the given value does not represent
-     *	a float
-     */
-    public static float asFloat(String value) throws DataFormatException {
-        try {
-            return (Float.valueOf(value)).floatValue();
-        } catch (NumberFormatException e) {
-            throw new DataFormatException(e.getMessage());
-        }
-    }
-
-    /**
-     * Converts the given value into a float.
-     * Returns the given default value if the 
-     * value does not represent a float.
-     *
-     * @param value the value to be converted
-     * @param dflt the default value
-     * @return the value as a float, or the default value
-     */
-    public static float asFloat(String value, float dflt) {
-        try {
-            return asFloat(value);
-        } catch (DataFormatException e) {
-            return dflt;
-        }
-    }
-
-    /**
-     * Converts the given value into an SWT font data object.
-     * This method fails if the value does not represent font data.
-     * <p>
-     * A valid font data representation is a string of the form
-     * <code><it>fontname</it>-<it>style</it>-<it>height</it></code> where
-     * <code><it>fontname</it></code> is the name of a font,
-     * <code><it>style</it></code> is a font style (one of
-     * <code>"regular"</code>, <code>"bold"</code>,
-     * <code>"italic"</code>, or <code>"bold italic"</code>)
-     * and <code><it>height</it></code> is an integer representing the
-     * font height. Example: <code>Times New Roman-bold-36</code>.
-     * </p>
-     *
-     * @param value the value to be converted
-     * @return the value as font data
-     * @exception DataFormatException if the given value does not represent
-     *	font data
-     */
-    public static FontData asFontData(String value) throws DataFormatException {
-        if (value == null) {
-			throw new DataFormatException(
-                    "Null doesn't represent a valid font data"); //$NON-NLS-1$
-		}
-        String name = null;
-        int height = 0;
-        int style = 0;
-        try {
-            int length = value.length();
-            int heightIndex = value.lastIndexOf(SEPARATOR);
-            if (heightIndex == -1) {
-				throw new DataFormatException(
-                        "No correct font data format \"" + value + "\""); //$NON-NLS-2$//$NON-NLS-1$
-			}
-            height = StringConverter.asInt(value.substring(heightIndex + 1,
-                    length));
-            int faceIndex = value.lastIndexOf(SEPARATOR, heightIndex - 1);
-            if (faceIndex == -1) {
-				throw new DataFormatException(
-                        "No correct font data format \"" + value + "\""); //$NON-NLS-2$//$NON-NLS-1$
-			}
-            String s = value.substring(faceIndex + 1, heightIndex);
-            if (BOLD_ITALIC.equals(s)) {
-                style = SWT.BOLD | SWT.ITALIC;
-            } else if (BOLD.equals(s)) {
-                style = SWT.BOLD;
-            } else if (ITALIC.equals(s)) {
-                style = SWT.ITALIC;
-            } else if (REGULAR.equals(s)) {
-                style = SWT.NORMAL;
-            } else {
-                throw new DataFormatException("Unknown face name \"" + s + "\""); //$NON-NLS-2$//$NON-NLS-1$
-            }
-            name = value.substring(0, faceIndex);
-        } catch (NoSuchElementException e) {
-            throw new DataFormatException(e.getMessage());
-        }
-        return new FontData(name, height, style);
-    }
-
-	/**
-	 * Returns the result of converting a list of comma-separated tokens into an array
-	 * 
-	 * @return the array of string tokens
-	 * @param prop the initial comma-separated string
-	 */
-	private static String[] getArrayFromList(String prop, String separator) {
-		if (prop == null || prop.trim().equals("")) { //$NON-NLS-1$
-			return new String[0];
-		}
-		ArrayList list = new ArrayList();
-		StringTokenizer tokens = new StringTokenizer(prop, separator); 
-		while (tokens.hasMoreTokens()) {
-			String token = tokens.nextToken().trim();
-			if (!token.equals("")) { //$NON-NLS-1$
-				list.add(token);
-			}
-		}
-		return list.isEmpty() ? new String[0] : (String[]) list.toArray(new String[list.size()]);
-	}
-
-    /**
-     * Convert the given value into an array of SWT font data objects.
-     * 
-     * @param value the font list string 
-     * @return the value as a font list
-     * @since 3.0
-     */
-    public static FontData[] asFontDataArray(String value) {
-        String[] strings = getArrayFromList(value, FONT_SEPARATOR);
-        ArrayList data = new ArrayList(strings.length);
-        for (int i = 0; i < strings.length; i++) {
-            try {
-                data.add(StringConverter.asFontData(strings[i]));
-            } catch (DataFormatException e) {
-                //do-nothing
-            }
-        }
-        return (FontData[]) data.toArray(new FontData[data.size()]);
-    }
-
-    /**
-     * Converts the given value into an SWT font data object.
-     * Returns the given default value if the 
-     * value does not represent a font data object.
-     *
-     * @param value the value to be converted
-     * @param dflt the default value
-     * @return the value as a font data object, or the default value
-     */
-    public static FontData asFontData(String value, FontData dflt) {
-        try {
-            return asFontData(value);
-        } catch (DataFormatException e) {
-            return dflt;
-        }
-    }
-
-    /**
-     * Converts the given value into an int.
-     * This method fails if the value does not represent an int.
-     *
-     * @param value the value to be converted
-     * @return the value as an int
-     * @exception DataFormatException if the given value does not represent
-     *	an int
-     */
-    public static int asInt(String value) throws DataFormatException {
-        try {
-            return Integer.parseInt(value);
-        } catch (NumberFormatException e) {
-            throw new DataFormatException(e.getMessage());
-        }
-    }
-
-    /**
-     * Converts the given value into an int.
-     * Returns the given default value if the 
-     * value does not represent an int.
-     *
-     * @param value the value to be converted
-     * @param dflt the default value
-     * @return the value as an int, or the default value
-     */
-    public static int asInt(String value, int dflt) {
-        try {
-            return asInt(value);
-        } catch (DataFormatException e) {
-            return dflt;
-        }
-    }
-
-    /**
-     * Converts the given value into a long.
-     * This method fails if the value does not represent a long.
-     *
-     * @param value the value to be converted
-     * @return the value as a long
-     * @exception DataFormatException if the given value does not represent
-     *	a long
-     */
-    public static long asLong(String value) throws DataFormatException {
-        try {
-            return Long.parseLong(value);
-        } catch (NumberFormatException e) {
-            throw new DataFormatException(e.getMessage());
-        }
-    }
-
-    /**
-     * Converts the given value into a long.
-     * Returns the given default value if the 
-     * value does not represent a long.
-     *
-     * @param value the value to be converted
-     * @param dflt the default value
-     * @return the value as a long, or the default value
-     */
-    public static long asLong(String value, long dflt) {
-        try {
-            return asLong(value);
-        } catch (DataFormatException e) {
-            return dflt;
-        }
-    }
-
-    /**
-     * Converts the given value into an SWT point.
-     * This method fails if the value does not represent a point.
-     * <p>
-     * A valid point representation is a string of the form
-     * <code><it>x</it>,<it>y</it></code> where
-     * <code><it>x</it></code> and <code><it>y</it></code>
-     * are valid ints.
-     * </p>
-     *
-     * @param value the value to be converted
-     * @return the value as a point
-     * @exception DataFormatException if the given value does not represent
-     *	a point
-     */
-    public static Point asPoint(String value) throws DataFormatException {
-        if (value == null) {
-			throw new DataFormatException(
-                    "Null doesn't represent a valid point"); //$NON-NLS-1$
-		}
-        StringTokenizer stok = new StringTokenizer(value, ","); //$NON-NLS-1$
-        String x = stok.nextToken();
-        String y = stok.nextToken();
-        int xval = 0, yval = 0;
-        try {
-            xval = Integer.parseInt(x);
-            yval = Integer.parseInt(y);
-        } catch (NumberFormatException e) {
-            throw new DataFormatException(e.getMessage());
-        }
-        return new Point(xval, yval);
-    }
-
-    /**
-     * Converts the given value into an SWT point.
-     * Returns the given default value if the 
-     * value does not represent a point.
-     *
-     * @param value the value to be converted
-     * @param dflt the default value
-     * @return the value as a point, or the default value
-     */
-    public static Point asPoint(String value, Point dflt) {
-        try {
-            return asPoint(value);
-        } catch (DataFormatException e) {
-            return dflt;
-        }
-    }
-
-    /**
-     * Converts the given value into an SWT rectangle.
-     * This method fails if the value does not represent a rectangle.
-     * <p>
-     * A valid rectangle representation is a string of the form
-     * <code><it>x</it>,<it>y</it>,<it>width</it>,<it>height</it></code>
-     * where <code><it>x</it></code>, <code><it>y</it></code>,
-     * <code><it>width</it></code>, and <code><it>height</it></code>
-     * are valid ints.
-     * </p>
-     *
-     * @param value the value to be converted
-     * @return the value as a rectangle
-     * @exception DataFormatException if the given value does not represent
-     *	a rectangle
-     */
-    public static Rectangle asRectangle(String value)
-            throws DataFormatException {
-        if (value == null) {
-			throw new DataFormatException(
-                    "Null doesn't represent a valid rectangle"); //$NON-NLS-1$
-		}
-        StringTokenizer stok = new StringTokenizer(value, ","); //$NON-NLS-1$
-        String x = stok.nextToken();
-        String y = stok.nextToken();
-        String width = stok.nextToken();
-        String height = stok.nextToken();
-        int xval = 0, yval = 0, wval = 0, hval = 0;
-        try {
-            xval = Integer.parseInt(x);
-            yval = Integer.parseInt(y);
-            wval = Integer.parseInt(width);
-            hval = Integer.parseInt(height);
-        } catch (NumberFormatException e) {
-            throw new DataFormatException(e.getMessage());
-        }
-        return new Rectangle(xval, yval, wval, hval);
-    }
-
-    /**
-     * Converts the given value into an SWT rectangle.
-     * Returns the given default value if the 
-     * value does not represent a rectangle.
-     *
-     * @param value the value to be converted
-     * @param dflt the default value
-     * @return the value as a rectangle, or the default value
-     */
-    public static Rectangle asRectangle(String value, Rectangle dflt) {
-        try {
-            return asRectangle(value);
-        } catch (DataFormatException e) {
-            return dflt;
-        }
-    }
-
-    /**
-     * Converts the given value into an SWT RGB color value.
-     * This method fails if the value does not represent an RGB
-     * color value.
-     * <p>
-     * A valid RGB color value representation is a string of the form
-     * <code><it>red</it>,<it>green</it></code>,<it>blue</it></code> where
-     * <code><it>red</it></code>, <it>green</it></code>, and 
-     * <code><it>blue</it></code> are valid ints.
-     * </p>
-     *
-     * @param value the value to be converted
-     * @return the value as an RGB color value
-     * @exception DataFormatException if the given value does not represent
-     *	an RGB color value
-     */
-    public static RGB asRGB(String value) throws DataFormatException {
-        if (value == null) {
-			throw new DataFormatException("Null doesn't represent a valid RGB"); //$NON-NLS-1$
-		}
-        StringTokenizer stok = new StringTokenizer(value, ","); //$NON-NLS-1$
-
-        try {
-            String red = stok.nextToken().trim();
-            String green = stok.nextToken().trim();
-            String blue = stok.nextToken().trim();
-            int rval = 0, gval = 0, bval = 0;
-            try {
-                rval = Integer.parseInt(red);
-                gval = Integer.parseInt(green);
-                bval = Integer.parseInt(blue);
-            } catch (NumberFormatException e) {
-                throw new DataFormatException(e.getMessage());
-            }
-            return new RGB(rval, gval, bval);
-        } catch (NoSuchElementException e) {
-            throw new DataFormatException(e.getMessage());
-        }
-    }
-
-    /**
-     * Converts the given value into an SWT RGB color value.
-     * Returns the given default value if the 
-     * value does not represent an RGB color value.
-     *
-     * @param value the value to be converted
-     * @param dflt the default value
-     * @return the value as a RGB color value, or the default value
-     */
-    public static RGB asRGB(String value, RGB dflt) {
-        try {
-            return asRGB(value);
-        } catch (DataFormatException e) {
-            return dflt;
-        }
-    }
-
-    /**
-     * Converts the given double value to a string.
-     * Equivalent to <code>String.valueOf(value)</code>.
-     *
-     * @param value the double value
-     * @return the string representing the given double
-     */
-    public static String asString(double value) {
-        return String.valueOf(value);
-    }
-
-    /**
-     * Converts the given float value to a string.
-     * Equivalent to <code>String.valueOf(value)</code>.
-     *
-     * @param value the float value
-     * @return the string representing the given float
-     */
-    public static String asString(float value) {
-        return String.valueOf(value);
-    }
-
-    /**
-     * Converts the given int value to a string.
-     * Equivalent to <code>String.valueOf(value)</code>.
-     *
-     * @param value the int value
-     * @return the string representing the given int
-     */
-    public static String asString(int value) {
-        return String.valueOf(value);
-    }
-
-    /**
-     * Converts the given long value to a string.
-     * Equivalent to <code>String.valueOf(value)</code>.
-     *
-     * @param value the long value
-     * @return the string representing the given long
-     */
-    public static String asString(long value) {
-        return String.valueOf(value);
-    }
-
-    /**
-     * Converts the given boolean object to a string.
-     * Equivalent to <code>String.valueOf(value.booleanValue())</code>.
-     *
-     * @param value the boolean object
-     * @return the string representing the given boolean value
-     */
-    public static String asString(Boolean value) {
-        Assert.isNotNull(value);
-        return String.valueOf(value.booleanValue());
-    }
-
-    /**
-     * Converts the given double object to a string.
-     * Equivalent to <code>String.valueOf(value.doubleValue())</code>.
-     *
-     * @param value the double object
-     * @return the string representing the given double value
-     */
-    public static String asString(Double value) {
-        Assert.isNotNull(value);
-        return String.valueOf(value.doubleValue());
-    }
-
-    /**
-     * Converts the given float object to a string.
-     * Equivalent to <code>String.valueOf(value.floatValue())</code>.
-     *
-     * @param value the float object
-     * @return the string representing the given float value
-     */
-    public static String asString(Float value) {
-        Assert.isNotNull(value);
-        return String.valueOf(value.floatValue());
-    }
-
-    /**
-     * Converts the given integer object to a string.
-     * Equivalent to <code>String.valueOf(value.intValue())</code>.
-     *
-     * @param value the integer object
-     * @return the string representing the given integer value
-     */
-    public static String asString(Integer value) {
-        Assert.isNotNull(value);
-        return String.valueOf(value.intValue());
-    }
-
-    /**
-     * Converts the given long object to a string.
-     * Equivalent to <code>String.valueOf(value.longValue())</code>.
-     *
-     * @param value the long object
-     * @return the string representing the given long value
-     */
-    public static String asString(Long value) {
-        Assert.isNotNull(value);
-        return String.valueOf(value.longValue());
-    }
-
-    /**
-     * Converts a font data array  to a string. The string representation is
-     * that of asString(FontData) seperated by ';'
-     * 
-     * @param value The font data.
-     * @return The string representation of the font data arra.
-     * @since 3.0
-     */
-    public static String asString(FontData[] value) {
-        StringBuffer buffer = new StringBuffer();
-        for (int i = 0; i < value.length; i++) {
-            buffer.append(asString(value[i]));
-            if (i != value.length - 1) {
-				buffer.append(FONT_SEPARATOR);
-			}
-        }
-        return buffer.toString();
-    }
-
-    /**
-     * Converts a font data object to a string. The string representation is
-     * "font name-style-height" (for example "Times New Roman-bold-36").
-     * @param value The font data.
-     * @return The string representation of the font data object.
-     */
-    public static String asString(FontData value) {
-        Assert.isNotNull(value);
-        StringBuffer buffer = new StringBuffer();
-        buffer.append(value.getName());
-        buffer.append(SEPARATOR);
-        int style = value.getStyle();
-        boolean bold = (style & SWT.BOLD) == SWT.BOLD;
-        boolean italic = (style & SWT.ITALIC) == SWT.ITALIC;
-        if (bold && italic) {
-            buffer.append(BOLD_ITALIC);
-        } else if (bold) {
-            buffer.append(BOLD);
-        } else if (italic) {
-            buffer.append(ITALIC);
-        } else {
-            buffer.append(REGULAR);
-        }
-
-        buffer.append(SEPARATOR);
-        buffer.append(value.getHeight());
-        return buffer.toString();
-    }
-
-    /**
-     * Converts the given SWT point object to a string.
-     * <p>
-     * The string representation of a point has the form
-     * <code><it>x</it>,<it>y</it></code> where
-     * <code><it>x</it></code> and <code><it>y</it></code>
-     * are string representations of integers.
-     * </p>
-     *
-     * @param value the point object
-     * @return the string representing the given point
-     */
-    public static String asString(Point value) {
-        Assert.isNotNull(value);
-        StringBuffer buffer = new StringBuffer();
-        buffer.append(value.x);
-        buffer.append(',');
-        buffer.append(value.y);
-        return buffer.toString();
-    }
-
-    /**
-     * Converts the given SWT rectangle object to a string.
-     * <p>
-     * The string representation of a rectangle has the form
-     * <code><it>x</it>,<it>y</it>,<it>width</it>,<it>height</it></code>
-     * where <code><it>x</it></code>, <code><it>y</it></code>,
-     * <code><it>width</it></code>, and <code><it>height</it></code>
-     * are string representations of integers.
-     * </p>
-     *
-     * @param value the rectangle object
-     * @return the string representing the given rectangle
-     */
-    public static String asString(Rectangle value) {
-        Assert.isNotNull(value);
-        StringBuffer buffer = new StringBuffer();
-        buffer.append(value.x);
-        buffer.append(',');
-        buffer.append(value.y);
-        buffer.append(',');
-        buffer.append(value.width);
-        buffer.append(',');
-        buffer.append(value.height);
-        return buffer.toString();
-    }
-
-    /**
-     * Converts the given SWT RGB color value object to a string.
-     * <p>
-     * The string representation of an RGB color value has the form
-     * <code><it>red</it>,<it>green</it></code>,<it>blue</it></code> where
-     * <code><it>red</it></code>, <it>green</it></code>, and 
-     * <code><it>blue</it></code> are string representations of integers.
-     * </p>
-     *
-     * @param value the RGB color value object
-     * @return the string representing the given RGB color value
-     */
-    public static String asString(RGB value) {
-        Assert.isNotNull(value);
-        StringBuffer buffer = new StringBuffer();
-        buffer.append(value.red);
-        buffer.append(',');
-        buffer.append(value.green);
-        buffer.append(',');
-        buffer.append(value.blue);
-        return buffer.toString();
-    }
-
-    /**
-     * Converts the given boolean value to a string.
-     * Equivalent to <code>String.valueOf(value)</code>.
-     *
-     * @param value the boolean value
-     * @return the string representing the given boolean
-     */
-    public static String asString(boolean value) {
-        return String.valueOf(value);
-    }
-
-    /**
-     * Returns the given string with all whitespace characters removed.
-     * <p>
-     * All characters that have codes less than or equal to <code>'&#92;u0020'</code> 
-     * (the space character) are considered to be a white space.
-     * </p>
-     *
-     * @param s the source string
-     * @return the string with all whitespace characters removed
-     */
-    public static String removeWhiteSpaces(String s) {
-        //check for no whitespace (common case)
-        boolean found = false;
-        int wsIndex = -1;
-        int size = s.length();
-        for (int i = 0; i < size; i++) {
-            found = Character.isWhitespace(s.charAt(i));
-            if (found) {
-                wsIndex = i;
-                break;
-            }
-        }
-        if (!found) {
-			return s;
-		}
-
-        StringBuffer result = new StringBuffer(s.substring(0, wsIndex));
-        for (int i = wsIndex + 1; i < size; i++) {
-            char ch = s.charAt(i);
-            if (!Character.isWhitespace(ch)) {
-				result.append(ch);
-			}
-        }
-        return result.toString();
-    }
-
-    /**
-     * Converts a font data object to a string representation for display. 
-     * 	The string representation is
-     * "font name-style-height" (for example "Times New Roman-bold-36").
-     * @param value The font data.
-     * @return The string representation of the font data object.
-     * @deprecated use asString(FontData)
-     */
-    public static String asDisplayableString(FontData value) {
-        Assert.isNotNull(value);
-        StringBuffer buffer = new StringBuffer();
-        buffer.append(value.getName());
-        buffer.append(SEPARATOR);
-        int style = value.getStyle();
-        boolean bold = (style & SWT.BOLD) == SWT.BOLD;
-        boolean italic = (style & SWT.ITALIC) == SWT.ITALIC;
-        if (bold && italic) {
-            buffer.append(JFaceResources.getString("BoldItalicFont")); //$NON-NLS-1$
-        } else if (bold) {
-            buffer.append(JFaceResources.getString("BoldFont")); //$NON-NLS-1$
-        } else if (italic) {
-            buffer.append(JFaceResources.getString("ItalicFont")); //$NON-NLS-1$
-        } else {
-            buffer.append(JFaceResources.getString("RegularFont")); //$NON-NLS-1$
-        }
-        buffer.append(SEPARATOR);
-        buffer.append(value.getHeight());
-        return buffer.toString();
-
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/URLImageDescriptor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/URLImageDescriptor.java
deleted file mode 100644
index 23f3592..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/URLImageDescriptor.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.resource;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.internal.JFaceActivator;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-
-/**
- * An ImageDescriptor that gets its information from a URL. This class is not
- * public API. Use ImageDescriptor#createFromURL to create a descriptor that
- * uses a URL.
- */
-class URLImageDescriptor extends ImageDescriptor {
-	/**
-	 * Constant for the file protocol for optimized loading
-	 */ 
-	private static final String FILE_PROTOCOL = "file";  //$NON-NLS-1$
-	private URL url;
-
-	/**
-	 * Creates a new URLImageDescriptor.
-	 * 
-	 * @param url
-	 *            The URL to load the image from. Must be non-null.
-	 */
-	URLImageDescriptor(URL url) {
-		this.url = url;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Object.
-	 */
-	public boolean equals(Object o) {
-		if (!(o instanceof URLImageDescriptor)) {
-			return false;
-		}
-		return ((URLImageDescriptor) o).url.equals(this.url);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on ImageDesciptor. Returns null if the
-	 * image data cannot be read.
-	 */
-	public ImageData getImageData() {
-		ImageData result = null;
-		InputStream in = getStream();
-		if (in != null) {
-			try {
-				result = new ImageData(in);
-			} catch (SWTException e) {
-				if (e.code != SWT.ERROR_INVALID_IMAGE) {
-					throw e;
-					// fall through otherwise
-				}
-			} finally {
-				try {
-					in.close();
-				} catch (IOException e) {
-					Policy.getLog().log(
-							new Status(IStatus.ERROR, Policy.JFACE, e
-									.getLocalizedMessage(), e));
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns a stream on the image contents. Returns null if a stream could
-	 * not be opened.
-	 * 
-	 * @return the stream for loading the data
-	 */
-	protected InputStream getStream() {
-		try {
-			return new BufferedInputStream(url.openStream());
-		} catch (IOException e) {
-			return null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Object.
-	 */
-	public int hashCode() {
-		return url.hashCode();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Object.
-	 */
-	/**
-	 * The <code>URLImageDescriptor</code> implementation of this
-	 * <code>Object</code> method returns a string representation of this
-	 * object which is suitable only for debugging.
-	 */
-	public String toString() {
-		return "URLImageDescriptor(" + url + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Returns the filename for the ImageData.
-	 * 
-	 * @return {@link String} or <code>null</code> if the file cannot be found
-	 */
-	private String getFilePath() {
-
-		try {
-			if (JFaceActivator.getBundleContext() == null) {
-				if (FILE_PROTOCOL.equalsIgnoreCase(url.getProtocol()))
-					return new Path(url.getFile()).toOSString();
-				return null;
-			}
-
-			URL locatedURL = FileLocator.toFileURL(url);
-			if (FILE_PROTOCOL.equalsIgnoreCase(locatedURL.getProtocol()))
-				return new Path(locatedURL.getPath()).toOSString();
-			return null;
-
-		} catch (IOException e) {
-			Policy.logException(e);
-			return null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.resource.ImageDescriptor#createImage(boolean,
-	 *      org.eclipse.swt.graphics.Device)
-	 */
-	public Image createImage(boolean returnMissingImageOnError, Device device) {
-
-		// Try to see if we can optimize using SWTs file based image support.
-		String path = getFilePath();
-		if (path == null)
-			return super.createImage(returnMissingImageOnError, device);
-
-		try {
-			return new Image(device, path);
-		} catch (SWTException exception) {
-			// If we fail fall back to the slower input stream method.
-		}
-		return super.createImage(returnMissingImageOnError, device);
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts.properties
deleted file mode 100644
index 129ec90..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# Generic NLS font file for JFace
-# *.0 is Windows font
-# *.1 is Unix font
-#############################################################
-org.eclipse.jface.bannerfont.0=MS Sans Serif-bold-10
-org.eclipse.jface.bannerfont.1=b&h-lucidabright-regular-10
-
-org.eclipse.jface.headerfont.0=MS Sans Serif-bold-12
-org.eclipse.jface.headerfont.1=b&h-lucidabright-regular-12
-
-org.eclipse.jface.textfont.0=Courier New-regular-10
-org.eclipse.jface.textfont.1=Courier-regular-10
-org.eclipse.jface.textfont.2=b&h-lucidabright-regular-9
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_aix.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_aix.properties
deleted file mode 100644
index 9254f94..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_aix.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# Aix font file for JFace
-#############################################################
-org.eclipse.jface.bannerfont.0=adobe-courier-bold-14
-org.eclipse.jface.headerfont.0=misc-fixed-bold-14
-org.eclipse.jface.textfont.0=adobe-courier-regular-12
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_hp-ux.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_hp-ux.properties
deleted file mode 100644
index 6883353..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_hp-ux.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# HP UX font file for JFace
-#############################################################
-org.eclipse.jface.bannerfont.0=adobe-courier-bold-14
-org.eclipse.jface.headerfont.0=adobe-courier-regular-14
-org.eclipse.jface.textfont.0=adobe-courier-regular-14
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_linux.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_linux.properties
deleted file mode 100644
index 39b6899..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_linux.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# Linux font file for JFace
-#############################################################
-org.eclipse.jface.bannerfont.0=adobe-courier-bold-14
-org.eclipse.jface.headerfont.0=misc-fixed-bold-14
-org.eclipse.jface.textfont.0=adobe-courier-regular-12
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_linux_gtk.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_linux_gtk.properties
deleted file mode 100644
index b743b2e..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_linux_gtk.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# Linux GTK font file for JFace
-#############################################################
-org.eclipse.jface.bannerfont.0=Sans-bold-10
-org.eclipse.jface.headerfont.0=Sans-bold-12
-org.eclipse.jface.textfont.0=Monospace-regular-10
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_macosx.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_macosx.properties
deleted file mode 100644
index 6197fa4..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_macosx.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# Carbon font file for JFace
-#############################################################
-org.eclipse.jface.bannerfont.0=Lucida Grande-bold-12
-org.eclipse.jface.headerfont.0=Lucida Grande-bold-14
-
-org.eclipse.jface.textfont.0=Monaco-regular-11
-org.eclipse.jface.textfont.1=Courier-regular-12
-org.eclipse.jface.textfont.2=Courier New-regular-12
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_qnx.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_qnx.properties
deleted file mode 100644
index b1c216d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_qnx.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# QNX font file for JFace
-#############################################################
-org.eclipse.jface.bannerfont.0=TextFont-bold-9
-org.eclipse.jface.headerfont.0=TextFont-bold-9
-org.eclipse.jface.textfont.0=TextFont-regular-9
-
-
-
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_sunos.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_sunos.properties
deleted file mode 100644
index a10c0be..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_sunos.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# Solaris font file for JFace
-#############################################################
-org.eclipse.jface.bannerfont.0=adobe-courier-bold-14
-org.eclipse.jface.headerfont.0=misc-fixed-bold-14
-org.eclipse.jface.textfont.0=adobe-courier-regular-12
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_windows2000.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_windows2000.properties
deleted file mode 100644
index c152f1c..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_windows2000.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS font file for JFace when running under Windows 2000
-#############################################################
-org.eclipse.jface.bannerfont.0=Tahoma-bold-10
-
-org.eclipse.jface.headerfont.0=Tahoma-bold-12
-
-org.eclipse.jface.textfont.0=Courier New-regular-10
-org.eclipse.jface.textfont.1=Courier-regular-10
-org.eclipse.jface.textfont.2=Lucida Console-regular-9
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_windows98.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_windows98.properties
deleted file mode 100644
index 5a23376..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_windows98.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS font file for JFace when running under Windows 98
-#############################################################
-org.eclipse.jface.bannerfont.0=MS Sans Serif-bold-10
-
-org.eclipse.jface.headerfont.0=MS Sans Serif-bold-12
-
-org.eclipse.jface.textfont.0=Courier New-regular-10
-org.eclipse.jface.textfont.1=Courier-regular-10
-org.eclipse.jface.textfont.2=Lucida Console-regular-9
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_windowsnt.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_windowsnt.properties
deleted file mode 100644
index 41740b0..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_windowsnt.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS font file for JFace when running under Windows NT
-#############################################################
-org.eclipse.jface.bannerfont.0=MS Sans Serif-bold-10
-
-org.eclipse.jface.headerfont.0=MS Sans Serif-bold-12
-
-org.eclipse.jface.textfont.0=Courier New-regular-10
-org.eclipse.jface.textfont.1=Courier-regular-10
-org.eclipse.jface.textfont.2=Lucida Console-regular-9
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_windowsxp.properties b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_windowsxp.properties
deleted file mode 100644
index 6888654..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/jfacefonts_windowsxp.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS font file for JFace when running under Windows XP
-#############################################################
-org.eclipse.jface.bannerfont.0=Tahoma-bold-10
-
-org.eclipse.jface.headerfont.0=Tahoma-bold-12
-
-org.eclipse.jface.textfont.0=Courier New-regular-10
-org.eclipse.jface.textfont.1=Courier-regular-10
-org.eclipse.jface.textfont.2=Lucida Console-regular-9
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/package.html
deleted file mode 100644
index d380325..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/resource/package.html
+++ /dev/null
@@ -1,51 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides support for managing resources such as SWT
-fonts and images.
-<h2>
-Package Specification</h2>
-This package contains support for managing resources, including:
-<ul>
-<li>
-font registries (<tt>FontRegistry</tt>) - for hanging on to the SWT font
-objects needed by an application</li>
-
-<li>
-color registries (<tt>ColorRegistry</tt>) - for hanging on to the SWT color 
-objects needed by an application</li>
-
-<li>
-image registries (<tt>ImageRegistry</tt>) - for hanging on to the SWT image
-objects needed by an application</li>
-
-<li>
-image descriptors (<tt>ImageDescriptor</tt>) - surrogate object for creating
-SWT images</li>
-
-<li>
-string conversion (<tt>StringConverter</tt>) - for parsing property files</li>
-</ul>
-The JFace resources module is an independent JFace module requiring a basic
-knowledge of SWT and the JFace property change event mechanism. Familiarity
-with other JFace modules is not required.
-<p>Image descriptors are objects that knows how to create an image on demand.
-They serve as a lightweight representation of images in situations where
-no SWT display exists yet, and are used mainly in conjunction with image
-registries. This package contains the image descriptor framework, which
-is a simple hierarchy rooted at the abstract class <tt>ImageDescriptor</tt>.
-The framework includes abstract subclasses for composing images (<tt>CompositeImageDescriptor</tt>)
-as well as a ready-made concrete subclass for loading images from files
-(<tt>FileImageDescriptor</tt>).
-<p>The class <tt>JFaceResources</tt> maintains global state on behalf of
-JFace itself consisting of JFace's own image registry, font registry, resource
-bundle, and preference store.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/Assert.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/Assert.java
deleted file mode 100644
index 39711a0..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/Assert.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.util;
-
-/**
- * <code>Assert</code> is useful for for embedding runtime sanity checks
- * in code. The static predicate methods all test a condition and throw some
- * type of unchecked exception if the condition does not hold.
- * <p>
- * Assertion failure exceptions, like most runtime exceptions, are
- * thrown when something is misbehaving. Assertion failures are invariably
- * unspecified behavior; consequently, clients should never rely on
- * these being thrown (or not thrown). <b>If you find yourself in the
- * position where you need to catch an assertion failure, you have most 
- * certainly written your program incorrectly.</b>
- * </p>
- * <p>
- * Note that an <code>assert</code> statement is slated to be added to the
- * Java language in JDK 1.4, rending this class obsolete.
- * 
- * @deprecated As of 3.3, replaced by {@link org.eclipse.core.runtime.Assert}
- * </p>
- */
-public final class Assert {
-
-    /**
-     * <code>AssertionFailedException</code> is a runtime exception thrown
-     * by some of the methods in <code>Assert</code>.
-     * <p>
-     * This class is not declared public to prevent some misuses; programs that catch 
-     * or otherwise depend on assertion failures are susceptible to unexpected
-     * breakage when assertions in the code are added or removed.
-     * </p>
-     */
-    private static class AssertionFailedException extends RuntimeException {
-
-        /**
-         * Generated serial version UID for this class.
-         * @since 3.1
-         */
-        private static final long serialVersionUID = 3257852073508024376L;
-
-        /**
-         * Constructs a new exception.
-         */
-        public AssertionFailedException() {
-        }
-
-        /**
-         * Constructs a new exception with the given message.
-         * @param detail the detail message
-         */
-        public AssertionFailedException(String detail) {
-            super(detail);
-        }
-    }
-
-    /* This class is not intended to be instantiated. */
-    private Assert() {
-    }
-
-    /**
-     * Asserts that an argument is legal. If the given boolean is
-     * not <code>true</code>, an <code>IllegalArgumentException</code>
-     * is thrown.
-     *
-     * @param expression the outcome of the check
-     * @return <code>true</code> if the check passes (does not return
-     *    if the check fails)
-     * @exception IllegalArgumentException if the legality test failed
-     */
-    public static boolean isLegal(boolean expression) {
-        // succeed as quickly as possible
-        if (expression) {
-            return true;
-        }
-        return isLegal(expression, "");//$NON-NLS-1$
-    }
-
-    /**
-     * Asserts that an argument is legal. If the given boolean is
-     * not <code>true</code>, an <code>IllegalArgumentException</code>
-     * is thrown.
-     * The given message is included in that exception, to aid debugging.
-     *
-     * @param expression the outcome of the check
-     * @param message the message to include in the exception
-     * @return <code>true</code> if the check passes (does not return
-     *    if the check fails)
-     * @exception IllegalArgumentException if the legality test failed
-     */
-    public static boolean isLegal(boolean expression, String message) {
-        if (!expression) {
-			throw new IllegalArgumentException("assertion failed; " + message); //$NON-NLS-1$
-		}
-        return expression;
-    }
-
-    /**
-     * Asserts that the given object is not <code>null</code>. If this
-     * is not the case, some kind of unchecked exception is thrown.
-     * <p>
-     * As a general rule, parameters passed to API methods must not be
-     * <code>null</code> unless <b>explicitly</b> allowed in the method's
-     * specification. Similarly, results returned from API methods are never
-     * <code>null</code> unless <b>explicitly</b> allowed in the method's
-     * specification. Implementations are encouraged to make regular use of 
-     * <code>Assert.isNotNull</code> to ensure that <code>null</code> 
-     * parameters are detected as early as possible.
-     * </p>
-     * 
-     * @param object the value to test
-     * @exception AssertionFailedException an unspecified unchecked exception if the object
-     *   is <code>null</code>
-     */
-    public static void isNotNull(Object object) {
-        // succeed as quickly as possible
-        if (object != null) {
-            return;
-        }
-        isNotNull(object, "");//$NON-NLS-1$
-    }
-
-    /**
-     * Asserts that the given object is not <code>null</code>. If this
-     * is not the case, some kind of unchecked exception is thrown.
-     * The given message is included in that exception, to aid debugging.
-     * <p>
-     * As a general rule, parameters passed to API methods must not be
-     * <code>null</code> unless <b>explicitly</b> allowed in the method's
-     * specification. Similarly, results returned from API methods are never
-     * <code>null</code> unless <b>explicitly</b> allowed in the method's
-     * specification. Implementations are encouraged to make regular use of 
-     * <code>Assert.isNotNull</code> to ensure that <code>null</code> 
-     * parameters are detected as early as possible.
-     * </p>
-     * 
-     * @param object the value to test
-     * @param message the message to include in the exception
-     * @exception AssertionFailedException an unspecified unchecked exception if the object
-     *   is <code>null</code>
-     */
-    public static void isNotNull(Object object, String message) {
-        if (object == null) {
-			throw new AssertionFailedException("null argument;" + message);//$NON-NLS-1$
-		}
-    }
-
-    /**
-     * Asserts that the given boolean is <code>true</code>. If this
-     * is not the case, some kind of unchecked exception is thrown.
-     *
-     * @param expression the outcome of the check
-     * @return <code>true</code> if the check passes (does not return
-     *    if the check fails)
-     */
-    public static boolean isTrue(boolean expression) {
-        // succeed as quickly as possible
-        if (expression) {
-            return true;
-        }
-        return isTrue(expression, "");//$NON-NLS-1$
-    }
-
-    /**
-     * Asserts that the given boolean is <code>true</code>. If this
-     * is not the case, some kind of unchecked exception is thrown.
-     * The given message is included in that exception, to aid debugging.
-     *
-     * @param expression the outcome of the check
-     * @param message the message to include in the exception
-     * @return <code>true</code> if the check passes (does not return
-     *    if the check fails)
-     */
-    public static boolean isTrue(boolean expression, String message) {
-        if (!expression) {
-			throw new AssertionFailedException("Assertion failed: " + message);//$NON-NLS-1$
-		}
-        return expression;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/DelegatingDragAdapter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/DelegatingDragAdapter.java
deleted file mode 100644
index b1483db..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/DelegatingDragAdapter.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.swt.dnd.DragSource;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.dnd.TransferData;
-
-/**
- * A <code>DelegatingDragAdapter</code> is a <code>DragSourceListener</code> that  
- * maintains and delegates to a set of {@link TransferDragSourceListener}s. Each 
- * TransferDragSourceListener can then be implemented as if it were the 
- * <code>DragSource's</code> only DragSourceListener.
- * <p>
- * When a drag is started, a subset of all <code>TransferDragSourceListeners</code>
- * is generated and stored in a list of <i>active</i> listeners. This subset is
- * calculated by forwarding {@link DragSourceListener#dragStart(DragSourceEvent)} to 
- * every listener, and checking if the {@link DragSourceEvent#doit doit} field is left 
- * set to <code>true</code>.
- * </p> 
- * The <code>DragSource</code>'s set of supported Transfer types ({@link
- * DragSource#setTransfer(Transfer[])}) is updated to reflect the Transfer types
- * corresponding to the active listener subset.
- * <p>
- * If and when {@link #dragSetData(DragSourceEvent)} is called, a single
- * <code>TransferDragSourceListener</code> is chosen, and only it is allowed to set the
- * drag data. The chosen listener is the first listener in the subset of active listeners
- * whose Transfer supports ({@link Transfer#isSupportedType(TransferData)}) the 
- * <code>dataType</code> in the <code>DragSourceEvent</code>.
- * </p>
- * <p>
- * The following example snippet shows a <code>DelegatingDragAdapter</code> with two
- * <code>TransferDragSourceListeners</code>. One implements drag of text strings, 
- * the other supports file transfer and demonstrates how a listener can be disabled using
- * the dragStart method. 
- * </p>
- * <code><pre>
- *		final TreeViewer viewer = new TreeViewer(shell, SWT.NONE);
- *		
- *		DelegatingDragAdapter dragAdapter = new DelegatingDragAdapter();		
- *		dragAdapter.addDragSourceListener(new TransferDragSourceListener() {
- *			public Transfer getTransfer() {
- *				return TextTransfer.getInstance();
- *			}
- *			public void dragStart(DragSourceEvent event) {
- *				// always enabled, can control enablement based on selection etc.
- *			}
- *			public void dragSetData(DragSourceEvent event) {
- *				event.data = "Transfer data";
- *			}
- *			public void dragFinished(DragSourceEvent event) {
- *				// no clean-up required
- *			}
- *		});
- *		dragAdapter.addDragSourceListener(new TransferDragSourceListener() {
- *			public Transfer getTransfer() {
- *				return FileTransfer.getInstance();
- *			}
- *			public void dragStart(DragSourceEvent event) {
- *				// enable drag listener if there is a viewer selection
- *				event.doit = !viewer.getSelection().isEmpty();
- *			}
- *			public void dragSetData(DragSourceEvent event) {
- *				File file1 = new File("C:/temp/file1");
- *				File file2 = new File("C:/temp/file2");
- *				event.data = new String[] {file1.getAbsolutePath(), file2.getAbsolutePath()};
- *			}
- *			public void dragFinished(DragSourceEvent event) {
- *				// no clean-up required
- *			}
- *		});
- *		viewer.addDragSupport(DND.DROP_COPY | DND.DROP_MOVE, dragAdapter.getTransfers(), dragAdapter);
- * </pre></code>
- * @since 3.0
- */
-public class DelegatingDragAdapter implements DragSourceListener {
-    private List listeners = new ArrayList();
-
-    private List activeListeners = new ArrayList();
-
-    private TransferDragSourceListener currentListener;
-
-    /**
-     * Adds the given <code>TransferDragSourceListener</code>.
-     * 
-     * @param listener the new listener
-     */
-    public void addDragSourceListener(TransferDragSourceListener listener) {
-        listeners.add(listener);
-    }
-
-    /**
-     * The drop has successfully completed. This event is forwarded to the current 
-     * drag listener.
-     * Doesn't update the current listener, since the current listener  is already the one
-     * that completed the drag operation.
-     * 
-     * @param event the drag source event
-     * @see DragSourceListener#dragFinished(DragSourceEvent)
-     */
-    public void dragFinished(final DragSourceEvent event) {
-        //		if (Policy.DEBUG_DRAG_DROP)
-        //			System.out.println("Drag Finished: " + toString()); //$NON-NLS-1$
-        SafeRunnable.run(new SafeRunnable() {
-            public void run() throws Exception {
-                if (currentListener != null) {
-                    // there is a listener that can handle the drop, delegate the event
-                    currentListener.dragFinished(event);
-                } else {
-                    // The drag was canceled and currentListener was never set, so send the
-                    // dragFinished event to all the active listeners. 
-                    Iterator iterator = activeListeners.iterator();
-                    while (iterator.hasNext()) {
-						((TransferDragSourceListener) iterator.next())
-                                .dragFinished(event);
-					}
-                }
-            }
-        });
-        currentListener = null;
-        activeListeners.clear();
-    }
-
-    /**
-     * The drop data is requested.
-     * Updates the current listener and then forwards the event to it.
-     * 
-     * @param event the drag source event
-     * @see DragSourceListener#dragSetData(DragSourceEvent)
-     */
-    public void dragSetData(final DragSourceEvent event) {
-        //		if (Policy.DEBUG_DRAG_DROP)
-        //			System.out.println("Drag Set Data: " + toString()); //$NON-NLS-1$
-
-        updateCurrentListener(event); // find a listener that can provide the given data type
-        if (currentListener != null) {
-        	SafeRunnable.run(new SafeRunnable() {
-                public void run() throws Exception {
-                    currentListener.dragSetData(event);
-                }
-            });
-        }
-    }
-
-    /**
-     * A drag operation has started.
-     * Forwards this event to each listener. A listener must set <code>event.doit</code> 
-     * to <code>false</code> if it cannot handle the drag operation. If a listener can  
-     * handle the drag, it is added to the list of active listeners.  
-     * The drag is aborted if there are no listeners that can handle it.  
-     * 
-     * @param event the drag source event
-     * @see DragSourceListener#dragStart(DragSourceEvent)
-     */
-    public void dragStart(final DragSourceEvent event) {
-        //		if (Policy.DEBUG_DRAG_DROP)
-        //			System.out.println("Drag Start: " + toString()); //$NON-NLS-1$
-        boolean doit = false; // true if any one of the listeners can handle the drag
-        List transfers = new ArrayList(listeners.size());
-
-        activeListeners.clear();
-        for (int i = 0; i < listeners.size(); i++) {
-            final TransferDragSourceListener listener = (TransferDragSourceListener) listeners
-                    .get(i);
-            event.doit = true; // restore event.doit
-            SafeRunnable.run(new SafeRunnable() {
-                public void run() throws Exception {
-                    listener.dragStart(event);
-                }
-            });
-            if (event.doit) { // the listener can handle this drag
-                transfers.add(listener.getTransfer());
-                activeListeners.add(listener);
-            }
-            doit |= event.doit;
-        }
-
-        if (doit) {
-			((DragSource) event.widget).setTransfer((Transfer[]) transfers
-                    .toArray(new Transfer[transfers.size()]));
-		}
-
-        event.doit = doit;
-    }
-
-    /**
-     * Returns the <code>Transfer<code>s from every <code>TransferDragSourceListener</code>.
-     * 
-     * @return the combined <code>Transfer</code>s
-     */
-    public Transfer[] getTransfers() {
-        Transfer[] types = new Transfer[listeners.size()];
-        for (int i = 0; i < listeners.size(); i++) {
-            TransferDragSourceListener listener = (TransferDragSourceListener) listeners
-                    .get(i);
-            types[i] = listener.getTransfer();
-        }
-        return types;
-    }
-
-    /**
-     * Returns <code>true</code> if there are no listeners to delegate drag events to.
-     * 
-     * @return <code>true</code> if there are no <code>TransferDragSourceListeners</code>
-     * 	<code>false</code> otherwise.
-     */
-    public boolean isEmpty() {
-        return listeners.isEmpty();
-    }
-
-    /**
-     * Removes the given <code>TransferDragSourceListener</code>.
-     * Listeners should not be removed while a drag and drop operation is in progress.
-     *  
-     * @param listener the <code>TransferDragSourceListener</code> to remove
-     */
-    public void removeDragSourceListener(TransferDragSourceListener listener) {
-        listeners.remove(listener);
-        if (currentListener == listener) {
-			currentListener = null;
-		}
-        if (activeListeners.contains(listener)) {
-			activeListeners.remove(listener);
-		}
-    }
-
-    /**
-     * Updates the current listener to one that can handle the drag. There can 
-     * be many listeners and each listener may be able to handle many <code>TransferData</code> 
-     * types.  The first listener found that supports one of the <code>TransferData</ode> 
-     * types specified in the <code>DragSourceEvent</code> will be selected.
-     * 
-     * @param event the drag source event
-     */
-    private void updateCurrentListener(DragSourceEvent event) {
-        currentListener = null;
-        if (event.dataType == null) {
-			return;
-		}
-        Iterator iterator = activeListeners.iterator();
-        while (iterator.hasNext()) {
-            TransferDragSourceListener listener = (TransferDragSourceListener) iterator
-                    .next();
-
-            if (listener.getTransfer().isSupportedType(event.dataType)) {
-                //				if (Policy.DEBUG_DRAG_DROP)
-                //					System.out.println("Current drag listener: " + listener); //$NON-NLS-1$			
-                currentListener = listener;
-                return;
-            }
-        }
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/DelegatingDropAdapter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/DelegatingDropAdapter.java
deleted file mode 100644
index d9626c5..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/DelegatingDropAdapter.java
+++ /dev/null
@@ -1,384 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.DropTargetListener;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.dnd.TransferData;
-
-/**
- * A <code>DelegatingDropAdapter</code> is a <code>DropTargetListener</code> that 
- * maintains and delegates to a set of {@link TransferDropTargetListener}s. Each 
- * <code>TransferDropTargetListener</code> can then be implemented as if it were 
- * the DropTarget's only <code>DropTargetListener</code>.
- * <p>
- * On <code>dragEnter</code>, <code>dragOperationChanged</code>, <code>dragOver</code>
- * and <code>drop</code>, a <i>current</i> listener is obtained from the set of all 
- * <code>TransferDropTargetListeners</code>. The current listener is the first listener 
- * to return <code>true</code> for 
- * {@link TransferDropTargetListener#isEnabled(DropTargetEvent)}.
- * The current listener is forwarded all <code>DropTargetEvents</code> until some other
- * listener becomes the current listener, or the drop terminates.
- * </p>
- * <p>
- * After adding all <code>TransferDropTargetListeners</code> to the 
- * <code>DelegatingDropAdapter</code> the combined set of <code>Transfers</code> should 
- * be set in the SWT <code>DropTarget</code>. <code>#getTransfers()</code> provides the 
- * set of <code>Transfer</code> types of all <code>TransferDropTargetListeners</code>. 
- * </p>
- * <p>
- * The following example snippet shows a <code>DelegatingDropAdapter</code> with two
- * <code>TransferDropTargetListeners</code>. One supports dropping resources and 
- * demonstrates how a listener can be disabled in the isEnabled method. 
- * The other listener supports text transfer. 
- * </p>
- * <code><pre>
- *		final TreeViewer viewer = new TreeViewer(shell, SWT.NONE);
- * 		DelegatingDropAdapter dropAdapter = new DelegatingDropAdapter();
- *		dropAdapter.addDropTargetListener(new TransferDropTargetListener() {
- *			public Transfer getTransfer() {
- *				return ResourceTransfer.getInstance();
- *			}
- *			public boolean isEnabled(DropTargetEvent event) {
- *				// disable drop listener if there is no viewer selection
- *				if (viewer.getSelection().isEmpty())
- *					return false;
- *				return true;
- *			}
- *			public void dragEnter(DropTargetEvent event) {}
- *			public void dragLeave(DropTargetEvent event) {}
- *			public void dragOperationChanged(DropTargetEvent event) {}
- *			public void dragOver(DropTargetEvent event) {}
- *			public void drop(DropTargetEvent event) {
- *				if (event.data == null)
- *					return;
- *				IResource[] resources = (IResource[]) event.data;
- *				if (event.detail == DND.DROP_COPY) {
- *					// copy resources
- *				} else {
- *					// move resources
- *				}
- *					
- *			}
- *			public void dropAccept(DropTargetEvent event) {}
- *		});
- *		dropAdapter.addDropTargetListener(new TransferDropTargetListener() {
- *			public Transfer getTransfer() {
- *				return TextTransfer.getInstance();
- *			}
- *			public boolean isEnabled(DropTargetEvent event) {
- *				return true;
- *			}
- *			public void dragEnter(DropTargetEvent event) {}
- *			public void dragLeave(DropTargetEvent event) {}
- *			public void dragOperationChanged(DropTargetEvent event) {}
- *			public void dragOver(DropTargetEvent event) {}
- *			public void drop(DropTargetEvent event) {
- *				if (event.data == null)
- *					return;
- *				System.out.println(event.data);
- *			}
- *			public void dropAccept(DropTargetEvent event) {}
- *		});		
- *		viewer.addDropSupport(DND.DROP_COPY | DND.DROP_MOVE, dropAdapter.getTransfers(), dropAdapter);
- * </pre></code>
- * @since 3.0
- */
-public class DelegatingDropAdapter implements DropTargetListener {
-    private List listeners = new ArrayList();
-
-    private TransferDropTargetListener currentListener;
-
-    private int originalDropType;
-
-    /**
-     * Adds the given <code>TransferDropTargetListener</code>.
-     * 
-     * @param listener the new listener
-     */
-    public void addDropTargetListener(TransferDropTargetListener listener) {
-        listeners.add(listener);
-    }
-
-    /**
-     * The cursor has entered the drop target boundaries. The current listener is 
-     * updated, and <code>#dragEnter()</code> is forwarded to the current listener.
-     * 
-     * @param event the drop target event 
-     * @see DropTargetListener#dragEnter(DropTargetEvent)
-     */
-    public void dragEnter(DropTargetEvent event) {
-        //		if (Policy.DEBUG_DRAG_DROP)
-        //			System.out.println("Drag Enter: " + toString()); //$NON-NLS-1$
-        originalDropType = event.detail;
-        updateCurrentListener(event);
-    }
-
-    /**
-     * The cursor has left the drop target boundaries. The event is forwarded to the 
-     * current listener.
-     * 
-     * @param event the drop target event
-     * @see DropTargetListener#dragLeave(DropTargetEvent)
-     */
-    public void dragLeave(final DropTargetEvent event) {
-        //		if (Policy.DEBUG_DRAG_DROP)
-        //			System.out.println("Drag Leave: " + toString()); //$NON-NLS-1$
-        setCurrentListener(null, event);
-    }
-
-    /**
-     * The operation being performed has changed (usually due to the user changing 
-     * a drag modifier key while dragging). Updates the current listener and forwards 
-     * this event to that listener.
-     * 
-     * @param event the drop target event
-     * @see DropTargetListener#dragOperationChanged(DropTargetEvent)
-     */
-    public void dragOperationChanged(final DropTargetEvent event) {
-        //		if (Policy.DEBUG_DRAG_DROP)
-        //			System.out.println("Drag Operation Changed to: " + event.detail); //$NON-NLS-1$
-        originalDropType = event.detail;
-        TransferDropTargetListener oldListener = getCurrentListener();
-        updateCurrentListener(event);
-        final TransferDropTargetListener newListener = getCurrentListener();
-        // only notify the current listener if it hasn't changed based on the 
-        // operation change. otherwise the new listener would get a dragEnter 
-        // followed by a dragOperationChanged with the exact same event. 
-        if (newListener != null && newListener == oldListener) {
-            SafeRunnable.run(new SafeRunnable() {
-                public void run() throws Exception {
-                    newListener.dragOperationChanged(event);
-                }
-            });
-        }
-    }
-
-    /**
-     * The cursor is moving over the drop target. Updates the current listener and 
-     * forwards this event to that listener. If no listener can handle the drag 
-     * operation the <code>event.detail</code> field is set to <code>DND.DROP_NONE</code> 
-     * to indicate an invalid drop.
-     *   
-     * @param event the drop target event
-     * @see DropTargetListener#dragOver(DropTargetEvent)
-     */
-    public void dragOver(final DropTargetEvent event) {
-        TransferDropTargetListener oldListener = getCurrentListener();
-        updateCurrentListener(event);
-        final TransferDropTargetListener newListener = getCurrentListener();
-
-        // only notify the current listener if it hasn't changed based on the 
-        // drag over. otherwise the new listener would get a dragEnter 
-        // followed by a dragOver with the exact same event. 
-        if (newListener != null && newListener == oldListener) {
-        	SafeRunnable.run(new SafeRunnable() {
-                public void run() throws Exception {
-                    newListener.dragOver(event);
-                }
-            });
-        }
-    }
-
-    /**
-     * Forwards this event to the current listener, if there is one. Sets the
-     * current listener to <code>null</code> afterwards.
-     * 
-     * @param event the drop target event
-     * @see DropTargetListener#drop(DropTargetEvent)
-     */
-    public void drop(final DropTargetEvent event) {
-        //		if (Policy.DEBUG_DRAG_DROP)
-        //			System.out.println("Drop: " + toString()); //$NON-NLS-1$
-        updateCurrentListener(event);
-        if (getCurrentListener() != null) {
-        	SafeRunnable.run(new SafeRunnable() {
-                public void run() throws Exception {
-                    getCurrentListener().drop(event);
-                }
-            });
-        }
-        setCurrentListener(null, event);
-    }
-
-    /**
-     * Forwards this event to the current listener if there is one.
-     * 
-     * @param event the drop target event
-     * @see DropTargetListener#dropAccept(DropTargetEvent)
-     */
-    public void dropAccept(final DropTargetEvent event) {
-        //		if (Policy.DEBUG_DRAG_DROP)
-        //			System.out.println("Drop Accept: " + toString()); //$NON-NLS-1$
-        if (getCurrentListener() != null) {
-        	SafeRunnable.run(new SafeRunnable() {
-                public void run() throws Exception {
-                    getCurrentListener().dropAccept(event);
-                }
-            });
-        }
-    }
-
-    /**
-     * Returns the listener which currently handles drop events.
-     * 
-     * @return the <code>TransferDropTargetListener</code> which currently 
-     * 	handles drop events.
-     */
-    private TransferDropTargetListener getCurrentListener() {
-        return currentListener;
-    }
-
-    /**
-     * Returns the transfer data type supported by the given listener.
-     * Returns <code>null</code> if the listener does not support any of the   
-     * specified data types.
-     *  
-     * @param dataTypes available data types
-     * @param listener <code>TransferDropTargetListener</code> to use for testing 
-     * 	supported data types.
-     * @return the transfer data type supported by the given listener or 
-     * 	<code>null</code>.
-     */
-    private TransferData getSupportedTransferType(TransferData[] dataTypes,
-            TransferDropTargetListener listener) {
-        for (int i = 0; i < dataTypes.length; i++) {
-            if (listener.getTransfer().isSupportedType(dataTypes[i])) {
-                return dataTypes[i];
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the combined set of <code>Transfer</code> types of all 
-     * <code>TransferDropTargetListeners</code>.
-     * 
-     * @return the combined set of <code>Transfer</code> types
-     */
-    public Transfer[] getTransfers() {
-        Transfer[] types = new Transfer[listeners.size()];
-        for (int i = 0; i < listeners.size(); i++) {
-            TransferDropTargetListener listener = (TransferDropTargetListener) listeners
-                    .get(i);
-            types[i] = listener.getTransfer();
-        }
-        return types;
-    }
-
-    /**
-     * Returns <code>true</code> if there are no listeners to delegate events to.
-     * 
-     * @return <code>true</code> if there are no <code>TransferDropTargetListeners</code>
-     *	<code>false</code> otherwise
-     */
-    public boolean isEmpty() {
-        return listeners.isEmpty();
-    }
-
-    /**
-     * Removes the given <code>TransferDropTargetListener</code>.
-     * Listeners should not be removed while a drag and drop operation is in progress.
-     * 
-     * @param listener the listener to remove
-     */
-    public void removeDropTargetListener(TransferDropTargetListener listener) {
-        if (currentListener == listener) {
-			currentListener = null;
-		}
-        listeners.remove(listener);
-    }
-
-    /**
-     * Sets the current listener to <code>listener</code>. Sends the given 
-     * <code>DropTargetEvent</code> if the current listener changes.
-     * 
-     * @return <code>true</code> if the new listener is different than the previous
-     *	<code>false</code> otherwise
-     */
-    private boolean setCurrentListener(TransferDropTargetListener listener,
-            final DropTargetEvent event) {
-        if (currentListener == listener) {
-			return false;
-		}
-        if (currentListener != null) {
-        	SafeRunnable.run(new SafeRunnable() {
-                public void run() throws Exception {
-                    currentListener.dragLeave(event);
-                }
-            });
-        }
-        currentListener = listener;
-        //		if (Policy.DEBUG_DRAG_DROP)
-        //			System.out.println("Current drop listener: " + listener); //$NON-NLS-1$
-        if (currentListener != null) {
-        	SafeRunnable.run(new SafeRunnable() {
-                public void run() throws Exception {
-                    currentListener.dragEnter(event);
-                }
-            });
-        }
-        return true;
-    }
-
-    /**
-     * Updates the current listener to one that can handle the drop. There can be many
-     * listeners and each listener may be able to handle many <code>TransferData</code> 
-     * types. The first listener found that can handle a drop of one of the given 
-     * <code>TransferData</code> types will be selected.
-     * If no listener can handle the drag operation the <code>event.detail</code> field
-     * is set to <code>DND.DROP_NONE</code> to indicate an invalid drop.
-     *
-     * @param event the drop target event
-     */
-    private void updateCurrentListener(DropTargetEvent event) {
-        int originalDetail = event.detail;
-        // revert the detail to the "original" drop type that the User indicated.
-        // this is necessary because the previous listener may have changed the detail 
-        // to something other than what the user indicated.
-        event.detail = originalDropType;
-
-        Iterator iter = listeners.iterator();
-        while (iter.hasNext()) {
-            TransferDropTargetListener listener = (TransferDropTargetListener) iter
-                    .next();
-            TransferData dataType = getSupportedTransferType(event.dataTypes,
-                    listener);
-            if (dataType != null) {
-                TransferData originalDataType = event.currentDataType;
-                // set the data type supported by the drop listener
-                event.currentDataType = dataType;
-                if (listener.isEnabled(event)) {
-                    // if the listener stays the same, set its previously determined  
-                    // event detail 
-                    if (!setCurrentListener(listener, event)) {
-						event.detail = originalDetail;
-					}
-                    return;
-                }
-				event.currentDataType = originalDataType;
-            }
-        }
-        setCurrentListener(null, event);
-        event.detail = DND.DROP_NONE;
-        
-        // -always- ensure that expand/scroll are on...otherwise
-        // if a valid drop target is a child of an invalid one
-        // you can't get there...
-        event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/Geometry.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/Geometry.java
deleted file mode 100644
index f824d1e..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/Geometry.java
+++ /dev/null
@@ -1,807 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.util;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * Contains static methods for performing simple geometric operations
- * on the SWT geometry classes.
- *
- * @since 3.0
- */
-public class Geometry {
-
-    /**
-     * Prevent this class from being instantiated.
-     * 
-     * @since 3.0
-     */
-    private Geometry() {
-    	//This is not instantiated
-    }
-
-    /**
-     * Returns the square of the distance between two points. 
-     * <p>This is preferred over the real distance when searching
-     * for the closest point, since it avoids square roots.</p>
-     * 
-     * @param p1 first endpoint
-     * @param p2 second endpoint
-     * @return the square of the distance between the two points
-     * 
-     * @since 3.0
-     */
-    public static int distanceSquared(Point p1, Point p2) {
-        int term1 = p1.x - p2.x;
-        int term2 = p1.y - p2.y;
-        return term1 * term1 + term2 * term2;
-    }
-
-    /**
-     * Returns the magnitude of the given 2d vector (represented as a Point)
-     *  
-     * @param p point representing the 2d vector whose magnitude is being computed
-     * @return the magnitude of the given 2d vector
-     * @since 3.0
-     */
-    public static double magnitude(Point p) {
-        return Math.sqrt(magnitudeSquared(p));
-    }
-
-    /**
-     * Returns the square of the magnitude of the given 2-space vector (represented
-     * using a point)
-     * 
-     * @param p the point whose magnitude is being computed
-     * @return the square of the magnitude of the given vector
-     * @since 3.0
-     */
-    public static int magnitudeSquared(Point p) {
-        return p.x * p.x + p.y * p.y;
-    }
-
-    /**
-     * Returns the dot product of the given vectors (expressed as Points)
-     * 
-     * @param p1 the first vector
-     * @param p2 the second vector
-     * @return the dot product of the two vectors
-     * @since 3.0
-     */
-    public static int dotProduct(Point p1, Point p2) {
-        return p1.x * p2.x + p1.y * p2.y;
-    }
-
-    /**
-     * Returns a new point whose coordinates are the minimum of the coordinates of the
-     * given points
-     * 
-     * @param p1 a Point
-     * @param p2 a Point
-     * @return a new point whose coordinates are the minimum of the coordinates of the
-     * given points
-     * @since 3.0
-     */
-    public static Point min(Point p1, Point p2) {
-        return new Point(Math.min(p1.x, p2.x), Math.min(p1.y, p2.y));
-    }
-
-    /**
-     * Returns a new point whose coordinates are the maximum of the coordinates
-     * of the given points
-     * @param p1 a Point
-     * @param p2 a Point
-     * @return point a new point whose coordinates are the maximum of the coordinates
-     * @since 3.0
-     */
-    public static Point max(Point p1, Point p2) {
-        return new Point(Math.max(p1.x, p2.x), Math.max(p1.y, p2.y));
-    }
-
-    /**
-     * Returns a vector in the given direction with the given
-     * magnitude. Directions are given using SWT direction constants, and
-     * the resulting vector is in the screen's coordinate system. That is,
-     * the vector (0, 1) is down and the vector (1, 0) is right. 
-     * 
-     * @param distance magnitude of the vector
-     * @param direction one of SWT.TOP, SWT.BOTTOM, SWT.LEFT, or SWT.RIGHT
-     * @return a point representing a vector in the given direction with the given magnitude
-     * @since 3.0
-     */
-    public static Point getDirectionVector(int distance, int direction) {
-        switch (direction) {
-        case SWT.TOP:
-            return new Point(0, -distance);
-        case SWT.BOTTOM:
-            return new Point(0, distance);
-        case SWT.LEFT:
-            return new Point(-distance, 0);
-        case SWT.RIGHT:
-            return new Point(distance, 0);
-        }
-
-        return new Point(0, 0);
-    }
-
-    /**
-     * Returns the point in the center of the given rectangle.
-     * 
-     * @param rect rectangle being computed
-     * @return a Point at the center of the given rectangle.
-     * @since 3.0
-     */
-    public static Point centerPoint(Rectangle rect) {
-        return new Point(rect.x + rect.width / 2, rect.y + rect.height / 2);
-    }
-
-    /**
-     * Returns a copy of the given point
-     * 
-     * @param toCopy point to copy
-     * @return a copy of the given point
-     */
-    public static Point copy(Point toCopy) {
-        return new Point(toCopy.x, toCopy.y);
-    }
-    
-    /**
-     * Sets result equal to toCopy
-     * 
-     * @param result object that will be modified
-     * @param toCopy object that will be copied
-     * @since 3.1
-     */
-    public static void set(Point result, Point toCopy) {
-    	result.x = toCopy.x;
-    	result.y = toCopy.y;
-    }
-    
-    /**
-     * Sets result equal to toCopy
-     * 
-     * @param result object that will be modified
-     * @param toCopy object that will be copied
-     * @since 3.1
-     */
-    public static void set(Rectangle result, Rectangle toCopy) {
-    	result.x = toCopy.x;
-    	result.y = toCopy.y;
-    	result.width = toCopy.width;
-    	result.height = toCopy.height;
-    }
-
-    /**
-     * <p>Returns a new difference Rectangle whose x, y, width, and height are equal to the difference of the corresponding
-     * attributes from the given rectangles</p>
-     * 
-     * <p></p>
-     * <b>Example: Compute the margins for a given Composite, and apply those same margins to a new GridLayout</b>
-     * 
-     * <code><pre>      
-     *      // Compute the client area, in the coordinate system of the input composite's parent  
-     *      Rectangle clientArea = Display.getCurrent().map(inputComposite, 
-     *      	inputComposite.getParent(), inputComposite.getClientArea());
-     *      
-     *      // Compute the margins for a given Composite by subtracting the client area from the composite's bounds
-     *      Rectangle margins = Geometry.subtract(inputComposite.getBounds(), clientArea);
-     *      
-     *      // Now apply these margins to a new GridLayout
-     *      GridLayout layout = GridLayoutFactory.fillDefaults().margins(margins).create();
-     * </pre></code>
-     * 
-     * @param rect1 first rectangle
-     * @param rect2 rectangle to subtract
-     * @return the difference between the two rectangles (computed as rect1 - rect2)
-     * @since 3.3
-     */
-    public static Rectangle subtract(Rectangle rect1, Rectangle rect2) {
-    	return new Rectangle(rect1.x - rect2.x, rect1.y - rect2.y, rect1.width - rect2.width, rect1.height - rect2.height);
-    }
-    
-    /**
-     * <p>Returns a new Rectangle whose x, y, width, and height is the sum of the x, y, width, and height values of 
-     * both rectangles respectively.</p>
-     * 
-     * @param rect1 first rectangle to add
-     * @param rect2 second rectangle to add
-     * @return a new rectangle whose x, y, height, and width attributes are the sum of the corresponding attributes from
-     *         the arguments.
-     * @since 3.3
-     */
-    public static Rectangle add(Rectangle rect1, Rectangle rect2) {
-    	return new Rectangle(rect1.x + rect2.x, rect1.y + rect2.y, 
-    			rect1.width + rect2.width, rect1.height + rect2.height);
-    }
-    
-    /**
-     * Adds two points as 2d vectors. Returns a new point whose coordinates are
-     * the sum of the original two points.
-     * 
-     * @param point1 the first point (not null)
-     * @param point2 the second point (not null)
-     * @return a new point whose coordinates are the sum of the given points
-     * @since 3.0
-     */
-    public static Point add(Point point1, Point point2) {
-        return new Point(point1.x + point2.x, point1.y + point2.y);
-    }
-    
-    /**
-     * Divides both coordinates of the given point by the given scalar. 
-     * 
-     * @since 3.1 
-     *
-     * @param toDivide point to divide
-     * @param scalar denominator
-     * @return a new Point whose coordinates are equal to the original point divided by the scalar
-     */
-    public static Point divide(Point toDivide, int scalar) {
-        return new Point(toDivide.x / scalar, toDivide.y / scalar);
-    }
-    
-
-    /**
-     * Performs vector subtraction on two points. Returns a new point equal to
-     * (point1 - point2).
-     * 
-     * @param point1 initial point
-     * @param point2 vector to subtract
-     * @return the difference (point1 - point2)
-     * @since 3.0
-     */
-    public static Point subtract(Point point1, Point point2) {
-        return new Point(point1.x - point2.x, point1.y - point2.y);
-    }
-
-    /**
-     * Swaps the X and Y coordinates of the given point.
-     * 
-     * @param toFlip modifies this point
-     * @since 3.1
-     */
-    public static void flipXY(Point toFlip) {
-    	int temp = toFlip.x;
-    	toFlip.x = toFlip.y;
-    	toFlip.y = temp;
-    }
-
-    /**
-     * Swaps the X and Y coordinates of the given rectangle, along with the height and width.
-     * 
-     * @param toFlip modifies this rectangle
-     * @since 3.1
-     */
-    public static void flipXY(Rectangle toFlip) {
-    	int temp = toFlip.x;
-    	toFlip.x = toFlip.y;
-    	toFlip.y = temp;
-    	
-    	temp = toFlip.width;
-    	toFlip.width = toFlip.height;
-    	toFlip.height = temp;
-    }
-    
-    /**
-     * Returns the height or width of the given rectangle.
-     * 
-     * @param toMeasure rectangle to measure
-     * @param width returns the width if true, and the height if false
-     * @return the width or height of the given rectangle
-     * @since 3.0
-     */
-    public static int getDimension(Rectangle toMeasure, boolean width) {
-        if (width) {
-            return toMeasure.width;
-        }
-		return toMeasure.height;
-    }
-
-    /**
-     * Returns the x or y coordinates of the given point.
-     * 
-     * @param toMeasure point being measured
-     * @param width if true, returns x. Otherwise, returns y.
-     * @return the x or y coordinate
-     * @since 3.1
-     */
-    public static int getCoordinate(Point toMeasure, boolean width) {
-    	return width ? toMeasure.x : toMeasure.y;
-    }
-    
-    /**
-     * Returns the x or y coordinates of the given rectangle.
-     * 
-     * @param toMeasure rectangle being measured
-     * @param width if true, returns x. Otherwise, returns y.
-     * @return the x or y coordinate
-     * @since 3.1
-     */
-    public static int getCoordinate(Rectangle toMeasure, boolean width) {
-    	return width ? toMeasure.x : toMeasure.y;
-    }
-    
-    /**
-     * Sets one dimension of the given rectangle. Modifies the given rectangle.
-     * 
-     * @param toSet rectangle to modify
-     * @param width if true, the width is modified. If false, the height is modified.
-     * @param newCoordinate new value of the width or height
-     * @since 3.1
-     */
-    public static void setDimension(Rectangle toSet, boolean width, int newCoordinate) {
-    	if (width) {
-    		toSet.width = newCoordinate;
-    	} else {
-    		toSet.height = newCoordinate;
-    	}
-    }
-
-    /**
-     * Sets one coordinate of the given rectangle. Modifies the given rectangle.
-     * 
-     * @param toSet rectangle to modify
-     * @param width if true, the x coordinate is modified. If false, the y coordinate is modified.
-     * @param newCoordinate new value of the x or y coordinates
-     * @since 3.1
-     */
-    public static void setCoordinate(Rectangle toSet, boolean width, int newCoordinate) {
-    	if (width) {
-    		toSet.x = newCoordinate;
-    	} else {
-    		toSet.y = newCoordinate;
-    	}
-    }
-    
-    /**
-     * Sets one coordinate of the given point. Modifies the given point.
-     * 
-     * @param toSet point to modify
-     * @param width if true, the x coordinate is modified. If false, the y coordinate is modified.
-     * @param newCoordinate new value of the x or y coordinates
-     * @since 3.1
-     */
-    public static void setCoordinate(Point toSet, boolean width, int newCoordinate) {
-    	if (width) {
-    		toSet.x = newCoordinate;
-    	} else {
-    		toSet.y = newCoordinate;
-    	}
-    }
-    
-    /**
-     * Returns the distance of the given point from a particular side of the given rectangle.
-     * Returns negative values for points outside the rectangle.
-     * 
-     * @param rectangle a bounding rectangle
-     * @param testPoint a point to test
-     * @param edgeOfInterest side of the rectangle to test against
-     * @return the distance of the given point from the given edge of the rectangle
-     * @since 3.0
-     */
-    public static int getDistanceFromEdge(Rectangle rectangle, Point testPoint,
-            int edgeOfInterest) {
-        switch (edgeOfInterest) {
-        case SWT.TOP:
-            return testPoint.y - rectangle.y;
-        case SWT.BOTTOM:
-            return rectangle.y + rectangle.height - testPoint.y;
-        case SWT.LEFT:
-            return testPoint.x - rectangle.x;
-        case SWT.RIGHT:
-            return rectangle.x + rectangle.width - testPoint.x;
-        }
-
-        return 0;
-    }
-
-    /**
-     * Extrudes the given edge inward by the given distance. That is, if one side of the rectangle
-     * was sliced off with a given thickness, this returns the rectangle that forms the slice. Note
-     * that the returned rectangle will be inside the given rectangle if size > 0.
-     * 
-     * @param toExtrude the rectangle to extrude. The resulting rectangle will share three sides
-     * with this rectangle.
-     * @param size distance to extrude. A negative size will extrude outwards (that is, the resulting
-     * rectangle will overlap the original iff this is positive). 
-     * @param orientation the side to extrude.  One of SWT.LEFT, SWT.RIGHT, SWT.TOP, or SWT.BOTTOM. The 
-     * resulting rectangle will always share this side with the original rectangle.
-     * @return a rectangle formed by extruding the given side of the rectangle by the given distance.
-     * @since 3.0
-     */
-    public static Rectangle getExtrudedEdge(Rectangle toExtrude, int size,
-            int orientation) {
-        Rectangle bounds = new Rectangle(toExtrude.x, toExtrude.y,
-                toExtrude.width, toExtrude.height);
-
-        if (!isHorizontal(orientation)) {
-            bounds.width = size;
-        } else {
-            bounds.height = size;
-        }
-
-        switch (orientation) {
-        case SWT.RIGHT:
-            bounds.x = toExtrude.x + toExtrude.width - bounds.width;
-            break;
-        case SWT.BOTTOM:
-            bounds.y = toExtrude.y + toExtrude.height - bounds.height;
-            break;
-        }
-
-        normalize(bounds);
-
-        return bounds;
-    }
-
-    /**
-     * Returns the opposite of the given direction. That is, returns SWT.LEFT if
-     * given SWT.RIGHT and visa-versa.
-     * 
-     * @param swtDirectionConstant one of SWT.LEFT, SWT.RIGHT, SWT.TOP, or SWT.BOTTOM
-     * @return one of SWT.LEFT, SWT.RIGHT, SWT.TOP, or SWT.BOTTOM
-     * @since 3.0
-     */
-    public static int getOppositeSide(int swtDirectionConstant) {
-        switch (swtDirectionConstant) {
-        case SWT.TOP:
-            return SWT.BOTTOM;
-        case SWT.BOTTOM:
-            return SWT.TOP;
-        case SWT.LEFT:
-            return SWT.RIGHT;
-        case SWT.RIGHT:
-            return SWT.LEFT;
-        }
-
-        return swtDirectionConstant;
-    }
-
-    /**
-     * Converts the given boolean into an SWT orientation constant.
-     * 
-     * @param horizontal if true, returns SWT.HORIZONTAL. If false, returns SWT.VERTICAL 
-     * @return SWT.HORIZONTAL or SWT.VERTICAL.
-     * @since 3.0
-     */
-    public static int getSwtHorizontalOrVerticalConstant(boolean horizontal) {
-        if (horizontal) {
-            return SWT.HORIZONTAL;
-        }
-		return SWT.VERTICAL;
-    }
-
-    /**
-     * Returns true iff the given SWT side constant corresponds to a horizontal side
-     * of a rectangle. That is, returns true for the top and bottom but false for the
-     * left and right.
-     * 
-     * @param swtSideConstant one of SWT.TOP, SWT.BOTTOM, SWT.LEFT, or SWT.RIGHT
-     * @return true iff the given side is horizontal.
-     * @since 3.0
-     */
-    public static boolean isHorizontal(int swtSideConstant) {
-        return !(swtSideConstant == SWT.LEFT || swtSideConstant == SWT.RIGHT);
-    }
-
-    /**
-     * Moves the given rectangle by the given delta.
-     * 
-     * @param rect rectangle to move (will be modified)
-     * @param delta direction vector to move the rectangle by
-     * @since 3.0
-     */
-    public static void moveRectangle(Rectangle rect, Point delta) {
-        rect.x += delta.x;
-        rect.y += delta.y;
-    }
-
-    /**
-     * Moves each edge of the given rectangle outward by the given amount. Negative values
-     * cause the rectangle to contract. Does not allow the rectangle's width or height to be
-     * reduced below zero.
-     *  
-     * @param rect normalized rectangle to modify
-     * @param differenceRect difference rectangle to be added to rect
-     * @since 3.3
-     */
-    public static void expand(Rectangle rect, Rectangle differenceRect) {
-    	rect.x += differenceRect.x;
-    	rect.y += differenceRect.y;
-    	rect.height = Math.max(0, rect.height + differenceRect.height);
-    	rect.width = Math.max(0, rect.width + differenceRect.width);
-    }
-    
-    /**
-     * <p>Returns a rectangle which, when added to another rectangle, will expand each side
-     * by the given number of units.</p>
-     * 
-     * <p>This is commonly used to store margin sizes. For example:</p>
-     * 
-     * <code><pre>
-     *     // Expands the left, right, top, and bottom 
-     *     // of the given control by 10, 5, 1, and 15 units respectively
-     *      
-     *     Rectangle margins = Geometry.createDifferenceRect(10,5,1,15);
-     *     Rectangle bounds = someControl.getBounds();
-     *     someControl.setBounds(Geometry.add(bounds, margins));
-     * </pre></code>
-     * 
-     * @param left distance to expand the left side (negative values move the edge inward)
-     * @param right distance to expand the right side (negative values move the edge inward)
-     * @param top distance to expand the top (negative values move the edge inward)
-     * @param bottom distance to expand the bottom (negative values move the edge inward)
-     * 
-     * @return a difference rectangle that, when added to another rectangle, will cause each
-     * side to expand by the given number of units
-     * @since 3.3
-     */
-    public static Rectangle createDiffRectangle(int left, int right, int top, int bottom) {
-    	return new Rectangle(-left, -top, left + right, top + bottom);
-    }
-    
-    /**
-     * Moves each edge of the given rectangle outward by the given amount. Negative values
-     * cause the rectangle to contract. Does not allow the rectangle's width or height to be
-     * reduced below zero.
-     *  
-     * @param rect normalized rectangle to modify
-     * @param left distance to move the left edge outward (negative values move the edge inward)
-     * @param right distance to move the right edge outward (negative values move the edge inward) 
-     * @param top distance to move the top edge outward (negative values move the edge inward)
-     * @param bottom distance to move the bottom edge outward (negative values move the edge inward)
-     * @since 3.1
-     */
-    public static void expand(Rectangle rect, int left, int right, int top, int bottom) {
-        rect.x -= left;
-        rect.width = Math.max(0, rect.width + left + right);
-        rect.y -= top;
-        rect.height = Math.max(0, rect.height + top + bottom);
-    }
-    
-    /**
-     * Normalizes the given rectangle. That is, any rectangle with
-     * negative width or height becomes a rectangle with positive
-     * width or height that extends to the upper-left of the original
-     * rectangle. 
-     * 
-     * @param rect rectangle to modify
-     * @since 3.0
-     */
-    public static void normalize(Rectangle rect) {
-        if (rect.width < 0) {
-            rect.width = -rect.width;
-            rect.x -= rect.width;
-        }
-
-        if (rect.height < 0) {
-            rect.height = -rect.height;
-            rect.y -= rect.height;
-        }
-    }
-
-    /**
-     * Converts the given rectangle from display coordinates to the local coordinate system 
-     * of the given object into display coordinates.
-     * 
-     * @param coordinateSystem local coordinate system being converted to
-     * @param toConvert rectangle to convert
-     * @return a rectangle in control coordinates
-     * @since 3.0
-     */
-    public static Rectangle toControl(Control coordinateSystem,
-            Rectangle toConvert) {
-    	return(coordinateSystem.getDisplay().map
-    			(null,coordinateSystem,toConvert));
-    }
-
-    /**
-     * Converts the given rectangle from the local coordinate system of the given object
-     * into display coordinates.
-     * 
-     * @param coordinateSystem local coordinate system being converted from
-     * @param toConvert rectangle to convert
-     * @return a rectangle in display coordinates
-     * @since 3.0
-     */
-    public static Rectangle toDisplay(Control coordinateSystem,
-            Rectangle toConvert) {
-    	return(coordinateSystem.getDisplay().map
-    			(coordinateSystem,null,toConvert));   
-
-    }
-
-    /**
-     * Determines where the given point lies with respect to the given rectangle.
-     * Returns a combination of SWT.LEFT, SWT.RIGHT, SWT.TOP, and SWT.BOTTOM, combined
-     * with bitwise or (for example, returns SWT.TOP | SWT.LEFT if the point is to the
-     * upper-left of the rectangle). Returns 0 if the point lies within the rectangle.
-     * Positions are in screen coordinates (ie: a point is to the upper-left of the
-     * rectangle if its x and y coordinates are smaller than any point in the rectangle)
-     *  
-     * @param boundary normalized boundary rectangle 
-     * @param toTest point whose relative position to the rectangle is being computed
-     * @return one of SWT.LEFT | SWT.TOP, SWT.TOP, SWT.RIGHT | SWT.TOP, SWT.LEFT, 0,
-     * SWT.RIGHT, SWT.LEFT | SWT.BOTTOM, SWT.BOTTOM, SWT.RIGHT | SWT.BOTTOM
-     * @since 3.0
-     */
-    public static int getRelativePosition(Rectangle boundary, Point toTest) {
-        int result = 0;
-
-        if (toTest.x < boundary.x) {
-            result |= SWT.LEFT;
-        } else if (toTest.x >= boundary.x + boundary.width) {
-            result |= SWT.RIGHT;
-        }
-
-        if (toTest.y < boundary.y) {
-            result |= SWT.TOP;
-        } else if (toTest.y >= boundary.y + boundary.height) {
-            result |= SWT.BOTTOM;
-        }
-
-        return result;
-    }
-
-    /**
-     * Returns the distance from the point to the nearest edge of the given
-     * rectangle. Returns negative values if the point lies outside the rectangle.
-     * 
-     * @param boundary rectangle to test
-     * @param toTest point to test
-     * @return the distance between the given point and the nearest edge of the rectangle.
-     * Returns positive values for points inside the rectangle and negative values for points
-     * outside the rectangle.
-     * @since 3.1
-     */
-    public static int getDistanceFrom(Rectangle boundary, Point toTest) {
-        int side = getClosestSide(boundary, toTest);
-        return getDistanceFromEdge(boundary, toTest, side);
-    }
-    
-    /**
-     * Returns the edge of the given rectangle is closest to the given
-     * point.
-     * 
-     * @param boundary rectangle to test
-     * @param toTest point to compare
-     * @return one of SWT.LEFT, SWT.RIGHT, SWT.TOP, or SWT.BOTTOM
-     * 
-     * @since 3.0
-     */
-    public static int getClosestSide(Rectangle boundary, Point toTest) {
-        int[] sides = new int[] { SWT.LEFT, SWT.RIGHT, SWT.TOP, SWT.BOTTOM };
-
-        int closestSide = SWT.LEFT;
-        int closestDistance = Integer.MAX_VALUE;
-
-        for (int idx = 0; idx < sides.length; idx++) {
-            int side = sides[idx];
-
-            int distance = getDistanceFromEdge(boundary, toTest, side);
-
-            if (distance < closestDistance) {
-                closestDistance = distance;
-                closestSide = side;
-            }
-        }
-
-        return closestSide;
-    }
-
-    /**
-     * Returns a copy of the given rectangle
-     * 
-     * @param toCopy rectangle to copy
-     * @return a copy of the given rectangle
-     * @since 3.0
-     */
-    public static Rectangle copy(Rectangle toCopy) {
-        return new Rectangle(toCopy.x, toCopy.y, toCopy.width, toCopy.height);
-    }
-
-    /**
-     * Returns the size of the rectangle, as a Point
-     * 
-     * @param rectangle rectangle whose size is being computed
-     * @return the size of the given rectangle
-     * @since 3.0
-     */
-    public static Point getSize(Rectangle rectangle) {
-        return new Point(rectangle.width, rectangle.height);
-    }
-
-    /**
-     * Sets the size of the given rectangle to the given size
-     * 
-     * @param rectangle rectangle to modify
-     * @param newSize new size of the rectangle
-     * @since 3.0
-     */
-    public static void setSize(Rectangle rectangle, Point newSize) {
-        rectangle.width = newSize.x;
-        rectangle.height = newSize.y;
-    }
-
-    /**
-     * Sets the x,y position of the given rectangle. For a normalized
-     * rectangle (a rectangle with positive width and height), this will
-     * be the upper-left corner of the rectangle. 
-     * 
-     * @param rectangle rectangle to modify
-     * @param newLocation new location of the rectangle
-     * 
-     * @since 3.0
-     */
-    public static void setLocation(Rectangle rectangle, Point newLocation) {
-        rectangle.x = newLocation.x;
-        rectangle.y = newLocation.y;
-    }
-
-    /**
-     * Returns the x,y position of the given rectangle. For normalized rectangles
-     * (rectangles with positive width and height), this is the upper-left
-     * corner of the rectangle.
-     * 
-     * @param toQuery rectangle to query
-     * @return a Point containing the x,y position of the rectangle
-     * 
-     * @since 3.0
-     */
-    public static Point getLocation(Rectangle toQuery) {
-        return new Point(toQuery.x, toQuery.y);
-    }
-
-    /**
-     * Returns a new rectangle with the given position and dimensions, expressed
-     * as points.
-     * 
-     * @param position the (x,y) position of the rectangle
-     * @param size the size of the new rectangle, where (x,y) -> (width, height)
-     * @return a new Rectangle with the given position and size
-     * 
-     * @since 3.0
-     */
-    public static Rectangle createRectangle(Point position, Point size) {
-        return new Rectangle(position.x, position.y, size.x, size.y);
-    }
-    
-    /**
-	 * Repositions the 'inner' rectangle to lie completely within the bounds of the 'outer'
-	 * rectangle if possible. One use for this is to ensure that, when setting a control's bounds,
-	 * that they will always lie within its parent's client area (to avoid clipping).
-	 * 
-	 * @param inner The 'inner' rectangle to be repositioned (should be smaller than the 'outer' rectangle)
-	 * @param outer The 'outer' rectangle
-	 */
-	public static void moveInside(Rectangle inner, Rectangle outer) {
-		// adjust X
-		if (inner.x < outer.x) {
-			inner.x = outer.x;
-		}
-		if ((inner.x + inner.width) > (outer.x + outer.width)) {
-			inner.x -= (inner.x + inner.width) - (outer.x + outer.width);
-		}
-
-		// Adjust Y
-		if (inner.y < outer.y) {
-			inner.y = outer.y;
-		}
-		if ((inner.y + inner.height) > (outer.y + outer.height)) {
-			inner.y -= (inner.y + inner.height) - (outer.y + outer.height);
-		}
-	}
-    
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/ILogger.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/ILogger.java
deleted file mode 100644
index 5fe3a24..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/ILogger.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Chris Gross (schtoo@schtoo.com) - initial API and implementation
- *       (bug 49497 [RCP] JFace dependency on org.eclipse.core.runtime enlarges standalone JFace applications)
- *******************************************************************************/
-
-package org.eclipse.jface.util;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * A mechanism to log errors throughout JFace.
- * <p>
- * Clients may provide their own implementation to change
- * how errors are logged from within JFace.
- * </p>
- * 
- * @see org.eclipse.jface.util.Policy#getLog()
- * @see org.eclipse.jface.util.Policy#setLog(ILogger)
- * @since 3.1
- */
-public interface ILogger {
-	
-	/**
-	 * Logs the given status.
-	 * 
-	 * @param status the status to log
-	 */
-	public void log(IStatus status);
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/IOpenEventListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/IOpenEventListener.java
deleted file mode 100644
index f93ce54..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/IOpenEventListener.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.util;
-
-import org.eclipse.swt.events.SelectionEvent;
-
-/**
- * Listener for open events which are generated on selection
- * of default selection depending on the user preferences.
- * 
- * <p>
- * Usage:
- * <pre>
- *	OpenStrategy handler = new OpenStrategy(control);
- *	handler.addOpenListener(new IOpenEventListener() {
- *		public void handleOpen(SelectionEvent e) {
- *			... // code to handle the open event.
- *		}
- *	});
- * </pre>
- * </p>
- *
- * @see OpenStrategy
- */
-public interface IOpenEventListener {
-    /**
-     * Called when a selection or default selection occurs 
-     * depending on the user preference. 
-     * @param e the selection event
-     */
-    public void handleOpen(SelectionEvent e);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/IPropertyChangeListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/IPropertyChangeListener.java
deleted file mode 100644
index 4f4db8e..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/IPropertyChangeListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.util;
-
-import java.util.EventListener;
-
-/**
- * Listener for property changes.
- * <p>
- * Usage:
- * <pre>
- * IPropertyChangeListener listener =
- *   new IPropertyChangeListener() {
- *      public void propertyChange(PropertyChangeEvent event) {
- *         ... // code to deal with occurrence of property change
- *      }
- *   };
- * emitter.addPropertyChangeListener(listener);
- * ...
- * emitter.removePropertyChangeListener(listener);
- * </pre>
- * </p>
- */
-public interface IPropertyChangeListener extends EventListener {
-    /**
-     * Notification that a property has changed.
-     * <p>
-     * This method gets called when the observed object fires a property
-     * change event.
-     * </p>
-     *
-     * @param event the property change event object describing which property
-     * changed and how
-     */
-    public void propertyChange(PropertyChangeEvent event);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/ISafeRunnableRunner.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/ISafeRunnableRunner.java
deleted file mode 100644
index 0a045cb..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/ISafeRunnableRunner.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Chris Gross (schtoo@schtoo.com) - initial API and implementation
- *       (bug 49497 [RCP] JFace dependency on org.eclipse.core.runtime enlarges standalone JFace applications)
- *******************************************************************************/
-
-package org.eclipse.jface.util;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-
-/**
- * Runs a safe runnables.
- * <p>
- * Clients may provide their own implementation to change
- * how safe runnables are run from within JFace.
- * </p>
- * 
- * @see SafeRunnable#getRunner()
- * @see SafeRunnable#setRunner(ISafeRunnableRunner)
- * @see SafeRunnable#run(ISafeRunnable)
- * @since 3.1
- */
-public interface ISafeRunnableRunner {
-	
-	/**
-	 * Runs the runnable.  All <code>ISafeRunnableRunners</code> must catch any exception
-	 * thrown by the <code>ISafeRunnable</code> and pass the exception to 
-	 * <code>ISafeRunnable.handleException()</code>. 
-	 * @param code the code executed as a save runnable
-	 *
-	 * @see SafeRunnable#run(ISafeRunnable)
-	 */
-	public abstract void run(ISafeRunnable code);
-	
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/ListenerList.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/ListenerList.java
deleted file mode 100644
index 6ccc7cc..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/ListenerList.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.util;
-
-/**
- * This class is used to maintain a list of listeners, and is used in the
- * implementations of several classes within JFace which allow you to register
- * listeners of various kinds. It is a fairly lightweight object, occupying
- * minimal space when no listeners are registered.
- * <p>
- * Note that the <code>add</code> method checks for and eliminates duplicates
- * based on identity (not equality). Likewise, the <code>remove</code> method
- * compares based on identity.
- * </p>
- * <p>
- * Use the <code>getListeners</code> method when notifying listeners. Note
- * that no garbage is created if no listeners are registered. The recommended
- * code sequence for notifying all registered listeners of say,
- * <code>FooListener.eventHappened</code>, is:
- * 
- * <pre>
- * Object[] listeners = myListenerList.getListeners();
- * for (int i = 0; i &lt; listeners.length; ++i) {
- * 	((FooListener) listeners[i]).eventHappened(event);
- * }
- * </pre>
- * 
- * </p>
- * 
- * @deprecated Please use {@link org.eclipse.core.runtime.ListenerList} instead.
- *             Please note that the {@link #ListenerList(int)} and
- *             {@link org.eclipse.core.runtime.ListenerList#ListenerList(int)}
- *             constructors have different semantics. Please read the javadoc
- *             carefully. Also note that the equivalent of
- *             {@link #ListenerList()} is actually
- *             {@link org.eclipse.core.runtime.ListenerList#ListenerList(int)}
- *             with {@link org.eclipse.core.runtime.ListenerList#IDENTITY} as
- *             the argument.
- */
-public class ListenerList extends org.eclipse.core.runtime.ListenerList {
-
-	/**
-	 * Creates a listener list with an initial capacity of 1.
-	 */
-	public ListenerList() {
-		super(IDENTITY);
-	}
-
-	/**
-	 * Creates a listener list with the given initial capacity.
-	 * 
-	 * @param capacity
-	 *            the number of listeners which this list can initially accept
-	 *            without growing its internal representation; must be at least
-	 *            1
-	 */
-	public ListenerList(int capacity) {
-		// the runtime ListenerList does not support capacity
-		this();
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/LocalSelectionTransfer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/LocalSelectionTransfer.java
deleted file mode 100644
index 9ad62ca..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/LocalSelectionTransfer.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.util;
-
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.dnd.ByteArrayTransfer;
-import org.eclipse.swt.dnd.TransferData;
-
-/**
- * A LocalSelectionTransfer may be used for drag and drop operations
- * within the same instance of Eclipse.
- * The selection is made available directly for use in the DropTargetListener.
- * dropAccept method. The DropTargetEvent passed to dropAccept does not contain
- * the drop data. The selection may be used for validation purposes so that the
- * drop can be aborted if appropriate.
- *
- * This class is not intended to be subclassed.
- * 
- * @since 3.2
- */
-public class LocalSelectionTransfer extends ByteArrayTransfer {
-
-    // First attempt to create a UUID for the type name to make sure that
-    // different Eclipse applications use different "types" of
-    // <code>LocalSelectionTransfer</code>
-    private static final String TYPE_NAME = "local-selection-transfer-format" + (new Long(System.currentTimeMillis())).toString(); //$NON-NLS-1$;
-
-    private static final int TYPEID = registerType(TYPE_NAME);
-
-    private static final LocalSelectionTransfer INSTANCE = new LocalSelectionTransfer();
-
-    private ISelection selection;
-
-    private long selectionSetTime;
-
-    /**
-     * Only the singleton instance of this class may be used. 
-     */
-    protected LocalSelectionTransfer() {
-    	// do nothing
-    }
-
-    /**
-     * Returns the singleton.
-     * 
-     * @return the singleton
-     */
-    public static LocalSelectionTransfer getTransfer() {
-        return INSTANCE;
-    }
-
-    /**
-     * Returns the local transfer data.
-     * 
-     * @return the local transfer data
-     */
-    public ISelection getSelection() {
-        return selection;
-    }
-
-    /**
-     * Tests whether native drop data matches this transfer type.
-     * 
-     * @param result result of converting the native drop data to Java
-     * @return true if the native drop data does not match this transfer type.
-     * 	false otherwise.
-     */
-    private boolean isInvalidNativeType(Object result) {
-        return !(result instanceof byte[])
-                || !TYPE_NAME.equals(new String((byte[]) result));
-    }
-
-    /**
-     * Returns the type id used to identify this transfer.
-     * 
-     * @return the type id used to identify this transfer.
-     */
-    protected int[] getTypeIds() {
-        return new int[] { TYPEID };
-    }
-
-    /**
-     * Returns the type name used to identify this transfer.
-     * 
-     * @return the type name used to identify this transfer.
-     */
-    protected String[] getTypeNames() {
-        return new String[] { TYPE_NAME };
-    }
-
-    /**
-     * Overrides org.eclipse.swt.dnd.ByteArrayTransfer#javaToNative(Object,
-     * TransferData).
-     * Only encode the transfer type name since the selection is read and
-     * written in the same process.
-     * 
-     * @see org.eclipse.swt.dnd.ByteArrayTransfer#javaToNative(java.lang.Object, org.eclipse.swt.dnd.TransferData)
-     */
-    public void javaToNative(Object object, TransferData transferData) {
-        byte[] check = TYPE_NAME.getBytes();
-        super.javaToNative(check, transferData);
-    }
-
-    /**
-     * Overrides org.eclipse.swt.dnd.ByteArrayTransfer#nativeToJava(TransferData).
-     * Test if the native drop data matches this transfer type.
-     * 
-     * @see org.eclipse.swt.dnd.ByteArrayTransfer#nativeToJava(TransferData)
-     */
-    public Object nativeToJava(TransferData transferData) {
-        Object result = super.nativeToJava(transferData);
-        if (isInvalidNativeType(result)) {
-        	Policy.getLog().log(new Status(
-                            IStatus.ERROR,
-                            Policy.JFACE,
-                            IStatus.ERROR,
-                            JFaceResources.getString("LocalSelectionTransfer.errorMessage"), null)); //$NON-NLS-1$
-        }
-        return selection;
-    }
-
-    /**
-     * Sets the transfer data for local use.
-     * 
-     * @param s the transfer data
-     */
-    public void setSelection(ISelection s) {
-        selection = s;
-    }
-
-    /**
-     * Returns the time when the selection operation
-     * this transfer is associated with was started.
-     * 
-     * @return the time when the selection operation has started
-     * 
-     * @see org.eclipse.swt.events.TypedEvent#time
-     */
-    public long getSelectionSetTime() {
-        return selectionSetTime;
-    }
-
-    /**
-     * Sets the time when the selection operation this
-     * transfer is associated with was started.
-     * If assigning this from an SWT event, be sure to use
-     * <code>setSelectionTime(event.time & 0xFFFF)</code>
-     * 
-     * @param time the time when the selection operation was started
-     * 
-     * @see org.eclipse.swt.events.TypedEvent#time
-     */
-    public void setSelectionSetTime(long time) {
-        selectionSetTime = time;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/OpenStrategy.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/OpenStrategy.java
deleted file mode 100644
index 765be83..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/OpenStrategy.java
+++ /dev/null
@@ -1,481 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.util;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TableTree;
-import org.eclipse.swt.custom.TableTreeItem;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * Implementation of single-click and double-click strategies.
- * <p>
- * Usage:
- * <pre>
- *	OpenStrategy handler = new OpenStrategy(control);
- *	handler.addOpenListener(new IOpenEventListener() {
- *		public void handleOpen(SelectionEvent e) {
- *			... // code to handle the open event.
- *		}
- *	});
- * </pre>
- * </p>
- */
-public class OpenStrategy {
-    /** 
-     * Default behavior. Double click to open the item.
-     */
-    public static final int DOUBLE_CLICK = 0;
-
-    /** 
-     * Single click will open the item.
-     */
-    public static final int SINGLE_CLICK = 1;
-
-    /** 
-     * Hover will select the item.
-     */
-    public static final int SELECT_ON_HOVER = 1 << 1;
-
-    /**
-     * Open item when using arrow keys
-     */
-    public static final int ARROW_KEYS_OPEN = 1 << 2;
-
-    /** A single click will generate
-     * an open event but key arrows will not do anything.
-     * 
-     * @deprecated
-     */
-    public static final int NO_TIMER = SINGLE_CLICK;
-
-    /** A single click will generate an open
-     * event and key arrows will generate an open event after a
-     * small time.
-     * 
-     * @deprecated
-     */
-    public static final int FILE_EXPLORER = SINGLE_CLICK | ARROW_KEYS_OPEN;
-
-    /** Pointing to an item will change the selection
-     * and a single click will gererate an open event
-     * 
-     * @deprecated
-     */
-    public static final int ACTIVE_DESKTOP = SINGLE_CLICK | SELECT_ON_HOVER;
-
-    // Time used in FILE_EXPLORER and ACTIVE_DESKTOP
-    // Not declared final, see bug 246209
-    private static int TIME = 500;
-
-    /* SINGLE_CLICK or DOUBLE_CLICK;
-     * In case of SINGLE_CLICK, the bits SELECT_ON_HOVER and ARROW_KEYS_OPEN
-     * my be set as well. */
-    private static int CURRENT_METHOD = DOUBLE_CLICK;
-
-    private Listener eventHandler;
-
-    private ListenerList openEventListeners = new ListenerList();
-
-    private ListenerList selectionEventListeners = new ListenerList();
-
-    private ListenerList postSelectionEventListeners = new ListenerList();
-
-    /**
-     * @param control the control the strategy is applied to
-     */
-    public OpenStrategy(Control control) {
-        initializeHandler(control.getDisplay());
-        addListener(control);
-    }
-
-    /**
-     * Adds an IOpenEventListener to the collection of openEventListeners
-     * @param listener the listener to add
-     */
-    public void addOpenListener(IOpenEventListener listener) {
-        openEventListeners.add(listener);
-    }
-
-    /**
-     * Removes an IOpenEventListener to the collection of openEventListeners
-     * @param listener the listener to remove
-     */
-    public void removeOpenListener(IOpenEventListener listener) {
-        openEventListeners.remove(listener);
-    }
-
-    /**
-     * Adds an SelectionListener to the collection of selectionEventListeners
-     * @param listener the listener to add
-     */
-    public void addSelectionListener(SelectionListener listener) {
-        selectionEventListeners.add(listener);
-    }
-
-    /**
-     * Removes an SelectionListener to the collection of selectionEventListeners
-     * @param listener the listener to remove
-     */
-    public void removeSelectionListener(SelectionListener listener) {
-        selectionEventListeners.remove(listener);
-    }
-
-    /**
-     * Adds an SelectionListener to the collection of selectionEventListeners
-     * @param listener the listener to add
-     */
-    public void addPostSelectionListener(SelectionListener listener) {
-        postSelectionEventListeners.add(listener);
-    }
-
-    /**
-     * Removes an SelectionListener to the collection of selectionEventListeners
-     * @param listener the listener to remove
-     */
-    public void removePostSelectionListener(SelectionListener listener) {
-        postSelectionEventListeners.remove(listener);
-    }
-
-    /**
-     * This method is internal to the framework; it should not be implemented outside
-     * the framework.
-     * @return the current used single/double-click method
-     * 
-     */
-    public static int getOpenMethod() {
-        return CURRENT_METHOD;
-    }
-
-    /**
-     * Set the current used single/double-click method.
-     * 
-     * This method is internal to the framework; it should not be implemented outside
-     * the framework.
-     * @param method the method to be used
-     * @see OpenStrategy#DOUBLE_CLICK
-     * @see OpenStrategy#SINGLE_CLICK
-     * @see OpenStrategy#SELECT_ON_HOVER
-     * @see OpenStrategy#ARROW_KEYS_OPEN
-     */
-    public static void setOpenMethod(int method) {
-        if (method == DOUBLE_CLICK) {
-            CURRENT_METHOD = method;
-            return;
-        }
-        if ((method & SINGLE_CLICK) == 0) {
-			throw new IllegalArgumentException("Invalid open mode"); //$NON-NLS-1$
-		}
-        if ((method & (SINGLE_CLICK | SELECT_ON_HOVER | ARROW_KEYS_OPEN)) == 0) {
-			throw new IllegalArgumentException("Invalid open mode"); //$NON-NLS-1$
-		}
-        CURRENT_METHOD = method;
-    }
-
-    /**
-     * @return true if editors should be activated when opened. 
-     */
-    public static boolean activateOnOpen() {
-        return getOpenMethod() == DOUBLE_CLICK;
-    }
-
-    /*
-     * Adds all needed listener to the control in order to implement
-     * single-click/double-click strategies.
-     */
-    private void addListener(Control c) {
-        c.addListener(SWT.MouseEnter, eventHandler);
-        c.addListener(SWT.MouseExit, eventHandler);
-        c.addListener(SWT.MouseMove, eventHandler);
-        c.addListener(SWT.MouseDown, eventHandler);
-        c.addListener(SWT.MouseUp, eventHandler);
-        c.addListener(SWT.KeyDown, eventHandler);
-        c.addListener(SWT.Selection, eventHandler);
-        c.addListener(SWT.DefaultSelection, eventHandler);
-        c.addListener(SWT.Collapse, eventHandler);
-        c.addListener(SWT.Expand, eventHandler);
-    }
-
-    /*
-     * Fire the selection event to all selectionEventListeners
-     */
-    private void fireSelectionEvent(SelectionEvent e) {
-        if (e.item != null && e.item.isDisposed()) {
-			return;
-		}
-        Object l[] = selectionEventListeners.getListeners();
-        for (int i = 0; i < l.length; i++) {
-            ((SelectionListener) l[i]).widgetSelected(e);
-        }
-    }
-
-    /*
-     * Fire the default selection event to all selectionEventListeners
-     */
-    private void fireDefaultSelectionEvent(SelectionEvent e) {
-        Object l[] = selectionEventListeners.getListeners();
-        for (int i = 0; i < l.length; i++) {
-            ((SelectionListener) l[i]).widgetDefaultSelected(e);
-        }
-    }
-
-    /*
-     * Fire the post selection event to all postSelectionEventListeners
-     */
-    private void firePostSelectionEvent(SelectionEvent e) {
-        if (e.item != null && e.item.isDisposed()) {
-			return;
-		}
-        Object l[] = postSelectionEventListeners.getListeners();
-        for (int i = 0; i < l.length; i++) {
-            ((SelectionListener) l[i]).widgetSelected(e);
-        }
-    }
-
-    /*
-     * Fire the open event to all openEventListeners
-     */
-    private void fireOpenEvent(SelectionEvent e) {
-        if (e.item != null && e.item.isDisposed()) {
-			return;
-		}
-        Object l[] = openEventListeners.getListeners();
-        for (int i = 0; i < l.length; i++) {
-            ((IOpenEventListener) l[i]).handleOpen(e);
-        }
-    }
-
-    //Initialize event handler.
-    private void initializeHandler(final Display display) {
-        eventHandler = new Listener() {
-            boolean timerStarted = false;
-
-            Event mouseUpEvent = null;
-
-            Event mouseMoveEvent = null;
-
-            SelectionEvent selectionPendent = null;
-
-            boolean enterKeyDown = false;
-
-            SelectionEvent defaultSelectionPendent = null;
-
-            boolean arrowKeyDown = false;
-
-            final int[] count = new int[1];
-
-            long startTime = System.currentTimeMillis();
-
-            boolean collapseOccurred = false;
-
-            boolean expandOccurred = false;
-
-            public void handleEvent(final Event e) {
-                if (e.type == SWT.DefaultSelection) {
-                    SelectionEvent event = new SelectionEvent(e);
-                    fireDefaultSelectionEvent(event);
-                    if (CURRENT_METHOD == DOUBLE_CLICK) {
-                        fireOpenEvent(event);
-                    } else {
-                        if (enterKeyDown) {
-                            fireOpenEvent(event);
-                            enterKeyDown = false;
-                            defaultSelectionPendent = null;
-                        } else {
-                            defaultSelectionPendent = event;
-                        }
-                    }
-                    return;
-                }
-
-                switch (e.type) {
-                case SWT.MouseEnter:
-                case SWT.MouseExit:
-                    mouseUpEvent = null;
-                    mouseMoveEvent = null;
-                    selectionPendent = null;
-                    break;
-                case SWT.MouseMove:
-                    if ((CURRENT_METHOD & SELECT_ON_HOVER) == 0) {
-						return;
-					}
-                    if (e.stateMask != 0) {
-						return;
-					}
-                    if (e.widget.getDisplay().getFocusControl() != e.widget) {
-						return;
-					}
-                    mouseMoveEvent = e;
-                    final Runnable runnable[] = new Runnable[1];
-                    runnable[0] = new Runnable() {
-                        public void run() {
-                            long time = System.currentTimeMillis();
-                            int diff = (int) (time - startTime);
-                            if (diff <= TIME) {
-                                display.timerExec(diff * 2 / 3, runnable[0]);
-                            } else {
-                                timerStarted = false;
-                                setSelection(mouseMoveEvent);
-                            }
-                        }
-                    };
-                    startTime = System.currentTimeMillis();
-                    if (!timerStarted) {
-                        timerStarted = true;
-                        display.timerExec(TIME * 2 / 3, runnable[0]);
-                    }
-                    break;
-                case SWT.MouseDown:
-                    mouseUpEvent = null;
-                    arrowKeyDown = false;
-                    break;
-                case SWT.Expand:
-                    expandOccurred = true;
-                    break;
-                case SWT.Collapse:
-                    collapseOccurred = true;
-                    break;
-                case SWT.MouseUp:
-                    mouseMoveEvent = null;
-                    if ((e.button != 1) || ((e.stateMask & ~SWT.BUTTON1) != 0)) {
-						return;
-					}
-                    if (selectionPendent != null
-                            && !(collapseOccurred || expandOccurred)) {
-                        mouseSelectItem(selectionPendent);
-                    } else {
-                        mouseUpEvent = e;
-                        collapseOccurred = false;
-                        expandOccurred = false;
-                    }
-                    break;
-                case SWT.KeyDown:
-                    mouseMoveEvent = null;
-                    mouseUpEvent = null;
-                    arrowKeyDown = ((e.keyCode == SWT.ARROW_UP) || (e.keyCode == SWT.ARROW_DOWN))
-                            && e.stateMask == 0;
-                    if (e.character == SWT.CR) {
-                        if (defaultSelectionPendent != null) {
-                            fireOpenEvent(new SelectionEvent(e));
-                            enterKeyDown = false;
-                            defaultSelectionPendent = null;
-                        } else {
-                            enterKeyDown = true;
-                        }
-                    }
-                    break;
-                case SWT.Selection:
-                    SelectionEvent event = new SelectionEvent(e);
-                    fireSelectionEvent(event);
-                    mouseMoveEvent = null;
-                    if (mouseUpEvent != null) {
-						mouseSelectItem(event);
-					} else {
-						selectionPendent = event;
-					}
-                    count[0]++;
-                    final int id = count[0];
-                    // In the case of arrowUp/arrowDown when in the arrowKeysOpen mode, we
-                    // want to delay any selection until the last arrowDown/Up occurs.  This
-                    // handles the case where the user presses arrowDown/Up successively.
-                    // We only want to open an editor for the last selected item.
-                    display.asyncExec(new Runnable() {
-                        public void run() {
-                            if (arrowKeyDown) {
-                                display.timerExec(TIME, new Runnable() {
-
-                                    public void run() {
-                                        if (id == count[0]) {
-                                            firePostSelectionEvent(new SelectionEvent(
-                                                    e));
-                                            if ((CURRENT_METHOD & ARROW_KEYS_OPEN) != 0) {
-												fireOpenEvent(new SelectionEvent(
-                                                        e));
-											}
-                                        }
-                                    }
-                                });
-                            } else {
-                                firePostSelectionEvent(new SelectionEvent(e));
-                            }
-                        }
-                    });
-                    break;
-                }
-            }
-
-            void mouseSelectItem(SelectionEvent e) {
-                if ((CURRENT_METHOD & SINGLE_CLICK) != 0) {
-					fireOpenEvent(e);
-				}
-                mouseUpEvent = null;
-                selectionPendent = null;
-            }
-
-            void setSelection(Event e) {
-                if (e == null) {
-					return;
-				}
-                Widget w = e.widget;
-                if (w.isDisposed()) {
-					return;
-				}
-
-                SelectionEvent selEvent = new SelectionEvent(e);
-
-                /*ISSUE: May have to create a interface with method:
-                 setSelection(Point p) so that user's custom widgets 
-                 can use this class. If we keep this option. */
-                if (w instanceof Tree) {
-                    Tree tree = (Tree) w;
-                    TreeItem item = tree.getItem(new Point(e.x, e.y));
-                    if (item != null) {
-						tree.setSelection(new TreeItem[] { item });
-					}
-                    selEvent.item = item;
-                } else if (w instanceof Table) {
-                    Table table = (Table) w;
-                    TableItem item = table.getItem(new Point(e.x, e.y));
-                    if (item != null) {
-						table.setSelection(new TableItem[] { item });
-					}
-                    selEvent.item = item;
-                } else if (w instanceof TableTree) {
-                    TableTree table = (TableTree) w;
-                    TableTreeItem item = table.getItem(new Point(e.x, e.y));
-                    if (item != null) {
-						table.setSelection(new TableTreeItem[] { item });
-					}
-                    selEvent.item = item;
-                } else {
-                    return;
-                }
-                if (selEvent.item == null) {
-					return;
-				}
-                fireSelectionEvent(selEvent);
-                firePostSelectionEvent(selEvent);
-            }
-        };
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/Policy.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/Policy.java
deleted file mode 100644
index c3219d8..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/Policy.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Chris Gross (schtoo@schtoo.com) - support for ILogger added
- *       (bug 49497 [RCP] JFace dependency on org.eclipse.core.runtime enlarges standalone JFace applications)
- *******************************************************************************/
-package org.eclipse.jface.util;
-
-import java.util.Comparator;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.AnimatorFactory;
-import org.eclipse.jface.dialogs.ErrorSupportProvider;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * The Policy class handles settings for behaviour, debug flags and logging
- * within JFace.
- * 
- * @since 3.0
- */
-public class Policy {
-
-	/**
-	 * Constant for the the default setting for debug options.
-	 */
-	public static final boolean DEFAULT = false;
-
-	/**
-	 * The unique identifier of the JFace plug-in.
-	 */
-	public static final String JFACE = "org.eclipse.jface"; //$NON-NLS-1$
-
-	private static ILogger log;
-
-	private static Comparator viewerComparator;
-
-	private static AnimatorFactory animatorFactory;
-
-	/**
-	 * A flag to indicate whether unparented dialogs should be checked.
-	 */
-	public static boolean DEBUG_DIALOG_NO_PARENT = DEFAULT;
-
-	/**
-	 * A flag to indicate whether actions are being traced.
-	 */
-	public static boolean TRACE_ACTIONS = DEFAULT;
-
-	/**
-	 * A flag to indicate whether toolbars are being traced.
-	 */
-
-	public static boolean TRACE_TOOLBAR = DEFAULT;
-
-	private static ErrorSupportProvider errorSupportProvider;
-
-	private static StatusHandler statusHandler;
-
-	/**
-	 * Returns the dummy log to use if none has been set
-	 */
-	private static ILogger getDummyLog() {
-		return new ILogger() {
-			public void log(IStatus status) {
-				System.err.println(status.getMessage());
-				if (status.getException() != null) {
-					status.getException().printStackTrace(System.err);
-				}
-			}
-		};
-	}
-
-	/**
-	 * Sets the logger used by JFace to log errors.
-	 * 
-	 * @param logger
-	 *            the logger to use, or <code>null</code> to use the default
-	 *            logger
-	 * @since 3.1
-	 */
-	public static void setLog(ILogger logger) {
-		log = logger;
-	}
-
-	/**
-	 * Returns the logger used by JFace to log errors.
-	 * <p>
-	 * The default logger prints the status to <code>System.err</code>.
-	 * </p>
-	 * 
-	 * @return the logger
-	 * @since 3.1
-	 */
-	public static ILogger getLog() {
-		if (log == null) {
-			log = getDummyLog();
-		}
-		return log;
-	}
-
-	/**
-	 * Sets the status handler used by JFace to handle statuses.
-	 * 
-	 * @param status
-	 *            the handler to use, or <code>null</code> to use the default
-	 *            one
-	 * @since 3.4
-	 */
-	public static void setStatusHandler(StatusHandler status) {
-		statusHandler = status;
-	}
-
-	/**
-	 * Returns the status handler used by JFace to handle statuses.
-	 * 
-	 * @return the status handler
-	 * @since 3.4
-	 */
-	public static StatusHandler getStatusHandler() {
-		if (statusHandler == null) {
-			statusHandler = getDummyStatusHandler();
-		}
-		return statusHandler;
-	}
-
-	private static StatusHandler getDummyStatusHandler() {
-		return new StatusHandler() {
-			private SafeRunnableDialog dialog;
-
-			public void show(final IStatus status, String title) {
-				Runnable runnable = new Runnable() {
-					public void run() {
-						if (dialog == null || dialog.getShell().isDisposed()) {
-							dialog = new SafeRunnableDialog(status);
-							dialog.create();
-							dialog.getShell().addDisposeListener(
-									new DisposeListener() {
-										public void widgetDisposed(
-												DisposeEvent e) {
-											dialog = null;
-										}
-									});
-							dialog.open();
-						} else {
-							dialog.addStatus(status);
-							dialog.refresh();
-						}
-					}
-				};
-				if (Display.getCurrent() != null) {
-					runnable.run();
-				} else {
-					Display.getDefault().asyncExec(runnable);
-				}
-			}
-		};
-	}
-
-	/**
-	 * Return the default comparator used by JFace to sort strings.
-	 * 
-	 * @return a default comparator used by JFace to sort strings
-	 */
-	private static Comparator getDefaultComparator() {
-		return new Comparator() {
-			/**
-			 * Compares string s1 to string s2.
-			 * 
-			 * @param s1
-			 *            string 1
-			 * @param s2
-			 *            string 2
-			 * @return Returns an integer value. Value is less than zero if
-			 *         source is less than target, value is zero if source and
-			 *         target are equal, value is greater than zero if source is
-			 *         greater than target.
-			 * @exception ClassCastException
-			 *                the arguments cannot be cast to Strings.
-			 */
-			public int compare(Object s1, Object s2) {
-				return ((String) s1).compareTo((String) s2);
-			}
-		};
-	}
-
-	/**
-	 * Return the comparator used by JFace to sort strings.
-	 * 
-	 * @return the comparator used by JFace to sort strings
-	 * @since 3.2
-	 */
-	public static Comparator getComparator() {
-		if (viewerComparator == null) {
-			viewerComparator = getDefaultComparator();
-		}
-		return viewerComparator;
-	}
-
-	/**
-	 * Sets the comparator used by JFace to sort strings.
-	 * 
-	 * @param comparator
-	 *            comparator used by JFace to sort strings
-	 * @since 3.2
-	 */
-	public static void setComparator(Comparator comparator) {
-		org.eclipse.core.runtime.Assert.isTrue(viewerComparator == null);
-		viewerComparator = comparator;
-	}
-
-	/**
-	 * Sets the animator factory used by JFace to create control animator
-	 * instances.
-	 * 
-	 * @param factory
-	 *            the AnimatorFactory to use.
-	 * @since 3.2
-	 * @deprecated this is no longer in use as of 3.3
-	 */
-	public static void setAnimatorFactory(AnimatorFactory factory) {
-		animatorFactory = factory;
-	}
-
-	/**
-	 * Returns the animator factory used by JFace to create control animator
-	 * instances.
-	 * 
-	 * @return the animator factory used to create control animator instances.
-	 * @since 3.2
-	 * @deprecated this is no longer in use as of 3.3
-	 */
-	public static AnimatorFactory getAnimatorFactory() {
-		if (animatorFactory == null)
-			animatorFactory = new AnimatorFactory();
-		return animatorFactory;
-	}
-
-	/**
-	 * Set the error support provider for error dialogs.
-	 * 
-	 * @param provider
-	 * @since 3.3
-	 */
-	public static void setErrorSupportProvider(ErrorSupportProvider provider) {
-		errorSupportProvider = provider;
-	}
-
-	/**
-	 * Return the ErrorSupportProvider for the receiver.
-	 * 
-	 * @return ErrorSupportProvider or <code>null</code> if this has not been
-	 *         set
-	 * @since 3.3
-	 */
-	public static ErrorSupportProvider getErrorSupportProvider() {
-		return errorSupportProvider;
-	}
-
-	/**
-	 * Log the Exception to the logger.
-	 * 
-	 * @param exception
-	 * @since 3.4
-	 */
-	public static void logException(Exception exception) {
-		getLog().log(
-				new Status(IStatus.ERROR, JFACE, exception
-						.getLocalizedMessage(), exception));
-
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/PropertyChangeEvent.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/PropertyChangeEvent.java
deleted file mode 100644
index 186f478..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/PropertyChangeEvent.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.util;
-
-import java.util.EventObject;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * An event object describing a change to a named property.
- * <p>
- * This concrete class was designed to be instantiated, but may
- * also be subclassed if required.
- * </p>
- * <p>
- * The JFace frameworks contain classes that report property 
- * change events for internal state changes that may be of interest
- * to external parties. A special listener interface
- * (<code>IPropertyChangeListener</code>) is defined for this purpose,
- * and a typical class allow listeners to be registered via
- * an <code>addPropertyChangeListener</code> method.
- * </p>
- *
- * @see IPropertyChangeListener
- */
-public class PropertyChangeEvent extends EventObject {
-
-    /**
-     * Generated serial version UID for this class.
-     * @since 3.1
-     */
-    private static final long serialVersionUID = 3256726173533811256L;
-
-    /**
-     * The name of the changed property.
-     */
-    private String propertyName;
-
-    /**
-     * The old value of the changed property, or <code>null</code> if
-     * not known or not relevant.
-     */
-    private Object oldValue;
-
-    /**
-     * The new value of the changed property, or <code>null</code> if
-     * not known or not relevant.
-     */
-    private Object newValue;
-
-    /**
-     * Creates a new property change event.
-     *
-     * @param source the object whose property has changed
-     * @param property the property that has changed (must not be <code>null</code>)
-     * @param oldValue the old value of the property, or <code>null</code> if none
-     * @param newValue the new value of the property, or <code>null</code> if none
-     */
-    public PropertyChangeEvent(Object source, String property, Object oldValue,
-            Object newValue) {
-        super(source);
-        Assert.isNotNull(property);
-        this.propertyName = property;
-        this.oldValue = oldValue;
-        this.newValue = newValue;
-    }
-
-    /**
-     * Returns the new value of the property.
-     *
-     * @return the new value, or <code>null</code> if not known
-     *  or not relevant (for instance if the property was removed).
-     */
-    public Object getNewValue() {
-        return newValue;
-    }
-
-    /**
-     * Returns the old value of the property.
-     *
-     * @return the old value, or <code>null</code> if not known
-     *  or not relevant (for instance if the property was just
-     *  added and there was no old value).
-     */
-    public Object getOldValue() {
-        return oldValue;
-    }
-
-    /**
-     * Returns the name of the property that changed.
-     * <p>
-     * Warning: there is no guarantee that the property name returned
-     * is a constant string.  Callers must compare property names using
-     * equals, not ==.
-     * </p>
-     *
-     * @return the name of the property that changed
-     */
-    public String getProperty() {
-        return propertyName;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/SafeRunnable.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/SafeRunnable.java
deleted file mode 100644
index 62ef4cc..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/SafeRunnable.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Chris Gross (schtoo@schtoo.com) - support for ISafeRunnableRunner added
- *       (bug 49497 [RCP] JFace dependency on org.eclipse.core.runtime enlarges standalone JFace applications)
- *******************************************************************************/
-package org.eclipse.jface.util;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.JFaceResources;
-
-/**
- * Implements a default implementation of ISafeRunnable. The default
- * implementation of <code>handleException</code> opens a dialog to show any
- * errors as they accumulate.
- * <p>
- * This may be executed on any thread.
- */
-public abstract class SafeRunnable implements ISafeRunnable {
-
-	private static boolean ignoreErrors = false;
-
-	private static ISafeRunnableRunner runner;
-
-	private String message;
-
-	/**
-	 * Creates a new instance of SafeRunnable with a default error message.
-	 */
-	public SafeRunnable() {
-		// do nothing
-	}
-
-	/**
-	 * Creates a new instance of SafeRunnable with the given error message.
-	 * 
-	 * @param message
-	 *            the error message to use
-	 */
-	public SafeRunnable(String message) {
-		this.message = message;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-	 */
-	public void handleException(Throwable e) {
-		// Workaround to avoid interactive error dialogs during
-		// automated testing
-		if (ignoreErrors)
-			return;
-
-		if (message == null)
-			message = JFaceResources.getString("SafeRunnable.errorMessage"); //$NON-NLS-1$
-
-		Policy.getStatusHandler().show(
-				new Status(IStatus.ERROR, Policy.JFACE, message, e),
-				JFaceResources.getString("SafeRunnable.errorMessage")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Flag to avoid interactive error dialogs during automated testing.
-	 * 
-	 * @param flag
-	 * @return true if errors should be ignored
-	 * @deprecated use getIgnoreErrors()
-	 */
-	public static boolean getIgnoreErrors(boolean flag) {
-		return ignoreErrors;
-	}
-
-	/**
-	 * Flag to avoid interactive error dialogs during automated testing.
-	 * 
-	 * @return true if errors should be ignored
-	 * 
-	 * @since 3.0
-	 */
-	public static boolean getIgnoreErrors() {
-		return ignoreErrors;
-	}
-
-	/**
-	 * Flag to avoid interactive error dialogs during automated testing.
-	 * 
-	 * @param flag
-	 *            set to true if errors should be ignored
-	 */
-	public static void setIgnoreErrors(boolean flag) {
-		ignoreErrors = flag;
-	}
-
-	/**
-	 * Returns the safe runnable runner.
-	 * 
-	 * @return the safe runnable runner
-	 * 
-	 * @since 3.1
-	 */
-	public static ISafeRunnableRunner getRunner() {
-		if (runner == null) {
-			runner = createDefaultRunner();
-		}
-		return runner;
-	}
-
-	/**
-	 * Creates the default safe runnable runner.
-	 * 
-	 * @return the default safe runnable runner
-	 * @since 3.1
-	 */
-	private static ISafeRunnableRunner createDefaultRunner() {
-		return new ISafeRunnableRunner() {
-			public void run(ISafeRunnable code) {
-				try {
-					code.run();
-				} catch (Exception e) {
-					handleException(code, e);
-				} catch (LinkageError e) {
-					handleException(code, e);
-				}
-			}
-
-			private void handleException(ISafeRunnable code, Throwable e) {
-				if (!(e instanceof OperationCanceledException)) {
-					try {
-						Policy.getLog()
-								.log(
-										new Status(IStatus.ERROR, Policy.JFACE,
-												IStatus.ERROR,
-												"Exception occurred", e)); //$NON-NLS-1$
-					} catch (Exception ex) {
-						e.printStackTrace();
-					}
-				}
-				code.handleException(e);
-			}
-		};
-	}
-
-	/**
-	 * Sets the safe runnable runner.
-	 * 
-	 * @param runner
-	 *            the runner to set, or <code>null</code> to reset to the
-	 *            default runner
-	 * @since 3.1
-	 */
-	public static void setRunner(ISafeRunnableRunner runner) {
-		SafeRunnable.runner = runner;
-	}
-
-	/**
-	 * Runs the given safe runnable using the safe runnable runner. This is a
-	 * convenience method, equivalent to:
-	 * <code>SafeRunnable.getRunner().run(runnable)</code>.
-	 * 
-	 * @param runnable
-	 *            the runnable to run
-	 * @since 3.1
-	 */
-	public static void run(ISafeRunnable runnable) {
-		getRunner().run(runnable);
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/SafeRunnableDialog.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/SafeRunnableDialog.java
deleted file mode 100644
index 561090a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/SafeRunnableDialog.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.CellLabelProvider;
-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.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * SafeRunnableDialog is a dialog that can show the results of multiple safe
- * runnable errors.
- * 
- */
-class SafeRunnableDialog extends ErrorDialog {
-
-	private TableViewer statusListViewer;
-
-	private Collection statuses = new ArrayList();
-
-	/**
-	 * Create a new instance of the receiver on a status.
-	 * 
-	 * @param status
-	 *            The status to display.
-	 */
-	SafeRunnableDialog(IStatus status) {
-
-		super(null, JFaceResources.getString("error"), status.getMessage(), //$NON-NLS-1$
-				status, IStatus.ERROR);
-
-		setShellStyle(SWT.DIALOG_TRIM | SWT.MODELESS | SWT.RESIZE | SWT.MIN | SWT.MAX
-				| getDefaultOrientation());
-
-		setStatus(status);
-		statuses.add(status);
-		
-		setBlockOnOpen(false);
-
-		String reason = JFaceResources
-				.getString("SafeRunnableDialog_checkDetailsMessage"); //$NON-NLS-1$
-		if (status.getException() != null) {
-			reason = status.getException().getMessage() == null ? status
-					.getException().toString() : status.getException()
-					.getMessage();
-		}
-		this.message = JFaceResources.format(JFaceResources
-				.getString("SafeRunnableDialog_reason"), new Object[] { //$NON-NLS-1$
-				status.getMessage(), reason });
-	}
-
-	/**
-	 * Method which should be invoked when new errors become available for
-	 * display
-	 */
-	void refresh() {
-
-		if (AUTOMATED_MODE)
-			return;
-
-		createStatusList((Composite) dialogArea);
-		updateEnablements();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.ErrorDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Control area = super.createDialogArea(parent);
-		createStatusList((Composite) area);
-		return area;
-	}
-
-	/**
-	 * Create the status list if required.
-	 * 
-	 * @param parent
-	 *            the Control to create it in.
-	 */
-	private void createStatusList(Composite parent) {
-		if (isMultipleStatusDialog()) {
-			if (statusListViewer == null) {
-				// The job list doesn't exist so create it.
-				setMessage(JFaceResources
-						.getString("SafeRunnableDialog_MultipleErrorsMessage")); //$NON-NLS-1$
-				getShell()
-						.setText(
-								JFaceResources
-										.getString("SafeRunnableDialog_MultipleErrorsTitle")); //$NON-NLS-1$
-				createStatusListArea(parent);
-				showDetailsArea();
-			}
-			refreshStatusList();
-		}
-	}
-
-	/*
-	 * Update the button enablements
-	 */
-	private void updateEnablements() {
-		Button details = getButton(IDialogConstants.DETAILS_ID);
-		if (details != null) {
-			details.setEnabled(true);
-		}
-	}
-
-	/**
-	 * This method sets the message in the message label.
-	 * 
-	 * @param messageString -
-	 *            the String for the message area
-	 */
-	private void setMessage(String messageString) {
-		// must not set null text in a label
-		message = messageString == null ? "" : messageString; //$NON-NLS-1$
-		if (messageLabel == null || messageLabel.isDisposed()) {
-			return;
-		}
-		messageLabel.setText(message);
-	}
-
-	/**
-	 * Create an area that allow the user to select one of multiple jobs that
-	 * have reported errors
-	 * 
-	 * @param parent -
-	 *            the parent of the area
-	 */
-	private void createStatusListArea(Composite parent) {
-		// Display a list of jobs that have reported errors
-		statusListViewer = new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL
-				| SWT.V_SCROLL | SWT.BORDER);
-		statusListViewer.setComparator(getViewerComparator());
-		Control control = statusListViewer.getControl();
-		GridData data = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
-		data.heightHint = convertHeightInCharsToPixels(10);
-		control.setLayoutData(data);
-		statusListViewer.setContentProvider(getStatusContentProvider());
-		statusListViewer.setLabelProvider(getStatusListLabelProvider());
-		statusListViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						handleSelectionChange();
-					}
-				});
-		applyDialogFont(parent);
-		statusListViewer.setInput(this);
-	}
-
-	/**
-	 * Return the label provider for the status list.
-	 * 
-	 * @return CellLabelProvider
-	 */
-	private CellLabelProvider getStatusListLabelProvider() {
-		return new CellLabelProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.CellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell)
-			 */
-			public void update(ViewerCell cell) {
-				cell.setText(((IStatus) cell.getElement()).getMessage());
-
-			}
-		};
-	}
-
-	/**
-	 * Return the content provider for the statuses.
-	 * 
-	 * @return IStructuredContentProvider
-	 */
-	private IStructuredContentProvider getStatusContentProvider() {
-		return new IStructuredContentProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				return statuses.toArray();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-
-			}
-		};
-	}
-
-	/*
-	 * Return whether there are multiple errors to be displayed
-	 */
-	private boolean isMultipleStatusDialog() {
-		return statuses.size() > 1;
-	}
-
-	/**
-	 * Return a viewer sorter for looking at the jobs.
-	 * 
-	 * @return ViewerSorter
-	 */
-	private ViewerComparator getViewerComparator() {
-		return new ViewerComparator() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public int compare(Viewer testViewer, Object e1, Object e2) {
-				String message1 = ((IStatus) e1).getMessage();
-				String message2 = ((IStatus) e2).getMessage();
-				if (message1 == null)
-					return 1;
-				if (message2 == null)
-					return -1;
-
-				return message1.compareTo(message2);
-			}
-		};
-	}
-
-	/**
-	 * Refresh the contents of the viewer.
-	 */
-	void refreshStatusList() {
-		if (statusListViewer != null
-				&& !statusListViewer.getControl().isDisposed()) {
-			statusListViewer.refresh();
-			Point newSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT);
-			getShell().setSize(newSize);
-		}
-	}
-
-	/**
-	 * Get the single selection. Return null if the selection is not just one
-	 * element.
-	 * 
-	 * @return IStatus or <code>null</code>.
-	 */
-	private IStatus getSingleSelection() {
-		ISelection rawSelection = statusListViewer.getSelection();
-		if (rawSelection != null
-				&& rawSelection instanceof IStructuredSelection) {
-			IStructuredSelection selection = (IStructuredSelection) rawSelection;
-			if (selection.size() == 1) {
-				return (IStatus) selection.getFirstElement();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * The selection in the multiple job list has changed. Update widget
-	 * enablements and repopulate the list.
-	 */
-	void handleSelectionChange() {
-		IStatus newSelection = getSingleSelection();
-		setStatus(newSelection);
-		updateEnablements();
-		showDetailsArea();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.ErrorDialog#shouldShowDetailsButton()
-	 */
-	protected boolean shouldShowDetailsButton() {
-		return true;
-	}
-
-	/**
-	 * Add the status to the receiver.
-	 * @param status
-	 */
-	public void addStatus(IStatus status) {
-		statuses.add(status);
-		refresh();
-		
-	}
-
-	
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/StatusHandler.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/StatusHandler.java
deleted file mode 100644
index a5db69d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/StatusHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.util;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * A mechanism to handle statuses throughout JFace.
- * <p>
- * Clients may provide their own implementation to change how statuses are
- * handled from within JFace.
- * </p>
- * 
- * @see org.eclipse.jface.util.Policy#getStatusHandler()
- * @see org.eclipse.jface.util.Policy#setStatusHandler(StatusHandler)
- * 
- * @since 3.4
- */
-abstract public class StatusHandler {
-    
-	/**
-	 * Show the given status.
-	 * 
-	 * @param status
-	 *            status to handle
-	 * @param title
-	 *            title for the status
-	 */
-	abstract public void show(IStatus status, String title);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/TransferDragSourceListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/TransferDragSourceListener.java
deleted file mode 100644
index 7fc3685..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/TransferDragSourceListener.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.util;
-
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.Transfer;
-
-/**
- * A <code>TransferDragSourceListener</code> is a <code>DragSourceListener</code> 
- * that can handle one type of SWT {@link Transfer}. 
- * The purpose of a <code>TransferDragSourceListener</code> is to:
- * <ul>
- *   <li>Determine enablement for a drag operation. A <code>TransferDragSourceListener</code>
- * 	will not be used in a drag operation if the <code>DragSourceEvent#doit</code> field 
- * 	is set to false in <code>DragSourceListener#dragStart(DragSourceEvent)</code>.
- *   <li>Set data for a single type of drag and <code>Transfer</code> type.
- * </ul>
- * <p>
- * A <code>DelegatingDragAdapter</code> allows these functions to be implemented 
- * separately for unrelated types of drags. <code>DelegatingDragAdapter</code> then 
- * combines the function of each <code>TransferDragSourceListener</code>, while 
- * allowing them to be implemented as if they were the only <code>DragSourceListener</code>.
- * </p>
- * @since 3.0
- */
-public interface TransferDragSourceListener extends DragSourceListener {
-    /**
-     * Returns the <code>Transfer</code> type that this listener can provide data for.
-     * 
-     * @return the <code>Transfer</code> associated with this listener
-     */
-    Transfer getTransfer();
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/TransferDropTargetListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/TransferDropTargetListener.java
deleted file mode 100644
index cec4b9b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/TransferDropTargetListener.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.util;
-
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.DropTargetListener;
-import org.eclipse.swt.dnd.Transfer;
-
-/**
- * A <code>TransferDropTargetListener</code> is a <code>DropTragetListener</code> 
- * that handles one type of SWT {@link Transfer}. 
- * The purpose of a <code>TransferDropTargetListener</code> is to:
- * <ul>
- *   <li>Determine enablement for a drop operation. A <code>TransferDropTargetListener</code>
- * 		will not be used if <code>isEnabled</code> returns false. 
- *   <li>When enabled, optionally show feedback on the <code>DropTarget</code>.
- *   <li>Perform the actual drop
- * </ul>
- * A <code>DelegatingDropAdapter</code> allows these functions to be implemented 
- * separately for unrelated types of drags. <code>DelegatingDropAdapter</code> then 
- * combines the function of each <code>TransferDropTargetListener</code>, while 
- * allowing them to be implemented as if they were the only <code>DragSourceListener</code>.
- * @since 3.0
- */
-public interface TransferDropTargetListener extends DropTargetListener {
-    /**
-     * Returns the <code>Transfer</code> type that this listener can 
-     * accept a drop operation for.
-     * 
-     * @return the <code>Transfer</code> for this listener
-     */
-    Transfer getTransfer();
-
-    /**
-     * Returns <code>true</code> if this listener can handle the drop
-     * based on the given <code>DropTargetEvent</code>.
-     * <p>
-     * This method is called by the <code>DelegatingDropAdapter</code> only
-     * if the <code>DropTargetEvent</code> contains a transfer data type
-     * supported by this listener. The <code>Transfer</code> returned by the 
-     * <code>#getTransfer()</code> method is used for this purpose.
-     * </p>
-     * 
-     * @param event the drop target event
-     * @return <code>true</code> if the listener is enabled for the given
-     * 	drop target event.
-     */
-    boolean isEnabled(DropTargetEvent event);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/Util.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/Util.java
deleted file mode 100644
index abcecfa..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/Util.java
+++ /dev/null
@@ -1,647 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.util;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-import org.eclipse.swt.SWT;
-
-/**
- * <p>
- * A static class providing utility methods to all of JFace.
- * </p>
- * 
- * @since 3.1
- */
-public final class Util {
-
-	/**
-	 * An unmodifiable, empty, sorted set. This value is guaranteed to never
-	 * change and never be <code>null</code>.
-	 */
-	public static final SortedSet EMPTY_SORTED_SET = Collections
-			.unmodifiableSortedSet(new TreeSet());
-
-	/**
-	 * A common zero-length string. It avoids needing write <code>NON-NLS</code>
-	 * next to code fragments. It's also a bit clearer to read.
-	 */
-	public static final String ZERO_LENGTH_STRING = ""; //$NON-NLS-1$
-
-	/**
-	 * Verifies that the given object is an instance of the given class.
-	 * 
-	 * @param object
-	 *            The object to check; may be <code>null</code>.
-	 * @param c
-	 *            The class which the object should be; must not be
-	 *            <code>null</code>.
-	 */
-	public static final void assertInstance(final Object object, final Class c) {
-		assertInstance(object, c, false);
-	}
-
-	/**
-	 * Verifies the given object is an instance of the given class. It is
-	 * possible to specify whether the object is permitted to be
-	 * <code>null</code>.
-	 * 
-	 * @param object
-	 *            The object to check; may be <code>null</code>.
-	 * @param c
-	 *            The class which the object should be; must not be
-	 *            <code>null</code>.
-	 * @param allowNull
-	 *            Whether the object is allowed to be <code>null</code>.
-	 */
-	private static final void assertInstance(final Object object,
-			final Class c, final boolean allowNull) {
-		if (object == null && allowNull) {
-			return;
-		}
-
-		if (object == null || c == null) {
-			throw new NullPointerException();
-		} else if (!c.isInstance(object)) {
-			throw new IllegalArgumentException();
-		}
-	}
-
-	/**
-	 * Compares two boolean values. <code>false</code> is considered to be
-	 * "less than" <code>true</code>.
-	 * 
-	 * @param left
-	 *            The left value to compare
-	 * @param right
-	 *            The right value to compare
-	 * @return <code>-1</code> if the left is <code>false</code> and the
-	 *         right is <code>true</code>. <code>1</code> if the opposite
-	 *         is true. If they are equal, then it returns <code>0</code>.
-	 */
-	public static final int compare(final boolean left, final boolean right) {
-		return left == false ? (right == true ? -1 : 0) : 1;
-	}
-
-	/**
-	 * Compares two integer values.
-	 * 
-	 * @param left
-	 *            The left value to compare
-	 * @param right
-	 *            The right value to compare
-	 * @return <code>left - right</code>
-	 */
-	public static final int compare(final int left, final int right) {
-		return left - right;
-	}
-
-	/**
-	 * Compares to comparable objects -- defending against <code>null</code>.
-	 * 
-	 * @param left
-	 *            The left object to compare; may be <code>null</code>.
-	 * @param right
-	 *            The right object to compare; may be <code>null</code>.
-	 * @return The result of the comparison. <code>null</code> is considered
-	 *         to be the least possible value.
-	 */
-	public static final int compare(final Comparable left,
-			final Comparable right) {
-		if (left == null && right == null) {
-			return 0;
-		} else if (left == null) {
-			return -1;
-		} else if (right == null) {
-			return 1;
-		} else {
-			return left.compareTo(right);
-		}
-	}
-
-	/**
-	 * Compares two arrays of comparable objects -- accounting for
-	 * <code>null</code>.
-	 * 
-	 * @param left
-	 *            The left array to be compared; may be <code>null</code>.
-	 * @param right
-	 *            The right array to be compared; may be <code>null</code>.
-	 * @return The result of the comparison. <code>null</code> is considered
-	 *         to be the least possible value. A shorter array is considered
-	 *         less than a longer array.
-	 */
-	public static final int compare(final Comparable[] left,
-			final Comparable[] right) {
-		if (left == null && right == null) {
-			return 0;
-		} else if (left == null) {
-			return -1;
-		} else if (right == null) {
-			return 1;
-		} else {
-			int l = left.length;
-			int r = right.length;
-
-			if (l != r) {
-				return l - r;
-			}
-
-			for (int i = 0; i < l; i++) {
-				int compareTo = compare(left[i], right[i]);
-
-				if (compareTo != 0) {
-					return compareTo;
-				}
-			}
-
-			return 0;
-		}
-	}
-
-	/**
-	 * Compares two lists -- account for <code>null</code>. The lists must
-	 * contain comparable objects.
-	 * 
-	 * @param left
-	 *            The left list to compare; may be <code>null</code>. This
-	 *            list must only contain instances of <code>Comparable</code>.
-	 * @param right
-	 *            The right list to compare; may be <code>null</code>. This
-	 *            list must only contain instances of <code>Comparable</code>.
-	 * @return The result of the comparison. <code>null</code> is considered
-	 *         to be the least possible value. A shorter list is considered less
-	 *         than a longer list.
-	 */
-	public static final int compare(final List left, final List right) {
-		if (left == null && right == null) {
-			return 0;
-		} else if (left == null) {
-			return -1;
-		} else if (right == null) {
-			return 1;
-		} else {
-			int l = left.size();
-			int r = right.size();
-
-			if (l != r) {
-				return l - r;
-			}
-
-			for (int i = 0; i < l; i++) {
-				int compareTo = compare((Comparable) left.get(i),
-						(Comparable) right.get(i));
-
-				if (compareTo != 0) {
-					return compareTo;
-				}
-			}
-
-			return 0;
-		}
-	}
-
-	/**
-	 * Tests whether the first array ends with the second array.
-	 * 
-	 * @param left
-	 *            The array to check (larger); may be <code>null</code>.
-	 * @param right
-	 *            The array that should be a subsequence (smaller); may be
-	 *            <code>null</code>.
-	 * @param equals
-	 *            Whether the two array are allowed to be equal.
-	 * @return <code>true</code> if the second array is a subsequence of the
-	 *         array list, and they share end elements.
-	 */
-	public static final boolean endsWith(final Object[] left,
-			final Object[] right, final boolean equals) {
-		if (left == null || right == null) {
-			return false;
-		}
-
-		int l = left.length;
-		int r = right.length;
-
-		if (r > l || !equals && r == l) {
-			return false;
-		}
-
-		for (int i = 0; i < r; i++) {
-			if (!equals(left[l - i - 1], right[r - i - 1])) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * Checks whether the two objects are <code>null</code> -- allowing for
-	 * <code>null</code>.
-	 * 
-	 * @param left
-	 *            The left object to compare; may be <code>null</code>.
-	 * @param right
-	 *            The right object to compare; may be <code>null</code>.
-	 * @return <code>true</code> if the two objects are equivalent;
-	 *         <code>false</code> otherwise.
-	 */
-	public static final boolean equals(final Object left, final Object right) {
-		return left == null ? right == null : ((right != null) && left
-				.equals(right));
-	}
-
-	/**
-	 * Tests whether two arrays of objects are equal to each other. The arrays
-	 * must not be <code>null</code>, but their elements may be
-	 * <code>null</code>.
-	 * 
-	 * @param leftArray
-	 *            The left array to compare; may be <code>null</code>, and
-	 *            may be empty and may contain <code>null</code> elements.
-	 * @param rightArray
-	 *            The right array to compare; may be <code>null</code>, and
-	 *            may be empty and may contain <code>null</code> elements.
-	 * @return <code>true</code> if the arrays are equal length and the
-	 *         elements at the same position are equal; <code>false</code>
-	 *         otherwise.
-	 */
-	public static final boolean equals(final Object[] leftArray,
-			final Object[] rightArray) {
-		if (leftArray == rightArray) {
-			return true;
-		}
-
-		if (leftArray == null) {
-			return (rightArray == null);
-		} else if (rightArray == null) {
-			return false;
-		}
-
-		if (leftArray.length != rightArray.length) {
-			return false;
-		}
-
-		for (int i = 0; i < leftArray.length; i++) {
-			final Object left = leftArray[i];
-			final Object right = rightArray[i];
-			final boolean equal = (left == null) ? (right == null) : (left
-					.equals(right));
-			if (!equal) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * Provides a hash code based on the given integer value.
-	 * 
-	 * @param i
-	 *            The integer value
-	 * @return <code>i</code>
-	 */
-	public static final int hashCode(final int i) {
-		return i;
-	}
-
-	/**
-	 * Provides a hash code for the object -- defending against
-	 * <code>null</code>.
-	 * 
-	 * @param object
-	 *            The object for which a hash code is required.
-	 * @return <code>object.hashCode</code> or <code>0</code> if
-	 *         <code>object</code> if <code>null</code>.
-	 */
-	public static final int hashCode(final Object object) {
-		return object != null ? object.hashCode() : 0;
-	}
-
-	/**
-	 * Computes the hash code for an array of objects, but with defense against
-	 * <code>null</code>.
-	 * 
-	 * @param objects
-	 *            The array of objects for which a hash code is needed; may be
-	 *            <code>null</code>.
-	 * @return The hash code for <code>objects</code>; or <code>0</code> if
-	 *         <code>objects</code> is <code>null</code>.
-	 */
-	public static final int hashCode(final Object[] objects) {
-		if (objects == null) {
-			return 0;
-		}
-
-		int hashCode = 89;
-		for (int i = 0; i < objects.length; i++) {
-			final Object object = objects[i];
-			if (object != null) {
-				hashCode = hashCode * 31 + object.hashCode();
-			}
-		}
-
-		return hashCode;
-	}
-
-	/**
-	 * Checks whether the second array is a subsequence of the first array, and
-	 * that they share common starting elements.
-	 * 
-	 * @param left
-	 *            The first array to compare (large); may be <code>null</code>.
-	 * @param right
-	 *            The second array to compare (small); may be <code>null</code>.
-	 * @param equals
-	 *            Whether it is allowed for the two arrays to be equivalent.
-	 * @return <code>true</code> if the first arrays starts with the second
-	 *         list; <code>false</code> otherwise.
-	 */
-	public static final boolean startsWith(final Object[] left,
-			final Object[] right, final boolean equals) {
-		if (left == null || right == null) {
-			return false;
-		}
-
-		int l = left.length;
-		int r = right.length;
-
-		if (r > l || !equals && r == l) {
-			return false;
-		}
-
-		for (int i = 0; i < r; i++) {
-			if (!equals(left[i], right[i])) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * Converts an array into a string representation that is suitable for
-	 * debugging.
-	 * 
-	 * @param array
-	 *            The array to convert; may be <code>null</code>.
-	 * @return The string representation of the array; never <code>null</code>.
-	 */
-	public static final String toString(final Object[] array) {
-		if (array == null) {
-			return "null"; //$NON-NLS-1$
-		}
-
-		final StringBuffer buffer = new StringBuffer();
-		buffer.append('[');
-
-		final int length = array.length;
-		for (int i = 0; i < length; i++) {
-			if (i != 0) {
-				buffer.append(',');
-			}
-			final Object object = array[i];
-			final String element = String.valueOf(object);
-			buffer.append(element);
-		}
-		buffer.append(']');
-
-		return buffer.toString();
-	}
-
-	/**
-	 * Provides a translation of a particular key from the resource bundle.
-	 * 
-	 * @param resourceBundle
-	 *            The key to look up in the resource bundle; should not be
-	 *            <code>null</code>.
-	 * @param key
-	 *            The key to look up in the resource bundle; should not be
-	 *            <code>null</code>.
-	 * @param defaultString
-	 *            The value to return if the resource cannot be found; may be
-	 *            <code>null</code>.
-	 * @return The value of the translated resource at <code>key</code>. If
-	 *         the key cannot be found, then it is simply the
-	 *         <code>defaultString</code>.
-	 */
-	public static final String translateString(
-			final ResourceBundle resourceBundle, final String key,
-			final String defaultString) {
-		if (resourceBundle != null && key != null) {
-			try {
-				final String translatedString = resourceBundle.getString(key);
-
-				if (translatedString != null) {
-					return translatedString;
-				}
-			} catch (MissingResourceException eMissingResource) {
-				// Such is life. We'll return the key
-			}
-		}
-
-		return defaultString;
-	}
-	
-	/**
-	 * Foundation replacement for String.replaceAll(*).
-	 * 
-	 * @param src the starting string.
-	 * @param find the string to find.
-	 * @param replacement the string to replace.
-	 * @return The new string.
-	 * @since 3.4
-	 */
-	public static final String replaceAll(String src, String find, String replacement) {
-		final int len = src.length();
-		final int findLen = find.length();
-
-		int idx = src.indexOf(find);
-		if (idx < 0) {
-			return src;
-		}
-
-		StringBuffer buf = new StringBuffer();
-		int beginIndex = 0;
-		while (idx != -1 && idx < len) {
-			buf.append(src.substring(beginIndex, idx));
-			buf.append(replacement);
-			
-			beginIndex = idx + findLen;
-			if (beginIndex < len) {
-				idx = src.indexOf(find, beginIndex);
-			} else {
-				idx = -1;
-			}
-		}
-		if (beginIndex<len) {
-			buf.append(src.substring(beginIndex, (idx==-1?len:idx)));
-		}
-		return buf.toString();
-	}
-	
-	//
-	// Methods for working with the windowing system
-	//
-	
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @since 3.5
-	 */
-	public static final String WS_WIN32 = "win32";//$NON-NLS-1$
-
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @since 3.5
-	 */
-	public static final String WS_MOTIF = "motif";//$NON-NLS-1$
-
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @since 3.5
-	 */
-	public static final String WS_GTK = "gtk";//$NON-NLS-1$
-
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @since 3.5
-	 */
-	public static final String WS_PHOTON = "photon";//$NON-NLS-1$
-
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @since 3.5
-	 */
-	public static final String WS_CARBON = "carbon";//$NON-NLS-1$
-
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @since 3.5
-	 */
-	public static final String WS_COCOA = "cocoa";//$NON-NLS-1$
-
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @since 3.5
-	 */
-	public static final String WS_WPF = "wpf";//$NON-NLS-1$
-
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @since 3.5
-	 */
-	public static final String WS_UNKNOWN = "unknown";//$NON-NLS-1$
-	
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @return <code>true</code> for windows platforms
-	 * @since 3.5
-	 */
-	public static final boolean isWindows() {
-		final String ws = SWT.getPlatform();
-		return WS_WIN32.equals(ws) || WS_WPF.equals(ws);
-	}
-	
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @return <code>true</code> for mac platforms
-	 * @since 3.5
-	 */
-	public static final boolean isMac() {
-		final String ws = SWT.getPlatform();
-		return WS_CARBON.equals(ws) || WS_COCOA.equals(ws);
-	}
-	
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @return <code>true</code> for gtk platforms
-	 * @since 3.5
-	 */
-	public static final boolean isGtk() {
-		final String ws = SWT.getPlatform();
-		return WS_GTK.equals(ws);
-	}
-	
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @return <code>true</code> for motif platforms
-	 * @since 3.5
-	 */
-	public static final boolean isMotif() {
-		final String ws = SWT.getPlatform();
-		return WS_MOTIF.equals(ws);
-	}
-	
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @return <code>true</code> for photon platforms
-	 * @since 3.5
-	 */
-	public static final boolean isPhoton() {
-		final String ws = SWT.getPlatform();
-		return WS_PHOTON.equals(ws);
-	}
-	
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @return <code>true</code> for carbon platforms
-	 * @since 3.5
-	 */
-	public static final boolean isCarbon() {
-		final String ws = SWT.getPlatform();
-		return WS_CARBON.equals(ws);
-	}
-	
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @return <code>true</code> for WPF
-	 * @since 3.5
-	 */
-	public static final boolean isWpf() {
-		final String ws = SWT.getPlatform();
-		return WS_WPF.equals(ws);
-	}
-	
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @return <code>true</code> for win32
-	 * @since 3.5
-	 */
-	public static final boolean isWin32() {
-		final String ws = SWT.getPlatform();
-		return WS_WIN32.equals(ws);
-	}
-	
-	/**
-	 * <b>Note:</b> this may be made internal in 3.5
-	 * @return the SWT windowing platform string.
-	 * @see SWT#getPlatform()
-	 * @since 3.5
-	 */
-	public static final String getWS() {
-		return SWT.getPlatform();
-	}
-
-	/**
-	 * This class should never be constructed.
-	 */
-	private Util() {
-		// Not allowed.
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/util/package.html
deleted file mode 100644
index 4b1d4a8..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/util/package.html
+++ /dev/null
@@ -1,15 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides useful building blocks used throughout JFace,
-including property change events, a listener list implementation, and runtime
-checked assertions.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractComboBoxCellEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractComboBoxCellEditor.java
deleted file mode 100644
index 63dd381..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractComboBoxCellEditor.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation (bug 174739)
- ******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Abstract base class for Cell-Editors presented as combo boxes
- *
- * @since 3.4
- *
- */
-abstract class AbstractComboBoxCellEditor extends CellEditor {
-	/**
-	 * The list is dropped down when the activation is done through the mouse
-	 */
-	public static final int DROP_DOWN_ON_MOUSE_ACTIVATION = 1;
-
-	/**
-	 * The list is dropped down when the activation is done through the keyboard
-	 */
-	public static final int DROP_DOWN_ON_KEY_ACTIVATION = 1 << 1;
-
-	/**
-	 * The list is dropped down when the activation is done without
-	 * ui-interaction
-	 */
-	public static final int DROP_DOWN_ON_PROGRAMMATIC_ACTIVATION = 1 << 2;
-
-	/**
-	 * The list is dropped down when the activation is done by traversing from
-	 * cell to cell
-	 */
-	public static final int DROP_DOWN_ON_TRAVERSE_ACTIVATION = 1 << 3;
-
-	private int activationStyle = SWT.NONE;
-
-	/**
-	 * Create a new cell-editor
-	 *
-	 * @param parent
-	 *            the parent of the combo
-	 * @param style
-	 *            the style used to create the combo
-	 */
-	AbstractComboBoxCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/**
-	 * Creates a new cell editor with no control and no st of choices.
-	 * Initially, the cell editor has no cell validator.
-	 *
-	 */
-	AbstractComboBoxCellEditor() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.CellEditor#activate(org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent)
-	 */
-	public void activate(ColumnViewerEditorActivationEvent activationEvent) {
-		super.activate(activationEvent);
-		if (activationStyle != SWT.NONE) {
-			boolean dropDown = false;
-			if ((activationEvent.eventType == ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION || activationEvent.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION)
-					&& (activationStyle & DROP_DOWN_ON_MOUSE_ACTIVATION) != 0 ) {
-				dropDown = true;
-			} else if (activationEvent.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED
-					&& (activationStyle & DROP_DOWN_ON_KEY_ACTIVATION) != 0 ) {
-				dropDown = true;
-			} else if (activationEvent.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC
-					&& (activationStyle & DROP_DOWN_ON_PROGRAMMATIC_ACTIVATION) != 0) {
-				dropDown = true;
-			} else if (activationEvent.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
-					&& (activationStyle & DROP_DOWN_ON_TRAVERSE_ACTIVATION) != 0) {
-				dropDown = true;
-			}
-
-			if (dropDown) {
-				getControl().getDisplay().asyncExec(new Runnable() {
-
-					public void run() {
-						((CCombo) getControl()).setListVisible(true);
-					}
-
-				});
-
-			}
-		}
-	}
-
-	/**
-	 * This method allows to control how the combo reacts when activated
-	 *
-	 * @param activationStyle
-	 *            the style used
-	 */
-	public void setActivationStyle(int activationStyle) {
-		this.activationStyle = activationStyle;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractListViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractListViewer.java
deleted file mode 100644
index 3d505c8..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractListViewer.java
+++ /dev/null
@@ -1,550 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Chris Longfield <clongfield@internap.com> - Fix for Bug 70856
- *     Tom Schindl - fix for bug 157309
- *     Brad Reynolds - bug 141435
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * Abstract base class for viewers that contain lists of items (such as a combo or list).
- * Most of the viewer implementation is in this base class, except for the minimal code that
- * actually communicates with the underlying widget.
- * 
- * @see org.eclipse.jface.viewers.ListViewer
- * @see org.eclipse.jface.viewers.ComboViewer
- * 
- * @since 3.0
- */
-public abstract class AbstractListViewer extends StructuredViewer {
-
-    /**
-     * A list of viewer elements (element type: <code>Object</code>).
-     */
-    private java.util.List listMap = new ArrayList();
-
-    /**
-     * Adds the given string to the underlying widget at the given index
-     *  
-     * @param string the string to add
-     * @param index position to insert the string into
-     */
-    protected abstract void listAdd(String string, int index);
-
-    /**
-     * Sets the text of the item at the given index in the underlying widget.
-     * 
-     * @param index index to modify
-     * @param string new text
-     */
-    protected abstract void listSetItem(int index, String string);
-
-    /**
-     * Returns the zero-relative indices of the items which are currently
-     * selected in the underlying widget.  The array is empty if no items are selected.
-     * <p>
-     * Note: This is not the actual structure used by the receiver
-     * to maintain its selection, so modifying the array will
-     * not affect the receiver. 
-     * </p>
-     * @return the array of indices of the selected items
-     */
-    protected abstract int[] listGetSelectionIndices();
-
-    /**
-     * Returns the number of items contained in the underlying widget.
-     *
-     * @return the number of items
-     */
-    protected abstract int listGetItemCount();
-
-    /**
-     * Sets the underlying widget's items to be the given array of items.
-     *
-     * @param labels the array of label text
-     */
-    protected abstract void listSetItems(String[] labels);
-
-    /**
-     * Removes all of the items from the underlying widget.
-     */
-    protected abstract void listRemoveAll();
-
-    /**
-     * Removes the item from the underlying widget at the given
-     * zero-relative index.
-     * 
-     * @param index the index for the item
-     */
-    protected abstract void listRemove(int index);
-
-    /**
-     * Selects the items at the given zero-relative indices in the underlying widget.
-     * The current selection is cleared before the new items are selected.
-     * <p>
-     * Indices that are out of range and duplicate indices are ignored.
-     * If the receiver is single-select and multiple indices are specified,
-     * then all indices are ignored.
-     *
-     * @param ixs the indices of the items to select
-     */
-    protected abstract void listSetSelection(int[] ixs);
-
-    /**
-     * Shows the selection.  If the selection is already showing in the receiver,
-     * this method simply returns.  Otherwise, the items are scrolled until
-     * the selection is visible.
-     */
-    protected abstract void listShowSelection();
-
-    /**
-     * Deselects all selected items in the underlying widget.
-     */
-    protected abstract void listDeselectAll();
-
-    /**
-     * Adds the given elements to this list viewer.
-     * If this viewer does not have a sorter, the elements are added at the end
-     * in the order given; otherwise the elements are inserted at appropriate positions.
-     * <p>
-     * This method should be called (by the content provider) when elements 
-     * have been added to the model, in order to cause the viewer to accurately
-     * reflect the model. This method only affects the viewer, not the model.
-     * </p>
-     *
-     * @param elements the elements to add
-     */
-    public void add(Object[] elements) {
-        assertElementsNotNull(elements);
-        Object[] filtered = filter(elements);
-        ILabelProvider labelProvider = (ILabelProvider) getLabelProvider();
-        for (int i = 0; i < filtered.length; i++) {
-            Object element = filtered[i];
-            int ix = indexForElement(element);
-            insertItem(labelProvider, element, ix);
-        }
-    }
-    
-    private void insertItem(ILabelProvider labelProvider, Object element, int index) {
-        listAdd(getLabelProviderText(labelProvider, element), index);
-		listMap.add(index, element);
-		mapElement(element, getControl()); // must map it, since findItem only looks in map, if enabled
-    }
-    
-    /**
-	 * Inserts the given element into this list viewer at the given position.
-	 * If this viewer has a sorter, the position is ignored and the element is
-	 * inserted at the correct position in the sort order.
-	 * <p>
-	 * This method should be called (by the content provider) when elements have
-	 * been added to the model, in order to cause the viewer to accurately
-	 * reflect the model. This method only affects the viewer, not the model.
-	 * </p>
-	 * 
-	 * @param element
-	 *            the element
-	 * @param position
-	 *            a 0-based position relative to the model, or -1 to indicate
-	 *            the last position
-	 * @since 3.3
-	 */
-    public void insert(Object element, int position) {
-    	if (getComparator() != null || hasFilters()) {
-    		add(element);
-    		return;
-    	}
-    	
-    	insertItem((ILabelProvider) getLabelProvider(), element, position);
-    }
-    
-    
-    /**
-     * Return the text for the element from the labelProvider.
-     * If it is null then return the empty String.
-     * @param labelProvider ILabelProvider
-     * @param element
-     * @return String. Return the emptyString if the labelProvider
-     * returns null for the text.
-     * 
-     * @since 3.1
-     */
-    private String getLabelProviderText(ILabelProvider labelProvider, Object element){
-    	String text = labelProvider.getText(element);
-        if(text == null) {
-			return "";//$NON-NLS-1$
-		}
-        return text;
-    }
-
-    /**
-     * Adds the given element to this list viewer.
-     * If this viewer does not have a sorter, the element is added at the end;
-     * otherwise the element is inserted at the appropriate position.
-     * <p>
-     * This method should be called (by the content provider) when a single element 
-     * has been added to the model, in order to cause the viewer to accurately
-     * reflect the model. This method only affects the viewer, not the model.
-     * Note that there is another method for efficiently processing the simultaneous
-     * addition of multiple elements.
-     * </p>
-     *
-     * @param element the element
-     */
-    public void add(Object element) {
-        add(new Object[] { element });
-    }
-
-    /* (non-Javadoc)
-     * Method declared on StructuredViewer.
-     * Since SWT.List doesn't use items we always return the List itself.
-     */
-    protected Widget doFindInputItem(Object element) {
-        if (element != null && equals(element, getRoot())) {
-			return getControl();
-		}
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on StructuredViewer.
-     * Since SWT.List doesn't use items we always return the List itself.
-     */
-    protected Widget doFindItem(Object element) {
-        if (element != null) {
-            if (listMapContains(element)) {
-				return getControl();
-			}
-        }
-        return null;
-    }
-
-	/* (non-Javadoc)
-     * Method declared on StructuredViewer.
-     */
-    protected void doUpdateItem(Widget data, Object element, boolean fullMap) {
-        if (element != null) {
-            int ix = getElementIndex(element);
-            if (ix >= 0) {
-                ILabelProvider labelProvider = (ILabelProvider) getLabelProvider();
-                listSetItem(ix, getLabelProviderText(labelProvider,element));
-            }
-        }
-    }
-
-    /**
-     * Returns the element with the given index from this list viewer.
-     * Returns <code>null</code> if the index is out of range.
-     *
-     * @param index the zero-based index
-     * @return the element at the given index, or <code>null</code> if the
-     *   index is out of range
-     */
-    public Object getElementAt(int index) {
-        if (index >= 0 && index < listMap.size()) {
-			return listMap.get(index);
-		}
-        return null;
-    }
-
-    /**
-     * The list viewer implementation of this <code>Viewer</code> framework
-     * method returns the label provider, which in the case of list
-     * viewers will be an instance of <code>ILabelProvider</code>.
-     */
-    public IBaseLabelProvider getLabelProvider() {
-        return super.getLabelProvider();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Viewer.
-     */
-    /* (non-Javadoc)
-     * Method declared on StructuredViewer.
-     */
-    protected List getSelectionFromWidget() {
-        int[] ixs = listGetSelectionIndices();
-        ArrayList list = new ArrayList(ixs.length);
-        for (int i = 0; i < ixs.length; i++) {
-            Object e = getElementAt(ixs[i]);
-            if (e != null) {
-				list.add(e);
-			}
-        }
-        return list;
-    }
-
-    /**
-     * @param element the element to insert
-     * @return the index where the item should be inserted.
-     */
-    protected int indexForElement(Object element) {
-        ViewerComparator comparator = getComparator();
-        if (comparator == null) {
-			return listGetItemCount();
-		}
-        int count = listGetItemCount();
-        int min = 0, max = count - 1;
-        while (min <= max) {
-            int mid = (min + max) / 2;
-            Object data = listMap.get(mid);
-            int compare = comparator.compare(this, data, element);
-            if (compare == 0) {
-                // find first item > element
-                while (compare == 0) {
-                    ++mid;
-                    if (mid >= count) {
-                        break;
-                    }
-                    data = listMap.get(mid);
-                    compare = comparator.compare(this, data, element);
-                }
-                return mid;
-            }
-            if (compare < 0) {
-				min = mid + 1;
-			} else {
-				max = mid - 1;
-			}
-        }
-        return min;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Viewer.
-     */
-    protected void inputChanged(Object input, Object oldInput) {
-        listMap.clear();
-        Object[] children = getSortedChildren(getRoot());
-        int size = children.length;
-
-        listRemoveAll();
-        String[] labels = new String[size];
-        for (int i = 0; i < size; i++) {
-            Object el = children[i];
-            labels[i] = getLabelProviderText((ILabelProvider) getLabelProvider(),el);
-            listMap.add(el);
-            mapElement(el, getControl()); // must map it, since findItem only looks in map, if enabled
-        }
-        listSetItems(labels);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on StructuredViewer.
-     */
-    protected void internalRefresh(Object element) {
-        Control list = getControl();
-        if (element == null || equals(element, getRoot())) {
-            // the parent
-            if (listMap != null) {
-				listMap.clear();
-			}
-            unmapAllElements();
-            List selection = getSelectionFromWidget();
-            
-            int topIndex = -1;
-            if (selection == null || selection.isEmpty()) {
-            	topIndex = listGetTopIndex();
-            }
-            
-            Object[] children = null;
-            list.setRedraw(false);
-            try {
-				listRemoveAll();
-	            
-	            children = getSortedChildren(getRoot());
-				String[] items = new String[children.length];
-				
-				ILabelProvider labelProvider = (ILabelProvider) getLabelProvider();
-				
-				for (int i = 0; i < items.length; i++) {
-	                Object el = children[i];
-	                items[i] = getLabelProviderText(labelProvider, el);
-	                listMap.add(el);
-	                mapElement(el, list); // must map it, since findItem only looks in map, if enabled
-	            }
-				
-				listSetItems(items);
-            } finally {
-            	list.setRedraw(true);
-            }
-            
-            if (topIndex == -1) {
-            	setSelectionToWidget(selection, false);
-            } else {
-				listSetTopIndex(Math.min(topIndex, children.length));
-            }
-        } else {
-            doUpdateItem(list, element, true);
-        }
-    }
-    
-    /**
-     * Returns the index of the item currently at the top of the viewable area.
-     * <p>
-     * Default implementation returns -1.
-     * </p>
-     * @return index, -1 for none
-     * @since 3.3
-     */
-    protected int listGetTopIndex(){
-    	return -1;
-    }
-
-    /**
-     * Sets the index of the item to be at the top of the viewable area.
-     * <p>
-     * Default implementation does nothing.
-     * </p>
-     * @param index the given index. -1 for none.  index will always refer to a valid index.
-     * @since 3.3
-     */
-    protected void listSetTopIndex(int index) {
-    }
-    
-    /**
-     * Removes the given elements from this list viewer.
-     *
-     * @param elements the elements to remove
-     */
-    private void internalRemove(final Object[] elements) {
-        Object input = getInput();
-        for (int i = 0; i < elements.length; ++i) {
-            if (equals(elements[i], input)) {
-                setInput(null);
-                return;
-            }
-            int ix = getElementIndex(elements[i]);
-            if (ix >= 0) {
-                listRemove(ix);
-                listMap.remove(ix);
-                unmapElement(elements[i], getControl());
-            }
-        }
-    }
-
-    /**
-     * Removes the given elements from this list viewer.
-     * The selection is updated if required.
-     * <p>
-     * This method should be called (by the content provider) when elements 
-     * have been removed from the model, in order to cause the viewer to accurately
-     * reflect the model. This method only affects the viewer, not the model.
-     * </p>
-     *
-     * @param elements the elements to remove
-     */
-    public void remove(final Object[] elements) {
-        assertElementsNotNull(elements);
-        if (elements.length == 0) {
-        	return;
-        }
-        preservingSelection(new Runnable() {
-            public void run() {
-                internalRemove(elements);
-            }
-        });
-    }
-
-    /**
-     * Removes the given element from this list viewer.
-     * The selection is updated if necessary.
-     * <p>
-     * This method should be called (by the content provider) when a single element 
-     * has been removed from the model, in order to cause the viewer to accurately
-     * reflect the model. This method only affects the viewer, not the model.
-     * Note that there is another method for efficiently processing the simultaneous
-     * removal of multiple elements.
-     * </p>
-     *
-     * @param element the element
-     */
-    public void remove(Object element) {
-        remove(new Object[] { element });
-    }
-
-    /**
-	 * The list viewer implementation of this <code>Viewer</code> framework
-	 * method ensures that the given label provider is an instance of
-	 * <code>ILabelProvider</code>.
-	 * 
-	 * <b>The optional interfaces {@link IColorProvider} and
-	 * {@link IFontProvider} have no effect for this type of viewer</b>
-	 */
-    public void setLabelProvider(IBaseLabelProvider labelProvider) {
-        Assert.isTrue(labelProvider instanceof ILabelProvider);
-        super.setLabelProvider(labelProvider);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on StructuredViewer.
-     */
-    protected void setSelectionToWidget(List in, boolean reveal) {
-        if (in == null || in.size() == 0) { // clear selection
-            listDeselectAll();
-        } else {
-            int n = in.size();
-            int[] ixs = new int[n];
-            int count = 0;
-            for (int i = 0; i < n; ++i) {
-                Object el = in.get(i);
-                int ix = getElementIndex(el);
-                if (ix >= 0) {
-					ixs[count++] = ix;
-				}
-            }
-            if (count < n) {
-                System.arraycopy(ixs, 0, ixs = new int[count], 0, count);
-            }
-            listSetSelection(ixs);
-            if (reveal) {
-                listShowSelection();
-            }
-        }
-    }
-
-    /**
-     * Returns the index of the given element in listMap, or -1 if the element cannot be found.
-     * As of 3.3, uses the element comparer if available.
-     * 
-     * @param element
-     * @return the index
-     */
-    int getElementIndex(Object element) {
-		IElementComparer comparer = getComparer();
-		if (comparer == null) {
-			return listMap.indexOf(element);
-		}
-		int size = listMap.size();
-		for (int i = 0; i < size; i++) {
-			if (comparer.equals(element, listMap.get(i)))
-				return i;
-		}
-		return -1;
-	}
-
-    /**
-	 * @param element
-	 * @return true if listMap contains the given element
-	 * 
-	 * @since 3.3
-	 */
-	private boolean listMapContains(Object element) {
-		return getElementIndex(element) != -1;
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTableViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTableViewer.java
deleted file mode 100644
index 59bd2e2..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTableViewer.java
+++ /dev/null
@@ -1,1360 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation bug 154329
- *                                               - fixes in bug 170381, 198665, 200731
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * This is a widget independent class implementors of
- * {@link org.eclipse.swt.widgets.Table} like widgets can use to provide a
- * viewer on top of their widget implementations.
- *
- * @since 3.3
- */
-public abstract class AbstractTableViewer extends ColumnViewer {
-
-	private class VirtualManager {
-
-		/**
-		 * The currently invisible elements as provided by the content provider
-		 * or by addition. This will not be populated by an
-		 * ILazyStructuredContentProvider as an ILazyStructuredContentProvider
-		 * is only queried on the virtual callback.
-		 */
-		private Object[] cachedElements = new Object[0];
-
-		/**
-		 * Create a new instance of the receiver.
-		 *
-		 */
-		public VirtualManager() {
-			addTableListener();
-		}
-
-		/**
-		 * Add the listener for SetData on the table
-		 */
-		private void addTableListener() {
-			getControl().addListener(SWT.SetData, new Listener() {
-				/*
-				 * (non-Javadoc)
-				 *
-				 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-				 */
-				public void handleEvent(Event event) {
-					Item item = (Item) event.item;
-					final int index = doIndexOf(item);
-					
-					if (index == -1) {
-						// Should not happen, but the spec for doIndexOf allows returning -1.
-						// See bug 241117.
-						return;
-					}
-					
-					Object element = resolveElement(index);
-					if (element == null) {
-						// Didn't find it so make a request
-						// Keep looking if it is not in the cache.
-						IContentProvider contentProvider = getContentProvider();
-						// If we are building lazily then request lookup now
-						if (contentProvider instanceof ILazyContentProvider) {
-							((ILazyContentProvider) contentProvider)
-									.updateElement(index);
-							return;
-						}
-					}
-
-					associate(element, item);
-					updateItem(item, element);
-				}
-
-			});
-		}
-
-		/**
-		 * Get the element at index.Resolve it lazily if this is available.
-		 *
-		 * @param index
-		 * @return Object or <code>null</code> if it could not be found
-		 */
-		protected Object resolveElement(int index) {
-
-			Object element = null;
-			if (index < cachedElements.length) {
-				element = cachedElements[index];
-			}
-
-			return element;
-		}
-
-		/**
-		 * A non visible item has been added.
-		 *
-		 * @param element
-		 * @param index
-		 */
-		public void notVisibleAdded(Object element, int index) {
-
-			int requiredCount = doGetItemCount() + 1;
-
-			Object[] newCache = new Object[requiredCount];
-			System.arraycopy(cachedElements, 0, newCache, 0, index);
-			if (index < cachedElements.length) {
-				System.arraycopy(cachedElements, index, newCache, index + 1,
-						cachedElements.length - index);
-			}
-			newCache[index] = element;
-			cachedElements = newCache;
-
-			doSetItemCount(requiredCount);
-		}
-
-		/**
-		 * The elements with the given indices need to be removed from the
-		 * cache.
-		 *
-		 * @param indices
-		 */
-		public void removeIndices(int[] indices) {
-			if (indices.length == 1) {
-				removeIndicesFromTo(indices[0], indices[0]);
-			}
-			int requiredCount = doGetItemCount() - indices.length;
-
-			Arrays.sort(indices);
-			Object[] newCache = new Object[requiredCount];
-			int indexInNewCache = 0;
-			int nextToSkip = 0;
-			for (int i = 0; i < cachedElements.length; i++) {
-				if (nextToSkip < indices.length && i == indices[nextToSkip]) {
-					nextToSkip++;
-				} else {
-					newCache[indexInNewCache++] = cachedElements[i];
-				}
-			}
-			cachedElements = newCache;
-		}
-
-		/**
-		 * The elements between the given indices (inclusive) need to be removed
-		 * from the cache.
-		 *
-		 * @param from
-		 * @param to
-		 */
-		public void removeIndicesFromTo(int from, int to) {
-			int indexAfterTo = to + 1;
-			Object[] newCache = new Object[cachedElements.length
-					- (indexAfterTo - from)];
-			System.arraycopy(cachedElements, 0, newCache, 0, from);
-			if (indexAfterTo < cachedElements.length) {
-				System.arraycopy(cachedElements, indexAfterTo, newCache, from,
-						cachedElements.length - indexAfterTo);
-			}
-		}
-
-		/**
-		 * @param element
-		 * @return the index of the element in the cache, or null
-		 */
-		public int find(Object element) {
-			return Arrays.asList(cachedElements).indexOf(element);
-		}
-
-		/**
-		 * @param count
-		 */
-		public void adjustCacheSize(int count) {
-			if (count == cachedElements.length) {
-				return;
-			} else if (count < cachedElements.length) {
-				Object[] newCache = new Object[count];
-				System.arraycopy(cachedElements, 0, newCache, 0, count);
-				cachedElements = newCache;
-			} else {
-				Object[] newCache = new Object[count];
-				System.arraycopy(cachedElements, 0, newCache, 0,
-						cachedElements.length);
-				cachedElements = newCache;
-			}
-		}
-
-	}
-
-	private VirtualManager virtualManager;
-
-	/**
-	 * Create the new viewer for table like widgets
-	 */
-	public AbstractTableViewer() {
-		super();
-	}
-
-	protected void hookControl(Control control) {
-		super.hookControl(control);
-		initializeVirtualManager(getControl().getStyle());
-	}
-
-	/**
-	 * Initialize the virtual manager to manage the virtual state if the table
-	 * is VIRTUAL. If not use the default no-op version.
-	 *
-	 * @param style
-	 */
-	private void initializeVirtualManager(int style) {
-		if ((style & SWT.VIRTUAL) == 0) {
-			return;
-		}
-
-		virtualManager = new VirtualManager();
-	}
-
-	/**
-	 * Adds the given elements to this table viewer. If this viewer does not
-	 * have a sorter, the elements are added at the end in the order given;
-	 * otherwise the elements are inserted at appropriate positions.
-	 * <p>
-	 * This method should be called (by the content provider) when elements have
-	 * been added to the model, in order to cause the viewer to accurately
-	 * reflect the model. This method only affects the viewer, not the model.
-	 * </p>
-	 *
-	 * @param elements
-	 *            the elements to add
-	 */
-	public void add(Object[] elements) {
-		assertElementsNotNull(elements);
-		if (checkBusy())
-			return;
-		Object[] filtered = filter(elements);
-
-		for (int i = 0; i < filtered.length; i++) {
-			Object element = filtered[i];
-			int index = indexForElement(element);
-			createItem(element, index);
-		}
-	}
-
-	/**
-	 * Create a new TableItem at index if required.
-	 *
-	 * @param element
-	 * @param index
-	 *
-	 * @since 3.1
-	 */
-	private void createItem(Object element, int index) {
-		if (virtualManager == null) {
-			updateItem(internalCreateNewRowPart(SWT.NONE, index).getItem(),
-					element);
-		} else {
-			virtualManager.notVisibleAdded(element, index);
-
-		}
-	}
-
-	/**
-	 * Create a new row.  Callers can only use the returned object locally and before
-	 * making the next call on the viewer since it may be re-used for subsequent method
-	 * calls.
-	 *
-	 * @param style
-	 *            the style for the new row
-	 * @param rowIndex
-	 *            the index of the row or -1 if the row is appended at the end
-	 * @return the newly created row
-	 */
-	protected abstract ViewerRow internalCreateNewRowPart(int style,
-			int rowIndex);
-
-	/**
-	 * Adds the given element to this table viewer. If this viewer does not have
-	 * a sorter, the element is added at the end; otherwise the element is
-	 * inserted at the appropriate position.
-	 * <p>
-	 * This method should be called (by the content provider) when a single
-	 * element has been added to the model, in order to cause the viewer to
-	 * accurately reflect the model. This method only affects the viewer, not
-	 * the model. Note that there is another method for efficiently processing
-	 * the simultaneous addition of multiple elements.
-	 * </p>
-	 *
-	 * @param element
-	 *            the element to add
-	 */
-	public void add(Object element) {
-		add(new Object[] { element });
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.StructuredViewer#doFindInputItem(java.lang.Object)
-	 */
-	protected Widget doFindInputItem(Object element) {
-		if (equals(element, getRoot())) {
-			return getControl();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.StructuredViewer#doFindItem(java.lang.Object)
-	 */
-	protected Widget doFindItem(Object element) {
-
-		Item[] children = doGetItems();
-		for (int i = 0; i < children.length; i++) {
-			Item item = children[i];
-			Object data = item.getData();
-			if (data != null && equals(data, element)) {
-				return item;
-			}
-		}
-
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.StructuredViewer#doUpdateItem(org.eclipse.swt.widgets.Widget,
-	 *      java.lang.Object, boolean)
-	 */
-	protected void doUpdateItem(Widget widget, Object element, boolean fullMap) {
-		boolean oldBusy = isBusy();
-		setBusy(true);
-		try {
-			if (widget instanceof Item) {
-				final Item item = (Item) widget;
-
-				// remember element we are showing
-				if (fullMap) {
-					associate(element, item);
-				} else {
-					Object data = item.getData();
-					if (data != null) {
-						unmapElement(data, item);
-					}
-					item.setData(element);
-					mapElement(element, item);
-				}
-
-				int columnCount = doGetColumnCount();
-				if (columnCount == 0)
-					columnCount = 1;// If there are no columns do the first one
-
-				ViewerRow viewerRowFromItem = getViewerRowFromItem(item);
-
-				boolean isVirtual = (getControl().getStyle() & SWT.VIRTUAL) != 0;
-
-				// If the control is virtual, we cannot use the cached viewer row object. See bug 188663.
-				if (isVirtual) {
-					viewerRowFromItem = (ViewerRow) viewerRowFromItem.clone();
-				}
-
-				// Also enter loop if no columns added. See 1G9WWGZ: JFUIF:WINNT -
-				// TableViewer with 0 columns does not work
-				for (int column = 0; column < columnCount || column == 0; column++) {
-					ViewerColumn columnViewer = getViewerColumn(column);
-					ViewerCell cellToUpdate = updateCell(viewerRowFromItem,
-							column, element);
-
-					// If the control is virtual, we cannot use the cached cell object. See bug 188663.
-					if (isVirtual) {
-						cellToUpdate = new ViewerCell(cellToUpdate.getViewerRow(), cellToUpdate.getColumnIndex(), element);
-					}
-
-					columnViewer.refresh(cellToUpdate);
-
-					// clear cell (see bug 201280)
-					updateCell(null, 0, null);
-
-					// As it is possible for user code to run the event
-					// loop check here.
-					if (item.isDisposed()) {
-						unmapElement(element, item);
-						return;
-					}
-
-				}
-
-			}
-		} finally {
-			setBusy(oldBusy);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ColumnViewer#getColumnViewerOwner(int)
-	 */
-	protected Widget getColumnViewerOwner(int columnIndex) {
-		int columnCount = doGetColumnCount();
-
-		if (columnIndex < 0
-				|| (columnIndex > 0 && columnIndex >= columnCount)) {
-			return null;
-		}
-
-		if (columnCount == 0)// Hang it off the table if it
-			return getControl();
-
-		return doGetColumn(columnIndex);
-	}
-
-	/**
-	 * Returns the element with the given index from this table viewer. Returns
-	 * <code>null</code> if the index is out of range.
-	 * <p>
-	 * This method is internal to the framework.
-	 * </p>
-	 *
-	 * @param index
-	 *            the zero-based index
-	 * @return the element at the given index, or <code>null</code> if the
-	 *         index is out of range
-	 */
-	public Object getElementAt(int index) {
-		if (index >= 0 && index < doGetItemCount()) {
-			Item i = doGetItem(index);
-			if (i != null) {
-				return i.getData();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * The table viewer implementation of this <code>Viewer</code> framework
-	 * method returns the label provider, which in the case of table viewers
-	 * will be an instance of either <code>ITableLabelProvider</code> or
-	 * <code>ILabelProvider</code>. If it is an
-	 * <code>ITableLabelProvider</code>, then it provides a separate label
-	 * text and image for each column. If it is an <code>ILabelProvider</code>,
-	 * then it provides only the label text and image for the first column, and
-	 * any remaining columns are blank.
-	 */
-	public IBaseLabelProvider getLabelProvider() {
-		return super.getLabelProvider();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.StructuredViewer#getSelectionFromWidget()
-	 */
-	protected List getSelectionFromWidget() {
-		if (virtualManager != null) {
-			return getVirtualSelection();
-		}
-		Widget[] items = doGetSelection();
-		ArrayList list = new ArrayList(items.length);
-		for (int i = 0; i < items.length; i++) {
-			Widget item = items[i];
-			Object e = item.getData();
-			if (e != null) {
-				list.add(e);
-			}
-		}
-		return list;
-	}
-
-	/**
-	 * Get the virtual selection. Avoid calling SWT whenever possible to prevent
-	 * extra widget creation.
-	 *
-	 * @return List of Object
-	 */
-
-	private List getVirtualSelection() {
-
-		List result = new ArrayList();
-		int[] selectionIndices = doGetSelectionIndices();
-		if (getContentProvider() instanceof ILazyContentProvider) {
-			ILazyContentProvider lazy = (ILazyContentProvider) getContentProvider();
-			for (int i = 0; i < selectionIndices.length; i++) {
-				int selectionIndex = selectionIndices[i];
-				lazy.updateElement(selectionIndex);// Start the update
-				Object element = doGetItem(selectionIndex).getData();
-				// Only add the element if it got updated.
-				// If this is done deferred the selection will
-				// be incomplete until selection is finished.
-				if (element != null) {
-					result.add(element);
-				}
-			}
-		} else {
-			for (int i = 0; i < selectionIndices.length; i++) {
-				Object element = null;
-				// See if it is cached
-				int selectionIndex = selectionIndices[i];
-				if (selectionIndex < virtualManager.cachedElements.length) {
-					element = virtualManager.cachedElements[selectionIndex];
-				}
-				if (element == null) {
-					// Not cached so try the item's data
-					Item item = doGetItem(selectionIndex);
-					element = item.getData();
-				}
-				if (element != null) {
-					result.add(element);
-				}
-			}
-
-		}
-		return result;
-	}
-
-	/**
-	 * @param element
-	 *            the element to insert
-	 * @return the index where the item should be inserted.
-	 */
-	protected int indexForElement(Object element) {
-		ViewerComparator comparator = getComparator();
-		if (comparator == null) {
-			return doGetItemCount();
-		}
-		int count = doGetItemCount();
-		int min = 0, max = count - 1;
-		while (min <= max) {
-			int mid = (min + max) / 2;
-			Object data = doGetItem(mid).getData();
-			int compare = comparator.compare(this, data, element);
-			if (compare == 0) {
-				// find first item > element
-				while (compare == 0) {
-					++mid;
-					if (mid >= count) {
-						break;
-					}
-					data = doGetItem(mid).getData();
-					compare = comparator.compare(this, data, element);
-				}
-				return mid;
-			}
-			if (compare < 0) {
-				min = mid + 1;
-			} else {
-				max = mid - 1;
-			}
-		}
-		return min;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.Viewer#inputChanged(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	protected void inputChanged(Object input, Object oldInput) {
-		getControl().setRedraw(false);
-		try {
-			preservingSelection(new Runnable() {
-				public void run() {
-					internalRefresh(getRoot());
-				}
-			});
-		} finally {
-			getControl().setRedraw(true);
-		}
-	}
-
-	/**
-	 * Inserts the given element into this table viewer at the given position.
-	 * If this viewer has a sorter, the position is ignored and the element is
-	 * inserted at the correct position in the sort order.
-	 * <p>
-	 * This method should be called (by the content provider) when elements have
-	 * been added to the model, in order to cause the viewer to accurately
-	 * reflect the model. This method only affects the viewer, not the model.
-	 * </p>
-	 *
-	 * @param element
-	 *            the element
-	 * @param position
-	 *            a 0-based position relative to the model, or -1 to indicate
-	 *            the last position
-	 */
-	public void insert(Object element, int position) {
-		applyEditorValue();
-		if (getComparator() != null || hasFilters()) {
-			add(element);
-			return;
-		}
-		if (position == -1) {
-			position = doGetItemCount();
-		}
-		if (checkBusy())
-			return;
-		createItem(element, position);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object)
-	 */
-	protected void internalRefresh(Object element) {
-		internalRefresh(element, true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object,
-	 *      boolean)
-	 */
-	protected void internalRefresh(Object element, boolean updateLabels) {
-		applyEditorValue();
-		if (element == null || equals(element, getRoot())) {
-			if (virtualManager == null) {
-				internalRefreshAll(updateLabels);
-			} else {
-				internalVirtualRefreshAll();
-			}
-		} else {
-			Widget w = findItem(element);
-			if (w != null) {
-				updateItem(w, element);
-			}
-		}
-	}
-
-	/**
-	 * Refresh all with virtual elements.
-	 *
-	 * @since 3.1
-	 */
-	private void internalVirtualRefreshAll() {
-
-		Object root = getRoot();
-		IContentProvider contentProvider = getContentProvider();
-
-		// Invalidate for lazy
-		if (!(contentProvider instanceof ILazyContentProvider)
-				&& (contentProvider instanceof IStructuredContentProvider)) {
-			// Don't cache if the root is null but cache if it is not lazy.
-			if (root != null) {
-				virtualManager.cachedElements = getSortedChildren(root);
-				doSetItemCount(virtualManager.cachedElements.length);
-			}
-		}
-		doClearAll();
-	}
-
-	/**
-	 * Refresh all of the elements of the table. update the labels if
-	 * updatLabels is true;
-	 *
-	 * @param updateLabels
-	 *
-	 * @since 3.1
-	 */
-	private void internalRefreshAll(boolean updateLabels) {
-		// the parent
-
-		// in the code below, it is important to do all disassociates
-		// before any associates, since a later disassociate can undo an
-		// earlier associate
-		// e.g. if (a, b) is replaced by (b, a), the disassociate of b to
-		// item 1 could undo
-		// the associate of b to item 0.
-
-		Object[] children = getSortedChildren(getRoot());
-		Item[] items = doGetItems();
-		int min = Math.min(children.length, items.length);
-		for (int i = 0; i < min; ++i) {
-
-			Item item = items[i];
-
-			// if the element is unchanged, update its label if appropriate
-			if (equals(children[i], item.getData())) {
-				if (updateLabels) {
-					updateItem(item, children[i]);
-				} else {
-					// associate the new element, even if equal to the old
-					// one,
-					// to remove stale references (see bug 31314)
-					associate(children[i], item);
-				}
-			} else {
-				// updateItem does an associate(...), which can mess up
-				// the associations if the order of elements has changed.
-				// E.g. (a, b) -> (b, a) first replaces a->0 with b->0, then
-				// replaces b->1 with a->1, but this actually removes b->0.
-				// So, if the object associated with this item has changed,
-				// just disassociate it for now, and update it below.
-				// we also need to reset the item (set its text,images etc. to
-				// default values) because the label decorators rely on this
-				disassociate(item);
-				doClear(i);
-			}
-		}
-		// dispose of all items beyond the end of the current elements
-		if (min < items.length) {
-			for (int i = items.length; --i >= min;) {
-
-				disassociate(items[i]);
-			}
-			if (virtualManager != null) {
-				virtualManager.removeIndicesFromTo(min, items.length - 1);
-			}
-			doRemove(min, items.length - 1);
-		}
-		// Workaround for 1GDGN4Q: ITPUI:WIN2000 - TableViewer icons get
-		// scrunched
-		if (doGetItemCount() == 0) {
-			doRemoveAll();
-		}
-		// Update items which were disassociated above
-		for (int i = 0; i < min; ++i) {
-
-			Item item = items[i];
-			if (item.getData() == null) {
-				updateItem(item, children[i]);
-			}
-		}
-		// add any remaining elements
-		for (int i = min; i < children.length; ++i) {
-			createItem(children[i], i);
-		}
-	}
-
-	/**
-	 * Removes the given elements from this table viewer.
-	 *
-	 * @param elements
-	 *            the elements to remove
-	 */
-	private void internalRemove(final Object[] elements) {
-		Object input = getInput();
-		for (int i = 0; i < elements.length; ++i) {
-			if (equals(elements[i], input)) {
-				boolean oldBusy = isBusy();
-				setBusy(false);
-				try {
-					setInput(null);
-				} finally {
-					setBusy(oldBusy);
-				}
-				return;
-			}
-		}
-		// use remove(int[]) rather than repeated TableItem.dispose() calls
-		// to allow SWT to optimize multiple removals
-		int[] indices = new int[elements.length];
-		int count = 0;
-		for (int i = 0; i < elements.length; ++i) {
-			Widget w = findItem(elements[i]);
-			if (w == null && virtualManager != null) {
-				int index = virtualManager.find(elements[i]);
-				if (index != -1) {
-					indices[count++] = index;
-				}
-			} else if (w instanceof Item) {
-				Item item = (Item) w;
-				disassociate(item);
-				indices[count++] = doIndexOf(item);
-			}
-		}
-		if (count < indices.length) {
-			System.arraycopy(indices, 0, indices = new int[count], 0, count);
-		}
-		if (virtualManager != null) {
-			virtualManager.removeIndices(indices);
-		}
-		doRemove(indices);
-
-		// Workaround for 1GDGN4Q: ITPUI:WIN2000 - TableViewer icons get
-		// scrunched
-		if (doGetItemCount() == 0) {
-			doRemoveAll();
-		}
-	}
-
-	/**
-	 * Removes the given elements from this table viewer. The selection is
-	 * updated if required.
-	 * <p>
-	 * This method should be called (by the content provider) when elements have
-	 * been removed from the model, in order to cause the viewer to accurately
-	 * reflect the model. This method only affects the viewer, not the model.
-	 * </p>
-	 *
-	 * @param elements
-	 *            the elements to remove
-	 */
-	public void remove(final Object[] elements) {
-		assertElementsNotNull(elements);
-		if (checkBusy())
-			return;
-		if (elements.length == 0) {
-			return;
-		}
-		preservingSelection(new Runnable() {
-			public void run() {
-				internalRemove(elements);
-			}
-		});
-	}
-
-	/**
-	 * Removes the given element from this table viewer. The selection is
-	 * updated if necessary.
-	 * <p>
-	 * This method should be called (by the content provider) when a single
-	 * element has been removed from the model, in order to cause the viewer to
-	 * accurately reflect the model. This method only affects the viewer, not
-	 * the model. Note that there is another method for efficiently processing
-	 * the simultaneous removal of multiple elements.
-	 * </p>
-	 * <strong>NOTE:</strong> removing an object from a virtual table will
-	 * decrement the itemCount.
-	 *
-	 * @param element
-	 *            the element
-	 */
-	public void remove(Object element) {
-		remove(new Object[] { element });
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.StructuredViewer#reveal(java.lang.Object)
-	 */
-	public void reveal(Object element) {
-		Assert.isNotNull(element);
-		Widget w = findItem(element);
-		if (w instanceof Item) {
-			doShowItem((Item) w);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.StructuredViewer#setSelectionToWidget(java.util.List,
-	 *      boolean)
-	 */
-	protected void setSelectionToWidget(List list, boolean reveal) {
-		if (list == null) {
-			doDeselectAll();
-			return;
-		}
-
-		if (virtualManager != null) {
-			virtualSetSelectionToWidget(list, reveal);
-			return;
-		}
-
-		// This is vital to use doSetSelection because on SWT-Table on Win32 this will also
-		// move the focus to this row (See bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=198665)
-		if (reveal) {
-			int size = list.size();
-			Item[] items = new Item[size];
-			int count = 0;
-			for (int i = 0; i < size; ++i) {
-				Object o = list.get(i);
-				Widget w = findItem(o);
-				if (w instanceof Item) {
-					Item item = (Item) w;
-					items[count++] = item;
-				}
-			}
-			if (count < size) {
-				System.arraycopy(items, 0, items = new Item[count], 0, count);
-			}
-			doSetSelection(items);
-		} else {
-			doDeselectAll(); // Clear the selection
-			if( ! list.isEmpty() ) {
-				int[] indices = new int[list.size()];
-
-				Iterator it = list.iterator();
-				Item[] items = doGetItems();
-				Object modelElement;
-
-				int count = 0;
-				while( it.hasNext() ) {
-					modelElement = it.next();
-					boolean found = false;
-					for (int i = 0; i < items.length && !found; i++) {
-						if (equals(modelElement, items[i].getData())) {
-							indices[count++] = i;
-							found = true;
-						}
-					}
-				}
-
-				if (count < indices.length) {
-					System.arraycopy(indices, 0, indices = new int[count], 0, count);
-				}
-
-				doSelect(indices);
-			}
-		}
-	}
-
-	/**
-	 * Set the selection on a virtual table
-	 *
-	 * @param list
-	 *            The elements to set
-	 * @param reveal
-	 *            Whether or not reveal the first item.
-	 */
-	private void virtualSetSelectionToWidget(List list, boolean reveal) {
-		int size = list.size();
-		int[] indices = new int[list.size()];
-
-		Item firstItem = null;
-		int count = 0;
-		HashSet virtualElements = new HashSet();
-		for (int i = 0; i < size; ++i) {
-			Object o = list.get(i);
-			Widget w = findItem(o);
-			if (w instanceof Item) {
-				Item item = (Item) w;
-				indices[count++] = doIndexOf(item);
-				if (firstItem == null) {
-					firstItem = item;
-				}
-			} else {
-				virtualElements.add(o);
-			}
-		}
-
-		if (getContentProvider() instanceof ILazyContentProvider) {
-			ILazyContentProvider provider = (ILazyContentProvider) getContentProvider();
-
-			// Now go through it again until all is done or we are no longer
-			// virtual
-			// This may create all items so it is not a good
-			// idea in general.
-			// Use #setSelection (int [] indices,boolean reveal) instead
-			for (int i = 0; virtualElements.size() > 0 && i < doGetItemCount(); i++) {
-				provider.updateElement(i);
-				Item item = doGetItem(i);
-				if (virtualElements.contains(item.getData())) {
-					indices[count++] = i;
-					virtualElements.remove(item.getData());
-					if (firstItem == null) {
-						firstItem = item;
-					}
-				}
-			}
-		} else {
-
-			if (count != list.size()) {// As this is expensive skip it if all
-				// have been found
-				// If it is not lazy we can use the cache
-				for (int i = 0; i < virtualManager.cachedElements.length; i++) {
-					Object element = virtualManager.cachedElements[i];
-					if (virtualElements.contains(element)) {
-						Item item = doGetItem(i);
-						item.getText();// Be sure to fire the update
-						indices[count++] = i;
-						virtualElements.remove(element);
-						if (firstItem == null) {
-							firstItem = item;
-						}
-					}
-				}
-			}
-		}
-
-		if (count < size) {
-			System.arraycopy(indices, 0, indices = new int[count], 0, count);
-		}
-		doDeselectAll();
-		doSelect(indices);
-
-		if (reveal && firstItem != null) {
-			doShowItem(firstItem);
-		}
-	}
-
-	/**
-	 * Set the item count of the receiver.
-	 *
-	 * @param count
-	 *            the new table size.
-	 *
-	 * @since 3.1
-	 */
-	public void setItemCount(int count) {
-		if (checkBusy())
-			return;
-		int oldCount = doGetItemCount();
-		if (count < oldCount) {
-			// need to disassociate elements that are being disposed
-			for (int i = count; i < oldCount; i++) {
-				Item item = doGetItem(i);
-				if (item.getData() != null) {
-					disassociate(item);
-				}
-			}
-		}
-		doSetItemCount(count);
-		if (virtualManager != null) {
-			virtualManager.adjustCacheSize(count);
-		}
-		getControl().redraw();
-	}
-
-	/**
-	 * Replace the element at the given index with the given element. This
-	 * method will not call the content provider to verify. <strong>Note that
-	 * this method will materialize a TableItem the given index.</strong>.
-	 * 
-	 * @param element
-	 * @param index
-	 * @see ILazyContentProvider
-	 * 
-	 * @since 3.1
-	 */
-	public void replace(Object element, int index) {
-		if (checkBusy())
-			return;
-		Item item = doGetItem(index);
-		refreshItem(item, element);
-	}
-
-	/**
-	 * Clear the table item at the specified index
-	 *
-	 * @param index
-	 *            the index of the table item to be cleared
-	 *
-	 * @since 3.1
-	 */
-	public void clear(int index) {
-		Item item = doGetItem(index);
-		if (item.getData() != null) {
-			disassociate(item);
-		}
-		doClear(index);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.StructuredViewer#getRawChildren(java.lang.Object)
-	 */
-	protected Object[] getRawChildren(Object parent) {
-
-		Assert.isTrue(!(getContentProvider() instanceof ILazyContentProvider),
-				"Cannot get raw children with an ILazyContentProvider");//$NON-NLS-1$
-		return super.getRawChildren(parent);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.StructuredViewer#assertContentProviderType(org.eclipse.jface.viewers.IContentProvider)
-	 */
-	protected void assertContentProviderType(IContentProvider provider) {
-		Assert.isTrue(provider instanceof IStructuredContentProvider
-				|| provider instanceof ILazyContentProvider);
-	}
-
-	/**
-	 * Searches the receiver's list starting at the first item (index 0) until
-	 * an item is found that is equal to the argument, and returns the index of
-	 * that item. If no item is found, returns -1.
-	 *
-	 * @param item
-	 *            the search item
-	 * @return the index of the item
-	 *
-	 * @since 3.3
-	 */
-	protected abstract int doIndexOf(Item item);
-
-	/**
-	 * Returns the number of items contained in the receiver.
-	 *
-	 * @return the number of items
-	 *
-	 * @since 3.3
-	 */
-	protected abstract int doGetItemCount();
-
-	/**
-	 * Sets the number of items contained in the receiver.
-	 *
-	 * @param count
-	 *            the number of items
-	 *
-	 * @since 3.3
-	 */
-	protected abstract void doSetItemCount(int count);
-
-	/**
-	 * Returns a (possibly empty) array of TableItems which are the items in the
-	 * receiver.
-	 *
-	 * @return the items in the receiver
-	 *
-	 * @since 3.3
-	 */
-	protected abstract Item[] doGetItems();
-
-	/**
-	 * Returns the column at the given, zero-relative index in the receiver.
-	 * Throws an exception if the index is out of range. Columns are returned in
-	 * the order that they were created. If no TableColumns were created by the
-	 * programmer, this method will throw ERROR_INVALID_RANGE despite the fact
-	 * that a single column of data may be visible in the table. This occurs
-	 * when the programmer uses the table like a list, adding items but never
-	 * creating a column.
-	 *
-	 * @param index
-	 *            the index of the column to return
-	 * @return the column at the given index
-	 * @exception IllegalArgumentException -
-	 *                if the index is not between 0 and the number of elements
-	 *                in the list minus 1 (inclusive)
-	 *
-	 * @since 3.3
-	 */
-	protected abstract Widget doGetColumn(int index);
-
-	/**
-	 * Returns the item at the given, zero-relative index in the receiver.
-	 * Throws an exception if the index is out of range.
-	 *
-	 * @param index
-	 *            the index of the item to return
-	 * @return the item at the given index
-	 * @exception IllegalArgumentException -
-	 *                if the index is not between 0 and the number of elements
-	 *                in the list minus 1 (inclusive)
-	 *
-	 * @since 3.3
-	 */
-	protected abstract Item doGetItem(int index);
-
-	/**
-	 * Returns an array of {@link Item} that are currently selected in the
-	 * receiver. The order of the items is unspecified. An empty array indicates
-	 * that no items are selected.
-	 *
-	 * @return an array representing the selection
-	 *
-	 * @since 3.3
-	 */
-	protected abstract Item[] doGetSelection();
-
-	/**
-	 * Returns the zero-relative indices of the items which are currently
-	 * selected in the receiver. The order of the indices is unspecified. The
-	 * array is empty if no items are selected.
-	 *
-	 * @return an array representing the selection
-	 *
-	 * @since 3.3
-	 */
-	protected abstract int[] doGetSelectionIndices();
-
-	/**
-	 * Clears all the items in the receiver. The text, icon and other attributes
-	 * of the items are set to their default values. If the table was created
-	 * with the <code>SWT.VIRTUAL</code> style, these attributes are requested
-	 * again as needed.
-	 *
-	 * @since 3.3
-	 */
-	protected abstract void doClearAll();
-
-	/**
-	 * Resets the given item in the receiver. The text, icon and other attributes
-	 * of the item are set to their default values.
-	 *
-	 * @param item the item to reset
-	 *
-	 * @since 3.3
-	 */
-	protected abstract void doResetItem(Item item);
-
-	/**
-	 * Removes the items from the receiver which are between the given
-	 * zero-relative start and end indices (inclusive).
-	 *
-	 * @param start
-	 *            the start of the range
-	 * @param end
-	 *            the end of the range
-	 *
-	 * @exception IllegalArgumentException -
-	 *                if either the start or end are not between 0 and the
-	 *                number of elements in the list minus 1 (inclusive)
-	 *
-	 * @since 3.3
-	 */
-	protected abstract void doRemove(int start, int end);
-
-	/**
-	 * Removes all of the items from the receiver.
-	 *
-	 * @since 3.3
-	 */
-	protected abstract void doRemoveAll();
-
-	/**
-	 * Removes the items from the receiver's list at the given zero-relative
-	 * indices.
-	 *
-	 * @param indices
-	 *            the array of indices of the items
-	 *
-	 * @exception IllegalArgumentException -
-	 *                if the array is null, or if any of the indices is not
-	 *                between 0 and the number of elements in the list minus 1
-	 *                (inclusive)
-	 *
-	 * @since 3.3
-	 */
-	protected abstract void doRemove(int[] indices);
-
-	/**
-	 * Shows the item. If the item is already showing in the receiver, this
-	 * method simply returns. Otherwise, the items are scrolled until the item
-	 * is visible.
-	 *
-	 * @param item
-	 *            the item to be shown
-	 *
-	 * @exception IllegalArgumentException -
-	 *                if the item is null
-	 *
-	 * @since 3.3
-	 */
-	protected abstract void doShowItem(Item item);
-
-	/**
-	 * Deselects all selected items in the receiver.
-	 *
-	 * @since 3.3
-	 */
-	protected abstract void doDeselectAll();
-
-	/**
-	 * Sets the receiver's selection to be the given array of items. The current
-	 * selection is cleared before the new items are selected.
-	 * <p>
-	 * Items that are not in the receiver are ignored. If the receiver is
-	 * single-select and multiple items are specified, then all items are
-	 * ignored.
-	 * </p>
-	 *
-	 * @param items
-	 *            the array of items
-	 *
-	 * @exception IllegalArgumentException -
-	 *                if the array of items is null
-	 *
-	 * @since 3.3
-	 */
-	protected abstract void doSetSelection(Item[] items);
-
-	/**
-	 * Shows the selection. If the selection is already showing in the receiver,
-	 * this method simply returns. Otherwise, the items are scrolled until the
-	 * selection is visible.
-	 *
-	 * @since 3.3
-	 */
-	protected abstract void doShowSelection();
-
-	/**
-	 * Selects the items at the given zero-relative indices in the receiver. The
-	 * current selection is cleared before the new items are selected.
-	 * <p>
-	 * Indices that are out of range and duplicate indices are ignored. If the
-	 * receiver is single-select and multiple indices are specified, then all
-	 * indices are ignored.
-	 * </p>
-	 *
-	 * @param indices
-	 *            the indices of the items to select
-	 *
-	 * @exception IllegalArgumentException -
-	 *                if the array of indices is null
-	 *
-	 * @since 3.3
-	 */
-	protected abstract void doSetSelection(int[] indices);
-
-	/**
-	 * Clears the item at the given zero-relative index in the receiver. The
-	 * text, icon and other attributes of the item are set to the default value.
-	 * If the table was created with the <code>SWT.VIRTUAL</code> style, these
-	 * attributes are requested again as needed.
-	 *
-	 * @param index
-	 *            the index of the item to clear
-	 *
-	 * @exception IllegalArgumentException -
-	 *                if the index is not between 0 and the number of elements
-	 *                in the list minus 1 (inclusive)
-	 *
-	 * @see SWT#VIRTUAL
-	 * @see SWT#SetData
-	 *
-	 * @since 3.3
-	 */
-	protected abstract void doClear(int index);
-
-
-
-	/**
-	 * Selects the items at the given zero-relative indices in the receiver.
-	 * The current selection is not cleared before the new items are selected.
-	 * <p>
-	 * If the item at a given index is not selected, it is selected.
-	 * If the item at a given index was already selected, it remains selected.
-	 * Indices that are out of range and duplicate indices are ignored.
-	 * If the receiver is single-select and multiple indices are specified,
-	 * then all indices are ignored.
-	 * </p>
-	 *
-	 * @param indices the array of indices for the items to select
-	 *
-	 * @exception IllegalArgumentException - if the array of indices is null
-	 *
-	 */
-	protected abstract void doSelect(int[] indices);
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java
deleted file mode 100644
index 5b7dcc0..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTreeViewer.java
+++ /dev/null
@@ -1,3067 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - bug 153993, bug 167323, bug 175192
- *     Lasse Knudsen, bug 205700
- *     Micah Hainline, bug 210448
- *     Michael Schneider, bug 210747
- *     Bruce Sutton, bug 221768
- *     Matthew Hall, bug 221988
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.events.TreeEvent;
-import org.eclipse.swt.events.TreeListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * Abstract base implementation for tree-structure-oriented viewers (trees and
- * table trees).
- * <p>
- * Nodes in the tree can be in either an expanded or a collapsed state,
- * depending on whether the children on a node are visible. This class
- * introduces public methods for controlling the expanding and collapsing of
- * nodes.
- * </p>
- * <p>
- * As of 3.2, AbstractTreeViewer supports multiple equal elements (each with a
- * different parent chain) in the tree. This support requires that clients
- * enable the element map by calling <code>setUseHashLookup(true)</code>.
- * </p>
- * <p>
- * Content providers for abstract tree viewers must implement one of the
- * interfaces <code>ITreeContentProvider</code> or (as of 3.2, to support
- * multiple equal elements) <code>ITreePathContentProvider</code>.
- * </p>
- *
- * @see TreeViewer
- */
-public abstract class AbstractTreeViewer extends ColumnViewer {
-
-	/**
-	 * Constant indicating that all levels of the tree should be expanded or
-	 * collapsed.
-	 *
-	 * @see #expandToLevel(int)
-	 * @see #collapseToLevel(Object, int)
-	 */
-	public static final int ALL_LEVELS = -1;
-
-	/**
-	 * List of registered tree listeners (element type:
-	 * <code>TreeListener</code>).
-	 */
-	private ListenerList treeListeners = new ListenerList();
-
-	/**
-	 * The level to which the tree is automatically expanded each time the
-	 * viewer's input is changed (that is, by <code>setInput</code>). A value
-	 * of 0 means that auto-expand is off.
-	 *
-	 * @see #setAutoExpandLevel
-	 */
-	private int expandToLevel = 0;
-
-	/**
-	 * Safe runnable used to update an item.
-	 */
-	class UpdateItemSafeRunnable extends SafeRunnable {
-		private Object element;
-
-		private Item item;
-
-		UpdateItemSafeRunnable(Item item, Object element) {
-			this.item = item;
-			this.element = element;
-		}
-
-		public void run() {
-			doUpdateItem(item, element);
-		}
-
-	}
-
-	/**
-	 * Creates an abstract tree viewer. The viewer has no input, no content
-	 * provider, a default label provider, no sorter, no filters, and has
-	 * auto-expand turned off.
-	 */
-	protected AbstractTreeViewer() {
-		// do nothing
-	}
-
-	/**
-	 * Adds the given child elements to this viewer as children of the given
-	 * parent element. If this viewer does not have a sorter, the elements are
-	 * added at the end of the parent's list of children in the order given;
-	 * otherwise, the elements are inserted at the appropriate positions.
-	 * <p>
-	 * This method should be called (by the content provider) when elements have
-	 * been added to the model, in order to cause the viewer to accurately
-	 * reflect the model. This method only affects the viewer, not the model.
-	 * </p>
-	 *
-	 * @param parentElementOrTreePath
-	 *            the parent element
-	 * @param childElements
-	 *            the child elements to add
-	 */
-	public void add(Object parentElementOrTreePath, Object[] childElements) {
-		Assert.isNotNull(parentElementOrTreePath);
-		assertElementsNotNull(childElements);
-		if (checkBusy())
-			return;
-		Widget[] widgets = internalFindItems(parentElementOrTreePath);
-		// If parent hasn't been realized yet, just ignore the add.
-		if (widgets.length == 0) {
-			return;
-		}
-
-		for (int i = 0; i < widgets.length; i++) {
-			internalAdd(widgets[i], parentElementOrTreePath, childElements);
-		}
-	}
-
-	/**
-	 * Find the items for the given element of tree path
-	 *
-	 * @param parentElementOrTreePath
-	 *            the element or tree path
-	 * @return the items for that element
-	 *
-	 * @since 3.3
-	 */
-	final protected Widget[] internalFindItems(Object parentElementOrTreePath) {
-		Widget[] widgets;
-		if (parentElementOrTreePath instanceof TreePath) {
-			TreePath path = (TreePath) parentElementOrTreePath;
-			Widget w = internalFindItem(path);
-			if (w == null) {
-				widgets = new Widget[] {};
-			} else {
-				widgets = new Widget[] { w };
-			}
-		} else {
-			widgets = findItems(parentElementOrTreePath);
-		}
-		return widgets;
-	}
-
-	/**
-	 * Return the item at the given path or <code>null</code>
-	 *
-	 * @param path
-	 *            the path
-	 * @return {@link Widget} the item at that path
-	 */
-	private Widget internalFindItem(TreePath path) {
-		Widget[] widgets = findItems(path.getLastSegment());
-		for (int i = 0; i < widgets.length; i++) {
-			Widget widget = widgets[i];
-			if (widget instanceof Item) {
-				Item item = (Item) widget;
-				TreePath p = getTreePathFromItem(item);
-				if (p.equals(path)) {
-					return widget;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Adds the given child elements to this viewer as children of the given
-	 * parent element.
-	 * <p>
-	 * EXPERIMENTAL. Not to be used except by JDT. This method was added to
-	 * support JDT's explorations into grouping by working sets, which requires
-	 * viewers to support multiple equal elements. See bug 76482 for more
-	 * details. This support will likely be removed in Eclipse 3.2 in favor of
-	 * proper support for multiple equal elements.
-	 * </p>
-	 *
-	 * @param widget
-	 *            the widget for the parent element
-	 * @param parentElementOrTreePath
-	 *            the parent element
-	 * @param childElements
-	 *            the child elements to add
-	 * @since 3.1
-	 */
-	protected void internalAdd(Widget widget, Object parentElementOrTreePath,
-			Object[] childElements) {
-		Object parent;
-		TreePath path;
-		if (parentElementOrTreePath instanceof TreePath) {
-			path = (TreePath) parentElementOrTreePath;
-			parent = path.getLastSegment();
-		} else {
-			parent = parentElementOrTreePath;
-			path = null;
-		}
-
-		// optimization!
-		// if the widget is not expanded we just invalidate the subtree
-		if (widget instanceof Item) {
-			Item ti = (Item) widget;
-			if (!getExpanded(ti)) {
-				boolean needDummy = isExpandable(ti, path, parent);
-				boolean haveDummy = false;
-				// remove all children
-				Item[] items = getItems(ti);
-				for (int i = 0; i < items.length; i++) {
-					if (items[i].getData() != null) {
-						disassociate(items[i]);
-						items[i].dispose();
-					} else {
-						if (needDummy && !haveDummy) {
-							haveDummy = true;
-						} else {
-							items[i].dispose();
-						}
-					}
-				}
-				// append a dummy if necessary
-				if (needDummy && !haveDummy) {
-					newItem(ti, SWT.NULL, -1);
-				}
-				return;
-			}
-		}
-
-		if (childElements.length > 0) {
-			// TODO: Add filtering back?
-			Object[] filtered = filter(parentElementOrTreePath, childElements);
-			ViewerComparator comparator = getComparator();
-			if (comparator != null) {
-				if (comparator instanceof TreePathViewerSorter) {
-					TreePathViewerSorter tpvs = (TreePathViewerSorter) comparator;
-					if (path == null) {
-						path = internalGetSorterParentPath(widget, comparator);
-					}
-					tpvs.sort(this, path, filtered);
-				} else {
-					comparator.sort(this, filtered);
-				}
-			}
-			createAddedElements(widget, filtered);
-		}
-	}
-
-	/**
-	 * Filter the children elements.
-	 *
-	 * @param parentElementOrTreePath
-	 *            the parent element or path
-	 * @param elements
-	 *            the child elements
-	 * @return the filter list of children
-	 */
-	private Object[] filter(Object parentElementOrTreePath, Object[] elements) {
-		ViewerFilter[] filters = getFilters();
-		if (filters != null) {
-			ArrayList filtered = new ArrayList(elements.length);
-			for (int i = 0; i < elements.length; i++) {
-				boolean add = true;
-				for (int j = 0; j < filters.length; j++) {
-					add = filters[j].select(this, parentElementOrTreePath,
-							elements[i]);
-					if (!add) {
-						break;
-					}
-				}
-				if (add) {
-					filtered.add(elements[i]);
-				}
-			}
-			return filtered.toArray();
-		}
-		return elements;
-	}
-
-	/**
-	 * Create the new elements in the parent widget. If the child already exists
-	 * do nothing.
-	 *
-	 * @param widget
-	 * @param elements
-	 *            Sorted list of elements to add.
-	 */
-	private void createAddedElements(Widget widget, Object[] elements) {
-
-		if (elements.length == 1) {
-			if (equals(elements[0], widget.getData())) {
-				return;
-			}
-		}
-
-		ViewerComparator comparator = getComparator();
-		TreePath parentPath = internalGetSorterParentPath(widget, comparator);
-		Item[] items = getChildren(widget);
-
-		// Optimize for the empty case
-		if (items.length == 0) {
-			for (int i = 0; i < elements.length; i++) {
-				createTreeItem(widget, elements[i], -1);
-			}
-			return;
-		}
-
-		// Optimize for no comparator
-		if (comparator == null) {
-			for (int i = 0; i < elements.length; i++) {
-				Object element = elements[i];
-				if (itemExists(items, element)) {
-					internalRefresh(element);
-				} else {
-					createTreeItem(widget, element, -1);
-				}
-			}
-			return;
-		}
-		// As the items are sorted already we optimize for a
-		// start position. This is the insertion position relative to the
-		// original item array.
-		int indexInItems = 0;
-		
-		// Count of elements we have added. See bug 205700 for why this is needed.
-		int newItems = 0;
-		
-		elementloop: for (int i = 0; i < elements.length; i++) {
-			Object element = elements[i];
-			// update the index relative to the original item array
-			indexInItems = insertionPosition(items, comparator,
-					indexInItems, element, parentPath);
-			if (indexInItems == items.length) {
-				createTreeItem(widget, element, -1);
-				newItems++;
-			} else {
-				// Search for an item for the element. The comparator might
-				// regard elements as equal when they are not.
-
-				// Use a separate index variable to search within the existing
-				// elements that compare equally, see
-				// TreeViewerTestBug205700.testAddEquallySortedElements.
-				int insertionIndexInItems = indexInItems;
-				while( insertionIndexInItems < items.length
-						&& internalCompare(comparator, parentPath, element,
-								items[insertionIndexInItems].getData()) == 0) {
-					// As we cannot assume the sorter is consistent with
-					// equals() - therefore we can
-					// just check against the item prior to this index (if
-					// any)
-					if (items[insertionIndexInItems].getData().equals(element)) {
-						// Found the item for the element.
-						// Refresh the element in case it has new children.
-						internalRefresh(element);
-						// Do not create a new item - continue with the next element.
-						continue elementloop;
-					}
-					insertionIndexInItems++;
-				}
-				// Did we get to the end?
-				if (insertionIndexInItems == items.length) {
-					createTreeItem(widget, element, -1);
-					newItems++;
-				} else {
-					// InsertionIndexInItems is the index in the original array. We
-					// need to correct by the number of new items we have
-					// created. See bug 205700.
-					createTreeItem(widget, element, insertionIndexInItems + newItems);
-					newItems++;
-				}
-			}
-		}
-	}
-
-	/**
-	 * See if element is the data of one of the elements in items.
-	 *
-	 * @param items
-	 * @param element
-	 * @return <code>true</code> if the element matches.
-	 */
-	private boolean itemExists(Item[] items, Object element) {
-		if (usingElementMap()) {
-			Widget[] existingItems = findItems(element);
-			// optimization for two common cases
-			if (existingItems.length == 0) {
-				return false;
-			} else if (existingItems.length == 1) {
-				if (items.length > 0 && existingItems[0] instanceof Item) {
-					Item existingItem = (Item) existingItems[0];
-					return getParentItem(existingItem) == getParentItem(items[0]);
-				}
-			}
-		}
-		for (int i = 0; i < items.length; i++) {
-			if (items[i].getData().equals(element)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Returns the index where the item should be inserted. It uses sorter to
-	 * determine the correct position, if sorter is not assigned, returns the
-	 * index of the element after the last.
-	 *
-	 * @param items
-	 *            the items to search
-	 * @param comparator
-	 *            The comparator to use.
-	 * @param lastInsertion
-	 *            the start index to start search for position from this allows
-	 *            optimizing search for multiple elements that are sorted
-	 *            themselves.
-	 * @param element
-	 *            element to find position for.
-	 * @param parentPath
-	 *            the tree path for the element's parent or <code>null</code>
-	 *            if the element is a root element or the sorter is not a
-	 *            {@link TreePathViewerSorter}
-	 * @return the index to use when inserting the element.
-	 *
-	 */
-
-	private int insertionPosition(Item[] items, ViewerComparator comparator,
-			int lastInsertion, Object element, TreePath parentPath) {
-
-		int size = items.length;
-		if (comparator == null) {
-			return size;
-		}
-		int min = lastInsertion, max = size - 1;
-
-		while (min <= max) {
-			int mid = (min + max) / 2;
-			Object data = items[mid].getData();
-			int compare = internalCompare(comparator, parentPath, data, element);
-			if (compare == 0) {
-				return mid;// Return if we already match
-			}
-			if (compare < 0) {
-				min = mid + 1;
-			} else {
-				max = mid - 1;
-			}
-		}
-		return min;
-
-	}
-
-	/**
-	 * Returns the index where the item should be inserted. It uses sorter to
-	 * determine the correct position, if sorter is not assigned, returns the
-	 * index of the element after the last.
-	 *
-	 * @param parent
-	 *            The parent widget
-	 * @param sorter
-	 *            The sorter to use.
-	 * @param startIndex
-	 *            the start index to start search for position from this allows
-	 *            optimizing search for multiple elements that are sorted
-	 *            themselves.
-	 * @param element
-	 *            element to find position for.
-	 * @param currentSize
-	 *            the current size of the collection
-	 * @return the index to use when inserting the element.
-	 *
-	 */
-
-	/**
-	 * Returns the index where the item should be inserted.
-	 *
-	 * @param parent
-	 *            The parent widget the element will be inserted into.
-	 * @param element
-	 *            The element to insert.
-	 * @return the index of the element
-	 */
-	protected int indexForElement(Widget parent, Object element) {
-		ViewerComparator comparator = getComparator();
-		TreePath parentPath = internalGetSorterParentPath(parent, comparator);
-
-		Item[] items = getChildren(parent);
-		int count = items.length;
-
-		if (comparator == null) {
-			return count;
-		}
-		int min = 0, max = count - 1;
-
-		while (min <= max) {
-			int mid = (min + max) / 2;
-			Object data = items[mid].getData();
-			int compare = internalCompare(comparator, parentPath, data, element);
-			if (compare == 0) {
-				// find first item > element
-				while (compare == 0) {
-					++mid;
-					if (mid >= count) {
-						break;
-					}
-					data = items[mid].getData();
-					compare = internalCompare(comparator, parentPath, data,
-							element);
-				}
-				return mid;
-			}
-			if (compare < 0) {
-				min = mid + 1;
-			} else {
-				max = mid - 1;
-			}
-		}
-		return min;
-	}
-
-	/**
-	 * Return the tree path that should be used as the parent path for the given
-	 * widget and sorter. A <code>null</code> is returned if either the sorter
-	 * is not a {@link TreePathViewerSorter} or if the parent widget is not an
-	 * {@link Item} (i.e. is the root of the tree).
-	 *
-	 * @param parent
-	 *            the parent widget
-	 * @param comparator
-	 *            the sorter
-	 * @return the tree path that should be used as the parent path for the
-	 *         given widget and sorter
-	 */
-	private TreePath internalGetSorterParentPath(Widget parent,
-			ViewerComparator comparator) {
-		TreePath path;
-		if (comparator instanceof TreePathViewerSorter
-				&& parent instanceof Item) {
-			Item item = (Item) parent;
-			path = getTreePathFromItem(item);
-		} else {
-			path = null;
-		}
-		return path;
-	}
-
-	/**
-	 * Compare the two elements using the given sorter. If the sorter is a
-	 * {@link TreePathViewerSorter}, the provided tree path will be used. If
-	 * the tree path is null and the sorter is a tree path sorter, then the
-	 * elements are root elements
-	 *
-	 * @param comparator
-	 *            the sorter
-	 * @param parentPath
-	 *            the path of the elements' parent
-	 * @param e1
-	 *            the first element
-	 * @param e2
-	 *            the second element
-	 * @return the result of comparing the two elements
-	 */
-	private int internalCompare(ViewerComparator comparator,
-			TreePath parentPath, Object e1, Object e2) {
-		if (comparator instanceof TreePathViewerSorter) {
-			TreePathViewerSorter tpvs = (TreePathViewerSorter) comparator;
-			return tpvs.compare(this, parentPath, e1, e2);
-		}
-		return comparator.compare(this, e1, e2);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.StructuredViewer#getSortedChildren(java.lang.Object)
-	 */
-	protected Object[] getSortedChildren(Object parentElementOrTreePath) {
-		Object[] result = getFilteredChildren(parentElementOrTreePath);
-		ViewerComparator comparator = getComparator();
-		if (parentElementOrTreePath != null
-				&& comparator instanceof TreePathViewerSorter) {
-			TreePathViewerSorter tpvs = (TreePathViewerSorter) comparator;
-
-			// be sure we're not modifying the original array from the model
-			result = (Object[]) result.clone();
-
-			TreePath path = null;
-			if (parentElementOrTreePath instanceof TreePath) {
-				path = (TreePath) parentElementOrTreePath;
-			} else {
-				Object parent = parentElementOrTreePath;
-				Widget w = internalGetWidgetToSelect(parent);
-				if (w != null) {
-					path = internalGetSorterParentPath(w, comparator);
-				}
-			}
-			tpvs.sort(this, path, result);
-		} else if (comparator != null) {
-			// be sure we're not modifying the original array from the model
-			result = (Object[]) result.clone();
-			comparator.sort(this, result);
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.StructuredViewer#getFilteredChildren(java.lang.Object)
-	 */
-	protected Object[] getFilteredChildren(Object parentElementOrTreePath) {
-		Object[] result = getRawChildren(parentElementOrTreePath);
-		ViewerFilter[] filters = getFilters();
-		for (int i = 0; i < filters.length; i++) {
-			ViewerFilter filter = filters[i];
-			result = filter.filter(this, parentElementOrTreePath, result);
-		}
-		return result;
-	}
-
-	/**
-	 * Adds the given child element to this viewer as a child of the given
-	 * parent element. If this viewer does not have a sorter, the element is
-	 * added at the end of the parent's list of children; otherwise, the element
-	 * is inserted at the appropriate position.
-	 * <p>
-	 * This method should be called (by the content provider) when a single
-	 * element has been added to the model, in order to cause the viewer to
-	 * accurately reflect the model. This method only affects the viewer, not
-	 * the model. Note that there is another method for efficiently processing
-	 * the simultaneous addition of multiple elements.
-	 * </p>
-	 *
-	 * @param parentElementOrTreePath
-	 *            the parent element or path
-	 * @param childElement
-	 *            the child element
-	 */
-	public void add(Object parentElementOrTreePath, Object childElement) {
-		add(parentElementOrTreePath, new Object[] { childElement });
-	}
-
-	/**
-	 * Adds the given SWT selection listener to the given SWT control.
-	 *
-	 * @param control
-	 *            the SWT control
-	 * @param listener
-	 *            the SWT selection listener
-	 * @deprecated
-	 */
-	protected void addSelectionListener(Control control,
-			SelectionListener listener) {
-		// do nothing
-	}
-
-	/**
-	 * Adds a listener for expand and collapse events in this viewer. Has no
-	 * effect if an identical listener is already registered.
-	 *
-	 * @param listener
-	 *            a tree viewer listener
-	 */
-	public void addTreeListener(ITreeViewerListener listener) {
-		treeListeners.add(listener);
-	}
-
-	/**
-	 * Adds the given SWT tree listener to the given SWT control.
-	 *
-	 * @param control
-	 *            the SWT control
-	 * @param listener
-	 *            the SWT tree listener
-	 */
-	protected abstract void addTreeListener(Control control,
-			TreeListener listener);
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see StructuredViewer#associate(Object, Item)
-	 */
-	protected void associate(Object element, Item item) {
-		Object data = item.getData();
-		if (data != null && data != element && equals(data, element)) {
-			// workaround for PR 1FV62BT
-			// assumption: elements are equal but not identical
-			// -> remove from map but don't touch children
-			unmapElement(data, item);
-			item.setData(element);
-			mapElement(element, item);
-		} else {
-			// recursively disassociate all
-			super.associate(element, item);
-		}
-	}
-
-	/**
-	 * Collapses all nodes of the viewer's tree, starting with the root. This
-	 * method is equivalent to <code>collapseToLevel(ALL_LEVELS)</code>.
-	 */
-	public void collapseAll() {
-		Object root = getRoot();
-		if (root != null) {
-			collapseToLevel(root, ALL_LEVELS);
-		}
-	}
-
-	/**
-	 * Collapses the subtree rooted at the given element or tree path to the
-	 * given level.
-	 *
-	 * @param elementOrTreePath
-	 *            the element or tree path
-	 * @param level
-	 *            non-negative level, or <code>ALL_LEVELS</code> to collapse
-	 *            all levels of the tree
-	 */
-	public void collapseToLevel(Object elementOrTreePath, int level) {
-		Assert.isNotNull(elementOrTreePath);
-		Widget w = internalGetWidgetToSelect(elementOrTreePath);
-		if (w != null) {
-			internalCollapseToLevel(w, level);
-		}
-	}
-
-	/**
-	 * Creates all children for the given widget.
-	 * <p>
-	 * The default implementation of this framework method assumes that
-	 * <code>widget.getData()</code> returns the element corresponding to the
-	 * node. Note: the node is not visually expanded! You may have to call
-	 * <code>parent.setExpanded(true)</code>.
-	 * </p>
-	 *
-	 * @param widget
-	 *            the widget
-	 */
-	protected void createChildren(final Widget widget) {
-		boolean oldBusy = isBusy();
-		setBusy(true);
-		try {
-			final Item[] tis = getChildren(widget);
-			if (tis != null && tis.length > 0) {
-				Object data = tis[0].getData();
-				if (data != null) {
-					return; // children already there!
-				}
-			}
-
-			BusyIndicator.showWhile(widget.getDisplay(), new Runnable() {
-				public void run() {
-					// fix for PR 1FW89L7:
-					// don't complain and remove all "dummies" ...
-					if (tis != null) {
-						for (int i = 0; i < tis.length; i++) {
-							if (tis[i].getData() != null) {
-								disassociate(tis[i]);
-								Assert.isTrue(tis[i].getData() == null,
-										"Second or later child is non -null");//$NON-NLS-1$
-
-							}
-							tis[i].dispose();
-						}
-					}
-					Object d = widget.getData();
-					if (d != null) {
-						Object parentElement = d;
-						Object[] children;
-						if (isTreePathContentProvider() && widget instanceof Item) {
-							TreePath path = getTreePathFromItem((Item) widget);
-							children = getSortedChildren(path);
-						} else {
-							children = getSortedChildren(parentElement);
-						}
-						for (int i = 0; i < children.length; i++) {
-							createTreeItem(widget, children[i], -1);
-						}
-					}
-				}
-
-			});
-		} finally {
-			setBusy(oldBusy);
-		}
-	}
-
-	/**
-	 * Creates a single item for the given parent and synchronizes it with the
-	 * given element.
-	 *
-	 * @param parent
-	 *            the parent widget
-	 * @param element
-	 *            the element
-	 * @param index
-	 *            if non-negative, indicates the position to insert the item
-	 *            into its parent
-	 */
-	protected void createTreeItem(Widget parent, Object element, int index) {
-		Item item = newItem(parent, SWT.NULL, index);
-		updateItem(item, element);
-		updatePlus(item, element);
-	}
-
-	/**
-	 * The <code>AbstractTreeViewer</code> implementation of this method also
-	 * recurses over children of the corresponding element.
-	 */
-	protected void disassociate(Item item) {
-		super.disassociate(item);
-		// recursively unmapping the items is only required when
-		// the hash map is used. In the other case disposing
-		// an item will recursively dispose its children.
-		if (usingElementMap()) {
-			disassociateChildren(item);
-		}
-	}
-
-	/**
-	 * Disassociates the children of the given SWT item from their corresponding
-	 * elements.
-	 *
-	 * @param item
-	 *            the widget
-	 */
-	private void disassociateChildren(Item item) {
-		Item[] items = getChildren(item);
-		for (int i = 0; i < items.length; i++) {
-			if (items[i].getData() != null) {
-				disassociate(items[i]);
-			}
-		}
-	}
-
-	/* (non-Javadoc) Method declared on StructuredViewer. */
-	protected Widget doFindInputItem(Object element) {
-		// compare with root
-		Object root = getRoot();
-		if (root == null) {
-			return null;
-		}
-
-		if (equals(root, element)) {
-			return getControl();
-		}
-		return null;
-	}
-
-	/* (non-Javadoc) Method declared on StructuredViewer. */
-	protected Widget doFindItem(Object element) {
-		// compare with root
-		Object root = getRoot();
-		if (root == null) {
-			return null;
-		}
-
-		Item[] items = getChildren(getControl());
-		if (items != null) {
-			for (int i = 0; i < items.length; i++) {
-				Widget o = internalFindItem(items[i], element);
-				if (o != null) {
-					return o;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Copies the attributes of the given element into the given SWT item.
-	 *
-	 * @param item
-	 *            the SWT item
-	 * @param element
-	 *            the element
-	 */
-	protected void doUpdateItem(final Item item, Object element) {
-		if (item.isDisposed()) {
-			unmapElement(element, item);
-			return;
-		}
-
-		int columnCount = doGetColumnCount();
-		if (columnCount == 0)// If no columns are created then fake one
-			columnCount = 1;
-
-		ViewerRow viewerRowFromItem = getViewerRowFromItem(item);
-
-		boolean isVirtual = (getControl().getStyle() & SWT.VIRTUAL) != 0;
-
-		// If the control is virtual, we cannot use the cached viewer row object. See bug 188663.
-		if (isVirtual) {
-			viewerRowFromItem = (ViewerRow) viewerRowFromItem.clone();
-		}
-
-		for (int column = 0; column < columnCount; column++) {
-			ViewerColumn columnViewer = getViewerColumn(column);
-			ViewerCell cellToUpdate = updateCell(viewerRowFromItem, column,
-					element);
-
-			// If the control is virtual, we cannot use the cached cell object. See bug 188663.
-			if (isVirtual) {
-				cellToUpdate = new ViewerCell(cellToUpdate.getViewerRow(), cellToUpdate.getColumnIndex(), element);
-			}
-
-			columnViewer.refresh(cellToUpdate);
-
-			// clear cell (see bug 201280)
-			updateCell(null, 0, null);
-
-			// As it is possible for user code to run the event
-			// loop check here.
-			if (item.isDisposed()) {
-				unmapElement(element, item);
-				return;
-			}
-
-		}
-	}
-
-	/**
-	 * Returns <code>true</code> if the given list and array of items refer to
-	 * the same model elements. Order is unimportant.
-	 * <p>
-	 * This method is not intended to be overridden by subclasses.
-	 * </p>
-	 *
-	 * @param items
-	 *            the list of items
-	 * @param current
-	 *            the array of items
-	 * @return <code>true</code> if the refer to the same elements,
-	 *         <code>false</code> otherwise
-	 *
-	 * @since 3.1 in TreeViewer, moved to AbstractTreeViewer in 3.3
-	 */
-	protected boolean isSameSelection(List items, Item[] current) {
-		// If they are not the same size then they are not equivalent
-		int n = items.size();
-		if (n != current.length) {
-			return false;
-		}
-
-		CustomHashtable itemSet = newHashtable(n * 2 + 1);
-		for (Iterator i = items.iterator(); i.hasNext();) {
-			Item item = (Item) i.next();
-			Object element = item.getData();
-			itemSet.put(element, element);
-		}
-
-		// Go through the items of the current collection
-		// If there is a mismatch return false
-		for (int i = 0; i < current.length; i++) {
-			if (current[i].getData() == null
-					|| !itemSet.containsKey(current[i].getData())) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-
-
-	/* (non-Javadoc) Method declared on StructuredViewer. */
-	protected void doUpdateItem(Widget widget, Object element, boolean fullMap) {
-		boolean oldBusy = isBusy();
-		setBusy(true);
-		try {
-			if (widget instanceof Item) {
-				Item item = (Item) widget;
-
-				// ensure that back pointer is correct
-				if (fullMap) {
-					associate(element, item);
-				} else {
-					Object data = item.getData();
-					if (data != null) {
-						unmapElement(data, item);
-					}
-					item.setData(element);
-					mapElement(element, item);
-				}
-
-				// update icon and label
-				SafeRunnable.run(new UpdateItemSafeRunnable(item, element));
-			}
-		} finally {
-			setBusy(oldBusy);
-		}
-	}
-
-	/**
-	 * Expands all nodes of the viewer's tree, starting with the root. This
-	 * method is equivalent to <code>expandToLevel(ALL_LEVELS)</code>.
-	 */
-	public void expandAll() {
-		expandToLevel(ALL_LEVELS);
-	}
-
-	/**
-	 * Expands the root of the viewer's tree to the given level.
-	 *
-	 * @param level
-	 *            non-negative level, or <code>ALL_LEVELS</code> to expand all
-	 *            levels of the tree
-	 */
-	public void expandToLevel(int level) {
-		expandToLevel(getRoot(), level);
-	}
-
-	/**
-	 * Expands all ancestors of the given element or tree path so that the given
-	 * element becomes visible in this viewer's tree control, and then expands
-	 * the subtree rooted at the given element to the given level.
-	 *
-	 * @param elementOrTreePath
-	 *            the element
-	 * @param level
-	 *            non-negative level, or <code>ALL_LEVELS</code> to expand all
-	 *            levels of the tree
-	 */
-	public void expandToLevel(Object elementOrTreePath, int level) {
-		if (checkBusy())
-			return;
-		Widget w = internalExpand(elementOrTreePath, true);
-		if (w != null) {
-			internalExpandToLevel(w, level);
-		}
-	}
-
-	/**
-	 * Fires a tree collapsed event. Only listeners registered at the time this
-	 * method is called are notified.
-	 *
-	 * @param event
-	 *            the tree expansion event
-	 * @see ITreeViewerListener#treeCollapsed
-	 */
-	protected void fireTreeCollapsed(final TreeExpansionEvent event) {
-		Object[] listeners = treeListeners.getListeners();
-		boolean oldBusy = isBusy();
-		setBusy(true);
-		try {
-			for (int i = 0; i < listeners.length; ++i) {
-				final ITreeViewerListener l = (ITreeViewerListener) listeners[i];
-				SafeRunnable.run(new SafeRunnable() {
-					public void run() {
-						l.treeCollapsed(event);
-					}
-				});
-			}
-		} finally {
-			setBusy(oldBusy);
-		}
-	}
-
-	/**
-	 * Fires a tree expanded event. Only listeners registered at the time this
-	 * method is called are notified.
-	 *
-	 * @param event
-	 *            the tree expansion event
-	 * @see ITreeViewerListener#treeExpanded
-	 */
-	protected void fireTreeExpanded(final TreeExpansionEvent event) {
-		Object[] listeners = treeListeners.getListeners();
-		boolean oldBusy = isBusy();
-		setBusy(true);
-		try {
-			for (int i = 0; i < listeners.length; ++i) {
-				final ITreeViewerListener l = (ITreeViewerListener) listeners[i];
-				SafeRunnable.run(new SafeRunnable() {
-					public void run() {
-						l.treeExpanded(event);
-					}
-				});
-			}
-		} finally {
-			setBusy(oldBusy);
-		}
-	}
-
-	/**
-	 * Returns the auto-expand level.
-	 *
-	 * @return non-negative level, or <code>ALL_LEVELS</code> if all levels of
-	 *         the tree are expanded automatically
-	 * @see #setAutoExpandLevel
-	 */
-	public int getAutoExpandLevel() {
-		return expandToLevel;
-	}
-
-	/**
-	 * Returns the SWT child items for the given SWT widget.
-	 *
-	 * @param widget
-	 *            the widget
-	 * @return the child items
-	 */
-	protected abstract Item[] getChildren(Widget widget);
-
-	/**
-	 * Get the child for the widget at index. Note that the default
-	 * implementation is not very efficient and should be overridden if this
-	 * class is implemented.
-	 *
-	 * @param widget
-	 *            the widget to check
-	 * @param index
-	 *            the index of the widget
-	 * @return Item or <code>null</code> if widget is not a type that can
-	 *         contain items.
-	 *
-	 * @throws ArrayIndexOutOfBoundsException
-	 *             if the index is not valid.
-	 * @since 3.1
-	 */
-	protected Item getChild(Widget widget, int index) {
-		return getChildren(widget)[index];
-	}
-
-	/**
-	 * Returns whether the given SWT item is expanded or collapsed.
-	 *
-	 * @param item
-	 *            the item
-	 * @return <code>true</code> if the item is considered expanded and
-	 *         <code>false</code> if collapsed
-	 */
-	protected abstract boolean getExpanded(Item item);
-
-	/**
-	 * Returns a list of elements corresponding to expanded nodes in this
-	 * viewer's tree, including currently hidden ones that are marked as
-	 * expanded but are under a collapsed ancestor.
-	 * <p>
-	 * This method is typically used when preserving the interesting state of a
-	 * viewer; <code>setExpandedElements</code> is used during the restore.
-	 * </p>
-	 *
-	 * @return the array of expanded elements
-	 * @see #setExpandedElements
-	 */
-	public Object[] getExpandedElements() {
-		ArrayList items = new ArrayList();
-		internalCollectExpandedItems(items, getControl());
-		ArrayList result = new ArrayList(items.size());
-		for (Iterator it = items.iterator(); it.hasNext();) {
-			Item item = (Item) it.next();
-			Object data = item.getData();
-			if (data != null) {
-				result.add(data);
-			}
-		}
-		return result.toArray();
-	}
-
-	/**
-	 * Returns whether the node corresponding to the given element or tree path
-	 * is expanded or collapsed.
-	 *
-	 * @param elementOrTreePath
-	 *            the element
-	 * @return <code>true</code> if the node is expanded, and
-	 *         <code>false</code> if collapsed
-	 */
-	public boolean getExpandedState(Object elementOrTreePath) {
-		Assert.isNotNull(elementOrTreePath);
-		Widget item = internalGetWidgetToSelect(elementOrTreePath);
-		if (item instanceof Item) {
-			return getExpanded((Item) item);
-		}
-		return false;
-	}
-
-	/**
-	 * Returns the number of child items of the given SWT control.
-	 *
-	 * @param control
-	 *            the control
-	 * @return the number of children
-	 */
-	protected abstract int getItemCount(Control control);
-
-	/**
-	 * Returns the number of child items of the given SWT item.
-	 *
-	 * @param item
-	 *            the item
-	 * @return the number of children
-	 */
-	protected abstract int getItemCount(Item item);
-
-	/**
-	 * Returns the child items of the given SWT item.
-	 *
-	 * @param item
-	 *            the item
-	 * @return the child items
-	 */
-	protected abstract Item[] getItems(Item item);
-
-	/**
-	 * Returns the item after the given item in the tree, or <code>null</code>
-	 * if there is no next item.
-	 *
-	 * @param item
-	 *            the item
-	 * @param includeChildren
-	 *            <code>true</code> if the children are considered in
-	 *            determining which item is next, and <code>false</code> if
-	 *            subtrees are ignored
-	 * @return the next item, or <code>null</code> if none
-	 */
-	protected Item getNextItem(Item item, boolean includeChildren) {
-		if (item == null) {
-			return null;
-		}
-		if (includeChildren && getExpanded(item)) {
-			Item[] children = getItems(item);
-			if (children != null && children.length > 0) {
-				return children[0];
-			}
-		}
-
-		// next item is either next sibling or next sibling of first
-		// parent that has a next sibling.
-		Item parent = getParentItem(item);
-		if (parent == null) {
-			return null;
-		}
-		Item[] siblings = getItems(parent);
-		if (siblings != null) {
-			if (siblings.length <= 1) {
-				return getNextItem(parent, false);
-			}
-
-			for (int i = 0; i < siblings.length; i++) {
-				if (siblings[i] == item && i < (siblings.length - 1)) {
-					return siblings[i + 1];
-				}
-			}
-		}
-		return getNextItem(parent, false);
-	}
-
-	/**
-	 * Returns the parent item of the given item in the tree, or
-	 * <code>null</code> if there is no parent item.
-	 *
-	 * @param item
-	 *            the item
-	 * @return the parent item, or <code>null</code> if none
-	 */
-	protected abstract Item getParentItem(Item item);
-
-	/**
-	 * Returns the item before the given item in the tree, or <code>null</code>
-	 * if there is no previous item.
-	 *
-	 * @param item
-	 *            the item
-	 * @return the previous item, or <code>null</code> if none
-	 */
-	protected Item getPreviousItem(Item item) {
-		// previous item is either right-most visible descendent of previous
-		// sibling or parent
-		Item parent = getParentItem(item);
-		if (parent == null) {
-			return null;
-		}
-		Item[] siblings = getItems(parent);
-		if (siblings.length == 0 || siblings[0] == item) {
-			return parent;
-		}
-		Item previous = siblings[0];
-		for (int i = 1; i < siblings.length; i++) {
-			if (siblings[i] == item) {
-				return rightMostVisibleDescendent(previous);
-			}
-			previous = siblings[i];
-		}
-		return null;
-	}
-
-	/* (non-Javadoc) Method declared on StructuredViewer. */
-	protected Object[] getRawChildren(Object parentElementOrTreePath) {
-		boolean oldBusy = isBusy();
-		setBusy(true);
-		try {
-			Object parent;
-			TreePath path;
-			if (parentElementOrTreePath instanceof TreePath) {
-				path = (TreePath) parentElementOrTreePath;
-				parent = path.getLastSegment();
-			} else {
-				parent = parentElementOrTreePath;
-				path = null;
-			}
-			if (parent != null) {
-				if (equals(parent, getRoot())) {
-					return super.getRawChildren(parent);
-				}
-				IContentProvider cp = getContentProvider();
-				if (cp instanceof ITreePathContentProvider) {
-					ITreePathContentProvider tpcp = (ITreePathContentProvider) cp;
-					if (path == null) {
-						// A path was not provided so try and find one
-						Widget w = findItem(parent);
-						if (w instanceof Item) {
-							Item item = (Item) w;
-							path = getTreePathFromItem(item);
-						}
-						if (path == null) {
-							path = new TreePath(new Object[] { parent });
-						}
-					}
-					Object[] result = tpcp.getChildren(path);
-					if (result != null) {
-						return result;
-					}
-				} else if (cp instanceof ITreeContentProvider) {
-					ITreeContentProvider tcp = (ITreeContentProvider) cp;
-					Object[] result = tcp.getChildren(parent);
-					if (result != null) {
-						return result;
-					}
-				}
-			}
-			return new Object[0];
-		} finally {
-			setBusy(oldBusy);
-		}
-	}
-
-	/**
-	 * Returns all selected items for the given SWT control.
-	 *
-	 * @param control
-	 *            the control
-	 * @return the list of selected items
-	 */
-	protected abstract Item[] getSelection(Control control);
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.StructuredViewer#getSelectionFromWidget()
-	 */
-	protected List getSelectionFromWidget() {
-		Widget[] items = getSelection(getControl());
-		ArrayList list = new ArrayList(items.length);
-		for (int i = 0; i < items.length; i++) {
-			Widget item = items[i];
-			Object e = item.getData();
-			if (e != null) {
-				list.add(e);
-			}
-		}
-		return list;
-	}
-
-	/*
-	 * Overridden in AbstractTreeViewer to fix bug 108102 (code copied from
-	 * StructuredViewer to avoid introducing new API) (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.StructuredViewer#handleDoubleSelect(org.eclipse.swt.events.SelectionEvent)
-	 */
-	protected void handleDoubleSelect(SelectionEvent event) {
-		// handle case where an earlier selection listener disposed the control.
-		Control control = getControl();
-		if (control != null && !control.isDisposed()) {
-			// If the double-clicked element can be obtained from the event, use
-			// it
-			// otherwise get it from the control. Some controls like List do
-			// not have the notion of item.
-			// For details, see bug 90161 [Navigator] DefaultSelecting folders
-			// shouldn't always expand first one
-			ISelection selection;
-			if (event.item != null && event.item.getData() != null) {
-
-				// changes to fix bug 108102 follow
-				TreePath treePath = getTreePathFromItem((Item) event.item);
-				selection = new TreeSelection(treePath);
-				// end of changes
-
-			} else {
-				selection = getSelection();
-				updateSelection(selection);
-			}
-			fireDoubleClick(new DoubleClickEvent(this, selection));
-		}
-	}
-
-	/**
-	 * Handles a tree collapse event from the SWT widget.
-	 *
-	 * @param event
-	 *            the SWT tree event
-	 */
-	protected void handleTreeCollapse(TreeEvent event) {
-		if (event.item.getData() != null) {
-			fireTreeCollapsed(new TreeExpansionEvent(this, event.item.getData()));
-		}
-	}
-
-	/**
-	 * Handles a tree expand event from the SWT widget.
-	 *
-	 * @param event
-	 *            the SWT tree event
-	 */
-	protected void handleTreeExpand(TreeEvent event) {
-		createChildren(event.item);
-		if (event.item.getData() != null) {
-			fireTreeExpanded(new TreeExpansionEvent(this, event.item.getData()));
-		}
-	}
-
-	/* (non-Javadoc) Method declared on Viewer. */
-	protected void hookControl(Control control) {
-		super.hookControl(control);
-		addTreeListener(control, new TreeListener() {
-			public void treeExpanded(TreeEvent event) {
-				handleTreeExpand(event);
-			}
-
-			public void treeCollapsed(TreeEvent event) {
-				handleTreeCollapse(event);
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on StructuredViewer. Builds the initial
-	 * tree and handles the automatic expand feature.
-	 */
-	protected void inputChanged(Object input, Object oldInput) {
-		preservingSelection(new Runnable() {
-			public void run() {
-	            Control tree = getControl();
-	            tree.setRedraw(false);
-	            try {
-	                removeAll(tree);
-	                tree.setData(getRoot());
-	                internalInitializeTree(tree);
-	            } finally {
-	                tree.setRedraw(true);
-	            }
-			}
-		});
-	}
-
-	/**
-	 * Initializes the tree with root items, expanding to the appropriate
-	 * level if necessary.
-	 *
-	 * @param tree the tree control
-	 * @since 3.3
-	 */
-	protected void internalInitializeTree(Control tree) {
-		createChildren(tree);
-		internalExpandToLevel(tree, expandToLevel);
-	}
-
-	/**
-	 * Recursively collapses the subtree rooted at the given widget to the given
-	 * level.
-	 * <p>
-	 * </p>
-	 * Note that the default implementation of this method does not call
-	 * <code>setRedraw</code>.
-	 *
-	 * @param widget
-	 *            the widget
-	 * @param level
-	 *            non-negative level, or <code>ALL_LEVELS</code> to collapse
-	 *            all levels of the tree
-	 */
-	protected void internalCollapseToLevel(Widget widget, int level) {
-		if (level == ALL_LEVELS || level > 0) {
-
-			if (widget instanceof Item) {
-				setExpanded((Item) widget, false);
-			}
-
-			if (level == ALL_LEVELS || level > 1) {
-				Item[] children = getChildren(widget);
-				if (children != null) {
-					int nextLevel = (level == ALL_LEVELS ? ALL_LEVELS
-							: level - 1);
-					for (int i = 0; i < children.length; i++) {
-						internalCollapseToLevel(children[i], nextLevel);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Recursively collects all expanded items from the given widget.
-	 *
-	 * @param result
-	 *            a list (element type: <code>Item</code>) into which to
-	 *            collect the elements
-	 * @param widget
-	 *            the widget
-	 */
-	private void internalCollectExpandedItems(List result, Widget widget) {
-		Item[] items = getChildren(widget);
-		for (int i = 0; i < items.length; i++) {
-			Item item = items[i];
-			if (getExpanded(item)) {
-				result.add(item);
-			}
-			internalCollectExpandedItems(result, item);
-		}
-	}
-
-	/**
-	 * Tries to create a path of tree items for the given element or tree path.
-	 * This method recursively walks up towards the root of the tree and in the
-	 * case of an element (rather than a tree path) assumes that
-	 * <code>getParent</code> returns the correct parent of an element.
-	 *
-	 * @param elementOrPath
-	 *            the element
-	 * @param expand
-	 *            <code>true</code> if all nodes on the path should be
-	 *            expanded, and <code>false</code> otherwise
-	 * @return Widget
-	 */
-	protected Widget internalExpand(Object elementOrPath, boolean expand) {
-
-		if (elementOrPath == null) {
-			return null;
-		}
-
-		Widget w = internalGetWidgetToSelect(elementOrPath);
-		if (w == null) {
-			if (equals(elementOrPath, getRoot())) { // stop at root
-				return null;
-			}
-			// my parent has to create me
-			Object parent = getParentElement(elementOrPath);
-			if (parent != null) {
-				Widget pw = internalExpand(parent, false);
-				if (pw != null) {
-					// let my parent create me
-					createChildren(pw);
-					Object element = internalToElement(elementOrPath);
-					w = internalFindChild(pw, element);
-					if (expand && pw instanceof Item) {
-						// expand parent items top-down
-						Item item = (Item) pw;
-						LinkedList toExpandList = new LinkedList();
-						while (item != null && !getExpanded(item)) {
-							toExpandList.addFirst(item);
-							item = getParentItem(item);
-						}
-						for (Iterator it = toExpandList.iterator(); it
-								.hasNext();) {
-							Item toExpand = (Item) it.next();
-							setExpanded(toExpand, true);
-						}
-					}
-				}
-			}
-		}
-		return w;
-	}
-
-	/**
-	 * If the argument is a tree path, returns its last segment, otherwise
-	 * return the argument
-	 *
-	 * @param elementOrPath
-	 *            an element or a tree path
-	 * @return the element, or the last segment of the tree path
-	 */
-	private Object internalToElement(Object elementOrPath) {
-		if (elementOrPath instanceof TreePath) {
-			return ((TreePath) elementOrPath).getLastSegment();
-		}
-		return elementOrPath;
-	}
-
-	/**
-	 * This method takes a tree path or an element. If the argument is not a
-	 * tree path, returns the parent of the given element or <code>null</code>
-	 * if the parent is not known. If the argument is a tree path with more than
-	 * one segment, returns its parent tree path, otherwise returns
-	 * <code>null</code>.
-	 *
-	 * @param elementOrTreePath
-	 * @return the parent element, or parent path, or <code>null</code>
-	 *
-	 * @since 3.2
-	 */
-	protected Object getParentElement(Object elementOrTreePath) {
-		if (elementOrTreePath instanceof TreePath) {
-			TreePath treePath = (TreePath) elementOrTreePath;
-			return (treePath).getParentPath();
-		}
-		IContentProvider cp = getContentProvider();
-		if (cp instanceof ITreePathContentProvider) {
-			ITreePathContentProvider tpcp = (ITreePathContentProvider) cp;
-			TreePath[] paths = tpcp.getParents(elementOrTreePath);
-			if (paths.length > 0) {
-				if (paths[0].getSegmentCount() == 0) {
-					return getRoot();
-				}
-				return paths[0].getLastSegment();
-			}
-		}
-		if (cp instanceof ITreeContentProvider) {
-			ITreeContentProvider tcp = (ITreeContentProvider) cp;
-			return tcp.getParent(elementOrTreePath);
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the widget to be selected for the given element or tree path.
-	 *
-	 * @param elementOrTreePath
-	 *            the element or tree path to select
-	 * @return the widget to be selected, or <code>null</code> if not found
-	 *
-	 * @since 3.1
-	 */
-	protected Widget internalGetWidgetToSelect(Object elementOrTreePath) {
-		if (elementOrTreePath instanceof TreePath) {
-			TreePath treePath = (TreePath) elementOrTreePath;
-			if (treePath.getSegmentCount() == 0) {
-				return getControl();
-			}
-			Widget[] candidates = findItems(treePath.getLastSegment());
-			for (int i = 0; i < candidates.length; i++) {
-				Widget candidate = candidates[i];
-				if (!(candidate instanceof Item)) {
-					continue;
-				}
-				if (treePath.equals(getTreePathFromItem((Item) candidate),
-						getComparer())) {
-					return candidate;
-				}
-			}
-			return null;
-		}
-		return findItem(elementOrTreePath);
-	}
-
-	/**
-	 * Recursively expands the subtree rooted at the given widget to the given
-	 * level.
-	 * <p>
-	 * </p>
-	 * Note that the default implementation of this method does not call
-	 * <code>setRedraw</code>.
-	 *
-	 * @param widget
-	 *            the widget
-	 * @param level
-	 *            non-negative level, or <code>ALL_LEVELS</code> to collapse
-	 *            all levels of the tree
-	 */
-	protected void internalExpandToLevel(Widget widget, int level) {
-		if (level == ALL_LEVELS || level > 0) {
-			if (widget instanceof Item && widget.getData() != null
-					&& !isExpandable((Item) widget, null, widget.getData())) {
-				return;
-			}
-			createChildren(widget);
-			if (widget instanceof Item) {
-				setExpanded((Item) widget, true);
-			}
-			if (level == ALL_LEVELS || level > 1) {
-				Item[] children = getChildren(widget);
-				if (children != null) {
-					int newLevel = (level == ALL_LEVELS ? ALL_LEVELS
-							: level - 1);
-					for (int i = 0; i < children.length; i++) {
-						internalExpandToLevel(children[i], newLevel);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Non-recursively tries to find the given element as a child of the given
-	 * parent (item or tree).
-	 *
-	 * @param parent
-	 *            the parent item
-	 * @param element
-	 *            the element
-	 * @return Widget
-	 */
-	private Widget internalFindChild(Widget parent, Object element) {
-		Item[] items = getChildren(parent);
-		for (int i = 0; i < items.length; i++) {
-			Item item = items[i];
-			Object data = item.getData();
-			if (data != null && equals(data, element)) {
-				return item;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Recursively tries to find the given element.
-	 *
-	 * @param parent
-	 *            the parent item
-	 * @param element
-	 *            the element
-	 * @return Widget
-	 */
-	private Widget internalFindItem(Item parent, Object element) {
-
-		// compare with node
-		Object data = parent.getData();
-		if (data != null) {
-			if (equals(data, element)) {
-				return parent;
-			}
-		}
-		// recurse over children
-		Item[] items = getChildren(parent);
-		for (int i = 0; i < items.length; i++) {
-			Item item = items[i];
-			Widget o = internalFindItem(item, element);
-			if (o != null) {
-				return o;
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc) Method declared on StructuredViewer. */
-	protected void internalRefresh(Object element) {
-		internalRefresh(element, true);
-	}
-
-	/* (non-Javadoc) Method declared on StructuredViewer. */
-	protected void internalRefresh(Object element, boolean updateLabels) {
-		// If element is null, do a full refresh.
-		if (element == null) {
-			internalRefresh(getControl(), getRoot(), true, updateLabels);
-			return;
-		}
-		Widget[] items = findItems(element);
-		if (items.length != 0) {
-			for (int i = 0; i < items.length; i++) {
-				// pick up structure changes too
-				internalRefresh(items[i], element, true, updateLabels);
-			}
-		}
-	}
-
-	/**
-	 * Refreshes the tree starting at the given widget.
-	 * <p>
-	 * EXPERIMENTAL. Not to be used except by JDT. This method was added to
-	 * support JDT's explorations into grouping by working sets, which requires
-	 * viewers to support multiple equal elements. See bug 76482 for more
-	 * details. This support will likely be removed in Eclipse 3.2 in favor of
-	 * proper support for multiple equal elements.
-	 * </p>
-	 *
-	 * @param widget
-	 *            the widget
-	 * @param element
-	 *            the element
-	 * @param doStruct
-	 *            <code>true</code> if structural changes are to be picked up,
-	 *            and <code>false</code> if only label provider changes are of
-	 *            interest
-	 * @param updateLabels
-	 *            <code>true</code> to update labels for existing elements,
-	 *            <code>false</code> to only update labels as needed, assuming
-	 *            that labels for existing elements are unchanged.
-	 * @since 3.1
-	 */
-	protected void internalRefresh(Widget widget, Object element,
-			boolean doStruct, boolean updateLabels) {
-
-		if (widget instanceof Item) {
-			if (doStruct) {
-				updatePlus((Item) widget, element);
-			}
-			if (updateLabels || !equals(element, widget.getData())) {
-				doUpdateItem(widget, element, true);
-			} else {
-				associate(element, (Item) widget);
-			}
-		}
-
-		if (doStruct) {
-			internalRefreshStruct(widget, element, updateLabels);
-		} else {
-			Item[] children = getChildren(widget);
-			if (children != null) {
-				for (int i = 0; i < children.length; i++) {
-					Widget item = children[i];
-					Object data = item.getData();
-					if (data != null) {
-						internalRefresh(item, data, doStruct, updateLabels);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Update the structure and recurse. Items are updated in updateChildren, as
-	 * needed.
-	 *
-	 * @param widget
-	 * @param element
-	 * @param updateLabels
-	 */
-	/* package */void internalRefreshStruct(Widget widget, Object element,
-			boolean updateLabels) {
-		updateChildren(widget, element, null, updateLabels);
-		Item[] children = getChildren(widget);
-		if (children != null) {
-			for (int i = 0; i < children.length; i++) {
-				Widget item = children[i];
-				Object data = item.getData();
-				if (data != null) {
-					internalRefreshStruct(item, data, updateLabels);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Removes the given elements from this viewer.
-	 * <p>
-	 * EXPERIMENTAL. Not to be used except by JDT. This method was added to
-	 * support JDT's explorations into grouping by working sets, which requires
-	 * viewers to support multiple equal elements. See bug 76482 for more
-	 * details. This support will likely be removed in Eclipse 3.2 in favor of
-	 * proper support for multiple equal elements.
-	 * </p>
-	 *
-	 * @param elementsOrPaths
-	 *            the elements or element paths to remove
-	 * @since 3.1
-	 */
-	protected void internalRemove(Object[] elementsOrPaths) {
-		Object input = getInput();
-		for (int i = 0; i < elementsOrPaths.length; ++i) {
-			Object element = elementsOrPaths[i];
-			if (equals(element, input)) {
-				setInput(null);
-				return;
-			}
-			Widget[] childItems = internalFindItems(element);
-			if (childItems.length > 0) {
-				for (int j = 0; j < childItems.length; j++) {
-					Widget childItem = childItems[j];
-					if (childItem instanceof Item) {
-						disassociate((Item) childItem);
-						childItem.dispose();
-					}
-				}
-			} else {
-				// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=210747
-				Object parent = getParentElement(element);
-				if (parent != null
-						&& !equals(parent, getRoot())
-						&& !(parent instanceof TreePath && ((TreePath) parent)
-								.getSegmentCount() == 0)) {
-					Widget[] parentItems = internalFindItems(parent);
-					for (int j = 0; j < parentItems.length; j++) {
-						Widget parentItem = parentItems[j];
-						if (parentItem instanceof Item) {
-							updatePlus((Item) parentItem, parent);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Removes the given elements from this viewer, whenever those elements
-	 * appear as children of the given parent.
-	 *
-	 * @param parent the parent element
-	 * @param elements
-	 *            the elements to remove
-	 * @since 3.1
-	 */
-	protected void internalRemove(Object parent, Object[] elements) {
-
-		CustomHashtable toRemove = new CustomHashtable(getComparer());
-		for (int i = 0; i < elements.length; i++) {
-			toRemove.put(elements[i], elements[i]);
-		}
-
-		// Find each place the parent appears in the tree
-		Widget[] parentItemArray = findItems(parent);
-		for (int i = 0; i < parentItemArray.length; i++) {
-			Widget parentItem = parentItemArray[i];
-
-			// May happen if parent element is a descendent of of a previously
-			// removed element
-			if (parentItem.isDisposed())
-				continue;
-
-			// Iterate over the child items and remove each one
-			Item[] children = getChildren(parentItem);
-
-			if (children.length == 1 && children[0].getData() == null &&
-					parentItem instanceof Item) { // dummy node
-				// Remove plus if parent element has no children
-				updatePlus((Item) parentItem, parent);
-			} else {
-				for (int j = 0; j < children.length; j++) {
-					Item child = children[j];
-
-					Object data = child.getData();
-					if (data != null && toRemove.containsKey(data)) {
-						disassociate(child);
-						child.dispose();
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Sets the expanded state of all items to correspond to the given set of
-	 * expanded elements.
-	 *
-	 * @param expandedElements
-	 *            the set (element type: <code>Object</code>) of elements
-	 *            which are expanded
-	 * @param widget
-	 *            the widget
-	 */
-	private void internalSetExpanded(CustomHashtable expandedElements,
-			Widget widget) {
-		Item[] items = getChildren(widget);
-		for (int i = 0; i < items.length; i++) {
-			Item item = items[i];
-			Object data = item.getData();
-			if (data != null) {
-				// remove the element to avoid an infinite loop
-				// if the same element appears on a child item
-				boolean expanded = expandedElements.remove(data) != null;
-				if (expanded != getExpanded(item)) {
-					if (expanded) {
-						createChildren(item);
-					}
-					setExpanded(item, expanded);
-				}
-			}
-			if (expandedElements.size() > 0) {
-				internalSetExpanded(expandedElements, item);
-			}
-		}
-	}
-
-	/**
-	 * Sets the expanded state of all items to correspond to the given set of
-	 * expanded tree paths.
-	 *
-	 * @param expandedTreePaths
-	 *            the set (element type: <code>TreePath</code>) of elements
-	 *            which are expanded
-	 * @param widget
-	 *            the widget
-	 */
-	private void internalSetExpandedTreePaths(
-			CustomHashtable expandedTreePaths, Widget widget,
-			TreePath currentPath) {
-		Item[] items = getChildren(widget);
-		for (int i = 0; i < items.length; i++) {
-			Item item = items[i];
-			Object data = item.getData();
-			TreePath childPath = data == null ? null : currentPath
-					.createChildPath(data);
-			if (data != null && childPath != null) {
-				// remove the element to avoid an infinite loop
-				// if the same element appears on a child item
-				boolean expanded = expandedTreePaths.remove(childPath) != null;
-				if (expanded != getExpanded(item)) {
-					if (expanded) {
-						createChildren(item);
-					}
-					setExpanded(item, expanded);
-				}
-			}
-			internalSetExpandedTreePaths(expandedTreePaths, item, childPath);
-		}
-	}
-
-	/**
-	 * Return whether the tree node representing the given element or path can
-	 * be expanded. Clients should query expandability by path if the viewer's
-	 * content provider is an {@link ITreePathContentProvider}.
-	 * <p>
-	 * The default implementation of this framework method calls
-	 * <code>hasChildren</code> on this viewer's content provider. It may be
-	 * overridden if necessary.
-	 * </p>
-	 *
-	 * @param elementOrTreePath
-	 *            the element or path
-	 * @return <code>true</code> if the tree node representing the given
-	 *         element can be expanded, or <code>false</code> if not
-	 */
-	public boolean isExpandable(Object elementOrTreePath) {
-		Object element;
-		TreePath path;
-		if (elementOrTreePath instanceof TreePath) {
-			path = (TreePath) elementOrTreePath;
-			element = path.getLastSegment();
-		} else {
-			element = elementOrTreePath;
-			path = null;
-		}
-		IContentProvider cp = getContentProvider();
-		if (cp instanceof ITreePathContentProvider) {
-			ITreePathContentProvider tpcp = (ITreePathContentProvider) cp;
-			if (path == null) {
-				// A path was not provided so try and find one
-				Widget w = findItem(element);
-				if (w instanceof Item) {
-					Item item = (Item) w;
-					path = getTreePathFromItem(item);
-				}
-				if (path == null) {
-					path = new TreePath(new Object[] { element });
-				}
-			}
-			return tpcp.hasChildren(path);
-		}
-		if (cp instanceof ITreeContentProvider) {
-			ITreeContentProvider tcp = (ITreeContentProvider) cp;
-			return tcp.hasChildren(element);
-		}
-		return false;
-	}
-
-	/**
-	 * Return whether the given element is expandable.
-	 *
-	 * @param item
-	 *            the tree item for the element
-	 * @param parentPath
-	 *            the parent path if it is known or <code>null</code> if it
-	 *            needs to be determines
-	 * @param element
-	 *            the element
-	 * @return whether the given element is expandable
-	 */
-	private boolean isExpandable(Item item, TreePath parentPath, Object element) {
-		Object elementOrTreePath = element;
-		if (isTreePathContentProvider()) {
-			if (parentPath != null) {
-				elementOrTreePath = parentPath.createChildPath(element);
-			} else {
-				elementOrTreePath = getTreePathFromItem(item);
-			}
-		}
-		return isExpandable(elementOrTreePath);
-	}
-
-	/* (non-Javadoc) Method declared on Viewer. */
-	protected void labelProviderChanged() {
-		// we have to walk the (visible) tree and update every item
-		Control tree = getControl();
-		tree.setRedraw(false);
-		// don't pick up structure changes, but do force label updates
-		internalRefresh(tree, getRoot(), false, true);
-		tree.setRedraw(true);
-	}
-
-	/**
-	 * Creates a new item.
-	 *
-	 * @param parent
-	 *            the parent widget
-	 * @param style
-	 *            SWT style bits
-	 * @param index
-	 *            if non-negative, indicates the position to insert the item
-	 *            into its parent
-	 * @return the newly-created item
-	 */
-	protected abstract Item newItem(Widget parent, int style, int index);
-
-	/**
-	 * Removes the given elements from this viewer. The selection is updated if
-	 * required.
-	 * <p>
-	 * This method should be called (by the content provider) when elements have
-	 * been removed from the model, in order to cause the viewer to accurately
-	 * reflect the model. This method only affects the viewer, not the model.
-	 * </p>
-	 *
-	 * @param elementsOrTreePaths
-	 *            the elements to remove
-	 */
-	public void remove(final Object[] elementsOrTreePaths) {
-		assertElementsNotNull(elementsOrTreePaths);
-		if (elementsOrTreePaths.length == 0) {
-			return;
-		}
-		if (checkBusy())
-			return;
-		preservingSelection(new Runnable() {
-			public void run() {
-				internalRemove(elementsOrTreePaths);
-			}
-		});
-	}
-
-	/**
-	 * Removes the given elements from this viewer whenever they appear as
-	 * children of the given parent element. If the given elements also appear
-	 * as children of some other parent, the other parent will remain unchanged.
-	 * The selection is updated if required.
-	 * <p>
-	 * This method should be called (by the content provider) when elements have
-	 * been removed from the model, in order to cause the viewer to accurately
-	 * reflect the model. This method only affects the viewer, not the model.
-	 * </p>
-	 *
-	 * @param parent
-	 *            the parent of the elements to remove
-	 * @param elements
-	 *            the elements to remove
-	 *
-	 * @since 3.2
-	 */
-	public void remove(final Object parent, final Object[] elements) {
-		assertElementsNotNull(elements);
-		if (elements.length == 0) {
-			return;
-		}
-		if (checkBusy())
-			return;
-		preservingSelection(new Runnable() {
-			public void run() {
-				internalRemove(parent, elements);
-			}
-		});
-	}
-
-	/**
-	 * Removes the given element from the viewer. The selection is updated if
-	 * necessary.
-	 * <p>
-	 * This method should be called (by the content provider) when a single
-	 * element has been removed from the model, in order to cause the viewer to
-	 * accurately reflect the model. This method only affects the viewer, not
-	 * the model. Note that there is another method for efficiently processing
-	 * the simultaneous removal of multiple elements.
-	 * </p>
-	 *
-	 * @param elementsOrTreePaths
-	 *            the element
-	 */
-	public void remove(Object elementsOrTreePaths) {
-		remove(new Object[] { elementsOrTreePaths });
-	}
-
-	/**
-	 * Removes all items from the given control.
-	 *
-	 * @param control
-	 *            the control
-	 */
-	protected abstract void removeAll(Control control);
-
-	/**
-	 * Removes a listener for expand and collapse events in this viewer. Has no
-	 * affect if an identical listener is not registered.
-	 *
-	 * @param listener
-	 *            a tree viewer listener
-	 */
-	public void removeTreeListener(ITreeViewerListener listener) {
-		treeListeners.remove(listener);
-	}
-
-	/**
-	 * This implementation of reveal() reveals the given element or tree path.
-	 */
-	public void reveal(Object elementOrTreePath) {
-		Assert.isNotNull(elementOrTreePath);
-		Widget w = internalExpand(elementOrTreePath, true);
-		if (w instanceof Item) {
-			showItem((Item) w);
-		}
-	}
-
-	/**
-	 * Returns the rightmost visible descendent of the given item. Returns the
-	 * item itself if it has no children.
-	 *
-	 * @param item
-	 *            the item to compute the descendent of
-	 * @return the rightmost visible descendent or the item itself if it has no
-	 *         children
-	 */
-	private Item rightMostVisibleDescendent(Item item) {
-		Item[] children = getItems(item);
-		if (getExpanded(item) && children != null && children.length > 0) {
-			return rightMostVisibleDescendent(children[children.length - 1]);
-		}
-		return item;
-	}
-
-	/* (non-Javadoc) Method declared on Viewer. */
-	public Item scrollDown(int x, int y) {
-		Item current = getItem(x, y);
-		if (current != null) {
-			Item next = getNextItem(current, true);
-			showItem(next == null ? current : next);
-			return next;
-		}
-		return null;
-	}
-
-	/* (non-Javadoc) Method declared on Viewer. */
-	public Item scrollUp(int x, int y) {
-		Item current = getItem(x, y);
-		if (current != null) {
-			Item previous = getPreviousItem(current);
-			showItem(previous == null ? current : previous);
-			return previous;
-		}
-		return null;
-	}
-
-	/**
-	 * Sets the auto-expand level to be used when the input of the viewer is set
-	 * using {@link #setInput(Object)}. The value 0 means that there is no
-	 * auto-expand; 1 means that the invisible root element is expanded (since
-	 * most concrete subclasses do not show the root element, there is usually
-	 * no practical difference between using the values 0 and 1); 2 means that
-	 * top-level elements are expanded, but not their children; 3 means that
-	 * top-level elements are expanded, and their children, but not
-	 * grandchildren; and so on.
-	 * <p>
-	 * The value <code>ALL_LEVELS</code> means that all subtrees should be
-	 * expanded.
-	 * </p>
-	 * <p>
-	 * Note that in previous releases, the Javadoc for this method had an off-by
-	 * one error. See bug 177669 for details.
-	 * </p>
-	 * 
-	 * @param level
-	 *            non-negative level, or <code>ALL_LEVELS</code> to expand all
-	 *            levels of the tree
-	 */
-	public void setAutoExpandLevel(int level) {
-		expandToLevel = level;
-	}
-
-	/**
-	 * The <code>AbstractTreeViewer</code> implementation of this method
-	 * checks to ensure that the content provider is an
-	 * <code>ITreeContentProvider</code>.
-	 */
-	public void setContentProvider(IContentProvider provider) {
-		// the actual check is in assertContentProviderType
-		super.setContentProvider(provider);
-	}
-
-	protected void assertContentProviderType(IContentProvider provider) {
-		Assert.isTrue(provider instanceof ITreeContentProvider
-				|| provider instanceof ITreePathContentProvider);
-	}
-
-	/**
-	 * Sets the expand state of the given item.
-	 *
-	 * @param item
-	 *            the item
-	 * @param expand
-	 *            the expand state of the item
-	 */
-	protected abstract void setExpanded(Item item, boolean expand);
-
-	/**
-	 * Sets which nodes are expanded in this viewer's tree. The given list
-	 * contains the elements that are to be expanded; all other nodes are to be
-	 * collapsed.
-	 * <p>
-	 * This method is typically used when restoring the interesting state of a
-	 * viewer captured by an earlier call to <code>getExpandedElements</code>.
-	 * </p>
-	 *
-	 * @param elements
-	 *            the array of expanded elements
-	 * @see #getExpandedElements
-	 */
-	public void setExpandedElements(Object[] elements) {
-		assertElementsNotNull(elements);
-		if (checkBusy()) {
-			return;
-		}
-		CustomHashtable expandedElements = newHashtable(elements.length * 2 + 1);
-		for (int i = 0; i < elements.length; ++i) {
-			Object element = elements[i];
-			// Ensure item exists for element. This will materialize items for
-			// each element and their parents, if possible. This is important
-			// to support expanding of inner tree nodes without necessarily
-			// expanding their parents.
-			internalExpand(element, false);
-			expandedElements.put(element, element);
-		}
-		// this will traverse all existing items, and create children for
-		// elements that need to be expanded. If the tree contains multiple
-		// equal elements, and those are in the set of elements to be expanded,
-		// only the first item found for each element will be expanded.
-		internalSetExpanded(expandedElements, getControl());
-	}
-
-	/**
-	 * Sets which nodes are expanded in this viewer's tree. The given list
-	 * contains the tree paths that are to be expanded; all other nodes are to
-	 * be collapsed.
-	 * <p>
-	 * This method is typically used when restoring the interesting state of a
-	 * viewer captured by an earlier call to <code>getExpandedTreePaths</code>.
-	 * </p>
-	 *
-	 * @param treePaths
-	 *            the array of expanded tree paths
-	 * @see #getExpandedTreePaths()
-	 *
-	 * @since 3.2
-	 */
-	public void setExpandedTreePaths(TreePath[] treePaths) {
-		assertElementsNotNull(treePaths);
-		if (checkBusy())
-			return;
-		final IElementComparer comparer = getComparer();
-		IElementComparer treePathComparer = new IElementComparer() {
-
-			public boolean equals(Object a, Object b) {
-				return ((TreePath) a).equals(((TreePath) b), comparer);
-			}
-
-			public int hashCode(Object element) {
-				return ((TreePath) element).hashCode(comparer);
-			}
-		};
-		CustomHashtable expandedTreePaths = new CustomHashtable(
-				treePaths.length * 2 + 1, treePathComparer);
-		for (int i = 0; i < treePaths.length; ++i) {
-			TreePath treePath = treePaths[i];
-			// Ensure item exists for element. This will materialize items for
-			// each element and their parents, if possible. This is important
-			// to support expanding of inner tree nodes without necessarily
-			// expanding their parents.
-			internalExpand(treePath, false);
-			expandedTreePaths.put(treePath, treePath);
-		}
-		// this will traverse all existing items, and create children for
-		// elements that need to be expanded. If the tree contains multiple
-		// equal elements, and those are in the set of elements to be expanded,
-		// only the first item found for each element will be expanded.
-		internalSetExpandedTreePaths(expandedTreePaths, getControl(),
-				new TreePath(new Object[0]));
-	}
-
-	/**
-	 * Sets whether the node corresponding to the given element or tree path is
-	 * expanded or collapsed.
-	 *
-	 * @param elementOrTreePath
-	 *            the element
-	 * @param expanded
-	 *            <code>true</code> if the node is expanded, and
-	 *            <code>false</code> if collapsed
-	 */
-	public void setExpandedState(Object elementOrTreePath, boolean expanded) {
-		Assert.isNotNull(elementOrTreePath);
-		if (checkBusy())
-			return;
-		Widget item = internalExpand(elementOrTreePath, false);
-		if (item instanceof Item) {
-			if (expanded) {
-				createChildren(item);
-			}
-			setExpanded((Item) item, expanded);
-		}
-	}
-
-	/**
-	 * Sets the selection to the given list of items.
-	 *
-	 * @param items
-	 *            list of items (element type:
-	 *            <code>org.eclipse.swt.widgets.Item</code>)
-	 */
-	protected abstract void setSelection(List items);
-
-	/**
-	 * This implementation of setSelectionToWidget accepts a list of elements or
-	 * a list of tree paths.
-	 */
-	protected void setSelectionToWidget(List v, boolean reveal) {
-		if (v == null) {
-			setSelection(new ArrayList(0));
-			return;
-		}
-		int size = v.size();
-		List newSelection = new ArrayList(size);
-		for (int i = 0; i < size; ++i) {
-			Object elementOrTreePath = v.get(i);
-			// Use internalExpand since item may not yet be created. See
-			// 1G6B1AR.
-			Widget w = internalExpand(elementOrTreePath, false);
-			if (w instanceof Item) {
-				newSelection.add(w);
-			} else if (w == null && elementOrTreePath instanceof TreePath) {
-				TreePath treePath = (TreePath) elementOrTreePath;
-				Object element = treePath.getLastSegment();
-				if (element != null) {
-					w = internalExpand(element, false);
-					if (w instanceof Item) {
-						newSelection.add(w);
-					}
-				}
-			}
-		}
-		setSelection(newSelection);
-
-		// Although setting the selection in the control should reveal it,
-		// setSelection may be a no-op if the selection is unchanged,
-		// so explicitly reveal items in the selection here.
-		// See bug 100565 for more details.
-		if (reveal && newSelection.size() > 0) {
-			// Iterate backwards so the first item in the list
-			// is the one guaranteed to be visible
-			for (int i = (newSelection.size()-1); i >= 0; i--) {
-				showItem((Item) newSelection.get(i));
-			}
-		}
-	}
-
-	/**
-	 * Shows the given item.
-	 *
-	 * @param item
-	 *            the item
-	 */
-	protected abstract void showItem(Item item);
-
-	/**
-	 * Updates the tree items to correspond to the child elements of the given
-	 * parent element. If null is passed for the children, this method obtains
-	 * them (only if needed).
-	 *
-	 * @param widget
-	 *            the widget
-	 * @param parent
-	 *            the parent element
-	 * @param elementChildren
-	 *            the child elements, or null
-	 * @deprecated this is no longer called by the framework
-	 */
-	protected void updateChildren(Widget widget, Object parent,
-			Object[] elementChildren) {
-		updateChildren(widget, parent, elementChildren, true);
-	}
-
-	/**
-	 * Updates the tree items to correspond to the child elements of the given
-	 * parent element. If null is passed for the children, this method obtains
-	 * them (only if needed).
-	 *
-	 * @param widget
-	 *            the widget
-	 * @param parent
-	 *            the parent element
-	 * @param elementChildren
-	 *            the child elements, or null
-	 * @param updateLabels
-	 *            <code>true</code> to update labels for existing elements,
-	 *            <code>false</code> to only update labels as needed, assuming
-	 *            that labels for existing elements are unchanged.
-	 * @since 2.1
-	 */
-	private void updateChildren(Widget widget, Object parent,
-			Object[] elementChildren, boolean updateLabels) {
-		// optimization! prune collapsed subtrees
-		if (widget instanceof Item) {
-			Item ti = (Item) widget;
-			if (!getExpanded(ti)) {
-				// need a dummy node if element is expandable;
-				// but try to avoid recreating the dummy node
-				boolean needDummy = isExpandable(ti, null, parent);
-				boolean haveDummy = false;
-				// remove all children
-				Item[] items = getItems(ti);
-				for (int i = 0; i < items.length; i++) {
-					if (items[i].getData() != null) {
-						disassociate(items[i]);
-						items[i].dispose();
-					} else {
-						if (needDummy && !haveDummy) {
-							haveDummy = true;
-						} else {
-							items[i].dispose();
-						}
-					}
-				}
-				if (needDummy && !haveDummy) {
-					newItem(ti, SWT.NULL, -1);
-				}
-
-				return;
-			}
-		}
-
-		// If the children weren't passed in, get them now since they're needed
-		// below.
-		if (elementChildren == null) {
-			if (isTreePathContentProvider() && widget instanceof Item) {
-				TreePath path = getTreePathFromItem((Item) widget);
-				elementChildren = getSortedChildren(path);
-			} else {
-				elementChildren = getSortedChildren(parent);
-			}
-		}
-
-		Control tree = getControl();
-
-		// WORKAROUND
-		int oldCnt = -1;
-		if (widget == tree) {
-			oldCnt = getItemCount(tree);
-		}
-
-		Item[] items = getChildren(widget);
-		
-		// save the expanded elements
-		CustomHashtable expanded = newHashtable(CustomHashtable.DEFAULT_CAPACITY); // assume
-																					// num
-																					// expanded
-																					// is
-																					// small
-		for (int i = 0; i < items.length; ++i) {
-			if (getExpanded(items[i])) {
-				Object element = items[i].getData();
-				if (element != null) {
-					expanded.put(element, element);
-				}
-			}
-		}
-
-		int min = Math.min(elementChildren.length, items.length);
-
-		// dispose of surplus items, optimizing for the case where elements have
-		// been deleted but not reordered, or all elements have been removed.
-		int numItemsToDispose = items.length - min;
-		if (numItemsToDispose > 0) {
-			CustomHashtable children = newHashtable(elementChildren.length * 2);
-			for (int i = 0; i < elementChildren.length; i++) {
-				Object elementChild = elementChildren[i];
-				children.put(elementChild, elementChild);
-			}
-			int i = 0;
-			while (numItemsToDispose > 0 && i < items.length) {
-				Object data = items[i].getData();
-				if (data == null || items.length - i <= numItemsToDispose || !children.containsKey(data)) {
-					if (data != null) {
-						disassociate(items[i]);
-					}
-					items[i].dispose();
-					if (i + 1 < items.length) {
-						// The components at positions i+1 through
-						// items.length-1 in the source array are copied into
-						// positions i through items.length-2
-						System.arraycopy(items, i + 1, items, i, items.length - (i+1));
-					}
-					numItemsToDispose--;
-				} else {
-					i++;
-				}
-			}
-		}
-
-		// compare first min items, and update item if necessary
-		// need to do it in two passes:
-		// 1: disassociate old items
-		// 2: associate new items
-		// because otherwise a later disassociate can remove a mapping made for
-		// a previous associate,
-		// making the map inconsistent
-		for (int i = 0; i < min; ++i) {
-			Item item = items[i];
-			Object oldElement = item.getData();
-			if (oldElement != null) {
-				Object newElement = elementChildren[i];
-				if (newElement != oldElement) {
-					if (equals(newElement, oldElement)) {
-						// update the data to be the new element, since
-						// although the elements
-						// may be equal, they may still have different labels
-						// or children
-						Object data = item.getData();
-						if (data != null) {
-							unmapElement(data, item);
-						}
-						item.setData(newElement);
-						mapElement(newElement, item);
-					} else {
-						disassociate(item);
-						// Clear the text and image to force a label update
-						item.setImage(null);
-						item.setText("");//$NON-NLS-1$
-
-					}
-				}
-			}
-		}
-
-		for (int i = 0; i < min; ++i) {
-			Item item = items[i];
-			Object newElement = elementChildren[i];
-			if (item.getData() == null) {
-				// old and new elements are not equal
-				associate(newElement, item);
-				updatePlus(item, newElement);
-				updateItem(item, newElement);
-			} else {
-				// old and new elements are equal
-				updatePlus(item, newElement);
-				if (updateLabels) {
-					updateItem(item, newElement);
-				}
-			}
-		}
-
-		// Restore expanded state for items that changed position.
-		// Make sure setExpanded is called after updatePlus, since
-		// setExpanded(false) fails if item has no children.
-		// Need to call setExpanded for both expanded and unexpanded
-		// cases since the expanded state can change either way.
-		// This needs to be done in a second loop, see bug 148025.
-		for (int i = 0; i < min; ++i) {
-			Item item = items[i];
-			Object newElement = elementChildren[i];
-			setExpanded(item, expanded.containsKey(newElement));
-		}
-
-		// add any remaining elements
-		if (min < elementChildren.length) {
-			for (int i = min; i < elementChildren.length; ++i) {
-				createTreeItem(widget, elementChildren[i], i);
-			}
-
-			// Need to restore expanded state in a separate pass
-			// because createTreeItem does not return the new item.
-			// Avoid doing this unless needed.
-			if (expanded.size() > 0) {
-				// get the items again, to include the new items
-				items = getChildren(widget);
-				for (int i = min; i < elementChildren.length; ++i) {
-					// Restore expanded state for items that changed position.
-					// Make sure setExpanded is called after updatePlus (called
-					// in createTreeItem), since
-					// setExpanded(false) fails if item has no children.
-					// Only need to call setExpanded if element was expanded
-					// since new items are initially unexpanded.
-					if (expanded.containsKey(elementChildren[i])) {
-						setExpanded(items[i], true);
-					}
-				}
-			}
-		}
-
-		// WORKAROUND
-		if (widget == tree && oldCnt == 0 && getItemCount(tree) != 0) {
-			// System.out.println("WORKAROUND setRedraw");
-			tree.setRedraw(false);
-			tree.setRedraw(true);
-		}
-	}
-
-	/**
-	 * Not to be called by clients. Return the items to be refreshed as part of
-	 * an update. elementChildren are the new elements.
-	 * 
-	 * @param widget
-	 * @param elementChildren
-	 * @since 3.4
-	 * @return Item[]
-	 * 
-	 * @deprecated This method was inadvertently released as API but is not
-	 *             intended to be called by clients.
-	 */
-	public Item[] getChildren(Widget widget,  Object[] elementChildren) {
-		return getChildren(widget);
-	}
-
-	/**
-	 * Updates the "+"/"-" icon of the tree node from the given element. It
-	 * calls <code>isExpandable</code> to determine whether an element is
-	 * expandable.
-	 *
-	 * @param item
-	 *            the item
-	 * @param element
-	 *            the element
-	 */
-	protected void updatePlus(Item item, Object element) {
-		boolean hasPlus = getItemCount(item) > 0;
-		boolean needsPlus = isExpandable(item, null, element);
-		boolean removeAll = false;
-		boolean addDummy = false;
-		Object data = item.getData();
-		if (data != null && equals(element, data)) {
-			// item shows same element
-			if (hasPlus != needsPlus) {
-				if (needsPlus) {
-					addDummy = true;
-				} else {
-					removeAll = true;
-				}
-			}
-		} else {
-			// item shows different element
-			removeAll = true;
-			addDummy = needsPlus;
-
-			// we cannot maintain expand state so collapse it
-			setExpanded(item, false);
-		}
-		if (removeAll) {
-			// remove all children
-			Item[] items = getItems(item);
-			for (int i = 0; i < items.length; i++) {
-				if (items[i].getData() != null) {
-					disassociate(items[i]);
-				}
-				items[i].dispose();
-			}
-		}
-		if (addDummy) {
-			newItem(item, SWT.NULL, -1); // append a dummy
-		}
-	}
-
-	/**
-	 * Gets the expanded elements that are visible to the user. An expanded
-	 * element is only visible if the parent is expanded.
-	 *
-	 * @return the visible expanded elements
-	 * @since 2.0
-	 */
-	public Object[] getVisibleExpandedElements() {
-		ArrayList v = new ArrayList();
-		internalCollectVisibleExpanded(v, getControl());
-		return v.toArray();
-	}
-
-	private void internalCollectVisibleExpanded(ArrayList result, Widget widget) {
-		Item[] items = getChildren(widget);
-		for (int i = 0; i < items.length; i++) {
-			Item item = items[i];
-			if (getExpanded(item)) {
-				Object data = item.getData();
-				if (data != null) {
-					result.add(data);
-				}
-				// Only recurse if it is expanded - if
-				// not then the children aren't visible
-				internalCollectVisibleExpanded(result, item);
-			}
-		}
-	}
-
-	/**
-	 * Returns the tree path for the given item.
-	 * @param item
-	 * @return {@link TreePath}
-	 *
-	 * @since 3.2
-	 */
-	protected TreePath getTreePathFromItem(Item item) {
-		LinkedList segments = new LinkedList();
-		while (item != null) {
-			Object segment = item.getData();
-			Assert.isNotNull(segment);
-			segments.addFirst(segment);
-			item = getParentItem(item);
-		}
-		return new TreePath(segments.toArray());
-	}
-
-	/**
-	 * This implementation of getSelection() returns an instance of
-	 * ITreeSelection.
-	 *
-	 * @since 3.2
-	 */
-	public ISelection getSelection() {
-		Control control = getControl();
-		if (control == null || control.isDisposed()) {
-			return TreeSelection.EMPTY;
-		}
-		Widget[] items = getSelection(getControl());
-		ArrayList list = new ArrayList(items.length);
-		for (int i = 0; i < items.length; i++) {
-			Widget item = items[i];
-			if (item.getData() != null) {
-				list.add(getTreePathFromItem((Item) item));
-			}
-		}
-		return new TreeSelection((TreePath[]) list.toArray(new TreePath[list
-				.size()]), getComparer());
-	}
-
-	protected void setSelectionToWidget(ISelection selection, boolean reveal) {
-		if (selection instanceof ITreeSelection) {
-			ITreeSelection treeSelection = (ITreeSelection) selection;
-			setSelectionToWidget(Arrays.asList(treeSelection.getPaths()),
-					reveal);
-		} else {
-			super.setSelectionToWidget(selection, reveal);
-		}
-	}
-
-	/**
-	 * Returns a list of tree paths corresponding to expanded nodes in this
-	 * viewer's tree, including currently hidden ones that are marked as
-	 * expanded but are under a collapsed ancestor.
-	 * <p>
-	 * This method is typically used when preserving the interesting state of a
-	 * viewer; <code>setExpandedElements</code> is used during the restore.
-	 * </p>
-	 *
-	 * @return the array of expanded tree paths
-	 * @see #setExpandedElements
-	 *
-	 * @since 3.2
-	 */
-	public TreePath[] getExpandedTreePaths() {
-		ArrayList items = new ArrayList();
-		internalCollectExpandedItems(items, getControl());
-		ArrayList result = new ArrayList(items.size());
-		for (Iterator it = items.iterator(); it.hasNext();) {
-			Item item = (Item) it.next();
-			TreePath treePath = getTreePathFromItem(item);
-			if (treePath != null) {
-				result.add(treePath);
-			}
-		}
-		return (TreePath[]) result.toArray(new TreePath[items.size()]);
-	}
-
-	private boolean isTreePathContentProvider() {
-		return getContentProvider() instanceof ITreePathContentProvider;
-	}
-
-	/**
-	 * Inserts the given element as a new child element of the given parent
-	 * element at the given position. If this viewer has a sorter, the position
-	 * is ignored and the element is inserted at the correct position in the
-	 * sort order.
-	 * <p>
-	 * This method should be called (by the content provider) when elements have
-	 * been added to the model, in order to cause the viewer to accurately
-	 * reflect the model. This method only affects the viewer, not the model.
-	 * </p>
-	 *
-	 * @param parentElementOrTreePath
-	 *            the parent element, or the tree path to the parent
-	 * @param element
-	 *            the element
-	 * @param position
-	 *            a 0-based position relative to the model, or -1 to indicate
-	 *            the last position
-	 *
-	 * @since 3.2
-	 */
-	public void insert(Object parentElementOrTreePath, Object element,
-			int position) {
-		Assert.isNotNull(parentElementOrTreePath);
-		Assert.isNotNull(element);
-		if (checkBusy())
-			return;
-		if (getComparator() != null || hasFilters()) {
-			add(parentElementOrTreePath, new Object[] { element });
-			return;
-		}
-		Widget[] items;
-		if (internalIsInputOrEmptyPath(parentElementOrTreePath)) {
-			items = new Widget[] { getControl() };
-		} else {
-			items = internalFindItems(parentElementOrTreePath);
-		}
-
-		for (int i = 0; i < items.length; i++) {
-			Widget widget = items[i];
-			if (widget instanceof Item) {
-				Item item = (Item) widget;
-
-				Item[] childItems = getChildren(item);
-				if (getExpanded(item)
-						|| (childItems.length > 0 && childItems[0].getData() != null)) {
-					// item has real children, go ahead and add
-					int insertionPosition = position;
-					if (insertionPosition == -1) {
-						insertionPosition = getItemCount(item);
-					}
-
-					createTreeItem(item, element, insertionPosition);
-				} else {
-					Object parentElement = parentElementOrTreePath;
-					if (element instanceof TreePath)
-						parentElement = ((TreePath) parentElement).getLastSegment();
-					updatePlus(item, parentElement);
-				}
-			} else {
-				int insertionPosition = position;
-				if (insertionPosition == -1) {
-					insertionPosition = getItemCount((Control) widget);
-				}
-
-				createTreeItem(widget, element, insertionPosition);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ColumnViewer#getColumnViewerOwner(int)
-	 */
-	protected Widget getColumnViewerOwner(int columnIndex) {
-		// Return null by default
-		return null;
-	}
-
-	/**
-	 * This implementation of {@link #getItemAt(Point)} returns null to ensure
-	 * API backwards compatibility. Subclasses should override.
-	 *
-	 * @since 3.3
-	 */
-	protected Item getItemAt(Point point) {
-		return null;
-	}
-
-	/**
-	 * This implementation of {@link #createViewerEditor()} returns null to ensure
-	 * API backwards compatibility. Subclasses should override.
-	 *
-	 * @since 3.3
-	 */
-	protected ColumnViewerEditor createViewerEditor() {
-		return null;
-	}
-
-	/**
-	 * Returns the number of columns of this viewer.
-	 * <p><b>Subclasses should overwrite this method, which has a default
-	 * implementation (returning 0) for API backwards compatility reasons</b></p>
-	 *
-	 * @return the number of columns
-	 *
-	 * @since 3.3
-	 */
-	protected int doGetColumnCount() {
-		return 0;
-	}
-
-
-	/**
-	 * This implementation of buildLabel handles tree paths as well as elements.
-	 *
-	 * @param updateLabel
-	 *            the ViewerLabel to collect the result in
-	 * @param elementOrPath
-	 *            the element or tree path for which a label should be built
-	 *
-	 * @see org.eclipse.jface.viewers.StructuredViewer#buildLabel(org.eclipse.jface.viewers.ViewerLabel,
-	 *      java.lang.Object)
-	 */
-	protected void buildLabel(ViewerLabel updateLabel, Object elementOrPath) {
-		Object element;
-		if (elementOrPath instanceof TreePath) {
-			TreePath path = (TreePath) elementOrPath;
-			IBaseLabelProvider provider = getLabelProvider();
-			if (provider instanceof ITreePathLabelProvider) {
-				ITreePathLabelProvider pprov = (ITreePathLabelProvider) provider;
-				buildLabel(updateLabel, path, pprov);
-				return;
-			}
-			element = path.getLastSegment();
-		} else {
-			element = elementOrPath;
-		}
-		super.buildLabel(updateLabel, element);
-	}
-
-	/**
-	 * Returns true if the given object is either the input or an empty tree path.
-	 *
-	 * @param elementOrTreePath an element which could either be the viewer's input, or a tree path
-	 *
-	 * @return <code>true</code> if the given object is either the input or an empty tree path,
-	 * <code>false</code> otherwise.
-	 * @since 3.3
-	 */
-	final protected boolean internalIsInputOrEmptyPath(final Object elementOrTreePath) {
-		if (elementOrTreePath.equals(getRoot()))
-			return true;
-		if (!(elementOrTreePath instanceof TreePath))
-			return false;
-		return ((TreePath) elementOrTreePath).getSegmentCount() == 0;
-	}
-
-	/*
-	 * Subclasses should implement
-	 */
-	protected ViewerRow getViewerRowFromItem(Widget item) {
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AcceptAllFilter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AcceptAllFilter.java
deleted file mode 100644
index 0d9bd85..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AcceptAllFilter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-
-/**
- * Filter that accepts everything. Available as a singleton since having
- * more than one instance would be wasteful.
- * 
- * @since 3.1
- */
-public final class AcceptAllFilter implements IFilter {
-
-	/**
-	 * Returns the singleton instance of AcceptAllFilter
-	 * 
-	 * @return the singleton instance of AcceptAllFilter
-	 */
-	public static IFilter getInstance() {
-		return singleton;
-	}
-	
-	/**
-	 * The singleton instance
-	 */
-	private static IFilter singleton = new AcceptAllFilter();
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.deferred.IFilter#select(java.lang.Object)
-	 */
-	public boolean select(Object toTest) {
-		return true;
-	}
-	
-    /* (non-Javadoc)
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-	public boolean equals(Object other) {
-		return other == this || other instanceof AcceptAllFilter;
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ArrayContentProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ArrayContentProvider.java
deleted file mode 100644
index 83d762a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ArrayContentProvider.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.Collection;
-
-/**
- * This implementation of <code>IStructuredContentProvider</code> handles
- * the case where the viewer input is an unchanging array or collection of elements.
- * <p>
- * This class is not intended to be subclassed outside the viewer framework.
- * </p> 
- * 
- * @since 2.1
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ArrayContentProvider implements IStructuredContentProvider {
-
-	private static ArrayContentProvider instance;
-
-	/**
-	 * Returns an instance of ArrayContentProvider. Since instances of this
-	 * class do not maintain any state, they can be shared between multiple
-	 * clients.
-	 * 
-	 * @return an instance of ArrayContentProvider
-	 * 
-	 * @since 3.5
-	 */
-	public static ArrayContentProvider getInstance() {
-		synchronized(ArrayContentProvider.class) {
-			if (instance == null) {
-				instance = new ArrayContentProvider();
-			}
-			return instance;
-		}
-	}
-    /**
-     * Returns the elements in the input, which must be either an array or a
-     * <code>Collection</code>. 
-     */
-    public Object[] getElements(Object inputElement) {
-        if (inputElement instanceof Object[]) {
-			return (Object[]) inputElement;
-		}
-        if (inputElement instanceof Collection) {
-			return ((Collection) inputElement).toArray();
-		}
-        return new Object[0];
-    }
-
-    /**
-     * This implementation does nothing.
-     */
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-        // do nothing.
-    }
-
-    /**
-     * This implementation does nothing.
-     */
-    public void dispose() {
-        // do nothing.
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/BaseLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/BaseLabelProvider.java
deleted file mode 100644
index d610aa4..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/BaseLabelProvider.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.commands.common.EventManager;
-import org.eclipse.jface.util.SafeRunnable;
-
-/**
- * BaseLabelProvider is a default concrete implementation of
- * {@link IBaseLabelProvider} 
- * 
- * @since 3.3
- * 
- */
-public class BaseLabelProvider extends EventManager implements IBaseLabelProvider {
-	
-	/* (non-Javadoc)
-     * Method declared on IBaseLabelProvider.
-     */
-    public void addListener(ILabelProviderListener listener) {
-        addListenerObject(listener);
-    }
-
-    /**
-     * The <code>BaseLabelProvider</code> implementation of this 
-     * <code>IBaseLabelProvider</code> method clears its internal listener list.
-     * Subclasses may extend but should call the super implementation.
-     */
-    public void dispose() {
-    	clearListeners();
-    }
-    
-    /**
-     * The <code>BaseLabelProvider</code> implementation of this 
-     * <code>IBaseLabelProvider</code> method returns <code>true</code>. Subclasses may 
-     * override.
-     */
-    public boolean isLabelProperty(Object element, String property) {
-        return true;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-     */
-    public void removeListener(ILabelProviderListener listener) {
-        removeListenerObject(listener);
-    }
-    
-    /**
-	 * Fires a label provider changed event to all registered listeners Only
-	 * listeners registered at the time this method is called are notified.
-	 * 
-	 * @param event
-	 *            a label provider changed event
-	 * 
-	 * @see ILabelProviderListener#labelProviderChanged
-	 */
-	protected void fireLabelProviderChanged(final LabelProviderChangedEvent event) {
-		Object[] listeners = getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final ILabelProviderListener l = (ILabelProviderListener) listeners[i];
-			SafeRunnable.run(new SafeRunnable() {
-				public void run() {
-					l.labelProviderChanged(event);
-				}
-			});
-
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CellEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CellEditor.java
deleted file mode 100644
index 39514f4..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CellEditor.java
+++ /dev/null
@@ -1,939 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - bugfix in: 187963, 218336
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Abstract base class for cell editors. Implements property change listener
- * handling, and SWT window management.
- * <p>
- * Subclasses implement particular kinds of cell editors. This package contains
- * various specialized cell editors:
- * <ul>
- * <li><code>TextCellEditor</code> - for simple text strings</li>
- * <li><code>ColorCellEditor</code> - for colors</li>
- * <li><code>ComboBoxCellEditor</code> - value selected from drop-down combo
- * box</li>
- * <li><code>CheckboxCellEditor</code> - boolean valued checkbox</li>
- * <li><code>DialogCellEditor</code> - value from arbitrary dialog</li>
- * </ul>
- * </p>
- */
-public abstract class CellEditor {
-
-	/**
-	 * List of cell editor listeners (element type:
-	 * <code>ICellEditorListener</code>).
-	 */
-	private ListenerList listeners = new ListenerList();
-
-	/**
-	 * List of cell editor property change listeners (element type:
-	 * <code>IPropertyChangeListener</code>).
-	 */
-	private ListenerList propertyChangeListeners = new ListenerList();
-
-	/**
-	 * Indicates whether this cell editor's current value is valid.
-	 */
-	private boolean valid = false;
-
-	/**
-	 * Optional cell editor validator; <code>null</code> if none.
-	 */
-	private ICellEditorValidator validator = null;
-
-	/**
-	 * The error message string to display for invalid values; <code>null</code>
-	 * if none (that is, the value is valid).
-	 */
-	private String errorMessage = null;
-
-	/**
-	 * Indicates whether this cell editor has been changed recently.
-	 */
-	private boolean dirty = false;
-
-	/**
-	 * This cell editor's control, or <code>null</code> if not created yet.
-	 */
-	private Control control = null;
-
-	/**
-	 * Default cell editor style
-	 */
-	private static final int defaultStyle = SWT.NONE;
-
-	/**
-	 * This cell editor's style
-	 */
-	private int style = defaultStyle;
-
-	/**
-	 * Struct-like layout data for cell editors, with reasonable defaults for
-	 * all fields.
-	 * 
-	 * @noextend This class is not intended to be subclassed by clients.
-	 */
-	public static class LayoutData {
-		/**
-		 * Horizontal alignment; <code>SWT.LEFT</code> by default.
-		 */
-		public int horizontalAlignment = SWT.LEFT;
-
-		/**
-		 * Indicates control grabs additional space; <code>true</code> by
-		 * default.
-		 */
-		public boolean grabHorizontal = true;
-
-		/**
-		 * Minimum width in pixels; <code>50</code> pixels by default.
-		 */
-		public int minimumWidth = 50;
-
-		/**
-		 * Minimum height in pixels; by default the height is aligned to the
-		 * row-height
-		 * @since 3.4
-		 */
-		public int minimumHeight = SWT.DEFAULT;
-
-		/**
-		 * The vertical alignment; <code>SWT.CENTER</code> by default.
-		 * @since 3.4
-		 */
-		public int verticalAlignment = SWT.CENTER;
-	}
-
-	/**
-	 * Property name for the copy action
-	 */
-	public static final String COPY = "copy"; //$NON-NLS-1$
-
-	/**
-	 * Property name for the cut action
-	 */
-	public static final String CUT = "cut"; //$NON-NLS-1$
-
-	/**
-	 * Property name for the delete action
-	 */
-	public static final String DELETE = "delete"; //$NON-NLS-1$
-
-	/**
-	 * Property name for the find action
-	 */
-	public static final String FIND = "find"; //$NON-NLS-1$
-
-	/**
-	 * Property name for the paste action
-	 */
-	public static final String PASTE = "paste"; //$NON-NLS-1$
-
-	/**
-	 * Property name for the redo action
-	 */
-	public static final String REDO = "redo"; //$NON-NLS-1$
-
-	/**
-	 * Property name for the select all action
-	 */
-	public static final String SELECT_ALL = "selectall"; //$NON-NLS-1$
-
-	/**
-	 * Property name for the undo action
-	 */
-	public static final String UNDO = "undo"; //$NON-NLS-1$
-
-	/**
-	 * Creates a new cell editor with no control The cell editor has no cell
-	 * validator.
-	 *
-	 * @since 2.1
-	 */
-	protected CellEditor() {
-	}
-
-	/**
-	 * Creates a new cell editor under the given parent control. The cell editor
-	 * has no cell validator.
-	 *
-	 * @param parent
-	 *            the parent control
-	 */
-	protected CellEditor(Composite parent) {
-		this(parent, defaultStyle);
-	}
-
-	/**
-	 * Creates a new cell editor under the given parent control. The cell editor
-	 * has no cell validator.
-	 *
-	 * @param parent
-	 *            the parent control
-	 * @param style
-	 *            the style bits
-	 * @since 2.1
-	 */
-	protected CellEditor(Composite parent, int style) {
-		this.style = style;
-		create(parent);
-	}
-
-	/**
-	 * Activates this cell editor.
-	 * <p>
-	 * The default implementation of this framework method does nothing.
-	 * Subclasses may reimplement.
-	 * </p>
-	 */
-	public void activate() {
-	}
-
-	/**
-	 * Adds a listener to this cell editor. Has no effect if an identical
-	 * listener is already registered.
-	 *
-	 * @param listener
-	 *            a cell editor listener
-	 */
-	public void addListener(ICellEditorListener listener) {
-		listeners.add(listener);
-	}
-
-	/**
-	 * Adds a property change listener to this cell editor. Has no effect if an
-	 * identical property change listener is already registered.
-	 *
-	 * @param listener
-	 *            a property change listener
-	 */
-	public void addPropertyChangeListener(IPropertyChangeListener listener) {
-		propertyChangeListeners.add(listener);
-	}
-
-	/**
-	 * Creates the control for this cell editor under the given parent control.
-	 * <p>
-	 * This framework method must be implemented by concrete subclasses.
-	 * </p>
-	 *
-	 * @param parent
-	 *            the parent control
-	 * @return the new control, or <code>null</code> if this cell editor has
-	 *         no control
-	 */
-	protected abstract Control createControl(Composite parent);
-
-	/**
-	 * Creates the control for this cell editor under the given parent control.
-	 *
-	 * @param parent
-	 *            the parent control
-	 * @since 2.1
-	 */
-	public void create(Composite parent) {
-		Assert.isTrue(control == null);
-		control = createControl(parent);
-		// See 1GD5CA6: ITPUI:ALL - TaskView.setSelection does not work
-		// Control is created with getVisible()==true by default.
-		// This causes composite.setFocus() to work incorrectly.
-		// The cell editor's control grabs focus instead, even if it is not
-		// active.
-		// Make the control invisible here by default.
-		deactivate();
-	}
-
-	/**
-	 * Hides this cell editor's control. Does nothing if this cell editor is not
-	 * visible.
-	 */
-	public void deactivate() {
-		if (control != null && !control.isDisposed()) {
-			control.setVisible(false);
-		}
-	}
-
-	/**
-	 * Disposes of this cell editor and frees any associated SWT resources.
-	 */
-	public void dispose() {
-		if (control != null && !control.isDisposed()) {
-			control.dispose();
-		}
-		control = null;
-	}
-
-	/**
-	 * Returns this cell editor's value.
-	 * <p>
-	 * This framework method must be implemented by concrete subclasses.
-	 * </p>
-	 *
-	 * @return the value of this cell editor
-	 * @see #getValue
-	 */
-	protected abstract Object doGetValue();
-
-	/**
-	 * Sets the focus to the cell editor's control.
-	 * <p>
-	 * This framework method must be implemented by concrete subclasses.
-	 * </p>
-	 *
-	 * @see #setFocus
-	 */
-	protected abstract void doSetFocus();
-
-	/**
-	 * Sets this cell editor's value.
-	 * <p>
-	 * This framework method must be implemented by concrete subclasses.
-	 * </p>
-	 *
-	 * @param value
-	 *            the value of this cell editor
-	 * @see #setValue
-	 */
-	protected abstract void doSetValue(Object value);
-
-	/**
-	 * Notifies all registered cell editor listeners of an apply event. Only
-	 * listeners registered at the time this method is called are notified.
-	 *
-	 * @see ICellEditorListener#applyEditorValue
-	 */
-	protected void fireApplyEditorValue() {
-		Object[] array = listeners.getListeners();
-		for (int i = 0; i < array.length; i++) {
-			final ICellEditorListener l = (ICellEditorListener) array[i];
-			SafeRunnable.run(new SafeRunnable() {
-				public void run() {
-					l.applyEditorValue();
-				}
-			});
-		}
-	}
-
-	/**
-	 * Notifies all registered cell editor listeners that editing has been
-	 * canceled.
-	 *
-	 * @see ICellEditorListener#cancelEditor
-	 */
-	protected void fireCancelEditor() {
-		Object[] array = listeners.getListeners();
-		for (int i = 0; i < array.length; i++) {
-			final ICellEditorListener l = (ICellEditorListener) array[i];
-			SafeRunnable.run(new SafeRunnable() {
-				public void run() {
-					l.cancelEditor();
-				}
-			});
-		}
-	}
-
-	/**
-	 * Notifies all registered cell editor listeners of a value change.
-	 *
-	 * @param oldValidState
-	 *            the valid state before the end user changed the value
-	 * @param newValidState
-	 *            the current valid state
-	 * @see ICellEditorListener#editorValueChanged
-	 */
-	protected void fireEditorValueChanged(final boolean oldValidState,
-			final boolean newValidState) {
-		Object[] array = listeners.getListeners();
-		for (int i = 0; i < array.length; i++) {
-			final ICellEditorListener l = (ICellEditorListener) array[i];
-			SafeRunnable.run(new SafeRunnable() {
-				public void run() {
-					l.editorValueChanged(oldValidState, newValidState);
-				}
-			});
-		}
-	}
-
-	/**
-	 * Notifies all registered property listeners of an enablement change.
-	 *
-	 * @param actionId
-	 *            the id indicating what action's enablement has changed.
-	 */
-	protected void fireEnablementChanged(final String actionId) {
-		Object[] array = propertyChangeListeners.getListeners();
-		for (int i = 0; i < array.length; i++) {
-			final IPropertyChangeListener l = (IPropertyChangeListener) array[i];
-			SafeRunnable.run(new SafeRunnable() {
-				public void run() {
-					l.propertyChange(new PropertyChangeEvent(this, actionId,
-							null, null));
-				}
-			});
-		}
-	}
-
-	/**
-	 * Sets the style bits for this cell editor.
-	 *
-	 * @param style
-	 *            the SWT style bits for this cell editor
-	 * @since 2.1
-	 */
-	public void setStyle(int style) {
-		this.style = style;
-	}
-
-	/**
-	 * Returns the style bits for this cell editor.
-	 *
-	 * @return the style for this cell editor
-	 * @since 2.1
-	 */
-	public int getStyle() {
-		return style;
-	}
-
-	/**
-	 * Returns the control used to implement this cell editor.
-	 *
-	 * @return the control, or <code>null</code> if this cell editor has no
-	 *         control
-	 */
-	public Control getControl() {
-		return control;
-	}
-
-	/**
-	 * Returns the current error message for this cell editor.
-	 *
-	 * @return the error message if the cell editor is in an invalid state, and
-	 *         <code>null</code> if the cell editor is valid
-	 */
-	public String getErrorMessage() {
-		return errorMessage;
-	}
-
-	/**
-	 * Returns a layout data object for this cell editor. This is called each
-	 * time the cell editor is activated and controls the layout of the SWT
-	 * table editor.
-	 * <p>
-	 * The default implementation of this method sets the minimum width to the
-	 * control's preferred width. Subclasses may extend or reimplement.
-	 * </p>
-	 *
-	 * @return the layout data object
-	 */
-	public LayoutData getLayoutData() {
-		LayoutData result = new LayoutData();
-		Control control = getControl();
-		if (control != null) {
-			result.minimumWidth = control.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-					true).x;
-		}
-		return result;
-	}
-
-	/**
-	 * Returns the input validator for this cell editor.
-	 *
-	 * @return the input validator, or <code>null</code> if none
-	 */
-	public ICellEditorValidator getValidator() {
-		return validator;
-	}
-
-	/**
-	 * Returns this cell editor's value provided that it has a valid one.
-	 *
-	 * @return the value of this cell editor, or <code>null</code> if the cell
-	 *         editor does not contain a valid value
-	 */
-	public final Object getValue() {
-		if (!valid) {
-			return null;
-		}
-
-		return doGetValue();
-	}
-
-	/**
-	 * Returns whether this cell editor is activated.
-	 *
-	 * @return <code>true</code> if this cell editor's control is currently
-	 *         activated, and <code>false</code> if not activated
-	 */
-	public boolean isActivated() {
-		// Use the state of the visible style bit (getVisible()) rather than the
-		// window's actual visibility (isVisible()) to get correct handling when
-		// an ancestor control goes invisible, see bug 85331.
-		return control != null && control.getVisible();
-	}
-
-	/**
-	 * Returns <code>true</code> if this cell editor is able to perform the
-	 * copy action.
-	 * <p>
-	 * This default implementation always returns <code>false</code>.
-	 * </p>
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 *
-	 * @return <code>true</code> if copy is possible, <code>false</code>
-	 *         otherwise
-	 */
-	public boolean isCopyEnabled() {
-		return false;
-	}
-
-	/**
-	 * Returns whether the given value is valid for this cell editor. This cell
-	 * editor's validator (if any) makes the actual determination.
-	 *
-	 * @param value
-	 *            the value to check for
-	 *
-	 * @return <code>true</code> if the value is valid, and <code>false</code>
-	 *         if invalid
-	 */
-	protected boolean isCorrect(Object value) {
-		errorMessage = null;
-		if (validator == null) {
-			return true;
-		}
-
-		errorMessage = validator.isValid(value);
-		return (errorMessage == null || errorMessage.equals(""));//$NON-NLS-1$
-	}
-
-	/**
-	 * Returns <code>true</code> if this cell editor is able to perform the
-	 * cut action.
-	 * <p>
-	 * This default implementation always returns <code>false</code>.
-	 * </p>
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 *
-	 * @return <code>true</code> if cut is possible, <code>false</code>
-	 *         otherwise
-	 */
-	public boolean isCutEnabled() {
-		return false;
-	}
-
-	/**
-	 * Returns <code>true</code> if this cell editor is able to perform the
-	 * delete action.
-	 * <p>
-	 * This default implementation always returns <code>false</code>.
-	 * </p>
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 *
-	 * @return <code>true</code> if delete is possible, <code>false</code>
-	 *         otherwise
-	 */
-	public boolean isDeleteEnabled() {
-		return false;
-	}
-
-	/**
-	 * Returns whether the value of this cell editor has changed since the last
-	 * call to <code>setValue</code>.
-	 *
-	 * @return <code>true</code> if the value has changed, and
-	 *         <code>false</code> if unchanged
-	 */
-	public boolean isDirty() {
-		return dirty;
-	}
-
-	/**
-	 * Marks this cell editor as dirty.
-	 *
-	 * @since 2.1
-	 */
-	protected void markDirty() {
-		dirty = true;
-	}
-
-	/**
-	 * Returns <code>true</code> if this cell editor is able to perform the
-	 * find action.
-	 * <p>
-	 * This default implementation always returns <code>false</code>.
-	 * </p>
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 *
-	 * @return <code>true</code> if find is possible, <code>false</code>
-	 *         otherwise
-	 */
-	public boolean isFindEnabled() {
-		return false;
-	}
-
-	/**
-	 * Returns <code>true</code> if this cell editor is able to perform the
-	 * paste action.
-	 * <p>
-	 * This default implementation always returns <code>false</code>.
-	 * </p>
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 *
-	 * @return <code>true</code> if paste is possible, <code>false</code>
-	 *         otherwise
-	 */
-	public boolean isPasteEnabled() {
-		return false;
-	}
-
-	/**
-	 * Returns <code>true</code> if this cell editor is able to perform the
-	 * redo action.
-	 * <p>
-	 * This default implementation always returns <code>false</code>.
-	 * </p>
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 *
-	 * @return <code>true</code> if redo is possible, <code>false</code>
-	 *         otherwise
-	 */
-	public boolean isRedoEnabled() {
-		return false;
-	}
-
-	/**
-	 * Returns <code>true</code> if this cell editor is able to perform the
-	 * select all action.
-	 * <p>
-	 * This default implementation always returns <code>false</code>.
-	 * </p>
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 *
-	 * @return <code>true</code> if select all is possible, <code>false</code>
-	 *         otherwise
-	 */
-	public boolean isSelectAllEnabled() {
-		return false;
-	}
-
-	/**
-	 * Returns <code>true</code> if this cell editor is able to perform the
-	 * undo action.
-	 * <p>
-	 * This default implementation always returns <code>false</code>.
-	 * </p>
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 *
-	 * @return <code>true</code> if undo is possible, <code>false</code>
-	 *         otherwise
-	 */
-	public boolean isUndoEnabled() {
-		return false;
-	}
-
-	/**
-	 * Returns whether this cell editor has a valid value. The default value is
-	 * false.
-	 *
-	 * @return <code>true</code> if the value is valid, and <code>false</code>
-	 *         if invalid
-	 *
-	 * @see #setValueValid(boolean)
-	 */
-	public boolean isValueValid() {
-		return valid;
-	}
-
-	/**
-	 * Processes a key release event that occurred in this cell editor.
-	 * <p>
-	 * The default implementation of this framework method cancels editing when
-	 * the ESC key is pressed. When the RETURN key is pressed the current value
-	 * is applied and the cell editor deactivates. Subclasses should call this
-	 * method at appropriate times. Subclasses may also extend or reimplement.
-	 * </p>
-	 *
-	 * @param keyEvent
-	 *            the key event
-	 */
-	protected void keyReleaseOccured(KeyEvent keyEvent) {
-		if (keyEvent.character == '\u001b') { // Escape character
-			fireCancelEditor();
-		} else if (keyEvent.character == '\r') { // Return key
-			fireApplyEditorValue();
-			deactivate();
-		}
-	}
-
-	/**
-	 * Processes a focus lost event that occurred in this cell editor.
-	 * <p>
-	 * The default implementation of this framework method applies the current
-	 * value and deactivates the cell editor. Subclasses should call this method
-	 * at appropriate times. Subclasses may also extend or reimplement.
-	 * </p>
-	 */
-	protected void focusLost() {
-		if (isActivated()) {
-			fireApplyEditorValue();
-			deactivate();
-		}
-	}
-
-	/**
-	 * Performs the copy action. This default implementation does nothing.
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 */
-	public void performCopy() {
-	}
-
-	/**
-	 * Performs the cut action. This default implementation does nothing.
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 */
-	public void performCut() {
-	}
-
-	/**
-	 * Performs the delete action. This default implementation does nothing.
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 */
-	public void performDelete() {
-	}
-
-	/**
-	 * Performs the find action. This default implementation does nothing.
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 */
-	public void performFind() {
-	}
-
-	/**
-	 * Performs the paste action. This default implementation does nothing.
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 */
-	public void performPaste() {
-	}
-
-	/**
-	 * Performs the redo action. This default implementation does nothing.
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 */
-	public void performRedo() {
-	}
-
-	/**
-	 * Performs the select all action. This default implementation does nothing.
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 */
-	public void performSelectAll() {
-	}
-
-	/**
-	 * Performs the undo action. This default implementation does nothing.
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 */
-	public void performUndo() {
-	}
-
-	/**
-	 * Removes the given listener from this cell editor. Has no affect if an
-	 * identical listener is not registered.
-	 *
-	 * @param listener
-	 *            a cell editor listener
-	 */
-	public void removeListener(ICellEditorListener listener) {
-		listeners.remove(listener);
-	}
-
-	/**
-	 * Removes the given property change listener from this cell editor. Has no
-	 * affect if an identical property change listener is not registered.
-	 *
-	 * @param listener
-	 *            a property change listener
-	 */
-	public void removePropertyChangeListener(IPropertyChangeListener listener) {
-		propertyChangeListeners.remove(listener);
-	}
-
-	/**
-	 * Sets or clears the current error message for this cell editor.
-	 * <p>
-	 * No formatting is done here, the message to be set is expected to be fully
-	 * formatted before being passed in.
-	 * </p>
-	 *
-	 * @param message
-	 *            the error message, or <code>null</code> to clear
-	 */
-	protected void setErrorMessage(String message) {
-		errorMessage = message;
-	}
-
-	/**
-	 * Sets the focus to the cell editor's control.
-	 */
-	public void setFocus() {
-		doSetFocus();
-	}
-
-	/**
-	 * Sets the input validator for this cell editor.
-	 *
-	 * @param validator
-	 *            the input validator, or <code>null</code> if none
-	 */
-	public void setValidator(ICellEditorValidator validator) {
-		this.validator = validator;
-	}
-
-	/**
-	 * Sets this cell editor's value.
-	 *
-	 * @param value
-	 *            the value of this cell editor
-	 */
-	public final void setValue(Object value) {
-		valid = isCorrect(value);
-		dirty = false;
-		doSetValue(value);
-	}
-
-	/**
-	 * Sets the valid state of this cell editor. The default value is false.
-	 * Subclasses should call this method on construction.
-	 *
-	 * @param valid
-	 *            <code>true</code> if the current value is valid, and
-	 *            <code>false</code> if invalid
-	 *
-	 * @see #isValueValid
-	 */
-	protected void setValueValid(boolean valid) {
-		this.valid = valid;
-	}
-
-	/**
-	 * The value has changed. Updates the valid state flag, marks this cell
-	 * editor as dirty, and notifies all registered cell editor listeners of a
-	 * value change.
-	 *
-	 * @param oldValidState
-	 *            the valid state before the end user changed the value
-	 * @param newValidState
-	 *            the current valid state
-	 * @see ICellEditorListener#editorValueChanged
-	 */
-	protected void valueChanged(boolean oldValidState, boolean newValidState) {
-		valid = newValidState;
-		dirty = true;
-		fireEditorValueChanged(oldValidState, newValidState);
-	}
-
-	/**
-	 * Activate the editor but also inform the editor which event triggered its
-	 * activation. <b>The default implementation simply calls
-	 * {@link #activate()}</b>
-	 *
-	 * @param activationEvent
-	 *            the editor activation event
-	 * @since 3.3
-	 */
-	public void activate(ColumnViewerEditorActivationEvent activationEvent) {
-		activate();
-	}
-
-	/**
-	 * The default implementation of this method returns true. Subclasses that
-	 * hook their own focus listener should override this method and return
-	 * false. See also bug 58777.
-	 *
-	 * @return <code>true</code> to indicate that a focus listener has to be
-	 *         attached
-	 * @since 3.4
-	 */
-	protected boolean dependsOnExternalFocusListener() {
-		return true;
-	}
-
-	/**
-	 * @param event
-	 *            deactivation event
-	 * @since 3.4
-	 *
-	 */
-	protected void deactivate(ColumnViewerEditorDeactivationEvent event) {
-		deactivate();
-	}
-
-	/**
-	 * Returns the duration, in milliseconds, between the mouse button click
-	 * that activates the cell editor and a subsequent mouse button click that
-	 * will be considered a <em>double click</em> on the underlying control.
-	 * Clients may override, in particular, clients can return 0 to denote that
-	 * two subsequent mouse clicks in a cell should not be interpreted as a
-	 * double click.
-	 *
-	 * @return the timeout or <code>0</code>
-	 * @since 3.4
-	 */
-	protected int getDoubleClickTimeout() {
-		return Display.getCurrent().getDoubleClickTime();
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CellLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CellLabelProvider.java
deleted file mode 100644
index 1333f95..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CellLabelProvider.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Shindl <tom.schindl@bestsolution.at> - initial API and implementation
- *     											- bug fixes for 182443
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-
-/**
- * The CellLabelProvider is an abstract implementation of a label provider for
- * structured viewers.
- * 
- * <p><b>This class is intended to be subclassed</b></p>
- * 
- * @since 3.3
- * @see ColumnLabelProvider as a concrete implementation
- */
-public abstract class CellLabelProvider extends BaseLabelProvider {
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public CellLabelProvider() {
-		super();
-	}
-
-	/**
-	 * Create a ViewerLabelProvider for the column at index
-	 * 
-	 * @param labelProvider
-	 *            The labelProvider to convert
-	 * @return ViewerLabelProvider
-	 */
-	/* package */static CellLabelProvider createViewerLabelProvider(
-			ColumnViewer viewer, IBaseLabelProvider labelProvider) {
-
-		boolean noColumnTreeViewer = viewer instanceof AbstractTreeViewer && viewer
-				.doGetColumnCount() == 0;
-
-		if (!noColumnTreeViewer
-				&& (labelProvider instanceof ITableLabelProvider
-						|| labelProvider instanceof ITableColorProvider || labelProvider instanceof ITableFontProvider))
-			return new TableColumnViewerLabelProvider(labelProvider);
-		if (labelProvider instanceof CellLabelProvider)
-			return (CellLabelProvider) labelProvider;
-		return new WrappedViewerLabelProvider(labelProvider);
-
-	}
-
-	/**
-	 * Get the image displayed in the tool tip for object.
-	 * 
-	 * <p>
-	 * <b>If {@link #getToolTipText(Object)} and
-	 * {@link #getToolTipImage(Object)} both return <code>null</code> the
-	 * control is set back to standard behavior</b>
-	 * </p>
-	 * 
-	 * @param object
-	 *            the element for which the tool tip is shown
-	 * @return {@link Image} or <code>null</code> if there is not image.
-	 */
-
-	public Image getToolTipImage(Object object) {
-		return null;
-	}
-
-	/**
-	 * Get the text displayed in the tool tip for object.
-	 * 
-	 * <p>
-	 * <b>If {@link #getToolTipText(Object)} and
-	 * {@link #getToolTipImage(Object)} both return <code>null</code> the
-	 * control is set back to standard behavior</b>
-	 * </p>
-	 * 
-	 * @param element
-	 *            the element for which the tool tip is shown
-	 * @return the {@link String} or <code>null</code> if there is not text to
-	 *         display
-	 */
-	public String getToolTipText(Object element) {
-		return null;
-	}
-
-	/**
-	 * Return the background color used for the tool tip
-	 * 
-	 * @param object
-	 *            the {@link Object} for which the tool tip is shown
-	 * 
-	 * @return the {@link Color} used or <code>null</code> if you want to use
-	 *         the default color {@link SWT#COLOR_INFO_BACKGROUND}
-	 * @see SWT#COLOR_INFO_BACKGROUND
-	 */
-	public Color getToolTipBackgroundColor(Object object) {
-		return null;
-	}
-
-	/**
-	 * The foreground color used to display the the text in the tool tip
-	 * 
-	 * @param object
-	 *            the {@link Object} for which the tool tip is shown
-	 * @return the {@link Color} used or <code>null</code> if you want to use
-	 *         the default color {@link SWT#COLOR_INFO_FOREGROUND}
-	 * @see SWT#COLOR_INFO_FOREGROUND
-	 */
-	public Color getToolTipForegroundColor(Object object) {
-		return null;
-	}
-
-	/**
-	 * Get the {@link Font} used to display the tool tip
-	 * 
-	 * @param object
-	 *            the element for which the tool tip is shown
-	 * @return {@link Font} or <code>null</code> if the default font is to be
-	 *         used.
-	 */
-	public Font getToolTipFont(Object object) {
-		return null;
-	}
-
-	/**
-	 * Return the amount of pixels in x and y direction you want the tool tip to
-	 * pop up from the mouse pointer. The default shift is 10px right and 0px
-	 * below your mouse cursor. Be aware of the fact that you should at least
-	 * position the tool tip 1px right to your mouse cursor else click events
-	 * may not get propagated properly.
-	 * 
-	 * @param object
-	 *            the element for which the tool tip is shown
-	 * @return {@link Point} to shift of the tool tip or <code>null</code> if the
-	 *         default shift should be used.
-	 */
-	public Point getToolTipShift(Object object) {
-		return null;
-	}
-
-	/**
-	 * Return whether or not to use the native tool tip. If you switch to native
-	 * tool tips only the value from {@link #getToolTipText(Object)} is used all
-	 * other features from custom tool tips are not supported.
-	 * 
-	 * <p>
-	 * To reset the control to native behavior you should return
-	 * <code>true</code> from this method and <code>null</code> from
-	 * {@link #getToolTipText(Object)} or <code>null</code> from
-	 * {@link #getToolTipText(Object)} and {@link #getToolTipImage(Object)} at
-	 * the same time
-	 * </p>
-	 * 
-	 * @param object
-	 *            the {@link Object} for which the tool tip is shown
-	 * @return <code>true</code> if native tool tips should be used
-	 */
-	public boolean useNativeToolTip(Object object) {
-		return false;
-	}
-
-	/**
-	 * The time in milliseconds the tool tip is shown for.
-	 * 
-	 * @param object
-	 *            the {@link Object} for which the tool tip is shown
-	 * @return time in milliseconds the tool tip is shown for
-	 */
-	public int getToolTipTimeDisplayed(Object object) {
-		return 0;
-	}
-
-	/**
-	 * The time in milliseconds until the tool tip is displayed.
-	 * 
-	 * @param object
-	 *            the {@link Object} for which the tool tip is shown
-	 * @return time in milliseconds until the tool tip is displayed
-	 */
-	public int getToolTipDisplayDelayTime(Object object) {
-		return 0;
-	}
-
-	/**
-	 * The {@link SWT} style used to create the {@link CLabel} (see there for
-	 * supported styles). By default {@link SWT#SHADOW_NONE} is used.
-	 * 
-	 * @param object
-	 *            the element for which the tool tip is shown
-	 * @return the style used to create the label
-	 * @see CLabel
-	 */
-	public int getToolTipStyle(Object object) {
-		return SWT.SHADOW_NONE;
-	}
-
-	/**
-	 * Update the label for cell.
-	 * 
-	 * @param cell
-	 *            {@link ViewerCell}
-	 */
-	public abstract void update(ViewerCell cell);
-	
-	/**
-	 * Initialize this label provider for use with the given column viewer for
-	 * the given column. Subclasses may extend but should call the super
-	 * implementation (which at this time is empty but may be changed in the
-	 * future).
-	 * 
-	 * @param viewer
-	 *            the viewer
-	 * @param column
-	 *            the column, or <code>null</code> if a column is not
-	 *            available.
-	 * 
-	 * @since 3.4
-	 */
-	protected void initialize(ColumnViewer viewer, ViewerColumn column) {
-	}
-
-	/**
-	 * Dispose of this label provider which was used with the given column
-	 * viewer and column. Subclasses may extend but should call the super
-	 * implementation (which calls {@link #dispose()}).
-	 * 
-	 * @param viewer
-	 *            the viewer
-	 * @param column
-	 *            the column, or <code>null</code> if a column is not
-	 *            available.
-	 * 
-	 * @since 3.4
-	 */
-	public void dispose(ColumnViewer viewer, ViewerColumn column) {
-		dispose();
-	}
-	
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CellNavigationStrategy.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CellNavigationStrategy.java
deleted file mode 100644
index b1d562f..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CellNavigationStrategy.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-
-/**
- * This class implementation the strategy how the table is navigated using the
- * keyboard.
- * 
- * <p>
- * <b>Subclasses can implement their custom navigation algorithms</b>
- * </p>
- * 
- * @since 3.3
- * 
- */
-public class CellNavigationStrategy {
-	/**
-	 * is the given event an event which moves the selection to another cell
-	 * 
-	 * @param viewer
-	 *            the viewer we are working for
-	 * @param event
-	 *            the key event
-	 * @return <code>true</code> if a new cell is searched
-	 */
-	public boolean isNavigationEvent(ColumnViewer viewer, Event event) {
-		switch (event.keyCode) {
-		case SWT.ARROW_UP:
-		case SWT.ARROW_DOWN:
-		case SWT.ARROW_LEFT:
-		case SWT.ARROW_RIGHT:
-		case SWT.HOME:
-		case SWT.PAGE_DOWN:
-		case SWT.PAGE_UP:
-		case SWT.END:
-			return true;
-		default:
-			return false;
-		}
-	}
-
-	/**
-	 * @param viewer
-	 *            the viewer we are working for
-	 * @param cellToCollapse
-	 *            the cell to collapse
-	 * @param event
-	 *            the key event
-	 * @return <code>true</code> if this event triggers collapsing of a node
-	 */
-	public boolean isCollapseEvent(ColumnViewer viewer,
-			ViewerCell cellToCollapse, Event event) {
-		return false;
-	}
-
-	/**
-	 * @param viewer
-	 *            the viewer we are working for
-	 * @param cellToExpand
-	 *            the cell to expand
-	 * @param event
-	 *            the key event
-	 * @return <code>true</code> if this event triggers expanding of a node
-	 */
-	public boolean isExpandEvent(ColumnViewer viewer, ViewerCell cellToExpand,
-			Event event) {
-		return false;
-	}
-
-	/**
-	 * @param viewer
-	 *            the viewer working for
-	 * @param cellToExpand
-	 *            the cell the user wants to expand
-	 * @param event
-	 *            the event triggering the expansion
-	 */
-	public void expand(ColumnViewer viewer, ViewerCell cellToExpand, Event event) {
-
-	}
-
-	/**
-	 * @param viewer
-	 *            the viewer working for
-	 * @param cellToCollapse
-	 *            the cell the user wants to collapse
-	 * @param event
-	 *            the event triggering the expansion
-	 */
-	public void collapse(ColumnViewer viewer, ViewerCell cellToCollapse,
-			Event event) {
-
-	}
-
-	/**
-	 * @param viewer
-	 *            the viewer we are working for
-	 * @param currentSelectedCell
-	 *            the cell currently selected
-	 * @param event
-	 *            the key event
-	 * @return the cell which is highlighted next or <code>null</code> if the
-	 *         default implementation is taken. E.g. it's fairly impossible to
-	 *         react on PAGE_DOWN requests
-	 */
-	public ViewerCell findSelectedCell(ColumnViewer viewer,
-			ViewerCell currentSelectedCell, Event event) {
-
-		switch (event.keyCode) {
-		case SWT.ARROW_UP:
-			if (currentSelectedCell != null) {
-				return currentSelectedCell.getNeighbor(ViewerCell.ABOVE, false);
-			}
-			break;
-		case SWT.ARROW_DOWN:
-			if (currentSelectedCell != null) {
-				return currentSelectedCell.getNeighbor(ViewerCell.BELOW, false);
-			}
-			break;
-		case SWT.ARROW_LEFT:
-			if (currentSelectedCell != null) {
-				return currentSelectedCell.getNeighbor(ViewerCell.LEFT, true);
-			}
-			break;
-		case SWT.ARROW_RIGHT:
-			if (currentSelectedCell != null) {
-				return currentSelectedCell.getNeighbor(ViewerCell.RIGHT, true);
-			}
-			break;
-		}
-
-		return null;
-	}
-
-	/**
-	 * This method is consulted to decide whether an event has to be canceled or
-	 * not. By default events who collapse/expand tree-nodes are canceled
-	 * 
-	 * @param viewer
-	 *            the viewer working for
-	 * @param event
-	 *            the event
-	 * @return <code>true</code> if the event has to be canceled
-	 */
-	public boolean shouldCancelEvent(ColumnViewer viewer, Event event) {
-		return event.keyCode == SWT.ARROW_LEFT
-				|| event.keyCode == SWT.ARROW_RIGHT;
-	}
-
-	/**
-	 * This method is called by the framework to initialize this navigation
-	 * strategy object. Subclasses may extend.
-	 */
-	protected void init() {
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CheckStateChangedEvent.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CheckStateChangedEvent.java
deleted file mode 100644
index a916588..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CheckStateChangedEvent.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.EventObject;
-
-/**
- * Event object describing a change to the checked state
- * of a viewer element.
- *
- * @see ICheckStateListener
- */
-public class CheckStateChangedEvent extends EventObject {
-
-    /**
-     * Generated serial version UID for this class.
-     * @since 3.1
-     */
-    private static final long serialVersionUID = 3256443603340244789L;
-
-    /**
-     * The viewer element.
-     */
-    private Object element;
-
-    /**
-     * The checked state.
-     */
-    private boolean state;
-
-    /**
-     * Creates a new event for the given source, element, and checked state.
-     *
-     * @param source the source
-     * @param element the element
-     * @param state the checked state
-     */
-    public CheckStateChangedEvent(ICheckable source, Object element,
-            boolean state) {
-        super(source);
-        this.element = element;
-        this.state = state;
-    }
-
-    /**
-     * Returns the checkable that is the source of this event.
-     *
-     * @return the originating checkable
-     */
-    public ICheckable getCheckable() {
-        return (ICheckable) source;
-    }
-
-    /**
-     * Returns the checked state of the element.
-     *
-     * @return the checked state
-     */
-    public boolean getChecked() {
-        return state;
-    }
-
-    /**
-     * Returns the element whose check state changed.
-     *
-     * @return the element
-     */
-    public Object getElement() {
-        return element;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CheckboxCellEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CheckboxCellEditor.java
deleted file mode 100644
index 2b32402..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CheckboxCellEditor.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A cell editor that manages a checkbox.
- * The cell editor's value is a boolean.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * <p>
- * Note that this implementation simply fakes it and does does not create
- * any new controls. The mere activation of this editor means that the value
- * of the check box is being toggled by the end users; the listener method
- * <code>applyEditorValue</code> is immediately called to signal the change.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class CheckboxCellEditor extends CellEditor {
-
-    /**
-     * The checkbox value.
-     */
-    /* package */
-    boolean value = false;
-
-    /**
-     * Default CheckboxCellEditor style
-     */
-    private static final int defaultStyle = SWT.NONE;
-
-    /**
-     * Creates a new checkbox cell editor with no control
-     * @since 2.1
-     */
-    public CheckboxCellEditor() {
-        setStyle(defaultStyle);
-    }
-
-    /**
-     * Creates a new checkbox cell editor parented under the given control.
-     * The cell editor value is a boolean value, which is initially <code>false</code>.
-     * Initially, the cell editor has no cell validator.
-     *
-     * @param parent the parent control
-     */
-    public CheckboxCellEditor(Composite parent) {
-        this(parent, defaultStyle);
-    }
-
-    /**
-     * Creates a new checkbox cell editor parented under the given control.
-     * The cell editor value is a boolean value, which is initially <code>false</code>.
-     * Initially, the cell editor has no cell validator.
-     *
-     * @param parent the parent control
-     * @param style the style bits
-     * @since 2.1
-     */
-    public CheckboxCellEditor(Composite parent, int style) {
-        super(parent, style);
-    }
-
-    /**
-     * The <code>CheckboxCellEditor</code> implementation of
-     * this <code>CellEditor</code> framework method simulates
-     * the toggling of the checkbox control and notifies
-     * listeners with <code>ICellEditorListener.applyEditorValue</code>.
-     */
-    public void activate() {
-        value = !value;
-        fireApplyEditorValue();
-    }
-
-    /**
-     * The <code>CheckboxCellEditor</code> implementation of
-     * this <code>CellEditor</code> framework method does
-     * nothing and returns <code>null</code>.
-     */
-    protected Control createControl(Composite parent) {
-        return null;
-    }
-
-    /**
-     * The <code>CheckboxCellEditor</code> implementation of
-     * this <code>CellEditor</code> framework method returns
-     * the checkbox setting wrapped as a <code>Boolean</code>.
-     *
-     * @return the Boolean checkbox value
-     */
-    protected Object doGetValue() {
-        return value ? Boolean.TRUE : Boolean.FALSE;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on CellEditor.
-     */
-    protected void doSetFocus() {
-        // Ignore
-    }
-
-    /**
-     * The <code>CheckboxCellEditor</code> implementation of
-     * this <code>CellEditor</code> framework method accepts
-     * a value wrapped as a <code>Boolean</code>.
-     *
-     * @param value a Boolean value
-     */
-    protected void doSetValue(Object value) {
-        Assert.isTrue(value instanceof Boolean);
-        this.value = ((Boolean) value).booleanValue();
-    }
-
-    public void activate(ColumnViewerEditorActivationEvent activationEvent) {
-    	if (activationEvent.eventType != ColumnViewerEditorActivationEvent.TRAVERSAL) {
-    		super.activate(activationEvent);
-    	}
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CheckboxTableViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CheckboxTableViewer.java
deleted file mode 100644
index 254cb0c..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CheckboxTableViewer.java
+++ /dev/null
@@ -1,485 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * A concrete viewer based on an SWT <code>Table</code>
- * control with checkboxes on each node.
- * <p>This class supports setting an {@link ICheckStateProvider} to 
- * set the checkbox states. To see standard SWT behavior, view
- * SWT Snippet274.</p>
- * <p>
- * This class is not intended to be subclassed outside the viewer framework. 
- * It is designed to be instantiated with a pre-existing SWT table control and configured
- * with a domain-specific content provider, label provider, element filter (optional),
- * and element sorter (optional).
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class CheckboxTableViewer extends TableViewer implements ICheckable {
-
-    /**
-     * List of check state listeners (element type: <code>ICheckStateListener</code>).
-     */
-    private ListenerList checkStateListeners = new ListenerList();
-    
-    /**
-     * Provides the desired state of the check boxes.
-     */
-    private ICheckStateProvider checkStateProvider;
-
-    /**
-     * Creates a table viewer on a newly-created table control under the given parent.
-     * The table control is created using the SWT style bits: 
-     * <code>SWT.CHECK</code> and <code>SWT.BORDER</code>.
-     * The table has one column.
-     * The viewer has no input, no content provider, a default label provider, 
-     * no sorter, and no filters.
-     * <p>
-     * This is equivalent to calling <code>new CheckboxTableViewer(parent, SWT.BORDER)</code>.
-     * See that constructor for more details.
-     * </p>
-     *
-     * @param parent the parent control
-     * 
-     * @deprecated use newCheckList(Composite, int) or new CheckboxTableViewer(Table)
-     *   instead (see below for details)
-     */
-    public CheckboxTableViewer(Composite parent) {
-        this(parent, SWT.BORDER);
-    }
-
-    /**
-     * Creates a table viewer on a newly-created table control under the given parent.
-     * The table control is created using the given SWT style bits, plus the 
-     * <code>SWT.CHECK</code> style bit.
-     * The table has one column. 
-     * The viewer has no input, no content provider, a default label provider, 
-     * no sorter, and no filters.
-     * <p>
-     * This also adds a <code>TableColumn</code> for the single column, 
-     * and sets a <code>TableLayout</code> on the table which sizes the column to fill 
-     * the table for its initial sizing, but does nothing on subsequent resizes.
-     * </p>
-     * <p>
-     * If the caller just needs to show a single column with no header,
-     * it is preferable to use the <code>newCheckList</code> factory method instead,
-     * since SWT properly handles the initial sizing and subsequent resizes in this case.
-     * </p>
-     * <p>
-     * If the caller adds its own columns, uses <code>Table.setHeadersVisible(true)</code>, 
-     * or needs to handle dynamic resizing of the table, it is recommended to  
-     * create the <code>Table</code> itself, specifying the <code>SWT.CHECK</code> style bit 
-     * (along with any other style bits needed), and use <code>new CheckboxTableViewer(Table)</code> 
-     * rather than this constructor.
-     * </p>
-     * 
-     * @param parent the parent control
-     * @param style SWT style bits
-     * 
-     * @deprecated use newCheckList(Composite, int) or new CheckboxTableViewer(Table) 
-     *   instead (see above for details)
-     */
-    public CheckboxTableViewer(Composite parent, int style) {
-        this(createTable(parent, style));
-    }
-
-    /**
-     * Creates a table viewer on a newly-created table control under the given parent.
-     * The table control is created using the given SWT style bits, plus the 
-     * <code>SWT.CHECK</code> style bit.
-     * The table shows its contents in a single column, with no header.
-     * The viewer has no input, no content provider, a default label provider, 
-     * no sorter, and no filters.
-     * <p>
-     * No <code>TableColumn</code> is added. SWT does not require a 
-     * <code>TableColumn</code> if showing only a single column with no header.
-     * SWT correctly handles the initial sizing and subsequent resizes in this case.
-     *
-     * @param parent the parent control
-     * @param style SWT style bits
-     * 
-     * @since 2.0
-     * @return CheckboxTableViewer
-     */
-    public static CheckboxTableViewer newCheckList(Composite parent, int style) {
-        Table table = new Table(parent, SWT.CHECK | style);
-        return new CheckboxTableViewer(table);
-    }
-
-    /**
-     * Creates a table viewer on the given table control.
-     * The <code>SWT.CHECK</code> style bit must be set on the given table control.
-     * The viewer has no input, no content provider, a default label provider, 
-     * no sorter, and no filters.
-     *
-     * @param table the table control
-     */
-    public CheckboxTableViewer(Table table) {
-        super(table);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ICheckable.
-     */
-    public void addCheckStateListener(ICheckStateListener listener) {
-        checkStateListeners.add(listener);
-    }
-    
-    /**
-     * Sets the {@link ICheckStateProvider} for this {@link CheckboxTreeViewer}.
-     * The check state provider will supply the logic for deciding whether the
-     * check box associated with each item should be checked, grayed or 
-     * unchecked. 
-     * @param checkStateProvider	The provider.
-     * @since 3.5
-     */
-    public void setCheckStateProvider(ICheckStateProvider checkStateProvider) {
-    	this.checkStateProvider = checkStateProvider;
-    	refresh();
-    }
-    
-    /*
-     * Extends this method to update check box states.
-     */
-    protected void doUpdateItem(Widget widget, Object element, boolean fullMap) {
-    	super.doUpdateItem(widget, element, fullMap);
-    	if(!widget.isDisposed()) {
-    		if(checkStateProvider != null) {
-				setChecked(element, checkStateProvider.isChecked(element));
-				setGrayed(element, checkStateProvider.isGrayed(element));
-			}
-    	}
-	}
-
-	/**
-     * Creates a new table control with one column.
-     *
-     * @param parent the parent control
-     * @param style style bits
-     * @return a new table control
-     */
-    protected static Table createTable(Composite parent, int style) {
-        Table table = new Table(parent, SWT.CHECK | style);
-
-        // Although this table column is not needed, and can cause resize problems,
-        // it can't be removed since this would be a breaking change against R1.0.
-        // See bug 6643 for more details.
-        new TableColumn(table, SWT.NONE);
-        TableLayout layout = new TableLayout();
-        layout.addColumnData(new ColumnWeightData(100));
-        table.setLayout(layout);
-
-        return table;
-    }
-
-    /**
-     * Notifies any check state listeners that a check state changed  has been received.
-     * Only listeners registered at the time this method is called are notified.
-     *
-     * @param event a check state changed event
-     *
-     * @see ICheckStateListener#checkStateChanged
-     */
-    private void fireCheckStateChanged(final CheckStateChangedEvent event) {
-        Object[] array = checkStateListeners.getListeners();
-        for (int i = 0; i < array.length; i++) {
-            final ICheckStateListener l = (ICheckStateListener) array[i];
-            SafeRunnable.run(new SafeRunnable() {
-                public void run() {
-                    l.checkStateChanged(event);
-                }
-            });
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ICheckable.
-     */
-    public boolean getChecked(Object element) {
-        Widget widget = findItem(element);
-        if (widget instanceof TableItem) {
-            return ((TableItem) widget).getChecked();
-        }
-        return false;
-    }
-
-    /**
-     * Returns a list of elements corresponding to checked table items in this
-     * viewer.
-     * <p>
-     * This method is typically used when preserving the interesting
-     * state of a viewer; <code>setCheckedElements</code> is used during the restore.
-     * </p>
-     *
-     * @return the array of checked elements
-     * @see #setCheckedElements
-     */
-    public Object[] getCheckedElements() {
-        TableItem[] children = getTable().getItems();
-        ArrayList v = new ArrayList(children.length);
-        for (int i = 0; i < children.length; i++) {
-            TableItem item = children[i];
-            if (item.getChecked()) {
-				v.add(item.getData());
-			}
-        }
-        return v.toArray();
-    }
-
-    /**
-     * Returns the grayed state of the given element.
-     *
-     * @param element the element
-     * @return <code>true</code> if the element is grayed,
-     *   and <code>false</code> if not grayed
-     */
-    public boolean getGrayed(Object element) {
-        Widget widget = findItem(element);
-        if (widget instanceof TableItem) {
-            return ((TableItem) widget).getGrayed();
-        }
-        return false;
-    }
-
-    /**
-     * Returns a list of elements corresponding to grayed nodes in this
-     * viewer.
-     * <p>
-     * This method is typically used when preserving the interesting
-     * state of a viewer; <code>setGrayedElements</code> is used during the restore.
-     * </p>
-     *
-     * @return the array of grayed elements
-     * @see #setGrayedElements
-     */
-    public Object[] getGrayedElements() {
-        TableItem[] children = getTable().getItems();
-        List v = new ArrayList(children.length);
-        for (int i = 0; i < children.length; i++) {
-            TableItem item = children[i];
-            if (item.getGrayed()) {
-				v.add(item.getData());
-			}
-        }
-        return v.toArray();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on StructuredViewer.
-     */
-    public void handleSelect(SelectionEvent event) {
-        if (event.detail == SWT.CHECK) {
-            super.handleSelect(event); // this will change the current selection
-
-            TableItem item = (TableItem) event.item;
-            Object data = item.getData();
-            if (data != null) {
-                fireCheckStateChanged(new CheckStateChangedEvent(this, data,
-                        item.getChecked()));
-            }
-        } else {
-			super.handleSelect(event);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Viewer.
-     */
-    protected void preservingSelection(Runnable updateCode) {
-    	//If a check provider is present, it determines the state across input
-    	//changes.
-    	if(checkStateProvider != null) {
-    		//Try to preserve the selection, let the ICheckProvider manage 
-    		//the check states
-    		super.preservingSelection(updateCode);
-    		return;
-    	}
-    	
-    	//Preserve checked items
-        TableItem[] children = getTable().getItems();
-        CustomHashtable checked = newHashtable(children.length * 2 + 1);
-        CustomHashtable grayed = newHashtable(children.length * 2 + 1);
-
-        for (int i = 0; i < children.length; i++) {
-            TableItem item = children[i];
-            Object data = item.getData();
-            if (data != null) {
-                if (item.getChecked()) {
-					checked.put(data, data);
-				}
-                if (item.getGrayed()) {
-					grayed.put(data, data);
-				}
-            }
-        }
-
-        super.preservingSelection(updateCode);
-
-        children = getTable().getItems();
-        for (int i = 0; i < children.length; i++) {
-            TableItem item = children[i];
-            Object data = item.getData();
-            if (data != null) {
-                item.setChecked(checked.containsKey(data));
-                item.setGrayed(grayed.containsKey(data));
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ICheckable.
-     */
-    public void removeCheckStateListener(ICheckStateListener listener) {
-        checkStateListeners.remove(listener);
-    }
-
-    /**
-     * Sets to the given value the checked state for all elements in this viewer.
-     * Does not fire events to check state listeners.
-     *
-     * @param state <code>true</code> if the element should be checked,
-     *  and <code>false</code> if it should be unchecked
-     */
-    public void setAllChecked(boolean state) {
-        TableItem[] children = getTable().getItems();
-        for (int i = 0; i < children.length; i++) {
-            TableItem item = children[i];
-            item.setChecked(state);
-        }
-    }
-
-    /**
-     * Sets to the given value the grayed state for all elements in this viewer.
-     *
-     * @param state <code>true</code> if the element should be grayed,
-     *  and <code>false</code> if it should be ungrayed
-     */
-    public void setAllGrayed(boolean state) {
-        TableItem[] children = getTable().getItems();
-        for (int i = 0; i < children.length; i++) {
-            TableItem item = children[i];
-            item.setGrayed(state);
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ICheckable.
-     */
-    public boolean setChecked(Object element, boolean state) {
-        Assert.isNotNull(element);
-        Widget widget = findItem(element);
-        if (widget instanceof TableItem) {
-            ((TableItem) widget).setChecked(state);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Sets which nodes are checked in this viewer.
-     * The given list contains the elements that are to be checked;
-     * all other nodes are to be unchecked.
-     * Does not fire events to check state listeners.
-     * <p>
-     * This method is typically used when restoring the interesting
-     * state of a viewer captured by an earlier call to <code>getCheckedElements</code>.
-     * </p>
-     *
-     * @param elements the list of checked elements (element type: <code>Object</code>)
-     * @see #getCheckedElements
-     */
-    public void setCheckedElements(Object[] elements) {
-        assertElementsNotNull(elements);
-        CustomHashtable set = newHashtable(elements.length * 2 + 1);
-        for (int i = 0; i < elements.length; ++i) {
-            set.put(elements[i], elements[i]);
-        }
-        TableItem[] items = getTable().getItems();
-        for (int i = 0; i < items.length; ++i) {
-            TableItem item = items[i];
-            Object element = item.getData();
-            if (element != null) {
-                boolean check = set.containsKey(element);
-                // only set if different, to avoid flicker
-                if (item.getChecked() != check) {
-                    item.setChecked(check);
-                }
-            }
-        }
-    }
-
-    /**
-     * Sets the grayed state for the given element in this viewer.
-     *
-     * @param element the element
-     * @param state <code>true</code> if the item should be grayed,
-     *  and <code>false</code> if it should be ungrayed
-     * @return <code>true</code> if the element is visible and the gray
-     *  state could be set, and <code>false</code> otherwise
-     */
-    public boolean setGrayed(Object element, boolean state) {
-        Assert.isNotNull(element);
-        Widget widget = findItem(element);
-        if (widget instanceof TableItem) {
-            ((TableItem) widget).setGrayed(state);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Sets which nodes are grayed in this viewer.
-     * The given list contains the elements that are to be grayed;
-     * all other nodes are to be ungrayed.
-     * <p>
-     * This method is typically used when restoring the interesting
-     * state of a viewer captured by an earlier call to <code>getGrayedElements</code>.
-     * </p>
-     *
-     * @param elements the array of grayed elements
-     *
-     * @see #getGrayedElements
-     */
-    public void setGrayedElements(Object[] elements) {
-        assertElementsNotNull(elements);
-        CustomHashtable set = newHashtable(elements.length * 2 + 1);
-        for (int i = 0; i < elements.length; ++i) {
-            set.put(elements[i], elements[i]);
-        }
-        TableItem[] items = getTable().getItems();
-        for (int i = 0; i < items.length; ++i) {
-            TableItem item = items[i];
-            Object element = item.getData();
-            if (element != null) {
-                boolean gray = set.containsKey(element);
-                // only set if different, to avoid flicker
-                if (item.getGrayed() != gray) {
-                    item.setGrayed(gray);
-                }
-            }
-        }
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CheckboxTreeViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CheckboxTreeViewer.java
deleted file mode 100644
index 5781f0b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CheckboxTreeViewer.java
+++ /dev/null
@@ -1,642 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * A concrete tree-structured viewer based on an SWT <code>Tree</code>
- * control with checkboxes on each node.
- * <p>This class supports setting an {@link ICheckStateProvider} to 
- * set the checkbox states. To see standard SWT behavior, view
- * SWT Snippet274.</p>
- * <p>
- * This class is not intended to be subclassed outside the viewer framework. 
- * It is designed to be instantiated with a pre-existing SWT tree control and configured
- * with a domain-specific content provider, label provider, element filter (optional),
- * and element sorter (optional).
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class CheckboxTreeViewer extends TreeViewer implements ICheckable {
-
-    /**
-     * List of check state listeners (element type: <code>ICheckStateListener</code>).
-     */
-    private ListenerList checkStateListeners = new ListenerList();
-    
-    /**
-     * Provides the desired state of the check boxes.
-     */
-    private ICheckStateProvider checkStateProvider;
-
-    /**
-     * Last item clicked on, or <code>null</code> if none.
-     */
-    private TreeItem lastClickedItem = null;
-
-    /**
-     * Creates a tree viewer on a newly-created tree control under the given parent.
-     * The tree control is created using the SWT style bits: <code>CHECK</code> and <code>BORDER</code>.
-     * The viewer has no input, no content provider, a default label provider, 
-     * no sorter, and no filters.
-     *
-     * @param parent the parent control
-     */
-    public CheckboxTreeViewer(Composite parent) {
-        this(parent, SWT.BORDER);
-    }
-
-    /**
-     * Creates a tree viewer on a newly-created tree control under the given parent.
-     * The tree control is created using the given SWT style bits, plus the <code>CHECK</code> style bit.
-     * The viewer has no input, no content provider, a default label provider, 
-     * no sorter, and no filters.
-     *
-     * @param parent the parent control
-     * @param style the SWT style bits
-     */
-    public CheckboxTreeViewer(Composite parent, int style) {
-        this(new Tree(parent, SWT.CHECK | style));
-    }
-
-    /**
-     * Creates a tree viewer on the given tree control.
-     * The <code>SWT.CHECK</code> style bit must be set on the given tree control.
-     * The viewer has no input, no content provider, a default label provider, 
-     * no sorter, and no filters.
-     *
-     * @param tree the tree control
-     */
-    public CheckboxTreeViewer(Tree tree) {
-        super(tree);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ICheckable.
-     */
-    public void addCheckStateListener(ICheckStateListener listener) {
-        checkStateListeners.add(listener);
-    }
-    
-    /**
-     * Sets the {@link ICheckStateProvider} for this {@link CheckboxTreeViewer}.
-     * The check state provider will supply the logic for deciding whether the
-     * check box associated with each item should be checked, grayed or 
-     * unchecked. 
-     * @param checkStateProvider	The provider.
-     * @since 3.5
-     */
-    public void setCheckStateProvider(ICheckStateProvider checkStateProvider) {
-    	this.checkStateProvider = checkStateProvider;
-    	refresh();
-    }
-    
-    /*
-     * Extends this method to update check box states.
-     */
-    protected void doUpdateItem(Item item, Object element) {
-    	super.doUpdateItem(item, element);
-    	if(!item.isDisposed() && checkStateProvider != null) {
-			setChecked(element, checkStateProvider.isChecked(element));
-			setGrayed(element, checkStateProvider.isGrayed(element));
-    	}
-	}
-
-	/**
-     * Applies the checked and grayed states of the given widget and its
-     * descendents.
-     *
-     * @param checked a set of elements (element type: <code>Object</code>) 
-     * @param grayed a set of elements (element type: <code>Object</code>) 
-     * @param widget the widget
-     */
-    private void applyState(CustomHashtable checked, CustomHashtable grayed,
-            Widget widget) {
-        Item[] items = getChildren(widget);
-        for (int i = 0; i < items.length; i++) {
-            Item item = items[i];
-            if (item instanceof TreeItem) {
-                Object data = item.getData();
-                if (data != null) {
-                    TreeItem ti = (TreeItem) item;
-                    ti.setChecked(checked.containsKey(data));
-                    ti.setGrayed(grayed.containsKey(data));
-                }
-            }
-            applyState(checked, grayed, item);
-        }
-    }
-
-    /**
-     * Notifies any check state listeners that the check state of an element has changed.
-     * Only listeners registered at the time this method is called are notified.
-     *
-     * @param event a check state changed event
-     *
-     * @see ICheckStateListener#checkStateChanged
-     */
-    protected void fireCheckStateChanged(final CheckStateChangedEvent event) {
-        Object[] array = checkStateListeners.getListeners();
-        for (int i = 0; i < array.length; i++) {
-            final ICheckStateListener l = (ICheckStateListener) array[i];
-            SafeRunnable.run(new SafeRunnable() {
-                public void run() {
-                    l.checkStateChanged(event);
-                }
-            });
-        }
-
-    }
-
-    /**
-     * Gathers the checked and grayed states of the given widget and its
-     * descendents.
-     *
-     * @param checked a writable set of elements (element type: <code>Object</code>) 
-     * @param grayed a writable set of elements (element type: <code>Object</code>) 
-     * @param widget the widget
-     */
-    private void gatherState(CustomHashtable checked, CustomHashtable grayed,
-            Widget widget) {
-        Item[] items = getChildren(widget);
-        for (int i = 0; i < items.length; i++) {
-            Item item = items[i];
-            if (item instanceof TreeItem) {
-                Object data = item.getData();
-                if (data != null) {
-                    TreeItem ti = (TreeItem) item;
-                    if (ti.getChecked()) {
-						checked.put(data, data);
-					}
-                    if (ti.getGrayed()) {
-						grayed.put(data, data);
-					}
-                }
-            }
-            gatherState(checked, grayed, item);
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ICheckable.
-     */
-    public boolean getChecked(Object element) {
-        Widget widget = findItem(element);
-        if (widget instanceof TreeItem) {
-			return ((TreeItem) widget).getChecked();
-		}
-        return false;
-    }
-
-    /**
-     * Returns a list of checked elements in this viewer's tree, 
-     * including currently hidden ones that are marked as
-     * checked but are under a collapsed ancestor.
-     * <p>
-     * This method is typically used when preserving the interesting
-     * state of a viewer; <code>setCheckedElements</code> is used during the restore.
-     * </p>
-     *
-     * @return the array of checked elements
-     *
-     * @see #setCheckedElements
-     */
-    public Object[] getCheckedElements() {
-        ArrayList v = new ArrayList();
-        Control tree = getControl();
-        internalCollectChecked(v, tree);
-        return v.toArray();
-    }
-
-    /**
-     * Returns the grayed state of the given element.
-     *
-     * @param element the element
-     * @return <code>true</code> if the element is grayed,
-     *   and <code>false</code> if not grayed
-     */
-    public boolean getGrayed(Object element) {
-        Widget widget = findItem(element);
-        if (widget instanceof TreeItem) {
-            return ((TreeItem) widget).getGrayed();
-        }
-        return false;
-    }
-
-    /**
-     * Returns a list of grayed elements in this viewer's tree, 
-     * including currently hidden ones that are marked as
-     * grayed but are under a collapsed ancestor.
-     * <p>
-     * This method is typically used when preserving the interesting
-     * state of a viewer; <code>setGrayedElements</code> is used during the restore.
-     * </p>
-     *
-     * @return the array of grayed elements
-     *
-     * @see #setGrayedElements
-     */
-    public Object[] getGrayedElements() {
-        List result = new ArrayList();
-        internalCollectGrayed(result, getControl());
-        return result.toArray();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on StructuredViewer.
-     */
-    protected void handleDoubleSelect(SelectionEvent event) {
-
-        if (lastClickedItem != null) {
-            TreeItem item = lastClickedItem;
-            Object data = item.getData();
-            if (data != null) {
-                boolean state = item.getChecked();
-                setChecked(data, !state);
-                fireCheckStateChanged(new CheckStateChangedEvent(this, data,
-                        !state));
-            }
-            lastClickedItem = null;
-        } else {
-			super.handleDoubleSelect(event);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on StructuredViewer.
-     */
-    protected void handleSelect(SelectionEvent event) {
-
-        lastClickedItem = null;
-        if (event.detail == SWT.CHECK) {
-            TreeItem item = (TreeItem) event.item;
-            lastClickedItem = item;
-            super.handleSelect(event);
-
-            Object data = item.getData();
-            if (data != null) {
-                fireCheckStateChanged(new CheckStateChangedEvent(this, data,
-                        item.getChecked()));
-            }
-        } else {
-			super.handleSelect(event);
-		}
-    }
-
-    /**
-     * Gathers the checked states of the given widget and its
-     * descendents, following a pre-order traversal of the tree.
-     *
-     * @param result a writable list of elements (element type: <code>Object</code>)
-     * @param widget the widget
-     */
-    private void internalCollectChecked(List result, Widget widget) {
-        Item[] items = getChildren(widget);
-        for (int i = 0; i < items.length; i++) {
-            Item item = items[i];
-            if (item instanceof TreeItem && ((TreeItem) item).getChecked()) {
-                Object data = item.getData();
-                if (data != null) {
-					result.add(data);
-				}
-            }
-            internalCollectChecked(result, item);
-        }
-    }
-
-    /**
-     * Gathers the grayed states of the given widget and its
-     * descendents, following a pre-order traversal of the tree.
-     *
-     * @param result a writable list of elements (element type: <code>Object</code>)
-     * @param widget the widget
-     */
-    private void internalCollectGrayed(List result, Widget widget) {
-        Item[] items = getChildren(widget);
-        for (int i = 0; i < items.length; i++) {
-            Item item = items[i];
-            if (item instanceof TreeItem && ((TreeItem) item).getGrayed()) {
-                Object data = item.getData();
-                if (data != null) {
-					result.add(data);
-				}
-            }
-            internalCollectGrayed(result, item);
-        }
-    }
-
-    /**
-     * Sets the checked state of all items to correspond to the given set of checked elements.
-     *
-     * @param checkedElements the set (element type: <code>Object</code>) of elements which are checked
-     * @param widget the widget
-     */
-    private void internalSetChecked(CustomHashtable checkedElements,
-            Widget widget) {
-        Item[] items = getChildren(widget);
-        for (int i = 0; i < items.length; i++) {
-            TreeItem item = (TreeItem) items[i];
-            Object data = item.getData();
-            if (data != null) {
-                boolean checked = checkedElements.containsKey(data);
-                if (checked != item.getChecked()) {
-                    item.setChecked(checked);
-                }
-            }
-            internalSetChecked(checkedElements, item);
-        }
-    }
-
-    /**
-     * Sets the grayed state of all items to correspond to the given set of grayed elements.
-     *
-     * @param grayedElements the set (element type: <code>Object</code>) of elements which are grayed
-     * @param widget the widget
-     */
-    private void internalSetGrayed(CustomHashtable grayedElements, Widget widget) {
-        Item[] items = getChildren(widget);
-        for (int i = 0; i < items.length; i++) {
-            TreeItem item = (TreeItem) items[i];
-            Object data = item.getData();
-            if (data != null) {
-                boolean grayed = grayedElements.containsKey(data);
-                if (grayed != item.getGrayed()) {
-                    item.setGrayed(grayed);
-                }
-            }
-            internalSetGrayed(grayedElements, item);
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Viewer.
-     */
-    protected void preservingSelection(Runnable updateCode) {
-    	//If a check provider is present, it determines the state across input
-    	//changes.
-    	if(checkStateProvider != null) {
-    		//Try to preserve the selection, let the ICheckProvider manage 
-    		//the check states
-    		super.preservingSelection(updateCode);
-    		return;
-    	}
-    	
-    	//Preserve checked items
-        int n = getItemCount(getControl());
-        CustomHashtable checkedNodes = newHashtable(n * 2 + 1);
-        CustomHashtable grayedNodes = newHashtable(n * 2 + 1);
-
-        gatherState(checkedNodes, grayedNodes, getControl());
-
-        super.preservingSelection(updateCode);
-
-        applyState(checkedNodes, grayedNodes, getControl());
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ICheckable.
-     */
-    public void removeCheckStateListener(ICheckStateListener listener) {
-        checkStateListeners.remove(listener);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ICheckable.
-     */
-    public boolean setChecked(Object element, boolean state) {
-        Assert.isNotNull(element);
-        Widget widget = internalExpand(element, false);
-        if (widget instanceof TreeItem) {
-            ((TreeItem) widget).setChecked(state);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Sets the checked state for the children of the given item.
-     *
-     * @param item the item
-     * @param state <code>true</code> if the item should be checked,
-     *  and <code>false</code> if it should be unchecked
-     */
-    private void setCheckedChildren(Item item, boolean state) {
-        createChildren(item);
-        Item[] items = getChildren(item);
-        if (items != null) {
-            for (int i = 0; i < items.length; i++) {
-                Item it = items[i];
-                if (it.getData() != null && (it instanceof TreeItem)) {
-                    TreeItem treeItem = (TreeItem) it;
-                    treeItem.setChecked(state);
-                    setCheckedChildren(treeItem, state);
-                }
-            }
-        }
-    }
-
-    /**
-     * Sets which elements are checked in this viewer's tree.
-     * The given list contains the elements that are to be checked;
-     * all other elements are to be unchecked.
-     * Does not fire events to check state listeners.
-     * <p>
-     * This method is typically used when restoring the interesting
-     * state of a viewer captured by an earlier call to <code>getCheckedElements</code>.
-     * </p>
-     *
-     * @param elements the array of checked elements
-     * @see #getCheckedElements
-     */
-    public void setCheckedElements(Object[] elements) {
-        assertElementsNotNull(elements);
-        CustomHashtable checkedElements = newHashtable(elements.length * 2 + 1);
-        for (int i = 0; i < elements.length; ++i) {
-            Object element = elements[i];
-            // Ensure item exists for element
-            internalExpand(element, false);
-            checkedElements.put(element, element);
-        }
-        Control tree = getControl();
-        tree.setRedraw(false);
-        internalSetChecked(checkedElements, tree);
-        tree.setRedraw(true);
-    }
-
-    /**
-     * Sets the grayed state for the given element in this viewer.
-     *
-     * @param element the element
-     * @param state <code>true</code> if the item should be grayed,
-     *  and <code>false</code> if it should be ungrayed
-     * @return <code>true</code> if the gray state could be set, 
-     *  and <code>false</code> otherwise
-     */
-    public boolean setGrayed(Object element, boolean state) {
-        Assert.isNotNull(element);
-        Widget widget = internalExpand(element, false);
-        if (widget instanceof TreeItem) {
-            ((TreeItem) widget).setGrayed(state);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Check and gray the selection rather than calling both
-     * setGrayed and setChecked as an optimization.
-     * Does not fire events to check state listeners.
-     * @param element the item being checked
-     * @param state a boolean indicating selection or deselection
-     * @return boolean indicating success or failure.
-     */
-    public boolean setGrayChecked(Object element, boolean state) {
-        Assert.isNotNull(element);
-        Widget widget = internalExpand(element, false);
-        if (widget instanceof TreeItem) {
-            TreeItem item = (TreeItem) widget;
-            item.setChecked(state);
-            item.setGrayed(state);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Sets which elements are grayed in this viewer's tree.
-     * The given list contains the elements that are to be grayed;
-     * all other elements are to be ungrayed.
-     * <p>
-     * This method is typically used when restoring the interesting
-     * state of a viewer captured by an earlier call to <code>getGrayedElements</code>.
-     * </p>
-     *
-     * @param elements the array of grayed elements
-     *
-     * @see #getGrayedElements
-     */
-    public void setGrayedElements(Object[] elements) {
-        assertElementsNotNull(elements);
-        CustomHashtable grayedElements = newHashtable(elements.length * 2 + 1);
-        for (int i = 0; i < elements.length; ++i) {
-            Object element = elements[i];
-            // Ensure item exists for element
-            internalExpand(element, false);
-            grayedElements.put(element, element);
-        }
-        Control tree = getControl();
-        tree.setRedraw(false);
-        internalSetGrayed(grayedElements, tree);
-        tree.setRedraw(true);
-    }
-
-    /**
-     * Sets the grayed state for the given element and its parents
-     * in this viewer.
-     *
-     * @param element the element
-     * @param state <code>true</code> if the item should be grayed,
-     *  and <code>false</code> if it should be ungrayed
-     * @return <code>true</code> if the element is visible and the gray
-     *  state could be set, and <code>false</code> otherwise
-     * @see #setGrayed
-     */
-    public boolean setParentsGrayed(Object element, boolean state) {
-        Assert.isNotNull(element);
-        Widget widget = internalExpand(element, false);
-        if (widget instanceof TreeItem) {
-            TreeItem item = (TreeItem) widget;
-            item.setGrayed(state);
-            item = item.getParentItem();
-            while (item != null) {
-                item.setGrayed(state);
-                item = item.getParentItem();
-            }
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Sets the checked state for the given element and its visible
-     * children in this viewer.
-     * Assumes that the element has been expanded before. To enforce
-     * that the item is expanded, call <code>expandToLevel</code>
-     * for the element.
-     * Does not fire events to check state listeners.
-     *
-     * @param element the element
-     * @param state <code>true</code> if the item should be checked,
-     *  and <code>false</code> if it should be unchecked
-     * @return <code>true</code> if the checked state could be set, 
-     *  and <code>false</code> otherwise
-     */
-    public boolean setSubtreeChecked(Object element, boolean state) {
-        Widget widget = internalExpand(element, false);
-        if (widget instanceof TreeItem) {
-            TreeItem item = (TreeItem) widget;
-            item.setChecked(state);
-            setCheckedChildren(item, state);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Sets to the given value the checked state for all elements in this viewer.
-     * Does not fire events to check state listeners.
-     * Assumes that the element has been expanded before. To enforce
-     * that the item is expanded, call <code>expandToLevel</code>
-     * for the element.
-     *
-     * @param state <code>true</code> if the element should be checked,
-     *  and <code>false</code> if it should be unchecked
-     * @deprecated as this method only checks or unchecks visible items
-     * is is recommended that {@link #setSubtreeChecked(Object, boolean)}
-     * is used instead.
-     * @see #setSubtreeChecked(Object, boolean) 
-     *  
-     *  @since 3.2
-     */
-	public void setAllChecked(boolean state) {
-		setAllChecked(state,  getTree().getItems());
-		
-	}
-
-	/**
-	 * Set the checked state of the visible items and their children to state.
-	 * @param state
-	 * @param items
-	 * @deprecated
-	 * @see #setAllChecked(boolean)
-	 */
-	private void setAllChecked(boolean state, TreeItem[] items) {
-		for (int i = 0; i < items.length; i++) {
-			items[i].setChecked(state);			
-			TreeItem[] children = items[i].getItems();
-			setAllChecked(state, children);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColorCellEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColorCellEditor.java
deleted file mode 100644
index 2157349..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColorCellEditor.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TableTree;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.ColorDialog;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Tree;
-
-/**
- * A cell editor that manages a color field.
- * The cell editor's value is the color (an SWT <code>RBG</code>).
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ColorCellEditor extends DialogCellEditor {
-
-    /**
-     * The default extent in pixels.
-     */
-    private static final int DEFAULT_EXTENT = 16;
-
-    /**
-     * Gap between between image and text in pixels.
-     */
-    private static final int GAP = 6;
-
-    /**
-     * The composite widget containing the color and RGB label widgets
-     */
-    private Composite composite;
-
-    /**
-     * The label widget showing the current color.
-     */
-    private Label colorLabel;
-
-    /**
-     * The label widget showing the RGB values.
-     */
-    private Label rgbLabel;
-
-    /**
-     * The image.
-     */
-    private Image image;
-
-    /**
-     * Internal class for laying out this cell editor.
-     */
-    private class ColorCellLayout extends Layout {
-        public Point computeSize(Composite editor, int wHint, int hHint,
-                boolean force) {
-            if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT) {
-				return new Point(wHint, hHint);
-			}
-            Point colorSize = colorLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-                    force);
-            Point rgbSize = rgbLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-                    force);
-            return new Point(colorSize.x + GAP + rgbSize.x, Math.max(
-                    colorSize.y, rgbSize.y));
-        }
-
-        public void layout(Composite editor, boolean force) {
-            Rectangle bounds = editor.getClientArea();
-            Point colorSize = colorLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-                    force);
-            Point rgbSize = rgbLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-                    force);
-            int ty = (bounds.height - rgbSize.y) / 2;
-            if (ty < 0) {
-				ty = 0;
-			}
-            colorLabel.setBounds(-1, 0, colorSize.x, colorSize.y);
-            rgbLabel.setBounds(colorSize.x + GAP - 1, ty, bounds.width
-                    - colorSize.x - GAP, bounds.height);
-        }
-    }
-
-    /**
-     * Creates a new color cell editor parented under the given control.
-     * The cell editor value is black (<code>RGB(0,0,0)</code>) initially, and has no 
-     * validator.
-     *
-     * @param parent the parent control
-     */
-    public ColorCellEditor(Composite parent) {
-        this(parent, SWT.NONE);
-    }
-
-    /**
-     * Creates a new color cell editor parented under the given control.
-     * The cell editor value is black (<code>RGB(0,0,0)</code>) initially, and has no 
-     * validator.
-     *
-     * @param parent the parent control
-     * @param style the style bits
-     * @since 2.1
-     */
-    public ColorCellEditor(Composite parent, int style) {
-        super(parent, style);
-        doSetValue(new RGB(0, 0, 0));
-    }
-
-    /**
-     * Creates and returns the color image data for the given control
-     * and RGB value. The image's size is either the control's item extent 
-     * or the cell editor's default extent, which is 16 pixels square.
-     *
-     * @param w the control
-     * @param color the color
-     */
-    private ImageData createColorImage(Control w, RGB color) {
-
-        GC gc = new GC(w);
-        FontMetrics fm = gc.getFontMetrics();
-        int size = fm.getAscent();
-        gc.dispose();
-
-        int indent = 6;
-        int extent = DEFAULT_EXTENT;
-        if (w instanceof Table) {
-			extent = ((Table) w).getItemHeight() - 1;
-		} else if (w instanceof Tree) {
-			extent = ((Tree) w).getItemHeight() - 1;
-		} else if (w instanceof TableTree) {
-			extent = ((TableTree) w).getItemHeight() - 1;
-		}
-
-        if (size > extent) {
-			size = extent;
-		}
-
-        int width = indent + size;
-        int height = extent;
-
-        int xoffset = indent;
-        int yoffset = (height - size) / 2;
-
-        RGB black = new RGB(0, 0, 0);
-        PaletteData dataPalette = new PaletteData(new RGB[] { black, black,
-                color });
-        ImageData data = new ImageData(width, height, 4, dataPalette);
-        data.transparentPixel = 0;
-
-        int end = size - 1;
-        for (int y = 0; y < size; y++) {
-            for (int x = 0; x < size; x++) {
-                if (x == 0 || y == 0 || x == end || y == end) {
-					data.setPixel(x + xoffset, y + yoffset, 1);
-				} else {
-					data.setPixel(x + xoffset, y + yoffset, 2);
-				}
-            }
-        }
-
-        return data;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on DialogCellEditor.
-     */
-    protected Control createContents(Composite cell) {
-        Color bg = cell.getBackground();
-        composite = new Composite(cell, getStyle());
-        composite.setBackground(bg);
-        composite.setLayout(new ColorCellLayout());
-        colorLabel = new Label(composite, SWT.LEFT);
-        colorLabel.setBackground(bg);
-        rgbLabel = new Label(composite, SWT.LEFT);
-        rgbLabel.setBackground(bg);
-        rgbLabel.setFont(cell.getFont());
-        return composite;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on CellEditor.
-     */
-    public void dispose() {
-        if (image != null) {
-            image.dispose();
-            image = null;
-        }
-        super.dispose();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on DialogCellEditor.
-     */
-    protected Object openDialogBox(Control cellEditorWindow) {
-        ColorDialog dialog = new ColorDialog(cellEditorWindow.getShell());
-        Object value = getValue();
-        if (value != null) {
-			dialog.setRGB((RGB) value);
-		}
-        value = dialog.open();
-        return dialog.getRGB();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on DialogCellEditor.
-     */
-    protected void updateContents(Object value) {
-        RGB rgb = (RGB) value;
-        // XXX: We don't have a value the first time this method is called".
-        if (rgb == null) {
-            rgb = new RGB(0, 0, 0);
-        }
-        // XXX: Workaround for 1FMQ0P3: SWT:ALL - TableItem.setImage doesn't work if using the identical image."
-        if (image != null) {
-			image.dispose();
-		}
-
-        ImageData id = createColorImage(colorLabel.getParent().getParent(), rgb);
-        ImageData mask = id.getTransparencyMask();
-        image = new Image(colorLabel.getDisplay(), id, mask);
-        colorLabel.setImage(image);
-
-        rgbLabel
-                .setText("(" + rgb.red + "," + rgb.green + "," + rgb.blue + ")");//$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnLabelProvider.java
deleted file mode 100644
index 05a64ad..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnLabelProvider.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The ColumnLabelProvider is the label provider for viewers
- * that have column support such as {@link TreeViewer} and
- * {@link TableViewer}
- * 
- * <p><b>This classes is intended to be subclassed</b></p>
- * 
- * @since 3.3
- *
- */
-public class ColumnLabelProvider extends CellLabelProvider implements
-		IFontProvider, IColorProvider, ILabelProvider {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.CellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell)
-	 */
-	public void update(ViewerCell cell) {
-		Object element = cell.getElement();
-		cell.setText(getText(element));
-		Image image = getImage(element);
-		cell.setImage(image);
-		cell.setBackground(getBackground(element));
-		cell.setForeground(getForeground(element));
-		cell.setFont(getFont(element));
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-	 */
-	public Font getFont(Object element) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-	 */
-	public Color getBackground(Object element) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-	 */
-	public Color getForeground(Object element) {
-		return null;
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object element) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object element) {
-		return element == null ? "" : element.toString();//$NON-NLS-1$
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnLayoutData.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnLayoutData.java
deleted file mode 100644
index 965fdab..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnLayoutData.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * An abstract column layout data describing the information needed 
- * (by <code>TableLayout</code>) to properly lay out a table. 
- * <p>
- * This class is not intended to be subclassed outside the framework.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public abstract class ColumnLayoutData {
-
-    /**
-     * Indicates whether the column is resizable.
-     */
-    public boolean resizable;
-
-    /**
-     * Creates a new column layout data object.
-     *
-     * @param resizable <code>true</code> if the column is resizable, and <code>false</code> if not
-     */
-    protected ColumnLayoutData(boolean resizable) {
-        this.resizable = resizable;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnPixelData.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnPixelData.java
deleted file mode 100644
index f1b1750..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnPixelData.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * Describes the width of a table column in pixels, and
- * whether the column is resizable.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ColumnPixelData extends ColumnLayoutData {
-
-   /**
-     * The column's width in pixels.
-     */
-    public int width;
-
-	/**
-	 * Whether to allocate extra width to the column to account for
-	 * trim taken by the column itself.
-	 * The default is <code>false</code> for backwards compatibility, but
-	 * the recommended practice is to specify <code>true</code>, and
-	 * specify the desired width for the content of the column, rather
-	 * than adding a fudge factor to the specified width.
-	 * 
-	 * @since 3.1
-	 */
-	public boolean addTrim = false;
-	
-    /**
-     * Creates a resizable column width of the given number of pixels.
-     *
-     * @param widthInPixels the width of column in pixels
-     */
-    public ColumnPixelData(int widthInPixels) {
-        this(widthInPixels, true, false);
-    }
-
-    /**
-     * Creates a column width of the given number of pixels.
-     *
-     * @param widthInPixels the width of column in pixels
-     * @param resizable <code>true</code> if the column is resizable,
-     *   and <code>false</code> if size of the column is fixed
-     */
-    public ColumnPixelData(int widthInPixels, boolean resizable) {
-		this(widthInPixels, resizable, false);
-    }
-
-    /**
-	 * Creates a column width of the given number of pixels.
-	 * 
-	 * @param widthInPixels
-	 *            the width of column in pixels
-	 * @param resizable
-	 *            <code>true</code> if the column is resizable, and
-	 *            <code>false</code> if size of the column is fixed
-	 * @param addTrim
-	 *            <code>true</code> to allocate extra width to the column to
-	 *            account for trim taken by the column itself,
-	 *            <code>false</code> to use the given width exactly
-	 * @since 3.1
-	 */
-    public ColumnPixelData(int widthInPixels, boolean resizable, boolean addTrim) {
-        super(resizable);
-        Assert.isTrue(widthInPixels >= 0);
-        this.width = widthInPixels;
-		this.addTrim = addTrim;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewer.java
deleted file mode 100644
index 9003e55..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewer.java
+++ /dev/null
@@ -1,819 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation; bug 153993
- *												   fix in bug 163317, 151295, 167323, 167858, 184346, 187826, 201905
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.internal.InternalPolicy;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * The ColumnViewer is the abstract superclass of viewers that have columns
- * (e.g., AbstractTreeViewer and AbstractTableViewer). Concrete subclasses of
- * {@link ColumnViewer} should implement a matching concrete subclass of {@link
- * ViewerColumn}.
- * 
- * <strong> This class is not intended to be subclassed outside of the JFace
- * viewers framework.</strong>
- * 
- * @since 3.3
- * 
- */
-public abstract class ColumnViewer extends StructuredViewer {
-	private CellEditor[] cellEditors;
-
-	private ICellModifier cellModifier;
-
-	private String[] columnProperties;
-
-	/**
-	 * The cell is a cached viewer cell used for refreshing.
-	 */
-	private ViewerCell cell = new ViewerCell(null, 0, null);
-
-	private ColumnViewerEditor viewerEditor;
-
-	private boolean busy;
-	private boolean logWhenBusy = true; // initially true, set to false
-
-	// after logging for the first
-	// time
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public ColumnViewer() {
-
-	}
-
-	protected void hookControl(Control control) {
-		super.hookControl(control);
-		viewerEditor = createViewerEditor();
-		hookEditingSupport(control);
-	}
-
-	/**
-	 * Hook up the editing support. Subclasses may override.
-	 * 
-	 * @param control
-	 * 		the control you want to hook on
-	 */
-	protected void hookEditingSupport(Control control) {
-		// Needed for backwards comp with AbstractTreeViewer and TableTreeViewer
-		// who are not hooked this way others may already overwrite and provide
-		// their
-		// own impl
-		if (viewerEditor != null) {
-			control.addMouseListener(new MouseAdapter() {
-				public void mouseDown(MouseEvent e) {
-					// Workaround for bug 185817
-					if (e.count != 2) {
-						handleMouseDown(e);
-					}
-				}
-
-				public void mouseDoubleClick(MouseEvent e) {
-					handleMouseDown(e);
-				}
-			});
-		}
-	}
-
-	/**
-	 * Creates the viewer editor used for editing cell contents. To be
-	 * implemented by subclasses.
-	 * 
-	 * @return the editor, or <code>null</code> if this viewer does not support
-	 * 	editing cell contents.
-	 */
-	protected abstract ColumnViewerEditor createViewerEditor();
-
-	/**
-	 * Returns the viewer cell at the given widget-relative coordinates, or
-	 * <code>null</code> if there is no cell at that location
-	 * 
-	 * @param point
-	 * 		the widget-relative coordinates
-	 * @return the cell or <code>null</code> if no cell is found at the given
-	 * 	point
-	 * 
-	 * @since 3.4
-	 */
-	public ViewerCell getCell(Point point) {
-		ViewerRow row = getViewerRow(point);
-		if (row != null) {
-			return row.getCell(point);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns the viewer row at the given widget-relative coordinates.
-	 * 
-	 * @param point
-	 * 		the widget-relative coordinates of the viewer row
-	 * @return ViewerRow the row or <code>null</code> if no row is found at the
-	 * 	given coordinates
-	 */
-	protected ViewerRow getViewerRow(Point point) {
-		Item item = getItemAt(point);
-
-		if (item != null) {
-			return getViewerRowFromItem(item);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Returns a {@link ViewerRow} associated with the given row widget.
-	 * Implementations may re-use the same instance for different row widgets;
-	 * callers can only use the viewer row locally and until the next call to
-	 * this method.
-	 * 
-	 * @param item
-	 * 		the row widget
-	 * @return ViewerRow a viewer row object
-	 */
-	protected abstract ViewerRow getViewerRowFromItem(Widget item);
-
-	/**
-	 * Returns the column widget at the given column index.
-	 * 
-	 * @param columnIndex
-	 * 		the column index
-	 * @return Widget the column widget
-	 */
-	protected abstract Widget getColumnViewerOwner(int columnIndex);
-
-	/**
-	 * Returns the viewer column for the given column index.
-	 * 
-	 * @param columnIndex
-	 * 		the column index
-	 * @return the viewer column at the given index, or <code>null</code> if
-	 * 	there is none for the given index
-	 */
-	/* package */ViewerColumn getViewerColumn(final int columnIndex) {
-
-		ViewerColumn viewer;
-		Widget columnOwner = getColumnViewerOwner(columnIndex);
-
-		if (columnOwner == null || columnOwner.isDisposed()) {
-			return null;
-		}
-
-		viewer = (ViewerColumn) columnOwner
-				.getData(ViewerColumn.COLUMN_VIEWER_KEY);
-
-		if (viewer == null) {
-			viewer = createViewerColumn(columnOwner, CellLabelProvider
-					.createViewerLabelProvider(this, getLabelProvider()));
-			setupEditingSupport(columnIndex, viewer);
-		}
-
-		if (viewer.getEditingSupport() == null && getCellModifier() != null) {
-			setupEditingSupport(columnIndex, viewer);
-		}
-
-		return viewer;
-	}
-
-	/**
-	 * Sets up editing support for the given column based on the "old" cell
-	 * editor API.
-	 * 
-	 * @param columnIndex
-	 * @param viewer
-	 */
-	private void setupEditingSupport(final int columnIndex, ViewerColumn viewer) {
-		if (getCellModifier() != null) {
-			viewer.setEditingSupport(new EditingSupport(this) {
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see
-				 * org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang
-				 * .Object)
-				 */
-				public boolean canEdit(Object element) {
-					Object[] properties = getColumnProperties();
-
-					if (columnIndex < properties.length) {
-						return getCellModifier().canModify(element,
-								(String) getColumnProperties()[columnIndex]);
-					}
-
-					return false;
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see
-				 * org.eclipse.jface.viewers.EditingSupport#getCellEditor(java
-				 * .lang.Object)
-				 */
-				public CellEditor getCellEditor(Object element) {
-					CellEditor[] editors = getCellEditors();
-					if (columnIndex < editors.length) {
-						return getCellEditors()[columnIndex];
-					}
-					return null;
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see
-				 * org.eclipse.jface.viewers.EditingSupport#getValue(java.lang
-				 * .Object)
-				 */
-				public Object getValue(Object element) {
-					Object[] properties = getColumnProperties();
-
-					if (columnIndex < properties.length) {
-						return getCellModifier().getValue(element,
-								(String) getColumnProperties()[columnIndex]);
-					}
-
-					return null;
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see
-				 * org.eclipse.jface.viewers.EditingSupport#setValue(java.lang
-				 * .Object, java.lang.Object)
-				 */
-				public void setValue(Object element, Object value) {
-					Object[] properties = getColumnProperties();
-
-					if (columnIndex < properties.length) {
-						getCellModifier().modify(findItem(element),
-								(String) getColumnProperties()[columnIndex],
-								value);
-					}
-				}
-
-				boolean isLegacySupport() {
-					return true;
-				}
-			});
-		}
-	}
-
-	/**
-	 * Creates a generic viewer column for the given column widget, based on the
-	 * given label provider.
-	 * 
-	 * @param columnOwner
-	 * 		the column widget
-	 * @param labelProvider
-	 * 		the label provider to use for the column
-	 * @return ViewerColumn the viewer column
-	 */
-	private ViewerColumn createViewerColumn(Widget columnOwner,
-			CellLabelProvider labelProvider) {
-		ViewerColumn column = new ViewerColumn(this, columnOwner) {
-		};
-		column.setLabelProvider(labelProvider, false);
-		return column;
-	}
-
-	/**
-	 * Update the cached cell object with the given row and column.
-	 * 
-	 * @param rowItem
-	 * @param column
-	 * @return ViewerCell
-	 */
-	/* package */ViewerCell updateCell(ViewerRow rowItem, int column,
-			Object element) {
-		cell.update(rowItem, column, element);
-		return cell;
-	}
-
-	/**
-	 * Returns the {@link Item} at the given widget-relative coordinates, or
-	 * <code>null</code> if there is no item at the given coordinates.
-	 * 
-	 * @param point
-	 * 		the widget-relative coordinates
-	 * @return the {@link Item} at the coordinates or <code>null</code> if there
-	 * 	is no item at the given coordinates
-	 */
-	protected abstract Item getItemAt(Point point);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.StructuredViewer#getItem(int, int)
-	 */
-	protected Item getItem(int x, int y) {
-		return getItemAt(getControl().toControl(x, y));
-	}
-
-	/**
-	 * The column viewer implementation of this <code>Viewer</code> framework
-	 * method ensures that the given label provider is an instance of
-	 * <code>ITableLabelProvider</code>, <code>ILabelProvider</code>, or
-	 * <code>CellLabelProvider</code>.
-	 * <p>
-	 * If the label provider is an {@link ITableLabelProvider} , then it
-	 * provides a separate label text and image for each column. Implementers of
-	 * <code>ITableLabelProvider</code> may also implement {@link
-	 * ITableColorProvider} and/or {@link ITableFontProvider} to provide colors
-	 * and/or fonts.
-	 * </p>
-	 * <p>
-	 * If the label provider is an <code>ILabelProvider</code> , then it
-	 * provides only the label text and image for the first column, and any
-	 * remaining columns are blank. Implementers of <code>ILabelProvider</code>
-	 * may also implement {@link IColorProvider} and/or {@link IFontProvider} to
-	 * provide colors and/or fonts.
-	 * </p>
-	 * 
-	 */
-	public void setLabelProvider(IBaseLabelProvider labelProvider) {
-		Assert.isTrue(labelProvider instanceof ITableLabelProvider
-				|| labelProvider instanceof ILabelProvider
-				|| labelProvider instanceof CellLabelProvider);
-		updateColumnParts(labelProvider);// Reset the label providers in the
-		// columns
-		super.setLabelProvider(labelProvider);
-		if (labelProvider instanceof CellLabelProvider) {
-			((CellLabelProvider) labelProvider).initialize(this, null);
-		}
-	}
-
-	void internalDisposeLabelProvider(IBaseLabelProvider oldProvider) {
-		if (oldProvider instanceof CellLabelProvider) {
-			((CellLabelProvider) oldProvider).dispose(this, null);
-		} else {
-			super.internalDisposeLabelProvider(oldProvider);
-		}
-	}
-
-	/**
-	 * Clear the viewer parts for the columns
-	 */
-	private void updateColumnParts(IBaseLabelProvider labelProvider) {
-		ViewerColumn column;
-		int i = 0;
-
-		while ((column = getViewerColumn(i++)) != null) {
-			column.setLabelProvider(CellLabelProvider
-					.createViewerLabelProvider(this, labelProvider), false);
-		}
-	}
-
-	/**
-	 * Cancels a currently active cell editor if one is active. All changes
-	 * already done in the cell editor are lost.
-	 * 
-	 * @since 3.1 (in subclasses, added in 3.3 to abstract class)
-	 */
-	public void cancelEditing() {
-		if (viewerEditor != null) {
-			viewerEditor.cancelEditing();
-		}
-	}
-
-	/**
-	 * Apply the value of the active cell editor if one is active.
-	 * 
-	 * @since 3.3
-	 */
-	protected void applyEditorValue() {
-		if (viewerEditor != null) {
-			viewerEditor.applyEditorValue();
-		}
-	}
-
-	/**
-	 * Starts editing the given element at the given column index.
-	 * 
-	 * @param element
-	 * 		the model element
-	 * @param column
-	 * 		the column index
-	 * @since 3.1 (in subclasses, added in 3.3 to abstract class)
-	 */
-	public void editElement(Object element, int column) {
-		if (viewerEditor != null) {
-			try {
-				getControl().setRedraw(false);
-				// Set the selection at first because in Tree's
-				// the element might not be materialized
-				setSelection(new StructuredSelection(element), true);
-
-				Widget item = findItem(element);
-				if (item != null) {
-					ViewerRow row = getViewerRowFromItem(item);
-					if (row != null) {
-						ViewerCell cell = row.getCell(column);
-						if (cell != null) {
-							triggerEditorActivationEvent(new ColumnViewerEditorActivationEvent(
-									cell));
-						}
-					}
-				}
-			} finally {
-				getControl().setRedraw(true);
-			}
-		}
-	}
-
-	/**
-	 * Return the CellEditors for the receiver, or <code>null</code> if no cell
-	 * editors are set.
-	 * <p>
-	 * Since 3.3, an alternative API is available, see {@link
-	 * ViewerColumn#setEditingSupport(EditingSupport)} for a more flexible way
-	 * of editing values in a column viewer.
-	 * </p>
-	 * 
-	 * 
-	 * @return CellEditor[]
-	 * @since 3.1 (in subclasses, added in 3.3 to abstract class)
-	 * @see ViewerColumn#setEditingSupport(EditingSupport)
-	 * @see EditingSupport
-	 */
-	public CellEditor[] getCellEditors() {
-		return cellEditors;
-	}
-
-	/**
-	 * Returns the cell modifier of this viewer, or <code>null</code> if none
-	 * has been set.
-	 * 
-	 * <p>
-	 * Since 3.3, an alternative API is available, see {@link
-	 * ViewerColumn#setEditingSupport(EditingSupport)} for a more flexible way
-	 * of editing values in a column viewer.
-	 * </p>
-	 * 
-	 * @return the cell modifier, or <code>null</code>
-	 * @since 3.1 (in subclasses, added in 3.3 to abstract class)
-	 * @see ViewerColumn#setEditingSupport(EditingSupport)
-	 * @see EditingSupport
-	 */
-	public ICellModifier getCellModifier() {
-		return cellModifier;
-	}
-
-	/**
-	 * Returns the column properties of this table viewer. The properties must
-	 * correspond with the columns of the table control. They are used to
-	 * identify the column in a cell modifier.
-	 * 
-	 * <p>
-	 * Since 3.3, an alternative API is available, see {@link
-	 * ViewerColumn#setEditingSupport(EditingSupport)} for a more flexible way
-	 * of editing values in a column viewer.
-	 * </p>
-	 * 
-	 * @return the list of column properties
-	 * @since 3.1 (in subclasses, added in 3.3 to abstract class)
-	 * @see ViewerColumn#setEditingSupport(EditingSupport)
-	 * @see EditingSupport
-	 */
-	public Object[] getColumnProperties() {
-		return columnProperties;
-	}
-
-	/**
-	 * Returns whether there is an active cell editor.
-	 * 
-	 * <p>
-	 * Since 3.3, an alternative API is available, see {@link
-	 * ViewerColumn#setEditingSupport(EditingSupport)} for a more flexible way
-	 * of editing values in a column viewer.
-	 * </p>
-	 * 
-	 * @return <code>true</code> if there is an active cell editor, and
-	 * 	<code>false</code> otherwise
-	 * @since 3.1 (in subclasses, added in 3.3 to abstract class)
-	 * @see ViewerColumn#setEditingSupport(EditingSupport)
-	 * @see EditingSupport
-	 */
-	public boolean isCellEditorActive() {
-		if (viewerEditor != null) {
-			return viewerEditor.isCellEditorActive();
-		}
-		return false;
-	}
-
-	public void refresh(Object element) {
-		if (checkBusy())
-			return;
-
-		if (isCellEditorActive()) {
-			cancelEditing();
-		}
-
-		super.refresh(element);
-	}
-
-	public void refresh(Object element, boolean updateLabels) {
-		if (checkBusy())
-			return;
-
-		if (isCellEditorActive()) {
-			cancelEditing();
-		}
-
-		super.refresh(element, updateLabels);
-	}
-
-	public void update(Object element, String[] properties) {
-		if (checkBusy())
-			return;
-		super.update(element, properties);
-	}
-
-	/**
-	 * Sets the cell editors of this column viewer. If editing is not supported
-	 * by this viewer the call simply has no effect.
-	 * 
-	 * <p>
-	 * Since 3.3, an alternative API is available, see {@link
-	 * ViewerColumn#setEditingSupport(EditingSupport)} for a more flexible way
-	 * of editing values in a column viewer.
-	 * </p>
-	 * <p>
-	 * Users setting up an editable {@link TreeViewer} or {@link TableViewer} with more than 1 column <b>have</b>
-	 * to pass the SWT.FULL_SELECTION style bit
-	 * </p>
-	 * @param editors
-	 * 		the list of cell editors
-	 * @since 3.1 (in subclasses, added in 3.3 to abstract class)
-	 * @see ViewerColumn#setEditingSupport(EditingSupport)
-	 * @see EditingSupport
-	 */
-	public void setCellEditors(CellEditor[] editors) {
-		this.cellEditors = editors;
-	}
-
-	/**
-	 * Sets the cell modifier for this column viewer. This method does nothing
-	 * if editing is not supported by this viewer.
-	 * 
-	 * <p>
-	 * Since 3.3, an alternative API is available, see {@link
-	 * ViewerColumn#setEditingSupport(EditingSupport)} for a more flexible way
-	 * of editing values in a column viewer.
-	 * </p>
-	 * <p>
-	 * Users setting up an editable {@link TreeViewer} or {@link TableViewer} with more than 1 column <b>have</b>
-	 * to pass the SWT.FULL_SELECTION style bit
-	 * </p>
-	 * @param modifier
-	 * 		the cell modifier
-	 * @since 3.1 (in subclasses, added in 3.3 to abstract class)
-	 * @see ViewerColumn#setEditingSupport(EditingSupport)
-	 * @see EditingSupport
-	 */
-	public void setCellModifier(ICellModifier modifier) {
-		this.cellModifier = modifier;
-	}
-
-	/**
-	 * Sets the column properties of this column viewer. The properties must
-	 * correspond with the columns of the control. They are used to identify the
-	 * column in a cell modifier. If editing is not supported by this viewer the
-	 * call simply has no effect.
-	 * 
-	 * <p>
-	 * Since 3.3, an alternative API is available, see {@link
-	 * ViewerColumn#setEditingSupport(EditingSupport)} for a more flexible way
-	 * of editing values in a column viewer.
-	 * </p>
-	 * <p>
-	 * Users setting up an editable {@link TreeViewer} or {@link TableViewer} with more than 1 column <b>have</b>
-	 * to pass the SWT.FULL_SELECTION style bit
-	 * </p>
-	 * @param columnProperties
-	 * 		the list of column properties
-	 * @since 3.1 (in subclasses, added in 3.3 to abstract class)
-	 * @see ViewerColumn#setEditingSupport(EditingSupport)
-	 * @see EditingSupport
-	 */
-	public void setColumnProperties(String[] columnProperties) {
-		this.columnProperties = columnProperties;
-	}
-
-	/**
-	 * Returns the number of columns contained in the receiver. If no columns
-	 * were created by the programmer, this value is zero, despite the fact that
-	 * visually, one column of items may be visible. This occurs when the
-	 * programmer uses the column viewer like a list, adding elements but never
-	 * creating a column.
-	 * 
-	 * @return the number of columns
-	 * 
-	 * @since 3.3
-	 */
-	protected abstract int doGetColumnCount();
-
-	/**
-	 * Returns the label provider associated with the column at the given index
-	 * or <code>null</code> if no column with this index is known.
-	 * 
-	 * @param columnIndex
-	 * 		the column index
-	 * @return the label provider associated with the column or
-	 * 	<code>null</code> if no column with this index is known
-	 * 
-	 * @since 3.3
-	 */
-	public CellLabelProvider getLabelProvider(int columnIndex) {
-		ViewerColumn column = getViewerColumn(columnIndex);
-		if (column != null) {
-			return column.getLabelProvider();
-		}
-		return null;
-	}
-
-	private void handleMouseDown(MouseEvent e) {
-		ViewerCell cell = getCell(new Point(e.x, e.y));
-
-		if (cell != null) {
-			triggerEditorActivationEvent(new ColumnViewerEditorActivationEvent(
-					cell, e));
-		}
-	}
-
-	/**
-	 * Invoking this method fires an editor activation event which tries to
-	 * enable the editor but before this event is passed to {@link
-	 * ColumnViewerEditorActivationStrategy} to see if this event should really
-	 * trigger editor activation
-	 * 
-	 * @param event
-	 * 		the activation event
-	 */
-	protected void triggerEditorActivationEvent(
-			ColumnViewerEditorActivationEvent event) {
-		viewerEditor.handleEditorActivationEvent(event);
-	}
-
-	/**
-	 * @param columnViewerEditor
-	 * 		the new column viewer editor
-	 */
-	public void setColumnViewerEditor(ColumnViewerEditor columnViewerEditor) {
-		Assert.isNotNull(columnViewerEditor);
-		this.viewerEditor = columnViewerEditor;
-	}
-
-	/**
-	 * @return the currently attached viewer editor
-	 */
-	public ColumnViewerEditor getColumnViewerEditor() {
-		return viewerEditor;
-	}
-
-	protected Object[] getRawChildren(Object parent) {
-		boolean oldBusy = isBusy();
-		setBusy(true);
-		try {
-			return super.getRawChildren(parent);
-		} finally {
-			setBusy(oldBusy);
-		}
-	}
-
-	void clearLegacyEditingSetup() {
-		if (!getControl().isDisposed() && getCellEditors() != null) {
-			int count = doGetColumnCount();
-
-			for (int i = 0; i < count || i == 0; i++) {
-				Widget owner = getColumnViewerOwner(i);
-				if (owner != null && !owner.isDisposed()) {
-					ViewerColumn column = (ViewerColumn) owner
-							.getData(ViewerColumn.COLUMN_VIEWER_KEY);
-					if (column != null) {
-						EditingSupport e = column.getEditingSupport();
-						// Ensure that only EditingSupports are wiped that are
-						// setup
-						// for Legacy reasons
-						if (e != null && e.isLegacySupport()) {
-							column.setEditingSupport(null);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Checks if this viewer is currently busy, logging a warning and returning
-	 * <code>true</code> if it is busy. A column viewer is busy when it is
-	 * processing a refresh, add, remove, insert, replace, setItemCount,
-	 * expandToLevel, update, setExpandedElements, or similar method that may
-	 * make calls to client code. Column viewers are not designed to handle
-	 * reentrant calls while they are busy. The method returns <code>true</code>
-	 * if the viewer is busy. It is recommended that this method be used by
-	 * subclasses to determine whether the viewer is busy to return early from
-	 * state-changing methods.
-	 * 
-	 * <p>
-	 * This method is not intended to be overridden by subclasses.
-	 * </p>
-	 * 
-	 * @return <code>true</code> if the viewer is busy.
-	 * 
-	 * @since 3.4
-	 */
-	protected boolean checkBusy() {
-		if (isBusy()) {
-			if (logWhenBusy) {
-				String message = "Ignored reentrant call while viewer is busy."; //$NON-NLS-1$
-				if (!InternalPolicy.DEBUG_LOG_REENTRANT_VIEWER_CALLS) {
-					// stop logging after the first
-					logWhenBusy = false;
-					message += " This is only logged once per viewer instance," + //$NON-NLS-1$
-							" but similar calls will still be ignored."; //$NON-NLS-1$
-				}
-				Policy.getLog().log(
-						new Status(IStatus.WARNING, Policy.JFACE, message,
-								new RuntimeException()));
-			}
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Sets the busy state of this viewer. Subclasses MUST use <code>try</code>
-	 * ...<code>finally</code> as follows to ensure that the busy flag is reset
-	 * to its original value:
-	 * 
-	 * <pre>
-	 * boolean oldBusy = isBusy();
-	 * setBusy(true);
-	 * try {
-	 * 	// do work
-	 * } finally {
-	 * 	setBusy(oldBusy);
-	 * }
-	 * </pre>
-	 * 
-	 * <p>
-	 * This method is not intended to be overridden by subclasses.
-	 * </p>
-	 * 
-	 * @param busy
-	 * 		the new value of the busy flag
-	 * 
-	 * @since 3.4
-	 */
-	protected void setBusy(boolean busy) {
-		this.busy = busy;
-	}
-
-	/**
-	 * Returns <code>true</code> if this viewer is currently busy processing a
-	 * refresh, add, remove, insert, replace, setItemCount, expandToLevel,
-	 * update, setExpandedElements, or similar method that may make calls to
-	 * client code. Column viewers are not designed to handle reentrant calls
-	 * while they are busy. It is recommended that clients avoid using this
-	 * method if they can ensure by other means that they will not make
-	 * reentrant calls to methods like the ones listed above. See bug 184991 for
-	 * background discussion.
-	 * 
-	 * <p>
-	 * This method is not intended to be overridden by subclasses.
-	 * </p>
-	 * 
-	 * @return Returns whether this viewer is busy.
-	 * 
-	 * @since 3.4
-	 */
-	public boolean isBusy() {
-		return busy;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerEditor.java
deleted file mode 100644
index 9f67161..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerEditor.java
+++ /dev/null
@@ -1,722 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - refactoring (bug 153993)
- *     											   fix in bug: 151295,178946,166500,195908,201906,207676,180504,216706,218336
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Item;
-
-/**
- * This is the base for all editor implementations of Viewers. ColumnViewer
- * implementors have to subclass this class and implement the missing methods
- *
- * @since 3.3
- * @see TableViewerEditor
- * @see TreeViewerEditor
- */
-public abstract class ColumnViewerEditor {
-	private CellEditor cellEditor;
-
-	private ICellEditorListener cellEditorListener;
-
-	private FocusListener focusListener;
-
-	private MouseListener mouseListener;
-
-	private ColumnViewer viewer;
-
-	private TraverseListener tabeditingListener;
-
-	private ViewerCell cell;
-
-	private ListenerList editorActivationListener;
-
-	private ColumnViewerEditorActivationStrategy editorActivationStrategy;
-
-	private boolean inEditorDeactivation;
-	
-	private DisposeListener disposeListener;
-
-	/**
-	 * Tabbing from cell to cell is turned off
-	 */
-	public static final int DEFAULT = 1;
-
-	/**
-	 * Should if the end of the row is reach started from the start/end of the
-	 * row below/above
-	 */
-	public static final int TABBING_MOVE_TO_ROW_NEIGHBOR = 1 << 1;
-
-	/**
-	 * Should if the end of the row is reach started from the beginning in the
-	 * same row
-	 */
-	public static final int TABBING_CYCLE_IN_ROW = 1 << 2;
-
-	/**
-	 * Support tabbing to Cell above/below the current cell
-	 */
-	public static final int TABBING_VERTICAL = 1 << 3;
-
-	/**
-	 * Should tabbing from column to column with in one row be supported
-	 */
-	public static final int TABBING_HORIZONTAL = 1 << 4;
-
-	/**
-	 * Style mask used to enable keyboard activation
-	 */
-	public static final int KEYBOARD_ACTIVATION = 1 << 5;
-
-	/**
-	 * Style mask used to turn <b>off</b> the feature that an editor activation
-	 * is canceled on double click. It is also possible to turn off this feature
-	 * per cell-editor using {@link CellEditor#getDoubleClickTimeout()}
-	 * @since 3.4
-	 */
-	public static final int KEEP_EDITOR_ON_DOUBLE_CLICK = 1 << 6;
-
-	private int feature;
-
-	/**
-	 * @param viewer
-	 *            the viewer this editor is attached to
-	 * @param editorActivationStrategy
-	 *            the strategy used to decide about editor activation
-	 * @param feature
-	 *            bit mask controlling the editor
-	 *            <ul>
-	 *            <li>{@link ColumnViewerEditor#DEFAULT}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_CYCLE_IN_ROW}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_HORIZONTAL}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_MOVE_TO_ROW_NEIGHBOR}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_VERTICAL}</li>
-	 *            </ul>
-	 */
-	protected ColumnViewerEditor(final ColumnViewer viewer,
-			ColumnViewerEditorActivationStrategy editorActivationStrategy,
-			int feature) {
-		this.viewer = viewer;
-		this.editorActivationStrategy = editorActivationStrategy;
-		if ((feature & KEYBOARD_ACTIVATION) == KEYBOARD_ACTIVATION) {
-			this.editorActivationStrategy
-					.setEnableEditorActivationWithKeyboard(true);
-		}
-		this.feature = feature;
-		this.disposeListener = new DisposeListener() {
-
-			public void widgetDisposed(DisposeEvent e) {
-				if( viewer.isCellEditorActive() ) {
-					cancelEditing();
-				}
-			}
-			
-		};
-		initCellEditorListener();
-	}
-
-	private void initCellEditorListener() {
-		cellEditorListener = new ICellEditorListener() {
-			public void editorValueChanged(boolean oldValidState,
-					boolean newValidState) {
-				// Ignore.
-			}
-
-			public void cancelEditor() {
-				ColumnViewerEditor.this.cancelEditing();
-			}
-
-			public void applyEditorValue() {
-				ColumnViewerEditor.this.applyEditorValue();
-			}
-		};
-	}
-
-	private boolean activateCellEditor(final ColumnViewerEditorActivationEvent activationEvent) {
-
-		ViewerColumn part = viewer.getViewerColumn(cell.getColumnIndex());
-		Object element = cell.getElement();
-
-		if (part != null && part.getEditingSupport() != null
-				&& part.getEditingSupport().canEdit(element)) {
-			cellEditor = part.getEditingSupport().getCellEditor(element);
-			if (cellEditor != null) {
-				int timeout = cellEditor.getDoubleClickTimeout();
-
-				final int activationTime;
-
-				if (timeout != 0) {
-					activationTime = activationEvent.time + timeout;
-				} else {
-					activationTime = 0;
-				}
-
-				if (editorActivationListener != null
-						&& !editorActivationListener.isEmpty()) {
-					Object[] ls = editorActivationListener.getListeners();
-					for (int i = 0; i < ls.length; i++) {
-						((ColumnViewerEditorActivationListener) ls[i])
-								.beforeEditorActivated(activationEvent);
-
-						// Was the activation canceled ?
-						if (activationEvent.cancel) {
-							return false;
-						}
-					}
-				}
-
-				updateFocusCell(cell, activationEvent);
-
-				cellEditor.addListener(cellEditorListener);
-				part.getEditingSupport().initializeCellEditorValue(cellEditor,
-						cell);
-
-				// Tricky flow of control here:
-				// activate() can trigger callback to cellEditorListener which
-				// will clear cellEditor
-				// so must get control first, but must still call activate()
-				// even if there is no control.
-				final Control control = cellEditor.getControl();
-				cellEditor.activate(activationEvent);
-				if (control == null) {
-					return false;
-				}
-				setLayoutData(cellEditor.getLayoutData());
-				setEditor(control, (Item) cell.getItem(), cell.getColumnIndex());
-				cellEditor.setFocus();
-
-				if (cellEditor.dependsOnExternalFocusListener()) {
-					if (focusListener == null) {
-						focusListener = new FocusAdapter() {
-							public void focusLost(FocusEvent e) {
-								applyEditorValue();
-							}
-						};
-					}
-					control.addFocusListener(focusListener);
-				}
-
-				mouseListener = new MouseAdapter() {
-					public void mouseDown(MouseEvent e) {
-						// time wrap?
-						// check for expiration of doubleClickTime
-						if (shouldFireDoubleClick(activationTime, e.time, activationEvent) && e.button == 1) {
-							control.removeMouseListener(mouseListener);
-							cancelEditing();
-							handleDoubleClickEvent();
-						} else if (mouseListener != null) {
-							control.removeMouseListener(mouseListener);
-						}
-					}
-				};
-
-				if (activationTime != 0
-						&& (feature & KEEP_EDITOR_ON_DOUBLE_CLICK) == 0) {
-					control.addMouseListener(mouseListener);
-				}
-
-				if (tabeditingListener == null) {
-					tabeditingListener = new TraverseListener() {
-
-						public void keyTraversed(TraverseEvent e) {
-							if ((feature & DEFAULT) != DEFAULT) {
-								processTraverseEvent(cell.getColumnIndex(),
-										viewer.getViewerRowFromItem(cell
-												.getItem()), e);
-							}
-						}
-					};
-				}
-
-				control.addTraverseListener(tabeditingListener);
-
-				if (editorActivationListener != null
-						&& !editorActivationListener.isEmpty()) {
-					Object[] ls = editorActivationListener.getListeners();
-					for (int i = 0; i < ls.length; i++) {
-						((ColumnViewerEditorActivationListener) ls[i])
-								.afterEditorActivated(activationEvent);
-					}
-				}
-				
-				this.cell.getItem().addDisposeListener(disposeListener);
-
-				return true;
-			}
-
-		}
-
-		return false;
-	}
-
-	private boolean shouldFireDoubleClick(int activationTime, int mouseTime,
-			ColumnViewerEditorActivationEvent activationEvent) {
-		return mouseTime <= activationTime
-				&& activationEvent.eventType != ColumnViewerEditorActivationEvent.KEY_PRESSED
-				&& activationEvent.eventType != ColumnViewerEditorActivationEvent.PROGRAMMATIC
-				&& activationEvent.eventType != ColumnViewerEditorActivationEvent.TRAVERSAL;
-	}
-
-	/**
-	 * Applies the current value and deactivates the currently active cell
-	 * editor.
-	 */
-	void applyEditorValue() {
-		// avoid re-entering
-		if (!inEditorDeactivation) {
-			try {
-				inEditorDeactivation = true;
-				CellEditor c = this.cellEditor;
-				if (c != null && this.cell != null) {
-					ColumnViewerEditorDeactivationEvent tmp = new ColumnViewerEditorDeactivationEvent(
-							cell);
-					tmp.eventType = ColumnViewerEditorDeactivationEvent.EDITOR_SAVED;
-					if (editorActivationListener != null
-							&& !editorActivationListener.isEmpty()) {
-						Object[] ls = editorActivationListener.getListeners();
-						for (int i = 0; i < ls.length; i++) {
-
-							((ColumnViewerEditorActivationListener) ls[i])
-									.beforeEditorDeactivated(tmp);
-						}
-					}
-
-					Item t = (Item) this.cell.getItem();
-
-					// don't null out table item -- same item is still selected
-					if (t != null && !t.isDisposed()) {
-						saveEditorValue(c);
-					}
-					if (!viewer.getControl().isDisposed()) {
-						setEditor(null, null, 0);
-					}
-
-					c.removeListener(cellEditorListener);
-					Control control = c.getControl();
-					if (control != null && !control.isDisposed()) {
-						if (mouseListener != null) {
-							control.removeMouseListener(mouseListener);
-							// Clear the instance not needed any more
-							mouseListener = null;
-						}
-						if (focusListener != null) {
-							control.removeFocusListener(focusListener);
-						}
-
-						if (tabeditingListener != null) {
-							control.removeTraverseListener(tabeditingListener);
-						}
-					}
-					c.deactivate(tmp);
-
-					if (editorActivationListener != null
-							&& !editorActivationListener.isEmpty()) {
-						Object[] ls = editorActivationListener.getListeners();
-						for (int i = 0; i < ls.length; i++) {
-							((ColumnViewerEditorActivationListener) ls[i])
-									.afterEditorDeactivated(tmp);
-						}
-					}
-					
-					if( ! this.cell.getItem().isDisposed() ) {
-						this.cell.getItem().removeDisposeListener(disposeListener);
-					}
-				}
-
-				this.cellEditor = null;
-				this.cell = null;
-			} finally {
-				inEditorDeactivation = false;
-			}
-		}
-	}
-
-	/**
-	 * Cancel editing
-	 */
-	void cancelEditing() {
-		// avoid re-entering
-		if (!inEditorDeactivation) {
-			try {
-				inEditorDeactivation = true;
-				if (cellEditor != null) {
-					ColumnViewerEditorDeactivationEvent tmp = new ColumnViewerEditorDeactivationEvent(
-							cell);
-					tmp.eventType = ColumnViewerEditorDeactivationEvent.EDITOR_CANCELED;
-					if (editorActivationListener != null
-							&& !editorActivationListener.isEmpty()) {
-						Object[] ls = editorActivationListener.getListeners();
-						for (int i = 0; i < ls.length; i++) {
-
-							((ColumnViewerEditorActivationListener) ls[i])
-									.beforeEditorDeactivated(tmp);
-						}
-					}
-
-					if (!viewer.getControl().isDisposed()) {
-						setEditor(null, null, 0);
-					}
-
-					cellEditor.removeListener(cellEditorListener);
-
-					Control control = cellEditor.getControl();
-					if (control != null && !viewer.getControl().isDisposed()) {
-						if (mouseListener != null) {
-							control.removeMouseListener(mouseListener);
-							// Clear the instance not needed any more
-							mouseListener = null;
-						}
-						if (focusListener != null) {
-							control.removeFocusListener(focusListener);
-						}
-
-						if (tabeditingListener != null) {
-							control.removeTraverseListener(tabeditingListener);
-						}
-					}
-
-					CellEditor oldEditor = cellEditor;
-					oldEditor.deactivate(tmp);
-
-					if (editorActivationListener != null
-							&& !editorActivationListener.isEmpty()) {
-						Object[] ls = editorActivationListener.getListeners();
-						for (int i = 0; i < ls.length; i++) {
-							((ColumnViewerEditorActivationListener) ls[i])
-									.afterEditorDeactivated(tmp);
-						}
-					}
-					
-					if( ! this.cell.getItem().isDisposed() ) {
-						this.cell.getItem().addDisposeListener(disposeListener);
-					}
-					
-					this.cellEditor = null;
-					this.cell = null;
-
-				}
-			} finally {
-				inEditorDeactivation = false;
-			}
-		}
-	}
-
-	/**
-	 * Enable the editor by mouse down
-	 *
-	 * @param event
-	 */
-	void handleEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
-
-		// Only activate if the event isn't tagged as canceled
-		if (!event.cancel
-				&& editorActivationStrategy.isEditorActivationEvent(event)) {
-			if (cellEditor != null) {
-				applyEditorValue();
-			}
-
-			this.cell = (ViewerCell) event.getSource();
-
-			if( ! activateCellEditor(event) ) {
-				this.cell = null;
-				this.cellEditor = null;
-			}
-		}
-	}
-
-	private void saveEditorValue(CellEditor cellEditor) {
-		ViewerColumn part = viewer.getViewerColumn(cell.getColumnIndex());
-
-		if (part != null && part.getEditingSupport() != null) {
-			part.getEditingSupport().saveCellEditorValue(cellEditor, cell);
-		}
-	}
-
-	/**
-	 * Return whether there is an active cell editor.
-	 *
-	 * @return <code>true</code> if there is an active cell editor; otherwise
-	 *         <code>false</code> is returned.
-	 */
-	boolean isCellEditorActive() {
-		return cellEditor != null;
-	}
-
-	void handleDoubleClickEvent() {
-		viewer.fireDoubleClick(new DoubleClickEvent(viewer, viewer
-				.getSelection()));
-		viewer.fireOpen(new OpenEvent(viewer, viewer.getSelection()));
-	}
-
-	/**
-	 * Adds the given listener, it is to be notified when the cell editor is
-	 * activated or deactivated.
-	 *
-	 * @param listener
-	 *            the listener to add
-	 */
-	public void addEditorActivationListener(
-			ColumnViewerEditorActivationListener listener) {
-		if (editorActivationListener == null) {
-			editorActivationListener = new ListenerList();
-		}
-		editorActivationListener.add(listener);
-	}
-
-	/**
-	 * Removes the given listener.
-	 *
-	 * @param listener
-	 *            the listener to remove
-	 */
-	public void removeEditorActivationListener(
-			ColumnViewerEditorActivationListener listener) {
-		if (editorActivationListener != null) {
-			editorActivationListener.remove(listener);
-		}
-	}
-
-	/**
-	 * Process the traverse event and opens the next available editor depending
-	 * of the implemented strategy. The default implementation uses the style
-	 * constants
-	 * <ul>
-	 * <li>{@link ColumnViewerEditor#TABBING_MOVE_TO_ROW_NEIGHBOR}</li>
-	 * <li>{@link ColumnViewerEditor#TABBING_CYCLE_IN_ROW}</li>
-	 * <li>{@link ColumnViewerEditor#TABBING_VERTICAL}</li>
-	 * <li>{@link ColumnViewerEditor#TABBING_HORIZONTAL}</li>
-	 * </ul>
-	 *
-	 * <p>
-	 * Subclasses may overwrite to implement their custom logic to edit the next
-	 * cell
-	 * </p>
-	 *
-	 * @param columnIndex
-	 *            the index of the current column
-	 * @param row
-	 *            the current row - may only be used for the duration of this
-	 *            method call
-	 * @param event
-	 *            the traverse event
-	 */
-	protected void processTraverseEvent(int columnIndex, ViewerRow row,
-			TraverseEvent event) {
-
-		ViewerCell cell2edit = null;
-
-		if (event.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
-			event.doit = false;
-
-			if ((event.stateMask & SWT.CTRL) == SWT.CTRL
-					&& (feature & TABBING_VERTICAL) == TABBING_VERTICAL) {
-				cell2edit = searchCellAboveBelow(row, viewer, columnIndex, true);
-			} else if ((feature & TABBING_HORIZONTAL) == TABBING_HORIZONTAL) {
-				cell2edit = searchPreviousCell(row, row.getCell(columnIndex),
-						row.getCell(columnIndex), viewer);
-			}
-		} else if (event.detail == SWT.TRAVERSE_TAB_NEXT) {
-			event.doit = false;
-
-			if ((event.stateMask & SWT.CTRL) == SWT.CTRL
-					&& (feature & TABBING_VERTICAL) == TABBING_VERTICAL) {
-				cell2edit = searchCellAboveBelow(row, viewer, columnIndex,
-						false);
-			} else if ((feature & TABBING_HORIZONTAL) == TABBING_HORIZONTAL) {
-				cell2edit = searchNextCell(row, row.getCell(columnIndex), row
-						.getCell(columnIndex), viewer);
-			}
-		}
-
-		if (cell2edit != null) {
-
-			viewer.getControl().setRedraw(false);
-			ColumnViewerEditorActivationEvent acEvent = new ColumnViewerEditorActivationEvent(
-					cell2edit, event);
-			viewer.triggerEditorActivationEvent(acEvent);
-			viewer.getControl().setRedraw(true);
-		}
-	}
-
-	private ViewerCell searchCellAboveBelow(ViewerRow row, ColumnViewer viewer,
-			int columnIndex, boolean above) {
-		ViewerCell rv = null;
-
-		ViewerRow newRow = null;
-
-		if (above) {
-			newRow = row.getNeighbor(ViewerRow.ABOVE, false);
-		} else {
-			newRow = row.getNeighbor(ViewerRow.BELOW, false);
-		}
-
-		if (newRow != null) {
-			ViewerColumn column = viewer.getViewerColumn(columnIndex);
-			if (column != null
-					&& column.getEditingSupport() != null
-					&& column.getEditingSupport().canEdit(
-							newRow.getItem().getData())) {
-				rv = newRow.getCell(columnIndex);
-			} else {
-				rv = searchCellAboveBelow(newRow, viewer, columnIndex, above);
-			}
-		}
-
-		return rv;
-	}
-
-	private boolean isCellEditable(ColumnViewer viewer, ViewerCell cell) {
-		ViewerColumn column = viewer.getViewerColumn(cell.getColumnIndex());
-		return column != null && column.getEditingSupport() != null
-				&& column.getEditingSupport().canEdit(cell.getElement());
-	}
-
-	private ViewerCell searchPreviousCell(ViewerRow row,
-			ViewerCell currentCell, ViewerCell originalCell, ColumnViewer viewer) {
-		ViewerCell rv = null;
-		ViewerCell previousCell;
-
-		if (currentCell != null) {
-			previousCell = currentCell.getNeighbor(ViewerCell.LEFT, true);
-		} else {
-			if (row.getColumnCount() != 0) {
-				previousCell = row.getCell(row.getCreationIndex(row
-						.getColumnCount() - 1));
-			} else {
-				previousCell = row.getCell(0);
-			}
-
-		}
-
-		// No endless loop
-		if (originalCell.equals(previousCell)) {
-			return null;
-		}
-
-		if (previousCell != null) {
-			if (isCellEditable(viewer, previousCell)) {
-				rv = previousCell;
-			} else {
-				rv = searchPreviousCell(row, previousCell, originalCell, viewer);
-			}
-		} else {
-			if ((feature & TABBING_CYCLE_IN_ROW) == TABBING_CYCLE_IN_ROW) {
-				rv = searchPreviousCell(row, null, originalCell, viewer);
-			} else if ((feature & TABBING_MOVE_TO_ROW_NEIGHBOR) == TABBING_MOVE_TO_ROW_NEIGHBOR) {
-				ViewerRow rowAbove = row.getNeighbor(ViewerRow.ABOVE, false);
-				if (rowAbove != null) {
-					rv = searchPreviousCell(rowAbove, null, originalCell,
-							viewer);
-				}
-			}
-		}
-
-		return rv;
-	}
-
-	private ViewerCell searchNextCell(ViewerRow row, ViewerCell currentCell,
-			ViewerCell originalCell, ColumnViewer viewer) {
-		ViewerCell rv = null;
-
-		ViewerCell nextCell;
-
-		if (currentCell != null) {
-			nextCell = currentCell.getNeighbor(ViewerCell.RIGHT, true);
-		} else {
-			nextCell = row.getCell(row.getCreationIndex(0));
-		}
-
-		// No endless loop
-		if (originalCell.equals(nextCell)) {
-			return null;
-		}
-
-		if (nextCell != null) {
-			if (isCellEditable(viewer, nextCell)) {
-				rv = nextCell;
-			} else {
-				rv = searchNextCell(row, nextCell, originalCell, viewer);
-			}
-		} else {
-			if ((feature & TABBING_CYCLE_IN_ROW) == TABBING_CYCLE_IN_ROW) {
-				rv = searchNextCell(row, null, originalCell, viewer);
-			} else if ((feature & TABBING_MOVE_TO_ROW_NEIGHBOR) == TABBING_MOVE_TO_ROW_NEIGHBOR) {
-				ViewerRow rowBelow = row.getNeighbor(ViewerRow.BELOW, false);
-				if (rowBelow != null) {
-					rv = searchNextCell(rowBelow, null, originalCell, viewer);
-				}
-			}
-		}
-
-		return rv;
-	}
-
-	/**
-	 * Position the editor inside the control
-	 *
-	 * @param w
-	 *            the editor control
-	 * @param item
-	 *            the item (row) in which the editor is drawn in
-	 * @param fColumnNumber
-	 *            the column number in which the editor is shown
-	 */
-	protected abstract void setEditor(Control w, Item item, int fColumnNumber);
-
-	/**
-	 * set the layout data for the editor
-	 *
-	 * @param layoutData
-	 *            the layout data used when editor is displayed
-	 */
-	protected abstract void setLayoutData(CellEditor.LayoutData layoutData);
-
-	/**
-	 * @param focusCell
-	 *            updates the cell with the current input focus
-	 * @param event
-	 *            the event requesting to update the focusCell
-	 */
-	protected abstract void updateFocusCell(ViewerCell focusCell,
-			ColumnViewerEditorActivationEvent event);
-
-	/**
-	 * @return the cell currently holding the focus if no cell has the focus or
-	 *         the viewer implementation doesn't support <code>null</code> is
-	 *         returned
-	 *
-	 */
-	public ViewerCell getFocusCell() {
-		return null;
-	}
-
-	/**
-	 * @return the viewer working for
-	 */
-	protected ColumnViewer getViewer() {
-		return viewer;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorActivationEvent.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorActivationEvent.java
deleted file mode 100644
index d951645..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorActivationEvent.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.EventObject;
-
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.TraverseEvent;
-
-/**
- * This event is passed on when a cell-editor is going to be activated
- * 
- * @since 3.3
- * 
- */
-public class ColumnViewerEditorActivationEvent extends EventObject {
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * if a key is pressed on a selected cell
-	 */
-	public static final int KEY_PRESSED = 1;
-
-	/**
-	 * if a cell is selected using a single click of the mouse
-	 */
-	public static final int MOUSE_CLICK_SELECTION = 2;
-
-	/**
-	 * if a cell is selected using double clicking of the mouse
-	 */
-	public static final int MOUSE_DOUBLE_CLICK_SELECTION = 3;
-
-	/**
-	 * if a cell is activated using code like e.g
-	 * {@link ColumnViewer#editElement(Object, int)}
-	 */
-	public static final int PROGRAMMATIC = 4;
-
-	/**
-	 * is a cell is activated by traversing
-	 */
-	public static final int TRAVERSAL = 5;
-
-	/**
-	 * the original event triggered
-	 */
-	public EventObject sourceEvent;
-
-	/**
-	 * The time the event is triggered
-	 */
-	public int time;
-
-	/**
-	 * The event type triggered:
-	 * <ul>
-	 * <li>{@link #KEY_PRESSED} if a key is pressed on a selected cell</li>
-	 * <li>{@link #MOUSE_CLICK_SELECTION} if a cell is selected using a single
-	 * click of the mouse</li>
-	 * <li>{@link #MOUSE_DOUBLE_CLICK_SELECTION} if a cell is selected using
-	 * double clicking of the mouse</li>
-	 * </ul>
-	 */
-	public int eventType;
-
-	/**
-	 * <b>Only set for {@link #KEY_PRESSED}</b>
-	 */
-	public int keyCode;
-
-	/**
-	 * <b>Only set for {@link #KEY_PRESSED}</b>
-	 */
-	public char character;
-
-	/**
-	 * The statemask
-	 */
-	public int stateMask;
-
-	/**
-	 * Cancel the event (=> editor is not activated)
-	 */
-	public boolean cancel = false;
-	
-	/**
-	 * This constructor can be used when no event exists. The type set is
-	 * {@link #PROGRAMMATIC}
-	 * 
-	 * @param cell
-	 *            the cell
-	 */
-	public ColumnViewerEditorActivationEvent(ViewerCell cell) {
-		super(cell);
-		eventType = PROGRAMMATIC;
-	}
-
-	/**
-	 * This constructor is used for all types of mouse events. Currently the
-	 * type is can be {@link #MOUSE_CLICK_SELECTION} and
-	 * {@link #MOUSE_DOUBLE_CLICK_SELECTION}
-	 * 
-	 * @param cell
-	 *            the cell source of the event
-	 * @param event
-	 *            the event
-	 */
-	public ColumnViewerEditorActivationEvent(ViewerCell cell, MouseEvent event) {
-		super(cell);
-
-		if (event.count >= 2) {
-			eventType = MOUSE_DOUBLE_CLICK_SELECTION;
-		} else {
-			eventType = MOUSE_CLICK_SELECTION;
-		}
-
-		this.sourceEvent = event;
-		this.time = event.time;
-	}
-
-	/**
-	 * @param cell
-	 *            the cell source of the event
-	 * @param event
-	 *            the event
-	 */
-	public ColumnViewerEditorActivationEvent(ViewerCell cell, KeyEvent event) {
-		super(cell);
-		this.eventType = KEY_PRESSED;
-		this.sourceEvent = event;
-		this.time = event.time;
-		this.keyCode = event.keyCode;
-		this.character = event.character;
-		this.stateMask = event.stateMask;
-	}
-
-	/**
-	 * This constructor is used to mark the activation triggered by a traversal
-	 * 
-	 * @param cell
-	 *            the cell source of the event
-	 * @param event
-	 *            the event
-	 */
-	public ColumnViewerEditorActivationEvent(ViewerCell cell, TraverseEvent event) {
-		super(cell);
-		this.eventType = TRAVERSAL;
-		this.sourceEvent = event;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorActivationListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorActivationListener.java
deleted file mode 100644
index 3f531ae..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorActivationListener.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-/**
- * Parties interested in activation and deactivation of editors extend this
- * class and implement any or all of the methods
- * 
- * @since 3.3
- * 
- */
-public abstract class ColumnViewerEditorActivationListener {
-	/**
-	 * Called before an editor is activated
-	 * 
-	 * @param event
-	 *            the event
-	 */
-	public abstract void beforeEditorActivated(ColumnViewerEditorActivationEvent event);
-
-	/**
-	 * Called after an editor has been activated
-	 * 
-	 * @param event the event
-	 */
-	public abstract void afterEditorActivated(ColumnViewerEditorActivationEvent event);
-
-	/**
-	 * Called before an editor is deactivated
-	 * 
-	 * @param event
-	 *            the event
-	 */
-	public abstract void beforeEditorDeactivated(ColumnViewerEditorDeactivationEvent event);
-
-	
-	/**
-	 * Called after an editor is deactivated
-	 * 
-	 * @param event the event
-	 */
-	public abstract void afterEditorDeactivated(ColumnViewerEditorDeactivationEvent event);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorActivationStrategy.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorActivationStrategy.java
deleted file mode 100644
index ce432e2..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorActivationStrategy.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *     											 - fix for bug 187817
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.MouseEvent;
-
-/**
- * This class is responsible to determine if a cell selection event is triggers
- * an editor activation. Implementors can extend and overwrite to implement
- * custom editing behavior
- *
- * @since 3.3
- */
-public class ColumnViewerEditorActivationStrategy {
-	private ColumnViewer viewer;
-
-	private KeyListener keyboardActivationListener;
-
-	/**
-	 * @param viewer
-	 *            the viewer the editor support is attached to
-	 */
-	public ColumnViewerEditorActivationStrategy(ColumnViewer viewer) {
-		this.viewer = viewer;
-	}
-
-	/**
-	 * @param event
-	 *            the event triggering the action
-	 * @return <code>true</code> if this event should open the editor
-	 */
-	protected boolean isEditorActivationEvent(
-			ColumnViewerEditorActivationEvent event) {
-		boolean singleSelect = ((IStructuredSelection)viewer.getSelection()).size() == 1;
-		boolean isLeftMouseSelect = event.eventType == ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION && ((MouseEvent)event.sourceEvent).button == 1;
-
-		return singleSelect && (isLeftMouseSelect
-				|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC
-				|| event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL);
-	}
-
-	/**
-	 * @return the cell holding the current focus
-	 */
-	private ViewerCell getFocusCell() {
-		return viewer.getColumnViewerEditor().getFocusCell();
-	}
-
-	/**
-	 * @return the viewer
-	 */
-	public ColumnViewer getViewer() {
-		return viewer;
-	}
-
-	/**
-	 * Enable activation of cell editors by keyboard
-	 *
-	 * @param enable
-	 *            <code>true</code> to enable
-	 */
-	public void setEnableEditorActivationWithKeyboard(boolean enable) {
-		if (enable) {
-			if (keyboardActivationListener == null) {
-				keyboardActivationListener = new KeyListener() {
-
-					public void keyPressed(KeyEvent e) {
-						ViewerCell cell = getFocusCell();
-
-						if (cell != null) {
-							viewer
-									.triggerEditorActivationEvent(new ColumnViewerEditorActivationEvent(
-											cell, e));
-						}
-					}
-
-					public void keyReleased(KeyEvent e) {
-
-					}
-
-				};
-				viewer.getControl().addKeyListener(keyboardActivationListener);
-			}
-		} else {
-			if (keyboardActivationListener != null) {
-				viewer.getControl().removeKeyListener(
-						keyboardActivationListener);
-				keyboardActivationListener = null;
-			}
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorDeactivationEvent.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorDeactivationEvent.java
deleted file mode 100644
index 3ed0168..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorDeactivationEvent.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *                                                 fixes in bug: 178946
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.EventObject;
-
-/**
- * This event is fired when an editor deactivated
- *
- * @since 3.3
- * @noextend This class is not intended to be subclassed by clients.
- *
- */
-public class ColumnViewerEditorDeactivationEvent extends EventObject {
-
-	/**
-	 *
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The event type
-	 * @since 3.4
-	 */
-	public int eventType;
-
-	/**
-	 * Event when editor is canceled
-	 * @since 3.4
-	 */
-	public static final int EDITOR_CANCELED = 1;
-
-	/**
-	 * Event when editor is saved
-	 * @since 3.4
-	 */
-	public static final int EDITOR_SAVED = 2;
-
-	/**
-	 * @param source
-	 */
-	public ColumnViewerEditorDeactivationEvent(Object source) {
-		super(source);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerToolTipSupport.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerToolTipSupport.java
deleted file mode 100644
index 524edbd..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewerToolTipSupport.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *                                                 bugfix in: 195137, 198089
- *     Fredy Dobler <fredy@dobler.net> - bug 159600
- *     Brock Janiczak <brockj@tpg.com.au> - bug 182443
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.jface.util.Policy;
-import org.eclipse.jface.window.DefaultToolTip;
-import org.eclipse.jface.window.ToolTip;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-
-/**
- * The ColumnViewerTooltipSupport is the class that provides tool tips for
- * ColumnViewers.
- *
- * @since 3.3
- *
- */
-public class ColumnViewerToolTipSupport extends DefaultToolTip {
-	private ColumnViewer viewer;
-
-	private static final String VIEWER_CELL_KEY = Policy.JFACE
-			+ "_VIEWER_CELL_KEY"; //$NON-NLS-1$
-
-	private static final int DEFAULT_SHIFT_X = 10;
-
-	private static final int DEFAULT_SHIFT_Y = 0;
-
-	/**
-	 * Enable ToolTip support for the viewer by creating an instance from this
-	 * class. To get all necessary informations this support class consults the
-	 * {@link CellLabelProvider}.
-	 *
-	 * @param viewer
-	 *            the viewer the support is attached to
-	 * @param style
-	 *            style passed to control tool tip behavior
-	 *
-	 * @param manualActivation
-	 *            <code>true</code> if the activation is done manually using
-	 *            {@link #show(Point)}
-	 */
-	protected ColumnViewerToolTipSupport(ColumnViewer viewer, int style,
-			boolean manualActivation) {
-		super(viewer.getControl(), style, manualActivation);
-		this.viewer = viewer;
-	}
-
-	/**
-	 * Enable ToolTip support for the viewer by creating an instance from this
-	 * class. To get all necessary informations this support class consults the
-	 * {@link CellLabelProvider}.
-	 *
-	 * @param viewer
-	 *            the viewer the support is attached to
-	 */
-	public static void enableFor(ColumnViewer viewer) {
-		new ColumnViewerToolTipSupport(viewer, ToolTip.NO_RECREATE, false);
-	}
-
-	/**
-	 * Enable ToolTip support for the viewer by creating an instance from this
-	 * class. To get all necessary informations this support class consults the
-	 * {@link CellLabelProvider}.
-	 *
-	 * @param viewer
-	 *            the viewer the support is attached to
-	 * @param style
-	 *            style passed to control tool tip behavior
-	 *
-	 * @see ToolTip#RECREATE
-	 * @see ToolTip#NO_RECREATE
-	 */
-	public static void enableFor(ColumnViewer viewer, int style) {
-		new ColumnViewerToolTipSupport(viewer, style, false);
-	}
-
-	protected Object getToolTipArea(Event event) {
-		return viewer.getCell(new Point(event.x, event.y));
-	}
-
-	/**
-	 * Instead of overwriting this method subclasses should overwrite
-	 * {@link #createViewerToolTipContentArea(Event, ViewerCell, Composite)}
-	 */
-	protected Composite createToolTipContentArea(Event event, Composite parent) {
-		ViewerCell cell = (ViewerCell) getData(VIEWER_CELL_KEY);
-		setData(VIEWER_CELL_KEY, null);
-
-		return createViewerToolTipContentArea(event, cell, parent);
-	}
-
-	/**
-	 * Creates the content area of the tool tip giving access to the cell the
-	 * tip is shown for. Subclasses can overload this method to implement their
-	 * own tool tip design.
-	 *
-	 * <p>
-	 * This method is called from
-	 * {@link #createToolTipContentArea(Event, Composite)} and by default calls
-	 * the {@link DefaultToolTip#createToolTipContentArea(Event, Composite)}.
-	 * </p>
-	 *
-	 * @param event
-	 *            the event that which
-	 * @param cell
-	 *            the cell the tool tip is shown for
-	 * @param parent
-	 *            the parent of the control to create
-	 * @return the control to be displayed in the tool tip area
-	 * @since 3.4
-	 */
-	protected Composite createViewerToolTipContentArea(Event event,
-			ViewerCell cell, Composite parent) {
-		return super.createToolTipContentArea(event, parent);
-	}
-
-	protected boolean shouldCreateToolTip(Event event) {
-		if (!super.shouldCreateToolTip(event)) {
-			return false;
-		}
-
-		boolean rv = false;
-
-		ViewerRow row = viewer.getViewerRow(new Point(event.x, event.y));
-
-		viewer.getControl().setToolTipText(""); //$NON-NLS-1$
-		Point point = new Point(event.x, event.y);
-
-		if (row != null) {
-			Object element = row.getItem().getData();
-
-			ViewerCell cell = row.getCell(point);
-			ViewerColumn viewPart = viewer.getViewerColumn(cell
-					.getColumnIndex());
-
-			if (viewPart == null) {
-				return false;
-			}
-
-			CellLabelProvider labelProvider = viewPart.getLabelProvider();
-			boolean useNative = labelProvider.useNativeToolTip(element);
-
-			String text = labelProvider.getToolTipText(element);
-			Image img = null;
-
-			if (!useNative) {
-				img = labelProvider.getToolTipImage(element);
-			}
-
-			if (useNative || (text == null && img == null)) {
-				viewer.getControl().setToolTipText(text);
-				rv = false;
-			} else {
-				setPopupDelay(labelProvider.getToolTipDisplayDelayTime(element));
-				setHideDelay(labelProvider.getToolTipTimeDisplayed(element));
-
-				Point shift = labelProvider.getToolTipShift(element);
-
-				if (shift == null) {
-					setShift(new Point(DEFAULT_SHIFT_X, DEFAULT_SHIFT_Y));
-				} else {
-					setShift(new Point(shift.x, shift.y));
-				}
-
-				setData(VIEWER_CELL_KEY, cell);
-
-				setText(text);
-				setImage(img);
-				setStyle(labelProvider.getToolTipStyle(element));
-				setForegroundColor(labelProvider
-						.getToolTipForegroundColor(element));
-				setBackgroundColor(labelProvider
-						.getToolTipBackgroundColor(element));
-				setFont(labelProvider.getToolTipFont(element));
-
-				// Check if at least one of the values is set
-				rv = getText(event) != null || getImage(event) != null;
-			}
-		}
-
-		return rv;
-	}
-
-	protected void afterHideToolTip(Event event) {
-		super.afterHideToolTip(event);
-		// Clear the restored value else this could be a source of a leak
-		setData(VIEWER_CELL_KEY, null);
-		if (event != null && event.widget != viewer.getControl()) {
-			viewer.getControl().setFocus();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnWeightData.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnWeightData.java
deleted file mode 100644
index aa112e4..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnWeightData.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * Describes the width of a table column in terms of a weight, 
- * a minimum width, and whether the column is resizable.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ColumnWeightData extends ColumnLayoutData {
-
-    /** 
-     * Default width of a column (in pixels).
-     */
-    public static final int MINIMUM_WIDTH = 20;
-
-    /**
-     * The column's minimum width in pixels.
-     */
-    public int minimumWidth;
-
-    /**
-     * The column's weight.
-     */
-    public int weight;
-
-    /**
-     * Creates a resizable column width with the given weight and a default
-     * minimum width.
-     *
-     * @param weight the weight of the column
-     */
-    public ColumnWeightData(int weight) {
-        this(weight, true);
-    }
-
-    /**
-     * Creates a resizable column width with the given weight and minimum width.
-     *
-     * @param weight the weight of the column
-     * @param minimumWidth the minimum width of the column in pixels
-     */
-    public ColumnWeightData(int weight, int minimumWidth) {
-        this(weight, minimumWidth, true);
-    }
-
-    /**
-     * Creates a column width with the given weight and minimum width.
-     *
-     * @param weight the weight of the column
-     * @param minimumWidth the minimum width of the column in pixels
-     * @param resizable <code>true</code> if the column is resizable,
-     *   and <code>false</code> if size of the column is fixed
-     */
-    public ColumnWeightData(int weight, int minimumWidth, boolean resizable) {
-        super(resizable);
-        Assert.isTrue(weight >= 0);
-        Assert.isTrue(minimumWidth >= 0);
-        this.weight = weight;
-        this.minimumWidth = minimumWidth;
-    }
-
-    /**
-     * Creates a column width with the given weight and a default
-     * minimum width.
-     *
-     * @param weight the weight of the column
-     * @param resizable <code>true</code> if the column is resizable,
-     *   and <code>false</code> if size of the column is fixed
-     */
-    public ColumnWeightData(int weight, boolean resizable) {
-        this(weight, MINIMUM_WIDTH, resizable);
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ComboBoxCellEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ComboBoxCellEditor.java
deleted file mode 100644
index 11c6136..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ComboBoxCellEditor.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - bugfix in 174739
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.text.MessageFormat; // Not using ICU to support standalone JFace
-// scenario
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-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.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A cell editor that presents a list of items in a combo box. The cell editor's
- * value is the zero-based index of the selected item.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ComboBoxCellEditor extends AbstractComboBoxCellEditor {
-
-	/**
-	 * The list of items to present in the combo box.
-	 */
-	private String[] items;
-
-	/**
-	 * The zero-based index of the selected item.
-	 */
-	int selection;
-
-	/**
-	 * The custom combo box control.
-	 */
-	CCombo comboBox;
-
-	/**
-	 * Default ComboBoxCellEditor style
-	 */
-	private static final int defaultStyle = SWT.NONE;
-
-	/**
-	 * Creates a new cell editor with no control and no st of choices.
-	 * Initially, the cell editor has no cell validator.
-	 *
-	 * @since 2.1
-	 * @see CellEditor#setStyle
-	 * @see CellEditor#create
-	 * @see ComboBoxCellEditor#setItems
-	 * @see CellEditor#dispose
-	 */
-	public ComboBoxCellEditor() {
-		setStyle(defaultStyle);
-	}
-
-	/**
-	 * Creates a new cell editor with a combo containing the given list of
-	 * choices and parented under the given control. The cell editor value is
-	 * the zero-based index of the selected item. Initially, the cell editor has
-	 * no cell validator and the first item in the list is selected.
-	 *
-	 * @param parent
-	 *            the parent control
-	 * @param items
-	 *            the list of strings for the combo box
-	 */
-	public ComboBoxCellEditor(Composite parent, String[] items) {
-		this(parent, items, defaultStyle);
-	}
-
-	/**
-	 * Creates a new cell editor with a combo containing the given list of
-	 * choices and parented under the given control. The cell editor value is
-	 * the zero-based index of the selected item. Initially, the cell editor has
-	 * no cell validator and the first item in the list is selected.
-	 *
-	 * @param parent
-	 *            the parent control
-	 * @param items
-	 *            the list of strings for the combo box
-	 * @param style
-	 *            the style bits
-	 * @since 2.1
-	 */
-	public ComboBoxCellEditor(Composite parent, String[] items, int style) {
-		super(parent, style);
-		setItems(items);
-	}
-
-	/**
-	 * Returns the list of choices for the combo box
-	 *
-	 * @return the list of choices for the combo box
-	 */
-	public String[] getItems() {
-		return this.items;
-	}
-
-	/**
-	 * Sets the list of choices for the combo box
-	 *
-	 * @param items
-	 *            the list of choices for the combo box
-	 */
-	public void setItems(String[] items) {
-		Assert.isNotNull(items);
-		this.items = items;
-		populateComboBoxItems();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected Control createControl(Composite parent) {
-
-		comboBox = new CCombo(parent, getStyle());
-		comboBox.setFont(parent.getFont());
-
-		populateComboBoxItems();
-
-		comboBox.addKeyListener(new KeyAdapter() {
-			// hook key pressed - see PR 14201
-			public void keyPressed(KeyEvent e) {
-				keyReleaseOccured(e);
-			}
-		});
-
-		comboBox.addSelectionListener(new SelectionAdapter() {
-			public void widgetDefaultSelected(SelectionEvent event) {
-				applyEditorValueAndDeactivate();
-			}
-
-			public void widgetSelected(SelectionEvent event) {
-				selection = comboBox.getSelectionIndex();
-			}
-		});
-
-		comboBox.addTraverseListener(new TraverseListener() {
-			public void keyTraversed(TraverseEvent e) {
-				if (e.detail == SWT.TRAVERSE_ESCAPE
-						|| e.detail == SWT.TRAVERSE_RETURN) {
-					e.doit = false;
-				}
-			}
-		});
-
-		comboBox.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				ComboBoxCellEditor.this.focusLost();
-			}
-		});
-		return comboBox;
-	}
-
-	/**
-	 * The <code>ComboBoxCellEditor</code> implementation of this
-	 * <code>CellEditor</code> framework method returns the zero-based index
-	 * of the current selection.
-	 *
-	 * @return the zero-based index of the current selection wrapped as an
-	 *         <code>Integer</code>
-	 */
-	protected Object doGetValue() {
-		return new Integer(selection);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected void doSetFocus() {
-		comboBox.setFocus();
-	}
-
-	/**
-	 * The <code>ComboBoxCellEditor</code> implementation of this
-	 * <code>CellEditor</code> framework method sets the minimum width of the
-	 * cell. The minimum width is 10 characters if <code>comboBox</code> is
-	 * not <code>null</code> or <code>disposed</code> else it is 60 pixels
-	 * to make sure the arrow button and some text is visible. The list of
-	 * CCombo will be wide enough to show its longest item.
-	 */
-	public LayoutData getLayoutData() {
-		LayoutData layoutData = super.getLayoutData();
-		if ((comboBox == null) || comboBox.isDisposed()) {
-			layoutData.minimumWidth = 60;
-		} else {
-			// make the comboBox 10 characters wide
-			GC gc = new GC(comboBox);
-			layoutData.minimumWidth = (gc.getFontMetrics()
-					.getAverageCharWidth() * 10) + 10;
-			gc.dispose();
-		}
-		return layoutData;
-	}
-
-	/**
-	 * The <code>ComboBoxCellEditor</code> implementation of this
-	 * <code>CellEditor</code> framework method accepts a zero-based index of
-	 * a selection.
-	 *
-	 * @param value
-	 *            the zero-based index of the selection wrapped as an
-	 *            <code>Integer</code>
-	 */
-	protected void doSetValue(Object value) {
-		Assert.isTrue(comboBox != null && (value instanceof Integer));
-		selection = ((Integer) value).intValue();
-		comboBox.select(selection);
-	}
-
-	/**
-	 * Updates the list of choices for the combo box for the current control.
-	 */
-	private void populateComboBoxItems() {
-		if (comboBox != null && items != null) {
-			comboBox.removeAll();
-			for (int i = 0; i < items.length; i++) {
-				comboBox.add(items[i], i);
-			}
-
-			setValueValid(true);
-			selection = 0;
-		}
-	}
-
-	/**
-	 * Applies the currently selected value and deactivates the cell editor
-	 */
-	void applyEditorValueAndDeactivate() {
-		// must set the selection before getting value
-		selection = comboBox.getSelectionIndex();
-		Object newValue = doGetValue();
-		markDirty();
-		boolean isValid = isCorrect(newValue);
-		setValueValid(isValid);
-
-		if (!isValid) {
-			// Only format if the 'index' is valid
-			if (items.length > 0 && selection >= 0 && selection < items.length) {
-				// try to insert the current value into the error message.
-				setErrorMessage(MessageFormat.format(getErrorMessage(),
-						new Object[] { items[selection] }));
-			} else {
-				// Since we don't have a valid index, assume we're using an
-				// 'edit'
-				// combo so format using its text value
-				setErrorMessage(MessageFormat.format(getErrorMessage(),
-						new Object[] { comboBox.getText() }));
-			}
-		}
-
-		fireApplyEditorValue();
-		deactivate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.CellEditor#focusLost()
-	 */
-	protected void focusLost() {
-		if (isActivated()) {
-			applyEditorValueAndDeactivate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.CellEditor#keyReleaseOccured(org.eclipse.swt.events.KeyEvent)
-	 */
-	protected void keyReleaseOccured(KeyEvent keyEvent) {
-		if (keyEvent.character == '\u001b') { // Escape character
-			fireCancelEditor();
-		} else if (keyEvent.character == '\t') { // tab key
-			applyEditorValueAndDeactivate();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ComboBoxViewerCellEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ComboBoxViewerCellEditor.java
deleted file mode 100644
index 6ac42c9..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ComboBoxViewerCellEditor.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *                                                 bugfix in 174739
- *     Eric Rizzo - bug 213315
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.text.MessageFormat; // Not using ICU to support standalone JFace
-// scenario
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-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.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A cell editor that presents a list of items in a combo box. In contrast to
- * {@link ComboBoxCellEditor} it wraps the underlying {@link CCombo} using a
- * {@link ComboViewer}
- * @since 3.4
- */
-public class ComboBoxViewerCellEditor extends AbstractComboBoxCellEditor {
-
-	/**
-	 * The custom combo box control.
-	 */
-	ComboViewer viewer;
-
-	Object selectedValue;
-
-	/**
-	 * Default ComboBoxCellEditor style
-	 */
-	private static final int defaultStyle = SWT.NONE;
-
-	/**
-	 * Creates a new cell editor with a combo viewer and a default style
-	 *
-	 * @param parent
-	 *            the parent control
-	 */
-	public ComboBoxViewerCellEditor(Composite parent) {
-		this(parent, defaultStyle);
-	}
-
-	/**
-	 * Creates a new cell editor with a combo viewer and the given style
-	 *
-	 * @param parent
-	 *            the parent control
-	 * @param style
-	 *            the style bits
-	 */
-	public ComboBoxViewerCellEditor(Composite parent, int style) {
-		super(parent, style);
-		setValueValid(true);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected Control createControl(Composite parent) {
-
-		CCombo comboBox = new CCombo(parent, getStyle());
-		comboBox.setFont(parent.getFont());
-		viewer = new ComboViewer(comboBox);
-
-		comboBox.addKeyListener(new KeyAdapter() {
-			// hook key pressed - see PR 14201
-			public void keyPressed(KeyEvent e) {
-				keyReleaseOccured(e);
-			}
-		});
-
-		comboBox.addSelectionListener(new SelectionAdapter() {
-			public void widgetDefaultSelected(SelectionEvent event) {
-				applyEditorValueAndDeactivate();
-			}
-
-			public void widgetSelected(SelectionEvent event) {
-				ISelection selection = viewer.getSelection();
-				if (selection.isEmpty()) {
-					selectedValue = null;
-				} else {
-					selectedValue = ((IStructuredSelection) selection)
-							.getFirstElement();
-				}
-			}
-		});
-
-		comboBox.addTraverseListener(new TraverseListener() {
-			public void keyTraversed(TraverseEvent e) {
-				if (e.detail == SWT.TRAVERSE_ESCAPE
-						|| e.detail == SWT.TRAVERSE_RETURN) {
-					e.doit = false;
-				}
-			}
-		});
-
-		comboBox.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				ComboBoxViewerCellEditor.this.focusLost();
-			}
-		});
-		return comboBox;
-	}
-
-	/**
-	 * The <code>ComboBoxCellEditor</code> implementation of this
-	 * <code>CellEditor</code> framework method returns the zero-based index
-	 * of the current selection.
-	 *
-	 * @return the zero-based index of the current selection wrapped as an
-	 *         <code>Integer</code>
-	 */
-	protected Object doGetValue() {
-		return selectedValue;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected void doSetFocus() {
-		viewer.getControl().setFocus();
-	}
-
-	/**
-	 * The <code>ComboBoxCellEditor</code> implementation of this
-	 * <code>CellEditor</code> framework method sets the minimum width of the
-	 * cell. The minimum width is 10 characters if <code>comboBox</code> is
-	 * not <code>null</code> or <code>disposed</code> eles it is 60 pixels
-	 * to make sure the arrow button and some text is visible. The list of
-	 * CCombo will be wide enough to show its longest item.
-	 */
-	public LayoutData getLayoutData() {
-		LayoutData layoutData = super.getLayoutData();
-		if ((viewer.getControl() == null) || viewer.getControl().isDisposed()) {
-			layoutData.minimumWidth = 60;
-		} else {
-			// make the comboBox 10 characters wide
-			GC gc = new GC(viewer.getControl());
-			layoutData.minimumWidth = (gc.getFontMetrics()
-					.getAverageCharWidth() * 10) + 10;
-			gc.dispose();
-		}
-		return layoutData;
-	}
-
-	/**
-	 * Set a new value
-	 *
-	 * @param value
-	 *            the new value
-	 */
-	protected void doSetValue(Object value) {
-	    Assert.isTrue(viewer != null);
-	    selectedValue = value;
-	    if (value == null) {
-	        viewer.setSelection(StructuredSelection.EMPTY);
-	    } else {
-	        viewer.setSelection(new StructuredSelection(value));
-	    }
-	}
-
-	/**
-	 * @param labelProvider
-	 *            the label provider used
-	 * @see StructuredViewer#setLabelProvider(IBaseLabelProvider)
-	 */
-	public void setLabelProvider(IBaseLabelProvider labelProvider) {
-		viewer.setLabelProvider(labelProvider);
-	}
-
-	/**
-	 * @param provider
-	 *            the content provider used
-	 * @see StructuredViewer#setContentProvider(IContentProvider)
-	 */
-	public void setContenProvider(IStructuredContentProvider provider) {
-		viewer.setContentProvider(provider);
-	}
-
-	/**
-	 * @param input
-	 *            the input used
-	 * @see StructuredViewer#setInput(Object)
-	 */
-	public void setInput(Object input) {
-		viewer.setInput(input);
-	}
-
-	/**
-	 * @return get the viewer
-	 */
-	public ComboViewer getViewer() {
-		return viewer;
-	}
-
-	/**
-	 * Applies the currently selected value and deactiavates the cell editor
-	 */
-	void applyEditorValueAndDeactivate() {
-		// must set the selection before getting value
-		ISelection selection = viewer.getSelection();
-		if (selection.isEmpty()) {
-			selectedValue = null;
-		} else {
-			selectedValue = ((IStructuredSelection) selection)
-					.getFirstElement();
-		}
-
-		Object newValue = doGetValue();
-		markDirty();
-		boolean isValid = isCorrect(newValue);
-		setValueValid(isValid);
-
-		if (!isValid) {
-			MessageFormat.format(getErrorMessage(),
-					new Object[] { selectedValue });
-		}
-
-		fireApplyEditorValue();
-		deactivate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.CellEditor#focusLost()
-	 */
-	protected void focusLost() {
-		if (isActivated()) {
-			applyEditorValueAndDeactivate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.CellEditor#keyReleaseOccured(org.eclipse.swt.events.KeyEvent)
-	 */
-	protected void keyReleaseOccured(KeyEvent keyEvent) {
-		if (keyEvent.character == '\u001b') { // Escape character
-			fireCancelEditor();
-		} else if (keyEvent.character == '\t') { // tab key
-			applyEditorValueAndDeactivate();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ComboViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ComboViewer.java
deleted file mode 100644
index 27421a3..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ComboViewer.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids - bug 69254
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A concrete viewer based either on an SWT <code>Combo</code> control or <code>CCombo</code>
- * control. This class is intended as an alternative to the JFace <code>ListViewer</code>, which displays
- * its content in a combo box rather than a list. Wherever possible, this class attempts to behave
- * like ListViewer. <p>
- * 
- * This class is designed to be instantiated with a pre-existing SWT combo control 
- * and configured with a domain-specific content provider, label provider, element
- * filter (optional), and element sorter (optional).
- * </p>
- * 
- * @see org.eclipse.jface.viewers.ListViewer
- * @since 3.0 (made non-final in 3.4)
- */
-public class ComboViewer extends AbstractListViewer {
-
-    /**
-     * This viewer's list control if this viewer is instantiated with a combo control; otherwise
-     * <code>null</code>.
-     * 
-     * @see #ComboViewer(Combo)
-     */
-    private Combo combo;
-    
-    /**
-     * This viewer's list control if this viewer is instantiated with a CCombo control; otherwise
-     * <code>null</code>.
-     * 
-     * @see #ComboViewer(CCombo)
-     * @since 3.3
-     */
-    private CCombo ccombo;
-
-    /**
-     * Creates a combo viewer on a newly-created combo control under the given parent.
-     * The viewer has no input, no content provider, a default label provider, 
-     * no sorter, and no filters.
-     *
-     * @param parent the parent control
-     */
-    public ComboViewer(Composite parent) {
-        this(parent, SWT.READ_ONLY | SWT.BORDER);
-    }
-
-    /**
-     * Creates a combo viewer on a newly-created combo control under the given parent.
-     * The combo control is created using the given SWT style bits.
-     * The viewer has no input, no content provider, a default label provider, 
-     * no sorter, and no filters.
-     *
-     * @param parent the parent control
-     * @param style the SWT style bits
-     */
-    public ComboViewer(Composite parent, int style) {
-        this(new Combo(parent, style));
-    }
-
-    /**
-     * Creates a combo viewer on the given combo control.
-     * The viewer has no input, no content provider, a default label provider, 
-     * no sorter, and no filters.
-     *
-     * @param list the combo control
-     */
-    public ComboViewer(Combo list) {
-        this.combo = list;
-        hookControl(list);
-    }
-    
-    /**
-     * Creates a combo viewer on the given CCombo control.
-     * The viewer has no input, no content provider, a default label provider, 
-     * no sorter, and no filters.
-     *
-     * @param list the CCombo control
-     * @since 3.3
-     */
-    public ComboViewer(CCombo list) {
-        this.ccombo = list;
-        hookControl(list);
-    }
-
-    protected void listAdd(String string, int index) {
-        if (combo == null) {
-            ccombo.add(string, index);
-        } else {
-            combo.add(string, index);
-        }
-    }
-
-    protected void listSetItem(int index, String string) {
-        if (combo == null) {
-            ccombo.setItem(index, string);
-        } else {
-            combo.setItem(index, string);
-        }
-    }
-
-    protected int[] listGetSelectionIndices() {
-        if (combo == null) {
-            return new int[] { ccombo.getSelectionIndex() };
-        } else {
-            return new int[] { combo.getSelectionIndex() };
-        }
-    }
-
-    protected int listGetItemCount() {
-        if (combo == null) {
-            return ccombo.getItemCount();
-        } else {
-            return combo.getItemCount();
-        }
-    }
-
-    protected void listSetItems(String[] labels) {
-        if (combo == null) {
-            ccombo.setItems(labels);
-        } else {
-            combo.setItems(labels);
-        }
-    }
-
-    protected void listRemoveAll() {
-        if (combo == null) {
-            ccombo.removeAll();
-        } else {
-            combo.removeAll();
-        }
-    }
-
-    protected void listRemove(int index) {
-        if (combo == null) {
-            ccombo.remove(index);
-        } else {
-            combo.remove(index);
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Viewer.
-     */
-    public Control getControl() {
-        if (combo == null) {
-            return ccombo;
-        } else {
-            return combo;
-        }
-    }
-
-    /**
-	 * Returns this list viewer's list control. If the viewer was not created on
-	 * a CCombo control, some kind of unchecked exception is thrown.
-	 * 
-	 * @return the list control
-     * @since 3.3
-	 */
-    public CCombo getCCombo() {
-        Assert.isNotNull(ccombo);
-        return ccombo;
-    }
-
-    /**
-     * Returns this list viewer's list control. If the viewer was not created on
-	 * a Combo control, some kind of unchecked exception is thrown.
-     *
-     * @return the list control
-     */
-    public Combo getCombo() {
-    	Assert.isNotNull(combo);
-        return combo;
-    }
-    
-    /*
-     * Do nothing -- combos only display the selected element, so there is no way
-     * we can ensure that the given element is visible without changing the selection.
-     * Method defined on StructuredViewer.
-     */
-    public void reveal(Object element) {
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.AbstractListViewer#listSetSelection(int[])
-     */
-    protected void listSetSelection(int[] ixs) {
-        if (combo == null) {
-            for (int idx = 0; idx < ixs.length; idx++) {
-                ccombo.select(ixs[idx]);
-            }
-        } else {
-            for (int idx = 0; idx < ixs.length; idx++) {
-                combo.select(ixs[idx]);
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.AbstractListViewer#listDeselectAll()
-     */
-    protected void listDeselectAll() {
-        if (combo == null) {
-            ccombo.deselectAll();
-            ccombo.clearSelection();
-        } else {
-            combo.deselectAll();
-            combo.clearSelection();
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.AbstractListViewer#listShowSelection()
-     */
-    protected void listShowSelection() {
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ContentViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ContentViewer.java
deleted file mode 100644
index 17d238f..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ContentViewer.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.internal.InternalPolicy;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A content viewer is a model-based adapter on a widget which accesses its
- * model by means of a content provider and a label provider.
- * <p>
- * A viewer's model consists of elements, represented by objects.
- * A viewer defines and implements generic infrastructure for handling model 
- * input, updates, and selections in terms of elements.
- * Input is obtained by querying an <code>IContentProvider</code> which returns
- * elements. The elements themselves are not displayed directly.  They are
- * mapped to labels, containing text and/or an image, using the viewer's 
- * <code>ILabelProvider</code>.
- * </p>
- * <p>
- * Implementing a concrete content viewer typically involves the following steps:
- * <ul>
- * <li>
- * create SWT controls for viewer (in constructor) (optional)
- * </li>
- * <li>
- * initialize SWT controls from input (inputChanged)
- * </li>
- * <li>
- * define viewer-specific update methods
- * </li>
- * <li>
- * support selections (<code>setSelection</code>, <code>getSelection</code>)
- * </ul>
- * </p>
- */
-public abstract class ContentViewer extends Viewer {
-
-    /**
-     * This viewer's content provider, or <code>null</code> if none.
-     */
-    private IContentProvider contentProvider = null;
-
-    /**
-     * This viewer's input, or <code>null</code> if none.
-     * The viewer's input provides the "model" for the viewer's content.
-     */
-    private Object input = null;
-
-    /**
-     * This viewer's label provider. Initially <code>null</code>, but
-     * lazily initialized (to a <code>SimpleLabelProvider</code>).
-     */
-    private IBaseLabelProvider labelProvider = null;
-
-    /**
-     * This viewer's label provider listener.
-     * Note: Having a viewer register a label provider listener with
-     * a label provider avoids having to define public methods
-     * for internal events.
-     */
-    private final ILabelProviderListener labelProviderListener = new ILabelProviderListener() {
-    	private boolean logWhenDisposed = true; // initially true, set to false
-        
-        public void labelProviderChanged(LabelProviderChangedEvent event) {
-        	Control control = getControl();
-        	if (control == null || control.isDisposed()) {
-    			if (logWhenDisposed) {
-    				String message = "Ignored labelProviderChanged notification because control is diposed." + //$NON-NLS-1$
-    						" This indicates a potential memory leak."; //$NON-NLS-1$
-    				if (!InternalPolicy.DEBUG_LOG_LABEL_PROVIDER_NOTIFICATIONS_WHEN_DISPOSED) {
-    					// stop logging after the first
-    					logWhenDisposed = false;
-    					message += " This is only logged once per viewer instance," + //$NON-NLS-1$
-    							" but similar calls will still be ignored."; //$NON-NLS-1$
-    				}
-    				Policy.getLog().log(
-    						new Status(IStatus.WARNING, Policy.JFACE, message,
-    								new RuntimeException()));
-    			}
-        		return;
-        	}
-        	ContentViewer.this.handleLabelProviderChanged(event);
-        }
-    };
-
-    /**
-     * Creates a content viewer with no input, no content provider, and a
-     * default label provider.
-     */
-    protected ContentViewer() {
-    }
-
-    /**
-     * Returns the content provider used by this viewer, 
-     * or <code>null</code> if this view does not yet have a content
-     * provider.
-     * <p>
-     * The <code>ContentViewer</code> implementation of this method returns the content
-     * provider recorded is an internal state variable. 
-     * Overriding this method is generally not required; 
-     * however, if overriding in a subclass, 
-     * <code>super.getContentProvider</code> must be invoked.
-     * </p>
-     *
-     * @return the content provider, or <code>null</code> if none
-     */
-    public IContentProvider getContentProvider() {
-        return contentProvider;
-    }
-
-    /**
-     * The <code>ContentViewer</code> implementation of this <code>IInputProvider</code> 
-     * method returns the current input of this viewer, or <code>null</code>
-     * if none. The viewer's input provides the "model" for the viewer's
-     * content.
-     */
-    public Object getInput() {
-        return input;
-    }
-
-    /**
-     * Returns the label provider used by this viewer.
-     * <p>
-     * The <code>ContentViewer</code> implementation of this method returns the label
-     * provider recorded in an internal state variable; if none has been
-     * set (with <code>setLabelProvider</code>) a default label provider
-     * will be created, remembered, and returned.
-     * Overriding this method is generally not required; 
-     * however, if overriding in a subclass,
-     * <code>super.getLabelProvider</code> must be invoked.
-     * </p>
-     *
-     * @return a label provider
-     */
-    public IBaseLabelProvider getLabelProvider() {
-        if (labelProvider == null) {
-			labelProvider = new LabelProvider();
-		}
-        return labelProvider;
-    }
-
-    /**
-     * Handles a dispose event on this viewer's control.
-     * <p>
-     * The <code>ContentViewer</code> implementation of this method disposes of this
-     * viewer's label provider and content provider (if it has one).
-     * Subclasses should override this method to perform any additional
-     * cleanup of resources; however, overriding methods must invoke
-     * <code>super.handleDispose</code>.
-     * </p>
-     *
-     * @param event a dispose event
-     */
-    protected void handleDispose(DisposeEvent event) {
-        if (contentProvider != null) {
-            contentProvider.inputChanged(this, getInput(), null);
-            contentProvider.dispose();
-            contentProvider = null;
-        }
-        if (labelProvider != null) {
-            labelProvider.removeListener(labelProviderListener);
-            labelProvider.dispose();
-            labelProvider = null;
-        }
-        input = null;
-    }
-
-    /**
-     * Handles a label provider changed event.
-     * <p>
-     * The <code>ContentViewer</code> implementation of this method calls <code>labelProviderChanged()</code>
-     * to cause a complete refresh of the viewer.
-     * Subclasses may reimplement or extend. 
-     * </p>
-     * @param event the change event
-     */
-    protected void handleLabelProviderChanged(LabelProviderChangedEvent event) {
-        labelProviderChanged();
-    }
-
-    /**
-     * Adds event listener hooks to the given control.
-     * <p>
-     * All subclasses must call this method when their control is
-     * first established.
-     * </p> 
-     * <p>
-     * The <code>ContentViewer</code> implementation of this method hooks 
-     * dispose events for the given control.
-     * Subclasses may override if they need to add other control hooks;
-     * however, <code>super.hookControl</code> must be invoked.
-     * </p>
-     *
-     * @param control the control
-     */
-    protected void hookControl(Control control) {
-        control.addDisposeListener(new DisposeListener() {
-            public void widgetDisposed(DisposeEvent event) {
-                handleDispose(event);
-            }
-        });
-    }
-
-    /**
-     * Notifies that the label provider has changed.
-     * <p>
-     * The <code>ContentViewer</code> implementation of this method calls <code>refresh()</code>.
-     * Subclasses may reimplement or extend.
-     * </p>
-     */
-    protected void labelProviderChanged() {
-        refresh();
-    }
-
-    /**
-     * Sets the content provider used by this viewer.
-     * <p>
-     * The <code>ContentViewer</code> implementation of this method records the 
-     * content provider in an internal state variable.
-     * Overriding this method is generally not required; 
-     * however, if overriding in a subclass,
-     * <code>super.setContentProvider</code> must be invoked.
-     * </p>
-     *
-     * @param contentProvider the content provider
-     * @see #getContentProvider
-     */
-    public void setContentProvider(IContentProvider contentProvider) {
-        Assert.isNotNull(contentProvider);
-        IContentProvider oldContentProvider = this.contentProvider;
-        this.contentProvider = contentProvider;
-        if (oldContentProvider != null) {
-            Object currentInput = getInput();
-            oldContentProvider.inputChanged(this, currentInput, null);
-            oldContentProvider.dispose();
-            contentProvider.inputChanged(this, null, currentInput);
-            refresh();
-        }
-    }
-
-    /**
-     * The <code>ContentViewer</code> implementation of this <code>Viewer</code>
-     * method invokes <code>inputChanged</code> on the content provider and then the
-     * <code>inputChanged</code> hook method. This method fails if this viewer does
-     * not have a content provider. Subclassers are advised to override 
-     * <code>inputChanged</code> rather than this method, but may extend this method
-     * if required.
-     */
-    public void setInput(Object input) {
-        Assert
-                .isTrue(getContentProvider() != null,
-                        "ContentViewer must have a content provider when input is set."); //$NON-NLS-1$
-
-        Object oldInput = getInput();
-        contentProvider.inputChanged(this, oldInput, input);
-        this.input = input;
-
-        // call input hook
-        inputChanged(this.input, oldInput);
-    }
-
-    /**
-     * Sets the label provider for this viewer.
-     * <p>
-     * The <code>ContentViewer</code> implementation of this method ensures that the
-     * given label provider is connected to this viewer and the
-     * former label provider is disconnected from this viewer.
-     * Overriding this method is generally not required; 
-     * however, if overriding in a subclass,
-     * <code>super.setLabelProvider</code> must be invoked.
-     * </p>
-     *
-     * @param labelProvider the label provider, or <code>null</code> if none
-     */
-    public void setLabelProvider(IBaseLabelProvider labelProvider) {
-        IBaseLabelProvider oldProvider = this.labelProvider;
-        // If it hasn't changed, do nothing.
-        // This also ensures that the provider is not disposed
-        // if set a second time.
-        if (labelProvider == oldProvider) {
-            return;
-        }
-        if (oldProvider != null) {
-            oldProvider.removeListener(this.labelProviderListener);
-        }
-        this.labelProvider = labelProvider;
-        if (labelProvider != null) {
-            labelProvider.addListener(this.labelProviderListener);
-        }
-        refresh();
-
-        // Dispose old provider after refresh, so that items never refer to stale images.
-        if (oldProvider != null) {
-    		internalDisposeLabelProvider(oldProvider);
-        }
-    }
-
-	/**
-	 * @param oldProvider
-	 * 
-	 * @since 3.4
-	 */
-	void internalDisposeLabelProvider(IBaseLabelProvider oldProvider) {
-		oldProvider.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CustomHashtable.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CustomHashtable.java
deleted file mode 100644
index c611558..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/CustomHashtable.java
+++ /dev/null
@@ -1,434 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Peter Shipton - original hashtable implementation
- *     Nick Edgar - added element comparer support
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.Enumeration;
-import java.util.NoSuchElementException;
-
-/**
- * CustomHashtable associates keys with values. Keys and values cannot be null.
- * The size of the Hashtable is the number of key/value pairs it contains.
- * The capacity is the number of key/value pairs the Hashtable can hold.
- * The load factor is a float value which determines how full the Hashtable
- * gets before expanding the capacity. If the load factor of the Hashtable
- * is exceeded, the capacity is doubled.
- * <p>
- * CustomHashtable allows a custom comparator and hash code provider.
- */
-/* package */final class CustomHashtable {
-
-    /**
-     * HashMapEntry is an internal class which is used to hold the entries of a Hashtable.
-     */
-    private static class HashMapEntry {
-        Object key, value;
-
-        HashMapEntry next;
-
-        HashMapEntry(Object theKey, Object theValue) {
-            key = theKey;
-            value = theValue;
-        }
-    }
-
-    private static final class EmptyEnumerator implements Enumeration {
-        public boolean hasMoreElements() {
-            return false;
-        }
-
-        public Object nextElement() {
-            throw new NoSuchElementException();
-        }
-    }
-
-    private class HashEnumerator implements Enumeration {
-        boolean key;
-
-        int start;
-
-        HashMapEntry entry;
-
-        HashEnumerator(boolean isKey) {
-            key = isKey;
-            start = firstSlot;
-        }
-
-        public boolean hasMoreElements() {
-            if (entry != null) {
-				return true;
-			}
-            while (start <= lastSlot) {
-				if (elementData[start++] != null) {
-                    entry = elementData[start - 1];
-                    return true;
-                }
-			}
-            return false;
-        }
-
-        public Object nextElement() {
-            if (hasMoreElements()) {
-                Object result = key ? entry.key : entry.value;
-                entry = entry.next;
-                return result;
-            } else {
-				throw new NoSuchElementException();
-			}
-        }
-    }
-
-    transient int elementCount;
-
-    transient HashMapEntry[] elementData;
-
-    private float loadFactor;
-
-    private int threshold;
-
-    transient int firstSlot = 0;
-
-    transient int lastSlot = -1;
-
-    transient private IElementComparer comparer;
-
-    private static final EmptyEnumerator emptyEnumerator = new EmptyEnumerator();
-
-    /**
-     * The default capacity used when not specified in the constructor.
-     */
-    public static final int DEFAULT_CAPACITY = 13;
-
-    /**
-     * Constructs a new Hashtable using the default capacity
-     * and load factor.
-     */
-    public CustomHashtable() {
-        this(13);
-    }
-
-    /**
-     * Constructs a new Hashtable using the specified capacity
-     * and the default load factor.
-     *
-     * @param capacity the initial capacity
-     */
-    public CustomHashtable(int capacity) {
-        this(capacity, null);
-    }
-
-    /**
-     * Constructs a new hash table with the default capacity and the given
-     * element comparer.
-     *
-     * @param comparer the element comparer to use to compare keys and obtain
-     *   hash codes for keys, or <code>null</code>  to use the normal 
-     *   <code>equals</code> and <code>hashCode</code> methods
-     */
-    public CustomHashtable(IElementComparer comparer) {
-        this(DEFAULT_CAPACITY, comparer);
-    }
-
-    /**
-     * Constructs a new hash table with the given capacity and the given
-     * element comparer.
-     * 
-     * @param capacity the maximum number of elements that can be added without
-     *   rehashing
-     * @param comparer the element comparer to use to compare keys and obtain
-     *   hash codes for keys, or <code>null</code>  to use the normal 
-     *   <code>equals</code> and <code>hashCode</code> methods
-     */
-    public CustomHashtable(int capacity, IElementComparer comparer) {
-        if (capacity >= 0) {
-            elementCount = 0;
-            elementData = new HashMapEntry[capacity == 0 ? 1 : capacity];
-            firstSlot = elementData.length;
-            loadFactor = 0.75f;
-            computeMaxSize();
-        } else {
-			throw new IllegalArgumentException();
-		}
-        this.comparer = comparer;
-    }
-
-    /**
-     * Constructs a new hash table with enough capacity to hold all keys in the
-     * given hash table, then adds all key/value pairs in the given hash table
-     * to the new one, using the given element comparer.
-     * @param table the original hash table to copy from
-     * 
-     * @param comparer the element comparer to use to compare keys and obtain
-     *   hash codes for keys, or <code>null</code>  to use the normal 
-     *   <code>equals</code> and <code>hashCode</code> methods
-     */
-    public CustomHashtable(CustomHashtable table, IElementComparer comparer) {
-        this(table.size() * 2, comparer);
-        for (int i = table.elementData.length; --i >= 0;) {
-            HashMapEntry entry = table.elementData[i];
-            while (entry != null) {
-                put(entry.key, entry.value);
-                entry = entry.next;
-            }
-        }
-    }
-    
-    /**
-     * Returns the element comparer used  to compare keys and to obtain
-     * hash codes for keys, or <code>null</code> if no comparer has been
-     * provided.
-     * 
-     * @return the element comparer or <code>null</code>
-     * 
-     * @since 3.2
-     */
-    public IElementComparer getComparer() {
-    	return comparer;
-    }
-
-    private void computeMaxSize() {
-        threshold = (int) (elementData.length * loadFactor);
-    }
-
-    /**
-     * Answers if this Hashtable contains the specified object as a key
-     * of one of the key/value pairs.
-     *
-     * @param		key	the object to look for as a key in this Hashtable
-     * @return		true if object is a key in this Hashtable, false otherwise
-     */
-    public boolean containsKey(Object key) {
-        return getEntry(key) != null;
-    }
-
-    /**
-     * Answers an Enumeration on the values of this Hashtable. The
-     * results of the Enumeration may be affected if the contents
-     * of this Hashtable are modified.
-     *
-     * @return		an Enumeration of the values of this Hashtable
-     */
-    public Enumeration elements() {
-        if (elementCount == 0) {
-			return emptyEnumerator;
-		}
-        return new HashEnumerator(false);
-    }
-
-    /**
-     * Answers the value associated with the specified key in
-     * this Hashtable.
-     *
-     * @param		key	the key of the value returned
-     * @return		the value associated with the specified key, null if the specified key
-     *				does not exist
-     */
-    public Object get(Object key) {
-        int index = (hashCode(key) & 0x7FFFFFFF) % elementData.length;
-        HashMapEntry entry = elementData[index];
-        while (entry != null) {
-            if (keyEquals(key, entry.key)) {
-				return entry.value;
-			}
-            entry = entry.next;
-        }
-        return null;
-    }
-
-    private HashMapEntry getEntry(Object key) {
-        int index = (hashCode(key) & 0x7FFFFFFF) % elementData.length;
-        HashMapEntry entry = elementData[index];
-        while (entry != null) {
-            if (keyEquals(key, entry.key)) {
-				return entry;
-			}
-            entry = entry.next;
-        }
-        return null;
-    }
-
-    /**
-     * Answers the hash code for the given key.
-     */
-    private int hashCode(Object key) {
-        if (comparer == null) {
-			return key.hashCode();
-		} else {
-			return comparer.hashCode(key);
-		}
-    }
-
-    /**
-     * Compares two keys for equality.
-     */
-    private boolean keyEquals(Object a, Object b) {
-        if (comparer == null) {
-			return a.equals(b);
-		} else {
-			return comparer.equals(a, b);
-		}
-    }
-
-    /**
-     * Answers an Enumeration on the keys of this Hashtable. The
-     * results of the Enumeration may be affected if the contents
-     * of this Hashtable are modified.
-     *
-     * @return		an Enumeration of the keys of this Hashtable
-     */
-    public Enumeration keys() {
-        if (elementCount == 0) {
-			return emptyEnumerator;
-		}
-        return new HashEnumerator(true);
-    }
-
-    /**
-     * Associate the specified value with the specified key in this Hashtable.
-     * If the key already exists, the old value is replaced. The key and value
-     * cannot be null.
-     *
-     * @param		key	the key to add
-     * @param		value	the value to add
-     * @return		the old value associated with the specified key, null if the key did
-     *				not exist
-     */
-    public Object put(Object key, Object value) {
-        if (key != null && value != null) {
-            int index = (hashCode(key) & 0x7FFFFFFF) % elementData.length;
-            HashMapEntry entry = elementData[index];
-            while (entry != null && !keyEquals(key, entry.key)) {
-				entry = entry.next;
-			}
-            if (entry == null) {
-                if (++elementCount > threshold) {
-                    rehash();
-                    index = (hashCode(key) & 0x7FFFFFFF) % elementData.length;
-                }
-                if (index < firstSlot) {
-					firstSlot = index;
-				}
-                if (index > lastSlot) {
-					lastSlot = index;
-				}
-                entry = new HashMapEntry(key, value);
-                entry.next = elementData[index];
-                elementData[index] = entry;
-                return null;
-            }
-            Object result = entry.value;
-            entry.key = key; // important to avoid hanging onto keys that are equal but "old" -- see bug 30607
-            entry.value = value;
-            return result;
-        } else {
-			throw new NullPointerException();
-		}
-    }
-
-    /**
-     * Increases the capacity of this Hashtable. This method is sent when
-     * the size of this Hashtable exceeds the load factor.
-     */
-    private void rehash() {
-        int length = elementData.length << 1;
-        if (length == 0) {
-			length = 1;
-		}
-        firstSlot = length;
-        lastSlot = -1;
-        HashMapEntry[] newData = new HashMapEntry[length];
-        for (int i = elementData.length; --i >= 0;) {
-            HashMapEntry entry = elementData[i];
-            while (entry != null) {
-                int index = (hashCode(entry.key) & 0x7FFFFFFF) % length;
-                if (index < firstSlot) {
-					firstSlot = index;
-				}
-                if (index > lastSlot) {
-					lastSlot = index;
-				}
-                HashMapEntry next = entry.next;
-                entry.next = newData[index];
-                newData[index] = entry;
-                entry = next;
-            }
-        }
-        elementData = newData;
-        computeMaxSize();
-    }
-
-    /**
-     * Remove the key/value pair with the specified key from this Hashtable.
-     *
-     * @param		key	the key to remove
-     * @return		the value associated with the specified key, null if the specified key
-     *				did not exist
-     */
-    public Object remove(Object key) {
-        HashMapEntry last = null;
-        int index = (hashCode(key) & 0x7FFFFFFF) % elementData.length;
-        HashMapEntry entry = elementData[index];
-        while (entry != null && !keyEquals(key, entry.key)) {
-            last = entry;
-            entry = entry.next;
-        }
-        if (entry != null) {
-            if (last == null) {
-				elementData[index] = entry.next;
-			} else {
-				last.next = entry.next;
-			}
-            elementCount--;
-            return entry.value;
-        }
-        return null;
-    }
-
-    /**
-     * Answers the number of key/value pairs in this Hashtable.
-     *
-     * @return		the number of key/value pairs in this Hashtable
-     */
-    public int size() {
-        return elementCount;
-    }
-
-    /**
-     * Answers the string representation of this Hashtable.
-     *
-     * @return		the string representation of this Hashtable
-     */
-    public String toString() {
-        if (size() == 0) {
-			return "{}"; //$NON-NLS-1$
-		}
-
-        StringBuffer buffer = new StringBuffer();
-        buffer.append('{');
-        for (int i = elementData.length; --i >= 0;) {
-            HashMapEntry entry = elementData[i];
-            while (entry != null) {
-                buffer.append(entry.key);
-                buffer.append('=');
-                buffer.append(entry.value);
-                buffer.append(", "); //$NON-NLS-1$
-                entry = entry.next;
-            }
-        }
-        // Remove the last ", "
-        if (elementCount > 0) {
-			buffer.setLength(buffer.length() - 2);
-		}
-        buffer.append('}');
-        return buffer.toString();
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DecoratingLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DecoratingLabelProvider.java
deleted file mode 100644
index fb4d427..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DecoratingLabelProvider.java
+++ /dev/null
@@ -1,408 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A decorating label provider is a label provider which combines 
- * a nested label provider and an optional decorator.
- * The decorator decorates the label text, image, font and colors provided by 
- * the nested label provider.
- */
-public class DecoratingLabelProvider extends LabelProvider implements
-        ILabelProvider, IViewerLabelProvider, IColorProvider, IFontProvider, ITreePathLabelProvider {
-		
-    private ILabelProvider provider;
-
-    private ILabelDecorator decorator;
-
-    // Need to keep our own list of listeners
-    private ListenerList listeners = new ListenerList();
-
-	private IDecorationContext decorationContext = DecorationContext.DEFAULT_CONTEXT;
-
-    /**
-     * Creates a decorating label provider which uses the given label decorator
-     * to decorate labels provided by the given label provider.
-     *
-     * @param provider the nested label provider
-     * @param decorator the label decorator, or <code>null</code> if no decorator is to be used initially
-     */
-    public DecoratingLabelProvider(ILabelProvider provider,
-            ILabelDecorator decorator) {
-        Assert.isNotNull(provider);
-        this.provider = provider;
-        this.decorator = decorator;
-    }
-
-    /**
-     * The <code>DecoratingLabelProvider</code> implementation of this <code>IBaseLabelProvider</code> method
-     * adds the listener to both the nested label provider and the label decorator.
-     *
-     * @param listener a label provider listener
-     */
-    public void addListener(ILabelProviderListener listener) {
-        super.addListener(listener);
-        provider.addListener(listener);
-        if (decorator != null) {
-            decorator.addListener(listener);
-        }
-        listeners.add(listener);
-    }
-
-    /**
-     * The <code>DecoratingLabelProvider</code> implementation of this <code>IBaseLabelProvider</code> method
-     * disposes both the nested label provider and the label decorator.
-     */
-    public void dispose() {
-        provider.dispose();
-        if (decorator != null) {
-            decorator.dispose();
-        }
-    }
-
-    /**
-     * The <code>DecoratingLabelProvider</code> implementation of this 
-     * <code>ILabelProvider</code> method returns the image provided
-     * by the nested label provider's <code>getImage</code> method, 
-     * decorated with the decoration provided by the label decorator's
-     * <code>decorateImage</code> method.
-     */
-    public Image getImage(Object element) {
-        Image image = provider.getImage(element);
-        if (decorator != null) {
-        	if (decorator instanceof LabelDecorator) {
-				LabelDecorator ld2 = (LabelDecorator) decorator;
-	            Image decorated = ld2.decorateImage(image, element, getDecorationContext());
-	            if (decorated != null) {
-	                return decorated;
-	            }
-			} else {
-	            Image decorated = decorator.decorateImage(image, element);
-	            if (decorated != null) {
-	                return decorated;
-	            }
-			}
-        }
-        return image;
-    }
-
-	/**
-     * Returns the label decorator, or <code>null</code> if none has been set.
-     *
-     * @return the label decorator, or <code>null</code> if none has been set.
-     */
-    public ILabelDecorator getLabelDecorator() {
-        return decorator;
-    }
-
-    /**
-     * Returns the nested label provider.
-     *
-     * @return the nested label provider
-     */
-    public ILabelProvider getLabelProvider() {
-        return provider;
-    }
-
-    /**
-     * The <code>DecoratingLabelProvider</code> implementation of this 
-     * <code>ILabelProvider</code> method returns the text label provided
-     * by the nested label provider's <code>getText</code> method, 
-     * decorated with the decoration provided by the label decorator's
-     * <code>decorateText</code> method.
-     */
-    public String getText(Object element) {
-        String text = provider.getText(element);
-        if (decorator != null) {
-        	if (decorator instanceof LabelDecorator) {
-				LabelDecorator ld2 = (LabelDecorator) decorator;
-	            String decorated = ld2.decorateText(text, element, getDecorationContext());
-	            if (decorated != null) {
-	                return decorated;
-	            }
-			} else {
-	            String decorated = decorator.decorateText(text, element);
-	            if (decorated != null) {
-	                return decorated;
-	            }
-			}
-        }
-        return text;
-    }
-
-    /**
-     * The <code>DecoratingLabelProvider</code> implementation of this 
-     * <code>IBaseLabelProvider</code> method returns <code>true</code> if the corresponding method
-     * on the nested label provider returns <code>true</code> or if the corresponding method on the 
-     * decorator returns <code>true</code>.
-     */
-    public boolean isLabelProperty(Object element, String property) {
-        if (provider.isLabelProperty(element, property)) {
-			return true;
-		}
-        if (decorator != null && decorator.isLabelProperty(element, property)) {
-			return true;
-		}
-        return false;
-    }
-
-    /**
-     * The <code>DecoratingLabelProvider</code> implementation of this <code>IBaseLabelProvider</code> method
-     * removes the listener from both the nested label provider and the label decorator.
-     *
-     * @param listener a label provider listener
-     */
-    public void removeListener(ILabelProviderListener listener) {
-        super.removeListener(listener);
-        provider.removeListener(listener);
-        if (decorator != null) {
-            decorator.removeListener(listener);
-        }
-        listeners.remove(listener);
-    }
-
-    /**
-     * Sets the label decorator.
-     * Removes all known listeners from the old decorator, and adds all known listeners to the new decorator.
-     * The old decorator is not disposed.
-     * Fires a label provider changed event indicating that all labels should be updated.
-     * Has no effect if the given decorator is identical to the current one.
-     *
-     * @param decorator the label decorator, or <code>null</code> if no decorations are to be applied
-     */
-    public void setLabelDecorator(ILabelDecorator decorator) {
-        ILabelDecorator oldDecorator = this.decorator;
-        if (oldDecorator != decorator) {
-            Object[] listenerList = this.listeners.getListeners();
-            if (oldDecorator != null) {
-                for (int i = 0; i < listenerList.length; ++i) {
-                    oldDecorator
-                            .removeListener((ILabelProviderListener) listenerList[i]);
-                }
-            }
-            this.decorator = decorator;
-            if (decorator != null) {
-                for (int i = 0; i < listenerList.length; ++i) {
-                    decorator
-                            .addListener((ILabelProviderListener) listenerList[i]);
-                }
-            }
-            fireLabelProviderChanged(new LabelProviderChangedEvent(this));
-        }
-    }
-
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IViewerLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel, java.lang.Object)
-     */
-    public void updateLabel(ViewerLabel settings, Object element) {
-
-        ILabelDecorator currentDecorator = getLabelDecorator();
-        String oldText = settings.getText();
-        boolean decorationReady = true;
-        if (currentDecorator instanceof IDelayedLabelDecorator) {
-            IDelayedLabelDecorator delayedDecorator = (IDelayedLabelDecorator) currentDecorator;
-            if (!delayedDecorator.prepareDecoration(element, oldText)) {
-                // The decoration is not ready but has been queued for processing
-                decorationReady = false;
-            }
-        }
-        // update icon and label
-
-        if (decorationReady || oldText == null
-                || settings.getText().length() == 0) {
-			settings.setText(getText(element));
-		}
-
-        Image oldImage = settings.getImage();
-        if (decorationReady || oldImage == null) {
-            settings.setImage(getImage(element));
-        }
- 
-        if(decorationReady) {
-			updateForDecorationReady(settings,element);
-		}
-
-    }
-
-	/**
-	 * Decoration is ready. Update anything else for the settings.
-	 * @param settings The object collecting the settings.
-	 * @param element The Object being decorated.
-	 * @since 3.1
-	 */
-	protected void updateForDecorationReady(ViewerLabel settings, Object element) {
-		
-		if(decorator instanceof IColorDecorator){
-			IColorDecorator colorDecorator = (IColorDecorator) decorator;
-			settings.setBackground(colorDecorator.decorateBackground(element));
-			settings.setForeground(colorDecorator.decorateForeground(element));
-		}
-		
-		if(decorator instanceof IFontDecorator) {
-			settings.setFont(((IFontDecorator) decorator).decorateFont(element));
-		}
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-	 */
-	public Color getBackground(Object element) {
-		if(provider instanceof IColorProvider) {
-			return ((IColorProvider) provider).getBackground(element);
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-	 */
-	public Font getFont(Object element) {
-		if(provider instanceof IFontProvider) {
-			return ((IFontProvider) provider).getFont(element);
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-	 */
-	public Color getForeground(Object element) {
-		if(provider instanceof IColorProvider) {
-			return ((IColorProvider) provider).getForeground(element);
-		}
-		return null;
-	}
-
-    /**
-     * Return the decoration context associated with this label provider.
-     * It will be passed to the decorator if the decorator is an 
-     * instance of {@link LabelDecorator}.
-     * @return the decoration context associated with this label provider
-     * 
-     * @since 3.2
-     */
-    public IDecorationContext getDecorationContext() {
-		return decorationContext;
-	}
-    
-    /**
-     * Set the decoration context that will be based to the decorator 
-     * for this label provider if that decorator implements {@link LabelDecorator}.
-     * @param decorationContext the decoration context.
-     * 
-     * @since 3.2
-     */
-	public void setDecorationContext(IDecorationContext decorationContext) {
-		Assert.isNotNull(decorationContext);
-		this.decorationContext = decorationContext;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITreePathLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel, org.eclipse.jface.viewers.TreePath)
-	 */
-	public void updateLabel(ViewerLabel settings, TreePath elementPath) {
-        ILabelDecorator currentDecorator = getLabelDecorator();
-        String oldText = settings.getText();
-        Object element = elementPath.getLastSegment();
-        boolean decorationReady = true;
-        if (currentDecorator instanceof LabelDecorator) {
-			LabelDecorator labelDecorator = (LabelDecorator) currentDecorator;
-           if (!labelDecorator.prepareDecoration(element, oldText, getDecorationContext())) {
-                // The decoration is not ready but has been queued for processing
-                decorationReady = false;
-            }
-		} else if (currentDecorator instanceof IDelayedLabelDecorator) {
-            IDelayedLabelDecorator delayedDecorator = (IDelayedLabelDecorator) currentDecorator;
-            if (!delayedDecorator.prepareDecoration(element, oldText)) {
-                // The decoration is not ready but has been queued for processing
-                decorationReady = false;
-            }
-        }
-        settings.setHasPendingDecorations(!decorationReady);
-        // update icon and label
-
-        if (provider instanceof ITreePathLabelProvider) {
-			ITreePathLabelProvider pprov = (ITreePathLabelProvider) provider;
-			if (decorationReady || oldText == null
-	                || settings.getText().length() == 0) {
-				pprov.updateLabel(settings, elementPath);
-				decorateSettings(settings, elementPath);
-			}
-		} else {
-	        if (decorationReady || oldText == null
-	                || settings.getText().length() == 0) {
-				settings.setText(getText(element));
-			}
-	
-	        Image oldImage = settings.getImage();
-	        if (decorationReady || oldImage == null) {
-	            settings.setImage(getImage(element));
-	        }
-	 
-	        if(decorationReady) {
-				updateForDecorationReady(settings,element);
-			}
-		}
-
-	}
-
-	/**
-	 * Decorate the settings
-	 * @param settings the settings obtained from the label provider
-	 * @param elementPath the element path being decorated
-	 */
-	private void decorateSettings(ViewerLabel settings, TreePath elementPath) {
-		Object element = elementPath.getLastSegment();
-        if (decorator != null) {
-        	if (decorator instanceof LabelDecorator) {
-				LabelDecorator labelDecorator = (LabelDecorator) decorator;
-				String text = labelDecorator.decorateText(settings.getText(), element, getDecorationContext());
-	            if (text != null && text.length() > 0)
-	            	settings.setText(text);
-	            Image image = labelDecorator.decorateImage(settings.getImage(), element, getDecorationContext());
-	            if (image != null)
-	            	settings.setImage(image);
-	            
-			} else {
-				String text = decorator.decorateText(settings.getText(), element);
-	            if (text != null && text.length() > 0)
-	            	settings.setText(text);
-	            Image image = decorator.decorateImage(settings.getImage(), element);
-	            if (image != null)
-	            	settings.setImage(image);
-			}
-    		if(decorator instanceof IColorDecorator){
-    			IColorDecorator colorDecorator = (IColorDecorator) decorator;
-    			Color background = colorDecorator.decorateBackground(element);
-    			if (background != null)
-    				settings.setBackground(background);
-    			Color foreground = colorDecorator.decorateForeground(element);
-    			if (foreground != null)
-    				settings.setForeground(foreground);
-    		}
-    		
-    		if(decorator instanceof IFontDecorator) {
-    			Font font = ((IFontDecorator) decorator).decorateFont(element);
-    			if (font != null)
-    				settings.setFont(font);
-    		}
-        }
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DecoratingStyledCellLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DecoratingStyledCellLabelProvider.java
deleted file mode 100644
index 9ac7fa9..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DecoratingStyledCellLabelProvider.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.StyledString.Styler;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A {@link DecoratingStyledCellLabelProvider} is a
- * {@link DelegatingStyledCellLabelProvider} that uses a nested
- * {@link DelegatingStyledCellLabelProvider.IStyledLabelProvider} to compute
- * styled text label and image and takes a {@link ILabelDecorator} to decorate
- * the label.
- * 
- * <p>
- * Use this label provider as a replacement for the
- * {@link DecoratingLabelProvider} when decorating styled text labels.
- * </p>
- * 
- * <p>
- * The {@link DecoratingStyledCellLabelProvider} will try to evaluate the text
- * decoration added by the {@link ILabelDecorator} and will apply the style
- * returned by {@link #getDecorationStyle(Object)}
- * </p>
- * <p>
- * The {@link ILabelDecorator} can optionally implement {@link IColorDecorator}
- * and {@link IFontDecorator} to provide foreground and background color and
- * font decoration.
- * </p>
- * 
- * @since 3.4
- */
-public class DecoratingStyledCellLabelProvider extends
-		DelegatingStyledCellLabelProvider {
-
-	private ILabelDecorator decorator;
-	private IDecorationContext decorationContext= DecorationContext.DEFAULT_CONTEXT;
-	private ILabelProviderListener labelProviderListener;
-
-	/**
-	 * Creates a {@link DecoratingStyledCellLabelProvider} that delegates the
-	 * requests for styled labels and for images to a
-	 * {@link DelegatingStyledCellLabelProvider.IStyledLabelProvider}.
-	 * 
-	 * @param labelProvider
-	 *            the styled label provider
-	 * @param decorator
-	 *            a label decorator or <code>null</code> to not decorate the
-	 *            label
-	 * @param decorationContext
-	 *            a decoration context or <code>null</code> if the no
-	 *            decorator is configured or the default decorator should be
-	 *            used
-	 */
-	public DecoratingStyledCellLabelProvider(
-			IStyledLabelProvider labelProvider, ILabelDecorator decorator,
-			IDecorationContext decorationContext) {
-		super(labelProvider);
-
-		this.decorator = decorator;
-		this.decorationContext = decorationContext != null ? decorationContext
-				: DecorationContext.DEFAULT_CONTEXT;
-		
-		this.labelProviderListener = new ILabelProviderListener() {
-			public void labelProviderChanged(LabelProviderChangedEvent event) {
-				fireLabelProviderChanged(event);
-			}
-		};
-		labelProvider.addListener(this.labelProviderListener);
-		if (decorator != null)
-			decorator.addListener(this.labelProviderListener);
-	}
-
-	/**
-	 * Returns the decoration context associated with this label provider. It
-	 * will be passed to the decorator if the decorator is an instance of
-	 * {@link LabelDecorator}.
-	 * 
-	 * @return the decoration context associated with this label provider
-	 */
-	public IDecorationContext getDecorationContext() {
-		return this.decorationContext;
-	}
-
-	/**
-	 * Set the decoration context that will be based to the decorator for this
-	 * label provider if that decorator implements {@link LabelDecorator}.
-	 * 
-	 * @param decorationContext
-	 *            the decoration context.
-	 */
-	public void setDecorationContext(IDecorationContext decorationContext) {
-		Assert.isNotNull(decorationContext);
-		this.decorationContext = decorationContext;
-	}
-
-	private boolean waitForPendingDecoration(ViewerCell cell) {
-		if (this.decorator == null)
-			return false;
-
-		Object element = cell.getElement();
-		String oldText = cell.getText();
-
-		boolean isDecorationPending = false;
-		if (this.decorator instanceof LabelDecorator) {
-			isDecorationPending = !((LabelDecorator) this.decorator)
-					.prepareDecoration(element, oldText, getDecorationContext());
-		} else if (this.decorator instanceof IDelayedLabelDecorator) {
-			isDecorationPending = !((IDelayedLabelDecorator) this.decorator)
-					.prepareDecoration(element, oldText);
-		}
-		if (isDecorationPending && oldText.length() == 0) {
-			// item is empty: is shown for the first time: don't wait
-			return false;
-		}
-		return isDecorationPending;
-	}
-
-	public void update(ViewerCell cell) {
-		if (waitForPendingDecoration(cell)) {
-			return; // wait until the decoration is ready
-		}
-		super.update(cell);
-	}
-
-	public Color getForeground(Object element) {
-		if (this.decorator instanceof IColorDecorator) {
-			Color foreground = ((IColorDecorator) this.decorator)
-					.decorateForeground(element);
-			if (foreground != null)
-				return foreground;
-		}
-		return super.getForeground(element);
-	}
-
-	public Color getBackground(Object element) {
-		if (this.decorator instanceof IColorDecorator) {
-			Color color = ((IColorDecorator) this.decorator)
-					.decorateBackground(element);
-			if (color != null)
-				return color;
-		}
-		return super.getBackground(element);
-	}
-
-	public Font getFont(Object element) {
-		if (this.decorator instanceof IFontDecorator) {
-			Font font = ((IFontDecorator) this.decorator).decorateFont(element);
-			if (font != null)
-				return font;
-		}
-		return super.getFont(element);
-	}
-
-	public Image getImage(Object element) {
-		Image image = super.getImage(element);
-		if (this.decorator == null) {
-			return image;
-		}
-		Image decorated = null;
-		if (this.decorator instanceof LabelDecorator) {
-			decorated = ((LabelDecorator) this.decorator).decorateImage(image,
-					element, getDecorationContext());
-		} else {
-			decorated = this.decorator.decorateImage(image, element);
-		}
-		if (decorated != null)
-			return decorated;
-
-		return image;
-	}
-
-	/**
-	 * Returns the styled text for the label of the given element.
-	 * 
-	 * @param element
-	 *            the element for which to provide the styled label text
-	 * @return the styled text string used to label the element
-	 */
-	protected StyledString getStyledText(Object element) {
-		StyledString styledString = super.getStyledText(element);
-		if (this.decorator == null) {
-			return styledString;
-		}
-
-		String label = styledString.getString();
-		String decorated;
-		if (this.decorator instanceof LabelDecorator) {
-			decorated = ((LabelDecorator) this.decorator).decorateText(label,
-					element, getDecorationContext());
-		} else {
-			decorated = this.decorator.decorateText(label, element);
-		}
-		if (decorated == null)
-			return styledString;
-
-		int originalStart = decorated.indexOf(label);
-		if (originalStart == -1) {
-			return new StyledString(decorated); // the decorator did
-														// something wild
-		}
-
-		if (decorated.length() == label.length())
-			return styledString;
-
-		Styler style = getDecorationStyle(element);
-		if (originalStart > 0) {
-			StyledString newString = new StyledString(decorated
-					.substring(0, originalStart), style);
-			newString.append(styledString);
-			styledString = newString;
-		}
-		if (decorated.length() > originalStart + label.length()) { // decorator
-																	// appended
-																	// something
-			return styledString.append(decorated.substring(originalStart
-					+ label.length()), style);
-		}
-		return styledString;
-	}
-
-	/**
-	 * Sets the {@link StyledString.Styler} to be used for string
-	 * decorations. By default the
-	 * {@link StyledString#DECORATIONS_STYLER decoration style}. Clients
-	 * can override.
-	 * 
-	 * Note that it is the client's responsibility to react on color changes of
-	 * the decoration color by refreshing the view
-	 * 
-	 * @param element
-	 *            the element that has been decorated
-	 * 
-	 * @return return the decoration style
-	 */
-	protected Styler getDecorationStyle(Object element) {
-		return StyledString.DECORATIONS_STYLER;
-	}
-
-	/**
-	 * Returns the decorator or <code>null</code> if no decorator is installed
-	 * 
-	 * @return the decorator or <code>null</code> if no decorator is installed
-	 */
-	public ILabelDecorator getLabelDecorator() {
-		return this.decorator;
-	}
-
-	/**
-	 * Sets the label decorator. Removes all known listeners from the old
-	 * decorator, and adds all known listeners to the new decorator. The old
-	 * decorator is not disposed. Fires a label provider changed event
-	 * indicating that all labels should be updated. Has no effect if the given
-	 * decorator is identical to the current one.
-	 * 
-	 * @param newDecorator
-	 *            the label decorator, or <code>null</code> if no decorations
-	 *            are to be applied
-	 */
-	public void setLabelDecorator(ILabelDecorator newDecorator) {
-		ILabelDecorator oldDecorator = this.decorator;
-		if (oldDecorator != newDecorator) {
-			if (oldDecorator != null)
-				oldDecorator.removeListener(this.labelProviderListener);
-			this.decorator = newDecorator;
-			if (newDecorator != null) {
-				newDecorator.addListener(this.labelProviderListener);
-			}
-		}
-		fireLabelProviderChanged(new LabelProviderChangedEvent(this));
-	}
-
-	public void addListener(ILabelProviderListener listener) {
-		super.addListener(listener);
-		if (this.decorator != null) {
-			this.decorator.addListener(this.labelProviderListener);
-		}
-	}
-
-	public void removeListener(ILabelProviderListener listener) {
-		super.removeListener(listener);
-		if (this.decorator != null) {
-			this.decorator.removeListener(this.labelProviderListener);
-		}
-	}
-
-	public boolean isLabelProperty(Object element, String property) {
-		if (super.isLabelProperty(element, property)) {
-			return true;
-		}
-		return this.decorator != null
-				&& this.decorator.isLabelProperty(element, property);
-	}
-
-	public void dispose() {
-		super.dispose();
-		if (this.decorator != null) {
-			this.decorator.removeListener(this.labelProviderListener);
-			this.decorator.dispose();
-			this.decorator = null;
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DecorationContext.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DecorationContext.java
deleted file mode 100644
index 3cd5aa1..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DecorationContext.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A concrete implementation of the {@link IDecorationContext} interface,
- * suitable for instantiating.
- * <p>
- * This class is not intended to be subclassed.
- * </p>
- * @since 3.2
- */
-public class DecorationContext implements IDecorationContext {
-	
-	/**
-	 * Constant that defines a default decoration context that has
-	 * no context ids associated with it.
-	 */
-	public static final IDecorationContext DEFAULT_CONTEXT = new DecorationContext();
-	
-	private Map properties = new HashMap();
-
-	/**
-	 * Create a decoration context.
-	 */
-	public DecorationContext() {
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IDecorationContext#getProperty(java.lang.String)
-	 */
-	public Object getProperty(String property) {
-		return properties.get(property);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IDecorationContext#getProperties()
-	 */
-	public String[] getProperties() {
-		return (String[]) properties.keySet().toArray(new String[properties.size()]);
-	}
-
-	/**
-	 * Set the given property to the given value. Setting the value of
-	 * a property to <code>null</code> removes the property from
-	 * the context.
-	 * @param property the property
-	 * @param value the value of the property or <code>null</code>
-	 * if the property is to be removed.
-	 */
-	public void putProperty(String property, Object value) {
-		if (value == null) {
-			properties.remove(property);
-		} else {
-			properties.put(property, value);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DecorationOverlayIcon.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DecorationOverlayIcon.java
deleted file mode 100644
index 6e868da..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DecorationOverlayIcon.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.Arrays;
-
-import org.eclipse.jface.resource.CompositeImageDescriptor;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.*;
-
-/**
- * A <code>DecorationOverlayIcon</code> is an image descriptor that can be used
- * to overlay decoration images on to the 4 corner quadrants of a base image.
- * The four quadrants are {@link IDecoration#TOP_LEFT}, {@link IDecoration#TOP_RIGHT},
- * {@link IDecoration#BOTTOM_LEFT} and {@link IDecoration#BOTTOM_RIGHT}. Additionally,
- * the overlay can be used to provide an underlay corresponding to {@link IDecoration#UNDERLAY}. 
- * 
- * @since 3.3
- * @see IDecoration
- */
-public class DecorationOverlayIcon extends CompositeImageDescriptor {
-	
-    // the base image
-    private Image base;
-
-    // the overlay images
-    private ImageDescriptor[] overlays;
-
-    // the size
-    private Point size;
-
-    /**
-     * Create the decoration overlay for the base image using the array of
-     * provided overlays. The indices of the array correspond to the values
-     * of the 5 overlay constants defined on {@link IDecoration} 
-     * ({@link IDecoration#TOP_LEFT}, {@link IDecoration#TOP_RIGHT},
-     * {@link IDecoration#BOTTOM_LEFT}, {@link IDecoration#BOTTOM_RIGHT} 
-     * and{@link IDecoration#UNDERLAY}).
-     * 
-     * @param baseImage the base image
-     * @param overlaysArray the overlay images
-     * @param sizeValue the size of the resulting image
-     */
-    public DecorationOverlayIcon(Image baseImage,
-            ImageDescriptor[] overlaysArray, Point sizeValue) {
-        this.base = baseImage;
-        this.overlays = overlaysArray;
-        this.size = sizeValue;
-    }
-    
-    /**
-     * Create the decoration overlay for the base image using the array of
-     * provided overlays. The indices of the array correspond to the values
-     * of the 5 overlay constants defined on {@link IDecoration} 
-     * ({@link IDecoration#TOP_LEFT}, {@link IDecoration#TOP_RIGHT},
-     * {@link IDecoration#BOTTOM_LEFT}, {@link IDecoration#BOTTOM_RIGHT} 
-     * and {@link IDecoration#UNDERLAY}).
-     * 
-     * @param baseImage the base image
-     * @param overlaysArray the overlay images
-     */
-    public DecorationOverlayIcon(Image baseImage, ImageDescriptor[] overlaysArray) {
-    	this(baseImage, overlaysArray, new Point(baseImage.getBounds().width, baseImage.getBounds().height));
-    }
-
-    /**
-     * Create a decoration overlay icon that will place the given overlay icon in
-     * the given quadrant of the base image.
-	 * @param baseImage the base image
-	 * @param overlayImage the overlay image
-	 * @param quadrant the quadrant (one of {@link IDecoration} 
-     * ({@link IDecoration#TOP_LEFT}, {@link IDecoration#TOP_RIGHT},
-     * {@link IDecoration#BOTTOM_LEFT}, {@link IDecoration#BOTTOM_RIGHT} 
-     * or {@link IDecoration#UNDERLAY})
-	 */
-	public DecorationOverlayIcon(Image baseImage, ImageDescriptor overlayImage, int quadrant) {
-		this(baseImage, createArrayFrom(overlayImage, quadrant));
-	}
-
-	/**
-	 * Convert the given image and quadrant into the proper input array.
-	 * @param overlayImage the overlay image
-	 * @param quadrant the quadrant
-	 * @return an array with the given image in the proper quadrant
-	 */
-	private static ImageDescriptor[] createArrayFrom(
-			ImageDescriptor overlayImage, int quadrant) {
-		ImageDescriptor[] descs = new ImageDescriptor[] { null, null, null, null, null };
-		descs[quadrant] = overlayImage;
-		return descs;
-	}
-
-	/**
-     * Draw the overlays for the receiver.
-     * @param overlaysArray 
-     */
-    private void drawOverlays(ImageDescriptor[] overlaysArray) {
-
-        for (int i = 0; i < overlays.length; i++) {
-            ImageDescriptor overlay = overlaysArray[i];
-            if (overlay == null) {
-				continue;
-			}
-            ImageData overlayData = overlay.getImageData();
-            //Use the missing descriptor if it is not there.
-            if (overlayData == null) {
-				overlayData = ImageDescriptor.getMissingImageDescriptor()
-                        .getImageData();
-			}
-            switch (i) {
-            case IDecoration.TOP_LEFT:
-                drawImage(overlayData, 0, 0);
-                break;
-            case IDecoration.TOP_RIGHT:
-                drawImage(overlayData, size.x - overlayData.width, 0);
-                break;
-            case IDecoration.BOTTOM_LEFT:
-                drawImage(overlayData, 0, size.y - overlayData.height);
-                break;
-            case IDecoration.BOTTOM_RIGHT:
-                drawImage(overlayData, size.x - overlayData.width, size.y
-                        - overlayData.height);
-                break;
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    public boolean equals(Object o) {
-        if (!(o instanceof DecorationOverlayIcon)) {
-			return false;
-		}
-        DecorationOverlayIcon other = (DecorationOverlayIcon) o;
-        return base.equals(other.base)
-                && Arrays.equals(overlays, other.overlays);
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#hashCode()
-     */
-    public int hashCode() {
-        int code = System.identityHashCode(base);
-        for (int i = 0; i < overlays.length; i++) {
-            if (overlays[i] != null) {
-				code ^= overlays[i].hashCode();
-			}
-        }
-        return code;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.CompositeImageDescriptor#drawCompositeImage(int, int)
-     */
-    protected void drawCompositeImage(int width, int height) {
-    	if (overlays.length > IDecoration.UNDERLAY) {
-	        ImageDescriptor underlay = overlays[IDecoration.UNDERLAY];
-	        if (underlay != null) {
-				drawImage(underlay.getImageData(), 0, 0);
-			}
-    	}
-    	if (overlays.length > IDecoration.REPLACE && overlays[IDecoration.REPLACE] != null) {
-    		drawImage(overlays[IDecoration.REPLACE].getImageData(), 0, 0);
-    	} else {
-    		drawImage(base.getImageData(), 0, 0);
-    	}
-        drawOverlays(overlays);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.CompositeImageDescriptor#getSize()
-     */
-    protected Point getSize() {
-        return size;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.resource.CompositeImageDescriptor#getTransparentPixel()
-     */
-    protected int getTransparentPixel() {
-    	return base.getImageData().transparentPixel;
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DelegatingStyledCellLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DelegatingStyledCellLabelProvider.java
deleted file mode 100644
index 6e7607b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DelegatingStyledCellLabelProvider.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.Arrays;
-
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A {@link DelegatingStyledCellLabelProvider} is a
- * {@link StyledCellLabelProvider} that delegates requests for the styled string
- * and the image to a
- * {@link DelegatingStyledCellLabelProvider.IStyledLabelProvider}.
- * 
- * <p>
- * Existing label providers can be enhanced by implementing
- * {@link DelegatingStyledCellLabelProvider.IStyledLabelProvider} so they can be
- * used in viewers with styled labels.
- * </p>
- * 
- * <p>
- * The {@link DelegatingStyledCellLabelProvider.IStyledLabelProvider} can
- * optionally implement {@link IColorProvider} and {@link IFontProvider} to
- * provide foreground and background color and a default font.
- * </p>
- * 
- * @since 3.4
- */
-public class DelegatingStyledCellLabelProvider extends StyledCellLabelProvider {
-
-	/**
-	 * Interface marking a label provider that provides styled text labels and
-	 * images.
-	 * <p>
-	 * The {@link DelegatingStyledCellLabelProvider.IStyledLabelProvider} can
-	 * optionally implement {@link IColorProvider} and {@link IFontProvider} to
-	 * provide foreground and background color and a default font.
-	 * </p>
-	 */
-	public static interface IStyledLabelProvider extends IBaseLabelProvider {
-
-		/**
-		 * Returns the styled text label for the given element
-		 * 
-		 * @param element
-		 *            the element to evaluate the styled string for
-		 * 
-		 * @return the styled string.
-		 */
-		public StyledString getStyledText(Object element);
-
-		/**
-		 * Returns the image for the label of the given element. The image is
-		 * owned by the label provider and must not be disposed directly.
-		 * Instead, dispose the label provider when no longer needed.
-		 * 
-		 * @param element
-		 *            the element for which to provide the label image
-		 * @return the image used to label the element, or <code>null</code>
-		 *         if there is no image for the given object
-		 */
-		public Image getImage(Object element);
-	}
-
-	private IStyledLabelProvider styledLabelProvider;
-
-	/**
-	 * Creates a {@link DelegatingStyledCellLabelProvider} that delegates the
-	 * requests for the styled labels and the images to a
-	 * {@link IStyledLabelProvider}.
-	 * 
-	 * @param labelProvider
-	 *            the label provider that provides the styled labels and the
-	 *            images
-	 */
-	public DelegatingStyledCellLabelProvider(IStyledLabelProvider labelProvider) {
-		if (labelProvider == null)
-			throw new IllegalArgumentException(
-					"Label provider must not be null"); //$NON-NLS-1$
-
-		this.styledLabelProvider = labelProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.StyledCellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell)
-	 */
-	public void update(ViewerCell cell) {
-		Object element = cell.getElement();
-
-		StyledString styledString = getStyledText(element);
-		String newText= styledString.toString();
-		
-		StyleRange[] oldStyleRanges= cell.getStyleRanges();
-		StyleRange[] newStyleRanges= isOwnerDrawEnabled() ? styledString.getStyleRanges() : null;
-		
-		if (!Arrays.equals(oldStyleRanges, newStyleRanges)) {
-			cell.setStyleRanges(newStyleRanges);
-			if (cell.getText().equals(newText)) {
-				// make sure there will be a refresh from a change
-				cell.setText(""); //$NON-NLS-1$
-			}
-		}
-		
-		cell.setText(newText);
-		cell.setImage(getImage(element));
-		cell.setFont(getFont(element));
-		cell.setForeground(getForeground(element));
-		cell.setBackground(getBackground(element));
-		
-		// no super call required. changes on item will trigger the refresh.
-	}
-
-	/**
-	 * Provides a foreground color for the given element.
-	 * 
-	 * @param element
-	 *            the element
-	 * @return the foreground color for the element, or <code>null</code> to
-	 *         use the default foreground color
-	 */
-	public Color getForeground(Object element) {
-		if (this.styledLabelProvider instanceof IColorProvider) {
-			return ((IColorProvider) this.styledLabelProvider)
-					.getForeground(element);
-		}
-		return null;
-	}
-
-	/**
-	 * Provides a background color for the given element.
-	 * 
-	 * @param element
-	 *            the element
-	 * @return the background color for the element, or <code>null</code> to
-	 *         use the default background color
-	 */
-	public Color getBackground(Object element) {
-		if (this.styledLabelProvider instanceof IColorProvider) {
-			return ((IColorProvider) this.styledLabelProvider)
-					.getBackground(element);
-		}
-		return null;
-	}
-
-	/**
-	 * Provides a font for the given element.
-	 * 
-	 * @param element
-	 *            the element
-	 * @return the font for the element, or <code>null</code> to use the
-	 *         default font
-	 */
-	public Font getFont(Object element) {
-		if (this.styledLabelProvider instanceof IFontProvider) {
-			return ((IFontProvider) this.styledLabelProvider).getFont(element);
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the image for the label of the given element. The image is owned
-	 * by the label provider and must not be disposed directly. Instead, dispose
-	 * the label provider when no longer needed.
-	 * 
-	 * @param element
-	 *            the element for which to provide the label image
-	 * @return the image used to label the element, or <code>null</code> if
-	 *         there is no image for the given object
-	 */
-	public Image getImage(Object element) {
-		return this.styledLabelProvider.getImage(element);
-	}
-
-	/**
-	 * Returns the styled text for the label of the given element.
-	 * 
-	 * @param element
-	 *            the element for which to provide the styled label text
-	 * @return the styled text string used to label the element
-	 */
-	protected StyledString getStyledText(Object element) {
-		return this.styledLabelProvider.getStyledText(element);
-	}
-
-	/**
-	 * Returns the styled string provider.
-	 * 
-	 * @return the wrapped label provider
-	 */
-	public IStyledLabelProvider getStyledStringProvider() {
-		return this.styledLabelProvider;
-	}
-
-	public void addListener(ILabelProviderListener listener) {
-		super.addListener(listener);
-		this.styledLabelProvider.addListener(listener);
-	}
-
-	public void removeListener(ILabelProviderListener listener) {
-		super.removeListener(listener);
-		this.styledLabelProvider.removeListener(listener);
-	}
-
-	public boolean isLabelProperty(Object element, String property) {
-		return this.styledLabelProvider.isLabelProperty(element, property);
-	}
-
-	public void dispose() {
-		super.dispose();
-		this.styledLabelProvider.dispose();
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DialogCellEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DialogCellEditor.java
deleted file mode 100644
index 0ad09ff..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DialogCellEditor.java
+++ /dev/null
@@ -1,388 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.text.MessageFormat;	// Not using ICU to support standalone JFace scenario
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-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.Layout;
-
-/**
- * An abstract cell editor that uses a dialog.
- * Dialog cell editors usually have a label control on the left and a button on
- * the right. Pressing the button opens a dialog window (for example, a color dialog
- * or a file dialog) to change the cell editor's value.
- * The cell editor's value is the value of the dialog.
- * <p>
- * Subclasses may override the following methods:
- * <ul>
- *	<li><code>createButton</code>: creates the cell editor's button control</li>
- *	<li><code>createContents</code>: creates the cell editor's 'display value' control</li>
- *	<li><code>updateContents</code>: updates the cell editor's 'display value' control
- * 		after its value has changed</li>
- *	<li><code>openDialogBox</code>: opens the dialog box when the end user presses
- *      the button</li>
- * </ul>
- * </p>
- */
-public abstract class DialogCellEditor extends CellEditor {
-
-    /**
-     * Image registry key for three dot image (value <code>"cell_editor_dots_button_image"</code>).
-     */
-    public static final String CELL_EDITOR_IMG_DOTS_BUTTON = "cell_editor_dots_button_image";//$NON-NLS-1$
-
-    /**
-     * The editor control.
-     */
-    private Composite editor;
-
-    /**
-     * The current contents.
-     */
-    private Control contents;
-
-    /**
-     * The label that gets reused by <code>updateLabel</code>.
-     */
-    private Label defaultLabel;
-
-    /**
-     * The button.
-     */
-    private Button button;
-
-	/**
-	 * Listens for 'focusLost' events and  fires the 'apply' event as long
-	 * as the focus wasn't lost because the dialog was opened.
-	 */
-	private FocusListener buttonFocusListener;
-
-    /**
-     * The value of this cell editor; initially <code>null</code>.
-     */
-    private Object value = null;
-
-    static {
-        ImageRegistry reg = JFaceResources.getImageRegistry();
-        reg.put(CELL_EDITOR_IMG_DOTS_BUTTON, ImageDescriptor.createFromFile(
-                DialogCellEditor.class, "images/dots_button.gif"));//$NON-NLS-1$
-    }
-
-    /**
-     * Internal class for laying out the dialog.
-     */
-    private class DialogCellLayout extends Layout {
-        public void layout(Composite editor, boolean force) {
-            Rectangle bounds = editor.getClientArea();
-            Point size = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, force);
-            if (contents != null) {
-				contents.setBounds(0, 0, bounds.width - size.x, bounds.height);
-			}
-            button.setBounds(bounds.width - size.x, 0, size.x, bounds.height);
-        }
-
-        public Point computeSize(Composite editor, int wHint, int hHint,
-                boolean force) {
-            if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT) {
-				return new Point(wHint, hHint);
-			}
-            Point contentsSize = contents.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-                    force);
-            Point buttonSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-                    force);
-            // Just return the button width to ensure the button is not clipped
-            // if the label is long.
-            // The label will just use whatever extra width there is
-            Point result = new Point(buttonSize.x, Math.max(contentsSize.y,
-                    buttonSize.y));
-            return result;
-        }
-    }
-
-    /**
-     * Default DialogCellEditor style
-     */
-    private static final int defaultStyle = SWT.NONE;
-
-    /**
-     * Creates a new dialog cell editor with no control
-     * @since 2.1
-     */
-    public DialogCellEditor() {
-        setStyle(defaultStyle);
-    }
-
-    /**
-     * Creates a new dialog cell editor parented under the given control.
-     * The cell editor value is <code>null</code> initially, and has no 
-     * validator.
-     *
-     * @param parent the parent control
-     */
-    protected DialogCellEditor(Composite parent) {
-        this(parent, defaultStyle);
-    }
-
-    /**
-     * Creates a new dialog cell editor parented under the given control.
-     * The cell editor value is <code>null</code> initially, and has no 
-     * validator.
-     *
-     * @param parent the parent control
-     * @param style the style bits
-     * @since 2.1
-     */
-    protected DialogCellEditor(Composite parent, int style) {
-        super(parent, style);
-    }
-
-    /**
-     * Creates the button for this cell editor under the given parent control.
-     * <p>
-     * The default implementation of this framework method creates the button 
-     * display on the right hand side of the dialog cell editor. Subclasses
-     * may extend or reimplement.
-     * </p>
-     *
-     * @param parent the parent control
-     * @return the new button control
-     */
-    protected Button createButton(Composite parent) {
-        Button result = new Button(parent, SWT.DOWN);
-        result.setText("..."); //$NON-NLS-1$
-        return result;
-    }
-
-    /**
-     * Creates the controls used to show the value of this cell editor.
-     * <p>
-     * The default implementation of this framework method creates
-     * a label widget, using the same font and background color as the parent control.
-     * </p>
-     * <p>
-     * Subclasses may reimplement.  If you reimplement this method, you
-     * should also reimplement <code>updateContents</code>.
-     * </p>
-     *
-     * @param cell the control for this cell editor 
-     * @return the underlying control
-     */
-    protected Control createContents(Composite cell) {
-        defaultLabel = new Label(cell, SWT.LEFT);
-        defaultLabel.setFont(cell.getFont());
-        defaultLabel.setBackground(cell.getBackground());
-        return defaultLabel;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on CellEditor.
-     */
-    protected Control createControl(Composite parent) {
-
-        Font font = parent.getFont();
-        Color bg = parent.getBackground();
-
-        editor = new Composite(parent, getStyle());
-        editor.setFont(font);
-        editor.setBackground(bg);
-        editor.setLayout(new DialogCellLayout());
-
-        contents = createContents(editor);
-        updateContents(value);
-
-        button = createButton(editor);
-        button.setFont(font);
-
-        button.addKeyListener(new KeyAdapter() {
-            /* (non-Javadoc)
-             * @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
-             */
-            public void keyReleased(KeyEvent e) {
-                if (e.character == '\u001b') { // Escape
-                    fireCancelEditor();
-                }
-            }
-        });
-        
-        button.addFocusListener(getButtonFocusListener());
-        
-        button.addSelectionListener(new SelectionAdapter() {
-            /* (non-Javadoc)
-             * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-             */
-            public void widgetSelected(SelectionEvent event) {
-            	// Remove the button's focus listener since it's guaranteed
-            	// to lose focus when the dialog opens
-            	button.removeFocusListener(getButtonFocusListener());
-                
-            	Object newValue = openDialogBox(editor);
-            	
-            	// Re-add the listener once the dialog closes
-            	button.addFocusListener(getButtonFocusListener());
-
-            	if (newValue != null) {
-                    boolean newValidState = isCorrect(newValue);
-                    if (newValidState) {
-                        markDirty();
-                        doSetValue(newValue);
-                    } else {
-                        // try to insert the current value into the error message.
-                        setErrorMessage(MessageFormat.format(getErrorMessage(),
-                                new Object[] { newValue.toString() }));
-                    }
-                    fireApplyEditorValue();
-                }
-            }
-        });
-
-        setValueValid(true);
-
-        return editor;
-    }
-
-    /* (non-Javadoc)
-     * 
-     * Override in order to remove the button's focus listener if the celleditor
-     * is deactivating.
-     * 
-     * @see org.eclipse.jface.viewers.CellEditor#deactivate()
-     */
-    public void deactivate() {
-    	if (button != null && !button.isDisposed()) {
-    		button.removeFocusListener(getButtonFocusListener());
-    	}
-    	
-		super.deactivate();
-	}
-
-	/* (non-Javadoc)
-     * Method declared on CellEditor.
-     */
-    protected Object doGetValue() {
-        return value;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on CellEditor.
-     * The focus is set to the cell editor's button. 
-     */
-    protected void doSetFocus() {
-        button.setFocus();
-        
-        // add a FocusListener to the button
-        button.addFocusListener(getButtonFocusListener());
-    }
-
-    /**
-     * Return a listener for button focus.
-     * @return FocusListener
-     */
-    private FocusListener getButtonFocusListener() {
-    	if (buttonFocusListener == null) {
-    		buttonFocusListener = new FocusListener() {
-
-				/* (non-Javadoc)
-				 * @see org.eclipse.swt.events.FocusListener#focusGained(org.eclipse.swt.events.FocusEvent)
-				 */
-				public void focusGained(FocusEvent e) {
-					// Do nothing
-				}
-
-				/* (non-Javadoc)
-				 * @see org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt.events.FocusEvent)
-				 */
-				public void focusLost(FocusEvent e) {
-					DialogCellEditor.this.focusLost();
-				}
-    		};
-    	}
-    	
-    	return buttonFocusListener;
-	}
-
-	/* (non-Javadoc)
-     * Method declared on CellEditor.
-     */
-    protected void doSetValue(Object value) {
-        this.value = value;
-        updateContents(value);
-    }
-
-    /**
-     * Returns the default label widget created by <code>createContents</code>.
-     *
-     * @return the default label widget
-     */
-    protected Label getDefaultLabel() {
-        return defaultLabel;
-    }
-
-    /**
-     * Opens a dialog box under the given parent control and returns the
-     * dialog's value when it closes, or <code>null</code> if the dialog
-     * was canceled or no selection was made in the dialog.
-     * <p>
-     * This framework method must be implemented by concrete subclasses.
-     * It is called when the user has pressed the button and the dialog
-     * box must pop up.
-     * </p>
-     *
-     * @param cellEditorWindow the parent control cell editor's window
-     *   so that a subclass can adjust the dialog box accordingly
-     * @return the selected value, or <code>null</code> if the dialog was 
-     *   canceled or no selection was made in the dialog
-     */
-    protected abstract Object openDialogBox(Control cellEditorWindow);
-
-    /**
-     * Updates the controls showing the value of this cell editor.
-     * <p>
-     * The default implementation of this framework method just converts
-     * the passed object to a string using <code>toString</code> and
-     * sets this as the text of the label widget.
-     * </p>
-     * <p>
-     * Subclasses may reimplement.  If you reimplement this method, you
-     * should also reimplement <code>createContents</code>.
-     * </p>
-     *
-     * @param value the new value of this cell editor
-     */
-    protected void updateContents(Object value) {
-        if (defaultLabel == null) {
-			return;
-		}
-
-        String text = "";//$NON-NLS-1$
-        if (value != null) {
-			text = value.toString();
-		}
-        defaultLabel.setText(text);
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DoubleClickEvent.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DoubleClickEvent.java
deleted file mode 100644
index 156f3f4..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/DoubleClickEvent.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.EventObject;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * Event object describing a double-click. The source of these
- * events is a viewer.
- *
- * @see IDoubleClickListener
- */
-public class DoubleClickEvent extends EventObject {
-
-    /**
-     * Generated serial version UID for this class.
-     * @since 3.1
-     */
-    private static final long serialVersionUID = 3258408443605038133L;
-    
-    /**
-     * The selection.
-     */
-    protected ISelection selection;
-
-    /**
-     * Creates a new event for the given source and selection.
-     *
-     * @param source the viewer
-     * @param selection the selection
-     */
-    public DoubleClickEvent(Viewer source, ISelection selection) {
-        super(source);
-        Assert.isNotNull(selection);
-        this.selection = selection;
-    }
-
-    /**
-     * Returns the selection.
-     *
-     * @return the selection
-     */
-    public ISelection getSelection() {
-        return selection;
-    }
-
-    /**
-     * Returns the viewer that is the source of this event.
-     *
-     * @return the originating viewer
-     */
-    public Viewer getViewer() {
-        return (Viewer) getSource();
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/EditingSupport.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/EditingSupport.java
deleted file mode 100644
index dd222a1..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/EditingSupport.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *     											   fix in bug 151295,167325,201905
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * EditingSupport is the abstract superclass of the support for cell editing.
- *
- * @since 3.3
- *
- */
-public abstract class EditingSupport {
-
-	private ColumnViewer viewer;
-
-	/**
-	 * @param viewer
-	 *            a new viewer
-	 */
-	public EditingSupport(ColumnViewer viewer) {
-		Assert.isNotNull(viewer, "Viewer is not allowed to be null"); //$NON-NLS-1$
-		this.viewer = viewer;
-	}
-
-	/**
-	 * The editor to be shown
-	 *
-	 * @param element
-	 *            the model element
-	 * @return the CellEditor
-	 */
-	protected abstract CellEditor getCellEditor(Object element);
-
-	/**
-	 * Is the cell editable
-	 *
-	 * @param element
-	 *            the model element
-	 * @return true if editable
-	 */
-	protected abstract boolean canEdit(Object element);
-
-	/**
-	 * Get the value to set to the editor
-	 *
-	 * @param element
-	 *            the model element
-	 * @return the value shown
-	 */
-	protected abstract Object getValue(Object element);
-
-	/**
-	 * Sets the new value on the given element. Note that implementers need to
-	 * ensure that <code>getViewer().update(element, null)</code> or similar
-	 * methods are called, either directly or through some kind of listener
-	 * mechanism on the implementer's model, to cause the new value to appear in
-	 * the viewer.
-	 * 
-	 * <p>
-	 * <b>Subclasses should overwrite.</b>
-	 * </p>
-	 * 
-	 * @param element
-	 *            the model element
-	 * @param value
-	 *            the new value
-	 */
-	protected abstract void setValue(Object element, Object value);
-
-	/**
-	 * @return the viewer this editing support works for
-	 */
-	public ColumnViewer getViewer() {
-		return viewer;
-	}
-
-	/**
-	 * Initialize the editor. Frameworks like Databinding can hook in here and provide
-	 * a customized implementation. <p><b>Standard customers should not overwrite this method but {@link #getValue(Object)}</b></p>
-	 *
-	 * @param cellEditor
-	 *            the cell editor
-	 * @param cell
-	 *            the cell the editor is working for
-	 */
-	protected void initializeCellEditorValue(CellEditor cellEditor, ViewerCell cell) {
-		Object value = getValue(cell.getElement());
-		cellEditor.setValue(value);
-	}
-
-	/**
-	 * Save the value of the cell editor back to the model. Frameworks like Databinding can hook in here and provide
-	 * a customized implementation. <p><b>Standard customers should not overwrite this method but {@link #setValue(Object, Object)} </b></p>
-	 * @param cellEditor
-	 *            the cell-editor
-	 * @param cell
-	 * 			  the cell the editor is working for
-	 */
-	protected void saveCellEditorValue(CellEditor cellEditor, ViewerCell cell) {
-		Object value = cellEditor.getValue();
-		setValue(cell.getElement(), value);
-	}
-
-	boolean isLegacySupport() {
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/FocusCellHighlighter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/FocusCellHighlighter.java
deleted file mode 100644
index 88f3cd8..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/FocusCellHighlighter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *     											   bugfix in: 182800
- ******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-/**
- * @since 3.3
- *
- */
-public abstract class FocusCellHighlighter {
-	private ColumnViewer viewer;
-
-	/**
-	 * @param viewer
-	 */
-	public FocusCellHighlighter(ColumnViewer viewer) {
-		this.viewer = viewer;
-	}
-
-	/**
-	 * @return the focus cell
-	 */
-	public ViewerCell getFocusCell() {
-		return viewer.getColumnViewerEditor().getFocusCell();
-	}
-
-	/**
-	 * Called by the framework when the focus cell has changed. Subclasses may
-	 * extend.
-	 *
-	 * @param cell
-	 *            the new focus cell
-	 * @deprecated use {@link #focusCellChanged(ViewerCell, ViewerCell)} instead
-	 */
-	protected void focusCellChanged(ViewerCell cell) {
-	}
-
-	/**
-	 * Called by the framework when the focus cell has changed. Subclasses may
-	 * extend.
-	 * <p>
-	 * <b>The default implementation for this method calls
-	 * focusCellChanged(ViewerCell). Subclasses should override this method
-	 * rather than {@link #focusCellChanged(ViewerCell)} .</b>
-	 *
-	 * @param newCell
-	 *            the new focus cell or <code>null</code> if no new cell
-	 *            receives the focus
-	 * @param oldCell
-	 *            the old focus cell or <code>null</code> if no cell has been
-	 *            focused before
-	 * @since 3.4
-	 */
-	protected void focusCellChanged(ViewerCell newCell, ViewerCell oldCell) {
-		focusCellChanged(newCell);
-	}
-
-	/**
-	 * This method is called by the framework to initialize this cell
-	 * highlighter object. Subclasses may extend.
-	 */
-	protected void init() {
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/FocusCellOwnerDrawHighlighter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/FocusCellOwnerDrawHighlighter.java
deleted file mode 100644
index 53dc7ca..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/FocusCellOwnerDrawHighlighter.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * 	   IBM Corporation - initial API and implementation
- * 	   Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- * 												 - fix for bug 183850, 182652, 182800, 215069
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * A concrete implementation of {@link FocusCellHighlighter} using by setting
- * the control into owner draw mode and highlighting the currently selected
- * cell. To make the use this class you should create the control with the
- * {@link SWT#FULL_SELECTION} bit set
- * 
- * This class can be subclassed to configure how the coloring of the selected
- * cell.
- * 
- * @since 3.3
- * 
- */
-public class FocusCellOwnerDrawHighlighter extends FocusCellHighlighter {
-	/**
-	 * Create a new instance which can be passed to a
-	 * {@link TreeViewerFocusCellManager}
-	 * 
-	 * @param viewer
-	 *            the viewer
-	 */
-	public FocusCellOwnerDrawHighlighter(ColumnViewer viewer) {
-		super(viewer);
-		hookListener(viewer);
-	}
-
-	private void markFocusedCell(Event event, ViewerCell cell) {
-		Color background = (cell.getControl().isFocusControl()) ? getSelectedCellBackgroundColor(cell)
-				: getSelectedCellBackgroundColorNoFocus(cell);
-		Color foreground = (cell.getControl().isFocusControl()) ? getSelectedCellForegroundColor(cell)
-				: getSelectedCellForegroundColorNoFocus(cell);
-
-		if (foreground != null || background != null || onlyTextHighlighting(cell)) {
-			GC gc = event.gc;
-
-			if (background == null) {
-				background = cell.getItem().getDisplay().getSystemColor(
-						SWT.COLOR_LIST_SELECTION);
-			}
-
-			if (foreground == null) {
-				foreground = cell.getItem().getDisplay().getSystemColor(
-						SWT.COLOR_LIST_SELECTION_TEXT);
-			}
-
-			gc.setBackground(background);
-			gc.setForeground(foreground);
-			
-			if (onlyTextHighlighting(cell)) {
-				Rectangle area = event.getBounds();
-				Rectangle rect = cell.getTextBounds();
-				if( rect != null ) {
-					area.x = rect.x;
-				}
-				gc.fillRectangle(area);
-			} else {
-				gc.fillRectangle(event.getBounds());
-			}
-			
-			event.detail &= ~SWT.SELECTED;
-		}
-	}
-
-	private void removeSelectionInformation(Event event, ViewerCell cell) {
-		GC gc = event.gc;
-		gc.setBackground(cell.getViewerRow().getBackground(
-				cell.getColumnIndex()));
-		gc.setForeground(cell.getViewerRow().getForeground(
-				cell.getColumnIndex()));
-		gc.fillRectangle(cell.getBounds());
-		event.detail &= ~SWT.SELECTED;
-	}
-
-	private void hookListener(final ColumnViewer viewer) {
-
-		Listener listener = new Listener() {
-
-			public void handleEvent(Event event) {
-				if ((event.detail & SWT.SELECTED) > 0) {
-					ViewerCell focusCell = getFocusCell();
-					ViewerRow row = viewer.getViewerRowFromItem(event.item);
-
-					Assert
-							.isNotNull(row,
-									"Internal structure invalid. Item without associated row is not possible."); //$NON-NLS-1$
-
-					ViewerCell cell = row.getCell(event.index);
-
-					if (focusCell == null || !cell.equals(focusCell)) {
-						removeSelectionInformation(event, cell);
-					} else {
-						markFocusedCell(event, cell);
-					}
-				}
-			}
-
-		};
-		viewer.getControl().addListener(SWT.EraseItem, listener);
-	}
-
-	/**
-	 * The color to use when rendering the background of the selected cell when
-	 * the control has the input focus
-	 * 
-	 * @param cell
-	 *            the cell which is colored
-	 * @return the color or <code>null</code> to use the default
-	 */
-	protected Color getSelectedCellBackgroundColor(ViewerCell cell) {
-		return null;
-	}
-
-	/**
-	 * The color to use when rendering the foreground (=text) of the selected
-	 * cell when the control has the input focus
-	 * 
-	 * @param cell
-	 *            the cell which is colored
-	 * @return the color or <code>null</code> to use the default
-	 */
-	protected Color getSelectedCellForegroundColor(ViewerCell cell) {
-		return null;
-	}
-
-	/**
-	 * The color to use when rendering the foreground (=text) of the selected
-	 * cell when the control has <b>no</b> input focus
-	 * 
-	 * @param cell
-	 *            the cell which is colored
-	 * @return the color or <code>null</code> to use the same used when
-	 *         control has focus
-	 * @since 3.4
-	 */
-	protected Color getSelectedCellForegroundColorNoFocus(ViewerCell cell) {
-		return null;
-	}
-
-	/**
-	 * The color to use when rendering the background of the selected cell when
-	 * the control has <b>no</b> input focus
-	 * 
-	 * @param cell
-	 *            the cell which is colored
-	 * @return the color or <code>null</code> to use the same used when
-	 *         control has focus
-	 * @since 3.4
-	 */
-	protected Color getSelectedCellBackgroundColorNoFocus(ViewerCell cell) {
-		return null;
-	}
-
-	/**
-	 * Controls whether the whole cell or only the text-area is highlighted
-	 * 
-	 * @param cell
-	 *            the cell which is highlighted
-	 * @return <code>true</code> if only the text area should be highlighted
-	 * @since 3.4
-	 */
-	protected boolean onlyTextHighlighting(ViewerCell cell) {
-		return false;
-	}
-
-	protected void focusCellChanged(ViewerCell newCell, ViewerCell oldCell) {
-		super.focusCellChanged(newCell, oldCell);
-
-		// Redraw new area
-		if (newCell != null) {
-			Rectangle rect = newCell.getBounds();
-			int x = newCell.getColumnIndex() == 0 ? 0 : rect.x;
-			int width = newCell.getColumnIndex() == 0 ? rect.x + rect.width
-					: rect.width;
-			// 1 is a fix for Linux-GTK
-			newCell.getControl().redraw(x, rect.y - 1, width, rect.height + 1,
-					true);
-		}
-
-		if (oldCell != null) {
-			Rectangle rect = oldCell.getBounds();
-			int x = oldCell.getColumnIndex() == 0 ? 0 : rect.x;
-			int width = oldCell.getColumnIndex() == 0 ? rect.x + rect.width
-					: rect.width;
-			// 1 is a fix for Linux-GTK
-			oldCell.getControl().redraw(x, rect.y - 1, width, rect.height + 1,
-					true);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IBaseLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IBaseLabelProvider.java
deleted file mode 100644
index a6af26a6..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IBaseLabelProvider.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * A label provider maps an element of the viewer's model to
- * an optional image and optional text string used to display
- * the element in the viewer's control.  Certain label providers
- * may allow multiple labels per element.  
- * This is an "abstract interface", defining methods common 
- * to all label providers, but does not actually define the methods 
- * to get the label(s) for an element.  This interface should never
- * be directly implemented.
- * Most viewers will take either an <code>ILabelProvider</code> or
- * an <code>ITableLabelProvider</code>.
- * <p>
- * A label provider must not be shared between viewers 
- * since a label provider generally manages SWT resources (images),
- * which must be disposed when the viewer is disposed.
- * To simplify life cycle management, the current label provider 
- * of a viewer is disposed when the viewer is disposed.
- * </p>
- * <p>
- * Label providers can be used outside the context of viewers wherever
- * images are needed.  When label providers are used in this fashion
- * it is the responsibility of the user to ensure <code>dispose</code>
- * is called when the provider is no longer needed.
- * </p>
- *
- * @see ILabelProvider
- * @see ITableLabelProvider
- */
-public interface IBaseLabelProvider {
-    /**
-     * Adds a listener to this label provider. 
-     * Has no effect if an identical listener is already registered.
-     * <p>
-     * Label provider listeners are informed about state changes 
-     * that affect the rendering of the viewer that uses this label provider.
-     * </p>
-     *
-     * @param listener a label provider listener
-     */
-    public void addListener(ILabelProviderListener listener);
-
-    /**
-     * Disposes of this label provider.  When a label provider is
-     * attached to a viewer, the viewer will automatically call
-     * this method when the viewer is being closed.  When label providers
-     * are used outside of the context of a viewer, it is the client's
-     * responsibility to ensure that this method is called when the
-     * provider is no longer needed.
-     */
-    public void dispose();
-
-    /**
-     * Returns whether the label would be affected 
-     * by a change to the given property of the given element.
-     * This can be used to optimize a non-structural viewer update.
-     * If the property mentioned in the update does not affect the label,
-     * then the viewer need not update the label.
-     *
-     * @param element the element
-     * @param property the property
-     * @return <code>true</code> if the label would be affected,
-     *    and <code>false</code> if it would be unaffected
-     */
-    public boolean isLabelProperty(Object element, String property);
-
-    /**
-     * Removes a listener to this label provider.
-     * Has no affect if an identical listener is not registered.
-     *
-     * @param listener a label provider listener
-     */
-    public void removeListener(ILabelProviderListener listener);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IBasicPropertyConstants.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IBasicPropertyConstants.java
deleted file mode 100644
index cad8e42..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IBasicPropertyConstants.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * Predefined property names used for elements displayed in viewers.
- *
- * @see StructuredViewer#update(Object, String[])
- * @see StructuredViewer#update(Object[], String[])
- * @see IBaseLabelProvider#isLabelProperty
- * @see ViewerComparator#isSorterProperty
- * @see ViewerFilter#isFilterProperty
- */
-public interface IBasicPropertyConstants {
-
-    /**
-     * Property name constant (value <code>"org.eclipse.jface.text"</code>)
-     * for an element's label text.
-     *
-     * @see org.eclipse.jface.viewers.ILabelProvider#getText
-     */
-    public static final String P_TEXT = "org.eclipse.jface.text"; //$NON-NLS-1$
-
-    /**
-     * Property name constant (value <code>"org.eclipse.jface.image"</code>)
-     * for an element's label image.
-     *
-     * @see org.eclipse.jface.viewers.ILabelProvider#getImage
-     */
-    public static final String P_IMAGE = "org.eclipse.jface.image"; //$NON-NLS-1$
-
-    /**
-     * Property name constant (value <code>"org.eclipse.jface.children"</code>)
-     * for an element's children.
-     */
-    public static final String P_CHILDREN = "org.eclipse.jface.children"; //$NON-NLS-1$
-
-    /**
-     * Property name constant (value <code>"org.eclipse.jface.parent"</code>)
-     * for an element's parent object.
-     */
-    public static final String P_PARENT = "org.eclipse.jface.parent"; //$NON-NLS-1$
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICellEditorListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICellEditorListener.java
deleted file mode 100644
index 697af3f..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICellEditorListener.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * A listener which is notified of significant events in the
- * life of a cell editor.
- * <p>
- * This interface should be implemented by classes that wish to
- * react to cell editor activity.
- * </p>
- * <p>
- * Note: the cell editor is not passed as a parameter to any
- * of these methods; so the assumption is that the listener
- * knows which cell editor is talking to it.
- * </p>
- */
-public interface ICellEditorListener {
-    /**
-     * Notifies that the end user has requested applying a value.
-     * All cell editors send this notification.
-     * <p>
-     * The normal reaction is to update the model with the current cell editor value.
-     * However, if the value is not valid, it should not be applied. 
-     * A typical text-based cell editor would send this message
-     * when the end user hits Return, whereas other editors would
-     * send it whenever their value changes.
-     * </p>
-     */
-    public void applyEditorValue();
-
-    /**
-     * Notifies that the end user has canceled editing.
-     * All cell editors send this notification.
-     * A listener should <b>not</b> update the model based on this
-     * notification; see <code>applyEditorValue</code>.
-     */
-    public void cancelEditor();
-
-    /**
-     * Notifies that the end user is changing the value in the cell editor. This
-     * notification is normally sent only by text-based editors in response to a
-     * keystroke, so that the listener may show an error message reflecting the
-     * current valid state. This notification is sent while the value is being
-     * actively edited, before the value is applied or canceled.  A listener should
-     * <b>not</b> update the model based on this notification; see
-     * <code>applyEditorValue</code>.
-     * <p>
-     * If the <code>newValidState</code> parameter is <code>true</code>,
-     * the new value may be retrieved by calling <code>ICellEditor.getValue</code>
-     * on the appropriate cell editor.
-     * </p>
-     * 
-     * @param oldValidState the valid state before the end user changed the value
-     * @param newValidState the current valid state
-     */
-    public void editorValueChanged(boolean oldValidState, boolean newValidState);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICellEditorValidator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICellEditorValidator.java
deleted file mode 100644
index 8722111..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICellEditorValidator.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * An interface for validating a cell editor's input.
- * <p>
- * This interface should be implemented by classes that wish to
- * act as cell editor validators.
- * </p>
- */
-public interface ICellEditorValidator {
-    /**
-     * Returns a string indicating whether the given value is valid;
-     * <code>null</code> means valid, and non-<code>null</code> means
-     * invalid, with the result being the error message to display
-     * to the end user.
-     * <p>
-     * It is the responsibility of the implementor to fully format the
-     * message before returning it.
-     * </p>
-     * 
-     * @param value the value to be validated
-     * @return the error message, or <code>null</code> indicating
-     *	that the value is valid
-     */
-    public String isValid(Object value);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICellModifier.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICellModifier.java
deleted file mode 100644
index 372eae0..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICellModifier.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * A cell modifier is used to access the data model from a cell
- * editor in an abstract way. It offers methods to:
- * <ul>
- *	<li>to check if a a model element's property can be edited or not</li>
- *	<li>retrieve a value a model element's property</li>
- *	<li>to store a cell editor's value back into the model 
- *    element's property</li>
- * </ul>
- * <p>
- * This interface should be implemented by classes that wish to
- * act as cell modifiers.
- * </p>
- */
-public interface ICellModifier {
-    /**
-     * Checks whether the given property of the given element can be 
-     * modified.
-     *
-     * @param element the element
-     * @param property the property
-     * @return <code>true</code> if the property can be modified,
-     *   and <code>false</code> if it is not modifiable
-     */
-    public boolean canModify(Object element, String property);
-
-    /**
-     * Returns the value for the given property of the given element.
-     * Returns <code>null</code> if the element does not have the given property.
-     *
-     * @param element the element
-     * @param property the property
-     * @return the property value
-     */
-    public Object getValue(Object element, String property);
-
-    /**
-     * Modifies the value for the given property of the given element.
-     * Has no effect if the element does not have the given property,
-     * or if the property cannot be modified.
-     * <p>
-     * Note that it is possible for an SWT Item to be passed instead of 
-     * the model element. To handle this case in a safe way, use: 
-     * <pre>
-     *     if (element instanceof Item) {
-     *         element = ((Item) element).getData();
-     *     }
-     *     // modify the element's property here
-     * </pre>
-     * </p>
-     * 
-     * @param element the model element or SWT Item (see above)
-     * @param property the property
-     * @param value the new property value
-     * 
-     * @see org.eclipse.swt.widgets.Item
-     */
-    public void modify(Object element, String property, Object value);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICheckStateListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICheckStateListener.java
deleted file mode 100644
index 74586f9..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICheckStateListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * A listener which is notified of changes to the checked
- * state of items in checkbox viewers.
- *
- * @see CheckStateChangedEvent
- */
-public interface ICheckStateListener {
-    /**
-     * Notifies of a change to the checked state of an element.
-     *
-     * @param event event object describing the change
-     */
-    void checkStateChanged(CheckStateChangedEvent event);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICheckStateProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICheckStateProvider.java
deleted file mode 100644
index 1eb9c82..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICheckStateProvider.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-/**
- * Interface to provide checked and grayed state information about data in trees
- * or tables. The following chart determines the checkbox state:
- * <table border="1">
- * 	<tr align="center">
- * 		<td/>
- * 		<td/>
- * 		<td colspan="2"><strong><code>isGrayed()</code></strong></td>
- * 	</tr>
- * 	<tr align="center">
- * 		<td/>
- * 		<td/>
- * 		<td><code>false</code></td>
- * 		<td><code>true</code></td>
- * 	</tr>
- * 	<tr align="center">
- * 		<td rowspan="2"><strong><code>isChecked()</code></strong></td>
- * 		<td><code>false</code></td>
- * 		<td colspan="2">unchecked</td>
- * 	</tr>
- * 	<tr align="center">
- * 		<td><code>true</code></td>
- * 		<td>checked</td>
- * 		<td>grayed</td>
- * 	</tr>
- * </table>
- * @since 3.5
- */
-public interface ICheckStateProvider {
-	
-	/**
-	 * Indicates if an element's representation should appear as checked or 
-	 * gray instead of unchecked. If this method returns <code>true</code>
-	 * the {@link ICheckStateProvider#isGrayed(Object)} method will determine
-	 * whether the check box displays a check mark ("checked") or a box 
-	 * ("grayed").
-	 * @param element 
-	 * @return true if the element should be checked or grayed, false if it 
-	 * 		should be unchecked
-	 */
-	public boolean isChecked(Object element);
-	
-	/**
-	 * Indicates whether the check box associated with an element, when checked
-	 * as indicated by the {@link ICheckStateProvider#isChecked(Object)} method,
-	 * should display the gray (boxed) state instead of the check mark.  
-	 * @param element
-	 * @return true if the element should be gray
-	 */
-	public boolean isGrayed(Object element);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICheckable.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICheckable.java
deleted file mode 100644
index 37143c6..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ICheckable.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * Interface for objects that support elements with a checked state.
- *
- * @see ICheckStateListener
- * @see CheckStateChangedEvent
- */
-public interface ICheckable {
-    /**
-     * Adds a listener for changes to the checked state of elements
-     * in this viewer.
-     * Has no effect if an identical listener is already registered.
-     *
-     * @param listener a check state listener
-     */
-    public void addCheckStateListener(ICheckStateListener listener);
-
-    /**
-     * Returns the checked state of the given element.
-     *
-     * @param element the element
-     * @return <code>true</code> if the element is checked,
-     *   and <code>false</code> if not checked
-     */
-    public boolean getChecked(Object element);
-
-    /**
-     * Removes the given check state listener from this viewer.
-     * Has no effect if an identical listener is not registered.
-     *
-     * @param listener a check state listener
-     */
-    public void removeCheckStateListener(ICheckStateListener listener);
-
-    /**
-     * Sets the checked state for the given element in this viewer.
-     * Does not fire events to check state listeners.
-     *
-     * @param element the element
-     * @param state <code>true</code> if the item should be checked,
-     *  and <code>false</code> if it should be unchecked
-     * @return <code>true</code> if the checked state could be set, 
-     *  and <code>false</code> otherwise
-     */
-    public boolean setChecked(Object element, boolean state);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IColorDecorator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IColorDecorator.java
deleted file mode 100644
index d8294e0..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IColorDecorator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.graphics.Color;
-
-/**
- * The IColorDecorator is an interface for objects that return a color to
- * decorate either the foreground and background colors for displaying an
- * an object.
- * 
- * If an IColorDecorator decorates a foreground or background in an object 
- * that also has an IColorProvider the IColorDecorator will take precedence.
- * @see IColorProvider
- * 
- * @since 3.1
- */
-public interface IColorDecorator {
-	
-	/**
-	 * Return the foreground Color for element or <code>null</code> if there
-	 * is not one.
-	 * @param element
-	 * @return Color or <code>null</code>
-	 */
-	public Color decorateForeground(Object element);
-	
-	/**
-	 * Return the background Color for element or <code>null</code> if there
-	 * is not one.
-	 * @param element
-	 * @return Color or <code>null</code>
-	 */
-	public Color decorateBackground(Object element);
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IColorProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IColorProvider.java
deleted file mode 100644
index a58efac..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IColorProvider.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.graphics.Color;
-
-/**
- * Interface to provide color representation for a given element.
- * @see org.eclipse.jface.viewers.IColorDecorator
- */
-public interface IColorProvider {
-
-    /**
-     * Provides a foreground color for the given element.
-     * 
-     * @param element the element
-     * @return	the foreground color for the element, or <code>null</code> 
-     *   to use the default foreground color
-     */
-    Color getForeground(Object element);
-
-    /**
-     * Provides a background color for the given element.
-     * 
-     * @param element the element
-     * @return	the background color for the element, or <code>null</code> 
-     *   to use the default background color
-     */
-    Color getBackground(Object element);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IContentProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IContentProvider.java
deleted file mode 100644
index 9a5547a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IContentProvider.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/** 
- * A content provider mediates between the viewer's model
- * and the viewer itself.
- * 
- * @see org.eclipse.jface.viewers.ContentViewer#setContentProvider(IContentProvider)
- */
-public interface IContentProvider {
-    /**
-     * Disposes of this content provider.  
-     * This is called by the viewer when it is disposed.
-     * <p>
-     * The viewer should not be updated during this call, as it is in the process
-     * of being disposed.
-     * </p>
-     */
-    public void dispose();
-
-    /**
-     * Notifies this content provider that the given viewer's input
-     * has been switched to a different element.
-     * <p>
-     * A typical use for this method is registering the content provider as a listener
-     * to changes on the new input (using model-specific means), and deregistering the viewer 
-     * from the old input. In response to these change notifications, the content provider
-     * should update the viewer (see the add, remove, update and refresh methods on the viewers).
-     * </p>
-     * <p>
-     * The viewer should not be updated during this call, as it might be in the process
-     * of being disposed.
-     * </p>
-     *
-     * @param viewer the viewer
-     * @param oldInput the old input element, or <code>null</code> if the viewer
-     *   did not previously have an input
-     * @param newInput the new input element, or <code>null</code> if the viewer
-     *   does not have an input
-     */
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IDecoration.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IDecoration.java
deleted file mode 100644
index e4b41c3..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IDecoration.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * Defines the result of decorating an element.
- * 
- * This interface is not meant to be implemented and will be provided to
- * instances of <code>ILightweightLabelDecorator</code>.
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IDecoration{
-
-	/**
-	 * Constants for placement of image decorations.
-	 */
-	public static final int TOP_LEFT = 0;
-
-	/**
-	 * Constant for the top right quadrant.
-	 */
-	public static final int TOP_RIGHT = 1;
-
-	/**
-	 * Constant for the bottom left quadrant.
-	 */
-	public static final int BOTTOM_LEFT = 2;
-
-	/**
-	 * Constant for the bottom right quadrant.
-	 */
-	public static final int BOTTOM_RIGHT = 3;
-
-	/**
-	 * Constant for the underlay.
-	 */
-	public static final int UNDERLAY = 4;
-
-	/**
-	 * Constant for replacing the original image. Note that for this to have an
-	 * effect on the resulting decorated image, {@link #ENABLE_REPLACE} has to
-	 * be set to {@link Boolean#TRUE} in the {@link IDecorationContext} (opt-in
-	 * model). If replacement behavior is enabled, the resulting decorated image
-	 * will be constructed by first painting the underlay, then the replacement
-	 * image, and then the regular quadrant images.
-	 * 
-	 * @since 3.4
-	 */
-	public static final int REPLACE = 5;
-	
-	/**
-	 * Constant that is used as the property key on an
-	 * {@link IDecorationContext}. To enable image replacement, set to
-	 * {@link Boolean#TRUE}.
-	 * 
-	 * @since 3.4
-	 * @see IDecorationContext
-	 */
-	public static final String ENABLE_REPLACE = "org.eclipse.jface.viewers.IDecoration.disableReplace"; //$NON-NLS-1$
-	
-	/**
-	 * Adds a prefix to the element's label.
-	 * 
-	 * @param prefix
-	 *            the prefix
-	 */
-	public void addPrefix(String prefix);
-
-	/**
-	 * Adds a suffix to the element's label.
-	 * 
-	 * @param suffix
-	 *            the suffix
-	 */
-	public void addSuffix(String suffix);
-
-	/**
-	 * Adds an overlay to the element's image.
-	 * 
-	 * @param overlay
-	 *            the overlay image descriptor
-	 */
-	public void addOverlay(ImageDescriptor overlay);
-
-	/**
-	 * Adds an overlay to the element's image.
-	 * 
-	 * @param overlay
-	 *            the overlay image descriptor
-	 * @param quadrant
-	 *            The constant for the quadrant to draw the image on.
-	 */
-	public void addOverlay(ImageDescriptor overlay, int quadrant);
-	
-	/**
-	 * Set the foreground color for this decoration.
-	 * @param color the color to be set for the foreground
-	 * 
-	 * @since 3.1
-	 */
-	public void setForegroundColor(Color color);
-	
-	/**
-	 * Set the background color for this decoration.
-	 * @param color the color to be set for the background
-	 * 
-	 * @since 3.1
-	 */
-	public void setBackgroundColor(Color color);
-	
-	/**
-	 * Set the font for this decoration.
-	 * @param font the font to use in this decoration
-	 * 
-	 * @since 3.1
-	 */
-	public void setFont(Font font);
-
-	/**
-	 * Return the decoration context in which this decoration
-	 * will be applied.
-	 * @return the decoration context
-	 * 
-	 * @since 3.2
-	 */
-	public IDecorationContext getDecorationContext();
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IDecorationContext.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IDecorationContext.java
deleted file mode 100644
index bba6f7a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IDecorationContext.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-
-/**
- * A decoration context provides additional information to
- * a label decorator.
- * <p>
- * This interface is not intended to be implemented by clients
- * 
- * @see LabelDecorator
- * 
- * @since 3.2
- */
-public interface IDecorationContext {
-	
-	/**
-	 * Get the value of the given property or <code>null</code>
-	 * if the property does not exist in this context.
-	 * @param property the property
-	 * @return the value of the given property or <code>null</code>
-	 */
-	Object getProperty(String property);
-	
-	/**
-	 * Return the properties that exist in this context
-	 * (i.e. the set of properties that have values associated
-	 * with them.
-	 * @return the properties that exist in this context
-	 */
-	String[] getProperties();
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IDelayedLabelDecorator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IDelayedLabelDecorator.java
deleted file mode 100644
index ea7f91e..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IDelayedLabelDecorator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * A delayed label decorator is a label decorator that may not have a
- * decoration available immediately. This interface defines the methods for
- * requesting the preparation of a decorator for an object and for querying
- * if the decorator is ready. Interested parties should register an
- * ILabelProviderListener with a delayed label decorator in order to be informed
- * when the decoration is ready.
- * @since 3.0
- */
-public interface IDelayedLabelDecorator extends ILabelDecorator {
-
-    /**
-     * Prepare the element for decoration. If it is already decorated and ready for update
-     * return true. If decoration is pending return false.
-     * @param element The element to be decorated
-     * @param originalText The starting text. 
-     * @return boolean <code>true</code> if the decoration is ready for this element
-     */
-
-    public boolean prepareDecoration(Object element, String originalText);
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IDoubleClickListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IDoubleClickListener.java
deleted file mode 100644
index 814f7ca..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IDoubleClickListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * A listener which is notified of double-click events on viewers.
- */
-public interface IDoubleClickListener {
-    /**
-     * Notifies of a double click.
-     *
-     * @param event event object describing the double-click
-     */
-    public void doubleClick(DoubleClickEvent event);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IElementComparer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IElementComparer.java
deleted file mode 100644
index 84d9c19..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IElementComparer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-/**
- * This interface is used to compare elements in a viewer for equality,
- * and to provide the hash code for an element.
- * This allows the client of the viewer to specify different equality criteria
- * and a different hash code implementation than the 
- * <code>equals</code> and <code>hashCode</code> implementations of the
- * elements themselves. 
- * 
- * @see StructuredViewer#setComparer
- */
-public interface IElementComparer {
-
-    /**
-     * Compares two elements for equality
-     * 
-     * @param a the first element
-     * @param b the second element
-     * @return whether a is equal to b
-     */
-    boolean equals(Object a, Object b);
-
-    /**
-     * Returns the hash code for the given element.
-     * @param element the element the hash code is calculated for
-     * 
-     * @return the hash code for the given element
-     */
-    int hashCode(Object element);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IFilter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IFilter.java
deleted file mode 100644
index b5b3ba5..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IFilter.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * Interface for filters. Can accept or reject items.
- * 
- * @since 3.1
- */
-public interface IFilter {
-	/**
-	 * Determines if the given object passes this filter.
-	 * 
-	 * @param toTest object to compare against the filter 
-	 * 
-	 * @return <code>true</code> if the object is accepted by the filter.
-	 */
-	public boolean select(Object toTest);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IFontDecorator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IFontDecorator.java
deleted file mode 100644
index ea69c37..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IFontDecorator.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.graphics.Font;
-
-/**
- * The IFontDecorator is an interface for objects that return a font to
- * decorate an object.
- * 
- * If an IFontDecorator decorates a font in an object that also has
- * an IFontProvider the IFontDecorator will take precedence.
- * @see IFontProvider
- * 
- * @since 3.1
- */
-public interface IFontDecorator {
-	
-	/**
-	 * Return the font for element or <code>null</code> if there
-	 * is not one.
-	 * 
-	 * @param element
-	 * @return Font or <code>null</code>
-	 */
-	public Font decorateFont(Object element);
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IFontProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IFontProvider.java
deleted file mode 100644
index 8e19ab4..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IFontProvider.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.graphics.Font;
-
-/**
- * Interface to provide font representation for a given element.
- * @see org.eclipse.jface.viewers.IFontDecorator
- * 
- * @since 3.0
- */
-public interface IFontProvider {
-
-    /**
-     * Provides a font for the given element.
-     * 
-     * @param element the element
-     * @return the font for the element, or <code>null</code> 
-     *   to use the default font
-     */
-    public Font getFont(Object element);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IInputProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IInputProvider.java
deleted file mode 100644
index 30fdca0..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IInputProvider.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * Interface common to all objects that provide an input.
- */
-public interface IInputProvider {
-    /**
-     * Returns the input.
-     *
-     * @return the input object
-     */
-    public Object getInput();
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IInputSelectionProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IInputSelectionProvider.java
deleted file mode 100644
index b5fdeab..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IInputSelectionProvider.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * Interface common to all objects that provide both an input and
- * a selection.
- */
-public interface IInputSelectionProvider extends IInputProvider,
-        ISelectionProvider {
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILabelDecorator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILabelDecorator.java
deleted file mode 100644
index 16fc861..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILabelDecorator.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A label decorator decorates the label text and image for some element.
- * The original label text and image are obtained by some other means,
- * for example by a label provider.
- *
- * @see ILabelProvider
- */
-public interface ILabelDecorator extends IBaseLabelProvider {
-    /**
-     * Returns an image that is based on the given image,
-     * but decorated with additional information relating to the state
-     * of the provided element.
-     * 
-     * Text and image decoration updates can occur as a result of other updates
-     * within the workbench including deferred decoration by background processes.
-     * Clients should handle labelProviderChangedEvents for the given element to get
-     * the complete decoration.
-     * @see LabelProviderChangedEvent
-     * @see IBaseLabelProvider#addListener
-     *
-     * @param image the input image to decorate, or <code>null</code> if the element has no image
-     * @param element the element whose image is being decorated
-     * @return the decorated image, or <code>null</code> if no decoration is to be applied
-     *
-     * @see org.eclipse.jface.resource.CompositeImageDescriptor
-     */
-    public Image decorateImage(Image image, Object element);
-
-    /**
-     * Returns a text label that is based on the given text label,
-     * but decorated with additional information relating to the state
-     * of the provided element.
-     * 
-     * Text and image decoration updates can occur as a result of other updates
-     * within the workbench including deferred decoration by background processes.
-     * Clients should handle labelProviderChangedEvents for the given element to get
-     * the complete decoration.
-     * @see LabelProviderChangedEvent
-     * @see IBaseLabelProvider#addListener
-     *
-     * @param text the input text label to decorate
-     * @param element the element whose image is being decorated
-     * @return the decorated text label, or <code>null</code> if no decoration is to be applied
-     */
-    public String decorateText(String text, Object element);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILabelProvider.java
deleted file mode 100644
index 414f159..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILabelProvider.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Extends <code>IBaseLabelProvider</code> with the methods
- * to provide the text and/or image for the label of a given element. 
- * Used by most structured viewers, except table viewers.
- */
-public interface ILabelProvider extends IBaseLabelProvider {
-    /**
-     * Returns the image for the label of the given element.  The image
-     * is owned by the label provider and must not be disposed directly.
-     * Instead, dispose the label provider when no longer needed.
-     *
-     * @param element the element for which to provide the label image
-     * @return the image used to label the element, or <code>null</code>
-     *   if there is no image for the given object
-     */
-    public Image getImage(Object element);
-
-    /**
-     * Returns the text for the label of the given element.
-     *
-     * @param element the element for which to provide the label text
-     * @return the text string used to label the element, or <code>null</code>
-     *   if there is no text label for the given object
-     */
-    public String getText(Object element);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILabelProviderListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILabelProviderListener.java
deleted file mode 100644
index 8f9d095..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILabelProviderListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/** 
- * A listener which is notified when a label provider's state changes.
- *
- * @see IBaseLabelProvider#addListener
- * @see IBaseLabelProvider#removeListener
- */
-public interface ILabelProviderListener {
-    /**
-     * Notifies this listener that the state of the label provider 
-     * has changed in a way that affects the labels it computes.
-     * <p>
-     * A typical response would be to refresh all labels by 
-     * re-requesting them from the label provider.
-     * </p>
-     *
-     * @param event the label provider change event
-     */
-    public void labelProviderChanged(LabelProviderChangedEvent event);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILazyContentProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILazyContentProvider.java
deleted file mode 100644
index a97f371..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILazyContentProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * The ILazyContentProvider is the content provider
- * for table viewers created using the SWT.VIRTUAL flag that
- * only wish to return their contents as they are queried.
- * 
- * <strong>NOTE:</strong> As the ILazyContentProvider does
- * not have API for determining the total item count any
- * changes to the number of items for this object while
- * require a call to <code>#setItemCount</code> on the 
- * viewer that uses it.
- */
-public interface ILazyContentProvider extends IContentProvider {
-	/**
-	 * Called when a previously-blank item becomes visible in the
-	 * TableViewer. If the content provider knows the element
-	 * at this row, it should respond by calling 
-	 * TableViewer#replace(Object, int).
-	 * 
-	 * <strong>NOTE</strong> #updateElement(int index) can be used to determine selection
-	 * values. TableViewer#replace(Object, int) is not called before 
-	 * returning from this method selections may have missing or stale elements.
-	 * In this situation it is suggested that the selection is asked
-	 * for again after he update.
-	 * 
-	 * @param index The index that is being updated in the
-	 * table.
-	 */
-	public void updateElement(int index);
-	
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILazyTreeContentProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILazyTreeContentProvider.java
deleted file mode 100644
index fdfc1e6..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILazyTreeContentProvider.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * The ILazyTreeContentProvider is the content provider for tree viewers created
- * using the SWT.VIRTUAL flag that only wish to return their contents as they
- * are queried.
- * 
- * @since 3.2
- */
-public interface ILazyTreeContentProvider extends IContentProvider {
-	/**
-	 * Called when a previously-blank item becomes visible in the TreeViewer. If
-	 * the content provider knows the child element for the given parent at this
-	 * index, it should respond by calling
-	 * {@link TreeViewer#replace(Object, int, Object)}. The content provider
-	 * should also update the child count for any replaced element by calling
-	 * {@link TreeViewer#setChildCount(Object, int)}. If the given current child
-	 * count is already correct, setChildCount does not have to be called since
-	 * a call to replace will not change the child count.
-	 * 
-	 * <strong>NOTE</strong> #updateElement(int index) can be used to determine
-	 * selection values. If TableViewer#replace(Object, int) is not called
-	 * before returning from this method, selections may have missing or stale
-	 * elements. In this situation it is suggested that the selection is asked
-	 * for again after replace() has been called.
-	 * 
-	 * @param parent
-	 *            The parent of the element, or the viewer's input if the
-	 *            element to update is a root element
-	 * @param index
-	 *            The index of the element to update in the tree
-	 */
-	public void updateElement(Object parent, int index);
-
-	/**
-	 * Called when the TreeViewer needs an up-to-date child count for the given
-	 * element, for example from {@link TreeViewer#refresh()} and
-	 * {@link TreeViewer#setInput(Object)}. If the content provider knows the
-	 * given element, it should respond by calling
-	 * {@link TreeViewer#setChildCount(Object, int)}. If the given current
-	 * child count is already correct, no action has to be taken by this content
-	 * provider.
-	 * 
-	 * @param element
-	 *            The element for which an up-to-date child count is needed, or
-	 *            the viewer's input if the number of root elements is requested 
-	 * @param currentChildCount 
-	 * 			  The current child count for the element that needs updating
-	 */
-	public void updateChildCount(Object element, int currentChildCount);
-	
-    /**
-     * Returns the parent for the given element, or <code>null</code> 
-     * indicating that the parent can't be computed. 
-     * In this case the tree-structured viewer can't expand
-     * a given node correctly if requested.
-     *
-     * @param element the element
-     * @return the parent element, or <code>null</code> if it
-     *   has none or if the parent cannot be computed
-     */
-	public Object getParent(Object element);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILazyTreePathContentProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILazyTreePathContentProvider.java
deleted file mode 100644
index 32b87e5..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILazyTreePathContentProvider.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * The ILazyTreePathContentProvider is a tree path-based content provider for
- * tree viewers created using the SWT.VIRTUAL flag that only wish to return
- * their contents as they are queried.
- * 
- * @since 3.3
- */
-public interface ILazyTreePathContentProvider extends IContentProvider {
-	/**
-	 * Called when a previously-blank item becomes visible in the TreeViewer. If
-	 * the content provider knows the child element for the given parent at this
-	 * index, it should respond by calling
-	 * {@link TreeViewer#replace(Object, int, Object)}. The content provider
-	 * should also update the child count for any replaced element by calling
-	 * {@link TreeViewer#setChildCount(Object, int)}. If the given current child
-	 * count is already correct, setChildCount does not have to be called since
-	 * a call to replace will not change the child count.
-	 * 
-	 * <strong>NOTE</strong> #updateElement(int index) can be used to determine
-	 * selection values. If TableViewer#replace(Object, int) is not called
-	 * before returning from this method, selections may have missing or stale
-	 * elements. In this situation it is suggested that the selection is asked
-	 * for again after replace() has been called.
-	 * 
-	 * @param parentPath
-	 *            The tree path of parent of the element, or if the
-	 *            element to update is a root element, an empty tree path
-	 * @param index
-	 *            The index of the element to update in the tree
-	 */
-	public void updateElement(TreePath parentPath, int index);
-
-	/**
-	 * Called when the TreeViewer needs an up-to-date child count for the given
-	 * tree path, for example from {@link TreeViewer#refresh()} and
-	 * {@link TreeViewer#setInput(Object)}. If the content provider knows the
-	 * element at the given tree path, it should respond by calling
-	 * {@link TreeViewer#setChildCount(Object, int)}. If the given current
-	 * child count is already correct, no action has to be taken by this content
-	 * provider.
-	 * 
-	 * @param treePath
-	 *            The tree path for which an up-to-date child count is needed, or
-	 *            if the number of root elements is requested, the empty tree path 
-	 * @param currentChildCount 
-	 * 			  The current child count for the element that needs updating
-	 */
-	public void updateChildCount(TreePath treePath, int currentChildCount);
-	
-	/**
-	 * Called when the TreeViewer needs up-to-date information whether the node
-	 * at the given tree path can be expanded. If the content provider knows the
-	 * element at the given tree path, it should respond by calling
-	 * {@link TreeViewer#setHasChildren(Object, boolean)}. The content provider
-	 * may also choose to call {@link TreeViewer#setChildCount(Object, int)}
-	 * instead if it knows the number of children.
-	 * 
-	 * <p>
-	 * Intended as an optimization for when the viewer does not need the actual
-	 * children. Clients may be able to implement this more efficiently than
-	 * <code>updateChildCount</code>.
-	 * </p>
-	 * 
-	 * @param path
-	 *            The tree path for which up-to-date information about children
-	 *            is needed
-	 */
-	public void updateHasChildren(TreePath path);
-
-	/**
-	 * Return the possible parent paths for the given element. An empty array
-	 * can be returned if the paths cannot be computed. In this case the
-	 * tree-structured viewer can't expand a given node correctly if requested.
-	 * If the element is a potential child of the input of the viewer, an empty
-	 * tree path should be an entry in the returned array.
-	 * 
-	 * @param element
-	 *            the element
-	 * @return the possible parent paths for the given element
-	 */
-	public TreePath[] getParents(Object element);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILightweightLabelDecorator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILightweightLabelDecorator.java
deleted file mode 100644
index 5fdecab..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ILightweightLabelDecorator.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * The <code>ILightweightLabelDecorator</code> is a decorator that decorates
- * using a prefix, suffix and overlay image rather than doing all 
- * of the image and text management itself like an <code>ILabelDecorator</code>.
- */
-public interface ILightweightLabelDecorator extends IBaseLabelProvider {
-
-    /**
-     * Calculates decorations based on element. 
-     * 
-     * @param element the element to decorate
-     * @param decoration the decoration to set
-     */
-    public void decorate(Object element, IDecoration decoration);
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IOpenListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IOpenListener.java
deleted file mode 100644
index 34c3b4e..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IOpenListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * A listener which is notified of open events on viewers.
- */
-public interface IOpenListener {
-    /**
-     * Notifies of an open event.
-     *
-     * @param event event object describing the open event
-     */
-    public void open(OpenEvent event);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IPostSelectionProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IPostSelectionProvider.java
deleted file mode 100644
index a62792d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IPostSelectionProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * Selection provider extension interface to allow providers
- * to notify about post selection changed events.
- * A post selection changed event is equivalent to selection changed event
- * if the selection change was triggered by the mouse, but it has a delay 
- * if the selection change is triggered by keyboard navigation.
- *
- * @see ISelectionProvider
- * 
- * @since 3.0
- */
-public interface IPostSelectionProvider extends ISelectionProvider {
-
-    /**
-     * Adds a listener for post selection changes in this selection provider.
-     * Has no effect if an identical listener is already registered.
-     *
-     * @param listener a selection changed listener
-     */
-    public void addPostSelectionChangedListener(
-            ISelectionChangedListener listener);
-
-    /**
-     * Removes the given listener for post selection changes from this selection 
-     * provider.
-     * Has no affect if an identical listener is not registered.
-     *
-     * @param listener a selection changed listener
-     */
-    public void removePostSelectionChangedListener(
-            ISelectionChangedListener listener);
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ISelection.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ISelection.java
deleted file mode 100644
index 1213320..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ISelection.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * Interface for a selection.
- *
- * @see ISelectionProvider
- * @see ISelectionChangedListener
- * @see SelectionChangedEvent
- */
-public interface ISelection {
-
-    /**
-     * Returns whether this selection is empty.
-     * 
-     * @return <code>true</code> if this selection is empty,
-     *   and <code>false</code> otherwise
-     */
-    public boolean isEmpty();
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ISelectionChangedListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ISelectionChangedListener.java
deleted file mode 100644
index c5a27e5..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ISelectionChangedListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/** 
- * A listener which is notified when a viewer's selection changes.
- *
- * @see ISelection
- * @see ISelectionProvider
- * @see SelectionChangedEvent
- */
-public interface ISelectionChangedListener {
-    /**
-     * Notifies that the selection has changed.
-     *
-     * @param event event object describing the change
-     */
-    public void selectionChanged(SelectionChangedEvent event);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ISelectionProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ISelectionProvider.java
deleted file mode 100644
index 4a4e963..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ISelectionProvider.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * Interface common to all objects that provide a selection.
- *
- * @see ISelection
- * @see ISelectionChangedListener
- * @see SelectionChangedEvent
- */
-public interface ISelectionProvider {
-    /**
-     * Adds a listener for selection changes in this selection provider.
-     * Has no effect if an identical listener is already registered.
-     *
-     * @param listener a selection changed listener
-     */
-    public void addSelectionChangedListener(ISelectionChangedListener listener);
-
-    /**
-     * Returns the current selection for this provider.
-     * 
-     * @return the current selection
-     */
-    public ISelection getSelection();
-
-    /**
-     * Removes the given selection change listener from this selection provider.
-     * Has no affect if an identical listener is not registered.
-     *
-     * @param listener a selection changed listener
-     */
-    public void removeSelectionChangedListener(
-            ISelectionChangedListener listener);
-
-    /**
-     * Sets the current selection for this selection provider.
-     *
-     * @param selection the new selection
-     */
-    public void setSelection(ISelection selection);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IStructuredContentProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IStructuredContentProvider.java
deleted file mode 100644
index c994e9b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IStructuredContentProvider.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * An interface to content providers for structured viewers.
- *
- * @see StructuredViewer
- */
-public interface IStructuredContentProvider extends IContentProvider {
-    /**
-     * Returns the elements to display in the viewer 
-     * when its input is set to the given element. 
-     * These elements can be presented as rows in a table, items in a list, etc.
-     * The result is not modified by the viewer.
-     * <p>
-     * <b>NOTE:</b> For instances where the viewer is displaying a tree
-     * containing a single 'root' element it is still necessary that the
-     * 'input' does not return <i>itself</i> from this method. This leads
-     * to recursion issues (see bug 9262).
-     * </p>
-     * @param inputElement the input element
-     * @return the array of elements to display in the viewer
-     */
-    public Object[] getElements(Object inputElement);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IStructuredSelection.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IStructuredSelection.java
deleted file mode 100644
index b471a04..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IStructuredSelection.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * A selection containing elements.
- */
-public interface IStructuredSelection extends ISelection {
-    /**
-     * Returns the first element in this selection, or <code>null</code>
-     * if the selection is empty.
-     *
-     * @return an element, or <code>null</code> if none
-     */
-    public Object getFirstElement();
-
-    /**
-     * Returns an iterator over the elements of this selection.
-     *
-     * @return an iterator over the selected elements
-     */
-    public Iterator iterator();
-
-    /**
-     * Returns the number of elements selected in this selection.
-     *
-     * @return the number of elements selected
-     */
-    public int size();
-
-    /**
-     * Returns the elements in this selection as an array.
-     *
-     * @return the selected elements as an array
-     */
-    public Object[] toArray();
-
-    /**
-     * Returns the elements in this selection as a <code>List</code>.
-     * <strong>Note</strong> In the default implementation of {@link #toList()} in
-     * {@link StructuredSelection} the returned list is not a copy of the elements of the 
-     * receiver and modifying it will modify the contents of the selection.
-     *
-     * @return the selected elements as a list
-     */
-    public List toList();
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITableColorProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITableColorProvider.java
deleted file mode 100644
index 1b0a6ae..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITableColorProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Initial implementation - Gunnar Ahlberg (IBS AB, www.ibs.net)
- *     IBM Corporation - further revisions
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.graphics.Color;
-
-/**
- * Interface to provide color representation for a given cell within
- * the row for an element in a table.
- * @since 3.1
- */
-public interface ITableColorProvider {
-
-    /**
-     * Provides a foreground color for the given element.
-     * 
-     * @param element the element
-     * @param columnIndex the zero-based index of the column in which
-     * 	the color appears
-     * @return the foreground color for the element, or <code>null</code> to
-     *         use the default foreground color
-     */
-    Color getForeground(Object element, int columnIndex);
-
-    /**
-     * Provides a background color for the given element at the specified index
-     * 
-     * @param element the element
-     * @param columnIndex the zero-based index of the column in which the color appears
-     * @return the background color for the element, or <code>null</code> to
-     *         use the default background color
-     *  
-     */
-    Color getBackground(Object element, int columnIndex);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITableFontProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITableFontProvider.java
deleted file mode 100644
index 03cd53c..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITableFontProvider.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.graphics.Font;
-
-/**
- * The ITableFontProvider is a font provider that provides fonts to 
- * individual cells within tables.
- * @since 3.1
- */
-public interface ITableFontProvider {
-	
-	/**
-	 * Provides a font for the given element at index
-	 * columnIndex.
-	 * @param element The element being displayed
-	 * @param columnIndex The index of the column being displayed
-	 * @return Font
-	 */
-	public Font getFont(Object element, int columnIndex);
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITableLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITableLabelProvider.java
deleted file mode 100644
index a38d722..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITableLabelProvider.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Extends <code>IBaseLabelProvider</code> with the methods
- * to provide the text and/or image for each column of a given element.  
- * Used by table viewers.
- *
- * @see TableViewer
- */
-public interface ITableLabelProvider extends IBaseLabelProvider {
-    /**
-     * Returns the label image for the given column of the given element.
-     *
-     * @param element the object representing the entire row, or 
-     *    <code>null</code> indicating that no input object is set
-     *    in the viewer
-     * @param columnIndex the zero-based index of the column in which
-     *   the label appears
-     * @return Image or <code>null</code> if there is no image for the 
-     *  given object at columnIndex
-     */
-    public Image getColumnImage(Object element, int columnIndex);
-
-    /**
-     * Returns the label text for the given column of the given element.
-     *
-     * @param element the object representing the entire row, or
-     *   <code>null</code> indicating that no input object is set
-     *   in the viewer
-     * @param columnIndex the zero-based index of the column in which the label appears
-     * @return String or or <code>null</code> if there is no text for the 
-     *  given object at columnIndex
-     */
-    public String getColumnText(Object element, int columnIndex);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITreeContentProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITreeContentProvider.java
deleted file mode 100644
index 7b1c0fd..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITreeContentProvider.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * An interface to content providers for tree-structure-oriented
- * viewers.
- *
- * @see AbstractTreeViewer
- */
-public interface ITreeContentProvider extends IStructuredContentProvider {
-    /**
-     * Returns the child elements of the given parent element.
-     * <p>
-     * The difference between this method and <code>IStructuredContentProvider.getElements</code> 
-     * is that <code>getElements</code> is called to obtain the 
-     * tree viewer's root elements, whereas <code>getChildren</code> is used
-     * to obtain the children of a given parent element in the tree (including a root).
-     * </p>
-     * The result is not modified by the viewer.
-     *
-     * @param parentElement the parent element
-     * @return an array of child elements
-     */
-    public Object[] getChildren(Object parentElement);
-
-    /**
-     * Returns the parent for the given element, or <code>null</code> 
-     * indicating that the parent can't be computed. 
-     * In this case the tree-structured viewer can't expand
-     * a given node correctly if requested.
-     *
-     * @param element the element
-     * @return the parent element, or <code>null</code> if it
-     *   has none or if the parent cannot be computed
-     */
-    public Object getParent(Object element);
-
-    /**
-     * Returns whether the given element has children.
-     * <p>
-     * Intended as an optimization for when the viewer does not
-     * need the actual children.  Clients may be able to implement
-     * this more efficiently than <code>getChildren</code>.
-     * </p>
-     *
-     * @param element the element
-     * @return <code>true</code> if the given element has children,
-     *  and <code>false</code> if it has no children
-     */
-    public boolean hasChildren(Object element);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITreePathContentProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITreePathContentProvider.java
deleted file mode 100644
index ce87dab..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITreePathContentProvider.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-/**
- * An interface to content providers for tree-structure-oriented viewers that
- * provides content based on the path of elements in the tree viewer..
- * 
- * @see AbstractTreeViewer
- * @since 3.2
- */
-public interface ITreePathContentProvider extends IStructuredContentProvider {
-
-	/**
-	 * Returns the child elements of the last element in the given path.
-	 * Implementors may want to use the additional context of the complete path
-	 * of a parent element in order to decide which children to return.
-	 * <p>
-	 * The provided path is relative to the input. The root elements must
-	 * be obtained by calling
-	 * {@link IStructuredContentProvider#getElements(Object)}.
-	 * </p>
-	 * The result is not modified by the viewer.
-	 * 
-	 * @param parentPath
-	 *            the path of the parent element
-	 * @return an array of child elements
-	 */
-	public Object[] getChildren(TreePath parentPath);
-
-	/**
-	 * Returns whether the last element of the given path has children.
-	 * <p>
-	 * Intended as an optimization for when the viewer does not need the actual
-	 * children. Clients may be able to implement this more efficiently than
-	 * <code>getChildren</code>.
-	 * </p>
-	 * 
-	 * @param path
-	 *            the path
-	 * @return <code>true</code> if the lat element of the path has children,
-	 *         and <code>false</code> if it has no children
-	 */
-	public boolean hasChildren(TreePath path);
-
-	/**
-	 * Return the possible parent paths for the given element. An empty array
-	 * can be returned if the paths cannot be computed. If the element is 
-	 * a potential child of the input of the viewer, an empty tree path
-	 * should be an entry in the returned array.
-	 * 
-	 * @param element
-	 *            the element
-	 * @return the possible parent paths for the given element
-	 */
-	public TreePath[] getParents(Object element);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITreePathLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITreePathLabelProvider.java
deleted file mode 100644
index ac2abd1..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITreePathLabelProvider.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-/**
- * An extension to {@link ILabelProvider} that is given the 
- * path of the element being decorated, when it is available.
- * @since 3.2
- */
-public interface ITreePathLabelProvider extends IBaseLabelProvider {
-    
-    /**
-     * Updates the label for the given element.
-     * 
-     * @param label the label to update
-     * @param elementPath the path of the element being decorated
-     */
-    public void updateLabel(ViewerLabel label, TreePath elementPath);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITreeSelection.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITreeSelection.java
deleted file mode 100644
index 41e7ba5..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITreeSelection.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * A selection containing tree paths.
- * <p>
- * It is recommended that clients do not implement this interface but instead
- * use the standard implementation of this interface, {@link TreeSelection}.
- * <code>TreeSelection</code> adds API for getting the {@link IElementComparer}
- * of a selection (if available). This is important for clients who want to
- * create a slightly modified tree selection based on an existing tree selection.
- * The recommended coding pattern in this case is as follows:
- * <pre>
- * ITreeSelection selection = (ITreeSelection)treeViewer.getSelection();
- * TreePath[] paths = selection.getPaths();
- * IElementComparer comparer = null;
- * if (selection instanceof TreeSelection) {
- *   comparer = ((TreeSelection)selection).getElementComparer();
- * }
- * TreePath[] modifiedPaths = ... // modify as required
- * TreeSelection modifiedSelection = new TreeSelection(modifiedPaths, comparer);
- * </pre>
- * See bugs 135818 and 133375 for details.
- * </p>
- * 
- * @since 3.2
- *
- */
-public interface ITreeSelection extends IStructuredSelection {
-
-	/**
-	 * Returns the paths in this selection
-	 * 
-	 * @return the paths in this selection
-	 */
-	public TreePath[] getPaths();
-
-	/**
-	 * Returns the paths in this selection whose last segment is equal
-	 * to the given element
-	 * 
-	 * @param element the element to get the tree paths for
-	 * 
-	 * @return the array of tree paths
-	 */
-	public TreePath[] getPathsFor(Object element);
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITreeViewerListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITreeViewerListener.java
deleted file mode 100644
index eadf9cf..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ITreeViewerListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/** 
- * A listener which is notified when a tree viewer expands or collapses
- * a node.
- */
-public interface ITreeViewerListener {
-    /**
-     * Notifies that a node in the tree has been collapsed.
-     *
-     * @param event event object describing details
-     */
-    public void treeCollapsed(TreeExpansionEvent event);
-
-    /**
-     * Notifies that a node in the tree has been expanded.
-     *
-     * @param event event object describing details
-     */
-    public void treeExpanded(TreeExpansionEvent event);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IViewerLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IViewerLabelProvider.java
deleted file mode 100644
index 97f9767..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/IViewerLabelProvider.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-/**
- * Extends <code>IBaseLabelProvider</code> with the methods
- * to update the label for a given element.  The label is represented by a 
- * <code>ViewerLabel</code>.
- * Unlike <code>ILabelProvider</code>, this allows the text and image to be
- * set in the same request, rather than via separate requests.  
- * <p>
- * It also allows the current values for the text and image to be considered by 
- * the label provider, allowing for potential optimizations.
- * For example, decorating label providers that run in the background can hold off
- * applying an update to a previously populated label until the decoration is ready,
- * thereby reducing flicker.
- * </p>
- * 
- * @see IDelayedLabelDecorator
- * @since 3.0
- */
-public interface IViewerLabelProvider extends IBaseLabelProvider {
-
-    /**
-     * Updates the label for the given element.
-     * 
-     * @param label the label to update
-     * @param element the element
-     */
-    public void updateLabel(ViewerLabel label, Object element);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/LabelDecorator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/LabelDecorator.java
deleted file mode 100644
index 46991ba..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/LabelDecorator.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The LabelDecorator is an abstract superclass of ILabelDecorators
- * that support IDecorationContext.
- * @see IDecorationContext
- * @since 3.2
- *
- */
-public abstract class LabelDecorator implements ILabelDecorator {
-	
-	 /**
-     * Returns an image that is based on the given image,
-     * but decorated with additional information relating to the state
-     * of the provided element taking into account the provided context.
-     * 
-     * Text and image decoration updates can occur as a result of other updates
-     * within the workbench including deferred decoration by background processes.
-     * Clients should handle labelProviderChangedEvents for the given element to get
-     * the complete decoration.
-     * @see LabelProviderChangedEvent
-     * @see IBaseLabelProvider#addListener
-     *
-     * @param image the input image to decorate, or <code>null</code> if the element has no image
-     * @param element the element whose image is being decorated
-     * @param context additional context information about the element being decorated
-     * @return the decorated image, or <code>null</code> if no decoration is to be applied
-     *
-     * @see org.eclipse.jface.resource.CompositeImageDescriptor
-     */
-    public abstract Image decorateImage(Image image, Object element, IDecorationContext context);
-
-    /**
-     * Returns a text label that is based on the given text label,
-     * but decorated with additional information relating to the state
-     * of the provided element taking into account the provided context.
-     * 
-     * Text and image decoration updates can occur as a result of other updates
-     * within the workbench including deferred decoration by background processes.
-     * Clients should handle labelProviderChangedEvents for the given element to get
-     * the complete decoration.
-     * @see LabelProviderChangedEvent
-     * @see IBaseLabelProvider#addListener
-     *
-     * @param text the input text label to decorate
-     * @param element the element whose image is being decorated
-     * @param context additional context information about the element being decorated
-     * @return the decorated text label, or <code>null</code> if no decoration is to be applied
-     */
-    public abstract String decorateText(String text, Object element, IDecorationContext context);
-    
-    /**
-     * Prepare the element for decoration. If it is already decorated and ready for update
-     * return true. If decoration is pending return false.
-     * @param element The element to be decorated
-     * @param originalText The starting text. 
-     * @param context The decoration context
-     * @return boolean <code>true</code> if the decoration is ready for this element
-     */
-    public abstract boolean prepareDecoration(Object element, String originalText, IDecorationContext context);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/LabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/LabelProvider.java
deleted file mode 100644
index b7336c8..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/LabelProvider.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A label provider implementation which, by default, uses an element's
- * <code>toString</code> value for its text and <code>null</code> for its
- * image.
- * <p>
- * This class may be used as is, or subclassed to provide richer labels.
- * Subclasses may override any of the following methods:
- * <ul>
- * <li><code>isLabelProperty</code></li>
- * <li><code>getImage</code></li>
- * <li><code>getText</code></li>
- * <li><code>dispose</code></li>
- * </ul>
- * </p>
- */
-public class LabelProvider extends BaseLabelProvider implements ILabelProvider {
-
-	/**
-	 * Creates a new label provider.
-	 */
-	public LabelProvider() {
-	}
-
-
-	/**
-	 * The <code>LabelProvider</code> implementation of this
-	 * <code>ILabelProvider</code> method returns <code>null</code>.
-	 * Subclasses may override.
-	 */
-	public Image getImage(Object element) {
-		return null;
-	}
-
-	/**
-	 * The <code>LabelProvider</code> implementation of this
-	 * <code>ILabelProvider</code> method returns the element's
-	 * <code>toString</code> string. Subclasses may override.
-	 */
-	public String getText(Object element) {
-		return element == null ? "" : element.toString();//$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/LabelProviderChangedEvent.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/LabelProviderChangedEvent.java
deleted file mode 100644
index a49686b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/LabelProviderChangedEvent.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.EventObject;
-
-/**
- * Event object describing a label provider state change.
- *
- * @see ILabelProviderListener
- */
-public class LabelProviderChangedEvent extends EventObject {
-
-    /**
-     * Generated serial version UID for this class.
-     * @since 3.1
-     */
-    private static final long serialVersionUID = 3258410612479309878L;
-    
-    /**
-     * The elements whose labels need to be updated or <code>null</code>.
-     */
-    private Object[] elements;
-
-    /**
-     * Creates a new event for the given source, indicating that all labels
-     * provided by the source are no longer valid and should be updated.
-     *
-     * @param source the label provider
-     */
-    public LabelProviderChangedEvent(IBaseLabelProvider source) {
-        super(source);
-    }
-
-    /**
-     * Creates a new event for the given source, indicating that the label
-     * provided by the source for the given elements is no longer valid and should be updated.
-     *
-     * @param source the label provider
-     * @param elements the element whose labels have changed
-     */
-    public LabelProviderChangedEvent(IBaseLabelProvider source,
-            Object[] elements) {
-        super(source);
-        this.elements = elements;
-    }
-
-    /**
-     * Creates a new event for the given source, indicating that the label
-     * provided by the source for the given element is no longer valid and should be updated.
-     *
-     * @param source the label provider
-     * @param element the element whose label needs to be updated
-     */
-    public LabelProviderChangedEvent(IBaseLabelProvider source, Object element) {
-        super(source);
-        this.elements = new Object[1];
-        this.elements[0] = element;
-    }
-
-    /**
-     * Returns the first element whose label needs to be updated,
-     * or <code>null</code> if all labels need to be updated.
-     *
-     * @return the element whose label needs to be updated or <code>null</code>
-     */
-    public Object getElement() {
-        if (this.elements == null || this.elements.length == 0) {
-			return null;
-		} else {
-			return this.elements[0];
-		}
-    }
-
-    /**
-     * Returns the elements whose labels need to be updated,
-     * or <code>null</code> if all labels need to be updated.
-     *
-     * @return the element whose labels need to be updated or <code>null</code>
-     */
-    public Object[] getElements() {
-        if (this.elements == null) {
-			return null;
-		} else {
-			return this.elements;
-		}
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ListViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ListViewer.java
deleted file mode 100644
index da03289..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ListViewer.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 141435
- *     Tom Schindl <tom.schindl@bestsolution.at> - bug 157309, 177619
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A concrete viewer based on an SWT <code>List</code> control.
- * <p>
- * This class is not intended to be subclassed. It is designed to be
- * instantiated with a pre-existing SWT <code>List</code> control and configured
- * with a domain-specific content provider, label provider, element filter (optional),
- * and element sorter (optional).
- * <p>
- * Note that the SWT <code>List</code> control only supports the display of strings, not icons.
- * If you need to show icons for items, use <code>TableViewer</code> instead.
- * </p>
- * 
- * @see TableViewer
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ListViewer extends AbstractListViewer {
-
-    /**
-     * This viewer's list control.
-     */
-    private org.eclipse.swt.widgets.List list;
-
-    /**
-     * Creates a list viewer on a newly-created list control under the given parent.
-     * The list control is created using the SWT style bits <code>MULTI, H_SCROLL, V_SCROLL,</code> and <code>BORDER</code>.
-     * The viewer has no input, no content provider, a default label provider, 
-     * no sorter, and no filters.
-     *
-     * @param parent the parent control
-     */
-    public ListViewer(Composite parent) {
-        this(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-    }
-
-    /**
-     * Creates a list viewer on a newly-created list control under the given parent.
-     * The list control is created using the given SWT style bits.
-     * The viewer has no input, no content provider, a default label provider, 
-     * no sorter, and no filters.
-     *
-     * @param parent the parent control
-     * @param style the SWT style bits
-     */
-    public ListViewer(Composite parent, int style) {
-        this(new org.eclipse.swt.widgets.List(parent, style));
-    }
-
-    /**
-     * Creates a list viewer on the given list control.
-     * The viewer has no input, no content provider, a default label provider, 
-     * no sorter, and no filters.
-     *
-     * @param list the list control
-     */
-    public ListViewer(org.eclipse.swt.widgets.List list) {
-        this.list = list;
-        hookControl(list);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Viewer.
-     */
-    public Control getControl() {
-        return list;
-    }
-
-    /**
-     * Returns this list viewer's list control.
-     *
-     * @return the list control
-     */
-    public org.eclipse.swt.widgets.List getList() {
-        return list;
-    }
-
-    /*
-     * Non-Javadoc.
-     * Method defined on StructuredViewer.
-     */
-    public void reveal(Object element) {
-        Assert.isNotNull(element);
-        int index = getElementIndex(element);
-        if (index == -1) {
-			return;
-		}
-        // algorithm patterned after List.showSelection()
-        int count = list.getItemCount();
-        if (count == 0) {
-			return;
-		}
-        int height = list.getItemHeight();
-        Rectangle rect = list.getClientArea();
-        int topIndex = list.getTopIndex();
-        int visibleCount = Math.max(rect.height / height, 1);
-        int bottomIndex = Math.min(topIndex + visibleCount, count) - 1;
-        if ((topIndex <= index) && (index <= bottomIndex)) {
-			return;
-		}
-        int newTop = Math.min(Math.max(index - (visibleCount / 2), 0),
-                count - 1);
-        list.setTopIndex(newTop);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.AbstractListViewer#listAdd(java.lang.String, int)
-     */
-    protected void listAdd(String string, int index) {
-        list.add(string, index);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.AbstractListViewer#listSetItem(int, java.lang.String)
-     */
-    protected void listSetItem(int index, String string) {
-        list.setItem(index, string);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.AbstractListViewer#listGetSelectionIndices()
-     */
-    protected int[] listGetSelectionIndices() {
-        return list.getSelectionIndices();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.AbstractListViewer#listGetItemCount()
-     */
-    protected int listGetItemCount() {
-        return list.getItemCount();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.AbstractListViewer#listSetItems(java.lang.String[])
-     */
-    protected void listSetItems(String[] labels) {
-        list.setItems(labels);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.AbstractListViewer#listRemoveAll()
-     */
-    protected void listRemoveAll() {
-        list.removeAll();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.AbstractListViewer#listRemove(int)
-     */
-    protected void listRemove(int index) {
-        list.remove(index);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.AbstractListViewer#listSelectAndShow(int[])
-     */
-    protected void listSetSelection(int[] ixs) {
-        list.setSelection(ixs);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.AbstractListViewer#listDeselectAll()
-     */
-    protected void listDeselectAll() {
-        list.deselectAll();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.AbstractListViewer#listShowSelection()
-     */
-    protected void listShowSelection() {
-        list.showSelection();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.AbstractListViewer#listGetTopIndex()
-     */
-    protected int listGetTopIndex() {
-    	return list.getTopIndex();
-    }
-    
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.viewers.AbstractListViewer#listSetTopIndex(int)
-     */
-    protected void listSetTopIndex(int index) {
-    	list.setTopIndex(index);
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.AbstractListViewer#setSelectionToWidget(java.util.List, boolean)
-	 */
-	protected void setSelectionToWidget(List in, boolean reveal) {
-		if( reveal ) {
-			super.setSelectionToWidget(in, reveal);
-		} else {
-			if (in == null || in.size() == 0) { // clear selection
-	            list.deselectAll();
-	        } else {
-	            int n = in.size();
-	            int[] ixs = new int[n];
-	            int count = 0;
-	            for (int i = 0; i < n; ++i) {
-	                Object el = in.get(i);
-	                int ix = getElementIndex(el);
-	                if (ix >= 0) {
-						ixs[count++] = ix;
-					}
-	            }
-	            if (count < n) {
-	                System.arraycopy(ixs, 0, ixs = new int[count], 0, count);
-	            }
-	            list.deselectAll();
-	            list.select(ixs);
-	        }
-		}
-	}
-    
-    
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/NamedHandleObjectLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/NamedHandleObjectLabelProvider.java
deleted file mode 100644
index 256700b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/NamedHandleObjectLabelProvider.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.commands.common.NamedHandleObject;
-import org.eclipse.core.commands.common.NotDefinedException;
-
-/**
- * A label provider for instances of <code>NamedHandlerObject</code>, which
- * exposes the name as the label.
- * 
- * @since 3.2
- */
-public final class NamedHandleObjectLabelProvider extends LabelProvider {
-	
-	/**
-	 * The text of the element is simply the name of the element if its a
-	 * defined instance of <code>NamedHandleObject</code>. Otherwise, this
-	 * method just returns <code>null</code>.
-	 * 
-	 * @param element
-	 *            The element for which the text should be retrieved; may be
-	 *            <code>null</code>.
-	 * @return the name of the handle object; <code>null</code> if there is no
-	 *         name or if the element is not a named handle object.
-	 */
-	public final String getText(final Object element) {
-		if (element instanceof NamedHandleObject) {
-			try {
-				return ((NamedHandleObject) element).getName();
-			} catch (final NotDefinedException e) {
-				return null;
-			}
-		}
-
-		return null;
-	}
-}
-
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/OpenEvent.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/OpenEvent.java
deleted file mode 100644
index 96df2e3..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/OpenEvent.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.EventObject;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * Event object describing an open which may be generated from a 
- * selection or default selection event. The source of these
- * events is a viewer.
- *
- * @see IOpenListener
- */
-public class OpenEvent extends EventObject {
-
-    /**
-     * Generated serial version UID for this class.
-     * @since 3.1
-     */
-    private static final long serialVersionUID = 3761972652973176117L;
-    
-    /**
-     * The selection.
-     */
-    protected ISelection selection;
-
-    /**
-     * Creates a new event for the given source and selection.
-     *
-     * @param source the viewer
-     * @param selection the selection
-     */
-    public OpenEvent(Viewer source, ISelection selection) {
-        super(source);
-        Assert.isNotNull(selection);
-        this.selection = selection;
-    }
-
-    /**
-     * Returns the selection.
-     *
-     * @return the selection
-     */
-    public ISelection getSelection() {
-        return selection;
-    }
-
-    /**
-     * Returns the viewer that is the source of this event.
-     *
-     * @return the originating viewer
-     */
-    public Viewer getViewer() {
-        return (Viewer) getSource();
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/OwnerDrawLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/OwnerDrawLabelProvider.java
deleted file mode 100644
index 68ec4b4..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/OwnerDrawLabelProvider.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * OwnerDrawLabelProvider is an abstract implementation of a label provider that
- * handles custom draw.
- * 
- * <p>
- * <b>This class is intended to be subclassed by implementors.</b>
- * </p>
- * 
- * @since 3.3
- * 
- */
-public abstract class OwnerDrawLabelProvider extends CellLabelProvider {
-
-	static class OwnerDrawListener implements Listener {
-		Set enabledColumns = new HashSet();
-		int enabledGlobally = 0;
-		private ColumnViewer viewer;
-
-		OwnerDrawListener(ColumnViewer viewer) {
-			this.viewer = viewer;
-		}
-
-		public void handleEvent(Event event) {
-			CellLabelProvider provider = viewer.getViewerColumn(event.index)
-					.getLabelProvider();
-			ViewerColumn column = viewer.getViewerColumn(event.index);
-			if (enabledGlobally > 0 || enabledColumns.contains(column)) {
-				if (provider instanceof OwnerDrawLabelProvider) {
-					Object element = event.item.getData();
-					OwnerDrawLabelProvider ownerDrawProvider = (OwnerDrawLabelProvider) provider;
-					switch (event.type) {
-					case SWT.MeasureItem:
-						ownerDrawProvider.measure(event, element);
-						break;
-					case SWT.PaintItem:
-						ownerDrawProvider.paint(event, element);
-						break;
-					case SWT.EraseItem:
-						ownerDrawProvider.erase(event, element);
-						break;
-					}
-				}
-			}
-		}
-	}
-
-	private static final String OWNER_DRAW_LABEL_PROVIDER_LISTENER = "owner_draw_label_provider_listener"; //$NON-NLS-1$
-
-	/**
-	 * Set up the owner draw callbacks for the viewer.
-	 * 
-	 * @param viewer
-	 *            the viewer the owner draw is set up
-	 * 
-	 * @deprecated Since 3.4, the default implementation of
-	 *             {@link CellLabelProvider#initialize(ColumnViewer, ViewerColumn)}
-	 *             in this class will set up the necessary owner draw callbacks
-	 *             automatically. Calls to this method can be removed.
-	 */
-	public static void setUpOwnerDraw(final ColumnViewer viewer) {
-		getOrCreateOwnerDrawListener(viewer).enabledGlobally++;
-	}
-
-	/**
-	 * @param viewer
-	 * @param control
-	 * @return
-	 */
-	private static OwnerDrawListener getOrCreateOwnerDrawListener(
-			final ColumnViewer viewer) {
-		Control control = viewer.getControl();
-		OwnerDrawListener listener = (OwnerDrawListener) control
-				.getData(OWNER_DRAW_LABEL_PROVIDER_LISTENER);
-		if (listener == null) {
-			listener = new OwnerDrawListener(viewer);
-			control.setData(OWNER_DRAW_LABEL_PROVIDER_LISTENER, listener);
-			control.addListener(SWT.MeasureItem, listener);
-			control.addListener(SWT.EraseItem, listener);
-			control.addListener(SWT.PaintItem, listener);
-		}
-		return listener;
-	}
-
-	/**
-	 * Create a new instance of the receiver based on a column viewer.
-	 * 
-	 */
-	public OwnerDrawLabelProvider() {
-
-	}
-
-	public void dispose(ColumnViewer viewer, ViewerColumn column) {
-		if (!viewer.getControl().isDisposed()) {
-			setOwnerDrawEnabled(viewer, column, false);
-		}
-		super.dispose(viewer, column);
-	}
-
-	/**
-	 * This implementation of
-	 * {@link CellLabelProvider#initialize(ColumnViewer, ViewerColumn)}
-	 * delegates to {@link #initialize(ColumnViewer, ViewerColumn, boolean)}
-	 * with a value of <code>true</code> for <code>enableOwnerDraw</code>.
-	 * Subclasses may override this method but should either call the super
-	 * implementation or, alternatively,
-	 * {@link #initialize(ColumnViewer, ViewerColumn, boolean)}.
-	 */
-	protected void initialize(ColumnViewer viewer, ViewerColumn column) {
-		this.initialize(viewer, column, true);
-	}
-
-	/**
-	 * May be called from subclasses that override
-	 * {@link #initialize(ColumnViewer, ViewerColumn)} but want to customize
-	 * whether owner draw will be enabled. This method calls
-	 * <code>super.initialize(ColumnViewer, ViewerColumn)</code>, and then
-	 * enables or disables owner draw by calling
-	 * {@link #setOwnerDrawEnabled(ColumnViewer, ViewerColumn, boolean)}.
-	 * 
-	 * @param viewer
-	 *            the viewer
-	 * @param column
-	 *            the column, or <code>null</code> if a column is not
-	 *            available.
-	 * @param enableOwnerDraw
-	 *            <code>true</code> if owner draw should be enabled for the
-	 *            given viewer and column, <code>false</code> otherwise.
-	 * 
-	 * @since 3.4
-	 */
-	final protected void initialize(ColumnViewer viewer, ViewerColumn column,
-			boolean enableOwnerDraw) {
-		super.initialize(viewer, column);
-		setOwnerDrawEnabled(viewer, column, enableOwnerDraw);
-	}
-
-	public void update(ViewerCell cell) {
-		// Force a redraw
-		Rectangle cellBounds = cell.getBounds();
-		cell.getControl().redraw(cellBounds.x, cellBounds.y, cellBounds.width,
-				cellBounds.height, true);
-
-	}
-
-	/**
-	 * Handle the erase event. The default implementation colors the background
-	 * of selected areas with {@link SWT#COLOR_LIST_SELECTION} and foregrounds
-	 * with {@link SWT#COLOR_LIST_SELECTION_TEXT}. Note that this
-	 * implementation causes non-native behavior on some platforms. Subclasses
-	 * should override this method and <b>not</b> call the super
-	 * implementation.
-	 * 
-	 * @param event
-	 *            the erase event
-	 * @param element
-	 *            the model object
-	 * @see SWT#EraseItem
-	 * @see SWT#COLOR_LIST_SELECTION
-	 * @see SWT#COLOR_LIST_SELECTION_TEXT
-	 */
-	protected void erase(Event event, Object element) {
-
-		Rectangle bounds = event.getBounds();
-		if ((event.detail & SWT.SELECTED) != 0) {
-
-			Color oldForeground = event.gc.getForeground();
-			Color oldBackground = event.gc.getBackground();
-
-			event.gc.setBackground(event.item.getDisplay().getSystemColor(
-					SWT.COLOR_LIST_SELECTION));
-			event.gc.setForeground(event.item.getDisplay().getSystemColor(
-					SWT.COLOR_LIST_SELECTION_TEXT));
-			event.gc.fillRectangle(bounds);
-			/* restore the old GC colors */
-			event.gc.setForeground(oldForeground);
-			event.gc.setBackground(oldBackground);
-			/* ensure that default selection is not drawn */
-			event.detail &= ~SWT.SELECTED;
-
-		}
-
-	}
-
-	/**
-	 * Handle the measure event.
-	 * 
-	 * @param event
-	 *            the measure event
-	 * @param element
-	 *            the model element
-	 * @see SWT#MeasureItem
-	 */
-	protected abstract void measure(Event event, Object element);
-
-	/**
-	 * Handle the paint event.
-	 * 
-	 * @param event
-	 *            the paint event
-	 * @param element
-	 *            the model element
-	 * @see SWT#PaintItem
-	 */
-	protected abstract void paint(Event event, Object element);
-
-	/**
-	 * Enables or disables owner draw for the given viewer and column. This
-	 * method will attach or remove a listener to the underlying control as
-	 * necessary. This method is called from
-	 * {@link #initialize(ColumnViewer, ViewerColumn)} and
-	 * {@link #dispose(ColumnViewer, ViewerColumn)} but may be called from
-	 * subclasses to enable or disable owner draw dynamically.
-	 * 
-	 * @param viewer
-	 *            the viewer
-	 * @param column
-	 *            the column, or <code>null</code> if a column is not
-	 *            available
-	 * @param enabled
-	 *            <code>true</code> if owner draw should be enabled,
-	 *            <code>false</code> otherwise
-	 * 
-	 * @since 3.4
-	 */
-	protected void setOwnerDrawEnabled(ColumnViewer viewer,
-			ViewerColumn column, boolean enabled) {
-		if (enabled) {
-			OwnerDrawListener listener = getOrCreateOwnerDrawListener(viewer);
-			if (column == null) {
-				listener.enabledGlobally++;
-			} else {
-				listener.enabledColumns.add(column);
-			}
-		} else {
-			OwnerDrawListener listener = (OwnerDrawListener) viewer
-					.getControl().getData(OWNER_DRAW_LABEL_PROVIDER_LISTENER);
-			if (listener != null) {
-				if (column == null) {
-					listener.enabledGlobally--;
-				} else {
-					listener.enabledColumns.remove(column);
-				}
-				if (listener.enabledColumns.isEmpty()
-						&& listener.enabledGlobally <= 0) {
-					viewer.getControl().removeListener(SWT.MeasureItem,
-							listener);
-					viewer.getControl().removeListener(SWT.EraseItem, listener);
-					viewer.getControl().removeListener(SWT.PaintItem, listener);
-					viewer.getControl().setData(
-							OWNER_DRAW_LABEL_PROVIDER_LISTENER, null);
-				}
-			}
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/SWTFocusCellManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/SWTFocusCellManager.java
deleted file mode 100644
index ce58349..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/SWTFocusCellManager.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *                                               - bug fix for bug 187189, 182800, 215069
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * This class is responsible to provide cell management base features for the
- * SWT-Controls {@link org.eclipse.swt.widgets.Table} and
- * {@link org.eclipse.swt.widgets.Tree}.
- *
- * @since 3.3
- *
- */
-abstract class SWTFocusCellManager {
-
-	private CellNavigationStrategy navigationStrategy;
-
-	private ColumnViewer viewer;
-
-	private ViewerCell focusCell;
-
-	private FocusCellHighlighter cellHighlighter;
-
-	private DisposeListener itemDeletionListener = new DisposeListener() {
-
-		public void widgetDisposed(DisposeEvent e) {
-			setFocusCell(null);
-		}
-
-	};
-
-	/**
-	 * @param viewer
-	 * @param focusDrawingDelegate
-	 * @param navigationDelegate
-	 */
-	public SWTFocusCellManager(ColumnViewer viewer,
-			FocusCellHighlighter focusDrawingDelegate,
-			CellNavigationStrategy navigationDelegate) {
-		this.viewer = viewer;
-		this.cellHighlighter = focusDrawingDelegate;
-		this.navigationStrategy = navigationDelegate;
-		hookListener(viewer);
-	}
-
-	/**
-	 * This method is called by the framework to initialize this cell manager.
-	 */
-	void init() {
-		this.cellHighlighter.init();
-		this.navigationStrategy.init();
-	}
-
-	private void handleMouseDown(Event event) {
-		ViewerCell cell = viewer.getCell(new Point(event.x, event.y));
-		if (cell != null) {
-
-			if (!cell.equals(focusCell)) {
-				setFocusCell(cell);
-			}
-		}
-	}
-
-	private void handleKeyDown(Event event) {
-		ViewerCell tmp = null;
-
-		if (navigationStrategy.isCollapseEvent(viewer, focusCell, event)) {
-			navigationStrategy.collapse(viewer, focusCell, event);
-		} else if (navigationStrategy.isExpandEvent(viewer, focusCell, event)) {
-			navigationStrategy.expand(viewer, focusCell, event);
-		} else if (navigationStrategy.isNavigationEvent(viewer, event)) {
-			tmp = navigationStrategy.findSelectedCell(viewer, focusCell, event);
-
-			if (tmp != null) {
-				if (!tmp.equals(focusCell)) {
-					setFocusCell(tmp);
-				}
-			}
-		}
-
-		if (navigationStrategy.shouldCancelEvent(viewer, event)) {
-			event.doit = false;
-		}
-	}
-
-	private void handleSelection(Event event) {
-		if ((event.detail & SWT.CHECK) == 0 && focusCell != null && focusCell.getItem() != event.item
-				&& event.item != null ) {
-			ViewerRow row = viewer.getViewerRowFromItem(event.item);
-			Assert
-					.isNotNull(row,
-							"Internal Structure invalid. Row item has no row ViewerRow assigned"); //$NON-NLS-1$
-			ViewerCell tmp = row.getCell(focusCell.getColumnIndex());
-			if (!focusCell.equals(tmp)) {
-				setFocusCell(tmp);
-			}
-		}
-	}
-
-	/**
-	 * Handles the {@link SWT#FocusIn} event.
-	 * 
-	 * @param event the event
-	 */
-	private void handleFocusIn(Event event) {
-		if (focusCell == null) {
-			setFocusCell(getInitialFocusCell());
-		}
-	}
-
-	abstract ViewerCell getInitialFocusCell();
-
-	private void hookListener(ColumnViewer viewer) {
-		Listener listener = new Listener() {
-
-			public void handleEvent(Event event) {
-				switch (event.type) {
-				case SWT.MouseDown:
-					handleMouseDown(event);
-					break;
-				case SWT.KeyDown:
-					handleKeyDown(event);
-					break;
-				case SWT.Selection:
-					handleSelection(event);
-					break;
-				case SWT.FocusIn:
-					handleFocusIn(event);
-					break;
-				}
-			}
-		};
-
-		viewer.getControl().addListener(SWT.MouseDown, listener);
-		viewer.getControl().addListener(SWT.KeyDown, listener);
-		viewer.getControl().addListener(SWT.Selection, listener);
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				if( event.selection.isEmpty() ) {
-					setFocusCell(null);
-				}
-			}
-
-		});
-		viewer.getControl().addListener(SWT.FocusIn, listener);
-	}
-
-	/**
-	 * @return the cell with the focus
-	 *
-	 */
-	public ViewerCell getFocusCell() {
-		return focusCell;
-	}
-
-	void setFocusCell(ViewerCell focusCell) {
-		ViewerCell oldCell = this.focusCell;
-
-		if( this.focusCell != null && ! this.focusCell.getItem().isDisposed() ) {
-			this.focusCell.getItem().removeDisposeListener(itemDeletionListener);
-		}
-
-		this.focusCell = focusCell;
-
-		if( this.focusCell != null && ! this.focusCell.getItem().isDisposed() ) {
-			this.focusCell.getItem().addDisposeListener(itemDeletionListener);
-		}
-
-		this.cellHighlighter.focusCellChanged(focusCell,oldCell);
-	}
-
-	ColumnViewer getViewer() {
-		return viewer;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/SelectionChangedEvent.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/SelectionChangedEvent.java
deleted file mode 100644
index 1c13c80..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/SelectionChangedEvent.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.EventObject;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * Event object describing a selection change. The source of these
- * events is a selection provider.
- *
- * @see ISelection
- * @see ISelectionProvider
- * @see ISelectionChangedListener
- */
-public class SelectionChangedEvent extends EventObject {
-
-    /**
-     * Generated serial version UID for this class.
-     * @since 3.1
-     */
-    private static final long serialVersionUID = 3835149545519723574L;
-    
-    /**
-     * The selection.
-     */
-    protected ISelection selection;
-
-    /**
-     * Creates a new event for the given source and selection.
-     *
-     * @param source the selection provider
-     * @param selection the selection
-     */
-    public SelectionChangedEvent(ISelectionProvider source, ISelection selection) {
-        super(source);
-        Assert.isNotNull(selection);
-        this.selection = selection;
-    }
-
-    /**
-     * Returns the selection.
-     *
-     * @return the selection
-     */
-    public ISelection getSelection() {
-        return selection;
-    }
-
-    /**
-     * Returns the selection provider that is the source of this event.
-     *
-     * @return the originating selection provider
-     */
-    public ISelectionProvider getSelectionProvider() {
-        return (ISelectionProvider) getSource();
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StructuredSelection.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StructuredSelection.java
deleted file mode 100644
index c97c9c2..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StructuredSelection.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * A concrete implementation of the <code>IStructuredSelection</code> interface,
- * suitable for instantiating.
- * <p>
- * This class is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class StructuredSelection implements IStructuredSelection {
-
-    /**
-     * The element that make up this structured selection.
-     */
-    private Object[] elements;
-
-    /**
-     * The element comparer, or <code>null</code>
-     */
-	private IElementComparer comparer;
-
-    /**
-     * The canonical empty selection. This selection should be used instead of
-     * <code>null</code>.
-     */
-    public static final StructuredSelection EMPTY = new StructuredSelection();
-
-    /**
-     * Creates a new empty selection.  
-     * See also the static field <code>EMPTY</code> which contains an empty selection singleton.
-     *
-     * @see #EMPTY
-     */
-    public StructuredSelection() {
-    }
-
-    /**
-     * Creates a structured selection from the given elements.
-     * The given element array must not be <code>null</code>.
-     *
-     * @param elements an array of elements
-     */
-    public StructuredSelection(Object[] elements) {
-    	Assert.isNotNull(elements);
-        this.elements = new Object[elements.length];
-        System.arraycopy(elements, 0, this.elements, 0, elements.length);
-    }
-
-    /**
-     * Creates a structured selection containing a single object.
-     * The object must not be <code>null</code>.
-     *
-     * @param element the element
-     */
-    public StructuredSelection(Object element) {
-        Assert.isNotNull(element);
-        elements = new Object[] { element };
-    }
-
-    /**
-     * Creates a structured selection from the given <code>List</code>. 
-     * @param elements list of selected elements
-     */
-    public StructuredSelection(List elements) {
-    	this(elements, null);
-    }
-
-    /**
-	 * Creates a structured selection from the given <code>List</code> and
-	 * element comparer. If an element comparer is provided, it will be used to
-	 * determine equality between structured selection objects provided that
-	 * they both are based on the same (identical) comparer. See bug 
-	 * 
-	 * @param elements
-	 *            list of selected elements
-	 * @param comparer
-	 *            the comparer, or null
-	 * @since 3.4
-	 */
-	public StructuredSelection(List elements, IElementComparer comparer) {
-        Assert.isNotNull(elements);
-        this.elements = elements.toArray();
-        this.comparer = comparer;
-	}
-
-	/**
-     * Returns whether this structured selection is equal to the given object.
-     * Two structured selections are equal if they contain the same elements
-     * in the same order.
-     *
-     * @param o the other object
-     * @return <code>true</code> if they are equal, and <code>false</code> otherwise
-     */
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        //null and other classes
-        if (!(o instanceof StructuredSelection)) {
-            return false;
-        }
-        StructuredSelection s2 = (StructuredSelection) o;
-
-        // either or both empty?
-        if (isEmpty()) {
-            return s2.isEmpty();
-        }
-        if (s2.isEmpty()) {
-            return false;
-        }
-
-        boolean useComparer = comparer != null && comparer == s2.comparer;
-        
-        //size
-        int myLen = elements.length;
-        if (myLen != s2.elements.length) {
-            return false;
-        }
-        //element comparison
-        for (int i = 0; i < myLen; i++) {
-        	if (useComparer) {
-                if (!comparer.equals(elements[i], s2.elements[i])) {
-                    return false;
-                }
-        	} else {
-	            if (!elements[i].equals(s2.elements[i])) {
-	                return false;
-	            }
-        	}
-        }
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * Method declared in IStructuredSelection.
-     */
-    public Object getFirstElement() {
-        return isEmpty() ? null : elements[0];
-    }
-
-    /* (non-Javadoc)
-     * Method declared in ISelection.
-     */
-    public boolean isEmpty() {
-        return elements == null || elements.length == 0;
-    }
-
-    /* (non-Javadoc)
-     * Method declared in IStructuredSelection.
-     */
-    public Iterator iterator() {
-        return Arrays.asList(elements == null ? new Object[0] : elements)
-                .iterator();
-    }
-
-    /* (non-Javadoc)
-     * Method declared in IStructuredSelection.
-     */
-    public int size() {
-        return elements == null ? 0 : elements.length;
-    }
-
-    /* (non-Javadoc)
-     * Method declared in IStructuredSelection.
-     */
-    public Object[] toArray() {
-        return elements == null ? new Object[0] : (Object[]) elements.clone();
-    }
-
-    /* (non-Javadoc)
-     * Method declared in IStructuredSelection.
-     */
-    public List toList() {
-        return Arrays.asList(elements == null ? new Object[0] : elements);
-    }
-
-    /**
-     * Internal method which returns a string representation of this
-     * selection suitable for debug purposes only.
-     *
-     * @return debug string
-     */
-    public String toString() {
-        return isEmpty() ? JFaceResources.getString("<empty_selection>") : toList().toString(); //$NON-NLS-1$
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StructuredViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StructuredViewer.java
deleted file mode 100644
index 9ac0322..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StructuredViewer.java
+++ /dev/null
@@ -1,2214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl - bug 151205
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.IOpenEventListener;
-import org.eclipse.jface.util.OpenStrategy;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.swt.custom.TableTreeItem;
-import org.eclipse.swt.dnd.DragSource;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.DropTarget;
-import org.eclipse.swt.dnd.DropTargetListener;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * Abstract base implementation for structure-oriented viewers (trees, lists,
- * tables). Supports custom sorting, filtering, and rendering.
- * <p>
- * Any number of viewer filters can be added to this viewer (using
- * <code>addFilter</code>). When the viewer receives an update, it asks each
- * of its filters if it is out of date, and refilters elements as required.
- * </p>
- * 
- * @see ViewerFilter
- * @see ViewerComparator
- */
-public abstract class StructuredViewer extends ContentViewer implements IPostSelectionProvider {
-
-	/**
-	 * A map from the viewer's model elements to SWT widgets. (key type:
-	 * <code>Object</code>, value type: <code>Widget</code>, or <code>Widget[]</code>).
-	 * <code>null</code> means that the element map is disabled.
-	 */
-	private CustomHashtable elementMap;
-
-	/**
-	 * The comparer to use for comparing elements, or <code>null</code> to use
-	 * the default <code>equals</code> and <code>hashCode</code> methods on
-	 * the element itself.
-	 */
-	private IElementComparer comparer;
-
-	/**
-	 * This viewer's comparator used for sorting. <code>null</code> means there is no comparator.
-	 */
-	private ViewerComparator sorter;
-
-	/**
-	 * This viewer's filters (element type: <code>ViewerFilter</code>).
-	 * <code>null</code> means there are no filters.
-	 */
-	private List filters;
-
-	/**
-	 * Indicates whether a selection change is in progress on this viewer.
-	 * 
-	 * @see #setSelection(ISelection, boolean)
-	 */
-	private boolean inChange;
-
-	/**
-	 * Used while a selection change is in progress on this viewer to indicates
-	 * whether the selection should be restored.
-	 * 
-	 * @see #setSelection(ISelection, boolean)
-	 */
-	private boolean restoreSelection;
-
-	/**
-	 * List of double-click state listeners (element type:
-	 * <code>IDoubleClickListener</code>).
-	 * 
-	 * @see #fireDoubleClick
-	 */
-	private ListenerList doubleClickListeners = new ListenerList();
-
-	/**
-	 * List of open listeners (element type:
-	 * <code>ISelectionActivateListener</code>).
-	 * 
-	 * @see #fireOpen
-	 */
-	private ListenerList openListeners = new ListenerList();
-
-	/**
-	 * List of post selection listeners (element type:
-	 * <code>ISelectionActivateListener</code>).
-	 * 
-	 * @see #firePostSelectionChanged
-	 */
-	private ListenerList postSelectionChangedListeners = new ListenerList();
-
-	/**
-	 * The colorAndFontCollector is an object used by viewers that
-	 * support the IColorProvider, the IFontProvider and/or the 
-	 * IViewerLabelProvider for color and font updates.
-	 * Initialize it to have no color or font providing
-	 * initially.
-	 * @since 3.1
-	 */
-	private ColorAndFontCollector colorAndFontCollector = new ColorAndFontCollector();
-	
-	/**
-	 * Empty array of widgets.
-	 */
-	private static Widget[] NO_WIDGETS = new Widget[0];
-
-	/**
-	 * The ColorAndFontCollector is a helper class for viewers
-	 * that have color and font support ad optionally decorators.
-	 * @see IColorDecorator
-	 * @see IFontDecorator
-	 * @see IColorProvider
-	 * @see IFontProvider
-	 * @see IDecoration
-	 */
-	protected class ColorAndFontCollectorWithProviders extends ColorAndFontCollector{
-
-		IColorProvider colorProvider;
-
-		IFontProvider fontProvider;
-		
-		/**
-		 * Create a new instance of the receiver using the supplied
-		 * label provider. If it is an IColorProvider or IFontProvider
-		 * set these values up.
-		 * @param provider IBaseLabelProvider
-		 * @see IColorProvider
-		 * @see IFontProvider
-		 */
-		public ColorAndFontCollectorWithProviders(IBaseLabelProvider provider) {
-			super();
-			if (provider instanceof IColorProvider) {
-				colorProvider = (IColorProvider) provider;
-			}
-			if (provider instanceof IFontProvider) {
-				fontProvider = (IFontProvider) provider;
-			}
-		}
-		
-	
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.StructuredViewer.ColorAndFontManager#setFontsAndColors(java.lang.Object)
-		 */
-		public void setFontsAndColors(Object element){
-			
-			if(fontProvider != null){
-				if(font == null) {
-					font = fontProvider.getFont(element);
-				}	
-			}
-			
-			if(colorProvider == null) {
-				return;
-			}			
-			//Set the colors if they are not set yet
-			if(background == null) {
-				background = colorProvider.getBackground(element);
-			}
-			
-			if(foreground == null) {
-				foreground = colorProvider.getForeground(element);
-			}			
-		}
-		
-		/**
-		 * Apply the fonts and colors to the control if
-		 * required.
-		 * @param control
-		 */
-		public void applyFontsAndColors(TableItem control) {
-			
-			if(colorProvider == null){
-				if(usedDecorators){
-					//If there is no provider only apply set values
-					if(background != null) {
-						control.setBackground(background);
-					}
-				
-					if(foreground != null) {
-						control.setForeground(foreground);
-					}
-				}
-			}
-			else{
-				//Always set the value if there is a provider
-				control.setBackground(background);
-				control.setForeground(foreground);
-			}
-			
-			if(fontProvider == null){
-				if(usedDecorators && font != null) {
-					control.setFont(font);
-				}
-			} else {
-				control.setFont(font);
-			}
-			
-			clear();
-		}
-		
-
-	
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.StructuredViewer.ColorAndFontManager#applyFontsAndColors(org.eclipse.swt.widgets.TreeItem)
-		 */
-		public void applyFontsAndColors(TreeItem control) {
-			
-			if(colorProvider == null){
-				if(usedDecorators){
-					//If there is no provider only apply set values
-					if(background != null) {
-						control.setBackground(background);
-					}
-				
-					if(foreground != null) {
-						control.setForeground(foreground);
-					}
-				}
-			}
-			else{
-				//Always set the value if there is a provider
-				control.setBackground(background);
-				control.setForeground(foreground);
-			}
-			
-			if(fontProvider == null){
-				if(usedDecorators && font != null) {
-					control.setFont(font);
-				}
-			} else {
-				control.setFont(font);
-			}
-			
-			clear();
-		}
-		
-	
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.StructuredViewer.ColorAndFontManager#applyFontsAndColors(org.eclipse.swt.custom.TableTreeItem)
-		 */
-		public void applyFontsAndColors(TableTreeItem control) {
-			
-			if(colorProvider == null){
-				if(usedDecorators){
-					//If there is no provider only apply set values
-					if(background != null) {
-						control.setBackground(background);
-					}
-				
-					if(foreground != null) {
-						control.setForeground(foreground);
-					}
-				}
-			}
-			else{
-				//Always set the value if there is a provider
-				control.setBackground(background);
-				control.setForeground(foreground);
-			}
-			
-			if(fontProvider == null){
-				if(usedDecorators && font != null) {
-					control.setFont(font);
-				}
-			} else {
-				control.setFont(font);
-			}
-			
-			clear();
-		}
-		
-		
-	}
-	
-	/**
-	 * The ColorAndFontCollector collects fonts and colors without a
-	 * a color or font provider.
-	 *
-	 */
-	protected class ColorAndFontCollector {
-
-		Color foreground = null;
-
-		Color background = null;
-
-		Font font = null;
-
-		boolean usedDecorators = false;
-
-		/**
-		 * Create a new instance of the receiver with
-		 * no color and font provider.	
-		 */
-		public ColorAndFontCollector(){
-			super();
-		}
-		
-
-		/**
-		 * Clear all of the results.
-		 */
-		public void clear() {
-			foreground = null;
-			background = null;
-			font = null;
-			usedDecorators = false;
-		}
-
-		
-		/**
-		 * Set the initial fonts and colors for the element from the
-		 * content providers.
-		 * @param element Object
-		 */
-		public void setFontsAndColors(Object element){
-			//Do nothing if there are no providers
-		}
-
-		/**
-		 * Set that decorators were applied.
-		 */
-		public void setUsedDecorators() {
-			this.usedDecorators = true;
-		}
-
-		/**
-		 * Apply the fonts and colors to the control if
-		 * required.
-		 * @param control
-		 */
-		public void applyFontsAndColors(TableItem control) {
-			
-			if(usedDecorators){
-				//If there is no provider only apply set values
-				if(background != null) {
-					control.setBackground(background);
-				}
-			
-				if(foreground != null) {
-					control.setForeground(foreground);
-				}
-		
-				if(font != null) {
-					control.setFont(font);
-				}
-			}
-			clear();
-		}
-		
-		/**
-		 * Apply the fonts and colors to the control if
-		 * required.
-		 * @param control
-		 */
-		public void applyFontsAndColors(TreeItem control) {
-			if(usedDecorators){
-				//If there is no provider only apply set values
-				if(background != null) {
-					control.setBackground(background);
-				}
-			
-				if(foreground != null) {
-					control.setForeground(foreground);
-				}
-		
-				if(font != null) {
-					control.setFont(font);
-				}
-			}
-			clear();
-		}
-		
-		/**
-		 * Apply the fonts and colors to the control if
-		 * required.
-		 * @param control
-		 */
-		public void applyFontsAndColors(TableTreeItem control) {
-			if(usedDecorators){
-				//If there is no provider only apply set values
-				if(background != null) {
-					control.setBackground(background);
-				}
-			
-				if(foreground != null) {
-					control.setForeground(foreground);
-				}
-		
-				if(font != null) {
-					control.setFont(font);
-				}
-			}
-			clear();
-		}
-		
-		/**
-		 * Set the background color.
-		 * @param background 
-		 */
-		public void setBackground(Color background) {
-			this.background = background;
-		}
-		/**
-		 * Set the font.
-		 * @param font 
-		 */
-		public void setFont(Font font) {
-			this.font = font;
-		}
-		/**
-		 * Set the foreground color.
-		 * @param foreground
-		 */
-		public void setForeground(Color foreground) {
-			this.foreground = foreground;
-		}
-	
-		
-	}
-
-	/**
-	 * The safe runnable used to update an item.
-	 */
-	class UpdateItemSafeRunnable extends SafeRunnable {
-		private Widget widget;
-
-		private Object element;
-
-		private boolean fullMap;
-
-		UpdateItemSafeRunnable(Widget widget, Object element, boolean fullMap) {
-			this.widget = widget;
-			this.element = element;
-			this.fullMap = fullMap;
-		}
-
-		public void run() {
-			doUpdateItem(widget, element, fullMap);
-		}
-	}
-	
-	/**
-	 * Creates a structured element viewer. The viewer has no input, no content
-	 * provider, a default label provider, no sorter, and no filters.
-	 */
-	protected StructuredViewer() {
-		// do nothing
-	}
-
-	/**
-	 * Adds a listener for double-clicks in this viewer. Has no effect if an
-	 * identical listener is already registered.
-	 * 
-	 * @param listener
-	 *            a double-click listener
-	 */
-	public void addDoubleClickListener(IDoubleClickListener listener) {
-		doubleClickListeners.add(listener);
-	}
-
-	/**
-	 * Adds a listener for selection-open in this viewer. Has no effect if an
-	 * identical listener is already registered.
-	 * 
-	 * @param listener
-	 *            an open listener
-	 */
-	public void addOpenListener(IOpenListener listener) {
-		openListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPostSelectionProvider.
-	 */
-	public void addPostSelectionChangedListener(ISelectionChangedListener listener) {
-		postSelectionChangedListeners.add(listener);
-	}
-
-	/**
-	 * Adds support for dragging items out of this viewer via a user
-	 * drag-and-drop operation.
-	 * 
-	 * @param operations
-	 *            a bitwise OR of the supported drag and drop operation types (
-	 *            <code>DROP_COPY</code>,<code>DROP_LINK</code>, and
-	 *            <code>DROP_MOVE</code>)
-	 * @param transferTypes
-	 *            the transfer types that are supported by the drag operation
-	 * @param listener
-	 *            the callback that will be invoked to set the drag data and to
-	 *            cleanup after the drag and drop operation finishes
-	 * @see org.eclipse.swt.dnd.DND
-	 */
-	public void addDragSupport(int operations, Transfer[] transferTypes, DragSourceListener listener) {
-
-		Control myControl = getControl();
-		final DragSource dragSource = new DragSource(myControl, operations);
-		dragSource.setTransfer(transferTypes);
-		dragSource.addDragListener(listener);
-	}
-
-	/**
-	 * Adds support for dropping items into this viewer via a user drag-and-drop
-	 * operation.
-	 * 
-	 * @param operations
-	 *            a bitwise OR of the supported drag and drop operation types (
-	 *            <code>DROP_COPY</code>,<code>DROP_LINK</code>, and
-	 *            <code>DROP_MOVE</code>)
-	 * @param transferTypes
-	 *            the transfer types that are supported by the drop operation
-	 * @param listener
-	 *            the callback that will be invoked after the drag and drop
-	 *            operation finishes
-	 * @see org.eclipse.swt.dnd.DND
-	 */
-	public void addDropSupport(int operations, Transfer[] transferTypes,
-			final DropTargetListener listener) {
-		Control control = getControl();
-		DropTarget dropTarget = new DropTarget(control, operations);
-		dropTarget.setTransfer(transferTypes);
-		dropTarget.addDropListener(listener);
-	}
-
-	/**
-	 * Adds the given filter to this viewer, and triggers refiltering and
-	 * resorting of the elements. If you want to add more than one filter
-	 * consider using {@link StructuredViewer#setFilters(ViewerFilter[])}.
-	 * 
-	 * @param filter
-	 *            a viewer filter
-	 * @see StructuredViewer#setFilters(ViewerFilter[])
-	 */
-	public void addFilter(ViewerFilter filter) {
-		if (filters == null) {
-			filters = new ArrayList();
-		}
-		filters.add(filter);
-		refresh();
-	}
-
-	/**
-	 * Asserts that the given array of elements is itself non- <code>null</code>
-	 * and contains no <code>null</code> elements.
-	 * 
-	 * @param elements
-	 *            the array to check
-	 */
-	protected void assertElementsNotNull(Object[] elements) {
-		Assert.isNotNull(elements);
-		for (int i = 0, n = elements.length; i < n; ++i) {
-			Assert.isNotNull(elements[i]);
-		}
-	}
-
-	/**
-	 * Associates the given element with the given widget. Sets the given item's
-	 * data to be the element, and maps the element to the item in the element
-	 * map (if enabled).
-	 * 
-	 * @param element
-	 *            the element
-	 * @param item
-	 *            the widget
-	 */
-	protected void associate(Object element, Item item) {
-		Object data = item.getData();
-		if (data != element) {
-			if (data != null) {
-				disassociate(item);
-			}
-			item.setData(element);
-		}
-		// Always map the element, even if data == element,
-		// since unmapAllElements() can leave the map inconsistent
-		// See bug 2741 for details.
-		mapElement(element, item);
-	}
-
-	/**
-	 * Disassociates the given SWT item from its corresponding element. Sets the
-	 * item's data to <code>null</code> and removes the element from the
-	 * element map (if enabled).
-	 * 
-	 * @param item
-	 *            the widget
-	 */
-	protected void disassociate(Item item) {
-		Object element = item.getData();
-		Assert.isNotNull(element);
-		//Clear the map before we clear the data
-		unmapElement(element, item);
-		item.setData(null);
-	}
-
-	/**
-	 * Returns the widget in this viewer's control which represents the given
-	 * element if it is the viewer's input.
-	 * <p>
-	 * This method is internal to the framework; subclassers should not call
-	 * this method.
-	 * </p>
-	 * 
-	 * @param element
-	 * @return the corresponding widget, or <code>null</code> if none
-	 */
-	protected abstract Widget doFindInputItem(Object element);
-
-	/**
-	 * Returns the widget in this viewer's control which represent the given
-	 * element. This method searches all the children of the input element.
-	 * <p>
-	 * This method is internal to the framework; subclassers should not call
-	 * this method.
-	 * </p>
-	 * 
-	 * @param element
-	 * @return the corresponding widget, or <code>null</code> if none
-	 */
-	protected abstract Widget doFindItem(Object element);
-
-	/**
-	 * Copies the attributes of the given element into the given SWT item. The
-	 * element map is updated according to the value of <code>fullMap</code>.
-	 * If <code>fullMap</code> is <code>true</code> then the current mapping
-	 * from element to widgets is removed and the new mapping is added. If
-	 * full map is <code>false</code> then only the new map gets installed.
-	 * Installing only the new map is necessary in cases where only the order of
-	 * elements changes but not the set of elements.
-	 * <p>
-	 * This method is internal to the framework; subclassers should not call
-	 * this method.
-	 * </p>
-	 * 
-	 * @param item
-	 * @param element element
-	 * @param fullMap
-	 *            <code>true</code> if mappings are added and removed, and
-	 *            <code>false</code> if only the new map gets installed
-	 */
-	protected abstract void doUpdateItem(Widget item, Object element, boolean fullMap);
-
-	/**
-	 * Compares two elements for equality. Uses the element comparer if one has
-	 * been set, otherwise uses the default <code>equals</code> method on the
-	 * elements themselves.
-	 * 
-	 * @param elementA
-	 *            the first element
-	 * @param elementB
-	 *            the second element
-	 * @return whether elementA is equal to elementB
-	 */
-	protected boolean equals(Object elementA, Object elementB) {
-		if (comparer == null) {
-			return elementA == null ? elementB == null : elementA.equals(elementB);
-		} else {
-			return elementA == null ? elementB == null : comparer.equals(elementA, elementB);
-		}
-	}
-
-	/**
-	 * Returns the result of running the given elements through the filters.
-	 * 
-	 * @param elements
-	 *            the elements to filter
-	 * @return only the elements which all filters accept
-	 */
-	protected Object[] filter(Object[] elements) {
-		if (filters != null) {
-			ArrayList filtered = new ArrayList(elements.length);
-			Object root = getRoot();
-			for (int i = 0; i < elements.length; i++) {
-				boolean add = true;
-				for (int j = 0; j < filters.size(); j++) {
-					add = ((ViewerFilter) filters.get(j)).select(this, root, elements[i]);
-					if (!add) {
-						break;
-					}
-				}
-				if (add) {
-					filtered.add(elements[i]);
-				}
-			}
-			return filtered.toArray();
-		}
-		return elements;
-	}
-
-	/**
-	 * Finds the widget which represents the given element.
-	 * <p>
-	 * The default implementation of this method tries first to find the widget
-	 * for the given element assuming that it is the viewer's input; this is
-	 * done by calling <code>doFindInputItem</code>. If it is not found
-	 * there, it is looked up in the internal element map provided that this
-	 * feature has been enabled. If the element map is disabled, the widget is
-	 * found via <code>doFindInputItem</code>.
-	 * </p>
-	 * 
-	 * @param element
-	 *            the element
-	 * @return the corresponding widget, or <code>null</code> if none
-	 */
-	protected final Widget findItem(Object element) {
-		Widget[] result = findItems(element);
-		return result.length == 0 ? null : result[0];
-	}
-
-	/**
-	 * Finds the widgets which represent the given element. The returned array
-	 * must not be changed by clients; it might change upon calling other
-	 * methods on this viewer.
-	 * <p>
-	 * This method was introduced to support multiple equal elements in a viewer
-	 * (@see {@link AbstractTreeViewer}). Multiple equal elements are only
-	 * supported if the element map is enabled by calling
-	 * {@link #setUseHashlookup(boolean)} and passing <code>true</code>.
-	 * </p>
-	 * <p>
-	 * The default implementation of this method tries first to find the widget
-	 * for the given element assuming that it is the viewer's input; this is
-	 * done by calling <code>doFindInputItem</code>. If it is not found
-	 * there, the widgets are looked up in the internal element map provided
-	 * that this feature has been enabled. If the element map is disabled, the
-	 * widget is found via <code>doFindInputItem</code>.
-	 * </p>
-	 * 
-	 * @param element
-	 *            the element
-	 * @return the corresponding widgets
-	 * 
-	 * @since 3.2
-	 */
-	protected final Widget[] findItems(Object element) {
-		Widget result = doFindInputItem(element);
-		if (result != null) {
-			return new Widget[] { result };
-		}
-		// if we have an element map use it, otherwise search for the item.
-		if (usingElementMap()) {
-			Object widgetOrWidgets = elementMap.get(element);
-			if (widgetOrWidgets==null) {
-				return NO_WIDGETS;
-			} else if (widgetOrWidgets instanceof Widget) {
-				return new Widget[] {(Widget) widgetOrWidgets};
-			} else {
-				return (Widget[])widgetOrWidgets;
-			}
-		}
-		result = doFindItem(element);
-		return result == null ? NO_WIDGETS : new Widget[] { result };
-	}
-
-	/**
-	 * Notifies any double-click listeners that a double-click has been
-	 * received. Only listeners registered at the time this method is called are
-	 * notified.
-	 * 
-	 * @param event
-	 *            a double-click event
-	 * 
-	 * @see IDoubleClickListener#doubleClick
-	 */
-	protected void fireDoubleClick(final DoubleClickEvent event) {
-		Object[] listeners = doubleClickListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final IDoubleClickListener l = (IDoubleClickListener) listeners[i];
-			SafeRunnable.run(new SafeRunnable() {
-				public void run() {
-					l.doubleClick(event);
-				}
-			});
-		}
-	}
-
-	/**
-	 * Notifies any open event listeners that a open event has been received.
-	 * Only listeners registered at the time this method is called are notified.
-	 * 
-	 * @param event
-	 *            a double-click event
-	 * 
-	 * @see IOpenListener#open(OpenEvent)
-	 */
-	protected void fireOpen(final OpenEvent event) {
-		Object[] listeners = openListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final IOpenListener l = (IOpenListener) listeners[i];
-			SafeRunnable.run(new SafeRunnable() {
-				public void run() {
-					l.open(event);
-				}
-			});
-		}
-	}
-
-	/**
-	 * Notifies any post selection listeners that a post selection event has
-	 * been received. Only listeners registered at the time this method is
-	 * called are notified.
-	 * 
-	 * @param event
-	 *            a selection changed event
-	 * 
-	 * @see #addPostSelectionChangedListener(ISelectionChangedListener)
-	 */
-	protected void firePostSelectionChanged(final SelectionChangedEvent event) {
-		Object[] listeners = postSelectionChangedListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
-			SafeRunnable.run(new SafeRunnable() {
-				public void run() {
-					l.selectionChanged(event);
-				}
-			});
-		}
-	}
-
-	/**
-	 * Returns the comparer to use for comparing elements, or
-	 * <code>null</code> if none has been set.  If specified,
-	 * the viewer uses this to compare and hash elements rather
-	 * than the elements' own equals and hashCode methods.
-	 *           
-	 * @return the comparer to use for comparing elements or
-	 *            <code>null</code>
-	 */
-	public IElementComparer getComparer() {
-		return comparer;
-	}
-
-	/**
-	 * Returns the filtered array of children of the given element. The
-	 * resulting array must not be modified, as it may come directly from the
-	 * model's internal state.
-	 * 
-	 * @param parent
-	 *            the parent element
-	 * @return a filtered array of child elements
-	 */
-	protected Object[] getFilteredChildren(Object parent) {
-		Object[] result = getRawChildren(parent);
-		if (filters != null) {
-			for (Iterator iter = filters.iterator(); iter.hasNext();) {
-				ViewerFilter f = (ViewerFilter) iter.next();
-				result = f.filter(this, parent, result);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns this viewer's filters.
-	 * 
-	 * @return an array of viewer filters
-	 * @see StructuredViewer#setFilters(ViewerFilter[])
-	 */
-	public ViewerFilter[] getFilters() {
-		if (filters == null) {
-			return new ViewerFilter[0];
-		}
-		ViewerFilter[] result = new ViewerFilter[filters.size()];
-		filters.toArray(result);
-		return result;
-	}
-
-	/**
-	 * Returns the item at the given display-relative coordinates, or
-	 * <code>null</code> if there is no item at that location or 
-	 * the underlying SWT-Control is not made up of {@link Item} 
-	 * (e.g {@link ListViewer}) 
-	 * <p>
-	 * The default implementation of this method returns <code>null</code>.
-	 * </p>
-	 * 
-	 * @param x
-	 *            horizontal coordinate
-	 * @param y
-	 *            vertical coordinate
-	 * @return the item, or <code>null</code> if there is no item at the given
-	 *         coordinates
-	 * @deprecated This method is deprecated in 3.3 in favor of {@link ColumnViewer#getItemAt(org.eclipse.swt.graphics.Point)}. 
-	 * Viewers who are not subclasses of {@link ColumnViewer} should consider using a
-	 * widget relative implementation like {@link ColumnViewer#getItemAt(org.eclipse.swt.graphics.Point)}.
-	 *  
-	 */
-	protected Item getItem(int x, int y) {
-		return null;
-	}
-
-	/**
-	 * Returns the children of the given parent without sorting and filtering
-	 * them. The resulting array must not be modified, as it may come directly
-	 * from the model's internal state.
-	 * <p>
-	 * Returns an empty array if the given parent is <code>null</code>.
-	 * </p>
-	 * 
-	 * @param parent
-	 *            the parent element
-	 * @return the child elements
-	 */
-	protected Object[] getRawChildren(Object parent) {
-		Object[] result = null;
-		if (parent != null) {
-			IStructuredContentProvider cp = (IStructuredContentProvider) getContentProvider();
-			if (cp != null) {
-				result = cp.getElements(parent);
-				assertElementsNotNull(result);
-			}
-		}
-		return (result != null) ? result : new Object[0];
-	}
-
-	/**
-	 * Returns the root element.
-	 * <p>
-	 * The default implementation of this framework method forwards to
-	 * <code>getInput</code>. Override if the root element is different from
-	 * the viewer's input element.
-	 * </p>
-	 * 
-	 * @return the root element, or <code>null</code> if none
-	 */
-	protected Object getRoot() {
-		return getInput();
-	}
-
-	/**
-	 * The <code>StructuredViewer</code> implementation of this method returns
-	 * the result as an <code>IStructuredSelection</code>.
-	 * <p>
-	 * Subclasses do not typically override this method, but implement
-	 * <code>getSelectionFromWidget(List)</code> instead.
-	 * <p>
-	 * @return ISelection
-	 */
-	public ISelection getSelection() {
-		Control control = getControl();
-		if (control == null || control.isDisposed()) {
-			return StructuredSelection.EMPTY;
-		}
-		List list = getSelectionFromWidget();
-		return new StructuredSelection(list, comparer);
-	}
-
-	/**
-	 * Retrieves the selection, as a <code>List</code>, from the underlying
-	 * widget.
-	 * 
-	 * @return the list of selected elements
-	 */
-	protected abstract List getSelectionFromWidget();
-
-	/**
-	 * Returns the sorted and filtered set of children of the given element. The
-	 * resulting array must not be modified, as it may come directly from the
-	 * model's internal state.
-	 * 
-	 * @param parent
-	 *            the parent element
-	 * @return a sorted and filtered array of child elements
-	 */
-	protected Object[] getSortedChildren(Object parent) {
-		Object[] result = getFilteredChildren(parent);
-		if (sorter != null) {
-			// be sure we're not modifying the original array from the model
-			result = (Object[]) result.clone();
-			sorter.sort(this, result);
-		}
-		return result;
-	}
-
-	/**
-	 * Returns this viewer's sorter, or <code>null</code> if it does not have
-	 * one.  If this viewer has a comparator that was set via 
-	 * <code>setComparator(ViewerComparator)</code> then this method will return 
-	 * <code>null</code> if the comparator is not an instance of ViewerSorter.
-     * <p>
-     * It is recommended to use <code>getComparator()</code> instead.
-     * </p>
-	 * 
-	 * @return a viewer sorter, or <code>null</code> if none or if the comparator is 
-	 * 				not an instance of ViewerSorter
-	 */
-	public ViewerSorter getSorter() {
-		if (sorter instanceof ViewerSorter)
-			return (ViewerSorter)sorter;
-		return null;
-	}
-
-	/**
-	 * Return this viewer's comparator used to sort elements.
-	 * This method should be used instead of <code>getSorter()</code>.
-	 * 
-	 * @return a viewer comparator, or <code>null</code> if none
-     *
-	 * @since 3.2
-	 */
-	public ViewerComparator getComparator(){
-		return sorter;
-	}
-	
-	/**
-	 * Handles a double-click select event from the widget.
-	 * <p>
-	 * This method is internal to the framework; subclassers should not call
-	 * this method.
-	 * </p>
-	 * 
-	 * @param event
-	 *            the SWT selection event
-	 */
-	protected void handleDoubleSelect(SelectionEvent event) {
-		// This method is reimplemented in AbstractTreeViewer to fix bug 108102.
-		
-		// handle case where an earlier selection listener disposed the control.
-		Control control = getControl();
-		if (control != null && !control.isDisposed()) {
-			// If the double-clicked element can be obtained from the event, use it
-			// otherwise get it from the control.  Some controls like List do
-			// not have the notion of item.
-			// For details, see bug 90161 [Navigator] DefaultSelecting folders shouldn't always expand first one
-			ISelection selection;
-			if (event.item != null && event.item.getData() != null) {
-				selection = new StructuredSelection(event.item.getData());
-			}
-			else {
-				selection = getSelection();
-				updateSelection(selection);
-			}
-			fireDoubleClick(new DoubleClickEvent(this, selection));
-		}
-	}
-
-	/**
-	 * Handles an open event from the OpenStrategy.
-	 * <p>
-	 * This method is internal to the framework; subclassers should not call
-	 * this method.
-	 * </p>
-	 * 
-	 * @param event
-	 *            the SWT selection event
-	 */
-	protected void handleOpen(SelectionEvent event) {
-		Control control = getControl();
-		if (control != null && !control.isDisposed()) {
-			ISelection selection = getSelection();
-			fireOpen(new OpenEvent(this, selection));
-		}
-	}
-
-	/**
-	 * Handles an invalid selection.
-	 * <p>
-	 * This framework method is called if a model change picked up by a viewer
-	 * results in an invalid selection. For instance if an element contained in
-	 * the selection has been removed from the viewer, the viewer is free to
-	 * either remove the element from the selection or to pick another element
-	 * as its new selection. The default implementation of this method calls
-	 * <code>updateSelection</code>. Subclasses may override it to implement
-	 * a different strategy for picking a new selection when the old selection
-	 * becomes invalid.
-	 * </p>
-	 * 
-	 * @param invalidSelection
-	 *            the selection before the viewer was updated
-	 * @param newSelection
-	 *            the selection after the update, or <code>null</code> if none
-	 */
-	protected void handleInvalidSelection(ISelection invalidSelection, ISelection newSelection) {
-		updateSelection(newSelection);
-		SelectionChangedEvent event = new SelectionChangedEvent(this, newSelection);
-		firePostSelectionChanged(event);
-	}
-
-	/**
-	 * The <code>StructuredViewer</code> implementation of this
-	 * <code>ContentViewer</code> method calls <code>update</code> if the
-	 * event specifies that the label of a given element has changed, otherwise
-	 * it calls super. Subclasses may reimplement or extend.
-	 * </p>
-	 * @param event the event that generated this update
-	 */
-	protected void handleLabelProviderChanged(LabelProviderChangedEvent event) {
-		Object[] elements = event.getElements();
-		if (elements != null) {
-			update(elements, null);
-		} else {
-			super.handleLabelProviderChanged(event);
-		}
-	}
-
-	/**
-	 * Handles a select event from the widget.
-	 * <p>
-	 * This method is internal to the framework; subclassers should not call
-	 * this method.
-	 * </p>
-	 * 
-	 * @param event
-	 *            the SWT selection event
-	 */
-	protected void handleSelect(SelectionEvent event) {
-		// handle case where an earlier selection listener disposed the control.
-		Control control = getControl();
-		if (control != null && !control.isDisposed()) {
-			updateSelection(getSelection());
-		}
-	}
-
-	/**
-	 * Handles a post select event from the widget.
-	 * <p>
-	 * This method is internal to the framework; subclassers should not call
-	 * this method.
-	 * </p>
-	 * 
-	 * @param e the SWT selection event
-	 */
-	protected void handlePostSelect(SelectionEvent e) {
-		SelectionChangedEvent event = new SelectionChangedEvent(this, getSelection());
-		firePostSelectionChanged(event);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Viewer.
-	 */
-	protected void hookControl(Control control) {
-		super.hookControl(control);
-		OpenStrategy handler = new OpenStrategy(control);
-		handler.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				// On Windows, selection events may happen during a refresh.
-				// Ignore these events if we are currently in preservingSelection().
-				// See bug 184441.
-				if (!inChange) {
-					handleSelect(e);
-				}
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				handleDoubleSelect(e);
-			}
-		});
-		handler.addPostSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				handlePostSelect(e);
-			}
-		});
-		handler.addOpenListener(new IOpenEventListener() {
-			public void handleOpen(SelectionEvent e) {
-				StructuredViewer.this.handleOpen(e);
-			}
-		});
-	}
-
-	/**
-	 * Returns whether this viewer has any filters.
-	 * @return boolean
-	 */
-	protected boolean hasFilters() {
-		return filters != null && filters.size() > 0;
-	}
-
-	/**
-	 * Refreshes this viewer starting at the given element.
-	 * 
-	 * @param element
-	 *            the element
-	 */
-	protected abstract void internalRefresh(Object element);
-
-	/**
-	 * Refreshes this viewer starting at the given element. Labels are updated
-	 * as described in <code>refresh(boolean updateLabels)</code>.
-	 * <p>
-	 * The default implementation simply calls
-	 * <code>internalRefresh(element)</code>, ignoring
-	 * <code>updateLabels</code>.
-	 * <p>
-	 * If this method is overridden to do the actual refresh, then
-	 * <code>internalRefresh(Object element)</code> should simply call
-	 * <code>internalRefresh(element, true)</code>.
-	 * 
-	 * @param element
-	 *            the element
-	 * @param updateLabels
-	 *            <code>true</code> to update labels for existing elements,
-	 *            <code>false</code> to only update labels as needed, assuming
-	 *            that labels for existing elements are unchanged.
-	 * 
-	 * @since 2.0
-	 */
-	protected void internalRefresh(Object element, boolean updateLabels) {
-		internalRefresh(element);
-	}
-
-	/**
-	 * Adds the element item pair to the element map.
-	 * <p>
-	 * This method is internal to the framework; subclassers should not call
-	 * this method.
-	 * </p>
-	 * 
-	 * @param element
-	 *            the element
-	 * @param item
-	 *            the corresponding widget
-	 */
-	protected void mapElement(Object element, Widget item) {
-		if (elementMap != null) {
-			Object widgetOrWidgets = elementMap.get(element);
-			if (widgetOrWidgets == null) {
-				elementMap.put(element, item);
-			} else if (widgetOrWidgets instanceof Widget) {
-				if (widgetOrWidgets != item) {
-					elementMap.put(element, new Widget[] {
-							(Widget) widgetOrWidgets, item });
-				}
-			} else {
-				Widget[] widgets = (Widget[]) widgetOrWidgets;
-				int indexOfItem = Arrays.asList(widgets).indexOf(item);
-				if (indexOfItem == -1) {
-					int length = widgets.length;
-					System.arraycopy(widgets, 0,
-							widgets = new Widget[length + 1], 0, length);
-					widgets[length] = item;
-					elementMap.put(element, widgets);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Determines whether a change to the given property of the given element
-	 * would require refiltering and/or resorting.
-	 * <p>
-	 * This method is internal to the framework; subclassers should not call
-	 * this method.
-	 * </p>
-	 * 
-	 * @param element
-	 *            the element
-	 * @param property
-	 *            the property
-	 * @return <code>true</code> if refiltering is required, and
-	 *         <code>false</code> otherwise
-	 */
-	protected boolean needsRefilter(Object element, String property) {
-		if (sorter != null && sorter.isSorterProperty(element, property)) {
-			return true;
-		}
-
-		if (filters != null) {
-			for (int i = 0, n = filters.size(); i < n; ++i) {
-				ViewerFilter filter = (ViewerFilter) filters.get(i);
-				if (filter.isFilterProperty(element, property)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Returns a new hashtable using the given capacity and this viewer's element comparer.
-	 * 
-	 * @param capacity the initial capacity of the hashtable
-	 * @return a new hashtable
-	 * 
-	 * @since 3.0
-	 */
-	CustomHashtable newHashtable(int capacity) {
-		return new CustomHashtable(capacity, getComparer());
-	}
-
-	/**
-	 * Attempts to preserves the current selection across a run of the given
-	 * code.
-	 * <p>
-	 * The default implementation of this method:
-	 * <ul>
-	 * <li>discovers the old selection (via <code>getSelection</code>)</li>
-	 * <li>runs the given runnable</li>
-	 * <li>attempts to restore the old selection (using
-	 * <code>setSelectionToWidget</code></li>
-	 * <li>rediscovers the resulting selection (via <code>getSelection</code>)
-	 * </li>
-	 * <li>calls <code>handleInvalidSelection</code> if the resulting selection is different from the old selection</li>
-	 * </ul>
-	 * </p>
-	 * 
-	 * @param updateCode
-	 *            the code to run
-	 */
-	protected void preservingSelection(Runnable updateCode) {
-		preservingSelection(updateCode, false);
-	}
-
-	/**
-	 * Attempts to preserves the current selection across a run of the given
-	 * code, with a best effort to avoid scrolling if <code>reveal</code> is false,
-	 * or to reveal the selection if <code>reveal</code> is true.
-	 * <p>
-	 * The default implementation of this method:
-	 * <ul>
-	 * <li>discovers the old selection (via <code>getSelection</code>)</li>
-	 * <li>runs the given runnable</li>
-	 * <li>attempts to restore the old selection (using
-	 * <code>setSelectionToWidget</code></li>
-	 * <li>rediscovers the resulting selection (via <code>getSelection</code>)
-	 * </li>
-	 * <li>calls <code>handleInvalidSelection</code> if the selection did not
-	 * take</li>
-	 * </ul>
-	 * </p>
-	 * 
-	 * @param updateCode
-	 *            the code to run
-	 * @param reveal
-	 *            <code>true</code> if the selection should be made visible,
-	 *            <code>false</code> if scrolling should be avoided
-	 * @since 3.3
-	 */
-	void preservingSelection(Runnable updateCode, boolean reveal) {
-
-		ISelection oldSelection = null;
-		try {
-			// preserve selection
-			oldSelection = getSelection();
-			inChange = restoreSelection = true;
-
-			// perform the update
-			updateCode.run();
-
-		} finally {
-			inChange = false;
-
-			// restore selection
-			if (restoreSelection) {
-				setSelectionToWidget(oldSelection, reveal);
-			}
-
-			// send out notification if old and new differ
-			ISelection newSelection = getSelection();
-			if (!newSelection.equals(oldSelection)) {
-				handleInvalidSelection(oldSelection, newSelection);
-			}
-		}
-	}
-	
-	/*
-	 * Non-Javadoc. Method declared on Viewer.
-	 */
-	public void refresh() {
-		refresh(getRoot());
-	}
-
-	/**
-	 * Refreshes this viewer with information freshly obtained from this
-	 * viewer's model. If <code>updateLabels</code> is <code>true</code>
-	 * then labels for otherwise unaffected elements are updated as well.
-	 * Otherwise, it assumes labels for existing elements are unchanged, and
-	 * labels are only obtained as needed (for example, for new elements).
-	 * <p>
-	 * Calling <code>refresh(true)</code> has the same effect as
-	 * <code>refresh()</code>.
-	 * <p>
-	 * Note that the implementation may still obtain labels for existing
-	 * elements even if <code>updateLabels</code> is false. The intent is
-	 * simply to allow optimization where possible.
-	 * 
-	 * @param updateLabels
-	 *            <code>true</code> to update labels for existing elements,
-	 *            <code>false</code> to only update labels as needed, assuming
-	 *            that labels for existing elements are unchanged.
-	 * 
-	 * @since 2.0
-	 */
-	public void refresh(boolean updateLabels) {
-		refresh(getRoot(), updateLabels);
-	}
-
-	/**
-	 * Refreshes this viewer starting with the given element.
-	 * <p>
-	 * Unlike the <code>update</code> methods, this handles structural changes
-	 * to the given element (e.g. addition or removal of children). If only the
-	 * given element needs updating, it is more efficient to use the
-	 * <code>update</code> methods.
-	 * </p>
-	 * 
-	 * @param element
-	 *            the element
-	 */
-	public void refresh(final Object element) {
-		preservingSelection(new Runnable() {
-			public void run() {
-				internalRefresh(element);
-			}
-		});
-	}
-
-	/**
-	 * Refreshes this viewer starting with the given element. Labels are updated
-	 * as described in <code>refresh(boolean updateLabels)</code>.
-	 * <p>
-	 * Unlike the <code>update</code> methods, this handles structural changes
-	 * to the given element (e.g. addition or removal of children). If only the
-	 * given element needs updating, it is more efficient to use the
-	 * <code>update</code> methods.
-	 * </p>
-	 * 
-	 * @param element
-	 *            the element
-	 * @param updateLabels
-	 *            <code>true</code> to update labels for existing elements,
-	 *            <code>false</code> to only update labels as needed, assuming
-	 *            that labels for existing elements are unchanged.
-	 * 
-	 * @since 2.0
-	 */
-	public void refresh(final Object element, final boolean updateLabels) {
-		preservingSelection(new Runnable() {
-			public void run() {
-				internalRefresh(element, updateLabels);
-			}
-		});
-	}
-
-	/**
-	 * 
-	 * Refreshes the given item with the given element. Calls
-	 * <code>doUpdateItem(..., false)</code>.
-	 * <p>
-	 * This method is internal to the framework; subclassers should not call
-	 * this method.
-	 * </p>
-	 * @param widget
-     *            the widget
-	 * @param element
-     *            the element
-	 */
-	protected final void refreshItem(Widget widget, Object element) {
-		SafeRunnable.run(new UpdateItemSafeRunnable(widget, element, true));
-	}
-
-	/**
-	 * Removes the given open listener from this viewer. Has no affect if an
-	 * identical listener is not registered.
-	 * 
-	 * @param listener
-	 *            an open listener
-	 */
-	public void removeOpenListener(IOpenListener listener) {
-		openListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPostSelectionProvider.
-	 */
-	public void removePostSelectionChangedListener(ISelectionChangedListener listener) {
-		postSelectionChangedListeners.remove(listener);
-	}
-
-	/**
-	 * Removes the given double-click listener from this viewer. Has no affect
-	 * if an identical listener is not registered.
-	 * 
-	 * @param listener
-	 *            a double-click listener
-	 */
-	public void removeDoubleClickListener(IDoubleClickListener listener) {
-		doubleClickListeners.remove(listener);
-	}
-
-	/**
-	 * Removes the given filter from this viewer, and triggers refiltering and
-	 * resorting of the elements if required. Has no effect if the identical
-	 * filter is not registered. If you want to remove more than one filter
-	 * consider using {@link StructuredViewer#setFilters(ViewerFilter[])}.
-	 * 
-	 * @param filter
-	 *            a viewer filter
-	 * @see StructuredViewer#setFilters(ViewerFilter[])
-	 */
-	public void removeFilter(ViewerFilter filter) {
-		Assert.isNotNull(filter);
-		if (filters != null) {
-			// Note: can't use List.remove(Object). Use identity comparison
-			// instead.
-			for (Iterator i = filters.iterator(); i.hasNext();) {
-				Object o = i.next();
-				if (o == filter) {
-					i.remove();
-					refresh();
-					if (filters.size() == 0) {
-						filters = null;
-					}
-					return;
-				}
-			}
-		}
-	}
-
-	/**
-	 * Sets the filters, replacing any previous filters, and triggers
-	 * refiltering and resorting of the elements.
-	 * 
-	 * @param filters
-	 *            an array of viewer filters
-	 * @since 3.3
-	 */
-	public void setFilters(ViewerFilter[] filters) {
-		if (filters.length == 0) {
-			resetFilters();
-		} else {
-			this.filters = new ArrayList(Arrays.asList(filters));
-			refresh();
-		}
-	}
-	
-	/**
-	 * Discards this viewer's filters and triggers refiltering and resorting of
-	 * the elements.
-	 */
-	public void resetFilters() {
-		if (filters != null) {
-			filters = null;
-			refresh();
-		}
-	}
-
-	/**
-	 * Ensures that the given element is visible, scrolling the viewer if
-	 * necessary. The selection is unchanged.
-	 * 
-	 * @param element
-	 *            the element to reveal
-	 */
-	public abstract void reveal(Object element);
-
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ContentViewer#setContentProvider(org.eclipse.jface.viewers.IContentProvider)
-	 */
-	public void setContentProvider(IContentProvider provider) {
-		assertContentProviderType(provider);
-		super.setContentProvider(provider);
-	}
-
-	/**
-	 * Assert that the content provider is of one of the
-	 * supported types.
-	 * @param provider
-	 */
-	protected void assertContentProviderType(IContentProvider provider) {
-		Assert.isTrue(provider instanceof IStructuredContentProvider);
-	}
-
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.Viewer#setInput(java.lang.Object)
-	 */
-	public final void setInput(Object input) {
-
-		try {
-			//		fInChange= true;
-
-			unmapAllElements();
-
-			super.setInput(input);
-
-		} finally {
-			//		fInChange= false;
-		}
-	}
-
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.Viewer#setSelection(org.eclipse.jface.viewers.ISelection, boolean)
-	 */
-	public void setSelection(ISelection selection, boolean reveal) {
-		/**
-		 * <p>
-		 * If the new selection differs from the current selection the hook
-		 * <code>updateSelection</code> is called.
-		 * </p>
-		 * <p>
-		 * If <code>setSelection</code> is called from within
-		 * <code>preserveSelection</code>, the call to
-		 * <code>updateSelection</code> is delayed until the end of
-		 * <code>preserveSelection</code>.
-		 * </p>
-		 * <p>
-		 * Subclasses do not typically override this method, but implement
-		 * <code>setSelectionToWidget</code> instead.
-		 * </p>
-		 */
-		Control control = getControl();
-		if (control == null || control.isDisposed()) {
-			return;
-		}
-		if (!inChange) {
-			setSelectionToWidget(selection, reveal);
-			ISelection sel = getSelection();
-			updateSelection(sel);
-			firePostSelectionChanged(new SelectionChangedEvent(this, sel));
-		} else {
-			restoreSelection = false;
-			setSelectionToWidget(selection, reveal);
-		}
-	}
-
-	/**
-	 * Parlays the given list of selected elements into selections on this
-	 * viewer's control.
-	 * <p>
-	 * Subclasses should override to set their selection based on the given list
-	 * of elements.
-	 * </p>
-	 * 
-	 * @param l
-	 *            list of selected elements (element type: <code>Object</code>)
-	 *            or <code>null</code> if the selection is to be cleared
-	 * @param reveal
-	 *            <code>true</code> if the selection is to be made visible,
-	 *            and <code>false</code> otherwise
-	 */
-	protected abstract void setSelectionToWidget(List l, boolean reveal);
-
-	/**
-	 * Converts the selection to a <code>List</code> and calls
-	 * <code>setSelectionToWidget(List, boolean)</code>. The selection is
-	 * expected to be an <code>IStructuredSelection</code> of elements. If
-	 * not, the selection is cleared.
-	 * <p>
-	 * Subclasses do not typically override this method, but implement
-	 * <code>setSelectionToWidget(List, boolean)</code> instead.
-	 * 
-	 * @param selection
-	 *            an IStructuredSelection of elements
-	 * @param reveal
-	 *            <code>true</code> to reveal the first element in the
-	 *            selection, or <code>false</code> otherwise
-	 */
-	protected void setSelectionToWidget(ISelection selection, boolean reveal) {
-		if (selection instanceof IStructuredSelection) {
-			setSelectionToWidget(((IStructuredSelection) selection).toList(), reveal);
-		} else {
-			setSelectionToWidget((List) null, reveal);
-		}
-	}
-
-	/**
-	 * Sets this viewer's sorter and triggers refiltering and resorting of this
-	 * viewer's element. Passing <code>null</code> turns sorting off.  
-     * <p>
-     * It is recommended to use <code>setComparator()</code> instead.
-     * </p>
-	 * 
-	 * @param sorter
-	 *            a viewer sorter, or <code>null</code> if none
-	 */
-	public void setSorter(ViewerSorter sorter) {
-		if (this.sorter != sorter) {
-			this.sorter = sorter;
-			refresh();
-		}
-	}
-
-	/**
-	 * Sets this viewer's comparator to be used for sorting elements, and triggers refiltering and 
-	 * resorting of this viewer's element.  <code>null</code> turns sorting off.
-	 * To get the viewer's comparator, call <code>getComparator()</code>.
-     * <p>
-     * IMPORTANT: This method was introduced in 3.2. If a reference to this viewer object 
-     * is passed to clients who call <code>getSorter()<code>, null may be returned from
-     * from that method even though the viewer is sorting its elements using the
-     * viewer's comparator.
-     * </p>
-	 * 
-	 * @param comparator a viewer comparator, or <code>null</code> if none
-     *
-     * @since 3.2
-	 */
-	public void setComparator(ViewerComparator comparator){
-		if (this.sorter != comparator){
-			this.sorter = comparator;
-			refresh();
-		}
-	}
-	
-	/**
-	 * Configures whether this structured viewer uses an internal hash table to
-	 * speeds up the mapping between elements and SWT items. This must be called
-	 * before the viewer is given an input (via <code>setInput</code>).
-	 * 
-	 * @param enable
-	 *            <code>true</code> to enable hash lookup, and
-	 *            <code>false</code> to disable it
-	 */
-	public void setUseHashlookup(boolean enable) {
-		Assert.isTrue(getInput() == null,
-				"Can only enable the hash look up before input has been set");//$NON-NLS-1$
-		if (enable) {
-			elementMap = newHashtable(CustomHashtable.DEFAULT_CAPACITY);
-		} else {
-			elementMap = null;
-		}
-	}
-
-	/**
-	 * Sets the comparer to use for comparing elements, or <code>null</code>
-	 * to use the default <code>equals</code> and <code>hashCode</code>
-	 * methods on the elements themselves.
-	 * 
-	 * @param comparer
-	 *            the comparer to use for comparing elements or
-	 *            <code>null</code>
-	 */
-	public void setComparer(IElementComparer comparer) {
-		this.comparer = comparer;
-		if (elementMap != null) {
-			elementMap = new CustomHashtable(elementMap, comparer);
-		}
-	}
-
-	/**
-	 * Hook for testing.
-	 * @param element
-	 * @return Widget
-	 */
-	public Widget testFindItem(Object element) {
-		return findItem(element);
-	}
-
-	/**
-	 * Hook for testing.
-	 * @param element
-	 * @return Widget[]
-	 * @since 3.2
-	 */
-	public Widget[] testFindItems(Object element) {
-		return findItems(element);
-	}
-	
-	/**
-	 * Removes all elements from the map.
-	 * <p>
-	 * This method is internal to the framework; subclassers should not call
-	 * this method.
-	 * </p>
-	 */
-	protected void unmapAllElements() {
-		if (elementMap != null) {
-			elementMap = newHashtable(CustomHashtable.DEFAULT_CAPACITY);
-		}
-	}
-
-	/**
-	 * Removes the given element from the internal element to widget map. Does
-	 * nothing if mapping is disabled. If mapping is enabled, the given element
-	 * must be present.
-	 * <p>
-	 * This method is internal to the framework; subclassers should not call
-	 * this method.
-	 * </p>
-	 * 
-	 * @param element
-	 *            the element
-	 */
-	protected void unmapElement(Object element) {
-		if (elementMap != null) {
-			elementMap.remove(element);
-		}
-	}
-
-	/**
-	 * Removes the given association from the internal element to widget map.
-	 * Does nothing if mapping is disabled, or if the given element does not map
-	 * to the given item.
-	 * <p>
-	 * This method is internal to the framework; subclassers should not call
-	 * this method.
-	 * </p>
-	 * 
-	 * @param element
-	 *            the element
-	 * @param item the item to unmap
-	 * @since 2.0
-	 */
-	protected void unmapElement(Object element, Widget item) {
-		// double-check that the element actually maps to the given item before
-		// unmapping it
-		if (elementMap != null) {
-			Object widgetOrWidgets = elementMap.get(element);
-			if (widgetOrWidgets == null) {
-				// item was not mapped, return
-				return;
-			} else if (widgetOrWidgets instanceof Widget) {
-				if (item == widgetOrWidgets) {
-					elementMap.remove(element);
-				}
-			} else {
-				Widget[] widgets = (Widget[]) widgetOrWidgets;
-				int indexOfItem = Arrays.asList(widgets).indexOf(item);
-				if (indexOfItem == -1) {
-					return;
-				}
-				int length = widgets.length;
-				if (indexOfItem == 0) {
-					if(length == 1) {
-						elementMap.remove(element);
-					} else {
-						Widget[] updatedWidgets = new Widget[length - 1];
-						System.arraycopy(widgets, 1, updatedWidgets, 0, length -1 );
-						elementMap.put(element, updatedWidgets);
-					}
-				} else {
-					Widget[] updatedWidgets = new Widget[length - 1];
-					System.arraycopy(widgets, 0, updatedWidgets, 0, indexOfItem);
-					System.arraycopy(widgets, indexOfItem + 1, updatedWidgets, indexOfItem, length - indexOfItem - 1);
-					elementMap.put(element, updatedWidgets);
-				}
-			}
-		}
-	}
-
-	// flag to indicate that a full refresh took place. See bug 102440.
-	private boolean refreshOccurred;
-	
-	/**
-	 * Updates the given elements' presentation when one or more of their
-	 * properties change. Only the given elements are updated.
-	 * <p>
-	 * This does not handle structural changes (e.g. addition or removal of
-	 * elements), and does not update any other related elements (e.g. child
-	 * elements). To handle structural changes, use the <code>refresh</code>
-	 * methods instead.
-	 * </p>
-	 * <p>
-	 * This should be called when an element has changed in the model, in order
-	 * to have the viewer accurately reflect the model. This method only affects
-	 * the viewer, not the model.
-	 * </p>
-	 * <p>
-	 * Specifying which properties are affected may allow the viewer to optimize
-	 * the update. For example, if the label provider is not affected by changes
-	 * to any of these properties, an update may not actually be required.
-	 * Specifying <code>properties</code> as <code>null</code> forces a full
-	 * update of the given elements.
-	 * </p>
-	 * <p>
-	 * If the viewer has a sorter which is affected by a change to one of the
-	 * properties, the elements' positions are updated to maintain the sort
-	 * order. Note that resorting does not happen if <code>properties</code>
-	 * is <code>null</code>.
-	 * </p>
-	 * <p>
-	 * If the viewer has a filter which is affected by a change to one of the
-	 * properties, elements may appear or disappear if the change affects
-	 * whether or not they are filtered out.
-	 * </p>
-	 * 
-	 * @param elements
-	 *            the elements
-	 * @param properties
-	 *            the properties that have changed, or <code>null</code> to
-	 *            indicate unknown
-	 */
-	public void update(Object[] elements, String[] properties) {
-		boolean previousValue = refreshOccurred;
-		refreshOccurred = false;
-		try {
-			for (int i = 0; i < elements.length; ++i) {
-				update(elements[i], properties);
-				if (refreshOccurred) {
-					return;
-				}
-			}
-		} finally {
-			refreshOccurred = previousValue;
-		}
-	}
-
-	/**
-	 * Updates the given element's presentation when one or more of its
-	 * properties changes. Only the given element is updated.
-	 * <p>
-	 * This does not handle structural changes (e.g. addition or removal of
-	 * elements), and does not update any other related elements (e.g. child
-	 * elements). To handle structural changes, use the <code>refresh</code>
-	 * methods instead.
-	 * </p>
-	 * <p>
-	 * This should be called when an element has changed in the model, in order
-	 * to have the viewer accurately reflect the model. This method only affects
-	 * the viewer, not the model.
-	 * </p>
-	 * <p>
-	 * Specifying which properties are affected may allow the viewer to optimize
-	 * the update. For example, if the label provider is not affected by changes
-	 * to any of these properties, an update may not actually be required.
-	 * Specifying <code>properties</code> as <code>null</code> forces a full
-	 * update of the element.
-	 * </p>
-	 * <p>
-	 * If the viewer has a sorter which is affected by a change to one of the
-	 * properties, the element's position is updated to maintain the sort order.
-	 * Note that resorting does not happen if <code>properties</code> is
-	 * <code>null</code>.
-	 * </p>
-	 * <p>
-	 * If the viewer has a filter which is affected by a change to one of the
-	 * properties, the element may appear or disappear if the change affects
-	 * whether or not the element is filtered out.
-	 * </p>
-	 * 
-	 * @param element
-	 *            the element
-	 * @param properties
-	 *            the properties that have changed, or <code>null</code> to
-	 *            indicate unknown
-	 */
-	public void update(Object element, String[] properties) {
-		Assert.isNotNull(element);
-		Widget[] items = findItems(element);
-
-		boolean mayExitEarly = !refreshOccurred;
-		for (int i = 0; i < items.length; i++) {
-			internalUpdate(items[i], element, properties);
-			if (mayExitEarly && refreshOccurred) {
-				// detected a change from refreshOccurred==false to refreshOccurred==true 
-				return;
-			}
-		}		
-	}
-
-	/**
-     * Updates the given element's presentation when one or more of its
-     * properties changes. Only the given element is updated.
-     * <p>
-     * EXPERIMENTAL.  Not to be used except by JDT.
-     * This method was added to support JDT's explorations
-     * into grouping by working sets, which requires viewers to support multiple 
-     * equal elements.  See bug 76482 for more details.  This support will
-     * likely be removed in Eclipse 3.3 in favor of proper support for
-     * multiple equal elements (which was implemented for AbtractTreeViewer in 3.2). 
-     * </p>
-     * @param widget
-     *            the widget for the element
-     * @param element
-     *            the element
-     * @param properties
-     *            the properties that have changed, or <code>null</code> to
-     *            indicate unknown
-     */
-	protected void internalUpdate(Widget widget, Object element, String[] properties) {
-		boolean needsRefilter = false;
-		if (properties != null) {
-			for (int i = 0; i < properties.length; ++i) {
-				needsRefilter = needsRefilter(element, properties[i]);
-				if (needsRefilter) {
-					break;
-				}
-			}
-		}
-		if (needsRefilter) {
-			preservingSelection(new Runnable() {
-				public void run() {
-					internalRefresh(getRoot());
-					refreshOccurred = true;
-				}
-			});
-			return;
-		}
-
-		boolean needsUpdate;
-		if (properties == null) {
-			needsUpdate = true;
-		} else {
-			needsUpdate = false;
-			IBaseLabelProvider labelProvider = getLabelProvider();
-			for (int i = 0; i < properties.length; ++i) {
-				needsUpdate = labelProvider.isLabelProperty(element, properties[i]);
-				if (needsUpdate) {
-					break;
-				}
-			}
-		}
-		if (needsUpdate) {
-			updateItem(widget, element);
-		}
-	}
-
-	/**
-	 * Copies attributes of the given element into the given widget.
-	 * <p>
-	 * This method is internal to the framework; subclassers should not call
-	 * this method. Calls <code>doUpdateItem(widget, element, true)</code>.
-	 * </p>
-	 * 
-	 * @param widget
-	 *            the widget
-	 * @param element
-	 *            the element
-	 */
-	protected final void updateItem(Widget widget, Object element) {
-		SafeRunnable.run(new UpdateItemSafeRunnable(widget, element, true));
-	}
-
-	/**
-	 * Updates the selection of this viewer.
-	 * <p>
-	 * This framework method should be called when the selection in the viewer
-	 * widget changes.
-	 * </p>
-	 * <p>
-	 * The default implementation of this method notifies all selection change
-	 * listeners recorded in an internal state variable. Overriding this method
-	 * is generally not required; however, if overriding in a subclass,
-	 * <code>super.updateSelection</code> must be invoked.
-	 * </p>
-	 * 
-	 * @param selection
-	 *            the selection, or <code>null</code> if none
-	 */
-	protected void updateSelection(ISelection selection) {
-		SelectionChangedEvent event = new SelectionChangedEvent(this, selection);
-		fireSelectionChanged(event);
-	}
-
-	/**
-	 * Returns whether this structured viewer is configured to use an internal
-	 * map to speed up the mapping between elements and SWT items.
-	 * <p>
-	 * The default implementation of this framework method checks whether the
-	 * internal map has been initialized.
-	 * </p>
-	 * 
-	 * @return <code>true</code> if the element map is enabled, and
-	 *         <code>false</code> if disabled
-	 */
-	protected boolean usingElementMap() {
-		return elementMap != null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ContentViewer#setLabelProvider(org.eclipse.jface.viewers.IBaseLabelProvider)
-	 */
-	public void setLabelProvider(IBaseLabelProvider labelProvider) {
-		if (labelProvider instanceof IColorProvider || labelProvider instanceof IFontProvider) {
-			colorAndFontCollector = new ColorAndFontCollectorWithProviders(labelProvider);
-		} else {
-			colorAndFontCollector = new ColorAndFontCollector();
-		}
-		super.setLabelProvider(labelProvider);
-		
-	}
-	
-	/**
-	 * Build a label up for the element using the supplied label provider.
-	 * @param updateLabel The ViewerLabel to collect the result in
-	 * @param element The element being decorated.
-	 */
-	protected void buildLabel(ViewerLabel updateLabel, Object element){
-
-		if (getLabelProvider() instanceof IViewerLabelProvider) {
-			IViewerLabelProvider itemProvider = (IViewerLabelProvider) getLabelProvider();
-			itemProvider.updateLabel(updateLabel, element);
-            		
-			colorAndFontCollector.setUsedDecorators();
-			
-			if(updateLabel.hasNewBackground()) {
-				colorAndFontCollector.setBackground(updateLabel.getBackground());
-			}
-			
-			if(updateLabel.hasNewForeground()) {
-				colorAndFontCollector.setForeground(updateLabel.getForeground());
-			}
-			
-			if(updateLabel.hasNewFont()) {
-				colorAndFontCollector.setFont(updateLabel.getFont());
-			}
-			return;
-
-		} 
-		
-		if(getLabelProvider() instanceof ILabelProvider){
-			ILabelProvider labelProvider = (ILabelProvider) getLabelProvider();
-			updateLabel.setText(labelProvider.getText(element));
-			updateLabel.setImage(labelProvider.getImage(element));
-		}
-	
-	}
-	
-	/**
-	 * Build a label up for the element using the supplied label provider.
-	 * @param updateLabel The ViewerLabel to collect the result in
-	 * @param element The element being decorated.
-	 * @param labelProvider ILabelProvider the labelProvider for the receiver.
-	 */
-	void buildLabel(ViewerLabel updateLabel, Object element,IViewerLabelProvider labelProvider){
-
-			labelProvider.updateLabel(updateLabel, element);
-            		
-			colorAndFontCollector.setUsedDecorators();
-			
-			if(updateLabel.hasNewBackground()) {
-				colorAndFontCollector.setBackground(updateLabel.getBackground());
-			}
-			
-			if(updateLabel.hasNewForeground()) {
-				colorAndFontCollector.setForeground(updateLabel.getForeground());
-			}
-			
-			if(updateLabel.hasNewFont()) {
-				colorAndFontCollector.setFont(updateLabel.getFont());
-			}
-	
-	}
-	
-	/**
-	 * Build a label up for the element using the supplied label provider.
-	 * @param updateLabel The ViewerLabel to collect the result in
-	 * @param elementPath The path of the element being decorated.
-	 * @param labelProvider ILabelProvider the labelProvider for the receiver.
-	 */
-	void buildLabel(ViewerLabel updateLabel, TreePath elementPath,ITreePathLabelProvider labelProvider){
-
-			labelProvider.updateLabel(updateLabel, elementPath);
-            		
-			colorAndFontCollector.setUsedDecorators();
-			
-			if(updateLabel.hasNewBackground()) {
-				colorAndFontCollector.setBackground(updateLabel.getBackground());
-			}
-			
-			if(updateLabel.hasNewForeground()) {
-				colorAndFontCollector.setForeground(updateLabel.getForeground());
-			}
-			
-			if(updateLabel.hasNewFont()) {
-				colorAndFontCollector.setFont(updateLabel.getFont());
-			}
-	
-	}
-	
-	/**
-	 * Build a label up for the element using the supplied label provider.
-	 * @param updateLabel The ViewerLabel to collect the result in
-	 * @param element The element being decorated.
-	 * @param labelProvider ILabelProvider the labelProvider for the receiver.
-	 */
-	void buildLabel(ViewerLabel updateLabel, Object element,ILabelProvider labelProvider){
-			updateLabel.setText(labelProvider.getText(element));
-			updateLabel.setImage(labelProvider.getImage(element));
-	}
-
-	/**
-	 * Get the ColorAndFontCollector for the receiver.
-	 * @return ColorAndFontCollector 
-	 * @since 3.1
-	 */
-	protected ColorAndFontCollector getColorAndFontCollector() {
-		return colorAndFontCollector;
-	}
-	
-	protected void handleDispose(DisposeEvent event) {
-		super.handleDispose(event);
-		sorter = null;
-		comparer = null;
-		if (filters != null)
-			filters.clear();
-		elementMap = newHashtable(1);
-		openListeners.clear();
-		doubleClickListeners.clear();
-		colorAndFontCollector.clear();
-		postSelectionChangedListeners.clear();
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StyledCellLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StyledCellLabelProvider.java
deleted file mode 100644
index 6ec2581..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StyledCellLabelProvider.java
+++ /dev/null
@@ -1,409 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Michael Krkoska - initial API and implementation (bug 188333)
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.graphics.TextLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * A {@link StyledCellLabelProvider} supports styled labels by using owner
- * draw.
- * Besides the styles in labels, the label provider preserves native viewer behavior:
- * <ul>
- * <li>similar image and label positioning</li>
- * <li>native drawing of focus and selection</li>
- * </ul>
- * <p>
- * For providing the label's styles, create a subclass and overwrite
- * {@link StyledCellLabelProvider#update(ViewerCell)} to
- * return set all information needed to render a element. Use
- * {@link ViewerCell#setStyleRanges(StyleRange[])} to set style ranges
- * on the label.
- * </p>
- * 
- * @since 3.4
- */
-public abstract class StyledCellLabelProvider extends OwnerDrawLabelProvider {
-
-	/**
-	 * Style constant for indicating that the styled colors are to be applied
-	 * even it the viewer's item is selected. Default is not to apply colors.
-	 */
-	public static final int COLORS_ON_SELECTION = 1 << 0;
-
-	/**
-	 * Style constant for indicating to draw the focus if requested by the owner
-	 * draw event. Default is to draw the focus.
-	 */
-	public static final int NO_FOCUS = 1 << 1;
-	
-	/**
-	 * Private constant to indicate if owner draw is enabled for the
-	 * label provider's column.
-	 */
-	private static final int OWNER_DRAW_ENABLED = 1 << 4;
-
-	private int style;
-
-	// reused text layout
-	private TextLayout cachedTextLayout;
-	
-	private ColumnViewer viewer;
-	private ViewerColumn column;
-	
-	private Widget itemOfLastMeasure;
-	private int deltaOfLastMeasure;
-
-	/**
-	 * Creates a new StyledCellLabelProvider. By default, owner draw is enabled, focus is drawn and no
-	 * colors are painted on selected elements.
-	 */
-	public StyledCellLabelProvider() {
-		this(0);
-	}
-
-	/**
-	 * Creates a new StyledCellLabelProvider. By default, owner draw is enabled.
-	 * 
-	 * @param style
-	 *            the style bits
-	 * @see StyledCellLabelProvider#COLORS_ON_SELECTION
-	 * @see StyledCellLabelProvider#NO_FOCUS
-	 */
-	public StyledCellLabelProvider(int style) {
-		this.style = style & (COLORS_ON_SELECTION | NO_FOCUS)
-							| OWNER_DRAW_ENABLED;
-	}
-	
-	/**
-	 * Returns <code>true</code> is the owner draw rendering is enabled for this label provider.
-	 * By default owner draw rendering is enabled. If owner draw rendering is disabled, rending is
-	 * done by the viewer and no styled ranges (see {@link ViewerCell#getStyleRanges()})
-	 * are drawn.
-	 * 
-	 * @return <code>true</code> is the rendering of styles is enabled.
-	 */
-	public boolean isOwnerDrawEnabled() {
-		return (this.style & OWNER_DRAW_ENABLED) != 0;
-	}
-	
-	/**
-	 * Specifies whether owner draw rendering is enabled for this label
-	 * provider. By default owner draw rendering is enabled. If owner draw
-	 * rendering is disabled, rendering is done by the viewer and no styled
-	 * ranges (see {@link ViewerCell#getStyleRanges()}) are drawn.
-	 * It is the caller's responsibility to also call
-	 * {@link StructuredViewer#refresh()} or similar methods to update the
-	 * underlying widget.
-	 * 
-	 * @param enabled
-	 *            specifies if owner draw rendering is enabled
-	 */
-	public void setOwnerDrawEnabled(boolean enabled) {
-		boolean isEnabled= isOwnerDrawEnabled();
-		if (isEnabled != enabled) {
-			if (enabled) {
-				this.style |= OWNER_DRAW_ENABLED;
-			} else {
-				this.style &= ~OWNER_DRAW_ENABLED;
-			}
-			if (this.viewer != null) {
-				setOwnerDrawEnabled(this.viewer, this.column, enabled);
-			}
-		}
-	}
-	
-	/**
-	 * Returns the viewer on which this label provider is installed on or <code>null</code> if the
-	 * label provider is not installed.
-	 * 
-	 * @return the viewer on which this label provider is installed on or <code>null</code> if the
-	 * label provider is not installed.
-	 */
-	protected final ColumnViewer getViewer() {
-		return this.viewer;
-	}
-	
-	/**
-	 * Returns the column on which this label provider is installed on or <code>null</code> if the
-	 * label provider is not installed.
-	 * 
-	 * @return the column on which this label provider is installed on or <code>null</code> if the
-	 * label provider is not installed.
-	 */
-	protected final ViewerColumn getColumn() {
-		return this.column;
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#initialize(org.eclipse.jface.viewers.ColumnViewer, org.eclipse.jface.viewers.ViewerColumn)
-	 */
-	public void initialize(ColumnViewer viewer, ViewerColumn column) {
-		Assert.isTrue(this.viewer == null && this.column == null, "Label provider instance already in use"); //$NON-NLS-1$
-		
-		this.viewer= viewer;
-		this.column= column;
-		super.initialize(viewer, column, isOwnerDrawEnabled());
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		if (this.cachedTextLayout != null) {
-			cachedTextLayout.dispose();
-			cachedTextLayout = null;
-		}
-	
-		this.viewer= null;
-		this.column= null;
-		
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#update(org.eclipse.jface.viewers.ViewerCell)
-	 */
-	public void update(ViewerCell cell) {
-		// clients must override and configure the cell and call super
-		super.update(cell); // calls 'repaint' to trigger the paint listener
-	}
-
-	private TextLayout getSharedTextLayout(Display display) {
-		if (cachedTextLayout == null) {
-			int orientation = viewer.getControl().getStyle() & (SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT);
-			cachedTextLayout = new TextLayout(display);
-			cachedTextLayout.setOrientation(orientation);
-		}
-		return cachedTextLayout;
-	}
-
-	private boolean useColors(Event event) {
-		return (event.detail & SWT.SELECTED) == 0
-				|| (this.style & COLORS_ON_SELECTION) != 0;
-	}
-
-	private boolean drawFocus(Event event) {
-		return (event.detail & SWT.FOCUSED) != 0
-				&& (this.style & NO_FOCUS) == 0;
-	}
-	
-	/**
-	 * Prepares the given style range before it is applied to the label. This method makes sure that
-	 * no colors are drawn when the element is selected.
-	 * The current version of the {@link StyledCellLabelProvider} will also ignore all font settings on the
-	 * style range. Clients can override.
-	 * 
-	 * @param styleRange
-	 *               the style range to prepare. the style range element must not be modified
-	 * @param applyColors
-	 *               specifies if colors should be applied.
-	 * @return
-	 *               returns the style range to use on the label
-	 */
-	protected StyleRange prepareStyleRange(StyleRange styleRange, boolean applyColors) {
-		// if no colors apply or font is set, create a clone and clear the
-		// colors and font
-		if (!applyColors && (styleRange.foreground != null || styleRange.background != null)) {
-			styleRange = (StyleRange) styleRange.clone();
-			if (!applyColors) {
-				styleRange.foreground = null;
-				styleRange.background = null;
-			}
-		}
-		return styleRange;
-	}
-
-	private ViewerCell getViewerCell(Event event, Object element) {
-		ViewerRow row= viewer.getViewerRowFromItem(event.item);
-		return new ViewerCell(row, event.index, element);
-	}
-	
-	/**
-	 * Handle the erase event. The default implementation does nothing to ensure
-	 * keep native selection highlighting working.
-	 * 
-	 * @param event
-	 *            the erase event
-	 * @param element
-	 *            the model object
-	 * @see SWT#EraseItem
-	 */
-	protected void erase(Event event, Object element) {
-		// use native erase
-		if (isOwnerDrawEnabled()) {
-			// info has been set by 'update': announce that we paint ourselves
-			event.detail &= ~SWT.FOREGROUND;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#measure(org.eclipse.swt.widgets.Event,
-	 *      java.lang.Object)
-	 */
-	protected void measure(Event event, Object element) {
-		if (!isOwnerDrawEnabled())
-			return;
-		
-		ViewerCell cell= getViewerCell(event, element);
-		boolean applyColors = useColors(event); // returns false because of bug 228376 
-		
-		TextLayout layout = getSharedTextLayout(event.display);
-		
-		int textWidthDelta = deltaOfLastMeasure = updateTextLayout(layout, cell, applyColors);
-		/* remove-begin if bug 228695 fixed */
-		itemOfLastMeasure = event.item;
-		/* remove-end if bug 228695 fixed */
-
-		event.width += textWidthDelta;
-	}
-
-	/**
-	 * @param layout
-	 * @param cell
-	 * @param applyColors
-	 * @return the text width delta (0 if the text layout contains no other font)
-	 */
-	private int updateTextLayout(TextLayout layout, ViewerCell cell,
-			boolean applyColors) {
-		layout.setText(""); //$NON-NLS-1$  //make sure all previous ranges are cleared (see bug 226090)
-		
-		layout.setText(cell.getText());
-		layout.setFont(cell.getFont()); // set also if null to clear previous usages
-		
-		int originalTextWidth = layout.getBounds().width; // text width without any styles
-		boolean containsOtherFont= false;
-		
-		StyleRange[] styleRanges = cell.getStyleRanges();
-		if (styleRanges != null) { // user didn't fill styled ranges
-			for (int i = 0; i < styleRanges.length; i++) {
-				StyleRange curr = prepareStyleRange(styleRanges[i], applyColors);
-				layout.setStyle(curr, curr.start, curr.start + curr.length - 1);
-				if (curr.font != null) {
-					containsOtherFont= true;
-				}
-			}
-		}
-		int textWidthDelta = 0;
-		if (containsOtherFont) {
-			textWidthDelta = layout.getBounds().width - originalTextWidth;
-		}
-		return textWidthDelta;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#paint(org.eclipse.swt.widgets.Event,
-	 *      java.lang.Object)
-	 */
-	protected void paint(Event event, Object element) {
-		if (!isOwnerDrawEnabled())
-			return;
-		
-		ViewerCell cell= getViewerCell(event, element);
-
-		boolean applyColors = useColors(event);
-		
-		GC gc = event.gc;
-		// remember colors to restore the GC later
-		Color oldForeground = gc.getForeground();
-		Color oldBackground = gc.getBackground();
-		
-		if (applyColors) {
-			Color foreground= cell.getForeground();
-			if (foreground != null) {
-				gc.setForeground(foreground);
-			}
-			
-			Color background= cell.getBackground();
-			if (background != null) {
-				gc.setBackground(background);
-			}
-		}
-		Image image = cell.getImage();
-		if (image != null) {
-			Rectangle imageBounds = cell.getImageBounds();
-			if (imageBounds != null) {
-				Rectangle bounds = image.getBounds();
-	
-				// center the image in the given space
-				int x = imageBounds.x
-						+ Math.max(0, (imageBounds.width - bounds.width) / 2);
-				int y = imageBounds.y
-						+ Math.max(0, (imageBounds.height - bounds.height) / 2);
-				gc.drawImage(image, x, y);
-			}
-		}
-
-		Rectangle textBounds = cell.getTextBounds();
-		if (textBounds != null) {
-			TextLayout textLayout= getSharedTextLayout(event.display);
-
-			/* remove-begin if bug 228695 fixed */
-			if (event.item != itemOfLastMeasure) {
-				// fLayout has not been configured in 'measure()'
-				deltaOfLastMeasure = updateTextLayout(textLayout, cell, applyColors);
-				itemOfLastMeasure = event.item;
-			}
-			/* remove-end if bug 228695 fixed */
-			
-			/* remove-begin if bug 228376 fixed */
-			if (!applyColors) {
-				// need to remove colors for selected elements: measure doesn't provide that information, see bug 228376 
-				StyleRange[] styleRanges= cell.getStyleRanges();
-				if (styleRanges != null) {
-					for (int i= 0; i < styleRanges.length; i++) {
-						StyleRange curr = prepareStyleRange(styleRanges[i], applyColors);
-						textLayout.setStyle(curr, curr.start, curr.start + curr.length - 1);
-					}
-				}
-			}
-			/* remove-end if bug 228376 fixed */
-			
-			Rectangle layoutBounds = textLayout.getBounds();
-	
-			int x = textBounds.x;
-			int y = textBounds.y
-					+ Math.max(0, (textBounds.height - layoutBounds.height) / 2);
-	
-			textLayout.draw(gc, x, y);
-		}
-
-		if (drawFocus(event)) {
-			Rectangle focusBounds = cell.getViewerRow().getBounds();
-			gc.drawFocus(focusBounds.x, focusBounds.y, focusBounds.width + deltaOfLastMeasure,
-					focusBounds.height);
-		}
-		
-		if (applyColors) {
-			gc.setForeground(oldForeground);
-			gc.setBackground(oldBackground);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StyledString.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StyledString.java
deleted file mode 100644
index 70e6143..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/StyledString.java
+++ /dev/null
@@ -1,547 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.graphics.TextStyle;
-
-import org.eclipse.jface.preference.JFacePreferences;
-import org.eclipse.jface.resource.ColorRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-
-/**
- * A mutable string with styled ranges. All ranges mark substrings of the string
- * and do not overlap. Styles are applied using instances of {@link Styler} to
- * compute the result of {@link #getStyleRanges()}.
- * 
- * The styled string can be built in the following two ways:
- * <ul>
- * <li>new strings with stylers can be appended</li>
- * <li>stylers can by applied to ranges of the existing string</li>
- * </ul>
- * 
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @since 3.4
- */
-public class StyledString {
-
-	/**
-	 * A styler will be asked to apply its styles to one ore more ranges in the
-	 * {@link StyledString}.
-	 * 
-	 */
-	public static abstract class Styler {
-
-		/**
-		 * Applies the styles represented by this object to the given textStyle.
-		 * 
-		 * @param textStyle
-		 *            the {@link TextStyle} to modify
-		 */
-		public abstract void applyStyles(TextStyle textStyle);
-	}
-
-	/**
-	 * A built-in styler using the {@link JFacePreferences#QUALIFIER_COLOR}
-	 * managed in the JFace color registry (See
-	 * {@link JFaceResources#getColorRegistry()}).
-	 */
-	public static final Styler QUALIFIER_STYLER = createColorRegistryStyler(
-			JFacePreferences.QUALIFIER_COLOR, null);
-
-	/**
-	 * A built-in styler using the {@link JFacePreferences#COUNTER_COLOR}
-	 * managed in the JFace color registry (See
-	 * {@link JFaceResources#getColorRegistry()}).
-	 */
-	public static final Styler COUNTER_STYLER = createColorRegistryStyler(
-			JFacePreferences.COUNTER_COLOR, null);
-
-	/**
-	 * A built-in styler using the {@link JFacePreferences#DECORATIONS_COLOR}
-	 * managed in the JFace color registry (See
-	 * {@link JFaceResources#getColorRegistry()}).
-	 */
-	public static final Styler DECORATIONS_STYLER = createColorRegistryStyler(
-			JFacePreferences.DECORATIONS_COLOR, null);
-
-	/**
-	 * Creates a styler that takes the given foreground and background colors
-	 * from the JFace color registry.
-	 * 
-	 * @param foregroundColorName
-	 *            the color name for the foreground color
-	 * @param backgroundColorName
-	 *            the color name for the background color
-	 * 
-	 * @return the created style
-	 */
-	public static Styler createColorRegistryStyler(String foregroundColorName,
-			String backgroundColorName) {
-		return new DefaultStyler(foregroundColorName, backgroundColorName);
-	}
-
-	private static final StyleRange[] EMPTY = new StyleRange[0];
-	private StringBuffer fBuffer;
-	private StyleRunList fStyleRuns;
-
-	/**
-	 * Creates an empty {@link StyledString}.
-	 */
-	public StyledString() {
-		fBuffer = new StringBuffer();
-		fStyleRuns = null;
-	}
-
-	/**
-	 * Creates an {@link StyledString} initialized with a string without
-	 * a style associated.
-	 * 
-	 * @param string
-	 *            the string
-	 */
-	public StyledString(String string) {
-		this(string, null);
-	}
-
-	/**
-	 * Creates an {@link StyledString} initialized with a string and a
-	 * style.
-	 * 
-	 * @param string
-	 *            the string
-	 * @param styler
-	 *            the styler for the string or <code>null</code> to not
-	 *            associated a styler.
-	 */
-	public StyledString(String string, Styler styler) {
-		this();
-		append(string, styler);
-	}
-
-	/**
-	 * Returns the string of this {@link StyledString}.
-	 * 
-	 * @return the current string of this {@link StyledString}.
-	 */
-	public String getString() {
-		return fBuffer.toString();
-	}
-	
-	/**
-	 * Returns the string of this {@link StyledString}.
-	 * 
-	 * @return the current string of this {@link StyledString}.
-	 */
-	public String toString() {
-		return getString();
-	}
-
-	/**
-	 * Returns the length of the string of this {@link StyledString}.
-	 * 
-	 * @return the length of the current string
-	 */
-	public int length() {
-		return fBuffer.length();
-	}
-
-	/**
-	 * Appends a string to the {@link StyledString}. The appended string
-	 * will have no associated styler.
-	 * 
-	 * @param string
-	 *            the string to append
-	 * @return returns a reference to this object
-	 */
-	public StyledString append(String string) {
-		return append(string, null);
-	}
-	
-	/**
-	 * Appends the string representation of the given character array
-	 * to the {@link StyledString}. The appended
-	 * character array will have no associated styler.
-	 * 
-	 * @param chars
-	 *            the character array to append
-	 * @return returns a reference to this object
-	 */
-	public StyledString append(char[] chars) {
-		return append(chars, null);
-	}
-
-	/**
-	 * Appends the string representation of the given character
-	 * to the {@link StyledString}. The appended
-	 * character will have no associated styler.
-	 * 
-	 * @param ch
-	 *            the character to append
-	 * @return returns a reference to this object
-	 */
-	public StyledString append(char ch) {
-		return append(String.valueOf(ch), null);
-	}
-
-	/**
-	 * Appends a string with styles to the {@link StyledString}.
-	 * 
-	 * @param string
-	 *            the string to append
-	 * @return returns a reference to this object
-	 */
-	public StyledString append(StyledString string) {
-		if (string.length() == 0) {
-			return this;
-		}
-
-		int offset = fBuffer.length();
-		fBuffer.append(string.toString());
-
-		List otherRuns = string.fStyleRuns;
-		if (otherRuns != null && !otherRuns.isEmpty()) {
-			for (int i = 0; i < otherRuns.size(); i++) {
-				StyleRun curr = (StyleRun) otherRuns.get(i);
-				if (i == 0 && curr.offset != 0) {
-					appendStyleRun(null, offset); // appended string will
-					// start with the default
-					// color
-				}
-				appendStyleRun(curr.style, offset + curr.offset);
-			}
-		} else {
-			appendStyleRun(null, offset); // appended string will start with
-			// the default color
-		}
-		return this;
-	}
-
-	/**
-	 * Appends the string representation of the given character
-	 * with a style to the {@link StyledString}. The
-	 * appended character will have the given style associated.
-	 * 
-	 * @param ch
-	 *            the character to append
-	 * @param styler
-	 *            the styler to use for styling the character to append or
-	 *            <code>null</code> if no styler should be associated with the
-	 *            appended character
-	 * @return returns a reference to this object
-	 */
-	public StyledString append(char ch, Styler styler) {
-		return append(String.valueOf(ch), styler);
-	}
-
-	/**
-	 * Appends a string with a style to the {@link StyledString}. The
-	 * appended string will be styled using the given styler.
-	 * 
-	 * @param string
-	 *            the string to append
-	 * @param styler
-	 *            the styler to use for styling the string to append or
-	 *            <code>null</code> if no styler should be associated with the
-	 *            appended string.
-	 * @return returns a reference to this object
-	 */
-	public StyledString append(String string, Styler styler) {
-		if (string.length() == 0)
-			return this;
-
-		int offset = fBuffer.length(); // the length before appending
-		fBuffer.append(string);
-		appendStyleRun(styler, offset);
-		return this;
-	}
-	
-	/**
-	 * Appends the string representation of the given character array
-	 * with a style to the {@link StyledString}. The
-	 * appended character array will be styled using the given styler.
-	 * 
-	 * @param chars
-	 *            the character array to append
-	 * @param styler
-	 *            the styler to use for styling the character array to append or
-	 *            <code>null</code> if no styler should be associated with the
-	 *            appended character array
-	 * @return returns a reference to this object
-	 */
-	public StyledString append(char[] chars, Styler styler) {
-		if (chars.length == 0)
-			return this;
-
-		int offset = fBuffer.length(); // the length before appending
-		fBuffer.append(chars);
-		appendStyleRun(styler, offset);
-		return this;
-	}
-
-	/**
-	 * Inserts the character at the given offset. The inserted character will
-	 * get the styler that is already at the given offset.
-	 * 
-	 * @param ch
-	 *            the character to insert
-	 * @param offset
-	 *            the insertion index
-	 * @return returns a reference to this object
-	 * @throws StringIndexOutOfBoundsException
-	 *             if <code>offset</code> is less than zero, or if <code>offset</code>
-	 *             is greater than the length of this object
-	 * @since 3.5
-	 */
-	public StyledString insert(char ch, int offset) throws StringIndexOutOfBoundsException {
-		if (offset < 0 || offset > fBuffer.length()) {
-			throw new StringIndexOutOfBoundsException(
-					"Invalid offset (" + offset + ")"); //$NON-NLS-1$//$NON-NLS-2$
-		}
-		if (hasRuns()) {
-			int runIndex = findRun(offset);
-			if (runIndex < 0) {
-				runIndex = -runIndex - 1;
-			} else {
-				runIndex = runIndex + 1;
-			}
-			StyleRunList styleRuns = getStyleRuns();
-			final int size = styleRuns.size();
-			for (int i = runIndex; i < size; i++) {
-				StyleRun run = styleRuns.getRun(i);
-				run.offset++;
-			}
-		}
-		fBuffer.insert(offset, ch);
-		return this;
-	}
-
-	/**
-	 * Sets a styler to use for the given source range. The range must be
-	 * subrange of actual string of this {@link StyledString}. Stylers
-	 * previously set for that range will be overwritten.
-	 * 
-	 * @param offset
-	 *            the start offset of the range
-	 * @param length
-	 *            the length of the range
-	 * @param styler
-	 *            the styler to set
-	 * 
-	 * @throws StringIndexOutOfBoundsException
-	 *             if <code>start</code> is less than zero, or if offset plus
-	 *             length is greater than the length of this object.
-	 */
-	public void setStyle(int offset, int length, Styler styler) throws StringIndexOutOfBoundsException {
-		if (offset < 0 || offset + length > fBuffer.length()) {
-			throw new StringIndexOutOfBoundsException(
-					"Invalid offset (" + offset + ") or length (" + length + ")"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
-		}
-		if (length == 0) {
-			return;
-		}
-		if (!hasRuns() || getLastRun().offset <= offset) {
-			appendStyleRun(styler, offset);
-			if (offset + length != fBuffer.length()) {
-				appendStyleRun(null, offset + length);
-			}
-			return;
-		}
-
-		int endRun = findRun(offset + length);
-		if (endRun >= 0) {
-			// run with the same end index, nothing to change
-		} else {
-			endRun = -(endRun + 1);
-			if (offset + length < fBuffer.length()) {
-				Styler prevStyle = endRun > 0 ? fStyleRuns.getRun(endRun - 1).style
-						: null;
-				fStyleRuns
-						.add(endRun, new StyleRun(offset + length, prevStyle));
-			}
-		}
-
-		int startRun = findRun(offset);
-		if (startRun >= 0) {
-			// run with the same start index
-			StyleRun styleRun = fStyleRuns.getRun(startRun);
-			styleRun.style = styler;
-		} else {
-			startRun = -(startRun + 1);
-
-			Styler prevStyle = startRun > 0 ? fStyleRuns.getRun(startRun - 1).style
-					: null;
-			if (isDifferentStyle(prevStyle, styler)
-					|| (startRun == 0 && styler != null)) {
-				fStyleRuns.add(startRun, new StyleRun(offset, styler));
-				endRun++; // endrun is moved one back
-			} else {
-				startRun--; // we use the previous
-			}
-		}
-		if (startRun + 1 < endRun) {
-			fStyleRuns.removeRange(startRun + 1, endRun);
-		}
-	}
-
-	/**
-	 * Returns an array of {@link StyleRange} resulting from applying all
-	 * associated stylers for this string builder.
-	 * 
-	 * @return an array of all {@link StyleRange} resulting from applying the
-	 *         stored stylers to this string.
-	 */
-	public StyleRange[] getStyleRanges() {
-		if (hasRuns()) {
-			ArrayList res = new ArrayList();
-
-			List styleRuns = getStyleRuns();
-			int offset = 0;
-			Styler style = null;
-			for (int i = 0; i < styleRuns.size(); i++) {
-				StyleRun curr = (StyleRun) styleRuns.get(i);
-				if (isDifferentStyle(curr.style, style)) {
-					if (curr.offset > offset && style != null) {
-						res.add(createStyleRange(offset, curr.offset, style));
-					}
-					offset = curr.offset;
-					style = curr.style;
-				}
-			}
-			if (fBuffer.length() > offset && style != null) {
-				res.add(createStyleRange(offset, fBuffer.length(), style));
-			}
-			return (StyleRange[]) res.toArray(new StyleRange[res.size()]);
-		}
-		return EMPTY;
-	}
-
-	private int findRun(int offset) {
-		// method assumes that fStyleRuns is not null
-		int low = 0;
-		int high = fStyleRuns.size() - 1;
-		while (low <= high) {
-			int mid = (low + high) / 2;
-			StyleRun styleRun = fStyleRuns.getRun(mid);
-			if (styleRun.offset < offset) {
-				low = mid + 1;
-			} else if (styleRun.offset > offset) {
-				high = mid - 1;
-			} else {
-				return mid; // key found
-			}
-		}
-		return -(low + 1); // key not found.
-	}
-
-	private StyleRange createStyleRange(int start, int end, Styler style) {
-		StyleRange styleRange = new StyleRange();
-		styleRange.start = start;
-		styleRange.length = end - start;
-		style.applyStyles(styleRange);
-		return styleRange;
-	}
-
-	private boolean hasRuns() {
-		return fStyleRuns != null && !fStyleRuns.isEmpty();
-	}
-
-	private void appendStyleRun(Styler style, int offset) {
-		StyleRun lastRun = getLastRun();
-		if (lastRun != null && lastRun.offset == offset) {
-			lastRun.style = style;
-			return;
-		}
-
-		if (lastRun == null && style != null || lastRun != null
-				&& isDifferentStyle(style, lastRun.style)) {
-			getStyleRuns().add(new StyleRun(offset, style));
-		}
-	}
-
-	private boolean isDifferentStyle(Styler style1, Styler style2) {
-		if (style1 == null) {
-			return style2 != null;
-		}
-		return !style1.equals(style2);
-	}
-
-	private StyleRun getLastRun() {
-		if (fStyleRuns == null || fStyleRuns.isEmpty()) {
-			return null;
-		}
-		return fStyleRuns.getRun(fStyleRuns.size() - 1);
-	}
-
-	private StyleRunList getStyleRuns() {
-		if (fStyleRuns == null)
-			fStyleRuns = new StyleRunList();
-		return fStyleRuns;
-	}
-
-	private static class StyleRun {
-		public int offset;
-		public Styler style;
-
-		public StyleRun(int offset, Styler style) {
-			this.offset = offset;
-			this.style = style;
-		}
-
-		public String toString() {
-			return "Offset " + offset + ", style: " + style; //$NON-NLS-1$//$NON-NLS-2$
-		}
-	}
-
-	private static class StyleRunList extends ArrayList {
-		private static final long serialVersionUID = 123L;
-
-		public StyleRunList() {
-			super(3);
-		}
-
-		public StyleRun getRun(int index) {
-			return (StyleRun) get(index);
-		}
-
-		public void removeRange(int fromIndex, int toIndex) {
-			super.removeRange(fromIndex, toIndex);
-		}
-	}
-
-	private static class DefaultStyler extends Styler {
-		private final String fForegroundColorName;
-		private final String fBackgroundColorName;
-
-		public DefaultStyler(String foregroundColorName,
-				String backgroundColorName) {
-			fForegroundColorName = foregroundColorName;
-			fBackgroundColorName = backgroundColorName;
-		}
-
-		public void applyStyles(TextStyle textStyle) {
-			ColorRegistry colorRegistry = JFaceResources.getColorRegistry();
-			if (fForegroundColorName != null) {
-				textStyle.foreground = colorRegistry.get(fForegroundColorName);
-			}
-			if (fBackgroundColorName != null) {
-				textStyle.background = colorRegistry.get(fBackgroundColorName);
-			}
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableColumnViewerLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableColumnViewerLabelProvider.java
deleted file mode 100644
index 2000b97..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableColumnViewerLabelProvider.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Shindl <tom.schindl@bestsolution.at> - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-
-/**
- * TableColumnViewerLabelProvider is the mapping from the table based providers
- * to the ViewerLabelProvider.
- * 
- * @since 3.3
- * @see ITableLabelProvider
- * @see ITableColorProvider
- * @see ITableFontProvider
- * 
- */
-class TableColumnViewerLabelProvider extends WrappedViewerLabelProvider {
-
-	private ITableLabelProvider tableLabelProvider;
-
-	private ITableColorProvider tableColorProvider;
-
-	private ITableFontProvider tableFontProvider;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param labelProvider
-	 *            instance of a table based label provider
-	 * @see ITableLabelProvider
-	 * @see ITableColorProvider
-	 * @see ITableFontProvider
-	 */
-	public TableColumnViewerLabelProvider(IBaseLabelProvider labelProvider) {
-		super(labelProvider);
-
-		if (labelProvider instanceof ITableLabelProvider)
-			tableLabelProvider = (ITableLabelProvider) labelProvider;
-
-		if (labelProvider instanceof ITableColorProvider)
-			tableColorProvider = (ITableColorProvider) labelProvider;
-
-		if (labelProvider instanceof ITableFontProvider)
-			tableFontProvider = (ITableFontProvider) labelProvider;
-	}
-
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.WrappedViewerLabelProvider#update(org.eclipse.jface.viewers.ViewerCell)
-	 */
-	public void update(ViewerCell cell) {
-
-		Object element = cell.getElement();
-		int index = cell.getColumnIndex();
-
-		if (tableLabelProvider == null) {
-			cell.setText(getLabelProvider().getText(element));
-			cell.setImage(getLabelProvider().getImage(element));
-		} else {
-			cell.setText(tableLabelProvider.getColumnText(element, index));
-			cell.setImage(tableLabelProvider.getColumnImage(element, index));
-		}
-
-		if (tableColorProvider == null) {
-			if (getColorProvider() != null) {
-				cell.setBackground(getColorProvider().getBackground(element));
-				cell.setForeground(getColorProvider().getForeground(element));
-			}
-
-		} else {
-			cell.setBackground(tableColorProvider
-					.getBackground(element, index));
-			cell.setForeground(tableColorProvider
-					.getForeground(element, index));
-
-		}
-
-		if (tableFontProvider == null) {
-			if (getFontProvider() != null)
-				cell.setFont(getFontProvider().getFont(element));
-		} else
-			cell.setFont(tableFontProvider.getFont(element, index));
-
-	}
-
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableLayout.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableLayout.java
deleted file mode 100644
index a4295fb..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableLayout.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Florian Priester - bug 106059
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.layout.TableColumnLayout;
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-
-/**
- * A layout for a table. Call <code>addColumnData</code> to add columns.
- * The TableLayout {@link ColumnLayoutData} is only valid until the table
- * is resized. To keep the proportions constant when the table is resized 
- * see {@link TableColumnLayout}
- */
-public class TableLayout extends Layout {
-
-	/**
-	 * The number of extra pixels taken as horizontal trim by the table column.
-	 * To ensure there are N pixels available for the content of the column,
-	 * assign N+COLUMN_TRIM for the column width.
-	 * 
-	 * @since 3.1
-	 */
-	private static int COLUMN_TRIM;
-
-	static {
-		if (Util.isWindows()) {
-			COLUMN_TRIM = 4;
-		} else if (Util.isMac()) {
-			COLUMN_TRIM = 24;
-		} else {
-			COLUMN_TRIM = 3;
-		}
-	}
-
-	/**
-	 * The list of column layout data (element type:
-	 * <code>ColumnLayoutData</code>).
-	 */
-	private List columns = new ArrayList();
-
-	/**
-	 * Indicates whether <code>layout</code> has yet to be called.
-	 */
-	private boolean firstTime = true;
-
-	/**
-	 * Creates a new table layout.
-	 */
-	public TableLayout() {
-	}
-
-	/**
-	 * Adds a new column of data to this table layout.
-	 * 
-	 * @param data
-	 *            the column layout data
-	 */
-	public void addColumnData(ColumnLayoutData data) {
-		columns.add(data);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Layout.
-	 */
-	public Point computeSize(Composite c, int wHint, int hHint, boolean flush) {
-		if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT) {
-			return new Point(wHint, hHint);
-		}
-
-		Table table = (Table) c;
-		// To avoid recursions.
-		table.setLayout(null);
-		// Use native layout algorithm
-		Point result = table.computeSize(wHint, hHint, flush);
-		table.setLayout(this);
-
-		int width = 0;
-		int size = columns.size();
-		for (int i = 0; i < size; ++i) {
-			ColumnLayoutData layoutData = (ColumnLayoutData) columns.get(i);
-			if (layoutData instanceof ColumnPixelData) {
-				ColumnPixelData col = (ColumnPixelData) layoutData;
-				width += col.width;
-				if (col.addTrim) {
-					width += COLUMN_TRIM;
-				}
-			} else if (layoutData instanceof ColumnWeightData) {
-				ColumnWeightData col = (ColumnWeightData) layoutData;
-				width += col.minimumWidth;
-			} else {
-				Assert.isTrue(false, "Unknown column layout data");//$NON-NLS-1$
-			}
-		}
-		if (width > result.x) {
-			result.x = width;
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Layout.
-	 */
-	public void layout(Composite c, boolean flush) {
-		// Only do initial layout. Trying to maintain proportions when resizing
-		// is too hard,
-		// causes lots of widget flicker, causes scroll bars to appear and
-		// occasionally stick around (on Windows),
-		// requires hooking column resizing as well, and may not be what the
-		// user wants anyway.
-		if (!firstTime) {
-			return;
-		}
-
-		int width = c.getClientArea().width;
-
-		// XXX: Layout is being called with an invalid value the first time
-		// it is being called on Linux. This method resets the
-		// Layout to null so we make sure we run it only when
-		// the value is OK.
-		if (width <= 1) {
-			return;
-		}
-
-		Item[] tableColumns = getColumns(c);
-		int size = Math.min(columns.size(), tableColumns.length);
-		int[] widths = new int[size];
-		int fixedWidth = 0;
-		int numberOfWeightColumns = 0;
-		int totalWeight = 0;
-
-		// First calc space occupied by fixed columns
-		for (int i = 0; i < size; i++) {
-			ColumnLayoutData col = (ColumnLayoutData) columns.get(i);
-			if (col instanceof ColumnPixelData) {
-				ColumnPixelData cpd = (ColumnPixelData) col;
-				int pixels = cpd.width;
-				if (cpd.addTrim) {
-					pixels += COLUMN_TRIM;
-				}
-				widths[i] = pixels;
-				fixedWidth += pixels;
-			} else if (col instanceof ColumnWeightData) {
-				ColumnWeightData cw = (ColumnWeightData) col;
-				numberOfWeightColumns++;
-				// first time, use the weight specified by the column data,
-				// otherwise use the actual width as the weight
-				// int weight = firstTime ? cw.weight :
-				// tableColumns[i].getWidth();
-				int weight = cw.weight;
-				totalWeight += weight;
-			} else {
-				Assert.isTrue(false, "Unknown column layout data");//$NON-NLS-1$
-			}
-		}
-
-		// Do we have columns that have a weight
-		if (numberOfWeightColumns > 0) {
-			// Now distribute the rest to the columns with weight.
-			int rest = width - fixedWidth;
-			int totalDistributed = 0;
-			for (int i = 0; i < size; ++i) {
-				ColumnLayoutData col = (ColumnLayoutData) columns.get(i);
-				if (col instanceof ColumnWeightData) {
-					ColumnWeightData cw = (ColumnWeightData) col;
-					// calculate weight as above
-					// int weight = firstTime ? cw.weight :
-					// tableColumns[i].getWidth();
-					int weight = cw.weight;
-					int pixels = totalWeight == 0 ? 0 : weight * rest
-							/ totalWeight;
-					if (pixels < cw.minimumWidth) {
-						pixels = cw.minimumWidth;
-					}
-					totalDistributed += pixels;
-					widths[i] = pixels;
-				}
-			}
-
-			// Distribute any remaining pixels to columns with weight.
-			int diff = rest - totalDistributed;
-			for (int i = 0; diff > 0; ++i) {
-				if (i == size) {
-					i = 0;
-				}
-				ColumnLayoutData col = (ColumnLayoutData) columns.get(i);
-				if (col instanceof ColumnWeightData) {
-					++widths[i];
-					--diff;
-				}
-			}
-		}
-
-		firstTime = false;
-
-		for (int i = 0; i < size; i++) {
-			setWidth(tableColumns[i], widths[i]);
-		}
-	}
-
-	/**
-	 * Set the width of the item.
-	 * 
-	 * @param item
-	 * @param width
-	 */
-	private void setWidth(Item item, int width) {
-		if (item instanceof TreeColumn) {
-			((TreeColumn) item).setWidth(width);
-		} else {
-			((TableColumn) item).setWidth(width);
-		}
-
-	}
-
-	/**
-	 * Return the columns for the receiver.
-	 * 
-	 * @param composite
-	 * @return Item[]
-	 */
-	private Item[] getColumns(Composite composite) {
-		if (composite instanceof Tree) {
-			return ((Tree) composite).getColumns();
-		}
-		return ((Table) composite).getColumns();
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableTreeViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableTreeViewer.java
deleted file mode 100644
index e8f0fb6..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableTreeViewer.java
+++ /dev/null
@@ -1,859 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - bug 153993
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.List;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TableTree;
-import org.eclipse.swt.custom.TableTreeEditor;
-import org.eclipse.swt.custom.TableTreeItem;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.TreeListener;
-import org.eclipse.swt.graphics.Image;
-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.Display;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * A concrete viewer based on a SWT <code>TableTree</code> control.
- * <p>
- * This class is not intended to be subclassed outside the viewer framework. It
- * is designed to be instantiated with a pre-existing SWT table tree control and
- * configured with a domain-specific content provider, label provider, element
- * filter (optional), and element sorter (optional).
- * </p>
- * <p>
- * Content providers for table tree viewers must implement the
- * <code>ITreeContentProvider</code> interface.
- * </p>
- * <p>
- * Label providers for table tree viewers must implement either the
- * <code>ITableLabelProvider</code> or the <code>ILabelProvider</code>
- * interface (see <code>TableTreeViewer.setLabelProvider</code> for more
- * details).
- * </p>
- * 
- * @deprecated As of 3.1 use {@link TreeViewer} instead
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class TableTreeViewer extends AbstractTreeViewer {
-	/**
-	 * Internal table viewer implementation.
-	 */
-	private TableTreeEditorImpl tableEditorImpl;
-
-	/**
-	 * This viewer's table tree control.
-	 */
-	private TableTree tableTree;
-
-	/**
-	 * This viewer's table tree editor.
-	 */
-	private TableTreeEditor tableTreeEditor;
-
-	/**
-	 * Copied from original TableEditorImpl and moved here since refactoring
-	 * completely wiped out the original implementation in 3.3
-	 * 
-	 * @since 3.1
-	 */
-	class TableTreeEditorImpl {
-
-		private CellEditor cellEditor;
-
-		private CellEditor[] cellEditors;
-
-		private ICellModifier cellModifier;
-
-		private String[] columnProperties;
-
-		private Item tableItem;
-
-		private int columnNumber;
-
-		private ICellEditorListener cellEditorListener;
-
-		private FocusListener focusListener;
-
-		private MouseListener mouseListener;
-
-		private int doubleClickExpirationTime;
-
-		private ColumnViewer viewer;
-
-		private TableTreeEditorImpl(ColumnViewer viewer) {
-			this.viewer = viewer;
-			initCellEditorListener();
-		}
-
-		/**
-		 * Returns this <code>TableViewerImpl</code> viewer
-		 * 
-		 * @return the viewer
-		 */
-		public ColumnViewer getViewer() {
-			return viewer;
-		}
-
-		private void activateCellEditor() {
-			if( cellEditors != null ) {
-				if( cellEditors[columnNumber] != null && cellModifier != null ) {
-					Object element = tableItem.getData();
-					String property = columnProperties[columnNumber];
-					
-					if( cellModifier.canModify(element, property) ) {
-						cellEditor = cellEditors[columnNumber];
-						
-						cellEditor.addListener(cellEditorListener);
-						
-						Object value = cellModifier.getValue(element, property);
-						cellEditor.setValue(value);
-						// Tricky flow of control here:
-						// activate() can trigger callback to cellEditorListener
-						// which will clear cellEditor
-						// so must get control first, but must still call activate()
-						// even if there is no control.
-						final Control control = cellEditor.getControl();
-						cellEditor.activate();
-						if (control == null) {
-							return;
-						}
-						setLayoutData(cellEditor.getLayoutData());
-						setEditor(control, tableItem, columnNumber);
-						cellEditor.setFocus();
-						if (focusListener == null) {
-							focusListener = new FocusAdapter() {
-								public void focusLost(FocusEvent e) {
-									applyEditorValue();
-								}
-							};
-						}
-						control.addFocusListener(focusListener);
-						mouseListener = new MouseAdapter() {
-							public void mouseDown(MouseEvent e) {
-								// time wrap?
-								// check for expiration of doubleClickTime
-								if (e.time <= doubleClickExpirationTime) {
-									control.removeMouseListener(mouseListener);
-									cancelEditing();
-									handleDoubleClickEvent();
-								} else if (mouseListener != null) {
-									control.removeMouseListener(mouseListener);
-								}
-							}
-						};
-						control.addMouseListener(mouseListener);
-					}
-				}
-			}
-		}
-
-		/**
-		 * Activate a cell editor for the given mouse position.
-		 */
-		private void activateCellEditor(MouseEvent event) {
-			if (tableItem == null || tableItem.isDisposed()) {
-				// item no longer exists
-				return;
-			}
-			int columnToEdit;
-			int columns = getColumnCount();
-			if (columns == 0) {
-				// If no TableColumn, Table acts as if it has a single column
-				// which takes the whole width.
-				columnToEdit = 0;
-			} else {
-				columnToEdit = -1;
-				for (int i = 0; i < columns; i++) {
-					Rectangle bounds = getBounds(tableItem, i);
-					if (bounds.contains(event.x, event.y)) {
-						columnToEdit = i;
-						break;
-					}
-				}
-				if (columnToEdit == -1) {
-					return;
-				}
-			}
-
-			columnNumber = columnToEdit;
-			activateCellEditor();
-		}
-
-		/**
-		 * Deactivates the currently active cell editor.
-		 */
-		public void applyEditorValue() {
-			CellEditor c = this.cellEditor;
-			if (c != null) {
-				// null out cell editor before calling save
-				// in case save results in applyEditorValue being re-entered
-				// see 1GAHI8Z: ITPUI:ALL - How to code event notification when
-				// using cell editor ?
-				this.cellEditor = null;
-				Item t = this.tableItem;
-				// don't null out table item -- same item is still selected
-				if (t != null && !t.isDisposed()) {
-					saveEditorValue(c, t);
-				}
-				setEditor(null, null, 0);
-				c.removeListener(cellEditorListener);
-				Control control = c.getControl();
-				if (control != null) {
-					if (mouseListener != null) {
-						control.removeMouseListener(mouseListener);
-					}
-					if (focusListener != null) {
-						control.removeFocusListener(focusListener);
-					}
-				}
-				c.deactivate();
-			}
-		}
-
-		/**
-		 * Cancels the active cell editor, without saving the value back to the
-		 * domain model.
-		 */
-		public void cancelEditing() {
-			if (cellEditor != null) {
-				setEditor(null, null, 0);
-				cellEditor.removeListener(cellEditorListener);
-				CellEditor oldEditor = cellEditor;
-				cellEditor = null;
-				oldEditor.deactivate();
-			}
-		}
-
-		/**
-		 * Start editing the given element.
-		 * 
-		 * @param element
-		 * @param column
-		 */
-		public void editElement(Object element, int column) {
-			if (cellEditor != null) {
-				applyEditorValue();
-			}
-
-			setSelection(new StructuredSelection(element), true);
-			Item[] selection = getSelection();
-			if (selection.length != 1) {
-				return;
-			}
-
-			tableItem = selection[0];
-
-			// Make sure selection is visible
-			showSelection();
-			columnNumber = column;
-			activateCellEditor();
-
-		}
-
-		/**
-		 * Return the array of CellEditors used in the viewer
-		 * 
-		 * @return the cell editors
-		 */
-		public CellEditor[] getCellEditors() {
-			return cellEditors;
-		}
-
-		/**
-		 * Get the cell modifier
-		 * 
-		 * @return the cell modifier
-		 */
-		public ICellModifier getCellModifier() {
-			return cellModifier;
-		}
-
-		/**
-		 * Return the properties for the column
-		 * 
-		 * @return the array of column properties
-		 */
-		public Object[] getColumnProperties() {
-			return columnProperties;
-		}
-
-		/**
-		 * Handles the mouse down event; activates the cell editor.
-		 * 
-		 * @param event
-		 *            the mouse event that should be handled
-		 */
-		public void handleMouseDown(MouseEvent event) {
-			if (event.button != 1) {
-				return;
-			}
-
-			if (cellEditor != null) {
-				applyEditorValue();
-			}
-
-			// activate the cell editor immediately. If a second mouseDown
-			// is received prior to the expiration of the doubleClick time then
-			// the cell editor will be deactivated and a doubleClick event will
-			// be processed.
-			//
-			doubleClickExpirationTime = event.time
-					+ Display.getCurrent().getDoubleClickTime();
-
-			Item[] items = getSelection();
-			// Do not edit if more than one row is selected.
-			if (items.length != 1) {
-				tableItem = null;
-				return;
-			}
-			tableItem = items[0];
-			
-			activateCellEditor(event);
-		}
-
-		private void initCellEditorListener() {
-			cellEditorListener = new ICellEditorListener() {
-				public void editorValueChanged(boolean oldValidState,
-						boolean newValidState) {
-					// Ignore.
-				}
-
-				public void cancelEditor() {
-					TableTreeEditorImpl.this.cancelEditing();
-				}
-
-				public void applyEditorValue() {
-					TableTreeEditorImpl.this.applyEditorValue();
-				}
-			};
-		}
-
-		/**
-		 * Return whether there is an active cell editor.
-		 * 
-		 * @return <code>true</code> if there is an active cell editor;
-		 *         otherwise <code>false</code> is returned.
-		 */
-		public boolean isCellEditorActive() {
-			return cellEditor != null;
-		}
-
-		/**
-		 * Saves the value of the currently active cell editor, by delegating to
-		 * the cell modifier.
-		 */
-		private void saveEditorValue(CellEditor cellEditor, Item tableItem) {
-			if( cellModifier != null ) {
-				if( ! cellEditor.isValueValid() ) {
-					// Do what????
-				}
-			}
-			String property = null;
-			
-			if( columnProperties != null && columnNumber < columnProperties.length ) {
-				property = columnProperties[columnNumber];
-			}
-			cellModifier.modify(tableItem, property, cellEditor.getValue());
-		}
-
-		/**
-		 * Set the cell editors
-		 * 
-		 * @param editors
-		 */
-		public void setCellEditors(CellEditor[] editors) {
-			this.cellEditors = editors;
-		}
-
-		/**
-		 * Set the cell modifier
-		 * 
-		 * @param modifier
-		 */
-		public void setCellModifier(ICellModifier modifier) {
-			this.cellModifier = modifier;
-		}
-
-		/**
-		 * Set the column properties
-		 * 
-		 * @param columnProperties
-		 */
-		public void setColumnProperties(String[] columnProperties) {
-			this.columnProperties = columnProperties;
-		}
-
-		Rectangle getBounds(Item item, int columnNumber) {
-			return ((TableTreeItem) item).getBounds(columnNumber);
-		}
-
-		int getColumnCount() {
-			// getColumnCount() should be a API in TableTree.
-			return getTableTree().getTable().getColumnCount();
-		}
-
-		Item[] getSelection() {
-			return getTableTree().getSelection();
-		}
-
-		void setEditor(Control w, Item item, int columnNumber) {
-			tableTreeEditor.setEditor(w, (TableTreeItem) item, columnNumber);
-		}
-
-		void setSelection(StructuredSelection selection, boolean b) {
-			TableTreeViewer.this.setSelection(selection, b);
-		}
-
-		void showSelection() {
-			getTableTree().showSelection();
-		}
-
-		void setLayoutData(CellEditor.LayoutData layoutData) {
-			tableTreeEditor.horizontalAlignment = layoutData.horizontalAlignment;
-			tableTreeEditor.grabHorizontal = layoutData.grabHorizontal;
-			tableTreeEditor.minimumWidth = layoutData.minimumWidth;
-		}
-
-		void handleDoubleClickEvent() {
-			Viewer viewer = getViewer();
-			fireDoubleClick(new DoubleClickEvent(viewer, viewer.getSelection()));
-			fireOpen(new OpenEvent(viewer, viewer.getSelection()));
-		}
-	}
-
-	/**
-	 * Creates a table tree viewer on the given table tree control. The viewer
-	 * has no input, no content provider, a default label provider, no sorter,
-	 * and no filters.
-	 * 
-	 * @param tree
-	 *            the table tree control
-	 */
-	public TableTreeViewer(TableTree tree) {
-		super();
-		tableTree = tree;
-		hookControl(tree);
-		tableTreeEditor = new TableTreeEditor(tableTree);
-		tableEditorImpl = new TableTreeEditorImpl(this);
-	}
-
-	/**
-	 * Creates a table tree viewer on a newly-created table tree control under
-	 * the given parent. The table tree control is created using the SWT style
-	 * bits <code>MULTI, H_SCROLL, V_SCROLL, and BORDER</code>. The viewer
-	 * has no input, no content provider, a default label provider, no sorter,
-	 * and no filters.
-	 * 
-	 * @param parent
-	 *            the parent control
-	 */
-	public TableTreeViewer(Composite parent) {
-		this(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-	}
-
-	/**
-	 * Creates a table tree viewer on a newly-created table tree control under
-	 * the given parent. The table tree control is created using the given SWT
-	 * style bits. The viewer has no input, no content provider, a default label
-	 * provider, no sorter, and no filters.
-	 * 
-	 * @param parent
-	 *            the parent control
-	 * @param style
-	 *            the SWT style bits
-	 */
-	public TableTreeViewer(Composite parent, int style) {
-		this(new TableTree(parent, style));
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on AbstractTreeViewer.
-	 */
-	protected void addTreeListener(Control c, TreeListener listener) {
-		((TableTree) c).addTreeListener(listener);
-	}
-
-	/**
-	 * Cancels a currently active cell editor. All changes already done in the
-	 * cell editor are lost.
-	 */
-	public void cancelEditing() {
-		tableEditorImpl.cancelEditing();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on AbstractTreeViewer.
-	 */
-	protected void doUpdateItem(Item item, Object element) {
-		// update icon and label
-		// Similar code in TableTreeViewer.doUpdateItem()
-		IBaseLabelProvider prov = getLabelProvider();
-		ITableLabelProvider tprov = null;
-
-		if (prov instanceof ITableLabelProvider) {
-			tprov = (ITableLabelProvider) prov;
-		}
-
-		int columnCount = tableTree.getTable().getColumnCount();
-		TableTreeItem ti = (TableTreeItem) item;
-		// Also enter loop if no columns added. See 1G9WWGZ: JFUIF:WINNT -
-		// TableViewer with 0 columns does not work
-		for (int column = 0; column < columnCount || column == 0; column++) {
-			String text = "";//$NON-NLS-1$
-			Image image = null;
-			if (tprov != null) {
-				text = tprov.getColumnText(element, column);
-				image = tprov.getColumnImage(element, column);
-			} else {
-				if (column == 0) {
-					ViewerLabel updateLabel = new ViewerLabel(item.getText(),
-							item.getImage());
-					buildLabel(updateLabel, element);
-
-					// As it is possible for user code to run the event
-					// loop check here.
-					if (item.isDisposed()) {
-						unmapElement(element, item);
-						return;
-					}
-
-					text = updateLabel.getText();
-					image = updateLabel.getImage();
-				}
-			}
-
-			// Avoid setting text to null
-			if (text == null) {
-				text = ""; //$NON-NLS-1$
-			}
-
-			ti.setText(column, text);
-			// Apparently a problem to setImage to null if already null
-			if (ti.getImage(column) != image) {
-				ti.setImage(column, image);
-			}
-
-			getColorAndFontCollector().setFontsAndColors(element);
-			getColorAndFontCollector().applyFontsAndColors(ti);
-		}
-
-	}
-
-	/**
-	 * Starts editing the given element.
-	 * 
-	 * @param element
-	 *            the element
-	 * @param column
-	 *            the column number
-	 */
-	public void editElement(Object element, int column) {
-		tableEditorImpl.editElement(element, column);
-	}
-
-	/**
-	 * Returns the cell editors of this viewer.
-	 * 
-	 * @return the list of cell editors
-	 */
-	public CellEditor[] getCellEditors() {
-		return tableEditorImpl.getCellEditors();
-	}
-
-	/**
-	 * Returns the cell modifier of this viewer.
-	 * 
-	 * @return the cell modifier
-	 */
-	public ICellModifier getCellModifier() {
-		return tableEditorImpl.getCellModifier();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on AbstractTreeViewer.
-	 */
-	protected Item[] getChildren(Widget o) {
-		if (o instanceof TableTreeItem) {
-			return ((TableTreeItem) o).getItems();
-		}
-		if (o instanceof TableTree) {
-			return ((TableTree) o).getItems();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#getChild(org.eclipse.swt.widgets.Widget,
-	 *      int)
-	 */
-	protected Item getChild(Widget widget, int index) {
-		if (widget instanceof TableTreeItem) {
-			return ((TableTreeItem) widget).getItem(index);
-		}
-		if (widget instanceof TableTree) {
-			return ((TableTree) widget).getItem(index);
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the column properties of this viewer. The properties must
-	 * correspond with the columns of the table control. They are used to
-	 * identify the column in a cell modifier.
-	 * 
-	 * @return the list of column properties
-	 */
-	public Object[] getColumnProperties() {
-		return tableEditorImpl.getColumnProperties();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Viewer.
-	 */
-	public Control getControl() {
-		return tableTree;
-	}
-
-	/**
-	 * Returns the element with the given index from this viewer. Returns
-	 * <code>null</code> if the index is out of range.
-	 * <p>
-	 * This method is internal to the framework.
-	 * </p>
-	 * 
-	 * @param index
-	 *            the zero-based index
-	 * @return the element at the given index, or <code>null</code> if the
-	 *         index is out of range
-	 */
-	public Object getElementAt(int index) {
-		// XXX: Workaround for 1GBCSB1: SWT:WIN2000 - TableTree should have
-		// getItem(int index)
-		TableTreeItem i = tableTree.getItems()[index];
-		if (i != null) {
-			return i.getData();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on AbstractTreeViewer.
-	 */
-	protected boolean getExpanded(Item item) {
-		return ((TableTreeItem) item).getExpanded();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ColumnViewer#getItemAt(org.eclipse.swt.graphics.Point)
-	 */
-	protected Item getItemAt(Point p) {
-		return getTableTree().getTable().getItem(p);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on AbstractTreeViewer.
-	 */
-	protected int getItemCount(Control widget) {
-		return ((TableTree) widget).getItemCount();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on AbstractTreeViewer.
-	 */
-	protected int getItemCount(Item item) {
-		return ((TableTreeItem) item).getItemCount();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on AbstractTreeViewer.
-	 */
-	protected org.eclipse.swt.widgets.Item[] getItems(
-			org.eclipse.swt.widgets.Item item) {
-		return ((TableTreeItem) item).getItems();
-	}
-
-	/**
-	 * The table tree viewer implementation of this <code>Viewer</code>
-	 * framework method returns the label provider, which in the case of table
-	 * tree viewers will be an instance of either
-	 * <code>ITableLabelProvider</code> or <code>ILabelProvider</code>. If
-	 * it is an <code>ITableLabelProvider</code>, then it provides a separate
-	 * label text and image for each column. If it is an
-	 * <code>ILabelProvider</code>, then it provides only the label text and
-	 * image for the first column, and any remaining columns are blank.
-	 */
-	public IBaseLabelProvider getLabelProvider() {
-		return super.getLabelProvider();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on AbstractTreeViewer.
-	 */
-	protected Item getParentItem(Item item) {
-		return ((TableTreeItem) item).getParentItem();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on AbstractTreeViewer.
-	 */
-	protected Item[] getSelection(Control widget) {
-		return ((TableTree) widget).getSelection();
-	}
-
-	/**
-	 * Returns this table tree viewer's table tree control.
-	 * 
-	 * @return the table tree control
-	 */
-	public TableTree getTableTree() {
-		return tableTree;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on AbstractTreeViewer.
-	 */
-	protected void hookControl(Control control) {
-		super.hookControl(control);
-		tableTree.getTable().addMouseListener(new MouseAdapter() {
-			public void mouseDown(MouseEvent e) {
-				/*
-				 * If user clicked on the [+] or [-], do not activate
-				 * CellEditor.
-				 */
-				// XXX: This code should not be here. SWT should either have
-				// support to see
-				// if the user clicked on the [+]/[-] or manage the table editor
-				// activation
-				org.eclipse.swt.widgets.TableItem[] items = tableTree
-						.getTable().getItems();
-				for (int i = 0; i < items.length; i++) {
-					Rectangle rect = items[i].getImageBounds(0);
-					if (rect.contains(e.x, e.y)) {
-						return;
-					}
-				}
-
-				tableEditorImpl.handleMouseDown(e);
-			}
-		});
-	}
-
-	/**
-	 * Returns whether there is an active cell editor.
-	 * 
-	 * @return <code>true</code> if there is an active cell editor, and
-	 *         <code>false</code> otherwise
-	 */
-	public boolean isCellEditorActive() {
-		return tableEditorImpl.isCellEditorActive();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected Item newItem(Widget parent, int flags, int ix) {
-		TableTreeItem item;
-		if (ix >= 0) {
-			if (parent instanceof TableTreeItem) {
-				item = new TableTreeItem((TableTreeItem) parent, flags, ix);
-			} else {
-				item = new TableTreeItem((TableTree) parent, flags, ix);
-			}
-		} else {
-			if (parent instanceof TableTreeItem) {
-				item = new TableTreeItem((TableTreeItem) parent, flags);
-			} else {
-				item = new TableTreeItem((TableTree) parent, flags);
-			}
-		}
-		return item;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected void removeAll(Control widget) {
-		((TableTree) widget).removeAll();
-	}
-
-	/**
-	 * Sets the cell editors of this table viewer.
-	 * 
-	 * @param editors
-	 *            the list of cell editors
-	 */
-	public void setCellEditors(CellEditor[] editors) {
-		tableEditorImpl.setCellEditors(editors);
-	}
-
-	/**
-	 * Sets the cell modifier of this table viewer.
-	 * 
-	 * @param modifier
-	 *            the cell modifier
-	 */
-	public void setCellModifier(ICellModifier modifier) {
-		tableEditorImpl.setCellModifier(modifier);
-	}
-
-	/**
-	 * Sets the column properties of this table viewer. The properties must
-	 * correspond with the columns of the table control. They are used to
-	 * identify the column in a cell modifier.
-	 * 
-	 * @param columnProperties
-	 *            the list of column properties
-	 */
-	public void setColumnProperties(String[] columnProperties) {
-		tableEditorImpl.setColumnProperties(columnProperties);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected void setExpanded(Item node, boolean expand) {
-		((TableTreeItem) node).setExpanded(expand);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected void setSelection(List items) {
-		TableTreeItem[] newItems = new TableTreeItem[items.size()];
-		items.toArray(newItems);
-		getTableTree().setSelection(newItems);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected void showItem(Item item) {
-		getTableTree().showItem((TableTreeItem) item);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewer.java
deleted file mode 100644
index 4d69ed5..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewer.java
+++ /dev/null
@@ -1,411 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - concept of ViewerRow,
- *                                                 fix for 159597, refactoring (bug 153993),
- *                                                 widget-independency (bug 154329), fix for 187826, 191468
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * A concrete viewer based on a SWT <code>Table</code> control.
- * <p>
- * This class is not intended to be subclassed outside the viewer framework. It
- * is designed to be instantiated with a pre-existing SWT table control and
- * configured with a domain-specific content provider, table label provider,
- * element filter (optional), and element sorter (optional).
- * </p>
- * <p>
- * Label providers for table viewers must implement either the
- * <code>ITableLabelProvider</code> or the <code>ILabelProvider</code> interface
- * (see <code>TableViewer.setLabelProvider</code> for more details).
- * </p>
- * <p>
- * As of 3.1 the TableViewer now supports the SWT.VIRTUAL flag. If the
- * underlying table is SWT.VIRTUAL, the content provider may implement {@link
- * ILazyContentProvider} instead of {@link IStructuredContentProvider} . Note
- * that in this case, the viewer does not support sorting or filtering. Also
- * note that in this case, the Widget based APIs may return null if the element
- * is not specified or not created yet.
- * </p>
- * <p>
- * Users of SWT.VIRTUAL should also avoid using getItems() from the Table within
- * the TreeViewer as this does not necessarily generate a callback for the
- * TreeViewer to populate the items. It also has the side effect of creating all
- * of the items thereby eliminating the performance improvements of SWT.VIRTUAL.
- * </p>
- * <p>
- * Users setting up an editable table with more than 1 column <b>have</b> to pass the
- * SWT.FULL_SELECTION style bit
- * </p>
- * 
- * @see SWT#VIRTUAL
- * @see #doFindItem(Object)
- * @see #internalRefresh(Object, boolean)
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class TableViewer extends AbstractTableViewer {
-	/**
-	 * This viewer's table control.
-	 */
-	private Table table;
-
-	/**
-	 * The cached row which is reused all over
-	 */
-	private TableViewerRow cachedRow;
-
-	/**
-	 * Creates a table viewer on a newly-created table control under the given
-	 * parent. The table control is created using the SWT style bits
-	 * <code>MULTI, H_SCROLL, V_SCROLL,</code> and <code>BORDER</code>. The
-	 * viewer has no input, no content provider, a default label provider, no
-	 * sorter, and no filters. The table has no columns.
-	 * 
-	 * @param parent
-	 * 		the parent control
-	 */
-	public TableViewer(Composite parent) {
-		this(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-	}
-
-	/**
-	 * Creates a table viewer on a newly-created table control under the given
-	 * parent. The table control is created using the given style bits. The
-	 * viewer has no input, no content provider, a default label provider, no
-	 * sorter, and no filters. The table has no columns.
-	 * 
-	 * @param parent
-	 * 		the parent control
-	 * @param style
-	 * 		SWT style bits
-	 */
-	public TableViewer(Composite parent, int style) {
-		this(new Table(parent, style));
-	}
-
-	/**
-	 * Creates a table viewer on the given table control. The viewer has no
-	 * input, no content provider, a default label provider, no sorter, and no
-	 * filters.
-	 * 
-	 * @param table
-	 * 		the table control
-	 */
-	public TableViewer(Table table) {
-		this.table = table;
-		hookControl(table);
-	}
-
-	public Control getControl() {
-		return table;
-	}
-
-	/**
-	 * Returns this table viewer's table control.
-	 * 
-	 * @return the table control
-	 */
-	public Table getTable() {
-		return table;
-	}
-
-	protected ColumnViewerEditor createViewerEditor() {
-		return new TableViewerEditor(this, null,
-				new ColumnViewerEditorActivationStrategy(this),
-				ColumnViewerEditor.DEFAULT);
-	}
-
-	/**
-	 * <p>
-	 * Sets a new selection for this viewer and optionally makes it visible. The
-	 * TableViewer implementation of this method is inefficient for the
-	 * ILazyContentProvider as lookup is done by indices rather than elements
-	 * and may require population of the entire table in worse case.
-	 * </p>
-	 * <p>
-	 * Use Table#setSelection(int[] indices) and Table#showSelection() if you
-	 * wish to set selection more efficiently when using a ILazyContentProvider.
-	 * </p>
-	 * 
-	 * @param selection
-	 * 		the new selection
-	 * @param reveal
-	 * 		<code>true</code> if the selection is to be made visible, and
-	 * 		<code>false</code> otherwise
-	 * @see Table#setSelection(int[])
-	 * @see Table#showSelection()
-	 */
-	public void setSelection(ISelection selection, boolean reveal) {
-		super.setSelection(selection, reveal);
-	}
-
-	protected ViewerRow getViewerRowFromItem(Widget item) {
-		if (cachedRow == null) {
-			cachedRow = new TableViewerRow((TableItem) item);
-		} else {
-			cachedRow.setItem((TableItem) item);
-		}
-
-		return cachedRow;
-	}
-
-	/**
-	 * Create a new row with style at index
-	 * 
-	 * @param style
-	 * @param rowIndex
-	 * @return ViewerRow
-	 * @since 3.3
-	 */
-	protected ViewerRow internalCreateNewRowPart(int style, int rowIndex) {
-		TableItem item;
-
-		if (rowIndex >= 0) {
-			item = new TableItem(table, style, rowIndex);
-		} else {
-			item = new TableItem(table, style);
-		}
-
-		return getViewerRowFromItem(item);
-	}
-
-	protected Item getItemAt(Point p) {
-		TableItem[] selection = table.getSelection();
-
-		if (selection.length == 1) {
-			int columnCount = table.getColumnCount();
-
-			for (int i = 0; i < columnCount; i++) {
-				if (selection[0].getBounds(i).contains(p)) {
-					return selection[0];
-				}
-			}
-		}
-
-		return table.getItem(p);
-	}
-
-	// Methods to provide widget independency
-
-	protected int doGetItemCount() {
-		return table.getItemCount();
-	}
-
-	protected int doIndexOf(Item item) {
-		return table.indexOf((TableItem) item);
-	}
-
-	protected void doSetItemCount(int count) {
-		table.setItemCount(count);
-	}
-
-	protected Item[] doGetItems() {
-		return table.getItems();
-	}
-
-	protected int doGetColumnCount() {
-		return table.getColumnCount();
-	}
-
-	protected Widget doGetColumn(int index) {
-		return table.getColumn(index);
-	}
-
-	protected Item doGetItem(int index) {
-		return table.getItem(index);
-	}
-
-	protected Item[] doGetSelection() {
-		return table.getSelection();
-	}
-
-	protected int[] doGetSelectionIndices() {
-		return table.getSelectionIndices();
-	}
-
-	protected void doClearAll() {
-		table.clearAll();
-	}
-
-	protected void doResetItem(Item item) {
-		TableItem tableItem = (TableItem) item;
-		int columnCount = Math.max(1, table.getColumnCount());
-		for (int i = 0; i < columnCount; i++) {
-			tableItem.setText(i, ""); //$NON-NLS-1$
-			if (tableItem.getImage(i) != null) {
-				tableItem.setImage(i, null);
-			}
-		}
-	}
-
-	protected void doRemove(int start, int end) {
-		table.remove(start, end);
-	}
-
-	protected void doRemoveAll() {
-		table.removeAll();
-	}
-
-	protected void doRemove(int[] indices) {
-		table.remove(indices);
-	}
-
-	protected void doShowItem(Item item) {
-		table.showItem((TableItem) item);
-	}
-
-	protected void doDeselectAll() {
-		table.deselectAll();
-	}
-
-	protected void doSetSelection(Item[] items) {
-		Assert.isNotNull(items, "Items-Array can not be null"); //$NON-NLS-1$
-
-		TableItem[] t = new TableItem[items.length];
-		System.arraycopy(items, 0, t, 0, t.length);
-
-		table.setSelection(t);
-	}
-
-	protected void doShowSelection() {
-		table.showSelection();
-	}
-
-	protected void doSetSelection(int[] indices) {
-		table.setSelection(indices);
-	}
-
-	protected void doClear(int index) {
-		table.clear(index);
-	}
-
-	protected void doSelect(int[] indices) {
-		table.select(indices);
-	}
-
-	/**
-	 * Refreshes this viewer starting with the given element. Labels are updated
-	 * as described in <code>refresh(boolean updateLabels)</code>. The methods
-	 * attempts to preserve the selection.
-	 * <p>
-	 * Unlike the <code>update</code> methods, this handles structural changes
-	 * to the given element (e.g. addition or removal of children). If only the
-	 * given element needs updating, it is more efficient to use the
-	 * <code>update</code> methods.
-	 * </p>
-	 * 
-	 * <p>
-	 * Subclasses who can provide this feature can open this method for the
-	 * public
-	 * </p>
-	 * 
-	 * @param element
-	 * 		the element
-	 * @param updateLabels
-	 * 		<code>true</code> to update labels for existing elements,
-	 * 		<code>false</code> to only update labels as needed, assuming that labels
-	 * 		for existing elements are unchanged.
-	 * @param reveal
-	 * 		<code>true</code> to make the preserved selection visible afterwards
-	 * 
-	 * @since 3.3
-	 */
-	public void refresh(final Object element, final boolean updateLabels,
-			boolean reveal) {
-		if (checkBusy())
-			return;
-
-		if (isCellEditorActive()) {
-			cancelEditing();
-		}
-
-		preservingSelection(new Runnable() {
-			public void run() {
-				internalRefresh(element, updateLabels);
-			}
-		}, reveal);
-	}
-
-	/**
-	 * Refreshes this viewer with information freshly obtained from this
-	 * viewer's model. If <code>updateLabels</code> is <code>true</code> then
-	 * labels for otherwise unaffected elements are updated as well. Otherwise,
-	 * it assumes labels for existing elements are unchanged, and labels are
-	 * only obtained as needed (for example, for new elements).
-	 * <p>
-	 * Calling <code>refresh(true)</code> has the same effect as
-	 * <code>refresh()</code>.
-	 * <p>
-	 * Note that the implementation may still obtain labels for existing
-	 * elements even if <code>updateLabels</code> is false. The intent is simply
-	 * to allow optimization where possible.
-	 * 
-	 * @param updateLabels
-	 * 		<code>true</code> to update labels for existing elements,
-	 * 		<code>false</code> to only update labels as needed, assuming that labels
-	 * 		for existing elements are unchanged.
-	 * @param reveal
-	 * 		<code>true</code> to make the preserved selection visible afterwards
-	 * 
-	 * @since 3.3
-	 */
-	public void refresh(boolean updateLabels, boolean reveal) {
-		refresh(getRoot(), updateLabels, reveal);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.AbstractTableViewer#remove(java.lang.Object[])
-	 */
-	public void remove(Object[] elements) {
-		assertElementsNotNull(elements);
-		if (checkBusy())
-			return;
-		if (elements.length == 0) {
-			return;
-		}
-		// deselect any items that are being removed, see bug 97786
-		Object elementToBeRemoved = null;
-		CustomHashtable elementsToBeRemoved = null;
-		if (elements.length == 1) {
-			elementToBeRemoved = elements[0];
-		} else {
-			elementsToBeRemoved = new CustomHashtable(getComparer());
-			for (int i = 0; i < elements.length; i++) {
-				Object element = elements[i];
-				elementsToBeRemoved.put(element, element);
-			}
-		}
-		int[] selectionIndices = doGetSelectionIndices();
-		for (int i = 0; i < selectionIndices.length; i++) {
-			int index = selectionIndices[i];
-			Item item = doGetItem(index);
-			Object data = item.getData();
-			if (data != null) {
-				if ((elementsToBeRemoved != null && elementsToBeRemoved
-						.containsKey(data))
-						|| equals(elementToBeRemoved, data)) {
-					table.deselect(index);
-				}
-			}
-		}
-		super.remove(elements);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewerColumn.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewerColumn.java
deleted file mode 100644
index 814634c..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewerColumn.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *     Boris Bokowski (IBM Corporation) - Javadoc improvements
- ******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * ViewerColumn implementation for TableViewer to enable column-specific label
- * providers and editing support.
- * 
- * @since 3.3
- */
-public final class TableViewerColumn extends ViewerColumn {
-	private TableColumn column;
-
-	/**
-	 * Creates a new viewer column for the given {@link TableViewer} on a new
-	 * {@link TableColumn} with the given style bits. The column is added at the
-	 * end of the list of columns.
-	 * 
-	 * @param viewer
-	 *            the table viewer to which this column belongs
-	 * @param style
-	 *            the style used to create the column, for applicable style bits
-	 *            see {@link TableColumn}
-	 * @see TableColumn#TableColumn(Table, int)
-	 */
-	public TableViewerColumn(TableViewer viewer, int style) {
-		this(viewer, style, -1);
-	}
-
-	/**
-	 * Creates a new viewer column for the given {@link TableViewer} on a new
-	 * {@link TableColumn} with the given style bits. The column is inserted at
-	 * the given index into the list of columns.
-	 * 
-	 * @param viewer
-	 *            the table viewer to which this column belongs
-	 * @param style
-	 *            the style used to create the column, for applicable style bits
-	 *            see {@link TableColumn}
-	 * @param index
-	 *            the index at which to place the newly created column
-	 * @see TableColumn#TableColumn(Table, int, int)
-	 */
-	public TableViewerColumn(TableViewer viewer, int style, int index) {
-		this(viewer, createColumn(viewer.getTable(), style, index));
-	}
-
-	/**
-	 * Creates a new viewer column for the given {@link TableViewer} on the given
-	 * {@link TableColumn}.
-	 * 
-	 * @param viewer
-	 *            the table viewer to which this column belongs
-	 * @param column
-	 *            the underlying table column
-	 */
-	public TableViewerColumn(TableViewer viewer, TableColumn column) {
-		super(viewer, column);
-		this.column = column;
-	}
-	
-	private static TableColumn createColumn(Table table, int style, int index) {
-		if (index >= 0) {
-			return new TableColumn(table, style, index);
-		}
-
-		return new TableColumn(table, style);
-	}
-
-	/**
-	 * @return the underlying SWT table column
-	 */
-	public TableColumn getColumn() {
-		return column;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewerEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewerEditor.java
deleted file mode 100644
index f0a9683..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewerEditor.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *                                                 fixes in bug 198665, 200731
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.CellEditor.LayoutData;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TableEditor;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * This is an editor-implementation for {@link Table}
- *
- * @since 3.3
- *
- */
-public final class TableViewerEditor extends ColumnViewerEditor {
-	/**
-	 * This viewer's table editor.
-	 */
-	private TableEditor tableEditor;
-
-	private SWTFocusCellManager focusCellManager;
-
-	/**
-	 * @param viewer
-	 *            the viewer the editor is attached to
-	 * @param focusCellManager
-	 *            the cell focus manager if one used or <code>null</code>
-	 * @param editorActivationStrategy
-	 *            the strategy used to decide about the editor activation
-	 * @param feature
-	 *            the feature mask
-	 */
-	TableViewerEditor(TableViewer viewer, SWTFocusCellManager focusCellManager,
-			ColumnViewerEditorActivationStrategy editorActivationStrategy,
-			int feature) {
-		super(viewer, editorActivationStrategy, feature);
-		tableEditor = new TableEditor(viewer.getTable());
-		this.focusCellManager = focusCellManager;
-	}
-
-	/**
-	 * Create a customized editor with focusable cells
-	 *
-	 * @param viewer
-	 *            the viewer the editor is created for
-	 * @param focusCellManager
-	 *            the cell focus manager if one needed else <code>null</code>
-	 * @param editorActivationStrategy
-	 *            activation strategy to control if an editor activated
-	 * @param feature
-	 *            bit mask controlling the editor
-	 *            <ul>
-	 *            <li>{@link ColumnViewerEditor#DEFAULT}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_CYCLE_IN_ROW}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_HORIZONTAL}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_MOVE_TO_ROW_NEIGHBOR}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_VERTICAL}</li>
-	 *            </ul>
-	 * @see #create(TableViewer, ColumnViewerEditorActivationStrategy, int)
-	 */
-	public static void create(TableViewer viewer,
-			SWTFocusCellManager focusCellManager,
-			ColumnViewerEditorActivationStrategy editorActivationStrategy,
-			int feature) {
-		TableViewerEditor editor = new TableViewerEditor(viewer,
-				focusCellManager, editorActivationStrategy, feature);
-		viewer.setColumnViewerEditor(editor);
-		if (focusCellManager != null) {
-			focusCellManager.init();
-		}
-	}
-
-	/**
-	 * Create a customized editor whose activation process is customized
-	 *
-	 * @param viewer
-	 *            the viewer the editor is created for
-	 * @param editorActivationStrategy
-	 *            activation strategy to control if an editor activated
-	 * @param feature
-	 *            bit mask controlling the editor
-	 *            <ul>
-	 *            <li>{@link ColumnViewerEditor#DEFAULT}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_CYCLE_IN_ROW}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_HORIZONTAL}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_MOVE_TO_ROW_NEIGHBOR}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_VERTICAL}</li>
-	 *            </ul>
-	 */
-	public static void create(TableViewer viewer,
-			ColumnViewerEditorActivationStrategy editorActivationStrategy,
-			int feature) {
-		create(viewer, null, editorActivationStrategy, feature);
-	}
-
-	protected void setEditor(Control w, Item item, int columnNumber) {
-		tableEditor.setEditor(w, (TableItem) item, columnNumber);
-	}
-
-	protected void setLayoutData(LayoutData layoutData) {
-		tableEditor.grabHorizontal = layoutData.grabHorizontal;
-		tableEditor.horizontalAlignment = layoutData.horizontalAlignment;
-		tableEditor.minimumWidth = layoutData.minimumWidth;
-		tableEditor.verticalAlignment = layoutData.verticalAlignment;
-
-		if( layoutData.minimumHeight != SWT.DEFAULT ) {
-			tableEditor.minimumHeight = layoutData.minimumHeight;
-		}
-	}
-
-	public ViewerCell getFocusCell() {
-		if (focusCellManager != null) {
-			return focusCellManager.getFocusCell();
-		}
-
-		return super.getFocusCell();
-	}
-
-	protected void updateFocusCell(ViewerCell focusCell,
-			ColumnViewerEditorActivationEvent event) {
-		// Update the focus cell when we activated the editor with these 2
-		// events
-		if (event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC
-				|| event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL) {
-
-			List l = getViewer().getSelectionFromWidget();
-
-			if (focusCellManager != null) {
-				focusCellManager.setFocusCell(focusCell);
-			}
-
-			if (!l.contains(focusCell.getElement())) {
-				getViewer().setSelection(
-						new StructuredSelection(focusCell.getElement()),true);
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewerFocusCellManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewerFocusCellManager.java
deleted file mode 100644
index 6fcb340..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewerFocusCellManager.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *                                                 fix in bug: 210752
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.widgets.Table;
-
-/**
- * This class is responsible to provide the concept of cells for {@link Table}.
- * This concept is needed to provide features like editor activation with the
- * keyboard
- *
- * @since 3.3
- *
- */
-public class TableViewerFocusCellManager extends SWTFocusCellManager {
-	private static final CellNavigationStrategy TABLE_NAVIGATE = new CellNavigationStrategy();
-
-	/**
-	 * Create a new manager with a default navigation strategy:
-	 * <ul>
-	 * <li><code>SWT.ARROW_UP</code>: navigate to cell above</li>
-	 * <li><code>SWT.ARROW_DOWN</code>: navigate to cell below</li>
-	 * <li><code>SWT.ARROW_RIGHT</code>: navigate to next visible cell on
-	 * the right</li>
-	 * <li><code>SWT.ARROW_LEFT</code>: navigate to next visible cell on the
-	 * left</li>
-	 * </ul>
-	 *
-	 * @param viewer
-	 *            the viewer the manager is bound to
-	 * @param focusDrawingDelegate
-	 *            the delegate responsible to highlight selected cell
-	 */
-	public TableViewerFocusCellManager(TableViewer viewer,
-			FocusCellHighlighter focusDrawingDelegate) {
-		this(viewer, focusDrawingDelegate, TABLE_NAVIGATE);
-	}
-
-	/**
-	 * Create a new manager
-	 *
-	 * @param viewer
-	 *            the viewer the manager is bound to
-	 * @param focusDrawingDelegate
-	 *            the delegate responsible to highlight selected cell
-	 * @param navigationStrategy
-	 *            the strategy used to navigate the cells
-	 * @since 3.4
-	 */
-	public TableViewerFocusCellManager(TableViewer viewer,
-			FocusCellHighlighter focusDrawingDelegate,
-			CellNavigationStrategy navigationStrategy) {
-		super(viewer, focusDrawingDelegate, navigationStrategy);
-	}
-
-	ViewerCell getInitialFocusCell() {
-		Table table = (Table) getViewer().getControl();
-
-		if (! table.isDisposed() && table.getItemCount() > 0 && ! table.getItem(0).isDisposed()) {
-			return getViewer().getViewerRowFromItem(table.getItem(0))
-					.getCell(0);
-		}
-
-		return null;
-	}
-
-	public ViewerCell getFocusCell() {
-		ViewerCell cell = super.getFocusCell();
-		Table t = (Table) getViewer().getControl();
-
-		// It is possible that the selection has changed under the hood
-		if (cell != null) {
-			if (t.getSelection().length == 1
-					&& t.getSelection()[0] != cell.getItem()) {
-				setFocusCell(getViewer().getViewerRowFromItem(
-						t.getSelection()[0]).getCell(cell.getColumnIndex()));
-			}
-		}
-
-		return super.getFocusCell();
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewerRow.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewerRow.java
deleted file mode 100644
index 3c20a22..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewerRow.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *     											 - fix in bug: 174355,195908,198035,215069,227421
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * TableViewerRow is the Table specific implementation of ViewerRow
- * @since 3.3
- *
- */
-public class TableViewerRow extends ViewerRow {
-	private TableItem item;
-
-	/**
-	 * Create a new instance of the receiver from item.
-	 * @param item
-	 */
-	TableViewerRow(TableItem item) {
-		this.item = item;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#getBounds(int)
-	 */
-	public Rectangle getBounds(int columnIndex) {
-		return item.getBounds(columnIndex);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#getBounds()
-	 */
-	public Rectangle getBounds() {
-		return item.getBounds();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#getItem()
-	 */
-	public Widget getItem() {
-		return item;
-	}
-
-	void setItem(TableItem item) {
-		this.item = item;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#getColumnCount()
-	 */
-	public int getColumnCount() {
-		return item.getParent().getColumnCount();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#getBackground(int)
-	 */
-	public Color getBackground(int columnIndex) {
-		return item.getBackground(columnIndex);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#getFont(int)
-	 */
-	public Font getFont(int columnIndex) {
-		return item.getFont(columnIndex);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#getForeground(int)
-	 */
-	public Color getForeground(int columnIndex) {
-		return item.getForeground(columnIndex);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#getImage(int)
-	 */
-	public Image getImage(int columnIndex) {
-		return item.getImage(columnIndex);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#getText(int)
-	 */
-	public String getText(int columnIndex) {
-		return item.getText(columnIndex);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#setBackground(int, org.eclipse.swt.graphics.Color)
-	 */
-	public void setBackground(int columnIndex, Color color) {
-		item.setBackground(columnIndex, color);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#setFont(int, org.eclipse.swt.graphics.Font)
-	 */
-	public void setFont(int columnIndex, Font font) {
-		item.setFont(columnIndex, font);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#setForeground(int, org.eclipse.swt.graphics.Color)
-	 */
-	public void setForeground(int columnIndex, Color color) {
-		item.setForeground(columnIndex, color);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#setImage(int, org.eclipse.swt.graphics.Image)
-	 */
-	public void setImage(int columnIndex, Image image) {
-		Image oldImage = item.getImage(columnIndex);
-		if (oldImage != image) {
-			item.setImage(columnIndex,image);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#setText(int, java.lang.String)
-	 */
-	public void setText(int columnIndex, String text) {
-		item.setText(columnIndex, text == null ? "" : text); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#getControl()
-	 */
-	public Control getControl() {
-		return item.getParent();
-	}
-
-	public ViewerRow getNeighbor(int direction, boolean sameLevel) {
-		if( direction == ViewerRow.ABOVE ) {
-			return getRowAbove();
-		} else if( direction == ViewerRow.BELOW ) {
-			return getRowBelow();
-		} else {
-			throw new IllegalArgumentException("Illegal value of direction argument."); //$NON-NLS-1$
-		}
-	}
-
-
-	private ViewerRow getRowAbove() {
-		int index = item.getParent().indexOf(item) - 1;
-
-		if( index >= 0 ) {
-			return new TableViewerRow(item.getParent().getItem(index));
-		}
-
-		return null;
-	}
-
-	private ViewerRow getRowBelow() {
-		int index = item.getParent().indexOf(item) + 1;
-
-		if( index < item.getParent().getItemCount() ) {
-			TableItem tmp = item.getParent().getItem(index);
-			//TODO NULL can happen in case of VIRTUAL => How do we deal with that
-			if( tmp != null ) {
-				return new TableViewerRow(tmp);
-			}
-		}
-
-		return null;
-	}
-
-	public TreePath getTreePath() {
-		return new TreePath(new Object[] {item.getData()});
-	}
-
-	public Object clone() {
-		return new TableViewerRow(item);
-	}
-
-	public Object getElement() {
-		return item.getData();
-	}
-
-	public int getVisualIndex(int creationIndex) {
-		int[] order = item.getParent().getColumnOrder();
-
-		for (int i = 0; i < order.length; i++) {
-			if (order[i] == creationIndex) {
-				return i;
-			}
-		}
-
-		return super.getVisualIndex(creationIndex);
-	}
-
-	public int getCreationIndex(int visualIndex) {
-		if( item != null && ! item.isDisposed() && hasColumns() && isValidOrderIndex(visualIndex) ) {
-			return item.getParent().getColumnOrder()[visualIndex];
-		}
-		return super.getCreationIndex(visualIndex);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#getTextBounds(int)
-	 */
-	public Rectangle getTextBounds(int index) {
-		return item.getTextBounds(index);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#getImageBounds(int)
-	 */
-	public Rectangle getImageBounds(int index) {
-		return item.getImageBounds(index);
-	}
-
-	private boolean hasColumns() {
-		return this.item.getParent().getColumnCount() != 0;
-	}
-
-	private boolean isValidOrderIndex(int currentIndex) {
-		return currentIndex < this.item.getParent().getColumnOrder().length;
-	}
-	
-	int getWidth(int columnIndex) {
-		return item.getParent().getColumn(columnIndex).getWidth();
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TextCellEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TextCellEditor.java
deleted file mode 100644
index 152b52f..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TextCellEditor.java
+++ /dev/null
@@ -1,491 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.text.MessageFormat;	// Not using ICU to support standalone JFace scenario
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-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.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A cell editor that manages a text entry field.
- * The cell editor's value is the text string itself.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class TextCellEditor extends CellEditor {
-
-    /**
-     * The text control; initially <code>null</code>.
-     */
-    protected Text text;
-
-    private ModifyListener modifyListener;
-
-    /**
-     * State information for updating action enablement
-     */
-    private boolean isSelection = false;
-
-    private boolean isDeleteable = false;
-
-    private boolean isSelectable = false;
-
-    /**
-     * Default TextCellEditor style
-     * specify no borders on text widget as cell outline in table already
-     * provides the look of a border.
-     */
-    private static final int defaultStyle = SWT.SINGLE;
-
-    /**
-     * Creates a new text string cell editor with no control
-     * The cell editor value is the string itself, which is initially the empty
-     * string. Initially, the cell editor has no cell validator.
-     * 
-     * @since 2.1
-     */
-    public TextCellEditor() {
-        setStyle(defaultStyle);
-    }
-
-    /**
-     * Creates a new text string cell editor parented under the given control.
-     * The cell editor value is the string itself, which is initially the empty string. 
-     * Initially, the cell editor has no cell validator.
-     *
-     * @param parent the parent control
-     */
-    public TextCellEditor(Composite parent) {
-        this(parent, defaultStyle);
-    }
-
-    /**
-     * Creates a new text string cell editor parented under the given control.
-     * The cell editor value is the string itself, which is initially the empty string. 
-     * Initially, the cell editor has no cell validator.
-     *
-     * @param parent the parent control
-     * @param style the style bits
-     * @since 2.1
-     */
-    public TextCellEditor(Composite parent, int style) {
-        super(parent, style);
-    }
-
-    /**
-     * Checks to see if the "deletable" state (can delete/
-     * nothing to delete) has changed and if so fire an
-     * enablement changed notification.
-     */
-    private void checkDeleteable() {
-        boolean oldIsDeleteable = isDeleteable;
-        isDeleteable = isDeleteEnabled();
-        if (oldIsDeleteable != isDeleteable) {
-            fireEnablementChanged(DELETE);
-        }
-    }
-
-    /**
-     * Checks to see if the "selectable" state (can select)
-     * has changed and if so fire an enablement changed notification.
-     */
-    private void checkSelectable() {
-        boolean oldIsSelectable = isSelectable;
-        isSelectable = isSelectAllEnabled();
-        if (oldIsSelectable != isSelectable) {
-            fireEnablementChanged(SELECT_ALL);
-        }
-    }
-
-    /**
-     * Checks to see if the selection state (selection /
-     * no selection) has changed and if so fire an
-     * enablement changed notification.
-     */
-    private void checkSelection() {
-        boolean oldIsSelection = isSelection;
-        isSelection = text.getSelectionCount() > 0;
-        if (oldIsSelection != isSelection) {
-            fireEnablementChanged(COPY);
-            fireEnablementChanged(CUT);
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on CellEditor.
-     */
-    protected Control createControl(Composite parent) {
-        text = new Text(parent, getStyle());
-        text.addSelectionListener(new SelectionAdapter() {
-            public void widgetDefaultSelected(SelectionEvent e) {
-                handleDefaultSelection(e);
-            }
-        });
-        text.addKeyListener(new KeyAdapter() {
-            // hook key pressed - see PR 14201  
-            public void keyPressed(KeyEvent e) {
-                keyReleaseOccured(e);
-
-                // as a result of processing the above call, clients may have
-                // disposed this cell editor
-                if ((getControl() == null) || getControl().isDisposed()) {
-					return;
-				}
-                checkSelection(); // see explanation below
-                checkDeleteable();
-                checkSelectable();
-            }
-        });
-        text.addTraverseListener(new TraverseListener() {
-            public void keyTraversed(TraverseEvent e) {
-                if (e.detail == SWT.TRAVERSE_ESCAPE
-                        || e.detail == SWT.TRAVERSE_RETURN) {
-                    e.doit = false;
-                }
-            }
-        });
-        // We really want a selection listener but it is not supported so we
-        // use a key listener and a mouse listener to know when selection changes
-        // may have occurred
-        text.addMouseListener(new MouseAdapter() {
-            public void mouseUp(MouseEvent e) {
-                checkSelection();
-                checkDeleteable();
-                checkSelectable();
-            }
-        });
-        text.addFocusListener(new FocusAdapter() {
-            public void focusLost(FocusEvent e) {
-                TextCellEditor.this.focusLost();
-            }
-        });
-        text.setFont(parent.getFont());
-        text.setBackground(parent.getBackground());
-        text.setText("");//$NON-NLS-1$
-        text.addModifyListener(getModifyListener());
-        return text;
-    }
-
-    /**
-     * The <code>TextCellEditor</code> implementation of
-     * this <code>CellEditor</code> framework method returns
-     * the text string.
-     *
-     * @return the text string
-     */
-    protected Object doGetValue() {
-        return text.getText();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on CellEditor.
-     */
-    protected void doSetFocus() {
-        if (text != null) {
-            text.selectAll();
-            text.setFocus();
-            checkSelection();
-            checkDeleteable();
-            checkSelectable();
-        }
-    }
-
-    /**
-     * The <code>TextCellEditor</code> implementation of
-     * this <code>CellEditor</code> framework method accepts
-     * a text string (type <code>String</code>).
-     *
-     * @param value a text string (type <code>String</code>)
-     */
-    protected void doSetValue(Object value) {
-        Assert.isTrue(text != null && (value instanceof String));
-        text.removeModifyListener(getModifyListener());
-        text.setText((String) value);
-        text.addModifyListener(getModifyListener());
-    }
-
-    /**
-     * Processes a modify event that occurred in this text cell editor.
-     * This framework method performs validation and sets the error message
-     * accordingly, and then reports a change via <code>fireEditorValueChanged</code>.
-     * Subclasses should call this method at appropriate times. Subclasses
-     * may extend or reimplement.
-     *
-     * @param e the SWT modify event
-     */
-    protected void editOccured(ModifyEvent e) {
-        String value = text.getText();
-        if (value == null) {
-			value = "";//$NON-NLS-1$
-		}
-        Object typedValue = value;
-        boolean oldValidState = isValueValid();
-        boolean newValidState = isCorrect(typedValue);
-        if (typedValue == null && newValidState) {
-			Assert.isTrue(false,
-                    "Validator isn't limiting the cell editor's type range");//$NON-NLS-1$
-		}
-        if (!newValidState) {
-            // try to insert the current value into the error message.
-            setErrorMessage(MessageFormat.format(getErrorMessage(),
-                    new Object[] { value }));
-        }
-        valueChanged(oldValidState, newValidState);
-    }
-
-    /**
-     * Since a text editor field is scrollable we don't
-     * set a minimumSize.
-     */
-    public LayoutData getLayoutData() {
-        return new LayoutData();
-    }
-
-    /**
-     * Return the modify listener.
-     */
-    private ModifyListener getModifyListener() {
-        if (modifyListener == null) {
-            modifyListener = new ModifyListener() {
-                public void modifyText(ModifyEvent e) {
-                    editOccured(e);
-                }
-            };
-        }
-        return modifyListener;
-    }
-
-    /**
-     * Handles a default selection event from the text control by applying the editor
-     * value and deactivating this cell editor.
-     * 
-     * @param event the selection event
-     * 
-     * @since 3.0
-     */
-    protected void handleDefaultSelection(SelectionEvent event) {
-        // same with enter-key handling code in keyReleaseOccured(e);
-        fireApplyEditorValue();
-        deactivate();
-    }
-
-    /**
-     * The <code>TextCellEditor</code>  implementation of this 
-     * <code>CellEditor</code> method returns <code>true</code> if 
-     * the current selection is not empty.
-     */
-    public boolean isCopyEnabled() {
-        if (text == null || text.isDisposed()) {
-			return false;
-		}
-        return text.getSelectionCount() > 0;
-    }
-
-    /**
-     * The <code>TextCellEditor</code>  implementation of this 
-     * <code>CellEditor</code> method returns <code>true</code> if 
-     * the current selection is not empty.
-     */
-    public boolean isCutEnabled() {
-        if (text == null || text.isDisposed()) {
-			return false;
-		}
-        return text.getSelectionCount() > 0;
-    }
-
-    /**
-     * The <code>TextCellEditor</code>  implementation of this 
-     * <code>CellEditor</code> method returns <code>true</code>
-     * if there is a selection or if the caret is not positioned 
-     * at the end of the text.
-     */
-    public boolean isDeleteEnabled() {
-        if (text == null || text.isDisposed()) {
-			return false;
-		}
-        return text.getSelectionCount() > 0
-                || text.getCaretPosition() < text.getCharCount();
-    }
-
-    /**
-     * The <code>TextCellEditor</code>  implementation of this 
-     * <code>CellEditor</code> method always returns <code>true</code>.
-     */
-    public boolean isPasteEnabled() {
-        if (text == null || text.isDisposed()) {
-			return false;
-		}
-        return true;
-    }
-
-    /**
-     * Check if save all is enabled
-     * @return true if it is 
-     */
-    public boolean isSaveAllEnabled() {
-        if (text == null || text.isDisposed()) {
-			return false;
-		}
-        return true;
-    }
-
-    /**
-     * Returns <code>true</code> if this cell editor is
-     * able to perform the select all action.
-     * <p>
-     * This default implementation always returns 
-     * <code>false</code>.
-     * </p>
-     * <p>
-     * Subclasses may override
-     * </p>
-     * @return <code>true</code> if select all is possible,
-     *  <code>false</code> otherwise
-     */
-    public boolean isSelectAllEnabled() {
-        if (text == null || text.isDisposed()) {
-			return false;
-		}
-        return text.getCharCount() > 0;
-    }
-
-    /**
-     * Processes a key release event that occurred in this cell editor.
-     * <p>
-     * The <code>TextCellEditor</code> implementation of this framework method 
-     * ignores when the RETURN key is pressed since this is handled in 
-     * <code>handleDefaultSelection</code>.
-     * An exception is made for Ctrl+Enter for multi-line texts, since
-     * a default selection event is not sent in this case. 
-     * </p>
-     *
-     * @param keyEvent the key event
-     */
-    protected void keyReleaseOccured(KeyEvent keyEvent) {
-        if (keyEvent.character == '\r') { // Return key
-            // Enter is handled in handleDefaultSelection.
-            // Do not apply the editor value in response to an Enter key event
-            // since this can be received from the IME when the intent is -not-
-            // to apply the value.  
-            // See bug 39074 [CellEditors] [DBCS] canna input mode fires bogus event from Text Control
-            //
-            // An exception is made for Ctrl+Enter for multi-line texts, since
-            // a default selection event is not sent in this case. 
-            if (text != null && !text.isDisposed()
-                    && (text.getStyle() & SWT.MULTI) != 0) {
-                if ((keyEvent.stateMask & SWT.CTRL) != 0) {
-                    super.keyReleaseOccured(keyEvent);
-                }
-            }
-            return;
-        }
-        super.keyReleaseOccured(keyEvent);
-    }
-
-    /**
-     * The <code>TextCellEditor</code> implementation of this
-     * <code>CellEditor</code> method copies the
-     * current selection to the clipboard. 
-     */
-    public void performCopy() {
-        text.copy();
-    }
-
-    /**
-     * The <code>TextCellEditor</code> implementation of this
-     * <code>CellEditor</code> method cuts the
-     * current selection to the clipboard. 
-     */
-    public void performCut() {
-        text.cut();
-        checkSelection();
-        checkDeleteable();
-        checkSelectable();
-    }
-
-    /**
-     * The <code>TextCellEditor</code> implementation of this
-     * <code>CellEditor</code> method deletes the
-     * current selection or, if there is no selection,
-     * the character next character from the current position. 
-     */
-    public void performDelete() {
-        if (text.getSelectionCount() > 0) {
-			// remove the contents of the current selection
-            text.insert(""); //$NON-NLS-1$
-		} else {
-            // remove the next character
-            int pos = text.getCaretPosition();
-            if (pos < text.getCharCount()) {
-                text.setSelection(pos, pos + 1);
-                text.insert(""); //$NON-NLS-1$
-            }
-        }
-        checkSelection();
-        checkDeleteable();
-        checkSelectable();
-    }
-
-    /**
-     * The <code>TextCellEditor</code> implementation of this
-     * <code>CellEditor</code> method pastes the
-     * the clipboard contents over the current selection. 
-     */
-    public void performPaste() {
-        text.paste();
-        checkSelection();
-        checkDeleteable();
-        checkSelectable();
-    }
-
-    /**
-     * The <code>TextCellEditor</code> implementation of this
-     * <code>CellEditor</code> method selects all of the
-     * current text. 
-     */
-    public void performSelectAll() {
-        text.selectAll();
-        checkSelection();
-        checkDeleteable();
-    }
-
-    /**
-	 * This implementation of
-	 * {@link CellEditor#dependsOnExternalFocusListener()} returns false if the
-	 * current instance's class is TextCellEditor, and true otherwise.
-	 * Subclasses that hook their own focus listener should override this method
-	 * and return false. See also bug 58777.
-	 * 
-	 * @since 3.4
-	 */
-	protected boolean dependsOnExternalFocusListener() {
-		return getClass() != TextCellEditor.class;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeColumnViewerLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeColumnViewerLabelProvider.java
deleted file mode 100644
index a894fd6..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeColumnViewerLabelProvider.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-/**
- * TreeViewerLabelProvider is the ViewerLabelProvider that handles TreePaths.
- * 
- * @since 3.3
- * 
- */
-public class TreeColumnViewerLabelProvider extends
-		TableColumnViewerLabelProvider {
-	private ITreePathLabelProvider treePathProvider = new ITreePathLabelProvider() {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreePathLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel,
-		 *      org.eclipse.jface.viewers.TreePath)
-		 */
-		public void updateLabel(ViewerLabel label, TreePath elementPath) {
-			// Do nothing by default
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-		 */
-		public void dispose() {
-			// Do nothing by default
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-		 */
-		public void addListener(ILabelProviderListener listener) {
-			// Do nothing by default
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-		 */
-		public void removeListener(ILabelProviderListener listener) {
-			// Do nothing by default
-
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-		 */
-		public boolean isLabelProperty(Object element, String property) {
-			return false;
-		}
-
-	};
-
-	/**
-	 * Create a new instance of the receiver with the supplied labelProvider.
-	 * 
-	 * @param labelProvider
-	 */
-	public TreeColumnViewerLabelProvider(IBaseLabelProvider labelProvider) {
-		super(labelProvider);
-	}
-
-	/**
-	 * Update the label for the element with TreePath.
-	 * 
-	 * @param label
-	 * @param elementPath
-	 */
-	public void updateLabel(ViewerLabel label, TreePath elementPath) {
-		treePathProvider.updateLabel(label, elementPath);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ViewerLabelProvider#setProviders(java.lang.Object)
-	 */
-	public void setProviders(Object provider) {
-		super.setProviders(provider);
-		if (provider instanceof ITreePathLabelProvider)
-			treePathProvider = (ITreePathLabelProvider) provider;
-	}
-
-	/**
-	 * Return the ITreePathLabelProvider for the receiver.
-	 * 
-	 * @return Returns the treePathProvider.
-	 */
-	public ITreePathLabelProvider getTreePathProvider() {
-		return treePathProvider;
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeExpansionEvent.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeExpansionEvent.java
deleted file mode 100644
index 0726ec6..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeExpansionEvent.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.EventObject;
-
-/**
- * Event object describing a tree node being expanded
- * or collapsed. The source of these events is the tree viewer.
- *
- * @see ITreeViewerListener
- */
-public class TreeExpansionEvent extends EventObject {
-
-    /**
-     * Generated serial version UID for this class.
-     * @since 3.1
-     */
-    private static final long serialVersionUID = 3618414930227835185L;
-    
-    /**
-     * The element that was expanded or collapsed.
-     */
-    private Object element;
-
-    /**
-     * Creates a new event for the given source and element.
-     *
-     * @param source the tree viewer
-     * @param element the element
-     */
-    public TreeExpansionEvent(AbstractTreeViewer source, Object element) {
-        super(source);
-        this.element = element;
-    }
-
-    /**
-     * Returns the element that got expanded or collapsed.
-     *
-     * @return the element
-     */
-    public Object getElement() {
-        return element;
-    }
-
-    /**
-     * Returns the originator of the event.
-     *
-     * @return the originating tree viewer
-     */
-    public AbstractTreeViewer getTreeViewer() {
-        return (AbstractTreeViewer) source;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeNode.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeNode.java
deleted file mode 100644
index 01def33..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeNode.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.jface.util.Util;
-
-/**
- * A simple data structure that is useful for implemented tree models. This can
- * be returned by
- * {@link org.eclipse.jface.viewers.IStructuredContentProvider#getElements(Object)}.
- * It allows simple delegation of methods from
- * {@link org.eclipse.jface.viewers.ITreeContentProvider} such as
- * {@link org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object)},
- * {@link org.eclipse.jface.viewers.ITreeContentProvider#getParent(Object)} and
- * {@link org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(Object)}
- * 
- * @since 3.2
- */
-public class TreeNode {
-
-	/**
-	 * The array of child tree nodes for this tree node. If there are no
-	 * children, then this value may either by an empty array or
-	 * <code>null</code>. There should be no <code>null</code> children in
-	 * the array.
-	 */
-	private TreeNode[] children;
-
-	/**
-	 * The parent tree node for this tree node. This value may be
-	 * <code>null</code> if there is no parent.
-	 */
-	private TreeNode parent;
-
-	/**
-	 * The value contained in this node. This value may be anything.
-	 */
-	protected Object value;
-
-	/**
-	 * Constructs a new instance of <code>TreeNode</code>.
-	 * 
-	 * @param value
-	 *            The value held by this node; may be anything.
-	 */
-	public TreeNode(final Object value) {
-		this.value = value;
-	}
-	
-	public boolean equals(final Object object) {
-		if (object instanceof TreeNode) {
-			return Util.equals(this.value, ((TreeNode) object).value);
-		}
-
-		return false;
-	}
-
-	/**
-	 * Returns the child nodes. Empty arrays are converted to <code>null</code>
-	 * before being returned.
-	 * 
-	 * @return The child nodes; may be <code>null</code>, but never empty.
-	 *         There should be no <code>null</code> children in the array.
-	 */
-	public TreeNode[] getChildren() {
-		if (children != null && children.length == 0) {
-			return null;
-		}
-		return children;
-	}
-
-	/**
-	 * Returns the parent node.
-	 * 
-	 * @return The parent node; may be <code>null</code> if there are no
-	 *         parent nodes.
-	 */
-	public TreeNode getParent() {
-		return parent;
-	}
-
-	/**
-	 * Returns the value held by this node.
-	 * 
-	 * @return The value; may be anything.
-	 */
-	public Object getValue() {
-		return value;
-	}
-
-	/**
-	 * Returns whether the tree has any children.
-	 * 
-	 * @return <code>true</code> if its array of children is not
-	 *         <code>null</code> and is non-empty; <code>false</code>
-	 *         otherwise.
-	 */
-	public boolean hasChildren() {
-		return children != null && children.length > 0;
-	}
-	
-	public int hashCode() {
-		return Util.hashCode(value);
-	}
-
-	/**
-	 * Sets the children for this node.
-	 * 
-	 * @param children
-	 *            The child nodes; may be <code>null</code> or empty. There
-	 *            should be no <code>null</code> children in the array.
-	 */
-	public void setChildren(final TreeNode[] children) {
-		this.children = children;
-	}
-
-	/**
-	 * Sets the parent for this node.
-	 * 
-	 * @param parent
-	 *            The parent node; may be <code>null</code>.
-	 */
-	public void setParent(final TreeNode parent) {
-		this.parent = parent;
-	}
-}
-
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeNodeContentProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeNodeContentProvider.java
deleted file mode 100644
index 9fa1ebc..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeNodeContentProvider.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-/**
- * <p>
- * A content provider that expects every element to be a <code>TreeNode</code>.
- * Most methods delegate to <code>TreeNode</code>. <code>dispose()</code>
- * and <code>inputChanged(Viewer, Object, Object)</code> do nothing by
- * default.
- * </p>
- * <p>
- * This class and all of its methods may be overridden or extended.
- * </p>
- * 
- * @since 3.2
- * @see org.eclipse.jface.viewers.TreeNode
- */
-public class TreeNodeContentProvider implements ITreeContentProvider {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-		// Do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(final Object parentElement) {
-		final TreeNode node = (TreeNode) parentElement;
-		return node.getChildren();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(final Object inputElement) {
-		if (inputElement instanceof TreeNode[]) {
-			return (TreeNode[]) inputElement;
-		}
-		return new Object[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-	 */
-	public Object getParent(final Object element) {
-		final TreeNode node = (TreeNode) element;
-		return node.getParent();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(final Object element) {
-		final TreeNode node = (TreeNode) element;
-		return node.hasChildren();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(final Viewer viewer, final Object oldInput,
-			final Object newInput) {
-		// Do nothing
-	}
-}
-
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreePath.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreePath.java
deleted file mode 100644
index c153b23..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreePath.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * A tree path denotes a model element in a tree viewer. Tree path objects have
- * value semantics. A model element is represented by a path of elements in the
- * tree from the root element to the leaf element.
- * <p>
- * Clients may instantiate this class. Not intended to be subclassed.
- * </p>
- * 
- * @since 3.2
- */
-public final class TreePath {
-	
-	/**
-	 * Constant for representing an empty tree path.
-	 */
-	public static final TreePath EMPTY = new TreePath(new Object[0]);
-	
-	private Object[] segments;
-
-	private int hash;
-
-	/**
-	 * Constructs a path identifying a leaf node in a tree.
-	 * 
-	 * @param segments
-	 *            path of elements to a leaf node in a tree, starting with the
-	 *            root element
-	 */
-	public TreePath(Object[] segments) {
-		Assert.isNotNull(segments);
-		for (int i = 0; i < segments.length; i++) {
-			Assert.isNotNull(segments[i]);
-		}
-		this.segments = segments;
-	}
-
-	/**
-	 * Returns the element at the specified index in this path.
-	 * 
-	 * @param index
-	 *            index of element to return
-	 * @return element at the specified index
-	 */
-	public Object getSegment(int index) {
-		return segments[index];
-	}
-
-	/**
-	 * Returns the number of elements in this path.
-	 * 
-	 * @return the number of elements in this path
-	 */
-	public int getSegmentCount() {
-		return segments.length;
-	}
-
-	/**
-	 * Returns the first element in this path, or <code>null</code> if this
-	 * path has no segments.
-	 * 
-	 * @return the first element in this path
-	 */
-	public Object getFirstSegment() {
-		if (segments.length == 0) {
-			return null;
-		}
-		return segments[0];
-	}
-
-	/**
-	 * Returns the last element in this path, or <code>null</code> if this
-	 * path has no segments.
-	 * 
-	 * @return the last element in this path
-	 */
-	public Object getLastSegment() {
-		if (segments.length == 0) {
-			return null;
-		}
-		return segments[segments.length - 1];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object other) {
-		if (!(other instanceof TreePath)) {
-			return false;
-		}
-		return equals((TreePath) other, null);
-	}
-
-	/**
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		if (hash == 0) {
-			hash = hashCode(null);
-		}
-		return hash;
-	}
-
-	/**
-	 * Returns a hash code computed from the hash codes of the segments, using
-	 * the given comparer to compute the hash codes of the segments.
-	 * 
-	 * @param comparer
-	 *            comparer to use or <code>null</code> if the segments' hash
-	 *            codes should be computed by calling their hashCode() methods.
-	 * @return the computed hash code
-	 */
-	public int hashCode(IElementComparer comparer) {
-		int result = 0;
-		for (int i = 0; i < segments.length; i++) {
-			if (comparer == null) {
-				result += segments[i].hashCode();
-			} else {
-				result += comparer.hashCode(segments[i]);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns whether this path is equivalent to the given path using the
-	 * specified comparer to compare individual elements.
-	 * 
-	 * @param otherPath
-	 *            tree path to compare to
-	 * @param comparer
-	 *            comparator to use or <code>null</code> if segments should be
-	 *            compared using equals()
-	 * @return whether the paths are equal
-	 */
-	public boolean equals(TreePath otherPath, IElementComparer comparer) {
-		if (otherPath == null) {
-			return false;
-		}
-		if (segments.length != otherPath.segments.length) {
-			return false;
-		}
-		for (int i = 0; i < segments.length; i++) {
-			if (comparer == null) {
-				if (!segments[i].equals(otherPath.segments[i])) {
-					return false;
-				}
-			} else {
-				if (!comparer.equals(segments[i], otherPath.segments[i])) {
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Returns whether this path starts with the same segments as the given
-	 * path, using the given comparer to compare segments.
-	 * 
-	 * @param treePath
-	 *            path to compare to
-	 * @param comparer
-	 *            the comparer to use, or <code>null</code> if equals() should
-	 *            be used to compare segments
-	 * @return whether the given path is a prefix of this path, or the same as
-	 *         this path
-	 */
-	public boolean startsWith(TreePath treePath, IElementComparer comparer) {
-		int thisSegmentCount = getSegmentCount();
-		int otherSegmentCount = treePath.getSegmentCount();
-		if (otherSegmentCount == thisSegmentCount) {
-			return equals(treePath, comparer);
-		}
-		if (otherSegmentCount > thisSegmentCount) {
-			return false;
-		}
-		for (int i = 0; i < otherSegmentCount; i++) {
-			Object otherSegment = treePath.getSegment(i);
-			if (comparer == null) {
-				if (!otherSegment.equals(segments[i])) {
-					return false;
-				}
-			} else {
-				if (!comparer.equals(otherSegment, segments[i])) {
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Returns a copy of this tree path with one segment removed from the end,
-	 * or <code>null</code> if this tree path has no segments.
-	 * @return a tree path
-	 */
-	public TreePath getParentPath() {
-		int segmentCount = getSegmentCount();
-		if (segmentCount < 1) {
-			return null;
-		} else if (segmentCount == 1) {
-			return EMPTY;
-		}
-		Object[] parentSegments = new Object[segmentCount - 1];
-		System.arraycopy(segments, 0, parentSegments, 0, segmentCount - 1);
-		return new TreePath(parentSegments);
-	}
-
-	/**
-	 * Returns a copy of this tree path with the given segment added at the end.
-	 * @param newSegment 
-	 * @return a tree path
-	 */
-	public TreePath createChildPath(Object newSegment) {
-		int segmentCount = getSegmentCount();
-		Object[] childSegments = new Object[segmentCount + 1];
-		if(segmentCount>0) {
-			System.arraycopy(segments, 0, childSegments, 0, segmentCount);
-		}
-		childSegments[segmentCount] = newSegment;
-		return new TreePath(childSegments);
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreePathViewerSorter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreePathViewerSorter.java
deleted file mode 100644
index a49f84d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreePathViewerSorter.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.Arrays;
-import java.util.Comparator;
-
-/**
- * A viewer sorter that is provided extra context in the form of the path of the
- * parent element of the elements being sorted.
- * 
- * @since 3.2
- */
-public class TreePathViewerSorter extends ViewerSorter {
-
-	/**
-	 * Provide a category for the given element that will have the given parent
-	 * path when it is added to the viewer. The provided path is
-	 * relative to the viewer input. The parent path will
-	 * be <code>null</code> when the elements are root elements.
-	 * <p>
-	 * By default, the this method calls
-	 * {@link ViewerSorter#category(Object)}. Subclasses may override.
-	 * 
-	 * @param parentPath
-	 *            the parent path for the element
-	 * @param element
-	 *            the element
-	 * @return the category of the element
-	 */
-	public int category(TreePath parentPath, Object element) {
-		return category(element);
-	}
-	
-	/**
-	 * Compare the given elements that will have the given parent
-	 * path when they are added to the viewer. The provided path is
-	 * relative to the viewer input. The parent path will
-	 * be <code>null</code> when the elements are root elements.
-	 * <p>
-	 * By default, the this method calls
-	 * {@link ViewerSorter#sort(Viewer, Object[])}. Subclasses may override.
-	 * @param viewer the viewer
-	 * @param parentPath the parent path for the two elements
-     * @param e1 the first element
-     * @param e2 the second element
-     * @return a negative number if the first element is less  than the 
-     *  second element; the value <code>0</code> if the first element is
-     *  equal to the second element; and a positive
-	 */
-	public int compare(Viewer viewer, TreePath parentPath, Object e1, Object e2) {
-		return compare(viewer, e1, e2);
-	}
-	
-	/**
-     * Returns whether this viewer sorter would be affected 
-     * by a change to the given property of the given element.
-     * The provided path is
-	 * relative to the viewer input. The parent path will
-	 * be <code>null</code> when the elements are root elements.
-     * <p>
-     * The default implementation of this method calls
-     * {@link ViewerSorter#isSorterProperty(Object, String)}.
-     * Subclasses may reimplement.
-	 * @param parentPath the parent path of the element
-     * @param element the element
-     * @param property the property
-     * @return <code>true</code> if the sorting would be affected,
-     *    and <code>false</code> if it would be unaffected
-	 */
-    public boolean isSorterProperty(TreePath parentPath, Object element, String property) {
-        return isSorterProperty(element, property);
-    }
-    
-    /**
-     * Sorts the given elements in-place, modifying the given array.
-     * The provided path is
-	 * relative to the viewer input. The parent path will
-	 * be <code>null</code> when the elements are root elements.
-     * <p>
-     * The default implementation of this method uses the 
-     * java.util.Arrays#sort algorithm on the given array, 
-     * calling {@link #compare(Viewer, TreePath, Object, Object)} to compare elements.
-     * </p>
-     * <p>
-     * Subclasses may reimplement this method to provide a more optimized implementation.
-     * </p>
-     *
-     * @param viewer the viewer
-     * @param parentPath the parent path of the given elements
-     * @param elements the elements to sort
-     */
-    public void sort(final Viewer viewer, final TreePath parentPath, Object[] elements) {
-        Arrays.sort(elements, new Comparator() {
-            public int compare(Object a, Object b) {
-                return TreePathViewerSorter.this.compare(viewer, parentPath, a, b);
-            }
-        });
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeSelection.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeSelection.java
deleted file mode 100644
index 26a162f..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeSelection.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * A concrete implementation of the <code>ITreeSelection</code> interface,
- * suitable for instantiating.
- * <p>
- * This class is not intended to be subclassed.
- * </p>
- * 
- * @since 3.2
- */
-public class TreeSelection extends StructuredSelection implements ITreeSelection {
-
-	/* Implementation note.  This class extends StructuredSelection because many pre-existing
-	 * JFace viewer clients assumed that the only implementation of IStructuredSelection 
-	 * was StructuredSelection.  By extending StructuredSelection rather than implementing
-	 * ITreeSelection directly, we avoid this problem.
-	 * For more details, see Bug 121939 [Viewers] TreeSelection should subclass StructuredSelection. 
-	 */
-	
-	private TreePath[] paths = null;
-	private CustomHashtable element2TreePaths = null;
-
-	/**
-	 * The canonical empty selection. This selection should be used instead of
-	 * <code>null</code>.
-	 */
-	public static final TreeSelection EMPTY = new TreeSelection();
-	
-	private static final TreePath[] EMPTY_TREE_PATHS= new TreePath[0];
-	
-	private static class InitializeData {
-		List selection;
-		TreePath[] paths;
-		CustomHashtable element2TreePaths;
-		
-		private InitializeData(TreePath[] paths, IElementComparer comparer) {
-			this.paths= new TreePath[paths.length];
-			System.arraycopy(paths, 0, this.paths, 0, paths.length);
-			element2TreePaths = new CustomHashtable(comparer);
-			int size = paths.length;
-			selection = new ArrayList(size);
-			for (int i = 0; i < size; i++) {
-				Object lastSegment= paths[i].getLastSegment();
-				Object mapped= element2TreePaths.get(lastSegment);
-				if (mapped == null) {
-					selection.add(lastSegment);
-					element2TreePaths.put(lastSegment, paths[i]);
-				} else if (mapped instanceof List) {
-					((List)mapped).add(paths[i]);
-				} else {
-					List newMapped= new ArrayList(2);
-					newMapped.add(mapped);
-					newMapped.add(paths[i]);
-					element2TreePaths.put(lastSegment, newMapped);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Constructs a selection based on the elements identified by the given tree
-	 * paths.
-	 * 
-	 * @param paths
-	 *            tree paths
-	 */
-	public TreeSelection(TreePath[] paths) {
-		this(new InitializeData(paths, null));
-	}
-
-	/**
-	 * Constructs a selection based on the elements identified by the given tree
-	 * paths.
-	 * 
-	 * @param paths
-	 *            tree paths
-	 * @param comparer 
-	 *            the comparer, or <code>null</code> if default equals is to be used
-	 */
-	public TreeSelection(TreePath[] paths, IElementComparer comparer) {
-		this(new InitializeData(paths, comparer));
-	}
-
-	/**
-	 * Constructs a selection based on the elements identified by the given tree
-	 * path.
-	 * 
-	 * @param treePath
-	 *            tree path, or <code>null</code> for an empty selection
-	 */
-	public TreeSelection(TreePath treePath) {
-		this(treePath != null ? new TreePath[] { treePath } : EMPTY_TREE_PATHS, null);
-	}
-
-	/**
-	 * Constructs a selection based on the elements identified by the given tree
-	 * path.
-	 * 
-	 * @param treePath
-	 *            tree path, or <code>null</code> for an empty selection
-	 * @param comparer 
-	 *            the comparer, or <code>null</code> if default equals is to be used
-	 */
-	public TreeSelection(TreePath treePath, IElementComparer comparer) {
-		this(treePath != null ? new TreePath[] { treePath } : EMPTY_TREE_PATHS, comparer);
-	}
-	
-	/**
-	 * Creates a new tree selection based on the initialization data.
-	 * 
-	 * @param data the data
-	 */
-	private TreeSelection(InitializeData data) {
-		super(data.selection);
-		paths= data.paths;
-		element2TreePaths= data.element2TreePaths;
-	}
-
-	/**
-	 * Creates a new empty selection. See also the static field
-	 * <code>EMPTY</code> which contains an empty selection singleton.
-	 * <p>
-	 * Note that TreeSelection.EMPTY is not equals() to StructuredViewer.EMPTY.
-	 * </p>
-	 * 
-	 * @see #EMPTY
-	 */
-	public TreeSelection() {
-		super();
-	}
-	
-	/**
-	 * Returns the element comparer passed in when the tree selection
-	 * has been created or <code>null</code> if no comparer has been
-	 * provided.
-	 * 
-	 * @return the element comparer or <code>null</code>
-	 * 
-	 * @since 3.2
-	 */
-	public IElementComparer getElementComparer() {
-		if (element2TreePaths == null)
-			return null;
-		return element2TreePaths.getComparer();
-	}
-	
-	public boolean equals(Object obj) {
-		if (!(obj instanceof TreeSelection)) {
-			// Fall back to super implementation, see bug 135837.
-			return super.equals(obj);
-		}
-		TreeSelection selection = (TreeSelection) obj;
-		int size = getPaths().length;
-		if (selection.getPaths().length == size) {
-			IElementComparer comparerOrNull = (getElementComparer() == selection
-					.getElementComparer()) ? getElementComparer() : null;
-			if (size > 0) {
-				for (int i = 0; i < paths.length; i++) {
-					if (!paths[i].equals(selection.paths[i], comparerOrNull)) {
-						return false;
-					}
-				}
-			}
-			return true;
-		}
-		return false;
-	}
-
-	public int hashCode() {
-		int code = getClass().hashCode();
-		if (paths != null) {
-			for (int i = 0; i < paths.length; i++) {
-				code = code * 17 + paths[i].hashCode(getElementComparer());
-			}
-		}
-		return code;
-	}
-
-	public TreePath[] getPaths() {
-		return paths==null ? EMPTY_TREE_PATHS : (TreePath[]) paths.clone();
-	}
-	
-	public TreePath[] getPathsFor(Object element) {
-		Object value= element2TreePaths==null ? null : element2TreePaths.get(element);
-		if (value == null) {
-			return EMPTY_TREE_PATHS;
-		} else if (value instanceof TreePath) {
-			return new TreePath[] { (TreePath)value };
-		} else if (value instanceof List) {
-			List l= (List)value;
-			return (TreePath[])l.toArray(new TreePath[l.size()]);
-		} else {
-			// should not happen:
-			Assert.isTrue(false, "Unhandled case"); //$NON-NLS-1$
-			return null;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewer.java
deleted file mode 100644
index a8f2a3c..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewer.java
+++ /dev/null
@@ -1,1132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - concept of ViewerRow,
- *                                                 refactoring (bug 153993), bug 167323, 191468, 205419
- *     Matthew Hall - bug 221988
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.jface.util.Policy;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.TreeEvent;
-import org.eclipse.swt.events.TreeListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * A concrete viewer based on an SWT <code>Tree</code> control.
- * <p>
- * This class is not intended to be subclassed outside the viewer framework. It
- * is designed to be instantiated with a pre-existing SWT tree control and
- * configured with a domain-specific content provider, label provider, element
- * filter (optional), and element sorter (optional).
- * </p>
- * <p>
- * Content providers for tree viewers must implement either the
- * {@link ITreeContentProvider} interface, (as of 3.2) the
- * {@link ILazyTreeContentProvider} interface, or (as of 3.3) the
- * {@link ILazyTreePathContentProvider}. If the content provider is an
- * <code>ILazyTreeContentProvider</code> or an
- * <code>ILazyTreePathContentProvider</code>, the underlying Tree must be
- * created using the {@link SWT#VIRTUAL} style bit, the tree viewer will not
- * support sorting or filtering, and hash lookup must be enabled by calling
- * {@link #setUseHashlookup(boolean)}.
- * </p>
- * <p>
- * Users setting up an editable tree with more than 1 column <b>have</b> to pass the
- * SWT.FULL_SELECTION style bit
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class TreeViewer extends AbstractTreeViewer {
-
-	private static final String VIRTUAL_DISPOSE_KEY = Policy.JFACE
-			+ ".DISPOSE_LISTENER"; //$NON-NLS-1$
-
-	/**
-	 * This viewer's control.
-	 */
-	private Tree tree;
-
-	/**
-	 * Flag for whether the tree has been disposed of.
-	 */
-	private boolean treeIsDisposed = false;
-
-	private boolean contentProviderIsLazy;
-
-	private boolean contentProviderIsTreeBased;
-
-	/**
-	 * The row object reused
-	 */
-	private TreeViewerRow cachedRow;
-
-	/**
-	 * true if we are inside a preservingSelection() call
-	 */
-	private boolean preservingSelection;
-
-	/**
-	 * Creates a tree viewer on a newly-created tree control under the given
-	 * parent. The tree control is created using the SWT style bits
-	 * <code>MULTI, H_SCROLL, V_SCROLL,</code> and <code>BORDER</code>. The
-	 * viewer has no input, no content provider, a default label provider, no
-	 * sorter, and no filters.
-	 *
-	 * @param parent
-	 *            the parent control
-	 */
-	public TreeViewer(Composite parent) {
-		this(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-	}
-
-	/**
-	 * Creates a tree viewer on a newly-created tree control under the given
-	 * parent. The tree control is created using the given SWT style bits. The
-	 * viewer has no input, no content provider, a default label provider, no
-	 * sorter, and no filters.
-	 *
-	 * @param parent
-	 *            the parent control
-	 * @param style
-	 *            the SWT style bits used to create the tree.
-	 */
-	public TreeViewer(Composite parent, int style) {
-		this(new Tree(parent, style));
-	}
-
-	/**
-	 * Creates a tree viewer on the given tree control. The viewer has no input,
-	 * no content provider, a default label provider, no sorter, and no filters.
-	 *
-	 * @param tree
-	 *            the tree control
-	 */
-	public TreeViewer(Tree tree) {
-		super();
-		this.tree = tree;
-		hookControl(tree);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected void addTreeListener(Control c, TreeListener listener) {
-		((Tree) c).addTreeListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ColumnViewer#getColumnViewerOwner(int)
-	 */
-	protected Widget getColumnViewerOwner(int columnIndex) {
-		if (columnIndex < 0 || ( columnIndex > 0 && columnIndex >= getTree().getColumnCount() ) ) {
-			return null;
-		}
-
-		if (getTree().getColumnCount() == 0)// Hang it off the table if it
-			return getTree();
-
-		return getTree().getColumn(columnIndex);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected Item[] getChildren(Widget o) {
-		if (o instanceof TreeItem) {
-			return ((TreeItem) o).getItems();
-		}
-		if (o instanceof Tree) {
-			return ((Tree) o).getItems();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in Viewer.
-	 */
-	public Control getControl() {
-		return tree;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected boolean getExpanded(Item item) {
-		return ((TreeItem) item).getExpanded();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ColumnViewer#getItemAt(org.eclipse.swt.graphics.Point)
-	 */
-	protected Item getItemAt(Point p) {
-		TreeItem[] selection = tree.getSelection();
-
-		if( selection.length == 1 ) {
-			int columnCount = tree.getColumnCount();
-
-			for( int i = 0; i < columnCount; i++ ) {
-				if( selection[0].getBounds(i).contains(p) ) {
-					return selection[0];
-				}
-			}
-		}
-
-		return getTree().getItem(p);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected int getItemCount(Control widget) {
-		return ((Tree) widget).getItemCount();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected int getItemCount(Item item) {
-		return ((TreeItem) item).getItemCount();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected Item[] getItems(Item item) {
-		return ((TreeItem) item).getItems();
-	}
-
-	/**
-	 * The tree viewer implementation of this <code>Viewer</code> framework
-	 * method ensures that the given label provider is an instance of either
-	 * <code>ITableLabelProvider</code> or <code>ILabelProvider</code>. If
-	 * it is an <code>ITableLabelProvider</code>, then it provides a separate
-	 * label text and image for each column. If it is an
-	 * <code>ILabelProvider</code>, then it provides only the label text and
-	 * image for the first column, and any remaining columns are blank.
-	 */
-	public IBaseLabelProvider getLabelProvider() {
-		return super.getLabelProvider();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected Item getParentItem(Item item) {
-		return ((TreeItem) item).getParentItem();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected Item[] getSelection(Control widget) {
-		return ((Tree) widget).getSelection();
-	}
-
-	/**
-	 * Returns this tree viewer's tree control.
-	 *
-	 * @return the tree control
-	 */
-	public Tree getTree() {
-		return tree;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#hookControl(org.eclipse.swt.widgets.Control)
-	 */
-	protected void hookControl(Control control) {
-		super.hookControl(control);
-		Tree treeControl = (Tree) control;
-
-		if ((treeControl.getStyle() & SWT.VIRTUAL) != 0) {
-			treeControl.addDisposeListener(new DisposeListener() {
-				public void widgetDisposed(DisposeEvent e) {
-					treeIsDisposed = true;
-					unmapAllElements();
-				}
-			});
-			treeControl.addListener(SWT.SetData, new Listener() {
-
-				public void handleEvent(Event event) {
-					if (contentProviderIsLazy) {
-						TreeItem item = (TreeItem) event.item;
-						TreeItem parentItem = item.getParentItem();
-						int index = event.index;
-						virtualLazyUpdateWidget(
-								parentItem == null ? (Widget) getTree()
-										: parentItem, index);
-					}
-				}
-
-			});
-		}
-	}
-
-	protected ColumnViewerEditor createViewerEditor() {
-		return new TreeViewerEditor(this,null,new ColumnViewerEditorActivationStrategy(this),ColumnViewerEditor.DEFAULT);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected Item newItem(Widget parent, int flags, int ix) {
-		TreeItem item;
-
-		if (parent instanceof TreeItem) {
-			item = (TreeItem) createNewRowPart(getViewerRowFromItem(parent),
-					flags, ix).getItem();
-		} else {
-			item = (TreeItem) createNewRowPart(null, flags, ix).getItem();
-		}
-
-		return item;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected void removeAll(Control widget) {
-		((Tree) widget).removeAll();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected void setExpanded(Item node, boolean expand) {
-		((TreeItem) node).setExpanded(expand);
-		if (contentProviderIsLazy) {
-			// force repaints to happen
-			getControl().update();
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected void setSelection(List items) {
-
-		Item[] current = getSelection(getTree());
-
-		// Don't bother resetting the same selection
-		if (isSameSelection(items, current)) {
-			return;
-		}
-
-		TreeItem[] newItems = new TreeItem[items.size()];
-		items.toArray(newItems);
-		getTree().setSelection(newItems);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in AbstractTreeViewer.
-	 */
-	protected void showItem(Item item) {
-		getTree().showItem((TreeItem) item);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#getChild(org.eclipse.swt.widgets.Widget,
-	 *      int)
-	 */
-	protected Item getChild(Widget widget, int index) {
-		if (widget instanceof TreeItem) {
-			return ((TreeItem) widget).getItem(index);
-		}
-		if (widget instanceof Tree) {
-			return ((Tree) widget).getItem(index);
-		}
-		return null;
-	}
-
-	protected void assertContentProviderType(IContentProvider provider) {
-		if (provider instanceof ILazyTreeContentProvider
-				|| provider instanceof ILazyTreePathContentProvider) {
-			return;
-		}
-		super.assertContentProviderType(provider);
-	}
-
-	protected Object[] getRawChildren(Object parent) {
-		if (contentProviderIsLazy) {
-			return new Object[0];
-		}
-		return super.getRawChildren(parent);
-	}
-
-	void preservingSelection(Runnable updateCode, boolean reveal) {
-		if (preservingSelection){
-			// avoid preserving the selection if called reentrantly,
-			// see bug 172640
-			updateCode.run();
-			return;
-		}
-		preservingSelection = true;
-		try {
-			super.preservingSelection(updateCode, reveal);
-		} finally {
-			preservingSelection = false;
-		}
-	}
-
-	/**
-	 * For a TreeViewer with a tree with the VIRTUAL style bit set, set the
-	 * number of children of the given element or tree path. To set the number
-	 * of children of the invisible root of the tree, you can pass the input
-	 * object or an empty tree path.
-	 *
-	 * @param elementOrTreePath
-	 *            the element, or tree path
-	 * @param count
-	 *
-	 * @since 3.2
-	 */
-	public void setChildCount(final Object elementOrTreePath, final int count) {
-		if (checkBusy())
-			return;
-		preservingSelection(new Runnable() {
-			public void run() {
-				if (internalIsInputOrEmptyPath(elementOrTreePath)) {
-					getTree().setItemCount(count);
-					return;
-				}
-				Widget[] items = internalFindItems(elementOrTreePath);
-				for (int i = 0; i < items.length; i++) {
-					TreeItem treeItem = (TreeItem) items[i];
-					treeItem.setItemCount(count);
-				}
-			}
-		});
-	}
-
-	/**
-	 * For a TreeViewer with a tree with the VIRTUAL style bit set, replace the
-	 * given parent's child at index with the given element. If the given parent
-	 * is this viewer's input or an empty tree path, this will replace the root
-	 * element at the given index.
-	 * <p>
-	 * This method should be called by implementers of ILazyTreeContentProvider
-	 * to populate this viewer.
-	 * </p>
-	 *
-	 * @param parentElementOrTreePath
-	 *            the parent of the element that should be updated, or the tree
-	 *            path to that parent
-	 * @param index
-	 *            the index in the parent's children
-	 * @param element
-	 *            the new element
-	 *
-	 * @see #setChildCount(Object, int)
-	 * @see ILazyTreeContentProvider
-	 * @see ILazyTreePathContentProvider
-	 *
-	 * @since 3.2
-	 */
-	public void replace(final Object parentElementOrTreePath, final int index,
-			final Object element) {
-		if (checkBusy())
-			return;
-		Item[] selectedItems = getSelection(getControl());
-		TreeSelection selection = (TreeSelection) getSelection();
-		Widget[] itemsToDisassociate;
-		if (parentElementOrTreePath instanceof TreePath) {
-			TreePath elementPath = ((TreePath) parentElementOrTreePath)
-					.createChildPath(element);
-			itemsToDisassociate = internalFindItems(elementPath);
-		} else {
-			itemsToDisassociate = internalFindItems(element);
-		}
-		if (internalIsInputOrEmptyPath(parentElementOrTreePath)) {
-			if (index < tree.getItemCount()) {
-				TreeItem item = tree.getItem(index);
-				selection = adjustSelectionForReplace(selectedItems, selection, item, element, getRoot());
-				// disassociate any different item that represents the
-				// same element under the same parent (the tree)
-				for (int i = 0; i < itemsToDisassociate.length; i++) {
-					if (itemsToDisassociate[i] instanceof TreeItem) {
-						TreeItem itemToDisassociate = (TreeItem) itemsToDisassociate[i];
-						if (itemToDisassociate != item
-								&& itemToDisassociate.getParentItem() == null) {
-							int indexToDisassociate = getTree().indexOf(
-									itemToDisassociate);
-							disassociate(itemToDisassociate);
-							getTree().clear(indexToDisassociate, true);
-						}
-					}
-				}
-				Object oldData = item.getData();
-				updateItem(item, element);
-				if (!TreeViewer.this.equals(oldData, element)) {
-					item.clearAll(true);
-				}
-			}
-		} else {
-			Widget[] parentItems = internalFindItems(parentElementOrTreePath);
-			for (int i = 0; i < parentItems.length; i++) {
-				TreeItem parentItem = (TreeItem) parentItems[i];
-				if (index < parentItem.getItemCount()) {
-					TreeItem item = parentItem.getItem(index);
-					selection = adjustSelectionForReplace(selectedItems, selection, item, element, parentItem.getData());
-					// disassociate any different item that represents the
-					// same element under the same parent (the tree)
-					for (int j = 0; j < itemsToDisassociate.length; j++) {
-						if (itemsToDisassociate[j] instanceof TreeItem) {
-							TreeItem itemToDisassociate = (TreeItem) itemsToDisassociate[j];
-							if (itemToDisassociate != item
-									&& itemToDisassociate.getParentItem() == parentItem) {
-								int indexToDisaccociate = parentItem
-										.indexOf(itemToDisassociate);
-								disassociate(itemToDisassociate);
-								parentItem.clear(indexToDisaccociate, true);
-							}
-						}
-					}
-					Object oldData = item.getData();
-					updateItem(item, element);
-					if (!TreeViewer.this.equals(oldData, element)) {
-						item.clearAll(true);
-					}
-				}
-			}
-		}
-		// Restore the selection if we are not already in a nested preservingSelection:
-		if (!preservingSelection) {
-			setSelectionToWidget(selection, false);
-			// send out notification if old and new differ
-			ISelection newSelection = getSelection();
-			if (!newSelection.equals(selection)) {
-				handleInvalidSelection(selection, newSelection);
-			}
-		}
-	}
-
-	/**
-	 * Fix for bug 185673: If the currently replaced item was selected, add it
-	 * to the selection that is being restored. Only do this if its getData() is
-	 * currently null
-	 *
-	 * @param selectedItems
-	 * @param selection
-	 * @param item
-	 * @param element
-	 * @return
-	 */
-	private TreeSelection adjustSelectionForReplace(Item[] selectedItems,
-			TreeSelection selection, TreeItem item, Object element, Object parentElement) {
-		if (item.getData() != null || selectedItems.length == selection.size()
-				|| parentElement == null) {
-			// Don't do anything - we are not seeing an instance of bug 185673
-			return selection;
-		}
-		for (int i = 0; i < selectedItems.length; i++) {
-			if (item == selectedItems[i]) {
-				// The current item was selected, but its data is null.
-				// The data will be replaced by the given element, so to keep
-				// it selected, we have to add it to the selection.
-				TreePath[] originalPaths = selection.getPaths();
-				int length = originalPaths.length;
-				TreePath[] paths = new TreePath[length + 1];
-				System.arraycopy(originalPaths, 0, paths, 0, length);
-				// set the element temporarily so that we can call getTreePathFromItem
-				item.setData(element);
-				paths[length] = getTreePathFromItem(item);
-				item.setData(null);
-				return new TreeSelection(paths, selection.getElementComparer());
-			}
-		}
-		// The item was not selected, return the given selection
-		return selection;
-	}
-
-	public boolean isExpandable(Object element) {
-		if (contentProviderIsLazy) {
-			TreeItem treeItem = (TreeItem) internalExpand(element, false);
-			if (treeItem == null) {
-				return false;
-			}
-			virtualMaterializeItem(treeItem);
-			return treeItem.getItemCount() > 0;
-		}
-		return super.isExpandable(element);
-	}
-
-	protected Object getParentElement(Object element) {
-		boolean oldBusy = isBusy();
-		setBusy(true);
-		try {
-			if (contentProviderIsLazy && !contentProviderIsTreeBased && !(element instanceof TreePath)) {
-				ILazyTreeContentProvider lazyTreeContentProvider = (ILazyTreeContentProvider) getContentProvider();
-				return lazyTreeContentProvider.getParent(element);
-			}
-			if (contentProviderIsLazy && contentProviderIsTreeBased && !(element instanceof TreePath)) {
-				ILazyTreePathContentProvider lazyTreePathContentProvider = (ILazyTreePathContentProvider) getContentProvider();
-				TreePath[] parents = lazyTreePathContentProvider
-				.getParents(element);
-				if (parents != null && parents.length > 0) {
-					return parents[0];
-				}
-			}
-			return super.getParentElement(element);
-		} finally {
-			setBusy(oldBusy);
-		}
-	}
-
-	protected void createChildren(Widget widget) {
-		if (contentProviderIsLazy) {
-			Object element = widget.getData();
-			if (element == null && widget instanceof TreeItem) {
-				// parent has not been materialized
-				virtualMaterializeItem((TreeItem) widget);
-				// try getting the element now that updateElement was called
-				element = widget.getData();
-			}
-			if (element ==  null) {
-				// give up because the parent is still not materialized
-				return;
-			}
-			Item[] children = getChildren(widget);
-			if (children.length == 1 && children[0].getData() == null) {
-				// found a dummy node
-				virtualLazyUpdateChildCount(widget, children.length);
-				children = getChildren(widget);
-			}
-			// touch all children to make sure they are materialized
-			for (int i = 0; i < children.length; i++) {
-				if (children[i].getData() == null) {
-					virtualLazyUpdateWidget(widget, i);
-				}
-			}
-			return;
-		}
-		super.createChildren(widget);
-	}
-
-	protected void internalAdd(Widget widget, Object parentElement,
-			Object[] childElements) {
-		if (contentProviderIsLazy) {
-			if (widget instanceof TreeItem) {
-				TreeItem ti = (TreeItem) widget;
-				int count = ti.getItemCount() + childElements.length;
-				ti.setItemCount(count);
-				ti.clearAll(false);
-			} else {
-				Tree t = (Tree) widget;
-				t.setItemCount(t.getItemCount() + childElements.length);
-				t.clearAll(false);
-			}
-			return;
-		}
-		super.internalAdd(widget, parentElement, childElements);
-	}
-
-	private void virtualMaterializeItem(TreeItem treeItem) {
-		if (treeItem.getData() != null) {
-			// already materialized
-			return;
-		}
-		if (!contentProviderIsLazy) {
-			return;
-		}
-		int index;
-		Widget parent = treeItem.getParentItem();
-		if (parent == null) {
-			parent = treeItem.getParent();
-		}
-		Object parentElement = parent.getData();
-		if (parentElement != null) {
-			if (parent instanceof Tree) {
-				index = ((Tree) parent).indexOf(treeItem);
-			} else {
-				index = ((TreeItem) parent).indexOf(treeItem);
-			}
-			virtualLazyUpdateWidget(parent, index);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#internalRefreshStruct(org.eclipse.swt.widgets.Widget,
-	 *      java.lang.Object, boolean)
-	 */
-	protected void internalRefreshStruct(Widget widget, Object element,
-			boolean updateLabels) {
-		if (contentProviderIsLazy) {
-			// clear all starting with the given widget
-			if (widget instanceof Tree) {
-				((Tree) widget).clearAll(true);
-			} else if (widget instanceof TreeItem) {
-				((TreeItem) widget).clearAll(true);
-			}
-			int index = 0;
-			Widget parent = null;
-			if (widget instanceof TreeItem) {
-				TreeItem treeItem = (TreeItem) widget;
-				parent = treeItem.getParentItem();
-				if (parent == null) {
-					parent = treeItem.getParent();
-				}
-				if (parent instanceof Tree) {
-					index = ((Tree) parent).indexOf(treeItem);
-				} else {
-					index = ((TreeItem) parent).indexOf(treeItem);
-				}
-			}
-			virtualRefreshExpandedItems(parent, widget, element, index);
-			return;
-		}
-		super.internalRefreshStruct(widget, element, updateLabels);
-	}
-
-	/**
-	 * Traverses the visible (expanded) part of the tree and updates child
-	 * counts.
-	 *
-	 * @param parent the parent of the widget, or <code>null</code> if the widget is the tree
-	 * @param widget
-	 * @param element
-	 * @param index the index of the widget in the children array of its parent, or 0 if the widget is the tree
-	 */
-	private void virtualRefreshExpandedItems(Widget parent, Widget widget, Object element, int index) {
-		if (widget instanceof Tree) {
-			if (element == null) {
-				((Tree) widget).setItemCount(0);
-				return;
-			}
-			virtualLazyUpdateChildCount(widget, getChildren(widget).length);
-		} else if (((TreeItem) widget).getExpanded()) {
-			// prevent SetData callback
-			((TreeItem)widget).setText(" "); //$NON-NLS-1$
-			virtualLazyUpdateWidget(parent, index);
-		} else {
-			return;
-		}
-		Item[] items = getChildren(widget);
-		for (int i = 0; i < items.length; i++) {
-			Item item = items[i];
-			Object data = item.getData();
-			virtualRefreshExpandedItems(widget, item, data, i);
-		}
-	}
-
-	/*
-	 * To unmap elements correctly, we need to register a dispose listener with
-	 * the item if the tree is virtual.
-	 */
-	protected void mapElement(Object element, final Widget item) {
-		super.mapElement(element, item);
-		// make sure to unmap elements if the tree is virtual
-		if ((getTree().getStyle() & SWT.VIRTUAL) != 0) {
-			// only add a dispose listener if item hasn't already on assigned
-			// because it is reused
-			if (item.getData(VIRTUAL_DISPOSE_KEY) == null) {
-				item.setData(VIRTUAL_DISPOSE_KEY, Boolean.TRUE);
-				item.addDisposeListener(new DisposeListener() {
-					public void widgetDisposed(DisposeEvent e) {
-						if (!treeIsDisposed) {
-							Object data = item.getData();
-							if (usingElementMap() && data != null) {
-								unmapElement(data, item);
-							}
-						}
-					}
-				});
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ColumnViewer#getRowPartFromItem(org.eclipse.swt.widgets.Widget)
-	 */
-	protected ViewerRow getViewerRowFromItem(Widget item) {
-		if( cachedRow == null ) {
-			cachedRow = new TreeViewerRow((TreeItem) item);
-		} else {
-			cachedRow.setItem((TreeItem) item);
-		}
-
-		return cachedRow;
-	}
-
-	/**
-	 * Create a new ViewerRow at rowIndex
-	 *
-	 * @param parent
-	 * @param style
-	 * @param rowIndex
-	 * @return ViewerRow
-	 */
-	private ViewerRow createNewRowPart(ViewerRow parent, int style, int rowIndex) {
-		if (parent == null) {
-			if (rowIndex >= 0) {
-				return getViewerRowFromItem(new TreeItem(tree, style, rowIndex));
-			}
-			return getViewerRowFromItem(new TreeItem(tree, style));
-		}
-
-		if (rowIndex >= 0) {
-			return getViewerRowFromItem(new TreeItem((TreeItem) parent.getItem(),
-					SWT.NONE, rowIndex));
-		}
-
-		return getViewerRowFromItem(new TreeItem((TreeItem) parent.getItem(),
-				SWT.NONE));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#internalInitializeTree(org.eclipse.swt.widgets.Control)
-	 */
-	protected void internalInitializeTree(Control widget) {
-		if (contentProviderIsLazy) {
-			if (widget instanceof Tree && widget.getData() != null) {
-				virtualLazyUpdateChildCount(widget, 0);
-				return;
-			}
-		}
-		super.internalInitializeTree(tree);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#updatePlus(org.eclipse.swt.widgets.Item,
-	 *      java.lang.Object)
-	 */
-	protected void updatePlus(Item item, Object element) {
-		if (contentProviderIsLazy) {
-			Object data = item.getData();
-			int itemCount = 0;
-			if (data != null) {
-				// item is already materialized
-				itemCount = ((TreeItem) item).getItemCount();
-			}
-			virtualLazyUpdateHasChildren(item, itemCount);
-		} else {
-			super.updatePlus(item, element);
-		}
-	}
-
-	/**
-	 * Removes the element at the specified index of the parent.  The selection is updated if required.
-	 *
-	 * @param parentOrTreePath the parent element, the input element, or a tree path to the parent element
-	 * @param index child index
-	 * @since 3.3
-	 */
-	public void remove(final Object parentOrTreePath, final int index) {
-		if (checkBusy())
-			return;
-		final List oldSelection = new LinkedList(Arrays
-				.asList(((TreeSelection) getSelection()).getPaths()));
-		preservingSelection(new Runnable() {
-			public void run() {
-				TreePath removedPath = null;
-				if (internalIsInputOrEmptyPath(parentOrTreePath)) {
-					Tree tree = (Tree) getControl();
-					if (index < tree.getItemCount()) {
-						TreeItem item = tree.getItem(index);
-						if (item.getData() != null) {
-							removedPath = getTreePathFromItem(item);
-							disassociate(item);
-						}
-						item.dispose();
-					}
-				} else {
-					Widget[] parentItems = internalFindItems(parentOrTreePath);
-					for (int i = 0; i < parentItems.length; i++) {
-						TreeItem parentItem = (TreeItem) parentItems[i];
-						if (parentItem.isDisposed())
-							continue;
-						if (index < parentItem.getItemCount()) {
-							TreeItem item = parentItem.getItem(index);
-							if (item.getData() != null) {
-								removedPath = getTreePathFromItem(item);
-								disassociate(item);
-							}
-							item.dispose();
-						}
-					}
-				}
-				if (removedPath != null) {
-					boolean removed = false;
-					for (Iterator it = oldSelection.iterator(); it
-							.hasNext();) {
-						TreePath path = (TreePath) it.next();
-						if (path.startsWith(removedPath, getComparer())) {
-							it.remove();
-							removed = true;
-						}
-					}
-					if (removed) {
-						setSelection(new TreeSelection(
-								(TreePath[]) oldSelection
-										.toArray(new TreePath[oldSelection
-												.size()]), getComparer()),
-								false);
-					}
-
-				}
-			}
-		});
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#handleTreeExpand(org.eclipse.swt.events.TreeEvent)
-	 */
-	protected void handleTreeExpand(TreeEvent event) {
-		if (contentProviderIsLazy) {
-			if (event.item.getData() != null) {
-				Item[] children = getChildren(event.item);
-				if (children.length == 1 && children[0].getData()==null) {
-					// we have a dummy child node, ask for an updated child
-					// count
-					virtualLazyUpdateChildCount(event.item, children.length);
-				}
-				fireTreeExpanded(new TreeExpansionEvent(this, event.item
-						.getData()));
-			}
-			return;
-		}
-		super.handleTreeExpand(event);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#setContentProvider(org.eclipse.jface.viewers.IContentProvider)
-	 */
-	public void setContentProvider(IContentProvider provider) {
-		contentProviderIsLazy = (provider instanceof ILazyTreeContentProvider)
-				|| (provider instanceof ILazyTreePathContentProvider);
-		contentProviderIsTreeBased = provider instanceof ILazyTreePathContentProvider;
-		super.setContentProvider(provider);
-	}
-
-	/**
-	 * For a TreeViewer with a tree with the VIRTUAL style bit set, inform the
-	 * viewer about whether the given element or tree path has children. Avoid
-	 * calling this method if the number of children has already been set.
-	 *
-	 * @param elementOrTreePath
-	 *            the element, or tree path
-	 * @param hasChildren
-	 *
-	 * @since 3.3
-	 */
-	public void setHasChildren(final Object elementOrTreePath, final boolean hasChildren) {
-		if (checkBusy())
-			return;
-		preservingSelection(new Runnable() {
-			public void run() {
-				if (internalIsInputOrEmptyPath(elementOrTreePath)) {
-					if (hasChildren) {
-						virtualLazyUpdateChildCount(getTree(),
-								getChildren(getTree()).length);
-					} else {
-						setChildCount(elementOrTreePath, 0);
-					}
-					return;
-				}
-				Widget[] items = internalFindItems(elementOrTreePath);
-				for (int i = 0; i < items.length; i++) {
-					TreeItem item = (TreeItem) items[i];
-					if (!hasChildren) {
-						item.setItemCount(0);
-					} else {
-						if (!item.getExpanded()) {
-							item.setItemCount(1);
-							TreeItem child = item.getItem(0);
-							if (child.getData() != null) {
-								disassociate(child);
-							}
-							item.clear(0, true);
-						} else {
-                            virtualLazyUpdateChildCount(item, item.getItemCount());
-                        }
-					}
-				}
-			}
-		});
-	}
-
-	/**
-	 * Update the widget at index.
-	 * @param widget
-	 * @param index
-	 */
-	private void virtualLazyUpdateWidget(Widget widget, int index) {
-		boolean oldBusy = isBusy();
-		setBusy(false);
-		try {
-			if (contentProviderIsTreeBased) {
-				TreePath treePath;
-				if (widget instanceof Item) {
-					if (widget.getData() == null) {
-						// we need to materialize the parent first
-						// see bug 167668
-						// however, that would be too risky
-						// see bug 182782 and bug 182598
-						// so we just ignore this call altogether
-						// and don't do this: virtualMaterializeItem((TreeItem) widget);
-						return;
-					}
-					treePath = getTreePathFromItem((Item) widget);
-				} else {
-					treePath = TreePath.EMPTY;
-				}
-				((ILazyTreePathContentProvider) getContentProvider())
-						.updateElement(treePath, index);
-			} else {
-				((ILazyTreeContentProvider) getContentProvider()).updateElement(
-						widget.getData(), index);
-			}
-		} finally {
-			setBusy(oldBusy);
-		}
-	}
-
-	/**
-	 * Update the child count
-	 * @param widget
-	 * @param currentChildCount
-	 */
-	private void virtualLazyUpdateChildCount(Widget widget, int currentChildCount) {
-		boolean oldBusy = isBusy();
-		setBusy(false);
-		try {
-			if (contentProviderIsTreeBased) {
-				TreePath treePath;
-				if (widget instanceof Item) {
-					treePath = getTreePathFromItem((Item) widget);
-				} else {
-					treePath = TreePath.EMPTY;
-				}
-				((ILazyTreePathContentProvider) getContentProvider())
-				.updateChildCount(treePath, currentChildCount);
-			} else {
-				((ILazyTreeContentProvider) getContentProvider()).updateChildCount(widget.getData(), currentChildCount);
-			}
-		} finally {
-			setBusy(oldBusy);
-		}
-	}
-
-	/**
-	 * Update the item with the current child count.
-	 * @param item
-	 * @param currentChildCount
-	 */
-	private void virtualLazyUpdateHasChildren(Item item, int currentChildCount) {
-		boolean oldBusy = isBusy();
-		setBusy(false);
-		try {
-			if (contentProviderIsTreeBased) {
-				TreePath treePath;
-				treePath = getTreePathFromItem(item);
-				if (currentChildCount == 0 || !((TreeItem)item).getExpanded()) {
-					// item is not expanded (but may have a plus currently)
-					((ILazyTreePathContentProvider) getContentProvider())
-					.updateHasChildren(treePath);
-				} else {
-					((ILazyTreePathContentProvider) getContentProvider())
-					.updateChildCount(treePath, currentChildCount);
-				}
-			} else {
-				((ILazyTreeContentProvider) getContentProvider()).updateChildCount(item.getData(), currentChildCount);
-			}
-		} finally {
-			setBusy(oldBusy);
-		}
-	}
-
-	protected void disassociate(Item item) {
-		if (contentProviderIsLazy) {
-			// avoid causing a callback:
-			item.setText(" "); //$NON-NLS-1$
-		}
-		super.disassociate(item);
-	}
-
-	protected int doGetColumnCount() {
-		return tree.getColumnCount();
-	}
-
-	/**
-	 * Sets a new selection for this viewer and optionally makes it visible.
-	 * <p>
-	 * <b>Currently the <code>reveal</code> parameter is not honored because
-	 * {@link Tree} does not provide an API to only select an item without
-	 * scrolling it into view</b>
-	 * </p>
-	 *
-	 * @param selection
-	 *            the new selection
-	 * @param reveal
-	 *            <code>true</code> if the selection is to be made visible,
-	 *            and <code>false</code> otherwise
-	 */
-	public void setSelection(ISelection selection, boolean reveal) {
-		super.setSelection(selection, reveal);
-	}
-
-	public void editElement(Object element, int column) {
-		if( element instanceof TreePath ) {
-			try {
-				getControl().setRedraw(false);
-				setSelection(new TreeSelection((TreePath) element));
-				TreeItem[] items = tree.getSelection();
-
-				if( items.length == 1 ) {
-					ViewerRow row = getViewerRowFromItem(items[0]);
-
-					if (row != null) {
-						ViewerCell cell = row.getCell(column);
-						if (cell != null) {
-							triggerEditorActivationEvent(new ColumnViewerEditorActivationEvent(cell));
-						}
-					}
-				}
-			} finally {
-				getControl().setRedraw(true);
-			}
-		} else {
-			super.editElement(element, column);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewerColumn.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewerColumn.java
deleted file mode 100644
index 3da3987..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewerColumn.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-
-/**
- * ViewerColumn implementation for TreeViewer to enable column-specific label
- * providers and editing support.
- * 
- * @since 3.3
- * 
- */
-public final class TreeViewerColumn extends ViewerColumn {
-	private TreeColumn column;
-
-	/**
-	 * Creates a new viewer column for the given {@link TreeViewer} on a new
-	 * {@link TreeColumn} with the given style bits. The column is inserted at
-	 * the given index into the list of columns.
-	 * 
-	 * @param viewer
-	 *            the tree viewer to which this column belongs
-	 * @param style
-	 *            the style bits used to create the column, for applicable style bits
-	 *            see {@link TreeColumn}
-	 * @see TreeColumn#TreeColumn(Tree, int)
-	 */
-	public TreeViewerColumn(TreeViewer viewer, int style) {
-		this(viewer, style, -1);
-	}
-
-	/**
-	 * Creates a new viewer column for the given {@link TreeViewer} on a new
-	 * {@link TreeColumn} with the given style bits. The column is added at the
-	 * end of the list of columns.
-	 * 
-	 * @param viewer
-	 *            the tree viewer to which this column belongs
-	 * @param style
-	 *            the style bits used to create the column, for applicable style bits
-	 *            see {@link TreeColumn}
-	 * @param index
-	 *            the index at which to place the newly created column
-	 * @see TreeColumn#TreeColumn(Tree, int, int)
-	 */
-	public TreeViewerColumn(TreeViewer viewer, int style, int index) {
-		this(viewer, createColumn(viewer.getTree(), style, index));
-	}
-
-	/**
-	 * Creates a new viewer column for the given {@link TreeViewer} on the given
-	 * {@link TreeColumn}.
-	 * 
-	 * @param viewer
-	 *            the tree viewer to which this column belongs
-	 * @param column
-	 *            the underlying tree column
-	 */
-	public TreeViewerColumn(TreeViewer viewer, TreeColumn column) {
-		super(viewer, column);
-		this.column = column;
-	}
-	
-	private static TreeColumn createColumn(Tree table, int style, int index) {
-		if (index >= 0) {
-			return new TreeColumn(table, style, index);
-		}
-
-		return new TreeColumn(table, style);
-	}
-
-	/**
-	 * @return the underlying SWT column
-	 */
-	public TreeColumn getColumn() {
-		return column;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewerEditor.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewerEditor.java
deleted file mode 100644
index 492a8b1..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewerEditor.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *     											   fixes in bug 198665, 200731, 187963
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.CellEditor.LayoutData;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TreeEditor;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- * This is an editor implementation for {@link Tree}
- *
- * @since 3.3
- */
-public class TreeViewerEditor extends ColumnViewerEditor {
-	/**
-	 * This viewer's tree editor.
-	 */
-	private TreeEditor treeEditor;
-
-	private SWTFocusCellManager focusCellManager;
-
-	/**
-	 * @param viewer
-	 *            the viewer the editor is attached to
-	 * @param focusCellManager
-	 *            the cell focus manager if one used or <code>null</code>
-	 * @param editorActivationStrategy
-	 *            the strategy used to decide about the editor activation
-	 * @param feature
-	 *            the feature mask
-	 */
-	TreeViewerEditor(TreeViewer viewer, SWTFocusCellManager focusCellManager,
-			ColumnViewerEditorActivationStrategy editorActivationStrategy,
-			int feature) {
-		super(viewer, editorActivationStrategy, feature);
-		treeEditor = new TreeEditor(viewer.getTree());
-		this.focusCellManager = focusCellManager;
-	}
-
-	/**
-	 * Create a customized editor with focusable cells
-	 *
-	 * @param viewer
-	 *            the viewer the editor is created for
-	 * @param focusCellManager
-	 *            the cell focus manager if one needed else <code>null</code>
-	 * @param editorActivationStrategy
-	 *            activation strategy to control if an editor activated
-	 * @param feature
-	 *            bit mask controlling the editor
-	 *            <ul>
-	 *            <li>{@link ColumnViewerEditor#DEFAULT}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_CYCLE_IN_ROW}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_HORIZONTAL}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_MOVE_TO_ROW_NEIGHBOR}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_VERTICAL}</li>
-	 *            </ul>
-	 * @see #create(TreeViewer, ColumnViewerEditorActivationStrategy, int)
-	 */
-	public static void create(TreeViewer viewer,
-			SWTFocusCellManager focusCellManager,
-			ColumnViewerEditorActivationStrategy editorActivationStrategy,
-			int feature) {
-		TreeViewerEditor editor = new TreeViewerEditor(viewer,
-				focusCellManager, editorActivationStrategy, feature);
-		viewer.setColumnViewerEditor(editor);
-		if (focusCellManager != null) {
-			focusCellManager.init();
-		}
-	}
-
-	/**
-	 * Create a customized editor whose activation process is customized
-	 *
-	 * @param viewer
-	 *            the viewer the editor is created for
-	 * @param editorActivationStrategy
-	 *            activation strategy to control if an editor activated
-	 * @param feature
-	 *            bit mask controlling the editor
-	 *            <ul>
-	 *            <li>{@link ColumnViewerEditor#DEFAULT}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_CYCLE_IN_ROW}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_HORIZONTAL}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_MOVE_TO_ROW_NEIGHBOR}</li>
-	 *            <li>{@link ColumnViewerEditor#TABBING_VERTICAL}</li>
-	 *            </ul>
-	 */
-	public static void create(TreeViewer viewer,
-			ColumnViewerEditorActivationStrategy editorActivationStrategy,
-			int feature) {
-		create(viewer, null, editorActivationStrategy, feature);
-	}
-
-	protected void setEditor(Control w, Item item, int fColumnNumber) {
-		treeEditor.setEditor(w, (TreeItem) item, fColumnNumber);
-	}
-
-	protected void setLayoutData(LayoutData layoutData) {
-		treeEditor.grabHorizontal = layoutData.grabHorizontal;
-		treeEditor.horizontalAlignment = layoutData.horizontalAlignment;
-		treeEditor.minimumWidth = layoutData.minimumWidth;
-		treeEditor.verticalAlignment = layoutData.verticalAlignment;
-		if( layoutData.minimumHeight != SWT.DEFAULT ) {
-			treeEditor.minimumHeight = layoutData.minimumHeight;
-		}
-	}
-
-	public ViewerCell getFocusCell() {
-		if (focusCellManager != null) {
-			return focusCellManager.getFocusCell();
-		}
-
-		return super.getFocusCell();
-	}
-
-	protected void updateFocusCell(ViewerCell focusCell,
-			ColumnViewerEditorActivationEvent event) {
-		// Update the focus cell when we activated the editor with these 2
-		// events
-		if (event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC
-				|| event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL) {
-
-			List l = getViewer().getSelectionFromWidget();
-
-			if (focusCellManager != null) {
-				focusCellManager.setFocusCell(focusCell);
-			}
-
-			if (!l.contains(focusCell.getElement())) {
-				getViewer().setSelection(
-						new TreeSelection(focusCell.getViewerRow()
-								.getTreePath()),true);
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewerFocusCellManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewerFocusCellManager.java
deleted file mode 100644
index 6944a0f..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewerFocusCellManager.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl<tom.schindl@bestsolution.at> - initial API and implementation
- *     											- fix in bug: 195908, 210752
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- * This class is responsible to provide the concept of cells for {@link Tree}.
- * This concept is needed to provide features like editor activation with the
- * keyboard
- *
- * @since 3.3
- *
- */
-public class TreeViewerFocusCellManager extends SWTFocusCellManager {
-	private static final CellNavigationStrategy TREE_NAVIGATE = new CellNavigationStrategy() {
-		public void collapse(ColumnViewer viewer, ViewerCell cellToCollapse,
-				Event event) {
-			if (cellToCollapse != null) {
-				((TreeItem) cellToCollapse.getItem()).setExpanded(false);
-			}
-		}
-
-		public void expand(ColumnViewer viewer, ViewerCell cellToExpand,
-				Event event) {
-			if (cellToExpand != null) {
-				TreeViewer v = (TreeViewer) viewer;
-				v.setExpandedState(v.getTreePathFromItem((Item) cellToExpand
-						.getItem()), true);
-			}
-		}
-
-		public boolean isCollapseEvent(ColumnViewer viewer,
-				ViewerCell cellToCollapse, Event event) {
-
-			if (cellToCollapse == null) {
-				return false;
-			}
-
-			return cellToCollapse != null
-					&& ((TreeItem) cellToCollapse.getItem()).getExpanded()
-					&& event.keyCode == SWT.ARROW_LEFT
-					&& isFirstColumnCell(cellToCollapse);
-		}
-
-		public boolean isExpandEvent(ColumnViewer viewer,
-				ViewerCell cellToExpand, Event event) {
-
-			if (cellToExpand == null) {
-				return false;
-			}
-
-			return cellToExpand != null
-					&& ((TreeItem) cellToExpand.getItem()).getItemCount() > 0
-					&& !((TreeItem) cellToExpand.getItem()).getExpanded()
-					&& event.keyCode == SWT.ARROW_RIGHT
-					&& isFirstColumnCell(cellToExpand);
-		}
-
-		private boolean isFirstColumnCell(ViewerCell cell) {
-			return cell.getViewerRow().getVisualIndex(cell.getColumnIndex()) == 0;
-		}
-	};
-
-	/**
-	 * Create a new manager using a default navigation strategy:
-	 * <ul>
-	 * <li><code>SWT.ARROW_UP</code>: navigate to cell above</li>
-	 * <li><code>SWT.ARROW_DOWN</code>: navigate to cell below</li>
-	 * <li><code>SWT.ARROW_RIGHT</code>: on first column (collapses if item
-	 * is expanded) else navigate to next visible cell on the right</li>
-	 * <li><code>SWT.ARROW_LEFT</code>: on first column (expands if item is
-	 * collapsed) else navigate to next visible cell on the left</li>
-	 * </ul>
-	 *
-	 * @param viewer
-	 *            the viewer the manager is bound to
-	 * @param focusDrawingDelegate
-	 *            the delegate responsible to highlight selected cell
-	 */
-	public TreeViewerFocusCellManager(TreeViewer viewer,
-			FocusCellHighlighter focusDrawingDelegate) {
-		this(viewer, focusDrawingDelegate, TREE_NAVIGATE);
-	}
-
-	/**
-	 * Create a new manager with a custom navigation strategy
-	 *
-	 * @param viewer
-	 *            the viewer the manager is bound to
-	 * @param focusDrawingDelegate
-	 *            the delegate responsible to highlight selected cell
-	 * @param navigationStrategy
-	 *            the strategy used to navigate the cells
-	 * @since 3.4
-	 */
-	public TreeViewerFocusCellManager(TreeViewer viewer,
-			FocusCellHighlighter focusDrawingDelegate,
-			CellNavigationStrategy navigationStrategy) {
-		super(viewer, focusDrawingDelegate, navigationStrategy);
-	}
-
-	ViewerCell getInitialFocusCell() {
-		Tree tree = (Tree) getViewer().getControl();
-
-		if (! tree.isDisposed() && tree.getItemCount() > 0 && ! tree.getItem(0).isDisposed()) {
-			return getViewer().getViewerRowFromItem(tree.getItem(0)).getCell(0);
-		}
-
-		return null;
-	}
-
-	public ViewerCell getFocusCell() {
-		ViewerCell cell = super.getFocusCell();
-		Tree t = (Tree) getViewer().getControl();
-
-		// It is possible that the selection has changed under the hood
-		if (cell != null) {
-			if (t.getSelection().length == 1
-					&& t.getSelection()[0] != cell.getItem()) {
-				setFocusCell(getViewer().getViewerRowFromItem(
-						t.getSelection()[0]).getCell(cell.getColumnIndex()));
-			}
-		}
-
-		return super.getFocusCell();
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewerRow.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewerRow.java
deleted file mode 100644
index 5becd4e..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewerRow.java
+++ /dev/null
@@ -1,396 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *     											 - fix in bug: 174355,171126,,195908,198035,215069,227421
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.LinkedList;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * TreeViewerRow is the Tree implementation of ViewerRow.
- *
- * @since 3.3
- *
- */
-public class TreeViewerRow extends ViewerRow {
-	private TreeItem item;
-
-	/**
-	 * Create a new instance of the receiver.
-	 *
-	 * @param item
-	 */
-	TreeViewerRow(TreeItem item) {
-		this.item = item;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ViewerRow#getBounds(int)
-	 */
-	public Rectangle getBounds(int columnIndex) {
-		return item.getBounds(columnIndex);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ViewerRow#getBounds()
-	 */
-	public Rectangle getBounds() {
-		return item.getBounds();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ViewerRow#getColumnCount()
-	 */
-	public int getColumnCount() {
-		return item.getParent().getColumnCount();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ViewerRow#getItem()
-	 */
-	public Widget getItem() {
-		return item;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ViewerRow#getBackground(int)
-	 */
-	public Color getBackground(int columnIndex) {
-		return item.getBackground(columnIndex);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ViewerRow#getFont(int)
-	 */
-	public Font getFont(int columnIndex) {
-		return item.getFont(columnIndex);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ViewerRow#getForeground(int)
-	 */
-	public Color getForeground(int columnIndex) {
-		return item.getForeground(columnIndex);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ViewerRow#getImage(int)
-	 */
-	public Image getImage(int columnIndex) {
-		return item.getImage(columnIndex);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ViewerRow#getText(int)
-	 */
-	public String getText(int columnIndex) {
-		return item.getText(columnIndex);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ViewerRow#setBackground(int,
-	 *      org.eclipse.swt.graphics.Color)
-	 */
-	public void setBackground(int columnIndex, Color color) {
-		item.setBackground(columnIndex, color);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ViewerRow#setFont(int,
-	 *      org.eclipse.swt.graphics.Font)
-	 */
-	public void setFont(int columnIndex, Font font) {
-		item.setFont(columnIndex, font);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ViewerRow#setForeground(int,
-	 *      org.eclipse.swt.graphics.Color)
-	 */
-	public void setForeground(int columnIndex, Color color) {
-		item.setForeground(columnIndex, color);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ViewerRow#setImage(int,
-	 *      org.eclipse.swt.graphics.Image)
-	 */
-	public void setImage(int columnIndex, Image image) {
-		Image oldImage = item.getImage(columnIndex);
-		if (image != oldImage) {
-			item.setImage(columnIndex, image);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ViewerRow#setText(int, java.lang.String)
-	 */
-	public void setText(int columnIndex, String text) {
-		item.setText(columnIndex, text == null ? "" : text); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.viewers.ViewerRow#getControl()
-	 */
-	public Control getControl() {
-		return item.getParent();
-	}
-
-	public ViewerRow getNeighbor(int direction, boolean sameLevel) {
-		if (direction == ViewerRow.ABOVE) {
-			return getRowAbove(sameLevel);
-		} else if (direction == ViewerRow.BELOW) {
-			return getRowBelow(sameLevel);
-		} else {
-			throw new IllegalArgumentException(
-					"Illegal value of direction argument."); //$NON-NLS-1$
-		}
-	}
-
-	private ViewerRow getRowBelow(boolean sameLevel) {
-		Tree tree = item.getParent();
-
-		// This means we have top-level item
-		if (item.getParentItem() == null) {
-			if (sameLevel || !item.getExpanded()) {
-				int index = tree.indexOf(item) + 1;
-
-				if (index < tree.getItemCount()) {
-					return new TreeViewerRow(tree.getItem(index));
-				}
-			} else if (item.getExpanded() && item.getItemCount() > 0) {
-				return new TreeViewerRow(item.getItem(0));
-			}
-		} else {
-			if (sameLevel || !item.getExpanded()) {
-				TreeItem parentItem = item.getParentItem();
-
-				int nextIndex = parentItem.indexOf(item) + 1;
-				int totalIndex = parentItem.getItemCount();
-
-				TreeItem itemAfter;
-
-				// This would mean that it was the last item
-				if (nextIndex == totalIndex) {
-					itemAfter = findNextItem(parentItem);
-				} else {
-					itemAfter = parentItem.getItem(nextIndex);
-				}
-
-				if (itemAfter != null) {
-					return new TreeViewerRow(itemAfter);
-				}
-
-			} else if (item.getExpanded() && item.getItemCount() > 0) {
-				return new TreeViewerRow(item.getItem(0));
-			}
-		}
-
-		return null;
-	}
-
-	private ViewerRow getRowAbove(boolean sameLevel) {
-		Tree tree = item.getParent();
-
-		// This means we have top-level item
-		if (item.getParentItem() == null) {
-			int index = tree.indexOf(item) - 1;
-			TreeItem nextTopItem = null;
-
-			if (index >= 0) {
-				nextTopItem = tree.getItem(index);
-			}
-
-			if (nextTopItem != null) {
-				if (sameLevel) {
-					return new TreeViewerRow(nextTopItem);
-				}
-
-				return new TreeViewerRow(findLastVisibleItem(nextTopItem));
-			}
-		} else {
-			TreeItem parentItem = item.getParentItem();
-			int previousIndex = parentItem.indexOf(item) - 1;
-
-			TreeItem itemBefore;
-			if (previousIndex >= 0) {
-				if (sameLevel) {
-					itemBefore = parentItem.getItem(previousIndex);
-				} else {
-					itemBefore = findLastVisibleItem(parentItem
-							.getItem(previousIndex));
-				}
-			} else {
-				itemBefore = parentItem;
-			}
-
-			if (itemBefore != null) {
-				return new TreeViewerRow(itemBefore);
-			}
-		}
-
-		return null;
-	}
-
-	private TreeItem findLastVisibleItem(TreeItem parentItem) {
-		TreeItem rv = parentItem;
-
-		while (rv.getExpanded() && rv.getItemCount() > 0) {
-			rv = rv.getItem(rv.getItemCount() - 1);
-		}
-
-		return rv;
-	}
-
-	private TreeItem findNextItem(TreeItem item) {
-		TreeItem rv = null;
-		Tree tree = item.getParent();
-		TreeItem parentItem = item.getParentItem();
-
-		int nextIndex;
-		int totalItems;
-
-		if (parentItem == null) {
-			nextIndex = tree.indexOf(item) + 1;
-			totalItems = tree.getItemCount();
-		} else {
-			nextIndex = parentItem.indexOf(item) + 1;
-			totalItems = parentItem.getItemCount();
-		}
-
-		// This is once more the last item in the tree
-		// Search on
-		if (nextIndex == totalItems) {
-			if (item.getParentItem() != null) {
-				rv = findNextItem(item.getParentItem());
-			}
-		} else {
-			if (parentItem == null) {
-				rv = tree.getItem(nextIndex);
-			} else {
-				rv = parentItem.getItem(nextIndex);
-			}
-		}
-
-		return rv;
-	}
-
-	public TreePath getTreePath() {
-		TreeItem tItem = item;
-		LinkedList segments = new LinkedList();
-		while (tItem != null) {
-			Object segment = tItem.getData();
-			Assert.isNotNull(segment);
-			segments.addFirst(segment);
-			tItem = tItem.getParentItem();
-		}
-
-		return new TreePath(segments.toArray());
-	}
-
-	void setItem(TreeItem item) {
-		this.item = item;
-	}
-
-	public Object clone() {
-		return new TreeViewerRow(item);
-	}
-
-	public Object getElement() {
-		return item.getData();
-	}
-
-	public int getVisualIndex(int creationIndex) {
-		int[] order = item.getParent().getColumnOrder();
-
-		for (int i = 0; i < order.length; i++) {
-			if (order[i] == creationIndex) {
-				return i;
-			}
-		}
-
-		return super.getVisualIndex(creationIndex);
-	}
-
-	public int getCreationIndex(int visualIndex) {
-		if( item != null && ! item.isDisposed() && hasColumns() && isValidOrderIndex(visualIndex) ) {
-			return item.getParent().getColumnOrder()[visualIndex];
-		}
-		return super.getCreationIndex(visualIndex);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#getTextBounds(int)
-	 */
-	public Rectangle getTextBounds(int index) {
-		return item.getTextBounds(index);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerRow#getImageBounds(int)
-	 */
-	public Rectangle getImageBounds(int index) {
-		return item.getImageBounds(index);
-	}	
-	
-	private boolean hasColumns() {
-		return this.item.getParent().getColumnCount() != 0;
-	}
-
-	private boolean isValidOrderIndex(int currentIndex) {
-		return currentIndex < this.item.getParent().getColumnOrder().length;
-	}
-
-	int getWidth(int columnIndex) {
-		return item.getParent().getColumn(columnIndex).getWidth();
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/Viewer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/Viewer.java
deleted file mode 100644
index bca6433..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/Viewer.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.swt.events.HelpEvent;
-import org.eclipse.swt.events.HelpListener;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Item;
-
-/**
- * A viewer is a model-based adapter on a widget.
- * <p>
- * A viewer can be created as an adapter on a pre-existing control (e.g., 
- * creating a <code>ListViewer</code> on an existing <code>List</code> control).
- * All viewers also provide a convenience constructor for creating the control.
- * </p>
- * <p>
- * Implementing a concrete viewer typically involves the following steps:
- * <ul>
- * <li>
- * create SWT controls for viewer (in constructor) (optional)
- * </li>
- * <li>
- * initialize SWT controls from input (inputChanged)
- * </li>
- * <li>
- * define viewer-specific update methods
- * </li>
- * <li>
- * support selections (<code>setSelection</code>, <code>getSelection</code>)
- * </li>
- * </ul>
- * </p>
- */
-public abstract class Viewer implements IInputSelectionProvider {
-
-    /**
-     * List of selection change listeners (element type: <code>ISelectionChangedListener</code>).
-     *
-     * @see #fireSelectionChanged
-     */
-    private ListenerList selectionChangedListeners = new ListenerList();
-
-    /**
-     * List of help request listeners (element type: <code>org.eclipse.swt.events.HelpListener</code>).
-     * Help request listeners.
-     *
-     * @see #handleHelpRequest
-     */
-    private ListenerList helpListeners = new ListenerList();
-
-    /**
-     * The names of this viewer's properties.
-     * <code>null</code> if this viewer has no properties.
-     *
-     * @see #setData
-     */
-    private String[] keys;
-
-    /**
-     * The values of this viewer's properties.
-     * <code>null</code> if this viewer has no properties.
-     * This array parallels the value of the <code>keys</code> field.
-     *
-     * @see #setData
-     */
-    private Object[] values;
-
-    /**
-     * Remembers whether we've hooked the help listener on the control or not.
-     */
-    private boolean helpHooked = false;
-
-    /**
-     * Help listener for the control, created lazily when client's first help listener is added.
-     */
-    private HelpListener helpListener = null;
-
-    /**
-     * Unique key for associating element data with widgets.
-     * @see org.eclipse.swt.widgets.Widget#setData(String, Object)
-     */
-    protected static final String WIDGET_DATA_KEY = "org.eclipse.jface.viewers.WIDGET_DATA";//$NON-NLS-1$
-
-    /**
-     * Creates a new viewer.
-     */
-    protected Viewer() {
-    }
-
-    /**
-     * Adds a listener for help requests in this viewer.
-     * Has no effect if an identical listener is already registered.
-     *
-     * @param listener a help listener
-     */
-    public void addHelpListener(HelpListener listener) {
-        helpListeners.add(listener);
-        if (!helpHooked) {
-            Control control = getControl();
-            if (control != null && !control.isDisposed()) {
-                if (this.helpListener == null) {
-                    this.helpListener = new HelpListener() {
-                        public void helpRequested(HelpEvent event) {
-                            handleHelpRequest(event);
-                        }
-                    };
-                }
-                control.addHelpListener(this.helpListener);
-                helpHooked = true;
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ISelectionProvider.
-     */
-    public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        selectionChangedListeners.add(listener);
-    }
-
-    /**
-     * Notifies any help listeners that help has been requested.
-     * Only listeners registered at the time this method is called are notified.
-     *
-     * @param event a help event
-     *
-     * @see HelpListener#helpRequested(org.eclipse.swt.events.HelpEvent)
-     */
-    protected void fireHelpRequested(HelpEvent event) {
-        Object[] listeners = helpListeners.getListeners();
-        for (int i = 0; i < listeners.length; ++i) {
-            ((HelpListener) listeners[i]).helpRequested(event);
-        }
-    }
-
-    /**
-     * Notifies any selection changed listeners that the viewer's selection has changed.
-     * Only listeners registered at the time this method is called are notified.
-     *
-     * @param event a selection changed event
-     *
-     * @see ISelectionChangedListener#selectionChanged
-     */
-    protected void fireSelectionChanged(final SelectionChangedEvent event) {
-        Object[] listeners = selectionChangedListeners.getListeners();
-        for (int i = 0; i < listeners.length; ++i) {
-            final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
-            SafeRunnable.run(new SafeRunnable() {
-                public void run() {
-                    l.selectionChanged(event);
-                }
-            });
-        }
-    }
-
-    /**
-     * Returns the primary control associated with this viewer.
-     *
-     * @return the SWT control which displays this viewer's content
-     */
-    public abstract Control getControl();
-
-    /**
-     * Returns the value of the property with the given name,
-     * or <code>null</code> if the property is not found.
-     * <p>
-     * The default implementation performs a (linear) search of
-     * an internal table. Overriding this method is generally not
-     * required if the number of different keys is small. If a more
-     * efficient representation of a viewer's properties is required,
-     * override both <code>getData</code> and <code>setData</code>.
-     * </p>
-     *
-     * @param key the property name
-     * @return the property value, or <code>null</code> if
-     *    the property is not found
-     */
-    public Object getData(String key) {
-        Assert.isNotNull(key);
-        if (keys == null) {
-			return null;
-		}
-        for (int i = 0; i < keys.length; i++) {
-            if (keys[i].equals(key)) {
-				return values[i];
-			}
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Copy-down of method declared on <code>IInputProvider</code>.
-     */
-    public abstract Object getInput();
-
-    /* (non-Javadoc)
-     * Copy-down of method declared on <code>ISelectionProvider</code>.
-     */
-    public abstract ISelection getSelection();
-
-    /**
-     * Handles a help request from the underlying SWT control.
-     * The default behavior is to fire a help request,
-     * with the event's data modified to hold this viewer.
-     * @param event the event
-     * 
-     */
-    protected void handleHelpRequest(HelpEvent event) {
-        Object oldData = event.data;
-        event.data = this;
-        fireHelpRequested(event);
-        event.data = oldData;
-    }
-
-    /**
-     * Internal hook method called when the input to this viewer is
-     * initially set or subsequently changed.
-     * <p>
-     * The default implementation does nothing. Subclassers may override 
-     * this method to do something when a viewer's input is set.
-     * A typical use is populate the viewer.
-     * </p>
-     *
-     * @param input the new input of this viewer, or <code>null</code> if none
-     * @param oldInput the old input element or <code>null</code> if there
-     *   was previously no input
-     */
-    protected void inputChanged(Object input, Object oldInput) {
-    }
-
-    /**
-     * Refreshes this viewer completely with information freshly obtained from this
-     * viewer's model.
-     */
-    public abstract void refresh();
-
-    /**
-     * Removes the given help listener from this viewer.
-     * Has no affect if an identical listener is not registered.
-     *
-     * @param listener a help listener
-     */
-    public void removeHelpListener(HelpListener listener) {
-        helpListeners.remove(listener);
-        if (helpListeners.size() == 0) {
-            Control control = getControl();
-            if (control != null && !control.isDisposed()) {
-                control.removeHelpListener(this.helpListener);
-                helpHooked = false;
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ISelectionProvider.
-     */
-    public void removeSelectionChangedListener(
-            ISelectionChangedListener listener) {
-        selectionChangedListeners.remove(listener);
-    }
-
-    /**
-     * Scrolls the viewer's control down by one item from the given
-     * display-relative coordinates.  Returns the newly revealed Item,
-     * or <code>null</code> if no scrolling occurred or if the viewer
-     * doesn't represent an item-based widget.
-     *
-     * @param x horizontal coordinate
-     * @param y vertical coordinate
-     * @return the item scrolled down to
-     */
-    public Item scrollDown(int x, int y) {
-        return null;
-    }
-
-    /**
-     * Scrolls the viewer's control up by one item from the given
-     * display-relative coordinates.  Returns the newly revealed Item,
-     * or <code>null</code> if no scrolling occurred or if the viewer
-     * doesn't represent an item-based widget.
-     *
-     * @param x horizontal coordinate
-     * @param y vertical coordinate
-     * @return the item scrolled up to
-     */
-    public Item scrollUp(int x, int y) {
-        return null;
-    }
-
-    /**
-     * Sets the value of the property with the given name to the
-     * given value, or to <code>null</code> if the property is to be
-     * removed. If this viewer has such a property, its value is
-     * replaced; otherwise a new property is added.
-     * <p>
-     * The default implementation records properties in an internal
-     * table which is searched linearly. Overriding this method is generally not
-     * required if the number of different keys is small. If a more
-     * efficient representation of a viewer's properties is required,
-     * override both <code>getData</code> and <code>setData</code>.
-     * </p>
-     *
-     * @param key the property name
-     * @param value the property value, or <code>null</code> if
-     *    the property is not found
-     */
-    public void setData(String key, Object value) {
-        Assert.isNotNull(key);
-        /* Remove the key/value pair */
-        if (value == null) {
-            if (keys == null) {
-				return;
-			}
-            int index = 0;
-            while (index < keys.length && !keys[index].equals(key)) {
-				index++;
-			}
-            if (index == keys.length) {
-				return;
-			}
-            if (keys.length == 1) {
-                keys = null;
-                values = null;
-            } else {
-                String[] newKeys = new String[keys.length - 1];
-                Object[] newValues = new Object[values.length - 1];
-                System.arraycopy(keys, 0, newKeys, 0, index);
-                System.arraycopy(keys, index + 1, newKeys, index,
-                        newKeys.length - index);
-                System.arraycopy(values, 0, newValues, 0, index);
-                System.arraycopy(values, index + 1, newValues, index,
-                        newValues.length - index);
-                keys = newKeys;
-                values = newValues;
-            }
-            return;
-        }
-
-        /* Add the key/value pair */
-        if (keys == null) {
-            keys = new String[] { key };
-            values = new Object[] { value };
-            return;
-        }
-        for (int i = 0; i < keys.length; i++) {
-            if (keys[i].equals(key)) {
-                values[i] = value;
-                return;
-            }
-        }
-        String[] newKeys = new String[keys.length + 1];
-        Object[] newValues = new Object[values.length + 1];
-        System.arraycopy(keys, 0, newKeys, 0, keys.length);
-        System.arraycopy(values, 0, newValues, 0, values.length);
-        newKeys[keys.length] = key;
-        newValues[values.length] = value;
-        keys = newKeys;
-        values = newValues;
-    }
-
-    /**
-     * Sets or clears the input for this viewer.
-     *
-     * @param input the input of this viewer, or <code>null</code> if none
-     */
-    public abstract void setInput(Object input);
-
-    /**
-	 * The viewer implementation of this <code>ISelectionProvider</code>
-	 * method make the new selection for this viewer without making it visible.
-	 * <p>
-	 * This method is equivalent to <code>setSelection(selection,false)</code>.
-	 * </p>
-	 * <p>
-	 * Note that some implementations may not be able to set the selection
-	 * without also revealing it, for example (as of 3.3) TreeViewer.
-	 * </p>
-	 */
-    public void setSelection(ISelection selection) {
-        setSelection(selection, false);
-    }
-
-    /**
-     * Sets a new selection for this viewer and optionally makes it visible.
-     * <p>
-     * Subclasses must implement this method.
-     * </p>
-     *
-     * @param selection the new selection
-     * @param reveal <code>true</code> if the selection is to be made
-     *   visible, and <code>false</code> otherwise
-     */
-    public abstract void setSelection(ISelection selection, boolean reveal);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerCell.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerCell.java
deleted file mode 100644
index 872e179..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerCell.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *     											 - fix in bug: 195908,198035,215069,215735,227421
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * The ViewerCell is the JFace representation of a cell entry in a ViewerRow.
- *
- * @since 3.3
- *
- */
-public class ViewerCell {
-	private int columnIndex;
-
-	private ViewerRow row;
-
-	private Object element;
-
-	/**
-	 * Constant denoting the cell above current one (value is 1).
-	 */
-	public static int ABOVE = 1;
-
-	/**
-	 * Constant denoting the cell below current one (value is 2).
-	 */
-	public static int BELOW = 1 << 1;
-
-	/**
-	 * Constant denoting the cell to the left of the current one (value is 4).
-	 */
-	public static int LEFT = 1 << 2;
-
-	/**
-	 * Constant denoting the cell to the right of the current one (value is 8).
-	 */
-	public static int RIGHT = 1 << 3;
-
-	
-	/**
-	 * Create a new instance of the receiver on the row.
-	 *
-	 * @param row
-	 * @param columnIndex
-	 */
-	ViewerCell(ViewerRow row, int columnIndex, Object element) {
-		this.row = row;
-		this.columnIndex = columnIndex;
-		this.element = element;
-	}
-
-	/**
-	 * Get the index of the cell.
-	 *
-	 * @return the index
-	 */
-	public int getColumnIndex() {
-		return columnIndex;
-	}
-
-	/**
-	 * Get the bounds of the cell.
-	 *
-	 * @return {@link Rectangle}
-	 */
-	public Rectangle getBounds() {
-		return row.getBounds(columnIndex);
-	}
-
-	/**
-	 * Get the element this row represents.
-	 *
-	 * @return {@link Object}
-	 */
-	public Object getElement() {
-		if (element != null) {
-			return element;
-		}
-
-		if (row != null) {
-			return row.getElement();
-		}
-
-		return null;
-	}
-
-	/**
-	 * Return the text for the cell.
-	 *
-	 * @return {@link String}
-	 */
-	public String getText() {
-		return row.getText(columnIndex);
-	}
-
-	/**
-	 * Return the Image for the cell.
-	 *
-	 * @return {@link Image} or <code>null</code>
-	 */
-	public Image getImage() {
-		return row.getImage(columnIndex);
-	}
-
-	/**
-	 * Set the background color of the cell.
-	 *
-	 * @param background
-	 */
-	public void setBackground(Color background) {
-		row.setBackground(columnIndex, background);
-
-	}
-
-	/**
-	 * Set the foreground color of the cell.
-	 *
-	 * @param foreground
-	 */
-	public void setForeground(Color foreground) {
-		row.setForeground(columnIndex, foreground);
-
-	}
-
-	/**
-	 * Set the font of the cell.
-	 *
-	 * @param font
-	 */
-	public void setFont(Font font) {
-		row.setFont(columnIndex, font);
-
-	}
-
-	/**
-	 * Set the text for the cell.
-	 *
-	 * @param text
-	 */
-	public void setText(String text) {
-		row.setText(columnIndex, text);
-
-	}
-
-	/**
-	 * Set the Image for the cell.
-	 *
-	 * @param image
-	 */
-	public void setImage(Image image) {
-		row.setImage(columnIndex, image);
-
-	}
-	
-	/**
-	 * Set the style ranges to be applied on the text label
-	 * Note: Requires {@link StyledCellLabelProvider} with owner draw enabled.
-	 * 
-	 * @param styleRanges the styled ranges
-	 * 
-	 * @since 3.4
-	 */
-	public void setStyleRanges(StyleRange[] styleRanges) {
-		row.setStyleRanges(columnIndex, styleRanges);
-	}
-	
-	
-	/**
-	 * Returns the style ranges to be applied on the text label or <code>null</code> if no
-	 * style ranges have been set.
-	 * 
-	 * @return styleRanges the styled ranges
-	 * 
-	 * @since 3.4
-	 */
-	public StyleRange[] getStyleRanges() {
-		return row.getStyleRanges(columnIndex);
-	}
-
-	/**
-	 * Set the columnIndex.
-	 *
-	 * @param column
-	 */
-	void setColumn(int column) {
-		columnIndex = column;
-
-	}
-
-	/**
-	 * Set the row to rowItem and the columnIndex to column.
-	 *
-	 * @param rowItem
-	 * @param column
-	 */
-	void update(ViewerRow rowItem, int column, Object element) {
-		row = rowItem;
-		columnIndex = column;
-		this.element = element;
-	}
-
-	/**
-	 * Return the item for the receiver.
-	 *
-	 * @return {@link Item}
-	 */
-	public Widget getItem() {
-		return row.getItem();
-	}
-
-	/**
-	 * Get the control for this cell.
-	 *
-	 * @return {@link Control}
-	 */
-	public Control getControl() {
-		return row.getControl();
-	}
-
-	/**
-	 * Get the current index. This can be different from the original index when
-	 * columns are reordered
-	 *
-	 * @return the current index (as shown in the UI)
-	 * @since 3.4
-	 */
-	public int getVisualIndex() {
-		return row.getVisualIndex(getColumnIndex());
-	}
-
-	/**
-	 * Returns the specified neighbor of this cell, or <code>null</code> if no
-	 * neighbor exists in the given direction. Direction constants can be
-	 * combined by bitwise OR; for example, this method will return the cell to
-	 * the upper-left of the current cell by passing {@link #ABOVE} |
-	 * {@link #LEFT}. If <code>sameLevel</code> is <code>true</code>, only
-	 * cells in sibling rows (under the same parent) will be considered.
-	 *
-	 * @param directionMask
-	 *            the direction mask used to identify the requested neighbor
-	 *            cell
-	 * @param sameLevel
-	 *            if <code>true</code>, only consider cells from sibling rows
-	 * @return the requested neighbor cell, or <code>null</code> if not found
-	 */
-	public ViewerCell getNeighbor(int directionMask, boolean sameLevel) {
-		ViewerRow row;
-
-		if ((directionMask & ABOVE) == ABOVE) {
-			row = this.row.getNeighbor(ViewerRow.ABOVE, sameLevel);
-		} else if ((directionMask & BELOW) == BELOW) {
-			row = this.row.getNeighbor(ViewerRow.BELOW, sameLevel);
-		} else {
-			row = this.row;
-		}
-
-		if (row != null) {
-			int columnIndex;
-			columnIndex = getVisualIndex();
-
-			int modifier = 0;
-
-			if ((directionMask & LEFT) == LEFT) {
-				modifier = -1;
-			} else if ((directionMask & RIGHT) == RIGHT) {
-				modifier = 1;
-			}
-
-			columnIndex += modifier;
-
-			if (columnIndex >= 0 && columnIndex < row.getColumnCount()) {
-				ViewerCell cell = row.getCellAtVisualIndex(columnIndex);
-				if( cell != null ) {
-					while( cell != null && columnIndex < row.getColumnCount() - 1  && columnIndex > 0 ) {
-						if( cell.isVisible() ) {
-							break;
-						}
-
-						columnIndex += modifier;
-						cell = row.getCellAtVisualIndex(columnIndex);
-						if( cell == null ) {
-							break;
-						}
-					}
-				}
-
-				return cell;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * @return the row
-	 */
-	public ViewerRow getViewerRow() {
-		return row;
-	}
-
-	/**
-	 * The location and bounds of the area where the text is drawn depends on
-	 * various things (image displayed, control with SWT.CHECK)
-	 *
-	 * @return The bounds of the of the text area. May return <code>null</code>
-	 *         if the underlying widget implementation doesn't provide this
-	 *         information
-	 * @since 3.4
-	 */
-	public Rectangle getTextBounds() {
-		return row.getTextBounds(columnIndex);
-	}
-	
-	/**
-	 * Returns the location and bounds of the area where the image is drawn 
-	 * 
-	 * @return The bounds of the of the image area. May return <code>null</code>
-	 *         if the underlying widget implementation doesn't provide this
-	 *         information
-	 * @since 3.4
-	 */
-	public Rectangle getImageBounds() {
-		return row.getImageBounds(columnIndex);
-	}
-
-	/**
-	 * Gets the foreground color of the cell.
-	 * 
-	 * @return the foreground of the cell or <code>null</code> for the default foreground
-	 * 
-	 * @since 3.4
-	 */
-	public Color getForeground() {
-		return row.getForeground(columnIndex);
-	}
-	
-	/**
-	 * Gets the background color of the cell.
-	 * 
-	 * @return the background of the cell or <code>null</code> for the default background
-	 * 
-	 * @since 3.4
-	 */
-	public Color getBackground() {
-		return row.getBackground(columnIndex);
-	}
-	
-	/**
-	 * Gets the font of the cell.
-	 * 
-	 * @return the font of the cell or <code>null</code> for the default font
-	 * 
-	 * @since 3.4
-	 */
-	public Font getFont() {
-		return row.getFont(columnIndex);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + columnIndex;
-		result = prime * result + ((row == null) ? 0 : row.hashCode());
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		final ViewerCell other = (ViewerCell) obj;
-		if (columnIndex != other.columnIndex)
-			return false;
-		if (row == null) {
-			if (other.row != null)
-				return false;
-		} else if (!row.equals(other.row))
-			return false;
-		return true;
-	}
-	
-	private int getWidth() {
-		return row.getWidth(columnIndex);
-	}
-	
-	private boolean isVisible() {
-		return getWidth() > 0;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerColumn.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerColumn.java
deleted file mode 100644
index 9b5ed12..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerColumn.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Shindl <tom.schindl@bestsolution.at> - initial API and implementation
- * 												  fix for bug 163317, 201905
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.jface.util.Policy;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * Instances of this class represent a column of a {@link ColumnViewer}. Label
- * providers and editing support can be configured for each column separately.
- * Concrete subclasses of {@link ColumnViewer} should implement a matching
- * concrete subclass of {@link ViewerColumn}.
- * 
- * @since 3.3
- * 
- */
-public abstract class ViewerColumn {
-
-	private CellLabelProvider labelProvider;
-
-	static String COLUMN_VIEWER_KEY = Policy.JFACE + ".columnViewer";//$NON-NLS-1$
-
-	private EditingSupport editingSupport;
-
-	private ILabelProviderListener listener;
-
-	private boolean listenerRegistered = false;
-
-	private ColumnViewer viewer;
-
-	/**
-	 * Create a new instance of the receiver at columnIndex.
-	 * 
-	 * @param viewer
-	 *            the viewer the column is part of
-	 * @param columnOwner
-	 *            the widget owning the viewer in case the widget has no columns
-	 *            this could be the widget itself
-	 */
-	protected ViewerColumn(final ColumnViewer viewer, Widget columnOwner) {
-		this.viewer = viewer;
-		columnOwner.setData(ViewerColumn.COLUMN_VIEWER_KEY, this);
-		this.listener = new ILabelProviderListener() {
-
-			public void labelProviderChanged(LabelProviderChangedEvent event) {
-				viewer.handleLabelProviderChanged(event);
-			}
-
-		};
-		columnOwner.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				handleDispose(viewer);
-			}
-		});
-	}
-
-	/**
-	 * Return the label provider for the receiver.
-	 * 
-	 * @return ViewerLabelProvider
-	 */
-	/* package */CellLabelProvider getLabelProvider() {
-		return labelProvider;
-	}
-
-	/**
-	 * Set the label provider for the column. Subclasses may extend but must
-	 * call the super implementation.
-	 * 
-	 * @param labelProvider
-	 *            the new {@link CellLabelProvider}
-	 */
-	public void setLabelProvider(CellLabelProvider labelProvider) {
-		setLabelProvider(labelProvider, true);
-	}
-
-	/**
-	 * @param labelProvider
-	 * @param registerListener
-	 */
-	/* package */void setLabelProvider(CellLabelProvider labelProvider,
-			boolean registerListener) {
-		if (listenerRegistered && this.labelProvider != null) {
-			this.labelProvider.removeListener(listener);
-			listenerRegistered = false;
-			if (registerListener) {
-				this.labelProvider.dispose(viewer, this);
-			}
-		}
-
-		this.labelProvider = labelProvider;
-
-		if (registerListener) {
-			this.labelProvider.initialize(viewer, this);
-			this.labelProvider.addListener(listener);
-			listenerRegistered = true;
-		}
-	}
-
-	/**
-	 * Return the editing support for the receiver.
-	 * 
-	 * @return {@link EditingSupport}
-	 */
-	/* package */EditingSupport getEditingSupport() {
-		return editingSupport;
-	}
-
-	/**
-	 * Set the editing support. Subclasses may extend but must call the super
-	 * implementation.
-	 * <p>
-	 * Users setting up an editable {@link TreeViewer} or {@link TableViewer} with more than 1 column <b>have</b>
-	 * to pass the SWT.FULL_SELECTION style bit when creating the viewer
-	 * </p>
-	 * @param editingSupport
-	 *            The {@link EditingSupport} to set.
-	 */
-	public void setEditingSupport(EditingSupport editingSupport) {
-		this.editingSupport = editingSupport;
-	}
-
-	/**
-	 * Refresh the cell for the given columnIndex. <strong>NOTE:</strong>the
-	 * {@link ViewerCell} provided to this method is no longer valid after this
-	 * method returns. Do not cache the cell for future use.
-	 * 
-	 * @param cell
-	 *            {@link ViewerCell}
-	 */
-	/* package */void refresh(ViewerCell cell) {
-		getLabelProvider().update(cell);
-	}
-
-	/**
-	 * Disposes of the label provider (if set), unregisters the listener and
-	 * nulls the references to the label provider and editing support. This
-	 * method is called when the underlying widget is disposed. Subclasses may
-	 * extend but must call the super implementation.
-	 */
-	protected void handleDispose() {
-		boolean disposeLabelProvider = listenerRegistered;
-		CellLabelProvider cellLabelProvider = labelProvider;
-		setLabelProvider(null, false);
-		if (disposeLabelProvider) {
-			cellLabelProvider.dispose(viewer, this);
-		}
-		editingSupport = null;
-		listener = null;
-		viewer = null;
-	}
-
-	private void handleDispose(ColumnViewer viewer) {
-		handleDispose();
-		viewer.clearLegacyEditingSetup();
-	}
-
-	/**
-	 * Returns the viewer of this viewer column.
-	 * 
-	 * @return Returns the viewer.
-	 * 
-	 * @since 3.4
-	 */
-	public ColumnViewer getViewer() {
-		return viewer;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerComparator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerComparator.java
deleted file mode 100644
index 893cfd1..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerComparator.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import java.util.Arrays;
-import java.util.Comparator;
-
-import org.eclipse.jface.util.Policy;
-
-/**
- * A viewer comparator is used by a {@link StructuredViewer} to
- * reorder the elements provided by its content provider.
- * <p>
- * The default <code>compare</code> method compares elements using two steps. 
- * The first step uses the values returned from <code>category</code>. 
- * By default, all elements are in the same category. 
- * The second level is based on a case insensitive compare of the strings obtained 
- * from the content viewer's label provider via <code>ILabelProvider.getText</code>.
- * </p>
- * <p>
- * Subclasses may implement the <code>isSorterProperty</code> method;
- * they may reimplement the <code>category</code> method to provide 
- * categorization; and they may override the <code>compare</code> methods
- * to provide a totally different way of sorting elements.
- * </p>
- * @see IStructuredContentProvider
- * @see StructuredViewer
- * 
- * @since 3.2
- */
-public class ViewerComparator {
-	/**
-	 * The comparator to use to sort a viewer's contents.
-	 */
-	private Comparator comparator;
-
-	/**
-     * Creates a new {@link ViewerComparator}, which uses the default comparator
-     * to sort strings.
-	 *
-	 */
-	public ViewerComparator(){
-		this(null);
-	}
-	
-	/**
-     * Creates a new {@link ViewerComparator}, which uses the given comparator
-     * to sort strings.
-     * 
-	 * @param comparator
-	 */
-	public ViewerComparator(Comparator comparator){
-		this.comparator = comparator;
-	}
-
-	/**
-	 * Returns the comparator used to sort strings.
-	 * 
-	 * @return the comparator used to sort strings
-	 */
-	protected Comparator getComparator() {
-		if (comparator == null){
-			comparator = Policy.getComparator();
-		}
-		return comparator;
-	}
-
-    /**
-     * Returns the category of the given element. The category is a
-     * number used to allocate elements to bins; the bins are arranged
-     * in ascending numeric order. The elements within a bin are arranged
-     * via a second level sort criterion.
-     * <p>
-     * The default implementation of this framework method returns
-     * <code>0</code>. Subclasses may reimplement this method to provide
-     * non-trivial categorization.
-     * </p>
-     *
-     * @param element the element
-     * @return the category
-     */
-    public int category(Object element) {
-        return 0;
-    }
-
-    /**
-     * Returns a negative, zero, or positive number depending on whether
-     * the first element is less than, equal to, or greater than
-     * the second element.
-     * <p>
-     * The default implementation of this method is based on
-     * comparing the elements' categories as computed by the <code>category</code>
-     * framework method. Elements within the same category are further 
-     * subjected to a case insensitive compare of their label strings, either
-     * as computed by the content viewer's label provider, or their 
-     * <code>toString</code> values in other cases. Subclasses may override.
-     * </p>
-     * 
-     * @param viewer the viewer
-     * @param e1 the first element
-     * @param e2 the second element
-     * @return a negative number if the first element is less  than the 
-     *  second element; the value <code>0</code> if the first element is
-     *  equal to the second element; and a positive number if the first
-     *  element is greater than the second element
-     */
-    public int compare(Viewer viewer, Object e1, Object e2) {
-        int cat1 = category(e1);
-        int cat2 = category(e2);
-
-        if (cat1 != cat2) {
-			return cat1 - cat2;
-		}
-    	
-        String name1;
-        String name2;
-
-        if (viewer == null || !(viewer instanceof ContentViewer)) {
-            name1 = e1.toString();
-            name2 = e2.toString();
-        } else {
-            IBaseLabelProvider prov = ((ContentViewer) viewer)
-                    .getLabelProvider();
-            if (prov instanceof ILabelProvider) {
-                ILabelProvider lprov = (ILabelProvider) prov;
-                name1 = lprov.getText(e1);
-                name2 = lprov.getText(e2);
-            } else {
-                name1 = e1.toString();
-                name2 = e2.toString();
-            }
-        }
-        if (name1 == null) {
-			name1 = "";//$NON-NLS-1$
-		}
-        if (name2 == null) {
-			name2 = "";//$NON-NLS-1$
-		}
-
-        // use the comparator to compare the strings
-        return getComparator().compare(name1, name2);
-    }
-
-    /**
-     * Returns whether this viewer sorter would be affected 
-     * by a change to the given property of the given element.
-     * <p>
-     * The default implementation of this method returns <code>false</code>.
-     * Subclasses may reimplement.
-     * </p>
-     *
-     * @param element the element
-     * @param property the property
-     * @return <code>true</code> if the sorting would be affected,
-     *    and <code>false</code> if it would be unaffected
-     */
-    public boolean isSorterProperty(Object element, String property) {
-        return false;
-    }
-
-    /**
-     * Sorts the given elements in-place, modifying the given array.
-     * <p>
-     * The default implementation of this method uses the 
-     * java.util.Arrays#sort algorithm on the given array, 
-     * calling <code>compare</code> to compare elements.
-     * </p>
-     * <p>
-     * Subclasses may reimplement this method to provide a more optimized implementation.
-     * </p>
-     *
-     * @param viewer the viewer
-     * @param elements the elements to sort
-     */
-    public void sort(final Viewer viewer, Object[] elements) {
-        Arrays.sort(elements, new Comparator() {
-            public int compare(Object a, Object b) {
-                return ViewerComparator.this.compare(viewer, a, b);
-            }
-        });
-    }	
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerDropAdapter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerDropAdapter.java
deleted file mode 100644
index db8743a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerDropAdapter.java
+++ /dev/null
@@ -1,487 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetAdapter;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- * This adapter class provides generic drag-and-drop support for a viewer.
- * <p>
- * Subclasses must implement the following methods:
- * <ul>
- *   <li><code>validateDrop</code> - identifies valid drop targets in viewer</li>
- *   <li><code>performDrop</code> - carries out a drop into a viewer</li>
- * </ul>
- * The <code>setFeedbackEnabled</code> method can be called to turn on and off 
- * visual insertion feedback (on by default).
- * </p>
- */
-public abstract class ViewerDropAdapter extends DropTargetAdapter {
-
-    /**
-     * Constant describing the position of the cursor relative 
-     * to the target object.  This means the mouse is positioned
-     * slightly before the target.
-     * @see #getCurrentLocation()
-     */
-    public static final int LOCATION_BEFORE = 1;
-
-    /**
-     * Constant describing the position of the cursor relative 
-     * to the target object.  This means the mouse is positioned
-     * slightly after the target.
-     * @see #getCurrentLocation()
-     */
-    public static final int LOCATION_AFTER = 2;
-
-    /**
-     * Constant describing the position of the cursor relative 
-     * to the target object.  This means the mouse is positioned
-     * directly on the target.
-     * @see #getCurrentLocation()
-     */
-    public static final int LOCATION_ON = 3;
-
-    /**
-     * Constant describing the position of the cursor relative 
-     * to the target object.  This means the mouse is not positioned
-     * over or near any valid target.
-     * @see #getCurrentLocation()
-     */
-    public static final int LOCATION_NONE = 4;
-
-    /**
-     * The viewer to which this drop support has been added.
-     */
-    private Viewer viewer;
-
-    /**
-     * The current operation.
-     */
-    private int currentOperation = DND.DROP_NONE;
-
-    /**
-     * The last valid operation.
-     */
-    private int lastValidOperation = DND.DROP_NONE;
-
-    /**
-     * The data item currently under the mouse.
-     */
-    private Object currentTarget;
-
-    /**
-     * Information about the position of the mouse relative to the
-     * target (before, on, or after the target.  Location is one of
-     * the <code>LOCATION_* </code> constants defined in this type.
-     */
-    private int currentLocation;
-
-    /**
-     * A flag that allows adapter users to turn the insertion
-     * feedback on or off. Default is <code>true</code>.
-     */
-    private boolean feedbackEnabled = true;
-
-    /**
-     * A flag that allows adapter users to turn auto scrolling
-     * on or off. Default is <code>true</code>.
-     */
-    private boolean scrollEnabled = true;
-
-    /**
-     * A flag that allows adapter users to turn auto
-     * expanding on or off. Default is <code>true</code>.
-     */
-    private boolean expandEnabled = true;
-    
-    /**
-     * A flag that allows adapter users to turn selection feedback
-     *  on or off. Default is <code>true</code>.
-     */
-    private boolean selectFeedbackEnabled = true;
-
-    /**
-     * Creates a new drop adapter for the given viewer.
-     *
-     * @param viewer the viewer
-     */
-    protected ViewerDropAdapter(Viewer viewer) {
-        this.viewer = viewer;
-    }
-
-    /**
-     * Returns the position of the given event's coordinates relative to its target.
-     * The position is determined to be before, after, or on the item, based on
-     * some threshold value.
-     *
-     * @param event the event
-     * @return one of the <code>LOCATION_* </code>constants defined in this class
-     */
-    protected int determineLocation(DropTargetEvent event) {
-        if (!(event.item instanceof Item)) {
-            return LOCATION_NONE;
-        }
-        Item item = (Item) event.item;
-        Point coordinates = new Point(event.x, event.y);
-        coordinates = viewer.getControl().toControl(coordinates);
-        if (item != null) {
-            Rectangle bounds = getBounds(item);
-            if (bounds == null) {
-                return LOCATION_NONE;
-            }
-            if ((coordinates.y - bounds.y) < 5) {
-                return LOCATION_BEFORE;
-            }
-            if ((bounds.y + bounds.height - coordinates.y) < 5) {
-                return LOCATION_AFTER;
-            }
-        }
-        return LOCATION_ON;
-    }
-
-    /**
-     * Returns the target item of the given drop event.
-     *
-     * @param event the event
-     * @return The target of the drop, may be <code>null</code>.
-     */
-    protected Object determineTarget(DropTargetEvent event) {
-        return event.item == null ? null : event.item.getData();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on DropTargetAdapter.
-     * The mouse has moved over the drop target.  If the
-     * target item has changed, notify the action and check
-     * that it is still enabled.
-     */
-    private void doDropValidation(DropTargetEvent event) {
-        //update last valid operation
-        if (event.detail != DND.DROP_NONE) {
-            lastValidOperation = event.detail;
-        }
-        //valid drop and set event detail accordingly
-        if (validateDrop(currentTarget, event.detail, event.currentDataType)) {
-            currentOperation = lastValidOperation;
-        } else {
-            currentOperation = DND.DROP_NONE;
-        }
-        event.detail = currentOperation;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on DropTargetAdapter.
-     * The drag has entered this widget's region.  See
-     * if the drop should be allowed.
-     */
-    public void dragEnter(DropTargetEvent event) {
-        currentTarget = determineTarget(event);
-        doDropValidation(event);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on DropTargetAdapter.
-     * The drop operation has changed, see if the action
-     * should still be enabled.
-     */
-    public void dragOperationChanged(DropTargetEvent event) {
-        currentTarget = determineTarget(event);
-        doDropValidation(event);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on DropTargetAdapter.
-     * The mouse has moved over the drop target.  If the
-     * target item has changed, notify the action and check
-     * that it is still enabled.
-     */
-    public void dragOver(DropTargetEvent event) {
-        //use newly revealed item as target if scrolling occurs
-        Object target = determineTarget(event);
-
-        //set the location feedback
-        int oldLocation = currentLocation;
-        currentLocation = determineLocation(event);
-        setFeedback(event, currentLocation);
-
-        //see if anything has really changed before doing validation.
-        if (target != currentTarget || currentLocation != oldLocation) {
-            currentTarget = target;
-            doDropValidation(event);
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on DropTargetAdapter.
-     * The user has dropped something on the desktop viewer.
-     */
-    public void drop(DropTargetEvent event) {
-        currentLocation = determineLocation(event);
-
-        //perform the drop behavior
-        if (!performDrop(event.data)) {
-            event.detail = DND.DROP_NONE;
-        }
-        currentOperation = event.detail;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on DropTargetAdapter.
-     * Last chance for the action to disable itself
-     */
-    public void dropAccept(DropTargetEvent event) {
-        if (!validateDrop(currentTarget, event.detail, event.currentDataType)) {
-            event.detail = DND.DROP_NONE;
-        }
-    }
-
-    /**
-     * Returns the bounds of the given SWT tree or table item.
-     *
-     * @param item the SWT Item
-     * @return the bounds, or <code>null</code> if it is not a known type of item
-     */
-    protected Rectangle getBounds(Item item) {
-        if (item instanceof TreeItem) {
-            return ((TreeItem) item).getBounds();
-        }
-        if (item instanceof TableItem) {
-            return ((TableItem) item).getBounds(0);
-        }
-        return null;
-    }
-
-    /**
-     * Returns a constant describing the position of the mouse relative to the
-     * target (before, on, or after the target.  
-     *
-     * @return one of the <code>LOCATION_* </code> constants defined in this type
-     */
-    protected int getCurrentLocation() {
-        return currentLocation;
-    }
-
-    /**
-     * Returns the current operation.
-     *
-     * @return a <code>DROP_*</code> constant from class <code>DND</code>
-     *
-     * @see DND#DROP_COPY
-     * @see DND#DROP_MOVE
-     * @see DND#DROP_LINK
-     * @see DND#DROP_NONE
-     */
-    protected int getCurrentOperation() {
-        return currentOperation;
-    }
-
-    /**
-     * Returns the target object currently under the mouse.
-     *
-     * @return the current target object
-     */
-    protected Object getCurrentTarget() {
-        return currentTarget;
-    }
-
-    /**
-     * Returns whether visible insertion feedback should be presented to the user.
-     * <p>
-     * Typical insertion feedback is the horizontal insertion bars that appear 
-     * between adjacent items while dragging.
-     * </p>
-     *
-     * @return <code>true</code> if visual feedback is desired, and <code>false</code> if not
-     */
-    public boolean getFeedbackEnabled() {
-        return feedbackEnabled;
-    }
-
-    /**
-     * Returns the object currently selected by the viewer.
-     *
-     * @return the selected object, or <code>null</code> if either no object or 
-     *   multiple objects are selected
-     */
-    protected Object getSelectedObject() {
-        ISelection selection = viewer.getSelection();
-        if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
-            IStructuredSelection structured = (IStructuredSelection) selection;
-            return structured.getFirstElement();
-        }
-        return null;
-    }
-
-    /**
-     * @return the viewer to which this drop support has been added.
-     */
-    protected Viewer getViewer() {
-        return viewer;
-    }
-
-    /**
-     * @deprecated this method should not be used. Exception handling has been 
-     * 	removed from DropTargetAdapter methods overridden by this class.
-     * Handles any exception that occurs during callback, including 
-     * rethrowing behavior.
-     * <p>
-     * [Issue: Implementation prints stack trace and eats exception to avoid
-     *  crashing VA/J.
-     *  Consider conditionalizing the implementation to do one thing in VAJ
-     *  and something more reasonable in other operating environments.
-     * ]
-     * </p>
-     *
-     * @param exception the exception
-     * @param event the event
-     */
-    protected void handleException(Throwable exception, DropTargetEvent event) {
-        // Currently we never rethrow because VA/Java crashes if an SWT
-        // callback throws anything. Generally catching Throwable is bad, but in
-        // this cases it's better than hanging the image.
-        exception.printStackTrace();
-        event.detail = DND.DROP_NONE;
-    }
-
-    /**
-     * Performs any work associated with the drop.
-     * <p>
-     * Subclasses must implement this method to provide drop behavior.
-     * </p>
-     *
-     * @param data the drop data
-     * @return <code>true</code> if the drop was successful, and 
-     *   <code>false</code> otherwise
-     */
-    public abstract boolean performDrop(Object data);
-
-    /* (non-Javadoc)
-     * Method declared on DropTargetAdapter.
-     * The mouse has moved over the drop target.  If the
-     * target item has changed, notify the action and check
-     * that it is still enabled.
-     */
-    private void setFeedback(DropTargetEvent event, int location) {
-        if (feedbackEnabled) {
-            switch (location) {
-            case LOCATION_BEFORE:
-                event.feedback = DND.FEEDBACK_INSERT_BEFORE;
-                break;
-            case LOCATION_AFTER:
-                event.feedback = DND.FEEDBACK_INSERT_AFTER;
-                break;
-            case LOCATION_ON:
-            default:
-                event.feedback = DND.FEEDBACK_SELECT;
-                break;
-            }
-        }
-        
-         // Explicitly inhibit SELECT feedback if desired
-		if (!selectFeedbackEnabled) {
-			event.feedback &= ~DND.FEEDBACK_SELECT;
-		}
-
-		if (expandEnabled) {
-			event.feedback |= DND.FEEDBACK_EXPAND;
-		}
-		if (scrollEnabled) {
-			event.feedback |= DND.FEEDBACK_SCROLL;
-		}
-    }
-
-    /**
-	 * Sets whether visible insertion feedback should be presented to the user.
-	 * <p>
-	 * Typical insertion feedback is the horizontal insertion bars that appear
-	 * between adjacent items while dragging.
-	 * </p>
-	 * 
-	 * @param value
-	 *            <code>true</code> if visual feedback is desired, and
-	 *            <code>false</code> if not
-	 */
-    public void setFeedbackEnabled(boolean value) {
-        feedbackEnabled = value;
-    }
-
-    /**
-     * Sets whether selection feedback should be provided during dragging.
-     *
-     * @param value <code>true</code> if selection feedback is desired, and
-     *   <code>false</code> if not
-     *   
-     * @since 3.2
-     */
-    public void setSelectionFeedbackEnabled(boolean value) {
-        selectFeedbackEnabled = value;
-    }
-
-    /**
-     * Sets whether auto scrolling and expanding should be provided during dragging.
-     *
-     * @param value <code>true</code> if scrolling and expanding is desired, and
-     *   <code>false</code> if not
-     * @since 2.0
-     */
-    public void setScrollExpandEnabled(boolean value) {
-    	expandEnabled = value;
-    	scrollEnabled = value;
-    }
-
-    /**
-     * Sets whether auto expanding should be provided during dragging.
-     *
-     * @param value <code>true</code> if expanding is desired, and
-     *   <code>false</code> if not
-     * @since 3.4
-     */
-    public void setExpandEnabled(boolean value) {
-        expandEnabled = value;
-    }
-    
-    /**
-     * Sets whether auto scrolling should be provided during dragging.
-     *
-     * @param value <code>true</code> if scrolling is desired, and
-     *   <code>false</code> if not
-     * @since 3.4
-     */
-    public void setScrollEnabled(boolean value) {
-        scrollEnabled = value;
-    }
-
-    /**
-     * Validates dropping on the given object. This method is called whenever some 
-     * aspect of the drop operation changes.
-     * <p>
-     * Subclasses must implement this method to define which drops make sense.
-     * </p>
-     * 
-     * @param target the object that the mouse is currently hovering over, or
-     *   <code>null</code> if the mouse is hovering over empty space
-     * @param operation the current drag operation (copy, move, etc.)
-     * @param transferType the current transfer type
-     * @return <code>true</code> if the drop is valid, and <code>false</code>
-     *   otherwise
-     */
-    public abstract boolean validateDrop(Object target, int operation,
-            TransferData transferType);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerFilter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerFilter.java
deleted file mode 100644
index 910a9d2..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerFilter.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.util.ArrayList;
-
-/**
- * A viewer filter is used by a structured viewer to
- * extract a subset of elements provided by its content provider.
- * <p>
- * Subclasses must implement the <code>select</code> method
- * and may implement the <code>isFilterProperty</code> method.
- * </p>
- * @see IStructuredContentProvider
- * @see StructuredViewer
- */
-public abstract class ViewerFilter {
-    /**
-     * Creates a new viewer filter.
-     */
-    protected ViewerFilter() {
-    }
-
-    /**
-     * Filters the given elements for the given viewer.
-     * The input array is not modified.
-     * <p>
-     * The default implementation of this method calls 
-     * <code>select</code> on each element in the array, 
-     * and returns only those elements for which <code>select</code>
-     * returns <code>true</code>.
-     * </p>
-     * @param viewer the viewer
-     * @param parent the parent element
-     * @param elements the elements to filter
-     * @return the filtered elements
-     */
-    public Object[] filter(Viewer viewer, Object parent, Object[] elements) {
-        int size = elements.length;
-        ArrayList out = new ArrayList(size);
-        for (int i = 0; i < size; ++i) {
-            Object element = elements[i];
-            if (select(viewer, parent, element)) {
-				out.add(element);
-			}
-        }
-        return out.toArray();
-    }
-
-    /**
-     * Filters the given elements for the given viewer.
-     * The input array is not modified.
-     * <p>
-     * The default implementation of this method calls 
-     * {@link #filter(Viewer, Object, Object[])} with the 
-     * parent from the path. Subclasses may override
-     * </p>
-     * @param viewer the viewer
-     * @param parentPath the path of the parent element
-     * @param elements the elements to filter
-     * @return the filtered elements
-     * @since 3.2
-     */
-    public Object[] filter(Viewer viewer, TreePath parentPath, Object[] elements) {
-        return filter(viewer, parentPath.getLastSegment(), elements);
-    }
-    
-    /**
-     * Returns whether this viewer filter would be affected 
-     * by a change to the given property of the given element.
-     * <p>
-     * The default implementation of this method returns <code>false</code>.
-     * Subclasses should reimplement.
-     * </p>
-     *
-     * @param element the element
-     * @param property the property
-     * @return <code>true</code> if the filtering would be affected,
-     *    and <code>false</code> if it would be unaffected
-     */
-    public boolean isFilterProperty(Object element, String property) {
-        return false;
-    }
-
-    /**
-     * Returns whether the given element makes it through this filter.
-     *
-     * @param viewer the viewer
-     * @param parentElement the parent element
-     * @param element the element
-     * @return <code>true</code> if element is included in the
-     *   filtered set, and <code>false</code> if excluded
-     */
-    public abstract boolean select(Viewer viewer, Object parentElement,
-            Object element);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerLabel.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerLabel.java
deleted file mode 100644
index 49b55c6..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerLabel.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.shindl@bestsolution.at> - tooltip support
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-
-/**
- * The ViewerLabel is the class that is passed to a viewer to handle updates of
- * labels. It keeps track of both original and updates text.
- * 
- * @see IViewerLabelProvider
- * @since 3.0
- */
-public class ViewerLabel {
-
-	// New values for the receiver. Null if nothing has been set.
-	private String newText = null;
-
-	private Image newImage = null;
-
-	private boolean imageUpdated = false;
-
-	private boolean textUpdated = false;
-
-	private Color background = null;
-
-	private Color foreground = null;
-
-	private Font font = null;
-
-	// The initial values for the receiver.
-	private String startText;
-
-	private Image startImage;
-
-	private boolean hasPendingDecorations;
-
-	private String tooltipText;
-
-	private Color tooltipForegroundColor;
-
-	private Color tooltipBackgroundColor;
-
-	private Point tooltipShift;
-
-	/**
-	 * Create a new instance of the receiver with the supplied initial text and
-	 * image.
-	 * 
-	 * @param initialText
-	 * @param initialImage
-	 */
-	public ViewerLabel(String initialText, Image initialImage) {
-		startText = initialText;
-		startImage = initialImage;
-	}
-
-	/**
-	 * Get the image for the receiver. If the new image has been set return it,
-	 * otherwise return the starting image.
-	 * 
-	 * @return Returns the image.
-	 */
-	public final Image getImage() {
-		if (imageUpdated) {
-			return newImage;
-		}
-		return startImage;
-	}
-
-	/**
-	 * Set the image for the receiver.
-	 * 
-	 * @param image
-	 *            The image to set.
-	 */
-	public final void setImage(Image image) {
-		imageUpdated = true;
-		newImage = image;
-	}
-
-	/**
-	 * Get the text for the receiver. If the new text has been set return it,
-	 * otherwise return the starting text.
-	 * 
-	 * @return String or <code>null</code> if there was no initial text and
-	 *         nothing was updated.
-	 */
-	public final String getText() {
-		if (textUpdated) {
-			return newText;
-		}
-		return startText;
-	}
-
-	/**
-	 * Set the text for the receiver.
-	 * 
-	 * @param text
-	 *            String The label to set. This value should not be
-	 *            <code>null</code>.
-	 * @see #hasNewText()
-	 */
-	public final void setText(String text) {
-		newText = text;
-		textUpdated = true;
-	}
-
-	/**
-	 * Return whether or not the image has been set.
-	 * 
-	 * @return boolean. <code>true</code> if the image has been set to
-	 *         something new.
-	 * 
-	 * @since 3.1
-	 */
-	public boolean hasNewImage() {
-
-		// If we started with null any change is an update
-		if (startImage == null) {
-			return newImage != null;
-		}
-
-		if (imageUpdated) {
-			return !(startImage.equals(newImage));
-		}
-		return false;
-	}
-
-	/**
-	 * Return whether or not the text has been set.
-	 * 
-	 * @return boolean. <code>true</code> if the text has been set to
-	 *         something new.
-	 */
-	public boolean hasNewText() {
-
-		// If we started with null any change is an update
-		if (startText == null) {
-			return newText != null;
-		}
-
-		if (textUpdated) {
-			return !(startText.equals(newText));
-		}
-
-		return false;
-	}
-
-	/**
-	 * Return whether or not the background color has been set.
-	 * 
-	 * @return boolean. <code>true</code> if the value has been set.
-	 */
-	public boolean hasNewBackground() {
-		return background != null;
-	}
-
-	/**
-	 * Return whether or not the foreground color has been set.
-	 * 
-	 * @return boolean. <code>true</code> if the value has been set.
-	 * 
-	 * @since 3.1
-	 */
-	public boolean hasNewForeground() {
-		return foreground != null;
-	}
-
-	/**
-	 * Return whether or not the font has been set.
-	 * 
-	 * @return boolean. <code>true</code> if the value has been set.
-	 * 
-	 * @since 3.1
-	 */
-	public boolean hasNewFont() {
-		return font != null;
-	}
-
-	/**
-	 * Get the background Color.
-	 * 
-	 * @return Color or <code>null</code> if no new value was set.
-	 * 
-	 * @since 3.1
-	 */
-	public Color getBackground() {
-		return background;
-	}
-
-	/**
-	 * Set the background Color.
-	 * 
-	 * @param background
-	 *            Color. This value should not be <code>null</code>.
-	 * 
-	 * @since 3.1
-	 */
-	public void setBackground(Color background) {
-		this.background = background;
-	}
-
-	/**
-	 * Get the font.
-	 * 
-	 * @return Font or <code>null</code> if no new value was set.
-	 * 
-	 * @since 3.1
-	 */
-	public Font getFont() {
-		return font;
-	}
-
-	/**
-	 * Set the font.
-	 * 
-	 * @param font
-	 *            Font This value should not be <code>null</code>.
-	 * 
-	 * @since 3.1
-	 */
-	public void setFont(Font font) {
-		this.font = font;
-	}
-
-	/**
-	 * Get the foreground Color.
-	 * 
-	 * @return Color or <code>null</code> if no new value was set.
-	 * 
-	 * @since 3.1
-	 */
-	public Color getForeground() {
-		return foreground;
-	}
-
-	/**
-	 * Set the foreground Color.
-	 * 
-	 * @param foreground
-	 *            Color This value should not be <code>null</code>.
-	 * 
-	 * @since 3.1
-	 */
-	public void setForeground(Color foreground) {
-		this.foreground = foreground;
-	}
-
-	/**
-	 * Set whether or not there are any decorations pending.
-	 * 
-	 * @param hasPendingDecorations
-	 */
-	void setHasPendingDecorations(boolean hasPendingDecorations) {
-		this.hasPendingDecorations = hasPendingDecorations;
-	}
-
-	/**
-	 * @return <code>boolean</code>. <code>true</code> if there are any
-	 *         decorations pending.
-	 */
-	boolean hasPendingDecorations() {
-		return hasPendingDecorations;
-	}
-
-	/**
-	 * Returns the tooltipText.
-	 * 
-	 * @return {@link String} or <code>null</code> if the tool tip text was
-	 *         never set.
-	 * 
-	 * @since 3.3
-	 */
-	public String getTooltipText() {
-		return tooltipText;
-	}
-
-	/**
-	 * Set the tool tip text.
-	 * 
-	 * @param tooltipText
-	 *            The tooltipText {@link String} to set. This value should not
-	 *            be <code>null</code>.
-	 * 
-	 * @since 3.3
-	 */
-	public void setTooltipText(String tooltipText) {
-		this.tooltipText = tooltipText;
-	}
-
-	/**
-	 * Return whether or not the tool tip text has been set.
-	 * 
-	 * @return <code>boolean</code>. <code>true</code> if the tool tip text
-	 *         has been set.
-	 * 
-	 * @since 3.3
-	 */
-	public boolean hasNewTooltipText() {
-		return this.tooltipText != null;
-	}
-
-	/**
-	 * Return the tool tip background color.
-	 * 
-	 * @return {@link Color} or <code>null</code> if the tool tip background
-	 *         color has not been set.
-	 * 
-	 * @since 3.3
-	 */
-	public Color getTooltipBackgroundColor() {
-		return tooltipBackgroundColor;
-	}
-
-	/**
-	 * Set the background {@link Color} for tool tip.
-	 * 
-	 * @param tooltipBackgroundColor
-	 *            The {@link Color} to set. This value should not be
-	 *            <code>null</code>.
-	 * 
-	 * @since 3.3
-	 */
-	public void setTooltipBackgroundColor(Color tooltipBackgroundColor) {
-		this.tooltipBackgroundColor = tooltipBackgroundColor;
-	}
-
-	/**
-	 * Return whether or not the tool tip background color has been set.
-	 * 
-	 * @return <code>boolean</code>. <code>true</code> if the tool tip text
-	 *         has been set.
-	 * 
-	 * @since 3.3
-	 */
-	public boolean hasNewTooltipBackgroundColor() {
-		return tooltipBackgroundColor != null;
-	}
-
-	/**
-	 * Return the foreground {@link Color}.
-	 * 
-	 * @return Returns {@link Color} or <code>null</code> if the tool tip
-	 *         foreground color has not been set.
-	 * 
-	 * @since 3.3
-	 */
-	public Color getTooltipForegroundColor() {
-		return tooltipForegroundColor;
-	}
-
-	/**
-	 * Set the foreground {@link Color} for tool tip.
-	 * 
-	 * @param tooltipForegroundColor
-	 *            The tooltipForegroundColor to set.
-	 *            
-	 * @since 3.3
-	 */
-	public void setTooltipForegroundColor(Color tooltipForegroundColor) {
-		this.tooltipForegroundColor = tooltipForegroundColor;
-	}
-
-	/**
-	 * 
-	 * Return whether or not the tool tip foreground color has been set.
-	 * 
-	 * @return <code>boolean</code>. <code>true</code> if the tool tip foreground
-	 *         has been set.
-	 * 
-	 * @since 3.3
-	 */
-	public boolean hasNewTooltipForegroundColor() {
-		return tooltipForegroundColor != null;
-	}
-
-	/**
-	 * @return Returns the tooltipShift.
-	 * @since 3.3
-	 */
-	public Point getTooltipShift() {
-		return tooltipShift;
-	}
-
-	/**
-	 * @param tooltipShift
-	 *            The tooltipShift to set.
-	 * @since 3.3
-	 */
-	public void setTooltipShift(Point tooltipShift) {
-		this.tooltipShift = tooltipShift;
-	}
-
-	/**
-	 * @return Return whether or not the tool tip shift has been set.
-	 * @since 3.3
-	 */
-	public boolean hasTooltipShift() {
-		return this.tooltipShift != null;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerRow.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerRow.java
deleted file mode 100644
index 7285029..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerRow.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *                                               - fix in bug: 166346,167325,174355,195908,198035,215069,227421
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.jface.util.Policy;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * ViewerRow is the abstract superclass of the part that represents items in a
- * Table or Tree. Implementors of {@link ColumnViewer} have to provide a
- * concrete implementation for the underlying widget
- * 
- * @since 3.3
- * 
- */
-public abstract class ViewerRow implements Cloneable {
-
-	/**
-	 * Constant denoting the row above the current one (value is 1).
-	 * 
-	 * @see #getNeighbor(int, boolean)
-	 */
-	public static final int ABOVE = 1;
-
-	/**
-	 * Constant denoting the row below the current one (value is 2).
-	 * 
-	 * @see #getNeighbor(int, boolean)
-	 */
-	public static final int BELOW = 2;
-	
-	private static final String KEY_TEXT_LAYOUT = Policy.JFACE + "styled_label_key_"; //$NON-NLS-1$
-
-	/**
-	 * Get the bounds of the entry at the columnIndex,
-	 * 
-	 * @param columnIndex
-	 * @return {@link Rectangle}
-	 */
-	public abstract Rectangle getBounds(int columnIndex);
-
-	/**
-	 * Return the bounds for the whole item.
-	 * 
-	 * @return {@link Rectangle}
-	 */
-	public abstract Rectangle getBounds();
-
-	/**
-	 * Return the item for the receiver.
-	 * 
-	 * @return {@link Widget}
-	 */
-	public abstract Widget getItem();
-
-	/**
-	 * Return the number of columns for the receiver.
-	 * 
-	 * @return the number of columns
-	 */
-	public abstract int getColumnCount();
-
-	/**
-	 * Return the image at the columnIndex.
-	 * 
-	 * @param columnIndex
-	 * @return {@link Image} or <code>null</code>
-	 */
-	public abstract Image getImage(int columnIndex);
-
-	/**
-	 * Set the image at the columnIndex
-	 * 
-	 * @param columnIndex
-	 * @param image
-	 */
-	public abstract void setImage(int columnIndex, Image image);
-
-	/**
-	 * Get the text at the columnIndex.
-	 * 
-	 * @param columnIndex
-	 * @return {@link String}
-	 */
-	public abstract String getText(int columnIndex);
-
-	/**
-	 * Set the text at the columnIndex
-	 * 
-	 * @param columnIndex
-	 * @param text
-	 */
-	public abstract void setText(int columnIndex, String text);
-
-	/**
-	 * Get the background at the columnIndex,
-	 * 
-	 * @param columnIndex
-	 * @return {@link Color} or <code>null</code>
-	 */
-	public abstract Color getBackground(int columnIndex);
-
-	/**
-	 * Set the background at the columnIndex.
-	 * 
-	 * @param columnIndex
-	 * @param color
-	 */
-	public abstract void setBackground(int columnIndex, Color color);
-
-	/**
-	 * Get the foreground at the columnIndex.
-	 * 
-	 * @param columnIndex
-	 * @return {@link Color} or <code>null</code>
-	 */
-	public abstract Color getForeground(int columnIndex);
-
-	/**
-	 * Set the foreground at the columnIndex.
-	 * 
-	 * @param columnIndex
-	 * @param color
-	 */
-	public abstract void setForeground(int columnIndex, Color color);
-
-	/**
-	 * Get the font at the columnIndex.
-	 * 
-	 * @param columnIndex
-	 * @return {@link Font} or <code>null</code>
-	 */
-	public abstract Font getFont(int columnIndex);
-
-	/**
-	 * Set the {@link Font} at the columnIndex.
-	 * 
-	 * @param columnIndex
-	 * @param font
-	 */
-	public abstract void setFont(int columnIndex, Font font);
-
-	/**
-	 * Get the ViewerCell at point.
-	 * 
-	 * @param point
-	 * @return {@link ViewerCell}
-	 */
-	public ViewerCell getCell(Point point) {
-		int index = getColumnIndex(point);
-		return getCell(index);
-	}
-
-	/**
-	 * Get the columnIndex of the point.
-	 * 
-	 * @param point
-	 * @return int or -1 if it cannot be found.
-	 */
-	public int getColumnIndex(Point point) {
-		int count = getColumnCount();
-
-		// If there are no columns the column-index is 0
-		if (count == 0) {
-			return 0;
-		}
-
-		for (int i = 0; i < count; i++) {
-			if (getBounds(i).contains(point)) {
-				return i;
-			}
-		}
-
-		return -1;
-	}
-
-	/**
-	 * Get a ViewerCell for the column at index.
-	 * 
-	 * @param column
-	 * @return {@link ViewerCell} or <code>null</code> if the index is
-	 *         negative.
-	 */
-	public ViewerCell getCell(int column) {
-		if (column >= 0)
-			return new ViewerCell((ViewerRow) clone(), column, getElement());
-
-		return null;
-	}
-
-	/**
-	 * Get the Control for the receiver.
-	 * 
-	 * @return {@link Control}
-	 */
-	public abstract Control getControl();
-
-	/**
-	 * Returns a neighboring row, or <code>null</code> if no neighbor exists
-	 * in the given direction. If <code>sameLevel</code> is <code>true</code>,
-	 * only sibling rows (under the same parent) will be considered.
-	 * 
-	 * @param direction
-	 *            the direction {@link #BELOW} or {@link #ABOVE}
-	 * 
-	 * @param sameLevel
-	 *            if <code>true</code>, search only within sibling rows
-	 * @return the row above/below, or <code>null</code> if not found
-	 */
-	public abstract ViewerRow getNeighbor(int direction, boolean sameLevel);
-
-	/**
-	 * The tree path used to identify an element by the unique path
-	 * 
-	 * @return the path
-	 */
-	public abstract TreePath getTreePath();
-
-	public abstract Object clone();
-
-	/**
-	 * @return the model element
-	 */
-	public abstract Object getElement();
-
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result
-				+ ((getItem() == null) ? 0 : getItem().hashCode());
-		return result;
-	}
-
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		final ViewerRow other = (ViewerRow) obj;
-		if (getItem() == null) {
-			if (other.getItem() != null)
-				return false;
-		} else if (!getItem().equals(other.getItem()))
-			return false;
-		return true;
-	}
-
-	/**
-	 * The cell at the current index (as shown in the UI). This can be different
-	 * to the original index when columns are reordered.
-	 * 
-	 * @param visualIndex
-	 *            the current index (as shown in the UI)
-	 * @return the cell at the currently visible index
-	 */
-	ViewerCell getCellAtVisualIndex(int visualIndex) {
-		return getCell(getCreationIndex(visualIndex));
-	}
-
-	/**
-	 * Translate the original column index to the actual one.
-	 * <p>
-	 * <b>Because of backwards API compatibility the default implementation
-	 * returns the original index. Implementators of {@link ColumnViewer} should
-	 * overwrite this method if their widget supports reordered columns</b>
-	 * </p>
-	 * 
-	 * @param creationIndex
-	 *            the original index
-	 * @return the current index (as shown in the UI)
-	 * @since 3.4
-	 */
-	protected int getVisualIndex(int creationIndex) {
-		return creationIndex;
-	}
-
-	/**
-	 * Translate the current column index (as shown in the UI) to the original
-	 * one.
-	 * <p>
-	 * <b>Because of backwards API compatibility the default implementation
-	 * returns the original index. Implementators of {@link ColumnViewer} should
-	 * overwrite this method if their widget supports reordered columns</b>
-	 * </p>
-	 * 
-	 * @param visualIndex
-	 *            the current index (as shown in the UI)
-	 * @return the original index
-	 * @since 3.4
-	 */
-	protected int getCreationIndex(int visualIndex) {
-		return visualIndex;
-	}
-
-	/**
-	 * The location and bounds of the area where the text is drawn depends on
-	 * various things (image displayed, control with SWT.CHECK)
-	 * 
-	 * @param index
-	 *            the column index
-	 * @return the bounds of the of the text area. May return <code>null</code>
-	 *         if the underlying widget implementation doesn't provide this
-	 *         information
-	 * @since 3.4
-	 */
-	public Rectangle getTextBounds(int index) {
-		return null;
-	}
-	
-
-	/**
-	 * Returns the location and bounds of the area where the image is drawn.
-	 * 
-	 * @param index
-	 *            the column index
-	 * @return the bounds of the of the image area. May return <code>null</code>
-	 *         if the underlying widget implementation doesn't provide this
-	 *         information
-	 * @since 3.4
-	 */
-	public Rectangle getImageBounds(int index) {
-		return null;
-	}
-	
-	/**
-	 * Set the style ranges to be applied on the text label at the column index
-	 * Note: Requires {@link StyledCellLabelProvider} with owner draw enabled.
-	 * 
-	 * @param columnIndex the index of the column
-	 * @param styleRanges the styled ranges
-	 * 
-	 * @since 3.4
-	 */
-	public void setStyleRanges(int columnIndex, StyleRange[] styleRanges) {
-		getItem().setData(KEY_TEXT_LAYOUT + columnIndex, styleRanges);
-	}
-	
-	
-	/**
-	 * Returns the style ranges to be applied on the text label at the column index or <code>null</code> if no
-	 * style ranges have been set.
-	 * 
-	 * @param columnIndex the index of the column
-	 * @return styleRanges the styled ranges
-	 * 
-	 * @since 3.4
-	 */
-	public StyleRange[] getStyleRanges(int columnIndex) {
-		return (StyleRange[]) getItem().getData(KEY_TEXT_LAYOUT + columnIndex);
-	}
-	
-	int getWidth(int columnIndex) {
-		return getBounds(columnIndex).width;
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerSorter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerSorter.java
deleted file mode 100644
index efa5839..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerSorter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers;
-
-import java.text.Collator; // can't use ICU - Collator used in public API
-
-/**
- * A viewer sorter is used by a {@link StructuredViewer} to reorder the elements 
- * provided by its content provider.
- * <p>
- * The default <code>compare</code> method compares elements using two steps. 
- * The first step uses the values returned from <code>category</code>. 
- * By default, all elements are in the same category. 
- * The second level is based on a case insensitive compare of the strings obtained 
- * from the content viewer's label provider via <code>ILabelProvider.getText</code>.
- * </p>
- * <p>
- * Subclasses may implement the <code>isSorterProperty</code> method;
- * they may reimplement the <code>category</code> method to provide 
- * categorization; and they may override the <code>compare</code> methods
- * to provide a totally different way of sorting elements.
- * </p>
- * <p>
- * It is recommended to use <code>ViewerComparator</code> instead.
- * </p>
- * @see IStructuredContentProvider
- * @see StructuredViewer
- */
-public class ViewerSorter extends ViewerComparator {
-    /**
-     * The collator used to sort strings.
-     * 
-     * @deprecated as of 3.3 Use {@link ViewerComparator#getComparator()}
-     */
-    protected Collator collator;
-
-    /**
-     * Creates a new viewer sorter, which uses the default collator
-     * to sort strings.
-     */
-    public ViewerSorter() {
-        this(Collator.getInstance());
-    }
-
-    /**
-     * Creates a new viewer sorter, which uses the given collator
-     * to sort strings.
-     *
-     * @param collator the collator to use to sort strings
-     */
-    public ViewerSorter(Collator collator) {
-    	super(collator);
-        this.collator = collator;
-    }
-
-    /**
-     * Returns the collator used to sort strings.
-     *
-     * @return the collator used to sort strings
-     * @deprecated as of 3.3 Use {@link ViewerComparator#getComparator()}
-     */
-    public Collator getCollator() {
-        return collator;
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/WrappedViewerLabelProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/WrappedViewerLabelProvider.java
deleted file mode 100644
index a95cc4e..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/WrappedViewerLabelProvider.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.viewers;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The WrappedViewerLabelProvider is a label provider that allows
- * {@link ILabelProvider}, {@link IColorProvider} and {@link IFontProvider} to
- * be mapped to a ColumnLabelProvider.
- * 
- * @since 3.3
- * 
- */
-class WrappedViewerLabelProvider extends ColumnLabelProvider {
-
-	private static ILabelProvider defaultLabelProvider = new LabelProvider();
-
-	private ILabelProvider labelProvider = defaultLabelProvider;
-
-	private IColorProvider colorProvider;
-
-	private IFontProvider fontProvider;
-
-	private IViewerLabelProvider viewerLabelProvider;
-
-	private ITreePathLabelProvider treePathLabelProvider;
-
-	/**
-	 * Create a new instance of the receiver based on labelProvider.
-	 * 
-	 * @param labelProvider
-	 */
-	public WrappedViewerLabelProvider(IBaseLabelProvider labelProvider) {
-		super();
-		setProviders(labelProvider);
-	}
-
-	/**
-	 * Set the any providers for the receiver that can be adapted from provider.
-	 * 
-	 * @param provider
-	 *            {@link Object}
-	 */
-	public void setProviders(Object provider) {
-		if (provider instanceof ITreePathLabelProvider)
-			treePathLabelProvider = ((ITreePathLabelProvider) provider);
-
-		if (provider instanceof IViewerLabelProvider)
-			viewerLabelProvider = ((IViewerLabelProvider) provider);
-
-		if (provider instanceof ILabelProvider)
-			labelProvider = ((ILabelProvider) provider);
-
-		if (provider instanceof IColorProvider)
-			colorProvider = (IColorProvider) provider;
-
-		if (provider instanceof IFontProvider)
-			fontProvider = (IFontProvider) provider;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-	 */
-	public Font getFont(Object element) {
-		if (fontProvider == null) {
-			return null;
-		}
-
-		return fontProvider.getFont(element);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-	 */
-	public Color getBackground(Object element) {
-		if (colorProvider == null) {
-			return null;
-		}
-
-		return colorProvider.getBackground(element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object element) {
-		return getLabelProvider().getText(element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object element) {
-		return getLabelProvider().getImage(element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-	 */
-	public Color getForeground(Object element) {
-		if (colorProvider == null) {
-			return null;
-		}
-
-		return colorProvider.getForeground(element);
-	}
-
-	/**
-	 * Get the label provider
-	 * 
-	 * @return {@link ILabelProvider}
-	 */
-	ILabelProvider getLabelProvider() {
-		return labelProvider;
-	}
-
-	/**
-	 * Get the color provider
-	 * 
-	 * @return {@link IColorProvider}
-	 */
-	IColorProvider getColorProvider() {
-		return colorProvider;
-	}
-
-	/**
-	 * Get the font provider
-	 * 
-	 * @return {@link IFontProvider}.
-	 */
-	IFontProvider getFontProvider() {
-		return fontProvider;
-	}
-
-	public void update(ViewerCell cell) {
-		Object element = cell.getElement();
-		if(viewerLabelProvider == null && treePathLabelProvider == null){
-			// inlined super implementation with performance optimizations
-			cell.setText(getText(element));
-			Image image = getImage(element);
-			cell.setImage(image);
-			if (colorProvider != null) {
-				cell.setBackground(getBackground(element));
-				cell.setForeground(getForeground(element));
-			}
-			if (fontProvider != null) {
-				cell.setFont(getFont(element));
-			}
-			return;
-		}
-		
-		ViewerLabel label = new ViewerLabel(cell.getText(), cell.getImage());
-		
-		if (treePathLabelProvider != null) {
-			TreePath treePath = cell.getViewerRow().getTreePath();
-
-			Assert.isNotNull(treePath);
-			treePathLabelProvider.updateLabel(label, treePath);
-		} else if (viewerLabelProvider != null) {
-			viewerLabelProvider.updateLabel(label, element);
-		} 
-		if (!label.hasNewForeground() && colorProvider != null) 
-			label.setForeground(getForeground(element));
-		
-		if (!label.hasNewBackground() && colorProvider != null) 
-			label.setBackground(getBackground(element));
-		
-		if (!label.hasNewFont() && fontProvider != null) 
-			label.setFont(getFont(element));
-		
-		applyViewerLabel(cell, label);
-	}
-
-	private void applyViewerLabel(ViewerCell cell, ViewerLabel label) {
-		if (label.hasNewText()) {
-			cell.setText(label.getText());
-		}
-		if (label.hasNewImage()) {
-			cell.setImage(label.getImage());
-		}
-		if (colorProvider!= null || label.hasNewBackground()) {
-			cell.setBackground(label.getBackground());
-		}
-		if (colorProvider!= null || label.hasNewForeground()) {
-			cell.setForeground(label.getForeground());
-		}
-		if (fontProvider!= null || label.hasNewFont()) {
-			cell.setFont(label.getFont());
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/AbstractConcurrentModel.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/AbstractConcurrentModel.java
deleted file mode 100644
index f493244..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/AbstractConcurrentModel.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers.deferred;
-
-import org.eclipse.core.runtime.ListenerList;
-
-
-/**
- * Abstract base class for all IConcurrentModel implementations. Clients should
- * subclass this class instead of implementing IConcurrentModel directly. 
- * 
- * @since 3.1
- */
-public abstract class AbstractConcurrentModel implements
-        IConcurrentModel {
-
-    private ListenerList listeners = new ListenerList(); 
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.deferred.IConcurrentContentProvider#addListener(org.eclipse.jface.viewers.deferred.IConcurrentContentProviderListener)
-     */
-    public void addListener(IConcurrentModelListener listener) {
-        listeners.add(listener);
-    }
-    
-    /**
-     * Fires an add notification to all listeners
-     * 
-     * @param added objects added to the set
-     */
-    protected final void fireAdd(Object[] added) {
-        Object[] listenerArray = listeners.getListeners();
-        
-        for (int i = 0; i < listenerArray.length; i++) {
-            IConcurrentModelListener next = (IConcurrentModelListener) listenerArray[i];
-            
-            next.add(added);
-        }
-    }
-
-    /**
-     * Fires a remove notification to all listeners
-     * 
-     * @param removed objects removed from the set
-     */
-    protected final void fireRemove(Object[] removed) {
-        Object[] listenerArray = listeners.getListeners();
-        
-        for (int i = 0; i < listenerArray.length; i++) {
-            IConcurrentModelListener next = (IConcurrentModelListener) listenerArray[i];
-            
-            next.remove(removed);
-        }
-    }
-    
-    /**
-     * Fires an update notification to all listeners
-     * 
-     * @param updated objects that have changed
-     */
-    protected final void fireUpdate(Object[] updated) {
-        Object[] listenerArray = listeners.getListeners();
-        
-        for (int i = 0; i < listenerArray.length; i++) {
-            IConcurrentModelListener next = (IConcurrentModelListener) listenerArray[i];
-            
-            next.update(updated);
-        }
-    }
-    
-    /**
-     * Returns the array of listeners for this model
-     * 
-     * @return the array of listeners for this model 
-     */
-    protected final IConcurrentModelListener[] getListeners() {
-    	Object[] l = listeners.getListeners();
-    	IConcurrentModelListener[] result = new IConcurrentModelListener[l.length];
-    	
-    	for (int i = 0; i < l.length; i++) {
-			result[i] = (IConcurrentModelListener)l[i];
-		}
-    	
-    	return result;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.deferred.IConcurrentContentProvider#removeListener(org.eclipse.jface.viewers.deferred.IConcurrentContentProviderListener)
-     */
-    public void removeListener(IConcurrentModelListener listener) {
-        listeners.remove(listener);
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/AbstractVirtualTable.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/AbstractVirtualTable.java
deleted file mode 100644
index 7c8d6c1..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/AbstractVirtualTable.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers.deferred;
-
-import org.eclipse.swt.widgets.Control;
-
-/**
- * Wrapper for a virtual-table-like widget. Contains all methods needed for lazy updates.
- * The JFace algorithms for deferred or lazy content providers should talk to this class
- * instead of directly to a TableViewer. This will allow them to be used with other virtual
- * viewers and widgets in the future.
- * 
- * <p>
- * For example, if SWT starts to support virtual Lists in the future, it should be possible
- * to create an adapter from <code>AbstractVirtualTable</code> to <code>ListViewer</code> in 
- * order to reuse the existing algorithms for deferred updates. 
- * </p>
- * 
- * <p>
- * This is package visiblity by design. It would only need to be made public if there was
- * a demand to use the deferred content provider algorithms like 
- * <code>BackgroundContentProvider</code> with non-JFace viewers.
- * </p>
- * 
- * @since 3.1
- */
-abstract class AbstractVirtualTable {
-    /**
-     * Tells the receiver that the item at given row has changed. This may indicate
-     * that a different element is now at this row, but does not necessarily indicate
-     * that the element itself has changed. The receiver should request information for
-     * this row the next time it becomes visibile.
-     * 
-     * @param index row to clear
-     */
-    public abstract void clear(int index);
-    
-    /**
-     * Notifies the receiver that the given element is now located at the given index.
-     * 
-     * @param element object located at the row
-     * @param itemIndex row number
-     */
-    public abstract void replace(Object element, int itemIndex);
-    
-    /**
-     * Sets the item count for this table 
-     * 
-     * @param total new total number of items
-     */
-    public abstract void setItemCount(int total);
-    
-    /**
-     * Returns the index of the top item visible in the table
-     * 
-     * @return the index of the top item visible in the table
-     */
-    public abstract int getTopIndex();
-    
-    /**
-     * Returns the number of items currently visible in the table. This is
-     * the size of the currently visible window, not the total size of the table.
-     * 
-     * @return the number of items currently visible in the table
-     */
-    public abstract int getVisibleItemCount();
-    
-    /**
-     * Returns the total number of items in the table
-     * 
-     * @return the total number of items in the table
-     */
-    public abstract int getItemCount();
-    
-    /**
-     * Returns the SWT control that this API is wrappering.
-     * @return Control.
-     */
-    public abstract Control getControl();
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/BackgroundContentProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/BackgroundContentProvider.java
deleted file mode 100644
index c7c776b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/BackgroundContentProvider.java
+++ /dev/null
@@ -1,572 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers.deferred;
-
-import java.util.Comparator;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.AcceptAllFilter;
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.jface.viewers.deferred.ConcurrentTableUpdator.Range;
-
-/**
- * Contains the algorithm for performing background sorting and filtering in a virtual
- * table. This is the real implementation for <code>DeferredContentProvider</code>.
- * However, this class will work with anything that implements <code>AbstractVirtualTable</code>
- * rather than being tied to a <code>TableViewer</code>.
- * 
- * <p>
- * This is package visiblity since it currently only needs to be used in one place,
- * but it could potentially be made public if there was a need to use the same background
- * sorting algorithm for something other than a TableViewer. 
- * </p>
- * 
- * <p>
- * Information flow is like this:
- * </p>
- * <ol>
- * <li>IConcurrentModel sends unordered elements to BackgroundContentProvider (in a background thread)</li>
- * <li>BackgroundContentProvider sorts, filters, and sends element/index pairs to
- *     ConcurrentTableUpdator (in a background thread)</li>
- * <li>ConcurrentTableUpdator batches the updates and sends them to an AbstractVirtualTable 
- *     (in the UI thread)</li>  
- * </ol>
- * 
- * <p>
- * Internally, sorting is done using a <code>LazySortedCollection</code>. This data structure
- * allows the content provider to locate and sort the visible range without fully sorting
- * all elements in the table. It also supports fast cancellation, allowing the visible range
- * to change in the middle of a sort without discarding partially-sorted information from
- * the previous range.
- * </p>
- * 
- * @since 3.1
- */
-/* package */ final class BackgroundContentProvider {
-    
-	/**
-	 * Sorting message string
-	 */
-    private static final String SORTING = JFaceResources.getString("Sorting"); //$NON-NLS-1$
-
-    /**
-     * Table limit. -1 if unlimited
-     */
-	private int limit = -1;
-	
-	/**
-	 * Model that is currently providing input to this content provider.
-	 */
-    private IConcurrentModel model;
-    
-    /**
-     * Current sort order 
-     */
-    private volatile Comparator sortOrder;
-    
-    /**
-     * True iff the content provider has 
-     */
-    private volatile IFilter filter = AcceptAllFilter.getInstance();
-    
-    /**
-     * Queued changes
-     */
-    private ChangeQueue changeQueue = new ChangeQueue();
-    
-    /**
-     * Listener that gets callbacks from the model
-     */
-    private IConcurrentModelListener listener = new IConcurrentModelListener() {
-    	/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.deferred.IConcurrentModelListener#add(java.lang.Object[])
-		 */
-		public void add(Object[] added) {
-			BackgroundContentProvider.this.add(added);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.deferred.IConcurrentModelListener#remove(java.lang.Object[])
-		 */
-		public void remove(Object[] removed) {
-			BackgroundContentProvider.this.remove(removed);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.deferred.IConcurrentModelListener#setContents(java.lang.Object[])
-		 */
-		public void setContents(Object[] newContents) {
-			BackgroundContentProvider.this.setContents(newContents);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.deferred.IConcurrentModelListener#update(java.lang.Object[])
-		 */
-		public void update(Object[] changed) {
-			BackgroundContentProvider.this.update(changed);
-		}
-		
-    };
-
-    /**
-     * Object that posts updates to the UI thread. Must synchronize on
-     * sortMutex when accessing. 
-     */
-    private ConcurrentTableUpdator updator;
-    
-    private IProgressMonitor sortingProgressMonitor = new NullProgressMonitor();
-    private Thread sortThread = null;
-
-	private volatile FastProgressReporter sortMon = new FastProgressReporter();
-
-	private volatile Range range = new Range(0,0);
-    
-    /**
-     * Creates a new background content provider
-     *  
-     * @param table table that will receive updates
-     * @param model data source
-     * @param sortOrder initial sort order
-     */
-    public BackgroundContentProvider(AbstractVirtualTable table, 
-            IConcurrentModel model, Comparator sortOrder) {
-        
-        updator = new ConcurrentTableUpdator(table);
-        this.model = model;
-        this.sortOrder = sortOrder;
-        model.addListener(listener);
-    }
-    
-    /**
-     * Cleans up this content provider, detaches listeners, frees up memory, etc. 
-     * Must be the last public method called on this object.
-     */
-    public void dispose() {
-        cancelSortJob();
-        updator.dispose();
-        model.removeListener(listener);
-    }
-    
-    /**
-     * Force a refresh. Asks the model to re-send its complete contents.
-     */
-    public void refresh() {
-    	if (updator.isDisposed()) {
-    		return;
-    	}
-        model.requestUpdate(listener);
-    }
-
-    /**
-     * Called from sortJob. Sorts the elements defined by sortStart and sortLength.
-     * Schedules a UI update when finished.
-     * 
-     * @param mon monitor where progress will be reported
-     */
-    private void doSort(IProgressMonitor mon) {        
-        
-        // Workaround for some weirdness in the Jobs framework: if you cancel a monitor
-        // for a job that has ended and reschedule that same job, it will start 
-        // the job with a monitor that is already cancelled. We can workaround this by
-        // removing all references to the progress monitor whenever the job terminates,
-        // but this would require additional synchronize blocks (which are slow) and more
-        // complexity. Instead, we just un-cancel the monitor at the start of each job. 
-        mon.setCanceled(false);
-
-       	mon.beginTask(SORTING, 100);
-       	
-        // Create a LazySortedCollection
-        Comparator order = sortOrder;
-        IFilter f = filter;
-        LazySortedCollection collection = new LazySortedCollection(order);
-        
-        // Fill it in with all existing known objects
-        Object[] knownObjects = updator.getKnownObjects();
-        for (int i = 0; i < knownObjects.length; i++) {
-			Object object = knownObjects[i];
-			if (object != null) {
-				collection.add(object);
-			}
-		}
-
-        boolean dirty = false;
-        int prevSize = knownObjects.length;
-        updator.setTotalItems(prevSize);
-        
-		// Start processing changes
-        while(true) {
-        	// If the sort order has changed, build a new LazySortedCollection with
-        	// the new comparator
-        	if (order != sortOrder) {
-        		dirty = true;
-        		order = sortOrder;
-        		// Copy all elements from the old collection to the new one 
-        		LazySortedCollection newCollection = new LazySortedCollection(order);
-        		
-        		Object[] items = collection.getItems(false);
-        		for (int j = 0; j < items.length && order == sortOrder; j++) {
-					Object item = items[j];
-					
-					newCollection.add(item);
-				}
-        		
-        		// If the sort order changed again, re-loop
-				if (order != sortOrder) {
-					continue;
-				}
-				collection = newCollection;
-				continue;
-        	} 
-        	
-        	// If the filter has changed
-        	if (f != filter) {
-        		dirty = true;
-        		f = filter;
-        		
-        		Object[] items = collection.getItems(false);
-        		
-        		// Remove any items that don't pass the new filter
-        		for (int j = 0; j < items.length && f == filter; j++) {
-					Object toTest = items[j];
-					
-					if (!f.select(toTest)) {
-						collection.remove(toTest);
-					}
-				}
-        		continue;
-        	}
-        
-        	// If there are pending changes, process one of them
-        	if (!changeQueue.isEmpty()) {
-        		dirty = true;
-	        	ChangeQueue.Change next = changeQueue.dequeue();
-	        	
-	        	switch(next.getType()) {
-		        	case ChangeQueue.ADD: {
-		            	filteredAdd(collection, next.getElements(), f);
-		        		break;
-		        	}
-		        	case ChangeQueue.REMOVE: {
-		        		Object[] toRemove = next.getElements();
-	
-		                flush(toRemove, collection);
-		                collection.removeAll(toRemove);
-	
-		        		break;
-		        	}
-		        	case ChangeQueue.UPDATE: {
-		        		Object[] items  = next.getElements();
-		        		
-	        	        for (int i = 0; i < items.length; i++) {
-	        	            Object item = items[i];
-	        	            
-	        	            if (collection.contains(item)) {
-	        	                // TODO: write a collection.update(...) method
-	        	                collection.remove(item);
-	        	                collection.add(item);
-	        	                updator.clear(item);        	                
-	        	            }
-	        	        }
-		        	        
-		        		break;
-		        	}
-		        	case ChangeQueue.SET: {
-		        		Object[] items = next.getElements();
-		        		collection.clear();
-		        		filteredAdd(collection, items, f);
-		        	        
-		        		break;
-		        	}
-	        	}
-	        	
-	        	continue;
-        	}
-        	
-	        int totalElements = collection.size();
-            if (limit != -1) {
-                if (totalElements > limit) {
-                    totalElements = limit;
-                }
-            }
-            
-            if (totalElements != prevSize) {
-            	prevSize = totalElements;
-	            // Send the total items to the updator ASAP -- the user may want
-	            // to scroll to a different section of the table, which would
-	            // cause our sort range to change and cause this job to get cancelled.
-		        updator.setTotalItems(totalElements);
-		        dirty = true;
-            }
-            
-            // Terminate loop
-            if (!dirty) {
-            	break;
-            }
-        	
-            try {
-            	ConcurrentTableUpdator.Range updateRange = updator.getVisibleRange();
-            	sortMon = new FastProgressReporter();
-            	range = updateRange;
-            	int sortStart = updateRange.start;
-            	int sortLength = updateRange.length;
-            
-		        if (limit != -1) {
-		            collection.retainFirst(limit, sortMon);
-		        }
-
-		        sortLength = Math.min(sortLength, totalElements - sortStart);
-		        sortLength = Math.max(sortLength, 0);
-		        
-		        Object[] objectsOfInterest = new Object[sortLength];
-		     
-		        collection.getRange(objectsOfInterest, sortStart, true, sortMon);
-		        
-		        // Send the new elements to the table
-		        for (int i = 0; i < sortLength; i++) {
-					Object object = objectsOfInterest[i];
-					updator.replace(object, sortStart + i);
-				}
-		        
-			    objectsOfInterest = new Object[collection.size()];
-			        
-			    collection.getFirst(objectsOfInterest, true, sortMon);
-		        
-		        // Send the new elements to the table
-		        for (int i = 0; i < totalElements; i++) {
-					Object object = objectsOfInterest[i];
-					updator.replace(object, i);
-				}
-
-            } catch (InterruptedException e) {
-            	continue;
-            }
-            
-            dirty = false;
-	    }
-        
-        mon.done();
-    }
-
-	/**
-	 * @param collection
-	 * @param toAdd
-	 */
-	private static void filteredAdd(LazySortedCollection collection, Object[] toAdd, IFilter filter) {
-		if (filter != AcceptAllFilter.getInstance()) { 
-			for (int i = 0; i < toAdd.length; i++) {
-				Object object = toAdd[i];
-				
-				if (filter.select(object)) {
-					collection.add(object);
-				}
-			}
-		} else {
-			collection.addAll(toAdd);
-		}
-	}
-    
-    /**
-     * Sets the sort order for this content provider
-     * 
-     * @param sorter sort order
-     */
-    public void setSortOrder(Comparator sorter) {
-    	Assert.isNotNull(sorter);
-        this.sortOrder = sorter;
-    	sortMon.cancel();
-        refresh();
-    }
-    
-    /**
-     * Sets the filter for this content provider
-     * 
-     * @param toSet filter to set
-     */
-    public void setFilter(IFilter toSet) {
-    	Assert.isNotNull(toSet);
-    	this.filter = toSet;
-    	sortMon.cancel();
-    	refresh();
-    }
-    
-    /**
-     * Sets the maximum table size. Based on the current sort order,
-     * the table will be truncated if it grows beyond this size.
-     * Using a limit improves memory usage and performance, and is
-     * strongly recommended for large tables. 
-     * 
-     * @param limit maximum rows to show in the table or -1 if unbounded
-     */
-    public void setLimit(int limit) {
-        this.limit = limit;
-        refresh();
-    }
-    
-    /**
-     * Returns the maximum table size or -1 if unbounded
-     * 
-     * @return the maximum number of rows in the table or -1 if unbounded
-     */
-    public int getLimit() {
-        return limit;
-    }
-    
-    /**
-     * Checks if currently visible range has changed, and triggers and update
-     * and resort if necessary. Must be called in the UI thread, typically
-     * within a SWT.SetData callback.
-     * @param includeIndex the index that should be included in the visible range.
-     */
-    public void checkVisibleRange(int includeIndex) {
-    	updator.checkVisibleRange(includeIndex);
-		ConcurrentTableUpdator.Range newRange = updator.getVisibleRange();
-		ConcurrentTableUpdator.Range oldRange = range;
-		
-		// If we're in the middle of processing an invalid range, cancel the sort
-		if (newRange.start != oldRange.start || newRange.length != oldRange.length) {
-			sortMon.cancel();
-		}
-    }
-    
-    /**
-     * This lock protects the two boolean variables sortThreadStarted and resortScheduled.
-     */
-    private Object lock = new Object();
-
-    /**
-     * true if the sort thread is running
-     */
-    private boolean sortThreadStarted = false;
-
-    /**
-     * true if we need to sort
-     */
-    private boolean sortScheduled = false;
-    
-	private final class SortThread extends Thread {
-		private SortThread(String name) {
-			super(name);
-		}
-
-		public void run() {
-			loop: while (true) {
-				synchronized (lock) {
-					sortScheduled = false;
-				}
-				try {
-					// this is the main work
-					doSort(sortingProgressMonitor);
-				} catch (Exception ex) {
-					// ignore
-				}
-				synchronized (lock) {
-					if (sortScheduled) {
-						continue loop;
-					}
-					sortThreadStarted = false;
-					break loop;
-				}
-			}
-		}
-	}
-    
-    /**
-     * Must be called whenever the model changes. Dirties this object and triggers a sort
-     * if necessary. 
-     */
-    private void makeDirty() {
-		synchronized (lock) {
-			sortMon.cancel();
-			// request sorting
-			sortScheduled = true;
-			if (!sortThreadStarted) {
-				sortThreadStarted = true;
-				sortThread = new SortThread(SORTING);
-				sortThread.setDaemon(true);
-				sortThread.setPriority(Thread.NORM_PRIORITY - 1);
-				sortThread.start();
-			}
-		}
-	}
-    
-    /**
-	 * Cancels any sort in progress. Note that we try to use the
-	 * FastProgresReporter if possible since this is more responsive than
-	 * cancelling the sort job. However, it is not a problem to cancel in both
-	 * ways.
-	 */
-    private void cancelSortJob() {
-        sortMon.cancel();
-        sortingProgressMonitor.setCanceled(true);
-    }
-    
-    /**
-	 * Called when new elements are added to the model.
-	 * 
-	 * @param toAdd
-	 *            newly added elements
-	 */
-    private void add(Object[] toAdd) {
-    	changeQueue.enqueue(ChangeQueue.ADD, toAdd);
-    	makeDirty();
-    }
-    
-    /**
-     * Called with the complete contents of the model
-     * 
-     * @param contents new contents of the model
-     */
-    private void setContents(Object[] contents) {
-    	changeQueue.enqueue(ChangeQueue.SET, contents);
-    	makeDirty();
-    }
-
-    /**
-     * Called when elements are removed from the model
-     * 
-     * @param toRemove elements removed from the model
-     */
-    private void remove(Object[] toRemove) {
-        changeQueue.enqueue(ChangeQueue.REMOVE, toRemove);
-        makeDirty();
-        refresh();
-    }
-
-    /**
-     * Notifies the updator that the given elements have changed 
-     * 
-     * @param toFlush changed elements
-     * @param collection collection of currently-known elements
-     */
-    private void flush(Object[] toFlush, LazySortedCollection collection) {
-        for (int i = 0; i < toFlush.length; i++) {
-            Object item = toFlush[i];
-            
-            if (collection.contains(item)) {
-                updator.clear(item);
-            }
-        }
-    }
-
-
-    /**
-     * Called when elements in the model change
-     * 
-     * @param items changed items
-     */
-    private void update(Object[] items) {
-        changeQueue.enqueue(ChangeQueue.UPDATE, items);
-        makeDirty();
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/ChangeQueue.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/ChangeQueue.java
deleted file mode 100644
index 575bde3..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/ChangeQueue.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers.deferred;
-
-import java.util.Iterator;
-import java.util.LinkedList;
-
-/**
- * Holds a queue of additions, removals, updates, and SET calls for a
- * BackgroundContentProvider
- */
-final class ChangeQueue {
-	/**
-	 * Represents the addition of an item
-	 * @since 3.1
-	 */
-	public static final int ADD = 0;
-	/**
-	 * Represents the removal of an item
-	 * @since 3.1
-	 */
-	public static final int REMOVE = 1;
-	/**
-	 * Represents a reset of all the items
-	 * @since 3.1
-	 */
-	public static final int SET = 2;
-	/**
-	 * Represents an update of an item
-	 * @since 3.1
-	 */
-	public static final int UPDATE = 3;
-	
-	/**
-	 * 
-	 * @since 3.1
-	 */
-	public static final class Change {
-		private int type;
-		private Object[] elements;
-		
-		/**
-		 * Create a change of the specified type that affects the given elements.
-		 * 
-		 * @param type one of <code>ADD</code>, <code>REMOVE</code>, <code>SET</code>, or <code>UPDATE</code>.
-		 * @param elements the elements affected by the change.
-		 * 
-		 * @since 3.1
-		 */
-		public Change(int type, Object[] elements) {
-			this.type = type;
-			this.elements = elements;
-		}
-		
-		/**
-		 * Get the type of change.
-		 * @return one of <code>ADD</code>, <code>REMOVE</code>, <code>SET</code>, or <code>UPDATE</code>.
-		 * 
-		 * @since 3.1
-		 */
-		public int getType() {
-			return type;
-		}
-		
-		/**
-		 * Return the elements associated with the change.
-		 * @return the elements affected by the change.
-		 * 
-		 * @since 3.1
-		 */
-		public Object[] getElements() {
-			return elements;
-		}
-	}
-	
-	private LinkedList queue = new LinkedList();
-	private int workload = 0;
-	
-	/**
-	 * Create a change of the given type and elements and enqueue it.
-	 * 
-	 * @param type the type of change to be created
-	 * @param elements the elements affected by the change
-	 */
-	public synchronized void enqueue(int type, Object[] elements) {
-		enqueue(new Change(type, elements));
-	}
-	
-	/**
-	 * Add the specified change to the queue
-	 * @param toQueue the change to be added
-	 */
-	public synchronized void enqueue(Change toQueue) {
-		// A SET event makes all previous adds, removes, and sets redundant... so remove
-		// them from the queue
-		if (toQueue.type == SET) {
-			workload = 0;
-			LinkedList newQueue = new LinkedList();
-			for (Iterator iter = queue.iterator(); iter.hasNext();) {
-				Change next = (Change) iter.next();
-				
-				if (next.getType() == ADD || next.getType() == REMOVE || next.getType() == SET) {
-					continue;
-				}
-				
-				newQueue.add(next);
-				workload += next.elements.length;
-			}
-			queue = newQueue;
-		}
-		
-		queue.add(toQueue);
-		workload += toQueue.elements.length;
-	}
-	
-	/**
-	 * Remove the first change from the queue.
-	 * @return the first change
-	 */
-	public synchronized Change dequeue() {
-		Change result = (Change)queue.removeFirst();
-		
-		workload -= result.elements.length;
-		return result;
-	}
-	
-	/**
-	 * Return whether the queue is empty
-	 * @return <code>true</code> if empty, <code>false</code> otherwise
-	 */
-	public synchronized boolean isEmpty() {
-		return queue.isEmpty();
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/ConcurrentTableUpdator.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/ConcurrentTableUpdator.java
deleted file mode 100644
index b8d8054..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/ConcurrentTableUpdator.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers.deferred;
-
-
-
-/**
- * Allows a table to be accessed from a background thread. Provides a table-like public 
- * interface that can accessed from a background thread. As updates arrive from the 
- * background thread, it batches and schedules updates to the real table in the UI thread. 
- * This class can be used with any widget that can be wrapped in the 
- * <code>AbstractVirtualTable</code> interface.  
- * 
- * @since 3.1
- */
-/* package */ final class ConcurrentTableUpdator {
-	/**
-	 * Wrapper for the real table. May only be accessed in the UI thread.
-	 */
-    private AbstractVirtualTable table;
-    
-    /**
-     * The array of objects that have been sent to the UI. Elements are null
-     * if they either haven't been sent yet or have been scheduled for clear. 
-     * Maps indices onto elements.
-     */
-    private Object[] sentObjects = new Object[0];
-    
-    /**
-     * Map of elements to object indices (inverse of the knownObjects array)
-     */
-    private IntHashMap knownIndices = new IntHashMap();
-    
-    /**
-     * Contains all known objects that have been sent here from the background
-     * thread.
-     */
-    private Object[] knownObjects = new Object[0];
-    
-    // Minimum length for the pendingFlushes stack
-    private static final int MIN_FLUSHLENGTH = 64;
-    
-    /**
-     * Array of element indices. Contains elements scheduled to be
-     * cleared. Only the beginning of the array is used. The number
-     * of used elements is stored in lastClear
-     */
-    private int[] pendingClears = new int[MIN_FLUSHLENGTH];
-    
-    /**
-     * Number of pending clears in the pendingClears array (this is normally
-     * used instead of pendingClears.length since the 
-     * pendingClears array is usually larger than the actual number of pending
-     * clears) 
-     */
-    private int lastClear = 0;
-    
-    /**
-     * Last known visible range
-     */    
-    private volatile Range lastRange = new Range(0,0);
-    
-    /**
-     * True iff a UI update has been scheduled
-     */
-    private volatile boolean updateScheduled;
-    
-    /**
-     * True iff this object has been disposed
-     */
-    private volatile boolean disposed = false;
-    
-    /**
-     * Object that holds a start index and length. Allows
-     * the visible range to be returned as an atomic operation.
-     */
-    public final static class Range {
-        int start = 0;
-        int length = 0;
-        
-        /**
-         * @param s
-         * @param l
-         */
-        public Range(int s, int l) {
-            start = s;
-            length = l;
-        }
-    }
-    
-    /**
-     * Runnable that can be posted with an asyncExec to schedule
-     * an update to the real table.  
-     */
-    Runnable uiRunnable = new Runnable() {
-        public void run() {
-            updateScheduled = false;
-            if(!table.getControl().isDisposed()) {
-				updateTable();
-			}
-        }
-    };
-    
-    /**
-     * Creates a new table updator
-     * 
-     * @param table real table to update
-     */
-    public ConcurrentTableUpdator(AbstractVirtualTable table) {
-        this.table = table;
-    }
-    
-    /**
-     * Cleans up the updator object (but not the table itself).
-     */
-    public void dispose() {
-    	disposed = true;
-    }
-    
-    /**
-     * True iff this object has been disposed. 
-     * 
-     * @return true iff dispose() has been called
-     */
-    public boolean isDisposed() {
-    	return disposed;
-    }
-    
-    /**
-     * Returns the currently visible range
-     * 
-     * @return the currently visible range
-     */
-    public Range getVisibleRange() {
-    	return lastRange;
-    }
-    
-    /**
-     * Marks the given object as dirty. Will cause it to be cleared
-     * in the table. 
-     * 
-     * @param toFlush
-     */
-    public void clear(Object toFlush) {
-        synchronized(this) {
-            int currentIdx = knownIndices.get(toFlush, -1);
-
-            // If we've never heard of this object, bail out.
-            if (currentIdx == -1) {
-                return;
-            }
-
-            pushClear(currentIdx);
-        }
-        
-    }
-    
-    /**
-     * Sets the size of the table. Called from a background thread.
-     * 
-     * @param newTotal
-     */
-    public void setTotalItems(int newTotal) {
-        synchronized (this) {
-            if (newTotal != knownObjects.length) {
-                if (newTotal < knownObjects.length) {
-                    // Flush any objects that are being removed as a result of the resize
-                    for (int i = newTotal; i < knownObjects.length; i++) {
-                        Object toFlush = knownObjects[i];
-                        
-                        if (toFlush != null) {
-                        	knownIndices.remove(toFlush);
-                        }
-                    }
-                }
-                
-                int minSize = Math.min(knownObjects.length, newTotal);
-                
-	            Object[] newKnownObjects = new Object[newTotal];
-	            System.arraycopy(knownObjects, 0, newKnownObjects, 0, minSize);
-	            knownObjects = newKnownObjects;
-	            	            
-	            scheduleUIUpdate();
-            }
-        }
-    }
-    
-    /**
-     * Pushes an index onto the clear stack
-     * 
-     * @param toClear row to clear
-     */
-    private void pushClear(int toClear) {
-        
-    	// If beyond the end of the table
-    	if (toClear >= sentObjects.length) {
-    		return;
-    	}
-    	
-    	// If already flushed or never sent
-        if (sentObjects[toClear] == null) {
-        	return;            
-        }
-
-        // Mark as flushed
-        sentObjects[toClear] = null;
-    	
-        if (lastClear >= pendingClears.length) {
-            int newCapacity = Math.min(MIN_FLUSHLENGTH, lastClear * 2);
-            int[] newPendingClears = new int[newCapacity];
-            System.arraycopy(pendingClears, 0, newPendingClears, 0, lastClear);
-            pendingClears = newPendingClears;
-        }
-        
-        pendingClears[lastClear++] = toClear;
-    }
-    
-    /**
-     * Sets the item on the given row to the given value. May be called from a background
-     * thread. Schedules a UI update if necessary
-     * 
-     * @param idx row to change
-     * @param value new value for the given row
-     */
-    public void replace(Object value, int idx) {        
-        // Keep the synchronized block as small as possible, since the UI may
-        // be waiting on it.
-        synchronized(this) {
-            Object oldObject = knownObjects[idx];
-            
-            if (oldObject != value) {
-            	if (oldObject != null) {
-            		knownIndices.remove(oldObject);
-            	}
-            	
-                knownObjects[idx] = value;
-                
-            	if (value != null) {
-	        		int oldIndex = knownIndices.get(value, -1);
-	        		if (oldIndex != -1) {
-	        			knownObjects[oldIndex] = null;
-	        			pushClear(oldIndex);
-	        		}
-	        		
-	        		knownIndices.put(value, idx);
-            	}
-                
-                pushClear(idx);
-                
-                scheduleUIUpdate();
-            }
-        } 
-    }
-
-    /**
-     * Schedules a UI update. Has no effect if an update has already been
-     * scheduled.
-     */
-    private void scheduleUIUpdate() {
-        synchronized(this) {
-	        if (!updateScheduled) {
-	            updateScheduled = true;
-	            if(!table.getControl().isDisposed()) {
-					table.getControl().getDisplay().asyncExec(uiRunnable);
-				}
-	        }
-        }
-    }
-    
-    
-    /**
-     * Called in the UI thread by a SetData callback. Refreshes the
-     * table if necessary. Returns true iff a refresh is needed.
-     * @param includeIndex the index that should be included in the visible range.
-     */
-    public void checkVisibleRange(int includeIndex) {
-        int start = Math.min(table.getTopIndex() - 1, includeIndex);
-        int length = Math.max(table.getVisibleItemCount(), includeIndex - start);
-        Range r = lastRange;
-
-    	if (start != r.start || length != r.length) {
-    		updateTable();
-    	}
-    }
-    
-    /**
-     * Updates the table. Sends any unsent items in the visible range to the table,
-     * and clears any previously-visible items that have not yet been sent to the table.
-     * Must be called from the UI thread.
-     */
-    private void updateTable() {    	
-        
-        synchronized(this) {
-
-        	// Resize the table if necessary
-	        if (sentObjects.length != knownObjects.length) {
-	        	Object[] newSentObjects = new Object[knownObjects.length];
-	        	System.arraycopy(newSentObjects, 0, sentObjects, 0, 
-	        			Math.min(newSentObjects.length, sentObjects.length));
-	        	sentObjects = newSentObjects;
-	            table.setItemCount(newSentObjects.length);
-	        }
-
-	        // Compute the currently visible range
-	        int start = Math.min(table.getTopIndex(), knownObjects.length);
-	        int length = Math.min(table.getVisibleItemCount(), knownObjects.length - start);
-	        int itemCount = table.getItemCount();
-            
-        	int oldStart = lastRange.start;
-        	int oldLen = lastRange.length;
-        	
-        	// Store the visible range. Do it BEFORE sending any table.clear calls,
-        	// since clearing a visible row will result in a SetData callback which
-        	// cause another table update if the visible range is different from
-        	// the stored values -- this could cause infinite recursion.
-        	lastRange = new Range(start, length);
-        	
-			// Re-clear any items in the old range that were never filled in
-			for(int idx = 0; idx < oldLen; idx++) {
-				int row = idx + oldStart;
-				
-				// If this item is no longer visible
-				if (row < itemCount && (row < start || row >= start + length)) {
-					
-					// Note: if we wanted to be really aggressive about clearing
-					// items that are no longer visible, we could clear here unconditionally.
-					// The current way of doing things won't clear a row if its contents are
-					// up-to-date.
-					if (sentObjects[row] == null) {
-						table.clear(row);
-					}
-				}
-			}
-			
-			// Process any pending clears
-	        if (lastClear > 0) {
-				for (int i = 0; i < lastClear; i++) {
-					int row = pendingClears[i];
-		
-					if (row < sentObjects.length) {
-						table.clear(row);
-					}
-				}
-	
-				if (pendingClears.length > MIN_FLUSHLENGTH) {
-					pendingClears = new int[MIN_FLUSHLENGTH];
-				}
-				lastClear = 0;
-	        }
-		    
-	        // Send any unsent items in the visible range
-	        for (int idx = 0; idx < length; idx++) {
-	        	int row = idx + start;
-	        	
-	        	Object obj = knownObjects[row];
-	        	if (obj != null && obj != sentObjects[idx]) {
-	        		table.replace(obj, row);
-	        		sentObjects[idx] = obj;
-	        	}
-	        }
-	        
-        }
-    }
-
-	/**
-	 * Return the array of all known objects that have been sent here from the background
-     * thread.
-	 * @return the array of all known objects
-	 */
-	public Object[] getKnownObjects() {
-		return knownObjects;
-	}
-    
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/DeferredContentProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/DeferredContentProvider.java
deleted file mode 100644
index c2fa302..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/DeferredContentProvider.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers.deferred;
-
-import java.util.Comparator;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.AcceptAllFilter;
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.jface.viewers.ILazyContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Table;
-
-/**
- * Content provider that performs sorting and filtering in a background thread.
- * Requires a <code>TableViewer</code> created with the <code>SWT.VIRTUAL</code>
- * flag and an <code>IConcurrentModel</code> as input.
- * <p>
- * The sorter and filter must be set directly on the content provider.
- * Any sorter or filter on the TableViewer will be ignored. 
- * </p>
- *  
- * <p>
- * The real implementation is in <code>BackgroundContentProvider</code>. This 
- * object is a lightweight wrapper that adapts the algorithm to work with 
- * <code>TableViewer</code>.
- * </p>
- * 
- * @since 3.1
- */
-public class DeferredContentProvider implements ILazyContentProvider {
-
-	private int limit = -1;
-	private BackgroundContentProvider provider;
-	private Comparator sortOrder;
-	private IFilter filter = AcceptAllFilter.getInstance();
-	private AbstractVirtualTable table;
-	
-	private static final class TableViewerAdapter extends AbstractVirtualTable {
-		
-		private TableViewer viewer;
-		
-		/**
-		 * @param viewer
-		 */
-		public TableViewerAdapter(TableViewer viewer) {
-			this.viewer = viewer;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.deferred.AbstractVirtualTable#flushCache(java.lang.Object)
-		 */
-		public void clear(int index) {
-			viewer.clear(index);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.deferred.AbstractVirtualTable#replace(java.lang.Object, int)
-		 */
-		public void replace(Object element, int itemIndex) {
-			viewer.replace(element, itemIndex);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.deferred.AbstractVirtualTable#setItemCount(int)
-		 */
-		public void setItemCount(int total) {
-			viewer.setItemCount(total);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.deferred.AbstractVirtualTable#getItemCount()
-		 */
-		public int getItemCount() {
-			return viewer.getTable().getItemCount();
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.deferred.AbstractVirtualTable#getTopIndex()
-		 */
-		public int getTopIndex() {
-			return Math.max(viewer.getTable().getTopIndex() - 1, 0);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.deferred.AbstractVirtualTable#getVisibleItemCount()
-		 */
-		public int getVisibleItemCount() {
-			Table table = viewer.getTable();
-			Rectangle rect = table.getClientArea ();
-			int itemHeight = table.getItemHeight ();
-			int headerHeight = table.getHeaderHeight ();
-			return (rect.height - headerHeight + itemHeight - 1) / (itemHeight + table.getGridLineWidth());
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.deferred.AbstractVirtualTable#getControl()
-		 */
-		public Control getControl() {
-			return viewer.getControl();
-		}
-		
-	}
-
-	/**
-	 * Create a DeferredContentProvider with the given sort order.
-	 * @param sortOrder a comparator that sorts the content.
-	 */
-	public DeferredContentProvider(Comparator sortOrder) {
-		this.sortOrder = sortOrder;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-		setProvider(null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		if (newInput == null) {
-			setProvider(null);
-			return;
-		}
-		
-		Assert.isTrue(newInput instanceof IConcurrentModel);
-		Assert.isTrue(viewer instanceof TableViewer);
-		IConcurrentModel model = (IConcurrentModel)newInput;
-		
-		this.table = new TableViewerAdapter((TableViewer)viewer);
-		
-		BackgroundContentProvider newProvider = new BackgroundContentProvider(
-				table,
-				model, sortOrder); 
-		
-		setProvider(newProvider);
-		
-		newProvider.setLimit(limit);
-		newProvider.setFilter(filter);
-	}
-	
-	/**
-	 * Sets the sort order for this content provider. This sort order takes priority
-	 * over anything that was supplied to the <code>TableViewer</code>.
-	 * 
-	 * @param sortOrder new sort order. The comparator must be able to support being
-	 * used in a background thread.
-	 */
-	public void setSortOrder(Comparator sortOrder) {
-		Assert.isNotNull(sortOrder);
-		this.sortOrder = sortOrder;
-		if (provider != null) {
-			provider.setSortOrder(sortOrder);
-		}
-	}
-	
-	/**
-	 * Sets the filter for this content provider. This filter takes priority over
-	 * anything that was supplied to the <code>TableViewer</code>. The filter
-	 * must be capable of being used in a background thread.
-	 * 
-	 * @param toSet filter to set
-	 */
-	public void setFilter(IFilter toSet) {
-		this.filter = toSet;
-		if (provider != null) {
-			provider.setFilter(toSet);
-		}
-	}
-	
-	/**
-	 * Sets the maximum number of rows in the table. If the model contains more
-	 * than this number of elements, only the top elements will be shown based on
-	 * the current sort order. 
-	 * 
-	 * @param limit maximum number of rows to show or -1 if unbounded
-	 */
-	public void setLimit(int limit) {
-		this.limit = limit;
-		if (provider != null) {
-			provider.setLimit(limit);
-		}
-	}
-	
-	/**
-	 * Returns the current maximum number of rows or -1 if unbounded
-	 * 
-	 * @return the current maximum number of rows or -1 if unbounded
-	 */
-	public int getLimit() {
-		return limit;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILazyContentProvider#updateElement(int)
-	 */
-	public void updateElement(int element) {
-		if (provider != null) {
-			provider.checkVisibleRange(element);
-		}
-	}
-	
-	private void setProvider(BackgroundContentProvider newProvider) {
-		if (provider != null) {
-			provider.dispose();
-		}
-		
-		provider = newProvider;
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/FastProgressReporter.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/FastProgressReporter.java
deleted file mode 100644
index 35a360b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/FastProgressReporter.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers.deferred;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * A more efficient alternative to an IProgressMonitor. In particular, the implementation
- * is designed to make isCanceled() run as efficiently as possible. Currently package-visible
- * because the implementation is incomplete.
- * 
- * @since 3.1
- */
-final class FastProgressReporter {
-    private IProgressMonitor monitor;
-    private volatile boolean canceled = false;
-    private int cancelCheck = 0;
-//    private String taskName;
-//    
-//    private int taskDepth = 0;
-//    private int subTaskSize = 1;
-//    private int totalWork = 1;
-//    private int parentWork = 1;
-//    private int monitorUnitsRemaining;
-    
-    private static int CANCEL_CHECK_PERIOD = 40;
-    
-    /**
-     * Constructs a null FastProgressReporter
-     */
-    public FastProgressReporter() {
-    }
-    
-    /**
-     * Constructs a FastProgressReporter that wraps the given progress monitor
-     * 
-     * @param monitor the monitor to wrap
-     * @param totalProgress the total progress to be reported
-     */
-    public FastProgressReporter(IProgressMonitor monitor, int totalProgress) {
-        this.monitor = monitor;
-        //monitorUnitsRemaining = totalProgress;
-        canceled = monitor.isCanceled();
-    }
-    
-//    /**
-//     * Every call to beginTask must have a corresponding call to endTask, with the
-//     * same argument.
-//     * 
-//     * @param totalWork
-//     * @since 3.1
-//     */
-//    public void beginTask(int totalWork) {
-//        
-//        if (monitor == null) {
-//            return;
-//        }
-//        
-//        taskDepth++;
-//
-//        if (totalWork == 0) {
-//            return;
-//        }
-//        
-//        this.totalWork *= totalWork;
-//    }
-//    
-//    public void beginSubTask(int subTaskWork) {
-//        subTaskSize *= subTaskWork;
-//    }
-//    
-//    public void endSubTask(int subTaskWork) {
-//        subTaskSize /= subTaskWork;
-//    }
-//    
-//    public void worked(int amount) {
-//        amount *= subTaskSize;
-//        
-//        if (amount > totalWork) {
-//            amount = totalWork;
-//        }
-//        
-//        int consumed = monitorUnitsRemaining * amount / totalWork;
-//        
-//        if (consumed > 0) {
-//            monitor.worked(consumed);
-//            monitorUnitsRemaining -= consumed;
-//        }
-//        totalWork -= amount;
-//    }
-//    
-//    public void endTask(int totalWork) {        
-//        taskDepth--;
-//        
-//        if (taskDepth == 0) {
-//            if (monitor != null && monitorUnitsRemaining > 0) {
-//                monitor.worked(monitorUnitsRemaining);
-//            }
-//        }
-//        
-//        if (totalWork == 0) {
-//            return;
-//        }
-//        
-//        this.totalWork /= totalWork;
-//
-//    }
-    
-    /**
-     * Return whether the progress monitor has been canceled.
-     * 
-     * @return <code>true</code> if the monitor has been cancelled, <code>false</code> otherwise.
-     */
-    public boolean isCanceled() {
-        if (monitor == null) {
-            return canceled;
-        }
-        
-        cancelCheck++;
-        if (cancelCheck > CANCEL_CHECK_PERIOD) {
-            canceled = monitor.isCanceled();
-            cancelCheck = 0;
-        }
-        return canceled;
-    }
-    
-    /**
-     * Cancel the progress monitor.
-     */
-    public void cancel() {        
-        canceled = true;
-        
-        if (monitor == null) {
-            return;
-        }
-        monitor.setCanceled(true);
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/IConcurrentModel.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/IConcurrentModel.java
deleted file mode 100644
index 75326f5..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/IConcurrentModel.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers.deferred;
-
-
-/**
- * Interface for a set of unordered elements that can fire change notifications.
- * IConcurrentModel returns its contents asynchronous. Rather than implementing 
- * "get" methods, listeners can request an update and the model fires back
- * information at its earliest convenience.
- * 
- * <p>
- * The model is allowed to send back notifications to its listeners in any thread,
- * and the listeners must not assume that the notifications will arrive in the UI
- * thread.
- * </p>
- * 
- * <p>
- * Not intended to be implemented by clients. Clients should subclass 
- * <code>AbstractConcurrentModel</code> instead.
- * </p>
- * 
- * @since 3.1
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IConcurrentModel {
-
-    /**
-     * Requests that the receiver to call the given listener's setContents(...) 
-     * method at its earliest convenience. The receiver is allowed to compute the 
-     * elements asynchronously. That is, it can compute the result in a background 
-     * thread and call setContents(...) once the result is ready. If the result is
-     * too large to return in one batch, it can call setContents with an empty array
-     * followed by a sequence of adds.
-     * <p>
-     * Has no effect if an update is already queued for an identical listener.
-     * </p>
-     * 
-     * @param listener listener whose setContents method should be called. The
-     * listener must have been previously registered with addListener.
-     */
-    public void requestUpdate(IConcurrentModelListener listener);
-    
-    /**
-     * Adds a listener to this model. The listener should be given the model's
-     * current contents (either through setContents or a sequence of adds) at the
-     * receiver's earliest convenience. The receiver will notify the listener
-     * about any changes in state until the listener is removed.
-     * 
-     * <p>
-     * Has no effect if an identical listener is already registered.
-     * </p>
-     * 
-     * @param listener listener to add
-     */
-    public void addListener(IConcurrentModelListener listener);
-    
-    /**
-     * Removes a listener from this model. The receiver will stop sending
-     * notifications to the given listener as soon as possible (although
-     * some additional notifications may still if arrive if the receiver
-     * was in the process of sending notifications in another thread).
-     * Any pending updates for this listener will be cancelled.
-     * <p>
-     * Has no effect if the given listener is not known to this model.
-     * </p>
-     * 
-     * @param listener listener to remove
-     */
-    public void removeListener(IConcurrentModelListener listener);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/IConcurrentModelListener.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/IConcurrentModelListener.java
deleted file mode 100644
index be9075a..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/IConcurrentModelListener.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers.deferred;
-
-/**
- * Interface for objects that can listen to changes in an IConcurrentModel.
- * Elements in an IConcurrentModel are unordered.
- * 
- * @since 3.1
- */
-public interface IConcurrentModelListener {
-	
-	/**
-	 * Called when elements are added to the model 
-	 * 
-	 * @param added elements added to the model
-	 */
-    public void add(Object[] added);
-    
-    /**
-     * Called when elements are removed from the model
-     * 
-     * @param removed elements removed from the model
-     */
-    public void remove(Object[] removed);
-    
-    /**
-     * Called when elements in the model have changed
-     * 
-     * @param changed elements that have changed
-     */
-    public void update(Object[] changed);
-    
-    /**
-     * Notifies the receiver about the complete set
-     * of elements in the model. Most models will
-     * not call this method unless the listener explicitly
-     * requests it by calling 
-     * <code>IConcurrentModel.requestUpdate</code>
-     *  
-     * @param newContents contents of the model
-     */
-    public void setContents(Object[] newContents);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/IntHashMap.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/IntHashMap.java
deleted file mode 100644
index 6b6dd86..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/IntHashMap.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers.deferred;
-
-import java.util.HashMap;
-
-/**
- * Represents a map of objects onto ints. This is intended for future optimization:
- * using int primitives would allow for an implementation that doesn't require
- * additional object allocations for Integers. However, the current implementation
- * simply delegates to the Java HashMap class. 
- * 
- * @since 3.1
- */
-/* package */ class IntHashMap {
-    private HashMap map; 
-    
-    /**
-     * @param size
-     * @param loadFactor
-     */
-    public IntHashMap(int size, float loadFactor) {
-        map = new HashMap(size, loadFactor);
-    }
-    
-    /**
-     * 
-     */
-    public IntHashMap() {
-        map = new HashMap();
-    }
-    
-    /**
-     * @param key
-     */
-    public void remove(Object key) {
-        map.remove(key);
-    }
-    
-    /**
-     * @param key
-     * @param value
-     */
-    public void put(Object key, int value) {
-        map.put(key, new Integer(value));
-    }
-    
-    /**
-     * @param key
-     * @return the int value at the given key 
-     */
-    public int get(Object key) {
-        return get(key, 0);
-    }
-    
-    /**
-     * @param key
-     * @param defaultValue
-     * @return the int value at the given key, or the default value if this map does not contain the given key
-     */
-    public int get(Object key, int defaultValue) {
-        Integer result = (Integer)map.get(key);
-        
-        if (result != null) {
-            return result.intValue();
-        }
-        
-        return defaultValue;
-    }
-    
-    /**
-     * @param key
-     * @return <code>true</code> if this map contains the given key, <code>false</code> otherwise
-     */
-    public boolean containsKey(Object key) {
-        return map.containsKey(key);
-    }
-    
-    /**
-     * @return the number of key/value pairs
-     */
-    public int size() {
-    	return map.size();
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/LazySortedCollection.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/LazySortedCollection.java
deleted file mode 100644
index 2384f20..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/LazySortedCollection.java
+++ /dev/null
@@ -1,1432 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers.deferred;
-
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * This object maintains a collection of elements, sorted by a comparator
- * given in the constructor. The collection is lazily sorted, allowing 
- * more efficient runtimes for most methods. There are several methods on this
- * object that allow objects to be queried by their position in the sorted
- * collection.
- * 
- * <p>
- * This is a modified binary search tree. Each subtree has a value, a left and right subtree, 
- * a count of the number of children, and a set of unsorted children. 
- * Insertion happens lazily. When a new node N is inserted into a subtree T, it is initially 
- * added to the set of unsorted children for T without actually comparing it with the value for T. 
- * </p>
- * <p>
- * The unsorted children will remain in the unsorted set until some subsequent operation requires
- * us to know the exact set of elements in one of the subtrees. At that time, we partition
- * T by comparing all of its unsorted children with T's value and moving them into the left 
- * or right subtrees.
- * </p>
- * 
- * @since 3.1
- */
-public class LazySortedCollection {
-    private final int MIN_CAPACITY = 8;
-    private Object[] contents = new Object[MIN_CAPACITY];
-    private int[] leftSubTree = new int[MIN_CAPACITY];
-    private int[] rightSubTree = new int[MIN_CAPACITY];
-    private int[] nextUnsorted = new int[MIN_CAPACITY];
-    private int[] treeSize = new int[MIN_CAPACITY];
-    private int[] parentTree = new int[MIN_CAPACITY];
-    private int root = -1;
-    private int lastNode = 0;
-    private int firstUnusedNode = -1;
-    
-    private static final float loadFactor = 0.75f;
-    
-    private IntHashMap objectIndices;
-    private Comparator comparator;
-    private static int counter = 0;
-    
-    /**
-     * Disables randomization and enables additional runtime error checking.
-     * Severely degrades performance if set to true. Intended for use in test 
-     * suites only.
-     */
-    public boolean enableDebug = false;
-    
-    // This object is inserted as the value into any node scheduled for lazy removal
-    private Object lazyRemovalFlag = new Object() {
-        public String toString() {
-            return "Lazy removal flag";  //$NON-NLS-1$
-        }
-    };
-    
-    private final static int DIR_LEFT = 0;
-    private final static int DIR_RIGHT = 1;
-    private final static int DIR_UNSORTED = 2;
-    
-    // Direction constants indicating root nodes
-    private final static int DIR_ROOT = 3;
-    private final static int DIR_UNUSED = 4;
-       
-    private final class Edge {
-        private int startNode;
-        private int direction;
-        
-        private Edge() {
-            startNode = -1;
-            direction = -1;
-        }
-        
-        private Edge(int node, int dir) {
-            startNode = node;
-            direction = dir;
-        }
-        
-        private int getStart() {
-            return startNode;
-        }
-        
-        private int getTarget() {
-            if (startNode == -1) {
-                if (direction == DIR_UNSORTED) {
-                    return firstUnusedNode;
-                } else if (direction == DIR_ROOT) {
-                    return root;
-                }
-                return -1;
-            }
-            
-            if (direction == DIR_LEFT) {
-                return leftSubTree[startNode];
-            }
-            if (direction == DIR_RIGHT) {
-                return rightSubTree[startNode];
-            }
-            return nextUnsorted[startNode];
-        }
-        
-        private boolean isNull() {
-            return getTarget() == -1;
-        }
-     
-        /**
-         * Redirects this edge to a new node
-         * @param newNode
-         * @since 3.1
-         */
-        private void setTarget(int newNode) {            
-            if (direction == DIR_LEFT) {
-    	        leftSubTree[startNode] = newNode;
-            } else if (direction == DIR_RIGHT) {
-                rightSubTree[startNode] = newNode;
-            } else if (direction == DIR_UNSORTED) {
-                nextUnsorted[startNode] = newNode;
-            } else if (direction == DIR_ROOT) {
-                root = newNode;
-            } else if (direction == DIR_UNUSED) {
-                firstUnusedNode = newNode;
-            }
-            
-	        if (newNode != -1) {
-	            parentTree[newNode] = startNode;
-	        }
-        }
-        
-        private void advance(int direction) {
-            startNode = getTarget();
-            this.direction = direction;
-        }
-    }
-
-    private void setRootNode(int node) {
-        root = node;
-        if (node != -1) {
-            parentTree[node] = -1;
-        }
-    }
-    
-    /**
-     * Creates a new sorted collection using the given comparator to determine
-     * sort order.
-     * 
-     * @param c comparator that determines the sort order
-     */
-    public LazySortedCollection(Comparator c) {
-        this.comparator = c;
-    }
-    
-    /**
-     * Tests if this object's internal state is valid. Throws a runtime
-     * exception if the state is invalid, indicating a programming error
-     * in this class. This method is intended for use in test
-     * suites and should not be called by clients.
-     */
-    public void testInvariants() {
-        if (!enableDebug) {
-            return;
-        }
-        
-        testInvariants(root);
-    }
-    
-    private void testInvariants(int node) {
-        if (node == -1) {
-            return;
-        }
-        
-        // Get the current tree size (we will later force the tree size
-        // to be recomputed from scratch -- if everything works properly, then
-        // there should be no change.
-        int treeSize = getSubtreeSize(node);
-
-        int left = leftSubTree[node];
-        int right = rightSubTree[node];
-        int unsorted = nextUnsorted[node];
-        
-        if (isUnsorted(node)) {
-            Assert.isTrue(left == -1, "unsorted nodes shouldn't have a left subtree"); //$NON-NLS-1$
-            Assert.isTrue(right == -1, "unsorted nodes shouldn't have a right subtree"); //$NON-NLS-1$
-        }
-        
-        if (left != -1) {
-            testInvariants(left);
-            Assert.isTrue(parentTree[left] == node, "left node has invalid parent pointer"); //$NON-NLS-1$
-        }
-        if (right != -1) {
-            testInvariants(right);
-            Assert.isTrue(parentTree[right] == node, "right node has invalid parent pointer");             //$NON-NLS-1$
-        }
-
-        int previous = node;
-        while (unsorted != -1) {
-            int oldTreeSize = this.treeSize[unsorted];
-            recomputeTreeSize(unsorted);
-            
-            Assert.isTrue(this.treeSize[unsorted] == oldTreeSize, 
-                    "Invalid node size for unsorted node"); //$NON-NLS-1$
-            Assert.isTrue(leftSubTree[unsorted] == -1, "unsorted nodes shouldn't have left subtrees"); //$NON-NLS-1$
-            Assert.isTrue(rightSubTree[unsorted] == -1, "unsorted nodes shouldn't have right subtrees"); //$NON-NLS-1$
-            Assert.isTrue(parentTree[unsorted] == previous, "unsorted node has invalid parent pointer"); //$NON-NLS-1$
-            Assert.isTrue(contents[unsorted] != lazyRemovalFlag, "unsorted nodes should not be lazily removed"); //$NON-NLS-1$
-            previous = unsorted;
-            unsorted = nextUnsorted[unsorted];
-        }
-        
-        // Note that we've already tested that the child sizes are correct... if our size is
-        // correct, then recomputing it now should not cause any change.
-        recomputeTreeSize(node);
-                
-        Assert.isTrue(treeSize == getSubtreeSize(node), "invalid tree size"); //$NON-NLS-1$
-    }
-    
-    private boolean isUnsorted(int node) {
-        int parent = parentTree[node];
-        
-        if (parent != -1) {
-            return nextUnsorted[parent] == node;
-        }
-        
-        return false;
-    }
-    
-    private final boolean isLess(int element1, int element2) {
-        return comparator.compare(contents[element1], contents[element2]) < 0;
-    }
-    
-    /**
-     * Adds the given element to the given subtree. Returns the new
-     * root of the subtree.
-     * 
-     * @param subTree index of the subtree to insert elementToAdd into. If -1, 
-     *                then a new subtree will be created for elementToAdd
-     * @param elementToAdd index of the element to add to the subtree. If -1, this method
-     *                 is a NOP.
-     * @since 3.1
-     */
-    private final int addUnsorted(int subTree, int elementToAdd) {
-        if (elementToAdd == -1) {
-            return subTree;
-        }
-        
-        if (subTree == -1) {
-            nextUnsorted[elementToAdd] = -1;
-            treeSize[elementToAdd] = 1;
-            return elementToAdd;
-        }
-        
-        // If the subTree is empty (ie: it only contains nodes flagged for lazy removal),
-        // chop it off.
-        if (treeSize[subTree] == 0) {
-            removeSubTree(subTree);
-            nextUnsorted[elementToAdd] = -1;
-            treeSize[elementToAdd] = 1;
-            return elementToAdd;
-        }
-        
-        // If neither subtree has any children, add a pseudorandom chance of the
-        // newly added element becoming the new pivot for this node. Note: instead
-        // of a real pseudorandom generator, we simply use a counter here.
-        if (!enableDebug && leftSubTree[subTree] == -1 && rightSubTree[subTree] == -1 
-                && leftSubTree[elementToAdd] == -1 && rightSubTree[elementToAdd] == -1) {
-	        counter--;
-	        
-	        if (counter % treeSize[subTree] == 0) {
-	            // Make the new node into the new pivot 
-	            nextUnsorted[elementToAdd] = subTree;
-	            parentTree[elementToAdd] = parentTree[subTree];
-	            parentTree[subTree] = elementToAdd;
-	            treeSize[elementToAdd] = treeSize[subTree] + 1;
-	            return elementToAdd;
-	        }
-        }
-        
-        int oldNextUnsorted = nextUnsorted[subTree];
-        nextUnsorted[elementToAdd] = oldNextUnsorted;
-        
-        if (oldNextUnsorted == -1) {
-            treeSize[elementToAdd] = 1;
-        } else {
-            treeSize[elementToAdd] = treeSize[oldNextUnsorted] + 1;
-            parentTree[oldNextUnsorted] = elementToAdd;
-        }
-        
-        parentTree[elementToAdd] = subTree;
-        
-        nextUnsorted[subTree] = elementToAdd;
-        treeSize[subTree]++;        
-        return subTree;
-    }
-    
-    /**
-     * Returns the number of elements in the collection
-     * 
-     * @return the number of elements in the collection
-     */
-    public int size() {
-        int result = getSubtreeSize(root);
-        
-        testInvariants();
-        
-        return result;
-    }
-    
-    /**
-     * Given a tree and one of its unsorted children, this sorts the child by moving
-     * it into the left or right subtrees. Returns the next unsorted child or -1 if none
-     * 
-     * @param subTree parent tree
-     * @param toMove child (unsorted) subtree
-     * @since 3.1
-     */
-    private final int partition(int subTree, int toMove) {
-        int result = nextUnsorted[toMove];
-        
-        if (isLess(toMove, subTree)) {
-            int nextLeft = addUnsorted(leftSubTree[subTree], toMove);
-            leftSubTree[subTree] = nextLeft;
-            parentTree[nextLeft] = subTree;
-        } else {
-            int nextRight = addUnsorted(rightSubTree[subTree], toMove);
-            rightSubTree[subTree] = nextRight;
-            parentTree[nextRight] = subTree;
-        }
-        
-        return result;
-    }
-    
-    /**
-     * Partitions the given subtree. Moves all unsorted elements at the given node
-     * to either the left or right subtrees. If the node itself was scheduled for
-     * lazy removal, this will force the node to be removed immediately. Returns
-     * the new subTree.
-     * 
-     * @param subTree
-     * @return the replacement node (this may be different from subTree if the subtree
-     * was replaced during the removal)
-     * @since 3.1
-     */
-    private final int partition(int subTree, FastProgressReporter mon) throws InterruptedException {
-        if (subTree == -1) {
-            return -1;
-        }
-        
-        if (contents[subTree] == lazyRemovalFlag) {
-            subTree = removeNode(subTree);
-            if (subTree == -1) {
-                return -1;
-            }
-        }
-        
-        for (int idx = nextUnsorted[subTree]; idx != -1;) { 
-            idx = partition(subTree, idx);
-            nextUnsorted[subTree] = idx;
-            if (idx != -1) {
-                parentTree[idx] = subTree;
-            }
-            
-            if (mon.isCanceled()) {
-                throw new InterruptedException();
-            }
-        }
-        
-        // At this point, there are no remaining unsorted nodes in this subtree
-        nextUnsorted[subTree] = -1;
-        
-        return subTree;
-    }
-    
-    private final int getSubtreeSize(int subTree) {
-        if (subTree == -1) {
-            return 0;
-        }
-        return treeSize[subTree];
-    }
-    
-    /**
-     * Increases the capacity of this collection, if necessary, so that it can hold the 
-     * given number of elements. This can be used prior to a sequence of additions to
-     * avoid memory reallocation. This cannot be used to reduce the amount 
-     * of memory used by the collection.
-     *
-     * @param newSize capacity for this collection
-     */
-    public final void setCapacity(int newSize) {
-        if (newSize > contents.length) {
-            setArraySize(newSize);
-        }
-    }
-    
-    /**
-     * Adjusts the capacity of the array.
-     * 
-     * @param newCapacity
-     */
-    private final void setArraySize(int newCapacity) {
-        Object[] newContents = new Object[newCapacity];
-        System.arraycopy(contents, 0, newContents, 0, lastNode);
-        contents = newContents;
-        
-        int[] newLeftSubTree = new int[newCapacity];
-        System.arraycopy(leftSubTree, 0, newLeftSubTree, 0, lastNode);
-        leftSubTree = newLeftSubTree;
-        
-        int[] newRightSubTree = new int[newCapacity];
-        System.arraycopy(rightSubTree, 0, newRightSubTree, 0, lastNode);
-        rightSubTree = newRightSubTree;
-        
-        int[] newNextUnsorted = new int[newCapacity];
-        System.arraycopy(nextUnsorted, 0, newNextUnsorted, 0, lastNode);
-        nextUnsorted = newNextUnsorted;
-        
-        int[] newTreeSize = new int[newCapacity];
-        System.arraycopy(treeSize, 0, newTreeSize, 0, lastNode);
-        treeSize = newTreeSize;
-        
-        int[] newParentTree = new int[newCapacity];
-        System.arraycopy(parentTree, 0, newParentTree, 0, lastNode);
-        parentTree = newParentTree;
-    }
-    
-    /**
-     * Creates a new node with the given value. Returns the index of the newly
-     * created node.
-     * 
-     * @param value
-     * @return the index of the newly created node
-     * @since 3.1
-     */
-    private final int createNode(Object value) {
-        int result = -1;
-
-        if (firstUnusedNode == -1) {
-            // If there are no unused nodes from prior removals, then 
-            // we add a node at the end
-            result = lastNode;
-            
-            // If this would cause the array to overflow, reallocate the array 
-            if (contents.length <= lastNode) {
-                setCapacity(lastNode * 2);
-            }
-            
-            lastNode++;
-        } else {
-            // Reuse a node from a prior removal
-            result = firstUnusedNode;
-            firstUnusedNode = nextUnsorted[result];
-        }
-        
-        contents[result] = value;
-        treeSize[result] = 1;
-        
-        // Clear pointers
-        leftSubTree[result] = -1;
-        rightSubTree[result] = -1;
-        nextUnsorted[result] = -1;
-        
-        // As long as we have a hash table of values onto tree indices, incrementally
-        // update the hash table. Note: the table is only constructed as needed, and it
-        // is destroyed whenever the arrays are reallocated instead of reallocating it.
-        if (objectIndices != null) {
-            objectIndices.put(value, result);
-        }
-        
-        return result;
-    }
-    
-    /**
-     * Returns the current tree index for the given object.
-     * 
-     * @param value
-     * @return the current tree index
-     * @since 3.1
-     */
-    private int getObjectIndex(Object value) {
-        // If we don't have a map of values onto tree indices, build the map now.
-        if (objectIndices == null) {
-            int result = -1;
-            
-            objectIndices = new IntHashMap((int)(contents.length / loadFactor) + 1, loadFactor);
-            
-            for (int i = 0; i < lastNode; i++) {
-                Object element = contents[i];
-                
-                if (element != null && element != lazyRemovalFlag) {
-                    objectIndices.put(element, i);
-                    
-                    if (value == element) {
-                        result = i;
-                    }
-                }
-            }
-            
-            return result;
-        }
-        
-        // If we have a map of values onto tree indices, return the result by looking it up in
-        // the map
-        return objectIndices.get(value, -1);
-    }
-    
-    /**
-     * Redirects any pointers from the original to the replacement. If the replacement
-     * causes a change in the number of elements in the parent tree, the changes are
-     * propogated toward the root.
-     * 
-     * @param nodeToReplace
-     * @param replacementNode
-     * @since 3.1
-     */
-    private void replaceNode(int nodeToReplace, int replacementNode) {
-        int parent = parentTree[nodeToReplace];
-        
-        if (parent == -1) {
-            if (root == nodeToReplace) {
-                setRootNode(replacementNode);
-            }
-        } else {
-            if (leftSubTree[parent] == nodeToReplace) {
-                leftSubTree[parent] = replacementNode;
-            } else if (rightSubTree[parent] == nodeToReplace) {
-                rightSubTree[parent] = replacementNode;
-            } else if (nextUnsorted[parent] == nodeToReplace) {
-                nextUnsorted[parent] = replacementNode;
-            }
-            if (replacementNode != -1) {
-                parentTree[replacementNode] = parent;
-            }
-        }
-    }
-    
-    private void recomputeAncestorTreeSizes(int node) {
-        while (node != -1) {
-            int oldSize = treeSize[node];
-            
-            recomputeTreeSize(node);
-            
-            if (treeSize[node] == oldSize) {
-                break;
-            }
-            
-            node = parentTree[node];
-        }        
-    }
-    
-    /**
-     * Recomputes the tree size for the given node.
-     * 
-     * @param node
-     * @since 3.1
-     */
-    private void recomputeTreeSize(int node) {
-        if (node == -1) {
-            return;
-        }
-        treeSize[node] = getSubtreeSize(leftSubTree[node])
-    		+ getSubtreeSize(rightSubTree[node])
-    		+ getSubtreeSize(nextUnsorted[node])
-    		+ (contents[node] == lazyRemovalFlag ? 0 : 1); 
-    }
-    
-    /**
-     * 
-     * @param toRecompute
-     * @param whereToStop
-     * @since 3.1
-     */
-    private void forceRecomputeTreeSize(int toRecompute, int whereToStop) {
-        while (toRecompute != -1 && toRecompute != whereToStop) {
-	        recomputeTreeSize(toRecompute);
-	        
-	        toRecompute = parentTree[toRecompute];
-        }
-    }
-    
-    /**
-     * Destroy the node at the given index in the tree
-     * @param nodeToDestroy
-     * @since 3.1
-     */
-    private void destroyNode(int nodeToDestroy) {
-        // If we're maintaining a map of values onto tree indices, remove this entry from
-        // the map
-        if (objectIndices != null) {
-            Object oldContents = contents[nodeToDestroy];
-            if (oldContents != lazyRemovalFlag) {
-                objectIndices.remove(oldContents);
-            }
-        }
-        
-        contents[nodeToDestroy] = null;
-        leftSubTree[nodeToDestroy] = -1;
-        rightSubTree[nodeToDestroy] = -1;
-        
-        if (firstUnusedNode == -1) {
-            treeSize[nodeToDestroy] = 1;
-        } else {
-            treeSize[nodeToDestroy] = treeSize[firstUnusedNode] + 1;
-            parentTree[firstUnusedNode] = nodeToDestroy;
-        }
-        
-        nextUnsorted[nodeToDestroy] = firstUnusedNode;
-        
-        firstUnusedNode = nodeToDestroy; 
-    }
-    
-    /**
-     * Frees up memory by clearing the list of nodes that have been freed up through removals.
-     * 
-     * @since 3.1
-     */
-    private final void pack() {
-        
-        // If there are no unused nodes, then there is nothing to do
-        if (firstUnusedNode == -1) {
-            return;
-        }
-        
-        int reusableNodes = getSubtreeSize(firstUnusedNode);
-        int nonPackableNodes = lastNode - reusableNodes;
-        
-        // Only pack the array if we're utilizing less than 1/4 of the array (note:
-        // this check is important, or it will change the time bounds for removals)
-        if (contents.length < MIN_CAPACITY || nonPackableNodes > contents.length / 4) {
-            return;
-        }
-        
-        // Rather than update the entire map, just null it out. If it is needed,
-        // it will be recreated lazily later. This will save some memory if the
-        // map isn't needed, and it takes a similar amount of time to recreate the
-        // map as to update all the indices.
-        objectIndices = null;
-        
-        // Maps old index -> new index
-        int[] mapNewIdxOntoOld = new int[contents.length];
-        int[] mapOldIdxOntoNew = new int[contents.length];
-        
-        int nextNewIdx = 0;
-        // Compute the mapping. Determine the new index for each element 
-        for (int oldIdx = 0; oldIdx < lastNode; oldIdx++) {
-            if (contents[oldIdx] != null) {
-                mapOldIdxOntoNew[oldIdx] = nextNewIdx;
-                mapNewIdxOntoOld[nextNewIdx] = oldIdx;
-                nextNewIdx++;
-            } else {
-                mapOldIdxOntoNew[oldIdx] = -1;
-            }
-        }
-        
-        // Make the actual array size double the number of nodes to allow
-        // for expansion.
-        int newNodes = nextNewIdx;
-        int newCapacity = Math.max(newNodes * 2, MIN_CAPACITY);
-        
-        // Allocate new arrays
-        Object[] newContents = new Object[newCapacity];
-        int[] newTreeSize = new int[newCapacity];
-        int[] newNextUnsorted = new int[newCapacity];
-        int[] newLeftSubTree = new int[newCapacity];
-        int[] newRightSubTree = new int[newCapacity];
-        int[] newParentTree = new int[newCapacity];
-        
-        for (int newIdx = 0; newIdx < newNodes; newIdx++) {
-            int oldIdx = mapNewIdxOntoOld[newIdx];
-            newContents[newIdx] = contents[oldIdx];
-            newTreeSize[newIdx] = treeSize[oldIdx];
-            
-            int left = leftSubTree[oldIdx];
-            if (left == -1) {
-                newLeftSubTree[newIdx] = -1;
-            } else {
-                newLeftSubTree[newIdx] = mapOldIdxOntoNew[left];
-            }
-            
-            int right = rightSubTree[oldIdx];
-            if (right == -1) {
-                newRightSubTree[newIdx] = -1;                
-            } else {
-                newRightSubTree[newIdx] = mapOldIdxOntoNew[right];
-            }
-
-            int unsorted = nextUnsorted[oldIdx];
-            if (unsorted == -1) {
-                newNextUnsorted[newIdx] = -1;
-            } else {
-                newNextUnsorted[newIdx] = mapOldIdxOntoNew[unsorted];
-            }
-            
-            int parent = parentTree[oldIdx];
-            if (parent == -1) {
-                newParentTree[newIdx] = -1;
-            } else {
-                newParentTree[newIdx] = mapOldIdxOntoNew[parent];
-            }
-        }
-        
-        contents = newContents;
-        nextUnsorted = newNextUnsorted;
-        treeSize = newTreeSize;
-        leftSubTree = newLeftSubTree;
-        rightSubTree = newRightSubTree;
-        parentTree = newParentTree;
-        
-        if (root != -1) {
-            root = mapOldIdxOntoNew[root];
-        }
-        
-        // All unused nodes have been removed
-        firstUnusedNode = -1;
-        lastNode = newNodes;
-    }
-    
-    /**
-     * Adds the given object to the collection. Runs in O(1) amortized time.
-     * 
-     * @param toAdd object to add
-     */
-    public final void add(Object toAdd) {
-    	Assert.isNotNull(toAdd);
-        // Create the new node
-        int newIdx = createNode(toAdd);
-        
-        // Insert the new node into the root tree
-        setRootNode(addUnsorted(root, newIdx));
-        
-        testInvariants();
-    }
-    
-    /**
-     * Adds all items from the given collection to this collection 
-     * 
-     * @param toAdd objects to add
-     */
-    public final void addAll(Collection toAdd) {
-    	Assert.isNotNull(toAdd);
-        Iterator iter = toAdd.iterator();
-        while (iter.hasNext()) {
-            add(iter.next());
-        }
-        
-        testInvariants();
-    }
-    
-    /**
-     * Adds all items from the given array to the collection
-     * 
-     * @param toAdd objects to add
-     */
-    public final void addAll(Object[] toAdd) {
-    	Assert.isNotNull(toAdd);
-        for (int i = 0; i < toAdd.length; i++) {
-            Object object = toAdd[i];
-            
-            add(object);
-        }
-        
-        testInvariants();
-    }
-    
-    /**
-     * Returns true iff the collection is empty
-     * 
-     * @return true iff the collection contains no elements
-     */
-    public final boolean isEmpty() {
-        boolean result = (root == -1);
-        
-        testInvariants();
-        
-        return result;
-    }
-    
-    /**
-     * Removes the given object from the collection. Has no effect if
-     * the element does not exist in this collection.
-     * 
-     * @param toRemove element to remove
-     */
-    public final void remove(Object toRemove) {
-        internalRemove(toRemove);
-        
-        pack();
-        
-        testInvariants();
-    }
-    
-    /**
-     * Internal implementation of remove. Removes the given element but does not
-     * pack the container after the removal.
-     * 
-     * @param toRemove element to remove
-     */
-    private void internalRemove(Object toRemove) {
-        int objectIndex = getObjectIndex(toRemove);
-        
-        if (objectIndex != -1) {
-            int parent = parentTree[objectIndex];
-            lazyRemoveNode(objectIndex);
-            //Edge parentEdge = getEdgeTo(objectIndex);
-            //parentEdge.setTarget(lazyRemoveNode(objectIndex));
-            recomputeAncestorTreeSizes(parent);
-        }
-        
-        //testInvariants();
-    }
-    
-    /**
-     * Removes all elements in the given array from this collection.
-     * 
-     * @param toRemove elements to remove 
-     */
-    public final void removeAll(Object[] toRemove) {
-    	Assert.isNotNull(toRemove);
-    	
-        for (int i = 0; i < toRemove.length; i++) {
-            Object object = toRemove[i];
-            
-            internalRemove(object);
-        }
-    	pack();
-    }
-    
-    /**
-     * Retains the n smallest items in the collection, removing the rest. When
-     * this method returns, the size of the collection will be n. Note that
-     * this is a no-op if n > the current size of the collection.
-     * 
-     * Temporarily package visibility until the implementation of FastProgressReporter
-     * is finished.
-     * 
-     * @param n number of items to retain
-     * @param mon progress monitor
-     * @throws InterruptedException if the progress monitor is cancelled in another thread
-     */
-    /* package */ final void retainFirst(int n, FastProgressReporter mon) throws InterruptedException {
-        int sz = size();
-        
-        if (n >= sz) {
-            return;
-        }
-        
-        removeRange(n, sz - n, mon);
-        
-        testInvariants();
-    }
-    
-    /**
-     * Retains the n smallest items in the collection, removing the rest. When
-     * this method returns, the size of the collection will be n. Note that
-     * this is a no-op if n > the current size of the collection.
-     * 
-     * @param n number of items to retain
-     */
-    public final void retainFirst(int n) {
-        try {
-            retainFirst(n, new FastProgressReporter());
-        } catch (InterruptedException e) {
-        }
-        
-        testInvariants();
-    }
-    
-    /**
-     * Removes all elements in the given range from this collection.
-     * For example, removeRange(10, 3) would remove the 11th through 13th
-     * smallest items from the collection.
-     * 
-     * @param first 0-based index of the smallest item to remove
-     * @param length number of items to remove
-     */
-    public final void removeRange(int first, int length) {
-        try {
-            removeRange(first, length, new FastProgressReporter());
-        } catch (InterruptedException e) {
-        }
-        
-        testInvariants();
-    }
-    
-    /**
-     * Removes all elements in the given range from this collection.
-     * For example, removeRange(10, 3) would remove the 11th through 13th
-     * smallest items from the collection.
-     * 
-     * Temporarily package visiblity until the implementation of FastProgressReporter is
-     * finished.
-     * 
-     * @param first 0-based index of the smallest item to remove
-     * @param length number of items to remove
-     * @param mon progress monitor
-     * @throws InterruptedException if the progress monitor is cancelled in another thread
-     */
-    /* package */ final void removeRange(int first, int length, FastProgressReporter mon) throws InterruptedException {
-    	removeRange(root, first, length, mon);
-    	
-    	pack();
-    	
-    	testInvariants();
-    }
-    
-    private final void removeRange(int node, int rangeStart, int rangeLength, FastProgressReporter mon) throws InterruptedException {
-    	if (rangeLength == 0) {
-    		return;
-    	}
-    	
-    	int size = getSubtreeSize(node);
-    	
-    	if (size <= rangeStart) {
-    		return;
-    	}
-    	
-    	// If we can chop off this entire subtree without any sorting, do so.
-    	if (rangeStart == 0 && rangeLength >= size) {
-    		removeSubTree(node);
-    		return;
-    	}
-    	try {
-	    	// Partition any unsorted nodes
-    	    node = partition(node, mon);
-	    	
-	    	int left = leftSubTree[node];
-	    	int leftSize = getSubtreeSize(left);
-	    	
-	    	int toRemoveFromLeft = Math.min(leftSize - rangeStart, rangeLength);
-	    	
-	    	// If we're removing anything from the left node
-	    	if (toRemoveFromLeft >= 0) {
-	    		removeRange(leftSubTree[node], rangeStart, toRemoveFromLeft, mon);
-	    		
-	    		// Check if we're removing from both sides
-	    		int toRemoveFromRight = rangeStart + rangeLength - leftSize - 1;
-	    		
-	    		if (toRemoveFromRight >= 0) {
-	    			// Remove from right subtree
-	    			removeRange(rightSubTree[node], 0, toRemoveFromRight, mon);
-	    			
-	    			// ... removing from both sides means we need to remove the node itself too
-	    			removeNode(node);
-	    			return;
-	    		}
-	    	} else {
-	    		// If removing from the right side only
-	    		removeRange(rightSubTree[node], rangeStart - leftSize - 1, rangeLength, mon);
-	    	}
-    	} finally {
-    	    recomputeTreeSize(node);
-    	}
-    }
-    
-    /**
-     * Prunes the given subtree (and all child nodes, sorted or unsorted).
-     * 
-     * @param subTree
-     * @since 3.1
-     */
-    private final void removeSubTree(int subTree) {
-        if (subTree == -1) {
-            return;
-        }
-        
-        // Destroy all unsorted nodes
-        for (int next = nextUnsorted[subTree]; next != -1;) {
-            int current = next;
-            next = nextUnsorted[next];
-            
-            // Destroy this unsorted node
-            destroyNode(current);
-        }
-        
-        // Destroy left subtree
-        removeSubTree(leftSubTree[subTree]);
-        
-        // Destroy right subtree
-        removeSubTree(rightSubTree[subTree]);
-        
-        replaceNode(subTree, -1);
-        // Destroy pivot node
-        destroyNode(subTree);
-    }
-    
-    /**
-     * Schedules the node for removal. If the node can be removed in constant time,
-     * it is removed immediately.
-     * 
-     * @param subTree
-     * @return the replacement node
-     * @since 3.1
-     */
-    private final int lazyRemoveNode(int subTree) {
-        int left = leftSubTree[subTree];
-        int right = rightSubTree[subTree];
-
-        // If this is a leaf node, remove it immediately
-        if (left == -1 && right == -1) {
-            int result = nextUnsorted[subTree];
-            replaceNode(subTree, result);
-            destroyNode(subTree);
-            return result;
-        }
-        
-        // Otherwise, flag it for future removal
-        Object value = contents[subTree];
-        contents[subTree] = lazyRemovalFlag;
-        treeSize[subTree]--;
-        if (objectIndices != null) {
-            objectIndices.remove(value);
-        }
-        
-        return subTree;
-    }
-    
-    /**
-     * Removes the given subtree, replacing it with one of its children.
-     * Returns the new root of the subtree
-     * 
-     * @param subTree
-     * @return the index of the new root
-     * @since 3.1
-     */
-    private final int removeNode(int subTree) {
-        int left = leftSubTree[subTree];
-        int right = rightSubTree[subTree];
-        
-        if (left == -1 || right == -1) {
-            int result = -1;
-            
-            if (left == -1 && right == -1) {
-                // If this is a leaf node, replace it with its first unsorted child
-                result = nextUnsorted[subTree];
-            } else {
-                // Either the left or right child is missing -- replace with the remaining child  
-                if (left == -1) {
-                    result = right;
-                } else {
-                    result = left;
-                }
-
-                try {
-                    result = partition(result, new FastProgressReporter());
-                } catch (InterruptedException e) {
-                    
-                }
-                if (result == -1) {
-                    result = nextUnsorted[subTree];
-                } else {
-	                int unsorted = nextUnsorted[subTree];
-	                nextUnsorted[result] = unsorted;
-	                int additionalNodes = 0;
-	                if (unsorted != -1) {
-	                    parentTree[unsorted] = result;
-	                    additionalNodes = treeSize[unsorted];
-	                }
-	                treeSize[result] += additionalNodes;
-                }
-            }
-            
-            replaceNode(subTree, result);
-            destroyNode(subTree);
-            return result;
-        }
-                
-        // Find the edges that lead to the next-smallest and
-        // next-largest nodes
-        Edge nextSmallest = new Edge(subTree, DIR_LEFT);
-        while (!nextSmallest.isNull()) {
-            nextSmallest.advance(DIR_RIGHT);
-        }
-        
-        Edge nextLargest = new Edge(subTree, DIR_RIGHT);
-        while (!nextLargest.isNull()) {
-            nextLargest.advance(DIR_LEFT);
-        }
-        
-        // Index of the replacement node
-        int replacementNode = -1;
-        
-        // Count of number of nodes moved to the right
-        
-        int leftSize = getSubtreeSize(left);
-        int rightSize = getSubtreeSize(right);
-        
-        // Swap with a child from the larger subtree
-        if (leftSize > rightSize) {
-            replacementNode = nextSmallest.getStart();
-
-            // Move any unsorted nodes that are larger than the replacement node into
-            // the left subtree of the next-largest node
-            Edge unsorted = new Edge(replacementNode, DIR_UNSORTED);
-            while (!unsorted.isNull()) {
-                int target = unsorted.getTarget();
-                
-                if (!isLess(target, replacementNode)) {
-                    unsorted.setTarget(nextUnsorted[target]);
-                    nextLargest.setTarget(addUnsorted(nextLargest.getTarget(), target));
-                } else {
-                    unsorted.advance(DIR_UNSORTED);
-                }
-            }
-            
-            forceRecomputeTreeSize(unsorted.getStart(), replacementNode);
-            forceRecomputeTreeSize(nextLargest.getStart(), subTree);
-        } else {
-            replacementNode = nextLargest.getStart();
-
-            // Move any unsorted nodes that are smaller than the replacement node into
-            // the right subtree of the next-smallest node
-            Edge unsorted = new Edge(replacementNode, DIR_UNSORTED);
-            while (!unsorted.isNull()) {
-                int target = unsorted.getTarget();
-                
-                if (isLess(target, replacementNode)) {
-                    unsorted.setTarget(nextUnsorted[target]);
-                    nextSmallest.setTarget(addUnsorted(nextSmallest.getTarget(), target));
-                } else {
-                    unsorted.advance(DIR_UNSORTED);
-                }
-            }
-            
-            forceRecomputeTreeSize(unsorted.getStart(), replacementNode);
-            forceRecomputeTreeSize(nextSmallest.getStart(), subTree);
-        }
-        
-        // Now all the affected treeSize[...] elements should be updated to reflect the
-        // unsorted nodes that moved. Swap nodes. 
-        Object replacementContent = contents[replacementNode];
-        contents[replacementNode] = contents[subTree];
-        contents[subTree] = replacementContent;
-        
-        if (objectIndices != null) {
-            objectIndices.put(replacementContent, subTree);
-            // Note: currently we don't bother updating the index of the replacement
-            // node since we're going to remove it immediately afterwards and there's
-            // no good reason to search for the index in a method that was given the
-            // index as a parameter...
-            
-            // objectIndices.put(contents[replacementNode], replacementNode)
-        }
-        
-        int replacementParent = parentTree[replacementNode]; 
-        
-        replaceNode(replacementNode, removeNode(replacementNode));
-        //Edge parentEdge = getEdgeTo(replacementNode);
-        //parentEdge.setTarget(removeNode(replacementNode));
-
-        forceRecomputeTreeSize(replacementParent, subTree);
-        recomputeTreeSize(subTree);
-        
-        //testInvariants();
-        
-        return subTree;
-    }
-   
-    /**
-     * Removes all elements from the collection
-     */
-    public final void clear() {
-        lastNode = 0;
-        setArraySize(MIN_CAPACITY);
-        root = -1;
-        firstUnusedNode = -1;
-        objectIndices = null;
-        
-        testInvariants();
-    }
-    
-    /**
-     * Returns the comparator that is determining the sort order for this collection
-     * 
-     * @return comparator for this collection
-     */
-    public Comparator getComparator() {
-        return comparator;
-    }
-    
-    /**
-     * Fills in an array of size n with the n smallest elements from the collection.
-     * Can compute the result in sorted or unsorted order. 
-     * 
-     * Currently package visible until the implementation of FastProgressReporter is finished.
-     * 
-     * @param result array to be filled
-     * @param sorted if true, the result array will be sorted. If false, the result array
-     * may be unsorted. This does not affect which elements appear in the result, only their 
-     * order.
-     * @param mon monitor used to report progress and check for cancellation
-     * @return the number of items inserted into the result array. This will be equal to the minimum
-     * of result.length and container.size()
-     * @throws InterruptedException if the progress monitor is cancelled
-     */
-    /* package */ final int getFirst(Object[] result, boolean sorted, FastProgressReporter mon) throws InterruptedException {
-        int returnValue = getRange(result, 0, sorted, mon);
-        
-        testInvariants();
-        
-        return returnValue;
-    }
-    
-    /**
-     * Fills in an array of size n with the n smallest elements from the collection.
-     * Can compute the result in sorted or unsorted order. 
-     * 
-     * @param result array to be filled
-     * @param sorted if true, the result array will be sorted. If false, the result array
-     * may be unsorted. This does not affect which elements appear in the result. It only
-     * affects their order. Computing an unsorted result is asymptotically faster.
-     * @return the number of items inserted into the result array. This will be equal to the minimum
-     * of result.length and container.size()
-     */
-    public final int getFirst(Object[] result, boolean sorted) {
-        int returnValue = 0;
-        
-        try {
-            returnValue = getFirst(result, sorted, new FastProgressReporter());
-        } catch (InterruptedException e) {
-        }
-        
-        testInvariants();
-        
-        return returnValue;
-    }
-    
-    /**
-     * Given a position defined by k and an array of size n, this fills in the array with
-     * the kth smallest element through to the (k+n)th smallest element. For example, 
-     * getRange(myArray, 10, false) would fill in myArray starting with the 10th smallest item
-     * in the collection. The result can be computed in sorted or unsorted order. Computing the
-     * result in unsorted order is more efficient.
-     * <p>
-     * Temporarily set to package visibility until the implementation of FastProgressReporter
-     * is finished.
-     * </p>
-     * 
-     * @param result array to be filled in
-     * @param rangeStart index of the smallest element to appear in the result
-     * @param sorted true iff the result array should be sorted
-     * @param mon progress monitor used to cancel the operation
-     * @throws InterruptedException if the progress monitor was cancelled in another thread
-     */
-    /* package */ final int getRange(Object[] result, int rangeStart, boolean sorted, FastProgressReporter mon) throws InterruptedException {
-        return getRange(result, 0, rangeStart, root, sorted, mon);
-    }
-    
-    /**
-     * Computes the n through n+k items in this collection.
-     * Computing the result in unsorted order is more efficient. Sorting the result will
-     * not change which elements actually show up in the result. That is, even if the result is
-     * unsorted, it will still contain the same elements as would have been at that range in
-     * a fully sorted collection. 
-     * 
-     * @param result array containing the result
-     * @param rangeStart index of the first element to be inserted into the result array
-     * @param sorted true iff the result will be computed in sorted order
-     * @return the number of items actually inserted into the result array (will be the minimum
-     * of result.length and this.size())
-     */
-    public final int getRange(Object[] result, int rangeStart, boolean sorted) {
-        int returnValue = 0;
-        
-        try {
-            returnValue = getRange(result, rangeStart, sorted, new FastProgressReporter());
-        } catch (InterruptedException e) {
-        }
-        
-        testInvariants();
-        
-        return returnValue;
-    }
-    
-    /**
-     * Returns the item at the given index. Indexes are based on sorted order.
-     * 
-     * @param index index to test
-     * @return the item at the given index
-     */
-    public final Object getItem(int index) {
-        Object[] result = new Object[1];
-        try {
-            getRange(result, index, false, new FastProgressReporter());
-        } catch (InterruptedException e) {
-            // shouldn't happen
-        }
-        Object returnValue = result[0];
-        
-        testInvariants();
-        
-        return returnValue;
-    }
-    
-    /**
-     * Returns the contents of this collection as a sorted or unsorted
-     * array. Computing an unsorted array is more efficient.
-     * 
-     * @param sorted if true, the result will be in sorted order. If false,
-     * the result may be in unsorted order.
-     * @return the contents of this collection as an array.
-     */
-    public final Object[] getItems(boolean sorted) {
-        Object[] result = new Object[size()];
-        
-        getRange(result, 0, sorted);
-        
-        return result;
-    }
-    
-    private final int getRange(Object[] result, int resultIdx, int rangeStart, int node, boolean sorted, FastProgressReporter mon) throws InterruptedException {
-        if (node == -1) {
-            return 0;
-        }
-
-        int availableSpace = result.length - resultIdx;
-        
-        // If we're asking for all children of the current node, simply call getChildren
-        if (rangeStart == 0) {
-            if (treeSize[node] <= availableSpace) {
-                return getChildren(result, resultIdx, node, sorted, mon);
-            }
-        }
-        
-        node = partition(node, mon);
-        if (node == -1) {
-            return 0;
-        }
-        
-        int inserted = 0;
-        
-        int numberLessThanNode = getSubtreeSize(leftSubTree[node]);
-                
-        if (rangeStart < numberLessThanNode) {
-            if (inserted < availableSpace) {
-                inserted += getRange(result, resultIdx, rangeStart, leftSubTree[node], sorted, mon);
-            }
-        }
-        
-        if (rangeStart <= numberLessThanNode) {
-	        if (inserted < availableSpace) {
-	            result[resultIdx + inserted] = contents[node];
-	            inserted++;
-	        }	        
-        } 
-        
-        if (inserted < availableSpace) {
-            inserted += getRange(result, resultIdx + inserted,
-                Math.max(rangeStart - numberLessThanNode - 1, 0), rightSubTree[node], sorted, mon);
-        }
-        
-        return inserted;
-    }
-    
-    /**
-     * Fills in the available space in the given array with all children of the given node.
-     * 
-     * @param result 
-     * @param resultIdx index in the result array where we will begin filling in children
-     * @param node
-     * @return the number of children added to the array
-     * @since 3.1
-     */
-    private final int getChildren(Object[] result, int resultIdx, int node, boolean sorted, FastProgressReporter mon) throws InterruptedException {
-        if (node == -1) {
-            return 0;
-        }
-        
-        int tempIdx = resultIdx;
-        
-        if (sorted) {
-            node = partition(node, mon);
-            if (node == -1) {
-                return 0;
-            }
-        }
-        
-        // Add child nodes smaller than this one
-        if (tempIdx < result.length) {
-            tempIdx += getChildren(result, tempIdx, leftSubTree[node], sorted, mon);
-        }
-        
-        // Add the pivot
-        if (tempIdx < result.length) {
-            Object value = contents[node];
-            if (value != lazyRemovalFlag) {
-                result[tempIdx++] = value;
-            }
-        }
-        
-        // Add child nodes larger than this one
-        if (tempIdx < result.length) {
-            tempIdx += getChildren(result, tempIdx, rightSubTree[node], sorted, mon);
-        }
-        
-        // Add unsorted children (should be empty if the sorted flag was true)
-        for (int unsortedNode = nextUnsorted[node]; unsortedNode != -1 && tempIdx < result.length; 
-        	unsortedNode = nextUnsorted[unsortedNode]) {
-            
-            result[tempIdx++] = contents[unsortedNode];
-        }
-        
-        return tempIdx - resultIdx;
-    }
-
-    /**
-     * Returns true iff this collection contains the given item
-     * 
-     * @param item item to test
-     * @return true iff this collection contains the given item
-     */
-    public boolean contains(Object item) {
-    	Assert.isNotNull(item);
-        boolean returnValue = (getObjectIndex(item) != -1);
-        
-        testInvariants();
-        
-        return returnValue;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/SetModel.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/SetModel.java
deleted file mode 100644
index 26bb3ce..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/SetModel.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.viewers.deferred;
-
-import java.util.Collection;
-import java.util.HashSet;
-
-import org.eclipse.core.runtime.Assert;
-
-
-/**
- * Trivial implementation of an <code>IConcurrentModel</code>. Implements 
- * an unordered set of elements that fires off change notifications whenever
- * elements are added or removed from the set. All notifications are sent
- * synchronously.
- * 
- * @since 3.1
- */
-public class SetModel extends AbstractConcurrentModel {
-    
-    private HashSet data = new HashSet();
-    
-    /**
-     * Return the contents of the model.
-     * @return the array of elements
-     * 
-     */
-    public Object[] getElements() {
-        return data.toArray();
-    }
-
-    /**
-     * Sets the contents to the given array of elements
-     * 
-     * @param newContents new contents of this set
-     */
-    public void set(Object[] newContents) {
-    	Assert.isNotNull(newContents);
-    	data.clear();
-        for (int i = 0; i < newContents.length; i++) {
-            Object object = newContents[i];
-            
-            data.add(object);
-        }
-    	
-    	IConcurrentModelListener[] listeners = getListeners();
-    	for (int i = 0; i < listeners.length; i++) {
-			IConcurrentModelListener listener = listeners[i];
-			
-			listener.setContents(newContents);
-		}
-    }
-
-    /**
-     * Empties the set
-     */
-    public void clear() {
-        Object[] removed = data.toArray();
-        data.clear();
-        fireRemove(removed);
-    }
-    
-    /**
-     * Adds the given elements to the set
-     * 
-     * @param toAdd elements to add
-     */
-    public void addAll(Object[] toAdd) {
-    	Assert.isNotNull(toAdd);
-        for (int i = 0; i < toAdd.length; i++) {
-            Object object = toAdd[i];
-            
-            data.add(object);
-        }
-        
-        fireAdd(toAdd);
-    }
-    
-    /**
-     * Adds the given elements to the set. Duplicate elements are ignored.
-     * 
-     * @param toAdd elements to add
-     */
-    public void addAll(Collection toAdd) {
-    	Assert.isNotNull(toAdd);
-        addAll(toAdd.toArray());
-    }
-    
-    /**
-     * Fires a change notification for all elements in the given array
-     * 
-     * @param changed array of elements that have changed
-     */
-    public void changeAll(Object[] changed) {
-    	Assert.isNotNull(changed);
-        fireUpdate(changed);
-    }
-    
-    /**
-     * Removes all of the given elements from the set.
-     * 
-     * @param toRemove elements to remove
-     */
-    public void removeAll(Object[] toRemove) {
-    	Assert.isNotNull(toRemove);
-        for (int i = 0; i < toRemove.length; i++) {
-            Object object = toRemove[i];
-            
-            data.remove(object);
-        }        
-        
-        fireRemove(toRemove);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.deferred.IConcurrentModel#requestUpdate(org.eclipse.jface.viewers.deferred.IConcurrentModelListener)
-     */
-    public void requestUpdate(IConcurrentModelListener listener) {
-    	Assert.isNotNull(listener);
-        listener.setContents(getElements());
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/package.html
deleted file mode 100644
index 10698c4..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/deferred/package.html
+++ /dev/null
@@ -1,17 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides a framework for viewers that handle deferred contents. 
-<h2>
-Package Specification</h2>
-<p>The deferred viewers are viewers that can handle concurrent updates from a 
-  variety of Threads.<br>
-  &nbsp; 
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/package.html
deleted file mode 100644
index b2608b4..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/package.html
+++ /dev/null
@@ -1,70 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides a framework for viewers, which are model-based
-content adapters for SWT widgets.
-<h2>
-Package Specification</h2>
-A viewer is a model-based adapter on an SWT widget.&nbsp; Each viewer has
-four parts:
-<blockquote>
-<li>
-an <b>input</b> - the object that serves as the viewer's model</li>
-
-<li>
-a <b>widget</b> - the SWT control through which the viewer's model is displayed</li>
-
-<li>
-a <b>content provider</b> - mediates between the model and viewer</li>
-
-<li>
-a <b>label provider</b> - maps model objects to displayable labels containing
-text and/or an image</li>
-</blockquote>
-This package contains the viewer framework. The viewer framework is an
-independent JFace module. Using it requires a knowledge of SWT, but does
-not require familiarity with any of the other JFace modules. The framework
-consists of abstract base classes for viewers (<tt>Viewer</tt>, <tt>StructuredViewer</tt>,
-<tt>AbstractTreeViewer</tt>) together with concrete viewer classes (<tt>ListViewer</tt>,
-<tt>TreeViewer</tt>,
-<tt>TableViewer</tt>,
-<tt>TableTreeViewer</tt>, <tt>CheckboxTreeViewer</tt>,
-and <tt>CheckboxTableViewer</tt>),
-and various lesser support classes. The concrete structured viewer classes
-are ready-to-use and have built-in support for drag-and-drop, filtering
-(<tt>IViewerFilter</tt> and <tt>ViewerFilter</tt>), and sorting (<tt>IViewerSorter</tt>
-and <tt>ViewerSorter</tt>); these classes may also be subclassed further
-if required.
-<p>In general terms, creating a viewer involves the following steps:
-<ul>
-<li>
-instantiating a viewer on some pre-existing SWT widget,</li>
-
-<li>
-setting the viewer's content provider (an object implementing <tt>IContentProvider</tt>),</li>
-
-<li>
-setting the viewer's label provider (an object implementing
-<tt>ILabelProvider</tt>),</li>
-
-<li>
-and, finally, setting the viewer's input.</li>
-</ul>
-Once a viewer's input is set, the viewer becomes active. As the model changes,
-it is the content provider's responsibility to respond to changes to the
-model by telling the viewer what to change (done by calling add and remove
-methods on the viewer). An existing viewer may be retargeted by giving
-it a different object as input; the viewer is responsible for informing
-the content provider of these kinds of wholesale changes (<tt>IContentProvider.inputChanged</tt>).
-Also, each viewer registers with its label provider for notification of
-changes that would affect what the viewer displays (see <tt>ILabelProviderListener.stateChanged</tt>).
-<p>Note: None of the classes in this package maintain global state.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/ApplicationWindow.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/window/ApplicationWindow.java
deleted file mode 100644
index a682552..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/ApplicationWindow.java
+++ /dev/null
@@ -1,857 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Roman Dawydkin - bug 55116
- *******************************************************************************/
-
-package org.eclipse.jface.window;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.action.CoolBarManager;
-import org.eclipse.jface.action.ICoolBarManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.StatusLineManager;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.internal.provisional.action.ICoolBarManager2;
-import org.eclipse.jface.internal.provisional.action.IToolBarManager2;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.operation.ModalContext;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.graphics.Font;
-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.CoolBar;
-import org.eclipse.swt.widgets.Decorations;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.ToolBar;
-
-/**
- * An application window is a high-level "main window", with built-in
- * support for an optional menu bar with standard menus, an optional toolbar,
- * and an optional status line.
- * <p>
- * Creating an application window involves the following steps:
- * <ul>
- *   <li>creating an instance of <code>ApplicationWindow</code>
- *   </li>
- *   <li>assigning the window to a window manager (optional)
- *   </li>
- *   <li>opening the window by calling <code>open</code>
- *   </li>
- * </ul>
- * Only on the last step, when the window is told to open, are
- * the window's shell and widget tree created. When the window is
- * closed, the shell and widget tree are disposed of and are no longer
- * referenced, and the window is automatically removed from its window
- * manager. Like all windows, an application window may be reopened.
- * </p>
- * <p>
- * An application window is also a suitable context in which to perform 
- * long-running operations (that is, it implements <code>IRunnableContext</code>).
- * </p>
- */
-public class ApplicationWindow extends Window implements IRunnableContext {
-
-    /**
-     * Menu bar manager, or <code>null</code> if none (default).
-     *
-     * @see #addMenuBar
-     */
-    private MenuManager menuBarManager = null;
-
-    /**
-     * Tool bar manager, or <code>null</code> if none (default).
-     *
-     * @see #addToolBar
-     */
-    private IToolBarManager toolBarManager = null;
-
-    /**
-     * Status line manager, or <code>null</code> if none (default).
-     *
-     * @see #addStatusLine
-     */
-    private StatusLineManager statusLineManager = null;
-
-    /**
-     * Cool bar manager, or <code>null</code> if none (default).
-     * 
-     * @see #addCoolBar
-     * @since 3.0
-     */
-    private ICoolBarManager coolBarManager = null;
-
-    /**
-     * The seperator between the menu bar and the rest of the window.
-     */
-    protected Label seperator1;
-
-    /**
-     * A flag indicating that an operation is running.
-     */
-    private boolean operationInProgress = false;
-
-    /**
-     * Internal application window layout class.
-     * This vertical layout supports a tool bar area (fixed size),
-     * a separator line, the content area (variable size), and a 
-     * status line (fixed size).
-     */
-    /*package*/class ApplicationWindowLayout extends Layout {
-
-        static final int VGAP = 2;
-
-        static final int BAR_SIZE = 23;
-
-        protected Point computeSize(Composite composite, int wHint, int hHint,
-                boolean flushCache) {
-            if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT) {
-				return new Point(wHint, hHint);
-			}
-
-            Point result = new Point(0, 0);
-            Control[] ws = composite.getChildren();
-            for (int i = 0; i < ws.length; i++) {
-                Control w = ws[i];
-
-                boolean hide = false;
-                if (getToolBarControl() == w) {
-                    if (!toolBarChildrenExist()) {
-                        hide = true;
-                        result.y += BAR_SIZE; // REVISIT
-                    }
-                } else if (getCoolBarControl() == w) {
-                    if (!coolBarChildrenExist()) {
-                        hide = true;
-                        result.y += BAR_SIZE;
-                    }
-                } else if (statusLineManager != null
-                        && statusLineManager.getControl() == w) {
-                } else if (i > 0) { /* we assume this window is contents */
-                    hide = false;
-                }
-
-                if (!hide) {
-                    Point e = w.computeSize(wHint, hHint, flushCache);
-                    result.x = Math.max(result.x, e.x);
-                    result.y += e.y + VGAP;
-                }
-            }
-
-            if (wHint != SWT.DEFAULT) {
-				result.x = wHint;
-			}
-            if (hHint != SWT.DEFAULT) {
-				result.y = hHint;
-			}
-            return result;
-        }
-
-        protected void layout(Composite composite, boolean flushCache) {
-            Rectangle clientArea = composite.getClientArea();
-
-            Control[] ws = composite.getChildren();
-            
-            // Lay out the separator, the tool bar control, the cool bar control, the status line, and the page composite.
-            // The following code assumes that the page composite is the last child, and that there are no unexpected other controls.
-
-            for (int i = 0; i < ws.length; i++) {
-                Control w = ws[i];
-
-                if (w == seperator1) { // Separator
-                    Point e = w.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-                            flushCache);
-                    w.setBounds(clientArea.x, clientArea.y, clientArea.width,
-                            e.y);
-                    clientArea.y += e.y;
-                    clientArea.height -= e.y;
-                } else if (getToolBarControl() == w) {
-                    if (toolBarChildrenExist()) {
-                        Point e = w.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-                                flushCache);
-                        w.setBounds(clientArea.x, clientArea.y,
-                                clientArea.width, e.y);
-                        clientArea.y += e.y + VGAP;
-                        clientArea.height -= e.y + VGAP;
-                    }
-                } else if (getCoolBarControl() == w) {
-                    if (coolBarChildrenExist()) {
-                        Point e = w.computeSize(clientArea.width, SWT.DEFAULT,
-                                flushCache);
-                        w.setBounds(clientArea.x, clientArea.y,
-                                clientArea.width, e.y);
-                        clientArea.y += e.y + VGAP;
-                        clientArea.height -= e.y + VGAP;
-                    }
-                } else if (statusLineManager != null
-                        && statusLineManager.getControl() == w) {
-                    Point e = w.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-                            flushCache);
-                    w.setBounds(clientArea.x, clientArea.y + clientArea.height
-                            - e.y, clientArea.width, e.y);
-                    clientArea.height -= e.y + VGAP;
-                } else {
-                    w.setBounds(clientArea.x, clientArea.y + VGAP,
-                            clientArea.width, clientArea.height - VGAP);
-                }
-            }
-        }
-    }
-
-    /**
-     * Return the top seperator.
-     * @return Label
-     */
-    protected Label getSeperator1() {
-        return seperator1;
-    }
-
-    /**
-     * Create an application window instance, whose shell will be created under the
-     * given parent shell.
-     * Note that the window will have no visual representation (no widgets)
-     * until it is told to open. By default, <code>open</code> does not block.
-     *
-     * @param parentShell the parent shell, or <code>null</code> to create a top-level shell
-     */
-    public ApplicationWindow(Shell parentShell) {
-        super(parentShell);
-    }
-
-    /**
-     * Configures this window to have a menu bar.
-     * Does nothing if it already has one.
-     * This method must be called before this window's shell is created.
-     */
-    protected void addMenuBar() {
-        if ((getShell() == null) && (menuBarManager == null)) {
-            menuBarManager = createMenuManager();
-        }
-    }
-
-    /**
-     * Configures this window to have a status line.
-     * Does nothing if it already has one.
-     * This method must be called before this window's shell is created.
-     */
-    protected void addStatusLine() {
-        if ((getShell() == null) && (statusLineManager == null)) {
-            statusLineManager = createStatusLineManager();
-        }
-    }
-
-    /**
-     * Configures this window to have a tool bar.
-     * Does nothing if it already has one.
-     * This method must be called before this window's shell is created.
-     * @param style swt style bits used to create the Toolbar
-     * @see ToolBarManager#ToolBarManager(int)
-     * @see ToolBar for style bits
-     */
-    protected void addToolBar(int style) {
-        if ((getShell() == null) && (toolBarManager == null)
-                && (coolBarManager == null)) {
-            toolBarManager = createToolBarManager2(style);
-        }
-    }
-
-    /**
-     * Configures this window to have a cool bar.
-     * Does nothing if it already has one.
-     * This method must be called before this window's shell is created.
-     * 
-     * @param style the cool bar style
-     * @since 3.0
-     */
-    protected void addCoolBar(int style) {
-        if ((getShell() == null) && (toolBarManager == null)
-                && (coolBarManager == null)) {
-            coolBarManager = createCoolBarManager2(style);
-        }	
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Window.
-     */
-    protected boolean canHandleShellCloseEvent() {
-        return super.canHandleShellCloseEvent() && !operationInProgress;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Window.
-     */
-    public boolean close() {
-        if (operationInProgress) {
-			return false;
-		}
-
-        if (super.close()) {
-            if (menuBarManager != null) {
-                menuBarManager.dispose();
-                menuBarManager = null;
-            }
-            if (toolBarManager != null) {
-            	if (toolBarManager instanceof IToolBarManager2) {
-					((IToolBarManager2) toolBarManager).dispose();
-				} else if (toolBarManager instanceof ToolBarManager) {
-					((ToolBarManager) toolBarManager).dispose();
-				}
-                toolBarManager = null;
-            }
-            if (statusLineManager != null) {
-                statusLineManager.dispose();
-                statusLineManager = null;
-            }
-            if (coolBarManager != null) {
-            	if (coolBarManager instanceof ICoolBarManager2) {
-					((ICoolBarManager2) coolBarManager).dispose();
-				} else if (coolBarManager instanceof CoolBarManager) {
-					((CoolBarManager) coolBarManager).dispose();
-				}
-                coolBarManager = null;
-            }
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Extends the super implementation by creating the trim widgets using <code>createTrimWidgets</code>. 
-     */
-    protected void configureShell(Shell shell) {
-
-        super.configureShell(shell);
-
-        createTrimWidgets(shell);
-    }
-
-    /**
-     * Creates the trim widgets around the content area.
-     * 
-     * @param shell the shell
-     * @since 3.0
-     */
-    protected void createTrimWidgets(Shell shell) {
-        if (menuBarManager != null) {
-        	shell.setMenuBar(menuBarManager.createMenuBar((Decorations) shell));
-            menuBarManager.updateAll(true);
-        }
-
-        if (showTopSeperator()) {
-			seperator1 = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
-		}
-
-        // will create either a cool bar or a tool bar
-        createToolBarControl(shell);
-        createCoolBarControl(shell);
-        createStatusLine(shell);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.window.Window#getLayout()
-     */
-    protected Layout getLayout() {
-        return new ApplicationWindowLayout();
-    }
-
-    /**
-     * Returns whether to show a top separator line between the menu bar
-     * and the rest of the window contents.  On some platforms such as the Mac,
-     * the menu is separated from the main window already, so a separator line
-     * is not desired. 
-     * 
-     * @return <code>true</code> to show the top separator, <code>false</code>
-     *   to not show it
-     * @since 3.0
-     */
-    protected boolean showTopSeperator() {
-        return !Util.isMac();
-    }
-
-    /**
-     * Create the status line if required.
-     * @param shell
-     */
-    protected void createStatusLine(Shell shell) {
-        if (statusLineManager != null) {
-            statusLineManager.createControl(shell, SWT.NONE);
-        }
-    }
-
-    /**
-     * Returns a new menu manager for the window.
-     * <p>
-     * Subclasses may override this method to customize the menu manager.
-     * </p>
-     * @return a menu manager
-     */
-    protected MenuManager createMenuManager() {
-        return new MenuManager();
-    }
-
-    /**
-     * Returns a new status line manager for the window.
-     * <p>
-     * Subclasses may override this method to customize the status line manager.
-     * </p>
-     * @return a status line manager
-     */
-    protected StatusLineManager createStatusLineManager() {
-        return new StatusLineManager();
-    }
-
-    /**
-     * Returns a new tool bar manager for the window.
-     * <p>
-     * Subclasses may override this method to customize the tool bar manager.
-     * </p>
-     * @param style swt style bits used to create the Toolbar
-     * 
-     * @return a tool bar manager
-     * @see ToolBarManager#ToolBarManager(int)
-     * @see ToolBar for style bits
-     */
-    protected ToolBarManager createToolBarManager(int style) {
-        return new ToolBarManager(style);
-    }
-    
-    /**
-     * Returns a new tool bar manager for the window. 
-     * <p> 
-     * By default this method calls <code>createToolBarManager</code>.  Subclasses
-     * may override this method to provide an alternative implementation for the
-     * tool bar manager.
-     * </p>
-     * 
-	 * @param style swt style bits used to create the Toolbar
-     *  
-     * @return a tool bar manager
-     * @since 3.2
-     * @see #createToolBarManager(int)
-     */
-    protected IToolBarManager createToolBarManager2(int style) {
-        return createToolBarManager(style);
-    }
-
-    /**
-     * Returns a new cool bar manager for the window.
-     * <p>
-     * Subclasses may override this method to customize the cool bar manager.
-     * </p>
-     * 
-     * @param style swt style bits used to create the Coolbar
-     * 
-     * @return a cool bar manager
-     * @since 3.0
-     * @see CoolBarManager#CoolBarManager(int)
-     * @see CoolBar for style bits
-     */
-    protected CoolBarManager createCoolBarManager(int style) {
-        return new CoolBarManager(style);
-    }
-    
-    /**
-     * Returns a new cool bar manager for the window.
-     * <p>
-     * By default this method calls <code>createCoolBarManager</code>.  Subclasses
-     * may override this method to provide an alternative implementation for the
-     * cool bar manager.
-     * </p>
-     * 
-	 * @param style swt style bits used to create the Coolbar
-     * 
-     * @return a cool bar manager
-     * @since 3.2
-     * @see #createCoolBarManager(int)
-     */
-    protected ICoolBarManager createCoolBarManager2(int style) {
-        return createCoolBarManager(style);
-    }
-
-    /**
-     * Creates the control for the tool bar manager.
-     * <p>
-     * Subclasses may override this method to customize the tool bar manager.
-     * </p>
-     * @param parent the parent used for the control
-     * @return a Control
-     */
-    protected Control createToolBarControl(Composite parent) {
-        if (toolBarManager != null) {
-        	if (toolBarManager instanceof IToolBarManager2) {
-				return ((IToolBarManager2) toolBarManager).createControl2(parent);
-			}
-        	if (toolBarManager instanceof ToolBarManager) {
-				return ((ToolBarManager) toolBarManager).createControl(parent);
-			}
-        }
-        return null;
-    }
-
-    /**
-     * Creates the control for the cool bar manager.
-     * <p>
-     * Subclasses may override this method to customize the cool bar manager.
-     * </p>
-     * @param composite the parent used for the control
-     * 
-     * @return an instance of <code>CoolBar</code>
-     * @since 3.0
-     */
-    protected Control createCoolBarControl(Composite composite) {
-        if (coolBarManager != null) {
-        	if (coolBarManager instanceof ICoolBarManager2) {
-				return ((ICoolBarManager2) coolBarManager).createControl2(composite);
-			}
-        	if (coolBarManager instanceof CoolBarManager) {
-				return ((CoolBarManager) coolBarManager).createControl(composite);
-			}
-        }
-        return null;
-    }
-
-    /**
-     * Returns the default font used for this window.
-     * <p>
-     * The default implementation of this framework method
-     * obtains the symbolic name of the font from the
-     * <code>getSymbolicFontName</code> framework method
-     * and retrieves this font from JFace's font
-     * registry using <code>JFaceResources.getFont</code>.
-     * Subclasses may override to use a different registry,
-     * etc.
-     * </p>
-     *
-     * @return the default font, or <code>null</code> if none
-     */
-    protected Font getFont() {
-        return JFaceResources.getFont(getSymbolicFontName());
-    }
-
-    /**
-     * Returns the menu bar manager for this window (if it has one).
-     *
-     * @return the menu bar manager, or <code>null</code> if
-     *   this window does not have a menu bar
-     * @see #addMenuBar()
-     */
-    public MenuManager getMenuBarManager() {
-        return menuBarManager;
-    }
-
-    /**
-     * Returns the status line manager for this window (if it has one).
-     *
-     * @return the status line manager, or <code>null</code> if
-     *   this window does not have a status line
-     * @see #addStatusLine
-     */
-    protected StatusLineManager getStatusLineManager() {
-        return statusLineManager;
-    }
-
-    /**
-     * Returns the symbolic font name of the font to be
-     * used to display text in this window.
-     * This is not recommended and is included for backwards
-     * compatability.
-     * It is recommended to use the default font provided by
-     * SWT (that is, do not set the font).
-     * 
-     * @return the symbolic font name
-     */
-    public String getSymbolicFontName() {
-        return JFaceResources.TEXT_FONT;
-    }
-
-    /**
-     * Returns the tool bar manager for this window (if it has one).
-     *
-     * @return the tool bar manager, or <code>null</code> if
-     *   this window does not have a tool bar
-     * @see #addToolBar(int)
-     */
-    public ToolBarManager getToolBarManager() {
-    	if (toolBarManager instanceof ToolBarManager) {
-			return (ToolBarManager)toolBarManager;
-		}
-        return null;
-    }
-    
-    /**
-     * Returns the tool bar manager for this window (if it has one).
-     * 
-	 * @return the tool bar manager, or <code>null</code> if
-     *   this window does not have a tool bar
-     * @see #addToolBar(int)
-	 * @since 3.2
-     */
-    public IToolBarManager getToolBarManager2() {
-        return toolBarManager;
-    }
-
-    /**
-     * Returns the cool bar manager for this window.
-     *
-     * @return the cool bar manager, or <code>null</code> if
-     *   this window does not have a cool bar
-     * @see #addCoolBar(int)
-     * @since 3.0
-     */
-    public CoolBarManager getCoolBarManager() {
-    	if (coolBarManager instanceof CoolBarManager) {
-			return (CoolBarManager)coolBarManager;
-		}
-        return null;
-    }
-    
-    /**
-     * Returns the cool bar manager for this window.
-     * 
-	 * @return the cool bar manager, or <code>null</code> if
-     *   this window does not have a cool bar
-     * @see #addCoolBar(int)
-     * @since 3.2
-     */
-    public ICoolBarManager getCoolBarManager2() {
-        return coolBarManager;
-    }
-
-    /**
-     * Returns the control for the window's toolbar.
-     * <p>
-     * Subclasses may override this method to customize the tool bar manager.
-     * </p>
-     * @return a Control
-     */
-    protected Control getToolBarControl() {
-        if (toolBarManager != null) {
-        	if (toolBarManager instanceof IToolBarManager2) {
-				return ((IToolBarManager2) toolBarManager).getControl2();
-			}
-        	if (toolBarManager instanceof ToolBarManager) {
-				return ((ToolBarManager) toolBarManager).getControl();
-			}
-        }
-        return null;
-    }
-
-    /**
-     * Returns the control for the window's cool bar.
-     * <p>
-     * Subclasses may override this method to customize the cool bar manager.
-     * </p>
-     * 
-     * @return an instance of <code>CoolBar</code>
-     * @since 3.0
-     */
-    protected Control getCoolBarControl() {
-        if (coolBarManager != null) {
-        	if (coolBarManager instanceof ICoolBarManager2) {
-				return ((ICoolBarManager2) coolBarManager).getControl2();
-			}
-        	if (coolBarManager instanceof CoolBarManager) {
-				return ((CoolBarManager) coolBarManager).getControl();
-			}
-        }
-        return null;
-    }
-
-    /**
-     * This implementation of IRunnableContext#run(boolean, boolean,
-     * IRunnableWithProgress) blocks until the runnable has been run,
-     * regardless of the value of <code>fork</code>.
-     * It is recommended that <code>fork</code> is set to
-     * true in most cases. If <code>fork</code> is set to <code>false</code>,
-     * the runnable will run in the UI thread and it is the runnable's
-     * responsibility to call <code>Display.readAndDispatch()</code>
-     * to ensure UI responsiveness.
-     */
-    public void run(final boolean fork, boolean cancelable,
-            final IRunnableWithProgress runnable)
-            throws InvocationTargetException, InterruptedException {
-        try {
-            operationInProgress = true;
-            final StatusLineManager mgr = getStatusLineManager();
-            if (mgr == null) {
-                runnable.run(new NullProgressMonitor());
-                return;
-            }
-            boolean cancelWasEnabled = mgr.isCancelEnabled();
-
-            final Control contents = getContents();
-            final Display display = contents.getDisplay();
-            Shell shell = getShell();
-            boolean contentsWasEnabled = contents.getEnabled();
-            MenuManager manager = getMenuBarManager();
-            Menu menuBar = null;
-            if (manager != null) {
-                menuBar = manager.getMenu();
-                manager = null;
-            }
-            boolean menuBarWasEnabled = false;
-            if (menuBar != null) {
-				menuBarWasEnabled = menuBar.getEnabled();
-			}
-
-            Control toolbarControl = getToolBarControl();
-            boolean toolbarWasEnabled = false;
-            if (toolbarControl != null) {
-				toolbarWasEnabled = toolbarControl.getEnabled();
-			}
-
-            Control coolbarControl = getCoolBarControl();
-            boolean coolbarWasEnabled = false;
-            if (coolbarControl != null) {
-				coolbarWasEnabled = coolbarControl.getEnabled();
-			}
-
-            // Disable the rest of the shells on the current display
-            Shell[] shells = display.getShells();
-            boolean[] enabled = new boolean[shells.length];
-            for (int i = 0; i < shells.length; i++) {
-                Shell current = shells[i];
-                if (current == shell) {
-					continue;
-				}
-                if (current != null && !current.isDisposed()) {
-                    enabled[i] = current.getEnabled();
-                    current.setEnabled(false);
-                }
-            }
-
-            Control currentFocus = display.getFocusControl();
-            try {
-                contents.setEnabled(false);
-                if (menuBar != null) {
-					menuBar.setEnabled(false);
-				}
-                if (toolbarControl != null) {
-					toolbarControl.setEnabled(false);
-				}
-                if (coolbarControl != null) {
-					coolbarControl.setEnabled(false);
-				}
-                mgr.setCancelEnabled(cancelable);
-                final Exception[] holder = new Exception[1];
-                BusyIndicator.showWhile(display, new Runnable() {
-                    public void run() {
-                        try {
-                            ModalContext.run(runnable, fork, mgr
-                                    .getProgressMonitor(), display);
-                        } catch (InvocationTargetException ite) {
-                            holder[0] = ite;
-                        } catch (InterruptedException ie) {
-                            holder[0] = ie;
-                        }
-                    }
-                });
-
-                if (holder[0] != null) {
-                    if (holder[0] instanceof InvocationTargetException) {
-                        throw (InvocationTargetException) holder[0];
-                    } else if (holder[0] instanceof InterruptedException) {
-                        throw (InterruptedException) holder[0];
-                    }
-                }
-            } finally {
-                operationInProgress = false;
-                // Enable the rest of the shells on the current display
-                for (int i = 0; i < shells.length; i++) {
-                    Shell current = shells[i];
-                    if (current == shell) {
-						continue;
-					}
-                    if (current != null && !current.isDisposed()) {
-                        current.setEnabled(enabled[i]);
-                    }
-                }
-                if (!contents.isDisposed()) {
-					contents.setEnabled(contentsWasEnabled);
-				}
-                if (menuBar != null && !menuBar.isDisposed()) {
-					menuBar.setEnabled(menuBarWasEnabled);
-				}
-                if (toolbarControl != null && !toolbarControl.isDisposed()) {
-					toolbarControl.setEnabled(toolbarWasEnabled);
-				}
-                if (coolbarControl != null && !coolbarControl.isDisposed()) {
-					coolbarControl.setEnabled(coolbarWasEnabled);
-				}
-                mgr.setCancelEnabled(cancelWasEnabled);
-                if (currentFocus != null && !currentFocus.isDisposed()) {
-                    // It's necessary to restore focus after reenabling the controls
-                    // because disabling them causes focus to jump elsewhere.
-                    // Use forceFocus rather than setFocus to avoid SWT's
-                    // search for children which can take focus, so focus
-                    // ends up back on the actual control that previously had it.
-                    currentFocus.forceFocus();
-                }
-            }
-        } finally {
-            operationInProgress = false;
-        }
-    }
-
-    /**
-     * Sets or clears the message displayed in this window's status
-     * line (if it has one). This method has no effect if the
-     * window does not have a status line.
-     *
-     * @param message the status message, or <code>null</code> to clear it
-     */
-    public void setStatus(String message) {
-        if (statusLineManager != null) {
-            statusLineManager.setMessage(message);
-        }
-    }
-
-    /**
-     * Returns whether or not children exist for the Application Window's
-     * toolbar control.
-     * <p>
-     * @return boolean true if children exist, false otherwise
-     */
-    protected boolean toolBarChildrenExist() {
-        Control toolControl = getToolBarControl();
-        if (toolControl instanceof ToolBar) {
-            return ((ToolBar) toolControl).getItemCount() > 0;
-        }
-        return false;
-    }
-
-    /**
-     * Returns whether or not children exist for this application window's
-     * cool bar control.
-     * 
-     * @return boolean true if children exist, false otherwise
-     * @since 3.0
-     */
-    protected boolean coolBarChildrenExist() {
-        Control coolControl = getCoolBarControl();
-        if (coolControl instanceof CoolBar) {
-            return ((CoolBar) coolControl).getItemCount() > 0;
-        }
-        return false;
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/DefaultToolTip.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/window/DefaultToolTip.java
deleted file mode 100644
index 226102b..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/DefaultToolTip.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.window;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-
-/**
- * Default implementation of ToolTip that provides an iconofied label with font
- * and color controls by subclass.
- * 
- * @since 3.3
- */
-public class DefaultToolTip extends ToolTip {
-	private String text;
-
-	private Color backgroundColor;
-
-	private Font font;
-
-	private Image backgroundImage;
-
-	private Color foregroundColor;
-
-	private Image image;
-
-	private int style = SWT.SHADOW_NONE;
-
-	/**
-	 * Create new instance which add TooltipSupport to the widget
-	 * 
-	 * @param control the control on whose action the tooltip is shown
-	 */
-	public DefaultToolTip(Control control) {
-		super(control);
-	}
-
-	/**
-	 * Create new instance which add TooltipSupport to the widget
-	 * 
-	 * @param control the control to which the tooltip is bound
-	 * @param style style passed to control tooltip behaviour
-	 * @param manualActivation <code>true</code> if the activation is done manually using
-	 *            {@link #show(Point)}
-	 * @see #RECREATE
-	 * @see #NO_RECREATE
-	 */
-	public DefaultToolTip(Control control, int style, boolean manualActivation) {
-		super(control, style, manualActivation);
-	}
-	
-	/**
-	 * Creates the content are of the the tooltip. By default this creates a
-	 * CLabel to display text. To customize the text Subclasses may override the
-	 * following methods
-	 * <ul>
-	 * <li>{@link #getStyle(Event)}</li>
-	 * <li>{@link #getBackgroundColor(Event)}</li>
-	 * <li>{@link #getForegroundColor(Event)}</li>
-	 * <li>{@link #getFont(Event)}</li>
-	 * <li>{@link #getImage(Event)}</li>
-	 * <li>{@link #getText(Event)}</li>
-	 * <li>{@link #getBackgroundImage(Event)}</li>
-	 * </ul>
-	 * 
-	 * @param event
-	 *            the event that triggered the activation of the tooltip
-	 * @param parent
-	 *            the parent of the content area
-	 * @return the content area created
-	 */
-	protected Composite createToolTipContentArea(Event event, Composite parent) {
-		Image image = getImage(event);
-		Image bgImage = getBackgroundImage(event);
-		String text = getText(event);
-		Color fgColor = getForegroundColor(event);
-		Color bgColor = getBackgroundColor(event);
-		Font font = getFont(event);
-
-		CLabel label = new CLabel(parent, getStyle(event));
-		if (text != null) {
-			label.setText(text);
-		}
-
-		if (image != null) {
-			label.setImage(image);
-		}
-
-		if (fgColor != null) {
-			label.setForeground(fgColor);
-		}
-
-		if (bgColor != null) {
-			label.setBackground(bgColor);
-		}
-
-		if (bgImage != null) {
-			label.setBackgroundImage(image);
-		}
-
-		if (font != null) {
-			label.setFont(font);
-		}
-
-		return label;
-	}
-
-	/**
-	 * The style used to create the {@link CLabel} in the default implementation
-	 * 
-	 * @param event
-	 *            the event triggered the popup of the tooltip
-	 * @return the style
-	 */
-	protected int getStyle(Event event) {
-		return style;
-	}
-
-	/**
-	 * The {@link Image} displayed in the {@link CLabel} in the default
-	 * implementation implementation
-	 * 
-	 * @param event
-	 *            the event triggered the popup of the tooltip
-	 * @return the {@link Image} or <code>null</code> if no image should be
-	 *         displayed
-	 */
-	protected Image getImage(Event event) {
-		return image;
-	}
-
-	/**
-	 * The foreground {@link Color} used by {@link CLabel} in the default
-	 * implementation
-	 * 
-	 * @param event
-	 *            the event triggered the popup of the tooltip
-	 * @return the {@link Color} or <code>null</code> if default foreground
-	 *         color should be used
-	 */
-	protected Color getForegroundColor(Event event) {
-		return (foregroundColor == null) ? event.widget.getDisplay()
-				.getSystemColor(SWT.COLOR_INFO_FOREGROUND) : foregroundColor;
-	}
-
-	/**
-	 * The background {@link Color} used by {@link CLabel} in the default
-	 * implementation
-	 * 
-	 * @param event
-	 *            the event triggered the popup of the tooltip
-	 * @return the {@link Color} or <code>null</code> if default background
-	 *         color should be used
-	 */
-	protected Color getBackgroundColor(Event event) {
-		return (backgroundColor == null) ? event.widget.getDisplay()
-				.getSystemColor(SWT.COLOR_INFO_BACKGROUND) : backgroundColor;
-	}
-
-	/**
-	 * The background {@link Image} used by {@link CLabel} in the default
-	 * implementation
-	 * 
-	 * @param event
-	 *            the event triggered the popup of the tooltip
-	 * @return the {@link Image} or <code>null</code> if no image should be
-	 *         displayed in the background
-	 */
-	protected Image getBackgroundImage(Event event) {
-		return backgroundImage;
-	}
-
-	/**
-	 * The {@link Font} used by {@link CLabel} in the default implementation
-	 * 
-	 * @param event
-	 *            the event triggered the popup of the tooltip
-	 * @return the {@link Font} or <code>null</code> if the default font
-	 *         should be used
-	 */
-	protected Font getFont(Event event) {
-		return font;
-	}
-
-	/**
-	 * The text displayed in the {@link CLabel} in the default implementation
-	 * 
-	 * @param event
-	 *            the event triggered the popup of the tooltip
-	 * @return the text or <code>null</code> if no text has to be displayed
-	 */
-	protected String getText(Event event) {
-		return text;
-	}
-
-	/**
-	 * The background {@link Image} used by {@link CLabel} in the default
-	 * implementation
-	 * 
-	 * @param backgroundColor
-	 *            the {@link Color} or <code>null</code> if default background
-	 *            color ({@link SWT#COLOR_INFO_BACKGROUND}) should be used
-	 */
-	public void setBackgroundColor(Color backgroundColor) {
-		this.backgroundColor = backgroundColor;
-	}
-
-	/**
-	 * The background {@link Image} used by {@link CLabel} in the default
-	 * implementation
-	 * 
-	 * @param backgroundImage
-	 *            the {@link Image} or <code>null</code> if no image should be
-	 *            displayed in the background
-	 */
-	public void setBackgroundImage(Image backgroundImage) {
-		this.backgroundImage = backgroundImage;
-	}
-
-	/**
-	 * The {@link Font} used by {@link CLabel} in the default implementation
-	 * 
-	 * @param font
-	 *            the {@link Font} or <code>null</code> if the default font
-	 *            should be used
-	 */
-	public void setFont(Font font) {
-		this.font = font;
-	}
-
-	/**
-	 * The foreground {@link Color} used by {@link CLabel} in the default
-	 * implementation
-	 * 
-	 * @param foregroundColor
-	 *            the {@link Color} or <code>null</code> if default foreground
-	 *            color should be used
-	 */
-	public void setForegroundColor(Color foregroundColor) {
-		this.foregroundColor = foregroundColor;
-	}
-
-	/**
-	 * The {@link Image} displayed in the {@link CLabel} in the default
-	 * implementation implementation
-	 * 
-	 * @param image
-	 *            the {@link Image} or <code>null</code> if no image should be
-	 *            displayed
-	 */
-	public void setImage(Image image) {
-		this.image = image;
-	}
-
-	/**
-	 * The style used to create the {@link CLabel} in the default implementation
-	 * 
-	 * @param style
-	 *            the event triggered the popup of the tooltip
-	 */
-	public void setStyle(int style) {
-		this.style = style;
-	}
-
-	/**
-	 * The text displayed in the {@link CLabel} in the default implementation
-	 * 
-	 * @param text
-	 *            the text or <code>null</code> if no text has to be displayed
-	 */
-	public void setText(String text) {
-		this.text = text;
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/IShellProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/window/IShellProvider.java
deleted file mode 100644
index 23eb9a8..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/IShellProvider.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.window;
-
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Interface for objects that can return a shell. This is normally used for 
- * opening child windows. An object that wants to open child shells can take 
- * an IShellProvider in its constructor, and the object that implements IShellProvider
- * can dynamically choose where child shells should be opened.  
- * 
- * @since 3.1
- */
-public interface IShellProvider {
-    /**
-     * Returns the current shell (or null if none). This return value may
-     * change over time, and should not be cached.
-     * 
-     * @return the current shell or null if none
-     */
-    Shell getShell();
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/SameShellProvider.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/window/SameShellProvider.java
deleted file mode 100644
index 1ed0e8d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/SameShellProvider.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.window;
-
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Standard shell provider that always returns the shell containing the given
- * control. This will always return the correct shell for the control, even if
- * the control is reparented.
- * 
- * @since 3.1
- */
-public class SameShellProvider implements IShellProvider {
-
-    private Control targetControl;
-    
-    /**
-     * Returns a shell provider that always returns the current
-     * shell for the given control.
-     * 
-     * @param targetControl control whose shell will be tracked, or null if getShell() should always
-     * return null
-     */
-    public SameShellProvider(Control targetControl) {
-        this.targetControl = targetControl;
-    }
-    
-    /* (non-javadoc)
-     * @see IShellProvider#getShell()
-     */
-    public Shell getShell() {
-        if (targetControl instanceof Shell) {
-            return (Shell)targetControl;
-        }
-        
-        return targetControl == null? null :targetControl.getShell();
-    }
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/ToolTip.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/window/ToolTip.java
deleted file mode 100644
index 672f77d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/ToolTip.java
+++ /dev/null
@@ -1,731 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
- *                                                 bugfix in: 195137, 198089, 225190
- *******************************************************************************/
-
-package org.eclipse.jface.window;
-
-import java.util.HashMap;
-
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Monitor;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * This class gives implementors to provide customized tooltips for any control.
- * 
- * @since 3.3
- */
-public abstract class ToolTip {
-	private Control control;
-
-	private int xShift = 3;
-
-	private int yShift = 0;
-
-	private int popupDelay = 0;
-
-	private int hideDelay = 0;
-
-	private ToolTipOwnerControlListener listener;
-
-	private HashMap data;
-
-	// Ensure that only one tooltip is active in time
-	private static Shell CURRENT_TOOLTIP;
-
-	/**
-	 * Recreate the tooltip on every mouse move
-	 */
-	public static final int RECREATE = 1;
-
-	/**
-	 * Don't recreate the tooltip as long the mouse doesn't leave the area
-	 * triggering the tooltip creation
-	 */
-	public static final int NO_RECREATE = 1 << 1;
-
-	private TooltipHideListener hideListener = new TooltipHideListener();
-
-	private Listener shellListener;
-
-	private boolean hideOnMouseDown = true;
-
-	private boolean respectDisplayBounds = true;
-
-	private boolean respectMonitorBounds = true;
-
-	private int style;
-
-	private Object currentArea;
-
-	private static final boolean IS_OSX = Util.isCarbon();
-
-	/**
-	 * Create new instance which add TooltipSupport to the widget
-	 * 
-	 * @param control
-	 *            the control on whose action the tooltip is shown
-	 */
-	public ToolTip(Control control) {
-		this(control, RECREATE, false);
-	}
-
-	/**
-	 * @param control
-	 *            the control to which the tooltip is bound
-	 * @param style
-	 *            style passed to control tooltip behavior
-	 * 
-	 * @param manualActivation
-	 *            <code>true</code> if the activation is done manually using
-	 *            {@link #show(Point)}
-	 * @see #RECREATE
-	 * @see #NO_RECREATE
-	 */
-	public ToolTip(Control control, int style, boolean manualActivation) {
-		this.control = control;
-		this.style = style;
-		this.control.addDisposeListener(new DisposeListener() {
-
-			public void widgetDisposed(DisposeEvent e) {
-				data = null;
-				deactivate();
-			}
-
-		});
-
-		this.listener = new ToolTipOwnerControlListener();
-		this.shellListener = new Listener() {
-			public void handleEvent(final Event event) {
-				if (ToolTip.this.control != null
-						&& !ToolTip.this.control.isDisposed()) {
-					ToolTip.this.control.getDisplay().asyncExec(new Runnable() {
-
-						public void run() {
-							// Check if the new active shell is the tooltip
-							// itself
-							if (ToolTip.this.control.getDisplay()
-									.getActiveShell() != CURRENT_TOOLTIP) {
-								toolTipHide(CURRENT_TOOLTIP, event);
-							}
-						}
-
-					});
-				}
-			}
-		};
-
-		if (!manualActivation) {
-			activate();
-		}
-	}
-
-	/**
-	 * Restore arbitrary data under the given key
-	 * 
-	 * @param key
-	 *            the key
-	 * @param value
-	 *            the value
-	 */
-	public void setData(String key, Object value) {
-		if (data == null) {
-			data = new HashMap();
-		}
-		data.put(key, value);
-	}
-
-	/**
-	 * Get the data restored under the key
-	 * 
-	 * @param key
-	 *            the key
-	 * @return data or <code>null</code> if no entry is restored under the key
-	 */
-	public Object getData(String key) {
-		if (data != null) {
-			return data.get(key);
-		}
-		return null;
-	}
-
-	/**
-	 * Set the shift (from the mouse position triggered the event) used to
-	 * display the tooltip.
-	 * <p>
-	 * By default the tooltip is shifted 3 pixels to the right.
-	 * </p>
-	 * 
-	 * @param p
-	 *            the new shift
-	 */
-	public void setShift(Point p) {
-		xShift = p.x;
-		yShift = p.y;
-	}
-
-	/**
-	 * Activate tooltip support for this control
-	 */
-	public void activate() {
-		deactivate();
-		control.addListener(SWT.Dispose, listener);
-		control.addListener(SWT.MouseHover, listener);
-		control.addListener(SWT.MouseMove, listener);
-		control.addListener(SWT.MouseExit, listener);
-		control.addListener(SWT.MouseDown, listener);
-		control.addListener(SWT.MouseWheel, listener);
-	}
-
-	/**
-	 * Deactivate tooltip support for the underlying control
-	 */
-	public void deactivate() {
-		control.removeListener(SWT.Dispose, listener);
-		control.removeListener(SWT.MouseHover, listener);
-		control.removeListener(SWT.MouseMove, listener);
-		control.removeListener(SWT.MouseExit, listener);
-		control.removeListener(SWT.MouseDown, listener);
-		control.removeListener(SWT.MouseWheel, listener);
-	}
-
-	/**
-	 * Return whether the tooltip respects bounds of the display.
-	 * 
-	 * @return <code>true</code> if the tooltip respects bounds of the display
-	 */
-	public boolean isRespectDisplayBounds() {
-		return respectDisplayBounds;
-	}
-
-	/**
-	 * Set to <code>false</code> if display bounds should not be respected or
-	 * to <code>true</code> if the tooltip is should repositioned to not
-	 * overlap the display bounds.
-	 * <p>
-	 * Default is <code>true</code>
-	 * </p>
-	 * 
-	 * @param respectDisplayBounds
-	 */
-	public void setRespectDisplayBounds(boolean respectDisplayBounds) {
-		this.respectDisplayBounds = respectDisplayBounds;
-	}
-
-	/**
-	 * Return whether the tooltip respects bounds of the monitor.
-	 * 
-	 * @return <code>true</code> if tooltip respects the bounds of the monitor
-	 */
-	public boolean isRespectMonitorBounds() {
-		return respectMonitorBounds;
-	}
-
-	/**
-	 * Set to <code>false</code> if monitor bounds should not be respected or
-	 * to <code>true</code> if the tooltip is should repositioned to not
-	 * overlap the monitors bounds. The monitor the tooltip belongs to is the
-	 * same is control's monitor the tooltip is shown for.
-	 * <p>
-	 * Default is <code>true</code>
-	 * </p>
-	 * 
-	 * @param respectMonitorBounds
-	 */
-	public void setRespectMonitorBounds(boolean respectMonitorBounds) {
-		this.respectMonitorBounds = respectMonitorBounds;
-	}
-
-	/**
-	 * Should the tooltip displayed because of the given event.
-	 * <p>
-	 * <b>Subclasses may overwrite this to get custom behavior</b>
-	 * </p>
-	 * 
-	 * @param event
-	 *            the event
-	 * @return <code>true</code> if tooltip should be displayed
-	 */
-	protected boolean shouldCreateToolTip(Event event) {
-		if ((style & NO_RECREATE) != 0) {
-			Object tmp = getToolTipArea(event);
-
-			// No new area close the current tooltip
-			if (tmp == null) {
-				hide();
-				return false;
-			}
-
-			boolean rv = !tmp.equals(currentArea);
-			return rv;
-		}
-
-		return true;
-	}
-
-	/**
-	 * This method is called before the tooltip is hidden
-	 * 
-	 * @param event
-	 *            the event trying to hide the tooltip
-	 * @return <code>true</code> if the tooltip should be hidden
-	 */
-	private boolean shouldHideToolTip(Event event) {
-		if (event != null && event.type == SWT.MouseMove
-				&& (style & NO_RECREATE) != 0) {
-			Object tmp = getToolTipArea(event);
-
-			// No new area close the current tooltip
-			if (tmp == null) {
-				hide();
-				return false;
-			}
-
-			boolean rv = !tmp.equals(currentArea);
-			return rv;
-		}
-
-		return true;
-	}
-
-	/**
-	 * This method is called to check for which area the tooltip is
-	 * created/hidden for. In case of {@link #NO_RECREATE} this is used to
-	 * decide if the tooltip is hidden recreated.
-	 * 
-	 * <code>By the default it is the widget the tooltip is created for but could be any object. To decide if
-	 * the area changed the {@link Object#equals(Object)} method is used.</code>
-	 * 
-	 * @param event
-	 *            the event
-	 * @return the area responsible for the tooltip creation or
-	 *         <code>null</code> this could be any object describing the area
-	 *         (e.g. the {@link Control} onto which the tooltip is bound to, a
-	 *         part of this area e.g. for {@link ColumnViewer} this could be a
-	 *         {@link ViewerCell})
-	 */
-	protected Object getToolTipArea(Event event) {
-		return control;
-	}
-
-	/**
-	 * Start up the tooltip programmatically
-	 * 
-	 * @param location
-	 *            the location relative to the control the tooltip is shown
-	 */
-	public void show(Point location) {
-		Event event = new Event();
-		event.x = location.x;
-		event.y = location.y;
-		event.widget = control;
-		toolTipCreate(event);
-	}
-
-	private Shell toolTipCreate(final Event event) {
-		if (shouldCreateToolTip(event)) {
-			Shell shell = new Shell(control.getShell(), SWT.ON_TOP | SWT.TOOL
-					| SWT.NO_FOCUS);
-			shell.setLayout(new FillLayout());
-
-			toolTipOpen(shell, event);
-
-			return shell;
-		}
-
-		return null;
-	}
-
-	private void toolTipShow(Shell tip, Event event) {
-		if (!tip.isDisposed()) {
-			currentArea = getToolTipArea(event);
-			createToolTipContentArea(event, tip);
-			if (isHideOnMouseDown()) {
-				toolTipHookBothRecursively(tip);
-			} else {
-				toolTipHookByTypeRecursively(tip, true, SWT.MouseExit);
-			}
-
-			tip.pack();
-			Point size = tip.getSize();
-			Point location = fixupDisplayBounds(size, getLocation(size, event));
-
-			// Need to adjust a bit more if the mouse cursor.y == tip.y and
-			// the cursor.x is inside the tip
-			Point cursorLocation = tip.getDisplay().getCursorLocation();
-
-			if (cursorLocation.y == location.y && location.x < cursorLocation.x
-					&& location.x + size.x > cursorLocation.x) {
-				location.y -= 2;
-			}
-
-			tip.setLocation(location);
-			tip.setVisible(true);
-		}
-	}
-
-	private Point fixupDisplayBounds(Point tipSize, Point location) {
-		if (respectDisplayBounds || respectMonitorBounds) {
-			Rectangle bounds;
-			Point rightBounds = new Point(tipSize.x + location.x, tipSize.y
-					+ location.y);
-
-			Monitor[] ms = control.getDisplay().getMonitors();
-
-			if (respectMonitorBounds && ms.length > 1) {
-				// By default present in the monitor of the control
-				bounds = control.getMonitor().getBounds();
-				Point p = new Point(location.x, location.y);
-
-				// Search on which monitor the event occurred
-				Rectangle tmp;
-				for (int i = 0; i < ms.length; i++) {
-					tmp = ms[i].getBounds();
-					if (tmp.contains(p)) {
-						bounds = tmp;
-						break;
-					}
-				}
-
-			} else {
-				bounds = control.getDisplay().getBounds();
-			}
-
-			if (!(bounds.contains(location) && bounds.contains(rightBounds))) {
-				if (rightBounds.x > bounds.x + bounds.width) {
-					location.x -= rightBounds.x - (bounds.x + bounds.width);
-				}
-
-				if (rightBounds.y > bounds.y + bounds.height) {
-					location.y -= rightBounds.y - (bounds.y + bounds.height);
-				}
-
-				if (location.x < bounds.x) {
-					location.x = bounds.x;
-				}
-
-				if (location.y < bounds.y) {
-					location.y = bounds.y;
-				}
-			}
-		}
-
-		return location;
-	}
-
-	/**
-	 * Get the display relative location where the tooltip is displayed.
-	 * Subclasses may overwrite to implement custom positioning.
-	 * 
-	 * @param tipSize
-	 *            the size of the tooltip to be shown
-	 * @param event
-	 *            the event triggered showing the tooltip
-	 * @return the absolute position on the display
-	 */
-	public Point getLocation(Point tipSize, Event event) {
-		return control.toDisplay(event.x + xShift, event.y + yShift);
-	}
-
-	private void toolTipHide(Shell tip, Event event) {
-		if (tip != null && !tip.isDisposed() && shouldHideToolTip(event)) {
-			control.getShell().removeListener(SWT.Deactivate, shellListener);
-			currentArea = null;
-			passOnEvent(tip, event);
-			tip.dispose();
-			CURRENT_TOOLTIP = null;
-			afterHideToolTip(event);
-		}
-	}
-
-	private void passOnEvent(Shell tip, Event event) {
-		if (control != null && !control.isDisposed() && event != null
-				&& event.widget != control && event.type == SWT.MouseDown) {
-			final Display display = control.getDisplay();
-			Point newPt = display.map(tip, null, new Point(event.x, event.y));
-
-			final Event newEvent = new Event();
-			newEvent.button = event.button;
-			newEvent.character = event.character;
-			newEvent.count = event.count;
-			newEvent.data = event.data;
-			newEvent.detail = event.detail;
-			newEvent.display = event.display;
-			newEvent.doit = event.doit;
-			newEvent.end = event.end;
-			newEvent.gc = event.gc;
-			newEvent.height = event.height;
-			newEvent.index = event.index;
-			newEvent.item = event.item;
-			newEvent.keyCode = event.keyCode;
-			newEvent.start = event.start;
-			newEvent.stateMask = event.stateMask;
-			newEvent.text = event.text;
-			newEvent.time = event.time;
-			newEvent.type = event.type;
-			newEvent.widget = event.widget;
-			newEvent.width = event.width;
-			newEvent.x = newPt.x;
-			newEvent.y = newPt.y;
-
-			tip.close();
-			display.asyncExec(new Runnable() {
-				public void run() {
-					if (IS_OSX) {
-						try {
-							Thread.sleep(300);
-						} catch (InterruptedException e) {
-
-						}
-
-						display.post(newEvent);
-						newEvent.type = SWT.MouseUp;
-						display.post(newEvent);
-					} else {
-						display.post(newEvent);
-					}
-				}
-			});
-		}
-	}
-
-	private void toolTipOpen(final Shell shell, final Event event) {
-		// Ensure that only one Tooltip is shown in time
-		if (CURRENT_TOOLTIP != null) {
-			toolTipHide(CURRENT_TOOLTIP, null);
-		}
-
-		CURRENT_TOOLTIP = shell;
-
-		control.getShell().addListener(SWT.Deactivate, shellListener);
-
-		if (popupDelay > 0) {
-			control.getDisplay().timerExec(popupDelay, new Runnable() {
-				public void run() {
-					toolTipShow(shell, event);
-				}
-			});
-		} else {
-			toolTipShow(CURRENT_TOOLTIP, event);
-		}
-
-		if (hideDelay > 0) {
-			control.getDisplay().timerExec(popupDelay + hideDelay,
-					new Runnable() {
-
-						public void run() {
-							toolTipHide(shell, null);
-						}
-					});
-		}
-	}
-
-	private void toolTipHookByTypeRecursively(Control c, boolean add, int type) {
-		if (add) {
-			c.addListener(type, hideListener);
-		} else {
-			c.removeListener(type, hideListener);
-		}
-
-		if (c instanceof Composite) {
-			Control[] children = ((Composite) c).getChildren();
-			for (int i = 0; i < children.length; i++) {
-				toolTipHookByTypeRecursively(children[i], add, type);
-			}
-		}
-	}
-
-	private void toolTipHookBothRecursively(Control c) {
-		c.addListener(SWT.MouseDown, hideListener);
-		c.addListener(SWT.MouseExit, hideListener);
-
-		if (c instanceof Composite) {
-			Control[] children = ((Composite) c).getChildren();
-			for (int i = 0; i < children.length; i++) {
-				toolTipHookBothRecursively(children[i]);
-			}
-		}
-	}
-
-	/**
-	 * Creates the content area of the the tooltip.
-	 * 
-	 * @param event
-	 *            the event that triggered the activation of the tooltip
-	 * @param parent
-	 *            the parent of the content area
-	 * @return the content area created
-	 */
-	protected abstract Composite createToolTipContentArea(Event event,
-			Composite parent);
-
-	/**
-	 * This method is called after a tooltip is hidden.
-	 * <p>
-	 * <b>Subclasses may override to clean up requested system resources</b>
-	 * </p>
-	 * 
-	 * @param event
-	 *            event triggered the hiding action (may be <code>null</code>
-	 *            if event wasn't triggered by user actions directly)
-	 */
-	protected void afterHideToolTip(Event event) {
-
-	}
-
-	/**
-	 * Set the hide delay.
-	 * 
-	 * @param hideDelay
-	 *            the delay before the tooltip is hidden. If <code>0</code>
-	 *            the tooltip is shown until user moves to other item
-	 */
-	public void setHideDelay(int hideDelay) {
-		this.hideDelay = hideDelay;
-	}
-
-	/**
-	 * Set the popup delay.
-	 * 
-	 * @param popupDelay
-	 *            the delay before the tooltip is shown to the user. If
-	 *            <code>0</code> the tooltip is shown immediately
-	 */
-	public void setPopupDelay(int popupDelay) {
-		this.popupDelay = popupDelay;
-	}
-
-	/**
-	 * Return if hiding on mouse down is set.
-	 * 
-	 * @return <code>true</code> if hiding on mouse down in the tool tip is on
-	 */
-	public boolean isHideOnMouseDown() {
-		return hideOnMouseDown;
-	}
-
-	/**
-	 * If you don't want the tool tip to be hidden when the user clicks inside
-	 * the tool tip set this to <code>false</code>. You maybe also need to
-	 * hide the tool tip yourself depending on what you do after clicking in the
-	 * tooltip (e.g. if you open a new {@link Shell})
-	 * 
-	 * @param hideOnMouseDown
-	 *            flag to indicate of tooltip is hidden automatically on mouse
-	 *            down inside the tool tip
-	 */
-	public void setHideOnMouseDown(final boolean hideOnMouseDown) {
-		// Only needed if there's currently a tooltip active
-		if (CURRENT_TOOLTIP != null && !CURRENT_TOOLTIP.isDisposed()) {
-			// Only change if value really changed
-			if (hideOnMouseDown != this.hideOnMouseDown) {
-				control.getDisplay().syncExec(new Runnable() {
-
-					public void run() {
-						if (CURRENT_TOOLTIP != null
-								&& CURRENT_TOOLTIP.isDisposed()) {
-							toolTipHookByTypeRecursively(CURRENT_TOOLTIP,
-									hideOnMouseDown, SWT.MouseDown);
-						}
-					}
-
-				});
-			}
-		}
-
-		this.hideOnMouseDown = hideOnMouseDown;
-	}
-
-	/**
-	 * Hide the currently active tool tip
-	 */
-	public void hide() {
-		toolTipHide(CURRENT_TOOLTIP, null);
-	}
-
-	private class ToolTipOwnerControlListener implements Listener {
-		public void handleEvent(Event event) {
-			switch (event.type) {
-			case SWT.Dispose:
-			case SWT.KeyDown:
-			case SWT.MouseDown:
-			case SWT.MouseMove:
-			case SWT.MouseWheel:
-				toolTipHide(CURRENT_TOOLTIP, event);
-				break;
-			case SWT.MouseHover:
-				toolTipCreate(event);
-				break;
-			case SWT.MouseExit:
-				/*
-				 * Check if the mouse exit happened because we move over the
-				 * tooltip
-				 */
-				if (CURRENT_TOOLTIP != null && !CURRENT_TOOLTIP.isDisposed()) {
-					if (CURRENT_TOOLTIP.getBounds().contains(
-							control.toDisplay(event.x, event.y))) {
-						break;
-					}
-				}
-
-				toolTipHide(CURRENT_TOOLTIP, event);
-				break;
-			}
-		}
-	}
-
-	private class TooltipHideListener implements Listener {
-		public void handleEvent(Event event) {
-			if (event.widget instanceof Control) {
-
-				Control c = (Control) event.widget;
-				Shell shell = c.getShell();
-
-				switch (event.type) {
-				case SWT.MouseDown:
-					if (isHideOnMouseDown()) {
-						toolTipHide(shell, event);
-					}
-					break;
-				case SWT.MouseExit:
-					/*
-					 * Give some insets to ensure we get exit informations from
-					 * a wider area ;-)
-					 */
-					Rectangle rect = shell.getBounds();
-					rect.x += 5;
-					rect.y += 5;
-					rect.width -= 10;
-					rect.height -= 10;
-
-					if (!rect.contains(c.getDisplay().getCursorLocation())) {
-						toolTipHide(shell, event);
-					}
-
-					break;
-				}
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/Window.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/window/Window.java
deleted file mode 100644
index 76b261c..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/Window.java
+++ /dev/null
@@ -1,1081 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.window;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ShellAdapter;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.swt.events.ShellListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-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.Event;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Monitor;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A JFace window is an object that has no visual representation (no widgets)
- * until it is told to open.
- * <p>
- * Creating a window involves the following steps:
- * <ul>
- * <li>creating an instance of a concrete subclass of <code>Window</code>
- * </li>
- * <li>creating the window's shell and widget tree by calling
- * <code>create</code> (optional)</li>
- * <li>assigning the window to a window manager using
- * <code>WindowManager.add</code> (optional)</li>
- * <li>opening the window by calling <code>open</code></li>
- * </ul>
- * Opening the window will create its shell and widget tree if they have not
- * already been created. When the window is closed, the shell and widget tree
- * are disposed of and are no longer referenced, and the window is automatically
- * removed from its window manager. A window may be reopened.
- * </p>
- * <p>
- * The JFace window framework (this package) consists of this class,
- * <code>Window</code>, the abstract base of all windows, and one concrete
- * window classes (<code>ApplicationWindow</code>) which may also be
- * subclassed. Clients may define additional window subclasses as required.
- * </p>
- * <p>
- * The <code>Window</code> class provides methods that subclasses may 
- * override to configure the window, including:
- * <ul>
- * <li><code>close</code>- extend to free other SWT resources</li>
- * <li><code>configureShell</code>- extend or reimplement to set shell
- * properties before window opens</li>
- * <li><code>createContents</code>- extend or reimplement to create controls
- * before window opens</li>
- * <li><code>getInitialSize</code>- reimplement to give the initial size for
- * the shell</li>
- * <li><code>getInitialLocation</code>- reimplement to give the initial
- * location for the shell</li>
- * <li><code>getShellListener</code>- extend or reimplement to receive shell
- * events</li>
- * <li><code>handleFontChange</code>- reimplement to respond to font changes
- * </li>
- * <li><code>handleShellCloseEvent</code>- extend or reimplement to handle
- * shell closings</li>
- * </ul>
- * </p>
- */
-public abstract class Window implements IShellProvider {
-
-	/**
-	 * Standard return code constant (value 0) indicating that the window was
-	 * opened.
-	 * 
-	 * @see #open
-	 */
-	public static final int OK = 0;
-
-	/**
-	 * Standard return code constant (value 1) indicating that the window was
-	 * canceled.
-	 * 
-	 * @see #open
-	 */
-	public static final int CANCEL = 1;
-
-	/**
-	 * An array of images to be used for the window. It is expected that the
-	 * array will contain the same icon rendered at different resolutions.
-	 */
-	private static Image[] defaultImages;
-
-	/**
-	 * This interface defines a Exception Handler which can be set as a global
-	 * handler and will be called if an exception happens in the event loop.
-	 */
-	public static interface IExceptionHandler {
-		/**
-		 * Handle the exception.
-		 * 
-		 * @param t
-		 *            The exception that occured.
-		 */
-		public void handleException(Throwable t);
-	}
-
-	/**
-	 * Defines a default exception handler.
-	 */
-	private static class DefaultExceptionHandler implements IExceptionHandler {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.window.Window.IExceptionHandler#handleException(java.lang.Throwable)
-		 */
-		public void handleException(Throwable t) {
-			if (t instanceof ThreadDeath) {
-				// Don't catch ThreadDeath as this is a normal occurrence when
-				// the thread dies
-				throw (ThreadDeath) t;
-			}
-			// Try to keep running.
-			t.printStackTrace();
-		}
-	}
-
-	/**
-	 * The exception handler for this application.
-	 */
-	private static IExceptionHandler exceptionHandler = new DefaultExceptionHandler();
-	
-	/**
-	 * The default orientation of the window. By default
-	 * it is SWT#NONE but it can also be SWT#LEFT_TO_RIGHT
-	 * or SWT#RIGHT_TO_LEFT
-	 */
-	private static int orientation = SWT.NONE;
-
-    /**
-     * Object used to locate the default parent for modal shells
-     */
-    private static IShellProvider defaultModalParent = new IShellProvider() {
-        public Shell getShell() {
-            Display d = Display.getCurrent();
-            
-            if (d == null) {
-                return null;
-            }
-
-            Shell parent = d.getActiveShell();
-            
-            // Make sure we don't pick a parent that has a modal child (this can lock the app)
-            if (parent == null) {
-                // If this is a top-level window, then there must not be any open modal windows.
-                parent = getModalChild(Display.getCurrent().getShells());
-            } else {
-                // If we picked a parent with a modal child, use the modal child instead
-                Shell modalChild = getModalChild(parent.getShells());
-                if (modalChild != null) {
-                    parent = modalChild;
-                }
-            }
-            
-            return parent;
-        }
-    };
-    
-	/**
-	 * Object that returns the parent shell.
-	 */
-	private IShellProvider parentShell;
-
-	/**
-	 * Shell style bits.
-	 * 
-	 * @see #setShellStyle
-	 */
-	private int shellStyle = SWT.SHELL_TRIM;
-
-	/**
-	 * Window manager, or <code>null</code> if none.
-	 * 
-	 * @see #setWindowManager
-	 */
-	private WindowManager windowManager;
-
-	/**
-	 * Window shell, or <code>null</code> if none.
-	 */
-	private Shell shell;
-
-	/**
-	 * Top level SWT control, or <code>null</code> if none
-	 */
-	private Control contents;
-
-	/**
-	 * Window return code; initially <code>OK</code>.
-	 * 
-	 * @see #setReturnCode
-	 */
-	private int returnCode = OK;
-
-	/**
-	 * <code>true</code> if the <code>open</code> method should not return
-	 * until the window closes, and <code>false</code> if the
-	 * <code>open</code> method should return immediately; initially
-	 * <code>false</code> (non-blocking).
-	 * 
-	 * @see #setBlockOnOpen
-	 */
-	private boolean block = false;
-
-	/**
-	 * Internal class for informing this window when fonts change.
-	 */
-	private class FontChangeListener implements IPropertyChangeListener {
-		public void propertyChange(PropertyChangeEvent event) {
-			handleFontChange(event);
-		}
-	}
-
-	/**
-	 * Internal font change listener.
-	 */
-	private FontChangeListener fontChangeListener;
-
-	/**
-	 * Internal fields to detect if shell size has been set
-	 */
-	private boolean resizeHasOccurred = false;
-
-	private Listener resizeListener;
- 
-	/**
-	 * Creates a window instance, whose shell will be created under the given
-	 * parent shell. Note that the window will have no visual representation
-	 * until it is told to open. By default, <code>open</code> does not block.
-	 * 
-	 * @param parentShell
-	 *            the parent shell, or <code>null</code> to create a top-level
-	 *            shell. Try passing "(Shell)null" to this method instead of "null"
-     *            if your compiler complains about an ambiguity error.
-	 * @see #setBlockOnOpen
-	 * @see #getDefaultOrientation()
-	 */
-	protected Window(Shell parentShell) {
-        this(new SameShellProvider(parentShell));
-        
-        if(parentShell == null) {
-			setShellStyle(getShellStyle() | getDefaultOrientation());
-		}
-	}
-    
-    /**
-     * Creates a new window which will create its shell as a child of whatever
-     * the given shellProvider returns.
-     * 
-     * @param shellProvider object that will return the current parent shell. Not null.
-     * 
-     * @since 3.1
-     */
-    protected Window(IShellProvider shellProvider) {
-        Assert.isNotNull(shellProvider);
-        this.parentShell = shellProvider;   
-    }
-
-	/**
-	 * Determines if the window should handle the close event or do nothing.
-	 * <p>
-	 * The default implementation of this framework method returns
-	 * <code>true</code>, which will allow the
-	 * <code>handleShellCloseEvent</code> method to be called. Subclasses may
-	 * extend or reimplement.
-	 * </p>
-	 * 
-	 * @return whether the window should handle the close event.
-	 */
-	protected boolean canHandleShellCloseEvent() {
-		return true;
-	}
-
-	/**
-	 * Closes this window, disposes its shell, and removes this window from its
-	 * window manager (if it has one).
-	 * <p>
-	 * This framework method may be extended (<code>super.close</code> must
-	 * be called).
-	 * </p>
-	 * <p>
-	 *  Note that in order to prevent recursive calls to this method 
-	 *  it does not call <code>Shell#close()</code>. As a result <code>ShellListener</code>s 
-	 *  will not receive a <code>shellClosed</code> event.
-	 *  </p>
-	 * 
-	 * @return <code>true</code> if the window is (or was already) closed, and
-	 *         <code>false</code> if it is still open
-	 */
-	public boolean close() {
-		
-		// stop listening for font changes
-		if (fontChangeListener != null) {
-			JFaceResources.getFontRegistry().removeListener(fontChangeListener);
-			fontChangeListener = null;
-		}
-		
-		// remove this window from a window manager if it has one
-		if (windowManager != null) {
-			windowManager.remove(this);
-			windowManager = null;
-		}
-
-		if (shell == null || shell.isDisposed()) {
-			return true;
-		}
-
-		// If we "close" the shell recursion will occur.
-		// Instead, we need to "dispose" the shell to remove it from the
-		// display.
-		shell.dispose();
-		shell = null;
-		contents = null;
-
-		return true;
-	}
-
-	/**
-	 * Configures the given shell in preparation for opening this window in it.
-	 * <p>
-	 * The default implementation of this framework method sets the shell's
-	 * image and gives it a grid layout. Subclasses may extend or reimplement.
-	 * </p>
-	 * 
-	 * @param newShell
-	 *            the shell
-	 */
-	protected void configureShell(Shell newShell) {
-
-		// The single image version of this code had a comment related to bug
-		// 46624,
-		// and some code that did nothing if the stored image was already
-		// disposed.
-		// The equivalent in the multi-image version seems to be to remove the
-		// disposed images from the array passed to the shell.
-		if (defaultImages != null && defaultImages.length > 0) {
-			ArrayList nonDisposedImages = new ArrayList(defaultImages.length);
-			for (int i = 0; i < defaultImages.length; ++i) {
-				if (defaultImages[i] != null && !defaultImages[i].isDisposed()) {
-					nonDisposedImages.add(defaultImages[i]);
-				}
-			}
-
-			if (nonDisposedImages.size() <= 0) {
-				System.err.println("Window.configureShell: images disposed"); //$NON-NLS-1$
-			} else {
-				Image[] array = new Image[nonDisposedImages.size()];
-				nonDisposedImages.toArray(array);
-				newShell.setImages(array);
-			}
-		}
-
-		Layout layout = getLayout();
-		if (layout != null) {
-			newShell.setLayout(layout);
-		}
-	}
-
-	/**
-	 * Creates the layout for the shell. The layout created here will be
-	 * attached to the composite passed into createContents. The default
-	 * implementation returns a GridLayout with no margins. Subclasses that
-	 * change the layout type by overriding this method should also override
-	 * createContents.
-	 * 
-	 * <p>
-	 * A return value of null indicates that no layout should be attached to the
-	 * composite. In this case, the layout may be attached within
-	 * createContents.
-	 * </p>
-	 * 
-	 * @return a newly created Layout or null if no layout should be attached.
-	 * @since 3.0
-	 */
-	protected Layout getLayout() {
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		return layout;
-	}
-
-	/**
-	 * Constrain the shell size to be no larger than the display bounds.
-	 * 
-	 * @since 2.0
-	 */
-	protected void constrainShellSize() {
-		// limit the shell size to the display size
-		Rectangle bounds = shell.getBounds();
-		Rectangle constrained = getConstrainedShellBounds(bounds);
-		if (!bounds.equals(constrained)) {
-			shell.setBounds(constrained);
-		}
-	}
-
-	/**
-	 * Creates this window's widgetry in a new top-level shell.
-	 * <p>
-	 * The default implementation of this framework method creates this window's
-	 * shell (by calling <code>createShell</code>), and its controls (by
-	 * calling <code>createContents</code>), then initializes this window's
-	 * shell bounds (by calling <code>initializeBounds</code>).
-	 * </p>
-	 */
-	public void create() {
-		shell = createShell();
-		contents = createContents(shell);
-
-		//initialize the bounds of the shell to that appropriate for the
-		// contents
-		initializeBounds();
-	}
-
-	/**
-	 * Creates and returns this window's contents. Subclasses may attach any
-	 * number of children to the parent. As a convenience, the return value of
-	 * this method will be remembered and returned by subsequent calls to
-	 * getContents(). Subclasses may modify the parent's layout if they overload
-	 * getLayout() to return null.
-	 * 
-	 * <p>
-	 * It is common practise to create and return a single composite that
-	 * contains the entire window contents.
-	 * </p>
-	 * 
-	 * <p>
-	 * The default implementation of this framework method creates an instance
-	 * of <code>Composite</code>. Subclasses may override.
-	 * </p>
-	 * 
-	 * @param parent
-	 *            the parent composite for the controls in this window. The type
-	 *            of layout used is determined by getLayout()
-	 * 
-	 * @return the control that will be returned by subsequent calls to
-	 *         getContents()
-	 */
-	protected Control createContents(Composite parent) {
-		// by default, just create a composite
-		return new Composite(parent, SWT.NONE);
-	}
-
-	/**
-	 * Creates and returns this window's shell.
-	 * <p>
-	 * This method creates a new shell and configures
-	 * it using <code>configureShell</code>. Subclasses
-	 * should  override <code>configureShell</code> if the
-	 * shell needs to be customized.
-	 * </p>
-	 * 
-	 * @return the shell
-	 */
-	protected final Shell createShell() {
-
-		Shell newParent = getParentShell();
-		if(newParent != null &&  newParent.isDisposed()){
-			parentShell = new SameShellProvider(null);
-			newParent = getParentShell();//Find a better parent
-		}
-		
-		//Create the shell
-		Shell newShell = new Shell(newParent, getShellStyle());
-
-		resizeListener = new Listener() {
-			public void handleEvent(Event e) {
-				resizeHasOccurred = true;
-			}
-		};
-
-		newShell.addListener(SWT.Resize, resizeListener);
-		newShell.setData(this);
-
-		//Add a listener
-		newShell.addShellListener(getShellListener());
-
-		//Set the layout
-		configureShell(newShell);
-
-		//Register for font changes
-		if (fontChangeListener == null) {
-			fontChangeListener = new FontChangeListener();
-		}
-		JFaceResources.getFontRegistry().addListener(fontChangeListener);
-
-		return newShell;
-	}
-
-	/**
-	 * Returns the top level control for this window. The parent of this control
-	 * is the shell.
-	 * 
-	 * @return the top level control, or <code>null</code> if this window's
-	 *         control has not been created yet
-	 */
-	protected Control getContents() {
-		return contents;
-	}
-
-	/**
-	 * Returns the default image. This is the image that will be used for
-	 * windows that have no shell image at the time they are opened. There is no
-	 * default image unless one is installed via <code>setDefaultImage</code>.
-	 * 
-	 * @return the default image, or <code>null</code> if none
-	 * @see #setDefaultImage
-	 */
-	public static Image getDefaultImage() {
-		return (defaultImages == null || defaultImages.length < 1) ? null
-				: defaultImages[0];
-	}
-
-	/**
-	 * Returns the array of default images to use for newly opened windows. It
-	 * is expected that the array will contain the same icon rendered at
-	 * different resolutions.
-	 * 
-	 * @see org.eclipse.swt.widgets.Decorations#setImages(org.eclipse.swt.graphics.Image[])
-	 * 
-	 * @return the array of images to be used when a new window is opened
-	 * @see #setDefaultImages
-	 * @since 3.0
-	 */
-	public static Image[] getDefaultImages() {
-		return (defaultImages == null ? new Image[0] : defaultImages);
-	}
-
-	/**
-	 * Returns the initial location to use for the shell. The default
-	 * implementation centers the shell horizontally (1/2 of the difference to
-	 * the left and 1/2 to the right) and vertically (1/3 above and 2/3 below)
-	 * relative to the parent shell, or display bounds if there is no parent
-	 * shell.
-	 * 
-	 * @param initialSize
-	 *            the initial size of the shell, as returned by
-	 *            <code>getInitialSize</code>.
-	 * @return the initial location of the shell
-	 */
-	protected Point getInitialLocation(Point initialSize) {
-		Composite parent = shell.getParent();
-
-		Monitor monitor = shell.getDisplay().getPrimaryMonitor();
-		if (parent != null) {
-			monitor = parent.getMonitor();
-		}
-
-		Rectangle monitorBounds = monitor.getClientArea();
-		Point centerPoint;
-		if (parent != null) {
-			centerPoint = Geometry.centerPoint(parent.getBounds());
-		} else {
-			centerPoint = Geometry.centerPoint(monitorBounds);
-		}
-
-		return new Point(centerPoint.x - (initialSize.x / 2), Math.max(
-				monitorBounds.y, Math.min(centerPoint.y
-						- (initialSize.y * 2 / 3), monitorBounds.y
-						+ monitorBounds.height - initialSize.y)));
-	}
-
-	/**
-	 * Returns the initial size to use for the shell. The default implementation
-	 * returns the preferred size of the shell, using
-	 * <code>Shell.computeSize(SWT.DEFAULT, SWT.DEFAULT, true)</code>.
-	 * 
-	 * @return the initial size of the shell
-	 */
-	protected Point getInitialSize() {
-		return shell.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-	}
-
-    /**
-     * Returns the most specific modal child from the given list of Shells. 
-     * 
-     * @param toSearch shells to search for modal children
-     * @return the most specific modal child, or null if none
-     * 
-     * @since 3.1
-     */
-    private static Shell getModalChild(Shell[] toSearch) {
-        int modal = SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL | SWT.PRIMARY_MODAL;
-        
-        for (int i = toSearch.length - 1; i >= 0; i--) {
-            Shell shell = toSearch[i];
-            
-            // Check if this shell has a modal child
-            Shell[] children = shell.getShells();
-            Shell modalChild = getModalChild(children);
-            if (modalChild != null) {
-                return modalChild;
-            }
-            
-            // If not, check if this shell is modal itself
-            if (shell.isVisible() && (shell.getStyle() & modal) != 0) {
-                return shell;
-            }
-        }
-        
-        return null;
-    }
-    
-	/**
-	 * Returns parent shell, under which this window's shell is created.
-	 * 
-	 * @return the parent shell, or <code>null</code> if there is no parent
-	 *         shell
-	 */
-	protected Shell getParentShell() {
-        Shell parent = parentShell.getShell();
-        
-        int modal = SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL | SWT.PRIMARY_MODAL;
-        
-        if ((getShellStyle() & modal) != 0) {
-            // If this is a modal shell with no parent, pick a shell using defaultModalParent.
-            if (parent == null) {
-                parent = defaultModalParent.getShell();
-            }
-        }
-        
-        return parent;
-	}
-
-	/**
-	 * Returns this window's return code. A window's return codes are
-	 * window-specific, although two standard return codes are predefined:
-	 * <code>OK</code> and <code>CANCEL</code>.
-	 * 
-	 * @return the return code
-	 */
-	public int getReturnCode() {
-		return returnCode;
-	}
-
-	/**
-	 * Returns this window's shell.
-	 * 
-	 * @return this window's shell, or <code>null</code> if this window's
-	 *         shell has not been created yet
-	 */
-	public Shell getShell() {
-		return shell;
-	}
-
-	/**
-	 * Returns a shell listener. This shell listener gets registered with this
-	 * window's shell.
-	 * <p>
-	 * The default implementation of this framework method returns a new
-	 * listener that makes this window the active window for its window manager
-	 * (if it has one) when the shell is activated, and calls the framework
-	 * method <code>handleShellCloseEvent</code> when the shell is closed.
-	 * Subclasses may extend or reimplement.
-	 * </p>
-	 * 
-	 * @return a shell listener
-	 */
-	protected ShellListener getShellListener() {
-		return new ShellAdapter() {
-			public void shellClosed(ShellEvent event) {
-				event.doit = false; // don't close now
-				if (canHandleShellCloseEvent()) {
-					handleShellCloseEvent();
-				}
-			}
-		};
-	}
-
-	/**
-	 * Returns the shell style bits.
-	 * <p>
-	 * The default value is <code>SWT.CLOSE|SWT.MIN|SWT.MAX|SWT.RESIZE</code>.
-	 * Subclassers should call <code>setShellStyle</code> to change this
-	 * value, rather than overriding this method.
-	 * </p>
-	 * 
-	 * @return the shell style bits
-	 */
-	protected int getShellStyle() {
-		return shellStyle;
-	}
-
-	/**
-	 * Returns the window manager of this window.
-	 * 
-	 * @return the WindowManager, or <code>null</code> if none
-	 */
-	public WindowManager getWindowManager() {
-		return windowManager;
-	}
-
-	/**
-	 * Notifies of a font property change.
-	 * <p>
-	 * The default implementation of this framework method does nothing.
-	 * Subclasses may reimplement.
-	 * </p>
-	 * 
-	 * @param event
-	 *            the property change event detailing what changed
-	 */
-	protected void handleFontChange(PropertyChangeEvent event) {
-		// do nothing
-	}
-
-	/**
-	 * Notifies that the window's close button was pressed, the close menu was
-	 * selected, or the ESCAPE key pressed.
-	 * <p>
-	 * The default implementation of this framework method sets the window's
-	 * return code to <code>CANCEL</code> and closes the window using
-	 * <code>close</code>. Subclasses may extend or reimplement.
-	 * </p>
-	 */
-	protected void handleShellCloseEvent() {
-		setReturnCode(CANCEL);
-		close();
-	}
-
-	/**
-	 * Initializes the location and size of this window's SWT shell after it has
-	 * been created.
-	 * <p>
-	 * This framework method is called by the <code>create</code> framework
-	 * method. The default implementation calls <code>getInitialSize</code>
-	 * and <code>getInitialLocation</code> and passes the results to
-	 * <code>Shell.setBounds</code>. This is only done if the bounds of the
-	 * shell have not already been modified. Subclasses may extend or
-	 * reimplement.
-	 * </p>
-	 */
-	protected void initializeBounds() {
-		if (resizeListener != null) {
-			shell.removeListener(SWT.Resize, resizeListener);
-		}
-		if (resizeHasOccurred) { // Check if shell size has been set already.
-			return;
-		}
-
-		Point size = getInitialSize();
-		Point location = getInitialLocation(size);
-		shell.setBounds(getConstrainedShellBounds(new Rectangle(location.x,
-				location.y, size.x, size.y)));
-	}
-
-	/**
-	 * Opens this window, creating it first if it has not yet been created.
-	 * <p>
-	 * If this window has been configured to block on open (
-	 * <code>setBlockOnOpen</code>), this method waits until the window is
-	 * closed by the end user, and then it returns the window's return code;
-	 * otherwise, this method returns immediately. A window's return codes are
-	 * window-specific, although two standard return codes are predefined:
-	 * <code>OK</code> and <code>CANCEL</code>.
-	 * </p>
-	 * 
-	 * @return the return code
-	 * 
-	 * @see #create()
-	 */
-	public int open() {
-        
-		if (shell == null || shell.isDisposed()) {
-            shell = null;
-			// create the window
-			create();
-		}
-
-		// limit the shell size to the display size
-		constrainShellSize();
-
-		// open the window
-		shell.open();
-
-		// run the event loop if specified
-		if (block) {
-			runEventLoop(shell);
-		}
-
-		return returnCode;
-	}
-
-	/**
-	 * Runs the event loop for the given shell.
-	 * 
-	 * @param loopShell
-	 *            the shell
-	 */
-	private void runEventLoop(Shell loopShell) {
-
-		//Use the display provided by the shell if possible
-		Display display;
-		if (shell == null) {
-			display = Display.getCurrent();
-		} else {
-			display = loopShell.getDisplay();
-		}
-
-		while (loopShell != null && !loopShell.isDisposed()) {
-			try {
-				if (!display.readAndDispatch()) {
-					display.sleep();
-				}
-			} catch (Throwable e) {
-				exceptionHandler.handleException(e);
-			}
-		}
-		if (!display.isDisposed()) display.update();
-	}
-
-	/**
-	 * Sets whether the <code>open</code> method should block until the window
-	 * closes.
-	 * 
-	 * @param shouldBlock
-	 *            <code>true</code> if the <code>open</code> method should
-	 *            not return until the window closes, and <code>false</code>
-	 *            if the <code>open</code> method should return immediately
-	 */
-	public void setBlockOnOpen(boolean shouldBlock) {
-		block = shouldBlock;
-	}
-
-	/**
-	 * Sets the default image. This is the image that will be used for windows
-	 * that have no shell image at the time they are opened. There is no default
-	 * image unless one is installed via this method.
-	 * 
-	 * @param image
-	 *            the default image, or <code>null</code> if none
-	 */
-	public static void setDefaultImage(Image image) {
-		defaultImages = image == null ? null : new Image[] { image };
-	}
-
-	/**
-	 * Sets the array of default images to use for newly opened windows. It is
-	 * expected that the array will contain the same icon rendered at different
-	 * resolutions.
-	 * 
-	 * @see org.eclipse.swt.widgets.Decorations#setImages(org.eclipse.swt.graphics.Image[])
-	 * 
-	 * @param images
-	 *            the array of images to be used when this window is opened
-	 * @since 3.0
-	 */
-	public static void setDefaultImages(Image[] images) {
-		Image[] newArray = new Image[images.length];
-		System.arraycopy(images, 0, newArray, 0, newArray.length);
-		defaultImages = newArray;
-	}
-	
-	/**
-     * Changes the parent shell. This is only safe to use when the shell is not
-     * yet realized (i.e., created). Once the shell is created, it must be
-     * disposed (i.e., closed) before this method can be called.
-     * 
-     * @param newParentShell
-     *            The new parent shell; this value may be <code>null</code> if
-     *            there is to be no parent.
-     * @since 3.1
-     */
-    protected void setParentShell(final Shell newParentShell) {
-        Assert.isTrue((shell == null), "There must not be an existing shell."); //$NON-NLS-1$
-        parentShell = new SameShellProvider(newParentShell);
-    }
-
-	/**
-	 * Sets this window's return code. The return code is automatically returned
-	 * by <code>open</code> if block on open is enabled. For non-blocking
-	 * opens, the return code needs to be retrieved manually using
-	 * <code>getReturnCode</code>.
-	 * 
-	 * @param code
-	 *            the return code
-	 */
-	protected void setReturnCode(int code) {
-		returnCode = code;
-	}
-
-	/**
-	 * Returns the monitor whose client area contains the given point. If no
-	 * monitor contains the point, returns the monitor that is closest to the
-	 * point. If this is ever made public, it should be moved into a separate
-	 * utility class.
-	 * 
-	 * @param toSearch
-	 *            point to find (display coordinates)
-	 * @param toFind
-	 *            point to find (display coordinates)
-	 * @return the montor closest to the given point
-	 */
-	private static Monitor getClosestMonitor(Display toSearch, Point toFind) {
-		int closest = Integer.MAX_VALUE;
-
-		Monitor[] monitors = toSearch.getMonitors();
-		Monitor result = monitors[0];
-
-		for (int idx = 0; idx < monitors.length; idx++) {
-			Monitor current = monitors[idx];
-
-			Rectangle clientArea = current.getClientArea();
-
-			if (clientArea.contains(toFind)) {
-				return current;
-			}
-
-			int distance = Geometry.distanceSquared(Geometry
-					.centerPoint(clientArea), toFind);
-			if (distance < closest) {
-				closest = distance;
-				result = current;
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * Given the desired position of the window, this method returns an adjusted
-	 * position such that the window is no larger than its monitor, and does not
-	 * extend beyond the edge of the monitor. This is used for computing the
-	 * initial window position, and subclasses can use this as a utility method
-	 * if they want to limit the region in which the window may be moved.
-	 * 
-	 * @param preferredSize
-	 *            the preferred position of the window
-	 * @return a rectangle as close as possible to preferredSize that does not
-	 *         extend outside the monitor
-	 * 
-	 * @since 3.0
-	 */
-	protected Rectangle getConstrainedShellBounds(Rectangle preferredSize) {
-		Rectangle result = new Rectangle(preferredSize.x, preferredSize.y,
-				preferredSize.width, preferredSize.height);
-
-		Monitor mon = getClosestMonitor(getShell().getDisplay(), Geometry
-				.centerPoint(result));
-
-		Rectangle bounds = mon.getClientArea();
-
-		if (result.height > bounds.height) {
-			result.height = bounds.height;
-		}
-
-		if (result.width > bounds.width) {
-			result.width = bounds.width;
-		}
-
-		result.x = Math.max(bounds.x, Math.min(result.x, bounds.x
-				+ bounds.width - result.width));
-		result.y = Math.max(bounds.y, Math.min(result.y, bounds.y
-				+ bounds.height - result.height));
-
-		return result;
-	}
-
-	/**
-	 * Sets the shell style bits. This method has no effect after the shell is
-	 * created.
-	 * <p>
-	 * The shell style bits are used by the framework method
-	 * <code>createShell</code> when creating this window's shell.
-	 * </p>
-	 * 
-	 * @param newShellStyle
-	 *            the new shell style bits
-	 */
-	protected void setShellStyle(int newShellStyle) {
-		shellStyle = newShellStyle;
-	}
-
-	/**
-	 * Sets the window manager of this window.
-	 * <p>
-	 * Note that this method is used by <code>WindowManager</code> to maintain
-	 * a backpointer. Clients must not call the method directly.
-	 * </p>
-	 * 
-	 * @param manager
-	 *            the window manager, or <code>null</code> if none
-	 */
-	public void setWindowManager(WindowManager manager) {
-		windowManager = manager;
-
-		// Code to detect invalid usage
-
-		if (manager != null) {
-			Window[] windows = manager.getWindows();
-			for (int i = 0; i < windows.length; i++) {
-				if (windows[i] == this) {
-					return;
-				}
-			}
-			manager.add(this);
-		}
-	}
-
-	/**
-	 * Sets the exception handler for this application.
-	 * <p>
-	 * Note that the handler may only be set once.  Subsequent calls to this method will be
-	 * ignored.
-	 * <p>
-	 * 
-	 * @param handler
-	 *            the exception handler for the application.
-	 */
-	public static void setExceptionHandler(IExceptionHandler handler) {
-		if (exceptionHandler instanceof DefaultExceptionHandler) {
-			exceptionHandler = handler;
-		}
-	}
-    
-    /**
-     * Sets the default parent for modal Windows. This will be used to locate
-     * the parent for any modal Window constructed with a null parent.
-     * 
-     * @param provider shell provider that will be used to locate the parent shell
-     * whenever a Window is created with a null parent
-     * @since 3.1
-     */
-    public static void setDefaultModalParent(IShellProvider provider) {
-        defaultModalParent = provider;
-    }
-    
-	/**
-	 * Gets the default orientation for windows. If it is not
-	 * set the default value will be unspecified (SWT#NONE).
-	 * 
-	 * 
-	 * @return SWT#NONE, SWT.RIGHT_TO_LEFT or SWT.LEFT_TO_RIGHT
-	 * @see SWT#RIGHT_TO_LEFT
-	 * @see SWT#LEFT_TO_RIGHT
-	 * @see SWT#NONE
-	 * @since 3.1
-	 */
-	public static int getDefaultOrientation() {
-		return orientation;
-
-	}
-
-	/**
-	 * Sets the default orientation of windows.
-	 * @param defaultOrientation one of 
-	 * 	SWT#RIGHT_TO_LEFT, SWT#LEFT_TO_RIGHT ,SWT#NONE
-	 * @see SWT#RIGHT_TO_LEFT
-	 * @see SWT#LEFT_TO_RIGHT
-	 * @see SWT#NONE
-	 * @since 3.1
-	 */
-	public static void setDefaultOrientation(int defaultOrientation) {
-		orientation = defaultOrientation;
-		
-	}
-
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/WindowManager.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/window/WindowManager.java
deleted file mode 100644
index 5500d56..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/WindowManager.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.window;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-
-/**
- * A manager for a group of windows. Window managers are an optional JFace 
- * feature used in applications which create many different windows (dialogs,
- * wizards, etc.) in addition to a main window. A window manager can be used to
- * remember all the windows that an application has created (independent of 
- * whether they are presently open or closed). There can be several window
- * managers, and they can be arranged into a tree. This kind of organization 
- * makes it simple to close whole subgroupings of windows.
- * <p>
- * Creating a window manager is as simple as creating an instance of 
- * <code>WindowManager</code>. Associating a window with a window manager is 
- * done with <code>WindowManager.add(Window)</code>. A window is automatically
- * removed from its window manager as a side effect of closing the window.
- * </p>
- *
- * @see Window
- */
-public class WindowManager {
-
-    /**
-     * List of windows managed by this window manager
-     * (element type: <code>Window</code>).
-     */
-    private ArrayList windows = new ArrayList();
-
-    /**
-     * List of window managers who have this window manager
-     * as their parent (element type: <code>WindowManager</code>).
-     */
-    private List subManagers;
-
-    /**
-     * Creates an empty window manager without a parent window
-     * manager (that is, a root window manager).
-     */
-    public WindowManager() {
-    }
-
-    /**
-     * Creates an empty window manager with the given
-     * window manager as parent.
-     *
-     * @param parent the parent window manager
-     */
-    public WindowManager(WindowManager parent) {
-        Assert.isNotNull(parent);
-        parent.addWindowManager(this);
-    }
-
-    /**
-     * Adds the given window to the set of windows managed by
-     * this window manager. Does nothing is this window is
-     * already managed by this window manager.
-     *
-     * @param window the window
-     */
-    public void add(Window window) {
-        if (!windows.contains(window)) {
-            windows.add(window);
-            window.setWindowManager(this);
-        }
-    }
-
-    /**
-     * Adds the given window manager to the list of
-     * window managers that have this one as a parent.
-     * </p>
-     * @param wm the child window manager
-     */
-    private void addWindowManager(WindowManager wm) {
-        if (subManagers == null) {
-			subManagers = new ArrayList();
-		}
-        if (!subManagers.contains(wm)) {
-            subManagers.add(wm);
-        }
-    }
-
-    /**
-     * Attempts to close all windows managed by this window manager,
-     * as well as windows managed by any descendent window managers.
-     *
-     * @return <code>true</code> if all windows were sucessfully closed, 
-     * and <code>false</code> if any window refused to close
-     */
-    public boolean close() {
-        List t = (List) windows.clone(); // make iteration robust 
-        Iterator e = t.iterator();
-        while (e.hasNext()) {
-            Window window = (Window) e.next();
-            boolean closed = window.close();
-            if (!closed) {
-				return false;
-			}
-        }
-        if (subManagers != null) {
-            e = subManagers.iterator();
-            while (e.hasNext()) {
-                WindowManager wm = (WindowManager) e.next();
-                boolean closed = wm.close();
-                if (!closed) {
-					return false;
-				}
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Returns this window manager's number of windows
-     * 
-     * @return the number of windows
-     * @since 3.0
-     */
-    public int getWindowCount() {
-        return windows.size();
-    }
-
-    /**
-     * Returns this window manager's set of windows.
-     *
-     * @return a possibly empty list of window
-     */
-    public Window[] getWindows() {
-        Window bs[] = new Window[windows.size()];
-        windows.toArray(bs);
-        return bs;
-    }
-
-    /**
-     * Removes the given window from the set of windows managed by
-     * this window manager. Does nothing is this window is
-     * not managed by this window manager.
-     *
-     * @param window the window
-     */
-    public final void remove(Window window) {
-        if (windows.contains(window)) {
-            windows.remove(window);
-            window.setWindowManager(null);
-        }
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/window/package.html
deleted file mode 100644
index 88fed90..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/window/package.html
+++ /dev/null
@@ -1,31 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides a general framework for creating and managing
-windows.
-<h2>
-Package Specification</h2>
-A JFace window is an object that has no visual representation (no widgets)
-until it is told to open. All JFace windows, including dialogs, are instances
-of the abstract class <tt>Window</tt> or a subclass. This package contains
-the base window classes:
-<tt>Window</tt> itself, which provides support
-for a basic windows; and <tt>ApplicationWindow</tt>, which provides ready-to-use
-support for a high-level "main window" with standard menus, tool bar, and
-status line. Both of these classes may be subclassed to define additional
-types of window as required.
-<p>This package also contains <tt>WindowManager</tt>, instance of which
-are used for managing a group of windows. Window managers are useful in
-applications which create many different windows (dialogs, wizards, etc.)
-in addition to a main window. Window managers are not required for simple
-applications.
-<p>The only global state maintained by classes in this package is a default
-image for window title bars (<tt>Window.setDefaultImage</tt>).
-</body>
-</html>
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/IWizard.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/IWizard.java
deleted file mode 100644
index 22602ac..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/IWizard.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.wizard;
-
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Interface for a wizard.  A wizard maintains a list of wizard pages,
- * stacked on top of each other in card layout fashion.
- * <p>
- * The class <code>Wizard</code> provides an abstract implementation
- * of this interface. However, clients are also free to implement this 
- * interface if <code>Wizard</code> does not suit their needs.
- * </p>
- * @see Wizard
- */
-public interface IWizard {
-    /**
-     * Adds any last-minute pages to this wizard.
-     * <p>
-     * This method is called just before the wizard becomes visible, to give the 
-     * wizard the opportunity to add any lazily created pages.
-     * </p>
-     */
-    public void addPages();
-
-    /**
-     * Returns whether this wizard could be finished without further user
-     * interaction.
-     * <p>
-     * The result of this method is typically used by the wizard container to enable
-     * or disable the Finish button.
-     * </p>
-     *
-     * @return <code>true</code> if the wizard could be finished,
-     *   and <code>false</code> otherwise
-     */
-    public boolean canFinish();
-
-    /**
-     * Creates this wizard's controls in the given parent control.
-     * <p>
-     * The wizard container calls this method to create the controls
-     * for the wizard's pages before the wizard is opened. This allows
-     * the wizard to size correctly; otherwise a resize may occur when
-     * moving to a new page.
-     * </p>
-     *
-     * @param pageContainer the parent control
-     */
-    public void createPageControls(Composite pageContainer);
-
-    /**
-     * Disposes of this wizard and frees all SWT resources.
-     */
-    public void dispose();
-
-    /**
-     * Returns the container of this wizard.
-     *
-     * @return the wizard container, or <code>null</code> if this
-     *   wizard has yet to be added to a container
-     */
-    public IWizardContainer getContainer();
-
-    /**
-     * Returns the default page image for this wizard.
-     * <p>
-     * This image can be used for pages which do not
-     * supply their own image.
-     * </p>
-     *
-     * @return the default page image
-     */
-    public Image getDefaultPageImage();
-
-    /**
-     * Returns the dialog settings for this wizard.
-     * <p>
-     * The dialog store is used to record state between
-     * wizard invocations (for example, radio button selections,
-     * last directory, etc.).
-     * </p>
-     *
-     * @return the dialog settings, or <code>null</code> if none
-     */
-    public IDialogSettings getDialogSettings();
-
-    /**
-     * Returns the successor of the given page.
-     * <p>
-     * This method is typically called by a wizard page
-     * </p>
-     *
-     * @param page the page
-     * @return the next page, or <code>null</code> if none
-     */
-    public IWizardPage getNextPage(IWizardPage page);
-
-    /**
-     * Returns the wizard page with the given name belonging to this wizard.
-     *
-     * @param pageName the name of the wizard page
-     * @return the wizard page with the given name, or <code>null</code> if none
-     */
-    public IWizardPage getPage(String pageName);
-
-    /**
-     * Returns the number of pages in this wizard.
-     *
-     * @return the number of wizard pages
-     */
-    public int getPageCount();
-
-    /**
-     * Returns all the pages in this wizard.
-     *
-     * @return a list of pages
-     */
-    public IWizardPage[] getPages();
-
-    /**
-     * Returns the predecessor of the given page.
-     * <p>
-     * This method is typically called by a wizard page
-     * </p>
-     *
-     * @param page the page
-     * @return the previous page, or <code>null</code> if none
-     */
-    public IWizardPage getPreviousPage(IWizardPage page);
-
-    /**
-     * Returns the first page to be shown in this wizard.
-     *
-     * @return the first wizard page
-     */
-    public IWizardPage getStartingPage();
-
-    /**
-     * Returns the title bar color for this wizard.
-     *
-     * @return the title bar color
-     */
-    public RGB getTitleBarColor();
-
-    /**
-     * Returns the window title string for this wizard.
-     *
-     * @return the window title string, or <code>null</code> for no title
-     */
-    public String getWindowTitle();
-
-    /**
-     * Returns whether help is available for this wizard.
-     * <p>
-     * The result of this method is typically used by the container to
-     * show or hide the Help button.
-     * </p>
-     *
-     * @return <code>true</code> if help is available,
-     *   and <code>false</code> if this wizard is helpless
-     */
-    public boolean isHelpAvailable();
-
-    /**
-     * Returns whether this wizard needs Previous and Next buttons.
-     * <p>
-     * The result of this method is typically used by the container.
-     * </p>
-     *
-     * @return <code>true</code> if Previous and Next buttons are required,
-     *   and <code>false</code> if none are needed
-     */
-    public boolean needsPreviousAndNextButtons();
-
-    /**
-     * Returns whether this wizard needs a progress monitor.
-     * <p>
-     * The result of this method is typically used by the container.
-     * </p>
-     *
-     * @return <code>true</code> if a progress monitor is required,
-     *   and <code>false</code> if none is needed
-     */
-    public boolean needsProgressMonitor();
-
-    /**
-     * Performs any actions appropriate in response to the user 
-     * having pressed the Cancel button, or refuse if canceling
-     * now is not permitted.
-     *
-     * @return <code>true</code> to indicate the cancel request
-     *   was accepted, and <code>false</code> to indicate
-     *   that the cancel request was refused
-     */
-    public boolean performCancel();
-
-    /**
-     * Performs any actions appropriate in response to the user 
-     * having pressed the Finish button, or refuse if finishing
-     * now is not permitted.
-     *
-     * Normally this method is only called on the container's
-     * current wizard. However if the current wizard is a nested wizard
-     * this method will also be called on all wizards in its parent chain.
-     * Such parents may use this notification to save state etc. However,
-     * the value the parents return from this method is ignored.
-     *
-     * @return <code>true</code> to indicate the finish request
-     *   was accepted, and <code>false</code> to indicate
-     *   that the finish request was refused
-     */
-    public boolean performFinish();
-
-    /**
-     * Sets or clears the container of this wizard.
-     *
-     * @param wizardContainer the wizard container, or <code>null</code> 
-     */
-    public void setContainer(IWizardContainer wizardContainer);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/IWizardContainer.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/IWizardContainer.java
deleted file mode 100644
index 6708f654..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/IWizardContainer.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.wizard;
-
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Interface for containers that can host a wizard. It displays
- * wizard pages, at most one of which is considered
- * the current page. <code>getCurrentPage</code> returns the
- * current page; <code>showPage</code> programmatically changes the
- * the current page. Note that the pages need not all belong
- * to the same wizard.
- * <p>
- * The class <code>WizardDialog</code> provides a fully functional 
- * implementation of this interface which will meet the needs of
- * most clients. However, clients are also free to implement this 
- * interface if <code>WizardDialog</code> does not suit their needs.
- * </p>
- * <p>
- * Implementors are responsible for disposing of their wizards.
- * </p>
- * 
- * @see org.eclipse.jface.wizard.IWizardContainer2
- */
-public interface IWizardContainer extends IRunnableContext {
-    /**
-     * Returns the current wizard page for this container.
-     *
-     * @return the current wizard page, or <code>null</code> if the container
-     *   is not yet showing the wizard
-     * @see #showPage
-     */
-    public IWizardPage getCurrentPage();
-
-    /**
-     * Returns the shell for this wizard container.
-     *
-     * @return the shell, or <code>null</code> if this wizard
-     *   container does not have a shell
-     */
-    public Shell getShell();
-
-    /**
-     * Makes the given page visible.
-     * <p>
-     * This method should not be use for normal page
-     * sequencing (back, next) which is handled by the 
-     * container itself. It may, however, be used to
-     * move to another page in response to some custom
-     * action such as double clicking in a list.
-     * </p>
-     *
-     * @param page the page to show
-     * @see #getCurrentPage
-     */
-    public void showPage(IWizardPage page);
-
-    /**
-     * Adjusts the enable state of the Back, Next, and Finish 
-     * buttons to reflect the state of the currently active 
-     * page in this container.
-     * <p>
-     * This method is called by the container itself
-     * when its wizard page changes and may be called
-     * by the page at other times to force a button state
-     * update.
-     * </p>
-     */
-    public void updateButtons();
-
-    /**
-     * Updates the message (or error message) shown in the message line to 
-     * reflect the state of the currently active page in this container.
-     * <p>
-     * This method is called by the container itself
-     * when its wizard page changes and may be called
-     * by the page at other times to force a message 
-     * update.
-     * </p>
-     */
-    public void updateMessage();
-
-    /**
-     * Updates the title bar (title, description, and image) to 
-     * reflect the state of the currently active page in this container.
-     * <p>
-     * This method is called by the container itself
-     * when its wizard page changes and may be called
-     * by the page at other times to force a title bar 
-     * update.
-     * </p>
-     */
-    public void updateTitleBar();
-
-    /**
-     * Updates the window title to reflect the state of the current wizard.
-     * <p>
-     * This method is called by the container itself
-     * when its wizard changes and may be called
-     * by the wizard at other times to force a window 
-     * title change.
-     * </p>
-     */
-    public void updateWindowTitle();
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/IWizardContainer2.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/IWizardContainer2.java
deleted file mode 100644
index 042c73d..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/IWizardContainer2.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.wizard;
-
-/**
- * <p><code>IWizardContainer2</code> is a supplement to 
- * <code>IWizardContainer</code> that adds a method for updating the size of 
- * the wizard shell based on the contents of the current page.</p>
- * 
- * <p>The class <code>WizardDialog</code> provides a fully functional 
- * implementation of this interface which will meet the needs of
- * most clients. However, clients are also free to implement this 
- * interface if <code>WizardDialog</code> does not suit their needs.
- * </p>
- * 
- * @see org.eclipse.jface.wizard.IWizardContainer
- * @since 3.0
- */
-public interface IWizardContainer2 extends IWizardContainer {
-
-    /**
-     * Updates the window size to reflect the state of the current wizard.
-     * <p>
-     * This method is called by the container itself
-     * when its wizard changes and may be called
-     * by the wizard at other times to force a window 
-     * size change.
-     * </p>
-     */
-    public void updateSize();
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/IWizardNode.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/IWizardNode.java
deleted file mode 100644
index 5fd15a6..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/IWizardNode.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.wizard;
-
-import org.eclipse.swt.graphics.Point;
-
-/**
- * A wizard node acts a placeholder for a real wizard in a wizard 
- * selection page. It is done in such a way that the actual creation
- * of a wizard can be deferred until the wizard is really needed.
- * <p>
- * When a wizard node comes into existence, its wizard may or may
- * not have been created yet; <code>isContentCreated</code> can
- * be used to determine which. A node may be asked for its wizard
- * using <code>getWizard</code>, which will force it to be created
- * if required. Once the client is done with a wizard node, its
- * <code>dispose</code>method must be called to free up the wizard;
- * once disposes, the node should no longer be used.
- * </p>
- * <p>
- * This interface should be implemented by clients wishing to
- * support this kind of wizard placeholder in a wizard selection page.
- * </p>
- *
- * @see WizardSelectionPage
- */
-public interface IWizardNode {
-    /**
-     * Disposes the wizard managed by this node. Does nothing
-     * if the wizard has not been created.
-     * <p>
-     * This is the last message that should ever be sent to this node.
-     * </p>
-     */
-    public void dispose();
-
-    /**
-     * Returns the extent of the wizard for this node.
-     * <p>
-     * If the content has not yet been created, calling this method
-     * does not trigger the creation of the wizard. This allows
-     * this node to suggest an extent in advance of actually creating 
-     * the wizard.
-     * </p>
-     *
-     * @return the extent, or <code>(-1, -1)</code> extent is not known
-     */
-    public Point getExtent();
-
-    /**
-     * Returns the wizard this node stands for.
-     * <p>
-     * If the content has not been created beforehand, calling this
-     * method triggers the creation of the wizard and caches it so that
-     * the identical wizard object is returned on subsequent calls.
-     * </p>
-     *
-     * @return the wizard
-     */
-    public IWizard getWizard();
-
-    /**
-     * Returns whether a wizard has been created for this node.
-     *
-     * @return <code>true</code> if a wizard has been created,
-     *   and <code>false</code> otherwise
-     */
-    public boolean isContentCreated();
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/IWizardPage.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/IWizardPage.java
deleted file mode 100644
index 1f3e9d2..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/IWizardPage.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.wizard;
-
-import org.eclipse.jface.dialogs.IDialogPage;
-
-/**
- * Interface for a wizard page.
- * <p>
- * The class <code>WizardPage</code> provides an abstract implementation
- * of this interface. However, clients are also free to implement this 
- * interface if <code>WizardPage</code> does not suit their needs.
- * </p>
- */
-public interface IWizardPage extends IDialogPage {
-    /**
-     * Returns whether the next page could be displayed.
-     *
-     * @return <code>true</code> if the next page could be displayed,
-     *   and <code>false</code> otherwise
-     */
-    public boolean canFlipToNextPage();
-
-    /**
-     * Returns this page's name.
-     *
-     * @return the name of this page
-     */
-    public String getName();
-
-    /**
-     * Returns the wizard page that would to be shown if the user was to
-     * press the Next button.
-     *
-     * @return the next wizard page, or <code>null</code> if none
-     */
-    public IWizardPage getNextPage();
-
-    /**
-     * Returns the wizard page that would to be shown if the user was to
-     * press the Back button.
-     *
-     * @return the previous wizard page, or <code>null</code> if none
-     */
-    public IWizardPage getPreviousPage();
-
-    /**
-     * Returns the wizard that hosts this wizard page.
-     *
-     * @return the wizard, or <code>null</code> if this page has not been
-     *   added to any wizard
-     * @see #setWizard
-     */
-    public IWizard getWizard();
-
-    /**
-     * Returns whether this page is complete or not.
-     * <p>
-     * This information is typically used by the wizard to decide
-     * when it is okay to finish.
-     * </p>
-     *
-     * @return <code>true</code> if this page is complete, and
-     *  <code>false</code> otherwise
-     */
-    public boolean isPageComplete();
-
-    /**
-     * Sets the wizard page that would typically be shown 
-     * if the user was to press the Back button.
-     * <p>
-     * This method is called by the container.
-     * </p>
-     *
-     * @param page the previous wizard page
-     */
-    public void setPreviousPage(IWizardPage page);
-
-    /**
-     * Sets the wizard that hosts this wizard page.
-     * Once established, a page's wizard cannot be changed
-     * to a different wizard.
-     *
-     * @param newWizard the wizard
-     * @see #getWizard
-     */
-    public void setWizard(IWizard newWizard);
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/ProgressMonitorPart.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/ProgressMonitorPart.java
deleted file mode 100644
index 9347caf..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/ProgressMonitorPart.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.wizard;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IProgressMonitorWithBlocking;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.ProgressIndicator;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * A standard implementation of an IProgressMonitor. It consists
- * of a label displaying the task and subtask name, and a
- * progress indicator to show progress. In contrast to
- * <code>ProgressMonitorDialog</code> this class only implements
- * <code>IProgressMonitor</code>.
- */
-public class ProgressMonitorPart extends Composite implements
-        IProgressMonitorWithBlocking {
-
-	/** the label */
-    protected Label fLabel;
-
-    /** the current task name */
-    protected String fTaskName;
-
-    /** the current sub task name */
-    protected String fSubTaskName;
-
-    /** the progress indicator */
-    protected ProgressIndicator fProgressIndicator;
-
-    /** the cancel component */
-    protected Control fCancelComponent;
-
-    /** true if canceled */
-    protected boolean fIsCanceled;
-
-    /** current blocked status */
-    protected IStatus blockedStatus;
-
-    /** the cancel lister attached to the cancel component */
-    protected Listener fCancelListener = new Listener() {
-        public void handleEvent(Event e) {
-            setCanceled(true);
-            if (fCancelComponent != null) {
-				fCancelComponent.setEnabled(false);
-			}
-        }
-    };
-
-    /**
-     * Creates a ProgressMonitorPart.
-     * @param parent The SWT parent of the part.
-     * @param layout The SWT grid bag layout used by the part. A client
-     * can supply the layout to control how the progress monitor part
-     * is layed out. If null is passed the part uses its default layout.
-     */
-    public ProgressMonitorPart(Composite parent, Layout layout) {
-        this(parent, layout, SWT.DEFAULT);
-    }
-
-    /**
-     * Creates a ProgressMonitorPart.
-     * @param parent The SWT parent of the part.
-     * @param layout The SWT grid bag layout used by the part. A client
-     * can supply the layout to control how the progress monitor part
-     * is layed out. If null is passed the part uses its default layout.
-     * @param progressIndicatorHeight The height of the progress indicator in pixel.
-     */
-    public ProgressMonitorPart(Composite parent, Layout layout,
-            int progressIndicatorHeight) {
-        super(parent, SWT.NONE);
-        initialize(layout, progressIndicatorHeight);
-    }
-
-    /**
-     * Attaches the progress monitor part to the given cancel
-     * component.
-     * @param cancelComponent the control whose selection will
-     * trigger a cancel
-     */
-    public void attachToCancelComponent(Control cancelComponent) {
-        Assert.isNotNull(cancelComponent);
-        fCancelComponent = cancelComponent;
-        fCancelComponent.addListener(SWT.Selection, fCancelListener);
-    }
-
-    /**
-     * Implements <code>IProgressMonitor.beginTask</code>.
-     * @see IProgressMonitor#beginTask(java.lang.String, int)
-     */
-    public void beginTask(String name, int totalWork) {
-        fTaskName = name;
-        updateLabel();
-        if (totalWork == IProgressMonitor.UNKNOWN || totalWork == 0) {
-            fProgressIndicator.beginAnimatedTask();
-        } else {
-            fProgressIndicator.beginTask(totalWork);
-        }
-    }
-
-    /**
-     * Implements <code>IProgressMonitor.done</code>.
-     * @see IProgressMonitor#done()
-     */
-    public void done() {
-        fLabel.setText("");//$NON-NLS-1$
-        fProgressIndicator.sendRemainingWork();
-        fProgressIndicator.done();
-    }
-
-    /**
-     * Escapes any occurrence of '&' in the given String so that
-     * it is not considered as a mnemonic
-     * character in SWT ToolItems, MenuItems, Button and Labels.
-     * @param in the original String
-     * @return The converted String
-     */
-    protected static String escapeMetaCharacters(String in) {
-        if (in == null || in.indexOf('&') < 0) {
-			return in;
-		}
-        int length = in.length();
-        StringBuffer out = new StringBuffer(length + 1);
-        for (int i = 0; i < length; i++) {
-            char c = in.charAt(i);
-            if (c == '&') {
-				out.append("&&");//$NON-NLS-1$
-			} else {
-				out.append(c);
-			}
-        }
-        return out.toString();
-    }
-
-    /**
-     * Creates the progress monitor's UI parts and layouts them
-     * according to the given layout. If the layout is <code>null</code>
-     * the part's default layout is used.
-     * @param layout The layout for the receiver.
-     * @param progressIndicatorHeight The suggested height of the indicator
-     */
-    protected void initialize(Layout layout, int progressIndicatorHeight) {
-        if (layout == null) {
-            GridLayout l = new GridLayout();
-            l.marginWidth = 0;
-            l.marginHeight = 0;
-            l.numColumns = 1;
-            layout = l;
-        }
-        setLayout(layout);
-
-        fLabel = new Label(this, SWT.LEFT);
-        fLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        if (progressIndicatorHeight == SWT.DEFAULT) {
-            GC gc = new GC(fLabel);
-            FontMetrics fm = gc.getFontMetrics();
-            gc.dispose();
-            progressIndicatorHeight = fm.getHeight();
-        }
-
-        fProgressIndicator = new ProgressIndicator(this);
-        GridData gd = new GridData();
-        gd.horizontalAlignment = GridData.FILL;
-        gd.grabExcessHorizontalSpace = true;
-        gd.verticalAlignment = GridData.CENTER;
-        gd.heightHint = progressIndicatorHeight;
-        fProgressIndicator.setLayoutData(gd);
-    }
-
-    /**
-     * Implements <code>IProgressMonitor.internalWorked</code>.
-     * @see IProgressMonitor#internalWorked(double)
-     */
-    public void internalWorked(double work) {
-        fProgressIndicator.worked(work);
-    }
-
-    /**
-     * Implements <code>IProgressMonitor.isCanceled</code>.
-     * @see IProgressMonitor#isCanceled()
-     */
-    public boolean isCanceled() {
-        return fIsCanceled;
-    }
-
-    /**
-     * Detach the progress monitor part from the given cancel
-     * component
-     * @param cc
-     */
-    public void removeFromCancelComponent(Control cc) {
-        Assert.isTrue(fCancelComponent == cc && fCancelComponent != null);
-        fCancelComponent.removeListener(SWT.Selection, fCancelListener);
-        fCancelComponent = null;
-    }
-
-    /**
-     * Implements <code>IProgressMonitor.setCanceled</code>.
-     * @see IProgressMonitor#setCanceled(boolean)
-     */
-    public void setCanceled(boolean b) {
-        fIsCanceled = b;
-    }
-
-    /**
-     * Sets the progress monitor part's font.
-     */
-    public void setFont(Font font) {
-        super.setFont(font);
-        fLabel.setFont(font);
-        fProgressIndicator.setFont(font);
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.core.runtime.IProgressMonitor#setTaskName(java.lang.String)
-     */
-    public void setTaskName(String name) {
-        fTaskName = name;
-        updateLabel();
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.core.runtime.IProgressMonitor#subTask(java.lang.String)
-     */
-    public void subTask(String name) {
-        fSubTaskName = name;
-        updateLabel();
-    }
-
-    /**
-     * Updates the label with the current task and subtask names.
-     */
-    protected void updateLabel() {
-        if (blockedStatus == null) {
-            String text = taskLabel();
-            fLabel.setText(text);
-        } else {
-			fLabel.setText(blockedStatus.getMessage());
-		}
-
-        //Force an update as we are in the UI Thread
-        fLabel.update();
-    }
-
-    /**
-     * Return the label for showing tasks
-     * @return String
-     */
-    private String taskLabel() {
-    	boolean hasTask= fTaskName != null && fTaskName.length() > 0;
-    	boolean hasSubtask= fSubTaskName != null && fSubTaskName.length() > 0;
-    	
-		if (hasTask) {
-			if (hasSubtask)
-				return escapeMetaCharacters(JFaceResources.format(
-    					"Set_SubTask", new Object[] { fTaskName, fSubTaskName }));//$NON-NLS-1$
-   			return escapeMetaCharacters(fTaskName);
-   			
-    	} else if (hasSubtask) {
-    		return escapeMetaCharacters(fSubTaskName);
-    	
-    	} else {
-    		return ""; //$NON-NLS-1$
-    	}
-    }
-
-    /**
-     * Implements <code>IProgressMonitor.worked</code>.
-     * @see IProgressMonitor#worked(int)
-     */
-    public void worked(int work) {
-        internalWorked(work);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IProgressMonitorWithBlocking#clearBlocked()
-     */
-    public void clearBlocked() {
-        blockedStatus = null;
-        updateLabel();
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IProgressMonitorWithBlocking#setBlocked(org.eclipse.core.runtime.IStatus)
-     */
-    public void setBlocked(IStatus reason) {
-        blockedStatus = reason;
-        updateLabel();
-
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/Wizard.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/Wizard.java
deleted file mode 100644
index 3484781..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/Wizard.java
+++ /dev/null
@@ -1,455 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.wizard;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * An abstract base implementation of a wizard. A typical client subclasses
- * <code>Wizard</code> to implement a particular wizard.
- * <p>
- * Subclasses may call the following methods to configure the wizard:
- * <ul>
- * <li><code>addPage</code></li>
- * <li><code>setHelpAvailable</code></li>
- * <li><code>setDefaultPageImageDescriptor</code></li>
- * <li><code>setDialogSettings</code></li>
- * <li><code>setNeedsProgressMonitor</code></li>
- * <li><code>setTitleBarColor</code></li>
- * <li><code>setWindowTitle</code></li>
- * </ul>
- * </p>
- * <p>
- * Subclasses may override these methods if required:
- * <ul>
- * <li>reimplement <code>createPageControls</code></li>
- * <li>reimplement <code>performCancel</code></li>
- * <li>extend <code>addPages</code></li>
- * <li>reimplement <code>performFinish</code></li>
- * <li>extend <code>dispose</code></li>
- * </ul>
- * </p>
- * <p>
- * Note that clients are free to implement <code>IWizard</code> from scratch
- * instead of subclassing <code>Wizard</code>. Correct implementations of
- * <code>IWizard</code> will work with any correct implementation of
- * <code>IWizardPage</code>.
- * </p>
- */
-public abstract class Wizard implements IWizard {
-    /**
-     * Image registry key of the default image for wizard pages (value
-     * <code>"org.eclipse.jface.wizard.Wizard.pageImage"</code>).
-     */
-    public static final String DEFAULT_IMAGE = "org.eclipse.jface.wizard.Wizard.pageImage";//$NON-NLS-1$
-
-    /**
-     * The wizard container this wizard belongs to; <code>null</code> if none.
-     */
-    private IWizardContainer container = null;
-
-    /**
-     * This wizard's list of pages (element type: <code>IWizardPage</code>).
-     */
-    private List pages = new ArrayList();
-
-    /**
-     * Indicates whether this wizard needs a progress monitor.
-     */
-    private boolean needsProgressMonitor = false;
-
-    /**
-     * Indicates whether this wizard needs previous and next buttons even if the
-     * wizard has only one page.
-     */
-    private boolean forcePreviousAndNextButtons = false;
-
-    /**
-     * Indicates whether this wizard supports help.
-     */
-    private boolean isHelpAvailable = false;
-
-    /**
-     * The default page image for pages without one of their one;
-     * <code>null</code> if none.
-     */
-    private Image defaultImage = null;
-
-    /**
-     * The default page image descriptor, used for creating a default page image
-     * if required; <code>null</code> if none.
-     */
-    private ImageDescriptor defaultImageDescriptor = JFaceResources.getImageRegistry().getDescriptor(DEFAULT_IMAGE);
-
-    /**
-     * The color of the wizard title bar; <code>null</code> if none.
-     */
-    private RGB titleBarColor = null;
-
-    /**
-     * The window title string for this wizard; <code>null</code> if none.
-     */
-    private String windowTitle = null;
-
-    /**
-     * The dialog settings for this wizard; <code>null</code> if none.
-     */
-    private IDialogSettings dialogSettings = null;
-
-    /**
-     * Creates a new empty wizard.
-     */
-    protected Wizard() {
-        super();
-    }
-
-    /**
-     * Adds a new page to this wizard. The page is inserted at the end of the
-     * page list.
-     * 
-     * @param page
-     *            the new page
-     */
-    public void addPage(IWizardPage page) {
-        pages.add(page);
-        page.setWizard(this);
-    }
-
-	/**
-     * The <code>Wizard</code> implementation of this <code>IWizard</code>
-     * method does nothing. Subclasses should extend if extra pages need to be
-     * added before the wizard opens. New pages should be added by calling
-     * <code>addPage</code>.
-     */
-    public void addPages() {
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWizard.
-     */
-    public boolean canFinish() {
-        // Default implementation is to check if all pages are complete.
-        for (int i = 0; i < pages.size(); i++) {
-            if (!((IWizardPage) pages.get(i)).isPageComplete()) {
-				return false;
-			}
-        }
-        return true;
-    }
-
-    /**
-     * The <code>Wizard</code> implementation of this <code>IWizard</code>
-     * method creates all the pages controls using
-     * <code>IDialogPage.createControl</code>. Subclasses should reimplement
-     * this method if they want to delay creating one or more of the pages
-     * lazily. The framework ensures that the contents of a page will be created
-     * before attempting to show it.
-     */
-    public void createPageControls(Composite pageContainer) {
-        // the default behavior is to create all the pages controls
-        for (int i = 0; i < pages.size(); i++) {
-            IWizardPage page = (IWizardPage) pages.get(i);
-            page.createControl(pageContainer);
-            // page is responsible for ensuring the created control is
-            // accessable
-            // via getControl.
-            Assert.isNotNull(page.getControl());
-        }
-    }
-
-    /**
-     * The <code>Wizard</code> implementation of this <code>IWizard</code>
-     * method disposes all the pages controls using
-     * <code>DialogPage.dispose</code>. Subclasses should extend this method
-     * if the wizard instance maintains addition SWT resource that need to be
-     * disposed.
-     */
-    public void dispose() {
-        // notify pages
-        for (int i = 0; i < pages.size(); i++) {
-            ((IWizardPage) pages.get(i)).dispose();
-        }
-        // dispose of image
-        if (defaultImage != null) {
-            JFaceResources.getResources().destroyImage(defaultImageDescriptor);
-            defaultImage = null;
-        }
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWizard.
-     */
-    public IWizardContainer getContainer() {
-        return container;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWizard.
-     */
-    public Image getDefaultPageImage() {
-        if (defaultImage == null) {
-            defaultImage = JFaceResources.getResources().createImageWithDefault(defaultImageDescriptor);
-        }
-        return defaultImage;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWizard.
-     */
-    public IDialogSettings getDialogSettings() {
-        return dialogSettings;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWizard. The default behavior is to
-     * return the page that was added to this wizard after the given page.
-     */
-    public IWizardPage getNextPage(IWizardPage page) {
-        int index = pages.indexOf(page);
-        if (index == pages.size() - 1 || index == -1) {
-			// last page or page not found
-            return null;
-		}
-        return (IWizardPage) pages.get(index + 1);
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWizard.
-     */
-    public IWizardPage getPage(String name) {
-        for (int i = 0; i < pages.size(); i++) {
-            IWizardPage page = (IWizardPage) pages.get(i);
-            String pageName = page.getName();
-            if (pageName.equals(name)) {
-				return page;
-			}
-        }
-        return null;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWizard.
-     */
-    public int getPageCount() {
-        return pages.size();
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWizard.
-     */
-    public IWizardPage[] getPages() {
-        return (IWizardPage[]) pages.toArray(new IWizardPage[pages.size()]);
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWizard. The default behavior is to
-     * return the page that was added to this wizard before the given page.
-     */
-    public IWizardPage getPreviousPage(IWizardPage page) {
-        int index = pages.indexOf(page);
-        if (index == 0 || index == -1) {
-			// first page or page not found
-            return null;
-		} 
-		return (IWizardPage) pages.get(index - 1);
-    }
-
-    /**
-     * Returns the wizard's shell if the wizard is visible. Otherwise
-     * <code>null</code> is returned.
-     * 
-     * @return Shell
-     */
-    public Shell getShell() {
-        if (container == null) {
-			return null;
-		}
-        return container.getShell();
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWizard. By default this is the first
-     * page inserted into the wizard.
-     */
-    public IWizardPage getStartingPage() {
-        if (pages.size() == 0) {
-			return null;
-		}
-        return (IWizardPage) pages.get(0);
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWizard.
-     */
-    public RGB getTitleBarColor() {
-        return titleBarColor;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWizard.
-     */
-    public String getWindowTitle() {
-        return windowTitle;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWizard.
-     */
-    public boolean isHelpAvailable() {
-        return isHelpAvailable;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWizard.
-     */
-    public boolean needsPreviousAndNextButtons() {
-        return forcePreviousAndNextButtons || pages.size() > 1;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWizard.
-     */
-    public boolean needsProgressMonitor() {
-        return needsProgressMonitor;
-    }
-
-    /**
-     * The <code>Wizard</code> implementation of this <code>IWizard</code>
-     * method does nothing and returns <code>true</code>. Subclasses should
-     * reimplement this method if they need to perform any special cancel
-     * processing for their wizard.
-     */
-    public boolean performCancel() {
-        return true;
-    }
-
-    /**
-     * Subclasses must implement this <code>IWizard</code> method to perform
-     * any special finish processing for their wizard.
-     */
-    public abstract boolean performFinish();
-
-    /*
-     * (non-Javadoc) Method declared on IWizard.
-     */
-    public void setContainer(IWizardContainer wizardContainer) {
-        container = wizardContainer;
-    }
-
-    /**
-     * Sets the default page image descriptor for this wizard.
-     * <p>
-     * This image descriptor will be used to generate an image for a page with
-     * no image of its own; the image will be computed once and cached.
-     * </p>
-     * 
-     * @param imageDescriptor
-     *            the default page image descriptor
-     */
-    public void setDefaultPageImageDescriptor(ImageDescriptor imageDescriptor) {
-        defaultImageDescriptor = imageDescriptor;
-    }
-
-    /**
-     * Sets the dialog settings for this wizard.
-     * <p>
-     * The dialog settings is used to record state between wizard invocations
-     * (for example, radio button selection, last import directory, etc.)
-     * </p>
-     * 
-     * @param settings
-     *            the dialog settings, or <code>null</code> if none
-     * @see #getDialogSettings
-     *  
-     */
-    public void setDialogSettings(IDialogSettings settings) {
-        dialogSettings = settings;
-    }
-
-    /**
-     * Controls whether the wizard needs Previous and Next buttons even if it
-     * currently contains only one page.
-     * <p>
-     * This flag should be set on wizards where the first wizard page adds
-     * follow-on wizard pages based on user input.
-     * </p>
-     * 
-     * @param b
-     *            <code>true</code> to always show Next and Previous buttons,
-     *            and <code>false</code> to suppress Next and Previous buttons
-     *            for single page wizards
-     */
-    public void setForcePreviousAndNextButtons(boolean b) {
-        forcePreviousAndNextButtons = b;
-    }
-
-    /**
-     * Sets whether help is available for this wizard.
-     * <p>
-     * The result of this method is typically used by the container to show or
-     * hide the Help button.
-     * </p>
-     * 
-     * @param b
-     *            <code>true</code> if help is available, and
-     *            <code>false</code> if this wizard is helpless
-     * @see #isHelpAvailable()
-     */
-    public void setHelpAvailable(boolean b) {
-        isHelpAvailable = b;
-    }
-
-    /**
-     * Sets whether this wizard needs a progress monitor.
-     * 
-     * @param b
-     *            <code>true</code> if a progress monitor is required, and
-     *            <code>false</code> if none is needed
-     * @see #needsProgressMonitor()
-     */
-    public void setNeedsProgressMonitor(boolean b) {
-        needsProgressMonitor = b;
-    }
-
-    /**
-     * Sets the title bar color for this wizard.
-     * 
-     * @param color
-     *            the title bar color
-     */
-    public void setTitleBarColor(RGB color) {
-        titleBarColor = color;
-    }
-
-    /**
-     * Sets the window title for the container that hosts this page to the given
-     * string.
-     * 
-     * @param newTitle
-     *            the window title for the container
-     */
-    public void setWindowTitle(String newTitle) {
-        windowTitle = newTitle;
-        if (container != null) {
-			container.updateWindowTitle();
-		}
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/WizardDialog.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/WizardDialog.java
deleted file mode 100644
index c662cf0..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/WizardDialog.java
+++ /dev/null
@@ -1,1512 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Chris Gross (schtoo@schtoo.com) - patch for bug 16179
- *******************************************************************************/
-package org.eclipse.jface.wizard;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.dialogs.ControlEnableState;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.IPageChangeProvider;
-import org.eclipse.jface.dialogs.IPageChangedListener;
-import org.eclipse.jface.dialogs.IPageChangingListener;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.PageChangedEvent;
-import org.eclipse.jface.dialogs.PageChangingEvent;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.operation.ModalContext;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.events.HelpEvent;
-import org.eclipse.swt.events.HelpListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Cursor;
-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.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A dialog to show a wizard to the end user.
- * <p>
- * In typical usage, the client instantiates this class with a particular
- * wizard. The dialog serves as the wizard container and orchestrates the
- * presentation of its pages.
- * <p>
- * The standard layout is roughly as follows: it has an area at the top
- * containing both the wizard's title, description, and image; the actual wizard
- * page appears in the middle; below that is a progress indicator (which is made
- * visible if needed); and at the bottom of the page is message line and a
- * button bar containing Help, Next, Back, Finish, and Cancel buttons (or some
- * subset).
- * </p>
- * <p>
- * Clients may subclass <code>WizardDialog</code>, although this is rarely
- * required.
- * </p>
- */
-public class WizardDialog extends TitleAreaDialog implements IWizardContainer2,
-		IPageChangeProvider {
-	/**
-	 * Image registry key for error message image (value
-	 * <code>"dialog_title_error_image"</code>).
-	 */
-	public static final String WIZ_IMG_ERROR = "dialog_title_error_image"; //$NON-NLS-1$
-
-	// The wizard the dialog is currently showing.
-	private IWizard wizard;
-
-	// Wizards to dispose
-	private ArrayList createdWizards = new ArrayList();
-
-	// Current nested wizards
-	private ArrayList nestedWizards = new ArrayList();
-
-	// The currently displayed page.
-	private IWizardPage currentPage = null;
-
-	// The number of long running operation executed from the dialog.
-	private long activeRunningOperations = 0;
-
-	// The current page message and description
-	private String pageMessage;
-
-	private int pageMessageType = IMessageProvider.NONE;
-
-	private String pageDescription;
-
-	// The progress monitor
-	private ProgressMonitorPart progressMonitorPart;
-
-	private Cursor waitCursor;
-
-	private Cursor arrowCursor;
-
-	private MessageDialog windowClosingDialog;
-
-	// Navigation buttons
-	private Button backButton;
-
-	private Button nextButton;
-
-	private Button finishButton;
-
-	private Button cancelButton;
-
-	private Button helpButton;
-
-	private SelectionAdapter cancelListener;
-
-	private boolean isMovingToPreviousPage = false;
-
-	private Composite pageContainer;
-
-	private PageContainerFillLayout pageContainerLayout = new PageContainerFillLayout(
-			5, 5, 300, 225);
-
-	private int pageWidth = SWT.DEFAULT;
-
-	private int pageHeight = SWT.DEFAULT;
-
-	private static final String FOCUS_CONTROL = "focusControl"; //$NON-NLS-1$
-
-	private boolean lockedUI = false;
-
-	private ListenerList pageChangedListeners = new ListenerList();
-
-	private ListenerList pageChangingListeners = new ListenerList();
-
-	/**
-	 * A layout for a container which includes several pages, like a notebook,
-	 * wizard, or preference dialog. The size computed by this layout is the
-	 * maximum width and height of all pages currently inserted into the
-	 * container.
-	 */
-	protected class PageContainerFillLayout extends Layout {
-		/**
-		 * The margin width; <code>5</code> pixels by default.
-		 */
-		public int marginWidth = 5;
-
-		/**
-		 * The margin height; <code>5</code> pixels by default.
-		 */
-		public int marginHeight = 5;
-
-		/**
-		 * The minimum width; <code>0</code> pixels by default.
-		 */
-		public int minimumWidth = 0;
-
-		/**
-		 * The minimum height; <code>0</code> pixels by default.
-		 */
-		public int minimumHeight = 0;
-
-		/**
-		 * Creates new layout object.
-		 * 
-		 * @param mw
-		 *            the margin width
-		 * @param mh
-		 *            the margin height
-		 * @param minW
-		 *            the minimum width
-		 * @param minH
-		 *            the minimum height
-		 */
-		public PageContainerFillLayout(int mw, int mh, int minW, int minH) {
-			marginWidth = mw;
-			marginHeight = mh;
-			minimumWidth = minW;
-			minimumHeight = minH;
-		}
-
-		/*
-		 * (non-Javadoc) Method declared on Layout.
-		 */
-		public Point computeSize(Composite composite, int wHint, int hHint,
-				boolean force) {
-			if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT) {
-				return new Point(wHint, hHint);
-			}
-			Point result = null;
-			Control[] children = composite.getChildren();
-			if (children.length > 0) {
-				result = new Point(0, 0);
-				for (int i = 0; i < children.length; i++) {
-					Point cp = children[i].computeSize(wHint, hHint, force);
-					result.x = Math.max(result.x, cp.x);
-					result.y = Math.max(result.y, cp.y);
-				}
-				result.x = result.x + 2 * marginWidth;
-				result.y = result.y + 2 * marginHeight;
-			} else {
-				Rectangle rect = composite.getClientArea();
-				result = new Point(rect.width, rect.height);
-			}
-			result.x = Math.max(result.x, minimumWidth);
-			result.y = Math.max(result.y, minimumHeight);
-			if (wHint != SWT.DEFAULT) {
-				result.x = wHint;
-			}
-			if (hHint != SWT.DEFAULT) {
-				result.y = hHint;
-			}
-			return result;
-		}
-
-		/**
-		 * Returns the client area for the given composite according to this
-		 * layout.
-		 * 
-		 * @param c
-		 *            the composite
-		 * @return the client area rectangle
-		 */
-		public Rectangle getClientArea(Composite c) {
-			Rectangle rect = c.getClientArea();
-			rect.x = rect.x + marginWidth;
-			rect.y = rect.y + marginHeight;
-			rect.width = rect.width - 2 * marginWidth;
-			rect.height = rect.height - 2 * marginHeight;
-			return rect;
-		}
-
-		/*
-		 * (non-Javadoc) Method declared on Layout.
-		 */
-		public void layout(Composite composite, boolean force) {
-			Rectangle rect = getClientArea(composite);
-			Control[] children = composite.getChildren();
-			for (int i = 0; i < children.length; i++) {
-				children[i].setBounds(rect);
-			}
-		}
-
-		/**
-		 * Lays outs the page according to this layout.
-		 * 
-		 * @param w
-		 *            the control
-		 */
-		public void layoutPage(Control w) {
-			w.setBounds(getClientArea(w.getParent()));
-		}
-
-		/**
-		 * Sets the location of the page so that its origin is in the upper left
-		 * corner.
-		 * 
-		 * @param w
-		 *            the control
-		 */
-		public void setPageLocation(Control w) {
-			w.setLocation(marginWidth, marginHeight);
-		}
-	}
-
-	/**
-	 * Creates a new wizard dialog for the given wizard.
-	 * 
-	 * @param parentShell
-	 *            the parent shell
-	 * @param newWizard
-	 *            the wizard this dialog is working on
-	 */
-	public WizardDialog(Shell parentShell, IWizard newWizard) {
-		super(parentShell);
-		setShellStyle(SWT.CLOSE | SWT.MAX | SWT.TITLE | SWT.BORDER
-				| SWT.APPLICATION_MODAL | SWT.RESIZE | getDefaultOrientation());
-		setWizard(newWizard);
-		// since VAJava can't initialize an instance var with an anonymous
-		// class outside a constructor we do it here:
-		cancelListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				cancelPressed();
-			}
-		};
-	}
-
-	/**
-	 * About to start a long running operation triggered through the wizard.
-	 * Shows the progress monitor and disables the wizard's buttons and
-	 * controls.
-	 * 
-	 * @param enableCancelButton
-	 *            <code>true</code> if the Cancel button should be enabled,
-	 *            and <code>false</code> if it should be disabled
-	 * @return the saved UI state
-	 */
-	private Object aboutToStart(boolean enableCancelButton) {
-		Map savedState = null;
-		if (getShell() != null) {
-			// Save focus control
-			Control focusControl = getShell().getDisplay().getFocusControl();
-			if (focusControl != null && focusControl.getShell() != getShell()) {
-				focusControl = null;
-			}
-			boolean needsProgressMonitor = wizard.needsProgressMonitor();
-			cancelButton.removeSelectionListener(cancelListener);
-			// Set the busy cursor to all shells.
-			Display d = getShell().getDisplay();
-			waitCursor = new Cursor(d, SWT.CURSOR_WAIT);
-			setDisplayCursor(waitCursor);
-			// Set the arrow cursor to the cancel component.
-			arrowCursor = new Cursor(d, SWT.CURSOR_ARROW);
-			cancelButton.setCursor(arrowCursor);
-			// Deactivate shell
-			savedState = saveUIState(needsProgressMonitor && enableCancelButton);
-			if (focusControl != null) {
-				savedState.put(FOCUS_CONTROL, focusControl);
-			}
-			// Attach the progress monitor part to the cancel button
-			if (needsProgressMonitor) {
-				progressMonitorPart.attachToCancelComponent(cancelButton);
-				progressMonitorPart.setVisible(true);
-			}
-		}
-		return savedState;
-	}
-
-	/**
-	 * The Back button has been pressed.
-	 */
-	protected void backPressed() {
-		IWizardPage page = currentPage.getPreviousPage();
-		if (page == null) {
-			// should never happen since we have already visited the page
-			return;
-		}
-
-		// set flag to indicate that we are moving back
-		isMovingToPreviousPage = true;
-		// show the page
-		showPage(page);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected void buttonPressed(int buttonId) {
-		switch (buttonId) {
-		case IDialogConstants.HELP_ID: {
-			helpPressed();
-			break;
-		}
-		case IDialogConstants.BACK_ID: {
-			backPressed();
-			break;
-		}
-		case IDialogConstants.NEXT_ID: {
-			nextPressed();
-			break;
-		}
-		case IDialogConstants.FINISH_ID: {
-			finishPressed();
-			break;
-		}
-			// The Cancel button has a listener which calls cancelPressed
-			// directly
-		}
-	}
-
-	/**
-	 * Calculates the difference in size between the given page and the page
-	 * container. A larger page results in a positive delta.
-	 * 
-	 * @param page
-	 *            the page
-	 * @return the size difference encoded as a
-	 *         <code>new Point(deltaWidth,deltaHeight)</code>
-	 */
-	private Point calculatePageSizeDelta(IWizardPage page) {
-		Control pageControl = page.getControl();
-		if (pageControl == null) {
-			// control not created yet
-			return new Point(0, 0);
-		}
-		Point contentSize = pageControl.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-				true);
-		Rectangle rect = pageContainerLayout.getClientArea(pageContainer);
-		Point containerSize = new Point(rect.width, rect.height);
-		return new Point(Math.max(0, contentSize.x - containerSize.x), Math
-				.max(0, contentSize.y - containerSize.y));
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected void cancelPressed() {
-		if (activeRunningOperations <= 0) {
-			// Close the dialog. The check whether the dialog can be
-			// closed or not is done in <code>okToClose</code>.
-			// This ensures that the check is also evaluated when the user
-			// presses the window's close button.
-			setReturnCode(CANCEL);
-			close();
-		} else {
-			cancelButton.setEnabled(false);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#close()
-	 */
-	public boolean close() {
-		if (okToClose()) {
-			return hardClose();
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Window.
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		// Register help listener on the shell
-		newShell.addHelpListener(new HelpListener() {
-			public void helpRequested(HelpEvent event) {
-				// call perform help on the current page
-				if (currentPage != null) {
-					currentPage.performHelp();
-				}
-			}
-		});
-	}
-
-	/**
-	 * Creates the buttons for this dialog's button bar.
-	 * <p>
-	 * The <code>WizardDialog</code> implementation of this framework method
-	 * prevents the parent composite's columns from being made equal width in
-	 * order to remove the margin between the Back and Next buttons.
-	 * </p>
-	 * 
-	 * @param parent
-	 *            the parent composite to contain the buttons
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		((GridLayout) parent.getLayout()).makeColumnsEqualWidth = false;
-		if (wizard.isHelpAvailable()) {
-			helpButton = createButton(parent, IDialogConstants.HELP_ID,
-					IDialogConstants.HELP_LABEL, false);
-		}
-		if (wizard.needsPreviousAndNextButtons()) {
-			createPreviousAndNextButtons(parent);
-		}
-		finishButton = createButton(parent, IDialogConstants.FINISH_ID,
-				IDialogConstants.FINISH_LABEL, true);
-		cancelButton = createCancelButton(parent);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#setButtonLayoutData(org.eclipse.swt.widgets.Button)
-	 */
-	protected void setButtonLayoutData(Button button) {
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-
-		// On large fonts this can make this dialog huge
-		widthHint = Math.min(widthHint,
-				button.getDisplay().getBounds().width / 5);
-		Point minSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-		data.widthHint = Math.max(widthHint, minSize.x);
-
-		button.setLayoutData(data);
-	}
-
-	/**
-	 * Creates the Cancel button for this wizard dialog. Creates a standard (<code>SWT.PUSH</code>)
-	 * button and registers for its selection events. Note that the number of
-	 * columns in the button bar composite is incremented. The Cancel button is
-	 * created specially to give it a removeable listener.
-	 * 
-	 * @param parent
-	 *            the parent button bar
-	 * @return the new Cancel button
-	 */
-	private Button createCancelButton(Composite parent) {
-		// increment the number of columns in the button bar
-		((GridLayout) parent.getLayout()).numColumns++;
-		Button button = new Button(parent, SWT.PUSH);
-		button.setText(IDialogConstants.CANCEL_LABEL);
-		setButtonLayoutData(button);
-		button.setFont(parent.getFont());
-		button.setData(new Integer(IDialogConstants.CANCEL_ID));
-		button.addSelectionListener(cancelListener);
-		return button;
-	}
-
-	/**
-	 * Return the cancel button if the id is a the cancel id.
-	 * 
-	 * @param id
-	 *            the button id
-	 * @return the button corresponding to the button id
-	 */
-	protected Button getButton(int id) {
-		if (id == IDialogConstants.CANCEL_ID) {
-			return cancelButton;
-		}
-		return super.getButton(id);
-	}
-
-	/**
-	 * The <code>WizardDialog</code> implementation of this
-	 * <code>Window</code> method calls call <code>IWizard.addPages</code>
-	 * to allow the current wizard to add extra pages, then
-	 * <code>super.createContents</code> to create the controls. It then calls
-	 * <code>IWizard.createPageControls</code> to allow the wizard to
-	 * pre-create their page controls prior to opening, so that the wizard opens
-	 * to the correct size. And finally it shows the first page.
-	 */
-	protected Control createContents(Composite parent) {
-		// Allow the wizard to add pages to itself
-		// Need to call this now so page count is correct
-		// for determining if next/previous buttons are needed
-		wizard.addPages();
-		Control contents = super.createContents(parent);
-		// Allow the wizard pages to precreate their page controls
-		createPageControls();
-		// Show the first page
-		showStartingPage();
-		return contents;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite) super.createDialogArea(parent);
-		// Build the Page container
-		pageContainer = createPageContainer(composite);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.widthHint = pageWidth;
-		gd.heightHint = pageHeight;
-		pageContainer.setLayoutData(gd);
-		pageContainer.setFont(parent.getFont());
-		// Insert a progress monitor
-		GridLayout pmlayout = new GridLayout();
-		pmlayout.numColumns = 1;
-		progressMonitorPart = createProgressMonitorPart(composite, pmlayout);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		progressMonitorPart.setLayoutData(gridData);
-		progressMonitorPart.setVisible(false);
-		// Build the separator line
-		Label separator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR);
-		separator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		applyDialogFont(progressMonitorPart);
-		return composite;
-	}
-
-	/**
-	 * Create the progress monitor part in the receiver.
-	 * 
-	 * @param composite
-	 * @param pmlayout
-	 * @return ProgressMonitorPart
-	 */
-	protected ProgressMonitorPart createProgressMonitorPart(
-			Composite composite, GridLayout pmlayout) {
-		return new ProgressMonitorPart(composite, pmlayout, SWT.DEFAULT) {
-			String currentTask = null;
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.wizard.ProgressMonitorPart#setBlocked(org.eclipse.core.runtime.IStatus)
-			 */
-			public void setBlocked(IStatus reason) {
-				super.setBlocked(reason);
-				if (!lockedUI) {
-					getBlockedHandler().showBlocked(getShell(), this, reason,
-							currentTask);
-				}
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.wizard.ProgressMonitorPart#clearBlocked()
-			 */
-			public void clearBlocked() {
-				super.clearBlocked();
-				if (!lockedUI) {
-					getBlockedHandler().clearBlocked();
-				}
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.wizard.ProgressMonitorPart#beginTask(java.lang.String,
-			 *      int)
-			 */
-			public void beginTask(String name, int totalWork) {
-				super.beginTask(name, totalWork);
-				currentTask = name;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.wizard.ProgressMonitorPart#setTaskName(java.lang.String)
-			 */
-			public void setTaskName(String name) {
-				super.setTaskName(name);
-				currentTask = name;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.wizard.ProgressMonitorPart#subTask(java.lang.String)
-			 */
-			public void subTask(String name) {
-				super.subTask(name);
-				// If we haven't got anything yet use this value for more
-				// context
-				if (currentTask == null) {
-					currentTask = name;
-				}
-			}
-		};
-	}
-
-	/**
-	 * Creates the container that holds all pages.
-	 * 
-	 * @param parent
-	 * @return Composite
-	 */
-	private Composite createPageContainer(Composite parent) {
-		Composite result = new Composite(parent, SWT.NULL);
-		result.setLayout(pageContainerLayout);
-		return result;
-	}
-
-	/**
-	 * Allow the wizard's pages to pre-create their page controls. This allows
-	 * the wizard dialog to open to the correct size.
-	 */
-	private void createPageControls() {
-		// Allow the wizard pages to precreate their page controls
-		// This allows the wizard to open to the correct size
-		wizard.createPageControls(pageContainer);
-		// Ensure that all of the created pages are initially not visible
-		IWizardPage[] pages = wizard.getPages();
-		for (int i = 0; i < pages.length; i++) {
-			IWizardPage page = pages[i];
-			if (page.getControl() != null) {
-				page.getControl().setVisible(false);
-			}
-		}
-	}
-
-	/**
-	 * Creates the Previous and Next buttons for this wizard dialog. Creates
-	 * standard (<code>SWT.PUSH</code>) buttons and registers for their
-	 * selection events. Note that the number of columns in the button bar
-	 * composite is incremented. These buttons are created specially to prevent
-	 * any space between them.
-	 * 
-	 * @param parent
-	 *            the parent button bar
-	 * @return a composite containing the new buttons
-	 */
-	private Composite createPreviousAndNextButtons(Composite parent) {
-		// increment the number of columns in the button bar
-		((GridLayout) parent.getLayout()).numColumns++;
-		Composite composite = new Composite(parent, SWT.NONE);
-		// create a layout with spacing and margins appropriate for the font
-		// size.
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 0; // will be incremented by createButton
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		layout.horizontalSpacing = 0;
-		layout.verticalSpacing = 0;
-		composite.setLayout(layout);
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_CENTER
-				| GridData.VERTICAL_ALIGN_CENTER);
-		composite.setLayoutData(data);
-		composite.setFont(parent.getFont());
-		backButton = createButton(composite, IDialogConstants.BACK_ID,
-				IDialogConstants.BACK_LABEL, false);
-		nextButton = createButton(composite, IDialogConstants.NEXT_ID,
-				IDialogConstants.NEXT_LABEL, false);
-		return composite;
-	}
-
-	/**
-	 * Creates and return a new wizard closing dialog without openiong it.
-	 * 
-	 * @return MessageDalog
-	 */
-	private MessageDialog createWizardClosingDialog() {
-		MessageDialog result = new MessageDialog(getShell(),
-				JFaceResources.getString("WizardClosingDialog.title"), //$NON-NLS-1$
-				null,
-				JFaceResources.getString("WizardClosingDialog.message"), //$NON-NLS-1$
-				MessageDialog.QUESTION,
-				new String[] { IDialogConstants.OK_LABEL }, 0);
-		return result;
-	}
-
-	/**
-	 * The Finish button has been pressed.
-	 */
-	protected void finishPressed() {
-		// Wizards are added to the nested wizards list in setWizard.
-		// This means that the current wizard is always the last wizard in the
-		// list.
-		// Note that we first call the current wizard directly (to give it a
-		// chance to
-		// abort, do work, and save state) then call the remaining n-1 wizards
-		// in the
-		// list (to save state).
-		if (wizard.performFinish()) {
-			// Call perform finish on outer wizards in the nested chain
-			// (to allow them to save state for example)
-			for (int i = 0; i < nestedWizards.size() - 1; i++) {
-				((IWizard) nestedWizards.get(i)).performFinish();
-			}
-			// Hard close the dialog.
-			setReturnCode(OK);
-			hardClose();
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IWizardContainer.
-	 */
-	public IWizardPage getCurrentPage() {
-		return currentPage;
-	}
-
-	/**
-	 * Returns the progress monitor for this wizard dialog (if it has one).
-	 * 
-	 * @return the progress monitor, or <code>null</code> if this wizard
-	 *         dialog does not have one
-	 */
-	protected IProgressMonitor getProgressMonitor() {
-		return progressMonitorPart;
-	}
-
-	/**
-	 * Returns the wizard this dialog is currently displaying.
-	 * 
-	 * @return the current wizard
-	 */
-	protected IWizard getWizard() {
-		return wizard;
-	}
-
-	/**
-	 * Closes this window.
-	 * 
-	 * @return <code>true</code> if the window is (or was already) closed, and
-	 *         <code>false</code> if it is still open
-	 */
-	private boolean hardClose() {
-		// inform wizards
-		for (int i = 0; i < createdWizards.size(); i++) {
-			IWizard createdWizard = (IWizard) createdWizards.get(i);
-			createdWizard.dispose();
-			// Remove this dialog as a parent from the managed wizard.
-			// Note that we do this after calling dispose as the wizard or
-			// its pages may need access to the container during
-			// dispose code
-			createdWizard.setContainer(null);
-		}
-		return super.close();
-	}
-
-	/**
-	 * The Help button has been pressed.
-	 */
-	protected void helpPressed() {
-		if (currentPage != null) {
-			currentPage.performHelp();
-		}
-	}
-
-	/**
-	 * The Next button has been pressed.
-	 */
-	protected void nextPressed() {
-		IWizardPage page = currentPage.getNextPage();
-		if (page == null) {
-			// something must have happend getting the next page
-			return;
-		}
-
-		// show the next page
-		showPage(page);
-	}
-
-	/**
-	 * Notifies page changing listeners and returns result of page changing
-	 * processing to the sender.
-	 * 
-	 * @param eventType
-	 * @return <code>true</code> if page changing listener completes
-	 *         successfully, <code>false</code> otherwise
-	 */
-	private boolean doPageChanging(IWizardPage targetPage) {
-		PageChangingEvent e = new PageChangingEvent(this, getCurrentPage(),
-				targetPage);
-		firePageChanging(e);
-		// Prevent navigation if necessary
-		return e.doit;
-	}
-
-	/**
-	 * Checks whether it is alright to close this wizard dialog and performed
-	 * standard cancel processing. If there is a long running operation in
-	 * progress, this method posts an alert message saying that the wizard
-	 * cannot be closed.
-	 * 
-	 * @return <code>true</code> if it is alright to close this dialog, and
-	 *         <code>false</code> if it is not
-	 */
-	private boolean okToClose() {
-		if (activeRunningOperations > 0) {
-			synchronized (this) {
-				windowClosingDialog = createWizardClosingDialog();
-			}
-			windowClosingDialog.open();
-			synchronized (this) {
-				windowClosingDialog = null;
-			}
-			return false;
-		}
-		return wizard.performCancel();
-	}
-
-	/**
-	 * Restores the enabled/disabled state of the given control.
-	 * 
-	 * @param w
-	 *            the control
-	 * @param h
-	 *            the map (key type: <code>String</code>, element type:
-	 *            <code>Boolean</code>)
-	 * @param key
-	 *            the key
-	 * @see #saveEnableStateAndSet
-	 */
-	private void restoreEnableState(Control w, Map h, String key) {
-		if (w != null) {
-			Boolean b = (Boolean) h.get(key);
-			if (b != null) {
-				w.setEnabled(b.booleanValue());
-			}
-		}
-	}
-
-	/**
-	 * Restores the enabled/disabled state of the wizard dialog's buttons and
-	 * the tree of controls for the currently showing page.
-	 * 
-	 * @param state
-	 *            a map containing the saved state as returned by
-	 *            <code>saveUIState</code>
-	 * @see #saveUIState
-	 */
-	private void restoreUIState(Map state) {
-		restoreEnableState(backButton, state, "back"); //$NON-NLS-1$
-		restoreEnableState(nextButton, state, "next"); //$NON-NLS-1$
-		restoreEnableState(finishButton, state, "finish"); //$NON-NLS-1$
-		restoreEnableState(cancelButton, state, "cancel"); //$NON-NLS-1$
-		restoreEnableState(helpButton, state, "help"); //$NON-NLS-1$
-		Object pageValue = state.get("page"); //$NON-NLS-1$
-		if (pageValue != null) {
-			((ControlEnableState) pageValue).restore();
-		}
-	}
-
-	/**
-	 * This implementation of IRunnableContext#run(boolean, boolean,
-	 * IRunnableWithProgress) blocks until the runnable has been run, regardless
-	 * of the value of <code>fork</code>. It is recommended that
-	 * <code>fork</code> is set to true in most cases. If <code>fork</code>
-	 * is set to <code>false</code>, the runnable will run in the UI thread
-	 * and it is the runnable's responsibility to call
-	 * <code>Display.readAndDispatch()</code> to ensure UI responsiveness.
-	 * 
-	 * UI state is saved prior to executing the long-running operation and is
-	 * restored after the long-running operation completes executing. Any
-	 * attempt to change the UI state of the wizard in the long-running
-	 * operation will be nullified when original UI state is restored.
-	 * 
-	 */
-	public void run(boolean fork, boolean cancelable,
-			IRunnableWithProgress runnable) throws InvocationTargetException,
-			InterruptedException {
-		// The operation can only be canceled if it is executed in a separate
-		// thread.
-		// Otherwise the UI is blocked anyway.
-		Object state = null;
-		if (activeRunningOperations == 0) {
-			state = aboutToStart(fork && cancelable);
-		}
-		activeRunningOperations++;
-		try {
-			if (!fork) {
-				lockedUI = true;
-			}
-			ModalContext.run(runnable, fork, getProgressMonitor(), getShell()
-					.getDisplay());
-			lockedUI = false;
-		} finally {
-			activeRunningOperations--;
-			// Stop if this is the last one
-			if (state != null) {
-				stopped(state);
-			}
-		}
-	}
-
-	/**
-	 * Saves the enabled/disabled state of the given control in the given map,
-	 * which must be modifiable.
-	 * 
-	 * @param w
-	 *            the control, or <code>null</code> if none
-	 * @param h
-	 *            the map (key type: <code>String</code>, element type:
-	 *            <code>Boolean</code>)
-	 * @param key
-	 *            the key
-	 * @param enabled
-	 *            <code>true</code> to enable the control, and
-	 *            <code>false</code> to disable it
-	 * @see #restoreEnableState(Control, Map, String)
-	 */
-	private void saveEnableStateAndSet(Control w, Map h, String key,
-			boolean enabled) {
-		if (w != null) {
-			h.put(key, w.getEnabled() ? Boolean.TRUE : Boolean.FALSE);
-			w.setEnabled(enabled);
-		}
-	}
-
-	/**
-	 * Captures and returns the enabled/disabled state of the wizard dialog's
-	 * buttons and the tree of controls for the currently showing page. All
-	 * these controls are disabled in the process, with the possible exception
-	 * of the Cancel button.
-	 * 
-	 * @param keepCancelEnabled
-	 *            <code>true</code> if the Cancel button should remain
-	 *            enabled, and <code>false</code> if it should be disabled
-	 * @return a map containing the saved state suitable for restoring later
-	 *         with <code>restoreUIState</code>
-	 * @see #restoreUIState
-	 */
-	private Map saveUIState(boolean keepCancelEnabled) {
-		Map savedState = new HashMap(10);
-		saveEnableStateAndSet(backButton, savedState, "back", false); //$NON-NLS-1$
-		saveEnableStateAndSet(nextButton, savedState, "next", false); //$NON-NLS-1$
-		saveEnableStateAndSet(finishButton, savedState, "finish", false); //$NON-NLS-1$
-		saveEnableStateAndSet(cancelButton, savedState,
-				"cancel", keepCancelEnabled); //$NON-NLS-1$
-		saveEnableStateAndSet(helpButton, savedState, "help", false); //$NON-NLS-1$
-		if (currentPage != null) {
-			savedState
-					.put(
-							"page", ControlEnableState.disable(currentPage.getControl())); //$NON-NLS-1$
-		}
-		return savedState;
-	}
-
-	/**
-	 * Sets the given cursor for all shells currently active for this window's
-	 * display.
-	 * 
-	 * @param c
-	 *            the cursor
-	 */
-	private void setDisplayCursor(Cursor c) {
-		Shell[] shells = getShell().getDisplay().getShells();
-		for (int i = 0; i < shells.length; i++) {
-			shells[i].setCursor(c);
-		}
-	}
-
-	/**
-	 * Sets the minimum page size used for the pages.
-	 * 
-	 * @param minWidth
-	 *            the minimum page width
-	 * @param minHeight
-	 *            the minimum page height
-	 * @see #setMinimumPageSize(Point)
-	 */
-	public void setMinimumPageSize(int minWidth, int minHeight) {
-		Assert.isTrue(minWidth >= 0 && minHeight >= 0);
-		pageContainerLayout.minimumWidth = minWidth;
-		pageContainerLayout.minimumHeight = minHeight;
-	}
-
-	/**
-	 * Sets the minimum page size used for the pages.
-	 * 
-	 * @param size
-	 *            the page size encoded as <code>new Point(width,height)</code>
-	 * @see #setMinimumPageSize(int,int)
-	 */
-	public void setMinimumPageSize(Point size) {
-		setMinimumPageSize(size.x, size.y);
-	}
-
-	/**
-	 * Sets the size of all pages. The given size takes precedence over computed
-	 * sizes.
-	 * 
-	 * @param width
-	 *            the page width
-	 * @param height
-	 *            the page height
-	 * @see #setPageSize(Point)
-	 */
-	public void setPageSize(int width, int height) {
-		pageWidth = width;
-		pageHeight = height;
-	}
-
-	/**
-	 * Sets the size of all pages. The given size takes precedence over computed
-	 * sizes.
-	 * 
-	 * @param size
-	 *            the page size encoded as <code>new Point(width,height)</code>
-	 * @see #setPageSize(int,int)
-	 */
-	public void setPageSize(Point size) {
-		setPageSize(size.x, size.y);
-	}
-
-	/**
-	 * Sets the wizard this dialog is currently displaying.
-	 * 
-	 * @param newWizard
-	 *            the wizard
-	 */
-	protected void setWizard(IWizard newWizard) {
-		wizard = newWizard;
-		wizard.setContainer(this);
-		if (!createdWizards.contains(wizard)) {
-			createdWizards.add(wizard);
-			// New wizard so just add it to the end of our nested list
-			nestedWizards.add(wizard);
-			if (pageContainer != null) {
-				// Dialog is already open
-				// Allow the wizard pages to precreate their page controls
-				// This allows the wizard to open to the correct size
-				createPageControls();
-				// Ensure the dialog is large enough for the wizard
-				updateSizeForWizard(wizard);
-				pageContainer.layout(true);
-			}
-		} else {
-			// We have already seen this wizard, if it is the previous wizard
-			// on the nested list then we assume we have gone back and remove
-			// the last wizard from the list
-			int size = nestedWizards.size();
-			if (size >= 2 && nestedWizards.get(size - 2) == wizard) {
-				nestedWizards.remove(size - 1);
-			} else {
-				// Assume we are going forward to revisit a wizard
-				nestedWizards.add(wizard);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IWizardContainer.
-	 */
-	public void showPage(IWizardPage page) {
-		if (page == null || page == currentPage) {
-			return;
-		}
-
-		if (!isMovingToPreviousPage) {
-			// remember my previous page.
-			page.setPreviousPage(currentPage);
-		} else {
-			isMovingToPreviousPage = false;
-		}
-
-		// If page changing evaluation unsuccessful, do not change the page
-		if (!doPageChanging(page))
-			return;
-
-		// Update for the new page in a busy cursor if possible
-		if (getContents() == null) {
-			updateForPage(page);
-		} else {
-			final IWizardPage finalPage = page;
-			BusyIndicator.showWhile(getContents().getDisplay(), new Runnable() {
-				public void run() {
-					updateForPage(finalPage);
-				}
-			});
-		}
-	}
-
-	/**
-	 * Update the receiver for the new page.
-	 * 
-	 * @param page
-	 */
-	private void updateForPage(IWizardPage page) {
-		// ensure this page belongs to the current wizard
-		if (wizard != page.getWizard()) {
-			setWizard(page.getWizard());
-		}
-		// ensure that page control has been created
-		// (this allows lazy page control creation)
-		if (page.getControl() == null) {
-			page.createControl(pageContainer);
-			// the page is responsible for ensuring the created control is
-			// accessable
-			// via getControl.
-			Assert.isNotNull(page.getControl(), JFaceResources.format(
-					JFaceResources.getString("WizardDialog.missingSetControl"), //$NON-NLS-1$
-					new Object[] { page.getName() }));
-			// ensure the dialog is large enough for this page
-			updateSize(page);
-		}
-		// make the new page visible
-		IWizardPage oldPage = currentPage;
-		currentPage = page;
-
-		currentPage.setVisible(true);
-		if (oldPage != null) {
-			oldPage.setVisible(false);
-		}
-		// update the dialog controls
-		update();
-	}
-
-	/**
-	 * Shows the starting page of the wizard.
-	 */
-	private void showStartingPage() {
-		currentPage = wizard.getStartingPage();
-		if (currentPage == null) {
-			// something must have happend getting the page
-			return;
-		}
-		// ensure the page control has been created
-		if (currentPage.getControl() == null) {
-			currentPage.createControl(pageContainer);
-			// the page is responsible for ensuring the created control is
-			// accessable
-			// via getControl.
-			Assert.isNotNull(currentPage.getControl());
-			// we do not need to update the size since the call
-			// to initialize bounds has not been made yet.
-		}
-		// make the new page visible
-		currentPage.setVisible(true);
-		// update the dialog controls
-		update();
-	}
-
-	/**
-	 * A long running operation triggered through the wizard was stopped either
-	 * by user input or by normal end. Hides the progress monitor and restores
-	 * the enable state wizard's buttons and controls.
-	 * 
-	 * @param savedState
-	 *            the saved UI state as returned by <code>aboutToStart</code>
-	 * @see #aboutToStart
-	 */
-	private void stopped(Object savedState) {
-		if (getShell() != null && !getShell().isDisposed()) {
-			if (wizard.needsProgressMonitor()) {
-				progressMonitorPart.setVisible(false);
-				progressMonitorPart.removeFromCancelComponent(cancelButton);
-			}
-			Map state = (Map) savedState;
-			restoreUIState(state);
-			cancelButton.addSelectionListener(cancelListener);
-			setDisplayCursor(null);
-			cancelButton.setCursor(null);
-			waitCursor.dispose();
-			waitCursor = null;
-			arrowCursor.dispose();
-			arrowCursor = null;
-			Control focusControl = (Control) state.get(FOCUS_CONTROL);
-			if (focusControl != null && !focusControl.isDisposed()) {
-				focusControl.setFocus();
-			}
-		}
-	}
-
-	/**
-	 * Updates this dialog's controls to reflect the current page.
-	 */
-	protected void update() {
-		// Update the window title
-		updateWindowTitle();
-		// Update the title bar
-		updateTitleBar();
-		// Update the buttons
-		updateButtons();
-
-		// Fires the page change event
-		firePageChanged(new PageChangedEvent(this, getCurrentPage()));
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IWizardContainer.
-	 */
-	public void updateButtons() {
-		boolean canFlipToNextPage = false;
-		boolean canFinish = wizard.canFinish();
-		if (backButton != null) {
-			backButton.setEnabled(currentPage.getPreviousPage() != null);
-		}
-		if (nextButton != null) {
-			canFlipToNextPage = currentPage.canFlipToNextPage();
-			nextButton.setEnabled(canFlipToNextPage);
-		}
-		finishButton.setEnabled(canFinish);
-		// finish is default unless it is diabled and next is enabled
-		if (canFlipToNextPage && !canFinish) {
-			getShell().setDefaultButton(nextButton);
-		} else {
-			getShell().setDefaultButton(finishButton);
-		}
-	}
-
-	/**
-	 * Update the message line with the page's description.
-	 * <p>
-	 * A discription is shown only if there is no message or error message.
-	 * </p>
-	 */
-	private void updateDescriptionMessage() {
-		pageDescription = currentPage.getDescription();
-		setMessage(pageDescription);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IWizardContainer.
-	 */
-	public void updateMessage() {
-
-		if (currentPage == null) {
-			return;
-		}
-
-		pageMessage = currentPage.getMessage();
-		if (pageMessage != null && currentPage instanceof IMessageProvider) {
-			pageMessageType = ((IMessageProvider) currentPage).getMessageType();
-		} else {
-			pageMessageType = IMessageProvider.NONE;
-		}
-		if (pageMessage == null) {
-			setMessage(pageDescription);
-		} else {
-			setMessage(pageMessage, pageMessageType);
-		}
-		setErrorMessage(currentPage.getErrorMessage());
-	}
-
-	/**
-	 * Changes the shell size to the given size, ensuring that it is no larger
-	 * than the display bounds.
-	 * 
-	 * @param width
-	 *            the shell width
-	 * @param height
-	 *            the shell height
-	 */
-	private void setShellSize(int width, int height) {
-		Rectangle size = getShell().getBounds();
-		size.height = height;
-		size.width = width;
-		getShell().setBounds(getConstrainedShellBounds(size));
-	}
-
-	/**
-	 * Computes the correct dialog size for the current page and resizes its
-	 * shell if nessessary. Also causes the container to refresh its layout.
-	 * 
-	 * @param page
-	 *            the wizard page to use to resize the dialog
-	 * @since 2.0
-	 */
-	protected void updateSize(IWizardPage page) {
-		if (page == null || page.getControl() == null) {
-			return;
-		}
-		updateSizeForPage(page);
-		pageContainerLayout.layoutPage(page.getControl());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizardContainer2#updateSize()
-	 */
-	public void updateSize() {
-		updateSize(currentPage);
-	}
-
-	/**
-	 * Computes the correct dialog size for the given page and resizes its shell
-	 * if nessessary.
-	 * 
-	 * @param page
-	 *            the wizard page
-	 */
-	private void updateSizeForPage(IWizardPage page) {
-		// ensure the page container is large enough
-		Point delta = calculatePageSizeDelta(page);
-		if (delta.x > 0 || delta.y > 0) {
-			// increase the size of the shell
-			Shell shell = getShell();
-			Point shellSize = shell.getSize();
-			setShellSize(shellSize.x + delta.x, shellSize.y + delta.y);
-			constrainShellSize();
-		}
-	}
-
-	/**
-	 * Computes the correct dialog size for the given wizard and resizes its
-	 * shell if nessessary.
-	 * 
-	 * @param sizingWizard
-	 *            the wizard
-	 */
-	private void updateSizeForWizard(IWizard sizingWizard) {
-		Point delta = new Point(0, 0);
-		IWizardPage[] pages = sizingWizard.getPages();
-		for (int i = 0; i < pages.length; i++) {
-			// ensure the page container is large enough
-			Point pageDelta = calculatePageSizeDelta(pages[i]);
-			delta.x = Math.max(delta.x, pageDelta.x);
-			delta.y = Math.max(delta.y, pageDelta.y);
-		}
-		if (delta.x > 0 || delta.y > 0) {
-			// increase the size of the shell
-			Shell shell = getShell();
-			Point shellSize = shell.getSize();
-			setShellSize(shellSize.x + delta.x, shellSize.y + delta.y);
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IWizardContainer.
-	 */
-	public void updateTitleBar() {
-		String s = null;
-		if (currentPage != null) {
-			s = currentPage.getTitle();
-		}
-		if (s == null) {
-			s = ""; //$NON-NLS-1$
-		}
-		setTitle(s);
-		if (currentPage != null) {
-			setTitleImage(currentPage.getImage());
-			updateDescriptionMessage();
-		}
-		updateMessage();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IWizardContainer.
-	 */
-	public void updateWindowTitle() {
-		if (getShell() == null) {
-			// Not created yet
-			return;
-		}
-		String title = wizard.getWindowTitle();
-		if (title == null) {
-			title = ""; //$NON-NLS-1$
-		}
-		getShell().setText(title);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IPageChangeProvider#getSelectedPage()
-	 */
-	public Object getSelectedPage() {
-		return getCurrentPage();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialog.IPageChangeProvider#addPageChangedListener()
-	 */
-	public void addPageChangedListener(IPageChangedListener listener) {
-		pageChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialog.IPageChangeProvider#removePageChangedListener()
-	 */
-	public void removePageChangedListener(IPageChangedListener listener) {
-		pageChangedListeners.remove(listener);
-	}
-
-	/**
-	 * Notifies any selection changed listeners that the selected page has
-	 * changed. Only listeners registered at the time this method is called are
-	 * notified.
-	 * 
-	 * @param event
-	 *            a selection changed event
-	 * 
-	 * @see IPageChangedListener#pageChanged
-	 * 
-	 * @since 3.1
-	 */
-	protected void firePageChanged(final PageChangedEvent event) {
-		Object[] listeners = pageChangedListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final IPageChangedListener l = (IPageChangedListener) listeners[i];
-			SafeRunnable.run(new SafeRunnable() {
-				public void run() {
-					l.pageChanged(event);
-				}
-			});
-		}
-	}
-
-	/**
-	 * Adds a listener for page changes to the list of page changing listeners
-	 * registered for this dialog. Has no effect if an identical listener is
-	 * already registered.
-	 * 
-	 * @param listener
-	 *            a page changing listener
-	 * @since 3.3
-	 */
-	public void addPageChangingListener(IPageChangingListener listener) {
-		pageChangingListeners.add(listener);
-	}
-
-	/**
-	 * Removes the provided page changing listener from the list of page
-	 * changing listeners registered for the dialog.
-	 * 
-	 * @param listener
-	 *            a page changing listener
-	 * @since 3.3
-	 */
-	public void removePageChangingListener(IPageChangingListener listener) {
-		pageChangingListeners.remove(listener);
-	}
-
-	/**
-	 * Notifies any page changing listeners that the currently selected dialog
-	 * page is changing. Only listeners registered at the time this method is
-	 * called are notified.
-	 * 
-	 * @param event
-	 *            a selection changing event
-	 * 
-	 * @see IPageChangingListener#handlePageChanging(PageChangingEvent)
-	 * @since 3.3
-	 */
-	protected void firePageChanging(final PageChangingEvent event) {
-		Object[] listeners = pageChangingListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final IPageChangingListener l = (IPageChangingListener) listeners[i];
-			SafeRunnable.run(new SafeRunnable() {
-				public void run() {
-					l.handlePageChanging(event);
-				}
-			});
-		}
-	}
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/WizardPage.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/WizardPage.java
deleted file mode 100644
index 409cbdc..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/WizardPage.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.wizard;
-
-import org.eclipse.jface.dialogs.DialogPage;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * An abstract base implementation of a wizard page.
- * <p>
- * Subclasses must implement the <code>createControl</code> method
- * to create the specific controls for the wizard page.
- * </p>
- * <p>
- * Subclasses may call the following methods to configure the wizard page:
- * <ul>
- *  <li><code>setDescription</code></li>
- *  <li><code>setErrorMessage</code></li>
- *  <li><code>setImageDescriptor</code></li>
- *  <li><code>setMessage</code></li>
- *  <li><code>setPageComplete</code></li>
- *  <li><code>setPreviousPage</code></li>
- *  <li><code>setTitle</code></li>
- * </ul>
- * </p>
- * <p>
- * Subclasses may override these methods if required:
- * <ul>
- *  <li><code>performHelp</code> - may be reimplemented to display help for the page</li>  
- * <li><code>canFlipToNextPage</code> - may be extended or reimplemented</li>
- *  <li><code>isPageComplete</code> - may be extended </li>
- *  <li><code>setDescription</code> - may be extended </li>
- *  <li><code>setTitle</code> - may be extended </li>
- *  <li><code>dispose</code> - may be extended to dispose additional allocated SWT resources</li>
- * </ul>
- * </p>
- * <p>
- * Note that clients are free to implement <code>IWizardPage</code> from scratch
- * instead of subclassing <code>WizardPage</code>. Correct implementations of
- * <code>IWizardPage</code> will work with any correct implementation of 
- * <code>IWizard</code>.
- * </p>
- */
-public abstract class WizardPage extends DialogPage implements IWizardPage {
-
-    /**
-     * This page's name.
-     */
-    private String name;
-
-    /**
-     * The wizard to which this page belongs; <code>null</code>
-     * if this page has yet to be added to a wizard.
-     */
-    private IWizard wizard = null;
-
-    /**
-     * Indicates whether this page is complete.
-     */
-    private boolean isPageComplete = true;
-
-    /**
-     * The page that was shown right before this page became visible;
-     * <code>null</code> if none.
-     */
-    private IWizardPage previousPage = null;
-
-    /**
-     * Creates a new wizard page with the given name, and
-     * with no title or image.
-     *
-     * @param pageName the name of the page
-     */
-    protected WizardPage(String pageName) {
-        this(pageName, null, (ImageDescriptor) null);
-    }
-
-    /**
-     * Creates a new wizard page with the given name, title, and image.
-     *
-     * @param pageName the name of the page
-     * @param title the title for this wizard page,
-     *   or <code>null</code> if none
-     * @param titleImage the image descriptor for the title of this wizard page,
-     *   or <code>null</code> if none
-     */
-    protected WizardPage(String pageName, String title,
-            ImageDescriptor titleImage) {
-        super(title, titleImage);
-        Assert.isNotNull(pageName); // page name must not be null
-        name = pageName;
-    }
-
-    /**
-     * The <code>WizardPage</code> implementation of this <code>IWizardPage</code>
-     * method returns <code>true</code> if this page is complete (<code>isPageComplete</code>)
-     * and there is a next page to flip to. Subclasses may override (extend or reimplement).
-     *
-     * @see #getNextPage
-     * @see #isPageComplete()
-     */
-    public boolean canFlipToNextPage() {
-        return isPageComplete() && getNextPage() != null;
-    }
-
-    /**
-     * Returns the wizard container for this wizard page.
-     *
-     * @return the wizard container, or <code>null</code> if this
-     *   wizard page has yet to be added to a wizard, or the
-     *   wizard has yet to be added to a container
-     */
-    protected IWizardContainer getContainer() {
-        if (wizard == null) {
-			return null;
-		}
-        return wizard.getContainer();
-    }
-
-    /**
-     * Returns the dialog settings for this wizard page.
-     *
-     * @return the dialog settings, or <code>null</code> if none
-     */
-    protected IDialogSettings getDialogSettings() {
-        if (wizard == null) {
-			return null;
-		}
-        return wizard.getDialogSettings();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogPage.
-     */
-    public Image getImage() {
-        Image result = super.getImage();
-
-        if (result == null && wizard != null) {
-			return wizard.getDefaultPageImage();
-		}
-
-        return result;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizardPage.
-     */
-    public String getName() {
-        return name;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizardPage.
-     * The default behavior is to ask the wizard for the next page.
-     */
-    public IWizardPage getNextPage() {
-        if (wizard == null) {
-			return null;
-		}
-        return wizard.getNextPage(this);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizardPage.
-     * The default behavior is return the cached previous back or,
-     * lacking that, to ask the wizard for the previous page.
-     */
-    public IWizardPage getPreviousPage() {
-        if (previousPage != null) {
-			return previousPage;
-		}
-
-        if (wizard == null) {
-			return null;
-		}
-
-        return wizard.getPreviousPage(this);
-    }
-
-    /**
-     * The <code>WizardPage</code> implementation of this method declared on
-     * <code>DialogPage</code> returns the shell of the container.
-     * The advantage of this implementation is that the shell is accessable
-     * once the container is created even though this page's control may not 
-     * yet be created.
-     */
-    public Shell getShell() {
-
-        IWizardContainer container = getContainer();
-        if (container == null) {
-			return null;
-		}
-
-        // Ask the wizard since our contents may not have been created.
-        return container.getShell();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizardPage.
-     */
-    public IWizard getWizard() {
-        return wizard;
-    }
-
-    /**
-     * Returns whether this page is the current one in the wizard's container.
-     *
-     * @return <code>true</code> if the page is active,
-     *  and <code>false</code> otherwise
-     */
-    protected boolean isCurrentPage() {
-        return (getContainer() != null && this == getContainer()
-                .getCurrentPage());
-    }
-
-    /**
-     * The <code>WizardPage</code> implementation of this <code>IWizard</code> method 
-     * returns the value of an internal state variable set by
-     * <code>setPageComplete</code>. Subclasses may extend.
-     */
-    public boolean isPageComplete() {
-        return isPageComplete;
-    }
-
-    /**
-     * The <code>WizardPage</code> implementation of this <code>IDialogPage</code>
-     * method extends the <code>DialogPage</code> implementation to update
-     * the wizard container title bar. Subclasses may extend.
-     */
-    public void setDescription(String description) {
-        super.setDescription(description);
-        if (isCurrentPage()) {
-			getContainer().updateTitleBar();
-		}
-    }
-
-    /**
-     * The <code>WizardPage</code> implementation of this method 
-     * declared on <code>DialogPage</code> updates the container
-     * if this is the current page.
-     */
-    public void setErrorMessage(String newMessage) {
-        super.setErrorMessage(newMessage);
-        if (isCurrentPage()) {
-            getContainer().updateMessage();
-        }
-    }
-
-    /**
-     * The <code>WizardPage</code> implementation of this method 
-     * declared on <code>DialogPage</code> updates the container
-     * if this page is the current page.
-     */
-    public void setImageDescriptor(ImageDescriptor image) {
-        super.setImageDescriptor(image);
-        if (isCurrentPage()) {
-			getContainer().updateTitleBar();
-		}
-    }
-
-    /**
-     * The <code>WizardPage</code> implementation of this method 
-     * declared on <code>DialogPage</code> updates the container
-     * if this is the current page.
-     */
-    public void setMessage(String newMessage, int newType) {
-        super.setMessage(newMessage, newType);
-        if (isCurrentPage()) {
-			getContainer().updateMessage();
-		}
-    }
-
-    /**
-     * Sets whether this page is complete. 
-     * <p>
-     * This information is typically used by the wizard to decide
-     * when it is okay to move on to the next page or finish up.
-     * </p>
-     *
-     * @param complete <code>true</code> if this page is complete, and
-     *   and <code>false</code> otherwise
-     * @see #isPageComplete()
-     */
-    public void setPageComplete(boolean complete) {
-        isPageComplete = complete;
-        if (isCurrentPage()) {
-			getContainer().updateButtons();
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizardPage.
-     */
-    public void setPreviousPage(IWizardPage page) {
-        previousPage = page;
-    }
-
-    /**
-     * The <code>WizardPage</code> implementation of this <code>IDialogPage</code>
-     * method extends the <code>DialogPage</code> implementation to update
-     * the wizard container title bar. Subclasses may extend.
-     */
-    public void setTitle(String title) {
-        super.setTitle(title);
-        if (isCurrentPage()) {
-            getContainer().updateTitleBar();
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizardPage.
-     */
-    public void setWizard(IWizard newWizard) {
-        wizard = newWizard;
-    }
-
-    /**
-     * Returns a printable representation of this wizard page suitable
-     * only for debug purposes.
-     */
-    public String toString() {
-        return name;
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/WizardSelectionPage.java b/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/WizardSelectionPage.java
deleted file mode 100644
index 2fdfd9e..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/WizardSelectionPage.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.wizard;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * An abstract implementation of a wizard page that manages a
- * set of embedded wizards.
- * <p>
- * A wizard selection page should present a list of wizard nodes 
- * corresponding to other wizards. When the end user selects one of
- * them from the list, the first page of the selected wizard becomes
- * the next page. The only new methods introduced by this class are 
- * <code>getSelectedNode</code> and <code>setSelectedNode</code>. 
- * Otherwise, the subclass contract is the same as <code>WizardPage</code>.
- * </p>
- */
-public abstract class WizardSelectionPage extends WizardPage {
-
-    /**
-     * The selected node; <code>null</code> if none.
-     */
-    private IWizardNode selectedNode = null;
-
-    /**
-     * List of wizard nodes that have cropped up in the past
-     * (element type: <code>IWizardNode</code>).
-     */
-    private List selectedWizardNodes = new ArrayList();
-
-    /**
-     * Creates a new wizard selection page with the given name, and
-     * with no title or image.
-     *
-     * @param pageName the name of the page
-     */
-    protected WizardSelectionPage(String pageName) {
-        super(pageName);
-        // Cannot finish from this page
-        setPageComplete(false);
-    }
-
-    /**
-     * Adds the given wizard node to the list of selected nodes if
-     * it is not already in the list.
-     *
-     * @param node the wizard node, or <code>null</code>
-     */
-    private void addSelectedNode(IWizardNode node) {
-        if (node == null) {
-			return;
-		}
-
-        if (selectedWizardNodes.contains(node)) {
-			return;
-		}
-
-        selectedWizardNodes.add(node);
-    }
-
-    /**
-     * The <code>WizardSelectionPage</code> implementation of 
-     * this <code>IWizardPage</code> method returns <code>true</code>
-     * if there is a selected node.
-     */
-    public boolean canFlipToNextPage() {
-        return selectedNode != null;
-    }
-
-    /**	
-     * The <code>WizardSelectionPage</code> implementation of an <code>IDialogPage</code>
-     * method disposes of all nested wizards. Subclasses may extend.
-     */
-    public void dispose() {
-        super.dispose();
-        // notify nested wizards
-        for (int i = 0; i < selectedWizardNodes.size(); i++) {
-            ((IWizardNode) selectedWizardNodes.get(i)).dispose();
-        }
-    }
-
-    /**
-     * The <code>WizardSelectionPage</code> implementation of 
-     * this <code>IWizardPage</code> method returns the first page 
-     * of the currently selected wizard if there is one.
-     */
-    public IWizardPage getNextPage() {
-        if (selectedNode == null) {
-			return null;
-		}
-
-        boolean isCreated = selectedNode.isContentCreated();
-
-        IWizard wizard = selectedNode.getWizard();
-
-        if (wizard == null) {
-            setSelectedNode(null);
-            return null;
-        }
-
-        if (!isCreated) {
-			// Allow the wizard to create its pages
-            wizard.addPages();
-		}
-
-        return wizard.getStartingPage();
-    }
-
-    /**
-     * Returns the currently selected wizard node within this page.
-     * 
-     * @return the wizard node, or <code>null</code> if no node is selected
-     */
-    public IWizardNode getSelectedNode() {
-        return selectedNode;
-    }
-
-    /**
-     * Sets or clears the currently selected wizard node within this page. 
-     * 
-     * @param node the wizard node, or <code>null</code> to clear
-     */
-    protected void setSelectedNode(IWizardNode node) {
-        addSelectedNode(node);
-        selectedNode = node;
-        if (isCurrentPage()) {
-			getContainer().updateButtons();
-		}
-    }
-}
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/images/page.gif b/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/images/page.gif
deleted file mode 100644
index 4ed90dc..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/images/page.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/package.html b/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/package.html
deleted file mode 100644
index a262485..0000000
--- a/bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/package.html
+++ /dev/null
@@ -1,47 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides a framework for wizards.
-<h2>
-Package Specification</h2>
-A wizard dialog is a specialized window for walking the end user through
-a sequence of steps; each step is presented on a separate page.
-<p>At the most abstract level, the protocol is given by 3 interfaces:
-<ul>
-<li>
-<tt>IWizard</tt> - a wizard consisting of several wizard pages</li>
-
-<li>
-<tt>IWizardPage</tt> - an individual wizard page</li>
-
-<li>
-<tt>IWizardContainer</tt> - the outside world from the point of view of
-a wizard</li>
-</ul>
-A wizard is any object implementing <tt>IWizard</tt>. The abstract base
-class <tt>Wizard</tt> is provided as a starting point; it is simpler to
-subclass <tt>Wizard</tt> than to implement <tt>IWizard</tt> from scratch.
-The main responsibility of a <tt>Wizard</tt> subclass is doing the real
-work when the wizard finishes.
-<p>Similarly, a wizard page is any object implementing <tt>IWizardPage</tt>.
-The abstract base class <tt>WizardPage</tt> is provided as a starting point.
-The main responsibility of a <tt>WizardPage</tt> subclass is providing
-the SWT controls and the backing logic for a single wizard page.
-<p><tt>WizardDialog</tt> is a ready-to-use JFace dialog that is instantiated
-with a wizard and acts as the wizard's container. This dialog has a standard
-layout: an area at the top containing the wizard's title, description,
-and image; the actual wizard page appears in the middle; below it is a
-progress indicator; and at the bottom is an area with a message line and
-a button bar containing Next, Back, Finish, Cancel, and Help buttons.
-<p><tt>WizardSelectionPage</tt>, a special abstract subclass of <tt>WizardPage</tt>,
-allows whole other wizards to be connected to a root page.
-<p>Note: None of the classes in this package maintain global state.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.browser/.classpath b/bundles/org.eclipse.ui.browser/.classpath
deleted file mode 100644
index ce73933..0000000
--- a/bundles/org.eclipse.ui.browser/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.ui.browser/.cvsignore b/bundles/org.eclipse.ui.browser/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/bundles/org.eclipse.ui.browser/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/.options b/bundles/org.eclipse.ui.browser/.options
deleted file mode 100644
index 3481178..0000000
--- a/bundles/org.eclipse.ui.browser/.options
+++ /dev/null
@@ -1,4 +0,0 @@
-# Debugging options for the org.eclipse.ui.browser plugin.
-
-# Turn on debugging for the org.eclipse.ui.browser plugin.
-org.eclipse.ui.browser/debug=false
diff --git a/bundles/org.eclipse.ui.browser/.project b/bundles/org.eclipse.ui.browser/.project
deleted file mode 100644
index 417d64a..0000000
--- a/bundles/org.eclipse.ui.browser/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.browser</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.browser/.settings/org.eclipse.core.resources.prefs b/bundles/org.eclipse.ui.browser/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 849eb8b..0000000
--- a/bundles/org.eclipse.ui.browser/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Thu Mar 31 17:23:30 EST 2005
-eclipse.preferences.version=1
-encoding//src/org/eclipse/ui/internal/browser/Messages.properties=8859_1
diff --git a/bundles/org.eclipse.ui.browser/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.ui.browser/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 786358a..0000000
--- a/bundles/org.eclipse.ui.browser/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,24 +0,0 @@
-#Tue May 09 14:44:18 EDT 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.ui.browser/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.ui.browser/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 9571ac6..0000000
--- a/bundles/org.eclipse.ui.browser/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Mon Apr 18 11:27:52 EDT 2005
-eclipse.preferences.version=1
-internal.default.compliance=default
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
diff --git a/bundles/org.eclipse.ui.browser/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.browser/META-INF/MANIFEST.MF
deleted file mode 100644
index 4aa2599..0000000
--- a/bundles/org.eclipse.ui.browser/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,18 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui.browser; singleton:=true
-Bundle-Version: 3.2.300.qualifier
-Bundle-Activator: org.eclipse.ui.internal.browser.WebBrowserUIPlugin
-Bundle-Vendor: %Plugin.providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.ui.browser,
- org.eclipse.ui.internal.browser;x-friends:="org.eclipse.ua.tests",
- org.eclipse.ui.internal.browser.browsers;x-internal:=true,
- org.eclipse.ui.internal.browser.macosx;x-internal:=true
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.1.0,4.0.0)",
- org.eclipse.ui;bundle-version="[3.2.0,4.0.0)"
-Eclipse-LazyStart: true
-Import-Package: com.ibm.icu.text
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.ui.browser/about.html b/bundles/org.eclipse.ui.browser/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.ui.browser/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/build.properties b/bundles/org.eclipse.ui.browser/build.properties
deleted file mode 100644
index f301c6e..0000000
--- a/bundles/org.eclipse.ui.browser/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = icons/,\
-               .options,\
-               plugin.properties,\
-               plugin.xml,\
-               about.html,\
-               .,\
-               META-INF/
-src.includes = about.html,\
-               schema/
-source.. = src/
-output.. = bin/
diff --git a/bundles/org.eclipse.ui.browser/icons/clcl16/nav_backward.gif b/bundles/org.eclipse.ui.browser/icons/clcl16/nav_backward.gif
deleted file mode 100644
index 740e8ca..0000000
--- a/bundles/org.eclipse.ui.browser/icons/clcl16/nav_backward.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/clcl16/nav_forward.gif b/bundles/org.eclipse.ui.browser/icons/clcl16/nav_forward.gif
deleted file mode 100644
index 1956789..0000000
--- a/bundles/org.eclipse.ui.browser/icons/clcl16/nav_forward.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/clcl16/nav_go.gif b/bundles/org.eclipse.ui.browser/icons/clcl16/nav_go.gif
deleted file mode 100644
index d6b3bdc..0000000
--- a/bundles/org.eclipse.ui.browser/icons/clcl16/nav_go.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/clcl16/nav_home.gif b/bundles/org.eclipse.ui.browser/icons/clcl16/nav_home.gif
deleted file mode 100644
index 77efb69..0000000
--- a/bundles/org.eclipse.ui.browser/icons/clcl16/nav_home.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/clcl16/nav_print.gif b/bundles/org.eclipse.ui.browser/icons/clcl16/nav_print.gif
deleted file mode 100644
index 0c213c3..0000000
--- a/bundles/org.eclipse.ui.browser/icons/clcl16/nav_print.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/clcl16/nav_refresh.gif b/bundles/org.eclipse.ui.browser/icons/clcl16/nav_refresh.gif
deleted file mode 100644
index 3ca04d0..0000000
--- a/bundles/org.eclipse.ui.browser/icons/clcl16/nav_refresh.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/clcl16/nav_stop.gif b/bundles/org.eclipse.ui.browser/icons/clcl16/nav_stop.gif
deleted file mode 100644
index 1543a11..0000000
--- a/bundles/org.eclipse.ui.browser/icons/clcl16/nav_stop.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_backward.gif b/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_backward.gif
deleted file mode 100644
index 82b0e87..0000000
--- a/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_backward.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_forward.gif b/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_forward.gif
deleted file mode 100644
index 3f3e5eb..0000000
--- a/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_forward.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_go.gif b/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_go.gif
deleted file mode 100644
index 6df73de..0000000
--- a/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_go.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_home.gif b/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_home.gif
deleted file mode 100644
index 4d5d56e..0000000
--- a/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_home.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_print.gif b/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_print.gif
deleted file mode 100644
index 5150ba0..0000000
--- a/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_print.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_refresh.gif b/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_refresh.gif
deleted file mode 100644
index b248482..0000000
--- a/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_refresh.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_stop.gif b/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_stop.gif
deleted file mode 100644
index 4345d57..0000000
--- a/bundles/org.eclipse.ui.browser/icons/dlcl16/nav_stop.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/dlcl16/synced.gif b/bundles/org.eclipse.ui.browser/icons/dlcl16/synced.gif
deleted file mode 100644
index 4f6e43a..0000000
--- a/bundles/org.eclipse.ui.browser/icons/dlcl16/synced.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/elcl16/nav_backward.gif b/bundles/org.eclipse.ui.browser/icons/elcl16/nav_backward.gif
deleted file mode 100644
index 740e8ca..0000000
--- a/bundles/org.eclipse.ui.browser/icons/elcl16/nav_backward.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/elcl16/nav_forward.gif b/bundles/org.eclipse.ui.browser/icons/elcl16/nav_forward.gif
deleted file mode 100644
index 1956789..0000000
--- a/bundles/org.eclipse.ui.browser/icons/elcl16/nav_forward.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/elcl16/nav_go.gif b/bundles/org.eclipse.ui.browser/icons/elcl16/nav_go.gif
deleted file mode 100644
index d6b3bdc..0000000
--- a/bundles/org.eclipse.ui.browser/icons/elcl16/nav_go.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/elcl16/nav_home.gif b/bundles/org.eclipse.ui.browser/icons/elcl16/nav_home.gif
deleted file mode 100644
index 77efb69..0000000
--- a/bundles/org.eclipse.ui.browser/icons/elcl16/nav_home.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/elcl16/nav_print.gif b/bundles/org.eclipse.ui.browser/icons/elcl16/nav_print.gif
deleted file mode 100644
index 0c213c3..0000000
--- a/bundles/org.eclipse.ui.browser/icons/elcl16/nav_print.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/elcl16/nav_refresh.gif b/bundles/org.eclipse.ui.browser/icons/elcl16/nav_refresh.gif
deleted file mode 100644
index 3ca04d0..0000000
--- a/bundles/org.eclipse.ui.browser/icons/elcl16/nav_refresh.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/elcl16/nav_stop.gif b/bundles/org.eclipse.ui.browser/icons/elcl16/nav_stop.gif
deleted file mode 100644
index 1543a11..0000000
--- a/bundles/org.eclipse.ui.browser/icons/elcl16/nav_stop.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/elcl16/synced.gif b/bundles/org.eclipse.ui.browser/icons/elcl16/synced.gif
deleted file mode 100644
index 870934b..0000000
--- a/bundles/org.eclipse.ui.browser/icons/elcl16/synced.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/obj16/busy/1.gif b/bundles/org.eclipse.ui.browser/icons/obj16/busy/1.gif
deleted file mode 100644
index c7f06ad..0000000
--- a/bundles/org.eclipse.ui.browser/icons/obj16/busy/1.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/obj16/busy/10.gif b/bundles/org.eclipse.ui.browser/icons/obj16/busy/10.gif
deleted file mode 100644
index 6c5e636..0000000
--- a/bundles/org.eclipse.ui.browser/icons/obj16/busy/10.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/obj16/busy/11.gif b/bundles/org.eclipse.ui.browser/icons/obj16/busy/11.gif
deleted file mode 100644
index fcfd068..0000000
--- a/bundles/org.eclipse.ui.browser/icons/obj16/busy/11.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/obj16/busy/12.gif b/bundles/org.eclipse.ui.browser/icons/obj16/busy/12.gif
deleted file mode 100644
index 354d703..0000000
--- a/bundles/org.eclipse.ui.browser/icons/obj16/busy/12.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/obj16/busy/13.gif b/bundles/org.eclipse.ui.browser/icons/obj16/busy/13.gif
deleted file mode 100644
index b107a73..0000000
--- a/bundles/org.eclipse.ui.browser/icons/obj16/busy/13.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/obj16/busy/2.gif b/bundles/org.eclipse.ui.browser/icons/obj16/busy/2.gif
deleted file mode 100644
index 5b4d065..0000000
--- a/bundles/org.eclipse.ui.browser/icons/obj16/busy/2.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/obj16/busy/3.gif b/bundles/org.eclipse.ui.browser/icons/obj16/busy/3.gif
deleted file mode 100644
index 040e21b..0000000
--- a/bundles/org.eclipse.ui.browser/icons/obj16/busy/3.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/obj16/busy/4.gif b/bundles/org.eclipse.ui.browser/icons/obj16/busy/4.gif
deleted file mode 100644
index 554a737..0000000
--- a/bundles/org.eclipse.ui.browser/icons/obj16/busy/4.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/obj16/busy/5.gif b/bundles/org.eclipse.ui.browser/icons/obj16/busy/5.gif
deleted file mode 100644
index a929896..0000000
--- a/bundles/org.eclipse.ui.browser/icons/obj16/busy/5.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/obj16/busy/6.gif b/bundles/org.eclipse.ui.browser/icons/obj16/busy/6.gif
deleted file mode 100644
index 402849d..0000000
--- a/bundles/org.eclipse.ui.browser/icons/obj16/busy/6.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/obj16/busy/7.gif b/bundles/org.eclipse.ui.browser/icons/obj16/busy/7.gif
deleted file mode 100644
index 06c2ff3..0000000
--- a/bundles/org.eclipse.ui.browser/icons/obj16/busy/7.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/obj16/busy/8.gif b/bundles/org.eclipse.ui.browser/icons/obj16/busy/8.gif
deleted file mode 100644
index 0aa9c48..0000000
--- a/bundles/org.eclipse.ui.browser/icons/obj16/busy/8.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/obj16/busy/9.gif b/bundles/org.eclipse.ui.browser/icons/obj16/busy/9.gif
deleted file mode 100644
index 658fc65..0000000
--- a/bundles/org.eclipse.ui.browser/icons/obj16/busy/9.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/obj16/external_browser.gif b/bundles/org.eclipse.ui.browser/icons/obj16/external_browser.gif
deleted file mode 100644
index de1f948..0000000
--- a/bundles/org.eclipse.ui.browser/icons/obj16/external_browser.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/icons/obj16/internal_browser.gif b/bundles/org.eclipse.ui.browser/icons/obj16/internal_browser.gif
deleted file mode 100644
index 229c391..0000000
--- a/bundles/org.eclipse.ui.browser/icons/obj16/internal_browser.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.browser/plugin.properties b/bundles/org.eclipse.ui.browser/plugin.properties
deleted file mode 100644
index 8b21ac5..0000000
--- a/bundles/org.eclipse.ui.browser/plugin.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Plugin.name=Browser Support
-Plugin.providerName=Eclipse.org
-
-browser_extension_point_name=Web Browser
-
-viewWebBrowserTitle=Internal Web Browser
-viewWebBrowserSupportTitle= Web Browser
-preferenceWebBrowserTitle=Web Browser
-preferenceKeywords=HTML Firefox Mozilla Netscape Internet Opera Safari
-
-
-command.openBrowser.name=Open Browser
-command.openBrowser.description=Opens the default web browser.
-commandParameter.openBrowser.url.name=URL
-commandParameter.openBrowser.browserId.name=Browser Id
-commandParameter.openBrowser.name.name=Browser Name
-commandParameter.openBrowser.tooltip.name=Browser Tooltip
-
-browserInternetExplorer=Internet Explorer
-browserNetscape4=Netscape Communicator v4.x
-browserNetscape7=Netscape v7.x
-browserNetscape=Netscape
-browserMozilla=Mozilla
-browserOpera=Opera
-browserKonqueror=Konqueror
-browserGaleon=Galeon
-browserFirefox=Firefox
-browserCamino=Camino
diff --git a/bundles/org.eclipse.ui.browser/plugin.xml b/bundles/org.eclipse.ui.browser/plugin.xml
deleted file mode 100644
index b36677f..0000000
--- a/bundles/org.eclipse.ui.browser/plugin.xml
+++ /dev/null
@@ -1,247 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension-point id="browsers" name="%browser_extension_point_name" schema="schema/browsers.exsd"/>
-
-   <extension point="org.eclipse.ui.preferencePages">
-      <page
-         id="org.eclipse.ui.browser.preferencePage"
-         name="%preferenceWebBrowserTitle"
-         category="org.eclipse.ui.preferencePages.Workbench"
-         class="org.eclipse.ui.internal.browser.WebBrowserPreferencePage">
-           <keywordReference id="org.eclipse.ui.browser.preferenceKeywords"/>
-      </page>
-   </extension>
-
-   <extension point="org.eclipse.ui.keywords">
-      <keyword
-         label="%preferenceKeywords"
-         id="org.eclipse.ui.browser.preferenceKeywords"/>
-   </extension>  
-
-   <extension point="org.eclipse.ui.browserSupport">
-      <support
-         default="true"
-         class="org.eclipse.ui.internal.browser.DefaultBrowserSupport"/>
-   </extension>
-
-   <extension point="org.eclipse.ui.views">
-      <view
-         allowMultiple="true"
-         category="org.eclipse.ui"
-         class="org.eclipse.ui.internal.browser.WebBrowserView"
-         icon="$nl$/icons/obj16/internal_browser.gif"
-         id="org.eclipse.ui.browser.view"
-         name="%viewWebBrowserTitle"/>
-   </extension>
-
-   <extension point="org.eclipse.ui.editors">
-      <editor
-         class="org.eclipse.ui.internal.browser.WebBrowserEditor"
-         contributorClass="org.eclipse.ui.internal.browser.WebBrowserEditorActionBarContributor"
-         icon="$nl$/icons/obj16/internal_browser.gif"
-         id="org.eclipse.ui.browser.editor"
-         name="%viewWebBrowserTitle"/>
-      <editor
-         extensions="htm,html,shtml"
-         icon="$nl$/icons/obj16/internal_browser.gif"
-         id="org.eclipse.ui.browser.editorSupport"
-         launcher="org.eclipse.ui.internal.browser.BrowserLauncher"
-         name="%viewWebBrowserSupportTitle"/>
-  </extension>
-
-<!--
-  <extension point="org.eclipse.ui.actionSets">
-    <actionSet
-      id="org.eclipse.ui.browser.actionSet"
-      label="%actionSetWebBrowserTitle"
-      visible="true">
-      <action
-        id="org.eclipse.ui.browser.action.open"
-        toolbarPath="browser"
-        label="%actionSetOpenWebBrowser"
-        tooltip="%actionSetOpenWebBrowser"
-        icon="icons/obj16/internal_browser.gif"
-        class="org.eclipse.ui.internal.browser.OpenBrowserWorkbenchAction"/>
-    </actionSet>
-  </extension>
--->
-
-   <!-- Web Browsers -->
-   <extension point="org.eclipse.ui.browser.browsers">
-      <!-- Linux -->
-      <browser
-         id="org.eclipse.ui.browser.mozilla"
-         name="%browserMozilla"
-         os="linux,aix,hpux,solaris"
-         executable="mozilla"
-         factoryclass="org.eclipse.ui.internal.browser.browsers.MozillaFactory">
-         <location>usr/bin/mozilla</location>
-         <location>usr/X11/bin/mozilla</location>
-      </browser>
-      <browser
-         id="org.eclipse.ui.browser.netscape"
-         name="%browserNetscape"
-         os="linux,aix,hpux,solaris"
-         executable="netscape"
-         factoryclass="org.eclipse.ui.internal.browser.browsers.MozillaFactory">
-         <location>usr/bin/netscape</location>
-         <location>usr/X11R6/bin/netscape</location>
-         <location>usr/dt/bin/netscape</location>
-      </browser>
-      <browser
-         id="org.eclipse.ui.browser.firefox"
-         name="%browserFirefox"
-         os="linux,aix,hpux,solaris"
-         executable="firefox"
-         factoryclass="org.eclipse.ui.internal.browser.browsers.MozillaFactory">
-      </browser>
-      <browser
-         id="org.eclipse.ui.browser.konqueror"
-         name="%browserKonqueror"
-         os="linux,aix,hpux,solaris"
-         executable="konqueror">
-         <location>opt/kde3/bin/konqueror</location>
-      </browser>
-      <browser
-         id="org.eclipse.ui.browser.galeon"
-         name="%browserGaleon"
-         os="linux,aix,hpux,solaris"
-         executable="galeon">
-         <location>opt/usr/gnome/bin/galeon</location>
-      </browser>
-      
-      <!-- Windows -->
-      <browser
-         id="org.eclipse.ui.browser.mozilla"
-         name="%browserMozilla"
-         os="Win32"
-         executable="mozilla.exe"
-         factoryclass="org.eclipse.ui.internal.browser.browsers.MozillaFactory">
-         <location>Program Files\mozilla.org\Mozilla\mozilla.exe</location>
-      </browser>
-      <browser
-         id="org.eclipse.ui.browser.netscape7"
-         name="%browserNetscape7"
-         os="Win32"
-         executable="netsc.exe"
-         factoryclass="org.eclipse.ui.internal.browser.browsers.MozillaFactory">
-         <location>Program Files\Netscape\Netscape\netscp.exe</location>
-      </browser>
-      <browser
-         id="org.eclipse.ui.browser.netscape4"
-         name="%browserNetscape4"
-         os="Win32"
-         executable="netscape.exe"
-         factoryclass="org.eclipse.ui.internal.browser.browsers.MozillaFactory">
-         <location>Program Files\Netscape\Communicator\Program\netscape.exe</location>
-      </browser>
-      <browser
-         id="org.eclipse.ui.browser.firefox"
-         name="%browserFirefox"
-         os="Win32"
-         executable="firefox.exe"
-         factoryclass="org.eclipse.ui.internal.browser.browsers.MozillaFactory">
-         <location>Program Files\mozilla.org\Firefox\firefox.exe</location>
-         <location>Program Files\Mozilla Firefox\firefox.exe</location>
-      </browser>
-      <browser
-         id="org.eclipse.ui.browser.ie"
-         name="%browserInternetExplorer"
-         os="Win32"
-         executable="iexplore.exe">
-         <location>Program Files\Internet Explorer\iexplore.exe</location>
-      </browser>
-      <browser
-         id="org.eclipse.ui.browser.opera"
-         name="%browserOpera"
-         os="Win32"
-         executable="opera.exe">
-         <location>Program Files\Opera7\opera.exe</location>
-         <location>
-            Program Files\Opera\opera.exe
-         </location>
-      </browser>
-      
-      <!-- Mac -->
-      <browser
-         id="org.eclipse.ui.browser.firefox"
-         name="%browserFirefox"
-         os="MacOSX"
-         executable="firefox-bin"
-         factoryclass="org.eclipse.ui.internal.browser.browsers.MozillaFactory">
-         <location>Applications/Firefox.app/Contents/MacOS/firefox-bin</location>
-      </browser>
-      <browser
-         id="org.eclipse.ui.browser.camino"
-         name="%browserCamino"
-         os="MacOSX"
-         executable="Camino">
-         <location>Applications/Camino.app/Contents/MacOS/Camino</location>
-      </browser>
-<!--      <browser
-         id="org.eclipse.ui.browser.safari"
-         name="%browserSafari"
-         os="MacOSX"
-         executable="Safari"
-         factoryclass="org.eclipse.ui.internal.browser.macosx.SafariBrowserFactory">
-         <location>Applications/Safari.app/Contents/MacOS/Safari</location>
-      </browser> -->
-      <browser
-         id="org.eclipse.ui.browser.mozilla"
-         name="%browserMozilla"
-         os="MacOSX"
-         executable="mozilla-bin"
-         factoryclass="org.eclipse.ui.internal.browser.browsers.MozillaFactory">
-         <location>Applications/Mozilla.app/Contents/MacOS/mozilla-bin</location>
-      </browser>
-      <browser
-         id="org.eclipse.ui.browser.ie"
-         name="%browserInternetExplorer"
-         os="MacOSX"
-         executable="Internet&#0032;Explorer">
-         <location>Applications/Internet Explorer.app/Contents/MacOS/"Internet Explorer"</location>
-      </browser>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            defaultHandler="org.eclipse.ui.internal.browser.OpenBrowserHandler"
-            description="%command.openBrowser.description"
-            id="org.eclipse.ui.browser.openBrowser"
-            name="%command.openBrowser.name">
-         <commandParameter
-               id="url"
-               name="%commandParameter.openBrowser.url.name"
-               optional="true"/>
-         <commandParameter
-               id="browserId"
-               name="%commandParameter.openBrowser.browserId.name"
-               optional="true"/>
-         <commandParameter
-               id="name"
-               name="%commandParameter.openBrowser.name.name"
-               optional="true"/>
-         <commandParameter
-               id="tooltip"
-               name="%commandParameter.openBrowser.tooltip.name"
-               optional="true"/>
-      </command>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commandImages">
-      <image
-            commandId="org.eclipse.ui.browser.openBrowser"
-            icon="$nl$/icons/obj16/internal_browser.gif"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.elementFactories">
-      <factory
-            class="org.eclipse.ui.internal.browser.WebBrowserEditorInput"
-            id="org.eclipse.ui.browser.elementFactory">
-      </factory>
-   </extension>
-
-</plugin>
diff --git a/bundles/org.eclipse.ui.browser/schema/browsers.exsd b/bundles/org.eclipse.ui.browser/schema/browsers.exsd
deleted file mode 100644
index 0c67e2d..0000000
--- a/bundles/org.eclipse.ui.browser/schema/browsers.exsd
+++ /dev/null
@@ -1,180 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.browser" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui.browser" id="browsers" name="Browsers"/>
-      </appinfo>
-      <documentation>
-         For providing web browsers capable of displaying html documents at a given URL.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="browser"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="browser">
-      <annotation>
-         <documentation>
-            An external web browser which will be displayed on the preference page General/Web Browsers providing the os attribute matches and a file is found in at least one of the specified locations.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="location"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique ID of the browser.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="factoryclass" type="string">
-            <annotation>
-               <documentation>
-                  the implementation class for the browser factory. This class must implement the &lt;samp&gt;org.eclipse.ui.browser.BrowserFactory&lt;/samp&gt; interface.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.help.browser.IBrowserFactory"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the browser (translatable).
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="os" type="string">
-            <annotation>
-               <documentation>
-                  comma separated list of operating systems on which to search for this browser at the specified locations. Only browsers with matching OS will be used.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="executable" type="string">
-            <annotation>
-               <documentation>
-                  the executable filename
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="location" type="string">
-      <annotation>
-         <documentation>
-            Default install locations. these locations should not contain the initial path, as it will be substituted with all known drives. (e.g. on Windows, a location of &quot;test.exe&quot; would look for &quot;c:\test.exe&quot;, &quot;d:\test.exe&quot;, etc. for all known drives.
-         </documentation>
-      </annotation>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.0 (originally added in release 2.0 as org.eclipse.help.ui.browser)
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is a sample usage of the browsers extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.ui.browser.browsers&quot;&gt;
-  &lt;browser
-     id=&quot;org.eclipse.ui.browser.firefox&quot;
-     name=Firefox
-     os=&quot;Win32&quot;
-     executable=&quot;firefox.exe&quot;
-     factoryclass=&quot;org.eclipse.ui.internal.browser.browsers.MozillaFactory&quot;&gt;
-     &lt;location&gt;Program Files\mozilla.org\Firefox\firefox.exe&lt;/location&gt;
-     &lt;location&gt;Program Files\Mozilla Firefox\firefox.exe&lt;/location&gt;
-   &lt;/browser&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The supplied factory class must implement the &lt;samp&gt;org.eclipse.help.browser.IBrowserFactory&lt;/samp&gt; interface.
-Methods in that interface determine whether the factory is available on the given system, i.e. is capable
-of supplying browser instances, and create browser instances that implement IBrowser interface.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         The &lt;samp&gt;org.eclipse.help.base&lt;/samp&gt; and &lt;samp&gt;org.eclipse.help.ui&lt;/samp&gt; plug-ins contain implementation of browsers on common platforms.
-Other plug-ins can provide different implementations.  In the preferences, the user can select the default
-browser from among available browsers.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2000, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/browser/BrowserFactory.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/browser/BrowserFactory.java
deleted file mode 100644
index e98d206..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/browser/BrowserFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.browser;
-
-import org.eclipse.ui.browser.IWebBrowser;
-/**
- * Implementators of <code>org.eclipse.ui.browser.browsers</code> extension
- * points must provide an implementation of this abstract class.
- * 
- * @since 3.1
- */
-public abstract class BrowserFactory {
-	/**
-	 * Checks whether the factory can work on the user system.
-	 * 
-	 * @return <code>false</code> if the factory can work on this system; for
-	 *    example the required native browser required by browser adapters that
-	 *    it creates is not installed, or <code>true</code> otherwise
-	 */
-	public boolean isAvailable() {
-		return true;
-	}
-
-	/**
-	 * Obtains a new instance of a web browser.
-	 * 
-	 * @param id the browser id
-	 * @param location the browser location
-	 * @param parameters the browser parameters
-	 * @return an instance of IWebBrowser
-	 */
-	public abstract IWebBrowser createBrowser(String id, String location, String parameters);
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserDescriptor.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserDescriptor.java
deleted file mode 100644
index 01b4ebd..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserDescriptor.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import org.eclipse.ui.IMemento;
-/**
- * 
- */
-public class BrowserDescriptor implements IBrowserDescriptor {
-	private static final String MEMENTO_NAME = "name"; //$NON-NLS-1$
-	private static final String MEMENTO_LOCATION = "location"; //$NON-NLS-1$
-	private static final String MEMENTO_PARAMETERS = "parameters"; //$NON-NLS-1$
-
-	protected String name;
-	protected String location;
-	protected String parameters;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.browser.IWebBrowser#getName()
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.browser.IBrowserDescriptor#getLocation()
-	 */
-	public String getLocation() {
-		return location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.browser.IBrowserDescriptor#getParameters()
-	 */
-	public String getParameters() {
-		return parameters;
-	}
-	
-	public void delete() {
-		BrowserManager.getInstance().removeWebBrowser(this);
-	}
-
-	public boolean isWorkingCopy() {
-		return false;
-	}
-
-	public IBrowserDescriptorWorkingCopy getWorkingCopy() {
-		return new BrowserDescriptorWorkingCopy(this);
-	}
-
-	protected void setInternal(IBrowserDescriptor browser) {
-		name = browser.getName();
-		location = browser.getLocation();
-		parameters = browser.getParameters();
-	}
-
-	protected void save(IMemento memento) {
-		memento.putString(MEMENTO_NAME, name);
-		memento.putString(MEMENTO_LOCATION, location);
-		memento.putString(MEMENTO_PARAMETERS, parameters);
-	}
-
-	protected void load(IMemento memento) {
-		name = memento.getString(MEMENTO_NAME);
-		location = memento.getString(MEMENTO_LOCATION);
-		parameters = memento.getString(MEMENTO_PARAMETERS);
-	}
-
-	public String toString() {
-		return "External Web browser: " + getName() + " / " + getLocation() + " / " + getParameters();   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserDescriptorDialog.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserDescriptorDialog.java
deleted file mode 100644
index 9ff1294..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserDescriptorDialog.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.io.File;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.osgi.util.NLS;
-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.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.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-/**
- * 
- */
-public class BrowserDescriptorDialog extends Dialog {
-	protected IBrowserDescriptorWorkingCopy browser;
-	protected boolean isEdit;
-	protected Button newPageCheckbox;
-	protected Button clearHistoryCheckbox;
-	protected Button browseButton;
-	protected Text browserNameTextfield;
-	protected Text browserLocationTextfield;
-	protected Text browserParametersTextfield;
-	private Button okButton;
-	
-	interface StringModifyListener {
-		public void valueChanged(String s);
-	}
-	
-	/**
-	 * @param parentShell
-	 */
-	public BrowserDescriptorDialog(Shell parentShell, IBrowserDescriptorWorkingCopy browser) {
-		super(parentShell);
-		this.browser = browser;
-		isEdit = true;
-	}
-
-	public BrowserDescriptorDialog(Shell parentShell) {
-		super(parentShell);
-		browser = BrowserManager.getInstance().createExternalWebBrowser();
-		isEdit = false;
-	}
-
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		
-		if (isEdit)
-			shell.setText(Messages.editExternalBrowser);
-		else
-			shell.setText(Messages.createBrowser);
-	}
-
-	protected Text createText(Composite comp, String txt, final StringModifyListener listener) {
-		final Text text = new Text(comp, SWT.BORDER);
-		if (txt != null)
-			text.setText(txt);
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
-		data.widthHint = 250;
-		text.setLayoutData(data);
-		if (listener != null)
-			text.addModifyListener(new ModifyListener() {
-				public void modifyText(ModifyEvent e) {	
-					listener.valueChanged(text.getText());
-				}
-			});
-		return text;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Font font = parent.getFont();
-		Composite composite = (Composite) super.createDialogArea(parent);
-		((GridLayout)composite.getLayout()).numColumns = 3;
-		composite.setFont(font);
-		
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, ContextIds.PREF_BROWSER_DIALOG);
-		
-		SWTUtil.createLabel(composite, Messages.name).setFont(font);
-		browserNameTextfield = createText(composite, browser.getName(), new StringModifyListener() {
-			public void valueChanged(String s) {
-				browser.setName(s);
-				validateFields();
-			}
-		});
-		browserNameTextfield.setFont(font);
-		
-		new Label(composite, SWT.NONE);
-	
-		SWTUtil.createLabel(composite, Messages.location).setFont(font);
-		browserLocationTextfield = createText(composite, browser.getLocation(), new StringModifyListener() {
-			public void valueChanged(String s) {
-				browser.setLocation(s);
-				validateFields();
-			}
-		});
-		browserLocationTextfield.setFont(font);
-		
-		browseButton = SWTUtil.createButton(composite, Messages.browse);
-		browseButton.setFont(font);
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				FileDialog dialog = new FileDialog(getShell(), SWT.OPEN);
-				dialog.setText(Messages.browseMessage);
-				
-				String fname = browserLocationTextfield.getText();
-				
-				dialog.setFileName(fname);
-				fname = dialog.open();
-				
-				if (fname != null)
-					browserLocationTextfield.setText(fname);
-			}
-		});
-		
-		SWTUtil.createLabel(composite, Messages.parameters).setFont(font);
-		browserParametersTextfield = createText(composite, browser.getParameters(), new StringModifyListener() {
-			public void valueChanged(String s) {
-				browser.setParameters(s);
-			}
-		});
-		browserParametersTextfield.setFont(font);
-
-		new Label(composite, SWT.NONE);
-		
-		new Label(composite, SWT.NONE);
-		Label urlLabel = new Label(composite, SWT.NONE);
-		urlLabel.setText(NLS.bind(Messages.parametersMessage, IBrowserDescriptor.URL_PARAMETER));
-		urlLabel.setFont(font);
-		
-		return composite;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		// do simple field validation to at least ensure target directory entered is valid pathname
-		try {
-		File file = new File(browser.getLocation());
-			if(!file.isFile()){
-				WebBrowserUtil.openError(Messages.locationInvalid);
-				return;
-			}
-		}
-		catch(Exception e){
-			WebBrowserUtil.openError(Messages.locationInvalid);
-			return;
-		}
-		
-		browser.save();
-		super.okPressed();
-	}
-	
-	private void setOKButtonEnabled(boolean curIsEnabled) {
-		if (okButton == null)
-			okButton = getButton(IDialogConstants.OK_ID);
-		
-		if (okButton != null)
-			okButton.setEnabled(curIsEnabled);
-	}
-	
-	protected Control createButtonBar(Composite parent) {
-		Control buttonControl = super.createButtonBar(parent);
-		validateFields();
-		return buttonControl;
-	}
-	
-	protected void validateFields() {
-		boolean valid = true;
-		
-		String name = browserNameTextfield.getText();
-		if (name == null || name.trim().length() < 1)
-			valid = false;
-		
-		String location = browserLocationTextfield.getText();
-		if (location == null || location.trim().length() < 1)
-			valid = false;
-		
-		setOKButtonEnabled(valid);
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserDescriptorWorkingCopy.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserDescriptorWorkingCopy.java
deleted file mode 100644
index 9df5d7e..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserDescriptorWorkingCopy.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-/**
- * 
- */
-public class BrowserDescriptorWorkingCopy extends BrowserDescriptor implements IBrowserDescriptorWorkingCopy {
-	protected BrowserDescriptor browser;
-
-	// creation
-	public BrowserDescriptorWorkingCopy() {
-		// do nothing
-	}
-
-	// working copy
-	public BrowserDescriptorWorkingCopy(BrowserDescriptor browser) {
-		this.browser = browser;
-		setInternal(browser);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.browser.IBrowserDescriptorWorkingCopy#setName(java.lang.String)
-	 */
-	public void setName(String name) {
-		if (name == null)
-			throw new IllegalArgumentException();
-		this.name = name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.browser.IBrowserDescriptorWorkingCopy#setLocation(java.lang.String)
-	 */
-	public void setLocation(String location) {
-		this.location = location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.browser.IBrowserDescriptorWorkingCopy#setParameters(java.lang.String)
-	 */
-	public void setParameters(String params) {
-		this.parameters = params;
-	}
-
-	public boolean isWorkingCopy() {
-		return true;
-	}
-	
-	public IBrowserDescriptorWorkingCopy getWorkingCopy() {
-		return this;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.browser.IBrowserDescriptorWorkingCopy#save()
-	 */
-	public IBrowserDescriptor save() {
-		if (browser != null) {
-			browser.setInternal(this);
-			BrowserManager.getInstance().saveBrowsers();
-		} else {
-			browser = new BrowserDescriptor();
-			browser.setInternal(this);
-			BrowserManager.getInstance().addBrowser(browser);
-		}
-		return browser;
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserExt.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserExt.java
deleted file mode 100644
index 322932e..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserExt.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.ui.browser.BrowserFactory;
-import org.eclipse.ui.browser.IWebBrowser;
-/**
- * @since 1.0
- */
-public class BrowserExt implements IBrowserExt {
-	private static final String ATTR_FACTORY_CLASS = "factoryclass"; //$NON-NLS-1$
-
-	private IConfigurationElement element;
-
-	private BrowserFactory delegate;
-
-	/**
-	 * BrowserExt constructor comment.
-	 */
-	public BrowserExt(IConfigurationElement element) {
-		super();
-		this.element = element;
-	}
-
-	/**
-	 * Returns the id of this browser.
-	 * 
-	 * @return java.lang.String
-	 */
-	public String getId() {
-		return element.getAttribute("id"); //$NON-NLS-1$
-	}
-
-	public String getName() {
-		String label = element.getAttribute("name"); //$NON-NLS-1$
-		if (label == null)
-			return "n/a"; //$NON-NLS-1$
-		return label;
-	}
-
-	public String getParameters() {
-		return element.getAttribute("parameters"); //$NON-NLS-1$
-	}
-
-	public String getExecutable() {
-		return element.getAttribute("executable"); //$NON-NLS-1$
-	}
-
-	public String getOS() {
-		String os = element.getAttribute("os"); //$NON-NLS-1$
-		if (os == null)
-			os = ""; //$NON-NLS-1$
-		return os;
-	}
-
-	public String[] getDefaultLocations() {
-		List list = new ArrayList();
-		IConfigurationElement[] children = element.getChildren("location"); //$NON-NLS-1$
-		if (children != null) {
-			int size = children.length;
-			for (int i = 0; i < size; i++) {
-				list.add(children[i].getValue());
-			}
-		}
-
-		String[] s = new String[list.size()];
-		list.toArray(s);
-		return s;
-	}
-
-	protected BrowserFactory getDelegate() {
-		if (delegate == null) {
-			if (element.getAttribute(ATTR_FACTORY_CLASS) == null
-					|| element.getAttribute(ATTR_FACTORY_CLASS).length() == 0)
-				return null;
-
-			try {
-				delegate = (BrowserFactory) element
-						.createExecutableExtension(ATTR_FACTORY_CLASS);
-			} catch (Exception e) {
-				Trace
-						.trace(
-								Trace.SEVERE,
-								"Could not create delegate" + toString() + ": " + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-		return delegate;
-	}
-
-	/**
-	 * Checks whether the factory can work on the user system.
-	 * 
-	 * @return false if the factory cannot work on this system; for example the
-	 *         required native browser required by browser adapters that it
-	 *         creates is not installed
-	 */
-	public boolean isAvailable() {
-		if (delegate == null && (element.getAttribute(ATTR_FACTORY_CLASS) == null
-				|| element.getAttribute(ATTR_FACTORY_CLASS).length() == 0))
-			return true;
-		
-		try {
-			return getDelegate().isAvailable();
-		} catch (Exception e) {
-			Trace
-					.trace(
-							Trace.SEVERE,
-							"Error calling delegate " + toString() + ": " + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
-			return false;
-		}
-	}
-
-	/**
-	 * Obtains a new instance of a web browser.
-	 * 
-	 * @return instance of IBrowser
-	 */
-	public IWebBrowser createBrowser(String id, String location,
-			String parameters) {
-		try {
-			return getDelegate().createBrowser(id, location, parameters);
-		} catch (Exception e) {
-			Trace
-					.trace(
-							Trace.SEVERE,
-							"Error calling delegate " + toString() + ": " + e.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$
-			return null;
-		}
-	}
-
-	/**
-	 * Return a string representation of this object.
-	 * 
-	 * @return java.lang.String
-	 */
-	public String toString() {
-		String s = "BrowserExt: " + getId() + ", " + getName() + ", " + getOS()  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-				+ ", " + getExecutable() + ", " + getParameters() + ", ";  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-		String[] locations = getDefaultLocations();
-		if (locations != null) {
-			int size = locations.length;
-			for (int i = 0; i < size; i++) {
-				s += locations[i] + ";"; //$NON-NLS-1$
-			}
-		}
-		return s;
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserLauncher.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserLauncher.java
deleted file mode 100644
index bf39238..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserLauncher.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.net.MalformedURLException;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ui.IEditorLauncher;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-
-public class BrowserLauncher implements IEditorLauncher {
-
-	public BrowserLauncher() {
-		// do nothing
-	}
-
-	public void open(IPath file) {
-		IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
-		try {
-			if (WebBrowserPreference.getBrowserChoice()== WebBrowserPreference.INTERNAL)
-				support.createBrowser(IWorkbenchBrowserSupport.LOCATION_BAR | IWorkbenchBrowserSupport.NAVIGATION_BAR,
-						file.toPortableString(), null, null).openURL(file.toFile().toURL());
-			else
-				support.createBrowser(IWorkbenchBrowserSupport.LOCATION_BAR | IWorkbenchBrowserSupport.NAVIGATION_BAR,
-						DefaultBrowserSupport.SHARED_ID, null, null).openURL(file.toFile().toURL());
-		}
-		catch (MalformedURLException e) {
-			// ignore
-		}
-		catch (PartInitException e) {
-			MessageDialog.openError(PlatformUI.getWorkbench().getDisplay().getActiveShell(),
-					Messages.errorDialogTitle, e.getLocalizedMessage());
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserManager.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserManager.java
deleted file mode 100644
index d171e98..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserManager.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Observable;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.XMLMemento;
-/**
- * 
- */
-public class BrowserManager extends Observable {
-	protected List browsers;
-	protected IBrowserDescriptor currentBrowser;
-	
-	private IPreferenceChangeListener pcl;
-	protected boolean ignorePreferenceChanges = false;
-
-	protected static BrowserManager instance;
-	
-	public static BrowserManager getInstance() {
-		if (instance == null)
-			instance = new BrowserManager();
-		return instance;
-	}
-
-	private BrowserManager() {
-		pcl = new IEclipsePreferences.IPreferenceChangeListener() {
-
-			public void preferenceChange(PreferenceChangeEvent event) {
-				String property = event.getKey();
-				if (!ignorePreferenceChanges && property.equals("browsers")) { //$NON-NLS-1$
-					loadBrowsers();
-				}
-				if (!property.equals(WebBrowserPreference.PREF_INTERNAL_WEB_BROWSER_HISTORY)) {
-					setChanged();
-					notifyObservers();
-				}
-			}
-		};
-		
-
-	    InstanceScope instanceScope = new InstanceScope();
-	    IEclipsePreferences prefs = instanceScope.getNode(WebBrowserUIPlugin.PLUGIN_ID);
-	    prefs.addPreferenceChangeListener(pcl);
-	}
-
-	protected static void safeDispose() {
-		if (instance == null)
-			return;
-		instance.dispose();
-	}
-
-	protected void dispose() {
-	    InstanceScope instanceScope = new InstanceScope();
-		IEclipsePreferences prefs = instanceScope.getNode(WebBrowserUIPlugin.PLUGIN_ID);
-		prefs.removePreferenceChangeListener(pcl);
-	}
-
-	public IBrowserDescriptorWorkingCopy createExternalWebBrowser() {
-		return new BrowserDescriptorWorkingCopy();
-	}	
-
-	public List getWebBrowsers() {
-		if (browsers == null)
-			loadBrowsers();
-		return new ArrayList(browsers);
-	}
-
-	protected void loadBrowsers() {
-		Trace.trace(Trace.FINEST, "Loading web browsers"); //$NON-NLS-1$
-		
-		String xmlString = Platform.getPreferencesService().getString
-		    (WebBrowserUIPlugin.PLUGIN_ID,  "browsers", null, null); //$NON-NLS-1$
-		if (xmlString != null && xmlString.length() > 0) {
-			browsers = new ArrayList();
-			
-			try {
-				ByteArrayInputStream in = new ByteArrayInputStream(xmlString.getBytes());
-				Reader reader = new InputStreamReader(in);
-				IMemento memento = XMLMemento.createReadRoot(reader);
-				
-				IMemento system = memento.getChild("system"); //$NON-NLS-1$
-				if (system != null && WebBrowserUtil.canUseSystemBrowser())
-					browsers.add(new SystemBrowserDescriptor());
-				
-				IMemento[] children = memento.getChildren("external"); //$NON-NLS-1$
-				int size = children.length;
-				for (int i = 0; i < size; i++) {
-					BrowserDescriptor browser = new BrowserDescriptor();
-					browser.load(children[i]);
-					browsers.add(browser);
-				}
-				
-				Integer current = memento.getInteger("current"); //$NON-NLS-1$
-				if (current != null) {
-					currentBrowser = (IBrowserDescriptor) browsers.get(current.intValue()); 
-				}
-			} catch (Exception e) {
-				Trace.trace(Trace.WARNING, "Could not load browsers: " + e.getMessage()); //$NON-NLS-1$
-			}
-			
-			IBrowserDescriptor system = new SystemBrowserDescriptor();
-			if (WebBrowserUtil.canUseSystemBrowser() && !browsers.contains(system)) {
-				browsers.add(0, system);
-				currentBrowser = system;
-				saveBrowsers();
-			}
-		} else {
-			setupDefaultBrowsers();
-			saveBrowsers();
-		}
-		
-		if (currentBrowser == null && browsers.size() > 0)
-			currentBrowser = (IBrowserDescriptor) browsers.get(0);
-		setChanged();
-		notifyObservers();
-	}
-
-	protected void saveBrowsers() {
-		try {
-			ignorePreferenceChanges = true;
-			XMLMemento memento = XMLMemento.createWriteRoot("web-browsers"); //$NON-NLS-1$
-
-			Iterator iterator = browsers.iterator();
-			while (iterator.hasNext()) {
-				Object obj = iterator.next();
-				if (obj instanceof BrowserDescriptor) {
-					BrowserDescriptor browser = (BrowserDescriptor) obj;
-					IMemento child = memento.createChild("external"); //$NON-NLS-1$
-					browser.save(child);
-				} else if (obj instanceof SystemBrowserDescriptor) {
-					memento.createChild("system"); //$NON-NLS-1$
-				}
-			}
-			
-			memento.putInteger("current", browsers.indexOf(currentBrowser)); //$NON-NLS-1$
-
-			StringWriter writer = new StringWriter();
-			memento.save(writer);
-			String xmlString = writer.getBuffer().toString();
-			InstanceScope instanceScope = new InstanceScope();
-		    IEclipsePreferences prefs = instanceScope.getNode(WebBrowserUIPlugin.PLUGIN_ID);
-			prefs.put("browsers", xmlString); //$NON-NLS-1$
-			prefs.flush();
-		} catch (Exception e) {
-			Trace.trace(Trace.SEVERE, "Could not save browsers", e); //$NON-NLS-1$
-		}
-		ignorePreferenceChanges = false;
-	}
-
-	protected void setupDefaultBrowsers() {
-		browsers = new ArrayList();
-
-		// add system browser
-		if (WebBrowserUtil.canUseSystemBrowser()) {
-			IBrowserDescriptor system = new SystemBrowserDescriptor();
-			browsers.add(system);
-		}
-		
-		// handle all the EXTERNAL browsers by criteria and add those too at startup
-		WebBrowserUtil.addFoundBrowsers(browsers);
-		
-		// by default, if internal is there, that is current, else set the first external one
-		if (!browsers.isEmpty() && currentBrowser == null)
-			currentBrowser = (IBrowserDescriptor) browsers.get(0);
-	}
-
-	protected void addBrowser(IBrowserDescriptor browser) {
-		if (browsers == null)
-			loadBrowsers();
-		if (!browsers.contains(browser))
-			browsers.add(browser);
-		if (browsers.size() == 1)
-			setCurrentWebBrowser(browser);
-		
-		saveBrowsers();
-	}
-
-	protected void removeWebBrowser(IBrowserDescriptor browser) {
-		if (browsers == null)
-			loadBrowsers();
-		browsers.remove(browser);
-		
-		if (currentBrowser == null || currentBrowser.equals(browser)) {
-			currentBrowser = null;
-			if (browsers.size() > 0)
-				currentBrowser = (IBrowserDescriptor) browsers.get(0);
-		}
-	}
-
-	public IBrowserDescriptor getCurrentWebBrowser() {
-		if (browsers == null)
-			loadBrowsers();
-
-		if (currentBrowser == null && browsers.size() > 0)
-			return (IBrowserDescriptor) browsers.get(0);
-		
-		return currentBrowser; 
-	}
-
-	public void setCurrentWebBrowser(IBrowserDescriptor wb) {
-		if (wb == null)
-			throw new IllegalArgumentException();
-
-		if (browsers.contains(wb))
-			currentBrowser = wb;
-		else
-			throw new IllegalArgumentException();
-		saveBrowsers();
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserText.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserText.java
deleted file mode 100644
index e16b15a..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserText.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-import org.eclipse.jface.resource.JFaceResources;
-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.graphics.Color;
-import org.eclipse.swt.graphics.Rectangle;
-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.Link;
-import org.eclipse.swt.widgets.Text;
-
-public class BrowserText {
-    private String url;
-
-    private FallbackScrolledComposite scomp;
-
-    private Label title;
-
-    private Label exTitle;
-
-    private Label text;
-
-    private Label sep;
-
-    protected Link link;
-
-    private BrowserViewer viewer;
-
-    private Button button;
-
-    private Text exception;
-
-    private boolean expanded;
-
-    private Throwable ex;
-
-    class ReflowScrolledComposite extends FallbackScrolledComposite {
-        public ReflowScrolledComposite(Composite parent, int style) {
-            super(parent, style);
-        }
-
-        public void reflow(boolean flushCache) {
-            updateWidth(this);
-            super.reflow(flushCache);
-        }
-    }
-
-    public BrowserText(Composite parent, BrowserViewer viewer, Throwable ex) {
-        this.viewer = viewer;
-        this.ex = ex;
-        Color bg = parent.getDisplay()
-                .getSystemColor(SWT.COLOR_LIST_BACKGROUND);
-        scomp = new ReflowScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
-        Composite client = new Composite(scomp, SWT.NULL);
-        fillContent(client, bg);
-        scomp.setContent(client);        
-        scomp.setBackground(bg);
-    }
-
-    private void fillContent(Composite parent, Color bg) {
-        GridLayout layout = new GridLayout();
-        layout.verticalSpacing = 10;
-        parent.setLayout(layout);
-        title = new Label(parent, SWT.WRAP);
-        title.setText(Messages.BrowserText_title);
-        title.setFont(JFaceResources.getHeaderFont());
-        title.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        title.setBackground(bg);
-
-        link = new Link(parent, SWT.WRAP);
-        link.setText(Messages.BrowserText_link);
-        link.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        link.setToolTipText(Messages.BrowserText_tooltip);
-        link.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                BusyIndicator.showWhile(link.getDisplay(), new Runnable() {
-                    public void run() {
-                        doOpenExternal();
-                    }
-                });
-            }
-        });
-        link.setBackground(bg);
-        sep = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
-        sep.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        exTitle = new Label(parent, SWT.NULL);
-        exTitle.setBackground(bg);
-        exTitle.setFont(JFaceResources.getBannerFont());
-        exTitle.setText(Messages.BrowserText_dtitle);
-        exTitle.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        text = new Label(parent, SWT.WRAP);
-        text.setText(Messages.BrowserText_text);
-        text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        text.setBackground(bg);
-        button = new Button(parent, SWT.PUSH);
-        updateButtonText();
-        button.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                toggleException();
-            }
-        });
-        exception = new Text(parent, SWT.MULTI);
-        loadExceptionText();
-        GridData gd = new GridData(GridData.FILL_BOTH);
-        gd.exclude = true;
-        exception.setLayoutData(gd);
-    }
-
-    private void loadExceptionText() {
-        StringWriter swriter = new StringWriter();
-        PrintWriter writer = new PrintWriter(swriter);
-        writer.println(ex.getMessage());
-        ex.printStackTrace(writer);
-        writer.close();
-        exception.setText(swriter.toString());
-    }
-
-    protected void toggleException() {
-        expanded = !expanded;
-        updateButtonText();
-        GridData gd = (GridData) exception.getLayoutData();
-        gd.exclude = !expanded;
-        exception.setVisible(expanded);
-        refresh();
-    }
-
-    private void updateButtonText() {
-        if (expanded)
-            button.setText(Messages.BrowserText_button_collapse);
-        else
-            button.setText(Messages.BrowserText_button_expand);
-    }
-
-    protected void updateWidth(Composite parent) {
-        Rectangle area = parent.getClientArea();
-        updateWidth(title, area.width);
-        updateWidth(text, area.width);
-        updateWidth(sep, area.width);
-        updateWidth(link, area.width);
-        updateWidth(exTitle, area.width);
-        updateWidth(exception, area.width);
-    }
-
-    private void updateWidth(Control c, int width) {
-        GridData gd = (GridData) c.getLayoutData();
-        if (gd != null)
-            gd.widthHint = width - 10;
-    }
-
-    protected void doOpenExternal() {
-        IBrowserViewerContainer container = viewer.getContainer();
-        if (container != null)
-            container.openInExternalBrowser(url);
-    }
-
-    public Control getControl() {
-        return scomp;
-    }
-
-    public boolean setUrl(String url) {
-        this.url = url;
-        return true;
-    }
-
-    public void setFocus() {
-        link.setFocus();
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void refresh() {
-        scomp.reflow(true);
-    }
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserViewer.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserViewer.java
deleted file mode 100644
index 7262f74..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserViewer.java
+++ /dev/null
@@ -1,953 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    IBM Corporation - Initial API and implementation
- *    Jacek Pospychala - jacek.pospychala@pl.ibm.com - fix for bug 224887
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.browser.CloseWindowListener;
-import org.eclipse.swt.browser.LocationEvent;
-import org.eclipse.swt.browser.LocationListener;
-import org.eclipse.swt.browser.OpenWindowListener;
-import org.eclipse.swt.browser.ProgressEvent;
-import org.eclipse.swt.browser.ProgressListener;
-import org.eclipse.swt.browser.StatusTextEvent;
-import org.eclipse.swt.browser.StatusTextListener;
-import org.eclipse.swt.browser.TitleEvent;
-import org.eclipse.swt.browser.TitleListener;
-import org.eclipse.swt.browser.VisibilityWindowListener;
-import org.eclipse.swt.browser.WindowEvent;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * A Web browser widget. It extends the Eclipse SWT Browser widget by adding an
- * optional toolbar complete with a URL combo box, history, back & forward, and
- * refresh buttons.
- * <p>
- * Use the style bits to choose which toolbars are available within the browser
- * composite. You can access the embedded SWT Browser directly using the
- * getBrowser() method.
- * </p>
- * <p>
- * Additional capabilities are available when used as the internal Web browser,
- * including status text and progress on the Eclipse window's status line, or
- * moving the toolbar capabilities up into the main toolbar.
- * </p>
- * <dl>
- * <dt><b>Styles:</b></dt>
- * <dd>LOCATION_BAR, BUTTON_BAR</dd>
- * <dt><b>Events:</b></dt>
- * <dd>None</dd>
- * </dl>
- * 
- * @since 1.0
- */
-public class BrowserViewer extends Composite {
-    /**
-     * Style parameter (value 1) indicating that the URL and Go button will be
-     * on the local toolbar.
-     */
-    public static final int LOCATION_BAR = 1 << 1;
-
-    /**
-     * Style parameter (value 2) indicating that the toolbar will be available
-     * on the web browser. This style parameter cannot be used without the
-     * LOCATION_BAR style.
-     */
-    public static final int BUTTON_BAR = 1 << 2;
-	 
-	 protected static final String PROPERTY_TITLE = "title"; //$NON-NLS-1$
-
-    private static final int MAX_HISTORY = 50;
-
-    public Clipboard clipboard;
-
-    public Combo combo;
-
-    protected boolean showToolbar;
-
-    protected boolean showURLbar;
-
-    protected ToolItem back;
-
-    protected ToolItem forward;
-
-    protected BusyIndicator busy;
-
-    protected boolean loading;
-
-    protected static java.util.List history;
-
-    protected Browser browser;
-    
-    protected BrowserText text;
-
-    protected boolean newWindow;
-
-    protected IBrowserViewerContainer container;
-
-    protected String title;
-
-    protected int progressWorked = 0;
-	 
-	 protected List propertyListeners;
-
-    /**
-     * Under development - do not use
-     */
-    public static interface ILocationListener {
-        public void locationChanged(String url);
-
-        public void historyChanged(String[] history2);
-    }
-
-    public ILocationListener locationListener;
-
-    /**
-     * Under development - do not use
-     */
-    public static interface IBackNextListener {
-        public void updateBackNextBusy();
-    }
-
-    public IBackNextListener backNextListener;
-
-    /**
-     * Creates a new Web browser given its parent and a style value describing
-     * its behavior and appearance.
-     * <p>
-     * The style value is either one of the style constants defined in the class
-     * header or class <code>SWT</code> which is applicable to instances of
-     * this class, or must be built by <em>bitwise OR</em>'ing together (that
-     * is, using the <code>int</code> "|" operator) two or more of those
-     * <code>SWT</code> style constants. The class description lists the style
-     * constants that are applicable to the class. Style bits are also inherited
-     * from superclasses.
-     * </p>
-     * 
-     * @param parent
-     *            a composite control which will be the parent of the new
-     *            instance (cannot be null)
-     * @param style
-     *            the style of control to construct
-     */
-    public BrowserViewer(Composite parent, int style) {
-        super(parent, SWT.NONE);
-		  
-        if ((style & LOCATION_BAR) != 0)
-            showURLbar = true;
-
-        if ((style & BUTTON_BAR) != 0)
-            showToolbar = true;
-
-        GridLayout layout = new GridLayout();
-        layout.marginHeight = 0;
-        layout.marginWidth = 0;
-        layout.horizontalSpacing = 0;
-        layout.verticalSpacing = 0;
-        layout.numColumns = 1;
-        setLayout(layout);
-        setLayoutData(new GridData(GridData.FILL_BOTH));
-        clipboard = new Clipboard(parent.getDisplay());
-        
-        if (showToolbar || showURLbar) {
-            Composite toolbarComp = new Composite(this, SWT.NONE);
-            toolbarComp.setLayout(new ToolbarLayout());
-            toolbarComp.setLayoutData(new GridData(
-                  GridData.VERTICAL_ALIGN_BEGINNING
-                  | GridData.FILL_HORIZONTAL));
-
-            if (showToolbar)
-                createToolbar(toolbarComp);
-            
-				if (showURLbar)
-                createLocationBar(toolbarComp);
-
-				if (showToolbar | showURLbar) {
-				    busy = new BusyIndicator(toolbarComp, SWT.NONE);
-				    busy.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
-				    busy.addMouseListener(new MouseListener() {
-						public void mouseDoubleClick(MouseEvent e) {
-							// ignore
-						}
-
-						public void mouseDown(MouseEvent e) {
-							setURL("http://www.eclipse.org"); //$NON-NLS-1$
-						}
-
-						public void mouseUp(MouseEvent e) {
-							// ignore
-						}
-				    });
-				}
-				PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                  ContextIds.WEB_BROWSER); 
-        }
-
-        // create a new SWT Web browser widget, checking once again to make sure
-        // we can use it in this environment
-        //if (WebBrowserUtil.canUseInternalWebBrowser())
-        try {
-            this.browser = new Browser(this, SWT.NONE);
-        }
-        catch (SWTError e) {
-            if (e.code!=SWT.ERROR_NO_HANDLES) {
-                WebBrowserUtil.openError(Messages.errorCouldNotLaunchInternalWebBrowser);
-                return;
-            }
-            text = new BrowserText(this, this, e);
-        }
-
-        if (showURLbar)
-            updateHistory();
-        if (showToolbar)
-            updateBackNextBusy();
-
-         if (browser!=null) {
-            browser.setLayoutData(new GridData(GridData.FILL_BOTH));
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(browser,
-                    ContextIds.WEB_BROWSER);
-        }
-        else
-            text.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        addBrowserListeners();
-        //listen();
-    }
-
-    /**
-     * Returns the underlying SWT browser widget.
-     * 
-     * @return the underlying browser
-     */
-    public Browser getBrowser() {
-        return browser;
-    }
-
-    /**
-     * Navigate to the home URL.
-     */
-    public void home() {
-   	 browser.setText(""); //$NON-NLS-1$
-    }
-
-    /**
-     * Loads a URL.
-     * 
-     * @param url
-     *            the URL to be loaded
-     * @return true if the operation was successful and false otherwise.
-     * @exception IllegalArgumentException
-     *                <ul>
-     *                <li>ERROR_NULL_ARGUMENT - if the url is null</li>
-     *                </ul>
-     * @exception SWTException
-     *                <ul>
-     *                <li>ERROR_THREAD_INVALID_ACCESS when called from the
-     *                wrong thread</li>
-     *                <li>ERROR_WIDGET_DISPOSED when the widget has been
-     *                disposed</li>
-     *                </ul>
-     * @see #getURL()
-     */
-    public void setURL(String url) {
-       setURL(url, true);
-    }
-
-    protected void updateBackNextBusy() {
-        back.setEnabled(isBackEnabled());
-        forward.setEnabled(isForwardEnabled());
-        busy.setBusy(loading);
-
-        if (backNextListener != null)
-            backNextListener.updateBackNextBusy();
-    }
-
-    protected void updateLocation() {
-        if (locationListener != null)
-            locationListener.historyChanged(null);
-
-        if (locationListener != null)
-            locationListener.locationChanged(null);
-    }
-
-    /**
-     *
-     */
-    private void addBrowserListeners() {
-        if (browser==null) return;
-        // respond to ExternalBrowserInstance StatusTextEvents events by
-        // updating the status line
-        browser.addStatusTextListener(new StatusTextListener() {
-            public void changed(StatusTextEvent event) {
-					//System.out.println("status: " + event.text); //$NON-NLS-1$
-                if (container != null) {
-                    IStatusLineManager status = container.getActionBars()
-                            .getStatusLineManager();
-                    status.setMessage(event.text);
-                }
-            }
-        });
-
-        // Add listener for new window creation so that we can instead of
-        // opening a separate
-        // new window in which the session is lost, we can instead open a new
-        // window in a new
-        // shell within the browser area thereby maintaining the session.
-        browser.addOpenWindowListener(new OpenWindowListener() {
-            public void open(WindowEvent event) {
-                Shell shell2 = new Shell(getShell(), SWT.SHELL_TRIM );
-                shell2.setLayout(new FillLayout());
-                shell2.setText(Messages.viewWebBrowserTitle);
-                shell2.setImage(getShell().getImage());
-                if (event.location != null)
-                    shell2.setLocation(event.location);
-                if (event.size != null)
-                    shell2.setSize(event.size);
-					 int style = 0;
-					 if (event.addressBar)
-						 style += LOCATION_BAR;
-					 if (event.toolBar)
-						 style += BUTTON_BAR;
-                BrowserViewer browser2 = new BrowserViewer(shell2, 0);
-                browser2.newWindow = true;
-                event.browser = browser2.browser;
-            }
-        });
-		  
-		  browser.addVisibilityWindowListener(new VisibilityWindowListener() {
-				public void hide(WindowEvent e) {
-					// ignore
-				}
-				
-				public void show(WindowEvent e) {
-					Browser browser2 = (Browser)e.widget;
-					if (browser2.getParent().getParent() instanceof Shell) {
-						Shell shell = (Shell) browser2.getParent().getParent();
-						if (e.location != null)
-							shell.setLocation(e.location);
-						if (e.size != null)
-							shell.setSize(shell.computeSize(e.size.x, e.size.y));
-						shell.open();
-					}
-				}
-			});
-
-        browser.addCloseWindowListener(new CloseWindowListener() {
-            public void close(WindowEvent event) {
-                // if shell is not null, it must be a secondary popup window,
-                // else its an editor window
-                if (newWindow)
-                    getShell().dispose();
-                else
-                    container.close();
-            }
-        });
-
-        browser.addProgressListener(new ProgressListener() {
-            public void changed(ProgressEvent event) {
-					//System.out.println("progress: " + event.current + ", " + event.total); //$NON-NLS-1$ //$NON-NLS-2$
-                if (event.total == 0)
-                    return;
-
-                boolean done = (event.current == event.total);
-
-                int percentProgress = event.current * 100 / event.total;
-                if (container != null) {
-                    IProgressMonitor monitor = container.getActionBars()
-                            .getStatusLineManager().getProgressMonitor();
-                    if (done) {
-                        monitor.done();
-                        progressWorked = 0;
-                    } else if (progressWorked == 0) {
-                        monitor.beginTask("", event.total); //$NON-NLS-1$
-                        progressWorked = percentProgress;
-                    } else {
-                        monitor.worked(event.current - progressWorked);
-                        progressWorked = event.current;
-                    }
-                }
-
-                if (showToolbar) {
-                    if (!busy.isBusy() && !done)
-                        loading = true;
-                    else if (busy.isBusy() && done) // once the progress hits
-                        // 100 percent, done, set
-                        // busy to false
-                        loading = false;
-
-						  //System.out.println("loading: " + loading); //$NON-NLS-1$
-                    updateBackNextBusy();
-                    updateHistory();
-                }
-            }
-
-            public void completed(ProgressEvent event) {
-                if (container != null) {
-                    IProgressMonitor monitor = container.getActionBars()
-                            .getStatusLineManager().getProgressMonitor();
-                    monitor.done();
-                }
-                if (showToolbar) {
-                    loading = false;
-                    updateBackNextBusy();
-                    updateHistory();
-                }
-            }
-        });
-
-        if (showToolbar) {
-            browser.addLocationListener(new LocationListener() {
-                public void changed(LocationEvent event) {
-                    if (!event.top)
-                        return;
-                    if (combo != null) {
-                        if (!"about:blank".equals(event.location)) { //$NON-NLS-1$
-                            combo.setText(event.location);
-                            addToHistory(event.location);
-                            updateHistory();
-                        }// else
-                        //    combo.setText(""); //$NON-NLS-1$
-                    }
-                }
-
-                public void changing(LocationEvent event) {
-                    // do nothing
-                }
-            });
-        }
-
-        browser.addTitleListener(new TitleListener() {
-            public void changed(TitleEvent event) {
-					 String oldTitle = title;
-                title = event.title;
-					 firePropertyChangeEvent(PROPERTY_TITLE, oldTitle, title);
-            }
-        });
-    }
-	 
-	 /**
-		 * Add a property change listener to this instance.
-		 *
-		 * @param listener java.beans.PropertyChangeListener
-		 */
-		public void addPropertyChangeListener(PropertyChangeListener listener) {
-			if (propertyListeners == null)
-				propertyListeners = new ArrayList();
-			propertyListeners.add(listener);
-		}
-
-		/**
-		 * Remove a property change listener from this instance.
-		 *
-		 * @param listener java.beans.PropertyChangeListener
-		 */
-		public void removePropertyChangeListener(PropertyChangeListener listener) {
-			if (propertyListeners != null)
-				propertyListeners.remove(listener);
-		}
-
-		/**
-		 * Fire a property change event.
-		 */
-		protected void firePropertyChangeEvent(String propertyName, Object oldValue, Object newValue) {
-			if (propertyListeners == null)
-				return;
-
-			PropertyChangeEvent event = new PropertyChangeEvent(this, propertyName, oldValue, newValue);
-			//Trace.trace("Firing: " + event + " " + oldValue);
-			try {
-				int size = propertyListeners.size();
-				PropertyChangeListener[] pcl = new PropertyChangeListener[size];
-				propertyListeners.toArray(pcl);
-				
-				for (int i = 0; i < size; i++)
-					try {
-						pcl[i].propertyChange(event);
-					} catch (Exception e) {
-						// ignore
-					}
-			} catch (Exception e) {
-				// ignore
-			}
-		}
-
-    /**
-     * Navigate to the next session history item. Convenience method that calls
-     * the underlying SWT browser.
-     * 
-     * @return <code>true</code> if the operation was successful and
-     *         <code>false</code> otherwise
-     * @exception SWTException
-     *                <ul>
-     *                <li>ERROR_THREAD_INVALID_ACCESS when called from the
-     *                wrong thread</li>
-     *                <li>ERROR_WIDGET_DISPOSED when the widget has been
-     *                disposed</li>
-     *                </ul>
-     * @see #back
-     */
-    public boolean forward() {
-        if (browser==null)
-            return false;
-        return browser.forward();
-    }
-
-    /**
-     * Navigate to the previous session history item. Convenience method that
-     * calls the underlying SWT browser.
-     * 
-     * @return <code>true</code> if the operation was successful and
-     *         <code>false</code> otherwise
-     * @exception SWTException
-     *                <ul>
-     *                <li>ERROR_THREAD_INVALID_ACCESS when called from the
-     *                wrong thread</li>
-     *                <li>ERROR_WIDGET_DISPOSED when the widget has been
-     *                disposed</li>
-     *                </ul>
-     * @see #forward
-     */
-    public boolean back() {
-        if (browser==null)
-            return false;
-        return browser.back();
-    }
-
-    /**
-     * Returns <code>true</code> if the receiver can navigate to the previous
-     * session history item, and <code>false</code> otherwise. Convenience
-     * method that calls the underlying SWT browser.
-     * 
-     * @return the receiver's back command enabled state
-     * @exception SWTException
-     *                <ul>
-     *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-     *                disposed</li>
-     *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-     *                thread that created the receiver</li>
-     *                </ul>
-     * @see #back
-     */
-    public boolean isBackEnabled() {
-        if (browser==null)
-            return false;
-        return browser.isBackEnabled();
-    }
-
-    /**
-     * Returns <code>true</code> if the receiver can navigate to the next
-     * session history item, and <code>false</code> otherwise. Convenience
-     * method that calls the underlying SWT browser.
-     * 
-     * @return the receiver's forward command enabled state
-     * @exception SWTException
-     *                <ul>
-     *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-     *                disposed</li>
-     *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-     *                thread that created the receiver</li>
-     *                </ul>
-     * @see #forward
-     */
-    public boolean isForwardEnabled() {
-        if (browser==null)
-            return false;
-        return browser.isForwardEnabled();
-    }
-
-    /**
-     * Stop any loading and rendering activity. Convenience method that calls
-     * the underlying SWT browser.
-     * 
-     * @exception SWTException
-     *                <ul>
-     *                <li>ERROR_THREAD_INVALID_ACCESS when called from the
-     *                wrong thread</li>
-     *                <li>ERROR_WIDGET_DISPOSED when the widget has been
-     *                disposed</li>
-     *                </ul>
-     */
-    public void stop() {
-        if (browser!=null)
-            browser.stop();
-    }
-
-    /**
-     * 
-     */
-    private boolean navigate(String url) {
-        Trace.trace(Trace.FINER, "Navigate: " + url); //$NON-NLS-1$
-        if (url != null && url.equals(getURL())) {
-            refresh();
-            return true;
-        }
-        if (browser!=null)
-            return browser.setUrl(url);
-        return text.setUrl(url);
-    }
- 
-    /**
-     * Refresh the current page. Convenience method that calls the underlying
-     * SWT browser.
-     * 
-     * @exception SWTException
-     *                <ul>
-     *                <li>ERROR_THREAD_INVALID_ACCESS when called from the
-     *                wrong thread</li>
-     *                <li>ERROR_WIDGET_DISPOSED when the widget has been
-     *                disposed</li>
-     *                </ul>
-     */
-    public void refresh() {
-        if (browser!=null)
-            browser.refresh();
-        else
-            text.refresh();
-		  try {
-			  Thread.sleep(50);
-		  } catch (Exception e) {
-			  // ignore
-		  }
-    }
-
-    private void setURL(String url, boolean browse) {
-        Trace.trace(Trace.FINEST, "setURL: " + url + " " + browse); //$NON-NLS-1$ //$NON-NLS-2$
-        if (url == null) {
-            home();
-            return;
-        }
-
-        if ("eclipse".equalsIgnoreCase(url)) //$NON-NLS-1$
-            url = "http://www.eclipse.org"; //$NON-NLS-1$
-        else if ("wtp".equalsIgnoreCase(url)) //$NON-NLS-1$
-            url = "http://www.eclipse.org/webtools/"; //$NON-NLS-1$
-
-        if (browse)
-            navigate(url);
-
-        addToHistory(url);
-        updateHistory();
-    }
-
-    protected void addToHistory(String url) {
-        if (history == null)
-            history = WebBrowserPreference.getInternalWebBrowserHistory();
-        int found = -1;
-        int size = history.size();
-        for (int i = 0; i < size; i++) {
-            String s = (String) history.get(i);
-            if (s.equals(url)) {
-                found = i;
-                break;
-            }
-        }
-
-        if (found == -1) {
-            if (size >= MAX_HISTORY)
-                history.remove(size - 1);
-            history.add(0, url);
-            WebBrowserPreference.setInternalWebBrowserHistory(history);
-        } else if (found != 0) {
-            history.remove(found);
-            history.add(0, url);
-            WebBrowserPreference.setInternalWebBrowserHistory(history);
-        }
-    }
-
-    /**
-     *
-     */
-    public void dispose() {
-        super.dispose();
-
-        showToolbar = false;
-
-        if (busy != null)
-            busy.dispose();
-        busy = null;
-
-        browser = null;
-        text = null;
-        if (clipboard!=null)
-        	clipboard.dispose();
-        clipboard=null;
-
-        removeSynchronizationListener();
-    }
-
-    private ToolBar createLocationBar(Composite parent) {
-        combo = new Combo(parent, SWT.DROP_DOWN);
-
-        updateHistory();
-
-        combo.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent we) {
-                try {
-                    if (combo.getSelectionIndex() != -1 && !combo.getListVisible()) {
-                        setURL(combo.getItem(combo.getSelectionIndex()));
-                    }
-                } catch (Exception e) {
-                    // ignore
-                }
-            }
-        });
-        combo.addListener(SWT.DefaultSelection, new Listener() {
-            public void handleEvent(Event e) {
-                setURL(combo.getText());
-            }
-        });
-        
-        ToolBar toolbar = new ToolBar(parent, SWT.FLAT);
-
-        ToolItem go = new ToolItem(toolbar, SWT.NONE);
-        go.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_GO));
-        go.setHotImage(ImageResource.getImage(ImageResource.IMG_CLCL_NAV_GO));
-        go.setDisabledImage(ImageResource
-                .getImage(ImageResource.IMG_DLCL_NAV_GO));
-        go.setToolTipText(Messages.actionWebBrowserGo);
-        go.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent event) {
-                setURL(combo.getText());
-            }
-        });
-		  
-		  return toolbar;
-    }
-
-    private ToolBar createToolbar(Composite parent) {
-		  ToolBar toolbar = new ToolBar(parent, SWT.FLAT);
-		  
-        // create back and forward actions
-        back = new ToolItem(toolbar, SWT.NONE);
-        back.setImage(ImageResource
-                .getImage(ImageResource.IMG_ELCL_NAV_BACKWARD));
-        back.setHotImage(ImageResource
-                .getImage(ImageResource.IMG_CLCL_NAV_BACKWARD));
-        back.setDisabledImage(ImageResource
-                .getImage(ImageResource.IMG_DLCL_NAV_BACKWARD));
-        back.setToolTipText(Messages.actionWebBrowserBack);
-        back.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent event) {
-                back();
-            }
-        });
-
-        forward = new ToolItem(toolbar, SWT.NONE);
-        forward.setImage(ImageResource
-                .getImage(ImageResource.IMG_ELCL_NAV_FORWARD));
-        forward.setHotImage(ImageResource
-                .getImage(ImageResource.IMG_CLCL_NAV_FORWARD));
-        forward.setDisabledImage(ImageResource
-                .getImage(ImageResource.IMG_DLCL_NAV_FORWARD));
-        forward.setToolTipText(Messages.actionWebBrowserForward);
-        forward.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent event) {
-                forward();
-            }
-        });
-
-        // create refresh, stop, and print actions
-        ToolItem stop = new ToolItem(toolbar, SWT.NONE);
-        stop.setImage(ImageResource.getImage(ImageResource.IMG_ELCL_NAV_STOP));
-        stop.setHotImage(ImageResource
-                .getImage(ImageResource.IMG_CLCL_NAV_STOP));
-        stop.setDisabledImage(ImageResource
-                .getImage(ImageResource.IMG_DLCL_NAV_STOP));
-        stop.setToolTipText(Messages.actionWebBrowserStop);
-        stop.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent event) {
-                stop();
-            }
-        });
-
-        ToolItem refresh = new ToolItem(toolbar, SWT.NONE);
-        refresh.setImage(ImageResource
-                .getImage(ImageResource.IMG_ELCL_NAV_REFRESH));
-        refresh.setHotImage(ImageResource
-                .getImage(ImageResource.IMG_CLCL_NAV_REFRESH));
-        refresh.setDisabledImage(ImageResource
-                .getImage(ImageResource.IMG_DLCL_NAV_REFRESH));
-        refresh.setToolTipText(Messages.actionWebBrowserRefresh);
-        refresh.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent event) {
-                refresh();
-            }
-        });
-		  
-		  return toolbar;
-    }
-
-    /**
-     * Returns the current URL. Convenience method that calls the underlying SWT
-     * browser.
-     * 
-     * @return the current URL or an empty <code>String</code> if there is no
-     *         current URL
-     * @exception SWTException
-     *                <ul>
-     *                <li>ERROR_THREAD_INVALID_ACCESS when called from the
-     *                wrong thread</li>
-     *                <li>ERROR_WIDGET_DISPOSED when the widget has been
-     *                disposed</li>
-     *                </ul>
-     * @see #setURL(String)
-     */
-    public String getURL() {
-        if (browser!=null)
-            return browser.getUrl();
-        return text.getUrl();
-    }
-
-    public boolean setFocus() {
-        if (browser!=null) {
-            browser.setFocus();
-            updateHistory();
-            return true;
-        }
-        return super.setFocus();
-    }
-
-    /**
-     * Update the history list to the global/shared copy.
-     */
-    protected void updateHistory() {
-        if (combo == null)
-            return;
-
-        String temp = combo.getText();
-        if (history == null)
-            history = WebBrowserPreference.getInternalWebBrowserHistory();
-
-        String[] historyList = new String[history.size()];
-        history.toArray(historyList);
-        combo.setItems(historyList);
-
-        combo.setText(temp);
-    }
-
-    public IBrowserViewerContainer getContainer() {
-        return container;
-    }
-
-    public void setContainer(IBrowserViewerContainer container) {
-    	if (container==null && this.container!=null) {
-    		IStatusLineManager manager = this.container.getActionBars().getStatusLineManager();
-    		if (manager!=null) 
-    			manager.getProgressMonitor().done();
-    	}
-        this.container = container;
-    }
-
-    protected File file;
-    protected long timestamp;
-    protected Thread fileListenerThread;
-    protected LocationListener locationListener2;
-    protected Object syncObject = new Object();
-    
-    protected void addSynchronizationListener() {
-   	 if (fileListenerThread != null)
-   		 return;
-   	 
-   	 fileListenerThread = new Thread("Browser file synchronization") { //$NON-NLS-1$
-   		 public void run() {
-   			 while (fileListenerThread != null) {
-   				 try {
-   					 Thread.sleep(2000);
-   				 } catch (Exception e) {
-   					 // ignore
-   				 }
-   				 synchronized (syncObject) {
-						 if (file != null && file.lastModified() != timestamp) {
-	   					 timestamp = file.lastModified();
-	   					 Display.getDefault().syncExec(new Runnable() {
-	 							public void run() {
-	 								refresh();
-	 							}
-	   					 });
-						 }
-					  }
-   			 }
-   		 }
-   	 };
-   	 fileListenerThread.setDaemon(true);
-   	 fileListenerThread.setPriority(Thread.MIN_PRIORITY);
-   	 
-   	 locationListener2 = new LocationListener() {
-          public void changed(LocationEvent event) {
-         	 File temp = getFile(event.location);
-         	 if (temp != null && temp.exists()) {
-         		 synchronized (syncObject) {
-         			 file = temp;
-            		 timestamp = file.lastModified();
-					 }
-         	 } else
-         		 file = null;
-          }
-          
-          public void changing(LocationEvent event) {
-             // do nothing
-         }
-       };
-       browser.addLocationListener(locationListener2);
-       
-       File temp = getFile(browser.getUrl());
-   	 if (temp != null && temp.exists()) {
-   		file = temp;
-      	timestamp = file.lastModified();
-   	 }
-   	 fileListenerThread.start();
-    }
-
-    protected static File getFile(String location) {
-   	 if (location == null)
-   		 return null;
-   	 if (location.startsWith("file:/")) //$NON-NLS-1$
-   		 location = location.substring(6);
-   	 
-   	 return new File(location);
-    }
-
-    protected void removeSynchronizationListener() {
-   	 if (fileListenerThread == null)
-   		 return;
-   	 
-   	 fileListenerThread = null;
-   	 browser.removeLocationListener(locationListener2);
-   	 locationListener2 = null;
-    }
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BusyIndicator.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BusyIndicator.java
deleted file mode 100644
index 990e118..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BusyIndicator.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-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;
-/**
- * An animated image to show busy status of the Web browser.
- */
-public class BusyIndicator extends Canvas {
-	protected Image[] images;
-	protected Image image;
-
-	protected Thread busyThread;
-	protected boolean stop;
-
-	/**
-	 * BusyWidget constructor comment.
-	 * @param parent org.eclipse.swt.widgets.Composite
-	 * @param style int
-	 */
-	public BusyIndicator(Composite parent, int style) {
-		super(parent, style);
-	
-		images = ImageResource.getBusyImages();
-	
-		addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent event) {
-				onPaint(event);
-			}
-		});
-	
-		image = images[0];
-	}
-	
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		return new Point(25, 25);
-	}
-	
-	/**
-	 * Creates a thread to animate the image.
-	 */
-	protected synchronized void createBusyThread() {
-		if (busyThread != null)
-			return;
-	
-		stop = false;
-		busyThread = new Thread() {
-			protected int count;
-			public void run() {
-				try {
-					count = 1;
-					while (!stop) {
-						Display.getDefault().syncExec(new Runnable() {
-							public void run() {
-								if (!stop) {
-									if (count < 13)
-										setImage(images[count]);
-									count++;
-									if (count > 12)
-										count = 1;
-								}
-							}
-						});
-						try {
-							sleep(125);
-						} catch (Exception e) {
-							// ignore
-						}
-					}
-					if (busyThread == null)
-						Display.getDefault().syncExec(new Thread() {
-							public void run() {
-								setImage(images[0]);
-							}
-						});
-				} catch (Exception e) {
-					Trace.trace(Trace.WARNING, "Busy error", e); //$NON-NLS-1$
-				}
-			}
-		};
-	
-		busyThread.setPriority(Thread.NORM_PRIORITY + 2);
-		busyThread.setDaemon(true);
-		busyThread.start();
-	}
-	
-	public void dispose() {
-		stop = true;
-		busyThread = null;
-		super.dispose();
-	}
-	
-	/**
-	 * Return the image or <code>null</code>.
-	 */
-	public Image getImage() {
-		return image;
-	}
-
-	/**
-	 * Returns true if it is currently busy.
-	 *
-	 * @return boolean
-	 */
-	public boolean isBusy() {
-		return (busyThread != null);
-	}
-
-	/* 
-	 * Process the paint event
-	 */
-	protected void onPaint(PaintEvent event) {
-		Rectangle rect = getClientArea();
-		if (rect.width == 0 || rect.height == 0)
-			return;
-	
-		GC gc = event.gc;
-		if (image != null)
-			gc.drawImage(image, 2, 2);
-	}
-
-	/**
-	 * Sets the indicators busy count up (true) or down (false) one.
-	 *
-	 * @param busy boolean
-	 */
-	public synchronized void setBusy(boolean busy) {
-		if (busy) {
-			if (busyThread == null)
-				createBusyThread();
-		} else {
-			if (busyThread != null) {
-				stop = true;
-				busyThread = null;
-			}
-		}
-	}
-
-	/**
-	 * Set the image.
-	 * The value <code>null</code> clears it.
-	 */
-	public void setImage(Image image) {
-		if (image != this.image && !isDisposed()) {
-			this.image = image;
-			redraw();
-		}
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/ContextIds.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/ContextIds.java
deleted file mode 100644
index 0a7c12e..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/ContextIds.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-/**
- * Context help id constants.
- */
-public interface ContextIds {
-	public static final String PREF_BROWSER = WebBrowserUIPlugin.PLUGIN_ID + ".browser_preference_page_context"; //$NON-NLS-1$
-	public static final String PREF_BROWSER_DIALOG = WebBrowserUIPlugin.PLUGIN_ID + ".browser_preference_page_dialog_context"; //$NON-NLS-1$
-	public static final String WEB_BROWSER = WebBrowserUIPlugin.PLUGIN_ID + ".browser_context"; //$NON-NLS-1$
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/DefaultBrowserSupport.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/DefaultBrowserSupport.java
deleted file mode 100644
index f81f29c..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/DefaultBrowserSupport.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.util.HashMap;
-import java.util.Observable;
-import java.util.Observer;
-
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.browser.AbstractWorkbenchBrowserSupport;
-import org.eclipse.ui.browser.IWebBrowser;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-
-/**
- * Implementation of the workbench browser support.
- */
-public class DefaultBrowserSupport extends AbstractWorkbenchBrowserSupport {
-	static final String SHARED_ID = "org.eclipse.ui.browser"; //$NON-NLS-1$
-	static final String DEFAULT_ID_BASE = "org.eclipse.ui.defaultBrowser"; //$NON-NLS-1$
-	private static final String HELP_BROWSER_ID = "org.eclipse.help.ui"; //$NON-NLS-1$
-
-	protected HashMap browserIdMap = new HashMap();
-
-	protected static DefaultBrowserSupport instance;
-
-	public DefaultBrowserSupport() {
-		// do nothing
-		instance = this;
-		BrowserManager.getInstance().addObserver(new Observer() {
-			public void update(Observable o, Object arg) {
-				// TODO I am not sure what we should do here
-				// The preferences have changed so maybe we should
-				// close the opened browsers in addition to clearing
-				// the table
-				browserIdMap.clear();
-			}
-		});
-	}
-
-	protected static DefaultBrowserSupport getInstance() {
-		return instance;
-	}
-
-	protected IWebBrowser getExistingWebBrowser(String browserId) {
-		try {
-			Object obj = browserIdMap.get(browserId);
-			IWebBrowser browser = null;
-			if (obj instanceof IWebBrowser)
-				browser = (IWebBrowser) obj;
-			else if (obj instanceof HashMap) {
-				HashMap wmap = (HashMap) obj;
-				IWorkbenchWindow window = PlatformUI.getWorkbench()
-						.getActiveWorkbenchWindow();
-				if (window != null) {
-					browser = (IWebBrowser) wmap.get(getWindowKey(window));
-				}
-			}
-			if (browser != null)
-				return browser;
-		} catch (Exception e) {
-			// ignore
-		}
-		return null;
-	}
-
-	private Integer getWindowKey(IWorkbenchWindow window) {
-		return new Integer(window.hashCode());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.browser.IWorkbenchBrowserSupport#createBrowser(int,
-	 *      java.lang.String, java.lang.String, java.lang.String)
-	 */
-	public IWebBrowser createBrowser(int style, String browserId, String name,
-			String tooltip) throws PartInitException {
-		if (browserId == null)
-			browserId = getDefaultId();
-		IWebBrowser browser = getExistingWebBrowser(browserId);
-		if (browser != null) {
-			if (browser instanceof InternalBrowserInstance) {
-				InternalBrowserInstance instance2 = (InternalBrowserInstance) browser;
-				instance2.setName(name);
-				instance2.setTooltip(tooltip);
-			}
-			return browser;
-		}
-
-		IWebBrowser webBrowser = null;
-
-		// AS_EXTERNAL will force the external browser regardless of the user
-		// preference
-		// The help editor will open in an editor regardless of the user preferences
-		boolean isHelpEditor = ((style & AS_EDITOR) != 0) && HELP_BROWSER_ID.equals(browserId);
-		if ((style & AS_EXTERNAL) != 0 || 
-		    (WebBrowserPreference.getBrowserChoice() != WebBrowserPreference.INTERNAL && !isHelpEditor)
-		    || !WebBrowserUtil.canUseInternalWebBrowser()) {
-			IBrowserDescriptor ewb = BrowserManager.getInstance()
-					.getCurrentWebBrowser();
-			if (ewb == null)
-				throw new PartInitException(Messages.errorNoBrowser);
-			
-			if (ewb instanceof SystemBrowserDescriptor)
-				webBrowser = new SystemBrowserInstance(browserId);
-			else {
-				IBrowserExt ext = null;
-				if (ewb != null)
-					ext = WebBrowserUIPlugin.findBrowsers(ewb.getLocation());
-				if (ext != null)
-					webBrowser = ext.createBrowser(browserId,
-							ewb.getLocation(), ewb.getParameters());
-				if (webBrowser == null)
-					webBrowser = new ExternalBrowserInstance(browserId, ewb);
-			}
-		} else {
-			if ((style & IWorkbenchBrowserSupport.AS_VIEW) != 0)
-				webBrowser = new InternalBrowserViewInstance(browserId, style,
-						name, tooltip);
-			else
-				webBrowser = new InternalBrowserEditorInstance(browserId,
-						style, name, tooltip);
-		}
-
-		if (webBrowser instanceof InternalBrowserInstance) {
-			// we should only share internal browsers within one
-			// workbench window. Each workbench window can have
-			// a shared browser with the same id
-			IWorkbenchWindow window = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow();
-			Integer key = getWindowKey(window);
-			HashMap wmap = (HashMap) browserIdMap.get(browserId);
-			if (wmap == null) {
-				wmap = new HashMap();
-				browserIdMap.put(browserId, wmap);
-			}
-			wmap.put(key, webBrowser);
-		} else {
-			// external and system browsers are shared
-			// for the entire workbench
-			browserIdMap.put(browserId, webBrowser);
-		}
-		return webBrowser;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.browser.IWorkbenchBrowserSupport#createBrowser(java.lang.String)
-	 */
-	public IWebBrowser createBrowser(String browserId) throws PartInitException {
-		return createBrowser(0, browserId, null, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.browser.IWorkbenchBrowserSupport#isInternalWebBrowserAvailable()
-	 */
-	public boolean isInternalWebBrowserAvailable() {
-		return WebBrowserUtil.canUseInternalWebBrowser();
-	}
-
-	protected void removeBrowser(IWebBrowser browser) {
-		String baseId = WebBrowserUtil.decodeId(browser.getId());
-		if (browser instanceof InternalBrowserInstance) {
-			// Remove it from the window map and
-			// also remove the window map itself if it is empty.
-			Integer key = ((InternalBrowserInstance) browser).getWindowKey();
-			Object entry = browserIdMap.get(baseId);
-			if (entry != null && entry instanceof HashMap) {
-				HashMap wmap = (HashMap) entry;
-				wmap.remove(key);
-				if (wmap.isEmpty())
-					browserIdMap.remove(baseId);
-			}
-		} else
-			browserIdMap.remove(baseId);
-	}
-	
-	private String getDefaultId() {
-		String id = null;
-		for (int i = 0; i < Integer.MAX_VALUE; i++) {
-			id = DEFAULT_ID_BASE + i;
-			if (browserIdMap.get(id) == null)
-				break;
-		}
-		return id;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/ExternalBrowserInstance.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/ExternalBrowserInstance.java
deleted file mode 100644
index 0cc4278..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/ExternalBrowserInstance.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.net.URL;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.browser.AbstractWebBrowser;
-
-/**
- * An instance of a running Web browser. rundll32.exe
- * url.dll,FileProtocolHandler www.ibm.com
- */
-public class ExternalBrowserInstance extends AbstractWebBrowser {
-	protected IBrowserDescriptor browser;
-
-	protected Process process;
-
-	public ExternalBrowserInstance(String id, IBrowserDescriptor browser) {
-		super(id);
-		this.browser = browser;
-	}
-
-	public void openURL(URL url) throws PartInitException {
-		String urlText = null;
-
-		if (url != null)
-			urlText = url.toExternalForm();
-
-		// change spaces to "%20"
-		if (urlText != null) { 
-			int index = urlText.indexOf(" "); //$NON-NLS-1$
-			while (index >= 0) {
-				urlText = urlText.substring(0, index)
-						+ "%20" + urlText.substring(index + 1); //$NON-NLS-1$
-				index = urlText.indexOf(" "); //$NON-NLS-1$
-			}
-		}
-
-		String location = browser.getLocation();
-		String parameters = browser.getParameters();
-		Trace
-				.trace(
-						Trace.FINEST,
-						"Launching external Web browser: " + location + " - " + parameters + " - " + urlText); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-		String params = WebBrowserUtil.createParameterString(parameters, urlText);
-
-		try {
-			Trace.trace(Trace.FINEST, "Launching " + location + " " + params); //$NON-NLS-1$//$NON-NLS-2$
-			if (params == null || params.length() == 0)
-				process = Runtime.getRuntime().exec(location);
-			else
-				process = Runtime.getRuntime().exec(location + " " + params); //$NON-NLS-1$
-		} catch (Exception e) {
-			Trace.trace(Trace.SEVERE, "Could not launch external browser", e); //$NON-NLS-1$
-			WebBrowserUtil.openError(NLS.bind(
-					Messages.errorCouldNotLaunchWebBrowser, urlText));
-		}
-		Thread thread = new Thread() {
-			public void run() {
-				try {
-					process.waitFor();
-					DefaultBrowserSupport.getInstance().removeBrowser(
-							ExternalBrowserInstance.this);
-				} catch (Exception e) {
-					// ignore
-				}
-			}
-		};
-		thread.setDaemon(true);
-		thread.start();
-	}
-
-	public boolean close() {
-		try {
-			process.destroy();
-			return true;
-		} catch (Exception e) {
-			return false;
-		}
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/FallbackScrolledComposite.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/FallbackScrolledComposite.java
deleted file mode 100644
index 87bc93c..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/FallbackScrolledComposite.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-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.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.ScrollBar;
-
-public abstract class FallbackScrolledComposite extends ScrolledComposite {
-    private static final int H_SCROLL_INCREMENT = 5;
-
-    private static final int V_SCROLL_INCREMENT = 64;
-
-    /**
-     * Creates the new instance.
-     * 
-     * @param parent
-     *            the parent composite
-     * @param style
-     *            the style to use
-     */
-    public FallbackScrolledComposite(Composite parent, int style) {
-        super(parent, style);
-        addListener(SWT.Resize, new Listener() {
-            public void handleEvent(Event e) {
-                reflow(true);
-            }
-        });
-        setExpandVertical(true);
-        setExpandHorizontal(true);
-        initializeScrollBars();
-    }
-
-    /**
-     * Sets the foreground of the control and its content.
-     * 
-     * @param fg
-     *            the new foreground color
-     */
-    public void setForeground(Color fg) {
-        super.setForeground(fg);
-        if (getContent() != null)
-            getContent().setForeground(fg);
-    }
-
-    /**
-     * Sets the background of the control and its content.
-     * 
-     * @param bg
-     *            the new background color
-     */
-    public void setBackground(Color bg) {
-        super.setBackground(bg);
-        if (getContent() != null)
-            getContent().setBackground(bg);
-    }
-
-    /**
-     * Sets the font of the form. This font will be used to render the title
-     * text. It will not affect the body.
-     */
-    public void setFont(Font font) {
-        super.setFont(font);
-        if (getContent() != null)
-            getContent().setFont(font);
-    }
-
-    /**
-     * Overrides 'super' to pass the proper colors and font
-     */
-    public void setContent(Control content) {
-        super.setContent(content);
-        if (content != null) {
-            content.setForeground(getForeground());
-            content.setBackground(getBackground());
-            content.setFont(getFont());
-        }
-    }
-
-    /**
-     * If content is set, transfers focus to the content.
-     */
-    public boolean setFocus() {
-        if (getContent() != null)
-            return getContent().setFocus();
-        return super.setFocus();
-    }
-
-    /**
-     * Recomputes the body layout and the scroll bars. The method should be used
-     * when changes somewhere in the form body invalidate the current layout
-     * and/or scroll bars.
-     * 
-     * @param flushCache
-     *            if <code>true</code>, drop the cached data
-     */
-    public void reflow(boolean flushCache) {
-        Composite c = (Composite) getContent();
-        Rectangle clientArea = getClientArea();
-        if (c == null)
-            return;
-
-        Point newSize = c
-                .computeSize(clientArea.width, SWT.DEFAULT, flushCache);
-
-        setMinSize(newSize);
-        updatePageIncrement();
-        layout(flushCache);
-    }
-
-    private void updatePageIncrement() {
-        ScrollBar vbar = getVerticalBar();
-        if (vbar != null) {
-            Rectangle clientArea = getClientArea();
-            int increment = clientArea.height - 5;
-            vbar.setPageIncrement(increment);
-        }
-    }
-
-    private void initializeScrollBars() {
-        ScrollBar hbar = getHorizontalBar();
-        if (hbar != null) {
-            hbar.setIncrement(H_SCROLL_INCREMENT);
-        }
-        ScrollBar vbar = getVerticalBar();
-        if (vbar != null) {
-            vbar.setIncrement(V_SCROLL_INCREMENT);
-        }
-        updatePageIncrement();
-    }
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/IBrowserDescriptor.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/IBrowserDescriptor.java
deleted file mode 100644
index 9d57daf..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/IBrowserDescriptor.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-/**
- * An interface to an external Web browser.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @see IBrowserDescriptorWorkingCopy
- * @since 1.0
- */
-public interface IBrowserDescriptor {
-	public static final String URL_PARAMETER = "%URL%"; //$NON-NLS-1$
-
-	/**
-	 * Returns the displayable name of the Web browser.
-	 *  
-	 * @return the name
-	 */
-	public String getName();
-
-	/**
-	 * Returns the absolute path to the location of the Web browser's executable.
-	 * The location is platform specific and may return null if no location has been
-	 * set.
-	 * 
-	 * @return the path to the executable
-	 */
-	public String getLocation();
-
-	/**
-	 * Returns the parameters that should be used to launch the Web browser executable.
-	 * %URL% is used if the URL should be inserted into the parameters. If there are
-	 * no parameters, <code>null</code> is returned.
-	 * 
-	 * @return the parameters
-	 */
-	public String getParameters();
-
-	/**
-	 * Deletes this Web browser. The browser will no longer be available to users.
-	 * This method has no effect if the browser has already been deleted or has never
-	 * been saved.
-	 */
-	public void delete();
-
-	/**
-	 * Returns whether this browser is a working copy. Browsers which return
-	 * <code>true</code> to this method can be safely cast to 
-	 * <code>org.eclipse.ui.internal.browser.IBrowserDescriptorWorkingCopy</code>
-	 * 
-	 * @return whether this browser is a working copy
-	 */
-	public boolean isWorkingCopy();
-
-	/**
-	 * Returns a working copy of this browser. Changes to the working copy will be
-	 * applied to this browser when saved.
-	 * 
-	 * @return a working copy of this browser
-	 */
-	public IBrowserDescriptorWorkingCopy getWorkingCopy();
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/IBrowserDescriptorWorkingCopy.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/IBrowserDescriptorWorkingCopy.java
deleted file mode 100644
index e21f991..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/IBrowserDescriptorWorkingCopy.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-/**
- * A working copy of an external web browser.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * @see org.eclipse.ui.internal.browser.IWebBrowser
- * @see IBrowserDescriptor
- * @since 1.0
- */
-public interface IBrowserDescriptorWorkingCopy extends IBrowserDescriptor {
-	/**
-	 * Renames this browser to the specified name. The new name cannot be <code>null</code>.
-	 * 
-	 * @param name the new name for this browser
-	 */
-	public void setName(String name);
-
-	/**
-	 * Set the location of this browsers executable. The location must not be <code>null</code>.
-	 * 
-	 * @param location the new location
-	 */
-	public void setLocation(String location);
-
-	/**
-	 * Set the parameters for this browser. If there are no parameters, the parameters
-	 * should be null.
-	 * 
-	 * @param params the new parameters
-	 */
-	public void setParameters(String params);
-
-	/**
-	 * Saves the changes to this working copy and returns the resulting web browser.
-	 *
-	 * @return the modified or created browser
-	 */
-	public IBrowserDescriptor save();
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/IBrowserExt.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/IBrowserExt.java
deleted file mode 100644
index 67d1bc3..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/IBrowserExt.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import org.eclipse.ui.browser.IWebBrowser;
-
-/**
- * A 
- * 
- * <p>This interface is not intended to be implemented by clients.</p>
- * 
- * @since 1.0
- */
-public interface IBrowserExt {
-	/**
-	 * Returns the id of this client. Each known client has a distinct id. 
-	 * Ids are intended to be used internally as keys; they are not
-	 * intended to be shown to end users.
-	 * 
-	 * @return the client id
-	 */
-	public String getId();
-
-	/**
-	 * Returns the displayable name for this client.
-	 * <p>
-	 * Note that this name is appropriate for the current locale.
-	 * </p>
-	 *
-	 * @return a displayable name for this client
-	 */
-	public String getName();
-
-	/**
-	 * Returns the parameters for this browser.
-	 *
-	 * @return the parameters for this browser
-	 */
-	public String getParameters();
-
-	/**
-	 * Returns the browser's executable.
-	 *
-	 * @return the browser's executable
-	 */
-	public String getExecutable();
-	
-	/**
-	 * Returns the OSs that this browser is available on.
-	 *
-	 * @return an array of OSs that this browser runs on
-	 */
-	public String getOS();
-	
-	/**
-	 * Returns the default install locations of this browser.
-	 *
-	 * @return the default install locations of this browser
-	 */
-	public String[] getDefaultLocations();
-	
-	/**
-	 * Checks whether the factory can work on the user system.
-	 * 
-	 * @return false if the factory cannot work on this system; for example the
-	 *    required native browser required by browser adapters that it
-	 *    creates is not installed
-	 */
-	public boolean isAvailable();
-
-	/**
-	 * Obtains a new instance of a web browser.
-	 * 
-	 * @return instance of IBrowser
-	 */
-	public IWebBrowser createBrowser(String id, String location, String parameters);
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/IBrowserViewerContainer.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/IBrowserViewerContainer.java
deleted file mode 100644
index cb84ff2..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/IBrowserViewerContainer.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import org.eclipse.ui.IActionBars;
-
-public interface IBrowserViewerContainer {
-    /**
-     * Closes the container from the inside.
-     * @return 
-     */
-    boolean close();
-    /**
-     * Returns the action bars of the container.
-     * @return action bars of the container or <code>null</code> if
-     * not available.
-     */
-    IActionBars getActionBars();
-    /**
-     * Opens the url in the external browser if
-     * internal browser failed to create.
-     * @param url
-     */
-    void openInExternalBrowser(String url);
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/ImageResource.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/ImageResource.java
deleted file mode 100644
index 2346e00..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/ImageResource.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.net.URL;
-import java.util.Map;
-import java.util.HashMap;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-/**
- * Utility class to handle image resources.
- */
-public class ImageResource {
-	// the image registry
-	private static ImageRegistry imageRegistry;
-
-	// map of image descriptors since these
-	// will be lost by the image registry
-	private static Map imageDescriptors;
-
-	private static Image[] busyImages;
-
-	private static final String URL_PREFIX = "$nl$/icons/"; //$NON-NLS-1$
-	private static final String URL_CLCL = URL_PREFIX + "clcl16/"; //$NON-NLS-1$
-	private static final String URL_ELCL = URL_PREFIX + "elcl16/"; //$NON-NLS-1$
-	private static final String URL_DLCL = URL_PREFIX + "dlcl16/"; //$NON-NLS-1$
-	private static final String URL_OBJ = URL_PREFIX + "obj16/"; //$NON-NLS-1$
-
-	// --- constants for images ---
-	// toolbar images
-	public static final String IMG_CLCL_NAV_BACKWARD = "IMG_CLCL_NAV_BACKWARD"; //$NON-NLS-1$
-	public static final String IMG_CLCL_NAV_FORWARD = "IMG_CLCL_NAV_FORWARD"; //$NON-NLS-1$
-	public static final String IMG_CLCL_NAV_STOP = "IMG_CLCL_NAV_STOP"; //$NON-NLS-1$
-	public static final String IMG_CLCL_NAV_REFRESH = "IMG_CLCL_NAV_REFRESH"; //$NON-NLS-1$
-	public static final String IMG_CLCL_NAV_GO = "IMG_CLCL_NAV_GO"; //$NON-NLS-1$
-	public static final String IMG_CLCL_NAV_HOME = "IMG_CLCL_NAV_HOME"; //$NON-NLS-1$
-	public static final String IMG_CLCL_NAV_PRINT = "IMG_CLCL_NAV_PRINT"; //$NON-NLS-1$
-
-	public static final String IMG_ELCL_NAV_BACKWARD = "IMG_ELCL_NAV_BACKWARD"; //$NON-NLS-1$
-	public static final String IMG_ELCL_NAV_FORWARD = "IMG_ELCL_NAV_FORWARD"; //$NON-NLS-1$
-	public static final String IMG_ELCL_NAV_STOP = "IMG_ELCL_NAV_STOP"; //$NON-NLS-1$
-	public static final String IMG_ELCL_NAV_REFRESH = "IMG_ELCL_NAV_REFRESH"; //$NON-NLS-1$
-	public static final String IMG_ELCL_NAV_GO = "IMG_ELCL_NAV_GO"; //$NON-NLS-1$
-	public static final String IMG_ELCL_NAV_HOME = "IMG_ELCL_NAV_HOME"; //$NON-NLS-1$
-	public static final String IMG_ELCL_NAV_PRINT = "IMG_ELCL_NAV_PRINT"; //$NON-NLS-1$
-
-	public static final String IMG_DLCL_NAV_BACKWARD = "IMG_DLCL_NAV_BACKWARD"; //$NON-NLS-1$
-	public static final String IMG_DLCL_NAV_FORWARD = "IMG_DLCL_NAV_FORWARD"; //$NON-NLS-1$
-	public static final String IMG_DLCL_NAV_STOP = "IMG_DLCL_NAV_STOP"; //$NON-NLS-1$
-	public static final String IMG_DLCL_NAV_REFRESH = "IMG_DLCL_NAV_REFRESH"; //$NON-NLS-1$
-	public static final String IMG_DLCL_NAV_GO = "IMG_DLCL_NAV_GO"; //$NON-NLS-1$
-	public static final String IMG_DLCL_NAV_HOME = "IMG_DLCL_NAV_HOME"; //$NON-NLS-1$
-	public static final String IMG_DLCL_NAV_PRINT = "IMG_DLCL_NAV_PRINT"; //$NON-NLS-1$
-
-	// general object images
-	public static final String IMG_INTERNAL_BROWSER = "internalBrowser"; //$NON-NLS-1$
-	public static final String IMG_EXTERNAL_BROWSER = "externalBrowser"; //$NON-NLS-1$
-	public static final String IMG_SYSTEM_BROWSER = "systemBrowser"; //$NON-NLS-1$
-
-	/**
-	 * Cannot construct an ImageResource. Use static methods only.
-	 */
-	private ImageResource() {
-		// do nothing
-	}
-
-	/**
-	 * Returns the busy images for the Web browser.
-	 *
-	 * @return org.eclipse.swt.graphics.Image[]
-	 */
-	public static Image[] getBusyImages() {
-		return busyImages;
-	}
-
-	/**
-	 * Return the image with the given key.
-	 *
-	 * @param key java.lang.String
-	 * @return org.eclipse.swt.graphics.Image
-	 */
-	public static Image getImage(String key) {
-		if (imageRegistry == null)
-			initializeImageRegistry();
-		return imageRegistry.get(key);
-	}
-
-	/**
-	 * Return the image descriptor with the given key.
-	 *
-	 * @param key java.lang.String
-	 * @return org.eclipse.jface.resource.ImageDescriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String key) {
-		if (imageRegistry == null)
-			initializeImageRegistry();
-		return (ImageDescriptor) imageDescriptors.get(key);
-	}
-
-	/**
-	 * Initialize the image resources.
-	 */
-	protected static void initializeImageRegistry() {
-		imageRegistry = new ImageRegistry();
-		imageDescriptors = new HashMap();
-	
-		// load Web browser images
-		registerImage(IMG_ELCL_NAV_BACKWARD, URL_ELCL + "nav_backward.gif"); //$NON-NLS-1$
-		registerImage(IMG_ELCL_NAV_FORWARD, URL_ELCL + "nav_forward.gif"); //$NON-NLS-1$
-		registerImage(IMG_ELCL_NAV_STOP, URL_ELCL + "nav_stop.gif"); //$NON-NLS-1$
-		registerImage(IMG_ELCL_NAV_REFRESH, URL_ELCL + "nav_refresh.gif"); //$NON-NLS-1$
-		registerImage(IMG_ELCL_NAV_GO, URL_ELCL + "nav_go.gif"); //$NON-NLS-1$
-		registerImage(IMG_ELCL_NAV_HOME, URL_ELCL + "nav_home.gif"); //$NON-NLS-1$
-		registerImage(IMG_ELCL_NAV_PRINT, URL_ELCL + "nav_print.gif"); //$NON-NLS-1$
-	
-		registerImage(IMG_CLCL_NAV_BACKWARD, URL_CLCL + "nav_backward.gif"); //$NON-NLS-1$
-		registerImage(IMG_CLCL_NAV_FORWARD, URL_CLCL + "nav_forward.gif"); //$NON-NLS-1$
-		registerImage(IMG_CLCL_NAV_STOP, URL_CLCL + "nav_stop.gif"); //$NON-NLS-1$
-		registerImage(IMG_CLCL_NAV_REFRESH, URL_CLCL + "nav_refresh.gif"); //$NON-NLS-1$
-		registerImage(IMG_CLCL_NAV_GO, URL_CLCL + "nav_go.gif"); //$NON-NLS-1$
-		registerImage(IMG_CLCL_NAV_HOME, URL_CLCL + "nav_home.gif"); //$NON-NLS-1$
-		registerImage(IMG_CLCL_NAV_PRINT, URL_CLCL + "nav_print.gif"); //$NON-NLS-1$
-	
-		registerImage(IMG_DLCL_NAV_BACKWARD, URL_DLCL + "nav_backward.gif"); //$NON-NLS-1$
-		registerImage(IMG_DLCL_NAV_FORWARD, URL_DLCL + "nav_forward.gif"); //$NON-NLS-1$
-		registerImage(IMG_DLCL_NAV_STOP, URL_DLCL + "nav_stop.gif"); //$NON-NLS-1$
-		registerImage(IMG_DLCL_NAV_REFRESH, URL_DLCL + "nav_refresh.gif"); //$NON-NLS-1$
-		registerImage(IMG_DLCL_NAV_GO, URL_DLCL + "nav_go.gif"); //$NON-NLS-1$
-		registerImage(IMG_DLCL_NAV_HOME, URL_DLCL + "nav_home.gif"); //$NON-NLS-1$
-		registerImage(IMG_DLCL_NAV_PRINT, URL_DLCL + "nav_print.gif"); //$NON-NLS-1$
-	
-		registerImage(IMG_INTERNAL_BROWSER, URL_OBJ + "internal_browser.gif"); //$NON-NLS-1$
-		registerImage(IMG_EXTERNAL_BROWSER, URL_OBJ + "external_browser.gif"); //$NON-NLS-1$
-		
-		// busy images
-		busyImages = new Image[13];
-		for (int i = 0; i < 13; i++) {
-			registerImage("busy" + i, URL_OBJ + "busy/" + (i+1) + ".gif"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			busyImages[i] = getImage("busy" + i); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Register an image with the registry.
-	 *
-	 * @param key java.lang.String
-	 * @param partialURL java.lang.String
-	 */
-	private static void registerImage(String key, String partialURL) {
-		try {
-			URL url = FileLocator.find(WebBrowserUIPlugin.getInstance().getBundle(), new Path(partialURL), null);
-			ImageDescriptor id = ImageDescriptor.createFromURL(url);
-			imageRegistry.put(key, id);
-			imageDescriptors.put(key, id);
-		} catch (Exception e) {
-			Trace.trace(Trace.WARNING, "Error registering image " + key + " from " + partialURL, e); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/InternalBrowserEditorInstance.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/InternalBrowserEditorInstance.java
deleted file mode 100644
index d97105f..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/InternalBrowserEditorInstance.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.net.URL;
-
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-/**
- * An instance of a running Web browser.
- */
-public class InternalBrowserEditorInstance extends InternalBrowserInstance {
-
-	public InternalBrowserEditorInstance(String id, int style, String name, String tooltip) {
-		super(id, style, name, tooltip);
-	}
-
-	public void openURL(URL url) throws PartInitException {
-		WebBrowserEditorInput input = new WebBrowserEditorInput(url, style);
-		input.setName(this.name);
-		input.setToolTipText(this.tooltip);
-		WebBrowserEditor editor = (WebBrowserEditor)part;
-		
-		IWorkbenchWindow workbenchWindow = WebBrowserUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow();
-		IWorkbenchPage page = null;
-		if (workbenchWindow != null)
-			page = workbenchWindow.getActivePage();
-		
-		if (page == null)
-			throw new PartInitException(Messages.errorCouldNotLaunchInternalWebBrowser);
-		
-		if (editor != null) {
-			editor.init(editor.getEditorSite(), input);
-			page.activate(editor);
-		} else {
-			try {
-				IEditorPart editorPart = page.openEditor(input, WebBrowserEditor.WEB_BROWSER_EDITOR_ID);
-				hookPart(page, editorPart);
-			} catch (Exception e) {
-				Trace.trace(Trace.SEVERE, "Error opening Web browser", e); //$NON-NLS-1$
-			}
-		}
-	}
-
-	public boolean close() {
-		try {
-			return ((WebBrowserEditor)part).close();
-		} catch (Exception e) {
-			return false;
-		}
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/InternalBrowserInstance.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/InternalBrowserInstance.java
deleted file mode 100644
index 87f4811..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/InternalBrowserInstance.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.browser.AbstractWebBrowser;
-
-/**
- * An instance of a running Web browser.
- */
-public abstract class InternalBrowserInstance extends AbstractWebBrowser {
-	protected int style;
-
-	protected String name;
-
-	protected String tooltip;
-
-	protected IWorkbenchPart part;
-
-	protected IPartListener listener;
-	
-	private Integer windowKey;
-
-	public InternalBrowserInstance(String id, int style, String name,
-			String tooltip) {
-		super(WebBrowserUtil.encodeStyle(id, style));
-		this.style = style;
-		this.name = name;
-		this.tooltip = tooltip;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public void setTooltip(String tooltip) {
-		this.tooltip = tooltip;
-	}
-
-	protected void hookPart(final IWorkbenchPage page, IWorkbenchPart part2) {
-		this.part = part2;
-		listener = new IPartListener() {
-			public void partActivated(IWorkbenchPart part3) {
-				// ignore
-			}
-
-			public void partBroughtToTop(IWorkbenchPart part3) {
-				// ignore
-			}
-
-			public void partClosed(IWorkbenchPart part3) {
-				if (part3.equals(InternalBrowserInstance.this.part)) {
-					InternalBrowserInstance.this.part = null;
-					page.removePartListener(listener);
-					DefaultBrowserSupport.getInstance().removeBrowser(
-							InternalBrowserInstance.this);
-				}
-			}
-
-			public void partDeactivated(IWorkbenchPart part3) {
-				// ignore
-			}
-
-			public void partOpened(IWorkbenchPart part3) {
-				// ignore
-			}
-		};
-		page.addPartListener(listener);
-		IWorkbenchWindow window = part.getSite().getWorkbenchWindow();
-		windowKey = new Integer(window.hashCode());
-	}
-
-	public Integer getWindowKey() {
-		return windowKey;
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/InternalBrowserViewInstance.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/InternalBrowserViewInstance.java
deleted file mode 100644
index 2bd9f8e..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/InternalBrowserViewInstance.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.net.URL;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-/**
- * An instance of a running Web browser.
- */
-public class InternalBrowserViewInstance extends InternalBrowserInstance {
-	public InternalBrowserViewInstance(String id, int style, String name, String tooltip) {
-		super(WebBrowserUtil.encodeStyle(id, style), style, name, tooltip);
-	}
-
-	public void openURL(URL url) throws PartInitException {
-        IWorkbenchWindow workbenchWindow = WebBrowserUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow();
-        final IWorkbenchPage page = workbenchWindow.getActivePage();
-        WebBrowserView view = (WebBrowserView)part;
-		if (view == null) {
-            try {
-				view = (WebBrowserView)page.showView(WebBrowserView.WEB_BROWSER_VIEW_ID, getId(), IWorkbenchPage.VIEW_CREATE);
-                hookPart(page, view);
-			} catch (Exception e) {
-				Trace.trace(Trace.SEVERE, "Error opening Web browser", e); //$NON-NLS-1$
-			}
-		}
-        if (view!=null) {
-            page.bringToTop(view);
-            view.setURL(url.toExternalForm());
-        }
-	}
-
-	public boolean close() {
-        return ((WebBrowserView)part).close();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/Messages.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/Messages.java
deleted file mode 100644
index dad379b..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/Messages.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import org.eclipse.osgi.util.NLS;
-/**
- * Translated messages.
- */
-public class Messages extends NLS {
-	static {
-		NLS.initializeMessages("org.eclipse.ui.internal.browser.Messages", Messages.class); //$NON-NLS-1$
-	}
-
-	public static String BrowserText_title;
-	public static String BrowserText_link;
-	public static String BrowserText_tooltip;
-	public static String BrowserText_dtitle;
-	public static String BrowserText_text;
-	public static String BrowserText_button_collapse;
-	public static String BrowserText_button_expand;
-
-	public static String errorCouldNotLaunchInternalWebBrowser;
-	public static String actionWebBrowserGo;
-	public static String viewWebBrowserTitle;
-	public static String actionWebBrowserBack;
-	public static String actionWebBrowserForward;
-	public static String actionWebBrowserStop;
-	public static String actionWebBrowserRefresh;
-	public static String dialogResourceDeletedTitle;
-	public static String dialogResourceDeletedMessage;
-	public static String dialogResourceDeletedIgnore;
-	public static String errorInvalidEditorInput;
-	public static String preferenceWebBrowserDescription;
-	public static String prefInternalBrowser;
-	public static String prefExternalBrowser;
-	public static String prefSystemBrowser;
-	public static String browserList;
-	public static String add;
-	public static String edit;
-	public static String remove;
-	public static String search;
-	public static String selectDirectory;
-	public static String directoryDialogTitle;
-	public static String searchingTaskName;
-	public static String searchingNoneFound;
-	public static String preferenceWebBrowserTitle;
-	public static String searching;
-	public static String errorDialogTitle;
-	public static String errorCouldNotLaunchWebBrowser;
-	public static String errorNoBrowser;
-	public static String editExternalBrowser;
-	public static String createBrowser;
-	public static String name;
-	public static String location;
-	public static String parameters;
-	public static String parametersMessage;
-	public static String browse;
-	public static String browseMessage;
-	public static String locationInvalid;
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/Messages.properties b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/Messages.properties
deleted file mode 100644
index d2a63b2..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/Messages.properties
+++ /dev/null
@@ -1,69 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-BrowserText_title=Embedded browser not available
-BrowserText_link=<a href="open">Open file using the system editor</a>
-BrowserText_tooltip=Open External Editor
-BrowserText_dtitle=Problem Details
-BrowserText_text=The embedded browser widget for this editor cannot be created. It is either not available for your operating system or the system needs to be configured in order to support embedded browser.
-BrowserText_button_collapse=Details<<
-BrowserText_button_expand=Details>>
-
-# --- Internal Web Browser ---
-viewWebBrowserTitle=Web Browser
-
-# Actions
-actionWebBrowserGo=Go to the selected URL
-actionWebBrowserBack=Back to the previous page
-actionWebBrowserForward=Forward to the next page
-actionWebBrowserStop=Stop loading the current page
-actionWebBrowserRefresh=Refresh the current page
-
-# message if a resource is deleted
-dialogResourceDeletedTitle=Web Resource Deleted
-dialogResourceDeletedMessage=The file {0} initially opened in the Web Browser has been deleted from the file system. Do you want to ignore the deletion or close the Web Browser?
-dialogResourceDeletedIgnore=Ignore
-
-# --------------- Preferences ---------------
-
-# Name of the preference pages
-preferenceWebBrowserTitle=Web Browser
-preferenceWebBrowserDescription=Add, remove, or edit installed Web browsers.\nThe selected Web browser will be used by default when Web pages are opened, although some applications may always use the external browser.
-
-# Web Browser preferences
-prefInternalBrowser=Use &internal Web browser
-prefSystemBrowser=Default system Web browser
-prefExternalBrowser=Use e&xternal Web browser
-
-errorDialogTitle=Error
-errorCouldNotLaunchWebBrowser=Could not launch external Web Browser for {0}. Check the Web Browser preferences.
-errorNoBrowser=Could not open a Web browser because there are none configured. Check the Web Browser preferences.
-errorInvalidEditorInput=Could not open Web browser on {0}. Ensure that it is an uncompressed file.
-
-browserList=External &Web browsers:
-add=&New...
-edit=&Edit...
-remove=&Remove
-search=&Search...
-createBrowser=Add External Web Browser
-editExternalBrowser=Edit External Web Browser
-name=&Name:
-location=&Location:
-parameters=&Parameters:
-parametersMessage=Example: -url {0}\n(Use {0} to include the URL)
-browse=&Browse...
-browseMessage=Specify the location of the Web Browser executable
-errorCouldNotLaunchInternalWebBrowser=Could not launch internal Web Browser. Please set an external browser in the Browser preferences.
-searchingTaskName=Searching for Web browsers...
-searching=Found {0} - Searching {1}
-searchingNoneFound=No Web browsers were found.
-selectDirectory=Select a directory to search for Web browsers:
-directoryDialogTitle=Directory Selection
-locationInvalid=The location value is not a valid path name.
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/OpenBrowserHandler.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/OpenBrowserHandler.java
deleted file mode 100644
index 7861089..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/OpenBrowserHandler.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.browser.IWebBrowser;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-
-public class OpenBrowserHandler extends AbstractHandler {
-
-	private static final String PARAM_ID_URL = "url"; //$NON-NLS-1$
-
-	private static final String PARAM_ID_BROWSER_ID = "browserId"; //$NON-NLS-1$
-
-	private static final String PARAM_ID_NAME = "name"; //$NON-NLS-1$
-
-	private static final String PARAM_ID_TOOLTIP = "tooltip"; //$NON-NLS-1$
-
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-
-		String urlText = event.getParameter(PARAM_ID_URL);
-		URL url;
-		if (urlText == null) {
-			url = null;
-		} else {
-			try {
-				url = new URL(urlText);
-			} catch (MalformedURLException ex) {
-				throw new ExecutionException("malformed URL:" + urlText, ex); //$NON-NLS-1$
-			}
-		}
-
-		String browserId = event.getParameter(PARAM_ID_BROWSER_ID);
-		String name = event.getParameter(PARAM_ID_NAME);
-		String tooltip = event.getParameter(PARAM_ID_TOOLTIP);
-
-		try {
-			IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench()
-					.getBrowserSupport();
-			IWebBrowser browser = browserSupport.createBrowser(
-					IWorkbenchBrowserSupport.LOCATION_BAR
-							| IWorkbenchBrowserSupport.NAVIGATION_BAR,
-					browserId, name, tooltip);
-			browser.openURL(url);
-		} catch (PartInitException ex) {
-			throw new ExecutionException("error opening browser", ex); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/OpenBrowserWorkbenchAction.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/OpenBrowserWorkbenchAction.java
deleted file mode 100644
index 9164082..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/OpenBrowserWorkbenchAction.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ui.*;
-import org.eclipse.ui.browser.IWebBrowser;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-/**
- * Action to open the Web broswer.
- */
-public class OpenBrowserWorkbenchAction implements IWorkbenchWindowActionDelegate {
-	/**
-	 * OpenBrowserWorkbenchAction constructor comment.
-	 */
-	public OpenBrowserWorkbenchAction() {
-		super();
-	}
-
-	/**
-	 * Disposes this action delegate.  The implementor should unhook any references
-	 * to itself so that garbage collection can occur.
-	 */
-	public void dispose() {
-		// do nothing
-	}
-
-	/**
-	 * Initializes this action delegate with the workbench window it will work in.
-	 *
-	 * @param window the window that provides the context for this delegate
-	 */
-	public void init(IWorkbenchWindow window) {
-		// do nothing
-	}
-
-	/**
-	 * Performs this action.
-	 * <p>
-	 * This method is called when the delegating action has been triggered.
-	 * Implement this method to do the actual work.
-	 * </p>
-	 *
-	 * @param action the action proxy that handles the presentation portion of the
-	 *   action
-	 */
-	public void run(IAction action) {
-		try {
-			IWorkbenchBrowserSupport browserSupport = WebBrowserUIPlugin.getInstance().getWorkbench().getBrowserSupport();
-			IWebBrowser browser = browserSupport.createBrowser(IWorkbenchBrowserSupport.LOCATION_BAR | IWorkbenchBrowserSupport.NAVIGATION_BAR, null, null, null);
-			browser.openURL(null);
-		} catch (Exception e) {
-			Trace.trace(Trace.SEVERE, "Error opening browser", e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Notifies this action delegate that the selection in the workbench has changed.
-	 * <p>
-	 * Implementers can use this opportunity to change the availability of the
-	 * action or to modify other presentation properties.
-	 * </p>
-	 *
-	 * @param action the action proxy that handles presentation portion of the action
-	 * @param selection the current selection in the workbench
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		// do nothing
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/SWTUtil.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/SWTUtil.java
deleted file mode 100644
index dde786a..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/SWTUtil.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-/**
- * SWT Utility class.
- */
-public class SWTUtil {
-	private static FontMetrics fontMetrics;
-
-	protected static void initializeDialogUnits(Control testControl) {
-		// Compute and store a font metric
-		GC gc = new GC(testControl);
-		gc.setFont(JFaceResources.getDialogFont());
-		fontMetrics = gc.getFontMetrics();
-		gc.dispose();
-	}
-
-	/**
-	 * Returns a width hint for a button control.
-	 */
-	protected static int getButtonWidthHint(Button button) {
-		int widthHint = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.BUTTON_WIDTH);
-		return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
-	}
-
-	/**
-	 * Create a new button with the standard size.
-	 * 
-	 * @param comp a component to add the button to
-	 * @param label the button label
-	 * @return a button
-	 */
-	public static Button createButton(Composite comp, String label) {
-		Button b = new Button(comp, SWT.PUSH);
-		b.setText(label);
-		if (fontMetrics == null)
-			initializeDialogUnits(comp);
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
-		data.widthHint = getButtonWidthHint(b);
-		b.setLayoutData(data);
-		return b;
-	}
-	
-	/**
-	 * Create a new standard label.
-	 * 
-	 * @param comp a component to add the label to
-	 * @param text the label text
-	 * @return a label
-	 */
-	public static Label createLabel(Composite comp, String text) {
-		Label label = new Label(comp, SWT.NONE);
-		label.setText(text);
-		label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));
-		return label;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/SystemBrowserDescriptor.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/SystemBrowserDescriptor.java
deleted file mode 100644
index 4d19603..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/SystemBrowserDescriptor.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-public class SystemBrowserDescriptor implements IBrowserDescriptor {
-	public String getName() {
-		return Messages.prefSystemBrowser;
-	}
-
-	public String getLocation() {
-		return null;
-	}
-
-	public String getParameters() {
-		return null;
-	}
-
-	public void delete() {
-		// ignore
-	}
-
-	public boolean isWorkingCopy() {
-		return false;
-	}
-
-	public IBrowserDescriptorWorkingCopy getWorkingCopy() {
-		return null;
-	}
-	
-	public boolean equals(Object obj) {
-		return obj instanceof SystemBrowserDescriptor;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/SystemBrowserInstance.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/SystemBrowserInstance.java
deleted file mode 100644
index 4cacdd6..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/SystemBrowserInstance.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.net.URL;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.program.Program;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.browser.AbstractWebBrowser;
-
-/**
- * An instance of a running system Web browser.
- */
-public class SystemBrowserInstance extends AbstractWebBrowser {
-	public SystemBrowserInstance(String id) {
-		super(id);
-	}
-
-	public void openURL(URL url) throws PartInitException {
-		String urlText = null;
-
-		if (url != null)
-			urlText = url.toExternalForm();
-
-		// change spaces to "%20"
-		if (urlText != null && !WebBrowserUtil.isWindows()) {
-			int index = urlText.indexOf(" "); //$NON-NLS-1$
-			while (index >= 0) {
-				urlText = urlText.substring(0, index) + "%20" //$NON-NLS-1$
-						+ urlText.substring(index + 1);
-				index = urlText.indexOf(" "); //$NON-NLS-1$
-			}
-		}
-		Trace.trace(Trace.FINEST, "Launching system Web browser: " + urlText); //$NON-NLS-1$
-		Program program = Program.findProgram("html"); //$NON-NLS-1$
-		if (program != null) {
-			if (program.execute(urlText))
-				return;
-		}
-		if (!Program.launch(urlText))
-			throw new PartInitException(NLS.bind(Messages.errorCouldNotLaunchWebBrowser, url.toExternalForm()));
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/TextAction.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/TextAction.java
deleted file mode 100644
index ec374f0..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/TextAction.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.jface.action.Action;
-/**
- * Text actions (cut, copy, paste) for the Web browser.
- */
-public class TextAction extends Action {
-	protected BrowserViewer browser;
-	protected byte type;
-
-	public static final byte CUT = 0;
-	public static final byte COPY = 1;
-	public static final byte PASTE = 2;
-	
-	/**
-	 * TextAction constructor comment.
-	 */
-	protected TextAction(BrowserViewer browser, byte type) {
-		super(type + "!"); //$NON-NLS-1$
-		this.browser = browser;
-		this.type = type;
-	}
-	
-	/**
-	 * Copies the selected text to the clipboard.  The text will be put in the 
-	 * clipboard in plain text format.
-	 * <p>
-	 *
-	 * @exception SWTException <ul>
-	 *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-	 *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-	 * </ul>
-	 */
-	public void copy() {
-		Point selection = browser.combo.getSelection();
-	
-		int length = selection.y - selection.x;
-		if (length > 0) {
-			TextTransfer plainTextTransfer = TextTransfer.getInstance();
-			try {
-				browser.clipboard.setContents(
-					new String[] { browser.combo.getText().substring(selection.x, selection.y) }, 
-					new Transfer[] { plainTextTransfer });
-			} catch (SWTError error) {
-				// Copy to clipboard failed. This happens when another application 
-				// is accessing the clipboard while we copy. Ignore the error.
-				// Fixes 1GDQAVN
-			}
-		}
-	}
-	
-	/**
-	 * Moves the selected text to the clipboard.  The text will be put in the 
-	 * clipboard in plain text format and RTF format.
-	 * <p>
-	 *
-	 * @exception SWTException <ul>
-	 *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-	 *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-	 * </ul>
-	 */
-	public void cut(){
-		Point selection = browser.combo.getSelection();
-	
-		if (selection.y > selection.x) {
-			copy();
-			delete();
-		}
-	}
-	
-	/**
-	 * Deletes the character to the right of the caret. Delete the selected text if any.
-	 */
-	public void delete() {
-		Point selection = browser.combo.getSelection();
-		String text = browser.combo.getText();
-	
-		if (selection.x != selection.y) {
-			text = text.substring(0, selection.x) + text.substring(selection.y);
-			browser.combo.setText(text);
-			browser.combo.setSelection(new Point(selection.x, selection.x));
-		}
-	}
-	
-	/** 
-	 * Replaces the selection with the clipboard text or insert the text at 
-	 * the current caret offset if there is no selection. 
-	 * If the widget has the SWT.SINGLE style and the clipboard text contains
-	 * more than one line, only the first line without line delimiters is 
-	 * inserted in the widget.
-	 * <p>
-	 *
-	 * @exception SWTException <ul>
-	 *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-	 *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-	 * </ul>
-	 */
-	public void paste() {
-		TextTransfer transfer = TextTransfer.getInstance();
-		Point selection = browser.combo.getSelection();
-		String text = browser.combo.getText();
-		
-		String newText = (String) browser.clipboard.getContents(transfer);
-		if (newText != null && newText.length() > 0) {
-			text = text.substring(0, selection.x) + newText + text.substring(selection.y);
-			browser.combo.setText(text);
-	
-			// set the selection to the end of the paste
-			int x = selection.x + newText.length();
-			browser.combo.setSelection(new Point(x, x));
-		}
-	}
-	
-	/**
-	 * Implementation of method defined on <code>IAction</code>.
-	 */
-	public void run() {
-		if (browser == null || browser.combo == null)
-			return;
-		if (type == CUT)
-			cut();
-		else if (type == COPY)
-			copy();
-		else if (type == PASTE)
-			paste();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/ToolbarLayout.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/ToolbarLayout.java
deleted file mode 100644
index 18abbe9..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/ToolbarLayout.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Layout;
-/**
- * Custom layout for the browser's toolbar.
- */
-public class ToolbarLayout extends Layout {
-	private static final int SPACING = 5;
-	private static final int EXTRA_BUSY_SPACING = 2;
-	private static final int MARGIN = 2;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Layout#computeSize(org.eclipse.swt.widgets.Composite, int, int, boolean)
-	 */
-	protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
-		if (hHint != SWT.DEFAULT)
-			return new Point(wHint, hHint);
-		
-		Control[] children = composite.getChildren();
-		int h = 0;
-		int size = children.length;
-		for (int i = 0; i < size; i++) {
-			h = Math.max(h, children[i].computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
-		}
-		
-		return new Point(wHint, h + MARGIN * 2);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Layout#layout(org.eclipse.swt.widgets.Composite, boolean)
-	 */
-	protected void layout(Composite composite, boolean flushCache) {
-		Control[] children = composite.getChildren();
-		Rectangle r = composite.getClientArea();
-		
-		int size = children.length;
-		Point[] sizes = new Point[size];
-		for (int i = 0; i < size; i++) {
-			sizes[i] = children[i].computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		}
-
-		int h = r.height - MARGIN * 2;
-		
-		// put busy icon at right with a little extra spacing
-		int busy = size - 1;
-		children[busy].setBounds(r.x + r.width - MARGIN - sizes[busy].x,
-				r.y + MARGIN + (h-sizes[busy].y) / 2, 
-				sizes[busy].x, sizes[busy].y);
-		
-		// find combo
-		int combo = -1;
-		int tw = r.width - MARGIN * 2 - (size - 1) * SPACING
-				- sizes[size-1].x - EXTRA_BUSY_SPACING;
-		for (int i = 0; i < size - 1; i++) {
-			if (children[i] instanceof Combo)
-				combo = i;
-			else
-				tw -= sizes[i].x;
-		}
-		if (combo >= 0)
-			sizes[combo].x = tw;
-		
-		// space out other children with their standard size, give combo all
-		// remaining space (if it exists)
-		int x = MARGIN;
-		for (int i = 0; i < size - 1; i++) {
-			children[i].setBounds(r.x + x, r.y + MARGIN + (h-sizes[i].y) / 2,
-					sizes[i].x, sizes[i].y);
-			x += SPACING + sizes[i].x;
-		}
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/Trace.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/Trace.java
deleted file mode 100644
index 24c6dda..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/Trace.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-/**
- * Helper class to route trace output.
- */
-public class Trace {
-	public static int CONFIG = 0;
-	public static int WARNING = 2;
-	public static int SEVERE = 3;
-	public static int FINER = 4;
-	public static int FINEST = 5;
-
-	/**
-	 * Trace constructor comment.
-	 */
-	private Trace() {
-		super();
-	}
-
-	/**
-	 * Trace the given text.
-	 *
-	 * @param s java.lang.String
-	 */
-	public static void trace(int level, String s) {
-		Trace.trace(level, s, null);
-	}
-
-	/**
-	 * Trace the given message and exception.
-	 *
-	 * @param s java.lang.String
-	 * @param t java.lang.Throwable
-	 */
-	public static void trace(int level, String s, Throwable t) {
-		if (!WebBrowserUIPlugin.getInstance().isDebugging())
-			return;
-
-		System.out.println(s);
-		if (t != null)
-			t.printStackTrace();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserEditor.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserEditor.java
deleted file mode 100644
index dc26129..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserEditor.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IPathEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-import org.eclipse.ui.part.EditorPart;
-/**
- * An integrated Web browser, defined as an editor to make
- * better use of the desktop.
- */
-public class WebBrowserEditor extends EditorPart implements IBrowserViewerContainer {
-	public static final String WEB_BROWSER_EDITOR_ID = "org.eclipse.ui.browser.editor"; //$NON-NLS-1$
-
-	protected BrowserViewer webBrowser;
-	protected String initialURL;
-	protected Image image;
-
-	protected TextAction cutAction;
-	protected TextAction copyAction;
-	protected TextAction pasteAction;
-	
-	private boolean disposed;
-	private boolean lockName;
-
-	/**
-	 * WebBrowserEditor constructor comment.
-	 */
-	public WebBrowserEditor() {
-		super();
-	}
-	
-	/*
-	 * Creates the SWT controls for this workbench part.
-	 */
-	public void createPartControl(Composite parent) {
-		WebBrowserEditorInput input = getWebBrowserEditorInput();
-		
-		int style = 0;
-		if (input == null || input.isLocationBarLocal()) {
-			style += BrowserViewer.LOCATION_BAR;
-		}
-		if (input == null || input.isToolbarLocal()) {
-			style += BrowserViewer.BUTTON_BAR;
-		}
-		webBrowser = new BrowserViewer(parent, style);
-		
-		webBrowser.setURL(initialURL);
-		webBrowser.setContainer(this);
-		
-		if (input == null || input.isLocationBarLocal()) {
-			cutAction = new TextAction(webBrowser, TextAction.CUT);
-			copyAction = new TextAction(webBrowser, TextAction.COPY);
-			pasteAction = new TextAction(webBrowser, TextAction.PASTE);
-		}
-		
-		if (!lockName) {
-			PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
-				public void propertyChange(PropertyChangeEvent event) {
-					if (BrowserViewer.PROPERTY_TITLE.equals(event.getPropertyName())) {
-						setPartName((String) event.getNewValue());
-					}
-				}
-			};
-			webBrowser.addPropertyChangeListener(propertyChangeListener);
-		}
-	}
-	
-	public void dispose() {
-		if (image != null && !image.isDisposed())
-			image.dispose();
-		image = null;
-
-		super.dispose();
-		// mark this instance as disposed to avoid stale references
-		disposed = true;
-	}
-	
-	public boolean isDisposed() {
-		return disposed;
-	}
-	
-	/* (non-Javadoc)
-	 * Saves the contents of this editor.
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		// do nothing
-	}
-
-	/* (non-Javadoc)
-	 * Saves the contents of this editor to another object.
-	 */
-	public void doSaveAs() {
-		// do nothing
-	}
-	
-	/**
-	 * Returns the copy action.
-	 *
-	 * @return org.eclipse.jface.action.IAction
-	 */
-	public IAction getCopyAction() {
-		return copyAction;
-	}
-	
-	/**
-	 * Returns the cut action.
-	 *
-	 * @return org.eclipse.jface.action.IAction
-	 */
-	public IAction getCutAction() {
-		return cutAction;
-	}
-	
-	/**
-	 * Returns the web editor input, if available. If the input was of
-	 * another type, <code>null</code> is returned.
-	 *
-	 * @return org.eclipse.ui.internal.browser.IWebBrowserEditorInput
-	 */
-	protected WebBrowserEditorInput getWebBrowserEditorInput() {
-		IEditorInput input = getEditorInput();
-		if (input instanceof WebBrowserEditorInput)
-			return (WebBrowserEditorInput) input;
-		return null;
-	}
-
-	/**
-	 * Returns the paste action.
-	 *
-	 * @return org.eclipse.jface.action.IAction
-	 */
-	public IAction getPasteAction() {
-		return pasteAction;
-	}
-
-	/* (non-Javadoc)
-	 * Initializes the editor part with a site and input.
-	 */
-	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-		Trace.trace(Trace.FINEST, "Opening browser: " + input); //$NON-NLS-1$
-		if (input instanceof IPathEditorInput) {
-			IPathEditorInput pei = (IPathEditorInput) input;
-			IPath path = pei.getPath();
-			URL url = null;
-			try {
-				if (path != null)
-					url = path.toFile().toURL();
-				initialURL = url.toExternalForm();
-			} catch (Exception e) {
-				Trace.trace(Trace.SEVERE, "Error getting URL to file"); //$NON-NLS-1$
-			}
-			if (webBrowser != null) {
-				if (initialURL != null)
-					webBrowser.setURL(initialURL);
-				site.getWorkbenchWindow().getActivePage().activate(this);
-			}
-			
-			setPartName(path.lastSegment());
-			if (url != null)
-				setTitleToolTip(url.getFile());
-
-			Image oldImage = image;
-			ImageDescriptor id = ImageResource.getImageDescriptor(ImageResource.IMG_INTERNAL_BROWSER);
-			image = id.createImage();
-
-			setTitleImage(image);
-			if (oldImage != null && !oldImage.isDisposed())
-				oldImage.dispose();
-			//addResourceListener(file);
-		} else if (input instanceof WebBrowserEditorInput) {
-			WebBrowserEditorInput wbei = (WebBrowserEditorInput) input;
-			initialURL = null;
-			if (wbei.getURL() != null)
-				initialURL = wbei.getURL().toExternalForm();
-			if (webBrowser != null) {
-				webBrowser.setURL(initialURL);
-				site.getWorkbenchWindow().getActivePage().activate(this);
-			}
-	
-			setPartName(wbei.getName());
-			setTitleToolTip(wbei.getToolTipText());
-			lockName = wbei.isNameLocked();
-
-			Image oldImage = image;
-			ImageDescriptor id = wbei.getImageDescriptor();
-			image = id.createImage();
-
-			setTitleImage(image);
-			if (oldImage != null && !oldImage.isDisposed())
-				oldImage.dispose();
-		} else {
-		    IPathEditorInput pinput = (IPathEditorInput) input.getAdapter(IPathEditorInput.class);
-			if (pinput != null) {
-				init(site, pinput);
-			} else {
-			    throw new PartInitException(NLS.bind(Messages.errorInvalidEditorInput, input.getName()));
-			}
-		}
-		
-		setSite(site);
-		setInput(input);
-	}
-	
-	/* (non-Javadoc)
-	 * Returns whether the contents of this editor have changed since the last save
-	 * operation.
-	 */
-	public boolean isDirty() {
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * Returns whether the "save as" operation is supported by this editor.
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	/**
-	 * Open the input in the internal Web browser.
-	 */
-	public static void open(WebBrowserEditorInput input) {
-		IWorkbenchWindow workbenchWindow = WebBrowserUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow();
-		IWorkbenchPage page = workbenchWindow.getActivePage();
-
-		try {
-			IEditorReference[] editors = page.getEditorReferences();
-			int size = editors.length;
-			for (int i = 0; i < size; i++) {
-				if (WEB_BROWSER_EDITOR_ID.equals(editors[i].getId())) {
-					IEditorPart editor = editors[i].getEditor(true);
-					if (editor != null && editor instanceof WebBrowserEditor) {
-						WebBrowserEditor webEditor = (WebBrowserEditor) editor;
-						WebBrowserEditorInput input2 = webEditor.getWebBrowserEditorInput();
-						if (input2 == null || input.canReplaceInput(input2)) {
-							editor.init(editor.getEditorSite(), input);
-							return;
-						}
-					}
-				}
-			}
-			
-			page.openEditor(input, WebBrowserEditor.WEB_BROWSER_EDITOR_ID);
-		} catch (Exception e) {
-			Trace.trace(Trace.SEVERE, "Error opening Web browser", e); //$NON-NLS-1$
-		}
-	}
-	
-	/*
-	 * Asks this part to take focus within the workbench.
-	 */
-	public void setFocus() {
-		if (webBrowser != null)
-			webBrowser.setFocus();
-	}
-
-	/**
-	 * Close the editor correctly.
-	 */
-	public boolean close() {
-        final boolean [] result = new boolean[1];
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				result[0] = getEditorSite().getPage().closeEditor(WebBrowserEditor.this, false);
-			}
-		});
-        return result[0];
-	}
-	
-    public IActionBars getActionBars() {
-        return getEditorSite().getActionBars();
-    }
-
-    public void openInExternalBrowser(String url) {
-        final IEditorInput input = getEditorInput();
-        final String id = getEditorSite().getId();
-        Runnable runnable = new Runnable() {
-            public void run() {
-                doOpenExternalEditor(id, input);
-            }
-        };
-        Display display = getSite().getShell().getDisplay();
-        close();
-        display.asyncExec(runnable);
-    }
-    
-    protected void doOpenExternalEditor(String id, IEditorInput input) {
-        IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
-        String name = input.getName();
-        IEditorDescriptor [] editors = registry.getEditors(name);
-        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-
-        String editorId = null;
-        for (int i = 0; i < editors.length; i++) {
-            IEditorDescriptor editor = editors[i];
-            if (editor.getId().equals(id))
-                continue;
-            editorId = editor.getId();
-            break;
-        } 
-        
-        IEditorDescriptor ddesc = registry.getDefaultEditor(name);
-        if (ddesc!=null && ddesc.getId().equals(id)) {
-            int dot = name.lastIndexOf('.');
-            String ext = name;
-            if (dot!= -1)
-                ext = "*."+name.substring(dot+1); //$NON-NLS-1$
-            registry.setDefaultEditor(ext, null);
-        }
- 
-         if (editorId==null) {
-            // no editor
-            // next check with the OS for an external editor
-            if (registry.isSystemExternalEditorAvailable(name))
-                editorId = IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID;
-        }
-
-        if (editorId!=null) {
-            try {
-                page.openEditor(input, editorId);
-                return;
-            } catch (PartInitException e) {
-					// ignore
-            }
-        }
-        
-        // no registered editor - open using browser support
-        try {
-            URL theURL = new URL(webBrowser.getURL());
-            IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
-            support.getExternalBrowser().openURL(theURL);
-        }
-        catch (MalformedURLException e) {
-            //TODO handle this
-        }
-        catch (PartInitException e) {
-            //TODO handle this
-        }
-    }
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserEditorActionBarContributor.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserEditorActionBarContributor.java
deleted file mode 100644
index 5f0295b..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserEditorActionBarContributor.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.part.EditorActionBarContributor;
-/**
- * ActionBarContributor for the Web browser.
- * Just adds cut, copy, paste actions.
- */
-public class WebBrowserEditorActionBarContributor extends EditorActionBarContributor {
-	protected WebBrowserEditor editor;
-	protected Action back;
-	protected Action forward;
-	protected Updater updater = new Updater();
-
-	class Updater implements BrowserViewer.IBackNextListener {
-		public void updateBackNextBusy() {
-			if (back == null)
-				return;
-			back.setEnabled(getWebBrowser().isBackEnabled());
-			forward.setEnabled(getWebBrowser().isForwardEnabled());
-			//busy.setBusy(getWebBrowser().loading);
-		}
-	}
-
-	/**
-	 * WebBrowserEditorActionBarContributor constructor comment.
-	 */
-	public WebBrowserEditorActionBarContributor() {
-		super();
-	}
-
-	/*
-	 * Sets the active editor for the contributor.
-	 */
-	public void setActiveEditor(IEditorPart targetEditor) {
-		if (targetEditor instanceof WebBrowserEditor) {
-			editor = (WebBrowserEditor) targetEditor;
-		} else
-			editor = null;
-	}
-	
-	protected BrowserViewer getWebBrowser() {
-		if (editor == null)
-			return null;
-		
-		return editor.webBrowser; 
-	}
-
-	/*
-    * Contributes to the given tool bar.
-    */
-   public void contributeToToolBar(IToolBarManager toolBarManager) {
-   	if (editor == null)
-   		return;
-   	/*WebBrowserEditorInput input = editor.getWebBrowserEditorInput();
-   	if (input.isLocationBarGlobal()) {
-	   	final LocationContributionItem location = new LocationContributionItem();
-	   	toolBarManager.add(location);
-	   
-	   	Action go = new Action() {
-	   		public void run() {
-	   			getWebBrowser().setURL(location.getText());
-	   		}
-	   	};
-	   	go.setImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_ELCL_NAV_GO));
-	   	go.setHoverImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_CLCL_NAV_GO));
-	   	go.setDisabledImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_DLCL_NAV_GO));
-	   	go.setToolTipText(Messages.actionWebBrowserGo"));
-	   	toolBarManager.add(go);
-   	}
-   	
-   	if (input.isLocationBarGlobal() && input.isToolbarGlobal()) {
-   		toolBarManager.add(new Separator());
-   	}
-   	
-   	if (input.isToolbarGlobal()) {
-	   	Action favorites = new Action(Messages.actionWebBrowserFavorites"), IAction.AS_DROP_DOWN_MENU) {
-	   		public void run() {
-	   			getWebBrowser().addFavorite();
-	   		}
-	   		public IMenuCreator getMenuCreator() {
-	   			return new IMenuCreator() {
-						public void dispose() {
-							// do nothing
-						}
-	
-						public Menu getMenu(final Control parent) {
-							Menu menu = new Menu(parent);
-							
-							// locked favorites
-							Iterator iterator = WebBrowserUtil.getLockedFavorites().iterator();
-							if (iterator.hasNext()) {
-								while (iterator.hasNext()) {
-									final Favorite f = (Favorite) iterator.next();
-									MenuItem item = new MenuItem(menu, SWT.NONE);
-									item.setText(f.getName());
-									item.setImage(ImageResource.getImage(ImageResource.IMG_FAVORITE));
-									item.addSelectionListener(new SelectionAdapter() {
-										public void widgetSelected(SelectionEvent event) {
-											getWebBrowser().setURL(f.getURL());
-										}
-									});
-								}
-								
-								new MenuItem(menu, SWT.SEPARATOR);
-							}
-							
-							iterator = WebBrowserPreference.getInternalWebBrowserFavorites().iterator();
-							if (!iterator.hasNext()) {
-								MenuItem item = new MenuItem(menu, SWT.NONE);
-								item.setText(Messages.actionWebBrowserNoFavorites"));
-							}
-							while (iterator.hasNext()) {
-								final Favorite f = (Favorite) iterator.next();
-								MenuItem item = new MenuItem(menu, SWT.NONE);
-								item.setText(f.getName());
-								item.setImage(ImageResource.getImage(ImageResource.IMG_FAVORITE));
-								item.addSelectionListener(new SelectionAdapter() {
-									public void widgetSelected(SelectionEvent event) {
-										getWebBrowser().setURL(f.getURL());
-									}
-								});
-							}
-							
-							new MenuItem(menu, SWT.SEPARATOR);
-					
-							MenuItem item = new MenuItem(menu, SWT.NONE);
-							item.setText(Messages.actionWebBrowserOrganizeFavorites"));
-							item.addSelectionListener(new SelectionAdapter() {
-								public void widgetSelected(SelectionEvent event) {
-									OrganizeFavoritesDialog dialog = new OrganizeFavoritesDialog(parent.getShell());
-									dialog.open();
-								}
-							});
-							return menu;
-						}
-	
-						public Menu getMenu(final Menu parent) {
-							Menu menu = new Menu(parent);
-							
-							// locked favorites
-							Iterator iterator = WebBrowserUtil.getLockedFavorites().iterator();
-							if (iterator.hasNext()) {
-								while (iterator.hasNext()) {
-									final Favorite f = (Favorite) iterator.next();
-									MenuItem item = new MenuItem(menu, SWT.NONE);
-									item.setText(f.getName());
-									item.setImage(ImageResource.getImage(ImageResource.IMG_FAVORITE));
-									item.addSelectionListener(new SelectionAdapter() {
-										public void widgetSelected(SelectionEvent event) {
-											getWebBrowser().setURL(f.getURL());
-										}
-									});
-								}
-								
-								new MenuItem(menu, SWT.SEPARATOR);
-							}
-							
-							iterator = WebBrowserPreference.getInternalWebBrowserFavorites().iterator();
-							if (!iterator.hasNext()) {
-								MenuItem item = new MenuItem(menu, SWT.NONE);
-								item.setText(Messages.actionWebBrowserNoFavorites"));
-							}
-							while (iterator.hasNext()) {
-								final Favorite f = (Favorite) iterator.next();
-								MenuItem item = new MenuItem(menu, SWT.NONE);
-								item.setText(f.getName());
-								item.setImage(ImageResource.getImage(ImageResource.IMG_FAVORITE));
-								item.addSelectionListener(new SelectionAdapter() {
-									public void widgetSelected(SelectionEvent event) {
-										getWebBrowser().setURL(f.getURL());
-									}
-								});
-							}
-							
-							new MenuItem(menu, SWT.SEPARATOR);
-					
-							MenuItem item = new MenuItem(menu, SWT.NONE);
-							item.setText(Messages.actionWebBrowserOrganizeFavorites"));
-							item.addSelectionListener(new SelectionAdapter() {
-								public void widgetSelected(SelectionEvent event) {
-									OrganizeFavoritesDialog dialog = new OrganizeFavoritesDialog(parent.getShell());
-									dialog.open();
-								}
-							});
-							return menu;
-						}
-	   			};
-	   		}
-	   	};
-	   	favorites.setImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_ELCL_NAV_FAVORITES));
-	   	favorites.setHoverImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_CLCL_NAV_FAVORITES));
-	   	favorites.setDisabledImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_DLCL_NAV_FAVORITES));
-	   	favorites.setToolTipText(Messages.actionWebBrowserFavorites"));
-	   	toolBarManager.add(favorites);
-	   	
-	   	back = new Action() {
-	   		public void run() {
-	   			getWebBrowser().back();
-	   		}
-	   	};
-	   	back.setImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_ELCL_NAV_BACKWARD));
-			back.setHoverImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_CLCL_NAV_BACKWARD));
-			back.setDisabledImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_DLCL_NAV_BACKWARD));
-			back.setToolTipText(Messages.actionWebBrowserBack"));
-	   	toolBarManager.add(back);
-	   	
-	   	forward = new Action() {
-	   		public void run() {
-	   			getWebBrowser().forward();
-	   		}
-	   	};
-	   	forward.setImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_ELCL_NAV_FORWARD));
-	   	forward.setHoverImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_CLCL_NAV_FORWARD));
-			forward.setDisabledImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_DLCL_NAV_FORWARD));
-			forward.setToolTipText(Messages.actionWebBrowserForward"));
-	   	toolBarManager.add(forward);
-	   	
-	   	Action stop = new Action() {
-	   		public void run() {
-	   			getWebBrowser().stop();
-	   		}
-	   	};
-	   	stop.setImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_ELCL_NAV_STOP));
-	   	stop.setHoverImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_CLCL_NAV_STOP));
-	   	stop.setDisabledImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_DLCL_NAV_STOP));
-	   	stop.setToolTipText(Messages.actionWebBrowserStop"));
-	   	toolBarManager.add(stop);
-	   	
-	   	Action refresh = new Action() {
-	   		public void run() {
-	   			getWebBrowser().refresh();
-	   		}
-	   	};
-	   	refresh.setImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_ELCL_NAV_REFRESH));
-	   	refresh.setHoverImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_CLCL_NAV_REFRESH));
-	   	refresh.setDisabledImageDescriptor(ImageResource.getImageDescriptor(ImageResource.IMG_DLCL_NAV_REFRESH));
-	   	refresh.setToolTipText(Messages.actionWebBrowserRefresh"));
-	   	toolBarManager.add(refresh);
-   	}*/
-   	
-   	/*toolBarManager.add(new Separator());
-   	
-   	ControlContribution busyCont = new ControlContribution("webbrowser.busy") {
-   	   protected Control createControl(Composite parent) {
-   	   	busy = new BusyIndicator(parent, SWT.NONE);
-   	   	return busy;
-   	   }
-   	};
-   	toolBarManager.add(busyCont);*/
-   }
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserEditorInput.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserEditorInput.java
deleted file mode 100644
index 794a965..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserEditorInput.java
+++ /dev/null
@@ -1,365 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IElementFactory;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-
-/**
- * The editor input for the integrated web browser.
- */
-public class WebBrowserEditorInput implements IEditorInput,
-		IPersistableElement, IElementFactory {
-	// --- constants to pass into constructor ---
-
-	// if used, the toolbar will be available
-	// public static final int SHOW_TOOLBAR = 1 << 1;
-
-	// public static final int SHOW_GLOBAL_TOOLBAR = 1 << 2;
-
-	// if used, the status bar will be available
-	// public static final int SHOW_STATUSBAR = 1 << 2;
-
-	// if used, the original URL will be saved and
-	// the page can reopen to the same URL after
-	// shutting down
-	// public static final int SAVE_URL = 1 << 5;
-
-	// if used, the browser will be transient and will not appear
-	// in the most recently used file list, nor will it reopen after
-	// restarting Eclipse
-	// public static final int TRANSIENT = 1 << 6;
-
-	private static final String ELEMENT_FACTORY_ID = "org.eclipse.ui.browser.elementFactory"; //$NON-NLS-1$
-
-	private static final String MEMENTO_URL = "url"; //$NON-NLS-1$
-
-	private static final String MEMENTO_STYLE = "style"; //$NON-NLS-1$
-
-	private static final String MEMENTO_ID = "id"; //$NON-NLS-1$
-
-	private static final String MEMENTO_NAME = "name"; //$NON-NLS-1$
-
-	private static final String MEMENTO_TOOLTIP = "tooltip"; //$NON-NLS-1$
-
-	private URL url;
-
-	private int style;
-
-	private String id = null;
-
-	private String name;
-
-	private String tooltip;
-
-	/**
-	 * ExternalBrowserInstance editor input for the homepage.
-	 */
-	public WebBrowserEditorInput() {
-		this(null);
-	}
-
-	/**
-	 * WebBrowserEditorInput constructor comment.
-	 */
-	public WebBrowserEditorInput(URL url) {
-		this(url, 0);
-	}
-
-	/**
-	 * WebBrowserEditorInput constructor comment.
-	 */
-	public WebBrowserEditorInput(URL url, int style) {
-		super();
-		this.url = url;
-		this.style = style;
-	}
-
-	/**
-	 * WebBrowserEditorInput constructor comment.
-	 */
-	public WebBrowserEditorInput(URL url, int style, String browserId) {
-		super();
-		this.url = url;
-		this.style = style;
-		this.id = browserId;
-	}
-
-	/**
-	 * WebBrowserEditorInput constructor comment.
-	 */
-	public WebBrowserEditorInput(URL url, boolean b) {
-		this(url);
-	}
-
-	public void setName(String n) {
-		name = n;
-	}
-
-	public void setToolTipText(String t) {
-		tooltip = t;
-	}
-
-	/**
-	 * Returns true if this page can reuse the browser that the given input is
-	 * being displayed in, or false if it should open up in a new page.
-	 * 
-	 * @param input
-	 *            org.eclipse.ui.internal.browser.IWebBrowserEditorInput
-	 * @return boolean
-	 */
-	public boolean canReplaceInput(WebBrowserEditorInput input) {
-		Trace.trace(Trace.FINEST, "canReplaceInput " + this + " " + input); //$NON-NLS-1$ //$NON-NLS-2$
-		// if ((style & FORCE_NEW_PAGE) != 0)
-		// return false;
-		// if (input.isToolbarVisible() != isToolbarVisible())
-		// return false;
-		// else
-		if (input.isStatusbarVisible() != isStatusbarVisible())
-			return false;
-		else if (id != null) {
-			String bid = input.getBrowserId();
-			return id.equals(bid);
-		} else
-			return false;
-	}
-
-	/**
-	 * Creates an <code>IElement</code> from the state captured within an
-	 * <code>IMemento</code>.
-	 * 
-	 * @param memento
-	 *            a memento containing the state for an element
-	 * @return an element, or <code>null</code> if the element could not be
-	 *         created
-	 */
-	public IAdaptable createElement(IMemento memento) {
-		int style = 0;
-		Integer integer = memento.getInteger(MEMENTO_STYLE);
-		if (integer != null) {
-			style = integer.intValue();
-		}
-
-		URL url = null;
-		String str = memento.getString(MEMENTO_URL);
-		if (str != null) {
-			try {
-				url = new URL(str);
-			}
-			catch (MalformedURLException e) {
-				String msg = "Malformed URL while initializing browser editor"; //$NON-NLS-1$
-				WebBrowserUIPlugin.logError(msg, e);
-			}
-		}
-
-		String id = memento.getString(MEMENTO_ID);
-		String name = memento.getString(MEMENTO_NAME);
-		String tooltip = memento.getString(MEMENTO_TOOLTIP);
-		
-		WebBrowserEditorInput input = new WebBrowserEditorInput(url, style, id);
-		input.setName(name);
-		input.setToolTipText(tooltip);
-		return input;
-	}
-
-	/**
-	 * Indicates whether some other object is "equal to" this one. In this case
-	 * it means that the underlying IFolders are equal.
-	 */
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (!(obj instanceof WebBrowserEditorInput))
-			return false;
-		WebBrowserEditorInput other = (WebBrowserEditorInput) obj;
-
-		if (url != null && !url.equals(obj))
-			return false;
-
-		return canReplaceInput(other);
-	}
-
-	/*
-	 * Returns whether the editor input exists.
-	 */
-	public boolean exists() {
-		if ((style & IWorkbenchBrowserSupport.PERSISTENT) != 0)
-			return false;
-
-		return true;
-	}
-
-	/**
-	 * Returns an object which is an instance of the given class associated with
-	 * this object. Returns <code>null</code> if no such object can be found.
-	 * 
-	 * @param adapter
-	 *            the adapter class to look up
-	 * @return a object castable to the given class, or <code>null</code> if
-	 *         this object does not have an adapter for the given class
-	 */
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-	/**
-	 * Returns the ID of an element factory which can be used to recreate this
-	 * object. An element factory extension with this ID must exist within the
-	 * workbench registry.
-	 * 
-	 * @return the element factory ID
-	 */
-	public String getFactoryId() {
-		return ELEMENT_FACTORY_ID;
-	}
-
-	public ImageDescriptor getImageDescriptor() {
-		return ImageResource
-				.getImageDescriptor(ImageResource.IMG_INTERNAL_BROWSER);
-	}
-	
-	/**
-	 * Returns true if the name is locked and cannot be changed.
-	 * 
-	 * @return <code>true</code> if the name of the browser should not change
-	 */
-	protected boolean isNameLocked() {
-		return (name != null);
-	}
-
-	/**
-	 * Returns the name of this editor input for display purposes.
-	 * <p>
-	 * For instance, if the fully qualified input name is
-	 * <code>"a\b\MyFile.gif"</code>, the return value would be just
-	 * <code>"MyFile.gif"</code>.
-	 * 
-	 * @return the file name string
-	 */
-	public String getName() {
-		if (name != null)
-			return name;
-
-		return Messages.viewWebBrowserTitle;
-	}
-
-	/*
-	 * Returns an object that can be used to save the state of this editor
-	 * input. @return the persistable element, or <code>null</code> if this
-	 * editor input cannot be persisted
-	 */
-	public IPersistableElement getPersistable() {
-		if ((style & IWorkbenchBrowserSupport.PERSISTENT) == 0)
-			return null;
-
-		return this;
-	}
-
-	public String getToolTipText() {
-		if (tooltip != null)
-			return tooltip;
-
-		if (url != null)
-			return url.toExternalForm();
-
-		return Messages.viewWebBrowserTitle;
-	}
-
-	/**
-	 * Returns the url.
-	 * 
-	 * @return java.net.URL
-	 */
-	public URL getURL() {
-		return url;
-	}
-
-	/**
-	 * Returns the browser id. Browsers with a set id will always & only be
-	 * replaced by browsers with the same id.
-	 * 
-	 * @return String
-	 */
-	public String getBrowserId() {
-		return id;
-	}
-
-	/**
-	 * Returns true if the status bar should be shown.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isStatusbarVisible() {
-		return (style & IWorkbenchBrowserSupport.STATUS) != 0;
-	}
-
-	/**
-	 * Returns true if the toolbar should be shown.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isLocationBarLocal() {
-		return (style & BrowserViewer.LOCATION_BAR) != 0;
-	}
-
-	/*
-	 * public boolean isLocationBarGlobal() { return (style &
-	 * ExternalBrowserInstance.LOCATION_TOOLBAR) != 0; }
-	 */
-
-	public boolean isToolbarLocal() {
-		return (style & BrowserViewer.BUTTON_BAR) != 0;
-	}
-
-	/*
-	 * public boolean isToolbarGlobal() { return (style &
-	 * ExternalBrowserInstance.BUTTON_TOOLBAR) != 0; }
-	 */
-
-	/**
-	 * Saves the state of an element within a memento.
-	 * 
-	 * @param memento
-	 *            the storage area for element state
-	 */
-	public void saveState(IMemento memento) {
-		memento.putInteger(MEMENTO_STYLE, style);
-		if ((style & IWorkbenchBrowserSupport.PERSISTENT) != 0 && url != null) {
-			memento.putString(MEMENTO_URL, url.toExternalForm());
-		}
-		if (id != null) {
-			memento.putString(MEMENTO_ID, id);
-		}
-		if (name != null) {
-			memento.putString(MEMENTO_NAME, name);
-		}
-		if (tooltip != null) {
-			memento.putString(MEMENTO_TOOLTIP, tooltip);
-		}
-	}
-
-	/**
-	 * Converts this object to a string.
-	 * 
-	 * @return java.lang.String
-	 */
-	public String toString() {
-		return "WebBrowserEditorInput[" + url + " " + style + " " + id + "]";  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserPreference.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserPreference.java
deleted file mode 100644
index e76571d..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserPreference.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.PlatformUI;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * Preferences for the Web browser.
- */
-public class WebBrowserPreference {
-	protected static final String PREF_BROWSER_HISTORY = "webBrowserHistory"; //$NON-NLS-1$
-
-	protected static final String PREF_INTERNAL_WEB_BROWSER_HISTORY = "internalWebBrowserHistory"; //$NON-NLS-1$
-
-	protected static final String PREF_BROWSER_CHOICE = "browser-choice"; //$NON-NLS-1$
-
-	private static final String INTERNAL_BROWSER_ID = "org.eclipse.ui.browser.editor"; //$NON-NLS-1$
-
-	private static final String BROWSER_SUPPORT_ID = "org.eclipse.ui.browser.editorSupport"; //$NON-NLS-1$
-
-	public static final int INTERNAL = 0;
-
-	public static final int EXTERNAL = 1;
-
-	/**
-	 * WebBrowserPreference constructor comment.
-	 */
-	private WebBrowserPreference() {
-		super();
-	}
-
-	/**
-	 * Returns the preference store.
-	 * 
-	 * @return the preference store
-	 */
-	protected static IPreferenceStore getPreferenceStore() {
-		return WebBrowserUIPlugin.getInstance().getPreferenceStore();
-	}
-
-	/**
-	 * Returns the Web browser history list.
-	 * 
-	 * @return java.util.List
-	 */
-	public static List getInternalWebBrowserHistory() {
-		String temp = getPreferenceStore().getString(
-				PREF_INTERNAL_WEB_BROWSER_HISTORY);
-		StringTokenizer st = new StringTokenizer(temp, "|*|"); //$NON-NLS-1$
-		List l = new ArrayList();
-		while (st.hasMoreTokens()) {
-			String s = st.nextToken();
-			l.add(s);
-		}
-		return l;
-	}
-
-	/**
-	 * Sets the Web browser history.
-	 * 
-	 * @param list
-	 *            the history
-	 */
-	public static void setInternalWebBrowserHistory(List list) {
-		StringBuffer sb = new StringBuffer();
-		if (list != null) {
-			Iterator iterator = list.iterator();
-			while (iterator.hasNext()) {
-				String s = (String) iterator.next();
-				sb.append(s);
-				sb.append("|*|"); //$NON-NLS-1$
-			}
-		}
-		InstanceScope instanceScope = new InstanceScope();
-		IEclipsePreferences prefs = instanceScope.getNode(WebBrowserUIPlugin.PLUGIN_ID);
-		prefs.put(PREF_INTERNAL_WEB_BROWSER_HISTORY,
-				sb.toString());
-		try {
-			prefs.flush();
-		} catch (BackingStoreException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * Returns whether the internal browser is used by default
-	 * 
-	 * @return true if the internal browser is used by default
-	 */
-	public static boolean isDefaultUseInternalBrowser() {
-		return WebBrowserUtil.canUseInternalWebBrowser();
-	}
-
-	/**
-	 * Returns whether the system browser is used by default
-	 * 
-	 * @return true if the system browser is used by default
-	 */
-	public static boolean isDefaultUseSystemBrowser() {
-		return WebBrowserUtil.canUseSystemBrowser();
-	}
-
-	/**
-	 * Returns whether the internal or external browser is being used
-	 * 
-	 * @return one of <code>INTERNAL</code> or <code>EXTERNAL</code>.
-	 */
-	public static int getBrowserChoice() {
-		int choice = getPreferenceStore().getInt(PREF_BROWSER_CHOICE);
-		if (choice == 2)
-			return EXTERNAL;
-		if (choice == INTERNAL && !WebBrowserUtil.canUseInternalWebBrowser())
-			return EXTERNAL;
-		return choice;
-	}
-
-	/**
-	 * Sets whether the internal, system and external browser is used
-	 * 
-	 * @param choice
-	 *            </code>INTERNAL</code>, <code>SYSTEM</code> and <code>EXTERNAL</code>
-	 */
-	public static void setBrowserChoice(int choice) {
-		InstanceScope instanceScope = new InstanceScope();
-		IEclipsePreferences prefs = instanceScope.getNode(WebBrowserUIPlugin.PLUGIN_ID);
-		prefs.putInt(PREF_BROWSER_CHOICE, choice);
-		try {
-			prefs.flush();
-		} catch (BackingStoreException e) {
-			e.printStackTrace();
-		}
-		updateDefaultEditor(choice);
-	}
-
-	private static void updateDefaultEditor(int choice) {
-		// Toggle from internal editor to browser support
-		// to avoid confusion between default editors and
-		// Web browser preference page
-		IEditorRegistry registry = PlatformUI.getWorkbench()
-				.getEditorRegistry();
-		String oldId = choice == INTERNAL ? BROWSER_SUPPORT_ID
-				: INTERNAL_BROWSER_ID;
-		String newId = choice == INTERNAL ? INTERNAL_BROWSER_ID
-				: BROWSER_SUPPORT_ID;
-
-		String[][] extensions = { { "a.html", "*.html" }, { "a.htm", "*.htm" }, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-				{ "a.shtml", "*.shtml" } };  //$NON-NLS-1$//$NON-NLS-2$
-
-		// For each default editor that matches the oldId, change
-		// the default editor to the newId
-		for (int i = 0; i < extensions.length; i++) {
-			String[] ext = extensions[i];
-			IEditorDescriptor ddesc = registry.getDefaultEditor(ext[0]);
-			if (ddesc != null && ddesc.getId().equals(oldId)) {
-				registry.setDefaultEditor(ext[1], newId);
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserPreferencePage.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserPreferencePage.java
deleted file mode 100644
index b1a9899..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserPreferencePage.java
+++ /dev/null
@@ -1,610 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-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.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-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.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The preference page that holds Web browser preferences.
- */
-public class WebBrowserPreferencePage extends PreferencePage implements
-		IWorkbenchPreferencePage {
-	protected Button internal;
-
-	protected Button external;
-
-	protected Table table;
-
-	protected CheckboxTableViewer tableViewer;
-
-	protected Button edit;
-
-	protected Button remove;
-
-	protected Button search;
-
-	protected Label location;
-
-	protected Label parameters;
-	
-	protected IBrowserDescriptor checkedBrowser;
-
-	class BrowserContentProvider implements IStructuredContentProvider {
-		public Object[] getElements(Object inputElement) {
-			List list = new ArrayList();
-			Iterator iterator = BrowserManager.getInstance().getWebBrowsers()
-					.iterator();
-			while (iterator.hasNext()) {
-				IBrowserDescriptor browser = (IBrowserDescriptor) iterator
-						.next();
-				list.add(browser);
-			}
-			return list.toArray();
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			// do nothing
-		}
-
-		public void dispose() {
-			// do nothing
-		}
-	}
-
-	class BrowserTableLabelProvider implements ITableLabelProvider {
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			IBrowserDescriptor browser = (IBrowserDescriptor) element;
-			return notNull(browser.getName());
-		}
-
-		protected String notNull(String s) {
-			if (s == null)
-				return ""; //$NON-NLS-1$
-			return s;
-		}
-
-		public boolean isLabelProperty(Object element, String property) {
-			return false;
-		}
-
-		public void addListener(ILabelProviderListener listener) {
-			// do nothing
-		}
-
-		public void removeListener(ILabelProviderListener listener) {
-			// do nothing
-		}
-
-		public void dispose() {
-			// do nothing
-		}
-	}
-
-	/**
-	 * WebBrowserPreferencePage constructor comment.
-	 */
-	public WebBrowserPreferencePage() {
-		super();
-	}
-
-	/**
-	 * Create the preference options.
-	 * 
-	 * @param parent
-	 *            org.eclipse.swt.widgets.Composite
-	 * @return org.eclipse.swt.widgets.Control
-	 */
-	protected Control createContents(Composite parent) {
-		initializeDialogUnits(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
-				ContextIds.PREF_BROWSER);
-
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.horizontalSpacing = convertHorizontalDLUsToPixels(4);
-		layout.verticalSpacing = convertVerticalDLUsToPixels(3);
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		composite.setLayout(layout);
-		GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
-		composite.setLayoutData(data);
-
-		Label label = new Label(composite, SWT.WRAP);
-		label.setText(Messages.preferenceWebBrowserDescription);
-		data = new GridData(SWT.FILL, SWT.NONE, false, false);
-		data.horizontalSpan = 2;
-		data.widthHint = 275;
-		label.setLayoutData(data);
-
-		internal = new Button(composite, SWT.RADIO);
-		internal.setText(Messages.prefInternalBrowser);
-		data = new GridData(SWT.FILL, SWT.NONE, true, false);
-		data.horizontalSpan = 2;
-		internal.setLayoutData(data);
-
-		if (!WebBrowserUtil.canUseInternalWebBrowser())
-			internal.setEnabled(false);
-
-		external = new Button(composite, SWT.RADIO);
-		external.setText(Messages.prefExternalBrowser);
-		data = new GridData(SWT.FILL, SWT.NONE, true, false);
-		data.horizontalSpan = 2;
-		external.setLayoutData(data);
-
-		label = new Label(composite, SWT.NONE);
-		label.setText(Messages.browserList);
-		data = new GridData(SWT.FILL, SWT.CENTER, true, false);
-		data.horizontalSpan = 2;
-		label.setLayoutData(data);
-
-		table = new Table(composite, SWT.CHECK | SWT.BORDER | SWT.V_SCROLL
-				| SWT.H_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION);
-		data = new GridData(SWT.FILL, SWT.FILL, true, true);
-		table.setLayoutData(data);
-		table.setHeaderVisible(false);
-		table.setLinesVisible(false);
-
-		TableLayout tableLayout = new TableLayout();
-		new TableColumn(table, SWT.NONE);
-		tableLayout.addColumnData(new ColumnWeightData(100));
-		table.setLayout(tableLayout);
-
-		tableViewer = new CheckboxTableViewer(table);
-		tableViewer.setContentProvider(new BrowserContentProvider());
-		tableViewer.setLabelProvider(new BrowserTableLabelProvider());
-		tableViewer.setInput("root"); //$NON-NLS-1$
-
-		// uncheck any other elements that might be checked and leave only the
-		// element checked to remain checked since one can only chose one
-		// brower at a time to be current.
-		tableViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent e) {
-				checkNewDefaultBrowser(e.getElement());
-				checkedBrowser = (IBrowserDescriptor) e.getElement();
-				
-				// if no other browsers are checked, don't allow the single one
-				// currently checked to become unchecked, and lose a current
-				// browser. That is, don't permit unchecking if no other item
-				// is checked which is supposed to be the case.
-				Object[] obj = tableViewer.getCheckedElements();
-				if (obj.length == 0)
-					tableViewer.setChecked(e.getElement(), true);
-			}
-		});
-
-		// set a default, checked browser based on the current browser. If there
-		// is not a current browser, but the first item exists, use that instead.
-		// This will work currently until workbench shutdown, because current
-		// browser is not yet persisted.
-		checkedBrowser = BrowserManager.getInstance().getCurrentWebBrowser();
-		if (checkedBrowser != null)
-			tableViewer.setChecked(checkedBrowser, true);
-		else {
-			Object obj = tableViewer.getElementAt(0);
-			if (obj != null)
-				tableViewer.setChecked(obj, true);
-		}
-
-		tableViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						IStructuredSelection sele = ((IStructuredSelection) tableViewer
-								.getSelection());
-						boolean sel = sele.getFirstElement() != null &&
-								!(sele.getFirstElement() instanceof SystemBrowserDescriptor);
-						remove.setEnabled(sel);
-						edit.setEnabled(sel);
-					}
-				});
-
-		tableViewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				IStructuredSelection sel = ((IStructuredSelection) tableViewer
-						.getSelection());
-				Object firstElem = sel.getFirstElement();
-				if (firstElem != null && !(firstElem instanceof SystemBrowserDescriptor)) {
-					IBrowserDescriptor browser2 = (IBrowserDescriptor) sel
-							.getFirstElement();
-					IBrowserDescriptorWorkingCopy wc = browser2
-							.getWorkingCopy();
-					BrowserDescriptorDialog dialog = new BrowserDescriptorDialog(
-							getShell(), wc);
-					if (dialog.open() != Window.CANCEL) {
-						try {
-							tableViewer.refresh(wc.save());
-						} catch (Exception ex) {
-							// ignore
-						}
-					}
-				}
-			}
-		});
-
-		table.addKeyListener(new KeyListener() {
-			public void keyPressed(KeyEvent e) {
-				if (e.character == SWT.DEL) {
-					IStructuredSelection sel = ((IStructuredSelection) tableViewer
-							.getSelection());
-					if (sel.getFirstElement() != null) {
-						IBrowserDescriptor browser2 = (IBrowserDescriptor) sel
-								.getFirstElement();
-						try {
-							browser2.delete();
-							tableViewer.remove(browser2);
-
-							// need here to ensure that if the item deleted was
-							// checked, ie. was
-							// the current browser, that the new current browser
-							// will be the first in the
-							// list, typically, the internal browser, which
-							// cannot be
-							// deleted, and be current
-							BrowserManager manager = BrowserManager.getInstance();
-							if (browser2 == checkedBrowser) {
-								if (manager.browsers.size() > 0) {
-									checkedBrowser = (IBrowserDescriptor) manager.browsers.get(0);
-									tableViewer.setChecked(checkedBrowser, true);
-								}
-							}
-						} catch (Exception ex) {
-							// ignore
-						}
-					}
-				}
-			}
-
-			public void keyReleased(KeyEvent e) {
-				// ignore
-			}
-		});
-
-		Composite buttonComp = new Composite(composite, SWT.NONE);
-		layout = new GridLayout();
-		layout.horizontalSpacing = 0;
-		layout.verticalSpacing = convertVerticalDLUsToPixels(3);
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		layout.numColumns = 1;
-		buttonComp.setLayout(layout);
-		data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.VERTICAL_ALIGN_FILL);
-		buttonComp.setLayoutData(data);
-
-		final Button add = SWTUtil.createButton(buttonComp, Messages.add);
-		add.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				BrowserDescriptorDialog dialog = new BrowserDescriptorDialog(
-						getShell());
-				if (dialog.open() == Window.CANCEL)
-					return;
-				tableViewer.refresh();
-				if (checkedBrowser != null)
-					tableViewer.setChecked(checkedBrowser, true);
-			}
-		});
-
-		edit = SWTUtil.createButton(buttonComp, Messages.edit);
-		edit.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection sel = ((IStructuredSelection) tableViewer
-						.getSelection());
-				IBrowserDescriptor browser2 = (IBrowserDescriptor) sel
-						.getFirstElement();
-				IBrowserDescriptorWorkingCopy wc = browser2.getWorkingCopy();
-				BrowserDescriptorDialog dialog = new BrowserDescriptorDialog(
-						getShell(), wc);
-				if (dialog.open() != Window.CANCEL) {
-					try {
-						tableViewer.refresh(wc.save());
-					} catch (Exception ex) {
-						// ignore
-					}
-				}
-			}
-		});
-
-		remove = SWTUtil.createButton(buttonComp, Messages.remove);
-		remove.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection sel = ((IStructuredSelection) tableViewer
-						.getSelection());
-				IBrowserDescriptor browser2 = (IBrowserDescriptor) sel
-						.getFirstElement();
-				try {
-					browser2.delete();
-					tableViewer.remove(browser2);
-
-					// need here to ensure that if the item deleted was checked,
-					// ie. was
-					// the current browser, that the new current browser will be
-					// the first in the
-					// list, typically, the internal browser, which cannot be
-					// deleted, and be current
-					BrowserManager manager = BrowserManager.getInstance();
-					if (browser2 == checkedBrowser) {
-						if (manager.browsers.size() > 0) {
-							checkedBrowser = (IBrowserDescriptor) manager.browsers.get(0);
-							tableViewer.setChecked(checkedBrowser, true);
-						}
-					}
-				} catch (Exception ex) {
-					// ignore
-				}
-			}
-		});
-
-		search = SWTUtil.createButton(buttonComp, Messages.search);
-		data = (GridData) search.getLayoutData();
-		data.verticalIndent = 9;
-		search.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				final List foundBrowsers = new ArrayList();
-				final List existingPaths = WebBrowserUtil
-						.getExternalBrowserPaths();
-
-				// select a target directory for the search
-				DirectoryDialog dialog = new DirectoryDialog(getShell());
-				dialog.setMessage(Messages.selectDirectory);
-				dialog.setText(Messages.directoryDialogTitle);
-
-				String path = dialog.open();
-				if (path == null)
-					return;
-
-				final File rootDir = new File(path);
-				ProgressMonitorDialog pm = new ProgressMonitorDialog(getShell());
-
-				IRunnableWithProgress r = new IRunnableWithProgress() {
-					public void run(IProgressMonitor monitor) {
-						monitor.beginTask(Messages.searchingTaskName,
-								IProgressMonitor.UNKNOWN);
-						search(rootDir, existingPaths, foundBrowsers, monitor);
-						monitor.done();
-					}
-				};
-
-				try {
-					pm.run(true, true, r);
-				} catch (InvocationTargetException ex) {
-					Trace.trace(Trace.SEVERE,
-							"Invocation Exception occured running monitor: " //$NON-NLS-1$
-									+ ex);
-				} catch (InterruptedException ex) {
-					Trace.trace(Trace.SEVERE,
-							"Interrupted exception occured running monitor: " //$NON-NLS-1$
-									+ ex);
-					return;
-				}
-
-				if (pm.getProgressMonitor().isCanceled())
-					return;
-
-				List browsersToCreate = foundBrowsers;
-
-				if (browsersToCreate == null) // cancelled
-					return;
-
-				if (browsersToCreate.isEmpty()) { // no browsers found
-					WebBrowserUtil.openMessage(Messages.searchingNoneFound);
-					return;
-				}
-
-				Iterator iterator = browsersToCreate.iterator();
-				while (iterator.hasNext()) {
-					IBrowserDescriptorWorkingCopy browser2 = (IBrowserDescriptorWorkingCopy) iterator
-							.next();
-					browser2.save();
-				}
-				tableViewer.refresh();
-				
-				if (checkedBrowser != null)
-					tableViewer.setChecked(checkedBrowser, true);
-			}
-		});
-
-		tableViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent e) {
-				checkNewDefaultBrowser(e.getElement());
-				checkedBrowser = (IBrowserDescriptor) e
-						.getElement();
-			}
-		});
-
-		/*external.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				boolean sel = !tableViewer.getSelection().isEmpty();
-				edit.setEnabled(sel);
-				remove.setEnabled(sel);
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				// ignore
-			}
-		});*/
-		internal.setSelection(WebBrowserPreference.getBrowserChoice() == WebBrowserPreference.INTERNAL);
-		external.setSelection(WebBrowserPreference.getBrowserChoice() == WebBrowserPreference.EXTERNAL);
-
-		//boolean sel = !tableViewer.getSelection().isEmpty();
-		IStructuredSelection sele = ((IStructuredSelection) tableViewer
-				.getSelection());
-		boolean sel = sele.getFirstElement() != null &&
-				!(sele.getFirstElement() instanceof SystemBrowserDescriptor);
-		edit.setEnabled(sel);
-		remove.setEnabled(sel);
-
-		Dialog.applyDialogFont(composite);
-
-		return composite;
-	}
-
-	/**
-	 * Initializes this preference page using the passed workbench.
-	 * 
-	 * @param workbench
-	 *            the current workbench
-	 */
-	public void init(IWorkbench workbench) {
-		// do nothing
-	}
-
-	/**
-	 * 
-	 */
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		if (visible)
-			setTitle(Messages.preferenceWebBrowserTitle);
-	}
-
-	protected Object getSelection(ISelection sel2) {
-		IStructuredSelection sel = (IStructuredSelection) sel2;
-		return sel.getFirstElement();
-	}
-
-	// Uncheck all the items except the current one that was just checked
-	protected void checkNewDefaultBrowser(Object browser) {
-		TableItem[] children = tableViewer.getTable().getItems();
-		for (int i = 0; i < children.length; i++) {
-			TableItem item = children[i];
-
-			if (!(item.getData().equals(browser)))
-				item.setChecked(false);
-		}
-	}
-
-	protected static void search(File directory, List existingPaths,
-			List foundBrowsers, IProgressMonitor monitor) {
-		if (monitor.isCanceled())
-			return;
-
-		monitor.subTask(NLS.bind(Messages.searching,
-				new String[] { Integer.toString(foundBrowsers.size()), directory.getAbsolutePath()}));
-		
-		String[] names = directory.list();
-		List subDirs = new ArrayList();
-
-		for (int i = 0; i < names.length; i++) {
-			if (monitor.isCanceled())
-				return;
-
-			File file = new File(directory, names[i]);
-
-			if (existingPaths.contains(file.getAbsolutePath().toLowerCase()))
-				continue;
-
-			IBrowserDescriptorWorkingCopy wc = WebBrowserUtil
-					.createExternalBrowser(file);
-			if (wc != null)
-				foundBrowsers.add(wc);
-			
-			if (file.isDirectory()) {
-				if (monitor.isCanceled())
-					return;
-				subDirs.add(file);
-			}
-		}
-		while (!subDirs.isEmpty()) {
-			File subDir = (File) subDirs.remove(0);
-			search(subDir, existingPaths, foundBrowsers, monitor);
-			if (monitor.isCanceled()) {
-				return;
-			}
-		}
-	}
-
-	/**
-	 * Performs special processing when this page's Defaults button has been
-	 * pressed.
-	 */
-	protected void performDefaults() {
-		internal.setSelection(WebBrowserPreference
-				.isDefaultUseInternalBrowser());
-		external.setSelection(!WebBrowserPreference.
-				isDefaultUseInternalBrowser());
-		
-		BrowserManager.getInstance().currentBrowser = null;
-		BrowserManager.getInstance().setupDefaultBrowsers();
-		tableViewer.refresh();
-		
-		checkedBrowser = BrowserManager.getInstance().getCurrentWebBrowser();
-		if (checkedBrowser != null)
-			tableViewer.setChecked(checkedBrowser, true);
-		
-		super.performDefaults();
-	}
-
-	/**
-	 * Method declared on IPreferencePage. Subclasses should override
-	 */
-	public boolean performOk() {
-		int choice;
-		if (internal.getSelection())
-			choice = WebBrowserPreference.INTERNAL;
-		else
-			choice = WebBrowserPreference.EXTERNAL;
-		WebBrowserPreference.setBrowserChoice(choice);
-		if (checkedBrowser != null)
-			BrowserManager.getInstance().setCurrentWebBrowser(checkedBrowser);
-
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserUIPlugin.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserUIPlugin.java
deleted file mode 100644
index 79a969b..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserUIPlugin.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-/**
- * The main web browser plugin class.
- */
-public class WebBrowserUIPlugin extends AbstractUIPlugin {
-	// Web browser plugin id
-	public static final String PLUGIN_ID = "org.eclipse.ui.browser"; //$NON-NLS-1$
-
-	// singleton instance of this class
-	private static WebBrowserUIPlugin singleton;
-	
-	// cached copy of all browsers
-	private static List browsers;
-
-	/**
-	 * Create the WebBrowserUIPlugin
-	 */
-	public WebBrowserUIPlugin() {
-		super();
-		singleton = this;
-	}
-
-	/**
-	 * Returns the singleton instance of this plugin.
-	 *
-	 * @return org.eclipse.ui.internal.browser.WebBrowserPlugin
-	 */
-	public static WebBrowserUIPlugin getInstance() {
-		return singleton;
-	}
-
-	/**
-	 * Shuts down this plug-in and saves all plug-in state.
-	 *
-	 * @exception Exception
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		BrowserManager.safeDispose();
-	}
-	
-	/**
-	 * Returns an array of all known browers.
-	 * <p>
-	 * A new array is returned on each call, so clients may store or modify the result.
-	 * </p>
-	 * 
-	 * @return a possibly-empty array of browser instances {@link IClient}
-	 */
-	public static IBrowserExt[] getBrowsers() {
-		if (browsers == null)
-			loadBrowsers();
-		IBrowserExt[] c = new IBrowserExt[browsers.size()];
-		browsers.toArray(c);
-		return c;
-	}
-	
-	public static IBrowserExt findBrowsers(String executable) {
-		IBrowserExt[] browsers2 = getBrowsers();
-		if (browsers2 == null || executable == null)
-			return null;
-		
-		int ind1 = executable.lastIndexOf("/"); //$NON-NLS-1$
-		int ind2 = executable.lastIndexOf("\\"); //$NON-NLS-1$
-		if (ind2 > ind1)
-			ind1 = ind2;
-		executable = executable.substring(ind1 + 1);
-		
-		String os = Platform.getOS();
-		int size = browsers2.length;
-		for (int i = 0; i < size; i++) {
-			if (browsers2[i].getOS().toLowerCase().indexOf(os) != -1) {
-				if (browsers2[i].isAvailable()) {
-					String executable2 = browsers2[i].getExecutable();
-					if (executable.startsWith(executable2))
-						return browsers2[i];
-				}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Load the browsers extension point.
-	 */
-	private static synchronized void loadBrowsers() {
-		if (browsers != null)
-			return;
-		Trace.trace(Trace.CONFIG, "->- Loading .browsers extension point ->-"); //$NON-NLS-1$
-		IExtensionRegistry registry = Platform.getExtensionRegistry();
-		IConfigurationElement[] cf = registry.getConfigurationElementsFor(PLUGIN_ID, "browsers"); //$NON-NLS-1$
-
-		int size = cf.length;
-		browsers = new ArrayList(size);
-		for (int i = 0; i < size; i++) {
-			try {
-				browsers.add(new BrowserExt(cf[i]));
-				Trace.trace(Trace.CONFIG, "  Loaded browser: " + cf[i].getAttribute("id")); //$NON-NLS-1$ //$NON-NLS-2$
-			} catch (Throwable t) {
-				Trace.trace(Trace.SEVERE, "  Could not load browser: " + cf[i].getAttribute("id"), t); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-		Trace.trace(Trace.CONFIG, "-<- Done loading .browsers extension point -<-"); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Logs an Error message with an exception. Note that the message should
-	 * already be localized to proper locale. ie: Resources.getString() should
-	 * already have been called
-	 */
-	public static synchronized void logError(String message, Throwable ex) {
-		if (message == null)
-			message = ""; //$NON-NLS-1$
-		Status errorStatus = new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK,
-				message, ex);
-		WebBrowserUIPlugin.getInstance().getLog().log(errorStatus);
-	}
-
-	/**
-	 * Logs a Warning message with an exception. Note that the message should
-	 * already be localized to proper local. ie: Resources.getString() should
-	 * already have been called
-	 */
-	/*public static synchronized void logWarning(String message) {
-		if (WebBrowserUIPlugin.DEBUG) {
-			if (message == null)
-				message = ""; //$NON-NLS-1$
-			Status warningStatus = new Status(IStatus.WARNING, PLUGIN_ID,
-					IStatus.OK, message, null);
-			WebBrowserUIPlugin.getInstance().getLog().log(warningStatus);
-		}
-	}*/
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserUtil.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserUtil.java
deleted file mode 100644
index 9929039..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserUtil.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.swt.program.Program;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.ui.PlatformUI;
-/**
- * Utility class for the Web browser tools.
- */
-public class WebBrowserUtil {
-	private static final String BROWSER_PACKAGE_NAME = "org.eclipse.swt.browser.Browser"; //$NON-NLS-1$
-
-	public static Boolean isInternalBrowserOperational;
-
-	private static final char STYLE_SEP = '-';
-
-	private static final int DEFAULT_STYLE = BrowserViewer.BUTTON_BAR
-			| BrowserViewer.LOCATION_BAR;
-
-	/**
-	 * WebBrowserUtil constructor comment.
-	 */
-	public WebBrowserUtil() {
-		super();
-	}
-
-	/**
-	 * Returns true if we're running on Windows.
-	 * 
-	 * @return boolean
-	 */
-	public static boolean isWindows() {
-		String os = System.getProperty("os.name"); //$NON-NLS-1$
-		if (os != null && os.toLowerCase().indexOf("win") >= 0) //$NON-NLS-1$
-			return true;
-		return false;
-	}
-
-	/**
-	 * Returns true if we're running on linux.
-	 * 
-	 * @return boolean
-	 */
-	public static boolean isLinux() {
-		String os = System.getProperty("os.name"); //$NON-NLS-1$
-		if (os != null && os.toLowerCase().indexOf("lin") >= 0) //$NON-NLS-1$
-			return true;
-		return false;
-	}
-
-	/**
-	 * Open a dialog window.
-	 * 
-	 * @param message
-	 *            java.lang.String
-	 */
-	public static void openError(String message) {
-		Display d = Display.getCurrent();
-		if (d == null)
-			d = Display.getDefault();
-
-		Shell shell = d.getActiveShell();
-		MessageDialog.openError(shell, Messages.errorDialogTitle, message);
-	}
-
-	/**
-	 * Open a dialog window.
-	 * 
-	 * @param message
-	 *            java.lang.String
-	 */
-	public static void openMessage(String message) {
-		Display d = Display.getCurrent();
-		if (d == null)
-			d = Display.getDefault();
-
-		Shell shell = d.getActiveShell();
-		MessageDialog.openInformation(shell, Messages.searchingTaskName,
-				message);
-	}
-
-	/**
-	 * Returns whether it should be possible to use the internal browser or not,
-	 * based on whether or not the org.eclipse.swt.Browser class can be
-	 * found/loaded. If it can it means is is supported on the platform in which
-	 * this plugin is running. If not, disable the ability to use the internal
-	 * browser. This method checks to see if it can new up a new
-	 * ExternalBrowserInstance. If the SWT widget can not be bound to the
-	 * particular operating system it throws an SWTException. We catch that and
-	 * set a boolean flag which represents whether or not we were successfully
-	 * able to create a ExternalBrowserInstance instance or not. If not, don't
-	 * bother adding the Internal Web ExternalBrowserInstance that uses this
-	 * widget. Designed to be attemped only once and the flag set used
-	 * throughout.
-	 * 
-	 * @return boolean
-	 */
-	public static boolean canUseInternalWebBrowser() {
-		// if we have already figured this out, don't do it again.
-		if (isInternalBrowserOperational != null)
-			return isInternalBrowserOperational.booleanValue();
-
-		// check for the class
-		try {
-			Class.forName(BROWSER_PACKAGE_NAME);
-		} catch (ClassNotFoundException e) {
-			isInternalBrowserOperational = new Boolean(false);
-			return false;
-		}
-
-		// try loading it
-		Shell shell = null;
-		try {
-			shell = new Shell(PlatformUI.getWorkbench().getDisplay());
-			new Browser(shell, SWT.NONE);
-			isInternalBrowserOperational = new Boolean(true);
-			return true;
-		} catch (Throwable t) {
-			WebBrowserUIPlugin.getInstance().getLog().log(
-					new Status(IStatus.WARNING, WebBrowserUIPlugin.PLUGIN_ID,
-							0, "Internal browser is not available: " + t.getMessage(), null)); //$NON-NLS-1$
-			isInternalBrowserOperational = new Boolean(false);
-			return false;
-		} finally {
-			if (shell != null)
-				shell.dispose();
-		}
-	}
-
-	public static boolean canUseSystemBrowser() {
-		// Disabling system browser on Solaris due to bug 94497
-		if (Platform.OS_SOLARIS.equals(Platform.getOS()))
-			return false;
-		return Program.findProgram("html") != null; //$NON-NLS-1$
-	}
-
-	public static List getExternalBrowserPaths() {
-		List paths = new ArrayList();
-		Iterator iterator = BrowserManager.getInstance().getWebBrowsers()
-				.iterator();
-		while (iterator.hasNext()) {
-			IBrowserDescriptor wb = (IBrowserDescriptor) iterator.next();
-			if (wb != null && wb.getLocation() != null)
-				paths.add(wb.getLocation().toLowerCase());
-		}
-		return paths;
-	}
-
-	/**
-	 * Add any supported EXTERNAL web browsers found after an arbitrary check in
-	 * specific paths
-	 */
-	public static void addFoundBrowsers(List list) {
-		List paths = getExternalBrowserPaths();
-
-		String os = Platform.getOS();
-		File[] roots = getUsableDrives(File.listRoots());
-		int rootSize = roots.length;
-
-		// Math.min(roots.length, 2); // just check the first two drives
-
-		IBrowserExt[] browsers = WebBrowserUIPlugin.getBrowsers();
-		int size = browsers.length;
-		for (int i = 0; i < size; i++) {
-			if (browsers[i].getDefaultLocations() != null
-					&& browsers[i].getOS().toLowerCase().indexOf(os) >= 0) {
-				for (int k = 0; k < rootSize; k++) {
-					int size2 = browsers[i].getDefaultLocations().length;
-					for (int j = 0; j < size2; j++) {
-						String location = browsers[i].getDefaultLocations()[j];
-						try {
-							File f = new File(roots[k], location);
-							if (!paths.contains(f.getAbsolutePath()
-									.toLowerCase())) {
-								if (f.exists()) {
-									BrowserDescriptor browser = new BrowserDescriptor();
-									browser.name = browsers[i].getName();
-									browser.location = f.getAbsolutePath();
-									browser.parameters = browsers[i]
-											.getParameters();
-									list.add(browser);
-									j += size2;
-								}
-							}
-						} catch (Exception e) {
-							// ignore
-						}
-					}
-				}
-			}
-		}
-	}
-
-	private static File[] getUsableDrives(File[] roots) {
-		if (!Platform.getOS().equals(Platform.OS_WIN32))
-			return roots;
-		ArrayList list = new ArrayList();
-		for (int i = 0; i < roots.length; i++) {
-			String path = roots[i].getAbsolutePath();
-			if (path != null
-					&& (path.toLowerCase().startsWith("a:") || path.toLowerCase().startsWith("b:"))) //$NON-NLS-1$ //$NON-NLS-2$
-				continue;
-			list.add(roots[i]);
-		}
-		return (File[]) list.toArray(new File[list.size()]);
-	}
-
-	/**
-	 * Create an external Web browser if the file matches the default (known)
-	 * browsers.
-	 * 
-	 * @param file
-	 * @return an external browser working copy
-	 */
-	public static IBrowserDescriptorWorkingCopy createExternalBrowser(File file) {
-		if (file == null || !file.isFile())
-			return null;
-
-		String executable = file.getName();
-		IBrowserExt[] browsers = WebBrowserUIPlugin.getBrowsers();
-		int size = browsers.length;
-		for (int i = 0; i < size; i++) {
-			if (executable.equals(browsers[i].getExecutable())) {
-				IBrowserDescriptorWorkingCopy browser = BrowserManager
-						.getInstance().createExternalWebBrowser();
-				browser.setName(browsers[i].getName());
-				browser.setLocation(file.getAbsolutePath());
-				browser.setParameters(browsers[i].getParameters());
-				return browser;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * Encodes browser style in the secondary id as id-style
-	 * 
-	 * @param browserId
-	 * @param style
-	 * @return secondaryId
-	 */
-	public static String encodeStyle(String browserId, int style) {
-		return browserId + STYLE_SEP + style;
-	}
-
-	/**
-	 * Decodes secondary id into a browser style.
-	 * 
-	 * @param secondaryId
-	 * @return style
-	 */
-	public static int decodeStyle(String secondaryId) {
-		if (secondaryId != null) {
-			int sep = secondaryId.lastIndexOf(STYLE_SEP);
-			if (sep != -1) {
-				String stoken = secondaryId.substring(sep + 1);
-				try {
-					return Integer.parseInt(stoken);
-				} catch (NumberFormatException e) {
-					// ignore
-				}
-			}
-		}
-		return DEFAULT_STYLE;
-	}
-
-	public static String decodeId(String encodedId) {
-		int sep = encodedId.lastIndexOf(STYLE_SEP);
-		if (sep != -1) {
-			return encodedId.substring(0, sep);
-		}
-		return encodedId;
-	}
-	
-	public static String createParameterString(String parameters, String urlText) {
-		String params = parameters;
-		String url = urlText;
-		if (url == null) {
-			url = ""; //$NON-NLS-1$
-		}
-		if (params == null)
-			params = ""; //$NON-NLS-1$
-
-		int urlIndex = params.indexOf(IBrowserDescriptor.URL_PARAMETER);
-		if (urlIndex >= 0)
-			params = params.substring(0, urlIndex)
-					+ url
-					+ params.substring(urlIndex
-							+ IBrowserDescriptor.URL_PARAMETER.length());
-		else {
-			if (params.length() != 0 && !params.endsWith(" ")) //$NON-NLS-1$
-				params += " "; //$NON-NLS-1$ 
-			params += url;
-		}
-		return params;
-
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserView.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserView.java
deleted file mode 100644
index 39617fc..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserView.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTarget;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-import org.eclipse.ui.part.ISetSelectionTarget;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * A Web browser viewer.
- */
-public class WebBrowserView extends ViewPart implements
-		IBrowserViewerContainer, ISetSelectionTarget {
-	public static final String WEB_BROWSER_VIEW_ID = "org.eclipse.ui.browser.view"; //$NON-NLS-1$
-
-	protected BrowserViewer viewer;
-
-	protected ISelectionListener listener;
-
-	public void createPartControl(Composite parent) {
-		int style = WebBrowserUtil.decodeStyle(getViewSite().getSecondaryId());
-		viewer = new BrowserViewer(parent, style);
-		viewer.setContainer(this);
-
-		/*
-		 * PropertyChangeListener propertyChangeListener = new
-		 * PropertyChangeListener() { public void
-		 * propertyChange(PropertyChangeEvent event) { if
-		 * (BrowserViewer.PROPERTY_TITLE.equals(event.getPropertyName())) {
-		 * setPartName((String) event.getNewValue()); } } };
-		 * viewer.addPropertyChangeListener(propertyChangeListener);
-		 */
-		initDragAndDrop();
-	}
-
-	public void dispose() {
-		if (viewer!=null)
-			viewer.setContainer(null);
-		if (listener != null)
-			removeSelectionListener();
-	}
-
-	public void setURL(String url) {
-		if (viewer != null)
-			viewer.setURL(url);
-	}
-
-	public void setFocus() {
-		viewer.setFocus();
-	}
-
-	public boolean close() {
-		try {
-			getSite().getPage().hideView(this);
-			return true;
-		} catch (Exception e) {
-			return false;
-		}
-	}
-
-	public IActionBars getActionBars() {
-		return getViewSite().getActionBars();
-	}
-
-	public void openInExternalBrowser(String url) {
-		try {
-			URL theURL = new URL(url);
-			IWorkbenchBrowserSupport support = PlatformUI.getWorkbench()
-					.getBrowserSupport();
-			support.getExternalBrowser().openURL(theURL);
-		} catch (MalformedURLException e) {
-			// TODO handle this
-		} catch (PartInitException e) {
-			// TODO handle this
-		}
-	}
-
-	public void addSelectionListener() {
-		if (listener != null)
-			return;
-
-		listener = new ISelectionListener() {
-			public void selectionChanged(IWorkbenchPart part,
-					ISelection selection) {
-				onSelectionChange(selection);
-			}
-		};
-		getSite().getWorkbenchWindow().getSelectionService()
-				.addPostSelectionListener(listener);
-	}
-	
-	private void onSelectionChange(ISelection selection) {
-		if (!(selection instanceof IStructuredSelection))
-			return;
-		IStructuredSelection sel = (IStructuredSelection) selection;
-		Object obj = sel.getFirstElement();
-		if (obj instanceof IAdaptable) {
-			IAdaptable adapt = (IAdaptable) obj;
-			URL url = getURLFromAdaptable(adapt);
-			if (url!=null)
-				setURL(url.toExternalForm());
-		}
-	}
-	
-	private URL getURLFromAdaptable(IAdaptable adapt) {
-		// test for path
-		IPath path = (IPath) adapt.getAdapter(IPath.class);
-		if (path != null) {
-			File file = path.toFile();
-			if (file.exists() && isWebFile(file.getName()))
-				try {
-					return file.toURL();
-				} catch (MalformedURLException e) {
-					return null;
-				}
-		}
-		return (URL)adapt.getAdapter(URL.class);
-	}
-
-	public void removeSelectionListener() {
-		if (listener == null)
-			return;
-		getSite().getWorkbenchWindow().getSelectionService()
-				.removePostSelectionListener(listener);
-		listener = null;
-	}
-
-	/**
-	 * Return true if the filename has a "web" extension.
-	 * 
-	 * @param name
-	 * @return
-	 */
-	protected boolean isWebFile(String name) {
-		return name.endsWith("html") || name.endsWith("htm") || name.endsWith("gif") || //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				name.endsWith("jpg"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Adds drag and drop support to the view.
-	 */
-	protected void initDragAndDrop() {
-		Transfer[] transfers = new Transfer[] {
-		// LocalSelectionTransfer.getInstance(),
-		// ResourceTransfer.getInstance(),
-		FileTransfer.getInstance() };
-
-		DropTarget dropTarget = new DropTarget(viewer, DND.DROP_COPY
-				| DND.DROP_DEFAULT);
-		dropTarget.setTransfer(transfers);
-		dropTarget.addDropListener(new WebBrowserViewDropAdapter(viewer));
-	}
-
-	public void selectReveal(ISelection selection) {
-		onSelectionChange(selection);
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserViewDropAdapter.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserViewDropAdapter.java
deleted file mode 100644
index 8a535a3..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/WebBrowserViewDropAdapter.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser;
-
-import java.io.File;
-
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetAdapter;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.dnd.TransferData;
-/**
- *
- */
-public class WebBrowserViewDropAdapter extends DropTargetAdapter {
-   /**
-    * The view to which this drop support has been added.
-    */
-   private BrowserViewer view;
-
-   /**
-    * The current operation.
-    */
-   private int currentOperation = DND.DROP_NONE;
-
-   /**
-    * The last valid operation.
-    */
-   private int lastValidOperation = DND.DROP_NONE;
-   
-   protected WebBrowserViewDropAdapter(BrowserViewer view) {
-		this.view = view;
-	}
-
-   /* (non-Javadoc)
-    * Method declared on DropTargetAdapter.
-    * The mouse has moved over the drop target.  If the
-    * target item has changed, notify the action and check
-    * that it is still enabled.
-    */
-   private void doDropValidation(DropTargetEvent event) {
-       //update last valid operation
-       if (event.detail != DND.DROP_NONE)
-           lastValidOperation = event.detail;
-       
-       //valid drop and set event detail accordingly
-       if (validateDrop(event.detail, event.currentDataType))
-           currentOperation = lastValidOperation;
-       else
-           currentOperation = DND.DROP_NONE;
-       
-       event.detail = currentOperation;
-   }
-
-   /* (non-Javadoc)
-    * Method declared on DropTargetAdapter.
-    * The drop operation has changed, see if the action
-    * should still be enabled.
-    */
-   public void dragOperationChanged(DropTargetEvent event) {
-       doDropValidation(event);
-   }
-
-   /* (non-Javadoc)
-    * Method declared on DropTargetAdapter.
-    * The mouse has moved over the drop target.  If the
-    * target item has changed, notify the action and check
-    * that it is still enabled.
-    */
-   public void dragOver(DropTargetEvent event) {
-       //set the location feedback
-   	 event.feedback = DND.FEEDBACK_SELECT;
-
-       //see if anything has really changed before doing validation.
-       doDropValidation(event);
-   }
-
-   /* (non-Javadoc)
-    * Method declared on DropTargetAdapter.
-    * The user has dropped something on the desktop viewer.
-    */
-   public void drop(DropTargetEvent event) {
-       //perform the drop behaviour
-       if (!performDrop(event.data))
-           event.detail = DND.DROP_NONE;
-       
-       currentOperation = event.detail;
-   }
-
-   /* (non-Javadoc)
-    * Method declared on DropTargetAdapter.
-    * Last chance for the action to disable itself
-    */
-   public void dropAccept(DropTargetEvent event) {
-       if (!validateDrop(event.detail, event.currentDataType))
-           event.detail = DND.DROP_NONE;
-   }
-
-	public void dragEnter(DropTargetEvent event) {
-		if (event.detail == DND.DROP_DEFAULT)
-			event.detail = DND.DROP_COPY;
-
-       doDropValidation(event);
-	}
-
-	/**
-    * Performs any work associated with the drop.
-    * <p>
-    * Subclasses must implement this method to provide drop behavior.
-    * </p>
-    *
-    * @param data the drop data
-    * @return <code>true</code> if the drop was successful, and 
-    *   <code>false</code> otherwise
-    */
-	protected boolean performDrop(Object data) {
-		if (data instanceof String[]) {
-			String[] s = (String[]) data;
-			if (s == null || s.length == 0)
-				return true;
-			File f = new File(s[0]);
-			try {
-				view.setURL(f.toURL().toExternalForm());
-			} catch (Exception e) {
-				// TODO
-			}
-		}
-		
-		return true;
-	}
-
-	/**
-    * Validates dropping on the given object. This method is called whenever some 
-    * aspect of the drop operation changes.
-    * <p>
-    * Subclasses must implement this method to define which drops make sense.
-    * </p>
-    * 
-    * @param target the object that the mouse is currently hovering over, or
-    *   <code>null</code> if the mouse is hovering over empty space
-    * @param operation the current drag operation (copy, move, etc.)
-    * @param transferType the current transfer type
-    * @return <code>true</code> if the drop is valid, and <code>false</code>
-    *   otherwise
-    */
-	protected boolean validateDrop(int operation, TransferData transferType) {
-		if (FileTransfer.getInstance().isSupportedType(transferType))
-			return true;
-		/*if (ResourceTransfer.getInstance().isSupportedType(transferType))
-			return true;
-		if (LocalSelectionTransfer.getInstance().isSupportedType(transferType))
-			return true;*/
-		
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/BrowserLog.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/BrowserLog.java
deleted file mode 100644
index 5980705..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/BrowserLog.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser.browsers;
-
-import java.io.*;
-import com.ibm.icu.text.DateFormat;
-import com.ibm.icu.text.SimpleDateFormat;
-import java.util.Date;
-
-import org.eclipse.ui.internal.browser.WebBrowserUIPlugin;
-/**
- * Log for messages output by external browser processes.
- */
-public class BrowserLog {
-	private static BrowserLog instance;
-	private String logFileName;
-	private boolean newSession;
-	DateFormat formatter = new SimpleDateFormat("MMM dd, yyyy kk:mm:ss.SS"); //$NON-NLS-1$
-	String LN = System.getProperty("line.separator"); //$NON-NLS-1$
-	/**
-	 * Constructor
-	 */
-	private BrowserLog() {
-		try {
-			newSession = true;
-			logFileName = WebBrowserUIPlugin.getInstance().getStateLocation().append("browser.log").toOSString(); //$NON-NLS-1$
-		} catch (Exception e) {
-			// can get here if platform is shutting down
-		}
-	}
-	/**
-	 * Obtains singleton
-	 */
-	private static BrowserLog getInstance() {
-		if (instance == null) {
-			instance = new BrowserLog();
-		}
-		return instance;
-	}
-	/**
-	 * Appends a line to the browser.log
-	 */
-	public static synchronized void log(String message) {
-		getInstance().append(message);
-	}
-	private void append(String message) {
-		if (logFileName == null) {
-			return;
-		}
-		Writer outWriter = null;
-		try {
-			outWriter = new BufferedWriter(new OutputStreamWriter(
-					new FileOutputStream(logFileName, true), "UTF-8")); //$NON-NLS-1$
-			if (newSession) {
-				newSession = false;
-				outWriter.write(LN + formatter.format(new Date())
-						+ " NEW SESSION" + LN); //$NON-NLS-1$
-			}
-			outWriter.write(formatter.format(new Date()) + " " + message + LN); //$NON-NLS-1$
-			outWriter.flush();
-			outWriter.close();
-		} catch (Exception e) {
-			if (outWriter != null) {
-				try {
-					outWriter.close();
-				} catch (IOException ioe) {
-					// ignore
-				}
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/DefaultBrowser.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/DefaultBrowser.java
deleted file mode 100644
index 6b220ef..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/DefaultBrowser.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser.browsers;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.osgi.service.environment.Constants;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.browser.AbstractWebBrowser;
-import org.eclipse.ui.internal.browser.Messages;
-import org.eclipse.ui.internal.browser.Trace;
-import org.eclipse.ui.internal.browser.WebBrowserUIPlugin;
-/**
- * 
- */
-public class DefaultBrowser extends AbstractWebBrowser {
-	protected String location;
-	protected String parameters;
-	
-	public DefaultBrowser(String id, String location, String parameters) {
-		super(id);
-		this.location = location;
-		this.parameters = parameters;
-	}
-
-	/**
-	 * @see org.eclipse.help.browser.IBrowser#displayURL(java.lang.String)
-	 */
-	public void openURL(URL url2) throws PartInitException {
-		String url = url2.toExternalForm();
-		String path = location;
-
-		String[] command = prepareCommand(path, url);
-		Trace.trace(Trace.FINER, "Command: " + command); //$NON-NLS-1$
-
-		try {
-			Process pr = Runtime.getRuntime().exec(command);
-			Thread outConsumer = new StreamConsumer(pr.getInputStream());
-			outConsumer.setName("Custom browser adapter output reader"); //$NON-NLS-1$
-			outConsumer.start();
-			Thread errConsumer = new StreamConsumer(pr.getErrorStream());
-			errConsumer.setName("Custom browser adapter error reader"); //$NON-NLS-1$
-			errConsumer.start();
-		} catch (Exception e) {
-			WebBrowserUIPlugin.logError(
-				"Launching URL \"" //$NON-NLS-1$
-					+ url
-					+ "\" using browser program \"" //$NON-NLS-1$
-					+ path
-					+ "\" has failed.  Specify another browser in help preferences.", //$NON-NLS-1$
-					e);
-			throw new PartInitException(NLS.bind(Messages.errorCouldNotLaunchWebBrowser, path));
-		}
-	}
-
-	/**
-	 * Creates the final command to launch.
-	 * 
-	 * @param path
-	 * @param url
-	 * @return String[]
-	 */
-	protected String[] prepareCommand(String path, String url) {
-		ArrayList tokenList = new ArrayList();
-		//Divide along quotation marks
-		StringTokenizer qTokenizer = new StringTokenizer(path.trim(),
-			"\"", true); //$NON-NLS-1$
-		boolean withinQuotation = false;
-		String quotedString = ""; //$NON-NLS-1$
-		while (qTokenizer.hasMoreTokens()) {
-			String curToken = qTokenizer.nextToken();
-			if (curToken.equals("\"")) { //$NON-NLS-1$
-				if (withinQuotation) {
-					if (Constants.OS_WIN32.equalsIgnoreCase(Platform.getOS())) {
-						// need to quote URLs on Windows
-						tokenList.add("\"" + quotedString + "\""); //$NON-NLS-1$ //$NON-NLS-2$
-					} else {
-						// quotes prevent launching on Unix 35673
-						tokenList.add(quotedString);
-					}
-				} else {
-					quotedString = ""; //$NON-NLS-1$
-				}
-				withinQuotation = !withinQuotation;
-				continue;
-			} else if (withinQuotation) {
-				quotedString = curToken;
-				continue;
-			} else {
-				//divide unquoted strings along white space
-				StringTokenizer parser = new StringTokenizer(curToken.trim());
-				while (parser.hasMoreTokens()) {
-					tokenList.add(parser.nextToken());
-				}
-			}
-		}
-		// substitute %1 by url
-		boolean substituted = false;
-		for (int i = 0; i < tokenList.size(); i++) {
-			String token = (String) tokenList.get(i);
-			String newToken = doSubstitutions(token, url);
-			if (newToken != null) {
-				tokenList.set(i, newToken);
-				substituted = true;
-			}
-		}
-		// add the url if not substituted already
-		if (!substituted)
-			tokenList.add(url);
-
-		String[] command = new String[tokenList.size()];
-		tokenList.toArray(command);
-		return command;
-	}
-	
-	/**
-	 * Replaces any occurrences of <code>"%1"</code> or <code>%1</code> with
-	 * the URL.
-	 * 
-	 * @param token
-	 *            The token in which the substitutions should be made; must not
-	 *            be <code>null</code>.
-	 * @return The substituted string, if a substitution is made;
-	 *         <code>null</code> if no substitution is made.
-	 */
-	protected String doSubstitutions(String token, String url) {
-		boolean substituted = false;
-		StringBuffer newToken = new StringBuffer(token);
-		String substitutionMarker = "%1"; //$NON-NLS-1$
-		int index = newToken.indexOf(substitutionMarker);
-		while (index != -1) {
-			newToken.replace(index, index + substitutionMarker.length(), url);
-			index = newToken.indexOf(substitutionMarker, index + url.length());
-			substituted = true;
-		}
-
-		if (substituted) {
-			return newToken.toString();
-		}
-
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/DefaultBrowserFactory.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/DefaultBrowserFactory.java
deleted file mode 100644
index 83275b9..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/DefaultBrowserFactory.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser.browsers;
-
-import org.eclipse.ui.browser.BrowserFactory;
-import org.eclipse.ui.browser.IWebBrowser;
-/**
- * Produces Custom Browser
- */
-public class DefaultBrowserFactory extends BrowserFactory {
-	/**
-	 * @see org.eclipse.ui.browser.provisional.BrowserFactory#createBrowser()
-	 */
-	public IWebBrowser createBrowser(String id, String location, String parameters) {
-		return new DefaultBrowser(id, location, parameters);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/MozillaBrowser.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/MozillaBrowser.java
deleted file mode 100644
index b6738cd..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/MozillaBrowser.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Shawn Minto, patch for Bug 247731
- *******************************************************************************/
-package org.eclipse.ui.internal.browser.browsers;
-
-import java.io.*;
-import java.net.URL;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ui.browser.AbstractWebBrowser;
-import org.eclipse.ui.internal.browser.WebBrowserUIPlugin;
-import org.eclipse.ui.internal.browser.WebBrowserUtil;
-/**
- * Browser adapter for browsers supporting -remote openURL command line option
- * i.e. Mozilla and Netscape.
- */
-public class MozillaBrowser extends AbstractWebBrowser {
-	// delay that it takes mozilla to start responding
-	// to remote command after mozilla has been called
-	protected static final int DELAY = 5000;
-
-	protected long browserFullyOpenedAt = 0;
-
-	private BrowserThread lastBrowserThread = null;
-
-	protected String executable;
-	
-	protected boolean firstLaunch = true;
-
-	private String parameters;
-
-	/**
-	 * Constructor
-	 * 
-	 * @executable executable filename to launch
-	 * @executableName name of the program to display when error occurs
-	 */
-	public MozillaBrowser(String id, String executable, String parameters) {
-		super(id);
-		this.executable = executable;
-		if (parameters == null) {
-			this.parameters = ""; //$NON-NLS-1$
-		} else {
-		    this.parameters = parameters;
-		}
-	}
-	
-	String getExecutable() {
-		return executable;
-	}
-
-	/*
-	 * @see IBrowser#displayURL(String)
-	 */
-	public void openURL(URL url2) {
-		String url = null;
-		if (url2 != null) {
-			url = url2.toExternalForm();
-			// change spaces to "%20"
-			if (url != null & WebBrowserUtil.isWindows()) {
-				int index = url.indexOf(" "); //$NON-NLS-1$
-				while (index >= 0) {
-					url = url.substring(0, index) + "%20" //$NON-NLS-1$
-							+ url.substring(index + 1);
-					index = url.indexOf(" "); //$NON-NLS-1$
-				}
-			}
-		}
-		else {
-			url = ""; //$NON-NLS-1$
-		}
-		if (lastBrowserThread != null)
-			lastBrowserThread.exitRequested = true;
-
-		lastBrowserThread = new BrowserThread(url);
-		lastBrowserThread.setDaemon(true);
-		lastBrowserThread.start();
-	}
-
-	private class BrowserThread extends Thread {
-		public boolean exitRequested = false;
-
-		private String url;
-
-		public BrowserThread(String urlName) {
-			this.url = urlName;
-		}
-
-		/**
-		 * @param browserCmd
-		 * @return int 0 if success
-		 */
-		private int openBrowser(String browserCmd) {
-			try {
-				Process pr = Runtime.getRuntime().exec(browserCmd);
-				StreamConsumer outputs = new StreamConsumer(pr.getInputStream());
-				(outputs).start();
-				StreamConsumer errors = new StreamConsumer(pr.getErrorStream());
-				(errors).start();
-				pr.waitFor();
-				int ret = pr.exitValue();
-
-				if (ret == 0 && errorsInOutput(outputs, errors)) {
-					return -1;
-				}
-				return ret;
-			} catch (InterruptedException e) {
-				// ignore
-			} catch (IOException e) {
-				WebBrowserUIPlugin.logError("Launching " + executable //$NON-NLS-1$
-					+ " has failed.", e); //$NON-NLS-1$
-				// TODO: log error
-				/*String msg = HelpBaseResources.getString(
-						"MozillaBrowser.executeFailed", //$NON-NLS-1$
-						executableName);
-				BaseHelpSystem.getDefaultErrorUtil()
-						.displayError(msg, uiThread);*/
-				// return success, so second command does not execute
-				return 0;
-			}
-			return -1;
-		}
-
-		/**
-		 * On some OSes 0 is always returned by netscape -remote. It is
-		 * necessary to examine ouput to find out failure
-		 * 
-		 * @param outputs
-		 * @param errors
-		 * @return @throws
-		 *         InterruptedException
-		 */
-		private boolean errorsInOutput(StreamConsumer outputs,
-				StreamConsumer errors) {
-			try {
-				outputs.join(1000);
-				if (outputs.getLastLine() != null
-						&& (outputs.getLastLine().indexOf(
-								"No running window found") //$NON-NLS-1$
-						>= 0 || outputs.getLastLine().indexOf(
-								"not running on display") //$NON-NLS-1$
-						>= 0)) {
-					return true;
-				}
-				errors.join(1000);
-				if (errors.getLastLine() != null
-						&& (errors.getLastLine().indexOf(
-								"No running window found") //$NON-NLS-1$
-						>= 0 || errors.getLastLine().indexOf(
-								"not running on display") //$NON-NLS-1$
-						>= 0)) {
-					return true;
-				}
-			} catch (InterruptedException ie) {
-				// ignore
-			}
-			return false;
-		}
-
-		public void run() {
-			// if browser is opening, wait until it fully opens
-			waitForBrowser();
-			if (exitRequested)
-				return;
-			if (firstLaunch && Platform.OS_WIN32.equals(Platform.getOS())) {
-				if (openBrowser(executable + " " + WebBrowserUtil.createParameterString(parameters, url)) == 0) //$NON-NLS-1$
-					return;
-				browserFullyOpenedAt = System.currentTimeMillis() + DELAY;
-				return;
-			}
-			if (openBrowser(executable + ' ' + parameters + " -remote openURL(" + url + ")") //$NON-NLS-1$ //$NON-NLS-2$
-					== 0)
-				return;
-			
-			if (exitRequested)
-				return;
-			browserFullyOpenedAt = System.currentTimeMillis() + DELAY;
-			openBrowser(executable + " " + WebBrowserUtil.createParameterString(parameters, url)); //$NON-NLS-1$
-		}
-
-		private void waitForBrowser() {
-			while (System.currentTimeMillis() < browserFullyOpenedAt)
-				try {
-					if (exitRequested)
-						return;
-					Thread.sleep(100);
-				} catch (InterruptedException ie) {
-					// ignore
-				}
-		}
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/MozillaFactory.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/MozillaFactory.java
deleted file mode 100644
index 4615879..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/MozillaFactory.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation    
- *     Shawn Minto, patch for Bug 247731
- *******************************************************************************/
-package org.eclipse.ui.internal.browser.browsers;
-
-import org.eclipse.ui.browser.BrowserFactory;
-import org.eclipse.ui.browser.IWebBrowser;
-
-public class MozillaFactory extends BrowserFactory {
-	private MozillaBrowser browserInstance = null;
-	
-	/**
-	 * Constructor.
-	 */
-	public MozillaFactory() {
-		super();
-	}
-	
-	/*
-	 * @see BrowserFactory#isAvailable()
-	 */
-	/*public boolean isAvailable() {
-		try {
-			Process pr = Runtime.getRuntime().exec("which " + executable); //$NON-NLS-1$
-			StreamConsumer outputs = new StreamConsumer(pr.getInputStream());
-			(outputs).start();
-			StreamConsumer errors = new StreamConsumer(pr.getErrorStream());
-			(errors).start();
-			pr.waitFor();
-			
-			int ret = pr.exitValue();
-			if (ret == 0)
-				return !errorsInOutput(outputs, errors);
-			return false;
-		} catch (InterruptedException e) {
-			return false;
-		} catch (IOException e) {
-			// launching which failed, assume browser executable is present
-			return true;
-		}
-	}*/
-	
-	/**
-	 * On some OSes 0 is always returned by "which" command it is necessary to
-	 * examine ouput to find out failure.
-	 * 
-	 * @param outputs
-	 * @param errors
-	 * @return @throws
-	 *         InterruptedException
-	 */
-	/*private boolean errorsInOutput(StreamConsumer outputs, StreamConsumer errors) {
-		try {
-			outputs.join(1000);
-			if (outputs.getLastLine() != null
-				&& outputs.getLastLine()
-					.indexOf("no " + executable + " in") //$NON-NLS-1$ //$NON-NLS-2$
-					>= 0) {
-				return true;
-			}
-			errors.join(1000);
-			if (errors.getLastLine() != null
-					&& errors.getLastLine().indexOf("no " + executable + " in") //$NON-NLS-1$ //$NON-NLS-2$
-					>= 0) {
-				return true;
-			}
-		} catch (InterruptedException ie) {
-			// ignore
-		}
-		return false;
-	}*/
-
-	/*
-	 * @see BrowserFactory#createBrowser()
-	 */
-	public IWebBrowser createBrowser(String id, String location, String parameters) {
-		// Create single browser for all clients
-		if (browserInstance == null || !browserInstance.getExecutable().equals(location)) {
-			browserInstance = new MozillaBrowser(id, location, parameters);
-		}
-		return browserInstance;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/NullBrowser.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/NullBrowser.java
deleted file mode 100644
index 2c84e0e..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/NullBrowser.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser.browsers;
-
-import java.net.URL;
-
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.browser.AbstractWebBrowser;
-import org.eclipse.ui.internal.browser.Messages;
-import org.eclipse.ui.internal.browser.WebBrowserUIPlugin;
-
-public class NullBrowser extends AbstractWebBrowser {
-	public NullBrowser(String id) {
-		super(id);
-	}
-
-	public void openURL(URL url) throws PartInitException {
-		WebBrowserUIPlugin.logError(
-			"There is no browser adapter configured to display " //$NON-NLS-1$
-			+ url
-			+ ".  Ensure that you have a required browser and adapter installed, and that the browser program is available on the system path.", //$NON-NLS-1$
-			null);
-		throw new PartInitException(Messages.errorNoBrowser);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/StreamConsumer.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/StreamConsumer.java
deleted file mode 100644
index 734b46a..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/browsers/StreamConsumer.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser.browsers;
-
-import java.io.*;
-
-import org.eclipse.ui.internal.browser.WebBrowserUIPlugin;
-/**
- * Used to receive output from processes
- */
-public class StreamConsumer extends Thread {
-	BufferedReader bReader;
-
-	private String lastLine;
-
-	public StreamConsumer(InputStream inputStream) {
-		super();
-		setDaemon(true);
-		bReader = new BufferedReader(new InputStreamReader(inputStream));
-	}
-
-	public void run() {
-		try {
-			String line;
-			while (null != (line = bReader.readLine())) {
-				lastLine = line;
-				BrowserLog.log(line);
-			}
-			bReader.close();
-		} catch (IOException ioe) {
-			WebBrowserUIPlugin.logError("Exception occurred reading from web browser.", ioe); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @return last line obtained or null
-	 */
-	public String getLastLine() {
-		return lastLine;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/macosx/DefaultBrowser.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/macosx/DefaultBrowser.java
deleted file mode 100644
index 6952a8a..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/macosx/DefaultBrowser.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser.macosx;
-
-import java.io.*;
-import java.net.URL;
-
-import org.eclipse.ui.browser.AbstractWebBrowser;
-import org.eclipse.ui.internal.browser.WebBrowserUIPlugin;
-
-public class DefaultBrowser extends AbstractWebBrowser {
-
-	public DefaultBrowser(String id) {
-		super(id);
-	}
-
-	/**
-	 * @see org.eclipse.help.browser.IBrowser#displayURL(String)
-	 */
-	public void openURL(URL url2) {
-		String url = url2.toExternalForm();
-		/*
-		 * Code from Marc-Antoine Parent
-		 */
-		try {
-			Runtime.getRuntime().exec(new String[] { "/usr/bin/osascript", //$NON-NLS-1$
-					"-e", //$NON-NLS-1$
-					"open location \"" + url + "\"" }); //$NON-NLS-1$ //$NON-NLS-2$
-		} catch (IOException ioe) {
-			WebBrowserUIPlugin.logError("Launching \"osascript\" has failed.", ioe); //$NON-NLS-1$
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/macosx/DefaultBrowserFactory.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/macosx/DefaultBrowserFactory.java
deleted file mode 100644
index 0810f9b..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/macosx/DefaultBrowserFactory.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser.macosx;
-
-import org.eclipse.ui.browser.BrowserFactory;
-import org.eclipse.ui.browser.IWebBrowser;
-
-public class DefaultBrowserFactory extends BrowserFactory {
-	/*
-	 * @see BrowserFactory#createBrowser()
-	 */
-	public IWebBrowser createBrowser(String id, String location, String parameters) {
-		return new DefaultBrowser(id);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/macosx/SafariBrowser.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/macosx/SafariBrowser.java
deleted file mode 100644
index 6d8b876..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/macosx/SafariBrowser.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser.macosx;
-
-import java.util.ArrayList;
-import java.util.StringTokenizer;
-
-import org.eclipse.ui.internal.browser.browsers.DefaultBrowser;
-
-public class SafariBrowser extends DefaultBrowser {
-	
-	public SafariBrowser(String id, String location, String parameters) {
-		super(id, location, parameters);
-		this.location = location;
-		this.parameters = parameters;
-	}
-
-	/**
-	 * Creates the final command to launch.
-	 * 
-	 * @param path
-	 * @param url
-	 * @return String[]
-	 */
-	protected String[] prepareCommand(String path, String url) {
-		if (url != null && url.toLowerCase().startsWith("file:")) { //$NON-NLS-1$
-			url = url.substring(5);
-		}
-		
-		ArrayList tokenList = new ArrayList();
-		//Divide along quotation marks
-		StringTokenizer qTokenizer = new StringTokenizer(path.trim(),
-			"\"", true); //$NON-NLS-1$
-		boolean withinQuotation = false;
-		String quotedString = ""; //$NON-NLS-1$
-		while (qTokenizer.hasMoreTokens()) {
-			String curToken = qTokenizer.nextToken();
-			if (curToken.equals("\"")) { //$NON-NLS-1$
-				if (withinQuotation) {
-					// quotes prevent launching on Unix 35673
-					tokenList.add(quotedString);
-				} else {
-					quotedString = ""; //$NON-NLS-1$
-				}
-				withinQuotation = !withinQuotation;
-				continue;
-			} else if (withinQuotation) {
-				quotedString = curToken;
-				continue;
-			} else {
-				//divide unquoted strings along white space
-				StringTokenizer parser = new StringTokenizer(curToken.trim());
-				while (parser.hasMoreTokens()) {
-					tokenList.add(parser.nextToken());
-				}
-			}
-		}
-		// substitute %1 by url
-		boolean substituted = false;
-		for (int i = 0; i < tokenList.size(); i++) {
-			String token = (String) tokenList.get(i);
-			String newToken = doSubstitutions(token, url);
-			if (newToken != null) {
-				tokenList.set(i, newToken);
-				substituted = true;
-			}
-		}
-		// add the url if not substituted already
-		if (!substituted)
-			tokenList.add(url);
-
-		String[] command = new String[tokenList.size()];
-		tokenList.toArray(command);
-		return command;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/macosx/SafariBrowserFactory.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/macosx/SafariBrowserFactory.java
deleted file mode 100644
index 41d8312..0000000
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/macosx/SafariBrowserFactory.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.browser.macosx;
-
-import org.eclipse.ui.browser.BrowserFactory;
-import org.eclipse.ui.browser.IWebBrowser;
-
-public class SafariBrowserFactory extends BrowserFactory {
-	/*
-	 * @see BrowserFactory#createBrowser()
-	 */
-	public IWebBrowser createBrowser(String id, String location, String parameters) {
-		return new SafariBrowser(id, location, parameters);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.carbon/.classpath b/bundles/org.eclipse.ui.carbon/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.ui.carbon/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.ui.carbon/.cvsignore b/bundles/org.eclipse.ui.carbon/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.ui.carbon/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.ui.carbon/.project b/bundles/org.eclipse.ui.carbon/.project
deleted file mode 100644
index 5406e13..0000000
--- a/bundles/org.eclipse.ui.carbon/.project
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.carbon</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.runtime.compatibility</project>
-		<project>org.eclipse.help</project>
-		<project>org.eclipse.ui</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.carbon/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.ui.carbon/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index ef556a6..0000000
--- a/bundles/org.eclipse.ui.carbon/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,79 +0,0 @@
-#Mon Feb 06 11:16:35 EST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.ui.carbon/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.ui.carbon/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 9e97fa0..0000000
--- a/bundles/org.eclipse.ui.carbon/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Mon Jul 18 11:56:01 EDT 2005
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=false
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.1\n *\n * ${tags}\n */</template><template context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/bundles/org.eclipse.ui.carbon/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.ui.carbon/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 42b98f6..0000000
--- a/bundles/org.eclipse.ui.carbon/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Nov 16 14:10:56 EST 2004
-compilers.p.unused-element-or-attribute=1
-compilers.p.unresolved-ex-points=0
-compilers.p.deprecated=0
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unknown-class=1
-compilers.p.unknown-attribute=0
-compilers.p.no-required-att=0
-eclipse.preferences.version=1
-compilers.p.unresolved-import=0
-compilers.p.not-externalized-att=0
-compilers.p.illegal-att-value=0
-compilers.use-project=true
diff --git a/bundles/org.eclipse.ui.carbon/.template b/bundles/org.eclipse.ui.carbon/.template
deleted file mode 100644
index d65e0f4..0000000
--- a/bundles/org.eclipse.ui.carbon/.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/bundles/org.eclipse.ui.carbon/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.carbon/META-INF/MANIFEST.MF
deleted file mode 100644
index c5dce85..0000000
--- a/bundles/org.eclipse.ui.carbon/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %fragmentName
-Bundle-SymbolicName: org.eclipse.ui.carbon; singleton:=true
-Bundle-Version: 4.0.0.qualifier
-Bundle-Vendor: %providerName
-Fragment-Host: org.eclipse.ui;bundle-version="[3.2.0,4.0.0)"
-Bundle-Localization: fragment-carbon
-Eclipse-PlatformFilter: (osgi.ws=carbon)
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Export-Package: org.eclipse.ui.internal.carbon;x-internal:=true;uses:="org.eclipse.ui"
diff --git a/bundles/org.eclipse.ui.carbon/about.html b/bundles/org.eclipse.ui.carbon/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.ui.carbon/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.carbon/build.properties b/bundles/org.eclipse.ui.carbon/build.properties
deleted file mode 100644
index 3e16318..0000000
--- a/bundles/org.eclipse.ui.carbon/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-bin.includes = fragment.xml,\
-               fragment-carbon.properties,\
-               META-INF/,\
-               .,\
-               about.html
-src.includes = about.html
diff --git a/bundles/org.eclipse.ui.carbon/fragment-carbon.properties b/bundles/org.eclipse.ui.carbon/fragment-carbon.properties
deleted file mode 100644
index cb3a1cf..0000000
--- a/bundles/org.eclipse.ui.carbon/fragment-carbon.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-providerName=Eclipse.org
-fragmentName=Eclipse UI MacOS X Enhancements
diff --git a/bundles/org.eclipse.ui.carbon/fragment.xml b/bundles/org.eclipse.ui.carbon/fragment.xml
deleted file mode 100644
index 2a881b8..0000000
--- a/bundles/org.eclipse.ui.carbon/fragment.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<fragment>
-
-   <extension
-         point="org.eclipse.ui.startup">
-      <startup
-            class="org.eclipse.ui.internal.carbon.CarbonUIEnhancer">
-      </startup>
-   </extension>
-   
-</fragment>
diff --git a/bundles/org.eclipse.ui.carbon/scripts/exportplugin.xml b/bundles/org.eclipse.ui.carbon/scripts/exportplugin.xml
deleted file mode 100644
index fe85497..0000000
--- a/bundles/org.eclipse.ui.carbon/scripts/exportplugin.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<project name="org.eclipse.ui.carbon" default="export" basedir="..">
-
-	<target name="init">
-		<tstamp/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="tempdir" value="../../tmp" />
-		<property name="plugin" value="org.eclipse.ui.carbon" />
-		<property name="plugin_version"  value="_3.1.0" />
-		<property name="dest"  value="${destdir}/${plugin}${plugin_version}" />
-		<property name="destjar"  value="${destdir}/${plugin}${plugin_version}.jar" />
-	</target>
-
-	<target name="build" depends="init">
-    	<eclipse.incrementalBuild project="${plugin}" kind="incr"/>
-	</target>
-
-	<target name="export" depends="build">
-		<delete dir="${tempdir}" />
-		<mkdir dir="${tempdir}" />
-		<mkdir dir="${destdir}" />
-		<delete file="${destjar}" />
-		<zip zipfile="${tempdir}/carbonsrc.zip">
-		    <fileset dir="src" />
-  		</zip>
-		<zip zipfile="${destjar}">
-			<fileset dir=".">
-			  <include name="fragment.xml" />
-			  <include name="fragment-carbon.properties" />
-			  <include name="META-INF/**" />
-			</fileset>
-			<fileset dir="bin" />
-			<fileset file="${tempdir}/carbonsrc.zip" />
-		</zip>
-		<delete file="${tempdir}/carbonsrc.zip" />
-	</target>
-</project>
diff --git a/bundles/org.eclipse.ui.carbon/src/org/eclipse/ui/internal/carbon/CarbonUIEnhancer.java b/bundles/org.eclipse.ui.carbon/src/org/eclipse/ui/internal/carbon/CarbonUIEnhancer.java
deleted file mode 100755
index e216580..0000000
--- a/bundles/org.eclipse.ui.carbon/src/org/eclipse/ui/internal/carbon/CarbonUIEnhancer.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.carbon;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.NotEnabledException;
-import org.eclipse.core.commands.NotHandledException;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.runtime.IProduct;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.swt.internal.Callback;
-import org.eclipse.swt.internal.carbon.HICommand;
-import org.eclipse.swt.internal.carbon.OS;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.IStartup;
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.internal.WorkbenchWindow;
-
-/**
- * The CarbonUIEnhancer provides the standard "About" and "Preference" menu items
- * and links them to the corresponding workbench commands. 
- * This must be done in a MacOS X fragment because SWT doesn't provide an abstraction
- * for the (MacOS X only) application menu and we have to use MacOS specific natives.
- * The fragment is for the org.eclipse.ui plugin because we need access to the
- * Workbench "About" and "Preference" actions.
- * 
- * @noreference this class is not intended to be referenced by any client.
- * @since 4.0
- */
-public class CarbonUIEnhancer implements IStartup {
-
-	/**
-	 * Class that is able to intercept and handle OS events from the toolbar and menu.
-	 * 
-	 * @since 3.1
-	 */
-    class Target {
-    	
-    	/**
-    	 * Process OS toolbar event.
-    	 * 
-    	 * @param nextHandler unused
-    	 * @param theEvent the OS event
-    	 * @param userData unused
-    	 * @return whether or not the event was handled by this processor
-    	 */
-		public int toolbarProc (int nextHandler, int theEvent, int userData) {
-			int eventKind = OS.GetEventKind (theEvent);
-			if (eventKind != OS.kEventWindowToolbarSwitchMode)
-				return OS.eventNotHandledErr;
-			
-			int [] theWindow = new int [1];
-			OS.GetEventParameter (theEvent, OS.kEventParamDirectObject, OS.typeWindowRef, null, 4, null, theWindow);
-			
-			int [] theRoot = new int [1];
-			OS.GetRootControl (theWindow [0], theRoot);
-			Widget widget = Display.getCurrent().findWidget(theRoot [0]);
-			
-			if (!(widget instanceof Shell)) {
-				return OS.eventNotHandledErr;
-			}
-			Shell shell = (Shell) widget;
-			IWorkbenchWindow[] windows = PlatformUI.getWorkbench()
-					.getWorkbenchWindows();
-			for (int i = 0; i < windows.length; i++) {
-				if (windows[i].getShell() == shell) {
-					return runCommand("org.eclipse.ui.ToggleCoolbarAction"); //$NON-NLS-1$
-				}
-			}
-			return OS.eventNotHandledErr;
-		}
-
-		/**
-    	 * Process OS menu event.
-    	 * 
-    	 * @param nextHandler unused
-    	 * @param theEvent the OS event
-    	 * @param userData unused
-    	 * @return whether or not the event was handled by this processor
-    	 */
-        public int commandProc(int nextHandler, int theEvent, int userData) {
-            if (OS.GetEventKind(theEvent) == OS.kEventProcessCommand) {
-                HICommand command = new HICommand();
-                OS.GetEventParameter(theEvent, OS.kEventParamDirectObject,
-                        OS.typeHICommand, null, HICommand.sizeof, null, command);
-                switch (command.commandID) {
-                case kHICommandPreferences:
-                    return runAction("preferences"); //$NON-NLS-1$
-                case kHICommandAbout:
-                    return runAction("about"); //$NON-NLS-1$
-                default:
-                    break;
-                }
-            }
-            return OS.eventNotHandledErr;
-        }
-	}
-
-	private static final int kHICommandPreferences = ('p' << 24) + ('r' << 16) + ('e' << 8) + 'f';
-    private static final int kHICommandAbout = ('a' << 24) + ('b' << 16) + ('o' << 8) + 'u';
-    private static final int kHICommandServices = ('s' << 24) + ('e' << 16) + ('r' << 8) + 'v';
-    private static final int kHICommandHide = ('h' << 24) + ('i' << 16) + ('d' << 8) + 'e';
-    private static final int kHICommandQuit = ('q' << 24) + ('u' << 16) + ('i' << 8) + 't';
-
-    private static final String RESOURCE_BUNDLE = CarbonUIEnhancer.class.getPackage().getName() + ".Messages"; //$NON-NLS-1$
-	
-    private String fAboutActionName;
-    private String fQuitActionName;
-    private String fHideActionName;
-	private int applicationMenuHandle;
-
-    /**
-     * Default constructor
-     */
-    public CarbonUIEnhancer() {
-        IProduct product = Platform.getProduct();
-        String productName = null;
-        if (product != null)
-            productName = product.getName();
-        
-		ResourceBundle resourceBundle = ResourceBundle.getBundle(RESOURCE_BUNDLE);
-		try {
-			if (productName != null) {
-				String format = resourceBundle.getString("AboutAction.format"); //$NON-NLS-1$
-				if (format != null)
-					fAboutActionName= MessageFormat.format(format, new Object[] { productName } );
-			}
-			if (fAboutActionName == null)
-				fAboutActionName = resourceBundle.getString("AboutAction.name"); //$NON-NLS-1$
-		} catch (MissingResourceException e) {
-		}
-		
-		if (fAboutActionName == null)
-			fAboutActionName = "About"; //$NON-NLS-1$
-		
-		if (productName != null) {	
-			try {
-				// prime the format Hide <app name>
-				String format = resourceBundle.getString("HideAction.format"); //$NON-NLS-1$
-				if (format != null)
-					fHideActionName = MessageFormat.format(format,
-							new Object[] { productName });
-
-			} catch (MissingResourceException e) {
-			}
-
-			try {
-				// prime the format Quit <app name>
-				String format = resourceBundle.getString("QuitAction.format"); //$NON-NLS-1$
-				if (format != null)
-					fQuitActionName = MessageFormat.format(format,
-							new Object[] { productName });
-
-			} catch (MissingResourceException e) {
-			}
-		}
-		
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IStartup#earlyStartup()
-     */
-    public void earlyStartup() {
-        final Display display = Display.getDefault();
-        display.syncExec(new Runnable() {
-            public void run() {
-				hookApplicationMenu(display);
-				hookToolbarButtonCallback();
-				hookWorkbenchListener();
-				// modify all shells opened on startup
-				IWorkbenchWindow[] windows = PlatformUI.getWorkbench()
-						.getWorkbenchWindows();
-				for (int i = 0; i < windows.length; i++) {
-					modifyWindowShell(windows[i]);
-				}
-			}
-        });
-    }
-
-    /**
-	 * Hooks a listener that tweaks newly opened workbench window shells with
-	 * the proper OS flags.
-	 * 
-	 * @since 3.2
-	 */
-    protected void hookWorkbenchListener() {
-		PlatformUI.getWorkbench().addWindowListener(new IWindowListener() {
-
-			public void windowActivated(IWorkbenchWindow window) {
-				// no-op
-			}
-
-			public void windowDeactivated(IWorkbenchWindow window) {
-				// no-op
-			}
-
-			public void windowClosed(IWorkbenchWindow window) {
-				// no-op
-			}
-
-			public void windowOpened(IWorkbenchWindow window) {
-				modifyWindowShell(window);
-			}});
-	}
-
-    /**
-	 * Modify the given workbench window shell bits to show the toolbar toggle
-	 * button.
-	 * 
-	 * @param window
-	 *            the window to modify
-	 * @since 3.2
-	 */
-	protected void modifyWindowShell(IWorkbenchWindow window) {
-		// only add the button when either the coolbar or perspectivebar
-		// is initially visible. This is so that RCP apps can choose to use
-		// this fragment without fear that their explicitly invisble bars
-		// can't be shown.
-		boolean coolBarInitiallyVsible = ((WorkbenchWindow) window)
-				.getCoolBarVisible();
-		boolean perspectiveBarInitiallyVsible = ((WorkbenchWindow) window)
-				.getPerspectiveBarVisible();
-
-		if (coolBarInitiallyVsible || perspectiveBarInitiallyVsible) {
-			// modify the newly opened window with the correct OS X
-			// style bits such that it possesses the toolbar button
-			Shell shell = window.getShell();
-			int windowHandle = OS.GetControlOwner(shell.handle);
-			OS.ChangeWindowAttributes(windowHandle,
-					OS.kWindowToolbarButtonAttribute, 0);
-		}
-	}
-	
-	/**
-	 * Hook the window toolbar button to toggle the visibility of the coolbar
-	 * and perspective bar.
-	 * 
-	 * @since 3.2
-	 */
-    protected void hookToolbarButtonCallback() {
-		Object target = new Target();
-		
-	    final Callback commandCallback = new Callback(target, "toolbarProc", 3); //$NON-NLS-1$
-        int commandProc = commandCallback.getAddress();
-        if (commandProc == 0) {
-            commandCallback.dispose();
-            return; // give up
-        }
-        
-        int[] mask = new int[] { OS.kEventClassWindow, OS.kEventWindowToolbarSwitchMode };
-        OS.InstallEventHandler(OS.GetApplicationEventTarget(), commandProc,
-                mask.length / 2, mask, 0, null);
-		
-	}
-
-	/**
-     * See Apple Technical Q&A 1079 (http://developer.apple.com/qa/qa2001/qa1079.html)
-     */
-    private void hookApplicationMenu(Display display) {
-
-        // Callback target
-        Object target = new Target();
-
-        final Callback commandCallback = new Callback(target, "commandProc", 3); //$NON-NLS-1$
-        int commandProc = commandCallback.getAddress();
-        if (commandProc == 0) {
-            commandCallback.dispose();
-            return; // give up
-        }
-
-        // Install event handler for commands
-        int[] mask = new int[] { OS.kEventClassCommand, OS.kEventProcessCommand };
-        OS.InstallEventHandler(OS.GetApplicationEventTarget(), commandProc,
-                mask.length / 2, mask, 0, null);
-
-        // create About Eclipse menu command
-        int[] outMenu = new int[1];
-        short[] outIndex = new short[1];
-        if (OS.GetIndMenuItemWithCommandID(0, kHICommandPreferences, 1, outMenu, outIndex) == OS.noErr
-                && outMenu[0] != 0) {
-            applicationMenuHandle = outMenu[0];
-
-            // add the about action
-            int l = fAboutActionName.length();
-            char buffer[] = new char[l];
-            fAboutActionName.getChars(0, l, buffer, 0);
-            int str = OS.CFStringCreateWithCharacters(OS.kCFAllocatorDefault, buffer, l);
-            OS.InsertMenuItemTextWithCFString(applicationMenuHandle, str, (short) 0, 0, kHICommandAbout);
-            OS.CFRelease(str);
-
-            // rename the hide action if we have an override string
-            if (fHideActionName != null) {
-				renameApplicationMenuItem(kHICommandHide, fHideActionName);
-			}
-            
-            // rename the quit action if we have an override string
-            if (fQuitActionName != null) {
-				renameApplicationMenuItem(kHICommandQuit, fQuitActionName);
-			}
-            
-            // add separator between About & Preferences
-            OS.InsertMenuItemTextWithCFString(applicationMenuHandle, 0, (short) 1, OS.kMenuItemAttrSeparator, 0);
-
-            // enable pref menu
-            OS.EnableMenuCommand(applicationMenuHandle, kHICommandPreferences);
-
-            // disable services menu
-            OS.DisableMenuCommand(applicationMenuHandle, kHICommandServices);
-        }
-
-        // schedule disposal of callback object
-        display.disposeExec(new Runnable() {
-            public void run() {
-                commandCallback.dispose();
-            }
-        });
-    }
-
-	/**
-     * Rename the given application menu item.
-     *
-	 * @param itemConstant the kHI* constant for the menu item
-	 * @param replacementName the new name
-     * @since 3.4
-	 */
-	private void renameApplicationMenuItem(int itemConstant,
-			String replacementName) {
-		int l;
-		char[] buffer;
-		int str;
-		int[] itemMenu = new int[1];
-		short[] itemIndex = new short[1];
-
-		if (OS.GetIndMenuItemWithCommandID(0, itemConstant, 1,
-				itemMenu, itemIndex) == OS.noErr
-				&& itemMenu[0] != 0) {
-
-			l = replacementName.length();
-			buffer = new char[l];
-			replacementName.getChars(0, l, buffer, 0);
-			str = OS.CFStringCreateWithCharacters(
-					OS.kCFAllocatorDefault, buffer, l);
-
-			OS.SetMenuItemTextWithCFString(itemMenu[0],
-					itemIndex[0], str);
-
-			OS.CFRelease(str);
-		}
-	}
-
-    /**
-     * Locate an action with the given id in the current menubar and run it.
-     */
-    private int runAction(String actionId) {
-        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-        if (window != null) {
-        	IMenuManager manager = ((WorkbenchWindow)window).getActionBars().getMenuManager();
-        	IAction action = findAction(actionId, manager);
-        	if (action != null && action.isEnabled()) {
-        		try {
-        			 // disable About and Pref actions;
-                    OS.DisableMenuCommand(applicationMenuHandle, kHICommandPreferences);
-                    OS.DisableMenuCommand(applicationMenuHandle, kHICommandAbout);
-                    action.run();
-        		}
-        		finally {
-        			 // re-enable About and Pref actions;
-        			 OS.EnableMenuCommand(applicationMenuHandle, kHICommandPreferences);
-                     OS.EnableMenuCommand(applicationMenuHandle, kHICommandAbout);
-        		}
-        		return OS.noErr;
-        	}
-        }
-        return OS.eventNotHandledErr;
-       
-    }
-    
-    private int runCommand(String commandId) {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		if (workbench == null)
-			return OS.eventNotHandledErr;
-		
-		IWorkbenchWindow activeWorkbenchWindow = workbench
-				.getActiveWorkbenchWindow();
-		if (activeWorkbenchWindow == null)
-			return OS.eventNotHandledErr;
-		
-		IHandlerService commandService = (IHandlerService) activeWorkbenchWindow
-				.getService(IHandlerService.class);
-
-		if (commandService != null) {
-			try {
-				commandService.executeCommand(commandId, null);
-				return OS.noErr;
-			} catch (ExecutionException e) {
-			} catch (NotDefinedException e) {
-			} catch (NotEnabledException e) {
-			} catch (NotHandledException e) {
-			}
-		}
-		return OS.eventNotHandledErr;
-	}
-
-    /**
-	 * Find the action with the given ID by recursivly crawling the provided
-	 * menu manager. If the action cannot be found <code>null</code> is
-	 * returned.
-	 * 
-	 * @param actionId
-	 *            the id to search for
-	 * @param manager
-	 *            the manager to search
-	 * @return the action or <code>null</code>
-	 */
-	private IAction findAction(String actionId, IMenuManager manager) {
-		IContributionItem[] items = manager.getItems();
-		for (int i = 0; i < items.length; i++) {
-			IContributionItem item = items[i];
-			if (item instanceof ActionContributionItem) {
-				ActionContributionItem aci = (ActionContributionItem) item;
-				String id = aci.getId();
-				if (id != null && id.equals(actionId))
-					return aci.getAction();
-			} else if (item instanceof IMenuManager) {
-				IAction found = findAction(actionId, (IMenuManager) item);
-				if (found != null)
-					return found;
-			}
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.carbon/src/org/eclipse/ui/internal/carbon/Messages.properties b/bundles/org.eclipse.ui.carbon/src/org/eclipse/ui/internal/carbon/Messages.properties
deleted file mode 100755
index 6d5c975..0000000
--- a/bundles/org.eclipse.ui.carbon/src/org/eclipse/ui/internal/carbon/Messages.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-AboutAction.format=About {0}
-AboutAction.name=About
-HideAction.format=Hide {0}
-QuitAction.format=Quit {0}
diff --git a/bundles/org.eclipse.ui.cocoa/.classpath b/bundles/org.eclipse.ui.cocoa/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/bundles/org.eclipse.ui.cocoa/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.ui.cocoa/.project b/bundles/org.eclipse.ui.cocoa/.project
deleted file mode 100644
index cbd97f8..0000000
--- a/bundles/org.eclipse.ui.cocoa/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.cocoa</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.cocoa/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.ui.cocoa/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 74d1955..0000000
--- a/bundles/org.eclipse.ui.cocoa/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Wed Nov 05 10:07:54 EST 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/bundles/org.eclipse.ui.cocoa/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.cocoa/META-INF/MANIFEST.MF
deleted file mode 100644
index 18bbf9a..0000000
--- a/bundles/org.eclipse.ui.cocoa/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %fragmentName
-Bundle-SymbolicName: org.eclipse.ui.cocoa;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Vendor: %providerName
-Fragment-Host: org.eclipse.ui;bundle-version="[3.5.0,4.0.0)"
-Bundle-Localization: fragment-cocoa
-Eclipse-PlatformFilter: (osgi.ws=cocoa)
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Export-Package: org.eclipse.ui.internal.cocoa
diff --git a/bundles/org.eclipse.ui.cocoa/about.html b/bundles/org.eclipse.ui.cocoa/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.ui.cocoa/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.cocoa/build.properties b/bundles/org.eclipse.ui.cocoa/build.properties
deleted file mode 100644
index 8edfc17..0000000
--- a/bundles/org.eclipse.ui.cocoa/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2008 Adobe Systems, Inc. and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     Adobe Systems, Inc. - initial API and implementation
-#     IBM Corporation - cleanup
-###############################################################################
-source.. = src/
-bin.includes = fragment.xml,\
-               fragment-cocoa.properties,\
-               META-INF/,\
-               .,\
-               about.html
-src.includes = about.html
diff --git a/bundles/org.eclipse.ui.cocoa/fragment-cocoa.properties b/bundles/org.eclipse.ui.cocoa/fragment-cocoa.properties
deleted file mode 100644
index 62d5ce9..0000000
--- a/bundles/org.eclipse.ui.cocoa/fragment-cocoa.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2008 Adobe Systems, Inc. and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     Adobe Systems, Inc. - initial API and implementation
-#     IBM Corporation - cleanup
-###############################################################################
-
-providerName=Eclipse.org
-fragmentName=Eclipse UI MacOS X Enhancements
diff --git a/bundles/org.eclipse.ui.cocoa/fragment.xml b/bundles/org.eclipse.ui.cocoa/fragment.xml
deleted file mode 100644
index 69babfe..0000000
--- a/bundles/org.eclipse.ui.cocoa/fragment.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<fragment>
-
-   <extension
-         point="org.eclipse.ui.startup">
-      <startup
-            class="org.eclipse.ui.internal.cocoa.CocoaUIEnhancer">
-      </startup>
-   </extension>
-   
-</fragment>
diff --git a/bundles/org.eclipse.ui.cocoa/src/org/eclipse/ui/internal/cocoa/CocoaUIEnhancer.java b/bundles/org.eclipse.ui.cocoa/src/org/eclipse/ui/internal/cocoa/CocoaUIEnhancer.java
deleted file mode 100644
index 09f9597..0000000
--- a/bundles/org.eclipse.ui.cocoa/src/org/eclipse/ui/internal/cocoa/CocoaUIEnhancer.java
+++ /dev/null
@@ -1,407 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Adobe Systems, Inc. and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Adobe Systems, Inc. - initial API and implementation
- *     IBM Corporation - cleanup
- *******************************************************************************/
-package org.eclipse.ui.internal.cocoa;
-
-import java.text.*;
-import java.util.*;
-
-import org.eclipse.core.commands.*;
-import org.eclipse.core.commands.common.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.*;
-import org.eclipse.swt.*;
-import org.eclipse.swt.internal.*;
-import org.eclipse.swt.internal.cocoa.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.*;
-import org.eclipse.ui.handlers.*;
-import org.eclipse.ui.internal.*;
-
-/**
- * The CocoaUIEnhancer provides the standard "About" and "Preference" menu items
- * and links them to the corresponding workbench commands. 
- * This must be done in a MacOS X fragment because SWT doesn't provide an abstraction
- * for the (MacOS X only) application menu and we have to use MacOS specific natives.
- * The fragment is for the org.eclipse.ui plugin because we need access to the
- * Workbench "About" and "Preference" actions.
- * 
- * @noreference this class is not intended to be referenced by any client.
- * @since 1.0
- */
-public class CocoaUIEnhancer implements IStartup {
-
-	private static final int kAboutMenuItem = 0;
-	private static final int kPreferencesMenuItem = 2;
-	private static final int kServicesMenuItem = 4;
-	private static final int kHideApplicationMenuItem = 6;
-	private static final int kQuitMenuItem = 10;
-	
-	static Callback proc3Args;
-	static final String SWT_OBJECT = "SWT_OBJECT"; //$NON-NLS-1$
-	static final int /*long*/ sel_toolbarButtonClicked_ = OS.sel_registerName("toolbarButtonClicked:"); //$NON-NLS-1$
-	static final int /*long*/ sel_preferencesMenuItemSelected_ = OS.sel_registerName("preferencesMenuItemSelected:"); //$NON-NLS-1$
-	static final int /*long*/ sel_aboutMenuItemSelected_ = OS.sel_registerName("aboutMenuItemSelected:"); //$NON-NLS-1$
-
-	static {
-		String className = "SWTCocoaEnhancerDelegate"; //$NON-NLS-1$
-
-		// TODO: These should either move out of Display or be accessible to this class.
-		String types = "*"; //$NON-NLS-1$
-		int size = C.PTR_SIZEOF, align = C.PTR_SIZEOF == 4 ? 2 : 3;
-
-		Class clazz = CocoaUIEnhancer.class;
-
-		proc3Args = new Callback(clazz, "actionProc", 3); //$NON-NLS-1$
-		int /*long*/ proc3 = proc3Args.getAddress();
-		if (proc3 == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
-
-		int /*long*/ cls = OS.objc_allocateClassPair(OS.class_NSObject, className, 0);
-		OS.class_addIvar(cls, SWT_OBJECT, size, (byte)align, types);
-
-		// Add the action callback
-		OS.class_addMethod(cls, sel_toolbarButtonClicked_, proc3, "@:@"); //$NON-NLS-1$
-		OS.class_addMethod(cls, sel_preferencesMenuItemSelected_, proc3, "@:@"); //$NON-NLS-1$
-		OS.class_addMethod(cls, sel_aboutMenuItemSelected_, proc3, "@:@"); //$NON-NLS-1$
-
-		OS.objc_registerClassPair(cls);
-	}	
-
-	SWTCocoaEnhancerDelegate delegate;
-	private int /*long*/ delegateJniRef;
-
-	/**
-	 * Class that is able to intercept and handle OS events from the toolbar and menu.
-	 * 
-	 * @since 3.1
-	 */
-
-    private static final String RESOURCE_BUNDLE = CocoaUIEnhancer.class.getPackage().getName() + ".Messages"; //$NON-NLS-1$
-	
-    private String fAboutActionName;
-    private String fQuitActionName;
-    private String fHideActionName;
-
-    /**
-     * Default constructor
-     */
-    public CocoaUIEnhancer() {
-        IProduct product = Platform.getProduct();
-        String productName = null;
-        if (product != null)
-            productName = product.getName();
-        
-		ResourceBundle resourceBundle = ResourceBundle.getBundle(RESOURCE_BUNDLE);
-		try {
-			if (productName != null) {
-				String format = resourceBundle.getString("AboutAction.format"); //$NON-NLS-1$
-				if (format != null)
-					fAboutActionName= MessageFormat.format(format, new Object[] { productName } );
-			}
-			if (fAboutActionName == null)
-				fAboutActionName = resourceBundle.getString("AboutAction.name"); //$NON-NLS-1$
-		} catch (MissingResourceException e) {
-		}
-		
-		if (fAboutActionName == null)
-			fAboutActionName = "About"; //$NON-NLS-1$
-		
-		if (productName != null) {	
-			try {
-				// prime the format Hide <app name>
-				String format = resourceBundle.getString("HideAction.format"); //$NON-NLS-1$
-				if (format != null)
-					fHideActionName = MessageFormat.format(format,
-							new Object[] { productName });
-
-			} catch (MissingResourceException e) {
-			}
-
-			try {
-				// prime the format Quit <app name>
-				String format = resourceBundle.getString("QuitAction.format"); //$NON-NLS-1$
-				if (format != null)
-					fQuitActionName = MessageFormat.format(format,
-							new Object[] { productName });
-
-			} catch (MissingResourceException e) {
-			}
-		}
-		
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IStartup#earlyStartup()
-     */
-    public void earlyStartup() {
-        final Display display = Display.getDefault();
-        display.syncExec(new Runnable() {
-            public void run() {
-        		delegate = new SWTCocoaEnhancerDelegate();
-        		delegate.alloc().init();
-        		delegateJniRef = OS.NewGlobalRef(CocoaUIEnhancer.this);
-        		if (delegateJniRef == 0) SWT.error(SWT.ERROR_NO_HANDLES);
-        		OS.object_setInstanceVariable(delegate.id, SWT_OBJECT, delegateJniRef);		
-
-        		hookApplicationMenu();
-				hookWorkbenchListener();
-				
-		        // schedule disposal of callback object
-		        display.disposeExec(new Runnable() {
-		            public void run() {
-		            	if (delegateJniRef != 0) OS.DeleteGlobalRef(delegateJniRef);
-		            	delegateJniRef = 0;
-		            	
-		            	if (delegate != null) delegate.release();
-		            	delegate = null;
-		                
-		            	if (proc3Args != null) proc3Args.dispose();
-		                proc3Args = null;
-		            }
-		        });
-
-				// modify all shells opened on startup
-				IWorkbenchWindow[] windows = PlatformUI.getWorkbench()
-						.getWorkbenchWindows();
-				for (int i = 0; i < windows.length; i++) {
-					modifyWindowShell(windows[i]);
-				}
-			}
-        });
-    }
-
-    /**
-	 * Hooks a listener that tweaks newly opened workbench window shells with
-	 * the proper OS flags.
-	 * 
-	 * @since 3.2
-	 */
-    protected void hookWorkbenchListener() {
-		PlatformUI.getWorkbench().addWindowListener(new IWindowListener() {
-
-			public void windowActivated(IWorkbenchWindow window) {
-				// no-op
-			}
-
-			public void windowDeactivated(IWorkbenchWindow window) {
-				// no-op
-			}
-
-			public void windowClosed(IWorkbenchWindow window) {
-				// no-op
-			}
-
-			public void windowOpened(IWorkbenchWindow window) {
-				modifyWindowShell(window);
-			}});
-	}
-
-    /**
-	 * Modify the given workbench window shell bits to show the toolbar toggle
-	 * button.
-	 * 
-	 * @param window
-	 *            the window to modify
-	 * @since 3.2
-	 */
-	protected void modifyWindowShell(IWorkbenchWindow window) {
-		// only add the button when either the coolbar or perspectivebar
-		// is initially visible. This is so that RCP apps can choose to use
-		// this fragment without fear that their explicitly invisble bars
-		// can't be shown.
-		boolean coolBarInitiallyVsible = ((WorkbenchWindow) window)
-				.getCoolBarVisible();
-		boolean perspectiveBarInitiallyVsible = ((WorkbenchWindow) window)
-				.getPerspectiveBarVisible();
-
-		if (coolBarInitiallyVsible || perspectiveBarInitiallyVsible) {
-			// Add an empty, hidden toolbar to the window.  Without this the
-			// toolbar button at the top right of the window will not appear
-			// even when setShowsToolbarButton(true) is called.
-			NSToolbar dummyBar = new NSToolbar();
-			dummyBar.alloc();
-			dummyBar.initWithIdentifier(NSString.stringWith("SWTToolbar")); //$NON-NLS-1$
-			dummyBar.setVisible(false);
-			
-			Shell shell = window.getShell();
-			NSWindow nsWindow = shell.view.window();
-			nsWindow.setToolbar(dummyBar);
-			nsWindow.setShowsToolbarButton(true);
-			
-			// Override the target and action of the toolbar button so we can control it.
-			NSButton toolbarButton = nsWindow.standardWindowButton(OS.NSWindowToolbarButton);
-			toolbarButton.setTarget(delegate);
-			toolbarButton.setAction(sel_toolbarButtonClicked_);
-		}
-	}
-	
-    private void hookApplicationMenu() {
-        // create About Eclipse menu command
-    	NSMenu mainMenu = NSApplication.sharedApplication().mainMenu();
-    	NSMenu appMenu = mainMenu.itemAtIndex(0).submenu();
-    	
-        // add the about action
-    	NSMenuItem aboutMenuItem = appMenu.itemAtIndex(kAboutMenuItem);
-    	aboutMenuItem.setTitle(NSString.stringWith(fAboutActionName));
-
-    	// rename the hide action if we have an override string
-    	if (fHideActionName != null) {
-        	NSMenuItem hideMenuItem = appMenu.itemAtIndex(kHideApplicationMenuItem);
-        	hideMenuItem.setTitle(NSString.stringWith(fHideActionName));
-    	}
-    	
-    	// rename the quit action if we have an override string
-    	if (fQuitActionName != null) {
-        	NSMenuItem quitMenuItem = appMenu.itemAtIndex(kQuitMenuItem);
-        	quitMenuItem.setTitle(NSString.stringWith(fQuitActionName));
-    	}
-
-    	// enable pref menu
-    	appMenu.itemAtIndex(kPreferencesMenuItem).setEnabled(true);
-
-    	// disable services menu
-    	appMenu.itemAtIndex(kServicesMenuItem).setEnabled(false);
-
-    	// Register as a target on the prefs and quit items.
-    	appMenu.itemAtIndex(kPreferencesMenuItem).setTarget(delegate);
-    	appMenu.itemAtIndex(kPreferencesMenuItem).setAction(sel_preferencesMenuItemSelected_);
-    	appMenu.itemAtIndex(kAboutMenuItem).setTarget(delegate);
-    	appMenu.itemAtIndex(kAboutMenuItem).setAction(sel_aboutMenuItemSelected_);
-    }
-
-    /**
-     * Locate an action with the given id in the current menubar and run it.
-     */
-    private void runAction(String actionId) {
-        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-        if (window != null) {
-        	IMenuManager manager = ((WorkbenchWindow)window).getActionBars().getMenuManager();
-        	IAction action = findAction(actionId, manager);
-        	if (action != null && action.isEnabled()) {
-        		NSMenu mainMenu = NSApplication.sharedApplication().mainMenu();
-        		NSMenu appMenu = mainMenu.itemAtIndex(0).submenu();
-        		try {
-        			appMenu.itemAtIndex(kPreferencesMenuItem).setEnabled(false);
-        	    	appMenu.itemAtIndex(kAboutMenuItem).setEnabled(false);
-        	    	action.run();
-        		}
-        		finally {
-        			appMenu.itemAtIndex(kPreferencesMenuItem).setEnabled(true);
-        	    	appMenu.itemAtIndex(kAboutMenuItem).setEnabled(true);
-        		}
-        	}
-        }
-       
-    }
-    
-    private void runCommand(String commandId) {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		if (workbench == null)
-			return;
-		
-		IWorkbenchWindow activeWorkbenchWindow = workbench
-				.getActiveWorkbenchWindow();
-		if (activeWorkbenchWindow == null)
-			return;
-		
-		IHandlerService commandService = (IHandlerService) activeWorkbenchWindow
-				.getService(IHandlerService.class);
-
-		if (commandService != null) {
-			try {
-				commandService.executeCommand(commandId, null);
-			} catch (ExecutionException e) {
-			} catch (NotDefinedException e) {
-			} catch (NotEnabledException e) {
-			} catch (NotHandledException e) {
-			}
-		}
-	}
-
-    /**
-	 * Find the action with the given ID by recursivly crawling the provided
-	 * menu manager. If the action cannot be found <code>null</code> is
-	 * returned.
-	 * 
-	 * @param actionId
-	 *            the id to search for
-	 * @param manager
-	 *            the manager to search
-	 * @return the action or <code>null</code>
-	 */
-	private IAction findAction(String actionId, IMenuManager manager) {
-		IContributionItem[] items = manager.getItems();
-		for (int i = 0; i < items.length; i++) {
-			IContributionItem item = items[i];
-			if (item instanceof ActionContributionItem) {
-				ActionContributionItem aci = (ActionContributionItem) item;
-				String id = aci.getId();
-				if (id != null && id.equals(actionId))
-					return aci.getAction();
-			} else if (item instanceof IMenuManager) {
-				IAction found = findAction(actionId, (IMenuManager) item);
-				if (found != null)
-					return found;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * Action implementations for the toolbar button and preferences and about menu items
-	 */
-	void toolbarButtonClicked (NSControl source) {
-		NSWindow window = source.window();
-		Widget widget = Display.getCurrent().findWidget(window.id);
-		
-		if (!(widget instanceof Shell)) {
-			return;
-		}
-		Shell shell = (Shell) widget;
-		IWorkbenchWindow[] windows = PlatformUI.getWorkbench()
-		.getWorkbenchWindows();
-		for (int i = 0; i < windows.length; i++) {
-			if (windows[i].getShell() == shell) {
-				runCommand("org.eclipse.ui.ToggleCoolbarAction"); //$NON-NLS-1$
-			}
-		}
-	}
-	
-	void preferencesMenuItemSelected() {
-		runAction("preferences"); //$NON-NLS-1$
-	}
-
-	void aboutMenuItemSelected() {
-		runAction("about"); //$NON-NLS-1$
-	}
-
-
-	static int /*long*/ actionProc(int /*long*/ id, int /*long*/ sel, int /*long*/ arg0) {
-		int /*long*/ [] jniRef = new int /*long*/ [1];
-		OS.object_getInstanceVariable(id, SWT_OBJECT, jniRef);
-		if (jniRef[0] == 0) return 0;
-		
-		CocoaUIEnhancer delegate = (CocoaUIEnhancer) OS.JNIGetObject(jniRef[0]); 
-		
-		if (sel == sel_toolbarButtonClicked_) {
-			NSControl source = new NSControl(arg0);
-			delegate.toolbarButtonClicked(source);
-		} else if (sel == sel_preferencesMenuItemSelected_) {
-			delegate.preferencesMenuItemSelected();
-		} else if (sel == sel_aboutMenuItemSelected_) {
-			delegate.aboutMenuItemSelected();
-		}
-		
-		return 0;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.cocoa/src/org/eclipse/ui/internal/cocoa/Messages.properties b/bundles/org.eclipse.ui.cocoa/src/org/eclipse/ui/internal/cocoa/Messages.properties
deleted file mode 100644
index eaf6446..0000000
--- a/bundles/org.eclipse.ui.cocoa/src/org/eclipse/ui/internal/cocoa/Messages.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2008 Adobe Systems, Inc. and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     Adobe Systems, Inc. - initial API and implementation
-#     IBM Corporation - cleanup
-###############################################################################
-
-AboutAction.format=About {0}
-AboutAction.name=About
-HideAction.format=Hide {0}
-QuitAction.format=Quit {0}
diff --git a/bundles/org.eclipse.ui.cocoa/src/org/eclipse/ui/internal/cocoa/SWTCocoaEnhancerDelegate.java b/bundles/org.eclipse.ui.cocoa/src/org/eclipse/ui/internal/cocoa/SWTCocoaEnhancerDelegate.java
deleted file mode 100644
index a39299b..0000000
--- a/bundles/org.eclipse.ui.cocoa/src/org/eclipse/ui/internal/cocoa/SWTCocoaEnhancerDelegate.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Adobe Systems, Inc. and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Adobe Systems, Inc. - initial API and implementation
- *     IBM Corporation - cleanup
- *******************************************************************************/
-package org.eclipse.ui.internal.cocoa;
-
-import org.eclipse.swt.internal.cocoa.*;
-
-public class SWTCocoaEnhancerDelegate extends NSObject {
-
-	public SWTCocoaEnhancerDelegate() {
-		super(0);
-	}
-		
-	public SWTCocoaEnhancerDelegate(int id) {
-		super(id);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.forms/.classpath b/bundles/org.eclipse.ui.forms/.classpath
deleted file mode 100644
index ce73933..0000000
--- a/bundles/org.eclipse.ui.forms/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.ui.forms/.cvsignore b/bundles/org.eclipse.ui.forms/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/bundles/org.eclipse.ui.forms/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.forms/.options b/bundles/org.eclipse.ui.forms/.options
deleted file mode 100644
index e6dbf14..0000000
--- a/bundles/org.eclipse.ui.forms/.options
+++ /dev/null
@@ -1,4 +0,0 @@
-org.eclipse.ui.forms/debug=true
-org.eclipse.ui.forms/debug/text=true
-org.eclipse.ui.forms/debug/focus=true
-org.eclipse.ui.forms/debug/textsize=true
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.forms/.project b/bundles/org.eclipse.ui.forms/.project
deleted file mode 100644
index 92c02b3..0000000
--- a/bundles/org.eclipse.ui.forms/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.forms</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.forms/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.ui.forms/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 08ca140..0000000
--- a/bundles/org.eclipse.ui.forms/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,71 +0,0 @@
-#Mon Feb 05 16:36:24 EST 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.ui.forms/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.forms/META-INF/MANIFEST.MF
deleted file mode 100644
index e87f572..0000000
--- a/bundles/org.eclipse.ui.forms/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,24 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %name
-Bundle-SymbolicName: org.eclipse.ui.forms
-Bundle-Version: 3.4.0.qualifier
-Bundle-Vendor: %provider-name
-Bundle-Localization: plugin
-Export-Package: org.eclipse.ui.forms,
- org.eclipse.ui.forms.editor,
- org.eclipse.ui.forms.events,
- org.eclipse.ui.forms.widgets,
- org.eclipse.ui.internal.forms;x-internal:=true,
- org.eclipse.ui.internal.forms.widgets;x-friends:="org.eclipse.ui.tests.forms"
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jface;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.ui;bundle-version="[3.4.0,4.0.0)";resolution:=optional
-Eclipse-LazyStart: true
-Import-Package: com.ibm.icu.text,
- javax.xml.parsers,
- org.w3c.dom,
- org.xml.sax
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
-Bundle-Activator: org.eclipse.ui.internal.forms.FormsPlugin
diff --git a/bundles/org.eclipse.ui.forms/about.html b/bundles/org.eclipse.ui.forms/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.ui.forms/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.forms/build.properties b/bundles/org.eclipse.ui.forms/build.properties
deleted file mode 100644
index a0ef5a1..0000000
--- a/bundles/org.eclipse.ui.forms/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = plugin.properties,\
-               .,\
-               about.html,\
-               META-INF/,\
-               icons/
-source.. = src/
-src.includes = about.html
diff --git a/bundles/org.eclipse.ui.forms/icons/progress/ani/1.png b/bundles/org.eclipse.ui.forms/icons/progress/ani/1.png
deleted file mode 100644
index 2147f79..0000000
--- a/bundles/org.eclipse.ui.forms/icons/progress/ani/1.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.forms/icons/progress/ani/2.png b/bundles/org.eclipse.ui.forms/icons/progress/ani/2.png
deleted file mode 100644
index ac886be..0000000
--- a/bundles/org.eclipse.ui.forms/icons/progress/ani/2.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.forms/icons/progress/ani/3.png b/bundles/org.eclipse.ui.forms/icons/progress/ani/3.png
deleted file mode 100644
index 0d8986b..0000000
--- a/bundles/org.eclipse.ui.forms/icons/progress/ani/3.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.forms/icons/progress/ani/4.png b/bundles/org.eclipse.ui.forms/icons/progress/ani/4.png
deleted file mode 100644
index 9d64d75..0000000
--- a/bundles/org.eclipse.ui.forms/icons/progress/ani/4.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.forms/icons/progress/ani/5.png b/bundles/org.eclipse.ui.forms/icons/progress/ani/5.png
deleted file mode 100644
index 12343e0..0000000
--- a/bundles/org.eclipse.ui.forms/icons/progress/ani/5.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.forms/icons/progress/ani/6.png b/bundles/org.eclipse.ui.forms/icons/progress/ani/6.png
deleted file mode 100644
index 4d9f686..0000000
--- a/bundles/org.eclipse.ui.forms/icons/progress/ani/6.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.forms/icons/progress/ani/7.png b/bundles/org.eclipse.ui.forms/icons/progress/ani/7.png
deleted file mode 100644
index 7648d33..0000000
--- a/bundles/org.eclipse.ui.forms/icons/progress/ani/7.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.forms/icons/progress/ani/8.png b/bundles/org.eclipse.ui.forms/icons/progress/ani/8.png
deleted file mode 100644
index d8eabd7..0000000
--- a/bundles/org.eclipse.ui.forms/icons/progress/ani/8.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.forms/plugin.properties b/bundles/org.eclipse.ui.forms/plugin.properties
deleted file mode 100644
index 3bdea13..0000000
--- a/bundles/org.eclipse.ui.forms/plugin.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-#
-# plugin.xml properties
-#
-
-name = Eclipse Forms
-provider-name = Eclipse.org
-
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/AbstractFormPart.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/AbstractFormPart.java
deleted file mode 100644
index 86e797a..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/AbstractFormPart.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms;
-/**
- * AbstractFormPart implements IFormPart interface and can be used as a
- * convenient base class for concrete form parts. If a method contains
- * code that must be called, look for instructions to call 'super'
- * when overriding.
- * 
- * @see org.eclipse.ui.forms.widgets.Section
- * @since 3.0
- */
-public abstract class AbstractFormPart implements IFormPart {
-	private IManagedForm managedForm;
-	private boolean dirty = false;
-	private boolean stale = true;
-	/**
-	 * @see org.eclipse.ui.forms.IFormPart#initialize(org.eclipse.ui.forms.IManagedForm)
-	 */
-	public void initialize(IManagedForm form) {
-		this.managedForm = form;
-	}
-	/**
-	 * Returns the form that manages this part.
-	 * 
-	 * @return the managed form
-	 */
-	public IManagedForm getManagedForm() {
-		return managedForm;
-	}
-	/**
-	 * Disposes the part. Subclasses should override to release any system
-	 * resources.
-	 */
-	public void dispose() {
-	}
-	/**
-	 * Commits the part. Subclasses should call 'super' when overriding.
-	 * 
-	 * @param onSave
-	 *            <code>true</code> if the request to commit has arrived as a
-	 *            result of the 'save' action.
-	 */
-	public void commit(boolean onSave) {
-		dirty = false;
-	}
-	/**
-	 * Sets the overall form input. Subclases may elect to override the method
-	 * and adjust according to the form input.
-	 * 
-	 * @param input
-	 *            the form input object
-	 * @return <code>false</code>
-	 */
-	public boolean setFormInput(Object input) {
-		return false;
-	}
-	/**
-	 * Instructs the part to grab keyboard focus.
-	 */
-	public void setFocus() {
-	}
-	/**
-	 * Refreshes the section after becoming stale (falling behind data in the
-	 * model). Subclasses must call 'super' when overriding this method.
-	 */
-	public void refresh() {
-		stale = false;
-		// since we have refreshed, any changes we had in the
-		// part are gone and we are not dirty
-		dirty = false;
-	}
-	/**
-	 * Marks the part dirty. Subclasses should call this method as a result of
-	 * user interaction with the widgets in the section.
-	 */
-	public void markDirty() {
-		dirty = true;
-		managedForm.dirtyStateChanged();
-	}
-	/**
-	 * Tests whether the part is dirty i.e. its widgets have state that is
-	 * newer than the data in the model.
-	 * 
-	 * @return <code>true</code> if the part is dirty, <code>false</code>
-	 *         otherwise.
-	 */
-	public boolean isDirty() {
-		return dirty;
-	}
-	/**
-	 * Tests whether the part is stale i.e. its widgets have state that is
-	 * older than the data in the model.
-	 * 
-	 * @return <code>true</code> if the part is stale, <code>false</code>
-	 *         otherwise.
-	 */
-	public boolean isStale() {
-		return stale;
-	}
-	/**
-	 * Marks the part stale. Subclasses should call this method as a result of
-	 * model notification that indicates that the content of the section is no
-	 * longer in sync with the model.
-	 */
-	public void markStale() {
-		stale = true;
-		managedForm.staleStateChanged();
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/DetailsPart.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/DetailsPart.java
deleted file mode 100644
index 0890fa7..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/DetailsPart.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms;
-
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Iterator;
-
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.forms.widgets.ScrolledPageBook;
-/**
- * This managed form part handles the 'details' portion of the 
- * 'master/details' block. It has a page book that manages pages
- * of details registered for the current selection.
- * <p>By default, details part accepts any number of pages.
- * If dynamic page provider is registered, this number may
- * be excessive. To avoid running out of steam (by creating 
- * a large number of pages with widgets on each), maximum
- * number of pages can be set to some reasonable value (e.g. 10).
- * When this number is reached, old pages (those created first)
- * will be removed and disposed as new ones are added. If
- * the disposed pages are needed again after that, they
- * will be created again.
- * 
- * @since 3.0
- */
-public final class DetailsPart implements IFormPart, IPartSelectionListener {
-	private IManagedForm managedForm;
-	private ScrolledPageBook pageBook;
-	private IFormPart masterPart;
-	private IStructuredSelection currentSelection;
-	private Hashtable pages;
-	private IDetailsPageProvider pageProvider;
-	private int pageLimit=Integer.MAX_VALUE;
-	
-	private static class PageBag {
-		private static int counter;
-		private int ticket;
-		private IDetailsPage page;
-		private boolean fixed;
-		
-		public PageBag(IDetailsPage page, boolean fixed) {
-			this.page= page;
-			this.fixed = fixed;
-			this.ticket = ++counter;
-		}
-		public int getTicket() {
-			return ticket;
-		}
-		public IDetailsPage getPage() {
-			return page;
-		}
-		public void dispose() {
-			page.dispose();
-			page=null;
-		}
-		public boolean isDisposed() {
-			return page==null;
-		}
-		public boolean isFixed() {
-			return fixed;
-		}
-		public static int getCurrentTicket() {
-			return counter;
-		}
-	}
-/**
- * Creates a details part by wrapping the provided page book.
- * @param mform the parent form
- * @param pageBook the page book to wrap
- */	
-	public DetailsPart(IManagedForm mform, ScrolledPageBook pageBook) {
-		this.pageBook = pageBook;
-		pages = new Hashtable();
-		initialize(mform);
-	}
-/**
- * Creates a new details part in the provided form by creating 
- * the page book.
- * @param mform the parent form
- * @param parent the composite to create the page book in
- * @param style the style for the page book
- */
-	public DetailsPart(IManagedForm mform, Composite parent, int style) {
-		this(mform, mform.getToolkit().createPageBook(parent, style|SWT.V_SCROLL|SWT.H_SCROLL));
-	}
-/**
- * Registers the details page to be used for all the objects of
- * the provided object class.
- * @param objectClass an object of type 'java.lang.Class' to be used 
- * as a key for the provided page
- * @param page the page to show for objects of the provided object class
- */
-	public void registerPage(Object objectClass, IDetailsPage page) {
-		registerPage(objectClass, page, true);
-	}
-	
-	private void registerPage(Object objectClass, IDetailsPage page, boolean fixed) {
-		pages.put(objectClass, new PageBag(page, fixed));
-		page.initialize(managedForm);
-	}
-/**
- * Sets the dynamic page provider. The dynamic provider can return
- * different pages for objects of the same class based on their state.
- * @param provider the provider to use
- */
-	public void setPageProvider(IDetailsPageProvider provider) {
-		this.pageProvider = provider;
-	}
-/**
- * Commits the part by committing the current page.
- * @param onSave <code>true</code> if commit is requested as a result
- * of the 'save' action, <code>false</code> otherwise.
- */
-	public void commit(boolean onSave) {
-		IDetailsPage page = getCurrentPage();
-		if (page != null)
-			page.commit(onSave);
-	}
-/**
- * Returns the current page visible in the part.
- * @return the current page
- */
-	public IDetailsPage getCurrentPage() {
-		Control control = pageBook.getCurrentPage();
-		if (control != null) {
-			Object data = control.getData();
-			if (data instanceof IDetailsPage)
-				return (IDetailsPage) data;
-		}
-		return null;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IFormPart#dispose()
-	 */
-	public void dispose() {
-		for (Enumeration enm = pages.elements(); enm.hasMoreElements();) {
-			PageBag pageBag = (PageBag) enm.nextElement();
-			pageBag.dispose();
-		}
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IFormPart#initialize(org.eclipse.ui.forms.IManagedForm)
-	 */
-	public void initialize(IManagedForm form) {
-		this.managedForm = form;
-	}
-/**
- * Tests if the currently visible page is dirty.
- * @return <code>true</code> if the page is dirty, <code>false</code> otherwise.
- */
-	public boolean isDirty() {
-		IDetailsPage page = getCurrentPage();
-		if (page != null)
-			return page.isDirty();
-		return false;
-	}
-/**
- * Tests if the currently visible page is stale and needs refreshing.
- * @return <code>true</code> if the page is stale, <code>false</code> otherwise.
- */	
-	public boolean isStale() {
-		IDetailsPage page = getCurrentPage();
-		if (page != null)
-			return page.isStale();
-		return false;
-	}
-
-/**
- * Refreshes the current page.
- */
-	public void refresh() {
-		IDetailsPage page = getCurrentPage();
-		if (page != null)
-			page.refresh();
-	}
-/**
- * Sets the focus to the currently visible page.
- */
-	public void setFocus() {
-		IDetailsPage page = getCurrentPage();
-		if (page != null)
-			page.setFocus();
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IFormPart#setFormInput(java.lang.Object)
-	 */
-	public boolean setFormInput(Object input) {
-		return false;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IPartSelectionListener#selectionChanged(org.eclipse.ui.forms.IFormPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IFormPart part, ISelection selection) {
-		this.masterPart = part;
-		if (currentSelection != null) {
-		}
-		if (selection instanceof IStructuredSelection)
-			currentSelection = (IStructuredSelection) selection;
-		else
-			currentSelection = null;
-		update();
-	}
-	private void update() {
-		Object key = null;
-		if (currentSelection != null) {
-			for (Iterator iter = currentSelection.iterator(); iter.hasNext();) {
-				Object obj = iter.next();
-				if (key == null)
-					key = getKey(obj);
-				else if (getKey(obj).equals(key) == false) {
-					key = null;
-					break;
-				}
-			}
-		}
-		showPage(key);
-	}
-	private Object getKey(Object object) {
-		if (pageProvider!=null) {
-			Object key = pageProvider.getPageKey(object);
-			if (key!=null)
-				return key;
-		}
-		return object.getClass();
-	}
-	private void showPage(final Object key) {
-		checkLimit();
-		final IDetailsPage oldPage = getCurrentPage();
-		if (key != null) {
-			PageBag pageBag = (PageBag)pages.get(key);
-			IDetailsPage page = pageBag!=null?pageBag.getPage():null;
-			if (page==null) {
-				// try to get the page dynamically from the provider
-				if (pageProvider!=null) {
-					page = pageProvider.getPage(key);
-					if (page!=null) {
-						registerPage(key, page, false);
-					}
-				}
-			}
-			if (page != null) {
-				final IDetailsPage fpage = page;
-				BusyIndicator.showWhile(pageBook.getDisplay(), new Runnable() {
-					public void run() {
-						if (!pageBook.hasPage(key)) {
-							Composite parent = pageBook.createPage(key);
-							fpage.createContents(parent);
-							parent.setData(fpage);
-						}
-						//commit the current page
-						if (oldPage!=null && oldPage.isDirty())
-							oldPage.commit(false);
-						//refresh the new page
-						if (fpage.isStale())
-							fpage.refresh();
-						fpage.selectionChanged(masterPart, currentSelection);
-						pageBook.showPage(key);
-					}
-				});
-				return;
-			}
-		}
-		// If we are switching from an old page to nothing,
-		// don't loose data 
-		if (oldPage!=null && oldPage.isDirty())
-			oldPage.commit(false);
-		pageBook.showEmptyPage();
-	}
-	private void checkLimit() {
-		if (pages.size() <= getPageLimit()) return;
-		// overflow
-		int currentTicket = PageBag.getCurrentTicket();
-		int cutoffTicket = currentTicket - getPageLimit();
-		for (Enumeration enm=pages.keys(); enm.hasMoreElements();) {
-			Object key = enm.nextElement();
-			PageBag pageBag = (PageBag)pages.get(key);
-			if (pageBag.getTicket()<=cutoffTicket) {
-				// candidate - see if it is active and not fixed
-				if (!pageBag.isFixed() && !pageBag.getPage().equals(getCurrentPage())) {
-					// drop it
-					pageBag.dispose();
-					pages.remove(key);
-					pageBook.removePage(key, false);				
-				}
-			}
-		}
-	}
-	/**
-	 * Returns the maximum number of pages that should be
-	 * maintained in this part. When an attempt is made to
-	 * add more pages, old pages are removed and disposed
-	 * based on the order of creation (the oldest pages
-	 * are removed). The exception is made for the 
-	 * page that should otherwise be disposed but is
-	 * currently active.
-	 * @return maximum number of pages for this part
-	 */
-	public int getPageLimit() {
-		return pageLimit;
-	}
-	/**
-	 * Sets the page limit for this part. 
-	 * @see #getPageLimit()
-	 * @param pageLimit the maximum number of pages that
-	 * should be maintained in this part.
-	 */
-	public void setPageLimit(int pageLimit) {
-		this.pageLimit = pageLimit;
-		checkLimit();
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/FormColors.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/FormColors.java
deleted file mode 100644
index 6529b6a..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/FormColors.java
+++ /dev/null
@@ -1,742 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.resource.LocalResourceManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Manages colors that will be applied to forms and form widgets. The colors are
- * chosen to make the widgets look correct in the editor area. If a different
- * set of colors is needed, subclass this class and override 'initialize' and/or
- * 'initializeColors'.
- * 
- * @since 3.0
- */
-public class FormColors {
-	/**
-	 * Key for the form title foreground color.
-	 * 
-	 * @deprecated use <code>IFormColors.TITLE</code>.
-	 */
-	public static final String TITLE = IFormColors.TITLE;
-
-	/**
-	 * Key for the tree/table border color.
-	 * 
-	 * @deprecated use <code>IFormColors.BORDER</code>
-	 */
-	public static final String BORDER = IFormColors.BORDER;
-
-	/**
-	 * Key for the section separator color.
-	 * 
-	 * @deprecated use <code>IFormColors.SEPARATOR</code>.
-	 */
-	public static final String SEPARATOR = IFormColors.SEPARATOR;
-
-	/**
-	 * Key for the section title bar background.
-	 * 
-	 * @deprecated use <code>IFormColors.TB_BG
-	 */
-	public static final String TB_BG = IFormColors.TB_BG;
-
-	/**
-	 * Key for the section title bar foreground.
-	 * 
-	 * @deprecated use <code>IFormColors.TB_FG</code>
-	 */
-	public static final String TB_FG = IFormColors.TB_FG;
-
-	/**
-	 * Key for the section title bar gradient.
-	 * 
-	 * @deprecated use <code>IFormColors.TB_GBG</code>
-	 */
-	public static final String TB_GBG = IFormColors.TB_GBG;
-
-	/**
-	 * Key for the section title bar border.
-	 * 
-	 * @deprecated use <code>IFormColors.TB_BORDER</code>.
-	 */
-	public static final String TB_BORDER = IFormColors.TB_BORDER;
-
-	/**
-	 * Key for the section toggle color. Since 3.1, this color is used for all
-	 * section styles.
-	 * 
-	 * @deprecated use <code>IFormColors.TB_TOGGLE</code>.
-	 */
-	public static final String TB_TOGGLE = IFormColors.TB_TOGGLE;
-
-	/**
-	 * Key for the section toggle hover color.
-	 * 
-	 * @since 3.1
-	 * @deprecated use <code>IFormColors.TB_TOGGLE_HOVER</code>.
-	 */
-	public static final String TB_TOGGLE_HOVER = IFormColors.TB_TOGGLE_HOVER;
-
-	protected Map colorRegistry = new HashMap(10);
-	
-	private LocalResourceManager resources;
-
-	protected Color background;
-
-	protected Color foreground;
-
-	private boolean shared;
-
-	protected Display display;
-
-	protected Color border;
-
-	/**
-	 * Creates form colors using the provided display.
-	 * 
-	 * @param display
-	 *            the display to use
-	 */
-	public FormColors(Display display) {
-		this.display = display;
-		initialize();
-	}
-
-	/**
-	 * Returns the display used to create colors.
-	 * 
-	 * @return the display
-	 */
-	public Display getDisplay() {
-		return display;
-	}
-
-	/**
-	 * Initializes the colors. Subclasses can override this method to change the
-	 * way colors are created. Alternatively, only the color table can be
-	 * modified by overriding <code>initializeColorTable()</code>.
-	 * 
-	 * @see #initializeColorTable
-	 */
-	protected void initialize() {
-		background = display.getSystemColor(SWT.COLOR_LIST_BACKGROUND);
-		foreground = display.getSystemColor(SWT.COLOR_LIST_FOREGROUND);
-		initializeColorTable();
-		updateBorderColor();
-	}
-
-	/**
-	 * Allocates colors for the following keys: BORDER, SEPARATOR and
-	 * TITLE. Subclasses can override to allocate these colors differently.
-	 */
-	protected void initializeColorTable() {
-		createTitleColor();
-		createColor(IFormColors.SEPARATOR, getColor(IFormColors.TITLE).getRGB());
-		RGB black = getSystemColor(SWT.COLOR_BLACK);
-		RGB borderRGB = getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT);
-		createColor(IFormColors.BORDER, blend(borderRGB, black, 80));
-	}
-
-	/**
-	 * Allocates colors for the section tool bar (all the keys that start with
-	 * TB). Since these colors are only needed when TITLE_BAR style is used with
-	 * the Section widget, they are not needed all the time and are allocated on
-	 * demand. Consequently, this method will do nothing if the colors have been
-	 * already initialized. Call this method prior to using colors with the TB
-	 * keys to ensure they are available.
-	 */
-	public void initializeSectionToolBarColors() {
-		if (colorRegistry.containsKey(IFormColors.TB_BG))
-			return;
-		createTitleBarGradientColors();
-		createTitleBarOutlineColors();
-		createTwistieColors();
-	}
-
-	/**
-	 * Allocates additional colors for the form header, namely background
-	 * gradients, bottom separator keylines and DND highlights. Since these
-	 * colors are only needed for clients that want to use these particular
-	 * style of header rendering, they are not needed all the time and are
-	 * allocated on demand. Consequently, this method will do nothing if the
-	 * colors have been already initialized. Call this method prior to using
-	 * color keys with the H_ prefix to ensure they are available.
-	 * 
-	 * @since 3.3
-	 */
-	protected void initializeFormHeaderColors() {
-		if (colorRegistry.containsKey(IFormColors.H_BOTTOM_KEYLINE2))
-			return;
-		createFormHeaderColors();
-	}
-
-	/**
-	 * Returns the RGB value of the system color represented by the code
-	 * argument, as defined in <code>SWT</code> class.
-	 * 
-	 * @param code
-	 *            the system color constant as defined in <code>SWT</code>
-	 *            class.
-	 * @return the RGB value of the system color
-	 */
-	public RGB getSystemColor(int code) {
-		return getDisplay().getSystemColor(code).getRGB();
-	}
-
-	/**
-	 * Creates the color for the specified key using the provided RGB object.
-	 * The color object will be returned and also put into the registry. When
-	 * the class is disposed, the color will be disposed with it.
-	 * 
-	 * @param key
-	 *            the unique color key
-	 * @param rgb
-	 *            the RGB object
-	 * @return the allocated color object
-	 */
-	public Color createColor(String key, RGB rgb) {
-		Color c = getResourceManager().createColor(rgb);
-		Color prevC = (Color) colorRegistry.get(key);
-		if (prevC != null && !prevC.isDisposed())
-			getResourceManager().destroyColor(prevC.getRGB());
-		colorRegistry.put(key, c);
-		return c;
-	}
-
-	/**
-	 * Creates a color that can be used for areas of the form that is inactive.
-	 * These areas can contain images, links, controls and other content but are
-	 * considered auxilliary to the main content area.
-	 * 
-	 * <p>
-	 * The color should not be disposed because it is managed by this class.
-	 * 
-	 * @return the inactive form color
-	 * @since 3.1
-	 */
-	public Color getInactiveBackground() {
-		String key = "__ncbg__"; //$NON-NLS-1$
-		Color color = getColor(key);
-		if (color == null) {
-			RGB sel = getSystemColor(SWT.COLOR_LIST_SELECTION);
-			// a blend of 95% white and 5% list selection system color
-			RGB ncbg = blend(sel, getSystemColor(SWT.COLOR_WHITE), 5);
-			color = createColor(key, ncbg);
-		}
-		return color;
-	}
-
-	/**
-	 * Creates the color for the specified key using the provided RGB values.
-	 * The color object will be returned and also put into the registry. If
-	 * there is already another color object under the same key in the registry,
-	 * the existing object will be disposed. When the class is disposed, the
-	 * color will be disposed with it.
-	 * 
-	 * @param key
-	 *            the unique color key
-	 * @param r
-	 *            red value
-	 * @param g
-	 *            green value
-	 * @param b
-	 *            blue value
-	 * @return the allocated color object
-	 */
-	public Color createColor(String key, int r, int g, int b) {
-		return createColor(key, new RGB(r,g,b));
-	}
-
-	/**
-	 * Computes the border color relative to the background. Allocated border
-	 * color is designed to work well with white. Otherwise, stanard widget
-	 * background color will be used.
-	 */
-	protected void updateBorderColor() {
-		if (isWhiteBackground())
-			border = getColor(IFormColors.BORDER);
-		else {
-			border = display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
-			Color bg = getImpliedBackground();
-			if (border.getRed() == bg.getRed()
-					&& border.getGreen() == bg.getGreen()
-					&& border.getBlue() == bg.getBlue())
-				border = display.getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW);
-		}
-	}
-
-	/**
-	 * Sets the background color. All the toolkits that use this class will
-	 * share the same background.
-	 * 
-	 * @param bg
-	 *            background color
-	 */
-	public void setBackground(Color bg) {
-		this.background = bg;
-		updateBorderColor();
-		updateFormHeaderColors();
-	}
-
-	/**
-	 * Sets the foreground color. All the toolkits that use this class will
-	 * share the same foreground.
-	 * 
-	 * @param fg
-	 *            foreground color
-	 */
-	public void setForeground(Color fg) {
-		this.foreground = fg;
-	}
-
-	/**
-	 * Returns the current background color.
-	 * 
-	 * @return the background color
-	 */
-	public Color getBackground() {
-		return background;
-	}
-
-	/**
-	 * Returns the current foreground color.
-	 * 
-	 * @return the foreground color
-	 */
-	public Color getForeground() {
-		return foreground;
-	}
-
-	/**
-	 * Returns the computed border color. Border color depends on the background
-	 * and is recomputed whenever the background changes.
-	 * 
-	 * @return the current border color
-	 */
-	public Color getBorderColor() {
-		return border;
-	}
-
-	/**
-	 * Tests if the background is white. White background has RGB value
-	 * 255,255,255.
-	 * 
-	 * @return <samp>true</samp> if background is white, <samp>false</samp>
-	 *         otherwise.
-	 */
-	public boolean isWhiteBackground() {
-		Color bg = getImpliedBackground();
-		return bg.getRed() == 255 && bg.getGreen() == 255
-				&& bg.getBlue() == 255;
-	}
-
-	/**
-	 * Returns the color object for the provided key or <samp>null </samp> if
-	 * not in the registry.
-	 * 
-	 * @param key
-	 *            the color key
-	 * @return color object if found, or <samp>null </samp> if not.
-	 */
-	public Color getColor(String key) {
-		if (key.startsWith(IFormColors.TB_PREFIX))
-			initializeSectionToolBarColors();
-		else if (key.startsWith(IFormColors.H_PREFIX))
-			initializeFormHeaderColors();
-		return (Color) colorRegistry.get(key);
-	}
-
-	/**
-	 * Disposes all the colors in the registry.
-	 */
-	public void dispose() {
-		if (resources != null)
-			resources.dispose();
-		resources = null;
-		colorRegistry = null;
-	}
-
-	/**
-	 * Marks the colors shared. This prevents toolkits that share this object
-	 * from disposing it.
-	 */
-	public void markShared() {
-		this.shared = true;
-	}
-
-	/**
-	 * Tests if the colors are shared.
-	 * 
-	 * @return <code>true</code> if shared, <code>false</code> otherwise.
-	 */
-	public boolean isShared() {
-		return shared;
-	}
-
-	/**
-	 * Blends c1 and c2 based in the provided ratio.
-	 * 
-	 * @param c1
-	 *            first color
-	 * @param c2
-	 *            second color
-	 * @param ratio
-	 *            percentage of the first color in the blend (0-100)
-	 * @return the RGB value of the blended color
-	 * @since 3.1
-	 */
-	public static RGB blend(RGB c1, RGB c2, int ratio) {
-		int r = blend(c1.red, c2.red, ratio);
-		int g = blend(c1.green, c2.green, ratio);
-		int b = blend(c1.blue, c2.blue, ratio);
-		return new RGB(r, g, b);
-	}
-
-	/**
-	 * Tests the source RGB for range.
-	 * 
-	 * @param rgb
-	 *            the tested RGB
-	 * @param from
-	 *            range start (excluding the value itself)
-	 * @param to
-	 *            range end (excluding the value itself)
-	 * @return <code>true</code> if at least one of the primary colors in the
-	 *         source RGB are within the provided range, <code>false</code>
-	 *         otherwise.
-	 * @since 3.1
-	 */
-	public static boolean testAnyPrimaryColor(RGB rgb, int from, int to) {
-		if (testPrimaryColor(rgb.red, from, to))
-			return true;
-		if (testPrimaryColor(rgb.green, from, to))
-			return true;
-		if (testPrimaryColor(rgb.blue, from, to))
-			return true;
-		return false;
-	}
-
-	/**
-	 * Tests the source RGB for range.
-	 * 
-	 * @param rgb
-	 *            the tested RGB
-	 * @param from
-	 *            range start (excluding the value itself)
-	 * @param to
-	 *            tange end (excluding the value itself)
-	 * @return <code>true</code> if at least two of the primary colors in the
-	 *         source RGB are within the provided range, <code>false</code>
-	 *         otherwise.
-	 * @since 3.1
-	 */
-	public static boolean testTwoPrimaryColors(RGB rgb, int from, int to) {
-		int total = 0;
-		if (testPrimaryColor(rgb.red, from, to))
-			total++;
-		if (testPrimaryColor(rgb.green, from, to))
-			total++;
-		if (testPrimaryColor(rgb.blue, from, to))
-			total++;
-		return total >= 2;
-	}
-
-	/**
-	 * Blends two primary color components based on the provided ratio.
-	 * 
-	 * @param v1
-	 *            first component
-	 * @param v2
-	 *            second component
-	 * @param ratio
-	 *            percentage of the first component in the blend
-	 * @return
-	 */
-	private static int blend(int v1, int v2, int ratio) {
-		int b = (ratio * v1 + (100 - ratio) * v2) / 100;
-		return Math.min(255, b);
-	}
-
-	private Color getImpliedBackground() {
-		if (getBackground() != null)
-			return getBackground();
-		return getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
-	}
-
-	private static boolean testPrimaryColor(int value, int from, int to) {
-		return value > from && value < to;
-	}
-
-	private void createTitleColor() {
-		/*
-		 * RGB rgb = getSystemColor(SWT.COLOR_LIST_SELECTION); // test too light
-		 * if (testTwoPrimaryColors(rgb, 120, 151)) rgb = blend(rgb, BLACK, 80);
-		 * else if (testTwoPrimaryColors(rgb, 150, 256)) rgb = blend(rgb, BLACK,
-		 * 50); createColor(TITLE, rgb);
-		 */
-		RGB bg = getImpliedBackground().getRGB();
-		RGB listSelection = getSystemColor(SWT.COLOR_LIST_SELECTION);
-		RGB listForeground = getSystemColor(SWT.COLOR_LIST_FOREGROUND);
-		RGB rgb = listSelection;
-
-		// Group 1
-		// Rule: If at least 2 of the LIST_SELECTION RGB values are equal to or
-		// between 0 and 120, then use 100% LIST_SELECTION as it is (no
-		// additions)
-		// Examples: XP Default, Win Classic Standard, Win High Con White, Win
-		// Classic Marine
-		if (testTwoPrimaryColors(listSelection, -1, 121))
-			rgb = listSelection;
-		// Group 2
-		// When LIST_BACKGROUND = white (255, 255, 255) or not black, text
-		// colour = LIST_SELECTION @ 100% Opacity + 50% LIST_FOREGROUND over
-		// LIST_BACKGROUND
-		// Rule: If at least 2 of the LIST_SELECTION RGB values are equal to or
-		// between 121 and 255, then add 50% LIST_FOREGROUND to LIST_SELECTION
-		// foreground colour
-		// Examples: Win Vista, XP Silver, XP Olive , Win Classic Plum, OSX
-		// Aqua, OSX Graphite, Linux GTK
-		else if (testTwoPrimaryColors(listSelection, 120, 256)
-				|| (bg.red == 0 && bg.green == 0 && bg.blue == 0))
-			rgb = blend(listSelection, listForeground, 50);
-		// Group 3
-		// When LIST_BACKGROUND = black (0, 0, 0), text colour = LIST_SELECTION
-		// @ 100% Opacity + 50% LIST_FOREGROUND over LIST_BACKGROUND
-		// Rule: If LIST_BACKGROUND = 0, 0, 0, then add 50% LIST_FOREGROUND to
-		// LIST_SELECTION foreground colour
-		// Examples: Win High Con Black, Win High Con #1, Win High Con #2
-		// (covered in the second part of the OR clause above)
-		createColor(IFormColors.TITLE, rgb);
-	}
-
-	private void createTwistieColors() {
-		RGB rgb = getColor(IFormColors.TITLE).getRGB();
-		RGB white = getSystemColor(SWT.COLOR_WHITE);
-		createColor(TB_TOGGLE, rgb);
-		rgb = blend(rgb, white, 60);
-		createColor(TB_TOGGLE_HOVER, rgb);
-	}
-
-	private void createTitleBarGradientColors() {
-		RGB tbBg = getSystemColor(SWT.COLOR_TITLE_BACKGROUND);
-		RGB bg = getImpliedBackground().getRGB();
-
-		// Group 1
-		// Rule: If at least 2 of the RGB values are equal to or between 180 and
-		// 255, then apply specified opacity for Group 1
-		// Examples: Vista, XP Silver, Wn High Con #2
-		// Gradient Bottom = TITLE_BACKGROUND @ 30% Opacity over LIST_BACKGROUND
-		// Gradient Top = TITLE BACKGROUND @ 0% Opacity over LIST_BACKGROUND
-		if (testTwoPrimaryColors(tbBg, 179, 256))
-			tbBg = blend(tbBg, bg, 30);
-
-		// Group 2
-		// Rule: If at least 2 of the RGB values are equal to or between 121 and
-		// 179, then apply specified opacity for Group 2
-		// Examples: XP Olive, OSX Graphite, Linux GTK, Wn High Con Black
-		// Gradient Bottom = TITLE_BACKGROUND @ 20% Opacity over LIST_BACKGROUND
-		// Gradient Top = TITLE BACKGROUND @ 0% Opacity over LIST_BACKGROUND
-		else if (testTwoPrimaryColors(tbBg, 120, 180))
-			tbBg = blend(tbBg, bg, 20);
-
-		// Group 3
-		// Rule: Everything else
-		// Examples: XP Default, Wn Classic Standard, Wn Marine, Wn Plum, OSX
-		// Aqua, Wn High Con White, Wn High Con #1
-		// Gradient Bottom = TITLE_BACKGROUND @ 10% Opacity over LIST_BACKGROUND
-		// Gradient Top = TITLE BACKGROUND @ 0% Opacity over LIST_BACKGROUND
-		else {
-			tbBg = blend(tbBg, bg, 10);
-		}
-
-		createColor(IFormColors.TB_BG, tbBg);
-		
-		// for backward compatibility
-		createColor(TB_GBG, tbBg);
-	}
-
-	private void createTitleBarOutlineColors() {
-		// title bar outline - border color
-		RGB tbBorder = getSystemColor(SWT.COLOR_TITLE_BACKGROUND);
-		RGB bg = getImpliedBackground().getRGB();
-		// Group 1
-		// Rule: If at least 2 of the RGB values are equal to or between 180 and
-		// 255, then apply specified opacity for Group 1
-		// Examples: Vista, XP Silver, Wn High Con #2
-		// Keyline = TITLE_BACKGROUND @ 70% Opacity over LIST_BACKGROUND
-		if (testTwoPrimaryColors(tbBorder, 179, 256))
-			tbBorder = blend(tbBorder, bg, 70);
-
-		// Group 2
-		// Rule: If at least 2 of the RGB values are equal to or between 121 and
-		// 179, then apply specified opacity for Group 2
-		// Examples: XP Olive, OSX Graphite, Linux GTK, Wn High Con Black
-
-		// Keyline = TITLE_BACKGROUND @ 50% Opacity over LIST_BACKGROUND
-		else if (testTwoPrimaryColors(tbBorder, 120, 180))
-			tbBorder = blend(tbBorder, bg, 50);
-
-		// Group 3
-		// Rule: Everything else
-		// Examples: XP Default, Wn Classic Standard, Wn Marine, Wn Plum, OSX
-		// Aqua, Wn High Con White, Wn High Con #1
-
-		// Keyline = TITLE_BACKGROUND @ 30% Opacity over LIST_BACKGROUND
-		else {
-			tbBorder = blend(tbBorder, bg, 30);
-		}
-		createColor(FormColors.TB_BORDER, tbBorder);
-	}
-
-	private void updateFormHeaderColors() {
-		if (colorRegistry.containsKey(IFormColors.H_GRADIENT_END)) {
-			disposeIfFound(IFormColors.H_GRADIENT_END);
-			disposeIfFound(IFormColors.H_GRADIENT_START);
-			disposeIfFound(IFormColors.H_BOTTOM_KEYLINE1);
-			disposeIfFound(IFormColors.H_BOTTOM_KEYLINE2);
-			disposeIfFound(IFormColors.H_HOVER_LIGHT);
-			disposeIfFound(IFormColors.H_HOVER_FULL);
-			initializeFormHeaderColors();
-		}
-	}
-
-	private void disposeIfFound(String key) {
-		Color color = getColor(key);
-		if (color != null) {
-			colorRegistry.remove(key);
-			color.dispose();
-		}
-	}
-
-	private void createFormHeaderColors() {
-		createFormHeaderGradientColors();
-		createFormHeaderKeylineColors();
-		createFormHeaderDNDColors();
-	}
-
-	private void createFormHeaderGradientColors() {
-		RGB titleBg = getSystemColor(SWT.COLOR_TITLE_BACKGROUND);
-		Color bgColor = getImpliedBackground();
-		RGB bg = bgColor.getRGB();
-		RGB bottom, top;
-		// Group 1
-		// Rule: If at least 2 of the RGB values are equal to or between 180 and
-		// 255, then apply specified opacity for Group 1
-		// Examples: Vista, XP Silver, Wn High Con #2
-		// Gradient Bottom = TITLE_BACKGROUND @ 30% Opacity over LIST_BACKGROUND
-		// Gradient Top = TITLE BACKGROUND @ 0% Opacity over LIST_BACKGROUND
-		if (testTwoPrimaryColors(titleBg, 179, 256)) {
-			bottom = blend(titleBg, bg, 30);
-			top = bg;
-		}
-
-		// Group 2
-		// Rule: If at least 2 of the RGB values are equal to or between 121 and
-		// 179, then apply specified opacity for Group 2
-		// Examples: XP Olive, OSX Graphite, Linux GTK, Wn High Con Black
-		// Gradient Bottom = TITLE_BACKGROUND @ 20% Opacity over LIST_BACKGROUND
-		// Gradient Top = TITLE BACKGROUND @ 0% Opacity over LIST_BACKGROUND
-		else if (testTwoPrimaryColors(titleBg, 120, 180)) {
-			bottom = blend(titleBg, bg, 20);
-			top = bg;
-		}
-
-		// Group 3
-		// Rule: If at least 2 of the RGB values are equal to or between 0 and
-		// 120, then apply specified opacity for Group 3
-		// Examples: XP Default, Wn Classic Standard, Wn Marine, Wn Plum, OSX
-		// Aqua, Wn High Con White, Wn High Con #1
-		// Gradient Bottom = TITLE_BACKGROUND @ 10% Opacity over LIST_BACKGROUND
-		// Gradient Top = TITLE BACKGROUND @ 0% Opacity over LIST_BACKGROUND
-		else {
-			bottom = blend(titleBg, bg, 10);
-			top = bg;
-		}
-		createColor(IFormColors.H_GRADIENT_END, top);
-		createColor(IFormColors.H_GRADIENT_START, bottom);
-	}
-
-	private void createFormHeaderKeylineColors() {
-		RGB titleBg = getSystemColor(SWT.COLOR_TITLE_BACKGROUND);
-		Color bgColor = getImpliedBackground();
-		RGB bg = bgColor.getRGB();
-		RGB keyline2;
-		// H_BOTTOM_KEYLINE1
-		createColor(IFormColors.H_BOTTOM_KEYLINE1, new RGB(255, 255, 255));
-
-		// H_BOTTOM_KEYLINE2
-		// Group 1
-		// Rule: If at least 2 of the RGB values are equal to or between 180 and
-		// 255, then apply specified opacity for Group 1
-		// Examples: Vista, XP Silver, Wn High Con #2
-		// Keyline = TITLE_BACKGROUND @ 70% Opacity over LIST_BACKGROUND
-		if (testTwoPrimaryColors(titleBg, 179, 256))
-			keyline2 = blend(titleBg, bg, 70);
-
-		// Group 2
-		// Rule: If at least 2 of the RGB values are equal to or between 121 and
-		// 179, then apply specified opacity for Group 2
-		// Examples: XP Olive, OSX Graphite, Linux GTK, Wn High Con Black
-		// Keyline = TITLE_BACKGROUND @ 50% Opacity over LIST_BACKGROUND
-		else if (testTwoPrimaryColors(titleBg, 120, 180))
-			keyline2 = blend(titleBg, bg, 50);
-
-		// Group 3
-		// Rule: If at least 2 of the RGB values are equal to or between 0 and
-		// 120, then apply specified opacity for Group 3
-		// Examples: XP Default, Wn Classic Standard, Wn Marine, Wn Plum, OSX
-		// Aqua, Wn High Con White, Wn High Con #1
-
-		// Keyline = TITLE_BACKGROUND @ 30% Opacity over LIST_BACKGROUND
-		else
-			keyline2 = blend(titleBg, bg, 30);
-		// H_BOTTOM_KEYLINE2
-		createColor(IFormColors.H_BOTTOM_KEYLINE2, keyline2);
-	}
-
-	private void createFormHeaderDNDColors() {
-		RGB titleBg = getSystemColor(SWT.COLOR_TITLE_BACKGROUND_GRADIENT);
-		Color bgColor = getImpliedBackground();
-		RGB bg = bgColor.getRGB();
-		RGB light, full;
-		// ALL Themes
-		//
-		// Light Highlight
-		// When *near* the 'hot' area
-		// Rule: If near the title in the 'hot' area, show background highlight
-		// TITLE_BACKGROUND_GRADIENT @ 40%
-		light = blend(titleBg, bg, 40);
-		// Full Highlight
-		// When *on* the title area (regions 1 and 2)
-		// Rule: If near the title in the 'hot' area, show background highlight
-		// TITLE_BACKGROUND_GRADIENT @ 60%
-		full = blend(titleBg, bg, 60);
-		// H_DND_LIGHT
-		// H_DND_FULL
-		createColor(IFormColors.H_HOVER_LIGHT, light);
-		createColor(IFormColors.H_HOVER_FULL, full);
-	}
-	
-	private LocalResourceManager getResourceManager() {
-		if (resources == null)
-			resources = new LocalResourceManager(JFaceResources.getResources());
-		return resources;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/FormDialog.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/FormDialog.java
deleted file mode 100644
index f96e914..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/FormDialog.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms;
-
-import org.eclipse.jface.dialogs.TrayDialog;
-import org.eclipse.jface.window.IShellProvider;
-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.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.internal.forms.Messages;
-
-/**
- * A general-purpose dialog that hosts a form. Clients should extend the class
- * and override <code>createFormContent(IManagedForm)</code> protected method.
- * <p>
- * Since forms with wrapped text typically don't have a preferred size, it is
- * important to set the initial dialog size upon creation:
- * <p>
- * 
- * <pre>
- * MyFormDialog dialog = new MyFormDialog(shell);
- * dialog.create();
- * dialog.getShell().setSize(500, 500);
- * dialog.open();
- * </pre>
- * 
- * <p>
- * Otherwise, the dialog may open very wide.
- * <p>
- * 
- * @since 3.3
- */
-
-public class FormDialog extends TrayDialog {
-	private FormToolkit toolkit;
-
-	/**
-	 * Creates a new form dialog for a provided parent shell.
-	 * 
-	 * @param shell
-	 *            the parent shell
-	 */
-	public FormDialog(Shell shell) {
-		super(shell);
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-	}
-
-	/**
-	 * Creates a new form dialog for a provided parent shell provider.
-	 * 
-	 * @param parentShellProvider
-	 *            the parent shell provider
-	 */
-	public FormDialog(IShellProvider parentShellProvider) {
-		super(parentShellProvider);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.TrayDialog#close()
-	 */
-	public boolean close() {
-		boolean rcode = super.close();
-		toolkit.dispose();
-		return rcode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		toolkit = new FormToolkit(parent.getDisplay());
-		ScrolledForm sform = toolkit.createScrolledForm(parent);
-		sform.setLayoutData(new GridData(GridData.FILL_BOTH));
-		ManagedForm mform = new ManagedForm(toolkit, sform);
-		createFormContent(mform);
-		applyDialogFont(sform.getBody());
-		return sform;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.TrayDialog#createButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createButtonBar(Composite parent) {
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		//Composite sep = new Composite(parent, SWT.NULL);
-		//sep.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW));
-		//gd.heightHint = 1;
-		Label sep = new Label(parent, SWT.HORIZONTAL|SWT.SEPARATOR);
-		sep.setLayoutData(gd);
-		Control bar = super.createButtonBar(parent);
-		return bar;
-	}
-
-	/**
-	 * Configures the dialog form and creates form content. Clients should
-	 * override this method.
-	 * 
-	 * @param mform
-	 *            the dialog form
-	 */
-	protected void createFormContent(IManagedForm mform) {
-		mform.getForm().setText(Messages.FormDialog_defaultTitle);
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/HyperlinkGroup.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/HyperlinkGroup.java
deleted file mode 100644
index 3b3b757..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/HyperlinkGroup.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms;
-
-import java.util.ArrayList;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-
-/**
- * Manages a group of hyperlinks. It tracks activation, updates normal and
- * active colors and updates underline state depending on the underline
- * preference. Hyperlink labels are added to the group after creation and are
- * automatically removed from the group when they are disposed.
- * 
- * @since 3.0
- */
-
-public final class HyperlinkGroup extends HyperlinkSettings {
-	private ArrayList links = new ArrayList();
-	private Hyperlink lastActivated;
-	private Hyperlink lastEntered;
-	private GroupListener listener;
-	private boolean isActiveBackgroundSet;
-	private boolean isActiveForegroundSet;
-	private boolean isBackgroundSet;
-	private boolean isForegroundSet;
-
-	private class GroupListener implements Listener, IHyperlinkListener {
-		
-		private Color previousBackground;
-		private Color previousForeground;
-		
-		public void handleEvent(Event e) {
-			switch (e.type) {
-				case SWT.MouseEnter :
-					onMouseEnter(e);
-					break;
-				case SWT.MouseExit :
-					onMouseExit(e);
-					break;
-				case SWT.MouseDown :
-					onMouseDown(e);
-					break;
-				case SWT.Dispose :
-					unhook((Hyperlink) e.widget);
-					break;
-			}
-		}
-		private void onMouseEnter(Event e) {
-			Hyperlink link = (Hyperlink) e.widget;
-			previousBackground = link.getBackground();
-			previousForeground = link.getForeground();
-			if (isActiveBackgroundSet)
-				link.setBackground(getActiveBackground());
-			if (isActiveForegroundSet)
-				link.setForeground(getActiveForeground());
-			if (getHyperlinkUnderlineMode() == UNDERLINE_HOVER)
-				link.setUnderlined(true);
-			link.setCursor(getHyperlinkCursor());			
-		}
-		private void onMouseExit(Event e) {
-			Hyperlink link = (Hyperlink) e.widget;
-			if (isActiveBackgroundSet)
-				link.setBackground(previousBackground);
-			if (isActiveForegroundSet)
-				link.setForeground(previousForeground);
-			if (getHyperlinkUnderlineMode() == UNDERLINE_HOVER)
-				link.setUnderlined(false);
-		}
-		public void linkActivated(HyperlinkEvent e) {
-		}
-
-		public void linkEntered(HyperlinkEvent e) {
-			Hyperlink link = (Hyperlink) e.widget;
-			if (lastEntered != null) {
-				linkExited(lastEntered);
-			}
-			lastEntered = link;
-		}
-
-		public void linkExited(HyperlinkEvent e) {
-			linkExited((Hyperlink) e.widget);
-		}
-		private void linkExited(Hyperlink link) {
-			link.setCursor(null);
-			if (lastEntered == link)
-				lastEntered = null;
-		}
-	}
-
-	/**
-	 * Creates a hyperlink group.
-	 */
-
-	public HyperlinkGroup(Display display) {
-		super(display);
-		listener = new GroupListener();
-	}
-
-	/**
-	 * Returns the link that has been active the last, or <code>null</code>
-	 * if no link has been active yet or the last active link has been
-	 * disposed.
-	 * 
-	 * @return the last active link or <code>null</code>
-	 */
-	public Hyperlink getLastActivated() {
-		return lastActivated;
-	}
-	/**
-	 * Adds a hyperlink to the group to be jointly managed. Hyperlink will be
-	 * managed until it is disposed. Settings like colors, cursors and modes
-	 * will affect all managed hyperlinks.
-	 * 
-	 * @param link
-	 */
-
-	public void add(Hyperlink link) {
-		if (isBackgroundSet)
-			link.setBackground(getBackground());
-		if (isForegroundSet)
-			link.setForeground(getForeground());
-		if (getHyperlinkUnderlineMode() == UNDERLINE_ALWAYS)
-			link.setUnderlined(true);
-		hook(link);
-	}
-	
-	/**
-	 * Sets the new active hyperlink background for all the links.
-	 * 
-	 * @param newActiveBackground
-	 *            the new active background
-	 */
-	public void setActiveBackground(Color newActiveBackground) {
-		super.setActiveBackground(newActiveBackground);
-		isActiveBackgroundSet = true;
-	}
-	
-	/**
-	 * Sets the new active hyperlink foreground for all the links.
-	 * 
-	 * @param newActiveForeground
-	 *            the new active foreground
-	 */
-	public void setActiveForeground(Color newActiveForeground) {
-		super.setActiveForeground(newActiveForeground);
-		isActiveForegroundSet = true;
-	}
-	
-	/**
-	 * Sets the group background and also sets the background of all the
-	 * currently managed links.
-	 * 
-	 * @param bg
-	 *            the new background
-	 */
-	public void setBackground(Color bg) {
-		super.setBackground(bg);
-		isBackgroundSet = true;
-		if (links != null) {
-			for (int i = 0; i < links.size(); i++) {
-				Hyperlink label = (Hyperlink) links.get(i);
-				label.setBackground(bg);
-			}
-		}
-	}
-	/**
-	 * Sets the group foreground and also sets the background of all the
-	 * currently managed links.
-	 * 
-	 * @param fg
-	 *            the new foreground
-	 */
-	public void setForeground(Color fg) {
-		super.setForeground(fg);
-		isForegroundSet = true;
-		if (links != null) {
-			for (int i = 0; i < links.size(); i++) {
-				Hyperlink label = (Hyperlink) links.get(i);
-				label.setForeground(fg);
-			}
-		}
-	}
-	/**
-	 * Sets the hyperlink underline mode.
-	 * 
-	 * @param mode
-	 *            the new hyperlink underline mode
-	 * @see HyperlinkSettings
-	 */
-	public void setHyperlinkUnderlineMode(int mode) {
-		super.setHyperlinkUnderlineMode(mode);
-		if (links != null) {
-			for (int i = 0; i < links.size(); i++) {
-				Hyperlink label = (Hyperlink) links.get(i);
-				label.setUnderlined(mode == UNDERLINE_ALWAYS);
-			}
-		}
-	}
-
-	private void hook(Hyperlink link) {
-		link.addListener(SWT.MouseDown, listener);
-		link.addHyperlinkListener(listener);
-		link.addListener(SWT.Dispose, listener);
-		link.addListener(SWT.MouseEnter, listener);
-		link.addListener(SWT.MouseExit, listener);
-		links.add(link);
-	}
-
-	private void unhook(Hyperlink link) {
-		link.removeListener(SWT.MouseDown, listener);
-		link.removeHyperlinkListener(listener);
-		link.removeListener(SWT.MouseEnter, listener);
-		link.removeListener(SWT.MouseExit, listener);
-		if (lastActivated == link)
-			lastActivated = null;
-		if (lastEntered == link)
-			lastEntered = null;
-		links.remove(link);
-	}
-
-	private void onMouseDown(Event e) {
-		if (e.button == 1)
-			return;
-		lastActivated = (Hyperlink) e.widget;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/HyperlinkSettings.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/HyperlinkSettings.java
deleted file mode 100644
index 1051957..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/HyperlinkSettings.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms;
-import org.eclipse.jface.resource.JFaceColors;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.internal.forms.widgets.*;
-/**
- * Manages color and underline mode settings for a group of hyperlinks. The
- * class is extended by HyperlinkGroup but is otherwise not intended to be
- * subclassed.
- * 
- * @since 3.0
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class HyperlinkSettings {
-	/**
-	 * Underline mode to be used when hyperlinks should not be underlined.
-	 */
-	public static final int UNDERLINE_NEVER = 1;
-	/**
-	 * Underline mode to be used when hyperlinks should only be underlined on
-	 * mouse hover.
-	 */
-	public static final int UNDERLINE_HOVER = 2;
-	/**
-	 * Underline mode to be used when hyperlinks should always be underlined.
-	 */
-	public static final int UNDERLINE_ALWAYS = 3;
-	private int hyperlinkUnderlineMode = UNDERLINE_ALWAYS;
-	private Color background;
-	private Color foreground;
-	private Color activeBackground;
-	private Color activeForeground;
-	/**
-	 * The constructor.
-	 * 
-	 * @param display
-	 *            the display to use when creating colors.
-	 */
-	public HyperlinkSettings(Display display) {
-		initializeDefaultForegrounds(display);
-	}
-	/**
-	 * Initializes the hyperlink foregrounds from the JFace defaults set for the
-	 * entire workbench.
-	 * 
-	 * @see JFaceColors
-	 * @param display
-	 *            the display to use when creating colors
-	 */
-	public void initializeDefaultForegrounds(Display display) {
-		Color fg = JFaceColors.getHyperlinkText(display);
-		Color afg = JFaceColors.getActiveHyperlinkText(display);
-		if (fg==null)
-			fg = display.getSystemColor(SWT.COLOR_BLUE);
-		setForeground(fg);
-		setActiveForeground(afg);
-	}
-	/**
-	 * Returns the background to use for the active hyperlink.
-	 * 
-	 * @return active hyperlink background
-	 */
-	public Color getActiveBackground() {
-		return activeBackground;
-	}
-	/**
-	 * Returns the foreground to use for the active hyperlink.
-	 * 
-	 * @return active hyperlink foreground
-	 */
-	public Color getActiveForeground() {
-		return activeForeground;
-	}
-	/**
-	 * Returns the background to use for the normal hyperlink.
-	 * 
-	 * @return normal hyperlink background
-	 */
-	public Color getBackground() {
-		return background;
-	}
-	/**
-	 * Returns the cursor to use when the hyperlink is active. This cursor will
-	 * be shown before hyperlink listeners have been notified of hyperlink
-	 * activation and hidden when the notification method returns.
-	 * 
-	 * @return the busy cursor
-	 */
-	public Cursor getBusyCursor() {
-		return FormsResources.getBusyCursor();
-	}
-	/**
-	 * Returns the cursor to use when over text.
-	 * 
-	 * @return the text cursor
-	 */
-	public Cursor getTextCursor() {
-		return FormsResources.getTextCursor();
-	}
-	/**
-	 * Returns the foreground to use for the normal hyperlink.
-	 * 
-	 * @return the normal hyperlink foreground
-	 */
-	public Color getForeground() {
-		return foreground;
-	}
-	/**
-	 * Returns the cursor to use when hovering over the hyperlink.
-	 * 
-	 * @return the hyperlink cursor
-	 */
-	public Cursor getHyperlinkCursor() {
-		return FormsResources.getHandCursor();
-	}
-	/**
-	 * Returns the underline mode to be used for all the hyperlinks in this
-	 * group.
-	 * 
-	 * @return one of UNDERLINE_NEVER, UNDERLINE_ALWAYS, UNDERLINE_HOVER
-	 */
-	public int getHyperlinkUnderlineMode() {
-		return hyperlinkUnderlineMode;
-	}
-	/**
-	 * Sets the new active hyperlink background for all the links.
-	 * 
-	 * @param newActiveBackground
-	 *            the new active background
-	 */
-	public void setActiveBackground(Color newActiveBackground) {
-		activeBackground = newActiveBackground;
-	}
-	/**
-	 * Sets the new active hyperlink foreground for all the links.
-	 * 
-	 * @param newActiveForeground
-	 *            the new active foreground
-	 */
-	public void setActiveForeground(Color newActiveForeground) {
-		activeForeground = newActiveForeground;
-	}
-	/**
-	 * Sets the new hyperlink background for all the links.
-	 * 
-	 * @param newBackground
-	 *            the new hyperlink background
-	 */
-	public void setBackground(Color newBackground) {
-		background = newBackground;
-	}
-	/**
-	 * Sets the new hyperlink foreground for all the links.
-	 * 
-	 * @param newForeground
-	 *            the new hyperlink foreground
-	 */
-	public void setForeground(Color newForeground) {
-		foreground = newForeground;
-	}
-	/**
-	 * Sets the new hyperlink underline mode for all the links in this group.
-	 * 
-	 * @param mode
-	 *            one of <code>UNDERLINE_NEVER</code>,
-	 *            <code>UNDERLINE_HOVER</code> and
-	 *            <code>UNDERLINE_ALWAYS</code>.
-	 */
-	public void setHyperlinkUnderlineMode(int mode) {
-		hyperlinkUnderlineMode = mode;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IDetailsPage.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IDetailsPage.java
deleted file mode 100644
index 067f9cc..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IDetailsPage.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms;
-
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * This interface should be implemented by clients providing
- * pages to handle object types in DetailsPart. Most of the
- * life cycle is the same as for the IFormPart. The page is
- * a part selection listener since selections in the master
- * part will be passed to the currently visible page.
- * 
- * @see DetailsPart
- * @see MasterDetailsBlock
- * @since 3.0
- */
-public interface IDetailsPage extends IFormPart, IPartSelectionListener {
-	/**
-	 * Creates the contents of the page in the provided parent.
-	 * @param parent the parent to create the page in
-	 */
-	void createContents(Composite parent);
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IDetailsPageProvider.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IDetailsPageProvider.java
deleted file mode 100644
index 64cae36..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IDetailsPageProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms;
-
-/**
- * The class that implements this interface provides for dynamic
- * computation of page key and the page itself based on the
- * input object. It should be used in situations where
- * using the object class as a static key is not enough
- * i.e. different pages may need to be loaded for objects
- * of the same type depending on their state.
- * 
- * @see DetailsPart
- * @see MasterDetailsBlock
- * @since 3.0
- */
-public interface IDetailsPageProvider {
-/**
- * Returns the page key for the provided object. The assumption is
- * that the provider knows about various object types and
- * is in position to cast the object into a type and call methods
- * on it to determine the matching page key.
- * @param object the input object
- * @return the page key for the provided object
- */
-	Object getPageKey(Object object);
-/**
- * Returns the page for the provided key. This method is the dynamic
- * alternative to registering pages with the details part directly.
- * @param key the page key
- * @return the matching page for the provided key
- */
-	IDetailsPage getPage(Object key);
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IFormColors.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IFormColors.java
deleted file mode 100644
index 29bf4d3..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IFormColors.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms;
-
-/**
- * A place to hold all the color constants used in the forms package.
- * 
- * @since 3.3
- */
-
-public interface IFormColors {
-	/**
-	 * A prefix for all the keys.
-	 */
-	String PREFIX = "org.eclipse.ui.forms."; //$NON-NLS-1$
-	/**
-	 * Key for the form title foreground color.
-	 */
-	String TITLE = PREFIX + "TITLE"; //$NON-NLS-1$
-
-	/**
-	 * A prefix for the header color constants.
-	 */
-	String H_PREFIX = PREFIX + "H_"; //$NON-NLS-1$
-	/*
-	 * A prefix for the section title bar color constants.
-	 */
-	String TB_PREFIX = PREFIX + "TB_"; //$NON-NLS-1$	
-	/**
-	 * Key for the form header background gradient ending color.
-	 */
-	String H_GRADIENT_END = H_PREFIX + "GRADIENT_END"; //$NON-NLS-1$
-
-	/**
-	 * Key for the form header background gradient starting color.
-	 * 
-	 */
-	String H_GRADIENT_START = H_PREFIX + "GRADIENT_START"; //$NON-NLS-1$
-	/**
-	 * Key for the form header bottom keyline 1 color.
-	 * 
-	 */
-	String H_BOTTOM_KEYLINE1 = H_PREFIX + "BOTTOM_KEYLINE1"; //$NON-NLS-1$
-	/**
-	 * Key for the form header bottom keyline 2 color.
-	 * 
-	 */
-	String H_BOTTOM_KEYLINE2 = H_PREFIX + "BOTTOM_KEYLINE2"; //$NON-NLS-1$
-	/**
-	 * Key for the form header light hover color.
-	 * 
-	 */
-	String H_HOVER_LIGHT = H_PREFIX + "H_HOVER_LIGHT"; //$NON-NLS-1$
-	/**
-	 * Key for the form header full hover color.
-	 * 
-	 */
-	String H_HOVER_FULL = H_PREFIX + "H_HOVER_FULL"; //$NON-NLS-1$
-
-	/**
-	 * Key for the tree/table border color.
-	 */
-	String BORDER = PREFIX + "BORDER"; //$NON-NLS-1$
-
-	/**
-	 * Key for the section separator color.
-	 */
-	String SEPARATOR = PREFIX + "SEPARATOR"; //$NON-NLS-1$
-
-	/**
-	 * Key for the section title bar background.
-	 */
-	String TB_BG = TB_PREFIX + "BG"; //$NON-NLS-1$
-
-	/**
-	 * Key for the section title bar foreground.
-	 */
-	String TB_FG = TB_PREFIX + "FG"; //$NON-NLS-1$
-
-	/**
-	 * Key for the section title bar gradient.
-	 * @deprecated Since 3.3, this color is not used any more. The 
-	 * tool bar gradient is created starting from {@link #TB_BG} to
-	 * the section background color.
-	 */
-	String TB_GBG = TB_BG;
-
-	/**
-	 * Key for the section title bar border.
-	 */
-	String TB_BORDER = TB_PREFIX + "BORDER"; //$NON-NLS-1$
-
-	/**
-	 * Key for the section toggle color. Since 3.1, this color is used for all
-	 * section styles.
-	 */
-	String TB_TOGGLE = TB_PREFIX + "TOGGLE"; //$NON-NLS-1$
-
-	/**
-	 * Key for the section toggle hover color.
-	 * 
-	 */
-	String TB_TOGGLE_HOVER = TB_PREFIX + "TOGGLE_HOVER"; //$NON-NLS-1$		
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IFormPart.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IFormPart.java
deleted file mode 100644
index fa23b3b..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IFormPart.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms;
-
-/**
- * Classes that implement this interface can be added to the managed form and
- * take part in the form life cycle. The part is initialized with the form and
- * will be asked to accept focus. The part can receive form input and can elect
- * to do something according to it (for example, select an object that matches
- * the input).
- * <p>
- * The form part has two 'out of sync' states in respect to the model(s) that
- * feed the form: <b>dirty</b> and <b>stale</b>. When a part is dirty, it
- * means that the user interacted with it and now its widgets contain state that
- * is newer than the model. In order to sync up with the model, 'commit' needs
- * to be called. In contrast, the model can change 'under' the form (as a result
- * of some actions outside the form), resulting in data in the model being
- * 'newer' than the content presented in the form. A 'stale' form part is
- * brought in sync with the model by calling 'refresh'. The part is responsible
- * for notifying the form when one of these states change in the part. The form
- * reserves the right to handle this notification in the most appropriate way
- * for the situation (for example, if the form is in a page of the multi-page
- * editor, it may do nothing for stale parts if the page is currently not
- * showing).
- * <p>
- * When the form is disposed, each registered part is disposed as well. Parts
- * are responsible for releasing any system resources they created and for
- * removing themselves as listeners from all event providers.
- * 
- * @see IManagedForm
- * @since 3.0
- * 
- */
-public interface IFormPart {
-	/**
-	 * Initializes the part.
-	 * 
-	 * @param form
-	 *            the managed form that manages the part
-	 */
-	void initialize(IManagedForm form);
-
-	/**
-	 * Disposes the part allowing it to release allocated resources.
-	 */
-	void dispose();
-
-	/**
-	 * Returns true if the part has been modified with respect to the data
-	 * loaded from the model.
-	 * 
-	 * @return true if the part has been modified with respect to the data
-	 *         loaded from the model
-	 */
-	boolean isDirty();
-
-	/**
-	 * If part is displaying information loaded from a model, this method
-	 * instructs it to commit the new (modified) data back into the model.
-	 * 
-	 * @param onSave
-	 *            indicates if commit is called during 'save' operation or for
-	 *            some other reason (for example, if form is contained in a
-	 *            wizard or a multi-page editor and the user is about to leave
-	 *            the page).
-	 */
-	void commit(boolean onSave);
-
-	/**
-	 * Notifies the part that an object has been set as overall form's input.
-	 * The part can elect to react by revealing or selecting the object, or do
-	 * nothing if not applicable.
-	 * 
-	 * @return <code>true</code> if the part has selected and revealed the
-	 *         input object, <code>false</code> otherwise.
-	 */
-	boolean setFormInput(Object input);
-
-	/**
-	 * Instructs form part to transfer focus to the widget that should has focus
-	 * in that part. The method can do nothing (if it has no widgets capable of
-	 * accepting focus).
-	 */
-	void setFocus();
-
-	/**
-	 * Tests whether the form part is stale and needs refreshing. Parts can
-	 * receive notification from models that will make their content stale, but
-	 * may need to delay refreshing to improve performance (for example, there
-	 * is no need to immediately refresh a part on a form that is current on a
-	 * hidden page).
-	 * <p>
-	 * It is important to differentiate 'stale' and 'dirty' states. Part is
-	 * 'dirty' if user interacted with its editable widgets and changed the
-	 * values. In contrast, part is 'stale' when the data it presents in the
-	 * widgets has been changed in the model without direct user interaction.
-	 * 
-	 * @return <code>true</code> if the part needs refreshing,
-	 *         <code>false</code> otherwise.
-	 */
-	boolean isStale();
-
-	/**
-	 * Refreshes the part completely from the information freshly obtained from
-	 * the model. The method will not be called if the part is not stale.
-	 * Otherwise, the part is responsible for clearing the 'stale' flag after
-	 * refreshing itself.
-	 */
-	void refresh();
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IManagedForm.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IManagedForm.java
deleted file mode 100644
index 84d8457..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IManagedForm.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-/**
- * Managed form wraps a form widget and adds life cycle methods for form parts.
- * A form part is a portion of the form that participates in form life cycle
- * events.
- * <p>
- * There is no 1/1 mapping between widgets and form parts. A widget like Section
- * can be a part by itself, but a number of widgets can gather around one form
- * part.
- * <p>
- * This interface should not be extended or implemented. New form instances
- * should be created using ManagedForm.
- * 
- * @see ManagedForm
- * @since 3.0
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IManagedForm {
-	/**
-	 * Initializes the form by looping through the managed parts and
-	 * initializing them. Has no effect if already called once.
-	 * 
-	 * @since 3.1
-	 */
-	public void initialize();
-
-	/**
-	 * Returns the toolkit used by this form.
-	 * 
-	 * @return the toolkit
-	 */
-	public FormToolkit getToolkit();
-
-	/**
-	 * Returns the form widget managed by this form.
-	 * 
-	 * @return the form widget
-	 */
-	public ScrolledForm getForm();
-
-	/**
-	 * Reflows the form as a result of the layout change.
-	 * 
-	 * @param changed
-	 *            if <code>true</code>, discard cached layout information
-	 */
-	public void reflow(boolean changed);
-
-	/**
-	 * A part can use this method to notify other parts that implement
-	 * IPartSelectionListener about selection changes.
-	 * 
-	 * @param part
-	 *            the part that broadcasts the selection
-	 * @param selection
-	 *            the selection in the part
-	 */
-	public void fireSelectionChanged(IFormPart part, ISelection selection);
-
-	/**
-	 * Returns all the parts currently managed by this form.
-	 * 
-	 * @return the managed parts
-	 */
-	IFormPart[] getParts();
-
-	/**
-	 * Adds the new part to the form.
-	 * 
-	 * @param part
-	 *            the part to add
-	 */
-	void addPart(IFormPart part);
-
-	/**
-	 * Removes the part from the form.
-	 * 
-	 * @param part
-	 *            the part to remove
-	 */
-	void removePart(IFormPart part);
-
-	/**
-	 * Sets the input of this page to the provided object.
-	 * 
-	 * @param input
-	 *            the new page input
-	 * @return <code>true</code> if the form contains this object,
-	 *         <code>false</code> otherwise.
-	 */
-	boolean setInput(Object input);
-
-	/**
-	 * Returns the current page input.
-	 * 
-	 * @return page input object or <code>null</code> if not applicable.
-	 */
-	Object getInput();
-
-	/**
-	 * Tests if form is dirty. A managed form is dirty if at least one managed
-	 * part is dirty.
-	 * 
-	 * @return <code>true</code> if at least one managed part is dirty,
-	 *         <code>false</code> otherwise.
-	 */
-	boolean isDirty();
-
-	/**
-	 * Notifies the form that the dirty state of one of its parts has changed.
-	 * The global dirty state of the form can be obtained by calling 'isDirty'.
-	 * 
-	 * @see #isDirty
-	 */
-	void dirtyStateChanged();
-
-	/**
-	 * Commits the dirty form. All pending changes in the widgets are flushed
-	 * into the model.
-	 * 
-	 * @param onSave
-	 */
-	void commit(boolean onSave);
-
-	/**
-	 * Tests if form is stale. A managed form is stale if at least one managed
-	 * part is stale. This can happen when the underlying model changes,
-	 * resulting in the presentation of the part being out of sync with the
-	 * model and needing refreshing.
-	 * 
-	 * @return <code>true</code> if the form is stale, <code>false</code>
-	 *         otherwise.
-	 */
-	boolean isStale();
-
-	/**
-	 * Notifies the form that the stale state of one of its parts has changed.
-	 * The global stale state of the form can be obtained by calling 'isStale'.
-	 */
-	void staleStateChanged();
-
-	/**
-	 * Refreshes the form by refreshing every part that is stale.
-	 */
-	void refresh();
-
-	/**
-	 * Sets the container that owns this form. Depending on the context, the
-	 * container may be wizard, editor page, editor etc.
-	 * 
-	 * @param container
-	 *            the container of this form
-	 */
-	void setContainer(Object container);
-
-	/**
-	 * Returns the container of this form.
-	 * 
-	 * @return the form container
-	 */
-	Object getContainer();
-
-	/**
-	 * Returns the message manager that will keep track of messages in this
-	 * form.
-	 * 
-	 * @return the message manager instance
-	 * @since 3.3
-	 */
-	IMessageManager getMessageManager();
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IMessage.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IMessage.java
deleted file mode 100644
index 0d165d6..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IMessage.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.ui.forms;
-
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * This interface encapsulates a single message that can be shown in a form.
- * Messages can be associated with controls, or be of a general nature.
- * 
- * @see IMessageManager
- * @since 3.3
- */
-public interface IMessage extends IMessageProvider {
-	/**
-	 * Returns the unique message key
-	 * 
-	 * @return the unique message key
-	 */
-	Object getKey();
-
-	/**
-	 * Returns data for application use
-	 * 
-	 * @return data object
-	 */
-	Object getData();
-
-	/**
-	 * Returns the control this message is associated with.
-	 * 
-	 * @return the control or <code>null</code> if this is a general message.
-	 */
-	Control getControl();
-
-	/**
-	 * Messages that are associated with controls can be shown with a prefix
-	 * that indicates the origin of the message (e.g. the label preceeding the
-	 * control).
-	 * 
-	 * @return the message prefix or <code>null</code> if this is a general
-	 *         message
-	 */
-	String getPrefix();
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IMessageManager.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IMessageManager.java
deleted file mode 100644
index 933b3af..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IMessageManager.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.forms;
-
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.fieldassist.ControlDecoration;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.widgets.Form;
-
-/**
- * This interface provides for managing typed messages in a form. Typed messages
- * are messages associated with a type that indicates their severity (error,
- * warning, information). The interface is responsible for:
- * <ul>
- * <li>Bridging the concept of typed messages and control decorations</li>
- * <li>Adding one or more messages per control in a form</li>
- * <li>Rolling the local messages up to the form header</li>
- * <li>Adding one or more general messages to the form header</li>
- * </ul>
- * <p>
- * To use it in a form, do the following:
- * <ol>
- * <li>For each interactive control, add a listener to it to monitor user input</li>
- * <li>Every time the input changes, validate it. If there is a problem, add a
- * message with a unique key to the manager. If there is already a message with
- * the same key in the manager, its type and message text will be replaced (no
- * duplicates). Note that you add can messages with different keys to the same
- * control to track multiple problems with the user input.</li>
- * <li>If the problem has been cleared, remove the message using the key
- * (attempting to remove a message that is not in the manager is safe).</li>
- * <li>If something happens in the form that is not related to any control, use
- * the other <code>addMessage</code> method.</li>
- * </ol>
- * <p>
- * This interface should only be referenced. It must not be implemented or
- * extended.
- * </p>
- * 
- * @since 3.3
- * @see IMessageProvider
- * @see IManagedForm
- * @noimplement This interface is not intended to be implemented by clients.
- */
-
-public interface IMessageManager {
-	/**
-	 * Adds a general message that is not associated with any decorated field.
-	 * Note that subsequent calls using the same key will not result in
-	 * duplicate messages. Instead, the previous message with the same key will
-	 * be replaced with the new message.
-	 * 
-	 * @param key
-	 *            a unique message key that will be used to look the message up
-	 *            later
-	 * 
-	 * @param messageText
-	 *            the message to add
-	 * @param data
-	 *            an object for application use (can be <code>null</code>)
-	 * @param type
-	 *            the message type as defined in <code>IMessageProvider</code>.
-	 */
-	void addMessage(Object key, String messageText, Object data, int type);
-
-	/**
-	 * Adds a message that should be associated with the provided control. Note
-	 * that subsequent calls using the same key will not result in duplicate
-	 * messages. Instead, the previous message with the same key will be
-	 * replaced with the new message.
-	 * 
-	 * @param key
-	 *            the unique message key
-	 * @param messageText
-	 *            the message to add
-	 * @param data
-	 *            an object for application use (can be <code>null</code>)
-	 * @param type
-	 *            the message type
-	 * @param control
-	 *            the control to associate the message with
-	 */
-	void addMessage(Object key, String messageText, Object data, int type,
-			Control control);
-
-	/**
-	 * Removes the general message with the provided key. Does nothing if
-	 * message for the key does not exist.
-	 * 
-	 * @param key
-	 *            the key of the message to remove
-	 */
-	void removeMessage(Object key);
-
-	/**
-	 * Removes all the general messages. If there are local messages associated
-	 * with controls, the replacement message may show up drawing user's
-	 * attention to these local messages. Otherwise, the container will clear
-	 * the message area.
-	 */
-	void removeMessages();
-
-	/**
-	 * Removes a keyed message associated with the provided control. Does
-	 * nothing if the message for that key does not exist.
-	 * 
-	 * @param key
-	 *            the id of the message to remove
-	 * @param control
-	 *            the control the message is associated with
-	 */
-	void removeMessage(Object key, Control control);
-
-	/**
-	 * Removes all the messages associated with the provided control. Does
-	 * nothing if there are no messages for this control.
-	 * 
-	 * @param control
-	 *            the control the messages are associated with
-	 */
-	void removeMessages(Control control);
-
-	/**
-	 * Removes all the local field messages and all the general container
-	 * messages.
-	 */
-	void removeAllMessages();
-
-	/**
-	 * Updates the message container with the messages currently in the manager.
-	 * There are two scenarios in which a client may want to use this method:
-	 * <ol>
-	 * <li>When controls previously managed by this manager have been disposed.</li>
-	 * <li>When automatic update has been turned off.</li>
-	 * </ol>
-	 * In all other situations, the manager will keep the form in sync
-	 * automatically.
-	 * 
-	 * @see #setAutoUpdate(boolean)
-	 */
-	void update();
-
-	/**
-	 * Controls whether the form is automatically updated when messages are
-	 * added or removed. By default, auto update is on. Clients can turn it off
-	 * prior to adding or removing a number of messages as a batch. Turning it
-	 * back on will trigger an update.
-	 * 
-	 * @param enabled
-	 *            sets the state of the automatic update
-	 */
-	void setAutoUpdate(boolean enabled);
-
-	/**
-	 * Tests whether the form will be automatically updated when messages are
-	 * added or removed.
-	 * 
-	 * @return <code>true</code> if auto update is active, <code>false</code>
-	 *         otherwise.
-	 */
-	boolean isAutoUpdate();
-
-	/**
-	 * Sets the alternative message prefix provider. The default prefix provider
-	 * is set by the manager.
-	 * 
-	 * @param provider
-	 *            the new prefix provider or <code>null</code> to turn the
-	 *            prefix generation off.
-	 */
-	void setMessagePrefixProvider(IMessagePrefixProvider provider);
-
-	/**
-	 * @return the current prefix provider or <code>null</code> if prefixes
-	 *         are not generated.
-	 */
-	IMessagePrefixProvider getMessagePrefixProvider();
-
-	/**
-	 * Message manager uses SWT.LEFT|SWT.BOTTOM for the default decoration
-	 * position. Use this method to change it.
-	 * 
-	 * @param position
-	 *            the decoration position
-	 * @see ControlDecoration
-	 */
-	void setDecorationPosition(int position);
-
-	/**
-	 * Returns the currently used decoration position for all control messages.
-	 * 
-	 * @return the current decoration position
-	 */
-
-	int getDecorationPosition();
-
-	/**
-	 * When message manager is used in context of a form, and there are
-	 * hyperlink listeners for messages in the header, the hyperlink event will
-	 * carry an object of type <code>IMessage[]</code> as an href. You can use
-	 * this method to create a summary text from this array consistent with the
-	 * tool tip used by the form header.
-	 * 
-	 * @param messages
-	 *            an array of messages
-	 * @return a textual representation of the messages with one message per
-	 *         line.
-	 * @see Form#addMessageHyperlinkListener(org.eclipse.ui.forms.events.IHyperlinkListener)
-	 */
-	String createSummary(IMessage[] messages);
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IMessagePrefixProvider.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IMessagePrefixProvider.java
deleted file mode 100644
index 5404f6a..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IMessagePrefixProvider.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.ui.forms;
-
-import org.eclipse.swt.widgets.Control;
-
-/**
- * This interface computes the prefix of a message that is created in the
- * context of a control. Since messages are rolled up to the header in the
- * message manager, it is important to create a prefix to indicate the context
- * of a message in the form. Typically the prefix is computed by looking at the
- * label that preceeds the control, if present. Alternative providers may
- * include other text to further specify the location of the message.
- * 
- * @see IMessageManager
- * @see IMessage
- * @since 3.3
- */
-public interface IMessagePrefixProvider {
-	/**
-	 * Returns the computed prefix for the provided control.
-	 * 
-	 * @param control
-	 *            the control to provide the prefix for
-	 * @return the computed prefix
-	 */
-	String getPrefix(Control control);
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IPartSelectionListener.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IPartSelectionListener.java
deleted file mode 100644
index a4ce605..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/IPartSelectionListener.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms;
-
-import org.eclipse.jface.viewers.ISelection;
-
-/**
- * Form parts can implement this interface if they want to be 
- * notified when another part on the same form changes selection 
- * state.
- * 
- * @see IFormPart
- * @since 3.0
- */
-public interface IPartSelectionListener {
-	/**
-	 * Called when the provided part has changed selection state.
-	 * 
-	 * @param part
-	 *            the selection source
-	 * @param selection
-	 *            the new selection
-	 */
-	public void selectionChanged(IFormPart part, ISelection selection);
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/ManagedForm.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/ManagedForm.java
deleted file mode 100644
index c72b122..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/ManagedForm.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms;
-
-import java.util.Vector;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-/**
- * Managed form wraps a form widget and adds life cycle methods for form parts.
- * A form part is a portion of the form that participates in form life cycle
- * events.
- * <p>
- * There is requirement for 1/1 mapping between widgets and form parts. A widget
- * like Section can be a part by itself, but a number of widgets can join around
- * one form part.
- * <p>
- * Note to developers: this class is left public to allow its use beyond the
- * original intention (inside a multi-page editor's page). You should limit the
- * use of this class to make new instances inside a form container (wizard page,
- * dialog etc.). Clients that need access to the class should not do it
- * directly. Instead, they should do it through IManagedForm interface as much
- * as possible.
- * 
- * @since 3.0
- */
-public class ManagedForm implements IManagedForm {
-	private Object input;
-
-	private ScrolledForm form;
-
-	private FormToolkit toolkit;
-
-	private Object container;
-
-	private boolean ownsToolkit;
-
-	private boolean initialized;
-
-	private Vector parts = new Vector();
-
-	/**
-	 * Creates a managed form in the provided parent. Form toolkit and widget
-	 * will be created and owned by this object.
-	 * 
-	 * @param parent
-	 *            the parent widget
-	 */
-	public ManagedForm(Composite parent) {
-		toolkit = new FormToolkit(parent.getDisplay());
-		ownsToolkit = true;
-		form = toolkit.createScrolledForm(parent);
-	}
-
-	/**
-	 * Creates a managed form that will use the provided toolkit and
-	 * 
-	 * @param toolkit
-	 * @param form
-	 */
-	public ManagedForm(FormToolkit toolkit, ScrolledForm form) {
-		this.form = form;
-		this.toolkit = toolkit;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IManagedForm#addPart(org.eclipse.ui.forms.IFormPart)
-	 */
-	public void addPart(IFormPart part) {
-		parts.add(part);
-		part.initialize(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IManagedForm#removePart(org.eclipse.ui.forms.IFormPart)
-	 */
-	public void removePart(IFormPart part) {
-		parts.remove(part);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IManagedForm#getParts()
-	 */
-	public IFormPart[] getParts() {
-		return (IFormPart[]) parts.toArray(new IFormPart[parts.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IManagedForm#getToolkit()
-	 */
-	public FormToolkit getToolkit() {
-		return toolkit;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IManagedForm#getForm()
-	 */
-	public ScrolledForm getForm() {
-		return form;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IManagedForm#reflow(boolean)
-	 */
-	public void reflow(boolean changed) {
-		form.reflow(changed);
-	}
-
-	/**
-	 * A part can use this method to notify other parts that implement
-	 * IPartSelectionListener about selection changes.
-	 * 
-	 * @param part
-	 *            the part that broadcasts the selection
-	 * @param selection
-	 *            the selection in the part
-	 * @see IPartSelectionListener
-	 */
-	public void fireSelectionChanged(IFormPart part, ISelection selection) {
-		for (int i = 0; i < parts.size(); i++) {
-			IFormPart cpart = (IFormPart) parts.get(i);
-			if (part.equals(cpart))
-				continue;
-			if (cpart instanceof IPartSelectionListener) {
-				((IPartSelectionListener) cpart).selectionChanged(part,
-						selection);
-			}
-		}
-	}
-
-	/**
-	 * Initializes the form by looping through the managed parts and
-	 * initializing them. Has no effect if already called once.
-	 */
-	public void initialize() {
-		if (initialized)
-			return;
-		for (int i = 0; i < parts.size(); i++) {
-			IFormPart part = (IFormPart) parts.get(i);
-			part.initialize(this);
-		}
-		initialized = true;
-	}
-
-	/**
-	 * Disposes all the parts in this form.
-	 */
-	public void dispose() {
-		for (int i = 0; i < parts.size(); i++) {
-			IFormPart part = (IFormPart) parts.get(i);
-			part.dispose();
-		}
-		if (ownsToolkit) {
-			toolkit.dispose();
-		}
-	}
-
-	/**
-	 * Refreshes the form by refreshes all the stale parts. Since 3.1, this
-	 * method is performed on a UI thread when called from another thread so it
-	 * is not needed to wrap the call in <code>Display.syncExec</code> or
-	 * <code>asyncExec</code>.
-	 */
-	public void refresh() {
-		Thread t = Thread.currentThread();
-		Thread dt = toolkit.getColors().getDisplay().getThread();
-		if (t.equals(dt))
-			doRefresh();
-		else {
-			toolkit.getColors().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					doRefresh();
-				}
-			});
-		}
-	}
-
-	private void doRefresh() {
-		int nrefreshed = 0;
-		for (int i = 0; i < parts.size(); i++) {
-			IFormPart part = (IFormPart) parts.get(i);
-			if (part.isStale()) {
-				part.refresh();
-				nrefreshed++;
-			}
-		}
-		if (nrefreshed > 0)
-			form.reflow(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IManagedForm#commit(boolean)
-	 */
-	public void commit(boolean onSave) {
-		for (int i = 0; i < parts.size(); i++) {
-			IFormPart part = (IFormPart) parts.get(i);
-			if (part.isDirty())
-				part.commit(onSave);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IManagedForm#setInput(java.lang.Object)
-	 */
-	public boolean setInput(Object input) {
-		boolean pageResult = false;
-
-		this.input = input;
-		for (int i = 0; i < parts.size(); i++) {
-			IFormPart part = (IFormPart) parts.get(i);
-			boolean result = part.setFormInput(input);
-			if (result)
-				pageResult = true;
-		}
-		return pageResult;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IManagedForm#getInput()
-	 */
-	public Object getInput() {
-		return input;
-	}
-
-	/**
-	 * Transfers the focus to the first form part.
-	 */
-	public void setFocus() {
-		if (parts.size() > 0) {
-			IFormPart part = (IFormPart) parts.get(0);
-			part.setFocus();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IManagedForm#isDirty()
-	 */
-	public boolean isDirty() {
-		for (int i = 0; i < parts.size(); i++) {
-			IFormPart part = (IFormPart) parts.get(i);
-			if (part.isDirty())
-				return true;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IManagedForm#isStale()
-	 */
-	public boolean isStale() {
-		for (int i = 0; i < parts.size(); i++) {
-			IFormPart part = (IFormPart) parts.get(i);
-			if (part.isStale())
-				return true;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IManagedForm#dirtyStateChanged()
-	 */
-	public void dirtyStateChanged() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IManagedForm#staleStateChanged()
-	 */
-	public void staleStateChanged() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IManagedForm#getContainer()
-	 */
-	public Object getContainer() {
-		return container;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IManagedForm#setContainer(java.lang.Object)
-	 */
-	public void setContainer(Object container) {
-		this.container = container;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IManagedForm#getMessageManager()
-	 */
-	public IMessageManager getMessageManager() {
-		return form.getMessageManager();
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/MasterDetailsBlock.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/MasterDetailsBlock.java
deleted file mode 100644
index 19dc3d1..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/MasterDetailsBlock.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-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.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Sash;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-/**
- * This class implements the 'master/details' UI pattern suitable for inclusion
- * in a form. The block consists of two parts: 'master' and 'details' in a sash
- * form that allows users to change the relative ratio on the page. The master
- * part needs to be created by the users of this class. The details part is
- * created by the block.
- * <p>
- * The master part is responsible for adding itself as a form part and firing
- * selection events. The details part catches the selection events and tries to
- * load a page registered to handle the selected object(s). The page shows the
- * details of the selected object(s) and allows users to edit them.
- * <p>
- * Details pages can be registered statically using 'registerPage' or
- * dynamically through the use of 'IDetailsPageProvider' in case where different
- * pages need to be shown for objects of the same type depending on their state.
- * <p>
- * Subclasses are required to implement abstract methods of this class. Master
- * part must be created and at least one details page should be registered in
- * order to show details of the objects selected in the master part. Tool bar
- * actions can be optionally added to the tool bar manager.
- * 
- * @see DetailsPart
- * @see IDetailsPage
- * @see IDetailsPageProvider
- * @since 3.0
- */
-public abstract class MasterDetailsBlock {
-	/**
-	 * Details part created by the block. No attempt should be made to access
-	 * this field inside <code>createMasterPart</code> because it has not been
-	 * created yet and will be <code>null</code>.
-	 */
-	protected DetailsPart detailsPart;
-
-	/**
-	 * The form that is the parent of both master and details part. The form
-	 * allows users to change the ratio between the two parts.
-	 */
-	protected SashForm sashForm;
-	
-	static final int DRAGGER_SIZE = 40;
-	
-	class MDSashForm extends SashForm {
-		ArrayList sashes = new ArrayList();
-		Listener listener = new Listener () {
-			public void handleEvent(Event e) {
-				switch (e.type) {
-				case SWT.MouseEnter:
-					e.widget.setData("hover", Boolean.TRUE); //$NON-NLS-1$
-					((Control)e.widget).redraw();
-					break;
-				case SWT.MouseExit:
-					e.widget.setData("hover", null); //$NON-NLS-1$
-					((Control)e.widget).redraw();
-					break;
-				case SWT.Paint:
-					onSashPaint(e);
-				break;
-				case SWT.Resize:
-					hookSashListeners();
-				break;
-				}
-			}
-		};
-		public MDSashForm(Composite parent, int style) {
-			super(parent, style);
-		}
-		
-		public void layout(boolean changed) {
-			super.layout(changed);
-			hookSashListeners();
-		}
-		
-		public void layout(Control [] children) {
-			super.layout(children);
-			hookSashListeners();
-		}
-
-		private void hookSashListeners() {
-			purgeSashes();
-			Control [] children = getChildren();
-			for (int i=0; i<children.length; i++) {
-				if (children[i] instanceof Sash) {
-					Sash sash = (Sash)children[i];
-					if (sashes.contains(sash))
-						continue;
-					sash.addListener(SWT.Paint, listener);
-					sash.addListener(SWT.MouseEnter, listener);
-					sash.addListener(SWT.MouseExit, listener);
-					sashes.add(sash);
-				}
-			}
-		}
-		private void purgeSashes() {
-			for (Iterator iter=sashes.iterator(); iter.hasNext();) {
-				Sash sash = (Sash)iter.next();
-				if (sash.isDisposed())
-					iter.remove();
-			}
-		}
-	}
-
-	/**
-	 * Creates the content of the master/details block inside the managed form.
-	 * This method should be called as late as possible inside the parent part.
-	 * 
-	 * @param managedForm
-	 *            the managed form to create the block in
-	 */
-	public void createContent(IManagedForm managedForm) {
-		final ScrolledForm form = managedForm.getForm();
-		FormToolkit toolkit = managedForm.getToolkit();
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		form.getBody().setLayout(layout);
-		sashForm = new MDSashForm(form.getBody(), SWT.NULL);
-		sashForm.setData("form", managedForm); //$NON-NLS-1$
-		toolkit.adapt(sashForm, false, false);
-		sashForm.setMenu(form.getBody().getMenu());
-		sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
-		createMasterPart(managedForm, sashForm);
-		createDetailsPart(managedForm, sashForm);
-		hookResizeListener();
-		createToolBarActions(managedForm);
-		form.updateToolBar();
-	}
-	
-	private void hookResizeListener() {
-		Listener listener = ((MDSashForm)sashForm).listener;
-		Control [] children = sashForm.getChildren();
-		for (int i=0; i<children.length; i++) {
-			if (children[i] instanceof Sash) continue;
-			children[i].addListener(SWT.Resize, listener);
-		}
-	}
-
-	/**
-	 * Implement this method to create a master part in the provided parent.
-	 * Typical master parts are section parts that contain tree or table viewer.
-	 * 
-	 * @param managedForm
-	 *            the parent form
-	 * @param parent
-	 *            the parent composite
-	 */
-	protected abstract void createMasterPart(IManagedForm managedForm,
-			Composite parent);
-
-	/**
-	 * Implement this method to statically register pages for the expected
-	 * object types. This mechanism can be used when there is 1-&gt;1 mapping
-	 * between object classes and details pages.
-	 * 
-	 * @param detailsPart
-	 *            the details part
-	 */
-	protected abstract void registerPages(DetailsPart detailsPart);
-
-	/**
-	 * Implement this method to create form tool bar actions and add them to the
-	 * form tool bar if desired.
-	 * 
-	 * @param managedForm
-	 *            the form that owns the tool bar
-	 */
-	protected abstract void createToolBarActions(IManagedForm managedForm);
-
-	private void createDetailsPart(final IManagedForm mform, Composite parent) {
-		detailsPart = new DetailsPart(mform, parent, SWT.NULL);
-		mform.addPart(detailsPart);
-		registerPages(detailsPart);
-	}
-	
-	private void onSashPaint(Event e) {
-		Sash sash = (Sash)e.widget;
-		IManagedForm form = (IManagedForm)sash.getParent().getData("form"); //$NON-NLS-1$
-		FormColors colors = form.getToolkit().getColors();
-		boolean vertical = (sash.getStyle() & SWT.VERTICAL)!=0;
-		GC gc = e.gc;
-		Boolean hover = (Boolean)sash.getData("hover"); //$NON-NLS-1$
-		gc.setBackground(colors.getColor(IFormColors.TB_BG));
-		gc.setForeground(colors.getColor(IFormColors.TB_BORDER));
-		Point size = sash.getSize();
-		if (vertical) {
-			if (hover!=null)
-				gc.fillRectangle(0, 0, size.x, size.y);
-			//else
-				//gc.drawLine(1, 0, 1, size.y-1);
-		}
-		else {
-			if (hover!=null)
-				gc.fillRectangle(0, 0, size.x, size.y);
-			//else
-				//gc.drawLine(0, 1, size.x-1, 1);				
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/SectionPart.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/SectionPart.java
deleted file mode 100644
index 618a352..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/SectionPart.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.events.ExpansionAdapter;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-
-/**
- * Section part implements IFormPart interface based on the Section widget. It
- * can either wrap the widget or create one itself.
- * <p>
- * Subclasses should extend <code>SectionPart</code> and implement life cycle
- * methods like <code>refresh</code>, <code>commit</code>,
- * <code>setFocus</code> etc. Note that most of these methods are not empty -
- * calling <code>super</code> is required.
- * 
- * @see Section
- * @since 3.0
- */
-public class SectionPart extends AbstractFormPart {
-	private Section section;
-
-	/**
-	 * Creates a new section part based on the provided section.
-	 * 
-	 * @param section
-	 *            the section to use
-	 */
-	public SectionPart(Section section) {
-		this.section = section;
-		hookListeners();
-	}
-
-	/**
-	 * Creates a new section part inside the provided parent and using the
-	 * provided toolkit. The section part will create the section widget.
-	 * 
-	 * @param parent
-	 *            the parent
-	 * @param toolkit
-	 *            the toolkit to use
-	 * @param style
-	 *            the section widget style
-	 */
-	public SectionPart(Composite parent, FormToolkit toolkit, int style) {
-		this(toolkit.createSection(parent, style));
-	}
-
-	/**
-	 * Adds listeners to the underlying widget.
-	 */
-	protected void hookListeners() {
-		if ((section.getExpansionStyle() & Section.TWISTIE) != 0
-				|| (section.getExpansionStyle() & Section.TREE_NODE) != 0) {
-			section.addExpansionListener(new ExpansionAdapter() {
-				public void expansionStateChanging(ExpansionEvent e) {
-					SectionPart.this.expansionStateChanging(e.getState());
-				}
-
-				public void expansionStateChanged(ExpansionEvent e) {
-					SectionPart.this.expansionStateChanged(e.getState());
-				}
-			});
-		}
-	}
-
-	/**
-	 * Returns the section widget used in this part.
-	 * 
-	 * @return the section widget
-	 */
-	public Section getSection() {
-		return section;
-	}
-
-	/**
-	 * The section is about to expand or collapse.
-	 * 
-	 * @param expanding
-	 *            <code>true</code> for expansion, <code>false</code> for
-	 *            collapse.
-	 */
-	protected void expansionStateChanging(boolean expanding) {
-	}
-
-	/**
-	 * The section has expanded or collapsed.
-	 * 
-	 * @param expanded
-	 *            <code>true</code> for expansion, <code>false</code> for
-	 *            collapse.
-	 */
-	protected void expansionStateChanged(boolean expanded) {
-		getManagedForm().getForm().reflow(false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.AbstractFormPart#setFocus()
-	 */
-	public void setFocus() {
-		Control client = section.getClient();
-		if (client != null)
-			client.setFocus();
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/editor/FormEditor.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/editor/FormEditor.java
deleted file mode 100644
index 60e045e..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/editor/FormEditor.java
+++ /dev/null
@@ -1,654 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.editor;
-
-import java.util.Vector;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorActionBarContributor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.MultiPageSelectionProvider;
-
-/**
- * This class forms a base of multi-page form editors that typically use one or
- * more pages with forms and one page for raw source of the editor input.
- * <p>
- * Pages are added 'lazily' i.e. adding a page reserves a tab for it but does
- * not cause the page control to be created. Page control is created when an
- * attempt is made to select the page in question. This allows editors with
- * several tabs and complex pages to open quickly.
- * <p>
- * Subclasses should extend this class and implement <code>addPages</code>
- * method. One of the two <code>addPage</code> methods should be called to
- * contribute pages to the editor. One adds complete (standalone) editors as
- * nested tabs. These editors will be created right away and will be hooked so
- * that key bindings, selection service etc. is compatible with the one for the
- * standalone case. The other method adds classes that implement
- * <code>IFormPage</code> interface. These pages will be created lazily and
- * they will share the common key binding and selection service. Since 3.1,
- * FormEditor is a page change provider. It allows listeners to attach to it and
- * get notified when pages are changed. This new API in JFace allows dynamic
- * help to update on page changes.
- * 
- * @since 3.0
- */
-public abstract class FormEditor extends MultiPageEditorPart  {
-
-	/**
-	 * An array of pages currently in the editor. Page objects are not limited
-	 * to those that implement <code>IFormPage</code>, hence the size of this
-	 * array matches the number of pages as viewed by the user.
-	 * <p>
-	 * Subclasses can access this field but should not modify it.
-	 */
-	protected Vector pages = new Vector();
-
-	private FormToolkit toolkit;
-
-	private int currentPage = -1;
-
-	private static class FormEditorSelectionProvider extends
-			MultiPageSelectionProvider {
-		private ISelection globalSelection;
-
-		/**
-		 * @param formEditor the editor
-		 */
-		public FormEditorSelectionProvider(FormEditor formEditor) {
-			super(formEditor);
-		}
-
-		public ISelection getSelection() {
-			IEditorPart activeEditor = ((FormEditor) getMultiPageEditor())
-					.getActiveEditor();
-			if (activeEditor != null) {
-				ISelectionProvider selectionProvider = activeEditor.getSite()
-						.getSelectionProvider();
-				if (selectionProvider != null)
-					return selectionProvider.getSelection();
-			}
-			if (globalSelection != null) {
-			    return globalSelection;
-			}
-			return StructuredSelection.EMPTY;
-		}
-
-		/*
-		 * (non-Javadoc) Method declared on <code> ISelectionProvider </code> .
-		 */
-		public void setSelection(ISelection selection) {
-			IEditorPart activeEditor = ((FormEditor) getMultiPageEditor())
-					.getActiveEditor();
-			if (activeEditor != null) {
-				ISelectionProvider selectionProvider = activeEditor.getSite()
-						.getSelectionProvider();
-				if (selectionProvider != null)
-					selectionProvider.setSelection(selection);
-			} else {
-				this.globalSelection = selection;
-				fireSelectionChanged(new SelectionChangedEvent(this,
-						globalSelection));
-			}
-		}
-	}
-
-	/**
-	 * The constructor.
-	 */
-	public FormEditor() {
-	}
-
-	/**
-	 * Overrides super to plug in a different selection provider.
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		setSite(site);
-		setInput(input);
-		site.setSelectionProvider(new FormEditorSelectionProvider(this));
-	}
-
-	/**
-	 * Creates the common toolkit for this editor and adds pages to the editor.
-	 * 
-	 * @see #addPages
-	 */
-	protected void createPages() {
-		addPages();
-	}
-
-	/*
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#createPageContainer(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Composite createPageContainer(Composite parent) {
-		parent = super.createPageContainer(parent);
-		toolkit = createToolkit(parent.getDisplay());
-		return parent;
-	}
-
-	/**
-	 * Creates the form toolkit. The method can be implemented to substitute a
-	 * subclass of the toolkit that should be used for this editor. A typical
-	 * use of this method would be to create the form toolkit using one shared
-	 * <code>FormColors</code> object to share resources across the multiple
-	 * editor instances.
-	 * 
-	 * @param display
-	 *            the display to use when creating the toolkit
-	 * @return the newly created toolkit instance
-	 */
-	protected FormToolkit createToolkit(Display display) {
-		return new FormToolkit(display);
-	}
-
-	/**
-	 * Subclass should implement this method to add pages to the editor using
-	 * 'addPage(IFormPage)' method.
-	 */
-	protected abstract void addPages();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IPageChangeProvider#getSelectedPage()
-	 */
-	public Object getSelectedPage() {
-		return getActivePageInstance();
-	}
-
-	/**
-	 * Adds the form page to this editor. Form page will be loaded lazily. Its
-	 * part control will not be created until it is activated for the first
-	 * time.
-	 * 
-	 * @param page
-	 *            the form page to add
-	 */
-	public int addPage(IFormPage page) throws PartInitException {
-		int i = super.addPage(page.getPartControl());
-		configurePage(i, page);
-		return i;
-	}
-
-	/**
-	 * Adds the form page to this editor at the specified index (0-based). Form
-	 * page will be loaded lazily. Its part control will not be created until it
-	 * is activated for the first time.
-	 * 
-	 * @param index
-	 *            the position to add the page at (0-based)
-	 * @param page
-	 *            the form page to add
-	 * @since 3.1
-	 */
-	public void addPage(int index, IFormPage page) throws PartInitException {
-		super.addPage(index, page.getPartControl());
-		configurePage(index, page);
-		updatePageIndices(index+1);
-	}
-
-	/**
-	 * Adds a simple SWT control as a page. Overrides superclass implementation
-	 * to keep track of pages.
-	 * 
-	 * @param control
-	 *            the page control to add
-	 * @return the 0-based index of the newly added page
-	 */
-	public int addPage(Control control) {
-		int i = super.addPage(control);
-		try {
-			registerPage(-1, control);
-		} catch (PartInitException e) {
-			// cannot happen for controls
-		}
-		return i;
-	}
-
-	/**
-	 * Adds a simple SWT control as a page. Overrides superclass implementation
-	 * to keep track of pages.
-	 * 
-	 * @param control
-	 *            the page control to add
-	 * @param index
-	 *            the index at which to add the page (0-based)
-	 * @since 3.1
-	 */
-	public void addPage(int index, Control control) {
-		super.addPage(index, control);
-		try {
-			registerPage(index, control);
-		} catch (PartInitException e) {
-			// cannot happen for controls
-		}
-		updatePageIndices(index+1);
-	}
-
-	/**
-	 * Tests whether the editor is dirty by checking all the pages that
-	 * implement <code>IFormPage</code>. If none of them is dirty, the method
-	 * delegates further processing to <code>super.isDirty()</code>.
-	 * 
-	 * @return <code>true</code> if any of the pages in the editor are dirty,
-	 *         <code>false</code> otherwise.
-	 * @since 3.1
-	 */
-
-	public boolean isDirty() {
-		if (pages != null) {
-			for (int i = 0; i < pages.size(); i++) {
-				Object page = pages.get(i);
-				if (page instanceof IFormPage) {
-					IFormPage fpage = (IFormPage) page;
-					if (fpage.isDirty())
-						return true;
-				}
-			}
-		}
-		return super.isDirty();
-	}
-	
-	/**
-	 * Commits all dirty pages in the editor. This method should
-	 * be called as a first step of a 'save' operation.
-	 * @param onSave <code>true</code> if commit is performed as part
-	 * of the 'save' operation, <code>false</code> otherwise.
-	 * @since 3.3
-	 */
-
-	protected void commitPages(boolean onSave) {
-		if (pages != null) {
-			for (int i = 0; i < pages.size(); i++) {
-				Object page = pages.get(i);
-				if (page instanceof IFormPage) {
-					IFormPage fpage = (IFormPage)page;
-					IManagedForm mform = fpage.getManagedForm();
-					if (mform != null && mform.isDirty())
-						mform.commit(onSave);
-				}
-			}
-		}	
-	}
-
-	/**
-	 * Adds a complete editor part to the multi-page editor.
-	 * 
-	 * @see MultiPageEditorPart#addPage(IEditorPart, IEditorInput)
-	 */
-	public int addPage(IEditorPart editor, IEditorInput input)
-			throws PartInitException {
-		int index = super.addPage(editor, input);
-		if (editor instanceof IFormPage)
-			configurePage(index, (IFormPage) editor);
-		else
-			registerPage(-1, editor);
-		return index;
-	}
-
-	/**
-	 * Adds a complete editor part to the multi-page editor at the specified
-	 * position.
-	 * 
-	 * @see MultiPageEditorPart#addPage(int, IEditorPart, IEditorInput)
-	 * @since 3.1
-	 */
-	public void addPage(int index, IEditorPart editor, IEditorInput input)
-			throws PartInitException {
-		super.addPage(index, editor, input);
-		if (editor instanceof IFormPage)
-			configurePage(index, (IFormPage) editor);
-		else
-			registerPage(index, editor);
-		updatePageIndices(index+1);
-	}
-
-	/**
-	 * Configures the form page.
-	 * 
-	 * @param index
-	 *            the page index
-	 * @param page
-	 *            the page to configure
-	 * @throws PartInitException
-	 *             if there are problems in configuring the page
-	 */
-	protected void configurePage(int index, IFormPage page)
-			throws PartInitException {
-		setPageText(index, page.getTitle());
-		// setPageImage(index, page.getTitleImage());
-		page.setIndex(index);
-		registerPage(index, page);
-	}
-
-	/**
-	 * Overrides the superclass to remove the page from the page table.
-	 * 
-	 * @param pageIndex
-	 *            the 0-based index of the page in the editor
-	 */
-	public void removePage(int pageIndex) {
-		if (pageIndex >= 0 && pageIndex < pages.size()) {
-			Object page = pages.get(pageIndex);
-			pages.remove(page);
-			if (page instanceof IFormPage) {
-				IFormPage fpage = (IFormPage) page;
-				if (!fpage.isEditor())
-					fpage.dispose();
-			}
-			updatePageIndices(pageIndex);
-		}
-		super.removePage(pageIndex);
-	}
-
-	// fix the page indices after the removal/insertion
-	private void updatePageIndices(int start) {
-		for (int i = start; i < pages.size(); i++) {
-			Object page = pages.get(i);
-			if (page instanceof IFormPage) {
-				IFormPage fpage = (IFormPage) page;
-				fpage.setIndex(i);
-			}
-		}
-	}
-
-	/**
-	 * Called to indicate that the editor has been made dirty or the changes
-	 * have been saved.
-	 */
-	public void editorDirtyStateChanged() {
-		firePropertyChange(PROP_DIRTY);
-	}
-
-	/**
-	 * Disposes the pages and the toolkit after disposing the editor itself.
-	 * Subclasses must call 'super' when reimplementing the method.
-	 */
-	public void dispose() {
-		super.dispose();
-		for (int i = 0; i < pages.size(); i++) {
-			Object page = pages.get(i);
-			if (page instanceof IFormPage) {
-				IFormPage fpage = (IFormPage) page;
-				// don't dispose source pages because they will
-				// be disposed as nested editors by the superclass
-				if (!fpage.isEditor())
-					fpage.dispose();
-			}
-		}
-		pages = null;
-		// toolkit may be null if editor has been instantiated
-		// but never created - see defect #62190
-		if (toolkit != null) {
-			toolkit.dispose();
-			toolkit = null;
-		}
-	}
-
-	/**
-	 * Returns the toolkit owned by this editor.
-	 * 
-	 * @return the toolkit object
-	 */
-	public FormToolkit getToolkit() {
-		return toolkit;
-	}
-
-	/**
-	 * Widens the visibility of the method in the superclass.
-	 * 
-	 * @return the active nested editor
-	 */
-	public IEditorPart getActiveEditor() {
-		return super.getActiveEditor();
-	}
-
-	/**
-	 * Returns the current page index. The value is identical to the value of
-	 * 'getActivePage()' except during the page switch, when this method still
-	 * has the old active page index.
-	 * <p>
-	 * Another important difference is during the editor closing. When the tab
-	 * folder is disposed, 'getActivePage()' will return -1, while this method
-	 * will still return the last active page.
-	 * 
-	 * @see #getActivePage
-	 * @return the currently selected page or -1 if no page is currently
-	 *         selected
-	 */
-	protected int getCurrentPage() {
-		return currentPage;
-	}
-
-	/**
-	 * @see MultiPageEditorPart#pageChange(int)
-	 */
-	protected void pageChange(int newPageIndex) {
-		// fix for windows handles
-		int oldPageIndex = getCurrentPage();
-		if (oldPageIndex != -1 && pages.size() > oldPageIndex
-				&& pages.get(oldPageIndex) instanceof IFormPage
-				&& oldPageIndex != newPageIndex) {
-			// Check the old page
-			IFormPage oldFormPage = (IFormPage) pages.get(oldPageIndex);
-			if (oldFormPage.canLeaveThePage() == false) {
-				setActivePage(oldPageIndex);
-				return;
-			}
-		}
-		// Now is the absolute last moment to create the page control.
-		Object page = pages.get(newPageIndex);
-		if (page instanceof IFormPage) {
-			IFormPage fpage = (IFormPage) page;
-			if (fpage.getPartControl() == null) {
-				fpage.createPartControl(getContainer());
-				setControl(newPageIndex, fpage.getPartControl());
-				fpage.getPartControl().setMenu(getContainer().getMenu());
-			}
-		}
-		if (oldPageIndex != -1 && pages.size() > oldPageIndex
-				&& pages.get(oldPageIndex) instanceof IFormPage) {
-			// Commit old page before activating the new one
-			IFormPage oldFormPage = (IFormPage) pages.get(oldPageIndex);
-			IManagedForm mform = oldFormPage.getManagedForm();
-			if (mform != null)
-				mform.commit(false);
-		}
-		if (pages.size() > newPageIndex
-				&& pages.get(newPageIndex) instanceof IFormPage)
-			((IFormPage) pages.get(newPageIndex)).setActive(true);
-		if (oldPageIndex != -1 && pages.size() > oldPageIndex
-				&& newPageIndex != oldPageIndex && 
-				pages.get(oldPageIndex) instanceof IFormPage)
-			((IFormPage) pages.get(oldPageIndex)).setActive(false);
-		// Call super - this will cause pages to switch
-		super.pageChange(newPageIndex);
-		this.currentPage = newPageIndex;
-	}
-
-	/**
-	 * Sets the active page using the unique page identifier.
-	 * 
-	 * @param pageId
-	 *            the id of the page to switch to
-	 * @return page that was set active or <samp>null </samp> if not found.
-	 */
-	public IFormPage setActivePage(String pageId) {
-		for (int i = 0; i < pages.size(); i++) {
-			Object page = pages.get(i);
-			if (page instanceof IFormPage) {
-				IFormPage fpage = (IFormPage) page;
-				if (fpage.getId().equals(pageId)) {
-					setActivePage(i);
-					return fpage;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Finds the page instance that has the provided id.
-	 * 
-	 * @param pageId
-	 *            the id of the page to find
-	 * @return page with the matching id or <code>null</code> if not found.
-	 */
-	public IFormPage findPage(String pageId) {
-		for (int i = 0; i < pages.size(); i++) {
-			Object page = pages.get(i);
-			if (page instanceof IFormPage) {
-				IFormPage fpage = (IFormPage) pages.get(i);
-				if (fpage.getId().equals(pageId))
-					return fpage;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Sets the active page using the unique page identifier and sets its input
-	 * to the provided object.
-	 * 
-	 * @param pageId
-	 *            the id of the page to switch to
-	 * @param pageInput
-	 *            the page input
-	 * @return page that was set active or <samp>null </samp> if not found.
-	 */
-	public IFormPage setActivePage(String pageId, Object pageInput) {
-		IFormPage page = setActivePage(pageId);
-		if (page != null) {
-			IManagedForm mform = page.getManagedForm();
-			if (mform != null)
-				mform.setInput(pageInput);
-		}
-		return page;
-	}
-
-	/**
-	 * Iterates through the pages calling similar method until a page is found
-	 * that contains the desired page input.
-	 * 
-	 * @param pageInput
-	 *            the object to select and reveal
-	 * @return the page that accepted the request or <code>null</code> if no
-	 *         page has the desired object.
-	 * @see #setActivePage(String, Object)
-	 */
-	public IFormPage selectReveal(Object pageInput) {
-		for (int i = 0; i < pages.size(); i++) {
-			Object page = pages.get(i);
-			if (page instanceof IFormPage) {
-				IFormPage fpage = (IFormPage) page;
-				if (fpage.selectReveal(pageInput))
-					return fpage;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns active page instance if the currently selected page index is not
-	 * -1, or <code>null</code> if it is.
-	 * 
-	 * @return active page instance if selected, or <code>null</code> if no
-	 *         page is currently active.
-	 */
-	public IFormPage getActivePageInstance() {
-		int index = getActivePage();
-		if (index != -1) {
-			Object page = pages.get(index);
-			if (page instanceof IFormPage)
-				return (IFormPage) page;
-		}
-		return null;
-	}
-
-	/**
-	 * @see MultiPageEditorPart#setActivePage(int)
-	 */
-	protected void setActivePage(int pageIndex) {
-		// fix for window handles problem
-		// this should be called only when the editor is first opened
-		if (pages.size() > pageIndex
-				&& pages.get(pageIndex) instanceof IFormPage) {
-			super.setActivePage(pageIndex);
-			IFormPage activePage = (IFormPage) pages.get(pageIndex);
-			activePage.setActive(true);
-		} else
-			super.setActivePage(pageIndex);
-		updateActionBarContributor(pageIndex);
-	}
-
-	/**
-	 * Notifies action bar contributor about page change.
-	 * 
-	 * @param pageIndex
-	 *            the index of the new page
-	 */
-	protected void updateActionBarContributor(int pageIndex) {
-		// this is to enable the undo/redo actions before a page change has
-		// occurred
-		IEditorActionBarContributor contributor = getEditorSite()
-				.getActionBarContributor();
-		if (contributor != null
-				&& contributor instanceof MultiPageEditorActionBarContributor) {
-			((MultiPageEditorActionBarContributor) contributor)
-					.setActivePage(getEditor(pageIndex));
-		}
-	}
-
-	/**
-	 * Closes the editor programmatically.
-	 * 
-	 * @param save
-	 *            if <code>true</code>, the content should be saved before
-	 *            closing.
-	 */
-	public void close(final boolean save) {
-		Display display = getSite().getShell().getDisplay();
-		display.asyncExec(new Runnable() {
-			public void run() {
-				if (toolkit != null) {
-					getSite().getPage().closeEditor(FormEditor.this, save);
-				}
-			}
-		});
-	}
-
-	private void registerPage(int index, Object page) throws PartInitException {
-		if (!pages.contains(page)) {
-			if (index == -1)
-				pages.add(page);
-			else
-				pages.add(index, page);
-		}
-		if (page instanceof IFormPage) {
-			IFormPage fpage = (IFormPage) page;
-			if (fpage.isEditor() == false)
-				fpage.init(getEditorSite(), getEditorInput());
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/editor/FormPage.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/editor/FormPage.java
deleted file mode 100644
index 64da9f1..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/editor/FormPage.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.editor;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.*;
-import org.eclipse.ui.forms.*;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.part.EditorPart;
-/**
- * A base class that all pages that should be added to FormEditor must subclass.
- * Form page has an instance of PageForm that extends managed form. Subclasses
- * should override method 'createFormContent(ManagedForm)' to fill the form with
- * content. Note that page itself can be loaded lazily (on first open).
- * Consequently, the call to create the form content can come after the editor
- * has been opened for a while (in fact, it is possible to open and close the
- * editor and never create the form because no attempt has been made to show the
- * page).
- * 
- * @since 3.0
- */
-public class FormPage extends EditorPart implements IFormPage {
-	private FormEditor editor;
-	private PageForm mform;
-	private int index;
-	private String id;
-	
-	private static class PageForm extends ManagedForm {
-		public PageForm(FormPage page, ScrolledForm form) {
-			super(page.getEditor().getToolkit(), form);
-			setContainer(page);
-		}
-		
-		public FormPage getPage() {
-			return (FormPage)getContainer();
-		}
-		public void dirtyStateChanged() {
-			getPage().getEditor().editorDirtyStateChanged();
-		}
-		public void staleStateChanged() {
-			if (getPage().isActive())
-				refresh();
-		}
-	}
-	/**
-	 * A constructor that creates the page and initializes it with the editor.
-	 * 
-	 * @param editor
-	 *            the parent editor
-	 * @param id
-	 *            the unique identifier
-	 * @param title
-	 *            the page title
-	 */
-	public FormPage(FormEditor editor, String id, String title) {
-		this(id, title);
-		initialize(editor);
-	}
-	/**
-	 * The constructor. The parent editor need to be passed in the
-	 * <code>initialize</code> method if this constructor is used.
-	 * 
-	 * @param id
-	 *            a unique page identifier
-	 * @param title
-	 *            a user-friendly page title
-	 */
-	public FormPage(String id, String title) {
-		this.id = id;
-		setPartName(title);
-	}
-	/**
-	 * Initializes the form page.
-	 * 
-	 * @see IEditorPart#init
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		setSite(site);
-		setInput(input);
-	}
-	/**
-	 * Primes the form page with the parent editor instance.
-	 * 
-	 * @param editor
-	 *            the parent editor
-	 */
-	public void initialize(FormEditor editor) {
-		this.editor = editor;
-	}
-	/**
-	 * Returns the parent editor.
-	 * 
-	 * @return parent editor instance
-	 */
-	public FormEditor getEditor() {
-		return editor;
-	}
-	/**
-	 * Returns the managed form owned by this page.
-	 * 
-	 * @return the managed form
-	 */
-	public IManagedForm getManagedForm() {
-		return mform;
-	}
-	/**
-	 * Implements the required method by refreshing the form when set active.
-	 * Subclasses must call super when overriding this method.
-	 */
-	public void setActive(boolean active) {
-		if (active) {
-			// We are switching to this page - refresh it
-			// if needed.
-			mform.refresh();
-		}
-	}
-	/**
-	 * Tests if the page is active by asking the parent editor if this page is
-	 * the currently active page.
-	 * 
-	 * @return <code>true</code> if the page is currently active,
-	 *         <code>false</code> otherwise.
-	 */
-	public boolean isActive() {
-		return this.equals(editor.getActivePageInstance());
-	}
-	/**
-	 * Creates the part control by creating the managed form using the parent
-	 * editor's toolkit. Subclasses should override
-	 * <code>createFormContent(IManagedForm)</code> to populate the form with
-	 * content.
-	 * 
-	 * @param parent
-	 *            the page parent composite
-	 */
-	public void createPartControl(Composite parent) {
-		ScrolledForm form = editor.getToolkit().createScrolledForm(parent);
-		mform = new PageForm(this, form);
-		BusyIndicator.showWhile(parent.getDisplay(), new Runnable() {
-			public void run() {
-				createFormContent(mform);
-			}
-		});
-	}
-	/**
-	 * Subclasses should override this method to create content in the form
-	 * hosted in this page.
-	 * 
-	 * @param managedForm
-	 *            the form hosted in this page.
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-	}
-	/**
-	 * Returns the form page control.
-	 * 
-	 * @return managed form's control
-	 */
-	public Control getPartControl() {
-		return mform != null ? mform.getForm() : null;
-	}
-	/**
-	 * Disposes the managed form.
-	 */
-	public void dispose() {
-		if (mform != null)
-			mform.dispose();
-	}
-	/**
-	 * Returns the unique identifier that can be used to reference this page.
-	 * 
-	 * @return the unique page identifier
-	 */
-	public String getId() {
-		return id;
-	}
-	/**
-	 * Returns <code>null</code>- form page has no title image. Subclasses
-	 * may override.
-	 * 
-	 * @return <code>null</code>
-	 */
-	public Image getTitleImage() {
-		return null;
-	}
-	/**
-	 * Sets the focus by delegating to the managed form.
-	 */
-	public void setFocus() {
-		if (mform != null)
-			mform.setFocus();
-	}
-	/**
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		if (mform != null)
-			mform.commit(true);
-	}
-	/**
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-	}
-	/**
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-	/**
-	 * Implemented by testing if the managed form is dirty.
-	 * 
-	 * @return <code>true</code> if the managed form is dirty,
-	 *         <code>false</code> otherwise.
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() {
-		return mform != null ? mform.isDirty() : false;
-	}
-	/**
-	 * Preserves the page index.
-	 * 
-	 * @param index
-	 *            the assigned page index
-	 */
-	public void setIndex(int index) {
-		this.index = index;
-	}
-	/**
-	 * Returns the saved page index.
-	 * 
-	 * @return the page index
-	 */
-	public int getIndex() {
-		return index;
-	}
-	/**
-	 * Form pages are not editors.
-	 * 
-	 * @return <code>false</code>
-	 */
-	public boolean isEditor() {
-		return false;
-	}
-	/**
-	 * Attempts to select and reveal the given object by passing the request to
-	 * the managed form.
-	 * 
-	 * @param object
-	 *            the object to select and reveal in the page if possible.
-	 * @return <code>true</code> if the page has been successfully selected
-	 *         and revealed by one of the managed form parts, <code>false</code>
-	 *         otherwise.
-	 */
-	public boolean selectReveal(Object object) {
-		if (mform != null)
-			return mform.setInput(object);
-		return false;
-	}
-	/**
-	 * By default, editor will be allowed to flip the page.
-	 * @return <code>true</code>
-	 */
-	public boolean canLeaveThePage() {
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/editor/IFormPage.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/editor/IFormPage.java
deleted file mode 100644
index a7f4ff9..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/editor/IFormPage.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.editor;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.forms.IManagedForm;
-/**
- * Interface that all GUI pages need to implement in order
- * to be added to FormEditor part. The interface makes 
- * several assumptions:
- * <ul>
- * <li>The form page has a managed form</li>
- * <li>The form page has a unique id</li>
- * <li>The form page can be GUI but can also wrap a complete
- * editor class (in that case, it should return <code>true</code>
- * from <code>isEditor()</code> method).</li>
- * <li>The form page is lazy i.e. understands that 
- * its part control will be created at the last possible
- * moment.</li>.
- * </ul>
- * <p>Existing editors can be wrapped by implementing
- * this interface. In this case, 'isEditor' should return <code>true</code>.
- * A common editor to wrap in <code>TextEditor</code> that is
- * often added to show the raw source code of the file open into
- * the multi-page editor.
- * 
- * @since 3.0
- */
-public interface IFormPage extends IEditorPart {
-	/**
-	 * @param editor
-	 *            the form editor that this page belongs to
-	 */
-	void initialize(FormEditor editor);
-	/**
-	 * Returns the editor this page belongs to.
-	 * 
-	 * @return the form editor
-	 */
-	FormEditor getEditor();
-	/**
-	 * Returns the managed form of this page, unless this is a source page.
-	 * 
-	 * @return the managed form or <samp>null </samp> if this is a source page.
-	 */
-	IManagedForm getManagedForm();
-	/**
-	 * Indicates whether the page has become the active in the editor. Classes
-	 * that implement this interface may use this method to commit the page (on
-	 * <code>false</code>) or lazily create and/or populate the content on
-	 * <code>true</code>.
-	 * 
-	 * @param active
-	 *            <code>true</code> if page should be visible, <code>false</code>
-	 *            otherwise.
-	 */
-	void setActive(boolean active);
-	/**
-	 * Returns <samp>true </samp> if page is currently active, false if not.
-	 * 
-	 * @return <samp>true </samp> for active page.
-	 */
-	boolean isActive();
-	/**
-	 * Tests if the content of the page is in a state that allows the
-	 * editor to flip to another page. Typically, pages that contain
-	 * raw source with syntax errors should not allow editors to 
-	 * leave them until errors are corrected.
-	 * @return <code>true</code> if the editor can flip to another page,
-	 * <code>false</code> otherwise.
-	 */
-	boolean canLeaveThePage();
-	/**
-	 * Returns the control associated with this page.
-	 * 
-	 * @return the control of this page if created or <samp>null </samp> if the
-	 *         page has not been shown yet.
-	 */
-	Control getPartControl();
-	/**
-	 * Page must have a unique id that can be used to show it without knowing
-	 * its relative position in the editor.
-	 * 
-	 * @return the unique page identifier
-	 */
-	String getId();
-	/**
-	 * Returns the position of the page in the editor.
-	 * 
-	 * @return the zero-based index of the page in the editor.
-	 */
-	int getIndex();
-	/**
-	 * Sets the position of the page in the editor.
-	 * 
-	 * @param index
-	 *            the zero-based index of the page in the editor.
-	 */
-	void setIndex(int index);
-	/**
-	 * Tests whether this page wraps a complete editor that
-	 * can be registered on its own, or represents a page
-	 * that cannot exist outside the multi-page editor context.
-	 * 
-	 * @return <samp>true </samp> if the page wraps an editor,
-	 *         <samp>false </samp> if this is a form page.
-	 */
-	boolean isEditor();
-	/**
-	 * A hint to bring the provided object into focus. If the object is in a
-	 * tree or table control, select it. If it is shown on a scrollable page,
-	 * ensure that it is visible. If the object is not presented in 
-	 * the page, <code>false</code> should be returned to allow another
-	 * page to try.
-	 * 
-	 * @param object
-	 *            object to select and reveal
-	 * @return <code>true</code> if the request was successful, <code>false</code>
-	 *         otherwise.
-	 */
-	boolean selectReveal(Object object);
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/editor/SharedHeaderFormEditor.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/editor/SharedHeaderFormEditor.java
deleted file mode 100644
index 3443e2a..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/editor/SharedHeaderFormEditor.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.editor;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.forms.IFormPart;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.ManagedForm;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.internal.forms.widgets.FormUtil;
-
-/**
- * A variation of {@link FormEditor}, this editor has a stable header that does
- * not change when pages are switched. Pages that are added to this editor
- * should not have the title or image set.
- * 
- * @since 3.3
- */
-public abstract class SharedHeaderFormEditor extends FormEditor {
-	private HeaderForm headerForm;
-	
-	private boolean wasHeaderActive= true;
-	private Listener activationListener= null;
-
-	private static class HeaderForm extends ManagedForm {
-		public HeaderForm(FormEditor editor, ScrolledForm form) {
-			super(editor.getToolkit(), form);
-			setContainer(editor);
-			if (editor.getEditorInput() != null)
-				setInput(editor.getEditorInput());
-		}
-
-		private FormEditor getEditor() {
-			return (FormEditor) getContainer();
-		}
-
-		public void dirtyStateChanged() {
-			getEditor().editorDirtyStateChanged();
-		}
-
-		public void staleStateChanged() {
-			refresh();
-		}
-	}
-
-	/**
-	 * The default constructor.
-	 */
-
-	public SharedHeaderFormEditor() {
-	}
-
-	/**
-	 * Overrides <code>super</code> to create a form in which to host the tab
-	 * folder. This form will be responsible for managing
-	 * 
-	 * @param parent
-	 *            the page container parent
-	 * 
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#createPageContainer(org.eclipse.swt.widgets.Composite)
-	 */
-
-	protected Composite createPageContainer(Composite parent) {
-		parent = super.createPageContainer(parent);
-		parent.setLayout(new FillLayout());
-		ScrolledForm scform = getToolkit().createScrolledForm(parent);
-		scform.getForm().setData(FormUtil.IGNORE_BODY, Boolean.TRUE);
-		headerForm = new HeaderForm(this, scform);
-		createHeaderContents(headerForm);
-		return headerForm.getForm().getBody();
-	}
-
-	/**
-	 * Returns the form that owns the shared header.
-	 * 
-	 * @return the shared header
-	 */
-
-	public IManagedForm getHeaderForm() {
-		return headerForm;
-	}
-	
-	protected void createPages() {
-		super.createPages();
-		
-		// preempt MultiPageEditorPart#createPartControl(Composite)
-		if (getActivePage() == -1) {
-			// create page control and initialize page, keep focus on header by calling super implementation
-			super.setActivePage(0);
-		}
-	}
-	
-	protected void setActivePage(int pageIndex) {
-		// programmatic focus change
-		wasHeaderActive= false;
-		super.setActivePage(pageIndex);
-	}
-	
-	public void setFocus() {
-		installActivationListener();
-		if (wasHeaderActive)
-			((ManagedForm) getHeaderForm()).setFocus();
-		else {
-			int index= getActivePage();
-			if (index == -1)
-				((ManagedForm) getHeaderForm()).setFocus();
-			else
-				super.setFocus();
-		}
-	}
-	
-	private void installActivationListener() {
-		if (activationListener == null) {
-			activationListener = new Listener() {
-				public void handleEvent(Event event) {
-					boolean wasHeaderActive = event.widget != getContainer();
-					
-					int activePage = getActivePage();
-					if (SharedHeaderFormEditor.this.wasHeaderActive != wasHeaderActive && activePage != -1 && pages.get(activePage) instanceof IEditorPart) {
-						
-						if (wasHeaderActive) {
-							deactivateSite(true, true);
-						} else {
-							activateSite();
-						}
-					}
-					
-					SharedHeaderFormEditor.this.wasHeaderActive = wasHeaderActive;
-				}
-			};
-			getContainer().addListener(SWT.Activate, activationListener);
-			getHeaderForm().getForm().getForm().getHead().addListener(SWT.Activate, activationListener);
-		}
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormEditor#dispose()
-	 */
-	public void dispose() {
-		if (headerForm != null) {
-			headerForm.dispose();
-			headerForm = null;
-		}
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormEditor#isDirty()
-	 */
-	public boolean isDirty() {
-		return headerForm.isDirty() || super.isDirty();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormEditor#commitPages(boolean)
-	 */
-	protected void commitPages(boolean onSave) {
-		if (headerForm != null && headerForm.isDirty())
-			headerForm.commit(onSave);
-		super.commitPages(onSave);
-	}
-
-	/**
-	 * Subclasses should extend this method to configure the form that owns the
-	 * shared header. If the header form will contain controls that can change
-	 * the state of the editor, they should be wrapped in an IFormPart so that
-	 * they can participate in the life cycle event management.
-	 * 
-	 * @param headerForm
-	 *            the form that owns the shared header
-	 * @see IFormPart
-	 */
-	protected void createHeaderContents(IManagedForm headerForm) {
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/editor/package.html b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/editor/package.html
deleted file mode 100644
index df243bc..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/editor/package.html
+++ /dev/null
@@ -1,13 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Support for forms-based multi-page editors.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/ExpansionAdapter.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/ExpansionAdapter.java
deleted file mode 100644
index f483062..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/ExpansionAdapter.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.events;
-/**
- * This adapter class provides default implementations for the methods
- * described by the <code>ExpansionListener</code> interface.
- * <p>
- * Classes that wish to deal with <code>ExpansionEvent</code>s can extend
- * this class and override only the methods which they are interested in.
- * </p>
- * 
- * @see IExpansionListener
- * @see ExpansionEvent
- * @since 3.0
- */
-public class ExpansionAdapter implements IExpansionListener {
-	/**
-	 * Sent when the link is entered. The default behaviour is to do nothing.
-	 * 
-	 * @param e
-	 *            the event
-	 */
-	public void expansionStateChanging(ExpansionEvent e) {
-	}
-	/**
-	 * Sent when the link is exited. The default behaviour is to do nothing.
-	 * 
-	 * @param e
-	 *            the event
-	 */
-	public void expansionStateChanged(ExpansionEvent e) {
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/ExpansionEvent.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/ExpansionEvent.java
deleted file mode 100644
index e2b34e5..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/ExpansionEvent.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.events;
-import org.eclipse.swt.events.TypedEvent;
-/**
- * Notifies listeners when expandable controls change expansion state.
- * 
- * @since 3.0
- */
-public final class ExpansionEvent extends TypedEvent {
-	private static final long serialVersionUID = 6009335074727417445L;
-	/**
-	 * Creates a new expansion ecent.
-	 * 
-	 * @param obj
-	 *            event source
-	 * @param state
-	 *            the new expansion state
-	 */
-	public ExpansionEvent(Object obj, boolean state) {
-		super(obj);
-		data = state ? Boolean.TRUE : Boolean.FALSE;
-	}
-	/**
-	 * Returns the new expansion state of the widget.
-	 * 
-	 * @return <code>true</code> if the widget is now expaned, <code>false</code>
-	 *         otherwise.
-	 */
-	public boolean getState() {
-		return data.equals(Boolean.TRUE) ? true : false;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/HyperlinkAdapter.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/HyperlinkAdapter.java
deleted file mode 100644
index 4dd56ae..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/HyperlinkAdapter.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.events;
-/**
- * This adapter class provides default implementations for the methods
- * described by the <code>HyperlinkListener</code> interface.
- * <p>
- * Classes that wish to deal with <code>HyperlinkEvent</code> s can extend
- * this class and override only the methods which they are interested in.
- * </p>
- * 
- * @see IHyperlinkListener
- * @see HyperlinkEvent
- * @since 3.0
- */
-public class HyperlinkAdapter implements IHyperlinkListener {
-	/**
-	 * Sent when the link is entered. The default behaviour is to do nothing.
-	 * 
-	 * @param e
-	 *            the event
-	 */
-	public void linkEntered(HyperlinkEvent e) {
-	}
-	/**
-	 * Sent when the link is exited. The default behaviour is to do nothing.
-	 * 
-	 * @param e
-	 *            the event
-	 */
-	public void linkExited(HyperlinkEvent e) {
-	}
-	/**
-	 * Sent when the link is activated. The default behaviour is to do nothing.
-	 * 
-	 * @param e
-	 *            the event
-	 */
-	public void linkActivated(HyperlinkEvent e) {
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/HyperlinkEvent.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/HyperlinkEvent.java
deleted file mode 100644
index a8bec77..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/HyperlinkEvent.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.events;
-import org.eclipse.swt.events.TypedEvent;
-import org.eclipse.swt.widgets.Widget;
-/**
- * Notifies listeners about a hyperlink change.
- *
- * @since 3.0
- */
-public final class HyperlinkEvent extends TypedEvent {
-	private static final long serialVersionUID = 6009335074727417445L;
-	private String label;
-	private int stateMask;
-	/**
-	 * Creates a new hyperlink
-	 * 
-	 * @param widget
-	 *            event source
-	 * @param href
-	 *            the hyperlink reference that will be followed upon when the
-	 *            hyperlink is activated.
-	 * @param label
-	 *            the name of the hyperlink (the text that is rendered as a
-	 *            link in the source widget).
-	 * @param stateMask
-	 *            the given state mask
-	 */
-	public HyperlinkEvent(Widget widget, Object href, String label, int stateMask) {
-		super(widget);
-		this.widget = widget;
-		this.data = href;
-		this.label = label;
-		this.stateMask = stateMask;
-	}
-	/**
-	 * The hyperlink reference that will be followed when the hyperlink is
-	 * activated.
-	 * 
-	 * @return the hyperlink reference object
-	 */
-	public Object getHref() {
-		return this.data;
-	}
-	/**
-	 * The text of the hyperlink rendered in the source widget.
-	 * 
-	 * @return the hyperlink label
-	 */
-	public String getLabel() {
-		return label;
-	}
-	/**
-	 * Returns the value of the keyboard state mask present when
-	 * the event occured, or SWT.NULL for no modifiers.
-	 * @return the keyboard state mask or <code>SWT.NULL</code>. 
-	 */
-	public int getStateMask() {
-		return stateMask;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/IExpansionListener.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/IExpansionListener.java
deleted file mode 100644
index 771ada3..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/IExpansionListener.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.events;
-/**
- * Classes that implement this interface will be notified before and after the
- * expandable control's expansion state changes.
- * 
- * @since 3.0
- */
-public interface IExpansionListener {
-	/**
-	 * Notifies the listener that the expandable control is about to change its
-	 * expansion state. The state provided by the event is the new state.
-	 * 
-	 * @param e
-	 *            the expansion event
-	 */
-	void expansionStateChanging(ExpansionEvent e);
-	/**
-	 * Notifies the listener after the expandable control has changed its
-	 * expansion state. The state provided by the event is the new state.
-	 * 
-	 * @param e
-	 *            the expansion event
-	 */
-	void expansionStateChanged(ExpansionEvent e);
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/IHyperlinkListener.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/IHyperlinkListener.java
deleted file mode 100644
index 34c18c4..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/IHyperlinkListener.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.events;
-/**
- * Classes that implement this interface will be notified when hyperlinks are
- * entered, exited and activated.
- * 
- * @see org.eclipse.ui.forms.widgets.Hyperlink
- * @see org.eclipse.ui.forms.widgets.ImageHyperlink
- * @see org.eclipse.ui.forms.widgets.FormText
- * @since 3.0
- */
-public interface IHyperlinkListener {
-	/**
-	 * Sent when hyperlink is entered either by mouse entering the link client
-	 * area, or keyboard focus switching to the hyperlink.
-	 * 
-	 * @param e
-	 *            an event containing information about the hyperlink
-	 */
-	void linkEntered(HyperlinkEvent e);
-	/**
-	 * Sent when hyperlink is exited either by mouse exiting the link client
-	 * area, or keyboard focus switching from the hyperlink.
-	 * 
-	 * @param e
-	 *            an event containing information about the hyperlink
-	 */
-	void linkExited(HyperlinkEvent e);
-	/**
-	 * Sent when hyperlink is activated either by mouse click inside the link
-	 * client area, or by pressing 'Enter' key while hyperlink has keyboard
-	 * focus.
-	 * 
-	 * @param e
-	 *            an event containing information about the hyperlink
-	 */
-	void linkActivated(HyperlinkEvent e);
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/package.html b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/package.html
deleted file mode 100644
index 56fb041..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/events/package.html
+++ /dev/null
@@ -1,13 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Events and listeners for forms-based parts.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/package.html b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/package.html
deleted file mode 100644
index 6e8c5dc..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/package.html
+++ /dev/null
@@ -1,13 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Forms-based controls for use in views, editors, and wizards.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/AbstractHyperlink.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/AbstractHyperlink.java
deleted file mode 100644
index 084b1f2..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/AbstractHyperlink.java
+++ /dev/null
@@ -1,349 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Izzet Safer (isafer@ca.ibm.com) - patch (see Bugzilla #250505)
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.ACC;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-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.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.internal.forms.widgets.FormsResources;
-
-/**
- * This is the base class for custom hyperlink widget. It is responsible for
- * processing mouse and keyboard events, and converting them into unified
- * hyperlink events. Subclasses are responsible for rendering the hyperlink in
- * the client area.
- * <p>
- * <dl>
- * <dt><b>Styles:</b></dt>
- * <dd>None</dd>
- * </dl>
- * 
- * @since 3.0
- */
-public abstract class AbstractHyperlink extends Canvas {
-	private boolean hasFocus;
-	boolean paintFocus=true;
-
-	/*
-	 * Armed link is one that will activate on a mouse up event, i.e.
-	 * it has received a mouse down and mouse still on top of it.
-	 */
-	private boolean armed;
-
-	private ListenerList listeners;
-
-	/**
-	 * Amount of the margin width around the hyperlink (default is 1).
-	 */
-	protected int marginWidth = 1;
-
-	/**
-	 * Amount of the margin height around the hyperlink (default is 1).
-	 */
-	protected int marginHeight = 1;
-
-	/**
-	 * Creates a new hyperlink in the provided parent.
-	 * 
-	 * @param parent
-	 *            the control parent
-	 * @param style
-	 *            the widget style
-	 */
-	public AbstractHyperlink(Composite parent, int style) {
-		super(parent, style);
-		addListener(SWT.KeyDown, new Listener() {
-			public void handleEvent(Event e) {
-				if (e.character == '\r') {
-					handleActivate(e);
-				}
-			}
-		});
-		addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				paint(e);
-			}
-		});
-		addListener(SWT.Traverse, new Listener() {
-			public void handleEvent(Event e) {
-				switch (e.detail) {
-				case SWT.TRAVERSE_PAGE_NEXT:
-				case SWT.TRAVERSE_PAGE_PREVIOUS:
-				case SWT.TRAVERSE_ARROW_NEXT:
-				case SWT.TRAVERSE_ARROW_PREVIOUS:
-				case SWT.TRAVERSE_RETURN:
-					e.doit = false;
-					return;
-				}
-				e.doit = true;
-			}
-		});
-		Listener listener = new Listener() {
-			public void handleEvent(Event e) {
-				switch (e.type) {
-				case SWT.FocusIn:
-					hasFocus = true;
-					handleEnter(e);
-					break;
-				case SWT.FocusOut:
-					hasFocus = false;
-					handleExit(e);
-					break;
-				case SWT.DefaultSelection:
-					handleActivate(e);
-					break;
-				case SWT.MouseEnter:
-					handleEnter(e);
-					break;
-				case SWT.MouseExit:
-					handleExit(e);
-					break;
-				case SWT.MouseDown:
-					handleMouseDown(e);
-					break;
-				case SWT.MouseUp:
-					handleMouseUp(e);
-					break;
-				case SWT.MouseMove:
-					handleMouseMove(e);
-					break;
-				}
-			}
-		};
-		addListener(SWT.MouseEnter, listener);
-		addListener(SWT.MouseExit, listener);
-		addListener(SWT.MouseDown, listener);
-		addListener(SWT.MouseUp, listener);
-		addListener(SWT.MouseMove, listener);
-		addListener(SWT.FocusIn, listener);
-		addListener(SWT.FocusOut, listener);
-		setCursor(FormsResources.getHandCursor());
-	}
-
-	/**
-	 * Adds the event listener to this hyperlink.
-	 * 
-	 * @param listener
-	 *            the event listener to add
-	 */
-	public void addHyperlinkListener(IHyperlinkListener listener) {
-		if (listeners == null)
-			listeners = new ListenerList();
-		listeners.add(listener);
-	}
-
-	/**
-	 * Removes the event listener from this hyperlink.
-	 * 
-	 * @param listener
-	 *            the event listener to remove
-	 */
-	public void removeHyperlinkListener(IHyperlinkListener listener) {
-		if (listeners == null)
-			return;
-		listeners.remove(listener);
-	}
-
-	/**
-	 * Returns the selection state of the control. When focus is gained, the
-	 * state will be <samp>true </samp>; it will switch to <samp>false </samp>
-	 * when the control looses focus.
-	 * 
-	 * @return <code>true</code> if the widget has focus, <code>false</code>
-	 *         otherwise.
-	 */
-	public boolean getSelection() {
-		return hasFocus;
-	}
-
-	/**
-	 * Called when hyperlink is entered. Subclasses that override this method
-	 * must call 'super'.
-	 */
-	protected void handleEnter(Event e) {
-		redraw();
-		if (listeners == null)
-			return;
-		int size = listeners.size();
-		HyperlinkEvent he = new HyperlinkEvent(this, getHref(), getText(),
-				e.stateMask);
-		Object[] listenerList = listeners.getListeners();
-		for (int i = 0; i < size; i++) {
-			IHyperlinkListener listener = (IHyperlinkListener) listenerList[i];
-			listener.linkEntered(he);
-		}
-	}
-
-	/**
-	 * Called when hyperlink is exited. Subclasses that override this method
-	 * must call 'super'.
-	 */
-	protected void handleExit(Event e) {
-		// disarm the link; won't activate on mouseup
-		armed = false;
-		redraw();
-		if (listeners == null)
-			return;
-		int size = listeners.size();
-		HyperlinkEvent he = new HyperlinkEvent(this, getHref(), getText(),
-				e.stateMask);
-		Object[] listenerList = listeners.getListeners();
-		for (int i = 0; i < size; i++) {
-			IHyperlinkListener listener = (IHyperlinkListener) listenerList[i];
-			listener.linkExited(he);
-		}
-	}
-
-	/**
-	 * Called when hyperlink has been activated. Subclasses that override this
-	 * method must call 'super'.
-	 */
-	protected void handleActivate(Event e) {
-		// disarm link, back to normal state
-		armed = false;
-		if (listeners == null)
-			return;
-		int size = listeners.size();
-		setCursor(FormsResources.getBusyCursor());
-		HyperlinkEvent he = new HyperlinkEvent(this, getHref(), getText(),
-				e.stateMask);
-		Object[] listenerList = listeners.getListeners();
-		for (int i = 0; i < size; i++) {
-			IHyperlinkListener listener = (IHyperlinkListener) listenerList[i];
-			listener.linkActivated(he);
-		}
-		if (!isDisposed()) {
-			setCursor(FormsResources.getHandCursor());
-			triggerAccessible();
-		}
-	}
-
-	void triggerAccessible() {
-		getAccessible().setFocus(ACC.CHILDID_SELF);
-	}
-
-	/**
-	 * Sets the object associated with this hyperlink. Concrete implementation
-	 * of this class can use if to store text, URLs or model objects that need
-	 * to be processed on hyperlink events.
-	 * 
-	 * @param href
-	 *            the hyperlink object reference
-	 */
-	public void setHref(Object href) {
-		setData("href", href); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the object associated with this hyperlink.
-	 * 
-	 * @see #setHref
-	 * @return the hyperlink object reference
-	 */
-	public Object getHref() {
-		return getData("href"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the textual representation of this hyperlink suitable for showing
-	 * in tool tips or on the status line.
-	 * 
-	 * @return the hyperlink text
-	 */
-	public String getText() {
-		return getToolTipText();
-	}
-
-	/**
-	 * Paints the hyperlink as a reaction to the provided paint event.
-	 * 
-	 * @param gc
-	 *            graphic context
-	 */
-	protected abstract void paintHyperlink(GC gc);
-
-	/**
-	 * Paints the control as a reaction to the provided paint event.
-	 * 
-	 * @param e
-	 *            the paint event
-	 */
-	protected void paint(PaintEvent e) {
-		GC gc = e.gc;
-		Rectangle clientArea = getClientArea();
-		if (clientArea.width == 0 || clientArea.height == 0)
-			return;
-		paintHyperlink(gc);
-		if (paintFocus && hasFocus) {
-			Rectangle carea = getClientArea();
-			gc.setForeground(getForeground());
-			gc.drawFocus(0, 0, carea.width, carea.height);
-		}
-	}
-
-	private void handleMouseDown(Event e) {
-		if (e.button != 1)
-			return;
-		// armed and ready to activate on mouseup
-		armed = true;
-	}
-
-	private void handleMouseUp(Event e) {
-		if (!armed || e.button != 1)
-			return;
-		Point size = getSize();
-		// Filter out mouse up events outside
-		// the link. This can happen when mouse is
-		// clicked, dragged outside the link, then
-		// released.
-		if (e.x < 0)
-			return;
-		if (e.y < 0)
-			return;
-		if (e.x >= size.x)
-			return;
-		if (e.y >= size.y)
-			return;
-		handleActivate(e);
-	}
-
-	private void handleMouseMove(Event e) {
-		// disarm link if we move out of bounds
-		if (armed) {
-			Point size = getSize();
-			armed = (e.x >= 0 && e.y >= 0 && e.x < size.x && e.y < size.y);
-		}
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Control#setEnabled(boolean)
-	 */
-
-	public void setEnabled (boolean enabled) {
-		boolean needsRedraw = enabled != getEnabled();
-		super.setEnabled(enabled);
-		if (needsRedraw)
-			redraw();
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ColumnLayout.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ColumnLayout.java
deleted file mode 100644
index 42e9375..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ColumnLayout.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     dinko.ivanov@sap.com - patch #70790
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-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;
-/**
- * This layout manager arranges children of the composite parent in vertical
- * columns. All the columns are identical size and children are stretched
- * horizontally to fill the column width. The goal is to give layout some
- * reasonable range of column numbers to allow it to handle various parent
- * widths. That way, column number will drop to the lowest number in the range
- * when width decreases, and grow up to the highest number in the range when
- * allowed by the parent width.
- * <p>
- * In addition, the layout attempts to 'fill the space' equally i.e. to avoid
- * large gaps at the and of the last column.
- * <p>
- * Child controls are layed out according to their 'natural' (preferred) size.
- * For 'stretchy' controls that do not have natural preferred size, it is
- * possible to set width and/or height hints using ColumnLayoutData objects.
- * 
- * @see ColumnLayoutData
- * @since 3.0
- */
-public final class ColumnLayout extends Layout implements ILayoutExtension {
-	/**
-	 * Minimum number of columns (default is 1).
-	 */
-	public int minNumColumns = 1;
-	/**
-	 * Maximum number of columns (default is 3).
-	 */
-	public int maxNumColumns = 3;
-	/**
-	 * Horizontal spacing between columns (default is 5).
-	 */
-	public int horizontalSpacing = 5;
-	/**
-	 * Vertical spacing between controls (default is 5).
-	 */
-	public int verticalSpacing = 5;
-	/**
-	 * Top margin (default is 5).
-	 */
-	public int topMargin = 5;
-	/**
-	 * Left margin (default is 5).
-	 */
-	public int leftMargin = 5;
-	/**
-	 * Bottom margin (default is 5).
-	 */
-	public int bottomMargin = 5;
-	/**
-	 * Right margin (default is 5).
-	 */
-	public int rightMargin = 5;
-
-	/**
-	 * Creates a new instance of the column layout.
-	 */
-	public ColumnLayout() {
-	}
-
-	protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
-		if (wHint == 0)
-			return computeSize(composite, wHint, hHint, minNumColumns);
-		else if (wHint == SWT.DEFAULT)
-			return computeSize(composite, wHint, hHint, maxNumColumns);
-		else
-			return computeSize(composite, wHint, hHint, -1);
-	}
-
-	private Point computeSize(Composite parent, int wHint, int hHint, int ncolumns) {
-		Control[] children = parent.getChildren();
-		int cwidth = 0;
-		int cheight = 0;
-		Point[] sizes = new Point[children.length];
-
-		int cwHint = SWT.DEFAULT;
-		if (ncolumns != -1) {
-			cwHint = wHint - leftMargin - rightMargin - (ncolumns - 1) * horizontalSpacing;
-			if (cwHint <= 0)
-				cwHint = 0;
-			else
-				cwHint /= ncolumns;
-		}
-
-		for (int i = 0; i < children.length; i++) {
-			sizes[i] = computeControlSize(children[i], cwHint);
-			cwidth = Math.max(cwidth, sizes[i].x);
-			cheight += sizes[i].y;
-		}
-		if (ncolumns == -1) {
-			// must compute
-			ncolumns = (wHint - leftMargin - rightMargin - horizontalSpacing) / (cwidth + horizontalSpacing);
-			ncolumns = Math.min(ncolumns, children.length);
-			ncolumns = Math.max(ncolumns, minNumColumns);
-			ncolumns = Math.min(ncolumns, maxNumColumns);
-		}
-		int perColHeight = cheight / ncolumns;
-		if (cheight % ncolumns != 0)
-			perColHeight++;
-		int colHeight = 0;
-		int[] heights = new int[ncolumns];
-		int ncol = 0;
-		
-		boolean fillIn = false;
-		
-		for (int i = 0; i < sizes.length; i++) {
-			int childHeight = sizes[i].y;
-			if (i>0 && colHeight + childHeight > perColHeight) {
-				heights[ncol] = colHeight;
-				ncol++;
-				if (ncol == ncolumns || fillIn) {
-					// overflow - start filling in
-					fillIn = true;
-					ncol = findShortestColumn(heights);
-				}
-				colHeight = heights[ncol];
-			}
-			if (colHeight > 0)
-				colHeight += verticalSpacing;
-			colHeight += childHeight;
-		}
-		heights[ncol] = Math.max(heights[ncol],colHeight);
-		
-		Point size = new Point(0, 0);
-		for (int i = 0; i < ncolumns; i++) {
-			size.y = Math.max(size.y, heights[i]);
-		}
-		size.x = cwidth * ncolumns + (ncolumns - 1) * horizontalSpacing;
-		size.x += leftMargin + rightMargin;
-		//System.out.println("ColumnLayout: whint="+wHint+", size.x="+size.x);
-		size.y += topMargin + bottomMargin;
-		return size;
-	}
-
-	private Point computeControlSize(Control c, int wHint) {
-		ColumnLayoutData cd = (ColumnLayoutData) c.getLayoutData();
-		int widthHint = cd != null ? cd.widthHint : wHint;
-		int heightHint = cd != null ? cd.heightHint : SWT.DEFAULT;
-		return c.computeSize(widthHint, heightHint);
-	}
-
-	private int findShortestColumn(int[] heights) {
-		int result = 0;
-		int height = Integer.MAX_VALUE;
-		for (int i = 0; i < heights.length; i++) {
-			if (height > heights[i]) {
-				height = heights[i];
-				result = i;
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.widgets.Layout#layout(org.eclipse.swt.widgets.Composite,
-	 *      boolean)
-	 */
-	protected void layout(Composite parent, boolean flushCache) {
-		Control[] children = parent.getChildren();
-		Rectangle carea = parent.getClientArea();
-		int cwidth = 0;
-		int cheight = 0;
-		Point[] sizes = new Point[children.length];
-		for (int i = 0; i < children.length; i++) {
-			sizes[i] = computeControlSize(children[i], SWT.DEFAULT);
-			cwidth = Math.max(cwidth, sizes[i].x);
-			cheight += sizes[i].y;
-		}
-		int ncolumns = (carea.width - leftMargin - rightMargin - horizontalSpacing) / (cwidth + horizontalSpacing);
-		ncolumns = Math.min(ncolumns, children.length);		
-		ncolumns = Math.max(ncolumns, minNumColumns);
-		ncolumns = Math.min(ncolumns, maxNumColumns);
-		int realWidth = (carea.width - leftMargin - rightMargin + horizontalSpacing) / ncolumns - horizontalSpacing;
-//		int childrenPerColumn = children.length / ncolumns;
-//		if (children.length % ncolumns != 0)
-//			childrenPerColumn++;
-//		int colWidth = 0;
-
-		int fillWidth = Math.max(cwidth, realWidth);
-		
-		int perColHeight = cheight / ncolumns;
-		if (cheight % ncolumns != 0)
-			perColHeight++;
-		
-		int colHeight = 0;
-		int[] heights = new int[ncolumns];
-		int ncol = 0;
-		int x = leftMargin;
-		boolean fillIn = false;
-		
-		for (int i = 0; i < sizes.length; i++) {
-			Control child = children[i];
-			Point csize = sizes[i];
-			ColumnLayoutData cd = (ColumnLayoutData) child.getLayoutData();
-			int align = cd != null ? cd.horizontalAlignment : ColumnLayoutData.FILL;
-			int childWidth = align == ColumnLayoutData.FILL ? fillWidth : csize.x;
-
-			if (i>0 && colHeight + csize.y > perColHeight) {
-				heights[ncol] = colHeight;
-				if (fillIn || ncol == ncolumns-1) {
-					// overflow - start filling in
-					fillIn = true;
-					ncol = findShortestColumn(heights);
-					
-					x = leftMargin + ncol * (fillWidth + horizontalSpacing);
-
-				}
-				else {
-					ncol++;
-					x += fillWidth + horizontalSpacing;
-				}
-				colHeight = heights[ncol];
-			}
-			if (colHeight > 0)
-				colHeight += verticalSpacing;
-			
-			
-			switch (align) {
-				case ColumnLayoutData.LEFT :
-				case ColumnLayoutData.FILL :
-					child.setBounds(x, topMargin+colHeight, childWidth, csize.y);
-					break;
-				case ColumnLayoutData.RIGHT :
-					child.setBounds(x + fillWidth - childWidth, topMargin+colHeight, childWidth, csize.y);
-					break;
-				case ColumnLayoutData.CENTER :
-					child.setBounds(x + fillWidth / 2 - childWidth / 2, topMargin+colHeight, childWidth, csize.y);
-					break;
-			}
-			
-			colHeight += csize.y;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.widgets.ILayoutExtension#computeMaximumWidth(org.eclipse.swt.widgets.Composite,
-	 *      boolean)
-	 */
-	public int computeMaximumWidth(Composite parent, boolean changed) {
-		return computeSize(parent, SWT.DEFAULT, SWT.DEFAULT, changed).x;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.widgets.ILayoutExtension#computeMinimumWidth(org.eclipse.swt.widgets.Composite,
-	 *      boolean)
-	 */
-	public int computeMinimumWidth(Composite parent, boolean changed) {
-		return computeSize(parent, 0, SWT.DEFAULT, changed).x;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ColumnLayoutData.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ColumnLayoutData.java
deleted file mode 100644
index 2f6fc09..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ColumnLayoutData.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-import org.eclipse.swt.SWT;
-/**
- * This class is used to store layout data for the <code>ColumnLayout</code>
- * class. You can control width and height hints, as well as horizontal
- * alignment using instances of this class. As with other layouts, they are not
- * required to get the default behaviour.
- * 
- * @see ColumnLayout
- * @since 3.0
- */
-public final class ColumnLayoutData {
-	/**
-	 * Width hint that will be used instead of the computed control width when
-	 * used in conjunction with <code>ColumnLayout</code> class (default is
-	 * SWT.DEFAULT).
-	 */
-	public int widthHint = SWT.DEFAULT;
-	/**
-	 * Height hint that will be used instead of the computed control height
-	 * when used in conjunction with <code>ColumnLayout</code> class (default
-	 * is SWT.DEFAULT).
-	 */
-	public int heightHint = SWT.DEFAULT;
-	/**
-	 * Horizontal alignment constant - control will be aligned to the left.
-	 */
-	public static final int LEFT = 1;
-	/**
-	 * Horizontal alignment constant - control will be aligned to the right.
-	 */
-	public static final int CENTER = 2;
-	/**
-	 * Horizontal alignment constant - control will be centered.
-	 */
-	public static final int RIGHT = 3;
-	/**
-	 * Horizontal alignment constant - control will fill the column.
-	 */
-	public static final int FILL = 4;
-	/**
-	 * Horizontal alignment variable (default is FILL).
-	 */
-	public int horizontalAlignment = FILL;
-	/**
-	 * Convinience constructor for the class.
-	 * 
-	 * @param wHint
-	 *            width hint for the control
-	 * @param hHint
-	 *            height hint for the control
-	 */
-	public ColumnLayoutData(int wHint, int hHint) {
-		this.widthHint = wHint;
-		this.heightHint = hHint;
-	}
-	/**
-	 * Convinience constructor for the class.
-	 * 
-	 * @param wHint
-	 *            width hint for the control
-	 */
-	public ColumnLayoutData(int wHint) {
-		this.widthHint = wHint;
-	}
-	/**
-	 * The default constructor.
-	 *  
-	 */
-	public ColumnLayoutData() {
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ExpandableComposite.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ExpandableComposite.java
deleted file mode 100644
index 6213456..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ExpandableComposite.java
+++ /dev/null
@@ -1,1099 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Kai Nacke - Fix for Bug 202382
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-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.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.events.IExpansionListener;
-import org.eclipse.ui.internal.forms.widgets.FormUtil;
-import org.eclipse.ui.internal.forms.widgets.FormsResources;
-
-/**
- * This composite is capable of expanding or collapsing a single client that is
- * its direct child. The composite renders an expansion toggle affordance
- * (according to the chosen style), and a title that also acts as a hyperlink
- * (can be selected and is traversable). The client is layed out below the title
- * when expanded, or hidden when collapsed.
- * <p>
- * The widget can be instantiated as-is, or subclassed to modify some aspects of
- * it. *
- * <p>
- * Since 3.1, left/right arrow keys can be used to control the expansion state.
- * If several expandable composites are created in the same parent, up/down
- * arrow keys can be used to traverse between them. Expandable text accepts
- * mnemonics and mnemonic activation will toggle the expansion state.
- * 
- * <p>
- * While expandable composite recognize that different styles can be used to
- * render the title bar, and even defines the constants for these styles (<code>TITLE_BAR</code>
- * and <code>SHORT_TITLE_BAR</code> the actual painting is done in the
- * subclasses.
- * 
- * @see Section
- * @since 3.0
- */
-public class ExpandableComposite extends Canvas {
-	/**
-	 * If this style is used, a twistie will be used to render the expansion
-	 * toggle.
-	 */
-	public static final int TWISTIE = 1 << 1;
-
-	/**
-	 * If this style is used, a tree node with either + or - signs will be used
-	 * to render the expansion toggle.
-	 */
-	public static final int TREE_NODE = 1 << 2;
-
-	/**
-	 * If this style is used, the title text will be rendered as a hyperlink
-	 * that can individually accept focus. Otherwise, it will still act like a
-	 * hyperlink, but only the toggle control will accept focus.
-	 */
-	public static final int FOCUS_TITLE = 1 << 3;
-
-	/**
-	 * If this style is used, the client origin will be vertically aligned with
-	 * the title text. Otherwise, it will start at x = 0.
-	 */
-	public static final int CLIENT_INDENT = 1 << 4;
-
-	/**
-	 * If this style is used, computed size of the composite will take the
-	 * client width into consideration only in the expanded state. Otherwise,
-	 * client width will always be taken into acount.
-	 */
-	public static final int COMPACT = 1 << 5;
-
-	/**
-	 * If this style is used, the control will be created in the expanded state.
-	 * This state can later be changed programmatically or by the user if
-	 * TWISTIE or TREE_NODE style is used.
-	 */
-	public static final int EXPANDED = 1 << 6;
-
-	/**
-	 * If this style is used, title bar decoration will be painted behind the
-	 * text.
-	 */
-	public static final int TITLE_BAR = 1 << 8;
-
-	/**
-	 * If this style is used, a short version of the title bar decoration will
-	 * be painted behind the text. This style is useful when a more descrete
-	 * option is needed for the title bar.
-	 * 
-	 * @since 3.1
-	 */
-	public static final int SHORT_TITLE_BAR = 1 << 9;
-
-	/**
-	 * If this style is used, title will not be rendered.
-	 */
-	public static final int NO_TITLE = 1 << 12;
-
-	/**
-	 * By default, text client is right-aligned. If this style is used, it will
-	 * be positioned after the text control and vertically centered with it.
-	 */
-	public static final int LEFT_TEXT_CLIENT_ALIGNMENT = 1 << 13;
-
-	/**
-	 * Width of the margin that will be added around the control (default is 0).
-	 */
-	public int marginWidth = 0;
-
-	/**
-	 * Height of the margin that will be added around the control (default is
-	 * 0).
-	 */
-	public int marginHeight = 0;
-
-	/**
-	 * Vertical spacing between the title area and the composite client control
-	 * (default is 3).
-	 */
-	public int clientVerticalSpacing = 3;
-
-	/**
-	 * Vertical spacing between the title area and the description control
-	 * (default is 0). The description control is normally placed at the new
-	 * line as defined in the font used to render it. This value will be added
-	 * to it.
-	 * 
-	 * @since 3.3
-	 */
-	public int descriptionVerticalSpacing = 0;
-
-	/**
-	 * Horizontal margin around the inside of the title bar area when TITLE_BAR
-	 * or SHORT_TITLE_BAR style is used. This variable is not used otherwise.
-	 * 
-	 * @since 3.3
-	 */
-	public int titleBarTextMarginWidth = 6;
-
-	/**
-	 * The toggle widget used to expand the composite.
-	 */
-	protected ToggleHyperlink toggle;
-
-	/**
-	 * The text label for the title.
-	 */
-	protected Control textLabel;
-
-	/**
-	 * @deprecated this variable was left as protected by mistake. It will be
-	 *             turned into static and hidden in the future versions. Do not
-	 *             use them and do not change its value.
-	 */
-	protected int VGAP = 3;
-	/**
-	 * @deprecated this variable was left as protected by mistake. It will be
-	 *             turned into static and hidden in the future versions. Do not
-	 *             use it and do not change its value.
-	 */
-	protected int GAP = 4;
-
-	static final int IGAP = 4;
-	static final int IVGAP = 3;
-
-	private static final Point NULL_SIZE = new Point(0, 0);
-
-	private static final int VSPACE = 3;
-
-	private static final int SEPARATOR_HEIGHT = 2;
-
-	private int expansionStyle = TWISTIE | FOCUS_TITLE | EXPANDED;
-
-	private boolean expanded;
-
-	private Control textClient;
-
-	private Control client;
-
-	private ListenerList listeners = new ListenerList();
-
-	private Color titleBarForeground;
-
-	private class ExpandableLayout extends Layout implements ILayoutExtension {
-
-		private SizeCache toggleCache = new SizeCache();
-
-		private SizeCache textClientCache = new SizeCache();
-
-		private SizeCache textLabelCache = new SizeCache();
-
-		private SizeCache descriptionCache = new SizeCache();
-
-		private SizeCache clientCache = new SizeCache();
-
-		private void initCache(boolean shouldFlush) {
-			toggleCache.setControl(toggle);
-			textClientCache.setControl(textClient);
-			textLabelCache.setControl(textLabel);
-			descriptionCache.setControl(getDescriptionControl());
-			clientCache.setControl(client);
-
-			if (shouldFlush) {
-				toggleCache.flush();
-				textClientCache.flush();
-				textLabelCache.flush();
-				descriptionCache.flush();
-				clientCache.flush();
-			}
-		}
-
-		protected void layout(Composite parent, boolean changed) {
-			initCache(changed);
-
-			Rectangle clientArea = parent.getClientArea();
-			int thmargin = 0;
-			int tvmargin = 0;
-
-			if (hasTitleBar()) {
-				thmargin = titleBarTextMarginWidth;
-				tvmargin = IVGAP;
-			}
-			int x = marginWidth + thmargin;
-			int y = marginHeight + tvmargin;
-			Point tsize = NULL_SIZE;
-			Point tcsize = NULL_SIZE;
-			if (toggle != null)
-				tsize = toggleCache.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-			int twidth = clientArea.width - marginWidth - marginWidth
-					- thmargin - thmargin;
-			if (tsize.x > 0)
-				twidth -= tsize.x + IGAP;
-			if (textClient != null) {
-				tcsize = textClientCache.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-			}
-			Point size = NULL_SIZE;
-			if (textLabel != null) {
-				if (tcsize.x > 0 && FormUtil.isWrapControl(textClient)) {
-					size = textLabelCache.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-					if (twidth < size.x + IGAP + tcsize.x) {
-						twidth -= IGAP;
-						if (textLabel instanceof Label)
-							size = FormUtil.computeWrapSize(new GC(textLabel), ((Label)textLabel).getText(), Math.round(twidth*(size.x/(float)(size.x+tcsize.x))));
-						else
-							size = textLabelCache.computeSize(Math.round(twidth*(size.x/(float)(size.x+tcsize.x))), SWT.DEFAULT);
-						tcsize = textClientCache.computeSize(twidth-size.x, SWT.DEFAULT);
-					}
-				}
-				else {
-					if (tcsize.x > 0)
-						twidth -= tcsize.x + IGAP;
-					size = textLabelCache.computeSize(twidth, SWT.DEFAULT);
-				}
-			}
-			if (textLabel instanceof Label) {
-				Point defSize = textLabelCache.computeSize(SWT.DEFAULT,
-						SWT.DEFAULT);
-				if (defSize.y == size.y) {
-					// One line - pick the smaller of the two widths
-					size.x = Math.min(defSize.x, size.x);
-				}
-			}
-			if (toggle != null) {
-				GC gc = new GC(ExpandableComposite.this);
-				gc.setFont(getFont());
-				FontMetrics fm = gc.getFontMetrics();
-				int textHeight = fm.getHeight();
-				gc.dispose();
-				if (textClient != null
-						&& (expansionStyle & LEFT_TEXT_CLIENT_ALIGNMENT) != 0) {
-					textHeight = Math.max(textHeight, tcsize.y);
-				}
-				int ty = textHeight / 2 - tsize.y / 2 + 1;
-				ty = Math.max(ty, 0);
-				ty += marginHeight + tvmargin;
-				toggle.setLocation(x, ty);
-				toggle.setSize(tsize);
-				x += tsize.x + IGAP;
-			}
-			if (textLabel != null) {
-				int ty = y;
-				if (textClient != null
-						&& (expansionStyle & LEFT_TEXT_CLIENT_ALIGNMENT) != 0) {
-					if (size.y < tcsize.y)
-						ty = tcsize.y / 2 - size.y / 2 + marginHeight
-								+ tvmargin;
-				}
-				textLabelCache.setBounds(x, ty, size.x, size.y);
-			}
-			if (textClient != null) {
-				int tcx;
-				if ((expansionStyle & LEFT_TEXT_CLIENT_ALIGNMENT) != 0) {
-					tcx = x + size.x + GAP;
-				} else {
-					tcx = clientArea.width - tcsize.x - marginWidth - thmargin;
-				}
-				textClientCache.setBounds(tcx, y, tcsize.x, tcsize.y);
-			}
-			int tbarHeight = 0;
-			if (size.y > 0)
-				tbarHeight = size.y;
-			if (tcsize.y > 0)
-				tbarHeight = Math.max(tbarHeight, tcsize.y);
-			y += tbarHeight;
-			if (hasTitleBar())
-				y += tvmargin;
-			if (getSeparatorControl() != null) {
-				y += VSPACE;
-				getSeparatorControl().setBounds(marginWidth, y,
-						clientArea.width - marginWidth - marginWidth,
-						SEPARATOR_HEIGHT);
-				y += SEPARATOR_HEIGHT;
-				if (expanded)
-					y += VSPACE;
-			}
-			if (expanded) {
-				int areaWidth = clientArea.width - marginWidth - marginWidth
-						- thmargin - thmargin;
-				int cx = marginWidth + thmargin;
-				if ((expansionStyle & CLIENT_INDENT) != 0) {
-					cx = x;
-					areaWidth -= x;
-				}
-				if (client != null) {
-					Point dsize = null;
-					Control desc = getDescriptionControl();
-					if (desc != null) {
-						dsize = descriptionCache.computeSize(areaWidth,
-								SWT.DEFAULT);
-						y += descriptionVerticalSpacing;
-						descriptionCache.setBounds(cx, y, areaWidth, dsize.y);
-						y += dsize.y + clientVerticalSpacing;
-					} else {
-						y += clientVerticalSpacing;
-						if (getSeparatorControl() != null)
-							y -= VSPACE;
-					}
-					int cwidth = areaWidth;
-					int cheight = clientArea.height - marginHeight
-							- marginHeight - y;
-					clientCache.setBounds(cx, y, cwidth, cheight);
-				}
-			}
-		}
-
-		protected Point computeSize(Composite parent, int wHint, int hHint,
-				boolean changed) {
-			initCache(changed);
-
-			int width = 0, height = 0;
-			Point tsize = NULL_SIZE;
-			int twidth = 0;
-			if (toggle != null) {
-				tsize = toggleCache.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-				twidth = tsize.x + IGAP;
-			}
-			int thmargin = 0;
-			int tvmargin = 0;
-
-			if (hasTitleBar()) {
-				thmargin = titleBarTextMarginWidth;
-				tvmargin = IVGAP;
-			}
-			int innerwHint = wHint;
-			if (innerwHint != SWT.DEFAULT)
-				innerwHint -= twidth + marginWidth + marginWidth + thmargin
-						+ thmargin;
-
-			int innertHint = innerwHint;
-
-			Point tcsize = NULL_SIZE;
-			if (textClient != null) {
-				tcsize = textClientCache.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-			}
-			Point size = NULL_SIZE;
-
-			if (textLabel != null) {
-				if (tcsize.x > 0 && FormUtil.isWrapControl(textClient)) {
-					size = textLabelCache.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-					if (innertHint != SWT.DEFAULT && innertHint < size.x + IGAP + tcsize.x) {
-						innertHint -= IGAP;
-						if (textLabel instanceof Label)
-							size = FormUtil.computeWrapSize(new GC(textLabel), ((Label)textLabel).getText(), Math.round(innertHint*(size.x/(float)(size.x+tcsize.x))));
-						else
-							size = textLabelCache.computeSize(Math.round(innertHint*(size.x/(float)(size.x+tcsize.x))), SWT.DEFAULT);
-						tcsize = textClientCache.computeSize(innertHint-size.x, SWT.DEFAULT);
-					}
-				} else {
-					if (innertHint != SWT.DEFAULT && tcsize.x > 0)
-						innertHint -= IGAP + tcsize.x;
-					size = textLabelCache.computeSize(innertHint, SWT.DEFAULT);
-				}
-			}
-			if (textLabel instanceof Label) {
-				Point defSize = textLabelCache.computeSize(SWT.DEFAULT,
-						SWT.DEFAULT);
-				if (defSize.y == size.y) {
-					// One line - pick the smaller of the two widths
-					size.x = Math.min(defSize.x, size.x);
-				}
-			}
-			if (size.x > 0)
-				width = size.x;
-			if (tcsize.x > 0)
-				width += IGAP + tcsize.x;
-			if (toggle != null)
-				width += twidth;
-			height = tcsize.y > 0 ? Math.max(tcsize.y, size.y) : size.y;
-			if (getSeparatorControl() != null) {
-				height += VSPACE + SEPARATOR_HEIGHT;
-				if (expanded && client != null)
-					height += VSPACE;
-			}
-			// if (hasTitleBar())
-			// height += VSPACE;
-			if ((expanded || (expansionStyle & COMPACT) == 0) && client != null) {
-				int cwHint = wHint;
-				int clientIndent = 0;
-				if ((expansionStyle & CLIENT_INDENT) != 0)
-					clientIndent = twidth;
-
-				if (cwHint != SWT.DEFAULT) {
-					cwHint -= marginWidth + marginWidth + thmargin + thmargin;
-					if ((expansionStyle & CLIENT_INDENT) != 0)
-						if (tcsize.x > 0)
-							cwHint -= twidth;
-				}
-				Point dsize = null;
-				Point csize = clientCache.computeSize(FormUtil.getWidthHint(
-						cwHint, client), SWT.DEFAULT);
-				if (getDescriptionControl() != null) {
-					int dwHint = cwHint;
-					if (dwHint == SWT.DEFAULT) {
-						dwHint = csize.x;
-						if ((expansionStyle & CLIENT_INDENT) != 0)
-							dwHint -= twidth;
-					}
-					dsize = descriptionCache.computeSize(dwHint, SWT.DEFAULT);
-				}
-				if (dsize != null) {
-					width = Math.max(width, dsize.x + clientIndent);
-					if (expanded)
-						height += descriptionVerticalSpacing + dsize.y
-								+ clientVerticalSpacing;
-				} else {
-					height += clientVerticalSpacing;
-					if (getSeparatorControl() != null)
-						height -= VSPACE;
-				}
-				width = Math.max(width, csize.x + clientIndent);
-				if (expanded)
-					height += csize.y;
-			}
-			if (toggle != null)
-				height = height - size.y + Math.max(size.y, tsize.y);
-
-			Point result = new Point(width + marginWidth + marginWidth
-					+ thmargin + thmargin, height + marginHeight + marginHeight
-					+ tvmargin + tvmargin);
-			return result;
-		}
-
-		public int computeMinimumWidth(Composite parent, boolean changed) {
-			return computeSize(parent, 0, SWT.DEFAULT, changed).x;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.forms.parts.ILayoutExtension#computeMinimumWidth(org.eclipse.swt.widgets.Composite,
-		 *      boolean)
-		 */
-		public int computeMaximumWidth(Composite parent, boolean changed) {
-			return computeSize(parent, SWT.DEFAULT, SWT.DEFAULT, changed).x;
-		}
-	}
-
-	/**
-	 * Creates an expandable composite using a TWISTIE toggle.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param style
-	 *            SWT style bits
-	 */
-	public ExpandableComposite(Composite parent, int style) {
-		this(parent, style, TWISTIE);
-	}
-
-	/**
-	 * Creates the expandable composite in the provided parent.
-	 * 
-	 * @param parent
-	 *            the parent
-	 * @param style
-	 *            the control style (as expected by SWT subclass)
-	 * @param expansionStyle
-	 *            the style of the expansion widget (TREE_NODE, TWISTIE,
-	 *            CLIENT_INDENT, COMPACT, FOCUS_TITLE,
-	 *            LEFT_TEXT_CLIENT_ALIGNMENT, NO_TITLE)
-	 */
-	public ExpandableComposite(Composite parent, int style, int expansionStyle) {
-		super(parent, style);
-		this.expansionStyle = expansionStyle;
-		if ((expansionStyle & TITLE_BAR) != 0)
-			setBackgroundMode(SWT.INHERIT_DEFAULT);
-		super.setLayout(new ExpandableLayout());
-		if (hasTitleBar()) {
-			this.addPaintListener(new PaintListener() {
-				public void paintControl(PaintEvent e) {
-					onPaint(e);
-				}
-			});
-		}
-		if ((expansionStyle & TWISTIE) != 0)
-			toggle = new Twistie(this, SWT.NULL);
-		else if ((expansionStyle & TREE_NODE) != 0)
-			toggle = new TreeNode(this, SWT.NULL);
-		else
-			expanded = true;
-		if ((expansionStyle & EXPANDED) != 0)
-			expanded = true;
-		if (toggle != null) {
-			toggle.setExpanded(expanded);
-			toggle.addHyperlinkListener(new HyperlinkAdapter() {
-				public void linkActivated(HyperlinkEvent e) {
-					toggleState();
-				}
-			});
-			toggle.addPaintListener(new PaintListener() {
-				public void paintControl(PaintEvent e) {
-					if (textLabel instanceof Label && !isFixedStyle())
-						textLabel.setForeground(toggle.hover ? toggle
-								.getHoverDecorationColor()
-								: getTitleBarForeground());
-				}
-			});
-			toggle.addKeyListener(new KeyAdapter() {
-				public void keyPressed(KeyEvent e) {
-					if (e.keyCode == SWT.ARROW_UP) {
-						verticalMove(false);
-						e.doit = false;
-					} else if (e.keyCode == SWT.ARROW_DOWN) {
-						verticalMove(true);
-						e.doit = false;
-					}
-				}
-			});
-			if ((getExpansionStyle()&FOCUS_TITLE)==0) {
-				toggle.paintFocus=false;
-				toggle.addFocusListener(new FocusListener() {
-					public void focusGained(FocusEvent e) {
-						textLabel.redraw();
-					}
-
-					public void focusLost(FocusEvent e) {
-						textLabel.redraw();
-					}
-				});
-			}
-		}
-		if ((expansionStyle & FOCUS_TITLE) != 0) {
-			Hyperlink link = new Hyperlink(this, SWT.WRAP);
-			link.addHyperlinkListener(new HyperlinkAdapter() {
-				public void linkActivated(HyperlinkEvent e) {
-					programmaticToggleState();
-				}
-			});
-			textLabel = link;
-		} else if ((expansionStyle & NO_TITLE) == 0) {
-			final Label label = new Label(this, SWT.WRAP);
-			if (!isFixedStyle()) {
-				label.setCursor(FormsResources.getHandCursor());
-				Listener listener = new Listener() {
-					public void handleEvent(Event e) {
-						switch (e.type) {
-						case SWT.MouseDown:
-							if (toggle != null)
-								toggle.setFocus();
-							break;
-						case SWT.MouseUp:
-							label.setCursor(FormsResources.getBusyCursor());
-							programmaticToggleState();
-							label.setCursor(FormsResources.getHandCursor());
-							break;
-						case SWT.MouseEnter:
-							if (toggle != null) {
-								label.setForeground(toggle
-										.getHoverDecorationColor());
-								toggle.hover = true;
-								toggle.redraw();
-							}
-							break;
-						case SWT.MouseExit:
-							if (toggle != null) {
-								label.setForeground(getTitleBarForeground());
-								toggle.hover = false;
-								toggle.redraw();
-							}
-							break;
-						case SWT.Paint:
-							if (toggle != null) {
-								paintTitleFocus(e.gc);
-							}
-							break;
-						}
-					}
-				};
-				label.addListener(SWT.MouseDown, listener);
-				label.addListener(SWT.MouseUp, listener);
-				label.addListener(SWT.MouseEnter, listener);
-				label.addListener(SWT.MouseExit, listener);
-				label.addListener(SWT.Paint, listener);
-			}
-			textLabel = label;
-		}
-		if (textLabel != null) {
-			textLabel.setMenu(getMenu());
-			textLabel.addTraverseListener(new TraverseListener() {
-				public void keyTraversed(TraverseEvent e) {
-					if (e.detail == SWT.TRAVERSE_MNEMONIC) {
-						// steal the mnemonic
-						if (!isVisible() || !isEnabled())
-							return;
-						if (FormUtil.mnemonicMatch(getText(), e.character)) {
-							e.doit = false;
-							if (!isFixedStyle()) {
-							    programmaticToggleState();
-							}
-							setFocus();
-						}
-					}
-				}
-			});
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Control#forceFocus()
-	 */
-	public boolean forceFocus() {
-		return false;
-	}
-
-	/**
-	 * Overrides 'super' to pass the menu to the text label.
-	 * 
-	 * @param menu
-	 *            the menu from the parent to attach to this control.
-	 */
-
-	public void setMenu(Menu menu) {
-		if (textLabel != null)
-			textLabel.setMenu(menu);
-		super.setMenu(menu);
-	}
-
-	/**
-	 * Prevents assignment of the layout manager - expandable composite uses its
-	 * own layout.
-	 */
-	public final void setLayout(Layout layout) {
-	}
-
-	/**
-	 * Sets the background of all the custom controls in the expandable.
-	 */
-	public void setBackground(Color bg) {
-		super.setBackground(bg);
-		if ((getExpansionStyle() & TITLE_BAR) == 0) {
-			if (textLabel != null)
-				textLabel.setBackground(bg);
-			if (toggle != null)
-				toggle.setBackground(bg);
-		}
-	}
-
-	/**
-	 * Sets the foreground of all the custom controls in the expandable.
-	 */
-	public void setForeground(Color fg) {
-		super.setForeground(fg);
-		if (textLabel != null)
-			textLabel.setForeground(fg);
-		if (toggle != null)
-			toggle.setForeground(fg);
-	}
-
-	/**
-	 * Sets the color of the toggle control.
-	 * 
-	 * @param c
-	 *            the color object
-	 */
-	public void setToggleColor(Color c) {
-		if (toggle != null)
-			toggle.setDecorationColor(c);
-	}
-
-	/**
-	 * Sets the active color of the toggle control (when the mouse enters the
-	 * toggle area).
-	 * 
-	 * @param c
-	 *            the active color object
-	 */
-	public void setActiveToggleColor(Color c) {
-		if (toggle != null)
-			toggle.setHoverDecorationColor(c);
-	}
-
-	/**
-	 * Sets the fonts of all the custom controls in the expandable.
-	 */
-	public void setFont(Font font) {
-		super.setFont(font);
-		if (textLabel != null)
-			textLabel.setFont(font);
-		if (toggle != null)
-			toggle.setFont(font);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.widgets.Control#setEnabled(boolean)
-	 */
-
-	public void setEnabled(boolean enabled) {
-		if (textLabel != null)
-			textLabel.setEnabled(enabled);
-		if (toggle != null)
-			toggle.setEnabled(enabled);
-		super.setEnabled(enabled);
-	}
-
-	/**
-	 * Sets the client of this expandable composite. The client must not be
-	 * <samp>null </samp> and must be a direct child of this container.
-	 * 
-	 * @param client
-	 *            the client that will be expanded or collapsed
-	 */
-	public void setClient(Control client) {
-		Assert.isTrue(client != null && client.getParent().equals(this));
-		this.client = client;
-	}
-
-	/**
-	 * Returns the current expandable client.
-	 * 
-	 * @return the client control
-	 */
-	public Control getClient() {
-		return client;
-	}
-
-	/**
-	 * Sets the title of the expandable composite. The title will act as a
-	 * hyperlink and activating it will toggle the client between expanded and
-	 * collapsed state.
-	 * 
-	 * @param title
-	 *            the new title string
-	 * @see #getText()
-	 */
-	public void setText(String title) {
-		if (textLabel instanceof Label)
-			((Label) textLabel).setText(title);
-		else if (textLabel instanceof Hyperlink)
-			((Hyperlink) textLabel).setText(title);
-	}
-
-	/**
-	 * Returns the title string.
-	 * 
-	 * @return the title string
-	 * @see #setText(String)
-	 */
-	public String getText() {
-		if (textLabel instanceof Label)
-			return ((Label) textLabel).getText();
-		else if (textLabel instanceof Hyperlink)
-			return ((Hyperlink) textLabel).getText();
-		else
-			return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * Tests the expanded state of the composite.
-	 * 
-	 * @return <samp>true </samp> if expanded, <samp>false </samp> if collapsed.
-	 */
-	public boolean isExpanded() {
-		return expanded;
-	}
-
-	/**
-	 * Returns the bitwise-ORed style bits for the expansion control.
-	 * 
-	 * @return the bitwise-ORed style bits for the expansion control
-	 */
-	public int getExpansionStyle() {
-		return expansionStyle;
-	}
-
-	/**
-	 * Programmatically changes expanded state.
-	 * 
-	 * @param expanded
-	 *            the new expanded state
-	 */
-	public void setExpanded(boolean expanded) {
-		internalSetExpanded(expanded);
-		if (toggle != null)
-			toggle.setExpanded(expanded);
-	}
-
-	/**
-	 * Performs the expansion state change for the expandable control.
-	 * 
-	 * @param expanded
-	 *            the expansion state
-	 */
-	protected void internalSetExpanded(boolean expanded) {
-		if (this.expanded != expanded) {
-			this.expanded = expanded;
-			if (getDescriptionControl() != null)
-				getDescriptionControl().setVisible(expanded);
-			if (client != null)
-				client.setVisible(expanded);
-			layout();
-		}
-	}
-
-	/**
-	 * Adds the listener that will be notified when the expansion state changes.
-	 * 
-	 * @param listener
-	 *            the listener to add
-	 */
-	public void addExpansionListener(IExpansionListener listener) {
-		listeners.add(listener);
-	}
-
-	/**
-	 * Removes the expansion listener.
-	 * 
-	 * @param listener
-	 *            the listner to remove
-	 */
-	public void removeExpansionListener(IExpansionListener listener) {
-		listeners.remove(listener);
-	}
-
-	/**
-	 * If TITLE_BAR or SHORT_TITLE_BAR style is used, title bar decoration will
-	 * be painted behind the text in this method. The default implementation
-	 * does nothing - subclasses are responsible for rendering the title area.
-	 * 
-	 * @param e
-	 *            the paint event
-	 */
-	protected void onPaint(PaintEvent e) {
-	}
-
-	/**
-	 * Returns description control that will be placed under the title if
-	 * present.
-	 * 
-	 * @return the description control or <samp>null </samp> if not used.
-	 */
-	protected Control getDescriptionControl() {
-		return null;
-	}
-
-	/**
-	 * Returns the separator control that will be placed between the title and
-	 * the description if present.
-	 * 
-	 * @return the separator control or <samp>null </samp> if not used.
-	 */
-	protected Control getSeparatorControl() {
-		return null;
-	}
-
-	/**
-	 * Computes the size of the expandable composite.
-	 * 
-	 * @see org.eclipse.swt.widgets.Composite#computeSize
-	 */
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		checkWidget();
-		Point size;
-		ExpandableLayout layout = (ExpandableLayout) getLayout();
-		if (wHint == SWT.DEFAULT || hHint == SWT.DEFAULT) {
-			size = layout.computeSize(this, wHint, hHint, changed);
-		} else {
-			size = new Point(wHint, hHint);
-		}
-		Rectangle trim = computeTrim(0, 0, size.x, size.y);
-		return new Point(trim.width, trim.height);
-	}
-
-	/**
-	 * Returns <samp>true </samp> if the composite is fixed i.e. cannot be
-	 * expanded or collapsed. Fixed control will still contain the title,
-	 * separator and description (if present) as well as the client, but will be
-	 * in the permanent expanded state and the toggle affordance will not be
-	 * shown.
-	 * 
-	 * @return <samp>true </samp> if the control is fixed in the expanded state,
-	 *         <samp>false </samp> if it can be collapsed.
-	 */
-	protected boolean isFixedStyle() {
-		return (expansionStyle & TWISTIE) == 0
-				&& (expansionStyle & TREE_NODE) == 0;
-	}
-
-	/**
-	 * Returns the text client control.
-	 * 
-	 * @return Returns the text client control if specified, or
-	 *         <code>null</code> if not.
-	 */
-	public Control getTextClient() {
-		return textClient;
-	}
-
-	/**
-	 * Sets the text client control. Text client is a control that is a child of
-	 * the expandable composite and is placed to the right of the text. It can
-	 * be used to place small image hyperlinks. If more than one control is
-	 * needed, use Composite to hold them. Care should be taken that the height
-	 * of the control is comparable to the height of the text.
-	 * 
-	 * @param textClient
-	 *            the textClient to set or <code>null</code> if not needed any
-	 *            more.
-	 */
-	public void setTextClient(Control textClient) {
-		if (this.textClient != null)
-			this.textClient.dispose();
-		this.textClient = textClient;
-	}
-
-	/**
-	 * Returns the difference in height between the text and the text client (if
-	 * set). This difference can cause vertical alignment problems when two
-	 * expandable composites are placed side by side, one with and one without
-	 * the text client. Use this method obtain the value to add to either
-	 * <code>descriptionVerticalSpacing</code> (if you have description) or
-	 * <code>clientVerticalSpacing</code> to correct the alignment of the
-	 * expandable without the text client.
-	 * 
-	 * @return the difference in height between the text and the text client or
-	 *         0 if no corrective action is needed.
-	 * @since 3.3
-	 */
-	public int getTextClientHeightDifference() {
-		if (textClient == null || textLabel == null)
-			return 0;
-		int theight = textLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
-		int tcheight = textClient.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
-		return Math.max(tcheight - theight, 0);
-	}
-
-	/**
-	 * Tests if this expandable composite renders a title bar around the text.
-	 * 
-	 * @return <code>true</code> for <code>TITLE_BAR</code> or
-	 *         <code>SHORT_TITLE_BAR</code> styles, <code>false</code>
-	 *         otherwise.
-	 */
-	protected boolean hasTitleBar() {
-		return (getExpansionStyle() & TITLE_BAR) != 0
-				|| (getExpansionStyle() & SHORT_TITLE_BAR) != 0;
-	}
-
-	/**
-	 * Sets the color of the title bar foreground when TITLE_BAR style is used.
-	 * 
-	 * @param color
-	 *            the title bar foreground
-	 */
-	public void setTitleBarForeground(Color color) {
-		if (hasTitleBar())
-			titleBarForeground = color;
-		if (textLabel != null)
-			textLabel.setForeground(color);
-	}
-
-	/**
-	 * Returns the title bar foreground when TITLE_BAR style is used.
-	 * 
-	 * @return the title bar foreground
-	 */
-	public Color getTitleBarForeground() {
-		return titleBarForeground;
-	}
-
-	// end of APIs
-
-	private void toggleState() {
-		boolean newState = !isExpanded();
-		fireExpanding(newState, true);
-		internalSetExpanded(newState);
-		fireExpanding(newState, false);
-		if (newState)
-			FormUtil.ensureVisible(this);
-	}
-
-	private void fireExpanding(boolean state, boolean before) {
-		int size = listeners.size();
-		if (size == 0)
-			return;
-		ExpansionEvent e = new ExpansionEvent(this, state);
-		Object [] listenerList = listeners.getListeners();
-		for (int i = 0; i < size; i++) {
-			IExpansionListener listener = (IExpansionListener) listenerList[i];
-			if (before)
-				listener.expansionStateChanging(e);
-			else
-				listener.expansionStateChanged(e);
-		}
-	}
-
-	private void verticalMove(boolean down) {
-		Composite parent = getParent();
-		Control[] children = parent.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			Control child = children[i];
-			if (child == this) {
-				ExpandableComposite sibling = getSibling(children, i, down);
-				if (sibling != null && sibling.toggle != null) {
-					sibling.setFocus();
-				}
-				break;
-			}
-		}
-	}
-
-	private ExpandableComposite getSibling(Control[] children, int index,
-			boolean down) {
-		int loc = down ? index + 1 : index - 1;
-		while (loc >= 0 && loc < children.length) {
-			Control c = children[loc];
-			if (c instanceof ExpandableComposite && c.isVisible())
-				return (ExpandableComposite) c;
-			loc = down ? loc + 1 : loc - 1;
-		}
-		return null;
-	}
-
-	private void programmaticToggleState() {
-		if (toggle != null)
-			toggle.setExpanded(!toggle.isExpanded());
-		toggleState();
-	}
-	
-	private void paintTitleFocus(GC gc) {
-		Point size = textLabel.getSize();
-		gc.setBackground(textLabel.getBackground());
-		gc.setForeground(textLabel.getForeground());
-		if (toggle.isFocusControl())
-			gc.drawFocus(0, 0, size.x, size.y);
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/Form.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/Form.java
deleted file mode 100644
index f359f84..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/Form.java
+++ /dev/null
@@ -1,808 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.DropTargetListener;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-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;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.forms.IFormColors;
-import org.eclipse.ui.forms.IMessage;
-import org.eclipse.ui.forms.IMessageManager;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.internal.forms.MessageManager;
-import org.eclipse.ui.internal.forms.widgets.FormHeading;
-import org.eclipse.ui.internal.forms.widgets.FormUtil;
-
-/**
- * Form is a custom control that renders a title and an optional background
- * image above the body composite. It can be used alone when part of parents
- * that are scrolled. If scrolling is required, use <code>ScrolledForm</code>
- * instead because it has an instance of <code>Form</code> and adds scrolling
- * capability.
- * <p>
- * Form can have a title if set. If not set, title area will not be left empty -
- * form body will be resized to fill the entire form. In addition, an optional
- * title image can be set and is rendered to the left of the title (since 3.2).
- * <p>
- * Form can have a title drop down menu if the menu bar manager is not empty
- * (since 3.3).
- * <p>
- * Form title can support drag and drop if drag and drop support methods are
- * invoked. When used, additional decoration is rendered behind the title to
- * reinforce the drag and drop ability (since 3.3).
- * <p>
- * The form supports status messages. These messages can have various severity
- * (error, warning, info or none). If status hyperlink handler is specified, the
- * messages with the specified severity other than none will be rendered as
- * hyperlinks.
- * <p>
- * Form can have a background image behind the title text. The image is tiled as
- * many times as needed to fill the title area. Alternatively, gradient
- * background can be painted vertically or horizontally.
- * <p>
- * Form can be put in a 'busy' state. While in this state, title image is
- * replaced with an animation that lasts as long as the 'busy' state is active.
- * <p>
- * It is possible to create an optional head client control. When created, this
- * control is placed in the form heading as a second row.
- * <p>
- * Form has a custom layout manager that is wrap-enabled. If a form is placed in
- * a composite whose layout manager implements ILayoutExtension, the body of the
- * form will participate in wrapping as long as its layout manager implements
- * ILayoutExtension as well.
- * <p>
- * Children of the form should typically be created using FormToolkit to match
- * the appearance and behaviour. When creating children, use the form body as a
- * parent by calling 'getBody()' on the form instance. Example:
- * 
- * <pre>
- * FormToolkit toolkit = new FormToolkit(parent.getDisplay());
- * Form form = toolkit.createForm(parent);
- * form.setText(&quot;Sample form&quot;);
- * form.getBody().setLayout(new GridLayout());
- * toolkit.createButton(form.getBody(), &quot;Checkbox&quot;, SWT.CHECK);
- * </pre>
- * 
- * <p>
- * No layout manager has been set on the body. Clients are required to set the
- * desired layout manager explicitly.
- * <p>
- * Although the class is not final, it should not be subclassed.
- * 
- * @since 3.0
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class Form extends Composite {
-	private FormHeading head;
-
-	private Composite body;
-
-	private SizeCache bodyCache = new SizeCache();
-
-	private SizeCache headCache = new SizeCache();
-
-	private FormText selectionText;
-
-	private MessageManager messageManager;
-
-	private class FormLayout extends Layout implements ILayoutExtension {
-		public int computeMinimumWidth(Composite composite, boolean flushCache) {
-			return computeSize(composite, 5, SWT.DEFAULT, flushCache).x;
-		}
-
-		public int computeMaximumWidth(Composite composite, boolean flushCache) {
-			return computeSize(composite, SWT.DEFAULT, SWT.DEFAULT, flushCache).x;
-		}
-
-		public Point computeSize(Composite composite, int wHint, int hHint,
-				boolean flushCache) {
-			if (flushCache) {
-				bodyCache.flush();
-				headCache.flush();
-			}
-			bodyCache.setControl(body);
-			headCache.setControl(head);
-
-			int width = 0;
-			int height = 0;
-
-			Point hsize = headCache.computeSize(FormUtil.getWidthHint(wHint,
-					head), SWT.DEFAULT);
-			width = Math.max(hsize.x, width);
-			height = hsize.y;
-			
-			boolean ignoreBody=getData(FormUtil.IGNORE_BODY)!=null;
-			
-			Point bsize;
-			if (ignoreBody)
-				bsize = new Point(0,0);
-			else
-				bsize = bodyCache.computeSize(FormUtil.getWidthHint(wHint,
-					body), SWT.DEFAULT);
-			width = Math.max(bsize.x, width);
-			height += bsize.y;
-			return new Point(width, height);
-		}
-
-		protected void layout(Composite composite, boolean flushCache) {
-			if (flushCache) {
-				bodyCache.flush();
-				headCache.flush();
-			}
-			bodyCache.setControl(body);
-			headCache.setControl(head);
-			Rectangle carea = composite.getClientArea();
-
-			Point hsize = headCache.computeSize(carea.width, SWT.DEFAULT);
-			headCache.setBounds(0, 0, carea.width, hsize.y);
-			bodyCache
-					.setBounds(0, hsize.y, carea.width, carea.height - hsize.y);
-		}
-	}
-
-	/**
-	 * Creates the form content control as a child of the provided parent.
-	 * 
-	 * @param parent
-	 *            the parent widget
-	 */
-	public Form(Composite parent, int style) {
-		super(parent, SWT.NO_BACKGROUND | style);
-		super.setLayout(new FormLayout());
-		head = new FormHeading(this, SWT.NULL);
-		head.setMenu(parent.getMenu());
-		body = new LayoutComposite(this, SWT.NULL);
-		body.setMenu(parent.getMenu());
-	}
-
-	/**
-	 * Passes the menu to the form body.
-	 * 
-	 * @param menu
-	 *            the parent menu
-	 */
-	public void setMenu(Menu menu) {
-		super.setMenu(menu);
-		head.setMenu(menu);
-		body.setMenu(menu);
-	}
-
-	/**
-	 * Fully delegates the size computation to the internal layout manager.
-	 */
-	public final Point computeSize(int wHint, int hHint, boolean changed) {
-		return ((FormLayout) getLayout()).computeSize(this, wHint, hHint,
-				changed);
-	}
-
-	/**
-	 * Prevents from changing the custom control layout.
-	 */
-	public final void setLayout(Layout layout) {
-	}
-
-	/**
-	 * Returns the title text that will be rendered at the top of the form.
-	 * 
-	 * @return the title text
-	 */
-	public String getText() {
-		return head.getText();
-	}
-
-	/**
-	 * Returns the title image that will be rendered to the left of the title.
-	 * 
-	 * @return the title image or <code>null</code> if not set.
-	 * @since 3.2
-	 */
-	public Image getImage() {
-		return head.getImage();
-	}
-
-	/**
-	 * Sets the foreground color of the form. This color will also be used for
-	 * the body.
-	 * 
-	 * @param fg
-	 *            the foreground color
-	 */
-	public void setForeground(Color fg) {
-		super.setForeground(fg);
-		head.setForeground(fg);
-		body.setForeground(fg);
-	}
-
-	/**
-	 * Sets the background color of the form. This color will also be used for
-	 * the body.
-	 * 
-	 * @param bg
-	 *            the background color
-	 */
-	public void setBackground(Color bg) {
-		super.setBackground(bg);
-		head.setBackground(bg);
-		body.setBackground(bg);
-	}
-
-	/**
-	 * Sets the font of the header text.
-	 * 
-	 * @param font
-	 *            the new font
-	 */
-	public void setFont(Font font) {
-		super.setFont(font);
-		head.setFont(font);
-	}
-
-	/**
-	 * Sets the text to be rendered at the top of the form above the body as a
-	 * title.
-	 * <p>
-	 * <strong>Note:</strong> Mnemonics are indicated by an '&amp;' that causes
-	 * the next character to be the mnemonic. Mnemonics are not applicable in
-	 * the case of the form title but need to be taken into acount due to the
-	 * usage of the underlying widget that renders mnemonics in the title area.
-	 * The mnemonic indicator character '&amp;' can be escaped by doubling it in
-	 * the string, causing a single '&amp;' to be displayed.
-	 * </p>
-	 * 
-	 * @param text
-	 *            the title text
-	 */
-	public void setText(String text) {
-		head.setText(text);
-		layout();
-		redraw();
-	}
-
-	/**
-	 * Sets the image to be rendered to the left of the title. This image will
-	 * be temporarily hidden in two cases:
-	 * 
-	 * <ol>
-	 * <li>When the form is busy - replaced with a busy animation</li>
-	 * <li>When the form has message set - replaced with the image indicating
-	 * message severity</li>
-	 * </ol>
-	 * 
-	 * @param image
-	 *            the title image or <code>null</code> to show no image.
-	 * @since 3.2
-	 */
-	public void setImage(Image image) {
-		head.setImage(image);
-		layout();
-		redraw();
-	}
-
-	/**
-	 * Sets the background colors to be painted behind the title text in a
-	 * gradient. Note that this method will reset color previously set by
-	 * {@link #setBackground(Color)}. This is necessary for the simulated
-	 * transparency of the heading in all of its children control.
-	 * 
-	 * @param gradientColors
-	 *            the array of colors that form the gradient
-	 * @param percents
-	 *            the partition of the overall space between the gradient colors
-	 * @param vertical
-	 *            of <code>true</code>, the gradient will be rendered
-	 *            vertically, if <code>false</code> the orientation will be
-	 *            horizontal.
-	 */
-
-	public void setTextBackground(Color[] gradientColors, int[] percents,
-			boolean vertical) {
-		head.setTextBackground(gradientColors, percents, vertical);
-	}
-
-	/**
-	 * Returns the optional background image of the form head.
-	 * 
-	 * @return the background image or <code>null</code> if not specified.
-	 */
-	public Image getBackgroundImage() {
-		return head.getHeadingBackgroundImage();
-	}
-
-	/**
-	 * Sets the optional background image to be rendered behind the title
-	 * starting at the position 0,0. If the image is smaller than the container
-	 * in any dimension, it will be tiled.
-	 * 
-	 * As of version 3.2, this method only supports SWT.BITMAP image types. This is
-	 * because the rendering is now delegated to SWT which imposes this restriction
-	 * on background images, 
-	 * 
-	 * @param backgroundImage
-	 *            the head background image.
-	 * 
-	 */
-	public void setBackgroundImage(Image backgroundImage) {
-		head.setHeadingBackgroundImage(backgroundImage);
-	}
-
-	/**
-	 * Returns the tool bar manager that is used to manage tool items in the
-	 * form's title area.
-	 * 
-	 * @return form tool bar manager
-	 */
-	public IToolBarManager getToolBarManager() {
-		return head.getToolBarManager();
-	}
-
-	/**
-	 * Sets the tool bar vertical alignment relative to the header. Can be
-	 * useful when there is more free space at the second row (with the head
-	 * client).
-	 * 
-	 * @param alignment
-	 *            SWT.TOP or SWT.BOTTOM
-	 * @since 3.3
-	 */
-
-	public void setToolBarVerticalAlignment(int alignment) {
-		head.setToolBarAlignment(alignment);
-	}
-
-	/**
-	 * Returns the current tool bar alignment (if used).
-	 * 
-	 * @return SWT.TOP or SWT.BOTTOM
-	 * @since 3.3
-	 */
-
-	public int getToolBarVerticalAlignment() {
-		return head.getToolBarAlignment();
-	}
-
-	/**
-	 * Returns the menu manager that is used to manage title area drop-down menu
-	 * items.
-	 * 
-	 * @return title area drop-down menu manager
-	 * @since 3.3
-	 */
-	public IMenuManager getMenuManager() {
-		return head.getMenuManager();
-	}
-
-	/**
-	 * Updates the local tool bar manager if used. Does nothing if local tool
-	 * bar manager has not been created yet.
-	 */
-	public void updateToolBar() {
-		head.updateToolBar();
-	}
-
-	/**
-	 * Returns the container that occupies the head of the form (the form area
-	 * above the body). Use this container as a parent for the head client.
-	 * 
-	 * @return the head of the form.
-	 * @since 3.2
-	 */
-	public Composite getHead() {
-		return head;
-	}
-
-	/**
-	 * Returns the optional head client if set.
-	 * 
-	 * @return the head client or <code>null</code> if not set.
-	 * @see #setHeadClient(Control)
-	 * @since 3.2
-	 */
-	public Control getHeadClient() {
-		return head.getHeadClient();
-	}
-
-	/**
-	 * Sets the optional head client. Head client is placed after the form
-	 * title. This option causes the tool bar to be placed in the second raw of
-	 * the header (below the head client).
-	 * <p>
-	 * The head client must be a child of the composite returned by
-	 * <code>getHead()</code> method.
-	 * 
-	 * @param headClient
-	 *            the optional child of the head
-	 * @since 3.2
-	 */
-	public void setHeadClient(Control headClient) {
-		head.setHeadClient(headClient);
-		layout();
-	}
-
-	/**
-	 * Returns the container that occupies the body of the form (the form area
-	 * below the title). Use this container as a parent for the controls that
-	 * should be in the form. No layout manager has been set on the form body.
-	 * 
-	 * @return Returns the body of the form.
-	 */
-	public Composite getBody() {
-		return body;
-	}
-
-	/**
-	 * Tests if the background image is tiled to cover the entire area of the
-	 * form heading.
-	 * 
-	 * @return <code>true</code> if heading background image is tiled,
-	 *         <code>false</code> otherwise.
-	 */
-	public boolean isBackgroundImageTiled() {
-		return head.isBackgroundImageTiled();
-	}
-
-	/**
-	 * Sets whether the header background image is repeated to cover the entire
-	 * heading area or not.
-	 * 
-	 * @param backgroundImageTiled
-	 *            set <code>true</code> to tile the image, or
-	 *            <code>false</code> to paint the background image only once
-	 *            at 0,0
-	 */
-	public void setBackgroundImageTiled(boolean backgroundImageTiled) {
-		head.setBackgroundImageTiled(backgroundImageTiled);
-	}
-
-	/**
-	 * Returns the background image alignment.
-	 * 
-	 * @deprecated due to the underlying widget limitations, background image is
-	 *             either painted at 0,0 and/or tiled.
-	 * @return SWT.LEFT
-	 */
-	public int getBackgroundImageAlignment() {
-		return SWT.LEFT;
-	}
-
-	/**
-	 * Sets the background image alignment.
-	 * 
-	 * @deprecated due to the underlying widget limitations, background image is
-	 *             always tiled and alignment cannot be controlled.
-	 * @param backgroundImageAlignment
-	 *            The backgroundImageAlignment to set.
-	 * @since 3.1
-	 */
-	public void setBackgroundImageAlignment(int backgroundImageAlignment) {
-	}
-
-	/**
-	 * Tests if background image is clipped.
-	 * 
-	 * @deprecated due to the underlying widget limitations, background image is
-	 *             always clipped.
-	 * @return true
-	 * @since 3.1
-	 */
-	public boolean isBackgroundImageClipped() {
-		return true;
-	}
-
-	/**
-	 * Sets whether the background image is clipped.
-	 * 
-	 * @deprecated due to the underlying widget limitations, background image is
-	 *             always clipped.
-	 * @param backgroundImageClipped
-	 *            the value to set
-	 * @since 3.1
-	 */
-	public void setBackgroundImageClipped(boolean backgroundImageClipped) {
-	}
-
-	/**
-	 * Tests if the form head separator is visible.
-	 * 
-	 * @return <code>true</code> if the head/body separator is visible,
-	 *         <code>false</code> otherwise
-	 * @since 3.2
-	 */
-	public boolean isSeparatorVisible() {
-		return head.isSeparatorVisible();
-	}
-
-	/**
-	 * If set, adds a separator between the head and body. Since 3.3, the colors
-	 * that are used to render it are {@link IFormColors#H_BOTTOM_KEYLINE1} and
-	 * {@link IFormColors#H_BOTTOM_KEYLINE2}.
-	 * 
-	 * @param addSeparator
-	 *            <code>true</code> to make the separator visible,
-	 *            <code>false</code> otherwise.
-	 * @since 3.2
-	 */
-	public void setSeparatorVisible(boolean addSeparator) {
-		head.setSeparatorVisible(addSeparator);
-	}
-
-	/**
-	 * Returns the color used to render the optional head separator. If gradient
-	 * text background is used additional colors from the gradient will be used
-	 * to render the separator.
-	 * 
-	 * @return separator color or <code>null</code> if not set.
-	 * @since 3.2
-	 * @deprecated use <code>getHeadColor(IFormColors.H_BOTTOM_KEYLINE2)</code>
-	 */
-
-	public Color getSeparatorColor() {
-		return head.getColor(IFormColors.H_BOTTOM_KEYLINE2);
-	}
-
-	/**
-	 * Sets the color to be used to render the optional head separator.
-	 * 
-	 * @param separatorColor
-	 *            the color to render the head separator or <code>null</code>
-	 *            to use the default color.
-	 * @since 3.2
-	 * @deprecated use
-	 *             <code>setHeadColor(IFormColors.H_BOTTOM_KEYLINE2, separatorColor)</code>
-	 */
-	public void setSeparatorColor(Color separatorColor) {
-		head.putColor(IFormColors.H_BOTTOM_KEYLINE2, separatorColor);
-	}
-
-	/**
-	 * Sets the color used to paint an aspect of the form heading.
-	 * 
-	 * @param key
-	 *            a valid form heading color key as defined in
-	 *            {@link IFormColors}. Relevant keys all start with an H_
-	 *            prefix.
-	 * @param color
-	 *            the color to use for the provided key
-	 * @since 3.3
-	 */
-
-	public void setHeadColor(String key, Color color) {
-		head.putColor(key, color);
-	}
-
-	/**
-	 * Returns the color that is currently use to paint an aspect of the form
-	 * heading, or <code>null</code> if not defined.
-	 * 
-	 * @param key
-	 *            the color key
-	 * @return the color object or <code>null</code> if not set.
-	 * @since 3.3
-	 */
-
-	public Color getHeadColor(String key) {
-		return head.getColor(key);
-	}
-
-	/**
-	 * Sets the message for this form. Message text is rendered in the form head
-	 * when shown.
-	 * 
-	 * @param message
-	 *            the message, or <code>null</code> to clear the message
-	 * @see #setMessage(String, int)
-	 * @since 3.2
-	 */
-	public void setMessage(String message) {
-		this.setMessage(message, 0, null);
-	}
-
-	/**
-	 * Sets the message for this form with an indication of what type of message
-	 * it is.
-	 * <p>
-	 * The valid message types are one of <code>NONE</code>,
-	 * <code>INFORMATION</code>,<code>WARNING</code>, or
-	 * <code>ERROR</code> defined in IMessageProvider interface.
-	 * </p>
-	 * 
-	 * @param newMessage
-	 *            the message, or <code>null</code> to clear the message
-	 * @param newType
-	 *            the message type
-	 * @see org.eclipse.jface.dialogs.IMessageProvider
-	 * @since 3.2
-	 */
-
-	public void setMessage(String newMessage, int newType) {
-		this.setMessage(newMessage, newType, null);
-	}
-
-	/**
-	 * Sets the message for this form with an indication of what type of message
-	 * it is.
-	 * <p>
-	 * The valid message types are one of <code>NONE</code>,
-	 * <code>INFORMATION</code>,<code>WARNING</code>, or
-	 * <code>ERROR</code> defined in IMessageProvider interface.
-	 * </p>
-	 * <p>
-	 * In addition to the summary message, this method also sets an array of
-	 * individual messages.
-	 * 
-	 * 
-	 * @param newMessage
-	 *            the message, or <code>null</code> to clear the message
-	 * @param newType
-	 *            the message type
-	 * @param children
-	 *            the individual messages that contributed to the overall
-	 *            message
-	 * @see org.eclipse.jface.dialogs.IMessageProvider
-	 * @since 3.3
-	 */
-
-	public void setMessage(String newMessage, int newType, IMessage[] children) {
-		head.showMessage(newMessage, newType, children);
-		layout();
-	}
-
-	/**
-	 * Adds a message hyperlink listener. If at least one listener is present,
-	 * messages will be rendered as hyperlinks.
-	 * 
-	 * @param listener
-	 * @see #removeMessageHyperlinkListener(IHyperlinkListener)
-	 * @since 3.3
-	 */
-	public void addMessageHyperlinkListener(IHyperlinkListener listener) {
-		head.addMessageHyperlinkListener(listener);
-	}
-
-	/**
-	 * Remove the message hyperlink listener.
-	 * 
-	 * @param listener
-	 * @see #addMessageHyperlinkListener(IHyperlinkListener)
-	 * @since 3.3
-	 */
-	public void removeMessageHyperlinkListener(IHyperlinkListener listener) {
-		head.removeMessageHyperlinkListener(listener);
-	}
-
-	/**
-	 * Tests if the form is in the 'busy' state. Busy form displays 'busy'
-	 * animation in the area of the title image.
-	 * 
-	 * @return <code>true</code> if busy, <code>false</code> otherwise.
-	 * @since 3.2
-	 */
-
-	public boolean isBusy() {
-		return head.isBusy();
-	}
-
-	/**
-	 * Sets the form's busy state. Busy form will display 'busy' animation in
-	 * the area of the title image.
-	 * 
-	 * @param busy
-	 *            the form's busy state
-	 * @since 3.2
-	 */
-
-	public void setBusy(boolean busy) {
-		head.setBusy(busy);
-	}
-
-	/**
-	 * Adds support for dragging items out of the form title area via a user
-	 * drag-and-drop operation.
-	 * 
-	 * @param operations
-	 *            a bitwise OR of the supported drag and drop operation types (
-	 *            <code>DROP_COPY</code>,<code>DROP_LINK</code>, and
-	 *            <code>DROP_MOVE</code>)
-	 * @param transferTypes
-	 *            the transfer types that are supported by the drag operation
-	 * @param listener
-	 *            the callback that will be invoked to set the drag data and to
-	 *            cleanup after the drag and drop operation finishes
-	 * @see org.eclipse.swt.dnd.DND
-	 * @since 3.3
-	 */
-	public void addTitleDragSupport(int operations, Transfer[] transferTypes,
-			DragSourceListener listener) {
-		head.addDragSupport(operations, transferTypes, listener);
-	}
-
-	/**
-	 * Adds support for dropping items into the form title area via a user
-	 * drag-and-drop operation.
-	 * 
-	 * @param operations
-	 *            a bitwise OR of the supported drag and drop operation types (
-	 *            <code>DROP_COPY</code>,<code>DROP_LINK</code>, and
-	 *            <code>DROP_MOVE</code>)
-	 * @param transferTypes
-	 *            the transfer types that are supported by the drop operation
-	 * @param listener
-	 *            the callback that will be invoked after the drag and drop
-	 *            operation finishes
-	 * @see org.eclipse.swt.dnd.DND
-	 * @since 3.3
-	 */
-	public void addTitleDropSupport(int operations, Transfer[] transferTypes,
-			DropTargetListener listener) {
-		head.addDropSupport(operations, transferTypes, listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IMessageProvider#getMessage()
-	 */
-	public String getMessage() {
-		return head.getMessage();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IMessageProvider#getMessageType()
-	 */
-	public int getMessageType() {
-		return head.getMessageType();
-	}
-
-	/**
-	 * Returns the children messages that the cause of the summary message
-	 * currently set on the form.
-	 * 
-	 * @return an array of children messages or <code>null</code> if not set.
-	 * @see #setMessage(String, int, IMessage[])
-	 * @since 3.3
-	 */
-	public IMessage[] getChildrenMessages() {
-		return head.getChildrenMessages();
-	}
-
-	void setSelectionText(FormText text) {
-		if (selectionText != null && selectionText != text) {
-			selectionText.clearSelection();
-		}
-		this.selectionText = text;
-	}
-	
-	/**
-	 * Returns the message manager that will keep track of messages in this
-	 * form. 
-	 * 
-	 * @return the message manager instance
-	 * @since org.eclipse.ui.forms 3.4
-	 */
-	public IMessageManager getMessageManager() {
-		if (messageManager == null)
-			messageManager = new MessageManager(this);
-		return messageManager;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/FormText.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/FormText.java
deleted file mode 100644
index 32cb658..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/FormText.java
+++ /dev/null
@@ -1,1716 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Martin Donnelly (m2a3@eircom.net) - patch (see Bugzilla #145997) 
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.accessibility.ACC;
-import org.eclipse.swt.accessibility.Accessible;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleControlAdapter;
-import org.eclipse.swt.accessibility.AccessibleControlEvent;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.MenuEvent;
-import org.eclipse.swt.events.MenuListener;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-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.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.TypedListener;
-import org.eclipse.ui.forms.HyperlinkSettings;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.internal.forms.Messages;
-import org.eclipse.ui.internal.forms.widgets.ControlSegment;
-import org.eclipse.ui.internal.forms.widgets.FormFonts;
-import org.eclipse.ui.internal.forms.widgets.FormTextModel;
-import org.eclipse.ui.internal.forms.widgets.FormUtil;
-import org.eclipse.ui.internal.forms.widgets.IFocusSelectable;
-import org.eclipse.ui.internal.forms.widgets.IHyperlinkSegment;
-import org.eclipse.ui.internal.forms.widgets.ImageSegment;
-import org.eclipse.ui.internal.forms.widgets.Locator;
-import org.eclipse.ui.internal.forms.widgets.Paragraph;
-import org.eclipse.ui.internal.forms.widgets.ParagraphSegment;
-import org.eclipse.ui.internal.forms.widgets.SelectionData;
-import org.eclipse.ui.internal.forms.widgets.TextSegment;
-
-/**
- * This class is a read-only text control that is capable of rendering wrapped
- * text. Text can be rendered as-is or by parsing the formatting XML tags.
- * Independently, words that start with http:// can be converted into hyperlinks
- * on the fly.
- * <p>
- * When configured to use formatting XML, the control requires the root element
- * <code>form</code> to be used. The following tags can be children of the
- * <code>form</code> element:
- * </p>
- * <ul>
- * <li><b>p </b>- for defining paragraphs. The following attributes are
- * allowed:
- * <ul>
- * <li><b>vspace </b>- if set to 'false', no vertical space will be added
- * (default is 'true')</li>
- * </ul>
- * </li>
- * <li><b>li </b>- for defining list items. The following attributes are
- * allowed:
- * <ul>
- * <li><b>vspace </b>- the same as with the <b>p </b> tag</li>
- * <li><b>style </b>- could be 'bullet' (default), 'text' and 'image'</li>
- * <li><b>value </b>- not used for 'bullet'. For text, it is the value of the
- * text that is rendered as a bullet. For image, it is the href of the image to
- * be rendered as a bullet.</li>
- * <li><b>indent </b>- the number of pixels to indent the text in the list item
- * </li>
- * <li><b>bindent </b>- the number of pixels to indent the bullet itself</li>
- * </ul>
- * </li>
- * </ul>
- * <p>
- * Text in paragraphs and list items will be wrapped according to the width of
- * the control. The following tags can appear as children of either <b>p </b> or
- * <b>li </b> elements:
- * <ul>
- * <li><b>img </b>- to render an image. Element accepts attribute 'href' that
- * is a key to the <code>Image</code> set using 'setImage' method. Vertical
- * position of image relative to surrounding text is optionally controlled by
- * the attribute <b>align</b> that can have values <b>top</b>, <b>middle</b>
- * and <b>bottom</b></li>
- * <li><b>a </b>- to render a hyperlink. Element accepts attribute 'href' that
- * will be provided to the hyperlink listeners via HyperlinkEvent object. The
- * element also accepts 'nowrap' attribute (default is false). When set to
- * 'true', the hyperlink will not be wrapped. Hyperlinks automatically created
- * when 'http://' is encountered in text are not wrapped.</li>
- * <li><b>b </b>- the enclosed text will use bold font.</li>
- * <li><b>br </b>- forced line break (no attributes).</li>
- * <li><b>span </b>- the enclosed text will have the color and font specified
- * in the element attributes. Color is provided using 'color' attribute and is a
- * key to the Color object set by 'setColor' method. Font is provided using
- * 'font' attribute and is a key to the Font object set by 'setFont' method. As with
- * hyperlinks, it is possible to block wrapping by setting 'nowrap' to true
- * (false by default).
- * </li>
- * <li><b>control (new in 3.1)</b> - to place a control that is a child of the
- * text control. Element accepts attribute 'href' that is a key to the Control
- * object set using 'setControl' method. Optionally, attribute 'fill' can be set
- * to <code>true</code> to make the control fill the entire width of the text.
- * Form text is not responsible for creating or disposing controls, it only
- * places them relative to the surrounding text. Similar to <b>img</b>,
- * vertical position of the control can be set using the <b>align</b>
- * attribute. In addition, <b>width</b> and <b>height</b> attributes can
- * be used to force the dimensions of the control. If not used,
- * the preferred control size will be used.
- * </ul>
- * <p>
- * None of the elements can nest. For example, you cannot have <b>b </b> inside
- * a <b>span </b>. This was done to keep everything simple and transparent.
- * Since 3.1, an exception to this rule has been added to support nesting images
- * and text inside the hyperlink tag (<b>a</b>). Image enclosed in the
- * hyperlink tag acts as a hyperlink, can be clicked on and can accept and
- * render selection focus. When both text and image is enclosed, selection and
- * rendering will affect both as a single hyperlink.
- * </p>
- * <p>
- * Since 3.1, it is possible to select text. Text selection can be
- * programmatically accessed and also copied to clipboard. Non-textual objects
- * (images, controls etc.) in the selection range are ignored.
- * <p>
- * Care should be taken when using this control. Form text is not an HTML
- * browser and should not be treated as such. If you need complex formatting
- * capabilities, use Browser widget. If you need editing capabilities and
- * font/color styles of text segments is all you need, use StyleText widget.
- * Finally, if all you need is to wrap text, use SWT Label widget and create it
- * with SWT.WRAP style.
- * 
- * @see FormToolkit
- * @see TableWrapLayout
- * @since 3.0
- */
-public class FormText extends Canvas {
-	/**
-	 * The object ID to be used when registering action to handle URL hyperlinks
-	 * (those that should result in opening the web browser). Value is
-	 * "urlHandler".
-	 */
-	public static final String URL_HANDLER_ID = "urlHandler"; //$NON-NLS-1$
-
-	/**
-	 * Value of the horizontal margin (default is 0).
-	 */
-	public int marginWidth = 0;
-
-	/**
-	 * Value of tue vertical margin (default is 1).
-	 */
-	public int marginHeight = 1;
-
-	// private fields
-	private static final boolean DEBUG_TEXT = false;//"true".equalsIgnoreCase(Platform.getDebugOption(FormUtil.DEBUG_TEXT));
-	private static final boolean DEBUG_TEXTSIZE = false;//"true".equalsIgnoreCase(Platform.getDebugOption(FormUtil.DEBUG_TEXTSIZE));
-
-	private static final boolean DEBUG_FOCUS = false;//"true".equalsIgnoreCase(Platform.getDebugOption(FormUtil.DEBUG_FOCUS));	
-
-	private boolean hasFocus;
-
-	private boolean paragraphsSeparated = true;
-
-	private FormTextModel model;
-
-	private ListenerList listeners;
-
-	private Hashtable resourceTable = new Hashtable();
-
-	private IHyperlinkSegment entered;
-
-	private IHyperlinkSegment armed;
-
-	private boolean mouseFocus = false;
-
-	private boolean controlFocusTransfer = false;
-
-	private boolean inSelection = false;
-
-	private SelectionData selData;
-
-	private static final String INTERNAL_MENU = "__internal_menu__"; //$NON-NLS-1$
-
-	private static final String CONTROL_KEY = "__segment__"; //$NON-NLS-1$
-
-	private class FormTextLayout extends Layout implements ILayoutExtension {
-		public FormTextLayout() {
-		}
-
-		public int computeMaximumWidth(Composite parent, boolean changed) {
-			return computeSize(parent, SWT.DEFAULT, SWT.DEFAULT, changed).x;
-		}
-
-		public int computeMinimumWidth(Composite parent, boolean changed) {
-			return computeSize(parent, 5, SWT.DEFAULT, true).x;
-		}
-
-		/*
-		 * @see Layout#computeSize(Composite, int, int, boolean)
-		 */
-		public Point computeSize(Composite composite, int wHint, int hHint,
-				boolean changed) {
-			long start = 0;
-
-			if (DEBUG_TEXT)
-				start = System.currentTimeMillis();
-			int innerWidth = wHint;
-			if (innerWidth != SWT.DEFAULT)
-				innerWidth -= marginWidth * 2;
-			Point textSize = computeTextSize(innerWidth);
-			int textWidth = textSize.x + 2 * marginWidth;
-			int textHeight = textSize.y + 2 * marginHeight;
-			Point result = new Point(textWidth, textHeight);
-			if (DEBUG_TEXT) {
-				long stop = System.currentTimeMillis();
-				System.out.println("FormText computeSize: " + (stop - start) //$NON-NLS-1$
-						+ "ms"); //$NON-NLS-1$
-			}
-			if (DEBUG_TEXTSIZE) {
-				System.out.println("FormText ("+model.getAccessibleText()+"), computeSize: wHint="+wHint+", result="+result); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-			return result;
-		}
-
-		private Point computeTextSize(int wHint) {
-			Paragraph[] paragraphs = model.getParagraphs();
-			GC gc = new GC(FormText.this);
-			gc.setFont(getFont());
-			Locator loc = new Locator();
-			int width = wHint != SWT.DEFAULT ? wHint : 0;
-			FontMetrics fm = gc.getFontMetrics();
-			int lineHeight = fm.getHeight();
-			boolean selectableInTheLastRow = false;
-			for (int i = 0; i < paragraphs.length; i++) {
-				Paragraph p = paragraphs[i];
-				if (i > 0 && getParagraphsSeparated()
-						&& p.getAddVerticalSpace())
-					loc.y += getParagraphSpacing(lineHeight);
-				loc.rowHeight = 0;
-				loc.indent = p.getIndent();
-				loc.x = p.getIndent();
-				ParagraphSegment[] segments = p.getSegments();
-				if (segments.length > 0) {
-					selectableInTheLastRow = false;
-					int pwidth = 0;
-					for (int j = 0; j < segments.length; j++) {
-						ParagraphSegment segment = segments[j];
-						segment.advanceLocator(gc, wHint, loc, resourceTable, false);
-						if (wHint != SWT.DEFAULT) {
-							width = Math.max(width, loc.width);
-						} else {
-							pwidth = Math.max(pwidth, loc.width);
-						}
-						if (segment instanceof IFocusSelectable)
-							selectableInTheLastRow = true;
-					}
-					if (wHint == SWT.DEFAULT)
-						width = Math.max(width, pwidth);
-					loc.y += loc.rowHeight;
-				} else {
-					// empty new line
-					loc.y += lineHeight;
-				}
-			}
-			gc.dispose();
-			if (selectableInTheLastRow)
-				loc.y += 1;
-			return new Point(width, loc.y);
-		}
-
-		protected void layout(Composite composite, boolean flushCache) {
-			long start = 0;
-
-			if (DEBUG_TEXT) {
-				start = System.currentTimeMillis();
-			}
-			selData = null;
-			Rectangle carea = composite.getClientArea();
-			if (DEBUG_TEXTSIZE) {
-				System.out.println("FormText layout ("+model.getAccessibleText()+"), carea="+carea); //$NON-NLS-1$ //$NON-NLS-2$
-			}			
-			GC gc = new GC(composite);
-			gc.setFont(getFont());
-			ensureBoldFontPresent(getFont());
-			gc.setForeground(getForeground());
-			gc.setBackground(getBackground());
-
-			Locator loc = new Locator();
-			loc.marginWidth = marginWidth;
-			loc.marginHeight = marginHeight;
-			loc.y = marginHeight;
-			FontMetrics fm = gc.getFontMetrics();
-			int lineHeight = fm.getHeight();
-
-			Paragraph[] paragraphs = model.getParagraphs();
-			IHyperlinkSegment selectedLink = getSelectedLink();
-			for (int i = 0; i < paragraphs.length; i++) {
-				Paragraph p = paragraphs[i];
-				if (i > 0 && paragraphsSeparated && p.getAddVerticalSpace())
-					loc.y += getParagraphSpacing(lineHeight);
-				loc.indent = p.getIndent();
-				loc.resetCaret();
-				loc.rowHeight = 0;
-				p.layout(gc, carea.width, loc, lineHeight, resourceTable,
-						selectedLink);
-			}
-			gc.dispose();
-			if (DEBUG_TEXT) {
-				long stop = System.currentTimeMillis();
-				System.out.println("FormText.layout: " + (stop - start) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	/**
-	 * Contructs a new form text widget in the provided parent and using the
-	 * styles.
-	 * <p>
-	 * The only valid style bit for <code>FormText</code> is <code>SWT.NO_FOCUS</code>.
-	 * This will cause the widget to always refuse focus.
-	 * 
-	 * @param parent
-	 *            form text parent control
-	 * @param style
-	 *            the widget style
-	 */
-	public FormText(Composite parent, int style) {
-		super(parent, SWT.NO_BACKGROUND | SWT.WRAP | style);
-		setLayout(new FormTextLayout());
-		model = new FormTextModel();
-		addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				model.dispose();
-				disposeResourceTable(true);
-			}
-		});
-		addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				paint(e);
-			}
-		});
-		addListener(SWT.KeyDown, new Listener() {
-			public void handleEvent(Event e) {
-				if (e.character == '\r') {
-					activateSelectedLink();
-					return;
-				}
-			}
-		});
-		addListener(SWT.Traverse, new Listener() {
-			public void handleEvent(Event e) {
-				if (DEBUG_FOCUS)
-					System.out.println("Traversal: " + e); //$NON-NLS-1$
-				switch (e.detail) {
-				case SWT.TRAVERSE_PAGE_NEXT:
-				case SWT.TRAVERSE_PAGE_PREVIOUS:
-				case SWT.TRAVERSE_ARROW_NEXT:
-				case SWT.TRAVERSE_ARROW_PREVIOUS:
-					e.doit = false;
-					return;
-				}
-				if (!model.hasFocusSegments()) {
-					e.doit = true;
-					return;
-				}
-				if (e.detail == SWT.TRAVERSE_TAB_NEXT)
-					e.doit = advance(true);
-				else if (e.detail == SWT.TRAVERSE_TAB_PREVIOUS)
-					e.doit = advance(false);
-				else if (e.detail != SWT.TRAVERSE_RETURN)
-					e.doit = true;
-			}
-		});
-		addFocusListener(new FocusListener() {
-			public void focusGained(FocusEvent e) {
-				if (!hasFocus) {
-					hasFocus = true;
-					if (DEBUG_FOCUS) {
-						System.out.println("FormText: focus gained"); //$NON-NLS-1$
-					}
-					if (!mouseFocus && !controlFocusTransfer) {
-						handleFocusChange();
-					}
-				}
-			}
-
-			public void focusLost(FocusEvent e) {
-				if (DEBUG_FOCUS) {
-					System.out.println("FormText: focus lost"); //$NON-NLS-1$
-				}
-				if (hasFocus) {
-					hasFocus = false;
-					if (!controlFocusTransfer)
-						handleFocusChange();
-				}
-			}
-		});
-		addMouseListener(new MouseListener() {
-			public void mouseDoubleClick(MouseEvent e) {
-			}
-
-			public void mouseDown(MouseEvent e) {
-				// select a link
-				handleMouseClick(e, true);
-			}
-
-			public void mouseUp(MouseEvent e) {
-				// activate a link
-				handleMouseClick(e, false);
-			}
-		});
-		addMouseTrackListener(new MouseTrackListener() {
-			public void mouseEnter(MouseEvent e) {
-				handleMouseMove(e);
-			}
-
-			public void mouseExit(MouseEvent e) {
-				if (entered != null) {
-					exitLink(entered, e.stateMask);
-					paintLinkHover(entered, false);
-					entered = null;
-					setCursor(null);
-				}
-			}
-
-			public void mouseHover(MouseEvent e) {
-				handleMouseHover(e);
-			}
-		});
-		addMouseMoveListener(new MouseMoveListener() {
-			public void mouseMove(MouseEvent e) {
-				handleMouseMove(e);
-			}
-		});
-		initAccessible();
-		ensureBoldFontPresent(getFont());
-		createMenu();
-		// we will handle traversal of controls, if any
-		setTabList(new Control[] {});
-	}
-
-	/**
-	 * Test for focus.
-	 * 
-	 * @return <samp>true </samp> if the widget has focus.
-	 */
-	public boolean getFocus() {
-		return hasFocus;
-	}
-
-	/**
-	 * Test if the widget is currently processing the text it is about to
-	 * render.
-	 * 
-	 * @return <samp>true </samp> if the widget is still loading the text,
-	 *         <samp>false </samp> otherwise.
-	 * @deprecated not used any more - returns <code>false</code>
-	 */
-	public boolean isLoading() {
-		return false;
-	}
-
-	/**
-	 * Returns the text that will be shown in the control while the real content
-	 * is loading.
-	 * 
-	 * @return loading text message
-	 * @deprecated loading text is not used since 3.1
-	 */
-	public String getLoadingText() {
-		return null;
-	}
-
-	/**
-	 * Sets the text that will be shown in the control while the real content is
-	 * loading. This is significant when content to render is loaded from the
-	 * input stream that was created from a remote URL, and the time to load the
-	 * entire content is nontrivial.
-	 * 
-	 * @param loadingText
-	 *            loading text message
-	 * @deprecated use setText(loadingText, false, false);
-	 */
-	public void setLoadingText(String loadingText) {
-		setText(loadingText, false, false);
-	}
-
-	/**
-	 * If paragraphs are separated, spacing will be added between them.
-	 * Otherwise, new paragraphs will simply start on a new line with no
-	 * spacing.
-	 * 
-	 * @param value
-	 *            <samp>true </samp> if paragraphs are separated, </samp> false
-	 *            </samp> otherwise.
-	 */
-	public void setParagraphsSeparated(boolean value) {
-		paragraphsSeparated = value;
-	}
-
-	/**
-	 * Tests if there is some inter-paragraph spacing.
-	 * 
-	 * @return <samp>true </samp> if paragraphs are separated, <samp>false
-	 *         </samp> otherwise.
-	 */
-	public boolean getParagraphsSeparated() {
-		return paragraphsSeparated;
-	}
-
-	/**
-	 * Registers the image referenced by the provided key.
-	 * <p>
-	 * For <samp>img </samp> tags, an object of a type <samp>Image </samp> must
-	 * be registered using the key equivalent to the value of the <samp>href
-	 * </samp> attribute used in the tag.
-	 * 
-	 * @param key
-	 *            unique key that matches the value of the <samp>href </samp>
-	 *            attribute.
-	 * @param image
-	 *            an object of a type <samp>Image </samp>.
-	 */
-	public void setImage(String key, Image image) {
-		resourceTable.put("i." + key, image); //$NON-NLS-1$
-	}
-
-	/**
-	 * Registers the color referenced by the provided key.
-	 * <p>
-	 * For <samp>span </samp> tags, an object of a type <samp>Color </samp> must
-	 * be registered using the key equivalent to the value of the <samp>color
-	 * </samp> attribute.
-	 * 
-	 * @param key
-	 *            unique key that matches the value of the <samp>color </samp>
-	 *            attribute.
-	 * @param color
-	 *            an object of the type <samp>Color </samp> or <samp>null</samp>
-	 *            if the key needs to be cleared.
-	 */
-	public void setColor(String key, Color color) {
-		String fullKey = "c." + key; //$NON-NLS-1$
-		if (color == null)
-			resourceTable.remove(fullKey);
-		else
-			resourceTable.put(fullKey, color);
-	}
-
-	/**
-	 * Registers the font referenced by the provided key.
-	 * <p>
-	 * For <samp>span </samp> tags, an object of a type <samp>Font </samp> must
-	 * be registered using the key equivalent to the value of the <samp>font
-	 * </samp> attribute.
-	 * 
-	 * @param key
-	 *            unique key that matches the value of the <samp>font </samp>
-	 *            attribute.
-	 * @param font
-	 *            an object of the type <samp>Font </samp> or <samp>null</samp>
-	 *            if the key needs to be cleared.
-	 */
-	public void setFont(String key, Font font) {
-		String fullKey = "f." + key; //$NON-NLS-1$
-		if (font == null)
-			resourceTable.remove(fullKey);
-		else
-			resourceTable.put(fullKey, font);
-		model.clearCache(fullKey);
-	}
-
-	/**
-	 * Registers the control referenced by the provided key.
-	 * <p>
-	 * For <samp>control</samp> tags, an object of a type <samp>Control</samp>
-	 * must be registered using the key equivalent to the value of the
-	 * <samp>control</samp> attribute.
-	 * 
-	 * @param key
-	 *            unique key that matches the value of the <samp>control</samp>
-	 *            attribute.
-	 * @param control
-	 *            an object of the type <samp>Control</samp> or <samp>null</samp>
-	 *            if the existing control at the specified key needs to be
-	 *            removed.
-	 * @since 3.1
-	 */
-	public void setControl(String key, Control control) {
-		String fullKey = "o." + key; //$NON-NLS-1$
-		if (control == null)
-			resourceTable.remove(fullKey);
-		else
-			resourceTable.put(fullKey, control);
-	}
-
-	/**
-	 * Sets the font to use to render the default text (text that does not have
-	 * special font property assigned). Bold font will be constructed from this
-	 * font.
-	 * 
-	 * @param font
-	 *            the default font to use
-	 */
-	public void setFont(Font font) {
-		super.setFont(font);
-		model.clearCache(null);
-		Font boldFont = (Font) resourceTable.get(FormTextModel.BOLD_FONT_ID);
-		if (boldFont != null) {
-			FormFonts.getInstance().markFinished(boldFont);
-			resourceTable.remove(FormTextModel.BOLD_FONT_ID);
-		}
-		ensureBoldFontPresent(getFont());
-	}
-
-	/**
-	 * Sets the provided text. Text can be rendered as-is, or by parsing the
-	 * formatting tags. Optionally, sections of text starting with http:// will
-	 * be converted to hyperlinks.
-	 * 
-	 * @param text
-	 *            the text to render
-	 * @param parseTags
-	 *            if <samp>true </samp>, formatting tags will be parsed.
-	 *            Otherwise, text will be rendered as-is.
-	 * @param expandURLs
-	 *            if <samp>true </samp>, URLs found in the untagged text will be
-	 *            converted into hyperlinks.
-	 */
-	public void setText(String text, boolean parseTags, boolean expandURLs) {
-		disposeResourceTable(false);
-		entered = null;
-		if (parseTags)
-			model.parseTaggedText(text, expandURLs);
-		else
-			model.parseRegularText(text, expandURLs);
-		hookControlSegmentFocus();
-		layout();
-		redraw();
-	}
-
-	/**
-	 * Sets the contents of the stream. Optionally, URLs in untagged text can be
-	 * converted into hyperlinks. The caller is responsible for closing the
-	 * stream.
-	 * 
-	 * @param is
-	 *            stream to render
-	 * @param expandURLs
-	 *            if <samp>true </samp>, URLs found in untagged text will be
-	 *            converted into hyperlinks.
-	 */
-	public void setContents(InputStream is, boolean expandURLs) {
-		entered = null;
-		disposeResourceTable(false);
-		model.parseInputStream(is, expandURLs);
-		hookControlSegmentFocus();
-		layout();
-		redraw();
-	}
-
-	private void hookControlSegmentFocus() {
-		Paragraph[] paragraphs = model.getParagraphs();
-		if (paragraphs == null)
-			return;
-		Listener listener = new Listener() {
-			public void handleEvent(Event e) {
-				switch (e.type) {
-				case SWT.FocusIn:
-					if (!controlFocusTransfer)
-						syncControlSegmentFocus((Control) e.widget);
-					break;
-				case SWT.Traverse:
-					if (DEBUG_FOCUS)
-						System.out.println("Control traversal: " + e); //$NON-NLS-1$
-					switch (e.detail) {
-					case SWT.TRAVERSE_PAGE_NEXT:
-					case SWT.TRAVERSE_PAGE_PREVIOUS:
-					case SWT.TRAVERSE_ARROW_NEXT:
-					case SWT.TRAVERSE_ARROW_PREVIOUS:
-						e.doit = false;
-						return;
-					}
-					Control c = (Control) e.widget;
-					ControlSegment segment = (ControlSegment) c
-							.getData(CONTROL_KEY);
-					if (e.detail == SWT.TRAVERSE_TAB_NEXT)
-						e.doit = advanceControl(c, segment, true);
-					else if (e.detail == SWT.TRAVERSE_TAB_PREVIOUS)
-						e.doit = advanceControl(c, segment, false);
-					if (!e.doit)
-						e.detail = SWT.TRAVERSE_NONE;
-					break;
-				}
-			}
-		};
-		for (int i = 0; i < paragraphs.length; i++) {
-			Paragraph p = paragraphs[i];
-			ParagraphSegment[] segments = p.getSegments();
-			for (int j = 0; j < segments.length; j++) {
-				if (segments[j] instanceof ControlSegment) {
-					ControlSegment cs = (ControlSegment) segments[j];
-					Control c = cs.getControl(resourceTable);
-					if (c != null) {
-						if (c.getData(CONTROL_KEY) == null) {
-							// first time - hook
-							c.setData(CONTROL_KEY, cs);
-							attachTraverseListener(c, listener);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	private void attachTraverseListener(Control c, Listener listener) {
-		if (c instanceof Composite) {
-			Composite parent = (Composite) c;
-			Control[] children = parent.getChildren();
-			for (int i = 0; i < children.length; i++) {
-				attachTraverseListener(children[i], listener);
-			}
-			if (c instanceof Canvas) {
-				// If Canvas, the control iteself can accept
-				// traverse events and should be monitored
-				c.addListener(SWT.Traverse, listener);
-				c.addListener(SWT.FocusIn, listener);
-			}
-		} else {
-			c.addListener(SWT.Traverse, listener);
-			c.addListener(SWT.FocusIn, listener);
-		}
-	}
-
-	/**
-	 * If we click on the control randomly, our internal book-keeping will be
-	 * off. We need to update the model and mark the control segment and
-	 * currently selected. Hyperlink that may have had focus must also be
-	 * exited.
-	 * 
-	 * @param control
-	 *            the control that got focus
-	 */
-	private void syncControlSegmentFocus(Control control) {
-		ControlSegment cs = null;
-
-		while (control != null) {
-			cs = (ControlSegment) control.getData(CONTROL_KEY);
-			if (cs != null)
-				break;
-			control = control.getParent();
-		}
-		if (cs == null)
-			return;
-		IFocusSelectable current = model.getSelectedSegment();
-		// If the model and the control match, all is well
-		if (current == cs)
-			return;
-		IHyperlinkSegment oldLink = null;
-		if (current != null && current instanceof IHyperlinkSegment) {
-			oldLink = (IHyperlinkSegment) current;
-			exitLink(oldLink, SWT.NULL);
-		}
-		if (DEBUG_FOCUS)
-			System.out.println("Sync control: " + cs + ", oldLink=" + oldLink); //$NON-NLS-1$ //$NON-NLS-2$
-		model.select(cs);
-		if (oldLink != null)
-			paintFocusTransfer(oldLink, null);
-		// getAccessible().setFocus(model.getSelectedSegmentIndex());
-	}
-
-	private boolean advanceControl(Control c, ControlSegment segment,
-			boolean next) {
-		Composite parent = c.getParent();
-		if (parent == this) {
-			// segment-level control
-			IFocusSelectable nextSegment = model.getNextFocusSegment(next);
-			if (nextSegment != null) {
-				controlFocusTransfer = true;
-				super.forceFocus();
-				controlFocusTransfer = false;
-				model.select(segment);
-				return advance(next);
-			}
-			// nowhere to go
-			return setFocusToNextSibling(this, next);
-		}
-		if (setFocusToNextSibling(c, next))
-			return true;
-		// still here - must go one level up
-		segment = (ControlSegment) parent.getData(CONTROL_KEY);
-		return advanceControl(parent, segment, next);
-	}
-
-	private boolean setFocusToNextSibling(Control c, boolean next) {
-		Composite parent = c.getParent();
-		Control[] children = parent.getTabList();
-		for (int i = 0; i < children.length; i++) {
-			Control child = children[i];
-			if (child == c) {
-				// here
-				if (next) {
-					for (int j = i + 1; j < children.length; j++) {
-						Control nc = children[j];
-						if (nc.setFocus())
-							return false;
-					}
-				} else {
-					for (int j = i - 1; j >= 0; j--) {
-						Control pc = children[j];
-						if (pc.setFocus())
-							return false;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Controls whether whitespace inside paragraph and list items is
-	 * normalized. Note that the new value will not affect the current text in
-	 * the control, only subsequent calls to <code>setText</code> or
-	 * <code>setContents</code>.
-	 * <p>
-	 * If normalized:
-	 * <ul>
-	 * <li>all white space characters will be condensed into at most one when
-	 * between words.</li>
-	 * <li>new line characters will be ignored and replaced with one white
-	 * space character</li>
-	 * <li>white space characters after the opening tags and before the closing
-	 * tags will be trimmed</li>
-	 * 
-	 * @param value
-	 *            <code>true</code> if whitespace is normalized,
-	 *            <code>false</code> otherwise.
-	 */
-	public void setWhitespaceNormalized(boolean value) {
-		model.setWhitespaceNormalized(value);
-	}
-
-	/**
-	 * Tests whether whitespace inside paragraph and list item is normalized.
-	 * 
-	 * @see #setWhitespaceNormalized(boolean)
-	 * @return <code>true</code> if whitespace is normalized,
-	 *         <code>false</code> otherwise.
-	 */
-	public boolean isWhitespaceNormalized() {
-		return model.isWhitespaceNormalized();
-	}
-
-	/**
-	 * Disposes the internal menu if created and sets the menu provided as a
-	 * parameter.
-	 * 
-	 * @param menu
-	 *            the menu to associate with this text control
-	 */
-	public void setMenu(Menu menu) {
-		Menu currentMenu = super.getMenu();
-		if (currentMenu != null && INTERNAL_MENU.equals(currentMenu.getData())) {
-			// internal menu set
-			if (menu != null) {
-				currentMenu.dispose();
-				super.setMenu(menu);
-			}
-		} else
-			super.setMenu(menu);
-	}
-
-	private void createMenu() {
-		Menu menu = new Menu(this);
-		final MenuItem copyItem = new MenuItem(menu, SWT.PUSH);
-		copyItem.setText(Messages.FormText_copy);
-
-		SelectionListener listener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (e.widget == copyItem) {
-					copy();
-				}
-			}
-		};
-		copyItem.addSelectionListener(listener);
-		menu.addMenuListener(new MenuListener() {
-			public void menuShown(MenuEvent e) {
-				copyItem.setEnabled(canCopy());
-			}
-
-			public void menuHidden(MenuEvent e) {
-			}
-		});
-		menu.setData(INTERNAL_MENU);
-		super.setMenu(menu);
-	}
-
-	/**
-	 * Returns the hyperlink settings that are in effect for this control.
-	 * 
-	 * @return current hyperlinks settings
-	 */
-	public HyperlinkSettings getHyperlinkSettings() {
-		return model.getHyperlinkSettings();
-	}
-
-	/**
-	 * Sets the hyperlink settings to be used for this control. Settings will
-	 * affect things like hyperlink color, rendering style, cursor etc.
-	 * 
-	 * @param settings
-	 *            hyperlink settings for this control
-	 */
-	public void setHyperlinkSettings(HyperlinkSettings settings) {
-		model.setHyperlinkSettings(settings);
-	}
-
-	/**
-	 * Adds a listener that will handle hyperlink events.
-	 * 
-	 * @param listener
-	 *            the listener to add
-	 */
-	public void addHyperlinkListener(IHyperlinkListener listener) {
-		if (listeners == null)
-			listeners = new ListenerList();
-		listeners.add(listener);
-	}
-
-	/**
-	 * Removes the hyperlink listener.
-	 * 
-	 * @param listener
-	 *            the listener to remove
-	 */
-	public void removeHyperlinkListener(IHyperlinkListener listener) {
-		if (listeners == null)
-			return;
-		listeners.remove(listener);
-	}
-
-	/**
-	 * Adds a selection listener. A Selection event is sent by the widget when
-	 * the selection has changed.
-	 * <p>
-	 * <code>widgetDefaultSelected</code> is not called for FormText.
-	 * </p>
-	 * 
-	 * @param listener
-	 *            the listener
-	 * @exception SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT when listener is null</li>
-	 *                </ul>
-	 * @since 3.1
-	 */
-	public void addSelectionListener(SelectionListener listener) {
-		checkWidget();
-		if (listener == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		TypedListener typedListener = new TypedListener(listener);
-		addListener(SWT.Selection, typedListener);
-	}
-
-	/**
-	 * Removes the specified selection listener.
-	 * <p>
-	 * 
-	 * @param listener
-	 *            the listener
-	 * @exception SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT when listener is null</li>
-	 *                </ul>
-	 * @since 3.1
-	 */
-	public void removeSelectionListener(SelectionListener listener) {
-		checkWidget();
-		if (listener == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		removeListener(SWT.Selection, listener);
-	}
-
-	/**
-	 * Returns the selected text.
-	 * <p>
-	 * 
-	 * @return selected text, or an empty String if there is no selection.
-	 * @exception SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * @since 3.1
-	 */
-
-	public String getSelectionText() {
-		checkWidget();
-		if (selData != null)
-			return selData.getSelectionText();
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * Tests if the text is selected and can be copied into the clipboard.
-	 * 
-	 * @return <code>true</code> if the selected text can be copied into the
-	 *         clipboard, <code>false</code> otherwise.
-	 * @since 3.1
-	 */
-	public boolean canCopy() {
-		return selData != null && selData.canCopy();
-	}
-
-	/**
-	 * Copies the selected text into the clipboard. Does nothing if no text is
-	 * selected or the text cannot be copied for any other reason.
-	 * 
-	 * @since 3.1
-	 */
-
-	public void copy() {
-		if (!canCopy())
-			return;
-		Clipboard clipboard = new Clipboard(getDisplay());
-		Object[] o = new Object[] { getSelectionText() };
-		Transfer[] t = new Transfer[] { TextTransfer.getInstance() };
-		clipboard.setContents(o, t);
-		clipboard.dispose();
-	}
-
-	/**
-	 * Returns the reference of the hyperlink that currently has keyboard focus,
-	 * or <code>null</code> if there are no hyperlinks in the receiver or no
-	 * hyperlink has focus at the moment.
-	 * 
-	 * @return href of the selected hyperlink or <code>null</code> if none
-	 *         selected.
-	 * @since 3.1
-	 */
-	public Object getSelectedLinkHref() {
-		IHyperlinkSegment link = getSelectedLink();
-		return link != null ? link.getHref() : null;
-	}
-
-	/**
-	 * Returns the text of the hyperlink that currently has keyboard focus, or
-	 * <code>null</code> if there are no hyperlinks in the receiver or no
-	 * hyperlink has focus at the moment.
-	 * 
-	 * @return text of the selected hyperlink or <code>null</code> if none
-	 *         selected.
-	 * @since 3.1
-	 */
-	public String getSelectedLinkText() {
-		IHyperlinkSegment link = getSelectedLink();
-		return link != null ? link.getText() : null;
-	}
-
-	private IHyperlinkSegment getSelectedLink() {
-		IFocusSelectable segment = model.getSelectedSegment();
-		if (segment != null && segment instanceof IHyperlinkSegment)
-			return (IHyperlinkSegment) segment;
-		return null;
-	}
-
-	private void initAccessible() {
-		Accessible accessible = getAccessible();
-		accessible.addAccessibleListener(new AccessibleAdapter() {
-			public void getName(AccessibleEvent e) {
-				if (e.childID == ACC.CHILDID_SELF)
-					e.result = model.getAccessibleText();
-				else {
-					int linkCount = model.getHyperlinkCount();
-					if (e.childID >= 0 && e.childID < linkCount) {
-						IHyperlinkSegment link = model.getHyperlink(e.childID);
-						e.result = link.getText();
-					}
-				}
-			}
-
-			public void getHelp(AccessibleEvent e) {
-				e.result = getToolTipText();
-				int linkCount = model.getHyperlinkCount();
-				if (e.result == null && e.childID >= 0 && e.childID < linkCount) {
-					IHyperlinkSegment link = model.getHyperlink(e.childID);
-					e.result = link.getText();
-				}
-			}
-		});
-		accessible.addAccessibleControlListener(new AccessibleControlAdapter() {
-			public void getChildAtPoint(AccessibleControlEvent e) {
-				Point pt = toControl(new Point(e.x, e.y));
-				IHyperlinkSegment link = model.findHyperlinkAt(pt.x, pt.y);
-				if (link != null)
-					e.childID = model.indexOf(link);
-				else
-					e.childID = ACC.CHILDID_SELF;
-			}
-
-			public void getLocation(AccessibleControlEvent e) {
-				Rectangle location = null;
-				if (e.childID != ACC.CHILDID_SELF
-						&& e.childID != ACC.CHILDID_NONE) {
-					int index = e.childID;
-					IHyperlinkSegment link = model.getHyperlink(index);
-					if (link != null) {
-						location = link.getBounds();
-					}
-				}
-				if (location == null) {
-					location = getBounds();
-				}
-				Point pt = toDisplay(new Point(location.x, location.y));
-				e.x = pt.x;
-				e.y = pt.y;
-				e.width = location.width;
-				e.height = location.height;
-			}
-
-			public void getFocus(AccessibleControlEvent e) {
-				int childID = ACC.CHILDID_NONE;
-
-				if (model.hasFocusSegments()) {
-					int selectedIndex = model.getSelectedSegmentIndex();
-					if (selectedIndex != -1) {
-						childID = selectedIndex;
-					}
-				}
-				e.childID = childID;
-			}
-			
-			public void getDefaultAction (AccessibleControlEvent e) {
-				if (model.getHyperlinkCount() > 0) {
-				    e.result = SWT.getMessage ("SWT_Press"); //$NON-NLS-1$
-				} 
-			}
-
-			public void getChildCount(AccessibleControlEvent e) {
-				e.detail = model.getHyperlinkCount();
-			}
-
-			public void getRole(AccessibleControlEvent e) {
-				int role = 0;
-				int childID = e.childID;
-				int linkCount = model.getHyperlinkCount();
-				if (childID == ACC.CHILDID_SELF) { 
-					if (linkCount > 0) {
-					    role = ACC.ROLE_LINK;
-					} else {
-						role = ACC.ROLE_TEXT;
-					}
-				} else if (childID >= 0 && childID < linkCount) {
-					role = ACC.ROLE_LINK;
-				}
-				e.detail = role;
-			}
-
-			public void getSelection(AccessibleControlEvent e) {
-				int selectedIndex = model.getSelectedSegmentIndex();
-				e.childID = (selectedIndex == -1) ? ACC.CHILDID_NONE
-						: selectedIndex;
-			}
-
-			public void getState(AccessibleControlEvent e) {
-				int linkCount = model.getHyperlinkCount();
-				int selectedIndex = model.getSelectedSegmentIndex();
-				int state = 0;
-				int childID = e.childID;
-				if (childID == ACC.CHILDID_SELF) {
-					state = ACC.STATE_NORMAL;
-				} else if (childID >= 0 && childID < linkCount) {
-					state = ACC.STATE_SELECTABLE;
-					if (isFocusControl()) {
-						state |= ACC.STATE_FOCUSABLE;
-					}
-					if (selectedIndex == childID) {
-						state |= ACC.STATE_SELECTED;
-						if (isFocusControl()) {
-							state |= ACC.STATE_FOCUSED;
-						}
-					}
-				}
-				state |= ACC.STATE_READONLY;
-				e.detail = state;
-			}
-
-			public void getChildren(AccessibleControlEvent e) {
-				int linkCount = model.getHyperlinkCount();
-				Object[] children = new Object[linkCount];
-				for (int i = 0; i < linkCount; i++) {
-					children[i] = new Integer(i);
-				}
-				e.children = children;
-			}
-
-			public void getValue(AccessibleControlEvent e) {
-				// e.result = model.getAccessibleText();
-			}
-		});
-	}
-
-	private void startSelection(MouseEvent e) {
-		inSelection = true;
-		selData = new SelectionData(e);
-		redraw();
-		Form form = FormUtil.getForm(this);
-		if (form != null)
-			form.setSelectionText(this);
-	}
-
-	private void endSelection(MouseEvent e) {
-		inSelection = false;
-		if (selData != null) {
-			if (!selData.isEnclosed())
-				selData = null;
-			else
-				computeSelection();
-		}
-		notifySelectionChanged();
-	}
-
-	private void computeSelection() {
-		GC gc = new GC(this);
-		Paragraph[] paragraphs = model.getParagraphs();
-		IHyperlinkSegment selectedLink = getSelectedLink();
-		if (getDisplay().getFocusControl() != this)
-			selectedLink = null;
-		for (int i = 0; i < paragraphs.length; i++) {
-			Paragraph p = paragraphs[i];
-			if (i > 0)
-				selData.markNewLine();
-			p.computeSelection(gc, resourceTable, selectedLink, selData);
-		}
-		gc.dispose();
-	}
-
-	void clearSelection() {
-		selData = null;
-		if (!isDisposed()) {
-			redraw();
-			notifySelectionChanged();
-		}
-	}
-
-	private void notifySelectionChanged() {
-		Event event = new Event();
-		event.widget = this;
-		event.display = this.getDisplay();
-		event.type = SWT.Selection;
-		notifyListeners(SWT.Selection, event);
-		getAccessible().selectionChanged();
-	}
-
-	private void handleDrag(MouseEvent e) {
-		if (selData != null) {
-			ScrolledComposite scomp = FormUtil.getScrolledComposite(this);
-			if (scomp != null) {
-				FormUtil.ensureVisible(scomp, this, e);
-			}
-			selData.update(e);
-			redraw();
-		}
-	}
-
-	private void handleMouseClick(MouseEvent e, boolean down) {
-		if (DEBUG_FOCUS)
-			System.out.println("FormText: mouse click(" + down + ")"); //$NON-NLS-1$ //$NON-NLS-2$
-		if (down) {
-			// select a hyperlink
-			mouseFocus = true;
-			IHyperlinkSegment segmentUnder = model.findHyperlinkAt(e.x, e.y);
-			if (segmentUnder != null) {
-				IHyperlinkSegment oldLink = getSelectedLink();
-				if (getDisplay().getFocusControl() != this) {
-					setFocus();
-				}
-				model.selectLink(segmentUnder);
-				enterLink(segmentUnder, e.stateMask);
-				paintFocusTransfer(oldLink, segmentUnder);
-			}
-			if (e.button == 1) {
-				startSelection(e);
-				armed = segmentUnder;
-			}
-			else {
-			}
-		} else {
-			if (e.button == 1) {
-				endSelection(e);
-				IHyperlinkSegment segmentUnder = model
-						.findHyperlinkAt(e.x, e.y);
-				if (segmentUnder != null && armed == segmentUnder && selData == null) {
-					activateLink(segmentUnder, e.stateMask);
-					armed = null;
-				}
-			}
-			mouseFocus = false;
-		}
-	}
-
-	private void handleMouseHover(MouseEvent e) {
-	}
-
-	private void updateTooltipText(ParagraphSegment segment) {
-		String tooltipText = null;
-		if (segment != null) {
-			tooltipText = segment.getTooltipText();
-		}
-		String currentTooltipText = getToolTipText();
-
-		if ((currentTooltipText != null && tooltipText == null)
-				|| (currentTooltipText == null && tooltipText != null))
-			setToolTipText(tooltipText);
-	}
-
-	private void handleMouseMove(MouseEvent e) {
-		if (inSelection) {
-			handleDrag(e);
-			return;
-		}
-		ParagraphSegment segmentUnder = model.findSegmentAt(e.x, e.y);
-		updateTooltipText(segmentUnder);
-		if (segmentUnder == null) {
-			if (entered != null) {
-				exitLink(entered, e.stateMask);
-				paintLinkHover(entered, false);
-				entered = null;
-			}
-			setCursor(null);
-		} else {
-			if (segmentUnder instanceof IHyperlinkSegment) {
-				IHyperlinkSegment linkUnder = (IHyperlinkSegment) segmentUnder;
-				if (entered!=null && linkUnder!=entered) {
-					// Special case: links are so close that there are 0 pixels between.
-					// Must exit the link before entering the next one.
-					exitLink(entered, e.stateMask);
-					paintLinkHover(entered, false);
-					entered = null;
-				}
-				if (entered == null) {
-					entered = linkUnder;
-					enterLink(linkUnder, e.stateMask);
-					paintLinkHover(entered, true);
-					setCursor(model.getHyperlinkSettings().getHyperlinkCursor());
-				}
-			} else {
-				if (entered != null) {
-					exitLink(entered, e.stateMask);
-					paintLinkHover(entered, false);
-					entered = null;
-				}
-				if (segmentUnder instanceof TextSegment)
-					setCursor(model.getHyperlinkSettings().getTextCursor());
-				else
-					setCursor(null);
-			}
-		}
-	}
-
-	private boolean advance(boolean next) {
-		if (DEBUG_FOCUS)
-			System.out.println("Advance: next=" + next); //$NON-NLS-1$
-		IFocusSelectable current = model.getSelectedSegment();
-		if (current != null && current instanceof IHyperlinkSegment)
-			exitLink((IHyperlinkSegment) current, SWT.NULL);
-		IFocusSelectable newSegment = null;
-		boolean valid = false;
-		// get the next segment that can accept focus. Links
-		// can always accept focus but controls may not
-		while (!valid) {
-			if (!model.traverseFocusSelectableObjects(next))
-				break;
-			newSegment = model.getSelectedSegment();
-			if (newSegment == null)
-				break;
-			valid = setControlFocus(next, newSegment);
-		}
-		IHyperlinkSegment newLink = newSegment instanceof IHyperlinkSegment ? (IHyperlinkSegment) newSegment
-				: null;
-		if (valid)
-			enterLink(newLink, SWT.NULL);
-		IHyperlinkSegment oldLink = current instanceof IHyperlinkSegment ? (IHyperlinkSegment) current
-				: null;
-		if (oldLink != null || newLink != null)
-			paintFocusTransfer(oldLink, newLink);
-		if (newLink != null)
-			ensureVisible(newLink);
-		if (newLink != null)
-			getAccessible().setFocus(model.getSelectedSegmentIndex());
-		return !valid;
-	}
-
-	private boolean setControlFocus(boolean next, IFocusSelectable selectable) {
-		controlFocusTransfer = true;
-		boolean result = selectable.setFocus(resourceTable, next);
-		controlFocusTransfer = false;
-		return result;
-	}
-
-	private void handleFocusChange() {
-		if (DEBUG_FOCUS) {
-			System.out.println("Handle focus change: hasFocus=" + hasFocus //$NON-NLS-1$
-					+ ", mouseFocus=" + mouseFocus); //$NON-NLS-1$
-		}
-		if (hasFocus) {
-			boolean advance = true;
-			if (!mouseFocus) {
-				// if (model.restoreSavedLink() == false)
-				boolean valid = false;
-				IFocusSelectable selectable = null;
-				while (!valid) {
-					if (!model.traverseFocusSelectableObjects(advance))
-						break;
-					selectable = model.getSelectedSegment();
-					if (selectable == null)
-						break;
-					valid = setControlFocus(advance, selectable);
-				}
-				if (selectable != null)
-					ensureVisible(selectable);
-				if (selectable instanceof IHyperlinkSegment) {
-					enterLink((IHyperlinkSegment) selectable, SWT.NULL);
-					paintFocusTransfer(null, (IHyperlinkSegment) selectable);
-				}
-			}
-		} else {
-			paintFocusTransfer(getSelectedLink(), null);
-			model.selectLink(null);
-		}
-		if (!model.hasFocusSegments())
-			redraw();
-	}
-
-	private void enterLink(IHyperlinkSegment link, int stateMask) {
-		if (link == null || listeners == null)
-			return;
-		int size = listeners.size();
-		HyperlinkEvent he = new HyperlinkEvent(this, link.getHref(), link
-				.getText(), stateMask);
-		Object [] listenerList = listeners.getListeners();
-		for (int i = 0; i < size; i++) {
-			IHyperlinkListener listener = (IHyperlinkListener) listenerList[i];
-			listener.linkEntered(he);
-		}
-	}
-
-	private void exitLink(IHyperlinkSegment link, int stateMask) {
-		if (link == null || listeners == null)
-			return;
-		int size = listeners.size();
-		HyperlinkEvent he = new HyperlinkEvent(this, link.getHref(), link
-				.getText(), stateMask);
-		Object [] listenerList = listeners.getListeners();
-		for (int i = 0; i < size; i++) {
-			IHyperlinkListener listener = (IHyperlinkListener) listenerList[i];
-			listener.linkExited(he);
-		}
-	}
-
-	private void paintLinkHover(IHyperlinkSegment link, boolean hover) {
-		GC gc = new GC(this);
-		HyperlinkSettings settings = getHyperlinkSettings();
-		Color newFg = hover ? settings.getActiveForeground() : settings
-				.getForeground();
-		if (newFg != null)
-			gc.setForeground(newFg);
-		gc.setBackground(getBackground());
-		gc.setFont(getFont());
-		boolean selected = (link == getSelectedLink());
-		((ParagraphSegment) link).paint(gc, hover, resourceTable, selected,
-				selData, null);
-		gc.dispose();
-	}
-
-	private void activateSelectedLink() {
-		IHyperlinkSegment link = getSelectedLink();
-		if (link != null)
-			activateLink(link, SWT.NULL);
-	}
-
-	private void activateLink(IHyperlinkSegment link, int stateMask) {
-		setCursor(model.getHyperlinkSettings().getBusyCursor());
-		if (listeners != null) {
-			int size = listeners.size();
-			HyperlinkEvent e = new HyperlinkEvent(this, link.getHref(), link
-					.getText(), stateMask);
-			Object [] listenerList = listeners.getListeners();
-			for (int i = 0; i < size; i++) {
-				IHyperlinkListener listener = (IHyperlinkListener) listenerList[i];
-				listener.linkActivated(e);
-			}
-		}
-		if (!isDisposed() && model.linkExists(link)) {
-			setCursor(model.getHyperlinkSettings().getHyperlinkCursor());
-		}
-	}
-
-	private void ensureBoldFontPresent(Font regularFont) {
-		Font boldFont = (Font) resourceTable.get(FormTextModel.BOLD_FONT_ID);
-		if (boldFont != null)
-			return;
-		boldFont = FormFonts.getInstance().getBoldFont(getDisplay(), regularFont);
-		resourceTable.put(FormTextModel.BOLD_FONT_ID, boldFont);
-	}
-
-	private void paint(PaintEvent e) {
-		GC gc = e.gc;
-		gc.setFont(getFont());
-		ensureBoldFontPresent(getFont());
-		gc.setForeground(getForeground());
-		gc.setBackground(getBackground());
-		repaint(gc, e.x, e.y, e.width, e.height);
-	}
-
-	private void repaint(GC gc, int x, int y, int width, int height) {
-		Image textBuffer = new Image(getDisplay(), width, height);
-		Color bg = getBackground();
-		Color fg = getForeground();
-		if (!getEnabled()) {
-			bg = getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
-			fg = getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW);
-		}
-		GC textGC = new GC(textBuffer, gc.getStyle());
-		textGC.setForeground(fg);
-		textGC.setBackground(bg);
-		textGC.setFont(getFont());
-		textGC.fillRectangle(0, 0, width, height);
-		Rectangle repaintRegion = new Rectangle(x, y, width, height);
-
-		Paragraph[] paragraphs = model.getParagraphs();
-		IHyperlinkSegment selectedLink = getSelectedLink();
-		if (getDisplay().getFocusControl() != this)
-			selectedLink = null;
-		for (int i = 0; i < paragraphs.length; i++) {
-			Paragraph p = paragraphs[i];
-			p
-					.paint(textGC, repaintRegion, resourceTable, selectedLink,
-							selData);
-		}
-		if (hasFocus && !model.hasFocusSegments())
-			textGC.drawFocus(x, y, width, height);
-		textGC.dispose();
-		gc.drawImage(textBuffer, x, y);
-		textBuffer.dispose();
-	}
-
-	private int getParagraphSpacing(int lineHeight) {
-		return lineHeight / 2;
-	}
-
-	private void paintFocusTransfer(IHyperlinkSegment oldLink,
-			IHyperlinkSegment newLink) {
-		GC gc = new GC(this);
-		Color bg = getBackground();
-		Color fg = getForeground();
-		gc.setFont(getFont());
-		if (oldLink != null) {
-			gc.setBackground(bg);
-			gc.setForeground(fg);
-			oldLink.paintFocus(gc, bg, fg, false, null);
-		}
-		if (newLink != null) {
-			// ensureVisible(newLink);
-			gc.setBackground(bg);
-			gc.setForeground(fg);
-			newLink.paintFocus(gc, bg, fg, true, null);
-		}
-		gc.dispose();
-	}
-
-	private void ensureVisible(IFocusSelectable segment) {
-		if (mouseFocus) {
-			mouseFocus = false;
-			return;
-		}
-		if (segment == null)
-			return;
-		Rectangle bounds = segment.getBounds();
-		ScrolledComposite scomp = FormUtil.getScrolledComposite(this);
-		if (scomp == null)
-			return;
-		Point origin = FormUtil.getControlLocation(scomp, this);
-		origin.x += bounds.x;
-		origin.y += bounds.y;
-		FormUtil.ensureVisible(scomp, origin, new Point(bounds.width,
-				bounds.height));
-	}
-
-	/**
-	 * Overrides the method by fully trusting the layout manager (computed width
-	 * or height may be larger than the provider width or height hints). Callers
-	 * should be prepared that the computed width is larger than the provided
-	 * wHint.
-	 * 
-	 * @see org.eclipse.swt.widgets.Composite#computeSize(int, int, boolean)
-	 */
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		checkWidget();
-		Point size;
-		FormTextLayout layout = (FormTextLayout) getLayout();
-		if (wHint == SWT.DEFAULT || hHint == SWT.DEFAULT) {
-			size = layout.computeSize(this, wHint, hHint, changed);
-		} else {
-			size = new Point(wHint, hHint);
-		}
-		Rectangle trim = computeTrim(0, 0, size.x, size.y);
-		if (DEBUG_TEXTSIZE)
-			System.out.println("FormText Computed size: "+trim); //$NON-NLS-1$
-		return new Point(trim.width, trim.height);
-	}
-
-	private void disposeResourceTable(boolean disposeBoldFont) {
-		if (disposeBoldFont) {
-			Font boldFont = (Font) resourceTable
-					.get(FormTextModel.BOLD_FONT_ID);
-			if (boldFont != null) {
-				FormFonts.getInstance().markFinished(boldFont);
-				resourceTable.remove(FormTextModel.BOLD_FONT_ID);
-			}
-		}
-		ArrayList imagesToRemove = new ArrayList();
-		for (Enumeration enm = resourceTable.keys(); enm.hasMoreElements();) {
-			String key = (String) enm.nextElement();
-			if (key.startsWith(ImageSegment.SEL_IMAGE_PREFIX)) {
-				Object obj = resourceTable.get(key);
-				if (obj instanceof Image) {
-					Image image = (Image) obj;
-					if (!image.isDisposed()) {
-						image.dispose();
-						imagesToRemove.add(key);
-					}
-				}
-			}
-		}
-		for (int i = 0; i < imagesToRemove.size(); i++) {
-			resourceTable.remove(imagesToRemove.get(i));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.widgets.Control#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-		super.setEnabled(enabled);
-		redraw();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Control#setFocus()
-	 */
-	public boolean setFocus() {
-		mouseFocus = true;
-		FormUtil.setFocusScrollingEnabled(this, false);
-		boolean result = super.setFocus();
-		mouseFocus = false;
-		FormUtil.setFocusScrollingEnabled(this, true);
-		return result;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/FormToolkit.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/FormToolkit.java
deleted file mode 100644
index 56b659d..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/FormToolkit.java
+++ /dev/null
@@ -1,912 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Michael Williamson (eclipse-bugs@magnaworks.com) - patch (see Bugzilla #92545) 
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.custom.ScrolledComposite;
-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.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.forms.FormColors;
-import org.eclipse.ui.forms.HyperlinkGroup;
-import org.eclipse.ui.forms.IFormColors;
-import org.eclipse.ui.internal.forms.widgets.FormFonts;
-import org.eclipse.ui.internal.forms.widgets.FormUtil;
-
-/**
- * The toolkit is responsible for creating SWT controls adapted to work in
- * Eclipse forms. In addition to changing their presentation properties (fonts,
- * colors etc.), various listeners are attached to make them behave correctly in
- * the form context.
- * <p>
- * In addition to being the control factory, the toolkit is also responsible for
- * painting flat borders for select controls, managing hyperlink groups and
- * control colors.
- * <p>
- * The toolkit creates some of the most common controls used to populate Eclipse
- * forms. Controls that must be created using their constructors,
- * <code>adapt()</code> method is available to change its properties in the
- * same way as with the supported toolkit controls.
- * <p>
- * Typically, one toolkit object is created per workbench part (for example, an
- * editor or a form wizard). The toolkit is disposed when the part is disposed.
- * To conserve resources, it is possible to create one color object for the
- * entire plug-in and share it between several toolkits. The plug-in is
- * responsible for disposing the colors (disposing the toolkit that uses shared
- * color object will not dispose the colors).
- * <p>
- * FormToolkit is normally instantiated, but can also be subclassed if some of
- * the methods needs to be modified. In those cases, <code>super</code> must
- * be called to preserve normal behaviour.
- * 
- * @since 3.0
- */
-public class FormToolkit {
-	public static final String KEY_DRAW_BORDER = "FormWidgetFactory.drawBorder"; //$NON-NLS-1$
-
-	public static final String TREE_BORDER = "treeBorder"; //$NON-NLS-1$
-
-	public static final String TEXT_BORDER = "textBorder"; //$NON-NLS-1$
-
-	private int borderStyle = SWT.NULL;
-
-	private FormColors colors;
-
-	private int orientation = Window.getDefaultOrientation();
-
-	// private KeyListener deleteListener;
-	private BorderPainter borderPainter;
-
-	private BoldFontHolder boldFontHolder;
-
-	private HyperlinkGroup hyperlinkGroup;
-
-	/* default */
-	VisibilityHandler visibilityHandler;
-
-	/* default */
-	KeyboardHandler keyboardHandler;
-
-	private class BorderPainter implements PaintListener {
-		public void paintControl(PaintEvent event) {
-			Composite composite = (Composite) event.widget;
-			Control[] children = composite.getChildren();
-			for (int i = 0; i < children.length; i++) {
-				Control c = children[i];
-				boolean inactiveBorder = false;
-				boolean textBorder = false;
-				if (!c.isVisible())
-					continue;
-				/*
-				 * if (c.getEnabled() == false && !(c instanceof CCombo))
-				 * continue;
-				 */
-				if (c instanceof Hyperlink)
-					continue;
-				Object flag = c.getData(KEY_DRAW_BORDER);
-				if (flag != null) {
-					if (flag.equals(Boolean.FALSE))
-						continue;
-					if (flag.equals(TREE_BORDER))
-						inactiveBorder = true;
-					else if (flag.equals(TEXT_BORDER))
-						textBorder = true;
-				}
-				if (getBorderStyle() == SWT.BORDER) {
-					if (!inactiveBorder && !textBorder) {
-						continue;
-					}
-					if (c instanceof Text || c instanceof Table
-							|| c instanceof Tree)
-						continue;
-				}
-				if (!inactiveBorder
-						&& (c instanceof Text || c instanceof CCombo || textBorder)) {
-					Rectangle b = c.getBounds();
-					GC gc = event.gc;
-					gc.setForeground(c.getBackground());
-					gc.drawRectangle(b.x - 1, b.y - 1, b.width + 1,
-							b.height + 1);
-					// gc.setForeground(getBorderStyle() == SWT.BORDER ? colors
-					// .getBorderColor() : colors.getForeground());
-					gc.setForeground(colors.getBorderColor());
-					if (c instanceof CCombo)
-						gc.drawRectangle(b.x - 1, b.y - 1, b.width + 1,
-								b.height + 1);
-					else
-						gc.drawRectangle(b.x - 1, b.y - 2, b.width + 1,
-								b.height + 3);
-				} else if (inactiveBorder || c instanceof Table
-						|| c instanceof Tree) {
-					Rectangle b = c.getBounds();
-					GC gc = event.gc;
-					gc.setForeground(colors.getBorderColor());
-					gc.drawRectangle(b.x - 1, b.y - 1, b.width + 1,
-							b.height + 1);
-				}
-			}
-		}
-	}
-
-	private static class VisibilityHandler extends FocusAdapter {
-		public void focusGained(FocusEvent e) {
-			Widget w = e.widget;
-			if (w instanceof Control) {
-				FormUtil.ensureVisible((Control) w);
-			}
-		}
-	}
-
-	private static class KeyboardHandler extends KeyAdapter {
-		public void keyPressed(KeyEvent e) {
-			Widget w = e.widget;
-			if (w instanceof Control) {
-				if (e.doit)
-					FormUtil.processKey(e.keyCode, (Control) w);
-			}
-		}
-	}
-
-	private class BoldFontHolder {
-		private Font normalFont;
-
-		private Font boldFont;
-
-		public BoldFontHolder() {
-		}
-
-		public Font getBoldFont(Font font) {
-			createBoldFont(font);
-			return boldFont;
-		}
-
-		private void createBoldFont(Font font) {
-			if (normalFont == null || !normalFont.equals(font)) {
-				normalFont = font;
-				dispose();
-			}
-			if (boldFont == null) {
-				boldFont = FormFonts.getInstance().getBoldFont(colors.getDisplay(),
-						normalFont);
-			}
-		}
-
-		public void dispose() {
-			if (boldFont != null) {
-				FormFonts.getInstance().markFinished(boldFont);
-				boldFont = null;
-			}
-		}
-	}
-
-	/**
-	 * Creates a toolkit that is self-sufficient (will manage its own colors).
-	 * <p>
-	 * Clients that call this method must call {@link #dispose()} when they
-	 * are finished using the toolkit.
-	 * 
-	 */
-	public FormToolkit(Display display) {
-		this(new FormColors(display));
-	}
-
-	/**
-	 * Creates a toolkit that will use the provided (shared) colors. The toolkit
-	 * will dispose the colors if and only if they are <b>not</b> marked as
-	 * shared via the <code>markShared()</code> method.
-	 * <p>
-	 * Clients that call this method must call {@link #dispose()} when they
-	 * are finished using the toolkit.
-	 * 
-	 * @param colors
-	 *            the shared colors
-	 */
-	public FormToolkit(FormColors colors) {
-		this.colors = colors;
-		initialize();
-	}
-
-	/**
-	 * Creates a button as a part of the form.
-	 * 
-	 * @param parent
-	 *            the button parent
-	 * @param text
-	 *            an optional text for the button (can be <code>null</code>)
-	 * @param style
-	 *            the button style (for example, <code>SWT.PUSH</code>)
-	 * @return the button widget
-	 */
-	public Button createButton(Composite parent, String text, int style) {
-		Button button = new Button(parent, style | SWT.FLAT | orientation);
-		if (text != null)
-			button.setText(text);
-		adapt(button, true, true);
-		return button;
-	}
-
-	/**
-	 * Creates the composite as a part of the form.
-	 * 
-	 * @param parent
-	 *            the composite parent
-	 * @return the composite widget
-	 */
-	public Composite createComposite(Composite parent) {
-		return createComposite(parent, SWT.NULL);
-	}
-
-	/**
-	 * Creates the composite as part of the form using the provided style.
-	 * 
-	 * @param parent
-	 *            the composite parent
-	 * @param style
-	 *            the composite style
-	 * @return the composite widget
-	 */
-	public Composite createComposite(Composite parent, int style) {
-		Composite composite = new LayoutComposite(parent, style | orientation);
-		adapt(composite);
-		return composite;
-	}
-
-	/**
-	 * Creats the composite that can server as a separator between various parts
-	 * of a form. Separator height should be controlled by setting the height
-	 * hint on the layout data for the composite.
-	 * 
-	 * @param parent
-	 *            the separator parent
-	 * @return the separator widget
-	 */
-	public Composite createCompositeSeparator(Composite parent) {
-		final Composite composite = new Composite(parent, orientation);
-		composite.addListener(SWT.Paint, new Listener() {
-			public void handleEvent(Event e) {
-				if (composite.isDisposed())
-					return;
-				Rectangle bounds = composite.getBounds();
-				GC gc = e.gc;
-				gc.setForeground(colors.getColor(IFormColors.SEPARATOR));
-				if (colors.getBackground() != null)
-					gc.setBackground(colors.getBackground());
-				gc.fillGradientRectangle(0, 0, bounds.width, bounds.height,
-						false);
-			}
-		});
-		if (parent instanceof Section)
-			((Section) parent).setSeparatorControl(composite);
-		return composite;
-	}
-
-	/**
-	 * Creates a label as a part of the form.
-	 * 
-	 * @param parent
-	 *            the label parent
-	 * @param text
-	 *            the label text
-	 * @return the label widget
-	 */
-	public Label createLabel(Composite parent, String text) {
-		return createLabel(parent, text, SWT.NONE);
-	}
-
-	/**
-	 * Creates a label as a part of the form.
-	 * 
-	 * @param parent
-	 *            the label parent
-	 * @param text
-	 *            the label text
-	 * @param style
-	 *            the label style
-	 * @return the label widget
-	 */
-	public Label createLabel(Composite parent, String text, int style) {
-		Label label = new Label(parent, style | orientation);
-		if (text != null)
-			label.setText(text);
-		adapt(label, false, false);
-		return label;
-	}
-
-	/**
-	 * Creates a hyperlink as a part of the form. The hyperlink will be added to
-	 * the hyperlink group that belongs to this toolkit.
-	 * 
-	 * @param parent
-	 *            the hyperlink parent
-	 * @param text
-	 *            the text of the hyperlink
-	 * @param style
-	 *            the hyperlink style
-	 * @return the hyperlink widget
-	 */
-	public Hyperlink createHyperlink(Composite parent, String text, int style) {
-		Hyperlink hyperlink = new Hyperlink(parent, style | orientation);
-		if (text != null)
-			hyperlink.setText(text);
-		hyperlink.addFocusListener(visibilityHandler);
-		hyperlink.addKeyListener(keyboardHandler);
-		hyperlinkGroup.add(hyperlink);
-		return hyperlink;
-	}
-
-	/**
-	 * Creates an image hyperlink as a part of the form. The hyperlink will be
-	 * added to the hyperlink group that belongs to this toolkit.
-	 * 
-	 * @param parent
-	 *            the hyperlink parent
-	 * @param style
-	 *            the hyperlink style
-	 * @return the image hyperlink widget
-	 */
-	public ImageHyperlink createImageHyperlink(Composite parent, int style) {
-		ImageHyperlink hyperlink = new ImageHyperlink(parent, style
-				| orientation);
-		hyperlink.addFocusListener(visibilityHandler);
-		hyperlink.addKeyListener(keyboardHandler);
-		hyperlinkGroup.add(hyperlink);
-		return hyperlink;
-	}
-
-	/**
-	 * Creates a rich text as a part of the form.
-	 * 
-	 * @param parent
-	 *            the rich text parent
-	 * @param trackFocus
-	 *            if <code>true</code>, the toolkit will monitor focus
-	 *            transfers to ensure that the hyperlink in focus is visible in
-	 *            the form.
-	 * @return the rich text widget
-	 */
-	public FormText createFormText(Composite parent, boolean trackFocus) {
-		FormText engine = new FormText(parent, SWT.WRAP | orientation);
-		engine.marginWidth = 1;
-		engine.marginHeight = 0;
-		engine.setHyperlinkSettings(getHyperlinkGroup());
-		adapt(engine, trackFocus, true);
-		engine.setMenu(parent.getMenu());
-		return engine;
-	}
-
-	/**
-	 * Adapts a control to be used in a form that is associated with this
-	 * toolkit. This involves adjusting colors and optionally adding handlers to
-	 * ensure focus tracking and keyboard management.
-	 * 
-	 * @param control
-	 *            a control to adapt
-	 * @param trackFocus
-	 *            if <code>true</code>, form will be scrolled horizontally
-	 *            and/or vertically if needed to ensure that the control is
-	 *            visible when it gains focus. Set it to <code>false</code> if
-	 *            the control is not capable of gaining focus.
-	 * @param trackKeyboard
-	 *            if <code>true</code>, the control that is capable of
-	 *            gaining focus will be tracked for certain keys that are
-	 *            important to the underlying form (for example, PageUp,
-	 *            PageDown, ScrollUp, ScrollDown etc.). Set it to
-	 *            <code>false</code> if the control is not capable of gaining
-	 *            focus or these particular key event are already used by the
-	 *            control.
-	 */
-	public void adapt(Control control, boolean trackFocus, boolean trackKeyboard) {
-		control.setBackground(colors.getBackground());
-		control.setForeground(colors.getForeground());
-		if (control instanceof ExpandableComposite) {
-			ExpandableComposite ec = (ExpandableComposite) control;
-			if (ec.toggle != null) {
-				if (trackFocus)
-					ec.toggle.addFocusListener(visibilityHandler);
-				if (trackKeyboard)
-					ec.toggle.addKeyListener(keyboardHandler);
-			}
-			if (ec.textLabel != null) {
-				if (trackFocus)
-					ec.textLabel.addFocusListener(visibilityHandler);
-				if (trackKeyboard)
-					ec.textLabel.addKeyListener(keyboardHandler);
-			}
-			return;
-		}
-		if (trackFocus)
-			control.addFocusListener(visibilityHandler);
-		if (trackKeyboard)
-			control.addKeyListener(keyboardHandler);
-	}
-
-	/**
-	 * Adapts a composite to be used in a form associated with this toolkit.
-	 * 
-	 * @param composite
-	 *            the composite to adapt
-	 */
-	public void adapt(Composite composite) {
-		composite.setBackground(colors.getBackground());
-		composite.addMouseListener(new MouseAdapter() {
-			public void mouseDown(MouseEvent e) {
-				((Control) e.widget).setFocus();
-			}
-		});
-		if (composite.getParent() != null)
-			composite.setMenu(composite.getParent().getMenu());
-	}
-
-	/**
-	 * A helper method that ensures the provided control is visible when
-	 * ScrolledComposite is somewhere in the parent chain. If scroll bars are
-	 * visible and the control is clipped, the client of the scrolled composite
-	 * will be scrolled to reveal the control.
-	 * 
-	 * @param c
-	 *            the control to reveal
-	 */
-	public static void ensureVisible(Control c) {
-		FormUtil.ensureVisible(c);
-	}
-
-	/**
-	 * Creates a section as a part of the form.
-	 * 
-	 * @param parent
-	 *            the section parent
-	 * @param sectionStyle
-	 *            the section style
-	 * @return the section widget
-	 */
-	public Section createSection(Composite parent, int sectionStyle) {
-		Section section = new Section(parent, orientation, sectionStyle);
-		section.setMenu(parent.getMenu());
-		adapt(section, true, true);
-		if (section.toggle != null) {
-			section.toggle.setHoverDecorationColor(colors
-					.getColor(IFormColors.TB_TOGGLE_HOVER));
-			section.toggle.setDecorationColor(colors
-					.getColor(IFormColors.TB_TOGGLE));
-		}
-		section.setFont(boldFontHolder.getBoldFont(parent.getFont()));
-		if ((sectionStyle & Section.TITLE_BAR) != 0
-				|| (sectionStyle & Section.SHORT_TITLE_BAR) != 0) {
-			colors.initializeSectionToolBarColors();
-			section.setTitleBarBackground(colors.getColor(IFormColors.TB_BG));
-			section.setTitleBarBorderColor(colors
-					.getColor(IFormColors.TB_BORDER));
-		}
-		// call setTitleBarForeground regardless as it also sets the label color
-		section.setTitleBarForeground(colors
-				.getColor(IFormColors.TB_TOGGLE));
-		return section;
-	}
-
-	/**
-	 * Creates an expandable composite as a part of the form.
-	 * 
-	 * @param parent
-	 *            the expandable composite parent
-	 * @param expansionStyle
-	 *            the expandable composite style
-	 * @return the expandable composite widget
-	 */
-	public ExpandableComposite createExpandableComposite(Composite parent,
-			int expansionStyle) {
-		ExpandableComposite ec = new ExpandableComposite(parent, orientation,
-				expansionStyle);
-		ec.setMenu(parent.getMenu());
-		adapt(ec, true, true);
-		ec.setFont(boldFontHolder.getBoldFont(ec.getFont()));
-		return ec;
-	}
-
-	/**
-	 * Creates a separator label as a part of the form.
-	 * 
-	 * @param parent
-	 *            the separator parent
-	 * @param style
-	 *            the separator style
-	 * @return the separator label
-	 */
-	public Label createSeparator(Composite parent, int style) {
-		Label label = new Label(parent, SWT.SEPARATOR | style | orientation);
-		label.setBackground(colors.getBackground());
-		label.setForeground(colors.getBorderColor());
-		return label;
-	}
-
-	/**
-	 * Creates a table as a part of the form.
-	 * 
-	 * @param parent
-	 *            the table parent
-	 * @param style
-	 *            the table style
-	 * @return the table widget
-	 */
-	public Table createTable(Composite parent, int style) {
-		Table table = new Table(parent, style | borderStyle | orientation);
-		adapt(table, false, false);
-		// hookDeleteListener(table);
-		return table;
-	}
-
-	/**
-	 * Creates a text as a part of the form.
-	 * 
-	 * @param parent
-	 *            the text parent
-	 * @param value
-	 *            the text initial value
-	 * @return the text widget
-	 */
-	public Text createText(Composite parent, String value) {
-		return createText(parent, value, SWT.SINGLE);
-	}
-
-	/**
-	 * Creates a text as a part of the form.
-	 * 
-	 * @param parent
-	 *            the text parent
-	 * @param value
-	 *            the text initial value
-	 * @param style
-	 *            the text style
-	 * @return the text widget
-	 */
-	public Text createText(Composite parent, String value, int style) {
-		Text text = new Text(parent, borderStyle | style | orientation);
-		if (value != null)
-			text.setText(value);
-		text.setForeground(colors.getForeground());
-		text.setBackground(colors.getBackground());
-		text.addFocusListener(visibilityHandler);
-		return text;
-	}
-
-	/**
-	 * Creates a tree widget as a part of the form.
-	 * 
-	 * @param parent
-	 *            the tree parent
-	 * @param style
-	 *            the tree style
-	 * @return the tree widget
-	 */
-	public Tree createTree(Composite parent, int style) {
-		Tree tree = new Tree(parent, borderStyle | style | orientation);
-		adapt(tree, false, false);
-		// hookDeleteListener(tree);
-		return tree;
-	}
-
-	/**
-	 * Creates a scrolled form widget in the provided parent. If you do not
-	 * require scrolling because there is already a scrolled composite up the
-	 * parent chain, use 'createForm' instead.
-	 * 
-	 * @param parent
-	 *            the scrolled form parent
-	 * @return the form that can scroll itself
-	 * @see #createForm
-	 */
-	public ScrolledForm createScrolledForm(Composite parent) {
-		ScrolledForm form = new ScrolledForm(parent, SWT.V_SCROLL
-				| SWT.H_SCROLL | orientation);
-		form.setExpandHorizontal(true);
-		form.setExpandVertical(true);
-		form.setBackground(colors.getBackground());
-		form.setForeground(colors.getColor(IFormColors.TITLE));
-		form.setFont(JFaceResources.getHeaderFont());
-		return form;
-	}
-
-	/**
-	 * Creates a form widget in the provided parent. Note that this widget does
-	 * not scroll its content, so make sure there is a scrolled composite up the
-	 * parent chain. If you require scrolling, use 'createScrolledForm' instead.
-	 * 
-	 * @param parent
-	 *            the form parent
-	 * @return the form that does not scroll
-	 * @see #createScrolledForm
-	 */
-	public Form createForm(Composite parent) {
-		Form formContent = new Form(parent, orientation);
-		formContent.setBackground(colors.getBackground());
-		formContent.setForeground(colors.getColor(IFormColors.TITLE));
-		formContent.setFont(JFaceResources.getHeaderFont());
-		return formContent;
-	}
-
-	/**
-	 * Takes advantage of the gradients and other capabilities to decorate the
-	 * form heading using colors computed based on the current skin and
-	 * operating system.
-	 * 
-	 * @since 3.3
-	 * @param form
-	 *            the form to decorate
-	 */
-
-	public void decorateFormHeading(Form form) {
-		Color top = colors.getColor(IFormColors.H_GRADIENT_END);
-		Color bot = colors.getColor(IFormColors.H_GRADIENT_START);
-		form.setTextBackground(new Color[] { top, bot }, new int[] { 100 },
-				true);
-		form.setHeadColor(IFormColors.H_BOTTOM_KEYLINE1, colors
-				.getColor(IFormColors.H_BOTTOM_KEYLINE1));
-		form.setHeadColor(IFormColors.H_BOTTOM_KEYLINE2, colors
-				.getColor(IFormColors.H_BOTTOM_KEYLINE2));
-		form.setHeadColor(IFormColors.H_HOVER_LIGHT, colors
-				.getColor(IFormColors.H_HOVER_LIGHT));
-		form.setHeadColor(IFormColors.H_HOVER_FULL, colors
-				.getColor(IFormColors.H_HOVER_FULL));
-		form.setHeadColor(IFormColors.TB_TOGGLE, colors
-				.getColor(IFormColors.TB_TOGGLE));
-		form.setHeadColor(IFormColors.TB_TOGGLE_HOVER, colors
-				.getColor(IFormColors.TB_TOGGLE_HOVER));
-		form.setSeparatorVisible(true);
-	}
-
-	/**
-	 * Creates a scrolled page book widget as a part of the form.
-	 * 
-	 * @param parent
-	 *            the page book parent
-	 * @param style
-	 *            the text style
-	 * @return the scrolled page book widget
-	 */
-	public ScrolledPageBook createPageBook(Composite parent, int style) {
-		ScrolledPageBook book = new ScrolledPageBook(parent, style
-				| orientation);
-		adapt(book, true, true);
-		book.setMenu(parent.getMenu());
-		return book;
-	}
-
-	/**
-	 * Disposes the toolkit.
-	 */
-	public void dispose() {
-		if (colors.isShared() == false) {
-			colors.dispose();
-			colors = null;
-		}
-		boldFontHolder.dispose();
-	}
-
-	/**
-	 * Returns the hyperlink group that manages hyperlinks for this toolkit.
-	 * 
-	 * @return the hyperlink group
-	 */
-	public HyperlinkGroup getHyperlinkGroup() {
-		return hyperlinkGroup;
-	}
-
-	/**
-	 * Sets the background color for the entire toolkit. The method delegates
-	 * the call to the FormColors object and also updates the hyperlink group so
-	 * that hyperlinks and other objects are in sync.
-	 * 
-	 * @param bg
-	 *            the new background color
-	 */
-	public void setBackground(Color bg) {
-		hyperlinkGroup.setBackground(bg);
-		colors.setBackground(bg);
-	}
-
-	/**
-	 * Refreshes the hyperlink colors by loading from JFace settings.
-	 */
-	public void refreshHyperlinkColors() {
-		hyperlinkGroup.initializeDefaultForegrounds(colors.getDisplay());
-	}
-
-	/**
-	 * Paints flat borders for widgets created by this toolkit within the
-	 * provided parent. Borders will not be painted if the global border style
-	 * is SWT.BORDER (i.e. if native borders are used). Call this method during
-	 * creation of a form composite to get the borders of its children painted.
-	 * Care should be taken when selection layout margins. At least one pixel
-	 * margin width and height must be chosen to allow the toolkit to paint the
-	 * border on the parent around the widgets.
-	 * <p>
-	 * Borders are painted for some controls that are selected by the toolkit by
-	 * default. If a control needs a border but is not on its list, it is
-	 * possible to force borders in the following ways:
-	 * 
-	 * <pre>
-	 *             widget.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TREE_BORDER);
-	 *             
-	 *             or
-	 *             
-	 *             widget.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
-	 * </pre>
-	 * <p>
-	 * If borders would normally be painted for a control, but they are not wanted, it
-	 * is possible to suppress them in the following way:
-	 * 
-	 * <pre>
-	 *             widget.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.FALSE);
-	 * </pre>
-	 * 
-	 * @param parent
-	 *            the parent that owns the children for which the border needs
-	 *            to be painted.
-	 */
-	public void paintBordersFor(Composite parent) {
-		// if (borderStyle == SWT.BORDER)
-		// return;
-		if (borderPainter == null)
-			borderPainter = new BorderPainter();
-		parent.addPaintListener(borderPainter);
-	}
-
-	/**
-	 * Returns the colors used by this toolkit.
-	 * 
-	 * @return the color object
-	 */
-	public FormColors getColors() {
-		return colors;
-	}
-
-	/**
-	 * Returns the border style used for various widgets created by this
-	 * toolkit. The intent of the toolkit is to create controls with styles that
-	 * yield a 'flat' appearance. On systems where the native borders are
-	 * already flat, we set the style to SWT.BORDER and don't paint the borders
-	 * ourselves. Otherwise, the style is set to SWT.NULL, and borders are
-	 * painted by the toolkit.
-	 * 
-	 * @return the global border style
-	 */
-	public int getBorderStyle() {
-		return borderStyle;
-	}
-
-	/**
-	 * Returns the margin required around the children whose border is being
-	 * painted by the toolkit using {@link #paintBordersFor(Composite)}. Since
-	 * the border is painted around the controls on the parent, a number of
-	 * pixels needs to be reserved for this border. For windowing systems where
-	 * the native border is used, this margin is 0.
-	 * 
-	 * @return the margin in the parent when children have their border painted
-	 * @since 3.3
-	 */
-	public int getBorderMargin() {
-		return getBorderStyle() == SWT.BORDER ? 0 : 2;
-	}
-
-	/**
-	 * Sets the border style to be used when creating widgets. The toolkit
-	 * chooses the correct style based on the platform but this value can be
-	 * changed using this method.
-	 * 
-	 * @param style
-	 *            <code>SWT.BORDER</code> or <code>SWT.NULL</code>
-	 * @see #getBorderStyle
-	 */
-	public void setBorderStyle(int style) {
-		this.borderStyle = style;
-	}
-
-	/**
-	 * A utility method that ensures that the control is visible in the scrolled
-	 * composite. The prerequisite for this method is that the control has a
-	 * class that extends ScrolledComposite somewhere in the parent chain. If
-	 * the control is partially or fully clipped, the composite is scrolled to
-	 * set by setting the origin to the control origin.
-	 * 
-	 * @param c
-	 *            the control to make visible
-	 * @param verticalOnly
-	 *            if <code>true</code>, the scrolled composite will be
-	 *            scrolled only vertically if needed. Otherwise, the scrolled
-	 *            composite origin will be set to the control origin.
-	 * @since 3.1
-	 */
-	public static void setControlVisible(Control c, boolean verticalOnly) {
-		ScrolledComposite scomp = FormUtil.getScrolledComposite(c);
-		if (scomp == null)
-			return;
-		Point location = FormUtil.getControlLocation(scomp, c);
-		scomp.setOrigin(location);
-	}
-
-	private void initialize() {
-		initializeBorderStyle();
-		hyperlinkGroup = new HyperlinkGroup(colors.getDisplay());
-		hyperlinkGroup.setBackground(colors.getBackground());
-		visibilityHandler = new VisibilityHandler();
-		keyboardHandler = new KeyboardHandler();
-		boldFontHolder = new BoldFontHolder();
-	}
-
-	private void initializeBorderStyle() {
-		String osname = System.getProperty("os.name"); //$NON-NLS-1$
-		String osversion = System.getProperty("os.version"); //$NON-NLS-1$
-		if (osname.startsWith("Windows") && "5.1".compareTo(osversion) <= 0) { //$NON-NLS-1$ //$NON-NLS-2$
-			// Skinned widgets used on newer Windows (e.g. XP (5.1), Vista
-			// (6.0))
-			// Check for Windows Classic. If not used, set the style to BORDER
-			RGB rgb = colors.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
-			if (rgb.red != 212 || rgb.green != 208 || rgb.blue != 200)
-				borderStyle = SWT.BORDER;
-		} else if (osname.startsWith("Mac")) //$NON-NLS-1$
-			borderStyle = SWT.BORDER;
-	}
-
-	/**
-	 * Returns the orientation that all the widgets created by this toolkit will
-	 * inherit, if set. Can be <code>SWT.NULL</code>,
-	 * <code>SWT.LEFT_TO_RIGHT</code> and <code>SWT.RIGHT_TO_LEFT</code>.
-	 * 
-	 * @return orientation style for this toolkit, or <code>SWT.NULL</code> if
-	 *         not set. The default orientation is inherited from the Window
-	 *         default orientation.
-	 * @see org.eclipse.jface.window.Window#getDefaultOrientation()
-	 * @since 3.1
-	 */
-
-	public int getOrientation() {
-		return orientation;
-	}
-
-	/**
-	 * Sets the orientation that all the widgets created by this toolkit will
-	 * inherit. Can be <code>SWT.NULL</code>, <code>SWT.LEFT_TO_RIGHT</code>
-	 * and <code>SWT.RIGHT_TO_LEFT</code>.
-	 * 
-	 * @param orientation
-	 *            style for this toolkit.
-	 * @since 3.1
-	 */
-
-	public void setOrientation(int orientation) {
-		this.orientation = orientation;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/Hyperlink.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/Hyperlink.java
deleted file mode 100644
index a75767d..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/Hyperlink.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.FormColors;
-import org.eclipse.ui.internal.forms.widgets.*;
-
-/**
- * Hyperlink is a concrete implementation of the abstract base class that draws
- * text in the client area. Text can be wrapped and underlined. Hyperlink is
- * typically added to the hyperlink group so that certain properties are managed
- * for all the hyperlinks that belong to it.
- * <p>
- * Hyperlink can be extended.
- * <p>
- * <dl>
- * <dt><b>Styles:</b></dt>
- * <dd>SWT.WRAP</dd>
- * </dl>
- * 
- * @see org.eclipse.ui.forms.HyperlinkGroup
- * @since 3.0
- */
-public class Hyperlink extends AbstractHyperlink {
-	private String text;
-	private static final String ELLIPSIS = "..."; //$NON-NLS-1$	
-	private boolean underlined;
-	// The tooltip is used for two purposes - the application can set
-	// a tooltip or the tooltip can be used to display the full text when the
-	// the text has been truncated due to the label being too short.
-	// The appToolTip stores the tooltip set by the application.  Control.tooltiptext 
-	// contains whatever tooltip is currently being displayed.
-	private String appToolTipText;	
-
-	/**
-	 * Creates a new hyperlink control in the provided parent.
-	 * 
-	 * @param parent
-	 *            the control parent
-	 * @param style
-	 *            the widget style
-	 */
-	public Hyperlink(Composite parent, int style) {
-		super(parent, style);
-		initAccessible();
-	}
-
-	protected void initAccessible() {
-		Accessible accessible = getAccessible();
-		accessible.addAccessibleListener(new AccessibleAdapter() {
-			public void getName(AccessibleEvent e) {
-				e.result = getText();
-				if (e.result == null)
-					getHelp(e);
-			}
-
-			public void getHelp(AccessibleEvent e) {
-				e.result = getToolTipText();
-			}
-		});
-		accessible.addAccessibleControlListener(new AccessibleControlAdapter() {
-			public void getChildAtPoint(AccessibleControlEvent e) {
-				Point pt = toControl(new Point(e.x, e.y));
-				e.childID = (getBounds().contains(pt)) ? ACC.CHILDID_SELF
-						: ACC.CHILDID_NONE;
-			}
-
-			public void getLocation(AccessibleControlEvent e) {
-				Rectangle location = getBounds();
-				Point pt = toDisplay(new Point(location.x, location.y));
-				e.x = pt.x;
-				e.y = pt.y;
-				e.width = location.width;
-				e.height = location.height;
-			}
-
-			public void getChildCount(AccessibleControlEvent e) {
-				e.detail = 0;
-			}
-
-			public void getRole(AccessibleControlEvent e) {
-				e.detail = ACC.ROLE_LINK;
-			}
-						
-			public void getDefaultAction (AccessibleControlEvent e) {
-				e.result = SWT.getMessage ("SWT_Press"); //$NON-NLS-1$
-			}
-
-			public void getState(AccessibleControlEvent e) {
-				int state = ACC.STATE_NORMAL;
-				if (Hyperlink.this.getSelection())
-					state = ACC.STATE_SELECTED | ACC.STATE_FOCUSED;
-				e.detail = state;
-			}
-		});
-	}
-
-	/**
-	 * Sets the underlined state. It is not necessary to call this method when
-	 * in a hyperlink group.
-	 * 
-	 * @param underlined
-	 *            if <samp>true </samp>, a line will be drawn below the text for
-	 *            each wrapped line.
-	 */
-	public void setUnderlined(boolean underlined) {
-		this.underlined = underlined;
-		redraw();
-	}
-
-	/**
-	 * Returns the underline state of the hyperlink.
-	 * 
-	 * @return <samp>true </samp> if text is underlined, <samp>false </samp>
-	 *         otherwise.
-	 */
-	public boolean isUnderlined() {
-		return underlined;
-	}
-
-	/**
-	 * Overrides the parent by incorporating the margin.
-	 */
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		checkWidget();
-		int innerWidth = wHint;
-		if (innerWidth != SWT.DEFAULT)
-			innerWidth -= marginWidth * 2;
-		Point textSize = computeTextSize(innerWidth, hHint);
-		int textWidth = textSize.x + 2 * marginWidth;
-		int textHeight = textSize.y + 2 * marginHeight;
-		return new Point(textWidth, textHeight);
-	}
-
-	/**
-	 * Returns the current hyperlink text.
-	 * 
-	 * @return hyperlink text
-	 */
-	public String getText() {
-		return text;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Control#getToolTipText()
-	 */
-	public String getToolTipText () {
-		checkWidget();
-		return appToolTipText;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Control#setToolTipText(java.lang.String)
-	 */
-	public void setToolTipText (String string) {
-		super.setToolTipText (string);
-		appToolTipText = super.getToolTipText();
-	}	
-
-	/**
-	 * Sets the text of this hyperlink.
-	 * 
-	 * @param text
-	 *            the hyperlink text
-	 */
-	public void setText(String text) {
-		if (text != null)
-			this.text = text;
-		else
-			this.text = ""; //$NON-NLS-1$
-		redraw();
-	}
-
-	/**
-	 * Paints the hyperlink text.
-	 * 
-	 * @param gc
-	 *            graphic context
-	 */
-	protected void paintHyperlink(GC gc) {
-		Rectangle carea = getClientArea();
-		Rectangle bounds = new Rectangle(marginWidth, marginHeight, carea.width
-				- marginWidth - marginWidth, carea.height - marginHeight
-				- marginHeight);
-		paintText(gc, bounds);
-	}
-
-	/**
-	 * Paints the hyperlink text in provided bounding rectangle.
-	 * 
-	 * @param gc
-	 *            graphic context
-	 * @param bounds
-	 *            the bounding rectangle in which to paint the text
-	 */
-	protected void paintText(GC gc, Rectangle bounds) {
-		gc.setFont(getFont());
-		Color fg = isEnabled() ? getForeground() : new Color(gc.getDevice(),FormColors.blend(getBackground().getRGB(), getForeground().getRGB(), 70));
-		try {
-			gc.setForeground(fg);
-			if ((getStyle() & SWT.WRAP) != 0) {
-				FormUtil.paintWrapText(gc, text, bounds, underlined);
-			} else {
-				Point totalSize = computeTextSize(SWT.DEFAULT, SWT.DEFAULT);
-				boolean shortenText =false;
-				if (bounds.width<totalSize.x) {
-					// shorten
-					shortenText=true;
-				}
-				int textWidth = Math.min(bounds.width, totalSize.x);
-				int textHeight = totalSize.y;
-				String textToDraw = getText();
-				if (shortenText) {
-					textToDraw = shortenText(gc, getText(), bounds.width);
-					if (appToolTipText == null) {
-						super.setToolTipText(getText());
-					}
-				}
-				else {
-					super.setToolTipText(appToolTipText);
-				}
-				gc.drawText(textToDraw, bounds.x, bounds.y, true);
-				if (underlined) {
-					int descent = gc.getFontMetrics().getDescent();
-					int lineY = bounds.y + textHeight - descent + 1;
-					gc.drawLine(bounds.x, lineY, bounds.x + textWidth, lineY);
-				}
-			}
-		} finally {
-			if (!isEnabled() && fg != null)
-				fg.dispose();
-		}
-	}
-	
-	protected String shortenText(GC gc, String t, int width) {
-		if (t == null) return null;
-		int w = gc.textExtent(ELLIPSIS).x;
-		if (width<=w) return t;
-		int l = t.length();
-		int max = l/2;
-		int min = 0;
-		int mid = (max+min)/2 - 1;
-		if (mid <= 0) return t;
-		while (min < mid && mid < max) {
-			String s1 = t.substring(0, mid);
-			String s2 = t.substring(l-mid, l);
-			int l1 = gc.textExtent(s1).x;
-			int l2 = gc.textExtent(s2).x;
-			if (l1+w+l2 > width) {
-				max = mid;			
-				mid = (max+min)/2;
-			} else if (l1+w+l2 < width) {
-				min = mid;
-				mid = (max+min)/2;
-			} else {
-				min = max;
-			}
-		}
-		if (mid == 0) return t;
-	 	return t.substring(0, mid)+ELLIPSIS+t.substring(l-mid, l);
-	}
-
-	protected Point computeTextSize(int wHint, int hHint) {
-		Point extent;
-		GC gc = new GC(this);
-		gc.setFont(getFont());
-		if ((getStyle() & SWT.WRAP) != 0 && wHint != SWT.DEFAULT) {
-			extent = FormUtil.computeWrapSize(gc, getText(), wHint);
-		} else {
-			extent = gc.textExtent(getText());
-			if ((getStyle() & SWT.WRAP)==0 && wHint!=SWT.DEFAULT)
-				extent.x = wHint;
-		}
-		gc.dispose();
-		return extent;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ILayoutExtension.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ILayoutExtension.java
deleted file mode 100644
index 237dd1c..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ILayoutExtension.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-import org.eclipse.swt.widgets.Composite;
-/**
- * Classes that extend abstract class Layout and implement this interface can
- * take part in layout computation of the TableWrapLayout manager. This layout
- * uses alternative algorithm that computes columns before rows. It allows it
- * to 'flow' wrapped text proportionally (similar to the way web browser
- * renders tables). Custom layout managers that implement this interface will
- * allow TableWrapLayout to properly compute width hint to pass.
- * 
- * @see TableWrapLayout
- * @see ColumnLayout
- * @since 3.0
- */
-public interface ILayoutExtension {
-	/**
-	 * Computes the minimum width of the parent. All widgets capable of word
-	 * wrapping should return the width of the longest word that cannot be
-	 * broken any further.
-	 * 
-	 * @param parent the parent composite
-	 * @param changed <code>true</code> if the cached information should be
-	 * flushed, <code>false</code> otherwise.
-	 * @return the minimum width of the parent composite
-	 */
-	public int computeMinimumWidth(Composite parent, boolean changed);
-	/**
-	 * Computes the maximum width of the parent. All widgets capable of word
-	 * wrapping should return the length of the entire text with wrapping
-	 * turned off.
-	 * 
-	 * @param parent the parent composite
-	 * @param changed <code>true</code> if the cached information
-	 * should be flushed, <code>false</code> otherwise.
-	 * @return the maximum width of the parent composite
-	 */
-	public int computeMaximumWidth(Composite parent, boolean changed);
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ImageHyperlink.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ImageHyperlink.java
deleted file mode 100644
index e526db8..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ImageHyperlink.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Chriss Gross (schtoo@schtoo.com) - fix for 61670
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-
-/**
- * This class extends hyperlink widget by adding the capability to render an
- * image relative to the text. If no text has been set, only image will be
- * shown. Images for hover and active states can be set in addition to the
- * normal state image.
- * <p>
- * When image is taller than the text, additional style can be provided to
- * control vertical alignment (supported values are SWT.TOP, SWT.BOTTOM and
- * SWT.CENTER).
- * <p>
- * The class does not need to be sublassed but it is allowed to do so if some
- * aspect of the image hyperlink needs to be modified.
- * <p>
- * <dl>
- * <dt><b>Styles:</b></dt>
- * <dd>SWT.WRAP, SWT.BOTTOM, SWT.TOP, SWT.MIDDLE, SWT.LEFT, SWT.RIGHT</dd>
- * </dl>
- * 
- * @since 3.0
- */
-public class ImageHyperlink extends Hyperlink {
-	/**
-	 * Amount of pixels between the image and the text (default is 5).
-	 */
-	public int textSpacing = 5;
-
-	private Image image;
-
-	private Image hoverImage;
-
-	private Image activeImage;
-	
-	private Image disabledImage;
-
-	private int state;
-
-	private static final int HOVER = 1 << 1;
-
-	private static final int ACTIVE = 1 << 2;
-
-	private int verticalAlignment = SWT.CENTER;
-
-	private int horizontalAlignment = SWT.LEFT;
-
-	/**
-	 * Creates the image hyperlink instance.
-	 * 
-	 * @param parent
-	 *            the control parent
-	 * @param style
-	 *            the control style (SWT.WRAP, BOTTOM, TOP, MIDDLE, LEFT, RIGHT)
-	 */
-	public ImageHyperlink(Composite parent, int style) {
-		super(parent, removeAlignment(style));
-		extractAlignment(style);
-		addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				if (disabledImage != null)
-					disabledImage.dispose();
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.widgets.AbstractHyperlink#paintHyperlink(org.eclipse.swt.events.PaintEvent)
-	 */
-	protected void paintHyperlink(GC gc) {
-		paintHyperlink(gc, getClientArea());
-	}
-	
-	protected void paintHyperlink(GC gc, Rectangle bounds) {
-		Image image = null;
-		if (!isEnabled())
-			image = disabledImage;
-		else {
-			if ((state & ACTIVE) != 0)
-				image = activeImage;
-			else if ((state & HOVER) != 0)
-				image = hoverImage;
-			if (image == null)
-				image = this.image;
-		}
-		Rectangle ibounds = image != null ? image.getBounds() : new Rectangle(0, 0, 0, 0);
-		Point maxsize = computeMaxImageSize();
-		int spacing = image!=null?textSpacing:0;		
-		int textWidth = bounds.width - maxsize.x - spacing
-				- marginWidth - marginWidth;
-		int y = bounds.y+marginHeight + maxsize.y / 2 - ibounds.height / 2;
-
-		if (horizontalAlignment == SWT.LEFT) {
-			int x = bounds.x+marginWidth + maxsize.x / 2 - ibounds.width / 2;
-			int textX = bounds.x + marginWidth + maxsize.x + spacing;
-			if (image != null)
-				gc.drawImage(image, x, y);
-			if (getText() != null)
-				drawText(gc, bounds, textX, textWidth);
-		} else if (horizontalAlignment == SWT.RIGHT) {
-			int x = bounds.x+marginWidth;
-			if (getText() != null) {
-				x += drawText(gc, bounds, x, textWidth);
-			}
-			x += maxsize.x / 2 - ibounds.width / 2 + spacing;
-			if (image != null)
-				gc.drawImage(image, x, y);
-		}
-	}
-
-	private int drawText(GC gc, Rectangle clientArea, int textX, int textWidth) {
-		Point textSize = computeTextSize(textWidth, SWT.DEFAULT);
-		int slotHeight = clientArea.height - marginHeight - marginHeight;
-		int textY;
-		textWidth = textSize.x;
-		int textHeight = textSize.y;
-		if (verticalAlignment == SWT.BOTTOM) {
-			textY = marginHeight + slotHeight - textHeight;
-		} else if (verticalAlignment == SWT.CENTER) {
-			textY = marginHeight + slotHeight / 2 - textHeight / 2;
-		} else {
-			textY = marginHeight;
-		}
-		paintText(gc, new Rectangle(textX, textY, textWidth, textHeight));
-		return textWidth;
-	}
-
-	/**
-	 * Computes the control size by reserving space for images in addition to
-	 * text.
-	 * 
-	 * @param wHint
-	 *            width hint
-	 * @param hHint
-	 *            height hint
-	 * @param changed
-	 *            if <code>true</code>, any cached layout data should be
-	 *            computed anew
-	 */
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		checkWidget();
-		Point isize = computeMaxImageSize();
-		int spacing = isize.x>0?textSpacing:0;
-		Point textSize = null;
-		if (getText() != null) {
-			int innerWHint = wHint;
-			if (wHint != SWT.DEFAULT) {
-				innerWHint = wHint - 2 * marginWidth - isize.x - spacing;
-			}
-			textSize = super.computeSize(innerWHint, hHint, changed);
-		}
-		int width = isize.x;
-		int height = isize.y;
-		if (textSize != null) {
-			width += spacing;
-			width += textSize.x;
-			height = Math.max(height, textSize.y);
-		}
-		width += 2 * marginWidth;
-		height += 2 * marginHeight;
-		return new Point(width, height);
-	}
-
-	protected void handleEnter(Event e) {
-		state = HOVER;
-		super.handleEnter(e);
-	}
-
-	protected void handleExit(Event e) {
-		state = 0;
-		super.handleExit(e);
-	}
-
-	protected void handleActivate(Event e) {
-		state &= ACTIVE;
-		redraw();
-		super.handleActivate(e);
-		state &= ~ACTIVE;
-		if (!isDisposed())
-			redraw();
-	}
-
-	/**
-	 * Returns active image.
-	 * 
-	 * @return active image or <code>null</code> if not set.
-	 */
-	public Image getActiveImage() {
-		return activeImage;
-	}
-
-	/**
-	 * Sets the image to show when link is activated.
-	 * 
-	 * @param activeImage
-	 * 
-	 */
-	public void setActiveImage(Image activeImage) {
-		this.activeImage = activeImage;
-	}
-
-	/**
-	 * Returns the hover image.
-	 * 
-	 * @return hover image or <code>null</code> if not set.
-	 */
-	public Image getHoverImage() {
-		return hoverImage;
-	}
-
-	/**
-	 * Sets the image to show when link is hover state (on mouse over).
-	 * 
-	 * @param hoverImage
-	 */
-	public void setHoverImage(Image hoverImage) {
-		this.hoverImage = hoverImage;
-	}
-
-	/**
-	 * Returns the image to show in the normal state.
-	 * 
-	 * @return normal image or <code>null</code> if not set.
-	 */
-	public Image getImage() {
-		return image;
-	}
-
-	/**
-	 * Sets the image to show when link is in the normal state.
-	 * 
-	 * @param image
-	 */
-	public void setImage(Image image) {
-		this.image = image;
-		if (disabledImage != null)
-			disabledImage.dispose();
-		if (!isEnabled() && image != null && !image.isDisposed())
-			disabledImage = new Image(image.getDevice(), image, SWT.IMAGE_DISABLE);
-	}
-
-	private Point computeMaxImageSize() {
-		int x = 0;
-		int y = 0;
-		if (image != null) {
-			x = Math.max(image.getBounds().width, x);
-			y = Math.max(image.getBounds().height, y);
-		}
-		if (hoverImage != null) {
-			x = Math.max(hoverImage.getBounds().width, x);
-			y = Math.max(hoverImage.getBounds().height, y);
-		}
-		if (activeImage != null) {
-			x = Math.max(activeImage.getBounds().width, x);
-			y = Math.max(activeImage.getBounds().height, y);
-		}
-		return new Point(x, y);
-	}
-
-	private static int removeAlignment(int style) {
-		int resultStyle = style;
-		if ((style & SWT.CENTER) != 0) {
-			resultStyle &= (~SWT.CENTER);
-		}
-		if ((style & SWT.TOP) != 0) {
-			resultStyle &= (~SWT.TOP);
-		}
-		if ((style & SWT.BOTTOM) != 0) {
-			resultStyle &= (~SWT.BOTTOM);
-		}
-		if ((style & SWT.LEFT) != 0) {
-			resultStyle &= (~SWT.LEFT);
-		}
-		if ((style & SWT.RIGHT) != 0) {
-			resultStyle &= (~SWT.RIGHT);
-		}
-		return resultStyle;
-	}
-
-	private void extractAlignment(int style) {
-		if ((style & SWT.CENTER) != 0) {
-			verticalAlignment = SWT.CENTER;
-		} else if ((style & SWT.TOP) != 0) {
-			verticalAlignment = SWT.TOP;
-		} else if ((style & SWT.BOTTOM) != 0) {
-			verticalAlignment = SWT.BOTTOM;
-		}
-		if ((style & SWT.LEFT) != 0) {
-			horizontalAlignment = SWT.LEFT;
-		} else if ((style & SWT.RIGHT) != 0) {
-			horizontalAlignment = SWT.RIGHT;
-		}
-	}
-	
-	public void setEnabled(boolean enabled) {
-		if (!enabled && (disabledImage == null || disabledImage.isDisposed()) && image != null && !image.isDisposed()) {
-			disabledImage = new Image(image.getDevice(), image, SWT.IMAGE_DISABLE);
-		}
-		super.setEnabled(enabled);
-		if (enabled && disabledImage != null) {
-			disabledImage.dispose();
-			disabledImage = null;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/LayoutCache.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/LayoutCache.java
deleted file mode 100644
index 7421a70..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/LayoutCache.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * Caches the preferred sizes of an array of controls
- * 
- * @since 3.0
- */
-public class LayoutCache {
-    private SizeCache[] caches = new SizeCache[0];
-
-    /**
-     * Creates an empty layout cache
-     */
-    public LayoutCache() {
-    }
-
-    /**
-     * Creates a cache for the given array of controls
-     * 
-     * @param controls
-     */
-    public LayoutCache(Control[] controls) {
-        rebuildCache(controls);
-    }
-
-    /**
-     * Returns the size cache for the given control
-     * 
-     * @param idx
-     * @return the size cache for the given control
-     */
-    public SizeCache getCache(int idx) {
-        return caches[idx];
-    }
-
-    /**
-     * Sets the controls that are being cached here. If these are the same
-     * controls that were used last time, this method does nothing. Otherwise,
-     * the cache is flushed and a new cache is created for the new controls.
-     * 
-     * @param controls
-     */
-    public void setControls(Control[] controls) {
-        // If the number of controls has changed, discard the entire cache
-        if (controls.length != caches.length) {
-            rebuildCache(controls);
-            return;
-        }
-
-        for (int idx = 0; idx < controls.length; idx++) {
-            caches[idx].setControl(controls[idx]);
-        }
-    }
-
-    /**
-     * Creates a new size cache for the given set of controls, discarding any
-     * existing cache.
-     * 
-     * @param controls the controls whose size is being cached
-     */
-    private void rebuildCache(Control[] controls) {
-        SizeCache[] newCache = new SizeCache[controls.length];
-
-        for (int idx = 0; idx < controls.length; idx++) {
-            // Try to reuse existing caches if possible
-            if (idx < caches.length) {
-                newCache[idx] = caches[idx];
-                newCache[idx].setControl(controls[idx]);
-            } else {
-                newCache[idx] = new SizeCache(controls[idx]);
-            }
-        }
-
-        caches = newCache;
-    }
-
-    /**
-     * Computes the preferred size of the nth control
-     * 
-     * @param controlIndex index of the control whose size will be computed
-     * @param widthHint width of the control (or SWT.DEFAULT if unknown)
-     * @param heightHint height of the control (or SWT.DEFAULT if unknown)
-     * @return the preferred size of the control
-     */
-    public Point computeSize(int controlIndex, int widthHint, int heightHint) {
-        return caches[controlIndex].computeSize(widthHint, heightHint);
-    }
-
-    /**
-     * Flushes the cache for the given control. This should be called if exactly
-     * one of the controls has changed but the remaining controls remain unmodified
-     * 
-     * @param controlIndex
-     */
-    public void flush(int controlIndex) {
-        caches[controlIndex].flush();
-    }
-
-    /**
-     * Flushes the cache.
-     */
-    public void flush() {
-        for (int idx = 0; idx < caches.length; idx++) {
-            caches[idx].flush();
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/LayoutComposite.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/LayoutComposite.java
deleted file mode 100644
index b51cca8..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/LayoutComposite.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.*;
-/**
- * The class overrides default method for computing size in Composite by
- * accepting size returned from layout managers as-is. The default code accepts
- * width or height hint assuming it is correct. However, it is possible that
- * the computation using the provided width hint results in a real size that is
- * larger. This can result in wrapped text widgets being clipped, asking to
- * render in bounds narrower than the longest word.
- */
-/* package */class LayoutComposite extends Composite {
-	public LayoutComposite(Composite parent, int style) {
-		super(parent, style);
-		setMenu(parent.getMenu());
-	}
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		Layout layout = getLayout();
-		if (layout instanceof TableWrapLayout)
-			return ((TableWrapLayout) layout).computeSize(this, wHint, hHint,
-					changed);
-		if (layout instanceof ColumnLayout)
-			return ((ColumnLayout) layout).computeSize(this, wHint, hHint,
-					changed);
-		return super.computeSize(wHint, hHint, changed);
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ScrolledForm.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ScrolledForm.java
deleted file mode 100644
index a83221f..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ScrolledForm.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.forms.IMessage;
-import org.eclipse.ui.forms.IMessageManager;
-
-/**
- * ScrolledForm is a control that is capable of scrolling an instance of the
- * Form class. It should be created in a parent that will allow it to use all
- * the available area (for example, a shell, a view or an editor).
- * <p>
- * Children of the form should typically be created using FormToolkit to match
- * the appearance and behaviour. When creating children, use a form body as a
- * parent by calling 'getBody()' on the form instance. Example:
- * 
- * <pre>
- * FormToolkit toolkit = new FormToolkit(parent.getDisplay());
- * ScrolledForm form = toolkit.createScrolledForm(parent);
- * form.setText(&quot;Sample form&quot;);
- * form.getBody().setLayout(new GridLayout());
- * toolkit.createButton(form.getBody(), &quot;Checkbox&quot;, SWT.CHECK);
- * </pre>
- * 
- * <p>
- * No layout manager has been set on the body. Clients are required to set the
- * desired layout manager explicitly.
- * <p>
- * Although the class is not final, it is not expected to be be extended.
- * 
- * @since 3.0
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ScrolledForm extends SharedScrolledComposite {
-	private Form content;
-
-	private boolean customMenu;
-
-	public ScrolledForm(Composite parent) {
-		this(parent, SWT.V_SCROLL | SWT.H_SCROLL);
-	}
-
-	/**
-	 * Creates the form control as a child of the provided parent.
-	 * 
-	 * @param parent
-	 *            the parent widget
-	 */
-	public ScrolledForm(Composite parent, int style) {
-		super(parent, style);
-		super.setMenu(parent.getMenu());
-		content = new Form(this, SWT.NULL);
-		super.setContent(content);
-		content.setMenu(getMenu());
-		addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				if (!customMenu)
-					setMenu(null);
-			}
-		});
-	}
-
-	/**
-	 * Passes the menu to the body.
-	 * 
-	 * @param menu
-	 */
-	public void setMenu(Menu menu) {
-		customMenu = true;
-		super.setMenu(menu);
-		if (content != null)
-			content.setMenu(menu);
-	}
-
-	/**
-	 * Returns the title text that will be rendered at the top of the form.
-	 * 
-	 * @return the title text
-	 */
-	public String getText() {
-		return content.getText();
-	}
-
-	/**
-	 * Returns the title image that will be rendered to the left of the title.
-	 * 
-	 * @return the title image
-	 */
-	public Image getImage() {
-		return content.getImage();
-	}
-
-	/**
-	 * Sets the foreground color of the form. This color will also be used for
-	 * the body.
-	 */
-	public void setForeground(Color fg) {
-		super.setForeground(fg);
-		content.setForeground(fg);
-	}
-
-	/**
-	 * Sets the background color of the form. This color will also be used for
-	 * the body.
-	 */
-	public void setBackground(Color bg) {
-		super.setBackground(bg);
-		content.setBackground(bg);
-	}
-
-	/**
-	 * The form sets the content widget. This method should not be called by
-	 * classes that instantiate this widget.
-	 */
-	public final void setContent(Control c) {
-	}
-
-	/**
-	 * Sets the text to be rendered at the top of the form above the body as a
-	 * title.
-	 * <p>
-	 * <strong>Note:</strong> Mnemonics are indicated by an '&amp;' that causes
-	 * the next character to be the mnemonic. Mnemonics are not applicable in
-	 * the case of the form title but need to be taken into acount due to the
-	 * usage of the underlying widget that renders mnemonics in the title area.
-	 * The mnemonic indicator character '&amp;' can be escaped by doubling it in
-	 * the string, causing a single '&amp;' to be displayed.
-	 * </p>
-	 * 
-	 * @param text
-	 *            the title text
-	 */
-	public void setText(String text) {
-		content.setText(text);
-		reflow(true);
-	}
-
-	/**
-	 * Sets the image to be rendered to the left of the title.
-	 * 
-	 * @param image
-	 *            the title image or <code>null</code> for no image.
-	 */
-	public void setImage(Image image) {
-		content.setImage(image);
-		reflow(true);
-	}
-
-	/**
-	 * Returns the optional background image of this form. The image is rendered
-	 * starting at the position 0,0 and is painted behind the title.
-	 * 
-	 * @return Returns the background image.
-	 */
-	public Image getBackgroundImage() {
-		return content.getBackgroundImage();
-	}
-
-	/**
-	 * Sets the optional background image to be rendered behind the title
-	 * starting at the position 0,0.
-	 * 
-	 * @param backgroundImage
-	 *            The backgroundImage to set.
-	 */
-	public void setBackgroundImage(Image backgroundImage) {
-		content.setBackgroundImage(backgroundImage);
-	}
-
-	/**
-	 * Returns the tool bar manager that is used to manage tool items in the
-	 * form's title area.
-	 * 
-	 * @return form tool bar manager
-	 */
-	public IToolBarManager getToolBarManager() {
-		return content.getToolBarManager();
-	}
-
-	/**
-	 * Updates the local tool bar manager if used. Does nothing if local tool
-	 * bar manager has not been created yet.
-	 */
-	public void updateToolBar() {
-		content.updateToolBar();
-	}
-
-	/**
-	 * Returns the container that occupies the body of the form (the form area
-	 * below the title). Use this container as a parent for the controls that
-	 * should be in the form. No layout manager has been set on the form body.
-	 * 
-	 * @return Returns the body of the form.
-	 */
-	public Composite getBody() {
-		return content.getBody();
-	}
-
-	/**
-	 * Returns the instance of the form owned by the scrolled form.
-	 * 
-	 * @return the form instance
-	 */
-	public Form getForm() {
-		return content;
-	}
-
-	/**
-	 * Sets the form's busy state. Busy form will display 'busy' animation in
-	 * the area of the title image.
-	 * 
-	 * @param busy
-	 *            the form's busy state
-	 * @see Form#setBusy(boolean)
-	 * @since 3.3
-	 */
-
-	public void setBusy(boolean busy) {
-		content.setBusy(busy);
-		reflow(true);
-	}
-
-	/**
-	 * Sets the optional head client.
-	 * 
-	 * @param headClient
-	 *            the optional child of the head
-	 * @see Form#setHeadClient(Control)
-	 * @since 3.3
-	 */
-	public void setHeadClient(Control headClient) {
-		content.setHeadClient(headClient);
-		reflow(true);
-	}
-
-	/**
-	 * Sets the form message.
-	 * 
-	 * @param newMessage
-	 *            the message text or <code>null</code> to reset.
-	 * @param newType
-	 *            as defined in
-	 *            {@link org.eclipse.jface.dialogs.IMessageProvider}.
-	 * @param messages
-	 * 			 an optional array of children that itemize individual
-	 * 			messages or <code>null</code> for a simple message.
-	 * @since 3.3
-	 * @see Form#setMessage(String, int)
-	 */
-	public void setMessage(String newMessage, int newType, IMessage[] messages) {
-		content.setMessage(newMessage, newType, messages);
-		reflow(true);
-	}
-
-	/**
-	 * Sets the form message.
-	 * 
-	 * @param newMessage
-	 *            the message text or <code>null</code> to reset.
-	 * @param newType
-	 *            as defined in
-	 *            {@link org.eclipse.jface.dialogs.IMessageProvider}.
-	 * @since 3.3
-	 */
-	public void setMessage(String newMessage, int newType) {
-		this.setMessage(newMessage, newType, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IMessageProvider#getMessage()
-	 */
-	public String getMessage() {
-		return content.getMessage();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IMessageProvider#getMessageType()
-	 */
-	public int getMessageType() {
-		return content.getMessageType();
-	}
-	
-	/**
-	 * Returns the message manager that will keep track of messages in this
-	 * form. 
-	 * 
-	 * @return the message manager instance
-	 * @since org.eclipse.ui.forms 3.4
-	 */
-	public IMessageManager getMessageManager() {
-		return content.getMessageManager();
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ScrolledFormText.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ScrolledFormText.java
deleted file mode 100644
index 78e053e..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ScrolledFormText.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-import java.io.InputStream;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.*;
-/**
- * ScrolledFormText is a control that is capable of scrolling an instance of
- * the FormText class. It should be created in a parent that will allow it to
- * use all the available area (for example, a shell, a view or an editor). The
- * form text can be created by the class itself, or set from outside. In the
- * later case, the form text instance must be a direct child of the
- * ScrolledFormText instance.
- * <p>
- * The class assumes that text to be rendered contains formatting tags. In case
- * of a string, it will enclose the text in 'form' root element if missing from
- * the text as a convinience. For example:
- * 
- * <pre>
- *  ftext.setText(&quot;&lt;p&gt;Some text here&lt;/&gt;&quot;);
- * </pre>
- * 
- * will not cause an error. The same behavior does not exist for content from
- * the input stream, however - it must be well formed in that case.
- * </p>
-
- * @since 3.0
- * @see FormText
- */
-public class ScrolledFormText extends SharedScrolledComposite {
-	private FormText content;
-	private String text;
-	/**
-	 * Creates the new scrolled text instance in the provided parent
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param createFormText
-	 *            if <code>true</code>, enclosing form text instance will be
-	 *            created in this constructor.
-	 */
-	public ScrolledFormText(Composite parent, boolean createFormText) {
-		this(parent, SWT.V_SCROLL | SWT.H_SCROLL, createFormText);
-	}
-	/**
-	 * Creates the new scrolled text instance in the provided parent
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param style
-	 *            the style to pass to the scrolled composite
-	 * @param createFormText
-	 *            if <code>true</code>, enclosing form text instance will be
-	 *            created in this constructor.
-	 */
-	public ScrolledFormText(Composite parent, int style, boolean createFormText) {
-		super(parent, style);
-		if (createFormText)
-			setFormText(new FormText(this, SWT.NULL));
-	}
-	/**
-	 * Sets the form text to be managed by this scrolled form text. The
-	 * instance must be a direct child of this class. If this method is used,
-	 * <code>false</code> must be passed in either of the constructors to
-	 * avoid creating form text instance.
-	 * 
-	 * @param formText
-	 *            the form text instance to use.
-	 */
-	public void setFormText(FormText formText) {
-		this.content = formText;
-		super.setContent(content);
-		content.setMenu(getMenu());
-		if (text != null)
-			loadText(text);
-	}
-	/**
-	 * Sets the foreground color of the scrolled form text.
-	 * 
-	 * @param fg
-	 *            the foreground color
-	 */
-	public void setForeground(Color fg) {
-		super.setForeground(fg);
-		if (content != null)
-			content.setForeground(fg);
-	}
-	/**
-	 * Sets the background color of the scrolled form text.
-	 * 
-	 * @param bg
-	 *            the background color
-	 */
-	public void setBackground(Color bg) {
-		super.setBackground(bg);
-		if (content != null)
-			content.setBackground(bg);
-	}
-	/**
-	 * The class sets the content widget. This method should not be called by
-	 * classes that instantiate this widget.
-	 * 
-	 * @param c
-	 *            content control
-	 */
-	public final void setContent(Control c) {
-	}
-	/**
-	 * Sets the text to be rendered in the scrolled form text. The text must
-	 * contain formatting tags.
-	 * 
-	 * @param text
-	 *            the text to be rendered
-	 */
-	public void setText(String text) {
-		this.text = text;
-		loadText(text);
-		reflow(true);
-	}
-	/**
-	 * Sets the contents to rendered in the scrolled form text. The stream must
-	 * contain formatting tags. The caller is responsible for closing the input
-	 * stream. The call may be long running. For best results, call this method
-	 * from another thread and call 'reflow' when done (but make both calls
-	 * using 'Display.asyncExec' because these calls must be made in the event
-	 * dispatching thread).
-	 * 
-	 * @param is
-	 *            content input stream
-	 */
-	public void setContents(InputStream is) {
-		loadContents(is);
-	}
-	/**
-	 * Returns the instance of the form text.
-	 * 
-	 * @return the form text instance
-	 */
-	public FormText getFormText() {
-		return content;
-	}
-	private void loadText(String text) {
-		if (content != null) {
-			String markup = text;
-			if (!markup.startsWith("<form>")) //$NON-NLS-1$
-				markup = "<form>" + text + "</form>";  //$NON-NLS-1$//$NON-NLS-2$
-			content.setText(markup, true, false);
-		}
-	}
-	private void loadContents(InputStream is) {
-		if (content != null) {
-			content.setContents(is, false);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ScrolledPageBook.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ScrolledPageBook.java
deleted file mode 100644
index f6ffe96..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ScrolledPageBook.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-import java.util.Hashtable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.internal.forms.widgets.WrappedPageBook;
-/**
- * ScrolledPageBook is a class that is capable of stacking several composites
- * (pages), while showing one at a time. The content is scrolled if there is
- * not enough space to fit it in the client area.
- * 
- * @since 3.0
- */
-public class ScrolledPageBook extends SharedScrolledComposite {
-	private WrappedPageBook pageBook;
-	private Hashtable pages;
-	private Composite emptyPage;
-	private Control currentPage;
-	/**
-	 * Creates a new instance in the provided parent
-	 * 
-	 * @param parent
-	 */
-	public ScrolledPageBook(Composite parent) {
-		this(parent, SWT.H_SCROLL | SWT.V_SCROLL);
-	}
-	/**
-	 * Creates a new instance in the provided parent and with the provided
-	 * style.
-	 * 
-	 * @param parent
-	 *            the control parent
-	 * @param style
-	 *            the style to use
-	 */
-	public ScrolledPageBook(Composite parent, int style) {
-		super(parent, style);
-		pageBook = new WrappedPageBook(this, SWT.NULL);
-		setContent(pageBook);
-		pages = new Hashtable();
-		setExpandHorizontal(true);
-		setExpandVertical(true);
-		this.addListener(SWT.Traverse, new Listener() {
-			public void handleEvent(Event e) {
-				switch (e.detail) {
-					case SWT.TRAVERSE_ESCAPE :
-					case SWT.TRAVERSE_RETURN :
-					case SWT.TRAVERSE_TAB_NEXT :
-					case SWT.TRAVERSE_TAB_PREVIOUS :
-						e.doit = true;
-						break;
-				}
-			}
-		});
-	}
-	/**
-	 * Removes the default size of the composite, allowing the control to
-	 * shrink to the trim.
-	 * 
-	 * @param wHint
-	 *            the width hint
-	 * @param hHint
-	 *            the height hint
-	 * @param changed
-	 *            if <code>true</code>, do not use cached values
-	 */
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		Rectangle trim = computeTrim(0, 0, 10, 10);
-		return new Point(trim.width, trim.height);
-	}
-	/**
-	 * Tests if the page under the provided key is currently in the book.
-	 * 
-	 * @param key
-	 *            the page key
-	 * @return <code>true</code> if page exists, <code>false</code>
-	 *         otherwise.
-	 */
-	public boolean hasPage(Object key) {
-		return pages.containsKey(key);
-	}
-	/**
-	 * Creates a new page for the provided key. Use the returned composite to
-	 * create children in it.
-	 * 
-	 * @param key
-	 *            the page key
-	 * @return the newly created page composite
-	 */
-	public Composite createPage(Object key) {
-		Composite page = createPage();
-		pages.put(key, page);
-		return page;
-	}
-	/**
-	 * Returns the page book container.
-	 * 
-	 * @return the page book container
-	 */
-	public Composite getContainer() {
-		return pageBook;
-	}
-	/**
-	 * Registers a page under the privided key to be managed by the page book.
-	 * The page must be a direct child of the page book container.
-	 * 
-	 * @param key
-	 *            the page key
-	 * @param page
-	 *            the page composite to register
-	 * @see #createPage(Object)
-	 * @see #getContainer
-	 */
-	public void registerPage(Object key, Control page) {
-		pages.put(key, page);
-	}
-	/**
-	 * Removes the page under the provided key from the page book. Does nothing
-	 * if page with that key does not exist.
-	 * 
-	 * @param key
-	 *            the page key.
-	 */
-	public void removePage(Object key) {
-		removePage(key, true);
-	}
-	/**
-	 * Removes the page under the provided key from the page book. Does nothing
-	 * if page with that key does not exist.
-	 * 
-	 * @param key
-	 *            the page key.
-	 * @param showEmptyPage
-	 * 			  if <code>true</code>, shows the empty page
-	 *            after page removal.
-	 */
-	public void removePage(Object key, boolean showEmptyPage) {
-		Control page = (Control) pages.get(key);
-		if (page != null) {
-			pages.remove(key);
-			page.dispose();
-			if (showEmptyPage)
-				showEmptyPage();
-		}
-	}
-	/**
-	 * Shows the page with the provided key and hides the page previously
-	 * showing. Does nothing if the page with that key does not exist.
-	 * 
-	 * @param key
-	 *            the page key
-	 */
-	public void showPage(Object key) {
-		Control page = (Control) pages.get(key);
-		if (page != null) {
-			pageBook.showPage(page);
-			if (currentPage != null && currentPage != page) {
-				// switching pages - force layout
-				if (page instanceof Composite)
-					((Composite) page).layout(false);
-			}
-			currentPage = page;
-		} else {
-			showEmptyPage();
-		}
-		reflow(true);
-	}
-	/**
-	 * Shows a page with no children to be used if the desire is to not show
-	 * any registered page.
-	 */
-	public void showEmptyPage() {
-		if (emptyPage == null) {
-			emptyPage = createPage();
-			emptyPage.setLayout(new GridLayout());
-		}
-		pageBook.showPage(emptyPage);
-		currentPage = emptyPage;
-		reflow(true);
-	}
-	/**
-	 * Sets focus on the current page if shown.
-	 */
-	public boolean setFocus() {
-		if (currentPage != null)
-			return currentPage.setFocus();
-		return super.setFocus();
-	}
-	/**
-	 * Returns the page currently showing.
-	 * 
-	 * @return the current page
-	 */
-	public Control getCurrentPage() {
-		return currentPage;
-	}
-	private Composite createPage() {
-		Composite page = new LayoutComposite(pageBook, SWT.NULL);
-		page.setBackground(getBackground());
-		page.setForeground(getForeground());
-		page.setMenu(pageBook.getMenu());
-		return page;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/Section.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/Section.java
deleted file mode 100644
index 841f1b1..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/Section.java
+++ /dev/null
@@ -1,471 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Michael Williamson (eclipse-bugs@magnaworks.com) - patch (see Bugzilla #92545) 
- *       
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-
-import java.util.Hashtable;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-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.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.internal.forms.widgets.FormImages;
-import org.eclipse.ui.internal.forms.widgets.FormUtil;
-
-/**
- * A variation of the expandable composite that adds optional description below
- * the title. Section is often used as a basic building block in forms because
- * it provides for logical grouping of information.
- * <p>
- * In case of the TITLE_BAR style, Section renders the title bar in a way
- * compatible with the rest of the workbench. Since it is a widget, all the
- * colors must be supplied directly. When created by the form toolkit, these
- * colors are supplied by the toolkit. The toolkit initializes these colors
- * based on the system colors. For this reason, it is recommended to create the
- * section by the toolkit instead of through its own constructor.
- * <p>
- * Since 3.1, it is possible to set a control to be used for section
- * description. If used, <code>DESCRIPTION</code> style should not be set. A
- * typical way to take advantage of the new method is to set an instance of
- * <code>FormText</code> to provide for hyperlinks and images in the
- * description area.
- * 
- * @since 3.0
- */
-public class Section extends ExpandableComposite {
-	/**
-	 * Description style. If used, description will be rendered below the title.
-	 */
-	public static final int DESCRIPTION = 1 << 7;
-
-	private Control descriptionControl;
-
-	private Control separator;
-
-	private Hashtable titleColors;
-
-	private static final String COLOR_BG = "bg"; //$NON-NLS-1$
-
-	private static final String COLOR_GBG = "gbg"; //$NON-NLS-1$
-
-	private static final String COLOR_BORDER = "border"; //$NON-NLS-1$
-
-	/**
-	 * Creates a new section instance in the provided parent.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param style
-	 *            the style to use
-	 */
-	public Section(Composite parent, int style) {
-		this(parent, SWT.NULL, style);
-	}
-
-	Section(Composite parent, int cstyle, int style) {
-		super(parent, cstyle | getBackgroundStyle(style), style);
-		int rtl = cstyle & SWT.RIGHT_TO_LEFT;
-		if ((style & DESCRIPTION) != 0) {
-			descriptionControl = new Text(this, SWT.READ_ONLY | SWT.WRAP | rtl);
-		}
-		if ((style & TITLE_BAR) != 0) {
-			Listener listener = new Listener() {
-				public void handleEvent(Event e) {
-					Image image = Section.super.getBackgroundImage();
-					if (image != null) {
-						FormImages.getInstance().markFinished(image);
-					}
-					Section.super.setBackgroundImage(null);
-				}
-			};
-			addListener(SWT.Dispose, listener);
-			addListener(SWT.Resize, listener);
-		}
-	}
-
-	private static int getBackgroundStyle(int estyle) {
-		return ((estyle & TITLE_BAR) != 0) ? SWT.NO_BACKGROUND : SWT.NULL;
-	}
-
-	protected void internalSetExpanded(boolean expanded) {
-		super.internalSetExpanded(expanded);
-		if ((getExpansionStyle() & TITLE_BAR) != 0) {
-			if (!expanded)
-				super.setBackgroundImage(null);
-		}
-		reflow();
-	}
-
-	/**
-	 * Reflows this section and all the parents up the hierarchy until a
-	 * SharedScrolledComposite is reached.
-	 */
-	protected void reflow() {
-		Composite c = this;
-		while (c != null) {
-			c.setRedraw(false);
-			c = c.getParent();
-			if (c instanceof SharedScrolledComposite) {
-				break;
-			}
-		}
-		c = this;
-		while (c != null) {
-			c.layout(true);
-			c = c.getParent();
-			if (c instanceof SharedScrolledComposite) {
-				((SharedScrolledComposite) c).reflow(true);
-				break;
-			}
-		}
-		c = this;
-		while (c != null) {
-			c.setRedraw(true);
-			c = c.getParent();
-			if (c instanceof SharedScrolledComposite) {
-				break;
-			}
-		}
-	}
-
-	/**
-	 * Sets the description text. Has no effect if DESCRIPTION style was not
-	 * used to create the control.
-	 * 
-	 * @param description
-	 */
-	public void setDescription(String description) {
-		if (descriptionControl instanceof Text)
-			((Text) descriptionControl).setText(description);
-	}
-
-	/**
-	 * Returns the current description text.
-	 * 
-	 * @return description text or <code>null</code> if DESCRIPTION style was
-	 *         not used to create the control.
-	 */
-	public String getDescription() {
-		if (descriptionControl instanceof Text)
-			return ((Text) descriptionControl).getText();
-		return null;
-	}
-
-	/**
-	 * Sets the separator control of this section. The separator must not be
-	 * <samp>null </samp> and must be a direct child of this container. If
-	 * defined, separator will be placed below the title text and will remain
-	 * visible regardless of the expansion state.
-	 * 
-	 * @param separator
-	 *            the separator that will be placed below the title text.
-	 */
-	public void setSeparatorControl(Control separator) {
-		Assert.isTrue(separator != null && separator.getParent().equals(this));
-		this.separator = separator;
-	}
-
-	/**
-	 * Returns the control that is used as a separator betweeen the title and
-	 * the client, or <samp>null </samp> if not set.
-	 * 
-	 * @return separator control or <samp>null </samp> if not set.
-	 */
-	public Control getSeparatorControl() {
-		return separator;
-	}
-
-	/**
-	 * Sets the background of the section.
-	 * 
-	 * @param bg
-	 *            the new background
-	 */
-	public void setBackground(Color bg) {
-		super.setBackground(bg);
-		if (descriptionControl != null
-				&& (getExpansionStyle() & DESCRIPTION) != 0)
-			descriptionControl.setBackground(bg);
-	}
-
-	/**
-	 * Sets the foreground of the section.
-	 * 
-	 * @param fg
-	 *            the new foreground.
-	 */
-	public void setForeground(Color fg) {
-		super.setForeground(fg);
-		if (descriptionControl != null
-				&& (getExpansionStyle() & DESCRIPTION) != 0)
-			descriptionControl.setForeground(fg);
-	}
-
-	/**
-	 * Returns the control used to render the description. In 3.1, this method
-	 * was promoted to public.
-	 * 
-	 * @return description control or <code>null</code> if DESCRIPTION style
-	 *         was not used to create the control and description control was
-	 *         not set by the client.
-	 * @see #setDescriptionControl(org.eclipse.swt.widgets.Control)
-	 */
-	public Control getDescriptionControl() {
-		return descriptionControl;
-	}
-
-	/**
-	 * Sets the description control of this section. The control must not be
-	 * <samp>null</samp> and must be a direct child of this container. If
-	 * defined, contol will be placed below the title text and the separator and
-	 * will be hidden int he collapsed state.
-	 * <p>
-	 * This method and <code>DESCRIPTION</code> style are mutually exclusive.
-	 * Use the method only if you want to create the description control
-	 * yourself.
-	 * 
-	 * @since 3.1
-	 * @param descriptionControl
-	 *            the control that will be placed below the title text.
-	 */
-	public void setDescriptionControl(Control descriptionControl) {
-		Assert.isTrue((getExpansionStyle() & DESCRIPTION) == 0);
-		Assert.isTrue(descriptionControl != null
-				&& descriptionControl.getParent().equals(this));
-		this.descriptionControl = descriptionControl;
-	}
-
-	/**
-	 * Sets the color of the title bar border when TITLE_BAR style is used.
-	 * 
-	 * @param color
-	 *            the title bar border color
-	 */
-	public void setTitleBarBorderColor(Color color) {
-		putTitleBarColor(COLOR_BORDER, color);
-	}
-
-	/**
-	 * Sets the color of the title bar background when TITLE_BAR style is used.
-	 * This color is used as a starting color for the vertical gradient.
-	 * 
-	 * @param color
-	 *            the title bar border background
-	 */
-	public void setTitleBarBackground(Color color) {
-		putTitleBarColor(COLOR_BG, color);
-	}
-
-	/**
-	 * Sets the color of the title bar gradient background when TITLE_BAR style
-	 * is used. This color is used at the height where title controls end
-	 * (toggle, tool bar).
-	 * 
-	 * @param color
-	 *            the title bar gradient background
-	 */
-	public void setTitleBarGradientBackground(Color color) {
-		putTitleBarColor(COLOR_GBG, color);
-	}
-
-	/**
-	 * Returns the title bar border color when TITLE_BAR style is used.
-	 * 
-	 * @return the title bar border color
-	 */
-	public Color getTitleBarBorderColor() {
-		if (titleColors == null)
-			return null;
-		return (Color) titleColors.get(COLOR_BORDER);
-	}
-
-	/**
-	 * Returns the title bar gradient background color when TITLE_BAR style is
-	 * used.
-	 * 
-	 * @return the title bar gradient background
-	 */
-	public Color getTitleBarGradientBackground() {
-		if (titleColors == null)
-			return null;
-		if ((getExpansionStyle() & SHORT_TITLE_BAR) != 0)
-			return getBackground();
-		return (Color) titleColors.get(COLOR_GBG);
-	}
-
-	/**
-	 * Returns the title bar background when TITLE_BAR style is used.
-	 * 
-	 * @return the title bar background
-	 */
-	public Color getTitleBarBackground() {
-		if (titleColors == null)
-			return null;
-		return (Color) titleColors.get(COLOR_BG);
-	}
-
-	private void putTitleBarColor(String key, Color color) {
-		if (color == null)
-			return;
-		if (titleColors == null)
-			titleColors = new Hashtable();
-		titleColors.put(key, color);
-	}
-
-	protected void onPaint(PaintEvent e) {
-		Color bg = null;
-		Color fg = null;
-		Color border = null;
-
-		GC gc = e.gc;
-		Image buffer = null;
-		Rectangle bounds = getClientArea();
-
-		if ((getExpansionStyle() & TITLE_BAR) != 0) {
-			buffer = new Image(getDisplay(), bounds.width, bounds.height);
-			buffer.setBackground(getBackground());
-			gc = new GC(buffer);
-		}
-		if (titleColors != null) {
-			bg = (Color) titleColors.get(COLOR_BG);
-			fg = getTitleBarForeground();
-			border = (Color) titleColors.get(COLOR_BORDER);
-		}
-		if (bg == null)
-			bg = getBackground();
-		if (fg == null)
-			fg = getForeground();
-		if (border == null)
-			border = fg;
-		int theight = 0;
-		int gradientheight = 0;
-		int tvmargin = IGAP;
-		if ((getExpansionStyle() & TITLE_BAR) != 0) {
-			Point tsize = null;
-			Point tcsize = null;
-			if (toggle != null)
-				tsize = toggle.getSize();
-			int twidth = bounds.width - marginWidth - marginWidth;
-			if (tsize != null)
-				twidth -= tsize.x + IGAP;
-			if (getTextClient() != null)
-				tcsize = getTextClient().getSize();
-			if (tcsize != null)
-				twidth -= tcsize.x + IGAP;
-			Point size = textLabel == null ? new Point(0,0) : textLabel.getSize();
-			if (tsize != null)
-				theight += Math.max(theight, tsize.y);
-			gradientheight = theight;
-			if (tcsize != null) {
-				theight = Math.max(theight, tcsize.y);
-			}
-			theight = Math.max(theight, size.y);
-			gradientheight = Math.max(gradientheight, size.y);
-			theight += tvmargin + tvmargin;
-			gradientheight += tvmargin + tvmargin;
-		} else {
-			theight = 5;
-		}
-		if ((getExpansionStyle() & TITLE_BAR) != 0) {
-			if (getBackgroundImage() == null)
-				updateHeaderImage(bg, bounds, gradientheight, theight);
-			gc.setBackground(getBackground());
-			gc.fillRectangle(bounds.x, bounds.y, bounds.width, bounds.height);
-			drawBackground(gc, bounds.x, bounds.y, bounds.width, theight);
-			if (marginWidth > 0) {
-				// fix up margins
-				gc.setBackground(getBackground());
-				gc.fillRectangle(0, 0, marginWidth, theight);
-				gc.fillRectangle(bounds.x + bounds.width - marginWidth, 0,
-						marginWidth, theight);
-			}
-		} else if (isExpanded()) {
-			gc.setForeground(bg);
-			gc.setBackground(getBackground());
-			gc.fillGradientRectangle(marginWidth, marginHeight, bounds.width
-					- marginWidth - marginWidth, theight, true);
-		}
-		gc.setBackground(getBackground());
-		FormUtil.setAntialias(gc, SWT.ON);
-		// repair the upper left corner
-		gc.fillPolygon(new int[] { marginWidth, marginHeight, marginWidth,
-				marginHeight + 2, marginWidth + 2, marginHeight });
-		// repair the upper right corner
-		gc.fillPolygon(new int[] { bounds.width - marginWidth - 3,
-				marginHeight, bounds.width - marginWidth, marginHeight,
-				bounds.width - marginWidth, marginHeight + 3 });
-		gc.setForeground(border);
-		if (isExpanded() || (getExpansionStyle() & TITLE_BAR) != 0) {
-			// top left curve
-			gc.drawLine(marginWidth, marginHeight + 2, marginWidth + 2,
-					marginHeight);
-			// top edge
-			gc.drawLine(marginWidth + 2, marginHeight, bounds.width
-					- marginWidth - 3, marginHeight);
-			// top right curve
-			gc.drawLine(bounds.width - marginWidth - 3, marginHeight,
-					bounds.width - marginWidth - 1, marginHeight + 2);
-		} else {
-			// collapsed short title bar
-			// top edge
-			gc.drawLine(marginWidth, marginHeight, bounds.width - 1,
-					marginHeight);
-		}
-		if ((getExpansionStyle() & TITLE_BAR) != 0 || isExpanded()) {
-			// left vertical edge gradient
-			gc.fillGradientRectangle(marginWidth, marginHeight + 2, 1,
-					gradientheight - 2, true);
-			// right vertical edge gradient
-			gc.fillGradientRectangle(bounds.width - marginWidth - 1,
-					marginHeight + 2, 1, gradientheight - 2, true);
-		}
-		if ((getExpansionStyle() & TITLE_BAR) != 0) {
-			// New in 3.3 - edge treatmant
-			gc.setForeground(getBackground());
-			gc.drawPolyline(new int[] { marginWidth + 1,
-					marginHeight + gradientheight - 1, marginWidth + 1,
-					marginHeight + 2, marginWidth + 2, marginHeight + 2,
-					marginWidth + 2, marginHeight + 1,
-					bounds.width - marginWidth - 3, marginHeight + 1,
-					bounds.width - marginWidth - 3, marginHeight + 2,
-					bounds.width - marginWidth - 2, marginHeight + 2,
-					bounds.width - marginWidth - 2,
-					marginHeight + gradientheight - 1 });
-		}
-		if (buffer != null) {
-			gc.dispose();
-			e.gc.drawImage(buffer, 0, 0);
-			buffer.dispose();
-		}
-	}
-
-	private void updateHeaderImage(Color bg, Rectangle bounds, int theight,
-			int realtheight) {
-		Image image = FormImages.getInstance().getGradient(getBackground(), bg, realtheight, theight, marginHeight);
-		super.setBackgroundImage(image);
-	}
-
-	/**
-	 * Background image is used for the title gradient - does nothing.
-	 */
-	public final void setBackgroundImage(Image image) {
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/SharedScrolledComposite.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/SharedScrolledComposite.java
deleted file mode 100644
index 5aeabd8..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/SharedScrolledComposite.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-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.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.ScrollBar;
-import org.eclipse.ui.internal.forms.widgets.FormUtil;
-
-/**
- * This class is used to provide common scrolling services to a number of
- * controls in the toolkit. Classes that extend it are not required to implement
- * any method.
- * 
- * @since 3.0
- */
-public abstract class SharedScrolledComposite extends ScrolledComposite {
-	private static final int H_SCROLL_INCREMENT = 5;
-
-	private static final int V_SCROLL_INCREMENT = 64;
-	
-	private boolean ignoreLayouts = true;
-
-	private boolean ignoreResizes = false;
-
-	private boolean expandHorizontal = false;
-
-	private boolean expandVertical = false;
-
-	private SizeCache contentCache = new SizeCache();
-
-	private boolean reflowPending = false;
-
-	private boolean delayedReflow = false;
-	
-	private Color bgColor = null;
-	
-	/**
-	 * Creates the new instance.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param style
-	 *            the style to use
-	 */
-	public SharedScrolledComposite(Composite parent, int style) {
-		super(parent, style);
-		addListener(SWT.Resize, new Listener() {
-			public void handleEvent(Event e) {
-				if (!ignoreResizes) {
-					scheduleReflow(false);
-				}
-			}
-		});
-		initializeScrollBars();
-	}
-
-	/**
-	 * Sets the foreground of the control and its content.
-	 * 
-	 * @param fg
-	 *            the new foreground color
-	 */
-	public void setForeground(Color fg) {
-		super.setForeground(fg);
-		if (getContent() != null)
-			getContent().setForeground(fg);
-	}
-
-	/**
-	 * Sets the background of the control and its content.
-	 * 
-	 * @param bg
-	 *            the new background color
-	 */
-	public void setBackground(Color bg) {
-		bgColor = bg;
-		super.setBackground(bg);
-		if (getContent() != null)
-			getContent().setBackground(bg);
-	}
-
-	/**
-	 * Sets the font of the form. This font will be used to render the title
-	 * text. It will not affect the body.
-	 */
-	public void setFont(Font font) {
-		super.setFont(font);
-		if (getContent() != null)
-			getContent().setFont(font);
-	}
-
-	/**
-	 * Overrides 'super' to pass the proper colors and font
-	 */
-	public void setContent(Control content) {
-		super.setContent(content);
-		if (content != null) {
-			content.setForeground(getForeground());
-			content.setBackground(bgColor);
-			content.setFont(getFont());
-		}
-	}
-
-	/**
-	 * If content is set, transfers focus to the content.
-	 */
-	public boolean setFocus() {
-		boolean result;
-		FormUtil.setFocusScrollingEnabled(this, false);
-		if (getContent() != null)
-			result = getContent().setFocus();
-		else
-			result = super.setFocus();
-		FormUtil.setFocusScrollingEnabled(this, true);
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.widgets.Composite#layout(boolean)
-	 */
-	public void layout(boolean changed) {
-		if (ignoreLayouts) {
-			return;
-		}
-
-		ignoreLayouts = true;
-		ignoreResizes = true;
-		super.layout(changed);
-		ignoreResizes = false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.custom.ScrolledComposite#setExpandHorizontal(boolean)
-	 */
-	public void setExpandHorizontal(boolean expand) {
-		expandHorizontal = expand;
-		super.setExpandHorizontal(expand);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.custom.ScrolledComposite#setExpandVertical(boolean)
-	 */
-	public void setExpandVertical(boolean expand) {
-		expandVertical = expand;
-		super.setExpandVertical(expand);
-	}
-
-	/**
-	 * Recomputes the body layout and the scroll bars. The method should be used
-	 * when changes somewhere in the form body invalidate the current layout
-	 * and/or scroll bars.
-	 * 
-	 * @param flushCache
-	 *            if <code>true</code>, drop the cached data
-	 */
-	public void reflow(boolean flushCache) {
-		Composite c = (Composite) getContent();
-		Rectangle clientArea = getClientArea();
-		if (c == null)
-			return;
-
-		contentCache.setControl(c);
-		if (flushCache) {
-			contentCache.flush();
-		}
-		Point newSize = contentCache.computeSize(FormUtil.getWidthHint(
-				clientArea.width, c), FormUtil.getHeightHint(clientArea.height,
-				c));
-
-		if (!(expandHorizontal && expandVertical)) {
-			c.setSize(newSize);
-		}
-
-		setMinSize(newSize);
-		FormUtil.updatePageIncrement(this);
-		
-		// reduce vertical scroll increment if necessary
-		ScrollBar vbar = getVerticalBar();
-		if (vbar != null) {
-			if (getClientArea().height - 5 < V_SCROLL_INCREMENT)
-				getVerticalBar().setIncrement(getClientArea().height - 5);
-			else 
-				getVerticalBar().setIncrement(V_SCROLL_INCREMENT);
-		}
-
-		ignoreLayouts = false;
-		layout(flushCache);
-		ignoreLayouts = true;
-		
-		contentCache.layoutIfNecessary();
-	}
-
-	private void updateSizeWhilePending() {
-		Control c = getContent();
-		Rectangle area = getClientArea();
-		setMinSize(area.width, c.getSize().y);
-	}
-
-	private void scheduleReflow(final boolean flushCache) {
-		if (delayedReflow) {
-			if (reflowPending) {
-				updateSizeWhilePending();
-				return;
-			}
-			reflowPending = true;
-			getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					reflowPending = false;
-					if (!isDisposed())
-						reflow(flushCache);
-				}
-			});
-		} else
-			reflow(flushCache);
-	}
-
-	private void initializeScrollBars() {
-		ScrollBar hbar = getHorizontalBar();
-		if (hbar != null) {
-			hbar.setIncrement(H_SCROLL_INCREMENT);
-		}
-		ScrollBar vbar = getVerticalBar();
-		if (vbar != null) {
-			vbar.setIncrement(V_SCROLL_INCREMENT);
-		}
-		FormUtil.updatePageIncrement(this);
-	}
-
-	/**
-	 * Tests if the control uses delayed reflow.
-	 * @return <code>true</code> if reflow requests will
-	 * be delayed, <code>false</code> otherwise. 
-	 */
-	public boolean isDelayedReflow() {
-		return delayedReflow;
-	}
-
-	/**
-	 * Sets the delayed reflow feature. When used,
-	 * it will schedule a reflow on resize requests
-	 * and reject subsequent reflows until the
-	 * scheduled one is performed.
-	 * 
-	 * @param delayedReflow
-	 *            The delayedReflow to set.
-	 */
-	public void setDelayedReflow(boolean delayedReflow) {
-		this.delayedReflow = delayedReflow;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/SizeCache.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/SizeCache.java
deleted file mode 100644
index a22b207..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/SizeCache.java
+++ /dev/null
@@ -1,532 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-
-import java.util.List;
-
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-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.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.ProgressBar;
-import org.eclipse.swt.widgets.Sash;
-import org.eclipse.swt.widgets.Scale;
-import org.eclipse.swt.widgets.Scrollable;
-import org.eclipse.swt.widgets.Slider;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.internal.forms.widgets.FormUtil;
-
-/**
- * Caches the preferred size of an SWT control
- * 
- * @since 3.0
- */
-public class SizeCache {
-    private Control control;
-
-    private Point preferredSize;
-
-    private int cachedWidthQuery;
-    private int cachedWidthResult;
-
-    private int cachedHeightQuery;
-    private int cachedHeightResult;
-    
-    private int minimumWidth;
-    private int heightAtMinimumWidth = -1;
-    private int maximumWidth;
-    
-    /**
-     * True iff we should recursively flush all children on the next layout
-     */
-    private boolean flushChildren;
-
-    /**
-     * True iff changing the height hint does not affect the preferred width and changing
-     * the width hint does not change the preferred height
-     */
-    private boolean independentDimensions = false;
-
-    /**
-     * True iff the preferred height for any hint larger than the preferred width will not
-     * change the preferred height.
-     */
-    private boolean preferredWidthOrLargerIsMinimumHeight = false;
-
-    // HACK: these values estimate how much to subtract from the width and height
-    // hints that get passed into computeSize, in order to produce a result
-    // that is exactly the desired size. To be removed once bug 46112 is fixed (note:
-    // bug 46112 is currently flagged as a duplicate, but there is still no workaround).
-    private int widthAdjustment = 0;
-
-    private int heightAdjustment = 0;
-
-    private int minimumHeight;
-
-    private int widthAtMinimumHeight = -1;
-    
-    // If the layout is dirty, this is the size of the control at the time its
-    // layout was dirtied. null if the layout is not dirty.
-    private Point dirtySize = null; 
-
-
-    // END OF HACK
-
-    public SizeCache() {
-        this(null);
-    }
-
-    /**
-     * Creates a cache for size computations on the given control
-     * 
-     * @param control the control for which sizes will be calculated, 
-     * or null to always return (0,0) 
-     */
-    public SizeCache(Control control) {
-        setControl(control);
-    }
-
-    /**
-     * Sets the control whose size is being cached. Does nothing (will not
-     * even flush the cache) if this is the same control as last time. 
-     * 
-     * @param newControl the control whose size is being cached, or null to always return (0,0)
-     */
-    public void setControl(Control newControl) {
-        if (newControl != control) {
-            control = newControl;
-            if (control == null) {
-                independentDimensions = true;
-                preferredWidthOrLargerIsMinimumHeight = false;
-                widthAdjustment = 0;
-                heightAdjustment = 0;
-            } else {
-                independentDimensions = independentLengthAndWidth(control);
-                preferredWidthOrLargerIsMinimumHeight = isPreferredWidthMaximum(control);
-                computeHintOffset(control);
-                flush();
-            }
-        }
-    }
-
-    /**
-     * Returns the control whose size is being cached
-     * 
-     * @return the control whose size is being cached, or null if this cache always returns (0,0)
-     */
-    public Control getControl() {
-        return control;
-    }
-
-    /**
-     * Flush the cache (should be called if the control's contents may have changed since the
-     * last query)
-     */
-    public void flush() {
-        flush(true);
-    }
-
-    public void flush(boolean recursive) {
-        preferredSize = null;
-        cachedWidthQuery = -1;
-        cachedWidthResult = -1;
-        cachedHeightQuery = -1;
-        cachedHeightResult = -1;
-        minimumWidth = -1;
-        maximumWidth = -1;
-        minimumHeight = -1;
-        heightAtMinimumWidth = -1;
-        widthAtMinimumHeight = -1;
-        
-        if (recursive || dirtySize != null) {
-            if (control == null || control.isDisposed()) {
-                dirtySize = new Point(0,0);
-                control = null;
-            } else {
-                dirtySize = control.getSize();
-            }
-        }
-        
-        this.flushChildren = this.flushChildren || recursive;
-    }
-
-    private Point getPreferredSize() {
-        if (preferredSize == null) {
-            preferredSize = controlComputeSize(SWT.DEFAULT, SWT.DEFAULT);
-        }
-
-        return preferredSize;
-    }
-
-    /**
-     * Computes the preferred size of the control.
-     *  
-     * @param widthHint the known width of the control (pixels) or SWT.DEFAULT if unknown
-     * @param heightHint the known height of the control (pixels) or SWT.DEFAULT if unknown
-     * @return the preferred size of the control
-     */
-    public Point computeSize(int widthHint, int heightHint) {
-        if (control == null || control.isDisposed()) {
-            return new Point(0, 0);
-        }
-        
-        // If we're asking for a result smaller than the minimum width
-        int minWidth = computeMinimumWidth();
-        
-        if (widthHint != SWT.DEFAULT && widthHint + widthAdjustment < minWidth) {
-            if (heightHint == SWT.DEFAULT) {
-                return new Point(minWidth, computeHeightAtMinimumWidth());   
-            }
-            
-            widthHint = minWidth - widthAdjustment;
-        }
-        
-        // If we're asking for a result smaller than the minimum height
-        int minHeight = computeMinimumHeight();
-        
-        if (heightHint != SWT.DEFAULT && heightHint + heightAdjustment < minHeight) {
-            if (widthHint == SWT.DEFAULT) {
-                return new Point(computeWidthAtMinimumHeight(), minHeight);
-            }
-            
-            heightHint = minHeight - heightAdjustment;
-        }
-        
-        // If both dimensions were supplied in the input, compute the trivial result
-        if (widthHint != SWT.DEFAULT && heightHint != SWT.DEFAULT) {                        
-            return new Point(widthHint + widthAdjustment, heightHint + heightAdjustment);
-        }
-
-        // No hints given -- find the preferred size
-        if (widthHint == SWT.DEFAULT && heightHint == SWT.DEFAULT) {
-            return Geometry.copy(getPreferredSize());
-        }
-
-        // If the length and width are independent, compute the preferred size
-        // and adjust whatever dimension was supplied in the input
-        if (independentDimensions) {
-            Point result = Geometry.copy(getPreferredSize());
-
-            if (widthHint != SWT.DEFAULT) {
-                result.x = widthHint + widthAdjustment;
-            }
-
-            if (heightHint != SWT.DEFAULT) {
-                result.y = heightHint + heightAdjustment;
-            }
-
-            return result;
-        }
-
-        // Computing a height
-        if (heightHint == SWT.DEFAULT) {
-            // If we know the control's preferred size
-            if (preferredSize != null) {
-                // If the given width is the preferred width, then return the preferred size
-                if (widthHint + widthAdjustment == preferredSize.x) {
-                    return Geometry.copy(preferredSize);
-                }
-            }
-
-            // If we have a cached height measurement
-            if (cachedHeightQuery != -1) {
-                // If this was measured with the same width hint
-                if (cachedHeightQuery == widthHint) {
-                    return new Point(widthHint + widthAdjustment, cachedHeightResult);
-                }
-            }
-
-            // If this is a control where any hint larger than the
-            // preferred width results in the minimum height, determine if
-            // we can compute the result based on the preferred height
-            if (preferredWidthOrLargerIsMinimumHeight) {
-                // Computed the preferred size (if we don't already know it)
-                getPreferredSize();
-
-                // If the width hint is larger than the preferred width, then
-                // we can compute the result from the preferred width
-                if (widthHint + widthAdjustment >= preferredSize.x) {
-                    return new Point(widthHint + widthAdjustment, preferredSize.y);
-                }
-            }
-
-            // Else we can't find an existing size in the cache, so recompute
-            // it from scratch.
-            Point newHeight = controlComputeSize(widthHint - widthAdjustment, SWT.DEFAULT);
-
-            cachedHeightQuery = heightHint;
-            cachedHeightResult = newHeight.y;
-            
-            return newHeight;
-        }
-
-        // Computing a width
-        if (widthHint == SWT.DEFAULT) {
-            // If we know the control's preferred size
-            if (preferredSize != null) {
-                // If the given height is the preferred height, then return the preferred size
-                if (heightHint + heightAdjustment == preferredSize.y) {
-                    return Geometry.copy(preferredSize);
-                }
-            }
-
-            // If we have a cached width measurement with the same height hint
-            if (cachedWidthQuery == heightHint) {
-                return new Point(cachedWidthResult, heightHint + heightAdjustment);
-            }
-
-            Point widthResult = controlComputeSize(SWT.DEFAULT, heightHint - heightAdjustment);
-
-            cachedWidthQuery = heightHint;
-            cachedWidthResult = widthResult.x;
-            
-            return widthResult;
-        }
-
-        return controlComputeSize(widthHint, heightHint);
-    }
-    
-    /**
-     * Compute the control's size, and ensure that non-default hints are returned verbatim
-     * (this tries to compensate for SWT's hints, which aren't really the outer width of the
-     * control).
-     * 
-     * @param widthHint the horizontal hint
-     * @param heightHint the vertical hint
-     * @return the control's size
-     */
-    public Point computeAdjustedSize(int widthHint, int heightHint) {
-        int adjustedWidthHint = widthHint == SWT.DEFAULT ? SWT.DEFAULT : Math
-                .max(0, widthHint - widthAdjustment);
-        int adjustedHeightHint = heightHint == SWT.DEFAULT ? SWT.DEFAULT : Math
-                .max(0, heightHint - heightAdjustment);
-
-        Point result = computeSize(adjustedWidthHint, adjustedHeightHint);
-
-        // If the amounts we subtracted off the widthHint and heightHint didn't do the trick, then
-        // manually adjust the result to ensure that a non-default hint will return that result verbatim.
-        
-        return result;
-    }
-
-    /**
-     * Returns true if the preferred length of the given control is 
-     * independent of the width and visa-versa. If this returns true,
-     * then changing the widthHint argument to control.computeSize will
-     * never change the resulting height and changing the heightHint
-     * will never change the resulting width. Returns false if unknown.
-     * <p>
-     * This information can be used to improve caching. Incorrectly returning
-     * a value of false may decrease performance, but incorrectly returning 
-     * a value of true will generate incorrect layouts... so always return
-     * false if unsure.
-     * </p>
-     * 
-     * @param control
-     * @return
-     */
-    static boolean independentLengthAndWidth(Control control) {
-        if (control == null || control.isDisposed()) {
-            return true;
-        }
-
-        if (control instanceof Button || control instanceof ProgressBar
-                || control instanceof Sash || control instanceof Scale
-                || control instanceof Slider || control instanceof List
-                || control instanceof Combo || control instanceof Tree) {
-            return true;
-        }
-
-        if (control instanceof Label || control instanceof Text) {
-            return (control.getStyle() & SWT.WRAP) == 0;
-        }
-
-        // Unless we're certain that the control has this property, we should
-        // return false.
-
-        return false;
-    }
-    
-    /**
-     * Try to figure out how much we need to subtract from the hints that we
-     * pass into the given control's computeSize(...) method. This tries to
-     * compensate for bug 46112. To be removed once SWT provides an "official"
-     * way to compute one dimension of a control's size given the other known
-     * dimension.
-     * 
-     * @param control
-     */
-    private void computeHintOffset(Control control) {
-        if (control instanceof Scrollable) {
-            // For scrollables, subtract off the trim size
-            Scrollable scrollable = (Scrollable) control;
-            Rectangle trim = scrollable.computeTrim(0, 0, 0, 0);
-
-            widthAdjustment = trim.width;
-            heightAdjustment = trim.height;
-        } else {
-            // For non-composites, subtract off 2 * the border size
-            widthAdjustment = control.getBorderWidth() * 2;
-            heightAdjustment = widthAdjustment;
-        }
-    }
-
-    private Point controlComputeSize(int widthHint, int heightHint) {
-        Point result = control.computeSize(widthHint, heightHint, flushChildren);
-        flushChildren = false;
-        
-        return result;
-    }
-
-    /**
-     * Returns true only if the control will return a constant height for any
-     * width hint larger than the preferred width. Returns false if there is
-     * any situation in which the control does not have this property.
-     * 
-     * <p>
-     * Note: this method is only important for wrapping controls, and it can
-     * safely return false for anything else. AFAIK, all SWT controls have this
-     * property, but to be safe they will only be added to the list once the
-     * property has been confirmed.
-     * </p> 
-     * 
-     * @param control
-     * @return
-     */
-    private static boolean isPreferredWidthMaximum(Control control) {
-        return (control instanceof ToolBar
-        //|| control instanceof CoolBar
-        || control instanceof Label);
-    }
-    
-    public int computeMinimumWidth() {
-        if (minimumWidth == -1) {
-    		if (control instanceof Composite) {
-    			Layout layout = ((Composite)control).getLayout();
-    			if (layout instanceof ILayoutExtension) {
-    				minimumWidth = ((ILayoutExtension)layout).computeMinimumWidth((Composite)control, flushChildren);
-    				flushChildren = false;
-    			}
-    		}
-        }
-
-        if (minimumWidth == -1) {
-            Point minWidth = controlComputeSize(FormUtil.getWidthHint(5, control), SWT.DEFAULT); 
-            minimumWidth = minWidth.x;
-            heightAtMinimumWidth = minWidth.y;
-        }
-		
-		return minimumWidth;
-    }
-    
-    public int computeMaximumWidth() {
-        if (maximumWidth == -1) {
-    		if (control instanceof Composite) {
-    			Layout layout = ((Composite)control).getLayout();
-    			if (layout instanceof ILayoutExtension) {
-    				maximumWidth = ((ILayoutExtension)layout).computeMaximumWidth((Composite)control, flushChildren);
-    				flushChildren = false;
-    			}
-    		}
-        }
-
-        if (maximumWidth == -1) {
-            maximumWidth = getPreferredSize().x;
-        }
-		
-        return maximumWidth;
-	}
-    
-    private int computeHeightAtMinimumWidth() {
-        int minimumWidth = computeMinimumWidth();
-        
-        if (heightAtMinimumWidth == -1) {
-            heightAtMinimumWidth = controlComputeSize(minimumWidth - widthAdjustment, SWT.DEFAULT).y;
-        }
-        
-        return heightAtMinimumWidth;
-    }
-    
-    private int computeWidthAtMinimumHeight() {
-        int minimumHeight = computeMinimumHeight();
-        
-        if (widthAtMinimumHeight == -1) {
-            widthAtMinimumHeight = controlComputeSize(SWT.DEFAULT, minimumHeight - heightAdjustment).x;
-        }
-        
-        return widthAtMinimumHeight;
-    }
-
-    private int computeMinimumHeight() {
-        if (minimumHeight == -1) {
-            Point sizeAtMinHeight = controlComputeSize(SWT.DEFAULT, 0);
-            
-            minimumHeight = sizeAtMinHeight.y;
-            widthAtMinimumHeight = sizeAtMinHeight.x;
-        }
-        
-        return minimumHeight;
-    }
-    
-    public Point computeMinimumSize() {
-        return new Point(computeMinimumWidth(), computeMinimumHeight());
-    }
-
-    public void setSize(Point newSize) {
-        if (control != null) {
-            control.setSize(newSize);
-        }
-        
-        layoutIfNecessary();
-    }
-    
-    public void setSize(int width, int height) {
-        if (control != null) {
-            control.setSize(width, height);
-        }
-        
-        layoutIfNecessary();        
-    }
-    
-    public void setBounds(int x, int y, int width, int height) {
-        if (control != null) {
-            control.setBounds(x, y, width, height);
-        }
-        
-        layoutIfNecessary();        
-    }
-    
-    public void setBounds(Rectangle bounds) {
-        if (control != null) {
-            control.setBounds(bounds);
-        }
-        
-        layoutIfNecessary();
-    }
-
-    public void layoutIfNecessary() {
-        if (dirtySize != null && control != null && control instanceof Composite) {
-            if (control.getSize().equals(dirtySize)) {
-	            ((Composite)control).layout(flushChildren);
-	            flushChildren = false;
-            }
-        }
-        dirtySize = null;
-    }
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/TableWrapData.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/TableWrapData.java
deleted file mode 100644
index adbb4a2..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/TableWrapData.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-
-/**
- * Layout data used in conjunction with <code>HTMLTableLayout</code>.
- * Children in a composite that uses this layout should call <samp>setLayoutData
- * </samp> and pass an instance of this class to control physical placement in
- * the parent.
- * 
- * @see TableWrapLayout
- * @since 3.0
- */
-public final class TableWrapData {
-	/**
-	 * The control will be left-justified.
-	 */
-	public static final int LEFT = 1 << 1;
-
-	/**
-	 * The control will be centered horizontally.
-	 */
-	public static final int CENTER = 1 << 2;
-
-	/**
-	 * The control will be right-justified.
-	 */
-	public static final int RIGHT = 1 << 3;
-
-	/**
-	 * The control will be aligned with the top of the cell.
-	 */
-	public static final int TOP = 1 << 4;
-
-	/**
-	 * The control will be centered vertically.
-	 */
-	public static final int MIDDLE = 1 << 5;
-
-	/**
-	 * The control will be aligned with the bottom of the cell.
-	 */
-	public static final int BOTTOM = 1 << 6;
-
-	/**
-	 * The control will have the same width as the column it occupies.
-	 */
-	public static final int FILL = 1 << 7;
-
-	/**
-	 * In addition to filling width or height, the control will take part in
-	 * allocation of any excess space. Note that this constant can only be
-	 * passed to the constructor (cannot be directly assigned to
-	 * <code>align</code> variable).
-	 */
-	public static final int FILL_GRAB = 1 << 8;
-
-	/**
-	 * Number of columns to span (default is 1).
-	 */
-	public int colspan = 1;
-
-	/**
-	 * Number of rows to span (default is 1).
-	 */
-	public int rowspan = 1;
-
-	/**
-	 * Horizontal alignment (LEFT, CENTER, RIGHT or FILL; default is LEFT).
-	 */
-	public int align = LEFT;
-
-	/**
-	 * Vertical alignment (TOP, MIDDLE, BOTTOM or FILL; default is TOP).
-	 */
-	public int valign = TOP;
-
-	/**
-	 * Horizontal indent (default is 0).
-	 */
-	public int indent = 0;
-
-	/**
-	 * Maximum width of the control (default is SWT.DEFAULT).
-	 */
-	public int maxWidth = SWT.DEFAULT;
-
-	/**
-	 * Maximum height of the control (default is SWT.DEFAULT).
-	 */
-	public int maxHeight = SWT.DEFAULT;
-
-	/**
-	 * Height hint of the control (default is SWT.DEFAULT).
-	 */
-	public int heightHint = SWT.DEFAULT;
-
-	/**
-	 * If <code>true</code>, take part in excess horizontal space
-	 * distribution. (default is <code>false</code>).
-	 */
-	public boolean grabHorizontal;
-
-	/**
-	 * If <code>true</code>, will grab any excess vertical space (default is
-	 * <code>false</code>). Note that since TableWrapLayout works top-down
-	 * and does not grows to fill the parent, this only applies to local excess
-	 * space created by fixed-height children that span multiple rows.
-	 */
-	public boolean grabVertical;
-
-	int childIndex;
-
-	boolean isItemData = true;
-
-	int compWidth;
-
-	Point compSize;
-
-	/**
-	 * The default constructor.
-	 */
-	public TableWrapData() {
-	}
-
-	/**
-	 * The convenience constructor - allows passing the horizontal alignment
-	 * style.
-	 * 
-	 * @param align
-	 *            horizontal alignment (LEFT, CENTER, RIGHT, FILL or FILL_GRAB).
-	 */
-	public TableWrapData(int align) {
-		this(align, TOP, 1, 1);
-	}
-
-	/**
-	 * The convenience constructor - allows passing the alignment styles.
-	 * 
-	 * @param align
-	 *            horizontal alignment (LEFT, CENTER, RIGHT, FILL or FILL_GRAB).
-	 * @param valign
-	 *            vertical alignment (TOP, MIDDLE, BOTTOM, FILL or FILL_GRAB).
-	 */
-	public TableWrapData(int align, int valign) {
-		this(align, valign, 1, 1);
-	}
-
-	/**
-	 * The convenience constructor - allows passing the alignment styles, column
-	 * and row spans.
-	 * 
-	 * @param align
-	 *            horizontal alignment (LEFT, CENTER, RIGHT, FILL or FILL_GRAB).
-	 * @param valign
-	 *            vertical alignment (TOP, MIDDLE, BOTTOM, FILL or FILL_GRAB)
-	 * @param rowspan
-	 *            row span (1 or more)
-	 * @param colspan
-	 *            column span (1 or more)
-	 */
-	public TableWrapData(int align, int valign, int rowspan, int colspan) {
-		if (align != LEFT && align != CENTER && align != RIGHT && align != FILL
-				&& align != FILL_GRAB)
-			SWT.error(SWT.ERROR_INVALID_ARGUMENT, null, "align"); //$NON-NLS-1$
-		if (valign != TOP && valign != MIDDLE && valign != BOTTOM
-				&& valign != FILL && valign != FILL_GRAB)
-			SWT.error(SWT.ERROR_INVALID_ARGUMENT, null, "valign"); //$NON-NLS-1$
-		if (rowspan < 1)
-			SWT.error(SWT.ERROR_INVALID_ARGUMENT, null, "rowspan"); //$NON-NLS-1$
-		if (colspan < 1)
-			SWT.error(SWT.ERROR_INVALID_ARGUMENT, null, "colspan"); //$NON-NLS-1$
-		if (align == FILL_GRAB) {
-			this.align = FILL;
-			grabHorizontal = true;
-		} else
-			this.align = align;
-		if (valign == FILL_GRAB) {
-			this.valign = FILL;
-			grabVertical = true;
-		} else
-			this.valign = valign;
-		this.rowspan = rowspan;
-		this.colspan = colspan;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/TableWrapLayout.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/TableWrapLayout.java
deleted file mode 100644
index 7416075..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/TableWrapLayout.java
+++ /dev/null
@@ -1,872 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Vector;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-
-/**
- * This implementation of the layout algorithm attempts to position controls in
- * the composite using a two-pass autolayout HTML table altorithm recommeded by
- * HTML 4.01 W3C specification (see
- * http://www.w3.org/TR/html4/appendix/notes.html#h-B.5.2.2). The main
- * differences with GridLayout is that it has two passes and that width and
- * height are not calculated in the same pass.
- * <p>
- * The advantage of the algorithm over GridLayout is that it is capable of
- * flowing text controls capable of line wrap. These controls do not have
- * natural 'preferred size'. Instead, they are capable of providing the required
- * height if the width is set. Consequently, this algorithm first calculates the
- * widths that will be assigned to columns, and then passes those widths to the
- * controls to calculate the height. When a composite with this layout is a
- * child of the scrolling composite, they should interact in such a way that
- * reduction in the scrolling composite width results in the reflow and increase
- * of the overall height.
- * <p>
- * If none of the columns contain expandable and wrappable controls, the
- * end-result will be similar to the one provided by GridLayout. The difference
- * will show up for layouts that contain controls whose minimum and maximum
- * widths are not the same.
- * 
- * @see TableWrapData
- * @since 3.0
- */
-public final class TableWrapLayout extends Layout implements ILayoutExtension {
-	/**
-	 * Number of columns to use when positioning children (default is 1).
-	 */
-	public int numColumns = 1;
-
-	/**
-	 * Left margin variable (default is 5).
-	 */
-	public int leftMargin = 5;
-
-	/**
-	 * Right margin variable (default is 5).
-	 */
-	public int rightMargin = 5;
-
-	/**
-	 * Top margin variable (default is 5).
-	 */
-	public int topMargin = 5;
-
-	/**
-	 * Botom margin variable (default is 5).
-	 */
-	public int bottomMargin = 5;
-
-	/**
-	 * Horizontal spacing (default is 5).
-	 */
-	public int horizontalSpacing = 5;
-
-	/**
-	 * Vertical spacing (default is 5).
-	 */
-	public int verticalSpacing = 5;
-
-	/**
-	 * If set to <code>true</code>, all the columns will have the same width.
-	 * Otherwise, column widths will be computed based on controls in them and
-	 * their layout data (default is <code>false</code>).
-	 */
-	public boolean makeColumnsEqualWidth = false;
-
-	private boolean initialLayout = true;
-
-	private Vector grid = null;
-
-	private Hashtable rowspans;
-
-	private int[] minColumnWidths, maxColumnWidths;
-
-	private int widestColumnWidth;
-
-	private int[] growingColumns;
-
-	private int[] growingRows;
-
-	private LayoutCache cache = new LayoutCache();
-
-	private class RowSpan {
-		Control child;
-
-		int row;
-
-		int column;
-
-		int height;
-
-		int totalHeight;
-
-		public RowSpan(Control child, int column, int row) {
-			this.child = child;
-			this.column = column;
-			this.row = row;
-		}
-
-		/*
-		 * Updates this row span's height with the given one if it is within
-		 * this span.
-		 */
-		public void update(int currentRow, int rowHeight) {
-			TableWrapData td = (TableWrapData) child.getLayoutData();
-			// is currentRow within this span?
-			if (currentRow >= row && currentRow < row + td.rowspan) {
-				totalHeight += rowHeight;
-				if (currentRow > row)
-					totalHeight += verticalSpacing;
-			}
-		}
-
-		public int getRequiredHeightIncrease() {
-			if (totalHeight < height)
-				return height - totalHeight;
-			return 0;
-		}
-	}
-
-	/**
-	 * Implements ILayoutExtension. Should not be called directly.
-	 * 
-	 * @see ILayoutExtension
-	 */
-	public int computeMinimumWidth(Composite parent, boolean changed) {
-
-		Control[] children = parent.getChildren();
-		if (changed) {
-			cache.flush();
-		}
-
-		cache.setControls(children);
-
-		changed = true;
-		initializeIfNeeded(parent, changed);
-		if (initialLayout) {
-			changed = true;
-			initialLayout = false;
-		}
-		if (grid == null || changed) {
-			changed = true;
-			grid = new Vector();
-			createGrid(parent);
-		}
-		if (minColumnWidths == null)
-			minColumnWidths = new int[numColumns];
-		for (int i = 0; i < numColumns; i++) {
-			minColumnWidths[i] = 0;
-		}
-		return internalGetMinimumWidth(parent, changed);
-	}
-
-	/**
-	 * Implements ILayoutExtension. Should not be called directly.
-	 * 
-	 * @see ILayoutExtension
-	 */
-	public int computeMaximumWidth(Composite parent, boolean changed) {
-		Control[] children = parent.getChildren();
-		if (changed) {
-			cache.flush();
-		}
-
-		cache.setControls(children);
-
-		changed = true;
-		initializeIfNeeded(parent, changed);
-		if (initialLayout) {
-			changed = true;
-			initialLayout = false;
-		}
-		if (grid == null || changed) {
-			changed = true;
-			grid = new Vector();
-			createGrid(parent);
-		}
-		if (maxColumnWidths == null)
-			maxColumnWidths = new int[numColumns];
-		for (int i = 0; i < numColumns; i++) {
-			maxColumnWidths[i] = 0;
-		}
-		return internalGetMaximumWidth(parent, changed);
-	}
-
-	/**
-	 * @see Layout#layout(Composite, boolean)
-	 */
-	protected void layout(Composite parent, boolean changed) {
-
-		Rectangle clientArea = parent.getClientArea();
-		Control[] children = parent.getChildren();
-		if (changed) {
-			cache.flush();
-		}
-
-		if (children.length == 0)
-			return;
-
-		cache.setControls(children);
-
-		int parentWidth = clientArea.width;
-		changed = true;
-		initializeIfNeeded(parent, changed);
-		if (initialLayout) {
-			changed = true;
-			initialLayout = false;
-		}
-		if (grid == null || changed) {
-			changed = true;
-			grid = new Vector();
-			createGrid(parent);
-		}
-		resetColumnWidths();
-		int minWidth = internalGetMinimumWidth(parent, changed);
-		int maxWidth = internalGetMaximumWidth(parent, changed);
-		int tableWidth = parentWidth;
-		int[] columnWidths;
-		if (parentWidth <= minWidth) {
-			tableWidth = minWidth;
-			if (makeColumnsEqualWidth) {
-				columnWidths = new int[numColumns];
-				for (int i = 0; i < numColumns; i++) {
-					columnWidths[i] = widestColumnWidth;
-				}
-			} else
-				columnWidths = minColumnWidths;
-		} else if (parentWidth > maxWidth) {
-			if (growingColumns.length == 0) {
-				tableWidth = maxWidth;
-				columnWidths = maxColumnWidths;
-			} else {
-				columnWidths = new int[numColumns];
-				int colSpace = tableWidth - leftMargin - rightMargin;
-				colSpace -= (numColumns - 1) * horizontalSpacing;
-				int extra = parentWidth - maxWidth;
-				int colExtra = extra / growingColumns.length;
-				for (int i = 0; i < numColumns; i++) {
-					columnWidths[i] = maxColumnWidths[i];
-					if (isGrowingColumn(i)) {
-						columnWidths[i] += colExtra;
-					}
-				}
-			}
-		} else {
-			columnWidths = new int[numColumns];
-			if (makeColumnsEqualWidth) {
-				int colSpace = tableWidth - leftMargin - rightMargin;
-				colSpace -= (numColumns - 1) * horizontalSpacing;
-				int col = colSpace / numColumns;
-				for (int i = 0; i < numColumns; i++) {
-					columnWidths[i] = col;
-				}
-			} else {
-				columnWidths = assignExtraSpace(tableWidth, maxWidth, minWidth);
-			}
-		}
-		int y = topMargin+clientArea.y;
-		int[] rowHeights = computeRowHeights(children, columnWidths, changed);
-		for (int i = 0; i < grid.size(); i++) {
-			int rowHeight = rowHeights[i];
-			int x = leftMargin+clientArea.x;
-			TableWrapData[] row = (TableWrapData[]) grid.elementAt(i);
-			for (int j = 0; j < numColumns; j++) {
-				TableWrapData td = row[j];
-				if (td.isItemData) {
-					Control child = children[td.childIndex];
-					placeControl(child, td, x, y, rowHeights, i);
-				}
-				x += columnWidths[j];
-				if (j < numColumns - 1)
-					x += horizontalSpacing;
-			}
-			y += rowHeight + verticalSpacing;
-		}
-	}
-
-	int[] computeRowHeights(Control[] children, int[] columnWidths,
-			boolean changed) {
-		int[] rowHeights = new int[grid.size()];
-		for (int i = 0; i < grid.size(); i++) {
-			TableWrapData[] row = (TableWrapData[]) grid.elementAt(i);
-			rowHeights[i] = 0;
-			for (int j = 0; j < numColumns; j++) {
-				TableWrapData td = row[j];
-				if (td.isItemData == false) {
-					continue;
-				}
-				Control child = children[td.childIndex];
-				int span = td.colspan;
-				int cwidth = 0;
-				for (int k = j; k < j + span; k++) {
-					cwidth += columnWidths[k];
-					if (k < j + span - 1)
-						cwidth += horizontalSpacing;
-				}
-				Point size = computeSize(td.childIndex, cwidth, td.indent, td.maxWidth, td.maxHeight);
-				td.compWidth = cwidth;
-				if (td.heightHint != SWT.DEFAULT) {
-					size = new Point(size.x, td.heightHint);
-				}
-				td.compSize = size;
-				RowSpan rowspan = (RowSpan) rowspans.get(child);
-				if (rowspan == null) {
-					rowHeights[i] = Math.max(rowHeights[i], size.y);
-				} else
-					rowspan.height = size.y;
-			}
-			updateRowSpans(i, rowHeights[i]);
-		}
-		for (Enumeration enm = rowspans.elements(); enm.hasMoreElements();) {
-			RowSpan rowspan = (RowSpan) enm.nextElement();
-			int increase = rowspan.getRequiredHeightIncrease();
-			if (increase == 0)
-				continue;
-			TableWrapData td = (TableWrapData) rowspan.child.getLayoutData();
-			int ngrowing = 0;
-			int[] affectedRows = new int[grid.size()];
-			for (int i = 0; i < growingRows.length; i++) {
-				int growingRow = growingRows[i];
-				if (growingRow >= rowspan.row
-						&& growingRow < rowspan.row + td.rowspan) {
-					affectedRows[ngrowing++] = growingRow;
-				}
-			}
-			if (ngrowing == 0) {
-				ngrowing = 1;
-				affectedRows[0] = rowspan.row + td.rowspan - 1;
-			}
-			increase += increase % ngrowing;
-			int perRowIncrease = increase / ngrowing;
-			for (int i = 0; i < ngrowing; i++) {
-				int growingRow = affectedRows[i];
-				rowHeights[growingRow] += perRowIncrease;
-			}
-		}
-		return rowHeights;
-	}
-
-	boolean isGrowingColumn(int col) {
-		if (growingColumns == null)
-			return false;
-		for (int i = 0; i < growingColumns.length; i++) {
-			if (col == growingColumns[i])
-				return true;
-		}
-		return false;
-	}
-
-	int[] assignExtraSpace(int tableWidth, int maxWidth, int minWidth) {
-		int fixedPart = leftMargin + rightMargin + (numColumns - 1)
-				* horizontalSpacing;
-		int D = maxWidth - minWidth;
-		int W = tableWidth - fixedPart - minWidth;
-		int widths[] = new int[numColumns];
-		int rem = 0;
-		for (int i = 0; i < numColumns; i++) {
-			int cmin = minColumnWidths[i];
-			int cmax = maxColumnWidths[i];
-			int d = cmax - cmin;
-			int extra = D != 0 ? (d * W) / D : 0;
-			if (i < numColumns - 1) {
-				widths[i] = cmin + extra;
-				rem += widths[i];
-			} else {
-				widths[i] = tableWidth - fixedPart - rem;
-			}
-		}
-		return widths;
-	}
-
-	Point computeSize(int childIndex, int width, int indent, int maxWidth, int maxHeight) {
-		int widthArg = width - indent;
-		SizeCache controlCache = cache.getCache(childIndex);
-		if (!isWrap(controlCache.getControl()))
-			widthArg = SWT.DEFAULT;
-		Point size = controlCache.computeSize(widthArg, SWT.DEFAULT);
-		if (maxWidth!=SWT.DEFAULT)
-			size.x = Math.min(size.x, maxWidth);
-		if (maxHeight!=SWT.DEFAULT)
-			size.y = Math.min(size.y, maxHeight);
-		size.x += indent;
-		return size;
-	}
-
-	void placeControl(Control control, TableWrapData td, int x, int y,
-			int[] rowHeights, int row) {
-		int xloc = x + td.indent;
-		int yloc = y;
-		int height = td.compSize.y;
-		int colWidth = td.compWidth - td.indent;
-		int width = td.compSize.x-td.indent;
-		width = Math.min(width, colWidth);
-		int slotHeight = rowHeights[row];
-		RowSpan rowspan = (RowSpan) rowspans.get(control);
-		if (rowspan != null) {
-			slotHeight = 0;
-			for (int i = row; i < row + td.rowspan; i++) {
-				if (i > row)
-					slotHeight += verticalSpacing;
-				slotHeight += rowHeights[i];
-			}
-		}
-		// align horizontally
-		if (td.align == TableWrapData.CENTER) {
-			xloc = x + colWidth / 2 - width / 2;
-		} else if (td.align == TableWrapData.RIGHT) {
-			xloc = x + colWidth - width;
-		} else if (td.align == TableWrapData.FILL) {
-			width = colWidth;
-		}
-		// align vertically
-		if (td.valign == TableWrapData.MIDDLE) {
-			yloc = y + slotHeight / 2 - height / 2;
-		} else if (td.valign == TableWrapData.BOTTOM) {
-			yloc = y + slotHeight - height;
-		} else if (td.valign == TableWrapData.FILL) {
-			height = slotHeight;
-		}
-		control.setBounds(xloc, yloc, width, height);
-	}
-
-	void createGrid(Composite composite) {
-		int row, column, rowFill, columnFill;
-		Control[] children;
-		TableWrapData spacerSpec;
-		Vector growingCols = new Vector();
-		Vector growingRows = new Vector();
-		rowspans = new Hashtable();
-		// 
-		children = composite.getChildren();
-		if (children.length == 0)
-			return;
-		// 
-		grid.addElement(createEmptyRow());
-		row = 0;
-		column = 0;
-		// Loop through the children and place their associated layout specs in
-		// the
-		// grid. Placement occurs left to right, top to bottom (i.e., by row).
-		for (int i = 0; i < children.length; i++) {
-			// Find the first available spot in the grid.
-			Control child = children[i];
-			TableWrapData spec = (TableWrapData) child.getLayoutData();
-			while (((TableWrapData[]) grid.elementAt(row))[column] != null) {
-				column = column + 1;
-				if (column >= numColumns) {
-					row = row + 1;
-					column = 0;
-					if (row >= grid.size()) {
-						grid.addElement(createEmptyRow());
-					}
-				}
-			}
-			// See if the place will support the widget's horizontal span. If
-			// not, go to the
-			// next row.
-			if (column + spec.colspan - 1 >= numColumns) {
-				grid.addElement(createEmptyRow());
-				row = row + 1;
-				column = 0;
-			}
-			// The vertical span for the item will be at least 1. If it is > 1,
-			// add other rows to the grid.
-			if (spec.rowspan > 1) {
-				rowspans.put(child, new RowSpan(child, column, row));
-			}
-			for (int j = 2; j <= spec.rowspan; j++) {
-				if (row + j > grid.size()) {
-					grid.addElement(createEmptyRow());
-				}
-			}
-			// Store the layout spec. Also cache the childIndex. NOTE: That we
-			// assume the children of a
-			// composite are maintained in the order in which they are created
-			// and added to the composite.
-			((TableWrapData[]) grid.elementAt(row))[column] = spec;
-			spec.childIndex = i;
-			if (spec.grabHorizontal) {
-				updateGrowingColumns(growingCols, spec, column);
-			}
-			if (spec.grabVertical) {
-				updateGrowingRows(growingRows, spec, row);
-			}
-			// Put spacers in the grid to account for the item's vertical and
-			// horizontal
-			// span.
-			rowFill = spec.rowspan - 1;
-			columnFill = spec.colspan - 1;
-			for (int r = 1; r <= rowFill; r++) {
-				for (int c = 0; c < spec.colspan; c++) {
-					spacerSpec = new TableWrapData();
-					spacerSpec.isItemData = false;
-					((TableWrapData[]) grid.elementAt(row + r))[column + c] = spacerSpec;
-				}
-			}
-			for (int c = 1; c <= columnFill; c++) {
-				for (int r = 0; r < spec.rowspan; r++) {
-					spacerSpec = new TableWrapData();
-					spacerSpec.isItemData = false;
-					((TableWrapData[]) grid.elementAt(row + r))[column + c] = spacerSpec;
-				}
-			}
-			column = column + spec.colspan - 1;
-		}
-		// Fill out empty grid cells with spacers.
-		for (int k = column + 1; k < numColumns; k++) {
-			spacerSpec = new TableWrapData();
-			spacerSpec.isItemData = false;
-			((TableWrapData[]) grid.elementAt(row))[k] = spacerSpec;
-		}
-		for (int k = row + 1; k < grid.size(); k++) {
-			spacerSpec = new TableWrapData();
-			spacerSpec.isItemData = false;
-			((TableWrapData[]) grid.elementAt(k))[column] = spacerSpec;
-		}
-		growingColumns = new int[growingCols.size()];
-		for (int i = 0; i < growingCols.size(); i++) {
-			growingColumns[i] = ((Integer) growingCols.get(i)).intValue();
-		}
-		this.growingRows = new int[growingRows.size()];
-		for (int i = 0; i < growingRows.size(); i++) {
-			this.growingRows[i] = ((Integer) growingRows.get(i)).intValue();
-		}
-	}
-
-	private void updateGrowingColumns(Vector growingColumns,
-			TableWrapData spec, int column) {
-		int affectedColumn = column + spec.colspan - 1;
-		for (int i = 0; i < growingColumns.size(); i++) {
-			Integer col = (Integer) growingColumns.get(i);
-			if (col.intValue() == affectedColumn)
-				return;
-		}
-		growingColumns.add(new Integer(affectedColumn));
-	}
-
-	private void updateGrowingRows(Vector growingRows, TableWrapData spec,
-			int row) {
-		int affectedRow = row + spec.rowspan - 1;
-		for (int i = 0; i < growingRows.size(); i++) {
-			Integer irow = (Integer) growingRows.get(i);
-			if (irow.intValue() == affectedRow)
-				return;
-		}
-		growingRows.add(new Integer(affectedRow));
-	}
-
-	private TableWrapData[] createEmptyRow() {
-		TableWrapData[] row = new TableWrapData[numColumns];
-		for (int i = 0; i < numColumns; i++)
-			row[i] = null;
-		return row;
-	}
-
-	/**
-	 * @see Layout#computeSize(Composite, int, int, boolean)
-	 */
-	protected Point computeSize(Composite parent, int wHint, int hHint,
-			boolean changed) {
-		Control[] children = parent.getChildren();
-		if (changed) {
-			cache.flush();
-		}
-		if (children.length == 0) {
-			return new Point(0, 0);
-		}
-		cache.setControls(children);
-
-		int parentWidth = wHint;
-		changed = true;
-		initializeIfNeeded(parent, changed);
-		if (initialLayout) {
-			changed = true;
-			initialLayout = false;
-		}
-		if (grid == null || changed) {
-			changed = true;
-			grid = new Vector();
-			createGrid(parent);
-		}
-		resetColumnWidths();
-		int minWidth = internalGetMinimumWidth(parent, changed);
-		int maxWidth = internalGetMaximumWidth(parent, changed);
-		
-		if (wHint == SWT.DEFAULT)
-			parentWidth = maxWidth;
-		
-		int tableWidth = parentWidth;
-		int[] columnWidths;
-		if (parentWidth <= minWidth) {
-			tableWidth = minWidth;
-			if (makeColumnsEqualWidth) {
-				columnWidths = new int[numColumns];
-				for (int i = 0; i < numColumns; i++) {
-					columnWidths[i] = widestColumnWidth;
-				}
-			} else
-				columnWidths = minColumnWidths;
-		} else if (parentWidth >= maxWidth) {
-			if (makeColumnsEqualWidth) {
-				columnWidths = new int[numColumns];
-				int colSpace = parentWidth - leftMargin - rightMargin;
-				colSpace -= (numColumns - 1) * horizontalSpacing;
-				int col = colSpace / numColumns;
-				for (int i = 0; i < numColumns; i++) {
-					columnWidths[i] = col;
-				}
-			} else {
-				tableWidth = maxWidth;
-				columnWidths = maxColumnWidths;
-			}
-		} else {
-			columnWidths = new int[numColumns];
-			if (makeColumnsEqualWidth) {
-				int colSpace = tableWidth - leftMargin - rightMargin;
-				colSpace -= (numColumns - 1) * horizontalSpacing;
-				int col = colSpace / numColumns;
-				for (int i = 0; i < numColumns; i++) {
-					columnWidths[i] = col;
-				}
-			} else {
-				columnWidths = assignExtraSpace(tableWidth, maxWidth, minWidth);
-			}
-		}
-		int totalHeight = 0;
-		int innerHeight = 0;
-		// compute widths
-		for (int i = 0; i < grid.size(); i++) {
-			TableWrapData[] row = (TableWrapData[]) grid.elementAt(i);
-			// assign widths, calculate heights
-			int rowHeight = 0;
-			for (int j = 0; j < numColumns; j++) {
-				TableWrapData td = row[j];
-				if (td.isItemData == false) {
-					continue;
-				}
-				Control child = children[td.childIndex];
-				int span = td.colspan;
-				int cwidth = 0;
-				for (int k = j; k < j + span; k++) {
-					if (k > j)
-						cwidth += horizontalSpacing;
-					cwidth += columnWidths[k];
-				}
-				int cy = td.heightHint;
-				if (cy == SWT.DEFAULT) {
-					Point size = computeSize(td.childIndex, cwidth, td.indent, td.maxWidth, td.maxHeight);
-					cy = size.y;
-				}
-				RowSpan rowspan = (RowSpan) rowspans.get(child);
-				if (rowspan != null) {
-					// don't take the height of this child into acount
-					// because it spans multiple rows
-					rowspan.height = cy;
-				} else {
-					rowHeight = Math.max(rowHeight, cy);
-				}
-			}
-			updateRowSpans(i, rowHeight);
-			if (i > 0)
-				innerHeight += verticalSpacing;
-			innerHeight += rowHeight;
-		}
-		if (!rowspans.isEmpty())
-			innerHeight = compensateForRowSpans(innerHeight);
-		totalHeight = topMargin + innerHeight + bottomMargin;
-		return new Point(tableWidth, totalHeight);
-	}
-
-	private void updateRowSpans(int row, int rowHeight) {
-		if (rowspans == null || rowspans.size() == 0)
-			return;
-		for (Enumeration enm = rowspans.elements(); enm.hasMoreElements();) {
-			RowSpan rowspan = (RowSpan) enm.nextElement();
-			rowspan.update(row, rowHeight);
-		}
-	}
-
-	private int compensateForRowSpans(int totalHeight) {
-		for (Enumeration enm = rowspans.elements(); enm.hasMoreElements();) {
-			RowSpan rowspan = (RowSpan) enm.nextElement();
-			totalHeight += rowspan.getRequiredHeightIncrease();
-		}
-		return totalHeight;
-	}
-
-	int internalGetMinimumWidth(Composite parent, boolean changed) {
-		if (changed)
-			//calculateMinimumColumnWidths(parent, true);
-			calculateColumnWidths(parent, minColumnWidths, false, true);
-		int minimumWidth = 0;
-		widestColumnWidth = 0;
-		if (makeColumnsEqualWidth) {
-			for (int i = 0; i < numColumns; i++) {
-				widestColumnWidth = Math.max(widestColumnWidth,
-						minColumnWidths[i]);
-			}
-		}
-		for (int i = 0; i < numColumns; i++) {
-			if (i > 0)
-				minimumWidth += horizontalSpacing;
-			if (makeColumnsEqualWidth)
-				minimumWidth += widestColumnWidth;
-			else
-				minimumWidth += minColumnWidths[i];
-		}
-		// add margins
-		minimumWidth += leftMargin + rightMargin;
-		return minimumWidth;
-	}
-
-	int internalGetMaximumWidth(Composite parent, boolean changed) {
-		if (changed)
-			//calculateMaximumColumnWidths(parent, true);
-			calculateColumnWidths(parent, maxColumnWidths, true, true);
-		int maximumWidth = 0;
-		for (int i = 0; i < numColumns; i++) {
-			if (i > 0)
-				maximumWidth += horizontalSpacing;
-			maximumWidth += maxColumnWidths[i];
-		}
-		// add margins
-		maximumWidth += leftMargin + rightMargin;
-		return maximumWidth;
-	}
-
-	void resetColumnWidths() {
-		if (minColumnWidths == null)
-			minColumnWidths = new int[numColumns];
-		if (maxColumnWidths == null)
-			maxColumnWidths = new int[numColumns];
-		for (int i = 0; i < numColumns; i++) {
-			minColumnWidths[i] = 0;
-		}
-		for (int i = 0; i < numColumns; i++) {
-			maxColumnWidths[i] = 0;
-		}
-	}
-	
-	void calculateColumnWidths(Composite parent, int [] columnWidths, boolean max, boolean changed) {
-		boolean secondPassNeeded=false;
-		for (int i = 0; i < grid.size(); i++) {
-			TableWrapData[] row = (TableWrapData[]) grid.elementAt(i);
-			for (int j = 0; j < numColumns; j++) {
-				TableWrapData td = row[j];
-				if (td.isItemData == false)
-					continue;
-				
-				if (td.colspan>1) {
-					// we will not do controls with multiple column span
-					// here - increment and continue
-					secondPassNeeded=true;
-					j+=td.colspan-1;
-					continue;
-				}
-
-				SizeCache childCache = cache.getCache(td.childIndex);
-				// !!
-				int width = max?childCache.computeMaximumWidth():childCache.computeMinimumWidth();
-				if (td.maxWidth!=SWT.DEFAULT)
-					width = Math.min(width, td.maxWidth);
-
-				width += td.indent;
-				columnWidths[j] = Math.max(columnWidths[j], width);
-			}
-		}
-		if (!secondPassNeeded) return;
-		
-		// Second pass for controls with multi-column horizontal span
-		for (int i = 0; i < grid.size(); i++) {
-			TableWrapData[] row = (TableWrapData[]) grid.elementAt(i);
-			for (int j = 0; j < numColumns; j++) {
-				TableWrapData td = row[j];
-				if (td.isItemData == false || td.colspan==1)
-					continue;
-
-				SizeCache childCache = cache.getCache(td.childIndex);
-				int width = max?childCache.computeMaximumWidth():childCache.computeMinimumWidth();
-				if (td.maxWidth!=SWT.DEFAULT)
-					width = Math.min(width, td.maxWidth);
-
-				width += td.indent;
-				// check if the current width is enough to
-				// support the control; if not, add the delta to
-				// the last column or to all the growing columns, if present
-				int current = 0;
-				for (int k = j; k < j + td.colspan; k++) {
-					if (k > j)
-						current += horizontalSpacing;
-					current += columnWidths[k];
-				}
-				if (width <= current) {
-					// we are ok - nothing to do here
-				} else {
-					int ndiv = 0;
-					if (growingColumns != null) {
-						for (int k = j; k < j + td.colspan; k++) {
-							if (isGrowingColumn(k)) {
-								ndiv++;
-							}
-						}
-					}
-					if (ndiv == 0) {
-						// add the delta to the last column
-						columnWidths[j + td.colspan - 1] += width
-								- current;
-					} else {
-						// distribute the delta to the growing
-						// columns
-						int percolumn = (width - current) / ndiv;
-						if ((width - current) % ndiv > 0)
-							percolumn++;
-						for (int k = j; k < j + td.colspan; k++) {
-							if (isGrowingColumn(k))
-								columnWidths[k] += percolumn;
-						}
-					}
-				}
-			}
-		}		
-	}	
-	
-	boolean isWrap(Control control) {
-		if (control instanceof Composite
-				&& ((Composite) control).getLayout() instanceof ILayoutExtension)
-			return true;
-		return (control.getStyle() & SWT.WRAP) != 0;
-	}	
-
-	private void initializeIfNeeded(Composite parent, boolean changed) {
-		if (changed)
-			initialLayout = true;
-		if (initialLayout) {
-			initializeLayoutData(parent);
-			initialLayout = false;
-		}
-	}
-
-	void initializeLayoutData(Composite composite) {
-		Control[] children = composite.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			Control child = children[i];
-			if (child.getLayoutData() == null) {
-				child.setLayoutData(new TableWrapData());
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ToggleHyperlink.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ToggleHyperlink.java
deleted file mode 100644
index f1a5ac8..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/ToggleHyperlink.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.forms.events.*;
-import org.eclipse.ui.internal.forms.Messages;
-/**
- * A custom selectable control that can be used to control areas that can be
- * expanded or collapsed.
- * <p>
- * This is an abstract class. Subclasses are responsible for rendering the
- * control using decoration and hover decoration color. Control should be
- * rendered based on the current expansion state.
- * <p>
- * <dl>
- * <dt><b>Styles:</b></dt>
- * <dd>None</dd>
- * </dl>
- * 
- * @since 3.0
- */
-public abstract class ToggleHyperlink extends AbstractHyperlink {
-	protected int innerWidth;
-	protected int innerHeight;
-	protected boolean hover;
-	private boolean expanded;	
-	private Color decorationColor;
-	private Color hoverColor;
-	/**
-	 * Creates a control in a provided composite.
-	 * 
-	 * @param parent
-	 *            the parent
-	 * @param style
-	 *            the style
-	 */
-	public ToggleHyperlink(Composite parent, int style) {
-		super(parent, style);
-		Listener listener = new Listener() {
-			public void handleEvent(Event e) {
-				switch (e.type) {
-					case SWT.MouseEnter:
-						hover=true;
-						redraw();
-						break;
-					case SWT.MouseExit:
-						hover = false;
-						redraw();
-						break;
-					case SWT.KeyDown:
-						onKeyDown(e);
-						break;
-				}
-			}
-		};
-		addListener(SWT.MouseEnter, listener);
-		addListener(SWT.MouseExit, listener);
-		addListener(SWT.KeyDown, listener);
-		addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				setExpanded(!isExpanded());
-			}
-		});
-		initAccessible();
-	}
-	/**
-	 * Sets the color of the decoration.
-	 * 
-	 * @param decorationColor
-	 */
-	public void setDecorationColor(Color decorationColor) {
-		this.decorationColor = decorationColor;
-	}
-	/**
-	 * Returns the color of the decoration.
-	 * 
-	 * @return decoration color
-	 */
-	public Color getDecorationColor() {
-		return decorationColor;
-	}
-	/**
-	 * Sets the hover color of decoration. Hover color will be used when mouse
-	 * enters the decoration area.
-	 * 
-	 * @param hoverColor
-	 *            the hover color to use
-	 */
-	public void setHoverDecorationColor(Color hoverColor) {
-		this.hoverColor = hoverColor;
-	}
-	/**
-	 * Returns the hover color of the decoration.
-	 * 
-	 * @return the hover color of the decoration.
-	 * @since 3.1
-	 */
-	public Color getHoverDecorationColor() {
-		return hoverColor;
-	}
-	
-	/**
-	 * Returns the hover color of the decoration.
-	 * 
-	 * @return the hover color of the decoration.
-	 * @deprecated use <code>getHoverDecorationColor</code>
-	 * @see #getHoverDecorationColor()
-	 */
-	public Color geHoverDecorationColor() {
-		return hoverColor;
-	}
-	/**
-	 * Computes the size of the control.
-	 * 
-	 * @param wHint
-	 *            width hint
-	 * @param hHint
-	 *            height hint
-	 * @param changed
-	 *            if true, flush any saved layout state
-	 */
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		int width, height;
-		/*
-		if (wHint != SWT.DEFAULT)
-			width = wHint;
-		else */
-			width = innerWidth + 2 * marginWidth;
-		/*
-		if (hHint != SWT.DEFAULT)
-			height = hHint;
-		else */
-			height = innerHeight + 2 * marginHeight;
-		return new Point(width, height);
-	}
-	/**
-	 * Returns the expansion state of the toggle control. When toggle is in the
-	 * normal (downward) state, the value is <samp>true </samp>. Collapsed
-	 * control will return <samp>false </samp>.
-	 * 
-	 * @return <samp>false </samp> if collapsed, <samp>true </samp> otherwise.
-	 */
-	public boolean isExpanded() {
-		return expanded;
-	}
-	/**
-	 * Sets the expansion state of the twistie control
-	 * 
-	 * @param expanded the expansion state
-	 */
-	public void setExpanded(boolean expanded) {
-		this.expanded = expanded;
-		redraw();
-	}
-	private void initAccessible() {
-		getAccessible().addAccessibleListener(new AccessibleAdapter() {
-			public void getHelp(AccessibleEvent e) {
-				e.result = getToolTipText();
-			}
-			public void getName(AccessibleEvent e) {
-				e.result = Messages.ToggleHyperlink_accessibleName;
-			}
-			public void getDescription(AccessibleEvent e) {
-				getName(e);
-			}
-		});
-		getAccessible().addAccessibleControlListener(
-				new AccessibleControlAdapter() {
-					public void getChildAtPoint(AccessibleControlEvent e) {
-						Point testPoint = toControl(new Point(e.x, e.y));
-						if (getBounds().contains(testPoint)) {
-							e.childID = ACC.CHILDID_SELF;
-						}
-					}
-					public void getLocation(AccessibleControlEvent e) {
-						Rectangle location = getBounds();
-						Point pt = toDisplay(new Point(location.x, location.y));
-						e.x = pt.x;
-						e.y = pt.y;
-						e.width = location.width;
-						e.height = location.height;
-					}
-					public void getSelection (AccessibleControlEvent e) {
-						if (ToggleHyperlink.this.getSelection()) 
-							e.childID = ACC.CHILDID_SELF;
-					}
-					
-					public void getFocus (AccessibleControlEvent e) {
-						if (ToggleHyperlink.this.getSelection()) 
-							e.childID = ACC.CHILDID_SELF;
-					}					
-					public void getChildCount(AccessibleControlEvent e) {
-						e.detail = 0;
-					}
-					public void getRole(AccessibleControlEvent e) {
-						e.detail = ACC.ROLE_TREE;
-					}
-					public void getState(AccessibleControlEvent e) {
-						e.detail = ToggleHyperlink.this.isExpanded()
-								? ACC.STATE_EXPANDED
-								: ACC.STATE_COLLAPSED;
-					}
-					public void getValue(AccessibleControlEvent e) {
-						if (e.childID == ACC.CHILDID_SELF) {
-							String name = Messages.ToggleHyperlink_accessibleName;
-							if (getParent() instanceof ExpandableComposite) {
-								name = Messages.ToggleHyperlink_accessibleColumn+((ExpandableComposite)getParent()).getText();
-								int index = name.indexOf('&');
-								if (index != -1) {
-									name = name.substring(0, index) + name.substring(index + 1);
-								}
-							}
-							e.result = name;
-						}
-					}
-				});
-	}
-	// set bogus childIDs on link activation to ensure state is read on expand/collapse
-	void triggerAccessible() {
-		getAccessible().setFocus(getAccessibleChildID());
-	}
-	private int getAccessibleChildID() {
-		return ToggleHyperlink.this.isExpanded() ? 1 : 2;
-	}
-	
-	private void onKeyDown(Event e) {
-		if (e.keyCode==SWT.ARROW_RIGHT) {
-			// expand if collapsed
-			if (!isExpanded()) {
-				handleActivate(e);
-			}
-			e.doit=false;
-		}
-		else if (e.keyCode==SWT.ARROW_LEFT) {
-			// collapse if expanded
-			if (isExpanded()) {
-				handleActivate(e);
-			}
-			e.doit=false;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/TreeNode.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/TreeNode.java
deleted file mode 100644
index 26c98d6..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/TreeNode.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.Composite;
-/**
- * A custom selectable control that can be used to control areas that can be
- * expanded or collapsed. The control control can be toggled between selected
- * and deselected state with a mouse or by pressing 'Enter' while the control
- * has focus.
- * <p>
- * The control is rendered as box with a '+' or '-' sign, depending on the
- * expansion state. Focus indication is rendered around the box when the
- * control has keyboard focus.
- * <p>
- * <dl>
- * <dt><b>Styles:</b></dt>
- * <dd>None</dd>
- * </dl>
- * 
- * @see Twistie
- * @since 3.0
- */
-public class TreeNode extends ToggleHyperlink {
-	/**
-	 * Creates a control in a provided composite.
-	 * 
-	 * @param parent
-	 *            the parent
-	 * @param style
-	 *            the style
-	 */
-	public TreeNode(Composite parent, int style) {
-		super(parent, style);
-		innerWidth = 10;
-		innerHeight = 10;
-	}
-	protected void paint(PaintEvent e) {
-		paintHyperlink(e.gc);
-	}
-	protected void paintHyperlink(GC gc) {
-		Rectangle box = getBoxBounds(gc);
-		gc.setForeground(getDisplay().getSystemColor(
-				SWT.COLOR_WIDGET_NORMAL_SHADOW));
-		gc.drawRectangle(box);
-		gc.setForeground(getForeground());
-		gc.drawLine(box.x + 2, box.y + 4, box.x + 6, box.y + 4);
-		if (!isExpanded()) {
-			gc.drawLine(box.x + 4, box.y + 2, box.x + 4, box.y + 6);
-		}
-		if (paintFocus && getSelection()) {
-			gc.setForeground(getForeground());
-			gc.drawFocus(box.x - 1, box.y - 1, box.width + 3, box.height + 3);
-		}
-	}
-	private Rectangle getBoxBounds(GC gc) {
-		int x = 1;
-		int y = 0;
-		gc.setFont(getFont());
-		//int height = gc.getFontMetrics().getHeight();
-		//y = height / 2 - 4;
-		//y = Math.max(y, 0);
-		y = 2;
-		return new Rectangle(x, y, 8, 8);
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/Twistie.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/Twistie.java
deleted file mode 100644
index 1c7bca6..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/Twistie.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.widgets;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A custom selectable control that can be used to control areas that can be
- * expanded or collapsed. The control control can be toggled between selected
- * and deselected state with a mouse or by pressing 'Enter' while the control
- * has focus.
- * <p>
- * The control is rendered as a triangle that points to the right in the
- * collapsed and down in the expanded state. Triangle color can be changed.
- * <p>
- * <dl>
- * <dt><b>Styles:</b></dt>
- * <dd>None</dd>
- * </dl>
- * 
- * @see TreeNode
- * @since 3.0
- */
-public class Twistie extends ToggleHyperlink {
-	private static final int[] onPoints = { 0, 2, 8, 2, 4, 6 };
-
-	private static final int[] offPoints = { 2, -1, 2, 8, 6, 4 };
-
-	/**
-	 * Creates a control in a provided composite.
-	 * 
-	 * @param parent
-	 *            the parent
-	 * @param style
-	 *            the style
-	 */
-	public Twistie(Composite parent, int style) {
-		super(parent, style);
-		innerWidth = 9;
-		innerHeight = 9;
-	}
-
-	/*
-	 * @see SelectableControl#paint(GC)
-	 */
-	protected void paintHyperlink(GC gc) {
-		Color bg;
-		if (!isEnabled())
-			bg = getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW);
-		else if (hover && getHoverDecorationColor() != null)
-			bg = getHoverDecorationColor();
-		else if (getDecorationColor() != null)
-			bg = getDecorationColor();
-		else
-			bg = getForeground();
-		gc.setBackground(bg);
-		int[] data;
-		Point size = getSize();
-		int x = (size.x - 9) / 2;
-		int y = (size.y - 9) / 2;
-		if (isExpanded())
-			data = translate(onPoints, x, y);
-		else
-			data = translate(offPoints, x, y);
-		gc.fillPolygon(data);
-		gc.setBackground(getBackground());
-	}
-
-	private int[] translate(int[] data, int x, int y) {
-		int[] target = new int[data.length];
-		for (int i = 0; i < data.length; i += 2) {
-			target[i] = data[i] + x;
-		}
-		for (int i = 1; i < data.length; i += 2) {
-			target[i] = data[i] + y;
-		}
-		return target;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.widgets.Control#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-		super.setEnabled(enabled);
-		redraw();
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/package.html b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/package.html
deleted file mode 100644
index 2ec1b59..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/forms/widgets/package.html
+++ /dev/null
@@ -1,13 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Custom widgets and controls for forms-based parts.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/FormsPlugin.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/FormsPlugin.java
deleted file mode 100644
index 7fdaec6..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/FormsPlugin.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms;
-
-import org.eclipse.ui.internal.forms.widgets.FormsResources;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-public class FormsPlugin extends AbstractUIPlugin {
-
-	public FormsPlugin() {
-	}
-	
-	public void stop(BundleContext context) throws Exception {
-		try {
-			FormsResources.shutdown();
-		} finally {
-			super.stop(context);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/IMessageToolTipManager.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/IMessageToolTipManager.java
deleted file mode 100644
index 95ab2f3..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/IMessageToolTipManager.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.ui.internal.forms;
-
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.IMessageManager;
-import org.eclipse.ui.forms.widgets.Form;
-
-/**
- * The classes that implement this interface are responsible for managing custom
- * tool tips for message-related controls in the form header. By default, a
- * simple manager is installed by the form that uses the built-in widget tool
- * tips for this purpose. Clients can replace this behaviour with richer tool
- * tips that show images, links and other content.
- * <p>
- * The message-related controls in the header are:
- * <ul>
- * <li>Image label - used to replace the form title image with the message type
- * image</li>
- * <li>Message label - renders the message as a static text.</li>
- * <li>Message hyperlink - renders the message as a hyperlink.</li>
- * </ul>
- * The message manager will be asked to create the tool tip for any and all of
- * the controls listed above in its factory method. After that, it will be asked
- * to update whenever the message information changes in the form. For this
- * reason, the manager is expected to retain references to the tool tips and
- * update them with new content when asked.
- * 
- * @see IMessageManager
- * @see Form
- *      <p>
- *      <strong>EXPERIMENTAL</strong>. This class or interface has been added
- *      as part of a work in progress. There is no guarantee that this API will
- *      work or that it will remain the same. Please do not use this API without
- *      consulting with the Platform UA team.
- *      </p>
- * @since 3.3
- */
-public interface IMessageToolTipManager {
-	/**
-	 * Creates the custom tool tip for the provided control.
-	 * 
-	 * @param control
-	 *            the control for which to create a custom tool tip
-	 * @param imageControl
-	 *            <code>true</code> if the control is used to render the title
-	 *            image, <code>false</code> otherwise.
-	 */
-	void createToolTip(Control control, boolean imageControl);
-
-	/**
-	 * Updates all the managed tool tips. The manager should get the current
-	 * message, message type and optional children messages from the form to
-	 * update the custom tool tips.
-	 */
-	void update();
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/MessageManager.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/MessageManager.java
deleted file mode 100644
index bcafee7..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/MessageManager.java
+++ /dev/null
@@ -1,706 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Benjamin Cabe (benjamin.cabe@anyware-tech.com) - patch (see Bugzilla #255466) 
- ******************************************************************************/
-
-package org.eclipse.ui.internal.forms;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.Map.Entry;
-
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.fieldassist.ControlDecoration;
-import org.eclipse.jface.fieldassist.FieldDecoration;
-import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.forms.IMessage;
-import org.eclipse.ui.forms.IMessageManager;
-import org.eclipse.ui.forms.IMessagePrefixProvider;
-import org.eclipse.ui.forms.widgets.Form;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-/**
- * @see IMessageManager
- */
-
-public class MessageManager implements IMessageManager {
-	private static final DefaultPrefixProvider DEFAULT_PREFIX_PROVIDER = new DefaultPrefixProvider();
-	private ArrayList messages = new ArrayList();
-	private ArrayList oldMessages;
-	private Hashtable decorators = new Hashtable();
-	private Hashtable oldDecorators;
-	private boolean autoUpdate = true;
-	private Form form;
-	private IMessagePrefixProvider prefixProvider = DEFAULT_PREFIX_PROVIDER;
-	private int decorationPosition = SWT.LEFT | SWT.BOTTOM;
-	private static FieldDecoration standardError = FieldDecorationRegistry
-			.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_ERROR);
-	private static FieldDecoration standardWarning = FieldDecorationRegistry
-			.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_WARNING);
-	private static FieldDecoration standardInformation = FieldDecorationRegistry
-	.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_INFORMATION);
-
-	private static final String[] SINGLE_MESSAGE_SUMMARY_KEYS = {
-			Messages.MessageManager_sMessageSummary,
-			Messages.MessageManager_sMessageSummary,
-			Messages.MessageManager_sWarningSummary,
-			Messages.MessageManager_sErrorSummary };
-
-	private static final String[] MULTIPLE_MESSAGE_SUMMARY_KEYS = {
-			Messages.MessageManager_pMessageSummary,
-			Messages.MessageManager_pMessageSummary,
-			Messages.MessageManager_pWarningSummary,
-			Messages.MessageManager_pErrorSummary };
-
-	static class Message implements IMessage {
-		Control control;
-		Object data;
-		Object key;
-		String message;
-		int type;
-		String prefix;
-
-		Message(Object key, String message, int type, Object data) {
-			this.key = key;
-			this.message = message;
-			this.type = type;
-			this.data = data;
-		}
-		
-		private Message(Message message) {
-			this.key = message.key;
-			this.message = message.message;
-			this.type = message.type;
-			this.data = message.data;
-			this.prefix = message.prefix;
-			this.control = message.control;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.dialogs.IMessage#getKey()
-		 */
-		public Object getKey() {
-			return key;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.dialogs.IMessageProvider#getMessage()
-		 */
-		public String getMessage() {
-			return message;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.dialogs.IMessageProvider#getMessageType()
-		 */
-		public int getMessageType() {
-			return type;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.forms.messages.IMessage#getControl()
-		 */
-		public Control getControl() {
-			return control;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.forms.messages.IMessage#getData()
-		 */
-		public Object getData() {
-			return data;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.forms.messages.IMessage#getPrefix()
-		 */
-		public String getPrefix() {
-			return prefix;
-		}
-		
-		public boolean equals(Object obj) {
-			if (!(obj instanceof Message))
-				return false;
-			Message msg = (Message) obj;
-			return (msg.getPrefix() == null ? getPrefix() == null : msg.getPrefix().equals(getPrefix())) &&
-					(msg.getControl() == null ? getControl() == null : msg.getControl().equals(getControl())) &&
-					(msg.getMessageType() == getMessageType()) &&
-					(msg.getMessage() == null ? getMessage() == null : msg.getMessage().equals(getMessage())) &&
-					msg.getKey().equals(getKey());
-		}
-	}
-
-	static class DefaultPrefixProvider implements IMessagePrefixProvider {
-
-		public String getPrefix(Control c) {
-			Composite parent = c.getParent();
-			Control[] siblings = parent.getChildren();
-			for (int i = 0; i < siblings.length; i++) {
-				if (siblings[i] == c) {
-					// this is us - go backward until you hit
-					// a label-like widget
-					for (int j = i - 1; j >= 0; j--) {
-						Control label = siblings[j];
-						String ltext = null;
-						if (label instanceof Label) {
-							ltext = ((Label) label).getText();
-						} else if (label instanceof Hyperlink) {
-							ltext = ((Hyperlink) label).getText();
-						} else if (label instanceof CLabel) {
-							ltext = ((CLabel) label).getText();
-						}
-						if (ltext != null) {
-							if (!ltext.endsWith(":")) //$NON-NLS-1$
-								return ltext + ": "; //$NON-NLS-1$
-							return ltext + " "; //$NON-NLS-1$
-						}
-					}
-					break;
-				}
-			}
-			return null;
-		}
-	}
-
-	class ControlDecorator {
-		private ControlDecoration decoration;
-		private ArrayList controlMessages = new ArrayList();
-		private String prefix;
-
-		ControlDecorator(Control control) {
-			this.decoration = new ControlDecoration(control, decorationPosition, form.getBody());
-		}
-		
-		private ControlDecorator (ControlDecorator cd) {
-			this.decoration = cd.decoration;
-			this.prefix = cd.prefix;
-			for (Iterator i = cd.controlMessages.iterator(); i.hasNext();)
-				this.controlMessages.add(new Message((Message)i.next()));
-		}
-
-		public boolean isDisposed() {
-			return decoration.getControl() == null;
-		}
-
-		void updatePrefix() {
-			prefix = null;
-		}
-
-		void updatePosition() {
-			Control control = decoration.getControl();
-			decoration.dispose();
-			this.decoration = new ControlDecoration(control, decorationPosition, form.getBody());
-			update();
-		}
-
-		String getPrefix() {
-			if (prefix == null)
-				createPrefix();
-			return prefix;
-		}
-
-		private void createPrefix() {
-			if (prefixProvider == null) {
-				prefix = ""; //$NON-NLS-1$
-				return;
-			}
-			prefix = prefixProvider.getPrefix(decoration.getControl());
-			if (prefix == null)
-				// make a prefix anyway
-				prefix = ""; //$NON-NLS-1$
-		}
-
-		void addAll(ArrayList target) {
-			target.addAll(controlMessages);
-		}
-
-		void addMessage(Object key, String text, Object data, int type) {
-			Message message = MessageManager.this.addMessage(getPrefix(), key,
-					text, data, type, controlMessages);
-			message.control = decoration.getControl();
-			if (isAutoUpdate())
-				update();
-		}
-
-		boolean removeMessage(Object key) {
-			Message message = findMessage(key, controlMessages);
-			if (message != null) {
-				controlMessages.remove(message);
-				if (isAutoUpdate())
-					update();
-			}
-			return message != null;
-		}
-
-		boolean removeMessages() {
-			if (controlMessages.isEmpty())
-				return false;
-			controlMessages.clear();
-			if (isAutoUpdate())
-				update();
-			return true;
-		}
-
-		public void update() {
-			if (controlMessages.isEmpty()) {
-				decoration.setDescriptionText(null);
-				decoration.hide();
-			} else {
-				ArrayList peers = createPeers(controlMessages);
-				int type = ((IMessage) peers.get(0)).getMessageType();
-				String description = createDetails(createPeers(peers), true);
-				if (type == IMessageProvider.ERROR)
-					decoration.setImage(standardError.getImage());
-				else if (type == IMessageProvider.WARNING)
-					decoration.setImage(standardWarning.getImage());
-				else if (type == IMessageProvider.INFORMATION)
-					decoration.setImage(standardInformation.getImage());
-				decoration.setDescriptionText(description);
-				decoration.show();
-			}
-		}
-		
-		public boolean equals(Object obj) {
-			if (!(obj instanceof ControlDecorator))
-				return false;
-			ControlDecorator cd = (ControlDecorator) obj;
-			if (!cd.decoration.equals(decoration))
-				return false;
-			return cd.getPrefix().equals(getPrefix());
-		}
-		
-		boolean hasSameMessages(ControlDecorator cd) {
-			if (cd.controlMessages.size() != controlMessages.size())
-				return false;
-			if (!cd.controlMessages.containsAll(controlMessages))
-				return false;
-			return true;
-		}
-	}
-
-	/**
-	 * Creates a new instance of the message manager that will work with the
-	 * provided form.
-	 * 
-	 * @param scrolledForm
-	 *            the form to control
-	 */
-	public MessageManager(ScrolledForm scrolledForm) {
-		this.form = scrolledForm.getForm();
-	}
-
-	/**
-	 * Creates a new instance of the message manager that will work with the
-	 * provided form.
-	 * 
-	 * @param form
-	 *            the form to control
-	 * @since org.eclipse.ui.forms 3.4
-	 */
-	public MessageManager(Form form) {
-		this.form = form;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IMessageManager#addMessage(java.lang.Object,
-	 *      java.lang.String, int)
-	 */
-	public void addMessage(Object key, String messageText, Object data, int type) {
-		addMessage(null, key, messageText, data, type, messages);
-		if (isAutoUpdate())
-			updateForm();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IMessageManager#addMessage(java.lang.Object,
-	 *      java.lang.String, int, org.eclipse.swt.widgets.Control)
-	 */
-	public void addMessage(Object key, String messageText, Object data,
-			int type, Control control) {
-		ControlDecorator dec = (ControlDecorator) decorators.get(control);
-
-		if (dec == null) {
-			dec = new ControlDecorator(control);
-			decorators.put(control, dec);
-		}
-		dec.addMessage(key, messageText, data, type);
-		if (isAutoUpdate())
-			updateForm();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IMessageManager#removeMessage(java.lang.Object)
-	 */
-	public void removeMessage(Object key) {
-		Message message = findMessage(key, messages);
-		if (message != null) {
-			messages.remove(message);
-			if (isAutoUpdate())
-				updateForm();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IMessageManager#removeMessages()
-	 */
-	public void removeMessages() {
-		if (!messages.isEmpty()) {
-			messages.clear();
-			if (isAutoUpdate())
-				updateForm();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IMessageManager#removeMessage(java.lang.Object,
-	 *      org.eclipse.swt.widgets.Control)
-	 */
-	public void removeMessage(Object key, Control control) {
-		ControlDecorator dec = (ControlDecorator) decorators.get(control);
-		if (dec == null)
-			return;
-		if (dec.removeMessage(key))
-			if (isAutoUpdate())
-				updateForm();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IMessageManager#removeMessages(org.eclipse.swt.widgets.Control)
-	 */
-	public void removeMessages(Control control) {
-		ControlDecorator dec = (ControlDecorator) decorators.get(control);
-		if (dec != null) {
-			if (dec.removeMessages()) {
-				if (isAutoUpdate())
-					updateForm();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IMessageManager#removeAllMessages()
-	 */
-	public void removeAllMessages() {
-		boolean needsUpdate = false;
-		for (Enumeration enm = decorators.elements(); enm.hasMoreElements();) {
-			ControlDecorator control = (ControlDecorator) enm.nextElement();
-			if (control.removeMessages())
-				needsUpdate = true;
-		}
-		if (!messages.isEmpty()) {
-			messages.clear();
-			needsUpdate = true;
-		}
-		if (needsUpdate && isAutoUpdate())
-			updateForm();
-	}
-
-	/*
-	 * Adds the message if it does not already exist in the provided list.
-	 */
-
-	private Message addMessage(String prefix, Object key, String messageText,
-			Object data, int type, ArrayList list) {
-		Message message = findMessage(key, list);
-		if (message == null) {
-			message = new Message(key, messageText, type, data);
-			message.prefix = prefix;
-			list.add(message);
-		} else {
-			message.message = messageText;
-			message.type = type;
-			message.data = data;
-		}
-		return message;
-	}
-
-	/*
-	 * Finds the message with the provided key in the provided list.
-	 */
-
-	private Message findMessage(Object key, ArrayList list) {
-		for (int i = 0; i < list.size(); i++) {
-			Message message = (Message) list.get(i);
-			if (message.getKey().equals(key))
-				return message;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IMessageManager#update()
-	 */
-	public void update() {
-		// Update decorations
-		for (Iterator iter = decorators.values().iterator(); iter.hasNext();) {
-			ControlDecorator dec = (ControlDecorator) iter.next();
-			dec.update();
-		}
-		// Update the form
-		updateForm();
-	}
-
-	/*
-	 * Updates the container by rolling the messages up from the controls.
-	 */
-
-	private void updateForm() {
-		ArrayList mergedList = new ArrayList();
-		mergedList.addAll(messages);
-		for (Enumeration enm = decorators.elements(); enm.hasMoreElements();) {
-			ControlDecorator dec = (ControlDecorator) enm.nextElement();
-			dec.addAll(mergedList);
-		}
-		update(mergedList);
-	}
-
-	private void update(ArrayList mergedList) {
-		pruneControlDecorators();
-		if (form.getHead().getBounds().height == 0 || mergedList.isEmpty() || mergedList == null) {
-			form.setMessage(null, IMessageProvider.NONE);
-			return;
-		}
-		ArrayList peers = createPeers(mergedList);
-		int maxType = ((IMessage) peers.get(0)).getMessageType();
-		String messageText;
-		IMessage[] array = (IMessage[]) peers
-				.toArray(new IMessage[peers.size()]);
-		if (peers.size() == 1 && ((Message) peers.get(0)).prefix == null) {
-			// a single message
-			IMessage message = (IMessage) peers.get(0);
-			messageText = message.getMessage();
-			form.setMessage(messageText, maxType, array);
-		} else {
-			// show a summary message for the message
-			// and list of errors for the details
-			if (peers.size() > 1)
-				messageText = Messages.bind(
-						MULTIPLE_MESSAGE_SUMMARY_KEYS[maxType],
-						new String[] { peers.size() + "" }); //$NON-NLS-1$
-			else
-				messageText = SINGLE_MESSAGE_SUMMARY_KEYS[maxType];
-			form.setMessage(messageText, maxType, array);
-		}
-	}
-
-	private static String getFullMessage(IMessage message) {
-		if (message.getPrefix() == null)
-			return message.getMessage();
-		return message.getPrefix() + message.getMessage();
-	}
-
-	private ArrayList createPeers(ArrayList messages) {
-		ArrayList peers = new ArrayList();
-		int maxType = 0;
-		for (int i = 0; i < messages.size(); i++) {
-			Message message = (Message) messages.get(i);
-			if (message.type > maxType) {
-				peers.clear();
-				maxType = message.type;
-			}
-			if (message.type == maxType)
-				peers.add(message);
-		}
-		return peers;
-	}
-
-	private String createDetails(ArrayList messages, boolean excludePrefix) {
-		StringWriter sw = new StringWriter();
-		PrintWriter out = new PrintWriter(sw);
-
-		for (int i = 0; i < messages.size(); i++) {
-			if (i > 0)
-				out.println();
-			IMessage m = (IMessage) messages.get(i);
-			out.print(excludePrefix ? m.getMessage() : getFullMessage(m));
-		}
-		out.flush();
-		return sw.toString();
-	}
-
-	public static String createDetails(IMessage[] messages) {
-		if (messages == null || messages.length == 0)
-			return null;
-		StringWriter sw = new StringWriter();
-		PrintWriter out = new PrintWriter(sw);
-
-		for (int i = 0; i < messages.length; i++) {
-			if (i > 0)
-				out.println();
-			out.print(getFullMessage(messages[i]));
-		}
-		out.flush();
-		return sw.toString();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IMessageManager#createSummary(org.eclipse.ui.forms.IMessage[])
-	 */
-	public String createSummary(IMessage[] messages) {
-		return createDetails(messages);
-	}
-
-	private void pruneControlDecorators() {
-		for (Iterator iter = decorators.values().iterator(); iter.hasNext();) {
-			ControlDecorator dec = (ControlDecorator) iter.next();
-			if (dec.isDisposed())
-				iter.remove();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IMessageManager#getMessagePrefixProvider()
-	 */
-	public IMessagePrefixProvider getMessagePrefixProvider() {
-		return prefixProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IMessageManager#setMessagePrefixProvider(org.eclipse.ui.forms.IMessagePrefixProvider)
-	 */
-	public void setMessagePrefixProvider(IMessagePrefixProvider provider) {
-		this.prefixProvider = provider;
-		for (Iterator iter = decorators.values().iterator(); iter.hasNext();) {
-			ControlDecorator dec = (ControlDecorator) iter.next();
-			dec.updatePrefix();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IMessageManager#getDecorationPosition()
-	 */
-	public int getDecorationPosition() {
-		return decorationPosition;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IMessageManager#setDecorationPosition(int)
-	 */
-	public void setDecorationPosition(int position) {
-		this.decorationPosition = position;
-		for (Iterator iter = decorators.values().iterator(); iter.hasNext();) {
-			ControlDecorator dec = (ControlDecorator) iter.next();
-			dec.updatePosition();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IMessageManager#isAutoUpdate()
-	 */
-	public boolean isAutoUpdate() {
-		return autoUpdate;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.IMessageManager#setAutoUpdate(boolean)
-	 */
-	public void setAutoUpdate(boolean autoUpdate) {
-		boolean needsCaching = this.autoUpdate && !autoUpdate;
-		boolean needsUpdate = !this.autoUpdate && autoUpdate;
-		this.autoUpdate = autoUpdate;
-		if (needsUpdate && isCacheChanged())
-			update();
-		if (needsCaching) {
-			oldMessages = new ArrayList();
-			for (Iterator i = messages.iterator(); i.hasNext();)
-				oldMessages.add(new Message((Message)i.next()));
-			oldDecorators = new Hashtable();
-			for (Enumeration e = decorators.keys(); e.hasMoreElements();) {
-				Object key = e.nextElement();
-				oldDecorators.put(key, new ControlDecorator((ControlDecorator)decorators.get(key)));
-			}
-		}
-	}
-	
-	private boolean isCacheChanged() {
-		boolean result = false;
-		result = checkMessageCache() || checkDecoratorCache();
-		oldMessages.clear();
-		oldMessages = null;
-		oldDecorators.clear();
-		oldDecorators = null;
-		return result;
-	}
-	
-	private boolean checkMessageCache() {
-		if (oldMessages == null)
-			return false;
-		if (messages.size() != oldMessages.size())
-			return true;
-		if (!oldMessages.containsAll(messages))
-			return true;
-		return false;
-	}
-	
-	private boolean checkDecoratorCache() {
-		if (oldDecorators == null)
-			return false;
-		for (Iterator i = decorators.entrySet().iterator(); i.hasNext();) {
-			Entry next = (Entry)i.next();
-			ControlDecorator cd = (ControlDecorator)next.getValue();
-			ControlDecorator oldCd = (ControlDecorator) oldDecorators.get(cd.decoration.getControl());
-			if ((oldCd == null && cd.controlMessages.size() > 0) || (oldCd != null && !cd.hasSameMessages(oldCd)))
-				return true;
-		}
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/Messages.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/Messages.java
deleted file mode 100644
index df0112b..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/Messages.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.forms.Messages"; //$NON-NLS-1$
-
-	private Messages() {
-	}
-
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	public static String FormDialog_defaultTitle;
-	public static String FormText_copy;
-	public static String Form_tooltip_minimize;
-	public static String Form_tooltip_restore;
-	/* 
-	 * Message manager
-	 */
-	public static String MessageManager_sMessageSummary;
-	public static String MessageManager_sWarningSummary;
-	public static String MessageManager_sErrorSummary;
-	public static String MessageManager_pMessageSummary;
-	public static String MessageManager_pWarningSummary;
-	public static String MessageManager_pErrorSummary;
-	public static String ToggleHyperlink_accessibleColumn;
-	public static String ToggleHyperlink_accessibleName;		
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/Messages.properties b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/Messages.properties
deleted file mode 100644
index 8dd12fa..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/Messages.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-FormText_copy=&Copy
-Form_tooltip_minimize=Minimize
-FormDialog_defaultTitle=Form Dialog
-Form_tooltip_restore=Restore
-
-#Message manager
-MessageManager_sMessageSummary = 1 message detected
-MessageManager_sWarningSummary = 1 warning detected
-MessageManager_sErrorSummary = 1 error detected
-MessageManager_pMessageSummary = {0} messages detected 
-MessageManager_pWarningSummary = {0} warnings detected
-MessageManager_pErrorSummary = {0} errors detected
-ToggleHyperlink_accessibleName=Expandable
-ToggleHyperlink_accessibleColumn=: 
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/AggregateHyperlinkSegment.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/AggregateHyperlinkSegment.java
deleted file mode 100644
index 839e9a7..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/AggregateHyperlinkSegment.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.Hashtable;
-import java.util.Vector;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Rectangle;
-
-/**
- * This segment contains a collection of images and links that all belong to one
- * logical hyperlink.
- */
-public class AggregateHyperlinkSegment extends ParagraphSegment implements
-		IHyperlinkSegment {
-	private String href;
-
-	private Vector segments = new Vector();
-
-	public AggregateHyperlinkSegment() {
-	}
-
-	public void add(TextHyperlinkSegment segment) {
-		segments.add(segment);
-	}
-
-	public void add(ImageHyperlinkSegment segment) {
-		segments.add(segment);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.forms.widgets.ParagraphSegment#advanceLocator(org.eclipse.swt.graphics.GC,
-	 *      int, org.eclipse.ui.internal.forms.widgets.Locator,
-	 *      java.util.Hashtable, boolean)
-	 */
-	public boolean advanceLocator(GC gc, int wHint, Locator loc,
-			Hashtable objectTable, boolean computeHeightOnly) {
-		boolean newLine = false;
-		for (int i = 0; i < segments.size(); i++) {
-			ParagraphSegment segment = (ParagraphSegment) segments.get(i);
-			if (segment.advanceLocator(gc, wHint, loc, objectTable,
-					computeHeightOnly))
-				newLine = true;
-		}
-		return newLine;
-	}
-
-	/**
-	 * @return Returns the href.
-	 */
-	public String getHref() {
-		return href;
-	}
-
-	/**
-	 * @param href
-	 *            The href to set.
-	 */
-	public void setHref(String href) {
-		this.href = href;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.forms.widgets.IHyperlinkSegment#repaint(org.eclipse.swt.graphics.GC,
-	 *      boolean)
-	 */
-	public void paint(GC gc, boolean hover, Hashtable resourceTable,
-			boolean selected, SelectionData selData, Rectangle repaintRegion) {
-		for (int i = 0; i < segments.size(); i++) {
-			ParagraphSegment segment = (ParagraphSegment) segments.get(i);
-			segment.paint(gc, hover, resourceTable, selected, selData,
-					repaintRegion);
-		}
-	}
-
-	public String getText() {
-		StringBuffer buf = new StringBuffer();
-		for (int i = 0; i < segments.size(); i++) {
-			IHyperlinkSegment segment = (IHyperlinkSegment) segments.get(i);
-			buf.append(segment.getText());
-		}
-		return buf.toString();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.forms.widgets.IHyperlinkSegment#paintFocus(org.eclipse.swt.graphics.GC,
-	 *      org.eclipse.swt.graphics.Color, org.eclipse.swt.graphics.Color,
-	 *      boolean)
-	 */
-	public void paintFocus(GC gc, Color bg, Color fg, boolean selected,
-			Rectangle repaintRegion) {
-		for (int i = 0; i < segments.size(); i++) {
-			IHyperlinkSegment segment = (IHyperlinkSegment) segments.get(i);
-			segment.paintFocus(gc, bg, fg, selected, repaintRegion);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.forms.widgets.IHyperlinkSegment#getBounds()
-	 */
-	public Rectangle getBounds() {
-		Rectangle bounds = new Rectangle(Integer.MAX_VALUE, Integer.MAX_VALUE,
-				0, 0);
-		// TODO this is wrong
-		for (int i = 0; i < segments.size(); i++) {
-			IHyperlinkSegment segment = (IHyperlinkSegment) segments.get(i);
-			Rectangle sbounds = segment.getBounds();
-			bounds.x = Math.min(bounds.x, sbounds.x);
-			bounds.y = Math.min(bounds.y, sbounds.y);
-			bounds.width = Math.max(bounds.width, sbounds.width);
-			bounds.height = Math.max(bounds.height, sbounds.height);
-		}
-		return bounds;
-	}
-
-	public boolean contains(int x, int y) {
-		for (int i = 0; i < segments.size(); i++) {
-			IHyperlinkSegment segment = (IHyperlinkSegment) segments.get(i);
-			if (segment.contains(x, y))
-				return true;
-		}
-		return false;
-	}
-
-	public boolean intersects(Rectangle rect) {
-		for (int i = 0; i < segments.size(); i++) {
-			IHyperlinkSegment segment = (IHyperlinkSegment) segments.get(i);
-			if (segment.intersects(rect))
-				return true;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.forms.widgets.ParagraphSegment#layout(org.eclipse.swt.graphics.GC,
-	 *      int, org.eclipse.ui.internal.forms.widgets.Locator,
-	 *      java.util.Hashtable, boolean,
-	 *      org.eclipse.ui.internal.forms.widgets.SelectionData)
-	 */
-	public void layout(GC gc, int width, Locator locator,
-			Hashtable resourceTable, boolean selected) {
-		for (int i = 0; i < segments.size(); i++) {
-			ParagraphSegment segment = (ParagraphSegment) segments.get(i);
-			segment.layout(gc, width, locator, resourceTable, selected);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.forms.widgets.ParagraphSegment#computeSelection(org.eclipse.swt.graphics.GC,
-	 *      java.util.Hashtable, boolean,
-	 *      org.eclipse.ui.internal.forms.widgets.SelectionData)
-	 */
-	public void computeSelection(GC gc, Hashtable resourceTable,
-			SelectionData selData) {
-		for (int i = 0; i < segments.size(); i++) {
-			ParagraphSegment segment = (ParagraphSegment) segments.get(i);
-			segment.computeSelection(gc, resourceTable, selData);
-		}
-	}
-
-	public void clearCache(String fontId) {
-		for (int i = 0; i < segments.size(); i++) {
-			ParagraphSegment segment = (ParagraphSegment) segments.get(i);
-			segment.clearCache(fontId);
-		}
-	}
-
-	public String getTooltipText() {
-		if (segments.size() > 0)
-			return ((ParagraphSegment) segments.get(0)).getTooltipText();
-		return super.getTooltipText();
-	}
-
-	public boolean isFocusSelectable(Hashtable resourceTable) {
-		return true;
-	}
-
-	public boolean setFocus(Hashtable resourceTable, boolean direction) {
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/BreakSegment.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/BreakSegment.java
deleted file mode 100644
index 57bcf54..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/BreakSegment.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.Hashtable;
-
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Rectangle;
-
-/**
- * This segment serves as break within a paragraph. It has no data -
- * just starts a new line and resets the locator.
- */
-
-public class BreakSegment extends ParagraphSegment {
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.internal.widgets.ParagraphSegment#advanceLocator(org.eclipse.swt.graphics.GC, int, org.eclipse.ui.forms.internal.widgets.Locator, java.util.Hashtable)
-	 */
-	public boolean advanceLocator(GC gc, int wHint, Locator locator,
-			Hashtable objectTable, boolean computeHeightOnly) {
-		if (locator.rowHeight==0) {
-			FontMetrics fm = gc.getFontMetrics();
-			locator.rowHeight = fm.getHeight();
-		}
-		if (computeHeightOnly) locator.collectHeights();		
-		locator.resetCaret();
-		locator.width = locator.x;
-		locator.y += locator.rowHeight;
-		locator.rowHeight = 0;
-		locator.leading = 0;
-		return true;
-	}
-
-	public void paint(GC gc, boolean hover, Hashtable resourceTable, boolean selected, SelectionData selData, Rectangle repaintRegion) {
-		//nothing to paint
-	}
-	public boolean contains(int x, int y) {
-		return false;
-	}
-	public boolean intersects(Rectangle rect) {
-		return false;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.forms.widgets.ParagraphSegment#layout(org.eclipse.swt.graphics.GC, int, org.eclipse.ui.internal.forms.widgets.Locator, java.util.Hashtable, boolean, org.eclipse.ui.internal.forms.widgets.SelectionData)
-	 */
-	public void layout(GC gc, int width, Locator locator, Hashtable ResourceTable,
-			boolean selected) {
-		locator.resetCaret();
-		if (locator.rowHeight==0) {
-			FontMetrics fm = gc.getFontMetrics();
-			locator.rowHeight = fm.getHeight();
-		}
-		locator.y += locator.rowHeight;
-		locator.rowHeight = 0;
-		locator.rowCounter++;		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.forms.widgets.ParagraphSegment#computeSelection(org.eclipse.swt.graphics.GC, java.util.Hashtable, boolean, org.eclipse.ui.internal.forms.widgets.SelectionData)
-	 */
-	public void computeSelection(GC gc, Hashtable resourceTable, SelectionData selData) {
-		selData.markNewLine();
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/BulletParagraph.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/BulletParagraph.java
deleted file mode 100644
index c804e08..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/BulletParagraph.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.Hashtable;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-
-public class BulletParagraph extends Paragraph {
-	public static final int CIRCLE = 1;
-
-	public static final int TEXT = 2;
-
-	public static final int IMAGE = 3;
-
-	private int style = CIRCLE;
-
-	private String text;
-
-	private int CIRCLE_DIAM = 5;
-
-	private int SPACING = 10;
-
-	private int indent = -1;
-
-	private int bindent = -1;
-
-	private Rectangle bbounds;
-
-	/**
-	 * Constructor for BulletParagraph.
-	 * 
-	 * @param addVerticalSpace
-	 */
-	public BulletParagraph(boolean addVerticalSpace) {
-		super(addVerticalSpace);
-	}
-
-	public int getIndent() {
-		int ivalue = indent;
-		if (ivalue != -1)
-			return ivalue;
-		switch (style) {
-		case CIRCLE:
-			ivalue = CIRCLE_DIAM + SPACING;
-			break;
-		default:
-			ivalue = 20;
-			break;
-		}
-		return getBulletIndent() + ivalue;
-	}
-
-	public int getBulletIndent() {
-		if (bindent != -1)
-			return bindent;
-		return 0;
-	}
-
-	/*
-	 * @see IBulletParagraph#getBulletStyle()
-	 */
-	public int getBulletStyle() {
-		return style;
-	}
-
-	public void setBulletStyle(int style) {
-		this.style = style;
-	}
-
-	public void setBulletText(String text) {
-		this.text = text;
-	}
-
-	public void setIndent(int indent) {
-		this.indent = indent;
-	}
-
-	public void setBulletIndent(int bindent) {
-		this.bindent = bindent;
-	}
-
-	/*
-	 * @see IBulletParagraph#getBulletText()
-	 */
-	public String getBulletText() {
-		return text;
-	}
-
-	public void layout(GC gc, int width, Locator loc, int lineHeight,
-			Hashtable resourceTable, IHyperlinkSegment selectedLink) {
-		computeRowHeights(gc, width, loc, lineHeight, resourceTable);
-		layoutBullet(gc, loc, lineHeight, resourceTable);
-		super.layout(gc, width, loc, lineHeight, resourceTable, selectedLink);
-	}
-
-	public void paint(GC gc, Rectangle repaintRegion,
-			Hashtable resourceTable, IHyperlinkSegment selectedLink,
-			SelectionData selData) {
-		paintBullet(gc, repaintRegion, resourceTable);
-		super.paint(gc, repaintRegion, resourceTable, selectedLink, selData);
-	}
-
-	private void layoutBullet(GC gc, Locator loc, int lineHeight,
-			Hashtable resourceTable) {
-		int x = loc.x - getIndent() + getBulletIndent();
-		int rowHeight = ((int[]) loc.heights.get(0))[0];
-		if (style == CIRCLE) {
-			int y = loc.y + rowHeight / 2 - CIRCLE_DIAM / 2;
-			bbounds = new Rectangle(x, y, CIRCLE_DIAM, CIRCLE_DIAM);
-		} else if (style == TEXT && text != null) {
-			//int height = gc.getFontMetrics().getHeight();
-			Point textSize = gc.textExtent(text);
-			bbounds = new Rectangle(x, loc.y, textSize.x, textSize.y);
-		} else if (style == IMAGE && text != null) {
-			Image image = (Image) resourceTable.get(text);
-			if (image != null) {
-				Rectangle ibounds = image.getBounds();
-				int y = loc.y + rowHeight / 2 - ibounds.height / 2;
-				bbounds = new Rectangle(x, y, ibounds.width, ibounds.height);
-			}
-		}
-	}
-
-	public void paintBullet(GC gc, Rectangle repaintRegion,
-			Hashtable resourceTable) {
-		if (bbounds == null)
-			return;
-		int x = bbounds.x;
-		int y = bbounds.y;
-		if (repaintRegion != null) {
-			x -= repaintRegion.x;
-			y -= repaintRegion.y;
-		}
-		if (style == CIRCLE) {
-			Color bg = gc.getBackground();
-			Color fg = gc.getForeground();
-			gc.setBackground(fg);
-			gc.fillRectangle(x, y + 1, 5, 3);
-			gc.fillRectangle(x + 1, y, 3, 5);
-			gc.setBackground(bg);
-		} else if (style == TEXT && text != null) {
-			gc.drawText(text, x, y);
-		} else if (style == IMAGE && text != null) {
-			Image image = (Image) resourceTable.get(text);
-			if (image != null)
-				gc.drawImage(image, x, y);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/BusyIndicator.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/BusyIndicator.java
deleted file mode 100644
index 139b014..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/BusyIndicator.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Stefan Mucke - fix for Bug 156456 
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.io.IOException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-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;
-import org.osgi.framework.Bundle;
-
-public final class BusyIndicator extends Canvas {
-
-	class BusyThread extends Thread {
-		Rectangle bounds;
-		Display display;
-		GC offScreenImageGC;
-		Image offScreenImage;
-		Image timage;
-		boolean stop;
-		
-		private BusyThread(Rectangle bounds, Display display, GC offScreenImageGC, Image offScreenImage) {
-			this.bounds = bounds;
-			this.display = display;
-			this.offScreenImageGC = offScreenImageGC;
-			this.offScreenImage = offScreenImage;
-		}
-		
-		public void run() {
-			try {
-				/*
-				 * Create an off-screen image to draw on, and fill it with
-				 * the shell background.
-				 */
-				FormUtil.setAntialias(offScreenImageGC, SWT.ON);
-				display.syncExec(new Runnable() {
-					public void run() {
-						if (!isDisposed())
-							drawBackground(offScreenImageGC, 0, 0,
-									bounds.width,
-									bounds.height);
-					}
-				});
-				if (isDisposed())
-					return;
-
-				/*
-				 * Create the first image and draw it on the off-screen
-				 * image.
-				 */
-				int imageDataIndex = 0;
-				ImageData imageData;
-				synchronized (BusyIndicator.this) {
-					timage = getImage(imageDataIndex);
-					imageData = timage.getImageData();
-					offScreenImageGC.drawImage(timage, 0, 0,
-							imageData.width, imageData.height, imageData.x,
-							imageData.y, imageData.width, imageData.height);
-				}
-
-				/*
-				 * Now loop through the images, creating and drawing
-				 * each one on the off-screen image before drawing it on
-				 * the shell.
-				 */
-				while (!stop && !isDisposed() && timage != null) {
-
-					/*
-					 * Fill with the background color before
-					 * drawing.
-					 */
-					final ImageData fimageData = imageData;
-					display.syncExec(new Runnable() {
-						public void run() {
-							if (!isDisposed()) {
-								drawBackground(offScreenImageGC, fimageData.x,
-										fimageData.y, fimageData.width,
-										fimageData.height);
-							}
-						}
-					});
-
-					synchronized (BusyIndicator.this) {
-						imageDataIndex = (imageDataIndex + 1) % IMAGE_COUNT;
-						timage = getImage(imageDataIndex);
-						imageData = timage.getImageData();
-						offScreenImageGC.drawImage(timage, 0, 0,
-								imageData.width, imageData.height,
-								imageData.x, imageData.y, imageData.width,
-								imageData.height);
-					}
-
-					/* Draw the off-screen image to the shell. */
-					animationImage = offScreenImage;
-					display.syncExec(new Runnable() {
-						public void run() {
-							if (!isDisposed())
-								redraw();
-						}
-					});
-					/*
-					 * Sleep for the specified delay time 
-					 */
-					try {
-						Thread.sleep(MILLISECONDS_OF_DELAY);
-					} catch (InterruptedException e) {
-						e.printStackTrace();
-					}
-
-
-				}
-			} catch (Exception e) {
-			} finally {
-				if (!display.isDisposed()) {
-					display.syncExec(new Runnable() {
-						public void run() {
-							if (offScreenImage != null
-									&& !offScreenImage.isDisposed())
-								offScreenImage.dispose();
-							if (offScreenImageGC != null
-									&& !offScreenImageGC.isDisposed())
-								offScreenImageGC.dispose();
-						}
-					});
-				}
-				clearImages();
-			}
-			if (busyThread == null && !display.isDisposed())
-				display.syncExec(new Runnable() {
-					public void run() {
-						animationImage = null;
-						if (!isDisposed())
-							redraw();
-					}
-				});
-		}
-		
-		public void setStop(boolean stop) {
-			this.stop = stop;
-		}
-	}
-
-	private static final int MARGIN = 0;	
-	private static final int IMAGE_COUNT = 8;
-	private static final int MILLISECONDS_OF_DELAY = 180; 
-	private Image[] imageCache;
-	protected Image image;
-
-	protected Image animationImage;
-
-	protected BusyThread busyThread;
-	
-	/**
-	 * BusyWidget constructor comment.
-	 * 
-	 * @param parent
-	 *            org.eclipse.swt.widgets.Composite
-	 * @param style
-	 *            int
-	 */
-	public BusyIndicator(Composite parent, int style) {
-		super(parent, style);
-
-		addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent event) {
-				onPaint(event);
-			}
-		});
-	}
-
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		Point size = new Point(0, 0);
-		if (image != null) {
-			Rectangle ibounds = image.getBounds();
-			size.x = ibounds.width;
-			size.y = ibounds.height;
-		}
-		if (isBusy()) {
-			Rectangle bounds = getImage(0).getBounds();
-			size.x = Math.max(size.x, bounds.width);
-			size.y = Math.max(size.y, bounds.height);
-		}
-		size.x += MARGIN + MARGIN;
-		size.y += MARGIN + MARGIN;
-		return size;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Control#forceFocus()
-	 */
-	public boolean forceFocus() {
-		return false;
-	}
-
-	/**
-	 * Creates a thread to animate the image.
-	 */
-	protected synchronized void createBusyThread() {
-		if (busyThread != null)
-			return;
-
-		Rectangle bounds = getImage(0).getBounds();
-		Display display = getDisplay();
-		Image offScreenImage = new Image(display, bounds.width, bounds.height);
-		GC offScreenImageGC = new GC(offScreenImage);
-		busyThread = new BusyThread(bounds, display, offScreenImageGC, offScreenImage);
-		busyThread.setPriority(Thread.NORM_PRIORITY + 2);
-		busyThread.setDaemon(true);
-		busyThread.start();
-	}
-
-	public void dispose() {
-		if (busyThread != null) {
-			busyThread.setStop(true);
-			busyThread = null;
-		}
-		super.dispose();
-	}
-
-	/**
-	 * Return the image or <code>null</code>.
-	 */
-	public Image getImage() {
-		return image;
-	}
-
-	/**
-	 * Returns true if it is currently busy.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isBusy() {
-		return (busyThread != null);
-	}
-
-	/*
-	 * Process the paint event
-	 */
-	protected void onPaint(PaintEvent event) {
-		if (animationImage != null && animationImage.isDisposed()) {
-			animationImage = null;
-		}
-		Rectangle rect = getClientArea();
-		if (rect.width == 0 || rect.height == 0)
-			return;
-
-		GC gc = event.gc;
-		Image activeImage = animationImage != null ? animationImage : image;
-		if (activeImage != null) {
-			Rectangle ibounds = activeImage.getBounds();
-			gc.drawImage(activeImage, rect.width / 2 - ibounds.width / 2,
-					rect.height / 2 - ibounds.height / 2);
-		}
-	}
-
-	/**
-	 * Sets the indicators busy count up (true) or down (false) one.
-	 * 
-	 * @param busy
-	 *            boolean
-	 */
-	public synchronized void setBusy(boolean busy) {
-		if (busy) {
-			if (busyThread == null)
-				createBusyThread();
-		} else {
-			if (busyThread != null) {
-				busyThread.setStop(true);
-				busyThread = null;
-			}
-		}
-	}
-
-	/**
-	 * Set the image. The value <code>null</code> clears it.
-	 */
-	public void setImage(Image image) {
-		if (image != this.image && !isDisposed()) {
-			this.image = image;
-			redraw();
-		}
-	}
-	
-
-	private ImageDescriptor createImageDescriptor(String relativePath) {
-		Bundle bundle = Platform.getBundle("org.eclipse.ui.forms"); //$NON-NLS-1$
-		URL url = FileLocator.find(bundle, new Path(relativePath),null);
-		if (url == null) return null;
-		try {
-			url = FileLocator.resolve(url);
-			return ImageDescriptor.createFromURL(url);
-		} catch (IOException e) {
-			return null;
-		}
-	}
-
-	private synchronized Image getImage(int index) {
-		if (imageCache == null) {
-			imageCache = new Image[IMAGE_COUNT];
-		}
-		if (imageCache[index] == null){
-			ImageDescriptor descriptor = createImageDescriptor("$nl$/icons/progress/ani/" + (index + 1) + ".png"); //$NON-NLS-1$ //$NON-NLS-2$
-		    imageCache[index] = descriptor.createImage();
-		}
-		return imageCache[index];
-	}
-	
-	private synchronized void clearImages() {
-		if (busyThread != null)
-			return;
-		if (imageCache != null) {
-			for (int index = 0; index < IMAGE_COUNT; index++) {
-				if (imageCache[index] != null && !imageCache[index].isDisposed()) {
-					imageCache[index].dispose();
-					imageCache[index] = null;
-				}
-			}
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/ControlSegment.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/ControlSegment.java
deleted file mode 100644
index 9afc645..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/ControlSegment.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.Hashtable;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-public class ControlSegment extends ObjectSegment implements IFocusSelectable {
-	private boolean fill;
-	private int width = SWT.DEFAULT;
-	private int height = SWT.DEFAULT;
-	
-	public ControlSegment() {
-	}
-	
-	public void setFill(boolean fill) {
-		this.fill = fill;
-	}
-	
-	public void setWidth(int width) {
-		this.width = width;
-	}
-	
-	public void setHeight(int height) {
-		this.height = height;
-	}
-	
-	public Control getControl(Hashtable resourceTable) {
-		Object obj = resourceTable.get(getObjectId());
-		if (obj instanceof Control) {
-			Control c = (Control)obj;
-			if (!c.isDisposed())
-				return c;
-		}
-		return null;
-	}
-
-	protected Point getObjectSize(Hashtable resourceTable, int wHint) {
-		Control control = getControl(resourceTable);
-		if (control==null)
-			return new Point(0,0);
-		int realWhint = FormUtil.getWidthHint(wHint, control);
-		Point size = control.computeSize(realWhint, SWT.DEFAULT);
-		if (realWhint!=SWT.DEFAULT && fill)
-			size.x = Math.max(size.x, realWhint);
-		if (width !=SWT.DEFAULT)
-			size.x = width;
-		if (height != SWT.DEFAULT)
-			size.y = height;
-		return size;
-	}
-	
-	public void layout(GC gc, int width, Locator loc, Hashtable resourceTable,
-			boolean selected) {
-		super.layout(gc, width, loc, resourceTable, selected);
-		Control control = getControl(resourceTable);
-		if (control!=null)
-			control.setBounds(getBounds());
-	}
-
-	public boolean setFocus(Hashtable resourceTable, boolean next) {
-		Control c = getControl(resourceTable);
-		if (c!=null) {
-			return setFocus(c, next);
-		}
-		return false;
-	}
-	
-	private boolean setFocus(Control c, boolean direction) {
-		if (c instanceof Composite) {
-			Composite comp = (Composite)c;
-			Control [] tabList = comp.getTabList();
-			if (direction) {
-				for (int i=0; i<tabList.length; i++) {
-					if (setFocus(tabList[i], direction))
-						return true;
-				}
-			}
-			else {
-				for (int i=tabList.length-1; i>=0; i--) {
-					if (setFocus(tabList[i], direction))
-						return true;
-				}
-			}
-			if (!(c instanceof Canvas))
-				return false;
-		}
-		return c.setFocus();
-	}
-
-	public boolean isFocusSelectable(Hashtable resourceTable) {
-		Control c = getControl(resourceTable);
-		if (c!=null)
-			return true;
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormFonts.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormFonts.java
deleted file mode 100644
index b6f6fa7..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormFonts.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.HashMap;
-
-import org.eclipse.jface.resource.DeviceResourceException;
-import org.eclipse.jface.resource.FontDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.resource.LocalResourceManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Display;
-
-public class FormFonts {
-	private static FormFonts instance;
-
-	public static FormFonts getInstance() {
-		if (instance == null)
-			instance = new FormFonts();
-		return instance;
-	}
-	
-	private LocalResourceManager resources;
-	private HashMap descriptors;
-	
-	private FormFonts() {
-	}
-	
-	private class BoldFontDescriptor extends FontDescriptor {
-		private FontData[] fFontData;
-		
-		BoldFontDescriptor (Font font) {
-			fFontData = font.getFontData();
-			for (int i = 0; i < fFontData.length; i++) {
-				fFontData[i].setStyle(fFontData[i].getStyle() | SWT.BOLD);
-			}
-		}
-		
-		public boolean equals(Object obj) {
-			if (obj instanceof BoldFontDescriptor) {
-				BoldFontDescriptor desc = (BoldFontDescriptor)obj;
-				if (desc.fFontData.length != fFontData.length)
-					return false;
-				for (int i = 0; i < fFontData.length; i++)
-					if (!fFontData[i].equals(desc.fFontData[i]))
-						return false;
-				return true;
-			}
-			return false;
-		}
-		
-		public int hashCode() {
-			int hash = 0;
-			for (int i = 0; i < fFontData.length; i++)
-				hash = hash * 7 + fFontData[i].hashCode();
-			return hash;
-		}
-
-		public Font createFont(Device device) throws DeviceResourceException {
-			return new Font(device, fFontData);
-		}
-
-		public void destroyFont(Font previouslyCreatedFont) {
-			previouslyCreatedFont.dispose();
-		}
-	}
-	
-	public Font getBoldFont(Display display, Font font) {
-		checkHashMaps();
-		BoldFontDescriptor desc = new BoldFontDescriptor(font);
-		Font result = getResourceManager().createFont(desc);
-		descriptors.put(result, desc);
-		return result;
-	}
-	
-	public boolean markFinished(Font boldFont) {
-		checkHashMaps();
-		BoldFontDescriptor desc = (BoldFontDescriptor)descriptors.get(boldFont);
-		if (desc != null) {
-			getResourceManager().destroyFont(desc);
-			if (getResourceManager().find(desc) == null) {
-				descriptors.remove(boldFont);
-				validateHashMaps();
-			}
-			return true;
-			
-		}
-		// if the image was not found, dispose of it for the caller
-		boldFont.dispose();
-		return false;
-	}
-	
-	private LocalResourceManager getResourceManager() {
-		if (resources == null)
-			resources = new LocalResourceManager(JFaceResources.getResources());
-		return resources;
-	}
-
-	private void checkHashMaps() {
-		if (descriptors == null)
-			descriptors = new HashMap();
-	}
-	
-	private void validateHashMaps() {
-		if (descriptors.size() == 0)
-			descriptors = null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormHeading.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormHeading.java
deleted file mode 100644
index 94d6b19..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormHeading.java
+++ /dev/null
@@ -1,1014 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.Hashtable;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.DropTargetListener;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-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.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.ui.forms.IFormColors;
-import org.eclipse.ui.forms.IMessage;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.ui.forms.widgets.ILayoutExtension;
-import org.eclipse.ui.forms.widgets.SizeCache;
-import org.eclipse.ui.internal.forms.IMessageToolTipManager;
-import org.eclipse.ui.internal.forms.MessageManager;
-
-/**
- * Form header moved out of the form class.
- */
-public class FormHeading extends Canvas {
-	private static final int TITLE_HMARGIN = 1;
-	private static final int SPACING = 5;
-	private static final int VSPACING = 5;
-	private static final int HMARGIN = 6;
-	private static final int VMARGIN = 1;
-	private static final int CLIENT_MARGIN = 1;
-
-	private static final int SEPARATOR = 1 << 1;
-	private static final int BOTTOM_TOOLBAR = 1 << 2;
-	private static final int BACKGROUND_IMAGE_TILED = 1 << 3;
-	private static final int SEPARATOR_HEIGHT = 2;
-	private static final int MESSAGE_AREA_LIMIT = 50;
-	static IMessage[] NULL_MESSAGE_ARRAY = new IMessage[] {};
-
-	public static final String COLOR_BASE_BG = "baseBg"; //$NON-NLS-1$
-
-	private Image backgroundImage;
-
-	private Image gradientImage;
-
-	Hashtable colors = new Hashtable();
-
-	private int flags;
-
-	private GradientInfo gradientInfo;
-
-	private ToolBarManager toolBarManager;
-
-	private SizeCache toolbarCache = new SizeCache();
-
-	private SizeCache clientCache = new SizeCache();
-
-	private SizeCache messageCache = new SizeCache();
-
-	private TitleRegion titleRegion;
-
-	private MessageRegion messageRegion;
-
-	private IMessageToolTipManager messageToolTipManager = new DefaultMessageToolTipManager();
-
-	private Control headClient;
-
-	private class DefaultMessageToolTipManager implements
-			IMessageToolTipManager {
-		public void createToolTip(Control control, boolean imageLabel) {
-		}
-
-		public void update() {
-			String details = getMessageType() == 0 ? null : MessageManager
-					.createDetails(getChildrenMessages());
-			if (messageRegion != null)
-				messageRegion.updateToolTip(details);
-			if (getMessageType() > 0
-					&& (details == null || details.length() == 0))
-				details = getMessage();
-			titleRegion.updateToolTip(details);
-		}
-	}
-
-	private class GradientInfo {
-		Color[] gradientColors;
-
-		int[] percents;
-
-		boolean vertical;
-	}
-
-	private class FormHeadingLayout extends Layout implements ILayoutExtension {
-		public int computeMinimumWidth(Composite composite, boolean flushCache) {
-			return computeSize(composite, 5, SWT.DEFAULT, flushCache).x;
-		}
-
-		public int computeMaximumWidth(Composite composite, boolean flushCache) {
-			return computeSize(composite, SWT.DEFAULT, SWT.DEFAULT, flushCache).x;
-		}
-
-		public Point computeSize(Composite composite, int wHint, int hHint,
-				boolean flushCache) {
-			return layout(composite, false, 0, 0, wHint, hHint, flushCache);
-		}
-
-		protected void layout(Composite composite, boolean flushCache) {
-			Rectangle rect = composite.getClientArea();
-			layout(composite, true, rect.x, rect.y, rect.width, rect.height,
-					flushCache);
-		}
-
-		private Point layout(Composite composite, boolean move, int x, int y,
-				int width, int height, boolean flushCache) {
-			Point tsize = null;
-			Point msize = null;
-			Point tbsize = null;
-			Point clsize = null;
-
-			if (flushCache) {
-				clientCache.flush();
-				messageCache.flush();
-				toolbarCache.flush();
-			}
-			if (hasToolBar()) {
-				ToolBar tb = toolBarManager.getControl();
-				toolbarCache.setControl(tb);
-				tbsize = toolbarCache.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-			}
-			if (headClient != null) {
-				clientCache.setControl(headClient);
-				int cwhint = width;
-				if (cwhint != SWT.DEFAULT) {
-					cwhint -= HMARGIN * 2;
-					if (tbsize != null && getToolBarAlignment() == SWT.BOTTOM)
-						cwhint -= tbsize.x + SPACING;
-				}
-				clsize = clientCache.computeSize(cwhint, SWT.DEFAULT);
-			}
-			int totalFlexWidth = width;
-			int flexWidth = totalFlexWidth;
-			if (totalFlexWidth != SWT.DEFAULT) {
-				totalFlexWidth -= TITLE_HMARGIN * 2;
-				// complete right margin
-				if (hasToolBar() && getToolBarAlignment() == SWT.TOP
-						|| hasMessageRegion())
-					totalFlexWidth -= SPACING;
-				// subtract tool bar
-				if (hasToolBar() && getToolBarAlignment() == SWT.TOP)
-					totalFlexWidth -= tbsize.x + SPACING;
-				flexWidth = totalFlexWidth;
-				if (hasMessageRegion()) {
-					// remove message region spacing and divide by 2
-					flexWidth -= SPACING;
-					// flexWidth /= 2;
-				}
-			}
-			/*
-			 * // compute text and message sizes tsize =
-			 * titleRegion.computeSize(flexWidth, SWT.DEFAULT); if (flexWidth !=
-			 * SWT.DEFAULT && tsize.x < flexWidth) flexWidth += flexWidth -
-			 * tsize.x;
-			 * 
-			 * if (hasMessageRegion()) {
-			 * messageCache.setControl(messageRegion.getMessageControl()); msize =
-			 * messageCache.computeSize(flexWidth, SWT.DEFAULT); int maxWidth =
-			 * messageCache.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; if
-			 * (maxWidth < msize.x) { msize.x = maxWidth; // recompute title
-			 * with the reclaimed width int tflexWidth = totalFlexWidth -
-			 * SPACING - msize.x; tsize = titleRegion.computeSize(tflexWidth,
-			 * SWT.DEFAULT); } }
-			 */
-			if (!hasMessageRegion()) {
-				tsize = titleRegion.computeSize(flexWidth, SWT.DEFAULT);
-			} else {
-				// Total flexible area in the first row is flexWidth.
-				// Try natural widths of title and
-				Point tsizeNatural = titleRegion.computeSize(SWT.DEFAULT,
-						SWT.DEFAULT);
-				messageCache.setControl(messageRegion.getMessageControl());
-				Point msizeNatural = messageCache.computeSize(SWT.DEFAULT,
-						SWT.DEFAULT);
-				// try to fit all
-				tsize = tsizeNatural;
-				msize = msizeNatural;
-				if (flexWidth != SWT.DEFAULT) {
-					int needed = tsizeNatural.x + msizeNatural.x;
-					if (needed > flexWidth) {
-						// too big - try to limit the message
-						int mwidth = flexWidth - tsizeNatural.x;
-						if (mwidth >= MESSAGE_AREA_LIMIT) {
-							msize.x = mwidth;
-						} else {
-							// message is squeezed to the limit
-							int flex = flexWidth - MESSAGE_AREA_LIMIT;
-							tsize = titleRegion.computeSize(flex, SWT.DEFAULT);
-							msize.x = MESSAGE_AREA_LIMIT;
-						}
-					}
-				}
-			}
-
-			Point size = new Point(width, height);
-			if (!move) {
-				// compute sizes
-				int width1 = 2 * TITLE_HMARGIN;
-				width1 += tsize.x;
-				if (msize != null)
-					width1 += SPACING + msize.x;
-				if (tbsize != null && getToolBarAlignment() == SWT.TOP)
-					width1 += SPACING + tbsize.x;
-				if (msize != null
-						|| (tbsize != null && getToolBarAlignment() == SWT.TOP))
-					width1 += SPACING;
-				size.x = width1;
-				if (clsize != null) {
-					int width2 = clsize.x;
-					if (tbsize != null && getToolBarAlignment() == SWT.BOTTOM)
-						width2 += SPACING + tbsize.x;
-					width2 += 2 * HMARGIN;
-					size.x = Math.max(width1, width2);
-				}
-				// height, first row
-				size.y = tsize.y;
-				if (msize != null)
-					size.y = Math.max(msize.y, size.y);
-				if (tbsize != null && getToolBarAlignment() == SWT.TOP)
-					size.y = Math.max(tbsize.y, size.y);
-				if (size.y > 0)
-					size.y += VMARGIN * 2;
-				// add second row
-				int height2 = 0;
-				if (tbsize != null && getToolBarAlignment() == SWT.BOTTOM)
-					height2 = tbsize.y;
-				if (clsize != null)
-					height2 = Math.max(height2, clsize.y);
-				if (height2 > 0)
-					size.y += VSPACING + height2 + CLIENT_MARGIN;
-				// add separator
-				if (size.y > 0 && isSeparatorVisible())
-					size.y += SEPARATOR_HEIGHT;
-			} else {
-				// position controls
-				int xloc = x;
-				int yloc = y + VMARGIN;
-				int row1Height = tsize.y;
-				if (hasMessageRegion())
-					row1Height = Math.max(row1Height, msize.y);
-				if (hasToolBar() && getToolBarAlignment() == SWT.TOP)
-					row1Height = Math.max(row1Height, tbsize.y);
-				titleRegion.setBounds(xloc,
-				// yloc + row1Height / 2 - tsize.y / 2,
-						yloc, tsize.x, tsize.y);
-				xloc += tsize.x;
-
-				if (hasMessageRegion()) {
-					xloc += SPACING;
-					int messageOffset = 0;
-					if (tsize.y > 0) {
-						// space between title area and title text
-						int titleLeadingSpace = (tsize.y - titleRegion.getFontHeight()) / 2;
-						// space between message control and message text
-						int messageLeadingSpace = (msize.y - messageRegion.getFontHeight()) / 2;
-						// how much to offset the message so baselines align
-						messageOffset = (titleLeadingSpace + titleRegion.getFontBaselineHeight())
-							- (messageLeadingSpace + messageRegion.getFontBaselineHeight());
-					}
-
-					messageRegion
-							.getMessageControl()
-							.setBounds(
-									xloc,
-									tsize.y > 0 ? (yloc + messageOffset)
-											: (yloc + row1Height / 2 - msize.y / 2),
-									msize.x, msize.y);
-					xloc += msize.x;
-				}
-				if (toolBarManager != null)
-					toolBarManager.getControl().setVisible(
-							!toolBarManager.isEmpty());
-				if (tbsize != null && getToolBarAlignment() == SWT.TOP) {
-					ToolBar tbar = toolBarManager.getControl();
-					tbar.setBounds(x + width - 1 - tbsize.x - HMARGIN, yloc
-							+ row1Height - 1 - tbsize.y, tbsize.x, tbsize.y);
-				}
-				// second row
-				xloc = HMARGIN;
-				yloc += row1Height + VSPACING;
-				int tw = 0;
-
-				if (tbsize != null && getToolBarAlignment() == SWT.BOTTOM) {
-					ToolBar tbar = toolBarManager.getControl();
-					tbar.setBounds(x + width - 1 - tbsize.x - HMARGIN, yloc,
-							tbsize.x, tbsize.y);
-					tw = tbsize.x + SPACING;
-				}
-				if (headClient != null) {
-					int carea = width - HMARGIN * 2 - tw;
-					headClient.setBounds(xloc, yloc, carea, clsize.y);
-				}
-			}
-			return size;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Control#forceFocus()
-	 */
-	public boolean forceFocus() {
-		return false;
-	}
-
-	private boolean hasToolBar() {
-		return toolBarManager != null && !toolBarManager.isEmpty();
-	}
-
-	private boolean hasMessageRegion() {
-		return messageRegion != null && !messageRegion.isEmpty();
-	}
-
-	private class MessageRegion {
-		private String message;
-		private int messageType;
-		private CLabel messageLabel;
-		private IMessage[] messages;
-		private Hyperlink messageHyperlink;
-		private ListenerList listeners;
-		private Color fg;
-		private int fontHeight = -1;
-		private int fontBaselineHeight = -1;
-
-		public MessageRegion() {
-		}
-
-		public boolean isDisposed() {
-			Control c = getMessageControl();
-			return c != null && c.isDisposed();
-		}
-
-		public boolean isEmpty() {
-			Control c = getMessageControl();
-			if (c == null)
-				return true;
-			return !c.getVisible();
-		}
-
-		public int getFontHeight() {
-			if (fontHeight == -1) {
-				Control c = getMessageControl();
-				if (c == null)
-					return 0;
-				GC gc = new GC(c.getDisplay());
-				gc.setFont(c.getFont());
-				fontHeight = gc.getFontMetrics().getHeight();
-				gc.dispose();
-			}
-			return fontHeight;
-		}
-
-		public int getFontBaselineHeight() {
-			if (fontBaselineHeight == -1) {
-				Control c = getMessageControl();
-				if (c == null)
-					return 0;
-				GC gc = new GC(c.getDisplay());
-				gc.setFont(c.getFont());
-				FontMetrics fm = gc.getFontMetrics();
-				fontBaselineHeight = fm.getHeight() - fm.getDescent();
-				gc.dispose();
-			}
-			return fontBaselineHeight;
-		}
-
-		public void showMessage(String newMessage, int newType,
-				IMessage[] messages) {
-			Control oldControl = getMessageControl();
-			int oldType = messageType;
-			this.message = newMessage;
-			this.messageType = newType;
-			this.messages = messages;
-			if (newMessage == null) {
-				// clearing of the message
-				if (oldControl != null && oldControl.getVisible())
-					oldControl.setVisible(false);
-				return;
-			}
-			ensureControlExists();
-			if (needHyperlink()) {
-				messageHyperlink.setText(newMessage);
-				messageHyperlink.setHref(messages);
-			} else {
-				messageLabel.setText(newMessage);
-			}
-			if (oldType != newType)
-				updateForeground();
-		}
-
-		public void updateToolTip(String toolTip) {
-			Control control = getMessageControl();
-			if (control != null)
-				control.setToolTipText(toolTip);
-		}
-
-		public String getMessage() {
-			return message;
-		}
-
-		public int getMessageType() {
-			return messageType;
-		}
-
-		public IMessage[] getChildrenMessages() {
-			return messages;
-		}
-
-		public String getDetailedMessage() {
-			Control c = getMessageControl();
-			if (c != null)
-				return c.getToolTipText();
-			return null;
-		}
-
-		public Control getMessageControl() {
-			if (needHyperlink() && messageHyperlink != null)
-				return messageHyperlink;
-			return messageLabel;
-		}
-
-		public Image getMessageImage() {
-			switch (messageType) {
-			case IMessageProvider.INFORMATION:
-				return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_INFO);
-			case IMessageProvider.WARNING:
-				return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING);
-			case IMessageProvider.ERROR:
-				return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_ERROR);
-			default:
-				return null;
-			}
-		}
-
-		public void addMessageHyperlinkListener(IHyperlinkListener listener) {
-			if (listeners == null)
-				listeners = new ListenerList();
-			listeners.add(listener);
-			ensureControlExists();
-			if (messageHyperlink != null)
-				messageHyperlink.addHyperlinkListener(listener);
-			if (listeners.size() == 1)
-				updateForeground();
-		}
-
-		private void removeMessageHyperlinkListener(IHyperlinkListener listener) {
-			if (listeners != null) {
-				listeners.remove(listener);
-				if (messageHyperlink != null)
-					messageHyperlink.removeHyperlinkListener(listener);
-				if (listeners.isEmpty())
-					listeners = null;
-				ensureControlExists();
-				if (listeners == null && !isDisposed())
-					updateForeground();
-			}
-		}
-
-		private void ensureControlExists() {
-			if (needHyperlink()) {
-				if (messageLabel != null)
-					messageLabel.setVisible(false);
-				if (messageHyperlink == null) {
-					messageHyperlink = new Hyperlink(FormHeading.this, SWT.NULL);
-					messageHyperlink.setUnderlined(true);
-					messageHyperlink.setText(message);
-					messageHyperlink.setHref(messages);
-					Object[] llist = listeners.getListeners();
-					for (int i = 0; i < llist.length; i++)
-						messageHyperlink
-								.addHyperlinkListener((IHyperlinkListener) llist[i]);
-					if (messageToolTipManager != null)
-						messageToolTipManager.createToolTip(messageHyperlink, false);
-				} else if (!messageHyperlink.getVisible()) {
-					messageHyperlink.setText(message);
-					messageHyperlink.setHref(messages);
-					messageHyperlink.setVisible(true);
-				}
-			} else {
-				// need a label
-				if (messageHyperlink != null)
-					messageHyperlink.setVisible(false);
-				if (messageLabel == null) {
-					messageLabel = new CLabel(FormHeading.this, SWT.NULL);
-					messageLabel.setText(message);
-					if (messageToolTipManager != null)
-						messageToolTipManager.createToolTip(messageLabel, false);
-				} else if (!messageLabel.getVisible()) {
-					messageLabel.setText(message);
-					messageLabel.setVisible(true);
-				}
-			}
-			layout(true);
-		}
-
-		private boolean needHyperlink() {
-			return messageType > 0 && listeners != null;
-		}
-
-		public void setBackground(Color bg) {
-			if (messageHyperlink != null)
-				messageHyperlink.setBackground(bg);
-			if (messageLabel != null)
-				messageLabel.setBackground(bg);
-		}
-
-		public void setForeground(Color fg) {
-			this.fg = fg;
-		}
-
-		private void updateForeground() {
-			Color theFg;
-
-			switch (messageType) {
-			case IMessageProvider.ERROR:
-				theFg = getDisplay().getSystemColor(SWT.COLOR_RED);
-				break;
-			case IMessageProvider.WARNING:
-				theFg = getDisplay().getSystemColor(SWT.COLOR_DARK_YELLOW);
-				break;
-			default:
-				theFg = fg;
-			}
-			getMessageControl().setForeground(theFg);
-		}
-	}
-
-	/**
-	 * Creates the form content control as a child of the provided parent.
-	 * 
-	 * @param parent
-	 *            the parent widget
-	 */
-	public FormHeading(Composite parent, int style) {
-		super(parent, style);
-		setBackgroundMode(SWT.INHERIT_DEFAULT);
-		addListener(SWT.Paint, new Listener() {
-			public void handleEvent(Event e) {
-				onPaint(e.gc);
-			}
-		});
-		addListener(SWT.Dispose, new Listener() {
-			public void handleEvent(Event e) {
-				if (gradientImage != null) {
-					FormImages.getInstance().markFinished(gradientImage);
-					gradientImage = null;
-				}
-			}
-		});
-		addListener(SWT.Resize, new Listener() {
-			public void handleEvent(Event e) {
-				if (gradientInfo != null
-						|| (backgroundImage != null && !isBackgroundImageTiled()))
-					updateGradientImage();
-			}
-		});
-		addMouseMoveListener(new MouseMoveListener() {
-			public void mouseMove(MouseEvent e) {
-				updateTitleRegionHoverState(e);
-			}
-		});
-		addMouseTrackListener(new MouseTrackListener() {
-			public void mouseEnter(MouseEvent e) {
-				updateTitleRegionHoverState(e);
-			}
-
-			public void mouseExit(MouseEvent e) {
-				titleRegion.setHoverState(TitleRegion.STATE_NORMAL);
-			}
-
-			public void mouseHover(MouseEvent e) {
-			}
-		});
-		super.setLayout(new FormHeadingLayout());
-		titleRegion = new TitleRegion(this);
-	}
-
-	/**
-	 * Fully delegates the size computation to the internal layout manager.
-	 */
-	public final Point computeSize(int wHint, int hHint, boolean changed) {
-		return ((FormHeadingLayout) getLayout()).computeSize(this, wHint,
-				hHint, changed);
-	}
-
-	/**
-	 * Prevents from changing the custom control layout.
-	 */
-	public final void setLayout(Layout layout) {
-	}
-
-	/**
-	 * Returns the title text that will be rendered at the top of the form.
-	 * 
-	 * @return the title text
-	 */
-	public String getText() {
-		return titleRegion.getText();
-	}
-
-	/**
-	 * Returns the title image that will be rendered to the left of the title.
-	 * 
-	 * @return the title image
-	 * @since 3.2
-	 */
-	public Image getImage() {
-		return titleRegion.getImage();
-	}
-
-	/**
-	 * Sets the background color of the header.
-	 */
-	public void setBackground(Color bg) {
-		super.setBackground(bg);
-		internalSetBackground(bg);
-	}
-
-	private void internalSetBackground(Color bg) {
-		titleRegion.setBackground(bg);
-		if (messageRegion != null)
-			messageRegion.setBackground(bg);
-		if (toolBarManager != null)
-			toolBarManager.getControl().setBackground(bg);
-		putColor(COLOR_BASE_BG, bg);
-	}
-
-	/**
-	 * Sets the foreground color of the header.
-	 */
-	public void setForeground(Color fg) {
-		super.setForeground(fg);
-		titleRegion.setForeground(fg);
-		if (messageRegion != null)
-			messageRegion.setForeground(fg);
-	}
-
-	/**
-	 * Sets the text to be rendered at the top of the form above the body as a
-	 * title.
-	 * 
-	 * @param text
-	 *            the title text
-	 */
-	public void setText(String text) {
-		titleRegion.setText(text);
-	}
-
-	public void setFont(Font font) {
-		super.setFont(font);
-		titleRegion.setFont(font);
-	}
-
-	/**
-	 * Sets the image to be rendered to the left of the title.
-	 * 
-	 * @param image
-	 *            the title image or <code>null</code> to show no image.
-	 * @since 3.2
-	 */
-	public void setImage(Image image) {
-		titleRegion.setImage(image);
-		if (messageRegion != null)
-			titleRegion.updateImage(messageRegion.getMessageImage(), true);
-		else
-			titleRegion.updateImage(null, true);
-	}
-
-	public void setTextBackground(Color[] gradientColors, int[] percents,
-			boolean vertical) {
-		if (gradientColors != null) {
-			gradientInfo = new GradientInfo();
-			gradientInfo.gradientColors = gradientColors;
-			gradientInfo.percents = percents;
-			gradientInfo.vertical = vertical;
-			setBackground(null);
-			updateGradientImage();
-		} else {
-			// reset
-			gradientInfo = null;
-			if (gradientImage != null) {
-				FormImages.getInstance().markFinished(gradientImage);
-				gradientImage = null;
-				setBackgroundImage(null);
-			}
-		}
-	}
-
-	public void setHeadingBackgroundImage(Image image) {
-		this.backgroundImage = image;
-		if (image != null)
-			setBackground(null);
-		if (isBackgroundImageTiled()) {
-			setBackgroundImage(image);
-		} else
-			updateGradientImage();
-	}
-
-	public Image getHeadingBackgroundImage() {
-		return backgroundImage;
-	}
-
-	public void setBackgroundImageTiled(boolean tiled) {
-		if (tiled)
-			flags |= BACKGROUND_IMAGE_TILED;
-		else
-			flags &= ~BACKGROUND_IMAGE_TILED;
-		setHeadingBackgroundImage(this.backgroundImage);
-	}
-
-	public boolean isBackgroundImageTiled() {
-		return (flags & BACKGROUND_IMAGE_TILED) != 0;
-	}
-
-	public void setBackgroundImage(Image image) {
-		super.setBackgroundImage(image);
-		if (image != null) {
-			internalSetBackground(null);
-		}
-	}
-
-	/**
-	 * Returns the tool bar manager that is used to manage tool items in the
-	 * form's title area.
-	 * 
-	 * @return form tool bar manager
-	 */
-	public IToolBarManager getToolBarManager() {
-		if (toolBarManager == null) {
-			toolBarManager = new ToolBarManager(SWT.FLAT);
-			ToolBar toolbar = toolBarManager.createControl(this);
-			toolbar.setBackground(getBackground());
-			toolbar.setForeground(getForeground());
-			toolbar.setCursor(FormsResources.getHandCursor());
-			addDisposeListener(new DisposeListener() {
-				public void widgetDisposed(DisposeEvent e) {
-					if (toolBarManager != null) {
-						toolBarManager.dispose();
-						toolBarManager = null;
-					}
-				}
-			});
-		}
-		return toolBarManager;
-	}
-
-	/**
-	 * Returns the menu manager that is used to manage tool items in the form's
-	 * title area.
-	 * 
-	 * @return form drop-down menu manager
-	 * @since 3.3
-	 */
-	public IMenuManager getMenuManager() {
-		return titleRegion.getMenuManager();
-	}
-
-	/**
-	 * Updates the local tool bar manager if used. Does nothing if local tool
-	 * bar manager has not been created yet.
-	 */
-	public void updateToolBar() {
-		if (toolBarManager != null)
-			toolBarManager.update(false);
-	}
-
-	private void onPaint(GC gc) {
-		if (!isSeparatorVisible() && getBackgroundImage() == null)
-			return;
-		Rectangle carea = getClientArea();
-		Image buffer = new Image(getDisplay(), carea.width, carea.height);
-		buffer.setBackground(getBackground());
-		GC igc = new GC(buffer);
-		igc.setBackground(getBackground());
-		igc.fillRectangle(0, 0, carea.width, carea.height);
-		if (getBackgroundImage() != null) {
-			if (gradientInfo != null)
-				drawBackground(igc, carea.x, carea.y, carea.width, carea.height);
-			else {
-				Image bgImage = getBackgroundImage();
-				Rectangle ibounds = bgImage.getBounds();
-				drawBackground(igc, carea.x, carea.y, ibounds.width,
-						ibounds.height);
-			}
-		}
-
-		if (isSeparatorVisible()) {
-			// bg separator
-			if (hasColor(IFormColors.H_BOTTOM_KEYLINE1))
-				igc.setForeground(getColor(IFormColors.H_BOTTOM_KEYLINE1));
-			else
-				igc.setForeground(getBackground());
-			igc.drawLine(carea.x, carea.height - 2, carea.x + carea.width - 1,
-					carea.height - 2);
-			if (hasColor(IFormColors.H_BOTTOM_KEYLINE2))
-				igc.setForeground(getColor(IFormColors.H_BOTTOM_KEYLINE2));
-			else
-				igc.setForeground(getForeground());
-			igc.drawLine(carea.x, carea.height - 1, carea.x + carea.width - 1,
-					carea.height - 1);
-		}
-		igc.dispose();
-		gc.drawImage(buffer, carea.x, carea.y);
-		buffer.dispose();
-	}
-
-	private void updateTitleRegionHoverState(MouseEvent e) {
-		Rectangle titleRect = titleRegion.getBounds();
-		titleRect.width += titleRect.x + 15;
-		titleRect.height += titleRect.y + 15;
-		titleRect.x = 0;
-		titleRect.y = 0;
-		if (titleRect.contains(e.x, e.y))
-			titleRegion.setHoverState(TitleRegion.STATE_HOVER_LIGHT);
-		else
-			titleRegion.setHoverState(TitleRegion.STATE_NORMAL);
-	}
-
-	private void updateGradientImage() {
-		Rectangle rect = getBounds();
-		if (gradientImage != null) {
-			FormImages.getInstance().markFinished(gradientImage);
-			gradientImage = null;
-		}
-		if (gradientInfo != null) {
-			gradientImage = FormImages.getInstance().getGradient(gradientInfo.gradientColors, gradientInfo.percents,
-					gradientInfo.vertical ? rect.height : rect.width, gradientInfo.vertical, getColor(COLOR_BASE_BG));
-		} else if (backgroundImage != null && !isBackgroundImageTiled()) {
-			gradientImage = new Image(getDisplay(), Math.max(rect.width, 1),
-					Math.max(rect.height, 1));
-			gradientImage.setBackground(getBackground());
-			GC gc = new GC(gradientImage);
-			gc.drawImage(backgroundImage, 0, 0);
-			gc.dispose();
-		}
-		setBackgroundImage(gradientImage);
-	}
-
-	public boolean isSeparatorVisible() {
-		return (flags & SEPARATOR) != 0;
-	}
-
-	public void setSeparatorVisible(boolean addSeparator) {
-		if (addSeparator)
-			flags |= SEPARATOR;
-		else
-			flags &= ~SEPARATOR;
-	}
-
-	public void setToolBarAlignment(int alignment) {
-		if (alignment == SWT.BOTTOM)
-			flags |= BOTTOM_TOOLBAR;
-		else
-			flags &= ~BOTTOM_TOOLBAR;
-	}
-
-	public int getToolBarAlignment() {
-		return (flags & BOTTOM_TOOLBAR) != 0 ? SWT.BOTTOM : SWT.TOP;
-	}
-
-	public void addMessageHyperlinkListener(IHyperlinkListener listener) {
-		ensureMessageRegionExists();
-		messageRegion.addMessageHyperlinkListener(listener);
-	}
-
-	public void removeMessageHyperlinkListener(IHyperlinkListener listener) {
-		if (messageRegion != null)
-			messageRegion.removeMessageHyperlinkListener(listener);
-	}
-
-	public String getMessage() {
-		return messageRegion != null ? messageRegion.getMessage() : null;
-	}
-
-	public int getMessageType() {
-		return messageRegion != null ? messageRegion.getMessageType() : 0;
-	}
-
-	public IMessage[] getChildrenMessages() {
-		return messageRegion != null ? messageRegion.getChildrenMessages()
-				: NULL_MESSAGE_ARRAY;
-	}
-
-	private void ensureMessageRegionExists() {
-		// ensure message region exists
-		if (messageRegion == null)
-			messageRegion = new MessageRegion();
-	}
-
-	public void showMessage(String newMessage, int type, IMessage[] messages) {
-		if (messageRegion == null) {
-			// check the trivial case
-			if (newMessage == null)
-				return;
-		} else if (messageRegion.isDisposed())
-			return;
-		ensureMessageRegionExists();
-		messageRegion.showMessage(newMessage, type, messages);
-		titleRegion.updateImage(messageRegion.getMessageImage(), false);
-		if (messageToolTipManager != null)
-			messageToolTipManager.update();
-		layout();
-		redraw();
-	}
-
-	/**
-	 * Tests if the form is in the 'busy' state.
-	 * 
-	 * @return <code>true</code> if busy, <code>false</code> otherwise.
-	 */
-
-	public boolean isBusy() {
-		return titleRegion.isBusy();
-	}
-
-	/**
-	 * Sets the form's busy state. Busy form will display 'busy' animation in
-	 * the area of the title image.
-	 * 
-	 * @param busy
-	 *            the form's busy state
-	 */
-
-	public void setBusy(boolean busy) {
-		if (titleRegion.setBusy(busy))
-			layout();
-	}
-
-	public Control getHeadClient() {
-		return headClient;
-	}
-
-	public void setHeadClient(Control headClient) {
-		if (headClient != null)
-			Assert.isTrue(headClient.getParent() == this);
-		this.headClient = headClient;
-		layout();
-	}
-
-	public void putColor(String key, Color color) {
-		if (color == null)
-			colors.remove(key);
-		else
-			colors.put(key, color);
-	}
-
-	public Color getColor(String key) {
-		return (Color) colors.get(key);
-	}
-
-	public boolean hasColor(String key) {
-		return colors.containsKey(key);
-	}
-
-	public void addDragSupport(int operations, Transfer[] transferTypes,
-			DragSourceListener listener) {
-		titleRegion.addDragSupport(operations, transferTypes, listener);
-	}
-
-	public void addDropSupport(int operations, Transfer[] transferTypes,
-			DropTargetListener listener) {
-		titleRegion.addDropSupport(operations, transferTypes, listener);
-	}
-
-	public IMessageToolTipManager getMessageToolTipManager() {
-		return messageToolTipManager;
-	}
-
-	public void setMessageToolTipManager(
-			IMessageToolTipManager messageToolTipManager) {
-		this.messageToolTipManager = messageToolTipManager;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormImages.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormImages.java
deleted file mode 100644
index 830f7de..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormImages.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Wang Yizhuo (wangyizhuo@gmail.com) - patch (see Bugzilla #239178) 
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.Arrays;
-import java.util.HashMap;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.resource.LocalResourceManager;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.RGB;
-
-public class FormImages {
-	private static FormImages instance;
-
-	public static FormImages getInstance() {
-		if (instance == null)
-			instance = new FormImages();
-		return instance;
-	}
-
-	private LocalResourceManager resources;
-	private HashMap descriptors;
-	
-	private FormImages() {
-	}
-	
-	private abstract class AbstractImageDescriptor extends ImageDescriptor {
-		RGB[] fRGBs;
-		int fLength;
-		
-		AbstractImageDescriptor(Color[] colors, int length) {
-			fRGBs = new RGB[colors.length];
-			for (int i = 0; i < colors.length; i++) {
-				Color color = colors[i];
-				fRGBs[i] = color == null ? null : color.getRGB();
-			}
-			fLength = length;
-		}
-		
-		public boolean equals(Object obj) {
-			if (obj instanceof AbstractImageDescriptor) {
-				AbstractImageDescriptor id = (AbstractImageDescriptor)obj;
-				if (id.fRGBs.length == fRGBs.length) {
-					boolean result = id.fLength == fLength;
-					for (int i = 0; i < fRGBs.length && result; i++) {
-						result = result && id.fRGBs[i].equals(fRGBs[i]);
-					}
-					return result;
-				}
-			}
-			return false;
-		}
-		
-		public int hashCode() {
-			int hash = 0;
-			for (int i = 0; i < fRGBs.length; i++)
-				hash = hash * 7 + fRGBs[i].hashCode();
-			hash = hash * 7 + fLength;
-			return hash;
-		}
-	}
-	
-	private class SimpleImageDescriptor extends AbstractImageDescriptor{
-		private int fTheight;
-		private int fMarginHeight;
-		
-		SimpleImageDescriptor (Color color1, Color color2,
-				int realtheight, int theight, int marginHeight) {
-			super(new Color[] {color1, color2}, realtheight);
-			fTheight = theight;
-			fMarginHeight = marginHeight;
-		}
-		
-		public boolean equals(Object obj) {
-			if (obj instanceof SimpleImageDescriptor) {
-				SimpleImageDescriptor id = (SimpleImageDescriptor) obj;
-				if (super.equals(obj)  &&
-						id.fTheight == fTheight && id.fMarginHeight == fMarginHeight)
-					return true;
-			}
-			return false;
-		}
-		
-		public int hashCode() {
-			int hash = super.hashCode();
-			hash = hash * 7 + new Integer(fTheight).hashCode();
-			hash = hash * 7 + new Integer(fMarginHeight).hashCode();
-			return hash;
-		}
-
-		public ImageData getImageData() {
-			return null;
-		}
-		
-		public Image createImage(boolean returnMissingImageOnError,	Device device) {
-			Image image = new Image(device, 1, fLength);
-			Color color1 = new Color(device, fRGBs[0]);
-			Color color2 = new Color(device, fRGBs[1]);
-			image.setBackground(color1);
-			GC gc = new GC(image);
-			gc.setBackground(color1);
-			gc.fillRectangle(0, 0, 1, fLength);
-			gc.setForeground(color2);
-			gc.setBackground(color1);
-			gc.fillGradientRectangle(0, fMarginHeight + 2, 1, fTheight - 2, true);
-			gc.dispose();
-			color1.dispose();
-			color2.dispose();
-			return image;
-		}
-	}
-	
-	private class ComplexImageDescriptor extends AbstractImageDescriptor {
-		RGB fBgRGB;
-		boolean fVertical;
-		int[] fPercents;
-		
-		public ComplexImageDescriptor(Color[] colors, int length,
-				int[] percents, boolean vertical, Color bg) {
-			super(colors, length);
-			fBgRGB = bg == null ? null : bg.getRGB();
-			fVertical = vertical;
-			fPercents = percents;
-		}
-		
-		public boolean equals(Object obj) {
-			if (obj instanceof ComplexImageDescriptor) {
-				ComplexImageDescriptor id = (ComplexImageDescriptor) obj;
-				if (super.equals(obj)  &&
-						id.fVertical == fVertical && Arrays.equals(id.fPercents, fPercents)) {
-					if ((id.fBgRGB == null && fBgRGB == null) ||
-							(id.fBgRGB != null && id.fBgRGB.equals(fBgRGB)))
-						return true;
-					// if the only thing that isn't the same is the background color
-					// still return true if it does not matter (percents add up to 100)
-					int sum = 0;
-					for (int i = 0; i < fPercents.length; i++)
-						sum += fPercents[i];
-					if (sum >= 100)
-						return true;
-				}
-			}
-			return false;
-		}
-		
-		public int hashCode() {
-			int hash = super.hashCode();
-			hash = hash * 7 + new Boolean(fVertical).hashCode();
-			for (int i = 0; i < fPercents.length; i++)
-				hash = hash * 7 + new Integer(fPercents[i]).hashCode();
-			return hash;
-		}
-
-		public ImageData getImageData() {
-			return null;
-		}
-		
-		public Image createImage(boolean returnMissingImageOnError,	Device device) {
-			int width = fVertical ? 1 : fLength;
-			int height = fVertical ? fLength : 1;
-			Image gradient = new Image(device, Math.max(width, 1), Math
-					.max(height, 1));
-			GC gc = new GC(gradient);
-			Color[] colors = new Color[fRGBs.length];
-			for (int i = 0; i < colors.length; i++)
-				colors[i] = new Color(device, fRGBs[i]);
-			Color bg = fBgRGB == null ? null : new Color(device, fBgRGB);
-			drawTextGradient(gc, width, height, colors, fPercents, fVertical, bg);
-			gc.dispose();
-			for (int i = 0; i < colors.length; i++)
-				colors[i].dispose();
-			if (bg != null)
-				bg.dispose();
-			return gradient;
-		}
-
-		private void drawTextGradient(GC gc, int width, int height, Color[] colors,
-				int[] percents, boolean vertical, Color bg) {
-			final Color oldBackground = gc.getBackground();
-			if (colors.length == 1) {
-				if (colors[0] != null)
-					gc.setBackground(colors[0]);
-				gc.fillRectangle(0, 0, width, height);
-			} else {
-				final Color oldForeground = gc.getForeground();
-				Color lastColor = colors[0];
-				if (lastColor == null)
-					lastColor = oldBackground;
-				int pos = 0;
-				for (int i = 0; i < percents.length; ++i) {
-					gc.setForeground(lastColor);
-					lastColor = colors[i + 1];
-					if (lastColor == null)
-						lastColor = oldBackground;
-					gc.setBackground(lastColor);
-					if (vertical) {
-						int gradientHeight = percents[i] * height / 100;
-						
-						gc.fillGradientRectangle(0, pos, width, gradientHeight,
-								true);
-						pos += gradientHeight;
-					} else {
-						int gradientWidth = percents[i] * width / 100;
-						
-						gc.fillGradientRectangle(pos, 0, gradientWidth, height,
-								false);
-						pos += gradientWidth;
-					}
-				}
-				if (vertical && pos < height) {
-					if (bg != null)
-						gc.setBackground(bg);
-					gc.fillRectangle(0, pos, width, height - pos);
-				}
-				if (!vertical && pos < width) {
-					if (bg != null)
-						gc.setBackground(bg);
-					gc.fillRectangle(pos, 0, width - pos, height);
-				}
-				gc.setForeground(oldForeground);
-			}
-		}
-	}
-	
-	public Image getGradient(Color color1, Color color2,
-			int realtheight, int theight, int marginHeight) {
-		if (color1 == null || color1.isDisposed() || color2 == null || color2.isDisposed())
-			return null;
-		AbstractImageDescriptor desc = new SimpleImageDescriptor(color1, color2, realtheight, theight, marginHeight);
-		return getGradient(desc);
-	}
-	
-	public Image getGradient(Color[] colors, int[] percents,
-			int length, boolean vertical, Color bg) {
-		if (colors.length == 0)
-			return null;
-		for (int i = 0; i < colors.length; i++)
-			if (colors[i] == null || colors[i].isDisposed())
-				return null;
-		if (bg != null && bg.isDisposed())
-			return null;
-		AbstractImageDescriptor desc = new ComplexImageDescriptor(colors, length, percents, vertical, bg);
-		return getGradient(desc);
-	}
-	
-	private synchronized Image getGradient(AbstractImageDescriptor desc) {
-		checkHashMaps();
-		Image result = getResourceManager().createImage(desc);
-		descriptors.put(result, desc);
-		return result;
-	}
-	
-	public synchronized boolean markFinished(Image image) {
-		checkHashMaps();
-		AbstractImageDescriptor desc = (AbstractImageDescriptor)descriptors.get(image);
-		if (desc != null) {
-			getResourceManager().destroyImage(desc);
-			if (getResourceManager().find(desc) == null) {
-				descriptors.remove(image);
-				validateHashMaps();
-			}
-			return true;
-		}
-		// if the image was not found, dispose of it for the caller
-		image.dispose();
-		return false;
-	}
-	
-	private LocalResourceManager getResourceManager() {
-		if (resources == null)
-			resources = new LocalResourceManager(JFaceResources.getResources());
-		return resources;
-	}
-
-	private void checkHashMaps() {
-		if (descriptors == null)
-			descriptors = new HashMap();
-	}
-	
-	private void validateHashMaps() {
-		if (descriptors.size() == 0)
-			descriptors = null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormTextModel.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormTextModel.java
deleted file mode 100644
index 3c3e037..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormTextModel.java
+++ /dev/null
@@ -1,750 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.Vector;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.ui.forms.HyperlinkSettings;
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-public class FormTextModel {
-	private static final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
-			.newInstance();
-
-	private boolean whitespaceNormalized = true;
-
-	private Vector paragraphs;
-
-	private IFocusSelectable[] selectableSegments;
-
-	private int selectedSegmentIndex = -1;
-	
-	private int savedSelectedLinkIndex = -1;
-
-	private HyperlinkSettings hyperlinkSettings;
-
-	public static final String BOLD_FONT_ID = "f.____bold"; //$NON-NLS-1$
-
-	//private static final int TEXT_ONLY_LINK = 1;
-
-	//private static final int IMG_ONLY_LINK = 2;
-
-	//private static final int TEXT_AND_IMAGES_LINK = 3;
-
-	public FormTextModel() {
-		reset();
-	}
-
-	/*
-	 * @see ITextModel#getParagraphs()
-	 */
-	public Paragraph[] getParagraphs() {
-		if (paragraphs == null)
-			return new Paragraph[0];
-		return (Paragraph[]) paragraphs
-				.toArray(new Paragraph[paragraphs.size()]);
-	}
-
-	public String getAccessibleText() {
-		if (paragraphs == null)
-			return ""; //$NON-NLS-1$
-		StringBuffer sbuf = new StringBuffer();
-		for (int i = 0; i < paragraphs.size(); i++) {
-			Paragraph paragraph = (Paragraph) paragraphs.get(i);
-			String text = paragraph.getAccessibleText();
-			sbuf.append(text);
-		}
-		return sbuf.toString();
-	}
-
-	/*
-	 * @see ITextModel#parse(String)
-	 */
-	public void parseTaggedText(String taggedText, boolean expandURLs) {
-		if (taggedText == null) {
-			reset();
-			return;
-		}
-		try {
-			InputStream stream = new ByteArrayInputStream(taggedText
-					.getBytes("UTF8")); //$NON-NLS-1$
-			parseInputStream(stream, expandURLs);
-		} catch (UnsupportedEncodingException e) {
-			SWT.error(SWT.ERROR_UNSUPPORTED_FORMAT, e);
-		}
-	}
-
-	public void parseInputStream(InputStream is, boolean expandURLs) {
-
-		documentBuilderFactory.setNamespaceAware(true);
-		documentBuilderFactory.setIgnoringComments(true);
-
-		reset();
-		try {
-			DocumentBuilder parser = documentBuilderFactory
-					.newDocumentBuilder();
-			InputSource source = new InputSource(is);
-			Document doc = parser.parse(source);
-			processDocument(doc, expandURLs);
-		} catch (ParserConfigurationException e) {
-			SWT.error(SWT.ERROR_INVALID_ARGUMENT, e);
-		} catch (SAXException e) {
-			SWT.error(SWT.ERROR_INVALID_ARGUMENT, e);
-		} catch (IOException e) {
-			SWT.error(SWT.ERROR_IO, e);
-		}
-	}
-
-	private void processDocument(Document doc, boolean expandURLs) {
-		Node root = doc.getDocumentElement();
-		NodeList children = root.getChildNodes();
-		processSubnodes(paragraphs, children, expandURLs);
-	}
-
-	private void processSubnodes(Vector plist, NodeList children, boolean expandURLs) {
-		for (int i = 0; i < children.getLength(); i++) {
-			Node child = children.item(i);
-			if (child.getNodeType() == Node.TEXT_NODE) {
-				// Make an implicit paragraph
-				String text = getSingleNodeText(child);
-				if (text != null && !isIgnorableWhiteSpace(text, true)) {
-					Paragraph p = new Paragraph(true);
-					p.parseRegularText(text, expandURLs, true,
-							getHyperlinkSettings(), null);
-					plist.add(p);
-				}
-			} else if (child.getNodeType() == Node.ELEMENT_NODE) {
-				String tag = child.getNodeName().toLowerCase();
-				if (tag.equals("p")) { //$NON-NLS-1$
-					Paragraph p = processParagraph(child, expandURLs);
-					if (p != null)
-						plist.add(p);
-				} else if (tag.equals("li")) { //$NON-NLS-1$
-					Paragraph p = processListItem(child, expandURLs);
-					if (p != null)
-						plist.add(p);
-				}
-			}
-		}
-	}
-
-	private Paragraph processParagraph(Node paragraph, boolean expandURLs) {
-		NodeList children = paragraph.getChildNodes();
-		NamedNodeMap atts = paragraph.getAttributes();
-		Node addSpaceAtt = atts.getNamedItem("addVerticalSpace"); //$NON-NLS-1$
-		boolean addSpace = true;
-
-		if (addSpaceAtt == null)
-			addSpaceAtt = atts.getNamedItem("vspace"); //$NON-NLS-1$
-
-		if (addSpaceAtt != null) {
-			String value = addSpaceAtt.getNodeValue();
-			addSpace = value.equalsIgnoreCase("true"); //$NON-NLS-1$
-		}
-		Paragraph p = new Paragraph(addSpace);
-
-		processSegments(p, children, expandURLs);
-		return p;
-	}
-
-	private Paragraph processListItem(Node listItem, boolean expandURLs) {
-		NodeList children = listItem.getChildNodes();
-		NamedNodeMap atts = listItem.getAttributes();
-		Node addSpaceAtt = atts.getNamedItem("addVerticalSpace");//$NON-NLS-1$
-		Node styleAtt = atts.getNamedItem("style");//$NON-NLS-1$
-		Node valueAtt = atts.getNamedItem("value");//$NON-NLS-1$
-		Node indentAtt = atts.getNamedItem("indent");//$NON-NLS-1$
-		Node bindentAtt = atts.getNamedItem("bindent");//$NON-NLS-1$
-		int style = BulletParagraph.CIRCLE;
-		int indent = -1;
-		int bindent = -1;
-		String text = null;
-		boolean addSpace = true;
-
-		if (addSpaceAtt != null) {
-			String value = addSpaceAtt.getNodeValue();
-			addSpace = value.equalsIgnoreCase("true"); //$NON-NLS-1$
-		}
-		if (styleAtt != null) {
-			String value = styleAtt.getNodeValue();
-			if (value.equalsIgnoreCase("text")) { //$NON-NLS-1$
-				style = BulletParagraph.TEXT;
-			} else if (value.equalsIgnoreCase("image")) { //$NON-NLS-1$
-				style = BulletParagraph.IMAGE;
-			} else if (value.equalsIgnoreCase("bullet")) { //$NON-NLS-1$
-				style = BulletParagraph.CIRCLE;
-			}
-		}
-		if (valueAtt != null) {
-			text = valueAtt.getNodeValue();
-			if (style == BulletParagraph.IMAGE)
-				text = "i." + text; //$NON-NLS-1$
-		}
-		if (indentAtt != null) {
-			String value = indentAtt.getNodeValue();
-			try {
-				indent = Integer.parseInt(value);
-			} catch (NumberFormatException e) {
-			}
-		}
-		if (bindentAtt != null) {
-			String value = bindentAtt.getNodeValue();
-			try {
-				bindent = Integer.parseInt(value);
-			} catch (NumberFormatException e) {
-			}
-		}
-
-		BulletParagraph p = new BulletParagraph(addSpace);
-		p.setIndent(indent);
-		p.setBulletIndent(bindent);
-		p.setBulletStyle(style);
-		p.setBulletText(text);
-
-		processSegments(p, children, expandURLs);
-		return p;
-	}
-
-	private void processSegments(Paragraph p, NodeList children,
-			boolean expandURLs) {
-		for (int i = 0; i < children.getLength(); i++) {
-			Node child = children.item(i);
-			ParagraphSegment segment = null;
-
-			if (child.getNodeType() == Node.TEXT_NODE) {
-				String value = getSingleNodeText(child);
-
-				if (value != null && !isIgnorableWhiteSpace(value, false)) {
-					p.parseRegularText(value, expandURLs, true,
-							getHyperlinkSettings(), null);
-				}
-			} else if (child.getNodeType() == Node.ELEMENT_NODE) {
-				String name = child.getNodeName();
-				if (name.equalsIgnoreCase("img")) { //$NON-NLS-1$
-					segment = processImageSegment(child);
-				} else if (name.equalsIgnoreCase("a")) { //$NON-NLS-1$
-					segment = processHyperlinkSegment(child,
-							getHyperlinkSettings());
-				} else if (name.equalsIgnoreCase("span")) { //$NON-NLS-1$
-					processTextSegment(p, expandURLs, child);
-				} else if (name.equalsIgnoreCase("b")) { //$NON-NLS-1$
-					String text = getNodeText(child);
-					String fontId = BOLD_FONT_ID;
-					p.parseRegularText(text, expandURLs, true,
-							getHyperlinkSettings(), fontId);
-				} else if (name.equalsIgnoreCase("br")) { //$NON-NLS-1$
-					segment = new BreakSegment();
-				} else if (name.equalsIgnoreCase("control")) { //$NON-NLS-1$
-					segment = processControlSegment(child);
-				}
-			}
-			if (segment != null) {
-				p.addSegment(segment);
-			}
-		}
-	}
-
-	private boolean isIgnorableWhiteSpace(String text, boolean ignoreSpaces) {
-		for (int i = 0; i < text.length(); i++) {
-			char c = text.charAt(i);
-			if (ignoreSpaces && c == ' ')
-				continue;
-			if (c == '\n' || c == '\r' || c == '\f')
-				continue;
-			return false;
-		}
-		return true;
-	}
-
-	private ImageSegment processImageSegment(Node image) {
-		ImageSegment segment = new ImageSegment();
-		processObjectSegment(segment, image, "i."); //$NON-NLS-1$
-		return segment;
-	}
-
-	private ControlSegment processControlSegment(Node control) {
-		ControlSegment segment = new ControlSegment();
-		processObjectSegment(segment, control, "o."); //$NON-NLS-1$
-		Node fill = control.getAttributes().getNamedItem("fill"); //$NON-NLS-1$
-		if (fill!=null) {
-			String value = fill.getNodeValue();
-			boolean doFill = value.equalsIgnoreCase("true"); //$NON-NLS-1$
-			segment.setFill(doFill);
-		}
-		try {
-			Node width = control.getAttributes().getNamedItem("width"); //$NON-NLS-1$
-			if (width!=null) {
-				String value = width.getNodeValue();
-				int doWidth = Integer.parseInt(value);
-				segment.setWidth(doWidth);
-			}
-			Node height = control.getAttributes().getNamedItem("height"); //$NON-NLS-1$
-			if (height!=null) {
-				String value = height.getNodeValue();
-				int doHeight = Integer.parseInt(value);
-				segment.setHeight(doHeight);
-			}
-		}
-		catch (NumberFormatException e) {
-			// ignore invalid width or height
-		}
-		return segment;
-	}
-
-	private void processObjectSegment(ObjectSegment segment, Node object, String prefix) {
-		NamedNodeMap atts = object.getAttributes();
-		Node id = atts.getNamedItem("href"); //$NON-NLS-1$
-		Node align = atts.getNamedItem("align"); //$NON-NLS-1$
-		if (id != null) {
-			String value = id.getNodeValue();
-			segment.setObjectId(prefix + value);
-		}
-		if (align != null) {
-			String value = align.getNodeValue().toLowerCase();
-			if (value.equals("top")) //$NON-NLS-1$
-				segment.setVerticalAlignment(ImageSegment.TOP);
-			else if (value.equals("middle")) //$NON-NLS-1$
-				segment.setVerticalAlignment(ImageSegment.MIDDLE);
-			else if (value.equals("bottom")) //$NON-NLS-1$
-				segment.setVerticalAlignment(ImageSegment.BOTTOM);
-		}
-	}
-
-	private void appendText(String value, StringBuffer buf, int[] spaceCounter) {
-		if (!whitespaceNormalized)
-			buf.append(value);
-		else {
-			for (int j = 0; j < value.length(); j++) {
-				char c = value.charAt(j);
-				if (c == ' ' || c == '\t') {
-					// space
-					if (++spaceCounter[0] == 1) {
-						buf.append(c);
-					}
-				} else if (c == '\n' || c == '\r' || c == '\f') {
-					// new line
-					if (++spaceCounter[0] == 1) {
-						buf.append(' ');
-					}
-				} else {
-					// other characters
-					spaceCounter[0] = 0;
-					buf.append(c);
-				}
-			}
-		}
-	}
-
-	private String getNormalizedText(String text) {
-		int[] spaceCounter = new int[1];
-		StringBuffer buf = new StringBuffer();
-
-		if (text == null)
-			return null;
-		appendText(text, buf, spaceCounter);
-		return buf.toString();
-	}
-
-	private String getSingleNodeText(Node node) {
-		return getNormalizedText(node.getNodeValue());
-	}
-
-	private String getNodeText(Node node) {
-		NodeList children = node.getChildNodes();
-		StringBuffer buf = new StringBuffer();
-		int[] spaceCounter = new int[1];
-
-		for (int i = 0; i < children.getLength(); i++) {
-			Node child = children.item(i);
-			if (child.getNodeType() == Node.TEXT_NODE) {
-				String value = child.getNodeValue();
-				appendText(value, buf, spaceCounter);
-			}
-		}
-		return buf.toString().trim();
-	}
-
-	private ParagraphSegment processHyperlinkSegment(Node link,
-			HyperlinkSettings settings) {
-		NamedNodeMap atts = link.getAttributes();
-		String href = null;
-		boolean wrapAllowed = true;
-		String boldFontId = null;
-
-		Node hrefAtt = atts.getNamedItem("href"); //$NON-NLS-1$
-		if (hrefAtt != null) {
-			href = hrefAtt.getNodeValue();
-		}
-		Node boldAtt = atts.getNamedItem("bold"); //$NON-NLS-1$
-		if (boldAtt != null) {
-			boldFontId = BOLD_FONT_ID;
-		}
-		Node nowrap = atts.getNamedItem("nowrap"); //$NON-NLS-1$
-		if (nowrap != null) {
-			String value = nowrap.getNodeValue();
-			if (value != null && value.equalsIgnoreCase("true")) //$NON-NLS-1$
-				wrapAllowed = false;
-		}
-		Object status = checkChildren(link);
-		if (status instanceof Node) {
-			Node child = (Node)status;
-			ImageHyperlinkSegment segment = new ImageHyperlinkSegment();
-			segment.setHref(href);
-			segment.setWordWrapAllowed(wrapAllowed);
-			Node alt = child.getAttributes().getNamedItem("alt"); //$NON-NLS-1$
-			if (alt!=null)
-				segment.setTooltipText(alt.getNodeValue());
-			Node text = child.getAttributes().getNamedItem("text"); //$NON-NLS-1$
-			if (text!=null)
-				segment.setText(text.getNodeValue());
-			processObjectSegment(segment, child, "i."); //$NON-NLS-1$
-			return segment;
-		}  else if (status instanceof String) {
-			String text = (String) status;
-			TextHyperlinkSegment segment = new TextHyperlinkSegment(text,
-					settings, null);
-			segment.setHref(href);
-			segment.setFontId(boldFontId);
-			Node alt = atts.getNamedItem("alt"); //$NON-NLS-1$
-			if (alt!=null)
-				segment.setTooltipText(alt.getNodeValue());			
-			segment.setWordWrapAllowed(wrapAllowed);
-			return segment;
-		} else {
-			AggregateHyperlinkSegment parent = new AggregateHyperlinkSegment();
-			parent.setHref(href);
-			NodeList children = link.getChildNodes();
-			for (int i = 0; i < children.getLength(); i++) {
-				Node child = children.item(i);
-				if (child.getNodeType() == Node.TEXT_NODE) {
-					String value = child.getNodeValue();
-					TextHyperlinkSegment ts = new TextHyperlinkSegment(
-							getNormalizedText(value), settings, null);
-					Node alt = atts.getNamedItem("alt"); //$NON-NLS-1$
-					if (alt!=null)
-						ts.setTooltipText(alt.getNodeValue());
-					ts.setWordWrapAllowed(wrapAllowed);
-					parent.add(ts);
-				} else if (child.getNodeType() == Node.ELEMENT_NODE) {
-					String name = child.getNodeName();
-					if (name.equalsIgnoreCase("img")) { //$NON-NLS-1$
-						ImageHyperlinkSegment is = new ImageHyperlinkSegment();
-						processObjectSegment(is, child, "i."); //$NON-NLS-1$
-						Node alt = child.getAttributes().getNamedItem("alt"); //$NON-NLS-1$
-						if (alt!=null)
-							is.setTooltipText(alt.getNodeValue());
-						parent.add(is);
-						is.setWordWrapAllowed(wrapAllowed);
-					}
-				}
-			}
-			return parent;
-		}
-	}
-
-	private Object checkChildren(Node node) {
-		boolean text = false;
-		Node imgNode = null;
-		//int status = 0;
-
-		NodeList children = node.getChildNodes();
-		for (int i = 0; i < children.getLength(); i++) {
-			Node child = children.item(i);
-			if (child.getNodeType() == Node.TEXT_NODE)
-				text = true;
-			else if (child.getNodeType() == Node.ELEMENT_NODE
-					&& child.getNodeName().equalsIgnoreCase("img")) { //$NON-NLS-1$
-				imgNode = child;
-			}
-		}
-		if (text && imgNode == null)
-			return getNodeText(node);
-		else if (!text && imgNode != null)
-			return imgNode;
-		else return null;
-	}
-
-	private void processTextSegment(Paragraph p, boolean expandURLs,
-			Node textNode) {
-		String text = getNodeText(textNode);
-
-		NamedNodeMap atts = textNode.getAttributes();
-		Node font = atts.getNamedItem("font"); //$NON-NLS-1$
-		Node color = atts.getNamedItem("color"); //$NON-NLS-1$
-		boolean wrapAllowed=true;
-		Node nowrap = atts.getNamedItem("nowrap"); //$NON-NLS-1$
-		if (nowrap != null) {
-			String value = nowrap.getNodeValue();
-			if (value != null && value.equalsIgnoreCase("true")) //$NON-NLS-1$
-				wrapAllowed = false;
-		}
-		String fontId = null;
-		String colorId = null;
-		if (font != null) {
-			fontId = "f." + font.getNodeValue(); //$NON-NLS-1$
-		}
-		if (color != null) {
-			colorId = "c." + color.getNodeValue(); //$NON-NLS-1$
-		}
-		p.parseRegularText(text, expandURLs, wrapAllowed, getHyperlinkSettings(), fontId,
-				colorId);
-	}
-
-	public void parseRegularText(String regularText, boolean convertURLs) {
-		reset();
-
-		if (regularText == null)
-			return;
-
-		regularText = getNormalizedText(regularText);
-
-		Paragraph p = new Paragraph(true);
-		paragraphs.add(p);
-		int pstart = 0;
-
-		for (int i = 0; i < regularText.length(); i++) {
-			char c = regularText.charAt(i);
-			if (p == null) {
-				p = new Paragraph(true);
-				paragraphs.add(p);
-			}
-			if (c == '\n') {
-				String text = regularText.substring(pstart, i);
-				pstart = i + 1;
-				p.parseRegularText(text, convertURLs, true, getHyperlinkSettings(),
-						null);
-				p = null;
-			}
-		}
-		if (p != null) {
-			// no new line
-			String text = regularText.substring(pstart);
-			p.parseRegularText(text, convertURLs, true, getHyperlinkSettings(), null);
-		}
-	}
-
-	public HyperlinkSettings getHyperlinkSettings() {
-		// #132723 cannot have null settings
-		if (hyperlinkSettings==null)
-			hyperlinkSettings = new HyperlinkSettings(SWTUtil.getStandardDisplay());
-		return hyperlinkSettings;
-	}
-
-	public void setHyperlinkSettings(HyperlinkSettings settings) {
-		this.hyperlinkSettings = settings;
-	}
-
-	private void reset() {
-		if (paragraphs == null)
-			paragraphs = new Vector();
-		paragraphs.clear();
-		selectedSegmentIndex = -1;
-		savedSelectedLinkIndex = -1;
-		selectableSegments = null;
-	}
-
-	IFocusSelectable[] getFocusSelectableSegments() {
-		if (selectableSegments != null || paragraphs == null)
-			return selectableSegments;
-		Vector result = new Vector();
-		for (int i = 0; i < paragraphs.size(); i++) {
-			Paragraph p = (Paragraph) paragraphs.get(i);
-			ParagraphSegment[] segments = p.getSegments();
-			for (int j = 0; j < segments.length; j++) {
-				if (segments[j] instanceof IFocusSelectable)
-					result.add(segments[j]);
-			}
-		}
-		selectableSegments = (IFocusSelectable[]) result
-				.toArray(new IFocusSelectable[result.size()]);
-		return selectableSegments;
-	}
-	
-	public IHyperlinkSegment getHyperlink(int index) {
-		IFocusSelectable[] selectables = getFocusSelectableSegments();
-		if (selectables.length>index) {
-			IFocusSelectable link = selectables[index];
-			if (link instanceof IHyperlinkSegment)
-				return (IHyperlinkSegment)link;
-		}
-		return null;
-	}
-	
-	public IHyperlinkSegment findHyperlinkAt(int x, int y) {
-		IFocusSelectable[] selectables = getFocusSelectableSegments();
-		for (int i = 0; i < selectables.length; i++) {
-			IFocusSelectable segment = selectables[i];
-			if (segment instanceof IHyperlinkSegment) {
-				IHyperlinkSegment link = (IHyperlinkSegment)segment;
-				if (link.contains(x, y))
-					return link;
-			}
-		}
-		return null;
-	}
-	
-	public int getHyperlinkCount() {
-		return getFocusSelectableSegments().length;
-	}
-	
-	public int indexOf(IHyperlinkSegment link) {
-		IFocusSelectable[] selectables = getFocusSelectableSegments();
-		for (int i = 0; i < selectables.length; i++) {
-			IFocusSelectable segment = selectables[i];
-			if (segment instanceof IHyperlinkSegment) {
-				IHyperlinkSegment l = (IHyperlinkSegment)segment;
-				if (link==l)
-					return i;
-			}
-		}
-		return -1;
-	}
-
-	public ParagraphSegment findSegmentAt(int x, int y) {
-		for (int i = 0; i < paragraphs.size(); i++) {
-			Paragraph p = (Paragraph) paragraphs.get(i);
-			ParagraphSegment segment = p.findSegmentAt(x, y);
-			if (segment != null)
-				return segment;
-		}
-		return null;
-	}
-	
-	public void clearCache(String fontId) {
-		for (int i = 0; i < paragraphs.size(); i++) {
-			Paragraph p = (Paragraph) paragraphs.get(i);
-			p.clearCache(fontId);
-		}
-	}
-
-	public IFocusSelectable getSelectedSegment() {
-		if (selectableSegments==null || selectedSegmentIndex == -1)
-			return null;
-		return selectableSegments[selectedSegmentIndex];
-	}
-	
-	public int getSelectedSegmentIndex() {
-		return selectedSegmentIndex;
-	}
-	
-	public boolean linkExists(IHyperlinkSegment link) {
-		if (selectableSegments==null)
-			return false;
-		for (int i=0; i<selectableSegments.length; i++) {
-			if (selectableSegments[i]==link)
-				return true;
-		}
-		return false;
-	}
-
-	public boolean traverseFocusSelectableObjects(boolean next) {
-		IFocusSelectable[] selectables = getFocusSelectableSegments();
-		if (selectables == null)
-			return false;
-		int size = selectables.length;
-		if (next) {
-			selectedSegmentIndex++;
-		} else
-			selectedSegmentIndex--;
-
-		if (selectedSegmentIndex < 0 || selectedSegmentIndex > size - 1) {
-			selectedSegmentIndex = -1;
-		}
-		return selectedSegmentIndex != -1;
-	}
-	
-	public IFocusSelectable getNextFocusSegment(boolean next) {
-		IFocusSelectable[] selectables = getFocusSelectableSegments();
-		if (selectables == null)
-			return null;
-		int nextIndex = next?selectedSegmentIndex+1:selectedSegmentIndex-1;
-
-		if (nextIndex < 0 || nextIndex > selectables.length - 1) {
-			return null;
-		}
-		return selectables[nextIndex];
-	}
-	
-	public boolean restoreSavedLink() {
-		if (savedSelectedLinkIndex!= -1) {
-			selectedSegmentIndex = savedSelectedLinkIndex;
-			return true;
-		}
-		return false;
-	}
-
-	public void selectLink(IHyperlinkSegment link) {
-		if (link == null) {
-			savedSelectedLinkIndex = selectedSegmentIndex;	
-			selectedSegmentIndex = -1;
-		}
-		else {
-			select(link);
-
-		}
-	}
-	
-	public void select(IFocusSelectable selectable) {
-		IFocusSelectable[] selectables = getFocusSelectableSegments();
-		selectedSegmentIndex = -1;
-		if (selectables == null)
-			return;
-		for (int i = 0; i < selectables.length; i++) {
-			if (selectables[i].equals(selectable)) {
-				selectedSegmentIndex = i;
-				break;
-			}
-		}
-	}
-
-	public boolean hasFocusSegments() {
-		IFocusSelectable[] segments = getFocusSelectableSegments();
-		if (segments.length > 0)
-			return true;
-		return false;
-	}
-
-	public void dispose() {
-		paragraphs = null;
-		selectedSegmentIndex = -1;
-		savedSelectedLinkIndex = -1;
-		selectableSegments = null;
-	}
-
-	/**
-	 * @return Returns the whitespaceNormalized.
-	 */
-	public boolean isWhitespaceNormalized() {
-		return whitespaceNormalized;
-	}
-
-	/**
-	 * @param whitespaceNormalized
-	 *            The whitespaceNormalized to set.
-	 */
-	public void setWhitespaceNormalized(boolean whitespaceNormalized) {
-		this.whitespaceNormalized = whitespaceNormalized;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormUtil.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormUtil.java
deleted file mode 100644
index db479e9..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormUtil.java
+++ /dev/null
@@ -1,523 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Chriss Gross (schtoo@schtoo.com) - fix for 61670
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.ScrollBar;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.widgets.ColumnLayout;
-import org.eclipse.ui.forms.widgets.Form;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ILayoutExtension;
-
-import com.ibm.icu.text.BreakIterator;
-
-public class FormUtil {
-	public static final String PLUGIN_ID = "org.eclipse.ui.forms"; //$NON-NLS-1$
-
-	static final int H_SCROLL_INCREMENT = 5;
-
-	static final int V_SCROLL_INCREMENT = 64;
-
-	public static final String DEBUG = PLUGIN_ID + "/debug"; //$NON-NLS-1$
-
-	public static final String DEBUG_TEXT = DEBUG + "/text"; //$NON-NLS-1$
-	public static final String DEBUG_TEXTSIZE = DEBUG + "/textsize"; //$NON-NLS-1$
-
-	public static final String DEBUG_FOCUS = DEBUG + "/focus"; //$NON-NLS-1$
-
-	public static final String FOCUS_SCROLLING = "focusScrolling"; //$NON-NLS-1$
-	
-	public static final String IGNORE_BODY = "__ignore_body__"; //$NON-NLS-1$
-
-	public static Text createText(Composite parent, String label,
-			FormToolkit factory) {
-		return createText(parent, label, factory, 1);
-	}
-
-	public static Text createText(Composite parent, String label,
-			FormToolkit factory, int span) {
-		factory.createLabel(parent, label);
-		Text text = factory.createText(parent, ""); //$NON-NLS-1$
-		int hfill = span == 1 ? GridData.FILL_HORIZONTAL
-				: GridData.HORIZONTAL_ALIGN_FILL;
-		GridData gd = new GridData(hfill | GridData.VERTICAL_ALIGN_CENTER);
-		gd.horizontalSpan = span;
-		text.setLayoutData(gd);
-		return text;
-	}
-
-	public static Text createText(Composite parent, String label,
-			FormToolkit factory, int span, int style) {
-		Label l = factory.createLabel(parent, label);
-		if ((style & SWT.MULTI) != 0) {
-			GridData gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
-			l.setLayoutData(gd);
-		}
-		Text text = factory.createText(parent, "", style); //$NON-NLS-1$
-		int hfill = span == 1 ? GridData.FILL_HORIZONTAL
-				: GridData.HORIZONTAL_ALIGN_FILL;
-		GridData gd = new GridData(hfill | GridData.VERTICAL_ALIGN_CENTER);
-		gd.horizontalSpan = span;
-		text.setLayoutData(gd);
-		return text;
-	}
-
-	public static Text createText(Composite parent, FormToolkit factory,
-			int span) {
-		Text text = factory.createText(parent, ""); //$NON-NLS-1$
-		int hfill = span == 1 ? GridData.FILL_HORIZONTAL
-				: GridData.HORIZONTAL_ALIGN_FILL;
-		GridData gd = new GridData(hfill | GridData.VERTICAL_ALIGN_CENTER);
-		gd.horizontalSpan = span;
-		text.setLayoutData(gd);
-		return text;
-	}
-
-	public static int computeMinimumWidth(GC gc, String text) {
-		BreakIterator wb = BreakIterator.getWordInstance();
-		wb.setText(text);
-		int last = 0;
-
-		int width = 0;
-
-		for (int loc = wb.first(); loc != BreakIterator.DONE; loc = wb.next()) {
-			String word = text.substring(last, loc);
-			Point extent = gc.textExtent(word);
-			width = Math.max(width, extent.x);
-			last = loc;
-		}
-		String lastWord = text.substring(last);
-		Point extent = gc.textExtent(lastWord);
-		width = Math.max(width, extent.x);
-		return width;
-	}
-
-	public static Point computeWrapSize(GC gc, String text, int wHint) {
-		BreakIterator wb = BreakIterator.getWordInstance();
-		wb.setText(text);
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-
-		int saved = 0;
-		int last = 0;
-		int height = lineHeight;
-		int maxWidth = 0;
-		for (int loc = wb.first(); loc != BreakIterator.DONE; loc = wb.next()) {
-			String word = text.substring(saved, loc);
-			Point extent = gc.textExtent(word);
-			if (extent.x > wHint) {
-				// overflow
-				saved = last;
-				height += extent.y;
-				// switch to current word so maxWidth will accommodate very long single words
-				word = text.substring(last, loc);
-				extent = gc.textExtent(word);
-			}
-			maxWidth = Math.max(maxWidth, extent.x);
-			last = loc;
-		}
-		/*
-		 * Correct the height attribute in case it was calculated wrong due to wHint being less than maxWidth.
-		 * The recursive call proved to be the only thing that worked in all cases. Some attempts can be made
-		 * to estimate the height, but the algorithm needs to be run again to be sure.
-		 */
-		if (maxWidth > wHint)
-			return computeWrapSize(gc, text, maxWidth);
-		return new Point(maxWidth, height);
-	}
-
-	public static void paintWrapText(GC gc, String text, Rectangle bounds) {
-		paintWrapText(gc, text, bounds, false);
-	}
-
-	public static void paintWrapText(GC gc, String text, Rectangle bounds,
-			boolean underline) {
-		BreakIterator wb = BreakIterator.getWordInstance();
-		wb.setText(text);
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-		int descent = fm.getDescent();
-
-		int saved = 0;
-		int last = 0;
-		int y = bounds.y;
-		int width = bounds.width;
-
-		for (int loc = wb.first(); loc != BreakIterator.DONE; loc = wb.next()) {
-			String line = text.substring(saved, loc);
-			Point extent = gc.textExtent(line);
-
-			if (extent.x > width) {
-				// overflow
-				String prevLine = text.substring(saved, last);
-				gc.drawText(prevLine, bounds.x, y, true);
-				if (underline) {
-					Point prevExtent = gc.textExtent(prevLine);
-					int lineY = y + lineHeight - descent + 1;
-					gc
-							.drawLine(bounds.x, lineY, bounds.x + prevExtent.x,
-									lineY);
-				}
-
-				saved = last;
-				y += lineHeight;
-			}
-			last = loc;
-		}
-		// paint the last line
-		String lastLine = text.substring(saved, last);
-		gc.drawText(lastLine, bounds.x, y, true);
-		if (underline) {
-			int lineY = y + lineHeight - descent + 1;
-			Point lastExtent = gc.textExtent(lastLine);
-			gc.drawLine(bounds.x, lineY, bounds.x + lastExtent.x, lineY);
-		}
-	}
-
-	public static ScrolledComposite getScrolledComposite(Control c) {
-		Composite parent = c.getParent();
-
-		while (parent != null) {
-			if (parent instanceof ScrolledComposite) {
-				return (ScrolledComposite) parent;
-			}
-			parent = parent.getParent();
-		}
-		return null;
-	}
-
-	public static void ensureVisible(Control c) {
-		ScrolledComposite scomp = getScrolledComposite(c);
-		if (scomp != null) {
-			Object data = scomp.getData(FOCUS_SCROLLING);
-			if (data == null || !data.equals(Boolean.FALSE))
-				FormUtil.ensureVisible(scomp, c);
-		}
-	}
-
-	public static void ensureVisible(ScrolledComposite scomp, Control control) {
-		// if the control is a FormText we do not need to scroll since it will
-		// ensure visibility of its segments as necessary
-		if (control instanceof FormText)
-			return;
-		Point controlSize = control.getSize();
-		Point controlOrigin = getControlLocation(scomp, control);
-		ensureVisible(scomp, controlOrigin, controlSize);
-	}
-
-	public static void ensureVisible(ScrolledComposite scomp,
-			Point controlOrigin, Point controlSize) {
-		Rectangle area = scomp.getClientArea();
-		Point scompOrigin = scomp.getOrigin();
-
-		int x = scompOrigin.x;
-		int y = scompOrigin.y;
-
-		// horizontal right, but only if the control is smaller
-		// than the client area
-		if (controlSize.x < area.width
-				&& (controlOrigin.x + controlSize.x > scompOrigin.x
-						+ area.width)) {
-			x = controlOrigin.x + controlSize.x - area.width;
-		}
-		// horizontal left - make sure the left edge of
-		// the control is showing
-		if (controlOrigin.x < x) {
-			if (controlSize.x < area.width)
-				x = controlOrigin.x + controlSize.x - area.width;
-			else
-				x = controlOrigin.x;
-		}
-		// vertical bottom
-		if (controlSize.y < area.height
-				&& (controlOrigin.y + controlSize.y > scompOrigin.y
-						+ area.height)) {
-			y = controlOrigin.y + controlSize.y - area.height;
-		}
-		// vertical top - make sure the top of
-		// the control is showing
-		if (controlOrigin.y < y) {
-			if (controlSize.y < area.height)
-				y = controlOrigin.y + controlSize.y - area.height;
-			else
-				y = controlOrigin.y;
-		}
-
-		if (scompOrigin.x != x || scompOrigin.y != y) {
-			// scroll to reveal
-			scomp.setOrigin(x, y);
-		}
-	}
-
-	public static void ensureVisible(ScrolledComposite scomp, Control control,
-			MouseEvent e) {
-		Point controlOrigin = getControlLocation(scomp, control);
-		int rX = controlOrigin.x + e.x;
-		int rY = controlOrigin.y + e.y;
-		Rectangle area = scomp.getClientArea();
-		Point scompOrigin = scomp.getOrigin();
-
-		int x = scompOrigin.x;
-		int y = scompOrigin.y;
-		// System.out.println("Ensure: area="+area+", origin="+scompOrigin+",
-		// cloc="+controlOrigin+", csize="+controlSize+", x="+x+", y="+y);
-
-		// horizontal right
-		if (rX > scompOrigin.x + area.width) {
-			x = rX - area.width;
-		}
-		// horizontal left
-		else if (rX < x) {
-			x = rX;
-		}
-		// vertical bottom
-		if (rY > scompOrigin.y + area.height) {
-			y = rY - area.height;
-		}
-		// vertical top
-		else if (rY < y) {
-			y = rY;
-		}
-
-		if (scompOrigin.x != x || scompOrigin.y != y) {
-			// scroll to reveal
-			scomp.setOrigin(x, y);
-		}
-	}
-
-	public static Point getControlLocation(ScrolledComposite scomp,
-			Control control) {
-		int x = 0;
-		int y = 0;
-		Control content = scomp.getContent();
-		Control currentControl = control;
-		for (;;) {
-			if (currentControl == content)
-				break;
-			Point location = currentControl.getLocation();
-			// if (location.x > 0)
-			// x += location.x;
-			// if (location.y > 0)
-			// y += location.y;
-			x += location.x;
-			y += location.y;
-			currentControl = currentControl.getParent();
-		}
-		return new Point(x, y);
-	}
-
-	static void scrollVertical(ScrolledComposite scomp, boolean up) {
-		scroll(scomp, 0, up ? -V_SCROLL_INCREMENT : V_SCROLL_INCREMENT);
-	}
-
-	static void scrollHorizontal(ScrolledComposite scomp, boolean left) {
-		scroll(scomp, left ? -H_SCROLL_INCREMENT : H_SCROLL_INCREMENT, 0);
-	}
-
-	static void scrollPage(ScrolledComposite scomp, boolean up) {
-		Rectangle clientArea = scomp.getClientArea();
-		int increment = up ? -clientArea.height : clientArea.height;
-		scroll(scomp, 0, increment);
-	}
-
-	static void scroll(ScrolledComposite scomp, int xoffset, int yoffset) {
-		Point origin = scomp.getOrigin();
-		Point contentSize = scomp.getContent().getSize();
-		int xorigin = origin.x + xoffset;
-		int yorigin = origin.y + yoffset;
-		xorigin = Math.max(xorigin, 0);
-		xorigin = Math.min(xorigin, contentSize.x - 1);
-		yorigin = Math.max(yorigin, 0);
-		yorigin = Math.min(yorigin, contentSize.y - 1);
-		scomp.setOrigin(xorigin, yorigin);
-	}
-
-	public static void updatePageIncrement(ScrolledComposite scomp) {
-		ScrollBar vbar = scomp.getVerticalBar();
-		if (vbar != null) {
-			Rectangle clientArea = scomp.getClientArea();
-			int increment = clientArea.height - 5;
-			vbar.setPageIncrement(increment);
-		}
-		ScrollBar hbar = scomp.getHorizontalBar();
-		if (hbar != null) {
-			Rectangle clientArea = scomp.getClientArea();
-			int increment = clientArea.width - 5;
-			hbar.setPageIncrement(increment);
-		}
-	}
-
-	public static void processKey(int keyCode, Control c) {
-		ScrolledComposite scomp = FormUtil.getScrolledComposite(c);
-		if (scomp != null) {
-			if (c instanceof Combo)
-				return;
-			switch (keyCode) {
-			case SWT.ARROW_DOWN:
-				if (scomp.getData("novarrows") == null) //$NON-NLS-1$
-					FormUtil.scrollVertical(scomp, false);
-				break;
-			case SWT.ARROW_UP:
-				if (scomp.getData("novarrows") == null) //$NON-NLS-1$
-					FormUtil.scrollVertical(scomp, true);
-				break;
-			case SWT.ARROW_LEFT:
-				FormUtil.scrollHorizontal(scomp, true);
-				break;
-			case SWT.ARROW_RIGHT:
-				FormUtil.scrollHorizontal(scomp, false);
-				break;
-			case SWT.PAGE_UP:
-				FormUtil.scrollPage(scomp, true);
-				break;
-			case SWT.PAGE_DOWN:
-				FormUtil.scrollPage(scomp, false);
-				break;
-			}
-		}
-	}
-
-	public static boolean isWrapControl(Control c) {
-		if ((c.getStyle() & SWT.WRAP) != 0)
-			return true;
-		if (c instanceof Composite) {
-			return ((Composite) c).getLayout() instanceof ILayoutExtension;
-		}
-		return false;
-	}
-
-	public static int getWidthHint(int wHint, Control c) {
-		boolean wrap = isWrapControl(c);
-		return wrap ? wHint : SWT.DEFAULT;
-	}
-
-	public static int getHeightHint(int hHint, Control c) {
-		if (c instanceof Composite) {
-			Layout layout = ((Composite) c).getLayout();
-			if (layout instanceof ColumnLayout)
-				return hHint;
-		}
-		return SWT.DEFAULT;
-	}
-
-	public static int computeMinimumWidth(Control c, boolean changed) {
-		if (c instanceof Composite) {
-			Layout layout = ((Composite) c).getLayout();
-			if (layout instanceof ILayoutExtension)
-				return ((ILayoutExtension) layout).computeMinimumWidth(
-						(Composite) c, changed);
-		}
-		return c.computeSize(FormUtil.getWidthHint(5, c), SWT.DEFAULT, changed).x;
-	}
-
-	public static int computeMaximumWidth(Control c, boolean changed) {
-		if (c instanceof Composite) {
-			Layout layout = ((Composite) c).getLayout();
-			if (layout instanceof ILayoutExtension)
-				return ((ILayoutExtension) layout).computeMaximumWidth(
-						(Composite) c, changed);
-		}
-		return c.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed).x;
-	}
-
-	public static Form getForm(Control c) {
-		Composite parent = c.getParent();
-		while (parent != null) {
-			if (parent instanceof Form) {
-				return (Form) parent;
-			}
-			parent = parent.getParent();
-		}
-		return null;
-	}
-
-	public static Image createAlphaMashImage(Device device, Image srcImage) {
-		Rectangle bounds = srcImage.getBounds();
-		int alpha = 0;
-		int calpha = 0;
-		ImageData data = srcImage.getImageData();
-		// Create a new image with alpha values alternating
-		// between fully transparent (0) and fully opaque (255).
-		// This image will show the background through the
-		// transparent pixels.
-		for (int i = 0; i < bounds.height; i++) {
-			// scan line
-			alpha = calpha;
-			for (int j = 0; j < bounds.width; j++) {
-				// column
-				data.setAlpha(j, i, alpha);
-				alpha = alpha == 255 ? 0 : 255;
-			}
-			calpha = calpha == 255 ? 0 : 255;
-		}
-		return new Image(device, data);
-	}
-
-	public static boolean mnemonicMatch(String text, char key) {
-		char mnemonic = findMnemonic(text);
-		if (mnemonic == '\0')
-			return false;
-		return Character.toUpperCase(key) == Character.toUpperCase(mnemonic);
-	}
-
-	private static char findMnemonic(String string) {
-		int index = 0;
-		int length = string.length();
-		do {
-			while (index < length && string.charAt(index) != '&')
-				index++;
-			if (++index >= length)
-				return '\0';
-			if (string.charAt(index) != '&')
-				return string.charAt(index);
-			index++;
-		} while (index < length);
-		return '\0';
-	}
-	
-	public static void setFocusScrollingEnabled(Control c, boolean enabled) {
-		ScrolledComposite scomp = null;
-		
-		if (c instanceof ScrolledComposite)
-			scomp = (ScrolledComposite)c;
-		else
-			scomp = getScrolledComposite(c);
-		if (scomp!=null)
-			scomp.setData(FormUtil.FOCUS_SCROLLING, enabled?null:Boolean.FALSE);
-	}
-	
-	public static void setAntialias(GC gc, int style) {
-		if (!gc.getAdvanced()) {
-			gc.setAdvanced(true);
-			if (!gc.getAdvanced())
-				return;
-		}
-		gc.setAntialias(style);
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormsResources.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormsResources.java
deleted file mode 100644
index b0927db..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/FormsResources.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Utility methods to access shared form-specific resources.
- * <p>
- * All methods declared on this class are static. This
- * class cannot be instantiated.
- * </p>
- * <p>
- * </p>
- */
-public class FormsResources {
-	private static Cursor busyCursor;
-	private static Cursor handCursor;
-	private static Cursor textCursor;
-	
-	public static Cursor getBusyCursor() {
-		if (busyCursor==null)
-			busyCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_WAIT);
-		return busyCursor;
-	}
-	public static Cursor getHandCursor() {
-		if (handCursor==null)
-			handCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_HAND);
-		return handCursor;
-	}
-	public static Cursor getTextCursor() {
-		if (textCursor==null)
-			textCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_IBEAM);
-		return textCursor;
-	}
-	
-	public static int getProgressDelay(int index) {
-		/*
-		if (progressDelays==null)
-			return 0;
-		return progressDelays[index];
-		*/
-		return 100;
-	}
-	
-	public static void shutdown() {
-		if (busyCursor!=null)
-			busyCursor.dispose();
-		if (handCursor!=null)
-			handCursor.dispose();
-		if (textCursor!=null)
-			textCursor.dispose();
-		busyCursor=null;
-		handCursor=null;
-		textCursor=null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/IFocusSelectable.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/IFocusSelectable.java
deleted file mode 100644
index e4b9a76..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/IFocusSelectable.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.Hashtable;
-
-import org.eclipse.swt.graphics.Rectangle;
-
-public interface IFocusSelectable {
-	boolean isFocusSelectable(Hashtable resourceTable);
-	boolean setFocus(Hashtable resourceTable, boolean direction);
-	Rectangle getBounds();
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/IHyperlinkSegment.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/IHyperlinkSegment.java
deleted file mode 100644
index 57d11a9..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/IHyperlinkSegment.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Chriss Gross (schtoo@schtoo.com) - fix for 61670
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.graphics.GC;
-
-public interface IHyperlinkSegment extends IFocusSelectable {
-	String getHref();
-	String getText();
-	void paintFocus(GC gc, Color bg, Color fg, boolean selected, Rectangle repaintRegion);
-	boolean contains(int x, int y);
-	boolean intersects(Rectangle rect);
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/ImageHyperlinkSegment.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/ImageHyperlinkSegment.java
deleted file mode 100644
index b4afb01..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/ImageHyperlinkSegment.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.Hashtable;
-
-import org.eclipse.swt.graphics.*;
-
-public class ImageHyperlinkSegment extends ImageSegment implements
-		IHyperlinkSegment {
-	private String href;
-	private String text;
-
-	private String tooltipText;
-
-	public ImageHyperlinkSegment() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.forms.widgets.IHyperlinkSegment#setHref(java.lang.String)
-	 */
-	public void setHref(String href) {
-		this.href = href;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.forms.widgets.IHyperlinkSegment#getHref()
-	 */
-	public String getHref() {
-		return href;
-	}
-
-	public void paintFocus(GC gc, Color bg, Color fg, boolean selected,
-			Rectangle repaintRegion) {
-		Rectangle bounds = getBounds();
-		if (bounds == null)
-			return;
-		if (selected) {
-			gc.setBackground(bg);
-			gc.setForeground(fg);
-			gc.drawFocus(bounds.x, bounds.y, bounds.width, bounds.height);
-		} else {
-			gc.setForeground(bg);
-			gc.drawRectangle(bounds.x, bounds.y, bounds.width - 1,
-					bounds.height - 1);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.forms.widgets.IHyperlinkSegment#isWordWrapAllowed()
-	 */
-	public boolean isWordWrapAllowed() {
-		return !isNowrap();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.forms.widgets.IHyperlinkSegment#setWordWrapAllowed(boolean)
-	 */
-	public void setWordWrapAllowed(boolean value) {
-		setNowrap(!value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.forms.widgets.IHyperlinkSegment#getText()
-	 */
-	public String getText() {
-		return text!=null?text:""; //$NON-NLS-1$
-	}
-	
-	public void setText(String text) {
-		this.text = text;
-	}
-
-	/**
-	 * @return Returns the tooltipText.
-	 */
-	public String getTooltipText() {
-		return tooltipText;
-	}
-
-	/**
-	 * @param tooltipText
-	 *            The tooltipText to set.
-	 */
-	public void setTooltipText(String tooltipText) {
-		this.tooltipText = tooltipText;
-	}
-	
-	public boolean isSelectable() {
-		return true;
-	}
-
-	public boolean isFocusSelectable(Hashtable resourceTable) {
-		return true;
-	}
-
-	public boolean setFocus(Hashtable resourceTable, boolean direction) {
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/ImageSegment.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/ImageSegment.java
deleted file mode 100644
index a8e8613..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/ImageSegment.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.Hashtable;
-
-import org.eclipse.swt.graphics.*;
-
-/**
- * @version 1.0
- * @author
- */
-public class ImageSegment extends ObjectSegment {
-	public static final String SEL_IMAGE_PREFIX = "isel."; //$NON-NLS-1$
-
-	public Image getImage(Hashtable objectTable) {
-		return getImage(getObjectId(), objectTable);
-	}
-
-	private Image getImage(String key, Hashtable objectTable) {
-		if (key == null)
-			return null;
-		Object obj = objectTable.get(key);
-		if (obj == null)
-			return null;
-		if (obj instanceof Image)
-			return (Image) obj;
-		return null;
-	}
-
-	private Image getSelectedImage(Hashtable objectTable, SelectionData selData) {
-		String key = SEL_IMAGE_PREFIX + getObjectId();
-		Image image = getImage(key, objectTable);
-		if (image==null) {
-			image = FormUtil.createAlphaMashImage(selData.display, getImage(objectTable));
-			if (image!=null)
-				objectTable.put(key, image);
-		}
-		return image;
-	}
-/*
-	private String getSelectedImageId() {
-		if (getObjectId() == null)
-			return null;
-		return SEL_IMAGE_PREFIX + getObjectId();
-	}
-*/
-	
-	public void paint(GC gc, boolean hover, Hashtable resourceTable, boolean selected, SelectionData selData, Rectangle repaintRegion) {
-		Image image = getImage(resourceTable);
-		int iwidth = 0;
-		int iheight = 0;
-		if (image != null) {
-			Rectangle rect = image.getBounds();
-			iwidth = rect.width + (isSelectable()?2:0);
-			iheight = rect.height + (isSelectable()?2:0);
-		} else
-			return;
-		Rectangle bounds = getBounds();
-		int ix = bounds.x+(isSelectable()?1:0);
-		int iy = bounds.y+(isSelectable()?1:0);
-
-		if (selData != null) {
-			int leftOffset = selData.getLeftOffset(bounds.height);
-			int rightOffset = selData.getRightOffset(bounds.height);
-			boolean firstRow = selData.isFirstSelectionRow(bounds.y,
-					bounds.height);
-			boolean lastRow = selData.isLastSelectionRow(bounds.y,
-					bounds.height);
-			boolean selectedRow = selData
-					.isSelectedRow(bounds.y, bounds.height);
-			if (selectedRow) {
-				if ((firstRow && leftOffset > ix) ||
-					(lastRow && rightOffset < ix + iwidth/2)) {
-					drawClipImage(gc, image, ix, iy, repaintRegion);
-				}
-				else {
-					Color savedBg = gc.getBackground();
-					gc.setBackground(selData.bg);
-					int sx = ix;
-					int sy = iy;
-					if (repaintRegion!=null) {
-						sx -= repaintRegion.x;
-						sy -= repaintRegion.y;
-					}
-					gc.fillRectangle(sx, sy, iwidth, iheight);
-					Image selImage = getSelectedImage(resourceTable, selData);
-					gc.drawImage(selImage, sx, sy);
-					gc.setBackground(savedBg);
-				}
-			}
-			else
-				drawClipImage(gc, image, ix, iy, repaintRegion);
-		} else
-			drawClipImage(gc, image, ix, iy, repaintRegion);
-		if (selected) {
-			int fx = bounds.x;
-			int fy = bounds.y;
-			if (repaintRegion!=null) {
-				fx -= repaintRegion.x;
-				fy -= repaintRegion.y;
-			}
-			Color fg = gc.getForeground();
-			gc.setForeground(gc.getBackground());
-			// Clean up to avoid canceling out XOR if it is already
-			// selected.
-			gc.drawRectangle(bounds.x, bounds.y, bounds.width - 1,
-					bounds.height - 1);
-			gc.setForeground(fg);
-			gc.drawFocus(fx, fy, bounds.width, bounds.height);
-		}
-	}
-	private void drawClipImage(GC gc, Image image, int ix, int iy, Rectangle repaintRegion) {
-		if (repaintRegion!=null) {
-			ix -= repaintRegion.x;
-			iy -= repaintRegion.y;
-		}
-		gc.drawImage(image, ix, iy);			
-	}
-
-	protected Point getObjectSize(Hashtable resourceTable, int wHint) {
-		Image image = getImage(resourceTable);
-		if (image==null)
-			return new Point(0, 0);
-		Rectangle ibounds = image.getBounds();
-		return new Point(ibounds.width, ibounds.height);
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/Locator.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/Locator.java
deleted file mode 100644
index fc098c6..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/Locator.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.ArrayList;
-
-public class Locator implements Cloneable { 
-	public int indent;
-	public int x, y;
-	public int width;
-	public int leading;
-	public int rowHeight;
-	public int marginWidth;
-	public int marginHeight;
-	public int rowCounter;
-	public ArrayList heights;
-	
-	public void newLine() {
-		resetCaret();
-		y += rowHeight;
-		rowHeight = 0;
-	}
-
-	public Locator create() {
-		try {
-			return (Locator)clone();
-		}
-		catch (CloneNotSupportedException e) {
-			return null;
-		}
-	}
-	public void collectHeights() {
-		heights.add(new int [] { rowHeight, leading} );
-		rowCounter++;
-	}
-	public int getBaseline(int segmentHeight) {
-		return getBaseline(segmentHeight, true);
-
-	}
-	public int getMiddle(int segmentHeight, boolean text) {
-		if (heights!=null && heights.size()>rowCounter) {
-			int [] rdata = (int[])heights.get(rowCounter);
-			int rheight = rdata[0];
-			int rleading = rdata[1];
-			if (text)
-				return y + rheight/2 - segmentHeight/2 - rleading;
-			return y + rheight/2 - segmentHeight/2;
-		}
-		return y;		
-	}
-	public int getBaseline(int segmentHeight, boolean text) {
-		if (heights!=null && heights.size()>rowCounter) {
-			int [] rdata = (int[])heights.get(rowCounter);
-			int rheight = rdata[0];
-			int rleading = rdata[1];
-			if (text)
-				return y + rheight - segmentHeight - rleading;
-			return y + rheight - segmentHeight;
-		}
-		return y;
-	}
-	
-	public void resetCaret() {
-		x = getStartX();
-	}
-	public int getStartX() {
-		return marginWidth + indent;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/ObjectSegment.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/ObjectSegment.java
deleted file mode 100644
index fac6680..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/ObjectSegment.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.Hashtable;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.*;
-
-
-public abstract class ObjectSegment extends ParagraphSegment {
-	public static final int TOP = 1;
-
-	public static final int MIDDLE = 2;
-
-	public static final int BOTTOM = 3;
-
-	private int alignment = BOTTOM;
-	private boolean nowrap=false;
-	private Rectangle bounds;
-	private String objectId;
-
-	public int getVerticalAlignment() {
-		return alignment;
-	}
-
-	void setVerticalAlignment(int alignment) {
-		this.alignment = alignment;
-	}
-
-	public String getObjectId() {
-		return objectId;
-	}
-
-	void setObjectId(String objectId) {
-		this.objectId = objectId;
-	}
-	
-	protected abstract Point getObjectSize(Hashtable resourceTable, int wHint);
-
-	public boolean advanceLocator(GC gc, int wHint, Locator loc,
-			Hashtable objectTable, boolean computeHeightOnly) {
-		Point objectSize = getObjectSize(objectTable, wHint);
-		int iwidth = 0;
-		int iheight = 0;
-		boolean newLine = false;
-
-		if (objectSize != null) {
-			iwidth = objectSize.x + (isSelectable()?2:0);
-			iheight = objectSize.y + (isSelectable()?2:0);
-		}
-		if (wHint != SWT.DEFAULT && !nowrap && loc.x + iwidth + loc.marginWidth > wHint) {
-			// new line
-			if (computeHeightOnly)
-				loc.collectHeights();
-			loc.resetCaret();
-			loc.x += iwidth;
-			loc.y += loc.rowHeight;
-			loc.width = loc.x;
-			loc.rowHeight = iheight;
-			loc.leading = 0;
-			newLine = true;
-		} else {
-			loc.x += iwidth;
-			loc.width += iwidth;
-			loc.rowHeight = Math.max(loc.rowHeight, iheight);
-		}
-		return newLine;
-	}
-
-	public boolean contains(int x, int y) {
-		if (bounds==null) 
-			return false;
-		return bounds.contains(x, y);
-	}
-	public boolean intersects(Rectangle rect) {
-		if (bounds==null)
-			return false;
-		return bounds.intersects(rect);
-	}
-
-	public Rectangle getBounds() {
-		return bounds;
-	}
-
-	public boolean isSelectable() {
-		return false;
-	}
-	/**
-	 * @return Returns the nowrap.
-	 */
-	public boolean isNowrap() {
-		return nowrap;
-	}
-	/**
-	 * @param nowrap The nowrap to set.
-	 */
-	public void setNowrap(boolean nowrap) {
-		this.nowrap = nowrap;
-	}
-	public void paint(GC gc, boolean hover, Hashtable resourceTable, boolean selected, SelectionData selData, Rectangle repaintRegion) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.forms.widgets.ParagraphSegment#layout(org.eclipse.swt.graphics.GC, int, org.eclipse.ui.internal.forms.widgets.Locator, java.util.Hashtable, boolean, org.eclipse.ui.internal.forms.widgets.SelectionData)
-	 */
-	public void layout(GC gc, int width, Locator loc, Hashtable resourceTable,
-			boolean selected) {
-		Point size = getObjectSize(resourceTable, width);
-
-		int objWidth = 0;
-		int objHeight = 0;
-		if (size != null) {
-			objWidth = size.x + (isSelectable()?2:0);
-			objHeight = size.y + (isSelectable()?2:0);
-		} else
-			return;
-		loc.width = objWidth;
-
-		if (!nowrap && loc.x + objWidth + loc.marginWidth > width) {
-			// new row
-			loc.newLine();
-			loc.rowCounter++;
-		}
-		int ix = loc.x;
-		int iy = loc.y;
-		
-		if (alignment==MIDDLE)
-			iy = loc.getMiddle(objHeight, false);
-		else if (alignment==BOTTOM)
-			iy = loc.getBaseline(objHeight, false);
-		loc.x += objWidth;
-		loc.rowHeight = Math.max(loc.rowHeight, objHeight);
-		bounds = new Rectangle(ix, iy, objWidth, objHeight);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.forms.widgets.ParagraphSegment#computeSelection(org.eclipse.swt.graphics.GC, java.util.Hashtable, boolean, org.eclipse.ui.internal.forms.widgets.SelectionData)
-	 */
-	public void computeSelection(GC gc, Hashtable resourceTable, SelectionData selData) {
-		// TODO we should add this to the selection 
-		// if we want to support rich text
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/Paragraph.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/Paragraph.java
deleted file mode 100644
index 213abf6..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/Paragraph.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.io.*;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Hashtable;
-import java.util.Vector;
-
-import org.eclipse.swt.graphics.*;
-import org.eclipse.ui.forms.HyperlinkSettings;
-
-/**
- * @version 1.0
- * @author
- */
-public class Paragraph {
-	public static final String[] PROTOCOLS = {"http://", "https://", "ftp://"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	private Vector segments;
-
-	private boolean addVerticalSpace = true;
-
-	public Paragraph(boolean addVerticalSpace) {
-		this.addVerticalSpace = addVerticalSpace;
-	}
-
-	public int getIndent() {
-		return 0;
-	}
-
-	public boolean getAddVerticalSpace() {
-		return addVerticalSpace;
-	}
-
-	/*
-	 * @see IParagraph#getSegments()
-	 */
-	public ParagraphSegment[] getSegments() {
-		if (segments == null)
-			return new ParagraphSegment[0];
-		return (ParagraphSegment[]) segments
-				.toArray(new ParagraphSegment[segments.size()]);
-	}
-
-	public void addSegment(ParagraphSegment segment) {
-		if (segments == null)
-			segments = new Vector();
-		segments.add(segment);
-	}
-
-	public void parseRegularText(String text, boolean expandURLs, boolean wrapAllowed,
-			HyperlinkSettings settings, String fontId) {
-		parseRegularText(text, expandURLs, wrapAllowed, settings, fontId, null);
-	}
-
-	public void parseRegularText(String text, boolean expandURLs, boolean wrapAllowed,
-			HyperlinkSettings settings, String fontId, String colorId) {
-		if (text.length() == 0)
-			return;
-		if (expandURLs) {
-			int loc = findUrl(text,0);
-
-			if (loc == -1)
-				addSegment(new TextSegment(text, fontId, colorId, wrapAllowed));
-			else {
-				int textLoc = 0;
-				while (loc != -1) {
-					addSegment(new TextSegment(text.substring(textLoc, loc),
-							fontId, colorId, wrapAllowed));
-					boolean added = false;
-					for (textLoc = loc; textLoc < text.length(); textLoc++) {
-						char c = text.charAt(textLoc);
-						if (Character.isSpaceChar(c)) {
-							addHyperlinkSegment(text.substring(loc, textLoc),
-									settings, fontId);
-							added = true;
-							break;
-						}
-					}
-					if (!added) {
-						// there was no space - just end of text
-						addHyperlinkSegment(text.substring(loc), settings,
-								fontId);
-						break;
-					}
-					loc = findUrl(text,textLoc);
-				}
-				if (textLoc < text.length()) {
-					addSegment(new TextSegment(text.substring(textLoc), fontId,
-							colorId, wrapAllowed));
-				}
-			}
-		} else {
-			addSegment(new TextSegment(text, fontId, colorId, wrapAllowed));
-		}
-	}
-	
-	private int findUrl(String text, int startIndex) {
-		int[] locs = new int[PROTOCOLS.length];
-		for (int i = 0; i < PROTOCOLS.length; i++)
-			locs[i] = text.indexOf(PROTOCOLS[i], startIndex);
-		Arrays.sort(locs);
-		for (int i = 0; i < PROTOCOLS.length; i++)
-			if (locs[i] != -1)
-				return locs[i];
-		return -1;
-	}
-
-	private void addHyperlinkSegment(String text, HyperlinkSettings settings,
-			String fontId) {
-		TextHyperlinkSegment hs = new TextHyperlinkSegment(text, settings,
-				fontId);
-		hs.setWordWrapAllowed(false);
-		hs.setHref(text);
-		addSegment(hs);
-	}
-
-	protected void computeRowHeights(GC gc, int width, Locator loc,
-			int lineHeight, Hashtable resourceTable) {
-		ParagraphSegment[] segments = getSegments();
-		// compute heights
-		Locator hloc = loc.create();
-		ArrayList heights = new ArrayList();
-		hloc.heights = heights;
-		hloc.rowCounter = 0;
-		for (int j = 0; j < segments.length; j++) {
-			ParagraphSegment segment = segments[j];
-			segment.advanceLocator(gc, width, hloc, resourceTable, true);
-		}
-		hloc.collectHeights();
-		loc.heights = heights;
-		loc.rowCounter = 0;
-	}
-
-	public void layout(GC gc, int width, Locator loc, int lineHeight,
-			Hashtable resourceTable, IHyperlinkSegment selectedLink) {
-		ParagraphSegment[] segments = getSegments();
-		//int height;
-		if (segments.length > 0) {
-			/*
-			if (segments[0] instanceof TextSegment
-					&& ((TextSegment) segments[0]).isSelectable())
-				loc.x += 1;
-			*/
-			// compute heights
-			if (loc.heights == null)
-				computeRowHeights(gc, width, loc, lineHeight, resourceTable);
-			for (int j = 0; j < segments.length; j++) {
-				ParagraphSegment segment = segments[j];
-				boolean doSelect = false;
-				if (selectedLink != null && segment.equals(selectedLink))
-					doSelect = true;
-				segment.layout(gc, width, loc, resourceTable, doSelect);
-			}
-			loc.heights = null;
-			loc.y += loc.rowHeight;
-		} else {
-			loc.y += lineHeight;
-		}
-	}
-
-	public void paint(GC gc, Rectangle repaintRegion,
-			Hashtable resourceTable, IHyperlinkSegment selectedLink,
-			SelectionData selData) {
-		ParagraphSegment[] segments = getSegments();
-
-		for (int i = 0; i < segments.length; i++) {
-			ParagraphSegment segment = segments[i];
-			if (!segment.intersects(repaintRegion))
-				continue;
-			boolean doSelect = false;
-			if (selectedLink != null && segment.equals(selectedLink))
-				doSelect = true;
-			segment.paint(gc, false, resourceTable, doSelect, selData, repaintRegion);
-		}
-	}
-	
-	public void computeSelection(GC gc,	Hashtable resourceTable, IHyperlinkSegment selectedLink,
-			SelectionData selData) {
-		ParagraphSegment[] segments = getSegments();
-
-		for (int i = 0; i < segments.length; i++) {
-			ParagraphSegment segment = segments[i];
-			//boolean doSelect = false;
-			//if (selectedLink != null && segment.equals(selectedLink))
-				//doSelect = true;
-			segment.computeSelection(gc, resourceTable, selData);
-		}
-	}
-
-	public String getAccessibleText() {
-		ParagraphSegment[] segments = getSegments();
-		StringWriter swriter = new StringWriter();
-		PrintWriter writer = new PrintWriter(swriter);
-		for (int i = 0; i < segments.length; i++) {
-			ParagraphSegment segment = segments[i];
-			if (segment instanceof TextSegment) {
-				String text = ((TextSegment) segment).getText();
-				writer.print(text);
-			}
-		}
-		writer.println();
-		swriter.flush();
-		return swriter.toString();
-	}
-
-	public ParagraphSegment findSegmentAt(int x, int y) {
-		if (segments != null) {
-			for (int i = 0; i < segments.size(); i++) {
-				ParagraphSegment segment = (ParagraphSegment) segments.get(i);
-				if (segment.contains(x, y))
-					return segment;
-			}
-		}
-		return null;
-	}
-	public void clearCache(String fontId) {
-		if (segments != null) {
-			for (int i = 0; i < segments.size(); i++) {
-				ParagraphSegment segment = (ParagraphSegment) segments.get(i);
-				segment.clearCache(fontId);
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/ParagraphSegment.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/ParagraphSegment.java
deleted file mode 100644
index 150f15e..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/ParagraphSegment.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.Hashtable;
-
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.graphics.GC;
-
-/**
- * @version 	1.0
- * @author
- */
-public abstract class ParagraphSegment {
-	/**
-	 * Moves the locator according to the content of this segment.
-	 * @param gc
-	 * @param wHint
-	 * @param loc
-	 * @param objectTable
-	 * @param computeHeightOnly
-	 * @return <code>true</code> if text wrapped to the new line, <code>false</code> otherwise.
-	 */
-	public abstract boolean advanceLocator(GC gc, int wHint, Locator loc, Hashtable objectTable, boolean computeHeightOnly);
-	/**
-	 * Computes bounding rectangles and row heights of this segments.
-	 * @param gc
-	 * @param width
-	 * @param loc
-	 * @param resourceTable
-	 * @param selected
-	 */
-	public abstract void layout(GC gc, int width, Locator loc, Hashtable resourceTable, boolean selected);
-	/**
-	 * Paints this segment.
-	 * @param gc
-	 * @param hover
-	 * @param resourceTable
-	 * @param selected
-	 * @param selData
-	 * @param region
-	 */
-	public abstract void paint(GC gc, boolean hover, Hashtable resourceTable, boolean selected, SelectionData selData, Rectangle region);
-	/**
-	 * Paints this segment.
-	 * @param gc
-	 * @param resourceTable
-	 * @param selData
-	 */
-	public abstract void computeSelection(GC gc, Hashtable resourceTable, SelectionData selData);	
-	/**
-	 * Tests if the coordinates are contained in one of the
-	 * bounding rectangles of this segment.
-	 * @param x
-	 * @param y
-	 * @return true if inside the bounding rectangle, false otherwise.
-	 */
-	public abstract boolean contains(int x, int y);
-	/**
-	 * Tests if the source rectangle intersects with
-	 * one of the bounding rectangles of this segment.
-	 * @param rect
-	 * @return true if the two rectangles intersect, false otherwise.
-	 */
-	public abstract boolean intersects(Rectangle rect);
-	/**
-	 * Returns the tool tip of this segment or <code>null</code>
-	 * if not defined.
-	 * @return tooltip or <code>null</code>.
-	 */
-	public String getTooltipText() {
-		return null;
-	}
-	/**
-	 * Clears the text metrics cache for the provided font id.
-	 * @param fontId the id of the font that the cache is kept for.
-	 * 
-	 */
-	public void clearCache(String fontId) {
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/SWTUtil.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/SWTUtil.java
deleted file mode 100644
index 8351965..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/SWTUtil.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-import org.eclipse.swt.dnd.DragSource;
-import org.eclipse.swt.dnd.DropTarget;
-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;
-
-/**
- * Utility class to simplify access to some SWT resources. 
- */
-public class 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;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/SelectionData.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/SelectionData.java
deleted file mode 100644
index c73a6bf..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/SelectionData.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.ArrayList;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.Display;
-
-public class SelectionData {
-	public Display display;
-	public Color bg;
-	public Color fg;
-	private Point start;
-	private Point stop;
-	private ArrayList segments;
-	private boolean newLineNeeded;
-	
-	public SelectionData(MouseEvent e) {
-		display = e.display;
-		segments = new ArrayList();
-		start = new Point(e.x, e.y);
-		stop = new Point(e.x, e.y);
-		bg = e.display.getSystemColor(SWT.COLOR_LIST_SELECTION);
-		fg = e.display.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT);
-	}
-	
-	public void markNewLine() {
-		newLineNeeded=true;
-	}
-	public void addSegment(String text) {
-		if (newLineNeeded) {
-			segments.add(System.getProperty("line.separator")); //$NON-NLS-1$
-			newLineNeeded=false;
-		}
-		segments.add(text);
-	}
-
-	public void update(MouseEvent e) {
-		//Control c = (Control)e.widget;
-		stop.x = e.x;
-		stop.y = e.y;
-	}
-	public void reset() {
-		segments.clear();
-	}
-	public String getSelectionText() {
-		StringBuffer buf = new StringBuffer();
-		for (int i=0; i<segments.size(); i++) {
-			buf.append((String)segments.get(i));
-		}
-		return buf.toString();
-	}
-	public boolean canCopy() {
-		return segments.size()>0;
-	}
-	
-	private int getTopOffset() {
-		return start.y<stop.y?start.y:stop.y;
-	}
-	private int getBottomOffset() {
-		return start.y>stop.y?start.y:stop.y;
-	}
-	public int getLeftOffset(Locator locator) {
-		return isInverted(locator)? stop.x:start.x;
-	}
-	public int getLeftOffset(int rowHeight) {
-		return isInverted(rowHeight) ? stop.x:start.x;
-	}
-	public int getRightOffset(Locator locator) {
-		return isInverted(locator)? start.x: stop.x;
-	}
-	public int getRightOffset(int rowHeight) {
-		return isInverted(rowHeight) ? start.x:stop.x;
-	}
-	private boolean isInverted(Locator locator) {
-		int rowHeight = ((int [])locator.heights.get(locator.rowCounter))[0];
-		return isInverted(rowHeight);
-	}
-	private boolean isInverted(int rowHeight) {
-		int deltaY = start.y - stop.y;
-		if (Math.abs(deltaY) > rowHeight) {
-			// inter-row selection
-			return deltaY>0;
-		}
-		// intra-row selection
-		return start.x > stop.x; 
-	}
-	public boolean isEnclosed() {
-		return !start.equals(stop);
-	}
-
-	public boolean isSelectedRow(Locator locator) {
-		if (!isEnclosed())
-			return false;
-		int rowHeight = ((int [])locator.heights.get(locator.rowCounter))[0];
-		return isSelectedRow(locator.y, rowHeight);
-	}
-	public boolean isSelectedRow(int y, int rowHeight) {
-		if (!isEnclosed())
-			return false;
-		return (y + rowHeight >= getTopOffset() &&
-				y <= getBottomOffset());
-	}
-	public boolean isFirstSelectionRow(Locator locator) {
-		if (!isEnclosed())
-			return false;
-		int rowHeight = ((int [])locator.heights.get(locator.rowCounter))[0];
-		return (locator.y + rowHeight >= getTopOffset() &&
-				locator.y <= getTopOffset());
-	}
-	public boolean isFirstSelectionRow(int y, int rowHeight) {
-		if (!isEnclosed())
-			return false;
-		return (y + rowHeight >= getTopOffset() &&
-				y <= getTopOffset());
-	}
-	public boolean isLastSelectionRow(Locator locator) {
-		if (!isEnclosed())
-			return false;
-		int rowHeight = ((int [])locator.heights.get(locator.rowCounter))[0];
-		return (locator.y + rowHeight >=getBottomOffset() && 
-				locator.y <= getBottomOffset());
-	}
-	public boolean isLastSelectionRow(int y, int rowHeight) {
-		if (!isEnclosed())
-			return false;
-		return (y + rowHeight >=getBottomOffset() && 
-				y <= getBottomOffset());
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/TextHyperlinkSegment.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/TextHyperlinkSegment.java
deleted file mode 100644
index c363299..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/TextHyperlinkSegment.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.Hashtable;
-
-import org.eclipse.swt.graphics.*;
-import org.eclipse.ui.forms.HyperlinkSettings;
-
-/**
- * @version 1.0
- * @author
- */
-public class TextHyperlinkSegment extends TextSegment implements
-		IHyperlinkSegment {
-	private String href;
-
-	private String tooltipText;
-
-	//private static final String LINK_FG = "c.___link_fg";
-
-	private HyperlinkSettings settings;
-
-	public TextHyperlinkSegment(String text, HyperlinkSettings settings,
-			String fontId) {
-		super(text, fontId);
-		this.settings = settings;
-	}
-
-	/*
-	 * @see IObjectReference#getObjectId()
-	 */
-	public String getHref() {
-		return href;
-	}
-
-	public void setHref(String href) {
-		this.href = href;
-	}
-
-	/*
-	 * public void paint(GC gc, int width, Locator locator, Hashtable
-	 * resourceTable, boolean selected, SelectionData selData) {
-	 * resourceTable.put(LINK_FG, settings.getForeground());
-	 * setColorId(LINK_FG); super.paint(gc, width, locator, resourceTable,
-	 * selected, selData); }
-	 */
-
-	public void paint(GC gc, boolean hover, Hashtable resourceTable,
-			boolean selected, SelectionData selData, Rectangle repaintRegion) {
-		boolean rolloverMode = settings.getHyperlinkUnderlineMode() == HyperlinkSettings.UNDERLINE_HOVER;
-		underline = settings.getHyperlinkUnderlineMode() == HyperlinkSettings.UNDERLINE_ALWAYS;
-		Color savedFg = gc.getForeground();
-		Color newFg = hover ? settings.getActiveForeground() : settings.getForeground();
-		if (newFg!=null)
-			gc.setForeground(newFg); 
-		super.paint(gc, hover, resourceTable, selected, rolloverMode, selData, repaintRegion);
-		gc.setForeground(savedFg);
-	}
-	
-	protected void drawString(GC gc, String s, int clipX, int clipY) {
-		gc.drawString(s, clipX, clipY, false);
-	}
-
-	public String getTooltipText() {
-		return tooltipText;
-	}
-
-	public void setTooltipText(String tooltip) {
-		this.tooltipText = tooltip;
-	}
-	
-	public boolean isSelectable() {
-		return true;
-	}
-
-	public boolean isFocusSelectable(Hashtable resourceTable) {
-		return true;
-	}
-
-	public boolean setFocus(Hashtable resourceTable, boolean direction) {
-		return true;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/TextSegment.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/TextSegment.java
deleted file mode 100644
index 0a904ed..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/TextSegment.java
+++ /dev/null
@@ -1,730 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Vector;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-
-import com.ibm.icu.text.BreakIterator;
-
-/**
- * @version 1.0
- * @author
- */
-public class TextSegment extends ParagraphSegment {
-	private String colorId;
-
-	private String fontId;
-
-	private String text;
-
-	protected boolean underline;
-
-	private boolean wrapAllowed = true;
-
-	protected Vector areaRectangles = new Vector();
-
-	private TextFragment[] textFragments;
-
-	class AreaRectangle {
-		Rectangle rect;
-
-		int from, to;
-
-		public AreaRectangle(Rectangle rect, int from, int to) {
-			this.rect = rect;
-			this.from = from;
-			this.to = to;
-		}
-
-		public boolean contains(int x, int y) {
-			return rect.contains(x, y);
-		}
-
-		public boolean intersects(Rectangle region) {
-			return rect.intersects(region);
-		}
-
-		public String getText() {
-			if (from == 0 && to == -1)
-				return TextSegment.this.getText();
-			if (from > 0 && to == -1)
-				return TextSegment.this.getText().substring(from);
-			return TextSegment.this.getText().substring(from, to);
-		}
-	}
-
-	static class SelectionRange {
-		public int start;
-
-		public int stop;
-
-		public SelectionRange() {
-			reset();
-		}
-
-		public void reset() {
-			start = -1;
-			stop = -1;
-		}
-	}
-
-	static class TextFragment {
-		short index;
-
-		short length;
-
-		public TextFragment(short index, short length) {
-			this.index = index;
-			this.length = length;
-		}
-	}
-
-	public TextSegment(String text, String fontId) {
-		this(text, fontId, null, true);
-	}
-
-	public TextSegment(String text, String fontId, String colorId) {
-		this(text, fontId, colorId, true);
-	}
-	
-	public TextSegment(String text, String fontId, String colorId, boolean wrapAllowed) {
-		this.text = cleanup(text);
-		this.fontId = fontId;
-		this.colorId = colorId;
-		this.wrapAllowed = wrapAllowed;
-	}	
-
-	private String cleanup(String text) {
-		StringBuffer buf = new StringBuffer();
-		for (int i = 0; i < text.length(); i++) {
-			char c = text.charAt(i);
-			if (c == '\n' || c == '\r' || c == '\f') {
-				if (i > 0)
-					buf.append(' ');
-			} else
-				buf.append(c);
-		}
-		return buf.toString();
-	}
-
-	public void setWordWrapAllowed(boolean value) {
-		wrapAllowed = value;
-	}
-
-	public boolean isWordWrapAllowed() {
-		return wrapAllowed;
-	}
-
-	public boolean isSelectable() {
-		return false;
-	}
-
-	public String getColorId() {
-		return colorId;
-	}
-
-	public String getText() {
-		return text;
-	}
-
-	void setText(String text) {
-		this.text = cleanup(text);
-		textFragments = null;
-	}
-
-	void setColorId(String colorId) {
-		this.colorId = colorId;
-	}
-
-	void setFontId(String fontId) {
-		this.fontId = fontId;
-		textFragments = null;
-	}
-
-	public boolean contains(int x, int y) {
-		for (int i = 0; i < areaRectangles.size(); i++) {
-			AreaRectangle ar = (AreaRectangle) areaRectangles.get(i);
-			if (ar.contains(x, y))
-				return true;
-			if (i<areaRectangles.size()-1) {
-				// test the gap
-				Rectangle top = ar.rect;
-				Rectangle bot = ((AreaRectangle)areaRectangles.get(i+1)).rect;
-				if (y >= top.y+top.height && y < bot.y) {
-					// in the gap
-					int left = Math.max(top.x, bot.x);
-					int right = Math.min(top.x+top.width, bot.x+bot.width);
-					if (x>=left && x<=right) {
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	public boolean intersects(Rectangle rect) {
-		for (int i = 0; i < areaRectangles.size(); i++) {
-			AreaRectangle ar = (AreaRectangle) areaRectangles.get(i);
-			if (ar.intersects(rect))
-				return true;
-			if (i<areaRectangles.size()-1) {
-				// test the gap
-				Rectangle top = ar.rect;
-				Rectangle bot = ((AreaRectangle)areaRectangles.get(i+1)).rect;
-				if (top.y+top.height < bot.y) {
-					int y = top.y+top.height;
-					int height = bot.y-y;
-					int left = Math.max(top.x, bot.x);
-					int right = Math.min(top.x+top.width, bot.x+bot.width);
-					Rectangle gap = new Rectangle(left, y, right-left, height);
-					if (gap.intersects(rect))
-						return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	public Rectangle getBounds() {
-		int x = 0, y = 0;
-		int width = 0, height = 0;
-
-		for (int i = 0; i < areaRectangles.size(); i++) {
-			AreaRectangle ar = (AreaRectangle) areaRectangles.get(i);
-			if (i == 0) {
-				x = ar.rect.x;
-				y = ar.rect.y;
-			} else
-				x = Math.min(ar.rect.x, x);
-			width = Math.max(ar.rect.width, width);
-			height += ar.rect.height;
-		}
-		return new Rectangle(x, y, width, height);
-	}
-
-	public boolean advanceLocator(GC gc, int wHint, Locator locator,
-			Hashtable objectTable, boolean computeHeightOnly) {
-		Font oldFont = null;
-		if (fontId != null) {
-			oldFont = gc.getFont();
-			Font newFont = (Font) objectTable.get(fontId);
-			if (newFont != null)
-				gc.setFont(newFont);
-		}
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-		boolean newLine = false;
-
-		if (wHint == SWT.DEFAULT || !wrapAllowed) {
-			Point extent = gc.textExtent(text);
-			int totalExtent = locator.x+extent.x;
-			if (isSelectable())
-				totalExtent+=1;
-
-			if (wHint != SWT.DEFAULT && totalExtent + locator.marginWidth > wHint) {
-				// new line
-				locator.resetCaret();
-				locator.y += locator.rowHeight;
-				if (computeHeightOnly)
-					locator.collectHeights();
-				locator.rowHeight = 0;
-				locator.leading = 0;
-				newLine = true;
-			}
-			int width = extent.x;
-			if (isSelectable())
-				width += 1;
-			locator.x += width;
-			locator.width = locator.x;
-			locator.rowHeight = Math.max(locator.rowHeight, extent.y);
-			locator.leading = Math.max(locator.leading, fm.getLeading());
-			return newLine;
-		}
-
-		computeTextFragments(gc);
-
-		int width = 0;
-		Point lineExtent = new Point(0, 0);
-
-		for (int i = 0; i < textFragments.length; i++) {
-			TextFragment textFragment = textFragments[i];
-			int currentExtent = locator.x + lineExtent.x;
-			
-			if (isSelectable())
-				currentExtent += 1;
-
-			// i != 0 || locator.x > locator.getStartX() + (isSelectable() ? 1 : 0) means:
-			// only wrap on the first fragment if we are not at the start of a line
-			if ((i != 0 || locator.x > locator.getStartX() + (isSelectable() ? 1 : 0)) && currentExtent + textFragment.length > wHint) {
-				// overflow
-				int lineWidth = currentExtent;
-				locator.rowHeight = Math.max(locator.rowHeight, lineExtent.y);
-				locator.leading = Math.max(locator.leading, fm.getLeading());
-				if (computeHeightOnly)
-					locator.collectHeights();
-				locator.x = locator.indent;
-				locator.y += locator.rowHeight;
-				locator.rowHeight = 0;
-				locator.leading = 0;
-				lineExtent.x = 0;
-				lineExtent.y = 0;
-				width = Math.max(width, lineWidth);
-				newLine = true;
-			}
-			lineExtent.x += textFragment.length;
-			lineExtent.y = Math.max(lineHeight, lineExtent.y);
-		}
-		int lineWidth = lineExtent.x;
-		if (isSelectable())
-			lineWidth += 1;
-		locator.x += lineWidth;
-		locator.width = width;
-		locator.rowHeight = Math.max(locator.rowHeight, lineExtent.y);
-		locator.leading = Math.max(locator.leading, fm.getLeading());
-		if (oldFont != null) {
-			gc.setFont(oldFont);
-		}
-		return newLine;
-	}
-
-	/**
-	 * @param gc
-	 * @param width
-	 * @param locator
-	 * @param selected
-	 * @param selData
-	 * @param color
-	 * @param fm
-	 * @param lineHeight
-	 * @param descent
-	 */
-	private void layoutWithoutWrapping(GC gc, int width, Locator locator,
-			boolean selected, FontMetrics fm, int lineHeight, int descent) {
-		Point extent = gc.textExtent(text);
-		int ewidth = extent.x;
-		if (isSelectable())
-			ewidth += 1;
-		if (locator.x + ewidth > width-locator.marginWidth) {
-			// new line
-			locator.resetCaret();
-			locator.y += locator.rowHeight;
-			locator.rowHeight = 0;
-			locator.rowCounter++;
-		}
-		int ly = locator.getBaseline(fm.getHeight() - fm.getLeading());
-		//int lineY = ly + lineHeight - descent + 1;
-		Rectangle br = new Rectangle(locator.x, ly, ewidth,
-				lineHeight - descent + 3);
-		areaRectangles.add(new AreaRectangle(br, 0, -1));
-		locator.x += ewidth;
-		locator.width = ewidth;
-		locator.rowHeight = Math.max(locator.rowHeight, extent.y);
-	}
-
-	protected int convertOffsetToStringIndex(GC gc, String s, int x,
-			int swidth, int selOffset) {
-		int index = s.length();
-		while (index > 0 && x + swidth > selOffset) {
-			index--;
-			String ss = s.substring(0, index);
-			swidth = gc.textExtent(ss).x;
-		}
-		return index;
-	}
-
-	public void paintFocus(GC gc, Color bg, Color fg, boolean selected,
-			Rectangle repaintRegion) {
-		if (areaRectangles == null)
-			return;
-		for (int i = 0; i < areaRectangles.size(); i++) {
-			AreaRectangle areaRectangle = (AreaRectangle) areaRectangles.get(i);
-			Rectangle br = areaRectangle.rect;
-			int bx = br.x;
-			int by = br.y;
-			if (repaintRegion != null) {
-				bx -= repaintRegion.x;
-				by -= repaintRegion.y;
-			}
-			if (selected) {
-				gc.setBackground(bg);
-				gc.setForeground(fg);
-				gc.drawFocus(bx, by, br.width, br.height);
-			} else {
-				gc.setForeground(bg);
-				gc.drawRectangle(bx, by, br.width - 1, br.height - 1);
-			}
-		}
-	}
-
-	public void paint(GC gc, boolean hover, Hashtable resourceTable,
-			boolean selected, SelectionData selData, Rectangle repaintRegion) {
-		this.paint(gc, hover, resourceTable, selected, false, selData,
-				repaintRegion);
-	}
-
-	protected void paint(GC gc, boolean hover, Hashtable resourceTable,
-			boolean selected, boolean rollover, SelectionData selData,
-			Rectangle repaintRegion) {
-		Font oldFont = null;
-		Color oldColor = null;
-		Color oldBg = null;
-
-		// apply segment-specific font, color and background
-		if (fontId != null) {
-			oldFont = gc.getFont();
-			Font newFont = (Font) resourceTable.get(fontId);
-			if (newFont != null)
-				gc.setFont(newFont);
-		}
-		if (!hover && colorId != null) {
-			oldColor = gc.getForeground();
-			Color newColor = (Color) resourceTable.get(colorId);
-			if (newColor != null)
-				gc.setForeground(newColor);
-		}
-		oldBg = gc.getBackground();
-
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-		int descent = fm.getDescent();
-
-		// paint area rectangles of the segment
-		for (int i = 0; i < areaRectangles.size(); i++) {
-			AreaRectangle areaRectangle = (AreaRectangle) areaRectangles.get(i);
-			Rectangle rect = areaRectangle.rect;
-			String text = areaRectangle.getText();
-			Point extent = gc.textExtent(text);
-			int textX = rect.x + (isSelectable()?1:0);
-			int lineY = rect.y + lineHeight - descent + 1;
-			paintString(gc, text, extent.x, textX, rect.y, lineY, selData,
-					rect, hover, rollover, repaintRegion);
-			if (selected) {
-				int fx = rect.x;
-				int fy = rect.y;
-				if (repaintRegion != null) {
-					fx -= repaintRegion.x;
-					fy -= repaintRegion.y;
-				}
-				//To avoid partially cancelling the focus by painting over
-				//X-ORed pixels, first cancel it yourself
-				Color fg = gc.getForeground();
-				gc.setForeground(oldBg);
-				gc.drawRectangle(fx, fy, rect.width - 1, rect.height - 1);
-				gc.setForeground(fg);
-				gc.drawFocus(fx, fy, rect.width, rect.height);
-			}
-		}
-		// restore GC resources
-		if (oldFont != null) {
-			gc.setFont(oldFont);
-		}
-		if (oldColor != null) {
-			gc.setForeground(oldColor);
-		}
-		if (oldBg != null) {
-			gc.setBackground(oldBg);
-		}
-	}
-
-	public void computeSelection(GC gc, Hashtable resourceTable, SelectionData selData) {
-		Font oldFont = null;
-
-		if (fontId != null) {
-			oldFont = gc.getFont();
-			Font newFont = (Font) resourceTable.get(fontId);
-			if (newFont != null)
-				gc.setFont(newFont);
-		}
-
-		for (int i = 0; i < areaRectangles.size(); i++) {
-			AreaRectangle areaRectangle = (AreaRectangle) areaRectangles.get(i);
-			Rectangle rect = areaRectangle.rect;
-			String text = areaRectangle.getText();
-			Point extent = gc.textExtent(text);
-			computeSelection(gc, text, extent.x, selData,
-					rect);
-		}
-		// restore GC resources
-		if (oldFont != null) {
-			gc.setFont(oldFont);
-		}
-	}
-
-	private void paintString(GC gc, String s, int swidth, int x, int y,
-			int lineY, SelectionData selData, Rectangle bounds, boolean hover,
-			boolean rolloverMode, Rectangle repaintRegion) {
-		// repaints one area rectangle
-		if (selData != null && selData.isEnclosed()) {
-			Color savedBg = gc.getBackground();
-			Color savedFg = gc.getForeground();
-			int leftOffset = selData.getLeftOffset(bounds.height);
-			int rightOffset = selData.getRightOffset(bounds.height);
-			boolean firstRow = selData.isFirstSelectionRow(bounds.y,
-					bounds.height);
-			boolean lastRow = selData.isLastSelectionRow(bounds.y,
-					bounds.height);
-			boolean selectedRow = selData
-					.isSelectedRow(bounds.y, bounds.height);
-
-			int sstart = -1;
-			int sstop = -1;
-
-			if ((firstRow && x + swidth < leftOffset)
-					|| (lastRow && x > rightOffset)) {
-				paintStringSegment(gc, s, gc.textExtent(s).x, x, y, lineY,
-						hover, rolloverMode, repaintRegion);
-				return;
-			}
-
-			if (firstRow && bounds.x + swidth > leftOffset) {
-				sstart = convertOffsetToStringIndex(gc, s, bounds.x, swidth,
-						leftOffset);
-			}
-			if (lastRow && bounds.x + swidth > rightOffset) {
-				sstop = convertOffsetToStringIndex(gc, s, bounds.x, swidth,
-						rightOffset);
-			}
-
-			if (firstRow && sstart != -1) {
-				String left = s.substring(0, sstart);
-				int width = gc.textExtent(left).x;
-				paintStringSegment(gc, left, width, x, y, lineY, hover,
-						rolloverMode, repaintRegion);
-				x += width;
-			}
-			if (selectedRow) {
-				int lindex = sstart != -1 ? sstart : 0;
-				int rindex = sstop != -1 ? sstop : s.length();
-				String mid = s.substring(lindex, rindex);
-				Point extent = gc.textExtent(mid);
-				gc.setForeground(selData.fg);
-				gc.setBackground(selData.bg);
-				gc.fillRectangle(x, y, extent.x, extent.y);
-				paintStringSegment(gc, mid, extent.x, x, y, lineY, hover,
-						rolloverMode, repaintRegion);
-				x += extent.x;
-				gc.setForeground(savedFg);
-				gc.setBackground(savedBg);
-			} else {
-				paintStringSegment(gc, s, gc.textExtent(s).x, x, y, lineY,
-						hover, rolloverMode, repaintRegion);
-			}
-			if (lastRow && sstop != -1) {
-				String right = s.substring(sstop);
-				paintStringSegment(gc, right, gc.textExtent(right).x, x, y,
-						lineY, hover, rolloverMode, repaintRegion);
-			}
-		} else {
-			paintStringSegment(gc, s, gc.textExtent(s).x, x, y, lineY, hover,
-					rolloverMode, repaintRegion);
-		}
-	}
-
-	private void computeSelection(GC gc, String s, int swidth, SelectionData selData, Rectangle bounds) {
-		int leftOffset = selData.getLeftOffset(bounds.height);
-		int rightOffset = selData.getRightOffset(bounds.height);
-		boolean firstRow = selData.isFirstSelectionRow(bounds.y, bounds.height);
-		boolean lastRow = selData.isLastSelectionRow(bounds.y, bounds.height);
-		boolean selectedRow = selData.isSelectedRow(bounds.y, bounds.height);
-
-		int sstart = -1;
-		int sstop = -1;
-
-		if (firstRow && bounds.x + swidth > leftOffset) {
-			sstart = convertOffsetToStringIndex(gc, s, bounds.x, swidth,
-					leftOffset);
-		}
-		if (lastRow && bounds.x + swidth > rightOffset) {
-			sstop = convertOffsetToStringIndex(gc, s, bounds.x, swidth,
-					rightOffset);
-		}
-
-		if (selectedRow) {
-			int lindex = sstart != -1 ? sstart : 0;
-			int rindex = sstop != -1 ? sstop : s.length();
-			String mid = s.substring(lindex, rindex);
-			selData.addSegment(mid);
-		}
-	}
-
-	/**
-	 * @param gc
-	 * @param s
-	 * @param x
-	 * @param y
-	 * @param lineY
-	 * @param hover
-	 * @param rolloverMode
-	 */
-	private void paintStringSegment(GC gc, String s, int swidth, int x, int y,
-			int lineY, boolean hover, boolean rolloverMode,
-			Rectangle repaintRegion) {
-		boolean reverse = false;
-		int clipX = x;
-		int clipY = y;
-		int clipLineY = lineY;
-		if (repaintRegion != null) {
-			clipX -= repaintRegion.x;
-			clipY -= repaintRegion.y;
-			clipLineY -= repaintRegion.y;
-		}
-		if (rolloverMode && !hover)
-			reverse = true;
-		if (reverse) {
-			drawUnderline(gc, swidth, clipX, clipLineY, hover, rolloverMode);
-			drawString(gc, s, clipX, clipY);
-		} else {
-			drawString(gc, s, clipX, clipY);
-			drawUnderline(gc, swidth, clipX, clipLineY, hover, rolloverMode);
-		}
-	}
-	
-	protected void drawString(GC gc, String s, int clipX, int clipY) {
-		gc.drawString(s, clipX, clipY, true);
-	}
-
-	private void drawUnderline(GC gc, int swidth, int x, int y, boolean hover,
-			boolean rolloverMode) {
-		if (underline || rolloverMode) {
-			Color saved = null;
-			if (rolloverMode && !hover) {
-				saved = gc.getForeground();
-				gc.setForeground(gc.getBackground());
-			}
-			gc.drawLine(x, y, x + swidth-1, y);
-			if (saved != null)
-				gc.setForeground(saved);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.forms.widgets.ParagraphSegment#layout(org.eclipse.swt.graphics.GC,
-	 *      int, org.eclipse.ui.internal.forms.widgets.Locator,
-	 *      java.util.Hashtable, boolean,
-	 *      org.eclipse.ui.internal.forms.widgets.SelectionData)
-	 */
-	public void layout(GC gc, int width, Locator locator,
-			Hashtable resourceTable, boolean selected) {
-		Font oldFont = null;
-
-		areaRectangles.clear();
-
-		if (fontId != null) {
-			oldFont = gc.getFont();
-			Font newFont = (Font) resourceTable.get(fontId);
-			if (newFont != null)
-				gc.setFont(newFont);
-		}
-		FontMetrics fm = gc.getFontMetrics();
-		int lineHeight = fm.getHeight();
-		int descent = fm.getDescent();
-
-		if (!wrapAllowed) {
-			layoutWithoutWrapping(gc, width, locator, selected, fm, lineHeight,
-					descent);
-		} else {
-			int lineStart = 0;
-			int lastLoc = 0;
-			Point lineExtent = new Point(0, 0);
-			computeTextFragments(gc);
-			int rightEdge = width-locator.marginWidth;
-			for (int i = 0; i < textFragments.length; i++) {
-				TextFragment fragment = textFragments[i];
-				int breakLoc = fragment.index;
-				if (breakLoc == 0)
-					continue;
-				// (i != 0 || locator.x > locator.getStartX() + (isSelectable() ? 1 : 0)) means:
-				// only wrap on the first fragment if we are not at the start of a line
-				if ((i != 0 || locator.x > locator.getStartX() + (isSelectable() ? 1 : 0)) && locator.x + lineExtent.x + fragment.length > rightEdge) {
-					// overflow
-					int lineWidth = locator.x + lineExtent.x;
-					if (isSelectable())
-						lineWidth += 1;
-					int ly = locator.getBaseline(lineHeight - fm.getLeading());
-					Rectangle br = new Rectangle(isSelectable()?
-							locator.x - 1:locator.x, ly,
-							isSelectable()?lineExtent.x + 1:lineExtent.x, lineHeight - descent + 3);
-					areaRectangles
-							.add(new AreaRectangle(br, lineStart, lastLoc));
-
-					locator.rowHeight = Math.max(locator.rowHeight,
-							lineExtent.y);
-					locator.resetCaret();
-					if (isSelectable())
-						locator.x += 1;					
-					locator.y += locator.rowHeight;
-					locator.rowCounter++;
-					locator.rowHeight = 0;
-					lineStart = lastLoc;
-					lineExtent.x = 0;
-					lineExtent.y = 0;
-				}
-				lastLoc = breakLoc;
-				lineExtent.x += fragment.length;
-				lineExtent.y = Math.max(lineHeight, lineExtent.y);
-			}
-			//String lastLine = text.substring(lineStart, lastLoc);
-			int ly = locator.getBaseline(lineHeight - fm.getLeading());
-			int lastWidth = lineExtent.x;
-			if (isSelectable())
-				lastWidth += 1;
-			Rectangle br = new Rectangle(isSelectable()?locator.x - 1:locator.x, ly, 
-					isSelectable()?lineExtent.x + 1:lineExtent.x,
-					lineHeight - descent + 3);
-			//int lineY = ly + lineHeight - descent + 1;
-			areaRectangles.add(new AreaRectangle(br, lineStart, lastLoc));
-			locator.x += lastWidth;
-			locator.rowHeight = Math.max(locator.rowHeight, lineExtent.y);
-		}
-		if (oldFont != null) {
-			gc.setFont(oldFont);
-		}
-	}
-
-	private void computeTextFragments(GC gc) {
-		if (textFragments != null)
-			return;
-		ArrayList list = new ArrayList();
-		BreakIterator wb = BreakIterator.getLineInstance();
-		wb.setText(getText());
-		int cursor = 0;
-		for (int loc = wb.first(); loc != BreakIterator.DONE; loc = wb.next()) {
-			if (loc == 0)
-				continue;
-			String word = text.substring(cursor, loc);
-			Point extent = gc.textExtent(word);
-			list.add(new TextFragment((short) loc, (short) extent.x));
-			cursor = loc;
-		}
-		textFragments = (TextFragment[]) list.toArray(new TextFragment[list
-				.size()]);
-	}
-	
-	public void clearCache(String fontId) {
-		if (fontId==null && (this.fontId==null||this.fontId.equals(FormTextModel.BOLD_FONT_ID)))
-			textFragments = null;
-		else if (fontId!=null && this.fontId!=null && fontId.equals(this.fontId))
-			textFragments = null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/TitleRegion.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/TitleRegion.java
deleted file mode 100644
index a910810..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/TitleRegion.java
+++ /dev/null
@@ -1,535 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.DragSource;
-import org.eclipse.swt.dnd.DragSourceEffect;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.DropTarget;
-import org.eclipse.swt.dnd.DropTargetListener;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-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.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.forms.IFormColors;
-import org.eclipse.ui.forms.widgets.ILayoutExtension;
-import org.eclipse.ui.forms.widgets.SizeCache;
-import org.eclipse.ui.forms.widgets.Twistie;
-import org.eclipse.ui.internal.forms.IMessageToolTipManager;
-
-/**
- * Form heading title.
- */
-public class TitleRegion extends Canvas {
-	public static final int STATE_NORMAL = 0;
-	public static final int STATE_HOVER_LIGHT = 1;
-	public static final int STATE_HOVER_FULL = 2;
-	private int hoverState;
-	private static final int HMARGIN = 1;
-	private static final int VMARGIN = 5;
-	private static final int SPACING = 5;
-	private static final int ARC_WIDTH = 20;
-	private static final int ARC_HEIGHT = 20;
-	private Image image;
-	private BusyIndicator busyLabel;
-	private Label titleLabel;
-	private SizeCache titleCache;
-	private int fontHeight = -1;
-	private int fontBaselineHeight = -1;
-	private MenuHyperlink menuHyperlink;
-	private MenuManager menuManager;
-	private boolean dragSupport;
-	private int dragOperations;
-	private Transfer[] dragTransferTypes;
-	private DragSourceListener dragListener;
-	private DragSource dragSource;
-	private Image dragImage;
-
-	private class HoverListener implements MouseTrackListener,
-			MouseMoveListener {
-
-		public void mouseEnter(MouseEvent e) {
-			setHoverState(STATE_HOVER_FULL);
-		}
-
-		public void mouseExit(MouseEvent e) {
-			setHoverState(STATE_NORMAL);
-		}
-
-		public void mouseHover(MouseEvent e) {
-		}
-
-		public void mouseMove(MouseEvent e) {
-			if (e.button > 0)
-				setHoverState(STATE_NORMAL);
-			else
-				setHoverState(STATE_HOVER_FULL);
-		}
-	}
-
-	private class MenuHyperlink extends Twistie {
-		private boolean firstTime = true;
-
-		public MenuHyperlink(Composite parent, int style) {
-			super(parent, style);
-			setExpanded(true);
-		}
-
-		public void setExpanded(boolean expanded) {
-			if (firstTime) {
-				super.setExpanded(expanded);
-				firstTime = false;
-			} else {
-				Menu menu = menuManager.createContextMenu(menuHyperlink);
-				menu.setVisible(true);
-			}
-		}
-	}
-
-	private class TitleRegionLayout extends Layout implements ILayoutExtension {
-
-		protected Point computeSize(Composite composite, int wHint, int hHint,
-				boolean flushCache) {
-			return layout(composite, false, 0, 0, wHint, hHint, flushCache);
-		}
-
-		protected void layout(Composite composite, boolean flushCache) {
-			Rectangle carea = composite.getClientArea();
-			layout(composite, true, carea.x, carea.y, carea.width,
-					carea.height, flushCache);
-		}
-
-		private Point layout(Composite composite, boolean move, int x, int y,
-				int width, int height, boolean flushCache) {
-			int iwidth = width == SWT.DEFAULT ? SWT.DEFAULT : width - HMARGIN
-					* 2;
-			Point bsize = null;
-			Point tsize = null;
-			Point msize = null;
-
-			if (busyLabel != null) {
-				bsize = busyLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-			}
-			if (menuManager != null) {
-				menuHyperlink.setVisible(!menuManager.isEmpty()
-						&& titleLabel.getVisible());
-				if (menuHyperlink.getVisible())
-					msize = menuHyperlink.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-			}
-			if (flushCache)
-				titleCache.flush();
-			titleCache.setControl(titleLabel);
-			int twidth = iwidth == SWT.DEFAULT ? iwidth : iwidth - SPACING * 2;
-			if (bsize != null && twidth != SWT.DEFAULT)
-				twidth -= bsize.x + SPACING;
-			if (msize != null && twidth != SWT.DEFAULT)
-				twidth -= msize.x + SPACING;
-			if (titleLabel.getVisible()) {
-				tsize = titleCache.computeSize(twidth, SWT.DEFAULT);
-				if (twidth != SWT.DEFAULT) {
-					// correct for the case when width hint is larger
-					// than the maximum width - this is when the text
-					// can be rendered on one line with width to spare
-					int maxWidth = titleCache.computeSize(SWT.DEFAULT,
-							SWT.DEFAULT).x;
-					tsize.x = Math.min(tsize.x, maxWidth);
-					// System.out.println("twidth="+twidth+",
-					// tsize.x="+tsize.x); //$NON-NLS-1$//$NON-NLS-2$
-				}
-			} else
-				tsize = new Point(0, 0);
-			Point size = new Point(width, height);
-			if (!move) {
-				// compute size
-				size.x = tsize.x > 0 ? HMARGIN * 2 + SPACING * 2 + tsize.x : 0;
-				size.y = tsize.y;
-				if (bsize != null) {
-					size.x += bsize.x + SPACING;
-					size.y = Math.max(size.y, bsize.y);
-				}
-				if (msize != null) {
-					size.x += msize.x + SPACING;
-					size.y = Math.max(size.y, msize.y);
-				}
-				if (size.y > 0)
-					size.y += VMARGIN * 2;
-				// System.out.println("Compute size: width="+width+",
-				// size.x="+size.x); //$NON-NLS-1$ //$NON-NLS-2$
-			} else {
-				// position controls
-				int xloc = x + HMARGIN + SPACING;
-				int yloc = y + VMARGIN;
-				if (bsize != null) {
-					busyLabel.setBounds(xloc,
-							// yloc + height / 2 - bsize.y / 2,
-							yloc + (getFontHeight() >= bsize.y ? getFontHeight() : bsize.y) - 1 - bsize.y,
-							bsize.x, bsize.y);
-					xloc += bsize.x + SPACING;
-				}
-				if (titleLabel.getVisible()) {
-					int tw = width - HMARGIN * 2 - SPACING * 2;
-					if (bsize != null)
-						tw -= bsize.x + SPACING;
-					if (msize != null)
-						tw -= msize.x + SPACING;
-					titleLabel.setBounds(xloc,
-					// yloc + height / 2 - tsize.y / 2,
-							yloc, tw, tsize.y);
-					// System.out.println("tw="+tw); //$NON-NLS-1$
-					xloc += tw + SPACING;
-				}
-				if (msize != null) {
-					menuHyperlink.setBounds(xloc, yloc
-							+ getFontHeight() / 2 - msize.y / 2,
-							msize.x, msize.y);
-				}
-			}
-			return size;
-		}
-
-		public int computeMaximumWidth(Composite parent, boolean changed) {
-			return computeSize(parent, SWT.DEFAULT, SWT.DEFAULT, changed).x;
-		}
-
-		public int computeMinimumWidth(Composite parent, boolean changed) {
-			return computeSize(parent, 0, SWT.DEFAULT, changed).x;
-		}
-	}
-
-	public TitleRegion(Composite parent) {
-		super(parent, SWT.NULL);
-		titleLabel = new Label(this, SWT.WRAP);
-		titleLabel.setVisible(false);
-		titleCache = new SizeCache();
-		super.setLayout(new TitleRegionLayout());
-		hookHoverListeners();
-		addListener(SWT.Dispose, new Listener() {
-			public void handleEvent(Event e) {
-				if (dragImage != null) {
-					dragImage.dispose();
-					dragImage = null;
-				}
-			}
-		});
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Control#forceFocus()
-	 */
-	public boolean forceFocus() {
-		return false;
-	}
-
-	private Color getColor(String key) {
-		return (Color) ((FormHeading) getParent()).colors.get(key);
-	}
-
-	private void hookHoverListeners() {
-		HoverListener listener = new HoverListener();
-		addMouseTrackListener(listener);
-		addMouseMoveListener(listener);
-		titleLabel.addMouseTrackListener(listener);
-		titleLabel.addMouseMoveListener(listener);
-		addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				onPaint(e);
-			}
-		});
-	}
-
-	private void onPaint(PaintEvent e) {
-		if (hoverState == STATE_NORMAL)
-			return;
-		GC gc = e.gc;
-		Rectangle carea = getClientArea();
-		gc.setBackground(getHoverBackground());
-		int savedAntialias = gc.getAntialias();
-		FormUtil.setAntialias(gc, SWT.ON);
-		gc.fillRoundRectangle(carea.x + HMARGIN, carea.y + 2, carea.width
-				- HMARGIN * 2, carea.height - 4, ARC_WIDTH, ARC_HEIGHT);
-		FormUtil.setAntialias(gc, savedAntialias);
-	}
-
-	private Color getHoverBackground() {
-		if (hoverState == STATE_NORMAL)
-			return null;
-		Color color = getColor(hoverState == STATE_HOVER_FULL ? IFormColors.H_HOVER_FULL
-				: IFormColors.H_HOVER_LIGHT);
-		if (color == null)
-			color = getDisplay()
-					.getSystemColor(
-							hoverState == STATE_HOVER_FULL ? SWT.COLOR_WIDGET_BACKGROUND
-									: SWT.COLOR_WIDGET_LIGHT_SHADOW);
-		return color;
-	}
-
-	public void setHoverState(int state) {
-		if (dragSource == null || this.hoverState == state)
-			return;
-		this.hoverState = state;
-		Color color = getHoverBackground();
-		titleLabel.setBackground(color != null ? color
-				: getColor(FormHeading.COLOR_BASE_BG));
-		if (busyLabel != null)
-			busyLabel.setBackground(color != null ? color
-					: getColor(FormHeading.COLOR_BASE_BG));
-		if (menuHyperlink != null)
-			menuHyperlink.setBackground(color != null ? color
-					: getColor(FormHeading.COLOR_BASE_BG));
-		redraw();
-	}
-
-	/**
-	 * Fully delegates the size computation to the internal layout manager.
-	 */
-	public final Point computeSize(int wHint, int hHint, boolean changed) {
-		return ((TitleRegionLayout) getLayout()).computeSize(this, wHint,
-				hHint, changed);
-	}
-
-	public final void setLayout(Layout layout) {
-		// do nothing
-	}
-
-	public Image getImage() {
-		return image;
-	}
-
-	public void setImage(Image image) {
-		this.image = image;
-	}
-
-	public void updateImage(Image newImage, boolean doLayout) {
-		Image theImage = newImage != null ? newImage : this.image;
-
-		if (theImage != null) {
-			ensureBusyLabelExists();
-		} else if (busyLabel != null) {
-			if (!busyLabel.isBusy()) {
-				busyLabel.dispose();
-				busyLabel = null;
-			}
-		}
-		if (busyLabel != null) {
-			busyLabel.setImage(theImage);
-		}
-		if (doLayout)
-			layout();
-	}
-
-	public void updateToolTip(String toolTip) {
-		if (busyLabel != null)
-			busyLabel.setToolTipText(toolTip);
-	}
-
-	public void setBackground(Color bg) {
-		super.setBackground(bg);
-		titleLabel.setBackground(bg);
-		if (busyLabel != null)
-			busyLabel.setBackground(bg);
-		if (menuHyperlink != null)
-			menuHyperlink.setBackground(bg);
-	}
-
-	public void setForeground(Color fg) {
-		super.setForeground(fg);
-		titleLabel.setForeground(fg);
-		if (menuHyperlink != null)
-			menuHyperlink.setForeground(fg);
-	}
-
-	public void setText(String text) {
-		if (text != null)
-			titleLabel.setText(text);
-		titleLabel.setVisible(text != null);
-		layout();
-		redraw();
-	}
-
-	public String getText() {
-		return titleLabel.getText();
-	}
-
-	public void setFont(Font font) {
-		super.setFont(font);
-		titleLabel.setFont(font);
-		fontHeight = -1;
-		fontBaselineHeight = -1;
-		layout();
-	}
-
-	private void ensureBusyLabelExists() {
-		if (busyLabel == null) {
-			busyLabel = new BusyIndicator(this, SWT.NULL);
-			busyLabel.setBackground(getColor(FormHeading.COLOR_BASE_BG));
-			HoverListener listener = new HoverListener();
-			busyLabel.addMouseTrackListener(listener);
-			busyLabel.addMouseMoveListener(listener);
-			if (menuManager != null)
-				busyLabel.setMenu(menuManager.createContextMenu(this));
-			if (dragSupport)
-				addDragSupport(busyLabel, dragOperations, dragTransferTypes, dragListener);
-			IMessageToolTipManager mng = ((FormHeading) getParent())
-					.getMessageToolTipManager();
-			if (mng != null)
-				mng.createToolTip(busyLabel, true);
-		}
-	}
-
-	private void createMenuHyperlink() {
-		menuHyperlink = new MenuHyperlink(this, SWT.NULL);
-		menuHyperlink.setBackground(getColor(FormHeading.COLOR_BASE_BG));
-		menuHyperlink.setDecorationColor(getForeground());
-		menuHyperlink.setHoverDecorationColor(getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND));
-		HoverListener listener = new HoverListener();
-		menuHyperlink.addMouseTrackListener(listener);
-		menuHyperlink.addMouseMoveListener(listener);
-		if (dragSupport)
-			addDragSupport(menuHyperlink, dragOperations, dragTransferTypes, dragListener);
-	}
-
-	/**
-	 * Sets the form's busy state. Busy form will display 'busy' animation in
-	 * the area of the title image.
-	 * 
-	 * @param busy
-	 *            the form's busy state
-	 */
-
-	public boolean setBusy(boolean busy) {
-		if (busy)
-			ensureBusyLabelExists();
-		else if (busyLabel == null)
-			return false;
-		if (busy == busyLabel.isBusy())
-			return false;
-		busyLabel.setBusy(busy);
-		if (busyLabel.getImage() == null) {
-			layout();
-			return true;
-		}
-		return false;
-	}
-
-	public boolean isBusy() {
-		return busyLabel != null && busyLabel.isBusy();
-	}
-
-	/*
-	 * Returns the complete height of the font.
-	 */
-	public int getFontHeight() {
-		if (fontHeight == -1) {
-			Font font = getFont();
-			GC gc = new GC(getDisplay());
-			gc.setFont(font);
-			FontMetrics fm = gc.getFontMetrics();
-			fontHeight = fm.getHeight();
-			gc.dispose();
-		}
-		return fontHeight;
-	}
-
-	/*
-	 * Returns the height of the font starting at the baseline,
-	 * i.e. without the descent.
-	 */
-	public int getFontBaselineHeight() {
-		if (fontBaselineHeight == -1) {
-			Font font = getFont();
-			GC gc = new GC(getDisplay());
-			gc.setFont(font);
-			FontMetrics fm = gc.getFontMetrics();
-			fontBaselineHeight = fm.getHeight() - fm.getDescent();
-			gc.dispose();
-		}
-		return fontBaselineHeight;
-	}
-
-	public IMenuManager getMenuManager() {
-		if (menuManager == null) {
-			menuManager = new MenuManager();
-			Menu menu = menuManager.createContextMenu(this);
-			setMenu(menu);
-			titleLabel.setMenu(menu);
-			if (busyLabel != null)
-				busyLabel.setMenu(menu);
-			createMenuHyperlink();
-		}
-		return menuManager;
-	}
-
-	public void addDragSupport(int operations, Transfer[] transferTypes,
-			DragSourceListener listener) {
-		dragSupport = true;
-		dragOperations = operations;
-		dragTransferTypes = transferTypes;
-		dragListener = listener;
-		dragSource = addDragSupport(titleLabel, operations, transferTypes,
-				listener);
-		addDragSupport(this, operations, transferTypes, listener);
-		if (busyLabel != null)
-			addDragSupport(busyLabel, operations, transferTypes, listener);
-		if (menuHyperlink != null)
-			addDragSupport(menuHyperlink, operations, transferTypes, listener);
-	}
-
-	private DragSource addDragSupport(Control control, int operations,
-			Transfer[] transferTypes, DragSourceListener listener) {
-		DragSource source = new DragSource(control, operations);
-		source.setTransfer(transferTypes);
-		source.addDragListener(listener);
-		source.setDragSourceEffect(new DragSourceEffect(control) {
-			public void dragStart(DragSourceEvent event) {
-				event.image = createDragEffectImage();
-			}
-		});
-		return source;
-	}
-
-	private Image createDragEffectImage() {
-		/*
-		 * if (dragImage != null) { dragImage.dispose(); } GC gc = new GC(this);
-		 * Point size = getSize(); dragImage = new Image(getDisplay(), size.x,
-		 * size.y); gc.copyArea(dragImage, 0, 0); gc.dispose(); return
-		 * dragImage;
-		 */
-		return null;
-	}
-
-	public void addDropSupport(int operations, Transfer[] transferTypes,
-			DropTargetListener listener) {
-		final DropTarget target = new DropTarget(this, operations);
-		target.setTransfer(transferTypes);
-		target.addDropListener(listener);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/WrappedPageBook.java b/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/WrappedPageBook.java
deleted file mode 100644
index 964a4f3..0000000
--- a/bundles/org.eclipse.ui.forms/src/org/eclipse/ui/internal/forms/widgets/WrappedPageBook.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.forms.widgets;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.forms.widgets.ILayoutExtension;
-
-/**
- * A pagebook is a composite control where only a single control is visible at
- * a time. It is similar to a notebook, but without tabs.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- */
-public class WrappedPageBook extends Composite {
-	class PageBookLayout extends Layout implements ILayoutExtension {
-		protected Point computeSize(Composite composite, int wHint, int hHint,
-				boolean flushCache) {
-			if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT)
-				return new Point(wHint, hHint);
-			Point result = null;
-			if (currentPage != null) {
-				result = currentPage.computeSize(wHint, hHint, flushCache);
-			} else {
-				result = new Point(0, 0);
-			}
-			return result;
-		}
-		protected void layout(Composite composite, boolean flushCache) {
-			if (currentPage != null) {
-				currentPage.setBounds(composite.getClientArea());
-			}
-		}
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.forms.widgets.ILayoutExtension#computeMaximumWidth(org.eclipse.swt.widgets.Composite,
-		 *      boolean)
-		 */
-		public int computeMaximumWidth(Composite parent, boolean changed) {
-			return computeSize(parent, SWT.DEFAULT, SWT.DEFAULT, changed).x;
-		}
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.forms.widgets.ILayoutExtension#computeMinimumWidth(org.eclipse.swt.widgets.Composite,
-		 *      boolean)
-		 */
-		public int computeMinimumWidth(Composite parent, boolean changed) {
-			return computeSize(parent, 0, SWT.DEFAULT, changed).x;
-		}
-	}
-	/**
-	 * The current control; <code>null</code> if none.
-	 */
-	private Control currentPage = null;
-	/**
-	 * Creates a new empty pagebook.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param style
-	 *            the SWT style bits
-	 */
-	public WrappedPageBook(Composite parent, int style) {
-		super(parent, style);
-		setLayout(new PageBookLayout());
-	}
-	/**
-	 * Shows the given page. This method has no effect if the given page is not
-	 * contained in this pagebook.
-	 * 
-	 * @param page
-	 *            the page to show
-	 */
-	public void showPage(Control page) {
-		if (page == currentPage)
-			return;
-		if (page.getParent() != this)
-			return;
-		Control oldPage = currentPage;
-		currentPage = page;
-		// show new page
-		if (page != null) {
-			if (!page.isDisposed()) {
-				//page.setVisible(true);
-				layout(true);
-				page.setVisible(true);
-			}
-		}
-		// hide old *after* new page has been made visible in order to avoid
-		// flashing
-		if (oldPage != null && !oldPage.isDisposed())
-			oldPage.setVisible(false);
-	}
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		return ((PageBookLayout) getLayout()).computeSize(this, wHint, hHint,
-				changed);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide.application/.classpath b/bundles/org.eclipse.ui.ide.application/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.ui.ide.application/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.ui.ide.application/.project b/bundles/org.eclipse.ui.ide.application/.project
deleted file mode 100644
index 716e130..0000000
--- a/bundles/org.eclipse.ui.ide.application/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.ide.application</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.ide.application/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.ui.ide.application/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index d1f7f5a..0000000
--- a/bundles/org.eclipse.ui.ide.application/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,70 +0,0 @@
-#Thu Apr 03 13:18:13 EDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.ui.ide.application/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.ui.ide.application/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index c25b294..0000000
--- a/bundles/org.eclipse.ui.ide.application/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Mon Feb 06 11:18:42 EST 2006
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.3\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template></templates>
diff --git a/bundles/org.eclipse.ui.ide.application/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.ui.ide.application/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 498f3ae..0000000
--- a/bundles/org.eclipse.ui.ide.application/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Nov 16 14:11:37 EST 2004
-compilers.p.unused-element-or-attribute=1
-compilers.p.unresolved-ex-points=0
-compilers.p.deprecated=0
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unknown-class=1
-compilers.p.unknown-attribute=0
-compilers.p.no-required-att=0
-eclipse.preferences.version=1
-compilers.p.unresolved-import=0
-compilers.p.not-externalized-att=0
-compilers.p.illegal-att-value=0
-compilers.use-project=true
diff --git a/bundles/org.eclipse.ui.ide.application/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.ide.application/META-INF/MANIFEST.MF
deleted file mode 100644
index 1884ba4..0000000
--- a/bundles/org.eclipse.ui.ide.application/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,18 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui.ide.application;singleton:=true
-Bundle-Version: 1.0.100.qualifier
-Bundle-Vendor: %Plugin.providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.update.configurator;bundle-version="[3.1.100,4.0.0)",
- org.eclipse.ui;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.ui.navigator.resources;bundle-version="[3.2.100,4.0.0)",
- org.eclipse.core.net;bundle-version="[1.0.0,2.0.0)",
- com.ibm.icu;bundle-version="3.8.1"
-Export-Package: org.eclipse.ui.internal.ide.application;x-internal:=true,
- org.eclipse.ui.internal.ide.application.dialogs;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/bundles/org.eclipse.ui.ide.application/about.html b/bundles/org.eclipse.ui.ide.application/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.ui.ide.application/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.ide.application/build.properties b/bundles/org.eclipse.ui.ide.application/build.properties
deleted file mode 100644
index 4f5c84b..0000000
--- a/bundles/org.eclipse.ui.ide.application/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               plugin.properties,\
-               about.html,\
-               icons/
-src.includes = about.html
diff --git a/bundles/org.eclipse.ui.ide.application/icons/full/elcl16/configs.gif b/bundles/org.eclipse.ui.ide.application/icons/full/elcl16/configs.gif
deleted file mode 100755
index c984fba..0000000
--- a/bundles/org.eclipse.ui.ide.application/icons/full/elcl16/configs.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide.application/icons/full/elcl16/usearch_obj.gif b/bundles/org.eclipse.ui.ide.application/icons/full/elcl16/usearch_obj.gif
deleted file mode 100755
index 5080599..0000000
--- a/bundles/org.eclipse.ui.ide.application/icons/full/elcl16/usearch_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide.application/icons/full/eview16/resource_persp.gif b/bundles/org.eclipse.ui.ide.application/icons/full/eview16/resource_persp.gif
deleted file mode 100644
index 1b8fe00..0000000
--- a/bundles/org.eclipse.ui.ide.application/icons/full/eview16/resource_persp.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide.application/plugin.properties b/bundles/org.eclipse.ui.ide.application/plugin.properties
deleted file mode 100644
index e9b3e06..0000000
--- a/bundles/org.eclipse.ui.ide.application/plugin.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2006, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Plugin.name = Eclipse IDE UI Application
-Plugin.providerName = Eclipse.org
-
-PreferencePages.Startup = Startup and Shutdown
-
-Perspective.resourcePerspective = Resource
-Perspective.resourceDescription = This perspective is designed to provide general resource viewing and navigation. 
-
-updateMenu.label = &Software Updates
-actionSets.updates.label = &Find and Install...
-actionSets.configManager.label = &Manage Configuration...
diff --git a/bundles/org.eclipse.ui.ide.application/plugin.xml b/bundles/org.eclipse.ui.ide.application/plugin.xml
deleted file mode 100644
index 6b78c62..0000000
--- a/bundles/org.eclipse.ui.ide.application/plugin.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-    <extension
-         id="org.eclipse.ui.ide.workbench"
-         point="org.eclipse.core.runtime.applications">
-      <application>
-         <run
-               class="org.eclipse.ui.internal.ide.application.IDEApplication">
-         </run>
-      </application>
-   </extension>
-    <extension
-          point="org.eclipse.ui.preferencePages">
-     <page
-            name="%PreferencePages.Startup"
-            category="org.eclipse.ui.preferencePages.Workbench"
-            class="org.eclipse.ui.internal.ide.application.dialogs.IDEStartupPreferencePage"
-            id="org.eclipse.ui.preferencePages.Startup">
-         <keywordReference id="org.eclipse.ui.ide.startupAndShutdown"/>
-      </page>
-    </extension>
-     <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            name="%Perspective.resourcePerspective"
-            icon="$nl$/icons/full/eview16/resource_persp.gif"
-            class="org.eclipse.ui.internal.ide.application.ResourcePerspective"
-            id="org.eclipse.ui.resourcePerspective">
-         <description>
-            %Perspective.resourceDescription
-         </description>
-      </perspective>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectiveExtensions">
-      <perspectiveExtension
-            targetID="org.eclipse.ui.resourcePerspective">
-         <showInPart
-               id="org.eclipse.ui.navigator.ProjectExplorer">
-         </showInPart>
-      </perspectiveExtension>
-   </extension>
-   <extension
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            locationURI="menu:file?after=open.ext">
-         <command
-               commandId="org.eclipse.ui.file.restartWorkbench"
-               id="org.eclipse.ui.file.restartWorkbench"
-               style="push">
-         </command>
-      </menuContribution>
-      <menuContribution
-             locationURI="menu:help?after=additions">
-       <menu label="%updateMenu.label">
-               <command
-                     commandId="org.eclipse.ui.update.findAndInstallUpdates"
-                     helpContextId="org.eclipse.update.ui.newUpdates"
-                     icon="icons/full/elcl16/usearch_obj.gif"
-                     label="%actionSets.updates.label"
-                     style="push">
-               </command>
-               <command
-                     commandId="org.eclipse.ui.update.manageConfiguration"
-                     helpContextId="org.eclipse.update.ui.newUpdates"
-                     icon="icons/full/elcl16/configs.gif"
-                     label="%actionSets.configManager.label"
-                     style="push">
-               </command>
-       </menu>
-       </menuContribution>
-   </extension>
-</plugin>
diff --git a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEApplication.java b/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEApplication.java
deleted file mode 100644
index 036bc68..0000000
--- a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEApplication.java
+++ /dev/null
@@ -1,489 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.application;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Properties;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.equinox.app.IApplication;
-import org.eclipse.equinox.app.IApplicationContext;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.osgi.service.datalocation.Location;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.ide.ChooseWorkspaceData;
-import org.eclipse.ui.internal.ide.ChooseWorkspaceDialog;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.StatusUtil;
-
-/**
- * The "main program" for the Eclipse IDE.
- * 
- * @since 3.0
- */
-public class IDEApplication implements IApplication, IExecutableExtension {
-
-	/**
-	 * The name of the folder containing metadata information for the workspace.
-	 */
-    public static final String METADATA_FOLDER = ".metadata"; //$NON-NLS-1$
-
-    private static final String VERSION_FILENAME = "version.ini"; //$NON-NLS-1$
-
-    private static final String WORKSPACE_VERSION_KEY = "org.eclipse.core.runtime"; //$NON-NLS-1$
-
-    private static final String WORKSPACE_VERSION_VALUE = "1"; //$NON-NLS-1$
-
-    private static final String PROP_EXIT_CODE = "eclipse.exitcode"; //$NON-NLS-1$
-
-    /**
-     * A special return code that will be recognized by the launcher and used to
-     * restart the workbench.
-     */
-    private static final Integer EXIT_RELAUNCH = new Integer(24);
-
-    /**
-     * The ID of the application plug-in
-     */
-	public static final String PLUGIN_ID = "org.eclipse.ui.ide.application"; //$NON-NLS-1$
-
-    /**
-     * Creates a new IDE application.
-     */
-    public IDEApplication() {
-        // There is nothing to do for IDEApplication
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext context)
-     */
-    public Object start(IApplicationContext appContext) throws Exception {
-        Display display = createDisplay();
-
-        try {
-
-        	// look and see if there's a splash shell we can parent off of
-        	Shell shell = WorkbenchPlugin.getSplashShell(display);
-        	if (shell != null) {
-        		// should should set the icon and message for this shell to be the 
-        		// same as the chooser dialog - this will be the guy that lives in
-        		// the task bar and without these calls you'd have the default icon 
-        		// with no message.
-        		shell.setText(ChooseWorkspaceDialog.getWindowTitle());
-        		shell.setImages(Dialog.getDefaultImages());
-        	}
-           
-            if (!checkInstanceLocation(shell)) {
-            	WorkbenchPlugin.unsetSplashShell(display);
-                Platform.endSplash();
-                return EXIT_OK;
-            }
-
-            // create the workbench with this advisor and run it until it exits
-            // N.B. createWorkbench remembers the advisor, and also registers
-            // the workbench globally so that all UI plug-ins can find it using
-            // PlatformUI.getWorkbench() or AbstractUIPlugin.getWorkbench()
-            int returnCode = PlatformUI.createAndRunWorkbench(display,
-                    new IDEWorkbenchAdvisor());
-
-            // the workbench doesn't support relaunch yet (bug 61809) so
-            // for now restart is used, and exit data properties are checked
-            // here to substitute in the relaunch return code if needed
-            if (returnCode != PlatformUI.RETURN_RESTART) {
-				return EXIT_OK;
-			}
-
-            // if the exit code property has been set to the relaunch code, then
-            // return that code now, otherwise this is a normal restart
-            return EXIT_RELAUNCH.equals(Integer.getInteger(PROP_EXIT_CODE)) ? EXIT_RELAUNCH
-                    : EXIT_RESTART;
-        } finally {
-            if (display != null) {
-				display.dispose();
-			}
-            Location instanceLoc = Platform.getInstanceLocation();
-            if (instanceLoc != null)
-            	instanceLoc.release();
-        }
-    }
-
-    /**
-     * Creates the display used by the application.
-     * 
-     * @return the display used by the application
-     */
-    protected Display createDisplay() {
-        return PlatformUI.createDisplay();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement, java.lang.String, java.lang.Object)
-     */
-    public void setInitializationData(IConfigurationElement config,
-            String propertyName, Object data) {
-        // There is nothing to do for IDEApplication
-    }
-
-    /**
-     * Return true if a valid workspace path has been set and false otherwise.
-     * Prompt for and set the path if possible and required.
-     * 
-     * @return true if a valid instance location has been set and false
-     *         otherwise
-     */
-    private boolean checkInstanceLocation(Shell shell) {
-        // -data @none was specified but an ide requires workspace
-        Location instanceLoc = Platform.getInstanceLocation();
-        if (instanceLoc == null) {
-            MessageDialog
-                    .openError(
-                            shell,
-                            IDEWorkbenchMessages.IDEApplication_workspaceMandatoryTitle,
-                            IDEWorkbenchMessages.IDEApplication_workspaceMandatoryMessage);
-            return false;
-        }
-
-        // -data "/valid/path", workspace already set
-        if (instanceLoc.isSet()) {
-            // make sure the meta data version is compatible (or the user has
-            // chosen to overwrite it).
-            if (!checkValidWorkspace(shell, instanceLoc.getURL())) {
-				return false;
-			}
-
-            // at this point its valid, so try to lock it and update the
-            // metadata version information if successful
-            try {
-                if (instanceLoc.lock()) {
-                    writeWorkspaceVersion();
-                    return true;
-                }
-                
-                // we failed to create the directory.  
-                // Two possibilities:
-                // 1. directory is already in use
-                // 2. directory could not be created
-                File workspaceDirectory = new File(instanceLoc.getURL().getFile());
-                if (workspaceDirectory.exists()) {
-	                MessageDialog.openError(
-	                        shell,
-	                        IDEWorkbenchMessages.IDEApplication_workspaceCannotLockTitle,
-	                        IDEWorkbenchMessages.IDEApplication_workspaceCannotLockMessage);
-                } else {
-                	MessageDialog.openError(
-                			shell, 
-                			IDEWorkbenchMessages.IDEApplication_workspaceCannotBeSetTitle,
-                			IDEWorkbenchMessages.IDEApplication_workspaceCannotBeSetMessage);
-                }
-            } catch (IOException e) {
-                IDEWorkbenchPlugin.log("Could not obtain lock for workspace location", //$NON-NLS-1$
-                        e);            	
-                MessageDialog
-                .openError(
-                        shell,
-                        IDEWorkbenchMessages.InternalError,
-                        e.getMessage());                
-            }            
-            return false;
-        }
-
-        // -data @noDefault or -data not specified, prompt and set
-        ChooseWorkspaceData launchData = new ChooseWorkspaceData(instanceLoc
-                .getDefault());
-
-        boolean force = false;
-        while (true) {
-            URL workspaceUrl = promptForWorkspace(shell, launchData, force);
-            if (workspaceUrl == null) {
-				return false;
-			}
-
-            // if there is an error with the first selection, then force the
-            // dialog to open to give the user a chance to correct
-            force = true;
-
-            try {
-                // the operation will fail if the url is not a valid
-                // instance data area, so other checking is unneeded
-                if (instanceLoc.setURL(workspaceUrl, true)) {
-                    launchData.writePersistedData();
-                    writeWorkspaceVersion();
-                    return true;
-                }
-            } catch (IllegalStateException e) {
-                MessageDialog
-                        .openError(
-                                shell,
-                                IDEWorkbenchMessages.IDEApplication_workspaceCannotBeSetTitle,
-                                IDEWorkbenchMessages.IDEApplication_workspaceCannotBeSetMessage);
-                return false;
-            }
-
-            // by this point it has been determined that the workspace is
-            // already in use -- force the user to choose again
-            MessageDialog.openError(shell, IDEWorkbenchMessages.IDEApplication_workspaceInUseTitle, 
-                    IDEWorkbenchMessages.IDEApplication_workspaceInUseMessage);
-        }
-    }
-
-    /**
-     * Open a workspace selection dialog on the argument shell, populating the
-     * argument data with the user's selection. Perform first level validation
-     * on the selection by comparing the version information. This method does
-     * not examine the runtime state (e.g., is the workspace already locked?).
-     * 
-     * @param shell
-     * @param launchData
-     * @param force
-     *            setting to true makes the dialog open regardless of the
-     *            showDialog value
-     * @return An URL storing the selected workspace or null if the user has
-     *         canceled the launch operation.
-     */
-    private URL promptForWorkspace(Shell shell, ChooseWorkspaceData launchData,
-			boolean force) {
-        URL url = null;
-        do {
-        	// okay to use the shell now - this is the splash shell
-            new ChooseWorkspaceDialog(shell, launchData, false, true).prompt(force);
-            String instancePath = launchData.getSelection();
-            if (instancePath == null) {
-				return null;
-			}
-
-            // the dialog is not forced on the first iteration, but is on every
-            // subsequent one -- if there was an error then the user needs to be
-            // allowed to fix it
-            force = true;
-
-            // 70576: don't accept empty input
-            if (instancePath.length() <= 0) {
-                MessageDialog
-                .openError(
-                        shell,
-                        IDEWorkbenchMessages.IDEApplication_workspaceEmptyTitle,
-                        IDEWorkbenchMessages.IDEApplication_workspaceEmptyMessage);
-                continue;
-            }
-
-            // create the workspace if it does not already exist
-            File workspace = new File(instancePath);
-            if (!workspace.exists()) {
-				workspace.mkdir();
-			}
-
-            try {
-                // Don't use File.toURL() since it adds a leading slash that Platform does not
-                // handle properly.  See bug 54081 for more details.  
-                String path = workspace.getAbsolutePath().replace(
-                        File.separatorChar, '/');
-                url = new URL("file", null, path); //$NON-NLS-1$
-            } catch (MalformedURLException e) {
-                MessageDialog
-                        .openError(
-                                shell,
-                                IDEWorkbenchMessages.IDEApplication_workspaceInvalidTitle,
-                                IDEWorkbenchMessages.IDEApplication_workspaceInvalidMessage);
-                continue;
-            }
-        } while (!checkValidWorkspace(shell, url));
-
-        return url;
-    }
-
-    /**
-     * Return true if the argument directory is ok to use as a workspace and
-     * false otherwise. A version check will be performed, and a confirmation
-     * box may be displayed on the argument shell if an older version is
-     * detected.
-     * 
-     * @return true if the argument URL is ok to use as a workspace and false
-     *         otherwise.
-     */
-    private boolean checkValidWorkspace(Shell shell, URL url) {
-        // a null url is not a valid workspace
-        if (url == null) {
-			return false;
-		}
-
-        String version = readWorkspaceVersion(url);
-
-        // if the version could not be read, then there is not any existing
-        // workspace data to trample, e.g., perhaps its a new directory that
-        // is just starting to be used as a workspace
-        if (version == null) {
-			return true;
-		}
-
-        final int ide_version = Integer.parseInt(WORKSPACE_VERSION_VALUE);
-        int workspace_version = Integer.parseInt(version);
-
-        // equality test is required since any version difference (newer
-        // or older) may result in data being trampled
-        if (workspace_version == ide_version) {
-			return true;
-		}
-
-        // At this point workspace has been detected to be from a version
-        // other than the current ide version -- find out if the user wants
-        // to use it anyhow.
-        String title = IDEWorkbenchMessages.IDEApplication_versionTitle;
-        String message = NLS.bind(IDEWorkbenchMessages.IDEApplication_versionMessage, url.getFile());
-
-        MessageBox mbox = new MessageBox(shell, SWT.OK | SWT.CANCEL
-                | SWT.ICON_WARNING | SWT.APPLICATION_MODAL);
-        mbox.setText(title);
-        mbox.setMessage(message);
-        return mbox.open() == SWT.OK;
-    }
-
-    /**
-     * Look at the argument URL for the workspace's version information. Return
-     * that version if found and null otherwise.
-     */
-    private static String readWorkspaceVersion(URL workspace) {
-        File versionFile = getVersionFile(workspace, false);
-        if (versionFile == null || !versionFile.exists()) {
-			return null;
-		}
-
-        try {
-            // Although the version file is not spec'ed to be a Java properties
-            // file, it happens to follow the same format currently, so using
-            // Properties to read it is convenient.
-            Properties props = new Properties();
-            FileInputStream is = new FileInputStream(versionFile);
-            try {
-                props.load(is);
-            } finally {
-                is.close();
-            }
-
-            return props.getProperty(WORKSPACE_VERSION_KEY);
-        } catch (IOException e) {
-            IDEWorkbenchPlugin.log("Could not read version file", new Status( //$NON-NLS-1$
-                    IStatus.ERROR, IDEWorkbenchPlugin.IDE_WORKBENCH,
-                    IStatus.ERROR,
-                    e.getMessage() == null ? "" : e.getMessage(), //$NON-NLS-1$, 
-                    e));
-            return null;
-        }
-    }
-
-    /**
-     * Write the version of the metadata into a known file overwriting any
-     * existing file contents. Writing the version file isn't really crucial,
-     * so the function is silent about failure
-     */
-    private static void writeWorkspaceVersion() {
-        Location instanceLoc = Platform.getInstanceLocation();
-        if (instanceLoc == null || instanceLoc.isReadOnly()) {
-			return;
-		}
-
-        File versionFile = getVersionFile(instanceLoc.getURL(), true);
-        if (versionFile == null) {
-			return;
-		}
-
-        OutputStream output = null;
-        try {
-            String versionLine = WORKSPACE_VERSION_KEY + '='
-                    + WORKSPACE_VERSION_VALUE;
-
-            output = new FileOutputStream(versionFile);
-            output.write(versionLine.getBytes("UTF-8")); //$NON-NLS-1$
-        } catch (IOException e) {
-            IDEWorkbenchPlugin.log("Could not write version file", //$NON-NLS-1$
-                    StatusUtil.newStatus(IStatus.ERROR, e.getMessage(), e));
-        } finally {
-            try {
-                if (output != null) {
-					output.close();
-				}
-            } catch (IOException e) {
-                // do nothing
-            }
-        }
-    }
-
-    /**
-     * The version file is stored in the metadata area of the workspace. This
-     * method returns an URL to the file or null if the directory or file does
-     * not exist (and the create parameter is false).
-     * 
-     * @param create
-     *            If the directory and file does not exist this parameter
-     *            controls whether it will be created.
-     * @return An url to the file or null if the version file does not exist or
-     *         could not be created.
-     */
-    private static File getVersionFile(URL workspaceUrl, boolean create) {
-        if (workspaceUrl == null) {
-			return null;
-		}
-
-        try {
-            // make sure the directory exists
-            File metaDir = new File(workspaceUrl.getPath(), METADATA_FOLDER);
-            if (!metaDir.exists() && (!create || !metaDir.mkdir())) {
-				return null;
-			}
-
-            // make sure the file exists
-            File versionFile = new File(metaDir, VERSION_FILENAME);
-            if (!versionFile.exists()
-                    && (!create || !versionFile.createNewFile())) {
-				return null;
-			}
-
-            return versionFile;
-        } catch (IOException e) {
-            // cannot log because instance area has not been set
-            return null;
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.equinox.app.IApplication#stop()
-     */
-	public void stop() {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		if (workbench == null)
-			return;
-		final Display display = workbench.getDisplay();
-		display.syncExec(new Runnable() {
-			public void run() {
-				if (!display.isDisposed())
-					workbench.close();
-			}
-		});
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEIdleHelper.java b/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEIdleHelper.java
deleted file mode 100644
index 8e8fbd8..0000000
--- a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEIdleHelper.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.application;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.Policy;
-
-/**
- * The idle helper detects when the system is idle in order to perform garbage 
- * collection in a way that minimizes impact on responsiveness of the UI.
- * The algorithm for determining when to perform a garbage collection
- * is as follows:
- * 
- *  - Never gc if there is a test harness present
- *  - Don't gc if background jobs are running
- *  - Don't gc if the keyboard or mouse have been active within IDLE_INTERVAL
- *  - Don't gc if there has been a GC within the minimum gc interval (system property PROP_GC_INTERVAL)
- *  - After a gc, don't gc again until (duration * GC_DELAY_MULTIPLIER) has elapsed.
- *    For example, if a GC takes 100ms and the multiplier is 60, don't gc for at least five seconds
- *  - Never gc again if any single gc takes longer than system property PROP_GC_MAX
- */
-class IDEIdleHelper {
-
-	/**
-	 * The default minimum time between garbage collections.
-	 */
-	private static final int DEFAULT_GC_INTERVAL = 60000;
-
-	/**
-	 * The default maximum duration for a garbage collection, beyond which
-	 * the explicit gc mechanism is automatically disabled.
-	 */
-	private static final int DEFAULT_GC_MAX = 8000;
-
-	/**
-	 * The multiple of the last gc duration before we will consider doing
-	 * another one.
-	 */
-	private static final int GC_DELAY_MULTIPLIER = 60;
-
-	/**
-	 * The time interval of no keyboard or mouse events after which the system 
-	 * is considered idle.
-	 */
-	private static final int IDLE_INTERVAL = 5000;
-
-	/**
-	 * The name of the boolean system property that specifies whether explicit
-	 * garbage collection is enabled.
-	 */
-	private static final String PROP_GC = "ide.gc"; //$NON-NLS-1$
-
-	/**
-	 * The name of the integer system property that specifies the minimum time 
-	 * interval in milliseconds between garbage collections.
-	 */
-	private static final String PROP_GC_INTERVAL = "ide.gc.interval"; //$NON-NLS-1$
-
-	/**
-	 * The name of the integer system property that specifies the maximum 
-	 * duration for a garbage collection. If this duration is ever exceeded, the 
-	 * explicit gc mechanism is disabled for the remainder of the session.
-	 */
-	private static final String PROP_GC_MAX = "ide.gc.max"; //$NON-NLS-1$
-
-	protected IWorkbenchConfigurer configurer;
-
-	private Listener idleListener;
-
-	/**
-	 * The last time we garbage collected.
-	 */
-	private long lastGC = System.currentTimeMillis();
-
-	/**
-	 * The maximum gc duration. If this value is exceeded, the
-	 * entire explicit gc mechanism is disabled.
-	 */
-	private int maxGC = DEFAULT_GC_MAX;
-	/**
-	 * The minimum time interval until the next garbage collection
-	 */
-	private int minGCInterval = DEFAULT_GC_INTERVAL;
-
-	/**
-	 * The time interval until the next garbage collection
-	 */
-	private int nextGCInterval = DEFAULT_GC_INTERVAL;
-	
-	private Job gcJob;
-
-	private Runnable handler;	
-	
-	/**
-	 * Creates and initializes the idle handler
-	 * @param aConfigurer The workbench configurer.
-	 */
-	IDEIdleHelper(IWorkbenchConfigurer aConfigurer) {
-		this.configurer = aConfigurer;
-		//don't gc while running tests because performance tests are sensitive to timing (see bug 121562)
-		if (PlatformUI.getTestableObject().getTestHarness() != null) {
-			return;
-		}
-		String enabled = System.getProperty(PROP_GC);
-		//gc is turned on by default if property is missing
-		if (enabled != null && enabled.equalsIgnoreCase(Boolean.FALSE.toString())) {
-			return;
-		}
-		//init gc interval
-		Integer prop = Integer.getInteger(PROP_GC_INTERVAL);
-		if (prop != null && prop.intValue() >= 0) {
-			minGCInterval = nextGCInterval = prop.intValue();
-		}
-
-		//init max gc interval
-		prop = Integer.getInteger(PROP_GC_MAX);
-		if (prop != null) {
-			maxGC = prop.intValue();
-		}
-		
-		createGarbageCollectionJob();
-
-		//hook idle handler
-		final Display display = configurer.getWorkbench().getDisplay();
-		handler = new Runnable() {
-					public void run() {
-						if (!display.isDisposed() && !configurer.getWorkbench().isClosing()) {
-							int nextInterval;
-							final long start = System.currentTimeMillis();
-							//don't garbage collect if background jobs are running
-							if (!Job.getJobManager().isIdle()) {
-								nextInterval = IDLE_INTERVAL;
-							} else if ((start - lastGC) < nextGCInterval) {
-								//don't garbage collect if we have collected within the specific interval
-								nextInterval = nextGCInterval - (int) (start - lastGC);
-							} else {
-								gcJob.schedule();
-								nextInterval = minGCInterval;
-							}
-							display.timerExec(nextInterval, this);
-						}
-					}
-				};
-		idleListener = new Listener() {
-			public void handleEvent(Event event) {
-				display.timerExec(IDLE_INTERVAL, handler);
-			}
-		};
-		display.addFilter(SWT.KeyUp, idleListener);
-		display.addFilter(SWT.MouseUp, idleListener);
-	}
-
-	/**
-	 * Creates the job that performs garbage collection
-	 */
-	private void createGarbageCollectionJob() {
-		gcJob = new Job(IDEWorkbenchMessages.IDEIdleHelper_backgroundGC) {
-			protected IStatus run(IProgressMonitor monitor) {
-				final Display display = configurer.getWorkbench().getDisplay();
-				if (display != null && !display.isDisposed()) {
-					final long start = System.currentTimeMillis();
-					System.gc();
-					System.runFinalization();
-					lastGC = start;
-					final int duration = (int) (System.currentTimeMillis() - start);
-					if (Policy.DEBUG_GC) {
-						System.out.println("Explicit GC took: " + duration); //$NON-NLS-1$
-					}
-					if (duration > maxGC) {
-						if (Policy.DEBUG_GC) {
-							System.out.println("Further explicit GCs disabled due to long GC"); //$NON-NLS-1$
-						}
-						shutdown();
-					} else {
-						//if the gc took a long time, ensure the next gc doesn't happen for awhile
-						nextGCInterval = Math.max(minGCInterval, GC_DELAY_MULTIPLIER * duration);
-						if (Policy.DEBUG_GC) {
-							System.out.println("Next GC to run in: " + nextGCInterval); //$NON-NLS-1$
-						}
-					}
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		gcJob.setSystem(true);
-	}
-
-	/**
-	 * Shuts down the idle helper, removing any installed listeners, etc.
-	 */
-	void shutdown() {
-		if (idleListener == null) {
-			return;
-		}
-		final Display display = configurer.getWorkbench().getDisplay();
-		if (display != null && !display.isDisposed()) {
-			try {
-				display.asyncExec(new Runnable() {
-					public void run() {
-						display.timerExec(-1, handler);
-						display.removeFilter(SWT.KeyUp, idleListener);
-						display.removeFilter(SWT.MouseUp, idleListener);
-					}
-				});
-			} catch (SWTException ex) {
-				// ignore (display might be disposed)
-			}			
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java b/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java
deleted file mode 100644
index 4424e53..0000000
--- a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java
+++ /dev/null
@@ -1,766 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.application;
-
-import java.lang.reflect.InvocationTargetException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.core.net.proxy.IProxyService;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.WorkspaceJob;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IBundleGroup;
-import org.eclipse.core.runtime.IBundleGroupProvider;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.TrayDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ISelectionConversionService;
-import org.eclipse.ui.internal.PluginActionBuilder;
-import org.eclipse.ui.internal.Workbench;
-import org.eclipse.ui.internal.ide.AboutInfo;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.ui.internal.ide.IDESelectionConversionService;
-import org.eclipse.ui.internal.ide.IDEWorkbenchActivityHelper;
-import org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.model.WorkbenchAdapterBuilder;
-import org.eclipse.ui.internal.ide.undo.WorkspaceUndoMonitor;
-import org.eclipse.ui.internal.progress.ProgressMonitorJobsDialog;
-import org.eclipse.ui.progress.IProgressService;
-import org.eclipse.ui.statushandlers.AbstractStatusHandler;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.Version;
-
-import com.ibm.icu.text.Collator;
-
-/**
- * IDE-specified workbench advisor which configures the workbench for use as an
- * IDE.
- * <p>
- * Note: This class replaces <code>org.eclipse.ui.internal.Workbench</code>.
- * </p>
- * 
- * @since 3.0
- */
-public class IDEWorkbenchAdvisor extends WorkbenchAdvisor {
-
-	private static final String WORKBENCH_PREFERENCE_CATEGORY_ID = "org.eclipse.ui.preferencePages.Workbench"; //$NON-NLS-1$
-
-	/**
-	 * The dialog setting key to access the known installed features since the
-	 * last time the workbench was run.
-	 */
-	private static final String INSTALLED_FEATURES = "installedFeatures"; //$NON-NLS-1$
-
-	private static IDEWorkbenchAdvisor workbenchAdvisor = null;
-
-	/**
-	 * Contains the workspace location if the -showlocation command line
-	 * argument is specified, or <code>null</code> if not specified.
-	 */
-	private String workspaceLocation = null;
-
-	/**
-	 * Ordered map of versioned feature ids -> info that are new for this
-	 * session; <code>null</code> if uninitialized. Key type:
-	 * <code>String</code>, Value type: <code>AboutInfo</code>.
-	 */
-	private Map newlyAddedBundleGroups;
-
-	/**
-	 * Array of <code>AboutInfo</code> for all new installed features that
-	 * specify a welcome perspective.
-	 */
-	private AboutInfo[] welcomePerspectiveInfos = null;
-
-	/**
-	 * Helper for managing activites in response to workspace changes.
-	 */
-	private IDEWorkbenchActivityHelper activityHelper = null;
-
-	/**
-	 * Helper for managing work that is performed when the system is otherwise
-	 * idle.
-	 */
-	private IDEIdleHelper idleHelper;
-
-	private Listener settingsChangeListener;
-	
-	/**
-	 * Support class for monitoring workspace changes and periodically
-	 * validating the undo history
-	 */
-	private WorkspaceUndoMonitor workspaceUndoMonitor;
-
-	/**
-	 * The IDE workbench error handler.
-	 */
-	private AbstractStatusHandler ideWorkbenchErrorHandler;
-
-	/**
-	 * Creates a new workbench advisor instance.
-	 */
-	public IDEWorkbenchAdvisor() {
-		super();
-		if (workbenchAdvisor != null) {
-			throw new IllegalStateException();
-		}
-		workbenchAdvisor = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#initialize
-	 */
-	public void initialize(IWorkbenchConfigurer configurer) {
-
-		PluginActionBuilder.setAllowIdeLogging(true);
-		
-		// make sure we always save and restore workspace state
-		configurer.setSaveAndRestore(true);
-
-		// register workspace adapters
-		WorkbenchAdapterBuilder.registerAdapters();
-
-		// get the command line arguments
-		String[] cmdLineArgs = Platform.getCommandLineArgs();
-
-		// include the workspace location in the title
-		// if the command line option -showlocation is specified
-		for (int i = 0; i < cmdLineArgs.length; i++) {
-			if ("-showlocation".equalsIgnoreCase(cmdLineArgs[i])) { //$NON-NLS-1$
-				String name = null;
-				if (cmdLineArgs.length > i + 1) {
-					name = cmdLineArgs[i + 1];
-				}
-				if (name != null && name.indexOf("-") == -1) { //$NON-NLS-1$
-					workspaceLocation = name;
-				} else {
-					workspaceLocation = Platform.getLocation().toOSString();
-				}
-				break;
-			}
-		}
-
-		// register shared images
-		declareWorkbenchImages();
-
-		// initialize the activity helper
-		activityHelper = IDEWorkbenchActivityHelper.getInstance();
-
-		// initialize idle handler
-		idleHelper = new IDEIdleHelper(configurer);
-		
-		// initialize the workspace undo monitor
-		workspaceUndoMonitor = WorkspaceUndoMonitor.getInstance();
-
-		// show Help button in JFace dialogs
-		TrayDialog.setDialogHelpAvailable(true);
-
-		Policy.setComparator(Collator.getInstance());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#preStartup()
-	 */
-	public void preStartup() {
-
-		// Suspend background jobs while we startup
-		Job.getJobManager().suspend();
-
-		// Register the build actions
-		IProgressService service = PlatformUI.getWorkbench()
-				.getProgressService();
-		ImageDescriptor newImage = IDEInternalWorkbenchImages
-				.getImageDescriptor(IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC);
-		service.registerIconForFamily(newImage,
-				ResourcesPlugin.FAMILY_MANUAL_BUILD);
-		service.registerIconForFamily(newImage,
-				ResourcesPlugin.FAMILY_AUTO_BUILD);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#postStartup()
-	 */
-	public void postStartup() {
-		try {
-			refreshFromLocal();
-			activateProxyService();
-			((Workbench) PlatformUI.getWorkbench()).registerService(
-					ISelectionConversionService.class,
-					new IDESelectionConversionService());
-
-			initializeSettingsChangeListener();
-			Display.getCurrent().addListener(SWT.Settings,
-					settingsChangeListener);
-		} finally {// Resume background jobs after we startup
-			Job.getJobManager().resume();
-		}
-	}
-
-	/**
-	 * Activate the proxy service by obtaining it.
-	 */
-	private void activateProxyService() {
-		Bundle bundle = Platform.getBundle("org.eclipse.ui.ide"); //$NON-NLS-1$
-		Object proxyService = null;
-		if (bundle != null) {
-			ServiceReference ref = bundle.getBundleContext().getServiceReference(IProxyService.class.getName());
-			if (ref != null)
-				proxyService = bundle.getBundleContext().getService(ref);
-		}
-		if (proxyService == null) {
-			IDEWorkbenchPlugin.log("Proxy service could not be found."); //$NON-NLS-1$
-		}	
-	}
-
-	/**
-	 * Initialize the listener for settings changes.
-	 */
-	private void initializeSettingsChangeListener() {
-		settingsChangeListener = new Listener() {
-
-			boolean currentHighContrast = Display.getCurrent()
-					.getHighContrast();
-
-			public void handleEvent(org.eclipse.swt.widgets.Event event) {
-				if (Display.getCurrent().getHighContrast() == currentHighContrast)
-					return;
-
-				currentHighContrast = !currentHighContrast;
-
-				// make sure they really want to do this
-				if (new MessageDialog(null,
-						IDEWorkbenchMessages.SystemSettingsChange_title, null,
-						IDEWorkbenchMessages.SystemSettingsChange_message,
-						MessageDialog.QUESTION, new String[] {
-								IDEWorkbenchMessages.SystemSettingsChange_yes,
-								IDEWorkbenchMessages.SystemSettingsChange_no },
-						1).open() == Window.OK) {
-					PlatformUI.getWorkbench().restart();
-				}
-			}
-		};
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#postShutdown
-	 */
-	public void postShutdown() {
-		if (activityHelper != null) {
-			activityHelper.shutdown();
-			activityHelper = null;
-		}
-		if (idleHelper != null) {
-			idleHelper.shutdown();
-			idleHelper = null;
-		}
-		if (workspaceUndoMonitor != null) {
-			workspaceUndoMonitor.shutdown();
-			workspaceUndoMonitor = null;
-		}
-		if (IDEWorkbenchPlugin.getPluginWorkspace() != null) {
-			disconnectFromWorkspace();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#preShutdown()
-	 */
-	public boolean preShutdown() {
-		Display.getCurrent().removeListener(SWT.Settings,
-				settingsChangeListener);
-		return super.preShutdown();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#createWorkbenchWindowAdvisor(org.eclipse.ui.application.IWorkbenchWindowConfigurer)
-	 */
-	public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
-			IWorkbenchWindowConfigurer configurer) {
-		return new IDEWorkbenchWindowAdvisor(this, configurer);
-	}
-
-	/**
-	 * Return true if the intro plugin is present and false otherwise.
-	 * 
-	 * @return boolean
-	 */
-	public boolean hasIntro() {
-		return getWorkbenchConfigurer().getWorkbench().getIntroManager()
-				.hasIntro();
-	}
-
-	private void refreshFromLocal() {
-		String[] commandLineArgs = Platform.getCommandLineArgs();
-		IPreferenceStore store = IDEWorkbenchPlugin.getDefault()
-				.getPreferenceStore();
-		boolean refresh = store
-				.getBoolean(IDEInternalPreferences.REFRESH_WORKSPACE_ON_STARTUP);
-		if (!refresh) {
-			return;
-		}
-
-		// Do not refresh if it was already done by core on startup.
-		for (int i = 0; i < commandLineArgs.length; i++) {
-			if (commandLineArgs[i].equalsIgnoreCase("-refresh")) { //$NON-NLS-1$
-				return;
-			}
-		}
-
-		final IContainer root = ResourcesPlugin.getWorkspace().getRoot();
-		Job job = new WorkspaceJob(IDEWorkbenchMessages.Workspace_refreshing) {
-			public IStatus runInWorkspace(IProgressMonitor monitor)
-					throws CoreException {
-				root.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-				return Status.OK_STATUS;
-			}
-		};
-		job.setRule(root);
-		job.schedule();
-	}
-
-	/**
-	 * Disconnect from the core workspace.
-	 */
-	private void disconnectFromWorkspace() {
-		// save the workspace
-		final MultiStatus status = new MultiStatus(
-				IDEWorkbenchPlugin.IDE_WORKBENCH, 1,
-				IDEWorkbenchMessages.ProblemSavingWorkbench, null);
-		IRunnableWithProgress runnable = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor) {
-				try {
-					status.merge(ResourcesPlugin.getWorkspace().save(true,
-							monitor));
-				} catch (CoreException e) {
-					status.merge(e.getStatus());
-				}
-			}
-		};
-		try {
-			new ProgressMonitorJobsDialog(null).run(true, false, runnable);
-		} catch (InvocationTargetException e) {
-			status
-					.merge(new Status(IStatus.ERROR,
-							IDEWorkbenchPlugin.IDE_WORKBENCH, 1,
-							IDEWorkbenchMessages.InternalError, e
-									.getTargetException()));
-		} catch (InterruptedException e) {
-			status.merge(new Status(IStatus.ERROR,
-					IDEWorkbenchPlugin.IDE_WORKBENCH, 1,
-					IDEWorkbenchMessages.InternalError, e));
-		}
-		ErrorDialog.openError(null,
-				IDEWorkbenchMessages.ProblemsSavingWorkspace, null, status,
-				IStatus.ERROR | IStatus.WARNING);
-		if (!status.isOK()) {
-			IDEWorkbenchPlugin.log(
-					IDEWorkbenchMessages.ProblemsSavingWorkspace, status);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#getDefaultPageInput
-	 */
-	public IAdaptable getDefaultPageInput() {
-		return ResourcesPlugin.getWorkspace().getRoot();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor
-	 */
-	public String getInitialWindowPerspectiveId() {
-		int index = PlatformUI.getWorkbench().getWorkbenchWindowCount() - 1;
-
-		String perspectiveId = null;
-		AboutInfo[] welcomeInfos = getWelcomePerspectiveInfos();
-		if (index >= 0 && welcomeInfos != null && index < welcomeInfos.length) {
-			perspectiveId = welcomeInfos[index].getWelcomePerspectiveId();
-		}
-		if (perspectiveId == null) {
-			perspectiveId = IDE.RESOURCE_PERSPECTIVE_ID;
-		}
-		return perspectiveId;
-	}
-
-	/**
-	 * Returns the map of versioned feature ids -> info object for all installed
-	 * features. The format of the versioned feature id (the key of the map) is
-	 * featureId + ":" + versionId.
-	 * 
-	 * @return map of versioned feature ids -> info object (key type:
-	 *         <code>String</code>, value type: <code>AboutInfo</code>)
-	 * @since 3.0
-	 */
-	private Map computeBundleGroupMap() {
-		// use tree map to get predicable order
-		Map ids = new TreeMap();
-
-		IBundleGroupProvider[] providers = Platform.getBundleGroupProviders();
-		for (int i = 0; i < providers.length; ++i) {
-			IBundleGroup[] groups = providers[i].getBundleGroups();
-			for (int j = 0; j < groups.length; ++j) {
-				IBundleGroup group = groups[j];
-				AboutInfo info = new AboutInfo(group);
-
-				String version = info.getVersionId();
-				version = version == null ? "0.0.0" //$NON-NLS-1$
-						: new Version(version).toString();
-				String versionedFeature = group.getIdentifier() + ":" + version; //$NON-NLS-1$
-
-				ids.put(versionedFeature, info);
-			}
-		}
-
-		return ids;
-	}
-
-	/**
-	 * Returns the ordered map of versioned feature ids -> AboutInfo that are
-	 * new for this session.
-	 * 
-	 * @return ordered map of versioned feature ids (key type:
-	 *         <code>String</code>) -> infos (value type:
-	 *         <code>AboutInfo</code>).
-	 */
-	public Map getNewlyAddedBundleGroups() {
-		if (newlyAddedBundleGroups == null) {
-			newlyAddedBundleGroups = createNewBundleGroupsMap();
-		}
-		return newlyAddedBundleGroups;
-	}
-
-	/**
-	 * Updates the old features setting and returns a map of new features.
-	 */
-	private Map createNewBundleGroupsMap() {
-		// retrieve list of installed bundle groups from last session
-		IDialogSettings settings = IDEWorkbenchPlugin.getDefault()
-				.getDialogSettings();
-		String[] previousFeaturesArray = settings.getArray(INSTALLED_FEATURES);
-
-		// get a map of currently installed bundle groups and store it for next
-		// session
-		Map bundleGroups = computeBundleGroupMap();
-		String[] currentFeaturesArray = new String[bundleGroups.size()];
-		bundleGroups.keySet().toArray(currentFeaturesArray);
-		settings.put(INSTALLED_FEATURES, currentFeaturesArray);
-
-		// remove the previously known from the current set
-		if (previousFeaturesArray != null) {
-			for (int i = 0; i < previousFeaturesArray.length; ++i) {
-				bundleGroups.remove(previousFeaturesArray[i]);
-			}
-		}
-
-		return bundleGroups;
-	}
-
-	/**
-	 * Declares all IDE-specific workbench images. This includes both "shared"
-	 * images (named in {@link IDE.SharedImages}) and internal images (named in
-	 * {@link org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages}).
-	 * 
-	 * @see IWorkbenchConfigurer#declareImage
-	 */
-	private void declareWorkbenchImages() {
-
-		final String ICONS_PATH = "$nl$/icons/full/";//$NON-NLS-1$
-		final String PATH_ELOCALTOOL = ICONS_PATH + "elcl16/"; // Enabled //$NON-NLS-1$
-
-		// toolbar
-		// icons.
-		final String PATH_DLOCALTOOL = ICONS_PATH + "dlcl16/"; // Disabled //$NON-NLS-1$
-		// //$NON-NLS-1$
-		// toolbar
-		// icons.
-		final String PATH_ETOOL = ICONS_PATH + "etool16/"; // Enabled toolbar //$NON-NLS-1$
-		// //$NON-NLS-1$
-		// icons.
-		final String PATH_DTOOL = ICONS_PATH + "dtool16/"; // Disabled toolbar //$NON-NLS-1$
-		// //$NON-NLS-1$
-		// icons.
-		final String PATH_OBJECT = ICONS_PATH + "obj16/"; // Model object //$NON-NLS-1$
-		// //$NON-NLS-1$
-		// icons
-		final String PATH_WIZBAN = ICONS_PATH + "wizban/"; // Wizard //$NON-NLS-1$
-		// //$NON-NLS-1$
-		// icons
-
-		Bundle ideBundle = Platform.getBundle(IDEWorkbenchPlugin.IDE_WORKBENCH);
-
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC, PATH_ETOOL
-						+ "build_exec.gif", false); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC_HOVER,
-				PATH_ETOOL + "build_exec.gif", false); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC_DISABLED,
-				PATH_DTOOL + "build_exec.gif", false); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC, PATH_ETOOL
-						+ "search_src.gif", false); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC_HOVER,
-				PATH_ETOOL + "search_src.gif", false); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC_DISABLED,
-				PATH_DTOOL + "search_src.gif", false); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_ETOOL_NEXT_NAV, PATH_ETOOL
-						+ "next_nav.gif", false); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_ETOOL_PREVIOUS_NAV, PATH_ETOOL
-						+ "prev_nav.gif", false); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_WIZBAN_NEWPRJ_WIZ, PATH_WIZBAN
-						+ "newprj_wiz.png", false); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_WIZBAN_NEWFOLDER_WIZ,
-				PATH_WIZBAN + "newfolder_wiz.png", false); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_WIZBAN_NEWFILE_WIZ, PATH_WIZBAN
-						+ "newfile_wiz.png", false); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_WIZBAN_IMPORTDIR_WIZ,
-				PATH_WIZBAN + "importdir_wiz.png", false); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_WIZBAN_IMPORTZIP_WIZ,
-				PATH_WIZBAN + "importzip_wiz.png", false); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_WIZBAN_EXPORTDIR_WIZ,
-				PATH_WIZBAN + "exportdir_wiz.png", false); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_WIZBAN_EXPORTZIP_WIZ,
-				PATH_WIZBAN + "exportzip_wiz.png", false); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_WIZBAN_RESOURCEWORKINGSET_WIZ,
-				PATH_WIZBAN + "workset_wiz.png", false); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_DLGBAN_SAVEAS_DLG, PATH_WIZBAN
-						+ "saveas_wiz.png", false); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_DLGBAN_QUICKFIX_DLG, PATH_WIZBAN
-						+ "quick_fix.png", false); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJ_PROJECT,
-				PATH_OBJECT + "prj_obj.gif", true); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED, PATH_OBJECT
-						+ "cprj_obj.gif", true); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OPEN_MARKER,
-				PATH_ELOCALTOOL + "gotoobj_tsk.gif", true); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_ELCL_QUICK_FIX_ENABLED,
-				PATH_ELOCALTOOL + "smartmode_co.gif", true); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_DLCL_QUICK_FIX_DISABLED,
-				PATH_DLOCALTOOL + "smartmode_co.gif", true); //$NON-NLS-1$
-
-		// task objects
-		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_HPRIO_TSK,
-		// PATH_OBJECT+"hprio_tsk.gif");
-		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_MPRIO_TSK,
-		// PATH_OBJECT+"mprio_tsk.gif");
-		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_LPRIO_TSK,
-		// PATH_OBJECT+"lprio_tsk.gif");
-
-		declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJS_TASK_TSK,
-				PATH_OBJECT + "taskmrk_tsk.gif", true); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJS_BKMRK_TSK,
-				PATH_OBJECT + "bkmrk_tsk.gif", true); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_OBJS_COMPLETE_TSK, PATH_OBJECT
-						+ "complete_tsk.gif", true); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_OBJS_INCOMPLETE_TSK, PATH_OBJECT
-						+ "incomplete_tsk.gif", true); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_OBJS_WELCOME_ITEM, PATH_OBJECT
-						+ "welcome_item.gif", true); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_OBJS_WELCOME_BANNER, PATH_OBJECT
-						+ "welcome_banner.gif", true); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_OBJS_ERROR_PATH, PATH_OBJECT
-						+ "error_tsk.gif", true); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_OBJS_WARNING_PATH, PATH_OBJECT
-						+ "warn_tsk.gif", true); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_OBJS_INFO_PATH, PATH_OBJECT
-						+ "info_tsk.gif", true); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_LCL_FLAT_LAYOUT, PATH_ELOCALTOOL
-						+ "flatLayout.gif", true); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_LCL_HIERARCHICAL_LAYOUT,
-				PATH_ELOCALTOOL + "hierarchicalLayout.gif", true); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEM_CATEGORY,
-				PATH_ETOOL + "problem_category.gif", true); //$NON-NLS-1$
-	
-		// synchronization indicator objects
-		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_WBET_STAT,
-		// PATH_OVERLAY+"wbet_stat.gif");
-		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_SBET_STAT,
-		// PATH_OVERLAY+"sbet_stat.gif");
-		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_CONFLICT_STAT,
-		// PATH_OVERLAY+"conflict_stat.gif");
-
-		// content locality indicator objects
-		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_NOTLOCAL_STAT,
-		// PATH_STAT+"notlocal_stat.gif");
-		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_LOCAL_STAT,
-		// PATH_STAT+"local_stat.gif");
-		// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_FILLLOCAL_STAT,
-		// PATH_STAT+"filllocal_stat.gif");
-	}
-
-	/**
-	 * Declares an IDE-specific workbench image.
-	 * 
-	 * @param symbolicName
-	 *            the symbolic name of the image
-	 * @param path
-	 *            the path of the image file; this path is relative to the base
-	 *            of the IDE plug-in
-	 * @param shared
-	 *            <code>true</code> if this is a shared image, and
-	 *            <code>false</code> if this is not a shared image
-	 * @see IWorkbenchConfigurer#declareImage
-	 */
-	private void declareWorkbenchImage(Bundle ideBundle, String symbolicName,
-			String path, boolean shared) {
-		URL url = FileLocator.find(ideBundle, new Path(path), null);
-		ImageDescriptor desc = ImageDescriptor.createFromURL(url);
-		getWorkbenchConfigurer().declareImage(symbolicName, desc, shared);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#getMainPreferencePageId
-	 */
-	public String getMainPreferencePageId() {
-		// indicate that we want the Workench preference page to be prominent
-		return WORKBENCH_PREFERENCE_CATEGORY_ID;
-	}
-
-	/**
-	 * @return the workspace location string, or <code>null</code> if the
-	 *         location is not being shown
-	 */
-	public String getWorkspaceLocation() {
-		return workspaceLocation;
-	}
-
-	/**
-	 * @return the welcome perspective infos, or <code>null</code> if none or
-	 *         if they should be ignored due to the new intro being present
-	 */
-	public AboutInfo[] getWelcomePerspectiveInfos() {
-		if (welcomePerspectiveInfos == null) {
-			// support old welcome perspectives if intro plugin is not present
-			if (!hasIntro()) {
-				Map m = getNewlyAddedBundleGroups();
-				ArrayList list = new ArrayList(m.size());
-				for (Iterator i = m.values().iterator(); i.hasNext();) {
-					AboutInfo info = (AboutInfo) i.next();
-					if (info != null && info.getWelcomePerspectiveId() != null
-							&& info.getWelcomePageURL() != null) {
-						list.add(info);
-					}
-				}
-				welcomePerspectiveInfos = new AboutInfo[list.size()];
-				list.toArray(welcomePerspectiveInfos);
-			}
-		}
-		return welcomePerspectiveInfos;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#getWorkbenchErrorHandler()
-	 */
-	public synchronized AbstractStatusHandler getWorkbenchErrorHandler() {
-		if (ideWorkbenchErrorHandler == null) {
-			ideWorkbenchErrorHandler = new IDEWorkbenchErrorHandler(
-					getWorkbenchConfigurer());
-		}
-		return ideWorkbenchErrorHandler;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchWindowAdvisor.java b/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchWindowAdvisor.java
deleted file mode 100644
index e5eb22b..0000000
--- a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchWindowAdvisor.java
+++ /dev/null
@@ -1,684 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.application;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProduct;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.graphics.Color;
-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.Label;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IPageListener;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartConstants;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PerspectiveAdapter;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-import org.eclipse.ui.internal.ide.AboutInfo;
-import org.eclipse.ui.internal.ide.EditorAreaDropAdapter;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.WorkbenchActionBuilder;
-import org.eclipse.ui.internal.ide.dialogs.WelcomeEditorInput;
-import org.eclipse.ui.part.EditorInputTransfer;
-import org.eclipse.ui.part.MarkerTransfer;
-import org.eclipse.ui.part.ResourceTransfer;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.update.configurator.ConfiguratorUtils;
-import org.eclipse.update.configurator.IPlatformConfiguration;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleException;
-
-/**
- * Window-level advisor for the IDE.
- */
-public class IDEWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
-
-	private static final String WELCOME_EDITOR_ID = "org.eclipse.ui.internal.ide.dialogs.WelcomeEditor"; //$NON-NLS-1$
-
-	private IDEWorkbenchAdvisor wbAdvisor;
-	private boolean editorsAndIntrosOpened = false;
-	private IEditorPart lastActiveEditor = null;
-	private IPerspectiveDescriptor lastPerspective = null;
-
-	private IWorkbenchPage lastActivePage;
-	private String lastEditorTitle = ""; //$NON-NLS-1$
-
-	private IPropertyListener editorPropertyListener = new IPropertyListener() {
-		public void propertyChanged(Object source, int propId) {
-			if (propId == IWorkbenchPartConstants.PROP_TITLE) {
-				if (lastActiveEditor != null) {
-					String newTitle = lastActiveEditor.getTitle();
-					if (!lastEditorTitle.equals(newTitle)) {
-						recomputeTitle();
-					}
-				}
-			}
-		}
-	};
-
-	private IAdaptable lastInput;
-
-	private IWorkbenchAction openPerspectiveAction;
-
-	/**
-	 * Crates a new IDE workbench window advisor.
-	 * 
-	 * @param wbAdvisor
-	 *            the workbench advisor
-	 * @param configurer
-	 *            the window configurer
-	 */
-	public IDEWorkbenchWindowAdvisor(IDEWorkbenchAdvisor wbAdvisor,
-			IWorkbenchWindowConfigurer configurer) {
-		super(configurer);
-		this.wbAdvisor = wbAdvisor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchWindowAdvisor#createActionBarAdvisor(org.eclipse.ui.application.IActionBarConfigurer)
-	 */
-	public ActionBarAdvisor createActionBarAdvisor(
-			IActionBarConfigurer configurer) {
-		return new WorkbenchActionBuilder(configurer);
-	}
-
-	/**
-	 * Returns the workbench.
-	 * 
-	 * @return the workbench
-	 */
-	private IWorkbench getWorkbench() {
-		return getWindowConfigurer().getWorkbenchConfigurer().getWorkbench();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#preWindowShellClose
-	 */
-	public boolean preWindowShellClose() {
-		if (getWorkbench().getWorkbenchWindowCount() > 1) {
-			return true;
-		}
-		// the user has asked to close the last window, while will cause the
-		// workbench to close in due course - prompt the user for confirmation
-		IPreferenceStore store = IDEWorkbenchPlugin.getDefault()
-				.getPreferenceStore();
-		boolean promptOnExit = store
-				.getBoolean(IDEInternalPreferences.EXIT_PROMPT_ON_CLOSE_LAST_WINDOW);
-
-		if (promptOnExit) {
-			String message;
-
-			String productName = null;
-			IProduct product = Platform.getProduct();
-			if (product != null) {
-				productName = product.getName();
-			}
-			if (productName == null) {
-				message = IDEWorkbenchMessages.PromptOnExitDialog_message0;
-			} else {
-				message = NLS.bind(
-						IDEWorkbenchMessages.PromptOnExitDialog_message1,
-						productName);
-			}
-
-			MessageDialogWithToggle dlg = MessageDialogWithToggle
-					.openOkCancelConfirm(getWindowConfigurer().getWindow()
-							.getShell(),
-							IDEWorkbenchMessages.PromptOnExitDialog_shellTitle,
-							message,
-							IDEWorkbenchMessages.PromptOnExitDialog_choice,
-							false, null, null);
-			if (dlg.getReturnCode() != IDialogConstants.OK_ID) {
-				return false;
-			}
-			if (dlg.getToggleState()) {
-				store
-						.setValue(
-								IDEInternalPreferences.EXIT_PROMPT_ON_CLOSE_LAST_WINDOW,
-								false);
-				IDEWorkbenchPlugin.getDefault().savePluginPreferences();
-			}
-		}
-
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#preWindowOpen
-	 */
-	public void preWindowOpen() {
-		IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-
-		// show the shortcut bar and progress indicator, which are hidden by
-		// default
-		configurer.setShowPerspectiveBar(true);
-		configurer.setShowFastViewBars(true);
-		configurer.setShowProgressIndicator(true);
-
-		// add the drag and drop support for the editor area
-		configurer.addEditorAreaTransfer(EditorInputTransfer.getInstance());
-		configurer.addEditorAreaTransfer(ResourceTransfer.getInstance());
-		configurer.addEditorAreaTransfer(FileTransfer.getInstance());
-		configurer.addEditorAreaTransfer(MarkerTransfer.getInstance());
-		configurer.configureEditorAreaDropListener(new EditorAreaDropAdapter(
-				configurer.getWindow()));
-
-		hookTitleUpdateListeners(configurer);
-	}
-
-	/**
-	 * Hooks the listeners needed on the window
-	 * 
-	 * @param configurer
-	 */
-	private void hookTitleUpdateListeners(IWorkbenchWindowConfigurer configurer) {
-		// hook up the listeners to update the window title
-		configurer.getWindow().addPageListener(new IPageListener() {
-			public void pageActivated(IWorkbenchPage page) {
-				updateTitle(false);
-			}
-
-			public void pageClosed(IWorkbenchPage page) {
-				updateTitle(false);
-			}
-
-			public void pageOpened(IWorkbenchPage page) {
-				// do nothing
-			}
-		});
-		configurer.getWindow().addPerspectiveListener(new PerspectiveAdapter() {
-			public void perspectiveActivated(IWorkbenchPage page,
-					IPerspectiveDescriptor perspective) {
-				updateTitle(false);
-			}
-
-			public void perspectiveSavedAs(IWorkbenchPage page,
-					IPerspectiveDescriptor oldPerspective,
-					IPerspectiveDescriptor newPerspective) {
-				updateTitle(false);
-			}
-
-			public void perspectiveDeactivated(IWorkbenchPage page,
-					IPerspectiveDescriptor perspective) {
-				updateTitle(false);
-			}
-		});
-		configurer.getWindow().getPartService().addPartListener(
-				new IPartListener2() {
-					public void partActivated(IWorkbenchPartReference ref) {
-						if (ref instanceof IEditorReference) {
-							updateTitle(false);
-						}
-					}
-
-					public void partBroughtToTop(IWorkbenchPartReference ref) {
-						if (ref instanceof IEditorReference) {
-							updateTitle(false);
-						}
-					}
-
-					public void partClosed(IWorkbenchPartReference ref) {
-						updateTitle(false);
-					}
-
-					public void partDeactivated(IWorkbenchPartReference ref) {
-						// do nothing
-					}
-
-					public void partOpened(IWorkbenchPartReference ref) {
-						// do nothing
-					}
-
-					public void partHidden(IWorkbenchPartReference ref) {
-						if (ref.getPart(false) == lastActiveEditor
-								&& lastActiveEditor != null) {
-							updateTitle(true);
-						}
-					}
-
-					public void partVisible(IWorkbenchPartReference ref) {
-						if (ref.getPart(false) == lastActiveEditor
-								&& lastActiveEditor != null) {
-							updateTitle(false);
-						}
-					}
-
-					public void partInputChanged(IWorkbenchPartReference ref) {
-						// do nothing
-					}
-				});
-	}
-
-	private String computeTitle() {
-		IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-		IWorkbenchPage currentPage = configurer.getWindow().getActivePage();
-		IEditorPart activeEditor = null;
-		if (currentPage != null) {
-			activeEditor = lastActiveEditor;
-		}
-
-		String title = null;
-		IProduct product = Platform.getProduct();
-		if (product != null) {
-			title = product.getName();
-		}
-		if (title == null) {
-			title = ""; //$NON-NLS-1$
-		}
-
-		if (currentPage != null) {
-			if (activeEditor != null) {
-				lastEditorTitle = activeEditor.getTitleToolTip();
-				title = NLS.bind(
-						IDEWorkbenchMessages.WorkbenchWindow_shellTitle,
-						lastEditorTitle, title);
-			}
-			IPerspectiveDescriptor persp = currentPage.getPerspective();
-			String label = ""; //$NON-NLS-1$
-			if (persp != null) {
-				label = persp.getLabel();
-			}
-			IAdaptable input = currentPage.getInput();
-			if (input != null && !input.equals(wbAdvisor.getDefaultPageInput())) {
-				label = currentPage.getLabel();
-			}
-			if (label != null && !label.equals("")) { //$NON-NLS-1$ 
-				title = NLS.bind(
-						IDEWorkbenchMessages.WorkbenchWindow_shellTitle, label,
-						title);
-			}
-		}
-
-		String workspaceLocation = wbAdvisor.getWorkspaceLocation();
-		if (workspaceLocation != null) {
-			title = NLS.bind(IDEWorkbenchMessages.WorkbenchWindow_shellTitle,
-					title, workspaceLocation);
-		}
-
-		return title;
-	}
-
-	private void recomputeTitle() {
-		IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-		String oldTitle = configurer.getTitle();
-		String newTitle = computeTitle();
-		if (!newTitle.equals(oldTitle)) {
-			configurer.setTitle(newTitle);
-		}
-	}
-
-	/**
-	 * Updates the window title. Format will be: [pageInput -]
-	 * [currentPerspective -] [editorInput -] [workspaceLocation -] productName
-	 * @param editorHidden TODO
-	 */
-	private void updateTitle(boolean editorHidden) {
-		IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-		IWorkbenchWindow window = configurer.getWindow();
-		IEditorPart activeEditor = null;
-		IWorkbenchPage currentPage = window.getActivePage();
-		IPerspectiveDescriptor persp = null;
-		IAdaptable input = null;
-
-		if (currentPage != null) {
-			activeEditor = currentPage.getActiveEditor();
-			persp = currentPage.getPerspective();
-			input = currentPage.getInput();
-		}
-		
-		if (editorHidden) {
-			activeEditor = null;
-		}
-
-		// Nothing to do if the editor hasn't changed
-		if (activeEditor == lastActiveEditor && currentPage == lastActivePage
-				&& persp == lastPerspective && input == lastInput) {
-			return;
-		}
-
-		if (lastActiveEditor != null) {
-			lastActiveEditor.removePropertyListener(editorPropertyListener);
-		}
-
-		lastActiveEditor = activeEditor;
-		lastActivePage = currentPage;
-		lastPerspective = persp;
-		lastInput = input;
-
-		if (activeEditor != null) {
-			activeEditor.addPropertyListener(editorPropertyListener);
-		}
-
-		recomputeTitle();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#postWindowRestore
-	 */
-	public void postWindowRestore() throws WorkbenchException {
-		IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-		IWorkbenchWindow window = configurer.getWindow();
-
-		int index = getWorkbench().getWorkbenchWindowCount() - 1;
-
-		AboutInfo[] welcomePerspectiveInfos = wbAdvisor
-				.getWelcomePerspectiveInfos();
-		if (index >= 0 && welcomePerspectiveInfos != null
-				&& index < welcomePerspectiveInfos.length) {
-			// find a page that exist in the window
-			IWorkbenchPage page = window.getActivePage();
-			if (page == null) {
-				IWorkbenchPage[] pages = window.getPages();
-				if (pages != null && pages.length > 0) {
-					page = pages[0];
-				}
-			}
-
-			// if the window does not contain a page, create one
-			String perspectiveId = welcomePerspectiveInfos[index]
-					.getWelcomePerspectiveId();
-			if (page == null) {
-				IAdaptable root = wbAdvisor.getDefaultPageInput();
-				page = window.openPage(perspectiveId, root);
-			} else {
-				IPerspectiveRegistry reg = getWorkbench()
-						.getPerspectiveRegistry();
-				IPerspectiveDescriptor desc = reg
-						.findPerspectiveWithId(perspectiveId);
-				if (desc != null) {
-					page.setPerspective(desc);
-				}
-			}
-
-			// set the active page and open the welcome editor
-			window.setActivePage(page);
-			page.openEditor(new WelcomeEditorInput(
-					welcomePerspectiveInfos[index]), WELCOME_EDITOR_ID, true);
-		}
-	}
-
-	/**
-	 * Tries to open the intro, if one exists and otherwise will open the legacy
-	 * Welcome pages.
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchWindowAdvisor#openIntro()
-	 */
-	public void openIntro() {
-		if (editorsAndIntrosOpened) {
-			return;
-		}
-
-		editorsAndIntrosOpened = true;
-
-		// don't try to open the welcome editors if there is an intro
-		if (wbAdvisor.hasIntro()) {
-			super.openIntro();
-		} else {
-			openWelcomeEditors(getWindowConfigurer().getWindow());
-			// save any preferences changes caused by the above actions
-			IDEWorkbenchPlugin.getDefault().savePluginPreferences();
-		}
-	}
-
-	/*
-	 * Open the welcome editor for the primary feature and for any newly
-	 * installed features.
-	 */
-	private void openWelcomeEditors(IWorkbenchWindow window) {
-		if (IDEWorkbenchPlugin.getDefault().getPreferenceStore().getBoolean(
-				IDEInternalPreferences.WELCOME_DIALOG)) {
-			// show the welcome page for the product the first time the
-			// workbench opens
-			IProduct product = Platform.getProduct();
-			if (product == null) {
-				return;
-			}
-
-			AboutInfo productInfo = new AboutInfo(product);
-			URL url = productInfo.getWelcomePageURL();
-			if (url == null) {
-				return;
-			}
-
-			IDEWorkbenchPlugin.getDefault().getPreferenceStore().setValue(
-					IDEInternalPreferences.WELCOME_DIALOG, false);
-			openWelcomeEditor(window, new WelcomeEditorInput(productInfo), null);
-		} else {
-			// Show the welcome page for any newly installed features
-			List welcomeFeatures = new ArrayList();
-			for (Iterator it = wbAdvisor.getNewlyAddedBundleGroups().entrySet()
-					.iterator(); it.hasNext();) {
-				Map.Entry entry = (Map.Entry) it.next();
-				String versionedId = (String) entry.getKey();
-				String featureId = versionedId.substring(0, versionedId
-						.indexOf(':'));
-				AboutInfo info = (AboutInfo) entry.getValue();
-
-				if (info != null && info.getWelcomePageURL() != null) {
-					welcomeFeatures.add(info);
-					// activate the feature plug-in so it can run some install
-					// code
-					IPlatformConfiguration platformConfiguration = ConfiguratorUtils
-							.getCurrentPlatformConfiguration();
-					IPlatformConfiguration.IFeatureEntry feature = platformConfiguration
-							.findConfiguredFeatureEntry(featureId);
-					if (feature != null) {
-						String pi = feature.getFeaturePluginIdentifier();
-						if (pi != null) {
-							// Start the bundle if there is one
-							Bundle bundle = Platform.getBundle(pi);
-							if (bundle != null) {
-								try {
-									bundle.start(Bundle.START_TRANSIENT);
-								} catch (BundleException exception) {
-									StatusManager
-											.getManager()
-											.handle(
-													new Status(
-															IStatus.ERROR,
-															IDEApplication.PLUGIN_ID,
-															"Failed to load feature", exception));//$NON-NLS-1$
-								}
-							}
-						}
-					}
-				}
-			}
-
-			int wCount = getWorkbench().getWorkbenchWindowCount();
-			for (int i = 0; i < welcomeFeatures.size(); i++) {
-				AboutInfo newInfo = (AboutInfo) welcomeFeatures.get(i);
-				String id = newInfo.getWelcomePerspectiveId();
-				// Other editors were already opened in postWindowRestore(..)
-				if (id == null || i >= wCount) {
-					openWelcomeEditor(window, new WelcomeEditorInput(newInfo),
-							id);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Open a welcome editor for the given input
-	 */
-	private void openWelcomeEditor(IWorkbenchWindow window,
-			WelcomeEditorInput input, String perspectiveId) {
-		if (getWorkbench().getWorkbenchWindowCount() == 0) {
-			// Something is wrong, there should be at least
-			// one workbench window open by now.
-			return;
-		}
-
-		IWorkbenchWindow win = window;
-		if (perspectiveId != null) {
-			try {
-				win = getWorkbench().openWorkbenchWindow(perspectiveId,
-						wbAdvisor.getDefaultPageInput());
-				if (win == null) {
-					win = window;
-				}
-			} catch (WorkbenchException e) {
-				IDEWorkbenchPlugin
-						.log(
-								"Error opening window with welcome perspective.", e.getStatus()); //$NON-NLS-1$
-				return;
-			}
-		}
-
-		if (win == null) {
-			win = getWorkbench().getWorkbenchWindows()[0];
-		}
-
-		IWorkbenchPage page = win.getActivePage();
-		String id = perspectiveId;
-		if (id == null) {
-			id = getWorkbench().getPerspectiveRegistry()
-					.getDefaultPerspective();
-		}
-
-		if (page == null) {
-			try {
-				page = win.openPage(id, wbAdvisor.getDefaultPageInput());
-			} catch (WorkbenchException e) {
-				ErrorDialog.openError(win.getShell(),
-						IDEWorkbenchMessages.Problems_Opening_Page, e
-								.getMessage(), e.getStatus());
-			}
-		}
-		if (page == null) {
-			return;
-		}
-
-		if (page.getPerspective() == null) {
-			try {
-				page = getWorkbench().showPerspective(id, win);
-			} catch (WorkbenchException e) {
-				ErrorDialog
-						.openError(
-								win.getShell(),
-								IDEWorkbenchMessages.Workbench_openEditorErrorDialogTitle,
-								IDEWorkbenchMessages.Workbench_openEditorErrorDialogMessage,
-								e.getStatus());
-				return;
-			}
-		}
-
-		page.setEditorAreaVisible(true);
-
-		// see if we already have an editor
-		IEditorPart editor = page.findEditor(input);
-		if (editor != null) {
-			page.activate(editor);
-			return;
-		}
-
-		try {
-			page.openEditor(input, WELCOME_EDITOR_ID);
-		} catch (PartInitException e) {
-			ErrorDialog
-					.openError(
-							win.getShell(),
-							IDEWorkbenchMessages.Workbench_openEditorErrorDialogTitle,
-							IDEWorkbenchMessages.Workbench_openEditorErrorDialogMessage,
-							e.getStatus());
-		}
-		return;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#createEmptyWindowContents(org.eclipse.ui.application.IWorkbenchWindowConfigurer,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public Control createEmptyWindowContents(Composite parent) {
-		final IWorkbenchWindow window = getWindowConfigurer().getWindow();
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout(2, false));
-		Display display = composite.getDisplay();
-		Color bgCol = display
-				.getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND);
-		composite.setBackground(bgCol);
-		Label label = new Label(composite, SWT.WRAP);
-		label.setForeground(display
-				.getSystemColor(SWT.COLOR_TITLE_INACTIVE_FOREGROUND));
-		label.setBackground(bgCol);
-		label.setFont(JFaceResources.getFontRegistry().getBold(
-				JFaceResources.DEFAULT_FONT));
-		String msg = IDEWorkbenchMessages.IDEWorkbenchAdvisor_noPerspective;
-		label.setText(msg);
-		ToolBarManager toolBarManager = new ToolBarManager();
-		// TODO: should obtain the open perspective action from ActionFactory
-		openPerspectiveAction = ActionFactory.OPEN_PERSPECTIVE_DIALOG
-				.create(window);
-		toolBarManager.add(openPerspectiveAction);
-		ToolBar toolBar = toolBarManager.createControl(composite);
-		toolBar.setBackground(bgCol);
-		return composite;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.application.WorkbenchWindowAdvisor#dispose()
-	 */
-	public void dispose() {
-		if (openPerspectiveAction!=null) {
-			openPerspectiveAction.dispose();
-			openPerspectiveAction = null;
-		}
-		super.dispose();
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/ResourcePerspective.java b/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/ResourcePerspective.java
deleted file mode 100644
index 237618b..0000000
--- a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/ResourcePerspective.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Remy Chi Jian Suen <remy.suen@gmail.com>
- *     		- Bug 44162 [Wizards]  Define constants for wizard ids of new.file, new.folder, and new.project
- *     Remy Chi Jian Suen - Bug 208804 [CommonNavigator] change "Navigator" view perspective links
-  *******************************************************************************/
-package org.eclipse.ui.internal.ide.application;
-
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-import org.eclipse.ui.navigator.resources.ProjectExplorer;
-import org.eclipse.ui.wizards.newresource.BasicNewFileResourceWizard;
-import org.eclipse.ui.wizards.newresource.BasicNewFolderResourceWizard;
-
-/**
- */
-public class ResourcePerspective implements IPerspectiveFactory {
-	
-    /**
-     * Constructs a new Default layout engine.
-     */
-    public ResourcePerspective() {
-        super();
-    }
-
-    /**
-     * Defines the initial layout for a perspective.  
-     *
-     * Implementors of this method may add additional views to a
-     * perspective.  The perspective already contains an editor folder
-     * with <code>ID = ILayoutFactory.ID_EDITORS</code>.  Add additional views
-     * to the perspective in reference to the editor folder.
-     *
-     * This method is only called when a new perspective is created.  If
-     * an old perspective is restored from a persistence file then
-     * this method is not called.
-     *
-     * @param layout the factory used to add views to the perspective
-     */
-    public void createInitialLayout(IPageLayout layout) {
-        defineActions(layout);
-        defineLayout(layout);
-    }
-
-    /**
-     * Defines the initial actions for a page.  
-     * @param layout The layout we are filling
-     */
-    public void defineActions(IPageLayout layout) {
-        // Add "new wizards".
-        layout.addNewWizardShortcut(BasicNewFolderResourceWizard.WIZARD_ID);
-        layout.addNewWizardShortcut(BasicNewFileResourceWizard.WIZARD_ID);
-
-        // Add "show views".
-        layout.addShowViewShortcut(ProjectExplorer.VIEW_ID);
-        layout.addShowViewShortcut(IPageLayout.ID_BOOKMARKS);
-        layout.addShowViewShortcut(IPageLayout.ID_OUTLINE);
-        layout.addShowViewShortcut(IPageLayout.ID_PROP_SHEET);
-        layout.addShowViewShortcut(IPageLayout.ID_PROBLEM_VIEW);
-        layout.addShowViewShortcut(IPageLayout.ID_PROGRESS_VIEW);
-        layout.addShowViewShortcut(IPageLayout.ID_TASK_LIST);
-
-        layout.addActionSet(IPageLayout.ID_NAVIGATE_ACTION_SET);
-    }
-
-    /**
-     * Defines the initial layout for a page.  
-     * @param layout The layout we are filling
-     */
-    public void defineLayout(IPageLayout layout) {
-        // Editors are placed for free.
-        String editorArea = layout.getEditorArea();
-
-        // Top left.
-        IFolderLayout topLeft = layout.createFolder(
-                "topLeft", IPageLayout.LEFT, (float) 0.26, editorArea);//$NON-NLS-1$
-        topLeft.addView(ProjectExplorer.VIEW_ID);
-        topLeft.addPlaceholder(IPageLayout.ID_BOOKMARKS);
-
-        // Add a placeholder for the old navigator to maintain compatibility
-        topLeft.addPlaceholder("org.eclipse.ui.views.ResourceNavigator"); //$NON-NLS-1$
-
-        // Bottom left.
-        IFolderLayout bottomLeft = layout.createFolder(
-                "bottomLeft", IPageLayout.BOTTOM, (float) 0.50,//$NON-NLS-1$
-                "topLeft");//$NON-NLS-1$
-        bottomLeft.addView(IPageLayout.ID_OUTLINE);
-
-        // Bottom right.
-		IFolderLayout bottomRight = layout.createFolder(
-                "bottomRight", IPageLayout.BOTTOM, (float) 0.66,//$NON-NLS-1$
-                editorArea);
-		
-		bottomRight.addView(IPageLayout.ID_TASK_LIST);
-		
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/dialogs/IDEStartupPreferencePage.java b/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/dialogs/IDEStartupPreferencePage.java
deleted file mode 100644
index 949e392..0000000
--- a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/dialogs/IDEStartupPreferencePage.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.application.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-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.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.internal.dialogs.StartupPreferencePage;
-import org.eclipse.ui.internal.ide.ChooseWorkspaceData;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * Extends the Startup and Shutdown preference page with IDE-specific settings.
- * 
- * Note: want IDE settings to appear in main Workbench preference page (via subclassing),
- *   however the superclass, StartupPreferencePage, is internal
- * @since 3.0
- */
-public class IDEStartupPreferencePage extends StartupPreferencePage implements
-        IWorkbenchPreferencePage {
-
-    private Button refreshButton;
-
-    private Button launchPromptButton;
-
-    private Button exitPromptButton;
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.preference.PreferencePage
-     */
-    protected Control createContents(Composite parent) {
-
-    	PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
-				IWorkbenchHelpContextIds.STARTUP_PREFERENCE_PAGE);
-
-        Composite composite = createComposite(parent);
-
-        createLaunchPromptPref(composite);
-        createRefreshWorkspaceOnStartupPref(composite);
-        createExitPromptPref(composite);
-
-        Label space = new Label(composite,SWT.NONE);
-		space.setLayoutData(new GridData());
-        
-        createEarlyStartupSelection(composite);
-
-        return composite;
-    }
-
-    /**
-     * The default button has been pressed.
-     */
-    protected void performDefaults() {
-        IPreferenceStore store = getIDEPreferenceStore();
-
-        launchPromptButton.setSelection(true);
-
-        refreshButton
-                .setSelection(store
-                        .getDefaultBoolean(IDEInternalPreferences.REFRESH_WORKSPACE_ON_STARTUP));
-        exitPromptButton
-                .setSelection(store
-                        .getDefaultBoolean(IDEInternalPreferences.EXIT_PROMPT_ON_CLOSE_LAST_WINDOW));
-
-        super.performDefaults();
-    }
-
-    /**
-     * The user has pressed Ok. Store/apply this page's values appropriately.
-     */
-    public boolean performOk() {
-        IPreferenceStore store = getIDEPreferenceStore();
-
-        // store the refresh workspace on startup setting
-        store.setValue(IDEInternalPreferences.REFRESH_WORKSPACE_ON_STARTUP,
-                refreshButton.getSelection());
-
-        // TODO: This should get the value from the configuration preference
-        //       area, but dj said we shouldn't use it yet; some final details are
-        //       being worked out. Hopefully it will be available soon, at which time
-        //       the entire recentWorkspaces.xml file can be removed. But until then,
-        //       this preference reads/writes the file each time.
-        ChooseWorkspaceData.setShowDialogValue(launchPromptButton
-                .getSelection());
-
-        // store the exit prompt on last window close setting
-        store.setValue(IDEInternalPreferences.EXIT_PROMPT_ON_CLOSE_LAST_WINDOW,
-                exitPromptButton.getSelection());
-
-        IDEWorkbenchPlugin.getDefault().savePluginPreferences();
-
-        return super.performOk();
-    }
-
-    protected void createRefreshWorkspaceOnStartupPref(Composite composite) {
-        refreshButton = new Button(composite, SWT.CHECK);
-        refreshButton.setText(IDEWorkbenchMessages.StartupPreferencePage_refreshButton);
-        refreshButton.setFont(composite.getFont());
-        refreshButton.setSelection(getIDEPreferenceStore().getBoolean(
-                IDEInternalPreferences.REFRESH_WORKSPACE_ON_STARTUP));
-    }
-
-    protected void createLaunchPromptPref(Composite composite) {
-        launchPromptButton = new Button(composite, SWT.CHECK);
-        launchPromptButton.setText(IDEWorkbenchMessages.StartupPreferencePage_launchPromptButton);
-        launchPromptButton.setFont(composite.getFont());
-
-        // TODO: This should get the value from the configuration preference
-        //       area, but dj said we shouldn't use it yet; some final details are
-        //       being worked out. Hopefully it will be available soon, at which time
-        //       the entire recentWorkspaces.xml file can be removed. But until then,
-        //       this preference reads/writes the file each time.
-        launchPromptButton.setSelection(ChooseWorkspaceData
-                .getShowDialogValue());
-    }
-
-    protected void createExitPromptPref(Composite composite) {
-        exitPromptButton = new Button(composite, SWT.CHECK);
-        exitPromptButton.setText(IDEWorkbenchMessages.StartupPreferencePage_exitPromptButton);
-        exitPromptButton.setFont(composite.getFont());
-        exitPromptButton.setSelection(getIDEPreferenceStore().getBoolean(
-                IDEInternalPreferences.EXIT_PROMPT_ON_CLOSE_LAST_WINDOW));
-    }
-
-    /**
-     * Returns the IDE preference store.
-     */
-    protected IPreferenceStore getIDEPreferenceStore() {
-        return IDEWorkbenchPlugin.getDefault().getPreferenceStore();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/package.html b/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/package.html
deleted file mode 100644
index 052a46e..0000000
--- a/bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/package.html
+++ /dev/null
@@ -1,19 +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">
-<title>Package-level Javadoc</title>
-</head>
-
-<body>
-
-Internal implementation of the IDE- application of the Eclipse Platform User
-Interface.
-<h2>Package Specification</h2>
-This package does not contain any API.
-
-</body>
-
-</html>
diff --git a/bundles/org.eclipse.ui.ide/.classpath b/bundles/org.eclipse.ui.ide/.classpath
deleted file mode 100644
index 69bb1c8..0000000
--- a/bundles/org.eclipse.ui.ide/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="extensions"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.ui.ide/.cvsignore b/bundles/org.eclipse.ui.ide/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/bundles/org.eclipse.ui.ide/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.ide/.options b/bundles/org.eclipse.ui.ide/.options
deleted file mode 100644
index 8b6c2e1..0000000
--- a/bundles/org.eclipse.ui.ide/.options
+++ /dev/null
@@ -1,16 +0,0 @@
-# Debugging options for the org.eclipse.ui.ide plugin.
-
-# Turn on debugging for the org.eclipse.ui plugin.
-org.eclipse.ui.ide/debug=false
-
-# Show a dialog with details button when an internal error occur.
-org.eclipse.ui.ide/debug/internalerror/openDialog=false
-
-# Verbose information when IDE performs explicit garbage collection
-org.eclipse.ui.ide/debug/gc=false
-
-# Print debug information when workspace undo monitor purges the undo history
-org.eclipse.ui.ide/debug/undomonitor=false
-
-# Print debug information for core exceptions when accessing markers
-org.eclipse.ui.ide/debug/markers=false
diff --git a/bundles/org.eclipse.ui.ide/.project b/bundles/org.eclipse.ui.ide/.project
deleted file mode 100644
index ea0d478..0000000
--- a/bundles/org.eclipse.ui.ide/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.ide</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.ide/.settings/.api_filters b/bundles/org.eclipse.ui.ide/.settings/.api_filters
deleted file mode 100644
index a0962a7..0000000
--- a/bundles/org.eclipse.ui.ide/.settings/.api_filters
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<component id="org.eclipse.ui.ide" version="2">
-    <resource path="extensions/org/eclipse/ui/actions/RefreshAction.java" type="org.eclipse.ui.actions.RefreshAction">
-        <filter id="438431863">
-            <message_arguments>
-                <message_argument value="org.eclipse.ui.actions.RefreshAction"/>
-                <message_argument value="refreshAll()"/>
-            </message_arguments>
-        </filter>
-    </resource>
-</component>
diff --git a/bundles/org.eclipse.ui.ide/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.ui.ide/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index d0aa9ae..0000000
--- a/bundles/org.eclipse.ui.ide/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,71 +0,0 @@
-#Tue Sep 11 09:40:26 EDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.ui.ide/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.ui.ide/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 2ffea3c..0000000
--- a/bundles/org.eclipse.ui.ide/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Thu Oct 25 08:43:41 EDT 2007
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.4\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template></templates>
diff --git a/bundles/org.eclipse.ui.ide/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.ui.ide/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 498f3ae..0000000
--- a/bundles/org.eclipse.ui.ide/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Nov 16 14:11:37 EST 2004
-compilers.p.unused-element-or-attribute=1
-compilers.p.unresolved-ex-points=0
-compilers.p.deprecated=0
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unknown-class=1
-compilers.p.unknown-attribute=0
-compilers.p.no-required-att=0
-eclipse.preferences.version=1
-compilers.p.unresolved-import=0
-compilers.p.not-externalized-att=0
-compilers.p.illegal-att-value=0
-compilers.use-project=true
diff --git a/bundles/org.eclipse.ui.ide/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.ide/META-INF/MANIFEST.MF
deleted file mode 100644
index 507f398..0000000
--- a/bundles/org.eclipse.ui.ide/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,59 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui.ide; singleton:=true
-Bundle-Version: 3.5.0.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.ui.internal.ide.IDEWorkbenchPlugin
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: %Plugin.providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.ui,
- org.eclipse.ui.actions,
- org.eclipse.ui.dialogs,
- org.eclipse.ui.ide,
- org.eclipse.ui.ide.dialogs,
- org.eclipse.ui.ide.fileSystem,
- org.eclipse.ui.ide.undo,
- org.eclipse.ui.internal.ide;x-friends:="org.eclipse.ui.ide.application",
- org.eclipse.ui.internal.ide.actions;x-internal:=true,
- org.eclipse.ui.internal.ide.commands;x-internal:=true,
- org.eclipse.ui.internal.ide.dialogs;x-friends:="org.eclipse.ui.ide.application",
- org.eclipse.ui.internal.ide.filesystem;x-internal:=true,
- org.eclipse.ui.internal.ide.handlers;x-internal:=true,
- org.eclipse.ui.internal.ide.misc;x-internal:=true,
- org.eclipse.ui.internal.ide.model;x-friends:="org.eclipse.ui.ide.application",
- org.eclipse.ui.internal.ide.registry;x-internal:=true,
- org.eclipse.ui.internal.ide.undo;x-friends:="org.eclipse.ui.ide.application",
- org.eclipse.ui.internal.views.bookmarkexplorer;x-internal:=true,
- org.eclipse.ui.internal.views.framelist;x-internal:=true,
- org.eclipse.ui.internal.views.markers;x-internal:=true,
- org.eclipse.ui.internal.views.navigator;x-internal:=true,
- org.eclipse.ui.internal.views.properties;x-internal:=true,
- org.eclipse.ui.internal.views.tasklist;x-internal:=true,
- org.eclipse.ui.internal.wizards.datatransfer;x-internal:=true,
- org.eclipse.ui.internal.wizards.newresource;x-internal:=true,
- org.eclipse.ui.model,
- org.eclipse.ui.part,
- org.eclipse.ui.views.bookmarkexplorer,
- org.eclipse.ui.views.framelist,
- org.eclipse.ui.views.markers,
- org.eclipse.ui.views.markers.internal;x-internal:=true,
- org.eclipse.ui.views.navigator,
- org.eclipse.ui.views.properties,
- org.eclipse.ui.views.tasklist,
- org.eclipse.ui.wizards.datatransfer,
- org.eclipse.ui.wizards.newresource
-Require-Bundle: org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)";resolution:=optional,
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.filesystem;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.help;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui;bundle-version="[3.5.0,4.0.0)",
- org.eclipse.ui.views;bundle-version="[3.2.0,4.0.0)";resolution:=optional,
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.forms;bundle-version="[3.3.0,4.0.0)";resolution:=optional,
- org.eclipse.equinox.p2.engine;bundle-version="[1.0.100,2.0.0)",
- org.eclipse.equinox.p2.metadata;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.equinox.p2.core;bundle-version="[1.0.100,2.0.0)"
-Import-Package: com.ibm.icu.text
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/bundles/org.eclipse.ui.ide/about.html b/bundles/org.eclipse.ui.ide/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.ui.ide/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.ide/build.properties b/bundles/org.eclipse.ui.ide/build.properties
deleted file mode 100644
index 42c1b4d..0000000
--- a/bundles/org.eclipse.ui.ide/build.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-bin.includes = plugin.properties,\
-               .options,\
-               plugin.xml,\
-               about.html,\
-               icons/,\
-               .,\
-               META-INF/
-src.includes = about.html,\
-               schema/
-source.. = extensions/,\
-                 src/
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IContributorResourceAdapter.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IContributorResourceAdapter.java
deleted file mode 100644
index 5f3cd99..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IContributorResourceAdapter.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * The IContributorResourceAdapter is an interface that defines
- * the API required to get a resource that an object adapts to
- * for use of object contributions, decorators and property
- * pages that have adaptable = true.
- * Implementors of this interface are typically registered with an
- * IAdapterFactory for lookup via the getAdapter() mechanism.
- */
-public interface IContributorResourceAdapter {
-
-    /**
-     * Return the resource that the supplied adaptable 
-     * adapts to. An IContributorResourceAdapter assumes
-     * that any object passed to it adapts to one equivalent
-     * resource.
-     * 
-     * @param adaptable the adaptable being queried
-     * @return a resource, or <code>null</code> if there
-     * 	is no adapted resource for this type
-     */
-    public IResource getAdaptedResource(IAdaptable adaptable);
-
-}
-
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IFileEditorInput.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IFileEditorInput.java
deleted file mode 100644
index e6fb501..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IFileEditorInput.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui;
-
-import org.eclipse.core.resources.IFile;
-
-/**
- * This interface defines a file-oriented input to an editor.
- * <p>
- * Clients implementing this editor input interface should override
- * <code>Object.equals(Object)</code> to answer true for two inputs
- * that are the same. The <code>IWorbenchPage.openEditor</code> APIs
- * are dependent on this to find an editor with the same input.
- * </p><p>
- * File-oriented editors should support this as a valid input type, and allow
- * full read-write editing of its content.
- * </p><p>
- * A default implementation of this interface is provided by 
- * org.eclipse.ui.part.FileEditorInput.  
- * </p><p>
- * All editor inputs must implement the <code>IAdaptable</code> interface;
- * extensions are managed by the platform's adapter manager.
- * </p>
- *
- * @see org.eclipse.core.resources.IFile
- */
-public interface IFileEditorInput extends IStorageEditorInput {
-    /**
-     * Returns the file resource underlying this editor input.
-     * <p>
-     * The <code>IFile</code> returned can be a handle to a resource
-     * that does not exist in the workspace. As such, an editor should
-     * provide appropriate feedback to the user instead of simply failing
-     * during input validation. For example, a text editor could open
-     * in read-only mode with a message in the text area to inform the
-     * user that the file does not exist.
-     * </p>
-     *
-     * @return the underlying file
-     */
-    public IFile getFile();
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerActionFilter.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerActionFilter.java
deleted file mode 100644
index 4f374b6..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerActionFilter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui;
-
-
-/**
- * Describes the public attributes for a marker and the acceptable values
- * each may have.  
- * <p>
- * A popup menu extension may use these constants to describe its object target.  
- * Each identifies an attribute name or possible value.  
- * <p>
- * Clients are not expected to implement this interface.
- * </p>
- *
- * @see IActionFilter
- */
-public interface IMarkerActionFilter extends IActionFilter {
-    /**
-     * An attribute indicating the marker type (value <code>"type"</code>).  
-     * The attribute value in xml should match one of the marker types defined in 
-     * the workbench's marker extension point.  Common examples are 
-     * <code>IMarker.TASK, IMarker.BOOKMARK, and IMarker.MARKER</code>.
-     */
-    public static final String TYPE = "type"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating the marker super type (value <code>"superType"</code>).  
-     * The attribute value in xml should match one of the marker types defined in 
-     * the workbench's marker extension point.  Common examples are 
-     * <code>IMarker.TASK, IMarker.BOOKMARK, and IMarker.MARKER</code>.
-     */
-    public static final String SUPER_TYPE = "superType"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating the marker priority (value <code>"priority"</code>).
-     * The attribute value in xml must be one of <code>IMarker.PRIORITY_LOW, 
-     * IMarker.PRIORITY_NORMAL, or IMarker.PRIORITY_HIGH</code> 
-     */
-    public static final String PRIORITY = "priority"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating the marker severity (value <code>"severity"</code>).  
-     * The attribute value in xml in xml must be one of <code>IMarker.SEVERITY_ERROR, 
-     * IMarker.SEVERITY_WARNING, or IMarker.SEVERITY_INFO</code> 
-     */
-    public static final String SEVERITY = "severity"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating whether the marker is considered done (value 
-     * <code>"done"</code>).
-     * The attribute value in xml must be one of <code>"true" or "false"</code>.
-     */
-    public static final String DONE = "done"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating the marker message (value <code>"message"</code>).
-     * The attribute value in xml is unconstrained. "*" may be used at the start or
-     * the end to represent "one or more characters".
-     */
-    public static final String MESSAGE = "message"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating the type of resource associated with the marker
-     * (value <code>"resourceType"</code>). The attribute value in xml must be
-     * one of <code>IResource.FILE, IResource.PROJECT, IResource.FOLDER,
-     * or IResource.ROOT</code>.
-     */
-    public static final String RESOURCE_TYPE = "resourceType"; //$NON-NLS-1$
-
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerHelpRegistry.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerHelpRegistry.java
deleted file mode 100644
index c68b56b..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerHelpRegistry.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui;
-
-import org.eclipse.core.resources.IMarker;
-
-/** 
- * Registry of F1 help contexts and resolutions for markers.
- * <p>
- * The information contained in the registry is read from the 
- * org.eclipse.ui.markerhelp and org.eclipse.ui.markerresolution
- * extension points.
- * </p>
- * 
- * @since 2.0
- */
-public interface IMarkerHelpRegistry {
-    /**
-     * Returns a help context id for the given marker or
-     * <code>null</code> if no help has been registered 
-     * for the marker.
-     * 
-     * @param marker the marker for which to obtain help
-     * @since 2.0
-     */
-    public String getHelp(IMarker marker);
-
-    /**
-     * Returns <code>false</code> if there are no resolutions for 
-     * the given marker. Returns <code>true</code> if their may
-     * be resolutions. In most cases a <code>true</code> value 
-     * means there are resolutions but due to plugin loading 
-     * issues getResolutions may sometimes return an empty array
-     * after this method returns <code>true</code>. 
-     * 
-     * @param marker the marker for which to determine if there
-     * are resolutions
-     * @since 2.0
-     */
-    public boolean hasResolutions(IMarker marker);
-
-    /**
-     * Returns an array of resolutions for the given marker. 
-     * The returned array will be empty if there are no resolutions
-     * for the marker.
-     * 
-     * @param marker the marker for which to obtain resolutions
-     * @since 2.0
-     */
-    public IMarkerResolution[] getResolutions(IMarker marker);
-}
-
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerResolution.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerResolution.java
deleted file mode 100644
index 8c70bbd..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerResolution.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui;
-
-import org.eclipse.core.resources.IMarker;
-
-/** 
- * Resolution for a marker. When run, a resolution would 
- * typically eliminate the need for the marker.
- * 
- * @since 2.0
- */
-public interface IMarkerResolution {
-    /** 
-     * Returns a short label indicating what the resolution will do. 
-     * 
-     * @return a short label for this resolution
-     */
-    public String getLabel();
-
-    /**
-     * Runs this resolution.
-     * 
-     * @param marker the marker to resolve
-     */
-    public void run(IMarker marker);
-}
-
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerResolution2.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerResolution2.java
deleted file mode 100644
index a6045a6..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerResolution2.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui;
-
-import org.eclipse.swt.graphics.Image;
-
-/** 
- * Extends <code>IMarkerResolution</code>.  This interface should be used 
- * in place of <code>IMarkerResolution</code> if a description and/or image 
- * are desired.
- * 
- * @since 3.0
- */
-public interface IMarkerResolution2 extends IMarkerResolution {
-
-    /**
-     * Returns optional additional information about the resolution.
-     * The additional information will be presented to assist the user
-     * in deciding if the selected proposal is the desired choice.
-     *
-     * @return the additional information or <code>null</code>
-     */
-    public String getDescription();
-
-    /**
-     * Returns the image to be displayed in the list of resolutions.
-     * The image would typically be shown to the left of the display string.
-     *
-     * @return the image to be shown or <code>null</code> if no image is desired
-     */
-    public Image getImage();
-}
-
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerResolutionGenerator.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerResolutionGenerator.java
deleted file mode 100644
index 5511eac..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerResolutionGenerator.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui;
-
-import org.eclipse.core.resources.IMarker;
-
-/** 
- * Creates resolutions for a given marker. 
- * When run, a resolution would typically eliminate 
- * the need for the marker.
- * 
- * @since 2.0
- */
-public interface IMarkerResolutionGenerator {
-    /**
-     * Returns resolutions for the given marker (may
-     * be empty).
-     *
-     * @param marker the marker
-     * @return resolutions for the given marker
-     */
-    public IMarkerResolution[] getResolutions(IMarker marker);
-}
-
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerResolutionGenerator2.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerResolutionGenerator2.java
deleted file mode 100644
index e50ad55..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IMarkerResolutionGenerator2.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui;
-
-import org.eclipse.core.resources.IMarker;
-
-/** 
- * A marker resolution generator should implement this interface rather than   
- * <code>IMarkerResolutionGenerator</code> if it can determine whether a particular marker 
- * has any resolutions more efficiently than computing all the resolutions.
- * 
- * @since 2.1
- */
-public interface IMarkerResolutionGenerator2 extends IMarkerResolutionGenerator {
-
-    /**
-     * Returns whether there are any resolutions for the given marker.
-     *
-     * @param marker the marker
-     * @return <code>true</code> if there are resolutions for the given marker,
-     *   <code>false</code> if not
-     */
-    public boolean hasResolutions(IMarker marker);
-}
-
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IProjectActionFilter.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IProjectActionFilter.java
deleted file mode 100644
index 90411f9..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IProjectActionFilter.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui;
-
-
-/**
- * Describes the public attributes for a project and the acceptable values
- * each may have.  
- * <p>
- * A popup menu extension may use these constants to describe its object target.  
- * Each identifies an attribute name or possible value.  
- * <p>
- * Clients are not expected to implement this interface.
- * </p>
- *
- * @see org.eclipse.ui.IActionFilter
- */
-public interface IProjectActionFilter extends IResourceActionFilter {
-
-    /**
-     * An attribute indicating the project nature (value <code>"nature"</code>).
-     * The attribute value in xml is unconstrained.
-     */
-    public static final String NATURE = "nature"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating whether the project is open (value <code>"open"</code>).
-     * The attribute value in xml must be one of <code>"true" or "false"</code>.
-     */
-    public static final String OPEN = "open"; //$NON-NLS-1$
-
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IResourceActionFilter.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IResourceActionFilter.java
deleted file mode 100644
index 733acf5..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IResourceActionFilter.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui;
-
-/**
- * Describes the public attributes for a resource and the acceptable values
- * each may have.  
- * <p>
- * A popup menu extension may use these constants to describe its object target.  
- * Each identifies an attribute name or possible value.  
- * <p>
- * Clients are not expected to implement this interface.
- * </p>
- *
- * @see org.eclipse.ui.IActionFilter
- */
-public interface IResourceActionFilter extends IActionFilter {
-    /**
-     * An attribute indicating the file name (value <code>"name"</code>).  
-     * The attribute value in xml is unconstrained.  "*" may be used at the start or
-     * the end to represent "one or more characters".
-     */
-    public static final String NAME = "name"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating the file extension (value <code>"extension"</code>).
-     * The attribute value in xml is unconstrained.
-     */
-    public static final String EXTENSION = "extension"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating the file path (value <code>"path"</code>).
-     * The attribute value in xml is unconstrained.  "*" may be used at the start or
-     * the end to represent "one or more characters".
-     */
-    public static final String PATH = "path"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating whether the file is read only (value <code>"readOnly"</code>).
-     * The attribute value in xml must be one of <code>"true" or "false"</code>.
-     */
-    public static final String READ_ONLY = "readOnly"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating the project nature (value <code>"projectNature"</code>).
-     * The attribute value in xml is unconstrained.
-     */
-    public static final String PROJECT_NATURE = "projectNature"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating a persistent property on the selected resource 
-     * (value <code>"persistentProperty"</code>).
-     * If the value is a simple string, then this simply tests for existence of the property on the resource.
-     * If it has the format <code>"propertyName=propertyValue" this obtains the value of the property
-     * with the specified name and tests it for equality with the specified value.
-     */
-    public static final String PERSISTENT_PROPERTY = "persistentProperty"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating a persistent property on the selected resource's project. 
-     * (value <code>"projectPersistentProperty"</code>).
-     * If the value is a simple string, then this simply tests for existence of the property on the resource.
-     * If it has the format <code>"propertyName=propertyValue" this obtains the value of the property
-     * with the specified name and tests it for equality with the specified value.
-     */
-    public static final String PROJECT_PERSISTENT_PROPERTY = "projectPersistentProperty"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating a session property on the selected resource 
-     * (value <code>"sessionProperty"</code>).
-     * If the value is a simple string, then this simply tests for existence of the property on the resource.
-     * If it has the format <code>"propertyName=propertyValue" this obtains the value of the property
-     * with the specified name and tests it for equality with the specified value.
-     */
-    public static final String SESSION_PROPERTY = "sessionProperty"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating a session property on the selected resource's project. 
-     * (value <code>"projectSessionProperty"</code>).
-     * If the value is a simple string, then this simply tests for existence of the property on the resource.
-     * If it has the format <code>"propertyName=propertyValue" this obtains the value of the property
-     * with the specified name and tests it for equality with the specified value.
-     */
-    public static final String PROJECT_SESSION_PROPERTY = "projectSessionProperty"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating that this is an xml file
-     * and we should ensure that the first tag (or top-level
-     * tag) has this name.
-     * @since 3.0
-     * @deprecated Please use content types instead.
-     */
-    public static final String XML_FIRST_TAG = "xmlFirstTag"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating that this is an xml file and we should ensure that the DTD
-     * definition in this xml file is the value supplied with this attribute.
-     * @since 3.0
-     * @deprecated Please use content types instead.
-     */
-    public static final String XML_DTD_NAME = "xmlDTDName"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating that this is a file, and we are looking to verify
-     * that the file matches the content type matching the given identifier.
-     * The identifier is provided in the value.
-     * @since 3.0
-     */
-    public static final String CONTENT_TYPE_ID = "contentTypeId"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IStorageEditorInput.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IStorageEditorInput.java
deleted file mode 100644
index 5b87227..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IStorageEditorInput.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui;
-
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * Interface for a <code>IStorage</code> input to an editor.
- * <p>
- * Clients implementing this editor input interface should override
- * <code>Object.equals(Object)</code> to answer true for two inputs
- * that are the same. The <code>IWorbenchPage.openEditor</code> APIs
- * are dependent on this to find an editor with the same input.
- * </p><p>
- * Clients should implement this interface to declare new types of 
- * <code>IStorage</code> editor inputs.
- * </p><p>
- * File-oriented editors should support this as a valid input type, and display
- * its content for viewing (but not allow modification).
- * Within the editor, the "save" and "save as" operations should create a new 
- * file resource within the workspace.
- * </p><p>
- * All editor inputs must implement the <code>IAdaptable</code> interface;
- * extensions are managed by the platform's adapter manager.
- * </p>
- */
-public interface IStorageEditorInput extends IEditorInput {
-    /**
-     * Returns the underlying IStorage object.
-     *
-     * @return an IStorage object.
-     * @exception CoreException if this method fails
-     */
-    public IStorage getStorage() throws CoreException;
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IURIEditorInput.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IURIEditorInput.java
deleted file mode 100644
index b6e1c41..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/IURIEditorInput.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007  IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui;
-
-import java.net.URI;
-
-import org.eclipse.ui.IEditorInput;
-
-/**
- * This interface defines an editor input based on a URI.
- * <p>
- * Clients implementing this editor input interface should override
- * <code>Object.equals(Object)</code> to answer true for two inputs
- * that are the same. The <code>IWorkbenchPage.openEditor</code> APIs
- * are dependent on this to find an editor with the same input.
- * </p><p>
- * Path-oriented editors should support this as a valid input type, and
- * can allow full read-write editing of its content.
- * </p><p>
- * All editor inputs must implement the <code>IAdaptable</code> interface;
- * extensions are managed by the platform's adapter manager.
- * </p>
- *
- * @see URI
- * @since 3.3
- */
-public interface IURIEditorInput extends IEditorInput {
-    /**
-     * Returns the {@link URI} of the file underlying this editor input.
-     *
-     * @return {@link URI}
-     */
-    public URI getURI();
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/ResourceWorkingSetFilter.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/ResourceWorkingSetFilter.java
deleted file mode 100644
index e2dc4d1..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/ResourceWorkingSetFilter.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-/**
- * A resource working set filter filters resources from a view that 
- * are neither a parent nor children of a working set element.
- * 
- * @since 2.0
- */
-public class ResourceWorkingSetFilter extends ViewerFilter {
-    private IWorkingSet workingSet = null;
-
-    private IAdaptable[] cachedWorkingSet = null;
-
-    /**
-     * Returns the active working set the filter is working with.
-     * 
-     * @return the active working set 
-     */
-    public IWorkingSet getWorkingSet() {
-        return workingSet;
-    }
-
-    /**
-     * Sets the active working set.
-     * 
-     * @param workingSet the working set the filter should work with
-     */
-    public void setWorkingSet(IWorkingSet workingSet) {
-        this.workingSet = workingSet;
-    }
-
-    /**
-     * Determines if an element should be filtered out.
-     * 
-     * @see ViewerFilter#select(Viewer, Object, Object)
-     */
-    public boolean select(Viewer viewer, Object parentElement, Object element) {
-        IResource resource = null;
-
-        if (workingSet == null || (workingSet.isAggregateWorkingSet() &&
-        		workingSet.isEmpty())) {
-            return true;
-        }
-        if (element instanceof IResource) {
-            resource = (IResource) element;
-        } else if (element instanceof IAdaptable) {
-            IAdaptable adaptable = (IAdaptable) element;
-            resource = (IResource) adaptable.getAdapter(IResource.class);
-        }
-        if (resource != null) {
-            return isEnclosed(resource);
-        }
-        return true;
-    }
-
-    /**
-     * Returns if the given resource is enclosed by a working set element.
-     * The IContainmentAdapter of each working set element is used for the
-     * containment test. If there is no IContainmentAdapter for a working 
-     * set element, a simple resource based test is used. 
-     * 
-     * @param element resource to test for enclosure by a working set
-     * 	element 
-     * @return true if element is enclosed by a working set element and 
-     * 	false otherwise. 
-     */
-    private boolean isEnclosed(IResource element) {
-        IPath elementPath = element.getFullPath();
-        IAdaptable[] workingSetElements = cachedWorkingSet;
-
-        // working set elements won't be cached if select is called
-        // directly, outside filter. fixes bug 14500.
-        if (workingSetElements == null) {
-			workingSetElements = workingSet.getElements();
-		}
-
-        for (int i = 0; i < workingSetElements.length; i++) {
-            IAdaptable workingSetElement = workingSetElements[i];
-            IContainmentAdapter containmentAdapter = (IContainmentAdapter) workingSetElement
-                    .getAdapter(IContainmentAdapter.class);
-
-            // if there is no IContainmentAdapter defined for the working  
-            // set element type fall back to using resource based  
-            // containment check 
-            if (containmentAdapter != null) {
-                if (containmentAdapter.contains(workingSetElement, element,
-                        IContainmentAdapter.CHECK_CONTEXT
-                                | IContainmentAdapter.CHECK_IF_CHILD
-                                | IContainmentAdapter.CHECK_IF_ANCESTOR
-                                | IContainmentAdapter.CHECK_IF_DESCENDANT)) {
-					return true;
-				}
-            } else if (isEnclosedResource(element, elementPath,
-                    workingSetElement)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Returns if the given resource is enclosed by a working set element.
-     * A resource is enclosed if it is either a parent of a working set 
-     * element, a child of a working set element or a working set element
-     * itself.
-     * Simple path comparison is used. This is only guaranteed to return
-     * correct results for resource working set elements. 
-     * 
-     * @param element resource to test for enclosure by a working set
-     * 	element
-     * @param elementPath full, absolute path of the element to test 
-     * @return true if element is enclosed by a working set element and 
-     * 	false otherwise. 
-     */
-    private boolean isEnclosedResource(IResource element, IPath elementPath,
-            IAdaptable workingSetElement) {
-        IResource workingSetResource = null;
-
-        if (workingSetElement.equals(element)) {
-			return true;
-		}
-        if (workingSetElement instanceof IResource) {
-            workingSetResource = (IResource) workingSetElement;
-        } else {
-            workingSetResource = (IResource) workingSetElement
-                    .getAdapter(IResource.class);
-        }
-        if (workingSetResource != null) {
-            IPath resourcePath = workingSetResource.getFullPath();
-            if (resourcePath.isPrefixOf(elementPath)) {
-				return true;
-			}
-            if (elementPath.isPrefixOf(resourcePath)) {
-				return true;
-			}
-        }
-        return false;
-    }
-
-    /**
-     * Filters out elements that are neither a parent nor a child of 
-     * a working set element.
-     * 
-     * @see ViewerFilter#filter(Viewer, Object, Object[])
-     */
-    public Object[] filter(Viewer viewer, Object parent, Object[] elements) {
-        Object[] result = null;
-        if (workingSet != null) {
-			cachedWorkingSet = workingSet.getElements();
-		}
-        try {
-            result = super.filter(viewer, parent, elements);
-        } finally {
-            cachedWorkingSet = null;
-        }
-        return result;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/AddBookmarkAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/AddBookmarkAction.java
deleted file mode 100644
index ae497a0..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/AddBookmarkAction.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *        IBM Corporation - initial API and implementation 
- *   Sebastian Davids <sdavids@gmx.de>
- *     - Fix for bug 20510 - Add Bookmark action has wrong label in navigator or
- *       packages view
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.CreateMarkersOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.views.bookmarkexplorer.BookmarkMessages;
-import org.eclipse.ui.views.bookmarkexplorer.BookmarkPropertiesDialog;
-
-/**
- * Standard action for adding a bookmark to the currently selected file
- * resource(s).
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class AddBookmarkAction extends SelectionListenerAction {
-
-	/**
-	 * The id of this action.
-	 */
-	public static final String ID = PlatformUI.PLUGIN_ID + ".AddBookmarkAction"; //$NON-NLS-1$
-
-	/**
-	 * The IShellProvider in which to show any dialogs.
-	 */
-	private IShellProvider shellProvider;
-
-	/**
-	 * Whether to prompt the user for the bookmark name.
-	 */
-	private boolean promptForName = true;
-
-	/**
-	 * Creates a new bookmark action. By default, prompts the user for the
-	 * bookmark name.
-	 * 
-	 * @param shell
-	 *            the shell for any dialogs
-	 * @deprecated see {@link #AddBookmarkAction(IShellProvider, boolean)} 
-	 */
-	public AddBookmarkAction(Shell shell) {
-		this(shell, true);
-	}
-
-	/**
-	 * Creates a new bookmark action.
-	 * 
-	 * @param shell
-	 *            the shell for any dialogs
-	 * @param promptForName
-	 *            whether to ask the user for the bookmark name
-	 * @deprecated see {@link #AddBookmarkAction(IShellProvider, boolean)} 
-	 */
-	public AddBookmarkAction(final Shell shell, boolean promptForName) {
-		super(IDEWorkbenchMessages.AddBookmarkLabel);
-		Assert.isNotNull(shell);
-		shellProvider = new IShellProvider() {
-			public Shell getShell() {
-				return shell;
-			} };
-			
-		initAction(promptForName);
-	}
-	
-	/**
-	 * Creates a new bookmark action.
-	 * 
-	 * @param provider
-	 *            the shell provider for any dialogs. Must not be
-	 *            <code>null</code>
-	 * @param promptForName
-	 *            whether to ask the user for the bookmark name
-	 * @since 3.4
-	 */
-	public AddBookmarkAction(IShellProvider provider, boolean promptForName) {
-		super(IDEWorkbenchMessages.AddBookmarkLabel);
-		Assert.isNotNull(provider);
-		shellProvider = provider;
-		initAction(promptForName);
-	}
-
-	/**
-	 * @param promptForName
-	 */
-	private void initAction(boolean promptForName) {
-		this.promptForName = promptForName;
-		setToolTipText(IDEWorkbenchMessages.AddBookmarkToolTip);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.ADD_BOOKMARK_ACTION);
-		setId(ID);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public void run() {
-		IStructuredSelection selection = getStructuredSelection();
-		for (Iterator i = selection.iterator(); i.hasNext();) {
-			Object o = i.next();
-			IFile file = null;
-			if (o instanceof IFile) {
-				file = (IFile) o;
-			} else if (o instanceof IAdaptable) {
-				Object resource = ((IAdaptable) o).getAdapter(IResource.class);
-				if (resource instanceof IFile) {
-					file = (IFile) resource;
-				}
-			}
-			if (file != null) {
-				if (promptForName) {
-					BookmarkPropertiesDialog dialog = new BookmarkPropertiesDialog(
-							shellProvider.getShell());
-					dialog.setResource(file);
-					dialog.open();
-				} else {
-					Map attrs = new HashMap();
-					attrs.put(IMarker.MESSAGE, file.getName());
-					CreateMarkersOperation op = new CreateMarkersOperation(
-							IMarker.BOOKMARK, attrs, file,
-							BookmarkMessages.CreateBookmark_undoText);
-					try {
-						PlatformUI.getWorkbench().getOperationSupport()
-								.getOperationHistory().execute(op, null,
-										WorkspaceUndoUtil.getUIInfoAdapter(shellProvider.getShell()));
-					} catch (ExecutionException e) {
-						IDEWorkbenchPlugin.log(null, e); // We don't care
-					}
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * The <code>AddBookmarkAction</code> implementation of this
-	 * <code>SelectionListenerAction</code> method enables the action only if
-	 * the selection is not empty and contains just file resources.
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		// @issue typed selections
-		return super.updateSelection(selection) && !selection.isEmpty()
-				&& selectionIsOfType(IResource.FILE);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/AddTaskAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/AddTaskAction.java
deleted file mode 100644
index 68abf95..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/AddTaskAction.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.views.markers.internal.DialogTaskProperties;
-
-/**
- * Standard action for adding a task to the currently selected file
- * resource(s).
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @since 2.1
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class AddTaskAction extends SelectionListenerAction {
-    /**
-     * The id of this action.
-     */
-    public static final String ID = PlatformUI.PLUGIN_ID + ".AddTaskAction";//$NON-NLS-1$
-
-    /**
-     * The IShellProvider in which to show any dialogs.
-     */
-    private IShellProvider shellProvider;
-
-    /**
-     * Creates a new instance of the receiver.
-     * 
-     * @param shell shell to use to show any dialogs
-     * @deprecated See {@link #AddTaskAction(IShellProvider)}
-     */
-    public AddTaskAction(final Shell shell) {
-        super(IDEWorkbenchMessages.AddTaskLabel);
-        Assert.isNotNull(shell);
-        this.shellProvider = new IShellProvider() {
-			public Shell getShell() {
-				return shell;
-			} };
-        initAction();
-    }
-    
-    /**
-	 * Creates a new instance of the receiver.
-	 * 
-	 * @param provider
-	 *            the IShellProvider to show any dialogs
-	 * @since 3.4
-	 */
-    public AddTaskAction(IShellProvider provider) {
-    	super(IDEWorkbenchMessages.AddTaskLabel);
-        Assert.isNotNull(provider);
-        shellProvider = provider;
-        initAction();
-    }
-
-	/**
-	 *  Initializes the workbench
-	 */
-	private void initAction() {
-		setId(ID);
-        setToolTipText(IDEWorkbenchMessages.AddTaskToolTip);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.ADD_TASK_ACTION);
-	}
-
-    private IResource getElement(IStructuredSelection selection) {
-        if (selection.size() != 1) {
-			return null;
-		}
-
-        Object element = selection.getFirstElement();
-        IResource resource = null;
-        if (element instanceof IResource) {
-			resource = (IResource) element;
-		}
-        if (element instanceof IAdaptable) {
-			resource = (IResource) ((IAdaptable) element)
-                    .getAdapter(IResource.class);
-		}
-
-        if (resource != null && resource instanceof IProject) {
-            IProject project = (IProject) resource;
-            if (project.isOpen() == false) {
-				resource = null;
-			}
-        }
-        return resource;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IAction.
-     */
-    public void run() {
-        IResource resource = getElement(getStructuredSelection());
-        if (resource != null) {
-            DialogTaskProperties dialog = new DialogTaskProperties(
-					shellProvider.getShell());
-            dialog.setResource(resource);
-            dialog.open();
-        }
-    }
-
-    /**
-     * The <code>AddTaskAction</code> implementation of this
-     * <code>SelectionListenerAction</code> method enables the action only
-     * if the selection contains a single resource and the resource is
-     * not a closed project.
-     * 
-     * @param selection the selection to update the enabled state for
-     */
-    protected boolean updateSelection(IStructuredSelection selection) {
-        return super.updateSelection(selection)
-                && getElement(selection) != null;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/BuildAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/BuildAction.java
deleted file mode 100644
index 8e735da..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/BuildAction.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.ICommand;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.actions.BuildUtilities;
-
-/**
- * Standard actions for full and incremental builds of the selected project(s).
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class BuildAction extends WorkspaceAction {
-
-    /**
-     * The id of an incremental build action.
-     */
-    public static final String ID_BUILD = PlatformUI.PLUGIN_ID + ".BuildAction";//$NON-NLS-1$
-
-    /**
-     * The id of a rebuild all action.
-     */
-    public static final String ID_REBUILD_ALL = PlatformUI.PLUGIN_ID
-            + ".RebuildAllAction";//$NON-NLS-1$
-
-    private int buildType;
-
-    /**
-     * The list of IProjects to build (computed lazily).
-     */
-    private List projectsToBuild = null;
-
-    /**
-     * Creates a new action of the appropriate type. The action id is 
-     * <code>ID_BUILD</code> for incremental builds and <code>ID_REBUILD_ALL</code>
-     * for full builds.
-     *
-     * @param shell the shell for any dialogs
-     * @param type the type of build; one of
-     *  <code>IncrementalProjectBuilder.INCREMENTAL_BUILD</code> or 
-     *  <code>IncrementalProjectBuilder.FULL_BUILD</code>
-     * @deprecated See {@link #BuildAction(IShellProvider, int)}
-     */
-    public BuildAction(Shell shell, int type) {
-        super(shell, "");//$NON-NLS-1$
-        initAction(type);
-    }
-    
-    /**
-	 * Creates a new action of the appropriate type. The action id is
-	 * <code>ID_BUILD</code> for incremental builds and
-	 * <code>ID_REBUILD_ALL</code> for full builds.
-	 * 
-	 * @param provider
-	 *            the shell provider for any dialogs
-	 * @param type
-	 *            the type of build; one of
-	 *            <code>IncrementalProjectBuilder.INCREMENTAL_BUILD</code> or
-	 *            <code>IncrementalProjectBuilder.FULL_BUILD</code>
-	 * @since 3.4
-	 */
-    public BuildAction(IShellProvider provider, int type) {
-    	super(provider, ""); //$NON-NLS-1$
-    	initAction(type);
-    }
-
-	/**
-	 * @param type
-	 */
-	private void initAction(int type) {
-		if (type == IncrementalProjectBuilder.INCREMENTAL_BUILD) {
-            setText(IDEWorkbenchMessages.BuildAction_text);
-            setToolTipText(IDEWorkbenchMessages.BuildAction_toolTip);
-            setId(ID_BUILD);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                    IIDEHelpContextIds.INCREMENTAL_BUILD_ACTION);
-        } else {
-            setText(IDEWorkbenchMessages.RebuildAction_text);
-            setToolTipText(IDEWorkbenchMessages.RebuildAction_tooltip);
-            setId(ID_REBUILD_ALL);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-					IIDEHelpContextIds.FULL_BUILD_ACTION);
-        }
-
-        this.buildType = type;
-	}
-
-    /**
-     * Adds the given project and all of its prerequisities, transitively,
-     * to the provided set.
-     */
-    private void addAllProjects(IProject project, HashSet projects) {
-        if (project == null || !project.isAccessible()
-                || projects.contains(project)) {
-			return;
-		}
-        projects.add(project);
-        try {
-            IProject[] preReqs = project.getReferencedProjects();
-            for (int i = 0; i < preReqs.length; i++) {
-				addAllProjects(preReqs[i], projects);
-			}
-        } catch (CoreException e) {
-            //ignore inaccessible projects
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkspaceAction.
-     */
-    protected List getActionResources() {
-        return getProjectsToBuild();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkspaceAction.
-     */
-    protected String getOperationMessage() {
-        return IDEWorkbenchMessages.BuildAction_operationMessage;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkspaceAction.
-     */
-    protected String getProblemsMessage() {
-        return IDEWorkbenchMessages.BuildAction_problemMessage;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkspaceAction.
-     */
-    protected String getProblemsTitle() {
-        return IDEWorkbenchMessages.BuildAction_problemTitle;
-    }
-
-    /**
-     * Returns the projects to build.
-     * This contains the set of projects which have builders, across all selected resources.
-     */
-    List getProjectsToBuild() {
-        if (projectsToBuild == null) {
-            projectsToBuild = new ArrayList(3);
-            for (Iterator i = getSelectedResources().iterator(); i.hasNext();) {
-                IResource resource = (IResource) i.next();
-                IProject project = resource.getProject();
-                if (project != null) {
-                    if (!projectsToBuild.contains(project)) {
-                        if (hasBuilder(project)) {
-                            projectsToBuild.add(project);
-                        }
-                    }
-                }
-            }
-        }
-        return projectsToBuild;
-    }
-
-    /**
-     * Returns whether there are builders configured on the given project.
-     *
-     * @return <code>true</code> if it has builders,
-     *   <code>false</code> if not, or if this couldn't be determined
-     */
-    boolean hasBuilder(IProject project) {
-    	if (!project.isAccessible())
-    		return false;
-        try {
-            ICommand[] commands = project.getDescription().getBuildSpec();
-            if (commands.length > 0) {
-                return true;
-            }
-        } catch (CoreException e) {
-            // this method is called when selection changes, so
-            // just fall through if it fails.
-            // this shouldn't happen anyway, since the list of selected resources
-            // has already been checked for accessibility before this is called
-        }
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkspaceAction.
-     */
-    protected void invokeOperation(IResource resource, IProgressMonitor monitor)
-            throws CoreException {
-        ((IProject) resource).build(buildType, monitor);
-    }
-    
-    /* (non-Javadoc)
-     * Method declared on Action
-     */
-    public boolean isEnabled() {
-    	//update enablement based on active window and part
-		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-		if (window != null) {
-			selectionChanged(new StructuredSelection(BuildUtilities.findSelectedProjects(window)));
-		}
-		return super.isEnabled();
-	}
-    
-    /**
-     * Returns whether the user's preference is set to automatically save modified
-     * resources before a manual build is done.
-     *
-     * @return <code>true</code> if Save All Before Build is enabled
-     */
-    public static boolean isSaveAllSet() {
-        IPreferenceStore store = IDEWorkbenchPlugin.getDefault()
-                .getPreferenceStore();
-        return store.getBoolean(IDEInternalPreferences.SAVE_ALL_BEFORE_BUILD);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkspaceAction.
-     *
-     * Change the order of the resources so that
-     * it matches the build order. Closed and
-     * non existant projects are eliminated. Also,
-     * any projects in cycles are eliminated.
-     */
-    List pruneResources(List resourceCollection) {
-        //recursively compute project prerequisites
-        HashSet toBuild = new HashSet();
-        for (Iterator it = resourceCollection.iterator(); it.hasNext();) {
-			addAllProjects((IProject) it.next(), toBuild);
-		}
-
-        // Optimize...
-        if (toBuild.size() < 2) {
-			return resourceCollection;
-		}
-
-        // Try the workspace's description build order if specified
-        String[] orderedNames = ResourcesPlugin.getWorkspace().getDescription()
-                .getBuildOrder();
-        if (orderedNames != null) {
-            List orderedProjects = new ArrayList(toBuild.size());
-            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-            for (int i = 0; i < orderedNames.length; i++) {
-                IProject handle = root.getProject(orderedNames[i]);
-                if (toBuild.contains(handle)) {
-                    orderedProjects.add(handle);
-                    toBuild.remove(handle);
-                }
-            }
-            //Add anything not specified before we return
-            orderedProjects.addAll(toBuild);
-            return orderedProjects;
-        }
-
-        // Try the project prerequisite order then
-        IProject[] projects = new IProject[toBuild.size()];
-        projects = (IProject[]) toBuild.toArray(projects);
-        IWorkspace.ProjectOrder po = ResourcesPlugin.getWorkspace()
-                .computeProjectOrder(projects);
-        ArrayList orderedProjects = new ArrayList();
-        orderedProjects.addAll(Arrays.asList(po.projects));
-        return orderedProjects;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IAction; overrides method on WorkspaceAction.
-     * This override allows the user to save the contents of selected
-     * open editors so that the updated contents will be used for building.
-     */
-    public void run() {
-	    List projects = getProjectsToBuild();
-	    if (projects == null || projects.isEmpty()) {
-			return;
-		}
-
-	    // Save all resources prior to doing build
-        BuildUtilities.saveEditors(projects);
-        runInBackground(ResourcesPlugin.getWorkspace().getRuleFactory()
-                .buildRule(), ResourcesPlugin.FAMILY_MANUAL_BUILD);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkspaceAction.
-     */
-    protected boolean shouldPerformResourcePruning() {
-        return true;
-    }
-
-    /**
-     * The <code>BuildAction</code> implementation of this
-     * <code>SelectionListenerAction</code> method ensures that this action is
-     * enabled only if all of the selected resources have buildable projects.
-     */
-    protected boolean updateSelection(IStructuredSelection s) {
-        projectsToBuild = null;
-        IProject[] projects = (IProject[]) getProjectsToBuild().toArray(new IProject[0]);
-        return BuildUtilities.isEnabled(projects, IncrementalProjectBuilder.INCREMENTAL_BUILD);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CloseResourceAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CloseResourceAction.java
deleted file mode 100644
index 91d940c..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CloseResourceAction.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-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.IResourceRuleFactory;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
-import org.eclipse.core.resources.mapping.ResourceChangeValidator;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.MultiRule;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.ide.ResourceUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.model.AdaptableList;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchPartLabelProvider;
-
-/**
- * Standard action for closing the currently selected project(s).
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class CloseResourceAction extends WorkspaceAction implements
-        IResourceChangeListener {
-    /**
-     * The id of this action.
-     */
-    public static final String ID = PlatformUI.PLUGIN_ID
-            + ".CloseResourceAction"; //$NON-NLS-1$
-	private String[] modelProviderIds;
-
-    /**
-     * Creates a new action.
-     *
-     * @param shell the shell for any dialogs
-     * @deprecated See {@link #CloseResourceAction(IShellProvider)}
-     */
-    public CloseResourceAction(Shell shell) {
-        super(shell, IDEWorkbenchMessages.CloseResourceAction_text);
-        initAction();
-    }
-
-    /**
-	 * Override super constructor to allow subclass to 
-	 * override with unique text.
-	 * @deprecated See {@link #CloseResourceAction(IShellProvider, String)}
-	 */
-    protected CloseResourceAction(Shell shell, String text) {
-    	super(shell, text);
-    }
-    
-    /**
-	 * Create the new action.
-	 * 
-	 * @param provider
-	 *            the shell provider for any dialogs
-	 * @since 3.4
-	 */
-    public CloseResourceAction(IShellProvider provider) {
-    	super(provider, IDEWorkbenchMessages.CloseResourceAction_text);
-        initAction();
-    }
-    
-    /**
-	 * Provide text to the action.
-	 * 
-	 * @param provider
-	 *            the shell provider for any dialogs
-	 * @param text
-	 *            label
-	 * @since 3.4
-	 */
-    protected CloseResourceAction(IShellProvider provider, String text) {
-    	super(provider, text);
-    }
-
-	private void initAction() {
-		setId(ID);
-        setToolTipText(IDEWorkbenchMessages.CloseResourceAction_toolTip);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.CLOSE_RESOURCE_ACTION);
-	}
-    
-    /**
-     * Return a list of dirty editors associated with the given projects.  Return
-     * editors from all perspectives.
-     * 
-     * @return List the dirty editors
-     */
-    List getDirtyEditors(List projects) {
-        List dirtyEditors = new ArrayList(0);
-        IWorkbenchWindow[] windows = PlatformUI.getWorkbench()
-                .getWorkbenchWindows();
-        for (int i = 0; i < windows.length; i++) {
-            IWorkbenchPage[] pages = windows[i].getPages();
-            for (int j = 0; j < pages.length; j++) {
-                IWorkbenchPage page = pages[j];
-                IEditorPart[] editors = page.getDirtyEditors();
-                for (int k = 0; k < editors.length; k++) {
-                    IEditorPart editor = editors[k];
-                    IFile inputFile = ResourceUtil.getFile(editor.getEditorInput());
-                    if (inputFile != null) {
-                        if (projects.contains(inputFile.getProject())) {
-                            dirtyEditors.add(editor);
-                        }
-                    }
-                }
-            }
-        }
-        return dirtyEditors;
-    }
-
-    /**
-     * Open a dialog that can be used to select which of the given
-     * editors to save. Return the list of editors to save.  A value of 
-     * null implies that the operation was cancelled.
-     * 
-     * @return List the editors to save
-     */
-    List getEditorsToSave(List dirtyEditors) {
-        if (dirtyEditors.isEmpty()) {
-			return new ArrayList(0);
-		}
-
-        // The list may have multiple editors opened for the same input,
-        // so process the list for duplicates.
-        List saveEditors = new ArrayList(0);
-        List dirtyInputs = new ArrayList(0);
-        Iterator iter = dirtyEditors.iterator();
-        while (iter.hasNext()) {
-            IEditorPart editor = (IEditorPart) iter.next();
-            IFile inputFile = ResourceUtil.getFile(editor.getEditorInput());
-            if (inputFile != null) {
-                // if the same file is open in multiple perspectives,
-                // we don't want to count it as dirty multiple times
-                if (!dirtyInputs.contains(inputFile)) {
-                    dirtyInputs.add(inputFile);
-                    saveEditors.add(editor);
-                }
-            }
-        }
-        AdaptableList input = new AdaptableList(saveEditors);
-        ListSelectionDialog dlg = new ListSelectionDialog(getShell(), input,
-                new WorkbenchContentProvider(),
-                new WorkbenchPartLabelProvider(), IDEWorkbenchMessages.EditorManager_saveResourcesMessage);
-
-        dlg.setInitialSelections(saveEditors.toArray(new Object[saveEditors
-                .size()]));
-        dlg.setTitle(IDEWorkbenchMessages.EditorManager_saveResourcesTitle);
-        int result = dlg.open();
-
-        if (result == IDialogConstants.CANCEL_ID) {
-			return null;
-		}
-        return Arrays.asList(dlg.getResult());
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkspaceAction.
-     */
-    protected String getOperationMessage() {
-        return IDEWorkbenchMessages.CloseResourceAction_operationMessage;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkspaceAction.
-     */
-    protected String getProblemsMessage() {
-        return IDEWorkbenchMessages.CloseResourceAction_problemMessage;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkspaceAction.
-     */
-    protected String getProblemsTitle() {
-        return IDEWorkbenchMessages.CloseResourceAction_title;
-    }
-
-    protected void invokeOperation(IResource resource, IProgressMonitor monitor)
-	        throws CoreException {
-	    ((IProject) resource).close(monitor);
-	}
-
-    /** 
-     * The implementation of this <code>WorkspaceAction</code> method
-     * method saves and closes the resource's dirty editors before closing 
-     * it.
-     */
-    public void run() {
-        if (!saveDirtyEditors()) {
-			return;
-		}
-        if (!validateClose()) {
-        	return;
-        }
-        //be conservative and include all projects in the selection - projects
-        //can change state between now and when the job starts
-    	ISchedulingRule rule = null;
-    	IResourceRuleFactory factory = ResourcesPlugin.getWorkspace().getRuleFactory();
-        Iterator resources = getSelectedResources().iterator();
-        while (resources.hasNext()) {
-            IProject project = (IProject) resources.next();
-       		rule = MultiRule.combine(rule, factory.modifyRule(project));
-        }
-        runInBackground(rule);
-    }
-
-    /**
-     * Causes all dirty editors associated to the resource(s) to be saved, if so
-     * specified by the user, and closed.
-     */
-    boolean saveDirtyEditors() {
-        // Get the items to close.
-        List projects = getSelectedResources();
-        if (projects == null || projects.isEmpty()) {
-			// no action needs to be taken since no projects are selected
-            return false;
-		}
-
-        // Collect all the dirty editors that are associated to the projects that are
-        // to be closed.
-        final List dirtyEditors = getDirtyEditors(projects);
-
-        // See which editors should be saved.
-        final List saveEditors = getEditorsToSave(dirtyEditors);
-        if (saveEditors == null) {
-			// the operation was cancelled
-            return false;
-		}
-
-        // Save and close the dirty editors.
-        Shell localShell = getShell();
-        Display disp = localShell == null ? PlatformUI.getWorkbench()
-				.getDisplay() : localShell.getDisplay();
-		BusyIndicator.showWhile(disp, new Runnable() {
-            public void run() {
-                Iterator iter = dirtyEditors.iterator();
-                while (iter.hasNext()) {
-                    IEditorPart editor = (IEditorPart) iter.next();
-                    IWorkbenchPage page = editor.getEditorSite().getPage();
-                    if (saveEditors.contains(editor)) {
-                        // do a direct save vs. using page.saveEditor, so that 
-                        // progress dialogs do not flash up on the screen multiple 
-                        // times
-                        editor.doSave(new NullProgressMonitor());
-                    }
-                    page.closeEditor(editor, false);
-                }
-            }
-        });
-
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkspaceAction.
-     */
-    protected boolean shouldPerformResourcePruning() {
-        return false;
-    }
-
-    /**
-     * The <code>CloseResourceAction</code> implementation of this
-     * <code>SelectionListenerAction</code> method ensures that this action is
-     * enabled only if one of the selections is an open project.
-     */
-    protected boolean updateSelection(IStructuredSelection s) {
-        // don't call super since we want to enable if open project is selected.
-        if (!selectionIsOfType(IResource.PROJECT)) {
-			return false;
-		}
-
-        Iterator resources = getSelectedResources().iterator();
-        while (resources.hasNext()) {
-            IProject currentResource = (IProject) resources.next();
-            if (currentResource.isOpen()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Handles a resource changed event by updating the enablement
-     * if one of the selected projects is opened or closed.
-     */
-    public void resourceChanged(IResourceChangeEvent event) {
-        // Warning: code duplicated in OpenResourceAction
-        List sel = getSelectedResources();
-        // don't bother looking at delta if selection not applicable
-        if (selectionIsOfType(IResource.PROJECT)) {
-            IResourceDelta delta = event.getDelta();
-            if (delta != null) {
-                IResourceDelta[] projDeltas = delta
-                        .getAffectedChildren(IResourceDelta.CHANGED);
-                for (int i = 0; i < projDeltas.length; ++i) {
-                    IResourceDelta projDelta = projDeltas[i];
-                    if ((projDelta.getFlags() & IResourceDelta.OPEN) != 0) {
-                        if (sel.contains(projDelta.getResource())) {
-                            selectionChanged(getStructuredSelection());
-                            return;
-                        }
-                    }
-                }
-            }
-        }
-    }
-    
-    /**
-     * Returns the model provider ids that are known to the client
-     * that instantiated this operation.
-     * 
-     * @return the model provider ids that are known to the client
-     * that instantiated this operation.
-     * @since 3.2
-     */
-	public String[] getModelProviderIds() {
-		return modelProviderIds;
-	}
-
-	/**
-     * Sets the model provider ids that are known to the client
-     * that instantiated this operation. Any potential side effects
-     * reported by these models during validation will be ignored.
-     * 
-	 * @param modelProviderIds the model providers known to the client
-	 * who is using this operation.
-	 * @since 3.2
-	 */
-	public void setModelProviderIds(String[] modelProviderIds) {
-		this.modelProviderIds = modelProviderIds;
-	}
-	
-	/**
-	 * Validates the operation against the model providers.
-	 * 
-	 * @return whether the operation should proceed
-	 */
-    private boolean validateClose() {
-    	IResourceChangeDescriptionFactory factory = ResourceChangeValidator.getValidator().createDeltaFactory();
-    	List resources = getActionResources();
-    	for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			IResource resource = (IResource) iter.next();
-			if (resource instanceof IProject) {
-				IProject project = (IProject) resource;
-				factory.close(project);
-			}
-		}
-    	String message;
-    	if (resources.size() == 1) {
-    		message = NLS.bind(IDEWorkbenchMessages.CloseResourceAction_warningForOne, ((IResource)resources.get(0)).getName());
-    	} else {
-    		message = IDEWorkbenchMessages.CloseResourceAction_warningForMultiple;
-    	}
-		return IDE.promptToConfirm(getShell(), IDEWorkbenchMessages.CloseResourceAction_confirm, message, factory.getDelta(), getModelProviderIds(), false /* no need to syncExec */);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CloseUnrelatedProjectsAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CloseUnrelatedProjectsAction.java
deleted file mode 100644
index cf9633e..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CloseUnrelatedProjectsAction.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDEActionFactory;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.misc.DisjointSet;
-
-/**
- * This action closes all projects that are unrelated to the selected projects. A
- * project is unrelated if it is not directly or transitively referenced by one 
- * of the selected projects, and does not directly or transitively reference
- * one of the selected projects.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @see IDEActionFactory#CLOSE_UNRELATED_PROJECTS
- * @since 3.3
- */
-public class CloseUnrelatedProjectsAction extends CloseResourceAction {
-	/**
-	 * The id of this action.
-	 */
-	public static final String ID = PlatformUI.PLUGIN_ID + ".CloseUnrelatedProjectsAction"; //$NON-NLS-1$
-
-	private final List projectsToClose = new ArrayList();
-
-	private boolean selectionDirty = true;
-
-	private List oldSelection = Collections.EMPTY_LIST;
-
-	
-	/**
-	 * Builds the connected component set for the input projects.
-	 * The result is a DisjointSet where all related projects belong
-	 * to the same set.
-	 */
-	private static DisjointSet buildConnectedComponents(IProject[] projects) {
-		//initially each vertex is in a set by itself
-		DisjointSet set = new DisjointSet();
-		for (int i = 0; i < projects.length; i++) {
-			set.makeSet(projects[i]);
-		}
-		for (int i = 0; i < projects.length; i++) {
-			try {
-				IProject[] references = projects[i].getReferencedProjects();
-				//each reference represents an edge in the project reference
-				//digraph from projects[i] -> references[j]
-				for (int j = 0; j < references.length; j++) {
-					Object setOne = set.findSet(projects[i]);
-					//note that referenced projects may not exist in the workspace
-					Object setTwo = set.findSet(references[j]);
-					//these two projects are related, so join their sets
-					if (setOne != null && setTwo != null && setOne != setTwo)
-						set.union(setOne, setTwo);
-				}
-			} catch (CoreException e) {
-				//assume inaccessible projects have no references
-			}
-		}
-		return set;
-	}
-
-	/**
-	 * Creates this action.
-	 * 
-	 * @param shell
-	 *            The shell to use for parenting any dialogs created by this
-	 *            action.
-	 *            
-	 * @deprecated {@link #CloseUnrelatedProjectsAction(IShellProvider)}
-	 */
-	public CloseUnrelatedProjectsAction(Shell shell) {
-		super(shell, IDEWorkbenchMessages.CloseUnrelatedProjectsAction_text);
-		initAction();
-	}
-	
-	/**
-	 * Creates this action.
-	 * 
-	 * @param provider
-	 *            The shell to use for parenting any dialogs created by this
-	 *            action.
-	 * @since 3.4
-	 */
-	public CloseUnrelatedProjectsAction(IShellProvider provider){
-		super(provider, IDEWorkbenchMessages.CloseUnrelatedProjectsAction_text);
-		initAction();
-	}
-
-	/**
-     * Initializes for the constructor.
-     */
-	private void initAction(){
-		setId(ID);
-		setToolTipText(IDEWorkbenchMessages.CloseUnrelatedProjectsAction_toolTip);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IIDEHelpContextIds.CLOSE_UNRELATED_PROJECTS_ACTION);
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.SelectionListenerAction#clearCache()
-	 */
-	protected void clearCache() {
-		super.clearCache();
-		oldSelection = Collections.EMPTY_LIST;
-		selectionDirty = true;
-	}
-
-	/**
-	 * Computes the related projects of the selection.
-	 */
-	private void computeRelated(List selection) {
-		//build the connected component set for all projects in the workspace
-		DisjointSet set = buildConnectedComponents(ResourcesPlugin.getWorkspace().getRoot().getProjects());
-		//remove the connected components that the selected projects are in
-		for (Iterator it = selection.iterator(); it.hasNext();)
-			set.removeSet(it.next());
-		//the remainder of the projects in the disjoint set are unrelated to the selection
-		projectsToClose.clear();
-		set.toList(projectsToClose);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.SelectionListenerAction#getSelectedResources()
-	 */
-	protected List getSelectedResources() {
-		if (selectionDirty) {
-			List newSelection = super.getSelectedResources();
-			if (!oldSelection.equals(newSelection)) {
-				oldSelection = newSelection;
-				computeRelated(newSelection);
-			}
-			selectionDirty = false;
-		}
-		return projectsToClose;
-	}
-
-	/**
-	 * Handles a resource changed event by updating the enablement
-	 * when projects change.
-	 * <p>
-	 * This method overrides the super-type implementation to update
-	 * the selection when the open state or description of any project changes.
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-		// don't bother looking at delta if selection not applicable
-		if (selectionIsOfType(IResource.PROJECT)) {
-			IResourceDelta delta = event.getDelta();
-			if (delta != null) {
-				IResourceDelta[] projDeltas = delta.getAffectedChildren(IResourceDelta.CHANGED);
-				for (int i = 0; i < projDeltas.length; ++i) {
-					IResourceDelta projDelta = projDeltas[i];
-					//changing either the description or the open state can affect enablement
-					if ((projDelta.getFlags() & (IResourceDelta.OPEN | IResourceDelta.DESCRIPTION)) != 0) {
-						selectionChanged(getStructuredSelection());
-						return;
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CopyFilesAndFoldersOperation.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CopyFilesAndFoldersOperation.java
deleted file mode 100644
index 7f529c9..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CopyFilesAndFoldersOperation.java
+++ /dev/null
@@ -1,1723 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-import com.ibm.icu.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.WorkspaceJob;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.IOverwriteQuery;
-import org.eclipse.ui.ide.undo.AbstractWorkspaceOperation;
-import org.eclipse.ui.ide.undo.CopyResourcesOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.StatusUtil;
-import org.eclipse.ui.internal.ide.dialogs.IDEResourceInfoUtils;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.wizards.datatransfer.FileStoreStructureProvider;
-import org.eclipse.ui.wizards.datatransfer.ImportOperation;
-
-/**
- * Perform the copy of file and folder resources from the clipboard when paste
- * action is invoked.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class CopyFilesAndFoldersOperation {
-
-	/**
-	 * Status containing the errors detected when running the operation or
-	 * <code>null</code> if no errors detected.
-	 */
-	private MultiStatus errorStatus;
-
-	/**
-	 * The parent shell used to show any dialogs.
-	 */
-	private Shell messageShell;
-
-	/**
-	 * Whether or not the copy has been canceled by the user.
-	 */
-	private boolean canceled = false;
-
-	/**
-	 * Overwrite all flag.
-	 */
-	private boolean alwaysOverwrite = false;
-
-	private String[] modelProviderIds;
-
-	/**
-	 * Returns a new name for a copy of the resource at the given path in the
-	 * given workspace. This name is determined automatically.
-	 * 
-	 * @param originalName
-	 *            the full path of the resource
-	 * @param workspace
-	 *            the workspace
-	 * @return the new full path for the copy
-	 */
-	static IPath getAutoNewNameFor(IPath originalName, IWorkspace workspace) {
-		int counter = 1;
-		String resourceName = originalName.lastSegment();
-		IPath leadupSegment = originalName.removeLastSegments(1);
-
-		while (true) {
-			String nameSegment;
-
-			if (counter > 1) {
-				nameSegment = NLS
-						.bind(
-								IDEWorkbenchMessages.CopyFilesAndFoldersOperation_copyNameTwoArgs,
-								new Integer(counter), resourceName);
-			} else {
-				nameSegment = NLS
-						.bind(
-								IDEWorkbenchMessages.CopyFilesAndFoldersOperation_copyNameOneArg,
-								resourceName);
-			}
-
-			IPath pathToTry = leadupSegment.append(nameSegment);
-
-			if (!workspace.getRoot().exists(pathToTry)) {
-				return pathToTry;
-			}
-
-			counter++;
-		}
-	}
-
-	/**
-	 * Creates a new operation initialized with a shell.
-	 * 
-	 * @param shell
-	 *            parent shell for error dialogs
-	 */
-	public CopyFilesAndFoldersOperation(Shell shell) {
-		messageShell = shell;
-	}
-
-	/**
-	 * Returns whether this operation is able to perform on-the-fly
-	 * auto-renaming of resources with name collisions.
-	 * 
-	 * @return <code>true</code> if auto-rename is supported, and
-	 *         <code>false</code> otherwise
-	 */
-	protected boolean canPerformAutoRename() {
-		return true;
-	}
-
-	/**
-	 * Returns the message for querying deep copy/move of a linked resource.
-	 * 
-	 * @param source
-	 *            resource the query is made for
-	 * @return the deep query message
-	 */
-	protected String getDeepCheckQuestion(IResource source) {
-		return NLS
-				.bind(
-						IDEWorkbenchMessages.CopyFilesAndFoldersOperation_deepCopyQuestion,
-						source.getFullPath().makeRelative());
-	}
-
-	/**
-	 * Checks whether the infos exist.
-	 * 
-	 * @param stores
-	 *            the file infos to test
-	 * @return Multi status with one error message for each missing file.
-	 */
-	IStatus checkExist(IFileStore[] stores) {
-		MultiStatus multiStatus = new MultiStatus(PlatformUI.PLUGIN_ID,
-				IStatus.OK, getProblemsMessage(), null);
-
-		for (int i = 0; i < stores.length; i++) {
-			if (stores[i].fetchInfo().exists() == false) {
-				String message = NLS
-						.bind(
-								IDEWorkbenchMessages.CopyFilesAndFoldersOperation_resourceDeleted,
-								stores[i].getName());
-				IStatus status = new Status(IStatus.ERROR,
-						PlatformUI.PLUGIN_ID, IStatus.OK, message, null);
-				multiStatus.add(status);
-			}
-		}
-		return multiStatus;
-	}
-
-	/**
-	 * Checks whether the resources with the given names exist.
-	 * 
-	 * @param resources
-	 *            IResources to checl
-	 * @return Multi status with one error message for each missing file.
-	 */
-	IStatus checkExist(IResource[] resources) {
-		MultiStatus multiStatus = new MultiStatus(PlatformUI.PLUGIN_ID,
-				IStatus.OK, getProblemsMessage(), null);
-
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
-			if (resource != null) {
-				URI location = resource.getLocationURI();
-				String message = null;
-				if (location != null) {
-					IFileInfo info = IDEResourceInfoUtils.getFileInfo(location);
-					if (info == null || info.exists() == false) {
-						if (resource.isLinked()) {
-							message = NLS
-									.bind(
-											IDEWorkbenchMessages.CopyFilesAndFoldersOperation_missingLinkTarget,
-											resource.getName());
-						} else {
-							message = NLS
-									.bind(
-											IDEWorkbenchMessages.CopyFilesAndFoldersOperation_resourceDeleted,
-											resource.getName());
-						}
-					}
-				}
-				if (message != null) {
-					IStatus status = new Status(IStatus.ERROR,
-							PlatformUI.PLUGIN_ID, IStatus.OK, message, null);
-					multiStatus.add(status);
-				}
-			}
-		}
-		return multiStatus;
-	}
-
-	/**
-	 * Check if the user wishes to overwrite the supplied resource or all
-	 * resources.
-	 * 
-	 * @param source
-	 *            the source resource
-	 * @param destination
-	 *            the resource to be overwritten
-	 * @return one of IDialogConstants.YES_ID, IDialogConstants.YES_TO_ALL_ID,
-	 *         IDialogConstants.NO_ID, IDialogConstants.CANCEL_ID indicating
-	 *         whether the current resource or all resources can be overwritten,
-	 *         or if the operation should be canceled.
-	 */
-	private int checkOverwrite(final IResource source,
-			final IResource destination) {
-		final int[] result = new int[1];
-
-		// Dialogs need to be created and opened in the UI thread
-		Runnable query = new Runnable() {
-			public void run() {
-				String message;
-				int resultId[] = { IDialogConstants.YES_ID,
-						IDialogConstants.YES_TO_ALL_ID, IDialogConstants.NO_ID,
-						IDialogConstants.CANCEL_ID };
-				String labels[] = new String[] { IDialogConstants.YES_LABEL,
-						IDialogConstants.YES_TO_ALL_LABEL,
-						IDialogConstants.NO_LABEL,
-						IDialogConstants.CANCEL_LABEL };
-
-				if (destination.getType() == IResource.FOLDER) {
-					if (homogenousResources(source, destination)) {
-						message = NLS
-								.bind(
-										IDEWorkbenchMessages.CopyFilesAndFoldersOperation_overwriteMergeQuestion,
-										destination.getFullPath()
-												.makeRelative());
-					} else {
-						if (destination.isLinked()) {
-							message = NLS
-									.bind(
-											IDEWorkbenchMessages.CopyFilesAndFoldersOperation_overwriteNoMergeLinkQuestion,
-											destination.getFullPath()
-													.makeRelative());
-						} else {
-							message = NLS
-									.bind(
-											IDEWorkbenchMessages.CopyFilesAndFoldersOperation_overwriteNoMergeNoLinkQuestion,
-											destination.getFullPath()
-													.makeRelative());
-						}
-						resultId = new int[] { IDialogConstants.YES_ID,
-								IDialogConstants.NO_ID,
-								IDialogConstants.CANCEL_ID };
-						labels = new String[] { IDialogConstants.YES_LABEL,
-								IDialogConstants.NO_LABEL,
-								IDialogConstants.CANCEL_LABEL };
-					}
-				} else {
-					String[] bindings = new String[] {
-							IDEResourceInfoUtils.getLocationText(destination),
-							IDEResourceInfoUtils
-									.getDateStringValue(destination),
-							IDEResourceInfoUtils.getLocationText(source),
-							IDEResourceInfoUtils.getDateStringValue(source) };
-					message = NLS
-							.bind(
-									IDEWorkbenchMessages.CopyFilesAndFoldersOperation_overwriteWithDetailsQuestion,
-									bindings);
-				}
-				MessageDialog dialog = new MessageDialog(
-						messageShell,
-						IDEWorkbenchMessages.CopyFilesAndFoldersOperation_resourceExists,
-						null, message, MessageDialog.QUESTION, labels, 0);
-				dialog.open();
-				if (dialog.getReturnCode() == SWT.DEFAULT) {
-					// A window close returns SWT.DEFAULT, which has to be
-					// mapped to a cancel
-					result[0] = IDialogConstants.CANCEL_ID;
-				} else {
-					result[0] = resultId[dialog.getReturnCode()];
-				}
-			}
-		};
-		messageShell.getDisplay().syncExec(query);
-		return result[0];
-	}
-
-	/**
-	 * Recursively collects existing files in the specified destination path.
-	 * 
-	 * @param destinationPath
-	 *            destination path to check for existing files
-	 * @param copyResources
-	 *            resources that may exist in the destination
-	 * @param existing
-	 *            holds the collected existing files
-	 */
-	private void collectExistingReadonlyFiles(IPath destinationPath,
-			IResource[] copyResources, ArrayList existing) {
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-
-		for (int i = 0; i < copyResources.length; i++) {
-			IResource source = copyResources[i];
-			IPath newDestinationPath = destinationPath.append(source.getName());
-			IResource newDestination = workspaceRoot
-					.findMember(newDestinationPath);
-			IFolder folder;
-
-			if (newDestination == null) {
-				continue;
-			}
-			folder = getFolder(newDestination);
-			if (folder != null) {
-				IFolder sourceFolder = getFolder(source);
-
-				if (sourceFolder != null) {
-					try {
-						collectExistingReadonlyFiles(newDestinationPath,
-								sourceFolder.members(), existing);
-					} catch (CoreException exception) {
-						recordError(exception);
-					}
-				}
-			} else {
-				IFile file = getFile(newDestination);
-
-				if (file != null) {
-					if (file.isReadOnly()) {
-						existing.add(file);
-					}
-					if (getValidateConflictSource()) {
-						IFile sourceFile = getFile(source);
-						if (sourceFile != null) {
-							existing.add(sourceFile);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Copies the resources to the given destination. This method is called
-	 * recursively to merge folders during folder copy.
-	 * 
-	 * @param resources
-	 *            the resources to copy
-	 * @param destination
-	 *            destination to which resources will be copied
-	 * @param subMonitor
-	 *            a progress monitor for showing progress and for cancelation
-	 * 
-	 * @deprecated As of 3.3, the work is performed in the undoable operation
-	 *             created in
-	 *             {@link #getUndoableCopyOrMoveOperation(IResource[], IPath)}
-	 */
-	protected void copy(IResource[] resources, IPath destination,
-			IProgressMonitor subMonitor) throws CoreException {
-
-		subMonitor
-				.beginTask(
-						IDEWorkbenchMessages.CopyFilesAndFoldersOperation_CopyResourcesTask,
-						resources.length);
-
-		for (int i = 0; i < resources.length; i++) {
-			IResource source = resources[i];
-			IPath destinationPath = destination.append(source.getName());
-			IWorkspace workspace = source.getWorkspace();
-			IWorkspaceRoot workspaceRoot = workspace.getRoot();
-			IResource existing = workspaceRoot.findMember(destinationPath);
-			if (source.getType() == IResource.FOLDER && existing != null) {
-				// the resource is a folder and it exists in the destination,
-				// copy the
-				// children of the folder.
-				if (homogenousResources(source, existing)) {
-					IResource[] children = ((IContainer) source).members();
-					copy(children, destinationPath, new SubProgressMonitor(
-							subMonitor, 1));
-				} else {
-					// delete the destination folder, copying a linked folder
-					// over an unlinked one or vice versa. Fixes bug 28772.
-					delete(existing, new SubProgressMonitor(subMonitor, 0));
-					source.copy(destinationPath, IResource.SHALLOW,
-							new SubProgressMonitor(subMonitor, 1));
-				}
-			} else {
-				if (existing != null) {
-					if (homogenousResources(source, existing)) {
-						copyExisting(source, existing, new SubProgressMonitor(
-								subMonitor, 1));
-					} else {
-						// Copying a linked resource over unlinked or vice
-						// versa.
-						// Can't use setContents here. Fixes bug 28772.
-						delete(existing, new SubProgressMonitor(subMonitor, 0));
-						source.copy(destinationPath, IResource.SHALLOW,
-								new SubProgressMonitor(subMonitor, 1));
-					}
-				} else {
-					source.copy(destinationPath, IResource.SHALLOW,
-							new SubProgressMonitor(subMonitor, 1));
-
-				}
-
-				if (subMonitor.isCanceled()) {
-					throw new OperationCanceledException();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Sets the content of the existing file to the source file content.
-	 * 
-	 * @param source
-	 *            source file to copy
-	 * @param existing
-	 *            existing file to set the source content in
-	 * @param subMonitor
-	 *            a progress monitor for showing progress and for cancelation
-	 * @throws CoreException
-	 *             setContents failed
-	 */
-	private void copyExisting(IResource source, IResource existing,
-			IProgressMonitor subMonitor) throws CoreException {
-		IFile existingFile = getFile(existing);
-
-		if (existingFile != null) {
-			IFile sourceFile = getFile(source);
-
-			if (sourceFile != null) {
-				existingFile.setContents(sourceFile.getContents(),
-						IResource.KEEP_HISTORY, new SubProgressMonitor(
-								subMonitor, 0));
-			}
-		}
-	}
-
-	/**
-	 * Copies the given resources to the destination. The current Thread is
-	 * halted while the resources are copied using a WorkspaceModifyOperation.
-	 * This method should be called from the UIThread.
-	 * 
-	 * @param resources
-	 *            the resources to copy
-	 * @param destination
-	 *            destination to which resources will be copied
-	 * @return IResource[] the resulting {@link IResource}[]
-	 * @see WorkspaceModifyOperation
-	 * @see Display#getThread()
-	 * @see Thread#currentThread()
-	 */
-	public IResource[] copyResources(final IResource[] resources,
-			IContainer destination) {
-		return copyResources(resources, destination, true, null);
-	}
-
-	/**
-	 * Copies the given resources to the destination in the current Thread
-	 * without forking a new Thread or blocking using a
-	 * WorkspaceModifyOperation. It recommended that this method only be called
-	 * from a {@link WorkspaceJob} to avoid possible deadlock.
-	 * 
-	 * @param resources
-	 *            the resources to copy
-	 * @param destination
-	 *            destination to which resources will be copied
-	 * @param monitor
-	 *            the monitor that information will be sent to.
-	 * @return IResource[] the resulting {@link IResource}[]
-	 * @see WorkspaceModifyOperation
-	 * @see WorkspaceJob
-	 * @since 3.2
-	 */
-	public IResource[] copyResourcesInCurrentThread(
-			final IResource[] resources, IContainer destination,
-			IProgressMonitor monitor) {
-		return copyResources(resources, destination, false, monitor);
-	}
-
-	/**
-	 * Copies the given resources to the destination.
-	 * 
-	 * @param resources
-	 *            the resources to copy
-	 * @param destination
-	 *            destination to which resources will be copied
-	 * @return IResource[] the resulting {@link IResource}[]
-	 */
-	private IResource[] copyResources(final IResource[] resources,
-			IContainer destination, boolean fork, IProgressMonitor monitor) {
-		final IPath destinationPath = destination.getFullPath();
-		final IResource[][] copiedResources = new IResource[1][0];
-
-		// test resources for existence separate from validate API.
-		// Validate is performance critical and resource exists
-		// check is potentially slow. Fixes bugs 16129/28602.
-		IStatus resourceStatus = checkExist(resources);
-		if (resourceStatus.getSeverity() != IStatus.OK) {
-			displayError(resourceStatus);
-			return copiedResources[0];
-		}
-		String errorMsg = validateDestination(destination, resources);
-		if (errorMsg != null) {
-			displayError(errorMsg);
-			return copiedResources[0];
-		}
-
-		IRunnableWithProgress op = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor) {
-				copyResources(resources, destinationPath, copiedResources,
-						monitor);
-			}
-		};
-
-		try {
-			PlatformUI.getWorkbench().getProgressService().run(fork, true, op);
-		} catch (InterruptedException e) {
-			return copiedResources[0];
-		} catch (InvocationTargetException e) {
-			display(e);
-		}
-
-		// If errors occurred, open an Error dialog
-		if (errorStatus != null) {
-			displayError(errorStatus);
-			errorStatus = null;
-		}
-
-		return copiedResources[0];
-	}
-
-	/**
-	 * Return whether the operation is a move or a copy
-	 * 
-	 * @return whether the operation is a move or a copy
-	 * @since 3.2
-	 */
-	protected boolean isMove() {
-		return false;
-	}
-
-	private void display(InvocationTargetException e) {
-		// CoreExceptions are collected above, but unexpected runtime
-		// exceptions and errors may still occur.
-		IDEWorkbenchPlugin.getDefault().getLog().log(
-				StatusUtil.newStatus(IStatus.ERROR, MessageFormat.format(
-						"Exception in {0}.performCopy(): {1}", //$NON-NLS-1$
-						new Object[] { getClass().getName(),
-								e.getTargetException() }), null));
-		displayError(NLS
-				.bind(
-						IDEWorkbenchMessages.CopyFilesAndFoldersOperation_internalError,
-						e.getTargetException().getMessage()));
-	}
-
-	/**
-	 * Copies the given URIS and folders to the destination. The current Thread
-	 * is halted while the resources are copied using a
-	 * WorkspaceModifyOperation. This method should be called from the UI
-	 * Thread.
-	 * 
-	 * @param uris
-	 *            the URIs to copy
-	 * @param destination
-	 *            destination to which files will be copied
-	 * @see WorkspaceModifyOperation
-	 * @see Display#getThread()
-	 * @see Thread#currentThread()
-	 * @since 3.2
-	 */
-	public void copyFiles(URI[] uris, IContainer destination) {
-		IFileStore[] stores = buildFileStores(uris);
-		if (stores == null) {
-			return;
-		}
-
-		copyFileStores(destination, stores, true, null);
-	}
-
-	/**
-	 * Copies the given files and folders to the destination without forking a
-	 * new Thread or blocking using a WorkspaceModifyOperation. It is
-	 * recommended that this method only be called from a {@link WorkspaceJob}
-	 * to avoid possible deadlock.
-	 * 
-	 * @param uris
-	 *            the URIs to copy
-	 * @param destination
-	 *            destination to which URIS will be copied
-	 * @param monitor
-	 *            the monitor that information will be sent to.
-	 * @see WorkspaceModifyOperation
-	 * @see WorkspaceJob
-	 * @since 3.2
-	 */
-	public void copyFilesInCurrentThread(URI[] uris, IContainer destination,
-			IProgressMonitor monitor) {
-		IFileStore[] stores = buildFileStores(uris);
-		if (stores == null) {
-			return;
-		}
-
-		copyFileStores(destination, stores, false, monitor);
-	}
-
-	/**
-	 * Build the collection of fileStores that map to fileNames. If any of them
-	 * cannot be found then match then return <code>null</code>.
-	 * 
-	 * @param uris
-	 * @return IFileStore[]
-	 */
-	private IFileStore[] buildFileStores(URI[] uris) {
-		IFileStore[] stores = new IFileStore[uris.length];
-		for (int i = 0; i < uris.length; i++) {
-			IFileStore store;
-			try {
-				store = EFS.getStore(uris[i]);
-			} catch (CoreException e) {
-				StatusManager.getManager().handle(e, IDEWorkbenchPlugin.IDE_WORKBENCH);
-				reportFileInfoNotFound(uris[i].toString());
-				return null;
-			}
-			if (store == null) {
-				reportFileInfoNotFound(uris[i].toString());
-				return null;
-			}
-			stores[i] = store;
-		}
-		return stores;
-
-	}
-
-	/**
-	 * Copies the given files and folders to the destination. The current Thread
-	 * is halted while the resources are copied using a
-	 * WorkspaceModifyOperation. This method should be called from the UI
-	 * Thread.
-	 * 
-	 * @param fileNames
-	 *            names of the files to copy
-	 * @param destination
-	 *            destination to which files will be copied
-	 * @see WorkspaceModifyOperation
-	 * @see Display#getThread()
-	 * @see Thread#currentThread()
-	 * @since 3.2
-	 */
-	public void copyFiles(final String[] fileNames, IContainer destination) {
-		IFileStore[] stores = buildFileStores(fileNames);
-		if (stores == null) {
-			return;
-		}
-
-		copyFileStores(destination, stores, true, null);
-	}
-
-	/**
-	 * Copies the given files and folders to the destination without forking a
-	 * new Thread or blocking using a WorkspaceModifyOperation. It is
-	 * recommended that this method only be called from a {@link WorkspaceJob}
-	 * to avoid possible deadlock.
-	 * 
-	 * @param fileNames
-	 *            names of the files to copy
-	 * @param destination
-	 *            destination to which files will be copied
-	 * @param monitor
-	 *            the monitor that information will be sent to.
-	 * @see WorkspaceModifyOperation
-	 * @see WorkspaceJob
-	 * @since 3.2
-	 */
-	public void copyFilesInCurrentThread(final String[] fileNames,
-			IContainer destination, IProgressMonitor monitor) {
-		IFileStore[] stores = buildFileStores(fileNames);
-		if (stores == null) {
-			return;
-		}
-
-		copyFileStores(destination, stores, false, monitor);
-	}
-
-	/**
-	 * Build the collection of fileStores that map to fileNames. If any of them
-	 * cannot be found then match then return null.
-	 * 
-	 * @param fileNames
-	 * @return IFileStore[]
-	 */
-	private IFileStore[] buildFileStores(final String[] fileNames) {
-		IFileStore[] stores = new IFileStore[fileNames.length];
-		for (int i = 0; i < fileNames.length; i++) {
-			IFileStore store = IDEResourceInfoUtils.getFileStore(fileNames[i]);
-			if (store == null) {
-				reportFileInfoNotFound(fileNames[i]);
-				return null;
-			}
-			stores[i] = store;
-		}
-		return stores;
-	}
-
-	/**
-	 * Report that a file info could not be found.
-	 * 
-	 * @param fileName
-	 */
-	private void reportFileInfoNotFound(final String fileName) {
-
-		messageShell.getDisplay().syncExec(new Runnable() {
-			public void run() {
-				ErrorDialog
-						.openError(
-								messageShell,
-								getProblemsTitle(),
-								NLS
-										.bind(
-												IDEWorkbenchMessages.CopyFilesAndFoldersOperation_infoNotFound,
-												fileName), null);
-			}
-		});
-	}
-
-	/**
-	 * Copies the given files and folders to the destination.
-	 * 
-	 * @param stores
-	 *            the file stores to copy
-	 * @param destination
-	 *            destination to which files will be copied
-	 */
-	private void copyFileStores(IContainer destination,
-			final IFileStore[] stores, boolean fork, IProgressMonitor monitor) {
-		// test files for existence separate from validate API
-		// because an external file may not exist until the copy actually
-		// takes place (e.g., WinZip contents).
-		IStatus fileStatus = checkExist(stores);
-		if (fileStatus.getSeverity() != IStatus.OK) {
-			displayError(fileStatus);
-			return;
-		}
-		String errorMsg = validateImportDestinationInternal(destination, stores);
-		if (errorMsg != null) {
-			displayError(errorMsg);
-			return;
-		}
-		final IPath destinationPath = destination.getFullPath();
-
-		if (fork) {
-			WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
-				public void execute(IProgressMonitor monitor) {
-					copyFileStores(stores, destinationPath, monitor);
-				}
-			};
-			try {
-				PlatformUI.getWorkbench().getProgressService().run(true, true,
-						op);
-			} catch (InterruptedException e) {
-				return;
-			} catch (InvocationTargetException exception) {
-				display(exception);
-			}
-		} else {
-			copyFileStores(stores, destinationPath, monitor);
-		}
-
-		// If errors occurred, open an Error dialog
-		if (errorStatus != null) {
-			displayError(errorStatus);
-			errorStatus = null;
-		}
-	}
-
-	/**
-	 * Display the supplied status in an error dialog.
-	 * 
-	 * @param status
-	 *            The status to display
-	 */
-	private void displayError(final IStatus status) {
-		messageShell.getDisplay().syncExec(new Runnable() {
-			public void run() {
-				ErrorDialog.openError(messageShell, getProblemsTitle(), null,
-						status);
-			}
-		});
-	}
-
-	/**
-	 * Creates a file or folder handle for the source resource as if it were to
-	 * be created in the destination container.
-	 * 
-	 * @param destination
-	 *            destination container
-	 * @param source
-	 *            source resource
-	 * @return IResource file or folder handle, depending on the source type.
-	 */
-	IResource createLinkedResourceHandle(IContainer destination,
-			IResource source) {
-		IWorkspace workspace = destination.getWorkspace();
-		IWorkspaceRoot workspaceRoot = workspace.getRoot();
-		IPath linkPath = destination.getFullPath().append(source.getName());
-		IResource linkHandle;
-
-		if (source.getType() == IResource.FOLDER) {
-			linkHandle = workspaceRoot.getFolder(linkPath);
-		} else {
-			linkHandle = workspaceRoot.getFile(linkPath);
-		}
-		return linkHandle;
-	}
-
-	/**
-	 * Removes the given resource from the workspace.
-	 * 
-	 * @param resource
-	 *            resource to remove from the workspace
-	 * @param monitor
-	 *            a progress monitor for showing progress and for cancelation
-	 * @return true the resource was deleted successfully false the resource was
-	 *         not deleted because a CoreException occurred
-	 */
-	boolean delete(IResource resource, IProgressMonitor monitor) {
-		boolean force = false; // don't force deletion of out-of-sync resources
-
-		if (resource.getType() == IResource.PROJECT) {
-			// if it's a project, ask whether content should be deleted too
-			IProject project = (IProject) resource;
-			try {
-				project.delete(true, force, monitor);
-			} catch (CoreException e) {
-				recordError(e); // log error
-				return false;
-			}
-		} else {
-			// if it's not a project, just delete it
-			int flags = IResource.KEEP_HISTORY;
-			if (force) {
-				flags = flags | IResource.FORCE;
-			}
-			try {
-				resource.delete(flags, monitor);
-			} catch (CoreException e) {
-				recordError(e); // log error
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Opens an error dialog to display the given message.
-	 * 
-	 * @param message
-	 *            the error message to show
-	 */
-	private void displayError(final String message) {
-		messageShell.getDisplay().syncExec(new Runnable() {
-			public void run() {
-				MessageDialog.openError(messageShell, getProblemsTitle(),
-						message);
-			}
-		});
-	}
-
-	/**
-	 * Returns the resource either casted to or adapted to an IFile.
-	 * 
-	 * @param resource
-	 *            resource to cast/adapt
-	 * @return the resource either casted to or adapted to an IFile.
-	 *         <code>null</code> if the resource does not adapt to IFile
-	 */
-	protected IFile getFile(IResource resource) {
-		if (resource instanceof IFile) {
-			return (IFile) resource;
-		}
-		return (IFile) ((IAdaptable) resource).getAdapter(IFile.class);
-	}
-
-	/**
-	 * Returns java.io.File objects for the given file names.
-	 * 
-	 * @param fileNames
-	 *            files to return File object for.
-	 * @return java.io.File objects for the given file names.
-	 * @deprecated As of 3.3, this method is no longer in use anywhere in this
-	 *             class and is only provided for backwards compatability with
-	 *             subclasses of the receiver.
-	 */
-	protected File[] getFiles(String[] fileNames) {
-		File[] files = new File[fileNames.length];
-
-		for (int i = 0; i < fileNames.length; i++) {
-			files[i] = new File(fileNames[i]);
-		}
-		return files;
-	}
-
-	/**
-	 * Returns the resource either casted to or adapted to an IFolder.
-	 * 
-	 * @param resource
-	 *            resource to cast/adapt
-	 * @return the resource either casted to or adapted to an IFolder.
-	 *         <code>null</code> if the resource does not adapt to IFolder
-	 */
-	protected IFolder getFolder(IResource resource) {
-		if (resource instanceof IFolder) {
-			return (IFolder) resource;
-		}
-		return (IFolder) ((IAdaptable) resource).getAdapter(IFolder.class);
-	}
-
-	/**
-	 * Returns a new name for a copy of the resource at the given path in the
-	 * given workspace.
-	 * 
-	 * @param originalName
-	 *            the full path of the resource
-	 * @param workspace
-	 *            the workspace
-	 * @return the new full path for the copy, or <code>null</code> if the
-	 *         resource should not be copied
-	 */
-	private IPath getNewNameFor(final IPath originalName,
-			final IWorkspace workspace) {
-		final IResource resource = workspace.getRoot().findMember(originalName);
-		final IPath prefix = resource.getFullPath().removeLastSegments(1);
-		final String returnValue[] = { "" }; //$NON-NLS-1$
-
-		messageShell.getDisplay().syncExec(new Runnable() {
-			public void run() {
-				IInputValidator validator = new IInputValidator() {
-					public String isValid(String string) {
-						if (resource.getName().equals(string)) {
-							return IDEWorkbenchMessages.CopyFilesAndFoldersOperation_nameMustBeDifferent;
-						}
-						IStatus status = workspace.validateName(string,
-								resource.getType());
-						if (!status.isOK()) {
-							return status.getMessage();
-						}
-						if (workspace.getRoot().exists(prefix.append(string))) {
-							return IDEWorkbenchMessages.CopyFilesAndFoldersOperation_nameExists;
-						}
-						return null;
-					}
-				};
-
-				InputDialog dialog = new InputDialog(
-						messageShell,
-						IDEWorkbenchMessages.CopyFilesAndFoldersOperation_inputDialogTitle,
-						NLS
-								.bind(
-										IDEWorkbenchMessages.CopyFilesAndFoldersOperation_inputDialogMessage,
-										resource.getName()), getAutoNewNameFor(
-								originalName, workspace).lastSegment()
-								.toString(), validator);
-				dialog.setBlockOnOpen(true);
-				dialog.open();
-				if (dialog.getReturnCode() == Window.CANCEL) {
-					returnValue[0] = null;
-				} else {
-					returnValue[0] = dialog.getValue();
-				}
-			}
-		});
-		if (returnValue[0] == null) {
-			throw new OperationCanceledException();
-		}
-		return prefix.append(returnValue[0]);
-	}
-
-	/**
-	 * Returns the task title for this operation's progress dialog.
-	 * 
-	 * @return the task title
-	 */
-	protected String getOperationTitle() {
-		return IDEWorkbenchMessages.CopyFilesAndFoldersOperation_operationTitle;
-	}
-
-	/**
-	 * Returns the message for this operation's problems dialog.
-	 * 
-	 * @return the problems message
-	 */
-	protected String getProblemsMessage() {
-		return IDEWorkbenchMessages.CopyFilesAndFoldersOperation_problemMessage;
-	}
-
-	/**
-	 * Returns the title for this operation's problems dialog.
-	 * 
-	 * @return the problems dialog title
-	 */
-	protected String getProblemsTitle() {
-		return IDEWorkbenchMessages.CopyFilesAndFoldersOperation_copyFailedTitle;
-	}
-
-	/**
-	 * Returns whether the source file in a destination collision will be
-	 * validateEdited together with the collision itself. Returns false. Should
-	 * return true if the source file is to be deleted after the operation.
-	 * 
-	 * @return boolean <code>true</code> if the source file in a destination
-	 *         collision should be validateEdited. <code>false</code> if only
-	 *         the destination should be validated.
-	 */
-	protected boolean getValidateConflictSource() {
-		return false;
-	}
-
-	/**
-	 * Returns whether the given resources are either both linked or both
-	 * unlinked.
-	 * 
-	 * @param source
-	 *            source resource
-	 * @param destination
-	 *            destination resource
-	 * @return boolean <code>true</code> if both resources are either linked
-	 *         or unlinked. <code>false</code> otherwise.
-	 */
-	protected boolean homogenousResources(IResource source,
-			IResource destination) {
-		boolean isSourceLinked = source.isLinked();
-		boolean isDestinationLinked = destination.isLinked();
-
-		return (isSourceLinked && isDestinationLinked || isSourceLinked == false
-				&& isDestinationLinked == false);
-	}
-
-	/**
-	 * Returns whether the given resource is accessible. Files and folders are
-	 * always considered accessible and a project is accessible if it is open.
-	 * 
-	 * @param resource
-	 *            the resource
-	 * @return <code>true</code> if the resource is accessible, and
-	 *         <code>false</code> if it is not
-	 */
-	private boolean isAccessible(IResource resource) {
-		switch (resource.getType()) {
-		case IResource.FILE:
-			return true;
-		case IResource.FOLDER:
-			return true;
-		case IResource.PROJECT:
-			return ((IProject) resource).isOpen();
-		default:
-			return false;
-		}
-	}
-
-	/**
-	 * Returns whether any of the given source resources are being recopied to
-	 * their current container.
-	 * 
-	 * @param sourceResources
-	 *            the source resources
-	 * @param destination
-	 *            the destination container
-	 * @return <code>true</code> if at least one of the given source
-	 *         resource's parent container is the same as the destination
-	 */
-	boolean isDestinationSameAsSource(IResource[] sourceResources,
-			IContainer destination) {
-		IPath destinationLocation = destination.getLocation();
-
-		for (int i = 0; i < sourceResources.length; i++) {
-			IResource sourceResource = sourceResources[i];
-			if (sourceResource.getParent().equals(destination)) {
-				return true;
-			} else if (destinationLocation != null) {
-				// do thorough check to catch linked resources. Fixes bug 29913.
-				IPath sourceLocation = sourceResource.getLocation();
-				IPath destinationResource = destinationLocation
-						.append(sourceResource.getName());
-				if (sourceLocation != null
-						&& sourceLocation.isPrefixOf(destinationResource)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Copies the given resources to the destination container with the given
-	 * name.
-	 * <p>
-	 * Note: the destination container may need to be created prior to copying
-	 * the resources.
-	 * </p>
-	 * 
-	 * @param resources
-	 *            the resources to copy
-	 * @param destination
-	 *            the path of the destination container
-	 * @param monitor
-	 *            a progress monitor for showing progress and for cancelation
-	 * @return <code>true</code> if the copy operation completed without
-	 *         errors
-	 */
-	private boolean performCopy(IResource[] resources, IPath destination,
-			IProgressMonitor monitor) {
-		try {
-			AbstractWorkspaceOperation op = getUndoableCopyOrMoveOperation(
-					resources, destination);
-			op.setModelProviderIds(getModelProviderIds());
-			PlatformUI.getWorkbench().getOperationSupport()
-					.getOperationHistory().execute(op, monitor,
-							WorkspaceUndoUtil.getUIInfoAdapter(messageShell));
-		} catch (ExecutionException e) {
-			if (e.getCause() instanceof CoreException) {
-				recordError((CoreException) e.getCause());
-			} else {
-				IDEWorkbenchPlugin.log(e.getMessage(), e);
-				displayError(e.getMessage());
-			}
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * Individually copies the given resources to the specified destination
-	 * container checking for name collisions. If a collision is detected, it is
-	 * saved with a new name.
-	 * <p>
-	 * Note: the destination container may need to be created prior to copying
-	 * the resources.
-	 * </p>
-	 * 
-	 * @param resources
-	 *            the resources to copy
-	 * @param destination
-	 *            the path of the destination container
-	 * @return <code>true</code> if the copy operation completed without
-	 *         errors.
-	 */
-	private boolean performCopyWithAutoRename(IResource[] resources,
-			IPath destination, IProgressMonitor monitor) {
-		IWorkspace workspace = resources[0].getWorkspace();
-		IPath[] destinationPaths = new IPath[resources.length];
-		try {
-			for (int i = 0; i < resources.length; i++) {
-				IResource source = resources[i];
-				destinationPaths[i] = destination.append(source.getName());
-
-				if (workspace.getRoot().exists(destinationPaths[i])) {
-					destinationPaths[i] = getNewNameFor(destinationPaths[i],
-							workspace);
-				}
-			}
-			CopyResourcesOperation op = new CopyResourcesOperation(resources,
-					destinationPaths,
-					IDEWorkbenchMessages.CopyFilesAndFoldersOperation_copyTitle);
-			op.setModelProviderIds(getModelProviderIds());
-			PlatformUI.getWorkbench().getOperationSupport()
-					.getOperationHistory().execute(op, monitor,
-							WorkspaceUndoUtil.getUIInfoAdapter(messageShell));
-		} catch (ExecutionException e) {
-			if (e.getCause() instanceof CoreException) {
-				recordError((CoreException) e.getCause());
-			} else {
-				IDEWorkbenchPlugin.log(e.getMessage(), e);
-				displayError(e.getMessage());
-			}
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * Performs an import of the given stores into the provided container.
-	 * Returns a status indicating if the import was successful.
-	 * 
-	 * @param stores
-	 *            stores that are to be imported
-	 * @param target
-	 *            container to which the import will be done
-	 * @param monitor
-	 *            a progress monitor for showing progress and for cancelation
-	 */
-	private void performFileImport(IFileStore[] stores, IContainer target,
-			IProgressMonitor monitor) {
-		IOverwriteQuery query = new IOverwriteQuery() {
-			public String queryOverwrite(String pathString) {
-				if (alwaysOverwrite) {
-					return ALL;
-				}
-
-				final String returnCode[] = { CANCEL };
-				final String msg = NLS
-						.bind(
-								IDEWorkbenchMessages.CopyFilesAndFoldersOperation_overwriteQuestion,
-								pathString);
-				final String[] options = { IDialogConstants.YES_LABEL,
-						IDialogConstants.YES_TO_ALL_LABEL,
-						IDialogConstants.NO_LABEL,
-						IDialogConstants.CANCEL_LABEL };
-				messageShell.getDisplay().syncExec(new Runnable() {
-					public void run() {
-						MessageDialog dialog = new MessageDialog(
-								messageShell,
-								IDEWorkbenchMessages.CopyFilesAndFoldersOperation_question,
-								null, msg, MessageDialog.QUESTION, options, 0);
-						dialog.open();
-						int returnVal = dialog.getReturnCode();
-						String[] returnCodes = { YES, ALL, NO, CANCEL };
-						returnCode[0] = returnVal == -1 ? CANCEL
-								: returnCodes[returnVal];
-					}
-				});
-				if (returnCode[0] == ALL) {
-					alwaysOverwrite = true;
-				} else if (returnCode[0] == CANCEL) {
-					canceled = true;
-				}
-				return returnCode[0];
-			}
-		};
-
-		ImportOperation op = new ImportOperation(target.getFullPath(),
-				stores[0].getParent(), FileStoreStructureProvider.INSTANCE,
-				query, Arrays.asList(stores));
-		op.setContext(messageShell);
-		op.setCreateContainerStructure(false);
-		try {
-			op.run(monitor);
-		} catch (InterruptedException e) {
-			return;
-		} catch (InvocationTargetException e) {
-			if (e.getTargetException() instanceof CoreException) {
-				displayError(((CoreException) e.getTargetException())
-						.getStatus());
-			} else {
-				display(e);
-			}
-			return;
-		}
-		// Special case since ImportOperation doesn't throw a CoreException on
-		// failure.
-		IStatus status = op.getStatus();
-		if (!status.isOK()) {
-			if (errorStatus == null) {
-				errorStatus = new MultiStatus(PlatformUI.PLUGIN_ID,
-						IStatus.ERROR, getProblemsMessage(), null);
-			}
-			errorStatus.merge(status);
-		}
-	}
-
-	/**
-	 * Records the core exception to be displayed to the user once the action is
-	 * finished.
-	 * 
-	 * @param error
-	 *            a <code>CoreException</code>
-	 */
-	private void recordError(CoreException error) {
-		if (errorStatus == null) {
-			errorStatus = new MultiStatus(PlatformUI.PLUGIN_ID, IStatus.ERROR,
-					getProblemsMessage(), error);
-		}
-
-		errorStatus.merge(error.getStatus());
-	}
-
-	/**
-	 * Checks whether the destination is valid for copying the source resources.
-	 * <p>
-	 * Note this method is for internal use only. It is not API.
-	 * </p>
-	 * 
-	 * @param destination
-	 *            the destination container
-	 * @param sourceResources
-	 *            the source resources
-	 * @return an error message, or <code>null</code> if the path is valid
-	 */
-	public String validateDestination(IContainer destination,
-			IResource[] sourceResources) {
-		if (!isAccessible(destination)) {
-			return IDEWorkbenchMessages.CopyFilesAndFoldersOperation_destinationAccessError;
-		}
-		IContainer firstParent = null;
-		URI destinationLocation = destination.getLocationURI();
-		for (int i = 0; i < sourceResources.length; i++) {
-			IResource sourceResource = sourceResources[i];
-			if (firstParent == null) {
-				firstParent = sourceResource.getParent();
-			} else if (firstParent.equals(sourceResource.getParent()) == false) {
-				// Resources must have common parent. Fixes bug 33398.
-				return IDEWorkbenchMessages.CopyFilesAndFoldersOperation_parentNotEqual;
-			}
-
-			URI sourceLocation = sourceResource.getLocationURI();
-			if (sourceLocation == null) {
-				if (sourceResource.isLinked()) {
-					// Don't allow copying linked resources with undefined path
-					// variables. See bug 28754.
-					return NLS
-							.bind(
-									IDEWorkbenchMessages.CopyFilesAndFoldersOperation_missingPathVariable,
-									sourceResource.getName());
-				}
-				return NLS
-						.bind(
-								IDEWorkbenchMessages.CopyFilesAndFoldersOperation_resourceDeleted,
-								sourceResource.getName());
-
-			}
-			if (sourceLocation.equals(destinationLocation)) {
-				return NLS
-						.bind(
-								IDEWorkbenchMessages.CopyFilesAndFoldersOperation_sameSourceAndDest,
-								sourceResource.getName());
-			}
-			// is the source a parent of the destination?
-			if (new Path(sourceLocation.toString()).isPrefixOf(new Path(
-					destinationLocation.toString()))) {
-				return IDEWorkbenchMessages.CopyFilesAndFoldersOperation_destinationDescendentError;
-			}
-
-			String linkedResourceMessage = validateLinkedResource(destination,
-					sourceResource);
-			if (linkedResourceMessage != null) {
-				return linkedResourceMessage;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Validates that the given source resources can be copied to the
-	 * destination as decided by the VCM provider.
-	 * 
-	 * @param destination
-	 *            copy destination
-	 * @param sourceResources
-	 *            source resources
-	 * @return <code>true</code> all files passed validation or there were no
-	 *         files to validate. <code>false</code> one or more files did not
-	 *         pass validation.
-	 */
-	private boolean validateEdit(IContainer destination,
-			IResource[] sourceResources) {
-		ArrayList copyFiles = new ArrayList();
-
-		collectExistingReadonlyFiles(destination.getFullPath(),
-				sourceResources, copyFiles);
-		if (copyFiles.size() > 0) {
-			IFile[] files = (IFile[]) copyFiles.toArray(new IFile[copyFiles
-					.size()]);
-			IWorkspace workspace = ResourcesPlugin.getWorkspace();
-			IStatus status = workspace.validateEdit(files, messageShell);
-
-			canceled = status.isOK() == false;
-			return status.isOK();
-		}
-		return true;
-	}
-
-	/**
-	 * Checks whether the destination is valid for copying the source files.
-	 * <p>
-	 * Note this method is for internal use only. It is not API.
-	 * </p>
-	 * 
-	 * @param destination
-	 *            the destination container
-	 * @param sourceNames
-	 *            the source file names
-	 * @return an error message, or <code>null</code> if the path is valid
-	 */
-	public String validateImportDestination(IContainer destination,
-			String[] sourceNames) {
-
-		IFileStore[] stores = new IFileStore[sourceNames.length];
-		for (int i = 0; i < sourceNames.length; i++) {
-			IFileStore store = IDEResourceInfoUtils
-					.getFileStore(sourceNames[i]);
-			if (store == null) {
-				return NLS
-						.bind(
-								IDEWorkbenchMessages.CopyFilesAndFoldersOperation_infoNotFound,
-								sourceNames[i]);
-			}
-			stores[i] = store;
-		}
-		return validateImportDestinationInternal(destination, stores);
-
-	}
-
-	/**
-	 * Checks whether the destination is valid for copying the source file
-	 * stores.
-	 * <p>
-	 * Note this method is for internal use only. It is not API.
-	 * </p>
-	 * <p>
-	 * TODO Bug 117804. This method has been renamed to avoid a bug in the
-	 * Eclipse compiler with regards to visibility and type resolution when
-	 * linking.
-	 * </p>
-	 * 
-	 * @param destination
-	 *            the destination container
-	 * @param sourceStores
-	 *            the source IFileStore
-	 * @return an error message, or <code>null</code> if the path is valid
-	 */
-	private String validateImportDestinationInternal(IContainer destination,
-			IFileStore[] sourceStores) {
-		if (!isAccessible(destination))
-			return IDEWorkbenchMessages.CopyFilesAndFoldersOperation_destinationAccessError;
-
-		IFileStore destinationStore;
-		try {
-			destinationStore = EFS.getStore(destination.getLocationURI());
-		} catch (CoreException exception) {
-			IDEWorkbenchPlugin.log(exception.getLocalizedMessage(), exception);
-			return NLS
-					.bind(
-							IDEWorkbenchMessages.CopyFilesAndFoldersOperation_internalError,
-							exception.getLocalizedMessage());
-		}
-		for (int i = 0; i < sourceStores.length; i++) {
-			IFileStore sourceStore = sourceStores[i];
-			IFileStore sourceParentStore = sourceStore.getParent();
-
-			if (sourceStore != null) {
-				if (destinationStore.equals(sourceStore)
-						|| (sourceParentStore != null && destinationStore
-								.equals(sourceParentStore))) {
-					return NLS
-							.bind(
-									IDEWorkbenchMessages.CopyFilesAndFoldersOperation_importSameSourceAndDest,
-									sourceStore.getName());
-				}
-				// work around bug 16202. replacement for
-				// sourcePath.isPrefixOf(destinationPath)
-				IFileStore destinationParent = destinationStore.getParent();
-				if (sourceStore.isParentOf(destinationParent)) {
-					return IDEWorkbenchMessages.CopyFilesAndFoldersOperation_destinationDescendentError;
-				}
-
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Check if the destination is valid for the given source resource.
-	 * 
-	 * @param destination
-	 *            destination container of the operation
-	 * @param source
-	 *            source resource
-	 * @return String error message or null if the destination is valid
-	 */
-	private String validateLinkedResource(IContainer destination,
-			IResource source) {
-		if (source.isLinked() == false) {
-			return null;
-		}
-		IWorkspace workspace = destination.getWorkspace();
-		IResource linkHandle = createLinkedResourceHandle(destination, source);
-		IStatus locationStatus = workspace.validateLinkLocation(linkHandle,
-				source.getRawLocation());
-
-		if (locationStatus.getSeverity() == IStatus.ERROR) {
-			return locationStatus.getMessage();
-		}
-		IPath sourceLocation = source.getLocation();
-		if (source.getProject().equals(destination.getProject()) == false
-				&& source.getType() == IResource.FOLDER
-				&& sourceLocation != null) {
-			// prevent merging linked folders that point to the same
-			// file system folder
-			try {
-				IResource[] members = destination.members();
-				for (int j = 0; j < members.length; j++) {
-					if (sourceLocation.equals(members[j].getLocation())
-							&& source.getName().equals(members[j].getName())) {
-						return NLS
-								.bind(
-										IDEWorkbenchMessages.CopyFilesAndFoldersOperation_sameSourceAndDest,
-										source.getName());
-					}
-				}
-			} catch (CoreException exception) {
-				displayError(NLS
-						.bind(
-								IDEWorkbenchMessages.CopyFilesAndFoldersOperation_internalError,
-								exception.getMessage()));
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns whether moving all of the given source resources to the given
-	 * destination container could be done without causing name collisions.
-	 * 
-	 * @param destination
-	 *            the destination container
-	 * @param sourceResources
-	 *            the list of resources
-	 * @return <code>true</code> if there would be no name collisions, and
-	 *         <code>false</code> if there would
-	 */
-	private IResource[] validateNoNameCollisions(IContainer destination,
-			IResource[] sourceResources) {
-		List copyItems = new ArrayList();
-		IWorkspaceRoot workspaceRoot = destination.getWorkspace().getRoot();
-		int overwrite = IDialogConstants.NO_ID;
-
-		// Check to see if we would be overwriting a parent folder.
-		// Cancel entire copy operation if we do.
-		for (int i = 0; i < sourceResources.length; i++) {
-			final IResource sourceResource = sourceResources[i];
-			final IPath destinationPath = destination.getFullPath().append(
-					sourceResource.getName());
-			final IPath sourcePath = sourceResource.getFullPath();
-
-			IResource newResource = workspaceRoot.findMember(destinationPath);
-			if (newResource != null && destinationPath.isPrefixOf(sourcePath)) {
-				displayError(NLS
-						.bind(
-								IDEWorkbenchMessages.CopyFilesAndFoldersOperation_overwriteProblem,
-								destinationPath, sourcePath));
-
-				canceled = true;
-				return null;
-			}
-		}
-		// Check for overwrite conflicts
-		for (int i = 0; i < sourceResources.length; i++) {
-			final IResource source = sourceResources[i];
-			final IPath destinationPath = destination.getFullPath().append(
-					source.getName());
-
-			IResource newResource = workspaceRoot.findMember(destinationPath);
-			if (newResource != null) {
-				if (overwrite != IDialogConstants.YES_TO_ALL_ID
-						|| (newResource.getType() == IResource.FOLDER && homogenousResources(
-								source, destination) == false)) {
-					overwrite = checkOverwrite(source, newResource);
-				}
-				if (overwrite == IDialogConstants.YES_ID
-						|| overwrite == IDialogConstants.YES_TO_ALL_ID) {
-					copyItems.add(source);
-				} else if (overwrite == IDialogConstants.CANCEL_ID) {
-					canceled = true;
-					return null;
-				}
-			} else {
-				copyItems.add(source);
-			}
-		}
-		return (IResource[]) copyItems.toArray(new IResource[copyItems.size()]);
-	}
-
-	private void copyResources(final IResource[] resources,
-			final IPath destinationPath, final IResource[][] copiedResources,
-			IProgressMonitor monitor) {
-		IResource[] copyResources = resources;
-
-		// Fix for bug 31116. Do not provide a task name when
-		// creating the task.
-		monitor.beginTask("", 100); //$NON-NLS-1$
-		monitor.setTaskName(getOperationTitle());
-		monitor.worked(10); // show some initial progress
-
-		// Checks only required if this is an exisiting container path.
-		boolean copyWithAutoRename = false;
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		if (root.exists(destinationPath)) {
-			IContainer container = (IContainer) root
-					.findMember(destinationPath);
-			// If we're copying to the source container then perform
-			// auto-renames on all resources to avoid name collisions.
-			if (isDestinationSameAsSource(copyResources, container)
-					&& canPerformAutoRename()) {
-				copyWithAutoRename = true;
-			} else {
-				// If no auto-renaming will be happening, check for
-				// potential name collisions at the target resource
-				copyResources = validateNoNameCollisions(container,
-						copyResources);
-				if (copyResources == null) {
-					if (canceled) {
-						return;
-					}
-					displayError(IDEWorkbenchMessages.CopyFilesAndFoldersOperation_nameCollision);
-					return;
-				}
-				if (validateEdit(container, copyResources) == false) {
-					return;
-				}
-			}
-		}
-
-		errorStatus = null;
-		if (copyResources.length > 0) {
-			if (copyWithAutoRename) {
-				performCopyWithAutoRename(copyResources, destinationPath,
-						new SubProgressMonitor(monitor, 90));
-			} else {
-				performCopy(copyResources, destinationPath, new SubProgressMonitor(monitor, 90));
-			}
-		}
-		monitor.done();
-		copiedResources[0] = copyResources;
-	}
-
-	private void copyFileStores(final IFileStore[] stores,
-			final IPath destinationPath, IProgressMonitor monitor) {
-		// Checks only required if this is an exisiting container path.
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		if (root.exists(destinationPath)) {
-			IContainer container = (IContainer) root
-					.findMember(destinationPath);
-
-			performFileImport(stores, container, monitor);
-		}
-	}
-
-	/**
-	 * Returns the model provider ids that are known to the client that
-	 * instantiated this operation.
-	 * 
-	 * @return the model provider ids that are known to the client that
-	 *         instantiated this operation.
-	 * @since 3.2
-	 */
-	public String[] getModelProviderIds() {
-		return modelProviderIds;
-	}
-
-	/**
-	 * Sets the model provider ids that are known to the client that
-	 * instantiated this operation. Any potential side effects reported by these
-	 * models during validation will be ignored.
-	 * 
-	 * @param modelProviderIds
-	 *            the model providers known to the client who is using this
-	 *            operation.
-	 * @since 3.2
-	 */
-	public void setModelProviderIds(String[] modelProviderIds) {
-		this.modelProviderIds = modelProviderIds;
-	}
-
-	/**
-	 * Returns an AbstractWorkspaceOperation suitable for performing the move or
-	 * copy operation that will move or copy the given resources to the given
-	 * destination path.
-	 * 
-	 * @param resources
-	 *            the resources to be moved or copied
-	 * @param destinationPath
-	 *            the destination path to which the resources should be moved
-	 * @return the operation that should be used to perform the move or cop
-	 * @since 3.3
-	 */
-	protected AbstractWorkspaceOperation getUndoableCopyOrMoveOperation(
-			IResource[] resources, IPath destinationPath) {
-		return new CopyResourcesOperation(resources, destinationPath,
-				IDEWorkbenchMessages.CopyFilesAndFoldersOperation_copyTitle);
-
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CopyProjectAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CopyProjectAction.java
deleted file mode 100644
index a356770..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CopyProjectAction.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.filesystem.URIUtil;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-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.Platform;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ProjectLocationSelectionDialog;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.progress.ProgressMonitorJobsDialog;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * The CopyProjectAction is the action designed to copy projects specifically as
- * they have different semantics from other resources. Note that this action
- * assumes that a single project is selected and being manipulated. This should
- * be disabled for multi select or no selection.
- */
-public class CopyProjectAction extends SelectionListenerAction {
-	private static String COPY_TOOL_TIP = IDEWorkbenchMessages.CopyProjectAction_toolTip;
-
-	private static String COPY_TITLE = IDEWorkbenchMessages.CopyProjectAction_title;
-
-	private static String PROBLEMS_TITLE = IDEWorkbenchMessages.CopyProjectAction_copyFailedTitle;
-
-	/**
-	 * The id of this action.
-	 */
-	public static final String ID = PlatformUI.PLUGIN_ID + ".CopyProjectAction";//$NON-NLS-1$
-
-	/**
-	 * The shell in which to show any dialogs.
-	 * @deprecated the shell provider should be used instead.
-	 */
-	protected Shell shell;
-
-	/**
-	 * The IShellProvider in which to show any dialogs.
-	 * @since 3.4
-	 */
-	protected IShellProvider shellProvider;
-
-	/**
-	 * Status containing the errors detected when running the operation or
-	 * <code>null</code> if no errors detected.
-	 */
-	protected IStatus errorStatus;
-
-	private String[] modelProviderIds;
-
-	/**
-	 * Creates a new project copy action with the default text.
-	 * 
-	 * @param shell
-	 *            the shell for any dialogs
-	 * 
-	 * @deprecated {@link #CopyProjectAction(IShellProvider)}
-	 */
-	public CopyProjectAction(Shell shell) {
-		this(shell, COPY_TITLE);
-	}
-
-	/**
-	 * Creates a new project copy action with the default text.
-	 * 
-	 * @param provider
-	 * 				the IShellProvider for any dialogs
-	 * @since 3.4
-	 */
-	public CopyProjectAction(IShellProvider provider){
-		this(provider, COPY_TITLE);
-	}
-	
-	/**
-	 * Creates a new project copy action with the given text.
-	 * 
-	 * @param shell
-	 *            the shell for any dialogs
-	 * @param name
-	 *            the string used as the text for the action, or
-	 *            <code>null</code> if there is no text
-	 * 
-	 * @deprecated {@link #CopyProjectAction(IShellProvider, String)}
-	 */
-	CopyProjectAction(final Shell shell, String name) {
-		super(name);
-		Assert.isNotNull(shell);
-		shellProvider = new IShellProvider() {
-			public Shell getShell() {
-				return shell;
-			} };
-			initAction();
-	}
-	
-	/**
-	 * 
-	 * @param provider
-	 *            the IShellProvider for any dialogs
-	 * @param name
-	 *            the string used as the text for the action, or
-	 *            <code>null</code> if there is no text
-	 */
-	CopyProjectAction(IShellProvider provider, String name){
-		super(name);
-		Assert.isNotNull(provider);
-		shellProvider = provider;
-		initAction();
-	}
-	
-	private void initAction(){
-		shell = shellProvider.getShell();
-		setToolTipText(COPY_TOOL_TIP);
-		setId(CopyProjectAction.ID);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.COPY_PROJECT_ACTION);
-	}
-
-	/**
-	 * Create a new IProjectDescription for the copy using the name and path
-	 * selected from the dialog.
-	 * 
-	 * @return IProjectDescription
-	 * @param project
-	 *            the source project
-	 * @param projectName
-	 *            the name for the new project
-	 * @param rootLocation
-	 *            the path the new project will be stored under.
-	 */
-	protected IProjectDescription createDescription(IProject project,
-			String projectName, IPath rootLocation) throws CoreException {
-		// Get a copy of the current description and modify it
-		IProjectDescription newDescription = project.getDescription();
-		newDescription.setName(projectName);
-
-		// If the location is the default then set the location to null
-		if (rootLocation.equals(Platform.getLocation())) {
-			newDescription.setLocation(null);
-		} else {
-			newDescription.setLocation(rootLocation);
-		}
-
-		return newDescription;
-	}
-
-	/**
-	 * Opens an error dialog to display the given message.
-	 * <p>
-	 * Note that this method must be called from UI thread.
-	 * </p>
-	 * 
-	 * @param message
-	 *            the message
-	 */
-	void displayError(String message) {
-		MessageDialog.openError(this.shellProvider.getShell(), getErrorsTitle(), message);
-	}
-
-	/**
-	 * Return the title of the errors dialog.
-	 * 
-	 * @return java.lang.String
-	 * 
-	 * @deprecated As of 3.3, the undoable operation created by this action
-	 *             handles error dialogs.
-	 */
-	protected String getErrorsTitle() {
-		return PROBLEMS_TITLE;
-	}
-
-	/**
-	 * Get the plugin used by a copy action
-	 * 
-	 * @return AbstractUIPlugin
-	 */
-	protected org.eclipse.ui.plugin.AbstractUIPlugin getPlugin() {
-		return (AbstractUIPlugin) Platform.getPlugin(PlatformUI.PLUGIN_ID);
-	}
-
-	/**
-	 * Copies the project to the new values.
-	 * 
-	 * @param project
-	 *            the project to copy
-	 * @param projectName
-	 *            the name of the copy
-	 * @param newLocation
-	 *            URI
-	 * @return <code>true</code> if the copy operation completed, and
-	 *         <code>false</code> if it was abandoned part way
-	 */
-	boolean performCopy(final IProject project, final String projectName,
-			final URI newLocation) {
-		IRunnableWithProgress op = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor) {
-				org.eclipse.ui.ide.undo.CopyProjectOperation op = new org.eclipse.ui.ide.undo.CopyProjectOperation(
-						project, projectName, newLocation, getText());
-				op.setModelProviderIds(getModelProviderIds());
-				try {
-					PlatformUI.getWorkbench().getOperationSupport()
-							.getOperationHistory().execute(op, monitor,
-									WorkspaceUndoUtil.getUIInfoAdapter(shellProvider.getShell()));
-				} catch (ExecutionException e) {
-					if (e.getCause() instanceof CoreException) {
-						recordError((CoreException)e.getCause());
-					} else {
-						IDEWorkbenchPlugin.log(e.getMessage(), e);
-						displayError(e.getMessage());
-					}
-				}
-			}
-		};
-
-		try {
-			new ProgressMonitorJobsDialog(shellProvider.getShell()).run(true, true, op);
-		} catch (InterruptedException e) {
-			return false;
-		} catch (InvocationTargetException e) {
-			displayError(NLS.bind(
-					IDEWorkbenchMessages.CopyProjectAction_internalError, e
-							.getTargetException().getMessage()));
-			return false;
-		}
-
-		return true;
-	}
-
-	/**
-	 * Query for a new project name and destination using the parameters in the
-	 * existing project.
-	 * 
-	 * @return Object [] or null if the selection is cancelled
-	 * @param project
-	 *            the project we are going to copy.
-	 */
-	protected Object[] queryDestinationParameters(IProject project) {
-		ProjectLocationSelectionDialog dialog = new ProjectLocationSelectionDialog(
-				shellProvider.getShell(), project);
-		dialog.setTitle(IDEWorkbenchMessages.CopyProjectAction_copyTitle);
-		dialog.open();
-		return dialog.getResult();
-	}
-
-	/**
-	 * Records the core exception to be displayed to the user once the action is
-	 * finished.
-	 * 
-	 * @param error
-	 *            a <code>CoreException</code>
-	 */
-	final void recordError(CoreException error) {
-		this.errorStatus = error.getStatus();
-	}
-
-	/**
-	 * Implementation of method defined on <code>IAction</code>.
-	 */
-	public void run() {
-
-		errorStatus = null;
-
-		IProject project = (IProject) getSelectedResources().get(0);
-
-		// Get the project name and location in a two element list
-		Object[] destinationPaths = queryDestinationParameters(project);
-		if (destinationPaths == null) {
-			return;
-		}
-
-		String newName = (String) destinationPaths[0];
-		URI newLocation = URIUtil.toURI((String) destinationPaths[1]);
-
-		boolean completed = performCopy(project, newName, newLocation);
-
-        if (!completed) {
-			return; // not appropriate to show errors
-		}
-
-        // If errors occurred, open an Error dialog
-        if (errorStatus != null) {
-            ErrorDialog.openError(this.shellProvider.getShell(), getErrorsTitle(), null,
-                    errorStatus);
-            errorStatus = null;
-        }
-	}
-
-	/**
-	 * The <code>CopyResourceAction</code> implementation of this
-	 * <code>SelectionListenerAction</code> method enables this action only if
-	 * there is a single selection which is a project.
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		if (!super.updateSelection(selection)) {
-			return false;
-		}
-		if (getSelectedNonResources().size() > 0) {
-			return false;
-		}
-
-		// to enable this command there must be one project selected and nothing
-		// else
-		List selectedResources = getSelectedResources();
-		if (selectedResources.size() != 1) {
-			return false;
-		}
-		IResource source = (IResource) selectedResources.get(0);
-		if (source instanceof IProject && ((IProject) source).isOpen()) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Returns the model provider ids that are known to the client that
-	 * instantiated this operation.
-	 * 
-	 * @return the model provider ids that are known to the client that
-	 *         instantiated this operation.
-	 * @since 3.2
-	 */
-	public String[] getModelProviderIds() {
-		return modelProviderIds;
-	}
-
-	/**
-	 * Sets the model provider ids that are known to the client that
-	 * instantiated this operation. Any potential side effects reported by these
-	 * models during validation will be ignored.
-	 * 
-	 * @param modelProviderIds
-	 *            the model providers known to the client who is using this
-	 *            operation.
-	 * @since 3.2
-	 */
-	public void setModelProviderIds(String[] modelProviderIds) {
-		this.modelProviderIds = modelProviderIds;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CopyProjectOperation.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CopyProjectOperation.java
deleted file mode 100644
index c189bc1..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CopyProjectOperation.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.filesystem.URIUtil;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
-import org.eclipse.core.resources.mapping.ResourceChangeValidator;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ProjectLocationSelectionDialog;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.progress.ProgressMonitorJobsDialog;
-
-/**
- * Implementation class to perform the actual copying of project resources from
- * the clipboard when paste action is invoked.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class CopyProjectOperation {
-
-	/**
-	 * Status containing the errors detected when running the operation or
-	 * <code>null</code> if no errors detected.
-	 */
-	private MultiStatus errorStatus;
-
-	/**
-	 * The parent shell used to show any dialogs.
-	 */
-	private Shell parentShell;
-
-	private String[] modelProviderIds;
-
-	/**
-	 * Validates that the copy of the project will not have undesirable side
-	 * effects.
-	 * 
-	 * @param shell
-	 *            a shell
-	 * @param project
-	 *            the project being copied
-	 * @param newName
-	 *            the new name of the project
-	 * @param modelProviderIds
-	 *            the model provider ids of models that are known to the client
-	 *            (and can hence be ignored)
-	 * @return whether the operation should proceed
-	 * @since 3.2
-	 * @deprecated As of 3.3, validation is performed in the undoable operation
-	 *             executed by this operation.
-	 */
-	protected static boolean validateCopy(Shell shell, IProject project,
-			String newName, String[] modelProviderIds) {
-		IResourceChangeDescriptionFactory factory = ResourceChangeValidator
-				.getValidator().createDeltaFactory();
-		factory.copy(project, new Path(newName));
-		return IDE.promptToConfirm(shell,
-				IDEWorkbenchMessages.CopyProjectAction_confirm, NLS.bind(
-						IDEWorkbenchMessages.CopyProjectAction_warning, project
-								.getName()), factory.getDelta(),
-				modelProviderIds, false /* no need to sync exec */);
-	}
-
-	/**
-	 * Create a new operation initialized with a shell.
-	 * 
-	 * @param shell
-	 *            parent shell for error dialogs
-	 */
-	public CopyProjectOperation(Shell shell) {
-		parentShell = shell;
-	}
-
-	/**
-	 * Paste a copy of the project on the clipboard to the workspace.
-	 * 
-	 * @param project
-	 *            The project that is beign copied.
-	 */
-	public void copyProject(IProject project) {
-		errorStatus = null;
-
-		// Get the project name and location in a two element list
-		ProjectLocationSelectionDialog dialog = new ProjectLocationSelectionDialog(
-				parentShell, project);
-		dialog.setTitle(IDEWorkbenchMessages.CopyProjectOperation_copyProject);
-		if (dialog.open() != Window.OK) {
-			return;
-		}
-
-		Object[] destinationPaths = dialog.getResult();
-		if (destinationPaths == null) {
-			return;
-		}
-
-		String newName = (String) destinationPaths[0];
-		URI newLocation = URIUtil.toURI((String)destinationPaths[1]);
-
-		boolean completed = performProjectCopy(project, newName, newLocation);
-
-		if (!completed) {
-			return; // not appropriate to show errors
-		}
-
-		// If errors occurred, open an Error dialog
-		if (errorStatus != null) {
-			ErrorDialog.openError(parentShell,
-					IDEWorkbenchMessages.CopyProjectOperation_copyFailedTitle,
-					null, errorStatus);
-			errorStatus = null;
-		}
-	}
-
-	/**
-	 * Copies the project to the new values.
-	 * 
-	 * @param project
-	 *            the project to copy
-	 * @param projectName
-	 *            the name of the copy
-	 * @param newLocation
-	 *            IPath
-	 * @return <code>true</code> if the copy operation completed, and
-	 *         <code>false</code> if it was abandoned part way
-	 */
-	private boolean performProjectCopy(final IProject project,
-			final String projectName, final URI newLocation) {
-		IRunnableWithProgress op = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor) throws InvocationTargetException {
-				org.eclipse.ui.ide.undo.CopyProjectOperation op = new org.eclipse.ui.ide.undo.CopyProjectOperation(
-						project, projectName, newLocation,
-						IDEWorkbenchMessages.CopyProjectOperation_copyProject);
-				op.setModelProviderIds(getModelProviderIds());
-				try {
-					PlatformUI.getWorkbench().getOperationSupport()
-							.getOperationHistory().execute(
-									op,
-									monitor,
-									WorkspaceUndoUtil
-											.getUIInfoAdapter(parentShell));
-				} catch (final ExecutionException e) {
-					if (e.getCause() instanceof CoreException) {
-						recordError((CoreException)e.getCause());
-					} else {
-						throw new InvocationTargetException(e);
-					}
-				}
-			}
-		};
-
-		try {
-			new ProgressMonitorJobsDialog(parentShell).run(true, true, op);
-		} catch (InterruptedException e) {
-			return false;
-		} catch (InvocationTargetException e) {
-			final String message = e.getTargetException().getMessage();
-			parentShell.getDisplay().syncExec(new Runnable() {
-				public void run() {
-					MessageDialog
-							.openError(
-									parentShell,
-									IDEWorkbenchMessages.CopyProjectOperation_copyFailedTitle,
-									NLS
-											.bind(
-													IDEWorkbenchMessages.CopyProjectOperation_internalError,
-													message));
-				}
-			});
-			return false;
-		}
-
-		return true;
-	}
-
-    /**
-     * Records the core exception to be displayed to the user
-     * once the action is finished.
-     *
-     * @param error a <code>CoreException</code>
-     */
-    private void recordError(CoreException error) {
-
-        if (errorStatus == null) {
-			errorStatus = new MultiStatus(
-                    PlatformUI.PLUGIN_ID,
-                    IStatus.ERROR,
-                    IDEWorkbenchMessages.CopyProjectOperation_copyFailedMessage,
-                    error);
-		}
-
-        errorStatus.merge(error.getStatus());
-    }
-
-    /**
-     * Returns the model provider ids that are known to the client
-     * that instantiated this operation.
-     * 
-     * @return the model provider ids that are known to the client
-     * that instantiated this operation.
-	 * @since 3.2
-	 */
-	public String[] getModelProviderIds() {
-		return modelProviderIds;
-	}
-
-	/**
-	 * Sets the model provider ids that are known to the client that
-	 * instantiated this operation. Any potential side effects reported by these
-	 * models during validation will be ignored.
-	 * 
-	 * @param modelProviderIds
-	 *            the model providers known to the client who is using this
-	 *            operation.
-	 * @since 3.2
-	 */
-	public void setModelProviderIds(String[] modelProviderIds) {
-		this.modelProviderIds = modelProviderIds;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CopyResourceAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CopyResourceAction.java
deleted file mode 100644
index daae96c..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CopyResourceAction.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ContainerSelectionDialog;
-import org.eclipse.ui.dialogs.ISelectionValidator;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-
-/**
- * Standard action for copying the currently selected resources elsewhere
- * in the workspace. All resources being copied as a group must be siblings.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class CopyResourceAction extends SelectionListenerAction implements
-        ISelectionValidator {
-
-    /**
-     * The id of this action.
-     */
-    public static final String ID = PlatformUI.PLUGIN_ID
-            + ".CopyResourceAction"; //$NON-NLS-1$
-
-    /**
-     * The IShellProvider in which to show any dialogs.
-     */
-    protected IShellProvider shellProvider;
-
-    /**
-     * The operation to run.  This is created only during the life-cycle of the
-     * run method.
-     */
-    protected CopyFilesAndFoldersOperation operation;
-
-	private String[] modelProviderIds;
-
-    /**
-     * Returns a new name for a copy of the resource at the given path in the given
-     * workspace. This name could be determined either automatically or by querying
-     * the user. This name will <b>not</b> be verified by the caller, so it must be
-     * valid and unique.
-     * <p>
-     * Note this method is for internal use only.
-     * </p>
-     *
-     * @param originalName the full path of the resource
-     * @param workspace the workspace
-     * @return the new full path for the copy, or <code>null</code> if the resource
-     *   should not be copied
-     */
-    public static IPath getNewNameFor(IPath originalName, IWorkspace workspace) {
-        return CopyFilesAndFoldersOperation.getAutoNewNameFor(originalName,
-                workspace);
-    }
-
-    /**
-     * Creates a new action.
-     *
-     * @param shell the shell for any dialogs
-     * 
-     * @deprecated {@link #CopyResourceAction(IShellProvider)}
-     */
-    public CopyResourceAction(Shell shell) {
-        this(shell, IDEWorkbenchMessages.CopyResourceAction_title);
-    }
-    
-    /**
-     * Creates a new action
-     * 
-     * @param provider the shell for any dialogs
-     * @since 3.4
-     */
-    public CopyResourceAction(IShellProvider provider){
-    	this(provider, IDEWorkbenchMessages.CopyResourceAction_title);
-    }
-
-    /**
-     * Creates a new action with the given text.
-     *
-     * @param shell the shell for any dialogs
-     * @param name the string used as the name for the action, 
-     *   or <code>null</code> if there is no name
-     *   
-     * @deprecated {@link #CopyResourceAction(IShellProvider, String)}
-     */
-    CopyResourceAction(final Shell shell, String name) {
-        super(name);
-        Assert.isNotNull(shell);
-        shellProvider = new IShellProvider(){
-        	public Shell getShell(){
-        		return shell;
-        	}
-        };
-        initAction();
-    }
-    
-    /**
-     * Creates a new action with the given text
-     * 
-     * @param provider the shell for any dialogs
-     * @param name the string used as the name for the action, 
-     *   or <code>null</code> if there is no name
-     */
-    CopyResourceAction(IShellProvider provider, String name){
-    	super(name);
-        Assert.isNotNull(provider);
-        shellProvider = provider;
-        initAction();
-    }
-
-    /**
-     * Returns the operation to perform when this action runs.
-     * 
-     * @return the operation to perform when this action runs.
-     */
-    protected CopyFilesAndFoldersOperation createOperation() {
-        return new CopyFilesAndFoldersOperation(getShell());
-    }
-    
-    private void initAction(){
-    	setToolTipText(IDEWorkbenchMessages.CopyResourceAction_toolTip);
-        setId(CopyResourceAction.ID);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.COPY_RESOURCE_ACTION);
-    }
-
-    /**
-     * Returns the path of the container to initially select in the container
-     * selection dialog, or <code>null</code> if there is no initial selection
-     * @return The initial container; <code>null</code> if none.
-     */
-    IContainer getInitialContainer() {
-        List resources = getSelectedResources();
-        if (resources.size() > 0) {
-            IResource resource = (IResource) resources.get(0);
-            return resource.getParent();
-        }
-        return null;
-    }
-
-    /**
-     * Returns an array of resources to use for the operation from 
-     * the provided list.
-     * 
-     * @param resourceList The list of resources to converted into an array.
-     * @return an array of resources to use for the operation
-     */
-    protected IResource[] getResources(List resourceList) {
-        return (IResource[]) resourceList.toArray(new IResource[resourceList
-                .size()]);
-    }
-
-    /**
-     * Returns the shell in which to show any dialogs
-     * @return The shell for parenting dialogs; never <code>null</code>.
-     */
-    Shell getShell() {
-        return shellProvider.getShell();
-    }
-
-    /**
-     * The <code>CopyResourceAction</code> implementation of this 
-     * <code>ISelectionValidator</code> method checks whether the given path
-     * is a good place to copy the selected resources.
-     */
-    public String isValid(Object destination) {
-        IWorkspaceRoot root = IDEWorkbenchPlugin.getPluginWorkspace().getRoot();
-        IContainer container = (IContainer) root
-                .findMember((IPath) destination);
-
-        if (container != null) {
-            // create a new operation here. 
-            // isValid is API and may be called in any context.
-            CopyFilesAndFoldersOperation newOperation = createOperation();
-            List sources = getSelectedResources();
-            IResource[] resources = (IResource[]) sources
-                    .toArray(new IResource[sources.size()]);
-            return newOperation.validateDestination(container, resources);
-        }
-        return null;
-    }
-
-    /**
-     * Asks the user for the destination of this action.
-     *
-     * @return the path on an existing or new resource container, or 
-     *  <code>null</code> if the operation should be abandoned
-     */
-    IPath queryDestinationResource() {
-        // start traversal at root resource, should probably start at a
-        // better location in the tree
-        ContainerSelectionDialog dialog = new ContainerSelectionDialog(shellProvider.getShell(),
-                getInitialContainer(), true, IDEWorkbenchMessages.CopyResourceAction_selectDestination);
-        dialog.setValidator(this);
-        dialog.showClosedProjects(false);
-        dialog.open();
-        Object[] result = dialog.getResult();
-        if (result != null && result.length == 1) {
-            return (IPath) result[0];
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IAction.
-     */
-    public void run() {
-        try {
-            operation = createOperation();
-            operation.setModelProviderIds(getModelProviderIds());
-
-            // WARNING: do not query the selected resources more than once
-            // since the selection may change during the run, 
-            // e.g. due to window activation when the prompt dialog is dismissed.
-            // For more details, see Bug 60606 [Navigator] (data loss) Navigator deletes/moves the wrong file
-            List sources = getSelectedResources();
-
-            IPath destination = queryDestinationResource();
-            if (destination == null) {
-				return;
-			}
-
-            IWorkspaceRoot root = IDEWorkbenchPlugin.getPluginWorkspace()
-                    .getRoot();
-            IContainer container = (IContainer) root.findMember(destination);
-            if (container == null) {
-                return;
-            }
-
-            runOperation(getResources(sources), container);
-        } finally {
-            operation = null;
-        }
-    }
-
-    /**
-     * Runs the operation created in <code>createOperaiton</code>
-     * 
-     * @param resources source resources to pass to the operation
-     * @param destination destination container to pass to the operation
-     */
-    protected void runOperation(IResource[] resources, IContainer destination) {
-        operation.copyResources(resources, destination);
-    }
-
-    /**
-     * The <code>CopyResourceAction</code> implementation of this
-     * <code>SelectionListenerAction</code> method enables this action only if 
-     * all of the one or more selections are sibling resources which are 
-     * local (depth infinity).
-     */
-    protected boolean updateSelection(IStructuredSelection selection) {
-        if (!super.updateSelection(selection)) {
-            return false;
-        }
-        if (getSelectedNonResources().size() > 0) {
-            return false;
-        }
-
-        // to enable this command all selected resources must be siblings
-        List selectedResources = getSelectedResources();
-        if (selectedResources.size() == 0) {
-			return false;
-		}
-        IContainer firstParent = ((IResource) selectedResources.get(0))
-                .getParent();
-        if (firstParent == null) {
-            return false;
-        }
-        Iterator resourcesEnum = selectedResources.iterator();
-        while (resourcesEnum.hasNext()) {
-            IResource currentResource = (IResource) resourcesEnum.next();
-            if (!currentResource.exists()) {
-                return false;
-            }
-            if (currentResource.getType() == IResource.PROJECT) {
-                return false;
-            }
-            IContainer parent = currentResource.getParent();
-            if ((parent != null) && (!parent.equals(firstParent))) {
-                return false;
-            }
-        }
-        return true;
-    }
-    
-    /**
-     * Returns the model provider ids that are known to the client
-     * that instantiated this operation.
-     * 
-     * @return the model provider ids that are known to the client
-     * that instantiated this operation.
-     * @since 3.2
-     */
-	public String[] getModelProviderIds() {
-		return modelProviderIds;
-	}
-
-	/**
-     * Sets the model provider ids that are known to the client
-     * that instantiated this operation. Any potential side effects
-     * reported by these models during validation will be ignored.
-     * 
-	 * @param modelProviderIds the model providers known to the client
-	 * who is using this operation.
-	 * @since 3.2
-	 */
-	public void setModelProviderIds(String[] modelProviderIds) {
-		this.modelProviderIds = modelProviderIds;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CreateFileAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CreateFileAction.java
deleted file mode 100644
index f104a59..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CreateFileAction.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.util.Iterator;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.wizards.newresource.BasicNewFileResourceWizard;
-
-/**
- * Standard action for creating a file resource within the currently
- * selected folder or project.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @deprecated should use NewWizardMenu to populate a New submenu instead (see Navigator view)
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class CreateFileAction extends SelectionListenerAction {
-
-    /**
-     * The id of this action.
-     */
-    public static final String ID = PlatformUI.PLUGIN_ID + ".CreateFileAction";//$NON-NLS-1$
-
-    /**
-     * The shell in which to show any dialogs.
-     */
-    protected IShellProvider shellProvider;
-   
-    /**
-     * Creates a new action for creating a file resource.
-     *
-     * @param shell the shell for any dialogs
-     * 
-     * @deprecated {@link #CreateFileAction(IShellProvider)}
-     */
-    public CreateFileAction(final Shell shell) {
-        super(IDEWorkbenchMessages.CreateFileAction_text);
-        Assert.isNotNull(shell);
-        shellProvider = new IShellProvider(){
-        	public Shell getShell(){
-        		return shell;
-        	}
-        };
-        initAction();
-    }
-
-    /**
-     * Creates a new action for creating a file resource.
-     * 
-     * @param provider the shell for any dialogs
-     * 
-     * @deprecated see deprecated tag on class
-     * @since 3.4
-     */
-    public CreateFileAction(IShellProvider provider){
-    	super(IDEWorkbenchMessages.CreateFileAction_toolTip);
-    	Assert.isNotNull(provider);
-    	shellProvider = provider;
-    	initAction();
-    }
-    /**
-     * Initializes for the constructor.
-     */
-    private void initAction(){
-    	setToolTipText(IDEWorkbenchMessages.CreateFileAction_toolTip);
-        setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
-                .getImageDescriptor(ISharedImages.IMG_OBJ_FILE));
-        setId(ID);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.CREATE_FILE_ACTION);
-    }
-    /**
-     * The <code>CreateFileAction</code> implementation of this
-     * <code>IAction</code> method opens a <code>BasicNewFileResourceWizard</code>
-     * in a wizard dialog under the shell passed to the constructor.
-     */
-    public void run() {
-        BasicNewFileResourceWizard wizard = new BasicNewFileResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), getStructuredSelection());
-        wizard.setNeedsProgressMonitor(true);
-        WizardDialog dialog = new WizardDialog(shellProvider.getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setText(
-                IDEWorkbenchMessages.CreateFileAction_title);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(dialog.getShell(),
-                IIDEHelpContextIds.NEW_FILE_WIZARD);
-        dialog.open();
-    }
-
-    /**
-     * The <code>CreateFileAction</code> implementation of this
-     * <code>SelectionListenerAction</code> method enables the action only
-     * if the selection contains folders and open projects.
-     */
-    protected boolean updateSelection(IStructuredSelection s) {
-        if (!super.updateSelection(s)) {
-            return false;
-        }
-        Iterator resources = getSelectedResources().iterator();
-        while (resources.hasNext()) {
-            IResource resource = (IResource) resources.next();
-            if (!resourceIsType(resource, IResource.PROJECT | IResource.FOLDER)
-                    || !resource.isAccessible()) {
-                return false;
-            }
-        }
-        return true;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CreateFolderAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CreateFolderAction.java
deleted file mode 100644
index 8cd9cec..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/CreateFolderAction.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.wizards.newresource.BasicNewFolderResourceWizard;
-
-
-/**
- * Standard action for creating a folder resource within the currently
- * selected folder or project.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @deprecated should use NewWizardMenu to populate a New submenu instead (see Navigator view)
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class CreateFolderAction extends SelectionListenerAction {
-
-    /**
-     * The id of this action.
-     */
-    public static final String ID = PlatformUI.PLUGIN_ID
-            + ".CreateFolderAction";//$NON-NLS-1$
-
-    /**
-     * The shell in which to show any dialogs.
-     */
-    protected IShellProvider shellProvider;
-    
-    /**
-     * Creates a new action for creating a folder resource.
-     *
-     * @param shell the shell for any dialogs
-     * 
-     * @deprecated {@link #CreateFolderAction(IShellProvider)}
-     */
-    public CreateFolderAction(final Shell shell) {
-        super(IDEWorkbenchMessages.CreateFolderAction_text);
-        Assert.isNotNull(shell);
-        shellProvider = new IShellProvider(){
-        	public Shell getShell(){
-        		return shell;
-        	}
-        };
-        initAction();
-    }
-
-    /**
-     * Creates a new action for creating a folder resource.
-     * 
-     * @param provider the shell for any dialogs
-     * 
-     * @deprecated see deprecated tag on class
-     * @since 3.4
-     */
-    public CreateFolderAction(IShellProvider provider){
-    	super(IDEWorkbenchMessages.CreateFolderAction_text);
-    	Assert.isNotNull(provider);
-    	shellProvider = provider;
-    	initAction();
-    }
-    
-    /**
-     * Initializes for the constructor.
-     */
-    private void initAction(){
-    	setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
-                .getImageDescriptor(ISharedImages.IMG_OBJ_FOLDER));
-        setToolTipText(IDEWorkbenchMessages.CreateFolderAction_toolTip);
-        setId(ID);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.CREATE_FOLDER_ACTION);
-    }
-    
-    /**
-     * The <code>CreateFolderAction</code> implementation of this
-     * <code>IAction</code> method opens a <code>BasicNewFolderResourceWizard</code>
-     * in a wizard dialog under the shell passed to the constructor.
-     */
-    public void run() {
-        BasicNewFolderResourceWizard wizard = new BasicNewFolderResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), getStructuredSelection());
-        wizard.setNeedsProgressMonitor(true);
-        WizardDialog dialog = new WizardDialog(shellProvider.getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setText(
-                IDEWorkbenchMessages.CreateFolderAction_title);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(dialog.getShell(),
-                IIDEHelpContextIds.NEW_FOLDER_WIZARD);
-        dialog.open();
-
-    }
-
-    /**
-     * The <code>CreateFolderAction</code> implementation of this
-     * <code>SelectionListenerAction</code> method enables the action only
-     * if the selection contains folders and open projects.
-     */
-    protected boolean updateSelection(IStructuredSelection s) {
-        if (!super.updateSelection(s)) {
-            return false;
-        }
-        Iterator resources = getSelectedResources().iterator();
-        while (resources.hasNext()) {
-            IResource resource = (IResource) resources.next();
-            if (!resourceIsType(resource, IResource.PROJECT | IResource.FOLDER)
-                    || !resource.isAccessible()) {
-                return false;
-            }
-        }
-        return true;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/DeleteResourceAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/DeleteResourceAction.java
deleted file mode 100644
index 8cf525e..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/DeleteResourceAction.java
+++ /dev/null
@@ -1,637 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Benjamin Muskalla <b.muskalla@gmx.net>
- *     - Fix for bug 172574 - [IDE] DeleteProjectDialog inconsequent selection behavior
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-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.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-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.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.DeleteResourcesOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.actions.LTKLauncher;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * Standard action for deleting the currently selected resources.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class DeleteResourceAction extends SelectionListenerAction {
-
-	static class DeleteProjectDialog extends MessageDialog {
-
-		private IResource[] projects;
-
-		private boolean deleteContent = false;
-
-		/**
-		 * Control testing mode. In testing mode, it returns true to delete
-		 * contents and does not pop up the dialog.
-		 */
-		private boolean fIsTesting = false;
-
-		private Button radio1;
-
-		private Button radio2;
-
-		DeleteProjectDialog(Shell parentShell, IResource[] projects) {
-			super(parentShell, getTitle(projects), null, // accept the
-					// default window
-					// icon
-					getMessage(projects), MessageDialog.QUESTION, new String[] {
-							IDialogConstants.YES_LABEL,
-							IDialogConstants.NO_LABEL }, 0); // yes is the
-			// default
-			this.projects = projects;
-		}
-
-		static String getTitle(IResource[] projects) {
-			if (projects.length == 1) {
-				return IDEWorkbenchMessages.DeleteResourceAction_titleProject1;
-			}
-			return IDEWorkbenchMessages.DeleteResourceAction_titleProjectN;
-		}
-
-		static String getMessage(IResource[] projects) {
-			if (projects.length == 1) {
-				IProject project = (IProject) projects[0];
-				return NLS
-						.bind(
-								IDEWorkbenchMessages.DeleteResourceAction_confirmProject1,
-								project.getName());
-			}
-			return NLS.bind(
-					IDEWorkbenchMessages.DeleteResourceAction_confirmProjectN,
-					new Integer(projects.length));
-		}
-
-		/*
-		 * (non-Javadoc) Method declared on Window.
-		 */
-		protected void configureShell(Shell newShell) {
-			super.configureShell(newShell);
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell,
-					IIDEHelpContextIds.DELETE_PROJECT_DIALOG);
-		}
-
-		protected Control createCustomArea(Composite parent) {
-			Composite composite = new Composite(parent, SWT.NONE);
-			composite.setLayout(new GridLayout());
-			radio1 = new Button(composite, SWT.RADIO);
-			radio1.addSelectionListener(selectionListener);
-			String text1;
-			if (projects.length == 1) {
-				IProject project = (IProject) projects[0];
-				if (project == null || project.getLocation() == null) {
-					text1 = IDEWorkbenchMessages.DeleteResourceAction_deleteContentsN;
-				} else {
-					text1 = NLS
-							.bind(
-									IDEWorkbenchMessages.DeleteResourceAction_deleteContents1,
-									project.getLocation().toOSString());
-				}
-			} else {
-				text1 = IDEWorkbenchMessages.DeleteResourceAction_deleteContentsN;
-			}
-			radio1.setText(text1);
-			radio1.setFont(parent.getFont());
-			
-			// Add explanatory label that the action cannot be undone.
-			// We can't put multi-line formatted text in a radio button,
-			// so we have to create a separate label.
-			Label detailsLabel = new Label(composite, SWT.LEFT);
-			detailsLabel.setText(IDEWorkbenchMessages.DeleteResourceAction_deleteContentsDetails);
-			detailsLabel.setFont(parent.getFont());
-			// indent the explanatory label
-			GC gc = new GC(detailsLabel);
-			gc.setFont(detailsLabel.getParent().getFont());
-			FontMetrics fontMetrics = gc.getFontMetrics();
-			gc.dispose();
-			GridData data = new GridData();
-			data.horizontalIndent = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.INDENT);
-			detailsLabel.setLayoutData(data);
-			// add a listener so that clicking on the label selects the
-			// corresponding radio button.
-			// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=172574
-			detailsLabel.addMouseListener(new MouseAdapter() {
-				public void mouseUp(MouseEvent e) {
-					deleteContent = true;
-					radio1.setSelection(deleteContent);
-					radio2.setSelection(!deleteContent);
-				}
-			});
-			// Add a spacer label
-			new Label(composite, SWT.LEFT);
-
-			radio2 = new Button(composite, SWT.RADIO);
-			radio2.addSelectionListener(selectionListener);
-			String text2 = IDEWorkbenchMessages.DeleteResourceAction_doNotDeleteContents;
-			radio2.setText(text2);
-			radio2.setFont(parent.getFont());
-
-			// set initial state
-			radio1.setSelection(deleteContent);
-			radio2.setSelection(!deleteContent);
-
-			return composite;
-		}
-
-		private SelectionListener selectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				Button button = (Button) e.widget;
-				if (button.getSelection()) {
-					deleteContent = (button == radio1);
-				}
-			}
-		};
-
-		boolean getDeleteContent() {
-			return deleteContent;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.window.Window#open()
-		 */
-		public int open() {
-			// Override Window#open() to allow for non-interactive testing.
-			if (fIsTesting) {
-				deleteContent = true;
-				return Window.OK;
-			}
-			return super.open();
-		}
-
-		/**
-		 * Set this delete dialog into testing mode. It won't pop up, and it
-		 * returns true for deleteContent.
-		 * 
-		 * @param t
-		 *            the testing mode
-		 */
-		void setTestingMode(boolean t) {
-			fIsTesting = t;
-		}
-	}
-
-	/**
-	 * The id of this action.
-	 */
-	public static final String ID = PlatformUI.PLUGIN_ID
-			+ ".DeleteResourceAction";//$NON-NLS-1$
-	
-	private IShellProvider shellProvider = null;
-
-	/**
-	 * Whether or not we are deleting content for projects.
-	 */
-	private boolean deleteContent = false;
-
-	/**
-	 * Flag that allows testing mode ... it won't pop up the project delete
-	 * dialog, and will return "delete all content".
-	 */
-	protected boolean fTestingMode = false;
-
-	private String[] modelProviderIds;
-
-	/**
-	 * Creates a new delete resource action.
-	 * 
-	 * @param shell
-	 *            the shell for any dialogs
-	 * @deprecated Should take an IShellProvider, see
-	 *             {@link #DeleteResourceAction(IShellProvider)}
-	 */
-	public DeleteResourceAction(final Shell shell) {
-		super(IDEWorkbenchMessages.DeleteResourceAction_text);
-		Assert.isNotNull(shell);
-		initAction();
-		setShellProvider(new IShellProvider() {
-			public Shell getShell() {
-				return shell;
-			}
-		});
-	}
-
-	/**
-	 * Creates a new delete resource action.
-	 * 
-	 * @param provider
-	 *            the shell provider to use. Must not be <code>null</code>.
-	 * @since 3.4
-	 */
-	public DeleteResourceAction(IShellProvider provider) {
-		super(IDEWorkbenchMessages.DeleteResourceAction_text);
-		Assert.isNotNull(provider);
-		initAction();
-		setShellProvider(provider);
-	}
-	
-	/**
-	 * Action initialization.
-	 */
-	private void initAction() {
-		setToolTipText(IDEWorkbenchMessages.DeleteResourceAction_toolTip);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.DELETE_RESOURCE_ACTION);
-		setId(ID);
-	}
-	
-	private void setShellProvider(IShellProvider provider) {
-		shellProvider = provider;
-	}
-
-	/**
-	 * Returns whether delete can be performed on the current selection.
-	 * 
-	 * @param resources
-	 *            the selected resources
-	 * @return <code>true</code> if the resources can be deleted, and
-	 *         <code>false</code> if the selection contains non-resources or
-	 *         phantom resources
-	 */
-	private boolean canDelete(IResource[] resources) {
-		// allow only projects or only non-projects to be selected;
-		// note that the selection may contain multiple types of resource
-		if (!(containsOnlyProjects(resources) || containsOnlyNonProjects(resources))) {
-			return false;
-		}
-
-		if (resources.length == 0) {
-			return false;
-		}
-		// Return true if everything in the selection exists.
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
-			if (resource.isPhantom()) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Returns whether the selection contains linked resources.
-	 * 
-	 * @param resources
-	 *            the selected resources
-	 * @return <code>true</code> if the resources contain linked resources,
-	 *         and <code>false</code> otherwise
-	 */
-	private boolean containsLinkedResource(IResource[] resources) {
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
-			if (resource.isLinked()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Returns whether the selection contains only non-projects.
-	 * 
-	 * @param resources
-	 *            the selected resources
-	 * @return <code>true</code> if the resources contains only non-projects,
-	 *         and <code>false</code> otherwise
-	 */
-	private boolean containsOnlyNonProjects(IResource[] resources) {
-		int types = getSelectedResourceTypes(resources);
-		// check for empty selection
-		if (types == 0) {
-			return false;
-		}
-		// note that the selection may contain multiple types of resource
-		return (types & IResource.PROJECT) == 0;
-	}
-
-	/**
-	 * Returns whether the selection contains only projects.
-	 * 
-	 * @param resources
-	 *            the selected resources
-	 * @return <code>true</code> if the resources contains only projects, and
-	 *         <code>false</code> otherwise
-	 */
-	private boolean containsOnlyProjects(IResource[] resources) {
-		int types = getSelectedResourceTypes(resources);
-		// note that the selection may contain multiple types of resource
-		return types == IResource.PROJECT;
-	}
-
-	/**
-	 * Asks the user to confirm a delete operation.
-	 * 
-	 * @param resources
-	 *            the selected resources
-	 * @return <code>true</code> if the user says to go ahead, and
-	 *         <code>false</code> if the deletion should be abandoned
-	 */
-	private boolean confirmDelete(IResource[] resources) {
-		if (containsOnlyProjects(resources)) {
-			return confirmDeleteProjects(resources);
-		}
-		return confirmDeleteNonProjects(resources);
-		
-	}
-
-	/**
-	 * Asks the user to confirm a delete operation, where the selection contains
-	 * no projects.
-	 * 
-	 * @param resources
-	 *            the selected resources
-	 * @return <code>true</code> if the user says to go ahead, and
-	 *         <code>false</code> if the deletion should be abandoned
-	 */
-	private boolean confirmDeleteNonProjects(IResource[] resources) {
-		String title;
-		String msg;
-		if (resources.length == 1) {
-			title = IDEWorkbenchMessages.DeleteResourceAction_title1;
-			IResource resource = resources[0];
-			if (resource.isLinked()) {
-				msg = NLS
-						.bind(
-								IDEWorkbenchMessages.DeleteResourceAction_confirmLinkedResource1,
-								resource.getName());
-			} else {
-				msg = NLS.bind(
-						IDEWorkbenchMessages.DeleteResourceAction_confirm1,
-						resource.getName());
-			}
-		} else {
-			title = IDEWorkbenchMessages.DeleteResourceAction_titleN;
-			if (containsLinkedResource(resources)) {
-				msg = NLS
-						.bind(
-								IDEWorkbenchMessages.DeleteResourceAction_confirmLinkedResourceN,
-								new Integer(resources.length));
-			} else {
-				msg = NLS.bind(
-						IDEWorkbenchMessages.DeleteResourceAction_confirmN,
-						new Integer(resources.length));
-			}
-		}
-		return MessageDialog.openQuestion(shellProvider.getShell(), title, msg);
-	}
-
-	/**
-	 * Asks the user to confirm a delete operation, where the selection contains
-	 * only projects. Also remembers whether project content should be deleted.
-	 * 
-	 * @param resources
-	 *            the selected resources
-	 * @return <code>true</code> if the user says to go ahead, and
-	 *         <code>false</code> if the deletion should be abandoned
-	 */
-	private boolean confirmDeleteProjects(IResource[] resources) {
-		DeleteProjectDialog dialog = new DeleteProjectDialog(shellProvider.getShell(), resources);
-		dialog.setTestingMode(fTestingMode);
-		int code = dialog.open();
-		deleteContent = dialog.getDeleteContent();
-		return code == 0; // YES
-	}
-
-
-
-
-	/**
-	 * Return an array of the currently selected resources.
-	 * 
-	 * @return the selected resources
-	 */
-	private IResource[] getSelectedResourcesArray() {
-		List selection = getSelectedResources();
-		IResource[] resources = new IResource[selection.size()];
-		selection.toArray(resources);
-		return resources;
-	}
-
-	/**
-	 * Returns a bit-mask containing the types of resources in the selection.
-	 * 
-	 * @param resources
-	 *            the selected resources
-	 */
-	private int getSelectedResourceTypes(IResource[] resources) {
-		int types = 0;
-		for (int i = 0; i < resources.length; i++) {
-			types |= resources[i].getType();
-		}
-		return types;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction.
-	 */
-	public void run() {
-		final IResource[] resources = getSelectedResourcesArray();
-
-		if (!fTestingMode) {
-			if (LTKLauncher.openDeleteWizard(getStructuredSelection())) {
-				return;
-			}
-		}
-		
-		// WARNING: do not query the selected resources more than once
-		// since the selection may change during the run,
-		// e.g. due to window activation when the prompt dialog is dismissed.
-		// For more details, see Bug 60606 [Navigator] (data loss) Navigator
-		// deletes/moves the wrong file
-		if (!confirmDelete(resources)) {
-			return;
-		}
-
-		Job deletionCheckJob = new Job(IDEWorkbenchMessages.DeleteResourceAction_checkJobName) {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-			 */
-			protected IStatus run(IProgressMonitor monitor) {
-				if (resources.length == 0)
-					return Status.CANCEL_STATUS;
-				scheduleDeleteJob(resources);
-				return Status.OK_STATUS;
-			}
-			
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.runtime.jobs.Job#belongsTo(java.lang.Object)
-			 */
-			public boolean belongsTo(Object family) {
-				if (IDEWorkbenchMessages.DeleteResourceAction_jobName
-						.equals(family)) {
-					return true;
-				}
-				return super.belongsTo(family);
-			}
-		};
-
-		deletionCheckJob.schedule();
-
-	}
-
-	/**
-	 * Schedule a job to delete the resources to delete.
-	 * 
-	 * @param resourcesToDelete
-	 */
-	private void scheduleDeleteJob(final IResource[] resourcesToDelete) {
-		// use a non-workspace job with a runnable inside so we can avoid
-		// periodic updates
-		Job deleteJob = new Job(
-				IDEWorkbenchMessages.DeleteResourceAction_jobName) {
-			public IStatus run(final IProgressMonitor monitor) {
-				try {
-					final DeleteResourcesOperation op = 
-						new DeleteResourcesOperation(resourcesToDelete, IDEWorkbenchMessages.DeleteResourceAction_operationLabel, deleteContent);
-					op.setModelProviderIds(getModelProviderIds());
-					// If we are deleting projects and their content, do not
-					// execute the operation in the undo history, since it cannot be
-					// properly restored.  Just execute it directly so it won't be
-					// added to the undo history.
-					if (deleteContent && containsOnlyProjects(resourcesToDelete)) {
-						// We must compute the execution status first so that any user prompting
-						// or validation checking occurs.  Do it in a syncExec because
-						// we are calling this from a Job.
-						WorkbenchJob statusJob = new WorkbenchJob("Status checking"){ //$NON-NLS-1$
-							/* (non-Javadoc)
-							 * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
-							 */
-							public IStatus runInUIThread(
-									IProgressMonitor monitor) {
-								return op.computeExecutionStatus(monitor);
-							}
-							
-						};
-						
-						statusJob.setSystem(true);
-						statusJob.schedule();
-						try {//block until the status is ready
-							statusJob.join();
-						} catch (InterruptedException e) {
-							//Do nothing as status will be a cancel
-						}
-						
-						if (statusJob.getResult().isOK()) {
-							return op.execute(monitor, WorkspaceUndoUtil.getUIInfoAdapter(shellProvider.getShell()));
-						} 
-						return statusJob.getResult();
-					}
-					return PlatformUI.getWorkbench().getOperationSupport()
-							.getOperationHistory().execute(op, monitor, 
-							WorkspaceUndoUtil.getUIInfoAdapter(shellProvider.getShell()));
-				} catch (ExecutionException e) {
-					if (e.getCause() instanceof CoreException) {
-						return ((CoreException)e.getCause()).getStatus();
-					} 
-					return new Status(IStatus.ERROR, IDEWorkbenchPlugin.IDE_WORKBENCH, e.getMessage(),e);
-				}
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.runtime.jobs.Job#belongsTo(java.lang.Object)
-			 */
-			public boolean belongsTo(Object family) {
-				if (IDEWorkbenchMessages.DeleteResourceAction_jobName
-						.equals(family)) {
-					return true;
-				}
-				return super.belongsTo(family);
-			}
-
-		};
-		deleteJob.setUser(true);
-		deleteJob.schedule();
-	}
-
-	/**
-	 * The <code>DeleteResourceAction</code> implementation of this
-	 * <code>SelectionListenerAction</code> method disables the action if the
-	 * selection contains phantom resources or non-resources
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		return super.updateSelection(selection)
-				&& canDelete(getSelectedResourcesArray());
-	}
-
-	/**
-	 * Returns the model provider ids that are known to the client that
-	 * instantiated this operation.
-	 * 
-	 * @return the model provider ids that are known to the client that
-	 *         instantiated this operation.
-	 * @since 3.2
-	 */
-	public String[] getModelProviderIds() {
-		return modelProviderIds;
-	}
-
-	/**
-	 * Sets the model provider ids that are known to the client that
-	 * instantiated this operation. Any potential side effects reported by these
-	 * models during validation will be ignored.
-	 * 
-	 * @param modelProviderIds
-	 *            the model providers known to the client who is using this
-	 *            operation.
-	 * @since 3.2
-	 */
-	public void setModelProviderIds(String[] modelProviderIds) {
-		this.modelProviderIds = modelProviderIds;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/GlobalBuildAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/GlobalBuildAction.java
deleted file mode 100644
index df80f47..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/GlobalBuildAction.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import org.eclipse.osgi.util.NLS;
-
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.actions.BuildUtilities;
-import org.eclipse.ui.statushandlers.StatusManager;
-
-/**
- * Standard action for full and incremental builds of all projects within the
- * workspace.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class GlobalBuildAction extends Action implements
-        ActionFactory.IWorkbenchAction {
-    /**
-     * The type of build performed by this action. Can be either
-     * <code>IncrementalProjectBuilder.INCREMENTAL_BUILD</code> or
-     * <code>IncrementalProjectBuilder.FULL_BUILD</code>.
-     */
-    private int buildType;
-
-    /**
-     * The workbench window; or <code>null</code> if this action has been
-     * <code>dispose</code>d.
-     */
-    private IWorkbenchWindow workbenchWindow;
-
-    /**
-     * Creates a new action of the appropriate type. The action id is
-     * <code>IWorkbenchActionConstants.BUILD</code> for incremental builds and
-     * <code>IWorkbenchActionConstants.REBUILD_ALL</code> for full builds.
-     * 
-     * @param workbench
-     *            the active workbench
-     * @param shell
-     *            the shell for any dialogs
-     * @param type
-     *            the type of build; one of
-     *            <code>IncrementalProjectBuilder.INCREMENTAL_BUILD</code> or
-     *            <code>IncrementalProjectBuilder.FULL_BUILD</code>
-     * 
-     * @deprecated use GlobalBuildAction(IWorkbenchWindow, type) instead
-     */
-    public GlobalBuildAction(IWorkbench workbench, Shell shell, int type) {
-        // always use active window; ignore shell
-        this(workbench.getActiveWorkbenchWindow(), type);
-        Assert.isNotNull(shell);
-    }
-
-    /**
-     * Creates a new action of the appropriate type. The action id is
-     * <code>IWorkbenchActionConstants.BUILD</code> for incremental builds and
-     * <code>IWorkbenchActionConstants.REBUILD_ALL</code> for full builds.
-     * 
-     * @param window
-     *            the window in which this action appears
-     * @param type
-     *            the type of build; one of
-     *            <code>IncrementalProjectBuilder.INCREMENTAL_BUILD</code> or
-     *            <code>IncrementalProjectBuilder.FULL_BUILD</code>
-     */
-    public GlobalBuildAction(IWorkbenchWindow window, int type) {
-        Assert.isNotNull(window);
-        this.workbenchWindow = window;
-        setBuildType(type);
-    }
-
-    /**
-     * Sets the build type.
-     * 
-     * @param type
-     *            the type of build; one of
-     *            <code>IncrementalProjectBuilder.INCREMENTAL_BUILD</code> or
-     *            <code>IncrementalProjectBuilder.FULL_BUILD</code>
-     */
-    private void setBuildType(int type) {
-        // allow AUTO_BUILD as well for backwards compatibility, but treat it
-        // the same as INCREMENTAL_BUILD
-        switch (type) {
-        case IncrementalProjectBuilder.INCREMENTAL_BUILD:
-        case IncrementalProjectBuilder.AUTO_BUILD:
-            setText(IDEWorkbenchMessages.GlobalBuildAction_text);
-            setToolTipText(IDEWorkbenchMessages.GlobalBuildAction_toolTip);
-            setId("build"); //$NON-NLS-1$
-            workbenchWindow.getWorkbench().getHelpSystem().setHelp(this,
-                    IIDEHelpContextIds.GLOBAL_INCREMENTAL_BUILD_ACTION);
-            setImageDescriptor(IDEInternalWorkbenchImages
-                    .getImageDescriptor(IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC));
-            setDisabledImageDescriptor(IDEInternalWorkbenchImages
-                    .getImageDescriptor(IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC_DISABLED));
-            setActionDefinitionId("org.eclipse.ui.project.buildAll"); //$NON-NLS-1$
-            break;
-        case IncrementalProjectBuilder.FULL_BUILD:
-            setText(IDEWorkbenchMessages.GlobalBuildAction_rebuildText);
-            setToolTipText(IDEWorkbenchMessages.GlobalBuildAction_rebuildToolTip);
-            setId("rebuildAll"); //$NON-NLS-1$
-            workbenchWindow.getWorkbench().getHelpSystem().setHelp(this,
-                    IIDEHelpContextIds.GLOBAL_FULL_BUILD_ACTION);
-            setActionDefinitionId("org.eclipse.ui.project.rebuildAll"); //$NON-NLS-1$
-            break;
-        default:
-            throw new IllegalArgumentException("Invalid build type"); //$NON-NLS-1$
-        }
-        this.buildType = type;
-    }
-
-    /**
-     * Returns the shell to use.
-     */
-    private Shell getShell() {
-        return workbenchWindow.getShell();
-    }
-
-    /**
-     * Returns the operation name to use
-     */
-    private String getOperationMessage() {
-        if (buildType == IncrementalProjectBuilder.INCREMENTAL_BUILD) {
-			return IDEWorkbenchMessages.GlobalBuildAction_buildOperationTitle;
-		}
-        return IDEWorkbenchMessages.GlobalBuildAction_rebuildAllOperationTitle;
-    }
-
-    /**
-     * Builds all projects within the workspace. Does not save any open editors.
-     */
-    public void doBuild() {
-        doBuildOperation();
-    }
-
-    /**
-     * Invokes a build on all projects within the workspace. Reports any errors
-     * with the build to the user.
-     */
-    /* package */void doBuildOperation() {
-        Job buildJob = new Job(IDEWorkbenchMessages.GlobalBuildAction_jobTitle) {
-            /*
-             * (non-Javadoc)
-             * 
-             * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-             */
-            protected IStatus run(IProgressMonitor monitor) {
-                final MultiStatus status = new MultiStatus(
-                        PlatformUI.PLUGIN_ID, 0, IDEWorkbenchMessages.GlobalBuildAction_buildProblems,
-                        null);
-                monitor.beginTask(getOperationMessage(), 100);
-                try {
-                    ResourcesPlugin.getWorkspace().build(buildType,
-                            new SubProgressMonitor(monitor, 100));
-                } catch (CoreException e) {
-                    status.add(e.getStatus());
-                } finally {
-                    monitor.done();
-                }
-                return status;
-            }
-
-            /*
-             * (non-Javadoc)
-             * 
-             * @see org.eclipse.core.runtime.jobs.Job#belongsTo(java.lang.Object)
-             */
-            public boolean belongsTo(Object family) {
-                return ResourcesPlugin.FAMILY_MANUAL_BUILD == family;
-            }
-        };
-        buildJob.setRule(ResourcesPlugin.getWorkspace().getRuleFactory()
-                .buildRule());
-        buildJob.setUser(true);
-        buildJob.schedule();
-    }
-
-    /**
-     * Returns an array of all projects in the workspace
-     */
-    /* package */IProject[] getWorkspaceProjects() {
-        return ResourcesPlugin.getWorkspace().getRoot().getProjects();
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IAction.
-     * 
-     * Builds all projects within the workspace. Saves all editors prior to
-     * build depending on user's preference.
-     */
-    public void run() {
-        if (workbenchWindow == null) {
-            // action has been disposed
-            return;
-        }
-        // Do nothing if there are no projects...
-        IProject[] roots = getWorkspaceProjects();
-        if (roots.length < 1) {
-			return;
-		}
-        // Verify that there are builders registered on at
-        // least one project
-        if (!verifyBuildersAvailable(roots)) {
-			return;
-		}
-        if (!verifyNoManualRunning()) {
-			return;
-		}
-        // Save all resources prior to doing build
-        BuildUtilities.saveEditors(null);
-        // Perform the build on all the projects
-        doBuildOperation();
-    }
-
-    /**
-     * Checks that there is at least one project with a builder registered on
-     * it.
-     */
-    /* package */boolean verifyBuildersAvailable(IProject[] roots) {
-        try {
-            for (int i = 0; i < roots.length; i++) {
-                if (roots[i].isAccessible()) {
-					if (roots[i].getDescription().getBuildSpec().length > 0) {
-						return true;
-					}
-				}
-            }
-        } catch (CoreException e) {
-        	StatusManager.getManager().handle(e, IDEWorkbenchPlugin.IDE_WORKBENCH);
-            ErrorDialog
-                    .openError(
-                            getShell(),
-                            IDEWorkbenchMessages.GlobalBuildAction_buildProblems,
-                            NLS.bind(IDEWorkbenchMessages.GlobalBuildAction_internalError, e.getMessage()),
-                            e.getStatus());
-            return false;
-        }
-        return false;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on ActionFactory.IWorkbenchAction.
-     * 
-     * @since 3.0
-     */
-    public void dispose() {
-        if (workbenchWindow == null) {
-            // action has already been disposed
-            return;
-        }
-        workbenchWindow = null;
-    }
-
-    /**
-     * Verify that no manual build is running. If it is then give the use the
-     * option to cancel. If they cancel, cancel the jobs and return true,
-     * otherwise return false.
-     * 
-     * @return whether or not there is a manual build job running.
-     */
-    private boolean verifyNoManualRunning() {
-		Job[] buildJobs = Job.getJobManager().find(
-                ResourcesPlugin.FAMILY_MANUAL_BUILD);
-        if (buildJobs.length == 0) {
-			return true;
-		}
-        boolean cancel = MessageDialog.openQuestion(getShell(),
-                IDEWorkbenchMessages.GlobalBuildAction_BuildRunningTitle,
-                IDEWorkbenchMessages.GlobalBuildAction_BuildRunningMessage);
-        if (cancel) {
-            for (int i = 0; i < buildJobs.length; i++) {
-                Job job = buildJobs[i];
-                job.cancel();
-            }
-        }
-        //If they cancelled get them to do it again.
-        return false;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/MoveFilesAndFoldersOperation.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/MoveFilesAndFoldersOperation.java
deleted file mode 100644
index 8482432..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/MoveFilesAndFoldersOperation.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.ide.undo.AbstractWorkspaceOperation;
-import org.eclipse.ui.ide.undo.MoveResourcesOperation;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-
-/**
- * Moves files and folders.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @since 2.1
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class MoveFilesAndFoldersOperation extends CopyFilesAndFoldersOperation {
-
-	/**
-	 * Creates a new operation initialized with a shell.
-	 * 
-	 * @param shell
-	 *            parent shell for error dialogs
-	 */
-	public MoveFilesAndFoldersOperation(Shell shell) {
-		super(shell);
-	}
-
-	/**
-	 * Returns whether this operation is able to perform on-the-fly
-	 * auto-renaming of resources with name collisions.
-	 * 
-	 * @return <code>true</code> if auto-rename is supported, and
-	 *         <code>false</code> otherwise
-	 */
-	protected boolean canPerformAutoRename() {
-		return false;
-	}
-
-	/**
-	 * Moves the resources to the given destination. This method is called
-	 * recursively to merge folders during folder move.
-	 * 
-	 * @param resources
-	 *            the resources to move
-	 * @param destination
-	 *            destination to which resources will be moved
-	 * @param subMonitor
-	 *            a progress monitor for showing progress and for cancelation
-	 * 
-	 * @deprecated As of 3.3, the work is performed in the undoable operation
-	 *             created in
-	 *             {@link #getUndoableCopyOrMoveOperation(IResource[], IPath)}
-	 */
-	protected void copy(IResource[] resources, IPath destination,
-			IProgressMonitor subMonitor) throws CoreException {
-		for (int i = 0; i < resources.length; i++) {
-			IResource source = resources[i];
-			IPath destinationPath = destination.append(source.getName());
-			IWorkspace workspace = source.getWorkspace();
-			IWorkspaceRoot workspaceRoot = workspace.getRoot();
-			IResource existing = workspaceRoot.findMember(destinationPath);
-			if (source.getType() == IResource.FOLDER && existing != null) {
-				// the resource is a folder and it exists in the destination,
-				// move the children of the folder.
-				if (homogenousResources(source, existing)) {
-					IResource[] children = ((IContainer) source).members();
-					copy(children, destinationPath, subMonitor);
-					delete(source, subMonitor);
-				} else {
-					// delete the destination folder, moving a linked folder
-					// over an unlinked one or vice versa. Fixes bug 28772.
-					delete(existing, new SubProgressMonitor(subMonitor, 0));
-					source.move(destinationPath, IResource.SHALLOW
-							| IResource.KEEP_HISTORY, new SubProgressMonitor(
-							subMonitor, 0));
-				}
-			} else {
-				// if we're merging folders, we could be overwriting an existing
-				// file
-				if (existing != null) {
-					if (homogenousResources(source, existing)) {
-						moveExisting(source, existing, subMonitor);
-					} else {
-						// Moving a linked resource over unlinked or vice versa.
-						// Can't use setContents here. Fixes bug 28772.
-						delete(existing, new SubProgressMonitor(subMonitor, 0));
-						source.move(destinationPath, IResource.SHALLOW
-								| IResource.KEEP_HISTORY,
-								new SubProgressMonitor(subMonitor, 0));
-					}
-				} else {
-					source.move(destinationPath, IResource.SHALLOW
-							| IResource.KEEP_HISTORY, new SubProgressMonitor(
-							subMonitor, 0));
-				}
-				subMonitor.worked(1);
-				if (subMonitor.isCanceled()) {
-					throw new OperationCanceledException();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns the message for querying deep copy/move of a linked resource.
-	 * 
-	 * @param source
-	 *            resource the query is made for
-	 * @return the deep query message
-	 */
-	protected String getDeepCheckQuestion(IResource source) {
-		return NLS
-				.bind(
-						IDEWorkbenchMessages.CopyFilesAndFoldersOperation_deepMoveQuestion,
-						source.getFullPath().makeRelative());
-	}
-
-	/**
-	 * Returns the task title for this operation's progress dialog.
-	 * 
-	 * @return the task title
-	 */
-	protected String getOperationTitle() {
-		return IDEWorkbenchMessages.MoveFilesAndFoldersOperation_operationTitle;
-	}
-
-	/**
-	 * Returns the message for this operation's problems dialog.
-	 * 
-	 * @return the problems message
-	 */
-	protected String getProblemsMessage() {
-		return IDEWorkbenchMessages.MoveFilesAndFoldersOperation_problemMessage;
-	}
-
-	/**
-	 * Returns the title for this operation's problems dialog.
-	 * 
-	 * @return the problems dialog title
-	 */
-	protected String getProblemsTitle() {
-		return IDEWorkbenchMessages.MoveFilesAndFoldersOperation_moveFailedTitle;
-	}
-
-	/**
-	 * Returns whether the source file in a destination collision will be
-	 * validateEdited together with the collision itself. Returns true.
-	 * 
-	 * @return boolean <code>true</code>, the source file in a destination
-	 *         collision should be validateEdited.
-	 */
-	protected boolean getValidateConflictSource() {
-		return true;
-	}
-
-	/**
-	 * Sets the content of the existing file to the source file content. Deletes
-	 * the source file.
-	 * 
-	 * @param source
-	 *            source file to move
-	 * @param existing
-	 *            existing file to set the source content in
-	 * @param subMonitor
-	 *            a progress monitor for showing progress and for cancelation
-	 * @throws CoreException
-	 *             setContents failed
-	 * @deprecated As of 3.3, this method is not called.
-	 */
-	private void moveExisting(IResource source, IResource existing,
-			IProgressMonitor subMonitor) throws CoreException {
-		IFile existingFile = getFile(existing);
-
-		if (existingFile != null) {
-			IFile sourceFile = getFile(source);
-
-			if (sourceFile != null) {
-				existingFile.setContents(sourceFile.getContents(),
-						IResource.KEEP_HISTORY, new SubProgressMonitor(
-								subMonitor, 0));
-				delete(sourceFile, subMonitor);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Overrides method in CopyFilesAndFoldersOperation
-	 * 
-	 * Note this method is for internal use only. It is not API.
-	 * 
-	 */
-	public String validateDestination(IContainer destination,
-			IResource[] sourceResources) {
-		IPath destinationLocation = destination.getLocation();
-
-		for (int i = 0; i < sourceResources.length; i++) {
-			IResource sourceResource = sourceResources[i];
-
-			// is the source being copied onto itself?
-			if (sourceResource.getParent().equals(destination)) {
-				return NLS
-						.bind(
-								IDEWorkbenchMessages.MoveFilesAndFoldersOperation_sameSourceAndDest,
-								sourceResource.getName());
-			}
-			// test if linked source is copied onto itself. Fixes bug 29913.
-			if (destinationLocation != null) {
-				IPath sourceLocation = sourceResource.getLocation();
-				IPath destinationResource = destinationLocation
-						.append(sourceResource.getName());
-				if (sourceLocation != null
-						&& sourceLocation.isPrefixOf(destinationResource)) {
-					return NLS
-							.bind(
-									IDEWorkbenchMessages.MoveFilesAndFoldersOperation_sameSourceAndDest,
-									sourceResource.getName());
-				}
-			}
-		}
-		return super.validateDestination(destination, sourceResources);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.CopyFilesAndFoldersOperation#isMove()
-	 */
-	protected boolean isMove() {
-		return true;
-	}
-
-	/**
-	 * Returns an AbstractWorkspaceOperation suitable for performing the move or
-	 * copy operation that will move or copy the given resources to the given
-	 * destination path.
-	 * 
-	 * @param resources
-	 *            the resources to be moved or copied
-	 * @param destinationPath
-	 *            the destination path to which the resources should be moved
-	 * @return the operation that should be used to perform the move or copy
-	 * @since 3.3
-	 */
-	protected AbstractWorkspaceOperation getUndoableCopyOrMoveOperation(
-			IResource[] resources, IPath destinationPath) {
-		return new MoveResourcesOperation(resources, destinationPath,
-				IDEWorkbenchMessages.CopyFilesAndFoldersOperation_moveTitle);
-
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/MoveProjectAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/MoveProjectAction.java
deleted file mode 100644
index ffc37a8..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/MoveProjectAction.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.filesystem.URIUtil;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ProjectLocationMoveDialog;
-import org.eclipse.ui.ide.undo.MoveProjectOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.progress.ProgressMonitorJobsDialog;
-
-/**
- * The MoveProjectAction is the action designed to move projects specifically as
- * they have different semantics from other resources.
- */
-public class MoveProjectAction extends CopyProjectAction {
-	private static String MOVE_TOOL_TIP = IDEWorkbenchMessages.MoveProjectAction_toolTip;
-
-	private static String MOVE_TITLE = IDEWorkbenchMessages.MoveProjectAction_text;
-
-	private static String PROBLEMS_TITLE = IDEWorkbenchMessages.MoveProjectAction_dialogTitle;
-
-	/**
-	 * The id of this action.
-	 */
-	public static final String ID = PlatformUI.PLUGIN_ID + ".MoveProjectAction";//$NON-NLS-1$
-
-	/**
-	 * Creates a new project move action and initializes it.
-	 * 
-	 * @param shell
-	 *            the shell for any dialogs
-	 *  
-	 * @deprecated {@link #MoveProjectAction(IShellProvider)}
-	 */
-	public MoveProjectAction(Shell shell) {
-		super(shell, MOVE_TITLE);
-		initAction();
-	}
-	
-	/**
-	 * Creates a new project move action and initializes it.
-	 * @param provider
-	 * 				the IShellProvider for any dialogs
-	 * @since 3.4
-	 */
-	public MoveProjectAction(IShellProvider provider){
-		super(provider, MOVE_TITLE);
-		initAction();
-	}
-
-	private void initAction(){
-		setToolTipText(MOVE_TOOL_TIP);
-		setId(MoveProjectAction.ID);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.MOVE_PROJECT_ACTION);
-	}
-	/**
-	 * Return the title of the errors dialog.
-	 * 
-	 * @return java.lang.String
-	 * 
-	 * @deprecated As of 3.3, the error handling is performed by the undoable 
-	 * operation which handles the move.
-	 */
-	protected String getErrorsTitle() {
-		return PROBLEMS_TITLE;
-	}
-
-	/**
-	 * Moves the project to the new values.
-	 * 
-	 * @param project
-	 *            the project to move
-	 * @param newLocation
-	 *            URI
-	 * @return <code>true</code> if the copy operation completed, and
-	 *         <code>false</code> if it was abandoned part way
-	 */
-	boolean performMove(final IProject project, 
-			final URI newLocation) {
-		
-		IRunnableWithProgress op =  new IRunnableWithProgress() {
-    		public void run(IProgressMonitor monitor) {
-    			MoveProjectOperation op = new MoveProjectOperation(project, newLocation, IDEWorkbenchMessages.MoveProjectAction_moveTitle);
-    			op.setModelProviderIds(getModelProviderIds());
-    			try {
-    				PlatformUI.getWorkbench().getOperationSupport()
-    						.getOperationHistory().execute(op, monitor, 
-    								WorkspaceUndoUtil.getUIInfoAdapter(shellProvider.getShell()));
-    			} catch (ExecutionException e) {
-					if (e.getCause() instanceof CoreException) {
-						recordError((CoreException)e.getCause());
-					} else {
-						IDEWorkbenchPlugin.log(e.getMessage(), e);
-						displayError(e.getMessage());
-					}
-    			}
-    		}
-    	};
-		
-		try {
-			new ProgressMonitorJobsDialog(shellProvider.getShell()).run(true, true, op);
-		} catch (InterruptedException e) {
-			return false;
-		} catch (InvocationTargetException e) {
-			// CoreExceptions are collected by the operation, but unexpected runtime
-			// exceptions and errors may still occur.
-			IDEWorkbenchPlugin.log(getClass(),
-                    "performMove()", e.getTargetException()); //$NON-NLS-1$
-			displayError(NLS.bind(IDEWorkbenchMessages.MoveProjectAction_internalError, e.getTargetException().getMessage()));
-			return false;
-		}
-
-		return true;
-	}
-
-	/**
-	 * Query for a new project destination using the parameters in the existing
-	 * project.
-	 * 
-	 * @return Object[] or null if the selection is cancelled
-	 * @param project
-	 *            the project we are going to move.
-	 */
-	protected Object[] queryDestinationParameters(IProject project) {
-		ProjectLocationMoveDialog dialog = new ProjectLocationMoveDialog(shellProvider.getShell(),
-				project);
-		dialog.setTitle(IDEWorkbenchMessages.MoveProjectAction_moveTitle);
-		dialog.open();
-		return dialog.getResult();
-	}
-
-	/**
-	 * Implementation of method defined on <code>IAction</code>.
-	 */
-	public void run() {
-
-		errorStatus = null;
-
-		IProject project = (IProject) getSelectedResources().get(0);
-
-		//Get the project name and location 
-		Object[] destinationPaths = queryDestinationParameters(project);
-		if (destinationPaths == null) {
-			return;
-		}
-
-		// Ideally we would have gotten the URI directly from the
-		// ProjectLocationDialog, but for backward compatibility, we
-		// use the raw string and map back to a URI.  
-		URI newLocation = URIUtil.toURI((String)destinationPaths[1]);
-		
-		
-		boolean completed = performMove(project, newLocation);
-
-		if (!completed) {
-			return; // not appropriate to show errors
-		}
-
-		// If errors occurred, open an Error dialog
-		if (errorStatus != null) {
-			ErrorDialog
-					.openError(this.shellProvider.getShell(), PROBLEMS_TITLE, null, errorStatus);
-			errorStatus = null;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/MoveResourceAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/MoveResourceAction.java
deleted file mode 100644
index 3e69d53..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/MoveResourceAction.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.actions.LTKLauncher;
-
-/**
- * Standard action for moving the currently selected resources elsewhere
- * in the workspace. All resources being moved as a group must be siblings.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class MoveResourceAction extends CopyResourceAction {
-
-    /**
-     * The id of this action.
-     */
-    public static final String ID = PlatformUI.PLUGIN_ID
-            + ".MoveResourceAction"; //$NON-NLS-1$
-
-    /**
-     * Keep a list of destinations so that any required update can be done after the
-     * move.
-     */
-    protected List destinations;
-
-    /**
-     * Creates a new action.
-     *
-     * @param shell the shell for any dialogs
-     * 
-     * @deprecated {@link #MoveResourceAction(IShellProvider)}
-     */
-    public MoveResourceAction(Shell shell) {
-        super(shell, IDEWorkbenchMessages.MoveResourceAction_text);
-        initAction();
-    }
-
-    /**
-     * Creates a new action.
-     * 
-     * @param provider the shell for any dialogs.
-     * @since 3.4
-     */
-    public MoveResourceAction(IShellProvider provider){
-    	super(provider, IDEWorkbenchMessages.MoveResourceAction_text);
-    	initAction();
-    }
-    
-    /**
-     * Initializes the workbench
-     */
-    private void initAction(){
-    	setToolTipText(IDEWorkbenchMessages.MoveResourceAction_toolTip);
-        setId(MoveResourceAction.ID);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.MOVE_RESOURCE_ACTION);
-    }
-    
-    /* (non-Javadoc)
-     * Overrides method in CopyResourceAction
-     */
-    protected CopyFilesAndFoldersOperation createOperation() {
-        return new MoveFilesAndFoldersOperation(getShell());
-    }
-
-    /**
-     * Returns the destination resources for the resources that have been moved so far.
-     *
-     * @return list of destination <code>IResource</code>s
-     */
-    protected List getDestinations() {
-        return destinations;
-    }
-
-    /* (non-Javadoc)
-     * Overrides method in CopyResourceAction
-     */
-    protected IResource[] getResources(List resourceList) {
-        ReadOnlyStateChecker checker = new ReadOnlyStateChecker(getShell(),
-                IDEWorkbenchMessages.MoveResourceAction_title,
-                IDEWorkbenchMessages.MoveResourceAction_checkMoveMessage);
-        return checker.checkReadOnlyResources(super.getResources(resourceList));
-    }
-
-    /* (non-Javadoc)
-     * Overrides method in CopyResourceAction
-     */
-    protected void runOperation(IResource[] resources, IContainer destination) {
-        //Initialize the destinations
-        destinations = new ArrayList();
-        IResource[] copiedResources = operation.copyResources(resources,
-                destination);
-
-        for (int i = 0; i < copiedResources.length; i++) {
-            destinations.add(destination.getFullPath().append(
-                    copiedResources[i].getName()));
-        }
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.actions.CopyResourceAction#run()
-     */
-    public void run() {
-		if (LTKLauncher.openMoveWizard(getStructuredSelection())) {
-			return;
-		}
-		super.run();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/NewExampleAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/NewExampleAction.java
deleted file mode 100644
index c3fe094..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/NewExampleAction.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.dialogs.NewWizard;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.registry.WizardsRegistryReader;
-
-/**
- * Standard action for launching the create project selection
- * wizard.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class NewExampleAction extends Action {
-
-    /**
-     * The wizard dialog width
-     */
-    private static final int SIZING_WIZARD_WIDTH = 500;
-
-    /**
-     * The wizard dialog height
-     */
-    private static final int SIZING_WIZARD_HEIGHT = 500;
-
-    /**
-     * The workbench window this action will run in
-     */
-    private IWorkbenchWindow window;
-
-    /**
-     * This default constructor allows the the action to be called from the welcome page.
-     */
-    public NewExampleAction() {
-        this(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
-    }
-
-    /**
-     * Creates a new action for launching the new project
-     * selection wizard.
-     *
-     * @param window the workbench window to query the current
-     * 		selection and shell for opening the wizard.
-     */
-    public NewExampleAction(IWorkbenchWindow window) {
-        super(IDEWorkbenchMessages.NewExampleAction_text);
-        if (window == null) {
-            throw new IllegalArgumentException();
-        }
-        this.window = window;
-        ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
-        setImageDescriptor(images
-                .getImageDescriptor(ISharedImages.IMG_TOOL_NEW_WIZARD));
-        setDisabledImageDescriptor(images
-                .getImageDescriptor(ISharedImages.IMG_TOOL_NEW_WIZARD_DISABLED));
-        setToolTipText(IDEWorkbenchMessages.NewExampleAction_toolTip);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				org.eclipse.ui.internal.IWorkbenchHelpContextIds.NEW_ACTION);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IAction.
-     */
-    public void run() {
-        // Create wizard selection wizard.
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        NewWizard wizard = new NewWizard();
-        wizard
-                .setCategoryId(WizardsRegistryReader.FULL_EXAMPLES_WIZARD_CATEGORY);
-
-        ISelection selection = window.getSelectionService().getSelection();
-        IStructuredSelection selectionToPass = StructuredSelection.EMPTY;
-        if (selection instanceof IStructuredSelection) {
-			selectionToPass = (IStructuredSelection) selection;
-		}
-        wizard.init(workbench, selectionToPass);
-        IDialogSettings workbenchSettings = IDEWorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("NewWizardAction"); //$NON-NLS-1$
-        if (wizardSettings == null) {
-			wizardSettings = workbenchSettings.addNewSection("NewWizardAction"); //$NON-NLS-1$
-		}
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-
-        // Create wizard dialog.
-        Shell parent = window.getShell();
-        WizardDialog dialog = new WizardDialog(parent, wizard);
-        dialog.create();
-        wizard.setWindowTitle(IDEWorkbenchMessages.NewExample_title);
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(dialog.getShell(),
-                IIDEHelpContextIds.NEW_PROJECT_WIZARD);
-
-        // Open wizard.
-        dialog.open();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/NewProjectAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/NewProjectAction.java
deleted file mode 100644
index 2a52807..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/NewProjectAction.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.dialogs.NewWizard;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-
-/**
- * Standard action for launching the create project selection
- * wizard.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class NewProjectAction extends Action {
-
-    /**
-     * The wizard dialog width
-     */
-    private static final int SIZING_WIZARD_WIDTH = 500;
-
-    /**
-     * The wizard dialog height
-     */
-    private static final int SIZING_WIZARD_HEIGHT = 500;
-
-    /**
-     * The workbench window this action will run in
-     */
-    private IWorkbenchWindow window;
-
-    /**
-     * This default constructor allows the the action to be called from the welcome page.
-     */
-    public NewProjectAction() {
-        this(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
-    }
-
-    /**
-     * Creates a new action for launching the new project
-     * selection wizard.
-     *
-     * @param window the workbench window to query the current
-     * 		selection and shell for opening the wizard.
-     */
-    public NewProjectAction(IWorkbenchWindow window) {
-        super(IDEWorkbenchMessages.NewProjectAction_text);
-        if (window == null) {
-            throw new IllegalArgumentException();
-        }
-        this.window = window;
-        ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
-        setImageDescriptor(images
-                .getImageDescriptor(ISharedImages.IMG_TOOL_NEW_WIZARD));
-        setDisabledImageDescriptor(images
-                .getImageDescriptor(ISharedImages.IMG_TOOL_NEW_WIZARD_DISABLED));
-        setToolTipText(IDEWorkbenchMessages.NewProjectAction_toolTip);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				org.eclipse.ui.internal.IWorkbenchHelpContextIds.NEW_ACTION);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IAction.
-     */
-    public void run() {
-        // Create wizard selection wizard.
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        NewWizard wizard = new NewWizard();
-        wizard.setProjectsOnly(true);
-        ISelection selection = window.getSelectionService().getSelection();
-        IStructuredSelection selectionToPass = StructuredSelection.EMPTY;
-        if (selection instanceof IStructuredSelection) {
-			selectionToPass = (IStructuredSelection) selection;
-		}
-        wizard.init(workbench, selectionToPass);
-        IDialogSettings workbenchSettings = IDEWorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("NewWizardAction");//$NON-NLS-1$
-        if (wizardSettings == null) {
-			wizardSettings = workbenchSettings.addNewSection("NewWizardAction");//$NON-NLS-1$
-		}
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-
-        // Create wizard dialog.
-        WizardDialog dialog = new WizardDialog(null, wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(dialog.getShell(),
-                IIDEHelpContextIds.NEW_PROJECT_WIZARD);
-
-        // Open wizard.
-        dialog.open();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/NewWizardMenu.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/NewWizardMenu.java
deleted file mode 100644
index 60e56a1..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/NewWizardMenu.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IContributionManager;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.actions.NewWizardShortcutAction;
-import org.eclipse.ui.internal.dialogs.WorkbenchWizardElement;
-import org.eclipse.ui.internal.registry.WizardsRegistryReader;
-import org.eclipse.ui.wizards.IWizardDescriptor;
-
-/**
- * A <code>NewWizardMenu</code> augments <code>BaseNewWizardMenu</code> with IDE-specific
- * actions: New Project... (always shown) and New Example... (shown only if there are example wizards installed).
- */
-public class NewWizardMenu extends BaseNewWizardMenu {
-
-    private final IAction newExampleAction;
-    private final IAction newProjectAction;
-
-    private boolean enabled = true;
-
-    /**
-     * Creates a new wizard shortcut menu for the IDE.
-     * 
-     * @param window
-     *            the window containing the menu
-     */
-    public NewWizardMenu(IWorkbenchWindow window) {
-        this(window, null);
-        
-    }
-    
-    /**
-     * Creates a new wizard shortcut menu for the IDE.
-     * 
-     * @param window
-     *            the window containing the menu
-     * @param id
-     *            the identifier for this contribution item 
-     */
-    public NewWizardMenu(IWorkbenchWindow window, String id) {
-        super(window, id);
-        newExampleAction = new NewExampleAction(window);
-        newProjectAction = new NewProjectAction(window);
-    }
-
-    /**
-     * Create a new wizard shortcut menu.  
-     * <p>
-     * If the menu will appear on a semi-permanent basis, for instance within
-     * a toolbar or menubar, the value passed for <code>register</code> should be true.
-     * If set, the menu will listen to perspective activation and update itself
-     * to suit.  In this case clients are expected to call <code>deregister</code> 
-     * when the menu is no longer needed.  This will unhook any perspective
-     * listeners.
-     * </p>
-     *
-     * @param innerMgr the location for the shortcut menu contents
-     * @param window the window containing the menu
-     * @param register if <code>true</code> the menu listens to perspective changes in
-     *      the window
-     * @deprecated use NewWizardMenu(IWorkbenchWindow) instead
-     */
-    public NewWizardMenu(IMenuManager innerMgr, IWorkbenchWindow window,
-            boolean register) {
-        this(window, null);
-        fillMenu(innerMgr);
-        // Must be done after constructor to ensure field initialization.
-    }
-    
-    /* (non-Javadoc)
-     * Fills the menu with New Wizards.
-     */
-    private void fillMenu(IContributionManager innerMgr) {
-        // Remove all.
-        innerMgr.removeAll();
-
-        IContributionItem[] items = getContributionItems();
-        for (int i = 0; i < items.length; i++) {
-            innerMgr.add(items[i]);
-        }
-    }
-
-    /**
-     * Removes all listeners from the containing workbench window.
-     * <p>
-     * This method should only be called if the shortcut menu is created with
-     * <code>register = true</code>.
-     * </p>
-     * 
-     * @deprecated has no effect
-     */
-    public void deregisterListeners() {
-        // do nothing
-    }
-
-    /**
-     * Return whether or not any examples are in the current install.
-     * 
-     * @return boolean
-     */
-    private boolean hasExamples() {
-        return registryHasCategory(WizardsRegistryReader.FULL_EXAMPLES_WIZARD_CATEGORY);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.actions.BaseNewWizardMenu#addItems(org.eclipse.jface.action.IContributionManager)
-     */
-    protected void addItems(List list) {
-    	ArrayList shortCuts= new ArrayList();
-    	addShortcuts(shortCuts);
-    	
-    	for (Iterator iterator= shortCuts.iterator(); iterator.hasNext();) {
-			Object curr= iterator.next();
-			if (curr instanceof ActionContributionItem && isNewProjectWizardAction(((ActionContributionItem) curr).getAction())) {
-				iterator.remove();
-				list.add(curr);
-			}
-		}
-		list.add(new ActionContributionItem(newProjectAction));
-        list.add(new Separator());
-        if (!shortCuts.isEmpty()) {
-        	list.addAll(shortCuts);
-        	list.add(new Separator());
-        }
-        if (hasExamples()) {
-            list.add(new ActionContributionItem(newExampleAction));
-            list.add(new Separator());
-        }
-        list.add(new ActionContributionItem(getShowDialogAction()));
-    }
-
-	private boolean isNewProjectWizardAction(IAction action) {
-		if (action instanceof NewWizardShortcutAction) {
-			IWizardDescriptor wizardDescriptor= ((NewWizardShortcutAction) action).getWizardDescriptor();
-			String [] tags = wizardDescriptor.getTags();
-			for (int i = 0; i < tags.length; i++) {
-				if (WorkbenchWizardElement.TAG_PROJECT.equals(tags[i])) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-    
-	/* (non-Javadoc)
-	 * Method declared on IContributionItem.
-	 */
-	public boolean isEnabled() {
-		return enabled;
-	}
-
-	/**
-	 * Sets the enabled state of the receiver.
-	 * 
-	 * @param enabledValue if <code>true</code> the menu is enabled; else
-	 * 		it is disabled
-	 */
-	public void setEnabled(boolean enabledValue) {
-		this.enabled = enabledValue;
-	}
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.BaseNewWizardMenu#getContributionItems()
-	 */
-	protected IContributionItem[] getContributionItems() {
-		if (isEnabled()) {
-			return super.getContributionItems();
-		}
-		return new IContributionItem[0];
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/OpenFileAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/OpenFileAction.java
deleted file mode 100644
index a6a64fd..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/OpenFileAction.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.util.OpenStrategy;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ide.DialogUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * Standard action for opening an editor on the currently selected file 
- * resource(s).
- * <p>
- * Note that there is a different action for opening closed projects:
- * <code>OpenResourceAction</code>.
- * </p>
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class OpenFileAction extends OpenSystemEditorAction {
-
-    /**
-     * The id of this action.
-     */
-    public static final String ID = PlatformUI.PLUGIN_ID + ".OpenFileAction";//$NON-NLS-1$
-
-    /**
-     * The editor to open.
-     */
-    private IEditorDescriptor editorDescriptor;
-
-    /**
-     * Creates a new action that will open editors on the then-selected file 
-     * resources. Equivalent to <code>OpenFileAction(page,null)</code>.
-     *
-     * @param page the workbench page in which to open the editor
-     */
-    public OpenFileAction(IWorkbenchPage page) {
-        this(page, null);
-    }
-
-    /**
-     * Creates a new action that will open instances of the specified editor on 
-     * the then-selected file resources.
-     *
-     * @param page the workbench page in which to open the editor
-     * @param descriptor the editor descriptor, or <code>null</code> if unspecified
-     */
-    public OpenFileAction(IWorkbenchPage page, IEditorDescriptor descriptor) {
-        super(page);
-        setText(descriptor == null ? IDEWorkbenchMessages.OpenFileAction_text : descriptor.getLabel());
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.OPEN_FILE_ACTION);
-        setToolTipText(IDEWorkbenchMessages.OpenFileAction_toolTip);
-        setId(ID);
-        this.editorDescriptor = descriptor;
-    }
-
-    /**
-     * Ensures that the contents of the given file resource are local.
-     *
-     * @param file the file resource
-     * @return <code>true</code> if the file is local, and <code>false</code> if
-     *   it could not be made local for some reason
-     */
-    boolean ensureFileLocal(final IFile file) {
-        //Currently fails due to Core PR.  Don't do it for now
-        //1G5I6PV: ITPCORE:WINNT - IResource.setLocal() attempts to modify immutable tree
-        //file.setLocal(true, IResource.DEPTH_ZERO);
-        return true;
-    }
-
-    /**
-     * Opens an editor on the given file resource.
-     *
-     * @param file the file resource
-     */
-    void openFile(IFile file) {
-        try {
-            boolean activate = OpenStrategy.activateOnOpen();
-            if (editorDescriptor == null) {
-                IDE.openEditor(getWorkbenchPage(), file, activate);
-            } else {
-                if (ensureFileLocal(file)) {
-                    getWorkbenchPage().openEditor(new FileEditorInput(file),
-                            editorDescriptor.getId(), activate);
-                }
-            }
-        } catch (PartInitException e) {
-            DialogUtil.openError(getWorkbenchPage().getWorkbenchWindow()
-                    .getShell(), IDEWorkbenchMessages.OpenFileAction_openFileShellTitle,
-                    e.getMessage(), e);
-        }
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/OpenResourceAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/OpenResourceAction.java
deleted file mode 100644
index b899969..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/OpenResourceAction.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-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.IResourceRuleFactory;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.WorkspaceJob;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.core.runtime.jobs.MultiRule;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-
-/**
- * Standard action for opening the currently selected project(s).
- * <p>
- * Note that there is a different action for opening an editor on file
- * resources: <code>OpenFileAction</code>.
- * </p>
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class OpenResourceAction extends WorkspaceAction implements IResourceChangeListener {
-
-	/**
-	 * The id of this action.
-	 */
-	public static final String ID = PlatformUI.PLUGIN_ID + ".OpenResourceAction"; //$NON-NLS-1$
-
-	/**
-	 * Creates a new action.
-	 * 
-	 * @param shell
-	 *            the shell for any dialogs
-	 *    
-	 * @deprecated {@link #OpenResourceAction(IShellProvider)}
-	 */
-	public OpenResourceAction(Shell shell) {
-		super(shell, IDEWorkbenchMessages.OpenResourceAction_text);
-		initAction();
-	}
-	
-	/**
-	 * Creates a new action.
-	 * 
-	 * @param provider
-	 * 				the shell for any dialogs
-	 * @since 3.4
-	 */
-	public OpenResourceAction(IShellProvider provider){
-		super(provider, IDEWorkbenchMessages.OpenResourceAction_text);
-		initAction();
-	}
-
-	/**
-	 * Initializes the workbench
-	 */
-	private void initAction(){
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IIDEHelpContextIds.OPEN_RESOURCE_ACTION);
-		setToolTipText(IDEWorkbenchMessages.OpenResourceAction_toolTip);
-		setId(ID);
-	}
-	/**
-	 * Returns the total number of closed projects in the workspace.
-	 */
-	private int countClosedProjects() {
-		int count = 0;
-		IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
-		for (int i = 0; i < projects.length; i++) {
-			if (!projects[i].isOpen()) {
-				count++;
-			}
-		}
-		return count;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on WorkspaceAction.
-	 */
-	protected String getOperationMessage() {
-		return IDEWorkbenchMessages.OpenResourceAction_operationMessage;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on WorkspaceAction.
-	 */
-	protected String getProblemsMessage() {
-		return IDEWorkbenchMessages.OpenResourceAction_problemMessage;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on WorkspaceAction.
-	 */
-	protected String getProblemsTitle() {
-		return IDEWorkbenchMessages.OpenResourceAction_dialogTitle;
-	}
-
-	/**
-	 * Returns whether there are closed projects in the workspace that are
-	 * not part of the current selection.
-	 */
-	private boolean hasOtherClosedProjects() {
-		//count the closed projects in the selection
-		int closedInSelection = 0;
-		Iterator resources = getSelectedResources().iterator();
-		while (resources.hasNext()) {
-			IProject project = (IProject) resources.next();
-			if (!project.isOpen())
-				closedInSelection++;
-		}
-		//there are other closed projects if the selection does
-		//not contain all closed projects in the workspace
-		return closedInSelection < countClosedProjects();
-	}
-
-	protected void invokeOperation(IResource resource, IProgressMonitor monitor) throws CoreException {
-		((IProject) resource).open(monitor);
-	}
-
-	/**
-	 * Returns the preference for whether to open required projects when opening
-	 * a project. Consults the preference and prompts the user if necessary.
-	 * 
-	 * @return <code>true</code> if referenced projects should be opened, and
-	 *         <code>false</code> otherwise.
-	 */
-	private boolean promptToOpenWithReferences() {
-		IPreferenceStore store = IDEWorkbenchPlugin.getDefault().getPreferenceStore();
-		String key = IDEInternalPreferences.OPEN_REQUIRED_PROJECTS;
-		String value = store.getString(key);
-		if (MessageDialogWithToggle.ALWAYS.equals(value)) {
-			return true;
-		}
-		if (MessageDialogWithToggle.NEVER.equals(value)) {
-			return false;
-		}
-		String message = IDEWorkbenchMessages.OpenResourceAction_openRequiredProjects;
-		MessageDialogWithToggle dialog = MessageDialogWithToggle.openYesNoCancelQuestion(getShell(), IDEWorkbenchMessages.Question, message, null, false, store, key);
-		int result = dialog.getReturnCode();
-		// the result is equal to SWT.DEFAULT if the user uses the 'esc' key to close the dialog
-		if (result == Window.CANCEL || result == SWT.DEFAULT) {
-			throw new OperationCanceledException();
-		}
-		return dialog.getReturnCode() == IDialogConstants.YES_ID;
-	}
-
-	/**
-	 * Handles a resource changed event by updating the enablement if one of the
-	 * selected projects is opened or closed.
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-		// Warning: code duplicated in CloseResourceAction
-		List sel = getSelectedResources();
-		// don't bother looking at delta if selection not applicable
-		if (selectionIsOfType(IResource.PROJECT)) {
-			IResourceDelta delta = event.getDelta();
-			if (delta != null) {
-				IResourceDelta[] projDeltas = delta.getAffectedChildren(IResourceDelta.CHANGED);
-				for (int i = 0; i < projDeltas.length; ++i) {
-					IResourceDelta projDelta = projDeltas[i];
-					if ((projDelta.getFlags() & IResourceDelta.OPEN) != 0) {
-						if (sel.contains(projDelta.getResource())) {
-							selectionChanged(getStructuredSelection());
-							return;
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction; overrides method on
-	 * WorkspaceAction.
-	 */
-	public void run() {
-		try {
-			if (hasOtherClosedProjects() && promptToOpenWithReferences()) {
-				runOpenWithReferences();
-			}
-			ISchedulingRule rule = null;
-			// be conservative and include all projects in the selection - projects
-			// can change state between now and when the job starts
-			IResourceRuleFactory factory = ResourcesPlugin.getWorkspace().getRuleFactory();
-			Iterator resources = getSelectedResources().iterator();
-			while (resources.hasNext()) {
-				IProject project = (IProject) resources.next();
-				rule = MultiRule.combine(rule, factory.modifyRule(project));
-			}
-			runInBackground(rule);
-		} catch (OperationCanceledException e) {
-			//just return when canceled
-		}
-	}
-
-	/**
-	 * Opens the selected projects, and all related projects, in the background.
-	 */
-	private void runOpenWithReferences() {
-		final List resources = new ArrayList(getActionResources());
-		Job job = new WorkspaceJob(removeMnemonics(getText())) {
-
-			/**
-			 * Opens a project along with all projects it references
-			 */
-			private void doOpenWithReferences(IProject project, IProgressMonitor monitor) throws CoreException {
-				if (!project.exists() || project.isOpen()) {
-					return;
-				}
-				project.open(new SubProgressMonitor(monitor, 1000));
-				IProject[] references = project.getReferencedProjects();
-				for (int i = 0; i < references.length; i++) {
-					doOpenWithReferences(references[i], monitor);
-				}
-			}
-
-			public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
-				try {
-					// at most we can only open all projects currently closed
-					monitor.beginTask("", countClosedProjects() * 1000); //$NON-NLS-1$
-					monitor.setTaskName(getOperationMessage());
-					for (Iterator it = resources.iterator(); it.hasNext();) {
-						doOpenWithReferences((IProject) it.next(), monitor);
-					}
-				} finally {
-					monitor.done();
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		job.setRule(ResourcesPlugin.getWorkspace().getRoot());
-		job.setUser(true);
-		job.schedule();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on WorkspaceAction.
-	 */
-	protected boolean shouldPerformResourcePruning() {
-		return false;
-	}
-
-	/**
-	 * The <code>OpenResourceAction</code> implementation of this
-	 * <code>SelectionListenerAction</code> method ensures that this action is
-	 * enabled only if one of the selections is a closed project.
-	 */
-	protected boolean updateSelection(IStructuredSelection s) {
-		// don't call super since we want to enable if closed project is
-		// selected.
-
-		if (!selectionIsOfType(IResource.PROJECT)) {
-			return false;
-		}
-
-		Iterator resources = getSelectedResources().iterator();
-		while (resources.hasNext()) {
-			IProject currentResource = (IProject) resources.next();
-			if (!currentResource.isOpen()) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/OpenSystemEditorAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/OpenSystemEditorAction.java
deleted file mode 100644
index 0d916d0..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/OpenSystemEditorAction.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.DialogUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * Standard action for opening a system editor on the currently selected file 
- * resource.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class OpenSystemEditorAction extends SelectionListenerAction {
-
-    /**
-     * The id of this action.
-     */
-    public static final String ID = PlatformUI.PLUGIN_ID
-            + ".OpenSystemEditorAction";//$NON-NLS-1$
-
-    /**
-     * The workbench page to open the editor in.
-     */
-    private IWorkbenchPage workbenchPage;
-
-    /**
-     * Creates a new action that will open system editors on the then-selected file 
-     * resources.
-     *
-     * @param page the workbench page in which to open the editor
-     */
-    public OpenSystemEditorAction(IWorkbenchPage page) {
-        super(IDEWorkbenchMessages.OpenSystemEditorAction_text);
-        setToolTipText(IDEWorkbenchMessages.OpenSystemEditorAction_toolTip);
-        setId(ID);
-        page.getWorkbenchWindow().getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.OPEN_SYSTEM_EDITOR_ACTION);
-        if (page == null) {
-            throw new IllegalArgumentException();
-        }
-        this.workbenchPage = page;
-    }
-
-    /**
-     * Return the workbench page to open the editor in.
-     *
-     * @return the workbench page to open the editor in
-     */
-    /* package */final IWorkbenchPage getWorkbenchPage() {
-        return workbenchPage;
-    }
-
-    /**
-     * Opens a system editor on the given file resource.
-     *
-     * @param file the file resource
-     */
-    /* package */void openFile(IFile file) {
-        try {
-            getWorkbenchPage().openEditor(new FileEditorInput(file),
-                    IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID);
-        } catch (PartInitException e) {
-            DialogUtil.openError(getWorkbenchPage().getWorkbenchWindow()
-                    .getShell(), IDEWorkbenchMessages.OpenSystemEditorAction_dialogTitle,
-                    e.getMessage(), e);
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IAction.
-     */
-    public void run() {
-        Iterator itr = getSelectedResources().iterator();
-        while (itr.hasNext()) {
-            IResource resource = (IResource) itr.next();
-            if (resource instanceof IFile) {
-				openFile((IFile) resource);
-			}
-        }
-    }
-
-    /**
-     * The <code>OpenSystemEditorAction</code> implementation of this
-     * <code>SelectionListenerAction</code> method enables the action only
-     * if the selection contains just file resources.
-     */
-    protected boolean updateSelection(IStructuredSelection selection) {
-        return super.updateSelection(selection)
-                && selectionIsOfType(IResource.FILE);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/OpenWithMenu.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/OpenWithMenu.java
deleted file mode 100644
index 075be41..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/OpenWithMenu.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Benjamin Muskalla -	Bug 29633 [EditorMgmt] "Open" menu should
- *     						have Open With-->Other
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Hashtable;
-
-import com.ibm.icu.text.Collator;
-
-import org.eclipse.osgi.util.NLS;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.window.Window;
-
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.EditorSelectionDialog;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.ide.DialogUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * A menu for opening files in the workbench.
- * <p>
- * An <code>OpenWithMenu</code> is used to populate a menu with
- * "Open With" actions.  One action is added for each editor which is applicable
- * to the selected file. If the user selects one of these items, the corresponding
- * editor is opened on the file.
- * </p>
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class OpenWithMenu extends ContributionItem {
-    private IWorkbenchPage page;
-
-    private IAdaptable file;
-
-    private IEditorRegistry registry = PlatformUI.getWorkbench()
-            .getEditorRegistry();
-
-    private static Hashtable imageCache = new Hashtable(11);
-
-    /**
-     * The id of this action.
-     */
-    public static final String ID = PlatformUI.PLUGIN_ID + ".OpenWithMenu";//$NON-NLS-1$
-
-    /**
-     * Match both the input and id, so that different types of editor can be opened on the same input.
-     */
-    private static final int MATCH_BOTH = IWorkbenchPage.MATCH_INPUT | IWorkbenchPage.MATCH_ID;
-    
-    /*
-     * Compares the labels from two IEditorDescriptor objects
-     */
-    private static final Comparator comparer = new Comparator() {
-        private Collator collator = Collator.getInstance();
-
-        public int compare(Object arg0, Object arg1) {
-            String s1 = ((IEditorDescriptor) arg0).getLabel();
-            String s2 = ((IEditorDescriptor) arg1).getLabel();
-            return collator.compare(s1, s2);
-        }
-    };
-
-    /**
-     * Constructs a new instance of <code>OpenWithMenu</code>.
-     *
-     * @param page the page where the editor is opened if an item within
-     *		the menu is selected
-     * @deprecated As there is no way to set the file with this constructor use a
-     * different constructor.
-     */
-    public OpenWithMenu(IWorkbenchPage page) {
-        this(page, null);
-    }
-
-    /**
-     * Constructs a new instance of <code>OpenWithMenu</code>.
-     *
-     * @param page the page where the editor is opened if an item within
-     *		the menu is selected
-     * @param file the selected file
-     */
-    public OpenWithMenu(IWorkbenchPage page, IAdaptable file) {
-        super(ID);
-        this.page = page;
-        this.file = file;
-    }
-
-    /**
-     * Returns an image to show for the corresponding editor descriptor.
-     *
-     * @param editorDesc the editor descriptor, or null for the system editor
-     * @return the image or null
-     */
-    private Image getImage(IEditorDescriptor editorDesc) {
-        ImageDescriptor imageDesc = getImageDescriptor(editorDesc);
-        if (imageDesc == null) {
-            return null;
-        }
-        Image image = (Image) imageCache.get(imageDesc);
-        if (image == null) {
-            image = imageDesc.createImage();
-            imageCache.put(imageDesc, image);
-        }
-        return image;
-    }
-
-    /**
-     * Returns the image descriptor for the given editor descriptor,
-     * or null if it has no image.
-     */
-    private ImageDescriptor getImageDescriptor(IEditorDescriptor editorDesc) {
-        ImageDescriptor imageDesc = null;
-        if (editorDesc == null) {
-            imageDesc = registry
-                    .getImageDescriptor(getFileResource().getName());
-			//TODO: is this case valid, and if so, what are the implications for content-type editor bindings?
-        } else {
-            imageDesc = editorDesc.getImageDescriptor();
-        }
-        if (imageDesc == null) {
-            if (editorDesc.getId().equals(
-                    IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID)) {
-				imageDesc = registry
-                        .getSystemExternalEditorImageDescriptor(getFileResource()
-                                .getName());
-			}
-        }
-        return imageDesc;
-    }
-
-    /**
-     * Creates the menu item for the editor descriptor.
-     *
-     * @param menu the menu to add the item to
-     * @param descriptor the editor descriptor, or null for the system editor
-     * @param preferredEditor the descriptor of the preferred editor, or <code>null</code>
-     */
-    private void createMenuItem(Menu menu, final IEditorDescriptor descriptor,
-            final IEditorDescriptor preferredEditor) {
-        // XXX: Would be better to use bold here, but SWT does not support it.
-        final MenuItem menuItem = new MenuItem(menu, SWT.RADIO);
-        boolean isPreferred = preferredEditor != null
-                && descriptor.getId().equals(preferredEditor.getId());
-        menuItem.setSelection(isPreferred);
-        menuItem.setText(descriptor.getLabel());
-        Image image = getImage(descriptor);
-        if (image != null) {
-            menuItem.setImage(image);
-        }
-        Listener listener = new Listener() {
-            public void handleEvent(Event event) {
-                switch (event.type) {
-                case SWT.Selection:
-                    if (menuItem.getSelection()) {
-						openEditor(descriptor, false);
-					}
-                    break;
-                }
-            }
-        };
-        menuItem.addListener(SWT.Selection, listener);
-    }
-
-    /**
-     * Creates the Other... menu item
-     *
-     * @param menu the menu to add the item to
-     */
-    private void createOtherMenuItem(final Menu menu) {
-    	final IFile fileResource = getFileResource();
-		if (fileResource == null) {
-    		return;
-    	}
-        new MenuItem(menu, SWT.SEPARATOR);
-        final MenuItem menuItem = new MenuItem(menu, SWT.PUSH);
-        menuItem.setText(IDEWorkbenchMessages.OpenWithMenu_Other);
-        Listener listener = new Listener() {
-            public void handleEvent(Event event) {
-                switch (event.type) {
-                case SWT.Selection:
-                   	EditorSelectionDialog dialog = new EditorSelectionDialog(
-							menu.getShell());
-					dialog
-							.setMessage(NLS
-									.bind(
-											IDEWorkbenchMessages.OpenWithMenu_OtherDialogDescription,
-											fileResource.getName()));
-					if (dialog.open() == Window.OK) {
-						IEditorDescriptor editor = dialog.getSelectedEditor();
-						if (editor != null) {
-							openEditor(editor, editor.isOpenExternal());
-						}
-					}
-                    break;
-                }
-            }
-        };
-        menuItem.addListener(SWT.Selection, listener);
-    }
-    
-    /* (non-Javadoc)
-     * Fills the menu with perspective items.
-     */
-    public void fill(Menu menu, int index) {
-        IFile file = getFileResource();
-        if (file == null) {
-            return;
-        }
-
-        IEditorDescriptor defaultEditor = registry
-                .findEditor(IDEWorkbenchPlugin.DEFAULT_TEXT_EDITOR_ID); // may be null
-        IEditorDescriptor preferredEditor = IDE.getDefaultEditor(file); // may be null
-
-        Object[] editors = registry.getEditors(file.getName(), IDE.getContentType(file));
-        Collections.sort(Arrays.asList(editors), comparer);
-
-        boolean defaultFound = false;
-
-        //Check that we don't add it twice. This is possible
-        //if the same editor goes to two mappings.
-        ArrayList alreadyMapped = new ArrayList();
-
-        for (int i = 0; i < editors.length; i++) {
-            IEditorDescriptor editor = (IEditorDescriptor) editors[i];
-            if (!alreadyMapped.contains(editor)) {
-                createMenuItem(menu, editor, preferredEditor);
-                if (defaultEditor != null
-                        && editor.getId().equals(defaultEditor.getId())) {
-					defaultFound = true;
-				}
-                alreadyMapped.add(editor);
-            }
-        }
-
-        // Only add a separator if there is something to separate
-        if (editors.length > 0) {
-			new MenuItem(menu, SWT.SEPARATOR);
-		}
-
-        // Add default editor. Check it if it is saved as the preference.
-        if (!defaultFound && defaultEditor != null) {
-            createMenuItem(menu, defaultEditor, preferredEditor);
-        }
-
-        // Add system editor (should never be null)
-        IEditorDescriptor descriptor = registry
-                .findEditor(IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID);
-        createMenuItem(menu, descriptor, preferredEditor);
-
-        // Add system in-place editor (can be null)
-        descriptor = registry
-                .findEditor(IEditorRegistry.SYSTEM_INPLACE_EDITOR_ID);
-        if (descriptor != null) {
-            createMenuItem(menu, descriptor, preferredEditor);
-        }
-        createDefaultMenuItem(menu, file);
-        
-        // add Other... menu item
-        createOtherMenuItem(menu);
-    }
-	
-
-    /**
-     * Converts the IAdaptable file to IFile or null.
-     */
-    private IFile getFileResource() {
-        if (this.file instanceof IFile) {
-            return (IFile) this.file;
-        }
-        IResource resource = (IResource) this.file
-                .getAdapter(IResource.class);
-        if (resource instanceof IFile) {
-            return (IFile) resource;
-        }
-       
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Returns whether this menu is dynamic.
-     */
-    public boolean isDynamic() {
-        return true;
-    }
-
-    /**
-     * Opens the given editor on the selected file.
-     *
-     * @param editorDescriptor the editor descriptor, or null for the system editor
-     * @param openUsingDescriptor use the descriptor's editor ID for opening if false (normal case),
-     * or use the descriptor itself if true (needed to fix bug 178235).
-     *
-     * @since 3.5
-     */
-	protected void openEditor(IEditorDescriptor editorDescriptor, boolean openUsingDescriptor) {
-        IFile file = getFileResource();
-        if (file == null) {
-            return;
-        }
-        try {
-        	if (openUsingDescriptor) {
-        		((WorkbenchPage) page).openEditorFromDescriptor(new FileEditorInput(file), editorDescriptor, true, null);
-        	} else {
-	            String editorId = editorDescriptor == null ? IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID
-	                    : editorDescriptor.getId();
-	            
-	            ((WorkbenchPage) page).openEditor(new FileEditorInput(file), editorId, true, MATCH_BOTH);
-	            // only remember the default editor if the open succeeds
-	            IDE.setDefaultEditor(file, editorId);
-        	}
-        } catch (PartInitException e) {
-            DialogUtil.openError(page.getWorkbenchWindow().getShell(),
-                    IDEWorkbenchMessages.OpenWithMenu_dialogTitle,
-                    e.getMessage(), e);
-        }
-    }
-
-    /**
-     * Creates the menu item for clearing the current selection.
-     *
-     * @param menu the menu to add the item to
-     * @param file the file being edited
-     */
-    private void createDefaultMenuItem(Menu menu, final IFile file) {
-        final MenuItem menuItem = new MenuItem(menu, SWT.RADIO);
-        menuItem.setSelection(IDE.getDefaultEditor(file) == null);
-        menuItem.setText(IDEWorkbenchMessages.DefaultEditorDescription_name);
-
-        Listener listener = new Listener() {
-            public void handleEvent(Event event) {
-                switch (event.type) {
-                case SWT.Selection:
-                    if (menuItem.getSelection()) {
-                        IDE.setDefaultEditor(file, null);
-                        try {
-                            openEditor(IDE.getEditorDescriptor(file), false);
-                        } catch (PartInitException e) {
-                            DialogUtil.openError(page.getWorkbenchWindow()
-                                    .getShell(), IDEWorkbenchMessages.OpenWithMenu_dialogTitle,
-                                    e.getMessage(), e);
-                        }
-                    }
-                    break;
-                }
-            }
-        };
-
-        menuItem.addListener(SWT.Selection, listener);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/QuickStartAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/QuickStartAction.java
deleted file mode 100644
index 99a3930..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/QuickStartAction.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.net.URL;
-import java.util.ArrayList;
-
-import org.eclipse.core.runtime.IProduct;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.internal.ProductProperties;
-import org.eclipse.ui.internal.ide.AboutInfo;
-import org.eclipse.ui.internal.ide.FeatureSelectionDialog;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.dialogs.WelcomeEditorInput;
-
-/**
- * The quick start (Welcome...) action.
- * 
- * @deprecated the IDE now uses the new intro mechanism
- */
-public class QuickStartAction extends Action implements
-        ActionFactory.IWorkbenchAction {
-
-    private static final String EDITOR_ID = "org.eclipse.ui.internal.ide.dialogs.WelcomeEditor"; //$NON-NLS-1$
-
-    /**
-     * The workbench window; or <code>null</code> if this
-     * action has been <code>dispose</code>d.
-     */
-    private IWorkbenchWindow workbenchWindow;
-
-    /**
-     * Create an instance of this class.
-     * <p>
-     * This consructor added to support calling the action from the welcome
-     * page.
-     * </p>
-     */
-    public QuickStartAction() {
-        this(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
-    }
-
-    /**
-     * Creates an instance of this action, for use in the given window.
-     * @param window the window
-     */
-    public QuickStartAction(IWorkbenchWindow window) {
-        super(IDEWorkbenchMessages.QuickStart_text);
-        if (window == null) {
-            throw new IllegalArgumentException();
-        }
-        this.workbenchWindow = window;
-        setToolTipText(IDEWorkbenchMessages.QuickStart_toolTip);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.QUICK_START_ACTION);
-        setActionDefinitionId("org.eclipse.ui.help.quickStartAction"); //$NON-NLS-1$
-    }
-
-    /**
-     * The user has invoked this action.  Prompts for a feature with a welcome page, 
-     * then opens the corresponding welcome page.
-     */
-    public void run() {
-        if (workbenchWindow == null) {
-            // action has been disposed
-            return;
-        }
-        try {
-            AboutInfo feature = promptForFeature();
-            if (feature != null) {
-                openWelcomePage(feature);
-            }
-        } catch (WorkbenchException e) {
-            ErrorDialog.openError(workbenchWindow.getShell(),
-                    IDEWorkbenchMessages.QuickStartAction_errorDialogTitle,
-                    IDEWorkbenchMessages.QuickStartAction_infoReadError,
-                    e.getStatus());
-        }
-    }
-
-    /**
-     * Prompts the user for a feature that has a welcome page.
-     * 
-     * @return the chosen feature, or <code>null</code> if none was chosen
-     */
-    private AboutInfo promptForFeature() throws WorkbenchException {
-        // Ask the user to select a feature
-        ArrayList welcomeFeatures = new ArrayList();
-
-        URL productUrl = null;
-        IProduct product = Platform.getProduct();
-        if (product != null) {
-            productUrl = ProductProperties.getWelcomePageUrl(product);
-            welcomeFeatures.add(new AboutInfo(product));
-        }
-
-        AboutInfo[] features = IDEWorkbenchPlugin.getDefault()
-                .getFeatureInfos();
-        for (int i = 0; i < features.length; i++) {
-            URL url = features[i].getWelcomePageURL();
-            if (url != null && !url.equals(productUrl)) {
-				welcomeFeatures.add(features[i]);
-			}
-        }
-
-        Shell shell = workbenchWindow.getShell();
-
-        if (welcomeFeatures.size() == 0) {
-            MessageDialog.openInformation(shell, IDEWorkbenchMessages.QuickStartMessageDialog_title,
-                    IDEWorkbenchMessages.QuickStartMessageDialog_message);
-            return null;
-        }
-
-        features = new AboutInfo[welcomeFeatures.size()];
-        welcomeFeatures.toArray(features);
-
-        FeatureSelectionDialog d = new FeatureSelectionDialog(shell, features,
-                product == null ? null : product.getId(), IDEWorkbenchMessages.WelcomePageSelectionDialog_title,
-                IDEWorkbenchMessages.WelcomePageSelectionDialog_message,
-                IIDEHelpContextIds.WELCOME_PAGE_SELECTION_DIALOG);
-        if (d.open() != Window.OK || d.getResult().length != 1) {
-			return null;
-		}
-        return (AboutInfo) d.getResult()[0];
-    }
-
-    /**
-     * Opens the welcome page for the given feature.
-     * 
-     * @param featureId the about info for the feature
-     * @return <code>true</code> if successful, <code>false</code> otherwise
-     * @throws WorkbenchException 
-     */
-    public boolean openWelcomePage(String featureId) throws WorkbenchException {
-        AboutInfo feature = findFeature(featureId);
-        if (feature == null || feature.getWelcomePageURL() == null) {
-            return false;
-        }
-        return openWelcomePage(feature);
-    }
-
-    /**
-     * Returns the about info for the feature with the given id, or <code>null</code>
-     * if there is no such feature.
-     * 
-     * @return the about info for the feature with the given id, or <code>null</code>
-     *   if there is no such feature.
-     */
-    private AboutInfo findFeature(String featureId) throws WorkbenchException {
-        AboutInfo[] features = IDEWorkbenchPlugin.getDefault()
-                .getFeatureInfos();
-        for (int i = 0; i < features.length; i++) {
-            AboutInfo info = features[i];
-            if (info.getFeatureId().equals(featureId)) {
-                return info;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Opens the welcome page for a feature.
-     * 
-     * @param feature the about info for the feature
-     * @return <code>true</code> if successful, <code>false</code> otherwise
-     */
-    private boolean openWelcomePage(AboutInfo feature) {
-        IWorkbenchPage page = null;
-
-        // See if the feature wants a specific perspective
-        String perspectiveId = feature.getWelcomePerspectiveId();
-
-        if (perspectiveId == null) {
-            // Just use the current perspective unless one is not open 
-            // in which case use the default
-            page = workbenchWindow.getActivePage();
-
-            if (page == null || page.getPerspective() == null) {
-                perspectiveId = PlatformUI.getWorkbench()
-                        .getPerspectiveRegistry().getDefaultPerspective();
-            }
-        }
-
-        if (perspectiveId != null) {
-            try {
-                page = PlatformUI.getWorkbench().showPerspective(perspectiveId,
-                        workbenchWindow);
-            } catch (WorkbenchException e) {
-                IDEWorkbenchPlugin
-						.log("Error opening perspective: " + perspectiveId, e.getStatus()); //$NON-NLS-1$
-                return false;
-            }
-        }
-
-        if (page == null) {
-        	return false;
-        }
-        
-        page.setEditorAreaVisible(true);
-
-        // create input
-        WelcomeEditorInput input = new WelcomeEditorInput(feature);
-
-        // see if we already have a welcome editorz
-        IEditorPart editor = page.findEditor(input);
-        if (editor != null) {
-            page.activate(editor);
-            return true;
-        }
-
-        try {
-            page.openEditor(input, EDITOR_ID);
-        } catch (PartInitException e) {
-            IDEWorkbenchPlugin
-                    .log("Error opening welcome editor for feature: " + feature.getFeatureId(), e); //$NON-NLS-1$
-            IStatus status = new Status(
-                    IStatus.ERROR,
-                    IDEWorkbenchPlugin.IDE_WORKBENCH,
-                    1,
-                    IDEWorkbenchMessages.QuickStartAction_openEditorException, e);
-            ErrorDialog
-                    .openError(
-                            workbenchWindow.getShell(),
-                            IDEWorkbenchMessages.Workbench_openEditorErrorDialogTitle,
-                            IDEWorkbenchMessages.Workbench_openEditorErrorDialogMessage,
-                            status);
-            return false;
-        }
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ActionFactory.IWorkbenchAction.
-     * @since 3.0
-     */
-    public void dispose() {
-        if (workbenchWindow == null) {
-            // action has already been disposed
-            return;
-        }
-        workbenchWindow = null;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/ReadOnlyStateChecker.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/ReadOnlyStateChecker.java
deleted file mode 100644
index 69a3c2a..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/ReadOnlyStateChecker.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import com.ibm.icu.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourceAttributes;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-
-/**
- * The ReadOnlyStateChecker is a helper class that takes a set of resource
- * some of which may be read only and queries the user as to whether or
- * not they wish to continue the operation on it.
- */
-public class ReadOnlyStateChecker {
-    private Shell shell;
-
-    private String titleMessage;
-
-    private String mainMessage;
-
-    private boolean yesToAllSelected = false;
-
-    private boolean cancelSelected = false;
-
-    private boolean ignoreLinkedResources = false;
-    
-    private String READ_ONLY_EXCEPTION_MESSAGE = IDEWorkbenchMessages.ReadOnlyCheck_problems;
-
-    /**
-     * Create a new checker that parents the dialog off of parent using the supplied
-     * title and message.
-     * @param parent the shell used for dialogs
-     * @param title the title for dialogs
-     * @param message the message for a dialog - this will be prefaced with the name of the resource.
-     */
-    public ReadOnlyStateChecker(Shell parent, String title, String message) {
-        this.shell = parent;
-        this.titleMessage = title;
-        this.mainMessage = message;
-    }
-
-    /**
-     * Check an individual resource to see if it passed the read only query. If it is a file
-     * just add it, otherwise it is a container and the children need to be checked too.
-     * Return true if all items are selected and false if any are skipped.
-     */
-    private boolean checkAcceptedResource(IResource resourceToCheck,
-            List selectedChildren) throws CoreException {
-
-        if (resourceToCheck.getType() == IResource.FILE) {
-			selectedChildren.add(resourceToCheck);
-		} else if (getIgnoreLinkedResources() && resourceToCheck.isLinked()) {
-            selectedChildren.add(resourceToCheck);
-        }
-        else {
-        	IContainer container = (IContainer) resourceToCheck;
-        	// if the project is closed, there's no point in checking
-        	// it's children.  bug 99858
-			if (container.isAccessible()) {
-				// Now check below
-				int childCheck = checkReadOnlyResources(container.members(),
-						selectedChildren);
-				// Add in the resource only if nothing was left out
-				if (childCheck == IDialogConstants.YES_TO_ALL_ID) {
-					selectedChildren.add(resourceToCheck);
-				} else {
-					// Something was left out - return false
-					return false;
-				}
-			} else {
-				selectedChildren.add(resourceToCheck);
-			}
-        }
-        return true;
-
-    }
-
-    /**
-     * Check the supplied resources to see if they are read only. If so then
-	 * prompt the user to see if they can be deleted.Return those that were
-	 * accepted.
-	 * 
-     * @param itemsToCheck
-     * @return the resulting selected resources
-     */
-    public IResource[] checkReadOnlyResources(IResource[] itemsToCheck) {
-
-        List selections = new ArrayList();
-        int result = IDialogConstants.CANCEL_ID;
-        try {
-            result = checkReadOnlyResources(itemsToCheck, selections);
-        } catch (final CoreException exception) {
-            shell.getDisplay().syncExec(new Runnable() {
-                public void run() {
-                    ErrorDialog.openError(shell, READ_ONLY_EXCEPTION_MESSAGE,
-                            null, exception.getStatus());
-                }
-            });
-        }
-
-        if (result == IDialogConstants.CANCEL_ID) {
-			return new IResource[0];
-		}
-
-        //All were selected so return the original items
-        if (result == IDialogConstants.YES_TO_ALL_ID) {
-			return itemsToCheck;
-		}
-
-        IResource[] returnValue = new IResource[selections.size()];
-        selections.toArray(returnValue);
-        return returnValue;
-    }
-
-    /**
-     * Check the children of the container to see if they are read only.
-     * @return int
-     * one of
-     * 	YES_TO_ALL_ID - all elements were selected
-     * 	NO_ID - No was hit at some point
-     * 	CANCEL_ID - cancel was hit
-     * @param itemsToCheck IResource[]
-     * @param allSelected the List of currently selected resources to add to.
-     */
-    private int checkReadOnlyResources(IResource[] itemsToCheck,
-            List allSelected) throws CoreException {
-
-        //Shortcut. If the user has already selected yes to all then just return it
-        if (yesToAllSelected) {
-			return IDialogConstants.YES_TO_ALL_ID;
-		}
-
-        boolean noneSkipped = true;
-        List selectedChildren = new ArrayList();
-
-        for (int i = 0; i < itemsToCheck.length; i++) {
-            IResource resourceToCheck = itemsToCheck[i];
-            ResourceAttributes checkAttributes = resourceToCheck.getResourceAttributes();
-            if (!yesToAllSelected && shouldCheck(resourceToCheck)
-            		&& checkAttributes!=null
-            		&& checkAttributes.isReadOnly()) {
-                int action = queryYesToAllNoCancel(resourceToCheck);
-                if (action == IDialogConstants.YES_ID) {
-                    boolean childResult = checkAcceptedResource(
-                            resourceToCheck, selectedChildren);
-                    if (!childResult) {
-						noneSkipped = false;
-					}
-                }
-                if (action == IDialogConstants.NO_ID) {
-					noneSkipped = false;
-				}
-                if (action == IDialogConstants.CANCEL_ID) {
-                    cancelSelected = true;
-                    return IDialogConstants.CANCEL_ID;
-                }
-                if (action == IDialogConstants.YES_TO_ALL_ID) {
-                    yesToAllSelected = true;
-                    selectedChildren.add(resourceToCheck);
-                }
-            } else {
-                boolean childResult = checkAcceptedResource(resourceToCheck,
-                        selectedChildren);
-                if (cancelSelected) {
-					return IDialogConstants.CANCEL_ID;
-				}
-                if (!childResult) {
-					noneSkipped = false;
-				}
-            }
-
-        }
-
-        if (noneSkipped) {
-			return IDialogConstants.YES_TO_ALL_ID;
-		}
-       allSelected.addAll(selectedChildren);
-       return IDialogConstants.NO_ID;
-
-    }
-
-    /**
-	 * Returns whether the given resource should be checked for read-only state.
-	 * 
-	 * @param resourceToCheck the resource to check
-	 * @return <code>true</code> to check it, <code>false</code> to skip it
-	 */
-	private boolean shouldCheck(IResource resourceToCheck) {
-        if (ignoreLinkedResources) {
-        	if (resourceToCheck.isLinked()) {
-				return false;
-			}
-        }
-        return true;
-    }
-
-	/**
-     * Open a message dialog with Yes No, Yes To All and Cancel buttons. Return the
-     * code that indicates the selection.
-     * @return int 
-     *	one of
-     *		YES_TO_ALL_ID
-     *		YES_ID
-     *		NO_ID
-     *		CANCEL_ID
-     * 		
-     * @param resource - the resource being queried.
-     */
-    private int queryYesToAllNoCancel(IResource resource) {
-
-        final MessageDialog dialog = new MessageDialog(this.shell,
-                this.titleMessage, null, MessageFormat.format(this.mainMessage,
-                        new Object[] { resource.getName() }),
-                MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.YES_LABEL,
-                        IDialogConstants.YES_TO_ALL_LABEL,
-                        IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        shell.getDisplay().syncExec(new Runnable() {
-            public void run() {
-                dialog.open();
-            }
-        });
-        int result = dialog.getReturnCode();
-        if (result == 0) {
-			return IDialogConstants.YES_ID;
-		}
-        if (result == 1) {
-			return IDialogConstants.YES_TO_ALL_ID;
-		}
-        if (result == 2) {
-			return IDialogConstants.NO_ID;
-		}
-        return IDialogConstants.CANCEL_ID;
-    }
-    
-    /**
-     * Returns whether to ignore linked resources.
-     * 
-     * @return <code>true</code> to ignore linked resources, <code>false</code> to consider them
-     * @since 3.1
-     */
-    public boolean getIgnoreLinkedResources() {
-    	return ignoreLinkedResources;
-    }
-
-    /**
-     * Sets whether to ignore linked resources.
-     * The default is <code>false</code>.
-     * 
-     * @param ignore <code>true</code> to ignore linked resources, <code>false</code> to consider them
-     * @since 3.1
-     */
-    public void setIgnoreLinkedResources(boolean ignore) {
-    	ignoreLinkedResources = ignore;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/RefreshAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/RefreshAction.java
deleted file mode 100644
index 4c9e6e3..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/RefreshAction.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceRuleFactory;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.WorkspaceJob;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.MultiRule;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.StatusUtil;
-import org.eclipse.ui.internal.ide.dialogs.IDEResourceInfoUtils;
-
-/**
- * Standard action for refreshing the workspace from the local file system for
- * the selected resources and all of their descendants.
- * <p>
- * This class may be instantiated; it may also subclass to extend:
- * <ul>
- * <li>getSelectedResources - A list containing 0 or more resources to be
- * refreshed</li>
- * <li>updateSelection - controls when this action is enabled</li>
- * <li>refreshResource - can be extended to refresh model objects related to
- * the resource</li>
- * <ul>
- * </p>
- */
-public class RefreshAction extends WorkspaceAction {
-
-	/**
-	 * The id of this action.
-	 */
-	public static final String ID = PlatformUI.PLUGIN_ID + ".RefreshAction";//$NON-NLS-1$
-
-	/**
-	 * Creates a new action.
-	 * 
-	 * @param shell
-	 *            the shell for any dialogs
-	 * @deprecated See {@link #RefreshAction(IShellProvider)}
-	 */
-	public RefreshAction(Shell shell) {
-		super(shell, IDEWorkbenchMessages.RefreshAction_text);
-		initAction();
-	}
-
-	/**
-	 * Creates a new action.
-	 * 
-	 * @param provider
-	 *            the IShellProvider for any dialogs.
-	 * @since 3.4
-	 */
-	public RefreshAction(IShellProvider provider){
-		super(provider, IDEWorkbenchMessages.RefreshAction_text);
-		initAction();
-	}
-	
-	/**
-	 * Initializes for the constructor.
-	 */
-	private void initAction(){
-		setToolTipText(IDEWorkbenchMessages.RefreshAction_toolTip);
-		setId(ID);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.REFRESH_ACTION);
-	}
-	/**
-	 * Checks whether the given project's location has been deleted. If so,
-	 * prompts the user with whether to delete the project or not.
-	 */
-	void checkLocationDeleted(IProject project) throws CoreException {
-		if (!project.exists()) {
-			return;
-		}
-		IFileInfo location = IDEResourceInfoUtils.getFileInfo(project
-				.getLocationURI());
-		if (!location.exists()) {
-			String message = NLS.bind(
-					IDEWorkbenchMessages.RefreshAction_locationDeletedMessage,
-					project.getName(), location.toString());
-
-			final MessageDialog dialog = new MessageDialog(getShell(),
-					IDEWorkbenchMessages.RefreshAction_dialogTitle, // dialog
-					// title
-					null, // use default window icon
-					message, MessageDialog.QUESTION, new String[] {
-							IDialogConstants.YES_LABEL,
-							IDialogConstants.NO_LABEL }, 0); // yes is the
-			// default
-
-			// Must prompt user in UI thread (we're in the operation thread
-			// here).
-			getShell().getDisplay().syncExec(new Runnable() {
-				public void run() {
-					dialog.open();
-				}
-			});
-
-			// Do the deletion back in the operation thread
-			if (dialog.getReturnCode() == 0) { // yes was chosen
-				project.delete(true, true, null);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on WorkspaceAction.
-	 */
-	protected String getOperationMessage() {
-		return IDEWorkbenchMessages.RefreshAction_progressMessage;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on WorkspaceAction.
-	 */
-	protected String getProblemsMessage() {
-		return IDEWorkbenchMessages.RefreshAction_problemMessage;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on WorkspaceAction.
-	 */
-	protected String getProblemsTitle() {
-		return IDEWorkbenchMessages.RefreshAction_problemTitle;
-	}
-
-	/**
-	 * Returns a list containing the workspace root if the selection would
-	 * otherwise be empty.
-	 */
-	protected List getSelectedResources() {
-		List resources = super.getSelectedResources();
-		if (resources.isEmpty()) {
-			resources = new ArrayList();
-			resources.add(ResourcesPlugin.getWorkspace().getRoot());
-		}
-		return resources;
-	}
-
-	/**
-	 * The <code>RefreshAction</code> implementation of this
-	 * <code>SelectionListenerAction</code> method ensures that this action is
-	 * enabled if the selection is empty, but is disabled if any of the selected
-	 * elements are not resources.
-	 */
-	protected boolean updateSelection(IStructuredSelection s) {
-		return (super.updateSelection(s) || s.isEmpty())
-				&& getSelectedNonResources().size() == 0;
-	}
-
-	/**
-	 * Handle the key release.
-	 * 
-	 * @param event
-	 *            the event
-	 */
-	public void handleKeyReleased(KeyEvent event) {
-
-		if (event.keyCode == SWT.F5 && event.stateMask == 0) {
-			refreshAll();
-		}
-	}
-
-	/**
-	 * Refreshes the entire workspace.
-	 */
-	final public void refreshAll() {
-		IStructuredSelection currentSelection = getStructuredSelection();
-		selectionChanged(StructuredSelection.EMPTY);
-		run();
-		selectionChanged(currentSelection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.WorkspaceAction#createOperation(org.eclipse.core.runtime.IStatus[])
-	 */
-	final protected IRunnableWithProgress createOperation(
-			final IStatus[] errorStatus) {
-		ISchedulingRule rule = null;
-		IResourceRuleFactory factory = ResourcesPlugin.getWorkspace()
-				.getRuleFactory();
-
-		List actionResources = new ArrayList(getActionResources());
-		if (shouldPerformResourcePruning()) {
-			actionResources = pruneResources(actionResources);
-		}
-		final List resources = actionResources;
-
-		Iterator res = resources.iterator();
-		while (res.hasNext()) {
-			rule = MultiRule.combine(rule, factory.refreshRule((IResource) res
-					.next()));
-		}
-		return new WorkspaceModifyOperation(rule) {
-			public void execute(IProgressMonitor monitor) {
-				MultiStatus errors = null;
-				monitor.beginTask("", resources.size() * 1000); //$NON-NLS-1$
-				monitor.setTaskName(getOperationMessage());
-				Iterator resourcesEnum = resources.iterator();
-				try {
-					while (resourcesEnum.hasNext()) {
-						try {
-							IResource resource = (IResource) resourcesEnum
-									.next();
-							refreshResource(resource, new SubProgressMonitor(
-									monitor, 1000));
-						} catch (CoreException e) {
-							errors = recordError(errors, e);
-						}
-						if (monitor.isCanceled()) {
-							throw new OperationCanceledException();
-						}
-					}
-					if (errors != null) {
-						errorStatus[0] = errors;
-					}
-				} finally {
-					monitor.done();
-				}
-			}
-		};
-	}
-
-	/**
-	 * Refresh the resource (with a check for deleted projects).
-	 * <p>
-	 * This method may be extended to refresh model objects related to the
-	 * resource.
-	 * </p>
-	 * 
-	 * @param resource
-	 *            the resource to refresh. Must not be <code>null</code>.
-	 * @param monitor
-	 *            progress monitor
-	 * @throws CoreException
-	 *             if things go wrong
-	 * @since 3.4
-	 */
-	protected void refreshResource(IResource resource, IProgressMonitor monitor)
-			throws CoreException {
-		// Check if project's location has been deleted,
-		// as per 1G83UCE: ITPUI:WINNT - Refresh from local doesn't detect new
-		// or deleted projects
-		// and also for bug report #18283
-		if (resource.getType() == IResource.PROJECT) {
-			checkLocationDeleted((IProject) resource);
-		} else if (resource.getType() == IResource.ROOT) {
-			IProject[] projects = ((IWorkspaceRoot) resource).getProjects();
-			for (int i = 0; i < projects.length; i++) {
-				checkLocationDeleted(projects[i]);
-			}
-		}
-		resource.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.WorkspaceAction#run()
-	 */
-	public void run() {
-		final IStatus[] errorStatus = new IStatus[1];
-		errorStatus[0] = Status.OK_STATUS;
-		final WorkspaceModifyOperation op = (WorkspaceModifyOperation) createOperation(errorStatus);
-		WorkspaceJob job = new WorkspaceJob("refresh") { //$NON-NLS-1$
-
-			public IStatus runInWorkspace(IProgressMonitor monitor)
-					throws CoreException {
-				try {
-					op.run(monitor);
-				} catch (InvocationTargetException e) {
-					String msg = NLS.bind(
-							IDEWorkbenchMessages.WorkspaceAction_logTitle, getClass()
-									.getName(), e.getTargetException());
-					throw new CoreException(StatusUtil.newStatus(IStatus.ERROR,
-							msg, e.getTargetException()));
-				} catch (InterruptedException e) {
-					return Status.CANCEL_STATUS;
-				}
-				return errorStatus[0];
-			}
-			
-		};
-		ISchedulingRule rule = op.getRule();
-		if (rule != null) {
-			job.setRule(rule);
-		}
-		job.setUser(true);
-		job.schedule();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/RenameResourceAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/RenameResourceAction.java
deleted file mode 100644
index f85e18c..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/RenameResourceAction.java
+++ /dev/null
@@ -1,690 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourceAttributes;
-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.Status;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TreeEditor;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.MoveResourcesOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.actions.LTKLauncher;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Standard action for renaming the selected resources.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class RenameResourceAction extends WorkspaceAction {
-
-	/*
-	 * The tree editing widgets. If treeEditor is null then edit using the
-	 * dialog. We keep the editorText around so that we can close it if a new
-	 * selection is made.
-	 */
-	private TreeEditor treeEditor;
-
-	private Tree navigatorTree;
-
-	private Text textEditor;
-
-	private Composite textEditorParent;
-
-	private TextActionHandler textActionHandler;
-
-	// The resource being edited if this is being done inline
-	private IResource inlinedResource;
-
-	private boolean saving = false;
-
-	/**
-	 * The id of this action.
-	 */
-	public static final String ID = PlatformUI.PLUGIN_ID
-			+ ".RenameResourceAction";//$NON-NLS-1$
-
-	/**
-	 * The new path.
-	 */
-	private IPath newPath;
-
-	private String[] modelProviderIds;
-
-	private static final String CHECK_RENAME_TITLE = IDEWorkbenchMessages.RenameResourceAction_checkTitle;
-
-	private static final String CHECK_RENAME_MESSAGE = IDEWorkbenchMessages.RenameResourceAction_readOnlyCheck;
-
-	private static String RESOURCE_EXISTS_TITLE = IDEWorkbenchMessages.RenameResourceAction_resourceExists;
-
-	private static String RESOURCE_EXISTS_MESSAGE = IDEWorkbenchMessages.RenameResourceAction_overwriteQuestion;
-
-	private static String PROJECT_EXISTS_MESSAGE = IDEWorkbenchMessages.RenameResourceAction_overwriteProjectQuestion;
-	
-	private static String PROJECT_EXISTS_TITLE = IDEWorkbenchMessages.RenameResourceAction_projectExists;
-
-	/**
-	 * Creates a new action. Using this constructor directly will rename using a
-	 * dialog rather than the inline editor of a ResourceNavigator.
-	 * 
-	 * @param shell
-	 *            the shell for any dialogs
-	 * @deprecated see {@link #RenameResourceAction(IShellProvider)}
-	 */
-	public RenameResourceAction(Shell shell) {
-		super(shell, IDEWorkbenchMessages.RenameResourceAction_text);
-		initAction();
-	}
-
-	/**
-	 * Creates a new action. Using this constructor directly will rename using a
-	 * dialog rather than the inline editor of a ResourceNavigator.
-	 * 
-	 * @param provider
-	 *            the IShellProvider for any dialogs
-	 * @since 3.4
-	 */
-	public RenameResourceAction(IShellProvider provider){
-		super(provider, IDEWorkbenchMessages.RenameResourceAction_text);
-		initAction();
-	}
-	
-	private void initAction(){
-		setToolTipText(IDEWorkbenchMessages.RenameResourceAction_toolTip);
-		setId(ID);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.RENAME_RESOURCE_ACTION);
-	}
-	/**
-	 * Creates a new action.
-	 * 
-	 * @param shell
-	 *            the shell for any dialogs
-	 * @param tree
-	 *            the tree
-	 * @deprecated see {@link #RenameResourceAction(IShellProvider, Tree)}
-	 */
-	public RenameResourceAction(Shell shell, Tree tree) {
-		this(shell);
-		this.navigatorTree = tree;
-		this.treeEditor = new TreeEditor(tree);
-	}
-	
-	/**
-	 * Creates a new action.
-	 * 
-	 * @param provider
-	 *            the shell provider for any dialogs
-	 * @param tree
-	 *            the tree
-	 * @since 3.4
-	 */
-	public RenameResourceAction(IShellProvider provider, Tree tree) {
-		this(provider);
-		this.navigatorTree = tree;
-		this.treeEditor = new TreeEditor(tree);
-	}
-
-	/**
-	 * Check if the user wishes to overwrite the supplied resource
-	 * 
-	 * @returns true if there is no collision or delete was successful
-	 * @param shell
-	 *            the shell to create the dialog in
-	 * @param destination -
-	 *            the resource to be overwritten
-	 */
-	private boolean checkOverwrite(final Shell shell,
-			final IResource destination) {
-
-		final boolean[] result = new boolean[1];
-
-		// Run it inside of a runnable to make sure we get to parent off of the
-		// shell as we are not in the UI thread.
-
-		Runnable query = new Runnable() {
-			public void run() {
-				String pathName = destination.getFullPath().makeRelative()
-						.toString();
-				String message = RESOURCE_EXISTS_MESSAGE;
-				String title = RESOURCE_EXISTS_TITLE;
-				if (destination.getType() == IResource.PROJECT) {
-					message = PROJECT_EXISTS_MESSAGE;
-					title = PROJECT_EXISTS_TITLE;
-				}
-				result[0] = MessageDialog.openQuestion(shell,
-						title, MessageFormat.format(message,
-								new Object[] { pathName }));
-			}
-
-		};
-
-		shell.getDisplay().syncExec(query);
-		return result[0];
-	}
-
-	/**
-	 * Check if the supplied resource is read only or null. If it is then ask
-	 * the user if they want to continue. Return true if the resource is not
-	 * read only or if the user has given permission.
-	 * 
-	 * @return boolean
-	 */
-	private boolean checkReadOnlyAndNull(IResource currentResource) {
-		// Do a quick read only and null check
-		if (currentResource == null) {
-			return false;
-		}
-
-		// Do a quick read only check
-		final ResourceAttributes attributes = currentResource
-				.getResourceAttributes();
-		if (attributes != null && attributes.isReadOnly()) {
-			return MessageDialog.openQuestion(getShell(), CHECK_RENAME_TITLE,
-					MessageFormat.format(CHECK_RENAME_MESSAGE,
-							new Object[] { currentResource.getName() }));
-		}
-
-		return true;
-	}
-
-	Composite createParent() {
-		Tree tree = getTree();
-		Composite result = new Composite(tree, SWT.NONE);
-		TreeItem[] selectedItems = tree.getSelection();
-		treeEditor.horizontalAlignment = SWT.LEFT;
-		treeEditor.grabHorizontal = true;
-		treeEditor.setEditor(result, selectedItems[0]);
-		return result;
-	}
-
-	/**
-	 * Get the inset used for cell editors
-	 * @param c the Control
-	 * @return int
-	 */
-	private static int getCellEditorInset(Control c) {
-		return 1; // one pixel wide black border
-	}
-
-	/**
-	 * Create the text editor widget.
-	 * 
-	 * @param resource
-	 *            the resource to rename
-	 */
-	private void createTextEditor(final IResource resource) {
-		// Create text editor parent. This draws a nice bounding rect.
-		textEditorParent = createParent();
-		textEditorParent.setVisible(false);
-		final int inset = getCellEditorInset(textEditorParent);
-		if (inset > 0) {
-			textEditorParent.addListener(SWT.Paint, new Listener() {
-				public void handleEvent(Event e) {
-					Point textSize = textEditor.getSize();
-					Point parentSize = textEditorParent.getSize();
-					e.gc.drawRectangle(0, 0, Math.min(textSize.x + 4,
-							parentSize.x - 1), parentSize.y - 1);
-				}
-			});
-		}
-		// Create inner text editor.
-		textEditor = new Text(textEditorParent, SWT.NONE);
-		textEditor.setFont(navigatorTree.getFont());
-		textEditorParent.setBackground(textEditor.getBackground());
-		textEditor.addListener(SWT.Modify, new Listener() {
-			public void handleEvent(Event e) {
-				Point textSize = textEditor.computeSize(SWT.DEFAULT,
-						SWT.DEFAULT);
-				textSize.x += textSize.y; // Add extra space for new
-				// characters.
-				Point parentSize = textEditorParent.getSize();
-				textEditor.setBounds(2, inset, Math.min(textSize.x,
-						parentSize.x - 4), parentSize.y - 2 * inset);
-				textEditorParent.redraw();
-			}
-		});
-		textEditor.addListener(SWT.Traverse, new Listener() {
-			public void handleEvent(Event event) {
-
-				// Workaround for Bug 20214 due to extra
-				// traverse events
-				switch (event.detail) {
-				case SWT.TRAVERSE_ESCAPE:
-					// Do nothing in this case
-					disposeTextWidget();
-					event.doit = true;
-					event.detail = SWT.TRAVERSE_NONE;
-					break;
-				case SWT.TRAVERSE_RETURN:
-					saveChangesAndDispose(resource);
-					event.doit = true;
-					event.detail = SWT.TRAVERSE_NONE;
-					break;
-				}
-			}
-		});
-		textEditor.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent fe) {
-				saveChangesAndDispose(resource);
-			}
-		});
-
-		if (textActionHandler != null) {
-			textActionHandler.addText(textEditor);
-		}
-	}
-
-	/**
-	 * Close the text widget and reset the editorText field.
-	 */
-	private void disposeTextWidget() {
-		if (textActionHandler != null) {
-			textActionHandler.removeText(textEditor);
-		}
-
-		if (textEditorParent != null) {
-			textEditorParent.dispose();
-			textEditorParent = null;
-			textEditor = null;
-			treeEditor.setEditor(null, null);
-		}
-	}
-
-	/**
-	 * Returns the elements that the action is to be performed on. Return the
-	 * resource cached by the action as we cannot rely on the selection being
-	 * correct for inlined text.
-	 * 
-	 * @return list of resource elements (element type: <code>IResource</code>)
-	 */
-	protected List getActionResources() {
-		if (inlinedResource == null) {
-			return super.getActionResources();
-		}
-
-		List actionResources = new ArrayList();
-		actionResources.add(inlinedResource);
-		return actionResources;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on WorkspaceAction.
-	 */
-	protected String getOperationMessage() {
-		return IDEWorkbenchMessages.RenameResourceAction_progress;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on WorkspaceAction.
-	 */
-	protected String getProblemsMessage() {
-		return IDEWorkbenchMessages.RenameResourceAction_problemMessage;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on WorkspaceAction.
-	 */
-	protected String getProblemsTitle() {
-		return IDEWorkbenchMessages.RenameResourceAction_problemTitle;
-	}
-
-	/**
-	 * Get the Tree being edited.
-	 * 
-	 * @returnTree
-	 */
-	private Tree getTree() {
-		return this.navigatorTree;
-	}
-
-	/**
-	 * Return the new name to be given to the target resource.
-	 * 
-	 * @return java.lang.String
-	 * @param resource
-	 *            the resource to query status on
-	 */
-	protected String queryNewResourceName(final IResource resource) {
-		final IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace();
-		final IPath prefix = resource.getFullPath().removeLastSegments(1);
-		IInputValidator validator = new IInputValidator() {
-			public String isValid(String string) {
-				if (resource.getName().equals(string)) {
-					return IDEWorkbenchMessages.RenameResourceAction_nameMustBeDifferent;
-				}
-				IStatus status = workspace.validateName(string, resource
-						.getType());
-				if (!status.isOK()) {
-					return status.getMessage();
-				}
-				if (workspace.getRoot().exists(prefix.append(string))) {
-					return IDEWorkbenchMessages.RenameResourceAction_nameExists;
-				}
-				return null;
-			}
-		};
-
-		InputDialog dialog = new InputDialog(getShell(),
-				IDEWorkbenchMessages.RenameResourceAction_inputDialogTitle,
-				IDEWorkbenchMessages.RenameResourceAction_inputDialogMessage,
-				resource.getName(), validator);
-		dialog.setBlockOnOpen(true);
-		int result = dialog.open();
-		if (result == Window.OK)
-			return dialog.getValue();
-		return null;
-	}
-
-	/**
-	 * Return the new name to be given to the target resource or
-	 * <code>null<code>
-	 * if the query was canceled. Rename the currently selected resource using the table editor. 
-	 * Continue the action when the user is done.
-	 *
-	 * @param resource the resource to rename
-	 */
-	private void queryNewResourceNameInline(final IResource resource) {
-		// Make sure text editor is created only once. Simply reset text
-		// editor when action is executed more than once. Fixes bug 22269.
-		if (textEditorParent == null) {
-			createTextEditor(resource);
-		}
-		textEditor.setText(resource.getName());
-
-		// Open text editor with initial size.
-		textEditorParent.setVisible(true);
-		Point textSize = textEditor.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		textSize.x += textSize.y; // Add extra space for new characters.
-		Point parentSize = textEditorParent.getSize();
-		int inset = getCellEditorInset(textEditorParent);
-		textEditor.setBounds(2, inset, Math.min(textSize.x, parentSize.x - 4),
-				parentSize.y - 2 * inset);
-		textEditorParent.redraw();
-		textEditor.selectAll();
-		textEditor.setFocus();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IAction; overrides method on
-	 * WorkspaceAction.
-	 */
-	public void run() {
-		IResource currentResource = getCurrentResource();
-		if (currentResource == null || !currentResource.exists()) {
-			return;
-		}
-		if (LTKLauncher.openRenameWizard(getStructuredSelection())) {
-			return;
-		}
-		if (this.navigatorTree == null) {
-			// Do a quick read only and null check
-			if (!checkReadOnlyAndNull(currentResource)) {
-				return;
-			}
-			String newName = queryNewResourceName(currentResource);
-			if (newName == null || newName.equals("")) { //$NON-NLS-1$
-				return;
-			}
-			newPath = currentResource.getFullPath().removeLastSegments(1)
-					.append(newName);
-			super.run();
-		} else {
-			runWithInlineEditor();
-		}
-	}
-
-	/*
-	 * Run the receiver using an inline editor from the supplied navigator. The
-	 * navigator will tell the action when the path is ready to run.
-	 */
-	private void runWithInlineEditor() {
-		IResource currentResource = getCurrentResource();
-		if (!checkReadOnlyAndNull(currentResource)) {
-			return;
-		}
-		queryNewResourceNameInline(currentResource);
-	}
-
-	/**
-	 * Return the currently selected resource. Only return an IResouce if there
-	 * is one and only one resource selected.
-	 * 
-	 * @return IResource or <code>null</code> if there is zero or more than
-	 *         one resources selected.
-	 */
-	private IResource getCurrentResource() {
-		List resources = getSelectedResources();
-		if (resources.size() == 1) {
-			return (IResource) resources.get(0);
-		}
-		return null;
-
-	}
-
-	/**
-	 * @param path
-	 *            the path
-	 * @param resource
-	 *            the resource
-	 */
-	protected void runWithNewPath(IPath path, IResource resource) {
-		this.newPath = path;
-		super.run();
-	}
-
-	/**
-	 * Save the changes and dispose of the text widget.
-	 * 
-	 * @param resource -
-	 *            the resource to move.
-	 */
-	private void saveChangesAndDispose(IResource resource) {
-		if (saving == true) {
-			return;
-		}
-
-		saving = true;
-		// Cache the resource to avoid selection loss since a selection of
-		// another item can trigger this method
-		inlinedResource = resource;
-		final String newName = textEditor.getText();
-		// Run this in an async to make sure that the operation that triggered
-		// this action is completed. Otherwise this leads to problems when the
-		// icon of the item being renamed is clicked (i.e., which causes the
-		// rename
-		// text widget to lose focus and trigger this method).
-		Runnable query = new Runnable() {
-			public void run() {
-				try {
-					if (!newName.equals(inlinedResource.getName())) {
-						IWorkspace workspace = IDEWorkbenchPlugin
-								.getPluginWorkspace();
-						IStatus status = workspace.validateName(newName,
-								inlinedResource.getType());
-						if (!status.isOK()) {
-							displayError(status.getMessage());
-						} else {
-							IPath newPath = inlinedResource.getFullPath()
-									.removeLastSegments(1).append(newName);
-							runWithNewPath(newPath, inlinedResource);
-						}
-					}
-					inlinedResource = null;
-					// Dispose the text widget regardless
-					disposeTextWidget();
-					// Ensure the Navigator tree has focus, which it may not if
-					// the
-					// text widget previously had focus.
-					if (navigatorTree != null && !navigatorTree.isDisposed()) {
-						navigatorTree.setFocus();
-					}
-				} finally {
-					saving = false;
-				}
-			}
-		};
-		getTree().getShell().getDisplay().asyncExec(query);
-	}
-
-	/**
-	 * The <code>RenameResourceAction</code> implementation of this
-	 * <code>SelectionListenerAction</code> method ensures that this action is
-	 * disabled if any of the selections are not resources or resources that are
-	 * not local.
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		disposeTextWidget();
-
-		if (selection.size() > 1) {
-			return false;
-		}
-		if (!super.updateSelection(selection)) {
-			return false;
-		}
-
-		IResource currentResource = getCurrentResource();
-		if (currentResource == null || !currentResource.exists()) {
-			return false;
-		}
-
-		return true;
-	}
-
-	/**
-	 * Set the text action handler.
-	 * 
-	 * @param actionHandler
-	 *            the action handler
-	 */
-	public void setTextActionHandler(TextActionHandler actionHandler) {
-		textActionHandler = actionHandler;
-	}
-
-	/**
-	 * Returns the model provider ids that are known to the client that
-	 * instantiated this operation.
-	 * 
-	 * @return the model provider ids that are known to the client that
-	 *         instantiated this operation.
-	 * @since 3.2
-	 */
-	public String[] getModelProviderIds() {
-		return modelProviderIds;
-	}
-
-	/**
-	 * Sets the model provider ids that are known to the client that
-	 * instantiated this operation. Any potential side effects reported by these
-	 * models during validation will be ignored.
-	 * 
-	 * @param modelProviderIds
-	 *            the model providers known to the client who is using this
-	 *            operation.
-	 * @since 3.2
-	 */
-	public void setModelProviderIds(String[] modelProviderIds) {
-		this.modelProviderIds = modelProviderIds;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.WorkspaceAction#createOperation(org.eclipse.core.runtime.IStatus[])
-	 * 
-	 * Overridden to create and execute an undoable operation that performs the
-	 * rename.
-	 * @since 3.3
-	 */
-	protected IRunnableWithProgress createOperation(final IStatus[] errorStatus) {
-		return new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor) {
-				IResource[] resources = (IResource[]) getActionResources()
-						.toArray(new IResource[getActionResources().size()]);
-				// Rename is only valid for a single resource. This has already
-				// been validated.
-				if (resources.length == 1) {
-					// check for overwrite
-					IWorkspaceRoot workspaceRoot = resources[0].getWorkspace()
-							.getRoot();
-					IResource newResource = workspaceRoot.findMember(newPath);
-					boolean go = true;
-					if (newResource != null) {
-						go = checkOverwrite(getShell(), newResource);
-					}
-					if (go) {
-						MoveResourcesOperation op = new MoveResourcesOperation(
-								resources[0],
-								newPath,
-								IDEWorkbenchMessages.RenameResourceAction_operationTitle);
-						op.setModelProviderIds(getModelProviderIds());
-						try {
-							PlatformUI
-									.getWorkbench()
-									.getOperationSupport()
-									.getOperationHistory()
-									.execute(
-											op,
-											monitor,
-											WorkspaceUndoUtil
-													.getUIInfoAdapter(getShell()));
-						} catch (ExecutionException e) {
-							if (e.getCause() instanceof CoreException) {
-								errorStatus[0] = ((CoreException) e.getCause())
-										.getStatus();
-							} else {
-								errorStatus[0] = new Status(IStatus.ERROR,
-										PlatformUI.PLUGIN_ID,
-										getProblemsMessage(), e);
-							}
-						}
-					}
-				}
-			}
-		};
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/ScrubLocalAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/ScrubLocalAction.java
deleted file mode 100644
index 804fe56..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/ScrubLocalAction.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-
-/**
- * Standard action for scrubbing the local content in the local file system of
- * the selected resources and all of their descendents.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @deprecated This class is obsolete; there is no support in the workspace
- * for scrubbing local content.
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ScrubLocalAction extends WorkspaceAction {
-
-    /**
-     * The id of this action.
-     */
-    public static final String ID = "org.eclipse.ui.ScrubLocalAction";//$NON-NLS-1$
-
-    /**
-     * Creates a new action.
-     *
-     * @param shell the shell for any dialogs
-     */
-    public ScrubLocalAction(Shell shell) {
-        super(shell, IDEWorkbenchMessages.ScrubLocalAction_text);
-        setToolTipText(IDEWorkbenchMessages.ScrubLocalAction_toolTip);
-        setId(ID);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.SCRUB_LOCAL_ACTION);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkspaceAction.
-     */
-    protected String getOperationMessage() {
-        return IDEWorkbenchMessages.ScrubLocalAction_progress;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkspaceAction.
-     */
-    protected String getProblemsMessage() {
-        return IDEWorkbenchMessages.ScrubLocalAction_problemsMessage;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkspaceAction.
-     */
-    protected String getProblemsTitle() {
-        return IDEWorkbenchMessages.ScrubLocalAction_problemsTitle;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkspaceAction.
-     */
-    protected void invokeOperation(IResource resource, IProgressMonitor monitor)
-            throws CoreException {
-        resource.setLocal(false, IResource.DEPTH_INFINITE, monitor);
-    }
-
-    /**
-     * The <code>ScrubLocalAction</code> implementation of this
-     * <code>SelectionListenerAction</code> method ensures that this action is
-     * disabled if any of the selections are not resources.
-     */
-    protected boolean updateSelection(IStructuredSelection s) {
-        return super.updateSelection(s)
-                && getSelectedNonResources().size() == 0;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/SelectionListenerAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/SelectionListenerAction.java
deleted file mode 100644
index cc2d69f..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/SelectionListenerAction.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.resources.mapping.ResourceMappingContext;
-import org.eclipse.core.resources.mapping.ResourceTraversal;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IAdapterManager;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * The abstract superclass for resource-based actions that listen to selection
- * change events. This implementation tracks the current selection (see
- * <code>getStructuredSelection</code>) and provides a convenient place to
- * monitor selection changes that could affect the availability of the action.
- * <p>
- * Subclasses must implement the following <code>IAction</code> method:
- * <ul>
- * <li><code>run</code> - to do the action's work</li>
- * </ul>
- * </p>
- * <p>
- * Subclasses may extend the <code>updateSelection</code> method to update the
- * action determine its availability based on the current selection.
- * </p>
- * <p>
- * The object instantiating the subclass is responsible for registering the
- * instance with a selection provider. Alternatively, the object can notify the
- * subclass instance directly of a selection change using the methods:
- * <ul>
- * <li><code>selectionChanged(IStructuredSelection)</code> - passing the
- * selection</li>
- * <li><code>selectionChanged(ISelectionChangedEvent)</code> - passing the
- * selection change event</li>
- * </ul>
- * </p>
- */
-public abstract class SelectionListenerAction extends
-		BaseSelectionListenerAction {
-	/**
-	 * Empty list that is immutable.
-	 */
-	private static final List EMPTY_LIST = Arrays.asList(new Object[0]);
-
-	/**
-	 * Indicates whether the selection has changes since <code>resources</code>
-	 * and <code>nonResources</code> were computed.
-	 */
-	private boolean selectionDirty = true;
-
-	/**
-	 * The list of resource elements in the current selection (element type:
-	 * <code>IResource</code>); meaningful only when
-	 * <code>selectionDirty == false</code>.
-	 */
-	private List resources;
-
-	/**
-	 * The list of non-resource elements in the current selection (element type:
-	 * <code>Object</code>); meaningful only when
-	 * <code>selectionDirty == false</code>.
-	 */
-	private List nonResources;
-
-	/**
-	 * Creates a new action with the given text.
-	 * 
-	 * @param text
-	 *            the string used as the text for the action, or
-	 *            <code>null</code> if there is no text
-	 */
-	protected SelectionListenerAction(String text) {
-		super(text);
-	}
-
-	/**
-	 * The <code>SelectionListenerAction</code> implementation of this
-	 * <code>BaseSelectionListenerAction</code> method clears the cached
-	 * resources and non-resources.
-	 */
-	protected void clearCache() {
-		selectionDirty = true;
-		// clear out the lists in case computeResources does not get called
-		// immediately
-		resources = null;
-		nonResources = null;
-	}
-
-	/**
-	 * Extracts <code>IResource</code>s from the current selection and adds
-	 * them to the resources list, and the rest into the non-resources list.
-	 */
-	private final void computeResources() {
-		resources = null;
-		nonResources = null;
-
-		for (Iterator e = getStructuredSelection().iterator(); e.hasNext();) {
-			Object next = e.next();
-			if (next instanceof IResource) {
-				if (resources == null) {
-					// assume selection contains mostly resources most times
-					resources = new ArrayList(getStructuredSelection().size());
-				}
-				resources.add(next);
-				continue;
-			} else if (next instanceof IAdaptable) {
-				Object resource = ((IAdaptable) next)
-						.getAdapter(IResource.class);
-				if (resource != null) {
-					if (resources == null) {
-						// assume selection contains mostly resources most times
-						resources = new ArrayList(getStructuredSelection()
-								.size());
-					}
-					resources.add(resource);
-					continue;
-				}
-			} else {
-
-				boolean resourcesFoundForThisSelection = false;
-
-				IAdapterManager adapterManager = Platform.getAdapterManager();
-				ResourceMapping mapping = (ResourceMapping) adapterManager
-						.getAdapter(next, ResourceMapping.class);
-
-				if (mapping != null) {
-
-					ResourceTraversal[] traversals = null;
-					try {
-						traversals = mapping.getTraversals(
-								ResourceMappingContext.LOCAL_CONTEXT,
-								new NullProgressMonitor());
-					} catch (CoreException exception) {
-						IDEWorkbenchPlugin.log(exception.getLocalizedMessage(),
-								exception.getStatus());
-					}
-
-					if (traversals != null) {
-
-						for (int i = 0; i < traversals.length; i++) {
-
-							IResource[] traversalResources = traversals[i]
-									.getResources();
-
-							if (traversalResources != null) {
-
-								resourcesFoundForThisSelection = true;
-
-								if (resources == null) {
-									resources = new ArrayList(
-											getStructuredSelection().size());
-								}
-
-								for (int j = 0; j < traversalResources.length; j++) {
-									resources.add(traversalResources[j]);
-								}// for
-
-							}// if
-
-						}// for
-
-					}// if
-
-				}// if
-
-				if (resourcesFoundForThisSelection) {
-					continue;
-				}
-			}
-
-			if (nonResources == null) {
-				// assume selection contains mostly resources most times
-				nonResources = new ArrayList(1);
-			}
-			nonResources.add(next);
-		}
-	}
-
-	/**
-	 * Returns the elements in the current selection that are not
-	 * <code>IResource</code>s.
-	 * 
-	 * @return list of elements (element type: <code>Object</code>)
-	 */
-	protected List getSelectedNonResources() {
-		// recompute if selection has changed.
-		if (selectionDirty) {
-			computeResources();
-			selectionDirty = false;
-		}
-
-		if (nonResources == null) {
-			return EMPTY_LIST;
-		}
-		
-		return nonResources;
-	}
-
-	/**
-	 * Returns the elements in the current selection that are
-	 * <code>IResource</code>s.
-	 * 
-	 * @return list of resource elements (element type: <code>IResource</code>)
-	 */
-	protected List getSelectedResources() {
-		// recompute if selection has changed.
-		if (selectionDirty) {
-			computeResources();
-			selectionDirty = false;
-		}
-
-		if (resources == null) {
-			return EMPTY_LIST;
-		}
-		return resources;
-	}
-
-	/**
-	 * Returns whether the type of the given resource is among those in the
-	 * given resource type mask.
-	 * 
-	 * @param resource
-	 *            the resource
-	 * @param resourceMask
-	 *            a bitwise OR of resource types: <code>IResource</code>.{<code>FILE</code>,
-	 *            <code>FOLDER</code>, <code>PROJECT</code>,
-	 *            <code>ROOT</code>}
-	 * @return <code>true</code> if the resource type matches, and
-	 *         <code>false</code> otherwise
-	 * @see IResource
-	 */
-	protected boolean resourceIsType(IResource resource, int resourceMask) {
-		return (resource.getType() & resourceMask) != 0;
-	}
-
-	/**
-	 * Returns whether the current selection consists entirely of resources
-	 * whose types are among those in the given resource type mask.
-	 * 
-	 * @param resourceMask
-	 *            a bitwise OR of resource types: <code>IResource</code>.{<code>FILE</code>,
-	 *            <code>FOLDER</code>, <code>PROJECT</code>,
-	 *            <code>ROOT</code>}
-	 * @return <code>true</code> if all resources in the current selection are
-	 *         of the specified types or if the current selection is empty, and
-	 *         <code>false</code> if some elements are resources of a
-	 *         different type or not resources
-	 * @see IResource
-	 */
-	protected boolean selectionIsOfType(int resourceMask) {
-		if (getSelectedNonResources().size() > 0) {
-			return false;
-		}
-
-		for (Iterator e = getSelectedResources().iterator(); e.hasNext();) {
-			IResource next = (IResource) e.next();
-			if (!resourceIsType(next, resourceMask)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/TextActionHandler.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/TextActionHandler.java
deleted file mode 100644
index 2c7c2bb..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/TextActionHandler.java
+++ /dev/null
@@ -1,557 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-
-/**
- * Handles the redirection of the global Cut, Copy, Paste, and
- * Select All actions to either the current inline text control
- * or the part's supplied action handler.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p><p>
- * Example usage:
- * <pre>
- * textActionHandler = new TextActionHandler(this.getViewSite().getActionBars());
- * textActionHandler.addText((Text)textCellEditor1.getControl());
- * textActionHandler.addText((Text)textCellEditor2.getControl());
- * textActionHandler.setSelectAllAction(selectAllAction);
- * </pre>
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class TextActionHandler {
-    private DeleteActionHandler textDeleteAction = new DeleteActionHandler();
-
-    private CutActionHandler textCutAction = new CutActionHandler();
-
-    private CopyActionHandler textCopyAction = new CopyActionHandler();
-
-    private PasteActionHandler textPasteAction = new PasteActionHandler();
-
-    private SelectAllActionHandler textSelectAllAction = new SelectAllActionHandler();
-
-    private IAction deleteAction;
-
-    private IAction cutAction;
-
-    private IAction copyAction;
-
-    private IAction pasteAction;
-
-    private IAction selectAllAction;
-
-    private IPropertyChangeListener deleteActionListener = new PropertyChangeListener(
-            textDeleteAction);
-
-    private IPropertyChangeListener cutActionListener = new PropertyChangeListener(
-            textCutAction);
-
-    private IPropertyChangeListener copyActionListener = new PropertyChangeListener(
-            textCopyAction);
-
-    private IPropertyChangeListener pasteActionListener = new PropertyChangeListener(
-            textPasteAction);
-
-    private IPropertyChangeListener selectAllActionListener = new PropertyChangeListener(
-            textSelectAllAction);
-
-    private Listener textControlListener = new TextControlListener();
-
-    private Text activeTextControl;
-
-    private MouseAdapter mouseAdapter = new MouseAdapter() {
-        public void mouseUp(MouseEvent e) {
-            updateActionsEnableState();
-        }
-    };
-
-    private KeyAdapter keyAdapter = new KeyAdapter() {
-        public void keyReleased(KeyEvent e) {
-            updateActionsEnableState();
-        }
-    };
-
-    private class TextControlListener implements Listener {
-        public void handleEvent(Event event) {
-            switch (event.type) {
-            case SWT.Activate:
-                activeTextControl = (Text) event.widget;
-                updateActionsEnableState();
-                break;
-            case SWT.Deactivate:
-                activeTextControl = null;
-                updateActionsEnableState();
-                break;
-            default:
-                break;
-            }
-        }
-    }
-
-    private class PropertyChangeListener implements IPropertyChangeListener {
-        private IAction actionHandler;
-
-        protected PropertyChangeListener(IAction actionHandler) {
-            super();
-            this.actionHandler = actionHandler;
-        }
-
-        public void propertyChange(PropertyChangeEvent event) {
-            if (activeTextControl != null) {
-				return;
-			}
-            if (event.getProperty().equals(IAction.ENABLED)) {
-                Boolean bool = (Boolean) event.getNewValue();
-                actionHandler.setEnabled(bool.booleanValue());
-            }
-        }
-    }
-
-    private class DeleteActionHandler extends Action {
-        protected DeleteActionHandler() {
-            super(IDEWorkbenchMessages.Delete);
-            setId("TextDeleteActionHandler");//$NON-NLS-1$
-            setEnabled(false);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-					IIDEHelpContextIds.TEXT_DELETE_ACTION);
-        }
-
-        public void runWithEvent(Event event) {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-				String text = activeTextControl.getText();
-				Point selection = activeTextControl.getSelection();
-				if (selection.y == selection.x) {
-					++selection.y;
-				}
-				if (selection.y > text.length()) {
-					return;
-				}
-				StringBuffer buf = new StringBuffer(text.substring(0,
-						selection.x));
-				buf.append(text.substring(selection.y));
-				activeTextControl.setText(buf.toString());
-				activeTextControl.setSelection(selection.x, selection.x);
-				updateActionsEnableState();
-				return;
-			}
-            if (deleteAction != null) {
-                deleteAction.runWithEvent(event);
-                return;
-            }
-        }
-
-        /**
-         * Update state.
-         */
-        public void updateEnabledState() {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                setEnabled(activeTextControl.getSelectionCount() > 0
-                        || activeTextControl.getCaretPosition() < activeTextControl
-                                .getCharCount());
-                return;
-            }
-            if (deleteAction != null) {
-                setEnabled(deleteAction.isEnabled());
-                return;
-            }
-            setEnabled(false);
-        }
-    }
-
-    private class CutActionHandler extends Action {
-        protected CutActionHandler() {
-            super(IDEWorkbenchMessages.Cut);
-            setId("TextCutActionHandler");//$NON-NLS-1$
-            setEnabled(false);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-					IIDEHelpContextIds.TEXT_CUT_ACTION);
-        }
-
-        public void runWithEvent(Event event) {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                activeTextControl.cut();
-                updateActionsEnableState();
-                return;
-            }
-            if (cutAction != null) {
-                cutAction.runWithEvent(event);
-                return;
-            }
-        }
-
-        /**
-         * Update state.
-         */
-        public void updateEnabledState() {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                setEnabled(activeTextControl.getSelectionCount() > 0);
-                return;
-            }
-            if (cutAction != null) {
-                setEnabled(cutAction.isEnabled());
-                return;
-            }
-            setEnabled(false);
-        }
-    }
-
-    private class CopyActionHandler extends Action {
-        protected CopyActionHandler() {
-            super(IDEWorkbenchMessages.Copy);
-            setId("TextCopyActionHandler");//$NON-NLS-1$
-            setEnabled(false);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-					IIDEHelpContextIds.TEXT_COPY_ACTION);
-        }
-
-        public void runWithEvent(Event event) {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                activeTextControl.copy();
-                updateActionsEnableState();
-                return;
-            }
-            if (copyAction != null) {
-                copyAction.runWithEvent(event);
-                return;
-            }
-        }
-
-        /**
-         * Update the state.
-         */
-        public void updateEnabledState() {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                setEnabled(activeTextControl.getSelectionCount() > 0);
-                return;
-            }
-            if (copyAction != null) {
-                setEnabled(copyAction.isEnabled());
-                return;
-            }
-            setEnabled(false);
-        }
-    }
-
-    private class PasteActionHandler extends Action {
-        protected PasteActionHandler() {
-            super(IDEWorkbenchMessages.Paste);
-            setId("TextPasteActionHandler");//$NON-NLS-1$
-            setEnabled(false);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-					IIDEHelpContextIds.TEXT_PASTE_ACTION);
-        }
-
-        public void runWithEvent(Event event) {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                activeTextControl.paste();
-                updateActionsEnableState();
-                return;
-            }
-            if (pasteAction != null) {
-                pasteAction.runWithEvent(event);
-                return;
-            }
-        }
-
-        /**
-         * Update the state
-         */
-        public void updateEnabledState() {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                setEnabled(true);
-                return;
-            }
-            if (pasteAction != null) {
-                setEnabled(pasteAction.isEnabled());
-                return;
-            }
-            setEnabled(false);
-        }
-    }
-
-    private class SelectAllActionHandler extends Action {
-        protected SelectAllActionHandler() {
-            super(IDEWorkbenchMessages.TextAction_selectAll);
-            setId("TextSelectAllActionHandler");//$NON-NLS-1$
-            setEnabled(false);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-					IIDEHelpContextIds.TEXT_SELECT_ALL_ACTION);
-        }
-
-        public void runWithEvent(Event event) {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                activeTextControl.selectAll();
-                updateActionsEnableState();
-                return;
-            }
-            if (selectAllAction != null) {
-                selectAllAction.runWithEvent(event);
-                return;
-            }
-        }
-
-        /**
-         * Update the state.
-         */
-        public void updateEnabledState() {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                setEnabled(true);
-                return;
-            }
-            if (selectAllAction != null) {
-                setEnabled(selectAllAction.isEnabled());
-                return;
-            }
-            setEnabled(false);
-        }
-    }
-
-    /**
-     * Creates a <code>Text</code> control action handler
-     * for the global Cut, Copy, Paste, Delete, and Select All 
-     * of the action bar.
-     *
-     * @param actionBar the action bar to register global
-     *    action handlers for Cut, Copy, Paste, Delete, 
-     * 	  and Select All
-     */
-    public TextActionHandler(IActionBars actionBar) {
-        super();
-        actionBar.setGlobalActionHandler(ActionFactory.CUT.getId(),
-                textCutAction);
-        actionBar.setGlobalActionHandler(ActionFactory.COPY.getId(),
-                textCopyAction);
-        actionBar.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-                textPasteAction);
-        actionBar.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
-                textSelectAllAction);
-        actionBar.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-                textDeleteAction);
-    }
-
-    /**
-     * Add a <code>Text</code> control to the handler
-     * so that the Cut, Copy, Paste, Delete, and Select All 
-     * actions are redirected to it when active.
-     *
-     * @param textControl the inline <code>Text</code> control
-     */
-    public void addText(Text textControl) {
-        if (textControl == null) {
-			return;
-		}
-
-        activeTextControl = textControl;
-        textControl.addListener(SWT.Activate, textControlListener);
-        textControl.addListener(SWT.Deactivate, textControlListener);
-
-        // We really want a selection listener but it is not supported so we
-        // use a key listener and a mouse listener to know when selection changes
-        // may have occured
-        textControl.addKeyListener(keyAdapter);
-        textControl.addMouseListener(mouseAdapter);
-
-    }
-
-    /**
-     * Dispose of this action handler
-     */
-    public void dispose() {
-        setCutAction(null);
-        setCopyAction(null);
-        setPasteAction(null);
-        setSelectAllAction(null);
-        setDeleteAction(null);
-    }
-
-    /**
-     * Removes a <code>Text</code> control from the handler
-     * so that the Cut, Copy, Paste, Delete, and Select All 
-     * actions are no longer redirected to it when active.
-     *
-     * @param textControl the inline <code>Text</code> control
-     */
-    public void removeText(Text textControl) {
-        if (textControl == null) {
-			return;
-		}
-
-        textControl.removeListener(SWT.Activate, textControlListener);
-        textControl.removeListener(SWT.Deactivate, textControlListener);
-
-        textControl.removeMouseListener(mouseAdapter);
-        textControl.removeKeyListener(keyAdapter);
-
-        activeTextControl = null;
-        updateActionsEnableState();
-    }
-
-    /**
-     * Set the default <code>IAction</code> handler for the Copy
-     * action. This <code>IAction</code> is run only if no active
-     * inline text control.
-     *
-     * @param action the <code>IAction</code> to run for the
-     *    Copy action, or <code>null</code> if not interested.
-     */
-    public void setCopyAction(IAction action) {
-        if (copyAction == action) {
-			return;
-		}
-
-        if (copyAction != null) {
-			copyAction.removePropertyChangeListener(copyActionListener);
-		}
-
-        copyAction = action;
-
-        if (copyAction != null) {
-			copyAction.addPropertyChangeListener(copyActionListener);
-		}
-
-        textCopyAction.updateEnabledState();
-    }
-
-    /**
-     * Set the default <code>IAction</code> handler for the Cut
-     * action. This <code>IAction</code> is run only if no active
-     * inline text control.
-     *
-     * @param action the <code>IAction</code> to run for the
-     *    Cut action, or <code>null</code> if not interested.
-     */
-    public void setCutAction(IAction action) {
-        if (cutAction == action) {
-			return;
-		}
-
-        if (cutAction != null) {
-			cutAction.removePropertyChangeListener(cutActionListener);
-		}
-
-        cutAction = action;
-
-        if (cutAction != null) {
-			cutAction.addPropertyChangeListener(cutActionListener);
-		}
-
-        textCutAction.updateEnabledState();
-    }
-
-    /**
-     * Set the default <code>IAction</code> handler for the Paste
-     * action. This <code>IAction</code> is run only if no active
-     * inline text control.
-     *
-     * @param action the <code>IAction</code> to run for the
-     *    Paste action, or <code>null</code> if not interested.
-     */
-    public void setPasteAction(IAction action) {
-        if (pasteAction == action) {
-			return;
-		}
-
-        if (pasteAction != null) {
-			pasteAction.removePropertyChangeListener(pasteActionListener);
-		}
-
-        pasteAction = action;
-
-        if (pasteAction != null) {
-			pasteAction.addPropertyChangeListener(pasteActionListener);
-		}
-
-        textPasteAction.updateEnabledState();
-    }
-
-    /**
-     * Set the default <code>IAction</code> handler for the Select All
-     * action. This <code>IAction</code> is run only if no active
-     * inline text control.
-     *
-     * @param action the <code>IAction</code> to run for the
-     *    Select All action, or <code>null</code> if not interested.
-     */
-    public void setSelectAllAction(IAction action) {
-        if (selectAllAction == action) {
-			return;
-		}
-
-        if (selectAllAction != null) {
-			selectAllAction
-                    .removePropertyChangeListener(selectAllActionListener);
-		}
-
-        selectAllAction = action;
-
-        if (selectAllAction != null) {
-			selectAllAction.addPropertyChangeListener(selectAllActionListener);
-		}
-
-        textSelectAllAction.updateEnabledState();
-    }
-
-    /**
-     * Set the default <code>IAction</code> handler for the Delete
-     * action. This <code>IAction</code> is run only if no active
-     * inline text control.
-     *
-     * @param action the <code>IAction</code> to run for the
-     *    Delete action, or <code>null</code> if not interested.
-     */
-    public void setDeleteAction(IAction action) {
-        if (deleteAction == action) {
-			return;
-		}
-
-        if (deleteAction != null) {
-			deleteAction.removePropertyChangeListener(deleteActionListener);
-		}
-
-        deleteAction = action;
-
-        if (deleteAction != null) {
-			deleteAction.addPropertyChangeListener(deleteActionListener);
-		}
-
-        textDeleteAction.updateEnabledState();
-    }
-
-    /**
-     * Update the enable state of the Cut, Copy,
-     * Paste, Delete, and Select All action handlers
-     */
-    private void updateActionsEnableState() {
-        textCutAction.updateEnabledState();
-        textCopyAction.updateEnabledState();
-        textPasteAction.updateEnabledState();
-        textSelectAllAction.updateEnabledState();
-        textDeleteAction.updateEnabledState();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/WorkspaceAction.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/WorkspaceAction.java
deleted file mode 100644
index 5f14daa..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/WorkspaceAction.java
+++ /dev/null
@@ -1,520 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.WorkspaceJob;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.StatusUtil;
-import org.eclipse.ui.internal.progress.ProgressMonitorJobsDialog;
-
-/**
- * The abstract superclass for actions which invoke commands implemented in
- * org.eclipse.core.* on a set of selected resources.
- * 
- * It iterates over all selected resources; errors are collected and displayed
- * to the user via a problems dialog at the end of the operation. User requests
- * to cancel the operation are passed along to the core.
- * <p>
- * Subclasses must implement the following methods:
- * <ul>
- * <li><code>invokeOperation</code> - to perform the operation on one of the
- * selected resources</li>
- * <li><code>getOperationMessage</code> - to furnish a title for the progress
- * dialog</li>
- * </ul>
- * </p>
- * <p>
- * Subclasses may override the following methods:
- * <ul>
- * <li><code>shouldPerformResourcePruning</code> - reimplement to turn off</li>
- * <li><code>updateSelection</code> - extend to refine enablement criteria</li>
- * <li><code>getProblemsTitle</code> - reimplement to furnish a title for the
- * problems dialog</li>
- * <li><code>getProblemsMessage</code> - reimplement to furnish a message for
- * the problems dialog</li>
- * <li><code>run</code> - extend to </li>
- * </ul>
- * </p>
- */
-public abstract class WorkspaceAction extends SelectionListenerAction {
-	/**
-	 * The shell in which to show the progress and problems dialog.
-	 */
-	private final IShellProvider shellProvider;
-
-	/**
-	 * Creates a new action with the given text.
-	 * 
-	 * @param shell
-	 *            the shell (for the modal progress dialog and error messages)
-	 * @param text
-	 *            the string used as the text for the action, or
-	 *            <code>null</code> if there is no text
-	 * @deprecated See {@link #WorkspaceAction(IShellProvider, String)}
-	 */
-	protected WorkspaceAction(final Shell shell, String text) {
-		super(text);
-		Assert.isNotNull(shell);
-		shellProvider = new IShellProvider() {
-			public Shell getShell() {
-				return shell;
-			} };
-	}
-	
-	/**
-	 * Creates a new action with the given text.
-	 * 
-	 * @param provider
-	 *            the shell provider (for the modal progress dialog and error
-	 *            messages)
-	 * @param text
-	 *            the string used as the text for the action, or
-	 *            <code>null</code> if there is no text
-	 * @since 3.4
-	 */
-	protected WorkspaceAction(IShellProvider provider, String text) {
-		super(text);
-		Assert.isNotNull(provider);
-		shellProvider = provider;
-	}
-
-	/**
-	 * Opens an error dialog to display the given message.
-	 * <p>
-	 * Note that this method must be called from UI thread.
-	 * </p>
-	 * 
-	 * @param message
-	 *            the message
-	 */
-	void displayError(String message) {
-		if (message == null) {
-			message = IDEWorkbenchMessages.WorkbenchAction_internalError;
-		}
-		MessageDialog.openError(shellProvider.getShell(), getProblemsTitle(), message);
-	}
-
-	/**
-	 * Runs <code>invokeOperation</code> on each of the selected resources,
-	 * reporting progress and fielding cancel requests from the given progress
-	 * monitor.
-	 * <p>
-	 * Note that if an action is running in the background, the same action
-	 * instance can be executed multiple times concurrently. This method must
-	 * not access or modify any mutable state on action class.
-	 * 
-	 * @param monitor
-	 *            a progress monitor
-	 * @return The result of the execution
-	 */
-	final IStatus execute(List resources, IProgressMonitor monitor) {
-		MultiStatus errors = null;
-		// 1FTIMQN: ITPCORE:WIN - clients required to do too much iteration work
-		if (shouldPerformResourcePruning()) {
-			resources = pruneResources(resources);
-		}
-		// 1FV0B3Y: ITPUI:ALL - sub progress monitors granularity issues
-		monitor.beginTask("", resources.size() * 1000); //$NON-NLS-1$
-		// Fix for bug 31768 - Don't provide a task name in beginTask
-		// as it will be appended to each subTask message. Need to
-		// call setTaskName as its the only was to assure the task name is
-		// set in the monitor (see bug 31824)
-		monitor.setTaskName(getOperationMessage());
-		Iterator resourcesEnum = resources.iterator();
-		try {
-			while (resourcesEnum.hasNext()) {
-				IResource resource = (IResource) resourcesEnum.next();
-				try {
-					// 1FV0B3Y: ITPUI:ALL - sub progress monitors granularity
-					// issues
-					invokeOperation(resource, new SubProgressMonitor(monitor,
-							1000));
-				} catch (CoreException e) {
-					errors = recordError(errors, e);
-				}
-				if (monitor.isCanceled()) {
-					throw new OperationCanceledException();
-				}
-			}
-			return errors == null ? Status.OK_STATUS : errors;
-		} finally {
-			monitor.done();
-		}
-	}
-
-	/**
-	 * Returns the string to display for this action's operation.
-	 * <p>
-	 * Note that this hook method is invoked in a non-UI thread.
-	 * </p>
-	 * <p>
-	 * Subclasses must implement this method.
-	 * </p>
-	 * 
-	 * @return the message
-	 * 
-	 * @since 3.1
-	 */
-	protected abstract String getOperationMessage();
-
-	/**
-	 * Returns the string to display for this action's problems dialog.
-	 * <p>
-	 * The <code>WorkspaceAction</code> implementation of this method returns
-	 * a vague message (localized counterpart of something like "The following
-	 * problems occurred."). Subclasses may reimplement to provide something
-	 * more suited to the particular action.
-	 * </p>
-	 * 
-	 * @return the problems message
-	 * 
-	 * @since 3.1
-	 */
-	protected String getProblemsMessage() {
-		return IDEWorkbenchMessages.WorkbenchAction_problemsMessage;
-	}
-
-	/**
-	 * Returns the title for this action's problems dialog.
-	 * <p>
-	 * The <code>WorkspaceAction</code> implementation of this method returns
-	 * a generic title (localized counterpart of "Problems"). Subclasses may
-	 * reimplement to provide something more suited to the particular action.
-	 * </p>
-	 * 
-	 * @return the problems dialog title
-	 * 
-	 * @since 3.1
-	 */
-	protected String getProblemsTitle() {
-		return IDEWorkbenchMessages.WorkspaceAction_problemsTitle;
-	}
-
-	/**
-	 * Returns the shell for this action. This shell is used for the modal
-	 * progress and error dialogs.
-	 * 
-	 * @return the shell
-	 */
-	Shell getShell() {
-		return shellProvider.getShell();
-	}
-
-	/**
-	 * Performs this action's operation on each of the selected resources,
-	 * reporting progress to, and fielding cancel requests from, the given
-	 * progress monitor.
-	 * <p>
-	 * Note that this method is invoked in a non-UI thread.
-	 * </p>
-	 * <p>
-	 * Subclasses must implement this method.
-	 * <p>
-	 * @deprecated Since 3.3, subclasses should instead implement the method
-	 * {@link #createOperation(IStatus[])} and provide an empty implementation
-	 * for this method.
-	 * </p>
-	 * 
-	 * @param resource
-	 *            one of the selected resources
-	 * @param monitor
-	 *            a progress monitor
-	 * @exception CoreException
-	 *                if the operation fails
-	 * 
-	 * @since 3.1
-	 */
-	protected void invokeOperation(IResource resource,
-			IProgressMonitor monitor) throws CoreException {
-		
-	}
-
-	/**
-	 * Returns whether the given resource is a descendent of any of the
-	 * resources in the given list.
-	 * 
-	 * @param resources
-	 *            the list of resources (element type: <code>IResource</code>)
-	 * @param child
-	 *            the resource to check
-	 * @return <code>true</code> if <code>child</code> is a descendent of
-	 *         any of the elements of <code>resources</code>
-	 */
-	boolean isDescendent(List resources, IResource child) {
-		IResource parent = child.getParent();
-		return parent != null
-				&& (resources.contains(parent) || isDescendent(resources,
-						parent));
-	}
-
-	/**
-	 * Performs pruning on the given list of resources, as described in
-	 * <code>shouldPerformResourcePruning</code>.
-	 * 
-	 * @param resourceCollection
-	 *            the list of resources (element type: <code>IResource</code>)
-	 * @return the list of resources (element type: <code>IResource</code>)
-	 *         after pruning.
-	 * @see #shouldPerformResourcePruning
-	 */
-	List pruneResources(List resourceCollection) {
-		List prunedList = new ArrayList(resourceCollection);
-		Iterator elementsEnum = prunedList.iterator();
-		while (elementsEnum.hasNext()) {
-			IResource currentResource = (IResource) elementsEnum.next();
-			if (isDescendent(prunedList, currentResource)) {
-				elementsEnum.remove(); // Removes currentResource
-			}
-		}
-		return prunedList;
-	}
-
-	/**
-	 * Records the core exception to be displayed to the user once the action is
-	 * finished.
-	 * 
-	 * @param error
-	 *            a <code>CoreException</code>
-	 */
-	MultiStatus recordError(MultiStatus errors, CoreException error) {
-		if (errors == null) {
-			errors = new MultiStatus(IDEWorkbenchPlugin.IDE_WORKBENCH,
-					IStatus.ERROR, getProblemsMessage(), null);
-		}
-		errors.merge(error.getStatus());
-		return errors;
-	}
-
-	/**
-	 * The <code>CoreWrapperAction</code> implementation of this
-	 * <code>IAction</code> method uses a <code>ProgressMonitorDialog</code>
-	 * to run the operation. The operation calls <code>execute</code> (which,
-	 * in turn, calls <code>invokeOperation</code>). Afterwards, any
-	 * <code>CoreException</code>s encountered while running the operation
-	 * are reported to the user via a problems dialog.
-	 * <p>
-	 * Subclasses may extend this method.
-	 * </p>
-	 */
-	public void run() {
-		IStatus[] errorStatus = new IStatus[1];
-		try {
-			new ProgressMonitorJobsDialog(shellProvider.getShell()).run(true, true,
-					createOperation(errorStatus));
-		} catch (InterruptedException e) {
-			return;
-		} catch (InvocationTargetException e) {
-			// we catch ExecutionException in the created operation, but unexpected runtime
-			// exceptions or errors may still occur
-			String msg = NLS.bind(
-					IDEWorkbenchMessages.WorkspaceAction_logTitle, getClass()
-							.getName(), e.getTargetException());
-			IDEWorkbenchPlugin.log(msg, StatusUtil.newStatus(IStatus.ERROR,
-					msg, e.getTargetException()));
-			displayError(e.getTargetException().getMessage());
-		}
-		// If errors occurred, open an Error dialog & build a multi status error
-		// for it
-		if (errorStatus[0] != null && !errorStatus[0].isOK()) {
-			ErrorDialog.openError(shellProvider.getShell(), getProblemsTitle(), null, // no
-					// special
-					// message
-					errorStatus[0]);
-		}
-	}
-
-	/**
-	 * Returns whether this action should attempt to optimize the resources
-	 * being operated on. This kind of pruning makes sense when the operation
-	 * has depth infinity semantics (when the operation is applied explicitly to
-	 * a resource then it is also applied implicitly to all the resource's
-	 * descendents).
-	 * <p>
-	 * The <code>WorkspaceAction</code> implementation of this method returns
-	 * <code>true</code>. Subclasses should reimplement to return
-	 * <code>false</code> if pruning is not required.
-	 * </p>
-	 * 
-	 * @return <code>true</code> if pruning should be performed, and
-	 *         <code>false</code> if pruning is not desired
-	 * 
-	 * @since 3.1
-	 */
-	protected boolean shouldPerformResourcePruning() {
-		return true;
-	}
-
-	/**
-	 * The <code>WorkspaceAction</code> implementation of this
-	 * <code>SelectionListenerAction</code> method ensures that this action is
-	 * disabled if any of the selected resources are inaccessible. Subclasses
-	 * may extend to react to selection changes; however, if the super method
-	 * returns <code>false</code>, the overriding method should also return
-	 * <code>false</code>.
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		if (!super.updateSelection(selection) || selection.isEmpty()) {
-			return false;
-		}
-		for (Iterator i = getSelectedResources().iterator(); i.hasNext();) {
-			IResource r = (IResource) i.next();
-			if (!r.isAccessible()) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Returns the elements that the action is to be performed on. By default
-	 * return the selected resources.
-	 * <p>
-	 * Subclasses may override this method.
-	 * 
-	 * @return list of resource elements (element type: <code>IResource</code>)
-	 */
-	protected List getActionResources() {
-		return getSelectedResources();
-	}
-
-	/**
-	 * Run the action in the background rather than with the progress dialog.
-	 * 
-	 * @param rule
-	 *            The rule to apply to the background job or <code>null</code>
-	 *            if there isn't one.
-	 */
-	public void runInBackground(ISchedulingRule rule) {
-		runInBackground(rule, (Object[]) null);
-	}
-
-	/**
-	 * Run the action in the background rather than with the progress dialog.
-	 * 
-	 * @param rule
-	 *            The rule to apply to the background job or <code>null</code>
-	 *            if there isn't one.
-	 * @param jobFamily
-	 *            a single family that the job should belong to or
-	 *            <code>null</code> if none.
-	 * 
-	 * @since 3.1
-	 */
-	public void runInBackground(ISchedulingRule rule, Object jobFamily) {
-		if (jobFamily == null) {
-			runInBackground(rule, (Object[]) null);
-		} else {
-			runInBackground(rule, new Object[] { jobFamily });
-		}
-	}
-
-	/**
-	 * Run the action in the background rather than with the progress dialog.
-	 * 
-	 * @param rule
-	 *            The rule to apply to the background job or <code>null</code>
-	 *            if there isn't one.
-	 * @param jobFamilies
-	 *            the families the job should belong to or <code>null</code>
-	 *            if none.
-	 * 
-	 * @since 3.1
-	 */
-	public void runInBackground(ISchedulingRule rule, final Object[] jobFamilies) {
-		// obtain a copy of the selected resources before the job is forked
-		final List resources = new ArrayList(getActionResources());
-		Job job = new WorkspaceJob(removeMnemonics(getText())) {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.runtime.jobs.Job#belongsTo(java.lang.Object)
-			 */
-			public boolean belongsTo(Object family) {
-				if (jobFamilies == null || family == null) {
-					return false;
-				}
-				for (int i = 0; i < jobFamilies.length; i++) {
-					if (family.equals(jobFamilies[i])) {
-						return true;
-					}
-				}
-				return false;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.resources.WorkspaceJob#runInWorkspace(org.eclipse.core.runtime.IProgressMonitor)
-			 */
-			public IStatus runInWorkspace(IProgressMonitor monitor) {
-				return WorkspaceAction.this.execute(resources, monitor);
-			}
-		};
-		if (rule != null) {
-			job.setRule(rule);
-		}
-		job.setUser(true);
-		job.schedule();
-	}
-
-	/**
-	 * Returns the operation to perform when this action runs. The returned
-	 * operation must be an {@link IRunnableWithProgress} that will perform the
-	 * action's work. The default implementation returns an operation that will
-	 * iterate over the selected resources and call
-	 * {@link #invokeOperation(IResource, IProgressMonitor)} for each resource.
-	 * Subclasses must either implement
-	 * {@link #invokeOperation(IResource, IProgressMonitor)} or override this
-	 * method to provide a different operation. Subclasses typically override
-	 * this method when an undoable operation is to be provided.
-	 * 
-	 * @param errorStatus
-	 *            an array of error status objects to which the result of
-	 *            running the operation should be added.
-	 * 
-	 * @return the operation to perform when this action runs.
-	 * @since 3.3
-	 */
-	protected IRunnableWithProgress createOperation(final IStatus[] errorStatus) {
-		return new WorkspaceModifyOperation() {
-			public void execute(IProgressMonitor monitor) {
-				errorStatus[0] = WorkspaceAction.this.execute(
-						getActionResources(), monitor);
-			}
-		};
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/WorkspaceModifyDelegatingOperation.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/WorkspaceModifyDelegatingOperation.java
deleted file mode 100644
index aec9e35..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/WorkspaceModifyDelegatingOperation.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-
-/**
- * An operation which delegates its work to a runnable that modifies the
- * workspace.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class WorkspaceModifyDelegatingOperation extends
-        WorkspaceModifyOperation {
-
-    /**
-     * The runnable to delegate work to at execution time.
-     */
-    private IRunnableWithProgress content;
-
-    /**
-     * Creates a new operation which will delegate its work to the given
-     * runnable using the provided scheduling rule.
-     * 
-     * @param content
-     *            the runnable to delegate to when this operation is executed
-     * @param rule
-     *            The ISchedulingRule to use or <code>null</code>.
-     */
-    public WorkspaceModifyDelegatingOperation(IRunnableWithProgress content,
-            ISchedulingRule rule) {
-        super(rule);
-        this.content = content;
-    }
-
-    /**
-     * Creates a new operation which will delegate its work to the given
-     * runnable. Schedule using the supplied s
-     * 
-     * @param content
-     *            the runnable to delegate to when this operation is executed
-     */
-    public WorkspaceModifyDelegatingOperation(IRunnableWithProgress content) {
-        super();
-        this.content = content;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on WorkbenchModifyOperation.
-     */
-    protected void execute(IProgressMonitor monitor) throws CoreException,
-            InterruptedException {
-        try {
-            content.run(monitor);
-        } catch (InvocationTargetException e) {
-            if (e.getTargetException() instanceof CoreException) {
-				throw (CoreException) e.getTargetException();
-			}
-            if (e.getTargetException() instanceof RuntimeException) {
-				throw (RuntimeException) e.getTargetException();
-			}
-            if (e.getTargetException() instanceof Error) {
-				throw (Error) e.getTargetException();
-			}
-            e.getTargetException().printStackTrace();
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/WorkspaceModifyOperation.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/WorkspaceModifyOperation.java
deleted file mode 100644
index f51ace7..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/actions/WorkspaceModifyOperation.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.Job;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.operation.IThreadListener;
-
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * An operation which potentially makes changes to the workspace. All resource
- * modification should be performed using this operation. The primary
- * consequence of using this operation is that events which typically occur as a
- * result of workspace changes (such as the firing of resource deltas,
- * performance of autobuilds, etc.) are generally deferred until the outermost operation
- * has successfully completed.  The platform may still decide to broadcast
- * periodic resource change notifications during the scope of the operation
- * if the operation runs for a long time or another thread modifies the workspace
- * concurrently.
- * <p>
- * If a scheduling rule is provided, the operation will obtain that scheduling
- * rule for the duration of its <code>execute</code> method.  If no scheduling
- * rule is provided, the operation will obtain a scheduling rule that locks
- * the entire workspace for the duration of the operation.
- * </p>
- * <p>
- * Subclasses must implement <code>execute</code> to do the work of the
- * operation.
- * </p>
- * @see ISchedulingRule
- * @see org.eclipse.core.resources.IWorkspace#run(IWorkspaceRunnable, IProgressMonitor)
- *  */
-public abstract class WorkspaceModifyOperation implements IRunnableWithProgress, IThreadListener {
-    private ISchedulingRule rule;
-
-    /**
-     * Creates a new operation.
-     */
-    protected WorkspaceModifyOperation() {
-        this(IDEWorkbenchPlugin.getPluginWorkspace().getRoot());
-    }
-
-    /**
-     * Creates a new operation that will run using the provided
-     * scheduling rule.
-     * @param rule  The ISchedulingRule to use or <code>null</code>.
-     * @since 3.0
-     */
-    protected WorkspaceModifyOperation(ISchedulingRule rule) {
-        this.rule = rule;
-    }
-
-    /**
-     * Performs the steps that are to be treated as a single logical workspace
-     * change.
-     * <p>
-     * Subclasses must implement this method.
-     * </p>
-     *
-     * @param monitor the progress monitor to use to display progress and field
-     *   user requests to cancel
-     * @exception CoreException if the operation fails due to a CoreException
-     * @exception InvocationTargetException if the operation fails due to an exception other than CoreException
-     * @exception InterruptedException if the operation detects a request to cancel,
-     *  using <code>IProgressMonitor.isCanceled()</code>, it should exit by throwing
-     *  <code>InterruptedException</code>.  It is also possible to throw
-     *  <code>OperationCanceledException</code>, which gets mapped to <code>InterruptedException</code>
-     *  by the <code>run</code> method.
-     */
-    protected abstract void execute(IProgressMonitor monitor)
-            throws CoreException, InvocationTargetException,
-            InterruptedException;
-
-    /**
-     * The <code>WorkspaceModifyOperation</code> implementation of this
-     * <code>IRunnableWithProgress</code> method initiates a batch of changes by
-     * invoking the <code>execute</code> method as a workspace runnable
-     * (<code>IWorkspaceRunnable</code>).
-     */
-    public synchronized final void run(IProgressMonitor monitor)
-            throws InvocationTargetException, InterruptedException {
-        final InvocationTargetException[] iteHolder = new InvocationTargetException[1];
-        try {
-            IWorkspaceRunnable workspaceRunnable = new IWorkspaceRunnable() {
-                public void run(IProgressMonitor pm) throws CoreException {
-                    try {
-                        execute(pm);
-                    } catch (InvocationTargetException e) {
-                        // Pass it outside the workspace runnable
-                        iteHolder[0] = e;
-                    } catch (InterruptedException e) {
-                        // Re-throw as OperationCanceledException, which will be
-                        // caught and re-thrown as InterruptedException below.
-                        throw new OperationCanceledException(e.getMessage());
-                    }
-                    // CoreException and OperationCanceledException are propagated
-                }
-            };
-            IDEWorkbenchPlugin.getPluginWorkspace().run(workspaceRunnable,
-                    rule, IResource.NONE, monitor);
-        } catch (CoreException e) {
-            throw new InvocationTargetException(e);
-        } catch (OperationCanceledException e) {
-            throw new InterruptedException(e.getMessage());
-        }
-        // Re-throw the InvocationTargetException, if any occurred
-        if (iteHolder[0] != null) {
-            throw iteHolder[0];
-        }
-    }
-	/* (non-Javadoc)
-	 * @see IThreadListener#threadChange(Thread);
-	 * @since 3.2
-	 */
-	public void threadChange(Thread thread) {
-		//we must make sure we aren't transferring control away from a thread that
-		//already owns a scheduling rule because this is deadlock prone (bug 105491)
-		if (rule == null) {
-			return;
-		}
-		Job currentJob = Job.getJobManager().currentJob();
-		if (currentJob == null) {
-			return;
-		}
-		ISchedulingRule currentRule = currentJob.getRule();
-		if (currentRule == null) {
-			return;
-		}
-		throw new IllegalStateException("Cannot fork a thread from a thread owning a rule"); //$NON-NLS-1$
-	}
-
-	/**
-	 * The scheduling rule.  Should not be modified.
-	 * @return the scheduling rule, or <code>null</code>.
-	 * @since 3.4
-	 */
-	public ISchedulingRule getRule() {
-		return rule;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ContainerGenerator.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ContainerGenerator.java
deleted file mode 100644
index 1dbb9fe..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ContainerGenerator.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-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.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * For creating folder resources that currently do not exist, 
- * along a given workspace path.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * <p>
- * Example usage:
- * <pre>
- * ContainerGenerator gen = new ContainerGenerator(new Path("/A/B"));
- * IContainer res = null;
- * try {
- *   res = gen.getContainer(monitor); // creates project A and folder B if required
- * } catch (CoreException e) {
- *   // handle failure
- * } catch (OperationCanceledException e) {
- *   // handle cancelation
- * }
- * </pre>
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ContainerGenerator {
-    private IPath containerFullPath;
-
-    private IContainer container;
-
-    /**
-     * Creates a generator for the container resource (folder or project) at the
-     * given workspace path. Assumes the path has already been validated.
-     * <p>
-     * Call <code>getContainer</code> to create any missing resources along the
-     * path.
-     * </p>
-     *
-     * @param containerPath the workspace path of the container
-     */
-    public ContainerGenerator(IPath containerPath) {
-        super();
-        this.containerFullPath = containerPath;
-    }
-
-    /**
-     * Creates a folder resource for the given folder handle.
-     *
-     * @param folderHandle the handle to create a folder resource
-     * @param monitor the progress monitor to show visual progress
-     * @return the folder handle (<code>folderHandle</code>)
-     * @exception CoreException if the operation fails
-     * @exception OperationCanceledException if the operation is canceled
-     */
-    private IFolder createFolder(IFolder folderHandle, IProgressMonitor monitor)
-            throws CoreException {
-        folderHandle.create(false, true, monitor);
-
-        if (monitor.isCanceled()) {
-			throw new OperationCanceledException();
-		}
-
-        return folderHandle;
-    }
-
-    /**
-     * Creates a folder resource handle for the folder with the given name.
-     * This method does not create the folder resource; this is the responsibility
-     * of <code>createFolder</code>.
-     *
-     * @param container the resource container
-     * @param folderName the name of the folder
-     * @return the new folder resource handle
-     */
-    private IFolder createFolderHandle(IContainer container, String folderName) {
-        return container.getFolder(new Path(folderName));
-    }
-
-    /**
-     * Creates a project resource for the given project handle.
-     *
-     * @param projectHandle the handle to create a project resource
-     * @param monitor the progress monitor to show visual progress
-     * @return the project handle (<code>projectHandle</code>)
-     * @exception CoreException if the operation fails
-     * @exception OperationCanceledException if the operation is canceled
-     */
-    private IProject createProject(IProject projectHandle,
-            IProgressMonitor monitor) throws CoreException {
-        try {
-            monitor.beginTask("", 2000);//$NON-NLS-1$
-
-            projectHandle.create(new SubProgressMonitor(monitor, 1000));
-            if (monitor.isCanceled()) {
-				throw new OperationCanceledException();
-			}
-
-            projectHandle.open(new SubProgressMonitor(monitor, 1000));
-            if (monitor.isCanceled()) {
-				throw new OperationCanceledException();
-			}
-        } finally {
-            monitor.done();
-        }
-
-        return projectHandle;
-    }
-
-    /**
-     * Creates a project resource handle for the project with the given name.
-     * This method does not create the project resource; this is the responsibility
-     * of <code>createProject</code>.
-     *
-     * @param root the workspace root resource
-     * @param projectName the name of the project
-     * @return the new project resource handle
-     */
-    private IProject createProjectHandle(IWorkspaceRoot root, String projectName) {
-        return root.getProject(projectName);
-    }
-
-    /**
-     * Ensures that this generator's container resource exists. Creates any missing
-     * resource containers along the path; does nothing if the container resource
-     * already exists.
-     * <p>
-     * Note: This method should be called within a workspace modify operation since
-     * it may create resources.
-     * </p>
-     *
-     * @param monitor a progress monitor
-     * @return the container resource
-     * @exception CoreException if the operation fails
-     * @exception OperationCanceledException if the operation is canceled
-     */
-    public IContainer generateContainer(IProgressMonitor monitor)
-            throws CoreException {
-        IDEWorkbenchPlugin.getPluginWorkspace().run(new IWorkspaceRunnable() {
-            public void run(IProgressMonitor monitor) throws CoreException {
-                monitor
-                        .beginTask(
-                                IDEWorkbenchMessages.ContainerGenerator_progressMessage, 1000 * containerFullPath.segmentCount());
-                if (container != null) {
-					return;
-				}
-
-                // Does the container exist already?
-                IWorkspaceRoot root = getWorkspaceRoot();
-                container = (IContainer) root.findMember(containerFullPath);
-                if (container != null) {
-					return;
-				}
-
-                // Create the container for the given path
-                container = root;
-                for (int i = 0; i < containerFullPath.segmentCount(); i++) {
-                    String currentSegment = containerFullPath.segment(i);
-                    IResource resource = container.findMember(currentSegment);
-                    if (resource != null) {
-                    	if (resource.getType() == IResource.FILE) {
-                    		String msg = NLS.bind(IDEWorkbenchMessages.ContainerGenerator_pathOccupied, resource.getFullPath().makeRelative());
-                    		throw new CoreException(new Status(IStatus.ERROR, IDEWorkbenchPlugin.IDE_WORKBENCH, 1, msg, null));
-                    	}
-                        container = (IContainer) resource;
-                        monitor.worked(1000);
-                    } else {
-                        if (i == 0) {
-                            IProject projectHandle = createProjectHandle(root,
-                                    currentSegment);
-                            container = createProject(projectHandle,
-                                    new SubProgressMonitor(monitor, 1000));
-                        } else {
-                            IFolder folderHandle = createFolderHandle(
-                                    container, currentSegment);
-                            container = createFolder(folderHandle,
-                                    new SubProgressMonitor(monitor, 1000));
-                        }
-                    }
-                }
-            }
-        }, null, IResource.NONE, monitor);
-        return container;
-    }
-
-    /**
-     * Returns the workspace root resource handle.
-     *
-     * @return the workspace root resource handle
-     */
-    private IWorkspaceRoot getWorkspaceRoot() {
-        return IDEWorkbenchPlugin.getPluginWorkspace().getRoot();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ContainerSelectionDialog.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ContainerSelectionDialog.java
deleted file mode 100644
index 4860838..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ContainerSelectionDialog.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM Corporation - initial API and implementation 
- *   Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog
- *     font should be activated and used by other components.
- *******************************************************************************/
-
-package org.eclipse.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.runtime.IPath;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.misc.ContainerSelectionGroup;
-
-/**
- * A standard selection dialog which solicits a container resource from the user.
- * The <code>getResult</code> method returns the selected container resource.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * <p>
- * Example:
- * <pre>
- * ContainerSelectionDialog dialog =
- *    new ContainerSelectionDialog(getShell(), initialSelection, allowNewContainerName(), msg);
- *	dialog.open();
- *	Object[] result = dialog.getResult();
- * </pre> 	
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ContainerSelectionDialog extends SelectionDialog {
-    /**
-	 * 
-	 */
-	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
-
-	// the widget group;
-    ContainerSelectionGroup group;
-
-    // the root resource to populate the viewer with
-    private IContainer initialSelection;
-
-    // allow the user to type in a new container name
-    private boolean allowNewContainerName = true;
-
-    // the validation message
-    Label statusMessage;
-
-    //for validating the selection
-    ISelectionValidator validator;
-
-    // show closed projects by default
-    private boolean showClosedProjects = true;
-
-    /**
-     * Creates a resource container selection dialog rooted at the given resource.
-     * All selections are considered valid. 
-     *
-     * @param parentShell the parent shell
-     * @param initialRoot the initial selection in the tree
-     * @param allowNewContainerName <code>true</code> to enable the user to type in
-     *  a new container name, and <code>false</code> to restrict the user to just
-     *  selecting from existing ones
-     * @param message the message to be displayed at the top of this dialog, or
-     *    <code>null</code> to display a default message
-     */
-    public ContainerSelectionDialog(Shell parentShell, IContainer initialRoot,
-            boolean allowNewContainerName, String message) {
-        super(parentShell);
-        setTitle(IDEWorkbenchMessages.ContainerSelectionDialog_title);
-        this.initialSelection = initialRoot;
-        this.allowNewContainerName = allowNewContainerName;
-        if (message != null) {
-			setMessage(message);
-		} else {
-			setMessage(IDEWorkbenchMessages.ContainerSelectionDialog_message);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared in Window.
-     */
-    protected void configureShell(Shell shell) {
-        super.configureShell(shell);
-        PlatformUI.getWorkbench().getHelpSystem()
-                .setHelp(shell, IIDEHelpContextIds.CONTAINER_SELECTION_DIALOG);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Dialog.
-     */
-    protected Control createDialogArea(Composite parent) {
-        // create composite 
-        Composite area = (Composite) super.createDialogArea(parent);
-
-        Listener listener = new Listener() {
-            public void handleEvent(Event event) {
-                if (statusMessage != null && validator != null) {
-                    String errorMsg = validator.isValid(group
-                            .getContainerFullPath());
-                    if (errorMsg == null || errorMsg.equals(EMPTY_STRING)) {
-                        statusMessage.setText(EMPTY_STRING);
-                        getOkButton().setEnabled(true);
-                    } else {
-                        statusMessage.setText(errorMsg);
-                        getOkButton().setEnabled(false);
-                    }
-                }
-            }
-        };
-
-        // container selection group
-        group = new ContainerSelectionGroup(area, listener,
-                allowNewContainerName, getMessage(), showClosedProjects);
-        if (initialSelection != null) {
-            group.setSelectedContainer(initialSelection);
-        }
-
-        statusMessage = new Label(area, SWT.WRAP);
-        statusMessage.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        statusMessage.setText(" \n "); //$NON-NLS-1$
-        statusMessage.setFont(parent.getFont());
-
-        return dialogArea;
-    }
-
-    /**
-     * The <code>ContainerSelectionDialog</code> implementation of this 
-     * <code>Dialog</code> method builds a list of the selected resource containers
-     * for later retrieval by the client and closes this dialog.
-     */
-    protected void okPressed() {
-
-        List chosenContainerPathList = new ArrayList();
-        IPath returnValue = group.getContainerFullPath();
-        if (returnValue != null) {
-			chosenContainerPathList.add(returnValue);
-		}
-        setResult(chosenContainerPathList);
-        super.okPressed();
-    }
-
-    /**
-     * Sets the validator to use.  
-     * 
-     * @param validator A selection validator
-     */
-    public void setValidator(ISelectionValidator validator) {
-        this.validator = validator;
-    }
-
-    /**
-     * Set whether or not closed projects should be shown
-     * in the selection dialog.
-     * 
-     * @param show Whether or not to show closed projects.
-     */
-    public void showClosedProjects(boolean show) {
-        this.showClosedProjects = show;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/FileSelectionDialog.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/FileSelectionDialog.java
deleted file mode 100644
index d32d067..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/FileSelectionDialog.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM Corporation - initial API and implementation 
- *   Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog
- *      font should be activated and used by other components.
- *******************************************************************************/
-
-package org.eclipse.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.swt.SWT;
-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.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.misc.CheckboxTreeAndListGroup;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.model.WorkbenchViewerComparator;
-
-/**
- * A standard file selection dialog which solicits a list of files from the user.
- * The <code>getResult</code> method returns the selected files.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * <p>
- * Example:
- * <pre>
- *	FileSelectionDialog dialog = 
- *		new FileSelectionDialog(getShell(), rootElement, msg);
- *	dialog.setInitialSelections(selectedResources);
- *	dialog.open();
- *	return dialog.getResult();
- * </pre>
- * </p>
- * @deprecated Use org.eclipse.swt.widgets.FileDialog,
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class FileSelectionDialog extends SelectionDialog {
-    // the root file representative to populate the viewer with
-    private FileSystemElement root;
-
-    // the visual selection widget group
-    CheckboxTreeAndListGroup selectionGroup;
-
-    // expand all items in the tree view on dialog open
-    private boolean expandAllOnOpen = false;
-
-    // sizing constants
-    private static final int SIZING_SELECTION_WIDGET_WIDTH = 500;
-
-    private static final int SIZING_SELECTION_WIDGET_HEIGHT = 250;
-
-    /**
-     * Creates a file selection dialog rooted at the given file system element.
-     *
-     * @param parentShell the parent shell
-     * @param fileSystemElement the root element to populate this dialog with
-     * @param message the message to be displayed at the top of this dialog, or
-     *    <code>null</code> to display a default message
-     */
-    public FileSelectionDialog(Shell parentShell,
-            FileSystemElement fileSystemElement, String message) {
-        super(parentShell);
-        setTitle(IDEWorkbenchMessages.FileSelectionDialog_title);
-        root = fileSystemElement;
-        if (message != null) {
-			setMessage(message);
-		} else {
-			setMessage(IDEWorkbenchMessages.FileSelectionDialog_message);
-		}
-    }
-
-    /**
-     * Add the selection and deselection buttons to the dialog.
-     * @param composite org.eclipse.swt.widgets.Composite
-     */
-    private void addSelectionButtons(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);
-        composite.setData(data);
-
-        Button selectButton = new Button(buttonComposite, SWT.PUSH);
-        selectButton.setText(SELECT_ALL_TITLE);
-        SelectionListener listener = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                selectionGroup.setAllSelections(true);
-            }
-        };
-        selectButton.addSelectionListener(listener);
-
-        Button deselectButton = new Button(buttonComposite, SWT.PUSH);
-        deselectButton.setText(DESELECT_ALL_TITLE);
-        listener = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                selectionGroup.setAllSelections(false);
-
-            }
-        };
-        deselectButton.addSelectionListener(listener);
-
-    }
-
-    /**
-     * Visually checks the previously-specified elements in the container (left)
-     * portion of this dialog's file selection viewer.
-     */
-    private void checkInitialSelections() {
-        Iterator itemsToCheck = getInitialElementSelections().iterator();
-
-        while (itemsToCheck.hasNext()) {
-            FileSystemElement currentElement = (FileSystemElement) itemsToCheck
-                    .next();
-
-            if (currentElement.isDirectory()) {
-				selectionGroup.initialCheckTreeItem(currentElement);
-			} else {
-				selectionGroup.initialCheckListItem(currentElement);
-			}
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared in Window.
-     */
-    protected void configureShell(Shell shell) {
-        super.configureShell(shell);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
-				IIDEHelpContextIds.FILE_SELECTION_DIALOG);
-    }
-
-    public void create() {
-        super.create();
-        initializeDialog();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Dialog.
-     */
-    protected Control createDialogArea(Composite parent) {
-        // page group
-        Composite composite = (Composite) super.createDialogArea(parent);
-
-        createMessageArea(composite);
-
-        // Create a fake parent of the root to be the dialog input element.
-        // Use an empty label so that display of the element's full name
-        // doesn't include a confusing label
-        FileSystemElement input = new FileSystemElement("", null, true);//$NON-NLS-1$
-        input.addChild(root);
-        root.setParent(input);
-
-        selectionGroup = new CheckboxTreeAndListGroup(composite, input,
-                getFolderProvider(), new WorkbenchLabelProvider(),
-                getFileProvider(), new WorkbenchLabelProvider(), SWT.NONE,
-                SIZING_SELECTION_WIDGET_WIDTH, // since this page has no other significantly-sized
-                SIZING_SELECTION_WIDGET_HEIGHT); // widgets we need to hardcode the combined widget's
-        // size, otherwise it will open too small
-
-        ICheckStateListener listener = new ICheckStateListener() {
-            public void checkStateChanged(CheckStateChangedEvent event) {
-                getOkButton().setEnabled(
-                        selectionGroup.getCheckedElementCount() > 0);
-            }
-        };
-
-        WorkbenchViewerComparator comparator = new WorkbenchViewerComparator();
-        selectionGroup.setTreeComparator(comparator);
-        selectionGroup.setListComparator(comparator);
-        selectionGroup.addCheckStateListener(listener);
-
-        addSelectionButtons(composite);
-
-        return composite;
-    }
-
-    /**
-     * Returns whether the tree view of the file system element
-     * will be fully expanded when the dialog is opened.
-     *
-     * @return true to expand all on dialog open, false otherwise.
-     */
-    public boolean getExpandAllOnOpen() {
-        return expandAllOnOpen;
-    }
-
-    /**
-     * Returns a content provider for <code>FileSystemElement</code>s that returns 
-     * only files as children.
-     */
-    private ITreeContentProvider getFileProvider() {
-        return new WorkbenchContentProvider() {
-            public Object[] getChildren(Object o) {
-                if (o instanceof FileSystemElement) {
-                    return ((FileSystemElement) o).getFiles().getChildren(o);
-                }
-                return new Object[0];
-            }
-        };
-    }
-
-    /**
-     * Returns a content provider for <code>FileSystemElement</code>s that returns 
-     * only folders as children.
-     */
-    private ITreeContentProvider getFolderProvider() {
-        return new WorkbenchContentProvider() {
-            public Object[] getChildren(Object o) {
-                if (o instanceof FileSystemElement) {
-                    return ((FileSystemElement) o).getFolders().getChildren(o);
-                }
-                return new Object[0];
-            }
-        };
-    }
-
-    /**
-     * Initializes this dialog's controls.
-     */
-    private void initializeDialog() {
-        // initialize page	
-        if (getInitialElementSelections().isEmpty()) {
-			getOkButton().setEnabled(false);
-		} else {
-			checkInitialSelections();
-		}
-        selectionGroup.aboutToOpen();
-        if (expandAllOnOpen) {
-			selectionGroup.expandAll();
-		}
-    }
-
-    /**
-     * The <code>FileSelectionDialog</code> implementation of this
-     * <code>Dialog</code> method builds a list of the selected files for later 
-     * retrieval by the client and closes this dialog.
-     */
-    protected void okPressed() {
-        Iterator resultEnum = selectionGroup.getAllCheckedListItems();
-        ArrayList list = new ArrayList();
-        while (resultEnum.hasNext()) {
-			list.add(resultEnum.next());
-		}
-        setResult(list);
-        super.okPressed();
-    }
-
-    /**
-     * Set whether the tree view of the file system element
-     * will be fully expanded when the dialog is opened.
-     *
-     * @param expandAll true to expand all on dialog open, false otherwise.
-     */
-    public void setExpandAllOnOpen(boolean expandAll) {
-        expandAllOnOpen = expandAll;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/FilteredResourcesSelectionDialog.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/FilteredResourcesSelectionDialog.java
deleted file mode 100644
index 9be9d7f..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/FilteredResourcesSelectionDialog.java
+++ /dev/null
@@ -1,897 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-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.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ResourceWorkingSetFilter;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.actions.WorkingSetFilterActionGroup;
-import org.eclipse.ui.internal.WorkbenchMessages;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.model.ResourceFactory;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.statushandlers.StatusManager;
-
-import com.ibm.icu.text.Collator;
-
-/**
- * Shows a list of resources to the user with a text entry field for a string
- * pattern used to filter the list of resources.
- * 
- * @since 3.3
- */
-public class FilteredResourcesSelectionDialog extends
-		FilteredItemsSelectionDialog {
-
-	private static final String DIALOG_SETTINGS = "org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog"; //$NON-NLS-1$
-
-	private static final String WORKINGS_SET_SETTINGS = "WorkingSet"; //$NON-NLS-1$
-
-	private static final String SHOW_DERIVED = "ShowDerived"; //$NON-NLS-1$
-
-	private ShowDerivedResourcesAction showDerivedResourcesAction;
-
-	private ResourceItemLabelProvider resourceItemLabelProvider;
-
-	private ResourceItemDetailsLabelProvider resourceItemDetailsLabelProvider;
-
-	private WorkingSetFilterActionGroup workingSetFilterActionGroup;
-
-	private CustomWorkingSetFilter workingSetFilter = new CustomWorkingSetFilter();
-
-	private String title;
-
-	private IContainer container;
-
-	private int typeMask;
-
-	private boolean isDerived;
-
-	/**
-	 * Creates a new instance of the class
-	 * 
-	 * @param shell
-	 *            the parent shell
-	 * @param multi
-	 *            the multi selection flag
-	 * @param container
-	 *            the container
-	 * @param typesMask
-	 *            the types mask
-	 */
-	public FilteredResourcesSelectionDialog(Shell shell, boolean multi,
-			IContainer container, int typesMask) {
-		super(shell, multi);
-
-		setSelectionHistory(new ResourceSelectionHistory());
-
-		setTitle(IDEWorkbenchMessages.OpenResourceDialog_title);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
-				IIDEHelpContextIds.OPEN_RESOURCE_DIALOG);
-
-		this.container = container;
-		this.typeMask = typesMask;
-
-		resourceItemLabelProvider = new ResourceItemLabelProvider();
-
-		resourceItemDetailsLabelProvider = new ResourceItemDetailsLabelProvider();
-
-		setListLabelProvider(resourceItemLabelProvider);
-		setDetailsLabelProvider(resourceItemDetailsLabelProvider);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#setTitle(java.lang.String)
-	 */
-	public void setTitle(String title) {
-		super.setTitle(title);
-		this.title = title;
-	}
-
-	/**
-	 * Adds or replaces subtitle of the dialog
-	 * 
-	 * @param text
-	 *            the new subtitle
-	 */
-	private void setSubtitle(String text) {
-		if (text == null || text.length() == 0) {
-			getShell().setText(title);
-		} else {
-			getShell().setText(title + " - " + text); //$NON-NLS-1$
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#getDialogSettings()
-	 */
-	protected IDialogSettings getDialogSettings() {
-		IDialogSettings settings = IDEWorkbenchPlugin.getDefault()
-				.getDialogSettings().getSection(DIALOG_SETTINGS);
-
-		if (settings == null) {
-			settings = IDEWorkbenchPlugin.getDefault().getDialogSettings()
-					.addNewSection(DIALOG_SETTINGS);
-		}
-
-		return settings;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#storeDialog(org.eclipse.jface.dialogs.IDialogSettings)
-	 */
-	protected void storeDialog(IDialogSettings settings) {
-		super.storeDialog(settings);
-
-		settings.put(SHOW_DERIVED, showDerivedResourcesAction.isChecked());
-
-		XMLMemento memento = XMLMemento.createWriteRoot("workingSet"); //$NON-NLS-1$
-		workingSetFilterActionGroup.saveState(memento);
-		workingSetFilterActionGroup.dispose();
-		StringWriter writer = new StringWriter();
-		try {
-			memento.save(writer);
-			settings.put(WORKINGS_SET_SETTINGS, writer.getBuffer().toString());
-		} catch (IOException e) {
-			StatusManager.getManager().handle(
-					new Status(IStatus.ERROR, WorkbenchPlugin.PI_WORKBENCH,
-							IStatus.ERROR, "", e)); //$NON-NLS-1$
-			// don't do anything. Simply don't store the settings
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#restoreDialog(org.eclipse.jface.dialogs.IDialogSettings)
-	 */
-	protected void restoreDialog(IDialogSettings settings) {
-		super.restoreDialog(settings);
-
-		boolean showDerived = settings.getBoolean(SHOW_DERIVED);
-		showDerivedResourcesAction.setChecked(showDerived);
-		this.isDerived = showDerived;
-
-		String setting = settings.get(WORKINGS_SET_SETTINGS);
-		if (setting != null) {
-			try {
-				IMemento memento = XMLMemento.createReadRoot(new StringReader(
-						setting));
-				workingSetFilterActionGroup.restoreState(memento);
-			} catch (WorkbenchException e) {
-				StatusManager.getManager().handle(
-						new Status(IStatus.ERROR, WorkbenchPlugin.PI_WORKBENCH,
-								IStatus.ERROR, "", e)); //$NON-NLS-1$
-				// don't do anything. Simply don't restore the settings
-			}
-		}
-
-		addListFilter(workingSetFilter);
-
-		applyFilter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#fillViewMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	protected void fillViewMenu(IMenuManager menuManager) {
-		super.fillViewMenu(menuManager);
-
-		showDerivedResourcesAction = new ShowDerivedResourcesAction();
-		menuManager.add(showDerivedResourcesAction);
-
-		workingSetFilterActionGroup = new WorkingSetFilterActionGroup(
-				getShell(), new IPropertyChangeListener() {
-					public void propertyChange(PropertyChangeEvent event) {
-						String property = event.getProperty();
-
-						if (WorkingSetFilterActionGroup.CHANGE_WORKING_SET
-								.equals(property)) {
-
-							IWorkingSet workingSet = (IWorkingSet) event
-									.getNewValue();
-
-							if (workingSet != null
-									&& !(workingSet.isAggregateWorkingSet() && workingSet
-											.isEmpty())) {
-								workingSetFilter.setWorkingSet(workingSet);
-								setSubtitle(workingSet.getLabel());
-							} else {
-								IWorkbenchWindow window = PlatformUI
-										.getWorkbench()
-										.getActiveWorkbenchWindow();
-
-								if (window != null) {
-									IWorkbenchPage page = window
-											.getActivePage();
-									workingSet = page.getAggregateWorkingSet();
-
-									if (workingSet.isAggregateWorkingSet()
-											&& workingSet.isEmpty()) {
-										workingSet = null;
-									}
-								}
-
-								workingSetFilter.setWorkingSet(workingSet);
-								setSubtitle(null);
-							}
-
-							scheduleRefresh();
-						}
-					}
-				});
-
-		menuManager.add(new Separator());
-		workingSetFilterActionGroup.fillContextMenu(menuManager);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#createExtendedContentArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createExtendedContentArea(Composite parent) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		Object[] result = super.getResult();
-
-		if (result == null)
-			return null;
-
-		List resultToReturn = new ArrayList();
-
-		for (int i = 0; i < result.length; i++) {
-			if (result[i] instanceof IResource) {
-				resultToReturn.add((result[i]));
-			}
-		}
-
-		return resultToReturn.toArray();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#open()
-	 */
-	public int open() {
-		if (getInitialPattern() == null) {
-			IWorkbenchWindow window = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow();
-			if (window != null) {
-				ISelection selection = window.getSelectionService()
-						.getSelection();
-				if (selection instanceof ITextSelection) {
-					String text = ((ITextSelection) selection).getText();
-					if (text != null) {
-						text = text.trim();
-						if (text.length() > 0) {
-							IWorkspace workspace = ResourcesPlugin
-									.getWorkspace();
-							IStatus result = workspace.validateName(text,
-									IResource.FILE);
-							if (result.isOK()) {
-								setInitialPattern(text);
-							}
-						}
-					}
-				}
-			}
-		}
-		return super.open();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#getElementName(java.lang.Object)
-	 */
-	public String getElementName(Object item) {
-		IResource resource = (IResource) item;
-		return resource.getName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#validateItem(java.lang.Object)
-	 */
-	protected IStatus validateItem(Object item) {
-		return new Status(IStatus.OK, WorkbenchPlugin.PI_WORKBENCH, 0, "", null); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#createFilter()
-	 */
-	protected ItemsFilter createFilter() {
-		return new ResourceFilter(container, isDerived, typeMask);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#applyFilter()
-	 */
-	protected void applyFilter() {
-		super.applyFilter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#getItemsComparator()
-	 */
-	protected Comparator getItemsComparator() {
-		return new Comparator() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see java.util.Comparator#compare(java.lang.Object,
-			 *      java.lang.Object)
-			 */
-			public int compare(Object o1, Object o2) {
-				Collator collator = Collator.getInstance();
-				IResource resource1 = (IResource) o1;
-				IResource resource2 = (IResource) o2;
-				String s1 = resource1.getName();
-				String s2 = resource2.getName();
-				int comparability = collator.compare(s1, s2);
-				if (comparability == 0) {
-					IPath p1 = resource1.getFullPath();
-					IPath p2 = resource2.getFullPath();
-					int c1 = p1.segmentCount();
-					int c2 = p2.segmentCount();
-					for (int i= 0; i < c1 && i < c2; i++) {
-						comparability = collator.compare(p1.segment(i), p2.segment(i));
-						if (comparability != 0)
-							return comparability;
-					}
-					comparability = c2 - c1;
-				}
-
-				return comparability;
-			}
-		};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#fillContentProvider(org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.AbstractContentProvider,
-	 *      org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.ItemsFilter,
-	 *      org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected void fillContentProvider(AbstractContentProvider contentProvider,
-			ItemsFilter itemsFilter, IProgressMonitor progressMonitor)
-			throws CoreException {
-		if (itemsFilter instanceof ResourceFilter)
-			container.accept(new ResourceProxyVisitor(contentProvider,
-					(ResourceFilter) itemsFilter, progressMonitor),
-					IResource.NONE);
-		if (progressMonitor != null)
-			progressMonitor.done();
-
-	}
-
-	/**
-	 * Sets the derived flag on the ResourceFilter instance
-	 */
-	private class ShowDerivedResourcesAction extends Action {
-
-		/**
-		 * Creates a new instance of the action.
-		 */
-		public ShowDerivedResourcesAction() {
-			super(
-					IDEWorkbenchMessages.FilteredResourcesSelectionDialog_showDerivedResourcesAction,
-					IAction.AS_CHECK_BOX);
-		}
-
-		public void run() {
-			FilteredResourcesSelectionDialog.this.isDerived = isChecked();
-			applyFilter();
-		}
-	}
-
-	/**
-	 * A label provider for ResourceDecorator objects. It creates labels with a
-	 * resource full path for duplicates. It uses the Platform UI label
-	 * decorator for providing extra resource info.
-	 */
-	private class ResourceItemLabelProvider extends LabelProvider implements
-			ILabelProviderListener, IStyledLabelProvider {
-
-		// Need to keep our own list of listeners
-		private ListenerList listeners = new ListenerList();
-
-		WorkbenchLabelProvider provider = new WorkbenchLabelProvider();
-
-		/**
-		 * Creates a new instance of the class
-		 */
-		public ResourceItemLabelProvider() {
-			super();
-			provider.addListener(this);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
-		 */
-		public Image getImage(Object element) {
-			if (!(element instanceof IResource)) {
-				return super.getImage(element);
-			}
-
-			IResource res = (IResource) element;
-
-			return provider.getImage(res);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
-		 */
-		public String getText(Object element) {
-			if (!(element instanceof IResource)) {
-				return super.getText(element);
-			}
-
-			IResource res = (IResource) element;
-
-			String str = res.getName();
-
-			// extra info for duplicates
-			if (isDuplicateElement(element))
-				str = str
-						+ " - " + res.getParent().getFullPath().makeRelative().toString(); //$NON-NLS-1$
-
-			return str;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getStyledText(java.lang.Object)
-		 */
-		public StyledString getStyledText(Object element) {
-			if (!(element instanceof IResource)) {
-				return new StyledString(super.getText(element));
-			}
-
-			IResource res = (IResource) element;
-
-			StyledString str = new StyledString(res.getName());
-
-			// extra info for duplicates
-			if (isDuplicateElement(element)) {
-				str.append(" - ", StyledString.QUALIFIER_STYLER); //$NON-NLS-1$
-				str.append(res.getParent().getFullPath().makeRelative().toString(), StyledString.QUALIFIER_STYLER);
-			}
-			return str;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.LabelProvider#dispose()
-		 */
-		public void dispose() {
-			provider.removeListener(this);
-			provider.dispose();
-
-			super.dispose();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-		 */
-		public void addListener(ILabelProviderListener listener) {
-			listeners.add(listener);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.LabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-		 */
-		public void removeListener(ILabelProviderListener listener) {
-			listeners.remove(listener);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ILabelProviderListener#labelProviderChanged(org.eclipse.jface.viewers.LabelProviderChangedEvent)
-		 */
-		public void labelProviderChanged(LabelProviderChangedEvent event) {
-			Object[] l = listeners.getListeners();
-			for (int i = 0; i < listeners.size(); i++) {
-				((ILabelProviderListener) l[i]).labelProviderChanged(event);
-			}
-		}
-
-	}
-
-	/**
-	 * A label provider for details of ResourceItem objects.
-	 */
-	private class ResourceItemDetailsLabelProvider extends
-			ResourceItemLabelProvider {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
-		 */
-		public Image getImage(Object element) {
-			if (!(element instanceof IResource)) {
-				return super.getImage(element);
-			}
-
-			IResource parent = ((IResource) element).getParent();
-			return provider.getImage(parent);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
-		 */
-		public String getText(Object element) {
-			if (!(element instanceof IResource)) {
-				return super.getText(element);
-			}
-
-			IResource parent = ((IResource) element).getParent();
-
-			if (parent.getType() == IResource.ROOT) {
-				// Get readable name for workspace root ("Workspace"), without
-				// duplicating language-specific string here.
-				return null;
-			}
-
-			return parent.getFullPath()	.makeRelative().toString();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ILabelProviderListener#labelProviderChanged(org.eclipse.jface.viewers.LabelProviderChangedEvent)
-		 */
-		public void labelProviderChanged(LabelProviderChangedEvent event) {
-			Object[] l = super.listeners.getListeners();
-			for (int i = 0; i < super.listeners.size(); i++) {
-				((ILabelProviderListener) l[i]).labelProviderChanged(event);
-			}
-		}
-	}
-
-	/**
-	 * Viewer filter which filters resources due to current working set
-	 */
-	private class CustomWorkingSetFilter extends ViewerFilter {
-		private ResourceWorkingSetFilter resourceWorkingSetFilter = new ResourceWorkingSetFilter();
-
-		/**
-		 * Returns the active working set the filter is working with.
-		 * 
-		 * @return the active working set
-		 */
-		public IWorkingSet getWorkingSet() {
-			return resourceWorkingSetFilter.getWorkingSet();
-		}
-
-		/**
-		 * Sets the active working set.
-		 * 
-		 * @param workingSet
-		 *            the working set the filter should work with
-		 */
-		public void setWorkingSet(IWorkingSet workingSet) {
-			resourceWorkingSetFilter.setWorkingSet(workingSet);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public boolean select(Viewer viewer, Object parentElement,
-				Object element) {
-			return resourceWorkingSetFilter.select(viewer, parentElement,
-						element);
-		}
-	}
-
-	/**
-	 * ResourceProxyVisitor to visit resource tree and get matched resources.
-	 * During visit resources it updates progress monitor and adds matched
-	 * resources to ContentProvider instance.
-	 */
-	private class ResourceProxyVisitor implements IResourceProxyVisitor {
-
-		private AbstractContentProvider proxyContentProvider;
-
-		private ResourceFilter resourceFilter;
-
-		private IProgressMonitor progressMonitor;
-
-		private List projects;
-
-		/**
-		 * Creates new ResourceProxyVisitor instance.
-		 * 
-		 * @param contentProvider
-		 * @param resourceFilter
-		 * @param progressMonitor
-		 * @throws CoreException
-		 */
-		public ResourceProxyVisitor(AbstractContentProvider contentProvider,
-				ResourceFilter resourceFilter, IProgressMonitor progressMonitor)
-				throws CoreException {
-			super();
-			this.proxyContentProvider = contentProvider;
-			this.resourceFilter = resourceFilter;
-			this.progressMonitor = progressMonitor;
-			IResource[] resources = container.members();
-			this.projects = new ArrayList(Arrays.asList(resources));
-
-			if (progressMonitor != null)
-				progressMonitor
-						.beginTask(
-								WorkbenchMessages.FilteredItemsSelectionDialog_searchJob_taskName,
-								projects.size());
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.resources.IResourceProxyVisitor#visit(org.eclipse.core.resources.IResourceProxy)
-		 */
-		public boolean visit(IResourceProxy proxy) {
-
-			if (progressMonitor.isCanceled())
-				return false;
-
-			IResource resource = proxy.requestResource();
-
-			if (this.projects.remove((resource.getProject()))
-					|| this.projects.remove((resource))) {
-				progressMonitor.worked(1);
-			}
-
-			proxyContentProvider.add(resource, resourceFilter);
-
-			if (resource.getType() == IResource.FOLDER && resource.isDerived()
-					&& !resourceFilter.isShowDerived()) {
-
-				return false;
-			}
-
-			if (resource.getType() == IResource.FILE) {
-				return false;
-			}
-
-			return true;
-		}
-	}
-
-	/**
-	 * Filters resources using pattern and showDerived flag. It overrides
-	 * ItemsFilter.
-	 */
-	protected class ResourceFilter extends ItemsFilter {
-
-		private boolean showDerived = false;
-
-		private IContainer filterContainer;
-
-		private int filterTypeMask;
-
-		/**
-		 * Creates new ResourceFilter instance
-		 * 
-		 * @param container
-		 * @param showDerived
-		 *            flag which determine showing derived elements
-		 * @param typeMask
-		 */
-		public ResourceFilter(IContainer container, boolean showDerived,
-				int typeMask) {
-			super();
-			this.filterContainer = container;
-			this.showDerived = showDerived;
-			this.filterTypeMask = typeMask;
-		}
-
-		/**
-		 * Creates new ResourceFilter instance
-		 */
-		public ResourceFilter() {
-			super();
-			this.filterContainer = container;
-			this.showDerived = isDerived;
-			this.filterTypeMask = typeMask;
-		}
-
-		/**
-		 * @param item
-		 *            Must be instance of IResource, otherwise
-		 *            <code>false</code> will be returned.
-		 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.ItemsFilter#isConsistentItem(java.lang.Object)
-		 */
-		public boolean isConsistentItem(Object item) {
-			if (!(item instanceof IResource)) {
-				return false;
-			}
-			IResource resource = (IResource) item;
-			if (this.filterContainer.findMember(resource.getFullPath()) != null)
-				return true;
-			return false;
-		}
-
-		/**
-		 * @param item
-		 *            Must be instance of IResource, otherwise
-		 *            <code>false</code> will be returned.
-		 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.ItemsFilter#matchItem(java.lang.Object)
-		 */
-		public boolean matchItem(Object item) {
-			if (!(item instanceof IResource)) {
-				return false;
-			}
-			IResource resource = (IResource) item;
-			if ((!this.showDerived && resource.isDerived())
-					|| ((this.filterTypeMask & resource.getType()) == 0))
-				return false;
-			return matches(resource.getName());
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.ItemsFilter#isSubFilter(org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.ItemsFilter)
-		 */
-		public boolean isSubFilter(ItemsFilter filter) {
-			if (!super.isSubFilter(filter))
-				return false;
-			if (filter instanceof ResourceFilter)
-				if (this.showDerived == ((ResourceFilter) filter).showDerived)
-					return true;
-			return false;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.ItemsFilter#equalsFilter(org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.ItemsFilter)
-		 */
-		public boolean equalsFilter(ItemsFilter iFilter) {
-			if (!super.equalsFilter(iFilter))
-				return false;
-			if (iFilter instanceof ResourceFilter)
-				if (this.showDerived == ((ResourceFilter) iFilter).showDerived)
-					return true;
-			return false;
-		}
-
-		/**
-		 * Check show derived flag for a filter
-		 * 
-		 * @return true if filter allow derived resources false if not
-		 */
-		public boolean isShowDerived() {
-			return showDerived;
-		}
-
-	}
-
-	/**
-	 * <code>ResourceSelectionHistory</code> provides behavior specific to
-	 * resources - storing and restoring <code>IResource</code>s state
-	 * to/from XML (memento).
-	 */
-	private class ResourceSelectionHistory extends SelectionHistory {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.SelectionHistory#restoreItemFromMemento(org.eclipse.ui.IMemento)
-		 */
-		protected Object restoreItemFromMemento(IMemento element) {
-			ResourceFactory resourceFactory = new ResourceFactory();
-			IResource resource = (IResource) resourceFactory
-					.createElement(element);
-			return resource;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog.SelectionHistory#storeItemToMemento(java.lang.Object,
-		 *      org.eclipse.ui.IMemento)
-		 */
-		protected void storeItemToMemento(Object item, IMemento element) {
-			IResource resource = (IResource) item;
-			ResourceFactory resourceFactory = new ResourceFactory(resource);
-			resourceFactory.saveState(element);
-		}
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/MarkerResolutionSelectionDialog.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/MarkerResolutionSelectionDialog.java
deleted file mode 100644
index c3b1641..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/MarkerResolutionSelectionDialog.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM Corporation - initial API and implementation 
- *   Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog font should be activated and used by other components.
- *******************************************************************************/
-
-package org.eclipse.ui.dialogs;
-
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-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.Shell;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.dialogs.SimpleListContentProvider;
-
-/**
- * Dialog to allow the user to select from a list of marker
- * resolutions.
- * <p>
- * This dialog may be instantiated, it is not intented to 
- * be subclassed.
- * </p>
- * 
- * @since 2.0
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class MarkerResolutionSelectionDialog extends SelectionDialog {
-    /**
-     * List width in characters.
-     */
-    private final static int LIST_WIDTH = 60;
-
-    /**
-     * List height in characters.
-     */
-    private final static int LIST_HEIGHT = 10;
-
-    /**
-     * The marker resolutions.
-     */
-    private IMarkerResolution[] resolutions;
-
-    /**
-     * List to display the resolutions.
-     */
-    private ListViewer listViewer;
-
-    /**
-     * Creates an instance of this dialog to display
-     * the given resolutions.
-     * <p>
-     * There must be at least one resolution.
-     * </p>
-     * 
-     * @param shell the parent shell
-     * @param markerResolutions the resolutions to display
-     */
-    public MarkerResolutionSelectionDialog(Shell shell,
-            IMarkerResolution[] markerResolutions) {
-        super(shell);
-        if (markerResolutions == null || markerResolutions.length == 0) {
-            throw new IllegalArgumentException();
-        }
-        resolutions = markerResolutions;
-        setTitle(IDEWorkbenchMessages.MarkerResolutionSelectionDialog_title);
-        setMessage(IDEWorkbenchMessages.MarkerResolutionSelectionDialog_messageLabel);
-        setInitialSelections(new Object[] { markerResolutions[0] });
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Window.
-     */
-    protected void configureShell(Shell newShell) {
-        super.configureShell(newShell);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell,
-                IIDEHelpContextIds.MARKER_RESOLUTION_SELECTION_DIALOG);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Dialog.
-     */
-    protected Control createDialogArea(Composite parent) {
-        Composite composite = (Composite) super.createDialogArea(parent);
-
-        // Create label
-        createMessageArea(composite);
-        // Create list viewer	
-        listViewer = new ListViewer(composite, SWT.SINGLE | SWT.H_SCROLL
-                | SWT.V_SCROLL | SWT.BORDER);
-        GridData data = new GridData(GridData.FILL_BOTH);
-        data.heightHint = convertHeightInCharsToPixels(LIST_HEIGHT);
-        data.widthHint = convertWidthInCharsToPixels(LIST_WIDTH);
-        listViewer.getList().setLayoutData(data);
-        listViewer.getList().setFont(parent.getFont());
-        // Set the label provider		
-        listViewer.setLabelProvider(new LabelProvider() {
-            public String getText(Object element) {
-                // Return the resolution's label.
-                return element == null ? "" : ((IMarkerResolution) element).getLabel(); //$NON-NLS-1$
-            }
-        });
-
-        // Set the content provider
-        SimpleListContentProvider cp = new SimpleListContentProvider();
-        cp.setElements(resolutions);
-        listViewer.setContentProvider(cp);
-        listViewer.setInput(new Object()); // it is ignored but must be non-null
-
-        // Set the initial selection
-        listViewer.setSelection(new StructuredSelection(
-                getInitialElementSelections()), true);
-
-        // Add a selection change listener
-        listViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-            public void selectionChanged(SelectionChangedEvent event) {
-                // Update OK button enablement
-                getOkButton().setEnabled(!event.getSelection().isEmpty());
-            }
-        });
-
-        // Add double-click listener
-        listViewer.addDoubleClickListener(new IDoubleClickListener() {
-            public void doubleClick(DoubleClickEvent event) {
-                okPressed();
-            }
-        });
-        return composite;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Dialog.
-     */
-    protected void okPressed() {
-        IStructuredSelection selection = (IStructuredSelection) listViewer
-                .getSelection();
-        setResult(selection.toList());
-        super.okPressed();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/NewFolderDialog.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/NewFolderDialog.java
deleted file mode 100644
index 9f1e7e4..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/NewFolderDialog.java
+++ /dev/null
@@ -1,478 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog
- *     font should be activated and used by other components.
- *******************************************************************************/
-
-package org.eclipse.ui.dialogs;
-
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectNatureDescriptor;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.dialogs.CreateLinkedResourceGroup;
-
-/**
- * The NewFolderDialog is used to create a new folder.
- * The folder can optionally be linked to a file system folder.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class NewFolderDialog extends SelectionStatusDialog {
-	// widgets
-	private Text folderNameField;
-
-	private Button advancedButton;
-
-	private CreateLinkedResourceGroup linkedResourceGroup;
-
-	private IContainer container;
-
-	private boolean firstLinkCheck = true;
-
-	/**
-	 * Parent composite of the advanced widget group for creating 
-	 * linked resources.
-	 */
-	private Composite linkedResourceParent;
-
-	/**
-	 * Linked resources widget group. Null if advanced section is not visible.
-	 */
-	private Composite linkedResourceComposite;
-
-	/**
-	 * Height of the dialog without the "advanced" linked resource group. 
-	 * Set when the advanced group is first made visible. 
-	 */
-	private int basicShellHeight = -1;
-
-	/**
-	 * Creates a NewFolderDialog
-	 * 
-	 * @param parentShell parent of the new dialog
-	 * @param container parent of the new folder
-	 */
-	public NewFolderDialog(Shell parentShell, IContainer container) {
-		super(parentShell);
-		this.container = container;
-		setTitle(IDEWorkbenchMessages.NewFolderDialog_title);
-		setStatusLineAboveButtons(true);
-	}
-
-	/**
-	 * Creates the folder using the name and link target entered
-	 * by the user.
-	 * Sets the dialog result to the created folder.  
-	 */
-	protected void computeResult() {
-		//Do nothing here as we 
-		//need to know the result
-	}
-
-	/* (non-Javadoc)
-	 * Method declared in Window.
-	 */
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
-				IIDEHelpContextIds.NEW_FOLDER_DIALOG);
-	}
-
-	/**
-	 * @see org.eclipse.jface.window.Window#create()
-	 */
-	public void create() {
-		super.create();
-		// initially disable the ok button since we don't preset the
-		// folder name field
-		getButton(IDialogConstants.OK_ID).setEnabled(false);
-	}
-
-	/**
-	 * Creates the widget for advanced options.
-	 *  
-	 * @param parent the parent composite
-	 */
-	protected void createAdvancedControls(Composite parent) {
-		Preferences preferences = ResourcesPlugin.getPlugin()
-				.getPluginPreferences();
-
-		if (preferences.getBoolean(ResourcesPlugin.PREF_DISABLE_LINKING) == false
-				&& isValidContainer()) {
-			linkedResourceParent = new Composite(parent, SWT.NONE);
-			linkedResourceParent.setFont(parent.getFont());
-			linkedResourceParent.setLayoutData(new GridData(
-					GridData.FILL_HORIZONTAL));
-			GridLayout layout = new GridLayout();
-			layout.marginHeight = 0;
-			layout.marginWidth = 0;
-			linkedResourceParent.setLayout(layout);
-
-			advancedButton = new Button(linkedResourceParent, SWT.PUSH);
-			advancedButton.setFont(linkedResourceParent.getFont());
-			advancedButton.setText(IDEWorkbenchMessages.showAdvanced);
-			setButtonLayoutData(advancedButton);
-			GridData data = (GridData) advancedButton.getLayoutData();
-			data.horizontalAlignment = GridData.BEGINNING;
-			advancedButton.setLayoutData(data);
-			advancedButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					handleAdvancedButtonSelect();
-				}
-			});
-		}
-		linkedResourceGroup = new CreateLinkedResourceGroup(IResource.FOLDER,
-				new Listener() {
-					public void handleEvent(Event e) {
-						validateLinkedResource();
-						firstLinkCheck = false;
-					}
-				}, new CreateLinkedResourceGroup.IStringValue() {
-					public void setValue(String string) {
-						folderNameField.setText(string);
-					}
-
-					public String getValue() {
-						return folderNameField.getText();
-					}
-				});
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite) super.createDialogArea(parent);
-		composite.setLayout(new GridLayout());
-		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		createFolderNameGroup(composite);
-		createAdvancedControls(composite);
-		return composite;
-	}
-
-	/**
-	 * Creates the folder name specification controls.
-	 *
-	 * @param parent the parent composite
-	 */
-	private void createFolderNameGroup(Composite parent) {
-		Font font = parent.getFont();
-		// project specification group
-		Composite folderGroup = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		folderGroup.setLayout(layout);
-		folderGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		// new folder label
-		Label folderLabel = new Label(folderGroup, SWT.NONE);
-		folderLabel.setFont(font);
-		folderLabel.setText(IDEWorkbenchMessages.NewFolderDialog_nameLabel);
-
-		// new folder name entry field
-		folderNameField = new Text(folderGroup, SWT.BORDER);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-		folderNameField.setLayoutData(data);
-		folderNameField.setFont(font);
-		folderNameField.addListener(SWT.Modify, new Listener() {
-			public void handleEvent(Event event) {
-				validateLinkedResource();
-			}
-		});
-	}
-
-	/**
-	 * Creates a folder resource handle for the folder with the given name.
-	 * The folder handle is created relative to the container specified during 
-	 * object creation. 
-	 *
-	 * @param folderName the name of the folder resource to create a handle for
-	 * @return the new folder resource handle
-	 */
-	private IFolder createFolderHandle(String folderName) {
-		IWorkspaceRoot workspaceRoot = container.getWorkspace().getRoot();
-		IPath folderPath = container.getFullPath().append(folderName);
-		IFolder folderHandle = workspaceRoot.getFolder(folderPath);
-
-		return folderHandle;
-	}
-
-	/**
-	 * Creates a new folder with the given name and optionally linking to
-	 * the specified link target.
-	 * 
-	 * @param folderName name of the new folder
-	 * @param linkTarget name of the link target folder. may be null.
-	 * @return IFolder the new folder
-	 */
-	private IFolder createNewFolder(String folderName, final URI linkTarget) {
-		final IFolder folderHandle = createFolderHandle(folderName);
-
-		WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
-			public void execute(IProgressMonitor monitor) throws CoreException {
-				try {
-					monitor
-							.beginTask(
-									IDEWorkbenchMessages.NewFolderDialog_progress,
-									2000);
-					if (monitor.isCanceled()) {
-						throw new OperationCanceledException();
-					}
-					if (linkTarget == null) {
-						folderHandle.create(false, true, monitor);
-					} else {
-						folderHandle.createLink(linkTarget,
-								IResource.ALLOW_MISSING_LOCAL, monitor);
-					}
-					if (monitor.isCanceled()) {
-						throw new OperationCanceledException();
-					}
-				} finally {
-					monitor.done();
-				}
-			}
-		};
-		try {
-			PlatformUI.getWorkbench().getProgressService().busyCursorWhile(
-					operation);
-		} catch (InterruptedException exception) {
-			return null;
-		} catch (InvocationTargetException exception) {
-			if (exception.getTargetException() instanceof CoreException) {
-				ErrorDialog.openError(getShell(),
-						IDEWorkbenchMessages.NewFolderDialog_errorTitle, null, // no special message
-						((CoreException) exception.getTargetException())
-								.getStatus());
-			} else {
-				// CoreExceptions are handled above, but unexpected runtime exceptions and errors may still occur.
-				IDEWorkbenchPlugin.log(getClass(),
-						"createNewFolder", exception.getTargetException()); //$NON-NLS-1$
-				MessageDialog
-						.openError(
-								getShell(),
-								IDEWorkbenchMessages.NewFolderDialog_errorTitle,
-								NLS
-										.bind(
-												IDEWorkbenchMessages.NewFolderDialog_internalError,
-												exception.getTargetException()
-														.getMessage()));
-			}
-			return null;
-		}
-		return folderHandle;
-	}
-
-	/**
-	 * Shows/hides the advanced option widgets. 
-	 */
-	protected void handleAdvancedButtonSelect() {
-		Shell shell = getShell();
-		Point shellSize = shell.getSize();
-		Composite composite = (Composite) getDialogArea();
-
-		if (linkedResourceComposite != null) {
-			linkedResourceComposite.dispose();
-			linkedResourceComposite = null;
-			composite.layout();
-			shell.setSize(shellSize.x, basicShellHeight);
-			advancedButton.setText(IDEWorkbenchMessages.showAdvanced);
-		} else {
-			if (basicShellHeight == -1) {
-				basicShellHeight = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-						true).y;
-			}
-			linkedResourceComposite = linkedResourceGroup
-					.createContents(linkedResourceParent);
-			shellSize = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-			shell.setSize(shellSize);
-			composite.layout();
-			advancedButton.setText(IDEWorkbenchMessages.hideAdvanced);
-		}
-	}
-
-	/**
-	 * Returns whether the container specified in the constructor is
-	 * a valid parent for creating linked resources.
-	 * 
-	 * @return boolean <code>true</code> if the container specified in 
-	 * 	the constructor is a valid parent for creating linked resources.
-	 * 	<code>false</code> if no linked resources may be created with the
-	 * 	specified container as a parent. 
-	 */
-	private boolean isValidContainer() {
-		if (container.getType() != IResource.PROJECT
-				&& container.getType() != IResource.FOLDER) {
-			return false;
-		}
-
-		try {
-			IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace();
-			IProject project = container.getProject();
-			String[] natureIds = project.getDescription().getNatureIds();
-
-			for (int i = 0; i < natureIds.length; i++) {
-				IProjectNatureDescriptor descriptor = workspace
-						.getNatureDescriptor(natureIds[i]);
-				if (descriptor != null
-						&& descriptor.isLinkingAllowed() == false) {
-					return false;
-				}
-			}
-		} catch (CoreException exception) {
-			// project does not exist or is closed
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * Update the dialog's status line to reflect the given status. It is safe to call
-	 * this method before the dialog has been opened.
-	 */
-	protected void updateStatus(IStatus status) {
-		if (firstLinkCheck && status != null) {
-			// don't show the first validation result as an error.
-			// fixes bug 29659
-			Status newStatus = new Status(IStatus.OK, status.getPlugin(),
-					status.getCode(), status.getMessage(), status
-							.getException());
-			super.updateStatus(newStatus);
-		} else {
-			super.updateStatus(status);
-		}
-	}
-
-	/**
-	 * Update the dialog's status line to reflect the given status. It is safe to call
-	 * this method before the dialog has been opened.
-	 * @param severity
-	 * @param message
-	 */
-	private void updateStatus(int severity, String message) {
-		updateStatus(new Status(severity, IDEWorkbenchPlugin.IDE_WORKBENCH,
-				severity, message, null));
-	}
-
-	/**
-	 * Checks whether the folder name and link location are valid.
-	 * Disable the OK button if the folder name and link location are valid.
-	 * a message that indicates the problem otherwise.
-	 */
-	private void validateLinkedResource() {
-		boolean valid = validateFolderName();
-
-		if (valid) {
-			IFolder linkHandle = createFolderHandle(folderNameField.getText());
-			IStatus status = linkedResourceGroup
-					.validateLinkLocation(linkHandle);
-
-			if (status.getSeverity() != IStatus.ERROR) {
-				getOkButton().setEnabled(true);
-			} else {
-				getOkButton().setEnabled(false);
-			}
-
-			if (status.isOK() == false) {
-				updateStatus(status);
-			}
-		} else {
-			getOkButton().setEnabled(false);
-		}
-	}
-
-	/**
-	 * Checks if the folder name is valid.
-	 *
-	 * @return null if the new folder name is valid.
-	 * 	a message that indicates the problem otherwise.
-	 */
-	private boolean validateFolderName() {
-		String name = folderNameField.getText();
-		IWorkspace workspace = container.getWorkspace();
-		IStatus nameStatus = workspace.validateName(name, IResource.FOLDER);
-
-		if ("".equals(name)) { //$NON-NLS-1$
-			updateStatus(IStatus.ERROR,
-					IDEWorkbenchMessages.NewFolderDialog_folderNameEmpty);
-			return false;
-		}
-		if (nameStatus.isOK() == false) {
-			updateStatus(nameStatus);
-			return false;
-		}
-		IPath path = new Path(name);
-		if (container.getFolder(path).exists()
-				|| container.getFile(path).exists()) {
-			updateStatus(IStatus.ERROR, NLS.bind(
-					IDEWorkbenchMessages.NewFolderDialog_alreadyExists, name));
-			return false;
-		}
-		updateStatus(IStatus.OK, ""); //$NON-NLS-1$
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.SelectionStatusDialog#okPressed()
-	 */
-	protected void okPressed() {
-		URI linkTarget = linkedResourceGroup.getLinkTargetURI();
-		IFolder folder = createNewFolder(folderNameField.getText(), linkTarget);
-		if (folder == null) {
-			return;
-		}
-
-		setSelectionResult(new IFolder[] { folder });
-
-		super.okPressed();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ProjectLocationMoveDialog.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ProjectLocationMoveDialog.java
deleted file mode 100644
index 3495580..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ProjectLocationMoveDialog.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    IBM Corporation - initial API and implementation 
- *    Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog
- *        font should be activated and used by other components.
- *    Oakland Software Incorporated (Francis Upton) <francisu@ieee.org>
- *		  Bug 224997 [Workbench] Impossible to copy project
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.resource.JFaceColors;
-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;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea;
-import org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea.IErrorMessageReporter;
-
-/**
- * The ProjectLocationMoveDialog is the dialog used to select the location of a
- * project for moving.
- */
-public class ProjectLocationMoveDialog extends SelectionDialog {
-	private IProject project;
-
-	private Label statusMessageLabel;
-
-	private static String PROJECT_LOCATION_SELECTION_TITLE = IDEWorkbenchMessages.ProjectLocationSelectionDialog_selectionTitle;
-
-
-	private ProjectContentsLocationArea locationArea;
-
-	/**
-	 * Create a ProjectLocationMoveDialog on the supplied project parented by
-	 * the parentShell.
-	 * 
-	 * @param parentShell
-	 * @param existingProject
-	 */
-	public ProjectLocationMoveDialog(Shell parentShell, IProject existingProject) {
-		super(parentShell);
-		setTitle(PROJECT_LOCATION_SELECTION_TITLE);
-		this.project = existingProject;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#setMessage(java.lang.String)
-	 */
-	public void setMessage(String message) {
-		super.setMessage(message);
-		if (statusMessageLabel != null) {
-			if (message == null) {
-				statusMessageLabel.setText("");//$NON-NLS-1$
-				statusMessageLabel.setToolTipText("");//$NON-NLS-1$
-				getOkButton().setEnabled(true);
-			} else {
-				statusMessageLabel.setForeground(JFaceColors
-						.getErrorText(statusMessageLabel.getDisplay()));
-				statusMessageLabel.setText(message);
-				statusMessageLabel.setToolTipText(message);
-				getOkButton().setEnabled(false);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in Window.
-	 */
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
-				IIDEHelpContextIds.PROJECT_LOCATION_SELECTION_DIALOG);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected Control createContents(Composite parent) {
-		Control content = super.createContents(parent);
-		getOkButton().setEnabled(false);
-		return content;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		// page group
-		Composite composite = (Composite) super.createDialogArea(parent);
-
-		composite.setLayout(new GridLayout());
-		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		locationArea = new ProjectContentsLocationArea(getErrorReporter(), composite,
-				this.project);
-
-		// Scale the button based on the rest of the dialog
-		setButtonLayoutData(locationArea.getBrowseButton());
-
-		// Add in a label for status messages if required
-		statusMessageLabel = new Label(composite, SWT.WRAP);
-		statusMessageLabel.setLayoutData(new GridData(GridData.FILL_BOTH));
-		statusMessageLabel.setFont(parent.getFont());
-		// Make it two lines.
-		statusMessageLabel.setText(" \n "); //$NON-NLS-1$
-
-		applyDialogFont(composite);
-		return composite;
-	}
-
-
-	/**
-	 * Get an error reporter for the receiver.
-	 * @return IErrorMessageReporter
-	 */
-	private IErrorMessageReporter getErrorReporter() {
-		return new IErrorMessageReporter(){
-			/* (non-Javadoc)
-			 * @see org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea.IErrorMessageReporter#reportError(java.lang.String)
-			 */
-			public void reportError(String errorMessage, boolean notError) {
-				setMessage(errorMessage);
-				
-			}
-		};
-	}
-
-	/**
-	 * Get the project being manipulated.
-	 */
-	private IProject getProject() {
-		return this.project;
-	}
-
-	/**
-	 * The <code>ProjectLocationMoveDialog</code> implementation of this
-	 * <code>Dialog</code> method builds a two element list - the first
-	 * element is the project name and the second one is the location.
-	 */
-	protected void okPressed() {
-
-		ArrayList list = new ArrayList();
-		list.add(getProject().getName());
-		list.add(locationArea.getProjectLocation());
-		setResult(list);
-		super.okPressed();
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ProjectLocationSelectionDialog.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ProjectLocationSelectionDialog.java
deleted file mode 100644
index f8efcec..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ProjectLocationSelectionDialog.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog font
- *     should be activated and used by other components.
- *     Francis Upton <francisu@ieee.org> - Fix for Bug 164695
- *     		[Workbench] Project copy doesn't validate location and uses invalid location as default
- *     Oakland Software Incorporated (Francis Upton) <francisu@ieee.org>
- *		    Bug 224997 [Workbench] Impossible to copy project
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea;
-import org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea.IErrorMessageReporter;
-
-/**
- * The ProjectLocationSelectionDialog is the dialog used to select the name and
- * location of a project for copying.
- */
-public class ProjectLocationSelectionDialog extends SelectionStatusDialog {
-	// widgets
-	private Text projectNameField;
-
-	private IProject project;
-
-	private ProjectContentsLocationArea locationArea;
-
-	private static String PROJECT_NAME_LABEL = IDEWorkbenchMessages.ProjectLocationSelectionDialog_nameLabel;
-
-	private static String PROJECT_LOCATION_SELECTION_TITLE = IDEWorkbenchMessages.ProjectLocationSelectionDialog_selectionTitle;
-
-	// constants
-	private static final int SIZING_TEXT_FIELD_WIDTH = 250;
-
-	/**
-	 * Create a ProjectLocationSelectionDialog on the supplied project parented
-	 * by the parentShell.
-	 * 
-	 * @param parentShell
-	 * @param existingProject
-	 */
-	public ProjectLocationSelectionDialog(Shell parentShell,
-			IProject existingProject) {
-		super(parentShell);
-		setTitle(PROJECT_LOCATION_SELECTION_TITLE);
-		setStatusLineAboveButtons(true);
-		project = existingProject;
-	}
-
-	/**
-	 * Check the message. If it is null then continue otherwise inform the user
-	 * via the status value and disable the OK.
-	 * 
-	 * @param errorMsg
-	 *            the error message to show if it is not <code>null</code>
-	 */
-	private void applyValidationResult(String errorMsg, boolean infoOnly) {
-		int code;
-		boolean allowFinish = false;
-
-		if (errorMsg == null) {
-			code = IStatus.OK;
-			errorMsg = ""; //$NON-NLS-1$
-			allowFinish = true;
-		} else if (infoOnly) {
-			code = IStatus.OK;
-		} else {
-			code = IStatus.ERROR;
-		}
-
-		updateStatus(new Status(code, IDEWorkbenchPlugin.IDE_WORKBENCH, code,
-				errorMsg, null));
-		if (getOkButton() != null)
-			getOkButton().setEnabled(allowFinish);
-	}
-
-	/**
-	 * Check whether the entries are valid. If so return null. Otherwise return
-	 * a string that indicates the problem.
-	 */
-	private String checkValid() {
-		String valid = checkValidName();
-		if (valid != null) {
-			return valid;
-		}
-		return locationArea.checkValidLocation();
-	}
-
-	/**
-	 * Check if the entries in the widget are valid. If they are return null
-	 * otherwise return a string that indicates the problem.
-	 */
-	private String checkValidName() {
-
-		String name = this.projectNameField.getText();
-		IWorkspace workspace = getProject().getWorkspace();
-		IStatus nameStatus = workspace.validateName(name, IResource.PROJECT);
-		if (!nameStatus.isOK()) {
-			return nameStatus.getMessage();
-		}
-		IProject newProject = workspace.getRoot().getProject(name);
-		if (newProject.exists()) {
-			return NLS.bind(
-					IDEWorkbenchMessages.CopyProjectAction_alreadyExists, name);
-		}
-
-		return null;
-	}
-
-	/**
-	 * The <code>ProjectLocationSelectionDialog</code> implementation of this
-	 * <code>SelectionStatusDialog</code> method builds a two element list -
-	 * the first element is the project name and the second one is the location.
-	 */
-	protected void computeResult() {
-
-		ArrayList list = new ArrayList();
-		list.add(this.projectNameField.getText());
-		list.add(locationArea.getProjectLocation());
-		setResult(list);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in Window.
-	 */
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
-				IIDEHelpContextIds.PROJECT_LOCATION_SELECTION_DIALOG);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		// page group
-		Composite composite = (Composite) super.createDialogArea(parent);
-
-		composite.setLayout(new GridLayout());
-		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		createProjectNameGroup(composite);
-		locationArea = new ProjectContentsLocationArea(getErrorReporter(),
-				composite);
-		locationArea.updateProjectName(projectNameField.getText());
-		return composite;
-	}
-
-	/**
-	 * Create the listener that is used to validate the entries for the receiver
-	 */
-	private void createNameListener() {
-
-		Listener listener = new Listener() {
-			public void handleEvent(Event event) {
-				setLocationForSelection();
-				applyValidationResult(checkValid(), false);
-			}
-		};
-
-		this.projectNameField.addListener(SWT.Modify, listener);
-	}
-
-	/**
-	 * Creates the project name specification controls.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 */
-	private void createProjectNameGroup(Composite parent) {
-		Font font = parent.getFont();
-		// project specification group
-		Composite projectGroup = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		projectGroup.setLayout(layout);
-		projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		// new project label
-		Label projectLabel = new Label(projectGroup, SWT.NONE);
-		projectLabel.setFont(font);
-		projectLabel.setText(PROJECT_NAME_LABEL);
-
-		// new project name entry field
-		projectNameField = new Text(projectGroup, SWT.BORDER);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-		projectNameField.setLayoutData(data);
-		projectNameField.setFont(font);
-
-		// Set the initial value first before listener
-		// to avoid handling an event during the creation.
-		projectNameField.setText(getCopyNameFor(getProject().getName()));
-		projectNameField.selectAll();
-
-		createNameListener();
-
-	}
-
-	/**
-	 * Generates a new name for the project that does not have any collisions.
-	 */
-	private String getCopyNameFor(String projectName) {
-
-		IWorkspace workspace = getProject().getWorkspace();
-		if (!workspace.getRoot().getProject(projectName).exists()) {
-			return projectName;
-		}
-
-		int counter = 1;
-		while (true) {
-			String nameSegment;
-			if (counter > 1) {
-				nameSegment = NLS.bind(
-						IDEWorkbenchMessages.CopyProjectAction_copyNameTwoArgs,
-						new Integer(counter), projectName);
-			} else {
-				nameSegment = NLS.bind(
-						IDEWorkbenchMessages.CopyProjectAction_copyNameOneArg,
-						projectName);
-			}
-
-			if (!workspace.getRoot().getProject(nameSegment).exists()) {
-				return nameSegment;
-			}
-
-			counter++;
-		}
-
-	}
-
-	/**
-	 * Get the project being manipulated.
-	 */
-	private IProject getProject() {
-		return this.project;
-	}
-
-	/**
-	 * Set the location to the default location if we are set to useDefaults.
-	 */
-	private void setLocationForSelection() {
-		locationArea.updateProjectName(projectNameField.getText());
-	}
-
-	/**
-	 * Get an error reporter for the receiver.
-	 * 
-	 * @return IErrorMessageReporter
-	 */
-	private IErrorMessageReporter getErrorReporter() {
-		return new IErrorMessageReporter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea.IErrorMessageReporter#reportError(java.lang.String)
-			 */
-			public void reportError(String errorMessage, boolean infoOnly) {
-				setMessage(errorMessage);
-				applyValidationResult(errorMessage, infoOnly);
-			}
-		};
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ResourceListSelectionDialog.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ResourceListSelectionDialog.java
deleted file mode 100644
index 262e636..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ResourceListSelectionDialog.java
+++ /dev/null
@@ -1,979 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *  IBM Corporation - initial API and implementation 
- * 	Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog font
- * 		should be activated and used by other components.
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import com.ibm.icu.text.Collator; 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceProxy;
-import org.eclipse.core.resources.IResourceProxyVisitor;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-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.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.StringMatcher;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * Shows a list of resources to the user with a text entry field
- * for a string pattern used to filter the list of resources.
- * <p>
- * 
- * @since 2.1
- */
-public class ResourceListSelectionDialog extends SelectionDialog {
-	
-	private static final String DIALOG_SETTINGS_SECTION = "ResourceListSelectionDialogSettings"; //$NON-NLS-1$
-    
-    Text pattern;
-
-    Table resourceNames;
-
-    Table folderNames;
-
-    String patternString;
-
-    IContainer container;
-
-    int typeMask;
-
-    private static Collator collator = Collator.getInstance();
-
-    boolean gatherResourcesDynamically = true;
-
-    StringMatcher stringMatcher;
-
-    UpdateFilterThread updateFilterThread;
-
-    UpdateGatherThread updateGatherThread;
-
-    ResourceDescriptor[] descriptors;
-
-    int descriptorsSize;
-
-    WorkbenchLabelProvider labelProvider = new WorkbenchLabelProvider();
-    
-    boolean okEnabled = false;
-
-    private boolean showDerived = false;
-
-    private Button showDerivedButton;
-
-    private boolean allowUserToToggleDerived;
-    
-    static class ResourceDescriptor implements Comparable {
-        String label;
-
-        ArrayList resources = new ArrayList();
-
-        boolean resourcesSorted = true;
-
-        public int compareTo(Object o) {
-            return collator.compare(label, ((ResourceDescriptor) o).label);
-        }
-    }
-
-    class UpdateFilterThread extends Thread {
-        boolean stop = false;
-
-        int firstMatch = 0;
-
-        int lastMatch = descriptorsSize - 1;
-
-        public void run() {
-            Display display = resourceNames.getDisplay();
-            final int itemIndex[] = { 0 };
-            final int itemCount[] = { 0 };
-            //Keep track of if the widget got disposed 
-            //so that we can abort if required
-            final boolean[] disposed = { false };
-            display.syncExec(new Runnable() {
-                public void run() {
-                    //Be sure the widget still exists
-                    if (resourceNames.isDisposed()) {
-                        disposed[0] = true;
-                        return;
-                    }
-                    itemCount[0] = resourceNames.getItemCount();
-                }
-            });
-
-            if (disposed[0]) {
-				return;
-			}
-
-            int last;
-            if ((patternString.indexOf('?') == -1)
-                    && (patternString.endsWith("*")) && //$NON-NLS-1$
-                    (patternString.indexOf('*') == patternString.length() - 1)) {
-                // Use a binary search to get first and last match when the pattern
-                // string ends with "*" and has no other embedded special characters.  
-                // For this case, we can be smarter about getting the first and last 
-                // match since the items are in sorted order.
-                firstMatch = getFirstMatch();
-                if (firstMatch == -1) {
-                    firstMatch = 0;
-                    lastMatch = -1;
-                } else {
-                    lastMatch = getLastMatch();
-                }
-                last = lastMatch;
-                for (int i = firstMatch; i <= lastMatch; i++) {
-                    if (i % 50 == 0) {
-                        try {
-                            Thread.sleep(10);
-                        } catch (InterruptedException e) {
-                            // ignore
-                        }
-                    }
-                    if (stop || resourceNames.isDisposed()) {
-                        disposed[0] = true;
-                        return;
-                    }
-                    final int index = i;
-                    display.syncExec(new Runnable() {
-                        public void run() {
-                            if (stop || resourceNames.isDisposed()) {
-								return;
-							}
-                            updateItem(index, itemIndex[0], itemCount[0]);
-                            itemIndex[0]++;
-                        }
-                    });
-                }
-            } else {
-                last = lastMatch;
-                boolean setFirstMatch = true;
-                for (int i = firstMatch; i <= lastMatch; i++) {
-                    if (i % 50 == 0) {
-                        try {
-                            Thread.sleep(10);
-                        } catch (InterruptedException e) {
-                            // ignore
-                        }
-                    }
-                    if (stop || resourceNames.isDisposed()) {
-                        disposed[0] = true;
-                        return;
-                    }
-                    final int index = i;
-                    if (match(descriptors[index].label)) {
-                        if (setFirstMatch) {
-                            setFirstMatch = false;
-                            firstMatch = index;
-                        }
-                        last = index;
-                        display.syncExec(new Runnable() {
-                            public void run() {
-                                if (stop || resourceNames.isDisposed()) {
-									return;
-								}
-                                updateItem(index, itemIndex[0], itemCount[0]);
-                                itemIndex[0]++;
-                            }
-                        });
-                    }
-                }
-            }
-
-            if (disposed[0]) {
-				return;
-			}
-
-            lastMatch = last;
-            display.syncExec(new Runnable() {
-                public void run() {
-                    if (resourceNames.isDisposed()) {
-						return;
-					}
-                    itemCount[0] = resourceNames.getItemCount();
-                    if (itemIndex[0] < itemCount[0]) {
-                        resourceNames.setRedraw(false);
-                        resourceNames.remove(itemIndex[0], itemCount[0] - 1);
-                        resourceNames.setRedraw(true);
-                    }
-                    // If no resources, remove remaining folder entries
-                    if (resourceNames.getItemCount() == 0) {
-                        folderNames.removeAll();
-                        updateOKState(false);
-                    }
-                }
-            });
-        }
-    }
-
-    class UpdateGatherThread extends Thread {
-        boolean stop = false;
-
-        int lastMatch = -1;
-
-        int firstMatch = 0;
-
-        boolean refilter = false;
-
-        public void run() {
-            Display display = resourceNames.getDisplay();
-            final int itemIndex[] = { 0 };
-            final int itemCount[] = { 0 };
-            //Keep track of if the widget got disposed 
-            //so that we can abort if required
-            final boolean[] disposed = { false };
-            display.syncExec(new Runnable() {
-                public void run() {
-                    //Be sure the widget still exists
-                    if (resourceNames.isDisposed()) {
-                        disposed[0] = true;
-                        return;
-                    }
-                    itemCount[0] = resourceNames.getItemCount();
-                }
-            });
-
-            if (disposed[0]) {
-                return;
-            }
-
-            if (!refilter) {
-                for (int i = 0; i <= lastMatch; i++) {
-                    if (i % 50 == 0) {
-                        try {
-                            Thread.sleep(10);
-                        } catch (InterruptedException e) {
-                            // ignore
-                        }
-                    }
-                    if (stop || resourceNames.isDisposed()) {
-                        disposed[0] = true;
-                        return;
-                    }
-                    final int index = i;
-                    display.syncExec(new Runnable() {
-                        public void run() {
-                            if (stop || resourceNames.isDisposed()) {
-								return;
-							}
-                            updateItem(index, itemIndex[0], itemCount[0]);
-                            itemIndex[0]++;
-                        }
-                    });
-                }
-            } else {
-                // we're filtering the previous list
-                for (int i = firstMatch; i <= lastMatch; i++) {
-                    if (i % 50 == 0) {
-                        try {
-                            Thread.sleep(10);
-                        } catch (InterruptedException e) {
-                            // ignore
-                        }
-                    }
-                    if (stop || resourceNames.isDisposed()) {
-                        disposed[0] = true;
-                        return;
-                    }
-                    final int index = i;
-                    if (match(descriptors[index].label)) {
-                        display.syncExec(new Runnable() {
-                            public void run() {
-                                if (stop || resourceNames.isDisposed()) {
-									return;
-								}
-                                updateItem(index, itemIndex[0], itemCount[0]);
-                                itemIndex[0]++;
-                            }
-                        });
-                    }
-                }
-            }
-
-            if (disposed[0]) {
-                return;
-            }
-
-            display.syncExec(new Runnable() {
-                public void run() {
-                    if (resourceNames.isDisposed()) {
-                        return;
-                    }
-                    itemCount[0] = resourceNames.getItemCount();
-                    if (itemIndex[0] < itemCount[0]) {
-                        resourceNames.setRedraw(false);
-                        resourceNames.remove(itemIndex[0], itemCount[0] - 1);
-                        resourceNames.setRedraw(true);
-                    }
-                    // If no resources, remove remaining folder entries
-                    if (resourceNames.getItemCount() == 0) {
-                        folderNames.removeAll();
-                        updateOKState(false);
-                    }
-                }
-            });
-        }
-    }
-
-    /**
-     * Creates a new instance of the class.
-     * 
-     * @param parentShell shell to parent the dialog on
-     * @param resources resources to display in the dialog
-     */
-    public ResourceListSelectionDialog(Shell parentShell, IResource[] resources) {
-        super(parentShell);
-        gatherResourcesDynamically = false;
-        initDescriptors(resources);
-    }
-
-    /**
-     * Creates a new instance of the class.  When this constructor is used to
-     * create the dialog, resources will be gathered dynamically as the pattern
-     * string is specified.  Only resources of the given types that match the 
-     * pattern string will be listed.  To further filter the matching resources,
-     * @see #select(IResource)
-     * 
-     * @param parentShell shell to parent the dialog on
-     * @param container container to get resources from
-     * @param typeMask mask containing IResource types to be considered
-     */
-    public ResourceListSelectionDialog(Shell parentShell, IContainer container,
-            int typeMask) {
-        super(parentShell);
-        this.container = container;
-        this.typeMask = typeMask;
-    }
-
-    /**
-     * Adjust the pattern string for matching.
-     */
-    protected String adjustPattern() {
-        String text = pattern.getText().trim();
-        if (text.endsWith("<")) { //$NON-NLS-1$
-            // the < character indicates an exact match search
-            return text.substring(0, text.length() - 1);
-        }
-        if (!text.equals("") && !text.endsWith("*")) { //$NON-NLS-1$ //$NON-NLS-2$
-        	return text + "*"; //$NON-NLS-1$
-        }
-        return text;
-    }
-
-    /**
-     * @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
-     */
-    protected void cancelPressed() {
-        setResult(null);
-        super.cancelPressed();
-    }
-
-    /**
-     * @see org.eclipse.jface.window.Window#close()
-     */
-    public boolean close() {
-        boolean result = super.close();
-        labelProvider.dispose();
-        return result;
-    }
-
-    /**
-     * @see org.eclipse.jface.window.Window#create()
-     */
-    public void create() {
-        super.create();
-        pattern.setFocus();
-        getButton(IDialogConstants.OK_ID).setEnabled(okEnabled);
-    }
-
-    /**
-     * Creates the contents of this dialog, initializes the
-     * listener and the update thread.
-     * 
-     * @param parent parent to create the dialog widgets in
-     */
-    protected Control createDialogArea(Composite parent) {
-
-        Composite dialogArea = (Composite) super.createDialogArea(parent);
-        Label l = new Label(dialogArea, SWT.NONE);
-        l.setText(IDEWorkbenchMessages.ResourceSelectionDialog_label);
-        GridData data = new GridData(GridData.FILL_HORIZONTAL);
-        l.setLayoutData(data);
-
-        pattern = new Text(dialogArea, SWT.SINGLE | SWT.BORDER);
-        pattern.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        l = new Label(dialogArea, SWT.NONE);
-        l.setText(IDEWorkbenchMessages.ResourceSelectionDialog_matching);
-        data = new GridData(GridData.FILL_HORIZONTAL);
-        l.setLayoutData(data);
-        resourceNames = new Table(dialogArea, SWT.SINGLE | SWT.BORDER
-                | SWT.V_SCROLL);
-        data = new GridData(GridData.FILL_BOTH);
-        data.heightHint = 12 * resourceNames.getItemHeight();
-        resourceNames.setLayoutData(data);
-
-        l = new Label(dialogArea, SWT.NONE);
-        l.setText(IDEWorkbenchMessages.ResourceSelectionDialog_folders);
-        data = new GridData(GridData.FILL_HORIZONTAL);
-        l.setLayoutData(data);
-
-        folderNames = new Table(dialogArea, SWT.SINGLE | SWT.BORDER
-                | SWT.V_SCROLL | SWT.H_SCROLL);
-        data = new GridData(GridData.FILL_BOTH);
-        data.widthHint = 300;
-        data.heightHint = 4 * folderNames.getItemHeight();
-        folderNames.setLayoutData(data);
-
-        if (gatherResourcesDynamically) {
-            updateGatherThread = new UpdateGatherThread();
-        } else {
-            updateFilterThread = new UpdateFilterThread();
-        }
-
-        pattern.addKeyListener(new KeyAdapter() {
-            public void keyReleased(KeyEvent e) {
-                if (e.keyCode == SWT.ARROW_DOWN) {
-					resourceNames.setFocus();
-				}
-            }
-        });
-
-        pattern.addModifyListener(new ModifyListener() {
-            public void modifyText(ModifyEvent e) {
-                refresh(false);
-            }
-        });
-
-        resourceNames.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                updateFolders((ResourceDescriptor) e.item.getData());
-            }
-
-            public void widgetDefaultSelected(SelectionEvent e) {
-                okPressed();
-            }
-        });
-
-        folderNames.addSelectionListener(new SelectionAdapter() {
-            public void widgetDefaultSelected(SelectionEvent e) {
-                okPressed();
-            }
-        });
-
-        if (getAllowUserToToggleDerived()) {
-            showDerivedButton = new Button(dialogArea, SWT.CHECK);
-            showDerivedButton.setText(IDEWorkbenchMessages.ResourceSelectionDialog_showDerived);
-            showDerivedButton.addSelectionListener(new SelectionAdapter() {
-                public void widgetSelected(SelectionEvent e) {
-                    setShowDerived(showDerivedButton.getSelection());
-                    refresh(true);
-                }
-            });
-            showDerivedButton.setSelection(getShowDerived());
-        }
-            
-        applyDialogFont(dialogArea);
-        return dialogArea;
-    }
-
-    /**
-     * Returns whether to include a "Show derived resources" checkbox in the dialog.
-     * The default is <code>false</code>.
-     * 
-     * @return <code>true</code> to include the checkbox, <code>false</code> to omit
-     * @since 3.1
-     */
-    public boolean getAllowUserToToggleDerived() {
-        return allowUserToToggleDerived;
-    }
-
-    /**
-     * Sets whether to include a "Show derived resources" checkbox in the dialog.
-     * 
-     * @param allow <code>true</code> to include the checkbox, <code>false</code> to omit
-     * @since 3.1
-     */
-    public void setAllowUserToToggleDerived(boolean allow) {
-        allowUserToToggleDerived = allow;
-    }
-    
-    /**
-     */
-    private void filterResources(boolean force) {
-        String oldPattern = force ? null : patternString;
-        patternString = adjustPattern();
-        if (!force && patternString.equals(oldPattern)) {
-			return;
-		}
-
-        updateFilterThread.stop = true;
-        stringMatcher = new StringMatcher(patternString, true, false);
-        UpdateFilterThread oldThread = updateFilterThread;
-        updateFilterThread = new UpdateFilterThread();
-        if (patternString.equals("")) { //$NON-NLS-1$
-            updateFilterThread.firstMatch = 0;
-            updateFilterThread.lastMatch = -1;
-            updateFilterThread.start();
-            return;
-        }
-
-        if (oldPattern != null && (oldPattern.length() != 0)
-                && oldPattern.endsWith("*") && patternString.endsWith("*")) { //$NON-NLS-1$ //$NON-NLS-2$
-            int matchLength = oldPattern.length() - 1;
-            if (patternString.regionMatches(0, oldPattern, 0, matchLength)) {
-                // filter the previous list of items, this is done when the 
-                // new pattern is a derivative of the old pattern
-                updateFilterThread.firstMatch = oldThread.firstMatch;
-                updateFilterThread.lastMatch = oldThread.lastMatch;
-                updateFilterThread.start();
-                return;
-            }
-        }
-
-        // filter the entire list
-        updateFilterThread.firstMatch = 0;
-        updateFilterThread.lastMatch = descriptorsSize - 1;
-        updateFilterThread.start();
-    }
-
-    /**
-     * Use a binary search to get the first match for the patternString.
-     * This method assumes the patternString does not contain any '?' 
-     * characters and that it contains only one '*' character at the end
-     * of the string.
-     */
-    private int getFirstMatch() {
-        int high = descriptorsSize;
-        int low = -1;
-        boolean match = false;
-        ResourceDescriptor desc = new ResourceDescriptor();
-        desc.label = patternString.substring(0, patternString.length() - 1);
-        while (high - low > 1) {
-            int index = (high + low) / 2;
-            String label = descriptors[index].label;
-            if (match(label)) {
-                high = index;
-                match = true;
-            } else {
-                int compare = descriptors[index].compareTo(desc);
-                if (compare == -1) {
-                    low = index;
-                } else {
-                    high = index;
-                }
-            }
-        }
-        if (match) {
-			return high;
-		}
-        return -1;
-    }
-
-    /**
-     */
-    private void gatherResources(boolean force) {
-        String oldPattern = force ? null : patternString;
-        patternString = adjustPattern();
-        if (!force && patternString.equals(oldPattern)) {
-			return;
-		}
-
-        updateGatherThread.stop = true;
-        updateGatherThread = new UpdateGatherThread();
-
-        if (patternString.equals("")) { //$NON-NLS-1$
-            updateGatherThread.start();
-            return;
-        }
-        stringMatcher = new StringMatcher(patternString, true, false);
-
-        if (oldPattern != null && (oldPattern.length() != 0)
-                && oldPattern.endsWith("*") && patternString.endsWith("*")) { //$NON-NLS-1$ //$NON-NLS-2$
-            // see if the new pattern is a derivative of the old pattern
-            int matchLength = oldPattern.length() - 1;
-            if (patternString.regionMatches(0, oldPattern, 0, matchLength)) {
-                updateGatherThread.refilter = true;
-                updateGatherThread.firstMatch = 0;
-                updateGatherThread.lastMatch = descriptorsSize - 1;
-                updateGatherThread.start();
-                return;
-            }
-        }
-
-        final ArrayList resources = new ArrayList();
-        BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
-            public void run() {
-                getMatchingResources(resources);
-                IResource resourcesArray[] = new IResource[resources.size()];
-                resources.toArray(resourcesArray);
-                initDescriptors(resourcesArray);
-            }
-        });
-
-        updateGatherThread.firstMatch = 0;
-        updateGatherThread.lastMatch = descriptorsSize - 1;
-        updateGatherThread.start();
-    }
-
-    /**
-     * Return an image for a resource descriptor.
-     * 
-     * @param desc resource descriptor to return image for
-     * @return an image for a resource descriptor.
-     */
-    private Image getImage(ResourceDescriptor desc) {
-        IResource r = (IResource) desc.resources.get(0);
-        return labelProvider.getImage(r);
-    }
-
-    /**
-     * Use a binary search to get the last match for the patternString.
-     * This method assumes the patternString does not contain any '?' 
-     * characters and that it contains only one '*' character at the end
-     * of the string.
-     */
-    private int getLastMatch() {
-        int high = descriptorsSize;
-        int low = -1;
-        boolean match = false;
-        ResourceDescriptor desc = new ResourceDescriptor();
-        desc.label = patternString.substring(0, patternString.length() - 1);
-        while (high - low > 1) {
-            int index = (high + low) / 2;
-            String label = descriptors[index].label;
-            if (match(label)) {
-                low = index;
-                match = true;
-            } else {
-                int compare = descriptors[index].compareTo(desc);
-                if (compare == -1) {
-                    low = index;
-                } else {
-                    high = index;
-                }
-            }
-        }
-        if (match) {
-			return low;
-		}
-        return -1;
-    }
-
-    /**
-     * Gather the resources of the specified type that match the current
-     * pattern string.  Gather the resources using the proxy visitor since
-     * this is quicker than getting the entire resource.
-     * 
-     * @param resources resources that match
-     */
-    private void getMatchingResources(final ArrayList resources) {
-        try {
-            container.accept(new IResourceProxyVisitor() {
-                public boolean visit(IResourceProxy proxy) {
-                    // optionally exclude derived resources (bugs 38085 and 81333)
-                    if (!getShowDerived() && proxy.isDerived()) {
-                        return false;
-                    }
-                    int type = proxy.getType();
-                    if ((typeMask & type) != 0) {
-                        if (match(proxy.getName())) {
-                            IResource res = proxy.requestResource();
-                            if (select(res)) {
-                                resources.add(res);
-                                return true;
-                            }
-                            return false;
-                        }
-                    }
-                    if (type == IResource.FILE) {
-						return false;
-					}
-                    return true;
-                }
-            }, IResource.NONE);
-        } catch (CoreException e) {
-            // ignore
-        }
-    }
-
-    private Image getParentImage(IResource resource) {
-        IResource parent = resource.getParent();
-        return labelProvider.getImage(parent);
-    }
-
-    private String getParentLabel(IResource resource) {
-        IResource parent = resource.getParent();
-        String text;
-        if (parent.getType() == IResource.ROOT) {
-            // Get readable name for workspace root ("Workspace"), without duplicating language-specific string here.
-            text = labelProvider.getText(parent);
-        } else {
-            text = parent.getFullPath().makeRelative().toString();
-        }
-        if(text == null) {
-			return ""; //$NON-NLS-1$
-		}
-        return text;
-    }
-
-    /**
-     * Returns whether derived resources should be shown in the list.
-     * The default is <code>false</code>.
-     * 
-     * @return <code>true</code> to show derived resources, <code>false</code> to hide them
-     * @since 3.1
-     */
-    protected boolean getShowDerived() {
-       return showDerived ; 
-    }
-
-    /**
-     * Sets whether derived resources should be shown in the list.
-     * 
-     * @param show <code>true</code> to show derived resources, <code>false</code> to hide them
-     * @since 3.1
-     */
-    protected void setShowDerived(boolean show) {
-        showDerived  = show;
-    }
-
-    /**
-     * Creates a ResourceDescriptor for each IResource,
-     * sorts them and removes the duplicated ones.
-     * 
-     * @param resources resources to create resource descriptors for
-     */
-    private void initDescriptors(final IResource resources[]) {
-        BusyIndicator.showWhile(null, new Runnable() {
-            public void run() {
-                descriptors = new ResourceDescriptor[resources.length];
-                for (int i = 0; i < resources.length; i++) {
-                    IResource r = resources[i];
-                    ResourceDescriptor d = new ResourceDescriptor();
-                    //TDB: Should use the label provider and compare performance.
-                    d.label = r.getName();
-                    d.resources.add(r);
-                    descriptors[i] = d;
-                }
-                Arrays.sort(descriptors);
-                descriptorsSize = descriptors.length;
-
-                //Merge the resource descriptor with the same label and type.
-                int index = 0;
-                if (descriptorsSize < 2) {
-					return;
-				}
-                ResourceDescriptor current = descriptors[index];
-                IResource currentResource = (IResource) current.resources
-                        .get(0);
-                for (int i = 1; i < descriptorsSize; i++) {
-                    ResourceDescriptor next = descriptors[i];
-                    IResource nextResource = (IResource) next.resources.get(0);
-                    if (nextResource.getType() == currentResource.getType()
-                            && next.label.equals(current.label)) {
-                        current.resources.add(nextResource);
-                        // If we are merging resources with the same name, into a single descriptor,
-                        // then we must mark the descriptor unsorted so that we will sort the folder
-                        // names.  
-                        // See https://bugs.eclipse.org/bugs/show_bug.cgi?id=76496
-                        current.resourcesSorted = false;
-                    } else {
-                        if (current.resources.size() > 1) {
-                            current.resourcesSorted = false;
-                        }
-                        descriptors[index + 1] = descriptors[i];
-                        index++;
-                        current = descriptors[index];
-                        currentResource = (IResource) current.resources.get(0);
-                    }
-                }
-                descriptorsSize = index + 1;
-            }
-        });
-    }
-
-    /**
-     * Returns true if the label matches the chosen pattern.
-     * 
-     * @param label label to match with the current pattern
-     * @return true if the label matches the chosen pattern. 
-     * 	false otherwise.
-     */
-    private boolean match(String label) {
-        if ((patternString == null)
-                || (patternString.equals("")) || (patternString.equals("*"))) { //$NON-NLS-1$ //$NON-NLS-2$
-			return true;
-		}
-        return stringMatcher.match(label);
-    }
-
-    /**
-     * The user has selected a resource and the dialog is closing.
-     * Set the selected resource as the dialog result.
-     */
-    protected void okPressed() {
-        TableItem items[] = folderNames.getSelection();
-        if (items.length == 1) {
-            ArrayList result = new ArrayList();
-            result.add(items[0].getData());
-            setResult(result);
-        }
-        super.okPressed();
-    }
-
-    /**
-     * Use this method to further filter resources.  As resources are gathered,
-     * if a resource matches the current pattern string, this method will be called.
-     * If this method answers false, the resource will not be included in the list
-     * of matches and the resource's children will NOT be considered for matching.
-     */
-    protected boolean select(IResource resource) {
-        return true;
-    }
-
-    /**
-     * Refreshes the filtered list of resources.
-     * Called when the text in the pattern text entry has changed.
-     * 
-     * @param force if <code>true</code> a refresh is forced, if <code>false</code> a refresh only
-     *   occurs if the pattern has changed
-     * 
-     * @since 3.1
-     */
-    protected void refresh(boolean force) {
-        if (gatherResourcesDynamically) {
-            gatherResources(force);
-        } else {
-            filterResources(force);
-        }
-    }
-
-    /**
-     * A new resource has been selected. Change the contents
-     * of the folder names list.
-     * 
-     * @desc resource descriptor of the selected resource
-     */
-    private void updateFolders(final ResourceDescriptor desc) {
-        BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
-            public void run() {
-                if (!desc.resourcesSorted) {
-                    // sort the folder names
-                    Collections.sort(desc.resources, new Comparator() {
-                        public int compare(Object o1, Object o2) {
-                            String s1 = getParentLabel((IResource) o1);
-                            String s2 = getParentLabel((IResource) o2);
-                            return collator.compare(s1, s2);
-                        }
-                    });
-                    desc.resourcesSorted = true;
-                }
-                folderNames.removeAll();
-                for (int i = 0; i < desc.resources.size(); i++) {
-                    TableItem newItem = new TableItem(folderNames, SWT.NONE);
-                    IResource r = (IResource) desc.resources.get(i);
-                    newItem.setText(getParentLabel(r));
-                    newItem.setImage(getParentImage(r));
-                    newItem.setData(r);
-                }
-                folderNames.setSelection(0);
-            }
-        });
-    }
-
-    /**
-     * Update the specified item with the new info from the resource 
-     * descriptor.
-     * Create a new table item if there is no item. 
-     * 
-     * @param index index of the resource descriptor
-     * @param itemPos position of the existing item to update
-     * @param itemCount number of items in the resources table widget
-     */
-    private void updateItem(int index, int itemPos, int itemCount) {
-        ResourceDescriptor desc = descriptors[index];
-        TableItem item;
-        if (itemPos < itemCount) {
-            item = resourceNames.getItem(itemPos);
-            if (item.getData() != desc) {
-                item.setText(desc.label);
-                item.setData(desc);
-                item.setImage(getImage(desc));
-                if (itemPos == 0) {
-                    resourceNames.setSelection(0);
-                    updateFolders(desc);
-                }
-            }
-        } else {
-            item = new TableItem(resourceNames, SWT.NONE);
-            item.setText(desc.label);
-            item.setData(desc);
-            item.setImage(getImage(desc));
-            if (itemPos == 0) {
-                resourceNames.setSelection(0);
-                updateFolders(desc);
-            }
-        }
-        updateOKState(true);
-    }
-    
-    /**
-     * Update the enabled state of the OK button.  To be called when
-     * the resource list is updated.
-     * @param state the new enabled state of the button
-     */
-    protected void updateOKState(boolean state) {
-    	Button okButton = getButton(IDialogConstants.OK_ID);
-    	if(okButton != null && !okButton.isDisposed() && state != okEnabled) {
-    		okButton.setEnabled(state);
-    		okEnabled = state;
-    	}
-    }
-    
-	
-	/* (non-Javadoc)
-     * @see org.eclipse.jface.window.Dialog#getDialogBoundsSettings()
-     * 
-     * @since 3.2
-     */
-	protected IDialogSettings getDialogBoundsSettings() {
-        IDialogSettings settings = IDEWorkbenchPlugin.getDefault().getDialogSettings();
-        IDialogSettings section = settings.getSection(DIALOG_SETTINGS_SECTION);
-        if (section == null) {
-            section = settings.addNewSection(DIALOG_SETTINGS_SECTION);
-        } 
-        return section;
-	}
-}
-    
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ResourceSelectionDialog.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ResourceSelectionDialog.java
deleted file mode 100644
index f593c3e..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/ResourceSelectionDialog.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.misc.CheckboxTreeAndListGroup;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * A standard resource selection dialog which solicits a list of resources from
- * the user. The <code>getResult</code> method returns the selected resources.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * <p>
- * Example:
- * <pre>
- * 	ResourceSelectionDialog dialog =
- *		new ResourceSelectionDialog(getShell(), rootResource, msg);
- *	dialog.setInitialSelections(selectedResources);
- *	dialog.open();
- *	return dialog.getResult();
- * </pre>
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ResourceSelectionDialog extends SelectionDialog {
-    // the root element to populate the viewer with
-    private IAdaptable root;
-
-    // the visual selection widget group
-    private CheckboxTreeAndListGroup selectionGroup;
-
-    // constants
-    private final static int SIZING_SELECTION_WIDGET_WIDTH = 400;
-
-    private final static int SIZING_SELECTION_WIDGET_HEIGHT = 300;
-
-    /**
-     * Creates a resource selection dialog rooted at the given element.
-     *
-     * @param parentShell the parent shell
-     * @param rootElement the root element to populate this dialog with
-     * @param message the message to be displayed at the top of this dialog, or
-     *    <code>null</code> to display a default message
-     */
-    public ResourceSelectionDialog(Shell parentShell, IAdaptable rootElement,
-            String message) {
-        super(parentShell);
-        setTitle(IDEWorkbenchMessages.ResourceSelectionDialog_title);
-        root = rootElement;
-        if (message != null) {
-			setMessage(message);
-		} else {
-			setMessage(IDEWorkbenchMessages.ResourceSelectionDialog_message);
-		}
-    }
-
-    /**
-     * Visually checks the previously-specified elements in the container (left)
-     * portion of this dialog's resource selection viewer.
-     */
-    private void checkInitialSelections() {
-        Iterator itemsToCheck = getInitialElementSelections().iterator();
-
-        while (itemsToCheck.hasNext()) {
-            IResource currentElement = (IResource) itemsToCheck.next();
-
-            if (currentElement.getType() == IResource.FILE) {
-				selectionGroup.initialCheckListItem(currentElement);
-			} else {
-				selectionGroup.initialCheckTreeItem(currentElement);
-			}
-        }
-    }
-
-
-    /**
-     * @param event the event
-     */
-    public void checkStateChanged(CheckStateChangedEvent event) {
-        getOkButton().setEnabled(selectionGroup.getCheckedElementCount() > 0);
-    }
-
-    /* (non-Javadoc)
-     * Method declared in Window.
-     */
-    protected void configureShell(Shell shell) {
-        super.configureShell(shell);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
-				IIDEHelpContextIds.RESOURCE_SELECTION_DIALOG);
-    }
-
-    public void create() {
-        super.create();
-        initializeDialog();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Dialog.
-     */
-    protected Control createDialogArea(Composite parent) {
-        // page group
-        Composite composite = (Composite) super.createDialogArea(parent);
-
-        //create the input element, which has the root resource
-        //as its only child
-        ArrayList input = new ArrayList();
-        input.add(root);
-
-        createMessageArea(composite);
-        selectionGroup = new CheckboxTreeAndListGroup(composite, input,
-                getResourceProvider(IResource.FOLDER | IResource.PROJECT
-                        | IResource.ROOT), WorkbenchLabelProvider
-                        .getDecoratingWorkbenchLabelProvider(),
-                getResourceProvider(IResource.FILE), WorkbenchLabelProvider
-                        .getDecoratingWorkbenchLabelProvider(), SWT.NONE,
-                // since this page has no other significantly-sized
-                // widgets we need to hardcode the combined widget's
-                // size, otherwise it will open too small
-                SIZING_SELECTION_WIDGET_WIDTH, SIZING_SELECTION_WIDGET_HEIGHT);
-
-        composite.addControlListener(new ControlListener() {
-            public void controlMoved(ControlEvent e) {
-            }
-
-            public void controlResized(ControlEvent e) {
-                //Also try and reset the size of the columns as appropriate
-                TableColumn[] columns = selectionGroup.getListTable()
-                        .getColumns();
-                for (int i = 0; i < columns.length; i++) {
-                    columns[i].pack();
-                }
-            }
-        });
-
-        return composite;
-    }
-
-    /**
-     * Returns a content provider for <code>IResource</code>s that returns 
-     * only children of the given resource type.
-     */
-    private ITreeContentProvider getResourceProvider(final int resourceType) {
-        return new WorkbenchContentProvider() {
-            public Object[] getChildren(Object o) {
-                if (o instanceof IContainer) {
-                    IResource[] members = null;
-                    try {
-                        members = ((IContainer) o).members();
-                    } catch (CoreException e) {
-                        //just return an empty set of children
-                        return new Object[0];
-                    }
-
-                    //filter out the desired resource types
-                    ArrayList results = new ArrayList();
-                    for (int i = 0; i < members.length; i++) {
-                        //And the test bits with the resource types to see if they are what we want
-                        if ((members[i].getType() & resourceType) > 0) {
-                            results.add(members[i]);
-                        }
-                    }
-                    return results.toArray();
-                }
-                //input element case
-                if (o instanceof ArrayList) {
-                    return ((ArrayList) o).toArray();
-                } 
-                return new Object[0];
-            }
-        };
-    }
-
-    /**
-     * Initializes this dialog's controls.
-     */
-    private void initializeDialog() {
-        selectionGroup.addCheckStateListener(new ICheckStateListener() {
-            public void checkStateChanged(CheckStateChangedEvent event) {
-                getOkButton().setEnabled(
-                        selectionGroup.getCheckedElementCount() > 0);
-            }
-        });
-
-        if (getInitialElementSelections().isEmpty()) {
-			getOkButton().setEnabled(false);
-		} else {
-			checkInitialSelections();
-		}
-    }
-
-    /**
-     * The <code>ResourceSelectionDialog</code> implementation of this 
-     * <code>Dialog</code> method builds a list of the selected resources for later 
-     * retrieval by the client and closes this dialog.
-     */
-    protected void okPressed() {
-        Iterator resultEnum = selectionGroup.getAllCheckedListItems();
-        ArrayList list = new ArrayList();
-        while (resultEnum.hasNext()) {
-			list.add(resultEnum.next());
-		}
-        setResult(list);
-        super.okPressed();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/SaveAsDialog.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/SaveAsDialog.java
deleted file mode 100644
index 37ec845..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/SaveAsDialog.java
+++ /dev/null
@@ -1,342 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    IBM Corporation - initial API and implementation 
- *    Bob Foster <bob@objfac.com>
- *     - Fix for bug 23025 - SaveAsDialog should not assume what is being saved is an IFile
- *    Benjamin Muskalla <b.muskalla@gmx.net>
- *     - Fix for bug 82541 - [Dialogs] SaveAsDialog should better handle closed projects
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.osgi.util.NLS;
-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.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.misc.ResourceAndContainerGroup;
-
-/**
- * A standard "Save As" dialog which solicits a path from the user. The
- * <code>getResult</code> method returns the path. Note that the folder
- * at the specified path might not exist and might need to be created.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- *
- * @see org.eclipse.ui.dialogs.ContainerGenerator
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class SaveAsDialog extends TitleAreaDialog {
-	
-	private static final String DIALOG_SETTINGS_SECTION = "SaveAsDialogSettings"; //$NON-NLS-1$
-	
-	private IFile originalFile = null;
-
-    private String originalName = null;
-
-    private IPath result;
-
-    // widgets
-    private ResourceAndContainerGroup resourceGroup;
-
-    private Button okButton;
-
-    /**
-     * Image for title area
-     */
-    private Image dlgTitleImage = null;
-
-    /**
-     * Creates a new Save As dialog for no specific file.
-     *
-     * @param parentShell the parent shell
-     */
-    public SaveAsDialog(Shell parentShell) {
-        super(parentShell);
-    }
-
-    /* (non-Javadoc)
-     * Method declared in Window.
-     */
-    protected void configureShell(Shell shell) {
-        super.configureShell(shell);
-        shell.setText(IDEWorkbenchMessages.SaveAsDialog_text);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
-				IIDEHelpContextIds.SAVE_AS_DIALOG);
-    }
-
-    /* (non-Javadoc)
-     * Method declared in Window.
-     */
-    protected Control createContents(Composite parent) {
-
-        Control contents = super.createContents(parent);
-
-        initializeControls();
-        validatePage();
-        resourceGroup.setFocus();
-        setTitle(IDEWorkbenchMessages.SaveAsDialog_title);
-        dlgTitleImage = IDEInternalWorkbenchImages.getImageDescriptor(
-                IDEInternalWorkbenchImages.IMG_DLGBAN_SAVEAS_DLG).createImage();
-        setTitleImage(dlgTitleImage);
-        setMessage(IDEWorkbenchMessages.SaveAsDialog_message);
-
-        return contents;
-    }
-
-    /** 
-     * The <code>SaveAsDialog</code> implementation of this <code>Window</code>
-     * method disposes of the banner image when the dialog is closed.
-     */
-    public boolean close() {
-        if (dlgTitleImage != null) {
-			dlgTitleImage.dispose();
-		}
-        return super.close();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Dialog.
-     */
-    protected void createButtonsForButtonBar(Composite parent) {
-        okButton = createButton(parent, IDialogConstants.OK_ID,
-                IDialogConstants.OK_LABEL, true);
-        createButton(parent, IDialogConstants.CANCEL_ID,
-                IDialogConstants.CANCEL_LABEL, false);
-    }
-
-    /* (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);
-        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));
-        composite.setFont(parentComposite.getFont());
-
-        Listener listener = new Listener() {
-            public void handleEvent(Event event) {
-                setDialogComplete(validatePage());
-            }
-        };
-
-        resourceGroup = new ResourceAndContainerGroup(
-                composite,
-                listener,
-                IDEWorkbenchMessages.SaveAsDialog_fileLabel, IDEWorkbenchMessages.SaveAsDialog_file);
-        resourceGroup.setAllowExistingResources(true);
-
-        return parentComposite;
-    }
-
-    /**
-     * Returns the full path entered by the user.
-     * <p>
-     * Note that the file and container might not exist and would need to be created.
-     * See the <code>IFile.create</code> method and the 
-     * <code>ContainerGenerator</code> class.
-     * </p>
-     *
-     * @return the path, or <code>null</code> if Cancel was pressed
-     */
-    public IPath getResult() {
-        return result;
-    }
-
-    /**
-     * Initializes the controls of this dialog.
-     */
-    private void initializeControls() {
-        if (originalFile != null) {
-            resourceGroup.setContainerFullPath(originalFile.getParent()
-                    .getFullPath());
-            resourceGroup.setResource(originalFile.getName());
-        } else if (originalName != null) {
-			resourceGroup.setResource(originalName);
-		}
-        setDialogComplete(validatePage());
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Dialog.
-     */
-    protected void okPressed() {
-        // Get new path.
-        IPath path = resourceGroup.getContainerFullPath().append(
-                resourceGroup.getResource());
-
-        //If the user does not supply a file extension and if the save 
-        //as dialog was provided a default file name append the extension 
-        //of the default filename to the new name
-        if (path.getFileExtension() == null) {
-            if (originalFile != null && originalFile.getFileExtension() != null) {
-				path = path.addFileExtension(originalFile.getFileExtension());
-			} else if (originalName != null) {
-                int pos = originalName.lastIndexOf('.');
-                if (++pos > 0 && pos < originalName.length()) {
-					path = path.addFileExtension(originalName.substring(pos));
-				}
-            }
-        }
-
-        // If the path already exists then confirm overwrite.
-        IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
-        if (file.exists()) {
-            String[] buttons = new String[] { IDialogConstants.YES_LABEL,
-                    IDialogConstants.NO_LABEL, IDialogConstants.CANCEL_LABEL };
-            String question = NLS.bind(
-					IDEWorkbenchMessages.SaveAsDialog_overwriteQuestion, path
-							.toString());
-			MessageDialog d = new MessageDialog(getShell(),
-                    IDEWorkbenchMessages.Question,
-                    null, question, MessageDialog.QUESTION, buttons, 0);
-            int overwrite = d.open();
-            switch (overwrite) {
-            case 0: // Yes
-                break;
-            case 1: // No
-                return;
-            case 2: // Cancel
-            default:
-                cancelPressed();
-                return;
-            }
-        }
-
-        // Store path and close.
-        result = path;
-        close();
-    }
-
-    /**
-     * Sets the completion state of this dialog and adjusts the enable state of
-     * the Ok button accordingly.
-     *
-     * @param value <code>true</code> if this dialog is compelete, and
-     *  <code>false</code> otherwise
-     */
-    protected void setDialogComplete(boolean value) {
-        okButton.setEnabled(value);
-    }
-
-    /**
-     * Sets the original file to use.
-     *
-     * @param originalFile the original file
-     */
-    public void setOriginalFile(IFile originalFile) {
-        this.originalFile = originalFile;
-    }
-
-    /**
-     * Set the original file name to use.
-     * Used instead of <code>setOriginalFile</code>
-     * when the original resource is not an IFile.
-     * Must be called before <code>create</code>.
-     * @param originalName default file name
-     */
-    public void setOriginalName(String originalName) {
-        this.originalName = originalName;
-    }
-
-    /**
-     * Returns whether this page's visual components all contain valid values.
-     *
-     * @return <code>true</code> if valid, and <code>false</code> otherwise
-     */
-    private boolean validatePage() {
-        if (!resourceGroup.areAllValuesValid()) {
-            if (!resourceGroup.getResource().equals("")) { //$NON-NLS-1$
-				setErrorMessage(resourceGroup.getProblemMessage());
-			} else {
-            	setErrorMessage(null);
-            }
-            return false;
-        }
-        
-        String resourceName = resourceGroup.getResource();
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        
-        // Do not allow a closed project to be selected
-        IPath fullPath = resourceGroup.getContainerFullPath();
-        if (fullPath != null) {
-        	String projectName = fullPath.segment(0);
-	        IStatus isValidProjectName = workspace.validateName(projectName, IResource.PROJECT);
-	        if(isValidProjectName.isOK()) {
-	        	IProject project = workspace.getRoot().getProject(projectName);
-	        	if(!project.isOpen()) {
-	        		setErrorMessage(IDEWorkbenchMessages.SaveAsDialog_closedProjectMessage);
-	        		return false;
-	        	}
-	        }
-        }
-        
-        IStatus result = workspace.validateName(resourceName, IResource.FILE);
-        if (!result.isOK()){
-        	setErrorMessage(result.getMessage());
-        	return false;
-        }
-        
-        setErrorMessage(null);
-        return true;
-    }
-    
-	/* (non-Javadoc)
-     * @see org.eclipse.jface.window.Dialog#getDialogBoundsSettings()
-     * 
-     * @since 3.2
-     */
-	protected IDialogSettings getDialogBoundsSettings() {
-        IDialogSettings settings = IDEWorkbenchPlugin.getDefault().getDialogSettings();
-        IDialogSettings section = settings.getSection(DIALOG_SETTINGS_SECTION);
-        if (section == null) {
-            section = settings.addNewSection(DIALOG_SETTINGS_SECTION);
-        } 
-        return section;
-	}
-	
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#isResizable()
-     */
-    protected boolean isResizable() {
-    	return true;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardDataTransferPage.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardDataTransferPage.java
deleted file mode 100644
index c3f0ac5..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardDataTransferPage.java
+++ /dev/null
@@ -1,439 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.osgi.util.NLS;
-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.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-
-/**
- * The common superclass for wizard import and export pages.
- * <p>
- * This class is not intended to be subclassed outside of the workbench.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public abstract class WizardDataTransferPage extends WizardPage implements
-        Listener, IOverwriteQuery {
-
-    // constants
-    protected static final int SIZING_TEXT_FIELD_WIDTH = 250;
-
-    protected static final int COMBO_HISTORY_LENGTH = 5;
-
-    /**
-     * Creates a new wizard page.
-     *
-     * @param pageName the name of the page
-     */
-    protected WizardDataTransferPage(String pageName) {
-        super(pageName);
-    }
-
-    /**
-     * Adds an entry to a history, while taking care of duplicate history items
-     * and excessively long histories.  The assumption is made that all histories
-     * should be of length <code>WizardDataTransferPage.COMBO_HISTORY_LENGTH</code>.
-     *
-     * @param history the current history
-     * @param newEntry the entry to add to the history
-     */
-    protected String[] addToHistory(String[] history, String newEntry) {
-        java.util.ArrayList l = new java.util.ArrayList(Arrays.asList(history));
-        addToHistory(l, newEntry);
-        String[] r = new String[l.size()];
-        l.toArray(r);
-        return r;
-    }
-
-    /**
-     * Adds an entry to a history, while taking care of duplicate history items
-     * and excessively long histories.  The assumption is made that all histories
-     * should be of length <code>WizardDataTransferPage.COMBO_HISTORY_LENGTH</code>.
-     *
-     * @param history the current history
-     * @param newEntry the entry to add to the history
-     */
-    protected void addToHistory(List history, String newEntry) {
-        history.remove(newEntry);
-        history.add(0, newEntry);
-
-        // since only one new item was added, we can be over the limit
-        // by at most one item
-        if (history.size() > COMBO_HISTORY_LENGTH) {
-			history.remove(COMBO_HISTORY_LENGTH);
-		}
-    }
-
-    /**
-     * Return whether the user is allowed to enter a new container name or just
-     * choose from existing ones.
-     * <p>
-     * Subclasses must implement this method.
-     * </p>
-     *
-     * @return <code>true</code> if new ones are okay, and <code>false</code>
-     *  if only existing ones are allowed
-     */
-    protected abstract boolean allowNewContainerName();
-
-    /**
-     * Creates a new label with a bold font.
-     *
-     * @param parent the parent control
-     * @param text the label text
-     * @return the new label control
-     */
-    protected Label createBoldLabel(Composite parent, String text) {
-        Label label = new Label(parent, SWT.NONE);
-        label.setFont(JFaceResources.getBannerFont());
-        label.setText(text);
-        GridData data = new GridData();
-        data.verticalAlignment = GridData.FILL;
-        data.horizontalAlignment = GridData.FILL;
-        label.setLayoutData(data);
-        return label;
-    }
-
-    /**
-     * Creates the import/export options group controls.
-     * <p>
-     * The <code>WizardDataTransferPage</code> implementation of this method does
-     * nothing. Subclasses wishing to define such components should reimplement
-     * this hook method.
-     * </p>
-     *
-     * @param optionsGroup the parent control
-     */
-    protected void createOptionsGroupButtons(Group optionsGroup) {
-    }
-
-    /**
-     * Creates a new label with a bold font.
-     *
-     * @param parent the parent control
-     * @param text the label text
-     * @return the new label control
-     */
-    protected Label createPlainLabel(Composite parent, String text) {
-        Label label = new Label(parent, SWT.NONE);
-        label.setText(text);
-        label.setFont(parent.getFont());
-        GridData data = new GridData();
-        data.verticalAlignment = GridData.FILL;
-        data.horizontalAlignment = GridData.FILL;
-        label.setLayoutData(data);
-        return label;
-    }
-
-    /**
-     * Creates a horizontal spacer line that fills the width of its container.
-     *
-     * @param parent the parent control
-     */
-    protected void createSpacer(Composite parent) {
-        Label spacer = new Label(parent, SWT.NONE);
-        GridData data = new GridData();
-        data.horizontalAlignment = GridData.FILL;
-        data.verticalAlignment = GridData.BEGINNING;
-        spacer.setLayoutData(data);
-    }
-
-    /**
-     * Returns whether this page is complete. This determination is made based upon
-     * the current contents of this page's controls.  Subclasses wishing to include
-     * their controls in this determination should override the hook methods 
-     * <code>validateSourceGroup</code> and/or <code>validateOptionsGroup</code>.
-     *
-     * @return <code>true</code> if this page is complete, and <code>false</code> if
-     *   incomplete
-     * @see #validateSourceGroup
-     * @see #validateOptionsGroup
-     */
-    protected boolean determinePageCompletion() {
-        boolean complete = validateSourceGroup() && validateDestinationGroup()
-                && validateOptionsGroup();
-
-        // Avoid draw flicker by not clearing the error
-        // message unless all is valid.
-        if (complete) {
-			setErrorMessage(null);
-		}
-
-        return complete;
-    }
-
-    /**
-     * Get a path from the supplied text widget.
-     * @return org.eclipse.core.runtime.IPath
-     */
-    protected IPath getPathFromText(Text textField) {
-        String text = textField.getText();
-        //Do not make an empty path absolute so as not to confuse with the root
-        if (text.length() == 0) {
-			return new Path(text);
-		}
-       
-        return (new Path(text)).makeAbsolute();
-    }
-
-    /**
-     * Queries the user to supply a container resource.
-     *
-     * @return the path to an existing or new container, or <code>null</code> if the
-     *    user cancelled the dialog
-     */
-    protected IPath queryForContainer(IContainer initialSelection, String msg) {
-        return queryForContainer(initialSelection, msg, null);
-    }
-
-    /**
-     * Queries the user to supply a container resource.
-     *
-     * @return the path to an existing or new container, or <code>null</code> if the
-     *    user cancelled the dialog
-     */
-    protected IPath queryForContainer(IContainer initialSelection, String msg,
-            String title) {
-        ContainerSelectionDialog dialog = new ContainerSelectionDialog(
-                getControl().getShell(), initialSelection,
-                allowNewContainerName(), msg);
-        if (title != null) {
-			dialog.setTitle(title);
-		}
-        dialog.showClosedProjects(false);
-        dialog.open();
-        Object[] result = dialog.getResult();
-        if (result != null && result.length == 1) {
-            return (IPath) result[0];
-        }
-        return null;
-    }
-
-    /**
-     * The <code>WizardDataTransfer</code> implementation of this 
-     * <code>IOverwriteQuery</code> method asks the user whether the existing 
-     * resource at the given path should be overwritten.
-     *
-     * @param pathString 
-     * @return the user's reply: one of <code>"YES"</code>, <code>"NO"</code>, <code>"ALL"</code>, 
-     *   or <code>"CANCEL"</code>
-     */
-    public String queryOverwrite(String pathString) {
-
-        Path path = new Path(pathString);
-
-        String messageString;
-        //Break the message up if there is a file name and a directory
-        //and there are at least 2 segments.
-        if (path.getFileExtension() == null || path.segmentCount() < 2) {
-			messageString = NLS.bind(IDEWorkbenchMessages.WizardDataTransfer_existsQuestion, pathString);
-		} else {
-			messageString = NLS.bind(IDEWorkbenchMessages.WizardDataTransfer_overwriteNameAndPathQuestion, path.lastSegment(),
-			path.removeLastSegments(1).toOSString());
-		}
-
-        final MessageDialog dialog = new MessageDialog(getContainer()
-                .getShell(), IDEWorkbenchMessages.Question,
-                null, messageString, MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.YES_LABEL,
-                        IDialogConstants.YES_TO_ALL_LABEL,
-                        IDialogConstants.NO_LABEL,
-                        IDialogConstants.NO_TO_ALL_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        String[] response = new String[] { YES, ALL, NO, NO_ALL, CANCEL };
-        //run in syncExec because callback is from an operation,
-        //which is probably not running in the UI thread.
-        getControl().getDisplay().syncExec(new Runnable() {
-            public void run() {
-                dialog.open();
-            }
-        });
-        return dialog.getReturnCode() < 0 ? CANCEL : response[dialog
-                .getReturnCode()];
-    }
-
-    /**
-     * Displays a Yes/No question to the user with the specified message and returns
-     * the user's response.
-     *
-     * @param message the question to ask
-     * @return <code>true</code> for Yes, and <code>false</code> for No
-     */
-    protected boolean queryYesNoQuestion(String message) {
-        MessageDialog dialog = new MessageDialog(getContainer().getShell(),
-                IDEWorkbenchMessages.Question,
-                (Image) null, message, MessageDialog.NONE,
-                new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.NO_LABEL }, 0);
-        // ensure yes is the default
-
-        return dialog.open() == 0;
-    }
-
-    /**
-     * Restores control settings that were saved in the previous instance of this
-     * page.  
-     * <p>
-     * The <code>WizardDataTransferPage</code> implementation of this method does
-     * nothing. Subclasses may override this hook method.
-     * </p>
-     */
-    protected void restoreWidgetValues() {
-    }
-
-    /**
-     * Saves control settings that are to be restored in the next instance of
-     * this page.  
-     * <p>
-     * The <code>WizardDataTransferPage</code> implementation of this method does
-     * nothing. Subclasses may override this hook method.
-     * </p>
-     */
-    protected void saveWidgetValues() {
-    }
-
-    /**
-     * Determine if the page is complete and update the page appropriately. 
-     */
-    protected void updatePageCompletion() {
-        boolean pageComplete = determinePageCompletion();
-        setPageComplete(pageComplete);
-        if (pageComplete) {
-            setErrorMessage(null);
-        }
-    }
-
-    /**
-     * Updates the enable state of this page's controls.
-     * <p>
-     * The <code>WizardDataTransferPage</code> implementation of this method does
-     * nothing. Subclasses may extend this hook method.
-     * </p>
-     */
-    protected void updateWidgetEnablements() {
-    }
-
-    /**
-     * Returns whether this page's destination specification controls currently all
-     * contain valid values.
-     * <p>
-     * The <code>WizardDataTransferPage</code> implementation of this method returns
-     * <code>true</code>. Subclasses may reimplement this hook method.
-     * </p>
-     *
-     * @return <code>true</code> indicating validity of all controls in the 
-     *   destination specification group
-     */
-    protected boolean validateDestinationGroup() {
-        return true;
-    }
-
-    /**
-     * Returns whether this page's options group's controls currently all contain
-     * valid values.
-     * <p>
-     * The <code>WizardDataTransferPage</code> implementation of this method returns
-     * <code>true</code>. Subclasses may reimplement this hook method.
-     * </p>
-     *
-     * @return <code>true</code> indicating validity of all controls in the options
-     *   group
-     */
-    protected boolean validateOptionsGroup() {
-        return true;
-    }
-
-    /**
-     * Returns whether this page's source specification controls currently all
-     * contain valid values.
-     * <p>
-     * The <code>WizardDataTransferPage</code> implementation of this method returns
-     * <code>true</code>. Subclasses may reimplement this hook method.
-     * </p>
-     *
-     * @return <code>true</code> indicating validity of all controls in the 
-     *   source specification group
-     */
-    protected boolean validateSourceGroup() {
-        return true;
-    }
-
-    /**
-     *	Create the options specification widgets.
-     *
-     *	@param parent org.eclipse.swt.widgets.Composite
-     */
-    protected void createOptionsGroup(Composite parent) {
-        // options group
-        Group optionsGroup = new Group(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        optionsGroup.setLayout(layout);
-        optionsGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
-                | GridData.GRAB_HORIZONTAL));
-        optionsGroup.setText(IDEWorkbenchMessages.WizardExportPage_options);
-        optionsGroup.setFont(parent.getFont());
-
-        createOptionsGroupButtons(optionsGroup);
-
-    }
-
-    /**
-     * Display an error dialog with the specified message.
-     *
-     * @param message the error message
-     */
-    protected void displayErrorDialog(String message) {
-        MessageDialog.openError(getContainer().getShell(),
-                getErrorDialogTitle(), message);
-    }
-
-    /**
-     * Display an error dislog with the information from the
-     * supplied exception.
-     * @param exception Throwable
-     */
-    protected void displayErrorDialog(Throwable exception) {
-        String message = exception.getMessage();
-        //Some system exceptions have no message
-        if (message == null) {
-			message = NLS.bind(IDEWorkbenchMessages.WizardDataTransfer_exceptionMessage, exception);
-		}
-        displayErrorDialog(message);
-    }
-
-    /**
-     * Get the title for an error dialog. Subclasses should
-     * override.
-     */
-    protected String getErrorDialogTitle() {
-        return IDEWorkbenchMessages.WizardExportPage_internalErrorTitle;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardExportPage.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardExportPage.java
deleted file mode 100644
index 1787a12..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardExportPage.java
+++ /dev/null
@@ -1,955 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-import java.util.Vector;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.IFileEditorMapping;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * Abstract superclass for a typical export wizard's main page.
- * <p>
- * Clients may subclass this page to inherit its common destination resource
- * selection facilities.
- * </p>
- * <p>
- * Subclasses must implement 
- * <ul>
- *   <li><code>createDestinationGroup</code></li>
- * </ul>
- * </p>
- * <p>
- * Subclasses may override
- * <ul>
- *   <li><code>allowNewContainerName</code></li>
- * </ul>
- * </p>
- * <p>
- * Subclasses may extend
- * <ul>
- *   <li><code>handleEvent</code></li>
- *   <li><code>internalSaveWidgetValues</code></li>
- *   <li><code>updateWidgetEnablements</code></li>
- * </ul>
- * </p>
- * @deprecated use WizardExportResourcePage
- */
-public abstract class WizardExportPage extends WizardDataTransferPage {
-    private IStructuredSelection currentResourceSelection;
-
-    private List selectedResources;
-
-    private List selectedTypes;
-
-    private boolean exportCurrentSelection = false;
-
-    private boolean exportAllResourcesPreSet = false;
-
-    // widgets
-    private Combo typesToExportField;
-
-    private Button typesToExportEditButton;
-
-    private Button exportAllTypesRadio;
-
-    private Button exportSpecifiedTypesRadio;
-
-    private Button resourceDetailsButton;
-
-    private Label resourceDetailsDescription;
-
-    private Text resourceNameField;
-
-    private Button resourceBrowseButton;
-
-    // initial value stores
-    private boolean initialExportAllTypesValue = true;
-
-    private String initialExportFieldValue;
-
-    private String initialTypesFieldValue;
-
-    // constants
-    private static final String CURRENT_SELECTION = "<current selection>";//$NON-NLS-1$
-
-    private static final String TYPE_DELIMITER = ",";//$NON-NLS-1$
-
-    // dialog store id constants
-    private static final String STORE_SELECTED_TYPES_ID = "WizardFileSystemExportPage1.STORE_SELECTED_TYPES_ID.";//$NON-NLS-1$
-
-    private static final String STORE_EXPORT_ALL_RESOURCES_ID = "WizardFileSystemExportPage1.STORE_EXPORT_ALL_RESOURCES_ID.";//$NON-NLS-1$
-
-    /**
-     * Creates an export wizard page. If the current resource selection 
-     * is not empty then it will be used as the initial collection of resources
-     * selected for export.
-     *
-     * @param pageName the name of the page
-     * @param selection the current resource selection
-     */
-    protected WizardExportPage(String pageName, IStructuredSelection selection) {
-        super(pageName);
-        this.currentResourceSelection = selection;
-    }
-
-    /**
-     * The <code>WizardExportPage</code> implementation of this 
-     * <code>WizardDataTransferPage</code> method returns <code>false</code>. 
-     * Subclasses may override this method.
-     */
-    protected boolean allowNewContainerName() {
-        return false;
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IDialogPage.
-     */
-    public void createControl(Composite parent) {
-        Composite composite = new Composite(parent, SWT.NULL);
-        composite.setLayout(new GridLayout());
-        composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
-                | GridData.HORIZONTAL_ALIGN_FILL));
-
-        createBoldLabel(composite, IDEWorkbenchMessages.WizardExportPage_whatLabel);
-        createSourceGroup(composite);
-
-        createSpacer(composite);
-
-        createBoldLabel(composite, IDEWorkbenchMessages.WizardExportPage_whereLabel);
-        createDestinationGroup(composite);
-
-        createSpacer(composite);
-
-        createBoldLabel(composite, IDEWorkbenchMessages.WizardExportPage_options);
-        createOptionsGroup(composite);
-
-        restoreResourceSpecificationWidgetValues(); // ie.- local
-        restoreWidgetValues(); // ie.- subclass hook
-        if (currentResourceSelection != null) {
-			setupBasedOnInitialSelections();
-		}
-
-        updateWidgetEnablements();
-        setPageComplete(determinePageCompletion());
-
-        setControl(composite);
-    }
-
-    /**
-     * Creates the export destination specification visual components.
-     * <p>
-     * Subclasses must implement this method.
-     * </p>
-     *
-     * @param parent the parent control
-     */
-    protected abstract void createDestinationGroup(Composite parent);
-
-    /**
-     * Creates the export source resource specification controls.
-     *
-     * @param parent the parent control
-     */
-    protected final void createSourceGroup(Composite parent) {
-        // top level group
-        Composite sourceGroup = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 3;
-        sourceGroup.setLayout(layout);
-        sourceGroup.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
-                | GridData.HORIZONTAL_ALIGN_FILL));
-
-        // resource label
-        new Label(sourceGroup, SWT.NONE).setText(IDEWorkbenchMessages.WizardExportPage_folder);
-
-        // resource name entry field
-        resourceNameField = new Text(sourceGroup, SWT.SINGLE | SWT.BORDER);
-        resourceNameField.addListener(SWT.KeyDown, this);
-        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-                | GridData.GRAB_HORIZONTAL);
-        data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-        resourceNameField.setLayoutData(data);
-
-        // resource browse button
-        resourceBrowseButton = new Button(sourceGroup, SWT.PUSH);
-        resourceBrowseButton.setText(IDEWorkbenchMessages.WizardExportPage_browse);
-        resourceBrowseButton.addListener(SWT.Selection, this);
-        resourceBrowseButton.setLayoutData(new GridData(
-                GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
-
-        // export all types radio	
-        exportAllTypesRadio = new Button(sourceGroup, SWT.RADIO);
-        exportAllTypesRadio.setText(IDEWorkbenchMessages.WizardExportPage_allTypes);
-        exportAllTypesRadio.addListener(SWT.Selection, this);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-                | GridData.GRAB_HORIZONTAL);
-        data.horizontalSpan = 3;
-        exportAllTypesRadio.setLayoutData(data);
-
-        // export specific types radio
-        exportSpecifiedTypesRadio = new Button(sourceGroup, SWT.RADIO);
-        exportSpecifiedTypesRadio.setText(IDEWorkbenchMessages.WizardExportPage_specificTypes);
-        exportSpecifiedTypesRadio.addListener(SWT.Selection, this);
-
-        // types combo
-        typesToExportField = new Combo(sourceGroup, SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-                | GridData.GRAB_HORIZONTAL);
-        data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-        typesToExportField.setLayoutData(data);
-        typesToExportField.addListener(SWT.Modify, this);
-
-        // types edit button
-        typesToExportEditButton = new Button(sourceGroup, SWT.PUSH);
-        typesToExportEditButton.setText(IDEWorkbenchMessages.WizardExportPage_edit);
-        typesToExportEditButton.setLayoutData(new GridData(
-                GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL
-                        | GridData.VERTICAL_ALIGN_END));
-        typesToExportEditButton.addListener(SWT.Selection, this);
-
-        // details button
-        resourceDetailsButton = new Button(sourceGroup, SWT.PUSH);
-        resourceDetailsButton.setText(IDEWorkbenchMessages.WizardExportPage_details);
-        resourceDetailsButton.addListener(SWT.Selection, this);
-
-        // details label
-        resourceDetailsDescription = new Label(sourceGroup, SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-                | GridData.GRAB_HORIZONTAL);
-        data.horizontalSpan = 2;
-        resourceDetailsDescription.setLayoutData(data);
-
-        // initial setup
-        resetSelectedResources();
-        exportAllTypesRadio.setSelection(initialExportAllTypesValue);
-        exportSpecifiedTypesRadio.setSelection(!initialExportAllTypesValue);
-        typesToExportField.setEnabled(!initialExportAllTypesValue);
-        typesToExportEditButton.setEnabled(!initialExportAllTypesValue);
-
-        if (initialExportFieldValue != null) {
-			resourceNameField.setText(initialExportFieldValue);
-		}
-        if (initialTypesFieldValue != null) {
-			typesToExportField.setText(initialTypesFieldValue);
-		}
-    }
-
-    /**
-     * Display an error dialog with the specified message.
-     *
-     * @param message the error message
-     */
-    protected void displayErrorDialog(String message) {
-        MessageDialog.openError(getContainer().getShell(), IDEWorkbenchMessages.WizardExportPage_errorDialogTitle, message);
-    }
-
-    /**
-     * Displays a description message that indicates a selection of resources
-     * of the specified size.
-     *
-     * @param selectedResourceCount the resource selection size to display
-     */
-    protected void displayResourcesSelectedCount(int selectedResourceCount) {
-        if (selectedResourceCount == 1) {
-			resourceDetailsDescription.setText(IDEWorkbenchMessages.WizardExportPage_oneResourceSelected);
-		} else {
-			resourceDetailsDescription
-                    .setText(NLS.bind(IDEWorkbenchMessages.WizardExportPage_resourceCountMessage, new Integer(selectedResourceCount)));
-		}
-    }
-
-    /**
-     * Obsolete method. This was implemented to handle the case where ensureLocal()
-     * needed to be called but it doesn't use it any longer.
-     *
-     * @param resources the list of resources to ensure locality for
-     * @return <code>true</code> for successful completion
-     * @deprecated Only retained for backwards compatibility.
-     */
-    protected boolean ensureResourcesLocal(List resources) {
-        return true;
-    }
-
-    /**
-     * Returns a new subcollection containing only those resources which are not 
-     * local.
-     *
-     * @param originalList the original list of resources (element type: 
-     *   <code>IResource</code>)
-     * @return the new list of non-local resources (element type: 
-     *   <code>IResource</code>)
-     */
-    protected List extractNonLocalResources(List originalList) {
-        Vector result = new Vector(originalList.size());
-        Iterator resourcesEnum = originalList.iterator();
-
-        while (resourcesEnum.hasNext()) {
-            IResource currentResource = (IResource) resourcesEnum.next();
-            if (!currentResource.isLocal(IResource.DEPTH_ZERO)) {
-				result.addElement(currentResource);
-			}
-        }
-
-        return result;
-    }
-
-    /**
-     * Returns the current selection value of the "Export all types" radio,
-     * or its set initial value if it does not exist yet.
-     *
-     * @return the "Export All Types" radio's current value or anticipated initial
-     *   value
-     */
-    public boolean getExportAllTypesValue() {
-        if (exportAllTypesRadio == null) {
-			return initialExportAllTypesValue;
-		}
-
-        return exportAllTypesRadio.getSelection();
-    }
-
-    /**
-     * Returns the current contents of the resource name entry field,
-     * or its set initial value if it does not exist yet (which could
-     * be <code>null</code>).
-     *
-     * @return the resource name field's current value or anticipated initial value,
-     *   or <code>null</code>
-     */
-    public String getResourceFieldValue() {
-        if (resourceNameField == null) {
-			return initialExportFieldValue;
-		}
-
-        return resourceNameField.getText();
-    }
-
-    /**
-     * Return the path for the resource field.
-     * @return org.eclipse.core.runtime.IPath
-     */
-    protected IPath getResourcePath() {
-        return getPathFromText(this.resourceNameField);
-    }
-
-    /**
-     * Returns this page's collection of currently-specified resources to be 
-     * exported. This is the primary resource selection facility accessor for 
-     * subclasses.
-     *
-     * @return the collection of resources currently selected for export (element 
-     *   type: <code>IResource</code>)
-     */
-    protected List getSelectedResources() {
-        if (selectedResources == null) {
-            IResource sourceResource = getSourceResource();
-
-            if (sourceResource != null) {
-				selectAppropriateResources(sourceResource);
-			}
-        }
-
-        return selectedResources;
-    }
-
-    /**
-     * Returns the resource object specified in the resource name entry field,
-     * or <code>null</code> if such a resource does not exist in the workbench.
-     *
-     * @return the resource specified in the resource name entry field, or 
-     *   <code>null</code>
-     */
-    protected IResource getSourceResource() {
-        IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace();
-        //make the path absolute to allow for optional leading slash
-        IPath testPath = getResourcePath();
-
-        IStatus result = workspace.validatePath(testPath.toString(),
-                IResource.ROOT | IResource.PROJECT | IResource.FOLDER
-                        | IResource.FILE);
-
-        if (result.isOK() && workspace.getRoot().exists(testPath)) {
-			return workspace.getRoot().findMember(testPath);
-		}
-
-        return null;
-    }
-
-    /**
-     * Returns the current contents of the types entry field, or its set
-     * initial value if it does not exist yet (which could be <code>null</code>).
-     *
-     * @return the types entry field's current value or anticipated initial value,
-     *   or <code>null</code>
-     */
-    public String getTypesFieldValue() {
-        if (typesToExportField == null) {
-			return initialTypesFieldValue;
-		}
-
-        return typesToExportField.getText();
-    }
-
-    /**
-     * Returns the resource extensions currently specified to be exported.
-     *
-     * @return the resource extensions currently specified to be exported (element 
-     *   type: <code>String</code>)
-     */
-    protected List getTypesToExport() {
-        List result = new ArrayList();
-        StringTokenizer tokenizer = new StringTokenizer(typesToExportField
-                .getText(), TYPE_DELIMITER);
-
-        while (tokenizer.hasMoreTokens()) {
-            String currentExtension = tokenizer.nextToken().trim();
-            if (!currentExtension.equals("")) { //$NON-NLS-1$
-				result.add(currentExtension);
-			}
-        }
-
-        return result;
-    }
-
-    /**
-     * The <code>WizardExportPage</code> implementation of this 
-     * <code>Listener</code> method handles all events and enablements for controls
-     * on this page. Subclasses may extend.
-     */
-    public void handleEvent(Event event) {
-        Widget source = event.widget;
-
-        if (source == exportAllTypesRadio || source == typesToExportField
-                || source == resourceNameField) {
-			resetSelectedResources();
-		} else if (source == exportSpecifiedTypesRadio) {
-            resetSelectedResources();
-            typesToExportField.setFocus();
-        } else if (source == resourceDetailsButton) {
-			handleResourceDetailsButtonPressed();
-		} else if (source == resourceBrowseButton) {
-			handleResourceBrowseButtonPressed();
-		} else if (source == typesToExportEditButton) {
-			handleTypesEditButtonPressed();
-		}
-
-        setPageComplete(determinePageCompletion());
-        updateWidgetEnablements();
-    }
-
-    /**
-     * Opens a container selection dialog and displays the user's subsequent
-     * container selection in this page's resource name field.
-     */
-    protected void handleResourceBrowseButtonPressed() {
-        IResource currentFolder = getSourceResource();
-        if (currentFolder != null && currentFolder.getType() == IResource.FILE) {
-			currentFolder = currentFolder.getParent();
-		}
-
-        IPath containerPath = queryForContainer((IContainer) currentFolder,
-                IDEWorkbenchMessages.WizardExportPage_selectResourcesToExport);
-        if (containerPath != null) { // null means user cancelled
-            String relativePath = containerPath.makeRelative().toString();
-            if (!relativePath.toString().equals(resourceNameField.getText())) {
-                resetSelectedResources();
-                resourceNameField.setText(relativePath);
-            }
-        }
-    }
-
-    /**
-     * Opens a resource selection dialog and records the user's subsequent
-     * resource selections.
-     */
-    protected void handleResourceDetailsButtonPressed() {
-        IAdaptable source = getSourceResource();
-
-        if (source == null) {
-			source = ResourcesPlugin.getWorkspace().getRoot();
-		}
-
-        selectAppropriateResources(source);
-
-        if (source instanceof IFile) {
-            source = ((IFile) source).getParent();
-            setResourceToDisplay((IResource) source);
-        }
-
-        Object[] newlySelectedResources = queryIndividualResourcesToExport(source);
-
-        if (newlySelectedResources != null) {
-            selectedResources = Arrays.asList(newlySelectedResources);
-            displayResourcesSelectedCount(selectedResources.size());
-        }
-    }
-
-    /**
-     * Queries the user for the types of resources to be exported and
-     * displays these types in this page's "Types to export" field.
-     */
-    protected void handleTypesEditButtonPressed() {
-        Object[] newSelectedTypes = queryResourceTypesToExport();
-
-        if (newSelectedTypes != null) { // ie.- did not press Cancel
-            List result = new ArrayList(newSelectedTypes.length);
-            for (int i = 0; i < newSelectedTypes.length; i++) {
-				result.add(((IFileEditorMapping) newSelectedTypes[i])
-                        .getExtension());
-			}
-            setTypesToExport(result);
-        }
-    }
-
-    /**
-     * Returns whether the extension of the given resource name is an extension that
-     * has been specified for export by the user.
-     *
-     * @param resourceName the resource name
-     * @return <code>true</code> if the resource name is suitable for export based 
-     *   upon its extension
-     */
-    protected boolean hasExportableExtension(String resourceName) {
-        if (selectedTypes == null) {
-			return true;
-		}
-
-        int separatorIndex = resourceName.lastIndexOf(".");//$NON-NLS-1$
-        if (separatorIndex == -1) {
-			return false;
-		}
-
-        String extension = resourceName.substring(separatorIndex + 1);
-
-        Iterator it = selectedTypes.iterator();
-        while (it.hasNext()) {
-            if (extension.equalsIgnoreCase((String) it.next())) {
-				return true;
-			}
-        }
-
-        return false;
-    }
-
-    /**
-     * Persists additional setting that are to be restored in the next instance of
-     * this page.
-     * <p> 
-     * The <code>WizardImportPage</code> implementation of this method does
-     * nothing. Subclasses may extend to persist additional settings.
-     * </p>
-     */
-    protected void internalSaveWidgetValues() {
-    }
-
-    /**
-     * Queries the user for the individual resources that are to be exported
-     * and returns these resources as a collection.
-     * 
-     * @param rootResource the resource to use as the root of the selection query
-     * @return the resources selected for export (element type: 
-     *   <code>IResource</code>), or <code>null</code> if the user canceled the 
-     *   selection
-     */
-    protected Object[] queryIndividualResourcesToExport(IAdaptable rootResource) {
-        ResourceSelectionDialog dialog = new ResourceSelectionDialog(
-                getContainer().getShell(), rootResource, IDEWorkbenchMessages.WizardExportPage_selectResourcesTitle);
-        dialog.setInitialSelections(selectedResources
-                .toArray(new Object[selectedResources.size()]));
-        dialog.open();
-        return dialog.getResult();
-    }
-
-    /**
-     * Queries the user for the resource types that are to be exported and returns
-     * these types as a collection.
-     *
-     * @return the resource types selected for export (element type: 
-     *   <code>String</code>), or <code>null</code> if the user canceled the 
-     *   selection
-     */
-    protected Object[] queryResourceTypesToExport() {
-        IFileEditorMapping editorMappings[] = PlatformUI.getWorkbench()
-                .getEditorRegistry().getFileEditorMappings();
-
-        int mappingsSize = editorMappings.length;
-        List selectedTypes = getTypesToExport();
-        List initialSelections = new ArrayList(selectedTypes.size());
-
-        for (int i = 0; i < mappingsSize; i++) {
-            IFileEditorMapping currentMapping = editorMappings[i];
-            if (selectedTypes.contains(currentMapping.getExtension())) {
-				initialSelections.add(currentMapping);
-			}
-        }
-
-        ListSelectionDialog dialog = new ListSelectionDialog(getContainer()
-                .getShell(), editorMappings,
-                FileEditorMappingContentProvider.INSTANCE,
-                FileEditorMappingLabelProvider.INSTANCE, IDEWorkbenchMessages.WizardExportPage_selectionDialogMessage);
-
-        dialog.setTitle(IDEWorkbenchMessages.WizardExportPage_resourceTypeDialog);
-        dialog.open();
-
-        return dialog.getResult();
-    }
-
-    /**
-     * Resets this page's selected resources collection and updates its controls
-     * accordingly.
-     */
-    protected void resetSelectedResources() {
-        resourceDetailsDescription.setText(IDEWorkbenchMessages.WizardExportPage_detailsMessage);
-        selectedResources = null;
-
-        if (exportCurrentSelection) {
-            exportCurrentSelection = false;
-
-            if (resourceNameField.getText().length() > CURRENT_SELECTION
-                    .length()) {
-				resourceNameField.setText(resourceNameField.getText()
-                        .substring(CURRENT_SELECTION.length()));
-			} else {
-				resourceNameField.setText("");//$NON-NLS-1$
-			}
-        }
-    }
-
-    /**
-     * Restores resource specification control settings that were persisted
-     * in the previous instance of this page. Subclasses wishing to restore
-     * persisted values for their controls may extend.
-     */
-    protected void restoreResourceSpecificationWidgetValues() {
-        IDialogSettings settings = getDialogSettings();
-        if (settings != null) {
-            String pageName = getName();
-            boolean exportAllResources = settings
-                    .getBoolean(STORE_EXPORT_ALL_RESOURCES_ID + pageName);
-
-            // restore all/typed radio values iff not already explicitly set
-            if (!exportAllResourcesPreSet) {
-                exportAllTypesRadio.setSelection(exportAllResources);
-                exportSpecifiedTypesRadio.setSelection(!exportAllResources);
-            }
-
-            // restore selected types iff not explicitly already set
-            if (initialTypesFieldValue == null) {
-                String[] selectedTypes = settings
-                        .getArray(STORE_SELECTED_TYPES_ID + pageName);
-                if (selectedTypes != null) {
-                    if (selectedTypes.length > 0) {
-						typesToExportField.setText(selectedTypes[0]);
-					}
-                    for (int i = 0; i < selectedTypes.length; i++) {
-						typesToExportField.add(selectedTypes[i]);
-					}
-                }
-            }
-        }
-    }
-
-    /**
-     * Persists resource specification control setting that are to be restored
-     * in the next instance of this page. Subclasses wishing to persist additional
-     * setting for their controls should extend hook method 
-     * <code>internalSaveWidgetValues</code>.
-     */
-    protected void saveWidgetValues() {
-        IDialogSettings settings = getDialogSettings();
-        if (settings != null) {
-            String pageName = getName();
-
-            // update specific types to export history
-            String[] selectedTypesNames = settings
-                    .getArray(STORE_SELECTED_TYPES_ID + pageName);
-            if (selectedTypesNames == null) {
-				selectedTypesNames = new String[0];
-			}
-
-            if (exportSpecifiedTypesRadio.getSelection()) {
-                selectedTypesNames = addToHistory(selectedTypesNames,
-                        typesToExportField.getText());
-            }
-
-            settings
-                    .put(STORE_SELECTED_TYPES_ID + pageName, selectedTypesNames);
-
-            // radio buttons
-            settings.put(STORE_EXPORT_ALL_RESOURCES_ID + pageName,
-                    exportAllTypesRadio.getSelection());
-        }
-
-        // allow subclasses to save values
-        internalSaveWidgetValues();
-
-    }
-
-    /**
-     * Records a container's recursive file descendents which have an extension
-     * that has been specified for export by the user.
-     *
-     * @param resource the parent container
-     */
-    protected void selectAppropriateFolderContents(IContainer resource) {
-        try {
-            IResource[] members = resource.members();
-
-            for (int i = 0; i < members.length; i++) {
-                if (members[i].getType() == IResource.FILE) {
-                    IFile currentFile = (IFile) members[i];
-                    if (hasExportableExtension(currentFile.getFullPath()
-                            .toString())) {
-						selectedResources.add(currentFile);
-					}
-                }
-                if (members[i].getType() == IResource.FOLDER) {
-                    selectAppropriateFolderContents((IContainer) members[i]);
-                }
-            }
-        } catch (CoreException e) {
-            //don't show children if there are errors -- should at least log this
-        }
-    }
-
-    /**
-     * Records a resource's recursive descendents which are appropriate
-     * for export based upon this page's current controls contents.
-     *
-     * @param resource the parent resource
-     */
-    protected void selectAppropriateResources(Object resource) {
-        if (selectedResources == null) {
-
-            if (exportSpecifiedTypesRadio.getSelection()) {
-				selectedTypes = getTypesToExport();
-			} else {
-				selectedTypes = null; // sentinel for select all extensions
-			}
-
-            selectedResources = new ArrayList();
-            if (resource instanceof IWorkspaceRoot) {
-                IProject[] projects = ((IWorkspaceRoot) resource).getProjects();
-                for (int i = 0; i < projects.length; i++) {
-                    selectAppropriateFolderContents(projects[i]);
-                }
-            } else if (resource instanceof IFile) {
-                IFile file = (IFile) resource;
-                if (hasExportableExtension(file.getFullPath().toString())) {
-					selectedResources.add(file);
-				}
-            } else {
-                selectAppropriateFolderContents((IContainer) resource);
-            }
-        }
-    }
-
-    /**
-     * Sets the selection value of this page's "Export all types" radio, or stores
-     * it for future use if this visual component does not exist yet.
-     *
-     * @param value new selection value
-     */
-    public void setExportAllTypesValue(boolean value) {
-        if (exportAllTypesRadio == null) {
-            initialExportAllTypesValue = value;
-            exportAllResourcesPreSet = true;
-        } else {
-            exportAllTypesRadio.setSelection(value);
-            exportSpecifiedTypesRadio.setSelection(!value);
-        }
-    }
-
-    /**
-     * Sets the value of this page's source resource field, or stores
-     * it for future use if this visual component does not exist yet.
-     *
-     * @param value new value
-     */
-    public void setResourceFieldValue(String value) {
-        if (resourceNameField == null) {
-			initialExportFieldValue = value;
-		} else {
-			resourceNameField.setText(value);
-		}
-    }
-
-    /**
-     * Set the resource whos name we will display.
-     * @param resource
-     */
-    protected void setResourceToDisplay(IResource resource) {
-        setResourceFieldValue(resource.getFullPath().makeRelative().toString());
-    }
-
-    /**
-     * Sets the value of this page's "Types to export" field, or stores
-     * it for future use if this visual component does not exist yet.
-     *
-     * @param value new value
-     */
-    public void setTypesFieldValue(String value) {
-        if (typesToExportField == null) {
-			initialTypesFieldValue = value;
-		} else {
-			typesToExportField.setText(value);
-		}
-    }
-
-    /**
-     * Sets the value of this page's "Types to export" field based upon the
-     * collection of extensions.
-     *
-     * @param typeStrings the collection of extensions to populate the "Types to
-     *   export" field with (element type: <code>String</code>)
-     */
-    protected void setTypesToExport(List typeStrings) {
-        StringBuffer result = new StringBuffer();
-        Iterator typesEnum = typeStrings.iterator();
-
-        while (typesEnum.hasNext()) {
-            result.append(typesEnum.next());
-            result.append(TYPE_DELIMITER);
-            result.append(" ");//$NON-NLS-1$
-        }
-
-        typesToExportField.setText(result.toString());
-    }
-
-    /**
-     * Populates the resource name field based upon the currently selected resources.
-     */
-    protected void setupBasedOnInitialSelections() {
-        if (initialExportFieldValue != null) {
-            // a source resource has been programatically specified, which overrides
-            // the current workbench resource selection
-            IResource specifiedSourceResource = getSourceResource();
-            if (specifiedSourceResource == null) {
-				currentResourceSelection = new StructuredSelection();
-			} else {
-				currentResourceSelection = new StructuredSelection(
-                        specifiedSourceResource);
-			}
-        }
-
-        if (currentResourceSelection.isEmpty()) {
-			return; // no setup needed
-		}
-
-        List selections = new ArrayList();
-        Iterator it = currentResourceSelection.iterator();
-        while (it.hasNext()) {
-            IResource currentResource = (IResource) it.next();
-            // do not add inaccessible elements
-            if (currentResource.isAccessible()) {
-				selections.add(currentResource);
-			}
-        }
-
-        if (selections.isEmpty()) {
-			return; // setup not needed anymore
-		}
-
-        int selectedResourceCount = selections.size();
-        if (selectedResourceCount == 1) {
-            IResource resource = (IResource) selections.get(0);
-            setResourceToDisplay(resource);
-        } else {
-            selectedResources = selections;
-            exportAllTypesRadio.setSelection(true);
-            exportSpecifiedTypesRadio.setSelection(false);
-            resourceNameField.setText(CURRENT_SELECTION);
-            exportCurrentSelection = true;
-            displayResourcesSelectedCount(selectedResourceCount);
-        }
-    }
-
-    /**
-     * Updates the enablements of this page's controls. Subclasses may extend.
-     */
-    protected void updateWidgetEnablements() {
-        if (exportCurrentSelection) {
-			resourceDetailsButton.setEnabled(true);
-		} else {
-            IResource resource = getSourceResource();
-            resourceDetailsButton.setEnabled(resource != null
-                    && resource.isAccessible());
-        }
-
-        exportSpecifiedTypesRadio.setEnabled(!exportCurrentSelection);
-        typesToExportField.setEnabled(exportSpecifiedTypesRadio.getSelection());
-        typesToExportEditButton.setEnabled(exportSpecifiedTypesRadio
-                .getSelection());
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WizardDataTransferPage.
-     */
-    protected final boolean validateSourceGroup() {
-        if (exportCurrentSelection) {
-			return true;
-		}
-
-        String sourceString = resourceNameField.getText();
-        if (sourceString.equals("")) {//$NON-NLS-1$
-            setErrorMessage(null);
-            return false;
-        }
-
-        IResource resource = getSourceResource();
-
-        if (resource == null) {
-            setErrorMessage(IDEWorkbenchMessages.WizardExportPage_mustExistMessage);
-            return false;
-        }
-
-        if (!resource.isAccessible()) {
-            setErrorMessage(IDEWorkbenchMessages.WizardExportPage_mustBeAccessibleMessage);
-            return false;
-        }
-
-        return true;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardExportResourcesPage.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardExportResourcesPage.java
deleted file mode 100644
index ed93697..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardExportResourcesPage.java
+++ /dev/null
@@ -1,637 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-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.graphics.Font;
-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.Shell;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ide.DialogUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.dialogs.ResourceTreeAndListGroup;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * Abstract superclass for a typical export wizard's main page.
- * <p>
- * Clients may subclass this page to inherit its common destination resource
- * selection facilities.
- * </p>
- * <p>
- * Subclasses must implement 
- * <ul>
- *   <li><code>createDestinationGroup</code></li>
- * </ul>
- * </p>
- * <p>
- * Subclasses may override
- * <ul>
- *   <li><code>allowNewContainerName</code></li>
- * </ul>
- * </p>
- * <p>
- * Subclasses may extend
- * <ul>
- *   <li><code>handleEvent</code></li>
- *   <li><code>internalSaveWidgetValues</code></li>
- *   <li><code>updateWidgetEnablements</code></li>
- * </ul>
- * </p>
- */
-public abstract class WizardExportResourcesPage extends WizardDataTransferPage {
-    private IStructuredSelection initialResourceSelection;
-
-    private List selectedTypes = new ArrayList();
-
-    // widgets
-    private ResourceTreeAndListGroup resourceGroup;
-
-    private final static String SELECT_TYPES_TITLE = IDEWorkbenchMessages.WizardTransferPage_selectTypes;
-
-    private final static String SELECT_ALL_TITLE = IDEWorkbenchMessages.WizardTransferPage_selectAll;
-
-    private final static String DESELECT_ALL_TITLE = IDEWorkbenchMessages.WizardTransferPage_deselectAll;
-
-    /**
-     * Creates an export wizard page. If the current resource selection 
-     * is not empty then it will be used as the initial collection of resources
-     * selected for export.
-     *
-     * @param pageName the name of the page
-     * @param selection {@link IStructuredSelection} of {@link IResource}
-     * @see IDE#computeSelectedResources(IStructuredSelection)
-     */
-    protected WizardExportResourcesPage(String pageName,
-            IStructuredSelection selection) {
-        super(pageName);
-        this.initialResourceSelection = selection;
-    }
-
-    /**
-     * The <code>addToHierarchyToCheckedStore</code> implementation of this 
-     * <code>WizardDataTransferPage</code> method returns <code>false</code>. 
-     * Subclasses may override this method.
-     */
-    protected boolean allowNewContainerName() {
-        return false;
-    }
-
-    /**
-     * Creates a new button with the given id.
-     * <p>
-     * The <code>Dialog</code> implementation of this framework method
-     * creates a standard push button, registers for selection events
-     * including button presses and registers
-     * default buttons with its shell.
-     * The button id is stored as the buttons client data.
-     * Note that the parent's layout is assumed to be a GridLayout and 
-     * the number of columns in this layout is incremented.
-     * Subclasses may override.
-     * </p>
-     *
-     * @param parent the parent composite
-     * @param id the id of the button (see
-     *  <code>IDialogConstants.*_ID</code> constants 
-     *  for standard dialog button ids)
-     * @param label the label from the button
-     * @param defaultButton <code>true</code> if the button is to be the
-     *   default button, and <code>false</code> otherwise
-     */
-    protected Button createButton(Composite parent, int id, String label,
-            boolean defaultButton) {
-        // increment the number of columns in the button bar
-        ((GridLayout) parent.getLayout()).numColumns++;
-
-        Button button = new Button(parent, SWT.PUSH);
-
-        GridData buttonData = new GridData(GridData.FILL_HORIZONTAL);
-        button.setLayoutData(buttonData);
-
-        button.setData(new Integer(id));
-        button.setText(label);
-        button.setFont(parent.getFont());
-
-        if (defaultButton) {
-            Shell shell = parent.getShell();
-            if (shell != null) {
-                shell.setDefaultButton(button);
-            }
-            button.setFocus();
-        }
-        button.setFont(parent.getFont());
-        setButtonLayoutData(button);
-        return button;
-    }
-
-    /**
-     * Creates the buttons for selecting specific types or selecting all or none of the
-     * elements.
-     *
-     * @param parent the parent control
-     */
-    protected final void createButtonsGroup(Composite parent) {
-
-        Font font = parent.getFont();
-
-        // top level group
-        Composite buttonComposite = new Composite(parent, SWT.NONE);
-        buttonComposite.setFont(parent.getFont());
-
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 3;
-        layout.makeColumnsEqualWidth = true;
-        buttonComposite.setLayout(layout);
-        buttonComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
-                | GridData.HORIZONTAL_ALIGN_FILL));
-
-        // types edit button
-        Button selectTypesButton = createButton(buttonComposite,
-                IDialogConstants.SELECT_TYPES_ID, SELECT_TYPES_TITLE, false);
-
-        SelectionListener listener = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                handleTypesEditButtonPressed();
-            }
-        };
-        selectTypesButton.addSelectionListener(listener);
-        selectTypesButton.setFont(font);
-        setButtonLayoutData(selectTypesButton);
-
-        Button selectButton = createButton(buttonComposite,
-                IDialogConstants.SELECT_ALL_ID, SELECT_ALL_TITLE, false);
-
-        listener = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                resourceGroup.setAllSelections(true);
-            }
-        };
-        selectButton.addSelectionListener(listener);
-        selectButton.setFont(font);
-        setButtonLayoutData(selectButton);
-
-        Button deselectButton = createButton(buttonComposite,
-                IDialogConstants.DESELECT_ALL_ID, DESELECT_ALL_TITLE, false);
-
-        listener = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                resourceGroup.setAllSelections(false);
-            }
-        };
-        deselectButton.addSelectionListener(listener);
-        deselectButton.setFont(font);
-        setButtonLayoutData(deselectButton);
-
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IDialogPage.
-     */
-    public void createControl(Composite parent) {
-
-        initializeDialogUnits(parent);
-
-        Composite composite = new Composite(parent, SWT.NULL);
-        composite.setLayout(new GridLayout());
-        composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
-                | GridData.HORIZONTAL_ALIGN_FILL));
-        composite.setFont(parent.getFont());
-
-        createResourcesGroup(composite);
-        createButtonsGroup(composite);
-
-        createDestinationGroup(composite);
-
-        createOptionsGroup(composite);
-
-        restoreResourceSpecificationWidgetValues(); // ie.- local
-        restoreWidgetValues(); // ie.- subclass hook
-        if (initialResourceSelection != null) {
-			setupBasedOnInitialSelections();
-		}
-
-        updateWidgetEnablements();
-        setPageComplete(determinePageCompletion());
-        setErrorMessage(null);	// should not initially have error message
-        
-        setControl(composite);
-    }
-
-    /**
-     * Creates the export destination specification visual components.
-     * <p>
-     * Subclasses must implement this method.
-     * </p>
-     *
-     * @param parent the parent control
-     */
-    protected abstract void createDestinationGroup(Composite parent);
-
-    /**
-     * Creates the checkbox tree and list for selecting resources.
-     *
-     * @param parent the parent control
-     */
-    protected final void createResourcesGroup(Composite parent) {
-
-        //create the input element, which has the root resource
-        //as its only child
-        List input = new ArrayList();
-        IProject[] projects = ResourcesPlugin.getWorkspace().getRoot()
-                .getProjects();
-        for (int i = 0; i < projects.length; i++) {
-            if (projects[i].isOpen()) {
-				input.add(projects[i]);
-			}
-        }
-
-        this.resourceGroup = new ResourceTreeAndListGroup(parent, input,
-                getResourceProvider(IResource.FOLDER | IResource.PROJECT),
-                WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(),
-                getResourceProvider(IResource.FILE), WorkbenchLabelProvider
-                        .getDecoratingWorkbenchLabelProvider(), SWT.NONE,
-                DialogUtil.inRegularFontMode(parent));
-        
-        ICheckStateListener listener = new ICheckStateListener() {
-            public void checkStateChanged(CheckStateChangedEvent event) {
-                updateWidgetEnablements();
-            }
-        };
-        
-        this.resourceGroup.addCheckStateListener(listener);
-    }
-
-    /*
-     * @see WizardDataTransferPage.getErrorDialogTitle()
-     */
-    protected String getErrorDialogTitle() {
-        return IDEWorkbenchMessages.WizardExportPage_errorDialogTitle;
-    }
-
-    /**
-     * Obsolete method. This was implemented to handle the case where ensureLocal()
-     * needed to be called but it doesn't use it any longer.
-     *
-     * @deprecated Only retained for backwards compatibility.
-     */
-    protected boolean ensureResourcesLocal(List resources) {
-        return true;
-    }
-
-    /**
-     * Returns a new subcollection containing only those resources which are not 
-     * local.
-     *
-     * @param originalList the original list of resources (element type: 
-     *   <code>IResource</code>)
-     * @return the new list of non-local resources (element type: 
-     *   <code>IResource</code>)
-     */
-    protected List extractNonLocalResources(List originalList) {
-        Vector result = new Vector(originalList.size());
-        Iterator resourcesEnum = originalList.iterator();
-
-        while (resourcesEnum.hasNext()) {
-            IResource currentResource = (IResource) resourcesEnum.next();
-            if (!currentResource.isLocal(IResource.DEPTH_ZERO)) {
-				result.addElement(currentResource);
-			}
-        }
-
-        return result;
-    }
-
-    /**
-     * Returns a content provider for <code>IResource</code>s that returns 
-     * only children of the given resource type.
-     */
-    private ITreeContentProvider getResourceProvider(final int resourceType) {
-        return new WorkbenchContentProvider() {
-            public Object[] getChildren(Object o) {
-                if (o instanceof IContainer) {
-                    IResource[] members = null;
-                    try {
-                        members = ((IContainer) o).members();
-                    } catch (CoreException e) {
-                        //just return an empty set of children
-                        return new Object[0];
-                    }
-
-                    //filter out the desired resource types
-                    ArrayList results = new ArrayList();
-                    for (int i = 0; i < members.length; i++) {
-                        //And the test bits with the resource types to see if they are what we want
-                        if ((members[i].getType() & resourceType) > 0) {
-                            results.add(members[i]);
-                        }
-                    }
-                    return results.toArray();
-                } 
-                //input element case
-                if (o instanceof ArrayList) {
-                    return ((ArrayList) o).toArray();
-                } 
-                return new Object[0];
-            }
-        };
-    }
-
-    /**
-     * Returns this page's collection of currently-specified resources to be 
-     * exported. This is the primary resource selection facility accessor for 
-     * subclasses.
-     *
-     * @return a collection of resources currently selected 
-     * for export (element type: <code>IResource</code>)
-     */
-    protected List getSelectedResources() {
-        Iterator resourcesToExportIterator = this
-                .getSelectedResourcesIterator();
-        List resourcesToExport = new ArrayList();
-        while (resourcesToExportIterator.hasNext()) {
-			resourcesToExport.add(resourcesToExportIterator.next());
-		}
-        return resourcesToExport;
-    }
-
-    /**
-     * Returns this page's collection of currently-specified resources to be 
-     * exported. This is the primary resource selection facility accessor for 
-     * subclasses.
-     *
-     * @return an iterator over the collection of resources currently selected 
-     * for export (element type: <code>IResource</code>). This will include
-     * white checked folders and individually checked files.
-     */
-    protected Iterator getSelectedResourcesIterator() {
-        return this.resourceGroup.getAllCheckedListItems().iterator();
-    }
-
-    /**
-     * Returns the resource extensions currently specified to be exported.
-     *
-     * @return the resource extensions currently specified to be exported (element 
-     *   type: <code>String</code>)
-     */
-    protected List getTypesToExport() {
-
-        return selectedTypes;
-    }
-
-    /**
-     * Returns this page's collection of currently-specified resources to be 
-     * exported. This returns both folders and files - for just the files use
-     * getSelectedResources.
-     *
-     * @return a collection of resources currently selected 
-     * for export (element type: <code>IResource</code>)
-     */
-    protected List getWhiteCheckedResources() {
-
-        return this.resourceGroup.getAllWhiteCheckedItems();
-    }
-
-    /**
-     * Queries the user for the types of resources to be exported and selects
-     * them in the checkbox group.
-     */
-    protected void handleTypesEditButtonPressed() {
-        Object[] newSelectedTypes = queryResourceTypesToExport();
-
-        if (newSelectedTypes != null) { // ie.- did not press Cancel
-            this.selectedTypes = new ArrayList(newSelectedTypes.length);
-            for (int i = 0; i < newSelectedTypes.length; i++) {
-                this.selectedTypes.add(newSelectedTypes[i]);
-            }
-            setupSelectionsBasedOnSelectedTypes();
-        }
-
-    }
-
-    /**
-     * Returns whether the extension of the given resource name is an extension that
-     * has been specified for export by the user.
-     *
-     * @param resourceName the resource name
-     * @return <code>true</code> if the resource name is suitable for export based 
-     *   upon its extension
-     */
-    protected boolean hasExportableExtension(String resourceName) {
-        if (selectedTypes == null) {
-			return true;
-		}
-
-        int separatorIndex = resourceName.lastIndexOf("."); //$NON-NLS-1$
-        if (separatorIndex == -1) {
-			return false;
-		}
-
-        String extension = resourceName.substring(separatorIndex + 1);
-
-        Iterator it = selectedTypes.iterator();
-        while (it.hasNext()) {
-            if (extension.equalsIgnoreCase((String) it.next())) {
-				return true;
-			}
-        }
-
-        return false;
-    }
-
-    /**
-     * Persists additional setting that are to be restored in the next instance of
-     * this page.
-     * <p> 
-     * The <code>WizardImportPage</code> implementation of this method does
-     * nothing. Subclasses may extend to persist additional settings.
-     * </p>
-     */
-    protected void internalSaveWidgetValues() {
-    }
-
-    /**
-     * Queries the user for the resource types that are to be exported and returns
-     * these types as an array.
-     *
-     * @return the resource types selected for export (element type: 
-     *   <code>String</code>), or <code>null</code> if the user canceled the 
-     *   selection
-     */
-    protected Object[] queryResourceTypesToExport() {
-
-        TypeFilteringDialog dialog = new TypeFilteringDialog(getContainer()
-                .getShell(), getTypesToExport());
-
-        dialog.open();
-
-        return dialog.getResult();
-    }
-
-    /**
-     * Restores resource specification control settings that were persisted
-     * in the previous instance of this page. Subclasses wishing to restore
-     * persisted values for their controls may extend.
-     */
-    protected void restoreResourceSpecificationWidgetValues() {
-    }
-
-    /**
-     * Persists resource specification control setting that are to be restored
-     * in the next instance of this page. Subclasses wishing to persist additional
-     * setting for their controls should extend hook method 
-     * <code>internalSaveWidgetValues</code>.
-     */
-    protected void saveWidgetValues() {
-
-        // allow subclasses to save values
-        internalSaveWidgetValues();
-
-    }
-
-    /**
-     * Set the initial selections in the resource group.
-     */
-    protected void setupBasedOnInitialSelections() {
-
-        Iterator it = this.initialResourceSelection.iterator();
-        while (it.hasNext()) {
-            IResource currentResource = (IResource) it.next();
-            if (currentResource.getType() == IResource.FILE) {
-				this.resourceGroup.initialCheckListItem(currentResource);
-			} else {
-				this.resourceGroup.initialCheckTreeItem(currentResource);
-			}
-        }
-    }
-
-    /**
-     * Update the tree to only select those elements that match the selected types
-     */
-    private void setupSelectionsBasedOnSelectedTypes() {
-
-        Runnable runnable = new Runnable() {
-            public void run() {
-                Map selectionMap = new Hashtable();
-                //Only get the white selected ones
-                Iterator resourceIterator = resourceGroup
-                        .getAllWhiteCheckedItems().iterator();
-                while (resourceIterator.hasNext()) {
-                    //handle the files here - white checked containers require recursion
-                    IResource resource = (IResource) resourceIterator.next();
-                    if (resource.getType() == IResource.FILE) {
-                        if (hasExportableExtension(resource.getName())) {
-                            List resourceList = new ArrayList();
-                            IContainer parent = resource.getParent();
-                            if (selectionMap.containsKey(parent)) {
-								resourceList = (List) selectionMap.get(parent);
-							}
-                            resourceList.add(resource);
-                            selectionMap.put(parent, resourceList);
-                        }
-                    } else {
-						setupSelectionsBasedOnSelectedTypes(selectionMap,
-                                (IContainer) resource);
-					}
-                }
-                resourceGroup.updateSelections(selectionMap);
-            }
-        };
-
-        BusyIndicator.showWhile(getShell().getDisplay(), runnable);
-
-    }
-
-    /**
-     * Set up the selection values for the resources and put them in the selectionMap.
-     * If a resource is a file see if it matches one of the selected extensions. If not
-     * then check the children.
-     */
-    private void setupSelectionsBasedOnSelectedTypes(Map selectionMap,
-            IContainer parent) {
-
-        List selections = new ArrayList();
-        IResource[] resources;
-        boolean hasFiles = false;
-
-        try {
-            resources = parent.members();
-        } catch (CoreException exception) {
-            //Just return if we can't get any info
-            return;
-        }
-
-        for (int i = 0; i < resources.length; i++) {
-            IResource resource = resources[i];
-            if (resource.getType() == IResource.FILE) {
-                if (hasExportableExtension(resource.getName())) {
-                    hasFiles = true;
-                    selections.add(resource);
-                }
-            } else {
-                setupSelectionsBasedOnSelectedTypes(selectionMap,
-                        (IContainer) resource);
-            }
-        }
-
-        //Only add it to the list if there are files in this folder
-        if (hasFiles) {
-			selectionMap.put(parent, selections);
-		}
-    }
-
-    /**
-     * Save any editors that the user wants to save before export.
-     * @return boolean if the save was successful.
-     */
-    protected boolean saveDirtyEditors() {
-        return IDEWorkbenchPlugin.getDefault().getWorkbench().saveAllEditors(
-                true);
-    }
-    
-    /**
-     * Check if widgets are enabled or disabled by a change in the dialog.
-     */
-    protected void updateWidgetEnablements() {
-
-        boolean pageComplete = determinePageCompletion();
-        setPageComplete(pageComplete);
-        if (pageComplete) {
-			setMessage(null);
-		}
-        super.updateWidgetEnablements();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardImportPage.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardImportPage.java
deleted file mode 100644
index 0ad46b2..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardImportPage.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * The abstract superclass for a typical import wizard's main page.
- * <p>
- * Clients may subclass this page to inherit its common destination resource
- * selection facilities.
- * </p>
- * <p>
- * Subclasses must implement 
- * <ul>
- *   <li><code>createSourceGroup</code></li>
- * </ul>
- * </p>
- * <p>
- * Subclasses may override
- * <ul>
- *   <li><code>allowNewContainerName</code></li>
- * </ul>
- * </p>
- * <p>
- * Subclasses may extend
- * <ul>
- *   <li><code>handleEvent</code></li>
- * </ul>
- * </p>
- * @deprecated use WizardResourceImportPage
- */
-public abstract class WizardImportPage extends WizardDataTransferPage {
-    private IResource currentResourceSelection;
-
-    // initial value stores
-    private String initialContainerFieldValue;
-
-    // widgets
-    private Text containerNameField;
-
-    private Button containerBrowseButton;
-
-    /**
-     * Creates an import wizard page. If the initial resource selection 
-     * contains exactly one container resource then it will be used as the default
-     * import destination.
-     *
-     * @param name the name of the page
-     * @param selection the current resource selection
-     */
-    protected WizardImportPage(String name, IStructuredSelection selection) {
-        super(name);
-
-        if (selection.size() == 1) {
-			currentResourceSelection = (IResource) selection.getFirstElement();
-		} else {
-			currentResourceSelection = null;
-		}
-
-        if (currentResourceSelection != null) {
-            if (currentResourceSelection.getType() == IResource.FILE) {
-				currentResourceSelection = currentResourceSelection.getParent();
-			}
-
-            if (!currentResourceSelection.isAccessible()) {
-				currentResourceSelection = null;
-			}
-        }
-
-    }
-
-    /**
-     * The <code>WizardImportPage</code> implementation of this 
-     * <code>WizardDataTransferPage</code> method returns <code>true</code>. 
-     * Subclasses may override this method.
-     */
-    protected boolean allowNewContainerName() {
-        return true;
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IDialogPage.
-     */
-    public void createControl(Composite parent) {
-        Composite composite = new Composite(parent, SWT.NULL);
-        composite.setLayout(new GridLayout());
-        composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
-                | GridData.HORIZONTAL_ALIGN_FILL));
-        composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
-
-        createSourceGroup(composite);
-
-        createSpacer(composite);
-
-        createBoldLabel(composite, IDEWorkbenchMessages.WizardImportPage_destinationLabel);
-        createDestinationGroup(composite);
-
-        createSpacer(composite);
-
-        createBoldLabel(composite, IDEWorkbenchMessages.WizardImportPage_options);
-        createOptionsGroup(composite);
-
-        restoreWidgetValues();
-        updateWidgetEnablements();
-        setPageComplete(determinePageCompletion());
-
-        setControl(composite);
-    }
-
-    /**
-     * Creates the import destination specification controls.
-     *
-     * @param parent the parent control
-     */
-    protected final void createDestinationGroup(Composite parent) {
-        // container specification group
-        Composite containerGroup = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 3;
-        containerGroup.setLayout(layout);
-        containerGroup.setLayoutData(new GridData(
-                GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
-
-        // container label
-        Label resourcesLabel = new Label(containerGroup, SWT.NONE);
-        resourcesLabel.setText(IDEWorkbenchMessages.WizardImportPage_folder);
-
-        // container name entry field
-        containerNameField = new Text(containerGroup, SWT.SINGLE | SWT.BORDER);
-        containerNameField.addListener(SWT.Modify, this);
-        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-                | GridData.GRAB_HORIZONTAL);
-        data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-        containerNameField.setLayoutData(data);
-
-        // container browse button
-        containerBrowseButton = new Button(containerGroup, SWT.PUSH);
-        containerBrowseButton.setText(IDEWorkbenchMessages.WizardImportPage_browseLabel);
-        containerBrowseButton.setLayoutData(new GridData(
-                GridData.HORIZONTAL_ALIGN_FILL));
-        containerBrowseButton.addListener(SWT.Selection, this);
-
-        initialPopulateContainerField();
-    }
-
-    /**
-     * Creates the import source specification controls.
-     * <p>
-     * Subclasses must implement this method.
-     * </p>
-     *
-     * @param parent the parent control
-     */
-    protected abstract void createSourceGroup(Composite parent);
-
-    /**
-     * Display an error dialog with the specified message.
-     *
-     * @param message the error message
-     */
-    protected void displayErrorDialog(String message) {
-        MessageDialog.openError(getContainer().getShell(), IDEWorkbenchMessages.WizardImportPage_errorDialogTitle, message);
-    }
-
-    /**
-     * Returns the path of the container resource specified in the container
-     * name entry field, or <code>null</code> if no name has been typed in.
-     * <p>
-     * The container specified by the full path might not exist and would need to
-     * be created.
-     * </p>
-     *
-     * @return the full path of the container resource specified in
-     *   the container name entry field, or <code>null</code>
-     */
-    protected IPath getContainerFullPath() {
-        IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace();
-
-        //make the path absolute to allow for optional leading slash
-        IPath testPath = getResourcePath();
-
-        IStatus result = workspace.validatePath(testPath.toString(),
-                IResource.PROJECT | IResource.FOLDER);
-        if (result.isOK()) {
-            return testPath;
-        }
-
-        return null;
-    }
-
-    /**
-     * Return the path for the resource field.
-     * @return org.eclipse.core.runtime.IPath
-     */
-    protected IPath getResourcePath() {
-        return getPathFromText(this.containerNameField);
-    }
-
-    /**
-     * Returns the container resource specified in the container name entry field,
-     * or <code>null</code> if such a container does not exist in the workbench.
-     *
-     * @return the container resource specified in the container name entry field,
-     *   or <code>null</code>
-     */
-    protected IContainer getSpecifiedContainer() {
-        IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace();
-        IPath path = getContainerFullPath();
-        if (workspace.getRoot().exists(path)) {
-			return (IContainer) workspace.getRoot().findMember(path);
-		}
-
-        return null;
-    }
-
-    /**
-     * Opens a container selection dialog and displays the user's subsequent
-     * container resource selection in this page's container name field.
-     */
-    protected void handleContainerBrowseButtonPressed() {
-        // see if the user wishes to modify this container selection
-        IPath containerPath = queryForContainer(getSpecifiedContainer(),
-                IDEWorkbenchMessages.WizardImportPage_selectFolderLabel);
-
-        // if a container was selected then put its name in the container name field
-        if (containerPath != null) {
-			containerNameField.setText(containerPath.makeRelative().toString());
-		}
-    }
-
-    /**
-     * The <code>WizardImportPage</code> implementation of this 
-     * <code>Listener</code> method handles all events and enablements for controls
-     * on this page. Subclasses may extend.
-     */
-    public void handleEvent(Event event) {
-        Widget source = event.widget;
-
-        if (source == containerBrowseButton) {
-			handleContainerBrowseButtonPressed();
-		}
-
-        setPageComplete(determinePageCompletion());
-        updateWidgetEnablements();
-    }
-
-    /**
-     * Sets the initial contents of the container name field.
-     */
-    protected final void initialPopulateContainerField() {
-        if (initialContainerFieldValue != null) {
-			containerNameField.setText(initialContainerFieldValue);
-		} else if (currentResourceSelection != null) {
-			containerNameField.setText(currentResourceSelection.getFullPath()
-                    .toString());
-		}
-    }
-
-    /**
-     * Sets the value of this page's container resource field, or stores
-     * it for future use if this page's controls do not exist yet.
-     *
-     * @param value new value
-     */
-    public void setContainerFieldValue(String value) {
-        if (containerNameField == null) {
-			initialContainerFieldValue = value;
-		} else {
-			containerNameField.setText(value);
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WizardDataTransferPage.
-     */
-    protected final boolean validateDestinationGroup() {
-        if (getContainerFullPath() == null) {
-			return false;
-		}
-
-        // If the container exist, validate it
-        IContainer container = getSpecifiedContainer();
-        if (container != null) {
-            if (!container.isAccessible()) {
-                setErrorMessage(IDEWorkbenchMessages.WizardImportPage_folderMustExist);
-                return false;
-            }
-        }
-
-        return true;
-
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewFileCreationPage.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewFileCreationPage.java
deleted file mode 100644
index e590601..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewFileCreationPage.java
+++ /dev/null
@@ -1,767 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Alexander Fedorov <Alexander.Fedorov@borland.com>
- *     		- Bug 172000 [Wizards] WizardNewFileCreationPage should support overwriting existing resources
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-import java.util.Iterator;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceStatus;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-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.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.CreateFileOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.dialogs.CreateLinkedResourceGroup;
-import org.eclipse.ui.internal.ide.misc.ResourceAndContainerGroup;
-
-/**
- * Standard main page for a wizard that creates a file resource.
- * <p>
- * This page may be used by clients as-is; it may be also be subclassed to suit.
- * </p>
- * <p>
- * Subclasses may override
- * <ul>
- * <li><code>getInitialContents</code></li>
- * <li><code>getNewFileLabel</code></li>
- * </ul>
- * </p>
- * <p>
- * Subclasses may extend
- * <ul>
- * <li><code>handleEvent</code></li>
- * </ul>
- * </p>
- */
-public class WizardNewFileCreationPage extends WizardPage implements Listener {
-	private static final int SIZING_CONTAINER_GROUP_HEIGHT = 250;
-
-	// the current resource selection
-	private IStructuredSelection currentSelection;
-
-	// cache of newly-created file
-	private IFile newFile;
-
-	private URI linkTargetPath;
-
-	// widgets
-	private ResourceAndContainerGroup resourceGroup;
-
-	private Button advancedButton;
-
-	private CreateLinkedResourceGroup linkedResourceGroup;
-
-	private Composite linkedResourceParent;
-
-	private Composite linkedResourceComposite;
-
-	// initial value stores
-	private String initialFileName;
-
-	/**
-	 * The file extension to use for this page's file name field when it does
-	 * not exist yet.
-	 * 
-	 * @see WizardNewFileCreationPage#setFileExtension(String)
-	 * @since 3.3
-	 */
-	private String initialFileExtension;
-
-	private IPath initialContainerFullPath;
-
-	private boolean initialAllowExistingResources = false;
-
-	/**
-	 * Height of the "advanced" linked resource group. Set when the advanced
-	 * group is first made visible.
-	 */
-	private int linkedResourceGroupHeight = -1;
-
-	/**
-	 * First time the advanced group is validated.
-	 */
-	private boolean firstLinkCheck = true;
-
-	/**
-	 * Creates a new file creation wizard page. If the initial resource
-	 * selection contains exactly one container resource then it will be used as
-	 * the default container resource.
-	 * 
-	 * @param pageName
-	 *            the name of the page
-	 * @param selection
-	 *            the current resource selection
-	 */
-	public WizardNewFileCreationPage(String pageName,
-			IStructuredSelection selection) {
-		super(pageName);
-		setPageComplete(false);
-		this.currentSelection = selection;
-	}
-
-	/**
-	 * Creates the widget for advanced options.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 */
-	protected void createAdvancedControls(Composite parent) {
-		Preferences preferences = ResourcesPlugin.getPlugin()
-				.getPluginPreferences();
-
-		if (preferences.getBoolean(ResourcesPlugin.PREF_DISABLE_LINKING) == false) {
-			linkedResourceParent = new Composite(parent, SWT.NONE);
-			linkedResourceParent.setFont(parent.getFont());
-			linkedResourceParent.setLayoutData(new GridData(
-					GridData.FILL_HORIZONTAL));
-			GridLayout layout = new GridLayout();
-			layout.marginHeight = 0;
-			layout.marginWidth = 0;
-			linkedResourceParent.setLayout(layout);
-
-			advancedButton = new Button(linkedResourceParent, SWT.PUSH);
-			advancedButton.setFont(linkedResourceParent.getFont());
-			advancedButton.setText(IDEWorkbenchMessages.showAdvanced);
-			GridData data = setButtonLayoutData(advancedButton);
-			data.horizontalAlignment = GridData.BEGINNING;
-			advancedButton.setLayoutData(data);
-			advancedButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					handleAdvancedButtonSelect();
-				}
-			});
-		}
-		linkedResourceGroup = new CreateLinkedResourceGroup(IResource.FILE,
-				new Listener() {
-					public void handleEvent(Event e) {
-						setPageComplete(validatePage());
-						firstLinkCheck = false;
-					}
-				}, new CreateLinkedResourceGroup.IStringValue() {
-					public void setValue(String string) {
-						resourceGroup.setResource(string);
-					}
-
-					public String getValue() {
-						return resourceGroup.getResource();
-					}
-				});
-	}
-
-	/**
-	 * (non-Javadoc) Method declared on IDialogPage.
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-		// top level group
-		Composite topLevel = new Composite(parent, SWT.NONE);
-		topLevel.setLayout(new GridLayout());
-		topLevel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
-				| GridData.HORIZONTAL_ALIGN_FILL));
-		topLevel.setFont(parent.getFont());
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(topLevel,
-				IIDEHelpContextIds.NEW_FILE_WIZARD_PAGE);
-
-		// resource and container group
-		resourceGroup = new ResourceAndContainerGroup(topLevel, this,
-				getNewFileLabel(),
-				IDEWorkbenchMessages.WizardNewFileCreationPage_file, false,
-				SIZING_CONTAINER_GROUP_HEIGHT);
-		resourceGroup.setAllowExistingResources(initialAllowExistingResources);
-		initialPopulateContainerNameField();
-		createAdvancedControls(topLevel);
-		if (initialFileName != null) {
-			resourceGroup.setResource(initialFileName);
-		}
-		if (initialFileExtension != null) {
-			resourceGroup.setResourceExtension(initialFileExtension);
-		}
-		validatePage();
-		// Show description on opening
-		setErrorMessage(null);
-		setMessage(null);
-		setControl(topLevel);
-	}
-
-	/**
-	 * Creates a file resource given the file handle and contents.
-	 * 
-	 * @param fileHandle
-	 *            the file handle to create a file resource with
-	 * @param contents
-	 *            the initial contents of the new file resource, or
-	 *            <code>null</code> if none (equivalent to an empty stream)
-	 * @param monitor
-	 *            the progress monitor to show visual progress with
-	 * @exception CoreException
-	 *                if the operation fails
-	 * @exception OperationCanceledException
-	 *                if the operation is canceled
-	 * 
-	 * @deprecated As of 3.3, use or override {@link #createNewFile()} which
-	 *             uses the undoable operation support. To supply customized
-	 *             file content for a subclass, use
-	 *             {@link #getInitialContents()}.
-	 */
-	protected void createFile(IFile fileHandle, InputStream contents,
-			IProgressMonitor monitor) throws CoreException {
-		if (contents == null) {
-			contents = new ByteArrayInputStream(new byte[0]);
-		}
-
-		try {
-			// Create a new file resource in the workspace
-			if (linkTargetPath != null) {
-				fileHandle.createLink(linkTargetPath,
-						IResource.ALLOW_MISSING_LOCAL, monitor);
-			} else {
-				IPath path = fileHandle.getFullPath();
-				IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-				int numSegments = path.segmentCount();
-				if (numSegments > 2
-						&& !root.getFolder(path.removeLastSegments(1)).exists()) {
-					// If the direct parent of the path doesn't exist, try to
-					// create the
-					// necessary directories.
-					for (int i = numSegments - 2; i > 0; i--) {
-						IFolder folder = root.getFolder(path
-								.removeLastSegments(i));
-						if (!folder.exists()) {
-							folder.create(false, true, monitor);
-						}
-					}
-				}
-				fileHandle.create(contents, false, monitor);
-			}
-		} catch (CoreException e) {
-			// If the file already existed locally, just refresh to get contents
-			if (e.getStatus().getCode() == IResourceStatus.PATH_OCCUPIED) {
-				fileHandle.refreshLocal(IResource.DEPTH_ZERO, null);
-			} else {
-				throw e;
-			}
-		}
-
-		if (monitor.isCanceled()) {
-			throw new OperationCanceledException();
-		}
-	}
-
-	/**
-	 * Creates a file resource handle for the file with the given workspace
-	 * path. This method does not create the file resource; this is the
-	 * responsibility of <code>createFile</code>.
-	 * 
-	 * @param filePath
-	 *            the path of the file resource to create a handle for
-	 * @return the new file resource handle
-	 * @see #createFile
-	 */
-	protected IFile createFileHandle(IPath filePath) {
-		return IDEWorkbenchPlugin.getPluginWorkspace().getRoot().getFile(
-				filePath);
-	}
-
-	/**
-	 * Creates the link target path if a link target has been specified.
-	 */
-	protected void createLinkTarget() {
-		linkTargetPath = linkedResourceGroup.getLinkTargetURI();
-	}
-
-	/**
-	 * Creates a new file resource in the selected container and with the
-	 * selected name. Creates any missing resource containers along the path;
-	 * does nothing if the container resources already exist.
-	 * <p>
-	 * In normal usage, this method is invoked after the user has pressed Finish
-	 * on the wizard; the enablement of the Finish button implies that all
-	 * controls on on this page currently contain valid values.
-	 * </p>
-	 * <p>
-	 * Note that this page caches the new file once it has been successfully
-	 * created; subsequent invocations of this method will answer the same file
-	 * resource without attempting to create it again.
-	 * </p>
-	 * <p>
-	 * This method should be called within a workspace modify operation since it
-	 * creates resources.
-	 * </p>
-	 * 
-	 * @return the created file resource, or <code>null</code> if the file was
-	 *         not created
-	 */
-	public IFile createNewFile() {
-		if (newFile != null) {
-			return newFile;
-		}
-
-		// create the new file and cache it if successful
-
-		final IPath containerPath = resourceGroup.getContainerFullPath();
-		IPath newFilePath = containerPath.append(resourceGroup.getResource());
-		final IFile newFileHandle = createFileHandle(newFilePath);
-		final InputStream initialContents = getInitialContents();
-
-		createLinkTarget();
-		IRunnableWithProgress op = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor) {
-				CreateFileOperation op = new CreateFileOperation(newFileHandle,
-						linkTargetPath, initialContents,
-						IDEWorkbenchMessages.WizardNewFileCreationPage_title);
-				try {
-					// see bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=219901
-					// directly execute the operation so that the undo state is
-					// not preserved.  Making this undoable resulted in too many 
-					// accidental file deletions.
-					op.execute(monitor, WorkspaceUndoUtil
-							.getUIInfoAdapter(getShell()));
-				} catch (final ExecutionException e) {
-					getContainer().getShell().getDisplay().syncExec(
-							new Runnable() {
-								public void run() {
-									if (e.getCause() instanceof CoreException) {
-										ErrorDialog
-												.openError(
-														getContainer()
-																.getShell(), // Was
-														// Utilities.getFocusShell()
-														IDEWorkbenchMessages.WizardNewFileCreationPage_errorTitle,
-														null, // no special
-														// message
-														((CoreException) e
-																.getCause())
-																.getStatus());
-									} else {
-										IDEWorkbenchPlugin
-												.log(
-														getClass(),
-														"createNewFile()", e.getCause()); //$NON-NLS-1$
-										MessageDialog
-												.openError(
-														getContainer()
-																.getShell(),
-														IDEWorkbenchMessages.WizardNewFileCreationPage_internalErrorTitle,
-														NLS
-																.bind(
-																		IDEWorkbenchMessages.WizardNewFileCreationPage_internalErrorMessage,
-																		e
-																				.getCause()
-																				.getMessage()));
-									}
-								}
-							});
-				}
-			}
-		};
-		try {
-			getContainer().run(true, true, op);
-		} catch (InterruptedException e) {
-			return null;
-		} catch (InvocationTargetException e) {
-			// Execution Exceptions are handled above but we may still get
-			// unexpected runtime errors.
-			IDEWorkbenchPlugin.log(getClass(),
-					"createNewFile()", e.getTargetException()); //$NON-NLS-1$
-			MessageDialog
-					.openError(
-							getContainer().getShell(),
-							IDEWorkbenchMessages.WizardNewFileCreationPage_internalErrorTitle,
-							NLS
-									.bind(
-											IDEWorkbenchMessages.WizardNewFileCreationPage_internalErrorMessage,
-											e.getTargetException().getMessage()));
-
-			return null;
-		}
-
-		newFile = newFileHandle;
-
-		return newFile;
-	}
-
-	/**
-	 * Returns the scheduling rule to use when creating the resource at the
-	 * given container path. The rule should be the creation rule for the
-	 * top-most non-existing parent.
-	 * 
-	 * @param resource
-	 *            The resource being created
-	 * @return The scheduling rule for creating the given resource
-	 * @since 3.1
-	 * @deprecated As of 3.3, scheduling rules are provided by the undoable
-	 *             operation that this page creates and executes.
-	 */
-	protected ISchedulingRule createRule(IResource resource) {
-		IResource parent = resource.getParent();
-		while (parent != null) {
-			if (parent.exists()) {
-				return resource.getWorkspace().getRuleFactory().createRule(
-						resource);
-			}
-			resource = parent;
-			parent = parent.getParent();
-		}
-		return resource.getWorkspace().getRoot();
-	}
-
-	/**
-	 * Returns the current full path of the containing resource as entered or
-	 * selected by the user, or its anticipated initial value.
-	 * 
-	 * @return the container's full path, anticipated initial value, or
-	 *         <code>null</code> if no path is known
-	 */
-	public IPath getContainerFullPath() {
-		return resourceGroup.getContainerFullPath();
-	}
-
-	/**
-	 * Returns the current file name as entered by the user, or its anticipated
-	 * initial value. <br>
-	 * <br>
-	 * The current file name will include the file extension if the
-	 * preconditions are met.
-	 * 
-	 * @see WizardNewFileCreationPage#setFileExtension(String)
-	 * 
-	 * @return the file name, its anticipated initial value, or
-	 *         <code>null</code> if no file name is known
-	 */
-	public String getFileName() {
-		if (resourceGroup == null) {
-			return initialFileName;
-		}
-
-		return resourceGroup.getResource();
-	}
-
-	/**
-	 * Returns the file extension to use when creating the new file.
-	 * 
-	 * @return the file extension or <code>null</code>.
-	 * @see WizardNewFileCreationPage#setFileExtension(String)
-	 * @since 3.3
-	 */
-	public String getFileExtension() {
-		if (resourceGroup == null) {
-			return initialFileExtension;
-		}
-		return resourceGroup.getResourceExtension();
-	}
-
-	/**
-	 * Returns a stream containing the initial contents to be given to new file
-	 * resource instances. <b>Subclasses</b> may wish to override. This default
-	 * implementation provides no initial contents.
-	 * 
-	 * @return initial contents to be given to new file resource instances
-	 */
-	protected InputStream getInitialContents() {
-		return null;
-	}
-
-	/**
-	 * Returns the label to display in the file name specification visual
-	 * component group.
-	 * <p>
-	 * Subclasses may reimplement.
-	 * </p>
-	 * 
-	 * @return the label to display in the file name specification visual
-	 *         component group
-	 */
-	protected String getNewFileLabel() {
-		return IDEWorkbenchMessages.WizardNewFileCreationPage_fileLabel;
-	}
-
-	/**
-	 * Shows/hides the advanced option widgets.
-	 */
-	protected void handleAdvancedButtonSelect() {
-		Shell shell = getShell();
-		Point shellSize = shell.getSize();
-		Composite composite = (Composite) getControl();
-
-		if (linkedResourceComposite != null) {
-			linkedResourceComposite.dispose();
-			linkedResourceComposite = null;
-			composite.layout();
-			shell.setSize(shellSize.x, shellSize.y - linkedResourceGroupHeight);
-			advancedButton.setText(IDEWorkbenchMessages.showAdvanced);
-		} else {
-			linkedResourceComposite = linkedResourceGroup
-					.createContents(linkedResourceParent);
-			if (linkedResourceGroupHeight == -1) {
-				Point groupSize = linkedResourceComposite.computeSize(
-						SWT.DEFAULT, SWT.DEFAULT, true);
-				linkedResourceGroupHeight = groupSize.y;
-			}
-			shell.setSize(shellSize.x, shellSize.y + linkedResourceGroupHeight);
-			composite.layout();
-			advancedButton.setText(IDEWorkbenchMessages.hideAdvanced);
-		}
-	}
-
-	/**
-	 * The <code>WizardNewFileCreationPage</code> implementation of this
-	 * <code>Listener</code> method handles all events and enablements for
-	 * controls on this page. Subclasses may extend.
-	 */
-	public void handleEvent(Event event) {
-		setPageComplete(validatePage());
-	}
-
-	/**
-	 * Sets the initial contents of the container name entry field, based upon
-	 * either a previously-specified initial value or the ability to determine
-	 * such a value.
-	 */
-	protected void initialPopulateContainerNameField() {
-		if (initialContainerFullPath != null) {
-			resourceGroup.setContainerFullPath(initialContainerFullPath);
-		} else {
-			Iterator it = currentSelection.iterator();
-			if (it.hasNext()) {
-				Object object = it.next();
-				IResource selectedResource = null;
-				if (object instanceof IResource) {
-					selectedResource = (IResource) object;
-				} else if (object instanceof IAdaptable) {
-					selectedResource = (IResource) ((IAdaptable) object)
-							.getAdapter(IResource.class);
-				}
-				if (selectedResource != null) {
-					if (selectedResource.getType() == IResource.FILE) {
-						selectedResource = selectedResource.getParent();
-					}
-					if (selectedResource.isAccessible()) {
-						resourceGroup.setContainerFullPath(selectedResource
-								.getFullPath());
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Sets the flag indicating whether existing resources are permitted to be
-	 * specified on this page.
-	 * 
-	 * @param value
-	 *            <code>true</code> if existing resources are permitted, and
-	 *            <code>false</code> otherwise
-	 * @since 3.4
-	 */
-	public void setAllowExistingResources(boolean value) {
-		if (resourceGroup == null) {
-			initialAllowExistingResources = value;
-		} else {
-			resourceGroup.setAllowExistingResources(value);
-		}
-	}
-
-	/**
-	 * Sets the value of this page's container name field, or stores it for
-	 * future use if this page's controls do not exist yet.
-	 * 
-	 * @param path
-	 *            the full path to the container
-	 */
-	public void setContainerFullPath(IPath path) {
-		if (resourceGroup == null) {
-			initialContainerFullPath = path;
-		} else {
-			resourceGroup.setContainerFullPath(path);
-		}
-	}
-
-	/**
-	 * Sets the value of this page's file name field, or stores it for future
-	 * use if this page's controls do not exist yet.
-	 * 
-	 * @param value
-	 *            new file name
-	 */
-	public void setFileName(String value) {
-		if (resourceGroup == null) {
-			initialFileName = value;
-		} else {
-			resourceGroup.setResource(value);
-		}
-	}
-
-	/**
-	 * Set the only file extension allowed for this page's file name field. If
-	 * this page's controls do not exist yet, store it for future use. <br>
-	 * <br>
-	 * If a file extension is specified, then it will always be appended with a
-	 * '.' to the text from the file name field for validation when the
-	 * following conditions are met: <br>
-	 * <br>
-	 * (1) File extension length is greater than 0 <br>
-	 * (2) File name field text length is greater than 0 <br>
-	 * (3) File name field text does not already end with a '.' and the file
-	 * extension specified (case sensitive) <br>
-	 * <br>
-	 * The file extension will not be reflected in the actual file name field
-	 * until the file name field loses focus.
-	 * 
-	 * @param value
-	 *            The file extension without the '.' prefix (e.g. 'java', 'xml')
-	 * @since 3.3
-	 */
-	public void setFileExtension(String value) {
-		if (resourceGroup == null) {
-			initialFileExtension = value;
-		} else {
-			resourceGroup.setResourceExtension(value);
-		}
-	}
-
-	/**
-	 * Checks whether the linked resource target is valid. Sets the error
-	 * message accordingly and returns the status.
-	 * 
-	 * @return IStatus validation result from the CreateLinkedResourceGroup
-	 */
-	protected IStatus validateLinkedResource() {
-		IPath containerPath = resourceGroup.getContainerFullPath();
-		IPath newFilePath = containerPath.append(resourceGroup.getResource());
-		IFile newFileHandle = createFileHandle(newFilePath);
-		IStatus status = linkedResourceGroup
-				.validateLinkLocation(newFileHandle);
-
-		if (status.getSeverity() == IStatus.ERROR) {
-			if (firstLinkCheck) {
-				setMessage(status.getMessage());
-			} else {
-				setErrorMessage(status.getMessage());
-			}
-		} else if (status.getSeverity() == IStatus.WARNING) {
-			setMessage(status.getMessage(), WARNING);
-			setErrorMessage(null);
-		}
-		return status;
-	}
-
-	/**
-	 * Returns whether this page's controls currently all contain valid values.
-	 * 
-	 * @return <code>true</code> if all controls are valid, and
-	 *         <code>false</code> if at least one is invalid
-	 */
-	protected boolean validatePage() {
-		boolean valid = true;
-
-		if (!resourceGroup.areAllValuesValid()) {
-			// if blank name then fail silently
-			if (resourceGroup.getProblemType() == ResourceAndContainerGroup.PROBLEM_RESOURCE_EMPTY
-					|| resourceGroup.getProblemType() == ResourceAndContainerGroup.PROBLEM_CONTAINER_EMPTY) {
-				setMessage(resourceGroup.getProblemMessage());
-				setErrorMessage(null);
-			} else {
-				setErrorMessage(resourceGroup.getProblemMessage());
-			}
-			valid = false;
-		}
-
-		String resourceName = resourceGroup.getResource();
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IStatus result = workspace.validateName(resourceName, IResource.FILE);
-		if (!result.isOK()) {
-			setErrorMessage(result.getMessage());
-			return false;
-		}
-
-		IStatus linkedResourceStatus = null;
-		if (valid) {
-			linkedResourceStatus = validateLinkedResource();
-			if (linkedResourceStatus.getSeverity() == IStatus.ERROR) {
-				valid = false;
-			}
-		}
-		// validateLinkedResource sets messages itself
-		if (valid
-				&& (linkedResourceStatus == null || linkedResourceStatus.isOK())) {
-			setMessage(null);
-			setErrorMessage(null);
-
-			// perform "resource exists" check if it was skipped in
-			// ResourceAndContainerGroup
-			if (resourceGroup.getAllowExistingResources()) {
-				String problemMessage = NLS.bind(
-						IDEWorkbenchMessages.ResourceGroup_nameExists,
-						getFileName());
-				IPath resourcePath = getContainerFullPath().append(
-						getFileName());
-				if (workspace.getRoot().getFolder(resourcePath).exists()) {
-					setErrorMessage(problemMessage);
-					valid = false;
-				}
-				if (workspace.getRoot().getFile(resourcePath).exists()) {
-					setMessage(problemMessage, IMessageProvider.WARNING);
-				}
-			}
-		}
-		return valid;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)
-	 */
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		if (visible) {
-			resourceGroup.setFocus();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewFolderMainPage.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewFolderMainPage.java
deleted file mode 100644
index 80922ab..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewFolderMainPage.java
+++ /dev/null
@@ -1,528 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Leon J. Breedt - Added multiple folder creation support (in WizardNewFolderMainPage)
- *     
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-import java.util.Iterator;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceStatus;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-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.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.CreateFolderOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.dialogs.CreateLinkedResourceGroup;
-import org.eclipse.ui.internal.ide.misc.ResourceAndContainerGroup;
-
-/**
- * Standard main page for a wizard that creates a folder resource.
- * <p>
- * This page may be used by clients as-is; it may be also be subclassed to suit.
- * </p>
- * <p>
- * Subclasses may extend
- * <ul>
- * <li><code>handleEvent</code></li>
- * </ul>
- * </p>
- */
-public class WizardNewFolderMainPage extends WizardPage implements Listener {
-	private static final int SIZING_CONTAINER_GROUP_HEIGHT = 250;
-
-	private IStructuredSelection currentSelection;
-
-	private IFolder newFolder;
-
-	// link target location
-	private URI linkTargetPath;
-
-	// widgets
-	private ResourceAndContainerGroup resourceGroup;
-
-	private Button advancedButton;
-
-	private CreateLinkedResourceGroup linkedResourceGroup;
-
-	private Composite linkedResourceParent;
-
-	private Composite linkedResourceComposite;
-
-	/**
-	 * Height of the "advanced" linked resource group. Set when the advanced
-	 * group is first made visible.
-	 */
-	private int linkedResourceGroupHeight = -1;
-
-	/**
-	 * First time the advanced group is validated.
-	 */
-	private boolean firstLinkCheck = true;
-
-	/**
-	 * Creates a new folder creation wizard page. If the initial resource
-	 * selection contains exactly one container resource then it will be used as
-	 * the default container resource.
-	 * 
-	 * @param pageName
-	 *            the name of the page
-	 * @param selection
-	 *            the current resource selection
-	 */
-	public WizardNewFolderMainPage(String pageName,
-			IStructuredSelection selection) {
-		super("newFolderPage1");//$NON-NLS-1$
-		setTitle(pageName);
-		setDescription(IDEWorkbenchMessages.WizardNewFolderMainPage_description);
-		this.currentSelection = selection;
-	}
-
-	/**
-	 * Creates the widget for advanced options.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 */
-	protected void createAdvancedControls(Composite parent) {
-		Preferences preferences = ResourcesPlugin.getPlugin()
-				.getPluginPreferences();
-
-		if (preferences.getBoolean(ResourcesPlugin.PREF_DISABLE_LINKING) == false) {
-			linkedResourceParent = new Composite(parent, SWT.NONE);
-			linkedResourceParent.setFont(parent.getFont());
-			linkedResourceParent.setLayoutData(new GridData(
-					GridData.FILL_HORIZONTAL));
-			GridLayout layout = new GridLayout();
-			layout.marginHeight = 0;
-			layout.marginWidth = 0;
-			linkedResourceParent.setLayout(layout);
-
-			advancedButton = new Button(linkedResourceParent, SWT.PUSH);
-			advancedButton.setFont(linkedResourceParent.getFont());
-			advancedButton.setText(IDEWorkbenchMessages.showAdvanced);
-			GridData data = setButtonLayoutData(advancedButton);
-			data.horizontalAlignment = GridData.BEGINNING;
-			advancedButton.setLayoutData(data);
-			advancedButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					handleAdvancedButtonSelect();
-				}
-			});
-		}
-		linkedResourceGroup = new CreateLinkedResourceGroup(IResource.FOLDER,
-				new Listener() {
-					public void handleEvent(Event e) {
-						setPageComplete(validatePage());
-						firstLinkCheck = false;
-					}
-				}, new CreateLinkedResourceGroup.IStringValue() {
-					public String getValue() {
-						return resourceGroup.getResource();
-					}
-
-					public void setValue(String string) {
-						resourceGroup.setResource(string);
-					}
-				});
-	}
-
-	/**
-	 * (non-Javadoc) Method declared on IDialogPage.
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-		// top level group
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setFont(parent.getFont());
-		composite.setLayout(new GridLayout());
-		composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
-				| GridData.HORIZONTAL_ALIGN_FILL));
-
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(composite,
-				IIDEHelpContextIds.NEW_FOLDER_WIZARD_PAGE);
-
-		resourceGroup = new ResourceAndContainerGroup(composite, this,
-				IDEWorkbenchMessages.WizardNewFolderMainPage_folderName,
-				IDEWorkbenchMessages.WizardNewFolderMainPage_folderLabel,
-				false, SIZING_CONTAINER_GROUP_HEIGHT);
-		resourceGroup.setAllowExistingResources(false);
-		createAdvancedControls(composite);
-		initializePage();
-		validatePage();
-		// Show description on opening
-		setErrorMessage(null);
-		setMessage(null);
-		setControl(composite);
-	}
-
-	/**
-	 * Creates a folder resource given the folder handle.
-	 * 
-	 * @param folderHandle
-	 *            the folder handle to create a folder resource for
-	 * @param monitor
-	 *            the progress monitor to show visual progress with
-	 * @exception CoreException
-	 *                if the operation fails
-	 * @exception OperationCanceledException
-	 *                if the operation is canceled
-	 *                
-	 * @deprecated As of 3.3, use {@link #createNewFolder()} which uses the 
-	 *   undoable operation support.
-	 */
-	protected void createFolder(IFolder folderHandle, IProgressMonitor monitor)
-			throws CoreException {
-		try {
-			// Create the folder resource in the workspace
-			// Update: Recursive to create any folders which do not exist
-			// already
-			if (!folderHandle.exists()) {
-				if (linkTargetPath != null) {
-					folderHandle.createLink(linkTargetPath,
-							IResource.ALLOW_MISSING_LOCAL, monitor);
-				} else {
-					IPath path = folderHandle.getFullPath();
-					IWorkspaceRoot root = ResourcesPlugin.getWorkspace()
-							.getRoot();
-					int numSegments = path.segmentCount();
-					if (numSegments > 2
-							&& !root.getFolder(path.removeLastSegments(1))
-									.exists()) {
-						// If the direct parent of the path doesn't exist, try
-						// to create the
-						// necessary directories.
-						for (int i = numSegments - 2; i > 0; i--) {
-							IFolder folder = root.getFolder(path
-									.removeLastSegments(i));
-							if (!folder.exists()) {
-								folder.create(false, true, monitor);
-							}
-						}
-					}
-					folderHandle.create(false, true, monitor);
-				}
-			}
-		} catch (CoreException e) {
-			// If the folder already existed locally, just refresh to get
-			// contents
-			if (e.getStatus().getCode() == IResourceStatus.PATH_OCCUPIED) {
-				folderHandle.refreshLocal(IResource.DEPTH_INFINITE,
-						new SubProgressMonitor(monitor, 500));
-			} else {
-				throw e;
-			}
-		}
-
-		if (monitor.isCanceled()) {
-			throw new OperationCanceledException();
-		}
-	}
-
-	/**
-	 * Creates a folder resource handle for the folder with the given workspace
-	 * path. This method does not create the folder resource; this is the
-	 * responsibility of <code>createFolder</code>.
-	 * 
-	 * @param folderPath
-	 *            the path of the folder resource to create a handle for
-	 * @return the new folder resource handle
-	 * @see #createFolder
-	 */
-	protected IFolder createFolderHandle(IPath folderPath) {
-		return IDEWorkbenchPlugin.getPluginWorkspace().getRoot().getFolder(
-				folderPath);
-	}
-
-	/**
-	 * Creates the link target path if a link target has been specified.
-	 */
-	protected void createLinkTarget() {
-		linkTargetPath = linkedResourceGroup.getLinkTargetURI();
-	}
-
-	/**
-	 * Creates a new folder resource in the selected container and with the
-	 * selected name. Creates any missing resource containers along the path;
-	 * does nothing if the container resources already exist.
-	 * <p>
-	 * In normal usage, this method is invoked after the user has pressed Finish
-	 * on the wizard; the enablement of the Finish button implies that all
-	 * controls on this page currently contain valid values.
-	 * </p>
-	 * <p>
-	 * Note that this page caches the new folder once it has been successfully
-	 * created; subsequent invocations of this method will answer the same
-	 * folder resource without attempting to create it again.
-	 * </p>
-	 * <p>
-	 * This method should be called within a workspace modify operation since it
-	 * creates resources.
-	 * </p>
-	 * 
-	 * @return the created folder resource, or <code>null</code> if the folder
-	 *         was not created
-	 */
-	public IFolder createNewFolder() {
-		if (newFolder != null) {
-			return newFolder;
-		}
-
-		// create the new folder and cache it if successful
-		final IPath containerPath = resourceGroup.getContainerFullPath();
-		IPath newFolderPath = containerPath.append(resourceGroup.getResource());
-		final IFolder newFolderHandle = createFolderHandle(newFolderPath);
-
-		createLinkTarget();
-		IRunnableWithProgress op = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor) {
-				CreateFolderOperation op = new CreateFolderOperation(
-						newFolderHandle, linkTargetPath,
-						IDEWorkbenchMessages.WizardNewFolderCreationPage_title);
-				try {
-					// see bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=219901
-					// directly execute the operation so that the undo state is
-					// not preserved.  Making this undoable can result in accidental
-					// folder (and file) deletions.
-					op.execute(monitor, WorkspaceUndoUtil
-						.getUIInfoAdapter(getShell()));
-				} catch (final ExecutionException e) {
-					getContainer().getShell().getDisplay().syncExec(
-							new Runnable() {
-								public void run() {
-									if (e.getCause() instanceof CoreException) {
-										ErrorDialog
-												.openError(
-														getContainer()
-																.getShell(), // Was Utilities.getFocusShell()
-														IDEWorkbenchMessages.WizardNewFolderCreationPage_errorTitle,
-														null, // no special message
-														((CoreException) e
-																.getCause())
-																.getStatus());
-									} else {
-										IDEWorkbenchPlugin
-												.log(
-														getClass(),
-														"createNewFolder()", e.getCause()); //$NON-NLS-1$
-										MessageDialog
-												.openError(
-														getContainer()
-																.getShell(),
-														IDEWorkbenchMessages.WizardNewFolderCreationPage_internalErrorTitle,
-														NLS
-																.bind(
-																		IDEWorkbenchMessages.WizardNewFolder_internalError,
-																		e
-																				.getCause()
-																				.getMessage()));
-									}
-								}
-							});
-				}
-			}
-		};
-
-		try {
-			getContainer().run(true, true, op);
-		} catch (InterruptedException e) {
-			return null;
-		} catch (InvocationTargetException e) {
-			// ExecutionExceptions are handled above, but unexpected runtime
-			// exceptions and errors may still occur.
-			IDEWorkbenchPlugin.log(getClass(),
-					"createNewFolder()", e.getTargetException()); //$NON-NLS-1$
-			MessageDialog
-					.openError(
-							getContainer().getShell(),
-							IDEWorkbenchMessages.WizardNewFolderCreationPage_internalErrorTitle,
-							NLS
-									.bind(
-											IDEWorkbenchMessages.WizardNewFolder_internalError,
-											e.getTargetException().getMessage()));
-			return null;
-		}
-
-		newFolder = newFolderHandle;
-
-		return newFolder;
-	}
-
-	/**
-	 * Shows/hides the advanced option widgets.
-	 */
-	protected void handleAdvancedButtonSelect() {
-		Shell shell = getShell();
-		Point shellSize = shell.getSize();
-		Composite composite = (Composite) getControl();
-
-		if (linkedResourceComposite != null) {
-			linkedResourceComposite.dispose();
-			linkedResourceComposite = null;
-			composite.layout();
-			shell.setSize(shellSize.x, shellSize.y - linkedResourceGroupHeight);
-			advancedButton.setText(IDEWorkbenchMessages.showAdvanced);
-		} else {
-			linkedResourceComposite = linkedResourceGroup
-					.createContents(linkedResourceParent);
-			if (linkedResourceGroupHeight == -1) {
-				Point groupSize = linkedResourceComposite.computeSize(
-						SWT.DEFAULT, SWT.DEFAULT, true);
-				linkedResourceGroupHeight = groupSize.y;
-			}
-			shell.setSize(shellSize.x, shellSize.y + linkedResourceGroupHeight);
-			composite.layout();
-			advancedButton.setText(IDEWorkbenchMessages.hideAdvanced);
-		}
-	}
-
-	/**
-	 * The <code>WizardNewFolderCreationPage</code> implementation of this
-	 * <code>Listener</code> method handles all events and enablements for
-	 * controls on this page. Subclasses may extend.
-	 */
-	public void handleEvent(Event ev) {
-		setPageComplete(validatePage());
-	}
-
-	/**
-	 * Initializes this page's controls.
-	 */
-	protected void initializePage() {
-		Iterator it = currentSelection.iterator();
-		if (it.hasNext()) {
-			Object next = it.next();
-			IResource selectedResource = null;
-			if (next instanceof IResource) {
-				selectedResource = (IResource) next;
-			} else if (next instanceof IAdaptable) {
-				selectedResource = (IResource) ((IAdaptable) next)
-						.getAdapter(IResource.class);
-			}
-			if (selectedResource != null) {
-				if (selectedResource.getType() == IResource.FILE) {
-					selectedResource = selectedResource.getParent();
-				}
-				if (selectedResource.isAccessible()) {
-					resourceGroup.setContainerFullPath(selectedResource
-							.getFullPath());
-				}
-			}
-		}
-
-		setPageComplete(false);
-	}
-
-	/*
-	 * @see DialogPage.setVisible(boolean)
-	 */
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		if (visible) {
-			resourceGroup.setFocus();
-		}
-	}
-
-	/**
-	 * Checks whether the linked resource target is valid. Sets the error
-	 * message accordingly and returns the status.
-	 * 
-	 * @return IStatus validation result from the CreateLinkedResourceGroup
-	 */
-	protected IStatus validateLinkedResource() {
-		IPath containerPath = resourceGroup.getContainerFullPath();
-		IPath newFolderPath = containerPath.append(resourceGroup.getResource());
-		IFolder newFolderHandle = createFolderHandle(newFolderPath);
-		IStatus status = linkedResourceGroup
-				.validateLinkLocation(newFolderHandle);
-
-		if (status.getSeverity() == IStatus.ERROR) {
-			if (firstLinkCheck) {
-				setMessage(status.getMessage());
-			} else {
-				setErrorMessage(status.getMessage());
-			}
-		} else if (status.getSeverity() == IStatus.WARNING) {
-			setMessage(status.getMessage(), WARNING);
-			setErrorMessage(null);
-		}
-		return status;
-	}
-
-	/**
-	 * Returns whether this page's controls currently all contain valid values.
-	 * 
-	 * @return <code>true</code> if all controls are valid, and
-	 *         <code>false</code> if at least one is invalid
-	 */
-	protected boolean validatePage() {
-		boolean valid = true;
-
-		if (!resourceGroup.areAllValuesValid()) {
-			// if blank name then fail silently
-			if (resourceGroup.getProblemType() == ResourceAndContainerGroup.PROBLEM_RESOURCE_EMPTY
-					|| resourceGroup.getProblemType() == ResourceAndContainerGroup.PROBLEM_CONTAINER_EMPTY) {
-				setMessage(resourceGroup.getProblemMessage());
-				setErrorMessage(null);
-			} else {
-				setErrorMessage(resourceGroup.getProblemMessage());
-			}
-			valid = false;
-		}
-
-		IStatus linkedResourceStatus = null;
-		if (valid) {
-			linkedResourceStatus = validateLinkedResource();
-			if (linkedResourceStatus.getSeverity() == IStatus.ERROR) {
-				valid = false;
-			}
-		}
-		// validateLinkedResource sets messages itself
-		if (valid
-				&& (linkedResourceStatus == null || linkedResourceStatus.isOK())) {
-			setMessage(null);
-			setErrorMessage(null);
-		}
-		return valid;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewLinkPage.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewLinkPage.java
deleted file mode 100644
index 74f8f82..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewLinkPage.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM Corporation - initial API and implementation 
- *   Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog
- * 	 	font should be activated and used by other components.
- *******************************************************************************/
-
-package org.eclipse.ui.dialogs;
-
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IPathVariableManager;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.wizard.WizardPage;
-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.Font;
-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.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.dialogs.PathVariableSelectionDialog;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.dialogs.IDEResourceInfoUtils;
-
-/**
- * Standard resource link page for a wizard that creates a file or 
- * folder resource.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @since 2.1
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class WizardNewLinkPage extends WizardPage {
-    private String initialLinkTarget;
-
-    private int type;
-
-    private boolean createLink = false;
-
-    private IContainer container;
-
-    // widgets
-    private Text linkTargetField;
-
-    private Button browseButton;
-
-    private Button variablesButton;
-
-    /**
-     * Creates a new resource link wizard page. 
-     *
-     * @param pageName the name of the page
-     * @param type specifies the type of resource to link to. 
-     * 	<code>IResource.FILE</code> or <code>IResource.FOLDER</code>
-     */
-    public WizardNewLinkPage(String pageName, int type) {
-        super(pageName);
-        this.type = type;
-        setPageComplete(true);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogPage.
-     */
-    public void createControl(Composite parent) {
-        Font font = parent.getFont();
-        initializeDialogUnits(parent);
-        // top level group
-        Composite topLevel = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 3;
-        topLevel.setLayout(layout);
-        topLevel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
-                | GridData.HORIZONTAL_ALIGN_FILL));
-        topLevel.setFont(font);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(topLevel,
-				IIDEHelpContextIds.NEW_LINK_WIZARD_PAGE);
-
-        final Button createLinkButton = new Button(topLevel, SWT.CHECK);
-        if (type == IResource.FILE) {
-			createLinkButton.setText(IDEWorkbenchMessages.WizardNewLinkPage_linkFileButton);
-		} else {
-			createLinkButton.setText(IDEWorkbenchMessages.WizardNewLinkPage_linkFolderButton);
-		}
-        createLinkButton.setSelection(createLink);
-        GridData data = new GridData();
-        data.horizontalSpan = 3;
-        createLinkButton.setLayoutData(data);
-        createLinkButton.setFont(font);
-        SelectionListener listener = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                createLink = createLinkButton.getSelection();
-                browseButton.setEnabled(createLink);
-                variablesButton.setEnabled(createLink);
-                linkTargetField.setEnabled(createLink);
-                setPageComplete(validatePage());
-            }
-        };
-        createLinkButton.addSelectionListener(listener);
-
-        createLinkLocationGroup(topLevel, createLink);
-        validatePage();
-
-        setErrorMessage(null);
-        setMessage(null);
-        setControl(topLevel);
-    }
-
-    /**
-     * Creates the link target location widgets.
-     *
-     * @param locationGroup the parent composite
-     * @param enabled sets the initial enabled state of the widgets
-     */
-    private void createLinkLocationGroup(Composite locationGroup,
-            boolean enabled) {
-        Font font = locationGroup.getFont();
-        Label fill = new Label(locationGroup, SWT.NONE);
-        GridData data = new GridData();
-        Button button = new Button(locationGroup, SWT.CHECK);
-        data.widthHint = button.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
-        button.dispose();
-        fill.setLayoutData(data);
-
-        // link target location entry field
-        linkTargetField = new Text(locationGroup, SWT.BORDER);
-        data = new GridData(GridData.FILL_HORIZONTAL);
-        linkTargetField.setLayoutData(data);
-        linkTargetField.setFont(font);
-        linkTargetField.setEnabled(enabled);
-        linkTargetField.addModifyListener(new ModifyListener() {
-            public void modifyText(ModifyEvent e) {
-                setPageComplete(validatePage());
-            }
-        });
-        if (initialLinkTarget != null) {
-            linkTargetField.setText(initialLinkTarget);
-        }
-
-        // browse button
-        browseButton = new Button(locationGroup, SWT.PUSH);
-        setButtonLayoutData(browseButton);
-        browseButton.setFont(font);
-        browseButton.setText(IDEWorkbenchMessages.WizardNewLinkPage_browseButton);
-        browseButton.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent event) {
-                handleLinkTargetBrowseButtonPressed();
-            }
-        });
-        browseButton.setEnabled(enabled);
-
-        fill = new Label(locationGroup, SWT.NONE);
-        data = new GridData();
-        data.horizontalSpan = 2;
-        fill.setLayoutData(data);
-
-        // variables button
-        variablesButton = new Button(locationGroup, SWT.PUSH);
-        setButtonLayoutData(variablesButton);
-        variablesButton.setFont(font);
-        variablesButton.setText(IDEWorkbenchMessages.WizardNewLinkPage_variablesButton);
-        variablesButton.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent event) {
-                handleVariablesButtonPressed();
-            }
-        });
-        variablesButton.setEnabled(enabled);
-    }
-
-    /**
-     * Returns the link target location entered by the user. 
-     *
-     * @return the link target location entered by the user. null if the user
-     * 	choose not to create a link.
-     */
-    public String getLinkTarget() {
-        if (createLink && linkTargetField != null
-                && linkTargetField.isDisposed() == false) {
-            return linkTargetField.getText();
-        }
-        return null;
-    }
-
-    /**
-     * Opens a file or directory browser depending on the link type.
-     */
-    private void handleLinkTargetBrowseButtonPressed() {
-        String linkTargetName = linkTargetField.getText();
-         String selection = null;
-         IFileStore store = null;
-        if (linkTargetName.length() > 0) {
-            store = IDEResourceInfoUtils.getFileStore(linkTargetName);
-            if (store == null || !store.fetchInfo().exists()) {
-            	store = null;
-            }
-        }
-        if (type == IResource.FILE) {
-            FileDialog dialog = new FileDialog(getShell());
-            if (store != null) {
-                if (store.fetchInfo().isDirectory()) {
-					dialog.setFilterPath(linkTargetName);
-				} else {
-					dialog.setFileName(linkTargetName);
-				}
-            }
-            selection = dialog.open();
-        } else {
-            DirectoryDialog dialog = new DirectoryDialog(getShell());
-            if (store != null) {
-                if (!store.fetchInfo().isDirectory()) {
-                    linkTargetName = store.getParent().getName();
-                }
-                if (linkTargetName != null) {
-                    dialog.setFilterPath(linkTargetName);
-                }
-            }
-            dialog.setMessage(IDEWorkbenchMessages.WizardNewLinkPage_targetSelectionLabel);
-            selection = dialog.open();
-        }
-        if (selection != null) {
-            linkTargetField.setText(selection);
-        }
-    }
-
-    /**
-     * Opens a path variable selection dialog
-     */
-    private void handleVariablesButtonPressed() {
-        PathVariableSelectionDialog dialog = new PathVariableSelectionDialog(
-                getShell(), type);
-
-        if (dialog.open() == IDialogConstants.OK_ID) {
-            String[] variableNames = (String[]) dialog.getResult();
-
-            if (variableNames != null) {
-                IPathVariableManager pathVariableManager = ResourcesPlugin
-                        .getWorkspace().getPathVariableManager();
-                IPath path = pathVariableManager.getValue(variableNames[0]);
-
-                if (path != null) {
-                    linkTargetField.setText(path.toOSString());
-                }
-            }
-        }
-    }
-
-    /**
-     * Sets the container to use for link validation.
-     * This should be the parent of the new resource that is being 
-     * linked.
-     *
-     * @param container the container to use for link validation.
-     */
-    public void setContainer(IContainer container) {
-        this.container = container;
-    }
-
-    /**
-     * Sets the value of the link target field
-     * 
-     * @param target the value of the link target field
-     */
-    public void setLinkTarget(String target) {
-        initialLinkTarget = target;
-        if (linkTargetField != null && linkTargetField.isDisposed() == false) {
-            linkTargetField.setText(target);
-        }
-    }
-
-    /**
-     * Validates the type of the given file against the link type specified
-     * during page creation.
-     * 
-     * @param linkTargetStore file to validate
-     * @return boolean <code>true</code> if the link target type is valid
-     * 	and <code>false</code> otherwise.
-     */
-    private boolean validateFileType(IFileStore linkTargetStore) {
-        boolean valid = true;
-
-        if (type == IResource.FILE && linkTargetStore.fetchInfo().isDirectory()) {
-            setErrorMessage(IDEWorkbenchMessages.WizardNewLinkPage_linkTargetNotFile);
-            valid = false;
-        } else if (type == IResource.FOLDER
-                && !linkTargetStore.fetchInfo().isDirectory()) {
-            setErrorMessage(IDEWorkbenchMessages.WizardNewLinkPage_linkTargetNotFolder);
-            valid = false;
-        }
-        return valid;
-    }
-
-    /**
-     * Validates the name of the link target
-     *
-     * @param linkTargetName link target name to validate
-     * @return boolean <code>true</code> if the link target name is valid
-     * 	and <code>false</code> otherwise.
-     */
-    private boolean validateLinkTargetName(String linkTargetName) {
-        boolean valid = true;
-
-        if ("".equals(linkTargetName)) {//$NON-NLS-1$
-            setErrorMessage(IDEWorkbenchMessages.WizardNewLinkPage_linkTargetEmpty);
-            valid = false;
-        } else {
-            IPath path = new Path("");//$NON-NLS-1$
-            if (path.isValidPath(linkTargetName) == false) {
-                setErrorMessage(IDEWorkbenchMessages.WizardNewLinkPage_linkTargetInvalid);
-                valid = false;
-            }
-        }
-        return valid;
-    }
-
-    /**
-     * Returns whether this page's controls currently all contain valid 
-     * values.
-     *
-     * @return <code>true</code> if all controls are valid, and
-     *   <code>false</code> if at least one is invalid
-     */
-    private boolean validatePage() {
-        boolean valid = true;
-        IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace();
-
-        if (createLink) {
-            String linkTargetName = linkTargetField.getText();
-
-            valid = validateLinkTargetName(linkTargetName);
-            if (valid) {
-                IFileStore linkTargetFile = IDEResourceInfoUtils.getFileStore(linkTargetName);
-                if (linkTargetFile == null || !linkTargetFile.fetchInfo().exists()) {
-                    setErrorMessage(IDEWorkbenchMessages.WizardNewLinkPage_linkTargetNonExistent);
-                    valid = false;
-                } else {
-                    IStatus locationStatus = workspace.validateLinkLocation(
-                            container, new Path(linkTargetName));
-
-                    if (locationStatus.isOK() == false) {
-                        setErrorMessage(IDEWorkbenchMessages.WizardNewLinkPage_linkTargetLocationInvalid);
-                        valid = false;
-                    } else {
-                        valid = validateFileType(linkTargetFile);
-                    }
-                }
-            }
-        }
-        // Avoid draw flicker by clearing error message
-        // if all is valid.
-        if (valid) {
-            setMessage(null);
-            setErrorMessage(null);
-        }
-        return valid;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewProjectCreationPage.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewProjectCreationPage.java
deleted file mode 100644
index eadf6cc..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewProjectCreationPage.java
+++ /dev/null
@@ -1,407 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jakub Jurkiewicz <jakub.jurkiewicz@gmail.com> - Fix for Bug 174737
- *     [IDE] New Plug-in Project wizard status handling is inconsistent
- *     Oakland Software Incorporated (Francis Upton) <francisu@ieee.org>
- *		    Bug 224997 [Workbench] Impossible to copy project
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import java.net.URI;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.WizardPage;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea;
-import org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea.IErrorMessageReporter;
-
-/**
- * Standard main page for a wizard that is creates a project resource.
- * <p>
- * This page may be used by clients as-is; it may be also be subclassed to suit.
- * </p>
- * <p>
- * Example usage:
- * <pre>
- * mainPage = new WizardNewProjectCreationPage("basicNewProjectPage");
- * mainPage.setTitle("Project");
- * mainPage.setDescription("Create a new project resource.");
- * </pre>
- * </p>
- */
-public class WizardNewProjectCreationPage extends WizardPage {
-
-       // initial value stores
-    private String initialProjectFieldValue;
-
-    // widgets
-    Text projectNameField;
-
-    private Listener nameModifyListener = new Listener() {
-        public void handleEvent(Event e) {
-        	setLocationForSelection();
-            boolean valid = validatePage();
-            setPageComplete(valid);
-                
-        }
-    };
-
-	private ProjectContentsLocationArea locationArea;
-
-	private WorkingSetGroup workingSetGroup;
-
-    // constants
-    private static final int SIZING_TEXT_FIELD_WIDTH = 250;
-
-    /**
-     * Creates a new project creation wizard page.
-     *
-     * @param pageName the name of this page
-     */
-    public WizardNewProjectCreationPage(String pageName) {
-    	super(pageName);
-	    setPageComplete(false);
-    }
-
-    /**
-	 * Creates a new project creation wizard page.
-	 * 
-	 * @param pageName
-	 * @param selection
-	 * @param workingSetTypes
-	 * 
-	 * @deprecated default placement of the working set group has been removed.
-	 *             If you wish to use the working set block please call
-	 *             {@link #createWorkingSetGroup(Composite, IStructuredSelection, String[])}
-	 *             in your overriden {@link #createControl(Composite)}
-	 *             implementation. This method will be removed before 3.4 ships.
-	 * @since 3.4
-	 */
-	public WizardNewProjectCreationPage(String pageName,
-			IStructuredSelection selection, String[] workingSetTypes) {
-		this(pageName);
-	}
-
-	/** (non-Javadoc)
-     * Method declared on IDialogPage.
-     */
-    public void createControl(Composite parent) {
-        Composite composite = new Composite(parent, SWT.NULL);
-    
-
-        initializeDialogUnits(parent);
-
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(composite,
-                IIDEHelpContextIds.NEW_PROJECT_WIZARD_PAGE);
-
-        composite.setLayout(new GridLayout());
-        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        createProjectNameGroup(composite);
-        locationArea = new ProjectContentsLocationArea(getErrorReporter(), composite);
-        if(initialProjectFieldValue != null) {
-			locationArea.updateProjectName(initialProjectFieldValue);
-		}
-        
-		// Scale the button based on the rest of the dialog
-		setButtonLayoutData(locationArea.getBrowseButton());
-		
-        setPageComplete(validatePage());
-        // Show description on opening
-        setErrorMessage(null);
-        setMessage(null);
-        setControl(composite);
-        Dialog.applyDialogFont(composite);
-    }
-    
-    /**
-	 * Create a working set group for this page. This method can only be called
-	 * once.
-	 * 
-	 * @param composite
-	 *            the composite in which to create the group
-	 * @param selection
-	 *            the current workbench selection
-	 * @param supportedWorkingSetTypes
-	 *            an array of working set type IDs that will restrict what types
-	 *            of working sets can be chosen in this group
-	 * @return the created group. If this method has been called previously the
-	 *         original group will be returned.
-	 * @since 3.4
-	 */
-	public WorkingSetGroup createWorkingSetGroup(Composite composite,
-			IStructuredSelection selection, String[] supportedWorkingSetTypes) {
-		if (workingSetGroup != null)
-			return workingSetGroup;
-		workingSetGroup = new WorkingSetGroup(composite, selection,
-				supportedWorkingSetTypes);
-		return workingSetGroup;
-	}
-    
-    /**
-	 * Get an error reporter for the receiver.
-	 * @return IErrorMessageReporter
-	 */
-	private IErrorMessageReporter getErrorReporter() {
-		return new IErrorMessageReporter(){
-			/* (non-Javadoc)
-			 * @see org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea.IErrorMessageReporter#reportError(java.lang.String)
-			 */
-			public void reportError(String errorMessage, boolean infoOnly) {
-				if (infoOnly) {
-					setMessage(errorMessage, IStatus.INFO);
-					setErrorMessage(null);
-				}
-				else
-					setErrorMessage(errorMessage);
-				boolean valid = errorMessage == null;
-				if(valid) {
-					valid = validatePage();
-				}
-				
-				setPageComplete(valid);
-			}
-		};
-	}
-
-    /**
-     * Creates the project name specification controls.
-     *
-     * @param parent the parent composite
-     */
-    private final void createProjectNameGroup(Composite parent) {
-        // project specification group
-        Composite projectGroup = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        projectGroup.setLayout(layout);
-        projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        // new project label
-        Label projectLabel = new Label(projectGroup, SWT.NONE);
-        projectLabel.setText(IDEWorkbenchMessages.WizardNewProjectCreationPage_nameLabel);
-        projectLabel.setFont(parent.getFont());
-
-        // new project name entry field
-        projectNameField = new Text(projectGroup, SWT.BORDER);
-        GridData data = new GridData(GridData.FILL_HORIZONTAL);
-        data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-        projectNameField.setLayoutData(data);
-        projectNameField.setFont(parent.getFont());
-
-        // Set the initial value first before listener
-        // to avoid handling an event during the creation.
-        if (initialProjectFieldValue != null) {
-			projectNameField.setText(initialProjectFieldValue);
-		}
-        projectNameField.addListener(SWT.Modify, nameModifyListener);
-    }
-
-
-    /**
-     * Returns the current project location path as entered by 
-     * the user, or its anticipated initial value.
-     * Note that if the default has been returned the path
-     * in a project description used to create a project
-     * should not be set.
-     *
-     * @return the project location path or its anticipated initial value.
-     */
-    public IPath getLocationPath() {
-        return new Path(locationArea.getProjectLocation());
-    }
-    
-    /**
-    /**
-     * Returns the current project location URI as entered by 
-     * the user, or <code>null</code> if a valid project location
-     * has not been entered.
-     *
-     * @return the project location URI, or <code>null</code>
-     * @since 3.2
-     */
-    public URI getLocationURI() {
-    	return locationArea.getProjectLocationURI();
-    }
-
-    /**
-	 * Creates a project resource handle for the current project name field
-	 * value. The project handle is created relative to the workspace root.
-	 * <p>
-	 * This method does not create the project resource; this is the
-	 * responsibility of <code>IProject::create</code> invoked by the new
-	 * project resource wizard.
-	 * </p>
-	 * 
-	 * @return the new project resource handle
-	 */
-    public IProject getProjectHandle() {
-        return ResourcesPlugin.getWorkspace().getRoot().getProject(
-                getProjectName());
-    }
-
-    /**
-     * Returns the current project name as entered by the user, or its anticipated
-     * initial value.
-     *
-     * @return the project name, its anticipated initial value, or <code>null</code>
-     *   if no project name is known
-     */
-    public String getProjectName() {
-        if (projectNameField == null) {
-			return initialProjectFieldValue;
-		}
-
-        return getProjectNameFieldValue();
-    }
-
-    /**
-     * Returns the value of the project name field
-     * with leading and trailing spaces removed.
-     * 
-     * @return the project name in the field
-     */
-    private String getProjectNameFieldValue() {
-        if (projectNameField == null) {
-			return ""; //$NON-NLS-1$
-		}
-
-        return projectNameField.getText().trim();
-    }
-
-    /**
-     * Sets the initial project name that this page will use when
-     * created. The name is ignored if the createControl(Composite)
-     * method has already been called. Leading and trailing spaces
-     * in the name are ignored.
-     * Providing the name of an existing project will not necessarily 
-     * cause the wizard to warn the user.  Callers of this method 
-     * should first check if the project name passed already exists 
-     * in the workspace.
-     * 
-     * @param name initial project name for this page
-     * 
-     * @see IWorkspace#validateName(String, int)
-     * 
-     */
-    public void setInitialProjectName(String name) {
-        if (name == null) {
-			initialProjectFieldValue = null;
-		} else {
-            initialProjectFieldValue = name.trim();
-            if(locationArea != null) {
-				locationArea.updateProjectName(name.trim());
-			}
-        }
-    }
-
-    /**
-     * Set the location to the default location if we are set to useDefaults.
-     */
-    void setLocationForSelection() {
-    	locationArea.updateProjectName(getProjectNameFieldValue());
-    }
-
-  
-    /**
-     * Returns whether this page's controls currently all contain valid 
-     * values.
-     *
-     * @return <code>true</code> if all controls are valid, and
-     *   <code>false</code> if at least one is invalid
-     */
-    protected boolean validatePage() {
-        IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace();
-
-        String projectFieldContents = getProjectNameFieldValue();
-        if (projectFieldContents.equals("")) { //$NON-NLS-1$
-            setErrorMessage(null);
-            setMessage(IDEWorkbenchMessages.WizardNewProjectCreationPage_projectNameEmpty);
-            return false;
-        }
-
-        IStatus nameStatus = workspace.validateName(projectFieldContents,
-                IResource.PROJECT);
-        if (!nameStatus.isOK()) {
-            setErrorMessage(nameStatus.getMessage());
-            return false;
-        }
-
-        IProject handle = getProjectHandle();
-        if (handle.exists()) {
-            setErrorMessage(IDEWorkbenchMessages.WizardNewProjectCreationPage_projectExistsMessage);
-            return false;
-        }
-                
-        IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
-				getProjectNameFieldValue());
-		locationArea.setExistingProject(project);
-		
-		String validLocationMessage = locationArea.checkValidLocation();
-		if (validLocationMessage != null) { // there is no destination location given
-			setErrorMessage(validLocationMessage);
-			return false;
-		}
-
-        setErrorMessage(null);
-        setMessage(null);
-        return true;
-    }
-
-    /*
-     * see @DialogPage.setVisible(boolean)
-     */
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        if (visible) {
-			projectNameField.setFocus();
-		}
-    }
-
-    /**
-     * Returns the useDefaults.
-     * @return boolean
-     */
-    public boolean useDefaults() {
-        return locationArea.isDefault();
-    }
-
-    /**
-	 * Return the selected working sets, if any. If this page is not configured
-	 * to interact with working sets this will be an empty array.
-	 * 
-	 * @return the selected working sets
-	 * @since 3.4
-	 */
-	public IWorkingSet[] getSelectedWorkingSets() {
-		return workingSetGroup == null ? new IWorkingSet[0] : workingSetGroup
-				.getSelectedWorkingSets();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewProjectReferencePage.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewProjectReferencePage.java
deleted file mode 100644
index 6dac88e..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardNewProjectReferencePage.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-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;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * Standard project reference page for a wizard that creates a 
- * project resource.
- * <p>
- * This page may be used by clients as-is; it may be also be
- * subclassed to suit.
- * </p>
- * <p>
- * Example usage:
- * <pre>
- * referencePage = new WizardNewProjectReferencePage("basicReferenceProjectPage");
- * referencePage.setTitle("Project");
- * referencePage.setDescription("Select referenced projects.");
- * </pre>
- * </p>
- */
-public class WizardNewProjectReferencePage extends WizardPage {
-    // widgets
-    private CheckboxTableViewer referenceProjectsViewer;
-
-    private static final String REFERENCED_PROJECTS_TITLE = IDEWorkbenchMessages.WizardNewProjectReferences_title;
-
-    private static final int PROJECT_LIST_MULTIPLIER = 15;
-
-    /**
-     * Creates a new project reference wizard page.
-     *
-     * @param pageName the name of this page
-     */
-    public WizardNewProjectReferencePage(String pageName) {
-        super(pageName);
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IDialogPage.
-     */
-    public void createControl(Composite parent) {
-
-        Font font = parent.getFont();
-
-        Composite composite = new Composite(parent, SWT.NONE);
-        composite.setLayout(new GridLayout());
-        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        composite.setFont(font);
-
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(composite,
-                IIDEHelpContextIds.NEW_PROJECT_REFERENCE_WIZARD_PAGE);
-
-        Label referenceLabel = new Label(composite, SWT.NONE);
-        referenceLabel.setText(REFERENCED_PROJECTS_TITLE);
-        referenceLabel.setFont(font);
-
-        referenceProjectsViewer = CheckboxTableViewer.newCheckList(composite,
-                SWT.BORDER);
-        referenceProjectsViewer.getTable().setFont(composite.getFont());
-        GridData data = new GridData();
-        data.horizontalAlignment = GridData.FILL;
-        data.grabExcessHorizontalSpace = true;
-
-        data.heightHint = getDefaultFontHeight(referenceProjectsViewer
-                .getTable(), PROJECT_LIST_MULTIPLIER);
-        referenceProjectsViewer.getTable().setLayoutData(data);
-        referenceProjectsViewer.setLabelProvider(WorkbenchLabelProvider
-                .getDecoratingWorkbenchLabelProvider());
-        referenceProjectsViewer.setContentProvider(getContentProvider());
-        referenceProjectsViewer.setComparator(new ViewerComparator());
-        referenceProjectsViewer.setInput(ResourcesPlugin.getWorkspace());
-
-        setControl(composite);
-    }
-
-    /**
-     * Returns a content provider for the reference project
-     * viewer. It will return all projects in the workspace.
-     *
-     * @return the content provider
-     */
-    protected IStructuredContentProvider getContentProvider() {
-        return new WorkbenchContentProvider() {
-            public Object[] getChildren(Object element) {
-                if (!(element instanceof IWorkspace)) {
-					return new Object[0];
-				}
-                IProject[] projects = ((IWorkspace) element).getRoot()
-                        .getProjects();
-                return projects == null ? new Object[0] : projects;
-            }
-        };
-    }
-
-    /**
-     * Get the defualt widget height for the supplied control.
-     * @return int
-     * @param control - the control being queried about fonts
-     * @param lines - the number of lines to be shown on the table.
-     */
-    private static int getDefaultFontHeight(Control control, int lines) {
-        FontData[] viewerFontData = control.getFont().getFontData();
-        int fontHeight = 10;
-
-        //If we have no font data use our guess
-        if (viewerFontData.length > 0) {
-			fontHeight = viewerFontData[0].getHeight();
-		}
-        return lines * fontHeight;
-
-    }
-
-    /**
-     * Returns the referenced projects selected by the user.
-     *
-     * @return the referenced projects
-     */
-    public IProject[] getReferencedProjects() {
-        Object[] elements = referenceProjectsViewer.getCheckedElements();
-        IProject[] projects = new IProject[elements.length];
-        System.arraycopy(elements, 0, projects, 0, elements.length);
-        return projects;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardResourceImportPage.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardResourceImportPage.java
deleted file mode 100644
index c190a67..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/dialogs/WizardResourceImportPage.java
+++ /dev/null
@@ -1,591 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Martin Boyle <martingboyle@gmail.com> - Fix for 
- *     		Bug 183013 [Wizards] Error importing into linked EFS folder - "undefined path variable"
- *******************************************************************************/
-package org.eclipse.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.Map;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.internal.ide.DialogUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.dialogs.IElementFilter;
-import org.eclipse.ui.internal.ide.dialogs.ResourceTreeAndListGroup;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.model.WorkbenchViewerComparator;
-
-/**
- * The abstract superclass for a typical import wizard's main page.
- * <p>
- * Clients may subclass this page to inherit its common destination resource
- * selection facilities.
- * </p>
- * <p>
- * Subclasses must implement 
- * <ul>
- *   <li><code>createSourceGroup</code></li>
- * </ul>
- * </p>
- * <p>
- * Subclasses may override
- * <ul>
- *   <li><code>allowNewContainerName</code></li>
- * </ul>
- * </p>
- * <p>
- * Subclasses may extend
- * <ul>
- *   <li><code>handleEvent</code></li>
- * </ul>
- * </p>
- */
-public abstract class WizardResourceImportPage extends WizardDataTransferPage {
-    private IResource currentResourceSelection;
-
-    // initial value stores
-    private String initialContainerFieldValue;
-
-    protected java.util.List selectedTypes = new ArrayList();
-
-    // widgets
-    private Text containerNameField;
-
-    private Button containerBrowseButton;
-
-    /**
-	 * The <code>selectionGroup</code> field should have been created with a
-	 * private modifier. Subclasses should not access this field directly.
-	 */
-    protected ResourceTreeAndListGroup selectionGroup;
-
-    //messages
-    private static final String EMPTY_FOLDER_MESSAGE = IDEWorkbenchMessages.WizardImportPage_specifyFolder;
-
-    private static final String EMPTY_PROJECT_MESSAGE = IDEWorkbenchMessages.WizardImportPage_specifyProject;
-    
-    private static final String INACCESSABLE_FOLDER_MESSAGE = IDEWorkbenchMessages.WizardImportPage_folderMustExist;
-
-    /**
-     * Creates an import wizard page. If the initial resource selection 
-     * contains exactly one container resource then it will be used as the default
-     * import destination.
-     *
-     * @param name the name of the page
-     * @param selection the current resource selection
-     */
-    protected WizardResourceImportPage(String name,
-            IStructuredSelection selection) {
-        super(name);
-
-        //Initialize to null
-        currentResourceSelection = null;
-        if (selection.size() == 1) {
-            Object firstElement = selection.getFirstElement();
-            if (firstElement instanceof IAdaptable) {
-                Object resource = ((IAdaptable) firstElement)
-                        .getAdapter(IResource.class);
-                if (resource != null) {
-					currentResourceSelection = (IResource) resource;
-				}
-            }
-        }
-
-        if (currentResourceSelection != null) {
-            if (currentResourceSelection.getType() == IResource.FILE) {
-				currentResourceSelection = currentResourceSelection.getParent();
-			}
-
-            if (!currentResourceSelection.isAccessible()) {
-				currentResourceSelection = null;
-			}
-        }
-
-    }
-
-    /**
-     * The <code>WizardResourceImportPage</code> implementation of this 
-     * <code>WizardDataTransferPage</code> method returns <code>true</code>. 
-     * Subclasses may override this method.
-     */
-    protected boolean allowNewContainerName() {
-        return true;
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IDialogPage.
-     */
-    public void createControl(Composite parent) {
-
-        initializeDialogUnits(parent);
-
-        Composite composite = new Composite(parent, SWT.NULL);
-        composite.setLayout(new GridLayout());
-        composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
-                | GridData.HORIZONTAL_ALIGN_FILL));
-        composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
-        composite.setFont(parent.getFont());
-
-        createSourceGroup(composite);
-
-        createDestinationGroup(composite);
-
-        createOptionsGroup(composite);
-
-        restoreWidgetValues();
-        updateWidgetEnablements();
-        setPageComplete(determinePageCompletion());
-        setErrorMessage(null);	// should not initially have error message
-
-        setControl(composite);
-    }
-
-    /**
-     * Creates the import destination specification controls.
-     *
-     * @param parent the parent control
-     */
-    protected final void createDestinationGroup(Composite parent) {
-        // container specification group
-        Composite containerGroup = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 3;
-        containerGroup.setLayout(layout);
-        containerGroup.setLayoutData(new GridData(
-                GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
-        containerGroup.setFont(parent.getFont());
-
-        // container label
-        Label resourcesLabel = new Label(containerGroup, SWT.NONE);
-        resourcesLabel.setText(IDEWorkbenchMessages.WizardImportPage_folder);
-        resourcesLabel.setFont(parent.getFont());
-
-        // container name entry field
-        containerNameField = new Text(containerGroup, SWT.SINGLE | SWT.BORDER);
-        containerNameField.addListener(SWT.Modify, this);
-        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-                | GridData.GRAB_HORIZONTAL);
-        data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-        containerNameField.setLayoutData(data);
-        containerNameField.setFont(parent.getFont());
-
-        // container browse button
-        containerBrowseButton = new Button(containerGroup, SWT.PUSH);
-        containerBrowseButton.setText(IDEWorkbenchMessages.WizardImportPage_browse2);
-        containerBrowseButton.setLayoutData(new GridData(
-                GridData.HORIZONTAL_ALIGN_FILL));
-        containerBrowseButton.addListener(SWT.Selection, this);
-        containerBrowseButton.setFont(parent.getFont());
-        setButtonLayoutData(containerBrowseButton);
-
-        initialPopulateContainerField();
-    }
-
-    /**
-     *	Create the import source selection widget
-     */
-    protected void createFileSelectionGroup(Composite parent) {
-
-        //Just create with a dummy root.
-        this.selectionGroup = new ResourceTreeAndListGroup(parent,
-                new FileSystemElement("Dummy", null, true),//$NON-NLS-1$
-                getFolderProvider(), new WorkbenchLabelProvider(),
-                getFileProvider(), new WorkbenchLabelProvider(), SWT.NONE,
-                DialogUtil.inRegularFontMode(parent));
-
-        ICheckStateListener listener = new ICheckStateListener() {
-            public void checkStateChanged(CheckStateChangedEvent event) {
-                updateWidgetEnablements();
-            }
-        };
-
-        WorkbenchViewerComparator comparator = new WorkbenchViewerComparator();
-        this.selectionGroup.setTreeComparator(comparator);
-        this.selectionGroup.setListComparator(comparator);
-        this.selectionGroup.addCheckStateListener(listener);
-
-    }
-
-    /**
-     * Creates the import source specification controls.
-     * <p>
-     * Subclasses must implement this method.
-     * </p>
-     *
-     * @param parent the parent control
-     */
-    protected abstract void createSourceGroup(Composite parent);
-
-    /*
-     * @see WizardDataTransferPage.getErrorDialogTitle()
-     */
-    protected String getErrorDialogTitle() {
-        return IDEWorkbenchMessages.WizardImportPage_errorDialogTitle;
-    }
-
-    /**
-     * Returns the path of the container resource specified in the container
-     * name entry field, or <code>null</code> if no name has been typed in.
-     * <p>
-     * The container specified by the full path might not exist and would need to
-     * be created.
-     * </p>
-     *
-     * @return the full path of the container resource specified in
-     *   the container name entry field, or <code>null</code>
-     */
-    protected IPath getContainerFullPath() {
-        IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace();
-
-        //make the path absolute to allow for optional leading slash
-        IPath testPath = getResourcePath();
-
-        if (testPath.equals(workspace.getRoot().getFullPath())) {
-			return testPath;
-		}
-
-        IStatus result = workspace.validatePath(testPath.toString(),
-                IResource.PROJECT | IResource.FOLDER | IResource.ROOT);
-        if (result.isOK()) {
-            return testPath;
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns a content provider for <code>FileSystemElement</code>s that returns 
-     * only files as children.
-     */
-    protected abstract ITreeContentProvider getFileProvider();
-
-    /**
-     * Returns a content provider for <code>FileSystemElement</code>s that returns 
-     * only folders as children.
-     */
-    protected abstract ITreeContentProvider getFolderProvider();
-
-    /**
-     * Return the path for the resource field.
-     * @return IPath
-     */
-    protected IPath getResourcePath() {
-        return getPathFromText(this.containerNameField);
-    }
-
-    /**
-     * Returns this page's list of currently-specified resources to be 
-     * imported. This is the primary resource selection facility accessor for 
-     * subclasses.
-     *
-     * @return a list of resources currently selected 
-     * for export (element type: <code>IResource</code>)
-     */
-    protected java.util.List getSelectedResources() {
-        return this.selectionGroup.getAllCheckedListItems();
-    }
-
-    /**
-     * Returns this page's list of currently-specified resources to be 
-     * imported filtered by the IElementFilter.
-     *
-     */
-    protected void getSelectedResources(IElementFilter filter,
-            IProgressMonitor monitor) throws InterruptedException {
-        this.selectionGroup.getAllCheckedListItems(filter, monitor);
-    }
-
-    /**
-     * Returns the container resource specified in the container name entry field,
-     * or <code>null</code> if such a container does not exist in the workbench.
-     *
-     * @return the container resource specified in the container name entry field,
-     *   or <code>null</code>
-     */
-    protected IContainer getSpecifiedContainer() {
-        IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace();
-        IPath path = getContainerFullPath();
-        if (workspace.getRoot().exists(path)){
-        	IResource resource = workspace.getRoot().findMember(path);
-        	if(resource.getType() == IResource.FILE) {
-				return null;
-			}
-        	return (IContainer) resource;
-        	
-        }
-            
-
-        return null;
-    }
-
-    /**
-     * Returns a collection of the currently-specified resource types for
-     * use by the type selection dialog.
-     */
-    protected java.util.List getTypesToImport() {
-
-        return selectedTypes;
-    }
-
-    /**
-     * Opens a container selection dialog and displays the user's subsequent
-     * container resource selection in this page's container name field.
-     */
-    protected void handleContainerBrowseButtonPressed() {
-        // see if the user wishes to modify this container selection
-        IPath containerPath = queryForContainer(getSpecifiedContainer(),
-                IDEWorkbenchMessages.WizardImportPage_selectFolderLabel,
-                IDEWorkbenchMessages.WizardImportPage_selectFolderTitle);
-
-        // if a container was selected then put its name in the container name field
-        if (containerPath != null) { // null means user cancelled
-            setErrorMessage(null);
-            containerNameField.setText(containerPath.makeRelative().toString());
-        }
-    }
-
-    /**
-     * The <code>WizardResourceImportPage</code> implementation of this 
-     * <code>Listener</code> method handles all events and enablements for controls
-     * on this page. Subclasses may extend.
-     * @param event Event
-     */
-    public void handleEvent(Event event) {
-        Widget source = event.widget;
-
-        if (source == containerBrowseButton) {
-			handleContainerBrowseButtonPressed();
-		}
-
-        updateWidgetEnablements();
-    }
-
-    /**
-     *	Open a registered type selection dialog and note the selections
-     *	in the receivers types-to-export field
-     */
-    protected void handleTypesEditButtonPressed() {
-
-        TypeFilteringDialog dialog = new TypeFilteringDialog(getContainer()
-                .getShell(), getTypesToImport());
-
-        dialog.open();
-
-        Object[] newSelectedTypes = dialog.getResult();
-        if (newSelectedTypes != null) { // ie.- did not press Cancel
-            this.selectedTypes = new ArrayList(newSelectedTypes.length);
-            for (int i = 0; i < newSelectedTypes.length; i++) {
-				this.selectedTypes.add(newSelectedTypes[i]);
-			}
-
-            setupSelectionsBasedOnSelectedTypes();
-        }
-
-    }
-
-    /**
-     * Sets the initial contents of the container name field.
-     */
-    protected final void initialPopulateContainerField() {
-        if (initialContainerFieldValue != null) {
-			containerNameField.setText(initialContainerFieldValue);
-		} else if (currentResourceSelection != null) {
-			containerNameField.setText(currentResourceSelection.getFullPath()
-                    .makeRelative().toString());
-		}
-    }
-
-    /**
-     * Set all of the selections in the selection group to value
-     * @param value boolean
-     */
-    protected void setAllSelections(boolean value) {
-        selectionGroup.setAllSelections(value);
-    }
-
-    /**
-     * Sets the value of this page's container resource field, or stores
-     * it for future use if this page's controls do not exist yet.
-     *
-     * @param value String
-     */
-    public void setContainerFieldValue(String value) {
-        if (containerNameField == null) {
-			initialContainerFieldValue = value;
-		} else {
-			containerNameField.setText(value);
-		}
-    }
-
-    /**
-     * Update the tree to only select those elements that match the selected types.
-     * Do nothing by default.
-     */
-    protected void setupSelectionsBasedOnSelectedTypes() {
-    }
-
-    /**
-     * Update the selections with those in map .
-     * @param map Map - key tree elements, values Lists of list elements
-     */
-    protected void updateSelections(final Map map) {
-
-        Runnable runnable = new Runnable() {
-            public void run() {
-                selectionGroup.updateSelections(map);
-            }
-        };
-
-        BusyIndicator.showWhile(getShell().getDisplay(), runnable);
-    }
-
-    /**
-     * Check if widgets are enabled or disabled by a change in the dialog.
-     */
-    protected void updateWidgetEnablements() {
-
-        boolean pageComplete = determinePageCompletion();
-        setPageComplete(pageComplete);
-        if (pageComplete) {
-			setMessage(null);
-		}
-        super.updateWidgetEnablements();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WizardDataTransferPage.
-     */
-    protected final boolean validateDestinationGroup() {
-
-        IPath containerPath = getContainerFullPath();
-        if (containerPath == null) {
-            setMessage(EMPTY_FOLDER_MESSAGE);
-            return false;
-        }
-
-        // If the container exist, validate it
-        IContainer container = getSpecifiedContainer();
-        if (container == null) {
-        	//If it exists but is not valid then abort
-        	if(IDEWorkbenchPlugin.getPluginWorkspace().getRoot().exists(getContainerFullPath())) {
-				return false;
-			}
-        	
-            //if it is does not exist be sure the project does
-            IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace();
-            IPath projectPath = containerPath.removeLastSegments(containerPath
-                    .segmentCount() - 1);
-
-            if (workspace.getRoot().exists(projectPath)) {
-				return true;
-			}
-            setErrorMessage(IDEWorkbenchMessages.WizardImportPage_projectNotExist);
-            return false;
-        } 
-        if (!container.isAccessible()) {
-             setErrorMessage(INACCESSABLE_FOLDER_MESSAGE);
-             return false;
-        }
-        if (container.getLocationURI() == null) {
-          if (container.isLinked()) {
-               setErrorMessage(IDEWorkbenchMessages.WizardImportPage_undefinedPathVariable);
-          } else {
-               setErrorMessage(IDEWorkbenchMessages.WizardImportPage_containerNotExist);
-          }
-         return false;
-        }
-        
-
-        if (sourceConflictsWithDestination(containerPath)) {
-            setErrorMessage(getSourceConflictMessage());
-            return false;
-        }
-
-        if (container instanceof IWorkspaceRoot){
-        	setErrorMessage(EMPTY_PROJECT_MESSAGE);
-        	return false;
-        }
-        return true;
-
-    }
-
-    /**
-     * Returns the error message for when the source conflicts
-     * with the destination.
-     */
-    protected final String getSourceConflictMessage() {
-        return (IDEWorkbenchMessages.WizardImportPage_importOnReceiver);
-    }
-
-    /**
-     * Returns whether or not the source location conflicts
-     * with the destination resource. By default this is not
-     * checked, so <code>false</code> is returned.
-     * 
-     * @param sourcePath the path being checked
-     * @return <code>true</code> if the source location conflicts with the
-     *   destination resource, <code>false</code> if not
-     */
-    protected boolean sourceConflictsWithDestination(IPath sourcePath) {
-        return false;
-    }
-
-    /*
-     * @see WizardDataTransferPage.determinePageCompletion.
-     */
-    protected boolean determinePageCompletion() {
-        //Check for valid projects before making the user do anything 
-        if (noOpenProjects()) {
-            setErrorMessage(IDEWorkbenchMessages.WizardImportPage_noOpenProjects);
-            return false;
-        }
-        return super.determinePageCompletion();
-    }
-
-    /**
-     * Returns whether or not the passed workspace has any 
-     * open projects
-     * @return boolean
-     */
-    private boolean noOpenProjects() {
-        IProject[] projects = IDEWorkbenchPlugin.getPluginWorkspace().getRoot()
-                .getProjects();
-        for (int i = 0; i < projects.length; i++) {
-            if (projects[i].isOpen()) {
-				return false;
-			}
-        }
-        return true;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/model/WorkbenchContentProvider.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/model/WorkbenchContentProvider.java
deleted file mode 100644
index 1175160..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/model/WorkbenchContentProvider.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.model;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IContainer;
-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.IWorkspace;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * Tree content provider for resource objects that can be adapted to the
- * interface {@link org.eclipse.ui.model.IWorkbenchAdapter IWorkbenchAdapter}.
- * This provider will listen for resource changes within the workspace and
- * update the viewer as necessary.
- * <p>
- * This class may be instantiated, or subclassed by clients.
- * </p>
- */
-public class WorkbenchContentProvider extends BaseWorkbenchContentProvider
-		implements IResourceChangeListener {
-	private Viewer viewer;
-
-	/**
-	 * Creates the resource content provider.
-	 */
-	public WorkbenchContentProvider() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContentProvider.
-	 */
-	public void dispose() {
-		if (viewer != null) {
-			IWorkspace workspace = null;
-			Object obj = viewer.getInput();
-			if (obj instanceof IWorkspace) {
-				workspace = (IWorkspace) obj;
-			} else if (obj instanceof IContainer) {
-				workspace = ((IContainer) obj).getWorkspace();
-			}
-			if (workspace != null) {
-				workspace.removeResourceChangeListener(this);
-			}
-		}
-
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IContentProvider.
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		super.inputChanged(viewer, oldInput, newInput);
-
-		this.viewer = viewer;
-		IWorkspace oldWorkspace = null;
-		IWorkspace newWorkspace = null;
-
-		if (oldInput instanceof IWorkspace) {
-			oldWorkspace = (IWorkspace) oldInput;
-		} else if (oldInput instanceof IContainer) {
-			oldWorkspace = ((IContainer) oldInput).getWorkspace();
-		}
-
-		if (newInput instanceof IWorkspace) {
-			newWorkspace = (IWorkspace) newInput;
-		} else if (newInput instanceof IContainer) {
-			newWorkspace = ((IContainer) newInput).getWorkspace();
-		}
-
-		if (oldWorkspace != newWorkspace) {
-			if (oldWorkspace != null) {
-				oldWorkspace.removeResourceChangeListener(this);
-			}
-			if (newWorkspace != null) {
-				newWorkspace.addResourceChangeListener(this,
-						IResourceChangeEvent.POST_CHANGE);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IResourceChangeListener.
-	 */
-	public final void resourceChanged(final IResourceChangeEvent event) {
-
-		processDelta(event.getDelta());
-
-	}
-
-	/**
-	 * Process the resource delta.
-	 * 
-	 * @param delta
-	 */
-	protected void processDelta(IResourceDelta delta) {		
-
-		Control ctrl = viewer.getControl();
-		if (ctrl == null || ctrl.isDisposed()) {
-			return;
-		}
-		
-		
-		final Collection runnables = new ArrayList();
-		processDelta(delta, runnables);
-
-		if (runnables.isEmpty()) {
-			return;
-		}
-
-		//Are we in the UIThread? If so spin it until we are done
-		if (ctrl.getDisplay().getThread() == Thread.currentThread()) {
-			runUpdates(runnables);
-		} else {
-			ctrl.getDisplay().asyncExec(new Runnable(){
-				/* (non-Javadoc)
-				 * @see java.lang.Runnable#run()
-				 */
-				public void run() {
-					//Abort if this happens after disposes
-					Control ctrl = viewer.getControl();
-					if (ctrl == null || ctrl.isDisposed()) {
-						return;
-					}
-					
-					runUpdates(runnables);
-				}
-			});
-		}
-
-	}
-
-	/**
-	 * Run all of the runnables that are the widget updates
-	 * @param runnables
-	 */
-	private void runUpdates(Collection runnables) {
-		Iterator runnableIterator = runnables.iterator();
-		while(runnableIterator.hasNext()){
-			((Runnable)runnableIterator.next()).run();
-		}
-		
-	}
-
-	/**
-	 * Process a resource delta. Add any runnables
-	 */
-	private void processDelta(IResourceDelta delta, Collection runnables) {
-		//he widget may have been destroyed
-		// by the time this is run. Check for this and do nothing if so.
-		Control ctrl = viewer.getControl();
-		if (ctrl == null || ctrl.isDisposed()) {
-			return;
-		}
-
-		// Get the affected resource
-		final IResource resource = delta.getResource();
-	
-		// If any children have changed type, just do a full refresh of this
-		// parent,
-		// since a simple update on such children won't work,
-		// and trying to map the change to a remove and add is too dicey.
-		// The case is: folder A renamed to existing file B, answering yes to
-		// overwrite B.
-		IResourceDelta[] affectedChildren = delta
-				.getAffectedChildren(IResourceDelta.CHANGED);
-		for (int i = 0; i < affectedChildren.length; i++) {
-			if ((affectedChildren[i].getFlags() & IResourceDelta.TYPE) != 0) {
-				runnables.add(getRefreshRunnable(resource));
-				return;
-			}
-		}
-
-		// Opening a project just affects icon, but we need to refresh when
-		// a project is closed because if child items have not yet been created
-		// in the tree we still need to update the item's children
-		int changeFlags = delta.getFlags();
-		if ((changeFlags & IResourceDelta.OPEN) != 0) {
-			if (resource.isAccessible())  {
-				runnables.add(getUpdateRunnable(resource));
-			} else {
-				runnables.add(getRefreshRunnable(resource));
-				return;
-			}
-		}
-		// Check the flags for changes the Navigator cares about.
-		// See ResourceLabelProvider for the aspects it cares about.
-		// Notice we don't care about F_CONTENT or F_MARKERS currently.
-		if ((changeFlags & (IResourceDelta.SYNC
-				| IResourceDelta.TYPE | IResourceDelta.DESCRIPTION)) != 0) {
-			runnables.add(getUpdateRunnable(resource));
-		}
-		// Replacing a resource may affect its label and its children
-		if ((changeFlags & IResourceDelta.REPLACED) != 0) {
-			runnables.add(getRefreshRunnable(resource));
-			return;
-		}
-
-		// Handle changed children .
-		for (int i = 0; i < affectedChildren.length; i++) {
-			processDelta(affectedChildren[i], runnables);
-		}
-
-		// @issue several problems here:
-		//  - should process removals before additions, to avoid multiple equal
-		// elements in viewer
-		//   - Kim: processing removals before additions was the indirect cause of
-		// 44081 and its varients
-		//   - Nick: no delta should have an add and a remove on the same element,
-		// so processing adds first is probably OK
-		//  - using setRedraw will cause extra flashiness
-		//  - setRedraw is used even for simple changes
-		//  - to avoid seeing a rename in two stages, should turn redraw on/off
-		// around combined removal and addition
-		//   - Kim: done, and only in the case of a rename (both remove and add
-		// changes in one delta).
-
-		IResourceDelta[] addedChildren = delta
-				.getAffectedChildren(IResourceDelta.ADDED);
-		IResourceDelta[] removedChildren = delta
-				.getAffectedChildren(IResourceDelta.REMOVED);
-
-		if (addedChildren.length == 0 && removedChildren.length == 0) {
-			return;
-		}
-
-		final Object[] addedObjects;
-		final Object[] removedObjects;
-
-		// Process additions before removals as to not cause selection
-		// preservation prior to new objects being added
-		// Handle added children. Issue one update for all insertions.
-		int numMovedFrom = 0;
-		int numMovedTo = 0;
-		if (addedChildren.length > 0) {
-			addedObjects = new Object[addedChildren.length];
-			for (int i = 0; i < addedChildren.length; i++) {
-				addedObjects[i] = addedChildren[i].getResource();
-				if ((addedChildren[i].getFlags() & IResourceDelta.MOVED_FROM) != 0) {
-					++numMovedFrom;
-				}
-			}
-		} else {
-			addedObjects = new Object[0];
-		}
-
-		// Handle removed children. Issue one update for all removals.
-		if (removedChildren.length > 0) {
-			removedObjects = new Object[removedChildren.length];
-			for (int i = 0; i < removedChildren.length; i++) {
-				removedObjects[i] = removedChildren[i].getResource();
-				if ((removedChildren[i].getFlags() & IResourceDelta.MOVED_TO) != 0) {
-					++numMovedTo;
-				}
-			}
-		} else {
-			removedObjects = new Object[0];
-		}
-		// heuristic test for items moving within same folder (i.e. renames)
-		final boolean hasRename = numMovedFrom > 0 && numMovedTo > 0;
-		
-		Runnable addAndRemove = new Runnable(){
-			public void run() {
-				if (viewer instanceof AbstractTreeViewer) {
-					AbstractTreeViewer treeViewer = (AbstractTreeViewer) viewer;
-					// Disable redraw until the operation is finished so we don't
-					// get a flash of both the new and old item (in the case of
-					// rename)
-					// Only do this if we're both adding and removing files (the
-					// rename case)
-					if (hasRename) {
-						treeViewer.getControl().setRedraw(false);
-					}
-					try {
-						if (addedObjects.length > 0) {
-							treeViewer.add(resource, addedObjects);
-						}
-						if (removedObjects.length > 0) {
-							treeViewer.remove(removedObjects);
-						}
-					}
-					finally {
-						if (hasRename) {
-							treeViewer.getControl().setRedraw(true);
-						}
-					}
-				} else {
-					((StructuredViewer) viewer).refresh(resource);
-				}
-			}
-		};
-		runnables.add(addAndRemove);
-	}
-	/**
-	 * Return a runnable for refreshing a resource.
-	 * @param resource
-	 * @return Runnable
-	 */
-	private Runnable getRefreshRunnable(final IResource resource) {
-		return new Runnable(){
-			public void run() {
-				((StructuredViewer) viewer).refresh(resource);
-			}
-		};
-	}
-
-		/**
-		 * Return a runnable for refreshing a resource.
-		 * @param resource
-		 * @return Runnable
-		 */
-		private Runnable getUpdateRunnable(final IResource resource) {
-			return new Runnable(){
-				public void run() {
-					((StructuredViewer) viewer).update(resource, null);
-				}
-			};
-		}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/FileEditorInput.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/FileEditorInput.java
deleted file mode 100644
index 823a50c..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/FileEditorInput.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.part;
-
-import java.net.URI;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.core.runtime.content.IContentType;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IStorage;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPathEditorInput;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.IURIEditorInput;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-/**
- * Adapter for making a file resource a suitable input for an editor.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class FileEditorInput extends PlatformObject implements IFileEditorInput, IPathEditorInput, IURIEditorInput,
-		IPersistableElement {
-	private IFile file;
-	
-	/**
-	 * Return whether or not file is local. Only {@link IFile}s with a local
-	 * value should call {@link IPathEditorInput#getPath()}
-	 * @param file
-	 * @return boolean <code>true</code> if the file has a local implementation.
-	 * @since 3.4
-	 */
-	public static boolean isLocalFile(IFile file){
-
-		IPath location = file.getLocation();
-		if (location != null)
-			return true;
-		//this is not a local file, so try to obtain a local file
-		try {
-	        final URI locationURI = file.getLocationURI();
-	        if (locationURI == null)
-	           return false;
-	        IFileStore store = EFS.getStore(locationURI);
-			//first try to obtain a local file directly fo1r this store
-			java.io.File localFile = store.toLocalFile(EFS.NONE, null);
-			//if no local file is available, obtain a cached file
-			if (localFile == null)
-				localFile = store.toLocalFile(EFS.CACHE, null);
-			if (localFile == null)
-				return false;
-			return true;
-		} catch (CoreException e) {
-			//this can only happen if the file system is not available for this scheme
-			IDEWorkbenchPlugin.log(
-					"Failed to obtain file store for resource", e); //$NON-NLS-1$
-			return false;
-		}
-	
-	}
-
-	/**
-	 * Creates an editor input based of the given file resource.
-	 *
-	 * @param file the file resource
-	 */
-	public FileEditorInput(IFile file) {
-		if (file == null)
-			throw new IllegalArgumentException();
-		this.file = file;
-	
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on Object.
-	 */
-	public int hashCode() {
-		return file.hashCode();
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on Object.
-	 *
-	 * The <code>FileEditorInput</code> implementation of this <code>Object</code>
-	 * method bases the equality of two <code>FileEditorInput</code> objects on the
-	 * equality of their underlying <code>IFile</code> resources.
-	 */
-	public boolean equals(Object obj) {
-		if (this == obj) {
-			return true;
-		}
-		if (!(obj instanceof IFileEditorInput)) {
-			return false;
-		}
-		IFileEditorInput other = (IFileEditorInput) obj;
-		return file.equals(other.getFile());
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on IEditorInput.
-	 */
-	public boolean exists() {
-		return file.exists();
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on IPersistableElement.
-	 */
-	public String getFactoryId() {
-		return FileEditorInputFactory.getFactoryId();
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on IFileEditorInput.
-	 */
-	public IFile getFile() {
-		return file;
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on IEditorInput.
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		IContentType contentType = IDE.getContentType(file);
-		return PlatformUI.getWorkbench().getEditorRegistry()
-				.getImageDescriptor(file.getName(), contentType);
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on IEditorInput.
-	 */
-	public String getName() {
-		return file.getName();
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on IEditorInput.
-	 */
-	public IPersistableElement getPersistable() {
-		return this;
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on IStorageEditorInput.
-	 */
-	public IStorage getStorage() {
-		return file;
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on IEditorInput.
-	 */
-	public String getToolTipText() {
-		return file.getFullPath().makeRelative().toString();
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on IPersistableElement.
-	 */
-	public void saveState(IMemento memento) {
-		FileEditorInputFactory.saveState(memento, this);
-	}
-
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IURIEditorInput#getURI()
-	 */
-	public URI getURI() {
-		return file.getLocationURI();
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPathEditorInput#getPath()
-	 */
-	public IPath getPath() {
-		IPath location = file.getLocation();
-		if (location != null)
-			return location;
-		//this is not a local file, so try to obtain a local file
-		try {
-	        final URI locationURI = file.getLocationURI();
-	        if (locationURI == null)
-	           throw new IllegalArgumentException();
-	        IFileStore store = EFS.getStore(locationURI);
-			//first try to obtain a local file directly fo1r this store
-			java.io.File localFile = store.toLocalFile(EFS.NONE, null);
-			//if no local file is available, obtain a cached file
-			if (localFile == null)
-				localFile = store.toLocalFile(EFS.CACHE, null);
-			if (localFile == null)
-				throw new IllegalArgumentException();
-			return Path.fromOSString(localFile.getAbsolutePath());
-		} catch (CoreException e) {
-			//this can only happen if the file system is not available for this scheme
-			IDEWorkbenchPlugin.log(
-					"Failed to obtain file store for resource", e); //$NON-NLS-1$
-			throw new RuntimeException(e);
-		}
-	}
-
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return getClass().getName() + "(" + getFile().getFullPath() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-	/*
-	 * Allows for the return of an {@link IWorkbenchAdapter} adapter.
-	 * 
-	 * @since 3.5
-	 * 
-	 * @see org.eclipse.core.runtime.PlatformObject#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (IWorkbenchAdapter.class.equals(adapter)) {
-			return new IWorkbenchAdapter() {
-
-				public Object[] getChildren(Object o) {
-					return new Object[0];
-				}
-
-				public ImageDescriptor getImageDescriptor(Object object) {
-					return FileEditorInput.this.getImageDescriptor();
-				}
-
-				public String getLabel(Object o) {
-					return FileEditorInput.this.getName();
-				}
-
-				public Object getParent(Object o) {
-					return FileEditorInput.this.getFile().getParent();
-				}
-			};
-		}
-
-		return super.getAdapter(adapter);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/FileEditorInputFactory.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/FileEditorInputFactory.java
deleted file mode 100644
index 4990845..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/FileEditorInputFactory.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.part;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.ui.IElementFactory;
-import org.eclipse.ui.IMemento;
-
-/**
- * Factory for saving and restoring a <code>FileEditorInput</code>.
- * The stored representation of a <code>FileEditorInput</code> remembers
- * the full path of the file (that is, <code>IFile.getFullPath</code>).
- * <p>
- * The workbench will automatically create instances of this class as required.
- * It is not intended to be instantiated or subclassed by the client.
- * </p>
- * @noinstantiate This class is not intended to be instantiated by clients.
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class FileEditorInputFactory implements IElementFactory {
-    /**
-     * Factory id. The workbench plug-in registers a factory by this name
-     * with the "org.eclipse.ui.elementFactories" extension point.
-     */
-    private static final String ID_FACTORY = "org.eclipse.ui.part.FileEditorInputFactory"; //$NON-NLS-1$
-
-    /**
-     * Tag for the IFile.fullPath of the file resource.
-     */
-    private static final String TAG_PATH = "path"; //$NON-NLS-1$
-
-    /**
-     * Creates a new factory.
-     */
-    public FileEditorInputFactory() {
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IElementFactory.
-     */
-    public IAdaptable createElement(IMemento memento) {
-        // Get the file name.
-        String fileName = memento.getString(TAG_PATH);
-        if (fileName == null) {
-			return null;
-		}
-
-        // Get a handle to the IFile...which can be a handle
-        // to a resource that does not exist in workspace
-        IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(
-                new Path(fileName));
-        if (file != null) {
-			return new FileEditorInput(file);
-		}
-		return null;
-    }
-
-    /**
-     * Returns the element factory id for this class.
-     * 
-     * @return the element factory id
-     */
-    public static String getFactoryId() {
-        return ID_FACTORY;
-    }
-
-    /**
-     * Saves the state of the given file editor input into the given memento.
-     *
-     * @param memento the storage area for element state
-     * @param input the file editor input
-     */
-    public static void saveState(IMemento memento, FileEditorInput input) {
-        IFile file = input.getFile();
-        memento.putString(TAG_PATH, file.getFullPath().toString());
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/FileInPlaceEditorInput.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/FileInPlaceEditorInput.java
deleted file mode 100644
index 4f1e039..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/FileInPlaceEditorInput.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.part;
-
-import org.eclipse.core.runtime.IPath;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-
-import org.eclipse.ui.IInPlaceEditor;
-import org.eclipse.ui.IInPlaceEditorInput;
-
-/**
- * Adapter for making a file resource a suitable input for an in-place editor.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @since 3.0
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class FileInPlaceEditorInput extends FileEditorInput implements
-        IInPlaceEditorInput {
-    IInPlaceEditor embeddedEditor;
-
-    /**
-     * A resource listener to update the input and in-place
-     * editor if the input's file resource changes.
-     */
-    private IResourceChangeListener resourceListener = new IResourceChangeListener() {
-        public void resourceChanged(IResourceChangeEvent event) {
-            IResourceDelta mainDelta = event.getDelta();
-            if (mainDelta != null && embeddedEditor != null) {
-                IResourceDelta affectedElement = mainDelta.findMember(getFile()
-                        .getFullPath());
-                if (affectedElement != null) {
-                	processDelta(affectedElement);
-                }
-            }
-        }
-
-        private boolean processDelta(final IResourceDelta delta) {
-            Runnable changeRunnable = null;
-
-            switch (delta.getKind()) {
-            case IResourceDelta.REMOVED:
-                if ((IResourceDelta.MOVED_TO & delta.getFlags()) != 0) {
-                    changeRunnable = new Runnable() {
-                        public void run() {
-                            IPath path = delta.getMovedToPath();
-                            IFile newFile = delta.getResource().getWorkspace()
-                                    .getRoot().getFile(path);
-                            if (newFile != null && embeddedEditor != null) {
-                                embeddedEditor
-                                        .sourceChanged(new FileInPlaceEditorInput(
-                                                newFile));
-                            }
-                        }
-                    };
-                } else {
-                    changeRunnable = new Runnable() {
-                        public void run() {
-                            if (embeddedEditor != null) {
-                                embeddedEditor.sourceDeleted();
-                                embeddedEditor.getSite().getPage().closeEditor(
-                                        embeddedEditor, true);
-                            }
-                        }
-                    };
-
-                }
-
-                break;
-            }
-
-            if (changeRunnable != null && embeddedEditor != null) {
-                embeddedEditor.getSite().getShell().getDisplay().asyncExec(
-                        changeRunnable);
-            }
-
-            return true; // because we are sitting on files anyway
-        }
-    };
-
-    /**
-     * Creates an in-place editor input based on a file resource.
-     *
-     * @param file the file resource
-     */
-    public FileInPlaceEditorInput(IFile file) {
-        super(file);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IInPlaceEditorInput#setInPlaceEditor(org.eclipse.ui.IInPlaceEditor)
-     */
-    public void setInPlaceEditor(IInPlaceEditor editor) {
-        if (embeddedEditor != editor) {
-            if (embeddedEditor != null) {
-                getFile().getWorkspace().removeResourceChangeListener(
-                        resourceListener);
-            }
-
-            embeddedEditor = editor;
-
-            if (embeddedEditor != null) {
-                getFile().getWorkspace().addResourceChangeListener(
-                        resourceListener);
-            }
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/MarkerTransfer.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/MarkerTransfer.java
deleted file mode 100644
index 3f16936..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/MarkerTransfer.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.part;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.swt.dnd.ByteArrayTransfer;
-import org.eclipse.swt.dnd.TransferData;
-
-/**
- * A <code>MarkerTransfer</code> is used to transfer an array of 
- * <code>IMarker</code>s from one part to another in a drag and drop 
- * operation.
- * <p>
- * In every drag and drop operation there is a <code>DragSource</code> and 
- * a <code>DropTarget</code>.  When a drag occurs a <code>Transfer</code> is 
- * used to marshall the drag data from the source into a byte array.  If a drop 
- * occurs another <code>Transfer</code> is used to marshall the byte array into
- * drop data for the target.
- * </p><p>
- * This class can be used for a <code>Viewer<code> or an SWT component directly.
- * A singleton is provided which may be serially reused (see <code>getInstance</code>).  
- * It is not intended to be subclassed.
- * </p>
- *
- * @see org.eclipse.jface.viewers.StructuredViewer
- * @see org.eclipse.swt.dnd.DropTarget
- * @see org.eclipse.swt.dnd.DragSource
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class MarkerTransfer extends ByteArrayTransfer {
-
-    /**
-     * Singleton instance.
-     */
-    private static final MarkerTransfer instance = new MarkerTransfer();
-
-    // Create a unique ID to make sure that different Eclipse
-    // applications use different "types" of <code>MarkerTransfer</code>
-    private static final String TYPE_NAME = "marker-transfer-format" + System.currentTimeMillis() + ":" + instance.hashCode();//$NON-NLS-2$//$NON-NLS-1$
-
-    private static final int TYPEID = registerType(TYPE_NAME);
-
-    private IWorkspace workspace;
-
-    /**
-     * Creates a new transfer object.
-     */
-    private MarkerTransfer() {
-    }
-
-    /**
-     * Locates and returns the marker associated with the given attributes.
-     *
-     * @param pathString the resource path
-     * @param id the id of the marker to get (as per {@link IResource#getMarker
-     *    IResource.getMarker})
-     * @return the specified marker
-     */
-    private IMarker findMarker(String pathString, long id) {
-        IPath path = new Path(pathString);
-        IResource resource = workspace.getRoot().findMember(path);
-        if (resource != null) {
-            return resource.getMarker(id);
-        }
-        return null;
-    }
-
-    /**
-     * Returns the singleton instance.
-     *
-     * @return the singleton instance
-     */
-    public static MarkerTransfer getInstance() {
-        return instance;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Transfer.
-     */
-    protected int[] getTypeIds() {
-        return new int[] { TYPEID };
-    }
-
-    /* (non-Javadoc)
-     * Returns the type names.
-     *
-     * @return the list of type names
-     */
-    protected String[] getTypeNames() {
-        return new String[] { TYPE_NAME };
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Transfer.
-     * On a successful conversion, the transferData.result field will be set to
-     * OLE.S_OK. If this transfer agent is unable to perform the conversion, the
-     * transferData.result field will be set to the failure value of OLE.DV_E_TYMED.
-     */
-    protected void javaToNative(Object object, TransferData transferData) {
-        /**
-         * Transfer data is an array of markers.  Serialized version is:
-         * (int) number of markers
-         * (Marker) marker 1
-         * (Marker) marker 2
-         * ... repeat last four for each subsequent marker
-         * see writeMarker for the (Marker) format.
-         */
-        Object[] markers = (Object[]) object;
-        lazyInit(markers);
-
-        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
-        DataOutputStream out = new DataOutputStream(byteOut);
-
-        byte[] bytes = null;
-
-        try {
-            /* write number of markers */
-            out.writeInt(markers.length);
-
-            /* write markers */
-            for (int i = 0; i < markers.length; i++) {
-                writeMarker((IMarker) markers[i], out);
-            }
-            out.close();
-            bytes = byteOut.toByteArray();
-        } catch (IOException e) {
-            //when in doubt send nothing
-        }
-
-        if (bytes != null) {
-            super.javaToNative(bytes, transferData);
-        }
-    }
-
-    /**
-     * Initializes the transfer mechanism if necessary.
-     */
-    private void lazyInit(Object[] markers) {
-        if (workspace == null) {
-            if (markers != null && markers.length > 0) {
-                this.workspace = ((IMarker) markers[0]).getResource()
-                        .getWorkspace();
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Transfer.
-     */
-    protected Object nativeToJava(TransferData transferData) {
-        byte[] bytes = (byte[]) super.nativeToJava(transferData);
-        DataInputStream in = new DataInputStream(
-                new ByteArrayInputStream(bytes));
-
-        try {
-            /* read number of markers */
-            int n = in.readInt();
-
-            /* read markers */
-            IMarker[] markers = new IMarker[n];
-            for (int i = 0; i < n; i++) {
-                IMarker marker = readMarker(in);
-                if (marker == null) {
-                    return null;
-                }
-                markers[i] = marker;
-            }
-            return markers;
-        } catch (IOException e) {
-            return null;
-        }
-    }
-
-    /**
-     * Reads and returns a single marker from the given stream.
-     *
-     * @param dataIn the input stream
-     * @return the marker
-     * @exception IOException if there is a problem reading from the stream
-     */
-    private IMarker readMarker(DataInputStream dataIn) throws IOException {
-        /**
-         * Marker serialization format is as follows:
-         * (String) path of resource for marker
-         * (int) marker ID
-         */
-        String path = dataIn.readUTF();
-        long id = dataIn.readLong();
-        return findMarker(path, id);
-    }
-
-    /**
-     * Writes the given marker to the given stream.
-     *
-     * @param marker the marker
-     * @param dataOut the output stream
-     * @exception IOException if there is a problem writing to the stream
-     */
-    private void writeMarker(IMarker marker, DataOutputStream dataOut)
-            throws IOException {
-        /**
-         * Marker serialization format is as follows:
-         * (String) path of resource for marker
-         * (int) marker ID
-         */
-
-        dataOut.writeUTF(marker.getResource().getFullPath().toString());
-        dataOut.writeLong(marker.getId());
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/ResourceTransfer.java b/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/ResourceTransfer.java
deleted file mode 100644
index 93eb6e9..0000000
--- a/bundles/org.eclipse.ui.ide/extensions/org/eclipse/ui/part/ResourceTransfer.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.part;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.swt.dnd.ByteArrayTransfer;
-import org.eclipse.swt.dnd.TransferData;
-
-/**
- * The <code>ResourceTransfer</code> class is used to transfer an
- * array of <code>IResources</code>s from one part to another in a 
- * drag and drop operation or a cut, copy, paste action.
- * <p>
- * In every drag and drop operation there is a <code>DragSource</code> and 
- * a <code>DropTarget</code>.  When a drag occurs a <code>Transfer</code> is 
- * used to marshall the drag data from the source into a byte array.  If a drop 
- * occurs another <code>Transfer</code> is used to marshall the byte array into
- * drop data for the target.  
- * </p>
- * <p>
- * When a <code>CutAction</code> or a <code>CopyAction</code> is performed, 
- * this transfer is used to place references to the selected resources 
- * on the <code>Clipboard</code>.  When a <code>PasteAction</code> is performed, the 
- * references on the clipboard are used to move or copy the resources
- * to the selected destination.
- * </p>
- * <p>
- * This class can be used for a <code>Viewer<code> or an SWT component directly.
- * A singleton is provided which may be serially reused (see <code>getInstance</code>).  
- * It is not intended to be subclassed.
- * </p>
- *
- * @see org.eclipse.jface.viewers.StructuredViewer
- * @see org.eclipse.swt.dnd.DropTarget
- * @see org.eclipse.swt.dnd.DragSource
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ResourceTransfer extends ByteArrayTransfer {
-
-    /**
-     * Singleton instance.
-     */
-    private static final ResourceTransfer instance = new ResourceTransfer();
-
-    // Create a unique ID to make sure that different Eclipse
-    // applications use different "types" of <code>ResourceTransfer</code>
-    private static final String TYPE_NAME = "resource-transfer-format:" + System.currentTimeMillis() + ":" + instance.hashCode();//$NON-NLS-2$//$NON-NLS-1$
-
-    private static final int TYPEID = registerType(TYPE_NAME);
-
-    private IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-    /**
-     * Creates a new transfer object.
-     */
-    private ResourceTransfer() {
-    }
-
-    /**
-     * Returns the singleton instance.
-     *
-     * @return the singleton instance
-     */
-    public static ResourceTransfer getInstance() {
-        return instance;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Transfer.
-     */
-    protected int[] getTypeIds() {
-        return new int[] { TYPEID };
-    }
-
-    /* (non-Javadoc)
-     * Returns the type names.
-     *
-     * @return the list of type names
-     */
-    protected String[] getTypeNames() {
-        return new String[] { TYPE_NAME };
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Transfer.
-     */
-    protected void javaToNative(Object data, TransferData transferData) {
-        if (!(data instanceof IResource[])) {
-            return;
-        }
-
-        IResource[] resources = (IResource[]) data;
-        /**
-         * The resource serialization format is:
-         *  (int) number of resources
-         * Then, the following for each resource:
-         *  (int) resource type
-         *  (String) path of resource
-         */
-
-        int resourceCount = resources.length;
-
-        try {
-            ByteArrayOutputStream out = new ByteArrayOutputStream();
-            DataOutputStream dataOut = new DataOutputStream(out);
-
-            //write the number of resources
-            dataOut.writeInt(resourceCount);
-
-            //write each resource
-            for (int i = 0; i < resources.length; i++) {
-                writeResource(dataOut, resources[i]);
-            }
-
-            //cleanup
-            dataOut.close();
-            out.close();
-            byte[] bytes = out.toByteArray();
-            super.javaToNative(bytes, transferData);
-        } catch (IOException e) {
-            //it's best to send nothing if there were problems
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Transfer.
-     */
-    protected Object nativeToJava(TransferData transferData) {
-        /**
-         * The resource serialization format is:
-         *  (int) number of resources
-         * Then, the following for each resource:
-         *  (int) resource type
-         *  (String) path of resource
-         */
-
-        byte[] bytes = (byte[]) super.nativeToJava(transferData);
-        if (bytes == null) {
-			return null;
-		}
-        DataInputStream in = new DataInputStream(
-                new ByteArrayInputStream(bytes));
-        try {
-            int count = in.readInt();
-            IResource[] results = new IResource[count];
-            for (int i = 0; i < count; i++) {
-                results[i] = readResource(in);
-            }
-            return results;
-        } catch (IOException e) {
-            return null;
-        }
-    }
-
-    /**
-     * Reads a resource from the given stream.
-     *
-     * @param dataIn the input stream
-     * @return the resource
-     * @exception IOException if there is a problem reading from the stream
-     */
-    private IResource readResource(DataInputStream dataIn) throws IOException {
-        int type = dataIn.readInt();
-        String path = dataIn.readUTF();
-        switch (type) {
-        case IResource.FOLDER:
-            return workspace.getRoot().getFolder(new Path(path));
-        case IResource.FILE:
-            return workspace.getRoot().getFile(new Path(path));
-        case IResource.PROJECT:
-            return workspace.getRoot().getProject(path);
-        }
-        throw new IllegalArgumentException(
-                "Unknown resource type in ResourceTransfer.readResource"); //$NON-NLS-1$
-    }
-
-    /**
-     * Writes the given resource to the given stream.
-     *
-     * @param dataOut the output stream
-     * @param resource the resource
-     * @exception IOException if there is a problem writing to the stream
-     */
-    private void writeResource(DataOutputStream dataOut, IResource resource)
-            throws IOException {
-        dataOut.writeInt(resource.getType());
-        dataOut.writeUTF(resource.getFullPath().toString());
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/addtsk_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/addtsk_tsk.gif
deleted file mode 100644
index f7e6cc0..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/addtsk_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/collapseall.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/collapseall.gif
deleted file mode 100644
index 7dc0de5..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/collapseall.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/configs.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/configs.gif
deleted file mode 100644
index 4539ebd..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/configs.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/filter_ps.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/filter_ps.gif
deleted file mode 100644
index ba6d891..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/filter_ps.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/gotoobj_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/gotoobj_tsk.gif
deleted file mode 100644
index 4957126..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/gotoobj_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/refresh_nav.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/refresh_nav.gif
deleted file mode 100644
index c5c70e1..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/refresh_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/selected_mode.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/selected_mode.gif
deleted file mode 100644
index e2ab9b0..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/selected_mode.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/showchild_mode.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/showchild_mode.gif
deleted file mode 100644
index 8c92e4a..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/showchild_mode.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/showcomplete_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/showcomplete_tsk.gif
deleted file mode 100644
index 0e83deb..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/showcomplete_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/showerr_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/showerr_tsk.gif
deleted file mode 100644
index 8a23317..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/showerr_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/showtsk_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/showtsk_tsk.gif
deleted file mode 100644
index fff68f9..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/showtsk_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/showwarn_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/showwarn_tsk.gif
deleted file mode 100644
index f707e71..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/showwarn_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/smartmode_co.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/smartmode_co.gif
deleted file mode 100644
index 0ddac91..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/smartmode_co.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/step_current.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/step_current.gif
deleted file mode 100644
index 319fe8d..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/step_current.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/step_done.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/step_done.gif
deleted file mode 100644
index 0e83deb..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/step_done.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/synced.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/synced.gif
deleted file mode 100644
index 4f6e43a..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/synced.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/usearch_obj.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/usearch_obj.gif
deleted file mode 100644
index 31fa365..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/usearch_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/workingsets.gif b/bundles/org.eclipse.ui.ide/icons/full/dlcl16/workingsets.gif
deleted file mode 100644
index 35b2433..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dlcl16/workingsets.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dtool16/build_exec.gif b/bundles/org.eclipse.ui.ide/icons/full/dtool16/build_exec.gif
deleted file mode 100644
index 264b1c4..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dtool16/build_exec.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dtool16/export_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/dtool16/export_wiz.gif
deleted file mode 100644
index 3f89cd9..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dtool16/export_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dtool16/exportdir_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/dtool16/exportdir_wiz.gif
deleted file mode 100644
index 33d8df7..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dtool16/exportdir_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dtool16/exportzip_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/dtool16/exportzip_wiz.gif
deleted file mode 100644
index b285d84..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dtool16/exportzip_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dtool16/import_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/dtool16/import_wiz.gif
deleted file mode 100644
index cd44741..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dtool16/import_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dtool16/importdir_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/dtool16/importdir_wiz.gif
deleted file mode 100644
index e25b90a..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dtool16/importdir_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dtool16/importzip_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/dtool16/importzip_wiz.gif
deleted file mode 100644
index 3a00d8e..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dtool16/importzip_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dtool16/newfile_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/dtool16/newfile_wiz.gif
deleted file mode 100644
index 8c682c0..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dtool16/newfile_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dtool16/newfolder_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/dtool16/newfolder_wiz.gif
deleted file mode 100644
index 2821f3e..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dtool16/newfolder_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dtool16/newprj_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/dtool16/newprj_wiz.gif
deleted file mode 100644
index 5b4b24c..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dtool16/newprj_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dtool16/next_nav.gif b/bundles/org.eclipse.ui.ide/icons/full/dtool16/next_nav.gif
deleted file mode 100644
index 954a83c..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dtool16/next_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dtool16/prev_nav.gif b/bundles/org.eclipse.ui.ide/icons/full/dtool16/prev_nav.gif
deleted file mode 100644
index a572efb..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dtool16/prev_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/dtool16/search_src.gif b/bundles/org.eclipse.ui.ide/icons/full/dtool16/search_src.gif
deleted file mode 100644
index c8f8871..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/dtool16/search_src.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/addtoworkset.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/addtoworkset.gif
deleted file mode 100644
index 96bbafd..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/addtoworkset.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/addtsk_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/addtsk_tsk.gif
deleted file mode 100644
index a5ac28d..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/addtsk_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/collapseall.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/collapseall.gif
deleted file mode 100644
index a2d80a9..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/collapseall.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/configs.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/configs.gif
deleted file mode 100644
index c984fba..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/configs.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/filter_ps.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/filter_ps.gif
deleted file mode 100644
index 6fe6f0e..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/filter_ps.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/flatLayout.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/flatLayout.gif
deleted file mode 100644
index 1ef74cf..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/flatLayout.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/gotoobj_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/gotoobj_tsk.gif
deleted file mode 100644
index cf62b63..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/gotoobj_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/hierarchicalLayout.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/hierarchicalLayout.gif
deleted file mode 100644
index 2344861..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/hierarchicalLayout.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/refresh_nav.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/refresh_nav.gif
deleted file mode 100644
index 049cac6..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/refresh_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/removefromworkset.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/removefromworkset.gif
deleted file mode 100644
index 89960f1..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/removefromworkset.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/selected_mode.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/selected_mode.gif
deleted file mode 100644
index 3d4241b..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/selected_mode.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/showchild_mode.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/showchild_mode.gif
deleted file mode 100644
index 6514f7b..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/showchild_mode.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/showcomplete_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/showcomplete_tsk.gif
deleted file mode 100644
index 9cacb96..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/showcomplete_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/showerr_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/showerr_tsk.gif
deleted file mode 100644
index 2ff6678..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/showerr_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/showtsk_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/showtsk_tsk.gif
deleted file mode 100644
index 96028b3..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/showtsk_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/showwarn_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/showwarn_tsk.gif
deleted file mode 100644
index 6c6bd58..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/showwarn_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/smartmode_co.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/smartmode_co.gif
deleted file mode 100644
index 542dddc..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/smartmode_co.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/step_current.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/step_current.gif
deleted file mode 100644
index e3a7cc7..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/step_current.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/step_done.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/step_done.gif
deleted file mode 100644
index 9cacb96..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/step_done.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/synced.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/synced.gif
deleted file mode 100644
index 870934b..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/synced.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/usearch_obj.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/usearch_obj.gif
deleted file mode 100644
index 5080599..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/usearch_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/elcl16/workingsets.gif b/bundles/org.eclipse.ui.ide/icons/full/elcl16/workingsets.gif
deleted file mode 100644
index f878001..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/elcl16/workingsets.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/etool16/build_exec.gif b/bundles/org.eclipse.ui.ide/icons/full/etool16/build_exec.gif
deleted file mode 100644
index 39ee592..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/etool16/build_exec.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/etool16/export_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/etool16/export_wiz.gif
deleted file mode 100644
index 5a0837d..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/etool16/export_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/etool16/exportdir_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/etool16/exportdir_wiz.gif
deleted file mode 100644
index 7c3b2ba..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/etool16/exportdir_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/etool16/exportzip_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/etool16/exportzip_wiz.gif
deleted file mode 100644
index b7a493c..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/etool16/exportzip_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/etool16/import_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/etool16/import_wiz.gif
deleted file mode 100644
index d38085a..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/etool16/import_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/etool16/importdir_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/etool16/importdir_wiz.gif
deleted file mode 100644
index 27d5648..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/etool16/importdir_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/etool16/importzip_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/etool16/importzip_wiz.gif
deleted file mode 100644
index a159667..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/etool16/importzip_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/etool16/newfile_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/etool16/newfile_wiz.gif
deleted file mode 100644
index 9d05088..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/etool16/newfile_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/etool16/newfolder_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/etool16/newfolder_wiz.gif
deleted file mode 100644
index 310eb18..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/etool16/newfolder_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/etool16/newprj_wiz.gif b/bundles/org.eclipse.ui.ide/icons/full/etool16/newprj_wiz.gif
deleted file mode 100644
index fbbac0f..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/etool16/newprj_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/etool16/next_nav.gif b/bundles/org.eclipse.ui.ide/icons/full/etool16/next_nav.gif
deleted file mode 100644
index ce1e02f..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/etool16/next_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/etool16/prev_nav.gif b/bundles/org.eclipse.ui.ide/icons/full/etool16/prev_nav.gif
deleted file mode 100644
index 88d173f..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/etool16/prev_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/etool16/problem_category.gif b/bundles/org.eclipse.ui.ide/icons/full/etool16/problem_category.gif
deleted file mode 100644
index 2344861..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/etool16/problem_category.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/etool16/search_src.gif b/bundles/org.eclipse.ui.ide/icons/full/etool16/search_src.gif
deleted file mode 100644
index d540a01..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/etool16/search_src.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/eview16/bkmrk_nav.gif b/bundles/org.eclipse.ui.ide/icons/full/eview16/bkmrk_nav.gif
deleted file mode 100644
index 8eefad3..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/eview16/bkmrk_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/eview16/filenav_nav.gif b/bundles/org.eclipse.ui.ide/icons/full/eview16/filenav_nav.gif
deleted file mode 100644
index 4b98a62..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/eview16/filenav_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/eview16/problems_view.gif b/bundles/org.eclipse.ui.ide/icons/full/eview16/problems_view.gif
deleted file mode 100644
index 807b28a..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/eview16/problems_view.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/eview16/pview.gif b/bundles/org.eclipse.ui.ide/icons/full/eview16/pview.gif
deleted file mode 100644
index 4aa54a6..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/eview16/pview.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/eview16/tasks_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/eview16/tasks_tsk.gif
deleted file mode 100644
index d3d10f5..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/eview16/tasks_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/markers/contassist_ovr.gif b/bundles/org.eclipse.ui.ide/icons/full/markers/contassist_ovr.gif
deleted file mode 100644
index 5c68bdb..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/markers/contassist_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/markers/help_small.gif b/bundles/org.eclipse.ui.ide/icons/full/markers/help_small.gif
deleted file mode 100644
index 4ccc7bf..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/markers/help_small.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/bkmrk_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/bkmrk_tsk.gif
deleted file mode 100644
index 82c7fbd..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/bkmrk_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/complete_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/complete_tsk.gif
deleted file mode 100644
index 9cacb96..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/complete_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/cprj_obj.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/cprj_obj.gif
deleted file mode 100644
index 6052a86..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/cprj_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/error_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/error_tsk.gif
deleted file mode 100644
index 9b048d6..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/error_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/exportpref_obj.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/exportpref_obj.gif
deleted file mode 100644
index 79f2353..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/exportpref_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/header_complete.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/header_complete.gif
deleted file mode 100644
index 5936511..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/header_complete.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/header_priority.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/header_priority.gif
deleted file mode 100644
index 89e7925..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/header_priority.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/hprio_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/hprio_tsk.gif
deleted file mode 100644
index 609dbb7..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/hprio_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/importpref_obj.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/importpref_obj.gif
deleted file mode 100644
index 67cea0c..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/importpref_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/incomplete_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/incomplete_tsk.gif
deleted file mode 100644
index f6b9f8a..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/incomplete_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/info_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/info_tsk.gif
deleted file mode 100644
index 2da001e..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/info_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/keyspref_obj.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/keyspref_obj.gif
deleted file mode 100644
index fff27a9..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/keyspref_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/lprio_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/lprio_tsk.gif
deleted file mode 100644
index a6815bc..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/lprio_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/prj_obj.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/prj_obj.gif
deleted file mode 100644
index a4ea580..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/prj_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/taskmrk_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/taskmrk_tsk.gif
deleted file mode 100644
index c73e332..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/taskmrk_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/warn_tsk.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/warn_tsk.gif
deleted file mode 100644
index 14009e9..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/warn_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/warning.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/warning.gif
deleted file mode 100644
index 2f1c5a8..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/warning.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/welcome_banner.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/welcome_banner.gif
deleted file mode 100644
index 672442f..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/welcome_banner.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/welcome_editor.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/welcome_editor.gif
deleted file mode 100644
index b226e41..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/welcome_editor.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/welcome_item.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/welcome_item.gif
deleted file mode 100644
index a16ac83..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/welcome_item.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/obj16/workset.gif b/bundles/org.eclipse.ui.ide/icons/full/obj16/workset.gif
deleted file mode 100644
index 2e4de3d..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/obj16/workset.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/ovr16/link_ovr.gif b/bundles/org.eclipse.ui.ide/icons/full/ovr16/link_ovr.gif
deleted file mode 100644
index 4f1440e..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/ovr16/link_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/ovr16/linkwarn_ovr.gif b/bundles/org.eclipse.ui.ide/icons/full/ovr16/linkwarn_ovr.gif
deleted file mode 100644
index 27c0cfb..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/ovr16/linkwarn_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/wizban/exportdir_wiz.png b/bundles/org.eclipse.ui.ide/icons/full/wizban/exportdir_wiz.png
deleted file mode 100644
index dabdfa3..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/wizban/exportdir_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/wizban/exportzip_wiz.png b/bundles/org.eclipse.ui.ide/icons/full/wizban/exportzip_wiz.png
deleted file mode 100644
index 4bf65ce..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/wizban/exportzip_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/wizban/importdir_wiz.png b/bundles/org.eclipse.ui.ide/icons/full/wizban/importdir_wiz.png
deleted file mode 100644
index dce21ed..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/wizban/importdir_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/wizban/importproj_wiz.png b/bundles/org.eclipse.ui.ide/icons/full/wizban/importproj_wiz.png
deleted file mode 100644
index 3a5f3ac..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/wizban/importproj_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/wizban/importzip_wiz.png b/bundles/org.eclipse.ui.ide/icons/full/wizban/importzip_wiz.png
deleted file mode 100644
index 38d0216..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/wizban/importzip_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/wizban/new_wiz.png b/bundles/org.eclipse.ui.ide/icons/full/wizban/new_wiz.png
deleted file mode 100644
index 6b410e2..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/wizban/new_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/wizban/newfile_wiz.png b/bundles/org.eclipse.ui.ide/icons/full/wizban/newfile_wiz.png
deleted file mode 100644
index b3f71ae..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/wizban/newfile_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/wizban/newfolder_wiz.png b/bundles/org.eclipse.ui.ide/icons/full/wizban/newfolder_wiz.png
deleted file mode 100644
index f4861b1..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/wizban/newfolder_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/wizban/newprj_wiz.png b/bundles/org.eclipse.ui.ide/icons/full/wizban/newprj_wiz.png
deleted file mode 100644
index fdff016..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/wizban/newprj_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/wizban/quick_fix.png b/bundles/org.eclipse.ui.ide/icons/full/wizban/quick_fix.png
deleted file mode 100644
index 3130711..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/wizban/quick_fix.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/wizban/saveas_wiz.png b/bundles/org.eclipse.ui.ide/icons/full/wizban/saveas_wiz.png
deleted file mode 100644
index 4923d03..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/wizban/saveas_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/icons/full/wizban/workset_wiz.png b/bundles/org.eclipse.ui.ide/icons/full/wizban/workset_wiz.png
deleted file mode 100644
index b720214..0000000
--- a/bundles/org.eclipse.ui.ide/icons/full/wizban/workset_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.ide/plugin.properties b/bundles/org.eclipse.ui.ide/plugin.properties
deleted file mode 100644
index 702b08f..0000000
--- a/bundles/org.eclipse.ui.ide/plugin.properties
+++ /dev/null
@@ -1,284 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-#     Remy Chi Jian Suen <remy.suen@gmail.com> - [KeyBindings] 'emacs' keyword should link to keys preference page
-###############################################################################
-Plugin.name = Eclipse IDE UI
-Plugin.providerName = Eclipse.org
-
-ExtPoint.markerHelp = Marker Help
-ExtPoint.markerImageProviders = Marker Image Providers
-ExtPoint.markerResolution = Marker Resolution
-ExtPoint.projectNatureImages = Project Nature Images
-ExtPoint.resourceFilters = Resource Filters
-ExtPoint.markerSupport = Marker Support
-ExtPoint.fileSystemSupport = File System Support
-
-KeysPreference.Name = Keys Preferences
-KeysPreference.Description = Preferences related to keys, accelerator key bindings, key configurations and commands.
-
-Editors.WelcomeEditor = Welcome
-ImportExportWizards.Category.Basic = General
-ExportWizards.FileSystem = File System
-ExportWizards.Preferences = Preferences
-ExportWizards.ZipFile = Archive File
-ExportWizards.FileSystemDescription = Export resources to the local file system.
-ExportWizards.PreferencesDescription = Export preferences to the local file system.
-ExportWizards.ZipFileDescription = Export resources to an archive file on the local file system.
-ImportWizards.FileSystem = File System
-ImportWizards.Preferences = Preferences
-ImportWizards.ZipFile = Archive File
-ImportWizards.ExternalProject = Existing Projects into Workspace
-ImportWizards.FileSystemDescription = Import resources from the local file system into an existing project.
-ImportWizards.PreferencesDescription = Import preferences from the local file system.
-ImportWizards.ZipFileDescription = Import resources from an archive file into an existing project.
-ImportWizards.ExternalProjectDescription = Create new projects from an archive file or directory. 
-NewWizards.Category.Examples = Examples
-NewWizards.Category.Basic = General
-NewWizards.project = Project
-NewWizards.project.description = Create a new project resource
-NewWizards.folder = Folder
-NewWizards.folder.description = Create a new folder resource
-NewWizards.file = File
-NewWizards.file.description = Create a new file resource
-
-PreferencePages.Workbench = General
-PreferencePages.Editors = Editors
-PreferencePages.LinkedResources = Linked Resources
-PreferencePages.FileEditors = File Associations
-PreferencePages.FileStates = Local History
-PreferencePages.Perspectives = Perspectives
-PreferencePages.Views = Appearance
-PreferencePages.Workspace=Workspace
-PreferencePages.BuildOrder = Build Order
-PreferencePages.ColorsAndFonts = Colors and Fonts
-PreferencePages.Decorators = Label Decorations
-PreferencePages.NewKeys = Keys
-PreferencePages.ContentTypes = Content Types
-PreferencePages.ContentTypes = Content Types
-PropertyPages.project.reference = Project References
-PropertyPages.info.file = Resource
-
-Views.ResourceNavigator = Navigator
-Views.Bookmark = Bookmarks
-Views.Task = Tasks
-Views.Problem = Problems
-Views.Bookmark = Bookmarks
-Views.AllMarkers = Markers
-Views.Task.Old = Tasks (Legacy)
-Views.Problem.Old = Problems (Legacy)
-Views.Bookmark.Old = Bookmarks (Legacy)
-Views.Progress = Progress
-
-WorkingSets.resource = Resource
-WorkingSets.resource.desc = A general purpose working set that can contain any type of file-based Eclipse resource.
-NavigateActionSet.label = Resource Navigation
-NavigateActionSet.description = Action set containing resource navigation actions
-
-WindowWorkingSetsActionSet.label = Window Working Set
-WindowWorkingSetsActionSet.description = Window working set manipulation actions
-
-WorkingSetsActionSet.label = Working Set Manipulation
-WorkingSetsActionSet.description = Actions set containing actions that add and remove from working sets
-
-openFilesActionSet.label= Open Files
-openLocalFile.label= Open File&...
-openLocalFile.description= Opens a File
-
-GoToResourceAction.label = &Resource...
-DecoratorLinkedResource.label = Linked Resources
-DecoratorLinkedResource.description = Adds an icon decoration to linked resources.
-DecoratorSpecificContentType.label = File Icons Based On Content Analysis
-DecoratorSpecificContentType.description = Displays an icon based on the examination of the contents of a file. This yields a more precise answer than one derived simply from the file name.
-OpenWorkspaceFileAction.label = Open Reso&urce...
-SelectWorkingSetsAction.label = &Working Sets
-SelectWorkingSetsAction.tooltip = Modify workbench working sets
-
-AddToWorkingSetAction.label = Add To Working Se&t
-AddToWorkingSetAction.tooltip = Add the selected elements to a working set
-RemoveFromWorkingSetAction.label = Remove Fro&m Working Set
-RemoveFromWorkingSetAction.tooltip = Remove the selected elements from a working set
-
-About.updateSummaryTitle = Current Install Configuration
-
-category.project.name=Project
-category.project.description=
-
-command.addTask.description = Add a task
-command.addTask.name = Add Task...
-command.addTask.mnemonic = T
-command.buildAll.description = Build all projects
-command.buildAll.name = Build All
-command.buildClean.description = Discard old built state
-command.buildClean.name = Build Clean
-command.buildLast.description = Repeat the last working set build
-command.buildLast.name = Repeat Working Set Build
-command.buildProject.description = Build the selected project
-command.buildProject.name = Build Project
-command.buildAutomatically.description = Toggle the workspace build automatically function
-command.buildAutomatically.name = Build Automatically
-command.closeProject.description = Close the selected project
-command.closeProject.name = Close Project
-command.closeUnrelatedProjects.name = Close Unrelated Projects
-command.closeUnrelatedProjects.description = Close unrelated projects
-command.configureFilters.description = Configure the filters to apply to the markers view
-command.configureFilters.name = Configure Contents...
-command.configureFilters.mnemonic=C
-command.configureColumns.description = Configure the columns in the markers view
-command.configureColumns.name = Columns...
-command.configureColumns.mnemonic=l
-command.correctionAssistProposals.description = Suggest possible fixes for a problem
-command.correctionAssistProposals.name = Quick Fix
-command.correctionAssistProposals.mnemonic = Q
-command.deleteCompleted.description=Delete the tasks marked as completed
-command.deleteCompleted.name= Delete Completed Tasks
-command.deleteCompleted.mnemonic=T
-command.goToResource.description = Go to a particular resource in the active view
-command.goToResource.name = Go to
-command.goToResource.mnemonic = &R
-command.markCompleted.description=Mark the selected tasks as completed
-command.markCompleted.name= Mark Completed
-command.markCompleted.mnemonic=M
-command.newMarkersView.openNew.description = Open another view
-command.newMarkersView.openNew.name = Open Another
-command.newMarkersView.openNew.mnemonic = N
-command.openFile.description = Open a file
-command.openFile.name = Open File...
-command.openProject.description = Open a project
-command.openProject.name = Open Project
-command.openResource.description = Open an editor on a particular resource
-command.openResource.name = Open Resource
-command.openWorkspace.description = Open the workspace selection dialog
-command.openWorkspace.name = Switch Workspace
-command.preferences.label = Preferences
-command.preferences.mnemonic = P
-command.projectProperties.description = Display the properties of the selected item's project 
-command.projectProperties.name = Properties
-command.rebuildAll.description = Rebuild all projects
-command.rebuildAll.name = Rebuild All
-command.rebuildProject.description = Rebuild the selected projects
-command.rebuildProject.name = Rebuild Project
-command.selectWorkingSets.name = Select Working Sets
-command.selectWorkingSets.description = Select the working sets that are applicable for this window.
-command.addToWorkingSet.name = Add to Working Set
-command.addToWorkingSet.description = Adds the selected object to a working set.
-command.removeFromWorkingSet.name = Remove From Working Set
-command.removeFromWorkingSet.description = Removes the selected object from a working set.
-command.copyBuildIdCommand.name=Copy Build Id To Clipboard
-command.copyBuildIdCommand.description=Copies the build id to the clipboard.
-command.copyConfigCommand.name=Copy Configuration Data To Clipboard
-command.copyConfigCommand.description=Copies the configuration data (system properties, installed bundles, etc) to the clipboard.
-
-
-
-command.showInQuickMenu.name= Show In...
-command.showInQuickMenu.description = Open the Show In menu
-command.showInQuickMenu.mnemonic = S
-
-command.newQuickMenu.name= New menu
-command.newQuickMenu.description= Open the New menu
-
-category.update.name= Update
-category.update.description= Commands for Software Updates
-command.manageConfiguration.name= Manage Configuration
-command.manageConfiguration.description= Open the product configuration dialog
-command.findAndInstallUpdates.name= Find and Install Updates
-command.findAndInstallUpdates.description= Open the feature install and update dialog
-
-commandParameter.openFileByPath.filePath.name= File Path
-command.showResourceByPath.name= Show Resource in Navigator
-command.showResourceByPath.description= Show a resource in the Navigator given its path
-commandParameter.showResourceByPath.resourcePath.name= Resource Path
-
-KeyBindingActionSet.label = Keyboard Shortcuts
-KeyBindingActionSet.showKeyAssist.label = &Key Assist...
-
-PreferenceKeywords.Editing = editing
-PreferenceKeywords.Appearance = appearance
-PreferenceKeywords.ColorLabels = color label
-PreferenceKeywords.General = click background
-PreferenceKeywords.Themes = themes
-PreferenceKeywords.AppearancePage = presentation
-PreferenceKeywords.Tabs = tab
-PreferenceKeywords.Editors = editors
-PreferenceKeywords.Pin = pin
-PreferenceKeywords.Close = close
-PreferenceKeywords.Dirty = dirty
-PreferenceKeywords.Keys = binding command scheme emacs
-PreferenceKeywords.Perspectives = open view switch
-PreferenceKeywords.StartupAndShutdown = workbench plug-in plugin refresh
-PreferenceKeywords.Workspace = build refresh save automatically open project line delimiter
-PreferenceKeywords.LinkedResources = path
-PreferenceKeywords.Animations = animations
-PreferenceKeywords.Restore = restore
-PreferenceKeywords.State = state
-PreferenceKeywords.Encoding = encoding
-
-# TODO This stuff is just to help me work on the parsing of the menus extension
-# point.  It is likely not in its final form yet.
-
-markerGrouping.severity = Severity
-markerGrouping.errors = Errors
-markerGrouping.warnings = Warnings
-markerGrouping.infos = Infos
-markerGrouping.type = Type
-markerGrouping.other = Other Markers
-
-menu.toggleCoolbar.tooltip = Toggle coolbar visibility
-
-ContentGenerator.Problems = Problems
-ContentGenerator.Tasks = Tasks
-ContentGenerator.Bookmarks = Bookmarks
-ContentGenerator.AllMarkers = All Markers
-ContentGenerator.Category = Contents
-ContentGenerator.CategoryDescription = The category for menu contents
-
-MarkerContentsMenu.Contents.name = Contents
-MarkerContentsMenu.Contents.mnemonic = C
-MarkerFiltersMenu.Show = &Show
-MarkerGroupMenu.GroupBy = &Group By
-
-Field.CreationTime = Creation Time
-Field.Resource = Resource
-Field.Path = Path
-Field.Location = Location
-Field.ID = ID
-Field.Completion = Completion
-Field.Priority = Priority
-Field.Description = Description
-Field.Type = Type
-
-OpenAnother.Problems = New Problems View
-OpenAnother.Tasks = New Tasks View
-OpenAnother.Bookmarks = New Bookmarks View
-OpenAnother.Markers = New Markers View
-
-OpenAnother.Mnemonic = V
-
-MarkerFilterGrouping.AllErrors = All Errors
-MarkerFilterGrouping.SelectedWarnings = Warnings on Selection
-MarkerFilterGrouping.TODO = TODOs
-PropertyPage.Markers = Marker
-PreferencePage.Markers = Markers
-ContentGenerator.Markers = Markers
-
-Menu.Sort.label = Sort By
-Menu.Sort.mnemonic = S
-
-PreferenceTransfer.ProblemsConfigurations = Problems View Configuration
-PreferenceTransfer.ProblemsConfigurations.Description = All configurations set in the problems view.
-PreferenceTransfer.TasksConfigurations = Tasks View Configuration
-PreferenceTransfer.TasksConfigurations.Description = All configurations set in the tasks view.
-PreferenceTransfer.BookmarksConfigurations = Bookmarks View Configuration
-PreferenceTransfer.BookmarksConfigurations.Description = All configurations set in the bookmarks view.
-PreferenceTransfer.AllMarkersConfigurations = Markers View Configuration
-PreferenceTransfer.AllMarkersConfigurations.Description = All configurations set in the markers view.
-menu.mnemonic.0 = I
-menu.showIn.label = Show In
-menu.showIn.mnemonic = I
diff --git a/bundles/org.eclipse.ui.ide/plugin.xml b/bundles/org.eclipse.ui.ide/plugin.xml
deleted file mode 100644
index 55bc70d..0000000
--- a/bundles/org.eclipse.ui.ide/plugin.xml
+++ /dev/null
@@ -1,2218 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-    
-<!-- IDE extension points -->
-   <extension-point id="markerHelp" name="%ExtPoint.markerHelp" schema="schema/markerHelp.exsd"/>
-   <extension-point id="markerImageProviders" name="%ExtPoint.markerImageProviders" schema="schema/markerImageProviders.exsd"/>
-   <extension-point id="markerResolution" name="%ExtPoint.markerResolution" schema="schema/markerResolution.exsd"/>
-   <extension-point id="projectNatureImages" name="%ExtPoint.projectNatureImages" schema="schema/projectNatureImages.exsd"/>
-   <extension-point id="resourceFilters" name="%ExtPoint.resourceFilters" schema="schema/resourceFilters.exsd"/>
-   <extension-point id="markerSupport" name="%ExtPoint.markerSupport" schema="schema/markerSupport.exsd"/>
-   <extension-point id="filesystemSupport" name="%ExtPoint.fileSystemSupport" schema="schema/filesystemSupport.exsd"/>
-
-   <extension
-         point="org.eclipse.ui.importWizards">
-
-      <category
-            name="%ImportExportWizards.Category.Basic"
-            id="org.eclipse.ui.Basic">
-      </category>
-      
-      <wizard
-            name="%ImportWizards.Preferences"
-            icon="$nl$/icons/full/obj16/importpref_obj.gif"
-            id="org.eclipse.ui.wizards.import.Preferences"
-            category="org.eclipse.ui.Basic"            
-            class="org.eclipse.ui.ExtensionFactory:preferencesImportWizard">
-         <description>
-            %ImportWizards.PreferencesDescription
-         </description>
-      </wizard>
-      <wizard
-            name="%ImportWizards.FileSystem"
-            icon="$nl$/icons/full/etool16/importdir_wiz.gif"
-            category="org.eclipse.ui.Basic"            
-            class="org.eclipse.ui.wizards.datatransfer.FileSystemImportWizard"
-            id="org.eclipse.ui.wizards.import.FileSystem">
-         <description>
-            %ImportWizards.FileSystemDescription
-         </description>
-         <selection
-               class="org.eclipse.core.resources.IResource">
-         </selection>
-      </wizard>
-      <wizard
-            name="%ImportWizards.ExternalProject"
-            icon="$nl$/icons/full/etool16/newprj_wiz.gif"
-            category="org.eclipse.ui.Basic"            
-            class="org.eclipse.ui.wizards.datatransfer.ExternalProjectImportWizard"
-            id="org.eclipse.ui.wizards.import.ExternalProject">
-         <description>
-            %ImportWizards.ExternalProjectDescription
-         </description>
-      </wizard>
-      <wizard
-            name="%ImportWizards.ZipFile"
-            icon="$nl$/icons/full/etool16/importzip_wiz.gif"
-            category="org.eclipse.ui.Basic"            
-            class="org.eclipse.ui.wizards.datatransfer.ZipFileImportWizard"
-            id="org.eclipse.ui.wizards.import.ZipFile">
-         <description>
-            %ImportWizards.ZipFileDescription
-         </description>
-         <selection
-               class="org.eclipse.core.resources.IResource">
-         </selection>
-      </wizard>
-   </extension>
-   <extension
-         point="org.eclipse.ui.exportWizards">
-
-      <category
-            name="%ImportExportWizards.Category.Basic"
-            id="org.eclipse.ui.Basic">
-      </category>
-               
-      <wizard
-            name="%ExportWizards.Preferences"
-            icon="icons/full/obj16/exportpref_obj.gif"
-            category="org.eclipse.ui.Basic"
-            class="org.eclipse.ui.ExtensionFactory:preferencesExportWizard"
-            id="org.eclipse.ui.wizards.export.Preferences">
-         <description>
-            %ExportWizards.PreferencesDescription
-         </description>
-      </wizard>         
-      <wizard
-            name="%ExportWizards.FileSystem"
-            icon="icons/full/etool16/exportdir_wiz.gif"
-            category="org.eclipse.ui.Basic"
-            class="org.eclipse.ui.wizards.datatransfer.FileSystemExportWizard"
-            id="org.eclipse.ui.wizards.export.FileSystem">
-         <description>
-            %ExportWizards.FileSystemDescription
-         </description>
-         <selection
-               class="org.eclipse.core.resources.IResource">
-         </selection>
-      </wizard>
-      <wizard
-            name="%ExportWizards.ZipFile"
-            icon="icons/full/etool16/exportzip_wiz.gif"
-            category="org.eclipse.ui.Basic"            
-            class="org.eclipse.ui.wizards.datatransfer.ZipFileExportWizard"
-            id="org.eclipse.ui.wizards.export.ZipFile">
-         <description>
-            %ExportWizards.ZipFileDescription
-         </description>
-         <selection
-               class="org.eclipse.core.resources.IResource">
-         </selection>
-      </wizard>
-   </extension>
-   <extension
-         point="org.eclipse.ui.ide.markerImageProviders">
-      <imageprovider
-            markertype="org.eclipse.core.resources.bookmark"
-            icon="icons/full/obj16/bkmrk_tsk.gif"
-            id="org.eclipse.ui.bookmarkProvider">
-      </imageprovider>
-      <imageprovider
-            markertype="org.eclipse.core.resources.taskmarker"
-            icon="icons/full/eview16/tasks_tsk.gif"
-            id="org.eclipse.ui.taskMarkerProvider">
-      </imageprovider>
-      <imageprovider
-            markertype="org.eclipse.core.resources.problemmarker"
-            class="org.eclipse.ui.internal.ide.ProblemImageProvider"
-            id="org.eclipse.ui.problemMarkerProvider">
-      </imageprovider>
-   </extension>
-   <extension
-         point="org.eclipse.ui.newWizards">
-      <category
-            name="%NewWizards.Category.Examples"
-            id="org.eclipse.ui.Examples">
-      </category>
-      <category
-            name="%NewWizards.Category.Basic"
-            id="org.eclipse.ui.Basic">
-      </category>
-      <wizard
-            name="%NewWizards.project"
-            icon="$nl$/icons/full/etool16/newprj_wiz.gif"
-            category="org.eclipse.ui.Basic"
-            class="org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard"
-            project="true"
-            id="org.eclipse.ui.wizards.new.project">
-         <description>
-            %NewWizards.project.description
-         </description>
-      </wizard>
-      <wizard
-            name="%NewWizards.folder"
-            icon="$nl$/icons/full/etool16/newfolder_wiz.gif"
-            category="org.eclipse.ui.Basic"
-            class="org.eclipse.ui.wizards.newresource.BasicNewFolderResourceWizard"
-            id="org.eclipse.ui.wizards.new.folder">
-         <description>
-            %NewWizards.folder.description
-         </description>
-         <selection
-               class="org.eclipse.core.resources.IResource">
-         </selection>
-      </wizard>
-      <wizard
-            name="%NewWizards.file"
-            icon="$nl$/icons/full/etool16/newfile_wiz.gif"
-            category="org.eclipse.ui.Basic"
-            class="org.eclipse.ui.wizards.newresource.BasicNewFileResourceWizard"
-            id="org.eclipse.ui.wizards.new.file">
-         <description>
-            %NewWizards.file.description
-         </description>
-         <selection
-               class="org.eclipse.core.resources.IResource">
-         </selection>
-      </wizard>
-   </extension>
-   <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            name="%Editors.WelcomeEditor"
-            icon="$nl$/icons/full/obj16/welcome_editor.gif"
-            class="org.eclipse.ui.internal.ide.dialogs.WelcomeEditor"
-            contributorClass="org.eclipse.ui.internal.ide.dialogs.WelcomeEditorActionContributor"
-            id="org.eclipse.ui.internal.ide.dialogs.WelcomeEditor">
-      </editor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.elementFactories">
-      <factory
-            class="org.eclipse.ui.internal.ide.model.ResourceFactory"
-            id="org.eclipse.ui.internal.model.ResourceFactory">
-      </factory>
-      <factory
-            class="org.eclipse.ui.internal.ide.model.WorkspaceFactory"
-            id="org.eclipse.ui.internal.model.WorkspaceFactory">
-      </factory>
-      <factory
-            class="org.eclipse.ui.part.FileEditorInputFactory"
-            id="org.eclipse.ui.part.FileEditorInputFactory">
-      </factory>
-      <factory
-            class="org.eclipse.ui.ide.FileStoreEditorInputFactory"
-            id="org.eclipse.ui.ide.FileStoreEditorInputFactory">
-      </factory>
-      <factory
-            class="org.eclipse.ui.internal.ide.dialogs.WelcomeEditorInputFactory"
-            id="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory">
-      </factory>
-   </extension>
-   <extension
-         point="org.eclipse.ui.workingSets">
-      <workingSet
-            description="%WorkingSets.resource.desc"
-            elementAdapterClass="org.eclipse.ui.BasicWorkingSetElementAdapter:org.eclipse.core.resources.IResource;adapt=true"
-            icon="$nl$/icons/full/obj16/workset.gif"
-            id="org.eclipse.ui.resourceWorkingSetPage"
-            name="%WorkingSets.resource"
-            pageClass="org.eclipse.ui.internal.ide.dialogs.ResourceWorkingSetPage"
-            updaterClass="org.eclipse.ui.internal.ide.ResourceWorkingSetUpdater">
-      </workingSet>
-   </extension>
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            label="%NavigateActionSet.label"
-            description="%NavigateActionSet.description"
-            visible="false"
-            id="org.eclipse.ui.NavigateActionSet">
-         <action
-               definitionId="org.eclipse.ui.navigate.goToResource"
-               label="%GoToResourceAction.label"
-               icon="$nl$/icons/full/elcl16/gotoobj_tsk.gif"
-               menubarPath="navigate/goTo/"
-               retarget="true"
-               id="goToResource">
-         </action>
-         <action
-               label="%OpenWorkspaceFileAction.label"
-               helpContextId="org.eclipse.ui.open_workspace_file_action_context"
-               class="org.eclipse.ui.internal.ide.handlers.OpenResourceHandler"
-               menubarPath="navigate/open.ext2"
-               id="org.eclipse.ui.OpenWorkspaceFile"
-               definitionId="org.eclipse.ui.navigate.openResource">
-         </action>
-      </actionSet>
-      <actionSet
-            label="%KeyBindingActionSet.label"
-            visible="true"
-            id="org.eclipse.ui.actionSet.keyBindings">
-         <action
-               label="%KeyBindingActionSet.showKeyAssist.label"
-               class="org.eclipse.ui.internal.handlers.ShowKeyAssistHandler"
-               menubarPath="help/group.assist"
-               id="org.eclipse.ui.actions.showKeyAssistHandler"
-               definitionId="org.eclipse.ui.window.showKeyAssist">
-         </action>
-      </actionSet>
-      <actionSet
-            label="%WorkingSetsActionSet.label"
-            description="%WorkingSetsActionSet.description"
-            visible="false"
-            id="org.eclipse.ui.WorkingSetModificationActionSet">
-            <action
-          		class="org.eclipse.ui.internal.actions.ModifyWorkingSetDelegate:false"
-	            definitionId="org.eclipse.ui.navigate.removeFromWorkingSet"
-      		    icon="$nl$/icons/full/elcl16/removefromworkset.gif"
-	            id="removeFromWorkingSet"
-	            label="%RemoveFromWorkingSetAction.label"
-          		menubarPath="edit/additions"
-          		style="pulldown"
-          		toolbarPath="workingSets"
-          		tooltip="%RemoveFromWorkingSetAction.tooltip">
-     			<enablement>
-        			<objectClass
-           	   			name="org.eclipse.core.runtime.IAdaptable">
-        			</objectClass>
-     			</enablement>
-  			</action>
-			<action
-        		class="org.eclipse.ui.internal.actions.ModifyWorkingSetDelegate:true"
-        		definitionId="org.eclipse.ui.navigate.addToWorkingSet"
-        		icon="$nl$/icons/full/elcl16/addtoworkset.gif"
-        		id="addToWorkingSet"
-        		label="%AddToWorkingSetAction.label"
-        		menubarPath="edit/additions"
-        		style="pulldown"
- 		        toolbarPath="workingSets"
-        		tooltip="%AddToWorkingSetAction.tooltip">
-     			<enablement>
-        			<objectClass
-           	   			name="org.eclipse.core.runtime.IAdaptable">
-        			</objectClass>
-     			</enablement>
-  			</action>
-      </actionSet>
-      <actionSet
-            label="%WindowWorkingSetsActionSet.label"
-            description="%WindowWorkingSetsActionSet.description"
-            visible="false"
-            id="org.eclipse.ui.WorkingSetActionSet">
-         <action
-               class="org.eclipse.ui.internal.actions.SelectWorkingSetsAction"
-               definitionId="org.eclipse.ui.navigate.selectWorkingSets"
-               icon="$nl$/icons/full/elcl16/workingsets.gif"
-               id="selectWorkingSets"
-               label="%SelectWorkingSetsAction.label"
-               menubarPath="window/additions"
-               style="pulldown"
-               toolbarPath="workingSets"
-               tooltip="%SelectWorkingSetsAction.tooltip"/>                     
-      </actionSet>
-        <actionSet
-            label="%openFilesActionSet.label"
-            visible="true"
-            id="org.eclipse.ui.actionSet.openFiles">
-         <action
-               definitionId="org.eclipse.ui.edit.text.openLocalFile"
-               label="%openLocalFile.label"
-               helpContextId="org.eclipse.ui.open_local_file_action_context"
-               class="org.eclipse.ui.internal.ide.actions.OpenLocalFileAction"
-               tooltip="%openLocalFile.description"
-               menubarPath="file/new.ext"
-               id="org.eclipse.ui.openLocalFile">
-         </action>
-      </actionSet>
-   </extension>   
-   
-   <extension
-         point="org.eclipse.ui.decorators">
-      <decorator
-            lightweight="true"
-            adaptable="true"
-            location="BOTTOM_RIGHT"
-            label="%DecoratorLinkedResource.label"
-            class="org.eclipse.ui.internal.ide.LinkedResourceDecorator"
-            state="true"
-            id="org.eclipse.ui.LinkedResourceDecorator">
-         <description>
-            %DecoratorLinkedResource.description
-         </description>
-         <enablement>
-            <objectClass
-                  name="org.eclipse.core.resources.IResource">
-            </objectClass>
-         </enablement>
-      </decorator>
-      <decorator
-            adaptable="false"
-            class="org.eclipse.ui.internal.ide.ContentTypeDecorator"
-            id="org.eclipse.ui.ContentTypeDecorator"
-            label="%DecoratorSpecificContentType.label"
-            lightweight="true"
-            location="REPLACE"
-            state="true">
-         <description>
-            %DecoratorSpecificContentType.description
-         </description>
-         <enablement>
-            <objectClass
-                  name="org.eclipse.core.resources.IFile">
-            </objectClass>
-         </enablement>
-      </decorator>
-   </extension>
-   <extension
-   		point="org.eclipse.ui.keywords">
-    <keyword
-            label="%PreferenceKeywords.Editing"
-            id="org.eclipse.ui.ide.editing"/>
-      <keyword
-            label="%PreferenceKeywords.Appearance"
-            id="org.eclipse.ui.ide.appearance"/>
-      <keyword
-            id="org.eclipse.ui.ide.general"
-            label="%PreferenceKeywords.General"/>
-      <keyword
-            id="org.eclipse.ui.ide.themes"
-            label="%PreferenceKeywords.Themes"/>
-      <keyword
-            id="org.eclipse.ui.ide.apearancepage"
-            label="%PreferenceKeywords.AppearancePage"/>
-      <keyword
-            id="org.eclipse.ui.ide.colorlabels"
-            label="%PreferenceKeywords.ColorLabels"/>
-      <keyword
-            id="org.eclipse.ui.ide.tabs"
-            label="%PreferenceKeywords.Tabs"/>
-      <keyword
-            id="org.eclipse.ui.ide.editors"
-            label="%PreferenceKeywords.Editors"/>
-      <keyword
-            id="org.eclipse.ui.ide.pin"
-            label="%PreferenceKeywords.Pin"/>
-      <keyword
-            id="org.eclipse.ui.ide.close"
-            label="%PreferenceKeywords.Close"/>
-      <keyword
-            id="org.eclipse.ui.ide.dirty"
-            label="%PreferenceKeywords.Dirty"/>
-      <keyword
-            id="org.eclipse.ui.ide.keys"
-            label="%PreferenceKeywords.Keys"/>
-      <keyword
-            id="org.eclipse.ui.ide.perspectives"
-            label="%PreferenceKeywords.Perspectives"/>
-      <keyword
-            id="org.eclipse.ui.ide.startupAndShutdown"
-            label="%PreferenceKeywords.StartupAndShutdown"/>
-      <keyword
-            id="org.eclipse.ui.ide.workspace"
-            label="%PreferenceKeywords.Workspace"/>
-      <keyword
-            id="org.eclipse.ui.ide.linked"
-            label="%PreferenceKeywords.LinkedResources"/>
-      <keyword
-            id="org.eclipse.ui.ide.animations"
-            label="%PreferenceKeywords.Animations">
-      </keyword>
-      <keyword
-            id="org.eclipse.ui.ide.state"
-            label="%PreferenceKeywords.State">
-      </keyword>
-      <keyword
-            id="org.eclipse.ui.ide.restore"
-            label="%PreferenceKeywords.Restore">
-      </keyword>
-    <keyword
-            label="%PreferenceKeywords.Encoding"
-            id="org.eclipse.ui.ide.encoding"/>
-   </extension>      
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            name="%PreferencePages.Workbench"
-            class="org.eclipse.ui.internal.ide.dialogs.IDEWorkbenchPreferencePage"
-            id="org.eclipse.ui.preferencePages.Workbench">
-         <keywordReference id="org.eclipse.ui.ide.general"/>
-      </page>
-      <page
-            name="%PreferencePages.Editors"
-            category="org.eclipse.ui.preferencePages.Workbench"
-            class="org.eclipse.ui.internal.ide.dialogs.IDEEditorsPreferencePage"
-            id="org.eclipse.ui.preferencePages.Editors">
-         <keywordReference id="org.eclipse.ui.ide.editing"/>
-         <keywordReference id="org.eclipse.ui.ide.tabs"/>
-         <keywordReference id="org.eclipse.ui.ide.editors"/>
-         <keywordReference id="org.eclipse.ui.ide.pin"/>
-         <keywordReference id="org.eclipse.ui.ide.dirty"/>
-         <keywordReference id="org.eclipse.ui.ide.close"/>
-         <keywordReference
-               id="org.eclipse.ui.ide.restore">
-         </keywordReference>
-         <keywordReference
-               id="org.eclipse.ui.ide.state">
-         </keywordReference>
-      </page>
-      <page
-            name="%PreferencePages.Perspectives"
-            category="org.eclipse.ui.preferencePages.Workbench"
-            class="org.eclipse.ui.internal.ide.dialogs.IDEPerspectivesPreferencePage"
-            id="org.eclipse.ui.preferencePages.Perspectives">
-         <keywordReference id="org.eclipse.ui.ide.appearance"/>
-         <keywordReference id="org.eclipse.ui.ide.perspectives"/>
-      </page>
-      <page
-            name="%PreferencePages.FileEditors"
-            category="org.eclipse.ui.preferencePages.Editors"
-            class="org.eclipse.ui.ExtensionFactory:fileAssociationsPreferencePage"
-            id="org.eclipse.ui.preferencePages.FileEditors">
-         <keywordReference id="org.eclipse.ui.ide.editing"/>
-         <keywordReference id="org.eclipse.ui.ide.editors"/>
-      </page>
-      <page
-            name="%PreferencePages.Views"
-            category="org.eclipse.ui.preferencePages.Workbench"
-            class="org.eclipse.ui.ExtensionFactory:appearancePreferencePage"
-            id="org.eclipse.ui.preferencePages.Views">
-         <keywordReference id="org.eclipse.ui.ide.appearance"/>
-         <keywordReference id="org.eclipse.ui.ide.colorlabels"/>
-         <keywordReference id="org.eclipse.ui.ide.themes"/>
-         <keywordReference id="org.eclipse.ui.ide.tabs"/>
-         <keywordReference id="org.eclipse.ui.ide.apearancepage"/>
-         <keywordReference
-               id="org.eclipse.ui.ide.animations">
-         </keywordReference>
-      </page>
-      <page
-            name="%PreferencePages.ColorsAndFonts"
-            category="org.eclipse.ui.preferencePages.Views"
-            class="org.eclipse.ui.ExtensionFactory:colorsAndFontsPreferencePage"
-            id="org.eclipse.ui.preferencePages.ColorsAndFonts">
-         <keywordReference id="org.eclipse.ui.ide.appearance"/>
-         <keywordReference id="org.eclipse.ui.ide.themes"/>
-      </page>
-      <page
-            name="%PreferencePages.Decorators"
-            category="org.eclipse.ui.preferencePages.Views"
-            class="org.eclipse.ui.ExtensionFactory:decoratorsPreferencePage"
-            id="org.eclipse.ui.preferencePages.Decorators">
-         <keywordReference id="org.eclipse.ui.ide.appearance"/>
-      </page>
-      <page
-            category="org.eclipse.ui.preferencePages.Workbench"
-            class="org.eclipse.ui.internal.ide.dialogs.IDEWorkspacePreferencePage"
-            id="org.eclipse.ui.preferencePages.Workspace"
-            name="%PreferencePages.Workspace">
-         <keywordReference id="org.eclipse.ui.ide.workspace"/>         
-         <keywordReference id="org.eclipse.ui.ide.encoding"/>         
-      </page>
-      <page
-      		category="org.eclipse.ui.preferencePages.Workspace"
-            name="%PreferencePages.BuildOrder"
-            class="org.eclipse.ui.internal.ide.dialogs.BuildOrderPreferencePage"
-            id="org.eclipse.ui.preferencePages.BuildOrder">
-      </page>
-      
-       <page
-            name="%PreferencePages.FileStates"
-            category="org.eclipse.ui.preferencePages.Workspace"
-            class="org.eclipse.ui.internal.ide.dialogs.FileStatesPage"
-            id="org.eclipse.ui.preferencePages.FileStates">
-      </page>
-      
-      <page
-            name="%PreferencePages.LinkedResources"
-            category="org.eclipse.ui.preferencePages.Workspace"
-            class="org.eclipse.ui.internal.ide.dialogs.LinkedResourcesPreferencePage"
-            id="org.eclipse.ui.preferencePages.LinkedResources">
-         <keywordReference id="org.eclipse.ui.ide.linked"/>
-      </page>
-      <page
-            name="%PreferencePages.NewKeys"
-            category="org.eclipse.ui.preferencePages.Workbench"
-            class="org.eclipse.ui.ExtensionFactory:newKeysPreferencePage"
-            id="org.eclipse.ui.preferencePages.Keys">
-         <keywordReference id="org.eclipse.ui.ide.keys"/>
-      </page>
-      <page
-            class="org.eclipse.ui.ExtensionFactory:contentTypesPreferencePage"
-            id="org.eclipse.ui.preferencePages.ContentTypes"
-            category="org.eclipse.ui.preferencePages.Workbench"
-            name="%PreferencePages.ContentTypes">
-         <keywordReference id="org.eclipse.ui.ide.editing"/>
-         <keywordReference id="org.eclipse.ui.ide.encoding"/>
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            name="%Views.Progress"
-            icon="$nl$/icons/full/eview16/pview.gif"
-            category="org.eclipse.ui"
-            class="org.eclipse.ui.internal.progress.ProgressView"
-            id="org.eclipse.ui.views.ProgressView">
-      </view>
-      <view
-            name="%Views.ResourceNavigator"
-            icon="$nl$/icons/full/eview16/filenav_nav.gif"
-            category="org.eclipse.ui"
-            class="org.eclipse.ui.views.navigator.ResourceNavigator"
-            id="org.eclipse.ui.views.ResourceNavigator">
-      </view>
-      <view
-            allowMultiple="true"
-            category="org.eclipse.ui"
-            class="org.eclipse.ui.internal.views.markers.BookmarksView"
-            icon="$nl$/icons/full/eview16/bkmrk_nav.gif"
-            id="org.eclipse.ui.views.BookmarkView"
-            name="%Views.Bookmark">
-      </view>
-      <view
-            allowMultiple="true"
-            category="org.eclipse.ui"
-            class="org.eclipse.ui.internal.views.markers.TasksView"
-            icon="$nl$/icons/full/eview16/tasks_tsk.gif"
-            id="org.eclipse.ui.views.TaskList"
-            name="%Views.Task">
-      </view>
-      <view
-            allowMultiple="true"
-            category="org.eclipse.ui"
-            class="org.eclipse.ui.internal.views.markers.ProblemsView"
-            icon="$nl$/icons/full/eview16/problems_view.gif"
-            id="org.eclipse.ui.views.ProblemView"
-            name="%Views.Problem">
-      </view>
-      <view
-            allowMultiple="true"
-            category="org.eclipse.ui"
-            class="org.eclipse.ui.internal.views.markers.AllMarkersView"
-            icon="$nl$/icons/full/eview16/problems_view.gif"
-            id="org.eclipse.ui.views.AllMarkersView"
-            name="%Views.AllMarkers">
-      </view>
-     
-    
-   </extension>
-   <extension
-         point="org.eclipse.ui.ide.resourceFilters">
-      <filter
-            selected="false"
-            pattern=".*">
-      </filter>
-   </extension>
-   <extension
-         point="org.eclipse.ui.propertyPages">
-      <page
-            class="org.eclipse.ui.internal.ide.dialogs.ProjectReferencePage"
-            id="org.eclipse.ui.propertypages.project.reference"
-            name="%PropertyPages.project.reference"
-            >
-         <enabledWhen>
-            <adapt type="org.eclipse.core.resources.IProject"/>
-         </enabledWhen>
-      </page>
-      <page
-            class="org.eclipse.ui.internal.ide.dialogs.ResourceInfoPage"
-            id="org.eclipse.ui.propertypages.info.file"
-            name="%PropertyPages.info.file"
-            >
-         <enabledWhen>
-            <adapt type="org.eclipse.core.resources.IResource"/>
-         </enabledWhen>
-      </page>
-      <page
-            class="org.eclipse.ui.internal.views.markers.MarkersPropertyPage"
-            id="org.eclipse.ui.ide.markerEntry"
-            name="%PropertyPage.Markers">
-         <enabledWhen>
-            <adapt
-                  type="org.eclipse.core.resources.IMarker">
-            </adapt>
-         </enabledWhen>
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commands">
-      <category
-            name="%category.project.name"
-            description="%category.project.description"
-            id="org.eclipse.ui.category.project">
-      </category>
-      <command
-            name="%command.openWorkspace.name"
-            description="%command.openWorkspace.description"
-            categoryId="org.eclipse.ui.category.file"
-            id="org.eclipse.ui.file.openWorkspace">
-      </command>
-      <command
-            name="%command.newQuickMenu.name"
-            description="%command.newQuickMenu.description"
-            categoryId="org.eclipse.ui.category.file"
-            id="org.eclipse.ui.file.newQuickMenu">
-      </command>
-      <command
-            name="%command.openFile.name"
-            description="%command.openFile.description"
-            categoryId="org.eclipse.ui.category.file"
-            id="org.eclipse.ui.edit.text.openLocalFile">
-      </command>
-       <command
-            name="%command.showInQuickMenu.name"
-            description="%command.showInQuickMenu.description"
-            categoryId="org.eclipse.ui.category.navigate"
-            id="org.eclipse.ui.navigate.showInQuickMenu">
-      </command>
-      <command
-            name="%command.goToResource.name"
-            description="%command.goToResource.description"
-            categoryId="org.eclipse.ui.category.navigate"
-            id="org.eclipse.ui.navigate.goToResource">
-      </command>
-      <commandParameterType
-            converter="org.eclipse.ui.internal.ide.commands.ResourcePathConverter"
-            id="org.eclipse.ui.ide.resourcePath"
-            type="org.eclipse.core.resources.IResource"/>
-      <command
-            name="%command.openResource.name"
-            description="%command.openResource.description"
-            categoryId="org.eclipse.ui.category.navigate"
-            id="org.eclipse.ui.navigate.openResource"
-            defaultHandler="org.eclipse.ui.internal.ide.handlers.OpenResourceHandler">
-         <commandParameter
-               id="filePath"
-               name="%commandParameter.openFileByPath.filePath.name"
-               typeId="org.eclipse.ui.ide.resourcePath"/>
-      </command>
-      <command
-            name="%command.openProject.name"
-            description="%command.openProject.description"
-            categoryId="org.eclipse.ui.category.project"
-            id="org.eclipse.ui.project.openProject">
-      </command>
-      <command
-            name="%command.closeProject.name"
-            description="%command.closeProject.description"
-            categoryId="org.eclipse.ui.category.project"
-            id="org.eclipse.ui.project.closeProject">
-      </command>
-      <command
-            name="%command.closeUnrelatedProjects.name"
-            description="%command.closeUnrelatedProjects.description"
-            categoryId="org.eclipse.ui.category.project"
-            id="org.eclipse.ui.project.closeUnrelatedProjects">
-      </command>
-      <command
-            name="%command.buildProject.name"
-            description="%command.buildProject.description"
-            categoryId="org.eclipse.ui.category.project"
-            id="org.eclipse.ui.project.buildProject">
-      </command>
-      <command
-            name="%command.rebuildProject.name"
-            description="%command.rebuildProject.description"
-            categoryId="org.eclipse.ui.category.project"
-            id="org.eclipse.ui.project.rebuildProject">
-      </command>
-      <command
-            name="%command.buildAutomatically.name"
-            description="%command.buildAutomatically.description"
-            categoryId="org.eclipse.ui.category.project"
-            id="org.eclipse.ui.project.buildAutomatically">
-      </command>
-      <command
-            name="%command.buildAll.name"
-            description="%command.buildAll.description"
-            categoryId="org.eclipse.ui.category.project"
-            id="org.eclipse.ui.project.buildAll">
-      </command>
-      <command
-            name="%command.rebuildAll.name"
-            description="%command.rebuildAll.description"
-            categoryId="org.eclipse.ui.category.project"
-            id="org.eclipse.ui.project.rebuildAll">
-      </command>
-      <command
-            name="%command.buildLast.name"
-            description="%command.buildLast.description"
-            categoryId="org.eclipse.ui.category.project"
-            id="org.eclipse.ui.project.buildLast">
-      </command>
-      <command
-            name="%command.buildClean.name"
-            description="%command.buildClean.description"
-            categoryId="org.eclipse.ui.category.project"
-            id="org.eclipse.ui.project.cleanAction">
-      </command>
-      <command
-            name="%command.projectProperties.name"
-            description="%command.projectProperties.description"
-            categoryId="org.eclipse.ui.category.project"
-            id="org.eclipse.ui.project.properties">
-      </command>
-      <command
-            name="%command.addTask.name"
-            description="%command.addTask.description"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.ui.edit.addTask">
-      </command>
-      <command
-            name="%command.correctionAssistProposals.name"
-            description="%command.correctionAssistProposals.description"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.jdt.ui.edit.text.java.correction.assist.proposals">
-      </command>
-      <command
-            name="%command.selectWorkingSets.name"
-            description="%command.selectWorkingSets.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.navigate.selectWorkingSets">
-      </command>
-      <command
-            name="%command.addToWorkingSet.name"
-            description="%command.addToWorkingSet.description"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.ui.navigate.addToWorkingSet">
-      </command>
-       <command
-            name="%command.removeFromWorkingSet.name"
-            description="%command.removeFromWorkingSet.description"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.ui.navigate.removeFromWorkingSet">
-      </command>
-      <category
-            description="%category.update.description"
-            id="org.eclipse.ui.category.update"
-            name="%category.update.name"/>
-      <command
-            categoryId="org.eclipse.ui.category.update"
-            description="%command.manageConfiguration.description"
-            id="org.eclipse.ui.update.manageConfiguration"
-            name="%command.manageConfiguration.name"/>
-      <command
-            categoryId="org.eclipse.ui.category.update"
-            description="%command.findAndInstallUpdates.description"
-            id="org.eclipse.ui.update.findAndInstallUpdates"
-            name="%command.findAndInstallUpdates.name"/>
-      <command
-            categoryId="org.eclipse.ui.category.navigate"
-            defaultHandler="org.eclipse.ui.internal.ide.handlers.ShowResourceByPathHandler"
-            description="%command.showResourceByPath.description"
-            id="org.eclipse.ui.navigate.showResourceByPath"
-            name="%command.showResourceByPath.name">
-         <commandParameter
-               id="resourcePath"
-               name="%commandParameter.showResourceByPath.resourcePath.name"
-               optional="false"
-               typeId="org.eclipse.ui.ide.resourcePath"/>
-      </command>
-      <category
-            description="%ContentGenerator.CategoryDescription"
-            id="org.eclipse.ui.ide.markerContents"
-            name="%ContentGenerator.Category">
-      </category>
-      <command
-            defaultHandler="org.eclipse.ui.internal.views.markers.OpenMarkersViewHandler"
-            description="%command.newMarkersView.openNew.description"
-            id="org.eclipse.ui.ide.OpenMarkersView"
-            name="%command.newMarkersView.openNew.name">
-      </command>
-      <command
-            description="%command.deleteCompleted.description"
-            id="org.eclipse.ui.ide.deleteCompleted"
-            name="%command.deleteCompleted.name">
-      </command>
-   	  <command
-            description="%command.markCompleted.description"
-            id="org.eclipse.ui.ide.markCompleted"
-            name="%command.markCompleted.name">
-      </command>
-      <command
-            defaultHandler="org.eclipse.ui.internal.views.markers.ConfigureContentsDialogHandler"
-            description="%command.configureFilters.description"
-            id="org.eclipse.ui.ide.configureFilters"
-            name="%command.configureFilters.name">
-      </command>
-      <command
-            defaultHandler="org.eclipse.ui.internal.views.markers.ConfigureColumnsHandler"
-            description="%command.configureColumns.description"
-            id="org.eclipse.ui.ide.configureColumns"
-            name="%command.configureColumns.name">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.edit"
-            defaultHandler="org.eclipse.ui.internal.ide.commands.CopyBuildIdToClipboardHandler"
-            description="%command.copyBuildIdCommand.description"
-            id="org.eclipse.ui.ide.copyBuildIdCommand"
-            name="%command.copyBuildIdCommand.name">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.edit"
-            defaultHandler="org.eclipse.ui.internal.ide.commands.CopyConfigToClipboardHandler"
-            description="%command.copyConfigCommand.description"
-            id="org.eclipse.ui.ide.copyConfigCommand"
-            name="%command.copyConfigCommand.name">
-      </command>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.commandImages">
-      <image
-            commandId="org.eclipse.ui.navigate.goToResource"
-            icon="$nl$/icons/full/elcl16/gotoobj_tsk.gif" />
-   </extension>
-   
-   <extension
-   		 point="org.eclipse.ui.bindings">
-      <key
-      		commandId="org.eclipse.ui.window.showKeyAssist"
-      		contextId="org.eclipse.ui.contexts.dialogAndWindow"
-      		sequence="M1+M2+L"
-      		schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.jdt.ui.edit.text.java.correction.assist.proposals"
-            sequence="M1+1"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow" />
-      <key
-            commandId="org.eclipse.ui.navigate.openResource"
-            sequence="M1+M2+R"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.navigate.openResource"
-            sequence="CTRL+X CTRL+F"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.project.buildAll"
-            sequence="M1+B"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.navigate.showInQuickMenu"
-            contextId="org.eclipse.ui.contexts.window"
-            sequence="M2+M3+W"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            contextId="org.eclipse.ui.contexts.window"
-            sequence="M2+M3+W"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            commandId="org.eclipse.ui.navigate.showInQuickMenu"
-            contextId="org.eclipse.ui.contexts.window"
-            sequence="M1+M3+W"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.file.newQuickMenu"
-            contextId="org.eclipse.ui.contexts.window"
-            sequence="M2+M3+N"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            commandId=""
-            contextId="org.eclipse.ui.contexts.window"
-            sequence="M2+M3+N"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            commandId="org.eclipse.ui.file.newQuickMenu"
-            contextId="org.eclipse.ui.contexts.window"
-            sequence="M1+M3+N"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            sequence="M2+M3+Q Q"
-            contextId="org.eclipse.ui.contexts.window"
-            commandId="org.eclipse.ui.views.showView"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-      <key
-            platform="carbon"
-            sequence="M2+M3+Q Q"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-      <key
-            platform="carbon"
-            sequence="M1+M3+Q Q"
-            contextId="org.eclipse.ui.contexts.window"
-            commandId="org.eclipse.ui.views.showView"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
-      <key
-            sequence="M2+M3+Q X"
-            contextId="org.eclipse.ui.contexts.window"
-            commandId="org.eclipse.ui.views.showView"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
-            <parameter 
-            	id="org.eclipse.ui.views.showView.viewId"
-            	value="org.eclipse.ui.views.ProblemView" />
-      </key>
-      <key
-            platform="carbon"
-            sequence="M2+M3+Q X"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            sequence="M1+M3+Q X"
-            contextId="org.eclipse.ui.contexts.window"
-            commandId="org.eclipse.ui.views.showView"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
-            <parameter 
-            	id="org.eclipse.ui.views.showView.viewId" 
-            	value="org.eclipse.ui.views.ProblemView" />
-      </key>
-      <key
-            sequence="M2+M3+Q O"
-            contextId="org.eclipse.ui.contexts.window"
-            commandId="org.eclipse.ui.views.showView"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
-            <parameter
-            	id="org.eclipse.ui.views.showView.viewId"
-            	value="org.eclipse.ui.views.ContentOutline" />
-      </key>
-      <key
-            platform="carbon"
-            sequence="M2+M3+Q O"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            sequence="M1+M3+Q O"
-            contextId="org.eclipse.ui.contexts.window"
-            commandId="org.eclipse.ui.views.showView"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
-            <parameter
-            	id="org.eclipse.ui.views.showView.viewId" 
-            	value="org.eclipse.ui.views.ContentOutline" />
-      </key>
-      <key
-            commandId="org.eclipse.ui.window.quickAccess"
-            sequence="M1+3"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.systemSummarySections">
-      <section
-      		id="15.UpdateSection"
-            sectionTitle="%About.updateSummaryTitle"
-            class="org.eclipse.ui.internal.ide.dialogs.ConfigurationLogUpdateSection">
-      </section>
-   </extension>
-
-<!-- Update Actions -->
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer class="org.eclipse.ui.internal.ide.IDEPreferenceInitializer"/>
-   </extension>
-<!-- End Update -->
-  <extension
-         point="org.eclipse.ui.preferenceTransfer">
-       <transfer
-            id="org.eclipse.ui.ide.transfer.keys"
-            icon="/icons/full/obj16/keyspref_obj.gif"
-            name="%KeysPreference.Name">
-            <mapping scope="instance">
-            	<entry node="org.eclipse.ui.workbench">
-            	   <key name="org.eclipse.ui.commands"/>
-            	</entry>
-            	<entry node="org.eclipse.ui">
-            	   <key name="KEY_CONFIGURATION_ID"/>
-            	</entry>
-            </mapping>
-			<description>
-            	%KeysPreference.Description
-		    </description>
-	   </transfer>
-       <transfer
-             icon="$nl$/icons/full/eview16/problems_view.gif"
-             id="org.eclipse.ui.ide.problemFilters"
-             name="%PreferenceTransfer.ProblemsConfigurations">
-          <mapping
-                scope="instance">
-             <entry
-                   node="org.eclipse.ui.ide">
-                <key
-                      name="org.eclipse.ui.internal.views.markers.CachedMarkerBuilderorg.eclipse.ui.views.ProblemView">
-                </key>
-             </entry>
-          </mapping>
-          <description>
-             %PreferenceTransfer.ProblemsConfigurations.Description
-          </description>
-       </transfer>
-       <transfer
-             icon="$nl$/icons/full/eview16/tasks_tsk.gif"
-             id="org.eclipse.ui.ide.taskFilters"
-             name="%PreferenceTransfer.TasksConfigurations">
-          <mapping
-                scope="instance">
-             <entry
-                   node="org.eclipse.ui.ide">
-                <key
-                      name="org.eclipse.ui.internal.views.markers.CachedMarkerBuilderorg.eclipse.ui.views.TaskList">
-                </key>
-             </entry>
-          </mapping>
-          <description>
-             %PreferenceTransfer.TasksConfigurations.Description
-          </description>
-       </transfer>
-        <transfer
-              icon="$nl$/icons/full/eview16/bkmrk_nav.gif"
-              id="org.eclipse.ui.ide.bookmarksFilters"
-              name="%PreferenceTransfer.BookmarksConfigurations">
-          <mapping
-                scope="instance">
-             <entry
-                   node="org.eclipse.ui.ide">
-                <key
-                      name="org.eclipse.ui.internal.views.markers.CachedMarkerBuilderorg.eclipse.ui.views.BookmarkView">
-                </key>
-             </entry>
-          </mapping>
-          <description>
-             %PreferenceTransfer.BookmarksConfigurations.Description
-          </description>
-       </transfer>
-        <transfer
-              icon="$nl$/icons/full/eview16/problems_view.gif"
-              id="org.eclipse.ui.ide.allMarkersFilters"
-              name="%PreferenceTransfer.AllMarkersConfigurations">
-          <mapping
-                scope="instance">
-             <entry
-                   node="org.eclipse.ui.ide">
-                <key
-                      name="org.eclipse.ui.internal.views.markers.CachedMarkerBuilderorg.eclipse.ui.views.AllMarkersView">
-                </key>
-             </entry>
-          </mapping>
-          <description>
-             %PreferenceTransfer.AllMarkersConfigurations.Description
-          </description>
-       </transfer>
-   </extension>
-   
-   <!-- Adaptor factory for IWorkingSet to IContributorResourceAdapter, IWorkbenchAdapter, ResourceMapping -->
-      <extension
-         id="org.eclipse.ui.ide.resourceMappingAdapters"
-         point="org.eclipse.core.runtime.adapters">
-       <factory
-            class="org.eclipse.ui.internal.ide.model.WorkingSetAdapterFactory"
-            adaptableType="org.eclipse.ui.IWorkingSet">
-            <adapter type="org.eclipse.ui.IContributorResourceAdapter"/>
-       </factory>
-       <factory
-            class="org.eclipse.ui.internal.ide.model.WorkingSetAdapterFactory"
-            adaptableType="org.eclipse.ui.IWorkingSet">
-            <adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
-       </factory>
-       <factory
-            class="org.eclipse.ui.internal.ide.model.WorkingSetAdapterFactory"
-            adaptableType="org.eclipse.ui.IWorkingSet">
-            <adapter type="org.eclipse.core.resources.mapping.ResourceMapping"/>
-       </factory>
-       <factory
-            class="org.eclipse.ui.internal.ide.IURIEditorInputAdapterFactory"
-            adaptableType="org.eclipse.ui.IURIEditorInput">
-            <adapter type="org.eclipse.ui.IPathEditorInput"/>
-       </factory>
-       <factory
-             adaptableType="org.eclipse.ui.IFileEditorInput"
-             class="org.eclipse.ui.internal.ide.model.FileInputAdapterFactory">
-          <adapter
-                type="org.eclipse.core.resources.IFile">
-          </adapter>
-          <adapter
-                type="org.eclipse.core.resources.IResource">
-          </adapter>
-       </factory>
-       <factory
-             adaptableType="org.eclipse.ui.internal.views.markers.ExtendedMarkersView"
-             class="org.eclipse.ui.internal.views.markers.MarkerShowInAdapter">
-          <adapter
-                type="org.eclipse.ui.part.IShowInSource">
-          </adapter>
-       </factory>
-       <factory
-             adaptableType="org.eclipse.ui.internal.views.markers.ExtendedMarkersView"
-             class="org.eclipse.ui.internal.views.markers.MarkerHelpAdapterFactory">
-          <adapter
-                type="org.eclipse.help.IContextProvider">
-          </adapter>
-       </factory>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.activitySupport">
-      <triggerPoint id="org.eclipse.ui.ide.natures">
-         <hint
-               id="interactive"
-               value="false"/>
-      </triggerPoint>
-   </extension>
-  
-   <extension
-         point="org.eclipse.ui.ide.markerSupport">
-      <markerContentGenerator
-            defaultMarkerGrouping="org.eclipse.ui.ide.severity"
-            id="org.eclipse.ui.ide.problemsGenerator"
-            name="%ContentGenerator.Problems">
-         <markerFieldReference
-               id="org.eclipse.ui.ide.severityAndDescriptionField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.resourceField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.pathField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.locationField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.idField"
-               visible="false">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.creationTimeField"
-               visible="false">
-         </markerFieldReference>
-         <markerTypeReference
-               id="org.eclipse.core.resources.problemmarker">
-         </markerTypeReference>
-         <markerFieldConfiguration
-               enabled="false"
-               id="org.eclipse.ui.ide.errorsFilter"
-               name="%MarkerFilterGrouping.AllErrors"
-               scope="ON_ANY"
-               values="org.eclipse.ui.internal.views.markers.AllErrorsParameters">
-         </markerFieldConfiguration>
-     
-         <markerFieldConfiguration
-               enabled="false"
-               id="org.eclipse.ui.ide.selectedWarningsGrouping"
-               name="%MarkerFilterGrouping.SelectedWarnings"
-               scope="ON_SELECTED_AND_CHILDREN"
-               values="org.eclipse.ui.internal.views.markers.SelectedWarningsParameters">
-         </markerFieldConfiguration>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.markerType"
-               visible="true">
-         </markerFieldReference>
-         <markerGrouping
-               id="org.eclipse.ui.ide.type"
-               label="%markerGrouping.type">
-         </markerGrouping> </markerContentGenerator>
-      <markerField
-            class="org.eclipse.ui.internal.views.markers.MarkerCreationTimeField"
-            id="org.eclipse.ui.ide.creationTimeField"
-            name="%Field.CreationTime">
-      </markerField>
-      <markerField
-            class="org.eclipse.ui.internal.views.markers.MarkerProblemSeverityAndMessageField"
-            filterClass="org.eclipse.ui.internal.views.markers.ProblemsSeverityAndDescriptionFieldFilter"
-            filterConfigurationClass="org.eclipse.ui.internal.views.markers.ProblemsSeverityAndDescriptionConfigurationArea"
-            id="org.eclipse.ui.ide.severityAndDescriptionField"
-            name="%Field.Description">
-      </markerField>
-      <markerField
-            class="org.eclipse.ui.internal.views.markers.MarkerResourceField"
-            id="org.eclipse.ui.ide.resourceField"
-            name="%Field.Resource">
-      </markerField>
-      <markerField
-            class="org.eclipse.ui.internal.views.markers.MarkerPathField"
-            id="org.eclipse.ui.ide.pathField"
-            name="%Field.Path">
-      </markerField>
-      <markerField
-            class="org.eclipse.ui.internal.views.markers.MarkerLocationField"
-            id="org.eclipse.ui.ide.locationField"
-            name="%Field.Location">
-      </markerField>
-      <markerField
-            class="org.eclipse.ui.internal.views.markers.MarkerIDField"
-            id="org.eclipse.ui.ide.idField"
-            name="%Field.ID">
-      </markerField>
-      <markerContentGenerator
-            id="org.eclipse.ui.ide.tasksGenerator"
-            name="%ContentGenerator.Tasks">
-         <markerFieldReference
-               id="org.eclipse.ui.ide.completionField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.priorityField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.descriptionField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.resourceField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.pathField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.locationField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.creationTimeField"
-               visible="false">
-         </markerFieldReference>
-         <markerTypeReference
-               id="org.eclipse.core.resources.taskmarker">
-         </markerTypeReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.markerType"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldConfiguration
-               enabled="false"
-               id="org.eclipse.ui.ide.todosGrouping"
-               name="%MarkerFilterGrouping.TODO"
-               scope="ON_SELECTED_AND_CHILDREN"
-               values="org.eclipse.ui.internal.views.markers.TodoFiltersContributionParameters">
-         </markerFieldConfiguration>
-         <markerGrouping
-               id="org.eclipse.ui.ide.type"
-               label="%markerGrouping.type">
-         </markerGrouping>
-      </markerContentGenerator>
-      <markerField
-            class="org.eclipse.ui.internal.views.markers.MarkerCompletionField"
-            filterClass="org.eclipse.ui.internal.views.markers.CompletionFieldFilter"
-            filterConfigurationClass="org.eclipse.ui.internal.views.markers.CompletionConfigurationArea"
-            icon="$nl$/icons/full/obj16/header_complete.gif"
-            id="org.eclipse.ui.ide.completionField"
-            name="%Field.Completion">
-      </markerField>
-      <markerField
-            class="org.eclipse.ui.internal.views.markers.MarkerPriorityField"
-            filterClass="org.eclipse.ui.internal.views.markers.PriorityMarkerFieldFilter"
-            filterConfigurationClass="org.eclipse.ui.internal.views.markers.PriorityConfigurationArea"
-            icon="icons/full/obj16/header_priority.gif"
-            id="org.eclipse.ui.ide.priorityField"
-            name="%Field.Priority">
-      </markerField>
-      <markerField
-            class="org.eclipse.ui.internal.views.markers.MarkerDescriptionField"
-            filterClass="org.eclipse.ui.internal.views.markers.DescriptionFieldFilter"
-            filterConfigurationClass="org.eclipse.ui.internal.views.markers.DescriptionConfigurationArea"
-            id="org.eclipse.ui.ide.descriptionField"
-            name="%Field.Description">
-      </markerField>
-      <markerContentGenerator
-            id="org.eclipse.ui.ide.bookmarksGenerator"
-            name="%ContentGenerator.Bookmarks">
-         <markerFieldReference
-               id="org.eclipse.ui.ide.descriptionField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.resourceField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.pathField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.locationField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.idField"
-               visible="false">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.creationTimeField"
-               visible="false">
-         </markerFieldReference>
-         <markerTypeReference
-               id="org.eclipse.core.resources.bookmark">
-         </markerTypeReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.markerType"
-               visible="false">
-         </markerFieldReference>
-      </markerContentGenerator>
-      <markerField
-            class="org.eclipse.ui.internal.views.markers.MarkerTypeField"
-            filterClass="org.eclipse.ui.internal.views.markers.MarkerTypeFieldFilter"
-            filterConfigurationClass="org.eclipse.ui.internal.views.markers.TypesConfigurationArea"
-            id="org.eclipse.ui.ide.markerType"
-            name="%Field.Type">
-      </markerField>
-      <markerContentGenerator
-            defaultMarkerGrouping="org.eclipse.ui.ide.type"
-            id="org.eclipse.ui.ide.allMarkersGenerator"
-            name="%ContentGenerator.AllMarkers">
-              <markerFieldReference
-               id="org.eclipse.ui.ide.allSeverityField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.resourceField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.pathField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.locationField"
-               visible="true">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.markerType">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.idField"
-               visible="false">
-         </markerFieldReference>
-         <markerFieldReference
-               id="org.eclipse.ui.ide.creationTimeField"
-               visible="false">
-         </markerFieldReference>
-         <markerTypeReference
-               id="org.eclipse.core.resources.marker">
-         </markerTypeReference>
-         <markerGrouping
-               id="org.eclipse.ui.ide.type"
-               label="%markerGrouping.type">
-         </markerGrouping>
-         <markerGrouping
-               id="org.eclipse.ui.ide.allMarkers.severity"
-               label="%markerGrouping.severity">
-            <markerGroupingEntry
-                  id="org.eclipse.ui.ide.allMarkers.errorSeverity"
-                  label="%markerGrouping.errors"
-                  priority="30">
-            </markerGroupingEntry>
-            <markerGroupingEntry
-                  id="org.eclipse.ui.ide.allMarkers.warningSeverity"
-                  label="%markerGrouping.warnings"
-                  priority="20">
-            </markerGroupingEntry>
-            <markerGroupingEntry
-                  id="org.eclipse.ui.ide.allMarkers.other"
-                  label="%markerGrouping.other"
-                  priority="10">
-            </markerGroupingEntry>
-            <markerAttributeGrouping
-                  attribute="severity"
-                  markerType="org.eclipse.core.resources.marker">
-               <markerAttributeMapping
-                     markerGroupingEntry="org.eclipse.ui.ide.allMarkers.errorSeverity"
-                     value="2">
-               </markerAttributeMapping>
-               <markerAttributeMapping
-                     markerGroupingEntry="org.eclipse.ui.ide.allMarkers.warningSeverity"
-                     value="1">
-               </markerAttributeMapping>
-               <markerAttributeMapping
-                     markerGroupingEntry="org.eclipse.ui.ide.allMarkers.other"
-                     value="0">
-               </markerAttributeMapping>
-               <markerAttributeMapping
-                     markerGroupingEntry="org.eclipse.ui.ide.allMarkers.other"
-                     value="-1">
-               </markerAttributeMapping>
-            </markerAttributeGrouping>
-         </markerGrouping>
-      </markerContentGenerator>
-      <markerGrouping
-            id="org.eclipse.ui.ide.severity"
-            label="%markerGrouping.severity">
-         <markerGroupingEntry
-               id="org.eclipse.ui.ide.errorSeverity"
-               label="%markerGrouping.errors"
-               markerGrouping="org.eclipse.ui.ide.severity"
-               priority="30">
-         </markerGroupingEntry>
-         <markerGroupingEntry
-               id="org.eclipse.ui.ide.warningSeverity"
-               label="%markerGrouping.warnings"
-               markerGrouping="org.eclipse.ui.ide.severity"
-               priority="20">
-         </markerGroupingEntry>
-         <markerGroupingEntry
-               id="org.eclipse.ui.ide.infoSeverity"
-               label="%markerGrouping.infos"
-               markerGrouping="org.eclipse.ui.ide.severity"
-               priority="10">
-         </markerGroupingEntry>
-         <markerAttributeGrouping
-               attribute="severity"
-               markerType="org.eclipse.core.resources.problemmarker">
-            <markerAttributeMapping
-                  markerGroupingEntry="org.eclipse.ui.ide.errorSeverity"
-                  value="2">
-            </markerAttributeMapping>
-            <markerAttributeMapping
-                  markerGroupingEntry="org.eclipse.ui.ide.warningSeverity"
-                  value="1">
-            </markerAttributeMapping>
-            <markerAttributeMapping
-                  markerGroupingEntry="org.eclipse.ui.ide.infoSeverity"
-                  value="0">
-            </markerAttributeMapping>
-         </markerAttributeGrouping>
-      </markerGrouping>
-      <markerField
-            class="org.eclipse.ui.internal.views.markers.MarkerSeverityAndDescriptionField"
-            filterClass="org.eclipse.ui.internal.views.markers.AllMarkersSeverityAndDescriptionFieldFilter"
-            filterConfigurationClass="org.eclipse.ui.internal.views.markers.AllMarkersSeverityAndDescriptionConfigurationArea"
-            id="org.eclipse.ui.ide.allSeverityField"
-            name="%Field.Description">
-      </markerField>
-     
-   </extension>
-   <extension
-         point="org.eclipse.ui.menus">
-         <menuContribution
-            locationURI="menu:window?after=newEditor">
-         <command
-               commandId="org.eclipse.ui.ToggleCoolbarAction"
-               tooltip="%menu.toggleCoolbar.tooltip"
-               style="push">
-            <visibleWhen
-                  checkEnabled="false">
-                  <or>
-               		<with
-                  	   variable="activeWorkbenchWindow.isCoolbarVisible">
-                  		<equals
-                        	value="false">
-                  		</equals>
-               		</with>
-               		<with
-                    	 variable="activeWorkbenchWindow.isPerspectiveBarVisible">
-                  		<equals
-                        	value="false">
-                  		</equals>
-               		</with>
-               </or>
-            </visibleWhen>
-         </command>
-      </menuContribution>
-      <menuContribution
-            locationURI="popup:windowCoolbarContextMenu">
-         <command
-               commandId="org.eclipse.ui.ToggleCoolbarAction"
-               style="push"
-               tooltip="%menu.toggleCoolbar.tooltip">
-               <!-- no visibility needed - the result of this action will remove the ability to show this menu anyway -->
-         </command>
-        
-      </menuContribution>
-     
-      <menuContribution
-            locationURI="popup:org.eclipse.ui.ide.MarkersView">
-          <command
-                commandId="org.eclipse.ui.navigate.goToResource"
-                mnemonic="%command.goToResource.mnemonic"
-                style="push">
-          </command>
-         <separator
-               name="org.eclipse.ui.ide.separator4"
-               visible="true">
-         </separator>
-         <command
-               commandId="org.eclipse.ui.edit.copy">
-         </command>
-         <command
-               commandId="org.eclipse.ui.edit.delete">
-         </command>
-           <command
-               commandId="org.eclipse.ui.edit.selectAll">
-         </command>
-         <separator
-               name="org.eclipse.ui.ide.markersSeperator1"
-               visible="true">
-         </separator>
-         <menu
-               commandId="org.eclipse.ui.navigate.showInQuickMenu"
-               id="org.eclipse.ui.ide.markers.showInMenu"
-               label="%menu.showIn.label"
-               mnemonic="%menu.showIn.mnemonic">
-            <dynamic
-                  class="org.eclipse.ui.ExtensionFactory:showInContribution"
-                  id="org.eclipse.ui.menus.dynamicShowInMenu">
-            </dynamic>
-         </menu>
-           <command
-                 commandId="org.eclipse.jdt.ui.edit.text.java.correction.assist.proposals"
-                 mnemonic="%command.correctionAssistProposals.mnemonic"
-                 style="push">
-              <visibleWhen
-                    checkEnabled="false">
-                 <with
-                       variable="activePart">
-                    <test
-                          args="org.eclipse.ui.ide.problemsGenerator"
-                          property="org.eclipse.ui.ide.contentGenerator">
-                    </test>
-                 </with>
-              </visibleWhen>
-         </command>
-           <command
-                 commandId="org.eclipse.ui.edit.addTask"
-                 mnemonic="%command.addTask.mnemonic"
-                 style="push">
-              <visibleWhen
-                    checkEnabled="false">
-                 <with
-                       variable="activePart">
-                    <test
-                          args="org.eclipse.ui.ide.tasksGenerator"
-                          forcePluginActivation="false"
-                          property="org.eclipse.ui.ide.contentGenerator">
-                    </test>
-                 </with>
-              </visibleWhen>
-           </command>
-           <command
-                 commandId="org.eclipse.ui.edit.delete"
-                 style="push">
-              <visibleWhen
-                    checkEnabled="false">
-                 <or>
-                    <with
-                          variable="activePart">
-                       <test
-                             args="org.eclipse.ui.ide.tasksGenerator"
-                             property="org.eclipse.ui.ide.contentGenerator">
-                       </test>
-                    </with>
-                    <with
-                          variable="activePart">
-                       <test
-                             args="org.eclipse.ui.ide.bookmarksGenerator"
-                             property="org.eclipse.ui.ide.contentGenerator">
-                       </test>
-                    </with>
-                 </or>
-              </visibleWhen>
-           </command>
-           <command
-                 commandId="org.eclipse.ui.ide.deleteCompleted"
-                 mnemonic="%command.deleteCompleted.name"
-                 style="push">
-              <visibleWhen
-                    checkEnabled="false">
-                 <with
-                       variable="activePart">
-                    <test
-                          args="org.eclipse.ui.ide.tasksGenerator"
-                          property="org.eclipse.ui.ide.contentGenerator">
-                    </test>
-                 </with>
-              </visibleWhen>
-           </command>
-            <command
-                 commandId="org.eclipse.ui.ide.markCompleted"
-                 mnemonic="%command.markCompleted.name"
-                 style="push">
-              <visibleWhen
-                    checkEnabled="false">
-                 <with
-                       variable="activePart">
-                    <test
-                          args="org.eclipse.ui.ide.tasksGenerator"
-                          property="org.eclipse.ui.ide.contentGenerator">
-                    </test>
-                 </with>
-              </visibleWhen>
-           </command>
-         <separator
-               name="org.eclipse.ui.ide.markersSeperator3"
-               visible="true">
-         </separator>
-          <command
-               commandId="org.eclipse.ui.file.properties">
-             <visibleWhen
-                   checkEnabled="false">
-                <and>
-                   <count
-                         value="1">
-                   </count>
-                   <with
-                      variable="selection">
-                   <iterate
-                         operator="or">
-                      <instanceof
-                            value="org.eclipse.ui.internal.views.markers.MarkerEntry">
-                      </instanceof>
-                   </iterate>
-                </with>
-                </and>
-               
-             </visibleWhen>
-         </command>
-      </menuContribution>
-  
-    
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.views.ProblemView">
-         <menu
-               id="org.eclipse.ui.ide.problems.contentsMenu"
-               label="%MarkerContentsMenu.Contents.name">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.ContentsContribution"
-                  id="org.eclipse.ui.ide.contentsContribution">
-            </dynamic>
-            <visibleWhen
-                  checkEnabled="false">
-               <with
-                     variable="activePart">
-                  <test
-                        property="org.eclipse.ui.ide.multipleContentGenerators">
-                  </test>
-               </with>
-            </visibleWhen>
-         </menu>
-         <menu
-               id="org.eclipse.ui.ide.problems.filtersMenu"
-               label="%MarkerFiltersMenu.Show">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.FiltersContribution"
-                  id="org.eclipse.ui.ide.filtersContribution">
-            </dynamic>
-            <visibleWhen
-                  checkEnabled="false">
-               <with
-                     variable="activePart">
-                  <test
-                        property="org.eclipse.ui.ide.hasFilters">
-                  </test>
-               </with>
-            </visibleWhen>
-         </menu>
-         <menu
-               id="problemsGroupByMenu"
-               label="%MarkerGroupMenu.GroupBy">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.GroupsContribution"
-                  id="org.eclipse.ui.ide.dynamic1">
-            </dynamic>
-         </menu>
-         <menu
-               id="org.eclipse.ui.ide.problems.markerSortMenu"
-               label="%Menu.Sort.label"
-               mnemonic="%Menu.Sort.mnemonic">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.SortFieldContribution"
-                  id="org.eclipse.ui.ide.problems.sortEntries">
-            </dynamic>
-         </menu>
-         <command
-               commandId="org.eclipse.ui.ide.OpenMarkersView"
-               label="%OpenAnother.Problems"
-               mnemonic="%OpenAnother.Mnemonic">
-         </command>
-         <command
-               commandId="org.eclipse.ui.ide.configureFilters"
-               mnemonic="%command.configureFilters.mnemonic"
-               style="push">
-         </command>
-         <command
-               commandId="org.eclipse.ui.ide.configureColumns"
-               mnemonic="%command.configureColumns.mnemonic"
-               style="push">
-         </command>
-         <command
-               commandId="org.eclipse.ui.window.preferences"
-               label="%command.preferences.label"
-               mnemonic="%command.preferences.mnemonic"
-               style="push">
-            <parameter
-                  name="preferencePageId"
-                  value="org.eclipse.ui.ide.markers">
-            </parameter>
-         </command>
-      </menuContribution>
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.views.TaskList">
-         <menu
-               id="org.eclipse.ui.ide.tasks.contentsMenu"
-               label="%MarkerContentsMenu.Contents.name">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.ContentsContribution"
-                  id="org.eclipse.ui.ide.contentsContribution">
-            </dynamic>
-            <visibleWhen
-                  checkEnabled="false">
-               <with
-                     variable="activePart">
-                  <test
-                        property="org.eclipse.ui.ide.multipleContentGenerators">
-                  </test>
-               </with>
-            </visibleWhen>
-         </menu>
-         <menu
-               id="org.eclipse.ui.ide.tasks.filtersMenu"
-               label="%MarkerFiltersMenu.Show">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.FiltersContribution"
-                  id="org.eclipse.ui.ide.filtersContribution">
-            </dynamic>
-            <visibleWhen
-                  checkEnabled="false">
-               <with
-                     variable="activePart">
-                  <test
-                        property="org.eclipse.ui.ide.hasFilters">
-                  </test>
-               </with>
-            </visibleWhen>
-         </menu>
-         <menu
-               id="tasksGroupByMenu"
-               label="%MarkerGroupMenu.GroupBy">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.GroupsContribution"
-                  id="org.eclipse.ui.ide.dynamic1">
-            </dynamic>
-         </menu>
-         <menu
-               id="org.eclipse.ui.ide.tasks.markerSortMenu"
-               label="%Menu.Sort.label"
-               mnemonic="%Menu.Sort.mnemonic">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.SortFieldContribution"
-                  id="org.eclipse.ui.ide.tasks.sortEntries">
-            </dynamic>
-         </menu>
-         <command
-               commandId="org.eclipse.ui.ide.OpenMarkersView"
-               label="%OpenAnother.Tasks"
-               mnemonic="%OpenAnother.Mnemonic">
-         </command>
-          <command
-               commandId="org.eclipse.ui.ide.configureFilters"
-               mnemonic="%command.configureFilters.mnemonic"
-               style="push">
-         </command>
-         <command
-               commandId="org.eclipse.ui.ide.configureColumns"
-               mnemonic="%command.configureColumns.mnemonic"
-               style="push">
-         </command>
-         <command
-               commandId="org.eclipse.ui.window.preferences"
-               label="%command.preferences.label"
-               mnemonic="%command.preferences.mnemonic"
-               style="push">
-            <parameter
-                  name="preferencePageId"
-                  value="org.eclipse.ui.ide.markers">
-            </parameter>
-         </command>
-      </menuContribution>
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.views.BookmarkView">
-         <menu
-               id="org.eclipse.ui.ide.bookmarks.contentsMenu"
-               label="%MarkerContentsMenu.Contents.name">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.ContentsContribution"
-                  id="org.eclipse.ui.ide.contentsContribution">
-            </dynamic>
-            <visibleWhen
-                  checkEnabled="false">
-               <with
-                     variable="activePart">
-                  <test
-                        property="org.eclipse.ui.ide.multipleContentGenerators">
-                  </test>
-               </with>
-            </visibleWhen>
-         </menu>
-         <menu
-               id="org.eclipse.ui.ide.bookmarks.filtersMenu"
-               label="%MarkerFiltersMenu.Show">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.FiltersContribution"
-                  id="org.eclipse.ui.ide.filtersContribution">
-            </dynamic>
-            <visibleWhen
-                  checkEnabled="false">
-               <with
-                     variable="activePart">
-                  <test
-                        property="org.eclipse.ui.ide.hasFilters">
-                  </test>
-               </with>
-            </visibleWhen>
-         </menu>
-         <menu
-               id="bookmarksGroupByMenu"
-               label="%MarkerGroupMenu.GroupBy">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.GroupsContribution"
-                  id="org.eclipse.ui.ide.dynamic1">
-            </dynamic>
-            <visibleWhen
-                  checkEnabled="false">
-               <with
-                     variable="activePart">
-                  <test
-                        property="org.eclipse.ui.ide.hasGroups">
-                  </test>
-               </with>
-            </visibleWhen>
-         </menu>
-         <menu
-               id="org.eclipse.ui.ide.bookmarks.markerSortMenu"
-               label="%Menu.Sort.label"
-               mnemonic="%Menu.Sort.mnemonic">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.SortFieldContribution"
-                  id="org.eclipse.ui.ide.tasks.sortEntries">
-            </dynamic>
-         </menu>
-         <command
-               commandId="org.eclipse.ui.ide.OpenMarkersView"
-               label="%OpenAnother.Bookmarks"
-               mnemonic="%OpenAnother.Mnemonic">
-         </command>
-          <command
-               commandId="org.eclipse.ui.ide.configureFilters"
-               mnemonic="%command.configureFilters.mnemonic"
-               style="push">
-         </command>
-         <command
-               commandId="org.eclipse.ui.ide.configureColumns"
-               mnemonic="%command.configureColumns.mnemonic"
-               style="push">
-         </command>
-         <command
-               commandId="org.eclipse.ui.window.preferences"
-               label="%command.preferences.label"
-               mnemonic="%command.preferences.mnemonic"
-               style="push">
-            <parameter
-                  name="preferencePageId"
-                  value="org.eclipse.ui.ide.markers">
-            </parameter>
-         </command>
-      </menuContribution>
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.views.AllMarkersView">
-         <menu
-               id="org.eclipse.ui.ide.allMarkers.contentsMenu"
-               label="%MarkerContentsMenu.Contents.name">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.ContentsContribution"
-                  id="org.eclipse.ui.ide.contentsContribution">
-            </dynamic>
-            <visibleWhen
-                  checkEnabled="false">
-               <with
-                     variable="activePart">
-                  <test
-                        property="org.eclipse.ui.ide.multipleContentGenerators">
-                  </test>
-               </with>
-            </visibleWhen>
-         </menu>
-         <menu
-               id="org.eclipse.ui.ide.allMarkers.filtersMenu"
-               label="%MarkerFiltersMenu.Show">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.FiltersContribution"
-                  id="org.eclipse.ui.ide.filtersContribution">
-            </dynamic>
-            <visibleWhen
-                  checkEnabled="false">
-               <with
-                     variable="activePart">
-                  <test
-                        property="org.eclipse.ui.ide.hasFilters">
-                  </test>
-               </with>
-            </visibleWhen>
-         </menu>
-         <menu
-               id="allMarkersGroupByMenu"
-               label="%MarkerGroupMenu.GroupBy">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.GroupsContribution"
-                  id="org.eclipse.ui.ide.groupsDynamic">
-            </dynamic>
-         </menu>
-         <menu
-               id="org.eclipse.ui.ide.allMarkers.markerSortMenu"
-               label="%Menu.Sort.label"
-               mnemonic="%Menu.Sort.mnemonic">
-            <dynamic
-                  class="org.eclipse.ui.internal.views.markers.SortFieldContribution"
-                  id="org.eclipse.ui.ide.problems.sortEntries">
-            </dynamic>
-         </menu>
-         <command
-               commandId="org.eclipse.ui.ide.OpenMarkersView"
-               label="%OpenAnother.Markers"
-               mnemonic="%OpenAnother.Mnemonic">
-         </command>
-         <command
-               commandId="org.eclipse.ui.ide.configureFilters"
-               mnemonic="%command.configureFilters.mnemonic"
-               style="push">
-         </command>
-         <command
-               commandId="org.eclipse.ui.ide.configureColumns"
-               mnemonic="%command.configureColumns.mnemonic"
-               style="push">
-         </command>
-         <command
-               commandId="org.eclipse.ui.window.preferences"
-               label="%command.preferences.label"
-               mnemonic="%command.preferences.mnemonic"
-               style="push">
-            <parameter
-                  name="preferencePageId"
-                  value="org.eclipse.ui.ide.markers">
-            </parameter>
-         </command>
-      </menuContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.handlers">
-      <handler
-            class="org.eclipse.ui.internal.views.markers.MarkerCopyHandler"
-            commandId="org.eclipse.ui.edit.copy">
-         <enabledWhen>
-            <count
-                  value="+">
-            </count>
-         </enabledWhen>
-         <activeWhen>
-            <with
-                  variable="activePart">
-               <test
-                     args="any"
-                     property="org.eclipse.ui.ide.contentGenerator">
-               </test>
-            </with>
-         </activeWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.views.markers.MarkerSelectAllHandler"
-            commandId="org.eclipse.ui.edit.selectAll">
-         <activeWhen>
-            <with
-                  variable="activePart">
-               <test
-                     args="any"
-                     property="org.eclipse.ui.ide.contentGenerator">
-               </test>
-            </with>
-         </activeWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.views.markers.MarkerGoToHandler"
-            commandId="org.eclipse.ui.navigate.goToResource">
-         <enabledWhen>
-            <iterate
-                  ifEmpty="false"
-                  operator="or">
-               <test
-                     forcePluginActivation="false"
-                     property="org.eclipse.ui.ide.fileMarker">
-               </test>
-            </iterate>
-        </enabledWhen>
-         <activeWhen>
-            <with
-                  variable="activePart">
-               <test
-                     args="any"
-                     property="org.eclipse.ui.ide.contentGenerator">
-               </test>
-            </with>
-         </activeWhen>
-
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.views.markers.QuickFixHandler"
-            commandId="org.eclipse.jdt.ui.edit.text.java.correction.assist.proposals">
-         <activeWhen>
-             <with
-                       variable="activePart">
-                    <test
-                          args="org.eclipse.ui.ide.problemsGenerator"
-                          property="org.eclipse.ui.ide.contentGenerator">
-                    </test>
-            </with>
-         </activeWhen>
-         <enabledWhen>
-            <and>
-               <iterate
-                     ifEmpty="false"
-                     operator="or">
-                  <test
-                        property="org.eclipse.ui.ide.quickFix">
-                  </test>
-               </iterate>
-               <count
-                     value="?">
-               </count>
-            </and>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.views.markers.AddTaskHandler"
-            commandId="org.eclipse.ui.edit.addTask">
-            <activeWhen>
-            <with
-                       variable="activePart">
-                    <test
-                          args="org.eclipse.ui.ide.tasksGenerator"
-                          property="org.eclipse.ui.ide.contentGenerator">
-                    </test>
-            </with>
-         </activeWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.views.markers.DeleteHandler"
-            commandId="org.eclipse.ui.edit.delete">
-         <enabledWhen>
-            <iterate
-                  ifEmpty="false"
-                  operator="and">
-               <test
-                     forcePluginActivation="false"
-                     property="org.eclipse.ui.ide.editable">
-               </test>
-            </iterate>
-         </enabledWhen>
-            <activeWhen>
-            <with
-                       variable="activePart">
-                    <test
-                          args="any"
-                          property="org.eclipse.ui.ide.contentGenerator">
-                    </test>
-            </with>
-         </activeWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.views.markers.DeleteCompletedHandler"
-            commandId="org.eclipse.ui.ide.deleteCompleted">
-            <activeWhen>
-            <with
-                       variable="activePart">
-                    <test
-                          args="org.eclipse.ui.ide.tasksGenerator"
-                          property="org.eclipse.ui.ide.contentGenerator">
-                    </test>
-                 </with>
-         </activeWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.views.markers.MarkCompletedHandler"
-            commandId="org.eclipse.ui.ide.markCompleted">
-            <activeWhen>
-             <with
-                       variable="activePart">
-                    <test
-                          args="org.eclipse.ui.ide.tasksGenerator"
-                          property="org.eclipse.ui.ide.contentGenerator">
-                    </test>
-                 </with>
-         </activeWhen>
-          <enabledWhen>
-            <iterate
-                  ifEmpty="false"
-                  operator="and">
-               <test
-                     forcePluginActivation="false"
-                     property="org.eclipse.ui.ide.editable">
-               </test>
-            </iterate>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.views.markers.MarkerPreferencesHandler"
-            commandId="org.eclipse.ui.window.preferences">
-         <activeWhen>
-            <with
-                  variable="activePart">
-               <instanceof
-                     value="org.eclipse.ui.views.markers.MarkerSupportView">
-               </instanceof>
-            </with>
-         </activeWhen>
-      </handler>
-   </extension>
-   <extension
-         point="org.eclipse.core.expressions.propertyTesters">
-      <propertyTester
-            class="org.eclipse.ui.internal.views.markers.QuickFixPropertyTester"
-            id="org.eclipse.ui.ide.quickFix"
-            namespace="org.eclipse.ui.ide"
-            properties="quickFix"
-            type="org.eclipse.ui.internal.views.markers.MarkerEntry">
-      </propertyTester>
-      <propertyTester
-            class="org.eclipse.ui.internal.views.markers.MarkersViewPropertyTester"
-            id="org.eclipse.ui.ide.contentGeneratorTest"
-            namespace="org.eclipse.ui.ide"
-            properties="contentGenerator"
-            type="org.eclipse.ui.internal.views.markers.ExtendedMarkersView">
-      </propertyTester>
-      <propertyTester
-            class="org.eclipse.ui.internal.views.markers.FileMarkerPropertyTester"
-            id="org.eclipse.ui.ide.fileMarkerTest"
-            namespace="org.eclipse.ui.ide"
-            properties="fileMarker"
-            type="org.eclipse.ui.internal.views.markers.MarkerEntry">
-      </propertyTester>
-      <propertyTester
-            class="org.eclipse.ui.internal.views.markers.EditablePropertyTester"
-            id="org.eclipse.ui.ide.editable"
-            namespace="org.eclipse.ui.ide"
-            properties="editable"
-            type="org.eclipse.ui.internal.views.markers.MarkerEntry">
-      </propertyTester>
-      <propertyTester
-            class="org.eclipse.ui.internal.views.markers.MarkersViewPropertyTester"
-            id="org.eclipse.ui.ide.hasFiltersTester"
-            namespace="org.eclipse.ui.ide"
-            properties="hasFilters"
-            type="org.eclipse.ui.internal.views.markers.ExtendedMarkersView">
-      </propertyTester>
-      <propertyTester
-            class="org.eclipse.ui.internal.views.markers.MarkersViewPropertyTester"
-            id="org.eclipse.ui.ide.hasGroupsTester"
-            namespace="org.eclipse.ui.ide"
-            properties="hasGroups"
-            type="org.eclipse.ui.internal.views.markers.ExtendedMarkersView">
-      </propertyTester>
-      <propertyTester
-            class="org.eclipse.ui.internal.views.markers.MarkerPropertyTester"
-            id="org.eclipse.ui.ide.markerTester"
-            namespace="org.eclipse.ui.ide.marker"
-            properties="severity,type,superType,priority,done,message,resourceType"
-            type="org.eclipse.core.resources.IMarker">
-      </propertyTester>
-   </extension>
-</plugin>
diff --git a/bundles/org.eclipse.ui.ide/schema/filesystemSupport.exsd b/bundles/org.eclipse.ui.ide/schema/filesystemSupport.exsd
deleted file mode 100644
index c99dbb0..0000000
--- a/bundles/org.eclipse.ui.ide/schema/filesystemSupport.exsd
+++ /dev/null
@@ -1,143 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.ide" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui.ide" id="filesystemSupport" name="File System Support"/>
-      </appinfo>
-      <documentation>
-         filesystemSupport supplies IDE contributions to support filesystems contributed using the org.eclipse.core.filesystem.filesystems extension point.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="filesystemContributor" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="filesystemContributor">
-      <complexType>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The label is the human readable label for this file system.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  class is the org.eclipse.ui.ide.fileSystem.FileSystemContributor used to handle browsing and validation of an org.eclipse.core.filesystem.IFileSystem.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.ide.fileSystem.FileSystemContributor"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="scheme" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The scheme is the scheme of a org.eclipse.core.filesystems.filesystem this contribution corresponds to.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.core.filesystem.filesystems/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.2
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-&lt;pre&gt;
- &lt;extension
-         point=&quot;org.eclipse.ui.ide.filesystemSupport&quot;&gt;
-      &lt;filesystemContributor       
-        class=&quot;myFileSystemContributor&quot;
-            label=&quot;My file system&quot;
-            scheme=&quot;myFilesystem &quot;/&gt;
-   &lt;/extension&gt;
-   
-   &lt;/pre&gt;
-&lt;/p&gt;
-
-The example above has a FileSystemContributor that maps to a org.eclipse.core.filesystems.filesystem that it is provding a user interface for.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The should be a one to one mapping of a org.eclipse.core.filesystems.filesystem scheme to filesystemContributor.
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         There are no filesystemSupports contributed by default. There is an internal implementation that supports the IResource that is backed by the file system.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui.ide/schema/markerHelp.exsd b/bundles/org.eclipse.ui.ide/schema/markerHelp.exsd
deleted file mode 100644
index 6645175..0000000
--- a/bundles/org.eclipse.ui.ide/schema/markerHelp.exsd
+++ /dev/null
@@ -1,154 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.ide" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui.ide" id="markerHelp" name="Marker Help"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to associate a help context id with a specific &quot;kind&quot; of marker (a marker of a certain type or having certain attribute values).
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="markerHelp" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="markerHelp">
-      <complexType>
-         <sequence>
-            <element ref="attribute" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="markerType" type="string">
-            <annotation>
-               <documentation>
-                  the unique type of the marker for which the help context applies.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.core.resources.markers/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="helpContextId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique id of the help context.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="attribute">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name"/>
-         </appinfo>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the attribute whose value is being specified.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the specified value of the attribute.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.0 (originally added in release 2.0 as org.eclipse.ui.markerHelp)
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of a marker help extension (note the sub-element and the way attributes are used):
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.ui.ide.markerHelp&quot;&gt;
-  &lt;markerHelp
-   markerType=&quot;org.eclipse.ui.examples.readmetool.readmemarker&quot;
-   helpContextId=&quot;org.eclipse.ui.examples.readmetool.marker_example1_context&quot;&gt;
-   &lt;attribute name=&quot;org.eclipse.ui.examples.readmetool.id&quot; value=&quot;1234&quot;/&gt;
-  &lt;/markerHelp&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-In the example above, a help context id is associated with markers of type org.eclipse.ui.examples.readmetool.readmemarker
-whose org.eclipse.ui.examples.readmetool.id attribute has a value of 1234.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         It is up to the developer to ensure that only a single help context id is supplied for a given marker.
-If two or more help context ids are supplied for a given kind of marker, the workbench does not define which will be returned.
-However the workbench does define that the &quot;most specific&quot; context id will always be returned for a given marker.
-That is, a context id associated with three matching attribute values will be returned before a context id associated with only two.
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui.ide/schema/markerImageProviders.exsd b/bundles/org.eclipse.ui.ide/schema/markerImageProviders.exsd
deleted file mode 100644
index 035a264..0000000
--- a/bundles/org.eclipse.ui.ide/schema/markerImageProviders.exsd
+++ /dev/null
@@ -1,152 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.ide" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui.ide" id="markerImageProviders" name="Marker Image Providers"/>
-      </appinfo>
-      <documentation>
-         The markerImageProvider extension point is the point for specifying the images for marker types in the defining plug-in.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="imageprovider" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="imageprovider">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that can be used to identify this markerImageProvider.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="markertype" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The markertype is the id of the type defined in &lt;code&gt;org.eclipse.core.resources.IMarker&lt;/code&gt; that this definition is applied to.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.core.resources.markers/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  If there is no class defined the icon attribute is used to define the icon that will be applied to this type of marker.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  The class is the fully qualifed name of the class that will be used to look up an image. This class must implement &lt;code&gt;IMarkerImageProvider&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.0 (originally added in release 2.1 as org.eclipse.ui.markerImageProviders)
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following an example of the two forms of marker image providers. The first one is one where the image does not change and is declared directly. For the second one the image must be determined by an instance of IMarkerImageProvider.
- 
-&lt;p&gt;
-&lt;pre&gt;
-  &lt;extension
-         point=&quot;org.eclipse.ui.ide.markerImageProviders&quot;&gt;
-      &lt;imageprovider
-        markertype=&quot;org.eclipse.core.resources.taskmarker&quot;
-            icon=&quot;taskicon.gif&quot;
-            id=&quot;myPlugin.declarativeMarkerProvider&quot;&gt;
-      &lt;/imageprovider&gt;
-      &lt;imageprovider
-            markertype=&quot;org.eclipse.core.resources.problemmarker&quot;
-            class=&quot;myPlugin.MyIMarkerImageProvider&quot;
-            id=&quot;myPlugin.implementedMarkerProvider&quot;&gt;
-      &lt;/imageprovider&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         markerImageProvider is currently internal and should not be considered API.
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         Image providers are currently registered for the bookmarks, tasks and problem markers.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui.ide/schema/markerResolution.exsd b/bundles/org.eclipse.ui.ide/schema/markerResolution.exsd
deleted file mode 100644
index 58cf1a3..0000000
--- a/bundles/org.eclipse.ui.ide/schema/markerResolution.exsd
+++ /dev/null
@@ -1,152 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.ide" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui.ide" id="markerResolution" name="Marker Resolutions"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to associate a marker resolution generator with a specific &quot;kind&quot; of marker.
-(a marker of a certain type or having certain attribute values).
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="markerResolutionGenerator" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="markerResolutionGenerator">
-      <complexType>
-         <sequence>
-            <element ref="attribute" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the class implementing &lt;code&gt;IMarkerResolutionGenerator&lt;/code&gt;. For better performance it should also implement &lt;code&gt;IMarkerResolutionGenerator2&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.IMarkerResolutionGenerator"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="markerType" type="string">
-            <annotation>
-               <documentation>
-                  the marker type for which this marker resolution generator applies. It does not apply to marker subtypes.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.core.resources.markers/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="attribute">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name"/>
-         </appinfo>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the attribute whose value is being specified.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the specified value of the attribute.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.0 (originally added in release 2.0 as org.eclipse.ui.markerResolution)
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of a marker resolution generator extension (note the sub-element and the way attributes are used):
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.ui.ide.markerResolution&quot;&gt;
-  &lt;markerResolutionGenerator
-   class=&quot;org.eclipse.ui.examples.readmetool.ReadmeMarkerResolutionGenerator&quot;
-   markerType=&quot;org.eclipse.ui.examples.readmetool.readmemarker&quot;&gt;
-   &lt;attribute name=&quot;org.eclipse.ui.examples.readmetool.id&quot; value=&quot;1234&quot;/&gt;
-  &lt;/markerResolutionGenerator&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-In the example above, a marker resolution generator is associated with markers of type org.eclipse.ui.examples.readmetool.readmemarker
-whose org.eclipse.ui.examples.redmetool.id attribute has a value of 1234.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         More than one marker resolution generator may be supplied for a given marker.
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui.ide/schema/markerSupport.exsd b/bundles/org.eclipse.ui.ide/schema/markerSupport.exsd
deleted file mode 100644
index 14d2be4..0000000
--- a/bundles/org.eclipse.ui.ide/schema/markerSupport.exsd
+++ /dev/null
@@ -1,637 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.ide" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui.ide" id="markerSupport" name="Marker Support"/>
-      </appinfo>
-      <documentation>
-         The Marker Support extension point defines extensions to the workbench tools that show markers such as the problems, bookmarks and tasks views.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="problemFilter" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="markerTypeCategory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="markerGrouping" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="markerGroupingEntry" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="markerAttributeGrouping" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="markerContentGenerator" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="markerField" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="markerContentGeneratorExtension" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="problemFilter">
-      <annotation>
-         <documentation>
-            A problem filter is a filter that can be applied to the problems view.
-@deprecated in 3.4. Use markerFieldConfiguration and bind it to the markerContentGenerator you specify.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="selectedType"/>
-         </sequence>
-         <attribute name="enabled" type="boolean">
-            <annotation>
-               <documentation>
-                  Whether or not this filter is enabled by default. If this value is not specified the value is true.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="scope">
-            <annotation>
-               <documentation>
-                  The scope of the filter. One of 
-ON_ANY: any item in the workbench
-ON_SELECTED_ONLY: on the currently selected item
-ON_SELECTED_AND_CHILDREN: on the currently selected item and it&apos;s children
-ON_ANY_IN_SAME_CONTAINER: on any item with the same top level container as the selection
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="ON_ANY">
-                  </enumeration>
-                  <enumeration value="ON_SELECTED_ONLY">
-                  </enumeration>
-                  <enumeration value="ON_SELECTED_AND_CHILDREN">
-                  </enumeration>
-                  <enumeration value="ON_ANY_IN_SAME_CONTAINER">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="onDescription" type="string">
-            <annotation>
-               <documentation>
-                  The description of the problem to check against. If this value is preceded with a ! the check will check that the description does not contain this string.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="severity">
-            <annotation>
-               <documentation>
-                  The severity of problem this filter is enabled for. If this value is not set then no filtering by severity will occur. Severity can be one of the following values: ERROR, WARNING or INFO.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="ERROR">
-                  </enumeration>
-                  <enumeration value="WARNING">
-                  </enumeration>
-                  <enumeration value="INFO">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The human readable name of the filter.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id of the filter.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="selectedType">
-      <annotation>
-         <documentation>
-            The selectedTypes are the ids of the marker types selected by default in this filter. If there are no selected types all marker types are enabled. All types not specified in this filter are disabled by default.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="markerId" type="string">
-            <annotation>
-               <documentation>
-                  The id of a marker that is enabled by default.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.core.resources.markers/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="markerTypeCategory">
-      <annotation>
-         <documentation>
-            The markerTypeCategory is an element for grouping marker types into a single category.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="1" maxOccurs="unbounded">
-            <element ref="markerTypeReference"/>
-         </sequence>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The label is the human readable name that will be presented to the user.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="markerTypeReference">
-      <annotation>
-         <documentation>
-            The markerTypeReference is a reference to a markerType defined using the extension point in org.eclipse.core.resources.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id of the markerType
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.core.resources.markers/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="markerAttributeGrouping">
-      <annotation>
-         <documentation>
-            markerAttributeGrouping is a definition of attribute mappings for a particular markerType.
-
-markerAttributeGroupings defined at the top level are only applied to the problems view for compatibility with the pre 3.4 API.
-
-It is generally recommended that a markerAttributeGrouping is defined as a child element of a markerGroup.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="markerAttributeMapping" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="markerType" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id of the markerType this grouping applies to.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.core.resources.markers/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="attribute" type="string">
-            <annotation>
-               <documentation>
-                  The attribute is the name of the attribute to test. If it is not specified then only the defaultGroupingEntry will be checked.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="defaultGroupingEntry" type="string">
-            <annotation>
-               <documentation>
-                  The defaultGroupingEntry is the optional category for groupings that do not satisfy any of the markerAttributeMappings in the receiver. This default will be applied when the attribute value does not match a mapping or when the attribute is not available.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="markerGrouping">
-      <annotation>
-         <documentation>
-            A markerGrouping is a definition of a grouping criterea for the marker views that support it . 
-
-Top level markerGroupings are assumed to belong to the problems content generator.
-
-A markerGrouping is usually specified as the child of a markerContentGenerator. It is recommended that a markerContentGenerator defines it&apos;s own markerGroupings if possible.
-
-Note that only the problems view supported markerGroupings pre 3.4.
-
-If a markerGrouping has id org.eclipse.ui.ide.types the internal types marker grouping will be used.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="markerGroupingEntry"/>
-            <element ref="markerAttributeGrouping" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The label is the human readable String that will be used to create the entry in the Group By-&gt; menu for this marker grouping.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id is non translatable identifier for the markerGrouping. Referred to in a markerGroupingEntry.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="markerAttributeMapping">
-      <annotation>
-         <documentation>
-            A markerAttributeMapping maps a marker attribute to a name.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The value is the value of the attribute that is used in this mapping.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="markerGroupingEntry" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id of the markerGroupingEntry that this attribute value maps to.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="markerGroupingEntry">
-      <annotation>
-         <documentation>
-            A markerGroupingEntry is the specification of one of the entries in a markerGrouping. A top level markerGroupingEntry can only be applied to a top level markerGrouping for compatibility with the pre 3.4 API.
-
-It is recommended that a markerGroupingEntry is specified as a child element of a markerGrouping.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id of the markerGroupingEntry. Referred to in a markerAttributeGrouping.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="markerGrouping" type="string">
-            <annotation>
-               <documentation>
-                  The markerGrouping is the id of the markerGrouping this entry will be added to.
-
-This attribute is optional if this is defined as a child element of a markerGrouping.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The translable label of the entry.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="priority" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The priority of the entry. Higher priorities show up higher in the list.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="markerContentGenerator">
-      <annotation>
-         <documentation>
-            A markerContentGenerator is the definition of a marker content for an instance of org.eclipse.ui.views.markers.MarkerSupportView.
-
- This element is EXPERIMENTAL and subject to change without notice.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="markerFieldReference" minOccurs="1" maxOccurs="unbounded"/>
-            <element ref="markerTypeReference" minOccurs="1" maxOccurs="unbounded"/>
-            <element ref="markerFieldConfiguration" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="markerGrouping" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id attribute is the unique id of the markerContentGenerator.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name attribute is the human readable name of the content generator.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="defaultMarkerGrouping" type="string">
-            <annotation>
-               <documentation>
-                  defaultMarkerGrouping is the id of the grouping to use by default. This grouping must be defined as child element of the markerContentGenerator
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="markerField">
-      <annotation>
-         <documentation>
-            A markerField is the definition of a org.eclipse.ui.views.markers.MarkerField used to define a column
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id of the field
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class is the type used to instantiate the field.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.views.markers.MarkerField:"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name is the human readable name of the field.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  The icon is the plug-in relative path for the icon.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="filterClass" type="string">
-            <annotation>
-               <documentation>
-                  The filterClass is the class that does filtering on this field when enabled. If this is not specified no filtering will occur based on this field.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.views.markers.MarkerFieldFilter:"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="filterConfigurationClass" type="string">
-            <annotation>
-               <documentation>
-                  The filterConfigurationClass is an optional area that is used for configuration of the field in a filter dialog.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.views.markers.FilterConfigurationArea:"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="markerFieldReference">
-      <annotation>
-         <documentation>
-            A markerFieldReference is a reference to a markerField in a markerContentGenerator. The columns in a markersView are created in the order that the markerFieldReferences are specified. This is also the default sortOrder for the fields.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id is the id of the markerField being referred to.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.ide.markerSupport/markerField/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="visible" type="boolean">
-            <annotation>
-               <documentation>
-                  The visible flag indicates whether or not the receiver is visible. If this flag is not set the value is true.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="markerFieldConfiguration">
-      <annotation>
-         <documentation>
-            markerFieldConfiguration is a definition of a configuration to be added to a markerContentGenerator by default such as the All Errors configuration in the problems view.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id of the grouping.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The human readable name of the grouping.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="values" type="string">
-            <annotation>
-               <documentation>
-                  The values is a class that specifies the values that are to be set in the filterClass of a markerField for the enclosing markerContentGenerator.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.views.markers.FiltersContributionParameters:"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="scope">
-            <annotation>
-               <documentation>
-                  The scope of the grouping 
-One of 
-ON_ANY: any item in the workbench
-ON_SELECTED_ONLY: on the currently selected item
-ON_SELECTED_AND_CHILDREN: on the currently selected item and it&apos;s children
-ON_ANY_IN_SAME_CONTAINER: on any item with the same top level container as the selection.
-If this value is not set the value is ON_ANY
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="ON_ANY">
-                  </enumeration>
-                  <enumeration value="ON_SELECTED_ONLY">
-                  </enumeration>
-                  <enumeration value="ON_SELECTED_AND_CHILDREN">
-                  </enumeration>
-                  <enumeration value="ON_ANY_IN_SAME_CONTAINER">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="enabled" type="boolean">
-            <annotation>
-               <documentation>
-                  The enabled flag determines whether or not the receiver is on by default. If this value is not specified it is assumed to be true.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="markerContentGeneratorExtension">
-      <annotation>
-         <documentation>
-            A markerContentGeneratorExtension is an extension to an existing markerContentGenerator.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="markerGrouping" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="markerFieldConfiguration" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id of the receiver
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="generatorId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id of the generator being extended
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.ide.markerSupport/markerContentGenerator/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.2
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of a problem filter definition in the marker support. This example only shows java warnings on the selected element and it&apos;s children and filters out those with the String NON-NLS
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.ui.ide.markerSupport&quot;&gt;
-  &lt;problemFilter
-    name = &quot;Warnings&quot;
-    id = &quot;org.eclipse.example.warningFilter&quot;
-    enabled = &quot;true&quot;
-    scope=&quot;ON_SELECTED_AND_CHILDREN&quot;
-    onDescription=&quot;!NON-NLS&quot;
-    severity=&quot;WARNING&quot;
-  &gt;
-  &lt;selectedType
-    markerId=&quot;org.eclipse.core.resources.problemmarker&quot;/&gt;
-  &lt;/problemFilter&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         The severity markerGrouping is provided in the org.eclipse.ui.ide plug-in by default.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2005, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui.ide/schema/projectNatureImages.exsd b/bundles/org.eclipse.ui.ide/schema/projectNatureImages.exsd
deleted file mode 100644
index d2112f1..0000000
--- a/bundles/org.eclipse.ui.ide/schema/projectNatureImages.exsd
+++ /dev/null
@@ -1,147 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.ide" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui.ide" id="projectNatureImages" name="Project Nature Images"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to associate an image with a project nature.
-The supplied image is used to form a composite image consisting of the standard project image combined with the image of its nature.
-The supplied image is drawn over the top right corner of the base image.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="image" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="image">
-      <complexType>
-         <sequence>
-            <element ref="description" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this nature image.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="natureId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique name of the nature for which the image is being supplied.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.core.resources.natures/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a relative name of the image that will be associated with this perspective.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="description" type="string">
-      <annotation>
-         <appinfo>
-            <meta.element translatable="true"/>
-         </appinfo>
-         <documentation>
-            a short description of what this image represents.
-         </documentation>
-      </annotation>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.0 (originally added in release 1.0 as org.eclipse.ui.projectNatureImages)
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of a nature image extension:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.ui.ide.projectNatureImages&quot;&gt;
-  &lt;image 
-    id=&quot;org.eclipse.ui.javaNatureImage&quot;
-    natureId=&quot;Resource&quot;
-    icon=&quot;icons/javaNature.gif&quot;&gt;
-  &lt;/image&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The value of the &lt;samp&gt;natureId&lt;/samp&gt; attribute is the nature id as defined by the plugin creating the project.
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui.ide/schema/resourceFilters.exsd b/bundles/org.eclipse.ui.ide/schema/resourceFilters.exsd
deleted file mode 100644
index a38458d..0000000
--- a/bundles/org.eclipse.ui.ide/schema/resourceFilters.exsd
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.ide">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui.ide" id="resourceFilters" name="Resource Filters"/>
-      </appInfo>
-      <documentation>
-         This extension point is used to add predefined filters to views which show resources, such as the Navigator view.
-These filters can be selected to hide resources whose names match the filter&apos;s pattern.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="filter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="filter">
-      <complexType>
-         <sequence>
-            <element ref="description" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="pattern" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the pattern to match.  May contain * and ? wildcards.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="selected" type="boolean" use="default" value="false">
-            <annotation>
-               <documentation>
-                  &quot;true&quot; if the pattern should be selected by default, &quot;false&quot; or undefined if not.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="description" type="string">
-      <annotation>
-         <appInfo>
-            <meta.element translatable="true"/>
-         </appInfo>
-         <documentation>
-            the description of the purpose of this filter.
-         </documentation>
-      </annotation>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.0 (originally added in release 1.0 as org.eclipse.ui.resourceFilters)
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a resource filter extension, which filters out class files, and is selected by default:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.ui.ide.resourceFilters&quot;&gt;
-  &lt;filter pattern=&quot;*.class&quot; selected=&quot;true&quot;/&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2002, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/FileStoreEditorInput.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/FileStoreEditorInput.java
deleted file mode 100644
index fcfe848..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/FileStoreEditorInput.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.ide;
-
-import java.net.URI;
-
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.IURIEditorInput;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-/**
- * Implements an IEditorInput instance appropriate for 
- * <code>IFileStore</code> elements that represent files
- * that are not part of the current workspace.
- * 
- * @since 3.3
- *
- */
-public class FileStoreEditorInput implements IURIEditorInput, IPersistableElement {
-
-	/**
-	 * The workbench adapter which simply provides the label.
-	 *
-	 * @since 3.3
-	 */
-	private static class WorkbenchAdapter implements IWorkbenchAdapter {
-		/*
-		 * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object o) {
-			return null;
-		}
-
-		/*
-		 * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
-		 */
-		public ImageDescriptor getImageDescriptor(Object object) {
-			return null;
-		}
-
-		/*
-		 * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
-		 */
-		public String getLabel(Object o) {
-			return ((FileStoreEditorInput) o).getName();
-		}
-
-		/*
-		 * @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object o) {
-			return null;
-		}
-	}
-
-	private IFileStore fileStore;
-	private WorkbenchAdapter workbenchAdapter = new WorkbenchAdapter();
-
-	/**
-	 * @param fileStore
-	 */
-	public FileStoreEditorInput(IFileStore fileStore) {
-		Assert.isNotNull(fileStore);
-		this.fileStore = fileStore;
-		workbenchAdapter = new WorkbenchAdapter();
-	}
-
-	/*
-	 * @see org.eclipse.ui.IEditorInput#exists()
-	 */
-	public boolean exists() {
-		return fileStore.fetchInfo().exists();
-	}
-
-	/*
-	 * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return null;
-	}
-
-	/*
-	 * @see org.eclipse.ui.IEditorInput#getName()
-	 */
-	public String getName() {
-		return fileStore.getName();
-	}
-
-	/*
-	 * @see org.eclipse.ui.IEditorInput#getPersistable()
-	 */
-	public IPersistableElement getPersistable() {
-		return this;
-	}
-
-	/*
-	 * @see org.eclipse.ui.IEditorInput#getToolTipText()
-	 */
-	public String getToolTipText() {
-		return fileStore.toString();
-	}
-
-	/*
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (IWorkbenchAdapter.class.equals(adapter))
-			return workbenchAdapter;
-		return Platform.getAdapterManager().getAdapter(this, adapter);
-	}
-
-	/*
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object o) {
-		if (o == this)
-			return true;
-
-		if (o instanceof FileStoreEditorInput) {
-			FileStoreEditorInput input = (FileStoreEditorInput) o;
-			return fileStore.equals(input.fileStore);
-		}
-
-		return false;
-	}
-
-	/*
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return fileStore.hashCode();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IURIEditorInput#getURI()
-	 */
-	public URI getURI() {
-		return fileStore.toURI();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.IPersistableElement#getFactoryId()
-	 */
-	public String getFactoryId() {
-		return FileStoreEditorInputFactory.ID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPersistable#saveState(org.eclipse.ui.IMemento)
-	 */
-	public void saveState(IMemento memento) {
-		FileStoreEditorInputFactory.saveState(memento, this);
-		
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/FileStoreEditorInputFactory.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/FileStoreEditorInputFactory.java
deleted file mode 100644
index 323f30d..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/FileStoreEditorInputFactory.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.ui.ide;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import org.eclipse.core.filesystem.EFS;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.ui.IElementFactory;
-import org.eclipse.ui.IMemento;
-
-
-/**
- * Factory for saving and restoring a <code>FileStoreEditorInput</code>. 
- * The stored representation of a <code>FileStoreEditorInput</code> remembers
- * the path of the editor input.
- * <p>
- * The workbench will automatically create instances of this class as required.
- * It is not intended to be instantiated or subclassed by the client.</p>
- * 
- * @since 3.3
- */
-public class FileStoreEditorInputFactory implements IElementFactory {
-	
-	/**
-	 * This factory's ID.
-	 * <p>
-	 * The editor plug-in registers a factory by this name with
-	 * the <code>"org.eclipse.ui.elementFactories"<code> extension point.
-	 */
-	static final String ID = "org.eclipse.ui.ide.FileStoreEditorInputFactory"; //$NON-NLS-1$
-	
-	/**
-	 * Saves the state of the given editor input into the given memento.
-	 *
-	 * @param memento the storage area for element state
-	 * @param input the file editor input
-	 */
-	static void saveState(IMemento memento, FileStoreEditorInput input) {
-		URI uri = input.getURI();
-		memento.putString(TAG_URI, uri.toString());
-	}
-
-	/**
-	 * Tag for the URI string.
-	 */
-	private static final String TAG_URI = "uri"; //$NON-NLS-1$
-
-	/*
-	 * @see org.eclipse.ui.IElementFactory#createElement(org.eclipse.ui.IMemento)
-	 */
-	public IAdaptable createElement(IMemento memento) {
-		// Get the file name.
-		String uriString = memento.getString(TAG_URI);
-		if (uriString == null)
-			return null;
-		
-		URI uri;
-		try {
-			uri = new URI(uriString);
-		} catch (URISyntaxException e) {
-			return null;
-		}
-		
-		try {
-			return new FileStoreEditorInput(EFS.getStore(uri));
-		} catch (CoreException e) {
-			return null;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IContributorResourceAdapter2.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IContributorResourceAdapter2.java
deleted file mode 100644
index 922f65e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IContributorResourceAdapter2.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.ide;
-
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.ui.IContributorResourceAdapter;
-
-/**
- * An extension to the <code>IContributorResourceAdapter</code> that adapts 
- * a model object to a <code>ResourceMapping</code>.
- * 
- * @since 3.2
- */
-public interface IContributorResourceAdapter2 extends IContributorResourceAdapter {
-
-    /**
-     * Return the resource mapping that the supplied adaptable 
-     * adapts to. An <code>IContributorResourceAdapter2</code> assumes
-     * that any object passed to it adapts to one equivalent
-     * resource mapping.
-     * 
-     * @param adaptable the adaptable being queried
-     * @return a resource mapping, or <code>null</code> if there
-     *  is no adapted resource mapping for this type
-     */
-    public ResourceMapping getAdaptedResourceMapping(IAdaptable adaptable);
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IDE.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IDE.java
deleted file mode 100644
index 6059ab1..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IDE.java
+++ /dev/null
@@ -1,1495 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.ide;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.osgi.util.NLS;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeMatcher;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceStatus;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.mapping.IModelProviderDescriptor;
-import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
-import org.eclipse.core.resources.mapping.ModelProvider;
-import org.eclipse.core.resources.mapping.ModelStatus;
-import org.eclipse.core.resources.mapping.ResourceChangeValidator;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.resources.mapping.ResourceMappingContext;
-import org.eclipse.core.resources.mapping.ResourceTraversal;
-
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IMarkerHelpRegistry;
-import org.eclipse.ui.ISaveableFilter;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.Saveable;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.registry.MarkerHelpRegistry;
-import org.eclipse.ui.internal.ide.registry.MarkerHelpRegistryReader;
-import org.eclipse.ui.internal.misc.UIStats;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * Collection of IDE-specific APIs factored out of existing workbench. This
- * class cannot be instantiated; all functionality is provided by static methods
- * and fields.
- * 
- * @since 3.0
- */
-public final class IDE {
-	/**
-	 * The persistent property key used on IFile resources to contain the
-	 * preferred editor ID to use.
-	 * <p>
-	 * Example of retrieving the persisted editor id:
-	 * 
-	 * <pre><code>
-	 *  IFile file = ...
-	 *  IEditorDescriptor editorDesc = null;
-	 *  try {
-	 *  	String editorID = file.getPersistentProperty(EDITOR_KEY);
-	 *  	if (editorID != null) {
-	 *  		editorDesc = editorReg.findEditor(editorID);
-	 *  	}
-	 *  } catch (CoreException e) {
-	 *  	// handle problem accessing persistent property here
-	 *  }
-	 * </code></pre>
-	 * 
-	 * </p>
-	 * <p>
-	 * Example of persisting the editor id:
-	 * 
-	 * <pre><code>
-	 *  IFile file = ...
-	 *  try {
-	 *  	file.setPersistentProperty(EDITOR_KEY, editorDesc.getId());
-	 *  } catch (CoreException e) {
-	 *  	// handle problem setting persistent property here
-	 *  }
-	 * </code></pre>
-	 * 
-	 * </p>
-	 */
-	public static final QualifiedName EDITOR_KEY = new QualifiedName(
-			"org.eclipse.ui.internal.registry.ResourceEditorRegistry", "EditorProperty");//$NON-NLS-2$//$NON-NLS-1$
-
-	/**
-	 * An optional attribute within a workspace marker (<code>IMarker</code>)
-	 * which identifies the preferred editor type to be opened.
-	 */
-	public static final String EDITOR_ID_ATTR = "org.eclipse.ui.editorID"; //$NON-NLS-1$
-
-	/**
-	 * The resource based perspective identifier.
-	 */
-	public static final String RESOURCE_PERSPECTIVE_ID = "org.eclipse.ui.resourcePerspective"; //$NON-NLS-1$
-
-	/**
-	 * Marker help registry mapping markers to help context ids and resolutions;
-	 * lazily initialized on fist access.
-	 */
-	private static MarkerHelpRegistry markerHelpRegistry = null;
-
-	/**
-	 * Standard shared images defined by the IDE. These are over and above the
-	 * standard workbench images declared in {@link org.eclipse.ui.ISharedImages
-	 * ISharedImages}.
-	 * <p>
-	 * This interface is not intended to be implemented by clients.
-	 * </p>
-	 * 
-	 * @see org.eclipse.ui.ISharedImages
-	 */
-	public interface SharedImages {
-		/**
-		 * Identifies a project image.
-		 */
-		public final static String IMG_OBJ_PROJECT = "IMG_OBJ_PROJECT"; //$NON-NLS-1$
-
-		/**
-		 * Identifies a closed project image.
-		 */
-		public final static String IMG_OBJ_PROJECT_CLOSED = "IMG_OBJ_PROJECT_CLOSED"; //$NON-NLS-1$
-
-		/**
-		 * Identifies the image used for "open marker".
-		 */
-		public final static String IMG_OPEN_MARKER = "IMG_OPEN_MARKER"; //$NON-NLS-1$
-
-		/**
-		 * Identifies the default image used to indicate a task.
-		 */
-		public final static String IMG_OBJS_TASK_TSK = "IMG_OBJS_TASK_TSK"; //$NON-NLS-1$
-
-		/**
-		 * Identifies the default image used to indicate a bookmark.
-		 */
-		public final static String IMG_OBJS_BKMRK_TSK = "IMG_OBJS_BKMRK_TSK"; //$NON-NLS-1$
-	}
-
-	/**
-	 * Preferences defined by the IDE workbench.
-	 * <p>
-	 * This interface is not intended to be implemented by clients.
-	 * </p>
-	 */
-	public interface Preferences {
-
-		/**
-		 * A named preference for how a new perspective should be opened when a
-		 * new project is created.
-		 * <p>
-		 * Value is of type <code>String</code>. The possible values are
-		 * defined by the constants
-		 * <code>OPEN_PERSPECTIVE_WINDOW, OPEN_PERSPECTIVE_PAGE, 
-		 * OPEN_PERSPECTIVE_REPLACE, and NO_NEW_PERSPECTIVE</code>.
-		 * </p>
-		 * 
-		 * @see org.eclipse.ui.IWorkbenchPreferenceConstants#OPEN_PERSPECTIVE_WINDOW
-		 * @see org.eclipse.ui.IWorkbenchPreferenceConstants#OPEN_PERSPECTIVE_PAGE
-		 * @see org.eclipse.ui.IWorkbenchPreferenceConstants#OPEN_PERSPECTIVE_REPLACE
-		 * @see org.eclipse.ui.IWorkbenchPreferenceConstants#NO_NEW_PERSPECTIVE
-		 */
-		public static final String PROJECT_OPEN_NEW_PERSPECTIVE = "PROJECT_OPEN_NEW_PERSPECTIVE"; //$NON-NLS-1$
-
-		/**
-		 * <p>
-		 * Specifies whether or not the workspace selection dialog should be
-		 * shown on startup.
-		 * </p>
-		 * <p>
-		 * The default value for this preference is <code>true</code>.
-		 * </p>
-		 * 
-		 * @since 3.1
-		 */
-		public static final String SHOW_WORKSPACE_SELECTION_DIALOG = "SHOW_WORKSPACE_SELECTION_DIALOG"; //$NON-NLS-1$
-
-		/**
-		 * <p>
-		 * Stores the maximum number of workspaces that should be displayed in
-		 * the ChooseWorkspaceDialog.
-		 * </p>
-		 * 
-		 * @since 3.1
-		 */
-		public static final String MAX_RECENT_WORKSPACES = "MAX_RECENT_WORKSPACES"; //$NON-NLS-1$
-
-		/**
-		 * <p>
-		 * Stores a comma separated list of the recently used workspace paths.
-		 * </p>
-		 * 
-		 * @since 3.1
-		 */
-		public static final String RECENT_WORKSPACES = "RECENT_WORKSPACES"; //$NON-NLS-1$
-
-		/**
-		 * <p>
-		 * Stores the version of the protocol used to decode/encode the list of
-		 * recent workspaces.
-		 * </p>
-		 * 
-		 * @since 3.1
-		 */
-		public static final String RECENT_WORKSPACES_PROTOCOL = "RECENT_WORKSPACES_PROTOCOL"; //$NON-NLS-1$
-
-	}
-
-	/**
-	 * A saveable filter that selects savables that contain resources that
-	 * are descendants of the roots of the filter.
-	 * @since 3.3
-	 *
-	 */
-	private static class SaveFilter implements ISaveableFilter {
-		private final IResource[] roots;
-
-		/**
-		 * Create the filter
-		 * @param roots the save roots
-		 */
-		public SaveFilter(IResource[] roots) {
-			this.roots = roots;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.ISaveableFilter#select(org.eclipse.ui.Saveable, org.eclipse.ui.IWorkbenchPart[])
-		 */
-		public boolean select(Saveable saveable,
-				IWorkbenchPart[] containingParts) {
-			if (isDescendantOfRoots(saveable)) {
-				return true;
-			}
-			// For backwards compatibility, we need to check the parts
-			for (int i = 0; i < containingParts.length; i++) {
-				IWorkbenchPart workbenchPart = containingParts[i];
-				if (workbenchPart instanceof IEditorPart) {
-					IEditorPart editorPart = (IEditorPart) workbenchPart;
-					if (isEditingDescendantOf(editorPart)) {
-						return true;
-					}
-				}
-			}
-			return false;
-		}
-		
-		/**
-		 * Return whether the given saveable contains any resources that
-		 * are descendants of the root resources.
-		 * @param saveable the saveable
-		 * @return whether the given saveable contains any resources that
-		 * are descendants of the root resources
-		 */
-		private boolean isDescendantOfRoots(Saveable saveable) {
-			// First, try and adapt the saveable to a resource mapping.
-			ResourceMapping mapping = ResourceUtil.getResourceMapping(saveable);
-			if (mapping != null) {
-				try {
-					ResourceTraversal[] traversals = mapping.getTraversals(
-							ResourceMappingContext.LOCAL_CONTEXT, null);
-					for (int i = 0; i < traversals.length; i++) {
-						ResourceTraversal traversal = traversals[i];
-						IResource[] resources = traversal.getResources();
-						for (int j = 0; j < resources.length; j++) {
-							IResource resource = resources[j];
-							if (isDescendantOfRoots(resource)) {
-								return true;
-							}
-						}
-					}
-				} catch (CoreException e) {
-					IDEWorkbenchPlugin
-							.log(
-									NLS
-											.bind(
-													"An internal error occurred while determining the resources for {0}", saveable.getName()), e); //$NON-NLS-1$
-				}
-			} else {
-				// If there is no mapping, try to adapt to a resource or file directly
-				IFile file = ResourceUtil.getFile(saveable);
-				if (file != null) {
-					return isDescendantOfRoots(file);
-				}
-			}
-			return false;
-		}
-
-		/**
-		 * Return whether the given resource is either equal to or a descendant of
-		 * one of the given roots.
-		 * 
-		 * @param resource the resource to be tested
-		 * @return whether the given resource is either equal to or a descendant of
-		 *         one of the given roots
-		 */
-		private boolean isDescendantOfRoots(IResource resource) {
-			for (int l = 0; l < roots.length; l++) {
-				IResource root = roots[l];
-				if (root.getFullPath().isPrefixOf(resource.getFullPath())) {
-					return true;
-				}
-			}
-			return false;
-		}
-		
-		/**
-		 * Return whether the given dirty editor part is editing resources that are
-		 * descendants of the given roots.
-		 * 
-		 * @param part the dirty editor part
-		 * @return whether the given dirty editor part is editing resources that are
-		 *         descendants of the given roots
-		 */
-		private boolean isEditingDescendantOf(IEditorPart part) {
-			IFile file = ResourceUtil.getFile(part.getEditorInput());
-			if (file != null) {
-				return isDescendantOfRoots(file);
-			}
-			return false;
-		}
-		
-	}
-	
-	/**
-	 * Block instantiation.
-	 */
-	private IDE() {
-		// do nothing
-	}
-
-	/**
-	 * Returns the marker help registry for the workbench.
-	 * 
-	 * @return the marker help registry
-	 */
-	public static IMarkerHelpRegistry getMarkerHelpRegistry() {
-		if (markerHelpRegistry == null) {
-			markerHelpRegistry = new MarkerHelpRegistry();
-			new MarkerHelpRegistryReader().addHelp(markerHelpRegistry);
-		}
-		return markerHelpRegistry;
-	}
-
-	/**
-	 * Sets the cursor and selection state for the given editor to reveal the
-	 * position of the given marker. This is done on a best effort basis. If the
-	 * editor does not provide an <code>IGotoMarker</code> interface (either
-	 * directly or via <code>IAdaptable.getAdapter</code>), this has no
-	 * effect.
-	 * 
-	 * @param editor
-	 *            the editor
-	 * @param marker
-	 *            the marker
-	 */
-	public static void gotoMarker(IEditorPart editor, IMarker marker) {
-		IGotoMarker gotoMarker = null;
-		if (editor instanceof IGotoMarker) {
-			gotoMarker = (IGotoMarker) editor;
-		} else {
-			gotoMarker = (IGotoMarker) editor.getAdapter(IGotoMarker.class);
-		}
-		if (gotoMarker != null) {
-			gotoMarker.gotoMarker(marker);
-		}
-	}
-
-	/**
-	 * Opens an editor on the given object.
-	 * <p>
-	 * If the page already has an editor open on the target object then that
-	 * editor is brought to front; otherwise, a new editor is opened.
-	 * <p>
-	 * 
-	 * @param page
-	 *            the page in which the editor will be opened
-	 * @param input
-	 *            the editor input
-	 * @param editorId
-	 *            the id of the editor extension to use
-	 * @return an open editor or <code>null</code> if an external editor was
-	 *         opened
-	 * @exception PartInitException
-	 *                if the editor could not be initialized
-	 * @see org.eclipse.ui.IWorkbenchPage#openEditor(IEditorInput, String)
-	 */
-	public static IEditorPart openEditor(IWorkbenchPage page,
-			IEditorInput input, String editorId) throws PartInitException {
-		// sanity checks
-		if (page == null) {
-			throw new IllegalArgumentException();
-		}
-
-		// open the editor on the file
-		return page.openEditor(input, editorId);
-	}
-
-	/**
-	 * Opens an editor on the given IFileStore object.
-	 * <p>
-	 * Unlike the other <code>openEditor</code> methods, this one can be used
-	 * to open files that reside outside the workspace resource set.
-	 * </p>
-	 * <p>
-	 * If the page already has an editor open on the target object then that
-	 * editor is brought to front; otherwise, a new editor is opened.
-	 * </p>
-	 * 
-	 * @param page
-	 *            the page in which the editor will be opened
-	 * @param uri
-	 *            the URI of the file store representing the file to open
-	 * @param editorId
-	 *            the id of the editor extension to use
-	 * @param activate
-	 *            if <code>true</code> the editor will be activated opened
-	 * @return an open editor or <code>null</code> if an external editor was
-	 * @exception PartInitException
-	 *                if the editor could not be initialized
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPage#openEditor(IEditorInput, String)
-	 * @see EFS#getStore(URI)
-	 * 
-	 * @since 3.3
-	 */
-	public static IEditorPart openEditor(IWorkbenchPage page, URI uri,
-			String editorId, boolean activate) throws PartInitException {
-		// sanity checks
-		if (page == null) {
-			throw new IllegalArgumentException();
-		}
-
-		IFileStore fileStore;
-		try {
-			fileStore = EFS.getStore(uri);
-		} catch (CoreException e) {
-			throw new PartInitException(
-					IDEWorkbenchMessages.IDE_coreExceptionFileStore, e);
-		}
-
-		IEditorInput input = getEditorInput(fileStore);
-
-		// open the editor on the file
-		return page.openEditor(input, editorId, activate);
-	}
-
-	/**
-	 * Create the Editor Input appropriate for the given <code>IFileStore</code>.
-	 * The result is a normal file editor input if the file exists in the
-	 * workspace and, if not, we create a wrapper capable of managing an
-	 * 'external' file using its <code>IFileStore</code>.
-	 * 
-	 * @param fileStore
-	 *            The file store to provide the editor input for
-	 * @return The editor input associated with the given file store
-	 * @since 3.3
-	 */
-	private static IEditorInput getEditorInput(IFileStore fileStore) {
-		IFile workspaceFile = getWorkspaceFile(fileStore);
-		if (workspaceFile != null)
-			return new FileEditorInput(workspaceFile);
-		return new FileStoreEditorInput(fileStore);
-	}
-
-	/**
-	 * Determine whether or not the <code>IFileStore</code> represents a file
-	 * currently in the workspace.
-	 * 
-	 * @param fileStore
-	 *            The <code>IFileStore</code> to test
-	 * @return The workspace's <code>IFile</code> if it exists or
-	 *         <code>null</code> if not
-	 */
-	private static IFile getWorkspaceFile(IFileStore fileStore) {
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		IFile[] files = root.findFilesForLocationURI(fileStore.toURI());
-		files = filterNonExistentFiles(files);
-		if (files == null || files.length == 0)
-			return null;
-
-		// for now only return the first file
-		return files[0];
-	}
-
-	/**
-	 * Filter the incoming array of <code>IFile</code> elements by removing
-	 * any that do not currently exist in the workspace.
-	 * 
-	 * @param files
-	 *            The array of <code>IFile</code> elements
-	 * @return The filtered array
-	 */
-	private static IFile[] filterNonExistentFiles(IFile[] files) {
-		if (files == null)
-			return null;
-
-		int length = files.length;
-		ArrayList existentFiles = new ArrayList(length);
-		for (int i = 0; i < length; i++) {
-			if (files[i].exists())
-				existentFiles.add(files[i]);
-		}
-		return (IFile[]) existentFiles.toArray(new IFile[existentFiles.size()]);
-	}
-
-	/**
-	 * Opens an editor on the given object.
-	 * <p>
-	 * If the page already has an editor open on the target object then that
-	 * editor is brought to front; otherwise, a new editor is opened. If
-	 * <code>activate == true</code> the editor will be activated.
-	 * <p>
-	 * 
-	 * @param page
-	 *            the page in which the editor will be opened
-	 * @param input
-	 *            the editor input
-	 * @param editorId
-	 *            the id of the editor extension to use
-	 * @param activate
-	 *            if <code>true</code> the editor will be activated
-	 * @return an open editor or <code>null</code> if an external editor was
-	 *         opened
-	 * @exception PartInitException
-	 *                if the editor could not be initialized
-	 * @see org.eclipse.ui.IWorkbenchPage#openEditor(IEditorInput, String,
-	 *      boolean)
-	 */
-	public static IEditorPart openEditor(IWorkbenchPage page,
-			IEditorInput input, String editorId, boolean activate)
-			throws PartInitException {
-		// sanity checks
-		if (page == null) {
-			throw new IllegalArgumentException();
-		}
-
-		// open the editor on the file
-		return page.openEditor(input, editorId, activate);
-	}
-
-	/**
-	 * Opens an editor on the given file resource. This method will attempt to
-	 * resolve the editor based on content-type bindings as well as traditional
-	 * name/extension bindings.
-	 * <p>
-	 * If the page already has an editor open on the target object then that
-	 * editor is brought to front; otherwise, a new editor is opened. If
-	 * <code>activate == true</code> the editor will be activated.
-	 * <p>
-	 * 
-	 * @param page
-	 *            the page in which the editor will be opened
-	 * @param input
-	 *            the editor input
-	 * @param activate
-	 *            if <code>true</code> the editor will be activated
-	 * @return an open editor or <code>null</code> if an external editor was
-	 *         opened
-	 * @exception PartInitException
-	 *                if the editor could not be initialized
-	 * @see org.eclipse.ui.IWorkbenchPage#openEditor(org.eclipse.ui.IEditorInput,
-	 *      String, boolean)
-	 */
-	public static IEditorPart openEditor(IWorkbenchPage page, IFile input,
-			boolean activate) throws PartInitException {
-		return openEditor(page, input, activate, true);
-	}
-
-	/**
-	 * Opens an editor on the given file resource. This method will attempt to
-	 * resolve the editor based on content-type bindings as well as traditional
-	 * name/extension bindings if <code>determineContentType</code> is
-	 * <code>true</code>.
-	 * <p>
-	 * If the page already has an editor open on the target object then that
-	 * editor is brought to front; otherwise, a new editor is opened. If
-	 * <code>activate == true</code> the editor will be activated.
-	 * <p>
-	 * 
-	 * @param page
-	 *            the page in which the editor will be opened
-	 * @param input
-	 *            the editor input
-	 * @param activate
-	 *            if <code>true</code> the editor will be activated
-	 * @param determineContentType
-	 *            attempt to resolve the content type for this file
-	 * @return an open editor or <code>null</code> if an external editor was
-	 *         opened
-	 * @exception PartInitException
-	 *                if the editor could not be initialized
-	 * @see org.eclipse.ui.IWorkbenchPage#openEditor(org.eclipse.ui.IEditorInput,
-	 *      String, boolean)
-	 * @since 3.1
-	 */
-	public static IEditorPart openEditor(IWorkbenchPage page, IFile input,
-			boolean activate, boolean determineContentType)
-			throws PartInitException {
-		// sanity checks
-		if (page == null) {
-			throw new IllegalArgumentException();
-		}
-
-		// open the editor on the file
-		IEditorDescriptor editorDesc = getEditorDescriptor(input,
-				determineContentType);
-		return page.openEditor(new FileEditorInput(input), editorDesc.getId(),
-				activate);
-	}
-
-	/**
-	 * Opens an editor on the given file resource. This method will attempt to
-	 * resolve the editor based on content-type bindings as well as traditional
-	 * name/extension bindings.
-	 * <p>
-	 * If the page already has an editor open on the target object then that
-	 * editor is brought to front; otherwise, a new editor is opened.
-	 * <p>
-	 * 
-	 * @param page
-	 *            the page in which the editor will be opened
-	 * @param input
-	 *            the editor input
-	 * @return an open editor or <code>null</code> if an external editor was
-	 *         opened
-	 * @exception PartInitException
-	 *                if the editor could not be initialized
-	 * @see org.eclipse.ui.IWorkbenchPage#openEditor(IEditorInput, String)
-	 */
-	public static IEditorPart openEditor(IWorkbenchPage page, IFile input)
-			throws PartInitException {
-		// sanity checks
-		if (page == null) {
-			throw new IllegalArgumentException();
-		}
-
-		// open the editor on the file
-		IEditorDescriptor editorDesc = getEditorDescriptor(input);
-		return page.openEditor(new FileEditorInput(input), editorDesc.getId());
-	}
-
-	/**
-	 * Opens an editor on the given file resource.
-	 * <p>
-	 * If the page already has an editor open on the target object then that
-	 * editor is brought to front; otherwise, a new editor is opened.
-	 * <p>
-	 * 
-	 * @param page
-	 *            the page in which the editor will be opened
-	 * @param input
-	 *            the editor input
-	 * @param editorId
-	 *            the id of the editor extension to use
-	 * @return an open editor or <code>null</code> if an external editor was
-	 *         opened
-	 * @exception PartInitException
-	 *                if the editor could not be initialized
-	 * @see org.eclipse.ui.IWorkbenchPage#openEditor(IEditorInput, String)
-	 */
-	public static IEditorPart openEditor(IWorkbenchPage page, IFile input,
-			String editorId) throws PartInitException {
-		// sanity checks
-		if (page == null) {
-			throw new IllegalArgumentException();
-		}
-
-		// open the editor on the file
-		return page.openEditor(new FileEditorInput(input), editorId);
-	}
-
-	/**
-	 * Opens an editor on the given file resource.
-	 * <p>
-	 * If the page already has an editor open on the target object then that
-	 * editor is brought to front; otherwise, a new editor is opened. If
-	 * <code>activate == true</code> the editor will be activated.
-	 * <p>
-	 * 
-	 * @param page
-	 *            the page in which the editor will be opened
-	 * @param input
-	 *            the editor input
-	 * @param editorId
-	 *            the id of the editor extension to use
-	 * @param activate
-	 *            if <code>true</code> the editor will be activated
-	 * @return an open editor or <code>null</code> if an external editor was
-	 *         opened
-	 * @exception PartInitException
-	 *                if the editor could not be initialized
-	 * @see org.eclipse.ui.IWorkbenchPage#openEditor(IEditorInput, String,
-	 *      boolean)
-	 */
-	public static IEditorPart openEditor(IWorkbenchPage page, IFile input,
-			String editorId, boolean activate) throws PartInitException {
-		// sanity checks
-		if (page == null) {
-			throw new IllegalArgumentException();
-		}
-
-		// open the editor on the file
-		return page.openEditor(new FileEditorInput(input), editorId, activate);
-	}
-
-	/**
-	 * Returns an editor descriptor appropriate for opening the given file
-	 * resource.
-	 * <p>
-	 * The editor descriptor is determined using a multi-step process. This
-	 * method will attempt to resolve the editor based on content-type bindings
-	 * as well as traditional name/extension bindings.
-	 * </p>
-	 * <ol>
-	 * <li>The file is consulted for a persistent property named
-	 * <code>IDE.EDITOR_KEY</code> containing the preferred editor id to be
-	 * used.</li>
-	 * <li>The workbench editor registry is consulted to determine if an editor
-	 * extension has been registered for the file type. If so, an instance of
-	 * the editor extension is opened on the file. See
-	 * <code>IEditorRegistry.getDefaultEditor(String)</code>.</li>
-	 * <li>The operating system is consulted to determine if an in-place
-	 * component editor is available (e.g. OLE editor on Win32 platforms).</li>
-	 * <li>The operating system is consulted to determine if an external editor
-	 * is available.</li>
-	 * </ol>
-	 * </p>
-	 * 
-	 * @param file
-	 *            the file
-	 * @return an editor descriptor, appropriate for opening the file
-	 * @throws PartInitException
-	 *             if no editor can be found
-	 */
-	public static IEditorDescriptor getEditorDescriptor(IFile file)
-			throws PartInitException {
-		return getEditorDescriptor(file, true);
-	}
-
-	/**
-	 * Returns an editor descriptor appropriate for opening the given file
-	 * resource.
-	 * <p>
-	 * The editor descriptor is determined using a multi-step process. This
-	 * method will attempt to resolve the editor based on content-type bindings
-	 * as well as traditional name/extension bindings if
-	 * <code>determineContentType</code>is <code>true</code>.
-	 * </p>
-	 * <ol>
-	 * <li>The file is consulted for a persistent property named
-	 * <code>IDE.EDITOR_KEY</code> containing the preferred editor id to be
-	 * used.</li>
-	 * <li>The workbench editor registry is consulted to determine if an editor
-	 * extension has been registered for the file type. If so, an instance of
-	 * the editor extension is opened on the file. See
-	 * <code>IEditorRegistry.getDefaultEditor(String)</code>.</li>
-	 * <li>The operating system is consulted to determine if an in-place
-	 * component editor is available (e.g. OLE editor on Win32 platforms).</li>
-	 * <li>The operating system is consulted to determine if an external editor
-	 * is available.</li>
-	 * </ol>
-	 * </p>
-	 * 
-	 * @param file
-	 *            the file
-	 * @param determineContentType
-	 *            query the content type system for the content type of the file
-	 * @return an editor descriptor, appropriate for opening the file
-	 * @throws PartInitException
-	 *             if no editor can be found
-	 * @since 3.1
-	 */
-	public static IEditorDescriptor getEditorDescriptor(IFile file,
-			boolean determineContentType) throws PartInitException {
-
-		if (file == null) {
-			throw new IllegalArgumentException();
-		}
-
-		return getEditorDescriptor(file.getName(), PlatformUI.getWorkbench()
-				.getEditorRegistry(), getDefaultEditor(file,
-				determineContentType));
-	}
-
-	/**
-	 * Returns an editor id appropriate for opening the given file
-	 * store.
-	 * <p>
-	 * The editor descriptor is determined using a multi-step process. This
-	 * method will attempt to resolve the editor based on content-type bindings
-	 * as well as traditional name/extension bindings.
-	 * </p>
-	 * <ol>
-	 * <li>The workbench editor registry is consulted to determine if an editor
-	 * extension has been registered for the file type. If so, an instance of
-	 * the editor extension is opened on the file. See
-	 * <code>IEditorRegistry.getDefaultEditor(String)</code>.</li>
-	 * <li>The operating system is consulted to determine if an in-place
-	 * component editor is available (e.g. OLE editor on Win32 platforms).</li>
-	 * <li>The operating system is consulted to determine if an external editor
-	 * is available.</li>
-	 * </ol>
-	 * </p>
-	 * 
-	 * @param fileStore 
-	 *            the file store
-	 * @return the id of an editor, appropriate for opening the file
-	 * @throws PartInitException
-	 *             if no editor can be found
-	 */
-	private static String getEditorId(IFileStore fileStore) throws PartInitException {
-		String name = fileStore.fetchInfo().getName();
-		if (name == null) {
-			throw new IllegalArgumentException();
-		}
-
-		IContentType contentType= null;
-		try {
-			InputStream is = null;
-			try {
-				is = fileStore.openInputStream(EFS.NONE, null);
-				contentType= Platform.getContentTypeManager().findContentTypeFor(is, name);
-			} finally {
-				if (is != null) {
-					is.close();
-				}
-			}
-		} catch (CoreException ex) {
-			// continue without content type
-		} catch (IOException ex) {
-			// continue without content type
-		}
-
-		IEditorRegistry editorReg= PlatformUI.getWorkbench().getEditorRegistry();
-
-		return getEditorDescriptor(name, editorReg, editorReg.getDefaultEditor(name, contentType)).getId();
-	}
-
-	/**
-	 * Returns an editor descriptor appropriate for opening a file resource with
-	 * the given name.
-	 * <p>
-	 * The editor descriptor is determined using a multi-step process. This
-	 * method will attempt to infer content type from the file name.
-	 * </p>
-	 * <ol>
-	 * <li>The file is consulted for a persistent property named
-	 * <code>IDE.EDITOR_KEY</code> containing the preferred editor id to be
-	 * used.</li>
-	 * <li>The workbench editor registry is consulted to determine if an editor
-	 * extension has been registered for the file type. If so, an instance of
-	 * the editor extension is opened on the file. See
-	 * <code>IEditorRegistry.getDefaultEditor(String)</code>.</li>
-	 * <li>The operating system is consulted to determine if an in-place
-	 * component editor is available (e.g. OLE editor on Win32 platforms).</li>
-	 * <li>The operating system is consulted to determine if an external editor
-	 * is available.</li>
-	 * </ol>
-	 * </p>
-	 * 
-	 * @param name
-	 *            the file name
-	 * @return an editor descriptor, appropriate for opening the file
-	 * @throws PartInitException
-	 *             if no editor can be found
-	 * @since 3.1
-	 */
-	public static IEditorDescriptor getEditorDescriptor(String name)
-			throws PartInitException {
-		return getEditorDescriptor(name, true);
-	}
-
-	/**
-	 * Returns an editor descriptor appropriate for opening a file resource with
-	 * the given name.
-	 * <p>
-	 * The editor descriptor is determined using a multi-step process. This
-	 * method will attempt to infer the content type of the file if
-	 * <code>inferContentType</code> is <code>true</code>.
-	 * </p>
-	 * <ol>
-	 * <li>The file is consulted for a persistent property named
-	 * <code>IDE.EDITOR_KEY</code> containing the preferred editor id to be
-	 * used.</li>
-	 * <li>The workbench editor registry is consulted to determine if an editor
-	 * extension has been registered for the file type. If so, an instance of
-	 * the editor extension is opened on the file. See
-	 * <code>IEditorRegistry.getDefaultEditor(String)</code>.</li>
-	 * <li>The operating system is consulted to determine if an in-place
-	 * component editor is available (e.g. OLE editor on Win32 platforms).</li>
-	 * <li>The operating system is consulted to determine if an external editor
-	 * is available.</li>
-	 * </ol>
-	 * </p>
-	 * 
-	 * @param name
-	 *            the file name
-	 * @param inferContentType
-	 *            attempt to infer the content type from the file name if this
-	 *            is <code>true</code>
-	 * @return an editor descriptor, appropriate for opening the file
-	 * @throws PartInitException
-	 *             if no editor can be found
-	 * @since 3.1
-	 */
-	public static IEditorDescriptor getEditorDescriptor(String name,
-			boolean inferContentType) throws PartInitException {
-
-		if (name == null) {
-			throw new IllegalArgumentException();
-		}
-
-		IContentType contentType = inferContentType ? Platform
-				.getContentTypeManager().findContentTypeFor(name) : null;
-		IEditorRegistry editorReg = PlatformUI.getWorkbench()
-				.getEditorRegistry();
-
-		return getEditorDescriptor(name, editorReg, editorReg.getDefaultEditor(
-				name, contentType));
-	}
-
-	/**
-	 * Get the editor descriptor for a given name using the editorDescriptor
-	 * passed in as a default as a starting point.
-	 * 
-	 * @param name
-	 *            The name of the element to open.
-	 * @param editorReg
-	 *            The editor registry to do the lookups from.
-	 * @param defaultDescriptor
-	 *            IEditorDescriptor or <code>null</code>
-	 * @return IEditorDescriptor
-	 * @throws PartInitException
-	 *             if no valid editor can be found
-	 * 
-	 * @since 3.1
-	 */
-	private static IEditorDescriptor getEditorDescriptor(String name,
-			IEditorRegistry editorReg, IEditorDescriptor defaultDescriptor)
-			throws PartInitException {
-
-		if (defaultDescriptor != null) {
-			return defaultDescriptor;
-		}
-
-		IEditorDescriptor editorDesc = defaultDescriptor;
-
-		// next check the OS for in-place editor (OLE on Win32)
-		if (editorReg.isSystemInPlaceEditorAvailable(name)) {
-			editorDesc = editorReg
-					.findEditor(IEditorRegistry.SYSTEM_INPLACE_EDITOR_ID);
-		}
-
-		// next check with the OS for an external editor
-		if (editorDesc == null
-				&& editorReg.isSystemExternalEditorAvailable(name)) {
-			editorDesc = editorReg
-					.findEditor(IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID);
-		}
-
-		// next lookup the default text editor
-		if (editorDesc == null) {
-			editorDesc = editorReg
-					.findEditor(IDEWorkbenchPlugin.DEFAULT_TEXT_EDITOR_ID);
-		}
-
-		// if no valid editor found, bail out
-		if (editorDesc == null) {
-			throw new PartInitException(
-					IDEWorkbenchMessages.IDE_noFileEditorFound);
-		}
-
-		return editorDesc;
-	}
-
-	/**
-	 * Opens an editor on the file resource of the given marker.
-	 * <p>
-	 * If this page already has an editor open on the marker resource file that
-	 * editor is brought to front; otherwise, a new editor is opened.The cursor
-	 * and selection state of the editor are then updated from information
-	 * recorded in the marker.
-	 * </p>
-	 * <p>
-	 * If the marker contains an <code>EDITOR_ID_ATTR</code> attribute the
-	 * attribute value will be used to determine the editor type to be opened.
-	 * If not, the registered editor for the marker resource file will be used.
-	 * </p>
-	 * 
-	 * @param page
-	 *            the workbench page to open the editor in
-	 * @param marker
-	 *            the marker to open
-	 * @return an open editor or <code>null</code> not possible
-	 * @exception PartInitException
-	 *                if the editor could not be initialized
-	 * @see #openEditor(org.eclipse.ui.IWorkbenchPage,
-	 *      org.eclipse.core.resources.IMarker, boolean)
-	 */
-	public static IEditorPart openEditor(IWorkbenchPage page, IMarker marker)
-			throws PartInitException {
-		return openEditor(page, marker, true);
-	}
-
-	/**
-	 * Opens an editor on the file resource of the given marker.
-	 * <p>
-	 * If this page already has an editor open on the marker resource file that
-	 * editor is brought to front; otherwise, a new editor is opened. If
-	 * <code>activate == true</code> the editor will be activated. The cursor
-	 * and selection state of the editor are then updated from information
-	 * recorded in the marker.
-	 * </p>
-	 * <p>
-	 * If the marker contains an <code>EDITOR_ID_ATTR</code> attribute the
-	 * attribute value will be used to determine the editor type to be opened.
-	 * If not, the registered editor for the marker resource file will be used.
-	 * </p>
-	 * 
-	 * @param page
-	 *            the workbench page to open the editor in
-	 * @param marker
-	 *            the marker to open
-	 * @param activate
-	 *            if <code>true</code> the editor will be activated
-	 * @return an open editor or <code>null</code> not possible
-	 * @exception PartInitException
-	 *                if the editor could not be initialized
-	 */
-	public static IEditorPart openEditor(IWorkbenchPage page, IMarker marker,
-			boolean activate) throws PartInitException {
-		// sanity checks
-		if (page == null || marker == null) {
-			throw new IllegalArgumentException();
-		}
-
-		// get the marker resource file
-		if (!(marker.getResource() instanceof IFile)) {
-			IDEWorkbenchPlugin
-					.log("Open editor on marker failed; marker resource not an IFile"); //$NON-NLS-1$
-			return null;
-		}
-		IFile file = (IFile) marker.getResource();
-
-		// get the preferred editor id from the marker
-		IEditorRegistry editorReg = PlatformUI.getWorkbench()
-				.getEditorRegistry();
-		IEditorDescriptor editorDesc = null;
-		try {
-			String editorID = (String) marker.getAttribute(EDITOR_ID_ATTR);
-			if (editorID != null) {
-				editorDesc = editorReg.findEditor(editorID);
-			}
-		} catch (CoreException e) {
-			// ignore this
-		}
-
-		// open the editor on the marker resource file
-		IEditorPart editor = null;
-		if (editorDesc == null) {
-			editor = openEditor(page, file, activate);
-		} else {
-			editor = page.openEditor(new FileEditorInput(file), editorDesc
-					.getId(), activate);
-		}
-
-		// get the editor to update its position based on the marker
-		if (editor != null) {
-			gotoMarker(editor, marker);
-		}
-
-		return editor;
-	}
-
-    /**
-     * Opens an editor on the given IFileStore object.
-     * <p>
-     * Unlike the other <code>openEditor</code> methods, this one
-     * can be used to open files that reside outside the workspace
-     * resource set.
-     * </p>
-     * <p>
-     * If the page already has an editor open on the target object then that
-     * editor is brought to front; otherwise, a new editor is opened.
-     * </p>
-     * 
-     * @param page
-     *            the page in which the editor will be opened
-     * @param fileStore 
-     *            the IFileStore representing the file to open
-     * @return an open editor or <code>null</code> if an external editor was opened
-     * @exception PartInitException
-     *                if the editor could not be initialized
-     * @see org.eclipse.ui.IWorkbenchPage#openEditor(IEditorInput, String)
-     * @since 3.3
-     */
-	public static IEditorPart openEditorOnFileStore(IWorkbenchPage page, IFileStore fileStore) throws PartInitException {
-        //sanity checks
-        if (page == null) {
-			throw new IllegalArgumentException();
-		}
-
-        IEditorInput input = getEditorInput(fileStore);
-        String editorId = getEditorId(fileStore);
-        
-        // open the editor on the file
-        return page.openEditor(input, editorId);
-    }
-
-	/**
-	 * Save all dirty editors in the workbench whose editor input is a child
-	 * resource of one of the <code>IResource</code>'s provided. Opens a
-	 * dialog to prompt the user if <code>confirm</code> is true. Return true
-	 * if successful. Return false if the user has canceled the command.
-	 * 
-	 * @since 3.0
-	 * 
-	 * @param resourceRoots the resource roots under which editor input should
-	 *            be saved, other will be left dirty
-	 * @param confirm <code>true</code> to ask the user before saving unsaved
-	 *            changes (recommended), and <code>false</code> to save
-	 *            unsaved changes without asking
-	 * @return <code>true</code> if the command succeeded, and
-	 *         <code>false</code> if the operation was canceled by the user or
-	 *         an error occurred while saving
-	 */
-	public static boolean saveAllEditors(final IResource[] resourceRoots,
-			final boolean confirm) {
-
-		if (resourceRoots.length == 0) {
-			return true;
-		}
-
-		final boolean[] result = new boolean[] { true };
-		SafeRunner.run(new SafeRunnable(IDEWorkbenchMessages.ErrorOnSaveAll) {
-			public void run() {
-				IWorkbenchWindow w = PlatformUI.getWorkbench()
-						.getActiveWorkbenchWindow();
-				if (w == null) {
-					IWorkbenchWindow[] windows = PlatformUI.getWorkbench()
-							.getWorkbenchWindows();
-					if (windows.length > 0)
-						w = windows[0];
-				}
-				if (w != null) {
-					result[0] = PlatformUI.getWorkbench().saveAll(w, w,
-							new SaveFilter(resourceRoots), confirm);
-				}
-			}
-		});
-		return result[0];
-	}
-
-	/**
-	 * Sets the default editor id for a given file. This value will be used to
-	 * determine the default editor descriptor for the file in future calls to
-	 * <code>getDefaultEditor(IFile)</code>.
-	 * 
-	 * @param file
-	 *            the file
-	 * @param editorID
-	 *            the editor id
-	 */
-	public static void setDefaultEditor(IFile file, String editorID) {
-		try {
-			file.setPersistentProperty(EDITOR_KEY, editorID);
-		} catch (CoreException e) {
-			// do nothing
-		}
-	}
-
-	/**
-	 * Returns the default editor for a given file. This method will attempt to
-	 * resolve the editor based on content-type bindings as well as traditional
-	 * name/extension bindings.
-	 * <p>
-	 * A default editor id may be registered for a specific file using
-	 * <code>setDefaultEditor</code>. If the given file has a registered
-	 * default editor id the default editor will derived from it. If not, the
-	 * default editor is determined by taking the file name for the file and
-	 * obtaining the default editor for that name.
-	 * </p>
-	 * 
-	 * @param file
-	 *            the file
-	 * @return the descriptor of the default editor, or <code>null</code> if
-	 *         not found
-	 */
-	public static IEditorDescriptor getDefaultEditor(IFile file) {
-		return getDefaultEditor(file, true);
-	}
-
-	/**
-	 * Returns the default editor for a given file. This method will attempt to
-	 * resolve the editor based on content-type bindings as well as traditional
-	 * name/extension bindings if <code>determineContentType</code> is
-	 * <code>true</code>.
-	 * <p>
-	 * A default editor id may be registered for a specific file using
-	 * <code>setDefaultEditor</code>. If the given file has a registered
-	 * default editor id the default editor will derived from it. If not, the
-	 * default editor is determined by taking the file name for the file and
-	 * obtaining the default editor for that name.
-	 * </p>
-	 * 
-	 * @param file
-	 *            the file
-	 * @param determineContentType
-	 *            determine the content type for the given file
-	 * @return the descriptor of the default editor, or <code>null</code> if
-	 *         not found
-	 * @since 3.1
-	 */
-	public static IEditorDescriptor getDefaultEditor(IFile file,
-			boolean determineContentType) {
-		// Try file specific editor.
-		IEditorRegistry editorReg = PlatformUI.getWorkbench()
-				.getEditorRegistry();
-		try {
-			String editorID = file.getPersistentProperty(EDITOR_KEY);
-			if (editorID != null) {
-				IEditorDescriptor desc = editorReg.findEditor(editorID);
-				if (desc != null) {
-					return desc;
-				}
-			}
-		} catch (CoreException e) {
-			// do nothing
-		}
-
-		IContentType contentType = null;
-		if (determineContentType) {
-			contentType = getContentType(file);
-		}
-		// Try lookup with filename
-		return editorReg.getDefaultEditor(file.getName(), contentType);
-	}
-
-	/**
-	 * Extracts and returns the <code>IResource</code>s in the given
-	 * selection or the resource objects they adapts to.
-	 * 
-	 * @param originalSelection
-	 *            the original selection, possibly empty
-	 * @return list of resources (element type: <code>IResource</code>),
-	 *         possibly empty
-	 */
-	public static List computeSelectedResources(
-			IStructuredSelection originalSelection) {
-		List resources = null;
-		for (Iterator e = originalSelection.iterator(); e.hasNext();) {
-			Object next = e.next();
-			Object resource = null;
-			if (next instanceof IResource) {
-				resource = next;
-			} else if (next instanceof IAdaptable) {
-				resource = ((IAdaptable) next).getAdapter(IResource.class);
-			}
-			if (resource != null) {
-				if (resources == null) {
-					// lazy init to avoid creating empty lists
-					// assume selection contains mostly resources most times
-					resources = new ArrayList(originalSelection.size());
-				}
-				resources.add(resource);
-			}
-		}
-		if (resources == null) {
-			return Collections.EMPTY_LIST;
-		}
-		return resources;
-
-	}
-
-	/**
-	 * Return the content type for the given file.
-	 * 
-	 * @param file
-	 *            the file to test
-	 * @return the content type, or <code>null</code> if it cannot be
-	 *         determined.
-	 * @since 3.1
-	 */
-	public static IContentType getContentType(IFile file) {
-		try {
-			UIStats.start(UIStats.CONTENT_TYPE_LOOKUP, file.getName());
-			IContentDescription contentDescription = file
-					.getContentDescription();
-			if (contentDescription == null) {
-				return null;
-			}
-			return contentDescription.getContentType();
-		} catch (CoreException e) {
-			if (e.getStatus().getCode() == IResourceStatus.OUT_OF_SYNC_LOCAL) {
-				// Determine the content type from the file name.
-				return Platform.getContentTypeManager()
-							.findContentTypeFor(file.getName());
-			}
-			return null;
-		} finally {
-			UIStats.end(UIStats.CONTENT_TYPE_LOOKUP, file, file.getName());
-		}
-	}
-
-	/**
-	 * Guess at the content type of the given file based on the filename.
-	 * 
-	 * @param file
-	 *            the file to test
-	 * @return the content type, or <code>null</code> if it cannot be
-	 *         determined.
-	 * @since 3.2
-	 */
-	public static IContentType guessContentType(IFile file) {
-		String fileName = file.getName();
-		try {
-			UIStats.start(UIStats.CONTENT_TYPE_LOOKUP, fileName);
-			IContentTypeMatcher matcher = file.getProject()
-					.getContentTypeMatcher();
-			return matcher.findContentTypeFor(fileName);
-		} catch (CoreException e) {
-			return null;
-		} finally {
-			UIStats.end(UIStats.CONTENT_TYPE_LOOKUP, file, fileName);
-		}
-	}
-
-	/**
-	 * Prompt the user to inform them of the possible side effects of an
-	 * operation on resources. Do not prompt for side effects from ignored model
-	 * providers. A model provider can be ignored if it is the client calling
-	 * this API. Any message from the provided model provider id or any model
-	 * providers it extends will be ignored.
-	 * 
-	 * @param shell
-	 *            the shell to parent the prompt dialog
-	 * @param title
-	 *            the title of the dialog
-	 * @param message
-	 *            the message for the dialog
-	 * @param delta
-	 *            a delta built using an
-	 *            {@link IResourceChangeDescriptionFactory}
-	 * @param ignoreModelProviderIds
-	 *            model providers to be ignored
-	 * @param syncExec
-	 *            prompt in a sync exec (required when called from a non-UI
-	 *            thread)
-	 * @return whether the user chose to continue
-	 * @since 3.2
-	 */
-	public static boolean promptToConfirm(final Shell shell,
-			final String title, String message, IResourceDelta delta,
-			String[] ignoreModelProviderIds, boolean syncExec) {
-		IStatus status = ResourceChangeValidator.getValidator().validateChange(
-				delta, null);
-		if (status.isOK()) {
-			return true;
-		}
-		final IStatus displayStatus;
-		if (status.isMultiStatus()) {
-			List result = new ArrayList();
-			IStatus[] children = status.getChildren();
-			for (int i = 0; i < children.length; i++) {
-				IStatus child = children[i];
-				if (!isIgnoredStatus(child, ignoreModelProviderIds)) {
-					result.add(child);
-				}
-			}
-			if (result.isEmpty()) {
-				return true;
-			}
-			if (result.size() == 1) {
-				displayStatus = (IStatus) result.get(0);
-			} else {
-				displayStatus = new MultiStatus(status.getPlugin(), status
-						.getCode(), (IStatus[]) result
-						.toArray(new IStatus[result.size()]), status
-						.getMessage(), status.getException());
-			}
-		} else {
-			if (isIgnoredStatus(status, ignoreModelProviderIds)) {
-				return true;
-			}
-			displayStatus = status;
-		}
-
-		if (message == null) {
-			message = IDEWorkbenchMessages.IDE_sideEffectWarning;
-		}
-		final String dialogMessage = NLS.bind(
-				IDEWorkbenchMessages.IDE_areYouSure, message);
-
-		final boolean[] result = new boolean[] { false };
-		Runnable runnable = new Runnable() {
-			public void run() {
-				ErrorDialog dialog = new ErrorDialog(shell, title,
-						dialogMessage, displayStatus, IStatus.ERROR
-								| IStatus.WARNING | IStatus.INFO) {
-					protected void createButtonsForButtonBar(Composite parent) {
-						createButton(parent, IDialogConstants.YES_ID,
-								IDialogConstants.YES_LABEL, false);
-						createButton(parent, IDialogConstants.NO_ID,
-								IDialogConstants.NO_LABEL, true);
-						createDetailsButton(parent);
-					}
-
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.jface.dialogs.ErrorDialog#buttonPressed(int)
-					 */
-					protected void buttonPressed(int id) {
-						if (id == IDialogConstants.YES_ID) {
-							super.buttonPressed(IDialogConstants.OK_ID);
-						} else if (id == IDialogConstants.NO_ID) {
-							super.buttonPressed(IDialogConstants.CANCEL_ID);
-						}
-						super.buttonPressed(id);
-					}
-				};
-				int code = dialog.open();
-				result[0] = code == 0;
-			}
-		};
-		if (syncExec) {
-			shell.getDisplay().syncExec(runnable);
-		} else {
-			runnable.run();
-		}
-		return result[0];
-	}
-
-	private static boolean isIgnoredStatus(IStatus status,
-			String[] ignoreModelProviderIds) {
-		if (ignoreModelProviderIds == null) {
-			return false;
-		}
-		if (status instanceof ModelStatus) {
-			ModelStatus ms = (ModelStatus) status;
-			for (int i = 0; i < ignoreModelProviderIds.length; i++) {
-				String id = ignoreModelProviderIds[i];
-				if (ms.getModelProviderId().equals(id)) {
-					return true;
-				}
-				IModelProviderDescriptor desc = ModelProvider
-						.getModelProviderDescriptor(id);
-				String[] extended = desc.getExtendedModels();
-				if (isIgnoredStatus(status, extended)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IDEActionFactory.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IDEActionFactory.java
deleted file mode 100644
index edecef3..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IDEActionFactory.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.ide;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.GlobalBuildAction;
-import org.eclipse.ui.actions.NewWizardDropDownAction;
-import org.eclipse.ui.actions.NewWizardMenu;
-import org.eclipse.ui.actions.QuickStartAction;
-import org.eclipse.ui.actions.RetargetAction;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.TipsAndTricksAction;
-import org.eclipse.ui.internal.ide.actions.BuildCleanAction;
-import org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction;
-import org.eclipse.ui.internal.ide.actions.ProjectPropertyDialogAction;
-import org.eclipse.ui.internal.ide.actions.RetargetActionWithDefault;
-import org.eclipse.ui.internal.ide.actions.ToggleAutoBuildAction;
-
-/**
- * Access to standard actions provided by the IDE workbench (including
- * those of the generic workbench).
- * <p>
- * The functionality of this class is provided by static fields.
- * Example usage:
- * <pre>
- * MenuManager menu = ...;
- * ActionFactory.IWorkbenchAction closeProjectAction
- * 	  = IDEActionFactory.CLOSE_PROJECT.create(window);
- * menu.add(closeProjectAction);
- * </pre>
- * </p>
- * 
- * @since 3.0
- */
-public final class IDEActionFactory {
-
-    /**
-     * Prevents instantiation.
-     */
-    private IDEActionFactory() {
-        // do nothing
-    }
-
-    /**
-     * IDE-specific workbench action: Add task.
-     * This action is a {@link RetargetAction} with 
-     * id "addTask". This action maintains its enablement state.
-     */
-    public static final ActionFactory ADD_TASK = new ActionFactory("addTask") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            RetargetAction action = new RetargetAction(getId(), IDEWorkbenchMessages.Workbench_addTask);
-            action.setToolTipText(IDEWorkbenchMessages.Workbench_addTaskToolTip);
-            window.getPartService().addPartListener(action);
-            action.setActionDefinitionId("org.eclipse.ui.edit.addTask"); //$NON-NLS-1$
-            return action;
-        }
-    };
-
-    /**
-     * IDE-specific workbench action: Add bookmark.
-     * This action is a {@link RetargetAction} with 
-     * id "bookmark". This action maintains its enablement state.
-     */
-    public static final ActionFactory BOOKMARK = new ActionFactory("bookmark") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            RetargetAction action = new RetargetAction(getId(), IDEWorkbenchMessages.Workbench_addBookmark);
-            action.setToolTipText(IDEWorkbenchMessages.Workbench_addBookmarkToolTip);
-            window.getPartService().addPartListener(action);
-            action.setActionDefinitionId("org.eclipse.ui.edit.addBookmark"); //$NON-NLS-1$
-            return action;
-        }
-    };
-
-    /**
-     * IDE-specific workbench action: Incremental build.
-     * This action maintains its enablement state.
-     */
-    public static final ActionFactory BUILD = new ActionFactory("build") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            return new GlobalBuildAction(window,
-                    IncrementalProjectBuilder.INCREMENTAL_BUILD);
-        }
-    };
-
-    /**
-     * IDE-specific workbench action: Build clean
-     * This action maintains its enablement state.
-     * @since 3.0
-     */
-    public static final ActionFactory BUILD_CLEAN = new ActionFactory(
-            "buildClean") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            IWorkbenchAction action = new BuildCleanAction(window);
-            action.setId(getId());
-            return action;
-        }
-    };
-
-    /**
-     * IDE-specific workbench action: Build automatically
-     * This action maintains its enablement state.
-     * @since 3.0
-     */
-    public static final ActionFactory BUILD_AUTOMATICALLY = new ActionFactory(
-            "buildAutomatically") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            IWorkbenchAction action = new ToggleAutoBuildAction(window);
-            action.setId(getId());
-            action.setActionDefinitionId("org.eclipse.ui.project.buildAutomatically"); //$NON-NLS-1$
-            return action;
-        }
-    };
-
-    /**
-     * IDE-specific workbench action: Incremental build.
-     * This action is a {@link RetargetAction} with 
-     * id "buildProject". This action maintains its enablement state.
-     */
-    public static final ActionFactory BUILD_PROJECT = new ActionFactory(
-            "buildProject") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            RetargetAction action = new RetargetActionWithDefault(getId(),
-                    IDEWorkbenchMessages.Workbench_buildProject);
-            action.setToolTipText(IDEWorkbenchMessages.Workbench_buildProjectToolTip);
-            window.getPartService().addPartListener(action);
-            action.setActionDefinitionId("org.eclipse.ui.project.buildProject"); //$NON-NLS-1$
-            return action;
-        }
-    };
-
-    /**
-     * IDE-specific workbench action: Close project.
-     * This action is a {@link RetargetAction} with 
-     * id "closeProject". This action maintains its enablement state.
-     */
-    public static final ActionFactory CLOSE_PROJECT = new ActionFactory(
-            "closeProject") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            RetargetAction action = new RetargetAction(getId(), IDEWorkbenchMessages.CloseResourceAction_text);
-            action.setToolTipText(IDEWorkbenchMessages.CloseResourceAction_text);
-            window.getPartService().addPartListener(action);
-            action.setActionDefinitionId("org.eclipse.ui.project.closeProject"); //$NON-NLS-1$
-            return action;
-        }
-    };
-
-    /**
-     * IDE-specific workbench action: Close unrelated projects.
-     * <p>
-     * This action closes all projects that are unrelated to the selected projects. A
-     * project is unrelated if it is not directly or transitively referenced by one 
-     * of the selected projects, and does not directly or transitively reference
-     * one of the selected projects.
-     * </p>
-     * This action is a {@link RetargetAction} with 
-     * id "closeUnrelatedProjects". This action maintains its enablement state.
-     * @see IProject#getReferencedProjects()
-     * @see IProject#getReferencingProjects()
-     * @see IProject#close(org.eclipse.core.runtime.IProgressMonitor)
-     * @since 3.2
-     */
-    public static final ActionFactory CLOSE_UNRELATED_PROJECTS = new ActionFactory(
-            "closeUnrelatedProjects") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            RetargetAction action = new RetargetAction(getId(), IDEWorkbenchMessages.CloseUnrelatedProjectsAction_text);
-            action.setToolTipText(IDEWorkbenchMessages.CloseUnrelatedProjectsAction_toolTip);
-            window.getPartService().addPartListener(action);
-            action.setActionDefinitionId("org.eclipse.ui.project.closeUnrelatedProjects"); //$NON-NLS-1$
-            return action;
-        }
-    };
-
-    /**
-     * IDE-specific workbench action: Opens the "new" wizard drop down, including
-     * resource-specific items for Project... and Example...
-     * This action maintains its enablement state.
-     */
-    public static final ActionFactory NEW_WIZARD_DROP_DOWN = new ActionFactory(
-            "newWizardDropDown") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            // @issue we are creating a NEW action just to pass to NewWizardDropDownAction
-            IWorkbenchAction innerAction = ActionFactory.NEW.create(window);
-            NewWizardMenu newWizardMenu = new NewWizardMenu(window);
-            IWorkbenchAction action = new NewWizardDropDownAction(window,
-                    innerAction, newWizardMenu);
-            action.setId(getId());
-            return action;
-        }
-    };
-
-    /**
-     * IDE-specific workbench action: Open project.
-     * This action is a {@link RetargetAction} with 
-     * id "openProject". This action maintains its enablement state.
-     */
-    public static final ActionFactory OPEN_PROJECT = new ActionFactory(
-            "openProject") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            RetargetAction action = new RetargetAction(getId(), IDEWorkbenchMessages.OpenResourceAction_text);
-            action.setToolTipText(IDEWorkbenchMessages.OpenResourceAction_toolTip);
-            window.getPartService().addPartListener(action);
-            action.setActionDefinitionId("org.eclipse.ui.project.openProject"); //$NON-NLS-1$
-            return action;
-        }
-    };
-
-    /**
-     * IDE-specific workbench action: Open workspace.
-     * This action maintains its enablement state.
-     */
-    public static final ActionFactory OPEN_WORKSPACE = new ActionFactory(
-            "openWorkspace") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            IWorkbenchAction action = new OpenWorkspaceAction(window);
-            action.setId(getId());
-            return action;
-        }
-    };
-
-    /**
-     * IDE-specific workbench action: Open project properties.
-     * This action maintains its enablement state.
-     */
-    public static final ActionFactory OPEN_PROJECT_PROPERTIES = new ActionFactory(
-            "projectProperties") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            IWorkbenchAction action = new ProjectPropertyDialogAction(window);
-            action.setId(getId());
-            return action;
-        }
-    };
-
-    /**
-     * IDE-specific workbench action: Quick start.
-     * This action maintains its enablement state.
-     * 
-     * @deprecated the IDE now uses the new intro mechanism
-     */
-    public static final ActionFactory QUICK_START = new ActionFactory(
-            "quickStart") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            IWorkbenchAction action = new QuickStartAction(window);
-            action.setId(getId());
-            return action;
-        }
-    };
-
-    /**
-     * IDE-specific workbench action: Full build.
-     * This action maintains its enablement state.
-     * 
-     * @deprecated as of 3.0, this action no longer appears in the UI (was deprecated in 3.1)
-     */
-    public static final ActionFactory REBUILD_ALL = new ActionFactory(
-            "rebuildAll") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            IWorkbenchAction action = new GlobalBuildAction(window,
-                    IncrementalProjectBuilder.FULL_BUILD);
-            action.setId(getId());
-            return action;
-        }
-    };
-
-    /**
-     * IDE-specific workbench action: Rebuild project.
-     * This action is a {@link RetargetAction} with 
-     * id "rebuildProject". This action maintains its enablement state.
-     * 
-     * @deprecated as of 3.0, this action no longer appears in the UI (was deprecated in 3.1)
-     */
-    public static final ActionFactory REBUILD_PROJECT = new ActionFactory(
-            "rebuildProject") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            RetargetAction action = new RetargetAction(getId(), IDEWorkbenchMessages.Workbench_rebuildProject);
-            action.setToolTipText(IDEWorkbenchMessages.Workbench_rebuildProjectToolTip);
-            window.getPartService().addPartListener(action);
-            action
-                    .setActionDefinitionId("org.eclipse.ui.project.rebuildProject"); //$NON-NLS-1$
-            return action;
-        }
-    };
-
-    /**
-     * IDE-specific workbench action: Tips and tricks.
-     * This action maintains its enablement state.
-     */
-    public static final ActionFactory TIPS_AND_TRICKS = new ActionFactory(
-            "tipsAndTricks") { //$NON-NLS-1$
-        /* (non-javadoc) method declared on ActionFactory */
-        public IWorkbenchAction create(IWorkbenchWindow window) {
-            if (window == null) {
-                throw new IllegalArgumentException();
-            }
-            IWorkbenchAction action = new TipsAndTricksAction(window);
-            action.setId(getId());
-            return action;
-        }
-    };
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IDEEncoding.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IDEEncoding.java
deleted file mode 100644
index fe9a262..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IDEEncoding.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.ide;
-
-import java.nio.charset.Charset;
-import java.nio.charset.IllegalCharsetNameException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.WorkbenchEncoding;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * IDEEncoding is a utility class for managing encoding information that
- * includes user preferences from the IDE and core resources.
- * <p>
- * This class provides all its functionality via static methods.
- * It is not intended to be instantiated or subclassed.
- * </p>
- * 
- * @see org.eclipse.ui.WorkbenchEncoding
- * @see org.eclipse.core.resources.ResourcesPlugin
- * @since 3.1
- */
-public final class IDEEncoding {
-	
-	private IDEEncoding () {
-        // prevent instantiation
-	}
-
-	//The preference for the user entered encodings.
-	private static String IDE_ENCODINGS_PREFERENCE = "IDE_ENCODINGS_PREFERENCE"; //$NON-NLS-1$
-
-	private static String PREFERENCE_SEPARATOR = "'"; //$NON-NLS-1$
-
-	/**
-	 * Display constant for the UTF 8 byte order marker for resources.
-	 */
-	public static String BOM_UTF_8 = "UTF-8 (BOM)";//$NON-NLS-1$
-
-	/**
-	 * Display constant for the UTF 16 big endian byte order marker for
-	 * resources.
-	 */
-	public static String BOM_UTF_16BE = "UTF-16 Big-Endian (BOM)";//$NON-NLS-1$
-
-	/**
-	 * Display constant for the UTF 16 little endian byte order marker for
-	 * resources.
-	 */
-	public static String BOM_UTF_16LE = "UTF-16 Little-Endian (BOM)";//$NON-NLS-1$
-
-	/**
-	 * Get all of the available encodings including any that were saved as a
-	 * preference in the IDE or in core resources.
-	 * 
-	 * @return List of String
-	 */
-	public static List getIDEEncodings() {
-		List encodings = getIDEEncodingsPreference();
-		encodings.addAll(WorkbenchEncoding.getDefinedEncodings());
-
-		String enc = getResourceEncoding();
-
-		if (!(enc == null || encodings.contains(enc))) {
-			encodings.add(enc);
-		}
-
-		Collections.sort(encodings);
-		return encodings;
-	}
-
-	/**
-	 * Get the current value of the encoding preference. If the value is not set
-	 * return <code>null</code>.
-	 * 
-	 * @return String
-	 */
-	public static String getResourceEncoding() {
-		String preference = ResourcesPlugin.getPlugin().getPluginPreferences().getString(
-				ResourcesPlugin.PREF_ENCODING);
-		if (preference == null || preference.length() == 0) {
-			return null;
-		}
-		return preference;
-	}
-
-	/**
-	 * Add value to the list of workbench encodings.
-	 * 
-	 * @param value
-	 */
-	public static void addIDEEncoding(String value) {
-
-		if (WorkbenchEncoding.getDefinedEncodings().contains(value)) {
-			return;
-		}
-
-		writeEncodingsPreference(value, getIDEEncodingsPreference());
-
-	}
-
-	/**
-	 * Write the encodings preference. If value is not null
-	 * and not already in the list of currentEncodings add
-	 * it to the list.
-	 * @param value String or <code>null</code>
-	 * @param encodings The list of encodings to write
-	 */
-	private static void writeEncodingsPreference(String value, Collection encodings) {
-		boolean addValue = (value != null);
-
-		StringBuffer result = new StringBuffer();
-
-		Iterator currentEncodings = encodings.iterator();
-
-		while (currentEncodings.hasNext()) {
-			String string = (String) currentEncodings.next();
-			result.append(string);
-			result.append(PREFERENCE_SEPARATOR);
-			if (addValue && string.equals(value)) {
-				addValue = false;
-			}
-		}
-
-		if (addValue) {
-			result.append(value);
-		}
-
-		IDEWorkbenchPlugin.getDefault().getPreferenceStore().setValue(IDE_ENCODINGS_PREFERENCE,
-				result.toString());
-	}
-
-	/**
-	 * Get the value of the encodings preference.
-	 * 
-	 * @return List
-	 */
-	private static List getIDEEncodingsPreference() {
-		
-		boolean updateRequired = false;
-		
-		String encodings = IDEWorkbenchPlugin.getDefault().getPreferenceStore().getString(
-				IDE_ENCODINGS_PREFERENCE);
-
-		if (encodings == null || encodings.length() == 0) {
-			return new ArrayList();
-		}
-
-		String[] preferenceEncodings = encodings.split(PREFERENCE_SEPARATOR);
-		ArrayList result = new ArrayList();
-
-		//Drop any encodings that are not valid
-		for (int i = 0; i < preferenceEncodings.length; i++) {
-			String string = preferenceEncodings[i];
-			boolean isSupported;
-			try {
-				isSupported = Charset.isSupported(string);
-			} catch (IllegalCharsetNameException e) {
-				isSupported = false;
-			}
-			if (isSupported) {
-				result.add(string);
-			} else{
-				WorkbenchPlugin.log(NLS.bind(IDEWorkbenchMessages.WorkbenchEncoding_invalidCharset, string));
-				updateRequired = true;
-			}
-				
-		}
-		
-		if(updateRequired) {
-			writeEncodingsPreference(null, result);
-		}
-		return result;
-
-	}
-
-	/**
-	 * Clear the IDE encodings preference.
-	 */
-	public static void clearUserEncodings() {
-		IDEWorkbenchPlugin.getDefault().getPreferenceStore().setToDefault(IDE_ENCODINGS_PREFERENCE);
-	}
-
-	/**
-	 * Get the displayable string for the byte order marking from the supplied
-	 * file description.
-	 * 
-	 * @param description
-	 *            The description to query. May be <code>null</code>.
-	 * @return String or <code>null</code> if the byte order mark cannot be
-	 *         found or the description is <code>null</code>.
-	 * @see IContentDescription#getProperty(org.eclipse.core.runtime.QualifiedName)
-	 */
-	public static String getByteOrderMarkLabel(IContentDescription description) {
-
-		if (description == null) {
-			return null;
-		}
-
-		byte[] bom = (byte[]) description.getProperty(IContentDescription.BYTE_ORDER_MARK);
-		if (bom == null) {
-			return null;
-		}
-		if (bom == IContentDescription.BOM_UTF_8) {
-			return IDEEncoding.BOM_UTF_8;
-		}
-		if (bom == IContentDescription.BOM_UTF_16BE) {
-			return IDEEncoding.BOM_UTF_16BE;
-		}
-		if (bom == IContentDescription.BOM_UTF_16LE) {
-			return IDEEncoding.BOM_UTF_16LE;
-		}
-
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IGotoMarker.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IGotoMarker.java
deleted file mode 100644
index 5092341..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IGotoMarker.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.ide;
-
-import org.eclipse.core.resources.IMarker;
-
-/**
- * An adapter interface for editors, which allows the editor
- * to reveal the position of a given marker.
- * 
- * @since 3.0
- */
-public interface IGotoMarker {
-    /**
-     * Sets the cursor and selection state for an editor to 
-     * reveal the position of the given marker.
-     *  
-     * @param marker the marker
-     */
-    public void gotoMarker(IMarker marker);
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IIDEActionConstants.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IIDEActionConstants.java
deleted file mode 100644
index c6309e7..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/IIDEActionConstants.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.ide;
-
-/**
- * Identifiers for IDE menus, toolbars and groups.
- * <p>
- * This interface contains constants only; it is not intended to be implemented
- * or extended.
- * </p>
- * 
- * Note: want to move IDE-specific stuff out of IWorkbenchActionConstants.
- *   There's still some cleanup to be done here (and there).
- * 
- * @since 3.0
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IIDEActionConstants {
-
-    /**
-     * Name of standard File menu (value <code>"file"</code>).
-     */
-    public static final String M_FILE = "file"; //$NON-NLS-1$
-
-    /**
-     * Name of standard Edit menu (value <code>"edit"</code>).
-     */
-    public static final String M_EDIT = "edit"; //$NON-NLS-1$
-
-    /**
-     * Name of standard Navigate menu (value <code>"navigate"</code>).
-     */
-    public static final String M_NAVIGATE = "navigate"; //$NON-NLS-1$
-
-    /**
-     * Name of standard Project menu (value <code>"project"</code>).
-     */
-    public static final String M_PROJECT = "project"; //$NON-NLS-1$
-
-    /**
-     * Name of standard Window menu (value <code>"window"</code>).
-     */
-    public static final String M_WINDOW = "window"; //$NON-NLS-1$
-
-    /**
-     * Name of standard Help menu (value <code>"help"</code>).
-     */
-    public static final String M_HELP = "help"; //$NON-NLS-1$
-
-    /**
-     * File menu: name of group for start of menu (value <code>"fileStart"</code>).
-     */
-    public static final String FILE_START = "fileStart"; //$NON-NLS-1$
-
-    /**
-     * File menu: name of group for end of menu (value <code>"fileEnd"</code>).
-     */
-    public static final String FILE_END = "fileEnd"; //$NON-NLS-1$
-
-    /**
-     * File menu: name of group for extra New-like actions (value <code>"new.ext"</code>).
-     */
-    public static final String NEW_EXT = "new.ext"; //$NON-NLS-1$
-
-    /**
-     * File menu: name of group for extra Close-like actions (value <code>"close.ext"</code>).
-     */
-    public static final String CLOSE_EXT = "close.ext"; //$NON-NLS-1$
-
-    /**
-     * File menu: name of group for extra Save-like actions (value <code>"save.ext"</code>).
-     */
-    public static final String SAVE_EXT = "save.ext"; //$NON-NLS-1$
-
-    /**
-     * File menu: name of group for extra Print-like actions (value <code>"print.ext"</code>).
-     */
-    public static final String PRINT_EXT = "print.ext"; //$NON-NLS-1$
-
-    /**
-     * File menu: name of group for extra Import-like actions (value <code>"import.ext"</code>).
-     */
-    public static final String IMPORT_EXT = "import.ext"; //$NON-NLS-1$
-
-    /**
-     * File menu: name of "Most Recently Used File" group.
-     * (value <code>"mru"</code>).
-     */
-    public static final String MRU = "mru"; //$NON-NLS-1$
-
-    /**
-     * Edit menu: name of group for start of menu (value <code>"editStart"</code>).
-     */
-    public static final String EDIT_START = "editStart"; //$NON-NLS-1$
-
-    /**
-     * Edit menu: name of group for end of menu (value <code>"editEnd"</code>).
-     */
-    public static final String EDIT_END = "editEnd"; //$NON-NLS-1$
-
-    /**
-     * Edit menu: name of group for extra Undo-like actions (value <code>"undo.ext"</code>).
-     */
-    public static final String UNDO_EXT = "undo.ext"; //$NON-NLS-1$
-
-    /**
-     * Edit menu: name of group for extra Cut-like actions (value <code>"cut.ext"</code>).
-     */
-    public static final String CUT_EXT = "cut.ext"; //$NON-NLS-1$
-
-    /**
-     * Edit menu: name of group for extra Find-like actions (value <code>"find.ext"</code>).
-     * <p>Note: The value of this constant has changed in 3.3 to match the specification;
-     * before 3.3, its value was incorrect (<code>"cut.ext"</code>).  See bug 155856 for details.</p>
-     */
-    public static final String FIND_EXT = "find.ext"; //$NON-NLS-1$
-
-    /**
-     * Edit menu: name of group for extra Add-like actions (value <code>"add.ext"</code>).
-     */
-    public static final String ADD_EXT = "add.ext"; //$NON-NLS-1$
-
-    /**
-     * Workbench menu: name of group for extra Build-like actions
-     * (value <code>"build.ext"</code>).
-     */
-    public static final String BUILD_EXT = "build.ext"; //$NON-NLS-1$
-
-    /**
-     * Workbench toolbar id for file toolbar group.
-     * 
-     * @since 2.1
-     */
-    public static final String TOOLBAR_FILE = "org.eclipse.ui.workbench.file"; //$NON-NLS-1$
-
-    /**
-     * Workbench toolbar id for navigate toolbar group.
-     * 
-     * @since 2.1
-     */
-    public static final String TOOLBAR_NAVIGATE = "org.eclipse.ui.workbench.navigate"; //$NON-NLS-1$
-
-    // Workbench toolbar group ids.  To add an item at the beginning of the group, 
-    // use the GROUP id.  To add an item at the end of the group, use the EXT id.
-
-    /**
-     * Group id for pin toolbar group.
-     * 
-     * @since 2.1
-     */
-    public static final String PIN_GROUP = "pin.group"; //$NON-NLS-1$
-
-    /**
-     * Group ids for history toolbar group.
-     * 
-     * @since 2.1
-     */
-    public static final String HISTORY_GROUP = "history.group"; //$NON-NLS-1$
-
-    /**
-     * Group ids for new toolbar group.
-     * 
-     * @since 2.1
-     */
-    public static final String NEW_GROUP = "new.group"; //$NON-NLS-1$
-
-    /**
-     * Group ids for save toolbar group.
-     * 
-     * @since 2.1
-     */
-    public static final String SAVE_GROUP = "save.group"; //$NON-NLS-1$
-
-    /**
-     * Group ids for build toolbar group.
-     * 
-     * @since 2.1
-     */
-    public static final String BUILD_GROUP = "build.group"; //$NON-NLS-1$
-
-    // Pop-up menu groups:
-    /**
-     * Pop-up menu: name of group for Add actions (value <code>"group.add"</code>).
-     */
-    public static final String GROUP_ADD = "group.add"; //$NON-NLS-1$
-
-    /**
-     * Pop-up menu and cool bar: name of group for File actions (value <code>"group.file"</code>).
-     */
-    public static final String GROUP_FILE = "group.file"; //$NON-NLS-1$
-
-    /**
-     * Coolbar: name of group for Navigate actions (value <code>"group.nav"</code>).
-     */
-    public static final String GROUP_NAV = "group.nav"; //$NON-NLS-1$
-
-    /**
-     * Pop-up menu: name of group for Show In actions (value <code>"group.showIn"</code>).
-     * 
-     * @since 2.1
-     */
-    public static final String GROUP_SHOW_IN = "group.showIn"; //$NON-NLS-1$
-
-    /**
-     * Navigate menu: name of group for start of menu
-     * (value <code>"navStart"</code>).
-     */
-    public static final String NAV_START = "navStart"; //$NON-NLS-1$
-
-    /**
-     * Navigate menu: name of group for end of menu
-     * (value <code>"navEnd"</code>).
-     */
-    public static final String NAV_END = "navEnd"; //$NON-NLS-1$
-
-    /**
-     * Navigate menu: name of group for extra Open actions
-     * (value <code>"open.ext"</code>).
-     */
-    public static final String OPEN_EXT = "open.ext"; //$NON-NLS-1$
-
-    /**
-     * Navigate menu: name of group for extra Show actions
-     * (value <code>"show.ext"</code>).
-     */
-    public static final String SHOW_EXT = "show.ext"; //$NON-NLS-1$
-
-    /**
-     * Navigate menu: name of standard Go Into global action
-     * (value <code>"goInto"</code>).
-     */
-    public static final String GO_INTO = "goInto"; // Global action. //$NON-NLS-1$
-
-    /**
-     * Navigate menu: name of standard Go To submenu
-     * (value <code>"goTo"</code>).
-     */
-    public static final String GO_TO = "goTo"; //$NON-NLS-1$
-
-    /**
-     * Navigate menu: name of standard Go To Resource global action
-     * (value <code>"goToResource"</code>).
-     * 
-     * Note:should be in an action factory
-     */
-    public static final String GO_TO_RESOURCE = "goToResource"; // Global action. //$NON-NLS-1$
-
-    /**
-     * Project menu: name of group for start of menu
-     * (value <code>"projStart"</code>).
-     */
-    public static final String PROJ_START = "projStart"; //$NON-NLS-1$
-
-    /**
-     * Project menu: name of group for start of menu
-     * (value <code>"projEnd"</code>).
-     */
-    public static final String PROJ_END = "projEnd"; //$NON-NLS-1$
-
-    /**
-     * Help menu: name of group for start of menu
-     * (value <code>"helpStart"</code>).
-     */
-    public static final String HELP_START = "helpStart"; //$NON-NLS-1$
-
-    /**
-     * Help menu: name of group for end of menu
-     * (value <code>"helpEnd"</code>).
-     */
-    public static final String HELP_END = "helpEnd"; //$NON-NLS-1$
-
-}
-
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/ResourceUtil.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/ResourceUtil.java
deleted file mode 100644
index d5c352f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/ResourceUtil.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.ide;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.resources.mapping.ResourceTraversal;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.statushandlers.StatusManager;
-
-/**
- * Utility class for manipulating resources and determining correspondences 
- * between resources and workbench objects.
- * <p>
- * This class provides all its functionality via static methods.
- * It is not intended to be instantiated or subclassed.
- * </p>
- *
- * @since 3.1
- */
-public final class ResourceUtil {
-
-    private ResourceUtil() {
-        // prevent instantiation
-    }
-
-    /**
-     * Returns the file corresponding to the given editor input, or <code>null</code>
-     * if there is no applicable file.  
-     * Returns <code>null</code> if the given editor input is <code>null</code>.
-     * 
-     * @param editorInput the editor input, or <code>null</code>
-     * @return the file corresponding to the editor input, or <code>null</code>
-     */
-    public static IFile getFile(IEditorInput editorInput) {
-		if (editorInput == null) {
-			return null;
-		}
-        // Note: do not treat IFileEditorInput as a special case.  Use the adapter mechanism instead.
-        // See Bug 87288 [IDE] [EditorMgmt] Should avoid explicit checks for [I]FileEditorInput
-        Object o = editorInput.getAdapter(IFile.class);
-        if (o instanceof IFile) {
-			return (IFile) o;
-		}
-        return null;
-    }
-
-    /**
-     * Returns the resource corresponding to the given editor input, or <code>null</code>
-     * if there is no applicable resource.
-     * Returns <code>null</code> if the given editor input is <code>null</code>.
-     * 
-     * @param editorInput the editor input
-     * @return the file corresponding to the editor input, or <code>null</code>
-     */
-    public static IResource getResource(IEditorInput editorInput) {
-		if (editorInput == null) {
-			return null;
-		}
-        // Note: do not treat IFileEditorInput as a special case.  Use the adapter mechanism instead.
-        // See Bug 87288 [IDE] [EditorMgmt] Should avoid explicit checks for [I]FileEditorInput
-        Object o = editorInput.getAdapter(IResource.class);
-        if (o instanceof IResource) {
-			return (IResource) o;
-		}
-        // the input may adapt to IFile but not IResource
-        return getFile(editorInput);
-    }
-
-    /**
-     * Returns the editor in the given page whose input represents the given file,
-     * or <code>null</code> if there is no such editor.
-     * 
-     * @param page the workbench page
-     * @param file the file
-     * @return the matching editor, or <code>null</code>
-     */
-    public static IEditorPart findEditor(IWorkbenchPage page, IFile file) {
-        // handle the common case where the editor input is a FileEditorInput
-        IEditorPart editor = page.findEditor(new FileEditorInput(file));
-        if (editor != null) {
-            return editor;
-        }
-        // check for editors that have their own kind of input that adapts to IFile,
-        // being careful not to force loading of the editor
-        IEditorReference[] refs = page.getEditorReferences();
-        for (int i = 0; i < refs.length; i++) {
-            IEditorReference ref = refs[i];
-            IEditorPart part = ref.getEditor(false);
-            if (part != null) {
-                IFile editorFile = getFile(part.getEditorInput());
-                if (editorFile != null && file.equals(editorFile)) {
-                    return part;
-                }
-            }
-        }
-        return null;
-    }
-    
-    /**
-     * Returns the resource corresponding to the given model element, or <code>null</code>
-     * if there is no applicable resource.
-     * 
-     * @param element the model element, or <code>null</code>
-     * @return the resource corresponding to the model element, or <code>null</code>
-     * @since 3.2
-     */
-    public static IResource getResource(Object element) {
-		if (element == null) {
-			return null;
-		}
-		if (element instanceof IResource) {
-			return (IResource) element;
-		}
-		return (IResource) getAdapter(element, IResource.class, true);
-    }
-
-    /**
-     * Returns the file corresponding to the given model element, or <code>null</code>
-     * if there is no applicable file.
-     * 
-     * @param element the model element, or <code>null</code>
-     * @return the resource corresponding to the model element, or <code>null</code>
-     * @since 3.2
-     */
-    public static IFile getFile(Object element) {
-		if (element == null) {
-			return null;
-		}
-		
-		// try direct instanceof check
-		if (element instanceof IFile) {
-			return (IFile) element;
-		}
-		
-		// try for ResourceMapping
-		ResourceMapping mapping = getResourceMapping(element);
-		if (mapping != null) {
-			return getFileFromResourceMapping(mapping);
-		}
-		
-		// try for IFile adapter (before IResource adapter, since it's more specific)
-		Object adapter = getAdapter(element, IFile.class, true);
-		if (adapter instanceof IFile) {
-			return (IFile) adapter;
-		}
-		
-		// try for IResource adapter
-		adapter = getAdapter(element, IResource.class, true);
-		if (adapter instanceof IFile) {
-			return (IFile) adapter;
-		}
-		return null;
-    }
-
-	/**
-     * Returns the resource mapping corresponding to the given model element, or <code>null</code>
-     * if there is no applicable resource mapping.
-     * 
-     * @param element the model element, or <code>null</code>
-     * @return the resource mapping corresponding to the model element, or <code>null</code>
-     * @since 3.2
-     */
-    public static ResourceMapping getResourceMapping(Object element) {
-		if (element == null) {
-			return null;
-		}
-		
-		// try direct instanceof check
-		if (element instanceof ResourceMapping) {
-			return (ResourceMapping) element;
-		}
-		
-		// try for ResourceMapping adapter
-		Object adapter = getAdapter(element, ResourceMapping.class, true);
-		if (adapter instanceof ResourceMapping) {
-			return (ResourceMapping) adapter;
-		}
-		return null;
-	}
-    
-    /**
-     * Tries to extra a single file from the given resource mapping.
-     * Returns the file if the mapping maps to a single file, or <code>null</code>
-     * if it maps to zero or multiple files.
-     * 
-     * @param mapping the resource mapping
-     * @return the file, or <code>null</code>
-     */
-    private static IFile getFileFromResourceMapping(ResourceMapping mapping) {
-    	IResource resource = getResourceFromResourceMapping(mapping);
-    	if (resource instanceof IFile) {
-    		return (IFile) resource;
-    	}
-    	return null;
-    }
-    
-    /**
-     * Tries to extra a single resource from the given resource mapping.
-     * Returns the resource if the mapping maps to a single resource, or <code>null</code>
-     * if it maps to zero or multiple resources.
-     * 
-     * @param mapping the resource mapping
-     * @return the resource, or <code>null</code>
-     */
-    private static IResource getResourceFromResourceMapping(ResourceMapping mapping) {
-		try {
-			ResourceTraversal[] traversals = mapping.getTraversals(null, null);
-	    	if (traversals.length != 1) {
-	    		return null;
-	    	}
-	    	ResourceTraversal traversal = traversals[0];
-	    	// TODO: need to honour traversal flags
-	    	IResource[] resources = traversal.getResources();
-	    	if (resources.length != 1) {
-	    		return null;
-	    	}
-	    	return resources[0];
-		} catch (CoreException e) {
-			StatusManager.getManager().handle(e, IDEWorkbenchPlugin.IDE_WORKBENCH);
-			return null;
-		}
-	}
-
-
-	/**
-     * Returns the specified adapter for the given element, or <code>null</code>
-     * if no such adapter was found.
-     * 
-     * @param element the model element
-	 * @param adapterType the type of adapter to look up
-	 * @param forceLoad <code>true</code> to force loading of the plug-in providing the adapter, 
-	 *   <code>false</code> otherwise
-     * @return the adapter
-     * @since 3.2
-     */
-	public static Object getAdapter(Object element, Class adapterType, boolean forceLoad) {
-		if (element instanceof IAdaptable) {
-			IAdaptable adaptable = (IAdaptable) element;
-	        Object o = adaptable.getAdapter(adapterType);
-	        if (o != null) {
-	        	return o;
-	        }
-		}
-		if (forceLoad) {
-			return Platform.getAdapterManager().loadAdapter(element, adapterType.getName());
-		}
-		return Platform.getAdapterManager().getAdapter(element, adapterType);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/dialogs/AbstractEncodingFieldEditor.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/dialogs/AbstractEncodingFieldEditor.java
deleted file mode 100644
index 61e9a9e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/dialogs/AbstractEncodingFieldEditor.java
+++ /dev/null
@@ -1,466 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Daniel Megert daniel_megert@ch.ibm.com Bug 169696
- *******************************************************************************/
-package org.eclipse.ui.ide.dialogs;
-
-import java.nio.charset.Charset;
-import java.nio.charset.IllegalCharsetNameException;
-import java.util.List;
-
-import org.eclipse.jface.preference.FieldEditor;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-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.Group;
-import org.eclipse.ui.WorkbenchEncoding;
-import org.eclipse.ui.ide.IDEEncoding;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-
-/**
- * The abstract superclass of field editors used to set an encoding. Any user
- * entered encodings will be added to the list of encodings available via
- * {@link org.eclipse.ui.ide.IDEEncoding}.
- * <p>
- * Subclasses may extend, but must call <code>createEncodingGroup</code>
- * during <code>doFillIntoGrid</code>.
- * </p>
- * 
- * @see org.eclipse.ui.ide.IDEEncoding
- * @since 3.1
- */
-public abstract class AbstractEncodingFieldEditor extends FieldEditor {
-
-	private Composite container;
-
-	private Button defaultEncodingButton;
-
-	private String defaultEnc;
-
-	private Button otherEncodingButton;
-
-	private Combo encodingCombo;
-
-	private boolean isValid = true;
-
-	private String oldSelectedEncoding;
-
-	private String groupTitle = IDEWorkbenchMessages.WorkbenchPreference_encoding;
-
-	/**
-	 * Creates a new encoding field editor with no settings set.
-	 */
-	protected AbstractEncodingFieldEditor() {
-		super();
-	}
-
-	/**
-	 * Creates a new encoding field editor with the given preference name, label
-	 * and parent.
-	 * 
-	 * @param name
-	 *            the name of the preference this field editor works on
-	 * @param labelText
-	 *            the label text of the field editor
-	 * @param parent
-	 *            the parent of the field editor's control
-	 */
-	protected AbstractEncodingFieldEditor(String name, String labelText,
-			Composite parent) {
-		super(name, labelText, parent);
-	}
-
-	/**
-	 * Creates a new encoding field editor with the given preference name, label
-	 * and parent.
-	 * 
-	 * @param name
-	 *            the name of the preference this field editor works on
-	 * @param labelText
-	 *            the label text of the field editor
-	 * @param groupTitle
-	 *            the title for the field editor's control. If groupTitle is 
-	 *            <code>null</code> the control will be unlabelled
-	 *            (by default a {@link Composite} instead of a {@link Group}.
-	 * @param parent
-	 *            the parent of the field editor's control
-	 * @see AbstractEncodingFieldEditor#setGroupTitle(String)
-	 * @since 3.3
-	 */
-	protected AbstractEncodingFieldEditor(String name, String labelText,
-			String groupTitle, Composite parent) {
-		init(name, labelText);
-		this.groupTitle = groupTitle;
-		createControl(parent);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.FieldEditor#adjustForNumColumns(int)
-	 */
-	protected void adjustForNumColumns(int numColumns) {
-		((GridData) getContainer().getLayoutData()).horizontalSpan = numColumns;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.FieldEditor#doFillIntoGrid(org.eclipse.swt.widgets.Composite,
-	 *      int)
-	 */
-	protected void doFillIntoGrid(Composite parent, int numColumns) {
-		container = createEncodingGroup(parent, numColumns);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.FieldEditor#doLoad()
-	 */
-	protected void doLoad() {
-		if (encodingCombo != null) {
-			List encodings = IDEEncoding.getIDEEncodings();
-			String resourcePreference = getStoredValue();
-			populateEncodingsCombo(encodings, resourcePreference);
-			updateEncodingState(resourcePreference == null);
-		}
-	}
-
-	/**
-	 * Returns the value that is currently stored for the encoding.
-	 * 
-	 * @return the currently stored encoding
-	 */
-	protected abstract String getStoredValue();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.FieldEditor#doLoadDefault()
-	 */
-	protected void doLoadDefault() {
-		updateEncodingState(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.FieldEditor#getNumberOfControls()
-	 */
-	public int getNumberOfControls() {
-		return 1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.FieldEditor#isValid()
-	 */
-	public boolean isValid() {
-		return isValid;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.FieldEditor#refreshValidState()
-	 */
-	protected void refreshValidState() {
-		updateValidState();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.FieldEditor#setPreferenceStore(org.eclipse.jface.preference.IPreferenceStore)
-	 */
-	public void setPreferenceStore(IPreferenceStore store) {
-		super.setPreferenceStore(store);
-		defaultEnc = store.getDefaultString(getPreferenceName());
-		updateDefaultEncoding();
-	}
-
-	private void updateDefaultEncoding() {
-		defaultEncodingButton.setText(defaultButtonText());
-	}
-
-	private Composite getContainer() {
-		return container;
-	}
-
-	/**
-	 * Creates a composite with all the encoding controls.
-	 * <p>
-	 * Subclasses may extend.
-	 * </p>
-	 * 
-	 * @param parent
-	 *            the parent widget
-	 * @param numColumns
-	 *            the number of columns in the parent
-	 * @return the group control
-	 */
-	protected Composite createEncodingGroup(Composite parent, int numColumns) {
-
-		Composite topControl;
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-
-		if (groupTitle == null){
-			topControl = new Composite(parent, SWT.NONE);
-			layout.marginWidth = 0;
-			layout.marginHeight = 0;
-		}
-		else {
-			Group top = new Group(parent, SWT.NONE);
-			top.setText(groupTitle);
-			topControl = top;
-		}
-
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		topControl.setLayoutData(data);		
-		topControl.setLayout(layout);
-
-		SelectionAdapter buttonListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateEncodingState(defaultEncodingButton.getSelection());
-				updateValidState();
-			}
-		};
-
-		defaultEncodingButton = new Button(topControl, SWT.RADIO);
-		defaultEnc = findDefaultEncoding();
-		defaultEncodingButton.setText(defaultButtonText());
-		data = new GridData();
-		data.horizontalSpan = 2;
-		defaultEncodingButton.setLayoutData(data);
-		defaultEncodingButton.addSelectionListener(buttonListener);
-
-		otherEncodingButton = new Button(topControl, SWT.RADIO);
-		otherEncodingButton
-				.setText(IDEWorkbenchMessages.WorkbenchPreference_otherEncoding);
-		otherEncodingButton.addSelectionListener(buttonListener);
-
-		encodingCombo = new Combo(topControl, SWT.NONE);
-		data = new GridData();
-		encodingCombo.setLayoutData(data);
-		encodingCombo.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				updateValidState();
-			}
-		});
-		encodingCombo.addKeyListener(new KeyAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
-			 */
-			public void keyReleased(KeyEvent e) {
-				updateValidState();
-			}
-		});
-
-		return topControl;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.FieldEditor#setEnabled(boolean,
-	 *      org.eclipse.swt.widgets.Composite)
-	 * @since 3.3
-	 */
-	public void setEnabled(boolean enabled, Composite parent) {
-		if (container != null)
-			container.setEnabled(enabled);
-		if (defaultEncodingButton != null)
-			defaultEncodingButton.setEnabled(enabled);
-		if (otherEncodingButton != null)
-			otherEncodingButton.setEnabled(enabled);
-		if (encodingCombo != null)
-			encodingCombo.setEnabled(enabled);
-		
-	}
-
-	/**
-	 * Returns the default encoding for the object being shown.
-	 * 
-	 * @return the default encoding for the object being shown
-	 */
-	protected String findDefaultEncoding() {
-		return WorkbenchEncoding.getWorkbenchDefaultEncoding();
-	}
-
-	/**
-	 * Returns the text for the default encoding button.
-	 * 
-	 * @return the text for the default encoding button
-	 */
-	protected String defaultButtonText() {
-		return NLS.bind(
-				IDEWorkbenchMessages.WorkbenchPreference_defaultEncoding,
-				defaultEnc);
-	}
-
-	/**
-	 * Populates the encodings combo. Sets the text based on the selected
-	 * encoding. If there is no selected encoding, the text is set to the
-	 * default encoding.
-	 * 
-	 * @param encodings
-	 *            the list of encodings (list of String)
-	 * @param selectedEncoding
-	 *            the selected encoding, or <code>null</code>
-	 */
-	private void populateEncodingsCombo(List encodings, String selectedEncoding) {
-		String[] encodingStrings = new String[encodings.size()];
-		encodings.toArray(encodingStrings);
-		encodingCombo.setItems(encodingStrings);
-
-		if (selectedEncoding == null) {
-			encodingCombo.setText(getDefaultEnc());
-		} else {
-			encodingCombo.setText(selectedEncoding);
-		}
-	}
-
-	private void updateEncodingState(boolean useDefault) {
-		defaultEncodingButton.setSelection(useDefault);
-		otherEncodingButton.setSelection(!useDefault);
-		if (useDefault) {
-			encodingCombo.setText(getDefaultEnc());
-		}
-		encodingCombo.setEnabled(!useDefault);
-		setPresentsDefaultValue(useDefault);
-		updateValidState();
-	}
-
-	private void updateValidState() {
-		boolean isValidNow = isEncodingValid();
-		if (isValidNow != isValid) {
-			isValid = isValidNow;
-			if (isValid) {
-				clearErrorMessage();
-			} else {
-				showErrorMessage(IDEWorkbenchMessages.WorkbenchPreference_unsupportedEncoding);
-			}
-			fireStateChanged(IS_VALID, !isValid, isValid);
-		}
-		String newValue = getSelectedEncoding();
-		if (isValid && !newValue.equals(oldSelectedEncoding)) {
-			fireValueChanged(VALUE, oldSelectedEncoding, newValue);
-			oldSelectedEncoding = newValue;
-		}
-	}
-
-	/**
-	 * Returns the currently selected encoding.
-	 * 
-	 * @return the currently selected encoding
-	 */
-	protected String getSelectedEncoding() {
-		if (defaultEncodingButton.getSelection()) {
-			return defaultEnc;
-		}
-		return encodingCombo.getText();
-	}
-
-	private boolean isEncodingValid() {
-		return defaultEncodingButton.getSelection()
-				|| isValidEncoding(encodingCombo.getText());
-	}
-
-	/**
-	 * Returns whether or not the given encoding is valid.
-	 * 
-	 * @param enc
-	 *            the encoding to validate
-	 * @return <code>true</code> if the encoding is valid, <code>false</code>
-	 *         otherwise
-	 */
-	private boolean isValidEncoding(String enc) {
-		try {
-			return Charset.isSupported(enc);
-		} catch (IllegalCharsetNameException e) {
-			// This is a valid exception
-			return false;
-		}
-
-	}
-
-	/**
-	 * Returns the default encoding.
-	 * 
-	 * @return the default encoding
-	 */
-	protected String getDefaultEnc() {
-		return defaultEnc;
-	}
-
-	/**
-	 * Returns whether or not the encoding setting changed.
-	 * 
-	 * @param encodingSetting
-	 *            the setting from the page.
-	 * @return boolean <code>true</code> if the resource encoding is the same
-	 *         as before.
-	 */
-	protected boolean hasSameEncoding(String encodingSetting) {
-
-		String current = getStoredValue();
-
-		if (encodingSetting == null) {
-			// Changed if default is selected and there is no setting
-			return current == null || current.length() == 0;
-		}
-		return encodingSetting.equals(current);
-	}
-
-	/**
-	 * Return whether or not the default has been selected.
-	 * 
-	 * @return <code>true</code> if the default button has been selected.
-	 */
-	boolean isDefaultSelected() {
-		return defaultEncodingButton.getSelection();
-	}
-
-	/**
-	 * Set the title of the group to groupTitle. If this is not called a default
-	 * title is used. If groupTitle is <code>null</code> the control will be
-	 * unlabelled (by default a {@link Composite} instead of a {@link Group}.
-	 * 
-	 * <strong>NOTE</strong> this value must be set before
-	 * {@link #createControl(Composite)} is called or it will be ignored.
-	 * 
-	 * @param groupTitle
-	 *            The groupTitle to set.
-     * @since 3.3
-	 */
-	public void setGroupTitle(String groupTitle) {
-		this.groupTitle = groupTitle;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/dialogs/EncodingFieldEditor.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/dialogs/EncodingFieldEditor.java
deleted file mode 100644
index 5808230..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/dialogs/EncodingFieldEditor.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.ide.dialogs;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.ide.IDEEncoding;
-
-/**
- * The EncodingFieldEditor is a field editor that allows the 
- * user to set an encoding on a preference in a preference
- * store.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @since 3.1
- */
-public final class EncodingFieldEditor extends AbstractEncodingFieldEditor {
-
-	
-	/**
-	 * Creates a new encoding field editor with the given preference name, label
-	 * and parent.
-	 * 
-	 * @param name
-	 *            the name of the preference this field editor works on
-	 * @param labelText
-	 *            the label text of the field editor
-	 * @param groupTitle
-	 *            the title for the field editor's control. If groupTitle is 
-	 *            <code>null</code> the control will be unlabelled
-	 *            (by default a {@link Composite} instead of a {@link Group}.
-	 * @param parent
-	 *            the parent of the field editor's control
-	 * @see AbstractEncodingFieldEditor#setGroupTitle(String)
-	 * @since 3.3
-	 */
-	public EncodingFieldEditor(String name, String labelText,
-			String groupTitle, Composite parent) {
-		super(name, labelText, groupTitle, parent);
-	}
-	/**
-	 * Create a new instance of the receiver on the preference called name
-	 * with a label of labelText.
-	 * @param name
-	 * @param labelText
-	 * @param parent
-	 */
-	public EncodingFieldEditor(String name, String labelText, Composite parent) {
-		super(name, labelText, parent);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.ide.dialogs.AbstractEncodingFieldEditor#getStoredValue()
-	 */
-	protected String getStoredValue() {
-		return getPreferenceStore().getString(getPreferenceName());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.FieldEditor#doStore()
-	 */
-	protected void doStore() {
-		String encoding = getSelectedEncoding();
-		
-		if(hasSameEncoding(encoding)) {
-			return;
-		}
-		
-		IDEEncoding.addIDEEncoding(encoding);	
-		
-		if (encoding.equals(getDefaultEnc())) {
-			getPreferenceStore().setToDefault(getPreferenceName());
-		} else {
-			getPreferenceStore().setValue(getPreferenceName(), encoding);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/dialogs/PathVariableSelectionDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/dialogs/PathVariableSelectionDialog.java
deleted file mode 100644
index 5216702..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/dialogs/PathVariableSelectionDialog.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.dialogs;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.filesystem.URIUtil;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-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.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.dialogs.FileFolderSelectionDialog;
-import org.eclipse.ui.internal.ide.dialogs.IDEResourceInfoUtils;
-import org.eclipse.ui.internal.ide.dialogs.PathVariablesGroup;
-
-/**
- * A selection dialog which shows the path variables defined in the 
- * workspace.
- * The <code>getResult</code> method returns the name(s) of the 
- * selected path variable(s).
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * <p>
- * Example:
- * <pre>
- *  PathVariableSelectionDialog dialog =
- *    new PathVariableSelectionDialog(getShell(), IResource.FOLDER);
- *	dialog.open();
- *	String[] result = (String[]) dialog.getResult();
- * </pre> 	
- * </p>
- * 
- * @since 3.1
- */
-public final class PathVariableSelectionDialog extends SelectionDialog {
-    private static final int EXTEND_ID = IDialogConstants.CLIENT_ID + 1;
-
-    private PathVariablesGroup pathVariablesGroup;
-
-    private int variableType;
-
-    /**
-     * Creates a path variable selection dialog.
-     *
-     * @param parentShell the parent shell
-     * @param variableType the type of variables that are displayed in 
-     * 	this dialog. <code>IResource.FILE</code> and/or <code>IResource.FOLDER</code>
-     * 	logically ORed together.
-     */
-    public PathVariableSelectionDialog(Shell parentShell, int variableType) {
-        super(parentShell);
-        setTitle(IDEWorkbenchMessages.PathVariableSelectionDialog_title);
-        this.variableType = variableType;
-        pathVariablesGroup = new PathVariablesGroup(false, variableType,
-                new Listener() {
-                    /* (non-Javadoc)
-                     * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-                     */
-                    public void handleEvent(Event event) {
-                        updateExtendButtonState();
-                    }
-                });
-    }
-
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
-     */
-    protected void buttonPressed(int buttonId) {
-        if (buttonId == EXTEND_ID) {
-            FileFolderSelectionDialog dialog = new FileFolderSelectionDialog(
-                    getShell(), false, variableType);
-            PathVariablesGroup.PathVariableElement selection = pathVariablesGroup
-                    .getSelection()[0];
-            dialog.setTitle(IDEWorkbenchMessages.PathVariableSelectionDialog_ExtensionDialog_title);
-            dialog.setMessage(NLS.bind(IDEWorkbenchMessages.PathVariableSelectionDialog_ExtensionDialog_description, selection.name));
-            //XXX This only works for variables that refer to local file system locations
-            try {
-				dialog.setInput(EFS.getStore(URIUtil.toURI(selection.path)));
-			} catch (CoreException e) {
-				ErrorDialog.openError(getShell(), null, null, e.getStatus());
-			}
-            if (dialog.open() == Window.OK
-                    && pathVariablesGroup.performOk()) {
-                setExtensionResult(selection, (IFileStore) dialog.getResult()[0]);
-                super.okPressed();
-            }
-        } else {
-			super.buttonPressed(buttonId);
-		}
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-     */
-    protected void configureShell(Shell shell) {
-        super.configureShell(shell);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
-                IIDEHelpContextIds.PATH_VARIABLE_SELECTION_DIALOG);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-     */
-    protected void createButtonsForButtonBar(Composite parent) {
-        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-                true);
-        createButton(parent, EXTEND_ID, IDEWorkbenchMessages.PathVariableSelectionDialog_extendButton, false);
-        createButton(parent, IDialogConstants.CANCEL_ID,
-                IDialogConstants.CANCEL_LABEL, false);
-        updateExtendButtonState();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-     */
-    protected Control createDialogArea(Composite parent) {
-        // create composite 
-        Composite dialogArea = (Composite) super.createDialogArea(parent);
-
-        pathVariablesGroup.createContents(dialogArea);
-        return dialogArea;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.window.Window#close()
-     */
-    public boolean close() {
-        pathVariablesGroup.dispose();
-        return super.close();
-    }
-
-  
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-     */
-    protected void okPressed() {
-		//Sets the dialog result to the selected path variable name(s). 
-        if (pathVariablesGroup.performOk()) {
-            PathVariablesGroup.PathVariableElement[] selection = pathVariablesGroup
-                    .getSelection();
-            String[] variableNames = new String[selection.length];
-
-            for (int i = 0; i < selection.length; i++) {
-				variableNames[i] = selection[i].name;
-			}
-            setSelectionResult(variableNames);
-        } else {
-            setSelectionResult(null);
-        }
-        super.okPressed();
-    }
-
-    /**
-     * Sets the dialog result to the concatenated variable name and extension.
-     * 
-     * @param variable variable selected in the variables list and extended
-     * 	by <code>extensionFile</code>
-     * @param extensionFile file selected to extend the variable.
-     */
-    private void setExtensionResult(
-            PathVariablesGroup.PathVariableElement variable, IFileStore extensionFile) {
-        IPath extensionPath = new Path(extensionFile.toString());
-        int matchCount = extensionPath.matchingFirstSegments(variable.path);
-        IPath resultPath = new Path(variable.name);
-
-        extensionPath = extensionPath.removeFirstSegments(matchCount);
-        resultPath = resultPath.append(extensionPath);
-        setSelectionResult(new String[] { resultPath.toOSString() });
-    }
-
-    /**
-     * Updates the enabled state of the Extend button based on the 
-     * current variable selection.
-     */
-    private void updateExtendButtonState() {
-        PathVariablesGroup.PathVariableElement[] selection = pathVariablesGroup
-                .getSelection();
-        Button extendButton = getButton(EXTEND_ID);
-
-        if (extendButton == null) {
-			return;
-		}
-        if (selection.length == 1) {
-            IFileInfo info = IDEResourceInfoUtils.getFileInfo(selection[0].path);
-            if (info.exists() && info.isDirectory()) {
-				extendButton.setEnabled(true);
-			} else {
-				extendButton.setEnabled(false);
-			}
-                
-        } else {
-			extendButton.setEnabled(false);
-		}
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/dialogs/ResourceEncodingFieldEditor.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/dialogs/ResourceEncodingFieldEditor.java
deleted file mode 100644
index 82d5d3a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/dialogs/ResourceEncodingFieldEditor.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.ide.dialogs;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.runtime.Assert;
-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.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.DialogPage;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.osgi.util.NLS;
-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.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.WorkbenchEncoding;
-import org.eclipse.ui.ide.IDEEncoding;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * The ResourceEncodingFieldEditor is a field editor for editing the encoding of
- * a resource and does not use a preference store.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @since 3.1
- */
-public final class ResourceEncodingFieldEditor extends
-		AbstractEncodingFieldEditor {
-
-	/**
-	 * The resource being edited.
-	 */
-	private IResource resource;
-
-	private Composite group;
-
-	/**
-	 * Creates a new encoding field editor for setting the encoding on the given
-	 * resource.
-	 * 
-	 * @param labelText
-	 *            the label text of the field editor
-	 * @param parent
-	 *            the parent of the field editor's control
-	 * @param charsetResource
-	 *            must be an <code>IContainer</code> or an <code>IFile</code>.
-	 * 
-	 * @see org.eclipse.core.resources.IContainer#getDefaultCharset()
-	 * @see org.eclipse.core.resources.IFile#getCharset()
-	 */
-	public ResourceEncodingFieldEditor(String labelText, Composite parent,
-			IResource charsetResource) {
-		super();
-		setLabelAndResource(labelText, charsetResource);
-		createControl(parent);
-	}
-	
-	/**
-	 * Creates a new encoding field editor for setting the encoding on the given
-	 * resource.
-	 * 
-	 * @param labelText
-	 *            the label text of the field editor
-	 * @param parent
-	 *            the parent of the field editor's control
-	 * @param charsetResource
-	 *            must be an <code>IContainer</code> or an <code>IFile</code>.
-	 *  @param groupTitle
-	 *  		  the title for the field editor's control. If groupTitle is 
-	 *            <code>null</code> the control will be unlabelled
-	 *            (by default a {@link Composite} instead of a {@link Group}.
-	 * 
-	 * @see org.eclipse.core.resources.IContainer#getDefaultCharset()
-	 * @see org.eclipse.core.resources.IFile#getCharset()
-	 * @see AbstractEncodingFieldEditor#setGroupTitle(String)
-	 * @since 3.3
-	 */
-	public ResourceEncodingFieldEditor(String labelText, Composite parent,
-			IResource charsetResource,String groupTitle) {
-		super();
-		setLabelAndResource(labelText, charsetResource);
-		setGroupTitle(groupTitle);
-		createControl(parent);
-	}
-
-	/**
-     * Set the label text and the resource we are editing.
-	 * @param labelText
-	 * @param charsetResource
-     * @since 3.3
-	 */
-	private void setLabelAndResource(String labelText, IResource charsetResource) {
-		Assert.isTrue(charsetResource instanceof IContainer
-				|| charsetResource instanceof IFile);
-		setLabelText(labelText);
-		this.resource = charsetResource;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.dialogs.AbstractEncodingFieldEditor#getStoredValue()
-	 */
-	protected String getStoredValue() {
-		try {
-			if (resource instanceof IContainer) {
-				return ((IContainer) resource).getDefaultCharset(false);
-			}
-			return ((IFile) resource).getCharset(false);
-
-		} catch (CoreException e) {// If there is an error return the default
-			IDEWorkbenchPlugin
-					.log(
-							IDEWorkbenchMessages.ResourceEncodingFieldEditor_ErrorLoadingMessage,
-							e.getStatus());
-			return WorkbenchEncoding.getWorkbenchDefaultEncoding();
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.FieldEditor#doStore()
-	 */
-	protected void doStore() {
-
-		String encoding = getSelectedEncoding();
-
-		// Clear the value if nothing is selected
-		if (isDefaultSelected()) {
-			encoding = null;
-		}
-		// Don't update if the same thing is selected
-		if (hasSameEncoding(encoding)) {
-			return;
-		}
-
-		String descriptionCharset = getCharsetFromDescription();
-		if (descriptionCharset != null
-				&& !(descriptionCharset.equals(encoding)) && encoding != null) {
-			Shell shell = null;
-			DialogPage page = getPage();
-			if (page != null) {
-				shell = page.getShell();
-			}
-
-			MessageDialog dialog = new MessageDialog(
-					shell,
-					IDEWorkbenchMessages.ResourceEncodingFieldEditor_EncodingConflictTitle,
-					null,
-					NLS
-							.bind(
-									IDEWorkbenchMessages.ResourceEncodingFieldEditor_EncodingConflictMessage,
-									encoding, descriptionCharset),
-					MessageDialog.WARNING, new String[] {
-							IDialogConstants.YES_LABEL,
-							IDialogConstants.NO_LABEL }, 0); // yes is the
-			// default
-			if (dialog.open() > 0) {
-				return;
-			}
-		}
-
-		IDEEncoding.addIDEEncoding(encoding);
-
-		final String finalEncoding = encoding;
-
-		Job charsetJob = new Job(IDEWorkbenchMessages.IDEEncoding_EncodingJob) {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-			 */
-			protected IStatus run(IProgressMonitor monitor) {
-				try {
-					if (resource instanceof IContainer) {
-						((IContainer) resource).setDefaultCharset(
-								finalEncoding, monitor);
-					} else {
-						((IFile) resource).setCharset(finalEncoding, monitor);
-					}
-					return Status.OK_STATUS;
-				} catch (CoreException e) {// If there is an error return the
-					// default
-					IDEWorkbenchPlugin
-							.log(
-									IDEWorkbenchMessages.ResourceEncodingFieldEditor_ErrorStoringMessage,
-									e.getStatus());
-					return e.getStatus();
-				}
-			}
-		};
-
-		charsetJob.schedule();
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.FieldEditor#store()
-	 */
-	public void store() {// Override the store method as we are not using a
-		// preference store
-		doStore();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.FieldEditor#load()
-	 */
-	public void load() {// Override the load method as we are not using a
-		// preference store
-		setPresentsDefaultValue(false);
-		doLoad();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.FieldEditor#loadDefault()
-	 */
-	public void loadDefault() {
-		setPresentsDefaultValue(true);
-		doLoadDefault();
-		refreshValidState();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.dialogs.AbstractEncodingFieldEditor#findDefaultEncoding()
-	 */
-	protected String findDefaultEncoding() {
-
-		if (resource instanceof IWorkspaceRoot) {
-			return super.findDefaultEncoding();
-		}
-
-		String defaultCharset = getCharsetFromDescription();
-		defaultCharset = getCharsetFromDescription();
-
-		if (defaultCharset != null && defaultCharset.length() > 0) {
-			return defaultCharset;
-		}
-		try {
-			// Query up the whole hierarchy
-			defaultCharset = resource.getParent().getDefaultCharset(true);
-		} catch (CoreException exception) {
-			// If there is an exception try again
-		}
-
-		if (defaultCharset != null && defaultCharset.length() > 0) {
-			return defaultCharset;
-		}
-
-		return super.findDefaultEncoding();
-	}
-
-	/**
-	 * Returns the charset from the content description if there is one.
-	 * 
-	 * @return the charset from the content description, or <code>null</code>
-	 */
-	private String getCharsetFromDescription() {
-		IContentDescription description = getContentDescription();
-		if (description != null) {
-			return description.getCharset();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.dialogs.AbstractEncodingFieldEditor#defaultButtonText()
-	 */
-	protected String defaultButtonText() {
-
-		if (resource instanceof IWorkspaceRoot) {
-			return super.defaultButtonText();
-		}
-
-		if (resource instanceof IFile) {
-			try {
-				IContentDescription description = ((IFile) resource)
-						.getContentDescription();
-				// If we can find a charset from the description then derive
-				// from that
-				if (description == null || description.getCharset() == null) {
-					return NLS
-							.bind(
-									IDEWorkbenchMessages.ResourceInfo_fileContainerEncodingFormat,
-									getDefaultEnc());
-				}
-
-				return NLS
-						.bind(
-								IDEWorkbenchMessages.ResourceInfo_fileContentEncodingFormat,
-								getDefaultEnc());
-
-			} catch (CoreException exception) {
-				// Do nothing here as we will just try to derive from the
-				// container
-			}
-		}
-
-		return NLS.bind(
-				IDEWorkbenchMessages.ResourceInfo_containerEncodingFormat,
-				getDefaultEnc());
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.dialogs.AbstractEncodingFieldEditor#createEncodingGroup(org.eclipse.swt.widgets.Composite,
-	 *      int)
-	 */
-	protected Composite createEncodingGroup(Composite parent, int numColumns) {
-		group = super.createEncodingGroup(parent, numColumns);
-		String byteOrderLabel = IDEEncoding
-				.getByteOrderMarkLabel(getContentDescription());
-		if (byteOrderLabel != null) {
-			Label label = new Label(group, SWT.NONE);
-			label
-					.setText(NLS
-							.bind(
-									IDEWorkbenchMessages.WorkbenchPreference_encoding_encodingMessage,
-									byteOrderLabel));
-			GridData layoutData = new GridData();
-			layoutData.horizontalSpan = numColumns + 1;
-			label.setLayoutData(layoutData);
-
-		}
-		return group;
-	}
-
-	/**
-	 * Returns the content description of the resource if it is a file and it
-	 * has a content description.
-	 * 
-	 * @return the content description or <code>null</code> if resource is not
-	 *         an <code>IFile</code> or it does not have a description
-	 */
-	private IContentDescription getContentDescription() {
-		try {
-			if (resource instanceof IFile) {
-				return (((IFile) resource).getContentDescription());
-			}
-		} catch (CoreException exception) {
-			// If we cannot find it return null
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.FieldEditor#setEnabled(boolean, org.eclipse.swt.widgets.Composite)
-	 */
-	public void setEnabled(boolean enabled, Composite parent) {
-		super.setEnabled(enabled, parent);
-		group.setEnabled(enabled);
-		Control[] children = group.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			children[i].setEnabled(enabled);
-
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/dialogs/package.html b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/dialogs/package.html
deleted file mode 100644
index 123a77a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/dialogs/package.html
+++ /dev/null
@@ -1,19 +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="Microsoft FrontPage 4.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<title>Package-level Javadoc</title>
-</head>
-
-<body>
-APIs for dialogs in the IDE-specific portion of the Eclipse Platform User Interface. 
-<h2>Package Specification</h2>
-This package containsthe dialog APIs for the Eclipse Platform User Interface that 
-are IDE specific. 
-</body>
-
-</html>
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/fileSystem/FileSystemContributor.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/fileSystem/FileSystemContributor.java
deleted file mode 100644
index 9c4a907..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/fileSystem/FileSystemContributor.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.ide.fileSystem;
-
-import java.net.URI;
-
-import org.eclipse.core.filesystem.URIUtil;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * The abstract base class for all UI file system contributors. This class
- * provides the infrastructure for defining a contributor and fulfills the contract
- * specified by the <code>org.eclipse.ui.ide.filesystemSupport</code> 
- * extension point.
- * 
- * @since 3.2
- * @see org.eclipse.core.filesystem.IFileSystem
- */
-public abstract class FileSystemContributor {
-	
-	/**
-	 * Browse the file system for a URI to display to the user.
-	 * @param initialPath The path to initialize the selection with.
-	 * @param shell The shell to parent any required dialogs from
-	 * @return URI if the file system is browsed successfully or
-	 * <code>null</code> if a URI could not be determined.
-	 */
-	public abstract URI browseFileSystem(String initialPath, Shell shell);
-	
-	/**
-	 * Return a URI for the supplied String from the user.
-	 * @param string
-	 * @return URI or <code>null</code> if the string is 
-	 * invalid.
-	 */
-	public URI getURI(String string){
-		return URIUtil.toURI(string);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/fileSystem/package.html b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/fileSystem/package.html
deleted file mode 100644
index 8aa3dec..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/fileSystem/package.html
+++ /dev/null
@@ -1,18 +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">
-<title>Package-level Javadoc</title>
-</head>
-
-<body>
-APIs for the IDE-specific support for the 
-org.eclipse.core.filesystem.fileSystem extension.
-<h2>Package Specification</h2>
-This package contains APIs for the Eclipse Platform User Interface that
-support for the org.eclipse.core.filesystem.fileSystem extension
-
-</body>
-
-</html>
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/package.html b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/package.html
deleted file mode 100644
index f359702..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/package.html
+++ /dev/null
@@ -1,19 +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">
-<title>Package-level Javadoc</title>
-</head>
-
-<body>
-
-APIs for the IDE-specific portion of the Eclipse Platform User Interface.
-<h2>Package Specification</h2>
-This package contains APIs for the Eclipse Platform User Interface that are IDE
-specific.
-
-</body>
-
-</html>
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/AbstractCopyOrMoveResourcesOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/AbstractCopyOrMoveResourcesOperation.java
deleted file mode 100644
index 75806e6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/AbstractCopyOrMoveResourcesOperation.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.internal.ide.undo.UndoMessages;
-
-/**
- * An AbstractCopyOrMoveResourcesOperation represents an undoable operation for
- * moving or copying one or more resources in the workspace. Clients may call
- * the public API from a background thread.
- * 
- * This class is not intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-abstract class AbstractCopyOrMoveResourcesOperation extends
-		AbstractResourcesOperation {
-
-	// Used when there are different destination names for each resource
-	protected IPath[] destinationPaths = null;
-
-	// Used when all resources are going to the same container (no name changes)
-	protected IPath destination = null;
-
-	/**
-	 * Create an AbstractCopyOrMoveResourcesOperation that moves or copies all
-	 * of the specified resources to the specified paths. The destination paths
-	 * must include the names of the resources at their new location.
-	 * 
-	 * @param resources
-	 *            the resources to be moved or copied.  May not contain null
-	 *            resources, or resources that are descendants of already 
-	 *            included resources.
-	 * @param destinationPaths
-	 *            the destination paths for the resources, including the name to
-	 *            be assigned to the resource at its new location.  May not contain
-	 *            null paths, and must be the same length as the resources array.
-	 * @param label
-	 *            the label of the operation
-	 *            
-	 */
-	AbstractCopyOrMoveResourcesOperation(IResource[] resources,
-			IPath[] destinationPaths, String label) {
-		super(resources, label);
-		// Check for null arguments
-		if (this.resources == null || destinationPaths == null)
-			throw new IllegalArgumentException("The resource and destination paths may not be null"); //$NON-NLS-1$
-		// Special case to flag descendants.  Note this would fail on the next check
-		// anyway, so we are first giving a more specific explanation.
-		// See bug #176764
-		if (this.resources.length != resources.length)
-			throw new IllegalArgumentException("The resource list contained descendants that cannot be moved to separate destination paths"); //$NON-NLS-1$
-		// Check for destination paths corresponding for each resource
-		if (this.resources.length != destinationPaths.length) {
-			throw new IllegalArgumentException("The resource and destination paths must be the same length"); //$NON-NLS-1$
-		}
-		for (int i=0; i<this.resources.length; i++) {
-			if (this.resources[i] == null) {
-				throw new IllegalArgumentException("The resources array may not contain null resources"); //$NON-NLS-1$
-			}
-			if (destinationPaths[i] == null) {
-				throw new IllegalArgumentException("The destination paths array may not contain null paths"); //$NON-NLS-1$
-			}
-		}
-		this.destinationPaths = destinationPaths;
-	}
-
-	/**
-	 * Create an AbstractCopyOrMoveResourcesOperation that moves or copies all
-	 * of the specified resources to the same target location, using their
-	 * existing names.
-	 * 
-	 * @param resources
-	 *            the resources to be moved or copied
-	 * @param destinationPath
-	 *            the destination path for the resources, not including the name
-	 *            of the new resource.
-	 * @param label
-	 *            the label of the operation
-	 */
-	AbstractCopyOrMoveResourcesOperation(IResource[] resources,
-			IPath destinationPath, String label) {
-		super(resources, label);
-		destination = destinationPath;
-	}
-
-	/**
-	 * Create an AbstractCopyOrMoveResourcesOperation whose destination is not
-	 * yet specified.
-	 * 
-	 * @param resources
-	 *            the resources to be modified
-	 * @param label
-	 *            the label of the operation
-	 */
-	AbstractCopyOrMoveResourcesOperation(IResource[] resources, String label) {
-		super(resources, label);
-	}
-
-
-	/**
-	 * Compute the status for moving or copying the resources. A status severity
-	 * of <code>OK</code> indicates that the copy or move is likely to be
-	 * successful. A status severity of <code>ERROR</code> indicates that the
-	 * operation is no longer valid. Other status severities are open to
-	 * interpretation by the caller.
-	 * 
-	 * Note this method may be called on initial moving or copying of a
-	 * resource, or when a move or copy is undone or redone. Therefore, this
-	 * method should check conditions that can change over the life of the
-	 * operation, such as whether the file to moved or copied exists, and
-	 * whether the target location is still valid. One-time static checks should
-	 * typically be done by the caller so that the user is not continually
-	 * prompted or warned about conditions that were acceptable at the time of
-	 * original execution and do not change over time.
-	 * 
-	 * @return the status indicating the projected outcome of moving or copying
-	 *         the resources.
-	 */
-	protected IStatus computeMoveOrCopyStatus() {
-		// Check for error conditions first so that we do not prompt the user
-		// on warnings that eventually will not matter anyway.
-		if (resources == null) {
-			markInvalid();
-			return getErrorStatus(UndoMessages.AbstractResourcesOperation_NotEnoughInfo);
-		}
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
-			// Does the resource still exist?
-			if (!resource.exists()) {
-				markInvalid();
-				return getErrorStatus(UndoMessages.AbstractCopyOrMoveResourcesOperation_ResourceDoesNotExist);
-			}
-
-			// Are we really trying to move it to a different name?
-			if (!isDestinationPathValid(resource, i)) {
-				markInvalid();
-				return getErrorStatus(UndoMessages.AbstractCopyOrMoveResourcesOperation_SameNameOrLocation);
-			}
-			// Is the proposed name valid?
-			IStatus status = getWorkspace().validateName(
-					getProposedName(resource, i), resource.getType());
-			if (status.getSeverity() == IStatus.ERROR) {
-				markInvalid();
-			}
-			if (!status.isOK()) {
-				return status;
-			}
-		}
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Return the destination path that should be used to move or copy the
-	 * specified resource. This path is relative to the workspace.
-	 * 
-	 * @param resource
-	 *            the resource being moved or copied
-	 * @param index
-	 *            the integer index of the resource in the resource array
-	 * @return the path specifying the destination for the resource
-	 */
-	protected IPath getDestinationPath(IResource resource, int index) {
-		if (destinationPaths != null) {
-			return destinationPaths[index];
-		}
-		return destination.append(resource.getName());
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#appendDescriptiveText(java.lang.StringBuffer)
-	 */
-	protected void appendDescriptiveText(StringBuffer text) {
-		super.appendDescriptiveText(text);
-		text.append(" destination: "); //$NON-NLS-1$
-		text.append(destination);
-		text.append(", destinationPaths: "); //$NON-NLS-1$
-		text.append(destinationPaths);
-		text.append('\'');
-	}
-
-	/**
-	 * Return a boolean indicating whether the proposed destination path for a
-	 * resource is valid.
-	 * 
-	 * @param resource
-	 *            the resource whose path is to be checked
-	 * @param index
-	 *            the integer index of the resource in the resource array
-	 * @return a boolean indicating whether the destination path is valid
-	 */
-	protected boolean isDestinationPathValid(IResource resource, int index) {
-		return !resource.getFullPath().equals(
-				getDestinationPath(resource, index));
-	}
-
-	/**
-	 * Return a string indicating the proposed name for the resource
-	 * 
-	 * @param resource
-	 *            the resource whose path is to be checked
-	 * @param index
-	 *            the integer index of the resource in the resource array
-	 * @return the string name of the resource
-	 */
-	protected String getProposedName(IResource resource, int index) {
-		return getDestinationPath(resource, index).lastSegment();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map execution to move status.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#computeExecutionStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeExecutionStatus(IProgressMonitor monitor) {
-		IStatus status = super.computeExecutionStatus(monitor);
-		if (status.isOK()) {
-			status = computeMoveOrCopyStatus();
-		}
-		return status;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map redo to move status.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#computeRedoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeRedoableStatus(IProgressMonitor monitor) {
-		IStatus status = super.computeRedoableStatus(monitor);
-		if (status.isOK()) {
-			status = computeMoveOrCopyStatus();
-		}
-		return status;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/AbstractCreateResourcesOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/AbstractCreateResourcesOperation.java
deleted file mode 100644
index 0743279..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/AbstractCreateResourcesOperation.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-
-/**
- * A CreateResourcesOperation represents an undoable operation for creating
- * resources in the workspace. Clients may call the public API from a background
- * thread.
- * 
- * This class is not intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-abstract class AbstractCreateResourcesOperation extends
-		AbstractResourcesOperation {
-
-	/**
-	 * Create an AbstractCreateResourcesOperation.
-	 * 
-	 * @param resourceDescriptions
-	 *            the resourceDescriptions describing resources to be created
-	 * @param label
-	 *            the label of the operation
-	 */
-	AbstractCreateResourcesOperation(
-			ResourceDescription[] resourceDescriptions, String label) {
-		super(resourceDescriptions, label);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation creates resources from the known resource
-	 * descriptions.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doExecute(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doExecute(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException {
-		recreate(monitor, uiInfo);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation deletes resources.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doUndo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doUndo(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException {
-		delete(monitor, uiInfo, false); // never delete content
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation documents the impending create or delete.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#updateResourceChangeDescriptionFactory(org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory,
-	 *      int)
-	 */
-	protected boolean updateResourceChangeDescriptionFactory(
-			IResourceChangeDescriptionFactory factory, int operation) {
-		boolean modified = false;
-		if (operation == UNDO) {
-			for (int i = 0; i < resources.length; i++) {
-				IResource resource = resources[i];
-				factory.delete(resource);
-				modified = true;
-			}
-		} else {
-			for (int i = 0; i < resourceDescriptions.length; i++) {
-				if (resourceDescriptions[i] != null) {
-					IResource resource = resourceDescriptions[i]
-							.createResourceHandle();
-					factory.create(resource);
-					modified = true;
-				}
-			}
-		}
-		return modified;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#getExecuteSchedulingRule()
-	 */
-	protected ISchedulingRule getExecuteSchedulingRule() {
-		return super.computeCreateSchedulingRule();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#getUndoSchedulingRule()
-	 */
-	protected ISchedulingRule getUndoSchedulingRule() {
-		return super.computeDeleteSchedulingRule();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation computes the status for creating resources.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#computeExecutionStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeExecutionStatus(IProgressMonitor monitor) {
-		IStatus status = super.computeExecutionStatus(monitor);
-		if (status.isOK()) {
-			status = computeCreateStatus(true);
-		}
-		return status;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation computes the status for deleting resources.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#computeUndoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeUndoableStatus(IProgressMonitor monitor) {
-		IStatus status = super.computeUndoableStatus(monitor);
-		if (status.isOK()) {
-			status = computeDeleteStatus();
-		}
-		return status;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation computes the status for creating resources.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#computeRedoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeRedoableStatus(IProgressMonitor monitor) {
-		IStatus status = super.computeRedoableStatus(monitor);
-		if (status.isOK()) {
-			status = computeCreateStatus(true);
-		}
-		return status;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/AbstractMarkersOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/AbstractMarkersOperation.java
deleted file mode 100644
index 6f74d45..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/AbstractMarkersOperation.java
+++ /dev/null
@@ -1,468 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-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.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.MultiRule;
-import org.eclipse.ui.internal.ide.undo.MarkerDescription;
-import org.eclipse.ui.internal.ide.undo.UndoMessages;
-
-/**
- * An AbstractMarkersOperation represents an undoable operation that affects
- * markers on a resource. It provides implementations for marker creation,
- * deletion, and updating. Clients may call the public API from a background
- * thread.
- * 
- * This class is not intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-abstract class AbstractMarkersOperation extends AbstractWorkspaceOperation {
-
-	MarkerDescription[] markerDescriptions;
-
-	IMarker[] markers;
-
-	Map[] attributes;
-
-	/**
-	 * Create an AbstractMarkersOperation by specifying a combination of markers
-	 * and attributes or marker descriptions.
-	 * 
-	 * @param markers
-	 *            the markers used in the operation or <code>null</code> if no
-	 *            markers yet exist
-	 * @param markerDescriptions
-	 *            the marker descriptions that should be used to create markers,
-	 *            or <code>null</code> if the markers already exist
-	 * @param attributes
-	 *            The map of attributes that should be assigned to any existing
-	 *            markers when the markers are updated. Ignored if the markers
-	 *            parameter is <code>null</code>.
-	 * @param name
-	 *            the name used to describe the operation
-	 */
-	AbstractMarkersOperation(IMarker[] markers,
-			MarkerDescription[] markerDescriptions, Map attributes, String name) {
-		super(name);
-		this.markers = markers;
-		this.attributes = null;
-		// If there is more than one marker, create an array with a copy
-		// of the attributes map for each marker. Keeping a unique map
-		// per marker allows us to support the scenario where attributes
-		// are merged when updated. In this case, each marker's attributes
-		// may differ since their original attributes may have differed.
-		if (attributes != null && markers != null) {
-			if (markers.length > 1) {
-				this.attributes = new Map[markers.length];
-				for (int i = 0; i < markers.length; i++) {
-					Map copiedAttributes = new HashMap();
-					copiedAttributes.putAll(attributes);
-					this.attributes[i] = copiedAttributes;
-				}
-			} else {
-				this.attributes = new Map[] { attributes };
-			}
-		}
-		setMarkerDescriptions(markerDescriptions);
-	}
-
-	/**
-	 * Delete any currently known markers and save their information in marker
-	 * descriptions so that they can be restored.
-	 * 
-	 * @param work
-	 *            the number of work ticks to be used by the delete
-	 * @param monitor
-	 *            the progress monitor to use for the delete
-	 * @throws CoreException
-	 *             propagates any CoreExceptions thrown from the resources API
-	 * 
-	 */
-	protected void deleteMarkers(int work, IProgressMonitor monitor)
-			throws CoreException {
-		if (markers == null || markers.length == 0) {
-			monitor.worked(work);
-			return;
-		}
-		int markerWork = work / markers.length;
-		markerDescriptions = new MarkerDescription[markers.length];
-		for (int i = 0; i < markers.length; i++) {
-			markerDescriptions[i] = new MarkerDescription(markers[i]);
-			markers[i].delete();
-			monitor.worked(markerWork);
-		}
-		markers = new IMarker[0];
-	}
-
-	/**
-	 * Create markers from any currently known marker descriptions.
-	 * 
-	 * @param work
-	 *            the number of work ticks to be used by the create
-	 * @param monitor
-	 *            the progress monitor to use for the create
-	 * @throws CoreException
-	 *             propagates any CoreExceptions thrown from the resources API
-	 */
-	protected void createMarkers(int work, IProgressMonitor monitor)
-			throws CoreException {
-		if (markerDescriptions == null || markerDescriptions.length == 0) {
-			monitor.worked(work);
-			return;
-		}
-		int markerWork = work / markerDescriptions.length;
-		markers = new IMarker[markerDescriptions.length];
-
-		// Recreate the markers from the descriptions
-		for (int i = 0; i < markerDescriptions.length; i++) {
-			markers[i] = markerDescriptions[i].createMarker();
-			monitor.worked(markerWork);
-		}
-	}
-
-	/**
-	 * Update the currently known markers with the corresponding array of marker
-	 * descriptions.
-	 * 
-	 * @param work
-	 *            the number of work ticks to be used by the update
-	 * @param monitor
-	 *            the progress monitor to use for the update
-	 * @param mergeAttributes
-	 *            a boolean specifying whether the attributes are merged or
-	 *            considered to be a replacement of the previous attributes.
-	 * @throws CoreException
-	 *             propagates any CoreExceptions thrown from the resources API
-	 * 
-	 */
-	protected void updateMarkers(int work, IProgressMonitor monitor,
-			boolean mergeAttributes) throws CoreException {
-		if (attributes == null || markers == null
-				|| attributes.length != markers.length || markers.length == 0) {
-			monitor.worked(work);
-			return;
-		}
-		int markerWork = work / markers.length;
-		for (int i = 0; i < markers.length; i++) {
-			if (mergeAttributes) {
-				Map oldAttributes = markers[i].getAttributes();
-				int increment = markerWork / attributes[i].size();
-				Map replacedAttributes = new HashMap();
-
-				for (Iterator iter = attributes[i].keySet().iterator(); iter
-						.hasNext();) {
-					String key = (String) iter.next();
-					Object val = attributes[i].get(key);
-					markers[i].setAttribute(key, val);
-					replacedAttributes.put(key, oldAttributes.get(key));
-					monitor.worked(increment);
-				}
-				attributes[i] = replacedAttributes;
-			} else {
-				// replace all of the attributes
-				Map oldAttributes = markers[i].getAttributes();
-				markers[i].setAttributes(attributes[i]);
-				attributes[i] = oldAttributes;
-			}
-		}
-	}
-
-	/**
-	 * Set the marker descriptions that describe markers that can be created.
-	 * 
-	 * @param descriptions
-	 *            the descriptions of markers that can be created.
-	 */
-	protected void setMarkerDescriptions(MarkerDescription[] descriptions) {
-		markerDescriptions = descriptions;
-		addUndoContexts();
-		updateTargetResources();
-	}
-
-	/*
-	 * Update the target resources by traversing the currently known markers or
-	 * marker descriptions and getting their resources.
-	 */
-
-	private void updateTargetResources() {
-		IResource[] resources = null;
-		if (markers == null) {
-			if (markerDescriptions != null) {
-				resources = new IResource[markerDescriptions.length];
-				for (int i = 0; i < markerDescriptions.length; i++) {
-					resources[i] = markerDescriptions[i].getResource();
-				}
-			}
-		} else {
-			resources = new IResource[markers.length];
-			for (int i = 0; i < markers.length; i++) {
-				resources[i] = markers[i].getResource();
-			}
-		}
-		setTargetResources(resources);
-	}
-
-	/*
-	 * Add undo contexts according to marker types. Any unknown marker types
-	 * will cause the workspace undo context to be added.
-	 * 
-	 * This is an optimization that allows us to add specific undo contexts for
-	 * tasks and bookmarks, without also adding the workspace undo context. Note
-	 * that clients with different marker types may still assign their own
-	 * specific undo context using AbstractOperation.addContext(IUndoContext) in
-	 * addition to the workspace context assigned by this method.
-	 */
-
-	private void addUndoContexts() {
-		String[] types = null;
-		if (markers == null) {
-			if (markerDescriptions != null) {
-				types = new String[markerDescriptions.length];
-				for (int i = 0; i < markerDescriptions.length; i++) {
-					types[i] = markerDescriptions[i].getType();
-				}
-			}
-		} else {
-			types = new String[markers.length];
-			for (int i = 0; i < markers.length; i++) {
-				try {
-					types[i] = markers[i].getType();
-				} catch (CoreException e) {
-				}
-
-			}
-		}
-		if (types != null) {
-			for (int i = 0; i < types.length; i++) {
-				// Marker type could be null if marker did not exist.
-				// This shouldn't happen, but can.
-				// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=158129
-				if (types[i] != null) {
-					if (types[i].equals(IMarker.BOOKMARK)) {
-						addContext(WorkspaceUndoUtil.getBookmarksUndoContext());
-					} else if (types[i].equals(IMarker.TASK)) {
-						addContext(WorkspaceUndoUtil.getTasksUndoContext());
-					} else if (types[i] != null) {
-						// type is not known, use the workspace undo context
-						addContext(WorkspaceUndoUtil.getWorkspaceUndoContext());
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Return the array of markers that has been updated or created.
-	 * 
-	 * @return the array of markers that have been updated or created, or
-	 *         <code>null</code> if no markers have been created or updated.
-	 */
-	public IMarker[] getMarkers() {
-		return markers;
-	}
-
-	/**
-	 * Return whether the markers known by this operation currently exist.
-	 * 
-	 * @return <code>true</code> if there are existing markers and
-	 *         <code>false</code> if there are no known markers or any one of
-	 *         them does not exist
-	 */
-	protected boolean markersExist() {
-		if (markers == null || markers.length == 0) {
-			return false;
-		}
-		for (int i = 0; i < markers.length; i++) {
-			if (!markers[i].exists()) {
-				return false;
-			}
-		}
-		return true;
-
-	}
-
-	/**
-	 * Return a status indicating the projected outcome of undoing the marker
-	 * operation. The receiver is not responsible for remembering the result of
-	 * this computation.
-	 * 
-	 * @return the status indicating whether the operation can be undone
-	 */
-	protected abstract IStatus getBasicUndoStatus();
-
-	/**
-	 * Return a status indicating the projected outcome of redoing the marker
-	 * operation. The receiver is not responsible for remembering the result of
-	 * this computation.
-	 * 
-	 * @return the status indicating whether the operation can be undone
-	 */
-	protected abstract IStatus getBasicRedoStatus();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#computeExecutionStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeExecutionStatus(IProgressMonitor monitor) {
-		IStatus status = getBasicRedoStatus();
-		if (status.isOK()) {
-			return super.computeExecutionStatus(monitor);
-		}
-		if (status.getSeverity() == IStatus.ERROR) {
-			markInvalid();
-		}
-		return status;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#computeUndoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeUndoableStatus(IProgressMonitor monitor) {
-		IStatus status = getBasicUndoStatus();
-		if (status.isOK()) {
-			return super.computeUndoableStatus(monitor);
-		}
-		if (status.getSeverity() == IStatus.ERROR) {
-			markInvalid();
-		}
-		return status;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#computeRedoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeRedoableStatus(IProgressMonitor monitor) {
-		IStatus status = getBasicRedoStatus();
-		if (status.isOK()) {
-			return super.computeRedoableStatus(monitor);
-		}
-		if (status.getSeverity() == IStatus.ERROR) {
-			markInvalid();
-		}
-		return status;
-	}
-
-	/**
-	 * Compute the status for deleting any known markers. A status severity of
-	 * <code>OK</code> indicates that the delete is likely to be successful. A
-	 * status severity of <code>ERROR</code> indicates that the operation is
-	 * no longer valid. Other status severities are open to interpretation by
-	 * the caller.
-	 * 
-	 * @return the status indicating the projected outcome of deleting the
-	 *         markers.
-	 * 
-	 */
-	protected IStatus getMarkerDeletionStatus() {
-		if (markersExist()) {
-			return Status.OK_STATUS;
-		}
-		return getErrorStatus(UndoMessages.MarkerOperation_MarkerDoesNotExist);
-	}
-
-	/**
-	 * Compute the status for creating any known markers. A status severity of
-	 * <code>OK</code> indicates that the create is likely to be successful. A
-	 * status severity of <code>ERROR</code> indicates that the operation is
-	 * no longer valid. Other status severities are open to interpretation by
-	 * the caller.
-	 * 
-	 * @return the status indicating the projected outcome of creating the
-	 *         markers.
-	 * 
-	 */
-	protected IStatus getMarkerCreationStatus() {
-		if (!resourcesExist()) {
-			return getErrorStatus(UndoMessages.MarkerOperation_ResourceDoesNotExist);
-		} else if (markerDescriptions == null) {
-			return getErrorStatus(UndoMessages.MarkerOperation_NotEnoughInfo);
-		}
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Compute the status for updating any known markers. A status severity of
-	 * <code>OK</code> indicates that the update is likely to be successful. A
-	 * status severity of <code>ERROR</code> indicates that the operation is
-	 * no longer valid. Other status severities are open to interpretation by
-	 * the caller.
-	 * 
-	 * @return the status indicating the projected outcome of updating the
-	 *         markers.
-	 * 
-	 */
-	protected IStatus getMarkerUpdateStatus() {
-		if (!markersExist()) {
-			return getErrorStatus(UndoMessages.MarkerOperation_MarkerDoesNotExist);
-		} else if (attributes == null) {
-			return getErrorStatus(UndoMessages.MarkerOperation_NotEnoughInfo);
-		}
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#getExecuteSchedulingRule()
-	 */
-	protected ISchedulingRule getExecuteSchedulingRule() {
-		ISchedulingRule[] ruleArray = new ISchedulingRule[resources.length];
-		for (int i = 0; i < resources.length; i++) {
-			ruleArray[i] = getWorkspaceRuleFactory().markerRule(resources[i]);
-		}
-		return MultiRule.combine(ruleArray);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#getUndoSchedulingRule()
-	 */
-	protected ISchedulingRule getUndoSchedulingRule() {
-		return getExecuteSchedulingRule();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#appendDescriptiveText(java.lang.StringBuffer)
-	 */
-	protected void appendDescriptiveText(StringBuffer text) {
-		super.appendDescriptiveText(text);
-		text.append(" markers: "); //$NON-NLS-1$
-		text.append(markers);
-		text.append('\'');
-		text.append(" markerDescriptions: "); //$NON-NLS-1$
-		text.append(markerDescriptions);
-		text.append('\'');
-		text.append(" attributes: "); //$NON-NLS-1$
-		text.append(attributes);
-		text.append('\'');
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/AbstractResourcesOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/AbstractResourcesOperation.java
deleted file mode 100644
index f8a0226..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/AbstractResourcesOperation.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.MultiRule;
-import org.eclipse.ui.actions.ReadOnlyStateChecker;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.undo.UndoMessages;
-
-/**
- * An AbstractResourcesOperation represents an undoable operation that
- * manipulates resources. It provides implementations for resource rename,
- * delete, creation, and modification. It also assigns the workspace undo
- * context as the undo context for operations of this type. Clients may call the
- * public API from a background thread.
- * 
- * This class is not intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-abstract class AbstractResourcesOperation extends AbstractWorkspaceOperation {
-
-	/*
-	 * The array of resource descriptions known by this operation to create or
-	 * restore overwritten resources.
-	 */
-	protected ResourceDescription[] resourceDescriptions;
-
-	/*
-	 * Return true if the specified subResource is a descendant of the specified
-	 * super resource. Used to remove descendants from the resource array when
-	 * an operation is requested on a parent and its descendant.
-	 */
-	private static boolean isDescendantOf(IResource subResource,
-			IResource superResource) {
-		return !subResource.equals(superResource)
-				&& superResource.getFullPath().isPrefixOf(
-						subResource.getFullPath());
-	}
-
-	/**
-	 * Create an Abstract Resources Operation
-	 * 
-	 * @param resources
-	 *            the resources to be modified
-	 * @param label
-	 *            the label of the operation
-	 */
-	AbstractResourcesOperation(IResource[] resources, String label) {
-		super(label);
-		this.addContext(WorkspaceUndoUtil.getWorkspaceUndoContext());
-
-		setTargetResources(resources);
-	}
-
-	/**
-	 * Create an Abstract Resources Operation
-	 * 
-	 * @param resourceDescriptions
-	 *            the resourceDescriptions describing resources to be created
-	 * @param label
-	 *            the label of the operation
-	 */
-	AbstractResourcesOperation(ResourceDescription[] resourceDescriptions,
-			String label) {
-		super(label);
-		addContext(WorkspaceUndoUtil.getWorkspaceUndoContext());
-		setResourceDescriptions(resourceDescriptions);
-	}
-
-	/**
-	 * Delete any resources known by this operation. Store enough information to
-	 * undo and redo the operation.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to use for the operation
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * @param deleteContent
-	 *            <code>true</code> if the content of any known projects
-	 *            should be deleted along with the project. <code>false</code>
-	 *            if project content should not be deleted.
-	 * @throws CoreException
-	 *             propagates any CoreExceptions thrown from the resources API
-	 */
-	protected void delete(IProgressMonitor monitor, IAdaptable uiInfo,
-			boolean deleteContent) throws CoreException {
-		setResourceDescriptions(WorkspaceUndoUtil.delete(resources, monitor,
-				uiInfo, deleteContent));
-		setTargetResources(new IResource[0]);
-	}
-
-	/**
-	 * Recreate any resources known by this operation. Store enough information
-	 * to undo and redo the operation.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to use for the operation
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * @throws CoreException
-	 *             propagates any CoreExceptions thrown from the resources API
-	 */
-	protected void recreate(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException {
-		setTargetResources(WorkspaceUndoUtil.recreate(resourceDescriptions,
-				monitor, uiInfo));
-		setResourceDescriptions(new ResourceDescription[0]);
-	}
-
-	/**
-	 * Compute the status for creating resources from the descriptions. A status
-	 * severity of <code>OK</code> indicates that the create is likely to be
-	 * successful. A status severity of <code>ERROR</code> indicates that the
-	 * operation is no longer valid. Other status severities are open to
-	 * interpretation by the caller.
-	 * 
-	 * Note this method may be called on initial creation of a resource, or when
-	 * a create or delete operation is being undone or redone. Therefore, this
-	 * method should check conditions that can change over the life of the
-	 * operation, such as the existence of the information needed to carry out
-	 * the operation. One-time static checks should typically be done by the
-	 * caller (such as the action that creates the operation) so that the user
-	 * is not continually prompted or warned about conditions that were
-	 * acceptable at the time of original execution.
-	 * 
-	 * @param allowOverwrite
-	 *            a boolean that specifies whether resource creation should be
-	 *            allowed to overwrite an existent resource.
-	 */
-	protected IStatus computeCreateStatus(boolean allowOverwrite) {
-		if (resourceDescriptions == null || resourceDescriptions.length == 0) {
-			markInvalid();
-			return getErrorStatus(UndoMessages.AbstractResourcesOperation_NotEnoughInfo);
-		}
-		for (int i = 0; i < resourceDescriptions.length; i++) {
-			// Check for enough info to restore the resource
-			if (resourceDescriptions[i] == null
-					|| !resourceDescriptions[i].isValid()) {
-				markInvalid();
-				return getErrorStatus(UndoMessages.AbstractResourcesOperation_InvalidRestoreInfo);
-			} else if (!allowOverwrite
-					&& resourceDescriptions[i].verifyExistence(false)) {
-				// overwrites are not allowed and the resource already exists
-				markInvalid();
-				return getErrorStatus(UndoMessages.AbstractResourcesOperation_ResourcesAlreadyExist);
-			}
-		}
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Compute the status for deleting resources. A status severity of
-	 * <code>OK</code> indicates that the delete is likely to be successful. A
-	 * status severity of <code>ERROR</code> indicates that the operation is
-	 * no longer valid. Other status severities are open to interpretation by
-	 * the caller.
-	 * 
-	 * Note this method may be called on initial deletion of a resource, or when
-	 * a create or delete operation is being undone or redone. Therefore, this
-	 * method should check conditions that can change over the life of the
-	 * operation, such as the existence of the resources to be deleted. One-time
-	 * static checks should typically be done by the caller (such as the action
-	 * that creates the operation) so that the user is not continually prompted
-	 * or warned about conditions that were acceptable at the time of original
-	 * execution.
-	 */
-	protected IStatus computeDeleteStatus() {
-		if (resources == null || resources.length == 0) {
-			markInvalid();
-			return getErrorStatus(UndoMessages.AbstractResourcesOperation_NotEnoughInfo);
-		}
-		if (!resourcesExist()) {
-			markInvalid();
-			return getErrorStatus(UndoMessages.AbstractResourcesOperation_ResourcesDoNotExist);
-		}
-		return checkReadOnlyResources(resources);
-	}
-
-	/**
-	 * Check the specified resources for read only state, and return a status
-	 * indicating whether the resources can be deleted.
-	 */
-	IStatus checkReadOnlyResources(IResource[] resourcesToCheck) {
-		// Check read only status if we are permitted
-		// to consult the user.
-		if (!quietCompute) {
-			ReadOnlyStateChecker checker = new ReadOnlyStateChecker(
-					getShell(null),
-					IDEWorkbenchMessages.DeleteResourceAction_title1,
-					IDEWorkbenchMessages.DeleteResourceAction_readOnlyQuestion);
-			checker.setIgnoreLinkedResources(true);
-			IResource[] approvedResources = checker
-					.checkReadOnlyResources(resourcesToCheck);
-			if (approvedResources.length == 0) {
-				// Consider this a cancelled redo.
-				return Status.CANCEL_STATUS;
-			}
-			// Redefine the redo to only include the approved ones.
-			setTargetResources(approvedResources);
-		}
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Set the array of resource descriptions describing resources to be
-	 * restored when undoing or redoing this operation.
-	 * 
-	 * @param descriptions
-	 *            the array of resource descriptions
-	 */
-	protected void setResourceDescriptions(ResourceDescription[] descriptions) {
-		if (descriptions == null) {
-			resourceDescriptions = new ResourceDescription[0];
-		} else {
-			resourceDescriptions = descriptions;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#appendDescriptiveText(java.lang.StringBuffer)
-	 */
-	protected void appendDescriptiveText(StringBuffer text) {
-		super.appendDescriptiveText(text);
-		text.append(" resourceDescriptions: "); //$NON-NLS-1$
-		text.append(resourceDescriptions);
-		text.append('\'');
-	}
-
-	/**
-	 * Compute a scheduling rule for creating resources.
-	 * 
-	 * @return a scheduling rule appropriate for creating the resources
-	 *         specified in the resource descriptions
-	 */
-	protected ISchedulingRule computeCreateSchedulingRule() {
-		ISchedulingRule[] ruleArray = new ISchedulingRule[resourceDescriptions.length * 3];
-
-		for (int i = 0; i < resourceDescriptions.length; i++) {
-			if (resourceDescriptions[i] != null) {
-				IResource resource = resourceDescriptions[i]
-						.createResourceHandle();
-				// Need a rule for creating...
-				ruleArray[i * 3] = getWorkspaceRuleFactory().createRule(
-						resource);
-				// ...and modifying
-				ruleArray[i * 3 + 1] = getWorkspaceRuleFactory().modifyRule(
-						resource);
-				// ...and changing the charset
-				ruleArray[i * 3 + 2] = getWorkspaceRuleFactory().charsetRule(
-						resource);
-			}
-
-		}
-		return MultiRule.combine(ruleArray);
-	}
-
-	/**
-	 * Compute a scheduling rule for deleting resources.
-	 * 
-	 * @return a scheduling rule appropriate for deleting the resources
-	 *         specified in the receiver.
-	 */
-	protected ISchedulingRule computeDeleteSchedulingRule() {
-		ISchedulingRule[] ruleArray = new ISchedulingRule[resources.length * 2];
-		for (int i = 0; i < resources.length; i++) {
-			ruleArray[i * 2] = getWorkspaceRuleFactory().deleteRule(
-					resources[i]);
-			// we include a modify rule because we may have to open a project
-			// to record its resources before deleting it.
-			ruleArray[i * 2 + 1] = getWorkspaceRuleFactory().modifyRule(
-					resources[i]);
-		}
-		return MultiRule.combine(ruleArray);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#setTargetResources(org.eclipse.core.resources.IResource[])
-	 */
-	protected void setTargetResources(IResource[] targetResources) {
-		// Remove any descendants if the parent has also
-		// been specified.
-		Set subResources = new HashSet();
-		for (int i = 0; i < targetResources.length; i++) {
-			IResource subResource = targetResources[i];
-			for (int j = 0; j < targetResources.length; j++) {
-				IResource superResource = targetResources[j];
-				if (isDescendantOf(subResource, superResource))
-					subResources.add(subResource);
-			}
-		}
-		IResource[] nestedResourcesRemoved = new IResource[targetResources.length
-				- subResources.size()];
-		int j = 0;
-		for (int i = 0; i < targetResources.length; i++) {
-			if (!subResources.contains(targetResources[i])) {
-				nestedResourcesRemoved[j] = targetResources[i];
-				j++;
-			}
-		}
-		super.setTargetResources(nestedResourcesRemoved);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/AbstractWorkspaceOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/AbstractWorkspaceOperation.java
deleted file mode 100644
index 8e7a7fd..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/AbstractWorkspaceOperation.java
+++ /dev/null
@@ -1,772 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.AbstractOperation;
-import org.eclipse.core.commands.operations.IAdvancedUndoableOperation;
-import org.eclipse.core.commands.operations.IAdvancedUndoableOperation2;
-import org.eclipse.core.commands.operations.OperationHistoryEvent;
-import org.eclipse.core.commands.operations.OperationStatus;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceRuleFactory;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
-import org.eclipse.core.resources.mapping.ResourceChangeValidator;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.jface.action.Action;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.undo.UndoMessages;
-
-/**
- * An AbstractWorkspaceOperation represents an undoable operation that affects
- * the workspace. It handles common workspace operation activities such as
- * tracking which resources are affected by an operation, prompting the user
- * when there are possible side effects of operations, building execution
- * exceptions from core exceptions, etc. Clients may call the public API from a
- * background thread.
- * 
- * This class is not intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-public abstract class AbstractWorkspaceOperation extends AbstractOperation
-		implements IAdvancedUndoableOperation, IAdvancedUndoableOperation2 {
-
-	private static String ELLIPSIS = "..."; //$NON-NLS-1$
-
-	protected static int EXECUTE = 1;
-
-	protected static int UNDO = 2;
-
-	protected static int REDO = 3;
-
-	protected IResource[] resources;
-
-	private boolean isValid = true;
-
-	/*
-	 * Specifies whether any user prompting is appropriate while computing
-	 * status.
-	 */
-	protected boolean quietCompute = false;
-
-	String[] modelProviderIds;
-
-	/**
-	 * Create an AbstractWorkspaceOperation with the specified name.
-	 * 
-	 * @param name
-	 *            the name used to describe the operation
-	 */
-	AbstractWorkspaceOperation(String name) {
-		// Many operation names are based on the triggering action's name, so
-		// we strip out the any mnemonics that may be embedded in the name.
-		super(Action.removeMnemonics(name));
-
-		// For the same reason, check for an ellipsis and strip out
-		String label = this.getLabel();
-		if (label.endsWith(ELLIPSIS)) {
-			this.setLabel(label
-					.substring(0, label.length() - ELLIPSIS.length()));
-		}
-	}
-
-	/**
-	 * Set the ids of any model providers for the resources involved.
-	 * 
-	 * @param ids
-	 *            the array of String model provider ids that provide models
-	 *            associated with the resources involved in this operation
-	 */
-	public void setModelProviderIds(String[] ids) {
-		modelProviderIds = ids;
-	}
-
-	/**
-	 * Set the resources which are affected by this operation
-	 * 
-	 * @param resources
-	 *            an array of resources
-	 */
-	protected void setTargetResources(IResource[] resources) {
-		this.resources = resources;
-	}
-
-	/**
-	 * Return the workspace manipulated by this operation.
-	 * 
-	 * @return the IWorkspace used by this operation.
-	 */
-	protected IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/**
-	 * Return the workspace rule factory associated with this operation.
-	 * 
-	 * @return the IResourceRuleFactory associated with this operation.
-	 */
-	protected IResourceRuleFactory getWorkspaceRuleFactory() {
-		return getWorkspace().getRuleFactory();
-	}
-
-	/**
-	 * Mark this operation invalid due to some external change. May be used by
-	 * subclasses.
-	 * 
-	 */
-	protected void markInvalid() {
-		isValid = false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation checks a validity flag.
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#canExecute()
-	 */
-	public boolean canExecute() {
-		return isValid();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation checks a validity flag.
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#canUndo()
-	 */
-	public boolean canUndo() {
-		return isValid();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation checks a validity flag.
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#canRedo()
-	 */
-	public boolean canRedo() {
-		return isValid();
-	}
-
-	/**
-	 * Execute the specified operation. This implementation executes the
-	 * operation in a workspace runnable and catches any CoreExceptions
-	 * resulting from the operation. Unhandled CoreExceptions are propagated as
-	 * ExecutionExceptions.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to use for the operation
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * @return the IStatus of the execution. The status severity should be set
-	 *         to <code>OK</code> if the operation was successful, and
-	 *         <code>ERROR</code> if it was not. Any other status is assumed
-	 *         to represent an incompletion of the execution.
-	 * @throws ExecutionException
-	 *             if an exception occurred during execution.
-	 * 
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#execute(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus execute(IProgressMonitor monitor, final IAdaptable uiInfo)
-			throws ExecutionException {
-		try {
-			getWorkspace().run(new IWorkspaceRunnable() {
-				public void run(IProgressMonitor monitor) throws CoreException {
-					doExecute(monitor, uiInfo);
-				}
-			}, getExecuteSchedulingRule(), IWorkspace.AVOID_UPDATE, monitor);
-		} catch (final CoreException e) {
-			throw new ExecutionException(NLS.bind(
-					UndoMessages.AbstractWorkspaceOperation_ExecuteErrorTitle,
-					getLabel()), e);
-		}
-		isValid = true;
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Redo the specified operation. This implementation redoes the operation in
-	 * a workspace runnable and catches any CoreExceptions resulting from the
-	 * operation. Unhandled CoreExceptions are propagated as
-	 * ExecutionExceptions.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to use for the operation
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * @return the IStatus of the redo. The status severity should be set to
-	 *         <code>OK</code> if the operation was successful, and
-	 *         <code>ERROR</code> if it was not. Any other status is assumed
-	 *         to represent an incompletion of the redo.
-	 * @throws ExecutionException
-	 *             if an exception occurred during execution.
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#redo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus redo(IProgressMonitor monitor, final IAdaptable uiInfo)
-			throws ExecutionException {
-		try {
-			getWorkspace().run(new IWorkspaceRunnable() {
-				public void run(IProgressMonitor monitor) throws CoreException {
-					doExecute(monitor, uiInfo);
-				}
-			}, getRedoSchedulingRule(), IWorkspace.AVOID_UPDATE, monitor);
-		} catch (final CoreException e) {
-			throw new ExecutionException(NLS.bind(
-					UndoMessages.AbstractWorkspaceOperation_RedoErrorTitle,
-					getLabel()), e);
-
-		}
-		isValid = true;
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Undo the specified operation. This implementation undoes the operation in
-	 * a workspace runnable and catches any CoreExceptions resulting from the
-	 * operation. Unhandled CoreExceptions are propagated as
-	 * ExecutionExceptions.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to use for the operation
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * @return the IStatus of the undo. The status severity should be set to
-	 *         <code>OK</code> if the operation was successful, and
-	 *         <code>ERROR</code> if it was not. Any other status is assumed
-	 *         to represent an incompletion of the undo. *
-	 * @throws ExecutionException
-	 *             if an exception occurred during execution.
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#undo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus undo(IProgressMonitor monitor, final IAdaptable uiInfo)
-			throws ExecutionException {
-		try {
-			getWorkspace().run(new IWorkspaceRunnable() {
-				public void run(IProgressMonitor monitor) throws CoreException {
-					doUndo(monitor, uiInfo);
-				}
-			}, getUndoSchedulingRule(), IWorkspace.AVOID_UPDATE, monitor);
-		} catch (final CoreException e) {
-			throw new ExecutionException(NLS.bind(
-					UndoMessages.AbstractWorkspaceOperation_UndoErrorTitle,
-					getLabel()), e);
-
-		}
-		isValid = true;
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Perform the specific work involved in undoing this operation.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to use for the operation
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * @throws CoreException
-	 *             propagates any CoreExceptions thrown from the resources API
-	 */
-	protected abstract void doUndo(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException;
-
-	/**
-	 * Perform the specific work involved in executing this operation.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to use for the operation
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * @throws CoreException
-	 *             propagates any CoreExceptions thrown from the resources API
-	 * 
-	 */
-	protected abstract void doExecute(IProgressMonitor monitor,
-			IAdaptable uiInfo) throws CoreException;
-
-	/**
-	 * Return whether the proposed operation is valid. The default
-	 * implementation simply checks to see if the flag has been marked as
-	 * invalid, relying on subclasses to mark the flag invalid when appropriate.
-	 * 
-	 * @return the validity flag
-	 */
-	protected boolean isValid() {
-		return isValid;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation#aboutToNotify(org.eclipse.core.commands.operations.OperationHistoryEvent)
-	 */
-	public void aboutToNotify(OperationHistoryEvent event) {
-		// do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation#getAffectedObjects()
-	 */
-	public Object[] getAffectedObjects() {
-		return resources;
-	}
-
-	/**
-	 * Return a status indicating the projected outcome of executing the
-	 * receiver. This method is not called by the operation history, but instead
-	 * is used by clients (such as implementers of
-	 * {@link org.eclipse.core.commands.operations.IOperationApprover2}) who
-	 * wish to perform advanced validation of an operation before attempting to
-	 * execute it.
-	 * 
-	 * If an ERROR status is returned, the operation will not proceed and the
-	 * user notified if deemed necessary by the caller. The validity flag on the
-	 * operation should be marked as invalid. If an OK status is returned, the
-	 * operation will proceed. The caller must interpret any other returned
-	 * status severity, and may choose to prompt the user as to how to proceed.
-	 * 
-	 * If there are multiple conditions that result in an ambiguous status
-	 * severity, it is best for the implementor of this method to consult the
-	 * user as to how to proceed for each one, and return an OK or ERROR status
-	 * that accurately reflects the user's wishes, or to return a multi-status
-	 * that accurately describes all of the issues at hand, so that the caller
-	 * may potentially consult the user. (Note that the user should not be
-	 * consulted at all if a client has called {@link #setQuietCompute(boolean)}
-	 * with a value of <code>true</code>.)
-	 * 
-	 * This implementation computes the validity of execution by computing the
-	 * resource delta that would be generated on execution, and checking whether
-	 * any registered model providers are affected by the operation.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to be used for computing the status
-	 * @return the status indicating the projected outcome of executing the
-	 *         receiver
-	 * 
-	 * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation#computeUndoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 * @see #setQuietCompute(boolean)
-	 */
-	public IStatus computeExecutionStatus(IProgressMonitor monitor) {
-		IStatus status = Status.OK_STATUS;
-
-		// If we are not to prompt the user, nothing to do.
-		if (quietCompute) {
-			return status;
-		}
-
-		IResourceChangeDescriptionFactory factory = ResourceChangeValidator
-				.getValidator().createDeltaFactory();
-		if (updateResourceChangeDescriptionFactory(factory, EXECUTE)) {
-			boolean proceed = IDE
-					.promptToConfirm(
-							getShell(null),
-							UndoMessages.AbstractWorkspaceOperation_SideEffectsWarningTitle,
-							NLS
-									.bind(
-											UndoMessages.AbstractWorkspaceOperation_ExecuteSideEffectsWarningMessage,
-											getLabel()), factory.getDelta(),
-							modelProviderIds, true /* syncExec */);
-			if (!proceed) {
-				status = Status.CANCEL_STATUS;
-			}
-		}
-		return status;
-
-	}
-
-	/**
-	 * Return a status indicating the projected outcome of undoing the receiver.
-	 * This method is not called by the operation history, but instead is used
-	 * by clients (such as implementers of
-	 * {@link org.eclipse.core.commands.operations.IOperationApprover2}) who
-	 * wish to perform advanced validation of an operation before attempting to
-	 * undo it.
-	 * 
-	 * If an ERROR status is returned, the undo will not proceed and the user
-	 * notified if deemed necessary by the caller. The validity flag on the
-	 * operation should be marked as invalid. If an OK status is returned, the
-	 * undo will proceed. The caller must interpret any other returned status
-	 * severity, and may choose to prompt the user as to how to proceed.
-	 * 
-	 * If there are multiple conditions that result in an ambiguous status
-	 * severity, it is best for the implementor of this method to consult the
-	 * user as to how to proceed for each one, and return an OK or ERROR status
-	 * that accurately reflects the user's wishes, or to return a multi-status
-	 * that accurately describes all of the issues at hand, so that the caller
-	 * may potentially consult the user. (Note that the user should not be
-	 * consulted at all if a client has called {@link #setQuietCompute(boolean)}
-	 * with a value of <code>true</code>.)
-	 * 
-	 * This implementation computes the validity of undo by computing the
-	 * resource delta that would be generated on undo, and checking whether any
-	 * registered model providers are affected by the operation.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to be used for computing the status
-	 * @return the status indicating the projected outcome of undoing the
-	 *         receiver
-	 * 
-	 * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation#computeUndoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 * @see #setQuietCompute(boolean)
-	 */
-	public IStatus computeUndoableStatus(IProgressMonitor monitor) {
-		IStatus status = Status.OK_STATUS;
-		// If we are not to prompt the user, nothing to do.
-		if (quietCompute) {
-			return status;
-		}
-
-		IResourceChangeDescriptionFactory factory = ResourceChangeValidator
-				.getValidator().createDeltaFactory();
-		if (updateResourceChangeDescriptionFactory(factory, UNDO)) {
-			boolean proceed = IDE
-					.promptToConfirm(
-							getShell(null),
-							UndoMessages.AbstractWorkspaceOperation_SideEffectsWarningTitle,
-							NLS
-									.bind(
-											UndoMessages.AbstractWorkspaceOperation_UndoSideEffectsWarningMessage,
-											getLabel()), factory.getDelta(),
-							modelProviderIds, true /* syncExec */);
-			if (!proceed) {
-				status = Status.CANCEL_STATUS;
-			}
-		}
-		return status;
-
-	}
-
-	/**
-	 * Return a status indicating the projected outcome of redoing the receiver.
-	 * This method is not called by the operation history, but instead is used
-	 * by clients (such as implementers of
-	 * {@link org.eclipse.core.commands.operations.IOperationApprover2}) who
-	 * wish to perform advanced validation of an operation before attempting to
-	 * redo it.
-	 * 
-	 * If an ERROR status is returned, the redo will not proceed and the user
-	 * notified if deemed necessary by the caller. The validity flag on the
-	 * operation should be marked as invalid. If an OK status is returned, the
-	 * redo will proceed. The caller must interpret any other returned status
-	 * severity, and may choose to prompt the user as to how to proceed.
-	 * 
-	 * If there are multiple conditions that result in an ambiguous status
-	 * severity, it is best for the implementor of this method to consult the
-	 * user as to how to proceed for each one, and return an OK or ERROR status
-	 * that accurately reflects the user's wishes, or to return a multi-status
-	 * that accurately describes all of the issues at hand, so that the caller
-	 * may potentially consult the user. (Note that the user should not be
-	 * consulted at all if a client has called {@link #setQuietCompute(boolean)}
-	 * with a value of <code>true</code>.)
-	 * 
-	 * This implementation computes the validity of redo by computing the
-	 * resource delta that would be generated on redo, and checking whether any
-	 * registered model providers are affected by the operation.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to be used for computing the status
-	 * @return the status indicating the projected outcome of redoing the
-	 *         receiver
-	 * 
-	 * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation#computeUndoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 * @see #setQuietCompute(boolean)
-	 */
-	public IStatus computeRedoableStatus(IProgressMonitor monitor) {
-		IStatus status = Status.OK_STATUS;
-		// If we are not to prompt the user, nothing to do.
-		if (quietCompute) {
-			return status;
-		}
-
-		IResourceChangeDescriptionFactory factory = ResourceChangeValidator
-				.getValidator().createDeltaFactory();
-		if (updateResourceChangeDescriptionFactory(factory, REDO)) {
-			boolean proceed = IDE
-					.promptToConfirm(
-							getShell(null),
-							UndoMessages.AbstractWorkspaceOperation_SideEffectsWarningTitle,
-							NLS
-									.bind(
-											UndoMessages.AbstractWorkspaceOperation_RedoSideEffectsWarningMessage,
-											getLabel()), factory.getDelta(),
-							modelProviderIds, true /* syncExec */);
-			if (!proceed) {
-				status = Status.CANCEL_STATUS;
-			}
-		}
-		return status;
-	}
-
-	/**
-	 * Update the provided resource change description factory so it can
-	 * generate a resource delta describing the result of an undo or redo.
-	 * Return a boolean indicating whether any update was done. The default
-	 * implementation does not update the factory. Subclasses are expected to
-	 * override this method to more specifically describe their modifications to
-	 * the workspace.
-	 * 
-	 * @param factory
-	 *            the factory to update
-	 * @param operation
-	 *            an integer indicating whether the change is part of an
-	 *            execute, undo, or redo
-	 * @return a boolean indicating whether the factory was updated.
-	 */
-	protected boolean updateResourceChangeDescriptionFactory(
-			IResourceChangeDescriptionFactory factory, int operation) {
-		return false;
-	}
-
-	/**
-	 * Return an error status describing an invalid operation using the provided
-	 * message.
-	 * 
-	 * @param message
-	 *            the message to be used in the status, or <code>null</code>
-	 *            if a generic message should be used
-	 * @return the error status
-	 */
-	protected IStatus getErrorStatus(String message) {
-		String statusMessage = message;
-		if (statusMessage == null) {
-			statusMessage = NLS
-					.bind(
-							UndoMessages.AbstractWorkspaceOperation_ErrorInvalidMessage,
-							getLabel());
-		}
-		return new Status(IStatus.ERROR, IDEWorkbenchPlugin.IDE_WORKBENCH,
-				OperationStatus.OPERATION_INVALID, statusMessage, null);
-	}
-
-	/**
-	 * Return a warning status describing the warning state of an operation
-	 * using the provided message and code.
-	 * 
-	 * @param message
-	 *            the message to be used in the status, or <code>null</code>
-	 *            if a generic message should be used
-	 * @param code
-	 *            the integer code to be assigned to the status
-	 * @return the warning status
-	 */
-	protected IStatus getWarningStatus(String message, int code) {
-		String statusMessage = message;
-		if (statusMessage == null) {
-			statusMessage = NLS
-					.bind(
-							UndoMessages.AbstractWorkspaceOperation_GenericWarningMessage,
-							getLabel());
-		}
-		return new Status(IStatus.WARNING, IDEWorkbenchPlugin.IDE_WORKBENCH,
-				code, statusMessage, null);
-	}
-
-	/**
-	 * Return whether the resources known by this operation currently exist.
-	 * 
-	 * @return <code>true</code> if there are existing resources and
-	 *         <code>false</code> if there are no known resources or any one
-	 *         of them does not exist
-	 */
-	protected boolean resourcesExist() {
-		if (resources == null || resources.length == 0) {
-			return false;
-		}
-		for (int i = 0; i < resources.length; i++) {
-			if (resources[i] == null || !resources[i].exists()) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Return whether the resources known by this operation contain any
-	 * projects.
-	 * 
-	 * @return <code>true</code> if there is one or more projects known by
-	 *         this operation and false if there are no projects.
-	 */
-	protected boolean resourcesIncludesProjects() {
-		if (resources == null || resources.length == 0) {
-			return false;
-		}
-		for (int i = 0; i < resources.length; i++) {
-			if (resources[i].getType() == IResource.PROJECT) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Return a scheduling rule appropriate for executing this operation.
-	 * 
-	 * The default implementation is to return a rule that locks out the entire
-	 * workspace. Subclasses are encouraged to provide more specific rules that
-	 * affect only their resources.
-	 * 
-	 * @return the scheduling rule to use when executing this operation, or
-	 *         <code>null</code> if there are no scheduling restrictions for
-	 *         this operation.
-	 * 
-	 * @see IWorkspace#run(IWorkspaceRunnable, ISchedulingRule, int,
-	 *      IProgressMonitor)
-	 */
-	protected ISchedulingRule getExecuteSchedulingRule() {
-		return getWorkspace().getRoot();
-	}
-
-	/**
-	 * Return a scheduling rule appropriate for undoing this operation.
-	 * 
-	 * The default implementation is to return a rule that locks out the entire
-	 * workspace. Subclasses are encouraged to provide more specific rules that
-	 * affect only their resources.
-	 * 
-	 * @return the scheduling rule to use when undoing this operation, or
-	 *         <code>null</code> if there are no scheduling restrictions for
-	 *         this operation.
-	 * 
-	 * @see IWorkspace#run(IWorkspaceRunnable, ISchedulingRule, int,
-	 *      IProgressMonitor)
-	 */
-	protected ISchedulingRule getUndoSchedulingRule() {
-		return getWorkspace().getRoot();
-	}
-
-	/**
-	 * Return a scheduling rule appropriate for redoing this operation.
-	 * 
-	 * The default implementation considers the redo scheduling rule the same as
-	 * the original execution scheduling rule.
-	 * 
-	 * @return the scheduling rule to use when redoing this operation, or
-	 *         <code>null</code> if there are no scheduling restrictions for
-	 *         this operation.
-	 * 
-	 * @see IWorkspace#run(IWorkspaceRunnable, ISchedulingRule, int,
-	 *      IProgressMonitor)
-	 */
-	protected ISchedulingRule getRedoSchedulingRule() {
-		return getExecuteSchedulingRule();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation2#setQuietCompute(boolean)
-	 */
-	public void setQuietCompute(boolean quiet) {
-		quietCompute = quiet;
-	}
-
-	/*
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer text = new StringBuffer(super.toString());
-		text.append("\n"); //$NON-NLS-1$
-		text.append(this.getClass().getName());
-		appendDescriptiveText(text);
-		return text.toString();
-	}
-
-	/**
-	 * Append any descriptive text to the specified string buffer to be shown in
-	 * the receiver's {@link #toString()} text.
-	 * <p>Note that this method is not intend to be subclassed by clients.
-	 * 
-	 * @param text
-	 *            the StringBuffer on which to append the text
-	 */
-	protected void appendDescriptiveText(StringBuffer text) {
-		text.append(" resources: "); //$NON-NLS-1$
-		text.append(resources);
-		text.append('\'');
-	}
-
-	/**
-	 * Return the shell described by the specified adaptable, or the active
-	 * shell if no shell has been specified in the adaptable.
-	 * 
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * 
-	 * @return the shell specified in the adaptable, or the active shell if no
-	 *         shell has been specified
-	 * 
-	 */
-	protected Shell getShell(IAdaptable uiInfo) {
-		if (uiInfo != null) {
-			Shell shell = (Shell) uiInfo.getAdapter(Shell.class);
-			if (shell != null) {
-				return shell;
-			}
-		}
-		return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IAdvancedUndoableOperation2#runInBackground()
-	 */
-	public boolean runInBackground() {
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CopyProjectOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CopyProjectOperation.java
deleted file mode 100644
index cf863e6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CopyProjectOperation.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import java.net.URI;
-
-import org.eclipse.core.filesystem.URIUtil;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-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.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.ui.internal.ide.undo.ProjectDescription;
-import org.eclipse.ui.internal.ide.undo.UndoMessages;
-
-/**
- * A CopyProjectOperation represents an undoable operation for copying a
- * project, also specifying the location of its contents. Clients may call the
- * public API from a background thread.
- * 
- * This class is intended to be instantiated and used by clients. It is not
- * intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-public class CopyProjectOperation extends AbstractCopyOrMoveResourcesOperation {
-
-	private URI projectLocation;
-
-	private IProject originalProject;
-
-	private ProjectDescription originalProjectDescription;
-
-	/**
-	 * Create a CopyProjectOperation that copies the specified project and sets
-	 * its location to the specified location.
-	 * 
-	 * @param project
-	 *            the project to be copied
-	 * @param name
-	 *            the name of the copy
-	 * @param location
-	 *            the location for the project's content, or <code>null</code>
-	 *            if the default project location should be used.
-	 * @param label
-	 *            the label of the operation
-	 */
-	public CopyProjectOperation(IProject project, String name, URI location,
-			String label) {
-		super(new IResource[] { project }, new Path(name), label);
-		Assert.isLegal(project != null);
-		originalProject = project;
-		if (location != null
-				&& URIUtil.toPath(location).equals(Platform.getLocation())) {
-			projectLocation = null;
-		} else {
-			projectLocation = location;
-		}
-	}
-
-	/*
-	 * Make a project handle for the proposed target project, or null if one
-	 * cannot be made.
-	 */
-	private IProject getProposedProjectHandle() {
-		if (destination.segmentCount() == 1) {
-			return getWorkspace().getRoot().getProject(
-					destination.lastSegment());
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Checks that the specified project location is valid in addition to
-	 * superclass checks.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractCopyOrMoveResourcesOperation#computeMoveOrCopyStatus()
-	 */
-	protected IStatus computeMoveOrCopyStatus() {
-		IStatus status = Status.OK_STATUS;
-		IProject project = getProposedProjectHandle();
-		if (project == null) {
-			return getErrorStatus(UndoMessages.AbstractResourcesOperation_NotEnoughInfo);
-		}
-		if (projectLocation != null) {
-			status = getWorkspace().validateProjectLocationURI(project,
-					projectLocation);
-		}
-		if (status.isOK()) {
-			return super.computeMoveOrCopyStatus();
-		}
-		return status;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map execute to copying the project
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doExecute(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doExecute(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException {
-		IProject newProject = copyProject(originalProject, destination,
-				projectLocation, monitor);
-		setTargetResources(new IResource[] { newProject });
-		setResourceDescriptions(new ResourceDescription[0]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map undo to deleting the project we just copied.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doExecute(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doUndo(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException {
-		// Delete the project that was copied
-		WorkspaceUndoUtil.delete(resources, new SubProgressMonitor(monitor, 1),
-				uiInfo, true);
-		// Set the target resource to the original
-		setTargetResources(new IResource[] { originalProject });
-		setResourceDescriptions(new ResourceDescription[0]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractCopyOrMoveResourcesOperation#isDestinationPathValid(org.eclipse.core.resources.IResource,
-	 *      int)
-	 */
-	protected boolean isDestinationPathValid(IResource resource, int index) {
-		// path has already been validated in #computeMoveOrCopyStatus()
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractCopyOrMoveResourcesOperation#getProposedName(org.eclipse.core.resources.IResource,
-	 *      int)
-	 */
-	protected String getProposedName(IResource resource, int index) {
-		return destination.lastSegment();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#updateResourceChangeDescriptionFactory(org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory,
-	 *      int)
-	 */
-	protected boolean updateResourceChangeDescriptionFactory(
-			IResourceChangeDescriptionFactory factory, int operation) {
-		boolean update = false;
-		if (operation == UNDO) {
-			for (int i = 0; i < resources.length; i++) {
-				update = true;
-				IResource resource = resources[i];
-				factory.delete(resource);
-			}
-		} else {
-			factory.copy(originalProject,
-					getDestinationPath(originalProject, 0));
-		}
-		return update;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation computes the ability to delete the original copy and
-	 * restore any overwritten resources.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#computeUndoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeUndoableStatus(IProgressMonitor monitor) {
-		IStatus status = super.computeUndoableStatus(monitor);
-		if (!status.isOK()) {
-			return status;
-		}
-		// If the original project content no longer exist, we do not want to
-		// attempt to undo the copy which involves deleting the copies. They may
-		// be all we have left.
-		if (originalProject == null
-				|| !originalProjectDescription.verifyExistence(true)) {
-			markInvalid();
-			return getErrorStatus(UndoMessages.CopyResourcesOperation_NotAllowedDueToDataLoss);
-		}
-		// undoing a copy means deleting the copy that was made
-		if (status.isOK()) {
-			status = computeDeleteStatus();
-		}
-		return status;
-	}
-
-	/*
-	 * Copy the specified project, returning the handle of the copy.
-	 */
-	IProject copyProject(IProject project, IPath destinationPath,
-			URI locationURI, IProgressMonitor monitor) throws CoreException {
-		monitor
-				.setTaskName(UndoMessages.AbstractCopyOrMoveResourcesOperation_copyProjectProgress);
-
-		boolean open = project.isOpen();
-		if (!open) {
-			// Must open project in order to get the original project
-			// description for performing the undo.
-			project.open(null);
-		}
-		originalProjectDescription = new ProjectDescription(project);
-		IProjectDescription description = project.getDescription();
-
-		// Set the new name and location into the project's description
-		description.setName(destinationPath.lastSegment());
-		description.setLocationURI(locationURI);
-
-		project.copy(description, IResource.FORCE | IResource.SHALLOW, monitor);
-
-		// Close the original project if it was closed when we started.
-		if (!open) {
-			project.close(null);
-		}
-		// Now return the handle of the new project
-		return (IProject) getWorkspace().getRoot().findMember(destinationPath);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CopyResourcesOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CopyResourcesOperation.java
deleted file mode 100644
index 27867dd..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CopyResourcesOperation.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.ui.internal.ide.undo.UndoMessages;
-
-/**
- * A CopyResourcesOperation represents an undoable operation for copying one or
- * more resources in the workspace. Clients may call the public API from a
- * background thread.
- * 
- * This operation can track any overwritten resources and restore them when the
- * copy is undone. It is up to clients to determine whether overwrites are
- * allowed. If a resource should not be overwritten, it should not be included
- * in this operation. In addition to checking for overwrites, the target
- * location for the copy is assumed to have already been validated by the
- * client. It will not be revalidated on undo and redo.
- * 
- * This class is intended to be instantiated and used by clients. It is not
- * intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-public class CopyResourcesOperation extends
-		AbstractCopyOrMoveResourcesOperation {
-
-	IResource[] originalResources;
-
-	ResourceDescription[] snapshotResourceDescriptions;
-
-	/**
-	 * Create a CopyResourcesOperation that copies a single resource to a new
-	 * location. The new location includes the name of the copy.
-	 * 
-	 * @param resource
-	 *            the resource to be copied
-	 * @param newPath
-	 *            the new workspace-relative path for the copy, including its
-	 *            desired name.
-	 * @param label
-	 *            the label of the operation
-	 */
-	public CopyResourcesOperation(IResource resource, IPath newPath,
-			String label) {
-		super(new IResource[] { resource }, new IPath[] { newPath }, label);
-		setOriginalResources(new IResource[] { resource });
-	}
-
-	/**
-	 * Create a CopyResourcesOperation that copies all of the specified
-	 * resources to a single target location. The original resource name will be
-	 * used when copied to the new location.
-	 * 
-	 * @param resources
-	 *            the resources to be copied
-	 * @param destinationPath
-	 *            the workspace-relative destination path for the copied
-	 *            resource.
-	 * @param label
-	 *            the label of the operation
-	 */
-	public CopyResourcesOperation(IResource[] resources, IPath destinationPath,
-			String label) {
-		super(resources, destinationPath, label);
-		setOriginalResources(this.resources);
-	}
-
-	/**
-	 * Create a CopyResourcesOperation that copies each of the specified
-	 * resources to its corresponding destination path in the destination path
-	 * array. The resource name for the target is included in the corresponding
-	 * destination path.
-	 * 
-	 * @param resources
-	 *            the resources to be copied. Must not contain null resources.
-	 * @param destinationPaths
-	 *            a workspace-relative destination path for each copied
-	 *            resource, which includes the name of the resource at the new
-	 *            destination. Must be the same length as the resources array,
-	 *            and may not contain null paths.
-	 * @param label
-	 *            the label of the operation
-	 */
-	public CopyResourcesOperation(IResource[] resources,
-			IPath[] destinationPaths, String label) {
-		super(resources, destinationPaths, label);
-		setOriginalResources(this.resources);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation copies the resources.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doExecute(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doExecute(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException {
-		copy(monitor, uiInfo);
-	}
-
-	/**
-	 * Move or copy any known resources according to the destination parameters
-	 * known by this operation. Store enough information to undo and redo the
-	 * operation.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to use for the operation
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * @throws CoreException
-	 *             propagates any CoreExceptions thrown from the resources API
-	 */
-	protected void copy(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException {
-
-		monitor.beginTask("", 2000); //$NON-NLS-1$
-		monitor
-				.setTaskName(UndoMessages.AbstractResourcesOperation_CopyingResourcesProgress);
-		List resourcesAtDestination = new ArrayList();
-		List overwrittenResources = new ArrayList();
-
-		for (int i = 0; i < resources.length; i++) {
-			// Copy the resources and record the overwrites that would
-			// be restored if this operation were reversed
-			ResourceDescription[] overwrites;
-			overwrites = WorkspaceUndoUtil.copy(
-					new IResource[] { resources[i] }, getDestinationPath(
-							resources[i], i), resourcesAtDestination,
-					new SubProgressMonitor(monitor, 1000 / resources.length),
-					uiInfo, true);
-			// Accumulate the overwrites into the full list
-			for (int j = 0; j < overwrites.length; j++) {
-				overwrittenResources.add(overwrites[j]);
-			}
-		}
-
-		// Are there any previously overwritten resources to restore now?
-		if (resourceDescriptions != null) {
-			for (int i = 0; i < resourceDescriptions.length; i++) {
-				if (resourceDescriptions[i] != null) {
-					resourceDescriptions[i]
-							.createResource(new SubProgressMonitor(monitor,
-									1000 / resourceDescriptions.length));
-				}
-			}
-		}
-
-		// Reset resource descriptions to the just overwritten resources
-		setResourceDescriptions((ResourceDescription[]) overwrittenResources
-				.toArray(new ResourceDescription[overwrittenResources.size()]));
-
-		// Reset the target resources to refer to the resources in their new
-		// location.
-		setTargetResources((IResource[]) resourcesAtDestination
-				.toArray(new IResource[resourcesAtDestination.size()]));
-		monitor.done();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation deletes the previously made copies and restores any
-	 * resources that were overwritten by the copy.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doUndo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doUndo(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException {
-		monitor.beginTask("", 2); //$NON-NLS-1$
-		monitor
-				.setTaskName(UndoMessages.AbstractResourcesOperation_CopyingResourcesProgress);
-		// undoing a copy is first deleting the copied resources...
-		WorkspaceUndoUtil.delete(resources, new SubProgressMonitor(monitor, 1),
-				uiInfo, true);
-		// then restoring any overwritten by the previous copy...
-		WorkspaceUndoUtil.recreate(resourceDescriptions,
-				new SubProgressMonitor(monitor, 1), uiInfo);
-		setResourceDescriptions(new ResourceDescription[0]);
-		// then setting the target resources back to the original ones.
-		// Note that the destination paths never changed since they
-		// are not used during undo.
-		setTargetResources(originalResources);
-		monitor.done();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#updateResourceChangeDescriptionFactory(org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory,
-	 *      int)
-	 */
-	protected boolean updateResourceChangeDescriptionFactory(
-			IResourceChangeDescriptionFactory factory, int operation) {
-		boolean update = false;
-		if (operation == UNDO) {
-			for (int i = 0; i < resources.length; i++) {
-				update = true;
-				IResource resource = resources[i];
-				factory.delete(resource);
-			}
-			for (int i = 0; i < resourceDescriptions.length; i++) {
-				if (resourceDescriptions[i] != null) {
-					update = true;
-					IResource resource = resourceDescriptions[i]
-							.createResourceHandle();
-					factory.create(resource);
-				}
-			}
-		} else {
-			for (int i = 0; i < resources.length; i++) {
-				update = true;
-				IResource resource = resources[i];
-				factory.copy(resource, getDestinationPath(resource, i));
-			}
-		}
-		return update;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation computes the ability to delete the original copy and
-	 * restore any overwritten resources.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#computeUndoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeUndoableStatus(IProgressMonitor monitor) {
-		IStatus status = super.computeUndoableStatus(monitor);
-		if (!status.isOK()) {
-			return status;
-		}
-		// If the originals no longer exist, we do not want to attempt to
-		// undo the copy which involves deleting the copies. They may be all we
-		// have left.
-		if (originalResources == null) {
-			markInvalid();
-			return getErrorStatus(UndoMessages.CopyResourcesOperation_NotAllowedDueToDataLoss);
-		}
-		for (int i = 0; i < snapshotResourceDescriptions.length; i++) {
-			if (!snapshotResourceDescriptions[i].verifyExistence(true)) {
-				markInvalid();
-				return getErrorStatus(UndoMessages.CopyResourcesOperation_NotAllowedDueToDataLoss);
-			}
-		}
-		// undoing a copy means deleting the copy that was made
-		if (status.isOK()) {
-			status = computeDeleteStatus();
-		}
-		// and if there were resources overwritten by the copy, can we still
-		// recreate them?
-		if (status.isOK() && resourceDescriptions != null
-				&& resourceDescriptions.length > 0) {
-			status = computeCreateStatus(true);
-		}
-
-		return status;
-	}
-
-	/*
-	 * Record the original resources, including a resource description to
-	 * describe it. This is so we can make sure the original resources and their
-	 * subtrees are intact before allowing a copy to be undone.
-	 */
-	private void setOriginalResources(IResource[] originals) {
-		originalResources = originals;
-		snapshotResourceDescriptions = new ResourceDescription[originals.length];
-		for (int i = 0; i < originals.length; i++) {
-			snapshotResourceDescriptions[i] = ResourceDescription
-					.fromResource(originals[i]);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CreateFileOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CreateFileOperation.java
deleted file mode 100644
index d8c93b1..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CreateFileOperation.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.net.URI;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.internal.ide.undo.ContainerDescription;
-import org.eclipse.ui.internal.ide.undo.FileDescription;
-import org.eclipse.ui.internal.ide.undo.IFileContentDescription;
-
-/**
- * A CreateFileOperation represents an undoable operation for creating a file in
- * the workspace. If a link location is specified, the folder is considered to
- * be linked to the file at the specified location. If a link location is not
- * specified, the file will be created in the location specified by the handle,
- * and the entire containment path of the file will be created if it does not
- * exist. Clients may call the public API from a background thread.
- * 
- * This class is intended to be instantiated and used by clients. It is not
- * intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-public class CreateFileOperation extends AbstractCreateResourcesOperation {
-
-	/**
-	 * Create a CreateFileOperation
-	 * 
-	 * @param fileHandle
-	 *            the file to be created
-	 * @param linkLocation
-	 *            the location of the file if it is to be linked
-	 * @param contents
-	 *            the initial contents of the file, or null if there is to be no
-	 *            contents
-	 * @param label
-	 *            the label of the operation
-	 */
-	public CreateFileOperation(IFile fileHandle, URI linkLocation,
-			InputStream contents, String label) {
-		super(null, label);
-		ResourceDescription resourceDescription;
-		if (fileHandle.getParent().exists()) {
-			resourceDescription = new FileDescription(fileHandle, linkLocation,
-					createFileContentDescription(fileHandle, contents));
-		} else {
-			// must first ensure descriptions for the parent folders are
-			// created
-			ContainerDescription containerDescription = ContainerDescription
-					.fromContainer(fileHandle.getParent());
-			containerDescription.getFirstLeafFolder()
-					.addMember(
-							new FileDescription(fileHandle, linkLocation,
-									createFileContentDescription(fileHandle,
-											contents)));
-			resourceDescription = containerDescription;
-		}
-		setResourceDescriptions(new ResourceDescription[] { resourceDescription });
-
-	}
-
-	/*
-	 * Create a file state that represents the desired contents and attributes
-	 * of the file to be created. Used to mimic file history when a resource is
-	 * first created.
-	 */
-	private IFileContentDescription createFileContentDescription(
-			final IFile file, final InputStream contents) {
-		return new IFileContentDescription() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.internal.ide.undo.IFileContentDescription#getContents()
-			 */
-			public InputStream getContents() {
-				if (contents != null) {
-					return contents;
-				}
-				return new ByteArrayInputStream(new byte[0]);
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.internal.ide.undo.IFileContentDescription#getCharset()
-			 */
-			public String getCharset() {
-				try {
-					return file.getCharset(false);
-				} catch (CoreException e) {
-					return null;
-				}
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.internal.ide.undo.IFileContentDescription#exists()
-			 */
-			public boolean exists() {
-				return true;
-			}
-		};
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CreateFolderOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CreateFolderOperation.java
deleted file mode 100644
index 3232561..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CreateFolderOperation.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import java.net.URI;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.ui.internal.ide.undo.ContainerDescription;
-
-/**
- * A CreateFolderOperation represents an undoable operation for creating a
- * folder in the workspace. If a link location is specified, the folder is
- * considered to be linked to the specified location. If a link location is not
- * specified, the folder will be created in the location specified by the
- * handle, and the entire containment path of the folder will be created if it
- * does not exist. Clients may call the public API from a background thread.
- * 
- * This class is intended to be instantiated and used by clients. It is not
- * intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-public class CreateFolderOperation extends AbstractCreateResourcesOperation {
-
-	/**
-	 * Create a CreateFolderOperation
-	 * 
-	 * @param folderHandle
-	 *            the folder to be created
-	 * @param linkLocation
-	 *            the location of the folder if it is to be linked
-	 * @param label
-	 *            the label of the operation
-	 */
-	public CreateFolderOperation(IFolder folderHandle, URI linkLocation,
-			String label) {
-		super(null, label);
-		ContainerDescription containerDescription = ContainerDescription
-				.fromContainer(folderHandle);
-		if (linkLocation != null) {
-			containerDescription.getFirstLeafFolder().setLocation(linkLocation);
-		}
-		setResourceDescriptions(new ResourceDescription[] { containerDescription });
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CreateMarkersOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CreateMarkersOperation.java
deleted file mode 100644
index d8dee43..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CreateMarkersOperation.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ui.internal.ide.undo.MarkerDescription;
-import org.eclipse.ui.internal.ide.undo.UndoMessages;
-
-/**
- * A CreateMarkersOperation represents an undoable operation for creating one or
- * more markers on one or more resources in the workspace. Clients may call the
- * public API from a background thread.
- * 
- * This class is intended to be instantiated and used by clients. It is not
- * intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-public class CreateMarkersOperation extends AbstractMarkersOperation {
-
-	/**
-	 * Create an undoable operation that can create a marker of a specific type
-	 * on a resource.
-	 * 
-	 * @param type
-	 *            the type of marker to be created
-	 * @param attributes
-	 *            the map of attributes that should be assigned to the marker
-	 * @param resource
-	 *            the resource on which the marker should be created
-	 * @param name
-	 *            the name used to describe the operation that creates the
-	 *            marker
-	 * 
-	 * @see org.eclipse.core.resources.IMarker
-	 */
-	public CreateMarkersOperation(String type, Map attributes,
-			IResource resource, String name) {
-		super(null, new MarkerDescription[] { new MarkerDescription(type,
-				attributes, resource) }, null, name);
-	}
-
-	/**
-	 * Create an undoable operation that can create multiple markers of various
-	 * types on multiple resources.
-	 * 
-	 * @param types
-	 *            an array describing the types of markers to be created
-	 * @param attributes
-	 *            an array of maps of attributes that should be assigned to each
-	 *            created marker, corresponding to each marker type described
-	 * @param resources
-	 *            an array of resources describing the resource on which the
-	 *            corresponding marker type should be created
-	 * @param name
-	 *            the name used to describe the operation that creates the
-	 *            markers
-	 */
-	public CreateMarkersOperation(String[] types, Map[] attributes,
-			IResource[] resources, String name) {
-		super(null, null, null, name);
-		MarkerDescription[] markersToCreate = new MarkerDescription[attributes.length];
-		for (int i = 0; i < markersToCreate.length; i++) {
-			markersToCreate[i] = new MarkerDescription(types[i], attributes[i],
-					resources[i]);
-		}
-		setMarkerDescriptions(markersToCreate);
-	}
-
-	/**
-	 * Create an undoable operation that can create multiple markers of a single
-	 * type on multiple resources.
-	 * 
-	 * @param type
-	 *            the type of markers to be created
-	 * @param attributes
-	 *            an array of maps of attributes that should be assigned to each
-	 *            created marker
-	 * @param resources
-	 *            an array of resources describing the resource on which the
-	 *            marker with the corresponding attributes should be created
-	 * @param name
-	 *            the name used to describe the operation that creates the
-	 *            markers
-	 */
-	public CreateMarkersOperation(String type, Map[] attributes,
-			IResource[] resources, String name) {
-		super(null, null, null, name);
-		MarkerDescription[] markersToCreate = new MarkerDescription[attributes.length];
-		for (int i = 0; i < markersToCreate.length; i++) {
-			markersToCreate[i] = new MarkerDescription(type, attributes[i],
-					resources[i]);
-		}
-		setMarkerDescriptions(markersToCreate);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation creates markers
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doExecute(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doExecute(IProgressMonitor monitor, IAdaptable info)
-			throws CoreException {
-		if (monitor == null) {
-			monitor = new NullProgressMonitor();
-		}
-		monitor.beginTask("", 100); //$NON-NLS-1$
-		monitor.setTaskName(UndoMessages.MarkerOperation_CreateProgress);
-		createMarkers(100, monitor);
-		monitor.done();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation deletes markers
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doUndo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doUndo(IProgressMonitor monitor, IAdaptable info)
-			throws CoreException {
-		if (monitor == null) {
-			monitor = new NullProgressMonitor();
-		}
-		monitor.beginTask("", 100); //$NON-NLS-1$
-		monitor.setTaskName(UndoMessages.MarkerOperation_DeleteProgress);
-		deleteMarkers(100, monitor);
-		monitor.done();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation maps the undo status to the deletion status.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractMarkersOperation#getBasicUndoStatus()
-	 */
-	protected IStatus getBasicUndoStatus() {
-		return getMarkerDeletionStatus();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * This implementation maps the redo status to the creation status.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractMarkersOperation#getBasicRedoStatus()
-	 */
-	protected IStatus getBasicRedoStatus() {
-		return getMarkerCreationStatus();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CreateProjectOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CreateProjectOperation.java
deleted file mode 100644
index b25aaf1..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/CreateProjectOperation.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.ui.internal.ide.undo.ProjectDescription;
-
-/**
- * A CreateProjectOperation represents an undoable operation for creating a
- * project in the workspace. Clients may call the public API from a background
- * thread.
- * 
- * This class is intended to be instantiated and used by clients. It is not
- * intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-public class CreateProjectOperation extends AbstractCreateResourcesOperation {
-
-	/**
-	 * Create a CreateProjectOperation
-	 * 
-	 * @param projectDescription
-	 *            the project to be created
-	 * @param label
-	 *            the label of the operation
-	 */
-	public CreateProjectOperation(IProjectDescription projectDescription,
-			String label) {
-		super(new ProjectDescription[] { new ProjectDescription(
-				projectDescription) }, label);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/DeleteMarkersOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/DeleteMarkersOperation.java
deleted file mode 100644
index 99f922f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/DeleteMarkersOperation.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ui.internal.ide.undo.UndoMessages;
-
-/**
- * A DeleteMarkersOperation represents an undoable operation for deleting one or
- * more markers in the workspace. Clients may call the public API from a
- * background thread.
- * 
- * This class is intended to be instantiated and used by clients. It is not
- * intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-public class DeleteMarkersOperation extends AbstractMarkersOperation {
-
-	/**
-	 * Create an undoable operation that can delete the specified markers.
-	 * 
-	 * @param markers
-	 *            the markers to be deleted
-	 * @param name
-	 *            the name used to describe the operation that deletes the
-	 *            markers
-	 */
-	public DeleteMarkersOperation(IMarker[] markers, String name) {
-		super(markers, null, null, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map execution to marker deletion.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doExecute(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doExecute(IProgressMonitor monitor, IAdaptable info)
-			throws CoreException {
-		if (monitor == null) {
-			monitor = new NullProgressMonitor();
-		}
-		monitor.beginTask("", 100); //$NON-NLS-1$
-		monitor.setTaskName(UndoMessages.MarkerOperation_DeleteProgress);
-		deleteMarkers(100, monitor);
-		monitor.done();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map undo to marker creation.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doUndo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doUndo(IProgressMonitor monitor, IAdaptable info)
-			throws CoreException {
-		if (monitor == null) {
-			monitor = new NullProgressMonitor();
-		}
-		monitor.beginTask("", 100); //$NON-NLS-1$
-		monitor.setTaskName(UndoMessages.MarkerOperation_CreateProgress);
-		createMarkers(100, monitor);
-		monitor.done();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map the undo status to marker creation status.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractMarkersOperation#getBasicUndoStatus()
-	 */
-	protected IStatus getBasicUndoStatus() {
-		return getMarkerCreationStatus();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map the redo status to marker deletion status.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractMarkersOperation#getBasicRedoStatus()
-	 */
-	protected IStatus getBasicRedoStatus() {
-		return getMarkerDeletionStatus();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/DeleteResourcesOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/DeleteResourcesOperation.java
deleted file mode 100644
index bd2a202..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/DeleteResourcesOperation.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-
-/**
- * A DeleteResourcesOperation represents an undoable operation for deleting one
- * or more resources in the workspace. Clients may call the public API from a
- * background thread.
- * 
- * This class is intended to be instantiated and used by clients. It is not
- * intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-public class DeleteResourcesOperation extends AbstractResourcesOperation {
-
-	// Whether to delete project content
-	private boolean deleteContent = false;
-
-	/**
-	 * Create a DeleteResourcesOperation
-	 * 
-	 * @param resources
-	 *            the resources to be deleted
-	 * @param label
-	 *            the label of the operation
-	 * @param deleteContent
-	 *            whether or not we are deleting content for projects
-	 */
-	public DeleteResourcesOperation(IResource[] resources, String label,
-			boolean deleteContent) {
-		super(resources, label);
-		this.deleteContent = deleteContent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map execution to resource deletion.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doExecute(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doExecute(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException {
-		delete(monitor, uiInfo, deleteContent);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map undo to resource recreation.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doUndo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doUndo(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException {
-		recreate(monitor, uiInfo);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#updateResourceChangeDescriptionFactory(org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory,
-	 *      int)
-	 */
-	protected boolean updateResourceChangeDescriptionFactory(
-			IResourceChangeDescriptionFactory factory, int operation) {
-		boolean modified = false;
-		if (operation == UNDO) {
-			for (int i = 0; i < resourceDescriptions.length; i++) {
-				if (resourceDescriptions[i] != null) {
-					IResource resource = resourceDescriptions[i]
-							.createResourceHandle();
-					factory.create(resource);
-					modified = true;
-				}
-			}
-		} else {
-			for (int i = 0; i < resources.length; i++) {
-				IResource resource = resources[i];
-				factory.delete(resource);
-				modified = true;
-			}
-		}
-		return modified;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#getExecuteSchedulingRule()
-	 */
-	protected ISchedulingRule getExecuteSchedulingRule() {
-		return super.computeDeleteSchedulingRule();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#getUndoSchedulingRule()
-	 */
-	protected ISchedulingRule getUndoSchedulingRule() {
-		return super.computeCreateSchedulingRule();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map execution status to deletion status. Provide an extra warning if
-	 * project content is to be deleted.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#computeExecutionStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeExecutionStatus(IProgressMonitor monitor) {
-		IStatus status = super.computeExecutionStatus(monitor);
-		if (status.isOK()) {
-			status = computeDeleteStatus();
-		}
-		return status;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map undo status to resource creation status.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#computeUndoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeUndoableStatus(IProgressMonitor monitor) {
-		IStatus status = super.computeUndoableStatus(monitor);
-		if (status.isOK()) {
-			// Recreating should not allow overwriting anything that is there,
-			// because we have no way to restore it.
-			// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=162655
-			status = computeCreateStatus(false);
-		}
-		return status;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map redo status to resource deletion status.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#computeRedoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeRedoableStatus(IProgressMonitor monitor) {
-		IStatus status = super.computeRedoableStatus(monitor);
-		if (status.isOK()) {
-			status = computeDeleteStatus();
-		}
-		return status;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#appendDescriptiveText(java.lang.StringBuffer)
-	 */
-	protected void appendDescriptiveText(StringBuffer text) {
-		super.appendDescriptiveText(text);
-		text.append(" deleteContent: "); //$NON-NLS-1$
-		text.append(deleteContent);
-		text.append('\'');
-	}
-
-	/*
-	 * Overridden so that projects whose contents are not to be deleted will not
-	 * be checked. A better solution would be to add API to ReadOnlyStateChecker
-	 * to specify whether project children should be checked, but it is too late
-	 * to do that now. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=180758
-	 */
-	IStatus checkReadOnlyResources(IResource[] resourcesToCheck) {
-		// If we aren't deleting content of projects, don't bother
-		// checking the read only status of projects or their children.
-		// Clients currently do not mix and match projects and non-projects
-		// in a DeleteResourcesOperation. However, this is not specified
-		// in the API, so assume that there could be mixes.
-		if (!deleteContent) {
-			ArrayList nonProjectResourcesToCheck = new ArrayList();
-			for (int i = 0; i < resourcesToCheck.length; i++) {
-				if (resourcesToCheck[i].getType() != IResource.PROJECT) {
-					nonProjectResourcesToCheck.add(resourcesToCheck[i]);
-				}
-			}
-			if (nonProjectResourcesToCheck.isEmpty()) {
-				return Status.OK_STATUS;
-			}
-			return super
-					.checkReadOnlyResources((IResource[]) nonProjectResourcesToCheck
-							.toArray(new IResource[nonProjectResourcesToCheck
-									.size()]));
-		}
-		// We are deleting project content, so do it the normal way
-		return super.checkReadOnlyResources(resourcesToCheck);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/MoveProjectOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/MoveProjectOperation.java
deleted file mode 100644
index 03fb564..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/MoveProjectOperation.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import java.net.URI;
-
-import org.eclipse.core.filesystem.URIUtil;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.internal.ide.undo.UndoMessages;
-
-/**
- * A MoveProjectOperation represents an undoable operation for moving a
- * project's content to a different location. Clients may call the public API
- * from a background thread.
- * 
- * This class is intended to be instantiated and used by clients. It is not
- * intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-public class MoveProjectOperation extends AbstractCopyOrMoveResourcesOperation {
-
-	private URI projectLocation;
-
-	/**
-	 * Create a MoveProjectOperation that moves the specified project contents
-	 * to a new location.
-	 * 
-	 * @param project
-	 *            the project to be moved
-	 * @param location
-	 *            the location for the project
-	 * @param label
-	 *            the label of the operation
-	 */
-	public MoveProjectOperation(IProject project, URI location, String label) {
-		super(new IResource[] { project }, label);
-		Assert.isLegal(project != null);
-		if (URIUtil.toPath(location).equals(Platform.getLocation())) {
-			projectLocation = null;
-		} else {
-			projectLocation = location;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#updateResourceChangeDescriptionFactory(org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory,
-	 *      int)
-	 */
-	protected boolean updateResourceChangeDescriptionFactory(
-			IResourceChangeDescriptionFactory factory, int operation) {
-		// A change of project location only is not of interest to
-		// model providers, so treat it as if nothing is happening.
-		return false;
-	}
-
-	/*
-	 * Get the project that this operation is moving.
-	 */
-	private IProject getProject() {
-		return (IProject) resources[0];
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.ide.undo.AbstractCopyOrMoveResourcesOperation#isDestinationPathValid(org.eclipse.core.resources.IResource, int)
-	 */
-	protected boolean isDestinationPathValid(IResource resource, int index) {
-		// path has already been validated in #computeMoveOrCopyStatus()
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.ide.undo.AbstractCopyOrMoveResourcesOperation#getProposedName(org.eclipse.core.resources.IResource, int)
-	 */
-	protected String getProposedName(IResource resource, int index) {
-		return getProject().getName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Checks that the specified project location is valid in addition to
-	 * superclass checks.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractCopyOrMoveResourcesOperation#computeMoveOrCopyStatus()
-	 */
-	protected IStatus computeMoveOrCopyStatus() {
-		IStatus status = Status.OK_STATUS;
-		if (projectLocation != null) {
-			status = getWorkspace().validateProjectLocationURI(getProject(),
-					projectLocation);
-		}
-		if (status.isOK()) {
-			return super.computeMoveOrCopyStatus();
-		}
-		return status;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map execute to moving the project
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doExecute(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doExecute(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException {
-		projectLocation = moveProject(getProject(), projectLocation, monitor);
-		// nothing was overwritten
-		setResourceDescriptions(new ResourceDescription[0]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map undo to moving the project.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doUndo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doUndo(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException {
-		doExecute(monitor, uiInfo);
-	}
-	
-	/*
-	 * Move the project to its new location, returning its previous location.
-	 */
-	URI moveProject(IProject project, URI locationURI, IProgressMonitor monitor)
-			throws CoreException {
-		monitor
-				.setTaskName(UndoMessages.AbstractCopyOrMoveResourcesOperation_moveProjectProgress);
-	
-		IProjectDescription description = project.getDescription();
-		// Record the original path so this can be undone
-		URI newDestinationURI = description.getLocationURI();
-		// Set the new location into the project's description
-		description.setLocationURI(locationURI);
-	
-		project.move(description, IResource.FORCE | IResource.SHALLOW, monitor);
-	
-		// Now adjust the projectLocation so this can be undone/redone.
-		return newDestinationURI;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map undo to move status.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#computeUndoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeUndoableStatus(IProgressMonitor monitor) {
-		IStatus status = super.computeUndoableStatus(monitor);
-		if (status.isOK()) {
-			status = computeMoveOrCopyStatus();
-		}
-		return status;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/MoveResourcesOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/MoveResourcesOperation.java
deleted file mode 100644
index 36a10a6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/MoveResourcesOperation.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.ui.internal.ide.undo.UndoMessages;
-
-/**
- * A MoveResourcesOperation represents an undoable operation for moving one or
- * more resources in the workspace. Clients may call the public API from a
- * background thread.
- * 
- * This operation can track any overwritten resources and restore them when the
- * move is undone. It is up to clients to determine whether overwrites are
- * allowed. If a resource should not be overwritten, it should not be included
- * in this operation. In addition to checking for overwrites, the target
- * location for the move is assumed to have already been validated by the
- * client. It will not be revalidated on undo and redo.
- * 
- * This class is intended to be instantiated and used by clients. It is not
- * intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-public class MoveResourcesOperation extends
-		AbstractCopyOrMoveResourcesOperation {
-
-	IResource[] originalResources;
-
-	IPath originalDestination;
-
-	IPath[] originalDestinationPaths;
-
-	/**
-	 * Create a MoveResourcesOperation that moves all of the specified resources
-	 * to the same target location, using their existing names.
-	 * 
-	 * @param resources
-	 *            the resources to be moved
-	 * @param destinationPath
-	 *            the destination path for the resources, not including the name
-	 *            of the moved resource.
-	 * @param label
-	 *            the label of the operation
-	 */
-	public MoveResourcesOperation(IResource[] resources, IPath destinationPath,
-			String label) {
-		super(resources, destinationPath, label);
-		originalResources = this.resources;
-		originalDestination = this.destination;
-		originalDestinationPaths = this.destinationPaths;
-	}
-
-	/**
-	 * Create a MoveResourcesOperation that moves a single resource to a new
-	 * location. The new location includes the name of the resource, so this may
-	 * be used for a move/rename operation or a simple move.
-	 * 
-	 * @param resource
-	 *            the resource to be moved
-	 * @param newPath
-	 *            the new path for the resource, including its desired name.
-	 * @param label
-	 *            the label of the operation
-	 */
-	public MoveResourcesOperation(IResource resource, IPath newPath,
-			String label) {
-		super(new IResource[] { resource }, new IPath[] { newPath }, label);
-		originalResources = this.resources;
-		originalDestination = this.destination;
-		originalDestinationPaths = this.destinationPaths;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map execute to moving the resources
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doExecute(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doExecute(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException {
-		move(monitor, uiInfo);
-	}
-
-	/**
-	 * Move any known resources according to the destination parameters known by
-	 * this operation. Store enough information to undo and redo the operation.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to use for the operation
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * @throws CoreException
-	 *             propagates any CoreExceptions thrown from the resources API
-	 */
-	protected void move(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException {
-
-		monitor.beginTask("", 2000); //$NON-NLS-1$
-		monitor
-				.setTaskName(UndoMessages.AbstractResourcesOperation_MovingResources);
-		List resourcesAtDestination = new ArrayList();
-		List undoDestinationPaths = new ArrayList();
-		List overwrittenResources = new ArrayList();
-
-		for (int i = 0; i < resources.length; i++) {
-			// Move the resources and record the overwrites that would
-			// be restored if this operation were reversed
-			ResourceDescription[] overwrites;
-			overwrites = WorkspaceUndoUtil.move(
-					new IResource[] { resources[i] }, getDestinationPath(
-							resources[i], i), resourcesAtDestination,
-					undoDestinationPaths, new SubProgressMonitor(monitor,
-							1000 / resources.length), uiInfo, true);
-
-			// Accumulate the overwrites into the full list
-			for (int j = 0; j < overwrites.length; j++) {
-				overwrittenResources.add(overwrites[j]);
-			}
-		}
-
-		// Are there any previously overwritten resources to restore now?
-		if (resourceDescriptions != null) {
-			for (int i = 0; i < resourceDescriptions.length; i++) {
-				if (resourceDescriptions[i] != null) {
-					resourceDescriptions[i]
-							.createResource(new SubProgressMonitor(monitor,
-									1000 / resourceDescriptions.length));
-				}
-			}
-		}
-
-		// Reset resource descriptions to the just overwritten resources
-		setResourceDescriptions((ResourceDescription[]) overwrittenResources
-				.toArray(new ResourceDescription[overwrittenResources.size()]));
-
-		// Reset the target resources to refer to the resources in their new
-		// location.
-		setTargetResources((IResource[]) resourcesAtDestination
-				.toArray(new IResource[resourcesAtDestination.size()]));
-		// Reset the destination paths that correspond to these resources
-		destinationPaths = (IPath[]) undoDestinationPaths
-				.toArray(new IPath[undoDestinationPaths.size()]);
-		destination = null;
-
-		monitor.done();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map undo to moving the resources.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doUndo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doUndo(IProgressMonitor monitor, IAdaptable uiInfo)
-			throws CoreException {
-		// We've recorded the original moves atomically, so perform the move
-		move(monitor, uiInfo);
-		// Now reset everything back to the way it was originally.
-		// If we don't do this, the move will be "precisely reversed."
-		// For example, if we merged a folder by moving certain files,
-		// we want redo to redo the folder merge, rather than remembering
-		// only the files that were originally merged. This makes us more
-		// adaptable to changes in the target.
-		setTargetResources(originalResources);
-		this.resourceDescriptions = new ResourceDescription[0];
-		this.destination = originalDestination;
-		this.destinationPaths = originalDestinationPaths;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#updateResourceChangeDescriptionFactory(org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory,
-	 *      int)
-	 */
-	protected boolean updateResourceChangeDescriptionFactory(
-			IResourceChangeDescriptionFactory factory, int operation) {
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
-			factory.move(resource, getDestinationPath(resource, i));
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map undo to move status.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#computeUndoableStatus(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus computeUndoableStatus(IProgressMonitor monitor) {
-		IStatus status = super.computeUndoableStatus(monitor);
-		if (status.isOK()) {
-			status = computeMoveOrCopyStatus();
-		}
-		return status;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/ResourceDescription.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/ResourceDescription.java
deleted file mode 100644
index 4c54366..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/ResourceDescription.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ui.internal.ide.undo.FileDescription;
-import org.eclipse.ui.internal.ide.undo.FolderDescription;
-import org.eclipse.ui.internal.ide.undo.ProjectDescription;
-
-/**
- * ResourceDescription is a lightweight description that describes the common
- * attributes of a resource to be created.
- * 
- * This class is not intended to be extended by clients.
- * 
- * @since 3.3
- * 
- */
-public abstract class ResourceDescription {
-
-	/**
-	 * Create a resource description given the specified resource. The resource
-	 * is assumed to exist.
-	 * 
-	 * @param resource
-	 *            the resource from which a description should be created
-	 * @return the resource description
-	 */
-	public static ResourceDescription fromResource(IResource resource) {
-		if (resource.getType() == IResource.PROJECT) {
-			return new ProjectDescription((IProject) resource);
-		} else if (resource.getType() == IResource.FOLDER) {
-			return new FolderDescription((IFolder) resource);
-		} else if (resource.getType() == IResource.FILE) {
-			return new FileDescription((IFile) resource);
-		} else {
-			throw new IllegalArgumentException();
-		}
-	}
-	
-	/**
-	 * Create a resource handle that can be used to create a resource from this
-	 * resource description. This handle can be used to create the actual
-	 * resource, or to describe the creation to a resource delta factory.
-	 * 
-	 * @return the resource handle that can be used to create a resource from
-	 *         this description
-	 */
-	public abstract IResource createResourceHandle();
-
-	/**
-	 * Get the name of this resource.
-	 * 
-	 * @return the name of the Resource
-	 */
-	public abstract String getName();
-	
-	/**
-	 * Create an existent resource from this resource description.
-	 * 
-	 * @param monitor
-	 *            the progress monitor to use
-	 * @return a resource that has the attributes of this resource description
-	 * @throws CoreException
-	 */
-	public abstract IResource createResource(IProgressMonitor monitor) throws CoreException;
-	
-	/**
-	 * Given a resource handle, create an actual resource with the attributes of
-	 * the receiver resource description.
-	 * 
-	 * @param resource
-	 *            the resource handle
-	 * @param monitor
-	 *            the progress monitor to be used when creating the resource
-	 * @throws CoreException
-	 */
-	public abstract void createExistentResourceFromHandle(IResource resource,
-			IProgressMonitor monitor) throws CoreException;
-	
-	/**
-	 * Return a boolean indicating whether this resource description has enough
-	 * information to create a resource.
-	 * 
-	 * @return <code>true</code> if the resource can be created, and
-	 *         <code>false</code> if it does not have enough information
-	 */
-	public abstract boolean isValid();
-	
-	/**
-	 * Record the appropriate state of this resource description using
-	 * any available resource history.
-	 * 
-	 * @param resource
-	 *            the resource whose state is to be recorded.
-	 * @param monitor
-	 *            the progress monitor to be used
-	 * @throws CoreException
-	 */
-	public abstract void recordStateFromHistory(IResource resource,
-			IProgressMonitor monitor) throws CoreException;
-	
-	/**
-	 * Return a boolean indicating whether this description represents an
-	 * existent resource.
-	 * 
-	 * @param checkMembers
-	 *            Use <code>true</code> if members should also exist in order
-	 *            for this description to be considered existent. A value of
-	 *            <code>false</code> indicates that the existence of members
-	 *            does not matter.
-	 * 
-	 * @return a boolean indicating whether this description represents an
-	 *         existent resource.
-	 */
-	public abstract boolean verifyExistence(boolean checkMembers);
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/UpdateMarkersOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/UpdateMarkersOperation.java
deleted file mode 100644
index e36dae2..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/UpdateMarkersOperation.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ui.internal.ide.undo.UndoMessages;
-
-/**
- * An UpdateMarkersOperation represents an undoable operation for updating one
- * or more markers in the workspace with one or more sets of attributes. Clients
- * may call the public API from a background thread.
- * 
- * This class is intended to be instantiated and used by clients. It is not
- * intended to be subclassed by clients.
- * 
- * @since 3.3
- * 
- */
-public class UpdateMarkersOperation extends AbstractMarkersOperation {
-
-	// Whether attributes should be merged with existing attributes when
-	// updated, or considered to be complete replacements.
-	private boolean mergeAttributes;
-
-	/**
-	 * Create an undoable operation that can update the specified marker with
-	 * the specified attributes.
-	 * 
-	 * @param marker
-	 *            the marker to be updated
-	 * @param attributes
-	 *            the map of attributes to be assigned to the marker. This map
-	 *            does not replace the attribute map of the marker, but instead,
-	 *            each attribute in the map is added or updated with the current
-	 *            value in the map. In other words
-	 * @param name
-	 *            the name used to describe this operation
-	 * @param mergeAttributes
-	 *            <code>true</code> if the specified map of attributes for the
-	 *            marker is to be merged with the attributes already specified
-	 *            for the marker, or <code>false</code> if the specified map
-	 *            of attributes is to be considered a complete replacement of
-	 *            all attributes of the marker
-	 */
-	public UpdateMarkersOperation(IMarker marker, Map attributes, String name,
-			boolean mergeAttributes) {
-		super(new IMarker[] { marker }, null, attributes, name);
-		this.mergeAttributes = mergeAttributes;
-	}
-
-	/**
-	 * Create an undoable operation that updates many markers to have the same
-	 * set of attributes.
-	 * 
-	 * @param markers
-	 *            the markers to be updated
-	 * @param attributes
-	 *            the map of attributes to be assigned to each marker
-	 * @param name
-	 *            the name used to describe this operation
-	 * @param mergeAttributes
-	 *            <code>true</code> if the specified map of attributes for
-	 *            each marker is to be merged with the attributes already
-	 *            specified for that marker, or <code>false</code> if the
-	 *            specified map of attributes is to be considered a complete
-	 *            replacement of all attributes for each marker
-	 */
-	public UpdateMarkersOperation(IMarker[] markers, Map attributes,
-			String name, boolean mergeAttributes) {
-		super(markers, null, attributes, name);
-		this.mergeAttributes = mergeAttributes;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map execution to updating the markers.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doExecute(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doExecute(IProgressMonitor monitor, IAdaptable info)
-			throws CoreException {
-		if (monitor == null) {
-			monitor = new NullProgressMonitor();
-		}
-		monitor.beginTask("", 100); //$NON-NLS-1$
-		monitor.setTaskName(UndoMessages.MarkerOperation_UpdateProgress);
-		updateMarkers(100, monitor, mergeAttributes);
-		monitor.done();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map undo to execute (since both operations update the markers).
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doUndo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	protected void doUndo(IProgressMonitor monitor, IAdaptable info)
-			throws CoreException {
-		// doExecute simply swaps the current and remembered attributes,
-		// so it can also be used for undo
-		doExecute(monitor, info);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map undo status to marker update status.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractMarkersOperation#getBasicUndoStatus()
-	 */
-	protected IStatus getBasicUndoStatus() {
-		return getMarkerUpdateStatus();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * Map redo status to marker update status.
-	 * 
-	 * @see org.eclipse.ui.ide.undo.AbstractMarkersOperation#getBasicRedoStatus()
-	 */
-	protected IStatus getBasicRedoStatus() {
-		return getMarkerUpdateStatus();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/WorkspaceUndoUtil.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/WorkspaceUndoUtil.java
deleted file mode 100644
index c32a40f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/WorkspaceUndoUtil.java
+++ /dev/null
@@ -1,811 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.ide.undo;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.commands.operations.ObjectUndoContext;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceStatus;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.undo.ContainerDescription;
-import org.eclipse.ui.internal.ide.undo.FileDescription;
-import org.eclipse.ui.internal.ide.undo.UndoMessages;
-
-/**
- * WorkspaceUndoUtil defines common utility methods and constants used by
- * clients who create undoable workspace operations.
- * 
- * @since 3.3
- * 
- */
-public class WorkspaceUndoUtil {
-
-	private static ObjectUndoContext tasksUndoContext;
-
-	private static ObjectUndoContext bookmarksUndoContext;
-
-	/**
-	 * Return the undo context that should be used for workspace-wide operations
-	 * 
-	 * @return the undo context suitable for workspace-level operations.
-	 */
-	public static IUndoContext getWorkspaceUndoContext() {
-		return WorkbenchPlugin.getDefault().getOperationSupport()
-				.getUndoContext();
-	}
-
-	/**
-	 * Return the undo context that should be used for operations involving
-	 * tasks.
-	 * 
-	 * @return the tasks undo context
-	 */
-	public static IUndoContext getTasksUndoContext() {
-		if (tasksUndoContext == null) {
-			tasksUndoContext = new ObjectUndoContext(new Object(),
-					"Tasks Context"); //$NON-NLS-1$
-			tasksUndoContext.addMatch(getWorkspaceUndoContext());
-		}
-		return tasksUndoContext;
-	}
-
-	/**
-	 * Return the undo context that should be used for operations involving
-	 * bookmarks.
-	 * 
-	 * @return the bookmarks undo context
-	 */
-	public static IUndoContext getBookmarksUndoContext() {
-		if (bookmarksUndoContext == null) {
-			bookmarksUndoContext = new ObjectUndoContext(new Object(),
-					"Bookmarks Context"); //$NON-NLS-1$
-			bookmarksUndoContext.addMatch(getWorkspaceUndoContext());
-		}
-		return bookmarksUndoContext;
-	}
-
-	/**
-	 * Make an <code>IAdaptable</code> that adapts to the specified shell,
-	 * suitable for passing for passing to any
-	 * {@link org.eclipse.core.commands.operations.IUndoableOperation} or
-	 * {@link org.eclipse.core.commands.operations.IOperationHistory} method
-	 * that requires an {@link org.eclipse.core.runtime.IAdaptable}
-	 * <code>uiInfo</code> parameter.
-	 * 
-	 * @param shell
-	 *            the shell that should be returned by the IAdaptable when asked
-	 *            to adapt a shell. If this parameter is <code>null</code>,
-	 *            the returned shell will also be <code>null</code>.
-	 * 
-	 * @return an IAdaptable that will return the specified shell.
-	 */
-	public static IAdaptable getUIInfoAdapter(final Shell shell) {
-		return new IAdaptable() {
-			public Object getAdapter(Class clazz) {
-				if (clazz == Shell.class) {
-					return shell;
-				}
-				return null;
-			}
-		};
-	}
-
-	private WorkspaceUndoUtil() {
-		// should not construct
-	}
-
-	/**
-	 * Delete all of the specified resources, returning resource descriptions
-	 * that can be used to restore them.
-	 * 
-	 * @param resourcesToDelete
-	 *            an array of resources to be deleted
-	 * @param monitor
-	 *            the progress monitor to use to show the operation's progress
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * 
-	 * @param deleteContent
-	 *            a boolean indicating whether project content should be deleted
-	 *            when a project resource is to be deleted
-	 * @return an array of ResourceDescriptions that can be used to restore the
-	 *         deleted resources.
-	 * @throws CoreException
-	 *             propagates any CoreExceptions thrown from the resources API
-	 */
-	static ResourceDescription[] delete(IResource[] resourcesToDelete,
-			IProgressMonitor monitor, IAdaptable uiInfo, boolean deleteContent)
-			throws CoreException {
-		final List exceptions = new ArrayList();
-		boolean forceOutOfSyncDelete = false;
-		ResourceDescription[] returnedResourceDescriptions = new ResourceDescription[resourcesToDelete.length];
-		monitor.beginTask("", resourcesToDelete.length); //$NON-NLS-1$
-		monitor
-				.setTaskName(UndoMessages.AbstractResourcesOperation_DeleteResourcesProgress);
-		try {
-			for (int i = 0; i < resourcesToDelete.length; ++i) {
-				if (monitor.isCanceled()) {
-					throw new OperationCanceledException();
-				}
-				IResource resource = resourcesToDelete[i];
-				try {
-					returnedResourceDescriptions[i] = delete(resource,
-							new SubProgressMonitor(monitor, 1), uiInfo,
-							forceOutOfSyncDelete, deleteContent);
-				} catch (CoreException e) {
-					if (resource.getType() == IResource.FILE) {
-						IStatus[] children = e.getStatus().getChildren();
-						if (children.length == 1
-								&& children[0].getCode() == IResourceStatus.OUT_OF_SYNC_LOCAL) {
-							int result = queryDeleteOutOfSync(resource, uiInfo);
-
-							if (result == IDialogConstants.YES_ID) {
-								// retry the delete with a force out of sync
-								delete(resource, new SubProgressMonitor(
-										monitor, 1), uiInfo, true,
-										deleteContent);
-							} else if (result == IDialogConstants.YES_TO_ALL_ID) {
-								// all future attempts should force out of
-								// sync
-								forceOutOfSyncDelete = true;
-								delete(resource, new SubProgressMonitor(
-										monitor, 1), uiInfo,
-										forceOutOfSyncDelete, deleteContent);
-							} else if (result == IDialogConstants.CANCEL_ID) {
-								throw new OperationCanceledException();
-							} else {
-								exceptions.add(e);
-							}
-						} else {
-							exceptions.add(e);
-						}
-					} else {
-						exceptions.add(e);
-					}
-				}
-			}
-			IStatus result = createResult(exceptions);
-			if (!result.isOK()) {
-				throw new CoreException(result);
-			}
-		} finally {
-			monitor.done();
-		}
-		return returnedResourceDescriptions;
-	}
-
-	/**
-	 * Copies the resources to the given destination. This method can be called
-	 * recursively to merge folders during folder copy.
-	 * 
-	 * @param resources
-	 *            the resources to be copied
-	 * @param destination
-	 *            the destination path for the resources, relative to the
-	 *            workspace
-	 * @param resourcesAtDestination
-	 *            A list used to record the new copies.
-	 * @param monitor
-	 *            the progress monitor used to show progress
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * @param pathIncludesName
-	 *            a boolean that indicates whether the specified path includes
-	 *            the resource's name at the destination. If this value is
-	 *            <code>true</code>, the destination will contain the desired
-	 *            name of the resource (usually only desired when only one
-	 *            resource is being copied). If this value is <code>false</code>,
-	 *            each resource's name will be appended to the destination.
-	 * @return an array of ResourceDescriptions describing any resources that
-	 *         were overwritten by the copy operation
-	 * @throws CoreException
-	 *             propagates any CoreExceptions thrown from the resources API
-	 */
-	static ResourceDescription[] copy(IResource[] resources, IPath destination,
-			List resourcesAtDestination, IProgressMonitor monitor,
-			IAdaptable uiInfo, boolean pathIncludesName) throws CoreException {
-
-		monitor.beginTask("", resources.length); //$NON-NLS-1$
-		monitor
-				.setTaskName(UndoMessages.AbstractResourcesOperation_CopyingResourcesProgress);
-		List overwrittenResources = new ArrayList();
-		for (int i = 0; i < resources.length; i++) {
-			IResource source = resources[i];
-			IPath destinationPath;
-			if (pathIncludesName) {
-				destinationPath = destination;
-			} else {
-				destinationPath = destination.append(source.getName());
-			}
-			IWorkspaceRoot workspaceRoot = getWorkspaceRoot();
-			IResource existing = workspaceRoot.findMember(destinationPath);
-			if (source.getType() == IResource.FOLDER && existing != null) {
-				// The resource is a folder and it exists in the destination.
-				// Copy its children to the existing destination.
-				if (source.isLinked() == existing.isLinked()) {
-					IResource[] children = ((IContainer) source).members();
-					ResourceDescription[] overwritten = copy(children,
-							destinationPath, resourcesAtDestination,
-							new SubProgressMonitor(monitor, 1), uiInfo, false);
-					// We don't record the copy since this recursive call will
-					// do so. Just record the overwrites.
-					for (int j = 0; j < overwritten.length; j++) {
-						overwrittenResources.add(overwritten[j]);
-					}
-				} else {
-					// delete the destination folder, copying a linked folder
-					// over an unlinked one or vice versa. Fixes bug 28772.
-					ResourceDescription[] deleted = delete(
-							new IResource[] { existing },
-							new SubProgressMonitor(monitor, 0), uiInfo, false);
-					source.copy(destinationPath, IResource.SHALLOW,
-							new SubProgressMonitor(monitor, 1));
-					// Record the copy
-					resourcesAtDestination.add(getWorkspace().getRoot()
-							.findMember(destinationPath));
-					for (int j = 0; j < deleted.length; j++) {
-						overwrittenResources.add(deleted[j]);
-					}
-				}
-			} else {
-				if (existing != null) {
-					if (source.isLinked() == existing.isLinked()) {
-						overwrittenResources.add(copyOverExistingResource(
-								source, existing, new SubProgressMonitor(
-										monitor, 1), uiInfo, false));
-						// Record the "copy"
-						resourcesAtDestination.add(existing);
-					} else {
-						// Copying a linked resource over unlinked or vice
-						// versa. Can't use setContents here. Fixes bug 28772.
-						ResourceDescription[] deleted = delete(
-								new IResource[] { existing },
-								new SubProgressMonitor(monitor, 0), uiInfo,
-								false);
-						source.copy(destinationPath, IResource.SHALLOW,
-								new SubProgressMonitor(monitor, 1));
-						// Record the copy
-						resourcesAtDestination.add(getWorkspace().getRoot()
-								.findMember(destinationPath));
-						for (int j = 0; j < deleted.length; j++) {
-							overwrittenResources.add(deleted[j]);
-						}
-					}
-				} else {
-					// no resources are being overwritten
-					// ensure the destination path exists
-					IPath parentPath = destination;
-					if (pathIncludesName) {
-						parentPath = destination.removeLastSegments(1);
-					}
-					IContainer generatedParent = generateContainers(parentPath);
-					source.copy(destinationPath, IResource.SHALLOW,
-							new SubProgressMonitor(monitor, 1));
-					// Record the copy. If we had to generate a parent
-					// folder, that should be recorded as part of the copy
-					if (generatedParent == null) {
-						resourcesAtDestination.add(getWorkspace().getRoot()
-								.findMember(destinationPath));
-					} else {
-						resourcesAtDestination.add(generatedParent);
-					}
-				}
-
-				if (monitor.isCanceled()) {
-					throw new OperationCanceledException();
-				}
-			}
-		}
-		monitor.done();
-		return (ResourceDescription[]) overwrittenResources
-				.toArray(new ResourceDescription[overwrittenResources.size()]);
-
-	}
-
-	/**
-	 * Moves the resources to the given destination. This method can be called
-	 * recursively to merge folders during folder move.
-	 * 
-	 * @param resources
-	 *            the resources to be moved
-	 * @param destination
-	 *            the destination path for the resources, relative to the
-	 *            workspace
-	 * @param resourcesAtDestination
-	 *            A list used to record each moved resource.
-	 * @param reverseDestinations
-	 *            A list used to record each moved resource's original location
-	 * @param monitor
-	 *            the progress monitor used to show progress
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * @param pathIncludesName
-	 *            a boolean that indicates whether the specified path includes
-	 *            the resource's name at the destination. If this value is
-	 *            <code>true</code>, the destination will contain the desired
-	 *            name of the resource (usually only desired when only one
-	 *            resource is being moved). If this value is <code>false</code>,
-	 *            each resource's name will be appended to the destination.
-	 * @return an array of ResourceDescriptions describing any resources that
-	 *         were overwritten by the move operation
-	 * @throws CoreException
-	 *             propagates any CoreExceptions thrown from the resources API
-	 */
-	static ResourceDescription[] move(IResource[] resources, IPath destination,
-			List resourcesAtDestination, List reverseDestinations,
-			IProgressMonitor monitor, IAdaptable uiInfo,
-			boolean pathIncludesName) throws CoreException {
-
-		monitor.beginTask("", resources.length); //$NON-NLS-1$
-		monitor
-				.setTaskName(UndoMessages.AbstractResourcesOperation_MovingResources);
-		List overwrittenResources = new ArrayList();
-		for (int i = 0; i < resources.length; i++) {
-			IResource source = resources[i];
-			IPath destinationPath;
-			if (pathIncludesName) {
-				destinationPath = destination;
-			} else {
-				destinationPath = destination.append(source.getName());
-			}
-			IWorkspaceRoot workspaceRoot = getWorkspaceRoot();
-			IResource existing = workspaceRoot.findMember(destinationPath);
-			if (source.getType() == IResource.FOLDER && existing != null) {
-				// The resource is a folder and it exists in the destination.
-				// Move its children to the existing destination.
-				if (source.isLinked() == existing.isLinked()) {
-					IResource[] children = ((IContainer) source).members();
-					ResourceDescription[] overwritten = move(children,
-							destinationPath, resourcesAtDestination,
-							reverseDestinations, new SubProgressMonitor(
-									monitor, 1), uiInfo, false);
-					// We don't record the moved resources since the recursive
-					// call has done so. Just record the overwrites.
-					for (int j = 0; j < overwritten.length; j++) {
-						overwrittenResources.add(overwritten[j]);
-					}
-					// Delete the source. No need to record it since it
-					// will get moved back.
-					delete(source, monitor, uiInfo, false, false);
-				} else {
-					// delete the destination folder, moving a linked folder
-					// over an unlinked one or vice versa. Fixes bug 28772.
-					ResourceDescription[] deleted = delete(
-							new IResource[] { existing },
-							new SubProgressMonitor(monitor, 0), uiInfo, false);
-					// Record the original path
-					reverseDestinations.add(source.getFullPath());
-					source.move(destinationPath, IResource.SHALLOW
-							| IResource.KEEP_HISTORY, new SubProgressMonitor(
-							monitor, 1));
-					// Record the resource at its destination
-					resourcesAtDestination.add(getWorkspace().getRoot()
-							.findMember(destinationPath));
-					for (int j = 0; j < deleted.length; j++) {
-						overwrittenResources.add(deleted[j]);
-					}
-				}
-			} else {
-				if (existing != null) {
-					if (source.isLinked() == existing.isLinked()) {
-						// Record the original path
-						reverseDestinations.add(source.getFullPath());
-						overwrittenResources.add(copyOverExistingResource(
-								source, existing, new SubProgressMonitor(
-										monitor, 1), uiInfo, true));
-						resourcesAtDestination.add(existing);
-					} else {
-						// Moving a linked resource over unlinked or vice
-						// versa. Can't use setContents here. Fixes bug 28772.
-						ResourceDescription[] deleted = delete(
-								new IResource[] { existing },
-								new SubProgressMonitor(monitor, 0), uiInfo,
-								false);
-						reverseDestinations.add(source.getFullPath());
-						source.move(destinationPath, IResource.SHALLOW
-								| IResource.KEEP_HISTORY,
-								new SubProgressMonitor(monitor, 1));
-						// Record the resource at its destination
-						resourcesAtDestination.add(getWorkspace().getRoot()
-								.findMember(destinationPath));
-						for (int j = 0; j < deleted.length; j++) {
-							overwrittenResources.add(deleted[j]);
-						}
-					}
-				} else {
-					// No resources are being overwritten.
-					// First record the source path
-					reverseDestinations.add(source.getFullPath());
-					// ensure the destination path exists
-					IPath parentPath = destination;
-					if (pathIncludesName) {
-						parentPath = destination.removeLastSegments(1);
-					}
-
-					IContainer generatedParent = generateContainers(parentPath);
-					source.move(destinationPath, IResource.SHALLOW
-							| IResource.KEEP_HISTORY, new SubProgressMonitor(
-							monitor, 1));
-					// Record the move. If we had to generate a parent
-					// folder, that should be recorded as part of the copy
-					if (generatedParent == null) {
-						resourcesAtDestination.add(getWorkspace().getRoot()
-								.findMember(destinationPath));
-					} else {
-						resourcesAtDestination.add(generatedParent);
-					}
-				}
-
-				if (monitor.isCanceled()) {
-					throw new OperationCanceledException();
-				}
-			}
-		}
-		monitor.done();
-		return (ResourceDescription[]) overwrittenResources
-				.toArray(new ResourceDescription[overwrittenResources.size()]);
-
-	}
-
-	/**
-	 * Recreate the resources from the specified resource descriptions.
-	 * 
-	 * @param resourcesToRecreate
-	 *            the ResourceDescriptions describing resources to be recreated
-	 * @param monitor
-	 *            the progress monitor used to show progress
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * @return an array of resources that were created
-	 * @throws CoreException
-	 *             propagates any CoreExceptions thrown from the resources API
-	 */
-	static IResource[] recreate(ResourceDescription[] resourcesToRecreate,
-			IProgressMonitor monitor, IAdaptable uiInfo) throws CoreException {
-		final List exceptions = new ArrayList();
-		IResource[] resourcesToReturn = new IResource[resourcesToRecreate.length];
-		monitor.beginTask("", resourcesToRecreate.length); //$NON-NLS-1$
-		monitor
-				.setTaskName(UndoMessages.AbstractResourcesOperation_CreateResourcesProgress);
-		try {
-			for (int i = 0; i < resourcesToRecreate.length; ++i) {
-				if (monitor.isCanceled()) {
-					throw new OperationCanceledException();
-				}
-				try {
-					resourcesToReturn[i] = resourcesToRecreate[i]
-							.createResource(new SubProgressMonitor(monitor, 1));
-				} catch (CoreException e) {
-					exceptions.add(e);
-				}
-			}
-			IStatus result = WorkspaceUndoUtil.createResult(exceptions);
-			if (!result.isOK()) {
-				throw new CoreException(result);
-			}
-		} finally {
-			monitor.done();
-		}
-		return resourcesToReturn;
-	}
-
-	/**
-	 * Delete the specified resources, returning a resource description that can
-	 * be used to restore it.
-	 * 
-	 * @param resourceToDelete
-	 *            the resource to be deleted
-	 * @param monitor
-	 *            the progress monitor to use to show the operation's progress
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * @param forceOutOfSyncDelete
-	 *            a boolean indicating whether a resource should be deleted even
-	 *            if it is out of sync with the file system
-	 * @param deleteContent
-	 *            a boolean indicating whether project content should be deleted
-	 *            when a project resource is to be deleted
-	 * @return a ResourceDescription that can be used to restore the deleted
-	 *         resource.
-	 * @throws CoreException
-	 *             propagates any CoreExceptions thrown from the resources API
-	 */
-	static ResourceDescription delete(IResource resourceToDelete,
-			IProgressMonitor monitor, IAdaptable uiInfo,
-			boolean forceOutOfSyncDelete, boolean deleteContent)
-			throws CoreException {
-		ResourceDescription resourceDescription = ResourceDescription
-				.fromResource(resourceToDelete);
-		if (resourceToDelete.getType() == IResource.PROJECT) {
-			// it is a project
-			monitor
-					.setTaskName(UndoMessages.AbstractResourcesOperation_DeleteResourcesProgress);
-			IProject project = (IProject) resourceToDelete;
-			project.delete(deleteContent, forceOutOfSyncDelete, monitor);
-		} else {
-			// if it's not a project, just delete it
-			monitor.beginTask("", 2); //$NON-NLS-1$
-			monitor
-					.setTaskName(UndoMessages.AbstractResourcesOperation_DeleteResourcesProgress);
-			int updateFlags;
-			if (forceOutOfSyncDelete) {
-				updateFlags = IResource.KEEP_HISTORY | IResource.FORCE;
-			} else {
-				updateFlags = IResource.KEEP_HISTORY;
-			}
-			resourceToDelete.delete(updateFlags, new SubProgressMonitor(
-					monitor, 1));
-			resourceDescription.recordStateFromHistory(resourceToDelete,
-					new SubProgressMonitor(monitor, 1));
-			monitor.done();
-		}
-
-		return resourceDescription;
-	}
-
-	/*
-	 * Copy the content of the specified resource to the existing resource,
-	 * returning a ResourceDescription that can be used to restore the original
-	 * content. Do nothing if the resources are not files.
-	 */
-	private static ResourceDescription copyOverExistingResource(
-			IResource source, IResource existing, IProgressMonitor monitor,
-			IAdaptable uiInfo, boolean deleteSourceFile) throws CoreException {
-		if (!(source instanceof IFile && existing instanceof IFile)) {
-			return null;
-		}
-		IFile file = (IFile) source;
-		IFile existingFile = (IFile) existing;
-		monitor
-				.beginTask(
-						UndoMessages.AbstractResourcesOperation_CopyingResourcesProgress,
-						3);
-		if (file != null && existingFile != null) {
-			if (validateEdit(file, existingFile, getShell(uiInfo))) {
-				// Remember the state of the existing file so it can be
-				// restored.
-				FileDescription fileDescription = new FileDescription(
-						existingFile);
-				// Reset the contents to that of the file being moved
-				existingFile.setContents(file.getContents(),
-						IResource.KEEP_HISTORY, new SubProgressMonitor(monitor,
-								1));
-				fileDescription.recordStateFromHistory(existingFile,
-						new SubProgressMonitor(monitor, 1));
-				// Now delete the source file if requested
-				// We don't need to remember anything about it, because
-				// any undo involving this operation will move the original
-				// content back to it.
-				if (deleteSourceFile) {
-					file.delete(IResource.KEEP_HISTORY, new SubProgressMonitor(
-							monitor, 1));
-				}
-				monitor.done();
-				return fileDescription;
-			}
-		}
-		monitor.done();
-		return null;
-	}
-
-	/*
-	 * Check for existence of the specified path and generate any containers
-	 * that do not yet exist. Return any generated containers, or null if no
-	 * container had to be generated.
-	 */
-	private static IContainer generateContainers(IPath path)
-			throws CoreException {
-		IResource container;
-		if (path.segmentCount() == 0) {
-			// nothing to generate
-			return null;
-		}
-		container = getWorkspaceRoot().findMember(path);
-		// Nothing to generate because container exists
-		if (container != null) {
-			return null;
-		}
-
-		// Now make a non-existent handle representing the desired container
-		if (path.segmentCount() == 1) {
-			container = ResourcesPlugin.getWorkspace().getRoot().getProject(
-					path.segment(0));
-		} else {
-			container = ResourcesPlugin.getWorkspace().getRoot()
-					.getFolder(path);
-		}
-		ContainerDescription containerDescription = ContainerDescription
-				.fromContainer((IContainer) container);
-		container = containerDescription.createResourceHandle();
-		containerDescription.createExistentResourceFromHandle(container,
-				new NullProgressMonitor());
-		return (IContainer) container;
-	}
-
-	/*
-	 * Ask the user whether the given resource should be deleted despite being
-	 * out of sync with the file system.
-	 * 
-	 * Return one of the IDialogConstants constants indicating which of the Yes,
-	 * Yes to All, No, Cancel options has been selected by the user.
-	 */
-	private static int queryDeleteOutOfSync(IResource resource,
-			IAdaptable uiInfo) {
-		Shell shell = getShell(uiInfo);
-		final MessageDialog dialog = new MessageDialog(
-				shell,
-				UndoMessages.AbstractResourcesOperation_deletionMessageTitle,
-				null,
-				NLS
-						.bind(
-								UndoMessages.AbstractResourcesOperation_outOfSyncQuestion,
-								resource.getName()), MessageDialog.QUESTION,
-				new String[] { IDialogConstants.YES_LABEL,
-						IDialogConstants.YES_TO_ALL_LABEL,
-						IDialogConstants.NO_LABEL,
-						IDialogConstants.CANCEL_LABEL }, 0);
-		shell.getDisplay().syncExec(new Runnable() {
-			public void run() {
-				dialog.open();
-			}
-		});
-		int result = dialog.getReturnCode();
-		if (result == 0) {
-			return IDialogConstants.YES_ID;
-		}
-		if (result == 1) {
-			return IDialogConstants.YES_TO_ALL_ID;
-		}
-		if (result == 2) {
-			return IDialogConstants.NO_ID;
-		}
-		return IDialogConstants.CANCEL_ID;
-	}
-
-	/*
-	 * Creates and return a result status appropriate for the given list of
-	 * exceptions.
-	 */
-	private static IStatus createResult(List exceptions) {
-		if (exceptions.isEmpty()) {
-			return Status.OK_STATUS;
-		}
-		final int exceptionCount = exceptions.size();
-		if (exceptionCount == 1) {
-			return ((CoreException) exceptions.get(0)).getStatus();
-		}
-		CoreException[] children = (CoreException[]) exceptions
-				.toArray(new CoreException[exceptionCount]);
-		boolean outOfSync = false;
-		for (int i = 0; i < children.length; i++) {
-			if (children[i].getStatus().getCode() == IResourceStatus.OUT_OF_SYNC_LOCAL) {
-				outOfSync = true;
-				break;
-			}
-		}
-		String title = outOfSync ? UndoMessages.AbstractResourcesOperation_outOfSyncError
-				: UndoMessages.AbstractResourcesOperation_deletionExceptionMessage;
-		final MultiStatus multi = new MultiStatus(
-				IDEWorkbenchPlugin.IDE_WORKBENCH, 0, title, null);
-		for (int i = 0; i < exceptionCount; i++) {
-			CoreException exception = children[i];
-			IStatus status = exception.getStatus();
-			multi.add(new Status(status.getSeverity(), status.getPlugin(),
-					status.getCode(), status.getMessage(), exception));
-		}
-		return multi;
-	}
-
-	/*
-	 * Return the workspace.
-	 */
-	private static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/*
-	 * Return the workspace root.
-	 */
-	private static IWorkspaceRoot getWorkspaceRoot() {
-		return getWorkspace().getRoot();
-	}
-
-	/*
-	 * Validate the destination file if it is read-only and additionally the
-	 * source file if both are read-only. Returns true if both files could be
-	 * made writeable.
-	 */
-	private static boolean validateEdit(IFile source, IFile destination,
-			Shell shell) {
-		if (destination.isReadOnly()) {
-			IWorkspace workspace = WorkspaceUndoUtil.getWorkspace();
-			IStatus status;
-			if (source.isReadOnly()) {
-				status = workspace.validateEdit(new IFile[] { source,
-						destination }, shell);
-			} else {
-				status = workspace.validateEdit(new IFile[] { destination },
-						shell);
-			}
-			return status.isOK();
-		}
-		return true;
-	}
-
-	/**
-	 * Return the shell described by the specified adaptable, or the active
-	 * shell if no shell has been specified in the adaptable.
-	 * 
-	 * @param uiInfo
-	 *            the IAdaptable (or <code>null</code>) provided by the
-	 *            caller in order to supply UI information for prompting the
-	 *            user if necessary. When this parameter is not
-	 *            <code>null</code>, it contains an adapter for the
-	 *            org.eclipse.swt.widgets.Shell.class
-	 * 
-	 * @return the Shell that can be used to show information
-	 */
-	public static Shell getShell(IAdaptable uiInfo) {
-		if (uiInfo != null) {
-			Shell shell = (Shell) uiInfo.getAdapter(Shell.class);
-			if (shell != null) {
-				return shell;
-			}
-		}
-		return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/package.html b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/package.html
deleted file mode 100644
index 6ff46ae..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/package.html
+++ /dev/null
@@ -1,36 +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">
-<title>Package-level Javadoc</title>
-</head>
-
-<body>
-APIs that provide undo and redo behavior for operations that manipulate
-the workspace. 
-<h2>Package Specification</h2>
-This package contains APIs for the Eclipse Platform User Interface that
-support the undo and redo of operations that manipulate the workspace.
-Undoable operations that create, delete, move, and copy resources are 
-provided.
-<p>
-The typical usage pattern is that a client creates one of the concrete operations
-and executes it using the platform operation history.  For example, the following
-snippet deletes the project "Blort" without deleting its contents, and adds it
-to the operation history so that it can be undone and redone.
-</p>
-<pre>
-IProject project = getWorkspace().getRoot().getProject("Blort");
-// assume that getMonitor() returns a suitable progress monitor
-project.create(getMonitor());
-project.open(getMonitor());
-DeleteResourcesOperation op = new DeleteResourcesOperation(
-	new IResource[] { project }, "Delete Project Blort", false);
-PlatformUI.getWorkbench().getOperationSupport()
-	.getOperationHistory().execute(operation, getMonitor(), null);
-</pre>
-
-</body>
-
-</html>
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/AboutInfo.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/AboutInfo.java
deleted file mode 100644
index 905672a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/AboutInfo.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.zip.CRC32;
-import java.util.zip.CheckedInputStream;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IBundleGroup;
-import org.eclipse.core.runtime.IBundleGroupProvider;
-import org.eclipse.core.runtime.IProduct;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.internal.BundleGroupProperties;
-import org.eclipse.ui.internal.ProductProperties;
-
-/**
- * The information within this object is obtained from the about INI file.
- * This file resides within an install configurations directory and must be a 
- * standard java property file.  
- * <p>
- * This class is not intended to be instantiated or subclassed by clients.
- * </p>
- */
-public final class AboutInfo {
-    private ProductProperties productProperties;
-
-    private BundleGroupProperties bundleGroupProperties;
-
-    private Long featureImageCRC;
-
-    private boolean calculatedImageCRC = false;
-
-    /**
-     * The information contained in this info will apply to only the argument product.
-     */
-    public AboutInfo(IProduct product) {
-        this.productProperties = new ProductProperties(product);
-    }
-
-    /**
-     * This info object will apply to the argument bundle group.
-     */
-    public AboutInfo(IBundleGroup bundleGroup) {
-        this.bundleGroupProperties = new BundleGroupProperties(bundleGroup);
-    }
-
-    /**
-     * Returns the configuration information for the feature with the given id.
-     * 
-     * @param featureId
-     *            the feature id
-     * @param versionId
-     *            the version id (of the feature)
-     * @return the configuration information for the feature
-     */
-    public static AboutInfo readFeatureInfo(String featureId, String versionId) {
-        Assert.isNotNull(featureId);
-        Assert.isNotNull(versionId);
-
-        // first see if the id matches the product
-        IProduct product = Platform.getProduct();
-        if (product != null
-                && featureId.equals(ProductProperties.getProductId(product))) {
-			return new AboutInfo(product);
-		}
-
-        // then check the bundle groups
-        IBundleGroup bundleGroup = getBundleGroup(featureId, versionId);
-        if (bundleGroup != null) {
-			return new AboutInfo(bundleGroup);
-		}
-
-        return null;
-    }
-
-    private static IBundleGroup getBundleGroup(String id, String versionId) {
-        if (id == null || versionId == null) {
-			return null;
-		}
-
-        IBundleGroupProvider[] providers = Platform.getBundleGroupProviders();
-        for (int p = 0; p < providers.length; ++p) {
-            IBundleGroup[] groups = providers[p].getBundleGroups();
-            for (int g = 0; g < groups.length; ++g) {
-				if (id.equals(groups[g].getIdentifier())
-                        && versionId.equals(groups[g].getVersion())) {
-					return groups[g];
-				}
-			}
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the descriptor for an image which can be shown in an "about" dialog 
-     * for this product. Products designed to run "headless" typically would not 
-     * have such an image.
-     * 
-     * @return the descriptor for an about image, or <code>null</code> if none
-     */
-    public ImageDescriptor getAboutImage() {
-        return productProperties == null ? null : productProperties
-                .getAboutImage();
-    }
-
-    /**
-     * Returns the descriptor for an image which can be shown in an "about features" 
-     * dialog. Products designed to run "headless" typically would not have such an image.
-     * 
-     * @return the descriptor for a feature image, or <code>null</code> if none
-     */
-    public ImageDescriptor getFeatureImage() {
-        return bundleGroupProperties == null ? null : bundleGroupProperties
-                .getFeatureImage();
-    }
-
-    /**
-     * Returns the simple name of the feature image file.
-     * 
-     * @return the simple name of the feature image file,
-     * or <code>null</code> if none
-     */
-    public String getFeatureImageName() {
-        if (bundleGroupProperties == null) {
-			return null;
-		}
-
-        URL url = bundleGroupProperties.getFeatureImageUrl();
-        return url == null ? null : new Path(url.getPath()).lastSegment();
-    }
-
-    /**
-     * Returns the CRC of the feature image as supplied in the properties file.
-     * 
-     * @return the CRC of the feature image, or <code>null</code> if none
-     */
-    public Long getFeatureImageCRC() {
-        if (bundleGroupProperties == null) {
-			return null;
-		}
-
-        if (!calculatedImageCRC) {
-            featureImageCRC = calculateImageCRC(bundleGroupProperties
-                    .getFeatureImageUrl());
-            calculatedImageCRC = featureImageCRC != null;
-        }
-
-        return featureImageCRC;
-    }
-
-    /**
-     * Calculate a CRC for the feature image
-     */
-    private static Long calculateImageCRC(URL url) {
-        if (url == null) {
-			return null;
-		}
-
-        InputStream in = null;
-        try {
-            CRC32 checksum = new CRC32();
-            in = new CheckedInputStream(url.openStream(), checksum);
-
-            // the contents don't matter, the read just needs a place to go
-            byte[] sink = new byte[2048];
-            while (true) {
-				if (in.read(sink) <= 0) {
-					break;
-				}
-			}
-
-            return new Long(checksum.getValue());
-        } catch (IOException e) {
-            return null;
-        } finally {
-            if (in != null) {
-				try {
-                    in.close();
-                } catch (IOException e) {
-                    // do nothing
-                }
-			}
-        }
-    }
-
-    /**
-     * Returns a label for the feature plugn, or <code>null</code>.
-     */
-    public String getFeatureLabel() {
-        if (productProperties != null) {
-			return productProperties.getProductName();
-		}
-        if (bundleGroupProperties != null) {
-			return bundleGroupProperties.getFeatureLabel();
-		}
-        return null;
-    }
-
-    /**
-     * Returns the id for this feature.
-     * 
-     * @return the feature id
-     */
-    public String getFeatureId() {
-        String id = null;
-        if (productProperties != null) {
-			id = productProperties.getProductId();
-		} else if (bundleGroupProperties != null) {
-			id = bundleGroupProperties.getFeatureId();
-		}
-        return id != null ? id : ""; //$NON-NLS-1$ 
-    }
-
-    /**
-     * Returns the text to show in an "about" dialog for this product.
-     * Products designed to run "headless" typically would not have such text.
-     * 
-     * @return the about text, or <code>null</code> if none
-     */
-    public String getAboutText() {
-        return productProperties == null ? null : productProperties
-                .getAboutText();
-    }
-
-    /**
-     * Returns the application name or <code>null</code>.
-     * Note this is never shown to the user.
-     * It is used to initialize the SWT Display.
-     * <p>
-     * On Motif, for example, this can be used
-     * to set the name used for resource lookup.
-     * </p>
-     *
-     * @return the application name, or <code>null</code>
-     * 
-     * @see org.eclipse.swt.widgets.Display#setAppName
-     */
-    public String getAppName() {
-        return productProperties == null ? null : productProperties
-                .getAppName();
-    }
-
-    /**
-     * Returns the product name or <code>null</code>.
-     * This is shown in the window title and the About action.
-     *
-     * @return the product name, or <code>null</code>
-     */
-    public String getProductName() {
-        return productProperties == null ? null : productProperties
-                .getProductName();
-    }
-
-    /**
-     * Returns the provider name or <code>null</code>.
-     *
-     * @return the provider name, or <code>null</code>
-     */
-    public String getProviderName() {
-        return bundleGroupProperties == null ? null : bundleGroupProperties
-                .getProviderName();
-    }
-
-    /**
-     * Returns the feature version id.
-     *
-     * @return the version id of the feature
-     */
-    public String getVersionId() {
-        return bundleGroupProperties == null ? "" : bundleGroupProperties.getFeatureVersion(); //$NON-NLS-1$
-    }
-
-    /**
-     * Returns a <code>URL</code> for the welcome page.
-     * Products designed to run "headless" typically would not have such an page.
-     * 
-     * @return the welcome page, or <code>null</code> if none
-     */
-    public URL getWelcomePageURL() {
-        if (productProperties != null) {
-			return productProperties.getWelcomePageUrl();
-		}
-        if (bundleGroupProperties != null) {
-			return bundleGroupProperties.getWelcomePageUrl();
-		}
-        return null;
-    }
-
-    /**
-     * Returns the ID of a perspective in which to show the welcome page.
-     * May be <code>null</code>.
-     * 
-     * @return the welcome page perspective id, or <code>null</code> if none
-     */
-    public String getWelcomePerspectiveId() {
-        return bundleGroupProperties == null ? null : bundleGroupProperties
-                .getWelcomePerspective();
-    }
-
-    /**
-     * Returns a <code>String</code> for the tips and trick href.
-     * 
-     * @return the tips and tricks href, or <code>null</code> if none
-     */
-    public String getTipsAndTricksHref() {
-        return bundleGroupProperties == null ? null : bundleGroupProperties
-                .getTipsAndTricksHref();
-    }
-
-    /**
-     * Return an array of image descriptors for the window images to use for
-     * this product. The expectations is that the elements will be the same
-     * image rendered at different sizes. Products designed to run "headless"
-     * typically would not have such images.
-     * 
-     * @return an array of the image descriptors for the window images, or
-     *         <code>null</code> if none
-     * @since 3.0
-     */
-    public ImageDescriptor[] getWindowImages() {
-        return productProperties == null ? null : productProperties
-                .getWindowImages();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceData.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceData.java
deleted file mode 100644
index f278513..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceData.java
+++ /dev/null
@@ -1,518 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.net.URL;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.ConfigurationScope;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.osgi.service.datalocation.Location;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.preferences.ScopedPreferenceStore;
-import org.osgi.service.prefs.BackingStoreException;
-import org.osgi.service.prefs.Preferences;
-
-/**
- * This class stores the information behind the "Launch Workspace" dialog. The
- * class is able to read and write itself to a well known configuration file.
- */
-public class ChooseWorkspaceData {
-    /**
-     * The default max length of the recent workspace mru list.
-     */
-    private static final int RECENT_MAX_LENGTH = 5;
-
-    /**
-     * The directory within the config area that will be used for the
-     * receiver's persisted data.
-     */
-    private static final String PERS_FOLDER = "org.eclipse.ui.ide"; //$NON-NLS-1$
-
-    /**
-     * The name of the file within the config area that will be used for
-     * the recever's persisted data.
-     * @see PERS_FOLDER
-     */
-    private static final String PERS_FILENAME = "recentWorkspaces.xml"; //$NON-NLS-1$
-
-    /**
-     * In the past a file was used to store persist these values.  This file was written
-     * with this value as its protocol identifier.
-     */
-    private static final int PERS_ENCODING_VERSION = 1;
-
-    /**
-     * This is the first version of the encode/decode protocol that uses the config area
-     * preference store for persistence.  The only encoding done is to convert the recent
-     * workspace list into a comma-separated list.
-     */
-    private static final int PERS_ENCODING_VERSION_CONFIG_PREFS = 2;
-    
-    /**
-	 * This is the second version of the encode/decode protocol that uses the
-	 * confi area preferences store for persistence. This version is the same as
-	 * the previous version except it uses a \n character to seperate the path
-	 * entries instead of commas. (see bug 98467)
-	 * 
-	 * @since 3.3.1
-	 */
-	private static final int PERS_ENCODING_VERSION_CONFIG_PREFS_NO_COMMAS = 3;
-
-    private boolean showDialog = true;
-
-    private String initialDefault;
-
-    private String selection;
-
-    private String[] recentWorkspaces;
-
-    // xml tags
-    private static interface XML {
-        public static final String PROTOCOL = "protocol"; //$NON-NLS-1$
-
-        public static final String VERSION = "version"; //$NON-NLS-1$
-
-        public static final String ALWAYS_ASK = "alwaysAsk"; //$NON-NLS-1$
-
-        public static final String SHOW_DIALOG = "showDialog"; //$NON-NLS-1$
-
-        public static final String WORKSPACE = "workspace"; //$NON-NLS-1$
-
-        public static final String RECENT_WORKSPACES = "recentWorkspaces"; //$NON-NLS-1$
-
-        public static final String MAX_LENGTH = "maxLength"; //$NON-NLS-1$
-
-        public static final String PATH = "path"; //$NON-NLS-1$
-    }
-
-    /**
-     * Creates a new instance, loading persistent data if its found.
-     */
-    public ChooseWorkspaceData(String initialDefault) {
-        readPersistedData();
-        setInitialDefault(initialDefault);
-    }
-
-    /**
-     * Creates a new instance, loading persistent data if its found.
-     */
-    public ChooseWorkspaceData(URL instanceUrl) {
-        readPersistedData();
-        if (instanceUrl != null) {
-			setInitialDefault(new File(instanceUrl.getFile()).toString());
-		}
-    }
-
-    /**
-     * Return the folder to be used as a default if no other information
-     * exists. Does not return null.
-     */
-    public String getInitialDefault() {
-        if (initialDefault == null) {
-			setInitialDefault(System.getProperty("user.dir") //$NON-NLS-1$
-                    + File.separator + "workspace"); //$NON-NLS-1$
-		}
-        return initialDefault;
-    }
-
-    /**
-     * Set this data's initialDefault parameter to a properly formatted version
-     * of the argument directory string. The proper format is to the platform
-     * appropriate separator character without meaningless leading or trailing
-     * separator characters.
-     */
-    private void setInitialDefault(String dir) {
-        if (dir == null || dir.length() <= 0) {
-            initialDefault = null;
-            return;
-        }
-
-        dir = new Path(dir).toOSString();
-        while (dir.charAt(dir.length() - 1) == File.separatorChar) {
-			dir = dir.substring(0, dir.length() - 1);
-		}
-        initialDefault = dir;
-    }
-
-    /**
-     * Return the currently selected workspace or null if nothing is selected.
-     */
-    public String getSelection() {
-        return selection;
-    }
-
-    /**
-     * Return the currently selected workspace or null if nothing is selected.
-     */
-    public boolean getShowDialog() {
-        return showDialog;
-    }
-
-    /**
-     * Return an array of recent workspaces sorted with the most recently used at
-     * the start.
-     */
-    public String[] getRecentWorkspaces() {
-        return recentWorkspaces;
-    }
-
-    /**
-     * The argument workspace has been selected, update the receiver.  Does not
-     * persist the new values.
-     */
-    public void workspaceSelected(String dir) {
-        // this just stores the selection, it is not inserted and persisted
-        // until the workspace is actually selected
-        selection = dir;
-    }
-
-    /**
-     * Toggle value of the showDialog persistent setting.
-     */
-    public void toggleShowDialog() {
-        showDialog = !showDialog;
-    }
-
-    /**
-	 * Update the persistent store. Call this function after the currently
-	 * selected value has been found to be ok.
-	 */
-	public void writePersistedData() {
-		// 1. get config pref node
-		Preferences node = new ConfigurationScope().getNode(IDEWorkbenchPlugin.IDE_WORKBENCH);
-
-		// 2. get value for showDialog
-		node.putBoolean(
-				IDE.Preferences.SHOW_WORKSPACE_SELECTION_DIALOG,
-				showDialog);
-
-		// 3. use value of numRecent to create proper length array
-		node.putInt(IDE.Preferences.MAX_RECENT_WORKSPACES,
-				recentWorkspaces.length);
-
-		// move the new selection to the front of the list
-		if (selection != null) {
-			String oldEntry = recentWorkspaces[0];
-			recentWorkspaces[0] = selection;
-			for (int i = 1; i < recentWorkspaces.length && oldEntry != null; ++i) {
-				if (selection.equals(oldEntry)) {
-					break;
-				}
-				String tmp = recentWorkspaces[i];
-				recentWorkspaces[i] = oldEntry;
-				oldEntry = tmp;
-			}
-		}
-
-		// 4. store values of recent workspaces into array
-		String encodedRecentWorkspaces = encodeStoredWorkspacePaths(recentWorkspaces);
-		node.put(IDE.Preferences.RECENT_WORKSPACES,
-				encodedRecentWorkspaces);
-
-		// 5. store the protocol version used to encode the list
-		node.putInt(IDE.Preferences.RECENT_WORKSPACES_PROTOCOL,
-				PERS_ENCODING_VERSION_CONFIG_PREFS_NO_COMMAS);
-
-		// 6. store the node
-		try {
-			node.flush();
-		} catch (BackingStoreException e) {
-			// do nothing
-		}
-	}
-
-    /**
-	 * Look for and read data that might have been persisted from some previous
-	 * run. Leave the receiver in a default state if no persistent data is
-	 * found.
-	 * 
-	 * @return true if a file was successfully read and false otherwise
-	 */
-    private boolean readPersistedData_file() {
-	    URL persUrl = null;
-
-	    Location configLoc = Platform.getConfigurationLocation();
-	    if (configLoc != null) {
-			persUrl = getPersistenceUrl(configLoc.getURL(), false);
-		}
-
-	    try {
-	        // inside try to get the safe default creation in the finally
-	        // clause
-	        if (persUrl == null) {
-				return false;
-			}
-
-	        // E.g.,
-	        //	<launchWorkspaceData>
-	        //		<protocol version="1"/>
-	        //      <alwaysAsk showDialog="1"/>
-	        // 		<recentWorkspaces maxLength="5">
-	        //			<workspace path="C:\eclipse\workspace0"/>
-	        //			<workspace path="C:\eclipse\workspace1"/>
-	        //		</recentWorkspaces>
-	        //	</launchWorkspaceData>
-
-	        Reader reader = new FileReader(persUrl.getFile());
-	        XMLMemento memento = XMLMemento.createReadRoot(reader);
-	        if (memento == null || !compatibleFileProtocol(memento)) {
-				return false;
-			}
-
-	        IMemento alwaysAskTag = memento.getChild(XML.ALWAYS_ASK);
-	        showDialog = alwaysAskTag == null ? true : alwaysAskTag.getInteger(
-	                XML.SHOW_DIALOG).intValue() == 1;
-
-	        IMemento recent = memento.getChild(XML.RECENT_WORKSPACES);
-	        if (recent == null) {
-				return false;
-			}
-
-	        Integer maxLength = recent.getInteger(XML.MAX_LENGTH);
-	        int max = RECENT_MAX_LENGTH;
-	        if (maxLength != null) {
-				max = maxLength.intValue();
-			}
-
-	        IMemento indices[] = recent.getChildren(XML.WORKSPACE);
-	        if (indices == null || indices.length <= 0) {
-				return false;
-			}
-
-	        // if a user has edited maxLength to be shorter than the listed
-	        // indices, accept the list (its tougher for them to retype a long
-	        // list of paths than to update a max number)
-	        max = Math.max(max, indices.length);
-
-	        recentWorkspaces = new String[max];
-	        for (int i = 0; i < indices.length; ++i) {
-	            String path = indices[i].getString(XML.PATH);
-	            if (path == null) {
-					break;
-				}
-	            recentWorkspaces[i] = path;
-	        }
-	    } catch (IOException e) {
-	        // cannot log because instance area has not been set
-	        return false;
-	    } catch (WorkbenchException e) {
-	        // cannot log because instance area has not been set
-	        return false;
-	    } finally {
-	        // create safe default if needed
-	        if (recentWorkspaces == null) {
-				recentWorkspaces = new String[RECENT_MAX_LENGTH];
-			}
-	    }
-
-	    return true;
-	}
-
-    /**
-     * Return the current (persisted) value of the "showDialog on startup"
-     * preference. Return the global default if the file cannot be accessed.
-     */
-    public static boolean getShowDialogValue() {
-    	// TODO See the long comment in #readPersistedData -- when the
-		//      transition time is over this method can be changed to
-    	//      read the preference directly.
-
-        ChooseWorkspaceData data = new ChooseWorkspaceData(""); //$NON-NLS-1$
-
-        // return either the value in the file or true, which is the global
-        // default
-        return data.readPersistedData() ? data.showDialog : true;
-    }
-
-    /**
-	 * Return the current (persisted) value of the "showDialog on startup"
-	 * preference. Return the global default if the file cannot be accessed.
-	 */
-	public static void setShowDialogValue(boolean showDialog) {
-		// TODO See the long comment in #readPersistedData -- when the
-		//      transition time is over this method can be changed to
-		//      read the preference directly.
-
-		ChooseWorkspaceData data = new ChooseWorkspaceData(""); //$NON-NLS-1$
-
-		// update the value and write the new settings
-		data.showDialog = showDialog;
-		data.writePersistedData();
-	}
-
-    /**
-	 * Look in the config area preference store for the list of recently used
-	 * workspaces.
-	 * 
-	 * NOTE: During the transition phase the file will be checked if no config
-	 * preferences are found.
-	 * 
-	 * @return true if the values were successfully retrieved and false
-	 *         otherwise
-	 */
-	public boolean readPersistedData() {
-		IPreferenceStore store = new ScopedPreferenceStore(
-				new ConfigurationScope(), IDEWorkbenchPlugin.IDE_WORKBENCH);
-
-		// The old way was to store this information in a file, the new is to
-		// use the configuration area preference store. To help users with the
-		// transition, this code always looks for values in the preference
-		// store; they are used if found. If there aren't any related
-		// preferences, then the file method is used instead. This class always
-		// writes to the preference store, so the fall-back should be needed no
-		// more than once per-user, per-configuration.
-
-		// This code always sets the value of the protocol to a non-zero value
-		// (currently at 2).  If the value comes back as the default (0), then
-		// none of the preferences were set, revert to the file method.
-
-		int protocol = store
-				.getInt(IDE.Preferences.RECENT_WORKSPACES_PROTOCOL);
-		if (protocol == IPreferenceStore.INT_DEFAULT_DEFAULT
-				&& readPersistedData_file()) {
-			return true;
-		}
-
-		// 2. get value for showDialog
-		showDialog = store
-				.getBoolean(IDE.Preferences.SHOW_WORKSPACE_SELECTION_DIALOG);
-
-		// 3. use value of numRecent to create proper length array
-		int max = store
-				.getInt(IDE.Preferences.MAX_RECENT_WORKSPACES);
-		max = Math.max(max, RECENT_MAX_LENGTH);
-
-		// 4. load values of recent workspaces into array
-		String workspacePathPref = store
-				.getString(IDE.Preferences.RECENT_WORKSPACES);
-		recentWorkspaces = decodeStoredWorkspacePaths(protocol, max, workspacePathPref);
-
-		return true;
-	}
-
-	/**
-	 * The the list of recent workspaces must be stored as a string in the preference node.
-	 */
-    private static String encodeStoredWorkspacePaths(String[] recent) {
-		StringBuffer buff = new StringBuffer();
-
-		String path = null;
-		for (int i = 0; i < recent.length; ++i) {
-			if (recent[i] == null) {
-				break;
-			}
-
-			// as of 3.3.1 pump this out using newlines instead of commas
-			if (path != null) {
-				buff.append("\n"); //$NON-NLS-1$
-			}
-
-			path = recent[i];
-			buff.append(path);
-		}
-
-		return buff.toString();
-	}
-
-	/**
-	 * The the preference for recent workspaces must be converted from the
-	 * storage string into an array.
-	 */
-    private static String[] decodeStoredWorkspacePaths(int protocol, int max,
-			String prefValue) {
-		String[] paths = new String[max];
-		if (prefValue == null || prefValue.length() <= 0) {
-			return paths;
-		}
-
-		// if we're using the latest version of the protocol use the newline as a
-		// token.  Otherwise use the older comma.
-		String tokens = null;
-		switch (protocol) {
-			case PERS_ENCODING_VERSION_CONFIG_PREFS_NO_COMMAS :
-				tokens = "\n"; //$NON-NLS-1$
-				break;
-			case PERS_ENCODING_VERSION_CONFIG_PREFS :
-				tokens = ","; //$NON-NLS-1$
-				break;
-		}
-		if (tokens == null) // unknown version? corrupt file? we can't log it
-							// because we dont have a workspace yet...
-			return new String[0];
-			
-
-		StringTokenizer tokenizer = new StringTokenizer(prefValue, tokens);
-		for (int i = 0; i < paths.length && tokenizer.hasMoreTokens(); ++i) {
-			paths[i] = tokenizer.nextToken();
-		}
-
-		return paths;
-	}
-
-    /**
-	 * Return true if the protocol used to encode the argument memento is
-	 * compatible with the receiver's implementation and false otherwise.
-	 */
-    private static boolean compatibleFileProtocol(IMemento memento) {
-        IMemento protocolMemento = memento.getChild(XML.PROTOCOL);
-        if (protocolMemento == null) {
-			return false;
-		}
-
-        Integer version = protocolMemento.getInteger(XML.VERSION);
-        return version != null && version.intValue() == PERS_ENCODING_VERSION;
-    }
-
-    /**
-     * The workspace data is stored in the well known file pointed to by the result
-     * of this method.
-     * @param create If the directory and file does not exist this parameter
-     *               controls whether it will be created.
-     * @return An url to the file and null if it does not exist or could not
-     *         be created.
-     */
-    private static URL getPersistenceUrl(URL baseUrl, boolean create) {
-        if (baseUrl == null) {
-			return null;
-		}
-
-        try {
-            // make sure the directory exists
-            URL url = new URL(baseUrl, PERS_FOLDER);
-            File dir = new File(url.getFile());
-            if (!dir.exists() && (!create || !dir.mkdir())) {
-				return null;
-			}
-
-            // make sure the file exists
-            url = new URL(dir.toURL(), PERS_FILENAME);
-            File persFile = new File(url.getFile());
-            if (!persFile.exists() && (!create || !persFile.createNewFile())) {
-				return null;
-			}
-
-            return persFile.toURL();
-        } catch (IOException e) {
-            // cannot log because instance area has not been set
-            return null;
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceDialog.java
deleted file mode 100644
index 7722654..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceDialog.java
+++ /dev/null
@@ -1,390 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import java.io.File;
-
-import org.eclipse.core.runtime.IProduct;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.osgi.util.TextProcessor;
-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.Point;
-import org.eclipse.swt.graphics.Rectangle;
-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.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Monitor;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A dialog that prompts for a directory to use as a workspace.
- */
-public class ChooseWorkspaceDialog extends TitleAreaDialog {
-	
-	private static final String DIALOG_SETTINGS_SECTION = "ChooseWorkspaceDialogSettings"; //$NON-NLS-1$
-	
-	private ChooseWorkspaceData launchData;
-
-    private Combo text;
-
-    private boolean suppressAskAgain = false;
-
-    private boolean centerOnMonitor = false;
-    /**
-     * Create a modal dialog on the arugment shell, using and updating the
-     * argument data object.
-     * @param parentShell the parent shell for this dialog
-     * @param launchData the launch data from past launches
-     * 
-     * @param suppressAskAgain
-     *            true means the dialog will not have a "don't ask again" button
-     * @param centerOnMonitor indicates whether the dialog should be centered on 
-     * the monitor or according to it's parent if there is one
-     */
-    public ChooseWorkspaceDialog(Shell parentShell,
-            ChooseWorkspaceData launchData, boolean suppressAskAgain, boolean centerOnMonitor) {
-        super(parentShell);
-        this.launchData = launchData;
-        this.suppressAskAgain = suppressAskAgain;
-        this.centerOnMonitor = centerOnMonitor;
-    }
-
-    /**
-     * Show the dialog to the user (if needed). When this method finishes,
-     * #getSelection will return the workspace that should be used (whether it
-     * was just selected by the user or some previous default has been used.
-     * The parameter can be used to override the users preference.  For example,
-     * this is important in cases where the default selection is already in use
-     * and the user is forced to choose a different one.
-     * 
-     * @param force
-     *            true if the dialog should be opened regardless of the value of
-     *            the show dialog checkbox
-     */
-    public void prompt(boolean force) {
-        if (force || launchData.getShowDialog()) {
-            open();
-
-            // 70576: make sure dialog gets dismissed on ESC too
-            if (getReturnCode() == CANCEL) {
-				launchData.workspaceSelected(null);
-			}
-
-            return;
-        }
-
-        String[] recent = launchData.getRecentWorkspaces();
-
-        // If the selection dialog was not used then the workspace to use is either the
-        // most recent selection or the initialDefault (if there is no history).
-        String workspace = null;
-        if (recent != null && recent.length > 0) {
-			workspace = recent[0];
-		}
-        if (workspace == null || workspace.length() == 0) {
-			workspace = launchData.getInitialDefault();
-		}
-        launchData.workspaceSelected(TextProcessor.deprocess(workspace));
-    }
-
-    /**
-     * Creates and returns the contents of the upper part of this dialog (above
-     * the button bar).
-     * <p>
-     * The <code>Dialog</code> implementation of this framework method creates
-     * and returns a new <code>Composite</code> with no margins and spacing.
-     * </p>
-     *
-     * @param parent the parent composite to contain the dialog area
-     * @return the dialog area control
-     */
-    protected Control createDialogArea(Composite parent) {
-        String productName = getWindowTitle();
-
-        Composite composite = (Composite) super.createDialogArea(parent);
-        setTitle(IDEWorkbenchMessages.ChooseWorkspaceDialog_dialogTitle);
-        setMessage(NLS.bind(IDEWorkbenchMessages.ChooseWorkspaceDialog_dialogMessage, productName));
-
-        // bug 59934: load title image for sizing, but set it non-visible so the
-        //            white background is displayed
-        if (getTitleImageLabel() != null) {
-			getTitleImageLabel().setVisible(false);
-		}
-
-        createWorkspaceBrowseRow(composite);
-        if (!suppressAskAgain) {
-			createShowDialogButton(composite);
-		}
-        
-        // look for the eclipse.gcj property.  
-        // If true, then we dont need any warning messages.
-        // someone is asserting that we're okay on GCJ
-        boolean gcj = Boolean.getBoolean("eclipse.gcj"); //$NON-NLS-1$
-		String vmName = System.getProperty("java.vm.name");//$NON-NLS-1$
-		if (!gcj && vmName != null && vmName.indexOf("libgcj") != -1) { //$NON-NLS-1$
-			composite.getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					// set this via an async - if we set it directly the dialog
-					// will
-					// be huge. See bug 223532
-					setMessage(IDEWorkbenchMessages.UnsupportedVM_message,
-							IMessageProvider.WARNING);
-				}
-			});
-		}
-        
-        Dialog.applyDialogFont(composite);
-        return composite;
-    }
-
-	/**
-	 * Returns the title that the dialog (or splash) should have.
-	 * 
-	 * @return the window title
-	 * @since 3.4
-	 */
-	public static String getWindowTitle() {
-		String productName = null;
-		IProduct product = Platform.getProduct();
-		if (product != null) {
-			productName = product.getName();
-		}
-		if (productName == null) {
-			productName = IDEWorkbenchMessages.ChooseWorkspaceDialog_defaultProductName;
-		}
-		return productName;
-	}
-
-    /**
-     * Configures the given shell in preparation for opening this window
-     * in it.
-     * <p>
-     * The default implementation of this framework method
-     * sets the shell's image and gives it a grid layout. 
-     * Subclasses may extend or reimplement.
-     * </p>
-     * 
-     * @param shell the shell
-     */
-    protected void configureShell(Shell shell) {
-        super.configureShell(shell);
-        shell.setText(IDEWorkbenchMessages.ChooseWorkspaceDialog_dialogName);
-    }
-
-    /**
-     * Notifies that the ok button of this dialog has been pressed.
-     * <p>
-     * The <code>Dialog</code> implementation of this framework method sets
-     * this dialog's return code to <code>Window.OK</code>
-     * and closes the dialog. Subclasses may override.
-     * </p>
-     */
-    protected void okPressed() {
-        launchData.workspaceSelected(TextProcessor.deprocess(getWorkspaceLocation()));
-        super.okPressed();
-    }
-
-	/**
-	 * Get the workspace location from the widget.
-	 * @return String
-	 */
-	protected String getWorkspaceLocation() {
-		return text.getText();
-	}
-
-    /**
-     * Notifies that the cancel button of this dialog has been pressed.
-     * <p>
-     * The <code>Dialog</code> implementation of this framework method sets
-     * this dialog's return code to <code>Window.CANCEL</code>
-     * and closes the dialog. Subclasses may override if desired.
-     * </p>
-     */
-    protected void cancelPressed() {
-        launchData.workspaceSelected(null);
-        super.cancelPressed();
-    }
-
-    /**
-     * The main area of the dialog is just a row with the current selection
-     * information and a drop-down of the most recently used workspaces.
-     */
-    private void createWorkspaceBrowseRow(Composite parent) {
-        Composite panel = new Composite(parent, SWT.NONE);
-
-        GridLayout layout = new GridLayout(3, false);
-        layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
-        layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-        layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
-        layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-        panel.setLayout(layout);
-        panel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        panel.setFont(parent.getFont());
-
-        Label label = new Label(panel, SWT.NONE);
-        label.setText(IDEWorkbenchMessages.ChooseWorkspaceDialog_workspaceEntryLabel);
-
-        text = new Combo(panel, SWT.BORDER | SWT.LEAD | SWT.DROP_DOWN);
-        text.setFocus();        
-        text.setLayoutData(new GridData(400, SWT.DEFAULT));
-        text.addModifyListener(new ModifyListener(){
-        	public void modifyText(ModifyEvent e) {
-        		Button okButton = getButton(Window.OK);
-        		if(okButton != null && !okButton.isDisposed()) {
-        			boolean nonWhitespaceFound = false;
-					String characters = getWorkspaceLocation();
-					for (int i = 0; !nonWhitespaceFound
-							&& i < characters.length(); i++) {
-						if (!Character.isWhitespace(characters.charAt(i))) {
-							nonWhitespaceFound = true;
-						}
-					}
-        			okButton.setEnabled(nonWhitespaceFound);
-        		}
-        	}
-        });
-        setInitialTextValues(text);
-
-        Button browseButton = new Button(panel, SWT.PUSH);
-        browseButton.setText(IDEWorkbenchMessages.ChooseWorkspaceDialog_browseLabel);
-        setButtonLayoutData(browseButton);
-        GridData data = (GridData) browseButton.getLayoutData();
-        data.horizontalAlignment = GridData.HORIZONTAL_ALIGN_END;
-        browseButton.setLayoutData(data);
-        browseButton.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                DirectoryDialog dialog = new DirectoryDialog(getShell());
-                dialog.setText(IDEWorkbenchMessages.ChooseWorkspaceDialog_directoryBrowserTitle);
-                dialog.setMessage(IDEWorkbenchMessages.ChooseWorkspaceDialog_directoryBrowserMessage);
-                dialog.setFilterPath(getInitialBrowsePath());
-                String dir = dialog.open();
-                if (dir != null) {
-					text.setText(TextProcessor.process(dir));
-				}
-            }
-        });
-    }
-
-    /**
-     * Return a string containing the path that is closest to the current
-     * selection in the text widget. This starts with the current value and
-     * works toward the root until there is a directory for which File.exists
-     * returns true. Return the current working dir if the text box does not
-     * contain a valid path.
-     * 
-     * @return closest parent that exists or an empty string
-     */
-    private String getInitialBrowsePath() {
-        File dir = new File(getWorkspaceLocation());
-        while (dir != null && !dir.exists()) {
-			dir = dir.getParentFile();
-		}
-
-        return dir != null ? dir.getAbsolutePath() : System
-                .getProperty("user.dir"); //$NON-NLS-1$
-    }
-
-	/*
-	 * see org.eclipse.jface.Window.getInitialLocation() 
-	 */
-	protected Point getInitialLocation(Point initialSize) {
-		Composite parent = getShell().getParent();
-		
-		if (!centerOnMonitor || parent == null) {
-			return super.getInitialLocation(initialSize);
-		}
-
-		Monitor monitor = parent.getMonitor();
-		Rectangle monitorBounds = monitor.getClientArea();
-		Point centerPoint = Geometry.centerPoint(monitorBounds);
-
-		return new Point(centerPoint.x - (initialSize.x / 2), Math.max(
-				monitorBounds.y, Math.min(centerPoint.y
-						- (initialSize.y * 2 / 3), monitorBounds.y
-						+ monitorBounds.height - initialSize.y)));
-	}
-
-    /**
-     * The show dialog button allows the user to choose to neven be nagged again.
-     */
-    private void createShowDialogButton(Composite parent) {
-        Composite panel = new Composite(parent, SWT.NONE);
-        panel.setFont(parent.getFont());
-
-        GridLayout layout = new GridLayout(1, false);
-        layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-        panel.setLayout(layout);
-
-        GridData data = new GridData(GridData.FILL_BOTH);
-        data.verticalAlignment = GridData.END;
-        panel.setLayoutData(data);
-
-        Button button = new Button(panel, SWT.CHECK);
-        button.setText(IDEWorkbenchMessages.ChooseWorkspaceDialog_useDefaultMessage);
-        button.setSelection(!launchData.getShowDialog());
-        button.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                launchData.toggleShowDialog();
-            }
-        });
-    }
-
-    private void setInitialTextValues(Combo text) {
-        String[] recentWorkspaces = launchData.getRecentWorkspaces();
-        for (int i = 0; i < recentWorkspaces.length; ++i) {
-			if (recentWorkspaces[i] != null) {
-				text.add(recentWorkspaces[i]);
-			}
-		}
-
-        text.setText(TextProcessor.process((text.getItemCount() > 0 ? text
-				.getItem(0) : launchData.getInitialDefault())));
-    }
-    
-	/* (non-Javadoc)
-     * @see org.eclipse.jface.window.Dialog#getDialogBoundsSettings()
-     * 
-     * @since 3.2
-     */
-	protected IDialogSettings getDialogBoundsSettings() {
-		// If we were explicitly instructed to center on the monitor, then
-		// do not provide any settings for retrieving a different location or, worse,
-		// saving the centered location.
-		if (centerOnMonitor) {
-			return null;
-		}
-		
-        IDialogSettings settings = IDEWorkbenchPlugin.getDefault().getDialogSettings();
-        IDialogSettings section = settings.getSection(DIALOG_SETTINGS_SECTION);
-        if (section == null) {
-            section = settings.addNewSection(DIALOG_SETTINGS_SECTION);
-        } 
-        return section;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceWithSettingsDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceWithSettingsDialog.java
deleted file mode 100644
index a195b5d..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceWithSettingsDialog.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Rectangle;
-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.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.events.IExpansionListener;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.preferences.SettingsTransfer;
-
-/**
- * The ChooseWorkspaceWithSettingsDialog is the dialog used to switch workspaces
- * with an optional settings export.
- * 
- * @since 3.3
- * 
- */
-public class ChooseWorkspaceWithSettingsDialog extends ChooseWorkspaceDialog {
-
-	private static final String WORKBENCH_SETTINGS = "WORKBENCH_SETTINGS"; //$NON-NLS-1$
-	private static final String ENABLED_TRANSFERS = "ENABLED_TRANSFERS"; //$NON-NLS-1$
-
-	/**
-	 * The class attribute for a settings transfer.
-	 */
-	private static final String ATT_CLASS = "class"; //$NON-NLS-1$
-	/**
-	 * The name attribute for the settings transfer.
-	 */
-	private static final String ATT_NAME = "name"; //$NON-NLS-1$
-	/**
-	 * The id attribute for the settings transfer.
-	 */
-	private static final String ATT_ID = "id"; //$NON-NLS-1$
-	private static final String ATT_HELP_CONTEXT = "helpContext"; //$NON-NLS-1$
-
-	private Collection selectedSettings = new HashSet();
-
-	/**
-	 * Open a new instance of the receiver.
-	 * 
-	 * @param parentShell
-	 * @param launchData
-	 * @param suppressAskAgain
-	 * @param centerOnMonitor
-	 */
-	public ChooseWorkspaceWithSettingsDialog(Shell parentShell,
-			ChooseWorkspaceData launchData, boolean suppressAskAgain,
-			boolean centerOnMonitor) {
-		super(parentShell, launchData, suppressAskAgain, centerOnMonitor);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.ChooseWorkspaceDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Control top = super.createDialogArea(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
-				IIDEHelpContextIds.SWITCH_WORKSPACE_ACTION);
-		createSettingsControls((Composite) top);
-		applyDialogFont(parent);
-		return top;
-
-	}
-
-	/**
-	 * Create the controls for selecting the controls we are going to export.
-	 * 
-	 * @param workArea
-	 */
-	private void createSettingsControls(Composite workArea) {
-		final FormToolkit toolkit = new FormToolkit(workArea.getDisplay());
-		workArea.addDisposeListener(new DisposeListener() {
-
-			public void widgetDisposed(DisposeEvent e) {
-				toolkit.dispose();
-				
-			}});
-		final ScrolledForm form = toolkit.createScrolledForm(workArea);
-		form.setBackground(workArea.getBackground());
-		form.getBody().setLayout(new GridLayout());
-
-		GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
-		form.setLayoutData(layoutData);
-		final ExpandableComposite expandable = toolkit
-				.createExpandableComposite(form.getBody(),
-						ExpandableComposite.TWISTIE);
-		expandable
-				.setText(IDEWorkbenchMessages.ChooseWorkspaceWithSettingsDialog_SettingsGroupName);
-		expandable.setBackground(workArea.getBackground());
-		expandable.setLayout(new GridLayout());
-		expandable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		expandable.addExpansionListener(new IExpansionListener() {
-
-			boolean notExpanded = true;
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.forms.events.IExpansionListener#expansionStateChanged(org.eclipse.ui.forms.events.ExpansionEvent)
-			 */
-			public void expansionStateChanged(ExpansionEvent e) {
-				form.reflow(true);
-				if (e.getState() && notExpanded) {
-					getShell().setRedraw(false);
-					Rectangle shellBounds = getShell().getBounds();
-					int entriesToShow = Math.min(4, SettingsTransfer
-							.getSettingsTransfers().length);
-
-					shellBounds.height += convertHeightInCharsToPixels(entriesToShow)
-							+ IDialogConstants.VERTICAL_SPACING;
-					getShell().setBounds(shellBounds);
-					getShell().setRedraw(true);
-					notExpanded = false;
-				}
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.forms.events.IExpansionListener#expansionStateChanging(org.eclipse.ui.forms.events.ExpansionEvent)
-			 */
-			public void expansionStateChanging(ExpansionEvent e) {
-				// Nothing to do here
-
-			}
-		});
-
-		Composite sectionClient = toolkit.createComposite(expandable);
-		sectionClient.setLayout(new GridLayout());
-		sectionClient.setBackground(workArea.getBackground());
-
-		if (createButtons(toolkit, sectionClient))
-			expandable.setExpanded(true);
-
-		expandable.setClient(sectionClient);
-
-	}
-
-	/**
-	 * Create the buttons for the settings transfer.
-	 * 
-	 * @param toolkit
-	 * @param sectionClient
-	 * @return boolean <code>true</code> if any were selected
-	 */
-	private boolean createButtons(FormToolkit toolkit, Composite sectionClient) {
-
-		IConfigurationElement[] settings = SettingsTransfer
-				.getSettingsTransfers();
-
-		String[] enabledSettings = getEnabledSettings(IDEWorkbenchPlugin
-				.getDefault().getDialogSettings()
-				.getSection(WORKBENCH_SETTINGS));
-
-		for (int i = 0; i < settings.length; i++) {
-			final IConfigurationElement settingsTransfer = settings[i];
-			final Button button = toolkit.createButton(sectionClient,
-					settings[i].getAttribute(ATT_NAME), SWT.CHECK);
-
-			String helpId = settings[i].getAttribute(ATT_HELP_CONTEXT);
-
-			if (helpId != null)
-				PlatformUI.getWorkbench().getHelpSystem().setHelp(button,
-						helpId);
-
-			if (enabledSettings != null && enabledSettings.length > 0) {
-
-				String id = settings[i].getAttribute(ATT_ID);
-				for (int j = 0; j < enabledSettings.length; j++) {
-					if (enabledSettings[j].equals(id)) {
-						button.setSelection(true);
-						selectedSettings.add(settingsTransfer);
-						break;
-					}
-				}
-			}
-
-			button.setBackground(sectionClient.getBackground());
-			button.addSelectionListener(new SelectionAdapter() {
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-				 */
-				public void widgetSelected(SelectionEvent e) {
-					if (button.getSelection())
-						selectedSettings.add(settingsTransfer);
-					else
-						selectedSettings.remove(settingsTransfer);
-				}
-			});
-
-		}
-		return enabledSettings != null && enabledSettings.length > 0;
-	}
-
-	/**
-	 * Get the settings for the receiver based on the entries in section.
-	 * 
-	 * @param section
-	 * @return String[] or <code>null</code>
-	 */
-	private String[] getEnabledSettings(IDialogSettings section) {
-
-		if (section == null)
-			return null;
-
-		return section.getArray(ENABLED_TRANSFERS);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.ChooseWorkspaceDialog#okPressed()
-	 */
-	protected void okPressed() {
-		Iterator settingsIterator = selectedSettings.iterator();
-		MultiStatus result = new MultiStatus(
-				PlatformUI.PLUGIN_ID,
-				IStatus.OK,
-				IDEWorkbenchMessages.ChooseWorkspaceWithSettingsDialog_ProblemsTransferTitle,
-				null);
-
-		IPath path = new Path(getWorkspaceLocation());
-		String[] selectionIDs = new String[selectedSettings.size()];
-		int index = 0;
-
-		while (settingsIterator.hasNext()) {
-			IConfigurationElement elem = (IConfigurationElement) settingsIterator
-					.next();
-			result.add(transferSettings(elem, path));
-			selectionIDs[index] = elem.getAttribute(ATT_ID);
-		}
-		if (result.getSeverity() != IStatus.OK) {
-			ErrorDialog
-					.openError(
-							getShell(),
-							IDEWorkbenchMessages.ChooseWorkspaceWithSettingsDialog_TransferFailedMessage,
-							IDEWorkbenchMessages.ChooseWorkspaceWithSettingsDialog_SaveSettingsFailed,
-							result);
-			return;
-		}
-
-		saveSettings(selectionIDs);
-		super.okPressed();
-	}
-
-	/**
-	 * Save the ids of the selected elements.
-	 * 
-	 * @param selectionIDs
-	 */
-	private void saveSettings(String[] selectionIDs) {
-		IDialogSettings settings = IDEWorkbenchPlugin.getDefault()
-				.getDialogSettings().getSection(WORKBENCH_SETTINGS);
-
-		if (settings == null)
-			settings = IDEWorkbenchPlugin.getDefault().getDialogSettings()
-					.addNewSection(WORKBENCH_SETTINGS);
-
-		settings.put(ENABLED_TRANSFERS, selectionIDs);
-
-	}
-
-	/**
-	 * Take the values from element and execute the class for path.
-	 * 
-	 * @param elem
-	 * @param path
-	 * @return IStatus the result of the settings transfer.
-	 */
-	private IStatus transferSettings(final IConfigurationElement element,
-			final IPath path) {
-
-		final IStatus[] exceptions = new IStatus[1];
-
-		SafeRunner.run(new ISafeRunnable() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-			 */
-			public void run() throws Exception {
-
-				try {
-					SettingsTransfer transfer = (SettingsTransfer) WorkbenchPlugin
-							.createExtension(element, ATT_CLASS);
-					transfer.transferSettings(path);
-				} catch (CoreException exception) {
-					exceptions[0] = exception.getStatus();
-				}
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-			 */
-			public void handleException(Throwable exception) {
-				exceptions[0] = StatusUtil
-						.newStatus(
-								IStatus.ERROR,
-								NLS
-										.bind(
-												IDEWorkbenchMessages.ChooseWorkspaceWithSettingsDialog_ClassCreationFailed,
-												element.getAttribute(ATT_CLASS)),
-								exception);
-
-			}
-		});
-
-		if (exceptions[0] != null)
-			return exceptions[0];
-
-		return Status.OK_STATUS;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsStrategy()
-	 */
-	protected int getDialogBoundsStrategy() {
-		return DIALOG_PERSISTLOCATION;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ContentTypeDecorator.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ContentTypeDecorator.java
deleted file mode 100644
index 6ef105a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ContentTypeDecorator.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.model.WorkbenchFile;
-
-/**
- * Lightweight decorator for more specific file icons.
- * 
- * @since 3.4
- * 
- */
-public class ContentTypeDecorator implements ILightweightLabelDecorator {
-
-	public void decorate(Object element, IDecoration decoration) {
-
-		if (element instanceof IFile == false) {
-			return;
-		}
-		IFile file = (IFile) element;
-		IContentDescription contentDescription = null;
-		try {
-			contentDescription = file.getContentDescription();
-		} catch (CoreException e) {
-			// We already have some kind of icon for this file so it's ok to not
-			// find a better icon.
-		}
-		if (contentDescription != null) {
-			IContentType contentType = contentDescription.getContentType();
-			if (contentType != null) {
-				IWorkbench workbench = PlatformUI.getWorkbench();
-				if (workbench.isClosing()) {
-					return;
-				}
-				ImageDescriptor image = workbench
-						.getEditorRegistry().getImageDescriptor(file.getName(),
-								contentType);
-				if (image != null) {
-					// also add the image descriptor as a session property so that it will be
-					// picked up by the workbench label provider upon the next update.
-					try {
-						file.setSessionProperty(WorkbenchFile.IMAGE_CACHE_KEY, image);
-					} catch (CoreException e) {
-						// ignore - not being able to cache the image is not fatal
-					}
-					decoration.addOverlay(image);
-				}
-			}
-		}
-
-	}
-
-	public void addListener(ILabelProviderListener listener) {
-	}
-
-	public void dispose() {
-	}
-
-	public boolean isLabelProperty(Object element, String property) {
-		return false;
-	}
-
-	public void removeListener(ILabelProviderListener listener) {
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/DefaultContributorResourceAdapter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/DefaultContributorResourceAdapter.java
deleted file mode 100644
index 36dcd0b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/DefaultContributorResourceAdapter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.ui.IContributorResourceAdapter;
-import org.eclipse.ui.ide.IContributorResourceAdapter2;
-
-/**
- * The DefaultContributorResourceAdapter is the default
- * implementation of the IContributorResourceAdapter used for 
- * one to one resource adaption.
- */
-public class DefaultContributorResourceAdapter implements
-        IContributorResourceAdapter2 {
-
-    private static IContributorResourceAdapter singleton;
-
-    /**
-     * Constructor for DefaultContributorResourceAdapter.
-     */
-    public DefaultContributorResourceAdapter() {
-        super();
-    }
-
-    /**
-     * Return the default instance used for TaskList adapting.
-     * @return the default instance used for TaskList adapting
-     */
-    public static IContributorResourceAdapter getDefault() {
-        if (singleton == null) {
-			singleton = new DefaultContributorResourceAdapter();
-		}
-        return singleton;
-    }
-
-    /*
-     * @see IContributorResourceAdapter#getAdaptedResource(IAdaptable)
-     */
-    public IResource getAdaptedResource(IAdaptable adaptable) {
-        return (IResource) adaptable.getAdapter(IResource.class);
-    }
-
-    public ResourceMapping getAdaptedResourceMapping(IAdaptable adaptable) {
-        return (ResourceMapping) adaptable.getAdapter(ResourceMapping.class);
-    }
-}
-
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/DialogUtil.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/DialogUtil.java
deleted file mode 100644
index 1758c25..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/DialogUtil.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PartInitException;
-
-/**
- * Utility class to help with dialogs.
- * <p>
- * Note that a copy of this class exists in the
- * org.eclipse.ui.internal package.
- * </p>
- */
-public class DialogUtil {
-
-    /**
-     * Prevent instantiation.
-     */
-    private DialogUtil() {
-    }
-
-    /**
-     * Open an error style dialog for PartInitException by
-     * including any extra information from the nested
-     * CoreException if present.
-     */
-    public static void openError(Shell parent, String title, String message,
-            PartInitException exception) {
-        // Check for a nested CoreException
-        CoreException nestedException = null;
-        IStatus status = exception.getStatus();
-        if (status != null && status.getException() instanceof CoreException) {
-			nestedException = (CoreException) status.getException();
-		}
-
-        if (nestedException != null) {
-            // Open an error dialog and include the extra
-            // status information from the nested CoreException
-            ErrorDialog.openError(parent, title, message, nestedException
-                    .getStatus());
-        } else {
-            // Open a regular error dialog since there is no
-            // extra information to display
-            MessageDialog.openError(parent, title, message);
-        }
-    }
-
-    /**
-     * Return the number of rows available in the current display using the
-     * current font.
-     * @param parent The Composite whose Font will be queried.
-     * @return int The result of the display size divided by the font size.
-     */
-    public static int availableRows(Composite parent) {
-
-        int fontHeight = (parent.getFont().getFontData())[0].getHeight();
-        int displayHeight = parent.getDisplay().getClientArea().height;
-
-        return displayHeight / fontHeight;
-    }
-
-    /**
-     * Return whether or not the font in the parent is the size of a regular
-     * font.  Typically used to know if a font is smaller than the High Contrast 
-     * Font. This method is used to make layout decisions based on screen space.
-     * 
-     * @param parent The Composite whose Font will be queried.
-     * @return boolean. True if there are more than 50 lines of possible
-     * text in the display.
-     */
-    public static boolean inRegularFontMode(Composite parent) {
-
-        return availableRows(parent) > 50;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/EditorAreaDropAdapter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/EditorAreaDropAdapter.java
deleted file mode 100644
index 6e04090..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/EditorAreaDropAdapter.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetAdapter;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.EditorInputTransfer;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.MarkerTransfer;
-import org.eclipse.ui.part.ResourceTransfer;
-
-/**
- * An editor area drop adapter to handle transfer types
- * <code>EditorInputTransfer</code>, <code>MarkerTransfer</code>,
- * and <code>ResourceTransfer</code>.
- */
-public class EditorAreaDropAdapter extends DropTargetAdapter {
-    private IWorkbenchWindow window;
-
-    /**
-     * Constructs a new EditorAreaDropAdapter.
-     * @param window the workbench window
-     */
-    public EditorAreaDropAdapter(IWorkbenchWindow window) {
-        this.window = window;
-    }
-
-    public void dragEnter(DropTargetEvent event) {
-        // always indicate a copy
-        event.detail = DND.DROP_COPY;
-        event.feedback = DND.FEEDBACK_NONE;
-    }
-
-    public void dragOver(DropTargetEvent event) {
-        // always indicate a copy
-        event.detail = DND.DROP_COPY;
-        event.feedback = DND.FEEDBACK_NONE;
-    }
-
-    public void dragOperationChanged(DropTargetEvent event) {
-        // always indicate a copy
-        event.detail = DND.DROP_COPY;
-        event.feedback = DND.FEEDBACK_NONE;
-    }
-
-    public void drop(final DropTargetEvent event) {
-        Display d = window.getShell().getDisplay();
-        final IWorkbenchPage page = window.getActivePage();
-        if (page != null) {
-            d.asyncExec(new Runnable() {
-                public void run() {
-                    asyncDrop(event, page);
-                }
-            });
-        }
-    }
-
-    private void asyncDrop(DropTargetEvent event, IWorkbenchPage page) {
-
-        /* Open Editor for generic IEditorInput */
-        if (EditorInputTransfer.getInstance().isSupportedType(
-                event.currentDataType)) {
-            /* event.data is an array of EditorInputData, which contains an IEditorInput and 
-             * the corresponding editorId */
-            Assert.isTrue(event.data instanceof EditorInputTransfer.EditorInputData[]);
-            EditorInputTransfer.EditorInputData[] editorInputs = (EditorInputTransfer.EditorInputData []) event.data;
-            for (int i = 0; i < editorInputs.length; i++) {
-                IEditorInput editorInput = editorInputs[i].input;
-                String editorId = editorInputs[i].editorId;
-                openNonExternalEditor(page, editorInput, editorId);
-            }
-        }
-
-        /* Open Editor for Marker (e.g. Tasks, Bookmarks, etc) */
-        else if (MarkerTransfer.getInstance().isSupportedType(
-                event.currentDataType)) {
-            Assert.isTrue(event.data instanceof IMarker[]);
-            IMarker[] markers = (IMarker[]) event.data;
-            for (int i = 0; i < markers.length; i++) {
-                openNonExternalEditor(page, markers[i]);
-            }
-        }
-
-        /* Open Editor for resource */
-        else if (ResourceTransfer.getInstance().isSupportedType(
-                event.currentDataType)) {
-            Assert.isTrue(event.data instanceof IResource[]);
-            IResource[] files = (IResource[]) event.data;
-            for (int i = 0; i < files.length; i++) {
-                if (files[i] instanceof IFile) {
-                    IFile file = (IFile) files[i];
-                    
-                    if (!file.isPhantom())
-                    	openNonExternalEditor(page, file);
-                }
-            }
-        }
-
-        /* Open Editor for file from local file system */
-        else if (FileTransfer.getInstance().isSupportedType(
-                event.currentDataType)) {
-            Assert.isTrue(event.data instanceof String[]);
-            String[] paths = (String[]) event.data;
-            for (int i = 0; i < paths.length; i++) {
-            	IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(paths[i]));
-            	try {
-					IDE.openEditorOnFileStore(page, fileStore);
-				} catch (PartInitException e) {
-					// silently ignore problems opening the editor
-				}
-            }
-        }
-
-    }
-
-    /**
-     * Opens an editor for the given file on the given workbench page in response
-     * to a drop on the workbench editor area. In contrast to other ways of opening
-     * an editor, we never open an external editor in this case (since external
-     * editors appear in their own window and not in the editor area).
-     * The operation fails silently if there is no suitable editor to open.
-     * 
-     * @param page the workbench page
-     * @param file the file to open
-     * @return the editor part that was opened, or <code>null</code> if no editor
-     * was opened
-     */
-    private IEditorPart openNonExternalEditor(IWorkbenchPage page, IFile file) {
-        IEditorPart result;
-        try {
-            // find out which editor we would normal open
-            IEditorDescriptor defaultEditorDesc = IDE.getDefaultEditor(file);
-            if (defaultEditorDesc != null
-                    && !defaultEditorDesc.isOpenExternal()) {
-                // open an internal or in-place editor
-                result = IDE.openEditor(page, file, true);
-            } else {
-                // never open an external editor in response to a drop
-                // check the OS for in-place editor (OLE on Win32)
-                IEditorRegistry editorReg = PlatformUI.getWorkbench()
-                        .getEditorRegistry();
-                IEditorDescriptor editorDesc = null;
-                if (editorReg.isSystemInPlaceEditorAvailable(file.getName())) {
-                    editorDesc = editorReg
-                            .findEditor(IEditorRegistry.SYSTEM_INPLACE_EDITOR_ID);
-                }
-
-                // next lookup the default text editor
-                if (editorDesc == null) {
-                    editorDesc = editorReg
-                            .findEditor(IDEWorkbenchPlugin.DEFAULT_TEXT_EDITOR_ID);
-                }
-
-                // if no valid editor found, bail out
-                if (editorDesc == null) {
-                    throw new PartInitException(IDEWorkbenchMessages.IDE_noFileEditorFound);
-                }
-
-                // open the editor on the file
-                result = page.openEditor(new FileEditorInput(file), editorDesc
-                        .getId(), true);
-            }
-        } catch (PartInitException e) {
-            // silently ignore problems opening the editor
-            result = null;
-        }
-        return result;
-    }
-
-    /**
-     * Opens an editor for the given marker on the given workbench page in response
-     * to a drop on the workbench editor area. In contrast to other ways of opening
-     * an editor, we never open an external editor in this case (since external
-     * editors appear in their own window and not in the editor area).
-     * The operation fails silently if there is no suitable editor to open.
-     * 
-     * @param page the workbench page
-     * @param marker the marker to open
-     * @return the editor part that was opened, or <code>null</code> if no editor
-     * was opened
-     */
-    private IEditorPart openNonExternalEditor(IWorkbenchPage page,
-            IMarker marker) {
-        IEditorPart result;
-        try {
-            // get the marker resource file
-            if (!(marker.getResource() instanceof IFile)) {
-                return null;
-            }
-            IFile file = (IFile) marker.getResource();
-
-            // get the preferred editor id from the marker
-            IEditorDescriptor editorDesc = null;
-            try {
-                String editorID = (String) marker
-                        .getAttribute(IDE.EDITOR_ID_ATTR);
-                if (editorID != null) {
-                    IEditorRegistry editorReg = PlatformUI.getWorkbench()
-                            .getEditorRegistry();
-                    editorDesc = editorReg.findEditor(editorID);
-                }
-            } catch (CoreException e) {
-                // ignore problems with getting the marker
-            }
-
-            // open the editor on the marker resource file
-            if (editorDesc != null && !editorDesc.isOpenExternal()) {
-                result = page.openEditor(new FileEditorInput(file), editorDesc
-                        .getId(), true);
-            } else {
-                result = openNonExternalEditor(page, file);
-            }
-
-            // get the editor to update its position based on the marker
-            if (result != null) {
-                IDE.gotoMarker(result, marker);
-            }
-
-        } catch (PartInitException e) {
-            // silently ignore problems opening the editor
-            result = null;
-        }
-        return result;
-    }
-
-    /**
-     * Opens an editor for the given editor input and editor id combination on the
-     * given workbench page in response to a drop on the workbench editor area.
-     * In contrast to other ways of opening an editor, we never open an external
-     * editor in this case (since external editors appear in their own window and
-     * not in the editor area). The operation fails silently if the editor
-     * cannot be opened.
-     * 
-     * @param page the workbench page
-     * @param editorInput the editor input
-     * @param editorId the editor id
-     * @return the editor part that was opened, or <code>null</code> if no editor
-     * was opened
-     */
-    private IEditorPart openNonExternalEditor(IWorkbenchPage page,
-            IEditorInput editorInput, String editorId) {
-        IEditorPart result;
-        try {
-            IEditorRegistry editorReg = PlatformUI.getWorkbench()
-                    .getEditorRegistry();
-            IEditorDescriptor editorDesc = editorReg.findEditor(editorId);
-            if (editorDesc != null && !editorDesc.isOpenExternal()) {
-                result = page.openEditor(editorInput, editorId);
-            } else {
-                result = null;
-            }
-        } catch (PartInitException e) {
-            // silently ignore problems opening the editor
-            result = null;
-        }
-        return result;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/FeatureSelectionDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/FeatureSelectionDialog.java
deleted file mode 100644
index 3e98fd9..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/FeatureSelectionDialog.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide;
-
-import com.ibm.icu.text.Collator;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Locale;
-
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-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.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.internal.ide.dialogs.SimpleListContentProvider;
-
-/**
- * Dialog to allow the user to select a feature from a list.
- */
-public class FeatureSelectionDialog extends SelectionDialog {
-    /**
-     * List width in characters.
-     */
-    private final static int LIST_WIDTH = 60;
-
-    /**
-     * List height in characters.
-     */
-    private final static int LIST_HEIGHT = 10;
-
-    /**
-     * The feature about infos.
-     */
-    private AboutInfo[] features;
-
-    /**
-     * List to display the resolutions.
-     */
-    private ListViewer listViewer;
-
-    /**
-     * The help context id
-     */
-    private String helpContextId;
-
-    /**
-     * Creates an instance of this dialog to display
-     * the given features.
-     * <p>
-     * There must be at least one feature.
-     * </p>
-     * 
-     * @param shell  the parent shell
-     * @param features  the features to display
-     * @param primaryFeatureId  the id of the primary feature or null if none
-     * @param shellTitle  shell title
-     * @param shellMessage  shell message
-     * @param helpContextId  help context id
-     */
-    public FeatureSelectionDialog(Shell shell, AboutInfo[] features,
-            String primaryFeatureId, String shellTitle, String shellMessage,
-            String helpContextId) {
-
-        super(shell);
-        if (features == null || features.length == 0) {
-            throw new IllegalArgumentException();
-        }
-        this.features = features;
-        this.helpContextId = helpContextId;
-        setTitle(shellTitle);
-        setMessage(shellMessage);
-
-        // Sort ascending
-        Arrays.sort(features, new Comparator() {
-            Collator coll = Collator.getInstance(Locale.getDefault());
-
-            public int compare(Object a, Object b) {
-                AboutInfo i1, i2;
-                String name1, name2;
-                i1 = (AboutInfo) a;
-                name1 = i1.getFeatureLabel();
-                i2 = (AboutInfo) b;
-                name2 = i2.getFeatureLabel();
-                if (name1 == null) {
-					name1 = ""; //$NON-NLS-1$
-				}
-                if (name2 == null) {
-					name2 = ""; //$NON-NLS-1$
-				}
-                return coll.compare(name1, name2);
-            }
-        });
-
-        // Find primary feature
-        for (int i = 0; i < features.length; i++) {
-            if (features[i].getFeatureId().equals(primaryFeatureId)) {
-                setInitialSelections(new Object[] { features[i] });
-                return;
-            }
-        }
-
-        // set a safe default		
-        setInitialSelections(new Object[0]);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Window.
-     */
-    protected void configureShell(Shell newShell) {
-        super.configureShell(newShell);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell,
-				helpContextId);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Dialog.
-     */
-    protected Control createDialogArea(Composite parent) {
-        Composite composite = (Composite) super.createDialogArea(parent);
-
-        // Create label
-        createMessageArea(composite);
-        // Create list viewer	
-        listViewer = new ListViewer(composite, SWT.SINGLE | SWT.H_SCROLL
-                | SWT.V_SCROLL | SWT.BORDER);
-        GridData data = new GridData(GridData.FILL_BOTH);
-        data.heightHint = convertHeightInCharsToPixels(LIST_HEIGHT);
-        data.widthHint = convertWidthInCharsToPixels(LIST_WIDTH);
-        listViewer.getList().setLayoutData(data);
-        listViewer.getList().setFont(parent.getFont());
-        // Set the label provider		
-        listViewer.setLabelProvider(new LabelProvider() {
-            public String getText(Object element) {
-                // Return the features's label.
-                return element == null ? "" : ((AboutInfo) element).getFeatureLabel(); //$NON-NLS-1$
-            }
-        });
-
-        // Set the content provider
-        SimpleListContentProvider cp = new SimpleListContentProvider();
-        cp.setElements(features);
-        listViewer.setContentProvider(cp);
-        listViewer.setInput(new Object());
-        // it is ignored but must be non-null
-
-        // Set the initial selection
-        listViewer.setSelection(new StructuredSelection(
-                getInitialElementSelections()), true);
-
-        // Add a selection change listener
-        listViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-            public void selectionChanged(SelectionChangedEvent event) {
-                // Update OK button enablement
-                getOkButton().setEnabled(!event.getSelection().isEmpty());
-            }
-        });
-
-        // Add double-click listener
-        listViewer.addDoubleClickListener(new IDoubleClickListener() {
-            public void doubleClick(DoubleClickEvent event) {
-                okPressed();
-            }
-        });
-        return composite;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Dialog.
-     */
-    protected void okPressed() {
-        IStructuredSelection selection = (IStructuredSelection) listViewer
-                .getSelection();
-        setResult(selection.toList());
-        super.okPressed();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEInternalPreferences.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEInternalPreferences.java
deleted file mode 100644
index 8041088..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEInternalPreferences.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide;
-
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-
-/**
- * The IDEInternalPreferences are the internal constants used by the Workbench.
- */
-public interface IDEInternalPreferences {
-    // (boolean) Save all dirty editors before running a full or incremental build 
-    public static final String SAVE_ALL_BEFORE_BUILD = "SAVE_ALL_BEFORE_BUILD"; //$NON-NLS-1$
-
-    // (boolean) Refresh workspace on startup 
-    public static final String REFRESH_WORKSPACE_ON_STARTUP = "REFRESH_WORKSPACE_ON_STARTUP"; //$NON-NLS-1$
-
-    // (int) Workspace save interval in minutes
-    // @issue we should drop this and have clients refer to the core preference instead. its not even kept up-to-date if client uses core api directly
-    public final static String SAVE_INTERVAL = "saveInterval"; //$NON-NLS-1$
-
-    public static final int MAX_SAVE_INTERVAL = 9999;
-
-    // (boolean) Show Problems view to users when build contains errors
-    //public static final String SHOW_TASKS_ON_BUILD = "SHOW_TASKS_ON_BUILD"; //$NON-NLS-1$
-
-    // (boolean) Prompt for exit confirmation when last window closed.
-    public static final String EXIT_PROMPT_ON_CLOSE_LAST_WINDOW = "EXIT_PROMPT_ON_CLOSE_LAST_WINDOW"; //$NON-NLS-1$
-
-    // (String) Whether to open the preferred perspective when creating a new project
-    public static final String PROJECT_SWITCH_PERSP_MODE = "SWITCH_PERSPECTIVE_ON_PROJECT_CREATION"; //$NON-NLS-1$
-
-    /**
-     * (String) Whether to open required projects when opening a project.
-     */ 
-    public static final String OPEN_REQUIRED_PROJECTS = "OPEN_REQUIRED_PROJECTS"; //$NON-NLS-1$
-
-    public static final String PSPM_PROMPT = MessageDialogWithToggle.PROMPT;
-
-    public static final String PSPM_ALWAYS = MessageDialogWithToggle.ALWAYS;
-
-    public static final String PSPM_NEVER = MessageDialogWithToggle.NEVER;
-
-    // (boolean) Whether or not to display the Welcome dialog on startup.
-    public static final String WELCOME_DIALOG = "WELCOME_DIALOG"; //$NON-NLS-1$
-    
-    //Whether or not to limit problems
-    public static final String LIMIT_PROBLEMS = "LIMIT_PROBLEMS"; //$NON-NLS-1$
-    
-    //The list of defined problems filters
-    public static final String PROBLEMS_FILTERS = "PROBLEMS_FILTERS"; //$NON-NLS-1$
-    
-    //problem limits
-    public static final String PROBLEMS_LIMIT = "PROBLEMS_LIMIT"; //$NON-NLS-1$
-    
-    //Whether or not to limit tasks
-    public static final String LIMIT_TASKS = "LIMIT_TASKS"; //$NON-NLS-1$
-    
-    //tasks limits
-    public static final String TASKS_LIMIT = "TASKS_LIMIT"; //$NON-NLS-1$
-    
-    //The list of defined tasks filters
-    public static final String TASKS_FILTERS = "TASKS_FILTERS"; //$NON-NLS-1$
-    
-    //Whether or not to limit bookmarks
-    public static final String LIMIT_BOOKMARKS = "LIMIT_BOOKMARKS"; //$NON-NLS-1$
-    
-    //bookmark limits
-    public static final String BOOKMARKS_LIMIT = "BOOKMARKS_LIMIT"; //$NON-NLS-1$
-    
-//  The list of defined tasks filters
-    public static final String BOOKMARKS_FILTERS = "BOOKMARKS_FILTERS"; //$NON-NLS-1$
-    
-    //Enablement of marker limits
-    public static final String USE_MARKER_LIMITS = "USE_MARKER_LIMITS"; //$NON-NLS-1$
-    	
-   	//Value of marker limits
-    public static final String MARKER_LIMITS_VALUE = "MARKER_LIMITS_VALUE"; //$NON-NLS-1$
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEInternalWorkbenchImages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEInternalWorkbenchImages.java
deleted file mode 100644
index c0e317a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEInternalWorkbenchImages.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This class defines internal constants for images that intended to be 
- * available only within the IDE UI proper. Use 
- * <code>IDEInternalWorkbenchImages.getImageDescriptor} to retrieve image
- * descriptors for any of the images named in this class.
- * <p>
- * <b>Note:</b> The existence of these images is not made publically available
- * because such images are subject to change as the dialogs evolve through
- * successive releases.
- * </p>
- */
-public final class IDEInternalWorkbenchImages {
-
-    /** Block instantiation. */
-    private IDEInternalWorkbenchImages() {
-    }
-
-    /*** Constants for Images ***/
-
-    // other toolbar buttons
-    public final static String IMG_ETOOL_BUILD_EXEC = "IMG_ETOOL_BUILD_EXEC"; //$NON-NLS-1$
-
-    public final static String IMG_ETOOL_BUILD_EXEC_HOVER = "IMG_ETOOL_BUILD_EXEC_HOVER"; //$NON-NLS-1$
-
-    public final static String IMG_ETOOL_BUILD_EXEC_DISABLED = "IMG_ETOOL_BUILD_EXEC_DISABLED"; //$NON-NLS-1$
-
-    public final static String IMG_ETOOL_SEARCH_SRC = "IMG_ETOOL_SEARCH_SRC"; //$NON-NLS-1$
-
-    public final static String IMG_ETOOL_SEARCH_SRC_HOVER = "IMG_ETOOL_SEARCH_SRC_HOVER"; //$NON-NLS-1$
-
-    public final static String IMG_ETOOL_SEARCH_SRC_DISABLED = "IMG_ETOOL_SEARCH_SRC_DISABLED"; //$NON-NLS-1$
-
-    public final static String IMG_ETOOL_NEXT_NAV = "IMG_ETOOL_NEXT_NAV"; //$NON-NLS-1$
-
-    public final static String IMG_ETOOL_PREVIOUS_NAV = "IMG_ETOOL_PREVIOUS_NAV"; //$NON-NLS-1$
-
-    public final static String IMG_ETOOL_PROBLEM_CATEGORY = "IMG_ETOOL_PROBLEM_CATEGORY"; //$NON-NLS-1$
-
-    public final static String IMG_LCL_FLAT_LAYOUT = "IMG_LCL_FLAT_LAYOUT"; //$NON-NLS-1$
-    
-    public final static String IMG_LCL_HIERARCHICAL_LAYOUT = "IMG_LCL_HIERARCHICAL_LAYOUT"; //$NON-NLS-1$
-
-    //wizard images
-    public final static String IMG_WIZBAN_NEWPRJ_WIZ = "IMG_WIZBAN_NEWPRJ_WIZ"; //$NON-NLS-1$
-
-    public final static String IMG_WIZBAN_NEWFOLDER_WIZ = "IMG_WIZBAN_NEWFOLDER_WIZ"; //$NON-NLS-1$
-
-    public final static String IMG_WIZBAN_NEWFILE_WIZ = "IMG_WIZBAN_NEWFILE_WIZ"; //$NON-NLS-1$
-
-    public final static String IMG_WIZBAN_IMPORTDIR_WIZ = "IMG_WIZBAN_IMPORTDIR_WIZ"; //$NON-NLS-1$
-
-    public final static String IMG_WIZBAN_IMPORTZIP_WIZ = "IMG_WIZBAN_IMPORTZIP_WIZ"; //$NON-NLS-1$
-
-    public final static String IMG_WIZBAN_EXPORTDIR_WIZ = "IMG_WIZBAN_EXPORTDIR_WIZ"; //$NON-NLS-1$
-
-    public final static String IMG_WIZBAN_EXPORTZIP_WIZ = "IMG_WIZBAN_EXPORTZIP_WIZ"; //$NON-NLS-1$
-
-    public final static String IMG_WIZBAN_RESOURCEWORKINGSET_WIZ = "IMG_WIZBAN_EXPORTZIP_WIZ"; //$NON-NLS-1$
-    
-    public final static String IMG_DLGBAN_SAVEAS_DLG = "IMG_DLGBAN_SAVEAS_DLG"; //$NON-NLS-1$
-    
-    public final static String IMG_DLGBAN_QUICKFIX_DLG = "IMG_DLGBAN_QUICKFIX_DLG"; //$NON-NLS-1$
-
-    // task objects
-    public final static String IMG_OBJS_COMPLETE_TSK = "IMG_OBJS_COMPLETE_TSK"; //$NON-NLS-1$
-
-    public final static String IMG_OBJS_INCOMPLETE_TSK = "IMG_OBJS_INCOMPLETE_TSK"; //$NON-NLS-1$
-    
-    //problems images
-    public static final String IMG_OBJS_ERROR_PATH = "IMG_OBJS_ERROR_PATH"; //$NON-NLS-1$
-
-    public static final String IMG_OBJS_WARNING_PATH = "IMG_OBJS_WARNING_PATH"; //$NON-NLS-1$
-
-    public static final String IMG_OBJS_INFO_PATH = "IMG_OBJS_INFO_PATH"; //$NON-NLS-1$
-
-    // product
-    public final static String IMG_OBJS_DEFAULT_PROD = "IMG_OBJS_DEFAULT_PROD"; //$NON-NLS-1$
-
-    // welcome
-    public final static String IMG_OBJS_WELCOME_ITEM = "IMG_OBJS_WELCOME_ITEM"; //$NON-NLS-1$
-    
-    public final static String IMG_OBJS_WELCOME_BANNER = "IMG_OBJS_WELCOME_BANNER"; //$NON-NLS-1$
-
-    //Quick fix images
-	public static final String IMG_DLCL_QUICK_FIX_DISABLED = "IMG_DLCL_QUICK_FIX_DISABLED";//$NON-NLS-1$
-
-	public static final String IMG_ELCL_QUICK_FIX_ENABLED = "IMG_ELCL_QUICK_FIX_ENABLED"; //$NON-NLS-1$
-
-
-    /**
-     * Returns the image descriptor for the workbench image with the given
-     * symbolic name. Use this method to retrieve image descriptors for any
-     * of the images named in this class.
-     *
-     * @param symbolicName the symbolic name of the image
-     * @return the image descriptor, or <code>null</code> if none
-     */
-    public static ImageDescriptor getImageDescriptor(String symbolicName) {
-        return PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
-                symbolicName);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEPreferenceInitializer.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEPreferenceInitializer.java
deleted file mode 100644
index 7719b3f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEPreferenceInitializer.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.views.markers.MarkerSupportInternalUtilities;
-
-/**
- * The IDEPreferenceInitializer is the preference initializer for the IDE
- * preferences.
- */
-public class IDEPreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-
-		IEclipsePreferences node = new DefaultScope()
-				.getNode(IDEWorkbenchPlugin.getDefault().getBundle()
-						.getSymbolicName());
-
-		// API preferences
-
-		node.put(IDE.Preferences.PROJECT_OPEN_NEW_PERSPECTIVE,
-				IWorkbenchPreferenceConstants.OPEN_PERSPECTIVE_REPLACE);
-
-		// Set the workspace selection dialog to open by default
-		node.putBoolean(IDE.Preferences.SHOW_WORKSPACE_SELECTION_DIALOG, true);
-
-		// Internal preferences
-
-		node.putBoolean(IDEInternalPreferences.SAVE_ALL_BEFORE_BUILD, false);
-		node.putInt(IDEInternalPreferences.SAVE_INTERVAL, 5); // 5 minutes
-		node.putBoolean(IDEInternalPreferences.WELCOME_DIALOG, true);
-		node.putBoolean(IDEInternalPreferences.REFRESH_WORKSPACE_ON_STARTUP,
-				false);
-		node.putBoolean(
-				IDEInternalPreferences.EXIT_PROMPT_ON_CLOSE_LAST_WINDOW, true);
-		node.put(IDEInternalPreferences.PROJECT_SWITCH_PERSP_MODE,
-				IDEInternalPreferences.PSPM_PROMPT);
-		node.put(IDEInternalPreferences.OPEN_REQUIRED_PROJECTS,
-				IDEInternalPreferences.PSPM_PROMPT);
-
-		// Turning some Help Menu separators on
-		node.putBoolean(getHelpSeparatorKey("group.main"), true); //$NON-NLS-1$
-		node.putBoolean(getHelpSeparatorKey("group.assist"), true); //$NON-NLS-1$
-		node.putBoolean(getHelpSeparatorKey("group.updates"), true); //$NON-NLS-1$
-
-		// Set up marker limits
-		node.putBoolean(IDEInternalPreferences.LIMIT_PROBLEMS, true);
-		node.putInt(IDEInternalPreferences.PROBLEMS_LIMIT, 100);
-		
-		node.putBoolean(IDEInternalPreferences.LIMIT_BOOKMARKS, true);
-		node.putInt(IDEInternalPreferences.BOOKMARKS_LIMIT, 100);
-
-		node.putBoolean(IDEInternalPreferences.LIMIT_TASKS, true);
-		node.putInt(IDEInternalPreferences.TASKS_LIMIT, 100);
-		
-		node.putBoolean(IDEInternalPreferences.USE_MARKER_LIMITS, true);
-		node.putInt(IDEInternalPreferences.MARKER_LIMITS_VALUE, 100);
-		
-		//Filter migration
-		node.putBoolean(MarkerSupportInternalUtilities.MIGRATE_BOOKMARK_FILTERS, false);
-		node.putBoolean(MarkerSupportInternalUtilities.MIGRATE_TASK_FILTERS, false);
-		node.putBoolean(MarkerSupportInternalUtilities.MIGRATE_PROBLEM_FILTERS, false);
-	}
-
-	private String getHelpSeparatorKey(String groupId) {
-		return "useSeparator." + IWorkbenchActionConstants.M_HELP + "." + groupId; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDESelectionConversionService.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDESelectionConversionService.java
deleted file mode 100644
index 408d5cf..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDESelectionConversionService.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.resources.mapping.ResourceMappingContext;
-import org.eclipse.core.resources.mapping.ResourceTraversal;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.ide.ResourceUtil;
-import org.eclipse.ui.internal.ISelectionConversionService;
-import org.eclipse.ui.statushandlers.StatusManager;
-
-/**
- * The IDESelectionConversionService is the selection service that uses the
- * resource support available to the IDE.
- * 
- * @since 3.2
- */
-public class IDESelectionConversionService implements
-		ISelectionConversionService {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.SelectionConversionService#convertToResources(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public IStructuredSelection convertToResources(
-			IStructuredSelection originalSelection) {
-
-		List result = new ArrayList();
-		Iterator elements = originalSelection.iterator();
-
-		while (elements.hasNext()) {
-			Object currentElement = elements.next();
-
-			IResource resource = ResourceUtil.getResource(currentElement);
-
-			if (resource == null) {
-
-				ResourceMapping mapping = ResourceUtil
-						.getResourceMapping(currentElement);
-				if (mapping == null)
-					continue;
-
-				ResourceTraversal[] traversals = null;
-				try {
-					traversals = mapping.getTraversals(
-							ResourceMappingContext.LOCAL_CONTEXT,
-							new NullProgressMonitor());
-				} catch (CoreException e) {
-					StatusManager.getManager().handle(e, IDEWorkbenchPlugin.IDE_WORKBENCH);
-				}
-				if (traversals != null) {
-					ResourceTraversal traversal = null;
-					IResource[] resources = null;
-					for (int i = 0; i < traversals.length; i++) {
-						traversal = traversals[i];
-						resources = traversal.getResources();
-						if (resources != null) {
-							for (int j = 0; j < resources.length; j++) {
-								result.add(resources[j]);
-							}
-						}
-					}
-				}
-
-			} else
-				result.add(resource);
-		}
-
-		// all that can be converted are done, answer new selection
-		if (result.isEmpty()) {
-			return StructuredSelection.EMPTY;
-		}
-		return new StructuredSelection(result.toArray());
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchActivityHelper.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchActivityHelper.java
deleted file mode 100644
index 846054a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchActivityHelper.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-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.core.resources.IProject;
-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.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IRegistryChangeEvent;
-import org.eclipse.core.runtime.IRegistryChangeListener;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.IPluginContribution;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.ITriggerPoint;
-import org.eclipse.ui.activities.IWorkbenchActivitySupport;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * Utility class that manages promotion of activites in response to workspace changes.
- * 
- * @since 3.0
- */
-public class IDEWorkbenchActivityHelper {
-
-    private static final String NATURE_POINT = "org.eclipse.ui.ide.natures"; //$NON-NLS-1$
-    
-    /**
-     * Resource listener that reacts to new projects (and associated natures) 
-     * coming into the workspace.
-     */
-    private IResourceChangeListener listener;
-
-    /**
-     * Mapping from composite nature ID to IPluginContribution.  Used for proper
-     * activity mapping of natures.
-     */
-    private Map natureMap;
-
-    /**
-     * Lock for the list of nature ids to be processed.
-     */
-	private final IDEWorkbenchActivityHelper lock;
-	
-	/**
-	 * The update job.
-	 */
-	private WorkbenchJob fUpdateJob;
-	
-	/**
-	 * The collection of natures to process.
-	 */
-	private HashSet fPendingNatureUpdates= new HashSet();
-
-    /**
-     * Singleton instance.
-     */
-    private static IDEWorkbenchActivityHelper singleton;
-
-    /**
-     * Get the singleton instance of this class.
-     * @return the singleton instance of this class.
-     * @since 3.0
-     */
-    public static IDEWorkbenchActivityHelper getInstance() {
-        if (singleton == null) {
-            singleton = new IDEWorkbenchActivityHelper();
-        }
-        return singleton;
-    }
-
-    /**
-     * Create a new <code>IDEWorkbenchActivityHelper</code> which will listen 
-     * for workspace changes and promote activities accordingly.
-     */
-    private IDEWorkbenchActivityHelper() {
-    	lock = this;
-        natureMap = new HashMap();
-        // for dynamic UI
-        Platform.getExtensionRegistry().addRegistryChangeListener(
-                new IRegistryChangeListener() {
-                    public void registryChanged(IRegistryChangeEvent event) {
-                        if (event.getExtensionDeltas(
-                                "org.eclipse.core.resources", "natures").length > 0) { //$NON-NLS-1$ //$NON-NLS-2$
-							loadNatures();
-						}
-                    }
-                }, "org.eclipse.core.resources"); //$NON-NLS-1$
-        loadNatures();
-        listener = getChangeListener();
-        ResourcesPlugin.getWorkspace().addResourceChangeListener(listener);
-        // crawl the initial projects to set up nature bindings
-        IProject[] projects = ResourcesPlugin.getWorkspace().getRoot()
-                .getProjects();
-        processProjects(new HashSet(Arrays.asList(projects)));
-    }
-
-    /**
-     * For dynamic UI.  Clears the cache of known natures and recreates it.
-     */
-    public void loadNatures() {
-        natureMap.clear();
-        IExtensionPoint point = Platform.getExtensionRegistry()
-                .getExtensionPoint("org.eclipse.core.resources.natures"); //$NON-NLS-1$
-        IExtension[] extensions = point.getExtensions();
-        for (int i = 0; i < extensions.length; i++) {
-            IExtension extension = extensions[i];
-            final String localId = extension.getSimpleIdentifier();
-            final String pluginId = extension.getNamespaceIdentifier();
-            String natureId = extension.getUniqueIdentifier();
-            natureMap.put(natureId, new IPluginContribution() {
-                public String getLocalId() {
-                    return localId;
-                }
-
-                public String getPluginId() {
-                    return pluginId;
-                }
-            });
-        }
-    }
-
-    /**
-     * Get a change listener for listening to resource changes.
-     * 
-     * @return the resource change listeners
-     */
-    private IResourceChangeListener getChangeListener() {
-        return new IResourceChangeListener() {
-            /*
-             * (non-Javadoc) @see
-             * org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-             */
-            public void resourceChanged(IResourceChangeEvent event) {
-                if (!WorkbenchActivityHelper.isFiltering()) {
-					return;
-				}
-                IResourceDelta mainDelta = event.getDelta();
-
-                if (mainDelta == null) {
-					return;
-				}
-                //Has the root changed?
-                if (mainDelta.getKind() == IResourceDelta.CHANGED
-						&& mainDelta.getResource().getType() == IResource.ROOT) {
-
-					IResourceDelta[] children = mainDelta.getAffectedChildren();
-					Set projectsToUpdate = new HashSet();
-					for (int i = 0; i < children.length; i++) {
-						IResourceDelta delta = children[i];
-						if (delta.getResource().getType() == IResource.PROJECT) {
-							IProject project = (IProject) delta.getResource();
-
-							if (project.isOpen()) {
-								projectsToUpdate.add(project);
-							}
-						}
-					}
-
-					processProjects(projectsToUpdate);
-				}
-            }
-        };
-    }
-
-
-    /**
-	 * Drain the queue and consult the helper.
-	 */
-	protected void runPendingUpdates() {
-		String[] ids = null;
-		synchronized (lock) {
-			ids = (String[]) fPendingNatureUpdates
-					.toArray(new String[fPendingNatureUpdates.size()]);
-			fPendingNatureUpdates.clear();
-		}
-		IWorkbenchActivitySupport workbenchActivitySupport = PlatformUI
-				.getWorkbench().getActivitySupport();
-		for (int j = 0; j < ids.length; j++) {
-			final IPluginContribution contribution = (IPluginContribution) natureMap
-					.get(ids[j]);
-			if (contribution == null) {
-				continue; // bad nature ID.
-			}
-
-			final ITriggerPoint triggerPoint = workbenchActivitySupport
-					.getTriggerPointManager().getTriggerPoint(NATURE_POINT);
-			// consult the advisor - if the activities need enabling, they will
-			// be
-			WorkbenchActivityHelper.allowUseOf(triggerPoint, contribution);
-		}
-
-	}
-
-	/**
-	 * Unhooks the <code>IResourceChangeListener</code>.
-	 */
-    public void shutdown() {
-        if (listener != null) {
-            ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-                    listener);
-        }
-    }
-
-	/**
-	 * @param projectsToUpdate
-	 */
-	private void processProjects(Set projectsToUpdate) {
-		boolean needsUpdate = false;
-		for (Iterator i = projectsToUpdate.iterator(); i.hasNext();) {
-			try {
-				IProject project = (IProject) i.next();
-				String[] ids = project.getDescription().getNatureIds();
-				if (ids.length == 0) {
-					continue;
-				}
-
-				synchronized (lock) {
-					needsUpdate = fPendingNatureUpdates.addAll(Arrays
-							.asList(ids)) | needsUpdate;
-				}
-
-			} catch (CoreException e) {
-				// Do nothing if there is a CoreException
-			}
-		}
-		if (needsUpdate) {
-			if (fUpdateJob == null) {
-				fUpdateJob = new WorkbenchJob(IDEWorkbenchMessages.IDEWorkbenchActivityHelper_jobName) { 
-					public IStatus runInUIThread(
-							IProgressMonitor monitor) {
-						runPendingUpdates();
-						return Status.OK_STATUS;
-					}
-				};
-				fUpdateJob.setSystem(true);
-			}
-			fUpdateJob.schedule();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchErrorHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchErrorHandler.java
deleted file mode 100644
index b2d3e23..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchErrorHandler.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.internal.ide.dialogs.InternalErrorDialog;
-import org.eclipse.ui.progress.IProgressConstants;
-import org.eclipse.ui.progress.UIJob;
-import org.eclipse.ui.statushandlers.StatusAdapter;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.statushandlers.WorkbenchErrorHandler;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * This is the IDE workbench error handler. The instance of this handler is
- * returned from IDEWorkbenchAdvisor#getWorkbenchErrorHandler(). All handled
- * statuses are checked against severity and logged using logging facility (by
- * superclass).
- * 
- * @since 3.3
- */
-public class IDEWorkbenchErrorHandler extends WorkbenchErrorHandler {
-
-	private int exceptionCount = 0;
-
-	static private FatalErrorDialog dialog;
-
-	private boolean closing = false;
-
-	private IWorkbenchConfigurer workbenchConfigurer;
-
-	// Pre-load all Strings trying to run as light as possible in case of fatal
-	// errors.
-	private static String MSG_OutOfMemoryError = IDEWorkbenchMessages.FatalError_OutOfMemoryError;
-
-	private static String MSG_StackOverflowError = IDEWorkbenchMessages.FatalError_StackOverflowError;
-
-	private static String MSG_VirtualMachineError = IDEWorkbenchMessages.FatalError_VirtualMachineError;
-
-	private static String MSG_SWTError = IDEWorkbenchMessages.FatalError_SWTError;
-
-	private static String MSG_FATAL_ERROR = IDEWorkbenchMessages.FatalError;
-
-	private static String MSG_FATAL_ERROR_Recursive = IDEWorkbenchMessages.FatalError_RecursiveError;
-
-	private static String MSG_FATAL_ERROR_Title = IDEWorkbenchMessages.InternalError;
-
-	/**
-	 * @param configurer
-	 */
-	public IDEWorkbenchErrorHandler(IWorkbenchConfigurer configurer) {
-		workbenchConfigurer = configurer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.statushandlers.WorkbenchErrorHandler#handle(org.eclipse.ui.statushandlers.StatusAdapter,
-	 *      int)
-	 */
-	public void handle(final StatusAdapter statusAdapter, int style) {
-
-		// if fatal error occurs, we will show the blocking error dialog anyway
-		if (isFatal(statusAdapter)) {
-			if (statusAdapter
-					.getProperty(IProgressConstants.NO_IMMEDIATE_ERROR_PROMPT_PROPERTY) == Boolean.TRUE) {
-				statusAdapter.setProperty(
-						IProgressConstants.NO_IMMEDIATE_ERROR_PROMPT_PROPERTY,
-						Boolean.FALSE);
-			}
-			super.handle(statusAdapter, style | StatusManager.BLOCK);
-		} else {
-			super.handle(statusAdapter, style);
-		}
-
-		// if fatal error occurs, we will ask to close the workbench
-		if (isFatal(statusAdapter) && style != StatusManager.NONE) {
-			UIJob handlingExceptionJob = new UIJob("IDE Exception Handler") //$NON-NLS-1$
-			{
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
-				 */
-				public IStatus runInUIThread(IProgressMonitor monitor) {
-					handleException(statusAdapter.getStatus().getException());
-					return new Status(
-							IStatus.OK,
-							IDEWorkbenchPlugin.IDE_WORKBENCH,
-							IDEWorkbenchMessages.IDEExceptionHandler_ExceptionHandledMessage);
-				}
-
-			};
-
-			handlingExceptionJob.setSystem(true);
-			handlingExceptionJob.schedule();
-		}
-	}
-
-	private boolean isFatal(final StatusAdapter statusAdapter) {
-		if (statusAdapter.getStatus().getException() != null
-				&& (statusAdapter.getStatus().getException() instanceof OutOfMemoryError
-						|| statusAdapter.getStatus().getException() instanceof StackOverflowError
-						|| statusAdapter.getStatus().getException() instanceof VirtualMachineError || statusAdapter
-						.getStatus().getException() instanceof SWTError)) {
-			return true;
-		}
-		return false;
-	}
-
-	private void handleException(Throwable t) {
-		try {
-			exceptionCount++;
-			if (exceptionCount > 1) {
-				dialog.updateMessage(MessageFormat.format(MSG_FATAL_ERROR,
-						new Object[] { MSG_FATAL_ERROR_Recursive }));
-				dialog.getShell().forceActive();
-			} else {
-				if (openQuestionDialog(t)) {
-					closeWorkbench();
-				}
-			}
-		} finally {
-			exceptionCount--;
-		}
-	}
-
-	/**
-	 * Informs the user about a fatal error. Returns true if the user decide to
-	 * exit workbench or if another fatal error happens while reporting it.
-	 */
-	private boolean openQuestionDialog(Throwable t) {
-		try {
-			String msg = null;
-			if (t instanceof OutOfMemoryError) {
-				msg = MSG_OutOfMemoryError;
-			} else if (t instanceof StackOverflowError) {
-				msg = MSG_StackOverflowError;
-			} else if (t instanceof VirtualMachineError) {
-				msg = MSG_VirtualMachineError;
-			} else if (t instanceof SWTError) {
-				msg = MSG_SWTError;
-			} else {
-				if (t.getMessage() == null) {
-					msg = IDEWorkbenchMessages.InternalErrorNoArg;
-				} else {
-					msg = NLS.bind(IDEWorkbenchMessages.InternalErrorOneArg, t
-							.getMessage());
-				}
-			}
-
-			// Always open the dialog in case of major error but do not show the
-			// detail button if not in debug mode.
-			Throwable detail = t;
-			if (!Policy.DEBUG_OPEN_ERROR_DIALOG) {
-				detail = null;
-			}
-
-			dialog = openInternalQuestionDialog(PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow().getShell(),
-					MSG_FATAL_ERROR_Title, MessageFormat.format(
-							MSG_FATAL_ERROR, new Object[] { msg }), detail, 1);
-
-			return dialog.open() == 0;
-		} catch (Throwable th) {
-			// Workbench may be in such bad shape (no OS handles left, out of
-			// memory, etc)
-			// that is cannot show a message to the user. Just bail out now.
-			System.err
-					.println("Error while informing user about event loop exception:"); //$NON-NLS-1$
-			t.printStackTrace();
-			System.err.println("Dialog open exception:"); //$NON-NLS-1$
-			th.printStackTrace();
-			return true;
-		}
-	}
-
-	private FatalErrorDialog openInternalQuestionDialog(Shell parent,
-			String title, String message, Throwable detail, int defaultIndex) {
-		String[] labels;
-		if (detail == null) {
-			labels = new String[] { IDialogConstants.YES_LABEL,
-					IDialogConstants.NO_LABEL };
-		} else {
-			labels = new String[] { IDialogConstants.YES_LABEL,
-					IDialogConstants.NO_LABEL,
-					IDialogConstants.SHOW_DETAILS_LABEL };
-		}
-
-		FatalErrorDialog dialog = new FatalErrorDialog(parent, title, null, // accept
-				// the
-				// default
-				// window
-				// icon
-				message, detail, MessageDialog.QUESTION, labels, defaultIndex);
-		if (detail != null) {
-			dialog.setDetailButton(2);
-		}
-		return dialog;
-	}
-
-	/**
-	 * Closes the workbench and make sure all exceptions are handled.
-	 */
-	private void closeWorkbench() {
-		if (closing) {
-			return;
-		}
-
-		try {
-			closing = true;
-			if (dialog != null && dialog.getShell() != null
-					&& !dialog.getShell().isDisposed()) {
-				dialog.close();
-			}
-			//@see WorkbenchAdvisor#getWorkbenchConfigurer()
-			if (workbenchConfigurer != null)
-				workbenchConfigurer.emergencyClose();
-		} catch (RuntimeException re) {
-			// Workbench may be in such bad shape (no OS handles left, out of
-			// memory, etc)
-			// that is cannot even close. Just bail out now.
-			System.err
-					.println("Fatal runtime error happened during workbench emergency close."); //$NON-NLS-1$
-			re.printStackTrace();
-			throw re;
-		} catch (Error e) {
-			// Workbench may be in such bad shape (no OS handles left, out of
-			// memory, etc)
-			// that is cannot even close. Just bail out now.
-			System.err
-					.println("Fatal error happened during workbench emergency close."); //$NON-NLS-1$
-			e.printStackTrace();
-			throw e;
-		}
-	}
-
-	private class FatalErrorDialog extends InternalErrorDialog {
-
-		/**
-		 * @param parentShell
-		 * @param dialogTitle
-		 * @param dialogTitleImage
-		 * @param dialogMessage
-		 * @param detail
-		 * @param dialogImageType
-		 * @param dialogButtonLabels
-		 * @param defaultIndex
-		 */
-		public FatalErrorDialog(Shell parentShell, String dialogTitle,
-				Image dialogTitleImage, String dialogMessage, Throwable detail,
-				int dialogImageType, String[] dialogButtonLabels,
-				int defaultIndex) {
-			super(parentShell, dialogTitle, dialogTitleImage, dialogMessage,
-					detail, dialogImageType, dialogButtonLabels, defaultIndex);
-		}
-
-		/**
-		 * Updates the dialog message
-		 * 
-		 * @param message
-		 *            new message
-		 */
-		public void updateMessage(String message) {
-			this.message = message;
-			this.messageLabel.setText(message);
-			this.messageLabel.update();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchMessages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchMessages.java
deleted file mode 100644
index 1f4f2d6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchMessages.java
+++ /dev/null
@@ -1,812 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- * Benjamin Muskalla - bug 29633
- * Oakland Software Incorporated (Francis Upton) <francisu@ieee.org>
- *		- Bug 224997 [Workbench] Impossible to copy project
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import org.eclipse.osgi.util.NLS;
-
-public class IDEWorkbenchMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.ide.messages";//$NON-NLS-1$
-	// package: org.eclipse.ui.ide
-
-	public static String IDEWorkbenchAdvisor_noPerspective;
-
-	public static String IDE_noFileEditorFound;
-	public static String IDE_coreExceptionFileStore;
-
-	public static String OpenWithMenu_Other;
-	public static String OpenWithMenu_OtherDialogDescription;
-
-	public static String QuickStartAction_errorDialogTitle;
-	public static String QuickStartAction_infoReadError;
-	
-	public static String ConfigurationLogUpdateSection_installConfiguration;
-	public static String ConfigurationLogUpdateSection_lastChangedOn;
-	public static String ConfigurationLogUpdateSection_location;
-	public static String ConfigurationLogUpdateSection_IU;
-	public static String ConfigurationLogUpdateSection_IUHeader;
-	public static String ConfigurationLogUpdateSection_bundle;
-	public static String ConfigurationLogUpdateSection_bundleHeader;
-	public static String ConfigurationLogUpdateSection_timestamp;
-
-	public static String ErrorClosing;
-	public static String ErrorOnSaveAll;
-
-	public static String ResourceInfoPage_noResource;
-
-
-	//
-	//
-	// Copies from org.eclipse.ui.workbench
-	//
-	public static String showAdvanced;
-	public static String hideAdvanced;
-
-	// ==============================================================================
-	// Workbench Actions
-	// ==============================================================================
-
-	// --- File Menu ---
-	public static String Workbench_file;
-	public static String Workbench_new;
-	public static String OpenWorkspaceAction_text;
-	public static String OpenWorkspaceAction_toolTip;
-	public static String OpenWorkspaceAction_errorTitle;
-	public static String OpenWorkspaceAction_errorMessage;
-	public static String OpenWorkspaceAction_other;
-	public static String NewProjectAction_text;
-	public static String NewProjectAction_toolTip;
-	public static String NewExampleAction_text;
-	public static String NewExampleAction_toolTip;
-	public static String SaveAsDialog_title;
-	public static String SaveAsDialog_message;
-	public static String SaveAsDialog_text;
-	public static String SaveAsDialog_fileLabel;
-	public static String SaveAsDialog_file;
-	public static String SaveAsDialog_overwriteQuestion;
-	public static String SaveAsDialog_closedProjectMessage;
-	public static String Workbench_projectProperties;
-	public static String Workbench_projectPropertiesToolTip;
-
-
-	// --- Edit Menu ---
-	public static String Workbench_edit;
-	public static String Workbench_addBookmark;
-	public static String Workbench_addBookmarkToolTip;
-	public static String Workbench_addTask;
-	public static String Workbench_addTaskToolTip;
-
-
-	// --- Navigate Menu ---
-	public static String Workbench_navigate;
-	public static String Workbench_goTo;
-
-	public static String Workbench_showIn;
-
-	// --- Project Menu ---
-	public static String Workbench_project;
-
-	public static String Workbench_buildProject;
-	public static String Workbench_buildProjectToolTip;
-	public static String Workbench_rebuildProject;
-	public static String Workbench_rebuildProjectToolTip;
-	public static String Workbench_buildClean;
-	public static String Workbench_buildSet;
-	public static String Workbench_buildAutomatically;
-
-	public static String GlobalBuildAction_text;
-	public static String GlobalBuildAction_toolTip;
-	public static String GlobalBuildAction_rebuildText;
-	public static String GlobalBuildAction_rebuildToolTip;
-	public static String GlobalBuildAction_buildProblems;
-	public static String GlobalBuildAction_internalError;
-	public static String GlobalBuildAction_buildOperationTitle;
-	public static String GlobalBuildAction_rebuildAllOperationTitle;
-	public static String GlobalBuildAction_jobTitle;
-
-	public static String BuildSetAction_noBuildTitle;
-	public static String BuildSetAction_noProjects;
-
-	
-	// --- Window Menu ---
-	public static String Workbench_window;
-	public static String Workbench_openPerspective;
-	public static String Workbench_showView;
-
-	public static String PromptOnExitDialog_shellTitle;
-	public static String PromptOnExitDialog_message0;
-	public static String PromptOnExitDialog_message1;
-	public static String PromptOnExitDialog_choice;
-
-	public static String Workbench_shortcuts;
-	public static String Workbench_openNewWindow;
-
-
-	// --- Help Menu ---
-	public static String Workbench_help;
-	public static String QuickStart_text;
-	public static String QuickStart_toolTip;
-	public static String QuickStartMessageDialog_title;
-	public static String QuickStartMessageDialog_message;
-	public static String WelcomePageSelectionDialog_title;
-	public static String WelcomePageSelectionDialog_message;
-	public static String TipsAndTricks_text;
-	public static String TipsAndTricks_toolTip;
-	public static String TipsAndTricksMessageDialog_title;
-	public static String TipsAndTricksMessageDialog_message;
-	public static String TipsAndTricksPageSelectionDialog_title;
-	public static String TipsAndTricksPageSelectionDialog_message;
-	public static String TipsAndTricksErrorDialog_title;
-	public static String TipsAndTricksErrorDialog_noHref;
-	public static String TipsAndTricksErrorDialog_noFeatures;
-
-	// ==============================================================================
-	// Navigator Actions
-	// ==============================================================================
-	public static String OpenWithMenu_dialogTitle;
-
-	public static String CopyProjectAction_title;
-	public static String CopyProjectAction_toolTip;
-	public static String CopyProjectAction_copyTitle;
-	public static String CopyProjectAction_copyNameOneArg;
-	public static String CopyProjectAction_copyNameTwoArgs;
-	public static String CopyProjectAction_alreadyExists;
-	public static String CopyProjectAction_copyFailedTitle;
-	public static String CopyProjectAction_internalError;
-
-	public static String CopyResourceAction_title;
-	public static String CopyResourceAction_toolTip;
-	public static String CopyResourceAction_selectDestination;
-
-	public static String MoveProjectAction_text;
-	public static String MoveProjectAction_toolTip;
-	public static String MoveProjectAction_moveTitle;
-	public static String MoveProjectAction_dialogTitle;
-	public static String MoveProjectAction_internalError;
-
-	public static String MoveResourceAction_text;
-	public static String MoveResourceAction_toolTip;
-	public static String MoveResourceAction_title;
-	public static String MoveResourceAction_checkMoveMessage;
-
-	public static String ReadOnlyCheck_problems;
-
-	public static String RenameResourceAction_text;
-	public static String RenameResourceAction_toolTip;
-	public static String RenameResourceAction_operationTitle;
-	public static String RenameResourceAction_inputDialogTitle;
-	public static String RenameResourceAction_inputDialogMessage;
-	public static String RenameResourceAction_checkTitle;
-	public static String RenameResourceAction_readOnlyCheck;
-	public static String RenameResourceAction_resourceExists;
-	public static String RenameResourceAction_projectExists;
-	public static String RenameResourceAction_nameExists;
-	public static String RenameResourceAction_overwriteQuestion;
-	public static String RenameResourceAction_overwriteProjectQuestion;
-	public static String RenameResourceAction_problemTitle;
-	public static String RenameResourceAction_progress;
-	public static String RenameResourceAction_nameMustBeDifferent;
-	public static String RenameResourceAction_problemMessage;
-
-	public static String DeleteResourceAction_text;
-	public static String DeleteResourceAction_toolTip;
-	public static String DeleteResourceAction_title1;
-	public static String DeleteResourceAction_titleN;
-	public static String DeleteResourceAction_confirm1;
-	public static String DeleteResourceAction_confirmN;
-	public static String DeleteResourceAction_titleProject1;
-	public static String DeleteResourceAction_titleProjectN;
-	public static String DeleteResourceAction_confirmProject1;
-	public static String DeleteResourceAction_confirmProjectN;
-	public static String DeleteResourceAction_deleteContents1;
-	public static String DeleteResourceAction_deleteContentsN;
-	public static String DeleteResourceAction_deleteContentsDetails;
-	public static String DeleteResourceAction_doNotDeleteContents;
-	public static String DeleteResourceAction_confirmLinkedResource1;
-	public static String DeleteResourceAction_confirmLinkedResourceN;
-	public static String DeleteResourceAction_readOnlyQuestion;
-	public static String DeleteResourceAction_jobName;
-	public static String DeleteResourceAction_checkJobName;
-	public static String DeleteResourceAction_operationLabel;
-
-	public static String AddBookmarkLabel;
-	public static String AddBookmarkToolTip;
-	public static String AddBookmarkDialog_title;
-	public static String AddBookmarkDialog_message;
-
-	public static String AddTaskLabel;
-	public static String AddTaskToolTip;
-
-	public static String OpenFileAction_text;
-	public static String OpenFileAction_toolTip;
-	public static String OpenFileAction_openFileShellTitle;
-
-	public static String OpenLocalFileAction_title;
-	public static String OpenLocalFileAction_message_fileNotFound;
-	public static String OpenLocalFileAction_message_filesNotFound;
-	public static String OpenLocalFileAction_message_errorOnOpen;
-	public static String OpenLocalFileAction_title_selectWorkspaceFile;
-	public static String OpenLocalFileAction_message_fileLinkedToMultiple;
-	
-	public static String OpenResourceAction_text;
-	public static String OpenResourceAction_toolTip;
-	public static String OpenResourceAction_dialogTitle;
-	public static String OpenResourceAction_problemMessage;
-	public static String OpenResourceAction_operationMessage;
-	public static String OpenResourceAction_openRequiredProjects;
-	
-	public static String CloseResourceAction_text;
-	public static String CloseResourceAction_warningForOne;
-	public static String CloseResourceAction_warningForMultiple;
-	public static String CloseResourceAction_confirm;
-	public static String CloseResourceAction_toolTip;
-	public static String CloseResourceAction_title;
-	public static String CloseResourceAction_problemMessage;
-	public static String CloseResourceAction_operationMessage;
-
-	public static String CloseUnrelatedProjectsAction_text;
-	public static String CloseUnrelatedProjectsAction_toolTip;
-
-	public static String BuildAction_text;
-	public static String BuildAction_toolTip;
-	public static String BuildAction_problemMessage;
-	public static String BuildAction_problemTitle;
-	public static String BuildAction_operationMessage;
-
-	public static String RebuildAction_text;
-	public static String RebuildAction_tooltip;
-
-	public static String RefreshAction_text;
-	public static String RefreshAction_toolTip;
-	public static String RefreshAction_progressMessage;
-	public static String RefreshAction_problemTitle;
-	public static String RefreshAction_problemMessage;
-	public static String RefreshAction_locationDeletedMessage;
-	public static String RefreshAction_dialogTitle;
-
-	public static String SelectWorkingSetAction_text;
-
-	// --- Operations ---
-	public static String CopyProjectOperation_progressTitle;
-	public static String CopyProjectOperation_copyFailedMessage;
-	public static String CopyProjectOperation_copyFailedTitle;
-	public static String CopyProjectOperation_internalError;
-	public static String CopyProjectOperation_copyProject;
-
-	public static String CopyFilesAndFoldersOperation_copyFailedTitle;
-	public static String CopyFilesAndFoldersOperation_problemMessage;
-	public static String CopyFilesAndFoldersOperation_operationTitle;
-	public static String CopyFilesAndFoldersOperation_nameCollision;
-	public static String CopyFilesAndFoldersOperation_internalError;
-	public static String CopyFilesAndFoldersOperation_resourceExists;
-	public static String CopyFilesAndFoldersOperation_overwriteQuestion;
-	public static String CopyFilesAndFoldersOperation_overwriteWithDetailsQuestion;
-	public static String CopyFilesAndFoldersOperation_overwriteMergeQuestion;
-	public static String CopyFilesAndFoldersOperation_overwriteNoMergeLinkQuestion;
-	public static String CopyFilesAndFoldersOperation_overwriteNoMergeNoLinkQuestion;
-	public static String CopyFilesAndFoldersOperation_deepCopyQuestion;
-	public static String CopyFilesAndFoldersOperation_deepMoveQuestion;
-	public static String CopyFilesAndFoldersOperation_copyNameTwoArgs;
-	public static String CopyFilesAndFoldersOperation_copyNameOneArg;
-	public static String CopyFilesAndFoldersOperation_destinationAccessError;
-	public static String CopyFilesAndFoldersOperation_destinationDescendentError;
-	public static String CopyFilesAndFoldersOperation_overwriteProblem;
-	public static String CopyFilesAndFoldersOperation_question;
-	public static String CopyFilesAndFoldersOperation_inputDialogTitle;
-	public static String CopyFilesAndFoldersOperation_inputDialogMessage;
-	public static String CopyFilesAndFoldersOperation_nameExists;
-	public static String CopyFilesAndFoldersOperation_nameMustBeDifferent;
-	public static String CopyFilesAndFoldersOperation_sameSourceAndDest;
-	public static String CopyFilesAndFoldersOperation_importSameSourceAndDest;
-	public static String CopyFilesAndFoldersOperation_resourceDeleted;
-	public static String CopyFilesAndFoldersOperation_missingPathVariable;
-	public static String CopyFilesAndFoldersOperation_missingLinkTarget;
-	public static String CopyFilesAndFoldersOperation_CopyResourcesTask;
-	public static String CopyFilesAndFoldersOperation_parentNotEqual;
-	public static String CopyFilesAndFoldersOperation_infoNotFound;
-	public static String CopyFilesAndFoldersOperation_copyTitle;
-	public static String CopyFilesAndFoldersOperation_moveTitle;
-
-	public static String MoveFilesAndFoldersOperation_sameSourceAndDest;
-	public static String MoveFilesAndFoldersOperation_moveFailedTitle;
-	public static String MoveFilesAndFoldersOperation_problemMessage;
-	public static String MoveFilesAndFoldersOperation_operationTitle;
-
-	public static String WizardDataTransfer_existsQuestion;
-	public static String WizardDataTransfer_overwriteNameAndPathQuestion;
-	public static String WizardDataTransfer_exceptionMessage;
-	public static String WizardTransferPage_selectTypes;
-	public static String WizardTransferPage_selectAll;
-	public static String WizardTransferPage_deselectAll;
-
-	// --- Import ---
-	public static String WizardImportPage_specifyFolder;
-	public static String WizardImportPage_specifyProject;
-	public static String WizardImportPage_folderMustExist;
-	public static String WizardImportPage_errorDialogTitle;
-	public static String WizardImportPage_folder;
-	public static String WizardImportPage_browseLabel;
-	public static String WizardImportPage_browse2;
-	public static String WizardImportPage_selectFolderLabel;
-	public static String WizardImportPage_selectFolderTitle;
-	public static String WizardImportPage_destinationLabel;
-	public static String WizardImportPage_options;
-	public static String WizardImportPage_projectNotExist;
-	public static String WizardImportPage_importOnReceiver;
-	public static String WizardImportPage_noOpenProjects;
-	public static String WizardImportPage_undefinedPathVariable;
-	public static String WizardImportPage_containerNotExist;
-
-	// --- Export ---
-	public static String WizardExportPage_errorDialogTitle;
-	public static String WizardExportPage_mustExistMessage;
-	public static String WizardExportPage_mustBeAccessibleMessage;
-	public static String WizardExportPage_detailsMessage;
-	public static String WizardExportPage_whatLabel;
-	public static String WizardExportPage_whereLabel;
-	public static String WizardExportPage_options;
-	public static String WizardExportPage_selectionDialogMessage;
-	public static String WizardExportPage_resourceTypeDialog;
-	public static String WizardExportPage_folder;
-	public static String WizardExportPage_browse;
-	public static String WizardExportPage_allTypes;
-	public static String WizardExportPage_specificTypes;
-	public static String WizardExportPage_edit;
-	public static String WizardExportPage_details;
-	public static String WizardExportPage_selectResourcesTitle;
-	public static String WizardExportPage_oneResourceSelected;
-	public static String WizardExportPage_selectResourcesToExport;
-	public static String WizardExportPage_internalErrorTitle;
-	public static String WizardExportPage_resourceCountMessage;
-
-	// --- New Example ---
-	public static String NewExample_title;
-
-	public static String WizardNewProjectCreationPage_projectNameEmpty;
-	public static String WizardNewProjectCreationPage_projectLocationEmpty;
-	public static String WizardNewProjectCreationPage_projectExistsMessage;
-	public static String WizardNewProjectCreationPage_nameLabel;
-	public static String WizardNewProjectReferences_title;
-
-	// --- New Folder ---
-	public static String WizardNewFolderMainPage_folderName;
-	public static String WizardNewFolderMainPage_folderLabel;
-	public static String WizardNewFolderMainPage_description;
-	public static String WizardNewFolderCreationPage_progress;
-	public static String WizardNewFolderCreationPage_errorTitle;
-	public static String WizardNewFolderCreationPage_internalErrorTitle;
-	public static String WizardNewFolderCreationPage_title;
-	public static String WizardNewFolder_internalError;
-
-	// --- New File ---
-	public static String WizardNewFileCreationPage_progress;
-	public static String WizardNewFileCreationPage_errorTitle;
-	public static String WizardNewFileCreationPage_fileLabel;
-	public static String WizardNewFileCreationPage_file;
-	public static String WizardNewFileCreationPage_internalErrorTitle;
-	public static String WizardNewFileCreationPage_internalErrorMessage;
-	public static String WizardNewFileCreationPage_title;
-
-
-	// --- Linked Resource ---
-	public static String WizardNewLinkPage_linkFileButton;
-	public static String WizardNewLinkPage_linkFolderButton;
-	public static String WizardNewLinkPage_browseButton;
-	public static String WizardNewLinkPage_variablesButton;
-	public static String WizardNewLinkPage_targetSelectionLabel;
-	public static String WizardNewLinkPage_linkTargetEmpty;
-	public static String WizardNewLinkPage_linkTargetInvalid;
-	public static String WizardNewLinkPage_linkTargetLocationInvalid;
-	public static String WizardNewLinkPage_linkTargetNonExistent;
-	public static String WizardNewLinkPage_linkTargetNotFile;
-	public static String WizardNewLinkPage_linkTargetNotFolder;
-
-	// ==============================================================================
-	// Preference Pages
-	// ==============================================================================
-	public static String Preference_note;
-
-	// --- Workbench ---
-	public static String WorkbenchPreference_encoding;
-	public static String WorkbenchPreference_defaultEncoding;
-	public static String WorkbenchPreference_otherEncoding;
-	public static String WorkbenchPreference_unsupportedEncoding;
-	public static String WorkbenchPreference_encoding_encodingMessage;
-	
-	// ---workspace ---
-	public static String IDEWorkspacePreference_autobuild;
-	public static String IDEWorkspacePreference_autobuildToolTip;
-	public static String IDEWorkspacePreference_savePriorToBuilding;
-	public static String IDEWorkspacePreference_savePriorToBuildingToolTip;
-	public static String IDEWorkspacePreference_RefreshButtonText;
-	public static String IDEWorkspacePreference_RefreshButtonToolTip;
-	public static String IDEWorkspacePreference_fileLineDelimiter;
-	public static String IDEWorkspacePreference_defaultLineDelim;
-	public static String IDEWorkspacePreference_defaultLineDelimProj;
-	public static String IDEWorkspacePreference_otherLineDelim;
-	public static String IDEWorkspacePreference_relatedLink;
-	public static String IDEWorkspacePreference_openReferencedProjects;
-
-	// --- Linked Resources ---
-	public static String LinkedResourcesPreference_explanation;
-	public static String LinkedResourcesPreference_enableLinkedResources;
-	public static String LinkedResourcesPreference_linkedResourcesWarningTitle;
-	public static String LinkedResourcesPreference_linkedResourcesWarningMessage;
-
-	// The following six keys are marked as unused by the NLS search, but they are indirectly used
-	// and should be removed.
-	public static String PathVariableDialog_shellTitle_newVariable;
-	public static String PathVariableDialog_shellTitle_existingVariable;
-	public static String PathVariableDialog_dialogTitle_newVariable;
-	public static String PathVariableDialog_dialogTitle_existingVariable;
-	public static String PathVariableDialog_message_newVariable;
-	public static String PathVariableDialog_message_existingVariable;
-
-	public static String PathVariableDialog_variableName;
-	public static String PathVariableDialog_variableValue;
-	public static String PathVariableDialog_variableNameEmptyMessage;
-	public static String PathVariableDialog_variableValueEmptyMessage;
-	public static String PathVariableDialog_variableValueInvalidMessage;
-	public static String PathVariableDialog_file;
-	public static String PathVariableDialog_folder;
-	public static String PathVariableDialog_selectFileTitle;
-	public static String PathVariableDialog_selectFolderTitle;
-	public static String PathVariableDialog_selectFolderMessage;
-	public static String PathVariableDialog_variableAlreadyExistsMessage;
-	public static String PathVariableDialog_pathIsRelativeMessage;
-	public static String PathVariableDialog_pathDoesNotExistMessage;
-
-	// --- Local History ---
-	public static String FileHistory_longevity;
-	public static String FileHistory_entries;
-	public static String FileHistory_diskSpace;
-	public static String FileHistory_mustBePositive;
-	public static String FileHistory_invalid;
-	public static String FileHistory_exceptionSaving;
-	public static String FileHistory_aboveMaxEntries;
-	public static String FileHistory_aboveMaxFileSize;
-	public static String FileHistory_restartNote;
-
-	// --- Perspectives ---
-	public static String ProjectSwitchPerspectiveMode_optionsTitle;
-	public static String ProjectSwitchPerspectiveMode_always;
-	public static String ProjectSwitchPerspectiveMode_never;
-	public static String ProjectSwitchPerspectiveMode_prompt;
-
-	// --- Build Order ---
-	public static String BuildOrderPreference_up;
-	public static String BuildOrderPreference_down;
-	public static String BuildOrderPreference_add;
-	public static String BuildOrderPreference_remove;
-	public static String BuildOrderPreference_selectOtherProjects;
-	public static String BuildOrderPreference_useDefaults;
-	public static String BuildOrderPreference_projectBuildOrder;
-	public static String BuildOrderPreference_removeNote;
-	public static String BuildOrderPreference_maxIterationsLabel;
-
-	// --- Startup preferences ---
-	public static String StartupPreferencePage_refreshButton;
-	public static String StartupPreferencePage_launchPromptButton;
-	public static String StartupPreferencePage_exitPromptButton;
-
-	// --- Info ---
-	public static String ResourceInfo_readOnly;
-	public static String ResourceInfo_executable;
-	public static String ResourceInfo_archive;
-	public static String ResourceInfo_derived;
-	public static String ResourceInfo_type;
-	public static String ResourceInfo_location;
-	public static String ResourceInfo_resolvedLocation;
-	public static String ResourceInfo_size;
-	public static String ResourceInfo_bytes;
-	public static String ResourceInfo_file;
-	public static String ResourceInfo_fileTypeFormat;
-	public static String ResourceInfo_folder;
-	public static String ResourceInfo_project;
-	public static String ResourceInfo_linkedFile;
-	public static String ResourceInfo_linkedFolder;
-	public static String ResourceInfo_unknown;
-	public static String ResourceInfo_notLocal;
-	public static String ResourceInfo_undefinedPathVariable;
-	public static String ResourceInfo_notExist;
-	public static String ResourceInfo_fileNotExist;
-	public static String ResourceInfo_path;
-	public static String ResourceInfo_lastModified;
-	public static String ResourceInfo_fileEncodingTitle;
-	public static String ResourceInfo_fileContentEncodingFormat;
-	public static String ResourceInfo_fileContainerEncodingFormat;
-	public static String ResourceInfo_containerEncodingFormat;
-	public static String ResourceInfo_exWarning;
-
-	// --- Project References ---
-	public static String ProjectReferencesPage_label;
-
-	// ==============================================================================
-	// Editors
-	// ==============================================================================
-	public static String DefaultEditorDescription_name;
-
-	public static String WelcomeEditor_accessException;
-	public static String WelcomeEditor_readFileError;
-	public static String WelcomeEditor_title;
-	public static String WelcomeEditor_toolTip;
-	public static String WelcomeEditor_copy_text;
-
-	public static String WelcomeItem_unableToLoadClass;
-	public static String WelcomeParser_parseError;
-	public static String WelcomeParser_parseException;
-	public static String Workbench_openEditorErrorDialogTitle;
-	public static String Workbench_openEditorErrorDialogMessage;
-	public static String QuickStartAction_openEditorException;
-
-	// ==============================================================================
-	// Dialogs
-	// ==============================================================================
-	public static String Question;
-	public static String Always;
-	public static String Never;
-	public static String Prompt;
-
-	public static String ContainerSelectionDialog_title;
-	public static String ContainerSelectionDialog_message;
-
-	public static String ContainerGroup_message;
-	public static String ContainerGroup_selectFolder;
-
-	public static String ContainerGenerator_progressMessage;
-	public static String ContainerGenerator_pathOccupied;
-
-	public static String ResourceGroup_resource;
-	public static String ResourceGroup_nameExists;
-	public static String ResourceGroup_folderEmpty;
-	public static String ResourceGroup_noProject;
-	public static String ResourceGroup_emptyName;
-	public static String ResourceGroup_invalidFilename;
-	public static String ResourceGroup_pathOccupied;
-
-	public static String FileSelectionDialog_title;
-	public static String FileSelectionDialog_message;
-
-	public static String ProjectLocationSelectionDialog_nameLabel;
-	public static String ProjectLocationSelectionDialog_locationLabel;
-	public static String ProjectLocationSelectionDialog_browseLabel;
-	public static String ProjectLocationSelectionDialog_directoryLabel;
-	public static String ProjectLocationSelectionDialog_locationError;
-	public static String ProjectLocationSelectionDialog_locationIsSelf;
-	public static String ProjectLocationSelectionDialog_selectionTitle;
-	public static String ProjectLocationSelectionDialog_useDefaultLabel;
-
-	public static String ResourceSelectionDialog_title;
-	public static String ResourceSelectionDialog_message;
-
-	public static String MarkerResolutionSelectionDialog_title;
-	public static String MarkerResolutionSelectionDialog_messageLabel;
-
-	public static String FilteredResourcesSelectionDialog_showDerivedResourcesAction;
-	
-	public static String ResourceSelectionDialog_label;
-	public static String ResourceSelectionDialog_matching;
-	public static String ResourceSelectionDialog_folders;
-	public static String ResourceSelectionDialog_showDerived;
-
-	public static String OpenResourceDialog_title;
-	public static String OpenResourceDialog_openWithMenu_label;
-	public static String OpenResourceDialog_openButton_text;
-	public static String OpenResourceDialog_openWithButton_toolTip;
-
-	public static String NewFolderDialog_title;
-	public static String NewFolderDialog_nameLabel;
-	public static String NewFolderDialog_alreadyExists;
-	public static String NewFolderDialog_folderNameEmpty;
-	public static String NewFolderDialog_progress;
-	public static String NewFolderDialog_errorTitle;
-	public static String NewFolderDialog_internalError;
-
-	public static String CreateLinkedResourceGroup_linkFileButton;
-	public static String CreateLinkedResourceGroup_linkFolderButton;
-	public static String CreateLinkedResourceGroup_browseButton;
-	public static String CreateLinkedResourceGroup_variablesButton;
-	public static String CreateLinkedResourceGroup_resolvedPathLabel;
-	public static String CreateLinkedResourceGroup_targetSelectionLabel;
-	public static String CreateLinkedResourceGroup_targetSelectionTitle;	
-	public static String CreateLinkedResourceGroup_linkTargetNotFile;
-	public static String CreateLinkedResourceGroup_linkTargetNotFolder;
-	public static String CreateLinkedResourceGroup_linkTargetNonExistent;
-	public static String CreateLinkedResourceGroup_unableToValidateLinkTarget;
-
-	public static String PathVariablesBlock_variablesLabel;
-	public static String PathVariablesBlock_addVariableButton;
-	public static String PathVariablesBlock_editVariableButton;
-	public static String PathVariablesBlock_removeVariableButton;
-
-	public static String PathVariableSelectionDialog_title;
-	public static String PathVariableSelectionDialog_extendButton;
-	public static String PathVariableSelectionDialog_ExtensionDialog_title;
-	public static String PathVariableSelectionDialog_ExtensionDialog_description;
-
-	// ==============================================================================
-	// Editor Framework
-	// ==============================================================================
-	public static String EditorManager_saveResourcesMessage;
-	public static String EditorManager_saveResourcesTitle;
-
-	public static String OpenSystemEditorAction_dialogTitle;
-	public static String OpenSystemEditorAction_text;
-	public static String OpenSystemEditorAction_toolTip;
-
-	// ==============================================================================
-	// Workspace
-	// ==============================================================================
-	public static String WorkspaceAction_problemsTitle;
-	public static String WorkspaceAction_logTitle;
-	public static String WorkbenchAction_problemsMessage;
-	public static String WorkbenchAction_internalError;
-	public static String Workspace;
-
-
-	// ==============================================================================
-	// Workbench
-	// ==============================================================================
-	public static String WorkbenchWindow_shellTitle;
-
-	public static String Internal_error;
-	public static String InternalError;
-	public static String InternalErrorNoArg;
-	public static String InternalErrorOneArg;
-
-	public static String FatalError_RecursiveError;
-	public static String FatalError_OutOfMemoryError;
-	public static String FatalError_StackOverflowError;
-	public static String FatalError_VirtualMachineError;
-	public static String FatalError_SWTError;
-	public static String FatalError;
-
-	public static String ProblemSavingWorkbench;
-	public static String ProblemsSavingWorkspace;
-
-	public static String Problems_Opening_Page;
-
-	public static String Workspace_refreshing;
-
-	public static String IDEExceptionHandler_ExceptionHandledMessage;
-	// ==============================================================================
-	// Keys with references but don't show in the UI
-	// ==============================================================================
-	public static String CreateFileAction_text;
-	public static String CreateFileAction_toolTip;
-	public static String CreateFileAction_title;
-
-	public static String CreateFolderAction_text;
-	public static String CreateFolderAction_toolTip;
-	public static String CreateFolderAction_title;
-
-	public static String ScrubLocalAction_problemsMessage;
-	public static String ScrubLocalAction_text;
-	public static String ScrubLocalAction_toolTip;
-	public static String ScrubLocalAction_problemsTitle;
-	public static String ScrubLocalAction_progress;
-
-	public static String TextAction_selectAll;
-	public static String Cut;
-	public static String Copy;
-	public static String Paste;
-	public static String Delete;
-
-	// ==============================================================================
-	// Keys used in the reuse editor which is released as experimental.
-	// ==============================================================================
-	public static String WorkbenchPreference_saveInterval;
-	public static String WorkbenchPreference_saveIntervalError;
-
-	// ==============================================================================
-	// Working Set Framework.
-	// ==============================================================================
-	public static String ResourceWorkingSetPage_title;
-	public static String ResourceWorkingSetPage_description;
-	public static String ResourceWorkingSetPage_message;
-	public static String ResourceWorkingSetPage_label_tree;
-	public static String ResourceWorkingSetPage_warning_nameMustNotBeEmpty;
-	public static String ResourceWorkingSetPage_warning_nameWhitespace;
-	public static String ResourceWorkingSetPage_warning_workingSetExists;
-	public static String ResourceWorkingSetPage_warning_resourceMustBeChecked;
-	public static String ResourceWorkingSetPage_error;
-	public static String ResourceWorkingSetPage_error_updateCheckedState;
-	public static String ResourceWorkingSetPage_selectAll_label;
-	public static String ResourceWorkingSetPage_selectAll_toolTip;
-	public static String ResourceWorkingSetPage_deselectAll_label;
-	public static String ResourceWorkingSetPage_deselectAll_toolTip;
-	
-	public static String ResourceEncodingFieldEditor_ErrorLoadingMessage;
-	public static String ResourceEncodingFieldEditor_ErrorStoringMessage;
-	public static String ResourceEncodingFieldEditor_EncodingConflictTitle;
-	public static String ResourceEncodingFieldEditor_EncodingConflictMessage;
-
-	public static String ChooseWorkspaceDialog_dialogName;
-	public static String ChooseWorkspaceDialog_dialogTitle;
-	public static String ChooseWorkspaceDialog_dialogMessage;
-	public static String ChooseWorkspaceDialog_defaultProductName;
-	public static String ChooseWorkspaceDialog_workspaceEntryLabel;
-	public static String ChooseWorkspaceDialog_browseLabel;
-	public static String ChooseWorkspaceDialog_directoryBrowserTitle;
-	public static String ChooseWorkspaceDialog_directoryBrowserMessage;
-	public static String ChooseWorkspaceDialog_useDefaultMessage;
-	
-	public static String ChooseWorkspaceWithSettingsDialog_SettingsGroupName;
-	public static String ChooseWorkspaceWithSettingsDialog_ProblemsTransferTitle;
-	public static String ChooseWorkspaceWithSettingsDialog_TransferFailedMessage;
-	public static String ChooseWorkspaceWithSettingsDialog_SaveSettingsFailed;
-	public static String ChooseWorkspaceWithSettingsDialog_ClassCreationFailed;
-	
-	public static String IDEApplication_workspaceMandatoryTitle;
-	public static String IDEApplication_workspaceMandatoryMessage;
-	public static String IDEApplication_workspaceInUseTitle;
-	public static String IDEApplication_workspaceInUseMessage;
-	public static String IDEApplication_workspaceEmptyTitle;
-	public static String IDEApplication_workspaceEmptyMessage;
-	public static String IDEApplication_workspaceInvalidTitle;
-	public static String IDEApplication_workspaceInvalidMessage;
-	public static String IDEApplication_workspaceCannotBeSetTitle;
-	public static String IDEApplication_workspaceCannotBeSetMessage;
-	public static String IDEApplication_workspaceCannotLockTitle;
-	public static String IDEApplication_workspaceCannotLockMessage;
-	public static String IDEApplication_versionTitle;
-	public static String IDEApplication_versionMessage;
-	public static String GlobalBuildAction_BuildRunningTitle;
-	public static String GlobalBuildAction_BuildRunningMessage;
-	public static String CleanDialog_buildCleanAuto;
-	public static String CleanDialog_buildCleanManual;
-	public static String CleanDialog_title;
-	public static String CleanDialog_cleanAllButton;
-	public static String CleanDialog_cleanSelectedButton;
-	public static String CleanDialog_buildNowButton;
-	public static String CleanDialog_globalBuildButton;
-	public static String CleanDialog_buildSelectedProjectsButton;
-	public static String CleanDialog_cleanSelectedTaskName;
-	public static String CleanDialog_cleanAllTaskName;
-	public static String IDEEncoding_EncodingJob;
-	public static String IDEEditorsPreferencePage_WorkbenchPreference_viewsRelatedLink;
-	public static String IDEEditorsPreferencePage_WorkbenchPreference_FileEditorsRelatedLink;
-    public static String IDEEditorsPreferencePage_WorkbenchPreference_contentTypesRelatedLink;
-	public static String WorkbenchEncoding_invalidCharset;
-	public static String CopyProjectAction_confirm;
-	public static String CopyProjectAction_warning;
-	public static String DeleteResourceAction_confirm;
-	public static String DeleteResourceAction_warning;
-	public static String CopyFilesAndFoldersOperation_confirmMove;
-	public static String CopyFilesAndFoldersOperation_warningMove;
-	public static String CopyFilesAndFoldersOperation_confirmCopy;
-	public static String CopyFilesAndFoldersOperation_warningCopy;
-	public static String RenameResourceAction_confirm;
-	public static String RenameResourceAction_warning;
-
-	public static String IDE_sideEffectWarning;
-
-	public static String IDE_areYouSure;
-	
-	public static String IDEIdleHelper_backgroundGC;
-	
-	public static String SystemSettingsChange_title;
-	public static String SystemSettingsChange_message;
-	public static String SystemSettingsChange_yes;
-	public static String SystemSettingsChange_no;
-	
-	public static String UnsupportedVM_message;
-	
-	public static String IDEWorkbenchActivityHelper_jobName;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, IDEWorkbenchMessages.class);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchPlugin.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchPlugin.java
deleted file mode 100644
index 1a1f6c6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IDEWorkbenchPlugin.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IBundleGroup;
-import org.eclipse.core.runtime.IBundleGroupProvider;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IProduct;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.resource.LocalResourceManager;
-import org.eclipse.jface.resource.ResourceManager;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.internal.ide.registry.MarkerImageProviderRegistry;
-import org.eclipse.ui.internal.ide.registry.ProjectImageRegistry;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * This internal class represents the top of the IDE workbench.
- *
- * This class is responsible for tracking various registries
- * font, preference, graphics, dialog store.
- *
- * This class is explicitly referenced by the 
- * IDE workbench plug-in's  "plugin.xml"
- * 
- * @since 3.0
- */
-public class IDEWorkbenchPlugin extends AbstractUIPlugin {
-    // Default instance of the receiver
-    private static IDEWorkbenchPlugin inst;
-
-    // Global workbench ui plugin flag. Only workbench implementation is allowed to use this flag
-    // All other plugins, examples, or test cases must *not* use this flag.
-    public static boolean DEBUG = false;
-
-    /**
-     * The IDE workbench plugin ID.
-     */
-    public static final String IDE_WORKBENCH = "org.eclipse.ui.ide"; //$NON-NLS-1$
-
-    /**
-     * The ID of the default text editor.
-     * This must correspond to EditorsUI.DEFAULT_TEXT_EDITOR_ID.
-     */
-    public static final String DEFAULT_TEXT_EDITOR_ID = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$
-
-    // IDE workbench extension point names
-    public static final String PL_MARKER_IMAGE_PROVIDER = "markerImageProviders"; //$NON-NLS-1$
-
-    public static final String PL_MARKER_HELP = "markerHelp"; //$NON-NLS-1$
-
-    public static final String PL_MARKER_RESOLUTION = "markerResolution"; //$NON-NLS-1$
-
-    public static final String PL_CAPABILITIES = "capabilities"; //$NON-NLS-1$
-
-    public static final String PL_PROJECT_NATURE_IMAGES = "projectNatureImages"; //$NON-NLS-1$
-	
-	private final static String ICONS_PATH = "$nl$/icons/full/";//$NON-NLS-1$
-
-    /**
-     * Project image registry; lazily initialized.
-     */
-    private ProjectImageRegistry projectImageRegistry = null;
-
-    /**
-     * Marker image registry; lazily initialized.
-     */
-    private MarkerImageProviderRegistry markerImageProviderRegistry = null;
-
-	private ResourceManager resourceManager;
-
-	/**
-	 * Create an instance of the receiver.
-	 */
-	public IDEWorkbenchPlugin() {
-		super();
-		inst = this;
-	}
-    /**
-     * Creates an extension.  If the extension plugin has not
-     * been loaded a busy cursor will be activated during the duration of
-     * the load.
-     *
-     * @param element the config element defining the extension
-     * @param classAttribute the name of the attribute carrying the class
-     * @return Object the extension object
-     * @throws CoreException
-     */
-    public static Object createExtension(final IConfigurationElement element,
-			final String classAttribute) throws CoreException {
-		// If plugin has been loaded create extension.
-		// Otherwise, show busy cursor then create extension.
-		Bundle plugin = Platform.getBundle(element.getNamespace());
-		if (plugin.getState() == Bundle.ACTIVE) {
-			return element.createExecutableExtension(classAttribute);
-		} else {
-            final Object[] ret = new Object[1];
-            final CoreException[] exc = new CoreException[1];
-            BusyIndicator.showWhile(null, new Runnable() {
-                public void run() {
-                    try {
-                        ret[0] = element
-                                .createExecutableExtension(classAttribute);
-                    } catch (CoreException e) {
-                        exc[0] = e;
-                    }
-                }
-            });
-            if (exc[0] != null) {
-				throw exc[0];
-			} else {
-				return ret[0];
-			}
-        }
-    }
-
-    /* Return the default instance of the receiver. This represents the runtime plugin.
-     *
-     * @see AbstractPlugin for the typical implementation pattern for plugin classes.
-     */
-    public static IDEWorkbenchPlugin getDefault() {
-        return inst;
-    }
-
-    /**
-     * Return the workspace used by the workbench
-     *
-     * This method is internal to the workbench and must not be called
-     * by any plugins.
-     */
-    public static IWorkspace getPluginWorkspace() {
-        return ResourcesPlugin.getWorkspace();
-    }
-
-    /**
-     * Logs the given message to the platform log.
-     * 
-     * If you have an exception in hand, call log(String, Throwable) instead.
-     * 
-     * If you have a status object in hand call log(String, IStatus) instead.
-     * 
-     * This convenience method is for internal use by the IDE Workbench only and
-     * must not be called outside the IDE Workbench.
-     * 
-     * @param message
-     *            A high level UI message describing when the problem happened.
-     */
-    public static void log(String message) {
-        getDefault().getLog().log(
-                StatusUtil.newStatus(IStatus.ERROR, message, null));
-    }
-
-    /**
-     * Logs the given message and throwable to the platform log.
-     * 
-     * If you have a status object in hand call log(String, IStatus) instead.
-     * 
-     * This convenience method is for internal use by the IDE Workbench only and
-     * must not be called outside the IDE Workbench.
-     * 
-     * @param message
-     *            A high level UI message describing when the problem happened.
-     * @param t
-     *            The throwable from where the problem actually occurred.
-     */
-    public static void log(String message, Throwable t) {
-        IStatus status = StatusUtil.newStatus(IStatus.ERROR, message, t);
-        log(message, status);
-    }
-    
-    /**
-     * Logs the given throwable to the platform log, indicating the class and
-     * method from where it is being logged (this is not necessarily where it
-     * occurred).
-     * 
-     * This convenience method is for internal use by the IDE Workbench only and
-     * must not be called outside the IDE Workbench.
-     * 
-     * @param clazz
-     *            The calling class.
-     * @param methodName
-     *            The calling method name.
-     * @param t
-     *            The throwable from where the problem actually occurred.
-     */
-    public static void log(Class clazz, String methodName, Throwable t) {
-        String msg = MessageFormat.format("Exception in {0}.{1}: {2}", //$NON-NLS-1$
-                new Object[] { clazz.getName(), methodName, t });
-        log(msg, t);
-    }
-    
-    /**
-     * Logs the given message and status to the platform log.
-     * 
-     * This convenience method is for internal use by the IDE Workbench only and
-     * must not be called outside the IDE Workbench.
-     * 
-     * @param message
-     *            A high level UI message describing when the problem happened.
-     *            May be <code>null</code>.
-     * @param status
-     *            The status describing the problem. Must not be null.
-     */
-    public static void log(String message, IStatus status) {
-
-        //1FTUHE0: ITPCORE:ALL - API - Status & logging - loss of semantic info
-
-        if (message != null) {
-            getDefault().getLog().log(
-                    StatusUtil.newStatus(IStatus.ERROR, message, null));
-        }
-
-        getDefault().getLog().log(status);
-    }
-
-    /* (non-javadoc)
-     * Method declared on AbstractUIPlugin
-     */
-    protected void refreshPluginActions() {
-        // do nothing
-    }
-
-
-    /**
-     * Return the manager that maps project nature ids to images.
-     */
-    public ProjectImageRegistry getProjectImageRegistry() {
-        if (projectImageRegistry == null) {
-            projectImageRegistry = new ProjectImageRegistry();
-            projectImageRegistry.load();
-        }
-        return projectImageRegistry;
-    }
-
-    /**
-     * Returns the marker image provider registry for the workbench.
-     *
-     * @return the marker image provider registry
-     */
-    public MarkerImageProviderRegistry getMarkerImageProviderRegistry() {
-        if (markerImageProviderRegistry == null) {
-            markerImageProviderRegistry = new MarkerImageProviderRegistry();
-        }
-        return markerImageProviderRegistry;
-    }
-
-
-    /**
-     * Returns the about information of all known features,
-     * omitting any features which are missing this information.
-     * 
-     * @return a possibly empty list of about infos
-     */
-    public AboutInfo[] getFeatureInfos() {
-        // cannot be cached since bundle groups come and go
-        List infos = new ArrayList();
-
-        // add an entry for each bundle group
-        IBundleGroupProvider[] providers = Platform.getBundleGroupProviders();
-        if (providers != null) {
-			for (int i = 0; i < providers.length; ++i) {
-                IBundleGroup[] bundleGroups = providers[i].getBundleGroups();
-                for (int j = 0; j < bundleGroups.length; ++j) {
-					infos.add(new AboutInfo(bundleGroups[j]));
-				}
-            }
-		}
-
-        return (AboutInfo[]) infos.toArray(new AboutInfo[infos.size()]);
-    }
-
-    /**
-     * Returns the about information of the primary feature.
-     * 
-     * @return info about the primary feature, or <code>null</code> if there 
-     * is no primary feature or if this information is unavailable
-     */
-    public AboutInfo getPrimaryInfo() {
-        IProduct product = Platform.getProduct();
-        return product == null ? null : new AboutInfo(product);
-    }
-	
-	/**
-	 * Get the workbench image with the given path relative to
-	 * ICON_PATH.
-	 * @param relativePath
-	 * @return ImageDescriptor
-	 */
-	public static ImageDescriptor getIDEImageDescriptor(String relativePath){
-		return imageDescriptorFromPlugin(IDE_WORKBENCH, ICONS_PATH + relativePath);
-	}
-	/**
-	 * Return the resourceManager used by this plug-in.
-	 * @return
-	 */
-	public ResourceManager getResourceManager() {
-		if(resourceManager == null){
-			resourceManager = new LocalResourceManager(JFaceResources.getResources());
-		}
-		return resourceManager;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		if (resourceManager != null)
-			resourceManager.dispose();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		
-		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=235179
-		// Code that depends on Platform.getBundleGroupProviders() during
-		// workbench startup must have org.eclipse.update.configurator available.
-		Bundle bundleGroupBundle = Platform
-				.getBundle("org.eclipse.update.configurator"); //$NON-NLS-1$
-		if (bundleGroupBundle != null) {
-			try {
-				bundleGroupBundle.start(Bundle.START_TRANSIENT);
-			} catch (BundleException e) {
-				// we can't start the org.eclipse.update.configurator
-				// this is not something we want to force, so we'll call this a
-				// NO-OP
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IIDEHelpContextIds.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IIDEHelpContextIds.java
deleted file mode 100644
index 3eb9a97..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IIDEHelpContextIds.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide;
-
-/**
- * Help context ids for the workbench.
- * <p>
- * This interface contains constants only; it is not intended to be implemented
- * or extended.
- * </p>
- * 
- */
-public interface IIDEHelpContextIds {
-    public static final String PREFIX = IDEWorkbenchPlugin.IDE_WORKBENCH + "."; //$NON-NLS-1$
-
-    // Actions
-    public static final String ADD_BOOKMARK_ACTION = PREFIX
-            + "add_bookmark_action_context"; //$NON-NLS-1$
-
-    public static final String ADD_TASK_ACTION = PREFIX
-            + "add_task_action_context"; //$NON-NLS-1$	
-
-    public static final String INCREMENTAL_BUILD_ACTION = PREFIX
-            + "incremental_build_action_context"; //$NON-NLS-1$
-
-    public static final String FULL_BUILD_ACTION = PREFIX
-            + "full_build_action_context"; //$NON-NLS-1$
-
-    public static final String CLOSE_RESOURCE_ACTION = PREFIX
-            + "close_resource_action_context"; //$NON-NLS-1$
-
-    public static final String CLOSE_UNRELATED_PROJECTS_ACTION = PREFIX
-    + "close_unrelated_projects_action_context"; //$NON-NLS-1$
-
-    public static final String OPEN_RESOURCE_ACTION = PREFIX
-            + "open_resource_action_context"; //$NON-NLS-1$
-
-    public static final String OPEN_FILE_ACTION = PREFIX
-            + "open_file_action_context"; //$NON-NLS-1$
-    
-    public static final String OPEN_LOCAL_FILE_ACTION = PREFIX
-    + "open_local_file_action_context"; //$NON-NLS-1$
-
-    public static final String OPEN_SYSTEM_EDITOR_ACTION = PREFIX
-            + "open_system_editor_action_context"; //$NON-NLS-1$
-
-    public static final String REFRESH_ACTION = PREFIX
-            + "refresh_action_context"; //$NON-NLS-1$
-
-    public static final String MOVE_RESOURCE_ACTION = PREFIX
-            + "move_resource_action_context"; //$NON-NLS-1$
-
-    public static final String COPY_RESOURCE_ACTION = PREFIX
-            + "copy_resource_action_context"; //$NON-NLS-1$
-
-    public static final String MOVE_PROJECT_ACTION = PREFIX
-            + "move_project_action_context"; //$NON-NLS-1$
-
-    public static final String COPY_PROJECT_ACTION = PREFIX
-            + "copy_project_action_context"; //$NON-NLS-1$
-
-    public static final String RENAME_RESOURCE_ACTION = PREFIX
-            + "rename_resource_action_context"; //$NON-NLS-1$
-
-    public static final String DELETE_RESOURCE_ACTION = PREFIX
-            + "delete_resource_action_context"; //$NON-NLS-1$
-
-    public static final String PROJECT_PROPERTY_DIALOG_ACTION = PREFIX
-            + "project_property_dialog_action_context"; //$NON-NLS-1$
-
-    public static final String CREATE_FOLDER_ACTION = PREFIX
-            + "create_folder_action_context"; //$NON-NLS-1$
-
-    public static final String CREATE_FILE_ACTION = PREFIX
-            + "create_file_action_context"; //$NON-NLS-1$
-
-    public static final String SCRUB_LOCAL_ACTION = PREFIX
-            + "scrub_local_action_context"; //$NON-NLS-1$
-
-    public static final String GLOBAL_INCREMENTAL_BUILD_ACTION = PREFIX
-            + "global_incremental_build_action_context"; //$NON-NLS-1$
-
-    public static final String GLOBAL_FULL_BUILD_ACTION = PREFIX
-            + "global_full_build_action_context"; //$NON-NLS-1$
-
-    public static final String QUICK_START_ACTION = PREFIX
-            + "quick_start_action_context"; //$NON-NLS-1$
-
-    public static final String TIPS_AND_TRICKS_ACTION = PREFIX
-            + "tips_and_tricks_action_context"; //$NON-NLS-1$
-
-    public static final String TEXT_CUT_ACTION = PREFIX
-            + "text_cut_action_context"; //$NON-NLS-1$
-
-    public static final String TEXT_COPY_ACTION = PREFIX
-            + "text_copy_action_context"; //$NON-NLS-1$
-
-    public static final String TEXT_PASTE_ACTION = PREFIX
-            + "text_paste_action_context"; //$NON-NLS-1$
-
-    public static final String TEXT_DELETE_ACTION = PREFIX
-            + "text_delete_action_context"; //$NON-NLS-1$
-
-    public static final String TEXT_SELECT_ALL_ACTION = PREFIX
-            + "text_select_all_action_context"; //$NON-NLS-1$
-
-    public static final String OPEN_WORKSPACE_FILE_ACTION = PREFIX
-            + "open_workspace_file_action_context"; //$NON-NLS-1$
-
-    // Dialogs
-   public static final String PROJECT_LOCATION_SELECTION_DIALOG = PREFIX
-            + "project_location_selection_dialog_context"; //$NON-NLS-1$
-
-    public static final String CONTAINER_SELECTION_DIALOG = PREFIX
-            + "container_selection_dialog_context"; //$NON-NLS-1$
-
-    public static final String FILE_SELECTION_DIALOG = PREFIX
-            + "file_selection_dialog_context"; //$NON-NLS-1$
-
-    public static final String RESOURCE_SELECTION_DIALOG = PREFIX
-            + "resource_selection_dialog_context"; //$NON-NLS-1$
-
-    public static final String DELETE_PROJECT_DIALOG = PREFIX
-            + "delete_project_dialog_context"; //$NON-NLS-1$
-
-    public static final String MARKER_RESOLUTION_SELECTION_DIALOG = PREFIX
-            + "marker_resolution_selection_dialog_context"; //$NON-NLS-1$
-
-     public static final String WELCOME_PAGE_SELECTION_DIALOG = PREFIX
-            + "welcome_page_selection_dialog"; //$NON-NLS-1$
-
-    public static final String TIPS_AND_TRICKS_PAGE_SELECTION_DIALOG = PREFIX
-            + "tips_and_tricks_page_selection_dialog"; //$NON-NLS-1$
-
-    public static final String OPEN_RESOURCE_DIALOG = PREFIX
-            + "open_resource_dialog"; //$NON-NLS-1$
-
-    public static final String NEW_FOLDER_DIALOG = PREFIX + "new_folder_dialog"; //$NON-NLS-1$
-
-    public static final String PATH_VARIABLE_SELECTION_DIALOG = PREFIX
-            + "path_variable_selection_dialog"; //$NON-NLS-1$
-
-    public static final String SAVE_AS_DIALOG = PREFIX
-    + "save_as_dialog_context"; //$NON-NLS-1$
-
-
-    // Editors
-    public static final String WELCOME_EDITOR = PREFIX
-            + "welcome_editor_context"; //$NON-NLS-1$
-
-    // Preference pages
-    public static final String BUILD_ORDER_PREFERENCE_PAGE = PREFIX
-            + "build_order_preference_page_context"; //$NON-NLS-1$
-
-    public static final String FILE_STATES_PREFERENCE_PAGE = PREFIX
-            + "file_states_preference_page_context"; //$NON-NLS-1$
-
-    public static final String LINKED_RESOURCE_PREFERENCE_PAGE = PREFIX
-            + "linked_resource_preference_page_context"; //$NON-NLS-1$
-
-    // Property pages
-    public static final String PROJECT_REFERENCE_PROPERTY_PAGE = PREFIX
-            + "project_reference_property_page_context"; //$NON-NLS-1$
-
-    public static final String RESOURCE_INFO_PROPERTY_PAGE = PREFIX
-            + "resource_info_property_page_context"; //$NON-NLS-1$
-
-    // Wizard pages
-    public static final String NEW_PROJECT_WIZARD_PAGE = PREFIX
-            + "new_project_wizard_page_context"; //$NON-NLS-1$
-
-    public static final String NEW_PROJECT_REFERENCE_WIZARD_PAGE = PREFIX
-            + "new_project_reference_wizard_page_context"; //$NON-NLS-1$
-
-    public static final String NEW_FOLDER_WIZARD_PAGE = PREFIX
-            + "new_folder_wizard_page_context"; //$NON-NLS-1$
-
-    public static final String NEW_FILE_WIZARD_PAGE = PREFIX
-            + "new_file_wizard_page_context"; //$NON-NLS-1$
-
-   public static final String NEW_LINK_WIZARD_PAGE = PREFIX
-            + "new_link_wizard_page_context"; //$NON-NLS-1$
-
-   public static final String WORKING_SET_RESOURCE_PAGE = PREFIX
-   			+ "working_set_resource_page"; //$NON-NLS-1$	
-
-   public static final String WORKSPACE_PREFERENCE_PAGE = PREFIX
-   			+ "workspace_preference_page_context"; //$NON-NLS-1$
-
-    // Wizards
-   
-   public static final String NEW_FILE_WIZARD = PREFIX
-   + "new_file_wizard_context"; //$NON-NLS-1$
-
-   public static final String NEW_FOLDER_WIZARD = PREFIX
-   	+ "new_folder_wizard_context"; //$NON-NLS-1$
-
-   public static final String NEW_PROJECT_WIZARD = PREFIX
-   	+ "new_project_wizard_context"; //$NON-NLS-1$
-   
-   public static final String SWITCH_WORKSPACE_ACTION = PREFIX
-	+ "switch_workspace_dialog_context"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IMarkerImageProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IMarkerImageProvider.java
deleted file mode 100644
index 4c088ec..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IMarkerImageProvider.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import org.eclipse.core.resources.IMarker;
-
-/**
- * Clients should implement this interface when creating an
- * extension to define images for marker dynamically.
- * <p>
- * The name of the class should be specified in the extension contributed 
- * to the workbench's maker image provider extension point 
- * (named <code>"org.eclipse.ui.makerImageProvider"</code>).
- * For example, the plug-in's XML markup might contain:
- * <pre>
- * &LT;extension point="org.eclipse.ui.makerImageProvider"&GT;
- *      &LT;imageprovider 
- *		   id="com.example.myplugin.myprofiderID"
- *         makertype="com.example.myMarkerType"
- *         icon="icons/basic/view16/myGIF.gif"/&GT;
- * &LT;/extension&GT;
- * </pre>
- * It can also define the image provider using the tag <code>class</code>
- * instead of icon.
- * </p>
- * Either the image path specified by the tag <code>icon</code> or
- * the path returned from <code>getImagePath</code> will be used
- * to create the image when the following code is executed:
- * <p><code>myMarker.getAdapter(IWorkbenchAdapter).getImageDescriptor(myMarker);</code></p>
- */
-public interface IMarkerImageProvider {
-    /**
-     * Returns the relative path for the image
-     * to be used for displaying an marker in the workbench.
-     * This path is relative to the plugin location
-     *
-     * Returns <code>null</code> if there is no appropriate image.
-     *
-     * @param marker The marker to get an image path for.
-     * @return String
-     *
-     */
-    public String getImagePath(IMarker marker);
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IURIEditorInputAdapterFactory.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IURIEditorInputAdapterFactory.java
deleted file mode 100644
index da9dd1f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/IURIEditorInputAdapterFactory.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.filesystem.URIUtil;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.core.runtime.IPath;
-
-import org.eclipse.ui.IPathEditorInput;
-import org.eclipse.ui.IURIEditorInput;
-import org.eclipse.ui.ide.FileStoreEditorInput;
-
-
-/**
- * Adapter factory for <code>IURIEditorInput</code>.
- * 
- * @since 3.3
- */
-public class IURIEditorInputAdapterFactory implements IAdapterFactory {
-
-	private static class PathEditorInputAdapter extends FileStoreEditorInput implements IPathEditorInput {
-
-		/**
-		 * Creates a new adapter for the given file store.
-		 * 
-		 * @param fileStore the file store;
-		 */
-		public PathEditorInputAdapter(IFileStore fileStore) {
-			super(fileStore);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.IPathEditorInput#getPath()
-		 */
-		public IPath getPath() {
-			return URIUtil.toPath(getURI());
-		}
-	}
-
-	
-	/** The list of provided adapters. */
-	private static final Class[] ADAPTER_LIST= new Class[] { IPathEditorInput.class };
-
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
-	 */
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (IPathEditorInput.class.equals(adapterType)) {
-			if (adaptableObject instanceof IURIEditorInput) {
-				IFileStore fileStore;
-				try {
-					fileStore= EFS.getStore(((IURIEditorInput) adaptableObject).getURI());
-					if (fileStore.getFileSystem() == EFS.getLocalFileSystem()) {
-						return new PathEditorInputAdapter(fileStore);
-					}
-				} catch (CoreException e) {
-					return null;
-				}
-			}
-		}
-		return null;
-	}
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return ADAPTER_LIST;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/LineDelimiterEditor.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/LineDelimiterEditor.java
deleted file mode 100644
index 1fb45cd..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/LineDelimiterEditor.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ProjectScope;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-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.osgi.service.prefs.BackingStoreException;
-
-/**
- * A class to handle editing of the Line delimiter preferences in core.
- * 
- * @since 3.1
- */
-public class LineDelimiterEditor {
-
-	private Button defaultButton;
-
-	private Button otherButton;
-
-	private Combo choiceCombo;
-
-	/*
-	 * The project whose preferences should be set. In some cases this class
-	 * will be used to edit project preferences.
-	 */
-	private IProject project;
-
-	private Group group;
-
-	/**
-	 * Creates a new encoding field editor with the given preference name, label
-	 * and parent.
-	 * 
-	 * @param composite
-	 *            the parent of the field editor's control
-	 */
-	public LineDelimiterEditor(Composite composite) {
-		this(composite, null);
-	}
-
-	/**
-	 * Creates a new encoding field editor with the given preference name, label
-	 * and parent.
-	 * 
-	 * @param composite
-	 *            the parent of the field editor's control
-	 * @param project
-	 *            the project to set preferences on
-	 * 
-	 */
-	public LineDelimiterEditor(Composite composite, IProject project) {
-		this.project = project;
-		createControl(composite);
-	}
-
-	/**
-	 * Creates this field editor's main control containing all of its basic
-	 * controls.
-	 * 
-	 * @param parent
-	 *            the parent control
-	 */
-	protected void createControl(Composite parent) {
-		Font font = parent.getFont();
-		group = new Group(parent, SWT.NONE);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		group.setLayoutData(data);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		group.setLayout(layout);
-		group.setText(IDEWorkbenchMessages.IDEWorkspacePreference_fileLineDelimiter);
-		group.setFont(font);
-
-		SelectionAdapter buttonListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (e.widget.equals(defaultButton)) {
-					updateState(true);
-				} else {
-					updateState(false);
-				}
-			}
-		};
-
-		defaultButton = new Button(group, SWT.RADIO);
-		if (project == null) {
-			defaultButton.setText(IDEWorkbenchMessages.IDEWorkspacePreference_defaultLineDelim);
-		} else {
-			defaultButton.setText(IDEWorkbenchMessages.IDEWorkspacePreference_defaultLineDelimProj);
-		}
-		
-		data = new GridData();
-		data.horizontalSpan = 2;
-		defaultButton.setLayoutData(data);
-		defaultButton.addSelectionListener(buttonListener);
-		defaultButton.setFont(font);
-
-		otherButton = new Button(group, SWT.RADIO);
-		otherButton
-				.setText(IDEWorkbenchMessages.IDEWorkspacePreference_otherLineDelim);
-		otherButton.addSelectionListener(buttonListener);
-		otherButton.setFont(font);
-
-		choiceCombo = new Combo(group, SWT.NONE | SWT.READ_ONLY);
-		data = new GridData();
-		choiceCombo.setFont(font);
-		choiceCombo.setLayoutData(data);
-		populateChoiceCombo(getChoices());
-	}
-
-	/**
-	 * Load the list items from core and update the state of the buttons to
-	 * match what the preference is currently set to.
-	 */
-	public void doLoad() {
-		if (choiceCombo != null) {
-			populateChoiceCombo(getChoices());
-			String resourcePreference = getStoredValue();
-			updateState(resourcePreference == null);
-		}
-	}
-
-	/**
-	 * Initializes this field editor with the preference value from the
-	 * preference store.
-	 */
-	public void loadDefault() {
-		if(choiceCombo != null) {
-			updateState(true);
-		}
-	}
-
-	/**
-	 * Returns the value that is currently stored for the encoding.
-	 * 
-	 * @return the currently stored encoding
-	 */
-	public String getStoredValue() {
-		IScopeContext[] scopeContext = new IScopeContext[] { getScopeContext() };
-		IEclipsePreferences node = scopeContext[0].getNode(Platform.PI_RUNTIME);
-		return node.get(Platform.PREF_LINE_SEPARATOR, null);
-	}
-
-	/**
-	 * Answer the <code>IScopeContext</code> for the receiver, this will be a
-	 * project scope if the receiver is editing project preferences, otherwise
-	 * instance scope.
-	 * 
-	 * @return the scope context
-	 */
-	private IScopeContext getScopeContext() {
-		if (project != null) {
-			return new ProjectScope(project);
-		}
-
-		return new InstanceScope();
-	}
-
-	/**
-	 * Returns the default setting for the object being shown.
-	 * 
-	 * @return the default setting for the object being shown
-	 */
-	protected String[] getChoices() {
-		Set keys = Platform.knownPlatformLineSeparators().keySet();
-		String[] keyArray = new String[keys.size()];
-		keys.toArray(keyArray);
-		return keyArray;
-	}
-
-	/**
-	 * Populates the list of choices combo.
-	 */
-	private void populateChoiceCombo(String[] items) {
-		choiceCombo.setItems(items);
-
-		if (getStoredValue() == null) {
-			choiceCombo.setText(""); //$NON-NLS-1$
-		} else {
-			selectChoice();
-		}
-	}
-
-	private void updateState(boolean useDefault) {
-		if (useDefault) {
-			defaultButton.setSelection(true);
-			otherButton.setSelection(false);
-			choiceCombo.setEnabled(false);
-		} else {
-			defaultButton.setSelection(false);
-			otherButton.setSelection(true);
-			choiceCombo.setEnabled(true);
-			selectChoice();
-		}
-	}
-
-	/**
-	 * Select the item in the combo that matches the current preferences
-	 * setting. NOTE: not handling the case where two platform line separators
-	 * are defined with the same value. Assumption is that they are unique and
-	 * the key will be modified to represent that. E.g. a key might be Mac OS
-	 * 10/Linux if the same value is required for two platforms.
-	 */
-	private void selectChoice() {
-		String selection = null;
-		Map knownValues = Platform.knownPlatformLineSeparators();
-		Set keys = knownValues.keySet();
-		String current = getStoredValue();
-		if (current != null) {
-			for (Iterator iter = keys.iterator(); iter.hasNext();) {
-				String element = (String) iter.next();
-				if (knownValues.get(element).equals(current)) {
-					selection = element;
-					break;
-				}
-			}
-		}
-		String[] items = choiceCombo.getItems();
-		for (int i = 0; i < items.length; i++) {
-			String item = items[i];
-			if (item.equals(selection)) {
-				choiceCombo.select(i);
-				break;
-			}
-		}
-	}
-
-	/**
-	 * Store the currently selected line delimiter value in the preference
-	 * store.
-	 */
-	public void store() {
-		String val;
-		if (defaultButton.getSelection() || choiceCombo.getText().equals("")) { //$NON-NLS-1$
-			val = null;
-		} else {
-			Map lineSeparators = Platform.knownPlatformLineSeparators();
-			val = (String) lineSeparators.get(choiceCombo.getText());
-		}
-
-		IEclipsePreferences node = getScopeContext().getNode(
-				Platform.PI_RUNTIME);
-		if (val == null) {
-			node.remove(Platform.PREF_LINE_SEPARATOR);
-		} else {
-			node.put(Platform.PREF_LINE_SEPARATOR, val);
-		}
-		try {
-			node.flush();
-		} catch (BackingStoreException e) {
-			IDEWorkbenchPlugin.log(e.getMessage(), e);
-		}
-
-	}
-
-	 /**
-     * Set whether or not the controls in the field editor
-     * are enabled.
-     * @param enabled The enabled state.
-     */
-    public void setEnabled(boolean enabled) {
-        group.setEnabled(enabled);
-        Control [] children = group.getChildren();
-        for (int i = 0; i < children.length; i++) {
-			children[i].setEnabled(enabled);
-			
-		}
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/LinkedResourceDecorator.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/LinkedResourceDecorator.java
deleted file mode 100644
index 859983a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/LinkedResourceDecorator.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import java.net.URI;
-
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-import org.eclipse.ui.internal.ide.dialogs.IDEResourceInfoUtils;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * A LinkedResourceDecorator decorates an element's image with a linked 
- * resource overlay. 
- * 
- * @since 2.1
- */
-public class LinkedResourceDecorator implements ILightweightLabelDecorator {
-    private static final ImageDescriptor LINK;
-
-    private static final ImageDescriptor LINK_WARNING;
-
-    static {
-        LINK = AbstractUIPlugin.imageDescriptorFromPlugin(
-                IDEWorkbenchPlugin.IDE_WORKBENCH,
-                "$nl$/icons/full/ovr16/link_ovr.gif"); //$NON-NLS-1$
-        LINK_WARNING = AbstractUIPlugin.imageDescriptorFromPlugin(
-                IDEWorkbenchPlugin.IDE_WORKBENCH,
-                "$nl$/icons/full/ovr16/linkwarn_ovr.gif"); //$NON-NLS-1$
-    }
-
-    /**
-     * Creates a new <code>LinkedResourceDecorator</code>.
-     */
-    public LinkedResourceDecorator() {
-    }
-
-    /**
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(ILabelProviderListener)
-     */
-    public void addListener(ILabelProviderListener listener) {
-    }
-
-    /**
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-     */
-    public void dispose() {
-        // no resources to dispose
-    }
-
-    /**
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-     */
-    public boolean isLabelProperty(Object element, String property) {
-        return false;
-    }
-
-    /**
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(ILabelProviderListener)
-     */
-    public void removeListener(ILabelProviderListener listener) {
-    }
-
-    /**
-     * Adds the linked resource overlay if the given element is a linked
-     * resource.
-     * 
-     * @param element element to decorate
-     * @param decoration  The decoration we are adding to
-     * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(Object, IDecoration)
-     */
-    public void decorate(Object element, IDecoration decoration) {
-
-        if (element instanceof IResource == false) {
-			return;
-		}
-        IResource resource = (IResource) element;
-        if (resource.isLinked()) {
-			IFileInfo fileInfo = null;
-			URI location = resource.getLocationURI();
-			if (location != null) {
-				fileInfo = IDEResourceInfoUtils.getFileInfo(location);
-			}
-			if (fileInfo != null && fileInfo.exists()) {
-				decoration.addOverlay(LINK);
-			} else {
-				decoration.addOverlay(LINK_WARNING);
-			}
-		}
-
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/Policy.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/Policy.java
deleted file mode 100644
index 0ee1506..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/Policy.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ui.statushandlers.StatusManager;
-
-/**
- * Policy is the class for the debug arguments in the ide.
- *
- */
-public class Policy {
-	
-	/**
-	 * The default value
-	 */
-    public static final boolean DEFAULT = false;
-
-    /**
-     * Option for opening an error dialog on internal error.
-     */
-    public static boolean DEBUG_OPEN_ERROR_DIALOG = DEFAULT;
-    
-    /**
-     * Option for reporting on garbage collection jobs.
-     */
-    public static boolean DEBUG_GC = DEFAULT;
-    
-    /**
-     * Option for monitoring undo.
-     */
-    public static boolean DEBUG_UNDOMONITOR = DEFAULT;
-    /**
-     * Option for monitoring core exceptions
-     */
-    public static boolean DEBUG_CORE_EXCEPTIONS = DEFAULT;
-
-    static {
-        if (getDebugOption("/debug")) { //$NON-NLS-1$
-            DEBUG_OPEN_ERROR_DIALOG = getDebugOption("/debug/internalerror/openDialog"); //$NON-NLS-1$
-            DEBUG_GC = getDebugOption("/debug/gc"); //$NON-NLS-1$
-            DEBUG_UNDOMONITOR = getDebugOption("/debug/undomonitor"); //$NON-NLS-1$
-            DEBUG_CORE_EXCEPTIONS = getDebugOption("/debug/coreExceptions"); //$NON-NLS-1$
-        }
-    }
-
-    private static boolean getDebugOption(String option) {
-        return "true".equalsIgnoreCase(Platform.getDebugOption(IDEWorkbenchPlugin.IDE_WORKBENCH + option)); //$NON-NLS-1$
-    }
-
-	/**
-	 * Handle the core exception.
-	 * 
-	 * @param exception
-	 */
-	public static void handle(CoreException exception) {
-		// Only log if in debug mode
-		if (DEBUG_CORE_EXCEPTIONS)
-			StatusManager.getManager().handle(exception,
-					IDEWorkbenchPlugin.IDE_WORKBENCH);
-	
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ProblemImageProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ProblemImageProvider.java
deleted file mode 100644
index 8301517..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ProblemImageProvider.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * Implementation of IMarkerImageProvider to provide the image
- * path names for problem markers.
- */
-public class ProblemImageProvider implements IMarkerImageProvider {
-    /**
-     * TaskImageProvider constructor comment.
-     */
-    public ProblemImageProvider() {
-        super();
-    }
-
-    /**
-     * Returns the relative path for the image
-     * to be used for displaying an marker in the workbench.
-     * This path is relative to the plugin location
-     *
-     * Returns <code>null</code> if there is no appropriate image.
-     *
-     * @param marker The marker to get an image path for.
-     *
-     */
-    public String getImagePath(IMarker marker) {
-        String iconPath = "/icons/full/";//$NON-NLS-1$		
-        if (isMarkerType(marker, IMarker.PROBLEM)) {
-            switch (marker.getAttribute(IMarker.SEVERITY,
-                    IMarker.SEVERITY_WARNING)) {
-            case IMarker.SEVERITY_ERROR:
-                return iconPath + "obj16/error_tsk.gif";//$NON-NLS-1$
-            case IMarker.SEVERITY_WARNING:
-                return iconPath + "obj16/warn_tsk.gif";//$NON-NLS-1$
-            case IMarker.SEVERITY_INFO:
-                return iconPath + "obj16/info_tsk.gif";//$NON-NLS-1$
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns whether the given marker is of the given type (either directly or indirectly).
-     */
-    private boolean isMarkerType(IMarker marker, String type) {
-        try {
-            return marker.isSubtypeOf(type);
-        } catch (CoreException e) {
-            return false;
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ResourceWorkingSetUpdater.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ResourceWorkingSetUpdater.java
deleted file mode 100644
index 2d8261d..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ResourceWorkingSetUpdater.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-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.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetUpdater;
-
-/**
- * A working set updater that updates resource working sets on resource deltas
- * 
- * @since 3.2
- */
-public class ResourceWorkingSetUpdater implements IWorkingSetUpdater,
-		IResourceChangeListener {
-
-	/**
-	 * Utility class used to help process incoming resource deltas.
-	 */
-	private static class WorkingSetDelta {
-		private IWorkingSet fWorkingSet;
-
-		private List fElements;
-
-		private boolean fChanged;
-
-		/**
-		 * Create a new instance of this class.
-		 * 
-		 * @param workingSet
-		 *            the working set to track.
-		 */
-		public WorkingSetDelta(IWorkingSet workingSet) {
-			fWorkingSet = workingSet;
-			fElements = new ArrayList(Arrays.asList(workingSet.getElements()));
-		}
-
-		/**
-		 * Returns the index of this element in the list of known elements.
-		 * 
-		 * @param element
-		 *            the element to search for
-		 * @return the index, or -1 if unknown.
-		 */
-		public int indexOf(Object element) {
-			return fElements.indexOf(element);
-		}
-
-		/**
-		 * Add a new element to the list of known elements.
-		 * 
-		 * @param index
-		 *            the index at which to place the element
-		 * @param element
-		 *            the element to set
-		 */
-		public void set(int index, Object element) {
-			fElements.set(index, element);
-			fChanged = true;
-		}
-
-		/**
-		 * Remove an element from the list of known elements.
-		 * 
-		 * @param index
-		 *            the index of the element to remove
-		 */
-		public void remove(int index) {
-			if (fElements.remove(index) != null) {
-				fChanged = true;
-			}
-		}
-
-		/**
-		 * Process the changes to this delta and update the working set if
-		 * necessary.
-		 */
-		public void process() {
-			if (fChanged) {
-				fWorkingSet.setElements((IAdaptable[]) fElements
-						.toArray(new IAdaptable[fElements.size()]));
-			}
-		}
-	}
-
-	private List fWorkingSets;
-
-	/**
-	 * Create a new instance of this updater.
-	 */
-	public ResourceWorkingSetUpdater() {
-		fWorkingSets = new ArrayList();
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(this,
-				IResourceChangeEvent.POST_CHANGE);
-	}
-
-	public void add(IWorkingSet workingSet) {
-		checkElementExistence(workingSet);
-		synchronized (fWorkingSets) {
-			fWorkingSets.add(workingSet);
-		}
-	}
-
-	public boolean remove(IWorkingSet workingSet) {
-		boolean result;
-		synchronized (fWorkingSets) {
-			result = fWorkingSets.remove(workingSet);
-		}
-
-		return result;
-	}
-
-	public boolean contains(IWorkingSet workingSet) {
-		synchronized (fWorkingSets) {
-			return fWorkingSets.contains(workingSet);
-		}
-	}
-
-	public void dispose() {
-		synchronized (fWorkingSets) {
-			fWorkingSets.clear();
-		}
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-	}
-
-	public void resourceChanged(IResourceChangeEvent event) {
-		IResourceDelta delta = event.getDelta();
-		if (delta == null) {
-			return;
-		}
-		IWorkingSet[] workingSets;
-		synchronized (fWorkingSets) {
-			workingSets = (IWorkingSet[]) fWorkingSets
-					.toArray(new IWorkingSet[fWorkingSets.size()]);
-		}
-		for (int w = 0; w < workingSets.length; w++) {
-			WorkingSetDelta workingSetDelta = new WorkingSetDelta(
-					workingSets[w]);
-			processResourceDelta(workingSetDelta, delta);
-			workingSetDelta.process();
-		}
-	}
-
-	private void processResourceDelta(WorkingSetDelta result,
-			IResourceDelta delta) {
-		IResource resource = delta.getResource();
-		int type = resource.getType();
-		int index = result.indexOf(resource);
-		int kind = delta.getKind();
-		int flags = delta.getFlags();
-		if (kind == IResourceDelta.CHANGED && type == IResource.PROJECT
-				&& index != -1) {
-			if ((flags & IResourceDelta.OPEN) != 0) {
-				result.set(index, resource);
-			}
-		}
-		if (index != -1 && kind == IResourceDelta.REMOVED) {
-			if ((flags & IResourceDelta.MOVED_TO) != 0) {
-				result.set(index, ResourcesPlugin.getWorkspace().getRoot()
-						.findMember(delta.getMovedToPath()));
-			} else {
-				result.remove(index);
-			}
-		}
-
-		// Don't dive into closed or opened projects
-		if (projectGotClosedOrOpened(resource, kind, flags)) {
-			return;
-		}
-
-		IResourceDelta[] children = delta.getAffectedChildren();
-		for (int i = 0; i < children.length; i++) {
-			processResourceDelta(result, children[i]);
-		}
-	}
-
-	private boolean projectGotClosedOrOpened(IResource resource, int kind,
-			int flags) {
-		return resource.getType() == IResource.PROJECT
-				&& kind == IResourceDelta.CHANGED
-				&& (flags & IResourceDelta.OPEN) != 0;
-	}
-
-	private void checkElementExistence(IWorkingSet workingSet) {
-		List elements = new ArrayList(Arrays.asList(workingSet.getElements()));
-		boolean changed = false;
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			IAdaptable element = (IAdaptable) iter.next();
-			boolean remove = false;
-			if (element instanceof IResource) {
-				IResource resource = (IResource) element;
-				IProject project = resource.getProject();
-				remove = (project != null ? project.isOpen() : true)
-						&& !resource.exists();
-			}
-			if (remove) {
-				iter.remove();
-				changed = true;
-			}
-		}
-		if (changed) {
-			workingSet.setElements((IAdaptable[]) elements
-					.toArray(new IAdaptable[elements.size()]));
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/StatusUtil.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/StatusUtil.java
deleted file mode 100644
index 29ac104..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/StatusUtil.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * Utility class to create status objects.
- * 
- * PRIVATE This class is an internal implementation class and should not be
- * referenced or sub-classed outside of the workbench
- * 
- * @since 3.0
- */
-public class StatusUtil {
-
-	/**
-	 * Answer a flat collection of the passed status and its recursive children
-	 */
-	protected static List flatten(IStatus aStatus) {
-		List result = new ArrayList();
-
-		if (aStatus.isMultiStatus()) {
-			IStatus[] children = aStatus.getChildren();
-			for (int i = 0; i < children.length; i++) {
-				IStatus currentChild = children[i];
-				if (currentChild.isMultiStatus()) {
-					Iterator childStatiiEnum = flatten(currentChild).iterator();
-					while (childStatiiEnum.hasNext()) {
-						result.add(childStatiiEnum.next());
-					}
-				} else {
-					result.add(currentChild);
-				}
-			}
-		} else {
-			result.add(aStatus);
-		}
-
-		return result;
-	}
-
-	/**
-	 * This method must not be called outside the workbench.
-	 * 
-	 * Utility method for creating status.
-	 */
-	protected static IStatus newStatus(IStatus[] stati, String message,
-			Throwable exception) {
-
-		if (message == null || message.trim().length() == 0) {
-			throw new IllegalArgumentException();
-		}
-		return new MultiStatus(IDEWorkbenchPlugin.IDE_WORKBENCH, IStatus.ERROR,
-				stati, message, exception);
-	}
-
-	
-	/**
-	 * This method must not be called outside the workbench.
-	 * 
-	 * Utility method for creating status.
-	 * @param severity
-	 * @param message
-	 * @param exception
-	 * @return {@link IStatus}
-	 */
-	public static IStatus newStatus(int severity, String message,
-			Throwable exception) {
-
-		String statusMessage = message;
-		if (message == null || message.trim().length() == 0) {
-			if (exception == null) {
-				throw new IllegalArgumentException();
-			} else if (exception.getMessage() == null) {
-				statusMessage = exception.toString();
-			} else {
-				statusMessage = exception.getMessage();
-			}
-		}
-
-		return new Status(severity, IDEWorkbenchPlugin.IDE_WORKBENCH, severity,
-				statusMessage, exception);
-	}
-
-	
-	/**
-	 * This method must not be called outside the workbench.
-	 * 
-	 * Utility method for creating status.
-	 * @param children
-	 * @param message
-	 * @param exception
-	 * @return {@link IStatus}
-	 */
-	public static IStatus newStatus(List children, String message,
-			Throwable exception) {
-
-		List flatStatusCollection = new ArrayList();
-		Iterator iter = children.iterator();
-		while (iter.hasNext()) {
-			IStatus currentStatus = (IStatus) iter.next();
-			Iterator childrenIter = flatten(currentStatus).iterator();
-			while (childrenIter.hasNext()) {
-				flatStatusCollection.add(childrenIter.next());
-			}
-		}
-
-		IStatus[] stati = new IStatus[flatStatusCollection.size()];
-		flatStatusCollection.toArray(stati);
-		return newStatus(stati, message, exception);
-	}
-
-	
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/StringMatcher.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/StringMatcher.java
deleted file mode 100644
index 2a4baa9..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/StringMatcher.java
+++ /dev/null
@@ -1,448 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import java.util.Vector;
-
-/**
- * A string pattern matcher suppporting &#39;*&#39; and &#39;&#63;&#39; wildcards.
- */
-public class StringMatcher {
-    protected String fPattern;
-
-    protected int fLength; // pattern length
-
-    protected boolean fIgnoreWildCards;
-
-    protected boolean fIgnoreCase;
-
-    protected boolean fHasLeadingStar;
-
-    protected boolean fHasTrailingStar;
-
-    protected String fSegments[]; //the given pattern is split into * separated segments
-
-    /* boundary value beyond which we don't need to search in the text */
-    protected int fBound = 0;
-
-    protected static final char fSingleWildCard = '\u0000';
-
-    public static class Position {
-        int start; //inclusive
-
-        int end; //exclusive
-
-        public Position(int start, int end) {
-            this.start = start;
-            this.end = end;
-        }
-
-        public int getStart() {
-            return start;
-        }
-
-        public int getEnd() {
-            return end;
-        }
-    }
-
-    /**
-     * StringMatcher constructor takes in a String object that is a simple 
-     * pattern which may contain &#39*&#39 for 0 and many characters and
-     * &#39;&#63;&#39; for exactly one character.  
-     *
-     * Literal &#39;*&#39; and &#39;*&#39; characters must be escaped in the pattern 
-     * e.g. &quot;&#92;*&quot; means literal &quot;*&quot;, etc.
-     *
-     * Escaping any other character (including the escape character itself), 
-     * just results in that character in the pattern.
-     * e.g. &quot;&#92;a&quot; means &quot;a&quot; and &quot;&#92;&#92;&quot; means &quot;&#92;&quot;
-     *
-     * If invoking the StringMatcher with string literals in Java, don't forget
-     * escape characters are represented by &quot;&#92;&#92;&quot;.
-     *
-     * @param pattern the pattern to match text against
-     * @param ignoreCase if true, case is ignored
-     * @param ignoreWildCards if true, wild cards and their escape sequences are ignored
-     * 		  (everything is taken literally).
-     */
-    public StringMatcher(String pattern, boolean ignoreCase,
-            boolean ignoreWildCards) {
-        if (pattern == null) {
-			throw new IllegalArgumentException();
-		}
-        fIgnoreCase = ignoreCase;
-        fIgnoreWildCards = ignoreWildCards;
-        fPattern = pattern;
-        fLength = pattern.length();
-
-        if (fIgnoreWildCards) {
-            parseNoWildCards();
-        } else {
-            parseWildCards();
-        }
-    }
-
-    /**
-     * Find the first occurrence of the pattern between <code>start</code)(inclusive) 
-     * and <code>end</code>(exclusive).  
-     * @param text  the String object to search in 
-     * @param start  the starting index of the search range, inclusive
-     * @param end  the ending index of the search range, exclusive
-     * @return an <code>StringMatcher.Position</code> object that keeps the starting 
-     * (inclusive) and ending positions (exclusive) of the first occurrence of the 
-     * pattern in the specified range of the text; return null if not found or subtext
-     * is empty (start==end). A pair of zeros is returned if pattern is empty string
-     * Note that for pattern like &quot;*abc*&quot; with leading and trailing stars, position of &quot;abc&quot;
-     * is returned. For a pattern like&quot;*&#63;&#63;*&quot; in text &quot;abcdf&quot;, (1,3) is returned
-     */
-    public StringMatcher.Position find(String text, int start, int end) {
-        if (text == null) {
-			throw new IllegalArgumentException();
-		}
-
-        int tlen = text.length();
-        if (start < 0) {
-			start = 0;
-		}
-        if (end > tlen) {
-			end = tlen;
-		}
-        if (end < 0 || start >= end) {
-			return null;
-		}
-        if (fLength == 0) {
-			return new Position(start, start);
-		}
-        if (fIgnoreWildCards) {
-            int x = posIn(text, start, end);
-            if (x < 0) {
-				return null;
-			}
-            return new Position(x, x + fLength);
-        }
-
-        int segCount = fSegments.length;
-        if (segCount == 0) {
-			return new Position(start, end);
-		}
-
-        int curPos = start;
-        int matchStart = -1;
-        int i;
-        for (i = 0; i < segCount && curPos < end; ++i) {
-            String current = fSegments[i];
-            int nextMatch = regExpPosIn(text, curPos, end, current);
-            if (nextMatch < 0) {
-				return null;
-			}
-            if (i == 0) {
-				matchStart = nextMatch;
-			}
-            curPos = nextMatch + current.length();
-        }
-        if (i < segCount) {
-			return null;
-		}
-        return new Position(matchStart, curPos);
-    }
-
-    /**
-     * match the given <code>text</code> with the pattern 
-     * @return true if matched eitherwise false
-     * @param text  a String object 
-     */
-    public boolean match(String text) {
-        return match(text, 0, text.length());
-    }
-
-    /**
-     * Given the starting (inclusive) and the ending (exclusive) positions in the   
-     * <code>text</code>, determine if the given substring matches with aPattern  
-     * @return true if the specified portion of the text matches the pattern
-     * @param text  a <code>String</code> object that contains the substring to match 
-     * @param start  marks the starting position (inclusive) of the substring
-     * @param end  marks the ending index (exclusive) of the substring 
-     */
-    public boolean match(String text, int start, int end) {
-        if (null == text) {
-			throw new IllegalArgumentException();
-		}
-
-        if (start > end) {
-			return false;
-		}
-
-        if (fIgnoreWildCards) {
-			return (end - start == fLength)
-                    && fPattern.regionMatches(fIgnoreCase, 0, text, start,
-                            fLength);
-		}
-        int segCount = fSegments.length;
-        if (segCount == 0 && (fHasLeadingStar || fHasTrailingStar)) {
-			return true;
-		}
-        if (start == end) {
-			return fLength == 0;
-		}
-        if (fLength == 0) {
-			return start == end;
-		}
-
-        int tlen = text.length();
-        if (start < 0) {
-			start = 0;
-		}
-        if (end > tlen) {
-			end = tlen;
-		}
-
-        int tCurPos = start;
-        int bound = end - fBound;
-        if (bound < 0) {
-			return false;
-		}
-        int i = 0;
-        String current = fSegments[i];
-        int segLength = current.length();
-
-        /* process first segment */
-        if (!fHasLeadingStar) {
-            if (!regExpRegionMatches(text, start, current, 0, segLength)) {
-                return false;
-            } else {
-                ++i;
-                tCurPos = tCurPos + segLength;
-            }
-        }
-        if ((fSegments.length == 1) && (!fHasLeadingStar)
-                && (!fHasTrailingStar)) {
-            // only one segment to match, no wildcards specified
-            return tCurPos == end;
-        }
-        /* process middle segments */
-        while (i < segCount) {
-            current = fSegments[i];
-            int currentMatch;
-            int k = current.indexOf(fSingleWildCard);
-            if (k < 0) {
-                currentMatch = textPosIn(text, tCurPos, end, current);
-                if (currentMatch < 0) {
-					return false;
-				}
-            } else {
-                currentMatch = regExpPosIn(text, tCurPos, end, current);
-                if (currentMatch < 0) {
-					return false;
-				}
-            }
-            tCurPos = currentMatch + current.length();
-            i++;
-        }
-
-        /* process final segment */
-        if (!fHasTrailingStar && tCurPos != end) {
-            int clen = current.length();
-            return regExpRegionMatches(text, end - clen, current, 0, clen);
-        }
-        return i == segCount;
-    }
-
-    /**
-     * This method parses the given pattern into segments seperated by wildcard '*' characters.
-     * Since wildcards are not being used in this case, the pattern consists of a single segment.
-     */
-    private void parseNoWildCards() {
-        fSegments = new String[1];
-        fSegments[0] = fPattern;
-        fBound = fLength;
-    }
-
-    /**
-     * Parses the given pattern into segments seperated by wildcard &#39;*&#39; characters.
-     * @param p, a String object that is a simple regular expression with ?*? and/or &#39;&#63;&#39;
-     */
-    private void parseWildCards() {
-        if (fPattern.startsWith("*")) { //$NON-NLS-1$
-			fHasLeadingStar = true;
-		}
-        if (fPattern.endsWith("*")) {//$NON-NLS-1$
-            /* make sure it's not an escaped wildcard */
-            if (fLength > 1 && fPattern.charAt(fLength - 2) != '\\') {
-                fHasTrailingStar = true;
-            }
-        }
-
-        Vector temp = new Vector();
-
-        int pos = 0;
-        StringBuffer buf = new StringBuffer();
-        while (pos < fLength) {
-            char c = fPattern.charAt(pos++);
-            switch (c) {
-            case '\\':
-                if (pos >= fLength) {
-                    buf.append(c);
-                } else {
-                    char next = fPattern.charAt(pos++);
-                    /* if it's an escape sequence */
-                    if (next == '*' || next == '?' || next == '\\') {
-                        buf.append(next);
-                    } else {
-                        /* not an escape sequence, just insert literally */
-                        buf.append(c);
-                        buf.append(next);
-                    }
-                }
-                break;
-            case '*':
-                if (buf.length() > 0) {
-                    /* new segment */
-                    temp.addElement(buf.toString());
-                    fBound += buf.length();
-                    buf.setLength(0);
-                }
-                break;
-            case '?':
-                /* append special character representing single match wildcard */
-                buf.append(fSingleWildCard);
-                break;
-            default:
-                buf.append(c);
-            }
-        }
-
-        /* add last buffer to segment list */
-        if (buf.length() > 0) {
-            temp.addElement(buf.toString());
-            fBound += buf.length();
-        }
-
-        fSegments = new String[temp.size()];
-        temp.copyInto(fSegments);
-    }
-
-    /** 
-     * @param text  a string which contains no wildcard
-     * @param start  the starting index in the text for search, inclusive
-     * @param end  the stopping point of search, exclusive
-     * @return the starting index in the text of the pattern , or -1 if not found 
-     */
-    protected int posIn(String text, int start, int end) {//no wild card in pattern
-        int max = end - fLength;
-
-        if (!fIgnoreCase) {
-            int i = text.indexOf(fPattern, start);
-            if (i == -1 || i > max) {
-				return -1;
-			}
-            return i;
-        }
-
-        for (int i = start; i <= max; ++i) {
-            if (text.regionMatches(true, i, fPattern, 0, fLength)) {
-				return i;
-			}
-        }
-
-        return -1;
-    }
-
-    /** 
-     * @param text  a simple regular expression that may only contain '&#63;'(s)
-     * @param start  the starting index in the text for search, inclusive
-     * @param end  the stopping point of search, exclusive
-     * @param p  a simple regular expression that may contains '&#63;'
-     * @return the starting index in the text of the pattern , or -1 if not found 
-     */
-    protected int regExpPosIn(String text, int start, int end, String p) {
-        int plen = p.length();
-
-        int max = end - plen;
-        for (int i = start; i <= max; ++i) {
-            if (regExpRegionMatches(text, i, p, 0, plen)) {
-				return i;
-			}
-        }
-        return -1;
-    }
-
-    /**
-     * 
-     * @return boolean
-     * @param  text  a String to match
-     * @param tStart  int that indicates the starting index of match, inclusive
-     * @param p  String,  String, a simple regular expression that may contain '&#63;'
-     * @param pStart
-     * @param plen 	
-     */
-    protected boolean regExpRegionMatches(String text, int tStart, String p,
-            int pStart, int plen) {
-        while (plen-- > 0) {
-            char tchar = text.charAt(tStart++);
-            char pchar = p.charAt(pStart++);
-
-            /* process wild cards */
-            if (!fIgnoreWildCards) {
-                /* skip single wild cards */
-                if (pchar == fSingleWildCard) {
-                    continue;
-                }
-            }
-            if (pchar == tchar) {
-				continue;
-			}
-            if (fIgnoreCase) {
-                if (Character.toUpperCase(tchar) == Character
-                        .toUpperCase(pchar)) {
-					continue;
-				}
-                // comparing after converting to upper case doesn't handle all cases;
-                // also compare after converting to lower case
-                if (Character.toLowerCase(tchar) == Character
-                        .toLowerCase(pchar)) {
-					continue;
-				}
-            }
-            return false;
-        }
-        return true;
-    }
-
-    /** 
-     * @param text  the string to match
-     * @param start  the starting index in the text for search, inclusive
-     * @param end  the stopping point of search, exclusive
-     * @param p  a string that has no wildcard
-     * @return the starting index in the text of the pattern , or -1 if not found 
-     */
-    protected int textPosIn(String text, int start, int end, String p) {
-
-        int plen = p.length();
-        int max = end - plen;
-
-        if (!fIgnoreCase) {
-            int i = text.indexOf(p, start);
-            if (i == -1 || i > max) {
-				return -1;
-			}
-            return i;
-        }
-
-        for (int i = start; i <= max; ++i) {
-            if (text.regionMatches(true, i, p, 0, plen)) {
-				return i;
-			}
-        }
-
-        return -1;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/TipsAndTricksAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/TipsAndTricksAction.java
deleted file mode 100644
index ccfbca0..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/TipsAndTricksAction.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - Fix for bug 93373 - [Intro] 
- *     		TipsAndTricksAction should not use magic numbers
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.runtime.IProduct;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.PartEventAction;
-
-/**
- * Launch the tips and tricks action.
- */
-public class TipsAndTricksAction extends PartEventAction implements
-        ActionFactory.IWorkbenchAction {
-
-    /**
-     * The workbench window this action is registered with.
-     */
-    private IWorkbenchWindow workbenchWindow;
-
-    /**
-     * Create an instance of this class.
-     * 
-     * @param window the window
-     */
-    public TipsAndTricksAction(IWorkbenchWindow window) {
-        super(IDEWorkbenchMessages.TipsAndTricks_text);
-        if (window == null) {
-            throw new IllegalArgumentException();
-        }
-        this.workbenchWindow = window;
-        setToolTipText(IDEWorkbenchMessages.TipsAndTricks_toolTip);
-        window.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.TIPS_AND_TRICKS_ACTION);
-        setActionDefinitionId("org.eclipse.ui.help.tipsAndTricksAction"); //$NON-NLS-1$
-        workbenchWindow.getPartService().addPartListener(this);
-    }
-
-    /**
-     *	The user has invoked this action
-     */
-    public void run() {
-        if (workbenchWindow == null) {
-            // action has been disposed
-            return;
-        }
-        // Ask the user to select a feature
-        AboutInfo[] featureInfos = IDEWorkbenchPlugin.getDefault()
-                .getFeatureInfos();
-        ArrayList tipsAndTricksFeatures = new ArrayList(featureInfos.length);
-        for (int i = 0; i < featureInfos.length; i++) {
-            if (featureInfos[i].getTipsAndTricksHref() != null) {
-				tipsAndTricksFeatures.add(featureInfos[i]);
-			}
-        }
-
-        Shell shell = workbenchWindow.getShell();
-
-        if (tipsAndTricksFeatures.size() == 0) {
-            MessageDialog.openInformation(shell, IDEWorkbenchMessages.TipsAndTricksMessageDialog_title,
-                    IDEWorkbenchMessages.TipsAndTricksMessageDialog_message);
-            return;
-        }
-
-        AboutInfo[] features = new AboutInfo[tipsAndTricksFeatures.size()];
-        tipsAndTricksFeatures.toArray(features);
-
-        IProduct product = Platform.getProduct();
-        FeatureSelectionDialog d = new FeatureSelectionDialog(shell, features,
-                product == null ? null : product.getId(), IDEWorkbenchMessages.TipsAndTricksPageSelectionDialog_title,
-                IDEWorkbenchMessages.TipsAndTricksPageSelectionDialog_message,
-                IIDEHelpContextIds.TIPS_AND_TRICKS_PAGE_SELECTION_DIALOG);
-        d.create();
-        d.getOkButton().setEnabled(false);
-        
-        if (d.open() != Window.OK || d.getResult().length != 1) {
-			return;
-		}
-
-        AboutInfo feature = (AboutInfo) d.getResult()[0];
-
-        /**
-         * Open the tips and trick help topic
-         */
-        if (feature != null) {
-            final String href = feature.getTipsAndTricksHref();
-            if (href != null) {
-                BusyIndicator.showWhile(shell.getDisplay(), new Runnable() {
-                    public void run() {
-                        workbenchWindow.getWorkbench().getHelpSystem()
-								.displayHelpResource(href);
-                    }
-                });
-            } else {
-                IStatus status = new Status(
-                        IStatus.ERROR,
-                        IDEWorkbenchPlugin.IDE_WORKBENCH,
-                        IStatus.INFO,
-                        IDEWorkbenchMessages.TipsAndTricksErrorDialog_noHref, null);
-                ErrorDialog.openError(shell, IDEWorkbenchMessages.TipsAndTricksErrorDialog_title,
-                        IDEWorkbenchMessages.TipsAndTricksErrorDialog_noHref,
-                        status);
-            }
-        } else {
-            IStatus status = new Status(IStatus.ERROR,
-                    IDEWorkbenchPlugin.IDE_WORKBENCH, IStatus.INFO, IDEWorkbenchMessages.TipsAndTricksErrorDialog_noHref, null);
-            ErrorDialog.openError(shell, IDEWorkbenchMessages.TipsAndTricksErrorDialog_title,
-                    IDEWorkbenchMessages.TipsAndTricksErrorDialog_noFeatures, 
-                    status);
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ActionFactory.IWorkbenchAction.
-     */
-    public void dispose() {
-        if (workbenchWindow == null) {
-            // action has already been disposed
-            return;
-        }
-        workbenchWindow.getPartService().removePartListener(this);
-        workbenchWindow = null;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/WorkbenchActionBuilder.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/WorkbenchActionBuilder.java
deleted file mode 100644
index 0029c16..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/WorkbenchActionBuilder.java
+++ /dev/null
@@ -1,1493 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Andreas Buchen <andreas.buchen@sap.com> - Bug 206584
- *******************************************************************************/
-package org.eclipse.ui.internal.ide;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.ICoolBarManager;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.action.StatusLineContributionItem;
-import org.eclipse.jface.internal.provisional.action.IToolBarContributionItem;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IPageListener;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.BuildAction;
-import org.eclipse.ui.actions.ContributionItemFactory;
-import org.eclipse.ui.actions.NewWizardMenu;
-import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.ide.IDEActionFactory;
-import org.eclipse.ui.ide.IIDEActionConstants;
-import org.eclipse.ui.internal.IPreferenceConstants;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.internal.WorkbenchMessages;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.handlers.IActionCommandMappingService;
-import org.eclipse.ui.internal.ide.actions.BuildSetMenu;
-import org.eclipse.ui.internal.ide.actions.BuildUtilities;
-import org.eclipse.ui.internal.ide.actions.QuickMenuAction;
-import org.eclipse.ui.internal.ide.actions.RetargetActionWithDefault;
-import org.eclipse.ui.internal.provisional.application.IActionBarConfigurer2;
-import org.eclipse.ui.menus.CommandContributionItem;
-import org.eclipse.ui.menus.CommandContributionItemParameter;
-import org.eclipse.ui.menus.IMenuService;
-
-/**
- * Adds actions to a workbench window.
- */
-public final class WorkbenchActionBuilder extends ActionBarAdvisor {
-    private final IWorkbenchWindow window;
-
-    // generic actions
-    private IWorkbenchAction closeAction;
-
-    private IWorkbenchAction closeAllAction;
-    
-    private IWorkbenchAction closeOthersAction;
-
-    private IWorkbenchAction closeAllSavedAction;
-
-    private IWorkbenchAction saveAction;
-
-    private IWorkbenchAction saveAllAction;
-
-    private IWorkbenchAction newWindowAction;
-    
-    private IWorkbenchAction newEditorAction;
-
-    private IWorkbenchAction helpContentsAction;
-
-    private IWorkbenchAction helpSearchAction;
-	
-    private IWorkbenchAction dynamicHelpAction;
-    
-    private IWorkbenchAction aboutAction;
-
-    private IWorkbenchAction openPreferencesAction;
-
-    private IWorkbenchAction saveAsAction;
-
-    private IWorkbenchAction hideShowEditorAction;
-
-    private IWorkbenchAction savePerspectiveAction;
-
-    private IWorkbenchAction resetPerspectiveAction;
-
-    private IWorkbenchAction editActionSetAction;
-
-    private IWorkbenchAction closePerspAction;
-
-    private IWorkbenchAction lockToolBarAction;
-
-    private IWorkbenchAction closeAllPerspsAction;
-
-    private IWorkbenchAction showViewMenuAction;
-
-    private IWorkbenchAction showPartPaneMenuAction;
-
-    private IWorkbenchAction nextPartAction;
-
-    private IWorkbenchAction prevPartAction;
-
-    private IWorkbenchAction nextEditorAction;
-
-    private IWorkbenchAction prevEditorAction;
-
-    private IWorkbenchAction nextPerspectiveAction;
-
-    private IWorkbenchAction prevPerspectiveAction;
-
-    private IWorkbenchAction activateEditorAction;
-
-    private IWorkbenchAction maximizePartAction;
-    
-    private IWorkbenchAction minimizePartAction;
-
-    private IWorkbenchAction switchToEditorAction;
-
-	private IWorkbenchAction workbookEditorsAction;
-
-    private IWorkbenchAction quickAccessAction;
-
-    private IWorkbenchAction backwardHistoryAction;
-
-    private IWorkbenchAction forwardHistoryAction;
-
-    // generic retarget actions
-    private IWorkbenchAction undoAction;
-
-    private IWorkbenchAction redoAction;
-
-    private IWorkbenchAction quitAction;
-
-    private IWorkbenchAction goIntoAction;
-
-    private IWorkbenchAction backAction;
-
-    private IWorkbenchAction forwardAction;
-
-    private IWorkbenchAction upAction;
-
-    private IWorkbenchAction nextAction;
-
-    private IWorkbenchAction previousAction;
-
-    // IDE-specific actions
-    private IWorkbenchAction openWorkspaceAction;
-
-    private IWorkbenchAction projectPropertyDialogAction;
-
-    private IWorkbenchAction newWizardAction;
-
-    private IWorkbenchAction newWizardDropDownAction;
-
-    private IWorkbenchAction importResourcesAction;
-    
-    private IWorkbenchAction exportResourcesAction;
-
-    IWorkbenchAction buildAllAction; // Incremental workspace build
-
-    private IWorkbenchAction cleanAction;
-
-    private IWorkbenchAction toggleAutoBuildAction;
-
-    MenuManager buildWorkingSetMenu;
-
-    private IWorkbenchAction quickStartAction;
-
-    private IWorkbenchAction tipsAndTricksAction;
-
-    private QuickMenuAction showInQuickMenu;
-
-    private QuickMenuAction newQuickMenu;
-
-    private IWorkbenchAction introAction;
-
-    // IDE-specific retarget actions
-    IWorkbenchAction buildProjectAction;
-
-    // contribution items
-    // @issue should obtain from ContributionItemFactory
-    private NewWizardMenu newWizardMenu;
-
-    private IContributionItem pinEditorContributionItem;
-
-//    private IContributionItem searchComboItem;
-    
-    // @issue class is workbench internal
-    private StatusLineContributionItem statusLineItem;
-
-    private Preferences.IPropertyChangeListener prefListener;
-
-    // listener for the "close editors automatically"
-    // preference change
-    private IPropertyChangeListener propPrefListener;
-
-    private IPageListener pageListener;
-
-    private IResourceChangeListener resourceListener;
-    
-    /**
-     * Indicates if the action builder has been disposed
-     */
-    private boolean isDisposed = false;
-
-    /**
-     * The coolbar context menu manager.
-     * @since 3.3
-     */
-	private MenuManager coolbarPopupMenuManager;
-
-    /**
-     * Constructs a new action builder which contributes actions
-     * to the given window.
-     * 
-     * @param configurer the action bar configurer for the window
-     */
-    public WorkbenchActionBuilder(IActionBarConfigurer configurer) {
-        super(configurer);
-        window = configurer.getWindowConfigurer().getWindow();
-    }
-
-    /**
-     * Returns the window to which this action builder is contributing.
-     */
-    private IWorkbenchWindow getWindow() {
-        return window;
-    }
-
-    /**
-     * Hooks listeners on the preference store and the window's page, perspective and selection services.
-     */
-    private void hookListeners() {
-
-        pageListener = new IPageListener() {
-            public void pageActivated(IWorkbenchPage page) {
-                // do nothing
-            }
-
-            public void pageClosed(IWorkbenchPage page) {
-                // do nothing
-            }
-
-            public void pageOpened(IWorkbenchPage page) {
-                // set default build handler -- can't be done until the shell is available
-                IAction buildHandler = new BuildAction(page.getWorkbenchWindow(), IncrementalProjectBuilder.INCREMENTAL_BUILD);
-            	((RetargetActionWithDefault)buildProjectAction).setDefaultHandler(buildHandler);
-            }
-        };
-        getWindow().addPageListener(pageListener);
-
-        prefListener = new Preferences.IPropertyChangeListener() {
-            public void propertyChange(Preferences.PropertyChangeEvent event) {
-                if (event.getProperty().equals(
-                        ResourcesPlugin.PREF_AUTO_BUILDING)) {
-                   	updateBuildActions(false);
-                }
-            }
-        };
-        ResourcesPlugin.getPlugin().getPluginPreferences()
-                .addPropertyChangeListener(prefListener);
-
-        // listener for the "close editors automatically"
-        // preference change
-        propPrefListener = new IPropertyChangeListener() {
-            public void propertyChange(PropertyChangeEvent event) {
-                if (event.getProperty().equals(
-						IPreferenceConstants.REUSE_EDITORS_BOOLEAN)) {
-                    if (window.getShell() != null
-                            && !window.getShell().isDisposed()) {
-                        // this property change notification could be from a non-ui thread
-                        window.getShell().getDisplay().syncExec(new Runnable() {
-                            public void run() {
-                                updatePinActionToolbar();
-                            }
-                        });
-                    }
-                }
-            }
-        };
-        /*
-         * In order to ensure that the pin action toolbar sets its size 
-         * correctly, the pin action should set its visiblity before we call updatePinActionToolbar().
-         * 
-         * In other words we always want the PinActionContributionItem to be notified before the 
-         * WorkbenchActionBuilder.
-         */
-        WorkbenchPlugin.getDefault().getPreferenceStore()
-                .addPropertyChangeListener(propPrefListener);
-        //listen for project description changes, which can affect enablement of build actions
-        resourceListener = new IResourceChangeListener() {
-			public void resourceChanged(IResourceChangeEvent event) {
-				IResourceDelta delta = event.getDelta();
-				if (delta == null) {
-					return;
-				}
-				IResourceDelta[] projectDeltas = delta.getAffectedChildren();
-				for (int i = 0; i < projectDeltas.length; i++) {
-					int kind = projectDeltas[i].getKind();
-					//affected by projects being opened/closed or description changes
-					boolean changed = (projectDeltas[i].getFlags() & (IResourceDelta.DESCRIPTION | IResourceDelta.OPEN)) != 0;
-					if (kind != IResourceDelta.CHANGED || changed) {
-						updateBuildActions(false);
-						return;
-					}
-				}
-			}
-		};
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceListener, IResourceChangeEvent.POST_CHANGE);
-    }
-
-    public void fillActionBars(int flags) {
-        super.fillActionBars(flags);
-        if ((flags & FILL_PROXY) == 0) {
-            updateBuildActions(true);
-            hookListeners();
-        }
-    }
-
-    /**
-     * Fills the coolbar with the workbench actions.
-     */
-    protected void fillCoolBar(ICoolBarManager coolBar) {
-
-    	IActionBarConfigurer2 actionBarConfigurer = (IActionBarConfigurer2) getActionBarConfigurer();
-        { // Set up the context Menu
-            coolbarPopupMenuManager = new MenuManager();
-			coolbarPopupMenuManager.add(new ActionContributionItem(lockToolBarAction));
-            coolbarPopupMenuManager.add(new ActionContributionItem(editActionSetAction));
-            coolBar.setContextMenuManager(coolbarPopupMenuManager);
-            IMenuService menuService = (IMenuService) window.getService(IMenuService.class);
-            menuService.populateContributionManager(coolbarPopupMenuManager, "popup:windowCoolbarContextMenu"); //$NON-NLS-1$
-        }
-        coolBar.add(new GroupMarker(IIDEActionConstants.GROUP_FILE));
-        { // File Group
-            IToolBarManager fileToolBar = actionBarConfigurer.createToolBarManager();
-            fileToolBar.add(new Separator(IWorkbenchActionConstants.NEW_GROUP));
-            fileToolBar.add(newWizardDropDownAction);
-            fileToolBar.add(new GroupMarker(IWorkbenchActionConstants.NEW_EXT));
-            fileToolBar.add(new GroupMarker(
-                    IWorkbenchActionConstants.SAVE_GROUP));
-            fileToolBar.add(saveAction);
-            fileToolBar
-                    .add(new GroupMarker(IWorkbenchActionConstants.SAVE_EXT));
-            fileToolBar.add(getPrintItem());
-            fileToolBar
-                    .add(new GroupMarker(IWorkbenchActionConstants.PRINT_EXT));
-
-            fileToolBar
-                    .add(new Separator(IWorkbenchActionConstants.BUILD_GROUP));
-            fileToolBar
-                    .add(new GroupMarker(IWorkbenchActionConstants.BUILD_EXT));
-            fileToolBar.add(new Separator(
-                    IWorkbenchActionConstants.MB_ADDITIONS));
-
-            // Add to the cool bar manager
-            coolBar.add(actionBarConfigurer.createToolBarContributionItem(fileToolBar,
-                    IWorkbenchActionConstants.TOOLBAR_FILE));
-        }
-
-        coolBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-
-        coolBar.add(new GroupMarker(IIDEActionConstants.GROUP_NAV));
-        { // Navigate group
-            IToolBarManager navToolBar = actionBarConfigurer.createToolBarManager();
-            navToolBar.add(new Separator(
-                    IWorkbenchActionConstants.HISTORY_GROUP));
-            navToolBar
-                    .add(new GroupMarker(IWorkbenchActionConstants.GROUP_APP));
-            navToolBar.add(backwardHistoryAction);
-            navToolBar.add(forwardHistoryAction);
-            navToolBar.add(new Separator(IWorkbenchActionConstants.PIN_GROUP));
-            navToolBar.add(pinEditorContributionItem);
-
-            // Add to the cool bar manager
-            coolBar.add(actionBarConfigurer.createToolBarContributionItem(navToolBar,
-                    IWorkbenchActionConstants.TOOLBAR_NAVIGATE));
-        }
-
-        coolBar.add(new GroupMarker(IWorkbenchActionConstants.GROUP_EDITOR));
-     
-        coolBar.add(new GroupMarker(IWorkbenchActionConstants.GROUP_HELP));
-        
-        { // Help group
-            IToolBarManager helpToolBar = actionBarConfigurer.createToolBarManager();
-            helpToolBar.add(new Separator(IWorkbenchActionConstants.GROUP_HELP));
-//            helpToolBar.add(searchComboItem);
-              // Add the group for applications to contribute
-            helpToolBar.add(new GroupMarker(IWorkbenchActionConstants.GROUP_APP));              
-            // Add to the cool bar manager
-            coolBar.add(actionBarConfigurer.createToolBarContributionItem(helpToolBar,
-                    IWorkbenchActionConstants.TOOLBAR_HELP));
-        }        
-
-    }
-
-    /**
-     * Fills the menu bar with the workbench actions.
-     */
-    protected void fillMenuBar(IMenuManager menuBar) {
-        menuBar.add(createFileMenu());
-        menuBar.add(createEditMenu());
-        menuBar.add(createNavigateMenu());
-        menuBar.add(createProjectMenu());
-        menuBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-        menuBar.add(createWindowMenu());
-        menuBar.add(createHelpMenu());
-    }
-
-    /**
-     * Creates and returns the File menu.
-     */
-    private MenuManager createFileMenu() {
-        MenuManager menu = new MenuManager(IDEWorkbenchMessages.Workbench_file, IWorkbenchActionConstants.M_FILE);
-        menu.add(new GroupMarker(IWorkbenchActionConstants.FILE_START));
-        {
-            // create the New submenu, using the same id for it as the New action
-            String newText = IDEWorkbenchMessages.Workbench_new;
-            String newId = ActionFactory.NEW.getId();
-            MenuManager newMenu = new MenuManager(newText, newId);
-            newMenu.setActionDefinitionId("org.eclipse.ui.file.newQuickMenu"); //$NON-NLS-1$
-            newMenu.add(new Separator(newId));
-            this.newWizardMenu = new NewWizardMenu(getWindow());
-            newMenu.add(this.newWizardMenu);
-            newMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-            menu.add(newMenu);
-        }
-		
-        menu.add(new GroupMarker(IWorkbenchActionConstants.NEW_EXT));
-        menu.add(new Separator());
-
-        menu.add(closeAction);
-        menu.add(closeAllAction);
-        //		menu.add(closeAllSavedAction);
-        menu.add(new GroupMarker(IWorkbenchActionConstants.CLOSE_EXT));
-        menu.add(new Separator());
-        menu.add(saveAction);
-        menu.add(saveAsAction);
-        menu.add(saveAllAction);
-        menu.add(getRevertItem());
-        menu.add(new Separator());
-        menu.add(getMoveItem());
-        menu.add(getRenameItem());
-        menu.add(getRefreshItem());
-
-        menu.add(new GroupMarker(IWorkbenchActionConstants.SAVE_EXT));
-        menu.add(new Separator());
-        menu.add(getPrintItem());
-        menu.add(new GroupMarker(IWorkbenchActionConstants.PRINT_EXT));
-        menu.add(new Separator());
-        menu.add(openWorkspaceAction);
-        menu.add(new GroupMarker(IWorkbenchActionConstants.OPEN_EXT));
-        menu.add(new Separator());
-        menu.add(importResourcesAction);
-        menu.add(exportResourcesAction);
-        menu.add(new GroupMarker(IWorkbenchActionConstants.IMPORT_EXT));
-        menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-
-        menu.add(new Separator());
-        menu.add(getPropertiesItem());
-
-        menu.add(ContributionItemFactory.REOPEN_EDITORS.create(getWindow()));
-        menu.add(new GroupMarker(IWorkbenchActionConstants.MRU));
-        menu.add(new Separator());
-        
-        // If we're on OS X we shouldn't show this command in the File menu. It
-		// should be invisible to the user. However, we should not remove it -
-		// the carbon UI code will do a search through our menu structure
-		// looking for it when Cmd-Q is invoked (or Quit is chosen from the
-		// application menu.
-		ActionContributionItem quitItem = new ActionContributionItem(quitAction);
-		quitItem.setVisible(!Util.isMac());
-		menu.add(quitItem);
-		menu.add(new GroupMarker(IWorkbenchActionConstants.FILE_END));
-		return menu;
-    }
-
-    /**
-	 * Creates and returns the Edit menu.
-	 */
-    private MenuManager createEditMenu() {
-        MenuManager menu = new MenuManager(IDEWorkbenchMessages.Workbench_edit, IWorkbenchActionConstants.M_EDIT);
-        menu.add(new GroupMarker(IWorkbenchActionConstants.EDIT_START));
-
-        menu.add(undoAction);
-        menu.add(redoAction);
-        menu.add(new GroupMarker(IWorkbenchActionConstants.UNDO_EXT));
-        menu.add(new Separator());
-
-        menu.add(getCutItem());
-        menu.add(getCopyItem());
-        menu.add(getPasteItem());
-        menu.add(new GroupMarker(IWorkbenchActionConstants.CUT_EXT));
-        menu.add(new Separator());
-
-        menu.add(getDeleteItem());
-        menu.add(getSelectAllItem());
-        menu.add(new Separator());
-
-        menu.add(getFindItem());
-        menu.add(new GroupMarker(IWorkbenchActionConstants.FIND_EXT));
-        menu.add(new Separator());
-
-        menu.add(getBookmarkItem());
-        menu.add(getTaskItem());
-        menu.add(new GroupMarker(IWorkbenchActionConstants.ADD_EXT));
-
-        menu.add(new GroupMarker(IWorkbenchActionConstants.EDIT_END));
-        menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-        return menu;
-    }
-
-    /**
-     * Creates and returns the Navigate menu.
-     */
-    private MenuManager createNavigateMenu() {
-        MenuManager menu = new MenuManager(
-                IDEWorkbenchMessages.Workbench_navigate, IWorkbenchActionConstants.M_NAVIGATE);
-        menu.add(new GroupMarker(IWorkbenchActionConstants.NAV_START));
-        menu.add(goIntoAction);
-
-        MenuManager goToSubMenu = new MenuManager(IDEWorkbenchMessages.Workbench_goTo, IWorkbenchActionConstants.GO_TO);
-        menu.add(goToSubMenu);
-        goToSubMenu.add(backAction);
-        goToSubMenu.add(forwardAction);
-        goToSubMenu.add(upAction);
-        goToSubMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-
-        menu.add(new Separator(IWorkbenchActionConstants.OPEN_EXT));
-        for (int i = 2; i < 5; ++i) {
-            menu.add(new Separator(IWorkbenchActionConstants.OPEN_EXT + i));
-        }
-        menu.add(new Separator(IWorkbenchActionConstants.SHOW_EXT));
-        {
-			MenuManager showInSubMenu = new MenuManager(
-					IDEWorkbenchMessages.Workbench_showIn, "showIn"); //$NON-NLS-1$
-			showInSubMenu.setActionDefinitionId(showInQuickMenu
-					.getActionDefinitionId());
-			showInSubMenu.add(ContributionItemFactory.VIEWS_SHOW_IN
-					.create(getWindow()));
-			menu.add(showInSubMenu);
-		}
-        for (int i = 2; i < 5; ++i) {
-            menu.add(new Separator(IWorkbenchActionConstants.SHOW_EXT + i));
-        }
-        menu.add(new Separator());
-        menu.add(nextAction);
-        menu.add(previousAction);
-        menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-        menu.add(new GroupMarker(IWorkbenchActionConstants.NAV_END));
-
-        //TBD: Location of this actions
-        menu.add(new Separator());
-        menu.add(backwardHistoryAction);
-        menu.add(forwardHistoryAction);
-        return menu;
-    }
-
-    /**
-     * Creates and returns the Project menu.
-     */
-    private MenuManager createProjectMenu() {
-        MenuManager menu = new MenuManager(
-                IDEWorkbenchMessages.Workbench_project, IWorkbenchActionConstants.M_PROJECT);
-        menu.add(new Separator(IWorkbenchActionConstants.PROJ_START));
-
-        menu.add(getOpenProjectItem());
-        menu.add(getCloseProjectItem());
-        menu.add(new GroupMarker(IWorkbenchActionConstants.OPEN_EXT));
-        menu.add(new Separator());
-        menu.add(buildAllAction);
-        menu.add(buildProjectAction);
-        addWorkingSetBuildActions(menu);
-        menu.add(cleanAction);
-        menu.add(toggleAutoBuildAction);
-        menu.add(new GroupMarker(IWorkbenchActionConstants.BUILD_EXT));
-        menu.add(new Separator());
-
-        menu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-        menu.add(new GroupMarker(IWorkbenchActionConstants.PROJ_END));
-        menu.add(new Separator());
-        menu.add(projectPropertyDialogAction);
-        return menu;
-    }
-
-    /**
-     * Creates and returns the Window menu.
-     */
-    private MenuManager createWindowMenu() {
-        MenuManager menu = new MenuManager(
-                IDEWorkbenchMessages.Workbench_window, IWorkbenchActionConstants.M_WINDOW);
-
-        menu.add(newWindowAction);
-		menu.add(newEditorAction);
-		
-        menu.add(new Separator());
-        addPerspectiveActions(menu);
-        menu.add(new Separator());
-        addKeyboardShortcuts(menu);
-        Separator sep = new Separator(IWorkbenchActionConstants.MB_ADDITIONS);
-		sep.setVisible(!Util.isMac());
-		menu.add(sep);
-        
-        // See the comment for quit in createFileMenu
-        ActionContributionItem openPreferencesItem = new ActionContributionItem(openPreferencesAction);
-        openPreferencesItem.setVisible(!Util.isMac());
-        menu.add(openPreferencesItem);
-
-        menu.add(ContributionItemFactory.OPEN_WINDOWS.create(getWindow()));
-        return menu;
-    }
-
-    /**
-     * Adds the perspective actions to the specified menu.
-     */
-    private void addPerspectiveActions(MenuManager menu) {
-        {
-            String openText = IDEWorkbenchMessages.Workbench_openPerspective;
-            MenuManager changePerspMenuMgr = new MenuManager(openText,
-                    "openPerspective"); //$NON-NLS-1$
-            IContributionItem changePerspMenuItem = ContributionItemFactory.PERSPECTIVES_SHORTLIST
-                    .create(getWindow());
-            changePerspMenuMgr.add(changePerspMenuItem);
-            menu.add(changePerspMenuMgr);
-        }
-        {
-            MenuManager showViewMenuMgr = new MenuManager(IDEWorkbenchMessages.Workbench_showView, "showView"); //$NON-NLS-1$
-            IContributionItem showViewMenu = ContributionItemFactory.VIEWS_SHORTLIST
-                    .create(getWindow());
-            showViewMenuMgr.add(showViewMenu);
-            menu.add(showViewMenuMgr);
-        }
-        menu.add(new Separator());
-        menu.add(editActionSetAction);
-        menu.add(savePerspectiveAction);
-        menu.add(resetPerspectiveAction);
-        menu.add(closePerspAction);
-        menu.add(closeAllPerspsAction);
-    }
-
-    /**
-     * Adds the keyboard navigation submenu to the specified menu.
-     */
-    private void addWorkingSetBuildActions(MenuManager menu) {
-        buildWorkingSetMenu = new MenuManager(IDEWorkbenchMessages.Workbench_buildSet);
-        IContributionItem workingSetBuilds = new BuildSetMenu(window,
-                getActionBarConfigurer());
-        buildWorkingSetMenu.add(workingSetBuilds);
-        menu.add(buildWorkingSetMenu);
-    }
-
-    /**
-     * Adds the keyboard navigation submenu to the specified menu.
-     */
-    private void addKeyboardShortcuts(MenuManager menu) {
-        MenuManager subMenu = new MenuManager(IDEWorkbenchMessages.Workbench_shortcuts, "shortcuts"); //$NON-NLS-1$
-        menu.add(subMenu);
-        subMenu.add(showPartPaneMenuAction);
-        subMenu.add(showViewMenuAction);
-        subMenu.add(quickAccessAction);
-        subMenu.add(new Separator());
-        subMenu.add(maximizePartAction);
-        subMenu.add(minimizePartAction);
-        subMenu.add(new Separator());
-        subMenu.add(activateEditorAction);
-        subMenu.add(nextEditorAction);
-        subMenu.add(prevEditorAction);
-        subMenu.add(switchToEditorAction);
-        subMenu.add(new Separator());
-        subMenu.add(nextPartAction);
-        subMenu.add(prevPartAction);
-        subMenu.add(new Separator());
-        subMenu.add(nextPerspectiveAction);
-        subMenu.add(prevPerspectiveAction);
-    }
-
-    /**
-	 * Creates and returns the Help menu.
-	 */
-	private MenuManager createHelpMenu() {
-		MenuManager menu = new MenuManager(IDEWorkbenchMessages.Workbench_help, IWorkbenchActionConstants.M_HELP);
-		addSeparatorOrGroupMarker(menu, "group.intro"); //$NON-NLS-1$
-		// See if a welcome or intro page is specified
-		if (introAction != null) {
-			menu.add(introAction);
-		} else if (quickStartAction != null) {
-			menu.add(quickStartAction);
-		}
-		menu.add(new GroupMarker("group.intro.ext")); //$NON-NLS-1$
-		addSeparatorOrGroupMarker(menu, "group.main"); //$NON-NLS-1$
-		menu.add(helpContentsAction);
-        menu.add(helpSearchAction);
-		menu.add(dynamicHelpAction);
-		addSeparatorOrGroupMarker(menu, "group.assist"); //$NON-NLS-1$
-		// See if a tips and tricks page is specified
-		if (tipsAndTricksAction != null) {
-			menu.add(tipsAndTricksAction);
-		}
-		// HELP_START should really be the first item, but it was after
-		// quickStartAction and tipsAndTricksAction in 2.1.
-		menu.add(new GroupMarker(IWorkbenchActionConstants.HELP_START));
-		menu.add(new GroupMarker("group.main.ext")); //$NON-NLS-1$
-		addSeparatorOrGroupMarker(menu, "group.tutorials"); //$NON-NLS-1$
-		addSeparatorOrGroupMarker(menu, "group.tools"); //$NON-NLS-1$
-		addSeparatorOrGroupMarker(menu, "group.updates"); //$NON-NLS-1$
-		menu.add(new GroupMarker(IWorkbenchActionConstants.HELP_END));
-		addSeparatorOrGroupMarker(menu, IWorkbenchActionConstants.MB_ADDITIONS);
-		// about should always be at the bottom
-		menu.add(new Separator("group.about")); //$NON-NLS-1$
-		
-		ActionContributionItem aboutItem = new ActionContributionItem(aboutAction);
-		aboutItem.setVisible(!Util.isMac());
-        menu.add(aboutItem);
-		menu.add(new GroupMarker("group.about.ext")); //$NON-NLS-1$
-        return menu;
-    }
-
-    /**
-	 * Adds a <code>GroupMarker</code> or <code>Separator</code> to a menu.
-	 * The test for whether a separator should be added is done by checking for
-	 * the existence of a preference matching the string
-	 * useSeparator.MENUID.GROUPID that is set to <code>true</code>.
-	 * 
-	 * @param menu
-	 *            the menu to add to
-	 * @param groupId
-	 *            the group id for the added separator or group marker
-	 */
-	private void addSeparatorOrGroupMarker(MenuManager menu, String groupId) {
-		String prefId = "useSeparator." + menu.getId() + "." + groupId; //$NON-NLS-1$ //$NON-NLS-2$
-		boolean addExtraSeparators = IDEWorkbenchPlugin.getDefault()
-				.getPreferenceStore().getBoolean(prefId);
-		if (addExtraSeparators) {
-			menu.add(new Separator(groupId));
-		} else {
-			menu.add(new GroupMarker(groupId));
-		}
-	}
-    
-    /**
-     * Disposes any resources and unhooks any listeners that are no longer needed.
-     * Called when the window is closed.
-     */
-    public void dispose() {
-        if (isDisposed) {
-			return;
-		}
-    	isDisposed = true;
-    	IMenuService menuService = (IMenuService) window.getService(IMenuService.class);
-        menuService.releaseContributions(coolbarPopupMenuManager);
-        coolbarPopupMenuManager.dispose();
-        
-        getActionBarConfigurer().getStatusLineManager().remove(statusLineItem);
-        if (pageListener != null) {
-            window.removePageListener(pageListener);
-            pageListener = null;
-        }
-        if (prefListener != null) {
-            ResourcesPlugin.getPlugin().getPluginPreferences()
-                    .removePropertyChangeListener(prefListener);
-            prefListener = null;
-        }
-        if (propPrefListener != null) {
-            WorkbenchPlugin.getDefault().getPreferenceStore()
-                    .removePropertyChangeListener(propPrefListener);
-            propPrefListener = null;
-        }
-        if (resourceListener != null) {
-            ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceListener);
-            resourceListener = null;
-        }
-
-        pinEditorContributionItem.dispose();
-        showInQuickMenu.dispose();
-        newQuickMenu.dispose();
-//        searchComboItem.dispose();
-        
-        // null out actions to make leak debugging easier
-        closeAction = null;
-        closeAllAction = null;
-        closeAllSavedAction = null;
-        closeOthersAction = null;
-        saveAction = null;
-        saveAllAction = null;
-        newWindowAction = null;
-		newEditorAction = null;
-        helpContentsAction = null;
-        helpSearchAction = null;
-		dynamicHelpAction = null;
-        aboutAction = null;
-        openPreferencesAction = null;
-        saveAsAction = null;
-        hideShowEditorAction = null;
-        savePerspectiveAction = null;
-        resetPerspectiveAction = null;
-        editActionSetAction = null;
-        closePerspAction = null;
-        lockToolBarAction = null;
-        closeAllPerspsAction = null;
-        showViewMenuAction = null;
-        showPartPaneMenuAction = null;
-        nextPartAction = null;
-        prevPartAction = null;
-        nextEditorAction = null;
-        prevEditorAction = null;
-        nextPerspectiveAction = null;
-        prevPerspectiveAction = null;
-        activateEditorAction = null;
-        maximizePartAction = null;
-        minimizePartAction = null;
-        switchToEditorAction = null;
-        quickAccessAction.dispose();
-        quickAccessAction = null;
-        backwardHistoryAction = null;
-        forwardHistoryAction = null;
-        undoAction = null;
-        redoAction = null;
-        quitAction = null;
-        goIntoAction = null;
-        backAction = null;
-        forwardAction = null;
-        upAction = null;
-        nextAction = null;
-        previousAction = null;
-        openWorkspaceAction = null;
-        projectPropertyDialogAction = null;
-        newWizardAction = null;
-        newWizardDropDownAction = null;
-        importResourcesAction = null;
-        exportResourcesAction = null;
-        buildAllAction = null;
-        cleanAction = null;
-        toggleAutoBuildAction = null;
-        buildWorkingSetMenu = null;
-        quickStartAction = null;
-        tipsAndTricksAction = null;
-        showInQuickMenu = null;
-        newQuickMenu = null;
-        buildProjectAction = null;
-        newWizardMenu = null;
-        pinEditorContributionItem = null;
-//        searchComboItem = null;
-        statusLineItem = null;
-        prefListener = null;
-        propPrefListener = null;
-        introAction = null;
-        
-        super.dispose();
-    }
-
-    void updateModeLine(final String text) {
-        statusLineItem.setText(text);
-    }
-
-    /**
-     * Returns true if the menu with the given ID should
-     * be considered as an OLE container menu. Container menus
-     * are preserved in OLE menu merging.
-     */
-    public boolean isApplicationMenu(String menuId) {
-        if (menuId.equals(IWorkbenchActionConstants.M_FILE)) {
-			return true;
-		}
-        if (menuId.equals(IWorkbenchActionConstants.M_WINDOW)) {
-			return true;
-		}
-        return false;
-    }
-
-    /**
-     * Return whether or not given id matches the id of the coolitems that
-     * the workbench creates.
-     */
-    public boolean isWorkbenchCoolItemId(String id) {
-        if (IWorkbenchActionConstants.TOOLBAR_FILE.equalsIgnoreCase(id)) {
-			return true;
-		}
-        if (IWorkbenchActionConstants.TOOLBAR_NAVIGATE.equalsIgnoreCase(id)) {
-			return true;
-		}
-        return false;
-    }
-
-    /**
-     * Fills the status line with the workbench contribution items.
-     */
-    protected void fillStatusLine(IStatusLineManager statusLine) {
-        statusLine.add(statusLineItem);
-    }
-
-    /**
-     * Creates actions (and contribution items) for the menu bar, toolbar and status line.
-     */
-    protected void makeActions(final IWorkbenchWindow window) {
-        // @issue should obtain from ConfigurationItemFactory
-        statusLineItem = new StatusLineContributionItem("ModeContributionItem"); //$NON-NLS-1$
-
-        newWizardAction = ActionFactory.NEW.create(window);
-        register(newWizardAction);
-
-        newWizardDropDownAction = IDEActionFactory.NEW_WIZARD_DROP_DOWN
-                .create(window);
-        register(newWizardDropDownAction);
-
-        importResourcesAction = ActionFactory.IMPORT.create(window);
-        register(importResourcesAction);
-
-        exportResourcesAction = ActionFactory.EXPORT.create(window);
-        register(exportResourcesAction);
-        
-        buildAllAction = IDEActionFactory.BUILD.create(window);
-        register(buildAllAction);
-
-        cleanAction = IDEActionFactory.BUILD_CLEAN.create(window);
-        register(cleanAction);
-
-        toggleAutoBuildAction = IDEActionFactory.BUILD_AUTOMATICALLY
-                .create(window);
-        register(toggleAutoBuildAction);
-
-        saveAction = ActionFactory.SAVE.create(window);
-        register(saveAction);
-
-        saveAsAction = ActionFactory.SAVE_AS.create(window);
-        register(saveAsAction);
-
-        saveAllAction = ActionFactory.SAVE_ALL.create(window);
-        register(saveAllAction);
-		
-        newWindowAction = ActionFactory.OPEN_NEW_WINDOW.create(getWindow());
-        newWindowAction.setText(IDEWorkbenchMessages.Workbench_openNewWindow);
-        register(newWindowAction);
-
-		newEditorAction = ActionFactory.NEW_EDITOR.create(window);
-		register(newEditorAction);
-
-        undoAction = ActionFactory.UNDO.create(window);
-        register(undoAction);
-
-        redoAction = ActionFactory.REDO.create(window);
-        register(redoAction);
-
-
-
-
-
-
-        closeAction = ActionFactory.CLOSE.create(window);
-        register(closeAction);
-
-        closeAllAction = ActionFactory.CLOSE_ALL.create(window);
-        register(closeAllAction);
-
-        closeOthersAction = ActionFactory.CLOSE_OTHERS.create(window);
-        register(closeOthersAction);
-
-        closeAllSavedAction = ActionFactory.CLOSE_ALL_SAVED.create(window);
-        register(closeAllSavedAction);
-
-        helpContentsAction = ActionFactory.HELP_CONTENTS.create(window);
-        register(helpContentsAction);
-
-        helpSearchAction = ActionFactory.HELP_SEARCH.create(window);
-        register(helpSearchAction);
-		
-        dynamicHelpAction = ActionFactory.DYNAMIC_HELP.create(window);
-        register(dynamicHelpAction);
-        
-        aboutAction = ActionFactory.ABOUT.create(window);
-        aboutAction
-                .setImageDescriptor(IDEInternalWorkbenchImages
-                        .getImageDescriptor(IDEInternalWorkbenchImages.IMG_OBJS_DEFAULT_PROD));
-        register(aboutAction);
-
-        openPreferencesAction = ActionFactory.PREFERENCES.create(window);
-        register(openPreferencesAction);
-
-        
-
-
-
-        makeFeatureDependentActions(window);
-
-        // Actions for invisible accelerators
-        showViewMenuAction = ActionFactory.SHOW_VIEW_MENU.create(window);
-        register(showViewMenuAction);
-
-        showPartPaneMenuAction = ActionFactory.SHOW_PART_PANE_MENU
-                .create(window);
-        register(showPartPaneMenuAction);
-
-        nextEditorAction = ActionFactory.NEXT_EDITOR.create(window);
-        register(nextEditorAction);
-        prevEditorAction = ActionFactory.PREVIOUS_EDITOR.create(window);
-        register(prevEditorAction);
-        ActionFactory.linkCycleActionPair(nextEditorAction, prevEditorAction);
-
-        nextPartAction = ActionFactory.NEXT_PART.create(window);
-        register(nextPartAction);
-        prevPartAction = ActionFactory.PREVIOUS_PART.create(window);
-        register(prevPartAction);
-        ActionFactory.linkCycleActionPair(nextPartAction, prevPartAction);
-
-        nextPerspectiveAction = ActionFactory.NEXT_PERSPECTIVE
-                .create(window);
-        register(nextPerspectiveAction);
-        prevPerspectiveAction = ActionFactory.PREVIOUS_PERSPECTIVE
-                .create(window);
-        register(prevPerspectiveAction);
-        ActionFactory.linkCycleActionPair(nextPerspectiveAction,
-                prevPerspectiveAction);
-
-        activateEditorAction = ActionFactory.ACTIVATE_EDITOR
-                .create(window);
-        register(activateEditorAction);
-
-        maximizePartAction = ActionFactory.MAXIMIZE.create(window);
-        register(maximizePartAction);
-
-		minimizePartAction = ActionFactory.MINIMIZE.create(window);
-		register(minimizePartAction);
-        
-        switchToEditorAction = ActionFactory.SHOW_OPEN_EDITORS
-                .create(window);
-        register(switchToEditorAction);
-
-        workbookEditorsAction = ActionFactory.SHOW_WORKBOOK_EDITORS
-        		.create(window);
-        register(workbookEditorsAction);
-        
-        quickAccessAction = ActionFactory.SHOW_QUICK_ACCESS
-        	.create(window);
-
-        hideShowEditorAction = ActionFactory.SHOW_EDITOR.create(window);
-        register(hideShowEditorAction);
-        savePerspectiveAction = ActionFactory.SAVE_PERSPECTIVE
-                .create(window);
-        register(savePerspectiveAction);
-        editActionSetAction = ActionFactory.EDIT_ACTION_SETS
-                .create(window);
-        register(editActionSetAction);
-        lockToolBarAction = ActionFactory.LOCK_TOOL_BAR.create(window);
-        register(lockToolBarAction);
-        resetPerspectiveAction = ActionFactory.RESET_PERSPECTIVE
-                .create(window);
-        register(resetPerspectiveAction);
-        closePerspAction = ActionFactory.CLOSE_PERSPECTIVE.create(window);
-        register(closePerspAction);
-        closeAllPerspsAction = ActionFactory.CLOSE_ALL_PERSPECTIVES
-                .create(window);
-        register(closeAllPerspsAction);
-
-        forwardHistoryAction = ActionFactory.FORWARD_HISTORY
-                .create(window);
-        register(forwardHistoryAction);
-
-        backwardHistoryAction = ActionFactory.BACKWARD_HISTORY
-                .create(window);
-        register(backwardHistoryAction);
-
-
-
-
-        quitAction = ActionFactory.QUIT.create(window);
-        register(quitAction);
-
-
-
-        goIntoAction = ActionFactory.GO_INTO.create(window);
-        register(goIntoAction);
-
-        backAction = ActionFactory.BACK.create(window);
-        register(backAction);
-
-        forwardAction = ActionFactory.FORWARD.create(window);
-        register(forwardAction);
-
-        upAction = ActionFactory.UP.create(window);
-        register(upAction);
-
-        nextAction = ActionFactory.NEXT.create(window);
-        nextAction
-                .setImageDescriptor(IDEInternalWorkbenchImages
-                        .getImageDescriptor(IDEInternalWorkbenchImages.IMG_ETOOL_NEXT_NAV));
-        register(nextAction);
-
-        previousAction = ActionFactory.PREVIOUS.create(window);
-        previousAction
-                .setImageDescriptor(IDEInternalWorkbenchImages
-                        .getImageDescriptor(IDEInternalWorkbenchImages.IMG_ETOOL_PREVIOUS_NAV));
-        register(previousAction);
-
-        buildProjectAction = IDEActionFactory.BUILD_PROJECT.create(window);
-        register(buildProjectAction);
-
-        openWorkspaceAction = IDEActionFactory.OPEN_WORKSPACE
-                .create(window);
-        register(openWorkspaceAction);
-
-        projectPropertyDialogAction = IDEActionFactory.OPEN_PROJECT_PROPERTIES
-                .create(window);
-        register(projectPropertyDialogAction);
-
-        if (window.getWorkbench().getIntroManager().hasIntro()) {
-            introAction = ActionFactory.INTRO.create(window);
-            register(introAction);
-        }
-
-        String showInQuickMenuId = "org.eclipse.ui.navigate.showInQuickMenu"; //$NON-NLS-1$
-        showInQuickMenu = new QuickMenuAction(showInQuickMenuId) {
-            protected void fillMenu(IMenuManager menu) {
-                menu.add(ContributionItemFactory.VIEWS_SHOW_IN
-                        .create(window));
-            }
-        };
-        register(showInQuickMenu);
-
-        final String newQuickMenuId = "org.eclipse.ui.file.newQuickMenu"; //$NON-NLS-1$
-        newQuickMenu = new QuickMenuAction(newQuickMenuId) {
-            protected void fillMenu(IMenuManager menu) {
-                menu.add(new NewWizardMenu(window));
-            }
-        };
-        register(newQuickMenu);
-
-        pinEditorContributionItem = ContributionItemFactory.PIN_EDITOR
-                .create(window);
-        
-//        searchComboItem = ContributionItemFactory.HELP_SEARCH.create(window);
-    }
-
-    /**
-     * Creates the feature-dependent actions for the menu bar.
-     */
-    private void makeFeatureDependentActions(IWorkbenchWindow window) {
-        AboutInfo[] infos = null;
-        
-        IPreferenceStore prefs = IDEWorkbenchPlugin.getDefault().getPreferenceStore();
-
-        // Optimization: avoid obtaining the about infos if the platform state is
-        // unchanged from last time.  See bug 75130 for details.
-        String stateKey = "platformState"; //$NON-NLS-1$
-        String prevState = prefs.getString(stateKey);
-        String currentState = String.valueOf(Platform.getStateStamp());
-        boolean sameState = currentState.equals(prevState);
-        if (!sameState) {
-        	prefs.putValue(stateKey, currentState);
-        }
-        
-        // See if a welcome page is specified.
-        // Optimization: if welcome pages were found on a previous run, then just add the action.
-        String quickStartKey = IDEActionFactory.QUICK_START.getId(); 
-        String showQuickStart = prefs.getString(quickStartKey);
-        if (sameState && "true".equals(showQuickStart)) { //$NON-NLS-1$
-            quickStartAction = IDEActionFactory.QUICK_START.create(window);
-			register(quickStartAction);
-        }
-        else if (sameState && "false".equals(showQuickStart)) { //$NON-NLS-1$
-        	// do nothing
-        }
-        else {
-        	// do the work
-    		infos = IDEWorkbenchPlugin.getDefault().getFeatureInfos();
-        	boolean found = hasWelcomePage(infos);
-            prefs.setValue(quickStartKey, found);
-            if (found) {
-                quickStartAction = IDEActionFactory.QUICK_START.create(window);
-                register(quickStartAction);
-	        }
-        }
-        
-        // See if a tips and tricks page is specified.
-        // Optimization: if tips and tricks were found on a previous run, then just add the action.
-        String tipsAndTricksKey = IDEActionFactory.TIPS_AND_TRICKS.getId();
-        String showTipsAndTricks = prefs.getString(tipsAndTricksKey);
-        if (sameState && "true".equals(showTipsAndTricks)) { //$NON-NLS-1$
-            tipsAndTricksAction = IDEActionFactory.TIPS_AND_TRICKS
-					.create(window);
-			register(tipsAndTricksAction);
-        }
-        else if (sameState && "false".equals(showTipsAndTricks)) { //$NON-NLS-1$
-        	// do nothing
-        }
-        else {
-        	// do the work
-	    	if (infos == null) {
-	    		infos = IDEWorkbenchPlugin.getDefault().getFeatureInfos();
-	    	}
-	    	boolean found = hasTipsAndTricks(infos);
-	    	prefs.setValue(tipsAndTricksKey, found);
-	    	if (found) {
-	            tipsAndTricksAction = IDEActionFactory.TIPS_AND_TRICKS
-						.create(window);
-				register(tipsAndTricksAction);
-		    }
-        }
-    }
-
-    /**
-     * Returns whether any of the given infos have a welcome page.
-     * 
-     * @param infos the infos
-     * @return <code>true</code> if a welcome page was found, <code>false</code> if not
-     */
-    private boolean hasWelcomePage(AboutInfo[] infos) {
-        for (int i = 0; i < infos.length; i++) {
-            if (infos[i].getWelcomePageURL() != null) {
-            	return true;
-            }
-        }
-        return false;
-	}
-
-    /**
-     * Returns whether any of the given infos have tips and tricks.
-     * 
-     * @param infos the infos
-     * @return <code>true</code> if tips and tricks were found, <code>false</code> if not
-     */
-    private boolean hasTipsAndTricks(AboutInfo[] infos) {
-        for (int i = 0; i < infos.length; i++) {
-            if (infos[i].getTipsAndTricksHref() != null) {
-            	return true;
-            }
-        }
-        return false;
-	}
-
-	/**
-	 * Update the build actions on the toolbar and menu bar based on the current
-	 * state of autobuild. This method can be called from any thread.
-	 * 
-	 * @param immediately
-	 *            <code>true</code> to update the actions immediately,
-	 *            <code>false</code> to queue the update to be run in the
-	 *            event loop
-	 */
-    void updateBuildActions(boolean immediately) {
-        // this can be triggered by property or resource change notifications
-        Runnable update = new Runnable() {
-            public void run() {
-                if (isDisposed) {
-					return;
-				}
-		    	IWorkspace workspace = ResourcesPlugin.getWorkspace();
-				IProject[] projects = workspace.getRoot().getProjects();
-		    	boolean enabled = BuildUtilities.isEnabled(projects, IncrementalProjectBuilder.INCREMENTAL_BUILD);
-		        //update menu bar actions in project menu
-		        buildAllAction.setEnabled(enabled);
-		        buildProjectAction.setEnabled(enabled);
-		        toggleAutoBuildAction.setChecked(workspace.isAutoBuilding());
-		        cleanAction.setEnabled(BuildUtilities.isEnabled(projects, IncrementalProjectBuilder.CLEAN_BUILD));
-		
-		        //update the cool bar build button
-		        ICoolBarManager coolBarManager = getActionBarConfigurer()
-		                .getCoolBarManager();
-		        IContributionItem cbItem = coolBarManager
-		                .find(IWorkbenchActionConstants.TOOLBAR_FILE);
-		        if (!(cbItem instanceof IToolBarContributionItem)) {
-		            // This should not happen
-		            IDEWorkbenchPlugin.log("File toolbar contribution item is missing"); //$NON-NLS-1$
-		            return;
-		        }
-		        IToolBarContributionItem toolBarItem = (IToolBarContributionItem) cbItem;
-		        IToolBarManager toolBarManager = toolBarItem.getToolBarManager();
-		        if (toolBarManager == null) {
-		            // error if this happens, file toolbar assumed to always exist
-		            IDEWorkbenchPlugin.log("File toolbar is missing"); //$NON-NLS-1$
-		            return;
-		        }
-		        //add the build button if build actions are enabled, and remove it otherwise
-		        boolean found = toolBarManager.find(buildAllAction.getId()) != null;
-		        if (enabled && !found) {
-		            toolBarManager.appendToGroup(IWorkbenchActionConstants.BUILD_GROUP,
-		                    buildAllAction);
-		            toolBarManager.update(false);
-		            toolBarItem.update(ICoolBarManager.SIZE);
-		        } else if (buildAllAction != null && found && !enabled) {
-		            toolBarManager.remove(buildAllAction.getId());
-		            toolBarManager.update(false);
-		            toolBarItem.update(ICoolBarManager.SIZE);
-		        }
-            }
-        };
-        if (immediately) {
-        	update.run();
-        }
-        else {
-	        // Dispatch the update to be run later in the UI thread.
-	        // This helps to reduce flicker if autobuild is being temporarily disabled programmatically.
-	        Shell shell = window.getShell();
-	        if (shell != null && !shell.isDisposed()) {
-        		shell.getDisplay().asyncExec(update);
-	        }
-        }
-    }
-
-	/**
-     * Update the pin action's tool bar
-     */
-    void updatePinActionToolbar() {
-
-        ICoolBarManager coolBarManager = getActionBarConfigurer()
-                .getCoolBarManager();
-        IContributionItem cbItem = coolBarManager
-                .find(IWorkbenchActionConstants.TOOLBAR_NAVIGATE);
-        if (!(cbItem instanceof IToolBarContributionItem)) {
-            // This should not happen
-            IDEWorkbenchPlugin
-                    .log("Navigation toolbar contribution item is missing"); //$NON-NLS-1$
-            return;
-        }
-        IToolBarContributionItem toolBarItem = (IToolBarContributionItem) cbItem;
-        IToolBarManager toolBarManager = toolBarItem.getToolBarManager();
-        if (toolBarManager == null) {
-            // error if this happens, navigation toolbar assumed to always exist
-            IDEWorkbenchPlugin.log("Navigate toolbar is missing"); //$NON-NLS-1$
-            return;
-        }
-
-        toolBarManager.update(false);
-        toolBarItem.update(ICoolBarManager.SIZE);
-    }
-    
-    private IContributionItem getCutItem() {
-		return getItem(
-				ActionFactory.CUT.getId(),
-				"org.eclipse.ui.edit.cut", //$NON-NLS-1$
-				ISharedImages.IMG_TOOL_CUT,
-				ISharedImages.IMG_TOOL_CUT_DISABLED,
-				WorkbenchMessages.Workbench_cut,
-				WorkbenchMessages.Workbench_cutToolTip, null);
-	}
-    
-    private IContributionItem getCopyItem() {
-		return getItem(
-				ActionFactory.COPY.getId(),
-				"org.eclipse.ui.edit.copy", //$NON-NLS-1$
-				ISharedImages.IMG_TOOL_COPY,
-				ISharedImages.IMG_TOOL_COPY_DISABLED,
-				WorkbenchMessages.Workbench_copy,
-				WorkbenchMessages.Workbench_copyToolTip, null);
-	}
-    
-    private IContributionItem getPasteItem() {
-		return getItem(
-				ActionFactory.PASTE.getId(),
-				"org.eclipse.ui.edit.paste", ISharedImages.IMG_TOOL_PASTE, //$NON-NLS-1$
-				ISharedImages.IMG_TOOL_PASTE_DISABLED,
-				WorkbenchMessages.Workbench_paste,
-				WorkbenchMessages.Workbench_pasteToolTip, null);
-	}
-    
-    private IContributionItem getPrintItem() {
-		return getItem(
-				ActionFactory.PRINT.getId(),
-				"org.eclipse.ui.file.print", ISharedImages.IMG_ETOOL_PRINT_EDIT, //$NON-NLS-1$
-				ISharedImages.IMG_ETOOL_PRINT_EDIT_DISABLED,
-				WorkbenchMessages.Workbench_print,
-				WorkbenchMessages.Workbench_printToolTip, null);
-	}
-    
-    private IContributionItem getSelectAllItem() {
-		return getItem(
-				ActionFactory.SELECT_ALL.getId(),
-				"org.eclipse.ui.edit.selectAll", //$NON-NLS-1$
-				null, null, WorkbenchMessages.Workbench_selectAll,
-				WorkbenchMessages.Workbench_selectAllToolTip, null);
-	}
-    
-    private IContributionItem getFindItem() {
-		return getItem(
-				ActionFactory.FIND.getId(),
-				"org.eclipse.ui.edit.findReplace", //$NON-NLS-1$
-				null, null, WorkbenchMessages.Workbench_findReplace,
-				WorkbenchMessages.Workbench_findReplaceToolTip, null);
-	}
-    
-    private IContributionItem getBookmarkItem() {
-		return getItem(
-				IDEActionFactory.BOOKMARK.getId(),
-				"org.eclipse.ui.edit.addBookmark", //$NON-NLS-1$
-				null, null, IDEWorkbenchMessages.Workbench_addBookmark,
-				IDEWorkbenchMessages.Workbench_addBookmarkToolTip, null);
-	}
-    
-    private IContributionItem getTaskItem() {
-		return getItem(
-				IDEActionFactory.ADD_TASK.getId(),
-				"org.eclipse.ui.edit.addTask", //$NON-NLS-1$
-				null, null, IDEWorkbenchMessages.Workbench_addTask,
-				IDEWorkbenchMessages.Workbench_addTaskToolTip, null);
-	}
-    
-    private IContributionItem getDeleteItem() {
-        return getItem(ActionFactory.DELETE.getId(),
-        		"org.eclipse.ui.edit.delete", //$NON-NLS-1$
-        		ISharedImages.IMG_TOOL_DELETE,
-        		ISharedImages.IMG_TOOL_DELETE_DISABLED,
-        		WorkbenchMessages.Workbench_delete,
-        		WorkbenchMessages.Workbench_deleteToolTip, 
-        		IWorkbenchHelpContextIds.DELETE_RETARGET_ACTION);
-    }
-    
-    private IContributionItem getRevertItem() {
-		return getItem(
-				ActionFactory.REVERT.getId(),
-				"org.eclipse.ui.file.revert", //$NON-NLS-1$
-				null, null, WorkbenchMessages.Workbench_revert,
-				WorkbenchMessages.Workbench_revertToolTip, null);
-	}
-    
-    private IContributionItem getRefreshItem() {
-		return getItem(ActionFactory.REFRESH.getId(),
-				"org.eclipse.ui.file.refresh", null, null, //$NON-NLS-1$
-				WorkbenchMessages.Workbench_refresh,
-				WorkbenchMessages.Workbench_refreshToolTip, null);
-	}
-    
-    private IContributionItem getPropertiesItem() {
-		return getItem(ActionFactory.PROPERTIES.getId(),
-				"org.eclipse.ui.file.properties", null, null, //$NON-NLS-1$
-				WorkbenchMessages.Workbench_properties,
-				WorkbenchMessages.Workbench_propertiesToolTip, null);
-	}
-    
-    private IContributionItem getMoveItem() {
-		return getItem(ActionFactory.MOVE.getId(), "org.eclipse.ui.edit.move", //$NON-NLS-1$
-				null, null, WorkbenchMessages.Workbench_move,
-				WorkbenchMessages.Workbench_moveToolTip, null);
-	}
-    
-    private IContributionItem getRenameItem() {
-		return getItem(ActionFactory.RENAME.getId(),
-				"org.eclipse.ui.edit.rename", null, null, //$NON-NLS-1$
-				WorkbenchMessages.Workbench_rename,
-				WorkbenchMessages.Workbench_renameToolTip, null);
-	}
-    
-    private IContributionItem getOpenProjectItem() {
-		return getItem(IDEActionFactory.OPEN_PROJECT.getId(),
-				"org.eclipse.ui.project.openProject", null, null, //$NON-NLS-1$
-				IDEWorkbenchMessages.OpenResourceAction_text,
-				IDEWorkbenchMessages.OpenResourceAction_toolTip, null);
-	}
-    
-    private IContributionItem getCloseProjectItem() {
-		return getItem(
-				IDEActionFactory.CLOSE_PROJECT.getId(),
-				"org.eclipse.ui.project.closeProject", //$NON-NLS-1$
-				null, null, IDEWorkbenchMessages.CloseResourceAction_text,
-				IDEWorkbenchMessages.CloseResourceAction_text, null);
-	}
-    
-    private IContributionItem getItem(String actionId, String commandId,
-    		String image, String disabledImage, String label, String tooltip, String helpContextId) {
-		ISharedImages sharedImages = getWindow().getWorkbench()
-				.getSharedImages();
-
-		IActionCommandMappingService acms = (IActionCommandMappingService) getWindow()
-				.getService(IActionCommandMappingService.class);
-		acms.map(actionId, commandId);
-
-		CommandContributionItemParameter commandParm = new CommandContributionItemParameter(
-				getWindow(), actionId, commandId, null, sharedImages
-						.getImageDescriptor(image), sharedImages
-						.getImageDescriptor(disabledImage), null, label, null,
-				tooltip, CommandContributionItem.STYLE_PUSH, null, false);
-		return new CommandContributionItem(commandParm);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/BuildCleanAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/BuildCleanAction.java
deleted file mode 100644
index caf14fc..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/BuildCleanAction.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.actions;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.dialogs.CleanDialog;
-
-/**
- * The clean action replaces the rebuild actions. Clean will discard all built
- * state for all projects in the workspace, and deletes all problem markers.
- * The next time a build is run, projects will have to be built from scratch.
- * Technically this is only necessary if an incremental builder misbehaves.
- * 
- * @since 3.0
- */
-public class BuildCleanAction extends Action implements ActionFactory.IWorkbenchAction {
-	private IWorkbenchWindow window;
-
-	/**
-	 * Creates a new BuildCleanAction
-	 * 
-	 * @param window The window for parenting this action
-	 */
-	public BuildCleanAction(IWorkbenchWindow window) {
-		super(IDEWorkbenchMessages.Workbench_buildClean);
-		setActionDefinitionId("org.eclipse.ui.project.cleanAction"); //$NON-NLS-1$
-		this.window = window;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.ActionFactory.IWorkbenchAction#dispose()
-	 */
-	public void dispose() {
-		//nothing to dispose
-	}
-
-	public void run() {
-		IProject[] selected = BuildUtilities.findSelectedProjects(window);
-		new CleanDialog(window, selected).open();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/BuildSetAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/BuildSetAction.java
deleted file mode 100644
index 1f3bcda..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/BuildSetAction.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.actions;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.actions.BuildAction;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-
-/**
- * This class will perform an incremental build on a working set.
- * 
- * @since 3.0
- */
-public class BuildSetAction extends Action {
-	public static BuildSetAction lastBuilt;
-
-	private IWorkingSet workingSet;
-
-	private IWorkbenchWindow window;
-
-	private IActionBarConfigurer actionBars;
-
-	/**
-	 * Creates a new action that builds the provided working set when run
-	 */
-	public BuildSetAction(IWorkingSet set, IWorkbenchWindow window, IActionBarConfigurer actionBars) {
-		super(set == null ? "" : set.getLabel(), AS_RADIO_BUTTON); //$NON-NLS-1$
-		this.window = window;
-		this.actionBars = actionBars;
-		this.workingSet = set;
-	}
-
-	/**
-	 * Returns the working set that this instance is building
-	 */
-	public IWorkingSet getWorkingSet() {
-		return workingSet;
-	}
-
-	public void run() {
-		//register this action instance as the global handler for the build last action
-		setActionDefinitionId("org.eclipse.ui.project.buildLast"); //$NON-NLS-1$
-		actionBars.registerGlobalAction(this);
-
-		window.getWorkbench().getWorkingSetManager().addRecentWorkingSet(workingSet);
-		IProject[] projects = BuildUtilities.extractProjects(workingSet.getElements());
-		if (projects.length == 0) {
-			MessageDialog.openInformation(window.getShell(), 
-					IDEWorkbenchMessages.BuildSetAction_noBuildTitle, 
-					IDEWorkbenchMessages.BuildSetAction_noProjects);
-			return;
-		}
-		lastBuilt = this;
-		BuildAction build = new BuildAction(window, IncrementalProjectBuilder.INCREMENTAL_BUILD);
-		build.selectionChanged(new StructuredSelection(projects));
-		build.run();
-	}
-
-	public void runWithEvent(Event event) {
-		//radio buttons receive an event when they become unselected,
-		//so we must not run the action in this case
-		if (event.widget instanceof MenuItem) {
-			if (!((MenuItem) event.widget).getSelection()) {
-				return;
-			}
-		}
-		run();
-	}
-
-	/* (non-Javadoc)
-	 * For debugging purposes only.
-	 */
-	public String toString() {
-		return "BuildSetAction(" + workingSet.getName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/BuildSetMenu.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/BuildSetMenu.java
deleted file mode 100644
index 9f31abe..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/BuildSetMenu.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- * hzhou@actuate.com - Fix for  Bug 71695 - 
- * [WorkingSets]Removed Working Set is still shown under the menu item 
- * when it is the recently used working set
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.actions;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IAction;
-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.widgets.Menu;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.application.IActionBarConfigurer;
-
-/**
- * Sub-menu off project menu for showing MRU list of working set builds.
- * 
- * @since 3.0
- */
-public class BuildSetMenu extends ContributionItem {
-    private IActionBarConfigurer actionBars;
-
-    boolean dirty = true;
-
-    private IMenuListener menuListener = new IMenuListener() {
-        public void menuAboutToShow(IMenuManager manager) {
-            manager.markDirty();
-            dirty = true;
-        }
-    };
-
-    private IAction selectBuildWorkingSetAction;
-
-    private IWorkbenchWindow window;
-
-    /**
-     * Create a new instance of the receiver.
-     * @param window
-     * @param actionBars
-     */
-    public BuildSetMenu(IWorkbenchWindow window, IActionBarConfigurer actionBars) {
-        this.window = window;
-        this.actionBars = actionBars;
-        selectBuildWorkingSetAction = new SelectBuildWorkingSetAction(window,
-                actionBars);
-    }
-
-    /**
-     * Adds a mnemonic accelerator to actions in the MRU list of
-     * recently built working sets.
-     * @param action the action to add
-     * @param index the index to add it at
-     */
-    private void addMnemonic(BuildSetAction action, int index) {
-        StringBuffer label = new StringBuffer();
-        //add the numerical accelerator
-        if (index < 9) {
-            label.append('&');
-            label.append(index);
-            label.append(' ');
-        }
-        label.append(action.getWorkingSet().getLabel());
-        action.setText(label.toString());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IContributionItem#fill(org.eclipse.swt.widgets.Menu, int)
-     */
-    public void fill(Menu menu, int index) {
-        if (getParent() instanceof MenuManager) {
-			((MenuManager) getParent()).addMenuListener(menuListener);
-		}
-        if (!dirty) {
-			return;
-		}
-        fillMenu(menu);
-        dirty = false;
-    }
-
-    /**
-     * Fills the menu with Show View actions.
-     * @param menu The menu being filled.
-     */
-    private void fillMenu(Menu menu) {
-        boolean isAutoBuilding = ResourcesPlugin.getWorkspace()
-                .isAutoBuilding();
-
-        //build MRU list of recently built working sets:
-        IWorkingSet[] sets = window.getWorkbench().getWorkingSetManager()
-                .getRecentWorkingSets();
-        BuildSetAction last = BuildSetAction.lastBuilt;
-        IWorkingSet lastSet = null;
-        //add build action for the last working set that was built
-        int accel = 1;
-        if (last != null) {
-			// add it only if it has not been removed
-			boolean found = false;
-			for (int i = 0; i < sets.length; i++) {
-				if (sets[i].equals(last.getWorkingSet())){
-					found = true;
-					break;
-				}
-			}
-			if (found) {
-	            last.setChecked(true);
-	            last.setEnabled(!isAutoBuilding);
-	            last.setActionDefinitionId("org.eclipse.ui.project.buildLast"); //$NON-NLS-1$
-	            addMnemonic(last, accel++);
-	            new ActionContributionItem(last).fill(menu, -1);
-	            lastSet = last.getWorkingSet();
-			} else {
-				BuildSetAction.lastBuilt = null;
-			}
-        }
-        //add build actions for the most recently used working sets
-        for (int i = 0; i < sets.length; i++) {
-            if (lastSet != null && lastSet.equals(sets[i])) {
-				continue;
-			}
-            BuildSetAction action = new BuildSetAction(sets[i], window,
-                    actionBars);
-            addMnemonic(action, accel++);
-            action.setEnabled(!isAutoBuilding);
-            new ActionContributionItem(action).fill(menu, -1);
-        }
-        //add the action to select a different working set
-        if (sets.length > 0) {
-			new Separator().fill(menu, -1);
-		}
-        selectBuildWorkingSetAction.setEnabled(!isAutoBuilding);
-        new ActionContributionItem(selectBuildWorkingSetAction).fill(menu, -1);
-    }
-
-    public boolean isDirty() {
-        return dirty;
-    }
-
-    /**
-     * Overridden to always return true and force dynamic menu building.
-     */
-    public boolean isDynamic() {
-        return true;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/BuildUtilities.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/BuildUtilities.java
deleted file mode 100644
index d948eb9..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/BuildUtilities.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.actions;
-
-import java.util.Collection;
-import java.util.HashSet;
-
-import org.eclipse.core.resources.ICommand;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.BuildAction;
-import org.eclipse.ui.ide.ResourceUtil;
-
-/**
- * This class contains convenience methods used by the various build commands
- * to determine enablement.  These utilities cannot be factored into a common
- * class because some build actions are API and some are not.
- * 
- * @since 3.1
- */
-public class BuildUtilities {
-	/**
-	 * Extracts the selected projects from a selection.
-	 * 
-	 * @param selection The selection to analyze
-	 * @return The selected projects
-	 */
-	public static IProject[] extractProjects(Object[] selection) {
-		HashSet projects = new HashSet();
-		for (int i = 0; i < selection.length; i++) {
-			IResource resource = ResourceUtil.getResource(selection[i]);
-			if (resource != null) {
-				projects.add(resource.getProject());
-			} else {
-				ResourceMapping mapping = ResourceUtil.getResourceMapping(selection[i]);
-				if (mapping != null) {
-					IProject[] theProjects = mapping.getProjects();					
-					for(int j=0; j < theProjects.length; j++) {
-						   projects.add(theProjects[j]);						
-					}
-				}
-			}
-		}
-		return (IProject[]) projects.toArray(new IProject[projects.size()]);
-	}
-
-	/**
-	 * Finds and returns the selected projects in the given window
-	 * 
-	 * @param window The window to find the selection in
-	 * @return The selected projects, or an empty array if no selection could be found.
-	 */
-	public static IProject[] findSelectedProjects(IWorkbenchWindow window) {
-		if (window == null) {
-			return new IProject[0];
-		}
-		ISelection selection = window.getSelectionService().getSelection();
-		IProject[] selected = null;
-		if (selection != null && !selection.isEmpty() && selection instanceof IStructuredSelection) {
-			selected = extractProjects(((IStructuredSelection) selection).toArray());
-		} else {
-			//see if we can extract a selected project from the active editor
-			IWorkbenchPart part = window.getPartService().getActivePart();
-			if (part instanceof IEditorPart) {
-				IEditorPart editor = (IEditorPart) part;
-				IFile file = ResourceUtil.getFile(editor.getEditorInput());
-				if (file != null) {
-					selected = new IProject[] {file.getProject()};
-				}
-			}
-		}
-		if (selected == null) {
-			selected = new IProject[0];
-		}
-		return selected;
-	}
-
-	/**
-	 * Returns whether a build command with the given trigger should
-	 * be enabled for the given selection.
-	 * @param projects The projects to use to determine enablement
-	 * @param trigger The build trigger (<code>IncrementalProjectBuilder.*_BUILD</code> constants).
-	 * @return <code>true</code> if the action should be enabled, and
-	 * <code>false</code> otherwise.
-	 */
-	public static boolean isEnabled(IProject[] projects, int trigger) {
-		//incremental build is only enabled if all projects are not autobuilding
-		if (trigger == IncrementalProjectBuilder.INCREMENTAL_BUILD && ResourcesPlugin.getWorkspace().isAutoBuilding()) {
-			if (!matchingTrigger(projects, IncrementalProjectBuilder.AUTO_BUILD, false)) {
-				return false;
-			}
-		}
-		//finally we are building only if there is a builder that accepts the trigger
-		return matchingTrigger(projects, trigger, true);
-	}
-
-	/**
-	 * Returns whether one of the projects has a builder whose trigger setting
-	 * for the given trigger matches the given value.
-	 * 
-	 * @param projects The projects to check
-	 * @param trigger The trigger to look for
-	 * @param value The trigger value to look for
-	 * @return <code>true</code> if one of the projects has a builder whose
-	 * trigger activation matches the provided value, and <code>false</code> otherwise.
-	 */
-	private static boolean matchingTrigger(IProject[] projects, int trigger, boolean value) {
-		for (int i = 0; i < projects.length; i++) {
-			if (!projects[i].isAccessible()) {
-				continue;
-			}
-			try {
-				IProjectDescription description = projects[i].getDescription();
-				ICommand[] buildSpec = description.getBuildSpec();
-				for (int j = 0; j < buildSpec.length; j++) {
-					if (buildSpec[j].isBuilding(trigger) == value) {
-						return true;
-					}
-				}
-			} catch (CoreException e) {
-				//ignore projects that are not available
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Causes all editors to save any modified resources in the provided collection
-	 * of projects depending on the user's preference.
-	 * @param projects The projects in which to save editors, or <code>null</code>
-	 * to save editors in all projects.
-	 */
-	public static void saveEditors(Collection projects) {
-		if (!BuildAction.isSaveAllSet()) {
-			return;
-		}
-		IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
-		for (int i = 0; i < windows.length; i++) {
-			IWorkbenchPage[] pages = windows[i].getPages();
-			for (int j = 0; j < pages.length; j++) {
-				IWorkbenchPage page = pages[j];
-				if (projects == null) {
-					page.saveAllEditors(false);
-				} else {
-					IEditorPart[] editors = page.getDirtyEditors();
-					for (int k = 0; k < editors.length; k++) {
-						IEditorPart editor = editors[k];
-						IFile inputFile = ResourceUtil.getFile(editor.getEditorInput());
-						if (inputFile != null) {
-							if (projects.contains(inputFile.getProject())) {
-								page.saveEditor(editor, false);
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Doesn't need to be instantiated
-	 */
-	private BuildUtilities() {
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/LTKLauncher.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/LTKLauncher.java
deleted file mode 100644
index 88d579d..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/LTKLauncher.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.actions;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.NotEnabledException;
-import org.eclipse.core.commands.NotHandledException;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.ISources;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.handlers.IHandlerService;
-
-/**
- * Launch the LTK aware resource operations ... but sneaky!
- * 
- * @since 3.4
- */
-public class LTKLauncher {
-	private static final String LTK_DELETE_ID = "org.eclipse.ltk.ui.refactoring.commands.deleteResources"; //$NON-NLS-1$
-	private static final String LTK_MOVE_ID = "org.eclipse.ltk.ui.refactoring.commands.moveResources"; //$NON-NLS-1$
-	private static final String LTK_RENAME_ID = "org.eclipse.ltk.ui.refactoring.commands.renameResource"; //$NON-NLS-1$
-
-	/**
-	 * Open the LTK delete resources wizard if available.
-	 * 
-	 * @param structuredSelection
-	 *            The action current selection.
-	 * 
-	 * @return <code>true</code> if we can launch the wizard
-	 */
-	public static boolean openDeleteWizard(
-			IStructuredSelection structuredSelection) {
-		return runCommand(LTK_DELETE_ID, structuredSelection);
-	}
-
-	/**
-	 * Open the LTK move resources wizard if available.
-	 * 
-	 * @param structuredSelection
-	 *            The action current selection.
-	 * 
-	 * @return <code>true</code> if we can launch the wizard
-	 */
-	public static boolean openMoveWizard(
-			IStructuredSelection structuredSelection) {
-		return runCommand(LTK_MOVE_ID, structuredSelection);
-	}
-
-	/**
-	 * Open the LTK rename resource wizard if available.
-	 * 
-	 * @param structuredSelection
-	 *            The action current selection.
-	 * 
-	 * @return <code>true</code> if we can launch the wizard
-	 */
-	public static boolean openRenameWizard(
-			IStructuredSelection structuredSelection) {
-		return runCommand(LTK_RENAME_ID, structuredSelection);
-	}
-
-	private static boolean runCommand(String commandId,
-			IStructuredSelection selection) {
-		ICommandService commandService = (ICommandService) PlatformUI
-				.getWorkbench().getService(ICommandService.class);
-		Command cmd = commandService.getCommand(commandId);
-		if (!cmd.isDefined()) {
-			return false;
-		}
-
-		IHandlerService handlerService = (IHandlerService) PlatformUI
-				.getWorkbench().getService(IHandlerService.class);
-		EvaluationContext c = null;
-		if (selection != null) {
-			c = new EvaluationContext(handlerService
-					.createContextSnapshot(false), selection.toList());
-			c.addVariable(ISources.ACTIVE_CURRENT_SELECTION_NAME, selection);
-		}
-		try {
-			if (c != null) {
-				handlerService.executeCommandInContext(
-						new ParameterizedCommand(cmd, null), null, c);
-			} else {
-				handlerService.executeCommand(commandId, null);
-			}
-			return true;
-		} catch (ExecutionException e) {
-		} catch (NotDefinedException e) {
-		} catch (NotEnabledException e) {
-		} catch (NotHandledException e) {
-		}
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/OpenLocalFileAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/OpenLocalFileAction.java
deleted file mode 100644
index 6021e7f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/OpenLocalFileAction.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.actions;
-
-import org.eclipse.osgi.util.NLS;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.FileDialog;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.IFileStore;
-
-import org.eclipse.core.runtime.Path;
-
-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.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-
-/**
- * Standard action for opening an editor on local file(s). 
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- */
-public class OpenLocalFileAction extends Action implements IWorkbenchWindowActionDelegate {
-
-	private IWorkbenchWindow window;
-	private String filterPath;
-
-	/**
-	 * Creates a new action for opening a local file.
-	 */
-	public OpenLocalFileAction() {
-		setEnabled(true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-		window =  null;
-		filterPath =  null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		this.window =  window;
-		filterPath =  System.getProperty("user.home"); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		run();
-	}
-
-	/* (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) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		FileDialog dialog =  new FileDialog(window.getShell(), SWT.OPEN | SWT.MULTI);
-		dialog.setText(IDEWorkbenchMessages.OpenLocalFileAction_title);
-		dialog.setFilterPath(filterPath);
-		dialog.open();
-		String[] names =  dialog.getFileNames();
-
-		if (names != null) {
-			filterPath =  dialog.getFilterPath();
-
-			int numberOfFilesNotFound =  0;
-			StringBuffer notFound =  new StringBuffer();
-			for (int i =  0; i < names.length; i++) {
-				IFileStore fileStore =  EFS.getLocalFileSystem().getStore(new Path(filterPath));
-				fileStore =  fileStore.getChild(names[i]);
-				IFileInfo fetchInfo = fileStore.fetchInfo();
-				if (!fetchInfo.isDirectory() && fetchInfo.exists()) {
-					IWorkbenchPage page =  window.getActivePage();
-					try {
-						IDE.openEditorOnFileStore(page, fileStore);
-					} catch (PartInitException e) {
-						String msg =  NLS.bind(IDEWorkbenchMessages.OpenLocalFileAction_message_errorOnOpen, fileStore.getName());
-						IDEWorkbenchPlugin.log(msg,e.getStatus());
-						MessageDialog.openError(window.getShell(), IDEWorkbenchMessages.OpenLocalFileAction_title, msg);
-					}
-				} else {
-					if (++numberOfFilesNotFound > 1)
-						notFound.append('\n');
-					notFound.append(fileStore.getName());
-				}
-			}
-
-			if (numberOfFilesNotFound > 0) {
-				String msgFmt =  numberOfFilesNotFound == 1 ? IDEWorkbenchMessages.OpenLocalFileAction_message_fileNotFound : IDEWorkbenchMessages.OpenLocalFileAction_message_filesNotFound;
-				String msg =  NLS.bind(msgFmt, notFound.toString());
-				MessageDialog.openError(window.getShell(), IDEWorkbenchMessages.OpenLocalFileAction_title, msg);
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/OpenWorkspaceAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/OpenWorkspaceAction.java
deleted file mode 100644
index 413ed0f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/OpenWorkspaceAction.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.actions;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.internal.ide.ChooseWorkspaceData;
-import org.eclipse.ui.internal.ide.ChooseWorkspaceDialog;
-import org.eclipse.ui.internal.ide.ChooseWorkspaceWithSettingsDialog;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-
-/**
- * Implements the open workspace action. Opens a dialog prompting for a
- * directory and then restarts the IDE on that workspace.
- * 
- * @since 3.0
- */
-public class OpenWorkspaceAction extends Action implements
-		ActionFactory.IWorkbenchAction {
-
-	/**
-	 * Action responsible for opening the "Other..." dialog (ie: the workspace
-	 * chooser).
-	 * 
-	 * @since 3.3
-	 * 
-	 */
-	class OpenDialogAction extends Action {
-
-		OpenDialogAction() {
-			super(IDEWorkbenchMessages.OpenWorkspaceAction_other);
-			setToolTipText(IDEWorkbenchMessages.OpenWorkspaceAction_toolTip);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			OpenWorkspaceAction.this.run();
-		}
-	}
-
-	/**
-	 * Action responsible for opening a specific workspace location
-	 * 
-	 * @since 3.3
-	 */
-	class WorkspaceMRUAction extends Action {
-
-		private ChooseWorkspaceData data;
-
-		private String location;
-
-		WorkspaceMRUAction(String location, ChooseWorkspaceData data) {
-			this.location = location; // preserve the location directly -
-			// setText mucks with accelerators so we
-			// can't necessarily use it safely for
-			// manipulating the location later.
-			setText(location);
-			setToolTipText(location);
-			this.data = data;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			data.workspaceSelected(location);
-			data.writePersistedData();
-			restart(location);
-		}
-	}
-
-	private static final String PROP_VM = "eclipse.vm"; //$NON-NLS-1$
-
-	private static final String PROP_VMARGS = "eclipse.vmargs"; //$NON-NLS-1$
-
-	private static final String PROP_COMMANDS = "eclipse.commands"; //$NON-NLS-1$
-
-	private static final String PROP_EXIT_CODE = "eclipse.exitcode"; //$NON-NLS-1$
-
-	private static final String PROP_EXIT_DATA = "eclipse.exitdata"; //$NON-NLS-1$
-
-	private static final String CMD_DATA = "-data"; //$NON-NLS-1$
-
-	private static final String CMD_VMARGS = "-vmargs"; //$NON-NLS-1$
-
-	private static final String NEW_LINE = "\n"; //$NON-NLS-1$
-
-	private IWorkbenchWindow window;
-
-	/**
-	 * Set definition for this action and text so that it will be used for File
-	 * -&gt; Open Workspace in the argument window.
-	 * 
-	 * @param window
-	 *            the window in which this action should appear
-	 */
-	public OpenWorkspaceAction(IWorkbenchWindow window) {
-		super(IDEWorkbenchMessages.OpenWorkspaceAction_text,
-				IAction.AS_DROP_DOWN_MENU);
-
-		if (window == null) {
-			throw new IllegalArgumentException();
-		}
-
-		// TODO help?
-
-		this.window = window;
-		setToolTipText(IDEWorkbenchMessages.OpenWorkspaceAction_toolTip);
-		setActionDefinitionId("org.eclipse.ui.file.openWorkspace"); //$NON-NLS-1$
-		setMenuCreator(new IMenuCreator() {
-			private MenuManager dropDownMenuMgr;
-
-			/**
-			 * Creates the menu manager for the drop-down.
-			 */
-			private void createDropDownMenuMgr() {
-				if (dropDownMenuMgr == null) {
-					dropDownMenuMgr = new MenuManager();
-					final ChooseWorkspaceData data = new ChooseWorkspaceData(
-							Platform.getInstanceLocation().getURL());
-					data.readPersistedData();
-					String current = data.getInitialDefault();
-					String[] workspaces = data.getRecentWorkspaces();
-					for (int i = 0; i < workspaces.length; i++) {
-						if (workspaces[i] != null
-								&& !workspaces[i].equals(current)) {
-							dropDownMenuMgr.add(new WorkspaceMRUAction(
-									workspaces[i], data));
-						}
-					}
-					if (!dropDownMenuMgr.isEmpty())
-						dropDownMenuMgr.add(new Separator());
-					dropDownMenuMgr.add(new OpenDialogAction());
-				}
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-			 */
-			public Menu getMenu(Control parent) {
-				createDropDownMenuMgr();
-				return dropDownMenuMgr.createContextMenu(parent);
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-			 */
-			public Menu getMenu(Menu parent) {
-				createDropDownMenuMgr();
-				Menu menu = new Menu(parent);
-				IContributionItem[] items = dropDownMenuMgr.getItems();
-				for (int i = 0; i < items.length; i++) {
-					IContributionItem item = items[i];
-					IContributionItem newItem = item;
-					if (item instanceof ActionContributionItem) {
-						newItem = new ActionContributionItem(
-								((ActionContributionItem) item).getAction());
-					}
-					newItem.fill(menu, -1);
-				}
-				return menu;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.action.IMenuCreator#dispose()
-			 */
-			public void dispose() {
-				if (dropDownMenuMgr != null) {
-					dropDownMenuMgr.dispose();
-					dropDownMenuMgr = null;
-				}
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		String path = promptForWorkspace();
-		if (path == null) {
-			return;
-		}
-
-		restart(path);
-	}
-
-	/**
-	 * Restart the workbench using the specified path as the workspace location.
-	 * 
-	 * @param path
-	 *            the location
-	 * @since 3.3
-	 */
-	private void restart(String path) {
-		String command_line = buildCommandLine(path);
-		if (command_line == null) {
-			return;
-		}
-
-		System.setProperty(PROP_EXIT_CODE, Integer.toString(24));
-		System.setProperty(PROP_EXIT_DATA, command_line);
-		window.getWorkbench().restart();
-	}
-
-	/**
-	 * Use the ChooseWorkspaceDialog to get the new workspace from the user.
-	 * 
-	 * @return a string naming the new workspace and null if cancel was selected
-	 */
-	private String promptForWorkspace() {
-		// get the current workspace as the default
-		ChooseWorkspaceData data = new ChooseWorkspaceData(Platform
-				.getInstanceLocation().getURL());
-		ChooseWorkspaceDialog dialog = new ChooseWorkspaceWithSettingsDialog(
-				window.getShell(), data, true, false);
-		dialog.prompt(true);
-
-		// return null if the user changed their mind
-		String selection = data.getSelection();
-		if (selection == null) {
-			return null;
-		}
-
-		// otherwise store the new selection and return the selection
-		data.writePersistedData();
-		return selection;
-	}
-
-	/**
-	 * Create and return a string with command line options for eclipse.exe that
-	 * will launch a new workbench that is the same as the currently running
-	 * one, but using the argument directory as its workspace.
-	 * 
-	 * @param workspace
-	 *            the directory to use as the new workspace
-	 * @return a string of command line options or null on error
-	 */
-	private String buildCommandLine(String workspace) {
-		String property = System.getProperty(PROP_VM);
-		if (property == null) {
-			MessageDialog
-					.openError(
-							window.getShell(),
-							IDEWorkbenchMessages.OpenWorkspaceAction_errorTitle,
-							NLS
-									.bind(
-											IDEWorkbenchMessages.OpenWorkspaceAction_errorMessage,
-											PROP_VM));
-			return null;
-		}
-
-		StringBuffer result = new StringBuffer(512);
-		result.append(property);
-		result.append(NEW_LINE);
-
-		// append the vmargs and commands. Assume that these already end in \n
-		String vmargs = System.getProperty(PROP_VMARGS);
-		if (vmargs != null) {
-			result.append(vmargs);
-		}
-
-		// append the rest of the args, replacing or adding -data as required
-		property = System.getProperty(PROP_COMMANDS);
-		if (property == null) {
-			result.append(CMD_DATA);
-			result.append(NEW_LINE);
-			result.append(workspace);
-			result.append(NEW_LINE);
-		} else {
-			// find the index of the arg to replace its value
-			int cmd_data_pos = property.lastIndexOf(CMD_DATA);
-			if (cmd_data_pos != -1) {
-				cmd_data_pos += CMD_DATA.length() + 1;
-				result.append(property.substring(0, cmd_data_pos));
-				result.append(workspace);
-				result.append(property.substring(property.indexOf('\n',
-						cmd_data_pos)));
-			} else {
-				result.append(CMD_DATA);
-				result.append(NEW_LINE);
-				result.append(workspace);
-				result.append(NEW_LINE);
-				result.append(property);
-			}
-		}
-
-		// put the vmargs back at the very end (the eclipse.commands property
-		// already contains the -vm arg)
-		if (vmargs != null) {
-			result.append(CMD_VMARGS);
-			result.append(NEW_LINE);
-			result.append(vmargs);
-		}
-
-		return result.toString();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#dispose()
-	 */
-	public void dispose() {
-		window = null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/ProjectPropertyDialogAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/ProjectPropertyDialogAction.java
deleted file mode 100644
index a34b9b7..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/ProjectPropertyDialogAction.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.actions;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.INullSelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.PartEventAction;
-import org.eclipse.ui.dialogs.PropertyDialogAction;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-
-/**
- * Implementation for the action Property on the Project menu.
- */
-public class ProjectPropertyDialogAction extends PartEventAction implements
-        INullSelectionListener, ActionFactory.IWorkbenchAction {
-
-    /**
-     * The workbench window; or <code>null</code> if this
-     * action has been <code>dispose</code>d.
-     */
-    private IWorkbenchWindow workbenchWindow;
-
-    /**
-     * Create a new dialog.
-     * 
-     * @param window the window
-     */
-    public ProjectPropertyDialogAction(IWorkbenchWindow window) {
-        super(new String());
-        if (window == null) {
-            throw new IllegalArgumentException();
-        }
-        this.workbenchWindow = window;
-        setText(IDEWorkbenchMessages.Workbench_projectProperties);
-        setToolTipText(IDEWorkbenchMessages.Workbench_projectPropertiesToolTip);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                IIDEHelpContextIds.PROJECT_PROPERTY_DIALOG_ACTION);
-        workbenchWindow.getSelectionService().addSelectionListener(this);
-        workbenchWindow.getPartService().addPartListener(this);
-        setActionDefinitionId("org.eclipse.ui.project.properties"); //$NON-NLS-1$
-    }
-
-    /**
-     * Opens the project properties dialog.
-     */
-    public void run() {
-        IProject project = getProject();
-        if (project == null) {
-			return;
-		}
-
-        SelProvider selProvider = new SelProvider();
-        selProvider.projectSelection = new StructuredSelection(project);
-        PropertyDialogAction propAction = new PropertyDialogAction(
-                workbenchWindow.getShell(), selProvider);
-        propAction.run();
-    }
-
-    /**
-     * Update the enablement state when a the selection changes.
-     */
-    public void selectionChanged(IWorkbenchPart part, ISelection sel) {
-        setEnabled(getProject() != null);
-    }
-
-    /**
-     * Update the enablement state when a new part is activated.
-     */
-    public void partActivated(IWorkbenchPart part) {
-        super.partActivated(part);
-        setEnabled(getProject() != null);
-    }
-
-    /**
-     * Returns a project from the selection of the active part.
-     */
-    private IProject getProject() {
-        IWorkbenchPart part = getActivePart();
-        Object selection = null;
-        if (part instanceof IEditorPart) {
-            selection = ((IEditorPart) part).getEditorInput();
-        } else {
-            ISelection sel = workbenchWindow.getSelectionService()
-                    .getSelection();
-            if ((sel != null) && (sel instanceof IStructuredSelection)) {
-				selection = ((IStructuredSelection) sel).getFirstElement();
-			}
-        }
-        if (selection == null) {
-			return null;
-		}
-        if (!(selection instanceof IAdaptable)) {
-			return null;
-		}
-        IResource resource = (IResource) ((IAdaptable) selection)
-                .getAdapter(IResource.class);
-        if (resource == null) {
-			return null;
-		}
-        return resource.getProject();
-    }
-
-    /* (non-javadoc)
-     * Method declared on ActionFactory.IWorkbenchAction
-     */
-    public void dispose() {
-        if (workbenchWindow == null) {
-            // action has already been disposed
-            return;
-        }
-        workbenchWindow.getSelectionService().removeSelectionListener(this);
-        workbenchWindow.getPartService().removePartListener(this);
-        workbenchWindow = null;
-    }
-
-    /*
-     * Helper class to simulate a selection provider
-     */
-    private static final class SelProvider implements ISelectionProvider {
-        protected IStructuredSelection projectSelection = StructuredSelection.EMPTY;
-
-        public void addSelectionChangedListener(
-                ISelectionChangedListener listener) {
-            // do nothing
-        }
-
-        public ISelection getSelection() {
-            return projectSelection;
-        }
-
-        public void removeSelectionChangedListener(
-                ISelectionChangedListener listener) {
-            // do nothing
-        }
-
-        public void setSelection(ISelection selection) {
-            // do nothing
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/QuickMenuAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/QuickMenuAction.java
deleted file mode 100644
index 0ac12ab..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/QuickMenuAction.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.bindings.TriggerSequence;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.QuickMenuCreator;
-import org.eclipse.ui.keys.IBindingService;
-
-/**
- * A quick menu actions provides support to assign short cuts
- * to sub menus.
- * 
- * @since 3.0
- */
-public abstract class QuickMenuAction extends Action {
-
-	private QuickMenuCreator creator = new QuickMenuCreator() {
-		protected void fillMenu(IMenuManager menu) {
-			QuickMenuAction.this.fillMenu(menu);
-		}
-	};
-
-    /**
-     * Creates a new quick menu action with the given command id.
-     * 
-     * @param commandId the command id of the short cut used to open
-     *  the sub menu 
-     */
-    public QuickMenuAction(String commandId) {
-        setId(commandId);
-        setActionDefinitionId(commandId);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public void run() {
-    	creator.createMenu();
-    }
-    
-    /**
-     * Dispose of this menu action.
-     */
-    public void dispose() {
-        if (creator != null) {
-            creator.dispose();
-            creator = null;
-        }
-    }
-
-    /**
-     * Hook to fill a menu manager with the items of the sub menu.
-     * 
-     * @param menu the sub menu to fill
-     */
-    protected abstract void fillMenu(IMenuManager menu);
-    
-    /**
-     * Returns the short cut assigned to the sub menu or <code>null</code> if
-     * no short cut is assigned.
-     * 
-     * @return the short cut as a human readable string or <code>null</code>
-     */
-    public String getShortCutString() {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		final IBindingService bindingService = (IBindingService) workbench
-				.getAdapter(IBindingService.class);
-		final TriggerSequence[] activeBindings = bindingService
-				.getActiveBindingsFor(getActionDefinitionId());
-		if (activeBindings.length > 0) {
-			return activeBindings[0].format();
-		}
-
-		return null;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/RetargetActionWithDefault.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/RetargetActionWithDefault.java
deleted file mode 100644
index 2edece1..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/RetargetActionWithDefault.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ui.actions.RetargetAction;
-
-/**
- * A specialization of RetargetAction that allows for specification of a default
- * handler when the active part does not supply one.  Enablement of this
- * action is based on enablement of the handler, or enablement of the default
- * handler if no explicit handler is available.
- * 
- * @since 3.1
- */
-public class RetargetActionWithDefault extends RetargetAction {
-
-	private IAction defaultHandler;
-
-	/**
-	 * Constructs a RetargetActionWithDefault with the given action id and text.
-	 * 
-	 * @param actionID the retargetable action id
-	 * @param text the action's text, or <code>null</code> if there is no text
-	 */
-	public RetargetActionWithDefault(String actionID, String text) {
-		super(actionID, text);
-	}
-
-	/* (non-Javadoc)
-	 * Method declared on RetargetAction.
-	 */
-	protected void setActionHandler(IAction newHandler) {
-		super.setActionHandler(newHandler);
-		// Only set the default handler after clearing the old handler above.
-		// This triggers enablement updating on the default handler which 
-		// might be needed since the active part has changed.
-		if (newHandler == null) {
-			super.setActionHandler(defaultHandler);
-		}
-	}
-
-	/**
-	 * Sets the default handler for this action.
-	 * @param handler An action handler, or <code>null</code>
-	 */
-	public void setDefaultHandler(IAction handler) {
-		this.defaultHandler = handler;
-		if (getActionHandler() == null && handler != null) {
-			super.setActionHandler(handler);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/SelectBuildWorkingSetAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/SelectBuildWorkingSetAction.java
deleted file mode 100644
index cb15a92..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/SelectBuildWorkingSetAction.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-
-/**
- * This action asks the user to select a working set, and then creates
- * and runs a corresponding BuildSetAction.
- * 
- * @since 3.0
- */
-public class SelectBuildWorkingSetAction extends Action implements
-        ActionFactory.IWorkbenchAction {
-    private IWorkbenchWindow window;
-
-    private IActionBarConfigurer actionBars;
-
-    public SelectBuildWorkingSetAction(IWorkbenchWindow window,
-            IActionBarConfigurer actionBars) {
-        super(IDEWorkbenchMessages.SelectWorkingSetAction_text);
-        this.window = window;
-        this.actionBars = actionBars;
-    }
-
-    private IWorkingSet queryForWorkingSet() {
-        IWorkingSetManager manager = window.getWorkbench()
-                .getWorkingSetManager();
-        IWorkingSetSelectionDialog dialog = manager
-                .createWorkingSetSelectionDialog(window.getShell(), false);
-        dialog.open();
-        IWorkingSet[] sets = dialog.getSelection();
-        //check for cancel
-        if (sets == null || sets.length == 0) {
-			return null;
-		}
-        return sets[0];
-    }
-
-    public void run() {
-        IWorkingSet set = queryForWorkingSet();
-        if (set != null) {
-            new BuildSetAction(set, window, actionBars).run();
-        }
-    }
-
-    public void dispose() {
-    }
-
-    public void setActionBars(IActionBarConfigurer actionBars) {
-        this.actionBars = actionBars;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/ToggleAutoBuildAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/ToggleAutoBuildAction.java
deleted file mode 100644
index b150780..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/actions/ToggleAutoBuildAction.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.actions;
-
-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.jface.action.Action;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-
-/**
- * Action for toggling autobuild on or off.
- */
-public class ToggleAutoBuildAction extends Action implements
-        ActionFactory.IWorkbenchAction {
-    private IWorkbenchWindow window;
-
-    /**
-     * Creates a new ToggleAutoBuildAction
-     * @param window The window for parenting dialogs associated with this action
-     */
-    public ToggleAutoBuildAction(IWorkbenchWindow window) {
-        super(IDEWorkbenchMessages.Workbench_buildAutomatically);
-        this.window = window;
-        setChecked(ResourcesPlugin.getWorkspace().isAutoBuilding());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.actions.ActionFactory.IWorkbenchAction#dispose()
-     */
-    public void dispose() {
-        //nothing to dispose
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#run()
-     */
-    public void run() {
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        IWorkspaceDescription description = workspace.getDescription();
-        description.setAutoBuilding(!description.isAutoBuilding());
-        try {
-            workspace.setDescription(description);
-        } catch (CoreException e) {
-            ErrorDialog.openError(window.getShell(), null, null, e.getStatus());
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/commands/CopyBuildIdToClipboardHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/commands/CopyBuildIdToClipboardHandler.java
deleted file mode 100644
index fcf59f6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/commands/CopyBuildIdToClipboardHandler.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.ide.commands;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.ui.handlers.HandlerUtil;
-import org.eclipse.ui.internal.ConfigurationInfo;
-
-/**
- * Copies the build ID to the clipboard. Useful for debugging and bug
- * reporting/verification.
- * 
- * @since 3.4
- * 
- */
-public class CopyBuildIdToClipboardHandler extends AbstractHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		final String buildId = ConfigurationInfo.getBuildId();
-		if (buildId == null)
-			throw new ExecutionException("No build ID in this instance."); //$NON-NLS-1$
-		Clipboard clipboard = null;
-		try {
-			clipboard = new Clipboard(HandlerUtil.getActiveShell(event)
-					.getDisplay());
-			clipboard.setContents(new Object[] { buildId },
-					new Transfer[] { TextTransfer.getInstance() });
-		} finally {
-			if (clipboard != null) {
-				clipboard.dispose();
-			}
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/commands/CopyConfigToClipboardHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/commands/CopyConfigToClipboardHandler.java
deleted file mode 100644
index 30757d6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/commands/CopyConfigToClipboardHandler.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.ide.commands;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.ui.handlers.HandlerUtil;
-import org.eclipse.ui.internal.ConfigurationInfo;
-
-/**
- * Copies the configuration data present in the about dialog to the clipboard.
- * 
- * @since 3.4
- */
-public class CopyConfigToClipboardHandler extends AbstractHandler {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) {
-		String contents = ConfigurationInfo.getSystemSummary();
-		Clipboard clipboard = null;
-		try {
-			clipboard = new Clipboard(HandlerUtil.getActiveShell(event)
-					.getDisplay());
-			clipboard.setContents(new Object[] { contents },
-					new Transfer[] { TextTransfer.getInstance() });
-		} finally {
-			if (clipboard != null) {
-				clipboard.dispose();
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/commands/ResourcePathConverter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/commands/ResourcePathConverter.java
deleted file mode 100644
index 2e269e6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/commands/ResourcePathConverter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.ide.commands;
-
-import org.eclipse.core.commands.AbstractParameterValueConverter;
-import org.eclipse.core.commands.ParameterValueConversionException;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-
-/**
- * A command parameter value converter to convert between IResources and strings
- * encoding the path of a resource.
- * 
- * @since 3.2
- */
-public final class ResourcePathConverter extends
-		AbstractParameterValueConverter {
-
-	public final Object convertToObject(final String parameterValue)
-			throws ParameterValueConversionException {
-		final Path path = new Path(parameterValue);
-		final IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace()
-				.getRoot();
-		final IResource resource = workspaceRoot.findMember(path);
-
-		if ((resource == null) || (!resource.exists())) {
-			throw new ParameterValueConversionException(
-					"parameterValue must be the path of an existing resource"); //$NON-NLS-1$
-		}
-
-		return resource;
-	}
-
-	public final String convertToString(final Object parameterValue)
-			throws ParameterValueConversionException {
-		if (!(parameterValue instanceof IResource)) {
-			throw new ParameterValueConversionException(
-					"parameterValue must be an IResource"); //$NON-NLS-1$
-		}
-		final IResource resource = (IResource) parameterValue;
-		return resource.getFullPath().toString();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/BuildOrderPreferencePage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/BuildOrderPreferencePage.java
deleted file mode 100644
index 4f50b92..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/BuildOrderPreferencePage.java
+++ /dev/null
@@ -1,631 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.util.TreeSet;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.preference.FieldEditor;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Font;
-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.List;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.GlobalBuildAction;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.util.PrefUtil;
-
-/**	
- * Page used to determine what order projects will be built in 
- * by the workspace.
- */
-public class BuildOrderPreferencePage extends PreferencePage implements
-        IWorkbenchPreferencePage {
-
-    private IWorkbench workbench;
-
-    private Button defaultOrderButton;
-
-    private Label buildLabel;
-
-    private List buildList;
-
-    private Composite buttonComposite;
-
-    private IntegerFieldEditor maxItersField;
-
-    private String[] defaultBuildOrder;
-
-    private String[] customBuildOrder;
-
-    //Boolean to indicate if we have looked it up
-    private boolean notCheckedBuildOrder = true;
-
-    private final String UP_LABEL = IDEWorkbenchMessages.BuildOrderPreference_up;
-
-    private final String DOWN_LABEL = IDEWorkbenchMessages.BuildOrderPreference_down;
-
-    private final String ADD_LABEL = IDEWorkbenchMessages.BuildOrderPreference_add;
-
-    private final String REMOVE_LABEL = IDEWorkbenchMessages.BuildOrderPreference_remove;
-
-    private final String PROJECT_SELECTION_MESSAGE = IDEWorkbenchMessages.BuildOrderPreference_selectOtherProjects;
-
-    private final String DEFAULTS_LABEL = IDEWorkbenchMessages.BuildOrderPreference_useDefaults;
-
-    private final String LIST_LABEL = IDEWorkbenchMessages.BuildOrderPreference_projectBuildOrder;
-
-    private final String NOTE_LABEL = IDEWorkbenchMessages.Preference_note;
-
-    private final String REMOVE_MESSAGE = IDEWorkbenchMessages.BuildOrderPreference_removeNote;
-
-    // whether or not the use defaults option was selected when Apply (or OK) was last pressed
-    // (or when the preference page was opened). This represents the most recent applied state.
-    private boolean defaultOrderInitiallySelected;
-
-    private IPropertyChangeListener validityChangeListener = new IPropertyChangeListener() {
-        public void propertyChange(PropertyChangeEvent event) {
-            if (event.getProperty().equals(FieldEditor.IS_VALID)) {
-				updateValidState();
-			}
-        }
-    };
-
-    /**
-     * Add another project to the list at the end.
-     */
-    private void addProject() {
-
-        String[] currentItems = this.buildList.getItems();
-
-        IProject[] allProjects = getWorkspace().getRoot().getProjects();
-
-        ILabelProvider labelProvider = new LabelProvider() {
-            public String getText(Object element) {
-                return (String) element;
-            }
-        };
-
-        SimpleListContentProvider contentsProvider = new SimpleListContentProvider();
-        contentsProvider
-                .setElements(sortedDifference(allProjects, currentItems));
-
-        ListSelectionDialog dialog = new ListSelectionDialog(this.getShell(),
-                this, contentsProvider, labelProvider,
-                PROJECT_SELECTION_MESSAGE);
-
-        if (dialog.open() != Window.OK) {
-			return;
-		}
-
-        Object[] result = dialog.getResult();
-
-        int currentItemsLength = currentItems.length;
-        int resultLength = result.length;
-        String[] newItems = new String[currentItemsLength + resultLength];
-
-        System.arraycopy(currentItems, 0, newItems, 0, currentItemsLength);
-        System
-                .arraycopy(result, 0, newItems, currentItemsLength,
-                        result.length);
-        this.buildList.setItems(newItems);
-    }
-
-    /**
-     * Updates the valid state of the page.
-     */
-    private void updateValidState() {
-        setValid(maxItersField.isValid());
-    }
-
-    /**
-     * Create the list of build paths. If the current build order is empty make the list empty
-     * and disable it.
-     * @param composite - the parent to create the list in
-     * @param enabled - the boolean that indcates if the list will be sensitive initially or not
-     */
-    private void createBuildOrderList(Composite composite, boolean enabled) {
-
-        Font font = composite.getFont();
-
-        this.buildLabel = new Label(composite, SWT.NONE);
-        this.buildLabel.setText(LIST_LABEL);
-        this.buildLabel.setEnabled(enabled);
-        GridData gridData = new GridData();
-        gridData.horizontalAlignment = GridData.FILL;
-        gridData.horizontalSpan = 2;
-        this.buildLabel.setLayoutData(gridData);
-        this.buildLabel.setFont(font);
-
-        this.buildList = new List(composite, SWT.BORDER | SWT.MULTI
-                | SWT.H_SCROLL | SWT.V_SCROLL);
-        this.buildList.setEnabled(enabled);
-        GridData data = new GridData();
-        //Set heightHint with a small value so the list size will be defined by 
-        //the space available in the dialog instead of resizing the dialog to
-        //fit all the items in the list.
-        data.heightHint = buildList.getItemHeight();
-        data.verticalAlignment = GridData.FILL;
-        data.horizontalAlignment = GridData.FILL;
-        data.grabExcessHorizontalSpace = true;
-        data.grabExcessVerticalSpace = true;
-        this.buildList.setLayoutData(data);
-        this.buildList.setFont(font);
-    }
-
-    /**
-     * Create the widgets that are used to determine the build order.
-     *
-     * @param parent the parent composite
-     * @return the new control
-     */
-    protected Control createContents(Composite parent) {
-
-    	PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
-                IIDEHelpContextIds.BUILD_ORDER_PREFERENCE_PAGE);
-
-        Font font = parent.getFont();
-
-        //The main composite
-        Composite composite = new Composite(parent, SWT.NULL);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        composite.setLayout(layout);
-        GridData data = new GridData();
-        data.verticalAlignment = GridData.FILL;
-        data.horizontalAlignment = GridData.FILL;
-        composite.setLayoutData(data);
-        composite.setFont(font);
-
-        String[] buildOrder = getCurrentBuildOrder();
-        boolean useDefault = (buildOrder == null);
-
-        createDefaultPathButton(composite, useDefault);
-        // List always enabled so user can scroll list.
-        // Only the buttons need to be disabled.
-        createBuildOrderList(composite, true);
-        createListButtons(composite, !useDefault);
-
-        Composite noteComposite = createNoteComposite(font, composite,
-                NOTE_LABEL, REMOVE_MESSAGE);
-        GridData noteData = new GridData();
-        noteData.horizontalSpan = 2;
-        noteComposite.setLayoutData(noteData);
-
-        createSpacer(composite);
-
-        createMaxIterationsField(composite);
-
-        createSpacer(composite);
-
-        if (useDefault) {
-            this.buildList.setItems(getDefaultProjectOrder());
-        } else {
-            this.buildList.setItems(buildOrder);
-        }
-
-        return composite;
-
-    }
-
-    /**
-     * Adds in a spacer.
-     * 
-     * @param composite the parent composite
-     */
-    private void createSpacer(Composite composite) {
-        Label spacer = new Label(composite, SWT.NONE);
-        GridData spacerData = new GridData();
-        spacerData.horizontalSpan = 2;
-        spacer.setLayoutData(spacerData);
-    }
-
-    /**
-     * Create the default path button. Set it to selected based on the current workspace
-     * build path.
-     * @param composite org.eclipse.swt.widgets.Composite
-     * @param selected - the boolean that indicates the buttons initial state
-     */
-    private void createDefaultPathButton(Composite composite, boolean selected) {
-
-        defaultOrderInitiallySelected = selected;
-
-        this.defaultOrderButton = new Button(composite, SWT.LEFT | SWT.CHECK);
-        this.defaultOrderButton.setSelection(selected);
-        this.defaultOrderButton.setText(DEFAULTS_LABEL);
-        SelectionListener listener = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                defaultsButtonSelected(defaultOrderButton.getSelection());
-            }
-        };
-        this.defaultOrderButton.addSelectionListener(listener);
-
-        GridData gridData = new GridData();
-        gridData.horizontalAlignment = GridData.FILL;
-        gridData.horizontalSpan = 2;
-        this.defaultOrderButton.setLayoutData(gridData);
-        this.defaultOrderButton.setFont(composite.getFont());
-    }
-
-    /**
-     * Create the buttons used to manipulate the list. These Add, Remove and Move Up or Down
-     * the list items.
-     * @param composite the parent of the buttons
-     * @param enableComposite - boolean that indicates if a composite should be enabled
-     */
-    private void createListButtons(Composite composite, boolean enableComposite) {
-
-        Font font = composite.getFont();
-
-        //Create an intermeditate composite to keep the buttons in the same column
-        this.buttonComposite = new Composite(composite, SWT.RIGHT);
-        GridLayout layout = new GridLayout();
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        this.buttonComposite.setLayout(layout);
-        GridData gridData = new GridData();
-        gridData.verticalAlignment = GridData.FILL;
-        gridData.horizontalAlignment = GridData.FILL;
-        this.buttonComposite.setLayoutData(gridData);
-        this.buttonComposite.setFont(font);
-
-        Button upButton = new Button(this.buttonComposite, SWT.CENTER
-                | SWT.PUSH);
-        upButton.setText(UP_LABEL);
-        upButton.setEnabled(enableComposite);
-        upButton.setFont(font);
-        setButtonLayoutData(upButton);
-
-        SelectionListener listener = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                moveSelectionUp();
-            }
-        };
-        upButton.addSelectionListener(listener);
-
-        Button downButton = new Button(this.buttonComposite, SWT.CENTER
-                | SWT.PUSH);
-        downButton.setText(DOWN_LABEL);
-        downButton.setEnabled(enableComposite);
-        listener = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                moveSelectionDown();
-            }
-        };
-        downButton.addSelectionListener(listener);
-        downButton.setFont(font);
-        setButtonLayoutData(downButton);
-
-        Button addButton = new Button(this.buttonComposite, SWT.CENTER
-                | SWT.PUSH);
-        addButton.setText(ADD_LABEL);
-        listener = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                addProject();
-            }
-        };
-        addButton.addSelectionListener(listener);
-        addButton.setEnabled(enableComposite);
-        addButton.setFont(font);
-        setButtonLayoutData(addButton);
-
-        Button removeButton = new Button(this.buttonComposite, SWT.CENTER
-                | SWT.PUSH);
-        removeButton.setText(REMOVE_LABEL);
-        listener = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                removeSelection();
-            }
-        };
-        removeButton.addSelectionListener(listener);
-        removeButton.setEnabled(enableComposite);
-        removeButton.setFont(font);
-        setButtonLayoutData(removeButton);
-
-    }
-
-    /**
-     * Create the field for the maximum number of iterations in the presence
-     * of cycles. 
-     */
-    private void createMaxIterationsField(Composite composite) {
-        Composite maxItersComposite = new Composite(composite, SWT.NONE);
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        maxItersComposite.setLayoutData(gd);
-        maxItersComposite.setFont(composite.getFont());
-
-        maxItersField = new IntegerFieldEditor(
-                "", IDEWorkbenchMessages.BuildOrderPreference_maxIterationsLabel, maxItersComposite) { //$NON-NLS-1$
-            protected void doLoad() {
-                Text text = getTextControl();
-                if (text != null) {
-                    int value = getWorkspace().getDescription()
-                            .getMaxBuildIterations();
-                    text.setText(Integer.toString(value));
-                }
-            }
-
-            protected void doLoadDefault() {
-                Text text = getTextControl();
-                if (text != null) {
-                    int value = ResourcesPlugin.getPlugin()
-                            .getPluginPreferences().getDefaultInt(
-                                    ResourcesPlugin.PREF_MAX_BUILD_ITERATIONS);
-                    text.setText(Integer.toString(value));
-                }
-                valueChanged();
-            }
-
-            protected void doStore() {
-                // handled specially in performOK()
-                throw new UnsupportedOperationException();
-            }
-        };
-        maxItersField.setValidRange(1, Integer.MAX_VALUE);
-        maxItersField.setPage(this);
-        maxItersField.setPreferenceStore(getPreferenceStore());
-        maxItersField.setPropertyChangeListener(validityChangeListener);
-        maxItersField.load();
-    }
-
-    /**
-     * The defaults button has been selected - update the other widgets as required.
-     * @param selected - whether or not the defaults button got selected
-     */
-    private void defaultsButtonSelected(boolean selected) {
-        if (selected) {
-            setBuildOrderWidgetsEnablement(false);
-            //Cache the current value as the custom order
-            customBuildOrder = buildList.getItems();
-            buildList.setItems(getDefaultProjectOrder());
-
-        } else {
-            setBuildOrderWidgetsEnablement(true);
-            String[] buildOrder = getCurrentBuildOrder();
-            if (buildOrder == null) {
-				buildList.setItems(getDefaultProjectOrder());
-			} else {
-				buildList.setItems(buildOrder);
-			}
-        }
-    }
-
-    /**
-     * Get the project names for the current custom build
-     * order stored in the workspace description.
-     * 
-     * @return java.lang.String[] or null if there is no setting
-     */
-    private String[] getCurrentBuildOrder() {
-        if (notCheckedBuildOrder) {
-            customBuildOrder = getWorkspace().getDescription().getBuildOrder();
-            notCheckedBuildOrder = false;
-        }
-
-        return customBuildOrder;
-    }
-
-    /**
-     * Get the project names in the default build order
-     * based on the current Workspace settings.
-     * 
-     * @return java.lang.String[]
-     */
-    private String[] getDefaultProjectOrder() {
-        if (defaultBuildOrder == null) {
-            IWorkspace workspace = getWorkspace();
-            IWorkspace.ProjectOrder projectOrder = getWorkspace()
-                    .computeProjectOrder(workspace.getRoot().getProjects());
-            IProject[] foundProjects = projectOrder.projects;
-            defaultBuildOrder = new String[foundProjects.length];
-            int foundSize = foundProjects.length;
-            for (int i = 0; i < foundSize; i++) {
-                defaultBuildOrder[i] = foundProjects[i].getName();
-            }
-        }
-
-        return defaultBuildOrder;
-    }
-
-    /**
-     * Return the Workspace the build order is from.
-     * @return org.eclipse.core.resources.IWorkspace
-     */
-    private IWorkspace getWorkspace() {
-        return ResourcesPlugin.getWorkspace();
-    }
-
-    /**
-     * Return whether or not searchElement is in testArray.
-     */
-    private boolean includes(String[] testArray, String searchElement) {
-
-        for (int i = 0; i < testArray.length; i++) {
-            if (searchElement.equals(testArray[i])) {
-				return true;
-			}
-        }
-        return false;
-
-    }
-
-    /**
-     * See IWorkbenchPreferencePage. This class does nothing with he Workbench.
-     */
-    public void init(IWorkbench workbench) {
-        this.workbench = workbench;
-        setPreferenceStore(PrefUtil.getInternalPreferenceStore());
-    }
-
-    /**
-     * Move the current selection in the build list down.
-     */
-    private void moveSelectionDown() {
-
-        //Only do this operation on a single selection
-        if (this.buildList.getSelectionCount() == 1) {
-            int currentIndex = this.buildList.getSelectionIndex();
-            if (currentIndex < this.buildList.getItemCount() - 1) {
-                String elementToMove = this.buildList.getItem(currentIndex);
-                this.buildList.remove(currentIndex);
-                this.buildList.add(elementToMove, currentIndex + 1);
-                this.buildList.select(currentIndex + 1);
-            }
-        }
-    }
-
-    /**
-     * Move the current selection in the build list up.
-     */
-    private void moveSelectionUp() {
-
-        int currentIndex = this.buildList.getSelectionIndex();
-
-        //Only do this operation on a single selection
-        if (currentIndex > 0 && this.buildList.getSelectionCount() == 1) {
-            String elementToMove = this.buildList.getItem(currentIndex);
-            this.buildList.remove(currentIndex);
-            this.buildList.add(elementToMove, currentIndex - 1);
-            this.buildList.select(currentIndex - 1);
-        }
-    }
-
-    /**
-     * Performs special processing when this page's Defaults button has been pressed.
-     * In this case change the defaultOrderButton to have it's selection set to true.
-     */
-    protected void performDefaults() {
-        this.defaultOrderButton.setSelection(true);
-        defaultsButtonSelected(true);
-        maxItersField.loadDefault();
-        super.performDefaults();
-    }
-
-    /** 
-     * OK has been pressed. If the defualt button is pressed then reset the build order to false;
-     * otherwise set it to the contents of the list.
-     */
-    public boolean performOk() {
-
-        String[] buildOrder = null;
-        boolean useDefault = defaultOrderButton.getSelection();
-
-        // if use defaults is turned off
-        if (!useDefault) {
-			buildOrder = buildList.getItems();
-		}
-
-        //Get a copy of the description from the workspace, set the build order and then
-        //apply it to the workspace.
-        IWorkspaceDescription description = getWorkspace().getDescription();
-        description.setBuildOrder(buildOrder);
-        description.setMaxBuildIterations(maxItersField.getIntValue());
-        try {
-            getWorkspace().setDescription(description);
-        } catch (CoreException exception) {
-            //failed - return false
-            return false;
-        }
-
-        // Perform auto-build if use default is off (because
-        // order could have changed) or if use default setting
-        // was changed.
-        if (!useDefault || (useDefault != defaultOrderInitiallySelected)) {
-            defaultOrderInitiallySelected = useDefault;
-            // If auto build is turned on, then do a global incremental
-            // build on all the projects.
-            if (ResourcesPlugin.getWorkspace().isAutoBuilding()) {
-                GlobalBuildAction action = new GlobalBuildAction(workbench
-                        .getActiveWorkbenchWindow(),
-                        IncrementalProjectBuilder.INCREMENTAL_BUILD);
-                action.doBuild();
-            }
-        }
-
-        // Clear the custom build order cache
-        customBuildOrder = null;
-
-        return true;
-    }
-
-    /**
-     * Remove the current selection in the build list.
-     */
-    private void removeSelection() {
-
-        this.buildList.remove(this.buildList.getSelectionIndices());
-    }
-
-    /**
-     * Set the widgets that select build order to be enabled or diabled.
-     * @param value boolean
-     */
-    private void setBuildOrderWidgetsEnablement(boolean value) {
-
-        // Only change enablement of buttons. Leave list alone
-        // because you can't scroll it when disabled.
-        Control[] children = this.buttonComposite.getChildren();
-        for (int i = 0; i < children.length; i++) {
-            children[i].setEnabled(value);
-        }
-    }
-
-    /**
-     * Return a sorted array of the names of the projects that are already in the currently 
-     * displayed names.
-     * @return String[]
-     * @param allProjects - all of the projects in the workspace 
-     * @param currentlyDisplayed - the names of the projects already being displayed
-     */
-    private String[] sortedDifference(IProject[] allProjects,
-            String[] currentlyDisplayed) {
-
-        TreeSet difference = new TreeSet();
-
-        for (int i = 0; i < allProjects.length; i++) {
-            if (!includes(currentlyDisplayed, allProjects[i].getName())) {
-				difference.add(allProjects[i].getName());
-			}
-        }
-
-        String[] returnValue = new String[difference.size()];
-        difference.toArray(returnValue);
-        return returnValue;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/CleanDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/CleanDialog.java
deleted file mode 100644
index 4181760..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/CleanDialog.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * 		IBM - Initial API and implementation
- * 		Remy Chi Jian Suen <remy.suen@gmail.com>
- * 			- Fix for Bug 155436 [IDE] Project>Clean dialog should not use a question-mark icon
- * 		Mark Melvin <mark_melvin@amis.com>
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-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.Shell;
-
-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.runtime.SubProgressMonitor;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.WorkspaceJob;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.window.IShellProvider;
-
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.actions.BuildAction;
-import org.eclipse.ui.actions.GlobalBuildAction;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.actions.BuildUtilities;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * Dialog that asks the user to confirm a clean operation, and to configure
- * settings in relation to the clean. Clicking ok in the dialog will perform the
- * clean operation.
- * 
- * @since 3.0
- */
-public class CleanDialog extends MessageDialog {
-    private class ProjectSubsetBuildAction extends BuildAction {
-        private IProject[] projectsToBuild = new IProject[0];
-        public ProjectSubsetBuildAction(IShellProvider shellProvider, int type, IProject[] projects) {
-            super(shellProvider, type);
-            this.projectsToBuild = projects;
-        }
-
-        protected List getSelectedResources() {
-            return Arrays.asList(this.projectsToBuild);
-        }
-	}
-
-    private static final String DIALOG_SETTINGS_SECTION = "CleanDialogSettings"; //$NON-NLS-1$
-    private static final String DIALOG_ORIGIN_X = "DIALOG_X_ORIGIN"; //$NON-NLS-1$
-    private static final String DIALOG_ORIGIN_Y = "DIALOG_Y_ORIGIN"; //$NON-NLS-1$
-    private static final String DIALOG_WIDTH = "DIALOG_WIDTH"; //$NON-NLS-1$
-    private static final String DIALOG_HEIGHT = "DIALOG_HEIGHT"; //$NON-NLS-1$
-    private static final String TOGGLE_SELECTED = "TOGGLE_SELECTED"; //$NON-NLS-1$
-    private static final String BUILD_NOW = "BUILD_NOW"; //$NON-NLS-1$
-    private static final String BUILD_ALL = "BUILD_ALL"; //$NON-NLS-1$
-    
-    private Button allButton, selectedButton, buildNowButton, globalBuildButton, projectBuildButton;
-
-    private CheckboxTableViewer projectNames;
-
-    private Object[] selection;
-
-    private IWorkbenchWindow window;
-
-    /**
-     * Gets the text of the clean dialog, depending on whether the
-     * workspace is currently in autobuild mode.
-     * @return String the question the user will be asked.
-     */
-    private static String getQuestion() {
-        boolean autoBuilding = ResourcesPlugin.getWorkspace().isAutoBuilding();
-        if (autoBuilding) {
-            return IDEWorkbenchMessages.CleanDialog_buildCleanAuto;
-        }
-        return IDEWorkbenchMessages.CleanDialog_buildCleanManual;
-    }
-
-    /**
-     * Creates a new clean dialog.
-     * 
-     * @param window the window to create it in
-     * @param selection the currently selected projects (may be empty)
-     */
-    public CleanDialog(IWorkbenchWindow window, IProject[] selection) {
-        super(
-                window.getShell(),
-                IDEWorkbenchMessages.CleanDialog_title, null, getQuestion(), NONE, new String[] {
-                IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL }, 0);
-        this.window = window;
-        this.selection = selection;
-        if (this.selection == null) {
-            this.selection = new Object[0];
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
-     */
-    protected void buttonPressed(int buttonId) {
-        final boolean cleanAll = allButton.getSelection();
-        final boolean buildAll = buildNowButton != null
-                && buildNowButton.getSelection();
-        final boolean globalBuild = globalBuildButton != null
-                && globalBuildButton.getSelection();
-        super.buttonPressed(buttonId);
-        if (buttonId != IDialogConstants.OK_ID) {
-            return;
-        }
-        //save all dirty editors
-        BuildUtilities.saveEditors(null);
-        //batching changes ensures that autobuild runs after cleaning
-		WorkspaceJob cleanJob = new WorkspaceJob(
-				cleanAll ? IDEWorkbenchMessages.CleanDialog_cleanAllTaskName
-						: IDEWorkbenchMessages.CleanDialog_cleanSelectedTaskName) {
-            public boolean belongsTo(Object family) {
-                return ResourcesPlugin.FAMILY_MANUAL_BUILD.equals(family);
-            }
-            public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
-                doClean(cleanAll, monitor);
-                //see if a build was requested
-                if (buildAll) {
-                    // Only build what was requested
-                    if (globalBuild) {
-                        //start an immediate workspace build
-                        GlobalBuildAction build = new GlobalBuildAction(window,
-                                IncrementalProjectBuilder.INCREMENTAL_BUILD);
-                        build.doBuild();
-                    } else {
-                        // Only build what was cleaned
-                        IProject[] projects = new IProject[selection.length];
-                        for (int i = 0; i < selection.length; i++) {
-                            projects[i] = (IProject) selection[i];
-                        }
-
-                        ProjectSubsetBuildAction projectBuild =
-                            new ProjectSubsetBuildAction(window,
-                                IncrementalProjectBuilder.INCREMENTAL_BUILD,
-                                projects);
-                        projectBuild.runInBackground(
-                                ResourcesPlugin.getWorkspace().getRuleFactory().buildRule());
-                    }
-                }
-                return Status.OK_STATUS;
-            }
-        };
-        cleanJob.setRule(ResourcesPlugin.getWorkspace().getRuleFactory()
-                .buildRule());
-        cleanJob.setUser(true);
-        cleanJob.schedule();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.MessageDialog#createCustomArea(org.eclipse.swt.widgets.Composite)
-     */
-    protected Control createCustomArea(Composite parent) {
-        Composite area = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.marginWidth = layout.marginHeight = 0;
-        layout.numColumns = 2;
-        layout.makeColumnsEqualWidth = true;
-        area.setLayout(layout);
-        area.setLayoutData(new GridData(GridData.FILL_BOTH));
-        SelectionListener updateEnablement = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                updateEnablement();
-            }
-        };
-
-        IDialogSettings settings = getDialogSettings(DIALOG_SETTINGS_SECTION);
-        boolean selectSelectedButton= settings.getBoolean(TOGGLE_SELECTED);
-        //first row
-        allButton = new Button(area, SWT.RADIO);
-        allButton.setText(IDEWorkbenchMessages.CleanDialog_cleanAllButton);
-        allButton.setSelection(!selectSelectedButton);
-        allButton.addSelectionListener(updateEnablement);
-        selectedButton = new Button(area, SWT.RADIO);
-        selectedButton.setText(IDEWorkbenchMessages.CleanDialog_cleanSelectedButton);
-        selectedButton.setSelection(selectSelectedButton);
-        selectedButton.addSelectionListener(updateEnablement);
-
-        //second row
-        createProjectSelectionTable(area);
-        
-        //third row
-        //only prompt for immediate build if autobuild is off
-        if (!ResourcesPlugin.getWorkspace().isAutoBuilding()) {
-            buildNowButton = new Button(parent, SWT.CHECK);
-            buildNowButton.setText(IDEWorkbenchMessages.CleanDialog_buildNowButton);
-            String buildNow = settings.get(BUILD_NOW);
-            buildNowButton.setSelection(buildNow == null || Boolean.valueOf(buildNow).booleanValue());
-            buildNowButton.setLayoutData(new GridData(
-                    GridData.HORIZONTAL_ALIGN_BEGINNING));
-            buildNowButton.addSelectionListener(updateEnablement);
-
-            globalBuildButton = new Button(parent, SWT.RADIO);
-            globalBuildButton.setText(IDEWorkbenchMessages.CleanDialog_globalBuildButton);
-            String buildAll = settings.get(BUILD_ALL);
-            globalBuildButton.setSelection(buildAll == null || Boolean.valueOf(buildAll).booleanValue());
-            GridData data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-            data.horizontalIndent = 10;
-            globalBuildButton.setLayoutData(data);
-            globalBuildButton.setEnabled(buildNowButton.getSelection());
-
-            projectBuildButton = new Button(parent, SWT.RADIO);
-            projectBuildButton.setText(IDEWorkbenchMessages.CleanDialog_buildSelectedProjectsButton);
-            projectBuildButton.setSelection(!globalBuildButton.getSelection());
-            data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-            data.horizontalIndent = 10;
-            projectBuildButton.setLayoutData(data);
-            projectBuildButton.setEnabled(buildNowButton.getSelection());
-
-
-            SelectionListener buildRadioSelected = new SelectionAdapter() {
-                public void widgetSelected(SelectionEvent e) {
-                    updateBuildRadioEnablement();
-                }
-            };
-            globalBuildButton.addSelectionListener(buildRadioSelected);
-            projectBuildButton.addSelectionListener(buildRadioSelected);
-        }
-        projectNames.getTable().setEnabled(selectSelectedButton);
-        return area;
-    }
-
-    private void createProjectSelectionTable(Composite radioGroup) {
-        projectNames = CheckboxTableViewer.newCheckList(radioGroup, SWT.BORDER);
-        projectNames.setContentProvider(new WorkbenchContentProvider());
-        projectNames.setLabelProvider(new WorkbenchLabelProvider());
-        projectNames.setComparator(new ResourceComparator(ResourceComparator.NAME));
-        projectNames.addFilter(new ViewerFilter() {
-            private final IProject[] projectHolder = new IProject[1];
-            public boolean select(Viewer viewer, Object parentElement, Object element) {
-                if (!(element instanceof IProject)) {
-                    return false;
-                }
-                IProject project = (IProject) element;
-                if (!project.isAccessible()) {
-                    return false;
-                }
-                projectHolder[0] = project;
-                return BuildUtilities.isEnabled(projectHolder, IncrementalProjectBuilder.CLEAN_BUILD);
-            }
-        });
-        projectNames.setInput(ResourcesPlugin.getWorkspace().getRoot());
-        GridData data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 2;
-        data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-        data.heightHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-        projectNames.getTable().setLayoutData(data);
-        projectNames.setCheckedElements(selection);
-        //table is disabled to start because all button is selected
-        projectNames.getTable().setEnabled(selectedButton.getSelection());
-        projectNames.addCheckStateListener(new ICheckStateListener() {
-            public void checkStateChanged(CheckStateChangedEvent event) {
-                selection = projectNames.getCheckedElements();
-                updateEnablement();
-            }
-        });
-    }
-
-    /**
-     * Performs the actual clean operation.
-     * @param cleanAll if <code>true</true> clean all projects
-     * @param monitor The monitor that the build will report to
-     * @throws CoreException thrown if there is a problem from the
-     * core builder.
-     */
-    protected void doClean(boolean cleanAll, IProgressMonitor monitor)
-            throws CoreException {
-        if (cleanAll) {
-            ResourcesPlugin.getWorkspace().build(
-                    IncrementalProjectBuilder.CLEAN_BUILD, monitor);
-        } else {
-            try {
-                monitor.beginTask(IDEWorkbenchMessages.CleanDialog_cleanSelectedTaskName, selection.length);
-                for (int i = 0; i < selection.length; i++) {
-                    ((IProject) selection[i]).build(
-                            IncrementalProjectBuilder.CLEAN_BUILD,
-                            new SubProgressMonitor(monitor, 1));
-                }
-            } finally {
-                monitor.done();
-            }
-        }
-    }
-
-    /**
-     * Updates the enablement of the dialog's ok button based
-     * on the current choices in the dialog.
-     */
-    protected void updateEnablement() {
-        projectNames.getTable().setEnabled(selectedButton.getSelection());
-        boolean enabled = allButton.getSelection() || selection.length > 0;
-        getButton(OK).setEnabled(enabled);
-        if (globalBuildButton != null) {
-            globalBuildButton.setEnabled(buildNowButton.getSelection());
-        }
-        if (projectBuildButton != null) {
-            projectBuildButton.setEnabled(buildNowButton.getSelection());
-        }
-    }
-
-    /**
-     * Updates the enablement of the dialog's build selection radio
-     * buttons.
-     */
-    protected void updateBuildRadioEnablement() {
-        projectBuildButton.setSelection(!globalBuildButton.getSelection());
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.window.Window#close()
-     */
-    public boolean close() {
-        persistDialogSettings(getShell(), DIALOG_SETTINGS_SECTION);
-        return super.close();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.window.Window#getInitialLocation(org.eclipse.swt.graphics.Point)
-     */
-    protected Point getInitialLocation(Point initialSize) {
-        Point p = getInitialLocation(DIALOG_SETTINGS_SECTION);
-        return p != null ? p : super.getInitialLocation(initialSize);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.window.Window#getInitialSize()
-     */
-    protected Point getInitialSize() {
-        Point p = super.getInitialSize();
-        return getInitialSize(DIALOG_SETTINGS_SECTION, p);
-    }
-    
-    /**
-     * Returns the initial location which is persisted in the IDE Plugin dialog settings
-     * under the provided dialog setttings section name.
-     * If location is not persisted in the settings, the <code>null</code> is returned.
-     * 
-     * @param dialogSettingsSectionName The name of the dialog settings section
-     * @return The initial location or <code>null</code>
-     */
-    public Point getInitialLocation(String dialogSettingsSectionName) {
-        IDialogSettings settings = getDialogSettings(dialogSettingsSectionName);
-        try {
-            int x= settings.getInt(DIALOG_ORIGIN_X);
-            int y= settings.getInt(DIALOG_ORIGIN_Y);
-            return new Point(x,y);
-        } catch (NumberFormatException e) {
-        }
-        return null;
-    }
-    
-    private IDialogSettings getDialogSettings(String dialogSettingsSectionName) {
-        IDialogSettings settings = IDEWorkbenchPlugin.getDefault().getDialogSettings();
-        IDialogSettings section = settings.getSection(dialogSettingsSectionName);
-        if (section == null) {
-            section = settings.addNewSection(dialogSettingsSectionName);
-        }
-        return section;
-    }
-
-    /**
-     * Persists the location and dimensions of the shell and other user settings in the
-     * plugin's dialog settings under the provided dialog settings section name
-     * 
-     * @param shell The shell whose geometry is to be stored
-     * @param dialogSettingsSectionName The name of the dialog settings section
-     */
-    private void persistDialogSettings(Shell shell, String dialogSettingsSectionName) {
-        Point shellLocation = shell.getLocation();
-        Point shellSize = shell.getSize();
-        IDialogSettings settings = getDialogSettings(dialogSettingsSectionName);
-        settings.put(DIALOG_ORIGIN_X, shellLocation.x);
-        settings.put(DIALOG_ORIGIN_Y, shellLocation.y);
-        settings.put(DIALOG_WIDTH, shellSize.x);
-        settings.put(DIALOG_HEIGHT, shellSize.y);
-
-        if (buildNowButton != null) {
-            settings.put(BUILD_NOW, buildNowButton.getSelection());
-        }
-        if (globalBuildButton != null) {
-            settings.put(BUILD_ALL, globalBuildButton.getSelection());
-        }
-        settings.put(TOGGLE_SELECTED, selectedButton.getSelection());
-    }
-
-    /**
-     * Returns the initial size which is the larger of the <code>initialSize</code> or
-     * the size persisted in the IDE UI Plugin dialog settings under the provided dialog setttings section name.
-     * If no size is persisted in the settings, the <code>initialSize</code> is returned.
-     * 
-     * @param initialSize The initialSize to compare against
-     * @param dialogSettingsSectionName The name of the dialog settings section
-     * @return the initial size
-     */
-    private Point getInitialSize(String dialogSettingsSectionName, Point initialSize) {
-        IDialogSettings settings = getDialogSettings(dialogSettingsSectionName);
-        try {
-            int x, y;
-            x = settings.getInt(DIALOG_WIDTH);
-            y = settings.getInt(DIALOG_HEIGHT);
-            return new Point(Math.max(x, initialSize.x), Math.max(y, initialSize.y));
-        } catch (NumberFormatException e) {
-        }
-        return initialSize;
-    }
-    
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#isResizable()
-     */
-    protected boolean isResizable() {
-        return true;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ConfigurationLogUpdateSection.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ConfigurationLogUpdateSection.java
deleted file mode 100644
index 01e5ce4..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ConfigurationLogUpdateSection.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.io.PrintWriter;
-import java.text.DateFormat;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-import org.eclipse.equinox.internal.provisional.p2.engine.IProfile;
-import org.eclipse.equinox.internal.provisional.p2.engine.IProfileRegistry;
-import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit;
-import org.eclipse.equinox.internal.provisional.p2.metadata.query.InstallableUnitQuery;
-import org.eclipse.equinox.internal.provisional.p2.query.Collector;
-import org.eclipse.osgi.service.resolver.BundleDescription;
-import org.eclipse.osgi.service.resolver.PlatformAdmin;
-import org.eclipse.osgi.service.resolver.State;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.about.ISystemSummarySection;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Writes information about the update configurer into the system summary.
- * 
- * @since 3.0
- */
-public class ConfigurationLogUpdateSection implements ISystemSummarySection {
-
-	/*
-	 * Query the profile and print out the list of IUs which are installed.
-	 */
-	private void writeInstalledIUs(PrintWriter writer) {
-		BundleContext context = IDEWorkbenchPlugin.getDefault().getBundle().getBundleContext();
-		if (context == null)
-			return;
-
-		// Print out the list of IUs which are installed in the profile.
-		ServiceReference reference = context.getServiceReference(IProfileRegistry.class.getName());
-		if (reference == null)
-			return;
-		try {
-			IProfileRegistry registry = (IProfileRegistry) context.getService(reference);
-			if (registry == null)
-				return;
-			IProfile profile = registry.getProfile(IProfileRegistry.SELF);
-
-			writer.println(IDEWorkbenchMessages.ConfigurationLogUpdateSection_installConfiguration);
-			writer.println(" " + NLS.bind(IDEWorkbenchMessages.ConfigurationLogUpdateSection_lastChangedOn, DateFormat.getDateInstance().format(new Date(profile.getTimestamp())))); //$NON-NLS-1$
-			writer.println(" " + NLS.bind(IDEWorkbenchMessages.ConfigurationLogUpdateSection_location, profile.getProperty(IProfile.PROP_INSTALL_FOLDER))); //$NON-NLS-1$
-			writer.println(" " + NLS.bind(IDEWorkbenchMessages.ConfigurationLogUpdateSection_timestamp, Long.toString(profile.getTimestamp()))); //$NON-NLS-1$
-			writer.println();
-
-			// Since this code is only called in the Help -> About -> Configuration Details case we
-			// won't worry too much about performance here and we will sort the query results
-			// afterwards, but before printing them out.
-			Collector collector = profile.available(InstallableUnitQuery.ANY, new Collector(), null);
-			SortedSet sorted = new TreeSet();
-			for (Iterator iter = collector.iterator(); iter.hasNext();) {
-				IInstallableUnit unit = (IInstallableUnit) iter.next();
-				sorted.add(NLS.bind(IDEWorkbenchMessages.ConfigurationLogUpdateSection_IU, unit.getId(), unit.getVersion()));
-			}
-			if (!sorted.isEmpty()) {
-				writer.println(IDEWorkbenchMessages.ConfigurationLogUpdateSection_IUHeader);
-				writer.println();
-				for (Iterator iter = sorted.iterator(); iter.hasNext();)
-					writer.println(iter.next());
-			}
-		} finally {
-			context.ungetService(reference);
-		}
-	}
-
-	/*
-	 * Query OSGi and print out the list of known bundles.
-	 */
-	private void writeBundles(PrintWriter writer) {
-		BundleContext context = IDEWorkbenchPlugin.getDefault().getBundle().getBundleContext();
-		if (context == null)
-			return;
-		ServiceReference reference = context.getServiceReference(PlatformAdmin.class.getName());
-		if (reference == null)
-			return;
-		PlatformAdmin admin = (PlatformAdmin) context.getService(reference);
-		try {
-			State state = admin.getState(false);
-			BundleDescription[] bundles = state.getBundles();
-			// Since this code is only called in the Help -> About -> Configuration Details case we
-			// won't worry too much about performance here and we will sort the query results
-			// afterwards, but before printing them out.
-			SortedSet sorted = new TreeSet();
-			for (int i = 0; i < bundles.length; i++) {
-				BundleDescription bundle = bundles[i];
-				String name = bundle.getName();
-				if (name == null)
-					name = bundle.getLocation();
-				String message = NLS.bind(IDEWorkbenchMessages.ConfigurationLogUpdateSection_bundle, new Object[] {name, bundle.getVersion(), bundle.getLocation()});
-				sorted.add(message);
-			}
-			if (!sorted.isEmpty()) {
-				writer.println(IDEWorkbenchMessages.ConfigurationLogUpdateSection_bundleHeader);
-				writer.println();
-				for (Iterator iter = sorted.iterator(); iter.hasNext();)
-					writer.println(iter.next());
-			}
-		} finally {
-			context.ungetService(reference);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.about.ISystemSummarySection#write(java.io.PrintWriter)
-	 */
-	public void write(PrintWriter writer) {
-		writeInstalledIUs(writer);
-		writer.println();
-		writeBundles(writer);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/CreateLinkedResourceGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/CreateLinkedResourceGroup.java
deleted file mode 100644
index cfcb193..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/CreateLinkedResourceGroup.java
+++ /dev/null
@@ -1,636 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.filesystem.URIUtil;
-import org.eclipse.core.resources.IPathVariableManager;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-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.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-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.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-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.DirectoryDialog;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.ide.dialogs.PathVariableSelectionDialog;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.filesystem.FileSystemConfiguration;
-import org.eclipse.ui.internal.ide.filesystem.FileSystemSupportRegistry;
-
-/**
- * Widget group for specifying a linked file or folder target.
- * 
- * @since 2.1
- */
-public class CreateLinkedResourceGroup {
-	private Listener listener;
-
-	private String linkTarget = ""; //$NON-NLS-1$
-
-	private int type;
-
-	private boolean createLink = false;
-
-	// used to compute layout sizes
-	private FontMetrics fontMetrics;
-
-	// widgets
-	private Composite groupComposite;
-
-	private Text linkTargetField;
-
-	private Button browseButton;
-
-	private Button variablesButton;
-
-	private Label resolvedPathLabelText;
-
-	private Label resolvedPathLabelData;
-
-	private final IStringValue updatableResourceName;
-
-	/**
-	 * Helper interface intended for updating a string value based on the
-	 * currently selected link target.
-	 * 
-	 * @since 3.2
-	 */
-	public static interface IStringValue {
-		/**
-		 * Sets the String value.
-		 * 
-		 * @param string
-		 *            a non-null String
-		 */
-		void setValue(String string);
-
-		/**
-		 * Gets the String value.
-		 * 
-		 * @return the current value, or <code>null</code>
-		 */
-		String getValue();
-	}
-
-	private String lastUpdatedValue;
-
-	private FileSystemSelectionArea fileSystemSelectionArea;
-
-	/**
-	 * Creates a link target group
-	 * 
-	 * @param type
-	 *            specifies the type of resource to link to.
-	 *            <code>IResource.FILE</code> or <code>IResource.FOLDER</code>
-	 * @param listener
-	 *            listener to notify when one of the widgets' value is changed.
-	 * @param updatableResourceName
-	 *            an updatable string value that will be updated to reflect the
-	 *            link target's last segment, or <code>null</code>. Updating
-	 *            will only happen if the current value of that string is null
-	 *            or the empty string, or if it has not been changed since the
-	 *            last time it was updated.
-	 */
-	public CreateLinkedResourceGroup(int type, Listener listener,
-			IStringValue updatableResourceName) {
-		this.type = type;
-		this.listener = listener;
-		this.updatableResourceName = updatableResourceName;
-		if (updatableResourceName != null) {
-			lastUpdatedValue = updatableResourceName.getValue();
-		}
-	}
-
-	/**
-	 * Creates the widgets
-	 * 
-	 * @param parent
-	 *            parent composite of the widget group
-	 * @return the widget group
-	 */
-	public Composite createContents(Composite parent) {
-		Font font = parent.getFont();
-		initializeDialogUnits(parent);
-		// top level group
-		groupComposite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		groupComposite.setLayout(layout);
-		groupComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
-				| GridData.FILL_HORIZONTAL));
-		groupComposite.setFont(font);
-
-		final Button createLinkButton = new Button(groupComposite, SWT.CHECK);
-		if (type == IResource.FILE) {
-			createLinkButton
-					.setText(IDEWorkbenchMessages.CreateLinkedResourceGroup_linkFileButton);
-		} else {
-			createLinkButton
-					.setText(IDEWorkbenchMessages.CreateLinkedResourceGroup_linkFolderButton);
-		}
-		createLinkButton.setSelection(createLink);
-		createLinkButton.setFont(font);
-		SelectionListener selectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				createLink = createLinkButton.getSelection();
-				browseButton.setEnabled(createLink);
-				variablesButton.setEnabled(createLink);
-				// Set the required field color if the field is enabled
-				linkTargetField.setEnabled(createLink);
-				if (fileSystemSelectionArea != null)
-					fileSystemSelectionArea.setEnabled(createLink);
-
-				if (listener != null) {
-					listener.handleEvent(new Event());
-				}
-			}
-		};
-		createLinkButton.addSelectionListener(selectionListener);
-
-		createLinkLocationGroup(groupComposite, createLink);
-		return groupComposite;
-	}
-
-	/**
-	 * Creates the link target location widgets.
-	 * 
-	 * @param locationGroup
-	 *            the parent composite
-	 * @param enabled
-	 *            sets the initial enabled state of the widgets
-	 */
-	private void createLinkLocationGroup(Composite locationGroup,
-			boolean enabled) {
-		Button button = new Button(locationGroup, SWT.CHECK);
-		int indent = button.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
-
-		button.dispose();
-
-		// linkTargetGroup is necessary to decouple layout from
-		// resolvedPathGroup layout
-		Composite linkTargetGroup = new Composite(locationGroup, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 4;
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		linkTargetGroup.setLayout(layout);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalIndent = indent;
-		linkTargetGroup.setLayoutData(data);
-
-		// link target location entry field
-		linkTargetField = new Text(linkTargetGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-		data.horizontalSpan = 2;
-		linkTargetField.setLayoutData(data);
-		linkTargetField.setEnabled(enabled);
-		linkTargetField.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				linkTarget = linkTargetField.getText();
-				resolveVariable();
-				if (updatableResourceName != null) {
-					String value = updatableResourceName.getValue();
-					if (value == null
-							|| value.equals("") || value.equals(lastUpdatedValue)) { //$NON-NLS-1$
-						IPath linkTargetPath = new Path(linkTarget);
-						String lastSegment = linkTargetPath.lastSegment();
-						if (lastSegment != null) {
-							lastUpdatedValue = lastSegment;
-							updatableResourceName.setValue(lastSegment);
-						}
-					}
-				}
-				if (listener != null) {
-					listener.handleEvent(new Event());
-				}
-			}
-		});
-
-		// browse button
-		browseButton = new Button(linkTargetGroup, SWT.PUSH);
-		browseButton
-				.setText(IDEWorkbenchMessages.CreateLinkedResourceGroup_browseButton);
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				handleLinkTargetBrowseButtonPressed();
-			}
-		});
-		browseButton.setEnabled(enabled);
-		setButtonLayoutData(browseButton);
-
-		// variables button
-		variablesButton = new Button(linkTargetGroup, SWT.PUSH);
-		variablesButton
-				.setText(IDEWorkbenchMessages.CreateLinkedResourceGroup_variablesButton);
-		variablesButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				handleVariablesButtonPressed();
-			}
-		});
-		variablesButton.setEnabled(enabled);
-		setButtonLayoutData(variablesButton);
-
-		createFileSystemSelection(linkTargetGroup, enabled);
-
-		createResolvedPathGroup(locationGroup, indent);
-
-		if (linkTarget != null) {
-			linkTargetField.setText(linkTarget);
-		}
-	}
-
-	/**
-	 * Create the file system selection area.
-	 * 
-	 * @param composite
-	 * @param enabled
-	 *            the initial enablement state.
-	 */
-	private void createFileSystemSelection(Composite composite, boolean enabled) {
-
-		// Always use the default if that is all there is.
-		if (FileSystemSupportRegistry.getInstance().hasOneFileSystem()) {
-			return;
-		}
-
-		fileSystemSelectionArea = new FileSystemSelectionArea();
-		fileSystemSelectionArea.createContents(composite);
-		fileSystemSelectionArea.setEnabled(enabled);
-	}
-
-	/**
-	 * Create the composite for the resolved path.
-	 * 
-	 * @param locationGroup
-	 * @param indent
-	 */
-	private void createResolvedPathGroup(Composite locationGroup, int indent) {
-		GridLayout layout;
-		GridData data;
-		Composite resolvedPathGroup = new Composite(locationGroup, SWT.NONE);
-		layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		resolvedPathGroup.setLayout(layout);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalIndent = indent;
-		resolvedPathGroup.setLayoutData(data);
-
-		resolvedPathLabelText = new Label(resolvedPathGroup, SWT.SINGLE);
-		resolvedPathLabelText
-				.setText(IDEWorkbenchMessages.CreateLinkedResourceGroup_resolvedPathLabel);
-		resolvedPathLabelText.setVisible(false);
-
-		resolvedPathLabelData = new Label(resolvedPathGroup, SWT.SINGLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		resolvedPathLabelData.setLayoutData(data);
-		resolvedPathLabelData.setVisible(false);
-	}
-
-	/**
-	 * Returns a new status object with the given severity and message.
-	 * 
-	 * @return a new status object with the given severity and message.
-	 */
-	private IStatus createStatus(int severity, String message) {
-		return new Status(severity, IDEWorkbenchPlugin.getDefault().getBundle()
-				.getSymbolicName(), severity, message, null);
-	}
-
-	/**
-	 * Disposes the group's widgets.
-	 */
-	public void dispose() {
-		if (groupComposite != null && groupComposite.isDisposed() == false) {
-			groupComposite.dispose();
-		}
-	}
-
-	/**
-	 * Returns the link target location entered by the user.
-	 * 
-	 * @return the link target location entered by the user. null if the user
-	 *         chose not to create a link.
-	 */
-	public URI getLinkTargetURI() {
-		if (!createLink)
-			return null;
-		// resolve path variable if we have a relative path
-		if (!linkTarget.startsWith("/")) { //$NON-NLS-1$
-			IPathVariableManager pathVariableManager = ResourcesPlugin
-					.getWorkspace().getPathVariableManager();
-			try {
-				
-				URI path = new URI(linkTarget.replace(java.io.File.separatorChar, '/'));
-				URI resolved = pathVariableManager.resolveURI(path);
-				if (path != resolved) {
-					// we know this is a path variable, but return unresolved
-					// path so resource will be created with variable intact
-					return path;
-				}
-			} catch (URISyntaxException e) {
-				// link target is not a valid URI. Fall through to handle this
-				// below
-			}
-		}
-
-		FileSystemConfiguration configuration = getSelectedConfiguration();
-		if (configuration == null) {
-			return URIUtil.toURI(linkTarget);
-		}
-		// validate non-local file system location
-		return configuration.getContributor().getURI(linkTarget);
-	}
-
-	/**
-	 * Opens a file or directory browser depending on the link type.
-	 */
-	private void handleLinkTargetBrowseButtonPressed() {
-		IFileStore store = null;
-		String selection = null;
-		FileSystemConfiguration config = getSelectedConfiguration();
-		boolean isDefault = config == null
-				|| (FileSystemSupportRegistry.getInstance()
-						.getDefaultConfiguration()).equals(config);
-
-		if (linkTarget.length() > 0) {
-			store = IDEResourceInfoUtils.getFileStore(linkTarget);
-			if (!store.fetchInfo().exists()) {
-				store = null;
-			}
-		}
-		if (type == IResource.FILE) {
-			if (isDefault) {
-				FileDialog dialog = new FileDialog(linkTargetField.getShell());
-				dialog.setText(IDEWorkbenchMessages.CreateLinkedResourceGroup_targetSelectionTitle);
-				if (store != null) {
-					if (store.fetchInfo().isDirectory()) {
-						dialog.setFilterPath(linkTarget);
-					} else {
-						dialog.setFileName(linkTarget);
-					}
-				}
-				selection = dialog.open();
-			} else {
-				URI uri = config.getContributor().browseFileSystem(linkTarget,
-						linkTargetField.getShell());
-				if (uri != null)
-					selection = uri.toString();
-			}
-		} else {
-			String filterPath = null;
-			if (store != null) {
-				IFileStore path = store;
-				if (!store.fetchInfo().isDirectory()) {
-					path = store.getParent();
-				}
-				if (path != null) {
-					filterPath = store.toString();
-				}
-			}
-
-			if (isDefault) {
-				DirectoryDialog dialog = new DirectoryDialog(linkTargetField
-						.getShell());
-				dialog
-						.setMessage(IDEWorkbenchMessages.CreateLinkedResourceGroup_targetSelectionLabel);
-				if (filterPath != null)
-					dialog.setFilterPath(filterPath);
-				selection = dialog.open();
-			} else {
-				String initialPath = IDEResourceInfoUtils.EMPTY_STRING;
-				if (filterPath != null)
-					initialPath = filterPath;
-				URI uri = config.getContributor().browseFileSystem(initialPath,
-						linkTargetField.getShell());
-				if (uri != null)
-					selection = uri.toString();
-			}
-		}
-		if (selection != null) {
-			linkTargetField.setText(selection);
-		}
-	}
-
-	/**
-	 * Return the selected configuration or <code>null</code> if there is not
-	 * one selected.
-	 * 
-	 * @return FileSystemConfiguration or <code>null</code>
-	 */
-	private FileSystemConfiguration getSelectedConfiguration() {
-		if (fileSystemSelectionArea == null)
-			return null;
-		return fileSystemSelectionArea.getSelectedConfiguration();
-	}
-
-	/**
-	 * Opens a path variable selection dialog
-	 */
-	private void handleVariablesButtonPressed() {
-		int variableTypes = IResource.FOLDER;
-
-		// allow selecting file and folder variables when creating a
-		// linked file
-		if (type == IResource.FILE) {
-			variableTypes |= IResource.FILE;
-		}
-
-		PathVariableSelectionDialog dialog = new PathVariableSelectionDialog(
-				linkTargetField.getShell(), variableTypes);
-		if (dialog.open() == IDialogConstants.OK_ID) {
-			String[] variableNames = (String[]) dialog.getResult();
-			if (variableNames != null && variableNames.length == 1) {
-				linkTargetField.setText(variableNames[0]);
-			}
-		}
-	}
-
-	/**
-	 * Initializes the computation of horizontal and vertical dialog units based
-	 * on the size of current font.
-	 * <p>
-	 * This method must be called before <code>setButtonLayoutData</code> is
-	 * called.
-	 * </p>
-	 * 
-	 * @param control
-	 *            a control from which to obtain the current font
-	 */
-	protected void initializeDialogUnits(Control control) {
-		// Compute and store a font metric
-		GC gc = new GC(control);
-		gc.setFont(control.getFont());
-		fontMetrics = gc.getFontMetrics();
-		gc.dispose();
-	}
-
-	/**
-	 * Tries to resolve the value entered in the link target field as a
-	 * variable, if the value is a relative path. Displays the resolved value if
-	 * the entered value is a variable.
-	 */
-	private void resolveVariable() {
-		IPathVariableManager pathVariableManager = ResourcesPlugin
-				.getWorkspace().getPathVariableManager();
-		IPath path = new Path(linkTarget);
-		IPath resolvedPath = pathVariableManager.resolvePath(path);
-
-		if (path.equals(resolvedPath)) {
-			resolvedPathLabelText.setVisible(false);
-			resolvedPathLabelData.setVisible(false);
-		} else {
-			resolvedPathLabelText.setVisible(true);
-			resolvedPathLabelData.setVisible(true);
-		}
-		resolvedPathLabelData.setText(resolvedPath.toOSString());
-	}
-
-	/**
-	 * Sets the <code>GridData</code> on the specified button to be one that
-	 * is spaced for the current dialog page units. The method
-	 * <code>initializeDialogUnits</code> must be called once before calling
-	 * this method for the first time.
-	 * 
-	 * @param button
-	 *            the button to set the <code>GridData</code>
-	 * @return the <code>GridData</code> set on the specified button
-	 */
-	private GridData setButtonLayoutData(Button button) {
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		int widthHint = Dialog.convertHorizontalDLUsToPixels(fontMetrics,
-				IDialogConstants.BUTTON_WIDTH);
-		data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT,
-				SWT.DEFAULT, true).x);
-		button.setLayoutData(data);
-		return data;
-	}
-
-	/**
-	 * Sets the value of the link target field
-	 * 
-	 * @param target
-	 *            the value of the link target field
-	 */
-	public void setLinkTarget(String target) {
-		linkTarget = target;
-		if (linkTargetField != null && linkTargetField.isDisposed() == false) {
-			linkTargetField.setText(target);
-		}
-	}
-
-	/**
-	 * Validates the type of the given file against the link type specified in
-	 * the constructor.
-	 * 
-	 * @param linkTargetFile
-	 *            file to validate
-	 * @return IStatus indicating the validation result. IStatus.OK if the given
-	 *         file is valid.
-	 */
-	private IStatus validateFileType(IFileInfo linkTargetFile) {
-		if (type == IResource.FILE && linkTargetFile.isDirectory()) {
-			return createStatus(
-					IStatus.ERROR,
-					IDEWorkbenchMessages.CreateLinkedResourceGroup_linkTargetNotFile);
-		} else if (type == IResource.FOLDER && !linkTargetFile.isDirectory()) {
-			return createStatus(
-					IStatus.ERROR,
-					IDEWorkbenchMessages.CreateLinkedResourceGroup_linkTargetNotFolder);
-		}
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Validates this page's controls.
-	 * 
-	 * @param linkHandle
-	 *            The target to check
-	 * 
-	 * @return IStatus indicating the validation result. IStatus.OK if the
-	 *         specified link target is valid given the linkHandle.
-	 */
-	public IStatus validateLinkLocation(IResource linkHandle) {
-		if (linkTargetField == null || linkTargetField.isDisposed()
-				|| !createLink) {
-			return Status.OK_STATUS;
-		}
-		IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace();
-		FileSystemConfiguration configuration = getSelectedConfiguration();
-		if (configuration == null
-				|| EFS.SCHEME_FILE.equals(configuration.getScheme())) {
-			// Special handling for UNC paths. See bug 90825
-			IPath location = new Path(linkTarget);
-			if (location.isUNC()) {
-				return createStatus(
-						IStatus.WARNING,
-						IDEWorkbenchMessages.CreateLinkedResourceGroup_unableToValidateLinkTarget);
-			}
-		}
-		URI locationURI = getLinkTargetURI();
-		if (locationURI == null) {
-			return createStatus(
-					IStatus.WARNING,
-					IDEWorkbenchMessages.CreateLinkedResourceGroup_unableToValidateLinkTarget);
-		}
-		IStatus locationStatus = workspace.validateLinkLocationURI(linkHandle,
-				locationURI);
-		if (locationStatus.getSeverity() == IStatus.ERROR || linkTarget.trim().equals("")) { //$NON-NLS-1$
-			return locationStatus;
-		}
-
-		// use the resolved link target name
-		URI resolved = workspace.getPathVariableManager().resolveURI(
-				locationURI);
-		IFileInfo linkTargetFile = IDEResourceInfoUtils.getFileInfo(resolved);
-		if (linkTargetFile != null && linkTargetFile.exists()) {
-			IStatus fileTypeStatus = validateFileType(linkTargetFile);
-			if (!fileTypeStatus.isOK()) {
-				return fileTypeStatus;
-			}
-		} else if (locationStatus.isOK()) {
-			// locationStatus takes precedence over missing location warning.
-			return createStatus(
-					IStatus.WARNING,
-					IDEWorkbenchMessages.CreateLinkedResourceGroup_linkTargetNonExistent);
-		}
-		return locationStatus;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/FileFolderSelectionDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/FileFolderSelectionDialog.java
deleted file mode 100644
index 4ce7e00..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/FileFolderSelectionDialog.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
-import org.eclipse.ui.dialogs.ISelectionStatusValidator;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * Selection dialog to select files and/or folders on the file system. Use
- * setInput to set input to an IFileStore that points to a folder.
- * 
- * @since 2.1
- */
-public class FileFolderSelectionDialog extends ElementTreeSelectionDialog {
-
-	/**
-	 * Label provider for IFileStore objects.
-	 */
-	private static class FileLabelProvider extends LabelProvider {
-		private static final Image IMG_FOLDER = PlatformUI.getWorkbench()
-				.getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
-
-		private static final Image IMG_FILE = PlatformUI.getWorkbench()
-				.getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE);
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
-		 */
-		public Image getImage(Object element) {
-			if (element instanceof IFileStore) {
-				IFileStore curr = (IFileStore) element;
-				if (curr.fetchInfo().isDirectory()) {
-					return IMG_FOLDER;
-				}
-				return IMG_FILE;
-			}
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
-		 */
-		public String getText(Object element) {
-			if (element instanceof IFileStore) {
-				return ((IFileStore) element).getName();
-			}
-			return super.getText(element);
-		}
-	}
-
-	/**
-	 * Content provider for IFileStore objects.
-	 */
-	private static class FileContentProvider implements ITreeContentProvider {
-		private static final Object[] EMPTY = new Object[0];
-
-		private IFileStoreFilter fileFilter;
-
-		/**
-		 * Creates a new instance of the receiver.
-		 * 
-		 * @param showFiles
-		 *            <code>true</code> files and folders are returned by the
-		 *            receiver. <code>false</code> only folders are returned.
-		 */
-		public FileContentProvider(final boolean showFiles) {
-			fileFilter = new IFileStoreFilter() {
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.ui.internal.ide.dialogs.IFileStoreFilter#accept(org.eclipse.core.filesystem.IFileStore)
-				 */
-				public boolean accept(IFileStore file) {
-					if (!file.fetchInfo().isDirectory() && showFiles == false) {
-						return false;
-					}
-					return true;
-				}
-			};
-		}
-
-		public Object[] getChildren(Object parentElement) {
-			if (parentElement instanceof IFileStore) {
-				IFileStore[] children = IDEResourceInfoUtils.listFileStores(
-						(IFileStore) parentElement, fileFilter,
-						new NullProgressMonitor());
-				if (children != null) {
-					return children;
-				}
-			}
-			return EMPTY;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			if (element instanceof IFileStore) {
-				return ((IFileStore) element).getParent();
-			}
-			return null;
-		}
-
-		public boolean hasChildren(Object element) {
-			return getChildren(element).length > 0;
-		}
-
-		public Object[] getElements(Object element) {
-			return getChildren(element);
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-	}
-
-	/**
-	 * Viewer sorter that places folders first, then files.
-	 */
-	private static class FileViewerSorter extends ViewerComparator {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ViewerSorter#category(java.lang.Object)
-		 */
-		public int category(Object element) {
-			if (element instanceof IFileStore
-					&& !((IFileStore) element).fetchInfo().isDirectory()) {
-				return 1;
-			}
-			return 0;
-		}
-	}
-
-	/**
-	 * Validates the selection based on the multi select and folder setting.
-	 */
-	private static class FileSelectionValidator implements
-			ISelectionStatusValidator {
-		private boolean multiSelect;
-
-		private boolean acceptFolders;
-
-		/**
-		 * Creates a new instance of the receiver.
-		 * 
-		 * @param multiSelect
-		 *            <code>true</code> if multi selection is allowed.
-		 *            <code>false</code> if only single selection is allowed.
-		 * @param acceptFolders
-		 *            <code>true</code> if folders can be selected in the
-		 *            dialog. <code>false</code> only files and be selected.
-		 */
-		public FileSelectionValidator(boolean multiSelect, boolean acceptFolders) {
-			this.multiSelect = multiSelect;
-			this.acceptFolders = acceptFolders;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.dialogs.ISelectionStatusValidator#validate(java.lang.Object[])
-		 */
-		public IStatus validate(Object[] selection) {
-			int nSelected = selection.length;
-			String pluginId = IDEWorkbenchPlugin.IDE_WORKBENCH;
-
-			if (nSelected == 0 || (nSelected > 1 && multiSelect == false)) {
-				return new Status(IStatus.ERROR, pluginId, IStatus.ERROR,
-						IDEResourceInfoUtils.EMPTY_STRING, null);
-			}
-			for (int i = 0; i < selection.length; i++) {
-				Object curr = selection[i];
-				if (curr instanceof IFileStore) {
-					IFileStore file = (IFileStore) curr;
-					if (acceptFolders == false
-							&& file.fetchInfo().isDirectory()) {
-						return new Status(IStatus.ERROR, pluginId,
-								IStatus.ERROR,
-								IDEResourceInfoUtils.EMPTY_STRING, null);
-					}
-
-				}
-			}
-			return Status.OK_STATUS;
-		}
-	}
-
-	/**
-	 * Creates a new instance of the receiver.
-	 * 
-	 * @param parent
-	 * @param multiSelect
-	 *            <code>true</code> if multi selection is allowed.
-	 *            <code>false</code> if only single selection is allowed.
-	 * @param type
-	 *            one or both of <code>IResource.FILE</code> and
-	 *            <code>IResource.FOLDER</code>, ORed together. If
-	 *            <code>IResource.FILE</code> is specified files and folders
-	 *            are displayed in the dialog. Otherwise only folders are
-	 *            displayed. If <code>IResource.FOLDER</code> is specified
-	 *            folders can be selected in addition to files.
-	 */
-	public FileFolderSelectionDialog(Shell parent, boolean multiSelect, int type) {
-		super(parent, new FileLabelProvider(), new FileContentProvider(
-				(type & IResource.FILE) != 0));
-		setComparator(new FileViewerSorter());
-		setValidator(new FileSelectionValidator(multiSelect,
-				(type & IResource.FOLDER) != 0));
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/FileStatesPage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/FileStatesPage.java
deleted file mode 100644
index 36a0667..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/FileStatesPage.java
+++ /dev/null
@@ -1,349 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import com.ibm.icu.text.MessageFormat;
-
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.osgi.util.NLS;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-
-/**
- * The FileStatesPage is the page used to set the file states sizes for the workbench.
- */
-public class FileStatesPage extends PreferencePage implements
-        IWorkbenchPreferencePage, Listener {
-
-	private static final int FAILED_VALUE = -1;
-
-    //Set the length of the day as we have to convert back and forth
-    private static final long DAY_LENGTH = 86400000;
-
-    private static final long MEGABYTES = 1024 * 1024;
-
-    private Text longevityText;
-
-    private Text maxStatesText;
-
-    private Text maxStateSizeText;
-
-    //Choose a maximum to prevent OutOfMemoryErrors
-    private int FILE_STATES_MAXIMUM = 10000;
-
-    private long STATE_SIZE_MAXIMUM = 100;
-
-    /**
-     * This method takes the string for the title of a text field and the value for the
-     * text of the field.
-     * @return org.eclipse.swt.widgets.Text
-     * @param labelString java.lang.String
-     * @param textValue java.lang.String
-     * @param parent Composite 
-     */
-    private Text addLabelAndText(String labelString, String textValue,
-            Composite parent) {
-        Label label = new Label(parent, SWT.LEFT);
-        label.setText(labelString);
-
-        Text text = new Text(parent, SWT.LEFT | SWT.BORDER);
-        GridData data = new GridData();
-        text.addListener(SWT.Modify, this);
-        data.horizontalAlignment = GridData.FILL;
-        data.grabExcessHorizontalSpace = true;
-        data.verticalAlignment = GridData.CENTER;
-        data.grabExcessVerticalSpace = false;
-        text.setLayoutData(data);
-        text.setText(textValue);
-        return text;
-    }
-
-    /**
-     * Recomputes the page's error state by validating all
-     * the fields.
-     */
-    private void checkState() {
-        // Assume invalid if the controls not created yet
-        if (longevityText == null || maxStatesText == null
-                || maxStateSizeText == null) {
-            setValid(false);
-            return;
-        }
-
-        if (validateLongTextEntry(longevityText) == FAILED_VALUE) {
-            setValid(false);
-            return;
-        }
-
-        if (validateMaxFileStates() == FAILED_VALUE) {
-            setValid(false);
-            return;
-        }
-
-        if (validateMaxFileStateSize() == FAILED_VALUE) {
-            setValid(false);
-            return;
-        }
-
-        setValid(true);
-        setErrorMessage(null);
-    }
-
-    /* 
-     * Create the contents control for the workspace file states.
-     * @returns Control
-     * @param parent Composite
-     */
-    protected Control createContents(Composite parent) {
-
-    	PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
-                IIDEHelpContextIds.FILE_STATES_PREFERENCE_PAGE);
-
-        // button group
-        Composite composite = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        composite.setLayout(layout);
-
-        IWorkspaceDescription description = getWorkspaceDescription();
-
-        //Get the current value and make sure we get at least one day out of it.
-        long days = description.getFileStateLongevity() / DAY_LENGTH;
-        if (days < 1) {
-			days = 1;
-		}
-
-        long megabytes = description.getMaxFileStateSize() / MEGABYTES;
-        if (megabytes < 1) {
-			megabytes = 1;
-		}
-
-        this.longevityText = addLabelAndText(IDEWorkbenchMessages.FileHistory_longevity, String
-                .valueOf(days), composite);
-        this.maxStatesText = addLabelAndText(IDEWorkbenchMessages.FileHistory_entries, String
-                .valueOf(description.getMaxFileStates()), composite);
-        this.maxStateSizeText = addLabelAndText(IDEWorkbenchMessages.FileHistory_diskSpace,
-                String.valueOf(megabytes), composite);
-
-        checkState();
-
-        //Create a spacing label to breakup the note from the fields
-        Label spacer = new Label(composite, SWT.NONE);
-        GridData spacerData = new GridData();
-        spacerData.horizontalSpan = 2;
-        spacer.setLayoutData(spacerData);
-
-        Composite noteComposite = createNoteComposite(parent.getFont(),
-                composite, IDEWorkbenchMessages.Preference_note, IDEWorkbenchMessages.FileHistory_restartNote);
-        GridData noteData = new GridData();
-        noteData.horizontalSpan = 2;
-        noteComposite.setLayoutData(noteData);
-
-        applyDialogFont(composite);
-
-        return composite;
-    }
-
-    /**
-     * Get the Workspace Description this page is operating on.
-     * @return org.eclipse.core.resources.IWorkspaceDescription
-     */
-    private IWorkspaceDescription getWorkspaceDescription() {
-        return ResourcesPlugin.getWorkspace().getDescription();
-    }
-
-    /**
-     * Sent when an event that the receiver has registered for occurs.
-     *
-     * @param event the event which occurred
-     */
-    public void handleEvent(Event event) {
-        checkState();
-    }
-
-    /**
-     * Initializes this preference page for the given workbench.
-     * <p>
-     * This method is called automatically as the preference page is being created
-     * and initialized. Clients must not call this method.
-     * </p>
-     *
-     * @param workbench the workbench
-     */
-    public void init(org.eclipse.ui.IWorkbench workbench) {
-    }
-
-    /**
-     * Performs special processing when this page's Defaults button has been pressed.
-     * Reset the entries to thier default values.
-     */
-    protected void performDefaults() {
-        super.performDefaults();
-
-        Preferences prefs = ResourcesPlugin.getPlugin().getPluginPreferences();
-
-        long days = prefs
-                .getDefaultLong(ResourcesPlugin.PREF_FILE_STATE_LONGEVITY)
-                / DAY_LENGTH;
-        long megabytes = prefs
-                .getDefaultLong(ResourcesPlugin.PREF_MAX_FILE_STATE_SIZE)
-                / MEGABYTES;
-        this.longevityText.setText(String.valueOf(days));
-        this.maxStatesText.setText(prefs
-                .getDefaultString(ResourcesPlugin.PREF_MAX_FILE_STATES));
-        this.maxStateSizeText.setText(String.valueOf(megabytes));
-        checkState();
-    }
-
-    /** 
-     * Perform the result of the OK from the receiver.
-     */
-    public boolean performOk() {
-
-        long longevityValue = validateLongTextEntry(longevityText);
-        int maxFileStates = validateMaxFileStates();
-        long maxStateSize = validateMaxFileStateSize();
-        if (longevityValue == FAILED_VALUE || maxFileStates == FAILED_VALUE
-                || maxStateSize == FAILED_VALUE) {
-			return false;
-		}
-
-        IWorkspaceDescription description = getWorkspaceDescription();
-        description.setFileStateLongevity(longevityValue * DAY_LENGTH);
-        description.setMaxFileStates(maxFileStates);
-        description.setMaxFileStateSize(maxStateSize * MEGABYTES);
-
-        try {
-            //As it is only a copy save it back in
-            ResourcesPlugin.getWorkspace().setDescription(description);
-        } catch (CoreException exception) {
-            ErrorDialog.openError(getShell(), IDEWorkbenchMessages.FileHistory_exceptionSaving, exception
-                    .getMessage(), exception.getStatus());
-            return false;
-        }
-
-        return true;
-
-    }
-
-    /**
-     * Validate a text entry for an integer field. Return the result if there are
-     * no errors, otherwise return -1 and set the entry field error. 
-     * @return int
-     */
-    private int validateIntegerTextEntry(Text text) {
-
-        int value;
-
-        try {
-            value = Integer.parseInt(text.getText());
-
-        } catch (NumberFormatException exception) {
-            setErrorMessage(MessageFormat.format(IDEWorkbenchMessages.FileHistory_invalid,
-                    new Object[] { exception.getLocalizedMessage() }));
-            return FAILED_VALUE;
-        }
-
-        //Be sure all values are non zero and positive
-        if (value <= 0) {
-            setErrorMessage(IDEWorkbenchMessages.FileHistory_mustBePositive);
-            return FAILED_VALUE;
-        }
-
-        return value;
-    }
-
-    /**
-     * Validate a text entry for a long field. Return the result if there are
-     * no errors, otherwise return -1 and set the entry field error. 
-     * @return long
-     */
-    private long validateLongTextEntry(Text text) {
-
-        long value;
-
-        try {
-            value = Long.parseLong(text.getText());
-
-        } catch (NumberFormatException exception) {
-            setErrorMessage(MessageFormat.format(IDEWorkbenchMessages.FileHistory_invalid,
-                    new Object[] { exception.getLocalizedMessage() }));
-            return FAILED_VALUE;
-        }
-
-        //Be sure all values are non zero and positive
-        if (value <= 0) {
-            setErrorMessage(IDEWorkbenchMessages.FileHistory_mustBePositive);
-            return FAILED_VALUE;
-        }
-
-        return value;
-    }
-
-    /**
-     * Validate the maximum file states.
-     * Return the value if successful, otherwise
-     * return FAILED_VALUE.
-     * Set the error message if it fails.
-     * @return int
-     */
-    private int validateMaxFileStates() {
-        int maxFileStates = validateIntegerTextEntry(this.maxStatesText);
-        if (maxFileStates == FAILED_VALUE) {
-			return maxFileStates;
-		}
-
-        if (maxFileStates > FILE_STATES_MAXIMUM) {
-            setErrorMessage(NLS.bind(IDEWorkbenchMessages.FileHistory_aboveMaxEntries, String.valueOf(FILE_STATES_MAXIMUM)));
-            return FAILED_VALUE;
-        }
-
-        return maxFileStates;
-    }
-
-    /**
-     * Validate the maximum file state size.
-     * Return the value if successful, otherwise
-     * return FAILED_VALUE.
-     * Set the error message if it fails.
-     * @return long
-     */
-    private long validateMaxFileStateSize() {
-        long maxFileStateSize = validateLongTextEntry(this.maxStateSizeText);
-        if (maxFileStateSize == FAILED_VALUE) {
-			return maxFileStateSize;
-		}
-
-        if (maxFileStateSize > STATE_SIZE_MAXIMUM) {
-            setErrorMessage(NLS.bind(IDEWorkbenchMessages.FileHistory_aboveMaxFileSize, String.valueOf(STATE_SIZE_MAXIMUM)));
-            return FAILED_VALUE;
-        }
-
-        return maxFileStateSize;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/FileSystemSelectionArea.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/FileSystemSelectionArea.java
deleted file mode 100644
index 4b79c33..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/FileSystemSelectionArea.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.ide.dialogs;
-
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.internal.ide.filesystem.FileSystemConfiguration;
-import org.eclipse.ui.internal.ide.filesystem.FileSystemMessages;
-import org.eclipse.ui.internal.ide.filesystem.FileSystemSupportRegistry;
-
-/**
- * FileSystemSelectionArea is the area used to select the file system.
- * @since 3.2
- * 
- */
-
-public class FileSystemSelectionArea {
-
-	private Label fileSystemTitle;
-	private ComboViewer fileSystems;
-	
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public FileSystemSelectionArea(){
-		
-	}
-
-	/**
-	 * Create the contents of the receiver in composite.
-	 * @param composite
-	 */
-	public void createContents(Composite composite) {
-
-		fileSystemTitle = new Label(composite, SWT.NONE);
-		fileSystemTitle.setText(FileSystemMessages.FileSystemSelection_title);
-
-		fileSystems = new ComboViewer(composite, SWT.READ_ONLY);
-
-		fileSystems.getControl().setLayoutData(
-				new GridData(GridData.FILL_HORIZONTAL
-						| GridData.GRAB_HORIZONTAL));
-
-		fileSystems.setLabelProvider(new LabelProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
-			 */
-			public String getText(Object element) {
-				return ((FileSystemConfiguration) element).getLabel();
-			}
-		});
-
-		fileSystems.setContentProvider(new IStructuredContentProvider() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-				// Nothing to do
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				return FileSystemSupportRegistry.getInstance()
-						.getConfigurations();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(org.eclipse.jface.viewers.Viewer viewer,
-					Object oldInput, Object newInput) {
-				// Nothing to do
-			}
-
-		});
-
-		fileSystems.setInput(this);
-		fileSystems.setSelection(new StructuredSelection(
-				FileSystemSupportRegistry.getInstance()
-						.getDefaultConfiguration()));
-	}
-
-	/**
-	 * Return the selected configuration.
-	 * @return FileSystemConfiguration or <code>null</code> if nothing
-	 * is selected.
-	 */
-	public FileSystemConfiguration getSelectedConfiguration() {
-		ISelection selection = fileSystems.getSelection();
-		
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structured = (IStructuredSelection) selection;
-			if (structured.size() == 1) {
-				return (FileSystemConfiguration) structured.getFirstElement();
-			}
-		}
-		
-		return null;
-	}
-
-	/**
-	 * Set the enablement state of the widget.
-	 * @param enabled
-	 */
-	public void setEnabled(boolean enabled) {
-		fileSystemTitle.setEnabled(enabled);
-		fileSystems.getControl().setEnabled(enabled);
-		
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEEditorsPreferencePage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEEditorsPreferencePage.java
deleted file mode 100644
index 1b5efe2..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEEditorsPreferencePage.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-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.ui.dialogs.PreferenceLinkArea;
-import org.eclipse.ui.internal.dialogs.EditorsPreferencePage;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.tweaklets.TabBehaviour;
-import org.eclipse.ui.internal.tweaklets.Tweaklets;
-import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
-
-/**
- * Extends the Editors preference page with IDE-specific settings.
- * 
- * Note: want IDE settings to appear in main Editors preference page (via
- * subclassing), however the superclass, EditorsPreferencePage, is internal
- */
-public class IDEEditorsPreferencePage extends EditorsPreferencePage {
-
-	protected Control createContents(Composite parent) {
-		Composite composite = createComposite(parent);
-        
-		PreferenceLinkArea fileEditorsArea = new PreferenceLinkArea(composite, SWT.NONE,
-				"org.eclipse.ui.preferencePages.FileEditors", IDEWorkbenchMessages.IDEEditorsPreferencePage_WorkbenchPreference_FileEditorsRelatedLink,//$NON-NLS-1$
-				(IWorkbenchPreferenceContainer) getContainer(),null);
-
-		GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
-		fileEditorsArea.getControl().setLayoutData(data);
-
-        PreferenceLinkArea contentTypeArea = new PreferenceLinkArea(composite, SWT.NONE,
-                "org.eclipse.ui.preferencePages.ContentTypes", IDEWorkbenchMessages.IDEEditorsPreferencePage_WorkbenchPreference_contentTypesRelatedLink,//$NON-NLS-1$
-                (IWorkbenchPreferenceContainer) getContainer(),null);
-        
-        data = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
-        contentTypeArea.getControl().setLayoutData(data);
-        
-		PreferenceLinkArea appearanceArea = new PreferenceLinkArea(composite, SWT.NONE,
-				"org.eclipse.ui.preferencePages.Views", IDEWorkbenchMessages.IDEEditorsPreferencePage_WorkbenchPreference_viewsRelatedLink,//$NON-NLS-1$
-				(IWorkbenchPreferenceContainer) getContainer(),null);
-
-		data = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
-		appearanceArea.getControl().setLayoutData(data);
-			
-		createEditorHistoryGroup(composite);
-
-		createSpace(composite);
-		createShowMultipleEditorTabsPref(composite);
-		createAllowInplaceEditorPref(composite);
-		createUseIPersistablePref(composite);
-		createPromptWhenStillOpenPref(composite);
-		createEditorReuseGroup(composite);
-		((TabBehaviour)Tweaklets.get(TabBehaviour.KEY)).setPreferenceVisibility(editorReuseGroup, showMultipleEditorTabs);
-
-		applyDialogFont(composite);
-		
-        super.setHelpContext(parent);
-        
-		return composite;
-	}
-	
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEPerspectivesPreferencePage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEPerspectivesPreferencePage.java
deleted file mode 100644
index c7e02bd..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEPerspectivesPreferencePage.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.RadioGroupFieldEditor;
-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.ui.PlatformUI;
-import org.eclipse.ui.internal.dialogs.PerspectivesPreferencePage;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * Extends the Perspectives preference page with IDE-specific settings.
- * 
- * Note: want IDE settings to appear in main Perspectives preference page (via
- * subclassing), however the superclass, PerspectivesPreferencePage, is
- * internal
- */
-public class IDEPerspectivesPreferencePage extends PerspectivesPreferencePage {
-    private final String PROJECT_SWITCH_PERSP_MODE_TITLE = IDEWorkbenchMessages.ProjectSwitchPerspectiveMode_optionsTitle;
-
-    private final String PSPM_ALWAYS_TEXT = IDEWorkbenchMessages.ProjectSwitchPerspectiveMode_always;
-
-    private final String PSPM_NEVER_TEXT = IDEWorkbenchMessages.ProjectSwitchPerspectiveMode_never;
-
-    private final String PSPM_PROMPT_TEXT = IDEWorkbenchMessages.ProjectSwitchPerspectiveMode_prompt;
-
-    private RadioGroupFieldEditor projectSwitchField;
-
-    /**
-     * Creates the page's UI content.
-     */
-    protected Control createContents(Composite parent) {
-        // @issue if the product subclasses this page, then it should provide
-        // the help content
-    	PlatformUI
-				.getWorkbench()
-				.getHelpSystem()
-				.setHelp(
-						parent,
-						org.eclipse.ui.internal.IWorkbenchHelpContextIds.PERSPECTIVES_PREFERENCE_PAGE);
-
-        Composite composite = createComposite(parent);
-
-        createOpenPerspButtonGroup(composite);
-        createOpenViewButtonGroup(composite);
-        createProjectPerspectiveGroup(composite);
-        createCustomizePerspective(composite);
-
-        return composite;
-    }
-
-    /**
-     * Creates a composite that contains buttons for selecting the preference
-     * opening new project selections.
-     */
-    private void createProjectPerspectiveGroup(Composite composite) {
-
-        Composite projectComposite = new Composite(composite, SWT.NONE);
-        projectComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        projectComposite.setFont(composite.getFont());
-
-        String[][] namesAndValues = {
-                { PSPM_ALWAYS_TEXT, IDEInternalPreferences.PSPM_ALWAYS },
-                { PSPM_NEVER_TEXT, IDEInternalPreferences.PSPM_NEVER },
-                { PSPM_PROMPT_TEXT, IDEInternalPreferences.PSPM_PROMPT } };
-        projectSwitchField = new RadioGroupFieldEditor(
-                IDEInternalPreferences.PROJECT_SWITCH_PERSP_MODE,
-                PROJECT_SWITCH_PERSP_MODE_TITLE, namesAndValues.length,
-                namesAndValues, projectComposite, true);
-        projectSwitchField.setPreferenceStore(getIDEPreferenceStore());
-        projectSwitchField.setPage(this);
-        projectSwitchField.load();
-    }
-
-    /**
-     * Returns the IDE preference store.
-     */
-    protected IPreferenceStore getIDEPreferenceStore() {
-        return IDEWorkbenchPlugin.getDefault().getPreferenceStore();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.internal.dialogs.PerspectivesPreferencePage#performDefaults()
-     */
-    protected void performDefaults() {
-        projectSwitchField.loadDefault();
-        super.performDefaults();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.internal.dialogs.PerspectivesPreferencePage#performOk()
-     */
-    public boolean performOk() {
-        projectSwitchField.store();
-        IDEWorkbenchPlugin.getDefault().savePluginPreferences();
-        return super.performOk();
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEResourceInfoUtils.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEResourceInfoUtils.java
deleted file mode 100644
index a0506f7..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEResourceInfoUtils.java
+++ /dev/null
@@ -1,441 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     David Black - bug 198091
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import com.ibm.icu.text.DateFormat;
-import com.ibm.icu.text.MessageFormat;
-import com.ibm.icu.text.NumberFormat;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Date;
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.statushandlers.StatusManager;
-
-/**
- * Utility class supporting common information required from resources.
- * 
- * @since 3.2
- * 
- */
-public class IDEResourceInfoUtils {
-
-	private static String BYTES_LABEL = IDEWorkbenchMessages.ResourceInfo_bytes;
-
-	/**
-	 * An empty string to reuse.
-	 */
-	public static final String EMPTY_STRING = ""; //$NON-NLS-1$
-
-	private static String FILE_LABEL = IDEWorkbenchMessages.ResourceInfo_file;
-
-	private static String FILE_NOT_EXIST_TEXT = IDEWorkbenchMessages.ResourceInfo_fileNotExist;
-
-	private static String FILE_TYPE_FORMAT = IDEWorkbenchMessages.ResourceInfo_fileTypeFormat;
-
-	private static String FOLDER_LABEL = IDEWorkbenchMessages.ResourceInfo_folder;
-
-	private static String LINKED_FILE_LABEL = IDEWorkbenchMessages.ResourceInfo_linkedFile;
-
-	private static String LINKED_FOLDER_LABEL = IDEWorkbenchMessages.ResourceInfo_linkedFolder;
-
-	private static String MISSING_PATH_VARIABLE_TEXT = IDEWorkbenchMessages.ResourceInfo_undefinedPathVariable;
-
-	private static String NOT_EXIST_TEXT = IDEWorkbenchMessages.ResourceInfo_notExist;
-
-	private static String NOT_LOCAL_TEXT = IDEWorkbenchMessages.ResourceInfo_notLocal;
-
-	private static String PROJECT_LABEL = IDEWorkbenchMessages.ResourceInfo_project;
-
-	private static String UNKNOWN_LABEL = IDEWorkbenchMessages.ResourceInfo_unknown;
-
-	/**
-	 * Return whether or not the file called pathName exists.
-	 * 
-	 * @param pathName
-	 * @return boolean <code>true</code> if the file exists.
-	 * @see IFileInfo#exists()
-	 */
-	public static boolean exists(String pathName) {
-		IFileInfo info = getFileInfo(pathName);
-		if (info == null) {
-			return false;
-		}
-		return info.exists();
-	}
-
-	private static String getContentTypeString(IContentDescription description) {
-		if (description != null) {
-			IContentType contentType = description.getContentType();
-			if (contentType != null) {
-				return contentType.getName();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Return the value for the date String for the timestamp of the supplied
-	 * resource.
-	 * 
-	 * @param resource
-	 *            The resource to query
-	 * @return String
-	 */
-	public static String getDateStringValue(IResource resource) {
-		if (!resource.isLocal(IResource.DEPTH_ZERO)) {
-			return NOT_LOCAL_TEXT;
-		}
-
-		// don't access the file system for closed projects (bug 151089)
-		if (!isProjectAccessible(resource)) {
-			return UNKNOWN_LABEL;
-		}
-
-		URI location = resource.getLocationURI();
-		if (location == null) {
-			if (resource.isLinked()) {
-				return MISSING_PATH_VARIABLE_TEXT;
-			}
-			return NOT_EXIST_TEXT;
-		}
-
-		IFileInfo info = getFileInfo(location);
-		if (info == null) {
-			return UNKNOWN_LABEL;
-		}
-
-		if (info.exists()) {
-			DateFormat format = DateFormat.getDateTimeInstance(DateFormat.LONG,
-					DateFormat.MEDIUM);
-			return format.format(new Date(info.getLastModified()));
-		}
-		return NOT_EXIST_TEXT;
-	}
-
-	/**
-	 * Return the fileInfo at pathName or <code>null</code> if the format is
-	 * invalid or if the file info cannot be determined.
-	 * 
-	 * @param pathName
-	 * @return IFileInfo or <code>null</code>
-	 */
-	public static IFileInfo getFileInfo(IPath pathName) {
-		IFileStore store = getFileStore(pathName.toFile().toURI());
-		if (store == null) {
-			return null;
-		}
-		return store.fetchInfo();
-	}
-
-	/**
-	 * Return the fileInfo at pathName or <code>null</code> if the format is
-	 * invalid or if the file info cannot be determined.
-	 * 
-	 * @param pathName
-	 * @return IFileInfo or <code>null</code>
-	 */
-	public static IFileInfo getFileInfo(String pathName) {
-		IFileStore store = getFileStore(pathName);
-		if (store == null) {
-			return null;
-		}
-		return store.fetchInfo();
-	}
-
-	/**
-	 * Return the fileInfo for location. Return <code>null</code> if there is
-	 * a CoreException looking it up
-	 * 
-	 * @param location
-	 * @return String or <code>null</code>
-	 */
-	public static IFileInfo getFileInfo(URI location) {
-		IFileStore store = getFileStore(location);
-		if (store == null) {
-			return null;
-		}
-		return store.fetchInfo();
-	}
-
-	/**
-	 * Get the file store for the string.
-	 * 
-	 * @param string
-	 * @return IFileStore or <code>null</code> if there is a
-	 *         {@link CoreException}.
-	 */
-	public static IFileStore getFileStore(String string) {
-		return getFileStore(new Path(string).toFile().toURI());
-	}
-
-	/**
-	 * Get the file store for the URI.
-	 * 
-	 * @param uri
-	 * @return IFileStore or <code>null</code> if there is a
-	 *         {@link CoreException}.
-	 */
-	public static IFileStore getFileStore(URI uri) {
-		try {
-			return EFS.getStore(uri);
-		} catch (CoreException e) {
-			log(e);
-			return null;
-		}
-	}
-
-	/**
-	 * Get the location of a resource
-	 * 
-	 * @param resource
-	 * @return String the text to display the location
-	 */
-	public static String getLocationText(IResource resource) {
-		if (!resource.isLocal(IResource.DEPTH_ZERO)) {
-			return NOT_LOCAL_TEXT;
-		}
-
-		URI resolvedLocation = resource.getLocationURI();
-		URI location = resolvedLocation;
-		boolean isLinked = resource.isLinked();
-		if (isLinked) {
-			location = resource.getRawLocationURI();
-		}
-		if (location == null) {
-			return NOT_EXIST_TEXT;
-		}
-
-		IFileStore store = getFileStore(resolvedLocation);
-		// don't access the file system for closed projects (bug 151089)
-		boolean isPathVariable = isPathVariable(resource);
-		if (isProjectAccessible(resource) && resolvedLocation != null
-				&& !isPathVariable) {
-			// No path variable used. Display the file not exist message
-			// in the location. Fixes bug 33318.
-			if (store == null) {
-				return UNKNOWN_LABEL;
-			}
-			if (!store.fetchInfo().exists()) {
-				return NLS.bind(FILE_NOT_EXIST_TEXT, store.toString());
-			}
-		}
-		if (isLinked && isPathVariable) {
-			return resource.getRawLocationURI().toString();
-		}
-		if (store != null) {
-			return store.toString();
-		}
-		return location.toString();
-	}
-
-	/**
-	 * Get the resolved location of a resource. This resolves path variables if
-	 * present in the resource path.
-	 * 
-	 * @param resource
-	 * @return String
-	 */
-	public static String getResolvedLocationText(IResource resource) {
-		if (!resource.isLocal(IResource.DEPTH_ZERO)) {
-			return NOT_LOCAL_TEXT;
-		}
-
-		URI location = resource.getLocationURI();
-		if (location == null) {
-			if (resource.isLinked()) {
-				return MISSING_PATH_VARIABLE_TEXT;
-			}
-
-			return NOT_EXIST_TEXT;
-		}
-
-		IFileStore store = getFileStore(location);
-		if (store == null) {
-			return UNKNOWN_LABEL;
-		}
-
-		// don't access the file system for closed projects (bug 151089)
-		if (isProjectAccessible(resource) && !store.fetchInfo().exists()) {
-			return NLS.bind(FILE_NOT_EXIST_TEXT, store.toString());
-		}
-
-		return store.toString();
-	}
-
-	/**
-	 * Return a String that indicates the size of the supplied file.
-	 * 
-	 * @param resource
-	 * @return String
-	 */
-	public static String getSizeString(IResource resource) {
-		if (resource.getType() != IResource.FILE) {
-			return ""; //$NON-NLS-1$
-		}
-
-		IFile file = (IFile) resource;
-		if (!file.isLocal(IResource.DEPTH_ZERO)) {
-			return NOT_LOCAL_TEXT;
-		}
-
-		URI location = file.getLocationURI();
-		if (location == null) {
-			if (file.isLinked()) {
-				return MISSING_PATH_VARIABLE_TEXT;
-			}
-
-			return NOT_EXIST_TEXT;
-		}
-
-		IFileInfo info = getFileInfo(location);
-		if (info == null) {
-			return UNKNOWN_LABEL;
-		}
-
-		if (info.exists()) {
-			return NLS.bind(BYTES_LABEL, NumberFormat.getInstance().format(
-					new Long(info.getLength())));
-		}
-
-		return NOT_EXIST_TEXT;
-	}
-
-	/**
-	 * Get the string that identifies the type of this resource.
-	 * 
-	 * @param resource
-	 * @param description
-	 * @return String
-	 */
-	public static String getTypeString(IResource resource,
-			IContentDescription description) {
-
-		if (resource.getType() == IResource.FILE) {
-			if (resource.isLinked()) {
-				return LINKED_FILE_LABEL;
-			}
-
-			if (resource instanceof IFile) {
-				String contentType = getContentTypeString(description);
-				if (contentType != null) {
-					return MessageFormat.format(FILE_TYPE_FORMAT,
-							new String[] { contentType });
-				}
-			}
-			return FILE_LABEL;
-		}
-
-		if (resource.getType() == IResource.FOLDER) {
-			if (resource.isLinked()) {
-				return LINKED_FOLDER_LABEL;
-			}
-
-			return FOLDER_LABEL;
-		}
-
-		if (resource.getType() == IResource.PROJECT) {
-			return PROJECT_LABEL;
-		}
-
-		// Should not be possible
-		return UNKNOWN_LABEL;
-	}
-
-	/**
-	 * Returns whether the given resource is a linked resource bound to a path
-	 * variable.
-	 * 
-	 * @param resource
-	 *            resource to test
-	 * @return boolean <code>true</code> the given resource is a linked
-	 *         resource bound to a path variable. <code>false</code> the given
-	 *         resource is either not a linked resource or it is not using a
-	 *         path variable.
-	 */
-	private static boolean isPathVariable(IResource resource) {
-		if (!resource.isLinked()) {
-			return false;
-		}
-
-		URI resolvedLocation = resource.getLocationURI();
-		if (resolvedLocation == null) {
-			// missing path variable
-			return true;
-		}
-		URI rawLocation = resource.getRawLocationURI();
-		if (resolvedLocation.equals(rawLocation)) {
-			return false;
-		}
-
-		return true;
-	}
-
-	/**
-	 * Returns whether the resource's project is available
-	 */
-	private static boolean isProjectAccessible(IResource resource) {
-		IProject project = resource.getProject();
-		return project != null && project.isAccessible();
-	}
-
-	/**
-	 * Return the file stores that are a child of store that the filter accepts.
-	 * 
-	 * @param store
-	 * @param fileFilter
-	 * @param monitor
-	 * @return IFileStore[]
-	 */
-	public static IFileStore[] listFileStores(IFileStore store,
-			IFileStoreFilter fileFilter, IProgressMonitor monitor) {
-		ArrayList result = new ArrayList();
-		IFileStore[] children;
-		try {
-			children = store.childStores(EFS.NONE, monitor);
-		} catch (CoreException e) {
-			log(e);
-			return new IFileStore[0];
-		}
-		for (int i = 0; i < children.length; i++) {
-			if (fileFilter.accept(children[i])) {
-				result.add(children[i]);
-			}
-		}
-		IFileStore[] stores = new IFileStore[result.size()];
-		result.toArray(stores);
-		return stores;
-	}
-
-	/**
-	 * Log the CoreException
-	 * @param e
-	 */
-	private static void log(CoreException e) {
-		StatusManager.getManager().handle(e, IDEWorkbenchPlugin.IDE_WORKBENCH);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEWorkbenchPreferencePage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEWorkbenchPreferencePage.java
deleted file mode 100644
index 4b571aa..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEWorkbenchPreferencePage.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.internal.dialogs.WorkbenchPreferencePage;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * The IDE workbench main preference page.
- * 
- *Note: want IDE settings to appear in main Workbench preference page (via subclassing),
- *   however the superclass, WorkbenchPreferencePage, is internal
- */
-public class IDEWorkbenchPreferencePage extends WorkbenchPreferencePage
-        implements IWorkbenchPreferencePage {
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.preference.PreferencePage
-     */
-    protected Control createContents(Composite parent) {
-
-    	PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
-				IWorkbenchHelpContextIds.WORKBENCH_PREFERENCE_PAGE);
-
-        Composite composite = createComposite(parent);
-
-        createShowUserDialogPref(composite);
-        createStickyCyclePref(composite);
-        createHeapStatusPref(composite);
-        
-        createOpenModeGroup(composite);
-
-        applyDialogFont(composite);
-
-        return composite;
-    }
-
-     /**
-     * Returns the IDE preference store.
-     * @return the preference store.
-     */
-    protected IPreferenceStore getIDEPreferenceStore() {
-        return IDEWorkbenchPlugin.getDefault().getPreferenceStore();
-    }
-
-    /**
-     * The default button has been pressed.
-     */
-    protected void performDefaults() {
-		super.performDefaults();
-    }
-
-    /**
-     * The user has pressed Ok. Store/apply this page's values appropriately.
-     */
-    public boolean performOk() {
-        return super.performOk();
-    }
-   
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEWorkspacePreferencePage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEWorkspacePreferencePage.java
deleted file mode 100644
index be279aa..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IDEWorkspacePreferencePage.java
+++ /dev/null
@@ -1,414 +0,0 @@
- /****************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.jface.preference.FieldEditor;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.preference.RadioGroupFieldEditor;
-import org.eclipse.jface.preference.StringFieldEditor;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-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.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchEncoding;
-import org.eclipse.ui.dialogs.PreferenceLinkArea;
-import org.eclipse.ui.ide.IDEEncoding;
-import org.eclipse.ui.ide.dialogs.ResourceEncodingFieldEditor;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.LineDelimiterEditor;
-import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
-
-/**
- * The IDEWorkspacePreferencePage is the page used to set IDE-specific preferences settings
- * related to workspace.
-
- *Note:This class extends from PreferencePage,and there's no WorkspacePreferencePage class.
- *Hence when the IDE settings doesn't appear in this preference page, this page will be empty.
- */
-public class IDEWorkspacePreferencePage extends PreferencePage
-        implements IWorkbenchPreferencePage{
-
-	private Button autoBuildButton;
-
-    private Button autoSaveAllButton;
-
-    private IntegerFieldEditor saveInterval;
-
-    private Button autoRefreshButton;
-    
-    private ResourceEncodingFieldEditor encodingEditor;
-
-	private LineDelimiterEditor lineSeparatorEditor;
-	
-    //A boolean to indicate if the user settings were cleared.
-	private boolean clearUserSettings = false;
-
-	private RadioGroupFieldEditor openReferencesEditor;
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.preference.PreferencePage
-     */
-    protected Control createContents(Composite parent) {
-
-    	PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
-				IIDEHelpContextIds.WORKSPACE_PREFERENCE_PAGE);
-
-        Composite composite = createComposite(parent);
-
-		PreferenceLinkArea area = new PreferenceLinkArea(composite, SWT.NONE,
-				"org.eclipse.ui.preferencePages.Startup", IDEWorkbenchMessages.IDEWorkspacePreference_relatedLink,//$NON-NLS-1$
-				(IWorkbenchPreferenceContainer) getContainer(),null);
-
-		GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
-		area.getControl().setLayoutData(data);
-        
-		Label space = new Label(composite,SWT.NONE);
-		space.setLayoutData(new GridData());
-		
-        createAutoBuildPref(composite);
-        createAutoRefreshControls(composite);
-        createSaveAllBeforeBuildPref(composite);
-        
-        createSpace(composite);
-        createSaveIntervalGroup(composite);
-		createSpace(composite);
-		
-		createOpenPrefControls(composite);
-		
-		Composite lower = new Composite(composite,SWT.NONE);
-		GridLayout lowerLayout = new GridLayout();
-		lowerLayout.marginWidth = 0;
-		lowerLayout.numColumns = 2;
-		lowerLayout.makeColumnsEqualWidth = true;
-		lower.setLayout(lowerLayout);
-		
-		lower.setLayoutData(new GridData(
-                GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
-		
-		createEncodingEditorControls(lower);
-		createLineSeparatorEditorControls(lower);
-		applyDialogFont(composite);
-
-        return composite;
-    }
-
-    /**
-     * Creates controls for the preference to open required projects when
-     * opening a project.
-	 * @param parent The parent control
-	 */
-	private void createOpenPrefControls(Composite parent) {
-		String name = IDEInternalPreferences.OPEN_REQUIRED_PROJECTS;
-		String label = IDEWorkbenchMessages.IDEWorkspacePreference_openReferencedProjects;
-        String[][] namesAndValues = {
-                { IDEWorkbenchMessages.Always, IDEInternalPreferences.PSPM_ALWAYS },
-                { IDEWorkbenchMessages.Never, IDEInternalPreferences.PSPM_NEVER },
-                { IDEWorkbenchMessages.Prompt, IDEInternalPreferences.PSPM_PROMPT } };
-		openReferencesEditor = new RadioGroupFieldEditor(name, label, 3, namesAndValues, parent, true);
-		openReferencesEditor.setPreferenceStore(getIDEPreferenceStore());
-		openReferencesEditor.setPage(this);
-		openReferencesEditor.load();
-	}
-
-	protected void createSaveAllBeforeBuildPref(Composite composite) {
-        autoSaveAllButton = new Button(composite, SWT.CHECK);
-        autoSaveAllButton.setText(IDEWorkbenchMessages.IDEWorkspacePreference_savePriorToBuilding);
-        autoSaveAllButton.setToolTipText(IDEWorkbenchMessages.IDEWorkspacePreference_savePriorToBuildingToolTip);
-        autoSaveAllButton.setSelection(getIDEPreferenceStore().getBoolean(
-                IDEInternalPreferences.SAVE_ALL_BEFORE_BUILD));
-    }
-
-    protected void createAutoBuildPref(Composite composite) {
-        autoBuildButton = new Button(composite, SWT.CHECK);
-        autoBuildButton.setText(IDEWorkbenchMessages.IDEWorkspacePreference_autobuild);
-        autoBuildButton.setToolTipText(IDEWorkbenchMessages.IDEWorkspacePreference_autobuildToolTip);
-        autoBuildButton.setSelection(ResourcesPlugin.getWorkspace()
-                .isAutoBuilding());
-    }
-
-    /**
-     * Create a composite that contains entry fields specifying save interval
-     * preference.
-     * 
-     * @param composite the Composite the group is created in.
-     */
-    private void createSaveIntervalGroup(Composite composite) {
-        Composite groupComposite = new Composite(composite, SWT.LEFT);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        groupComposite.setLayout(layout);
-        GridData gd = new GridData();
-        gd.horizontalAlignment = GridData.FILL;
-        gd.grabExcessHorizontalSpace = true;
-        groupComposite.setLayoutData(gd);
-
-        saveInterval = new IntegerFieldEditor(
-                IDEInternalPreferences.SAVE_INTERVAL, IDEWorkbenchMessages.WorkbenchPreference_saveInterval,
-                groupComposite);
-
-        // @issue we should drop our preference constant and let clients use
-        // core's pref. ours is not up-to-date anyway if someone changes this
-        // interval directly thru core api.
-        saveInterval.setPreferenceStore(getIDEPreferenceStore());
-        saveInterval.setPage(this);
-        saveInterval.setTextLimit(Integer.toString(
-                IDEInternalPreferences.MAX_SAVE_INTERVAL).length());
-        saveInterval.setErrorMessage(NLS.bind(IDEWorkbenchMessages.WorkbenchPreference_saveIntervalError, new Integer(IDEInternalPreferences.MAX_SAVE_INTERVAL)));
-        saveInterval
-                .setValidateStrategy(StringFieldEditor.VALIDATE_ON_KEY_STROKE);
-        saveInterval.setValidRange(1, IDEInternalPreferences.MAX_SAVE_INTERVAL);
-
-        IWorkspaceDescription description = ResourcesPlugin.getWorkspace()
-                .getDescription();
-        long interval = description.getSnapshotInterval() / 60000;
-        saveInterval.setStringValue(Long.toString(interval));
-
-        saveInterval.setPropertyChangeListener(new IPropertyChangeListener() {
-
-            public void propertyChange(PropertyChangeEvent event) {
-                if (event.getProperty().equals(FieldEditor.IS_VALID)) {
-					setValid(saveInterval.isValid());
-				}
-            }
-        });
-
-    }
-	
-	/**
-     * Create the Refresh controls
-     * 
-     * @param parent
-     */
-    private void createAutoRefreshControls(Composite parent) {
-
-        this.autoRefreshButton = new Button(parent, SWT.CHECK);
-        this.autoRefreshButton.setText(IDEWorkbenchMessages.IDEWorkspacePreference_RefreshButtonText);
-        this.autoRefreshButton.setToolTipText(IDEWorkbenchMessages.IDEWorkspacePreference_RefreshButtonToolTip);
-
-        boolean autoRefresh = ResourcesPlugin.getPlugin()
-                .getPluginPreferences().getBoolean(
-                        ResourcesPlugin.PREF_AUTO_REFRESH);
-        this.autoRefreshButton.setSelection(autoRefresh);
-    }
-
-    /**
-     * Create a composite that contains the encoding controls
-     * 
-     * @param parent
-     */
-    private void createEncodingEditorControls(Composite parent){    			
-		Composite encodingComposite = new Composite(parent,SWT.NONE);
-		encodingComposite.setLayout(new GridLayout());
-		encodingComposite.setLayoutData(new GridData(
-                GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
-		
-		encodingEditor = new ResourceEncodingFieldEditor(IDEWorkbenchMessages.WorkbenchPreference_encoding, encodingComposite, ResourcesPlugin
-				.getWorkspace().getRoot());
-
-		encodingEditor.setPage(this);
-		encodingEditor.load();
-		encodingEditor.setPropertyChangeListener(new IPropertyChangeListener() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-			 */
-			public void propertyChange(PropertyChangeEvent event) {
-				if (event.getProperty().equals(FieldEditor.IS_VALID)) {
-					setValid(encodingEditor.isValid());
-				}
-
-			}
-		});
-    }
-    
-    /**
-     * Create a composite that contains the line delimiter controls
-     * 
-     * @param parent
-     */
-    private void createLineSeparatorEditorControls(Composite parent){
-    	Composite lineComposite = new Composite(parent,SWT.NONE);
-		final GridLayout gridLayout = new GridLayout();
-		gridLayout.marginWidth = 0;
-		gridLayout.marginHeight = 0;
-		lineComposite.setLayout(gridLayout);
-
-		lineComposite.setLayoutData(new GridData(
-                GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
-		
-		lineSeparatorEditor = new LineDelimiterEditor(lineComposite);
-		lineSeparatorEditor.doLoad();
-    }
-    /**
-     * Returns the IDE preference store.
-     * @return the preference store.
-     */
-    protected IPreferenceStore getIDEPreferenceStore() {
-        return IDEWorkbenchPlugin.getDefault().getPreferenceStore();
-    }
-	
-	/**
-     * Creates a tab of one horizontal spans.
-     * 
-     * @param parent
-     *            the parent in which the tab should be created
-     */
-    protected static void createSpace(Composite parent) {
-        Label vfiller = new Label(parent, SWT.LEFT);
-        GridData gridData = new GridData();
-        gridData = new GridData();
-        gridData.horizontalAlignment = GridData.BEGINNING;
-        gridData.grabExcessHorizontalSpace = false;
-        gridData.verticalAlignment = GridData.CENTER;
-        gridData.grabExcessVerticalSpace = false;
-        vfiller.setLayoutData(gridData);
-    }
-
-	/**
-     * Creates the composite which will contain all the preference controls for
-     * this page.
-     * 
-     * @param parent
-     *            the parent composite
-     * @return the composite for this page
-     */
-    protected Composite createComposite(Composite parent) {
-        Composite composite = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        composite.setLayout(layout);
-        composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
-                | GridData.HORIZONTAL_ALIGN_FILL));
-        return composite;
-    }
-	
-	public void init(org.eclipse.ui.IWorkbench workbench) {
-        //no-op
-    }
-    
-    /**
-     * The default button has been pressed.
-     */
-    protected void performDefaults() {
-
-        // core holds onto this preference.
-        boolean autoBuild = ResourcesPlugin.getPlugin().getPluginPreferences()
-                .getDefaultBoolean(ResourcesPlugin.PREF_AUTO_BUILDING);
-        autoBuildButton.setSelection(autoBuild);
-
-        IPreferenceStore store = getIDEPreferenceStore();
-        autoSaveAllButton
-                .setSelection(store
-                        .getDefaultBoolean(IDEInternalPreferences.SAVE_ALL_BEFORE_BUILD));
-        saveInterval.loadDefault();
-
-		
-        boolean autoRefresh = ResourcesPlugin.getPlugin()
-                .getPluginPreferences().getDefaultBoolean(
-                        ResourcesPlugin.PREF_AUTO_REFRESH);
-        autoRefreshButton.setSelection(autoRefresh);
-        
-        clearUserSettings = true;
-
-		List encodings = WorkbenchEncoding.getDefinedEncodings();
-		Collections.sort(encodings);
-        encodingEditor.loadDefault();
-		lineSeparatorEditor.loadDefault();
-		openReferencesEditor.loadDefault();
-
-        super.performDefaults();
-    }
-
-    /**
-     * The user has pressed Ok. Store/apply this page's values appropriately.
-     */
-    public boolean performOk() {
-        // set the workspace auto-build flag
-        IWorkspaceDescription description = ResourcesPlugin.getWorkspace()
-                .getDescription();
-        if (autoBuildButton.getSelection() != ResourcesPlugin.getWorkspace()
-                .isAutoBuilding()) {
-            try {
-                description.setAutoBuilding(autoBuildButton.getSelection());
-                ResourcesPlugin.getWorkspace().setDescription(description);
-            } catch (CoreException e) {
-                IDEWorkbenchPlugin.log(
-                        "Error changing auto build workspace setting.", e//$NON-NLS-1$
-                                .getStatus());
-            }
-        }
-
-        IPreferenceStore store = getIDEPreferenceStore();
-
-        // store the save all prior to build setting
-        store.setValue(IDEInternalPreferences.SAVE_ALL_BEFORE_BUILD,
-                autoSaveAllButton.getSelection());
-
-        // store the workspace save interval
-        // @issue we should drop our preference constant and let clients use
-        // core's pref. ours is not up-to-date anyway if someone changes this
-        // interval directly thru core api.
-        long oldSaveInterval = description.getSnapshotInterval() / 60000;
-        long newSaveInterval = new Long(saveInterval.getStringValue())
-                .longValue();
-        if (oldSaveInterval != newSaveInterval) {
-            try {
-                description.setSnapshotInterval(newSaveInterval * 60000);
-                ResourcesPlugin.getWorkspace().setDescription(description);
-                store.firePropertyChangeEvent(
-                        IDEInternalPreferences.SAVE_INTERVAL, new Integer(
-                                (int) oldSaveInterval), new Integer(
-                                (int) newSaveInterval));
-            } catch (CoreException e) {
-                IDEWorkbenchPlugin.log(
-                        "Error changing save interval preference", e //$NON-NLS-1$
-                                .getStatus());
-            }
-        }
-        
-        Preferences preferences = ResourcesPlugin.getPlugin()
-                .getPluginPreferences();
-
-        boolean autoRefresh = autoRefreshButton.getSelection();
-        preferences.setValue(ResourcesPlugin.PREF_AUTO_REFRESH, autoRefresh);
-        
-        if (clearUserSettings) {
-			IDEEncoding.clearUserEncodings();
-		}
-        encodingEditor.store();
-		lineSeparatorEditor.store();
-		openReferencesEditor.store();
-        return super.performOk();
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IElementFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IElementFilter.java
deleted file mode 100644
index e5963bd..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IElementFilter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.util.Collection;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * The IElementFilter is a interface that defines 
- * the api for filtering the current selection of 
- * a ResourceTreeAndListGroup in order to find a 
- * subset to update as the result of a type filtering.
- * This is meant as an internal class and is used exlcusively
- * by the import dialog.
- */
-
-public interface IElementFilter {
-
-    public void filterElements(Collection elements, IProgressMonitor monitor)
-            throws InterruptedException;
-
-    public void filterElements(Object[] elements, IProgressMonitor monitor)
-            throws InterruptedException;
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IFileStoreFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IFileStoreFilter.java
deleted file mode 100644
index fdb6336..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/IFileStoreFilter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.dialogs;
-
-import org.eclipse.core.filesystem.IFileStore;
-
-/**
- * IFileStoreFilter is an interface that defines a filter on file
- * stores.
- * @since 3.2
- *
- */
-public interface IFileStoreFilter {
-	
-	/**
-	 * Return whether or not this store is accepted by the receiver.
-	 * @param store IFileStore
-	 * @return boolean <code>true</code> if this store is accepted.
-	 */
-	public abstract boolean accept(IFileStore store);
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/InternalErrorDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/InternalErrorDialog.java
deleted file mode 100644
index 1bc2092..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/InternalErrorDialog.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - Fix for bug 93353 - 
- *     [Dialogs] InternalErrorDialog#buttonPressed should explicitly call super
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Added a Details button to the MessageDialog to show the exception
- * stack trace.
- */
-public class InternalErrorDialog extends MessageDialog {
-
-    private Throwable detail;
-
-    private int detailButtonID = -1;
-
-    private Text text;
-
-    //Workaround. SWT does not seem to set the default button if 
-    //there is not control with focus. Bug: 14668
-    private int defaultButtonIndex = 0;
-
-    /**
-     * Size of the text in lines.
-     */
-    private static final int TEXT_LINE_COUNT = 15;
-
-    /**
-     * Create a new dialog.
-     * 
-     * @param parentShell the parent shell
-     * @param dialogTitle the  title
-     * @param dialogTitleImage the title image
-     * @param dialogMessage the message
-     * @param detail the error to display
-     * @param dialogImageType the type of image
-     * @param dialogButtonLabels the button labels
-     * @param defaultIndex the default selected button index
-     */
-    public InternalErrorDialog(Shell parentShell, String dialogTitle,
-            Image dialogTitleImage, String dialogMessage, Throwable detail,
-            int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
-        super(parentShell, dialogTitle, dialogTitleImage, dialogMessage,
-                dialogImageType, dialogButtonLabels, defaultIndex);
-        defaultButtonIndex = defaultIndex;
-        this.detail = detail;
-        setShellStyle(getShellStyle() | SWT.APPLICATION_MODAL);
-    }
-
-    //Workaround. SWT does not seem to set rigth the default button if 
-    //there is not control with focus. Bug: 14668
-    public int open() {
-        create();
-        Button b = getButton(defaultButtonIndex);
-        b.setFocus();
-        b.getShell().setDefaultButton(b);
-        return super.open();
-    }
-
-    /**
-     * Set the detail button;
-     * @param index the detail button index
-     */
-    public void setDetailButton(int index) {
-        detailButtonID = index;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Dialog.
-     */
-    protected void buttonPressed(int buttonId) {
-        if (buttonId == detailButtonID) {
-            toggleDetailsArea();
-        } else {
-            super.buttonPressed(buttonId);
-        }
-    }
-
-    /**
-     * Toggles the unfolding of the details area.  This is triggered by
-     * the user pressing the details button.
-     */
-    private void toggleDetailsArea() {
-        Point windowSize = getShell().getSize();
-        Point oldSize = getContents().computeSize(SWT.DEFAULT, SWT.DEFAULT);
-
-        if (text != null) {
-            text.dispose();
-            text = null;
-            getButton(detailButtonID).setText(
-                    IDialogConstants.SHOW_DETAILS_LABEL);
-        } else {
-            createDropDownText((Composite) getContents());
-            getButton(detailButtonID).setText(
-                    IDialogConstants.HIDE_DETAILS_LABEL);
-        }
-
-        Point newSize = getContents().computeSize(SWT.DEFAULT, SWT.DEFAULT);
-        getShell()
-                .setSize(
-                        new Point(windowSize.x, windowSize.y
-                                + (newSize.y - oldSize.y)));
-    }
-
-    /**
-     * Create this dialog's drop-down list component.
-     *
-     * @param parent the parent composite
-     */
-    protected void createDropDownText(Composite parent) {
-        // create the list
-        text = new Text(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
-        text.setFont(parent.getFont());
-
-        // print the stacktrace in the text field
-        try {
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            PrintStream ps = new PrintStream(baos);
-            detail.printStackTrace(ps);
-            ps.flush();
-            baos.flush();
-            text.setText(baos.toString());
-        } catch (IOException e) {
-        }
-
-        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-                | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL
-                | GridData.GRAB_VERTICAL);
-        data.heightHint = text.getLineHeight() * TEXT_LINE_COUNT;
-        data.horizontalSpan = 2;
-        text.setLayoutData(data);
-    }
-
-    /** 
-     * Convenience method to open a simple Yes/No question dialog.
-     *
-     * @param parent the parent shell of the dialog, or <code>null</code> if none
-     * @param title the dialog's title, or <code>null</code> if none
-     * @param message the message
-     * @param detail the error 
-     * @param defaultIndex the default index of the button to select
-     * @return <code>true</code> if the user presses the OK button,
-     *    <code>false</code> otherwise
-     */
-    public static boolean openQuestion(Shell parent, String title,
-            String message, Throwable detail, int defaultIndex) {
-        String[] labels;
-        if (detail == null) {
-			labels = new String[] { IDialogConstants.YES_LABEL,
-                    IDialogConstants.NO_LABEL };
-		} else {
-			labels = new String[] { IDialogConstants.YES_LABEL,
-                    IDialogConstants.NO_LABEL,
-                    IDialogConstants.SHOW_DETAILS_LABEL };
-		}
-
-        InternalErrorDialog dialog = new InternalErrorDialog(parent, title,
-                null, // accept the default window icon
-                message, detail, QUESTION, labels, defaultIndex);
-        if (detail != null) {
-			dialog.setDetailButton(2);
-		}
-        return dialog.open() == 0;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/LinkedResourcesPreferencePage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/LinkedResourcesPreferencePage.java
deleted file mode 100644
index 979efc9..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/LinkedResourcesPreferencePage.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.dialogs;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.jface.dialogs.MessageDialog;
-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.graphics.Font;
-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.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-
-/**
- * Preference page for linked resources. 
- * This preference page allows enabling and disabling the workbench linked 
- * resource support.
- * It also shows all path variables currently defined in the workspace's path 
- * variable manager. The user may add, edit and remove path variables. 
- *  
- * @see org.eclipse.ui.internal.ide.dialogs.PathVariableDialog
- */
-public class LinkedResourcesPreferencePage extends PreferencePage implements
-        IWorkbenchPreferencePage {
-    private Label topLabel;
-
-    private PathVariablesGroup pathVariablesGroup;
-
-    /**
-     * Constructs a preference page of path variables.
-     * Omits "Restore Defaults"/"Apply Changes" buttons.
-     */
-    public LinkedResourcesPreferencePage() {
-        pathVariablesGroup = new PathVariablesGroup(true, IResource.FILE
-                | IResource.FOLDER);
-
-        this.noDefaultAndApplyButton();
-    }
-
-    /**
-     * Resets this page's internal state and creates its UI contents.
-     * 
-     * @see PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-     */
-    protected Control createContents(Composite parent) {
-        Font font = parent.getFont();
-
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
-                IIDEHelpContextIds.LINKED_RESOURCE_PREFERENCE_PAGE);
-        // define container & its gridding
-        Composite pageComponent = new Composite(parent, SWT.NULL);
-        GridLayout layout = new GridLayout();
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        pageComponent.setLayout(layout);
-        GridData data = new GridData();
-        data.verticalAlignment = GridData.FILL;
-        data.horizontalAlignment = GridData.FILL;
-        pageComponent.setLayoutData(data);
-        pageComponent.setFont(font);
-
-        final Button enableLinkedResourcesButton = new Button(pageComponent,
-                SWT.CHECK);
-        enableLinkedResourcesButton.setText(IDEWorkbenchMessages.LinkedResourcesPreference_enableLinkedResources);
-        enableLinkedResourcesButton.setFont(font);
-        enableLinkedResourcesButton
-                .addSelectionListener(new SelectionAdapter() {
-                    public void widgetSelected(SelectionEvent e) {
-                        boolean enabled = enableLinkedResourcesButton
-                                .getSelection();
-                        Preferences preferences = ResourcesPlugin.getPlugin()
-                                .getPluginPreferences();
-                        preferences.setValue(
-                                ResourcesPlugin.PREF_DISABLE_LINKING, !enabled);
-
-                        updateWidgetState(enabled);
-                        if (enabled) {
-                            MessageDialog
-                                    .openWarning(
-                                            getShell(),
-                                            IDEWorkbenchMessages.LinkedResourcesPreference_linkedResourcesWarningTitle,
-                                            IDEWorkbenchMessages.LinkedResourcesPreference_linkedResourcesWarningMessage);
-                        }
-                    }
-                });
-
-        createSpace(pageComponent);
-
-        topLabel = new Label(pageComponent, SWT.NONE);
-        topLabel.setText(IDEWorkbenchMessages.LinkedResourcesPreference_explanation);
-        data = new GridData();
-        data.verticalAlignment = GridData.FILL;
-        data.horizontalAlignment = GridData.FILL;
-        topLabel.setLayoutData(data);
-        topLabel.setFont(font);
-
-        pathVariablesGroup.createContents(pageComponent);
-
-        Preferences preferences = ResourcesPlugin.getPlugin()
-                .getPluginPreferences();
-        boolean enableLinking = !preferences
-                .getBoolean(ResourcesPlugin.PREF_DISABLE_LINKING);
-        enableLinkedResourcesButton.setSelection(enableLinking);
-        updateWidgetState(enableLinking);
-        return pageComponent;
-    }
-
-    /**
-     * Creates a tab of one horizontal spans.
-     *
-     * @param parent  the parent in which the tab should be created
-     */
-    protected static void createSpace(Composite parent) {
-        Label vfiller = new Label(parent, SWT.LEFT);
-        GridData gridData = new GridData();
-        gridData = new GridData();
-        gridData.horizontalAlignment = GridData.BEGINNING;
-        gridData.grabExcessHorizontalSpace = false;
-        gridData.verticalAlignment = GridData.CENTER;
-        gridData.grabExcessVerticalSpace = false;
-        vfiller.setLayoutData(gridData);
-    }
-
-    /**
-     * Disposes the path variables group.
-     * @see org.eclipse.jface.dialogs.IDialogPage#dispose()
-     */
-    public void dispose() {
-        pathVariablesGroup.dispose();
-        super.dispose();
-    }
-
-    /**
-     * Empty implementation. This page does not use the workbench.
-     * 
-     * @see IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-     */
-    public void init(IWorkbench workbench) {
-    }
-
-    /**
-     * Commits the temporary state to the path variable manager in response to user
-     * confirmation.
-     * 
-     * @see PreferencePage#performOk()
-     * @see PathVariablesGroup#performOk()
-     */
-    public boolean performOk() {
-        return pathVariablesGroup.performOk();
-    }
-
-    /**
-     * Set the widget enabled state
-     * 
-     * @param enableLinking the new widget enabled state
-     */
-    protected void updateWidgetState(boolean enableLinking) {
-        topLabel.setEnabled(enableLinking);
-        pathVariablesGroup.setEnabled(enableLinking);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/OpenResourceDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/OpenResourceDialog.java
deleted file mode 100644
index 9597515..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/OpenResourceDialog.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.util.Collections;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-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.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.OpenFileAction;
-import org.eclipse.ui.actions.OpenWithMenu;
-import org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog;
-import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
-import org.eclipse.ui.internal.WorkbenchImages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-
-
-/**
- * Shows a list of resources to the user with a text entry field for a string
- * pattern used to filter the list of resources.
- * 
- * @since 2.1
- */
-public class OpenResourceDialog extends FilteredResourcesSelectionDialog {
-
-	private Button openWithButton;
-
-	/**
-	 * Creates a new instance of the class.
-	 * 
-	 * @param parentShell
-	 *            the parent shell
-	 * @param container
-	 *            the container
-	 * @param typesMask
-	 *            the types mask
-	 */
-	public OpenResourceDialog(Shell parentShell, IContainer container,
-			int typesMask) {
-		super(parentShell, true, container, typesMask);
-		setTitle(IDEWorkbenchMessages.OpenResourceDialog_title);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parentShell,
-				IIDEHelpContextIds.OPEN_RESOURCE_DIALOG);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 * @since 3.5
-	 */
-	protected void fillContextMenu(IMenuManager menuManager) {
-		super.fillContextMenu(menuManager);
-
-		IStructuredSelection selectedItems = getSelectedItems();
-		if (selectedItems.isEmpty()) {
-			return;
-		}
-		
-		IWorkbenchPage activePage = getActivePage();
-		if (activePage == null) {
-			return;
-		}
-
-		// Add 'Open' menu item
-		OpenFileAction openFileAction = new OpenFileAction(activePage) {
-			public void run() {
-				okPressed();
-			}
-		};
-		openFileAction.selectionChanged(selectedItems);
-		if (!openFileAction.isEnabled()) {
-			return;
-		}
-		menuManager.add(new Separator());
-		menuManager.add(openFileAction);
-
-		IAdaptable selectedAdaptable = getSelectedAdaptable();
-		if (selectedAdaptable == null) {
-			return;
-		}
-
-		// Add 'Open With...'  sub-menu
-		MenuManager subMenu = new MenuManager(IDEWorkbenchMessages.OpenResourceDialog_openWithMenu_label);
-		OpenWithMenu openWithMenu = new OpenWithMenu(activePage, selectedAdaptable) {
-			/*
-			 * (non-Javadoc)
-			 * @see org.eclipse.ui.actions.OpenWithMenu#openEditor(org.eclipse.ui.IEditorDescriptor, boolean)
-			 */
-			protected void openEditor(IEditorDescriptor editorDescriptor, boolean openUsingDescriptor) {
-				computeResult();
-				setResult(Collections.EMPTY_LIST);
-				close();
-				super.openEditor(editorDescriptor, openUsingDescriptor);
-			}
-		};
-		subMenu.add(openWithMenu);
-		menuManager.add(subMenu);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 * @since 3.5
-	 */
-	protected void createButtonsForButtonBar(final Composite parent) {
-		// increment the number of columns in the button bar
-		GridLayout parentLayout = (GridLayout)parent.getLayout();
-		parentLayout.numColumns++;
-		parentLayout.makeColumnsEqualWidth = false;
-		
-		final Composite openComposite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.horizontalSpacing = 0;
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		openComposite.setLayout(layout);
-
-		Button okButton = createButton(openComposite, IDialogConstants.OK_ID, IDEWorkbenchMessages.OpenResourceDialog_openButton_text, true);
-
-		// Arrow down button for Open With menu
-		((GridLayout)openComposite.getLayout()).numColumns++;
-		openWithButton = new Button(openComposite, SWT.PUSH);
-		openWithButton.setToolTipText(IDEWorkbenchMessages.OpenResourceDialog_openWithButton_toolTip);
-		openWithButton.setImage(WorkbenchImages.getImage(IWorkbenchGraphicConstants.IMG_LCL_BUTTON_MENU));
-
-		GridData data = new GridData(SWT.CENTER, SWT.FILL, false, true);
-		openWithButton.setLayoutData(data);
-
-		openWithButton.addMouseListener(new MouseAdapter() {
-			public void mouseDown(MouseEvent e) {
-				IWorkbenchPage activePage = getActivePage();
-				if (activePage == null) {
-					return;
-				}
-				IAdaptable selectedAdaptable = getSelectedAdaptable();
-				if (selectedAdaptable == null) {
-					return;
-				}
-
-				OpenWithMenu openWithMenu = new OpenWithMenu(activePage, selectedAdaptable) {
-					/*
-					 * (non-Javadoc)
-					 * @see org.eclipse.ui.actions.OpenWithMenu#openEditor(org.eclipse.ui.IEditorDescriptor, boolean)
-					 */
-					protected void openEditor(IEditorDescriptor editorDescriptor, boolean openUsingDescriptor) {
-						computeResult();
-						setResult(Collections.EMPTY_LIST);
-						close();
-						super.openEditor(editorDescriptor, openUsingDescriptor);
-					}
-				};
-
-				Menu menu = new Menu(parent);
-				Control c = openComposite;
-				Point p = c.getLocation();
-				p.y = p.y + c.getSize().y;
-				p = c.getParent().toDisplay(p);
-
-				menu.setLocation(p);
-				openWithMenu.fill(menu, -1);
-				menu.setVisible(true);
-			}
-		});
-
-		Button cancelButton = createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
-		
-		GridData cancelLayoutData = (GridData) cancelButton.getLayoutData();
-		GridData okLayoutData = (GridData) okButton.getLayoutData();
-		int buttonWidth = Math.max(cancelLayoutData.widthHint, okLayoutData.widthHint);
-		cancelLayoutData.widthHint = buttonWidth;
-		okLayoutData.widthHint = buttonWidth;
-		
-		if (Util.isMac()) {
-			// On Mac OS X the default button must be the right-most button
-			// See also special code in org.eclipse.jface.dialogs.Dialog#initializeBounds()
-			openComposite.moveBelow(null);
-			okLayoutData.horizontalIndent = -10;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.SelectionStatusDialog#updateButtonsEnableState(org.eclipse.core.runtime.IStatus)
-	 * @since 3.5
-	 */
-	protected void updateButtonsEnableState(IStatus status) {
-		super.updateButtonsEnableState(status);
-		if (openWithButton != null && !openWithButton.isDisposed()) {
-			openWithButton.setEnabled(!status.matches(IStatus.ERROR) && getSelectedItems().size() == 1);
-		}
-	}
-
-	private IAdaptable getSelectedAdaptable() {
-		IStructuredSelection s = getSelectedItems();
-		if (s.size() != 1) {
-			return null;
-		}
-		Object selectedElement = s.getFirstElement();
-		if (selectedElement instanceof IAdaptable) {
-			return (IAdaptable) selectedElement;
-		}
-		return null;
-	}
-
-	private IWorkbenchPage getActivePage() {
-		IWorkbenchWindow activeWorkbenchWindow= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-		if (activeWorkbenchWindow == null) {
-			return null;
-		}
-		return activeWorkbenchWindow.getActivePage();
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/PathVariableDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/PathVariableDialog.java
deleted file mode 100644
index f810934..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/PathVariableDialog.java
+++ /dev/null
@@ -1,549 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - 19346, 42056
- *     Remy Chi Jian Suen - bug 204879
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.util.Set;
-
-import org.eclipse.core.resources.IPathVariableManager;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-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.Control;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-
-/**
- * Dialog that prompts the user for defining a variable's name and value. It
- * supports creating a new variable or editing an existing one. The difference
- * between the two uses is just a matter of which messages to present to the
- * user and whether the "Ok" button starts enabled or not.
- */
-public class PathVariableDialog extends TitleAreaDialog {
-
-    // UI widgets
-    private Button okButton;
-
-    private Label variableNameLabel;
-
-    private Label variableValueLabel;
-
-    private Text variableNameField;
-
-    private Text variableValueField;
-
-    private Button fileButton;
-
-    private Button folderButton;
-
-    /**
-     * This dialog type: <code>NEW_VARIABLE</code> or
-     * <code>EXISTING_VARIABLE</code>.
-     */
-    private int type;
-
-    /**
-     * The type of variable that can be edited in this dialog.
-     * <code>IResource.FILE</code> or <code>IResource.FOLDER</code>
-     */
-    private int variableType;
-
-    /**
-     * The name of the variable being edited.
-     */
-    private String variableName;
-
-    /**
-     * The value of the variable being edited.
-     */
-    private String variableValue;
-
-    /**
-     * The original name of the variable being edited. It is used when testing
-     * if the current variable's name is already in use.
-     */
-    private String originalName;
-
-    /**
-     * Used to select the proper message depending on the current mode
-     * (new/existing variable).
-     */
-    private boolean newVariable;
-
-    /**
-     * Reference to the path variable manager. It is used for validating
-     * variable names.
-     */
-    private IPathVariableManager pathVariableManager;
-
-    /**
-     * Set of variable names currently in use. Used when warning the user that
-     * the currently selected name is already in use by another variable.
-     */
-    private Set namesInUse;
-
-    /**
-     * The current validation status. Its value can be one of the following:<ul>
-     * <li><code>IMessageProvider.NONE</code> (default);</li>
-     * <li><code>IMessageProvider.WARNING</code>;</li>
-     * <li><code>IMessageProvider.ERROR</code>;</li>
-     * </ul>
-     * Used when validating the user input.
-     */
-    private int validationStatus;
-
-    /**
-     * The current validation message generated by the last
-     * call to a <code>validate</code> method.
-     */
-    private String validationMessage;
-
-    /**
-     * Whether a variable name has been entered.  
-     */
-    private boolean nameEntered = false;
-
-    /**
-     * Whether a variable location has been entered.  
-     */
-    private boolean locationEntered = false;
-
-    /**
-     * The standard message to be shown when there are no problems being
-     * reported.
-     */
-    final private String standardMessage;
-
-    /**
-     * Constant for defining this dialog as intended to create a new variable
-     * (value = 1).
-     */
-    public final static int NEW_VARIABLE = 1;
-
-    /**
-     * Constant for defining this dialog as intended to edit an existing
-     * variable (value = 2).
-     */
-    public final static int EXISTING_VARIABLE = 2;
-
-    /**
-     * Constructs a dialog for editing a new/existing path variable.
-     * 
-     * @param parentShell the parent shell
-     * @param type the dialog type: <code>NEW_VARIABLE</code> or
-     * 	<code>EXISTING_VARIABLE</code>
-     * @param variableType the type of variable that can be edited in 
-     * 	this dialog. <code>IResource.FILE</code> or <code>IResource.FOLDER</code>
-     * @param pathVariableManager a reference to the path variable manager
-     * @param namesInUse a set of variable names currently in use 
-     */
-    public PathVariableDialog(Shell parentShell, int type, int variableType,
-            IPathVariableManager pathVariableManager, Set namesInUse) {
-        super(parentShell);
-        this.type = type;
-        this.newVariable = type == NEW_VARIABLE;
-        this.variableName = ""; //$NON-NLS-1$
-        this.variableValue = ""; //$NON-NLS-1$
-        this.variableType = variableType;
-        this.pathVariableManager = pathVariableManager;
-        this.namesInUse = namesInUse;
-
-        if (newVariable) {
-			this.standardMessage = IDEWorkbenchMessages.PathVariableDialog_message_newVariable;
-		} else {
-			this.standardMessage = IDEWorkbenchMessages.PathVariableDialog_message_existingVariable;
-		}
-    }
-
-    /**
-     * Configures this dialog's shell, setting the shell's text.
-     * 
-     * @see org.eclipse.jface.window.Window#configureShell(Shell)
-     */
-    protected void configureShell(Shell shell) {
-        super.configureShell(shell);
-        if (newVariable) {
-			shell.setText(IDEWorkbenchMessages.PathVariableDialog_shellTitle_newVariable);
-		} else {
-			shell
-                    .setText(IDEWorkbenchMessages.PathVariableDialog_shellTitle_existingVariable);
-		}
-    }
-
-    /**
-     * Creates and returns the contents of this dialog (except for the button bar).
-     * 
-     * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea
-     */
-    protected Control createDialogArea(Composite parent) {
-        // top level composite
-        Composite parentComposite = (Composite) super.createDialogArea(parent);
-
-        initializeDialogUnits(parentComposite);
-        
-        // creates dialog area composite
-        Composite contents = createComposite(parentComposite);
-
-        // creates and lay outs dialog area widgets 
-        createWidgets(contents);
-
-        // validate possibly already incorrect variable definitions
-        if (type == EXISTING_VARIABLE) {
-            nameEntered = locationEntered = true;
-            validateVariableValue();
-        }
-
-        Dialog.applyDialogFont(parentComposite);
-        
-        return contents;
-    }
-
-    /**
-     * Creates and configures this dialog's main composite.
-     * 
-     * @param parentComposite parent's composite
-     * @return this dialog's main composite
-     */
-    private Composite createComposite(Composite parentComposite) {
-        // creates a composite with standard margins and spacing
-        Composite contents = new Composite(parentComposite, SWT.NONE);
-
-        contents.setLayout(new GridLayout(3, false));
-        contents.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        if (newVariable) {
-			setTitle(IDEWorkbenchMessages.PathVariableDialog_dialogTitle_newVariable);
-		} else {
-			setTitle(IDEWorkbenchMessages.PathVariableDialog_dialogTitle_existingVariable);
-		}
-        setMessage(standardMessage);
-        return contents;
-    }
-
-    /**
-     * Creates widgets for this dialog.
-     * 
-     * @param contents the parent composite where to create widgets
-     */
-    private void createWidgets(Composite contents) {
-        String nameLabelText = IDEWorkbenchMessages.PathVariableDialog_variableName;
-        String valueLabelText = IDEWorkbenchMessages.PathVariableDialog_variableValue;
-
-        // variable name label
-        variableNameLabel = new Label(contents, SWT.LEAD);
-        variableNameLabel.setText(nameLabelText);
-     
-        // variable name field.  Attachments done after all widgets created.
-        variableNameField = new Text(contents, SWT.SINGLE | SWT.BORDER);
-        variableNameField.setText(variableName);
-        variableNameField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
-        		false));
-        variableNameField.addModifyListener(new ModifyListener() {
-            public void modifyText(ModifyEvent event) {
-                variableNameModified();
-            }
-        });
-        
-        // this is a padding control to take up space in the GridLayout
-        new Label(contents, SWT.LEAD);
-        
-        // variable value label
-        variableValueLabel = new Label(contents, SWT.LEAD);
-        variableValueLabel.setText(valueLabelText);
-
-        // variable value field.  Attachments done after all widgets created.
-        variableValueField = new Text(contents, SWT.SINGLE | SWT.BORDER);
-        variableValueField.setText(variableValue);
-        variableValueField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
-        		false));
-        variableValueField.addModifyListener(new ModifyListener() {
-            public void modifyText(ModifyEvent event) {
-                variableValueModified();
-            }
-        });
-        
-        Composite buttonsComposite = new Composite(contents, SWT.NONE);
-        buttonsComposite.setLayoutData(new GridData(SWT.END, SWT.CENTER, false,
-        		false));
-        GridLayout layout = new GridLayout(2, true);
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        buttonsComposite.setLayout(layout);
-
-        // select file path button
-        fileButton = new Button(buttonsComposite, SWT.PUSH);
-        fileButton.setText(IDEWorkbenchMessages.PathVariableDialog_file);
-        fileButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
-        		false));
-        if ((variableType & IResource.FILE) == 0) {
-			fileButton.setEnabled(false);
-		}
-
-        fileButton.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                selectFile();
-            }
-        });
-
-        // select folder path button
-        folderButton = new Button(buttonsComposite, SWT.PUSH);
-        folderButton.setText(IDEWorkbenchMessages.PathVariableDialog_folder);
-        folderButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
-        		false));
-        if ((variableType & IResource.FOLDER) == 0) {
-			folderButton.setEnabled(false);
-		}
-
-        folderButton.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                selectFolder();
-            }
-        });
-    }
-
-    /**
-     * Fires validations (variable name first) and updates enabled state for the
-     * "Ok" button accordingly.
-     */
-    private void variableNameModified() {
-        // updates and validates the variable name
-        variableName = variableNameField.getText();
-        validationStatus = IMessageProvider.NONE;
-        okButton.setEnabled(validateVariableName() && validateVariableValue());
-        nameEntered = true;
-    }
-
-    /**
-     * Fires validations (variable value first) and updates enabled state for the
-     * "Ok" button accordingly.
-     */
-    private void variableValueModified() {
-        // updates and validates the variable value
-        variableValue = variableValueField.getText().trim();
-        validationStatus = IMessageProvider.NONE;
-        okButton.setEnabled(validateVariableValue() && validateVariableName());
-        locationEntered = true;
-    }
-
-    /**
-     * Opens a dialog where the user can select a folder path.
-     */
-    private void selectFolder() {
-        DirectoryDialog dialog = new DirectoryDialog(getShell());
-        dialog.setText(IDEWorkbenchMessages.PathVariableDialog_selectFolderTitle);
-        dialog.setMessage(IDEWorkbenchMessages.PathVariableDialog_selectFolderMessage);
-        dialog.setFilterPath(variableValue);
-        String res = dialog.open();
-        if (res != null) {
-            variableValue = new Path(res).makeAbsolute().toOSString();
-            variableValueField.setText(variableValue);
-        }
-    }
-
-    /**
-     * Opens a dialog where the user can select a file path.
-     */
-    private void selectFile() {
-        FileDialog dialog = new FileDialog(getShell());
-        dialog.setText(IDEWorkbenchMessages.PathVariableDialog_selectFileTitle);
-        dialog.setFilterPath(variableValue);
-        String res = dialog.open();
-        if (res != null) {
-            variableValue = new Path(res).makeAbsolute().toOSString();
-            variableValueField.setText(variableValue);
-        }
-    }
-
-    /**
-     * Adds buttons to this dialog's button bar.
-     * 
-     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar
-     */
-    protected void createButtonsForButtonBar(Composite parent) {
-        okButton = createButton(parent, IDialogConstants.OK_ID,
-                IDialogConstants.OK_LABEL, true);
-        okButton.setEnabled(type == EXISTING_VARIABLE);
-
-        createButton(parent, IDialogConstants.CANCEL_ID,
-                IDialogConstants.CANCEL_LABEL, false);
-    }
-
-    /**
-     * Validates the current variable name, and updates this dialog's message.
-     * 
-     * @return true if the name is valid, false otherwise
-     */
-    private boolean validateVariableName() {
-        boolean allowFinish = false;
-
-        // if the current validationStatus is ERROR, no additional validation applies
-        if (validationStatus == IMessageProvider.ERROR) {
-			return false;
-		}
-
-        // assumes everything will be ok
-        String message = standardMessage;
-        int newValidationStatus = IMessageProvider.NONE;
-
-        if (variableName.length() == 0) {
-            // the variable name is empty
-            if (nameEntered) {
-                // a name was entered before and is now empty
-                newValidationStatus = IMessageProvider.ERROR;
-                message = IDEWorkbenchMessages.PathVariableDialog_variableNameEmptyMessage;
-            }
-        } else {
-            IStatus status = pathVariableManager.validateName(variableName);
-            if (!status.isOK()) {
-                // the variable name is not valid
-                newValidationStatus = IMessageProvider.ERROR;
-                message = status.getMessage();
-            } else if (namesInUse.contains(variableName)
-                    && !variableName.equals(originalName)) {
-                // the variable name is already in use
-                message = IDEWorkbenchMessages.PathVariableDialog_variableAlreadyExistsMessage;
-                newValidationStatus = IMessageProvider.ERROR;
-            } else {
-                allowFinish = true;
-            }
-        }
-
-        // overwrite the current validation status / message only if everything is ok (clearing them)
-        // or if we have a more serious problem than the current one
-        if (validationStatus == IMessageProvider.NONE
-                || newValidationStatus == IMessageProvider.ERROR) {
-            validationStatus = newValidationStatus;
-            validationMessage = message;
-        }
-        // only set the message here if it is not going to be set in 
-        // validateVariableValue to avoid flashing.
-        if (allowFinish == false) {
-			setMessage(validationMessage, validationStatus);
-		}
-        return allowFinish;
-    }
-
-    /**
-     * Validates the current variable value, and updates this dialog's message.
-     * 
-     * @return true if the value is valid, false otherwise
-     */
-    private boolean validateVariableValue() {
-        boolean allowFinish = false;
-
-        // if the current validationStatus is ERROR, no additional validation applies
-        if (validationStatus == IMessageProvider.ERROR) {
-			return false;
-		}
-
-        // assumes everything will be ok
-        String message = standardMessage;
-        int newValidationStatus = IMessageProvider.NONE;
-
-        if (variableValue.length() == 0) {
-            // the variable value is empty
-            if (locationEntered) {
-                // a location value was entered before and is now empty
-                newValidationStatus = IMessageProvider.ERROR;
-                message = IDEWorkbenchMessages.PathVariableDialog_variableValueEmptyMessage;
-            }
-        } else if (!Path.EMPTY.isValidPath(variableValue)) {
-            // the variable value is an invalid path
-            message = IDEWorkbenchMessages.PathVariableDialog_variableValueInvalidMessage;
-            newValidationStatus = IMessageProvider.ERROR;
-        } else if (!new Path(variableValue).isAbsolute()) {
-            // the variable value is a relative path
-            message = IDEWorkbenchMessages.PathVariableDialog_pathIsRelativeMessage;
-            newValidationStatus = IMessageProvider.ERROR;
-        } else if (!IDEResourceInfoUtils.exists(variableValue)) {
-            // the path does not exist (warning)
-            message = IDEWorkbenchMessages.PathVariableDialog_pathDoesNotExistMessage;
-            newValidationStatus = IMessageProvider.WARNING;
-            allowFinish = true;
-        } else {
-            allowFinish = true;
-        }
-
-        // overwrite the current validation status / message only if everything is ok (clearing them)
-        // or if we have a more serious problem than the current one
-        if (validationStatus == IMessageProvider.NONE
-                || newValidationStatus > validationStatus) {
-            validationStatus = newValidationStatus;
-            validationMessage = message;
-        }
-        setMessage(validationMessage, validationStatus);
-        return allowFinish;
-    }
-
-    /**
-     * Returns the variable name.
-     * 
-     * @return the variable name
-     */
-    public String getVariableName() {
-        return variableName;
-    }
-
-    /**
-     * Returns the variable value.
-     * 
-     * @return the variable value
-     */
-    public String getVariableValue() {
-        return variableValue;
-    }
-
-    /**
-     * Sets the variable name.
-     * 
-     * @param variableName the new variable name
-     */
-    public void setVariableName(String variableName) {
-        this.variableName = variableName.trim();
-        this.originalName = this.variableName;
-    }
-
-    /**
-     * Sets the variable value.
-     * 
-     * @param variableValue the new variable value
-     */
-    public void setVariableValue(String variableValue) {
-        this.variableValue = variableValue;
-    }
-    
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#isResizable()
-     */
-    protected boolean isResizable() {
-    	return true;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/PathVariablesGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/PathVariablesGroup.java
deleted file mode 100644
index 60a167a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/PathVariablesGroup.java
+++ /dev/null
@@ -1,583 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.resources.IPathVariableManager;
-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.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-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.TableItem;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * A widget group that displays path variables. 
- * Includes buttons to edit, remove existing variables and create new ones.
- * 
- * @since 2.1
- */
-public class PathVariablesGroup {
-    /**
-     * Simple data structure that holds a path variable name/value pair.
-     */
-    public static class PathVariableElement {
-        /**
-         * The name of the element.
-         */
-        public String name;
-
-        /**
-         * The path of the element.
-         */
-        public IPath path;
-    }
-
-    // sizing constants
-    private static final int SIZING_SELECTION_PANE_WIDTH = 400;
-
-    // parent shell
-    private Shell shell;
-
-    private Label variableLabel;
-
-    private Table variableTable;
-
-    private Button addButton;
-
-    private Button editButton;
-
-    private Button removeButton;
-
-    // used to compute layout sizes
-    private FontMetrics fontMetrics;
-
-    // create a multi select table
-    private boolean multiSelect;
-
-    // IResource.FILE and/or IResource.FOLDER
-    private int variableType;
-
-    // External listener called when the table selection changes
-    private Listener selectionListener;
-
-    // temporary collection for keeping currently defined variables
-    private SortedMap tempPathVariables;
-
-    // set of removed variables' names
-    private Set removedVariableNames;
-
-    // reference to the workspace's path variable manager
-    private IPathVariableManager pathVariableManager;
-
-    // file image
-    private final Image FILE_IMG = PlatformUI.getWorkbench().getSharedImages()
-            .getImage(ISharedImages.IMG_OBJ_FILE);
-
-    // folder image
-    private final Image FOLDER_IMG = PlatformUI.getWorkbench()
-            .getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
-
-    // unknown (non-existent) image. created locally, dispose locally
-    private Image imageUnkown;
-
-    /**
-     * Creates a new PathVariablesGroup.
-     *
-     * @param multiSelect create a multi select tree
-     * @param variableType the type of variables that are displayed in 
-     * 	the widget group. <code>IResource.FILE</code> and/or <code>IResource.FOLDER</code>
-     * 	logically ORed together.
-     */
-    public PathVariablesGroup(boolean multiSelect, int variableType) {
-        this.multiSelect = multiSelect;
-        this.variableType = variableType;
-        pathVariableManager = ResourcesPlugin.getWorkspace()
-                .getPathVariableManager();
-        removedVariableNames = new HashSet();
-        tempPathVariables = new TreeMap();
-        // initialize internal model
-        initTemporaryState();
-    }
-
-    /**
-     * Creates a new PathVariablesGroup.
-     *
-     * @param multiSelect create a multi select tree
-     * @param variableType the type of variables that are displayed in 
-     * 	the widget group. <code>IResource.FILE</code> and/or <code>IResource.FOLDER</code>
-     * 	logically ORed together.
-     * @param selectionListener listener notified when the selection changes
-     * 	in the variables list.
-     */
-    public PathVariablesGroup(boolean multiSelect, int variableType,
-            Listener selectionListener) {
-        this(multiSelect, variableType);
-        this.selectionListener = selectionListener;
-    }
-
-    /**
-     * Opens a dialog for creating a new variable.
-     */
-    private void addNewVariable() {
-        // constructs a dialog for editing the new variable's current name and value
-        PathVariableDialog dialog = new PathVariableDialog(shell,
-                PathVariableDialog.NEW_VARIABLE, variableType,
-                pathVariableManager, tempPathVariables.keySet());
-
-        // opens the dialog - just returns if the user cancels it
-        if (dialog.open() == Window.CANCEL) {
-			return;
-		}
-
-        // otherwise, adds the new variable (or updates an existing one) in the
-        // temporary collection of currently defined variables
-        String newVariableName = dialog.getVariableName();
-        IPath newVariableValue = new Path(dialog.getVariableValue());
-        tempPathVariables.put(newVariableName, newVariableValue);
-
-        // the UI must be updated
-        updateWidgetState(newVariableName);
-    }
-
-    /**
-     * Creates the widget group.
-     * Callers must call <code>dispose</code> when the group is no 
-     * longer needed.
-     * 
-     * @param parent the widget parent
-     * @return container of the widgets 
-     */
-    public Control createContents(Composite parent) {
-        Font font = parent.getFont();
-
-        if (imageUnkown == null) {
-            ImageDescriptor descriptor = AbstractUIPlugin
-                    .imageDescriptorFromPlugin(
-                            IDEWorkbenchPlugin.IDE_WORKBENCH,
-                            "$nl$/icons/full/obj16/warning.gif"); //$NON-NLS-1$
-            imageUnkown = descriptor.createImage();
-        }
-        initializeDialogUnits(parent);
-        shell = parent.getShell();
-
-        // define container & its layout
-        Composite pageComponent = new Composite(parent, SWT.NULL);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        pageComponent.setLayout(layout);
-        GridData data = new GridData(GridData.FILL_BOTH);
-        data.widthHint = SIZING_SELECTION_PANE_WIDTH;
-        pageComponent.setLayoutData(data);
-        pageComponent.setFont(font);
-
-        // layout the table & its buttons
-        variableLabel = new Label(pageComponent, SWT.LEFT);
-        variableLabel.setText(IDEWorkbenchMessages.PathVariablesBlock_variablesLabel);
-        data = new GridData();
-        data.horizontalAlignment = GridData.FILL;
-        data.horizontalSpan = 2;
-        variableLabel.setLayoutData(data);
-        variableLabel.setFont(font);
-
-        int tableStyle = SWT.BORDER | SWT.FULL_SELECTION;
-        if (multiSelect) {
-            tableStyle |= SWT.MULTI;
-        }
-        variableTable = new Table(pageComponent, tableStyle);
-        variableTable.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                updateEnabledState();
-                if (selectionListener != null) {
-					selectionListener.handleEvent(new Event());
-				}
-            }
-        });
-        data = new GridData(GridData.FILL_BOTH);
-        data.heightHint = variableTable.getItemHeight() * 7;
-        variableTable.setLayoutData(data);
-        variableTable.setFont(font);
-
-        createButtonGroup(pageComponent);
-        // populate table with current internal state and set buttons' initial state
-        updateWidgetState(null);
-
-        return pageComponent;
-    }
-
-    /**
-     * Disposes the group's resources. 
-     */
-    public void dispose() {
-        if (imageUnkown != null) {
-            imageUnkown.dispose();
-            imageUnkown = null;
-        }
-    }
-
-    /**
-     * Opens a dialog for editing an existing variable.
-     *
-     * @see PathVariableDialog
-     */
-    private void editSelectedVariable() {
-        // retrieves the name and value for the currently selected variable
-        TableItem item = variableTable.getItem(variableTable
-                .getSelectionIndex());
-        String variableName = (String) item.getData();
-        IPath variableValue = (IPath) tempPathVariables.get(variableName);
-
-        // constructs a dialog for editing the variable's current name and value
-        PathVariableDialog dialog = new PathVariableDialog(shell,
-                PathVariableDialog.EXISTING_VARIABLE, variableType,
-                pathVariableManager, tempPathVariables.keySet());
-        dialog.setVariableName(variableName);
-        dialog.setVariableValue(variableValue.toOSString());
-
-        // opens the dialog - just returns if the user cancels it
-        if (dialog.open() == Window.CANCEL) {
-			return;
-		}
-
-        // the name can be changed, so we remove the current variable definition...
-        removedVariableNames.add(variableName);
-        tempPathVariables.remove(variableName);
-
-        String newVariableName = dialog.getVariableName();
-        IPath newVariableValue = new Path(dialog.getVariableValue());
-
-        // and add it again (maybe with a different name)
-        tempPathVariables.put(newVariableName, newVariableValue);
-
-        // now we must refresh the UI state
-        updateWidgetState(newVariableName);
-
-    }
-
-    /**
-     * Returns the enabled state of the group's widgets.
-     * Returns <code>true</code> if called prior to calling 
-     * <code>createContents</code>.
-     * 
-     * @return boolean the enabled state of the group's widgets.
-     * 	 <code>true</code> if called prior to calling <code>createContents</code>.
-     */
-    public boolean getEnabled() {
-        if (variableTable != null && !variableTable.isDisposed()) {
-            return variableTable.getEnabled();
-        }
-        return true;
-    }
-
-    /**
-     * Returns the selected variables.
-     *  
-     * @return the selected variables. Returns an empty array if 
-     * 	the widget group has not been created yet by calling 
-     * 	<code>createContents</code>
-     */
-    public PathVariableElement[] getSelection() {
-        if (variableTable == null) {
-            return new PathVariableElement[0];
-        }
-        TableItem[] items = variableTable.getSelection();
-        PathVariableElement[] selection = new PathVariableElement[items.length];
-
-        for (int i = 0; i < items.length; i++) {
-            String name = (String) items[i].getData();
-            selection[i] = new PathVariableElement();
-            selection[i].name = name;
-            selection[i].path = (IPath) tempPathVariables.get(name);
-        }
-        return selection;
-    }
-
-    /**
-     * Creates the add/edit/remove buttons
-     * 
-     * @param parent the widget parent
-     */
-    private void createButtonGroup(Composite parent) {
-        Font font = parent.getFont();
-        Composite groupComponent = new Composite(parent, SWT.NULL);
-        GridLayout groupLayout = new GridLayout();
-        groupLayout.marginWidth = 0;
-        groupLayout.marginHeight = 0;
-        groupComponent.setLayout(groupLayout);
-        GridData data = new GridData();
-        data.verticalAlignment = GridData.FILL;
-        data.horizontalAlignment = GridData.FILL;
-        groupComponent.setLayoutData(data);
-        groupComponent.setFont(font);
-
-        addButton = new Button(groupComponent, SWT.PUSH);
-        addButton.setText(IDEWorkbenchMessages.PathVariablesBlock_addVariableButton);
-        addButton.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                addNewVariable();
-            }
-        });
-        addButton.setFont(font);
-        setButtonLayoutData(addButton);
-
-        editButton = new Button(groupComponent, SWT.PUSH);
-        editButton.setText(IDEWorkbenchMessages.PathVariablesBlock_editVariableButton);
-        editButton.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                editSelectedVariable();
-            }
-        });
-        editButton.setFont(font);
-        setButtonLayoutData(editButton);
-
-        removeButton = new Button(groupComponent, SWT.PUSH);
-        removeButton.setText(IDEWorkbenchMessages.PathVariablesBlock_removeVariableButton);
-        removeButton.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                removeSelectedVariables();
-            }
-        });
-        removeButton.setFont(font);
-        setButtonLayoutData(removeButton);
-    }
-
-    /**
-     * Initializes the computation of horizontal and vertical dialog units
-     * based on the size of current font.
-     * <p>
-     * This method must be called before <code>setButtonLayoutData</code> 
-     * is called.
-     * </p>
-     *
-     * @param control a control from which to obtain the current font
-     */
-    protected void initializeDialogUnits(Control control) {
-        // Compute and store a font metric
-        GC gc = new GC(control);
-        gc.setFont(control.getFont());
-        fontMetrics = gc.getFontMetrics();
-        gc.dispose();
-    }
-
-    /**
-     * (Re-)Initialize collections used to mantain temporary variable state.
-     */
-    private void initTemporaryState() {
-        String[] varNames = pathVariableManager.getPathVariableNames();
-
-        tempPathVariables.clear();
-        for (int i = 0; i < varNames.length; i++) {
-            IPath value = pathVariableManager.getValue(varNames[i]);
-
-            // the value may not exist any more
-            if (value != null) {
-                boolean isFile = value.toFile().isFile();
-                if ((isFile && (variableType & IResource.FILE) != 0)
-                        || (isFile == false && (variableType & IResource.FOLDER) != 0)) {
-
-                    tempPathVariables.put(varNames[i], value);
-                }
-            }
-        }
-        removedVariableNames.clear();
-    }
-
-    /**
-     * Updates button enabled state, depending on the number of currently selected
-     * variables in the table.
-     */
-    private void updateEnabledState() {
-        int itemsSelectedCount = variableTable.getSelectionCount();
-        editButton.setEnabled(itemsSelectedCount == 1);
-        removeButton.setEnabled(itemsSelectedCount > 0);
-    }
-
-    /**
-     * Rebuilds table widget state with the current list of variables (reflecting
-     * any changes, additions and removals), and selects the item corresponding to
-     * the given variable name. If the variable name is <code>null</code>, the
-     * first item (if any) will be selected.
-     * 
-     * @param selectedVarName the name for the variable to be selected (may be
-     * <code>null</code>)
-     * @see IPathVariableManager#getPathVariableNames()
-     * @see IPathVariableManager#getValue(String)
-     */
-    private void updateVariableTable(String selectedVarName) {
-        variableTable.removeAll();
-        int selectedVarIndex = 0;
-        for (Iterator varNames = tempPathVariables.keySet().iterator(); varNames
-                .hasNext();) {
-            TableItem item = new TableItem(variableTable, SWT.NONE);
-            String varName = (String) varNames.next();
-            IPath value = (IPath) tempPathVariables.get(varName);
-            IFileInfo file = IDEResourceInfoUtils.getFileInfo(value);
-
-            item.setText(varName + " - " + value.toOSString()); //$NON-NLS-1$ 
-            // the corresponding variable name is stored in each table widget item
-            item.setData(varName);
-            item.setImage(file.exists() ? (file.isDirectory() ? FOLDER_IMG 
-                    : FILE_IMG ) : imageUnkown);
-            if (varName.equals(selectedVarName)) {
-				selectedVarIndex = variableTable.getItemCount() - 1;
-			}
-        }
-        if (variableTable.getItemCount() > selectedVarIndex) {
-            variableTable.setSelection(selectedVarIndex);
-            if (selectionListener != null) {
-				selectionListener.handleEvent(new Event());
-			}
-        } else if (variableTable.getItemCount() == 0
-                && selectionListener != null) {
-			selectionListener.handleEvent(new Event());
-		}
-    }
-
-    /**
-     * Commits the temporary state to the path variable manager in response to user
-     * confirmation.
-     * @return boolean <code>true</code> if there were no problems.
-     * @see IPathVariableManager#setValue(String, IPath)
-     */
-    public boolean performOk() {
-        try {
-            // first process removed variables  
-            for (Iterator removed = removedVariableNames.iterator(); removed
-                    .hasNext();) {
-                String removedVariableName = (String) removed.next();
-                // only removes variables that have not been added again
-                if (!tempPathVariables.containsKey(removedVariableName)) {
-					pathVariableManager.setValue(removedVariableName, null);
-				}
-            }
-
-            // then process the current collection of variables, adding/updating them
-            for (Iterator current = tempPathVariables.entrySet().iterator(); current
-                    .hasNext();) {
-                Map.Entry entry = (Map.Entry) current.next();
-                String variableName = (String) entry.getKey();
-                IPath variableValue = (IPath) entry.getValue();
-                pathVariableManager.setValue(variableName, variableValue);
-            }
-            // re-initialize temporary state
-            initTemporaryState();
-
-            // performOk accepted
-            return true;
-        } catch (CoreException ce) {
-            ErrorDialog.openError(shell, null, null, ce.getStatus());
-        }
-        return false;
-    }
-
-    /**
-     * Removes the currently selected variables.
-     */
-    private void removeSelectedVariables() {
-        // remove each selected element
-        int[] selectedIndices = variableTable.getSelectionIndices();
-        for (int i = 0; i < selectedIndices.length; i++) {
-            TableItem selectedItem = variableTable.getItem(selectedIndices[i]);
-            String varName = (String) selectedItem.getData();
-            removedVariableNames.add(varName);
-            tempPathVariables.remove(varName);
-        }
-        updateWidgetState(null);
-    }
-
-    /**
-     * Sets the <code>GridData</code> on the specified button to
-     * be one that is spaced for the current dialog page units. The
-     * method <code>initializeDialogUnits</code> must be called once
-     * before calling this method for the first time.
-     *
-     * @param button the button to set the <code>GridData</code>
-     * @return the <code>GridData</code> set on the specified button
-     */
-    private GridData setButtonLayoutData(Button button) {
-        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        int widthHint = Dialog.convertHorizontalDLUsToPixels(fontMetrics,
-                IDialogConstants.BUTTON_WIDTH);
-        data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT,
-                SWT.DEFAULT, true).x);
-        button.setLayoutData(data);
-        return data;
-    }
-
-    /**
-     * Sets the enabled state of the group's widgets.
-     * Does nothing if called prior to calling <code>createContents</code>.
-     * 
-     * @param enabled the new enabled state of the group's widgets
-     */
-    public void setEnabled(boolean enabled) {
-        if (variableTable != null && !variableTable.isDisposed()) {
-            variableLabel.setEnabled(enabled);
-            variableTable.setEnabled(enabled);
-            addButton.setEnabled(enabled);
-            if (enabled) {
-				updateEnabledState();
-			} else {
-                editButton.setEnabled(enabled);
-                removeButton.setEnabled(enabled);
-            }
-        }
-    }
-
-    /**
-     * Updates the widget's current state: refreshes the table with the current 
-     * defined variables, selects the item corresponding to the given variable 
-     * (selects the first item if <code>null</code> is provided) and updates 
-     * the enabled state for the Add/Remove/Edit buttons.
-     * 
-     * @param selectedVarName the name of the variable to be selected (may be null)
-     */
-    private void updateWidgetState(String selectedVarName) {
-        updateVariableTable(selectedVarName);
-        updateEnabledState();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ProjectContentsLocationArea.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ProjectContentsLocationArea.java
deleted file mode 100644
index ae58c26..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ProjectContentsLocationArea.java
+++ /dev/null
@@ -1,493 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Neil Rickards <neil.rickards@arm.com> - fix for Bug 161026
- *     		[Wizards] ProjectContentsLocationArea uses wrong file separator
- *     Oakland Software Incorporated (Francis Upton) <francisu@ieee.org>
- *		    Bug 224997 [Workbench] Impossible to copy project
- *     Alena Laskavaia - fix for bug 2035
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.URIUtil;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.osgi.util.TextProcessor;
-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.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.filesystem.FileSystemConfiguration;
-import org.eclipse.ui.internal.ide.filesystem.FileSystemSupportRegistry;
-
-/**
- * ProjectContentsLocationArea is a convenience class for area that handle entry
- * of locations using URIs.
- * 
- * @since 3.2
- * 
- */
-public class ProjectContentsLocationArea {
-	/**
-	 * IErrorMessageReporter is an interface for type that allow message
-	 * reporting.
-	 * 
-	 */
-	public interface IErrorMessageReporter {
-		/**
-		 * Report the error message
-		 * 
-		 * @param errorMessage
-		 *            String or <code>null</code>. If the errorMessage is
-		 *            null then clear any error state.
-		 * @param infoOnly
-		 *            the message is an informational message, but the dialog
-		 *            cannot continue
-		 * 
-		 */
-		public void reportError(String errorMessage, boolean infoOnly);
-	}
-
-	private static String BROWSE_LABEL = IDEWorkbenchMessages.ProjectLocationSelectionDialog_browseLabel;
-
-	private static final int SIZING_TEXT_FIELD_WIDTH = 250;
-
-	private static final String FILE_SCHEME = "file"; //$NON-NLS-1$
-
-	private static final String SAVED_LOCATION_ATTR = "OUTSIDE_LOCATION"; //$NON-NLS-1$
-
-	private Label locationLabel;
-
-	private Text locationPathField;
-
-	private Button browseButton;
-
-	private IErrorMessageReporter errorReporter;
-
-	private String projectName = IDEResourceInfoUtils.EMPTY_STRING;
-
-	private String userPath = IDEResourceInfoUtils.EMPTY_STRING;
-
-	private Button useDefaultsButton;
-
-	private IProject existingProject;
-
-	private FileSystemSelectionArea fileSystemSelectionArea;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param reporter
-	 * @param composite
-	 * @param startProject
-	 */
-	public ProjectContentsLocationArea(IErrorMessageReporter reporter,
-			Composite composite, IProject startProject) {
-
-		errorReporter = reporter;
-		projectName = startProject.getName();
-		existingProject = startProject;
-		createContents(composite, false);
-	}
-
-	/**
-	 * Set the project to base the contents off of.
-	 *
-	 * @param existingProject
-	 */
-	public void setExistingProject(IProject existingProject) {
-		projectName = existingProject.getName();
-		this.existingProject = existingProject;
-	}
-
-	/**
-	 * Create a new instance of a ProjectContentsLocationArea.
-	 * 
-	 * @param reporter
-	 * @param composite
-	 */
-	public ProjectContentsLocationArea(IErrorMessageReporter reporter,
-			Composite composite) {
-		errorReporter = reporter;
-
-		// If it is a new project always start enabled
-		createContents(composite, true);
-	}
-
-	/**
-	 * Create the contents of the receiver.
-	 * 
-	 * @param composite
-	 * @param defaultEnabled
-	 */
-	private void createContents(Composite composite, boolean defaultEnabled) {
-
-		int columns = 4;
-
-		// project specification group
-		Composite projectGroup = new Composite(composite, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = columns;
-		projectGroup.setLayout(layout);
-		projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		useDefaultsButton = new Button(projectGroup, SWT.CHECK | SWT.RIGHT);
-		useDefaultsButton
-				.setText(IDEWorkbenchMessages.ProjectLocationSelectionDialog_useDefaultLabel);
-		useDefaultsButton.setSelection(defaultEnabled);
-		GridData buttonData = new GridData();
-		buttonData.horizontalSpan = columns;
-		useDefaultsButton.setLayoutData(buttonData);
-
-		createUserEntryArea(projectGroup, defaultEnabled);
-
-		useDefaultsButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				boolean useDefaults = useDefaultsButton.getSelection();
-
-				if (useDefaults) {
-					userPath = locationPathField.getText();
-					locationPathField.setText(TextProcessor
-							.process(getDefaultPathDisplayString()));
-				} else {
-					locationPathField.setText(TextProcessor.process(userPath));
-				}
-				String error = checkValidLocation();
-				errorReporter.reportError(error,
-						error != null && error.equals(IDEWorkbenchMessages.WizardNewProjectCreationPage_projectLocationEmpty));
-				setUserAreaEnabled(!useDefaults);
-			}
-		});
-		setUserAreaEnabled(!defaultEnabled);
-	}
-
-	/**
-	 * Return whether or not we are currently showing the default location for
-	 * the project.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isDefault() {
-		return useDefaultsButton.getSelection();
-	}
-
-	/**
-	 * Create the area for user entry.
-	 * 
-	 * @param composite
-	 * @param defaultEnabled
-	 */
-	private void createUserEntryArea(Composite composite, boolean defaultEnabled) {
-		// location label
-		locationLabel = new Label(composite, SWT.NONE);
-		locationLabel
-				.setText(IDEWorkbenchMessages.ProjectLocationSelectionDialog_locationLabel);
-
-		// project location entry field
-		locationPathField = new Text(composite, SWT.BORDER);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-		data.horizontalSpan = 2;
-		locationPathField.setLayoutData(data);
-
-		// browse button
-		browseButton = new Button(composite, SWT.PUSH);
-		browseButton.setText(BROWSE_LABEL);
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				handleLocationBrowseButtonPressed();
-			}
-		});
-
-		createFileSystemSelection(composite);
-
-		if (defaultEnabled) {
-			locationPathField.setText(TextProcessor
-					.process(getDefaultPathDisplayString()));
-		} else {
-			if (existingProject == null) {
-				locationPathField.setText(IDEResourceInfoUtils.EMPTY_STRING);
-			} else {
-				locationPathField.setText(TextProcessor.process(existingProject
-						.getLocation().toOSString()));
-			}
-		}
-
-		locationPathField.addModifyListener(new ModifyListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
-			 */
-			public void modifyText(ModifyEvent e) {
-				errorReporter.reportError(checkValidLocation(), false);
-			}
-		});
-	}
-
-	/**
-	 * Create the file system selection area.
-	 * 
-	 * @param composite
-	 */
-	private void createFileSystemSelection(Composite composite) {
-
-		// Always use the default if that is all there is.
-		if (FileSystemSupportRegistry.getInstance().hasOneFileSystem()) {
-			return;
-		}
-
-		new Label(composite, SWT.NONE);
-
-		fileSystemSelectionArea = new FileSystemSelectionArea();
-		fileSystemSelectionArea.createContents(composite);
-	}
-
-	/**
-	 * Return the path we are going to display. If it is a file URI then remove
-	 * the file prefix.
-	 * 
-	 * @return String
-	 */
-	private String getDefaultPathDisplayString() {
-
-		URI defaultURI = null;
-		if (existingProject != null) {
-			defaultURI = existingProject.getLocationURI();
-		}
-
-		// Handle files specially. Assume a file if there is no project to query
-		if (defaultURI == null || defaultURI.getScheme().equals(FILE_SCHEME)) {
-			return Platform.getLocation().append(projectName).toOSString();
-		}
-		return defaultURI.toString();
-
-	}
-
-	/**
-	 * Set the enablement state of the receiver.
-	 * 
-	 * @param enabled
-	 */
-	private void setUserAreaEnabled(boolean enabled) {
-
-		locationLabel.setEnabled(enabled);
-		locationPathField.setEnabled(enabled);
-		browseButton.setEnabled(enabled);
-		if (fileSystemSelectionArea != null) {
-			fileSystemSelectionArea.setEnabled(enabled);
-		}
-	}
-
-	/**
-	 * Return the browse button. Usually referenced in order to set the layout
-	 * data for a dialog.
-	 * 
-	 * @return Button
-	 */
-	public Button getBrowseButton() {
-		return browseButton;
-	}
-
-	private IDialogSettings getDialogSettings() {
-		IDialogSettings ideDialogSettings = IDEWorkbenchPlugin.getDefault().getDialogSettings();
-		IDialogSettings result = ideDialogSettings.getSection(getClass().getName());
-		if (result == null) {
-			result = ideDialogSettings.addNewSection(getClass().getName());
-		}
-		return result;
-	}
-	
-	/**
-	 * Open an appropriate directory browser
-	 */
-	private void handleLocationBrowseButtonPressed() {
-
-		String selectedDirectory = null;
-		String dirName = getPathFromLocationField();
-
-		if (!dirName.equals(IDEResourceInfoUtils.EMPTY_STRING)) {
-			IFileInfo info;
-			info = IDEResourceInfoUtils.getFileInfo(dirName);
-
-			if (info == null || !(info.exists()))
-				dirName = IDEResourceInfoUtils.EMPTY_STRING;
-		} else {
-			String value = getDialogSettings().get(SAVED_LOCATION_ATTR);
-			if (value != null) {
-				dirName = value;
-			}
-		}
-
-		FileSystemConfiguration config = getSelectedConfiguration();
-		if (config== null || config.equals(
-				FileSystemSupportRegistry.getInstance()
-						.getDefaultConfiguration())) {
-			DirectoryDialog dialog = new DirectoryDialog(locationPathField
-					.getShell());
-			dialog
-					.setMessage(IDEWorkbenchMessages.ProjectLocationSelectionDialog_directoryLabel);
-
-			dialog.setFilterPath(dirName);
-
-			selectedDirectory = dialog.open();
-
-		} else {
-			URI uri = getSelectedConfiguration().getContributor()
-					.browseFileSystem(dirName, browseButton.getShell());
-			if (uri != null)
-				selectedDirectory = uri.toString();
-		}
-
-		if (selectedDirectory != null) {
-			updateLocationField(selectedDirectory);
-			getDialogSettings().put(SAVED_LOCATION_ATTR, selectedDirectory);
-		}
-	}
-
-	/**
-	 * Update the location field based on the selected path.
-	 * 
-	 * @param selectedPath
-	 */
-	private void updateLocationField(String selectedPath) {
-		locationPathField.setText(TextProcessor.process(selectedPath));
-	}
-
-	/**
-	 * Return the path on the location field.
-	 * 
-	 * @return String
-	 */
-	private String getPathFromLocationField() {
-		URI fieldURI;
-		try {
-			fieldURI = new URI(locationPathField.getText());
-		} catch (URISyntaxException e) {
-			return locationPathField.getText();
-		}
-		return fieldURI.getPath();
-	}
-
-	/**
-	 * Check if the entry in the widget location is valid. If it is valid return
-	 * null. Otherwise return a string that indicates the problem.
-	 * 
-	 * @return String
-	 */
-	public String checkValidLocation() {
-
-		String locationFieldContents = locationPathField.getText();
-		if (locationFieldContents.length() == 0) {
-			return IDEWorkbenchMessages.WizardNewProjectCreationPage_projectLocationEmpty;
-		}
-
-		URI newPath = getProjectLocationURI();
-		if (newPath == null) {
-			return IDEWorkbenchMessages.ProjectLocationSelectionDialog_locationError;
-		}
-
-		if (existingProject != null) {
-			URI projectPath = existingProject.getLocationURI();
-			if (projectPath != null && URIUtil.equals(projectPath, newPath)) {
-				return IDEWorkbenchMessages.ProjectLocationSelectionDialog_locationIsSelf;
-			}
-		}
-
-		if (!isDefault()) {
-			IStatus locationStatus = ResourcesPlugin.getWorkspace()
-					.validateProjectLocationURI(existingProject, newPath);
-
-			if (!locationStatus.isOK()) {
-				return locationStatus.getMessage();
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * Get the URI for the location field if possible.
-	 * 
-	 * @return URI or <code>null</code> if it is not valid.
-	 */
-	public URI getProjectLocationURI() {
-
-		FileSystemConfiguration configuration = getSelectedConfiguration();
-		if (configuration == null) {
-			return null;
-		}
-
-		return configuration.getContributor().getURI(
-				locationPathField.getText());
-
-	}
-
-	/**
-	 * Return the selected contributor
-	 * 
-	 * @return FileSystemConfiguration or <code>null</code> if it cannot be
-	 *         determined.
-	 */
-	private FileSystemConfiguration getSelectedConfiguration() {
-		if (fileSystemSelectionArea == null) {
-			return FileSystemSupportRegistry.getInstance()
-					.getDefaultConfiguration();
-		}
-
-		return fileSystemSelectionArea.getSelectedConfiguration();
-	}
-
-	/**
-	 * Set the text to the default or clear it if not using the defaults.
-	 * 
-	 * @param newName
-	 *            the name of the project to use. If <code>null</code> use the
-	 *            existing project name.
-	 */
-	public void updateProjectName(String newName) {
-		projectName = newName;
-		if (isDefault()) {
-			locationPathField.setText(TextProcessor
-					.process(getDefaultPathDisplayString()));
-		}
-
-	}
-
-	/**
-	 * Return the location for the project. If we are using defaults then return
-	 * the workspace root so that core creates it with default values.
-	 * 
-	 * @return String
-	 */
-	public String getProjectLocation() {
-		if (isDefault()) {
-			return Platform.getLocation().toOSString();
-		}
-		return locationPathField.getText();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ProjectReferencePage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ProjectReferencePage.java
deleted file mode 100644
index 7b822bb..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ProjectReferencePage.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - Bug 137478 [Preferences] ProjectReferencePage has too wide left margin
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.preference.PreferencePage;
-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.ViewerComparator;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PropertyPage;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.progress.IProgressService;
-
-/**
- * A property page for viewing and modifying the set
- * of projects referenced by a given project.
- */
-public class ProjectReferencePage extends PropertyPage {
-    private IProject project;
-
-    private boolean modified = false;
-
-    //widgets
-    private CheckboxTableViewer listViewer;
-
-    /*
-     * @see PreferencePage#createContents
-     */
-    protected Control createContents(Composite parent) {
-    	PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
-                IIDEHelpContextIds.PROJECT_REFERENCE_PROPERTY_PAGE);
-    	
-        Composite composite = new Composite(parent, SWT.NONE);
-        
-        initialize();
-
-        createDescriptionLabel(composite);
-
-        listViewer = CheckboxTableViewer.newCheckList(composite, SWT.TOP
-                | SWT.BORDER);
-        
-        if(!project.isOpen())
-        	listViewer.getControl().setEnabled(false);
-
-        listViewer.setLabelProvider(WorkbenchLabelProvider
-                .getDecoratingWorkbenchLabelProvider());
-        listViewer.setContentProvider(getContentProvider(project));
-        listViewer.setComparator(new ViewerComparator());
-        listViewer.setInput(project.getWorkspace());
-        try {
-            listViewer.setCheckedElements(project.getDescription()
-                    .getReferencedProjects());
-        } catch (CoreException e) {
-            //don't initial-check anything
-        }
-
-        //check for initial modification to avoid work if no changes are made
-        listViewer.addCheckStateListener(new ICheckStateListener() {
-            public void checkStateChanged(CheckStateChangedEvent event) {
-                modified = true;
-            }
-        });
-
-        applyDialogFont(composite);
-        
-        GridLayoutFactory.fillDefaults().generateLayout(composite);
-        
-        return composite;
-    }
-
-    /**
-     * Returns a content provider for the list dialog. It
-     * will return all projects in the workspace except
-     * the given project, plus any projects referenced
-     * by the given project which do no exist in the
-     * workspace.
-     * @param project the project to provide content for
-     * @return the content provider that shows the project content
-     */
-    protected IStructuredContentProvider getContentProvider(
-            final IProject project) {
-        return new WorkbenchContentProvider() {
-            public Object[] getChildren(Object o) {
-                if (!(o instanceof IWorkspace)) {
-                    return new Object[0];
-                }
-
-                // Collect all the projects in the workspace except the given project
-                IProject[] projects = ((IWorkspace) o).getRoot().getProjects();
-                ArrayList referenced = new ArrayList(projects.length);
-                boolean found = false;
-                for (int i = 0; i < projects.length; i++) {
-                    if (!found && projects[i].equals(project)) {
-                        found = true;
-                        continue;
-                    }
-                    referenced.add(projects[i]);
-                }
-
-                // Add any referenced that do not exist in the workspace currently
-                try {
-                    projects = project.getDescription().getReferencedProjects();
-                    for (int i = 0; i < projects.length; i++) {
-                        if (!referenced.contains(projects[i])) {
-							referenced.add(projects[i]);
-						}
-                    }
-                } catch (CoreException e) {
-                    //Ignore core exceptions
-                }
-
-                return referenced.toArray();
-            }
-        };
-    }
-
-    /**
-     * Handle the exception thrown when saving.
-     * @param e the exception
-     */
-    protected void handle(InvocationTargetException e) {
-        IStatus error;
-        Throwable target = e.getTargetException();
-        if (target instanceof CoreException) {
-            error = ((CoreException) target).getStatus();
-        } else {
-            String msg = target.getMessage();
-            if (msg == null) {
-				msg = IDEWorkbenchMessages.Internal_error;
-			}
-            error = new Status(IStatus.ERROR, IDEWorkbenchPlugin.IDE_WORKBENCH,
-                    1, msg, target);
-        }
-        ErrorDialog.openError(getControl().getShell(), null, null, error);
-    }
-
-    /**
-     * Initializes a ProjectReferencePage.
-     */
-    private void initialize() {
-        project = (IProject) getElement().getAdapter(IResource.class);
-        noDefaultAndApplyButton();
-        setDescription(NLS.bind(IDEWorkbenchMessages.ProjectReferencesPage_label, project.getName()));
-    }
-
-    /**
-     * @see PreferencePage#performOk
-     */
-    public boolean performOk() {
-        if (!modified) {
-			return true;
-		}
-        Object[] checked = listViewer.getCheckedElements();
-        final IProject[] refs = new IProject[checked.length];
-        System.arraycopy(checked, 0, refs, 0, checked.length);
-        IRunnableWithProgress runnable = new IRunnableWithProgress() {
-            public void run(IProgressMonitor monitor)
-                    throws InvocationTargetException {
-
-                try {
-                    IProjectDescription description = project.getDescription();
-                    description.setReferencedProjects(refs);
-                    project.setDescription(description, monitor);
-                } catch (CoreException e) {
-                    throw new InvocationTargetException(e);
-                }
-            }
-        };
-        IProgressService service = PlatformUI.getWorkbench().getProgressService();
-        try {
-            service.run(false, false, runnable);
-        } catch (InterruptedException e) {
-            //Ignore interrupted exceptions
-        } catch (InvocationTargetException e) {
-            handle(e);
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ResourceComparator.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ResourceComparator.java
deleted file mode 100644
index 6af1a3b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ResourceComparator.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-
-/**
- * Sorter for viewers that display items of type <code>IResource</code>.
- * The sorter supports two sort criteria:
- * <p>
- * <code>NAME</code>: Folders are given order precedence, followed by files.
- * Within these two groups resources are ordered by name.  All name comparisons
- * are case-insensitive.
- * </p>
- * <p>
- * <code>TYPE</code>: Folders are given order precedence, followed by files.
- * Within these two groups resources are ordered by extension.  All extension
- * comparisons are case-insensitive.
- * </p>
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- */
-public class ResourceComparator extends ViewerComparator {
-
-    /**
-     * Constructor argument value that indicates to sort items by name.
-     */
-    public final static int NAME = 1;
-
-    /**
-     * Constructor argument value that indicates to sort items by extension.
-     */
-    public final static int TYPE = 2;
-
-    private int criteria;
-
-    /**
-     * Creates a resource sorter that will use the given sort criteria.
-     *
-     * @param criteria the sort criterion to use: one of <code>NAME</code> or 
-     *   <code>TYPE</code>
-     */
-    public ResourceComparator(int criteria) {
-        super();
-        this.criteria = criteria;
-    }
-
-    /**
-     * Returns an integer value representing the relative sort priority of the 
-     * given element based on its class.
-     * <p>
-     * <ul>
-     *   <li>resources (<code>IResource</code>) - 2</li>
-     *   <li>project references (<code>ProjectReference</code>) - 1</li>
-     *   <li>everything else - 0</li>
-     * </ul>
-     * </p>
-     *
-     * @param element the element
-     * @return the sort priority (larger numbers means more important)
-     */
-    protected int classComparison(Object element) {
-        if (element instanceof IResource) {
-            return 2;
-        }
-        return 0;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ViewerSorter.
-     */
-    public int compare(Viewer viewer, Object o1, Object o2) {
-        //have to deal with non-resources in navigator
-        //if one or both objects are not resources, returned a comparison 
-        //based on class.
-        if (!(o1 instanceof IResource && o2 instanceof IResource)) {
-            return compareClass(o1, o2);
-        }
-        IResource r1 = (IResource) o1;
-        IResource r2 = (IResource) o2;
-
-        if (r1 instanceof IContainer && r2 instanceof IContainer) {
-			return compareNames(r1, r2);
-		} else if (r1 instanceof IContainer) {
-			return -1;
-		} else if (r2 instanceof IContainer) {
-			return 1;
-		} else if (criteria == NAME) {
-			return compareNames(r1, r2);
-		} else if (criteria == TYPE) {
-			return compareTypes(r1, r2);
-		} else {
-			return 0;
-		}
-    }
-
-    /**
-     * Returns a number reflecting the collation order of the given elements
-     * based on their class.
-     *
-     * @param element1 the first element to be ordered
-     * @param element2 the second element to be ordered
-     * @return a negative number if the first element is less  than the 
-     *  second element; the value <code>0</code> if the first element is
-     *  equal to the second element; and a positive number if the first
-     *  element is greater than the second element
-     */
-    protected int compareClass(Object element1, Object element2) {
-        return classComparison(element1) - classComparison(element2);
-    }
-
-    /**
-     * Returns a number reflecting the collation order of the given resources
-     * based on their resource names.
-     *
-     * @param resource1 the first resource element to be ordered
-     * @param resource2 the second resource element to be ordered
-     * @return a negative number if the first element is less  than the 
-     *  second element; the value <code>0</code> if the first element is
-     *  equal to the second element; and a positive number if the first
-     *  element is greater than the second element
-     */
-    protected int compareNames(IResource resource1, IResource resource2) {
-        return getComparator().compare(resource1.getName(), resource2.getName());
-    }
-
-    /**
-     * Returns a number reflecting the collation order of the given resources
-     * based on their respective file extensions. Resources with the same file
-     * extension will be collated based on their names.
-     *
-     * @param resource1 the first resource element to be ordered
-     * @param resource2 the second resource element to be ordered
-     * @return a negative number if the first element is less  than the 
-     *  second element; the value <code>0</code> if the first element is
-     *  equal to the second element; and a positive number if the first
-     *  element is greater than the second element
-     */
-    protected int compareTypes(IResource resource1, IResource resource2) {
-        String ext1 = getExtensionFor(resource1);
-        String ext2 = getExtensionFor(resource2);
-
-        // Compare extensions.  If they're different then return a value that
-        // indicates correct extension ordering.  If they're the same then
-        // return a value that indicates the correct NAME ordering.
-        int result = getComparator().compare(ext1, ext2);
-
-        if (result != 0) {
-			return result;
-		}
-
-        return compareNames(resource1, resource2);
-    }
-
-    /**
-     * Returns the sort criteria of this this sorter.
-     *
-     * @return the sort criterion: one of <code>NAME</code> or <code>TYPE</code>
-     */
-    public int getCriteria() {
-        return criteria;
-    }
-
-    /**
-     * Returns the extension portion of the given resource.
-     *
-     * @param resource the resource
-     * @return the file extension, possibily the empty string
-     */
-    private String getExtensionFor(IResource resource) {
-        String ext = resource.getFileExtension();
-        return ext == null ? "" : ext; //$NON-NLS-1$
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ResourceInfoPage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ResourceInfoPage.java
deleted file mode 100644
index 6e57b1f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ResourceInfoPage.java
+++ /dev/null
@@ -1,620 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Remy Chi Jian Suen <remy.suen@gmail.com> - Bug 175069 [Preferences] ResourceInfoPage is not setting dialog font on all widgets
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.net.URI;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileSystem;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourceAttributes;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.preference.FieldEditor;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.osgi.util.TextProcessor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-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.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PropertyPage;
-import org.eclipse.ui.ide.dialogs.ResourceEncodingFieldEditor;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.LineDelimiterEditor;
-
-/**
- * The ResourceInfoPage is the page that shows the basic info about the
- * resource.
- */
-public class ResourceInfoPage extends PropertyPage {
-
-	private Button editableBox;
-
-	private Button executableBox;
-
-	private Button archiveBox;
-
-	private Button derivedBox;
-
-	private boolean previousReadOnlyValue;
-
-	private boolean previousExecutableValue;
-
-	private boolean previousArchiveValue;
-
-	private boolean previousDerivedValue;
-
-	private IContentDescription cachedContentDescription;
-
-	private ResourceEncodingFieldEditor encodingEditor;
-
-	private LineDelimiterEditor lineDelimiterEditor;
-
-	private static String READ_ONLY = IDEWorkbenchMessages.ResourceInfo_readOnly;
-
-	private static String EXECUTABLE = IDEWorkbenchMessages.ResourceInfo_executable;
-
-	private static String ARCHIVE = IDEWorkbenchMessages.ResourceInfo_archive;
-
-	private static String DERIVED = IDEWorkbenchMessages.ResourceInfo_derived;
-
-	private static String TYPE_TITLE = IDEWorkbenchMessages.ResourceInfo_type;
-
-	private static String LOCATION_TITLE = IDEWorkbenchMessages.ResourceInfo_location;
-
-	private static String RESOLVED_LOCATION_TITLE = IDEWorkbenchMessages.ResourceInfo_resolvedLocation;
-
-	private static String SIZE_TITLE = IDEWorkbenchMessages.ResourceInfo_size;
-
-	private static String PATH_TITLE = IDEWorkbenchMessages.ResourceInfo_path;
-
-	private static String TIMESTAMP_TITLE = IDEWorkbenchMessages.ResourceInfo_lastModified;
-
-	private static String FILE_ENCODING_TITLE = IDEWorkbenchMessages.WorkbenchPreference_encoding;
-
-	private static String CONTAINER_ENCODING_TITLE = IDEWorkbenchMessages.ResourceInfo_fileEncodingTitle;
-
-	// Max value width in characters before wrapping
-	private static final int MAX_VALUE_WIDTH = 80;
-
-	/**
-	 * Create the group that shows the name, location, size and type.
-	 * 
-	 * @param parent
-	 *            the composite the group will be created in
-	 * @param resource
-	 *            the resource the information is being taken from.
-	 * @return the composite for the group
-	 */
-	private Composite createBasicInfoGroup(Composite parent, IResource resource) {
-		Composite basicInfoComposite = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		basicInfoComposite.setLayout(layout);
-		GridData data = new GridData();
-		data.verticalAlignment = GridData.FILL;
-		data.horizontalAlignment = GridData.FILL;
-		basicInfoComposite.setLayoutData(data);
-
-		// The group for path
-		Label pathLabel = new Label(basicInfoComposite, SWT.NONE);
-		pathLabel.setText(PATH_TITLE);
-		GridData gd = new GridData();
-		gd.verticalAlignment = SWT.TOP;
-		pathLabel.setLayoutData(gd);
-
-		// path value label
-		Text pathValueText = new Text(basicInfoComposite, SWT.WRAP
-				| SWT.READ_ONLY);
-		String pathString = TextProcessor.process(resource.getFullPath()
-				.toString());
-		pathValueText.setText(pathString);
-		gd = new GridData();
-		gd.widthHint = convertWidthInCharsToPixels(MAX_VALUE_WIDTH);
-		gd.grabExcessHorizontalSpace = true;
-		gd.horizontalAlignment = GridData.FILL;
-		pathValueText.setLayoutData(gd);
-		pathValueText.setBackground(pathValueText.getDisplay().getSystemColor(
-				SWT.COLOR_WIDGET_BACKGROUND));
-
-		// The group for types
-		Label typeTitle = new Label(basicInfoComposite, SWT.LEFT);
-		typeTitle.setText(TYPE_TITLE);
-
-		Text typeValue = new Text(basicInfoComposite, SWT.LEFT | SWT.READ_ONLY);
-		typeValue.setText(IDEResourceInfoUtils.getTypeString(resource,
-				getContentDescription(resource)));
-		typeValue.setBackground(typeValue.getDisplay().getSystemColor(
-				SWT.COLOR_WIDGET_BACKGROUND));
-
-		// The group for location
-		Label locationTitle = new Label(basicInfoComposite, SWT.LEFT);
-		locationTitle.setText(LOCATION_TITLE);
-		gd = new GridData();
-		gd.verticalAlignment = SWT.TOP;
-		locationTitle.setLayoutData(gd);
-
-		Text locationValue = new Text(basicInfoComposite, SWT.WRAP
-				| SWT.READ_ONLY);
-		String locationStr = TextProcessor.process(IDEResourceInfoUtils
-				.getLocationText(resource));
-		locationValue.setText(locationStr);
-		gd = new GridData();
-		gd.widthHint = convertWidthInCharsToPixels(MAX_VALUE_WIDTH);
-		gd.grabExcessHorizontalSpace = true;
-		gd.horizontalAlignment = GridData.FILL;
-		locationValue.setLayoutData(gd);
-		locationValue.setBackground(locationValue.getDisplay().getSystemColor(
-				SWT.COLOR_WIDGET_BACKGROUND));
-
-		if (isPathVariable(resource)) {
-			Label resolvedLocationTitle = new Label(basicInfoComposite,
-					SWT.LEFT);
-			resolvedLocationTitle.setText(RESOLVED_LOCATION_TITLE);
-			gd = new GridData();
-			gd.verticalAlignment = SWT.TOP;
-			resolvedLocationTitle.setLayoutData(gd);
-
-			Text resolvedLocationValue = new Text(basicInfoComposite, SWT.WRAP
-					| SWT.READ_ONLY);
-			resolvedLocationValue.setText(IDEResourceInfoUtils
-					.getResolvedLocationText(resource));
-			gd = new GridData();
-			gd.widthHint = convertWidthInCharsToPixels(MAX_VALUE_WIDTH);
-			gd.grabExcessHorizontalSpace = true;
-			gd.horizontalAlignment = GridData.FILL;
-			resolvedLocationValue.setLayoutData(gd);
-			resolvedLocationValue.setBackground(resolvedLocationValue
-					.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-		}
-		if (resource.getType() == IResource.FILE) {
-			// The group for size
-			Label sizeTitle = new Label(basicInfoComposite, SWT.LEFT);
-			sizeTitle.setText(SIZE_TITLE);
-
-			Text sizeValue = new Text(basicInfoComposite, SWT.LEFT
-					| SWT.READ_ONLY);
-			sizeValue.setText(IDEResourceInfoUtils.getSizeString(resource));
-			gd = new GridData();
-			gd.widthHint = convertWidthInCharsToPixels(MAX_VALUE_WIDTH);
-			gd.grabExcessHorizontalSpace = true;
-			gd.horizontalAlignment = GridData.FILL;
-			sizeValue.setLayoutData(gd);
-			sizeValue.setBackground(sizeValue.getDisplay().getSystemColor(
-					SWT.COLOR_WIDGET_BACKGROUND));
-		}
-
-		return basicInfoComposite;
-	}
-
-	protected Control createContents(Composite parent) {
-
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
-				IIDEHelpContextIds.RESOURCE_INFO_PROPERTY_PAGE);
-
-		// layout the page
-		IResource resource = (IResource) getElement().getAdapter(
-				IResource.class);
-		
-		if (resource == null) {
-			Label label = new Label(parent, SWT.NONE);
-			label.setText(IDEWorkbenchMessages.ResourceInfoPage_noResource);
-			return label;
-		}
-		
-		if (resource.getType() != IResource.PROJECT) {
-			ResourceAttributes attrs = resource.getResourceAttributes();
-			if (attrs != null) {
-				previousReadOnlyValue = attrs.isReadOnly();
-				previousExecutableValue = attrs.isExecutable();
-				previousArchiveValue = attrs.isArchive();
-			} else {
-				previousReadOnlyValue = previousExecutableValue = previousArchiveValue = false;
-			}
-			previousDerivedValue = resource.isDerived();
-		}
-
-		// top level group
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		composite.setLayout(layout);
-		GridData data = new GridData(GridData.FILL);
-		data.grabExcessHorizontalSpace = true;
-		composite.setLayoutData(data);
-
-		createBasicInfoGroup(composite, resource);
-		createSeparator(composite);
-		createStateGroup(composite, resource);
-		new Label(composite, SWT.NONE); // a vertical spacer
-		encodingEditor = new ResourceEncodingFieldEditor(
-				getFieldEditorLabel(resource), composite, resource);
-		encodingEditor.setPage(this);
-		encodingEditor.load();
-
-		encodingEditor.setPropertyChangeListener(new IPropertyChangeListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-			 */
-			public void propertyChange(PropertyChangeEvent event) {
-				if (event.getProperty().equals(FieldEditor.IS_VALID)) {
-					setValid(encodingEditor.isValid());
-				}
-
-			}
-		});
-
-		
-		if (resource.getType() == IResource.PROJECT) {
-			lineDelimiterEditor = new LineDelimiterEditor(composite, resource
-					.getProject());
-			lineDelimiterEditor.doLoad();
-		}
-		
-		//We can't save the preferences for close
-		if (resource.getType() == IResource.PROJECT && !((IProject)resource).isOpen()){
-			encodingEditor.setEnabled(false, composite);
-			lineDelimiterEditor.setEnabled(false);
-		}
-		
-		Dialog.applyDialogFont(composite);
-
-		return composite;
-	}
-
-	/**
-	 * Return the label for the encoding field editor for the resource.
-	 * 
-	 * @param resource -
-	 *            the resource to edit.
-	 * @return String
-	 */
-	private String getFieldEditorLabel(IResource resource) {
-		if (resource instanceof IContainer) {
-			return CONTAINER_ENCODING_TITLE;
-		}
-		return FILE_ENCODING_TITLE;
-	}
-
-	/**
-	 * Create the isEditable button and it's associated label as a child of
-	 * parent using the editableValue of the receiver. The Composite will be the
-	 * parent of the button.
-	 * 
-	 * @param composite
-	 *            the parent of the button
-	 */
-	private void createEditableButton(Composite composite) {
-
-		this.editableBox = new Button(composite, SWT.CHECK | SWT.RIGHT);
-		this.editableBox.setAlignment(SWT.LEFT);
-		this.editableBox.setText(READ_ONLY);
-		this.editableBox.setSelection(this.previousReadOnlyValue);
-		GridData data = new GridData();
-		data.horizontalSpan = 2;
-		this.editableBox.setLayoutData(data);
-	}
-
-	/**
-	 * Create the isExecutable button and it's associated label as a child of
-	 * parent using the editableValue of the receiver. The Composite will be the
-	 * parent of the button.
-	 * 
-	 * @param composite
-	 *            the parent of the button
-	 */
-	private void createExecutableButton(Composite composite) {
-
-		this.executableBox = new Button(composite, SWT.CHECK | SWT.RIGHT);
-		this.executableBox.setAlignment(SWT.LEFT);
-		this.executableBox.setText(EXECUTABLE);
-		this.executableBox.setSelection(this.previousExecutableValue);
-		GridData data = new GridData();
-		data.horizontalSpan = 2;
-		this.executableBox.setLayoutData(data);
-	}
-
-	/**
-	 * Create the isArchive button and it's associated label as a child of
-	 * parent using the editableValue of the receiver. The Composite will be the
-	 * parent of the button.
-	 * 
-	 * @param composite
-	 *            the parent of the button
-	 */
-	private void createArchiveButton(Composite composite) {
-
-		this.archiveBox = new Button(composite, SWT.CHECK | SWT.RIGHT);
-		this.archiveBox.setAlignment(SWT.LEFT);
-		this.archiveBox.setText(ARCHIVE);
-		this.archiveBox.setSelection(this.previousArchiveValue);
-		GridData data = new GridData();
-		data.horizontalSpan = 2;
-		this.archiveBox.setLayoutData(data);
-	}
-
-	/**
-	 * Create the derived button and it's associated label as a child of parent
-	 * using the derived of the receiver. The Composite will be the parent of
-	 * the button.
-	 * 
-	 * @param composite
-	 *            the parent of the button
-	 */
-	private void createDerivedButton(Composite composite) {
-
-		this.derivedBox = new Button(composite, SWT.CHECK | SWT.RIGHT);
-		this.derivedBox.setAlignment(SWT.LEFT);
-		this.derivedBox.setText(DERIVED);
-		this.derivedBox.setSelection(this.previousDerivedValue);
-		GridData data = new GridData();
-		data.horizontalSpan = 2;
-		this.derivedBox.setLayoutData(data);
-	}
-
-	/**
-	 * Create a separator that goes across the entire page
-	 * 
-	 * @param composite
-	 *            The parent of the seperator
-	 */
-	private void createSeparator(Composite composite) {
-
-		Label separator = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
-		GridData gridData = new GridData();
-		gridData.horizontalAlignment = GridData.FILL;
-		gridData.grabExcessHorizontalSpace = true;
-		separator.setLayoutData(gridData);
-	}
-
-	/**
-	 * Create the group that shows the read only state and the timestamp.
-	 * 
-	 * @param parent
-	 *            the composite the group will be created in
-	 * @param resource
-	 *            the resource the information is being taken from.
-	 */
-	private void createStateGroup(Composite parent, IResource resource) {
-
-		Font font = parent.getFont();
-
-		Composite composite = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		composite.setLayout(layout);
-		GridData data = new GridData();
-		data.horizontalAlignment = GridData.FILL;
-		composite.setLayoutData(data);
-
-		Label timeStampLabel = new Label(composite, SWT.NONE);
-		timeStampLabel.setText(TIMESTAMP_TITLE);
-
-		// timeStamp value label
-		Text timeStampValue = new Text(composite, SWT.READ_ONLY);
-		timeStampValue.setText(IDEResourceInfoUtils
-				.getDateStringValue(resource));
-		timeStampValue.setBackground(timeStampValue.getDisplay()
-				.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-		timeStampValue.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.GRAB_HORIZONTAL));
-
-		// Not relevant to projects
-		if (resource.getType() != IResource.PROJECT) {
-			URI location = resource.getLocationURI();
-			if (location != null && location.getScheme() != null) {
-				try {
-					IFileSystem fs = EFS.getFileSystem(location.getScheme());
-					int attributes = fs.attributes();
-					if ((attributes & EFS.ATTRIBUTE_READ_ONLY) != 0) {
-						createEditableButton(composite);
-					}
-					if ((attributes & EFS.ATTRIBUTE_EXECUTABLE) != 0) {
-						createExecutableButton(composite);
-					}
-					if ((attributes & EFS.ATTRIBUTE_ARCHIVE) != 0) {
-						createArchiveButton(composite);
-					}
-				} catch (CoreException e) {
-					// ignore if we can't access the file system for this
-					// resource
-				}
-			}
-			createDerivedButton(composite);
-			// create warning for executable flag
-			if (executableBox != null && resource.getType() == IResource.FOLDER) {
-				Composite noteComposite = createNoteComposite(font, composite,
-						IDEWorkbenchMessages.Preference_note,
-						IDEWorkbenchMessages.ResourceInfo_exWarning);
-				GridData noteData = new GridData();
-				noteData.horizontalSpan = 2;
-				noteComposite.setLayoutData(noteData);
-			}
-		}
-	}
-
-	private IContentDescription getContentDescription(IResource resource) {
-		if (resource.getType() != IResource.FILE) {
-			return null;
-		}
-
-		if (cachedContentDescription == null) {
-			try {
-				cachedContentDescription = ((IFile) resource)
-						.getContentDescription();
-			} catch (CoreException e) {
-				// silently ignore
-			}
-		}
-		return cachedContentDescription;
-	}
-
-	/**
-	 * Returns whether the given resource is a linked resource bound to a path
-	 * variable.
-	 * 
-	 * @param resource
-	 *            resource to test
-	 * @return boolean <code>true</code> the given resource is a linked
-	 *         resource bound to a path variable. <code>false</code> the given
-	 *         resource is either not a linked resource or it is not using a
-	 *         path variable.
-	 */
-	private boolean isPathVariable(IResource resource) {
-		if (!resource.isLinked()) {
-			return false;
-		}
-
-		IPath resolvedLocation = resource.getLocation();
-		if (resolvedLocation == null) {
-			// missing path variable
-			return true;
-		}
-		IPath rawLocation = resource.getRawLocation();
-		if (resolvedLocation.equals(rawLocation)) {
-			return false;
-		}
-
-		return true;
-	}
-
-	/**
-	 * Reset the editableBox to the false.
-	 */
-	protected void performDefaults() {
-
-		IResource resource = (IResource) getElement().getAdapter(
-				IResource.class);
-		
-		if (resource == null)
-			return;
-
-		// Nothing to update if we never made the box
-		if (this.editableBox != null) {
-			this.editableBox.setSelection(false);
-		}
-
-		// Nothing to update if we never made the box
-		if (this.executableBox != null) {
-			this.executableBox.setSelection(false);
-		}
-
-		// Nothing to update if we never made the box
-		if (this.derivedBox != null) {
-			this.derivedBox.setSelection(false);
-		}
-
-		encodingEditor.loadDefault();
-
-		if (lineDelimiterEditor != null) {
-			lineDelimiterEditor.loadDefault();
-		}
-
-	}
-
-	/**
-	 * Apply the read only state and the encoding to the resource.
-	 */
-	public boolean performOk() {
-
-		IResource resource = (IResource) getElement().getAdapter(
-				IResource.class);
-		
-		if (resource == null)
-			return true;
-
-		encodingEditor.store();
-
-		if (lineDelimiterEditor != null) {
-			lineDelimiterEditor.store();
-		}
-
-		try {
-			ResourceAttributes attrs = resource.getResourceAttributes();
-			if (attrs != null) {
-				boolean hasChange = false;
-				// Nothing to update if we never made the box
-				if (editableBox != null
-						&& editableBox.getSelection() != previousReadOnlyValue) {
-					attrs.setReadOnly(editableBox.getSelection());
-					hasChange = true;
-				}
-				if (executableBox != null
-						&& executableBox.getSelection() != previousExecutableValue) {
-					attrs.setExecutable(executableBox.getSelection());
-					hasChange = true;
-				}
-				if (archiveBox != null
-						&& archiveBox.getSelection() != previousArchiveValue) {
-					attrs.setArchive(archiveBox.getSelection());
-					hasChange = true;
-				}
-				if (hasChange) {
-					resource.setResourceAttributes(attrs);
-					attrs = resource.getResourceAttributes();
-					if (attrs != null) {
-						previousReadOnlyValue = attrs.isReadOnly();
-						previousExecutableValue = attrs.isExecutable();
-						previousArchiveValue = attrs.isArchive();
-						if (editableBox != null) {
-							editableBox.setSelection(attrs.isReadOnly());
-						}
-						if (executableBox != null) {
-							executableBox.setSelection(attrs.isExecutable());
-						}
-						if (archiveBox != null) {
-							archiveBox.setSelection(attrs.isArchive());
-						}
-					}
-				}
-			}
-
-			// Nothing to update if we never made the box
-			if (this.derivedBox != null) {
-				boolean localDerivedValue = derivedBox.getSelection();
-				if (previousDerivedValue != localDerivedValue) {
-					resource.setDerived(localDerivedValue);
-					boolean isDerived = resource.isDerived();
-					previousDerivedValue = isDerived;
-					derivedBox.setSelection(isDerived);
-				}
-			}
-		} catch (CoreException exception) {
-			ErrorDialog.openError(getShell(),
-					IDEWorkbenchMessages.InternalError, exception
-							.getLocalizedMessage(), exception.getStatus());
-			return false;
-		}
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ResourceTreeAndListGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ResourceTreeAndListGroup.java
deleted file mode 100644
index 3763bb4..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ResourceTreeAndListGroup.java
+++ /dev/null
@@ -1,1089 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.commands.common.EventManager;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.ITreeViewerListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeExpansionEvent;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Tree;
-
-/**
- *	Workbench-level composite that combines a CheckboxTreeViewer and CheckboxListViewer.
- *	All viewer selection-driven interactions are handled within this object
- */
-public class ResourceTreeAndListGroup extends EventManager implements
-		ICheckStateListener, ISelectionChangedListener, ITreeViewerListener {
-    private Object root;
-
-    private Object currentTreeSelection;
-
-    private Collection expandedTreeNodes = new HashSet();
-
-    private Map checkedStateStore = new HashMap(9);
-
-    private Collection whiteCheckedTreeItems = new HashSet();
-
-    private ITreeContentProvider treeContentProvider;
-
-    private IStructuredContentProvider listContentProvider;
-
-    private ILabelProvider treeLabelProvider;
-
-    private ILabelProvider listLabelProvider;
-
-    // widgets
-    private CheckboxTreeViewer treeViewer;
-
-    private CheckboxTableViewer listViewer;
-
-    //height hint for viewers
-    private static int PREFERRED_HEIGHT = 150;
-
-    /**
-     *	Create an instance of this class.  Use this constructor if you wish to specify
-     *	the width and/or height of the combined widget (to only hardcode one of the
-     *	sizing dimensions, specify the other dimension's value as -1)
-     *  
-     * @param parent
-     * @param rootObject
-     * @param treeContentProvider
-     * @param treeLabelProvider
-     * @param listContentProvider
-     * @param listLabelProvider
-     * @param style
-     * @param useHeightHint If true then use the height hint
-     *  to make this group big enough
-     *
-     */
-    public ResourceTreeAndListGroup(Composite parent, Object rootObject,
-            ITreeContentProvider treeContentProvider,
-            ILabelProvider treeLabelProvider,
-            IStructuredContentProvider listContentProvider,
-            ILabelProvider listLabelProvider, int style, boolean useHeightHint) {
-
-        root = rootObject;
-        this.treeContentProvider = treeContentProvider;
-        this.listContentProvider = listContentProvider;
-        this.treeLabelProvider = treeLabelProvider;
-        this.listLabelProvider = listLabelProvider;
-        createContents(parent, style, useHeightHint);
-    }
-
-    /**
-     * This method must be called just before this window becomes visible.
-     */
-    public void aboutToOpen() {
-        determineWhiteCheckedDescendents(root);
-        checkNewTreeElements(treeContentProvider.getElements(root));
-        currentTreeSelection = null;
-
-        //select the first element in the list
-        Object[] elements = treeContentProvider.getElements(root);
-        Object primary = elements.length > 0 ? elements[0] : null;
-        if (primary != null) {
-            treeViewer.setSelection(new StructuredSelection(primary));
-        }
-        treeViewer.getControl().setFocus();
-    }
-
-    /**
-     *	Add the passed listener to self's collection of clients
-     *	that listen for changes to element checked states
-     *
-     *	@param listener ICheckStateListener
-     */
-    public void addCheckStateListener(ICheckStateListener listener) {
-        addListenerObject(listener);
-    }
-
-    /**
-     *	Return a boolean indicating whether all children of the passed tree element
-     *	are currently white-checked
-     *
-     *	@return boolean
-     *	@param treeElement java.lang.Object
-     */
-    protected boolean areAllChildrenWhiteChecked(Object treeElement) {
-        Object[] children = treeContentProvider.getChildren(treeElement);
-        for (int i = 0; i < children.length; ++i) {
-            if (!whiteCheckedTreeItems.contains(children[i])) {
-				return false;
-			}
-        }
-
-        return true;
-    }
-
-    /**
-     *	Return a boolean indicating whether all list elements associated with
-     *	the passed tree element are currently checked
-     *
-     *	@return boolean
-     *	@param treeElement java.lang.Object
-     */
-    protected boolean areAllElementsChecked(Object treeElement) {
-        List checkedElements = (List) checkedStateStore.get(treeElement);
-        if (checkedElements == null) {
-			return false;
-		}
-
-        return getListItemsSize(treeElement) == checkedElements.size();
-    }
-
-    /**
-     *	Iterate through the passed elements which are being realized for the first
-     *	time and check each one in the tree viewer as appropriate
-     */
-    protected void checkNewTreeElements(Object[] elements) {
-        for (int i = 0; i < elements.length; ++i) {
-            Object currentElement = elements[i];
-            boolean checked = checkedStateStore.containsKey(currentElement);
-            treeViewer.setChecked(currentElement, checked);
-            treeViewer.setGrayed(currentElement, checked
-                    && !whiteCheckedTreeItems.contains(currentElement));
-        }
-    }
-
-    /**
-     *	An item was checked in one of self's two views.  Determine which
-     *	view this occurred in and delegate appropriately
-     *
-     *	@param event CheckStateChangedEvent
-     */
-    public void checkStateChanged(final CheckStateChangedEvent event) {
-
-        //Potentially long operation - show a busy cursor
-        BusyIndicator.showWhile(treeViewer.getControl().getDisplay(),
-                new Runnable() {
-                    public void run() {
-                        if (event.getCheckable().equals(treeViewer)) {
-							treeItemChecked(event.getElement(), event
-                                    .getChecked());
-						} else {
-							listItemChecked(event.getElement(), event
-                                    .getChecked(), true);
-						}
-
-                        notifyCheckStateChangeListeners(event);
-                    }
-                });
-    }
-
-    /**
-     *	Lay out and initialize self's visual components.
-     *
-     *	@param parent org.eclipse.swt.widgets.Composite
-     *  @param style the style flags for the new Composite
-     *	@param useHeightHint If true yse the preferredHeight.
-     */
-    protected void createContents(Composite parent, int style,
-            boolean useHeightHint) {
-        // group pane
-        Composite composite = new Composite(parent, style);
-        composite.setFont(parent.getFont());
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        layout.makeColumnsEqualWidth = true;
-        layout.marginHeight = 0;
-        layout.marginWidth = 0;
-        composite.setLayout(layout);
-        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        createTreeViewer(composite, useHeightHint);
-        createListViewer(composite, useHeightHint);
-
-        initialize();
-    }
-
-    /**
-     *	Create this group's list viewer.
-     */
-    protected void createListViewer(Composite parent, boolean useHeightHint) {
-        listViewer = CheckboxTableViewer.newCheckList(parent, SWT.BORDER);
-        GridData data = new GridData(GridData.FILL_BOTH);
-        if (useHeightHint) {
-			data.heightHint = PREFERRED_HEIGHT;
-		}
-        listViewer.getTable().setLayoutData(data);
-        listViewer.getTable().setFont(parent.getFont());
-        listViewer.setContentProvider(listContentProvider);
-        listViewer.setLabelProvider(listLabelProvider);
-        listViewer.addCheckStateListener(this);
-    }
-
-    /**
-     *	Create this group's tree viewer.
-     */
-    protected void createTreeViewer(Composite parent, boolean useHeightHint) {
-        Tree tree = new Tree(parent, SWT.CHECK | SWT.BORDER);
-        GridData data = new GridData(GridData.FILL_BOTH);
-        if (useHeightHint) {
-			data.heightHint = PREFERRED_HEIGHT;
-		}
-        tree.setLayoutData(data);
-        tree.setFont(parent.getFont());
-
-        treeViewer = new CheckboxTreeViewer(tree);
-        treeViewer.setContentProvider(treeContentProvider);
-        treeViewer.setLabelProvider(treeLabelProvider);
-        treeViewer.addTreeListener(this);
-        treeViewer.addCheckStateListener(this);
-        treeViewer.addSelectionChangedListener(this);
-    }
-
-    /**
-     * Returns a boolean indicating whether the passed tree element should be
-     * at LEAST gray-checked.  Note that this method does not consider whether
-     * it should be white-checked, so a specified tree item which should be
-     * white-checked will result in a <code>true</code> answer from this method.
-     * To determine whether a tree item should be white-checked use method
-     * #determineShouldBeWhiteChecked(Object).
-     *
-     * @param treeElement java.lang.Object
-     * @return boolean
-     * @see #determineShouldBeWhiteChecked(Object)
-     */
-    protected boolean determineShouldBeAtLeastGrayChecked(Object treeElement) {
-        // if any list items associated with treeElement are checked then it
-        // retains its gray-checked status regardless of its children
-        List checked = (List) checkedStateStore.get(treeElement);
-        if (checked != null && (!checked.isEmpty())) {
-			return true;
-		}
-
-        // if any children of treeElement are still gray-checked then treeElement
-        // must remain gray-checked as well. Only ask expanded nodes
-        if (expandedTreeNodes.contains(treeElement)) {
-            Object[] children = treeContentProvider.getChildren(treeElement);
-            for (int i = 0; i < children.length; ++i) {
-                if (checkedStateStore.containsKey(children[i])) {
-					return true;
-				}
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns a boolean indicating whether the passed tree item should be
-     * white-checked.
-     *
-     * @return boolean
-     * @param treeElement java.lang.Object
-     */
-    protected boolean determineShouldBeWhiteChecked(Object treeElement) {
-        return areAllChildrenWhiteChecked(treeElement)
-                && areAllElementsChecked(treeElement);
-    }
-
-    /**
-     *	Recursively add appropriate tree elements to the collection of
-     *	known white-checked tree elements.
-     *
-     *	@param treeElement java.lang.Object
-     */
-    protected void determineWhiteCheckedDescendents(Object treeElement) {
-        // always go through all children first since their white-checked
-        // statuses will be needed to determine the white-checked status for
-        // this tree element
-        Object[] children = treeContentProvider.getElements(treeElement);
-        for (int i = 0; i < children.length; ++i) {
-			determineWhiteCheckedDescendents(children[i]);
-		}
-
-        // now determine the white-checked status for this tree element
-        if (determineShouldBeWhiteChecked(treeElement)) {
-			setWhiteChecked(treeElement, true);
-		}
-    }
-
-    /**
-     * Cause the tree viewer to expand all its items
-     */
-    public void expandAll() {
-        treeViewer.expandAll();
-    }
-
-    /**
-     *	Expand an element in a tree viewer
-     */
-    private void expandTreeElement(final Object item) {
-        BusyIndicator.showWhile(treeViewer.getControl().getDisplay(),
-                new Runnable() {
-                    public void run() {
-
-                        // First see if the children need to be given their checked state at all.  If they've
-                        // already been realized then this won't be necessary
-                        if (expandedTreeNodes.contains(item)) {
-							checkNewTreeElements(treeContentProvider
-                                    .getChildren(item));
-						} else {
-
-                            expandedTreeNodes.add(item);
-                            if (whiteCheckedTreeItems.contains(item)) {
-                                //If this is the first expansion and this is a white checked node then check the children
-                                Object[] children = treeContentProvider
-                                        .getChildren(item);
-                                for (int i = 0; i < children.length; ++i) {
-                                    if (!whiteCheckedTreeItems
-                                            .contains(children[i])) {
-                                        Object child = children[i];
-                                        setWhiteChecked(child, true);
-                                        treeViewer.setChecked(child, true);
-                                        checkedStateStore.put(child,
-                                                new ArrayList());
-                                    }
-                                }
-
-                                //Now be sure to select the list of items too
-                                setListForWhiteSelection(item);
-                            }
-                        }
-
-                    }
-                });
-    }
-
-    /**
-     * Add all of the selected children of nextEntry to result recursively.
-     * This does not set any values in the checked state.
-     * @param The treeElement being queried
-     * @param addAll a boolean to indicate if the checked state store needs to be queried
-     * @param filter IElementFilter - the filter being used on the data
-     * @param monitor IProgressMonitor or null that the cancel is polled for 
-     */
-    private void findAllSelectedListElements(Object treeElement,
-            String parentLabel, boolean addAll, IElementFilter filter,
-            IProgressMonitor monitor) throws InterruptedException {
-
-        String fullLabel = null;
-        if (monitor != null && monitor.isCanceled()) {
-			return;
-		}
-        if (monitor != null) {
-            fullLabel = getFullLabel(treeElement, parentLabel);
-            monitor.subTask(fullLabel);
-        }
-
-        if (addAll) {
-			filter.filterElements(listContentProvider.getElements(treeElement),
-                    monitor);
-		} else { //Add what we have stored
-            if (checkedStateStore.containsKey(treeElement)) {
-				filter.filterElements((Collection) checkedStateStore
-                        .get(treeElement), monitor);
-			}
-        }
-
-        Object[] treeChildren = treeContentProvider.getChildren(treeElement);
-        for (int i = 0; i < treeChildren.length; i++) {
-            Object child = treeChildren[i];
-            if (addAll) {
-				findAllSelectedListElements(child, fullLabel, true, filter,
-                        monitor);
-			} else { //Only continue for those with checked state
-                if (checkedStateStore.containsKey(child)) {
-					findAllSelectedListElements(child, fullLabel,
-                            whiteCheckedTreeItems.contains(child), filter,
-                            monitor);
-				}
-            }
-
-        }
-    }
-
-    /**
-     * Find all of the white checked children of the treeElement and add them to the collection.
-     * If the element itself is white select add it. If not then add any selected list elements
-     * and recurse down to the children.
-     * @param treeElement java.lang.Object
-     * @param result java.util.Collection
-     */
-    private void findAllWhiteCheckedItems(Object treeElement, Collection result) {
-
-        if (whiteCheckedTreeItems.contains(treeElement)) {
-			result.add(treeElement);
-		} else {
-            Collection listChildren = (Collection) checkedStateStore
-                    .get(treeElement);
-            //if it is not in the store then it and it's children are not interesting
-            if (listChildren == null) {
-				return;
-			}
-            result.addAll(listChildren);
-            Object[] children = treeContentProvider.getChildren(treeElement);
-            for (int i = 0; i < children.length; ++i) {
-                findAllWhiteCheckedItems(children[i], result);
-            }
-        }
-    }
-
-    /**
-	 * Returns a flat list of all of the leaf elements which are checked. Filter
-	 * then based on the supplied ElementFilter. If monitor is cancelled then
-	 * return null
-	 * 
-	 * @param filter -
-	 *            the filter for the data
-	 * @param monitor
-	 *            IProgressMonitor or null
-	 * @throws InterruptedException
-	 *             If the find is interrupted.
-	 */
-    public void getAllCheckedListItems(IElementFilter filter,
-            IProgressMonitor monitor) throws InterruptedException {
-
-        //Iterate through the children of the root as the root is not in the store
-        Object[] children = treeContentProvider.getChildren(root);
-        for (int i = 0; i < children.length; ++i) {
-            findAllSelectedListElements(children[i], null,
-                    whiteCheckedTreeItems.contains(children[i]), filter,
-                    monitor);
-        }
-    }
-
-    /**
-     *	Returns a flat list of all of the leaf elements which are checked.
-     *
-     *	@return all of the leaf elements which are checked. This API does not
-     * 	return null in order to keep backwards compatibility.
-     */
-    public List getAllCheckedListItems() {
-
-        final ArrayList returnValue = new ArrayList();
-
-        IElementFilter passThroughFilter = new IElementFilter() {
-
-            public void filterElements(Collection elements,
-                    IProgressMonitor monitor) {
-                returnValue.addAll(elements);
-            }
-
-            public void filterElements(Object[] elements,
-                    IProgressMonitor monitor) {
-                for (int i = 0; i < elements.length; i++) {
-                    returnValue.add(elements[i]);
-                }
-            }
-        };
-
-        try {
-            getAllCheckedListItems(passThroughFilter, null);
-        } catch (InterruptedException exception) {
-            return new ArrayList();
-        }
-        return returnValue;
-
-    }
-
-    /**
-     *	Returns a list of all of the items that are white checked.
-     * 	Any folders that are white checked are added and then any files
-     *  from white checked folders are added. 
-     *
-     *	@return the list of all of the items that are white checked
-     */
-    public List getAllWhiteCheckedItems() {
-
-        List result = new ArrayList();
-
-        //Iterate through the children of the root as the root is not in the store
-        Object[] children = treeContentProvider.getChildren(root);
-        for (int i = 0; i < children.length; ++i) {
-            findAllWhiteCheckedItems(children[i], result);
-        }
-
-        return result;
-    }
-
-    /**
-     *	Answer the number of elements that have been checked by the
-     *	user.
-     *
-     *	@return int
-     */
-    public int getCheckedElementCount() {
-        return checkedStateStore.size();
-    }
-
-    /**
-     * Get the full label of the treeElement (its name and its parent's name).
-     * @param treeElement - the element being exported
-     * @param parentLabel - the label of the parent, can be null
-     * @return String
-     */
-    protected String getFullLabel(Object treeElement, String parentLabel) {
-        String label = parentLabel;
-        if (parentLabel == null){
-        	label = ""; //$NON-NLS-1$
-        }
-        IPath parentName = new Path(label);
-
-        String elementText = treeLabelProvider.getText(treeElement);
-        if(elementText == null) {
-			return parentName.toString();
-		}
-        return parentName.append(elementText).toString();
-    }
-
-    /**
-     *	Return a count of the number of list items associated with a
-     *	given tree item.
-     *
-     *	@return int
-     *	@param treeElement java.lang.Object
-     */
-    protected int getListItemsSize(Object treeElement) {
-        Object[] elements = listContentProvider.getElements(treeElement);
-        return elements.length;
-    }
-
-    /**
-     * Get the table the list viewer uses.
-     * @return org.eclipse.swt.widgets.Table
-     */
-    public Table getListTable() {
-        return this.listViewer.getTable();
-    }
-
-    /**
-     *	Logically gray-check all ancestors of treeItem by ensuring that they
-     *	appear in the checked table
-     */
-    protected void grayCheckHierarchy(Object treeElement) {
-
-        //expand the element first to make sure we have populated for it
-        expandTreeElement(treeElement);
-
-        // if this tree element is already gray then its ancestors all are as well
-        if (checkedStateStore.containsKey(treeElement)) {
-			return; // no need to proceed upwards from here
-		}
-
-        checkedStateStore.put(treeElement, new ArrayList());
-        Object parent = treeContentProvider.getParent(treeElement);
-        if (parent != null) {
-			grayCheckHierarchy(parent);
-		}
-    }
-
-    /**
-     *	Set the checked state of self and all ancestors appropriately. Do not white check anyone - this is
-     *  only done down a hierarchy.
-     */
-    private void grayUpdateHierarchy(Object treeElement) {
-
-        boolean shouldBeAtLeastGray = determineShouldBeAtLeastGrayChecked(treeElement);
-
-        treeViewer.setGrayChecked(treeElement, shouldBeAtLeastGray);
-
-        if (whiteCheckedTreeItems.contains(treeElement)) {
-			whiteCheckedTreeItems.remove(treeElement);
-		}
-
-        // proceed up the tree element hierarchy
-        Object parent = treeContentProvider.getParent(treeElement);
-        if (parent != null) {
-            grayUpdateHierarchy(parent);
-        }
-    }
-
-    /**
-     *	Set the initial checked state of the passed list element to true.
-     * @param element
-     */
-    public void initialCheckListItem(Object element) {
-        Object parent = treeContentProvider.getParent(element);
-        selectAndReveal(parent);
-        //Check the element in the viewer as if it had been manually checked
-        listViewer.setChecked(element, true);
-        //As this is not done from the UI then set the box for updating from the selection to false 
-        listItemChecked(element, true, false);
-        grayUpdateHierarchy(parent);
-    }
-
-    /**
-     * Set the initial checked state of the passed element to true,
-     * as well as to all of its children and associated list elements
-     * @param element
-     */
-    public void initialCheckTreeItem(Object element) {
-        treeItemChecked(element, true);
-        selectAndReveal(element);
-    }
-
-    private void selectAndReveal(Object treeElement) {
-        treeViewer.reveal(treeElement);
-        IStructuredSelection selection = new StructuredSelection(treeElement);
-        treeViewer.setSelection(selection);
-    }
-
-    /**
-     *	Initialize this group's viewers after they have been laid out.
-     */
-    protected void initialize() {
-        treeViewer.setInput(root);
-        this.expandedTreeNodes = new ArrayList();
-        this.expandedTreeNodes.add(root);
-
-    }
-
-    /**
-     *	Callback that's invoked when the checked status of an item in the list
-     *	is changed by the user. Do not try and update the hierarchy if we are building the
-     *  initial list.
-     */
-    protected void listItemChecked(Object listElement, boolean state,
-            boolean updatingFromSelection) {
-        List checkedListItems = (List) checkedStateStore
-                .get(currentTreeSelection);
-        //If it has not been expanded do so as the selection of list items will affect gray state
-        if (!expandedTreeNodes.contains(currentTreeSelection)) {
-			expandTreeElement(currentTreeSelection);
-		}
-
-        if (state) {
-            if (checkedListItems == null) {
-                // since the associated tree item has gone from 0 -> 1 checked
-                // list items, tree checking may need to be updated
-                grayCheckHierarchy(currentTreeSelection);
-                checkedListItems = (List) checkedStateStore
-                        .get(currentTreeSelection);
-            }
-            checkedListItems.add(listElement);
-        } else {
-            checkedListItems.remove(listElement);
-            if (checkedListItems.isEmpty()) {
-                // since the associated tree item has gone from 1 -> 0 checked
-                // list items, tree checking may need to be updated
-                ungrayCheckHierarchy(currentTreeSelection);
-            }
-        }
-
-        //Update the list with the selections if there are any
-        if (checkedListItems.size() > 0) {
-			checkedStateStore.put(currentTreeSelection, checkedListItems);
-		}
-        if (updatingFromSelection) {
-			grayUpdateHierarchy(currentTreeSelection);
-		}
-    }
-
-    /**
-     *	Notify all checked state listeners that the passed element has had
-     *	its checked state changed to the passed state
-     */
-    protected void notifyCheckStateChangeListeners(
-            final CheckStateChangedEvent event) {
-        Object[] array = getListeners();
-        for (int i = 0; i < array.length; i++) {
-            final ICheckStateListener l = (ICheckStateListener) array[i];
-            SafeRunner.run(new SafeRunnable() {
-                public void run() {
-                    l.checkStateChanged(event);
-                }
-            });
-        }
-    }
-
-    /**
-     *Set the contents of the list viewer based upon the specified selected
-     *tree element.  This also includes checking the appropriate list items.
-     *
-     *@param treeElement java.lang.Object
-     */
-    protected void populateListViewer(final Object treeElement) {
-        listViewer.setInput(treeElement);
-
-        //If the element is white checked but not expanded we have not set up all of the children yet
-        if (!(expandedTreeNodes.contains(treeElement))
-                && whiteCheckedTreeItems.contains(treeElement)) {
-
-            //Potentially long operation - show a busy cursor
-            BusyIndicator.showWhile(treeViewer.getControl().getDisplay(),
-                    new Runnable() {
-                        public void run() {
-                            setListForWhiteSelection(treeElement);
-                            listViewer.setAllChecked(true);
-                        }
-                    });
-
-        } else {
-            List listItemsToCheck = (List) checkedStateStore.get(treeElement);
-
-            if (listItemsToCheck != null) {
-                Iterator listItemsEnum = listItemsToCheck.iterator();
-                while (listItemsEnum.hasNext()) {
-					listViewer.setChecked(listItemsEnum.next(), true);
-				}
-            }
-        }
-    }
-
-    /**
-     *	Logically gray-check all ancestors of treeItem by ensuring that they
-     *	appear in the checked table. Add any elements to the selectedNodes
-     *  so we can track that has been done.
-     */
-    private void primeHierarchyForSelection(Object item, Set selectedNodes) {
-
-        //Only prime it if we haven't visited yet
-        if (selectedNodes.contains(item)) {
-			return;
-		}
-
-        checkedStateStore.put(item, new ArrayList());
-
-        //mark as expanded as we are going to populate it after this
-        expandedTreeNodes.add(item);
-        selectedNodes.add(item);
-
-        Object parent = treeContentProvider.getParent(item);
-        if (parent != null) {
-			primeHierarchyForSelection(parent, selectedNodes);
-		}
-    }
-
-    /**
-     *	Remove the passed listener from self's collection of clients
-     *	that listen for changes to element checked states
-     *
-     *	@param listener ICheckStateListener
-     */
-    public void removeCheckStateListener(ICheckStateListener listener) {
-        removeListenerObject(listener);
-    }
-
-    /**
-     *	Handle the selection of an item in the tree viewer
-     *
-     *	@param event SelectionChangedEvent
-     */
-    public void selectionChanged(SelectionChangedEvent event) {
-        IStructuredSelection selection = (IStructuredSelection) event
-                .getSelection();
-        Object selectedElement = selection.getFirstElement();
-        if (selectedElement == null) {
-            currentTreeSelection = null;
-            listViewer.setInput(currentTreeSelection);
-            return;
-        }
-
-        // ie.- if not an item deselection
-        if (selectedElement != currentTreeSelection) {
-			populateListViewer(selectedElement);
-		}
-
-        currentTreeSelection = selectedElement;
-    }
-
-    /**
-     * Select or deselect all of the elements in the tree depending on the value of the selection
-     * boolean. Be sure to update the displayed files as well.
-     * @param selection
-     */
-    public void setAllSelections(final boolean selection) {
-
-        //If there is no root there is nothing to select
-        if (root == null) {
-			return;
-		}
-
-        //Potentially long operation - show a busy cursor
-        BusyIndicator.showWhile(treeViewer.getControl().getDisplay(),
-                new Runnable() {
-                    public void run() {
-                        setTreeChecked(root, selection);
-                        listViewer.setAllChecked(selection);
-                    }
-                });
-    }
-
-    /**
-     * The treeElement has been white selected. Get the list for the element and
-     * set it in the checked state store.
-     * @param treeElement the element being updated
-     */
-    private void setListForWhiteSelection(Object treeElement) {
-
-        Object[] listItems = listContentProvider.getElements(treeElement);
-        List listItemsChecked = new ArrayList();
-        for (int i = 0; i < listItems.length; ++i) {
-            listItemsChecked.add(listItems[i]);
-        }
-
-        checkedStateStore.put(treeElement, listItemsChecked);
-    }
-
-    /**
-     *	Set the list viewer's providers to those passed
-     *
-     *	@param contentProvider ITreeContentProvider
-     *	@param labelProvider ILabelProvider
-     */
-    public void setListProviders(IStructuredContentProvider contentProvider,
-            ILabelProvider labelProvider) {
-        listViewer.setContentProvider(contentProvider);
-        listViewer.setLabelProvider(labelProvider);
-    }
-
-    /**
-     * Set the comparator that is to be applied to self's list viewer
-     * 
-     * @param comparator the sorter for the list
-     */
-    public void setListComparator(ViewerComparator comparator) {
-        listViewer.setComparator(comparator);
-    }
-
-    /**
-     * Set the root of the widget to be new Root. Regenerate all of the tables and lists from this
-     * value.
-     * @param newRoot 
-     */
-    public void setRoot(Object newRoot) {
-        this.root = newRoot;
-        initialize();
-    }
-
-    /**
-     *	Set the checked state of the passed tree element appropriately, and
-     *	do so recursively to all of its child tree elements as well
-     */
-    protected void setTreeChecked(Object treeElement, boolean state) {
-
-        if (treeElement.equals(currentTreeSelection)) {
-            listViewer.setAllChecked(state);
-        }
-
-        if (state) {
-            setListForWhiteSelection(treeElement);
-        } else {
-			checkedStateStore.remove(treeElement);
-		}
-
-        setWhiteChecked(treeElement, state);
-        treeViewer.setChecked(treeElement, state);
-        treeViewer.setGrayed(treeElement, false);
-
-        // now logically check/uncheck all children as well if it has been expanded
-        if (expandedTreeNodes.contains(treeElement)) {
-            Object[] children = treeContentProvider.getChildren(treeElement);
-            for (int i = 0; i < children.length; ++i) {
-                setTreeChecked(children[i], state);
-            }
-        }
-    }
-
-    /**
-     *	Set the tree viewer's providers to those passed
-     *
-     *	@param contentProvider ITreeContentProvider
-     *	@param labelProvider ILabelProvider
-     */
-    public void setTreeProviders(ITreeContentProvider contentProvider,
-            ILabelProvider labelProvider) {
-        treeViewer.setContentProvider(contentProvider);
-        treeViewer.setLabelProvider(labelProvider);
-    }
-
-    /**
-     * Set the comparator that is to be applied to self's tree viewer
-     * 
-     * @param comparator the comparator for the tree
-     */
-    public void setTreeComparator(ViewerComparator comparator) {
-        treeViewer.setComparator(comparator);
-    }
-
-    /**
-     *	Adjust the collection of references to white-checked tree elements appropriately.
-     *
-     *	@param treeElement java.lang.Object
-     *	@param isWhiteChecked boolean
-     */
-    protected void setWhiteChecked(Object treeElement, boolean isWhiteChecked) {
-        if (isWhiteChecked) {
-            if (!whiteCheckedTreeItems.contains(treeElement)) {
-				whiteCheckedTreeItems.add(treeElement);
-			}
-        } else {
-			whiteCheckedTreeItems.remove(treeElement);
-		}
-    }
-
-    /**
-     *	Handle the collapsing of an element in a tree viewer
-     */
-    public void treeCollapsed(TreeExpansionEvent event) {
-        // We don't need to do anything with this
-    }
-
-    /**
-     *	Handle the expansionsion of an element in a tree viewer
-     */
-    public void treeExpanded(TreeExpansionEvent event) {
-        expandTreeElement(event.getElement());
-    }
-
-    /**
-     *  Callback that's invoked when the checked status of an item in the tree
-     *  is changed by the user.
-     */
-    protected void treeItemChecked(Object treeElement, boolean state) {
-
-        // recursively adjust all child tree elements appropriately
-        setTreeChecked(treeElement, state);
-
-        Object parent = treeContentProvider.getParent(treeElement);
-        if (parent == null) {
-			return;
-		}
-
-        // now update upwards in the tree hierarchy 
-        if (state) {
-			grayCheckHierarchy(parent);
-		} else {
-			ungrayCheckHierarchy(parent);
-		}
-
-        //Update the hierarchy but do not white select the parent
-        grayUpdateHierarchy(parent);
-    }
-
-    /**
-     *	Logically un-gray-check all ancestors of treeItem iff appropriate.
-     */
-    protected void ungrayCheckHierarchy(Object treeElement) {
-        if (!determineShouldBeAtLeastGrayChecked(treeElement)) {
-			checkedStateStore.remove(treeElement);
-		}
-
-        Object parent = treeContentProvider.getParent(treeElement);
-        if (parent != null) {
-			ungrayCheckHierarchy(parent);
-		}
-    }
-
-    /**
-     *	Set the checked state of self and all ancestors appropriately
-     */
-    protected void updateHierarchy(Object treeElement) {
-
-        boolean whiteChecked = determineShouldBeWhiteChecked(treeElement);
-        boolean shouldBeAtLeastGray = determineShouldBeAtLeastGrayChecked(treeElement);
-
-        treeViewer.setChecked(treeElement, shouldBeAtLeastGray);
-        setWhiteChecked(treeElement, whiteChecked);
-        if (whiteChecked) {
-			treeViewer.setGrayed(treeElement, false);
-		} else {
-			treeViewer.setGrayed(treeElement, shouldBeAtLeastGray);
-		}
-
-        // proceed up the tree element hierarchy but gray select all of them
-        Object parent = treeContentProvider.getParent(treeElement);
-        if (parent != null) {
-            grayUpdateHierarchy(parent);
-        }
-    }
-
-    /**
-     * Update the selections of the tree elements in items to reflect the new
-     * selections provided.
-     * @param items Map with keys of Object (the tree element) and values of List (the selected
-     * list elements).  
-     * NOTE: This method does not special case keys with no values (i.e., 
-     * a tree element with an empty list).  If a tree element does not have any selected
-     * items, do not include the element in the Map.
-     */
-    public void updateSelections(Map items) {
-        // We are replacing all selected items with the given selected items,
-        // so reinitialize everything.
-        this.listViewer.setAllChecked(false);
-        this.treeViewer.setCheckedElements(new Object[0]);
-        this.whiteCheckedTreeItems = new HashSet();
-        Set selectedNodes = new HashSet();
-        checkedStateStore = new HashMap();
-
-        //Update the store before the hierarchy to prevent updating parents before all of the children are done
-        Iterator keyIterator = items.keySet().iterator();
-        while (keyIterator.hasNext()) {
-            Object key = keyIterator.next();
-            List selections = (List) items.get(key);
-            //Replace the items in the checked state store with those from the supplied items			
-            checkedStateStore.put(key, selections);
-            selectedNodes.add(key);
-            // proceed up the tree element hierarchy
-            Object parent = treeContentProvider.getParent(key);
-            if (parent != null) {
-                // proceed up the tree element hierarchy and make sure everything is in the table		
-                primeHierarchyForSelection(parent, selectedNodes);
-            }
-        }
-
-        // Update the checked tree items.  Since each tree item has a selected
-        // item, all the tree items will be gray checked.
-        treeViewer.setCheckedElements(checkedStateStore.keySet().toArray());
-        treeViewer.setGrayedElements(checkedStateStore.keySet().toArray());
-
-        // Update the listView of the currently selected tree item.
-        if (currentTreeSelection != null) {
-            Object displayItems = items.get(currentTreeSelection);
-            if (displayItems != null) {
-				listViewer.setCheckedElements(((List) displayItems).toArray());
-			}
-        }
-    }
-
-    /** 
-     * Set the focus on to the list widget.
-     */
-    public void setFocus() {
-
-        this.treeViewer.getTree().setFocus();
-    }
-
-}
-
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ResourceWorkingSetPage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ResourceWorkingSetPage.java
deleted file mode 100644
index a89dfdd..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/ResourceWorkingSetPage.java
+++ /dev/null
@@ -1,574 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *      IBM Corporation - initial API and implementation 
- *  	Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog font
- * 		should be activated and used by other components.
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.DecoratingLabelProvider;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.ITreeViewerListener;
-import org.eclipse.jface.viewers.TreeExpansionEvent;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-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.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.IWorkingSetPage;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * A resource working set page allows the user to edit an 
- * existing working set and create a new working set.
- * <p>
- * Working set elements are presented as a simple resource tree.
- * </p>
- * 
- * @since 2.0
- */
-public class ResourceWorkingSetPage extends WizardPage implements
-        IWorkingSetPage {
-    private final static int SIZING_SELECTION_WIDGET_WIDTH = 50;
-
-    private final static int SIZING_SELECTION_WIDGET_HEIGHT = 200;
-
-    private Text text;
-
-    private CheckboxTreeViewer tree;
-
-    private IWorkingSet workingSet;
-
-    private boolean firstCheck = false; // set to true if selection is set in setSelection
-
-    /**
-     * Creates a new instance of the receiver.
-     */
-    public ResourceWorkingSetPage() {
-        super(
-                "resourceWorkingSetPage", //$NON-NLS-1$ 
-                IDEWorkbenchMessages.ResourceWorkingSetPage_title,
-                IDEInternalWorkbenchImages
-                        .getImageDescriptor(IDEInternalWorkbenchImages.IMG_WIZBAN_RESOURCEWORKINGSET_WIZ));
-        setDescription(IDEWorkbenchMessages.ResourceWorkingSetPage_description);
-    }
-
-    /**
-     * Adds working set elements contained in the given container to the list
-     * of checked resources.
-     * 
-     * @param collectedResources list of collected resources
-     * @param container container to collect working set elements for
-     */
-    private void addWorkingSetElements(List collectedResources,
-            IContainer container) {
-        IAdaptable[] elements = workingSet.getElements();
-        IPath containerPath = container.getFullPath();
-
-        for (int i = 0; i < elements.length; i++) {
-            IResource resource = null;
-
-            if (elements[i] instanceof IResource) {
-				resource = (IResource) elements[i];
-			} else {
-				resource = (IResource) elements[i].getAdapter(IResource.class);
-			}
-
-            if (resource != null) {
-                IPath resourcePath = resource.getFullPath();
-                if (containerPath.isPrefixOf(resourcePath)) {
-					collectedResources.add(elements[i]);
-				}
-            }
-        }
-    }
-
-    /**
-     * Overrides method in WizardPage.
-     * 
-     * @see org.eclipse.jface.wizard.WizardPage#createControl(Composite)
-     */
-    public void createControl(Composite parent) {
-    	initializeDialogUnits(parent);
-    	
-        Composite composite = new Composite(parent, SWT.NULL);
-        composite.setLayout(new GridLayout());
-        composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-        setControl(composite);
-
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(composite,
-                IIDEHelpContextIds.WORKING_SET_RESOURCE_PAGE);
-        Label label = new Label(composite, SWT.WRAP);
-        label.setText(IDEWorkbenchMessages.ResourceWorkingSetPage_message);
-        GridData data = new GridData(GridData.GRAB_HORIZONTAL
-                | GridData.HORIZONTAL_ALIGN_FILL
-                | GridData.VERTICAL_ALIGN_CENTER);
-        label.setLayoutData(data);
-
-        text = new Text(composite, SWT.SINGLE | SWT.BORDER);
-        text.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
-                | GridData.HORIZONTAL_ALIGN_FILL));
-        text.addModifyListener(new ModifyListener() {
-            public void modifyText(ModifyEvent e) {
-                validateInput();
-            }
-        });
-        text.setFocus();
-
-        label = new Label(composite, SWT.WRAP);
-        label.setText(IDEWorkbenchMessages.ResourceWorkingSetPage_label_tree);
-        data = new GridData(GridData.GRAB_HORIZONTAL
-                | GridData.HORIZONTAL_ALIGN_FILL
-                | GridData.VERTICAL_ALIGN_CENTER);
-        label.setLayoutData(data);
-
-        tree = new CheckboxTreeViewer(composite);
-        tree.setUseHashlookup(true);
-		final ITreeContentProvider treeContentProvider = new WorkbenchContentProvider();
-        tree.setContentProvider(treeContentProvider);
-        tree.setLabelProvider(new DecoratingLabelProvider(
-                new WorkbenchLabelProvider(), IDEWorkbenchPlugin.getDefault()
-                        .getWorkbench().getDecoratorManager()
-                        .getLabelDecorator()));
-        tree.setInput(IDEWorkbenchPlugin.getPluginWorkspace().getRoot());
-        tree.setComparator(new ResourceComparator(ResourceComparator.NAME));
-
-        data = new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL);
-        data.heightHint = SIZING_SELECTION_WIDGET_HEIGHT;
-        data.widthHint = SIZING_SELECTION_WIDGET_WIDTH;
-        tree.getControl().setLayoutData(data);
-
-        tree.addCheckStateListener(new ICheckStateListener() {
-            public void checkStateChanged(CheckStateChangedEvent event) {
-                handleCheckStateChange(event);
-            }
-        });
-
-        tree.addTreeListener(new ITreeViewerListener() {
-            public void treeCollapsed(TreeExpansionEvent event) {
-            }
-
-            public void treeExpanded(TreeExpansionEvent event) {
-                final Object element = event.getElement();
-                if (tree.getGrayed(element) == false) {
-					BusyIndicator.showWhile(getShell().getDisplay(),
-                            new Runnable() {
-                                public void run() {
-                                    setSubtreeChecked((IContainer) element,
-                                            tree.getChecked(element), false);
-                                }
-                            });
-				}
-            }
-        });
-
-		// Add select / deselect all buttons for bug 46669
-		Composite buttonComposite = new Composite(composite, SWT.NONE);
-		GridLayout layout = new GridLayout(2, false);
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		buttonComposite.setLayout(layout);
-		buttonComposite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-		
-		Button selectAllButton = new Button(buttonComposite, SWT.PUSH);
-		selectAllButton.setText(IDEWorkbenchMessages.ResourceWorkingSetPage_selectAll_label);
-		selectAllButton.setToolTipText(IDEWorkbenchMessages.ResourceWorkingSetPage_selectAll_toolTip);
-		selectAllButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent selectionEvent) {
-				BusyIndicator.showWhile(getShell().getDisplay(),
-						new Runnable() {
-							public void run() {
-								tree.setCheckedElements(treeContentProvider
-										.getElements(tree.getInput()));
-								setSubtreeChecked((IContainer) tree.getInput(),
-										true, false);
-							}
-						});
-				validateInput();
-			}
-		});
-		setButtonLayoutData(selectAllButton);
-
-		Button deselectAllButton = new Button(buttonComposite, SWT.PUSH);
-		deselectAllButton.setText(IDEWorkbenchMessages.ResourceWorkingSetPage_deselectAll_label);
-		deselectAllButton.setToolTipText(IDEWorkbenchMessages.ResourceWorkingSetPage_deselectAll_toolTip);
-		deselectAllButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent selectionEvent) {
-				BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
-
-					public void run() {
-						tree.setCheckedElements(treeContentProvider.getElements(tree.getInput()));
-						setSubtreeChecked((IContainer)tree.getInput(), false, false);
-					}
-				});
-				validateInput();
-			}
-		});
-		setButtonLayoutData(deselectAllButton);
-		
-		initializeCheckedState();
-        if (workingSet != null) {
-            text.setText(workingSet.getName());
-        }
-        setPageComplete(false);
-        
-        Dialog.applyDialogFont(composite);
-    }
-
-    /**
-     * Collects all checked resources in the specified container.
-     * 
-     * @param checkedResources the output, list of checked resources
-     * @param container the container to collect checked resources in
-     */
-    private void findCheckedResources(List checkedResources,
-            IContainer container) {
-        IResource[] resources = null;
-        try {
-            resources = container.members();
-        } catch (CoreException ex) {
-            handleCoreException(
-                    ex,
-                    getShell(),
-                    IDEWorkbenchMessages.ResourceWorkingSetPage_error,
-                    IDEWorkbenchMessages.ResourceWorkingSetPage_error_updateCheckedState);
-        }
-        for (int i = 0; i < resources.length; i++) {
-            if (tree.getGrayed(resources[i])) {
-                if (resources[i].isAccessible()) {
-					findCheckedResources(checkedResources,
-                            (IContainer) resources[i]);
-				} else {
-					addWorkingSetElements(checkedResources,
-                            (IContainer) resources[i]);
-				}
-            } else if (tree.getChecked(resources[i])) {
-                checkedResources.add(resources[i]);
-            }
-        }
-    }
-
-    /**
-     * Implements IWorkingSetPage.
-     * 
-     * @see org.eclipse.ui.dialogs.IWorkingSetPage#finish()
-     */
-    public void finish() {
-        ArrayList resources = new ArrayList(10);
-        findCheckedResources(resources, (IContainer) tree.getInput());
-        if (workingSet == null) {
-            IWorkingSetManager workingSetManager = PlatformUI.getWorkbench()
-                    .getWorkingSetManager();
-            workingSet = workingSetManager.createWorkingSet(
-                    getWorkingSetName(), (IAdaptable[]) resources
-                            .toArray(new IAdaptable[resources.size()]));
-        } else {
-            workingSet.setName(getWorkingSetName());
-            workingSet.setElements((IAdaptable[]) resources
-                    .toArray(new IAdaptable[resources.size()]));
-        }
-    }
-
-    /**
-     * Implements IWorkingSetPage.
-     * 
-     * @see org.eclipse.ui.dialogs.IWorkingSetPage#getSelection()
-     */
-    public IWorkingSet getSelection() {
-        return workingSet;
-    }
-
-    /**
-     * Returns the name entered in the working set name field.
-     * 
-     * @return the name entered in the working set name field.
-     */
-    private String getWorkingSetName() {
-        return text.getText();
-    }
-
-    /**
-     * Called when the checked state of a tree item changes.
-     * 
-     * @param event the checked state change event.
-     */
-    private void handleCheckStateChange(final CheckStateChangedEvent event) {
-        BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
-            public void run() {
-                IResource resource = (IResource) event.getElement();
-                boolean state = event.getChecked();
-
-                tree.setGrayed(resource, false);
-                if (resource instanceof IContainer) {
-                    setSubtreeChecked((IContainer) resource, state, true);
-                }
-                updateParentState(resource);
-                validateInput();
-            }
-        });
-    }
-
-    /**
-     * Displays an error message when a CoreException occured.
-     * 
-     * @param exception the CoreException 
-     * @param shell parent shell for the message box
-     * @param title the mesage box title
-     * @param message additional error message
-     */
-    private void handleCoreException(CoreException exception, Shell shell,
-            String title, String message) {
-        IStatus status = exception.getStatus();
-        if (status != null) {
-            ErrorDialog.openError(shell, title, message, status);
-        } else {
-            MessageDialog
-                    .openError(
-                            shell,
-                            IDEWorkbenchMessages.InternalError, exception.getLocalizedMessage());
-        }
-    }
-
-    /**
-     * Sets the checked state of tree items based on the initial 
-     * working set, if any.
-     */
-    private void initializeCheckedState() {
-        BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
-            public void run() {
-            	Object[] items = null;
-            	if (workingSet == null) {
-
-            		IWorkbenchPage page = IDEWorkbenchPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
-            		if(page == null) {
-            			return;
-            		}
-            		IWorkbenchPart part = page.getActivePart();
-            		if(part == null) {
-            			return;
-            		}
-            		ISelection selection = page.getSelection();
-            		if(selection instanceof IStructuredSelection) {
-            			items = ((IStructuredSelection)selection).toArray();
-            		}
-
-        		} else {
-        			items = workingSet.getElements();
-        		}
-            	if(items == null) {
-            		return;
-            	}
-                tree.setCheckedElements(items);
-                for (int i = 0; i < items.length; i++) {
-                	IAdaptable item = null;
-                	if(!(items[i] instanceof IAdaptable)) {
-                		continue;
-                	}
-                	item = (IAdaptable)items[i];
-                    IContainer container = null;
-                    IResource resource = null;
-
-                    if (item instanceof IContainer) {
-                        container = (IContainer) item;
-                    } else {
-                        container = (IContainer) item
-                                .getAdapter(IContainer.class);
-                    }
-                    if (container != null) {
-                        setSubtreeChecked(container, true, true);
-                    }
-                    if (item instanceof IResource) {
-                        resource = (IResource) item;
-                    } else {
-                        resource = (IResource) item.getAdapter(IResource.class);
-                    }
-                    if (resource != null && resource.isAccessible() == false) {
-                        IProject project = resource.getProject();
-                        if (tree.getChecked(project) == false) {
-							tree.setGrayChecked(project, true);
-						}
-                    } else {
-                        updateParentState(resource);
-                    }
-                }
-            }
-        });
-    }
-
-    /**
-     * Implements IWorkingSetPage.
-     * 
-     * @see org.eclipse.ui.dialogs.IWorkingSetPage#setSelection(IWorkingSet)
-     */
-    public void setSelection(IWorkingSet workingSet) {
-        if (workingSet == null) {
-            throw new IllegalArgumentException("Working set must not be null"); //$NON-NLS-1$
-        }
-        this.workingSet = workingSet;
-        if (getShell() != null && text != null) {
-            firstCheck = true;
-            initializeCheckedState();
-            text.setText(workingSet.getName());
-        }
-    }
-
-    /**
-     * Sets the checked state of the container's members.
-     * 
-     * @param container the container whose children should be checked/unchecked
-     * @param state true=check all members in the container. false=uncheck all 
-     * 	members in the container.
-     * @param checkExpandedState true=recurse into sub-containers and set the 
-     * 	checked state. false=only set checked state of members of this container
-     */
-    private void setSubtreeChecked(IContainer container, boolean state,
-            boolean checkExpandedState) {
-        // checked state is set lazily on expand, don't set it if container is collapsed
-        if (container.isAccessible() == false
-                || (tree.getExpandedState(container) == false && state && checkExpandedState)) {
-            return;
-        }
-        IResource[] members = null;
-        try {
-            members = container.members();
-        } catch (CoreException ex) {
-            handleCoreException(
-                    ex,
-                    getShell(),
-                    IDEWorkbenchMessages.ResourceWorkingSetPage_error,
-                    IDEWorkbenchMessages.ResourceWorkingSetPage_error_updateCheckedState);
-        }
-        for (int i = members.length - 1; i >= 0; i--) {
-            IResource element = members[i];
-            boolean elementGrayChecked = tree.getGrayed(element)
-                    || tree.getChecked(element);
-
-            if (state) {
-                tree.setChecked(element, true);
-                tree.setGrayed(element, false);
-            } else {
-                tree.setGrayChecked(element, false);
-            }
-            // unchecked state only needs to be set when the container is 
-            // checked or grayed
-            if (element instanceof IContainer && (state || elementGrayChecked)) {
-                setSubtreeChecked((IContainer) element, state, true);
-            }
-        }
-    }
-
-    /**
-     * Check and gray the resource parent if all resources of the 
-     * parent are checked.
-     * 
-     * @param child the resource whose parent checked state should 
-     * 	be set.
-     */
-    private void updateParentState(IResource child) {
-        if (child == null || child.getParent() == null) {
-			return;
-		}
-
-        IContainer parent = child.getParent();
-        boolean childChecked = false;
-        IResource[] members = null;
-        try {
-            members = parent.members();
-        } catch (CoreException ex) {
-            handleCoreException(
-                    ex,
-                    getShell(),
-                    IDEWorkbenchMessages.ResourceWorkingSetPage_error,
-                    IDEWorkbenchMessages.ResourceWorkingSetPage_error_updateCheckedState);
-        }
-        for (int i = members.length - 1; i >= 0; i--) {
-            if (tree.getChecked(members[i]) || tree.getGrayed(members[i])) {
-                childChecked = true;
-                break;
-            }
-        }
-        tree.setGrayChecked(parent, childChecked);
-        updateParentState(parent);
-    }
-
-    /**
-     * Validates the working set name and the checked state of the 
-     * resource tree.
-     */
-    private void validateInput() {
-        String errorMessage = null;
-        String infoMessage= null;
-        String newText = text.getText();
-
-        if (newText.equals(newText.trim()) == false) {
-            errorMessage = IDEWorkbenchMessages.ResourceWorkingSetPage_warning_nameWhitespace; 
-        } else if (firstCheck) {
-            firstCheck = false;
-            return;
-        }
-        if (newText.equals("")) { //$NON-NLS-1$
-            errorMessage = IDEWorkbenchMessages.ResourceWorkingSetPage_warning_nameMustNotBeEmpty;
-        }
-        if (errorMessage == null
-                && (workingSet == null || newText.equals(workingSet.getName()) == false)) {
-            IWorkingSet[] workingSets = PlatformUI.getWorkbench()
-                    .getWorkingSetManager().getWorkingSets();
-            for (int i = 0; i < workingSets.length; i++) {
-                if (newText.equals(workingSets[i].getName())) {
-                    errorMessage = IDEWorkbenchMessages.ResourceWorkingSetPage_warning_workingSetExists;
-                }
-            }
-        }
-        if (infoMessage == null && tree.getCheckedElements().length == 0) {
-        	infoMessage = IDEWorkbenchMessages.ResourceWorkingSetPage_warning_resourceMustBeChecked;
-        }
-        setMessage(infoMessage, INFORMATION);
-        setErrorMessage(errorMessage);
-        setPageComplete(errorMessage == null);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/SimpleListContentProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/SimpleListContentProvider.java
deleted file mode 100644
index b5f8f77..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/SimpleListContentProvider.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * The SimpleListContentProvider is a class designed to return a static list of items
- * when queried for use in simple list dialogs.
- */
-public class SimpleListContentProvider implements IStructuredContentProvider {
-
-    //The elements to display
-    private Object[] elements;
-
-    /**
-     * SimpleListContentProvider constructor comment.
-     */
-    public SimpleListContentProvider() {
-        super();
-    }
-
-    /**
-     * Do nothing when disposing,
-     */
-    public void dispose() {
-    }
-
-    /**
-     * Returns the elements to display in the viewer. The inputElement is ignored for this
-     * provider.
-     */
-    public Object[] getElements(Object inputElement) {
-        return this.elements;
-    }
-
-    /**
-     * Required method from IStructuredContentProvider. The input is assumed to not change 
-     * for the SimpleListContentViewer so do nothing here.
-     */
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-    }
-
-    /**
-     * Set the elements to display.
-     * @param items Object[]
-     */
-    public void setElements(Object[] items) {
-
-        this.elements = items;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeEditor.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeEditor.java
deleted file mode 100644
index 3d64ad5..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeEditor.java
+++ /dev/null
@@ -1,1035 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.preference.JFacePreferences;
-import org.eclipse.jface.resource.JFaceColors;
-import org.eclipse.jface.resource.JFaceResources;
-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.ScrolledComposite;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.GC;
-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.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.part.EditorPart;
-import org.xml.sax.SAXException;
-
-/**
- * A "fake" editor to show a welcome page
- * The contents of this page are supplied in the product configuration
- *
- * PRIVATE
- *		This class is internal to the workbench and must not be called outside the workbench
- */
-public class WelcomeEditor extends EditorPart {
-
-    private final static int HORZ_SCROLL_INCREMENT = 20;
-
-    private final static int VERT_SCROLL_INCREMENT = 20;
-
-    // width at which wrapping will stop and a horizontal scroll bar will be 
-    // introduced
-    private final static int WRAP_MIN_WIDTH = 150;
-
-    private Composite editorComposite;
-
-    private Cursor handCursor;
-
-    private Cursor busyCursor;
-
-    private WelcomeParser parser;
-
-    private ArrayList hyperlinkRanges = new ArrayList();
-
-    private ArrayList texts = new ArrayList();
-
-    private ScrolledComposite scrolledComposite;
-
-    private IPropertyChangeListener colorListener;
-
-    private boolean mouseDown = false;
-
-    private boolean dragEvent = false;
-
-    private StyledText firstText, lastText;
-
-    private StyledText lastNavigatedText, currentText;
-
-    private boolean nextTabAbortTraversal, previousTabAbortTraversal = false;
-
-    private WelcomeEditorCopyAction copyAction;
-
-    /**
-     * Create a new instance of the welcome editor
-     */
-    public WelcomeEditor() {
-        super();
-        setPartName(IDEWorkbenchMessages.WelcomeEditor_title);
-        copyAction = new WelcomeEditorCopyAction(this);
-        copyAction.setEnabled(false);
-    }
-
-    /**
-     * Update the welcome page to start at the
-     * beginning of the text.
-     */
-    private void focusOn(StyledText newText, int caretOffset) {
-        if (newText == null) {
-			return;
-		}
-        newText.setFocus();
-        newText.setCaretOffset(caretOffset);
-        scrolledComposite.setOrigin(0, newText.getLocation().y);
-    }
-
-    /**
-     * Finds the next text 
-     */
-    private StyledText nextText(StyledText text) {
-        int index = 0;
-        if (text == null) {
-			return (StyledText) texts.get(0);
-		} else {
-			index = texts.indexOf(text);
-		}
-
-        //If we are not at the end....
-        if (index < texts.size() - 1) {
-			return (StyledText) texts.get(index + 1);
-		} else {
-			return (StyledText) texts.get(0);
-		}
-    }
-
-    /**
-     * Finds the previous text 
-     */
-    private StyledText previousText(StyledText text) {
-        int index = 0;
-        if (text == null) {
-			return (StyledText) texts.get(0);
-		} else {
-			index = texts.indexOf(text);
-		}
-
-        //If we are at the beginning....
-        if (index == 0) {
-			return (StyledText) texts.get(texts.size() - 1);
-		} else {
-			return (StyledText) texts.get(index - 1);
-		}
-    }
-
-    /**
-     * Returns the current text.
-     */
-    protected StyledText getCurrentText() {
-        return currentText;
-    }
-
-    /**
-     * Returns the copy action. 
-     */
-    protected WelcomeEditorCopyAction getCopyAction() {
-        return copyAction;
-    }
-
-    /**
-     * Finds the next link after the current selection.
-     */
-    private StyleRange findNextLink(StyledText text) {
-        if (text == null) {
-			return null;
-		}
-
-        WelcomeItem item = (WelcomeItem) text.getData();
-        StyleRange[] ranges = text.getStyleRanges();
-        int currentSelectionEnd = text.getSelection().y;
-
-        for (int i = 0; i < ranges.length; i++) {
-            if (ranges[i].start >= currentSelectionEnd) {
-				if (item.isLinkAt(ranges[i].start)) {
-					return ranges[i];
-				}
-			}
-        }
-        return null;
-    }
-
-    /**
-     * Finds the previous link before the current selection.
-     */
-    private StyleRange findPreviousLink(StyledText text) {
-        if (text == null) {
-			return null;
-		}
-
-        WelcomeItem item = (WelcomeItem) text.getData();
-        StyleRange[] ranges = text.getStyleRanges();
-        int currentSelectionStart = text.getSelection().x;
-
-        for (int i = ranges.length - 1; i > -1; i--) {
-            if ((ranges[i].start + ranges[i].length) < currentSelectionStart) {
-				if (item.isLinkAt(ranges[i].start + ranges[i].length - 1)) {
-					return ranges[i];
-				}
-			}
-        }
-        return null;
-    }
-
-    /**
-     * Finds the current link of the current selection.
-     */
-    protected StyleRange getCurrentLink(StyledText text) {
-        StyleRange[] ranges = text.getStyleRanges();
-        int currentSelectionEnd = text.getSelection().y;
-        int currentSelectionStart = text.getSelection().x;
-
-        for (int i = 0; i < ranges.length; i++) {
-            if ((currentSelectionStart >= ranges[i].start)
-                    && (currentSelectionEnd <= (ranges[i].start + ranges[i].length))) {
-                return ranges[i];
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Adds listeners to the given styled text
-     */
-    private void addListeners(StyledText styledText) {
-        styledText.addMouseListener(new MouseAdapter() {
-            public void mouseDown(MouseEvent e) {
-                if (e.button != 1) {
-                    return;
-                }
-                mouseDown = true;
-            }
-
-            public void mouseUp(MouseEvent e) {
-                mouseDown = false;
-                StyledText text = (StyledText) e.widget;
-                WelcomeItem item = (WelcomeItem) e.widget.getData();
-                int offset = text.getCaretOffset();
-                if (dragEvent) {
-                    dragEvent = false;
-                    if (item.isLinkAt(offset)) {
-                        text.setCursor(handCursor);
-                    }
-                } else if (item.isLinkAt(offset)) {
-                    text.setCursor(busyCursor);
-                    if (e.button == 1) {
-                        item.triggerLinkAt(offset);
-                        StyleRange selectionRange = getCurrentLink(text);
-                        text.setSelectionRange(selectionRange.start,
-                                selectionRange.length);
-                        text.setCursor(null);
-                    }
-                }
-            }
-        });
-
-        styledText.addMouseMoveListener(new MouseMoveListener() {
-            public void mouseMove(MouseEvent e) {
-                // Do not change cursor on drag events
-                if (mouseDown) {
-                    if (!dragEvent) {
-                        StyledText text = (StyledText) e.widget;
-                        text.setCursor(null);
-                    }
-                    dragEvent = true;
-                    return;
-                }
-                StyledText text = (StyledText) e.widget;
-                WelcomeItem item = (WelcomeItem) e.widget.getData();
-                int offset = -1;
-                try {
-                    offset = text.getOffsetAtLocation(new Point(e.x, e.y));
-                } catch (IllegalArgumentException ex) {
-                    // location is not over a character
-                }
-                if (offset == -1) {
-					text.setCursor(null);
-				} else if (item.isLinkAt(offset)) {
-					text.setCursor(handCursor);
-				} else {
-					text.setCursor(null);
-				}
-            }
-        });
-
-        styledText.addTraverseListener(new TraverseListener() {
-            public void keyTraversed(TraverseEvent e) {
-                StyledText text = (StyledText) e.widget;
-
-                switch (e.detail) {
-                case SWT.TRAVERSE_ESCAPE:
-                    e.doit = true;
-                    break;
-                case SWT.TRAVERSE_TAB_NEXT:
-                    // Handle Ctrl-Tab
-                    if ((e.stateMask & SWT.CTRL) != 0) {
-                        if (e.widget == lastText) {
-							return;
-						} else {
-                            e.doit = false;
-                            nextTabAbortTraversal = true;
-                            lastText.traverse(SWT.TRAVERSE_TAB_NEXT);
-                            return;
-                        }
-                    }
-                    if (nextTabAbortTraversal) {
-                        nextTabAbortTraversal = false;
-                        return;
-                    }
-                    // Find the next link in current widget, if applicable
-                    // Stop at top of widget
-                    StyleRange nextLink = findNextLink(text);
-                    if (nextLink == null) {
-                        // go to the next widget, focus at beginning
-                        StyledText nextText = nextText(text);
-                        nextText.setSelection(0);
-                        focusOn(nextText, 0);
-                    } else {
-                        // focusOn: allow none tab traversals to align
-                        focusOn(text, text.getSelection().x);
-                        text.setSelectionRange(nextLink.start, nextLink.length);
-                    }
-                    e.detail = SWT.TRAVERSE_NONE;
-                    e.doit = true;
-                    break;
-                case SWT.TRAVERSE_TAB_PREVIOUS:
-                    // Handle Ctrl-Shift-Tab
-                    if ((e.stateMask & SWT.CTRL) != 0) {
-                        if (e.widget == firstText) {
-							return;
-						} else {
-                            e.doit = false;
-                            previousTabAbortTraversal = true;
-                            firstText.traverse(SWT.TRAVERSE_TAB_PREVIOUS);
-                            return;
-                        }
-                    }
-                    if (previousTabAbortTraversal) {
-                        previousTabAbortTraversal = false;
-                        return;
-                    }
-                    // Find the previous link in current widget, if applicable
-                    // Stop at top of widget also
-                    StyleRange previousLink = findPreviousLink(text);
-                    if (previousLink == null) {
-                        if (text.getSelection().x == 0) {
-                            // go to the previous widget, focus at end
-                            StyledText previousText = previousText(text);
-                            previousText.setSelection(previousText
-                                    .getCharCount());
-                            previousLink = findPreviousLink(previousText);
-                            if (previousLink == null) {
-								focusOn(previousText, 0);
-							} else {
-                                focusOn(previousText, previousText
-                                        .getSelection().x);
-                                previousText
-                                        .setSelectionRange(previousLink.start,
-                                                previousLink.length);
-                            }
-                        } else {
-                            // stay at top of this widget
-                            focusOn(text, 0);
-                        }
-                    } else {
-                        // focusOn: allow none tab traversals to align
-                        focusOn(text, text.getSelection().x);
-                        text.setSelectionRange(previousLink.start,
-                                previousLink.length);
-                    }
-                    e.detail = SWT.TRAVERSE_NONE;
-                    e.doit = true;
-                    break;
-                default:
-                    break;
-                }
-            }
-        });
-
-        styledText.addKeyListener(new KeyListener() {
-            public void keyReleased(KeyEvent e) {
-                //Ignore a key release
-            }
-
-            public void keyPressed(KeyEvent event) {
-                StyledText text = (StyledText) event.widget;
-                if (event.character == ' ' || event.character == SWT.CR) {
-                    if (text != null) {
-                        WelcomeItem item = (WelcomeItem) text.getData();
-
-                        //Be sure we are in the selection
-                        int offset = text.getSelection().x + 1;
-
-                        if (item.isLinkAt(offset)) {
-                            text.setCursor(busyCursor);
-                            item.triggerLinkAt(offset);
-                            StyleRange selectionRange = getCurrentLink(text);
-                            text.setSelectionRange(selectionRange.start,
-                                    selectionRange.length);
-                            text.setCursor(null);
-                        }
-                    }
-                    return;
-                }
-
-                // When page down is pressed, move the cursor to the next item in the 
-                // welcome page.   Note that this operation wraps (pages to the top item
-                // when the last item is reached).
-                if (event.keyCode == SWT.PAGE_DOWN) {
-                    focusOn(nextText(text), 0);
-                    return;
-                }
-
-                // When page up is pressed, move the cursor to the previous item in the 
-                // welcome page.  Note that this operation wraps (pages to the bottom item
-                // when the first item is reached).
-                if (event.keyCode == SWT.PAGE_UP) {
-                    focusOn(previousText(text), 0);
-                    return;
-                }
-            }
-        });
-
-        styledText.addFocusListener(new FocusAdapter() {
-            public void focusLost(FocusEvent e) {
-                // Remember current text widget
-                lastNavigatedText = (StyledText) e.widget;
-            }
-
-            public void focusGained(FocusEvent e) {
-                currentText = (StyledText) e.widget;
-
-                // Remove highlighted selection if text widget has changed
-                if ((currentText != lastNavigatedText)
-                        && (lastNavigatedText != null)) {
-					lastNavigatedText.setSelection(lastNavigatedText
-                            .getSelection().x);
-				}
-
-                // enable/disable copy action
-                copyAction.setEnabled(currentText.getSelectionCount() > 0);
-            }
-        });
-
-        styledText.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                // enable/disable copy action			
-                StyledText text = (StyledText) e.widget;
-                copyAction.setEnabled(text.getSelectionCount() > 0);
-            }
-        });
-    }
-
-    /**
-     * Creates the wizard's title area.
-     *
-     * @param parent the SWT parent for the title area composite
-     * @return the created info area composite
-     */
-    private Composite createInfoArea(Composite parent) {
-        // Create the title area which will contain
-        // a title, message, and image.
-        this.scrolledComposite = new ScrolledComposite(parent, SWT.V_SCROLL
-                | SWT.H_SCROLL);
-        this.scrolledComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-        final Composite infoArea = new Composite(this.scrolledComposite,
-                SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.marginHeight = 10;
-        layout.verticalSpacing = 5;
-        layout.numColumns = 2;
-        infoArea.setLayout(layout);
-        GridData data = new GridData(GridData.FILL_BOTH);
-        infoArea.setLayoutData(data);
-        boolean wrapped = parser.isFormatWrapped();
-        int HINDENT = 20;
-
-        // Get the background color for the title area
-        Display display = parent.getDisplay();
-        Color background = JFaceColors.getBannerBackground(display);
-        Color foreground = JFaceColors.getBannerForeground(display);
-        infoArea.setBackground(background);
-
-        int textStyle = SWT.MULTI | SWT.READ_ONLY;
-        if (wrapped) {
-            textStyle = textStyle | SWT.WRAP;
-        }
-        StyledText sampleStyledText = null;
-        // Create the intro item
-        WelcomeItem item = getIntroItem();
-        if (item != null) {
-            StyledText styledText = new StyledText(infoArea, textStyle);
-            this.texts.add(styledText);
-            sampleStyledText = styledText;
-            styledText.setCursor(null);
-            JFaceColors.setColors(styledText, foreground, background);
-            styledText.setText(getIntroItem().getText());
-            setBoldRanges(styledText, item.getBoldRanges());
-            setLinkRanges(styledText, item.getActionRanges());
-            setLinkRanges(styledText, item.getHelpRanges());
-            GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-            gd.horizontalSpan = 2;
-            gd.horizontalIndent = HINDENT;
-            gd.verticalAlignment = GridData.VERTICAL_ALIGN_BEGINNING;
-            styledText.setLayoutData(gd);
-            styledText.setData(item);
-            addListeners(styledText);
-
-            Label spacer = new Label(infoArea, SWT.NONE);
-            spacer.setBackground(background);
-            gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
-            gd.horizontalSpan = 2;
-            spacer.setLayoutData(gd);
-        }
-        firstText = sampleStyledText;
-
-        // Create the welcome items
-        Label imageLabel = null;
-        WelcomeItem[] items = getItems();
-        for (int i = 0; i < items.length; i++) {
-            Label label = new Label(infoArea, SWT.NONE);
-            label.setBackground(background);
-            label
-                    .setImage(PlatformUI
-                            .getWorkbench()
-                            .getSharedImages()
-                            .getImage(
-                                    IDEInternalWorkbenchImages.IMG_OBJS_WELCOME_ITEM));
-            GridData gd = new GridData();
-            gd.horizontalIndent = HINDENT;
-            gd.verticalAlignment = GridData.VERTICAL_ALIGN_BEGINNING;
-            label.setLayoutData(gd);
-            if (imageLabel == null) {
-                imageLabel = label;
-            }
-
-            StyledText styledText = new StyledText(infoArea, textStyle);
-            this.texts.add(styledText);
-            sampleStyledText = styledText;
-            styledText.setCursor(null);
-            JFaceColors.setColors(styledText, foreground, background);
-            styledText.setText(items[i].getText());
-            setBoldRanges(styledText, items[i].getBoldRanges());
-            setLinkRanges(styledText, items[i].getActionRanges());
-            setLinkRanges(styledText, items[i].getHelpRanges());
-            gd = new GridData(GridData.FILL_HORIZONTAL);
-            gd.verticalAlignment = GridData.VERTICAL_ALIGN_BEGINNING;
-            gd.verticalSpan = 2;
-            styledText.setLayoutData(gd);
-            styledText.setData(items[i]);
-            addListeners(styledText);
-
-            Label spacer = new Label(infoArea, SWT.NONE);
-            spacer.setBackground(background);
-            gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
-            gd.horizontalSpan = 2;
-            spacer.setLayoutData(gd);
-
-            // create context menu
-            MenuManager menuMgr = new MenuManager("#PopUp"); //$NON-NLS-1$
-            menuMgr.add(copyAction);
-            styledText.setMenu(menuMgr.createContextMenu(styledText));
-        }
-
-        lastText = sampleStyledText;
-        this.scrolledComposite.setContent(infoArea);
-        Point p = infoArea.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-        this.scrolledComposite.setMinHeight(p.y);
-        if (wrapped) {
-            // introduce a horizontal scroll bar after a minimum width is reached
-            this.scrolledComposite.setMinWidth(WRAP_MIN_WIDTH);
-        } else {
-            this.scrolledComposite.setMinWidth(p.x);
-        }
-        this.scrolledComposite.setExpandHorizontal(true);
-        this.scrolledComposite.setExpandVertical(true);
-
-        // When the welcome editor is resized, we need to set the width hint for
-        // wrapped StyledText widgets so that the wrapped height will be recalculated.
-        if (wrapped && (imageLabel != null)) {
-            // figure out how wide the StyledText widgets should be, do this by first
-            // calculating the width of the area not used by styled text widgets
-            Rectangle bounds = imageLabel.getBounds();
-            final int adjust = HINDENT + bounds.width + layout.verticalSpacing
-                    + (layout.marginWidth * 2);
-            final int adjustFirst = HINDENT + (layout.marginWidth * 2);
-            infoArea.addListener(SWT.Resize, new Listener() {
-                public void handleEvent(Event event) {
-                    int w = scrolledComposite.getClientArea().width;
-                    // if the horizontal scroll bar exists, we want to wrap to the
-                    // minimum wrap width
-                    if (w < WRAP_MIN_WIDTH) {
-                        w = WRAP_MIN_WIDTH;
-                    }
-                    for (int i = 0; i < texts.size(); i++) {
-                        int extent;
-                        if (i == 0) {
-							extent = w - adjustFirst;
-						} else {
-							extent = w - adjust;
-						}
-                        StyledText text = (StyledText) texts.get(i);
-                        Point p = text.computeSize(extent, SWT.DEFAULT, false);
-                        ((GridData) text.getLayoutData()).widthHint = p.x;
-                    }
-                    // reset the scrolled composite height since the height of the 
-                    // styled text widgets have changed
-                    Point p = infoArea.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-                            true);
-                    scrolledComposite.setMinHeight(p.y);
-                }
-            });
-        }
-
-        // Adjust the scrollbar increments
-        if (sampleStyledText == null) {
-            this.scrolledComposite.getHorizontalBar().setIncrement(
-                    HORZ_SCROLL_INCREMENT);
-            this.scrolledComposite.getVerticalBar().setIncrement(
-                    VERT_SCROLL_INCREMENT);
-        } else {
-            GC gc = new GC(sampleStyledText);
-            int width = gc.getFontMetrics().getAverageCharWidth();
-            gc.dispose();
-            this.scrolledComposite.getHorizontalBar().setIncrement(width);
-            this.scrolledComposite.getVerticalBar().setIncrement(
-                    sampleStyledText.getLineHeight());
-        }
-        return infoArea;
-    }
-
-    /**
-     * Creates the SWT controls for this workbench part.
-     * <p>
-     * Clients should not call this method (the workbench calls this method at
-     * appropriate times).
-     * </p>
-     * <p>
-     * For implementors this is a multi-step process:
-     * <ol>
-     *   <li>Create one or more controls within the parent.</li>
-     *   <li>Set the parent layout as needed.</li>
-     *   <li>Register any global actions with the <code>IActionService</code>.</li>
-     *   <li>Register any popup menus with the <code>IActionService</code>.</li>
-     *   <li>Register a selection provider with the <code>ISelectionService</code>
-     *     (optional). </li>
-     * </ol>
-     * </p>
-     *
-     * @param parent the parent control
-     */
-    public void createPartControl(Composite parent) {
-        // read our contents
-        readFile();
-        if (parser == null) {
-			return;
-		}
-
-        handCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_HAND);
-        busyCursor = new Cursor(parent.getDisplay(), SWT.CURSOR_WAIT);
-
-        editorComposite = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.marginHeight = 0;
-        layout.marginWidth = 0;
-        layout.verticalSpacing = 0;
-        layout.horizontalSpacing = 0;
-        editorComposite.setLayout(layout);
-
-        createTitleArea(editorComposite);
-
-        Label titleBarSeparator = new Label(editorComposite, SWT.HORIZONTAL
-                | SWT.SEPARATOR);
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        titleBarSeparator.setLayoutData(gd);
-
-        createInfoArea(editorComposite);
-
-        getSite().getWorkbenchWindow().getWorkbench().getHelpSystem().setHelp(
-				editorComposite, IIDEHelpContextIds.WELCOME_EDITOR);
-
-        this.colorListener = new IPropertyChangeListener() {
-            public void propertyChange(PropertyChangeEvent event) {
-                if (event.getProperty()
-                        .equals(JFacePreferences.HYPERLINK_COLOR)) {
-                    Color fg = JFaceColors.getHyperlinkText(editorComposite
-                            .getDisplay());
-                    Iterator links = hyperlinkRanges.iterator();
-                    while (links.hasNext()) {
-                        StyleRange range = (StyleRange) links.next();
-                        range.foreground = fg;
-                    }
-                }
-            }
-        };
-
-        JFacePreferences.getPreferenceStore().addPropertyChangeListener(
-                this.colorListener);
-
-    }
-
-    /**
-     * Creates the wizard's title area.
-     *
-     * @param parent the SWT parent for the title area composite
-     * @return the created title area composite
-     */
-    private Composite createTitleArea(Composite parent) {
-        // Get the background color for the title area
-        Display display = parent.getDisplay();
-        Color background = JFaceColors.getBannerBackground(display);
-        Color foreground = JFaceColors.getBannerForeground(display);
-
-        // Create the title area which will contain
-        // a title, message, and image.
-        Composite titleArea = new Composite(parent, SWT.NONE | SWT.NO_FOCUS);
-        GridLayout layout = new GridLayout();
-        layout.marginHeight = 0;
-        layout.marginWidth = 0;
-        layout.verticalSpacing = 0;
-        layout.horizontalSpacing = 0;
-        layout.numColumns = 2;
-        titleArea.setLayout(layout);
-        titleArea.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        titleArea.setBackground(background);
-
-        // Message label
-        final CLabel messageLabel = new CLabel(titleArea, SWT.LEFT) {
-            protected String shortenText(GC gc, String text, int width) {
-                if (gc.textExtent(text, SWT.DRAW_MNEMONIC).x <= width) {
-					return text;
-				}
-                final String ellipsis = "..."; //$NON-NLS-1$
-                int ellipseWidth = gc.textExtent(ellipsis, SWT.DRAW_MNEMONIC).x;
-                int length = text.length();
-                int end = length - 1;
-                while (end > 0) {
-                    text = text.substring(0, end);
-                    int l1 = gc.textExtent(text, SWT.DRAW_MNEMONIC).x;
-                    if (l1 + ellipseWidth <= width) {
-                        return text + ellipsis;
-                    }
-                    end--;
-                }
-                return text + ellipsis;
-            }
-        };
-        JFaceColors.setColors(messageLabel, foreground, background);
-        messageLabel.setText(getBannerTitle());
-        messageLabel.setFont(JFaceResources.getHeaderFont());
-
-        final IPropertyChangeListener fontListener = new IPropertyChangeListener() {
-            public void propertyChange(PropertyChangeEvent event) {
-                if (JFaceResources.HEADER_FONT.equals(event.getProperty())) {
-                    messageLabel.setFont(JFaceResources.getHeaderFont());
-                }
-            }
-        };
-
-        messageLabel.addDisposeListener(new DisposeListener() {
-            public void widgetDisposed(DisposeEvent event) {
-                JFaceResources.getFontRegistry().removeListener(fontListener);
-            }
-        });
-
-        JFaceResources.getFontRegistry().addListener(fontListener);
-
-        GridData gd = new GridData(GridData.FILL_BOTH);
-        messageLabel.setLayoutData(gd);
-
-        // Title image
-        Label titleImage = new Label(titleArea, SWT.LEFT);
-        titleImage.setBackground(background);
-        titleImage.setImage(PlatformUI.getWorkbench().getSharedImages()
-                .getImage(IDEInternalWorkbenchImages.IMG_OBJS_WELCOME_BANNER));
-        gd = new GridData();
-        gd.horizontalAlignment = GridData.END;
-        titleImage.setLayoutData(gd);
-
-        return titleArea;
-    }
-
-    /**
-     * The <code>WorkbenchPart</code> implementation of this 
-     * <code>IWorkbenchPart</code> method disposes the title image
-     * loaded by <code>setInitializationData</code>. Subclasses may extend.
-     */
-    public void dispose() {
-        super.dispose();
-        if (busyCursor != null) {
-			busyCursor.dispose();
-		}
-        if (handCursor != null) {
-			handCursor.dispose();
-		}
-        if (this.colorListener != null) {
-            JFacePreferences.getPreferenceStore().removePropertyChangeListener(
-                    this.colorListener);
-        }
-    }
-
-    /* (non-Javadoc)
-     * Saves the contents of this editor.
-     * <p>
-     * Subclasses must override this method to implement the open-save-close lifecycle
-     * for an editor.  For greater details, see <code>IEditorPart</code>
-     * </p>
-     *
-     * @see IEditorPart
-     */
-    public void doSave(IProgressMonitor monitor) {
-        // do nothing
-    }
-
-    /* (non-Javadoc)
-     * Saves the contents of this editor to another object.
-     * <p>
-     * Subclasses must override this method to implement the open-save-close lifecycle
-     * for an editor.  For greater details, see <code>IEditorPart</code>
-     * </p>
-     *
-     * @see IEditorPart
-     */
-    public void doSaveAs() {
-        // do nothing	
-    }
-
-    /**
-     * Returns the title obtained from the parser
-     */
-    private String getBannerTitle() {
-        if (parser.getTitle() == null) {
-			return ""; //$NON-NLS-1$
-		}
-        return parser.getTitle();
-    }
-
-    /**
-     * Returns the intro item or <code>null</code>
-     */
-    private WelcomeItem getIntroItem() {
-        return parser.getIntroItem();
-    }
-
-    /**
-     * Returns the welcome items
-     */
-    private WelcomeItem[] getItems() {
-        return parser.getItems();
-    }
-
-    /* (non-Javadoc)
-     * Sets the cursor and selection state for this editor to the passage defined
-     * by the given marker.
-     * <p>
-     * Subclasses may override.  For greater details, see <code>IEditorPart</code>
-     * </p>
-     *
-     * @see IEditorPart
-     */
-    public void gotoMarker(IMarker marker) {
-        // do nothing
-    }
-
-    /* (non-Javadoc)
-     * Initializes the editor part with a site and input.
-     * <p>
-     * Subclasses of <code>EditorPart</code> must implement this method.  Within
-     * the implementation subclasses should verify that the input type is acceptable
-     * and then save the site and input.  Here is sample code:
-     * </p>
-     * <pre>
-     *		if (!(input instanceof IFileEditorInput))
-     *			throw new PartInitException("Invalid Input: Must be IFileEditorInput");
-     *		setSite(site);
-     *		setInput(editorInput);
-     * </pre>
-     */
-    public void init(IEditorSite site, IEditorInput input)
-            throws PartInitException {
-        if (!(input instanceof WelcomeEditorInput)) {
-			throw new PartInitException(
-                    "Invalid Input: Must be WelcomeEditorInput"); //$NON-NLS-1$
-		}
-        setSite(site);
-        setInput(input);
-    }
-
-    /* (non-Javadoc)
-     * Returns whether the contents of this editor have changed since the last save
-     * operation.
-     * <p>
-     * Subclasses must override this method to implement the open-save-close lifecycle
-     * for an editor.  For greater details, see <code>IEditorPart</code>
-     * </p>
-     *
-     * @see IEditorPart
-     */
-    public boolean isDirty() {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * Returns whether the "save as" operation is supported by this editor.
-     * <p>
-     * Subclasses must override this method to implement the open-save-close lifecycle
-     * for an editor.  For greater details, see <code>IEditorPart</code>
-     * </p>
-     *
-     * @see IEditorPart
-     */
-    public boolean isSaveAsAllowed() {
-        return false;
-    }
-
-    /**
-     * Read the contents of the welcome page
-     * 
-     * @param is the <code>InputStream</code> to parse
-     * @throws IOException if there is a problem parsing the stream.
-     */
-    public void read(InputStream is) throws IOException {
-        try {
-            parser = new WelcomeParser();
-        } catch (ParserConfigurationException e) {
-            throw (IOException) (new IOException().initCause(e));
-        } catch (SAXException e) {
-            throw (IOException) (new IOException().initCause(e));
-        }
-        parser.parse(is);
-    }
-
-    /**
-     * Reads the welcome file
-     */
-    public void readFile() {
-        URL url = ((WelcomeEditorInput) getEditorInput()).getAboutInfo()
-                .getWelcomePageURL();
-
-        if (url == null) {
-			// should not happen 
-            return;
-		}
-
-        InputStream is = null;
-        try {
-            is = url.openStream();
-            read(is);
-        } catch (IOException e) {
-            IStatus status = new Status(IStatus.ERROR,
-                    IDEWorkbenchPlugin.IDE_WORKBENCH, 1, IDEWorkbenchMessages.WelcomeEditor_accessException, e);
-            IDEWorkbenchPlugin.log(IDEWorkbenchMessages.WelcomeEditor_readFileError, status);
-        } finally {
-            try {
-                if (is != null) {
-					is.close();
-				}
-            } catch (IOException e) {
-            }
-        }
-    }
-
-    /**
-     * Sets the styled text's bold ranges
-     */
-    private void setBoldRanges(StyledText styledText, int[][] boldRanges) {
-        for (int i = 0; i < boldRanges.length; i++) {
-            StyleRange r = new StyleRange(boldRanges[i][0], boldRanges[i][1],
-                    null, null, SWT.BOLD);
-            styledText.setStyleRange(r);
-        }
-    }
-
-    /**
-     * Asks this part to take focus within the workbench.
-     * <p>
-     * Clients should not call this method (the workbench calls this method at
-     * appropriate times).
-     * </p>
-     */
-    public void setFocus() {
-        if ((editorComposite != null) && (lastNavigatedText == null)
-                && (currentText == null)) {
-			editorComposite.setFocus();
-		}
-    }
-
-    /**
-     * Sets the styled text's link (blue) ranges
-     */
-    private void setLinkRanges(StyledText styledText, int[][] linkRanges) {
-        //Color fg = styledText.getDisplay().getSystemColor(SWT.COLOR_BLUE);
-        Color fg = JFaceColors.getHyperlinkText(styledText.getShell()
-                .getDisplay());
-        for (int i = 0; i < linkRanges.length; i++) {
-            StyleRange r = new StyleRange(linkRanges[i][0], linkRanges[i][1],
-                    fg, null);
-            styledText.setStyleRange(r);
-            hyperlinkRanges.add(r);
-        }
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeEditorActionContributor.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeEditorActionContributor.java
deleted file mode 100644
index b548b6f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeEditorActionContributor.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.dialogs;
-
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.part.EditorActionBarContributor;
-
-/**
- * Manages the installation and deinstallation of global actions for 
- * the welcome editor.
- */
-public class WelcomeEditorActionContributor extends EditorActionBarContributor {
-    /**
-     * The <code>WelcomeEditorActionContributor</code> implementation of this 
-     * <code>IEditorActionBarContributor</code> method installs the global 
-     * action handler for the given editor.
-     */
-    public void setActiveEditor(IEditorPart part) {
-        IActionBars actionBars = getActionBars();
-        if (actionBars != null) {
-            actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-                    ((WelcomeEditor) part).getCopyAction());
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeEditorCopyAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeEditorCopyAction.java
deleted file mode 100644
index e784f14..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeEditorCopyAction.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.dialogs;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-
-/**
- * Global copy action for the welcome editor.
- */
-public class WelcomeEditorCopyAction extends Action {
-    private WelcomeEditor editorPart;
-
-    public WelcomeEditorCopyAction(WelcomeEditor editor) {
-        editorPart = editor;
-        setText(IDEWorkbenchMessages.WelcomeEditor_copy_text);
-    }
-
-    public void run() {
-        editorPart.getCurrentText().copy();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeEditorInput.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeEditorInput.java
deleted file mode 100644
index ac4ce2c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeEditorInput.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.internal.ide.AboutInfo;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-
-/**
- * A simple editor input for the welcome editor
- */
-public class WelcomeEditorInput implements IEditorInput {
-    private AboutInfo aboutInfo;
-
-    private final static String FACTORY_ID = "org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory"; //$NON-NLS-1$
-
-    public final static String FEATURE_ID = "featureId"; //$NON-NLS-1$
-
-    /**
-     * WelcomeEditorInput constructor comment.
-     */
-    public WelcomeEditorInput(AboutInfo info) {
-        super();
-        if (info == null) {
-            throw new IllegalArgumentException();
-        }
-        aboutInfo = info;
-    }
-
-    public boolean exists() {
-        return false;
-    }
-
-    public Object getAdapter(Class adapter) {
-        return null;
-    }
-
-    public ImageDescriptor getImageDescriptor() {
-        return null;
-    }
-
-    public String getName() {
-        return IDEWorkbenchMessages.WelcomeEditor_title;
-    }
-
-    public IPersistableElement getPersistable() {
-        return new IPersistableElement() {
-            public String getFactoryId() {
-                return FACTORY_ID;
-            }
-
-            public void saveState(IMemento memento) {
-                memento.putString(FEATURE_ID, aboutInfo.getFeatureId() + ':'
-                        + aboutInfo.getVersionId());
-            }
-        };
-    }
-
-    public AboutInfo getAboutInfo() {
-        return aboutInfo;
-    }
-
-    public boolean equals(Object o) {
-        if ((o != null) && (o instanceof WelcomeEditorInput)) {
-            if (((WelcomeEditorInput) o).aboutInfo.getFeatureId().equals(
-                    aboutInfo.getFeatureId())) {
-				return true;
-			}
-        }
-        return false;
-    }
-
-    public String getToolTipText() {
-        return NLS.bind(IDEWorkbenchMessages.WelcomeEditor_toolTip, aboutInfo.getFeatureLabel());
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeEditorInputFactory.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeEditorInputFactory.java
deleted file mode 100644
index 79a822e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeEditorInputFactory.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.ui.IElementFactory;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.internal.ide.AboutInfo;
-
-/**
- * A simple factory for the welcome editor
- */
-public class WelcomeEditorInputFactory implements IElementFactory {
-    /**
-     * WelcomeEditorInputFactory constructor comment.
-     */
-    public WelcomeEditorInputFactory() {
-        super();
-    }
-
-    /**
-     * Re-creates and returns an object from the state captured within the given 
-     * memento. 
-     * <p>
-     * Under normal circumstances, the resulting object can be expected to be
-     * persistable; that is,
-     * <pre>
-     * result.getAdapter(org.eclipse.ui.IPersistableElement.class)
-     * </pre>
-     * should not return <code>null</code>.
-     * </p>
-     *
-     * @param memento a memento containing the state for the object
-     * @return an object, or <code>null</code> if the element could not be created
-     */
-    public IAdaptable createElement(IMemento memento) {
-        // Get the feature id.
-        String versionedFeatureId = memento
-                .getString(WelcomeEditorInput.FEATURE_ID);
-        if (versionedFeatureId == null) {
-            return null;
-        }
-        int colonPos = versionedFeatureId.indexOf(':');
-        if (colonPos == -1) {
-            // assume the memento is stale or mangled
-            return null;
-        }
-        String featureId = versionedFeatureId.substring(0, colonPos);
-        String versionId = versionedFeatureId.substring(colonPos + 1);
-        // @issue using feature id for plug-in id
-        AboutInfo info = AboutInfo.readFeatureInfo(featureId, versionId);
-        if (info == null) {
-            return null;
-        }
-        return new WelcomeEditorInput(info);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeItem.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeItem.java
deleted file mode 100644
index 354d375..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeItem.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.dialogs;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.osgi.framework.Bundle;
-
-/**
- * Holds the information for an item appearing in the welcome editor
- */
-public class WelcomeItem {
-    private String text;
-
-    private int[][] boldRanges;
-
-    private int[][] helpRanges;
-
-    private String[] helpIds;
-
-    private String[] helpHrefs;
-
-    private int[][] actionRanges;
-
-    private String[] actionPluginIds;
-
-    private String[] actionClasses;
-
-    /**
-     * Creates a new welcome item
-     */
-    public WelcomeItem(String text, int[][] boldRanges, int[][] actionRanges,
-            String[] actionPluginIds, String[] actionClasses,
-            int[][] helpRanges, String[] helpIds, String[] helpHrefs) {
-
-        this.text = text;
-        this.boldRanges = boldRanges;
-        this.actionRanges = actionRanges;
-        this.actionPluginIds = actionPluginIds;
-        this.actionClasses = actionClasses;
-        this.helpRanges = helpRanges;
-        this.helpIds = helpIds;
-        this.helpHrefs = helpHrefs;
-    }
-
-    /**
-     * Returns the action ranges (character locations)
-     */
-    public int[][] getActionRanges() {
-        return actionRanges;
-    }
-
-    /**
-     * Returns the bold ranges (character locations)
-     */
-    public int[][] getBoldRanges() {
-        return boldRanges;
-    }
-
-    /**
-     * Returns the help ranges (character locations)
-     */
-    public int[][] getHelpRanges() {
-        return helpRanges;
-    }
-
-    /**
-     * Returns the text to display
-     */
-    public String getText() {
-        return text;
-    }
-
-    /**
-     * Returns true is a link (action or help) is present at the given character location
-     */
-    public boolean isLinkAt(int offset) {
-        // Check if there is a link at the offset
-        for (int i = 0; i < helpRanges.length; i++) {
-            if (offset >= helpRanges[i][0]
-                    && offset < helpRanges[i][0] + helpRanges[i][1]) {
-                return true;
-            }
-        }
-
-        // Check if there is an action link at the offset
-        for (int i = 0; i < actionRanges.length; i++) {
-            if (offset >= actionRanges[i][0]
-                    && offset < actionRanges[i][0] + actionRanges[i][1]) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Logs a error to the workbench log
-     */
-    public void logActionLinkError(String actionPluginId, String actionClass) {
-        IDEWorkbenchPlugin
-                .log(IDEWorkbenchMessages.WelcomeItem_unableToLoadClass + actionPluginId + " " + actionClass); //$NON-NLS-1$
-    }
-
-    /**
-     * Open a help topic
-     */
-    private void openHelpTopic(String topic, String href) {
-        if (href != null) {
-			PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(href);
-		} else {
-			PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(topic);
-		}
-    }
-
-    /**
-     * Run an action
-     */
-    private void runAction(String pluginId, String className) {
-    	Bundle pluginBundle = Platform.getBundle(pluginId);
-        if (pluginBundle == null) {
-            logActionLinkError(pluginId, className);
-            return;
-        }
-        Class actionClass;
-        IAction action;
-        try {
-        	actionClass = pluginBundle.loadClass(className);
-        } catch (ClassNotFoundException e) {
-            logActionLinkError(pluginId, className);
-            return;
-        }
-        try {
-            action = (IAction) actionClass.newInstance();
-        } catch (InstantiationException e) {
-            logActionLinkError(pluginId, className);
-            return;
-        } catch (IllegalAccessException e) {
-            logActionLinkError(pluginId, className);
-            return;
-        } catch (ClassCastException e) {
-            logActionLinkError(pluginId, className);
-            return;
-        }
-        action.run();
-    }
-
-    /**
-     * Triggers the link at the given offset (if there is one)
-     */
-    public void triggerLinkAt(int offset) {
-        // Check if there is a help link at the offset
-        for (int i = 0; i < helpRanges.length; i++) {
-            if (offset >= helpRanges[i][0]
-                    && offset < helpRanges[i][0] + helpRanges[i][1]) {
-                // trigger the link
-                openHelpTopic(helpIds[i], helpHrefs[i]);
-                return;
-            }
-        }
-
-        // Check if there is an action link at the offset
-        for (int i = 0; i < actionRanges.length; i++) {
-            if (offset >= actionRanges[i][0]
-                    && offset < actionRanges[i][0] + actionRanges[i][1]) {
-                // trigger the link
-                runAction(actionPluginIds[i], actionClasses[i]);
-                return;
-            }
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeParser.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeParser.java
deleted file mode 100644
index c336c3b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/dialogs/WelcomeParser.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.dialogs;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-
-import javax.xml.parsers.FactoryConfigurationError;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.xml.sax.Attributes;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * A parser for the the welcome page
- */
-public class WelcomeParser extends DefaultHandler {
-    private static final String TAG_WELCOME_PAGE = "welcomePage"; //$NON-NLS-1$	
-
-    private static final String TAG_INTRO = "intro"; //$NON-NLS-1$	
-
-    private static final String TAG_ITEM = "item"; //$NON-NLS-1$	
-
-    private static final String TAG_BOLD = "b"; //$NON-NLS-1$	
-
-    private static final String TAG_ACTION = "action"; //$NON-NLS-1$	
-
-    private static final String TAG_PARAGRAPH = "p"; //$NON-NLS-1$	
-
-    private static final String TAG_TOPIC = "topic"; //$NON-NLS-1$	
-
-    private static final String ATT_TITLE = "title"; //$NON-NLS-1$	
-
-    private static final String ATT_FORMAT = "format"; //$NON-NLS-1$	
-
-    private static final String ATT_PLUGIN_ID = "pluginId"; //$NON-NLS-1$	
-
-    private static final String ATT_CLASS = "class"; //$NON-NLS-1$	
-
-    private static final String ATT_ID = "id"; //$NON-NLS-1$
-
-    private static final String ATT_HREF = "href"; //$NON-NLS-1$
-
-    private static final String FORMAT_WRAP = "wrap"; //$NON-NLS-1$
-
-    private static final char DELIMITER = '\n'; // sax parser replaces crlf with lf
-
-    private SAXParser parser;
-
-    private String title;
-
-    private WelcomeItem introItem;
-
-    private ArrayList items = new ArrayList();
-
-    private String format;
-
-    private class WelcomeContentHandler implements ContentHandler {
-        protected ContentHandler parent;
-
-        public void setParent(ContentHandler p) {
-            parent = p;
-        }
-
-        public void characters(char[] ch, int start, int length)
-                throws SAXException {
-        }
-
-        public void endDocument() throws SAXException {
-        }
-
-        public void endElement(String namespaceURI, String localName,
-                String qName) throws SAXException {
-        }
-
-        public void endPrefixMapping(String prefix) throws SAXException {
-        }
-
-        public void ignorableWhitespace(char[] ch, int start, int length)
-                throws SAXException {
-        }
-
-        public void processingInstruction(String target, String data)
-                throws SAXException {
-        }
-
-        public void setDocumentLocator(Locator locator) {
-        }
-
-        public void skippedEntity(String name) throws SAXException {
-        }
-
-        public void startDocument() throws SAXException {
-        }
-
-        public void startElement(String namespaceURI, String localName,
-                String qName, Attributes atts) throws SAXException {
-        }
-
-        public void startPrefixMapping(String prefix, String uri)
-                throws SAXException {
-        }
-    }
-
-    private class WelcomePageHandler extends WelcomeContentHandler {
-        public WelcomePageHandler(String newTitle) {
-            title = newTitle;
-        }
-
-        public void startElement(String namespaceURI, String localName,
-                String qName, Attributes atts) throws SAXException {
-            if (localName.equals(TAG_INTRO)) {
-                ItemHandler h = new IntroItemHandler();
-                h.setParent(WelcomePageHandler.this);
-                parser.getXMLReader().setContentHandler(h);
-            } else if (localName.equals(TAG_ITEM)) {
-                ItemHandler h = new ItemHandler();
-                h.setParent(WelcomePageHandler.this);
-                parser.getXMLReader().setContentHandler(h);
-            }
-        }
-    }
-
-    private class ItemHandler extends WelcomeContentHandler {
-        private ArrayList boldRanges = new ArrayList();
-
-        protected ArrayList wrapRanges = new ArrayList();
-
-        private ArrayList actionRanges = new ArrayList();
-
-        private ArrayList pluginIds = new ArrayList();
-
-        private ArrayList classes = new ArrayList();
-
-        private ArrayList helpRanges = new ArrayList();
-
-        private ArrayList helpIds = new ArrayList();
-
-        private ArrayList helpHrefs = new ArrayList();
-
-        private StringBuffer text = new StringBuffer();
-
-        protected int offset = 0;
-
-        protected int textStart;
-
-        protected int wrapStart;
-
-        private class BoldHandler extends WelcomeContentHandler {
-            public void characters(char[] ch, int start, int length)
-                    throws SAXException {
-                ItemHandler.this.characters(ch, start, length);
-            }
-
-            public void endElement(String namespaceURI, String localName,
-                    String qName) throws SAXException {
-                if (localName.equals(TAG_BOLD)) {
-                    boldRanges.add(new int[] { textStart, offset - textStart });
-                    parser.getXMLReader().setContentHandler(parent);
-                }
-            }
-        }
-
-        private class ActionHandler extends WelcomeContentHandler {
-            public ActionHandler(String pluginId, String className) {
-                pluginIds.add(pluginId);
-                classes.add(className);
-            }
-
-            public void characters(char[] ch, int start, int length)
-                    throws SAXException {
-                ItemHandler.this.characters(ch, start, length);
-            }
-
-            public void endElement(String namespaceURI, String localName,
-                    String qName) throws SAXException {
-                if (localName.equals(TAG_ACTION)) {
-                    actionRanges
-                            .add(new int[] { textStart, offset - textStart });
-                    parser.getXMLReader().setContentHandler(parent);
-                }
-            }
-        }
-
-        private class TopicHandler extends WelcomeContentHandler {
-            public TopicHandler(String helpId, String href) {
-                helpIds.add(helpId);
-                helpHrefs.add(href);
-            }
-
-            public void characters(char[] ch, int start, int length)
-                    throws SAXException {
-                ItemHandler.this.characters(ch, start, length);
-            }
-
-            public void endElement(String namespaceURI, String localName,
-                    String qName) throws SAXException {
-                if (localName.equals(TAG_TOPIC)) {
-                    helpRanges.add(new int[] { textStart, offset - textStart });
-                    parser.getXMLReader().setContentHandler(parent);
-                }
-            }
-        }
-
-        protected WelcomeItem constructWelcomeItem() {
-            if (isFormatWrapped()) {
-                // replace all line delimiters with a space
-                for (int i = 0; i < wrapRanges.size(); i++) {
-                    int[] range = (int[]) wrapRanges.get(i);
-                    int start = range[0];
-                    int length = range[1];
-                    for (int j = start; j < start + length; j++) {
-                        char ch = text.charAt(j);
-                        if (ch == DELIMITER) {
-                            text.replace(j, j + 1, " "); //$NON-NLS-1$
-                        }
-                    }
-                }
-            }
-            return new WelcomeItem(
-                    text.toString(),
-                    (int[][]) boldRanges.toArray(new int[boldRanges.size()][2]),
-                    (int[][]) actionRanges
-                            .toArray(new int[actionRanges.size()][2]),
-                    (String[]) pluginIds.toArray(new String[pluginIds.size()]),
-                    (String[]) classes.toArray(new String[classes.size()]),
-                    (int[][]) helpRanges.toArray(new int[helpRanges.size()][2]),
-                    (String[]) helpIds.toArray(new String[helpIds.size()]),
-                    (String[]) helpHrefs.toArray(new String[helpHrefs.size()]));
-        }
-
-        public void characters(char[] ch, int start, int length)
-                throws SAXException {
-            for (int i = 0; i < length; i++) {
-                text.append(ch[start + i]);
-            }
-            offset += length;
-        }
-
-        public void startElement(String namespaceURI, String localName,
-                String qName, Attributes atts) throws SAXException {
-            textStart = offset;
-            if (localName.equals(TAG_BOLD)) {
-                BoldHandler h = new BoldHandler();
-                h.setParent(ItemHandler.this);
-                parser.getXMLReader().setContentHandler(h);
-            } else if (localName.equals(TAG_ACTION)) {
-                ActionHandler h = new ActionHandler(atts
-                        .getValue(ATT_PLUGIN_ID), atts.getValue(ATT_CLASS));
-                h.setParent(ItemHandler.this);
-                parser.getXMLReader().setContentHandler(h);
-            } else if (localName.equals(TAG_PARAGRAPH)) {
-                wrapStart = textStart;
-            } else if (localName.equals(TAG_TOPIC)) {
-                TopicHandler h = new TopicHandler(atts.getValue(ATT_ID), atts
-                        .getValue(ATT_HREF));
-                h.setParent(ItemHandler.this);
-                parser.getXMLReader().setContentHandler(h);
-            }
-        }
-
-        public void endElement(String namespaceURI, String localName,
-                String qName) throws SAXException {
-            if (localName.equals(TAG_ITEM)) {
-                items.add(constructWelcomeItem());
-                parser.getXMLReader().setContentHandler(parent);
-            } else if (localName.equals(TAG_PARAGRAPH)) {
-                wrapRanges.add(new int[] { wrapStart, offset - wrapStart });
-            }
-        }
-    }
-
-    private class IntroItemHandler extends ItemHandler {
-        public void endElement(String namespaceURI, String localName,
-                String qName) throws SAXException {
-            if (localName.equals(TAG_INTRO)) {
-                introItem = constructWelcomeItem();
-                parser.getXMLReader().setContentHandler(parent);
-            } else if (localName.equals(TAG_PARAGRAPH)) {
-                wrapRanges.add(new int[] { wrapStart, offset - wrapStart });
-            }
-        }
-    }
-
-    /**
-     * Creates a new welcome parser.
-     */
-    public WelcomeParser() throws ParserConfigurationException, SAXException,
-            FactoryConfigurationError {
-        super();
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-        factory.setFeature("http://xml.org/sax/features/namespaces", true); //$NON-NLS-1$
-        parser = factory.newSAXParser();
-
-        parser.getXMLReader().setContentHandler(this);
-        parser.getXMLReader().setDTDHandler(this);
-        parser.getXMLReader().setEntityResolver(this);
-        parser.getXMLReader().setErrorHandler(this);
-    }
-
-    /**
-     * Returns the intro item.
-     */
-    public WelcomeItem getIntroItem() {
-        return introItem;
-    }
-
-    /**
-     * Returns the items.
-     */
-    public WelcomeItem[] getItems() {
-        return (WelcomeItem[]) items.toArray(new WelcomeItem[items.size()]);
-    }
-
-    /**
-     * Returns the title
-     */
-    public String getTitle() {
-        return title;
-    }
-
-    /**
-     * Returns whether or not the welcome editor input should be wrapped.
-     */
-    public boolean isFormatWrapped() {
-        return FORMAT_WRAP.equals(format);
-    }
-
-    /**
-     * Parse the contents of the input stream
-     */
-    public void parse(InputStream is) {
-        try {
-            parser.parse(new InputSource(is), this);
-        } catch (SAXException e) {
-            IStatus status = new Status(IStatus.ERROR,
-                    IDEWorkbenchPlugin.IDE_WORKBENCH, 1, IDEWorkbenchMessages.WelcomeParser_parseException, e);
-            IDEWorkbenchPlugin.log(IDEWorkbenchMessages.WelcomeParser_parseError, status);
-        } catch (IOException e) {
-            IStatus status = new Status(IStatus.ERROR,
-                    IDEWorkbenchPlugin.IDE_WORKBENCH, 1, IDEWorkbenchMessages.WelcomeParser_parseException, e);
-            IDEWorkbenchPlugin.log(IDEWorkbenchMessages.WelcomeParser_parseError, status);
-        }
-    }
-
-    /**
-     * Handles the start element
-     */
-    public void startElement(String namespaceURI, String localName,
-            String qName, Attributes atts) throws SAXException {
-        if (localName.equals(TAG_WELCOME_PAGE)) {
-            WelcomeContentHandler h = new WelcomePageHandler(atts
-                    .getValue(ATT_TITLE));
-            format = atts.getValue(ATT_FORMAT);
-            h.setParent(this);
-            parser.getXMLReader().setContentHandler(h);
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/FileSystemConfiguration.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/FileSystemConfiguration.java
deleted file mode 100644
index 57d6150..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/FileSystemConfiguration.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.ide.filesystem;
-
-import org.eclipse.ui.ide.fileSystem.FileSystemContributor;
-
-/**
- * FileSystemContribution is the representation of the configuration element
- * defined by
- * 
- * @since 3.2
- * 
- */
-public class FileSystemConfiguration {
-
-	String label;
-
-	FileSystemContributor contributor;
-
-	private String scheme;
-
-
-	/**
-	 * Create a new FileSystemConfiguration with the defined
-	 * contributor and userLabel for the supplied scheme.
-	 * @param name
-	 * @param declaredContributor
-	 * @param fileSystem
-	 */
-	public FileSystemConfiguration(String name, FileSystemContributor declaredContributor, String fileSystem) {
-		label = name;
-		contributor = declaredContributor;
-		scheme = fileSystem;
-	}
-
-	/**
-	 * Return the huuman readable label for the receiver.
-	 * @return String
-	 */
-	public String getLabel() {
-		return label;
-	}
-
-	/**
-	 * Return the contributor for the receiver.
-	 * @return FileSystemContributor
-	 */
-	public FileSystemContributor getContributor() {
-		return contributor;
-	}
-
-	/**
-	 * Return the filesystem scheme for the receiver.
-	 * @return Returns the scheme.
-	 */
-	public String getScheme() {
-		return scheme;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/FileSystemMessages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/FileSystemMessages.java
deleted file mode 100644
index 33ece12..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/FileSystemMessages.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.filesystem;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * FileSystemMessages is the class that handles the messages for the 
- * filesystem support.
- *
- */
-public class FileSystemMessages extends NLS{
-	
-	private static final String BUNDLE_NAME= "org.eclipse.ui.internal.ide.filesystem.messages"; //$NON-NLS-1$
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, FileSystemMessages.class);
-	}
-
-
-	/**
-	 * The name of the default file system.
-	 */
-	public static String DefaultFileSystem_name;
-	
-	/**
-	 * The label for file system selection.
-	 */
-	public static String FileSystemSelection_title;
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/FileSystemSupportRegistry.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/FileSystemSupportRegistry.java
deleted file mode 100644
index e6fa7bd..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/FileSystemSupportRegistry.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.ide.filesystem;
-
-import java.io.File;
-import java.net.URI;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker;
-import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler;
-import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.fileSystem.FileSystemContributor;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.dialogs.IDEResourceInfoUtils;
-
-/**
- * @since 3.2
- * 
- */
-public class FileSystemSupportRegistry implements IExtensionChangeHandler {
-
-	private static final String FILESYSTEM_SUPPORT = "filesystemSupport";//$NON-NLS-1$
-
-	protected static final String ATT_CLASS = "class"; //$NON-NLS-1$
-
-	private static final String LABEL = "label";//$NON-NLS-1$
-
-	private static final String SCHEME = "scheme";//$NON-NLS-1$
-
-	private static FileSystemSupportRegistry singleton;
-
-	/**
-	 * Get the instance of the registry.
-	 * 
-	 * @return MarkerSupportRegistry
-	 */
-	public static FileSystemSupportRegistry getInstance() {
-		if (singleton == null) {
-			singleton = new FileSystemSupportRegistry();
-		}
-		return singleton;
-	}
-
-	private Collection registeredContributions = new HashSet(0);
-
-	FileSystemConfiguration defaultConfiguration = new FileSystemConfiguration(
-			FileSystemMessages.DefaultFileSystem_name, new FileSystemContributor() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.ui.ide.fileSystem.FileSystemContributor#browseFileSystem(java.lang.String,
-				 *      org.eclipse.swt.widgets.Shell)
-				 */
-				public URI browseFileSystem(String initialPath, Shell shell) {
-
-					DirectoryDialog dialog = new DirectoryDialog(shell);
-					dialog
-							.setMessage(IDEWorkbenchMessages.ProjectLocationSelectionDialog_directoryLabel);
-
-					if (!initialPath.equals(IDEResourceInfoUtils.EMPTY_STRING)) {
-						IFileInfo info = IDEResourceInfoUtils
-								.getFileInfo(initialPath);
-						if (info != null && info.exists()) {
-							dialog.setFilterPath(initialPath);
-						}
-					}
-
-					String selectedDirectory = dialog.open();
-					if (selectedDirectory == null) {
-						return null;
-					}
-					return new File(selectedDirectory).toURI();
-
-				}
-			}, null);
-
-	private FileSystemConfiguration[] allConfigurations;
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public FileSystemSupportRegistry() {
-
-		IExtensionTracker tracker = PlatformUI.getWorkbench()
-				.getExtensionTracker();
-		IExtensionPoint point = Platform.getExtensionRegistry()
-				.getExtensionPoint(IDEWorkbenchPlugin.IDE_WORKBENCH,
-						FILESYSTEM_SUPPORT);
-		if (point == null) {
-			return;
-		}
-		IExtension[] extensions = point.getExtensions();
-		// initial population
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension extension = extensions[i];
-			processExtension(tracker, extension);
-		}
-		tracker.registerHandler(this, ExtensionTracker
-				.createExtensionPointFilter(point));
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler#addExtension(org.eclipse.core.runtime.dynamichelpers.IExtensionTracker,
-	 *      org.eclipse.core.runtime.IExtension)
-	 */
-	public void addExtension(IExtensionTracker tracker, IExtension extension) {
-		processExtension(tracker, extension);
-		allConfigurations = null;//Clear the cache
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler#removeExtension(org.eclipse.core.runtime.IExtension,
-	 *      java.lang.Object[])
-	 */
-	public void removeExtension(IExtension extension, Object[] objects) {
-		for (int i = 0; i < objects.length; i++) {
-			registeredContributions.remove(objects[i]);
-		}
-		allConfigurations = null;//Clear the cache
-
-	}
-
-	/**
-	 * Process the extension and register the result with the tracker.
-	 * 
-	 * @param tracker
-	 * @param extension
-	 */
-	private void processExtension(IExtensionTracker tracker,
-			IExtension extension) {
-		IConfigurationElement[] elements = extension.getConfigurationElements();
-		for (int j = 0; j < elements.length; j++) {
-			IConfigurationElement element = elements[j];
-			FileSystemConfiguration contribution = newConfiguration(element);
-			registeredContributions.add(contribution);
-			tracker.registerObject(extension, contribution,
-					IExtensionTracker.REF_STRONG);
-
-		}
-	}
-
-	/**
-	 * Return a new FileSystemContribution.
-	 * 
-	 * @param element
-	 * @return FileSystemContribution or <code>null</code> if there is an
-	 *         exception.
-	 */
-	private FileSystemConfiguration newConfiguration(
-			final IConfigurationElement element) {
-
-		final FileSystemContributor[] contributors = new FileSystemContributor[1];
-		final CoreException[] exceptions = new CoreException[1];
-
-		Platform.run(new ISafeRunnable() {
-			public void run() {
-				try {
-					contributors[0] = (FileSystemContributor) IDEWorkbenchPlugin
-							.createExtension(element, ATT_CLASS);
-
-				} catch (CoreException exception) {
-					exceptions[0] = exception;
-				}
-			}
-
-			/*
-			 * (non-Javadoc) Method declared on ISafeRunnable.
-			 */
-			public void handleException(Throwable e) {
-				// Do nothing as Core will handle the logging
-			}
-		});
-
-		if (exceptions[0] != null) {
-			return null;
-		}
-		String name = element.getAttribute(LABEL);
-		String fileSystem = element.getAttribute(SCHEME);
-		FileSystemConfiguration config = new FileSystemConfiguration(name,
-				contributors[0], fileSystem);
-
-		return config;
-
-	}
-
-	/**
-	 * Return the FileSystemConfiguration defined in the receiver.
-	 * 
-	 * @return FileSystemConfiguration[]
-	 */
-	public FileSystemConfiguration[] getConfigurations() {
-		if (allConfigurations == null) {
-			allConfigurations = new FileSystemConfiguration[registeredContributions
-					.size() + 1];
-			allConfigurations[0] = defaultConfiguration;
-
-			Iterator iterator = registeredContributions.iterator();
-			int index = 0;
-			while (iterator.hasNext()) {
-				allConfigurations[++index] = (FileSystemConfiguration) iterator
-						.next();
-			}
-		}
-		return allConfigurations;
-	}
-
-	/**
-	 * Return the default file system configuration (the local file system
-	 * extension in the ide plug-in).
-	 * 
-	 * @return FileSystemConfiguration
-	 */
-	public FileSystemConfiguration getDefaultConfiguration() {
-		return defaultConfiguration;
-	}
-
-	/**
-	 * Return whether or not there is only one file system registered.
-	 * 
-	 * @return <code>true</code> if there is only one file system.
-	 */
-	public boolean hasOneFileSystem() {
-		return registeredContributions.size() == 0;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/messages.properties b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/messages.properties
deleted file mode 100644
index e6feaa0..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/messages.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-DefaultFileSystem_name = default
-FileSystemSelection_title = Choose file system:
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/package.html b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/package.html
deleted file mode 100644
index 3e96f61..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/filesystem/package.html
+++ /dev/null
@@ -1,18 +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">
-<title>Package-level Javadoc</title>
-</head>
-
-<body>
-Internal classes for the IDE-specific support for the 
-org.eclipse.core.filesystem.fileSystem extension.
-<h2>Package Specification</h2>
-This package contains internal classes for the Eclipse Platform User Interface that
-support for the org.eclipse.core.filesystem.fileSystem extension
-
-</body>
-
-</html>
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/handlers/OpenResourceHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/handlers/OpenResourceHandler.java
deleted file mode 100755
index 254e40a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/handlers/OpenResourceHandler.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.handlers;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.IHandler;
-import org.eclipse.core.commands.IHandlerListener;
-
-import org.eclipse.core.runtime.ListenerList;
-
-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.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.window.Window;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.dialogs.OpenResourceDialog;
-
-/**
- * Implements the open resource action. Opens a dialog prompting for a file and
- * opens the selected file in an editor.
- * 
- * @since 2.1
- */
-public final class OpenResourceHandler extends Action implements IHandler,
-		IWorkbenchWindowActionDelegate {
-
-	/**
-	 * The identifier of the parameter storing the file path.
-	 */
-	private static final String PARAM_ID_FILE_PATH = "filePath"; //$NON-NLS-1$
-
-	/**
-	 * A collection of objects listening to changes to this manager. This
-	 * collection is <code>null</code> if there are no listeners.
-	 */
-	private transient ListenerList listenerList = null;
-
-	/**
-	 * Creates a new instance of the class.
-	 */
-	public OpenResourceHandler() {
-		super();
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IIDEHelpContextIds.OPEN_WORKSPACE_FILE_ACTION);
-	}
-
-	public final void addHandlerListener(final IHandlerListener listener) {
-		if (listenerList == null) {
-			listenerList = new ListenerList(ListenerList.IDENTITY);
-		}
-
-		listenerList.add(listener);
-	}
-
-	public final void dispose() {
-		listenerList = null;
-	}
-
-	public final Object execute(final ExecutionEvent event)
-			throws ExecutionException {
-		final List files = new ArrayList();
-
-		if (event.getParameter(PARAM_ID_FILE_PATH) == null) {
-			// Prompt the user for the resource to open.
-			Object[] result = queryFileResource();
-
-			if (result != null) {
-				for (int i = 0; i < result.length; i++) {
-					if (result[i] instanceof IFile) {
-						files.add(result[i]);
-					}
-				}
-			}
-
-		} else {
-			// Use the given parameter.
-			final IResource resource = (IResource) event
-					.getObjectParameterForExecution(PARAM_ID_FILE_PATH);
-			if (!(resource instanceof IFile)) {
-				throw new ExecutionException(
-						"filePath parameter must identify a file"); //$NON-NLS-1$
-			}
-			files.add(resource);
-		}
-
-		if (files.size() > 0) {
-
-			final IWorkbenchWindow window = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow();
-			if (window == null) {
-				throw new ExecutionException("no active workbench window"); //$NON-NLS-1$
-			}
-
-			final IWorkbenchPage page = window.getActivePage();
-			if (page == null) {
-				throw new ExecutionException("no active workbench page"); //$NON-NLS-1$
-			}
-
-			try {
-				for (Iterator it = files.iterator(); it.hasNext();) {
-					IDE.openEditor(page, (IFile) it.next(), true);
-				}
-			} catch (final PartInitException e) {
-				throw new ExecutionException("error opening file in editor", e); //$NON-NLS-1$
-			}
-		}
-
-		return null;
-	}
-
-	public final void init(final IWorkbenchWindow window) {
-		// Do nothing.
-	}
-
-	/**
-	 * Query the user for the resources that should be opened
-	 * 
-	 * @return the resource that should be opened.
-	 */
-	private final Object[] queryFileResource() {
-		final IWorkbenchWindow window = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (window == null) {
-			return null;
-		}
-		final Shell parent = window.getShell();
-		final IContainer input = ResourcesPlugin.getWorkspace().getRoot();
-
-		final OpenResourceDialog dialog = new OpenResourceDialog(parent, input,
-				IResource.FILE);
-		final int resultCode = dialog.open();
-		if (resultCode != Window.OK) {
-			return null;
-		}
-
-		final Object[] result = dialog.getResult();
-
-		return result;
-	}
-
-	public final void removeHandlerListener(final IHandlerListener listener) {
-		if (listenerList != null) {
-			listenerList.remove(listener);
-
-			if (listenerList.isEmpty()) {
-				listenerList = null;
-			}
-		}
-	}
-
-	public final void run(final IAction action) {
-		try {
-			execute(new ExecutionEvent());
-		} catch (final ExecutionException e) {
-			// TODO Do something meaningful and poignant.
-		}
-	}
-
-	public final void selectionChanged(final IAction action,
-			final ISelection selection) {
-		// Do nothing.
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/handlers/ShowResourceByPathHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/handlers/ShowResourceByPathHandler.java
deleted file mode 100644
index f3dd90c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/handlers/ShowResourceByPathHandler.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.handlers;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.handlers.HandlerUtil;
-import org.eclipse.ui.part.ISetSelectionTarget;
-
-/**
- * A command handler to show a resource in the Navigator view given the resource
- * path.
- * 
- * @since 3.2
- */
-public class ShowResourceByPathHandler extends AbstractHandler {
-
-	private static final String PARAM_ID_RESOURCE_PATH = "resourcePath"; //$NON-NLS-1$
-
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-
-		IResource resource = (IResource) event
-				.getObjectParameterForExecution(PARAM_ID_RESOURCE_PATH);
-
-		IWorkbenchWindow activeWindow = HandlerUtil
-				.getActiveWorkbenchWindowChecked(event);
-
-		IWorkbenchPage activePage = activeWindow.getActivePage();
-		if (activePage == null) {
-			throw new ExecutionException("no active workbench page"); //$NON-NLS-1$
-		}
-
-		try {
-			IViewPart view = activePage.showView(IPageLayout.ID_RES_NAV);
-			if (view instanceof ISetSelectionTarget) {
-				ISelection selection = new StructuredSelection(resource);
-				((ISetSelectionTarget) view).selectReveal(selection);
-			}
-		} catch (PartInitException e) {
-			throw new ExecutionException("error showing resource in navigator"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/messages.properties b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/messages.properties
deleted file mode 100644
index fec730d..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/messages.properties
+++ /dev/null
@@ -1,819 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-#     Benjamin Muskalla - bug 29633
-#	  Remy Chi Jian Suen <remy.suen@gmail.com> 
-# 		- Fix for Bug 186823 [Wizards] New Project Wizard has colliding mnemonics
-#	  Oakland Software Incorporated (Francis Upton) <francisu@ieee.org>
-#		- Bug 224997 [Workbench] Impossible to copy project
-###############################################################################
-
-# package: org.eclipse.ui.ide
-
-IDEWorkbenchAdvisor_noPerspective=No perspectives are open. To open a perspective, press this button:
-
-IDE_noFileEditorFound = No editor found to edit the file resource.
-IDE_sideEffectWarning=Potential side effects have been identified.
-IDE_coreExceptionFileStore = CoreException opening the file store on the URI.
-
-QuickStartAction_errorDialogTitle = Quick Start Error
-QuickStartAction_infoReadError = Could not read feature about information.
-
-ConfigurationLogUpdateSection_installConfiguration=Install configuration:
-ConfigurationLogUpdateSection_lastChangedOn=Last changed on {0}
-ConfigurationLogUpdateSection_location=Location: {0}
-ConfigurationLogUpdateSection_IUHeader=Installable Units in the profile\:
-ConfigurationLogUpdateSection_IU=Id\: {0}, Version\: {1}
-ConfigurationLogUpdateSection_bundleHeader=Bundles in the system\:
-ConfigurationLogUpdateSection_bundle=Id\: {0}, Version\: {1}, Location\: {2}
-ConfigurationLogUpdateSection_timestamp=Profile timestamp\: {0}
-
-ErrorClosing = An error has occurred when closing the workbench. See error log for more details.
-ErrorOnSaveAll = An error has occurred while saving all editors. See error log for more details.
-
-IDEIdleHelper_backgroundGC = Collecting garbage
-
-
-############################################################
-############################################################
-# Copies from org.eclipse.ui.workbench
-############################################################
-showAdvanced = &Advanced >>
-hideAdvanced = << &Advanced
-
-# ==============================================================================
-# Workbench Actions
-# ==============================================================================
-
-# --- File Menu ---
-Workbench_file = &File
-Workbench_new = &New
-OpenWorkspaceAction_text = Switch &Workspace
-OpenWorkspaceAction_toolTip = Open Workspace
-OpenWorkspaceAction_errorTitle = Missing System Property
-OpenWorkspaceAction_errorMessage = Unable to relaunch the platform because the {0} property has not been set.
-OpenWorkspaceAction_other = &Other...
-NewProjectAction_text = P&roject...
-NewProjectAction_toolTip = New Project
-NewExampleAction_text = E&xample...
-NewExampleAction_toolTip = New Example
-SaveAsDialog_title = Save As
-SaveAsDialog_message = Save file to another location.
-SaveAsDialog_text = Save As
-SaveAsDialog_fileLabel = &File name:
-SaveAsDialog_file = file
-SaveAsDialog_overwriteQuestion = The file ''{0}'' already exists. Do you want to replace the existing file?
-SaveAsDialog_closedProjectMessage = The selected project is closed.
-Workbench_projectProperties = &Properties
-Workbench_projectPropertiesToolTip = Properties
-
-
-# --- Edit Menu ---
-Workbench_edit = &Edit
-Workbench_addBookmark = Add Bookmar&k...
-Workbench_addBookmarkToolTip = Add Bookmark
-Workbench_addTask = Add Ta&sk...
-Workbench_addTaskToolTip = Add Task
-
-
-# --- Navigate Menu ---
-Workbench_navigate = &Navigate
-Workbench_goTo = &Go To
-
-Workbench_showIn = Sho&w In
-
-# --- Project Menu ---
-Workbench_project = &Project
-
-Workbench_buildProject = &Build Project
-Workbench_buildProjectToolTip = Build Project
-Workbench_rebuildProject = &Rebuild Project
-Workbench_rebuildProjectToolTip = Rebuild Project
-Workbench_buildClean = Clea&n...
-Workbench_buildSet = Build &Working Set
-Workbench_buildAutomatically = Build Auto&matically
-
-GlobalBuildAction_text = Build &All
-GlobalBuildAction_toolTip = Build All
-GlobalBuildAction_rebuildText = Rebuild A&ll
-GlobalBuildAction_rebuildToolTip = Rebuild All
-GlobalBuildAction_buildProblems = Build problems
-GlobalBuildAction_internalError = Internal error: {0}
-GlobalBuildAction_buildOperationTitle = Building all...
-GlobalBuildAction_rebuildAllOperationTitle = Rebuilding all...
-GlobalBuildAction_jobTitle = Building Workspace
-GlobalBuildAction_BuildRunningTitle=Build Is Running
-GlobalBuildAction_BuildRunningMessage=A build is currently running. Do you wish to cancel it?
-BuildSetAction_noProjects=The selected working set does not contain projects that can be built.
-BuildSetAction_noBuildTitle=Nothing to build
-
-
-# --- Window Menu ---
-Workbench_window = &Window
-Workbench_openPerspective = &Open Perspective
-Workbench_showView = Show &View
-
-PromptOnExitDialog_shellTitle = Confirm Exit
-PromptOnExitDialog_message0 = Exit application?
-PromptOnExitDialog_message1 = Exit {0}?
-PromptOnExitDialog_choice = &Always exit without prompt
-
-Workbench_shortcuts = Navi&gation
-Workbench_openNewWindow = &New Window
-
-
-# --- Help Menu ---
-Workbench_help = &Help
-QuickStart_text = &Welcome...
-QuickStart_toolTip = Open a Welcome Editor
-QuickStartMessageDialog_title = Welcome
-QuickStartMessageDialog_message = No features with quick start information are available
-WelcomePageSelectionDialog_title = Welcome
-WelcomePageSelectionDialog_message = &Show welcome page for:
-TipsAndTricks_text = &Tips and Tricks...
-TipsAndTricks_toolTip =Tips and Tricks
-TipsAndTricksMessageDialog_title = Tips and Tricks
-TipsAndTricksMessageDialog_message = No features with tips and tricks information are available
-TipsAndTricksPageSelectionDialog_title = Tips and Tricks
-TipsAndTricksPageSelectionDialog_message = &Show tips and tricks page for:
-TipsAndTricksErrorDialog_title = Problem
-TipsAndTricksErrorDialog_noHref = No tips and tricks information available
-TipsAndTricksErrorDialog_noFeatures = No features with tips and tricks information available
-
-# ==============================================================================
-# Navigator Actions
-# ==============================================================================
-OpenWithMenu_dialogTitle = Problems Opening Editor
-OpenWithMenu_Other=Other...
-OpenWithMenu_OtherDialogDescription=Choose the editor for opening {0}:
-
-CopyProjectAction_title = &Copy
-CopyProjectAction_confirm=Confirm Copy
-CopyProjectAction_warning=Copying project {0} may have undesirable side effects.
-CopyProjectAction_toolTip = Copy Project
-CopyProjectAction_copyTitle = Copy Project
-CopyProjectAction_copyNameOneArg = Copy of {0}
-CopyProjectAction_copyNameTwoArgs = Copy ({0}) of {1}
-CopyProjectAction_alreadyExists = Project ''{0}'' already exists.
-CopyProjectAction_copyFailedTitle = Copy Problems
-CopyProjectAction_internalError = Internal error: {0}
-
-CopyResourceAction_title = &Copy
-CopyResourceAction_toolTip = Copy Resource
-CopyResourceAction_selectDestination = Select the &destination:
-
-MoveProjectAction_text = Mo&ve...
-MoveProjectAction_toolTip = Move Project
-MoveProjectAction_moveTitle = Move Project
-MoveProjectAction_dialogTitle = Move Problems
-MoveProjectAction_internalError = Internal error: {0}
-
-MoveResourceAction_text = Mo&ve...
-MoveResourceAction_toolTip = Move Resource
-MoveResourceAction_title = Check Move
-MoveResourceAction_checkMoveMessage = ''{0}'' is read only. Do you still wish to move it?
-
-ReadOnlyCheck_problems = Read Only Checking Problems
-
-RenameResourceAction_text = Rena&me...
-RenameResourceAction_confirm=Confirm Rename
-RenameResourceAction_warning=Renaming {0} may have undesirable side effects.
-RenameResourceAction_toolTip = Rename Resource
-RenameResourceAction_operationTitle = Rename Resource
-RenameResourceAction_inputDialogTitle = Rename Resource
-RenameResourceAction_inputDialogMessage = Enter the new resource name:
-RenameResourceAction_checkTitle = Check Rename
-RenameResourceAction_readOnlyCheck = ''{0}'' is read only. Do you still wish to rename it?
-RenameResourceAction_resourceExists = Resource Exists
-RenameResourceAction_projectExists = Project Exists
-RenameResourceAction_nameExists = A resource with that name already exists
-RenameResourceAction_overwriteQuestion = ''{0}'' exists. Do you wish to overwrite?
-RenameResourceAction_overwriteProjectQuestion = ''{0}'' exists.  If you choose to overwrite ''{0}'', its original content cannot be restored (even if this operation is undone).  Do you wish to overwrite the project?
-RenameResourceAction_problemTitle = Rename Problems
-RenameResourceAction_progress = Renaming:
-RenameResourceAction_nameMustBeDifferent = You must use a different name
-RenameResourceAction_problemMessage = Problems occurred renaming the selected resource.
-
-DeleteResourceAction_text = &Delete
-DeleteResourceAction_confirm=Confirm Delete
-DeleteResourceAction_warning=Deleting these resources may have undesirable side effects.
-DeleteResourceAction_toolTip = Delete
-DeleteResourceAction_title1 = Confirm Resource Delete
-DeleteResourceAction_titleN = Confirm Multiple Resource Delete
-DeleteResourceAction_confirm1 = Are you sure you want to delete ''{0}'' from the file system?
-DeleteResourceAction_confirmN = Are you sure you want to delete these {0} resources from the file system?
-DeleteResourceAction_titleProject1 = Confirm Project Delete
-DeleteResourceAction_titleProjectN = Confirm Multiple Project Delete
-DeleteResourceAction_confirmProject1 = Are you sure you want to delete project ''{0}''?
-DeleteResourceAction_confirmProjectN = Are you sure you want to delete these {0} projects?
-DeleteResourceAction_deleteContents1 = &Also delete contents under ''{0}''
-DeleteResourceAction_deleteContentsN = &Also delete contents in the file system
-DeleteResourceAction_deleteContentsDetails = (Project cannot be restored using "Undo")
-DeleteResourceAction_doNotDeleteContents = &Do not delete contents
-DeleteResourceAction_confirmLinkedResource1 = Are you sure you want to delete linked resource ''{0}''?\nOnly the workspace link will be deleted. Link target will remain unchanged.
-DeleteResourceAction_confirmLinkedResourceN = Are you sure you want to delete these {0} resources?\n\nSelection contains linked resources.\nOnly the workspace links will be deleted. Link targets will remain unchanged.
-DeleteResourceAction_readOnlyQuestion = ''{0}'' is read only. Do you still wish to delete it?
-DeleteResourceAction_checkJobName = Checking resources
-DeleteResourceAction_jobName = Deleting resources
-DeleteResourceAction_operationLabel = Delete Resources
-
-AddBookmarkLabel = Add Boo&kmark...
-AddBookmarkToolTip = Add Bookmark
-AddBookmarkDialog_title = Add Bookmark
-AddBookmarkDialog_message = Enter bookmark name:
-
-AddTaskLabel = Add &Task
-AddTaskToolTip = Add Task
-
-OpenFileAction_text = &Open
-OpenFileAction_toolTip = Edit File
-OpenFileAction_openFileShellTitle = Problems Opening Editor
-
-OpenLocalFileAction_title = Open File
-OpenLocalFileAction_message_fileNotFound= The file ''{0}'' could not be found.
-OpenLocalFileAction_message_filesNotFound= The following files could not be found:\n{0}
-OpenLocalFileAction_title_selectWorkspaceFile = Select Workspace File
-OpenLocalFileAction_message_fileLinkedToMultiple = The selected file is referenced by multiple linked resources in the workspace.\nSelect a workspace resource to open the file.
-OpenLocalFileAction_message_errorOnOpen = The file ''{0}'' could not be opened.\nSee log for details.
-
-OpenResourceAction_text = Op&en Project
-OpenResourceAction_toolTip = Open Project
-OpenResourceAction_dialogTitle = Open Problems
-OpenResourceAction_problemMessage = Problems occurred opening the selected resources.
-OpenResourceAction_operationMessage = Opening project...
-OpenResourceAction_openRequiredProjects =  Should referenced projects also be opened where applicable?
-
-CloseResourceAction_text = Clo&se Project
-CloseResourceAction_warningForOne=Closing project {0} may have undesirable side effects.
-CloseResourceAction_warningForMultiple=Closing these projects may have undesirable side effects.
-CloseResourceAction_confirm=Confirm Close
-CloseResourceAction_toolTip = Close Project
-CloseResourceAction_title = Close Problems
-CloseResourceAction_problemMessage = Problems occurred closing the selected resources.
-CloseResourceAction_operationMessage = Closing project...
-
-CloseUnrelatedProjectsAction_text = Close &Unrelated Projects
-CloseUnrelatedProjectsAction_toolTip = Close Unrelated Projects
-
-BuildAction_text = &Build Project
-BuildAction_toolTip = Incremental Build of Selected Projects
-BuildAction_problemMessage = Problems occurred building the selected resources.
-BuildAction_problemTitle = Build Problems
-BuildAction_operationMessage = Building project...
-
-RebuildAction_text = Rebuild Pro&ject
-RebuildAction_tooltip = Full Build Of Selected Projects
-
-RefreshAction_text = Re&fresh
-RefreshAction_toolTip = Refresh
-RefreshAction_progressMessage = Refreshing...
-RefreshAction_problemTitle = Refresh Problems
-RefreshAction_problemMessage = Problems occurred refreshing the selected resources.
-RefreshAction_locationDeletedMessage = The location for project ''{0}'' ({1}) has been deleted.\n Delete ''{0}'' from the workspace?
-RefreshAction_dialogTitle = Project location has been deleted
-
-SelectWorkingSetAction_text= Select &Working Set...
-
-# --- Operations ---
-CopyProjectOperation_progressTitle = Copying:
-CopyProjectOperation_copyFailedMessage = Problems occurred copying the project.
-CopyProjectOperation_copyFailedTitle = Copy Problems
-CopyProjectOperation_internalError = Internal error: {0}
-CopyProjectOperation_copyProject = Copy Project
-
-CopyFilesAndFoldersOperation_copyFailedTitle = Copy Problems
-CopyFilesAndFoldersOperation_problemMessage = Problems occurred copying the selected resources.
-CopyFilesAndFoldersOperation_operationTitle = Copying...
-CopyFilesAndFoldersOperation_nameCollision = A resource name collision was detected.
-CopyFilesAndFoldersOperation_internalError = Internal error: {0}
-CopyFilesAndFoldersOperation_resourceExists = Resource Exists
-CopyFilesAndFoldersOperation_overwriteQuestion = {0} exists. Do you wish to overwrite?
-CopyFilesAndFoldersOperation_overwriteWithDetailsQuestion = Resource exists. Do you wish to overwrite?\n\nOverwrite: {0}\nLast modified: {1}\n\nwith: {2}\nLast modified: {3}
-CopyFilesAndFoldersOperation_overwriteMergeQuestion = ''{0}'' exists. Do you wish to overwrite?\nFolder contents will be merged, existing files will be overwritten.
-CopyFilesAndFoldersOperation_overwriteNoMergeLinkQuestion = ''{0}'' exists and is a linked folder. Do you wish to delete the linked folder and replace with the unlinked folder?\nFolder contents will not be merged!
-CopyFilesAndFoldersOperation_overwriteNoMergeNoLinkQuestion = ''{0}'' exists and is not a linked folder. Do you wish to delete the folder and replace with the linked folder?\nFolder contents will not be merged!
-CopyFilesAndFoldersOperation_deepCopyQuestion = Do you wish to perform a deep copy of linked resource ''{0}''?
-CopyFilesAndFoldersOperation_deepMoveQuestion = Do you wish to perform a deep move of linked resource ''{0}''?
-CopyFilesAndFoldersOperation_copyNameTwoArgs = Copy ({0}) of {1}
-CopyFilesAndFoldersOperation_copyNameOneArg = Copy of {0}
-CopyFilesAndFoldersOperation_destinationAccessError = Destination folder must be accessible.
-CopyFilesAndFoldersOperation_destinationDescendentError = Destination cannot be a descendent of the source.
-CopyFilesAndFoldersOperation_overwriteProblem = The folder ''{0}'' already exists and cannot be overwritten since it contains ''{1}''.
-CopyFilesAndFoldersOperation_question = Question
-CopyFilesAndFoldersOperation_confirmMove=Confirm Move
-CopyFilesAndFoldersOperation_warningMove=Moving these resources may have undesirable side effects.
-CopyFilesAndFoldersOperation_confirmCopy=Confirm Copy
-CopyFilesAndFoldersOperation_warningCopy=Copying these resources may have undesirable side effects.
-CopyFilesAndFoldersOperation_inputDialogTitle = Name Conflict
-CopyFilesAndFoldersOperation_inputDialogMessage = Enter a new name for ''{0}''
-CopyFilesAndFoldersOperation_nameExists = A resource with that name already exists
-CopyFilesAndFoldersOperation_nameMustBeDifferent = You must use a different name
-CopyFilesAndFoldersOperation_sameSourceAndDest = Cannot copy ''{0}''. The source and destination are the same.
-CopyFilesAndFoldersOperation_importSameSourceAndDest = Cannot import ''{0}''. The source and destination are the same.
-CopyFilesAndFoldersOperation_resourceDeleted = The resource ''{0}'' does not exist on the file system.
-CopyFilesAndFoldersOperation_missingPathVariable = The resource ''{0}'' is linked using a missing path variable.
-CopyFilesAndFoldersOperation_missingLinkTarget = The link target for linked resource ''{0}'' does not exist.
-CopyFilesAndFoldersOperation_CopyResourcesTask=Copying Resources
-CopyFilesAndFoldersOperation_parentNotEqual = The resources must have the same parent.
-CopyFilesAndFoldersOperation_infoNotFound = Information for {0} could not be read. Please check the .log file for details.
-CopyFilesAndFoldersOperation_copyTitle= Copy Resources
-CopyFilesAndFoldersOperation_moveTitle= Move Resources
-
-MoveFilesAndFoldersOperation_sameSourceAndDest = Cannot move ''{0}''. The source and destination are the same.
-MoveFilesAndFoldersOperation_moveFailedTitle = Move Problems
-MoveFilesAndFoldersOperation_problemMessage = Problems occurred moving the selected resources.
-MoveFilesAndFoldersOperation_operationTitle = Moving...
-
-# ==============================================================================
-# Wizards
-# ==============================================================================
-
-WizardDataTransfer_existsQuestion = ''{0}'' already exists.  Would you like to overwrite it?
-WizardDataTransfer_overwriteNameAndPathQuestion = Overwrite ''{0}'' in folder ''{1}''?
-WizardDataTransfer_exceptionMessage =  Error occurred during operation: {0}
-WizardTransferPage_selectTypes = Filter &Types...
-WizardTransferPage_selectAll = &Select All
-WizardTransferPage_deselectAll = &Deselect All
-
-
-
-
-
-
-
-# --- Import ---
-WizardImportPage_specifyProject = Specify a project
-WizardImportPage_specifyFolder = Please specify folder
-WizardImportPage_folderMustExist = Folder must be accessible.
-WizardImportPage_errorDialogTitle = Import Problems
-WizardImportPage_folder = Into fo&lder:
-WizardImportPage_browseLabel = Browse...
-WizardImportPage_browse2 = Bro&wse...
-WizardImportPage_selectFolderLabel = Select a folder to import into.
-WizardImportPage_selectFolderTitle = Import into Folder
-WizardImportPage_destinationLabel = Select the destination for imported resources:
-WizardImportPage_options = Options
-WizardImportPage_projectNotExist = Destination project does not exist.
-WizardImportPage_importOnReceiver = Source is in the hierarchy of the destination.
-WizardImportPage_noOpenProjects = Cannot import into a workspace with no open projects. Please create a project before importing.
-WizardImportPage_undefinedPathVariable = Destination folder location is based on an undefined path variable.
-WizardImportPage_containerNotExist = Destination folder does not exist.
-
-# --- Export ---
-WizardExportPage_errorDialogTitle = Export Problems
-WizardExportPage_mustExistMessage = Resource must exist.
-WizardExportPage_mustBeAccessibleMessage = Resource must be accessible.
-WizardExportPage_detailsMessage = All file resources matching this criterion
-WizardExportPage_whatLabel = Select the resources to &export:
-WizardExportPage_whereLabel = Select the export destination:
-WizardExportPage_options = Options
-WizardExportPage_selectionDialogMessage = Select the resource types to export.
-WizardExportPage_resourceTypeDialog = Resource Type Selection
-WizardExportPage_folder = Fo&lder:
-WizardExportPage_browse = Browse...
-WizardExportPage_allTypes = All types
-WizardExportPage_specificTypes = Specific types:
-WizardExportPage_edit = Edit...
-WizardExportPage_details = Details...
-WizardExportPage_selectResourcesTitle = Select the resources to export.
-WizardExportPage_oneResourceSelected = 1 resource selected
-WizardExportPage_selectResourcesToExport = Select the resource to export.
-WizardExportPage_internalErrorTitle = Internal error
-WizardExportPage_resourceCountMessage = {0} resources selected
-
-
-# --- New Example ---
-NewExample_title = New Example
-
-# --- New Project ---
-WizardNewProjectCreationPage_projectNameEmpty = Project name must be specified
-WizardNewProjectCreationPage_projectLocationEmpty = Project location directory must be specified
-WizardNewProjectCreationPage_projectExistsMessage = A project with that name already exists in the workspace.
-WizardNewProjectCreationPage_nameLabel = &Project name:
-WizardNewProjectReferences_title = &Referenced projects:
-
-# --- New Folder ---
-WizardNewFolderMainPage_folderName = Folder &name:
-WizardNewFolderMainPage_folderLabel = folder
-WizardNewFolderMainPage_description = Create a new folder resource.
-WizardNewFolderCreationPage_progress = Creating
-WizardNewFolderCreationPage_errorTitle = Creation Problems
-WizardNewFolderCreationPage_internalErrorTitle = Creation problems
-WizardNewFolderCreationPage_title = New Folder
-WizardNewFolder_internalError = Internal error: {0}
-
-# --- New File ---
-WizardNewFileCreationPage_progress = Creating
-WizardNewFileCreationPage_errorTitle = Creation Problems
-WizardNewFileCreationPage_fileLabel = File na&me:
-WizardNewFileCreationPage_file = file
-WizardNewFileCreationPage_internalErrorTitle = Creation problems
-WizardNewFileCreationPage_internalErrorMessage = Internal error: {0}
-WizardNewFileCreationPage_title = New File
-
-# --- Linked Resource ---
-WizardNewLinkPage_linkFileButton = &Link to file on the file system
-WizardNewLinkPage_linkFolderButton = &Link to folder on the file system
-WizardNewLinkPage_browseButton = &Browse...
-WizardNewLinkPage_variablesButton = &Variables...
-WizardNewLinkPage_targetSelectionLabel = Select the link target.
-WizardNewLinkPage_linkTargetEmpty = Link target must be specified
-WizardNewLinkPage_linkTargetInvalid = Link target name is invalid
-WizardNewLinkPage_linkTargetLocationInvalid = Link target location is invalid
-WizardNewLinkPage_linkTargetNonExistent = Link target does not exist
-WizardNewLinkPage_linkTargetNotFile = Link target must be a file
-WizardNewLinkPage_linkTargetNotFolder = Link target must be a folder
-
-# ==============================================================================
-# Preference Pages
-# ==============================================================================
-Preference_note = Note:
-
-# --- Workbench ---
-WorkbenchPreference_encoding = &Text file encoding
-WorkbenchPreference_defaultEncoding = Defa&ult ({0})
-WorkbenchPreference_otherEncoding = &Other:
-WorkbenchPreference_unsupportedEncoding = The selected encoding is not supported.
-
-WorkbenchPreference_encoding_encodingMessage = Byte Order Mark is {0}
-
-# ---Workspace
-IDEWorkspacePreference_autobuild = &Build automatically
-IDEWorkspacePreference_autobuildToolTip = Build automatically on resource modification
-IDEWorkspacePreference_savePriorToBuilding= Save auto&matically before build
-IDEWorkspacePreference_savePriorToBuildingToolTip= Save modified resources automatically before manual build
-IDEWorkspacePreference_RefreshButtonText=&Refresh automatically
-IDEWorkspacePreference_RefreshButtonToolTip=Automatically refresh external workspace changes
-IDEWorkspacePreference_fileLineDelimiter=New text &file line delimiter
-IDEWorkspacePreference_defaultLineDelim=D&efault
-IDEWorkspacePreference_defaultLineDelimProj=Inh&erited from container
-IDEWorkspacePreference_otherLineDelim= Ot&her:
-IDEWorkspacePreference_relatedLink = See <a>''{0}''</a> for workspace startup and shutdown preferences.
-IDEWorkspacePreference_openReferencedProjects = Open referenced projects when a project is opened
-
-# --- Linked Resources ---
-LinkedResourcesPreference_explanation = Path variables specify locations in the file system. The locations of linked resources\nmay be specified relative to these path variables.
-LinkedResourcesPreference_enableLinkedResources = &Enable linked resources
-LinkedResourcesPreference_linkedResourcesWarningTitle = Enabled Linked Resources
-LinkedResourcesPreference_linkedResourcesWarningMessage = You have enabled a feature which may give rise to incompatibilities if projects are shared by users of different versions of the workbench.  Please consult the documentation for further details.
-
-# The following six keys are marked as unused by the NLS search, but they are indirectly used
-# and should be removed.
-PathVariableDialog_shellTitle_newVariable = New Variable
-PathVariableDialog_shellTitle_existingVariable = Edit Variable
-PathVariableDialog_dialogTitle_newVariable = Define a New Path Variable
-PathVariableDialog_dialogTitle_existingVariable = Edit an Existing Path Variable
-PathVariableDialog_message_newVariable = Enter a new variable name and its associated location.
-PathVariableDialog_message_existingVariable = Edit variable's name and path value.
-
-PathVariableDialog_variableName = &Name:
-PathVariableDialog_variableValue = &Location:
-PathVariableDialog_variableNameEmptyMessage = You must provide a variable name.
-PathVariableDialog_variableValueEmptyMessage = You must provide a file or folder path as variable value.
-PathVariableDialog_variableValueInvalidMessage = The provided value is not a valid path.
-PathVariableDialog_file = &File...
-PathVariableDialog_folder = F&older...
-PathVariableDialog_selectFileTitle = File selection
-PathVariableDialog_selectFolderTitle = Folder selection
-PathVariableDialog_selectFolderMessage = Specify the folder to be represented by the variable.
-PathVariableDialog_variableAlreadyExistsMessage = This variable name is already in use.
-PathVariableDialog_pathIsRelativeMessage = Path must be absolute.
-PathVariableDialog_pathDoesNotExistMessage = Path does not exist.
-
-# --- Local History ---
-FileHistory_longevity = Days to &keep files:
-FileHistory_entries = Maximum &entries per file:
-FileHistory_diskSpace = &Maximum file size (MB):
-FileHistory_mustBePositive = Values must be positive
-FileHistory_invalid = Invalid value: {0}
-FileHistory_exceptionSaving = Internal error saving local history
-FileHistory_aboveMaxEntries = Above maximum Entries per file: {0}
-FileHistory_aboveMaxFileSize = Above maximum file size value: {0}
-FileHistory_restartNote = The 'Maximum entries per file' and 'Days to keep files'\nvalues are only applied on restart.
-
-# --- Perspectives ---
-ProjectSwitchPerspectiveMode_optionsTitle = Open the associated perspective when creating a new project
-ProjectSwitchPerspectiveMode_always = Alwa&ys open
-ProjectSwitchPerspectiveMode_never = Ne&ver open
-ProjectSwitchPerspectiveMode_prompt = Promp&t
-
-# --- Build Order ---
-BuildOrderPreference_up = &Up
-BuildOrderPreference_down = Dow&n
-BuildOrderPreference_add = Add &Project...
-BuildOrderPreference_remove = &Remove Project
-BuildOrderPreference_selectOtherProjects = Select &projects to add to build path:
-BuildOrderPreference_useDefaults = Use d&efault build order
-BuildOrderPreference_projectBuildOrder = Project build &order:
-BuildOrderPreference_removeNote = A project removed from the list is still built but after those specified in the list.
-BuildOrderPreference_maxIterationsLabel=&Max iterations when building with cycles:
-
-# --- Startup preferences ---
-StartupPreferencePage_refreshButton = &Refresh workspace on startup
-StartupPreferencePage_launchPromptButton = Prompt for &workspace on startup
-StartupPreferencePage_exitPromptButton = &Confirm exit when closing last window
-
-# --- Info ---
-ResourceInfo_readOnly = &Read only
-ResourceInfo_executable = E&xecutable
-ResourceInfo_archive = Ar&chive
-ResourceInfo_derived = Deri&ved
-ResourceInfo_type = &Type:
-ResourceInfo_location = &Location:
-ResourceInfo_resolvedLocation = Resolved location:
-ResourceInfo_size = &Size:
-ResourceInfo_bytes = {0}  bytes
-ResourceInfo_file = File
-ResourceInfo_fileTypeFormat = File  ({0})
-ResourceInfoPage_noResource=Resource information is not available for the current selection.
-ResourceInfo_folder = Folder
-ResourceInfo_project = Project
-ResourceInfo_linkedFile = Linked File
-ResourceInfo_linkedFolder = Linked Folder
-ResourceInfo_unknown = Unknown
-ResourceInfo_notLocal = <file contents not local>
-ResourceInfo_undefinedPathVariable = <undefined path variable>
-ResourceInfo_notExist = <resource does not exist>
-ResourceInfo_fileNotExist = {0} - (does not exist)
-ResourceInfo_path = &Path:
-ResourceInfo_lastModified = Last &modified:
-ResourceInfo_fileEncodingTitle = Default encoding for &text files
-ResourceInfo_fileContentEncodingFormat = &Default (determined from content: {0})
-ResourceInfo_fileContainerEncodingFormat = Default (&inherited from container: {0})
-ResourceInfo_containerEncodingFormat = &Inherited from container ({0})
-ResourceInfo_exWarning= Removing the executable flag on a directory will cause its children to become unreadable.
-
-# --- Project References ---
-ProjectReferencesPage_label = Projects may refer to other projects in the workspace.\nUse this page to specify what other projects are referenced by the project.\n\n&Project references for ''{0}'':
-
-# ==============================================================================
-# Editors
-# ==============================================================================
-DefaultEditorDescription_name = &Default Editor
-
-WelcomeEditor_accessException = An exception occurred when trying to access the welcome page
-WelcomeEditor_readFileError = Error in WelcomeEditor.readFile
-WelcomeEditor_title = Welcome
-WelcomeEditor_toolTip = Welcome to {0}
-WelcomeEditor_copy_text=&Copy
-
-WelcomeItem_unableToLoadClass = Unable to load class
-WelcomeParser_parseError = Error in WelcomeParser.parse
-WelcomeParser_parseException = An exception occurred when parsing the welcome page
-Workbench_openEditorErrorDialogTitle = Problem
-Workbench_openEditorErrorDialogMessage = Unable to open editor
-QuickStartAction_openEditorException = An exception occurred when opening the editor
-
-# ==============================================================================
-# Dialogs
-# ==============================================================================
-Question = Question
-Always = &Always
-Never = &Never
-Prompt = &Prompt
-
-ContainerSelectionDialog_title = Folder Selection
-ContainerSelectionDialog_message = Enter or select the parent folder:
-
-ContainerGroup_message = &Enter or select the parent folder:
-ContainerGroup_selectFolder = Select the folder:
-
-ContainerGenerator_progressMessage = Generate Folder
-ContainerGenerator_pathOccupied = Cannot create folder because a file exists at that location: {0}
-
-ResourceGroup_resource = resource
-ResourceGroup_nameExists = ''{0}'' already exists.
-ResourceGroup_folderEmpty = No folder specified.
-ResourceGroup_noProject = The specified project does not exist.
-ResourceGroup_emptyName = The ''{0}'' name is empty.
-ResourceGroup_invalidFilename = ''{0}'' is not a valid file name.
-ResourceGroup_pathOccupied = A file already exists at that location: {0}
-
-FileSelectionDialog_title = File Selection
-FileSelectionDialog_message = Select the files:
-
-ProjectLocationSelectionDialog_nameLabel = &Project name:
-ProjectLocationSelectionDialog_locationLabel = &Location:
-ProjectLocationSelectionDialog_browseLabel = B&rowse...
-ProjectLocationSelectionDialog_directoryLabel = Select the location directory.
-ProjectLocationSelectionDialog_locationError = Invalid location path
-ProjectLocationSelectionDialog_locationIsSelf = Location is the current location
-ProjectLocationSelectionDialog_selectionTitle = Project
-ProjectLocationSelectionDialog_useDefaultLabel = Use &default location
-
-
-ResourceSelectionDialog_title = Resource Selection
-ResourceSelectionDialog_message = Select the resources:
-
-MarkerResolutionSelectionDialog_title = Quick Fix
-MarkerResolutionSelectionDialog_messageLabel = &Available fixes:
-
-FilteredResourcesSelectionDialog_showDerivedResourcesAction=Show &Derived Resources
-
-ResourceSelectionDialog_label = Select a resource to open (? = any character, * = any string):
-ResourceSelectionDialog_matching = &Matching resources:
-ResourceSelectionDialog_folders = In &folders:
-ResourceSelectionDialog_showDerived=Show &derived resources
-
-OpenResourceDialog_title = Open Resource
-OpenResourceDialog_openButton_text = Open
-OpenResourceDialog_openWithMenu_label = Open &With
-OpenResourceDialog_openWithButton_toolTip = Open With
-
-NewFolderDialog_title = New Folder
-NewFolderDialog_nameLabel = &Folder name:
-NewFolderDialog_alreadyExists = The folder ''{0}'' already exists.
-NewFolderDialog_folderNameEmpty = Folder name must be specified
-NewFolderDialog_progress = Creating new folder
-NewFolderDialog_errorTitle = Creation Problems
-NewFolderDialog_internalError = Internal error: {0}
-
-CreateLinkedResourceGroup_linkFileButton = &Link to file in the file system
-CreateLinkedResourceGroup_linkFolderButton = &Link to folder in the file system
-CreateLinkedResourceGroup_browseButton = Bro&wse...
-CreateLinkedResourceGroup_variablesButton = &Variables...
-CreateLinkedResourceGroup_resolvedPathLabel = Resolved location:
-CreateLinkedResourceGroup_targetSelectionLabel = Select the link target.
-CreateLinkedResourceGroup_targetSelectionTitle = Select Link Target
-CreateLinkedResourceGroup_linkTargetNotFile = Link target must be a file.
-CreateLinkedResourceGroup_linkTargetNotFolder = Link target must be a folder.
-CreateLinkedResourceGroup_linkTargetNonExistent = Link target does not exist.
-CreateLinkedResourceGroup_unableToValidateLinkTarget = Unable to validate link target.
-
-PathVariablesBlock_variablesLabel = &Defined path variables:
-PathVariablesBlock_addVariableButton = &New...
-PathVariablesBlock_editVariableButton = Edi&t...
-PathVariablesBlock_removeVariableButton = &Remove
-
-PathVariableSelectionDialog_title = Select Path Variable
-PathVariableSelectionDialog_extendButton = &Extend...
-PathVariableSelectionDialog_ExtensionDialog_title = Variable Extension
-PathVariableSelectionDialog_ExtensionDialog_description = Choose extension to {0}
-
-# ==============================================================================
-# Editor Framework
-# ==============================================================================
-EditorManager_saveResourcesMessage = Select the &resources to save:
-EditorManager_saveResourcesTitle = Save Resources
-
-OpenSystemEditorAction_dialogTitle = Problems Opening System Editor
-OpenSystemEditorAction_text = &System Editor
-OpenSystemEditorAction_toolTip = Edit File with System Editor
-
-# ==============================================================================
-# Workspace
-# ==============================================================================
-WorkspaceAction_problemsTitle = Problems
-WorkspaceAction_logTitle = Exception in {0}. run: {1}
-WorkbenchAction_problemsMessage = The following problems occurred.
-WorkbenchAction_internalError = Internal error.
-Workspace = Workspace
-
-
-# ==============================================================================
-# Workbench
-# ==============================================================================
-WorkbenchWindow_shellTitle = {0} - {1}
-
-Internal_error = Internal error
-InternalError = Internal Error
-InternalErrorNoArg = An internal error has occurred.\nSee the .log file for more details.\n\nDo you want to exit the workbench?
-InternalErrorOneArg = An internal error has occurred.\n{0}\nSee the .log file for more details.\n\nDo you want to exit the workbench?
-
-FatalError_RecursiveError = An internal error occurred while showing an internal error.
-FatalError_OutOfMemoryError = An out of memory error has occurred. Consult the "Running Eclipse" section of the read me file for information on preventing this kind of error in the future.
-FatalError_StackOverflowError = A stack overflow error has occurred.
-FatalError_VirtualMachineError = A virtual machine error has occurred.
-FatalError_SWTError = An SWT error has occurred.
-FatalError = {0}\nYou are recommended to exit the workbench.\nSubsequent errors may happen and may terminate the workbench without warning.\nSee the .log file for more details.\n\nDo you want to exit the workbench?
-
-ProblemSavingWorkbench = Problems occurred while trying to save the state of the workbench.
-ProblemsSavingWorkspace = Problems saving workspace
-
-Problems_Opening_Page = Problems Opening Page
-
-Workspace_refreshing = Refreshing workspace
-
-IDEExceptionHandler_ExceptionHandledMessage = Exception Handler Notified
-
-
-# ==============================================================================
-# Keys with references but don't show in the UI
-# ==============================================================================
-CreateFileAction_text = New &File
-CreateFileAction_toolTip = Create New File
-CreateFileAction_title = New
-
-CreateFolderAction_text = New F&older
-CreateFolderAction_toolTip = Create New Folder
-CreateFolderAction_title = New
-
-ScrubLocalAction_problemsMessage = Problems occurred removing the local contents of the selected resources.
-ScrubLocalAction_text = Discard &Local Copy
-ScrubLocalAction_toolTip = Discard Local Contents
-ScrubLocalAction_problemsTitle = Content Removal Problems
-ScrubLocalAction_progress = Discarding content...
-
-TextAction_selectAll = Select All
-Cut = Cut
-Copy = Copy
-Paste = Paste
-Delete = Delete
-
-# ==============================================================================
-# Keys used in the reuse editor which is released as experimental.
-# ==============================================================================
-WorkbenchPreference_saveInterval=&Workspace save interval (in minutes):
-WorkbenchPreference_saveIntervalError=The workspace save interval should be between 1 and {0}.
-
-# ==============================================================================
-# Working Set Framework.
-# ==============================================================================
-ResourceWorkingSetPage_title=Resource Working Set
-ResourceWorkingSetPage_description=Enter a working set name and select the working set resources.
-ResourceWorkingSetPage_message=&Working set name:
-ResourceWorkingSetPage_label_tree=Working set &contents:
-ResourceWorkingSetPage_warning_nameMustNotBeEmpty= The name must not be empty.
-ResourceWorkingSetPage_warning_nameWhitespace= The name must not have a leading or trailing whitespace.
-ResourceWorkingSetPage_warning_workingSetExists= A working set with the same name already exists.
-ResourceWorkingSetPage_warning_resourceMustBeChecked= No resources selected.
-ResourceWorkingSetPage_error= Error
-ResourceWorkingSetPage_error_updateCheckedState= Error during update of checked state
-ResourceWorkingSetPage_selectAll_label=Select &All
-ResourceWorkingSetPage_selectAll_toolTip=Select all of theses resource for this working set.
-ResourceWorkingSetPage_deselectAll_label=Dese&lect All
-ResourceWorkingSetPage_deselectAll_toolTip=Deselect all of these resources for this working set.
-
-ResourceEncodingFieldEditor_ErrorLoadingMessage=Error loading encoding
-ResourceEncodingFieldEditor_ErrorStoringMessage=Error storing encoding
-ResourceEncodingFieldEditor_EncodingConflictTitle=Conflict in Encoding
-ResourceEncodingFieldEditor_EncodingConflictMessage= {0} conflicts with the encoding defined in the content type ({1}). Do you wish to set it anyways?
-
-ChooseWorkspaceDialog_dialogName=Workspace Launcher
-ChooseWorkspaceDialog_dialogTitle=Select a workspace
-ChooseWorkspaceDialog_dialogMessage= \
-{0} stores your projects in a folder called a workspace.\n\
-Choose a workspace folder to use for this session.
-ChooseWorkspaceDialog_defaultProductName = This product
-ChooseWorkspaceDialog_workspaceEntryLabel=&Workspace:
-ChooseWorkspaceDialog_browseLabel=&Browse...
-ChooseWorkspaceDialog_directoryBrowserTitle=Select Workspace Directory
-ChooseWorkspaceDialog_directoryBrowserMessage=Select the workspace directory to use.
-ChooseWorkspaceDialog_useDefaultMessage=&Use this as the default and do not ask again
-
-ChooseWorkspaceWithSettingsDialog_SettingsGroupName=&Copy Settings
-ChooseWorkspaceWithSettingsDialog_ProblemsTransferTitle=Problems Transferring Settings
-ChooseWorkspaceWithSettingsDialog_TransferFailedMessage=Settings transfer failed
-ChooseWorkspaceWithSettingsDialog_SaveSettingsFailed=Could not save settings
-ChooseWorkspaceWithSettingsDialog_ClassCreationFailed= Could not instantiate {0}
-
-
-IDEApplication_workspaceMandatoryTitle=Workspace is Mandatory
-IDEApplication_workspaceMandatoryMessage=IDEs need a valid workspace. Restart without the @none option.
-IDEApplication_workspaceInUseTitle=Workspace Unavailable
-IDEApplication_workspaceInUseMessage=Workspace in use or cannot be created, choose a different one.
-IDEApplication_workspaceEmptyTitle=Workspace Required
-IDEApplication_workspaceEmptyMessage=Workspace field must not be empty; enter a path to continue.
-IDEApplication_workspaceInvalidTitle=Invalid Workspace
-IDEApplication_workspaceInvalidMessage=Selected workspace is not valid; choose a different one.
-IDEApplication_workspaceCannotBeSetTitle=Workspace Cannot Be Created
-IDEApplication_workspaceCannotBeSetMessage=Could not launch the product because the specified workspace cannot be created.  The specified workspace directory is either invalid or read-only.
-IDEApplication_workspaceCannotLockTitle=Workspace Cannot Be Locked
-IDEApplication_workspaceCannotLockMessage=Could not launch the product because the associated workspace is currently in use by another Eclipse application.
-IDEApplication_versionTitle = Different Workspace Version
-IDEApplication_versionMessage = \
-This workspace was written with a different version of the product and needs to be updated.\n\n\
-{0}\n\n\
-Updating the workspace may make it incompatible with other versions of the product.\n\
-Press OK to update the workspace and open it.  Press Cancel to select a different workspace.
-
-CleanDialog_buildCleanAuto=Clean will discard all build problems and built states.  The projects will be rebuilt from scratch.
-CleanDialog_buildCleanManual=Clean will discard all build problems and built states.  The next time a build occurs the projects will be rebuilt from scratch.
-CleanDialog_title=Clean
-CleanDialog_cleanAllButton=Clean &all projects
-CleanDialog_cleanSelectedButton=Clean projects &selected below
-CleanDialog_buildNowButton=Start a &build immediately
-CleanDialog_globalBuildButton=Build the entire &workspace
-CleanDialog_buildSelectedProjectsButton=Build only the selected &projects
-CleanDialog_cleanSelectedTaskName=Cleaning selected projects
-CleanDialog_cleanAllTaskName=Cleaning all projects
-IDEEncoding_EncodingJob=Setting encoding
-IDEEditorsPreferencePage_WorkbenchPreference_FileEditorsRelatedLink=See <a>''{0}''</a> for associating editors with file types.
-IDEEditorsPreferencePage_WorkbenchPreference_viewsRelatedLink = See <a>''{0}''</a> for appearance preferences.
-IDEEditorsPreferencePage_WorkbenchPreference_contentTypesRelatedLink = See <a>''{0}''</a> for content-type based file associations.
-WorkbenchEncoding_invalidCharset = {0} is not a valid charset.
-IDE_areYouSure={0} Are you sure you want to continue?
-
-SystemSettingsChange_title = High Contrast Mode Change
-SystemSettingsChange_message = The high contrast mode has changed. You will need to restart the workbench to complete the change.  Restart now?
-SystemSettingsChange_yes = Yes
-SystemSettingsChange_no = No
-
-UnsupportedVM_message=GCJ has been detected as the current Java virtual machine.  Use of GCJ is untested and unsupported.  Please consult the documentation for more information.
-IDEWorkbenchActivityHelper_jobName=Update Capability Enablement for Natures
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/CheckboxTreeAndListGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/CheckboxTreeAndListGroup.java
deleted file mode 100644
index 3c45a86..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/CheckboxTreeAndListGroup.java
+++ /dev/null
@@ -1,814 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.misc;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.commands.common.EventManager;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.ITreeViewerListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeExpansionEvent;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Tree;
-
-/**
- *	Workbench-level composite that combines a CheckboxTreeViewer and CheckboxListViewer.
- *	All viewer selection-driven interactions are handled within this object
- */
-public class CheckboxTreeAndListGroup extends EventManager implements
-		ICheckStateListener, ISelectionChangedListener, ITreeViewerListener {
-    private Object root;
-
-    private Object currentTreeSelection;
-
-    private List expandedTreeNodes = new ArrayList();
-
-    private Map checkedStateStore = new HashMap(9);
-
-    private List whiteCheckedTreeItems = new ArrayList();
-
-    private ITreeContentProvider treeContentProvider;
-
-    private IStructuredContentProvider listContentProvider;
-
-    private ILabelProvider treeLabelProvider;
-
-    private ILabelProvider listLabelProvider;
-
-    // widgets
-    private CheckboxTreeViewer treeViewer;
-
-    private CheckboxTableViewer listViewer;
-
-    /**
-     *  Create an instance of this class.  Use this constructor if you wish to specify
-     *	the width and/or height of the combined widget (to only hardcode one of the
-     *	sizing dimensions, specify the other dimension's value as -1)
-     * @param parent
-     * @param rootObject
-     * @param treeContentProvider
-     * @param treeLabelProvider
-     * @param listContentProvider
-     * @param listLabelProvider
-     * @param style
-     * @param width
-     * @param height
-     */
-    public CheckboxTreeAndListGroup(Composite parent, Object rootObject,
-            ITreeContentProvider treeContentProvider,
-            ILabelProvider treeLabelProvider,
-            IStructuredContentProvider listContentProvider,
-            ILabelProvider listLabelProvider, int style, int width, int height) {
-
-        root = rootObject;
-        this.treeContentProvider = treeContentProvider;
-        this.listContentProvider = listContentProvider;
-        this.treeLabelProvider = treeLabelProvider;
-        this.listLabelProvider = listLabelProvider;
-        createContents(parent, width, height, style);
-    }
-
-    /**
-     * This method must be called just before this window becomes visible.
-     */
-    public void aboutToOpen() {
-        determineWhiteCheckedDescendents(root);
-        checkNewTreeElements(treeContentProvider.getElements(root));
-        currentTreeSelection = null;
-
-        //select the first element in the list
-        Object[] elements = treeContentProvider.getElements(root);
-        Object primary = elements.length > 0 ? elements[0] : null;
-        if (primary != null) {
-            treeViewer.setSelection(new StructuredSelection(primary));
-        }
-        treeViewer.getControl().setFocus();
-    }
-
-    /**
-     *	Add the passed listener to self's collection of clients
-     *	that listen for changes to element checked states
-     *
-     *	@param listener ICheckStateListener
-     */
-    public void addCheckStateListener(ICheckStateListener listener) {
-        addListenerObject(listener);
-    }
-
-    /**
-     *	Add the receiver and all of it's ancestors to the checkedStateStore if they
-     * are not already there.
-     */
-    private void addToHierarchyToCheckedStore(Object treeElement) {
-
-        // if this tree element is already gray then its ancestors all are as well
-        if (!checkedStateStore.containsKey(treeElement)) {
-			checkedStateStore.put(treeElement, new ArrayList());
-		}
-
-        Object parent = treeContentProvider.getParent(treeElement);
-        if (parent != null) {
-			addToHierarchyToCheckedStore(parent);
-		}
-    }
-
-    /**
-     *	Return a boolean indicating whether all children of the passed tree element
-     *	are currently white-checked
-     *
-     *	@return boolean
-     *	@param treeElement java.lang.Object
-     */
-    protected boolean areAllChildrenWhiteChecked(Object treeElement) {
-        Object[] children = treeContentProvider.getChildren(treeElement);
-        for (int i = 0; i < children.length; ++i) {
-            if (!whiteCheckedTreeItems.contains(children[i])) {
-				return false;
-			}
-        }
-
-        return true;
-    }
-
-    /**
-     *	Return a boolean indicating whether all list elements associated with
-     *	the passed tree element are currently checked
-     *
-     *	@return boolean
-     *	@param treeElement java.lang.Object
-     */
-    protected boolean areAllElementsChecked(Object treeElement) {
-        List checkedElements = (List) checkedStateStore.get(treeElement);
-        if (checkedElements == null) {
-			return false;
-		}
-
-        return getListItemsSize(treeElement) == checkedElements.size();
-    }
-
-    /**
-     *	Iterate through the passed elements which are being realized for the first
-     *	time and check each one in the tree viewer as appropriate
-     */
-    protected void checkNewTreeElements(Object[] elements) {
-        for (int i = 0; i < elements.length; ++i) {
-            Object currentElement = elements[i];
-            boolean checked = checkedStateStore.containsKey(currentElement);
-            treeViewer.setChecked(currentElement, checked);
-            treeViewer.setGrayed(currentElement, checked
-                    && !whiteCheckedTreeItems.contains(currentElement));
-        }
-    }
-
-    /**
-     *	An item was checked in one of self's two views.  Determine which
-     *	view this occurred in and delegate appropriately
-     *
-     *	@param event CheckStateChangedEvent
-     */
-    public void checkStateChanged(final CheckStateChangedEvent event) {
-
-        //Potentially long operation - show a busy cursor
-        BusyIndicator.showWhile(treeViewer.getControl().getDisplay(),
-                new Runnable() {
-                    public void run() {
-                        if (event.getCheckable().equals(treeViewer)) {
-							treeItemChecked(event.getElement(), event
-                                    .getChecked());
-						} else {
-							listItemChecked(event.getElement(), event
-                                    .getChecked(), true);
-						}
-
-                        notifyCheckStateChangeListeners(event);
-                    }
-                });
-    }
-
-    /**
-     *	Lay out and initialize self's visual components.
-     *
-     *	@param parent org.eclipse.swt.widgets.Composite
-     *	@param width int
-     *	@param height int
-     */
-    protected void createContents(Composite parent, int width, int height,
-            int style) {
-        // group pane
-        Composite composite = new Composite(parent, style);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        layout.makeColumnsEqualWidth = true;
-        layout.marginHeight = 0;
-        layout.marginWidth = 0;
-        composite.setLayout(layout);
-        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-        composite.setFont(parent.getFont());
-
-        createTreeViewer(composite, width / 2, height);
-        createListViewer(composite, width / 2, height);
-
-        initialize();
-    }
-
-    /**
-     *	Create this group's list viewer.
-     */
-    protected void createListViewer(Composite parent, int width, int height) {
-        listViewer = CheckboxTableViewer.newCheckList(parent, SWT.BORDER);
-        GridData data = new GridData(GridData.FILL_BOTH);
-        data.widthHint = width;
-        data.heightHint = height;
-        listViewer.getTable().setLayoutData(data);
-        listViewer.getTable().setFont(parent.getFont());
-        listViewer.setContentProvider(listContentProvider);
-        listViewer.setLabelProvider(listLabelProvider);
-        listViewer.addCheckStateListener(this);
-    }
-
-    /**
-     *	Create this group's tree viewer.
-     */
-    protected void createTreeViewer(Composite parent, int width, int height) {
-        Tree tree = new Tree(parent, SWT.CHECK | SWT.BORDER);
-        GridData data = new GridData(GridData.FILL_BOTH);
-        data.widthHint = width;
-        data.heightHint = height;
-        tree.setLayoutData(data);
-        tree.setFont(parent.getFont());
-
-        treeViewer = new CheckboxTreeViewer(tree);
-        treeViewer.setContentProvider(treeContentProvider);
-        treeViewer.setLabelProvider(treeLabelProvider);
-        treeViewer.addTreeListener(this);
-        treeViewer.addCheckStateListener(this);
-        treeViewer.addSelectionChangedListener(this);
-    }
-
-    /**
-     * Returns a boolean indicating whether the passed tree element should be
-     * at LEAST gray-checked.  Note that this method does not consider whether
-     * it should be white-checked, so a specified tree item which should be
-     * white-checked will result in a <code>true</code> answer from this method.
-     * To determine whether a tree item should be white-checked use method
-     * #determineShouldBeWhiteChecked(Object).
-     *
-     * @param treeElement java.lang.Object
-     * @return boolean
-     * @see #determineShouldBeWhiteChecked(java.lang.Object)
-     */
-    protected boolean determineShouldBeAtLeastGrayChecked(Object treeElement) {
-        // if any list items associated with treeElement are checked then it
-        // retains its gray-checked status regardless of its children
-        List checked = (List) checkedStateStore.get(treeElement);
-        if (checked != null && (!checked.isEmpty())) {
-			return true;
-		}
-
-        // if any children of treeElement are still gray-checked then treeElement
-        // must remain gray-checked as well
-        Object[] children = treeContentProvider.getChildren(treeElement);
-        for (int i = 0; i < children.length; ++i) {
-            if (checkedStateStore.containsKey(children[i])) {
-				return true;
-			}
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns a boolean indicating whether the passed tree item should be
-     * white-checked.
-     *
-     * @return boolean
-     * @param treeElement java.lang.Object
-     */
-    protected boolean determineShouldBeWhiteChecked(Object treeElement) {
-        return areAllChildrenWhiteChecked(treeElement)
-                && areAllElementsChecked(treeElement);
-    }
-
-    /**
-     *	Recursively add appropriate tree elements to the collection of
-     *	known white-checked tree elements.
-     *
-     *	@param treeElement java.lang.Object
-     */
-    protected void determineWhiteCheckedDescendents(Object treeElement) {
-        // always go through all children first since their white-checked
-        // statuses will be needed to determine the white-checked status for
-        // this tree element
-        Object[] children = treeContentProvider.getElements(treeElement);
-        for (int i = 0; i < children.length; ++i) {
-			determineWhiteCheckedDescendents(children[i]);
-		}
-
-        // now determine the white-checked status for this tree element
-        if (determineShouldBeWhiteChecked(treeElement)) {
-			setWhiteChecked(treeElement, true);
-		}
-    }
-
-    /**
-     * Cause the tree viewer to expand all its items
-     */
-    public void expandAll() {
-        treeViewer.expandAll();
-    }
-
-    /**
-     *	Answer a flat collection of all of the checked elements in the
-     *	list portion of self
-     *
-     *	@return java.util.Vector
-     */
-    public Iterator getAllCheckedListItems() {
-        List result = new ArrayList();
-        Iterator listCollectionsEnum = checkedStateStore.values().iterator();
-
-        while (listCollectionsEnum.hasNext()) {
-            Iterator currentCollection = ((List) listCollectionsEnum.next())
-                    .iterator();
-            while (currentCollection.hasNext()) {
-				result.add(currentCollection.next());
-			}
-        }
-
-        return result.iterator();
-    }
-
-    /**
-     *	Answer a collection of all of the checked elements in the tree portion
-     *	of self
-     *
-     *	@return java.util.Vector
-     */
-    public Set getAllCheckedTreeItems() {
-        return checkedStateStore.keySet();
-    }
-
-    /**
-     *	Answer the number of elements that have been checked by the
-     *	user.
-     *
-     *	@return int
-     */
-    public int getCheckedElementCount() {
-        return checkedStateStore.size();
-    }
-
-    /**
-     *	Return a count of the number of list items associated with a
-     *	given tree item.
-     *
-     *	@return int
-     *	@param treeElement java.lang.Object
-     */
-    protected int getListItemsSize(Object treeElement) {
-        Object[] elements = listContentProvider.getElements(treeElement);
-        return elements.length;
-    }
-
-    /**
-     * Get the table the list viewer uses.
-     * @return org.eclipse.swt.widgets.Table
-     */
-    public Table getListTable() {
-        return this.listViewer.getTable();
-    }
-
-    /**
-     *	Logically gray-check all ancestors of treeItem by ensuring that they
-     *	appear in the checked table
-     */
-    protected void grayCheckHierarchy(Object treeElement) {
-
-        // if this tree element is already gray then its ancestors all are as well
-        if (checkedStateStore.containsKey(treeElement)) {
-			return; // no need to proceed upwards from here
-		}
-
-        checkedStateStore.put(treeElement, new ArrayList());
-        if (determineShouldBeWhiteChecked(treeElement)) {
-            setWhiteChecked(treeElement, true);
-        }
-        Object parent = treeContentProvider.getParent(treeElement);
-        if (parent != null) {
-			grayCheckHierarchy(parent);
-		}
-    }
-
-    /**
-     *	Set the initial checked state of the passed list element to true.
-     *	
-     *	@param element the element in the list to select 
-     */
-    public void initialCheckListItem(Object element) {
-        Object parent = treeContentProvider.getParent(element);
-        currentTreeSelection = parent;
-        //As this is not done from the UI then set the box for updating from the selection to false 
-        listItemChecked(element, true, false);
-        updateHierarchy(parent);
-    }
-
-    /**
-     *	Set the initial checked state of the passed element to true,
-     *	as well as to all of its children and associated list elements
-     *	
-     *	@param element the element in the tree to select
-     */
-    public void initialCheckTreeItem(Object element) {
-        treeItemChecked(element, true);
-    }
-
-    /**
-     *	Initialize this group's viewers after they have been laid out.
-     */
-    protected void initialize() {
-        treeViewer.setInput(root);
-    }
-
-    /**
-     *	Callback that's invoked when the checked status of an item in the list
-     *	is changed by the user. Do not try and update the hierarchy if we are building the
-     *  initial list.
-     */
-    protected void listItemChecked(Object listElement, boolean state,
-            boolean updatingFromSelection) {
-        List checkedListItems = (List) checkedStateStore
-                .get(currentTreeSelection);
-
-        if (state) {
-            if (checkedListItems == null) {
-                // since the associated tree item has gone from 0 -> 1 checked
-                // list items, tree checking may need to be updated
-                grayCheckHierarchy(currentTreeSelection);
-                checkedListItems = (List) checkedStateStore
-                        .get(currentTreeSelection);
-            }
-            checkedListItems.add(listElement);
-        } else {
-            checkedListItems.remove(listElement);
-            if (checkedListItems.isEmpty()) {
-                // since the associated tree item has gone from 1 -> 0 checked
-                // list items, tree checking may need to be updated
-                ungrayCheckHierarchy(currentTreeSelection);
-            }
-        }
-
-        if (updatingFromSelection) {
-			updateHierarchy(currentTreeSelection);
-		}
-    }
-
-    /**
-     *	Notify all checked state listeners that the passed element has had
-     *	its checked state changed to the passed state
-     */
-    protected void notifyCheckStateChangeListeners(
-            final CheckStateChangedEvent event) {
-        Object[] array = getListeners();
-        for (int i = 0; i < array.length; i++) {
-            final ICheckStateListener l = (ICheckStateListener) array[i];
-            SafeRunner.run(new SafeRunnable() {
-                public void run() {
-                    l.checkStateChanged(event);
-                }
-            });
-        }
-    }
-
-    /**
-     *Set the contents of the list viewer based upon the specified selected
-     *tree element.  This also includes checking the appropriate list items.
-     *
-     *@param treeElement java.lang.Object
-     */
-    protected void populateListViewer(final Object treeElement) {
-        listViewer.setInput(treeElement);
-        List listItemsToCheck = (List) checkedStateStore.get(treeElement);
-
-        if (listItemsToCheck != null) {
-            Iterator listItemsEnum = listItemsToCheck.iterator();
-            while (listItemsEnum.hasNext()) {
-				listViewer.setChecked(listItemsEnum.next(), true);
-			}
-        }
-    }
-
-    /**
-     *	Remove the passed listener from self's collection of clients
-     *	that listen for changes to element checked states
-     *
-     *	@param listener ICheckStateListener
-     */
-    public void removeCheckStateListener(ICheckStateListener listener) {
-        removeListenerObject(listener);
-    }
-
-    /**
-     *	Handle the selection of an item in the tree viewer
-     *
-     *	@param event SelectionChangedEvent
-     */
-    public void selectionChanged(SelectionChangedEvent event) {
-        IStructuredSelection selection = (IStructuredSelection) event
-                .getSelection();
-        Object selectedElement = selection.getFirstElement();
-        if (selectedElement == null) {
-            currentTreeSelection = null;
-            listViewer.setInput(currentTreeSelection);
-            return;
-        }
-
-        // ie.- if not an item deselection
-        if (selectedElement != currentTreeSelection) {
-			populateListViewer(selectedElement);
-		}
-
-        currentTreeSelection = selectedElement;
-    }
-
-    /**
-     * Select or deselect all of the elements in the tree depending on the value of the selection
-     * boolean. Be sure to update the displayed files as well.
-     * 
-     * @param selection boolean indicating whether or not to select all elements
-     */
-    public void setAllSelections(final boolean selection) {
-
-        //Potentially long operation - show a busy cursor
-        BusyIndicator.showWhile(treeViewer.getControl().getDisplay(),
-                new Runnable() {
-                    public void run() {
-                        setTreeChecked(root, selection);
-                        listViewer.setAllChecked(selection);
-                    }
-                });
-    }
-
-    /**
-     *	Set the list viewer's providers to those passed
-     *
-     *	@param contentProvider ITreeContentProvider
-     *	@param labelProvider ILabelProvider
-     */
-    public void setListProviders(IStructuredContentProvider contentProvider,
-            ILabelProvider labelProvider) {
-        listViewer.setContentProvider(contentProvider);
-        listViewer.setLabelProvider(labelProvider);
-    }
-
-    /**
-     *	Set the comparator that is to be applied to self's list viewer
-     *
-     *	@param comparator the comparator for the list viewer
-     */
-    public void setListComparator(ViewerComparator comparator) {
-        listViewer.setComparator(comparator);
-    }
-
-    /**
-     * Set the root of the widget to be new Root. Regenerate all of the tables and lists from this
-     * value.
-     * @param newRoot 
-     */
-    public void setRoot(Object newRoot) {
-        this.root = newRoot;
-        initialize();
-    }
-
-    /**
-     *	Set the checked state of the passed tree element appropriately, and
-     *	do so recursively to all of its child tree elements as well
-     */
-    protected void setTreeChecked(Object treeElement, boolean state) {
-
-        if (treeElement.equals(currentTreeSelection)) {
-            listViewer.setAllChecked(state);
-        }
-
-        if (state) {
-            Object[] listItems = listContentProvider.getElements(treeElement);
-            List listItemsChecked = new ArrayList();
-            for (int i = 0; i < listItems.length; ++i) {
-				listItemsChecked.add(listItems[i]);
-			}
-
-            checkedStateStore.put(treeElement, listItemsChecked);
-        } else {
-			checkedStateStore.remove(treeElement);
-		}
-
-        setWhiteChecked(treeElement, state);
-        treeViewer.setChecked(treeElement, state);
-        treeViewer.setGrayed(treeElement, false);
-
-        // now logically check/uncheck all children as well
-        Object[] children = treeContentProvider.getChildren(treeElement);
-        for (int i = 0; i < children.length; ++i) {
-            setTreeChecked(children[i], state);
-        }
-    }
-
-    /**
-     *	Set the tree viewer's providers to those passed
-     *
-     *	@param contentProvider ITreeContentProvider
-     *	@param labelProvider ILabelProvider
-     */
-    public void setTreeProviders(ITreeContentProvider contentProvider,
-            ILabelProvider labelProvider) {
-        treeViewer.setContentProvider(contentProvider);
-        treeViewer.setLabelProvider(labelProvider);
-    }
-
-    /**
-     *	Set the comparator that is to be applied to self's tree viewer
-     *
-     *	@param comparator the comparator for the tree
-     */
-    public void setTreeComparator(ViewerComparator comparator) {
-        treeViewer.setComparator(comparator);
-    }
-
-    /**
-     *	Adjust the collection of references to white-checked tree elements appropriately.
-     *
-     *	@param treeElement java.lang.Object
-     *	@param isWhiteChecked boolean
-     */
-    protected void setWhiteChecked(Object treeElement, boolean isWhiteChecked) {
-        if (isWhiteChecked) {
-            if (!whiteCheckedTreeItems.contains(treeElement)) {
-				whiteCheckedTreeItems.add(treeElement);
-			}
-        } else {
-			whiteCheckedTreeItems.remove(treeElement);
-		}
-    }
-
-    /**
-     *	Handle the collapsing of an element in a tree viewer
-     */
-    public void treeCollapsed(TreeExpansionEvent event) {
-        // We don't need to do anything with this
-    }
-
-    /**
-     *	Handle the expansionsion of an element in a tree viewer
-     */
-    public void treeExpanded(TreeExpansionEvent event) {
-
-        Object item = event.getElement();
-
-        // First see if the children need to be given their checked state at all.  If they've
-        // already been realized then this won't be necessary
-        if (!expandedTreeNodes.contains(item)) {
-            expandedTreeNodes.add(item);
-            checkNewTreeElements(treeContentProvider.getChildren(item));
-        }
-    }
-
-    /**
-     *  Callback that's invoked when the checked status of an item in the tree
-     *  is changed by the user.
-     */
-    protected void treeItemChecked(Object treeElement, boolean state) {
-
-        // recursively adjust all child tree elements appropriately
-        setTreeChecked(treeElement, state);
-
-        Object parent = treeContentProvider.getParent(treeElement);
-        if (parent == null) {
-			return;
-		}
-
-        // now update upwards in the tree hierarchy 
-        if (state) {
-			grayCheckHierarchy(parent);
-		} else {
-			ungrayCheckHierarchy(parent);
-		}
-
-        updateHierarchy(treeElement);
-    }
-
-    /**
-     *	Logically un-gray-check all ancestors of treeItem iff appropriate.
-     */
-    protected void ungrayCheckHierarchy(Object treeElement) {
-        if (!determineShouldBeAtLeastGrayChecked(treeElement)) {
-			checkedStateStore.remove(treeElement);
-		}
-
-        Object parent = treeContentProvider.getParent(treeElement);
-        if (parent != null) {
-			ungrayCheckHierarchy(parent);
-		}
-    }
-
-    /**
-     *	Set the checked state of self and all ancestors appropriately
-     */
-    protected void updateHierarchy(Object treeElement) {
-
-        boolean whiteChecked = determineShouldBeWhiteChecked(treeElement);
-        boolean shouldBeAtLeastGray = determineShouldBeAtLeastGrayChecked(treeElement);
-
-        treeViewer.setChecked(treeElement, shouldBeAtLeastGray);
-        setWhiteChecked(treeElement, whiteChecked);
-        if (!whiteChecked) {
-			treeViewer.setGrayed(treeElement, shouldBeAtLeastGray);
-		}
-
-        // proceed up the tree element hierarchy
-        Object parent = treeContentProvider.getParent(treeElement);
-        if (parent != null) {
-            updateHierarchy(parent);
-        }
-    }
-
-    /**
-     * Update the selections of the tree elements in items to reflect the new
-     * selections provided.
-     * @param items Map with keys of Object (the tree element) and values of List (the selected
-     * list elements).
-     */
-    public void updateSelections(final Map items) {
-
-        //Potentially long operation - show a busy cursor
-        BusyIndicator.showWhile(treeViewer.getControl().getDisplay(),
-                new Runnable() {
-                    public void run() {
-                        Iterator keyIterator = items.keySet().iterator();
-
-                        //Update the store before the hierarchy to prevent updating parents before all of the children are done
-                        while (keyIterator.hasNext()) {
-                            Object key = keyIterator.next();
-                            //Replace the items in the checked state store with those from the supplied items
-                            List selections = (List) items.get(key);
-                            if (selections.size() == 0) {
-								//If it is empty remove it from the list
-                                checkedStateStore.remove(key);
-							} else {
-                                checkedStateStore.put(key, selections);
-                                // proceed up the tree element hierarchy
-                                Object parent = treeContentProvider
-                                        .getParent(key);
-                                if (parent != null) {
-                                    addToHierarchyToCheckedStore(parent);
-                                }
-                            }
-                        }
-
-                        //Now update hierarchies
-                        keyIterator = items.keySet().iterator();
-
-                        while (keyIterator.hasNext()) {
-                            Object key = keyIterator.next();
-                            updateHierarchy(key);
-                            if (currentTreeSelection != null
-                                    && currentTreeSelection.equals(key)) {
-                                listViewer.setAllChecked(false);
-                                listViewer.setCheckedElements(((List) items
-                                        .get(key)).toArray());
-                            }
-                        }
-                    }
-                });
-
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/ContainerContentProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/ContainerContentProvider.java
deleted file mode 100644
index b0da9b1..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/ContainerContentProvider.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.misc;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Provides content for a tree viewer that shows only containers.
- */
-public class ContainerContentProvider implements ITreeContentProvider {
-    private boolean showClosedProjects = true;
-
-    /**
-     * Creates a new ContainerContentProvider.
-     */
-    public ContainerContentProvider() {
-    }
-
-    /**
-     * The visual part that is using this content provider is about
-     * to be disposed. Deallocate all allocated SWT resources.
-     */
-    public void dispose() {
-    }
-
-    /*
-     * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-     */
-    public Object[] getChildren(Object element) {
-        if (element instanceof IWorkspace) {
-            // check if closed projects should be shown
-            IProject[] allProjects = ((IWorkspace) element).getRoot()
-                    .getProjects();
-            if (showClosedProjects) {
-				return allProjects;
-			}
-
-            ArrayList accessibleProjects = new ArrayList();
-            for (int i = 0; i < allProjects.length; i++) {
-                if (allProjects[i].isOpen()) {
-                    accessibleProjects.add(allProjects[i]);
-                }
-            }
-            return accessibleProjects.toArray();
-        } else if (element instanceof IContainer) {
-            IContainer container = (IContainer) element;
-            if (container.isAccessible()) {
-                try {
-                    List children = new ArrayList();
-                    IResource[] members = container.members();
-                    for (int i = 0; i < members.length; i++) {
-                        if (members[i].getType() != IResource.FILE) {
-                            children.add(members[i]);
-                        }
-                    }
-                    return children.toArray();
-                } catch (CoreException e) {
-                    // this should never happen because we call #isAccessible before invoking #members
-                }
-            }
-        }
-        return new Object[0];
-    }
-
-    /*
-     * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-     */
-    public Object[] getElements(Object element) {
-        return getChildren(element);
-    }
-
-    /*
-     * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-     */
-    public Object getParent(Object element) {
-        if (element instanceof IResource) {
-			return ((IResource) element).getParent();
-		}
-        return null;
-    }
-
-    /*
-     * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-     */
-    public boolean hasChildren(Object element) {
-        return getChildren(element).length > 0;
-    }
-
-    /*
-     * @see org.eclipse.jface.viewers.IContentProvider#inputChanged
-     */
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-    }
-
-    /**
-     * Specify whether or not to show closed projects in the tree 
-     * viewer.  Default is to show closed projects.
-     * 
-     * @param show boolean if false, do not show closed projects in the tree
-     */
-    public void showClosedProjects(boolean show) {
-        showClosedProjects = show;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/ContainerSelectionGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/ContainerSelectionGroup.java
deleted file mode 100644
index fe3fff1..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/ContainerSelectionGroup.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Igor Fedorenko <igorfie@yahoo.com> - 
- *     		Fix for Bug 136921 [IDE] New File dialog locks for 20 seconds
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.misc;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.osgi.util.TextProcessor;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.part.DrillDownComposite;
-
-/**
- * Workbench-level composite for choosing a container.
- */
-public class ContainerSelectionGroup extends Composite {
-	// The listener to notify of events
-	private Listener listener;
-
-	// Enable user to type in new container name
-	private boolean allowNewContainerName = true;
-
-	// show all projects by default
-	private boolean showClosedProjects = true;
-
-	// Last selection made by user
-	private IContainer selectedContainer;
-
-	// handle on parts
-	private Text containerNameField;
-
-	TreeViewer treeViewer;
-
-	// the message to display at the top of this dialog
-	private static final String DEFAULT_MSG_NEW_ALLOWED = IDEWorkbenchMessages.ContainerGroup_message;
-
-	private static final String DEFAULT_MSG_SELECT_ONLY = IDEWorkbenchMessages.ContainerGroup_selectFolder;
-
-	// sizing constants
-	private static final int SIZING_SELECTION_PANE_WIDTH = 320;
-
-	private static final int SIZING_SELECTION_PANE_HEIGHT = 300;
-
-	/**
-	 * Creates a new instance of the widget.
-	 * 
-	 * @param parent
-	 *            The parent widget of the group.
-	 * @param listener
-	 *            A listener to forward events to. Can be null if no listener is
-	 *            required.
-	 * @param allowNewContainerName
-	 *            Enable the user to type in a new container name instead of
-	 *            just selecting from the existing ones.
-	 */
-	public ContainerSelectionGroup(Composite parent, Listener listener,
-			boolean allowNewContainerName) {
-		this(parent, listener, allowNewContainerName, null);
-	}
-
-	/**
-	 * Creates a new instance of the widget.
-	 * 
-	 * @param parent
-	 *            The parent widget of the group.
-	 * @param listener
-	 *            A listener to forward events to. Can be null if no listener is
-	 *            required.
-	 * @param allowNewContainerName
-	 *            Enable the user to type in a new container name instead of
-	 *            just selecting from the existing ones.
-	 * @param message
-	 *            The text to present to the user.
-	 */
-	public ContainerSelectionGroup(Composite parent, Listener listener,
-			boolean allowNewContainerName, String message) {
-		this(parent, listener, allowNewContainerName, message, true);
-	}
-
-	/**
-	 * Creates a new instance of the widget.
-	 * 
-	 * @param parent
-	 *            The parent widget of the group.
-	 * @param listener
-	 *            A listener to forward events to. Can be null if no listener is
-	 *            required.
-	 * @param allowNewContainerName
-	 *            Enable the user to type in a new container name instead of
-	 *            just selecting from the existing ones.
-	 * @param message
-	 *            The text to present to the user.
-	 * @param showClosedProjects
-	 *            Whether or not to show closed projects.
-	 */
-	public ContainerSelectionGroup(Composite parent, Listener listener,
-			boolean allowNewContainerName, String message,
-			boolean showClosedProjects) {
-		this(parent, listener, allowNewContainerName, message,
-				showClosedProjects, SIZING_SELECTION_PANE_HEIGHT,
-				SIZING_SELECTION_PANE_WIDTH);
-	}
-
-	/**
-	 * Creates a new instance of the widget.
-	 * 
-	 * @param parent
-	 *            The parent widget of the group.
-	 * @param listener
-	 *            A listener to forward events to. Can be null if no listener is
-	 *            required.
-	 * @param allowNewContainerName
-	 *            Enable the user to type in a new container name instead of
-	 *            just selecting from the existing ones.
-	 * @param message
-	 *            The text to present to the user.
-	 * @param showClosedProjects
-	 *            Whether or not to show closed projects.
-	 * @param heightHint
-	 *            height hint for the drill down composite
-	 * @param widthHint
-	 *            width hint for the drill down composite
-	 */
-	public ContainerSelectionGroup(Composite parent, Listener listener,
-			boolean allowNewContainerName, String message,
-			boolean showClosedProjects, int heightHint, int widthHint) {
-		super(parent, SWT.NONE);
-		this.listener = listener;
-		this.allowNewContainerName = allowNewContainerName;
-		this.showClosedProjects = showClosedProjects;
-		if (message != null) {
-			createContents(message, heightHint, widthHint);
-		} else if (allowNewContainerName) {
-			createContents(DEFAULT_MSG_NEW_ALLOWED, heightHint, widthHint);
-		} else {
-			createContents(DEFAULT_MSG_SELECT_ONLY, heightHint, widthHint);
-		}
-	}
-
-	/**
-	 * The container selection has changed in the tree view. Update the
-	 * container name field value and notify all listeners.
-	 * 
-	 * @param container
-	 *            The container that changed
-	 */
-	public void containerSelectionChanged(IContainer container) {
-		selectedContainer = container;
-
-		if (allowNewContainerName) {
-			if (container == null) {
-				containerNameField.setText("");//$NON-NLS-1$
-			} else {
-				String text = TextProcessor.process(container.getFullPath()
-						.makeRelative().toString());
-				containerNameField.setText(text);
-				containerNameField.setToolTipText(text);
-			}
-		}
-
-		// fire an event so the parent can update its controls
-		if (listener != null) {
-			Event changeEvent = new Event();
-			changeEvent.type = SWT.Selection;
-			changeEvent.widget = this;
-			listener.handleEvent(changeEvent);
-		}
-	}
-
-	/**
-	 * Creates the contents of the composite.
-	 * 
-	 * @param message
-	 */
-	public void createContents(String message) {
-		createContents(message, SIZING_SELECTION_PANE_HEIGHT,
-				SIZING_SELECTION_PANE_WIDTH);
-	}
-
-	/**
-	 * Creates the contents of the composite.
-	 * 
-	 * @param message
-	 * @param heightHint
-	 * @param widthHint
-	 */
-	public void createContents(String message, int heightHint, int widthHint) {
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		setLayout(layout);
-		setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
-		Label label = new Label(this, SWT.WRAP);
-		label.setText(message);
-		label.setFont(this.getFont());
-
-		if (allowNewContainerName) {
-			containerNameField = new Text(this, SWT.SINGLE | SWT.BORDER);
-			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-			gd.widthHint = widthHint;
-			containerNameField.setLayoutData(gd);
-			containerNameField.addListener(SWT.Modify, listener);
-			containerNameField.setFont(this.getFont());
-		} else {
-			// filler...
-			new Label(this, SWT.NONE);
-		}
-
-		createTreeViewer(heightHint);
-		Dialog.applyDialogFont(this);
-	}
-
-	/**
-	 * Returns a new drill down viewer for this dialog.
-	 * 
-	 * @param heightHint
-	 *            height hint for the drill down composite
-	 */
-	protected void createTreeViewer(int heightHint) {
-		// Create drill down.
-		DrillDownComposite drillDown = new DrillDownComposite(this, SWT.BORDER);
-		GridData spec = new GridData(SWT.FILL, SWT.FILL, true, true);
-		spec.widthHint = SIZING_SELECTION_PANE_WIDTH;
-		spec.heightHint = heightHint;
-		drillDown.setLayoutData(spec);
-
-		// Create tree viewer inside drill down.
-		treeViewer = new TreeViewer(drillDown, SWT.NONE);
-		drillDown.setChildTree(treeViewer);
-		ContainerContentProvider cp = new ContainerContentProvider();
-		cp.showClosedProjects(showClosedProjects);
-		treeViewer.setContentProvider(cp);
-		treeViewer.setLabelProvider(WorkbenchLabelProvider
-				.getDecoratingWorkbenchLabelProvider());
-		treeViewer.setComparator(new ViewerComparator());
-		treeViewer.setUseHashlookup(true);
-		treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				IStructuredSelection selection = (IStructuredSelection) event
-						.getSelection();
-				containerSelectionChanged((IContainer) selection
-						.getFirstElement()); // allow null
-			}
-		});
-		treeViewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				ISelection selection = event.getSelection();
-				if (selection instanceof IStructuredSelection) {
-					Object item = ((IStructuredSelection) selection)
-							.getFirstElement();
-					if (item == null) {
-						return;
-					}
-					if (treeViewer.getExpandedState(item)) {
-						treeViewer.collapseToLevel(item, 1);
-					} else {
-						treeViewer.expandToLevel(item, 1);
-					}
-				}
-			}
-		});
-
-		// This has to be done after the viewer has been laid out
-		treeViewer.setInput(ResourcesPlugin.getWorkspace());
-	}
-
-	/**
-	 * Returns the currently entered container name. Null if the field is empty.
-	 * Note that the container may not exist yet if the user entered a new
-	 * container name in the field.
-	 * 
-	 * @return IPath
-	 */
-	public IPath getContainerFullPath() {
-		if (allowNewContainerName) {
-			String pathName = containerNameField.getText();
-			if (pathName == null || pathName.length() < 1) {
-				return null;
-			}
-			// The user may not have made this absolute so do it for them
-			return (new Path(TextProcessor.deprocess(pathName))).makeAbsolute();
-
-		}
-		if (selectedContainer == null)
-			return null;
-		return selectedContainer.getFullPath();
-
-	}
-
-	/**
-	 * Gives focus to one of the widgets in the group, as determined by the
-	 * group.
-	 */
-	public void setInitialFocus() {
-		if (allowNewContainerName) {
-			containerNameField.setFocus();
-		} else {
-			treeViewer.getTree().setFocus();
-		}
-	}
-
-	/**
-	 * Sets the selected existing container.
-	 * 
-	 * @param container
-	 */
-	public void setSelectedContainer(IContainer container) {
-		selectedContainer = container;
-
-		// expand to and select the specified container
-		List itemsToExpand = new ArrayList();
-		IContainer parent = container.getParent();
-		while (parent != null) {
-			itemsToExpand.add(0, parent);
-			parent = parent.getParent();
-		}
-		treeViewer.setExpandedElements(itemsToExpand.toArray());
-		treeViewer.setSelection(new StructuredSelection(container), true);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/DisjointSet.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/DisjointSet.java
deleted file mode 100644
index dbc6016..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/DisjointSet.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.ui.internal.ide.misc;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * A disjoint set is a generic data structure that represents a collection of 
- * sets that are assumed to be disjoint (no object exists in more than
- * one set).
- * <p>
- * This disjoint set implementation represents the disjoint set as a forest,
- * where the nodes of each tree all belong to the same set. This implementation
- * uses path compression in the findSet implementation to flatten each tree
- * to a constant depth.  A rank is maintained for each tree that is used when
- * performing union operations to ensure the tree remains balanced.
- * <p>
- * Ref: Cormen, Leiserson, and Rivest <it>Introduction to Algorithms</it>,
- * McGraw-Hill, 1990. The disjoint set forest implementation in section 22.3.
- * </p>
- * @since 3.2
- */
-public class DisjointSet {
-	/**
-	 * A node in the disjoint set forest.  Each tree in the forest is
-	 * a disjoint set, where the root of the tree is the set representative.
-	 */
-	private static class Node {
-		/** The node rank used for union by rank optimization */
-		int rank;
-		/** The parent of this node in the tree. */
-		Object parent;
-
-		Node(Object parent, int rank) {
-			this.parent = parent;
-			this.rank = rank;
-		}
-	}
-
-	/**
-	 * Map of Object -> Node, where each key is an object in the
-	 * disjoint set, and the Node represents its position and rank
-	 * within the set.
-	 */
-	private final HashMap objectsToNodes = new HashMap();
-
-	/**
-	 * Returns the set token for the given object, or null if the
-	 * object does not belong to any set.  All object
-	 * in the same set have an identical set token.
-	 * @param o The object to return the set token for
-	 * @return The set token, or <code>null</code>
-	 */
-	public Object findSet(Object o) {
-		DisjointSet.Node node = (DisjointSet.Node) objectsToNodes.get(o);
-		if (node == null)
-			return null;
-		if (o != node.parent)
-			node.parent = findSet(node.parent);
-		return node.parent;
-	}
-
-	/**
-	 * Adds a new set to the group of disjoint sets for the given object.
-	 * It is assumed that the object does not yet belong to any set.
-	 * @param o The object to add to the set
-	 */
-	public void makeSet(Object o) {
-		objectsToNodes.put(o, new Node(o, 0));
-	}
-
-	/**
-	 * Removes all elements belonging to the set of the given object.
-	 * @param o The object to remove
-	 */
-	public void removeSet(Object o) {
-		Object set = findSet(o);
-		if (set == null)
-			return;
-		for (Iterator it = objectsToNodes.keySet().iterator(); it.hasNext();) {
-			Object next = it.next();
-			//remove the set representative last, otherwise findSet will fail
-			if (next != set && findSet(next) == set)
-				it.remove();
-		}
-		objectsToNodes.remove(set);
-	}
-
-	/**
-	 * Copies all objects in the disjoint set to the provided list
-	 * @param list The list to copy objects into
-	 */
-	public void toList(List list) {
-		list.addAll(objectsToNodes.keySet());
-	}
-
-	/**
-	 * Unions the set represented by token x with the set represented by 
-	 * token y. Has no effect if either x or y is not in the disjoint set, or
-	 * if they already belong to the same set.
-	 * @param x The first set to union
-	 * @param y The second set to union
-	 */
-	public void union(Object x, Object y) {
-		Object setX = findSet(x);
-		Object setY = findSet(y);
-		if (setX == null || setY == null || setX == setY)
-			return;
-		DisjointSet.Node nodeX = (DisjointSet.Node) objectsToNodes.get(setX);
-		DisjointSet.Node nodeY = (DisjointSet.Node) objectsToNodes.get(setY);
-		//join the two sets by pointing the root of one at the root of the other
-		if (nodeX.rank > nodeY.rank) {
-			nodeY.parent = x;
-		} else {
-			nodeX.parent = y;
-			if (nodeX.rank == nodeY.rank)
-				nodeY.rank++;
-		}
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/OverlayIcon.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/OverlayIcon.java
deleted file mode 100644
index dfa1222..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/OverlayIcon.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.misc;
-
-import org.eclipse.jface.resource.CompositeImageDescriptor;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-
-/**
- * An OverlayIcon consists of a main icon and several adornments.
- */
-public class OverlayIcon extends CompositeImageDescriptor {
-
-    static final int DEFAULT_WIDTH = 22;
-
-    static final int DEFAULT_HEIGHT = 16;
-
-    private Point fSize = null;
-
-    private ImageDescriptor fBase;
-
-    private ImageDescriptor fOverlays[][];
-
-    public OverlayIcon(ImageDescriptor base, ImageDescriptor[][] overlays,
-            Point size) {
-        fBase = base;
-        fOverlays = overlays;
-        fSize = size;
-    }
-
-    protected void drawBottomLeft(ImageDescriptor[] overlays) {
-        if (overlays == null) {
-			return;
-		}
-        int length = overlays.length;
-        int x = 0;
-        for (int i = 0; i < 3; i++) {
-            if (i < length && overlays[i] != null) {
-                ImageData id = overlays[i].getImageData();
-                drawImage(id, x, getSize().y - id.height);
-                x += id.width;
-            }
-        }
-    }
-
-    protected void drawBottomRight(ImageDescriptor[] overlays) {
-        if (overlays == null) {
-			return;
-		}
-        int length = overlays.length;
-        int x = getSize().x;
-        for (int i = 2; i >= 0; i--) {
-            if (i < length && overlays[i] != null) {
-                ImageData id = overlays[i].getImageData();
-                x -= id.width;
-                drawImage(id, x, getSize().y - id.height);
-            }
-        }
-    }
-
-    /**
-     * @see CompositeImageDescriptor#drawCompositeImage(int, int)
-     */
-    protected void drawCompositeImage(int width, int height) {
-        ImageData bg;
-        if (fBase == null || (bg = fBase.getImageData()) == null) {
-			bg = DEFAULT_IMAGE_DATA;
-		}
-        drawImage(bg, 0, 0);
-
-        if (fOverlays != null) {
-            if (fOverlays.length > 0) {
-				drawTopRight(fOverlays[0]);
-			}
-
-            if (fOverlays.length > 1) {
-				drawBottomRight(fOverlays[1]);
-			}
-
-            if (fOverlays.length > 2) {
-				drawBottomLeft(fOverlays[2]);
-			}
-
-            if (fOverlays.length > 3) {
-				drawTopLeft(fOverlays[3]);
-			}
-        }
-    }
-
-    protected void drawTopLeft(ImageDescriptor[] overlays) {
-        if (overlays == null) {
-			return;
-		}
-        int length = overlays.length;
-        int x = 0;
-        for (int i = 0; i < 3; i++) {
-            if (i < length && overlays[i] != null) {
-                ImageData id = overlays[i].getImageData();
-                drawImage(id, x, 0);
-                x += id.width;
-            }
-        }
-    }
-
-    protected void drawTopRight(ImageDescriptor[] overlays) {
-        if (overlays == null) {
-			return;
-		}
-        int length = overlays.length;
-        int x = getSize().x;
-        for (int i = 2; i >= 0; i--) {
-            if (i < length && overlays[i] != null) {
-                ImageData id = overlays[i].getImageData();
-                x -= id.width;
-                drawImage(id, x, 0);
-            }
-        }
-    }
-
-    /**
-     * @see CompositeImageDescriptor#getSize()
-     */
-    protected Point getSize() {
-        return fSize;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/ResourceAndContainerGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/ResourceAndContainerGroup.java
deleted file mode 100644
index f38753f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/misc/ResourceAndContainerGroup.java
+++ /dev/null
@@ -1,572 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *      Alexander Fedorov <Alexander.Fedorov@borland.com>
- *     		- Bug 172000 [Wizards] WizardNewFileCreationPage should support overwriting existing resources
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.misc;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-
-/**
- * Workbench-level composite for resource and container specification by the
- * user. Services such as field validation are performed by the group. The group
- * can be configured to accept existing resources, or only new resources.
- */
-public class ResourceAndContainerGroup implements Listener {
-	// problem identifiers
-	
-	/**
-	 * Constant for no problem.
-	 */
-	public static final int PROBLEM_NONE = 0;
-	/**
-	 * Constant for empty resource.
-	 */
-	public static final int PROBLEM_RESOURCE_EMPTY = 1;
-
-	/**
-	 * Constant for resource already exists.
-	 */
-	public static final int PROBLEM_RESOURCE_EXIST = 2;
-
-	/**
-	 * Constant for invalid path.
-	 */
-	public static final int PROBLEM_PATH_INVALID = 4;
-
-	/**
-	 * Constant for empty container.
-	 */
-	public static final int PROBLEM_CONTAINER_EMPTY = 5;
-
-	/**
-	 * Constant for project does not exist.
-	 */
-	public static final int PROBLEM_PROJECT_DOES_NOT_EXIST = 6;
-
-	/**
-	 * Constant for invalid name.
-	 */
-	public static final int PROBLEM_NAME_INVALID = 7;
-
-	
-	/**
-	 * Constant for path already occupied.
-	 */
-	public static final int PROBLEM_PATH_OCCUPIED = 8;
-
-	// the client to notify of changes
-	private Listener client;
-
-	// whether to allow existing resources
-	private boolean allowExistingResources = false;
-
-	// resource type (file, folder, project)
-	private String resourceType = IDEWorkbenchMessages.ResourceGroup_resource;
-
-	// show closed projects in the tree, by default
-	private boolean showClosedProjects = true;
-
-	// problem indicator
-	private String problemMessage = "";//$NON-NLS-1$
-
-	private int problemType = PROBLEM_NONE;
-
-	// widgets
-	private ContainerSelectionGroup containerGroup;
-
-	private Text resourceNameField;
-
-	/**
-	 * The resource extension for the resource name field.
-	 * 
-	 * @see ResourceAndContainerGroup#setResourceExtension(String)
-	 * @since 3.3
-	 */
-	private String resourceExtension;
-
-	// constants
-	private static final int SIZING_TEXT_FIELD_WIDTH = 250;
-
-	/**
-	 * Create an instance of the group to allow the user to enter/select a
-	 * container and specify a resource name.
-	 * 
-	 * @param parent
-	 *            composite widget to parent the group
-	 * @param client
-	 *            object interested in changes to the group's fields value
-	 * @param resourceFieldLabel
-	 *            label to use in front of the resource name field
-	 * @param resourceType
-	 *            one word, in lowercase, to describe the resource to the user
-	 *            (file, folder, project)
-	 */
-	public ResourceAndContainerGroup(Composite parent, Listener client,
-			String resourceFieldLabel, String resourceType) {
-		this(parent, client, resourceFieldLabel, resourceType, true);
-	}
-
-	/**
-	 * Create an instance of the group to allow the user to enter/select a
-	 * container and specify a resource name.
-	 * 
-	 * @param parent
-	 *            composite widget to parent the group
-	 * @param client
-	 *            object interested in changes to the group's fields value
-	 * @param resourceFieldLabel
-	 *            label to use in front of the resource name field
-	 * @param resourceType
-	 *            one word, in lowercase, to describe the resource to the user
-	 *            (file, folder, project)
-	 * @param showClosedProjects
-	 *            whether or not to show closed projects
-	 */
-	public ResourceAndContainerGroup(Composite parent, Listener client,
-			String resourceFieldLabel, String resourceType,
-			boolean showClosedProjects) {
-		this(parent, client, resourceFieldLabel, resourceType,
-				showClosedProjects, SWT.DEFAULT);
-	}
-
-	/**
-	 * Create an instance of the group to allow the user to enter/select a
-	 * container and specify a resource name.
-	 * 
-	 * @param parent
-	 *            composite widget to parent the group
-	 * @param client
-	 *            object interested in changes to the group's fields value
-	 * @param resourceFieldLabel
-	 *            label to use in front of the resource name field
-	 * @param resourceType
-	 *            one word, in lowercase, to describe the resource to the user
-	 *            (file, folder, project)
-	 * @param showClosedProjects
-	 *            whether or not to show closed projects
-	 * @param heightHint
-	 *            height hint for the container selection widget group
-	 */
-	public ResourceAndContainerGroup(Composite parent, Listener client,
-			String resourceFieldLabel, String resourceType,
-			boolean showClosedProjects, int heightHint) {
-		super();
-		this.resourceType = resourceType;
-		this.showClosedProjects = showClosedProjects;
-		createContents(parent, resourceFieldLabel, heightHint);
-		this.client = client;
-	}
-
-	/**
-	 * Returns a boolean indicating whether all controls in this group contain
-	 * valid values.
-	 * 
-	 * @return boolean
-	 */
-	public boolean areAllValuesValid() {
-		return problemType == PROBLEM_NONE;
-	}
-
-	/**
-	 * Creates this object's visual components.
-	 * 
-	 * @param parent
-	 *            org.eclipse.swt.widgets.Composite
-	 * @param heightHint
-	 *            height hint for the container selection widget group
-	 */
-	protected void createContents(Composite parent, String resourceLabelString,
-			int heightHint) {
-
-		Font font = parent.getFont();
-		// server name group
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		composite.setLayout(layout);
-		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		composite.setFont(font);
-
-		// container group
-		if (heightHint == SWT.DEFAULT) {
-			containerGroup = new ContainerSelectionGroup(composite, this, true,
-					null, showClosedProjects);
-		} else {
-			containerGroup = new ContainerSelectionGroup(composite, this, true,
-					null, showClosedProjects, heightHint,
-					SIZING_TEXT_FIELD_WIDTH);
-		}
-
-		// resource name group
-		Composite nameGroup = new Composite(composite, SWT.NONE);
-		layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = 0;
-		nameGroup.setLayout(layout);
-		nameGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.GRAB_HORIZONTAL));
-		nameGroup.setFont(font);
-
-		Label label = new Label(nameGroup, SWT.NONE);
-		label.setText(resourceLabelString);
-		label.setFont(font);
-
-		// resource name entry field
-		resourceNameField = new Text(nameGroup, SWT.BORDER);
-		resourceNameField.addListener(SWT.Modify, this);
-		resourceNameField.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				handleResourceNameFocusLostEvent();
-			}
-		});
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.GRAB_HORIZONTAL);
-		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-		resourceNameField.setLayoutData(data);
-		resourceNameField.setFont(font);
-		validateControls();
-	}
-
-	/**
-	 * Returns the path of the currently selected container or null if no
-	 * container has been selected. Note that the container may not exist yet if
-	 * the user entered a new container name in the field.
-	 * 
-	 * @return The path of the container, or <code>null</code>
-	 */
-	public IPath getContainerFullPath() {
-		return containerGroup.getContainerFullPath();
-	}
-
-	/**
-	 * Returns an error message indicating the current problem with the value of
-	 * a control in the group, or an empty message if all controls in the group
-	 * contain valid values.
-	 * 
-	 * @return java.lang.String
-	 */
-	public String getProblemMessage() {
-		return problemMessage;
-	}
-
-	/**
-	 * Returns the type of problem with the value of a control in the group.
-	 * 
-	 * @return one of the PROBLEM_* constants
-	 */
-	public int getProblemType() {
-		return problemType;
-	}
-
-	/**
-	 * Returns a string that is the name of the chosen resource, or an empty
-	 * string if no resource has been entered. <br>
-	 * <br>
-	 * The name will include the resource extension if the preconditions are
-	 * met.
-	 * 
-	 * @see ResourceAndContainerGroup#setResourceExtension(String)
-	 * 
-	 * @return The resource name
-	 * @since 3.3
-	 */
-	public String getResource() {
-		String resource = resourceNameField.getText();
-		if (useResourceExtension()) {
-			return resource + '.' + resourceExtension;
-		}
-		return resource;
-	}
-
-	/**
-	 * Returns the resource extension.
-	 * 
-	 * @return The resource extension or <code>null</code>.
-	 * @see ResourceAndContainerGroup#setResourceExtension(String)
-	 * @since 3.3
-	 */
-	public String getResourceExtension() {
-		return resourceExtension;
-	}
-
-	/**
-	 * Determines whether the resource extension should be added to the resource
-	 * name field. <br>
-	 * <br>
-	 * 
-	 * @see ResourceAndContainerGroup#setResourceExtension(String)
-	 * @return <code>true</code> if the preconditions are met; otherwise,
-	 *         <code>false</code>.
-	 * @since 3.3
-	 */
-	private boolean useResourceExtension() {
-		String resource = resourceNameField.getText();
-		if ((resourceExtension != null) && (resourceExtension.length() > 0)
-				&& (resource.length() > 0)
-				&& (resource.endsWith('.' + resourceExtension) == false)) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Handle the focus lost event from the resource name field. <br>
-	 * Adds the resource extension to the resource name field when it loses
-	 * focus (if the preconditions are met).
-	 * 
-	 * @see ResourceAndContainerGroup#setResourceExtension(String)
-	 * @since 3.3
-	 */
-	private void handleResourceNameFocusLostEvent() {
-		if (useResourceExtension()) {
-			setResource(resourceNameField.getText() + '.' + resourceExtension);
-		}
-	}
-
-	/**
-	 * Handles events for all controls in the group.
-	 * 
-	 * @param e
-	 *            org.eclipse.swt.widgets.Event
-	 */
-	public void handleEvent(Event e) {
-		validateControls();
-		if (client != null) {
-			client.handleEvent(e);
-		}
-	}
-
-	/**
-	 * Sets the flag indicating whether existing resources are permitted.
-	 * @param value
-	 */
-	public void setAllowExistingResources(boolean value) {
-		allowExistingResources = value;
-	}
-
-	/**
-	 * Sets the value of this page's container.
-	 * 
-	 * @param path
-	 *            Full path to the container.
-	 */
-	public void setContainerFullPath(IPath path) {
-		IResource initial = ResourcesPlugin.getWorkspace().getRoot()
-				.findMember(path);
-		if (initial != null) {
-			if (!(initial instanceof IContainer)) {
-				initial = initial.getParent();
-			}
-			containerGroup.setSelectedContainer((IContainer) initial);
-		}
-		validateControls();
-	}
-
-	/**
-	 * Gives focus to the resource name field and selects its contents
-	 */
-	public void setFocus() {
-		// select the whole resource name.
-		resourceNameField.setSelection(0, resourceNameField.getText().length());
-		resourceNameField.setFocus();
-	}
-
-	/**
-	 * Sets the value of this page's resource name.
-	 * 
-	 * @param value
-	 *            new value
-	 */
-	public void setResource(String value) {
-		resourceNameField.setText(value);
-		validateControls();
-	}
-
-	/**
-	 * Set the only file extension allowed for the resource name field. <br>
-	 * <br>
-	 * If a resource extension is specified, then it will always be appended
-	 * with a '.' to the text from the resource name field for validation when
-	 * the following conditions are met: <br>
-	 * <br>
-	 * (1) Resource extension length is greater than 0 <br>
-	 * (2) Resource name field text length is greater than 0 <br>
-	 * (3) Resource name field text does not already end with a '.' and the
-	 * resource extension specified (case sensitive) <br>
-	 * <br>
-	 * The resource extension will not be reflected in the actual resource name
-	 * field until the resource name field loses focus.
-	 * 
-	 * @param value
-	 *            The resource extension without the '.' prefix (e.g. 'java',
-	 *            'xml')
-	 * @since 3.3
-	 */
-	public void setResourceExtension(String value) {
-		resourceExtension = value;
-		validateControls();
-	}
-
-	/**
-	 * Returns a <code>boolean</code> indicating whether a container name
-	 * represents a valid container resource in the workbench. An error message
-	 * is stored for future reference if the name does not represent a valid
-	 * container.
-	 * 
-	 * @return <code>boolean</code> indicating validity of the container name
-	 */
-	protected boolean validateContainer() {
-		IPath path = containerGroup.getContainerFullPath();
-		if (path == null) {
-			problemType = PROBLEM_CONTAINER_EMPTY;
-			problemMessage = IDEWorkbenchMessages.ResourceGroup_folderEmpty;
-			return false;
-		}
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		String projectName = path.segment(0);
-		if (projectName == null
-				|| !workspace.getRoot().getProject(projectName).exists()) {
-			problemType = PROBLEM_PROJECT_DOES_NOT_EXIST;
-			problemMessage = IDEWorkbenchMessages.ResourceGroup_noProject;
-			return false;
-		}
-		// path is invalid if any prefix is occupied by a file
-		IWorkspaceRoot root = workspace.getRoot();
-		while (path.segmentCount() > 1) {
-			if (root.getFile(path).exists()) {
-				problemType = PROBLEM_PATH_OCCUPIED;
-				problemMessage = NLS.bind(
-						IDEWorkbenchMessages.ResourceGroup_pathOccupied, path
-								.makeRelative());
-				return false;
-			}
-			path = path.removeLastSegments(1);
-		}
-		return true;
-	}
-
-	/**
-	 * Validates the values for each of the group's controls. If an invalid
-	 * value is found then a descriptive error message is stored for later
-	 * reference. Returns a boolean indicating the validity of all of the
-	 * controls in the group.
-	 */
-	protected boolean validateControls() {
-		// don't attempt to validate controls until they have been created
-		if (containerGroup == null) {
-			return false;
-		}
-		problemType = PROBLEM_NONE;
-		problemMessage = "";//$NON-NLS-1$
-
-		if (!validateContainer() || !validateResourceName()) {
-			return false;
-		}
-
-		IPath path = containerGroup.getContainerFullPath()
-				.append(getResource());
-		return validateFullResourcePath(path);
-	}
-
-	/**
-	 * Returns a <code>boolean</code> indicating whether the specified
-	 * resource path represents a valid new resource in the workbench. An error
-	 * message is stored for future reference if the path does not represent a
-	 * valid new resource path.
-	 * 
-	 * @param resourcePath
-	 *            the path to validate
-	 * @return <code>boolean</code> indicating validity of the resource path
-	 */
-	protected boolean validateFullResourcePath(IPath resourcePath) {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-		IStatus result = workspace.validatePath(resourcePath.toString(),
-				IResource.FOLDER);
-		if (!result.isOK()) {
-			problemType = PROBLEM_PATH_INVALID;
-			problemMessage = result.getMessage();
-			return false;
-		}
-
-		if (!allowExistingResources
-				&& (workspace.getRoot().getFolder(resourcePath).exists() || workspace
-						.getRoot().getFile(resourcePath).exists())) {
-			problemType = PROBLEM_RESOURCE_EXIST;
-			problemMessage = NLS.bind(
-					IDEWorkbenchMessages.ResourceGroup_nameExists,
-					getResource());
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * Returns a <code>boolean</code> indicating whether the resource name
-	 * rep- resents a valid resource name in the workbench. An error message is
-	 * stored for future reference if the name does not represent a valid
-	 * resource name.
-	 * 
-	 * @return <code>boolean</code> indicating validity of the resource name
-	 */
-	protected boolean validateResourceName() {
-		String resourceName = getResource();
-
-		if (resourceName.length() == 0) {
-			problemType = PROBLEM_RESOURCE_EMPTY;
-			problemMessage = NLS.bind(
-					IDEWorkbenchMessages.ResourceGroup_emptyName, resourceType);
-			return false;
-		}
-
-		if (!Path.ROOT.isValidPath(resourceName)) {
-			problemType = PROBLEM_NAME_INVALID;
-			problemMessage = NLS.bind(
-					IDEWorkbenchMessages.ResourceGroup_invalidFilename,
-					resourceName);
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * Returns the flag indicating whether existing resources are permitted.
-	 * 
-	 * @return The allow existing resources flag.
-	 * @see ResourceAndContainerGroup#setAllowExistingResources(boolean)
-	 * @since 3.4
-	 */
-	public boolean getAllowExistingResources() {
-		return allowExistingResources;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/FileInputAdapterFactory.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/FileInputAdapterFactory.java
deleted file mode 100644
index 7a7ab96..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/FileInputAdapterFactory.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.model;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-
-import org.eclipse.ui.IFileEditorInput;
-
-/**
- * FileInputAdapterFactory is the adapter factory for the
- * IFileEditorInput.
- * @since 3.2
- *
- */
-
-public class FileInputAdapterFactory implements IAdapterFactory {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object,
-	 *      java.lang.Class)
-	 */
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (IFile.class.equals(adapterType))
-			return ((IFileEditorInput) adaptableObject).getFile();
-		if (IResource.class.equals(adapterType))
-			return ((IFileEditorInput) adaptableObject).getFile();
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return new Class[] { IFile.class, IResource.class };
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/ResourceFactory.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/ResourceFactory.java
deleted file mode 100644
index 85307fa..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/ResourceFactory.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.model;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.ui.IElementFactory;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPersistableElement;
-
-/**
- * The ResourceFactory is used to save and recreate an IResource object.
- * As such, it implements the IPersistableElement interface for storage
- * and the IElementFactory interface for recreation.
- *
- * @see IMemento
- * @see IPersistableElement
- * @see IElementFactory
- */
-public class ResourceFactory implements IElementFactory, IPersistableElement {
-
-    // These persistence constants are stored in XML.  Do not
-    // change them.
-    private static final String TAG_PATH = "path";//$NON-NLS-1$
-
-    private static final String TAG_TYPE = "type";//$NON-NLS-1$
-
-    private static final String FACTORY_ID = "org.eclipse.ui.internal.model.ResourceFactory";//$NON-NLS-1$
-
-    // IPersistable data.
-    private IResource res;
-
-    /**
-     * Create a ResourceFactory.  This constructor is typically used
-     * for our IElementFactory side.
-     */
-    public ResourceFactory() {
-    }
-
-    /**
-     * Create a ResourceFactory.  This constructor is typically used
-     * for our IPersistableElement side.
-     * 
-     * @param input the resource of this factory 
-     */
-    public ResourceFactory(IResource input) {
-        res = input;
-    }
-
-    /**
-     * @see IElementFactory
-     */
-    public IAdaptable createElement(IMemento memento) {
-        // Get the file name.
-        String fileName = memento.getString(TAG_PATH);
-        if (fileName == null) {
-			return null;
-		}
-
-        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-        String type = memento.getString(TAG_TYPE);
-        if (type == null) {
-            // Old format memento. Create an IResource using findMember. 
-            // Will return null for resources in closed projects.
-            res = root.findMember(new Path(fileName));
-        } else {
-            int resourceType = Integer.parseInt(type);
-
-            if (resourceType == IResource.ROOT) {
-				res = root;
-			} else if (resourceType == IResource.PROJECT) {
-				res = root.getProject(fileName);
-			} else if (resourceType == IResource.FOLDER) {
-				res = root.getFolder(new Path(fileName));
-			} else if (resourceType == IResource.FILE) {
-				res = root.getFile(new Path(fileName));
-			}
-        }
-        return res;
-    }
-
-    /**
-     * @see IPersistableElement
-     */
-    public String getFactoryId() {
-        return FACTORY_ID;
-    }
-
-    /**
-     * @see IPersistableElement
-     */
-    public void saveState(IMemento memento) {
-        memento.putString(TAG_PATH, res.getFullPath().toString());
-        memento.putString(TAG_TYPE, Integer.toString(res.getType()));
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/StandardPropertiesAdapterFactory.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/StandardPropertiesAdapterFactory.java
deleted file mode 100644
index 671408f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/StandardPropertiesAdapterFactory.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.model;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.ui.views.properties.FilePropertySource;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.ResourcePropertySource;
-
-/**
- * Dispenses an <code>IPropertySource</code> adapter for the core resource objects.
- */
-/* package */class StandardPropertiesAdapterFactory implements IAdapterFactory {
-    /* (non-Javadoc)
-     * Method declared on IAdapterFactory.
-     */
-    public Object getAdapter(Object o, Class adapterType) {
-        if (adapterType.isInstance(o)) {
-            return o;
-        }
-        if (adapterType == IPropertySource.class) {
-            if (o instanceof IResource) {
-                IResource resource = (IResource) o;
-                if (resource.getType() == IResource.FILE) {
-					return new FilePropertySource((IFile) o);
-				}
-				return new ResourcePropertySource((IResource) o);
-            }
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IAdapterFactory.
-     */
-    public Class[] getAdapterList() {
-        return new Class[] { IPropertySource.class };
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchAdapterBuilder.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchAdapterBuilder.java
deleted file mode 100644
index 4515703..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchAdapterBuilder.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.model;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.core.runtime.IAdapterManager;
-import org.eclipse.core.runtime.Platform;
-
-/**
- * Registers the adapters on core constructs
- * used in the workbench UI.
- */
-public final class WorkbenchAdapterBuilder {
-    /**
-     * Creates extenders and registers 
-     */
-    public static void registerAdapters() {
-        IAdapterManager manager = Platform.getAdapterManager();
-        IAdapterFactory factory = new WorkbenchAdapterFactory();
-        manager.registerAdapters(factory, IWorkspace.class);
-        manager.registerAdapters(factory, IWorkspaceRoot.class);
-        manager.registerAdapters(factory, IProject.class);
-        manager.registerAdapters(factory, IFolder.class);
-        manager.registerAdapters(factory, IFile.class);
-        manager.registerAdapters(factory, IMarker.class);
-
-        // properties adapters
-        IAdapterFactory paFactory = new StandardPropertiesAdapterFactory();
-        manager.registerAdapters(paFactory, IWorkspace.class);
-        manager.registerAdapters(paFactory, IWorkspaceRoot.class);
-        manager.registerAdapters(paFactory, IProject.class);
-        manager.registerAdapters(paFactory, IFolder.class);
-        manager.registerAdapters(paFactory, IFile.class);
-        manager.registerAdapters(paFactory, IMarker.class);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchAdapterFactory.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchAdapterFactory.java
deleted file mode 100644
index 8dd1048..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchAdapterFactory.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.model;
-
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.ui.IActionFilter;
-import org.eclipse.ui.IElementFactory;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-/**
- * Dispenses adapters for various core objects.
- * Returns IWorkbenchAdapter adapters, used for displaying,
- * navigating, and populating menus for core objects.
- */
-class WorkbenchAdapterFactory implements IAdapterFactory {
-    private Object workspaceAdapter = new WorkbenchWorkspace();
-
-    private Object rootAdapter = new WorkbenchRootResource();
-
-    private Object projectAdapter = new WorkbenchProject();
-
-    private Object folderAdapter = new WorkbenchFolder();
-
-    private Object fileAdapter = new WorkbenchFile();
-
-    private Object markerAdapter = new WorkbenchMarker();
-
-    private Object resourceFactory = new ResourceFactory();
-
-    private Object workspaceFactory = new WorkspaceFactory();
-
-    /**
-     * Returns the IActionFilter for an object.
-     */
-    protected Object getActionFilter(Object o) {
-        if (o instanceof IResource) {
-            switch (((IResource) o).getType()) {
-            case IResource.FILE:
-                return fileAdapter;
-            case IResource.FOLDER:
-                return folderAdapter;
-            case IResource.PROJECT:
-                return projectAdapter;
-            }
-        }
-        if (o instanceof IMarker) {
-            return markerAdapter;
-        }
-        return null;
-    }
-
-    /**
-     * Returns an object which is an instance of the given class
-     * associated with the given object. Returns <code>null</code> if
-     * no such object can be found.
-     *
-     * @param o the adaptable object being queried
-     *   (usually an instance of <code>IAdaptable</code>)
-     * @param adapterType the type of adapter to look up
-     * @return a object castable to the given adapter type, 
-     *    or <code>null</code> if this adapter provider 
-     *    does not have an adapter of the given type for the
-     *    given object
-     */
-    public Object getAdapter(Object o, Class adapterType) {
-        if (adapterType.isInstance(o)) {
-            return o;
-        }
-        if (adapterType == IWorkbenchAdapter.class) {
-            return getWorkbenchElement(o);
-        }
-        if (adapterType == IPersistableElement.class) {
-            return getPersistableElement(o);
-        }
-        if (adapterType == IElementFactory.class) {
-            return getElementFactory(o);
-        }
-        if (adapterType == IActionFilter.class) {
-            return getActionFilter(o);
-        }
-        if (adapterType == IUndoContext.class) {
-        	return getUndoContext(o);
-        }
-        return null;
-    }
-
-    /**
-     * Returns the collection of adapter types handled by this
-     * provider.
-     * <p>
-     * This method is generally used by an adapter manager
-     * to discover which adapter types are supported, in advance
-     * of dispatching any actual <code>getAdapter</code> requests.
-     * </p>
-     *
-     * @return the collection of adapter types
-     */
-    public Class[] getAdapterList() {
-        return new Class[] { IWorkbenchAdapter.class, IElementFactory.class,
-                IPersistableElement.class, IActionFilter.class, IUndoContext.class };
-    }
-
-    /**
-     * Returns an object which is an instance of IElementFactory
-     * associated with the given object. Returns <code>null</code> if
-     * no such object can be found.
-     */
-    protected Object getElementFactory(Object o) {
-        if (o instanceof IResource) {
-            return resourceFactory;
-        }
-        if (o instanceof IWorkspace) {
-            return workspaceFactory;
-        }
-        return null;
-    }
-
-    /**
-     * Returns an object which is an instance of IPersistableElement
-     * associated with the given object. Returns <code>null</code> if
-     * no such object can be found.
-     */
-    protected Object getPersistableElement(Object o) {
-        if (o instanceof IResource) {
-            return new ResourceFactory((IResource) o);
-        }
-        if (o instanceof IWorkspace) {
-            return workspaceFactory;
-        }
-        return null;
-    }
-
-    /**
-     * Returns an object which is an instance of IWorkbenchAdapter
-     * associated with the given object. Returns <code>null</code> if
-     * no such object can be found.
-     */
-    protected Object getWorkbenchElement(Object o) {
-        if (o instanceof IResource) {
-            switch (((IResource) o).getType()) {
-            case IResource.FILE:
-                return fileAdapter;
-            case IResource.FOLDER:
-                return folderAdapter;
-            case IResource.PROJECT:
-                return projectAdapter;
-            }
-        }
-        if (o instanceof IWorkspaceRoot) {
-            return rootAdapter;
-        }
-        if (o instanceof IWorkspace) {
-            return workspaceAdapter;
-        }
-        if (o instanceof IMarker) {
-            return markerAdapter;
-        }
-        return null;
-    }
-    
-    /**
-     * Returns the IUndoContext for an object.
-     */
-    protected Object getUndoContext(Object o) {
-        if (o instanceof IWorkspace) {
-            return PlatformUI.getWorkbench().getOperationSupport().getUndoContext();
-        }
-        return null;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchFile.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchFile.java
deleted file mode 100644
index c5f0c1e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchFile.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.model;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-
-/**
- * An IWorkbenchAdapter that represents IFiles.
- */
-public class WorkbenchFile extends WorkbenchResource {
-
-	/**
-	 * Constant that is used as the key of a session property on IFile objects
-	 * to cache the result of doing a proper content type lookup. This will be
-	 * set by the ContentTypeDecorator (if enabled) and used instead of the
-	 * "guessed" content type in {@link #getBaseImage(IResource)}.
-	 * 
-	 * @since 3.4
-	 */
-	public static QualifiedName IMAGE_CACHE_KEY = new QualifiedName(WorkbenchPlugin.PI_WORKBENCH, "WorkbenchFileImage"); //$NON-NLS-1$
-	
-	/**
-     *	Answer the appropriate base image to use for the passed resource, optionally
-     *	considering the passed open status as well iff appropriate for the type of
-     *	passed resource
-     */
-    protected ImageDescriptor getBaseImage(IResource resource) {
-		IContentType contentType = null;
-		// do we need to worry about checking here?
-		if (resource instanceof IFile) {
-			IFile file = (IFile)resource;
-			// cached images come from ContentTypeDecorator
-			ImageDescriptor cached;
-			try {
-				cached = (ImageDescriptor) file.getSessionProperty(IMAGE_CACHE_KEY);
-				if (cached != null) {
-					return cached;
-				}
-			} catch (CoreException e) {
-				// ignore - not having a cached image descriptor is not fatal
-			}
-			contentType = IDE.guessContentType(file);
-		}
-        // @issue move IDE specific images
-        ImageDescriptor image = PlatformUI.getWorkbench().getEditorRegistry()
-                .getImageDescriptor(resource.getName(), contentType);
-        if (image == null) {
-			image = PlatformUI.getWorkbench().getSharedImages()
-                    .getImageDescriptor(ISharedImages.IMG_OBJ_FILE);
-		}
-        return image;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchFolder.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchFolder.java
deleted file mode 100644
index 6806419..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchFolder.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.model;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * An IWorkbenchAdapter that represents IFolders.
- */
-public class WorkbenchFolder extends WorkbenchResource {
-    /**
-     *	Answer the appropriate base image to use for the passed resource, optionally
-     *	considering the passed open status as well iff appropriate for the type of
-     *	passed resource
-     */
-    protected ImageDescriptor getBaseImage(IResource resource) {
-        return PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
-                ISharedImages.IMG_OBJ_FOLDER);
-    }
-
-    /**
-     * Returns the children of this container.
-     */
-    public Object[] getChildren(Object o) {
-        try {
-            return ((IContainer) o).members();
-        } catch (CoreException e) {
-            return NO_CHILDREN;
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchMarker.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchMarker.java
deleted file mode 100644
index b6cfea0..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchMarker.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.model;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IMarkerActionFilter;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.views.markers.MarkerPropertyTester;
-import org.eclipse.ui.model.WorkbenchAdapter;
-
-/**
- * Model object for adapting IMarker objects to the IWorkbenchAdapter
- * interface.
- */
-public class WorkbenchMarker extends WorkbenchAdapter implements
-        IMarkerActionFilter {
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
-     */
-    public ImageDescriptor getImageDescriptor(Object o) {
-        if (!(o instanceof IMarker)) {
-			return null;
-		}
-        return IDEWorkbenchPlugin.getDefault().getMarkerImageProviderRegistry()
-                .getImageDescriptor((IMarker) o);
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
-     */
-    public String getLabel(Object o) {
-        IMarker marker = (IMarker) o;
-        return marker.getAttribute(IMarker.MESSAGE, "");//$NON-NLS-1$
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object)
-     */
-    public Object getParent(Object o) {
-        return ((IMarker) o).getResource();
-    }
-
-    /**
-     * Returns whether the specific attribute matches the state of the target
-     * object.
-     *
-     * @param target the target object
-     * @param name the attribute name
-     * @param value the attriute value
-     * @return <code>true</code> if the attribute matches; <code>false</code> otherwise
-     */
-    public boolean testAttribute(Object target, String name, String value) {
-        return MarkerPropertyTester.test((IMarker) target, name, value);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchProject.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchProject.java
deleted file mode 100644
index ec8efd3..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchProject.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.model;
-
-import java.util.HashMap;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.IProjectActionFilter;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.misc.OverlayIcon;
-
-/**
- * An IWorkbenchAdapter that represents IProject.
- */
-public class WorkbenchProject extends WorkbenchResource implements
-        IProjectActionFilter {
-    HashMap imageCache = new HashMap(11);
-
-    /**
-     *	Answer the appropriate base image to use for the passed resource, optionally
-     *	considering the passed open status as well iff appropriate for the type of
-     *	passed resource
-     */
-    protected ImageDescriptor getBaseImage(IResource resource) {
-        IProject project = (IProject) resource;
-        boolean isOpen = project.isOpen();
-        String baseKey = isOpen ? IDE.SharedImages.IMG_OBJ_PROJECT
-                : IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED;
-        if (isOpen) {
-            try {
-                String[] natureIds = project.getDescription().getNatureIds();
-                for (int i = 0; i < natureIds.length; ++i) {
-                    // Have to use a cache because OverlayIcon does not define its own equality criteria,
-                    // so WorkbenchLabelProvider would always create a new image otherwise.
-                    String imageKey = natureIds[i];
-                    ImageDescriptor overlayImage = (ImageDescriptor) imageCache
-                            .get(imageKey);
-                    if (overlayImage != null) {
-                        return overlayImage;
-                    }
-                    ImageDescriptor natureImage = IDEWorkbenchPlugin
-                            .getDefault().getProjectImageRegistry()
-                            .getNatureImage(natureIds[i]);
-                    if (natureImage != null) {
-                        ImageDescriptor baseImage = IDEInternalWorkbenchImages
-                                .getImageDescriptor(baseKey);
-                        overlayImage = new OverlayIcon(baseImage,
-                                new ImageDescriptor[][] { { natureImage } },
-                                new Point(16, 16));
-                        imageCache.put(imageKey, overlayImage);
-                        return overlayImage;
-                    }
-                }
-            } catch (CoreException e) {
-            }
-        }
-        return IDEInternalWorkbenchImages.getImageDescriptor(baseKey);
-    }
-
-    /**
-     * Returns the children of this container.
-     */
-    public Object[] getChildren(Object o) {
-        IProject project = (IProject) o;
-        if (project.isOpen()) {
-            try {
-                return project.members();
-            } catch (CoreException e) {
-                //don't get the children if there are problems with the project
-            }
-        }
-        return NO_CHILDREN;
-    }
-
-    /**
-     * Returns whether the specific attribute matches the state of the target
-     * object.
-     *
-     * @param target the target object
-     * @param name the attribute name
-     * @param value the attriute value
-     * @return <code>true</code> if the attribute matches; <code>false</code> otherwise
-     */
-    public boolean testAttribute(Object target, String name, String value) {
-        if (!(target instanceof IProject)) {
-            return false;
-        }
-        IProject proj = (IProject) target;
-        if (name.equals(NATURE)) {
-            try {
-                return proj.isAccessible() && proj.hasNature(value);
-            } catch (CoreException e) {
-                return false;
-            }
-        } else if (name.equals(OPEN)) {
-            value = value.toLowerCase();
-            return (proj.isOpen() == value.equals("true"));//$NON-NLS-1$
-        }
-        return super.testAttribute(target, name, value);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchResource.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchResource.java
deleted file mode 100644
index 4f4d97c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchResource.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.model;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IResourceActionFilter;
-import org.eclipse.ui.actions.SimpleWildcardTester;
-import org.eclipse.ui.model.WorkbenchAdapter;
-
-/**
- * An IWorkbenchAdapter that represents IResources.
- */
-public abstract class WorkbenchResource extends WorkbenchAdapter implements
-        IResourceActionFilter {
-
-    /**
-     *	Answer the appropriate base image to use for the resource.
-     */
-    protected abstract ImageDescriptor getBaseImage(IResource resource);
-
-    /**
-     * Returns an image descriptor for this object.
-     */
-    public ImageDescriptor getImageDescriptor(Object o) {
-        IResource resource = getResource(o);
-        return resource == null ? null : getBaseImage(resource);
-    }
-
-    /**
-     * getLabel method comment.
-     */
-    public String getLabel(Object o) {
-        IResource resource = getResource(o);
-        return resource == null ? null : resource.getName();
-    }
-
-    /**
-     * Returns the parent of the given object.  Returns null if the
-     * parent is not available.
-     */
-    public Object getParent(Object o) {
-        IResource resource = getResource(o);
-        return resource == null ? null : resource.getParent();
-    }
-
-    /**
-     * Returns the resource corresponding to this object,
-     * or null if there is none.
-     */
-    protected IResource getResource(Object o) {
-        if (o instanceof IResource) {
-            return (IResource) o;
-        }
-        if (o instanceof IAdaptable) {
-            return (IResource) ((IAdaptable) o).getAdapter(IResource.class);
-        }
-        return null;
-    }
-
-    /**
-     * Returns whether the specific attribute matches the state of the target
-     * object.
-     *
-     * @param target the target object
-     * @param name the attribute name
-     * @param value the attribute value
-     * @return <code>true</code> if the attribute matches; <code>false</code> otherwise
-     */
-    public boolean testAttribute(Object target, String name, String value) {
-        if (!(target instanceof IResource)) {
-            return false;
-        }
-        IResource res = (IResource) target;
-        if (name.equals(NAME)) {
-            return SimpleWildcardTester.testWildcardIgnoreCase(value, res
-                    .getName());
-        } else if (name.equals(PATH)) {
-            return SimpleWildcardTester.testWildcardIgnoreCase(value, res
-                    .getFullPath().toString());
-        } else if (name.equals(EXTENSION)) {
-            return SimpleWildcardTester.testWildcardIgnoreCase(value, res
-                    .getFileExtension());
-        } else if (name.equals(READ_ONLY)) {
-            return (res.isReadOnly() == value.equalsIgnoreCase("true"));//$NON-NLS-1$
-        } else if (name.equals(PROJECT_NATURE)) {
-            try {
-                IProject proj = res.getProject();
-                return proj.isAccessible() && proj.hasNature(value);
-            } catch (CoreException e) {
-                return false;
-            }
-        } else if (name.equals(PERSISTENT_PROPERTY)) {
-            return testProperty(res, true, false, value);
-        } else if (name.equals(PROJECT_PERSISTENT_PROPERTY)) {
-            return testProperty(res, true, true, value);
-        } else if (name.equals(SESSION_PROPERTY)) {
-            return testProperty(res, false, false, value);
-        } else if (name.equals(PROJECT_SESSION_PROPERTY)) {
-            return testProperty(res, false, true, value);
-        } else if (name.equals(CONTENT_TYPE_ID)) {
-            return testContentTypeProperty(res, value);
-        }
-        return false;
-    }
-
-    /**
-     * Tests whether the content type for <code>resource</code> matches the
-     * <code>contentTypeId</code>. It is possible that this method call could
-     * cause the resource to be read. It is also possible (through poor plug-in
-     * design) for this method to load plug-ins.
-     * 
-     * @param resource
-     *            The resource for which the content type should be determined;
-     *            must not be <code>null</code>.
-     * @param contentTypeId
-     *            The expected content type; must not be <code>null</code>.
-     * @return <code>true</code> iff the best matching content type has an
-     *         identifier that matches <code>contentTypeId</code>;
-     *         <code>false</code> otherwise.
-     */
-    private final boolean testContentTypeProperty(final IResource resource,
-            final String contentTypeId) {
-        final String expectedValue = contentTypeId.trim();
-
-        if (!(resource instanceof IFile)) {
-            return false;
-        }
-
-        final IFile file = (IFile) resource;
-        String actualValue = null;
-
-        try {
-            final IContentDescription contentDescription = file
-                    .getContentDescription();
-
-            if (contentDescription != null) {
-                final IContentType contentType = contentDescription
-                        .getContentType();
-                actualValue = contentType.getId();
-            }
-        } catch (CoreException e) {
-            //ignore - this just means the file does not exist or is not accessible
-        }
-
-        return expectedValue == null || expectedValue.equals(actualValue);
-    }
-
-    /**
-     * Tests whether a session or persistent property on the resource or its project
-     * matches the given value.
-     * 
-     * @param resource
-     *            the resource to check
-     * @param persistentFlag
-     *            <code>true</code> for a persistent property, <code>false</code>
-     *            for a session property
-     * @param projectFlag
-     *            <code>true</code> to check the resource's project,
-     *            <code>false</code> to check the resource itself
-     * @param value
-     *            the attribute value, which has either the form "propertyName" or
-     *            "propertyName=propertyValue"
-     * @return whether there is a match
-     */
-    private boolean testProperty(IResource resource, boolean persistentFlag,
-            boolean projectFlag, String value) {
-        String propertyName;
-        String expectedVal;
-        int i = value.indexOf('=');
-        if (i != -1) {
-            propertyName = value.substring(0, i).trim();
-            expectedVal = value.substring(i + 1).trim();
-        } else {
-            propertyName = value.trim();
-            expectedVal = null;
-        }
-        try {
-            QualifiedName key;
-            int dot = propertyName.lastIndexOf('.');
-            if (dot != -1) {
-                key = new QualifiedName(propertyName.substring(0, dot),
-                        propertyName.substring(dot + 1));
-            } else {
-                key = new QualifiedName(null, propertyName);
-            }
-            IResource resToCheck = projectFlag ? resource.getProject()
-                    : resource;
-            // getProject() on workspace root can be null
-            if (resToCheck == null) {
-                return false;
-            }
-            if (persistentFlag) {
-                String actualVal = resToCheck.getPersistentProperty(key);
-                if (actualVal == null) {
-                    return false;
-                }
-                return expectedVal == null || expectedVal.equals(actualVal);
-            } 
-
-            Object actualVal = resToCheck.getSessionProperty(key);
-             if (actualVal == null) {
-				return false;
-			}
-              
-             return expectedVal == null
-                        || expectedVal.equals(actualVal.toString());
-            
-        } catch (CoreException e) {
-            // ignore
-        }
-        return false;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchRootResource.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchRootResource.java
deleted file mode 100644
index 77ef5eb..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchRootResource.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.model;
-
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.model.WorkbenchAdapter;
-
-/**
- * An IWorkbenchAdapter implementation for IWorkspaceRoot objects.
- */
-public class WorkbenchRootResource extends WorkbenchAdapter {
-    /**
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(Object)
-     * Returns the children of the root resource.
-     */
-    public Object[] getChildren(Object o) {
-        IWorkspaceRoot root = (IWorkspaceRoot) o;
-        return root.getProjects();
-    }
-
-    /**
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(Object)
-     */
-    public ImageDescriptor getImageDescriptor(Object object) {
-    	return PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
-                ISharedImages.IMG_OBJ_ELEMENT);
-    }
-
-    /**
-     * Returns the name of this element.  This will typically
-     * be used to assign a label to this object when displayed
-     * in the UI.
-     */
-    public String getLabel(Object o) {
-        //root resource has no name
-        return IDEWorkbenchMessages.Workspace;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchStatus.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchStatus.java
deleted file mode 100644
index a5c556d..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchStatus.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.model;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.ui.model.WorkbenchAdapter;
-
-/**
- * UI manifestation of a status object.
- */
-public class WorkbenchStatus extends WorkbenchAdapter implements IAdaptable {
-    private IStatus status;
-
-    private Object[] children;
-
-    /**
-     * Creates a workbench status for the given status.
-     * 
-     * @param status the status
-     */
-    public WorkbenchStatus(IStatus status) {
-        this.status = status;
-    }
-
-    /**
-     * Returns an object which is an instance of the given class
-     * associated with this object. Returns <code>null</code> if
-     * no such object can be found.
-     */
-    public Object getAdapter(Class adapter) {
-        if (adapter == IWorkbenchAdapter.class) {
-			return this;
-		}
-        return null;
-    }
-
-    /**
-     * Returns the children of this element.
-     */
-    public Object[] getChildren(Object o) {
-        if (children == null) {
-            IStatus[] childStatii = status.getChildren();
-            children = new Object[childStatii.length];
-            for (int i = 0; i < childStatii.length; i++) {
-                children[i] = new WorkbenchStatus(childStatii[i]);
-            }
-        }
-        return children;
-    }
-
-    /**
-     * @see IWorkbenchAdapter#getLabel
-     */
-    public String getLabel(Object o) {
-        return status.getMessage();
-    }
-
-    /**
-     * Returns the wrapped status object.
-     * 
-     * @return the wrapped status object
-     */
-    public IStatus getStatus() {
-        return status;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchWorkspace.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchWorkspace.java
deleted file mode 100644
index 92d426b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkbenchWorkspace.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.model;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.model.WorkbenchAdapter;
-
-/**
- * IWorkbenchAdapter adapter for the IWorkspace object.
- */
-public class WorkbenchWorkspace extends WorkbenchAdapter {
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object)
-     */
-    public Object[] getChildren(Object o) {
-        IWorkspace workspace = (IWorkspace) o;
-        return workspace.getRoot().getProjects();
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
-     */
-    public ImageDescriptor getImageDescriptor(Object object) {
-        return null;
-    }
-
-    /**
-     * getLabel method comment.
-     */
-    public String getLabel(Object o) {
-        //workspaces don't have a name
-        return IDEWorkbenchMessages.Workspace;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkingSetAdapterFactory.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkingSetAdapterFactory.java
deleted file mode 100644
index cab89ec..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkingSetAdapterFactory.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IContributorResourceAdapter;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.ide.IContributorResourceAdapter2;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-/**
- * Adapter factory which provides a ResourceMapping for a working set
- */
-public class WorkingSetAdapterFactory implements IAdapterFactory {
-
-	/*
-	 * Adapter for converting a working set to a resource mapping for use by
-	 * object contributions.
-	 */
-	class ContributorResourceAdapter implements IContributorResourceAdapter2 {
-
-		public ResourceMapping getAdaptedResourceMapping(IAdaptable adaptable) {
-			if (adaptable instanceof IWorkingSet) {
-				IWorkingSet workingSet = (IWorkingSet) adaptable;
-				IAdaptable[] elements = workingSet.getElements();
-				List result = new ArrayList();
-				for (int i = 0; i < elements.length; i++) {
-					IAdaptable element = elements[i];
-					ResourceMapping mapping = getContributedResourceMapping(element);
-					if (mapping == null) {
-						mapping = getResourceMapping(element);
-					}
-					if (mapping != null) {
-						result.add(mapping);
-					}
-				}
-				if (!result.isEmpty()) {
-					return new WorkingSetResourceMapping(workingSet);
-				}
-			}
-			return null;
-		}
-
-		public IResource getAdaptedResource(IAdaptable adaptable) {
-			// Working sets don't adapt to IResource
-			return null;
-		}
-
-	}
-
-	class WorkbenchAdapter implements IWorkbenchAdapter {
-
-		public Object[] getChildren(Object o) {
-			if (o instanceof IWorkingSet) {
-				IWorkingSet set = (IWorkingSet) o;
-				return set.getElements();
-			}
-			return null;
-		}
-
-		public ImageDescriptor getImageDescriptor(Object o) {
-			if (o instanceof IWorkingSet) {
-				IWorkingSet set = (IWorkingSet) o;
-				return set.getImageDescriptor();
-			}
-			return null;
-		}
-
-		public String getLabel(Object o) {
-			if (o instanceof IWorkingSet) {
-				IWorkingSet set = (IWorkingSet) o;
-				return set.getLabel();
-			}
-			return null;
-		}
-
-		public Object getParent(Object o) {
-			return null;
-		}
-
-	}
-
-	private IContributorResourceAdapter2 contributorResourceAdapter = new ContributorResourceAdapter();
-
-	private IWorkbenchAdapter workbenchAdapter = new WorkbenchAdapter();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object,
-	 *      java.lang.Class)
-	 */
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (adaptableObject instanceof IWorkingSet) {
-			if (adapterType == IContributorResourceAdapter.class) {
-				return contributorResourceAdapter;
-			}
-			if (adapterType == IWorkbenchAdapter.class) {
-				return workbenchAdapter;
-			}
-			if (adapterType == ResourceMapping.class) {
-				IWorkingSet workingSet = (IWorkingSet) adaptableObject;
-				IAdaptable[] elements = workingSet.getElements();
-				List result = new ArrayList();
-				for (int i = 0; i < elements.length; i++) {
-					IAdaptable element = elements[i];
-					ResourceMapping mapping = getResourceMapping(element);
-					if (mapping != null) {
-						result.add(mapping);
-					}
-				}
-				if (!result.isEmpty()) {
-					return new WorkingSetResourceMapping(workingSet);
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return new Class[] { IContributorResourceAdapter2.class,
-				IWorkbenchAdapter.class, ResourceMapping.class };
-	}
-
-	static ResourceMapping getResourceMapping(Object o) {
-		// First, ask the object directly for a resource mapping
-		Object mapping = internalGetAdapter(o, ResourceMapping.class);
-		if (mapping instanceof ResourceMapping) {
-			return (ResourceMapping) mapping;
-		}
-		// If this fails, ask for a resource and convert to a resource mapping
-		Object resource = internalGetAdapter(o, IResource.class);
-		if (resource != null) {
-			mapping = internalGetAdapter(resource, ResourceMapping.class);
-			if (mapping instanceof ResourceMapping) {
-				return (ResourceMapping) mapping;
-			}
-		}
-		return null;
-	}
-
-	static ResourceMapping getContributedResourceMapping(
-			IAdaptable element) {
-		Object resourceAdapter = internalGetAdapter(element,
-				IContributorResourceAdapter.class);
-		if (resourceAdapter != null) {
-			if (resourceAdapter instanceof IContributorResourceAdapter2) {
-				// First, use the mapping contributor adapter to get the mapping
-				IContributorResourceAdapter2 mappingAdapter = (IContributorResourceAdapter2) resourceAdapter;
-				ResourceMapping mapping = mappingAdapter
-						.getAdaptedResourceMapping(element);
-				if (mapping != null) {
-					return mapping;
-				}
-			}
-			if (resourceAdapter instanceof IContributorResourceAdapter) {
-				// Next, use the resource adapter to get a resource and then get
-				// the mapping for that resource
-				IResource resource = ((IContributorResourceAdapter) resourceAdapter)
-						.getAdaptedResource(element);
-				if (resource != null) {
-					Object mapping = internalGetAdapter(resource,
-							ResourceMapping.class);
-					if (mapping instanceof ResourceMapping) {
-						return (ResourceMapping) mapping;
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	static Object internalGetAdapter(Object o, Class adapter) {
-		if (o instanceof IAdaptable) {
-			IAdaptable element = (IAdaptable) o;
-			Object adapted = element.getAdapter(adapter);
-			if (adapted != null) {
-				return adapted;
-			}
-		}
-		// Fallback to the adapter manager in case the object doesn't
-		// implement getAdapter or in the case where the implementation
-		// doesn't consult the manager
-		return Platform.getAdapterManager().getAdapter(o, adapter);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkingSetResourceMapping.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkingSetResourceMapping.java
deleted file mode 100644
index 981b5f0..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkingSetResourceMapping.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.ide.model;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.mapping.ModelProvider;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.resources.mapping.ResourceMappingContext;
-import org.eclipse.core.resources.mapping.ResourceTraversal;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.ui.IWorkingSet;
-
-/**
- * A resource mapping for working sets
- */
-public class WorkingSetResourceMapping extends ResourceMapping {
-
-	private IWorkingSet set;
-	
-	/**
-	 * Create the resource mapping
-	 * @param workingSet the working set
-	 */
-	public WorkingSetResourceMapping(IWorkingSet workingSet) {
-		set = workingSet;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.mapping.ResourceMapping#getModelObject()
-	 */
-	public Object getModelObject() {
-		return set;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.mapping.ResourceMapping#getModelProviderId()
-	 */
-	public String getModelProviderId() {
-		return ModelProvider.RESOURCE_MODEL_PROVIDER_ID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.mapping.ResourceMapping#getProjects()
-	 */
-	public IProject[] getProjects() {
-		Set result = new HashSet();
-		ResourceMapping[] mappings = getMappings();
-		for (int i = 0; i < mappings.length; i++) {
-			ResourceMapping mapping = mappings[i];
-			IProject[] projects = mapping.getProjects();
-			for (int j = 0; j < projects.length; j++) {
-				IProject project = projects[j];
-				result.add(project);
-			}
-		}
-		return (IProject[]) result.toArray(new IProject[result.size()]);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.mapping.ResourceMapping#getTraversals(org.eclipse.core.resources.mapping.ResourceMappingContext, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public ResourceTraversal[] getTraversals(ResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
-		if (monitor == null)
-			monitor = new NullProgressMonitor();
-		try {
-			ResourceMapping[] mappings = getMappings();
-			monitor.beginTask("", 100 * mappings.length); //$NON-NLS-1$
-			List result = new ArrayList();
-			for (int i = 0; i < mappings.length; i++) {
-				ResourceMapping mapping = mappings[i];
-				result.addAll(Arrays.asList(mapping.getTraversals(context, new SubProgressMonitor(monitor, 100))));
-			}
-			return (ResourceTraversal[]) result.toArray(new ResourceTraversal[result.size()]);
-		} finally {
-			monitor.done();
-		}
-	}
-
-	/**
-	 * Return the mappings contained in the set.
-	 * @return the mappings contained in the set
-	 */
-	private ResourceMapping[] getMappings() {
-		IAdaptable[] elements = set.getElements();
-		List result = new ArrayList();
-		for (int i = 0; i < elements.length; i++) {
-			IAdaptable element = elements[i];
-			ResourceMapping mapping = WorkingSetAdapterFactory.getContributedResourceMapping(element);
-			if (mapping == null) {
-				mapping = WorkingSetAdapterFactory.getResourceMapping(element);
-			}
-			if (mapping != null) {
-				result.add(mapping);
-			}
-		}
-		return (ResourceMapping[]) result.toArray(new ResourceMapping[result.size()]);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.mapping.ResourceMapping#contains(org.eclipse.core.resources.mapping.ResourceMapping)
-	 */
-	public boolean contains(ResourceMapping mapping) {
-		ResourceMapping[] mappings = getMappings();
-		for (int i = 0; i < mappings.length; i++) {
-			ResourceMapping childMapping = mappings[i];
-			if (childMapping.contains(mapping)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkspaceFactory.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkspaceFactory.java
deleted file mode 100644
index 4a28052..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/model/WorkspaceFactory.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.model;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.ui.IElementFactory;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPersistableElement;
-
-/**
- * The ResourceFactory is used to save and recreate an IResource object.
- * As such, it implements the IPersistableElement interface for storage
- * and the IElementFactory interface for recreation.
- *
- * @see IMemento
- * @see IPersistableElement
- * @see IElementFactory
- */
-public class WorkspaceFactory implements IElementFactory, IPersistableElement {
-    private static final String FACTORY_ID = "org.eclipse.ui.internal.model.WorkspaceFactory";//$NON-NLS-1$
-
-    /**
-     * Create a ResourceFactory.  This constructor is typically used
-     * for our IElementFactory side.
-     */
-    public WorkspaceFactory() {
-    }
-
-    /**
-     * @see IElementFactory
-     */
-    public IAdaptable createElement(IMemento memento) {
-        return ResourcesPlugin.getWorkspace();
-    }
-
-    /**
-     * @see IPersistableElement
-     */
-    public String getFactoryId() {
-        return FACTORY_ID;
-    }
-
-    /**
-     * @see IPersistableElement
-     */
-    public void saveState(IMemento memento) {
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/package.html b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/package.html
deleted file mode 100644
index ee2c4a7..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/package.html
+++ /dev/null
@@ -1,21 +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="Microsoft FrontPage 4.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<title>Package-level Javadoc</title>
-</head>
-
-<body>
-
-Internal implementation of the IDE-specific portion of the Eclipse Platform User
-Interface.
-<h2>Package Specification</h2>
-This package does not contain any API.
-
-</body>
-
-</html>
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/IDERegistryReader.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/IDERegistryReader.java
deleted file mode 100644
index c108f2e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/IDERegistryReader.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.registry;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Hashtable;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * Template implementation of a registry reader that creates objects
- * representing registry contents. Typically, an extension
- * contains one element, but this reader handles multiple
- * elements per extension.
- *
- * To start reading the extensions from the registry for an
- * extension point, call the method <code>readRegistry</code>.
- *
- * To read children of an IConfigurationElement, call the
- * method <code>readElementChildren</code> from your implementation
- * of the method <code>readElement</code>, as it will not be
- * done by default.
- */
-public abstract class IDERegistryReader {
-    protected static final String TAG_DESCRIPTION = "description"; //$NON-NLS-1$
-
-    protected static Hashtable extensionPoints = new Hashtable();
-
-    private static final Comparator comparer = new Comparator() {
-        public int compare(Object arg0, Object arg1) {
-			IExtension i1 = (IExtension) arg0;
-			String s1 = i1.getNamespace();
-			IExtension i2 = (IExtension) arg1;
-			String s2 = i2.getNamespace();
-			return s1.compareToIgnoreCase(s2);
-		}
-    };
-
-    /**
-     * The constructor.
-     */
-    protected IDERegistryReader() {
-    }
-
-    /**
-     * This method extracts description as a subelement of
-     * the given element.
-     * @return description string if defined, or empty string
-     * if not.
-     */
-    protected String getDescription(IConfigurationElement config) {
-        IConfigurationElement[] children = config.getChildren(TAG_DESCRIPTION);
-        if (children.length >= 1) {
-            return children[0].getValue();
-        }
-        return "";//$NON-NLS-1$
-    }
-
-    /**
-     * Logs the error in the workbench log using the provided
-     * text and the information in the configuration element.
-     */
-    protected void logError(IConfigurationElement element, String text) {
-		IExtension extension = element.getDeclaringExtension();
-		String pluginId = extension.getNamespace();
-		StringBuffer buf = new StringBuffer();
-		buf.append("Plugin " + pluginId + ", extension " //$NON-NLS-2$//$NON-NLS-1$
-				+ extension.getExtensionPointUniqueIdentifier());
-		buf.append("\n" + text);//$NON-NLS-1$
-		IDEWorkbenchPlugin.log(buf.toString());
-	}
-
-    /**
-     * Logs a very common registry error when a required attribute is missing.
-     */
-    protected void logMissingAttribute(IConfigurationElement element,
-            String attributeName) {
-        logError(element,
-                "Required attribute '" + attributeName + "' not defined");//$NON-NLS-2$//$NON-NLS-1$
-    }
-
-    /**
-     * Logs a very common registry error when a required child is missing.
-     */
-    protected void logMissingElement(IConfigurationElement element,
-            String elementName) {
-        logError(element,
-                "Required sub element '" + elementName + "' not defined");//$NON-NLS-2$//$NON-NLS-1$
-    }
-
-    /**
-     * Logs a registry error when the configuration element is unknown.
-     */
-    protected void logUnknownElement(IConfigurationElement element) {
-        logError(element, "Unknown extension tag found: " + element.getName());//$NON-NLS-1$
-    }
-
-    /**
-     *	Apply a reproducable order to the list of extensions
-     * provided, such that the order will not change as
-     * extensions are added or removed.
-     */
-    protected IExtension[] orderExtensions(IExtension[] extensions) {
-        // By default, the order is based on plugin id sorted
-        // in ascending order. The order for a plugin providing
-        // more than one extension for an extension point is
-        // dependent in the order listed in the XML file.
-        IExtension[] sortedExtension = new IExtension[extensions.length];
-        System.arraycopy(extensions, 0, sortedExtension, 0, extensions.length);
-        Collections.sort(Arrays.asList(sortedExtension), comparer);
-        return sortedExtension;
-    }
-
-    /**
-     * Implement this method to read element's attributes.
-     * If children should also be read, then implementor
-     * is responsible for calling <code>readElementChildren</code>.
-     * Implementor is also responsible for logging missing 
-     * attributes.
-     *
-     * @return true if element was recognized, false if not.
-     */
-    protected abstract boolean readElement(IConfigurationElement element);
-
-    /**
-     * Read the element's children. This is called by
-     * the subclass' readElement method when it wants
-     * to read the children of the element.
-     */
-    protected void readElementChildren(IConfigurationElement element) {
-        readElements(element.getChildren());
-    }
-
-    /**
-     * Read each element one at a time by calling the
-     * subclass implementation of <code>readElement</code>.
-     *
-     * Logs an error if the element was not recognized.
-     */
-    protected void readElements(IConfigurationElement[] elements) {
-        for (int i = 0; i < elements.length; i++) {
-            if (!readElement(elements[i])) {
-				logUnknownElement(elements[i]);
-			}
-        }
-    }
-
-    /**
-     * Read one extension by looping through its
-     * configuration elements.
-     */
-    protected void readExtension(IExtension extension) {
-        readElements(extension.getConfigurationElements());
-    }
-
-    /**
-     *	Start the registry reading process using the
-     * supplied plugin ID and extension point.
-     */
-    protected void readRegistry(IExtensionRegistry registry, String pluginId,
-            String extensionPoint) {
-        String pointId = pluginId + "-" + extensionPoint; //$NON-NLS-1$
-        IExtension[] extensions = (IExtension[]) extensionPoints.get(pointId);
-        if (extensions == null) {
-            IExtensionPoint point = registry.getExtensionPoint(pluginId,
-                    extensionPoint);
-            if (point == null) {
-				return;
-			}
-            extensions = point.getExtensions();
-            extensions = orderExtensions(extensions);
-            extensionPoints.put(pointId, extensions);
-        }
-        for (int i = 0; i < extensions.length; i++) {
-			readExtension(extensions[i]);
-		}
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerHelpRegistry.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerHelpRegistry.java
deleted file mode 100644
index c4e55c8..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerHelpRegistry.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.registry;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ui.IMarkerHelpRegistry;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.IMarkerResolutionGenerator;
-import org.eclipse.ui.IMarkerResolutionGenerator2;
-import org.eclipse.ui.internal.ide.Policy;
-import org.osgi.framework.Bundle;
-
-/**
- * This class is a registry for marker help contexts and resolutions.
- */
-public class MarkerHelpRegistry implements IMarkerHelpRegistry {
-	/**
-	 * Table of queries for marker F1 help.
-	 */
-	private Map helpQueries = new HashMap();
-
-	/**
-	 * Sorted list of help queries. Used to ensure that the "most specific"
-	 * query is tried first
-	 */
-	private List sortedHelpQueries;
-
-	/**
-	 * Table of queries for marker resolutions
-	 */
-	private Map resolutionQueries = new LinkedHashMap();
-
-	/**
-	 * Help context id attribute in configuration element
-	 */
-	private static final String ATT_HELP = "helpContextId"; //$NON-NLS-1$
-
-	/**
-	 * Resolution class attribute name in configuration element
-	 */
-	private static final String ATT_CLASS = "class"; //$NON-NLS-1$
-
-	private class QueryComparator implements Comparator {
-		/*
-		 * (non-Javadoc) Method declared on Object.
-		 */
-		public boolean equals(Object o) {
-			if (!(o instanceof QueryComparator)) {
-				return false;
-			}
-			return true;
-		}
-
-		/*
-		 * (non-Javadoc) Method declared on Comparator.
-		 */
-		public int compare(Object o1, Object o2) {
-			// more attribues come first
-			MarkerQuery q1 = (MarkerQuery) o1;
-			MarkerQuery q2 = (MarkerQuery) o2;
-
-			int size1 = q1.getAttributes().length;
-			int size2 = q2.getAttributes().length;
-
-			if (size1 > size2) {
-				return -1;
-			}
-			if (size1 == size2) {
-				return 0;
-			}
-			return 1;
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IMarkerHelpRegistry.
-	 */
-	public String getHelp(IMarker marker) {
-		if (sortedHelpQueries == null) {
-			Set set = helpQueries.keySet();
-			sortedHelpQueries = new ArrayList(set.size());
-			sortedHelpQueries.addAll(set);
-			Collections.sort(sortedHelpQueries, new QueryComparator());
-		}
-
-		// Return the first match (we assume there is only one)
-		for (Iterator iter = sortedHelpQueries.iterator(); iter.hasNext();) {
-			MarkerQuery query = (MarkerQuery) iter.next();
-			MarkerQueryResult result = query.performQuery(marker);
-			if (result != null) {
-				// See if a matching result is registered
-				Map resultsTable = (Map) helpQueries.get(query);
-
-				if (resultsTable.containsKey(result)) {
-
-					Iterator elements = ((Collection) resultsTable.get(result))
-							.iterator();
-					while (elements.hasNext()) {
-						IConfigurationElement element = (IConfigurationElement) elements
-								.next();
-						// We have a match so return the help context id
-						return element.getAttribute(ATT_HELP);
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IMarkerHelpRegistry.
-	 */
-	public boolean hasResolutions(IMarker marker) {
-		// Detect a match
-		for (Iterator iter = resolutionQueries.keySet().iterator(); iter
-				.hasNext();) {
-			MarkerQuery query = (MarkerQuery) iter.next();
-			MarkerQueryResult result = query.performQuery(marker);
-			if (result != null) {
-				// See if a matching result is registered
-				Map resultsTable = (Map) resolutionQueries.get(query);
-
-				if (resultsTable.containsKey(result)) {
-
-					Iterator elements = ((Collection) resultsTable.get(result))
-							.iterator();
-					while (elements.hasNext()) {
-						IConfigurationElement element = (IConfigurationElement) elements
-								.next();
-
-						if (hasResolution(marker, element))
-							return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Return whether or not this configuration element has a resolution for the
-	 * marker.
-	 * 
-	 * @param marker
-	 * @param element
-	 * @return boolean <code>true</code> if there is a resolution.
-	 */
-	private boolean hasResolution(IMarker marker, IConfigurationElement element) {
-		IMarkerResolutionGenerator generator = null;
-		if (Platform.getBundle(element.getNamespace()).getState() == Bundle.ACTIVE) {
-			// The element's plugin is loaded so we instantiate
-			// the resolution
-			try {
-				generator = (IMarkerResolutionGenerator) element
-						.createExecutableExtension(ATT_CLASS);
-			} catch (CoreException e) {
-				Policy.handle(e);
-			}
-			if (generator != null) {
-				if (generator instanceof IMarkerResolutionGenerator2) {
-					if (((IMarkerResolutionGenerator2) generator)
-							.hasResolutions(marker)) {
-						return true;
-					}
-				} else {
-					IMarkerResolution[] resolutions = generator
-							.getResolutions(marker);
-					if (resolutions.length > 0) {
-						// there is at least one resolution
-						return true;
-					}
-				}
-			}
-		} else {
-			// The element's plugin in not loaded so we assume
-			// the generator will produce resolutions for the marker
-			return true;
-		}
-		return false;
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMarkerHelpRegistry#getResolutions(org.eclipse.core.resources.IMarker)
-	 */
-	public IMarkerResolution[] getResolutions(IMarker marker) {
-		// Collect all matches
-		ArrayList resolutions = new ArrayList();
-		for (Iterator iter = resolutionQueries.entrySet().iterator(); iter
-				.hasNext();) {
-			Map.Entry entry = (Entry) iter.next();
-			MarkerQuery query = (MarkerQuery) entry.getKey();
-			MarkerQueryResult result = query.performQuery(marker);
-			if (result != null) {
-				// See if a matching result is registered
-				Map resultsTable = (Map) entry.getValue();
-
-				if (resultsTable.containsKey(result)) {
-
-					Iterator elements = ((Collection) resultsTable.get(result))
-							.iterator();
-					while (elements.hasNext()) {
-						IConfigurationElement element = (IConfigurationElement) elements
-								.next();
-
-						IMarkerResolutionGenerator generator = null;
-						try {
-							generator = (IMarkerResolutionGenerator) element
-									.createExecutableExtension(ATT_CLASS);
-						} catch (CoreException e) {
-							Policy.handle(e);
-						}
-						if (generator != null) {
-							IMarkerResolution[] generatedResolutions = generator
-									.getResolutions(marker);
-							for (int i = 0; i < generatedResolutions.length; i++) {
-								resolutions.add(generatedResolutions[i]);
-							}
-						}
-
-					}
-				}
-			}
-		}
-		return (IMarkerResolution[]) resolutions
-				.toArray(new IMarkerResolution[resolutions.size()]);
-	}
-
-	/**
-	 * Adds a help query to the registry.
-	 * 
-	 * @param query
-	 *            a marker query
-	 * @param result
-	 *            a result for the given query
-	 * @param element
-	 *            the configuration element defining the result
-	 */
-	public void addHelpQuery(MarkerQuery query, MarkerQueryResult result,
-			IConfigurationElement element) {
-
-		addQuery(helpQueries, query, result, element);
-	}
-
-	/**
-	 * Adds a resolution query to the registry.
-	 * 
-	 * @param query
-	 *            a marker query
-	 * @param result
-	 *            a result for the given query
-	 * @param element
-	 *            the configuration element defining the result
-	 */
-	public void addResolutionQuery(MarkerQuery query, MarkerQueryResult result,
-			IConfigurationElement element) {
-
-		addQuery(resolutionQueries, query, result, element);
-	}
-
-	/**
-	 * Adds a query to the given table.
-	 * 
-	 * @param table
-	 *            the table to which the query is added
-	 * @param query
-	 *            a marker query
-	 * @param result
-	 *            a result for the given query
-	 * @param element
-	 *            the configuration element defining the result
-	 */
-	private void addQuery(Map table, MarkerQuery query,
-			MarkerQueryResult result, IConfigurationElement element) {
-
-		// See if the query is already in the table
-		Map results = (Map) table.get(query);
-		if (results == null) {
-			// Create a new results table
-			results = new HashMap();
-
-			// Add the query to the table
-			table.put(query, results);
-		}
-
-		if (results.containsKey(result)) {
-			Collection currentElements = (Collection) results.get(result);
-			currentElements.add(element);
-		} else {
-			Collection elements = new HashSet();
-			elements.add(element);
-
-			// Add the new result
-			results.put(result, elements);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerHelpRegistryReader.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerHelpRegistryReader.java
deleted file mode 100644
index 6de3d6e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerHelpRegistryReader.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.registry;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * This class is used to read marker help context ids and 
- * resolutions from the platform registry.
- */
-public class MarkerHelpRegistryReader extends IDERegistryReader {
-    private MarkerHelpRegistry markerHelpRegistry;
-
-    private ArrayList currentAttributeNames;
-
-    private ArrayList currentAttributeValues;
-
-    private static final String TAG_HELP = "markerHelp";//$NON-NLS-1$
-
-    private static final String TAG_RESOLUTION_GENERATOR = "markerResolutionGenerator";//$NON-NLS-1$
-
-    private static final String TAG_ATTRIBUTE = "attribute";//$NON-NLS-1$ 
-
-    private static final String ATT_TYPE = "markerType";//$NON-NLS-1$
-
-    private static final String ATT_NAME = "name";//$NON-NLS-1$
-
-    private static final String ATT_VALUE = "value";//$NON-NLS-1$
-
-    /**
-     * Get the marker help that is defined in the plugin registry
-     * and add it to the given marker help registry.
-     * <p>
-     * Warning:
-     * The marker help registry must be passed in because this 
-     * method is called during the process of setting up the 
-     * marker help registry and at this time it has not been
-     * safely setup with the plugin.
-     * </p>
-     */
-    public void addHelp(MarkerHelpRegistry registry) {
-        IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-        markerHelpRegistry = registry;
-        readRegistry(extensionRegistry, IDEWorkbenchPlugin.IDE_WORKBENCH,
-                IDEWorkbenchPlugin.PL_MARKER_HELP);
-        readRegistry(extensionRegistry, IDEWorkbenchPlugin.IDE_WORKBENCH,
-                IDEWorkbenchPlugin.PL_MARKER_RESOLUTION);
-    }
-
-    /**
-     * Processes one configuration element or child element.
-     */
-    protected boolean readElement(IConfigurationElement element) {
-        if (element.getName().equals(TAG_HELP)) {
-            readHelpElement(element);
-            return true;
-        }
-        if (element.getName().equals(TAG_RESOLUTION_GENERATOR)) {
-            readResolutionElement(element);
-            return true;
-        }
-        if (element.getName().equals(TAG_ATTRIBUTE)) {
-            readAttributeElement(element);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Processes a help configuration element.
-     */
-    private void readHelpElement(IConfigurationElement element) {
-        // read type
-        String type = element.getAttribute(ATT_TYPE);
-
-        // read attributes and values
-        currentAttributeNames = new ArrayList();
-        currentAttributeValues = new ArrayList();
-        readElementChildren(element);
-        String[] attributeNames = (String[]) currentAttributeNames
-                .toArray(new String[currentAttributeNames.size()]);
-        String[] attributeValues = (String[]) currentAttributeValues
-                .toArray(new String[currentAttributeValues.size()]);
-
-        // add query to the registry
-        MarkerQuery query = new MarkerQuery(type, attributeNames);
-        MarkerQueryResult result = new MarkerQueryResult(attributeValues);
-        markerHelpRegistry.addHelpQuery(query, result, element);
-    }
-
-    /**
-     * Processes a resolution configuration element.
-     */
-    private void readResolutionElement(IConfigurationElement element) {
-        // read type
-        String type = element.getAttribute(ATT_TYPE);
-
-        // read attributes and values
-        currentAttributeNames = new ArrayList();
-        currentAttributeValues = new ArrayList();
-        readElementChildren(element);
-        String[] attributeNames = (String[]) currentAttributeNames
-                .toArray(new String[currentAttributeNames.size()]);
-        String[] attributeValues = (String[]) currentAttributeValues
-                .toArray(new String[currentAttributeValues.size()]);
-
-        // add query to the registry
-        MarkerQuery query = new MarkerQuery(type, attributeNames);
-        MarkerQueryResult result = new MarkerQueryResult(attributeValues);
-        markerHelpRegistry.addResolutionQuery(query, result, element);
-    }
-
-    /**
-     * Processes an attribute sub element.
-     */
-    private void readAttributeElement(IConfigurationElement element) {
-        String name = element.getAttribute(ATT_NAME);
-        String value = element.getAttribute(ATT_VALUE);
-        if (name != null && value != null) {
-            currentAttributeNames.add(name);
-            currentAttributeValues.add(value);
-        }
-    }
-}
-
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerImageProviderRegistry.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerImageProviderRegistry.java
deleted file mode 100644
index 6e40520..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerImageProviderRegistry.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.registry;
-
-import java.net.URL;
-import java.util.ArrayList;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IMarkerImageProvider;
-import org.eclipse.ui.internal.ide.Policy;
-import org.osgi.framework.Bundle;
-
-/**
- * Implementation of a marker image registry which maps either
- * a marker type to a provider or to a static image.
- */
-public class MarkerImageProviderRegistry {
-    private static final String ATT_PROVIDER_CLASS = "class";//$NON-NLS-1$
-
-    private static final String ATT_ICON = "icon";//$NON-NLS-1$
-
-    private static final String ATT_MARKER_TYPE = "markertype";//$NON-NLS-1$
-
-    private static final String ATT_ID = "id";//$NON-NLS-1$
-
-    private static final String MARKER_ATT_KEY = "org.eclipse.ui.internal.registry.MarkerImageProviderRegistry";//$NON-NLS-1$
-
-    private static final String TAG_PROVIDER = "imageprovider";//$NON-NLS-1$
-
-    private ArrayList descriptors = new ArrayList();
-
-    class Descriptor {
-        String id;
-
-        String markerType;
-
-        String className;
-
-        String imagePath;
-
-        ImageDescriptor imageDescriptor;
-
-        IConfigurationElement element;
-
-        Bundle pluginBundle;
-
-        IMarkerImageProvider provider;
-    }
-
-    /**
-     * Initialize this new MarkerImageProviderRegistry.
-     */
-    public MarkerImageProviderRegistry() {
-        class MarkerImageReader extends IDERegistryReader {
-            protected boolean readElement(IConfigurationElement element) {
-                if (element.getName().equals(TAG_PROVIDER)) {
-                    addProvider(element);
-                    return true;
-                }
-
-                return false;
-            }
-
-            public void readRegistry() {
-                readRegistry(Platform.getExtensionRegistry(),
-                        IDEWorkbenchPlugin.IDE_WORKBENCH,
-                        IDEWorkbenchPlugin.PL_MARKER_IMAGE_PROVIDER);
-            }
-        }
-
-        new MarkerImageReader().readRegistry();
-    }
-
-    /**
-     * Creates a descriptor for the marker provider extension
-     * and add it to the list of providers.
-     */
-    public void addProvider(IConfigurationElement element) {
-        Descriptor desc = new Descriptor();
-        desc.element = element;
-        desc.pluginBundle = Platform.getBundle(element.getNamespace());
-        desc.id = element.getAttribute(ATT_ID);
-        desc.markerType = element.getAttribute(ATT_MARKER_TYPE);
-        desc.imagePath = element.getAttribute(ATT_ICON);
-        desc.className = element.getAttribute(ATT_PROVIDER_CLASS);
-        if (desc.imagePath != null) {
-            desc.imageDescriptor = getImageDescriptor(desc);
-        }
-        if (desc.className == null) {
-            //Don't need to keep these references.
-            desc.element = null;
-            desc.pluginBundle = null;
-        }
-        descriptors.add(desc);
-    }
-
-    /**
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(Object)
-     */
-    public ImageDescriptor getImageDescriptor(IMarker marker) {
-        int size = descriptors.size();
-        for (int i = 0; i < size; i++) {
-            Descriptor desc = (Descriptor) descriptors.get(i);
-            try {
-                if (marker.isSubtypeOf(desc.markerType)) {
-                    if (desc.className != null) {
-                    	if (desc.pluginBundle.getState()==Bundle.ACTIVE) {
-                            //-- Get the image descriptor from the provider.
-                            //-- Save the image descriptor url as a persistable property, so a
-                            //image descriptor can be created without activating the plugin next
-                            //time the workbench is started.
-                            if (desc.provider == null) {
-								desc.provider = (IMarkerImageProvider) IDEWorkbenchPlugin
-                                        .createExtension(desc.element,
-                                                ATT_PROVIDER_CLASS);
-							}
-                            String path = desc.provider.getImagePath(marker);
-                            if (path != desc.imagePath) {
-                                desc.imagePath = path;
-                                desc.imageDescriptor = getImageDescriptor(desc);
-                                return desc.imageDescriptor;
-                            }
-                            return desc.imageDescriptor;
-                        } else {
-                            if (desc.imageDescriptor == null) {
-                                //Create a image descriptor to be used until the plugin gets activated.
-                                desc.imagePath = (String) marker
-                                        .getAttribute(MARKER_ATT_KEY);
-                                desc.imageDescriptor = getImageDescriptor(desc);
-                            }
-                            return desc.imageDescriptor;
-                        }
-                    } else if (desc.imageDescriptor != null) {
-                        return desc.imageDescriptor;
-                    }
-                }
-            } catch (CoreException e) {
-            	Policy.handle(e);
-            	return null;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the image descriptor with the given relative path.
-     */
-    ImageDescriptor getImageDescriptor(Descriptor desc) {
-       URL url = Platform.find(desc.pluginBundle, new Path(desc.imagePath));
-       return ImageDescriptor.createFromURL(url);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerQuery.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerQuery.java
deleted file mode 100644
index 7adcf18..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerQuery.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.registry;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.internal.ide.Policy;
-
-/**
- * Instances of this class hold a marker type id and/or 
- * a series of marker attributes. This information may be used 
- * to determine if a given marker is of the same marker
- * type and determine its values for the attributes.
- */
-public class MarkerQuery {
-    /**
-     * The marker type targetted by this query. 
-     * May be <code>null</code>.
-     */
-    private String type;
-
-    /**
-     * A sorted list of the attributes targetted by this query.
-     * The list is sorted from least to greatest according to
-     * <code>Sting.compare</code>
-     */
-    private String[] attributes;
-
-    /**
-     * Cached hash code value
-     */
-    private int hashCode;
-
-    /**
-     * Creates a new marker query with the given type
-     * and attributes.
-     * <p>
-     * The type may be <code>null</code>. The attributes may 
-     * be empty, but not <code>null</code>.
-     * </p>
-     * 
-     * @param markerType the targetted marker type
-     * @param markerAttributes the targetted marker attributes
-     */
-    public MarkerQuery(String markerType, String[] markerAttributes) {
-        if (markerAttributes == null) {
-            throw new IllegalArgumentException();
-        }
-
-        type = markerType;
-        attributes = markerAttributes;
-        computeHashCode();
-    }
-
-    /**
-     * Performs a query against the given marker.
-     * <p>
-     * Returns a <code>MarkerQueryResult</code> if the marker
-     * is appropriate for this query (correct type and has
-     * all of the query attributes), otherwise <code>null</code>
-     * is returned.
-     * 
-     * @param marker the marker to perform the query against
-     * @return a marker query result or <code>null</code>
-     */
-    public MarkerQueryResult performQuery(IMarker marker) {
-        // Check type
-        try {
-            if (type != null && !type.equals(marker.getType())) {
-				return null;
-			}
-        } catch (CoreException e) {
-        	Policy.handle(e);
-            return null;
-        }
-
-        // Check attributes
-        String[] values = new String[attributes.length];
-        for (int i = 0; i < attributes.length; i++) {
-            try {
-                Object value = marker.getAttribute(attributes[i]);
-                if (value == null) {
-					return null;
-				}
-                values[i] = value.toString();
-            } catch (CoreException e) {
-            	Policy.handle(e);
-            	return null;
-            }
-        }
-
-        // Create and return the result
-        return new MarkerQueryResult(values);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Object.
-     */
-    public boolean equals(Object o) {
-        if (!(o instanceof MarkerQuery)) {
-			return false;
-		}
-
-        if (o == this) {
-			return true;
-		}
-
-        MarkerQuery mq = (MarkerQuery) o;
-        if (!(type == null ? mq.type == null : type.equals(mq.type))) {
-			return false;
-		}
-
-        if (attributes.length != mq.attributes.length) {
-			return false;
-		}
-
-        for (int i = 0; i < attributes.length; i++) {
-            if (!(attributes[i].equals(mq.attributes[i]))) {
-				return false;
-			}
-        }
-
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Object.
-     */
-    public int hashCode() {
-        return hashCode;
-    }
-
-    /**
-     * Computes the hash code for this instance.
-     */
-    public void computeHashCode() {
-        hashCode = 19;
-
-        if (type != null) {
-			hashCode = hashCode * 37 + type.hashCode();
-		}
-
-        for (int i = 0; i < attributes.length; i++) {
-            hashCode = hashCode * 37 + attributes[i].hashCode();
-        }
-    }
-
-    /**
-     * Returns the targetted marker type. May be 
-     * <code>null</code>
-     * 
-     * @return the targetted marker type
-     */
-    public String getType() {
-        return type;
-    }
-
-    /**
-     * Returns the targetted attributes.
-     * The array may be empty.
-     * 
-     * @return the targetted attributes
-     */
-    public String[] getAttributes() {
-        return attributes;
-    }
-}
-
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerQueryResult.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerQueryResult.java
deleted file mode 100644
index f2ca7d4..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/MarkerQueryResult.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.registry;
-
-/**
- * Instances of this class represent the result of a specific marker
- * query. Specifically they contain an ordered collection of marker 
- * attribute values.
- */
-
-public class MarkerQueryResult {
-    /**
-     * An ordered collection of marker attribute values.
-     */
-    private String[] values;
-
-    /**
-     * Cached hash code value
-     */
-    private int hashCode;
-
-    /**
-     * Creates a new marker query result with the given values.
-     * <p>
-     * The values may not be empty.
-     * </p>
-     * 
-     * @param markerAttributeValues the target marker's attribute values
-     */
-    public MarkerQueryResult(String[] markerAttributeValues) {
-        if (markerAttributeValues == null) {
-            throw new IllegalArgumentException();
-        }
-        values = markerAttributeValues;
-        computeHashCode();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Object.
-     */
-    public boolean equals(Object o) {
-        if (!(o instanceof MarkerQueryResult)) {
-			return false;
-		}
-
-        if (o == this) {
-			return true;
-		}
-
-        MarkerQueryResult mqr = (MarkerQueryResult) o;
-        if (values.length != mqr.values.length) {
-			return false;
-		}
-
-        for (int i = 0; i < values.length; i++) {
-            if (!(values[i].equals(mqr.values[i]))) {
-				return false;
-			}
-        }
-
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Object.
-     */
-    public int hashCode() {
-        return hashCode;
-    }
-
-    /**
-     * Computes the hash code for this instance.
-     */
-    public void computeHashCode() {
-        hashCode = 19;
-
-        for (int i = 0; i < values.length; i++) {
-            hashCode = hashCode * 37 + values[i].hashCode();
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/ProjectImageRegistry.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/ProjectImageRegistry.java
deleted file mode 100644
index 13b50f7..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/ProjectImageRegistry.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.registry;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Registry to hold mappings from project natures to images
- */
-
-public class ProjectImageRegistry {
-    private Map map = new HashMap(10);
-
-    /**
-     * Returns the image for the given nature id or
-     * <code>null</code> if no image is registered for the given id
-     */
-    public ImageDescriptor getNatureImage(String natureId) {
-        return (ImageDescriptor) map.get(natureId);
-    }
-
-    /**
-     * Reads from the plugin registry.
-     */
-    public void load() {
-        ProjectImageRegistryReader reader = new ProjectImageRegistryReader();
-        reader.readProjectNatureImages(Platform.getExtensionRegistry(), this);
-    }
-
-    /**
-     * Sets the image for the given nature id
-     */
-    public void setNatureImage(String natureId, ImageDescriptor image) {
-        map.put(natureId, image);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/ProjectImageRegistryReader.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/ProjectImageRegistryReader.java
deleted file mode 100644
index 32a83c3..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/registry/ProjectImageRegistryReader.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.registry;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * A strategy to project nature image extensions from the registry.
- */
-public class ProjectImageRegistryReader extends IDERegistryReader {
-    private static final String TAG_IMAGE = "image";//$NON-NLS-1$
-
-    private static final String ATT_ID = "id";//$NON-NLS-1$
-
-    private static final String ATT_NATURE_ID = "natureId";//$NON-NLS-1$
-
-    private static final String ATT_ICON = "icon";//$NON-NLS-1$
-
-    private ProjectImageRegistry registry;
-
-    /**
-     * Reads the contents of the given element
-     */
-    protected boolean readElement(IConfigurationElement element) {
-        if (!element.getName().equals(TAG_IMAGE)) {
-			return false;
-		}
-
-        String id = element.getAttribute(ATT_ID);
-        if (id == null) {
-            logMissingAttribute(element, ATT_ID);
-            return true;
-        }
-
-        String natureId = element.getAttribute(ATT_NATURE_ID);
-        if (natureId == null) {
-            logMissingAttribute(element, ATT_NATURE_ID);
-            return true;
-        }
-
-        String icon = element.getAttribute(ATT_ICON);
-        if (icon == null) {
-            logMissingAttribute(element, ATT_ICON);
-            return true;
-        }
-		String extendingPluginId = element.getNamespace();
-		ImageDescriptor image = AbstractUIPlugin.imageDescriptorFromPlugin(
-				extendingPluginId, icon);
-
-        if (image != null) {
-			registry.setNatureImage(natureId, image);
-		}
-
-        return true;
-    }
-
-    /**
-     * Read the project nature images within a registry.
-     */
-    public void readProjectNatureImages(IExtensionRegistry in,
-            ProjectImageRegistry out) {
-        registry = out;
-        readRegistry(in, IDEWorkbenchPlugin.IDE_WORKBENCH,
-                IDEWorkbenchPlugin.PL_PROJECT_NATURE_IMAGES);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/AbstractResourceDescription.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/AbstractResourceDescription.java
deleted file mode 100755
index 870f442..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/AbstractResourceDescription.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.undo;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourceAttributes;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ui.ide.undo.ResourceDescription;
-
-/**
- * Base implementation of ResourceDescription that describes the common
- * attributes of a resource to be created.
- * 
- * This class is not intended to be instantiated or used by clients.
- * 
- * @since 3.3
- * 
- */
-abstract class AbstractResourceDescription extends ResourceDescription {
-	IContainer parent;
-
-	long modificationStamp = IResource.NULL_STAMP;
-
-	long localTimeStamp = IResource.NULL_STAMP;
-
-	ResourceAttributes resourceAttributes;
-
-	MarkerDescription[] markerDescriptions;
-
-	/**
-	 * Create a resource description with no initial attributes
-	 */
-	protected AbstractResourceDescription() {
-		super();
-	}
-
-	/**
-	 * Create a resource description from the specified resource.
-	 * 
-	 * @param resource
-	 *            the resource to be described
-	 */
-	protected AbstractResourceDescription(IResource resource) {
-		super();
-		parent = resource.getParent();
-		if (resource.isAccessible()) {
-			modificationStamp = resource.getModificationStamp();
-			localTimeStamp = resource.getLocalTimeStamp();
-			resourceAttributes = resource.getResourceAttributes();
-			try {
-				IMarker[] markers = resource.findMarkers(null, true,
-						IResource.DEPTH_INFINITE);
-				markerDescriptions = new MarkerDescription[markers.length];
-				for (int i = 0; i < markers.length; i++) {
-					markerDescriptions[i] = new MarkerDescription(markers[i]);
-				}
-			} catch (CoreException e) {
-				// Eat this exception because it only occurs when the resource
-				// does not exist and we have already checked this.
-				// We do not want to throw exceptions on the simple constructor,
-				// as no one has actually tried to do anything yet.
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.ide.undo.ResourceDescription#createResource(org.eclipse
-	 * .core.runtime.IProgressMonitor)
-	 */
-	public IResource createResource(IProgressMonitor monitor)
-			throws CoreException {
-		IResource resource = createResourceHandle();
-		createExistentResourceFromHandle(resource, monitor);
-		restoreResourceAttributes(resource);
-		return resource;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.ResourceDescription#isValid()
-	 */
-	public boolean isValid() {
-		return parent == null || parent.exists();
-	}
-
-	/**
-	 * Restore any saved attributed of the specified resource. This method is
-	 * called after the existent resource represented by the receiver has been
-	 * created.
-	 * 
-	 * @param resource
-	 *            the newly created resource
-	 * @throws CoreException
-	 */
-	protected void restoreResourceAttributes(IResource resource)
-			throws CoreException {
-		if (modificationStamp != IResource.NULL_STAMP) {
-			resource.revertModificationStamp(modificationStamp);
-		}
-		if (localTimeStamp != IResource.NULL_STAMP) {
-			resource.setLocalTimeStamp(localTimeStamp);
-		}
-		if (resourceAttributes != null) {
-			resource.setResourceAttributes(resourceAttributes);
-		}
-		if (markerDescriptions != null) {
-			for (int i = 0; i < markerDescriptions.length; i++) {
-				if (markerDescriptions[i].resource.exists())
-					markerDescriptions[i].createMarker();
-			}
-		}
-	}
-
-	/*
-	 * Return the workspace.
-	 */
-	IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.undo.ResourceDescription#verifyExistence(boolean)
-	 */
-	public boolean verifyExistence(boolean checkMembers) {
-		IContainer p = parent;
-		if (p == null) {
-			p = getWorkspace().getRoot();
-		}
-		IResource handle = p.findMember(getName());
-		return handle != null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/ContainerDescription.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/ContainerDescription.java
deleted file mode 100644
index e47b976..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/ContainerDescription.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.undo;
-
-import java.net.URI;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.ui.ide.undo.ResourceDescription;
-
-/**
- * ContainerDescription is a lightweight description that describes a container
- * to be created.
- * 
- * This class is not intended to be instantiated or used by clients.
- * 
- * @since 3.3
- * 
- */
-public abstract class ContainerDescription extends AbstractResourceDescription {
-
-	String name;
-
-	URI location;
-
-	String defaultCharSet;
-
-	AbstractResourceDescription[] members;
-
-	/**
-	 * Create a container description from the specified container handle that
-	 * can be used to create the container. The returned ContainerDescription
-	 * should represent any non-existing parents in addition to the specified
-	 * container.
-	 * 
-	 * @param container
-	 *            the handle of the container to be described
-	 * @return a container description describing the container and any
-	 *         non-existing parents.
-	 */
-
-	public static ContainerDescription fromContainer(IContainer container) {
-		IPath fullPath = container.getFullPath();
-		ContainerDescription firstCreatedParent = null;
-		ContainerDescription currentContainerDescription = null;
-
-		// Does the container exist already? If so, then the parent exists and
-		// we use the normal creation constructor.
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		IContainer currentContainer = (IContainer) root.findMember(fullPath);
-		if (currentContainer != null) {
-			return (ContainerDescription) ResourceDescription
-					.fromResource(container);
-		}
-
-		// Create container descriptions for any uncreated parents in the given
-		// path.
-		currentContainer = root;
-		for (int i = 0; i < fullPath.segmentCount(); i++) {
-			String currentSegment = fullPath.segment(i);
-			IResource resource = currentContainer.findMember(currentSegment);
-			if (resource != null) {
-				// parent already exists, no need to create a description for it
-				currentContainer = (IContainer) resource;
-			} else {
-				if (i == 0) {
-					// parent does not exist and it is a project
-					firstCreatedParent = new ProjectDescription(root
-							.getProject(currentSegment));
-					currentContainerDescription = firstCreatedParent;
-				} else {
-					IFolder folderHandle = currentContainer.getFolder(new Path(
-							currentSegment));
-					ContainerDescription currentFolder = new FolderDescription(
-							folderHandle);
-					currentContainer = folderHandle;
-					if (currentContainerDescription != null) {
-						currentContainerDescription.addMember(currentFolder);
-					}
-					currentContainerDescription = currentFolder;
-					if (firstCreatedParent == null) {
-						firstCreatedParent = currentFolder;
-					}
-				}
-			}
-		}
-		return firstCreatedParent;
-	}
-
-	/**
-	 * Create a ContainerDescription with no state.
-	 */
-	public ContainerDescription() {
-
-	}
-
-	/**
-	 * Create a ContainerDescription from the specified container handle.
-	 * Typically used when the container handle represents a resource that
-	 * actually exists, although it will not fail if the resource is
-	 * non-existent.
-	 * 
-	 * @param container
-	 *            the container to be described
-	 */
-	public ContainerDescription(IContainer container) {
-		super(container);
-		this.name = container.getName();
-		if (container.isLinked()) {
-			this.location = container.getLocationURI();
-		}
-		try {
-			if (container.isAccessible()) {
-				defaultCharSet = container.getDefaultCharset(false);
-				IResource[] resourceMembers = container.members();
-				members = new AbstractResourceDescription[resourceMembers.length];
-				for (int i = 0; i < resourceMembers.length; i++) {
-					members[i] = (AbstractResourceDescription) ResourceDescription
-							.fromResource(resourceMembers[i]);
-				}
-			}
-		} catch (CoreException e) {
-			// Eat this exception because it only occurs when the resource
-			// does not exist and we have already checked this.
-			// We do not want to throw exceptions on the simple constructor, as
-			// no one has actually tried to do anything yet.
-		}
-	}
-
-	/**
-	 * Create any child resources known by this container description.
-	 * 
-	 * @param parentHandle
-	 *            the handle of the created parent
-	 * @param monitor
-	 *            the progress monitor to be used
-	 * @param ticks
-	 *            the number of ticks allocated for creating children
-	 * @throws CoreException
-	 */
-	protected void createChildResources(IContainer parentHandle,
-			IProgressMonitor monitor, int ticks) throws CoreException {
-
-		// restore any children
-		if (members != null && members.length > 0) {
-			for (int i = 0; i < members.length; i++) {
-				members[i].parent = parentHandle;
-				members[i].createResource(new SubProgressMonitor(monitor, ticks
-						/ members.length));
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.undo.ResourceDescription#recordStateFromHistory(org.eclipse.core.resources.IResource,
-	 *      org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void recordStateFromHistory(IResource resource,
-			IProgressMonitor monitor) throws CoreException {
-		monitor.beginTask(
-				UndoMessages.FolderDescription_SavingUndoInfoProgress, 100);
-		if (members != null) {
-			for (int i = 0; i < members.length; i++) {
-				if (members[i] instanceof FileDescription) {
-					IPath path = resource.getFullPath().append(
-							((FileDescription) members[i]).name);
-					IFile fileHandle = resource.getWorkspace().getRoot().getFile(
-							path);
-					members[i].recordStateFromHistory(fileHandle,
-							new SubProgressMonitor(monitor, 100 / members.length));
-				} else if (members[i] instanceof FolderDescription) {
-					IPath path = resource.getFullPath().append(
-							((FolderDescription) members[i]).name);
-					IFolder folderHandle = resource.getWorkspace().getRoot()
-							.getFolder(path);
-					members[i].recordStateFromHistory(folderHandle,
-							new SubProgressMonitor(monitor, 100 / members.length));
-				}
-			}
-		}
-		monitor.done();
-	}
-
-	/**
-	 * Return the name of the container described by this ContainerDescription.
-	 * 
-	 * @return the name of the container.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Return the first folder found that has no child folders.
-	 * 
-	 * @return the container description for the first child in the receiver
-	 *         that is a leaf, or this container if there are no children.
-	 */
-	public ContainerDescription getFirstLeafFolder() {
-		// If there are no members, this is a leaf
-		if (members == null || members.length == 0) {
-			return this;
-		}
-		// Traverse the members and find the first potential leaf
-		for (int i = 0; i < members.length; i++) {
-			if (members[i] instanceof ContainerDescription) {
-				return ((ContainerDescription) members[i]).getFirstLeafFolder();
-			}
-		}
-		// No child folders were found, this is a leaf
-		return this;
-	}
-
-	/**
-	 * Add the specified resource description as a member of this resource
-	 * description
-	 * 
-	 * @param member
-	 *            the resource description considered a member of this
-	 *            container.
-	 */
-	public void addMember(AbstractResourceDescription member) {
-		if (members == null) {
-			members = new AbstractResourceDescription[] { member };
-		} else {
-			AbstractResourceDescription[] expandedMembers = new AbstractResourceDescription[members.length + 1];
-			System.arraycopy(members, 0, expandedMembers, 0, members.length);
-			expandedMembers[members.length] = member;
-			members = expandedMembers;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.undo.ResourceDescription#restoreResourceAttributes(org.eclipse.core.resources.IResource)
-	 */
-	protected void restoreResourceAttributes(IResource resource)
-			throws CoreException {
-		super.restoreResourceAttributes(resource);
-		Assert.isLegal(resource instanceof IContainer);
-		IContainer container = (IContainer) resource;
-		if (defaultCharSet != null) {
-			container.setDefaultCharset(defaultCharSet, null);
-		}
-	}
-
-	/**
-	 * Set the location to which this container is linked.
-	 * 
-	 * @param location
-	 *            the location URI, or <code>null</code> if there is no link
-	 */
-	public void setLocation(URI location) {
-		this.location = location;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.undo.ResourceDescription#verifyExistence(boolean)
-	 */
-	public boolean verifyExistence(boolean checkMembers) {
-		boolean existence = super.verifyExistence(checkMembers);
-		if (existence) {
-			if (checkMembers) {
-				// restore any children
-				if (members != null && members.length > 0) {
-					for (int i = 0; i < members.length; i++) {
-						if (!members[i].verifyExistence(checkMembers)) {
-							return false;
-						}
-					}
-				}
-			}
-			return true;
-		}
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/FileDescription.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/FileDescription.java
deleted file mode 100644
index b842100..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/FileDescription.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.undo;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.net.URI;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFileState;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceStatus;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.SubProgressMonitor;
-
-/**
- * FileDescription is a lightweight description that describes a file to be
- * created.
- * 
- * This class is not intended to be instantiated or used by clients.
- * 
- * @since 3.3
- * 
- */
-public class FileDescription extends AbstractResourceDescription {
-
-	String name;
-
-	URI location;
-
-	String charset;
-
-	private IFileContentDescription fileContentDescription;
-
-	/**
-	 * Create a FileDescription that can be used to later restore the given
-	 * file. The file typically already exists, but this constructor will not
-	 * fail if the file does not exist.
-	 * 
-	 * @param file
-	 *            the file to be restored.
-	 */
-	public FileDescription(IFile file) {
-		super(file);
-		this.name = file.getName();
-		try {
-			this.charset = file.getCharset(false);
-		} catch (CoreException e) {
-			// we don't care, a null charset is fine.
-		}
-		if (file.isLinked()) {
-			location = file.getLocationURI();
-		}
-
-	}
-
-	/**
-	 * Create a file description from the specified file handle. The handle does
-	 * not exist, so no information should be derived from it. If a location
-	 * path is specified, this file should represent a link to another location.
-	 * The content description describes any state that should be used when the
-	 * file resource is created.
-	 * 
-	 * @param file
-	 *            the file to be described
-	 * @param linkLocation
-	 *            the location of the file's link, or <code>null</code> if the
-	 *            file is not linked
-	 * @param fileContentDescription
-	 *            the file content description that can be used to get
-	 *            information about the file, such as its initial content
-	 */
-	public FileDescription(IFile file, URI linkLocation,
-			IFileContentDescription fileContentDescription) {
-		super(file);
-		this.name = file.getName();
-		this.location = linkLocation;
-		this.charset = null;
-		this.fileContentDescription = fileContentDescription;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.undo.ResourceDescription#recordStateFromHistory(org.eclipse.core.resources.IResource,
-	 *      org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void recordStateFromHistory(IResource resource,
-			IProgressMonitor monitor) throws CoreException {
-		Assert.isLegal(resource.getType() == IResource.FILE);
-
-		if (location != null) {
-			// file is linked, no need to record any history
-			return;
-		}
-		IFileState[] states = ((IFile) resource).getHistory(monitor);
-		if (states.length > 0) {
-			final IFileState state = getMatchingFileState(states);
-			this.fileContentDescription = new IFileContentDescription() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.ui.internal.ide.undo.IFileContentDescription#exists()
-				 */
-				public boolean exists() {
-					return state.exists();
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.ui.internal.ide.undo.IFileContentDescription#getContents()
-				 */
-				public InputStream getContents() throws CoreException {
-					return state.getContents();
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.ui.internal.ide.undo.IFileContentDescription#getCharset()
-				 */
-				public String getCharset() throws CoreException {
-					return state.getCharset();
-				}
-			};
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.undo.ResourceDescription#createResourceHandle()
-	 */
-	public IResource createResourceHandle() {
-		IWorkspaceRoot workspaceRoot = parent.getWorkspace().getRoot();
-		IPath fullPath = parent.getFullPath().append(name);
-		return workspaceRoot.getFile(fullPath);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.undo.ResourceDescription#createExistentResourceFromHandle(org.eclipse.core.resources.IResource,
-	 *      org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void createExistentResourceFromHandle(IResource resource,
-			IProgressMonitor monitor) throws CoreException {
-
-		Assert.isLegal(resource instanceof IFile);
-		if (resource.exists()) {
-			return;
-		}
-		IFile fileHandle = (IFile) resource;
-		monitor.beginTask("", 200); //$NON-NLS-1$
-		monitor.setTaskName(UndoMessages.FileDescription_NewFileProgress);
-		try {
-			if (monitor.isCanceled()) {
-				throw new OperationCanceledException();
-			}
-			if (location != null) {
-				fileHandle.createLink(location, IResource.ALLOW_MISSING_LOCAL,
-						new SubProgressMonitor(monitor, 200));
-			} else {
-				InputStream contents = new ByteArrayInputStream(
-						UndoMessages.FileDescription_ContentsCouldNotBeRestored
-								.getBytes());
-				// Retrieve the contents from the file content
-				// description. Other file state attributes, such as timestamps,
-				// have already been retrieved from the original IResource
-				// object and are restored in #restoreResourceAttributes
-				if (fileContentDescription != null
-						&& fileContentDescription.exists()) {
-					contents = fileContentDescription.getContents();
-				}
-				fileHandle.create(contents, false, new SubProgressMonitor(
-						monitor, 100));
-				fileHandle.setCharset(charset, new SubProgressMonitor(monitor,
-						100));
-			}
-			if (monitor.isCanceled()) {
-				throw new OperationCanceledException();
-			}
-		} catch (CoreException e) {
-			if (e.getStatus().getCode() == IResourceStatus.PATH_OCCUPIED) {
-				fileHandle.refreshLocal(IResource.DEPTH_ZERO, null);
-			} else {
-				throw e;
-			}
-		} finally {
-			monitor.done();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.undo.ResourceDescription#isValid()
-	 */
-	public boolean isValid() {
-		if (location != null) {
-			return super.isValid();
-		}
-		return super.isValid() && fileContentDescription != null
-				&& fileContentDescription.exists();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.undo.ResourceDescription#getName()
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/*
-	 * Get the file state that matches this file description. The local time
-	 * stamp is used to try to find a matching file state. If none can be found,
-	 * the most recent copy of the file state is used.
-	 */
-	private IFileState getMatchingFileState(IFileState[] states) {
-		for (int i = 0; i < states.length; i++) {
-			if (localTimeStamp == states[i].getModificationTime()) {
-				return states[i];
-			}
-		}
-		return states[0];
-
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.undo.ResourceDescription#restoreResourceAttributes(org.eclipse.core.resources.IResource)
-	 */
-	protected void restoreResourceAttributes(IResource resource)
-			throws CoreException {
-		super.restoreResourceAttributes(resource);
-		Assert.isLegal(resource instanceof IFile);
-		IFile file = (IFile) resource;
-		if (charset != null) {
-			file.setCharset(charset, null);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/FolderDescription.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/FolderDescription.java
deleted file mode 100644
index f6d04b7..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/FolderDescription.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.ide.undo;
-
-import java.net.URI;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.SubProgressMonitor;
-
-/**
- * FolderDescription is a lightweight description that describes a folder to be
- * created.
- * 
- * This class is not intended to be instantiated or used by clients.
- * 
- * @since 3.3
- * 
- */
-public class FolderDescription extends ContainerDescription {
-
-	/**
-	 * Create a FolderDescription from the specified folder handle. Typically
-	 * used when the folder handle represents a resource that actually exists,
-	 * although it will not fail if the resource is non-existent.
-	 * 
-	 * @param folder
-	 *            the folder to be described
-	 */
-	public FolderDescription(IFolder folder) {
-		super(folder);
-	}
-
-	/**
-	 * Create a FolderDescription from the specified folder handle. If the
-	 * folder to be created should be linked to a different location, specify
-	 * the location.
-	 * 
-	 * @param folder
-	 *            the folder to be described
-	 * @param linkLocation
-	 *            the location to which the folder is linked, or
-	 *            <code>null</code> if it is not linked
-	 */
-	public FolderDescription(IFolder folder, URI linkLocation) {
-		super(folder);
-		this.name = folder.getName();
-		this.location = linkLocation;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.undo.ContainerDescription#createResourceHandle()
-	 */
-	public IResource createResourceHandle() {
-		IWorkspaceRoot workspaceRoot = getWorkspace().getRoot();
-		IPath folderPath = parent.getFullPath().append(name);
-		return workspaceRoot.getFolder(folderPath);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.undo.ResourceDescription#createExistentResourceFromHandle(org.eclipse.core.resources.IResource,
-	 *      org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void createExistentResourceFromHandle(IResource resource,
-			IProgressMonitor monitor) throws CoreException {
-
-		Assert.isLegal(resource instanceof IFolder);
-		if (resource.exists()) {
-			return;
-		}
-		IFolder folderHandle = (IFolder) resource;
-		try {
-			monitor.beginTask("", 200); //$NON-NLS-1$
-			monitor.setTaskName(UndoMessages.FolderDescription_NewFolderProgress);
-			if (monitor.isCanceled()) {
-				throw new OperationCanceledException();
-			}
-			if (location != null) {
-				folderHandle.createLink(location,
-						IResource.ALLOW_MISSING_LOCAL, new SubProgressMonitor(
-								monitor, 100));
-			} else {
-				folderHandle.create(false, true, new SubProgressMonitor(
-						monitor, 100));
-			}
-			if (monitor.isCanceled()) {
-				throw new OperationCanceledException();
-			}
-			createChildResources(folderHandle, monitor, 100);
-
-		} finally {
-			monitor.done();
-		}
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/IFileContentDescription.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/IFileContentDescription.java
deleted file mode 100644
index 1b108fa..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/IFileContentDescription.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.ide.undo;
-
-import java.io.InputStream;
-
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * IFileContentDescription is a description of a file's content.
- * 
- * This class is not intended to be instantiated or used by clients.
- * 
- * @since 3.3
- * 
- */
-public interface IFileContentDescription {
-	/**
-	 * Returns an open input stream on the contents of the file described. The
-	 * client is responsible for closing the stream when finished.
-	 * 
-	 * @return an input stream containing the contents of the file
-	 * @throws CoreException
-	 *             any CoreException encountered retrieving the contents
-	 */
-	public InputStream getContents() throws CoreException;
-
-	/**
-	 * Returns whether this file content description still exists. If it does
-	 * not exist, it will be unable to produce the contents.
-	 * 
-	 * @return <code>true</code> if this description exists, and
-	 *         <code>false</code> if it does not
-	 */
-	public boolean exists();
-
-	/**
-	 * Returns the name of a charset encoding to be used when decoding the
-	 * contents into characters. Returns <code>null</code> if a charset
-	 * has not been explicitly specified.
-	 * 
-	 * @return the name of a charset, or <code>null</code>
-	 * @throws CoreException
-	 *             any CoreException encountered while determining the character
-	 *             set
-	 * 
-	 */
-	public String getCharset() throws CoreException;
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/MarkerDescription.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/MarkerDescription.java
deleted file mode 100644
index cb45b59..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/MarkerDescription.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.ide.undo;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * MarkerDescription is a lightweight description of a marker that can be used
- * to describe a marker to be created or updated.
- * 
- * This class is not intended to be instantiated or used by clients.
- * 
- * @since 3.3
- * 
- */
-public class MarkerDescription {
-	String type;
-
-	Map attributes;
-
-	IResource resource;
-
-	/**
-	 * 
-	 * Create a marker description from the specified marker.
-	 * 
-	 * @param marker
-	 *            the marker to be described
-	 * @throws CoreException
-	 */
-	public MarkerDescription(IMarker marker) throws CoreException {
-		this.type = marker.getType();
-		this.attributes = marker.getAttributes();
-		this.resource = marker.getResource();
-
-	}
-
-	/**
-	 * Create a marker description from the specified marker type, attributes,
-	 * and resource.
-	 * 
-	 * @param type
-	 *            the type of marker to be created.
-	 * @param attributes
-	 *            the attributes to be assigned to the marker
-	 * @param resource
-	 *            the resource on which the marker should be created
-	 */
-	public MarkerDescription(String type, Map attributes, IResource resource) {
-		this.type = type;
-		this.attributes = attributes;
-		this.resource = resource;
-	}
-
-	/**
-	 * Create a marker from the marker description.
-	 * 
-	 * @return the created marker
-	 * @throws CoreException
-	 */
-	public IMarker createMarker() throws CoreException {
-		IMarker marker = resource.createMarker(type);
-		marker.setAttributes(attributes);
-		return marker;
-	}
-
-	/**
-	 * Update an existing marker using the attributes in the marker description.
-	 * 
-	 * @param marker
-	 *            the marker to be updated
-	 * @throws CoreException
-	 */
-	public void updateMarker(IMarker marker) throws CoreException {
-		marker.setAttributes(attributes);
-	}
-
-	/**
-	 * Return the resource associated with this marker.
-	 * 
-	 * @return the resource associated with this marker
-	 */
-	public IResource getResource() {
-		return resource;
-	}
-
-	/**
-	 * Return the marker type associated with this marker.
-	 * 
-	 * @return the string marker type of this marker
-	 */
-	public String getType() {
-		return type;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/ProjectDescription.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/ProjectDescription.java
deleted file mode 100644
index c62aeeb..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/ProjectDescription.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.ide.undo;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.SubProgressMonitor;
-
-/**
- * ProjectDescription is a lightweight description that describes a project to
- * be created.
- * 
- * This class is not intended to be instantiated or used by clients.
- * 
- * @since 3.3
- * 
- */
-public class ProjectDescription extends ContainerDescription {
-
-	private IProjectDescription projectDescription;
-	private boolean openOnCreate = true;
-
-	/**
-	 * Create a project description from a specified project.
-	 * 
-	 * @param project
-	 *            The project to be described. The project must exist.
-	 */
-	public ProjectDescription(IProject project) {
-		super(project);
-		Assert.isLegal(project.exists());
-		if (project.isOpen()) {
-			try {
-				this.projectDescription = project.getDescription();
-			} catch (CoreException e) {
-				// Eat this exception because it only occurs when the project
-				// is not accessible and we have already checked this. We
-				// don't want to propagate the CoreException into the
-				// constructor
-				// API.
-			}
-		} else {
-			openOnCreate = false;
-		}
-	}
-
-	/**
-	 * Create a project description from a specified IProjectDescription. Used
-	 * when the project does not yet exist.
-	 * 
-	 * @param projectDescription
-	 *            the project description for the future project
-	 */
-	public ProjectDescription(IProjectDescription projectDescription) {
-		super();
-		this.projectDescription = projectDescription;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.undo.ContainerDescription#createResourceHandle()
-	 */
-	public IResource createResourceHandle() {
-		return ResourcesPlugin.getWorkspace().getRoot().getProject(getName());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.undo.ResourceDescription#createExistentResourceFromHandle(org.eclipse.core.resources.IResource,
-	 *      org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void createExistentResourceFromHandle(IResource resource,
-			IProgressMonitor monitor) throws CoreException {
-		Assert.isLegal(resource instanceof IProject);
-		if (resource.exists()) {
-			return;
-		}
-		IProject projectHandle = (IProject) resource;
-		monitor.beginTask("", 200); //$NON-NLS-1$
-		monitor.setTaskName(UndoMessages.FolderDescription_NewFolderProgress);
-		if (projectDescription == null) {
-			projectHandle.create(new SubProgressMonitor(monitor, 100));
-		} else {
-			projectHandle.create(projectDescription, new SubProgressMonitor(
-					monitor, 100));
-		}
-
-		if (monitor.isCanceled()) {
-			throw new OperationCanceledException();
-		}
-		if (openOnCreate) {
-			projectHandle.open(IResource.NONE,
-					new SubProgressMonitor(monitor, 100));
-		}
-		monitor.done();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.undo.ContainerDescription#getName()
-	 */
-	public String getName() {
-		if (projectDescription != null) {
-			return projectDescription.getName();
-		}
-		return super.getName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.ide.undo.ResourceDescription#verifyExistence(boolean)
-	 */
-	public boolean verifyExistence(boolean checkMembers) {
-		// We can only check members if the project is open.
-		IProject projectHandle = (IProject) createResourceHandle();
-		if (projectHandle.isAccessible()) {
-			return super.verifyExistence(checkMembers);
-		}
-		return super.verifyExistence(false);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/UndoMessages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/UndoMessages.java
deleted file mode 100644
index efe4c05..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/UndoMessages.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.ide.undo;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * UndoMessages is the class that handles the messages for performing workspace
- * undo and redo.
- * 
- * @since 3.3
- */
-public class UndoMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.ide.undo.messages"; //$NON-NLS-1$
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, UndoMessages.class);
-	}
-
-	public static String AbstractWorkspaceOperation_ExecuteErrorTitle;
-	public static String AbstractWorkspaceOperation_RedoErrorTitle;
-	public static String AbstractWorkspaceOperation_UndoErrorTitle;
-	public static String AbstractWorkspaceOperation_SideEffectsWarningTitle;
-	public static String AbstractWorkspaceOperation_ExecuteSideEffectsWarningMessage;
-	public static String AbstractWorkspaceOperation_UndoSideEffectsWarningMessage;
-	public static String AbstractWorkspaceOperation_RedoSideEffectsWarningMessage;
-	public static String AbstractWorkspaceOperation_ErrorInvalidMessage;
-	public static String AbstractWorkspaceOperation_GenericWarningMessage;
-	
-	public static String AbstractResourcesOperation_ResourcesDoNotExist;
-	public static String AbstractResourcesOperation_ResourcesAlreadyExist;
-	public static String AbstractResourcesOperation_NotEnoughInfo;
-	public static String AbstractResourcesOperation_InvalidRestoreInfo;
-	public static String AbstractResourcesOperation_DeleteResourcesProgress;
-	public static String AbstractResourcesOperation_CreateResourcesProgress;
-	public static String AbstractResourcesOperation_CopyingResourcesProgress;
-	public static String AbstractResourcesOperation_MovingResources;
-	public static String AbstractResourcesOperation_outOfSyncError;
-	public static String AbstractResourcesOperation_outOfSyncQuestion;
-	public static String AbstractResourcesOperation_deletionMessageTitle;
-	public static String AbstractResourcesOperation_deletionExceptionMessage;
-	
-	public static String AbstractCopyOrMoveResourcesOperation_SameNameOrLocation;
-	public static String AbstractCopyOrMoveResourcesOperation_ResourceDoesNotExist;
-	public static String AbstractCopyOrMoveResourcesOperation_copyProjectProgress;
-	public static String AbstractCopyOrMoveResourcesOperation_moveProjectProgress;
-	
-	public static String CopyResourcesOperation_NotAllowedDueToDataLoss;
-	
-	public static String ProjectDescription_NewProjectProgress;
-	public static String FileDescription_NewFileProgress;
-	public static String FileDescription_SavingUndoInfoProgress;
-	public static String FileDescription_ContentsCouldNotBeRestored;
-	public static String FolderDescription_NewFolderProgress;
-	public static String FolderDescription_SavingUndoInfoProgress;
-	
-
-	public static String MarkerOperation_ResourceDoesNotExist;
-	public static String MarkerOperation_MarkerDoesNotExist;
-	public static String MarkerOperation_NotEnoughInfo;	
-	public static String MarkerOperation_CreateProgress;
-	public static String MarkerOperation_DeleteProgress;
-	public static String MarkerOperation_UpdateProgress;
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/WorkspaceUndoMonitor.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/WorkspaceUndoMonitor.java
deleted file mode 100644
index a181a5f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/WorkspaceUndoMonitor.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.ide.undo;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IAdvancedUndoableOperation;
-import org.eclipse.core.commands.operations.IAdvancedUndoableOperation2;
-import org.eclipse.core.commands.operations.IOperationHistory;
-import org.eclipse.core.commands.operations.IOperationHistoryListener;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.commands.operations.OperationHistoryEvent;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.Policy;
-
-/**
- * WorkspaceUndoMonitor monitors the workspace for resource changes and
- * periodically checks the undo history to make sure it is valid.
- * 
- * This class is not intended to be instantiated or used by clients.
- * 
- * @since 3.3
- * 
- */
-public class WorkspaceUndoMonitor {
-
-	/**
-	 * Singleton instance.
-	 */
-	private static WorkspaceUndoMonitor instance;
-
-	/**
-	 * Number of workspace changes that will cause validation of undo history
-	 */
-	private static int CHANGE_THRESHHOLD = 10;
-
-	/**
-	 * Prefix to use on debug info
-	 */
-	private static String DEBUG_PREFIX = "Workspace Undo Monitor:  "; //$NON-NLS-1$
-
-	/**
-	 * Get the singleton instance of this class.
-	 * 
-	 * @return the singleton instance of this class.
-	 */
-	public static WorkspaceUndoMonitor getInstance() {
-		if (instance == null) {
-			instance = new WorkspaceUndoMonitor();
-		}
-		return instance;
-	}
-
-	/**
-	 * Number of workspace changes that have occurred since the last undoable
-	 * operation was executed, undone, or redone.
-	 */
-	private int numChanges = 0;
-
-	/**
-	 * The IUndoableOperation in progress, or <code>null</code> if there is
-	 * none in progress.
-	 */
-	private IUndoableOperation operationInProgress = null;
-
-	/**
-	 * Resource listener used to determine how often to validate the workspace
-	 * undo history.
-	 */
-	private IResourceChangeListener resourceListener;
-
-	/**
-	 * Operation history listener used to determine whether there is an undoable
-	 * operation in progress.
-	 */
-	private IOperationHistoryListener historyListener;
-
-	/**
-	 * Construct an instance. Should only be called by {@link #getInstance()}
-	 */
-	private WorkspaceUndoMonitor() {
-		if (Policy.DEBUG_UNDOMONITOR) {
-			System.out.println(DEBUG_PREFIX + "Installing listeners"); //$NON-NLS-1$
-		}
-		resourceListener = getResourceChangeListener();
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(
-				resourceListener);
-
-		historyListener = getOperationHistoryListener();
-		getOperationHistory().addOperationHistoryListener(historyListener);
-
-	}
-
-	/**
-	 * Get a change listener for listening to resource changes.
-	 * 
-	 * @return the resource change listeners
-	 */
-	private IResourceChangeListener getResourceChangeListener() {
-		return new IResourceChangeListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-			 */
-			public void resourceChanged(IResourceChangeEvent event) {
-				// If there is an operation in progress, this event is to be
-				// ignored.
-				if (operationInProgress != null) {
-					return;
-				}
-				if (event.getType() == IResourceChangeEvent.POST_CHANGE
-						|| event.getType() == IResourceChangeEvent.POST_BUILD) {
-					// For now, we consider any change a change worth tracking.
-					// We can be more specific later if warranted.
-					incrementChangeCount();
-					if (numChanges >= CHANGE_THRESHHOLD) {
-						checkOperationHistory();
-					}
-				}
-			}
-		};
-	}
-
-	/**
-	 * Get a change listener for listening to operation history changes.
-	 * 
-	 * @return the resource change listeners
-	 */
-	private IOperationHistoryListener getOperationHistoryListener() {
-		return new IOperationHistoryListener() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.commands.operations.IOperationHistoryListener#historyNotification(org.eclipse.core.commands.operations.OperationHistoryEvent)
-			 */
-			public void historyNotification(OperationHistoryEvent event) {
-				// We only care about events that have the workspace undo
-				// context.
-				if (!event.getOperation().hasContext(
-						WorkspaceUndoUtil.getWorkspaceUndoContext())) {
-					return;
-				}
-				switch (event.getEventType()) {
-				case OperationHistoryEvent.ABOUT_TO_EXECUTE:
-				case OperationHistoryEvent.ABOUT_TO_UNDO:
-				case OperationHistoryEvent.ABOUT_TO_REDO:
-					operationInProgress = event.getOperation();
-					break;
-				case OperationHistoryEvent.DONE:
-				case OperationHistoryEvent.UNDONE:
-				case OperationHistoryEvent.REDONE:
-					resetChangeCount();
-					operationInProgress = null;
-					break;
-				case OperationHistoryEvent.OPERATION_NOT_OK:
-					operationInProgress = null;
-					break;
-				}
-			}
-
-		};
-	}
-
-	/**
-	 * Shutdown the workspace undo monitor. Unhooks the listeners.
-	 */
-	public void shutdown() {
-		if (Policy.DEBUG_UNDOMONITOR) {
-			System.out.println(DEBUG_PREFIX + "Shutting Down"); //$NON-NLS-1$
-		}
-
-		if (resourceListener != null) {
-			ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-					resourceListener);
-		}
-		if (historyListener != null) {
-			getOperationHistory().removeOperationHistoryListener(
-					historyListener);
-		}
-	}
-
-	/**
-	 * Get the operation history.
-	 */
-	private IOperationHistory getOperationHistory() {
-		return PlatformUI.getWorkbench().getOperationSupport()
-				.getOperationHistory();
-	}
-
-	/**
-	 * Check the pending undoable operation to see if it is still valid.
-	 */
-	private void checkOperationHistory() {
-		if (Policy.DEBUG_UNDOMONITOR) {
-			System.out.println(DEBUG_PREFIX + "Checking Operation History..."); //$NON-NLS-1$
-		}
-		IUndoableOperation currentOp = getOperationHistory().getUndoOperation(
-				WorkspaceUndoUtil.getWorkspaceUndoContext());
-		// If there is no pending op, nothing to do.
-		if (currentOp == null) {
-			resetChangeCount();
-			return;
-		}
-		// First try the simple check
-		if (!currentOp.canUndo()) {
-			flushWorkspaceHistory(currentOp);
-			return;
-		}
-		// Now try a more advanced check. If the undoable status is definitely
-		// an error, flush the history. Anything less than an error status
-		// should be left alone so that the user can be prompted as to what
-		// should be done when an undo is actually attempted.
-		if (currentOp instanceof IAdvancedUndoableOperation
-				&& currentOp instanceof IAdvancedUndoableOperation2) {
-			((IAdvancedUndoableOperation2) currentOp).setQuietCompute(true);
-			IStatus status;
-			try {
-				status = ((IAdvancedUndoableOperation) currentOp)
-						.computeUndoableStatus(null);
-			} catch (ExecutionException e) {
-				// Things are not really OK, but we do not want to
-				// interrupt the user with notification of this problem.
-				// For now, we pretend that everything is OK, knowing that
-				// computation will occur again just before the user attempts to
-				// undo this operation.
-				status = Status.OK_STATUS;
-			}
-			((IAdvancedUndoableOperation2) currentOp).setQuietCompute(false);
-			if (status.getSeverity() == IStatus.ERROR) {
-				flushWorkspaceHistory(currentOp);
-			}
-		}
-		resetChangeCount();
-	}
-
-	/**
-	 * Flush the undo and redo history for the workspace undo context.
-	 */
-	private void flushWorkspaceHistory(IUndoableOperation op) {
-		if (Policy.DEBUG_UNDOMONITOR) {
-			System.out.println(DEBUG_PREFIX
-					+ "Flushing undo history due to " + op); //$NON-NLS-1$
-		}
-		getOperationHistory().dispose(
-				WorkspaceUndoUtil.getWorkspaceUndoContext(), true, true, false);
-	}
-
-	/**
-	 * Reset the workspace change count
-	 */
-	private void resetChangeCount() {
-		numChanges = 0;
-		if (Policy.DEBUG_UNDOMONITOR) {
-			System.out.println(DEBUG_PREFIX + "Resetting change count to 0"); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Increment the workspace change count
-	 */
-	private void incrementChangeCount() {
-		numChanges++;
-		if (Policy.DEBUG_UNDOMONITOR) {
-			System.out
-					.println(DEBUG_PREFIX
-							+ "Incrementing workspace change count.  Count = " + numChanges); //$NON-NLS-1$
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/messages.properties b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/messages.properties
deleted file mode 100644
index 9500291..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/undo/messages.properties
+++ /dev/null
@@ -1,55 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-AbstractWorkspaceOperation_ExecuteErrorTitle=Error while executing the "{0}" operation
-AbstractWorkspaceOperation_ErrorInvalidMessage=The operation {0} is no longer valid.
-AbstractWorkspaceOperation_GenericWarningMessage=The operation {0} may not complete as expected. 
-AbstractWorkspaceOperation_RedoErrorTitle=Error while redoing the "{0}" operation
-AbstractWorkspaceOperation_UndoErrorTitle=Error while undoing the "{0}" operation
-
-AbstractWorkspaceOperation_SideEffectsWarningTitle=Side effects
-AbstractWorkspaceOperation_ExecuteSideEffectsWarningMessage=Executing "{0}" may have undesirable side effects.
-AbstractWorkspaceOperation_UndoSideEffectsWarningMessage=Undoing "{0}" may have undesirable side effects.
-AbstractWorkspaceOperation_RedoSideEffectsWarningMessage=Redoing "{0}" may have undesirable side effects.
-
-AbstractResourcesOperation_ResourcesDoNotExist=Cannot complete operation because resources no longer exist.
-AbstractResourcesOperation_ResourcesAlreadyExist=Cannot create or restore resource because it already exists.
-AbstractResourcesOperation_NotEnoughInfo=There is not enough information to complete the resource operation.
-AbstractResourcesOperation_InvalidRestoreInfo=There is not enough information to create or restore the resource.
-AbstractResourcesOperation_DeleteResourcesProgress=Deleting resources...
-AbstractResourcesOperation_CreateResourcesProgress=Creating resources...
-AbstractResourcesOperation_CopyingResourcesProgress=Copying resources...
-AbstractResourcesOperation_MovingResources=Moving resources...
-AbstractResourcesOperation_outOfSyncError = Resource is out of sync with the file system. Refresh and try again.
-AbstractResourcesOperation_outOfSyncQuestion = Resource ''{0}'' is out of sync with the file system. Do you want to delete it anyway?
-AbstractResourcesOperation_deletionMessageTitle = Problems deleting
-AbstractResourcesOperation_deletionExceptionMessage=Multiple problems occurred while deleting resources.
-
-AbstractCopyOrMoveResourcesOperation_SameNameOrLocation=Resource cannot be moved or copied to the same location and name.
-AbstractCopyOrMoveResourcesOperation_ResourceDoesNotExist=Resource no longer exists in the workspace.
-AbstractCopyOrMoveResourcesOperation_copyProjectProgress=Copying project...
-AbstractCopyOrMoveResourcesOperation_moveProjectProgress=Moving project...
-
-CopyResourcesOperation_NotAllowedDueToDataLoss=The original resources that were copied no longer exist.  Undoing the copy is no longer valid, since data could be lost.
-
-ProjectDescription_NewProjectProgress=Creating new project...
-FileDescription_NewFileProgress=Creating new file...
-FileDescription_ContentsCouldNotBeRestored=Unexpected error.  File contents could not be restored from local history during undo/redo.
-FileDescription_SavingUndoInfoProgress=Saving file info...
-FolderDescription_NewFolderProgress=Creating new folder...
-FolderDescription_SavingUndoInfoProgress=Saving folder info...
-	
-MarkerOperation_ResourceDoesNotExist=Cannot complete operation because resource no longer exists.
-MarkerOperation_MarkerDoesNotExist=Cannot complete operation because marker no longer exists.
-MarkerOperation_NotEnoughInfo=There is not enough information to perform the marker operation.
-MarkerOperation_CreateProgress=Creating markers...
-MarkerOperation_DeleteProgress=Deleting markers...
-MarkerOperation_UpdateProgress= Updating markers...
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/bookmarkexplorer/BookmarkMessages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/bookmarkexplorer/BookmarkMessages.java
deleted file mode 100644
index 5c9a1a2..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/bookmarkexplorer/BookmarkMessages.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.bookmarkexplorer;
-
-import org.eclipse.osgi.util.NLS;
-
-public class BookmarkMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.views.bookmarkexplorer.messages";//$NON-NLS-1$
-	//
-	// Copyright (c) 2000, 2003 IBM Corporation and others.
-	// All rights reserved. This program and the accompanying materials
-	// are made available under the terms of the Eclipse Public License v1.0
-	// which accompanies this distribution, and is available at
-	// http://www.eclipse.org/legal/epl-v10.html
-	//
-	// Contributors:
-	//     IBM Corporation - initial API and implementation
-	//
-
-	// package: org.eclipse.ui.views.bookmarkexplorer
-
-
-	public static String CopyBookmark_text;
-
-	public static String PasteBookmark_text;
-	public static String PasteBookmark_undoText;
-	public static String PasteBookmark_errorTitle;
-
-	public static String OpenBookmark_text;
-	public static String OpenBookmark_toolTip;
-	public static String OpenBookmark_errorTitle;
-
-	public static String RemoveBookmark_text;
-	public static String RemoveBookmark_undoText;
-	public static String RemoveBookmark_toolTip;
-	public static String RemoveBookmark_errorTitle;
-
-	public static String SelectAll_text;
-	public static String SelectAll_toolTip;
-
-	public static String Properties_text;
-
-	public static String ColumnDescription_text;
-	public static String ColumnResource_text;
-	public static String ColumnFolder_text;
-	public static String ColumnLocation_text;
-	public static String ColumnCreationTime_text;
-	
-	public static String Error_text;
-
-	public static String LineIndicator_text;
-
-	public static String ColumnIcon_header;
-	public static String ColumnDescription_header;
-	public static String ColumnResource_header;
-	public static String ColumnFolder_header;
-	public static String ColumnLocation_header;
-
-	public static String ColumnDescription_dialogText;
-	public static String ColumnResource_dialogText;
-	public static String ColumnFolder_dialogText;
-	public static String ColumnLocation_dialogText;
-
-	public static String SortMenuGroup_text;
-	public static String SortDirectionAscending_text;
-	public static String SortDirectionDescending_text;
-
-	public static String PropertiesDialogTitle_text;
-	public static String MarkerCreationTime_text;
-
-	public static String CopyToClipboardProblemDialog_title;
-	public static String CopyToClipboardProblemDialog_message;
-
-	public static String CreateBookmark_undoText;
-	public static String ModifyBookmark_undoText;	
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, BookmarkMessages.class);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/bookmarkexplorer/messages.properties b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/bookmarkexplorer/messages.properties
deleted file mode 100644
index 2e4ae7c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/bookmarkexplorer/messages.properties
+++ /dev/null
@@ -1,73 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-# package: org.eclipse.ui.views.bookmarkexplorer
-
-
-# ==============================================================================
-# Bookmarks View
-# ==============================================================================
-
-CopyBookmark_text = &Copy
-
-PasteBookmark_text = &Paste
-PasteBookmark_undoText = Paste Bookmark
-PasteBookmark_errorTitle = Error pasting bookmark(s)
-
-OpenBookmark_text = &Go To
-OpenBookmark_toolTip = Go To
-OpenBookmark_errorTitle = Problems Opening Editor
-
-RemoveBookmark_text = &Delete
-RemoveBookmark_toolTip = Delete
-RemoveBookmark_undoText = Delete Bookmark
-RemoveBookmark_errorTitle = Error deleting bookmarks
-
-SelectAll_text = Select A&ll
-SelectAll_toolTip = Select All
-
-Properties_text = P&roperties
-
-ColumnDescription_text = by &Description
-ColumnResource_text = by &Resource
-ColumnFolder_text = by &Folder
-ColumnLocation_text = by &Location
-ColumnCreationTime_text = by &Creation Time
-
-LineIndicator_text = line {0}
-
-ColumnIcon_header =
-ColumnDescription_header = Description
-ColumnResource_header = Resource
-ColumnFolder_header = In Folder
-ColumnLocation_header = Location
-
-ColumnDescription_dialogText = Description:
-ColumnResource_dialogText = Resource:
-ColumnFolder_dialogText = In Folder:
-ColumnLocation_dialogText = Location:
-
-SortMenuGroup_text = &Sort
-SortDirectionAscending_text = &Ascending
-SortDirectionDescending_text = D&escending
-
-PropertiesDialogTitle_text = Bookmark Properties
-
-MarkerCreationTime_text = &Creation Time:
-
-Error_text = &Error
-
-CopyToClipboardProblemDialog_title=Problem Copying to Clipboard
-CopyToClipboardProblemDialog_message=There was a problem when accessing the system clipboard. Retry?
-
-CreateBookmark_undoText=Add Bookmark
-ModifyBookmark_undoText=Modify Bookmark
-
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/framelist/FrameListMessages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/framelist/FrameListMessages.java
deleted file mode 100644
index a08606c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/framelist/FrameListMessages.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2005 IBM Corporation and others. All rights reserved.   This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ui.internal.views.framelist;
-
-import org.eclipse.osgi.util.NLS;
-
-public class FrameListMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.views.framelist.messages";//$NON-NLS-1$
-
-	// ==============================================================================
-	// FrameList
-	// ==============================================================================
-	public static String Back_text;
-	public static String Back_toolTip;
-	public static String Back_toolTipOneArg;
-
-	public static String Forward_text;
-	public static String Forward_toolTip;
-	public static String Forward_toolTipOneArg;
-
-	public static String GoInto_text;
-	public static String GoInto_toolTip;
-
-	public static String Up_text;
-	public static String Up_toolTip;
-	public static String Up_toolTipOneArg;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, FrameListMessages.class);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/framelist/messages.properties b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/framelist/messages.properties
deleted file mode 100644
index 66da4cf..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/framelist/messages.properties
+++ /dev/null
@@ -1,31 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-# package: org.eclipse.ui.views.framelist
-
-
-# ==============================================================================
-# FrameList
-# ==============================================================================
-Back_text = &Back
-Back_toolTip = Back
-Back_toolTipOneArg = Back to {0}
-
-Forward_text = &Forward
-Forward_toolTip = Forward
-Forward_toolTipOneArg = Forward to {0}
-
-GoInto_text = Go &Into
-GoInto_toolTip = Go Into
-
-Up_text = &Up One Level
-Up_toolTip = Up
-Up_toolTipOneArg = Up to {0}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/AddTaskHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/AddTaskHandler.java
deleted file mode 100644
index afc8c4f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/AddTaskHandler.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.ui.views.markers.MarkerViewHandler;
-import org.eclipse.ui.views.markers.internal.DialogTaskProperties;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * AddTaskHandler is the handler for adding a new task to the task list.
- * 
- * @since 3.4
- * 
- */
-public class AddTaskHandler extends MarkerViewHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) {
-
-		final ExtendedMarkersView view = getView(event);
-		if (view == null)
-			return this;
-
-		DialogTaskProperties dialog = new DialogTaskProperties(view.getSite()
-				.getShell(), MarkerMessages.addGlobalTaskDialog_title);
-		dialog.open();
-		return this;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/AllErrorsParameters.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/AllErrorsParameters.java
deleted file mode 100644
index 4b3786e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/AllErrorsParameters.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ui.views.markers.FiltersContributionParameters;
-
-/**
- * AllErrorsParameters is the parameters for the error severity type.
- * 
- * @since 3.4
- * 
- */
-public class AllErrorsParameters extends FiltersContributionParameters {
-
-	private static Map errorsMap;
-	static {
-		errorsMap = new HashMap();
-		errorsMap.put(IMarker.SEVERITY, new Integer(
-				SeverityAndDescriptionFieldFilter.SEVERITY_ERROR));
-	}
-
-	/**
-	 * Create a new instance of the reciever.
-	 */
-	public AllErrorsParameters() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.FiltersContributionParameters#getParameterValues()
-	 */
-	public Map getParameterValues() {
-		return errorsMap;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/AllMarkersSeverityAndDescriptionConfigurationArea.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/AllMarkersSeverityAndDescriptionConfigurationArea.java
deleted file mode 100644
index becc18d..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/AllMarkersSeverityAndDescriptionConfigurationArea.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-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.ui.views.markers.MarkerFieldFilter;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * {@link ProblemsSeverityAndDescriptionConfigurationArea} is the configuration
- * area for the all markers view.
- * 
- * @since 3.4
- * 
- */
-public class AllMarkersSeverityAndDescriptionConfigurationArea extends
-		SeverityAndDescriptionConfigurationArea {
-
-	boolean filterOnSeverity;
-	private Button enablementButton;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.DescriptionConfigurationArea#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createContents(Composite parent) {
-
-		super.createContents(parent);
-
-		Composite severityComposite = new Composite(parent, SWT.NONE);
-		severityComposite.setLayout(new GridLayout(1, false));
-		severityComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.GRAB_HORIZONTAL));
-
-		enablementButton = new Button(severityComposite, SWT.CHECK);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		enablementButton.setLayoutData(data);
-		enablementButton.setSelection(filterOnSeverity);
-		enablementButton.setText(MarkerMessages.filtersDialog_filterOnSeverity);
-
-		final Composite buttons = createSeverityGroup(severityComposite);
-		GridData buttonData = new GridData();
-		buttonData.horizontalIndent = IDialogConstants.INDENT;
-		buttons.setLayoutData(buttonData);
-
-		enablementButton.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				setFilterOnSeverity(enablementButton.getSelection());
-			}
-		});
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.SeverityAndDescriptionConfigurationArea#apply(org.eclipse.ui.views.markers.MarkerFieldFilter)
-	 */
-	public void apply(MarkerFieldFilter filter) {
-		super.apply(filter);
-		((AllMarkersSeverityAndDescriptionFieldFilter) filter)
-				.setFilterOnSeverity(filterOnSeverity);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.SeverityAndDescriptionConfigurationArea#initialize(org.eclipse.ui.views.markers.MarkerFieldFilter)
-	 */
-	public void initialize(MarkerFieldFilter filter) {
-		super.initialize(filter);
-		
-		setFilterOnSeverity(((AllMarkersSeverityAndDescriptionFieldFilter) filter)
-				.getFilterOnSeverity());
-	}
-
-	/**
-	 * Set the value of filteringOnSeverity
-	 * @param filtering
-	 */
-	private void setFilterOnSeverity(boolean filtering) {
-		filterOnSeverity = filtering;
-		enablementButton.setSelection(filtering);
-		setSeverityButtonsEnabled(filterOnSeverity);
-		
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/AllMarkersSeverityAndDescriptionFieldFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/AllMarkersSeverityAndDescriptionFieldFilter.java
deleted file mode 100644
index fcdcd5c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/AllMarkersSeverityAndDescriptionFieldFilter.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.views.markers.MarkerFieldFilter;
-import org.eclipse.ui.views.markers.MarkerItem;
-
-/**
- * AllMarkersSeverityAndDescriptionFieldFilter is a
- * {@link SeverityAndDescriptionFieldFilter} that handles the no severity case.
- * 
- * @since 3.4
- * 
- */
-public class AllMarkersSeverityAndDescriptionFieldFilter extends
-		SeverityAndDescriptionFieldFilter {
-
-	private boolean filterOnSeverity = false;
-	private static String FILTER_ON_SEVERITY = "FILTER_ON_SEVERITY"; //$NON-NLS-1$
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public AllMarkersSeverityAndDescriptionFieldFilter() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.SeverityAndDescriptionFieldFilter#select(org.eclipse.ui.views.markers.MarkerItem)
-	 */
-	public boolean select(MarkerItem item) {
-		if (filterOnSeverity) {
-
-			IMarker marker = item.getMarker();
-			if (marker == null)
-				return false;
-
-			if (!checkSeverity(item.getAttributeValue(IMarker.SEVERITY, -1)))
-				return false;
-		}
-		return super.select(item);
-	}
-
-	/**
-	 * Return whether or not we are filtering on severity.
-	 * 
-	 * @return boolean
-	 */
-	boolean getFilterOnSeverity() {
-		return filterOnSeverity;
-	}
-
-	/**
-	 * Set the whether or not we are filtering on severity
-	 * 
-	 * @param filter
-	 */
-	void setFilterOnSeverity(boolean filter) {
-		filterOnSeverity = filter;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.SeverityAndDescriptionFieldFilter#loadSettings(org.eclipse.ui.IMemento)
-	 */
-	public void loadSettings(IMemento memento) {
-		super.loadSettings(memento);
-
-		Boolean filtering = memento.getBoolean(FILTER_ON_SEVERITY);
-		if (filtering != null)
-			filterOnSeverity = filtering.booleanValue();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.SeverityAndDescriptionFieldFilter#saveSettings(org.eclipse.ui.IMemento)
-	 */
-	public void saveSettings(IMemento memento) {
-		super.saveSettings(memento);
-		memento.putBoolean(FILTER_ON_SEVERITY, filterOnSeverity);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.SeverityAndDescriptionFieldFilter#populateWorkingCopy(org.eclipse.ui.views.markers.MarkerFieldFilter)
-	 */
-	public void populateWorkingCopy(MarkerFieldFilter copy) {
-		super.populateWorkingCopy(copy);
-		((AllMarkersSeverityAndDescriptionFieldFilter) copy).filterOnSeverity = filterOnSeverity;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/AllMarkersView.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/AllMarkersView.java
deleted file mode 100644
index d6cbbba..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/AllMarkersView.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.eclipse.ui.internal.views.markers;
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-import org.eclipse.ui.views.markers.MarkerSupportView;
-import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
-
-/**
- * AllMarkersView is the view that shows all markers.
- * @since 3.4
- *
- */
-public class AllMarkersView extends MarkerSupportView {
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public AllMarkersView() {
-		super(MarkerSupportRegistry.ALL_MARKERS_GENERATOR);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/BookmarksView.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/BookmarksView.java
deleted file mode 100644
index d746c61..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/BookmarksView.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.ui.views.markers.MarkerSupportView;
-import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
-
-/**
- * The BookmarksView is the ide view for bookmarks.
- * @since 3.4
- *
- */
-public class BookmarksView extends MarkerSupportView {
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public BookmarksView() {
-		super(MarkerSupportRegistry.BOOKMARKS_GENERATOR);
-		
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/CachedMarkerBuilder.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/CachedMarkerBuilder.java
deleted file mode 100644
index 7d02879..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/CachedMarkerBuilder.java
+++ /dev/null
@@ -1,1361 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.resources.mapping.ResourceMappingContext;
-import org.eclipse.core.resources.mapping.ResourceTraversal;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-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.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.internal.ide.StatusUtil;
-import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.views.markers.FilterConfigurationArea;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerItem;
-import org.eclipse.ui.views.markers.internal.MarkerGroup;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
-import org.eclipse.ui.views.markers.internal.MarkerType;
-import org.eclipse.ui.views.markers.internal.ProblemFilter;
-import org.eclipse.ui.views.markers.internal.Util;
-import org.osgi.framework.Bundle;
-
-/**
- * The CachedMarkerBuilder is the object that generates the list of markers from
- * a generator.
- * 
- * @since 3.4
- * 
- */
-public class CachedMarkerBuilder {
-
-	private static final MarkerCategory[] EMPTY_CATEGORY_ARRAY = new MarkerCategory[0];
-	private static final MarkerEntry[] EMPTY_ENTRY_ARRAY = new MarkerEntry[0];
-
-	private static final int SHORT_DELAY = 100;// The 100 ms short delay for
-	// scheduling
-
-	private static final int TIME_OUT = 30000;// The 30s long delay to run
-
-	private static final String TAG_FILTERS_SECTION = "filterGroups"; //$NON-NLS-1$
-	private static final String TAG_GROUP_ENTRY = "filterGroup"; //$NON-NLS-1$
-	private static final String TAG_AND = "andFilters"; //$NON-NLS-1$
-	private static final String TAG_CATEGORY_GROUP = "categoryGroup"; //$NON-NLS-1$
-	private static final String TAG_COLUMN_VISIBILITY = "visible"; //$NON-NLS-1$
-	private static final String VALUE_NONE = "none"; //$NON-NLS-1$
-	private static final String TAG_LEGACY_FILTER_ENTRY = "filter"; //$NON-NLS-1$
-	private static final Integer[] EMPTY_MARKER_COUNTS = { new Integer(0),
-			new Integer(0), new Integer(0) };
-
-	private boolean building = true;// Start with nothing until we have
-	// something
-
-	private MarkerCategory[] categories;
-	private MarkerMap currentMap = null;
-
-	private MarkerContentGenerator generator; // The MarkerContentGenerator we
-	// are
-	// building for
-
-	private Job markerProcessJob;
-
-	private IWorkbenchSiteProgressService progressService;
-
-	private Job updateJob;
-
-	private MarkerGroup categoryGroup;
-
-	private Collection enabledFilters;
-	private Collection filters;
-	private IResource[] focusResources = MarkerSupportInternalUtilities.EMPTY_RESOURCE_ARRAY;
-	private MarkerField[] visibleFields;
-
-	private boolean andFilters = false;
-	private MarkerComparator comparator;
-	private IMemento memento;
-	private String viewId;
-
-	// The time the build started. A -1 indicates no build in progress.
-	private long preBuildTime = -1;
-	private IResourceChangeListener resourceListener;
-	private IPropertyChangeListener preferenceListener;
-
-	// without a builder update
-
-	/**
-	 * Create a new instance of the receiver. Update using the updateJob.
-	 * 
-	 * @param contentGenerator
-	 * @param id
-	 *            id of the view we are building for
-	 * @param memento
-	 *            the memento to restore from
-	 */
-	public CachedMarkerBuilder(MarkerContentGenerator contentGenerator,
-			String id, IMemento memento) {
-		this.generator = contentGenerator;
-		this.viewId = id;
-		initialiseVisibleFields(memento);
-		initializePreferenceListener();
-
-		this.memento = memento;
-		if (memento == null)
-			setDefaultCategoryGroup(contentGenerator);
-		else {
-			// Set up the category group if it has been set or set a default.
-			String categoryGroupID = memento.getString(TAG_CATEGORY_GROUP);
-			if (categoryGroupID == null)
-				setDefaultCategoryGroup(contentGenerator);
-			else {
-				if (categoryGroupID.equals(VALUE_NONE))
-					this.categoryGroup = null;
-				else {
-					MarkerGroup newGroup = contentGenerator
-							.getMarkerGroup(categoryGroupID);
-					if (newGroup == null)
-						setDefaultCategoryGroup(contentGenerator);
-					else
-						this.categoryGroup = newGroup;
-				}
-			}
-		}
-
-		createMarkerProcessJob();
-		resourceListener = getUpdateListener();
-		// Hook up to the resource changes after all widget have been created
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(
-				resourceListener,
-				IResourceChangeEvent.POST_CHANGE
-						| IResourceChangeEvent.PRE_BUILD
-						| IResourceChangeEvent.POST_BUILD);
-
-	}
-
-	/**
-	 * Add the resources in resourceMapping to the resourceCollection
-	 * 
-	 * @param resourceCollection
-	 * @param resourceMapping
-	 */
-	private void addResources(Collection resourceCollection,
-			ResourceMapping resourceMapping) {
-
-		try {
-			ResourceTraversal[] traversals = resourceMapping.getTraversals(
-					ResourceMappingContext.LOCAL_CONTEXT,
-					new NullProgressMonitor());
-			for (int i = 0; i < traversals.length; i++) {
-				ResourceTraversal traversal = traversals[i];
-				IResource[] result = traversal.getResources();
-				for (int j = 0; j < result.length; j++) {
-					resourceCollection.add(result[j]);
-				}
-			}
-		} catch (CoreException e) {
-			Policy.handle(e);
-		}
-
-	}
-
-	/**
-	 * Return whether the filters are being ANDed or ORed.
-	 * 
-	 * @return boolean
-	 */
-	boolean andFilters() {
-		return andFilters;
-	}
-
-	/**
-	 * Build all of the markers in the receiver.
-	 * 
-	 * @param monitor
-	 */
-	void buildAllMarkers(IProgressMonitor monitor) {
-		building = true;
-		MarkerMap newMarkers;
-		try {
-
-			monitor.beginTask(MarkerMessages.MarkerView_19, 60);
-
-			monitor.subTask(MarkerMessages.MarkerView_waiting_on_changes);
-
-			if (monitor.isCanceled())
-				return;
-
-			monitor.subTask(MarkerMessages.MarkerView_searching_for_markers);
-			SubProgressMonitor subMonitor = new SubProgressMonitor(monitor, 10);
-			newMarkers = generator.generateFilteredMarkers(subMonitor,
-					andFilters(), focusResources, getEnabledFilters());
-
-			if (monitor.isCanceled())
-				return;
-
-			sortAndMakeCategories(new SubProgressMonitor(monitor, 30),
-					newMarkers);
-			monitor.done();
-		} finally {
-			building = false;
-		}
-
-	}
-
-	/**
-	 * Break the marker up into categories
-	 * 
-	 * @param markers
-	 * @param start
-	 *            the start index in the markers
-	 * @param end
-	 *            the last index to check
-	 * @param sortIndex -
-	 *            the parent of the field
-	 * @return MarkerCategory[] or <code>null</code> if we are at the bottom
-	 *         of the tree
-	 */
-	MarkerCategory[] buildHierarchy(MarkerMap markers, int start, int end,
-			int sortIndex) {
-		MarkerComparator sorter = getComparator();
-
-		if (sortIndex > 0) {
-			return null;// Are we out of categories?
-		}
-
-		Collection categories = new ArrayList();
-
-		Object previous = null;
-		int categoryStart = start;
-
-		Object[] elements = markers.toArray();
-
-		for (int i = start; i <= end; i++) {
-
-			if (previous != null) {
-				// Are we at a category boundary?
-				if (sorter.compareCategory(previous, elements[i]) != 0) {
-					categories
-							.add(new MarkerCategory(
-									this,
-									categoryStart,
-									i - 1,
-									getCategoryGroup()
-											.getMarkerField()
-											.getValue(
-													markers
-															.elementAt(categoryStart))));
-					categoryStart = i;
-				}
-			}
-			previous = elements[i];
-
-		}
-
-		if (end >= categoryStart) {
-			categories.add(new MarkerCategory(this, categoryStart, end,
-					getCategoryGroup().getMarkerField().getValue(
-							markers.elementAt(categoryStart))));
-		}
-
-		MarkerCategory[] nodes = new MarkerCategory[categories.size()];
-		categories.toArray(nodes);
-		return nodes;
-
-	}
-
-	/**
-	 * Cancel the pending jobs in the receiver.
-	 */
-	private void cancelJobs() {
-		markerProcessJob.cancel();
-		updateJob.cancel();
-	}
-
-	/**
-	 * Return a collection of all of the configuration fields for this generator
-	 * 
-	 * @return Collection of {@link FilterConfigurationArea}
-	 */
-	Collection createFilterConfigurationFields() {
-		Collection result = new ArrayList();
-		for (int i = 0; i < visibleFields.length; i++) {
-			FilterConfigurationArea area = MarkerSupportInternalUtilities
-					.generateFilterArea(visibleFields[i]);
-			if (area != null)
-				result.add(area);
-
-		}
-		return result;
-	}
-
-	/**
-	 * Create the job for updating the markers.
-	 */
-	private void createMarkerProcessJob() {
-		markerProcessJob = new Job(MarkerMessages.MarkerView_processUpdates) {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.runtime.jobs.Job#belongsTo(java.lang.Object)
-			 */
-			public boolean belongsTo(Object family) {
-				return MarkerContentGenerator.CACHE_UPDATE_FAMILY == family;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-			 */
-			protected IStatus run(IProgressMonitor monitor) {
-				updateJob.cancel();
-				buildAllMarkers(monitor);
-				updateJob.schedule();
-				return Status.OK_STATUS;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.progress.WorkbenchJob#shouldRun()
-			 */
-			public boolean shouldRun() {
-
-				// Hold off while everything is active
-				if (preBuildTime > 0
-						&& System.currentTimeMillis() - preBuildTime < TIME_OUT)
-					return false;
-
-				// Clear it if we are past the time out.
-				preBuildTime = -1;
-				// Do not run if the change came in before there is a viewer
-				return IDEWorkbenchPlugin.getDefault().getBundle().getState() == Bundle.ACTIVE;
-			}
-		};
-		markerProcessJob.setSystem(true);
-
-	}
-
-	/**
-	 * Disable all of the filters in the receiver.
-	 */
-	void disableAllFilters() {
-		Collection allFilters = getEnabledFilters();
-		Iterator enabled = allFilters.iterator();
-		while (enabled.hasNext()) {
-			MarkerFieldFilterGroup group = (MarkerFieldFilterGroup) enabled
-					.next();
-			group.setEnabled(false);
-		}
-		allFilters.clear();
-		writeFiltersPreference();
-		scheduleMarkerUpdate();
-
-	}
-
-	/**
-	 * Dispose any listeners in the receiver.
-	 */
-	void dispose() {
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-				resourceListener);
-		IDEWorkbenchPlugin.getDefault().getPreferenceStore()
-				.removePropertyChangeListener(preferenceListener);
-
-	}
-
-	/**
-	 * Return all of the filters for the receiver.
-	 * 
-	 * @return Collection of MarkerFieldFilterGroup
-	 */
-	Collection getAllFilters() {
-		if (filters == null) {
-			filters = new ArrayList();
-			IConfigurationElement[] filterReferences = generator
-					.getFilterReferences();
-			for (int i = 0; i < filterReferences.length; i++) {
-				filters.add(new MarkerFieldFilterGroup(filterReferences[i],
-						this));
-			}
-
-			// Honour the deprecated problemFilters
-			if (viewId.equals(IPageLayout.ID_PROBLEM_VIEW)) {
-				Iterator problemFilters = MarkerSupportRegistry.getInstance()
-						.getRegisteredFilters().iterator();
-				while (problemFilters.hasNext())
-					filters.add(new CompatibilityMarkerFieldFilterGroup(
-							(ProblemFilter) problemFilters.next(), this));
-			}
-
-			// Apply the last settings
-			loadFiltersPreference();
-
-		}
-		return filters;
-	}
-
-	/**
-	 * Return the categories for the receiver.
-	 * 
-	 * @return MarkerCategory[] or <code>null</code> if there are no
-	 *         categories.
-	 */
-	public MarkerCategory[] getCategories() {
-		if (building) {
-			return null;
-		}
-		return categories;
-	}
-
-	/**
-	 * Return the group used to generate categories.
-	 * 
-	 * @return MarkerGroup or <code>null</code>.
-	 */
-	MarkerGroup getCategoryGroup() {
-
-		return categoryGroup;
-	}
-
-	/**
-	 * Return a new instance of the receiver with the field
-	 * 
-	 * @return MarkerComparator
-	 */
-	MarkerComparator getComparator() {
-
-		if (comparator == null) {
-			MarkerField field = null;
-			if (getCategoryGroup() != null)
-				field = getCategoryGroup().getMarkerField();
-			comparator = new MarkerComparator(field, generator.getAllFields());
-			comparator.restore(this.memento);
-		}
-		return comparator;
-	}
-
-	/**
-	 * Return the elements in the adapter.
-	 * 
-	 * @return MarkerSupportItem[]
-	 */
-	MarkerSupportItem[] getElements() {
-
-		if (refreshingMarkers()) {
-			return MarkerSupportInternalUtilities.EMPTY_MARKER_ITEM_ARRAY;
-		}
-		if (isShowingHierarchy() && categories != null) {
-			return categories;
-		}
-		return currentMap.toArray();
-	}
-
-	/**
-	 * Return the currently enabled filters.
-	 * 
-	 * @return Collection of MarkerFieldFilterGroup
-	 */
-	Collection getEnabledFilters() {
-		if (enabledFilters == null) {
-			enabledFilters = new HashSet();
-			Iterator filtersIterator = getAllFilters().iterator();
-			while (filtersIterator.hasNext()) {
-				MarkerFieldFilterGroup next = (MarkerFieldFilterGroup) filtersIterator
-						.next();
-				if (next.isEnabled())
-					enabledFilters.add(next);
-			}
-		}
-		return enabledFilters;
-	}
-
-	/**
-	 * Return the generator for the receiver.
-	 * 
-	 * @return MarkerContentGenerator
-	 */
-	MarkerContentGenerator getGenerator() {
-		return generator;
-	}
-
-	/**
-	 * Return the fields not being shown currently.
-	 * 
-	 * @return Object[]
-	 */
-	Object[] getHiddenFields() {
-		MarkerField[] all = getGenerator().getAllFields();
-		MarkerField[] visible = getVisibleFields();
-
-		Collection hidden = new HashSet();
-		for (int i = 0; i < all.length; i++) {
-			hidden.add(all[i]);
-		}
-		for (int i = 0; i < visible.length; i++) {
-			hidden.remove(visible[i]);
-		}
-		return hidden.toArray();
-	}
-
-	/**
-	 * Get the name of the filters preference for the receiver,
-	 * 
-	 * @return String
-	 */
-	private String getLegacyFiltersPreferenceName() {
-
-		if (viewId.equals(IPageLayout.ID_BOOKMARKS))
-			return IDEInternalPreferences.BOOKMARKS_FILTERS;
-		if (viewId.equals(IPageLayout.ID_TASK_LIST))
-			return IDEInternalPreferences.TASKS_FILTERS;
-		return IDEInternalPreferences.PROBLEMS_FILTERS;
-
-	}
-
-	/**
-	 * Get the counts of errors,warnings and others in that order.
-	 * 
-	 * @return Integer[]
-	 */
-	Integer[] getMarkerCounts() {
-		if (currentMap == null)
-			return EMPTY_MARKER_COUNTS;
-		return currentMap.getMarkerCounts();
-	}
-
-	/**
-	 * Get the raw list of marker entries.
-	 * 
-	 * @return list of MarkerEntry
-	 */
-	MarkerEntry[] getMarkerEntries() {
-		if (refreshingMarkers())
-			return EMPTY_ENTRY_ARRAY;
-
-		return currentMap.toArray();
-	}
-
-	/**
-	 * Get the MarkerItem that matches marker.
-	 * 
-	 * @param marker
-	 * @return MarkerItem or <code>null<code> if it cannot be found
-	 */
-	MarkerItem getMarkerItem(IMarker marker) {
-		if (refreshingMarkers())
-			return null;
-		return currentMap.getMarkerItem(marker);
-	}
-
-	/**
-	 * Get the name for the preferences for the receiver.
-	 * 
-	 * @return String
-	 */
-	private String getMementoPreferenceName() {
-		return getClass().getName() + viewId;
-	}
-
-	/**
-	 * Return the primary sort field
-	 * 
-	 * @return MarkerField
-	 */
-	MarkerField getPrimarySortField() {
-		return getComparator().getPrimarySortField();
-	}
-
-	/**
-	 * Get the sort direction of field
-	 * 
-	 * @param field
-	 * @return int one of {@link MarkerComparator#ASCENDING} or
-	 *         {@link MarkerComparator#DESCENDING}
-	 */
-	int getSortDirection(MarkerField field) {
-		if (getComparator().descendingFields.contains(field))
-			return MarkerComparator.DESCENDING;
-		return MarkerComparator.ASCENDING;
-	}
-
-	/**
-	 * Return the total number of markers.
-	 * 
-	 * @return int
-	 */
-	int getTotalMarkerCount() {
-		MarkerSupportItem[] elements = getElements();
-		if (elements.length == 0 || elements[0].isConcrete())
-			return elements.length;
-		int length = 0;
-		for (int i = 0; i < elements.length; i++) {
-			length += elements[i].getChildren().length;
-		}
-
-		return length;
-	}
-
-	/**
-	 * Return the resource listener for the builder
-	 * 
-	 * @return IResourceChangeListener
-	 */
-	private IResourceChangeListener getUpdateListener() {
-		return new IResourceChangeListener() {
-
-			/**
-			 * Returns whether or not the given even contains marker deltas for
-			 * this view.
-			 * 
-			 * @param event
-			 *            the resource change event
-			 * @return <code>true</code> if the event contains at least one
-			 *         relevant marker delta
-			 * @since 3.3
-			 */
-			private boolean hasMarkerDelta(IResourceChangeEvent event) {
-				Iterator markerTypes = generator.getMarkerTypes().iterator();
-				while (markerTypes.hasNext()) {
-					MarkerType type = (MarkerType) markerTypes.next();
-
-					if (event.findMarkerDeltas(type.getId(), true).length > 0)
-						return true;
-
-				}
-				return false;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-			 */
-			public void resourceChanged(IResourceChangeEvent event) {
-				if (!hasMarkerDelta(event))
-					return;
-
-				if (event.getType() == IResourceChangeEvent.PRE_BUILD) {
-					preBuild();
-					return;
-				}
-
-				if (event.getType() == IResourceChangeEvent.POST_BUILD) {
-					postBuild();
-					scheduleMarkerUpdate();
-					return;
-				}
-
-				// After 30 seconds do updates anyways
-				if (progressService == null)
-					markerProcessJob.schedule(TIME_OUT);
-				else
-					progressService.schedule(markerProcessJob, TIME_OUT);
-
-			}
-
-		};
-	}
-
-	/**
-	 * Get the fields that this content generator is displaying.
-	 * 
-	 * @return {@link MarkerField}[]
-	 */
-	MarkerField[] getVisibleFields() {
-		return visibleFields;
-	}
-
-	/**
-	 * Return whether or not the receiver has markers without scheduling
-	 * anything if it doesn't.
-	 * 
-	 * @return boolean <code>true</code> if the markers have not been
-	 *         calculated.
-	 */
-	boolean hasNoMarkers() {
-		return currentMap == null;
-	}
-
-	/**
-	 * Initialize the visible fields based on the initial settings or the
-	 * contents of the {@link IMemento}
-	 * 
-	 * @param memento
-	 *            IMemento
-	 */
-	private void initialiseVisibleFields(IMemento memento) {
-
-		if (memento == null
-				|| memento.getChildren(TAG_COLUMN_VISIBILITY).length == 0) {
-			MarkerField[] initialFields = getGenerator().getInitialVisible();
-
-			visibleFields = new MarkerField[initialFields.length];
-			System.arraycopy(initialFields, 0, visibleFields, 0,
-					initialFields.length);
-			return;
-		}
-
-		IMemento[] visible = memento.getChildren(TAG_COLUMN_VISIBILITY);
-		Collection newVisible = new ArrayList();
-
-		MarkerField[] all = getGenerator().getAllFields();
-		Hashtable allTable = new Hashtable();
-
-		for (int i = 0; i < all.length; i++) {
-			allTable.put(all[i].getConfigurationElement().getAttribute(
-					MarkerSupportInternalUtilities.ATTRIBUTE_ID), all[i]);
-		}
-
-		for (int i = 0; i < visible.length; i++) {
-			String key = visible[i].getID();
-			if (allTable.containsKey(key)) {
-				newVisible.add(allTable.get(key));
-			}
-		}
-
-		visibleFields = new MarkerField[newVisible.size()];
-		newVisible.toArray(visibleFields);
-	}
-
-	/**
-	 * Create a preference listener for any preference updates.
-	 */
-	private void initializePreferenceListener() {
-		preferenceListener = new IPropertyChangeListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-			 */
-			public void propertyChange(PropertyChangeEvent event) {
-				if (event.getProperty().equals(getMementoPreferenceName())) {
-					rebuildFilters();
-				}
-
-			}
-		};
-		IDEWorkbenchPlugin.getDefault().getPreferenceStore()
-				.addPropertyChangeListener(preferenceListener);
-
-	}
-
-	/**
-	 * Return whether or not the receiver is building.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isBuilding() {
-		return building;
-	}
-
-	/**
-	 * Return whether or not we are showing a hierarchy,.
-	 * 
-	 * @return <code>true</code> if a hierarchy is being shown.
-	 */
-	boolean isShowingHierarchy() {
-		return categoryGroup != null;
-	}
-
-	/**
-	 * Load the settings from the memento.
-	 * 
-	 * @param memento
-	 */
-	private void loadFilterSettings(IMemento memento) {
-
-		if (memento == null)
-			return;
-
-		Boolean andValue = memento.getBoolean(TAG_AND);
-		if (andValue != null)
-			setAndFilters(andValue.booleanValue());
-		IMemento children[] = memento.getChildren(TAG_GROUP_ENTRY);
-
-		for (int i = 0; i < children.length; i++) {
-			IMemento child = children[i];
-			String id = child.getString(IMemento.TAG_ID);
-			if (id == null)
-				continue;
-			if (!loadGroupWithID(child, id))
-
-				// Did not find a match must have been added by the user
-				loadUserFilter(child);
-		}
-
-	}
-
-	/**
-	 * Load the filters defined in memento string.
-	 * 
-	 * @param mementoString
-	 */
-	private void loadFiltersFrom(String mementoString) {
-		if (mementoString.equals(IPreferenceStore.STRING_DEFAULT_DEFAULT))
-			return;
-
-		try {
-			loadFilterSettings(XMLMemento.createReadRoot(new StringReader(
-					mementoString)));
-		} catch (WorkbenchException e) {
-			StatusManager.getManager().handle(e.getStatus());
-		}
-	}
-
-	/**
-	 * Load the filters preference.
-	 */
-	private void loadFiltersPreference() {
-
-		loadFiltersFrom(IDEWorkbenchPlugin.getDefault().getPreferenceStore()
-				.getString(getMementoPreferenceName()));
-
-		String legacyFilters = getLegacyFiltersPreferenceName();
-		String migrationPreference = legacyFilters
-				+ MarkerSupportInternalUtilities.MIGRATE_PREFERENCE_CONSTANT;
-
-		if (IDEWorkbenchPlugin.getDefault().getPreferenceStore().getBoolean(
-				migrationPreference))
-			return;// Already migrated
-
-		// Load any defined in a pre 3.4 workbench
-		loadLegacyFiltersFrom(IDEWorkbenchPlugin.getDefault()
-				.getPreferenceStore().getString(legacyFilters));
-
-		// Mark as migrated
-		IDEWorkbenchPlugin.getDefault().getPreferenceStore().setValue(
-				migrationPreference, true);
-	}
-
-	/**
-	 * Load the group with id from the child if there is a matching system group
-	 * registered.
-	 * 
-	 * @param child
-	 * @param id
-	 * @return <code>true</code> if a matching group was found
-	 */
-	private boolean loadGroupWithID(IMemento child, String id) {
-		Iterator groups = getAllFilters().iterator();
-
-		while (groups.hasNext()) {
-			MarkerFieldFilterGroup group = (MarkerFieldFilterGroup) groups
-					.next();
-			if (id.equals(group.getID())) {
-				group.loadSettings(child);
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Load the legacy filter into the system.
-	 * 
-	 * @param child
-	 */
-	private void loadLegacyFilter(IMemento child) {
-		MarkerFieldFilterGroup newGroup = new MarkerFieldFilterGroup(null, this);
-		newGroup.legacyLoadSettings(child);
-		getAllFilters().add(newGroup);
-
-	}
-
-	/**
-	 * Load the pre-3.4 filters.
-	 * 
-	 * @param mementoString
-	 */
-	private void loadLegacyFiltersFrom(String mementoString) {
-
-		if (mementoString.equals(IPreferenceStore.STRING_DEFAULT_DEFAULT))
-			return;
-		IMemento memento;
-		try {
-			memento = XMLMemento
-					.createReadRoot(new StringReader(mementoString));
-			restoreLegacyFilters(memento);
-		} catch (WorkbenchException e) {
-			StatusManager.getManager().handle(e.getStatus());
-			return;
-		}
-
-	}
-
-	/**
-	 * Load the user supplied filter
-	 * 
-	 * @param child
-	 */
-	private void loadUserFilter(IMemento child) {
-		MarkerFieldFilterGroup newGroup = new MarkerFieldFilterGroup(null, this);
-		newGroup.loadSettings(child);
-		getAllFilters().add(newGroup);
-	}
-
-	/**
-	 * Post build has happened. Let it all run.
-	 */
-	protected void postBuild() {
-		preBuildTime = -1;
-
-	}
-
-	/**
-	 * We are in a pre build state. Do not update until the post build happens.
-	 */
-	protected void preBuild() {
-		preBuildTime = System.currentTimeMillis();
-
-	}
-
-	/**
-	 * Rebuild the list of filters
-	 */
-	protected void rebuildFilters() {
-		filters = null;
-		enabledFilters = null;
-		scheduleMarkerUpdate();
-
-	}
-
-	/**
-	 * Refresh the sort order and categories of the receiver.
-	 * 
-	 * @param service
-	 *            The service to run the operation in.
-	 */
-	void refreshContents(IWorkbenchSiteProgressService service) {
-		try {
-			service.busyCursorWhile(new IRunnableWithProgress() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
-				 */
-				public void run(IProgressMonitor monitor) {
-
-					// Let the build finish before trying to sort
-					if (refreshingMarkers())
-						return;
-					sortAndMakeCategories(monitor, currentMap);
-				}
-			});
-		} catch (InvocationTargetException e) {
-			StatusManager.getManager().handle(
-					StatusUtil.newStatus(IStatus.ERROR,
-							e.getLocalizedMessage(), e));
-		} catch (InterruptedException e) {
-			StatusManager.getManager().handle(
-					StatusUtil.newStatus(IStatus.ERROR,
-							e.getLocalizedMessage(), e));
-		}
-
-	}
-
-	/**
-	 * Check if the markers are still being built. If so schedule an update.
-	 * 
-	 * @return <code>true</code> if the map is empty.
-	 */
-	private boolean refreshingMarkers() {
-		if (currentMap == null) {// First time?
-			scheduleMarkerUpdate();
-			return true;
-		}
-		return building;
-	}
-
-	/**
-	 * Restore the pre-3.4 filters.
-	 * 
-	 * @param memento
-	 */
-	private void restoreLegacyFilters(IMemento memento) {
-
-		IMemento[] sections = null;
-		if (memento != null)
-			sections = memento.getChildren(TAG_LEGACY_FILTER_ENTRY);
-
-		for (int i = 0; i < sections.length; i++) {
-			IMemento child = sections[i];
-			String id = child.getString(IMemento.TAG_ID);
-			if (id == null)
-				continue;
-			loadLegacyFilter(child);
-		}
-
-	}
-
-	/**
-	 * Save the state of the receiver to memento
-	 * 
-	 * @param memento
-	 * @param displayedFields -
-	 *            the currently displayed fields in order
-	 */
-	void saveState(IMemento memento, MarkerField[] displayedFields) {
-		getComparator().saveState(memento);
-
-		if (categoryGroup == null)
-			memento.putString(TAG_CATEGORY_GROUP, VALUE_NONE);
-		else
-			memento.putString(TAG_CATEGORY_GROUP, getCategoryGroup().getId());
-
-		for (int i = 0; i < displayedFields.length; i++) {
-
-			memento.createChild(TAG_COLUMN_VISIBILITY, displayedFields[i]
-					.getConfigurationElement().getAttribute(
-							MarkerSupportInternalUtilities.ATTRIBUTE_ID));
-		}
-	}
-
-	/**
-	 * Schedule an update of the markers with a delay.
-	 * 
-	 */
-	public void scheduleMarkerUpdate() {
-		cancelJobs();
-		currentMap = null;
-		building = true;
-		if (progressService != null) {
-			progressService.schedule(markerProcessJob, SHORT_DELAY);
-		} else {
-			markerProcessJob.schedule(SHORT_DELAY);
-		}
-	}
-
-	/**
-	 * Set whether the filters are being ANDed or ORed.
-	 * 
-	 * @param and
-	 */
-	void setAndFilters(boolean and) {
-		andFilters = and;
-	}
-
-	/**
-	 * Set the category group.
-	 * 
-	 * @param group
-	 *            {@link MarkerGroup} or <code>null</code>.
-	 */
-	void setCategoryGroup(MarkerGroup group) {
-		this.categoryGroup = group;
-		if (group == null)
-			getComparator().setCategory(null);
-		else
-			getComparator().setCategory(group.getMarkerField());
-		scheduleMarkerUpdate();
-
-	}
-
-	/**
-	 * Categorise by the default setting for contentGenerator.
-	 * 
-	 * @param contentGenerator
-	 */
-	private void setDefaultCategoryGroup(MarkerContentGenerator contentGenerator) {
-		String categoryName = contentGenerator.getCategoryName();
-		if (categoryName != null) {
-			MarkerGroup group = contentGenerator.getMarkerGroup(categoryName);
-			if (group != null)
-				categoryGroup = group;
-		}
-
-	}
-
-	/**
-	 * Set the generator and update the contents.
-	 * 
-	 * @param generator
-	 */
-	void setGenerator(MarkerContentGenerator generator) {
-		this.generator = generator;
-		scheduleMarkerUpdate();
-	}
-
-	/**
-	 * Set the primary sort field for the receiver.
-	 * 
-	 * @param field
-	 */
-	void setPrimarySortField(MarkerField field) {
-
-		getComparator().setPrimarySortField(field);
-
-	}
-
-	/**
-	 * Set the progress service for the receiver.
-	 * 
-	 * @param service
-	 */
-	void setProgressService(IWorkbenchSiteProgressService service) {
-		progressService = service;
-		if (service != null) {
-			service.showBusyForFamily(ResourcesPlugin.FAMILY_MANUAL_BUILD);
-			service.showBusyForFamily(ResourcesPlugin.FAMILY_AUTO_BUILD);
-			service
-					.showBusyForFamily(MarkerContentGenerator.CACHE_UPDATE_FAMILY);
-		}
-
-	}
-
-	/**
-	 * Set the updateJob for the receiver.
-	 * 
-	 * @param job
-	 */
-	public void setUpdateJob(Job job) {
-		updateJob = job;
-
-	}
-
-	/**
-	 * Sort the newMarkers and build categories if required.
-	 * 
-	 * @param monitor
-	 * @param newMarkers
-	 */
-	void sortAndMakeCategories(IProgressMonitor monitor, MarkerMap newMarkers) {
-
-		// Allow the keys to get regenerated
-		Arrays.sort(newMarkers.toArray(), getComparator());
-
-		monitor.worked(50);
-
-		if (newMarkers.getSize() == 0) {
-			categories = EMPTY_CATEGORY_ARRAY;
-			currentMap = newMarkers;
-			monitor.done();
-			return;
-		}
-
-		monitor.subTask(MarkerMessages.MarkerView_queueing_updates);
-
-		if (monitor.isCanceled())
-			return;
-
-		if (isShowingHierarchy()) {
-			MarkerCategory[] newCategories = buildHierarchy(newMarkers, 0,
-					newMarkers.getSize() - 1, 0);
-			if (monitor.isCanceled())
-				return;
-			categories = newCategories;
-		}
-
-		monitor.worked(50);
-
-		currentMap = newMarkers;
-		currentMap.clearAttributeCaches();
-	}
-
-	/**
-	 * Add group to the enabled filters.
-	 * 
-	 * @param group
-	 */
-	void toggleFilter(MarkerFieldFilterGroup group) {
-		Collection enabled = getEnabledFilters();
-		if (enabled.remove(group)) // true if it was present
-			group.setEnabled(false);
-
-		else {
-			group.setEnabled(true);
-			enabled.add(group);
-		}
-		writeFiltersPreference();
-		scheduleMarkerUpdate();
-	}
-
-	/**
-	 * Update the focus resources from list. If there is an update required
-	 * return <code>true</code>. This method assumes that there are filters
-	 * on resources enabled.
-	 * 
-	 * @param elements
-	 */
-	void updateFocusElements(Object[] elements) {
-		Collection resourceCollection = new ArrayList();
-		for (int i = 0; i < elements.length; i++) {
-			if (elements[i] instanceof IResource) {
-				resourceCollection.add(elements[i]);
-			} else {
-				addResources(resourceCollection,
-						((ResourceMapping) elements[i]));
-			}
-		}
-
-		focusResources = new IResource[resourceCollection.size()];
-		resourceCollection.toArray(focusResources);
-	}
-
-	/**
-	 * Update the receiver for a change in selection.
-	 * 
-	 * @param newElements
-	 */
-	void updateForNewSelection(Object[] newElements) {
-		if (updateNeeded(newElements)) {
-			updateFocusElements(newElements);
-			scheduleMarkerUpdate();
-		}
-
-	}
-
-	/**
-	 * Update the receiver from the dialog.
-	 * 
-	 * @param dialog
-	 */
-	void updateFrom(FiltersConfigurationDialog dialog) {
-		setAndFilters(dialog.andFilters());
-		filters = dialog.getFilters();
-		enabledFilters = null;
-
-		writeFiltersPreference();
-		scheduleMarkerUpdate();
-
-	}
-
-	/**
-	 * Return whether or not the list contains a resource that will require
-	 * regeneration.
-	 * 
-	 * @return boolean <code>true</code> if regeneration is required.
-	 */
-	boolean updateNeeded(Object[] newElements) {
-
-		Iterator filters = getEnabledFilters().iterator();
-
-		while (filters.hasNext()) {
-			MarkerFieldFilterGroup filter = (MarkerFieldFilterGroup) filters
-					.next();
-
-			int scope = filter.getScope();
-			if (scope == MarkerFieldFilterGroup.ON_ANY
-					|| scope == MarkerFieldFilterGroup.ON_WORKING_SET)
-				continue;
-
-			if (newElements == null || newElements.length < 1)
-				continue;
-
-			if (focusResources.length == 0)
-				return true; // We had nothing now we have something
-
-			if (Arrays.equals(focusResources, newElements))
-				continue;
-
-			if (scope == MarkerFieldFilterGroup.ON_ANY_IN_SAME_CONTAINER) {
-				Collection oldProjects = MarkerFieldFilterGroup
-						.getProjectsAsCollection(focusResources);
-				Collection newProjects = MarkerFieldFilterGroup
-						.getProjectsAsCollection(newElements);
-
-				if (oldProjects.size() == newProjects.size()
-						&& newProjects.containsAll(oldProjects))
-					continue;
-				return true;// Something must be different
-			}
-			return true;
-		}
-
-		return false;
-	}
-
-	/**
-	 * 
-	 */
-	private void writeFiltersPreference() {
-		XMLMemento memento = XMLMemento.createWriteRoot(TAG_FILTERS_SECTION);
-
-		writeFiltersSettings(memento);
-
-		StringWriter writer = new StringWriter();
-		try {
-			memento.save(writer);
-		} catch (IOException e) {
-			IDEWorkbenchPlugin.getDefault().getLog().log(Util.errorStatus(e));
-		}
-
-		IDEWorkbenchPlugin.getDefault().getPreferenceStore().putValue(
-				getMementoPreferenceName(), writer.toString());
-		IDEWorkbenchPlugin.getDefault().savePluginPreferences();
-	}
-
-	/**
-	 * Write the settings for the filters to the memento.
-	 * 
-	 * @param memento
-	 */
-	private void writeFiltersSettings(XMLMemento memento) {
-
-		memento.putBoolean(TAG_AND, andFilters);
-
-		Iterator groups = getAllFilters().iterator();
-		while (groups.hasNext()) {
-			MarkerFieldFilterGroup group = (MarkerFieldFilterGroup) groups
-					.next();
-			IMemento child = memento
-					.createChild(TAG_GROUP_ENTRY, group.getID());
-			group.saveFilterSettings(child);
-		}
-
-	}
-
-	/**
-	 * Set the visible fields.
-	 * 
-	 * @param visible
-	 */
-	void setVisibleFields(Collection visible) {
-
-		MarkerField[] newFields = new MarkerField[visible.size()];
-		visible.toArray(newFields);
-		visibleFields = newFields;
-
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/CompatibilityFieldFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/CompatibilityFieldFilter.java
deleted file mode 100644
index 6f75449..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/CompatibilityFieldFilter.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.views.markers.MarkerFieldFilter;
-import org.eclipse.ui.views.markers.internal.ProblemFilter;
-
-/**
- * CompatibilityFieldFilter is the abstract superclass of the internal filters that support
- * the compatibility filter.
- * @since 3.4
- *
- */
-abstract class CompatibilityFieldFilter extends MarkerFieldFilter {
-
-	/**
-	 * Load the settings in the legacy format for the receiver.
-	 * @param memento
-	 * @param generator the generator we are using now
-	 */
-	abstract void loadLegacySettings(IMemento memento, MarkerContentGenerator generator);
-
-	/**
-	 * Initialize from a legacy problem filter
-	 * @param problemFilter
-	 */
-	abstract void initialize(ProblemFilter problemFilter);
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/CompatibilityMarkerFieldFilterGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/CompatibilityMarkerFieldFilterGroup.java
deleted file mode 100644
index 4909731..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/CompatibilityMarkerFieldFilterGroup.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.ui.views.markers.internal.ProblemFilter;
-
-/**
- * CompatibilityMarkerFieldFilterGroup is a filter group that uses a
- * {@link ProblemFilter}.
- * 
- * @since 3.4
- * 
- */
-public class CompatibilityMarkerFieldFilterGroup extends MarkerFieldFilterGroup {
-
-	ProblemFilter problemFilter;
-
-	/**
-	 * Create a new instance of the receiver based on the ProblemFilter.
-	 * 
-	 * @param filter
-	 * @param cachedMarkerBuilder
-	 */
-	public CompatibilityMarkerFieldFilterGroup(ProblemFilter filter,
-			CachedMarkerBuilder cachedMarkerBuilder) {
-		super(null, cachedMarkerBuilder);
-		problemFilter = filter;
-		setEnabled(filter.isEnabled());
-		setScope(filter.getOnResource());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.MarkerFieldFilterGroup#getID()
-	 */
-	public String getID() {
-		return problemFilter.getId();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.MarkerFieldFilterGroup#getName()
-	 */
-	public String getName() {
-		return problemFilter.getName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.MarkerFieldFilterGroup#isSystem()
-	 */
-	public boolean isSystem() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.MarkerFieldFilterGroup#makeWorkingCopy()
-	 */
-	MarkerFieldFilterGroup makeWorkingCopy() {
-
-		CompatibilityMarkerFieldFilterGroup clone = new CompatibilityMarkerFieldFilterGroup(
-				this.problemFilter, this.builder);
-		if (populateClone(clone))
-			return clone;
-		return null;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.MarkerFieldFilterGroup#calculateFilters()
-	 */
-	protected void calculateFilters() {
-		super.calculateFilters();
-		// Now initialize with the ProblemFilter
-		for (int i = 0; i < fieldFilters.length; i++) {
-			if (fieldFilters[i] instanceof CompatibilityFieldFilter)
-				((CompatibilityFieldFilter) fieldFilters[i])
-						.initialize(problemFilter);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/CompletionConfigurationArea.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/CompletionConfigurationArea.java
deleted file mode 100644
index 50dcb0e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/CompletionConfigurationArea.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.markers.FilterConfigurationArea;
-import org.eclipse.ui.views.markers.MarkerFieldFilter;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * CompletionConfigurationField is the field for the configuration of filters
- * based on configurations.
- * 
- * @since 3.4
- * 
- */
-public class CompletionConfigurationArea extends FilterConfigurationArea {
-
-	private Button completeButton;
-	private Button incompleteButton;
-	int completionState;
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public CompletionConfigurationArea() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#apply(org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter)
-	 */
-	public void apply(MarkerFieldFilter filter) {
-		((CompletionFieldFilter) filter).setCompletion(completionState);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createContents(Composite parent) {
-
-		GridLayout layout = new GridLayout(2, false);
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		parent.setLayout(layout);
-
-		completeButton = new Button(parent, SWT.CHECK);
-		completeButton.setText(MarkerMessages.filtersDialog_statusComplete);
-		completeButton.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				updateCompletion(CompletionFieldFilter.COMPLETED,
-						completeButton.getSelection());
-
-			}
-		});
-
-		incompleteButton = new Button(parent, SWT.CHECK);
-		incompleteButton.setText(MarkerMessages.filtersDialog_statusIncomplete);
-		incompleteButton.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				updateCompletion(CompletionFieldFilter.NOT_COMPLETED,
-						incompleteButton.getSelection());
-
-			}
-		});
-	}
-
-	/**
-	 * Update the completion value based on the constant and the selection
-	 * value.
-	 * 
-	 * @param constant
-	 * @param enabled
-	 */
-	void updateCompletion(int constant, boolean enabled) {
-
-		if (enabled)
-			completionState = constant | completionState;
-		else
-			completionState = constant ^ completionState;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#initialize(org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter)
-	 */
-	public void initialize(MarkerFieldFilter filter) {
-		completionState = ((CompletionFieldFilter) filter).getCompletion();
-
-		completeButton
-				.setSelection((CompletionFieldFilter.COMPLETED & completionState) > 0);
-		incompleteButton
-				.setSelection((CompletionFieldFilter.NOT_COMPLETED & completionState) > 0);
-
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#getTitle()
-	 */
-	public String getTitle() {
-		return MarkerMessages.filtersDialog_completionTitle;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/CompletionFieldFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/CompletionFieldFilter.java
deleted file mode 100644
index 66a46d4..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/CompletionFieldFilter.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.views.markers.MarkerFieldFilter;
-import org.eclipse.ui.views.markers.MarkerItem;
-import org.eclipse.ui.views.markers.internal.ProblemFilter;
-import org.eclipse.ui.views.markers.internal.TaskFilter;
-
-/**
- * CompletionFieldFilter is the field filter for marker fields.
- * 
- * @since 3.4
- * 
- */
-public class CompletionFieldFilter extends CompatibilityFieldFilter {
-
-	final static int COMPLETED = 2;
-	final static int NOT_COMPLETED = 1;
-	private static int ALL_SELECTED = COMPLETED + NOT_COMPLETED;
-	private int completion = ALL_SELECTED;
-	private static String COMPLETION_ATTRIBUTE = "completion"; //$NON-NLS-1$
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public CompletionFieldFilter() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter#loadSettings(org.eclipse.ui.IMemento)
-	 */
-	public void loadSettings(IMemento memento) {
-		Integer completionValue = memento.getInteger(COMPLETION_ATTRIBUTE);
-		if (completionValue == null)
-			return;
-		completion = completionValue.intValue();
-
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.CompatibilityFieldFilter#loadLegacySettings(org.eclipse.ui.IMemento, org.eclipse.ui.internal.views.markers.MarkerContentGenerator)
-	 */
-	void loadLegacySettings(IMemento memento, MarkerContentGenerator generator) {
-
-		String setting = memento.getString(TaskFilter.TAG_DONE);
-
-		if (setting != null) {
-			completion = Boolean.valueOf(setting).booleanValue() ? COMPLETED : NOT_COMPLETED;
-		}
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.CompatibilityFieldFilter#initialize(org.eclipse.ui.views.markers.internal.ProblemFilter)
-	 */
-	public void initialize(ProblemFilter problemFilter) {
-		//Problem filters have no completion value
-		
-	}
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.MarkerFieldFilter#saveSettings(org.eclipse.ui.IMemento)
-	 */
-	public void saveSettings(IMemento memento) {
-		memento.putInteger(COMPLETION_ATTRIBUTE, completion);
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.MarkerFieldFilter#select(org.eclipse.ui.views.markers.MarkerItem)
-	 */
-	public boolean select(MarkerItem item) {
-
-		if (completion == ALL_SELECTED)
-			return true;
-
-		if (item.getAttributeValue(IMarker.USER_EDITABLE, true)) {
-			if (item.getAttributeValue(IMarker.DONE, false))
-				return (completion & COMPLETED) > 0;
-			return (completion & NOT_COMPLETED) > 0;
-		}
-
-		return false;
-
-	}
-
-	/**
-	 * Get the completion settings.
-	 * @return int 
-	 * @see #COMPLETED
-	 * @see #NOT_COMPLETED
-	 */
-	int getCompletion() {
-		return completion;
-	}
-
-	/**
-	 * Set the completion settings.
-	 * @param completion the completion value
-	 * @see #COMPLETED
-	 * @see #NOT_COMPLETED
-	 */
-	void setCompletion(int completion) {
-		this.completion = completion;
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.MarkerFieldFilter#populateWorkingCopy(org.eclipse.ui.views.markers.MarkerFieldFilter)
-	 */
-	public void populateWorkingCopy(MarkerFieldFilter copy) {
-		super.populateWorkingCopy(copy);
-		((CompletionFieldFilter)copy).setCompletion(getCompletion());
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ConfigureColumnsHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ConfigureColumnsHandler.java
deleted file mode 100644
index 25480cd..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ConfigureColumnsHandler.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.IHandler;
-import org.eclipse.jface.internal.ConfigureColumnsDialog;
-import org.eclipse.ui.views.markers.MarkerViewHandler;
-
-/**
- * The ConfigureContentsDialogHandler is the handler for opening the contents
- * configuration dialog
- * 
- * @since 3.4
- * 
- */
-public class ConfigureColumnsHandler extends MarkerViewHandler implements IHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) {
-		ExtendedMarkersView view = getView(event);
-		if (view == null)
-			return this;
-		ConfigureColumnsDialog dialog = new ConfigureColumnsDialog(view.getSite(), view.getViewer().getTree());
-		dialog.open();
-		return this;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ConfigureContentsDialogHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ConfigureContentsDialogHandler.java
deleted file mode 100644
index 35c847c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ConfigureContentsDialogHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.IHandler;
-import org.eclipse.ui.views.markers.MarkerViewHandler;
-
-/**
- * The ConfigureContentsDialogHandler is the handler for opening the contents
- * configuration dialog
- * 
- * @since 3.4
- * 
- */
-public class ConfigureContentsDialogHandler extends MarkerViewHandler implements IHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) {
-		ExtendedMarkersView view = getView(event);
-		if (view == null)
-			return this;
-		view.openFiltersDialog();
-		return this;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ContentsContribution.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ContentsContribution.java
deleted file mode 100644
index e8d0913..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ContentsContribution.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
-
-/**
- * ContentsContribution is the class that defines the content selection
- * contribution for the {@link ExtendedMarkersView}.
- * 
- * @since 3.4
- * 
- */
-public class ContentsContribution extends MarkersContribution {
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public ContentsContribution() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
-	 */
-	protected IContributionItem[] getContributionItems() {
-
-		ExtendedMarkersView view = getView();
-		String[] generatorIds = view.getGeneratorIds();
-
-		Collection items = new ArrayList();
-		for (int i = 0; i < generatorIds.length; i++) {
-			final MarkerContentGenerator generator = MarkerSupportRegistry
-					.getInstance().getGenerator(generatorIds[i]);
-			
-			if(generator == null){
-				view.logInvalidGenerator(generatorIds[i]);
-				continue;
-			}
-				
-			
-			items.add(new ContributionItem() {
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Menu,
-				 *      int)
-				 */
-				public void fill(Menu menu, int index) {
-					MenuItem item = new MenuItem(menu, SWT.RADIO);
-					item.setText(generator.getName());
-					ExtendedMarkersView view = getView();
-					item.addListener(SWT.Selection, getMenuItemListener(
-							generator, view));
-					if (view != null && view.isShowing(generator))
-						item.setSelection(true);
-				}
-
-				/**
-				 * Create a menu listener for the generator and the view.
-				 * 
-				 * @param generator
-				 * @param view
-				 * @return Listener
-				 */
-				private Listener getMenuItemListener(
-						final MarkerContentGenerator generator,
-						final ExtendedMarkersView view) {
-					return new Listener() {
-						/*
-						 * (non-Javadoc)
-						 * 
-						 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-						 */
-						public void handleEvent(Event event) {
-							if (view != null)
-								view.setContentGenerator(generator);
-						}
-					};
-				}
-			});
-		}
-
-		items.add( new Separator());
-		items.add(getFiltersDialogContribution());
-		IContributionItem[] contributionItems = new IContributionItem[items.size()];
-		items.toArray(contributionItems);
-		return contributionItems;
-	}
-
-	/**
-	 * Get the filter item for the contribution dialog.
-	 * 
-	 * @return ContributionItem
-	 */
-	private ContributionItem getFiltersDialogContribution() {
-		return new ContributionItem() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Menu,
-			 *      int)
-			 */
-			public void fill(Menu menu, int index) {
-				MenuItem item = new MenuItem(menu, SWT.NONE);
-				item.setText(MarkerMessages.configureFiltersCommand_title);
-				item.addListener(SWT.Selection, new Listener() {
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-					 */
-					public void handleEvent(Event event) {
-						getView().openFiltersDialog();
-					}
-				});
-			}
-
-		};
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/DeleteCompletedHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/DeleteCompletedHandler.java
deleted file mode 100644
index 8442dd2..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/DeleteCompletedHandler.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.ide.undo.DeleteMarkersOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.views.markers.MarkerItem;
-import org.eclipse.ui.views.markers.MarkerViewHandler;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * DeleteCompletedHandler is the handler for the deletion of completed
- * tasks.
- * @since 3.4
- *
- */
-public class DeleteCompletedHandler extends MarkerViewHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) {
-
-		ExtendedMarkersView view = getView(event);
-		if (view == null)
-			return this;
-
-		final List completed = getCompletedTasks(view);
-		// Check if there is anything to do
-		if (completed.size() == 0) {
-			MessageDialog.openInformation(view.getSite().getShell(),
-					MarkerMessages.deleteCompletedTasks_dialogTitle,
-					MarkerMessages.deleteCompletedTasks_noneCompleted);
-			return this;
-		}
-		String message;
-		if (completed.size() == 1) {
-			message = MarkerMessages.deleteCompletedTasks_permanentSingular;
-		} else {
-			message = NLS.bind(
-					MarkerMessages.deleteCompletedTasks_permanentPlural, String
-							.valueOf(completed.size()));
-		}
-		// Verify.
-		if (!MessageDialog.openConfirm(view.getSite().getShell(),
-				MarkerMessages.deleteCompletedTasks_dialogTitle, message)) {
-			return view;
-		}
-
-		IMarker[] markers = new IMarker[completed.size()];
-		completed.toArray(markers);
-
-		IUndoableOperation op = new DeleteMarkersOperation(markers,
-				MarkerMessages.deleteCompletedAction_title);
-		execute(op, MarkerMessages.deleteCompletedTasks_errorMessage, null,
-				WorkspaceUndoUtil.getUIInfoAdapter(view.getSite().getShell()));
-		
-		return this;
-
-	}
-
-	/**
-	 * Get the list of completed tasks from the view.
-	 * 
-	 * @param view
-	 * @return List of {@link IMarker}
-	 */
-	private List getCompletedTasks(ExtendedMarkersView view) {
-
-		List completed = new ArrayList();
-		MarkerItem[] items = view.getAllConcreteItems();
-
-		for (int i = 0; i < items.length; i++) {
-			MarkerItem markerItem = items[i];
-			if (markerItem.getAttributeValue(IMarker.DONE, false)
-					&& markerItem.getMarker() != null) {
-				completed.add(markerItem.getMarker());
-			}
-		}
-
-		return completed;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/DeleteHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/DeleteHandler.java
deleted file mode 100644
index 608fef4..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/DeleteHandler.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.core.resources.IMarker;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.views.markers.MarkerSupportView;
-import org.eclipse.ui.views.markers.MarkerViewHandler;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * DeleteHandler is the handler for the deletion of a marker.
- * 
- * @since 3.4
- * 
- */
-public class DeleteHandler extends MarkerViewHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-
-		MarkerSupportView view = getView(event);
-		if (view == null)
-			return this;
-
-		final IMarker[] selected = getSelectedMarkers(event);
-		
-		// Verify.
-		MessageDialog dialog = new MessageDialog(
-				view.getSite().getShell(),
-				MarkerMessages.deleteActionConfirmTitle,
-				null, // icon
-				MarkerMessages.deleteActionConfirmMessage,
-				MessageDialog.WARNING,
-				new String[] { IDialogConstants.YES_LABEL,
-						IDialogConstants.NO_LABEL }, 0);
-
-		if (dialog.open() != 0) {
-			return view;
-		}
-
-		for (int i = 0; i < selected.length; i++) {
-			try {
-				selected[i].delete();
-			} catch (CoreException e) {
-				Policy.handle(e);
-				throw new ExecutionException(e.getMessage(), e);
-			}
-		}
-		return this;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/DescriptionConfigurationArea.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/DescriptionConfigurationArea.java
deleted file mode 100644
index eef030e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/DescriptionConfigurationArea.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package org.eclipse.ui.internal.views.markers;
-
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.views.markers.FilterConfigurationArea;
-import org.eclipse.ui.views.markers.MarkerFieldFilter;
-import org.eclipse.ui.views.markers.MarkerSupportConstants;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * DescriptionConfigurationArea is the configuration area for description
- * configuration fields.
- * 
- */
-public class DescriptionConfigurationArea extends FilterConfigurationArea {
-
-	private Combo descriptionCombo;
-	private Text descriptionText;
-
-	/**
-	 * Create new instance of the receiver.
-	 */
-	public DescriptionConfigurationArea() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#apply(org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter)
-	 */
-	public void apply(MarkerFieldFilter filter) {
-		DescriptionFieldFilter desc = (DescriptionFieldFilter) filter;
-		if (descriptionCombo.getSelectionIndex() == 0)
-			desc.setContainsModifier(MarkerSupportConstants.CONTAINS_KEY);
-		else
-			desc
-					.setContainsModifier(MarkerSupportConstants.DOES_NOT_CONTAIN_KEY);
-		desc.setContainsText(descriptionText.getText());
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createContents(Composite parent) {
-		createDescriptionGroup(parent);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#initialize(org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter)
-	 */
-	public void initialize(MarkerFieldFilter filter) {
-		DescriptionFieldFilter desc = (DescriptionFieldFilter) filter;
-		if (desc.getContainsModifier().equals(
-				MarkerSupportConstants.CONTAINS_KEY))
-			descriptionCombo.select(0);
-		else
-			descriptionCombo.select(1);
-
-		descriptionText.setText(desc.getContainsText());
-
-	}
-
-	/**
-	 * Create the group for the description filter.
-	 * 
-	 * @param parent
-	 */
-	private void createDescriptionGroup(Composite parent) {
-
-		Composite descriptionComposite = new Composite(parent, SWT.NONE);
-		descriptionComposite.setLayout(new GridLayout(3, false));
-		descriptionComposite.setLayoutData(new GridData(
-				GridData.FILL_HORIZONTAL));
-
-		Label descriptionLabel = new Label(descriptionComposite, SWT.NONE);
-		descriptionLabel.setText(MarkerMessages.filtersDialog_descriptionLabel);
-
-		descriptionCombo = new Combo(descriptionComposite, SWT.READ_ONLY);
-		descriptionCombo.add(MarkerMessages.filtersDialog_contains);
-		descriptionCombo.add(MarkerMessages.filtersDialog_doesNotContain);
-
-		// Prevent Esc and Return from closing the dialog when the combo is
-		// active.
-		descriptionCombo.addTraverseListener(new TraverseListener() {
-			public void keyTraversed(TraverseEvent e) {
-				if (e.detail == SWT.TRAVERSE_ESCAPE
-						|| e.detail == SWT.TRAVERSE_RETURN) {
-					e.doit = false;
-				}
-			}
-		});
-
-		GC gc = new GC(descriptionComposite);
-		gc.setFont(JFaceResources.getDialogFont());
-		FontMetrics fontMetrics = gc.getFontMetrics();
-		gc.dispose();
-
-		descriptionText = new Text(descriptionComposite, SWT.SINGLE
-				| SWT.BORDER);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.GRAB_HORIZONTAL);
-		data.widthHint = Dialog.convertWidthInCharsToPixels(fontMetrics, 25);
-		descriptionText.setLayoutData(data);
-	}
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.FilterConfigurationArea#getTitle()
-	 */
-	public String getTitle() {
-		return MarkerMessages.propertiesDialog_description_text;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/DescriptionFieldFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/DescriptionFieldFilter.java
deleted file mode 100644
index 603ce3b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/DescriptionFieldFilter.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.Map;
-
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.views.markers.MarkerFieldFilter;
-import org.eclipse.ui.views.markers.MarkerItem;
-import org.eclipse.ui.views.markers.MarkerSupportConstants;
-import org.eclipse.ui.views.markers.internal.ProblemFilter;
-
-/**
- * DescriptionFieldFilter is the filter for descriptions.
- * 
- * @since 3.4
- * 
- */
-public class DescriptionFieldFilter extends CompatibilityFieldFilter {
-
-	static final String TAG_CONTAINS_MODIFIER = "containsModifier"; //$NON-NLS-1$
-	static final String TAG_CONTAINS_TEXT = "containsText"; //$NON-NLS-1$
-
-	String containsModifier = MarkerSupportConstants.CONTAINS_KEY;
-	String containsText = MarkerSupportInternalUtilities.EMPTY_STRING;
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public DescriptionFieldFilter() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter#loadSettings(org.eclipse.ui.IMemento)
-	 */
-	public void loadSettings(IMemento memento) {
-		String modifier = memento.getString(TAG_CONTAINS_MODIFIER);
-		if (modifier == null)
-			return;
-		String contains = memento.getString(TAG_CONTAINS_TEXT);
-		if (contains == null)
-			return;
-		containsText = contains;
-		containsModifier = modifier;
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.CompatibilityFieldFilter#loadLegacySettings(org.eclipse.ui.IMemento, org.eclipse.ui.internal.views.markers.MarkerContentGenerator)
-	 */
-	void loadLegacySettings(IMemento memento, MarkerContentGenerator generator) {
-
-		String setting = memento.getString(ProblemFilter.TAG_CONTAINS);
-
-		if (setting != null) {
-			containsModifier = Boolean.valueOf(setting).booleanValue() ? MarkerSupportConstants.CONTAINS_KEY
-					: MarkerSupportConstants.DOES_NOT_CONTAIN_KEY;
-
-		}
-
-		setting = memento.getString(ProblemFilter.TAG_DESCRIPTION);
-
-		if (setting != null) {
-			containsText = new String(setting);
-		}
-	}
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.MarkerFieldFilter#saveSettings(org.eclipse.ui.IMemento)
-	 */
-	public void saveSettings(IMemento memento) {
-		memento.putString(TAG_CONTAINS_MODIFIER, containsModifier);
-		memento.putString(TAG_CONTAINS_TEXT, containsText);
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.MarkerFieldFilter#select(org.eclipse.ui.views.markers.MarkerItem)
-	 */
-	public boolean select(MarkerItem item) {
-		if (containsText.length() == 0)
-			return true;
-
-		String value = getField().getValue(item);
-		if (containsModifier.equals(MarkerSupportConstants.CONTAINS_KEY))
-			return value.indexOf(containsText) >= 0;
-		return value.indexOf(containsText) < 0;
-
-	}
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.MarkerFieldFilter#populateWorkingCopy(org.eclipse.ui.views.markers.MarkerFieldFilter)
-	 */
-	public void populateWorkingCopy(MarkerFieldFilter copy) {
-		super.populateWorkingCopy(copy);
-		DescriptionFieldFilter clone = (DescriptionFieldFilter) copy;
-		clone.containsModifier = this.containsModifier;
-		clone.containsText = this.containsText;
-	}
-
-	/**
-	 * Return the contains modifier.
-	 * 
-	 * @return One of {@link MarkerSupportConstants#CONTAINS_KEY} or
-	 *         {@link MarkerSupportConstants#DOES_NOT_CONTAIN_KEY}
-	 */
-	String getContainsModifier() {
-		return containsModifier;
-	}
-
-	/**
-	 * Set the contains modifier.
-	 * 
-	 * @param containsString
-	 *            One of {@link MarkerSupportConstants#CONTAINS_KEY} or
-	 *            {@link MarkerSupportConstants#DOES_NOT_CONTAIN_KEY}
-	 */
-	void setContainsModifier(String containsString) {
-		this.containsModifier = containsString;
-	}
-
-	/**
-	 * Return the text to apply the containsModifier to.
-	 * 
-	 * @return String
-	 */
-	String getContainsText() {
-		return containsText;
-	}
-
-	/**
-	 * Set the text to apply the containsModifier to.
-	 * 
-	 * @param containsText
-	 *            String
-	 */
-	void setContainsText(String containsText) {
-		this.containsText = containsText;
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.MarkerFieldFilter#initialize(java.util.Map)
-	 */
-	public void initialize(Map values) {
-		super.initialize(values);
-		if (values.containsKey(MarkerSupportConstants.CONTAINS_KEY)) {
-			setContainsText((String) values
-					.get(MarkerSupportConstants.CONTAINS_KEY));
-			setContainsModifier(MarkerSupportConstants.CONTAINS_KEY);
-		} else if (values
-				.containsKey(MarkerSupportConstants.DOES_NOT_CONTAIN_KEY)) {
-			setContainsText((String) values
-					.get(MarkerSupportConstants.DOES_NOT_CONTAIN_KEY));
-			setContainsModifier(MarkerSupportConstants.DOES_NOT_CONTAIN_KEY);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.CompatibilityFieldFilter#initialize(org.eclipse.ui.views.markers.internal.ProblemFilter)
-	 */
-	public void initialize(ProblemFilter problemFilter) {
-		containsModifier = problemFilter.getContains() ? MarkerSupportConstants.CONTAINS_KEY
-				: MarkerSupportConstants.DOES_NOT_CONTAIN_KEY;
-		containsText = problemFilter.getDescription();
-
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/EditablePropertyTester.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/EditablePropertyTester.java
deleted file mode 100644
index 33d7e1d..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/EditablePropertyTester.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.core.resources.IMarker;
-
-/**
- * EditablePropertyTester is a property tester for the editable property of the
- * selected marker.
- * 
- * @since 3.4
- * 
- */
-public class EditablePropertyTester extends PropertyTester {
-
-	private static final Object EDITABLE = "editable"; //$NON-NLS-1$
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public EditablePropertyTester() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object)
-	 */
-	public boolean test(Object receiver, String property, Object[] args,
-			Object expectedValue) {
-		if (property.equals(EDITABLE)) {
-			IMarker marker = ((MarkerEntry) receiver).getMarker();
-			if (marker != null)
-				return marker.getAttribute(IMarker.USER_EDITABLE, true);
-		}
-		return false;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ExtendedMarkersView.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ExtendedMarkersView.java
deleted file mode 100644
index a7c8b83..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ExtendedMarkersView.java
+++ /dev/null
@@ -1,1886 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import com.ibm.icu.text.MessageFormat;
-
-import org.osgi.framework.Bundle;
-
-import org.eclipse.help.IContext;
-import org.eclipse.help.IContextProvider;
-import org.eclipse.osgi.util.NLS;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSourceAdapter;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.HelpEvent;
-import org.eclipse.swt.events.HelpListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.events.TreeAdapter;
-import org.eclipse.swt.events.TreeEvent;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ScrollBar;
-import org.eclipse.swt.widgets.Scrollable;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-
-import org.eclipse.jface.action.ContributionManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.OpenStrategy;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.TreeViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.SameShellProvider;
-import org.eclipse.jface.window.Window;
-
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.OpenAndLinkWithEditorHelper;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.ide.ResourceUtil;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.StatusUtil;
-import org.eclipse.ui.menus.IMenuService;
-import org.eclipse.ui.part.MarkerTransfer;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
-import org.eclipse.ui.progress.WorkbenchJob;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerItem;
-import org.eclipse.ui.views.markers.internal.MarkerGroup;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
-import org.eclipse.ui.views.tasklist.ITaskListResourceAdapter;
-
-/**
- * The ExtendedMarkersView is the internal implementation of the view that shows
- * markers using the markerGenerators extension point.
- * 
- * The ExtendedMarkersView fully supports the markerSupport extension point and
- * is meant to be used as a view to complement them.
- * 
- * The markerContentGenerators to be used by the view can be specified by
- * appending a comma separated list of them after a colon in the class
- * specification of the view. If this list is left out the problems
- * markerContentProvider will be used.
- * 
- * @since 3.4
- * 
- */
-public class ExtendedMarkersView extends ViewPart {
-
-	/**
-	 * MarkerSelectionEntry is a cache of the values for a marker entry.
-	 * 
-	 * @since 3.4
-	 * 
-	 */
-	final class MarkerSelectionEntry {
-
-		Object[] cachedValues;
-
-		MarkerSelectionEntry(MarkerItem item) {
-			MarkerField[] fields = builder.getVisibleFields();
-			cachedValues = new Object[fields.length];
-			for (int i = 0; i < fields.length; i++) {
-				cachedValues[i] = fields[i].getValue(item);
-			}
-		}
-
-		/**
-		 * Return whether or not the entry is equivalent to the cached state.
-		 * 
-		 * @param item
-		 * @return boolean <code>true</code> if they are equivalent
-		 */
-		boolean isEquivalentTo(MarkerItem item) {
-			MarkerField[] fields = builder.getVisibleFields();
-
-			if (cachedValues.length != fields.length)
-				return false;
-
-			for (int i = 0; i < fields.length; i++) {
-				if (cachedValues[i] == fields[i].getValue(item))
-					continue;
-				return false;
-			}
-			return true;
-		}
-
-	}
-
-	private static int instanceCount = 1;
-
-	private static final String TAG_GENERATOR = "markerContentGenerator"; //$NON-NLS-1$
-	private static final String TAG_HORIZONTAL_POSITION = "horizontalPosition"; //$NON-NLS-1$
-	private static final String TAG_VERTICAL_POSITION = "verticalPosition"; //$NON-NLS-1$
-	private static final String MARKER_FIELD = "MARKER_FIELD"; //$NON-NLS-1$
-
-	private static final String TAG_EXPANDED = "expanded"; //$NON-NLS-1$
-
-	private static final String TAG_CATEGORY = "category"; //$NON-NLS-1$
-
-	private static final String TAG_PART_NAME = "partName"; //$NON-NLS-1$
-
-	private static final String TAG_COLUMN_WIDTHS = "columnWidths"; //$NON-NLS-1$
-	static {
-		Platform.getAdapterManager().registerAdapters(new IAdapterFactory() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang
-			 * .Object, java.lang.Class)
-			 */
-			public Object getAdapter(Object adaptableObject, Class adapterType) {
-				if (adapterType == IMarker.class
-						&& adaptableObject instanceof MarkerEntry)
-					return ((MarkerEntry) adaptableObject).getMarker();
-
-				return null;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-			 */
-			public Class[] getAdapterList() {
-				return new Class[] { IMarker.class };
-			}
-		}, MarkerEntry.class);
-	}
-
-	/**
-	 * Return the next secondary id that has not been opened for a primary id of
-	 * a part.
-	 * 
-	 * @return part
-	 */
-	static String newSecondaryID(IViewPart part) {
-		while (part.getSite().getPage().findViewReference(
-				part.getSite().getId(), String.valueOf(instanceCount)) != null) {
-			instanceCount++;
-		}
-
-		return String.valueOf(instanceCount);
-	}
-
-	/**
-	 * Open the supplied marker in an editor in page
-	 * 
-	 * @param marker
-	 * @param page
-	 */
-	public static void openMarkerInEditor(IMarker marker, IWorkbenchPage page) {
-		// optimization: if the active editor has the same input as
-		// the
-		// selected marker then
-		// RevealMarkerAction would have been run and we only need
-		// to
-		// activate the editor
-		IEditorPart editor = page.getActiveEditor();
-		if (editor != null) {
-			IEditorInput input = editor.getEditorInput();
-			IFile file = ResourceUtil.getFile(input);
-			if (file != null) {
-				if (marker.getResource().equals(file) && OpenStrategy.activateOnOpen()) {
-					page.activate(editor);
-				}
-			}
-		}
-
-		if (marker != null && marker.getResource() instanceof IFile) {
-			try {
-				IDE.openEditor(page, marker, OpenStrategy.activateOnOpen());
-			} catch (PartInitException e) {
-
-				// Check for a nested CoreException
-				IStatus status = e.getStatus();
-				if (status != null
-						&& status.getException() instanceof CoreException) {
-					status = ((CoreException) status.getException())
-							.getStatus();
-				}
-
-				if (status == null)
-					StatusManager.getManager().handle(
-							StatusUtil.newStatus(IStatus.ERROR, e.getMessage(),
-									e), StatusManager.SHOW);
-
-				else
-					StatusManager.getManager().handle(status,
-							StatusManager.SHOW);
-
-			}
-		}
-	}
-
-	private CachedMarkerBuilder builder;
-	Collection categoriesToExpand;
-
-	private Clipboard clipboard;
-
-	Collection preservedSelection = new ArrayList();
-
-	private Job updateJob;
-
-	private MarkersTreeViewer viewer;
-	private IPropertyChangeListener preferenceListener;
-	private ISelectionListener pageSelectionListener;
-	private IPartListener2 partListener;
-	private IMemento memento;
-
-	private String[] defaultGeneratorIds = new String[0];
-
-	private IPropertyChangeListener workingSetListener;
-
-	/**
-	 * Return a new instance of the receiver.
-	 * 
-	 * @param contentGeneratorId
-	 *            the id of the generator to load.
-	 */
-	public ExtendedMarkersView(String contentGeneratorId) {
-		super();
-		defaultGeneratorIds = new String[] { contentGeneratorId };
-		preferenceListener = new IPropertyChangeListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.util.IPropertyChangeListener#propertyChange
-			 * (org.eclipse.jface.util.PropertyChangeEvent)
-			 */
-			public void propertyChange(PropertyChangeEvent event) {
-				String propertyName = event.getProperty();
-				if (propertyName
-						.equals(IDEInternalPreferences.USE_MARKER_LIMITS)
-						|| propertyName
-								.equals(IDEInternalPreferences.MARKER_LIMITS_VALUE)) {
-					viewer.refresh();
-					updateTitle();
-				}
-			}
-		};
-		IDEWorkbenchPlugin.getDefault().getPreferenceStore()
-				.addPropertyChangeListener(preferenceListener);
-	}
-
-	/**
-	 * Add all concrete {@link MarkerSupportItem} elements associated with the
-	 * receiver to allMarkers.
-	 * 
-	 * @param markerItem
-	 * @param allMarkers
-	 */
-	private void addAllConcreteItems(MarkerSupportItem markerItem,
-			Collection allMarkers) {
-		if (markerItem.isConcrete()) {
-			allMarkers.add(markerItem);
-			return;
-		}
-
-		MarkerSupportItem[] children = markerItem.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			addAllConcreteItems(children[i], allMarkers);
-		}
-
-	}
-
-	/**
-	 * Add the category to the list of expanded categories.
-	 * 
-	 * @param category
-	 */
-	void addExpandedCategory(MarkerCategory category) {
-		getCategoriesToExpand().add(category.getName());
-
-	}
-
-	/**
-	 * Add all of the markers in markerItem recursively.
-	 * 
-	 * @param markerItem
-	 * @param allMarkers
-	 *            {@link Collection} of {@link IMarker}
-	 */
-	private void addMarkers(MarkerSupportItem markerItem, Collection allMarkers) {
-		if (markerItem.getMarker() != null)
-			allMarkers.add(markerItem.getMarker());
-		MarkerSupportItem[] children = markerItem.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			addMarkers(children[i], allMarkers);
-
-		}
-
-	}
-
-	/**
-	 * Create the columns for the receiver.
-	 * 
-	 * @param currentColumns
-	 *            the columns to refresh
-	 */
-	private void createColumns(TreeColumn[] currentColumns) {
-
-		Tree tree = viewer.getTree();
-		TableLayout layout = new TableLayout();
-
-		MarkerField[] fields = builder.getVisibleFields();
-
-		IMemento columnWidths = null;
-		if (memento != null)
-			columnWidths = memento.getChild(TAG_COLUMN_WIDTHS);
-
-		for (int i = 0; i < fields.length; i++) {
-			MarkerField markerField = fields[i];
-
-			TreeViewerColumn column;
-			if (i < currentColumns.length)
-				column = new TreeViewerColumn(viewer, currentColumns[i]);
-			else {
-				column = new TreeViewerColumn(viewer, SWT.NONE);
-				column.getColumn().setResizable(true);
-				column.getColumn().setMoveable(true);
-				column.getColumn().addSelectionListener(getHeaderListener());
-			}
-
-			column.getColumn().setData(MARKER_FIELD, markerField);
-			// Show the help in the first column
-			column.setLabelProvider(new MarkerColumnLabelProvider(markerField));
-			column.getColumn().setText(markerField.getColumnHeaderText());
-			column.getColumn().setToolTipText(
-					markerField.getColumnTooltipText());
-			column.getColumn().setImage(markerField.getColumnHeaderImage());
-
-			EditingSupport support = markerField.getEditingSupport(viewer);
-			if (support != null)
-				column.setEditingSupport(support);
-
-			if (builder.getPrimarySortField().equals(markerField))
-				updateDirectionIndicator(column.getColumn(), markerField);
-
-			int columnWidth = -1;
-
-			if (i == 0) {
-				// Compute and store a font metric
-				GC gc = new GC(tree);
-				gc.setFont(tree.getFont());
-				FontMetrics fontMetrics = gc.getFontMetrics();
-				gc.dispose();
-				columnWidth = Math.max(markerField.getDefaultColumnWidth(tree),
-						fontMetrics.getAverageCharWidth() * 5);
-			}
-
-			if (columnWidths != null) {
-				Integer value = columnWidths.getInteger(getFieldId(column
-						.getColumn()));
-
-				// Make sure we get a useful value
-				if (value != null && value.intValue() > 0)
-					columnWidth = value.intValue();
-			}
-
-			// Take trim into account if we are using the default value, but not
-			// if it is restored.
-			if (columnWidth < 0)
-				layout.addColumnData(new ColumnPixelData(markerField
-						.getDefaultColumnWidth(tree), true, true));
-			else
-				layout.addColumnData(new ColumnPixelData(columnWidth, true));
-
-		}
-
-		// Remove extra columns
-		if (currentColumns.length > fields.length) {
-			for (int i = fields.length; i < currentColumns.length; i++) {
-				currentColumns[i].dispose();
-
-			}
-		}
-
-		viewer.getTree().setLayout(layout);
-		tree.setLinesVisible(true);
-		tree.setHeaderVisible(true);
-		tree.layout(true);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets
-	 * .Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		parent.setLayout(new FillLayout());
-
-		viewer = new MarkersTreeViewer(new Tree(parent, SWT.H_SCROLL
-				| SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION));
-		viewer.getTree().setLinesVisible(true);
-		viewer.setUseHashlookup(true);
-
-		createColumns(new TreeColumn[0]);
-
-		viewer.setContentProvider(getContentProvider());
-		getSite().setSelectionProvider(viewer);
-
-		viewer.setInput(builder);
-		if (memento != null) {
-			Scrollable scrollable = (Scrollable) viewer.getControl();
-			ScrollBar bar = scrollable.getVerticalBar();
-			if (bar != null) {
-				Integer position = memento.getInteger(TAG_VERTICAL_POSITION);
-				if (position != null)
-					bar.setSelection(position.intValue());
-			}
-			bar = scrollable.getHorizontalBar();
-			if (bar != null) {
-				Integer position = memento.getInteger(TAG_HORIZONTAL_POSITION);
-				if (position != null)
-					bar.setSelection(position.intValue());
-			}
-		}
-
-		// Initialise any selection based filtering
-		pageSelectionListener = getPageSelectionListener();
-		getSite().getPage().addPostSelectionListener(pageSelectionListener);
-
-		partListener = getPartListener();
-		getSite().getPage().addPartListener(partListener);
-
-		pageSelectionListener.selectionChanged(getSite().getPage()
-				.getActivePart(), getSite().getPage().getSelection());
-
-
-		new OpenAndLinkWithEditorHelper(viewer) {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.ui.OpenAndLinkWithEditorHelper#activate(org.eclipse.jface.viewers.ISelection
-			 * )
-			 */
-			protected void activate(ISelection selection) {
-				final int currentMode = OpenStrategy.getOpenMethod();
-				try {
-					OpenStrategy.setOpenMethod(OpenStrategy.DOUBLE_CLICK);
-					openSelectedMarkers();
-				} finally {
-					OpenStrategy.setOpenMethod(currentMode);
-				}
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.ui.OpenAndLinkWithEditorHelper#linkToEditor(org.eclipse.jface.viewers
-			 * .ISelection)
-			 */
-			protected void linkToEditor(ISelection selection) {
-				// Not supported by this part
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.ui.OpenAndLinkWithEditorHelper#open(org.eclipse.jface.viewers.ISelection,
-			 * boolean)
-			 */
-			protected void open(ISelection selection, boolean activate) {
-				openSelectedMarkers();
-			}
-		};
-
-		viewer.getTree().addTreeListener(new TreeAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.swt.events.TreeAdapter#treeCollapsed(org.eclipse.
-			 * swt.events.TreeEvent)
-			 */
-			public void treeCollapsed(TreeEvent e) {
-				removeExpandedCategory((MarkerCategory) e.item.getData());
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.swt.events.TreeAdapter#treeExpanded(org.eclipse.swt
-			 * .events.TreeEvent)
-			 */
-			public void treeExpanded(TreeEvent e) {
-				addExpandedCategory((MarkerCategory) e.item.getData());
-			}
-		});
-
-		// Set help on the view itself
-		viewer.getControl().addHelpListener(new HelpListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.swt.events.HelpListener#helpRequested(org.eclipse
-			 * .swt.events.HelpEvent)
-			 */
-			public void helpRequested(HelpEvent e) {
-				Object provider = getAdapter(IContextProvider.class);
-				if (provider == null)
-					return;
-
-				IContext context = ((IContextProvider) provider)
-						.getContext(viewer.getControl());
-				PlatformUI.getWorkbench().getHelpSystem().displayHelp(context);
-			}
-
-		});
-
-		viewer.getTree().addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse
-			 * .swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				ISelection selection = viewer.getSelection();
-				if (selection instanceof IStructuredSelection)
-					updateStatusLine((IStructuredSelection) viewer
-							.getSelection());
-			}
-		});
-
-		PlatformUI.getWorkbench().getWorkingSetManager()
-				.addPropertyChangeListener(getWorkingSetListener());
-
-		registerContextMenu();
-		initDragAndDrop();
-
-	}
-
-	/**
-	 * Turn off all filters in the builder.
-	 */
-	void disableAllFilters() {
-		builder.disableAllFilters();
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		builder.dispose();
-		updateJob.cancel();
-		instanceCount--;
-		if (clipboard != null)
-			clipboard.dispose();
-		IDEWorkbenchPlugin.getDefault().getPreferenceStore()
-				.removePropertyChangeListener(preferenceListener);
-		getSite().getPage().removePostSelectionListener(pageSelectionListener);
-		getSite().getPage().removePartListener(partListener);
-		PlatformUI.getWorkbench().getWorkingSetManager()
-				.removePropertyChangeListener(workingSetListener);
-	}
-
-	/**
-	 * Return all of the marker items in the receiver that are concrete.
-	 * 
-	 * @return MarkerSupportItem[]
-	 */
-	MarkerSupportItem[] getAllConcreteItems() {
-
-		MarkerSupportItem[] elements = builder.getElements();
-		Collection allMarkers = new ArrayList();
-		for (int i = 0; i < elements.length; i++) {
-			addAllConcreteItems(elements[i], allMarkers);
-
-		}
-		MarkerSupportItem[] markers = new MarkerSupportItem[allMarkers.size()];
-		allMarkers.toArray(markers);
-		return markers;
-	}
-
-	/**
-	 * Get all of the filters for the receiver.
-	 * 
-	 * @return Collection of {@link MarkerFieldFilterGroup}
-	 */
-	Collection getAllFilters() {
-		return builder.getAllFilters();
-	}
-
-	/**
-	 * Return all of the markers in the receiver.
-	 * 
-	 * @return IMarker[]
-	 */
-	IMarker[] getAllMarkers() {
-
-		MarkerSupportItem[] elements = builder.getElements();
-		Collection allMarkers = new ArrayList();
-		for (int i = 0; i < elements.length; i++) {
-			addMarkers(elements[i], allMarkers);
-
-		}
-		IMarker[] markers = new IMarker[allMarkers.size()];
-		allMarkers.toArray(markers);
-		return markers;
-
-	}
-
-	/**
-	 * Return the builder for the receiver.
-	 * 
-	 * @return CachedMarkerBuilder
-	 */
-	CachedMarkerBuilder getBuilder() {
-		return builder;
-	}
-
-	/**
-	 * Get the categories to expand for the receiver.
-	 * 
-	 * @return Collection of MarkerCategory.
-	 */
-	private Collection getCategoriesToExpand() {
-		if (categoriesToExpand == null) {
-			categoriesToExpand = new HashSet();
-			if (this.memento != null) {
-				IMemento expanded = this.memento.getChild(TAG_EXPANDED);
-				if (expanded != null) {
-					IMemento[] mementoCategories = expanded
-							.getChildren(TAG_CATEGORY);
-					MarkerCategory[] markerCategories = builder.getCategories();
-					if (markerCategories != null) {
-						for (int i = 0; i < markerCategories.length; i++) {
-							for (int j = 0; j < mementoCategories.length; j++) {
-								if (markerCategories[i].getName().equals(
-										mementoCategories[j].getID()))
-									categoriesToExpand.add(markerCategories[i]
-											.getName());
-							}
-						}
-					}
-				}
-			}
-		}
-		return categoriesToExpand;
-	}
-
-	/**
-	 * Return the group used for categorisation.
-	 * 
-	 * @return MarkerGroup
-	 */
-	MarkerGroup getCategoryGroup() {
-		return builder.getCategoryGroup();
-	}
-
-	/**
-	 * Return the clipboard for the receiver.
-	 * 
-	 * @return Clipboard
-	 */
-	Clipboard getClipboard() {
-		if (clipboard == null)
-			clipboard = new Clipboard(viewer.getControl().getDisplay());
-		return clipboard;
-	}
-
-	/**
-	 * Return the content provider for the receiver.
-	 * 
-	 * @return ITreeContentProvider
-	 * 
-	 */
-	private ITreeContentProvider getContentProvider() {
-		return new ITreeContentProvider() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.viewers.ILazyTreeContentProvider#updateChildCount
-			 * (java.lang.Object, int)
-			 */
-			// public void updateChildCount(Object element, int
-			// currentChildCount) {
-			//
-			// int length;
-			// if (element instanceof MarkerItem)
-			// length = ((MarkerItem) element).getChildren().length;
-			// else
-			// // If it is not a MarkerItem it is the root
-			// length = ((CachedMarkerBuilder) element).getElements().length;
-			//
-			// int markerLimit = MarkerSupportInternalUtilities
-			// .getMarkerLimit();
-			// length = markerLimit > 0 ? Math.min(length, markerLimit)
-			// : length;
-			// if (currentChildCount == length)
-			// return;
-			// viewer.setChildCount(element, length);
-			//
-			// }
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.viewers.ILazyTreeContentProvider#updateElement
-			 * (java.lang.Object, int)
-			 */
-			// public void updateElement(Object parent, int index) {
-			// MarkerItem newItem;
-			//
-			// if (parent instanceof MarkerItem)
-			// newItem = ((MarkerItem) parent).getChildren()[index];
-			// else
-			// newItem = ((CachedMarkerBuilder) parent).getElements()[index];
-			//
-			// viewer.replace(parent, index, newItem);
-			// updateChildCount(newItem, -1);
-			//
-			// if (!newItem.isConcrete()
-			// && categoriesToExpand
-			// .contains(((MarkerCategory) newItem).getName())) {
-			// viewer.expandToLevel(newItem, 1);
-			// categoriesToExpand.remove(newItem);
-			// }
-			//
-			// }
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java
-			 * .lang.Object)
-			 */
-			public Object[] getChildren(Object parentElement) {
-				MarkerSupportItem[] children = ((MarkerSupportItem) parentElement)
-						.getChildren();
-
-				return getLimitedChildren(children);
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.viewers.IStructuredContentProvider#getElements
-			 * (java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-
-				return getLimitedChildren(((CachedMarkerBuilder) inputElement)
-						.getElements());
-			}
-
-			/**
-			 * Get the children limited by the marker limits.
-			 * 
-			 * @param children
-			 * @return Object[]
-			 */
-			private Object[] getLimitedChildren(Object[] children) {
-				int newLength = MarkerSupportInternalUtilities.getMarkerLimit();
-				if (newLength > 0 && newLength < children.length) {
-					Object[] newChildren = new Object[newLength];
-					System.arraycopy(children, 0, newChildren, 0, newLength);
-					return newChildren;
-				}
-				return children;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.viewers.ILazyTreeContentProvider#getParent(
-			 * java.lang.Object)
-			 */
-			public Object getParent(Object element) {
-				Object parent = ((MarkerSupportItem) element).getParent();
-				if (parent == null)
-					return builder;
-				return parent;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java
-			 * .lang.Object)
-			 */
-			public boolean hasChildren(Object element) {
-				return ((MarkerSupportItem) element).getChildren().length > 0;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse
-			 * .jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-
-			}
-		};
-	}
-
-	/**
-	 * Get the id of the marker field in treeColumn.
-	 * 
-	 * @param treeColumn
-	 * @return String
-	 */
-	private String getFieldId(TreeColumn treeColumn) {
-		return ((MarkerField) treeColumn.getData(MARKER_FIELD))
-				.getConfigurationElement().getAttribute(
-						MarkerSupportInternalUtilities.ATTRIBUTE_ID);
-	}
-
-	/**
-	 * Return the ids of the generators specified for the receiver.
-	 * 
-	 * @return String[]
-	 */
-	String[] getGeneratorIds() {
-		return defaultGeneratorIds;
-	}
-
-	/**
-	 * Return the listener that updates sort values on selection.
-	 * 
-	 * @return SelectionListener
-	 */
-	private SelectionListener getHeaderListener() {
-
-		return new SelectionAdapter() {
-			/**
-			 * Handles the case of user selecting the header area.
-			 */
-			public void widgetSelected(SelectionEvent e) {
-
-				final TreeColumn column = (TreeColumn) e.widget;
-				final MarkerField field = (MarkerField) column
-						.getData(MARKER_FIELD);
-				setPrimarySortField(field, column);
-			}
-
-		};
-
-	}
-
-	/**
-	 * Return the selection listener for the page selection change.
-	 * 
-	 * @return ISelectionListener
-	 */
-	private ISelectionListener getPageSelectionListener() {
-		return new ISelectionListener() {
-			/**
-			 * Get an ITaskListResourceAdapter for use by the default/
-			 * 
-			 * @return ITaskListResourceAdapter
-			 */
-			private ITaskListResourceAdapter getDefaultTaskListAdapter() {
-				return new ITaskListResourceAdapter() {
-
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see
-					 * org.eclipse.ui.views.tasklist.ITaskListResourceAdapter
-					 * #getAffectedResource(org.eclipse.core.runtime.IAdaptable)
-					 */
-					public IResource getAffectedResource(IAdaptable adaptable) {
-						Object resource = adaptable.getAdapter(IResource.class);
-						if (resource == null)
-							resource = adaptable.getAdapter(IFile.class);
-						if (resource == null)
-							return null;
-						return (IResource) resource;
-
-					}
-
-				};
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse
-			 * .ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-			 */
-			public void selectionChanged(IWorkbenchPart part,
-					ISelection selection) {
-
-				// Do not respond to our own selections or if we are not
-				// visible
-				if (part == ExtendedMarkersView.this
-						|| !(getSite().getPage().isPartVisible(part)))
-					return;
-
-				List selectedElements = new ArrayList();
-				if (part instanceof IEditorPart) {
-					IEditorPart editor = (IEditorPart) part;
-					IFile file = ResourceUtil.getFile(editor.getEditorInput());
-					if (file == null) {
-						IEditorInput editorInput = editor.getEditorInput();
-						if (editorInput != null) {
-							Object mapping = editorInput
-									.getAdapter(ResourceMapping.class);
-							if (mapping != null) {
-								selectedElements.add(mapping);
-							}
-						}
-					} else {
-						selectedElements.add(file);
-					}
-				} else {
-					if (selection instanceof IStructuredSelection) {
-						for (Iterator iterator = ((IStructuredSelection) selection)
-								.iterator(); iterator.hasNext();) {
-							Object object = iterator.next();
-							if (object instanceof IAdaptable) {
-								ITaskListResourceAdapter taskListResourceAdapter;
-								Object adapter = ((IAdaptable) object)
-										.getAdapter(ITaskListResourceAdapter.class);
-								if (adapter != null
-										&& adapter instanceof ITaskListResourceAdapter) {
-									taskListResourceAdapter = (ITaskListResourceAdapter) adapter;
-								} else {
-									taskListResourceAdapter = getDefaultTaskListAdapter();
-								}
-
-								IResource resource = taskListResourceAdapter
-										.getAffectedResource((IAdaptable) object);
-								if (resource == null) {
-									Object mapping = ((IAdaptable) object)
-											.getAdapter(ResourceMapping.class);
-									if (mapping != null) {
-										selectedElements.add(mapping);
-									}
-								} else {
-									selectedElements.add(resource);
-								}
-							}
-						}
-					}
-				}
-				builder.updateForNewSelection(selectedElements.toArray());
-			}
-
-		};
-	}
-
-	/**
-	 * Return a part listener for the receiver.
-	 * 
-	 * @return IPartListener2
-	 */
-	private IPartListener2 getPartListener() {
-		return new IPartListener2() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @seeorg.eclipse.ui.IPartListener2#partActivated(org.eclipse.ui.
-			 * IWorkbenchPartReference)
-			 */
-			public void partActivated(IWorkbenchPartReference partRef) {
-				// Do nothing by default
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.ui.IPartListener2#partBroughtToTop(org.eclipse.ui
-			 * .IWorkbenchPartReference)
-			 */
-			public void partBroughtToTop(IWorkbenchPartReference partRef) {
-				// Do nothing by default
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @seeorg.eclipse.ui.IPartListener2#partClosed(org.eclipse.ui.
-			 * IWorkbenchPartReference)
-			 */
-			public void partClosed(IWorkbenchPartReference partRef) {
-				// Do nothing by default
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.ui.IPartListener2#partDeactivated(org.eclipse.ui.
-			 * IWorkbenchPartReference)
-			 */
-			public void partDeactivated(IWorkbenchPartReference partRef) {
-				// Do nothing by default
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @seeorg.eclipse.ui.IPartListener2#partHidden(org.eclipse.ui.
-			 * IWorkbenchPartReference)
-			 */
-			public void partHidden(IWorkbenchPartReference partRef) {
-				// Do nothing by default
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.ui.IPartListener2#partInputChanged(org.eclipse.ui
-			 * .IWorkbenchPartReference)
-			 */
-			public void partInputChanged(IWorkbenchPartReference partRef) {
-				// Do nothing by default
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @seeorg.eclipse.ui.IPartListener2#partOpened(org.eclipse.ui.
-			 * IWorkbenchPartReference)
-			 */
-			public void partOpened(IWorkbenchPartReference partRef) {
-				// Do nothing by default
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @seeorg.eclipse.ui.IPartListener2#partVisible(org.eclipse.ui.
-			 * IWorkbenchPartReference)
-			 */
-			public void partVisible(IWorkbenchPartReference partRef) {
-				if (partRef.getId().equals(
-						ExtendedMarkersView.this.getSite().getId())) {
-					pageSelectionListener.selectionChanged(getSite().getPage()
-							.getActivePart(), getSite().getPage()
-							.getSelection());
-				}
-
-			}
-
-		};
-	}
-
-	/**
-	 * Return all of the markers in the current selection
-	 * 
-	 * @return Array of {@link IMarker}
-	 */
-	public IMarker[] getSelectedMarkers() {
-		ISelection selection = viewer.getSelection();
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structured = (IStructuredSelection) selection;
-			Iterator elements = structured.iterator();
-			Collection result = new ArrayList();
-			while (elements.hasNext()) {
-				MarkerSupportItem next = (MarkerSupportItem) elements.next();
-				if (next.isConcrete())
-					result.add(((MarkerEntry) next).getMarker());
-			}
-			if (result.isEmpty())
-				return MarkerSupportInternalUtilities.EMPTY_MARKER_ARRAY;
-			IMarker[] markers = new IMarker[result.size()];
-			result.toArray(markers);
-			return markers;
-		}
-		return MarkerSupportInternalUtilities.EMPTY_MARKER_ARRAY;
-
-	}
-
-	/**
-	 * Return the sort direction.
-	 * 
-	 * @return boolean
-	 */
-	public boolean getSortAscending() {
-		return viewer.getTree().getSortDirection() == SWT.TOP;
-	}
-
-	/**
-	 * Get the status message for the title and status line.
-	 * 
-	 * @return String
-	 */
-	private String getStatusMessage() {
-
-		String status = MarkerSupportInternalUtilities.EMPTY_STRING;
-		int totalCount = builder.getTotalMarkerCount();
-		int filteredCount = 0;
-		MarkerSupportItem[] categories = builder.getCategories();
-		// Categories might be null if building is still happening
-		if (categories != null && builder.isShowingHierarchy()) {
-			int markerLimit = MarkerSupportInternalUtilities.getMarkerLimit();
-
-			for (int i = 0; i < categories.length; i++) {
-				filteredCount += markerLimit < 0 ? categories[i]
-						.getChildrenCount() : Math.min(categories[i]
-						.getChildrenCount(), markerLimit);
-			}
-		} else {
-			filteredCount = MarkerSupportInternalUtilities.getMarkerLimit();
-		}
-
-		Integer[] counts = builder.getMarkerCounts();
-
-		// Any errors or warnings? If not then send the filtering message
-		if (counts[0].intValue() == 0 && counts[1].intValue() == 0) {
-			if (filteredCount < 0 || filteredCount >= totalCount) {
-				status = NLS.bind(MarkerMessages.filter_itemsMessage,
-						new Integer(totalCount));
-			} else {
-				status = NLS.bind(MarkerMessages.filter_matchedMessage,
-						new Integer(filteredCount), new Integer(totalCount));
-			}
-			return status;
-		}
-
-		if (filteredCount < 0 || filteredCount >= totalCount)
-			return MessageFormat.format(
-					MarkerMessages.errorsAndWarningsSummaryBreakdown, counts);
-		return NLS
-				.bind(
-						MarkerMessages.problem_filter_matchedMessage,
-						new Object[] {
-								MessageFormat
-										.format(
-												MarkerMessages.errorsAndWarningsSummaryBreakdown,
-												counts),
-								new Integer(filteredCount),
-								new Integer(totalCount) });
-	}
-
-	/**
-	 * Return a job for updating the receiver.
-	 * 
-	 * @return Job
-	 */
-	private Job getUpdateJob(final CachedMarkerBuilder builder) {
-		updateJob = new WorkbenchJob(MarkerMessages.MarkerView_queueing_updates) {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.core.runtime.jobs.Job#belongsTo(java.lang.Object)
-			 */
-			public boolean belongsTo(Object family) {
-				return family == MarkerContentGenerator.CACHE_UPDATE_FAMILY;
-			}
-
-			/**
-			 * Return the viewer that is being updated.
-			 * 
-			 * @return TreeViewer
-			 */
-			private TreeViewer getViewer() {
-
-				return viewer;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.
-			 * runtime.IProgressMonitor)
-			 */
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-
-				if (viewer.getControl().isDisposed()) {
-					return Status.CANCEL_STATUS;
-				}
-
-				if (monitor.isCanceled())
-					return Status.CANCEL_STATUS;
-
-				// If there is only one category and the user has no saved state
-				// show it
-				if (builder.isShowingHierarchy()
-						&& getCategoriesToExpand().isEmpty()) {
-					MarkerCategory[] categories = builder.getCategories();
-					if (categories != null && categories.length == 1)
-						getCategoriesToExpand().add(
-								categories[0].getDescription());
-				}
-
-				getViewer().refresh(true);
-				updateTitle();
-
-				if (preservedSelection.size() > 0) {
-
-					Collection newSelection = new ArrayList();
-					MarkerItem[] markerEntries = builder.getMarkerEntries();
-
-					for (int i = 0; i < markerEntries.length; i++) {
-						Iterator preserved = preservedSelection.iterator();
-						while (preserved.hasNext()) {
-							MarkerSelectionEntry next = (MarkerSelectionEntry) preserved
-									.next();
-							if (next.isEquivalentTo(markerEntries[i])) {
-								newSelection.add(markerEntries[i]);
-								continue;
-							}
-						}
-					}
-
-					getViewer().setSelection(
-							new StructuredSelection(newSelection.toArray()),
-							true);
-					preservedSelection.clear();
-				}
-				if (getViewer().getTree().getItemCount() > 0)
-					getViewer().getTree().setTopItem(
-							getViewer().getTree().getItem(0));
-
-				reexpandCategories(builder);
-				return Status.OK_STATUS;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.progress.WorkbenchJob#shouldRun()
-			 */
-			public boolean shouldRun() {
-				return !builder.isBuilding()
-						&& IDEWorkbenchPlugin.getDefault().getBundle()
-								.getState() == Bundle.ACTIVE;
-			}
-
-		};
-
-		updateJob.setSystem(true);
-		return updateJob;
-	}
-
-	/**
-	 * Return the object that is the input to the viewer.
-	 * 
-	 * @return Object
-	 */
-	Object getViewerInput() {
-		return viewer.getInput();
-	}
-
-	/**
-	 * Get all of the fields visible in the receiver.
-	 * 
-	 * @return MarkerField[]
-	 */
-	MarkerField[] getVisibleFields() {
-		return builder.getVisibleFields();
-	}
-
-	/**
-	 * Create a listener for working set changes.
-	 * 
-	 * @return IPropertyChangeListener
-	 */
-	private IPropertyChangeListener getWorkingSetListener() {
-		workingSetListener = new IPropertyChangeListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.util.IPropertyChangeListener#propertyChange
-			 * (org.eclipse.jface.util.PropertyChangeEvent)
-			 */
-			public void propertyChange(PropertyChangeEvent event) {
-				builder.scheduleMarkerUpdate();
-
-			}
-
-		};
-		return workingSetListener;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite,
-	 * org.eclipse.ui.IMemento)
-	 */
-	public void init(IViewSite site, IMemento memento) throws PartInitException {
-		super.init(site, memento);
-		MarkerContentGenerator generator = null;
-
-		if (memento != null) {
-			generator = MarkerSupportRegistry.getInstance().getGenerator(
-					memento.getString(TAG_GENERATOR));
-		}
-
-		if (generator == null && defaultGeneratorIds.length > 0) {
-			generator = MarkerSupportRegistry.getInstance().getGenerator(
-					defaultGeneratorIds[0]);
-			if (generator == null)
-				logInvalidGenerator(defaultGeneratorIds[0]);
-		}
-
-		if (generator == null)
-			generator = MarkerSupportRegistry.getInstance()
-					.getDefaultGenerator();
-
-		// Add in the entries common to all markers views
-		IMenuService menuService = (IMenuService) site
-				.getService(IMenuService.class);
-
-		// Add in the markers view actions
-
-		menuService.populateContributionManager((ContributionManager) site
-				.getActionBars().getMenuManager(), "menu:" //$NON-NLS-1$
-				+ MarkerSupportRegistry.MARKERS_ID);
-		menuService.populateContributionManager((ContributionManager) site
-				.getActionBars().getToolBarManager(),
-				"toolbar:" + MarkerSupportRegistry.MARKERS_ID); //$NON-NLS-1$
-
-		String viewId = site.getId();
-		if (site.getSecondaryId() != null) {
-			viewId = viewId + site.getSecondaryId();
-		}
-		builder = new CachedMarkerBuilder(generator, viewId, memento);
-
-		builder.setUpdateJob(getUpdateJob(builder));
-		Object service = site.getAdapter(IWorkbenchSiteProgressService.class);
-		if (service != null)
-			builder.setProgressService((IWorkbenchSiteProgressService) service);
-		this.memento = memento;
-
-		if (memento == null || memento.getString(TAG_PART_NAME) == null)
-			return;
-
-		setPartName(memento.getString(TAG_PART_NAME));
-	}
-
-	/**
-	 * Initialize the title based on the name
-	 * 
-	 * @param name
-	 */
-	void initializeTitle(String name) {
-		setPartName(name);
-
-	}
-
-	/**
-	 * Return whether or not group is enabled.
-	 * 
-	 * @param group
-	 * @return boolean
-	 */
-	boolean isEnabled(MarkerFieldFilterGroup group) {
-		return builder.getEnabledFilters().contains(group);
-	}
-
-	/**
-	 * Return the main sort field for the receiver.
-	 * 
-	 * @return {@link MarkerField}
-	 */
-	boolean isPrimarySortField(MarkerField field) {
-		return builder.getPrimarySortField().equals(field);
-	}
-
-	/**
-	 * Return whether or not generator is the selected one.
-	 * 
-	 * @param generator
-	 * @return boolean
-	 */
-	boolean isShowing(MarkerContentGenerator generator) {
-		return this.builder.getGenerator().equals(generator);
-	}
-
-	/**
-	 * Log that a generator id is invalid.
-	 * 
-	 * @param id
-	 */
-	void logInvalidGenerator(String id) {
-		StatusManager.getManager().handle(
-				new Status(IStatus.WARNING, IDEWorkbenchPlugin.IDE_WORKBENCH,
-						NLS.bind("Invalid markerContentGenerator {0} ", //$NON-NLS-1$
-								id)));
-	}
-
-	/**
-	 * Open the filters dialog for the receiver.
-	 */
-	void openFiltersDialog() {
-		FiltersConfigurationDialog dialog = new FiltersConfigurationDialog(
-				new SameShellProvider(getSite().getWorkbenchWindow().getShell()),
-				builder);
-		if (dialog.open() == Window.OK) {
-			builder.updateFrom(dialog);
-		}
-
-	}
-
-	/**
-	 * Open the selected markers
-	 */
-	void openSelectedMarkers() {
-		IMarker[] markers = getSelectedMarkers();
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
-			IWorkbenchPage page = getSite().getPage();
-
-			openMarkerInEditor(marker, page);
-		}
-	}
-
-	/**
-	 * Restore the expanded categories.
-	 * 
-	 * @param builder
-	 */
-	void reexpandCategories(final CachedMarkerBuilder builder) {
-		if (!getCategoriesToExpand().isEmpty() && builder.isShowingHierarchy()) {
-			MarkerItem[] items = builder.getElements();
-			for (int i = 0; i < items.length; i++) {
-				String name = ((MarkerCategory) items[i]).getName();
-				if (getCategoriesToExpand().contains(name))
-					viewer.expandToLevel(items[i], 2);
-
-			}
-		}
-	}
-
-	/**
-	 * Register the context menu for the receiver so that commands may be added
-	 * to it.
-	 */
-	private void registerContextMenu() {
-		MenuManager contextMenu = new MenuManager();
-		contextMenu.setRemoveAllWhenShown(true);
-		getSite().registerContextMenu(contextMenu, viewer);
-		// Add in the entries for all markers views if this has a different if
-		if (!getSite().getId().equals(MarkerSupportRegistry.MARKERS_ID))
-			getSite().registerContextMenu(MarkerSupportRegistry.MARKERS_ID,
-					contextMenu, viewer);
-		Control control = viewer.getControl();
-		Menu menu = contextMenu.createContextMenu(control);
-
-		control.setMenu(menu);
-	}
-
-	/**
-	 * Remove the category from the list of expanded ones.
-	 * 
-	 * @param category
-	 */
-	void removeExpandedCategory(MarkerCategory category) {
-		getCategoriesToExpand().remove(category.getName());
-
-	}
-
-	/**
-	 * Preserve the selection for re-selection after the next update.
-	 * 
-	 * @param selection
-	 */
-	void saveSelection(ISelection selection) {
-		preservedSelection.clear();
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structured = (IStructuredSelection) selection;
-			Iterator iterator = structured.iterator();
-			while (iterator.hasNext()) {
-				MarkerSupportItem next = (MarkerSupportItem) iterator.next();
-				if (next.isConcrete()) {
-					preservedSelection.add(new MarkerSelectionEntry(next));
-					getCategoriesToExpand().add(next.getParent());
-				} else
-					getCategoriesToExpand().add(next);
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.ViewPart#saveState(org.eclipse.ui.IMemento)
-	 */
-	public void saveState(IMemento memento) {
-		super.saveState(memento);
-		memento.putString(TAG_GENERATOR, builder.getGenerator().getId());
-		memento.putString(TAG_PART_NAME, getPartName());
-
-		if (!getCategoriesToExpand().isEmpty()) {
-			IMemento expanded = memento.createChild(TAG_EXPANDED);
-			Iterator categories = getCategoriesToExpand().iterator();
-			while (categories.hasNext()) {
-				expanded.createChild(TAG_CATEGORY, (String) categories.next());
-			}
-		}
-
-		IMemento columnEntry = memento.createChild(TAG_COLUMN_WIDTHS);
-
-		MarkerField[] fields = new MarkerField[viewer.getTree()
-				.getColumnCount()];
-		int[] positions = viewer.getTree().getColumnOrder();
-
-		for (int i = 0; i < fields.length; i++) {
-			TreeColumn column = viewer.getTree().getColumn(i);
-			columnEntry.putInteger(getFieldId(column), column.getWidth());
-			fields[positions[i]] = (MarkerField) column.getData(MARKER_FIELD);
-		}
-
-		builder.saveState(memento, fields);
-	}
-
-	/**
-	 * Select all of the elements in the receiver.
-	 */
-	void selectAll() {
-		viewer.getTree().selectAll();
-
-	}
-
-	/**
-	 * Set the category group for the receiver.
-	 * 
-	 * @param group
-	 */
-	void setCategoryGroup(MarkerGroup group) {
-		getCategoriesToExpand().clear();
-		builder.setCategoryGroup(group);
-	}
-
-	/**
-	 * Set the content generator for the receiver.
-	 * 
-	 * @param generator
-	 */
-	void setContentGenerator(MarkerContentGenerator generator) {
-		viewer.setSelection(new StructuredSelection());
-		viewer.removeAndClearAll();
-		builder.setGenerator(generator);
-		createColumns(viewer.getTree().getColumns());
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		viewer.getControl().setFocus();
-
-	}
-
-	/**
-	 * Set the primary sort field
-	 * 
-	 * @param field
-	 */
-	void setPrimarySortField(MarkerField field) {
-		TreeColumn[] columns = viewer.getTree().getColumns();
-		for (int i = 0; i < columns.length; i++) {
-			TreeColumn treeColumn = columns[i];
-			if (columns[i].getData(MARKER_FIELD).equals(field)) {
-				setPrimarySortField(field, treeColumn);
-				return;
-			}
-		}
-		StatusManager.getManager().handle(
-				StatusUtil.newStatus(IStatus.WARNING,
-						"Sorting by non visible field " //$NON-NLS-1$
-								+ field.getColumnHeaderText(), null));
-	}
-
-	/**
-	 * Set the primary sort field to field and update the column.
-	 * 
-	 * @param field
-	 * @param column
-	 */
-	private void setPrimarySortField(MarkerField field, TreeColumn column) {
-		builder.setPrimarySortField(field);
-
-		IWorkbenchSiteProgressService service = (IWorkbenchSiteProgressService) getViewSite()
-				.getAdapter(IWorkbenchSiteProgressService.class);
-		builder.refreshContents(service);
-		updateDirectionIndicator(column, field);
-		viewer.refresh();
-		reexpandCategories(builder);
-	}
-
-	/**
-	 * Set the selection of the receiver. reveal the item if reveal is true.
-	 * 
-	 * @param structuredSelection
-	 * @param reveal
-	 */
-	void setSelection(StructuredSelection structuredSelection, boolean reveal) {
-
-		List newSelection = new ArrayList(structuredSelection.size());
-
-		for (Iterator i = structuredSelection.iterator(); i.hasNext();) {
-			Object next = i.next();
-			if (next instanceof IMarker) {
-				MarkerItem marker = builder.getMarkerItem((IMarker) next);
-				if (marker != null) {
-					newSelection.add(marker);
-				}
-			}
-		}
-
-		IStructuredSelection structured = new StructuredSelection(newSelection);
-
-		viewer.setSelection(structured, reveal);
-		updateStatusLine(structured);
-
-	}
-
-	/**
-	 * Add group to the enabled filters.
-	 * 
-	 * @param group
-	 */
-	void toggleFilter(MarkerFieldFilterGroup group) {
-		builder.toggleFilter(group);
-
-	}
-
-	/**
-	 * Toggle the sort direction of the primary field
-	 */
-	void toggleSortDirection() {
-		setPrimarySortField(builder.getPrimarySortField());
-
-	}
-
-	/**
-	 * Update the direction indicator as column is now the primary column.
-	 * 
-	 * @param column
-	 * @field {@link MarkerField}
-	 */
-	void updateDirectionIndicator(TreeColumn column, MarkerField field) {
-		viewer.getTree().setSortColumn(column);
-		if (builder.getSortDirection(field) == MarkerComparator.ASCENDING)
-			viewer.getTree().setSortDirection(SWT.UP);
-		else
-			viewer.getTree().setSortDirection(SWT.DOWN);
-	}
-
-	/**
-	 * Update the status line with the new selection
-	 * 
-	 * @param newSelection
-	 */
-	private void updateStatusLine(IStructuredSelection newSelection) {
-		String message;
-
-		if (newSelection == null || newSelection.size() == 0) {
-			message = MarkerSupportInternalUtilities.EMPTY_STRING;
-		} else if (newSelection.size() == 1) {
-			// Use the Message attribute of the marker
-			message = ((MarkerSupportItem) newSelection.getFirstElement())
-					.getDescription();
-
-		} else
-			// Show stats on only those items in the selection
-			message = MessageFormat.format(
-					MarkerMessages.marker_statusSummarySelected, new Object[] {
-							new Integer(newSelection.size()),
-							getStatusMessage() });
-
-		getViewSite().getActionBars().getStatusLineManager()
-				.setMessage(message);
-	}
-
-	/**
-	 * Update the title of the view.
-	 */
-	void updateTitle() {
-		setContentDescription(getStatusMessage());
-	}
-
-	/**
-	 * Initialize drag and drop for the receiver.
-	 */
-	private void initDragAndDrop() {
-		int operations = DND.DROP_COPY;
-		Transfer[] transferTypes = new Transfer[] {
-				MarkerTransfer.getInstance(), TextTransfer.getInstance() };
-		DragSourceListener listener = new DragSourceAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.swt.dnd.DragSourceAdapter#dragSetData(org.eclipse
-			 * .swt.dnd.DragSourceEvent)
-			 */
-			public void dragSetData(DragSourceEvent event) {
-				performDragSetData(event);
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.swt.dnd.DragSourceAdapter#dragFinished(org.eclipse
-			 * .swt.dnd.DragSourceEvent)
-			 */
-			public void dragFinished(DragSourceEvent event) {
-			}
-		};
-
-		viewer.addDragSupport(operations, transferTypes, listener);
-	}
-
-	/**
-	 * The user is attempting to drag marker data. Add the appropriate data to
-	 * the event depending on the transfer type.
-	 */
-	private void performDragSetData(DragSourceEvent event) {
-		if (MarkerTransfer.getInstance().isSupportedType(event.dataType)) {
-
-			event.data = getSelectedMarkers();
-			return;
-		}
-		if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
-			IMarker[] markers = getSelectedMarkers();
-			if (markers != null)
-				event.data = MarkerCopyHandler
-						.createMarkerReport(this, markers);
-		}
-	}
-
-	/**
-	 * Return the fields that are not hidden.
-	 * 
-	 * @return Object[]
-	 */
-	Object[] getHiddenFields() {
-		return builder.getHiddenFields();
-	}
-
-	/**
-	 * @param visible
-	 */
-	void setVisibleFields(Collection visible) {
-		builder.setVisibleFields(visible);
-		viewer.setSelection(new StructuredSelection());
-		viewer.removeAndClearAll();
-		createColumns(viewer.getTree().getColumns());
-		viewer.refresh();
-	}
-
-	/**
-	 * @return the viewer
-	 */
-	TreeViewer getViewer() {
-		return viewer;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/FileMarkerPropertyTester.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/FileMarkerPropertyTester.java
deleted file mode 100644
index 6f028e2..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/FileMarkerPropertyTester.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.core.resources.IResource;
-
-/**
- * FileMarkerPropertyTester is a property tester for a marker entry to see if it
- * is a marker that has a file behind it.
- * 
- * @since 3.4
- * 
- */
-public class FileMarkerPropertyTester extends PropertyTester {
-
-	private static final Object FILE_MARKER = "fileMarker"; //$NON-NLS-1$
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public FileMarkerPropertyTester() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object)
-	 */
-	public boolean test(Object receiver, String property, Object[] args,
-			Object expectedValue) {
-		if (property.equals(FILE_MARKER)) {
-			if (((MarkerEntry) receiver).getMarker().getResource().getType() == IResource.FILE)
-				return true;
-		}
-		return false;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/FiltersConfigurationDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/FiltersConfigurationDialog.java
deleted file mode 100644
index a515897..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/FiltersConfigurationDialog.java
+++ /dev/null
@@ -1,640 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007,2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Remy Chi Jian Suen <remy.suen@gmail.com> 
- * 			- Fix for Bug 214443 Problem view filter created even if I hit Cancel
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-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.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-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.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.events.IExpansionListener;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.views.markers.FilterConfigurationArea;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * FiltersConfigurationDialog is the dialog for configuring the filters for the
- * 
- * @since 3.3
- * 
- */
-public class FiltersConfigurationDialog extends Dialog {
-
-	private static final String SELECTED_FILTER_GROUP = "SELECTED_FILTER_GROUP"; //$NON-NLS-1$
-
-	private Collection filterGroups;
-
-	private CheckboxTableViewer filtersList;
-
-	private GroupFilterConfigurationArea scopeArea = new ScopeArea();
-
-	private MarkerFieldFilterGroup selectedFilterGroup;
-
-	private ScrolledForm form;
-
-	private CachedMarkerBuilder builder;
-
-	private Collection filterAreas;
-
-	private boolean andFilters = false;
-
-	private Button removeButton;
-
-	/**
-	 * Create a new instance of the receiver on builder.
-	 * 
-	 * @param parentShell
-	 * @param builder
-	 *            The {@link CachedMarkerBuilder} to apply this to
-	 */
-	public FiltersConfigurationDialog(IShellProvider parentShell,
-			CachedMarkerBuilder builder) {
-		super(parentShell);
-		filterGroups = makeWorkingCopy(builder.getAllFilters());
-		this.builder = builder;
-		andFilters = builder.andFilters();
-	}
-
-	/**
-	 * Return whether or not to AND the filters
-	 * 
-	 * @return boolean
-	 */
-	boolean andFilters() {
-		return andFilters;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#close()
-	 */
-	public boolean close() {
-		saveDialogSettings();
-		return super.close();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-
-		parent.getShell().setText(MarkerMessages.configureFiltersDialog_title);
-
-		Composite top = (Composite) super.createDialogArea(parent);
-
-		initializeDialogUnits(top);
-
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.makeColumnsEqualWidth = false;
-		top.setLayout(layout);
-
-		createFilterSelectionArea(top);
-
-		final FormToolkit toolkit = new FormToolkit(top.getDisplay());
-		parent.addDisposeListener(new DisposeListener() {
-
-			public void widgetDisposed(DisposeEvent e) {
-				toolkit.dispose();
-
-			}
-		});
-		form = toolkit.createScrolledForm(top);
-		form.setBackground(parent.getBackground());
-
-		GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
-		form.setLayoutData(data);
-		form.getBody().setLayout(new GridLayout());
-
-		filterAreas = builder.createFilterConfigurationFields();
-
-		createFieldArea(toolkit, form, scopeArea, true);
-		Iterator areas = filterAreas.iterator();
-
-		while (areas.hasNext()) {
-			createFieldArea(toolkit, form, (FilterConfigurationArea) areas
-					.next(), true);
-		}
-
-		if (filterGroups.isEmpty())
-			setFieldsEnabled(false);
-		else
-			loadDialogSettings();
-
-		applyDialogFont(top);
-		return top;
-	}
-
-	/**
-	 * Create a field area in the form for the FilterConfigurationArea
-	 * 
-	 * @param toolkit
-	 * @param form
-	 * @param area
-	 * @param expand
-	 *            <code>true</code> if the area should be expanded by default
-	 */
-	private void createFieldArea(final FormToolkit toolkit,
-			final ScrolledForm form, final FilterConfigurationArea area,
-			boolean expand) {
-		final ExpandableComposite expandable = toolkit
-				.createExpandableComposite(form.getBody(),
-						ExpandableComposite.TWISTIE);
-		expandable.setText(area.getTitle());
-		expandable.setBackground(form.getBackground());
-		expandable.setLayout(new GridLayout());
-		expandable.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
-		expandable.addExpansionListener(new IExpansionListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.forms.events.IExpansionListener#expansionStateChanged(org.eclipse.ui.forms.events.ExpansionEvent)
-			 */
-			public void expansionStateChanged(ExpansionEvent e) {
-				expandable.getParent().layout(true);
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.forms.events.IExpansionListener#expansionStateChanging(org.eclipse.ui.forms.events.ExpansionEvent)
-			 */
-			public void expansionStateChanging(ExpansionEvent e) {
-
-			}
-		});
-
-		Composite sectionClient = toolkit.createComposite(expandable);
-		sectionClient.setLayout(new GridLayout());
-		sectionClient.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true,
-				false));
-		sectionClient.setBackground(form.getBackground());
-		area.createContents(sectionClient);
-		expandable.setClient(sectionClient);
-		expandable.setExpanded(expand);
-	}
-
-	/**
-	 * Create the area for selecting the filters and enabling/disabling them.
-	 * 
-	 * @param top
-	 */
-	private void createFilterSelectionArea(Composite top) {
-
-		Composite filtersComposite = new Composite(top, SWT.NONE);
-		filtersComposite.setLayout(new GridLayout(2, false));
-		filtersComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
-				true));
-
-		Label title = new Label(filtersComposite, SWT.NONE);
-		title.setText(MarkerMessages.filtersDialog_entriesTitle);
-		GridData titleData = new GridData();
-		titleData.horizontalSpan = 2;
-		title.setLayoutData(titleData);
-
-		filtersList = CheckboxTableViewer.newCheckList(filtersComposite,
-				SWT.BORDER);
-		filtersList.setContentProvider(new IStructuredContentProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-				// Do nothing
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				return filterGroups.toArray();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-				// Do nothing
-			}
-		});
-
-		filtersList.setLabelProvider(new LabelProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-			 */
-			public String getText(Object element) {
-				return ((MarkerFieldFilterGroup) element).getName();
-			}
-		});
-
-		if (selectedFilterGroup != null)
-			filtersList.setSelection(new StructuredSelection(
-					selectedFilterGroup));
-
-		filtersList
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-					 */
-					public void selectionChanged(SelectionChangedEvent event) {
-						setSelectedFilter((MarkerFieldFilterGroup) ((IStructuredSelection) event
-								.getSelection()).getFirstElement());
-
-					}
-				});
-
-		filtersList.setInput(this);
-
-		Iterator filterIterator = filterGroups.iterator();
-		while (filterIterator.hasNext()) {
-			MarkerFieldFilterGroup group = (MarkerFieldFilterGroup) filterIterator
-					.next();
-			filtersList.setChecked(group, group.isEnabled());
-		}
-
-		GridData listData = new GridData(SWT.FILL, SWT.FILL, true, true);
-		listData.widthHint = convertHorizontalDLUsToPixels(100);
-		filtersList.getControl().setLayoutData(listData);
-
-		Composite buttons = new Composite(filtersComposite, SWT.NONE);
-		GridLayout buttonLayout = new GridLayout();
-		buttonLayout.marginWidth = 0;
-		buttons.setLayout(buttonLayout);
-		GridData buttonsData = new GridData();
-		buttonsData.verticalAlignment = GridData.BEGINNING;
-		buttons.setLayoutData(buttonsData);
-
-		Button addNew = new Button(buttons, SWT.PUSH);
-		addNew.setText(MarkerMessages.MarkerFilter_addFilterName);
-		addNew.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				InputDialog newDialog = new InputDialog(getShell(),
-						MarkerMessages.MarkerFilterDialog_title,
-						MarkerMessages.MarkerFilterDialog_message,
-						MarkerMessages.MarkerFilter_newFilterName,
-						new IInputValidator() {
-							/*
-							 * (non-Javadoc)
-							 * 
-							 * @see org.eclipse.jface.dialogs.IInputValidator#isValid(java.lang.String)
-							 */
-							public String isValid(String newText) {
-								if (newText.length() == 0)
-									return MarkerMessages.MarkerFilterDialog_emptyMessage;
-								Iterator filterIterator = filterGroups
-										.iterator();
-								while (filterIterator.hasNext()) {
-									if (((MarkerFieldFilterGroup) filterIterator
-											.next()).getName().equals(newText))
-										return NLS
-												.bind(
-														MarkerMessages.filtersDialog_conflictingName,
-														newText);
-								}
-
-								return null;
-							}
-						});
-				if (Window.OK == newDialog.open()) {
-					String newName = newDialog.getValue();
-					if (newName != null) {
-						createNewFilter(newName);
-					}
-				}
-			}
-		});
-		setButtonLayoutData(addNew);
-
-		removeButton = new Button(buttons, SWT.PUSH);
-		removeButton.setText(MarkerMessages.MarkerFilter_deleteSelectedName);
-		removeButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				removeFilters(filtersList.getSelection());
-			}
-		});
-		setButtonLayoutData(removeButton);
-
-		Button andButton = new Button(filtersComposite, SWT.RADIO);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL, SWT.NONE, true,
-				false);
-		data.horizontalSpan = 2;
-		andButton.setLayoutData(data);
-		andButton.setText(MarkerMessages.AND_Title);
-		andButton.setSelection(andFilters);
-		andButton.addSelectionListener(new SelectionAdapter() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				andFilters = true;
-			}
-		});
-
-		Button orButton = new Button(filtersComposite, SWT.RADIO);
-		data = new GridData(GridData.FILL_HORIZONTAL, SWT.NONE, true, false);
-		data.horizontalSpan = 2;
-		orButton.setLayoutData(data);
-		orButton.setText(MarkerMessages.OR_Title);
-		orButton.setSelection(!andFilters);
-		orButton.addSelectionListener(new SelectionAdapter() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				andFilters = false;
-			}
-		});
-	}
-
-	/**
-	 * Create a new filter called newName
-	 * 
-	 * @param newName
-	 */
-	private void createNewFilter(String newName) {
-		MarkerFieldFilterGroup group = new MarkerFieldFilterGroup(null, builder);
-		group.setName(newName);
-		filterGroups.add(group);
-		filtersList.refresh();
-		filtersList.setSelection(new StructuredSelection(group));
-		filtersList.setChecked(group, true);
-	}
-
-	/**
-	 * Return the dialog settings for the receiver.
-	 * 
-	 * @return IDialogSettings
-	 */
-	private IDialogSettings getDialogSettings() {
-		IDialogSettings settings = IDEWorkbenchPlugin.getDefault()
-				.getDialogSettings().getSection(this.getClass().getName());
-
-		if (settings == null) {
-			settings = IDEWorkbenchPlugin.getDefault().getDialogSettings()
-					.addNewSection(this.getClass().getName());
-		}
-
-		return settings;
-	}
-
-	/**
-	 * Return the filter groups modified by the receiver.
-	 * 
-	 * @return Collection of {@link MarkerFieldFilterGroup}
-	 */
-	Collection getFilters() {
-		return filterGroups;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#isResizable()
-	 */
-	protected boolean isResizable() {
-		return true;
-	}
-
-	/**
-	 * Load the dialog settings.
-	 */
-	private void loadDialogSettings() {
-		IDialogSettings settings = getDialogSettings();
-
-		String selection = settings.get(SELECTED_FILTER_GROUP);
-
-		if (selection != null) {
-			Iterator groups = filterGroups.iterator();
-			while (groups.hasNext()) {
-				MarkerFieldFilterGroup group = (MarkerFieldFilterGroup) groups
-						.next();
-				if (group.getName().equals(selection)) {
-					filtersList.setSelection(new StructuredSelection(group));
-					return;
-				}
-			}
-		}
-
-		// If there is no initial selection make one
-		filtersList.setSelection(new StructuredSelection(filterGroups
-				.iterator().next()));
-	}
-
-	/**
-	 * Make a working copy of the groups.
-	 * 
-	 * @param groups
-	 * @return Collection of MarkerFieldFilterGroup
-	 */
-	private Collection makeWorkingCopy(Collection groups) {
-		Iterator initialFiltersIterator = groups.iterator();
-		Collection returnFilters = new ArrayList(groups.size());
-		while (initialFiltersIterator.hasNext()) {
-			MarkerFieldFilterGroup group = (MarkerFieldFilterGroup) initialFiltersIterator
-					.next();
-			MarkerFieldFilterGroup copy = group.makeWorkingCopy();
-			if (copy != null)
-				returnFilters.add(copy);
-		}
-		return returnFilters;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-
-		if (!shouldContinue())
-			return;
-
-		Iterator filterGroupIterator = filterGroups.iterator();
-		while (filterGroupIterator.hasNext()) {
-			MarkerFieldFilterGroup group = (MarkerFieldFilterGroup) filterGroupIterator
-					.next();
-			group.setEnabled(filtersList.getChecked(group));
-		}
-		if (selectedFilterGroup != null) {
-
-			scopeArea.applyToGroup(selectedFilterGroup);
-			Iterator areas = filterAreas.iterator();
-			while (areas.hasNext()) {
-				FilterConfigurationArea area = (FilterConfigurationArea) areas
-						.next();
-
-				// Handle the internal special cases
-				if (area instanceof GroupFilterConfigurationArea)
-					((GroupFilterConfigurationArea) area)
-							.applyToGroup(selectedFilterGroup);
-				area.apply(selectedFilterGroup.getFilter(area.getField()));
-			}
-		}
-
-		super.okPressed();
-
-	}
-
-	/**
-	 * Return whether or not deselected elements should have been selected.
-	 * 
-	 * @return boolean
-	 */
-	private boolean shouldContinue() {
-		if (filtersList.getCheckedElements().length == 0) {
-			return MessageDialog.openQuestion(getShell(),
-					MarkerMessages.filtersDialogDeselectedFiltersTitle,
-					MarkerMessages.filtersDialogDeselectedFiltersMessage);
-		}
-
-		return true;
-	}
-
-	/**
-	 * Remove the filters in selection.
-	 * 
-	 * @param selection
-	 */
-	private void removeFilters(ISelection selection) {
-		filterGroups.remove(((IStructuredSelection) selection)
-				.getFirstElement());
-		filtersList.refresh();
-	}
-
-	/**
-	 * Save the dialog settings for the receiver.
-	 */
-	private void saveDialogSettings() {
-		IDialogSettings settings = getDialogSettings();
-
-		if (selectedFilterGroup != null)
-			settings.put(SELECTED_FILTER_GROUP, selectedFilterGroup.getName());
-
-	}
-
-	/**
-	 * Set the control and all of it's visibility state to visible.
-	 * 
-	 * @param visible
-	 * @param control
-	 */
-	private void setEnabled(boolean visible, Control control) {
-		control.setEnabled(visible);
-		if (control instanceof Composite) {
-			Control[] children = ((Composite) control).getChildren();
-			for (int i = 0; i < children.length; i++) {
-				setEnabled(visible, children[i]);
-			}
-		}
-	}
-
-	/**
-	 * Set the enablement state of the fields to enabled.
-	 */
-	private void setFieldsEnabled(boolean visible) {
-		setEnabled(visible, form);
-	}
-
-	/**
-	 * Set the filter that is being worked on.
-	 * 
-	 * @param markerFieldFilterGroup
-	 */
-	private void setSelectedFilter(MarkerFieldFilterGroup markerFieldFilterGroup) {
-
-		removeButton
-				.setEnabled(!(markerFieldFilterGroup == null || markerFieldFilterGroup
-						.isSystem()));
-
-		MarkerFieldFilterGroup old = selectedFilterGroup;
-		selectedFilterGroup = markerFieldFilterGroup;
-		if (old != null)
-			scopeArea.applyToGroup(old);
-
-		if (selectedFilterGroup == null) {
-			setFieldsEnabled(false);
-			return;
-		}
-
-		setFieldsEnabled(true);
-		scopeArea.initializeFromGroup(selectedFilterGroup);
-		Iterator areas = filterAreas.iterator();
-		while (areas.hasNext()) {
-			FilterConfigurationArea area = (FilterConfigurationArea) areas
-					.next();
-			if (old != null) {
-				if (area instanceof GroupFilterConfigurationArea)
-					((GroupFilterConfigurationArea) area).applyToGroup(old);
-				area.apply(old.getFilter(area.getField()));
-			}
-			if (area instanceof GroupFilterConfigurationArea)
-				((GroupFilterConfigurationArea) area)
-						.initializeFromGroup(selectedFilterGroup);
-			area.initialize(selectedFilterGroup.getFilter(area.getField()));
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/FiltersContribution.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/FiltersContribution.java
deleted file mode 100644
index 1a8a44c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/FiltersContribution.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * FiltersContribution is the contribution for the filters menu.
- * 
- * @since 3.4
- * 
- */
-public class FiltersContribution extends MarkersContribution {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
-	 */
-	protected IContributionItem[] getContributionItems() {
-
-		Collection groups = getView().getAllFilters();
-
-		if (groups.size() == 0)
-			return new IContributionItem[0];
-
-		Iterator groupsIterator = groups.iterator();
-		IContributionItem[] items = new IContributionItem[groups.size() + 2];
-		for (int i = 0; i < groups.size(); i++) {
-			final MarkerFieldFilterGroup group = (MarkerFieldFilterGroup) groupsIterator
-					.next();
-			items[i] = new ContributionItem() {
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Menu,
-				 *      int)
-				 */
-				public void fill(Menu menu, int index) {
-					MenuItem item = new MenuItem(menu, SWT.CHECK);
-					item.setText(group.getName());
-					ExtendedMarkersView view = getView();
-					item.addListener(SWT.Selection, getMenuItemListener(group,
-							view));
-
-					if (view != null && view.isEnabled(group)) {
-						item.setSelection(true);
-					}
-				}
-
-				/**
-				 * Return the menu item listener for selection of a filter.
-				 * 
-				 * @param group
-				 * @param view
-				 * @return Listener
-				 */
-				private Listener getMenuItemListener(
-						final MarkerFieldFilterGroup group,
-						final ExtendedMarkersView view) {
-					return new Listener() {
-						/*
-						 * (non-Javadoc)
-						 * 
-						 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-						 */
-						public void handleEvent(Event event) {
-							if (view != null)
-								view.toggleFilter(group);
-						}
-					};
-				}
-			};
-		}
-
-		items[groups.size()] = new Separator();
-		items[groups.size() + 1] = getShowAllContribution();
-
-		return items;
-
-	}
-
-	/**
-	 * Return the show all contribution.
-	 * 
-	 * @return IContributionItem
-	 */
-	private IContributionItem getShowAllContribution() {
-		return new ContributionItem() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Menu,
-			 *      int)
-			 */
-			public void fill(Menu menu, int index) {
-				MenuItem item = new MenuItem(menu, SWT.CHECK);
-				item.setText(MarkerMessages.MarkerFilter_showAllCommand_title);
-				item.setSelection(noFiltersSelected());
-
-				item.addListener(SWT.Selection, new Listener() {
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-					 */
-					public void handleEvent(Event event) {
-						getView().disableAllFilters();
-					}
-				});
-			}
-
-			/**
-			 * Return whether or not any filters are selected.
-			 * 
-			 * @return boolean <code>true</code> if none of the current
-			 *         filters are selected.
-			 */
-			private boolean noFiltersSelected() {
-				Iterator groupsIterator = getView().getAllFilters().iterator();
-				while (groupsIterator.hasNext()) {
-					MarkerFieldFilterGroup group = (MarkerFieldFilterGroup) groupsIterator
-							.next();
-					if (group.isEnabled())
-						return false;
-				}
-				return true;
-			}
-
-		};
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/GroupFilterConfigurationArea.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/GroupFilterConfigurationArea.java
deleted file mode 100644
index eb5106f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/GroupFilterConfigurationArea.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.ui.views.markers.FilterConfigurationArea;
-
-/**
- * GroupFilterConfigurationArea is the FilterConfigurationArea for the special case
- * group level settings for a {@link MarkerFieldFilterGroup}
- * @since 3.4
- *
- */
-abstract class GroupFilterConfigurationArea extends FilterConfigurationArea {
-	
-	/**
-	 * Apply to the group
-	 * @param group
-	 */
-	public abstract void applyToGroup(MarkerFieldFilterGroup group);
-	
-	/**
-	 * Initialise from the group
-	 * @param group
-	 */
-	public abstract void initializeFromGroup(MarkerFieldFilterGroup group);
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/GroupsContribution.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/GroupsContribution.java
deleted file mode 100644
index afb2312..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/GroupsContribution.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.views.markers.internal.MarkerGroup;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * GroupsContribution is the contribution for the marker groupings.
- * 
- * @since 3.4
- * 
- */
-public class GroupsContribution extends MarkersContribution {
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public GroupsContribution() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
-	 */
-	protected IContributionItem[] getContributionItems() {
-
-		Collection groups = getView().getBuilder().getGenerator().getMarkerGroups();
-
-		if (groups.isEmpty())
-			return new IContributionItem[0];
-
-		Iterator groupsIterator = groups.iterator();
-		IContributionItem[] items = new IContributionItem[groups.size() + 1];
-
-		for (int i = 0; i < items.length - 1; i++) {
-			final MarkerGroup group = (MarkerGroup) groupsIterator.next();
-			items[i] = getContributionItem(group);
-		}
-
-		items[items.length - 1] = getContributionItem(null);
-		return items;
-
-	}
-
-	/**
-	 * Return the IContributionItem for group.
-	 * 
-	 * @param group
-	 * @return IContributionItem
-	 */
-	private IContributionItem getContributionItem(final MarkerGroup group) {
-		return new ContributionItem() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Menu,
-			 *      int)
-			 */
-			public void fill(Menu menu, int index) {
-				MenuItem item = new MenuItem(menu, SWT.RADIO);
-				item.setText(group == null ? MarkerMessages.ProblemView_None
-						: group.getMarkerField().getColumnHeaderText());
-				ExtendedMarkersView view = getView();
-				item.addListener(SWT.Selection,
-						getMenuItemListener(group, view));
-
-				if (view != null) {
-					if (group == null)
-						item.setSelection(view.getCategoryGroup() == null);
-					else
-						item
-								.setSelection(group.equals(view
-										.getCategoryGroup()));
-				}
-
-			}
-
-			/**
-			 * Return the menu item listener for selection of a filter.
-			 * 
-			 * @param group
-			 * @param view
-			 * @return Listener
-			 */
-			private Listener getMenuItemListener(final MarkerGroup group,
-					final ExtendedMarkersView view) {
-				return new Listener() {
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-					 */
-					public void handleEvent(Event event) {
-
-						MenuItem item = (MenuItem) event.widget;
-
-						if (item.getSelection() && view != null)
-							view.setCategoryGroup(group);
-					}
-				};
-			}
-		};
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkCompletedHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkCompletedHandler.java
deleted file mode 100644
index c40cad4..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkCompletedHandler.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007,2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.UpdateMarkersOperation;
-import org.eclipse.ui.internal.ide.StatusUtil;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.views.markers.MarkerViewHandler;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * MarkCompletedHandler is the handler for marking the current selection as
- * completed.
- * 
- * @since 3.4
- * 
- */
-public class MarkCompletedHandler extends MarkerViewHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) {
-
-		final ExecutionEvent finalEvent = event;
-		try {
-			PlatformUI.getWorkbench().getProgressService().run(true, true,
-					new IRunnableWithProgress() {
-						/*
-						 * (non-Javadoc)
-						 * 
-						 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
-						 */
-						public void run(IProgressMonitor monitor) {
-							monitor.beginTask(
-									MarkerMessages.markCompletedHandler_task,
-									100);
-							IMarker[] markers = getSelectedMarkers(finalEvent);
-							if (markers.length == 0)
-								return;
-
-							Map attrs = new HashMap();
-							attrs.put(IMarker.DONE, Boolean.TRUE);
-							IUndoableOperation op = new UpdateMarkersOperation(
-									markers, attrs,
-									MarkerMessages.markCompletedAction_title,
-									true);
-
-							monitor.worked(20);
-							if(monitor.isCanceled())
-								return;
-							execute(op,
-									MarkerMessages.markCompletedAction_title,
-									new SubProgressMonitor(monitor, 80), null);
-							monitor.done();
-
-						}
-					});
-		} catch (InvocationTargetException e) {
-			StatusManager.getManager().handle(
-					StatusUtil.newStatus(IStatus.ERROR,
-							e.getLocalizedMessage(), e), StatusManager.LOG);
-		} catch (InterruptedException e) {
-			StatusManager.getManager().handle(
-					StatusUtil.newStatus(IStatus.WARNING, e
-							.getLocalizedMessage(), e), StatusManager.LOG);
-		}
-		return this;
-
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerCategory.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerCategory.java
deleted file mode 100644
index 043643b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerCategory.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.views.markers.MarkerItem;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-class MarkerCategory extends MarkerSupportItem {
-
-	int start;
-
-	int end;
-
-	private MarkerEntry[] children;
-
-	private String name;
-
-	private CachedMarkerBuilder cachedMarkerBuilder;
-
-	private int severity = -1;
-
-	/**
-	 * Create a new instance of the receiver that has the markers between
-	 * startIndex and endIndex showing.
-	 * 
-	 * @param cachedMarkerBuilder
-	 * @param startIndex
-	 * @param endIndex
-	 *            the builder used to generate the children lazily.
-	 */
-	MarkerCategory(CachedMarkerBuilder cachedMarkerBuilder, int startIndex,
-			int endIndex, String categoryName) {
-		this.cachedMarkerBuilder = cachedMarkerBuilder;
-		start = startIndex;
-		end = endIndex;
-		name = categoryName;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.MarkerSupportItem#getChildren()
-	 */
-	MarkerSupportItem[] getChildren() {
-
-		if (children == null) {
-
-			// Return nothing while a build is going on as this could be
-			// stale
-			if (this.cachedMarkerBuilder.isBuilding()) {
-				return MarkerSupportInternalUtilities.EMPTY_MARKER_ITEM_ARRAY;
-			}
-
-			MarkerItem[] allMarkers = cachedMarkerBuilder.getMarkerEntries();
-
-			int totalSize = getChildrenCount();
-			children = new MarkerEntry[totalSize];
-
-			System.arraycopy(allMarkers, start, children, 0, totalSize);
-
-			for (int i = 0; i < children.length; i++) {
-				children[i].setCategory(this);
-			}
-		}
-		return children;
-
-	}
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.MarkerSupportItem#getChildrenCount()
-	 */
-	int getChildrenCount() {
-		return end - start + 1;
-	}
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.MarkerSupportItem#getDescription()
-	 */
-	String getDescription() {
-
-		int size = getChildrenCount();
-		int limit = MarkerSupportInternalUtilities.getMarkerLimit();
-
-		if (limit > 0 && size > limit) {
-			return NLS.bind(MarkerMessages.Category_Limit_Label,
-					new Object[] {
-							name,
-							String.valueOf(MarkerSupportInternalUtilities
-									.getMarkerLimit()),
-							String.valueOf(getChildrenCount()) });
-
-		}
-		if (size == 1)
-			return NLS.bind(MarkerMessages.Category_One_Item_Label,
-					new Object[] { name });
-
-		return NLS.bind(MarkerMessages.Category_Label, new Object[] { name,
-				String.valueOf(size) });
-
-	}
-
-	 /**
-	 * Get the highest severity in the receiver.
-	 * @return int
-	 */
-	int getHighestSeverity() {
-		if(severity  >= 0)
-			return severity;
-		severity = 0;//Reset to info
-		MarkerSupportItem[] contents = getChildren();
-		for (int i = 0; i < contents.length; i++) {
-			if(contents[i].isConcrete()){
-				int elementSeverity = contents[i].getAttributeValue(IMarker.SEVERITY, -1);
-				if(elementSeverity > severity)
-					severity = elementSeverity;
-				if(severity == IMarker.SEVERITY_ERROR)//As bad as it gets
-					return severity;
-			}			
-		}
-		return severity;
-	}
-
-	/**
-	 * Return the name of the receiver.
-	 * 
-	 * @return String
-	 */
-	String getName() {
-		return name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.MarkerSupportItem#getParent()
-	 */
-	MarkerSupportItem getParent() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.MarkerSupportItem#isConcrete()
-	 */
-	boolean isConcrete() {
-		return false;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerColumnLabelProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerColumnLabelProvider.java
deleted file mode 100644
index b6e7755..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerColumnLabelProvider.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
-import org.eclipse.jface.resource.LocalResourceManager;
-import org.eclipse.jface.resource.ResourceManager;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.views.markers.MarkerField;
-
-/**
- * The MarkerColumnLabelProvider is a label provider for an individual column.
- * 
- * @since 3.4
- * 
- */
-public class MarkerColumnLabelProvider extends ColumnLabelProvider {
-
-	MarkerField field;
-	private ResourceManager imageManager;
-
-	/**
-	 * Create a MarkerViewLabelProvider on a field.
-	 * 
-	 * @param field
-	 */
-	MarkerColumnLabelProvider(MarkerField field) {
-		FieldDecorationRegistry.getDefault();
-		this.field = field;
-		imageManager = new LocalResourceManager(IDEWorkbenchPlugin.getDefault()
-				.getResourceManager());
-		field.setImageManager(imageManager);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		imageManager.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ColumnLabelProvider#update(org.eclipse.jface.viewers.ViewerCell)
-	 */
-	public void update(ViewerCell cell) {
-		field.update(cell);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerComparator.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerComparator.java
deleted file mode 100644
index 3811412..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerComparator.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.Iterator;
-
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerItem;
-
-/**
- * The MarkerComparator is the class that handles the comparison of markers for
- * a specific content provider.
- * 
- * @since 3.4
- * 
- */
-class MarkerComparator implements Comparator {
-
-	private MarkerField category;
-
-	// These fields are in sort order
-	private MarkerField[] fields;
-	/**
-	 * Constant to indicate an ascending sort direction.
-	 */
-	public static final int ASCENDING = 1;
-	/**
-	 * Constant to indicate an descending sort direction.
-	 */
-	public static final int DESCENDING = -1;
-	private static final String PRIMARY_SORT_FIELD_TAG = "PRIMARY_SORT_FIELD"; //$NON-NLS-1$
-
-	private static final String DESCENDING_FIELDS = "DESCENDING_FIELDS"; //$NON-NLS-1$
-
-	// The fields with reversed direction
-	HashSet descendingFields = new HashSet();
-
-	/**
-	 * Create a new instance of the receiver categorised by categoryField
-	 * 
-	 * @param categoryField
-	 *            May be <code>null/<code>
-	 * @param mainFields in order of compare significance
-	 */
-	public MarkerComparator(MarkerField categoryField, MarkerField[] mainFields) {
-		category = categoryField;
-		fields = mainFields;
-	}
-
-	/**
-	 * Compare the two objects to see if they have the same category value
-	 * 
-	 * @param object1
-	 * @param object2
-	 * @return int
-	 * @see Comparable#compareTo(Object)
-	 */
-	public int compareCategory(Object object1, Object object2) {
-		if (category == null)
-			return 0;
-		return category.compare((MarkerItem) object1, (MarkerItem) object2);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Object arg0, Object arg1) {
-
-		MarkerItem item0 = (MarkerItem) arg0;
-		MarkerItem item1 = (MarkerItem) arg1;
-
-		// Sort by category first
-		if (category != null) {
-			int value = category.compare(item0, item1);
-			if (value != 0)
-				return value;
-		}
-
-		for (int i = 0; i < fields.length; i++) {
-
-			int value;
-			if (descendingFields.contains(fields[i]))
-				value = fields[i].compare(item1, item0);
-			else
-				value = fields[i].compare(item0, item1);
-			if (value == 0)
-				continue;
-			return value;
-		}
-		return 0;
-	}
-
-	/**
-	 * Switch the priority of the field from ascending to descending or vice
-	 * versa.
-	 * 
-	 * @param field
-	 */
-	public void reversePriority(MarkerField field) {
-		if (descendingFields.remove(field))
-			return;
-		descendingFields.add(field);
-
-	}
-
-	/**
-	 * Set field to be the first sort field.
-	 * 
-	 * @param field
-	 */
-	void setPrimarySortField(MarkerField field) {
-		if (fields[0] == field) {
-			reversePriority(field);
-			return;
-		}
-		int insertionIndex = 1;
-		MarkerField[] newFields = new MarkerField[fields.length];
-
-		newFields[0] = field;
-		for (int i = 0; i < newFields.length; i++) {
-			if (fields[i] == field)
-				continue;
-			newFields[insertionIndex] = fields[i];
-			insertionIndex++;
-		}
-
-		fields = newFields;
-
-	}
-
-	/**
-	 * Restore the receiver's state from memento.
-	 * 
-	 * @param memento
-	 */
-	void restore(IMemento memento) {
-		if (memento == null)
-			return;
-
-		String primaryField = memento.getString(PRIMARY_SORT_FIELD_TAG);
-		if (primaryField == null
-				|| primaryField.equals(MarkerSupportInternalUtilities
-						.getId(fields[0])))
-			return;
-		for (int i = 1; i < fields.length; i++) {
-			if (MarkerSupportInternalUtilities.getId(fields[i]).equals(
-					primaryField)) {
-				setPrimarySortField(fields[i]);
-				break;
-			}
-		}
-		IMemento[] descending = memento.getChildren(DESCENDING_FIELDS);
-
-		for (int i = 0; i < fields.length; i++) {
-			for (int j = 0; j < descending.length; j++) {
-				if (descending[j].getID().equals(
-						MarkerSupportInternalUtilities.getId(fields[i]))) {
-					descendingFields.add(fields[i]);
-					continue;
-				}
-
-			}
-		}
-
-	}
-
-	/**
-	 * Save the current sort field in the memento.
-	 * 
-	 * @param memento
-	 */
-	void saveState(IMemento memento) {
-		memento.putString(PRIMARY_SORT_FIELD_TAG,
-				MarkerSupportInternalUtilities.getId(fields[0]));
-		Iterator descendingIterator = descendingFields.iterator();
-		while (descendingIterator.hasNext()) {
-			memento.createChild(DESCENDING_FIELDS,
-					(MarkerSupportInternalUtilities
-							.getId((MarkerField) descendingIterator.next())));
-		}
-
-	}
-
-	/**
-	 * Get the field that is the main sort field
-	 * 
-	 * @return MarkerField
-	 */
-	MarkerField getPrimarySortField() {
-		return fields[0];
-	}
-
-	/**
-	 * Set the category field without changing other sort orders.
-	 * @param category or <code>null</code>
-	 */
-	void setCategory(MarkerField category) {
-		this.category = category;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerCompletionField.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerCompletionField.java
deleted file mode 100644
index c65f825..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerCompletionField.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CheckboxCellEditor;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerItem;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * MarkerCompletionField is the class that specifies the completion entry.
- * 
- * @since 3.4
- * 
- */
-public class MarkerCompletionField extends MarkerField {
-
-	private class CompletionEditingSupport extends EditingSupport {
-
-		private CheckboxCellEditor editor;
-
-		/**
-		 * Create a new instance of the receiver.
-		 * 
-		 * @param viewer
-		 */
-		public CompletionEditingSupport(ColumnViewer viewer) {
-			super(viewer);
-			this.editor = new CheckboxCellEditor((Composite) viewer
-					.getControl());
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object)
-		 */
-		protected boolean canEdit(Object element) {
-			if (element instanceof MarkerEntry)
-				return ((MarkerEntry) element).getAttributeValue(
-						IMarker.USER_EDITABLE, false);
-			return false;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.EditingSupport#getCellEditor(java.lang.Object)
-		 */
-		protected CellEditor getCellEditor(Object element) {
-			return editor;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.EditingSupport#getValue(java.lang.Object)
-		 */
-		protected Object getValue(Object element) {
-			return new Boolean(((MarkerEntry) element).getAttributeValue(
-					IMarker.DONE, false));
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.EditingSupport#setValue(java.lang.Object,
-		 *      java.lang.Object)
-		 */
-		protected void setValue(Object element, Object value) {
-			MarkerEntry entry = (MarkerEntry) element;
-			Boolean booleanValue = (Boolean) value;
-			try {
-				entry.getMarker().setAttribute(IMarker.DONE,
-						booleanValue.booleanValue());
-			} catch (CoreException e) {
-				Policy.handle(e);
-			}
-
-		}
-	}
-
-	static final String COMPLETE_IMAGE_PATH = "$nl$/icons/full/obj16/complete_tsk.gif"; //$NON-NLS-1$
-
-	static final String INCOMPLETE_IMAGE_PATH = "$nl$/icons/full/obj16/incomplete_tsk.gif"; //$NON-NLS-1$
-	private static final int DONE = 2;
-	private static final int NOT_DONE = 1;
-
-	private static final int UNDEFINED = 0;
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public MarkerCompletionField() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerField#compare(org.eclipse.ui.internal.provisional.views.markers.api.MarkerItem,
-	 *      org.eclipse.ui.internal.provisional.views.markers.api.MarkerItem)
-	 */
-	public int compare(MarkerItem item1, MarkerItem item2) {
-		return getDoneConstant(item2) - getDoneConstant(item1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerField#getColumnHeaderText()
-	 */
-	public String getColumnHeaderText() {
-		return MarkerSupportInternalUtilities.EMPTY_STRING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerField#getColumnTooltipText()
-	 */
-	public String getColumnTooltipText() {
-		return MarkerMessages.completion_description;
-	}
-
-	/**
-	 * Return the image for task completion.
-	 * 
-	 * @return Image
-	 */
-	private Image getCompleteImage() {
-		return MarkerSupportInternalUtilities.createImage(COMPLETE_IMAGE_PATH,
-				getImageManager());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerField#getDefaultColumnWidth(org.eclipse.swt.widgets.Control)
-	 */
-	public int getDefaultColumnWidth(Control control) {
-		return 40;
-	}
-
-	/**
-	 * Return the constant that indicates whether or not the receiver is done
-	 * 
-	 * @param item
-	 * @return 1 if it is done, 0 if it not and -1 if it cannot be determined.
-	 */
-	private int getDoneConstant(MarkerItem item) {
-
-		int done = UNDEFINED;
-
-		if (item.getMarker() != null
-				&& item.getAttributeValue(IMarker.USER_EDITABLE, true)) {
-			done = NOT_DONE;
-			if (item.getAttributeValue(IMarker.DONE, false)) {
-				done = DONE;
-			}
-		}
-		return done;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerField#getEditingSupport(org.eclipse.jface.viewers.ColumnViewer)
-	 */
-	public EditingSupport getEditingSupport(ColumnViewer viewer) {
-
-		return new CompletionEditingSupport(viewer);
-	}
-
-	/**
-	 * Get the image for item.
-	 * 
-	 * @param element
-	 * @return Image
-	 */
-	private Image getImage(Object element) {
-
-		switch (getDoneConstant((MarkerItem) element)) {
-		case DONE:
-			return getCompleteImage();
-		case NOT_DONE:
-			return MarkerSupportInternalUtilities
-					.createImage(INCOMPLETE_IMAGE_PATH,getImageManager());
-		default:
-			return null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerField#getValue(org.eclipse.ui.internal.provisional.views.markers.MarkerItem)
-	 */
-	public String getValue(MarkerItem item) {
-		return MarkerSupportInternalUtilities.EMPTY_STRING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.MarkerField#update(org.eclipse.jface.viewers.ViewerCell)
-	 */
-	public void update(ViewerCell cell) {
-		super.update(cell);
-		cell.setImage(getImage(cell.getElement()));
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerContentGenerator.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerContentGenerator.java
deleted file mode 100644
index 8b6bd46..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerContentGenerator.java
+++ /dev/null
@@ -1,687 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.internal.MarkerGroup;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
-import org.eclipse.ui.views.markers.internal.MarkerType;
-import org.eclipse.ui.views.markers.internal.MarkerTypesModel;
-
-/**
- * MarkerContentGenerator is the representation of the markerContentGenerator
- * extension point.
- * 
- * @since 3.4
- * 
- */
-public class MarkerContentGenerator {
-
-	private static final String ATTRIBUTE_DEFAULT_MARKER_GROUPING = "defaultMarkerGrouping"; //$NON-NLS-1$
-	private static final String ATTRIBUTE_VISIBLE = "visible"; //$NON-NLS-1$
-
-	/**
-	 * The job family for content updates
-	 */
-	public static final Object CACHE_UPDATE_FAMILY = new Object();
-	private static final String ELEMENT_MARKER_FIELD_CONFIGURATION = "markerFieldConfiguration"; //$NON-NLS-1$;
-	private static final IResource[] EMPTY_RESOURCE_ARRAY = new IResource[0];
-	private static final String MARKER_FIELD_REFERENCE = "markerFieldReference"; //$NON-NLS-1$
-
-	private MarkerField[] allFields;
-	private IConfigurationElement configurationElement;
-	private Collection markerTypes;
-	private MarkerField[] initialVisible;
-	private Collection groups;
-	private Collection generatorExtensions = new ArrayList();
-	private Map allTypesTable;
-
-	/**
-	 * Create a new MarkerContentGenerator
-	 * 
-	 * @param element
-	 */
-	public MarkerContentGenerator(IConfigurationElement element) {
-		configurationElement = element;
-	}
-
-	/**
-	 * Add the groups defined in the receiver to the collection of groups.
-	 * 
-	 * @param groups
-	 */
-	private void addDefinedGroups(Collection groups) {
-		// Add the ones in the receiver.
-		addGroupsFrom(configurationElement, groups);
-		// Add the extensions
-		Iterator extensions = generatorExtensions.iterator();
-		while (extensions.hasNext()) {
-			addGroupsFrom((IConfigurationElement) extensions.next(), groups);
-		}
-	}
-
-	/**
-	 * Add the extensions to the receiver.
-	 * 
-	 * @param extensions
-	 *            Collection of {@link IConfigurationElement}
-	 */
-	public void addExtensions(Collection extensions) {
-		generatorExtensions = extensions;
-
-	}
-
-	/**
-	 * Add all of the markerGroups defined in element.
-	 * 
-	 * @param groups
-	 */
-	private void addGroupsFrom(IConfigurationElement element, Collection groups) {
-		IConfigurationElement[] groupings = element
-				.getChildren(MarkerSupportRegistry.MARKER_GROUPING);
-
-		for (int i = 0; i < groupings.length; i++) {
-
-			groups.add(MarkerGroup.createMarkerGroup(groupings[i]));
-		}
-	}
-
-	/**
-	 * Return whether or not all of {@link MarkerTypesModel} arein
-	 * the selectedTypes.
-	 * @param selectedTypes
-	 * @return boolean
-	 */
-	boolean allTypesSelected(Collection selectedTypes) {
-		return selectedTypes.containsAll(markerTypes);
-	}
-
-	/**
-	 * Compute all of the markers for the receiver's type.
-	 * 
-	 * @param subMonitor
-	 * @return MarkerEntry
-	 */
-	private Collection computeAllMarkers(SubProgressMonitor subMonitor) {
-		Collection allMarkers = new HashSet();
-		findMarkers(allMarkers, new IResource[] { ResourcesPlugin
-				.getWorkspace().getRoot() }, null, IResource.DEPTH_INFINITE,
-				subMonitor);
-		return allMarkers;
-	}
-
-	/**
-	 * Compute the marker for the supplied filter and add to return markers.
-	 * 
-	 * @param returnMarkers
-	 *            {@link Collection} of {@link IMarker}
-	 * @param subMonitor
-	 * @param filterGroup
-	 * @param focusResources
-	 *            the resource currently selected
-	 */
-	private void computeMarkers(Collection returnMarkers,
-			SubProgressMonitor subMonitor, MarkerFieldFilterGroup filterGroup,
-			IResource[] focusResources) {
-
-		int filterType = filterGroup.getScope();
-		
-		filterGroup.refresh(); 
-		
-		switch (filterType) {
-		case MarkerFieldFilterGroup.ON_ANY: {
-			findMarkers(returnMarkers, new IResource[] { ResourcesPlugin
-					.getWorkspace().getRoot() }, filterGroup,
-					IResource.DEPTH_INFINITE, subMonitor);
-			break;
-		}
-		case MarkerFieldFilterGroup.ON_SELECTED_ONLY: {
-			findMarkers(returnMarkers, focusResources, filterGroup,
-					IResource.DEPTH_ZERO, subMonitor);
-			break;
-		}
-		case MarkerFieldFilterGroup.ON_SELECTED_AND_CHILDREN: {
-			findMarkers(returnMarkers, focusResources, filterGroup,
-					IResource.DEPTH_INFINITE, subMonitor);
-			break;
-		}
-		case MarkerFieldFilterGroup.ON_ANY_IN_SAME_CONTAINER: {
-			findMarkers(returnMarkers, getProjects(focusResources),
-					filterGroup, IResource.DEPTH_INFINITE, subMonitor);
-			break;
-		}
-		case MarkerFieldFilterGroup.ON_WORKING_SET: {
-			findMarkers(returnMarkers, getResourcesInWorkingSet(filterGroup
-					.getWorkingSet()), filterGroup, IResource.DEPTH_INFINITE,
-					subMonitor);
-		}
-		}
-
-	}
-
-	/**
-	 * Add all of the markers that pass the filters to results.
-	 * 
-	 * @param results
-	 *            Collection of {@link IMarker}
-	 * @param group
-	 * @param markers
-	 */
-	private void filterMarkers(Collection results,
-			MarkerFieldFilterGroup group, IMarker[] markers) {
-		for (int idx = 0; idx < markers.length; idx++) {
-			IMarker marker = markers[idx];
-			if (group == null || group.select(marker))
-				results.add(marker);
-		}
-	}
-
-	/**
-	 * Iterate through the return markers. If they do not exist in matching
-	 * remove them.
-	 * 
-	 * @param matching
-	 * @param returnMarkers
-	 */
-	private void findIntersection(Collection matching, Collection returnMarkers) {
-		HashSet removeMarkers = new HashSet();
-		Iterator existing = returnMarkers.iterator();
-		while (existing.hasNext()) {
-			Object next = existing.next();
-			if (matching.contains(next))
-				continue;
-			removeMarkers.add(next);
-		}
-		returnMarkers.removeAll(removeMarkers);
-
-	}
-
-	/**
-	 * Adds all markers in the given set of resources to the given list
-	 * 
-	 * @param results
-	 *            The Collection to add new entries to
-	 * @param resources
-	 * @param group
-	 *            the group to filter on. May be <code>null</code>.
-	 * @param depth
-	 * @param monitor
-	 */
-	private void findMarkers(Collection results, IResource[] resources,
-			MarkerFieldFilterGroup group, int depth, IProgressMonitor monitor) {
-		if (resources == null) {
-			return;
-		}
-	
-		// Optimisation: if a type appears in the selectedTypes list along with
-		// all of its sub-types, then combine these in a single search.
-	
-		Collection selectedTypes = getMarkerTypes();
-	
-		// List of types that haven't been replaced by one of their super-types
-		HashSet typesToSearch = new HashSet(selectedTypes.size());
-	
-		// List of types that appeared in selectedTypes along with all of their
-		// sub-types
-		HashSet includeAllSubtypes = new HashSet(selectedTypes.size());
-	
-		typesToSearch.addAll(selectedTypes);
-	
-		Iterator iter = selectedTypes.iterator();
-	
-		while (iter.hasNext()) {
-			MarkerType type = (MarkerType) iter.next();
-	
-			Collection subtypes = Arrays.asList(type.getAllSubTypes());
-	
-			if (selectedTypes.containsAll(subtypes)) {
-				typesToSearch.removeAll(subtypes);
-	
-				includeAllSubtypes.add(type);
-			}
-		}
-	
-		monitor.beginTask(MarkerMessages.MarkerFilter_searching, typesToSearch
-				.size()
-				* resources.length);
-	
-		// Use this hash set to determine if there are any resources in the
-		// list that appear along with their parent.
-		HashSet resourcesToSearch = new HashSet();
-	
-		// Insert all the resources into the Set
-		for (int idx = 0; idx < resources.length; idx++) {
-			IResource next = resources[idx];
-	
-			if (!next.exists())
-				continue;
-	
-			if (resourcesToSearch.contains(next))
-				monitor.worked(typesToSearch.size());
-			else
-				resourcesToSearch.add(next);
-		}
-	
-		// Iterate through all the selected resources
-		for (int resourceIdx = 0; resourceIdx < resources.length; resourceIdx++) {
-			iter = typesToSearch.iterator();
-	
-			IResource resource = resources[resourceIdx];
-	
-			// Skip resources that don't exist
-			if (!resource.isAccessible()) {
-				continue;
-			}
-	
-			if (depth == IResource.DEPTH_INFINITE) {
-				// Determine if any parent of this resource is also in our
-				// filter
-				IResource parent = resource.getParent();
-				boolean found = false;
-				while (parent != null) {
-					if (resourcesToSearch.contains(parent)) {
-						found = true;
-					}
-	
-					parent = parent.getParent();
-				}
-	
-				// If a parent of this resource is also in the filter, we can
-				// skip it
-				// because we'll pick up its markers when we search the parent.
-				if (found) {
-					continue;
-				}
-			}
-	
-			// Iterate through all the marker types
-			while (iter.hasNext()) {
-				MarkerType markerType = (MarkerType) iter.next();
-				try {
-					// Only search for sub-types of the marker if we found all
-					// of
-					// its sub-types in the filter criteria.
-					IMarker[] markers = resource.findMarkers(
-							markerType.getId(), includeAllSubtypes
-									.contains(markerType), depth);
-	
-					monitor.worked(1);
-	
-					filterMarkers(results, group, markers);
-	
-				} catch (CoreException e) {
-					Policy.handle(e);
-				}
-			}
-		}
-	
-		monitor.done();
-	}
-
-	/**
-	 * Re-generate all of the markers and filter them based on the enabled
-	 * filters.
-	 * 
-	 * @param subMonitor
-	 * @param andFilters
-	 *            if <code>true</code> return the intersection of the filters
-	 * @param focusResources
-	 *            the current selected resources
-	 * @param enabledFilters
-	 *            the enabled {@link MarkerFieldFilterGroup}s to apply
-	 * @return MarkerMap
-	 */
-	MarkerMap generateFilteredMarkers(SubProgressMonitor subMonitor,
-			boolean andFilters, IResource[] focusResources,
-			Collection enabledFilters) {
-
-		Collection returnMarkers = null;
-		if (enabledFilters.size() > 0) {
-			Iterator filtersIterator = enabledFilters.iterator();
-			if (andFilters) {
-				Collection matching = new HashSet();
-				while (filtersIterator.hasNext()) {
-
-					computeMarkers(matching, subMonitor,
-							(MarkerFieldFilterGroup) filtersIterator.next(),
-							focusResources);
-					if (returnMarkers == null)
-						returnMarkers = new HashSet(matching);
-					else
-						findIntersection(matching, returnMarkers);
-					matching.clear();
-				}
-
-			} else {
-				returnMarkers = new HashSet();
-				while (filtersIterator.hasNext()) {
-					computeMarkers(returnMarkers, subMonitor,
-							(MarkerFieldFilterGroup) filtersIterator.next(),
-							focusResources);
-				}
-			}
-
-		} else
-			returnMarkers = computeAllMarkers(subMonitor);
-		MarkerEntry[] entries = new MarkerEntry[returnMarkers.size()];
-		Iterator markers = returnMarkers.iterator();
-		int index = 0;
-		// Convert to entries
-		while (markers.hasNext()) {
-			entries[index] = new MarkerEntry((IMarker) markers.next());
-			index++;
-		}
-
-		return new MarkerMap(entries);
-	}
-
-	/**
-	 * Get the all of the fields that this content generator is using.
-	 * 
-	 * @return {@link MarkerField}[]
-	 */
-	MarkerField[] getAllFields() {
-		return allFields;
-	}
-
-	/**
-	 * Get the category name from the receiver.
-	 */
-	String getCategoryName() {
-		return configurationElement
-				.getAttribute(ATTRIBUTE_DEFAULT_MARKER_GROUPING);
-
-	}
-
-	/**
-	 * Return the configuration elements for the receiver.
-	 * 
-	 * @return IConfigurationElement[]
-	 */
-	IConfigurationElement[] getFilterReferences() {
-		IConfigurationElement[] filterGroups = configurationElement
-				.getChildren(ELEMENT_MARKER_FIELD_CONFIGURATION);
-		if (generatorExtensions.isEmpty())
-			return filterGroups;
-		Iterator extensions = generatorExtensions.iterator();
-		Collection extendedElements = new ArrayList();
-		while (extensions.hasNext()) {
-			IConfigurationElement extension = (IConfigurationElement) extensions
-					.next();
-			IConfigurationElement[] extensionFilters = extension
-					.getChildren(ELEMENT_MARKER_FIELD_CONFIGURATION);
-			for (int i = 0; i < extensionFilters.length; i++) {
-				extendedElements.add(extensionFilters[i]);
-			}
-		}
-		if (extendedElements.size() > 0) {
-			IConfigurationElement[] allGroups = new IConfigurationElement[filterGroups.length
-					+ extendedElements.size()];
-			System
-					.arraycopy(filterGroups, 0, allGroups, 0,
-							filterGroups.length);
-			Iterator extras = extendedElements.iterator();
-			int index = filterGroups.length;
-			while (extras.hasNext()) {
-				allGroups[index] = (IConfigurationElement) extras.next();
-			}
-			return allGroups;
-		}
-		return filterGroups;
-	}
-
-	/**
-	 * Return the id of the receiver.
-	 * 
-	 * @return String
-	 */
-	public String getId() {
-		return configurationElement
-				.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_ID);
-	}
-
-	/**
-	 * Get the list of initially visible fields
-	 * 
-	 * @return {@link MarkerField}[]
-	 */
-	MarkerField[] getInitialVisible() {
-		return initialVisible;
-	}
-
-	/**
-	 * Get the group called groupName from the receiver
-	 * 
-	 * @param groupName
-	 * @return MarkerGroup or <code>null</code>
-	 */
-	MarkerGroup getMarkerGroup(String groupName) {
-		Iterator groups = getMarkerGroups().iterator();
-		while (groups.hasNext()) {
-			MarkerGroup group = (MarkerGroup) groups.next();
-			if (group.getId().equals(groupName))
-				return group;
-		}
-		return null;
-	}
-
-	/**
-	 * Get the markerGroups associated with the receiver.
-	 * 
-	 * @return Collection of {@link MarkerGroup}
-	 */
-	Collection getMarkerGroups() {
-
-		if (groups == null) {
-			groups = new HashSet();
-
-			// Add the groups defined in the receiver
-			addDefinedGroups(groups);
-
-			if (getId().equals(MarkerSupportRegistry.PROBLEMS_GENERATOR)) {
-				// Add the groups that reference the receiver.
-				groups.addAll(MarkerSupportRegistry.getInstance()
-						.getMarkerGroups());
-
-			}
-		}
-		return groups;
-	}
-
-	/**
-	 * Return the markerTypes for the receiver.
-	 * 
-	 * @return Collection of {@link MarkerType}
-	 */
-	public Collection getMarkerTypes() {
-		if (markerTypes == null) {
-			markerTypes = new HashSet();
-			IConfigurationElement[] markerTypeElements = configurationElement
-					.getChildren(MarkerSupportRegistry.MARKER_TYPE_REFERENCE);
-			for (int i = 0; i < markerTypeElements.length; i++) {
-				IConfigurationElement configurationElement = markerTypeElements[i];
-				String elementName = configurationElement
-						.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_ID);
-				MarkerType[] types = MarkerTypesModel.getInstance().getType(
-						elementName).getAllSubTypes();
-				for (int j = 0; j < types.length; j++) {
-					markerTypes.add(types[j]);
-				}
-				markerTypes.add(MarkerTypesModel.getInstance().getType(
-						elementName));
-			}
-			if (markerTypes.isEmpty()) {
-				MarkerType[] types = MarkerTypesModel.getInstance().getType(
-						IMarker.PROBLEM).getAllSubTypes();
-				for (int i = 0; i < types.length; i++) {
-					markerTypes.add(types[i]);
-				}
-			}
-		}
-		return markerTypes;
-	}
-
-	/**
-	 * Return the name for the receiver.
-	 * 
-	 * @return String
-	 */
-	String getName() {
-		return configurationElement
-				.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_NAME);
-	}
-
-	/**
-	 * Return all of the projects being shown.
-	 * 
-	 * @param focusResources
-	 * @return IResource[]
-	 */
-	private IResource[] getProjects(IResource[] focusResources) {
-
-		if (focusResources.length == 0)
-			return EMPTY_RESOURCE_ARRAY;
-		HashSet projects = new HashSet();
-
-		for (int idx = 0; idx < focusResources.length; idx++) {
-			projects.add(focusResources[idx].getProject());
-		}
-		if (projects.isEmpty())
-			return EMPTY_RESOURCE_ARRAY;
-		return (IResource[]) projects.toArray(new IResource[projects.size()]);
-
-	}
-
-	/**
-	 * Get the resources in working set.
-	 * 
-	 * @param workingSet
-	 * @return IResource[]
-	 */
-	private IResource[] getResourcesInWorkingSet(IWorkingSet workingSet) {
-
-		if (workingSet == null)
-			return new IResource[0];
-
-		if (workingSet.isEmpty())
-			return new IResource[] { ResourcesPlugin.getWorkspace().getRoot() };
-
-		IAdaptable[] elements = workingSet.getElements();
-		List result = new ArrayList(elements.length);
-
-		for (int idx = 0; idx < elements.length; idx++) {
-			IResource next = (IResource) elements[idx]
-					.getAdapter(IResource.class);
-
-			if (next != null) {
-				result.add(next);
-			}
-		}
-
-		return (IResource[]) result.toArray(new IResource[result.size()]);
-
-	}
-
-	/**
-	 * Return the type for typeId.
-	 * @param typeId
-	 * @return {@link MarkerType} or <code>null</code> if
-	 * it is not found.
-	 */
-	MarkerType getType(String typeId) {
-		Map all = getTypesTable();
-		if(all.containsKey(typeId))
-			return (MarkerType) all.get(typeId);
-		return null;
-	}
-
-	/**
-	 * Get the table that maps type ids to markerTypes.
-	 * @return Map of {@link String} to {@link MarkerType}
-	 */
-	private Map getTypesTable() {
-		if (allTypesTable == null) {
-			allTypesTable = new HashMap();
-			
-			Iterator allIterator = markerTypes.iterator();
-			while (allIterator.hasNext()) {
-				MarkerType next = (MarkerType) allIterator.next();
-				allTypesTable.put(next.getId(), next);
-			}
-		}
-		return allTypesTable;
-	}
-
-	/**
-	 * Initialise the receiver from the configuration element. This is done as a
-	 * post processing step.
-	 * 
-	 * @param registry
-	 *            the MarkerSupportRegistry being used to initialise the
-	 *            receiver.
-	 */
-	public void initializeFromConfigurationElement(
-			MarkerSupportRegistry registry) {
-
-		IConfigurationElement[] elements = configurationElement
-				.getChildren(MARKER_FIELD_REFERENCE);
-		Collection allFieldList = new ArrayList();
-		Collection initialVisibleList = new ArrayList();
-		for (int i = 0; i < elements.length; i++) {
-			MarkerField field = registry.getField(elements[i]
-					.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_ID));
-			if (field == null)
-				continue;
-			allFieldList.add(field);
-			if (!MarkerSupportInternalUtilities.VALUE_FALSE.equals(elements[i]
-					.getAttribute(ATTRIBUTE_VISIBLE)))
-				initialVisibleList.add(field);
-		}
-
-		allFields = new MarkerField[allFieldList.size()];
-		allFieldList.toArray(allFields);
-
-		initialVisible = new MarkerField[initialVisibleList.size()];
-		initialVisibleList.toArray(initialVisible);
-
-	}
-
-	/**
-	 * Remove the element from the generator extensions
-	 * 
-	 * @param element
-	 */
-	public void removeExtension(IConfigurationElement element) {
-		generatorExtensions.remove(element);
-
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerCopyHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerCopyHandler.java
deleted file mode 100644
index 1776014..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerCopyHandler.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Benjamin Cabe <benjamin.cabe@anyware-tech.com> - 
- *     	Fix for Bug 222375 [Markers] copy markers from markers view should 'pretty print'
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.ui.part.MarkerTransfer;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerViewHandler;
-
-/**
- * MarkerCopyHandler is the handler for the copy action when the markers view is
- * selected.
- * 
- * @since 3.4
- * 
- */
-public class MarkerCopyHandler extends MarkerViewHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) {
-		ExtendedMarkersView view = getView(event);
-		if (view == null)
-			return null;
-
-		setClipboard(view);
-		return this;
-	}
-
-	/**
-	 * Set the workbench clipboard for the markers.
-	 * 
-	 * @param view
-	 */
-	private void setClipboard(ExtendedMarkersView view) {
-
-		IMarker[] markers = view.getSelectedMarkers();
-
-		String markerReport = createMarkerReport(view, markers);
-
-		// Place the markers on the clipboard
-		Object[] data;
-		Transfer[] transferTypes;
-		if (markerReport == null) {
-			data = new Object[] { markers };
-			transferTypes = new Transfer[] { MarkerTransfer.getInstance() };
-		} else {
-			data = new Object[] { markers, markerReport };
-			transferTypes = new Transfer[] { MarkerTransfer.getInstance(),
-					TextTransfer.getInstance() };
-		}
-
-		view.getClipboard().setContents(data, transferTypes);
-
-	}
-
-	/**
-	 * Creates a plain-text report of the selected markers based on predefined
-	 * properties.
-	 * 
-	 * @param view
-	 *            the view being copied
-	 * @param markers
-	 * @return the marker report
-	 */
-	static String createMarkerReport(ExtendedMarkersView view, IMarker[] markers) {
-		StringBuffer report = new StringBuffer();
-
-		MarkerField[] fields = view.getVisibleFields();
-		
-		final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$
-		final char DELIMITER = '\t';
-
-		// create header
-		for (int i = 0; i < fields.length; i++) {
-			report.append(fields[i].getColumnHeaderText());
-			if (i == fields.length - 1) {
-				report.append(NEWLINE);
-			} else {
-				report.append(DELIMITER);
-			}
-		}
-
-		for (int i = 0; i < markers.length; i++) {
-
-			for (int j = 0; j < fields.length; j++) {
-				report.append(fields[j].getValue(MarkerSupportInternalUtilities
-						.newMarkerItem(markers[i])));
-				if (j == fields.length - 1) {
-					report.append(NEWLINE);
-				} else {
-					report.append(DELIMITER);
-				}
-			}
-		}
-
-		return report.toString();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerCreationTimeField.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerCreationTimeField.java
deleted file mode 100644
index 73c0074..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerCreationTimeField.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerItem;
-
-/**
- * MarkerCreationTimeField is the field that shows the creation time of a field.
- * 
- * @since 3.4
- * 
- */
-public class MarkerCreationTimeField extends MarkerField {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerField#getValue(org.eclipse.ui.internal.provisional.views.markers.MarkerItem)
-	 */
-	public String getValue(MarkerItem item) {
-		long creationTime = ((MarkerSupportItem) item).getCreationTime();
-		if (creationTime < 0)
-			return MarkerSupportInternalUtilities.EMPTY_STRING;
-		return String.valueOf(creationTime);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerField#compare(org.eclipse.ui.internal.provisional.views.markers.MarkerItem,
-	 *      org.eclipse.ui.internal.provisional.views.markers.MarkerItem)
-	 */
-	public int compare(MarkerItem item1, MarkerItem item2) {
-		return (int) (((MarkerSupportItem) item1).getCreationTime() - ((MarkerSupportItem) item2)
-				.getCreationTime());
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerDescriptionField.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerDescriptionField.java
deleted file mode 100644
index 2169acd..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerDescriptionField.java
+++ /dev/null
@@ -1,167 +0,0 @@
-package org.eclipse.ui.internal.views.markers;
-
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerItem;
-
-import com.ibm.icu.text.CollationKey;
-
-/**
- * MarkerDescriptionField is the field for showing the description of a marker.
- * 
- * @since 3.4
- * 
- */
-public class MarkerDescriptionField extends MarkerField {
-
-	private class DescriptionEditingSupport extends EditingSupport {
-
-		private TextCellEditor editor;
-
-		/**
-		 * Create a new instance of the receiver.
-		 * 
-		 * @param viewer
-		 */
-		public DescriptionEditingSupport(ColumnViewer viewer) {
-			super(viewer);
-			this.editor = new TextCellEditor((Composite) viewer.getControl());
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object)
-		 */
-		protected boolean canEdit(Object element) {
-			if (element instanceof MarkerEntry) {
-
-				MarkerEntry entry = (MarkerEntry) element;
-				// Bookmarks are a special case
-				try {
-					if (entry.getMarker() != null
-							&& entry.getMarker().isSubtypeOf(IMarker.BOOKMARK))
-						return true;
-				} catch (CoreException e) {
-					Policy.handle(e);
-					return false;
-				}
-				return entry.getAttributeValue(IMarker.USER_EDITABLE, false);
-			}
-			return false;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.EditingSupport#getCellEditor(java.lang.Object)
-		 */
-		protected CellEditor getCellEditor(Object element) {
-			return editor;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.EditingSupport#getValue(java.lang.Object)
-		 */
-		protected Object getValue(Object element) {
-			return ((MarkerEntry) element).getAttributeValue(IMarker.MESSAGE,
-					MarkerSupportInternalUtilities.EMPTY_STRING);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.EditingSupport#setValue(java.lang.Object,
-		 *      java.lang.Object)
-		 */
-		protected void setValue(Object element, Object value) {
-			MarkerEntry entry = (MarkerEntry) element;
-			try {
-				entry.getMarker().setAttribute(IMarker.MESSAGE, value);
-			} catch (CoreException e) {
-				Policy.handle(e);
-			}
-
-		}
-
-	}
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public MarkerDescriptionField() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerField#compare(org.eclipse.ui.internal.provisional.views.markers.MarkerItem,
-	 *      org.eclipse.ui.internal.provisional.views.markers.MarkerItem)
-	 */
-	public int compare(MarkerItem item1, MarkerItem item2) {
-		return getDescriptionKey(item1).compareTo(getDescriptionKey(item2));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerField#getDefaultColumnWidth(org.eclipse.swt.widgets.Control)
-	 */
-	public int getDefaultColumnWidth(Control control) {
-		return 50 * MarkerSupportInternalUtilities.getFontWidth(control);
-	}
-
-	/**
-	 * Return the collation key for the description.
-	 * 
-	 * @param element
-	 * @return CollationKey
-	 */
-	private CollationKey getDescriptionKey(Object element) {
-		if (element instanceof MarkerEntry)
-			return ((MarkerEntry) element).getCollationKey(IMarker.MESSAGE,
-					MarkerSupportInternalUtilities.EMPTY_STRING);
-		return MarkerSupportInternalUtilities.EMPTY_COLLATION_KEY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerField#getValue(org.eclipse.ui.internal.provisional.views.markers.MarkerItem)
-	 */
-	public String getValue(MarkerItem item) {
-		return item.getAttributeValue(IMarker.MESSAGE,
-				MarkerSupportInternalUtilities.EMPTY_STRING);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerField#getEditingSupport()
-	 */
-	public EditingSupport getEditingSupport(ColumnViewer viewer) {
-		return new DescriptionEditingSupport(viewer);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerEntry.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerEntry.java
deleted file mode 100644
index 3f5e1a3..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerEntry.java
+++ /dev/null
@@ -1,362 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.views.markers.MarkerViewUtil;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-import org.eclipse.ui.views.markers.internal.MarkerTypesModel;
-
-import com.ibm.icu.text.CollationKey;
-import com.ibm.icu.text.Collator;
-
-/**
- * The MarkerEntry is the class that wrappers an {@link IMarker} for display in
- * an {@link ExtendedMarkersView}.
- * 
- * @since 3.4
- * 
- */
-class MarkerEntry extends MarkerSupportItem implements IAdaptable {
-
-	// The key for the string we built for display
-	private static final Object LOCATION_STRING = "LOCATION_STRING"; //$NON-NLS-1$
-	Map attributeCache = new HashMap(0);
-	private MarkerCategory category;
-	Map collationKeys = null;
-	private String folder;
-	IMarker marker;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param marker
-	 */
-	public MarkerEntry(IMarker marker) {
-		this.marker = marker;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (adapter.equals(IMarker.class))
-			return marker;
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerItem#getAttributeValue(java.lang.String,
-	 *      boolean)
-	 */
-	public boolean getAttributeValue(String attribute, boolean defaultValue) {
-		Object value = getAttributeValue(attribute);
-		if (value == null)
-			return defaultValue;
-		return ((Boolean) value).booleanValue();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.MarkerItem#getAttributeValue(java.lang.String,
-	 *      int)
-	 */
-	public int getAttributeValue(String attribute, int defaultValue) {
-
-		Object value = getAttributeValue(attribute);
-		if (value == null)
-			return defaultValue;
-		return ((Integer) value).intValue();
-
-	}
-
-	/**
-	 * Return the Object that is the marker value for attribute. Return null if
-	 * it is not found.
-	 * 
-	 * @param attribute
-	 * @return Object or <code>null</code>
-	 */
-	private Object getAttributeValue(String attribute) {
-		Object value;
-		if (attributeCache.containsKey(attribute)) {
-			value = attributeCache.get(attribute);
-		} else {
-			try {
-				value = marker.getAttribute(attribute);
-			} catch (CoreException e) {
-				value = null;
-			}
-			// Even cache nulls so that we use the passed defaultValue.
-			attributeCache.put(attribute, value);
-		}
-		return value;
-	}
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.MarkerSupportItem#getAttributeValue(java.lang.String, java.lang.String)
-	 */
-	public String getAttributeValue(String attribute, String defaultValue) {
-
-		Object value = getAttributeValue(attribute);
-		if (value == null)
-			return defaultValue;
-		// The following toString() is a no-op for string attribute
-		// values (which we expect!), but safeguards against clients
-		// who used non-String objects (e.g. Integer) as attribute values,
-		// see bug 218249. 
-		return value.toString();
-	}
-
-	/**
-	 * Get the category of the receiver.
-	 * 
-	 * @return {@link MarkerCategory}
-	 */
-	MarkerCategory getCategory() {
-		return category;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.MarkerSupportItem#getChildren()
-	 */
-	MarkerSupportItem[] getChildren() {
-		return MarkerSupportInternalUtilities.EMPTY_MARKER_ITEM_ARRAY;
-	}
-
-	/**
-	 * Get the CollationKey for the string attribute.
-	 * 
-	 * @param attribute
-	 * @param defaultValue
-	 *            the defaultValue if the value is not set
-	 * @return CollationKey
-	 */
-	CollationKey getCollationKey(String attribute, String defaultValue) {
-		if (collationKeys != null && collationKeys.containsKey(attribute))
-			return (CollationKey) collationKeys.get(attribute);
-		String attributeValue = getAttributeValue(attribute, defaultValue);
-		if (attributeValue.length() == 0)
-			return MarkerSupportInternalUtilities.EMPTY_COLLATION_KEY;
-		CollationKey key = Collator.getInstance().getCollationKey(
-				attributeValue);
-		if (collationKeys == null)
-			collationKeys = new HashMap(2);
-		collationKeys.put(attribute, key);
-		return key;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.MarkerSupportItem#getCreationTime()
-	 */
-	long getCreationTime() {
-		try {
-			return marker.getCreationTime();
-		} catch (CoreException e) {
-			Policy.handle(e);
-			return -1;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.MarkerSupportItem#getDescription()
-	 */
-	String getDescription() {
-		return getAttributeValue(IMarker.MESSAGE,
-				MarkerSupportInternalUtilities.EMPTY_STRING);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.MarkerSupportItem#getID()
-	 */
-	long getID() {
-		return marker.getId();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.MarkerItem#getLocation()
-	 */
-	public String getLocation() {
-		if (attributeCache.containsKey(LOCATION_STRING))
-			return (String) attributeCache.get(LOCATION_STRING);
-
-		// Is the location override set?
-		String locationString = getAttributeValue(IMarker.LOCATION,
-				MarkerSupportInternalUtilities.EMPTY_STRING);
-		if (locationString.length() > 0) {
-
-			attributeCache.put(LOCATION_STRING, locationString);
-			return locationString;
-		}
-
-		// No override so use line number
-		int lineNumber = getAttributeValue(IMarker.LINE_NUMBER, -1);
-		String lineNumberString;
-		if (lineNumber < 0)
-			lineNumberString = MarkerMessages.Unknown;
-		else
-			lineNumberString = NLS.bind(MarkerMessages.label_lineNumber,
-					Integer.toString(lineNumber));
-
-		attributeCache.put(LOCATION_STRING, lineNumberString);
-		return lineNumberString;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.MarkerItem#getMarker()
-	 */
-	public IMarker getMarker() {
-		return marker;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.MarkerSupportItem#getMarkerTypeName()
-	 */
-	String getMarkerTypeName() {
-		try {
-			return MarkerTypesModel.getInstance().getType(marker.getType())
-					.getLabel();
-		} catch (CoreException e) {
-			Policy.handle(e);
-			return NLS.bind(MarkerMessages.FieldMessage_WrongType, marker
-					.toString());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.MarkerSupportItem#getParent()
-	 */
-	MarkerSupportItem getParent() {
-		return category;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.MarkerItem#getPath()
-	 */
-	public String getPath() {
-		if (folder == null) {
-			if (!marker.exists()) {
-				return super.getPath();
-			}
-
-			// If the path attribute is set use it.
-			try {
-				Object pathAttribute = marker
-						.getAttribute(MarkerViewUtil.PATH_ATTRIBUTE);
-
-				if (pathAttribute != null) {
-					folder = pathAttribute.toString();
-					return folder;
-				}
-			} catch (CoreException exception) {
-				// Log the exception and fall back.
-				Policy.handle(exception);
-			}
-
-			IPath path = marker.getResource().getFullPath();
-			int n = path.segmentCount() - 1; // n is the number of segments
-			// in container, not path
-			if (n <= 0) {
-				return super.getPath();
-			}
-			int len = 0;
-			for (int i = 0; i < n; ++i) {
-				len += path.segment(i).length();
-			}
-			// account for /'s
-			if (n > 1) {
-				len += n - 1;
-			}
-			StringBuffer sb = new StringBuffer(len);
-			for (int i = 0; i < n; ++i) {
-				if (i != 0) {
-					sb.append('/');
-				}
-				sb.append(path.segment(i));
-			}
-			folder = sb.toString();
-
-		}
-		return folder;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.MarkerSupportItem#isConcrete()
-	 */
-	boolean isConcrete() {
-		return true;
-	}
-
-	/**
-	 * Set the category to markerCategory.
-	 * 
-	 * @param markerCategory
-	 */
-	void setCategory(MarkerCategory markerCategory) {
-		category = markerCategory;
-
-	}
-
-	/**
-	 * Set the marker for the receiver.
-	 * 
-	 * @param marker
-	 *            The marker to set.
-	 */
-	void setMarker(IMarker marker) {
-		this.marker = marker;
-		attributeCache.clear();
-	}
-
-	/**
-	 * Clear the cached values for performance reasons.
-	 */
-	void clearCaches() {
-		collationKeys = null;
-		attributeCache.clear();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerFieldFilterGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerFieldFilterGroup.java
deleted file mode 100644
index 682be0a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerFieldFilterGroup.java
+++ /dev/null
@@ -1,732 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.internal.ide.StatusUtil;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.views.markers.FiltersContributionParameters;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerFieldFilter;
-import org.eclipse.ui.views.markers.internal.MarkerFilter;
-import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
-import org.eclipse.ui.views.markers.internal.MarkerType;
-
-/**
- * MarkerFieldFilterGroup is the representation of a grouping of marker filters.
- * 
- * @since 3.4
- * 
- */
-class MarkerFieldFilterGroup {
-
-	private static final String ATTRIBUTE_ON_ANY_IN_SAME_CONTAINER = "ON_ANY_IN_SAME_CONTAINER";//$NON-NLS-1$
-	private static final String ATTRIBUTE_ON_SELECTED_AND_CHILDREN = "ON_SELECTED_AND_CHILDREN";//$NON-NLS-1$
-	private static final String ATTRIBUTE_ON_SELECTED_ONLY = "ON_SELECTED_ONLY"; //$NON-NLS-1$
-
-	/**
-	 * The attribute values for the scope
-	 * 
-	 */
-
-	private static final String ATTRIBUTE_SCOPE = "scope"; //$NON-NLS-1$
-
-	private static final String ATTRIBUTE_VALUES = "values"; //$NON-NLS-1$
-
-	private static final IProject[] EMPTY_PROJECT_ARRAY = new IProject[0];
-
-	/**
-	 * Constant for any element.
-	 */
-	static final int ON_ANY = 0;
-
-	/**
-	 * Constant for any element in same container.
-	 */
-	static final int ON_ANY_IN_SAME_CONTAINER = 3;
-
-	/**
-	 * Constant for selected element and children.
-	 */
-	static final int ON_SELECTED_AND_CHILDREN = 2;
-	/**
-	 * Constant for any selected element only.
-	 */
-	static final int ON_SELECTED_ONLY = 1;
-	/**
-	 * Constant for on working set.
-	 */
-	static final int ON_WORKING_SET = 4;
-	static final String TAG_ENABLED = "enabled"; //$NON-NLS-1$
-	private static final String TAG_SCOPE = "scope"; //$NON-NLS-1$
-	private static final String TAG_FIELD_FILTER_ENTRY = "fieldFilter"; //$NON-NLS-1$
-	private static final String TAG_WORKING_SET = "workingSet"; //$NON-NLS-1$
-	// The identifier for user filters
-	private static String USER = "USER"; //$NON-NLS-1$
-
-	/**
-	 * Returns the set of projects that contain the given set of resources.
-	 * 
-	 * @param resources
-	 * @return IProject[]
-	 */
-	static IProject[] getProjects(IResource[] resources) {
-		if (resources == null)
-			return EMPTY_PROJECT_ARRAY;
-
-		Collection projects = getProjectsAsCollection(resources);
-
-		return (IProject[]) projects.toArray(new IProject[projects.size()]);
-	}
-
-	/**
-	 * Return the projects for the elements.
-	 * 
-	 * @param elements
-	 *            collection of IResource or IResourceMapping
-	 * @return Collection of IProject
-	 */
-	static Collection getProjectsAsCollection(Object[] elements) {
-		HashSet projects = new HashSet();
-
-		for (int idx = 0; idx < elements.length; idx++) {
-			if (elements[idx] instanceof IResource) {
-				projects.add(((IResource) elements[idx]).getProject());
-			} else {
-				IProject[] mappingProjects = (((ResourceMapping) elements[idx])
-						.getProjects());
-				for (int i = 0; i < mappingProjects.length; i++) {
-					projects.add(mappingProjects[i]);
-				}
-			}
-
-		}
-
-		return projects;
-	}
-
-	protected CachedMarkerBuilder builder;
-
-	private IConfigurationElement element;
-
-	private Map EMPTY_MAP = new HashMap();
-	private boolean enabled = true;
-	protected MarkerFieldFilter[] fieldFilters;
-	private int scope;
-	private String name;
-	private String id;
-
-	/**
-	 * The entry for testing filters. Cached to prevent garbage.
-	 */
-	private MarkerEntry testEntry = new MarkerEntry(null);
-	private IWorkingSet workingSet;
-	private Collection workingSetPaths;
-	private IResource[] wSetResources;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param configurationElement
-	 * @param markerBuilder
-	 */
-	public MarkerFieldFilterGroup(IConfigurationElement configurationElement,
-			CachedMarkerBuilder markerBuilder) {
-		element = configurationElement;
-		builder = markerBuilder;
-		initializeWorkingSet();
-		scope = processScope();
-
-		if (configurationElement == null)
-			return;
-		String enablementString = configurationElement
-				.getAttribute(MarkerSupportRegistry.ENABLED);
-		if (MarkerSupportInternalUtilities.FALSE.equals(enablementString))
-			enabled = false;
-
-	}
-
-	/**
-	 * Add resources and thier children's paths to the working set paths.
-	 * 
-	 * @param resources
-	 */
-	private void addResourcesAndChildrenPaths(IResource[] resources) {
-		for (int idx = 0; idx < resources.length; idx++) {
-
-			IResource currentResource = resources[idx];
-
-			workingSetPaths.add(currentResource.getFullPath().toString());
-
-			if (currentResource instanceof IContainer) {
-				IContainer cont = (IContainer) currentResource;
-
-				try {
-					addResourcesAndChildrenPaths(cont.members());
-				} catch (CoreException e) {
-					Policy.handle(e);
-				}
-			}
-
-		}
-	}
-
-	/**
-	 * Get the root types for the receiver
-	 * 
-	 * @return Collection of {@link MarkerType}
-	 */
-	Collection getAllTypes() {
-		return builder.getGenerator().getMarkerTypes();
-	}
-
-	/**
-	 * Get the filters registered on the receiver.
-	 * 
-	 * @return MarkerFieldFilter[]
-	 */
-	private MarkerFieldFilter[] getFieldFilters() {
-		if (fieldFilters == null) {
-			calculateFilters();
-		}
-		return fieldFilters;
-	}
-
-	/**
-	 * Calculate the filters for the receiver.
-	 */
-	protected void calculateFilters() {
-		Map values = getValues();
-		Collection filters = new ArrayList();
-		MarkerField[] fields = builder.getVisibleFields();
-		for (int i = 0; i < fields.length; i++) {
-			MarkerFieldFilter fieldFilter = MarkerSupportInternalUtilities
-					.generateFilter(fields[i]);
-			if (fieldFilter != null) {
-				filters.add(fieldFilter);
-
-				// The type filter needs information from the generator
-				if (fieldFilter instanceof MarkerTypeFieldFilter)
-					// Show everything by default
-					((MarkerTypeFieldFilter) fieldFilter)
-							.setContentGenerator(builder.getGenerator());
-				if (values != null)
-					fieldFilter.initialize(values);
-			}
-		}
-		fieldFilters = new MarkerFieldFilter[filters.size()];
-		filters.toArray(fieldFilters);
-	}
-
-	/**
-	 * Return the MarkerFieldFilter for field or <code>null</code> if there
-	 * isn't one.
-	 * 
-	 * @param field
-	 * @return MarkerFieldFilter
-	 */
-	public MarkerFieldFilter getFilter(MarkerField field) {
-		MarkerFieldFilter[] filters = getFieldFilters();
-		for (int i = 0; i < filters.length; i++) {
-			if (filters[i].getField().equals(field))
-				return filters[i];
-		}
-		return null;
-	}
-
-	/**
-	 * Return the id of the receiver.
-	 * 
-	 * @return String
-	 */
-	public String getID() {
-		if (id == null) {
-			if (element == null)
-				id = USER + String.valueOf(System.currentTimeMillis());
-			else
-				id = element
-						.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_NAME);
-		}
-		return id;
-	}
-
-	/**
-	 * Return the name of the receiver.
-	 * 
-	 * @return String
-	 */
-	public String getName() {
-		if (name == null) {
-			if (element == null)
-				name = MarkerSupportInternalUtilities.EMPTY_STRING;
-			else
-				name = element
-						.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_NAME);
-		}
-		return name;
-	}
-
-	/**
-	 * Return the resources in the working set. If it is empty then return the
-	 * workspace root.
-	 * 
-	 * @return IResource[]
-	 */
-	IResource[] getResourcesInWorkingSet() {
-		if (workingSet == null) {
-			return new IResource[0];
-		}
-
-		if (workingSet.isEmpty()) {
-			return new IResource[] { ResourcesPlugin.getWorkspace().getRoot() };
-		}
-
-		IAdaptable[] elements = workingSet.getElements();
-		List result = new ArrayList(elements.length);
-
-		for (int idx = 0; idx < elements.length; idx++) {
-			IResource next = (IResource) elements[idx]
-					.getAdapter(IResource.class);
-
-			if (next != null) {
-				result.add(next);
-			}
-		}
-
-		return (IResource[]) result.toArray(new IResource[result.size()]);
-	}
-
-	/**
-	 * Return the value of the scope.
-	 * 
-	 * @return int
-	 * @see #ON_ANY
-	 * @see #ON_ANY_IN_SAME_CONTAINER
-	 * @see #ON_SELECTED_AND_CHILDREN
-	 * @see #ON_SELECTED_ONLY
-	 * @see #ON_WORKING_SET
-	 */
-	public int getScope() {
-		return scope;
-	}
-
-	/**
-	 * Get the values defined for the receiver.
-	 * 
-	 * @return Map of values to apply to a {@link MarkerFieldFilter}
-	 */
-	private Map getValues() {
-
-		try {
-			String className = null;
-			if (element != null) {
-				className = element.getAttribute(ATTRIBUTE_VALUES);
-				if (className != null) {
-					FiltersContributionParameters parameters = (FiltersContributionParameters) IDEWorkbenchPlugin
-							.createExtension(element, ATTRIBUTE_VALUES);
-					return parameters.getParameterValues();
-				}
-			}
-		} catch (CoreException e) {
-			Policy.handle(e);
-			return null;
-		}
-		return EMPTY_MAP;
-
-	}
-
-	/**
-	 * Get the working set for the receiver.
-	 * 
-	 * @return IWorkingSet
-	 */
-	IWorkingSet getWorkingSet() {
-		return workingSet;
-	}
-
-	/**
-	 * Return all of the paths in the working set
-	 * 
-	 * @return Collection
-	 */
-	private Collection getWorkingSetPaths() {
-
-		if (workingSetPaths == null) {
-			workingSetPaths = new HashSet();
-			addResourcesAndChildrenPaths(getResourcesInWorkingSet());
-		}
-		return workingSetPaths;
-
-	}
-	
-	/**
-	 * Gather the resource is in the working set
-	 */
-	private void computeWorkingSetResources() {
-		if(workingSet!=null){
-			 /* MarkerFieldFilterGroup will have to re-get the resources in 
-			 * a working set for every marker it filters using the select method
-			 * Or we may do this once before the markers are filtered.A IResourceChangeListener??		 
-			 */
-			wSetResources=getResourcesInWorkingSet();
-		}
-	}
-
-	/**
-	 * Return true if the resource is in the working set
-	 * @param resource
-	 * @return boolean
-	 */
-	private boolean isInWorkingSet(IResource resource) {
-		if(wSetResources==null)computeWorkingSetResources();
-		for (int i = 0; i < wSetResources.length; i++) {
-			if(wSetResources[i].getFullPath().isPrefixOf(resource.getFullPath())){
-				return true;
-			}
-		}
-		return false;
-	}
-	/**
-	 * Initialise the working set for the receiver. Use the window working set
-	 * for the working set and set the scope to ON_WORKING_SET if they are to be
-	 * used by default.
-	 */
-	private void initializeWorkingSet() {
-
-		IWorkbenchWindow window = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (window != null) {
-			IWorkbenchPage page = window.getActivePage();
-			if (page != null) {
-				setWorkingSet(page.getAggregateWorkingSet());
-				if ((PlatformUI.getPreferenceStore()
-						.getBoolean(IWorkbenchPreferenceConstants.USE_WINDOW_WORKING_SET_BY_DEFAULT)))
-					setScope(ON_WORKING_SET);
-
-			}
-		}
-	}
-
-	/**
-	 * Return whether or not the receiver is enabled.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isEnabled() {
-		return enabled;
-	}
-
-	/**
-	 * Return whether or not this is a system or user group.
-	 * 
-	 * @return boolean <code>true</code> if it is a system group.
-	 */
-	public boolean isSystem() {
-		return element != null;
-	}
-
-	/**
-	 * Load the settings from the legacy child.
-	 * 
-	 * @param memento
-	 */
-	void legacyLoadSettings(IMemento memento) {
-
-		String enabledString = memento.getString(TAG_ENABLED);
-		if (enabledString != null && enabledString.length() > 0)
-			enabled = Boolean.valueOf(enabledString).booleanValue();
-
-		Integer resourceSetting = memento
-				.getInteger(MarkerFilter.TAG_ON_RESOURCE);
-
-		if (resourceSetting != null)
-			scope = resourceSetting.intValue();
-
-		String workingSetName = memento.getString(TAG_WORKING_SET);
-
-		if (workingSetName != null)
-			setWorkingSet(PlatformUI.getWorkbench().getWorkingSetManager()
-					.getWorkingSet(workingSetName));
-
-		if (element == null) {
-			String nameString = memento.getID();
-			if (nameString != null && nameString.length() > 0)
-				name = nameString;
-			String idString = memento.getString(IMemento.TAG_ID);
-			if (idString != null && idString.length() > 0)
-				id = idString;
-
-		}
-
-		MarkerFieldFilter[] filters = getFieldFilters();
-		for (int i = 0; i < filters.length; i++) {
-			if (filters[i] instanceof CompatibilityFieldFilter)
-				((CompatibilityFieldFilter) filters[i]).loadLegacySettings(
-						memento, builder.getGenerator());
-		}
-
-	}
-
-	/**
-	 * Load the current settings from the child.
-	 * 
-	 * @param memento -
-	 *            the memento to load from
-	 */
-	void loadSettings(IMemento memento) {
-
-		String enabledString = memento.getString(TAG_ENABLED);
-		if (enabledString != null && enabledString.length() > 0)
-			enabled = Boolean.valueOf(enabledString).booleanValue();
-		scope = memento.getInteger(TAG_SCOPE).intValue();
-
-		String workingSetName = memento.getString(TAG_WORKING_SET);
-
-		if (workingSetName != null)
-			setWorkingSet(PlatformUI.getWorkbench().getWorkingSetManager()
-					.getWorkingSet(workingSetName));
-
-		Map filterMap = new HashMap();
-		MarkerFieldFilter[] filters = getFieldFilters();
-		for (int i = 0; i < filters.length; i++) {
-			filterMap.put(MarkerSupportInternalUtilities.getId(filters[i]
-					.getField()), filters[i]);
-
-		}
-
-		IMemento[] children = memento.getChildren(TAG_FIELD_FILTER_ENTRY);
-		for (int i = 0; i < children.length; i++) {
-			IMemento childMemento = children[i];
-			String id = childMemento.getID();
-			if (filterMap.containsKey(id)) {
-				MarkerFieldFilter filter = (MarkerFieldFilter) filterMap
-						.get(id);
-				if (filter instanceof MarkerTypeFieldFilter) {
-					((MarkerTypeFieldFilter) filter)
-							.setContentGenerator(builder.getGenerator());
-				}
-				filter.loadSettings(childMemento);
-			}
-
-		}
-
-		if (element == null) {
-			String nameString = memento
-					.getString(MarkerSupportInternalUtilities.ATTRIBUTE_NAME);
-			if (nameString != null && nameString.length() > 0)
-				name = nameString;
-			String idString = memento.getString(IMemento.TAG_ID);
-			if (idString != null && idString.length() > 0)
-				id = idString;
-
-		}
-
-	}
-
-	/**
-	 * Make a working copy of the receiver.
-	 * 
-	 * @return MarkerFieldFilterGroup or <code> null</code> if it failed.
-	 */
-	MarkerFieldFilterGroup makeWorkingCopy() {
-		MarkerFieldFilterGroup clone = new MarkerFieldFilterGroup(this.element,
-				this.builder);
-		if (populateClone(clone))
-			return clone;
-		return null;
-
-	}
-
-	/**
-	 * Populate the clone and return true if successful.
-	 * 
-	 * @param clone
-	 */
-	protected boolean populateClone(MarkerFieldFilterGroup clone) {
-		clone.scope = this.scope;
-		clone.workingSet = this.workingSet;
-		clone.enabled = this.enabled;
-		clone.fieldFilters = new MarkerFieldFilter[getFieldFilters().length];
-		clone.name = name;
-		clone.id = id;
-		for (int i = 0; i < fieldFilters.length; i++) {
-			try {
-				clone.fieldFilters[i] = (MarkerFieldFilter) fieldFilters[i]
-						.getClass().newInstance();
-				fieldFilters[i].populateWorkingCopy(clone.fieldFilters[i]);
-			} catch (InstantiationException e) {
-				StatusManager.getManager().handle(
-						StatusUtil.newStatus(IStatus.ERROR, e
-								.getLocalizedMessage(), e), StatusManager.SHOW);
-				return false;
-			} catch (IllegalAccessException e) {
-				StatusManager.getManager().handle(
-						StatusUtil.newStatus(IStatus.ERROR, e
-								.getLocalizedMessage(), e), StatusManager.SHOW);
-				return false;
-			}
-
-		}
-		return true;
-	}
-
-	/**
-	 * Process the scope attribute.
-	 * 
-	 * @return int
-	 */
-	private int processScope() {
-
-		if (element == null)
-			return ON_ANY;
-
-		String scopeValue = element.getAttribute(ATTRIBUTE_SCOPE);
-
-		if (scopeValue.equals(ATTRIBUTE_ON_SELECTED_ONLY))
-			return ON_SELECTED_ONLY;
-
-		if (scopeValue.equals(ATTRIBUTE_ON_SELECTED_AND_CHILDREN))
-			return ON_SELECTED_AND_CHILDREN;
-
-		if (scopeValue.equals(ATTRIBUTE_ON_ANY_IN_SAME_CONTAINER))
-			return ON_ANY_IN_SAME_CONTAINER;
-
-		return ON_ANY;
-	}
-
-	/**
-	 * Save the settings for the receiver in the memento.
-	 * 
-	 * @param memento
-	 */
-	void saveFilterSettings(IMemento memento) {
-		memento.putString(TAG_ENABLED, String.valueOf(enabled));
-		memento.putString(TAG_SCOPE, String.valueOf(scope));
-
-		if (workingSet != null) {
-			memento.putString(TAG_WORKING_SET, workingSet.getName());
-		}
-
-		if (element == null) {
-			memento.putString(MarkerSupportInternalUtilities.ATTRIBUTE_NAME,
-					getName());
-			memento.putString(IMemento.TAG_ID, getID());
-		}
-		MarkerFieldFilter[] filters = getFieldFilters();
-
-		for (int i = 0; i < filters.length; i++) {
-			IMemento child = memento
-					.createChild(TAG_FIELD_FILTER_ENTRY,
-							MarkerSupportInternalUtilities.getId(filters[i]
-									.getField()));
-			filters[i].saveSettings(child);
-
-		}
-
-	}
-
-	/**
-	 * Return whether or not this IMarker is being shown.
-	 * 
-	 * @param marker
-	 * @return <code>true</code> if it is being shown
-	 */
-	public boolean select(IMarker marker) {
-		MarkerFieldFilter[] filters = getFieldFilters();
-		testEntry.setMarker(marker);
-
-		if (scope == ON_WORKING_SET && workingSet != null
-				&& !workingSet.isEmpty()) {
-			if (!isInWorkingSet(marker.getResource()))
-				return false;
-		}
-
-		for (int i = 0; i < filters.length; i++) {
-			if (filters[i].select(testEntry))
-				continue;
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * Set whether or not the receiver is enabled.
-	 * 
-	 * @param enabled
-	 *            The enabled to set.
-	 */
-	void setEnabled(boolean enabled) {
-		this.enabled = enabled;
-	}
-
-	/**
-	 * Set the name of the receiver.
-	 * 
-	 * @param newName
-	 */
-	public void setName(String newName) {
-		name = newName;
-
-	}
-
-	/**
-	 * Set the scope of the receiver.
-	 * 
-	 * @param newScope
-	 */
-	public void setScope(int newScope) {
-		scope = newScope;
-	}
-
-	/**
-	 * Set the working set of the receiver.
-	 * 
-	 * @param workingSet
-	 */
-	void setWorkingSet(IWorkingSet workingSet) {
-		this.workingSet = workingSet;
-		workingSetPaths = null;
-	}
-
-	/**
-	 * IResourceChangeListener, a better option??
-	 * 
-	 */	
-	void refresh() {
-		 computeWorkingSetResources();
-		 getWorkingSetPaths();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerGoToHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerGoToHandler.java
deleted file mode 100644
index a452853..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerGoToHandler.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.eclipse.ui.internal.views.markers;
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.ui.views.markers.MarkerViewHandler;
-
-/**
- * MarkerGoToHandler is the handler for the go to action.
- * @since 3.4
- *
- */
-public class MarkerGoToHandler extends MarkerViewHandler {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event)  {
-		ExtendedMarkersView view = getView(event);
-		if(view == null)
-			return this;
-		view.openSelectedMarkers();
-		return this;
-	}
-	
-
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerHelpAdapterFactory.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerHelpAdapterFactory.java
deleted file mode 100644
index ec24b55..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerHelpAdapterFactory.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.eclipse.ui.internal.views.markers;
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.help.HelpSystem;
-import org.eclipse.help.IContext;
-import org.eclipse.help.IContextProvider;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-
-/**
- * MarkerHelpAdapterFactory is the adapter factory for the markerHelp.
- * @since 3.4
- *
- */
-public class MarkerHelpAdapterFactory implements IAdapterFactory {
-
-	private static final Class[] classes = new Class[] {IContextProvider.class};
-
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (!(adaptableObject instanceof ExtendedMarkersView))
-			return null;
-
-		final ExtendedMarkersView view = (ExtendedMarkersView) adaptableObject;
-
-		return new IContextProvider(){
-
-			public int getContextChangeMask() {
-				return SELECTION;
-			}
-
-			public IContext getContext(Object target) {
-				String contextId = null;
-				// See if there is a context registered for the current selection
-				IMarker[] markers = view.getSelectedMarkers();
-				if(markers.length > 0) {
-					contextId = IDE.getMarkerHelpRegistry().getHelp(
-							markers[0]);
-				}
-
-				//TODO this needs to be migrated to the ide plug-in
-				if (contextId == null) 
-					contextId = PlatformUI.PLUGIN_ID + ".problem_view_context";//$NON-NLS-1$
-				
-				return HelpSystem.getContext(contextId);
-			}
-
-			
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.help.IContextProvider#getSearchExpression(java.lang.Object)
-			 */
-			public String getSearchExpression(Object target) {
-				return null;
-			}
-		
-		};
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return classes;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerIDField.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerIDField.java
deleted file mode 100644
index a788124..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerIDField.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerItem;
-
-
-/**
- * @since 3.4
- * 
- */
-public class MarkerIDField extends MarkerField {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerField#getValue(org.eclipse.ui.internal.provisional.views.markers.MarkerItem)
-	 */
-	public String getValue(MarkerItem item) {
-		if (item.getMarker() != null)
-			return String.valueOf(((MarkerSupportItem) item).getID());
-		return MarkerSupportInternalUtilities.EMPTY_STRING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerField#compare(org.eclipse.ui.internal.provisional.views.markers.MarkerItem,
-	 *      org.eclipse.ui.internal.provisional.views.markers.MarkerItem)
-	 */
-	public int compare(MarkerItem item1, MarkerItem item2) {
-		return (int) (((MarkerSupportItem)item1).getID() - ((MarkerSupportItem) item2).getID());
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerLocationField.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerLocationField.java
deleted file mode 100644
index 6063488..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerLocationField.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerItem;
-
-/**
- * MarkerLocationField is the field for the location field.
- * 
- * @since 3.4
- * 
- */
-public class MarkerLocationField extends MarkerField {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerField#getValue(org.eclipse.ui.internal.provisional.views.markers.MarkerItem)
-	 */
-	public String getValue(MarkerItem item) {
-		return item.getLocation();
-	}
-
-	/**
-	 * Get the number of characters that should be reserved for the receiver.
-	 * 
-	 * @param control
-	 *            the control to scale from
-	 * @return int
-	 */
-	public int getDefaultColumnWidth(Control control) {
-		return 10 * MarkerSupportInternalUtilities.getFontWidth(control);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.MarkerField#compare(org.eclipse.ui.views.markers.MarkerItem,
-	 *      org.eclipse.ui.views.markers.MarkerItem)
-	 */
-	public int compare(MarkerItem item1, MarkerItem item2) {
-
-		//See if location got overridden
-		String location1 = item1.getAttributeValue(IMarker.LOCATION,
-				MarkerSupportInternalUtilities.EMPTY_STRING);
-		String location2 = item2.getAttributeValue(IMarker.LOCATION,
-				MarkerSupportInternalUtilities.EMPTY_STRING);
-
-		if (location1.length() == 0 || location2.length() == 0)
-			return item1.getAttributeValue(IMarker.LINE_NUMBER, -1)
-					- item2.getAttributeValue(IMarker.LINE_NUMBER, -1);
-
-		return location1.compareTo(location2);
-
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerMap.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerMap.java
deleted file mode 100644
index 6a312ec..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerMap.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ui.views.markers.MarkerItem;
-
-/**
- * The MarkerMap is a helper class that manages the mapping between a set of
- * {@link IMarker} and thier {@link MarkerEntry} wrappers.
- * 
- * @since 3.4
- * 
- */
-class MarkerMap {
-
-	static final MarkerMap EMPTY_MAP = new MarkerMap();
-	private MarkerEntry[] markers;
-
-	// markerToEntryMap is a lazily created map from the markers to thier
-	// corresponding entry
-	private Map markerToEntryMap = null;
-	private Integer[] markerCounts;
-
-	/**
-	 * Creates an initially empty marker map
-	 */
-	public MarkerMap() {
-		this(new MarkerEntry[0]);
-	}
-
-	/**
-	 * Create an instance of the receiver from markers.
-	 * 
-	 * @param markers
-	 */
-
-	public MarkerMap(MarkerEntry[] markers) {
-		this.markers = markers;
-	}
-
-	/**
-	 * Return the entry at index
-	 * 
-	 * @param index
-	 * @return MarkerEntry
-	 */
-	public MarkerEntry elementAt(int index) {
-		return markers[index];
-	}
-
-	/**
-	 * Returns an array of marker counts where getMarkerCounts()[severity] is
-	 * the number of markers in the list with the given severity.
-	 * 
-	 * @return an array of {@link Integer} where index indicates
-	 *         [errors,warnings,others]
-	 */
-	Integer[] getMarkerCounts() {
-		if (markerCounts == null) {
-			int[] ints = new int[] { 0, 0, 0 };
-
-			for (int idx = 0; idx < markers.length; idx++) {
-				MarkerEntry marker = markers[idx];
-				int severity = marker.getAttributeValue(IMarker.SEVERITY, -1);
-				if (severity >= IMarker.SEVERITY_INFO) {
-					ints[marker.getAttributeValue(IMarker.SEVERITY, -1)]++;
-				}
-			}
-
-			markerCounts = new Integer[] { new Integer(ints[2]),
-					new Integer(ints[1]), new Integer(ints[0]) };
-
-		}
-
-		return markerCounts;
-	}
-
-	/**
-	 * Return the {@link MarkerItem} that maps to marker.
-	 * 
-	 * @param marker
-	 * @return {@link MarkerItem}
-	 */
-	public MarkerItem getMarkerItem(IMarker marker) {
-		if (markerToEntryMap == null) {
-			markerToEntryMap = new HashMap();
-			for (int i = 0; i < markers.length; i++) {
-				IMarker nextMarker = markers[i].getMarker();
-				if (nextMarker != null)
-					markerToEntryMap.put(nextMarker, markers[i]);
-			}
-		}
-
-		if (markerToEntryMap.containsKey(marker))
-			return (MarkerItem) markerToEntryMap.get(marker);
-
-		return null;
-	}
-
-	/**
-	 * Get the size of the entries
-	 * 
-	 * @return int
-	 */
-	public int getSize() {
-		return markers.length;
-	}
-
-	/**
-	 * Return the entries as an array.
-	 * 
-	 * @return MarkerEntry[]
-	 */
-	public MarkerEntry[] toArray() {
-		return markers;
-	}
-
-	/**
-	 * Clear the caches for the markers.
-	 */
-	void clearAttributeCaches() {
-		for (int i = 0; i < markers.length; i++) {
-			markers[i].clearCaches();
-		}
-		
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerPathField.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerPathField.java
deleted file mode 100644
index 052bb30..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerPathField.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerItem;
-
-/**
- * MarkerPathField is the field for the paths column.
- * 
- * @since 3.4
- * 
- */
-public class MarkerPathField extends MarkerField {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.IMarkerField#compare(org.eclipse.ui.internal.provisional.views.markers.MarkerItem,
-	 *      org.eclipse.ui.internal.provisional.views.markers.MarkerItem)
-	 */
-	public int compare(MarkerItem item1, MarkerItem item2) {
-		if (item1.getMarker() == null || item2.getMarker() == null)
-			return 0;
-
-		return item1.getPath().compareTo(item2.getPath());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerField#getDefaultColumnWidth(org.eclipse.swt.widgets.Control)
-	 */
-	public int getDefaultColumnWidth(Control control) {
-		return 20 * MarkerSupportInternalUtilities.getFontWidth(control);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.IMarkerField#getValue(org.eclipse.ui.internal.provisional.views.markers.MarkerItem)
-	 */
-	public String getValue(MarkerItem item) {
-		return item.getPath();
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerPreferencesDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerPreferencesDialog.java
deleted file mode 100644
index f1ff93d..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerPreferencesDialog.java
+++ /dev/null
@@ -1,459 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-import org.eclipse.jface.resource.JFaceColors;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-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;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.preferences.ViewSettingsDialog;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * MarkerPreferencesDialog is the dialog for showing marker preferences.
- * 
- * @since 3.4
- * 
- */
-public class MarkerPreferencesDialog extends ViewSettingsDialog {
-
-	private IntegerFieldEditor limitEditor;
-
-	private Button enablementButton;
-
-	private Composite editArea;
-
-	private Label messageLabel;
-
-	private ExtendedMarkersView extendedView;
-
-	private ArrayList visible;
-
-	private ArrayList hidden;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param view -
-	 *            the view this is being launched from
-	 */
-	public MarkerPreferencesDialog(ExtendedMarkersView view) {
-		super(view.getSite().getShell());
-		this.extendedView = view;
-
-		Object[] visibleFields = view.getVisibleFields();
-		Object[] hiddenFields = view.getHiddenFields();
-
-		visible = new ArrayList();
-		hidden = new ArrayList();
-
-		for (int i = 0; i < visibleFields.length; i++) {
-			visible.add(visibleFields[i]);
-		}
-
-		for (int i = 0; i < hiddenFields.length; i++) {
-			hidden.add(hiddenFields[i]);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(MarkerMessages.MarkerPreferences_DialogTitle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#getShellStyle()
-	 */
-	protected int getShellStyle() {
-		return super.getShellStyle() | SWT.RESIZE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-
-		Composite dialogArea = (Composite) super.createDialogArea(parent);
-
-		boolean checked = IDEWorkbenchPlugin.getDefault().getPreferenceStore()
-				.getBoolean(IDEInternalPreferences.USE_MARKER_LIMITS);
-		enablementButton = new Button(dialogArea, SWT.CHECK);
-		enablementButton.setText(MarkerMessages.MarkerPreferences_MarkerLimits);
-		enablementButton.setSelection(checked);
-
-		editArea = new Composite(dialogArea, SWT.NONE);
-		editArea.setLayout(new GridLayout());
-		GridData editData = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
-		editData.horizontalIndent = 10;
-		editArea.setLayoutData(editData);
-
-		limitEditor = new IntegerFieldEditor(
-				"limit", MarkerMessages.MarkerPreferences_VisibleItems, editArea) { //$NON-NLS-1$
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.preference.IntegerFieldEditor#checkState()
-			 */
-			protected boolean checkState() {
-				boolean state = super.checkState();
-				setValid(state, getErrorMessage());
-				return state;
-			}
-		};
-		limitEditor.setPreferenceStore(IDEWorkbenchPlugin.getDefault()
-				.getPreferenceStore());
-		limitEditor
-				.setPreferenceName(IDEInternalPreferences.MARKER_LIMITS_VALUE);
-		limitEditor.load();
-
-		GridData checkedData = new GridData(SWT.FILL, SWT.NONE, true, false);
-		checkedData.horizontalSpan = limitEditor.getNumberOfControls();
-		enablementButton.setLayoutData(checkedData);
-
-		enablementButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				setLimitEditorEnablement(editArea, enablementButton
-						.getSelection());
-			}
-		});
-
-		setLimitEditorEnablement(editArea, checked);
-
-		messageLabel = new Label(dialogArea, SWT.NONE);
-
-		messageLabel.setBackground(JFaceColors.getErrorBackground(dialogArea
-				.getDisplay()));
-		messageLabel.setForeground(JFaceColors.getErrorText(dialogArea
-				.getDisplay()));
-		messageLabel
-				.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
-
-		createColumnsArea(dialogArea);
-
-		applyDialogFont(dialogArea);
-		return dialogArea;
-	}
-
-	/**
-	 * Create an area for the selected columns
-	 * 
-	 * @param dialogArea
-	 */
-	private void createColumnsArea(Composite dialogArea) {
-
-		initializeDialogUnits(dialogArea);
-		Group columnsComposite = new Group(dialogArea, SWT.NONE);
-		columnsComposite.setText(MarkerMessages.MarkerPreferences_ColumnGroupTitle);
-		FormLayout layout = new FormLayout();
-		columnsComposite.setLayout(layout);
-
-		columnsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
-				true));
-		Label visibleItemsLabel = new Label(columnsComposite, SWT.NONE);
-		visibleItemsLabel.setText(MarkerMessages.MarkerPreferences_VisibleColumnsTitle);
-		FormData visibleLabelData = new FormData();
-		visibleLabelData.right = new FormAttachment(45, 0);
-		visibleLabelData.left = new FormAttachment(
-				IDialogConstants.BUTTON_MARGIN);
-		visibleLabelData.top = new FormAttachment(0);
-		visibleItemsLabel.setLayoutData(visibleLabelData);
-
-		int rightMargin = IDialogConstants.BUTTON_MARGIN * -1;
-
-		Label nonVisibleLabel = new Label(columnsComposite, SWT.NONE);
-		nonVisibleLabel.setText(MarkerMessages.MarkerPreferences_HiddenColumnsTitle);
-		FormData nonVisibleLabelData = new FormData();
-		nonVisibleLabelData.right = new FormAttachment(100);
-		nonVisibleLabelData.left = new FormAttachment(55, 0);
-		nonVisibleLabelData.top = new FormAttachment(0);
-		nonVisibleLabel.setLayoutData(nonVisibleLabelData);
-
-		final ListViewer visibleViewer = new ListViewer(columnsComposite,
-				SWT.BORDER);
-
-		FormData visibleViewerData = new FormData();
-		visibleViewerData.right = new FormAttachment(visibleItemsLabel, 0,
-				SWT.RIGHT);
-		visibleViewerData.left = new FormAttachment(visibleItemsLabel, 0,
-				SWT.LEFT);
-		visibleViewerData.top = new FormAttachment(visibleItemsLabel,
-				IDialogConstants.BUTTON_MARGIN);
-		visibleViewerData.bottom = new FormAttachment(100, rightMargin);
-		visibleViewerData.height = convertHeightInCharsToPixels(15);
-		visibleViewerData.width = convertWidthInCharsToPixels(25);
-
-		visibleViewer.getControl().setLayoutData(visibleViewerData);
-
-		visibleViewer.setContentProvider(new IStructuredContentProvider() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				return visible.toArray();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-			}
-
-		});
-
-		visibleViewer.setLabelProvider(markerFieldLabelProvider());
-
-		visibleViewer.setInput(this);
-
-		final ListViewer nonVisibleViewer = new ListViewer(columnsComposite,
-				SWT.BORDER);
-
-		nonVisibleViewer.setLabelProvider(markerFieldLabelProvider());
-
-		nonVisibleViewer.setContentProvider(new IStructuredContentProvider() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				return hidden.toArray();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-			}
-
-		});
-		nonVisibleViewer.setInput(this);
-
-		FormData nonVisibleViewerData = new FormData();
-		nonVisibleViewerData.right = new FormAttachment(nonVisibleLabel, 0,
-				SWT.RIGHT);
-		nonVisibleViewerData.left = new FormAttachment(nonVisibleLabel, 0,
-				SWT.LEFT);
-		nonVisibleViewerData.top = new FormAttachment(nonVisibleLabel,
-				IDialogConstants.BUTTON_MARGIN);
-		nonVisibleViewerData.bottom = new FormAttachment(100, rightMargin);
-		nonVisibleViewerData.height = convertHeightInCharsToPixels(15);
-		nonVisibleViewerData.width = convertWidthInCharsToPixels(25);
-
-		nonVisibleViewer.getControl().setLayoutData(nonVisibleViewerData);
-
-		Button toNonVisibleButton = new Button(columnsComposite, SWT.PUSH);
-		toNonVisibleButton
-				.setText(getDefaultOrientation() == SWT.RIGHT_TO_LEFT ? MarkerMessages.MarkerPreferences_MoveLeft
-						: MarkerMessages.MarkerPreferences_MoveRight);
-
-		FormData toNonVisibleButtonData = new FormData();
-
-		toNonVisibleButtonData.top = new FormAttachment(visibleViewer
-				.getControl(), IDialogConstants.BUTTON_BAR_HEIGHT, SWT.TOP);
-		toNonVisibleButtonData.left = new FormAttachment(visibleViewer
-				.getControl(), IDialogConstants.BUTTON_MARGIN);
-		toNonVisibleButtonData.right = new FormAttachment(nonVisibleViewer
-				.getControl(), rightMargin);
-		toNonVisibleButton.setLayoutData(toNonVisibleButtonData);
-
-		toNonVisibleButton.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				List selection = ((IStructuredSelection) visibleViewer
-						.getSelection()).toList();
-				hidden.addAll(selection);
-				visible.removeAll(selection);
-				visibleViewer.refresh();
-				nonVisibleViewer.refresh();
-			}
-		});
-
-		Button toVisibleButton = new Button(columnsComposite, SWT.PUSH);
-		toVisibleButton
-				.setText(getDefaultOrientation() == SWT.RIGHT_TO_LEFT ? MarkerMessages.MarkerPreferences_MoveRight
-						: MarkerMessages.MarkerPreferences_MoveLeft);
-
-		FormData toVisibleButtonData = new FormData();
-
-		toVisibleButtonData.top = new FormAttachment(toNonVisibleButton,
-				IDialogConstants.BUTTON_MARGIN);
-		toVisibleButtonData.left = new FormAttachment(visibleViewer
-				.getControl(), IDialogConstants.BUTTON_MARGIN);
-		toVisibleButtonData.right = new FormAttachment(nonVisibleViewer
-				.getControl(), rightMargin);
-		toVisibleButton.setLayoutData(toVisibleButtonData);
-
-		toVisibleButton.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				List selection = ((IStructuredSelection) nonVisibleViewer
-						.getSelection()).toList();
-				hidden.removeAll(selection);
-				visible.addAll(selection);
-				visibleViewer.refresh();
-				nonVisibleViewer.refresh();
-			}
-		});
-
-	}
-
-	/**
-	 * Return a label provider for fields.
-	 * @return LabelProvider
-	 */
-	private LabelProvider markerFieldLabelProvider() {
-		return new LabelProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
-			 */
-			public String getText(Object element) {
-				return ((MarkerField) element).getColumnHeaderText();
-			}
-		};
-	}
-
-	/**
-	 * Set the enabled state of the OK button by state.
-	 * 
-	 * @param state
-	 */
-	protected void setValid(boolean state, String errorMessage) {
-		Button okButton = getButton(IDialogConstants.OK_ID);
-
-		if (okButton == null)
-			return;
-
-		if (state)
-			messageLabel.setText(MarkerSupportInternalUtilities.EMPTY_STRING);
-		else
-			messageLabel.setText(errorMessage);
-
-		okButton.setEnabled(state);
-
-	}
-
-	/**
-	 * Enable the limitEditor based on checked.
-	 * 
-	 * @param control
-	 *            The parent of the editor
-	 * @param checked
-	 */
-	private void setLimitEditorEnablement(Composite control, boolean checked) {
-		limitEditor.setEnabled(checked, control);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-
-		limitEditor.store();
-		IDEWorkbenchPlugin.getDefault().getPreferenceStore().setValue(
-				IDEInternalPreferences.USE_MARKER_LIMITS,
-				enablementButton.getSelection());
-		IDEWorkbenchPlugin.getDefault().savePluginPreferences();
-
-		extendedView.setVisibleFields(visible);
-
-		super.okPressed();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.preferences.ViewSettingsDialog#performDefaults()
-	 */
-	protected void performDefaults() {
-		super.performDefaults();
-		limitEditor.loadDefault();
-		boolean checked = IDEWorkbenchPlugin.getDefault().getPreferenceStore()
-				.getDefaultBoolean(IDEInternalPreferences.USE_MARKER_LIMITS);
-		enablementButton.setSelection(checked);
-		setLimitEditorEnablement(editArea, checked);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerPreferencesHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerPreferencesHandler.java
deleted file mode 100644
index b85aa9a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerPreferencesHandler.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.IHandler;
-import org.eclipse.ui.views.markers.MarkerViewHandler;
-
-/**
- * MarkerPreferencesHandler is the handler for opening the marker preferences dialog.
- * @since 3.4
- *
- */
-public class MarkerPreferencesHandler extends MarkerViewHandler implements
-		IHandler {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) {
-		
-		ExtendedMarkersView view = getView(event);
-		if(view == null)
-			return this;
-		
-		new MarkerPreferencesDialog(view).open();
-		return this;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerPriorityField.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerPriorityField.java
deleted file mode 100644
index 70acd29..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerPriorityField.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerItem;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * MarkerPriorityField is the field for task priority.
- * 
- * @since 3.4
- * 
- */
-public class MarkerPriorityField extends MarkerField {
-
-	private class PriorityEditingSupport extends EditingSupport {
-
-		private ComboBoxCellEditor editor;
-
-		/**
-		 * Create a new instance of the receiver.
-		 * 
-		 * @param viewer
-		 */
-		public PriorityEditingSupport(ColumnViewer viewer) {
-			super(viewer);
-			this.editor = new ComboBoxCellEditor((Composite) viewer
-					.getControl(), priorities, SWT.READ_ONLY);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object)
-		 */
-		protected boolean canEdit(Object element) {
-			if (element instanceof MarkerEntry)
-				return ((MarkerEntry) element).getAttributeValue(
-						IMarker.USER_EDITABLE, false);
-			return false;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.EditingSupport#getCellEditor(java.lang.Object)
-		 */
-		protected CellEditor getCellEditor(Object element) {
-			return editor;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.EditingSupport#getValue(java.lang.Object)
-		 */
-		protected Object getValue(Object element) {
-			return new Integer(((MarkerEntry) element).getAttributeValue(
-					IMarker.PRIORITY, IMarker.PRIORITY_NORMAL));
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.EditingSupport#setValue(java.lang.Object,
-		 *      java.lang.Object)
-		 */
-		protected void setValue(Object element, Object value) {
-			MarkerEntry entry = (MarkerEntry) element;
-			Integer integerValue = (Integer) value;
-			try {
-				entry.getMarker().setAttribute(IMarker.PRIORITY,
-						integerValue.intValue());
-			} catch (CoreException e) {
-				Policy.handle(e);
-			}
-
-		}
-	}
-
-	static final String HIGH_PRIORITY_IMAGE_PATH = "$nl$/icons/full/obj16/hprio_tsk.gif"; //$NON-NLS-1$
-
-	static final String LOW_PRIORITY_IMAGE_PATH = "$nl$/icons/full/obj16/lprio_tsk.gif"; //$NON-NLS-1$
-
-	private static String[] priorities = new String[] {
-			MarkerMessages.priority_low, MarkerMessages.priority_normal,
-			MarkerMessages.priority_high };
-
-	/**
-	 * Return a new priority field.
-	 */
-	public MarkerPriorityField() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerField#compare(org.eclipse.ui.internal.provisional.views.markers.api.MarkerItem,
-	 *      org.eclipse.ui.internal.provisional.views.markers.api.MarkerItem)
-	 */
-	public int compare(MarkerItem item1, MarkerItem item2) {
-		return item2.getAttributeValue(IMarker.PRIORITY,
-				IMarker.PRIORITY_NORMAL)
-				- item1.getAttributeValue(IMarker.PRIORITY,
-						IMarker.PRIORITY_NORMAL);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerField#getColumnHeaderText()
-	 */
-	public String getColumnHeaderText() {
-		return MarkerSupportInternalUtilities.EMPTY_STRING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerField#getColumnTooltipText()
-	 */
-	public String getColumnTooltipText() {
-		return MarkerMessages.priority_description;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerField#getDefaultColumnWidth(org.eclipse.swt.widgets.Control)
-	 */
-	public int getDefaultColumnWidth(Control control) {
-		return getHighPriorityImage().getBounds().width;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerField#getEditingSupport(org.eclipse.jface.viewers.ColumnViewer)
-	 */
-	public EditingSupport getEditingSupport(ColumnViewer viewer) {
-		return new PriorityEditingSupport(viewer);
-	}
-
-	/**
-	 * Get the image for high priority
-	 * 
-	 * @return Image
-	 */
-	private Image getHighPriorityImage() {
-		return MarkerSupportInternalUtilities
-				.createImage(HIGH_PRIORITY_IMAGE_PATH,getImageManager());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerField#getValue(org.eclipse.ui.internal.provisional.views.markers.MarkerItem)
-	 */
-	public String getValue(MarkerItem item) {
-		return MarkerSupportInternalUtilities.EMPTY_STRING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.MarkerField#update(org.eclipse.jface.viewers.ViewerCell)
-	 */
-	public void update(ViewerCell cell) {
-		super.update(cell);
-		try {
-			switch (((MarkerItem) cell.getElement()).getAttributeValue(
-					IMarker.PRIORITY, IMarker.PRIORITY_NORMAL)) {
-			case IMarker.PRIORITY_HIGH:
-				cell.setImage(getHighPriorityImage());
-				break;
-			case IMarker.PRIORITY_NORMAL:
-				cell.setImage(null);
-				break;
-			case IMarker.PRIORITY_LOW:
-				cell.setImage(MarkerSupportInternalUtilities
-						.createImage(LOW_PRIORITY_IMAGE_PATH,getImageManager()));
-				break;
-			default:
-				break;
-			}
-
-		} catch (NumberFormatException e) {
-			return;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerProblemSeverityAndMessageField.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerProblemSeverityAndMessageField.java
deleted file mode 100644
index caf65cb..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerProblemSeverityAndMessageField.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007,2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.jface.resource.DeviceResourceException;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.ui.views.markers.MarkerItem;
-
-/**
- * MarkerSeverityAndMessageField is the field for severity and messages.
- * 
- * @since 3.4
- * 
- */
-public class MarkerProblemSeverityAndMessageField extends
-		MarkerDescriptionField {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.provisional.views.markers.IMarkerField#compare(org.eclipse.ui.provisional.views.markers.MarkerItem,
-	 *      org.eclipse.ui.provisional.views.markers.MarkerItem)
-	 */
-	public int compare(MarkerItem item1, MarkerItem item2) {
-
-		int severity1 = MarkerSupportInternalUtilities.getSeverity(item1);
-		int severity2 = MarkerSupportInternalUtilities.getSeverity(item2);
-		if (severity1 == severity2)
-			return super.compare(item1, item2);
-		return severity2 - severity1;
-	}
-
-	/**
-	 * Return the image for the receiver.
-	 * 
-	 * @param item
-	 * @return Image or <code>null</code>
-	 */
-	private Image getImage(MarkerItem item) {
-
-		MarkerSupportItem supportItem = (MarkerSupportItem) item;
-
-		int severity = -1;
-		if (supportItem.isConcrete())
-			severity = MarkerSupportInternalUtilities.getSeverity(item);
-		else
-			severity = ((MarkerCategory) supportItem).getHighestSeverity();
-
-		if (severity >= 0)
-			return MarkerSupportInternalUtilities.getSeverityImage(severity);
-		try {
-			if (supportItem.isConcrete())
-				return null;
-			return JFaceResources
-					.getResources()
-					.createImageWithDefault(
-							IDEInternalWorkbenchImages
-									.getImageDescriptor(IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEM_CATEGORY));
-		} catch (DeviceResourceException e) {
-			return null;
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.MarkerField#update(org.eclipse.jface.viewers.ViewerCell)
-	 */
-	public void update(ViewerCell cell) {
-		super.update(cell);
-
-		MarkerItem item = (MarkerItem) cell.getElement();
-		cell.setImage(annotateImage(item, getImage(item)));
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerPropertyTester.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerPropertyTester.java
deleted file mode 100644
index 1ba0f7b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerPropertyTester.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.actions.SimpleWildcardTester;
-
-/**
- * The property tester used to test the attributes of the Marker
- * 
- * @since 3.5
- * @author Prakash G.R.
- * 
- */
-public class MarkerPropertyTester extends PropertyTester {
-
-	/**
-	 * An attribute indicating the marker priority (value
-	 * <code>"priority"</code>). The attribute value in xml must be one of
-	 * <code>IMarker.PRIORITY_LOW, 
-	 * IMarker.PRIORITY_NORMAL, or IMarker.PRIORITY_HIGH</code>
-	 */
-	public static final String PRIORITY = IMarker.PRIORITY;
-
-	/**
-	 * An attribute indicating the marker severity (value
-	 * <code>"severity"</code>). The attribute value in xml in xml must be one
-	 * of <code>IMarker.SEVERITY_ERROR, 
-	 * IMarker.SEVERITY_WARNING, or IMarker.SEVERITY_INFO</code>
-	 */
-	public static final String SEVERITY = IMarker.SEVERITY;
-
-	/**
-	 * An attribute indicating whether the marker is considered done (value
-	 * <code>"done"</code>). The attribute value in xml must be one of
-	 * <code>"true" or "false"</code>.
-	 */
-	public static final String DONE = IMarker.DONE;
-
-	/**
-	 * An attribute indicating the marker message (value <code>"message"</code>
-	 * ). The attribute value in xml is unconstrained. "*" may be used at the
-	 * start or the end to represent "one or more characters".
-	 */
-	public static final String MESSAGE = IMarker.MESSAGE;
-
-	/**
-	 * An attribute indicating the marker type (value <code>"type"</code>). The
-	 * attribute value in xml should match one of the marker types defined in
-	 * the workbench's marker extension point. Common examples are
-	 * <code>IMarker.TASK, IMarker.BOOKMARK, and IMarker.MARKER</code>.
-	 */
-
-	public static final String TYPE = "type"; //$NON-NLS-1$
-
-	/**
-	 * An attribute indicating the marker super type (value
-	 * <code>"superType"</code>). The attribute value in xml should match one of
-	 * the marker types defined in the workbench's marker extension point.
-	 * Common examples are
-	 * <code>IMarker.TASK, IMarker.BOOKMARK, and IMarker.MARKER</code>.
-	 */
-	public static final String SUPER_TYPE = "superType"; //$NON-NLS-1$
-
-	/**
-	 * An attribute indicating the type of resource associated with the marker
-	 * (value <code>"resourceType"</code>). The attribute value in xml must be
-	 * one of <code>IResource.FILE, IResource.PROJECT, IResource.FOLDER,
-	 * or IResource.ROOT</code>.
-	 */
-	public static final String RESOURCE_TYPE = "resourceType"; //$NON-NLS-1$
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public MarkerPropertyTester() {
-	}
-
-	public boolean test(Object receiver, String property, Object[] args,
-			Object expectedValue) {
-		return test(((IMarker) receiver), property, expectedValue.toString());
-	}
-
-	/**
-	 * Returns whether the specific integer attribute matches a value.
-	 */
-	private static boolean testIntegerAttribute(IMarker marker,
-			String attrName, String value) {
-		Integer i1, i2;
-		try {
-			i1 = (Integer) marker.getAttribute(attrName);
-			if (i1 == null) {
-				return false;
-			}
-		} catch (CoreException e) {
-			return false;
-		}
-		try {
-			i2 = Integer.valueOf(value);
-		} catch (NumberFormatException e) {
-			return false;
-		}
-		return i1.equals(i2);
-	}
-
-	/**
-	 * Tests the attribute's value for the given marker
-	 * 
-	 * @param marker
-	 *            - The marker
-	 * @param attributeName
-	 *            - Name of the attribute
-	 * @param expectedValue
-	 *            - Value to test for
-	 * @return - true, if the value is same as expected, false otherwise
-	 */
-	public static boolean test(IMarker marker, String attributeName,
-			String expectedValue) {
-
-		if (TYPE.equals(attributeName)) {
-			try {
-				return expectedValue.equals(marker.getType());
-			} catch (CoreException e) {
-				return false;
-			}
-		} else if (SUPER_TYPE.equals(attributeName)) {
-			try {
-				return marker.isSubtypeOf(expectedValue);
-			} catch (CoreException e) {
-				return false;
-			}
-		} else if (PRIORITY.equals(attributeName)) {
-			return testIntegerAttribute(marker, IMarker.PRIORITY, expectedValue);
-		} else if (SEVERITY.equals(attributeName)) {
-			return testIntegerAttribute(marker, IMarker.SEVERITY, expectedValue);
-		} else if (MESSAGE.equals(attributeName)) {
-			try {
-				String msg = (String) marker.getAttribute(IMarker.MESSAGE);
-				if (msg == null) {
-					return false;
-				}
-				return SimpleWildcardTester.testWildcardIgnoreCase(
-						expectedValue, msg);
-			} catch (CoreException e) {
-				return false;
-			}
-		} else if (DONE.equals(attributeName)) {
-			try {
-				expectedValue = expectedValue.toLowerCase();
-				Boolean done = (Boolean) marker.getAttribute(IMarker.DONE);
-				if (done == null) {
-					return false;
-				}
-				return (done.booleanValue() == expectedValue.equals("true"));//$NON-NLS-1$
-			} catch (CoreException e) {
-				return false;
-			}
-		} else if (RESOURCE_TYPE.equals(attributeName)) {
-			int desiredType = 0;
-
-			try {
-				desiredType = Integer.parseInt(expectedValue);
-			} catch (NumberFormatException eNumberFormat) {
-			}
-
-			if (!(desiredType == IResource.FILE
-					|| desiredType == IResource.FOLDER
-					|| desiredType == IResource.PROJECT || desiredType == IResource.ROOT)) {
-				return false;
-			}
-
-			return (marker.getResource().getType() & desiredType) > 0;
-		}
-		return false;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerResourceField.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerResourceField.java
deleted file mode 100644
index f331b6b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerResourceField.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerItem;
-import org.eclipse.ui.views.markers.MarkerViewUtil;
-
-/**
- * MarkerResourceField is the field that specifies the resource column.
- * 
- * @since 3.4
- * 
- */
-public class MarkerResourceField extends MarkerField {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.provisional.views.markers.IMarkerField#getValue(org.eclipse.ui.provisional.views.markers.MarkerItem)
-	 */
-	public String getValue(MarkerItem item) {
-		if (item.getMarker() == null)
-			return MarkerSupportInternalUtilities.EMPTY_STRING;
-
-		return item.getAttributeValue(MarkerViewUtil.NAME_ATTRIBUTE,
-				item.getMarker().getResource().getName());
-
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSelectAllHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSelectAllHandler.java
deleted file mode 100644
index 4104da4..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSelectAllHandler.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.eclipse.ui.internal.views.markers;
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.IHandler;
-import org.eclipse.ui.views.markers.MarkerViewHandler;
-
-/**
- * MarkerSelectAllHandler is the handler for the select all action.
- * @since 3.4
- *
- */
-public class MarkerSelectAllHandler extends MarkerViewHandler implements
-		IHandler {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event)  {
-		ExtendedMarkersView view = getView(event);
-		if(view != null)
-			view.selectAll();
-		return this;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSeverityAndDescriptionField.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSeverityAndDescriptionField.java
deleted file mode 100644
index a0f10dc..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSeverityAndDescriptionField.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.views.markers.MarkerItem;
-
-/**
- * MarkerSeverityAndDescriptionField can handle severities for all markers.
- * 
- * @since 3.4
- * 
- */
-public class MarkerSeverityAndDescriptionField extends MarkerDescriptionField {
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public MarkerSeverityAndDescriptionField() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.provisional.views.markers.IMarkerField#compare(org.eclipse.ui.provisional.views.markers.MarkerItem,
-	 *      org.eclipse.ui.provisional.views.markers.MarkerItem)
-	 */
-	public int compare(MarkerItem item1, MarkerItem item2) {
-
-		int severity1 = MarkerSupportInternalUtilities.getSeverity(item1);
-		int severity2 = MarkerSupportInternalUtilities.getSeverity(item2);
-		if (severity1 == severity2)
-			return super.compare(item1, item2);
-		return severity2 - severity1;
-	}
-
-	/**
-	 * Return the image for item.
-	 * 
-	 * @param item
-	 * @return Image or <code>null</code>
-	 */
-	private Image getImage(MarkerItem item) {
-
-		int severity = -1;
-		if (item.getMarker() == null)
-			severity = ((MarkerCategory) item).getHighestSeverity();
-		else
-			severity = MarkerSupportInternalUtilities.getSeverity(item);			
-
-		if (severity >= IMarker.SEVERITY_WARNING)
-			return MarkerSupportInternalUtilities.getSeverityImage(severity);
-		return null;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.MarkerField#update(org.eclipse.jface.viewers.ViewerCell)
-	 */
-	public void update(ViewerCell cell) {
-		super.update(cell);
-
-		MarkerItem item = (MarkerItem) cell.getElement();
-		cell.setImage(annotateImage(item, getImage(item)));
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSeverityField.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSeverityField.java
deleted file mode 100644
index ff1e68b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSeverityField.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerItem;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * MarkerSeverityField is the field for showing severity categories.
- * 
- * @since 3.4
- * 
- */
-public class MarkerSeverityField extends MarkerField {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerField#getValue(org.eclipse.ui.internal.provisional.views.markers.MarkerItem)
-	 */
-	public String getValue(MarkerItem item) {
-
-		switch (item.getAttributeValue(IMarker.SEVERITY, -1)) {
-		case 2:
-			return MarkerMessages.filtersDialog_severityError;
-		case 1:
-			return MarkerMessages.filtersDialog_severityWarning;
-		case 0:
-			return MarkerMessages.filtersDialog_severityInfo;
-
-		default:
-			return MarkerSupportInternalUtilities.EMPTY_STRING;
-		}
-
-	}
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.MarkerField#compare(org.eclipse.ui.views.markers.MarkerItem, org.eclipse.ui.views.markers.MarkerItem)
-	 */
-	public int compare(MarkerItem item1, MarkerItem item2) {
-		return MarkerSupportInternalUtilities.getSeverity(item2)
-				- MarkerSupportInternalUtilities.getSeverity(item1);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerShowInAdapter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerShowInAdapter.java
deleted file mode 100644
index 9a20547..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerShowInAdapter.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.Collection;
-import java.util.HashSet;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.part.IShowInSource;
-import org.eclipse.ui.part.ShowInContext;
-
-/**
- * MarkerShowInAdapter is the adapter for ExtendedMarkersViews to get an
- * IShowInSource.
- * 
- * @since 3.4
- * 
- */
-public class MarkerShowInAdapter implements IAdapterFactory {
-
-	private static Class[] classes = new Class[] { IShowInSource.class };
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object,
-	 *      java.lang.Class)
-	 */
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (!(adaptableObject instanceof ExtendedMarkersView))
-			return null;
-
-		final ExtendedMarkersView view = (ExtendedMarkersView) adaptableObject;
-
-		return new IShowInSource() {
-			public ShowInContext getShowInContext() {
-				IMarker[] markers = view.getSelectedMarkers();
-				Collection resources = new HashSet();
-				for (int i = 0; i < markers.length; i++) {
-					resources.add(markers[i].getResource());
-				}
-				return new ShowInContext(view.getViewerInput(),
-						new StructuredSelection(resources.toArray()));
-			}
-
-		};
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return classes;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSupportInternalUtilities.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSupportInternalUtilities.java
deleted file mode 100644
index a9d762c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSupportInternalUtilities.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 20072008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import java.net.URL;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.resource.ResourceManager;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.internal.util.BundleUtility;
-import org.eclipse.ui.statushandlers.StatusAdapter;
-import org.eclipse.ui.views.markers.FilterConfigurationArea;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerFieldFilter;
-import org.eclipse.ui.views.markers.MarkerItem;
-import org.eclipse.ui.views.markers.internal.MarkerGroup;
-import org.eclipse.ui.views.markers.internal.MarkerGroupingEntry;
-
-import com.ibm.icu.text.CollationKey;
-import com.ibm.icu.text.Collator;
-
-/**
- * MarkerSupportUtilities is the class that maintains constants and
- * functionality used by multiple classes.
- * 
- * @since 3.4
- * 
- */
-public class MarkerSupportInternalUtilities {
-
-	static final String ATTRIBUTE_CLASS = "class"; //$NON-NLS-1$
-
-	private static final String ATTRIBUTE_FILTER_CLASS = "filterClass"; //$NON-NLS-1$
-	private static final String ATTRIBUTE_FILTER_CONFIGURATION_CLASS = "filterConfigurationClass"; //$NON-NLS-1$
-
-	/**
-	 * The icon attribute name from a configuration element.
-	 */
-	public static final String ATTRIBUTE_ICON = "icon"; //$NON-NLS-1$
-	/**
-	 * The id attribute name from a configuration element.
-	 */
-	public static final String ATTRIBUTE_ID = "id"; //$NON-NLS-1$
-
-	/**
-	 * The name attribute name from a configuration element.
-	 */
-	public static final String ATTRIBUTE_NAME = "name"; //$NON-NLS-1$
-	/**
-	 * The name attribute name from a configuration element.
-	 */
-	public static final String ATTRIBUTE_TYPE = "type"; //$NON-NLS-1$
-	static final Object CONTAINS_MODIFIER_TOKEN = new Object();
-	static final Object CONTAINS_TEXT_TOKEN = new Object();
-
-	static final CollationKey EMPTY_COLLATION_KEY = Collator.getInstance()
-			.getCollationKey(MarkerSupportInternalUtilities.EMPTY_STRING);
-
-	static final IMarker[] EMPTY_MARKER_ARRAY = new IMarker[0];
-	static final MarkerSupportItem[] EMPTY_MARKER_ITEM_ARRAY = new MarkerSupportItem[0];
-	static final IResource[] EMPTY_RESOURCE_ARRAY = new IResource[0];
-
-	/**
-	 * A reusable empty {@link String}
-	 */
-	public static final String EMPTY_STRING = ""; //$NON-NLS-1$
-
-	/**
-	 * The configuration element constant for false
-	 */
-	static final String FALSE = "false"; //$NON-NLS-1$
-
-	/**
-	 * The markers help decoration.
-	 */
-	public static final String IMG_MARKERS_HELP_DECORATION_PATH = "markers/help_small.gif"; //$NON-NLS-1$
-	/**
-	 * The markers quick fix decoration.
-	 */
-	public static final String IMG_MARKERS_QUICK_FIX_DECORATION_PATH = "markers/contassist_ovr.gif"; //$NON-NLS-1$
-
-	/**
-	 * The suffix to the view names for the legacy markers views.
-	 */
-	public static final String LEGACY_SUFFIX = ".old"; //$NON-NLS-1$
-
-	/**
-	 * A constant to map migration to the filter being migrated
-	 */
-	public static final String MIGRATE_PREFERENCE_CONSTANT = "_MIGRATE"; //$NON-NLS-1$
-
-	/**
-	 * Constant for the bookmark filters migration.
-	 */
-	public static final String MIGRATE_BOOKMARK_FILTERS = IDEInternalPreferences.BOOKMARKS_FILTERS
-			+ MIGRATE_PREFERENCE_CONSTANT;
-
-	/**
-	 * Constant for the problem filters migration.
-	 */
-	public static final String MIGRATE_PROBLEM_FILTERS = IDEInternalPreferences.PROBLEMS_FILTERS
-			+ MIGRATE_PREFERENCE_CONSTANT;
-
-	/**
-	 * Constant for the task filters migration.
-	 */
-	public static final String MIGRATE_TASK_FILTERS = IDEInternalPreferences.TASKS_FILTERS
-			+ MIGRATE_PREFERENCE_CONSTANT;
-
-	/**
-	 * The string value of the false value for a boolean attribute.
-	 */
-	public static final Object VALUE_FALSE = "false"; //$NON-NLS-1$
-
-	/**
-	 * Create the image at the supplied path.
-	 * 
-	 * @param completeImagePath
-	 * @param manager the resource manager to allocate the image in
-	 * @return Image or <code>null</code>.
-	 */
-	static final Image createImage(String completeImagePath, ResourceManager manager) {
-		URL url = BundleUtility.find(IDEWorkbenchPlugin.getDefault()
-				.getBundle().getSymbolicName(), completeImagePath);
-		if (url == null)
-			return null;
-		return manager.createImageWithDefault(ImageDescriptor.createFromURL(url));
-	}
-
-	/**
-	 * Return a StatusAdapter for the error
-	 * 
-	 * @param exception
-	 * @return StatusAdapter
-	 */
-	static final StatusAdapter errorFor(Throwable exception) {
-		IStatus status = new Status(IStatus.ERROR,
-				IDEWorkbenchPlugin.IDE_WORKBENCH, IStatus.ERROR, exception
-						.getLocalizedMessage(), exception);
-		return new StatusAdapter(status);
-	}
-
-	/**
-	 * Generate the filter for the receiver from the configurationElement.
-	 * 
-	 * @param field
-	 *            the field being generated
-	 * @return MarkerFieldFilter or <code>null</code>.
-	 */
-	static final MarkerFieldFilter generateFilter(MarkerField field) {
-		IConfigurationElement configurationElement = field
-				.getConfigurationElement();
-		try {
-			if (configurationElement.getAttribute(ATTRIBUTE_FILTER_CLASS) == null)
-				return null;
-			Object filter = IDEWorkbenchPlugin.createExtension(
-					configurationElement, ATTRIBUTE_FILTER_CLASS);
-			if (filter == null)
-				return null;
-			MarkerFieldFilter fieldFilter = (MarkerFieldFilter) filter;
-			fieldFilter.setField(field);
-			return fieldFilter;
-		} catch (CoreException e) {
-			Policy.handle(e);
-			return null;
-		}
-	}
-
-	/**
-	 * Create a FilterConfigurationArea for the receiver.
-	 * 
-	 * @param field
-	 *            the field with the specified area
-	 * @return FilterConfigurationArea or <code>null</code>
-	 */
-	static final FilterConfigurationArea generateFilterArea(MarkerField field) {
-		IConfigurationElement configurationElement = field
-				.getConfigurationElement();
-		try {
-			if (configurationElement
-					.getAttribute(ATTRIBUTE_FILTER_CONFIGURATION_CLASS) == null)
-				return null;
-			FilterConfigurationArea area = (FilterConfigurationArea) IDEWorkbenchPlugin
-					.createExtension(configurationElement,
-							ATTRIBUTE_FILTER_CONFIGURATION_CLASS);
-			if (area != null)
-				area.setField(field);
-			return area;
-		} catch (CoreException e) {
-			Policy.handle(e);
-			return null;
-		}
-	}
-
-	/**
-	 * Return the children of the given marker item (may return an array of
-	 * length 0)
-	 * 
-	 * @param markerItem
-	 * @return the children
-	 */
-	public static final MarkerItem[] getChildren(MarkerItem markerItem) {
-		if (markerItem instanceof MarkerCategory) {
-			return ((MarkerCategory) markerItem).getChildren();
-		}
-		return EMPTY_MARKER_ITEM_ARRAY;
-	}
-
-	/**
-	 * Determine the average width of font used by the control.
-	 * 
-	 * @param control
-	 * @return int
-	 */
-	public static final int getFontWidth(Control control) {
-		GC gc = new GC(control.getDisplay());
-		int width = gc.getFontMetrics().getAverageCharWidth();
-		gc.dispose();
-		return width;
-	}
-
-	/**
-	 * Return the group value of the item in group.
-	 * 
-	 * @param group
-	 * @param item
-	 * @return String
-	 */
-	public static final String  getGroupValue(MarkerGroup group, MarkerItem item) {
-		if (item.getMarker() == null)
-			return ((MarkerSupportItem) item).getDescription();
-		try {
-			MarkerGroupingEntry groupingEntry = group.findGroupValue(item
-					.getMarker().getType(), item.getMarker());
-			return groupingEntry.getLabel();
-		} catch (CoreException exception) {
-			Policy.handle(exception);
-			return MarkerSupportInternalUtilities.EMPTY_STRING;
-		}
-	}
-
-	/**
-	 * Returns the highest severity of the given marker item and all its
-	 * children.
-	 * 
-	 * @param markerItem
-	 * @return the severity
-	 */
-	public static final int getHighestSeverity(MarkerItem markerItem) {
-		if (markerItem instanceof MarkerCategory) {
-			MarkerCategory category = (MarkerCategory) markerItem;
-			return category.getHighestSeverity();
-		}
-		IMarker marker = markerItem.getMarker();
-		Assert.isNotNull(marker);
-		return marker.getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO);
-	}
-
-	/**
-	 * Return the id for the field.
-	 * 
-	 * @param field
-	 * @return String
-	 */
-	public static final String getId(MarkerField field) {
-		return field.getConfigurationElement().getAttribute(
-				MarkerSupportInternalUtilities.ATTRIBUTE_ID);
-	}
-
-	/**
-	 * Get the IDE image at path.
-	 * 
-	 * @param constantName
-	 * @return Image
-	 */
-	private static Image getIDEImage(String constantName) {
-
-		return JFaceResources.getResources().createImageWithDefault(
-				IDEInternalWorkbenchImages.getImageDescriptor(constantName));
-
-	}
-
-	/**
-	 * Get the marker limit for the receiver.
-	 * 
-	 * @return int
-	 */
-	static int getMarkerLimit() {
-
-		// If limits are enabled return it. Otherwise return -1
-		if (IDEWorkbenchPlugin.getDefault().getPreferenceStore().getBoolean(
-				IDEInternalPreferences.USE_MARKER_LIMITS)) {
-			return IDEWorkbenchPlugin.getDefault().getPreferenceStore().getInt(
-					IDEInternalPreferences.MARKER_LIMITS_VALUE);
-
-		}
-		return -1;
-
-	}
-
-	/**
-	 * Return the severity value for item. A value of -1 indicates
-	 * that there is no severity value.
-	 * 
-	 * @param item
-	 * @return int
-	 */
-	static int getSeverity(MarkerItem item) {
-		return item.getAttributeValue(IMarker.SEVERITY, -1);
-	}
-
-	/**
-	 * Get the image for the supplied severity
-	 * 
-	 * @param severity
-	 * @return {@link Image}
-	 */
-	public static Image getSeverityImage(int severity) {
-
-		if (severity == IMarker.SEVERITY_ERROR) {
-			return getIDEImage(IDEInternalWorkbenchImages.IMG_OBJS_ERROR_PATH);
-		}
-		if (severity == IMarker.SEVERITY_WARNING) {
-			return getIDEImage(IDEInternalWorkbenchImages.IMG_OBJS_WARNING_PATH);
-		}
-		if (severity == IMarker.SEVERITY_INFO) {
-			return getIDEImage(IDEInternalWorkbenchImages.IMG_OBJS_INFO_PATH);
-		}
-
-		return null;
-
-	}
-
-	/**
-	 * Create the MarkerItem that wraps marker.
-	 * 
-	 * @param marker
-	 * @return {@link MarkerItem}
-	 */
-	static MarkerItem newMarkerItem(IMarker marker) {
-		return new MarkerEntry(marker);
-	}
-
-	/**
-	 * Show the marker in view if possible.
-	 * 
-	 * @param view
-	 * @param marker
-	 * @return <code>true</code> if the marker is shown
-	 */
-	public static boolean showMarker(IViewPart view, IMarker marker) {
-		if (view instanceof ExtendedMarkersView) {
-			StructuredSelection selection = new StructuredSelection(marker);
-			ExtendedMarkersView markerView = (ExtendedMarkersView) view;
-			markerView.setSelection(selection, true);
-			return true;
-		}
-		return false;
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSupportItem.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSupportItem.java
deleted file mode 100644
index b9d8166..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSupportItem.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ui.views.markers.MarkerItem;
-
-/**
- * MarkerSupportItem is the internal abstract superclass of the markerSupport {@link MarkerItem}.
- * @since 3.4
- *
- */
-abstract class MarkerSupportItem extends MarkerItem {
-
-	/**
-	 * Get the String value of the attribute in the enclosed marker.
-	 * 
-	 * @param attribute
-	 * @param defaultValue
-	 *            the defaultValue if the value is not set
-	 * @return String
-	 */
-	public String getAttributeValue(String attribute, String defaultValue) {
-		// All items have messages
-		if (attribute == IMarker.MESSAGE)
-			return getDescription();
-		return super.getAttributeValue(attribute, defaultValue);
-
-	}
-
-	/**
-	 * Get the children of the node.
-	 * 
-	 * @return MarkerNode[]
-	 */
-	abstract MarkerSupportItem[] getChildren();
-
-	/**
-	 * Return the number of elements that are children of the receiver
-	 * @return int
-	 */
-	int getChildrenCount() {
-		return 0;
-	}
-
-	/**
-	 * Return the creation time for the receiver.
-	 * @return long
-	 */
-	long getCreationTime() {
-		return -1;
-	}
-
-	/**
-	 * Return the description of the receiver.
-	 * 
-	 * @return String
-	 */
-	abstract String getDescription();
-
-	/**
-	 * Return the ID of the receiver
-	 * @return String
-	 */
-	long getID() {
-		return -1;
-		
-	}
-
-	/**
-	 * Get the human readable name of the type/
-	 * @return String
-	 */
-	String getMarkerTypeName() {
-		return MarkerSupportInternalUtilities.EMPTY_STRING;
-	}
-
-	/**
-	 * Return the parent node or <code>null</code> if this is a top level
-	 * element.
-	 * 
-	 * @return MarkerSupportItem
-	 */
-	abstract MarkerSupportItem getParent();
-	
-	/**
-	 * Return whether or not this is a concrete node
-	 * 
-	 * @return boolean
-	 */
-	abstract boolean isConcrete();
-	
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerTypeField.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerTypeField.java
deleted file mode 100644
index d5f47d5..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerTypeField.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerItem;
-
-
-/**
- * MarkerTypeField is the field that defines the marker type.
- * 
- * @since 3.3
- * 
- */
-public class MarkerTypeField extends MarkerField {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerField#getValue(org.eclipse.ui.internal.provisional.views.markers.MarkerItem)
-	 */
-	public String getValue(MarkerItem item) {
-		return ((MarkerSupportItem) item).getMarkerTypeName();
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerTypeFieldFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerTypeFieldFilter.java
deleted file mode 100644
index 63e2ece..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerTypeFieldFilter.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.views.markers.MarkerFieldFilter;
-import org.eclipse.ui.views.markers.MarkerItem;
-import org.eclipse.ui.views.markers.internal.MarkerFilter;
-import org.eclipse.ui.views.markers.internal.MarkerType;
-import org.eclipse.ui.views.markers.internal.MarkerTypesModel;
-import org.eclipse.ui.views.markers.internal.ProblemFilter;
-
-/**
- * MarkerTypeFieldFilter is the field filter for filtering on types.
- * 
- * @since 3.4
- * 
- */
-public class MarkerTypeFieldFilter extends CompatibilityFieldFilter {
-
-	private static final String TAG_TYPES_DELIMITER = ":"; //$NON-NLS-1$
-	private static final String TAG_SELECTED_TYPES = "selectedTypes"; //$NON-NLS-1$
-	Collection selectedTypes = new HashSet();
-	private MarkerContentGenerator contentGenerator;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter#select(org.eclipse.ui.internal.provisional.views.markers.api.MarkerItem)
-	 */
-	public boolean select(MarkerItem item) {
-
-		IMarker marker = item.getMarker();
-		if (marker == null)// OK if all are selected
-			return contentGenerator.allTypesSelected(selectedTypes);
-		try {
-			return selectedTypes.contains(MarkerTypesModel.getInstance()
-					.getType(marker.getType()));
-		} catch (CoreException e) {
-			return false;
-		}
-
-	}
-
-	/**
-	 * Set the selected types in the receiver based on the values in
-	 * contentGenerator.
-	 * 
-	 * @param markerTypes
-	 *            Collection of MarkerType
-	 * @param generator
-	 *            {@link MarkerContentGenerator}
-	 */
-	void setSelectedTypes(Collection markerTypes,
-			MarkerContentGenerator generator) {
-		setContentGenerator(generator);
-		selectedTypes = markerTypes;
-
-	}
-
-	/**
-	 * Return the selectedTypes.
-	 * 
-	 * @return Collection of MarkerType
-	 */
-	Collection getSelectedTypes() {
-		return selectedTypes;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.MarkerFieldFilter#saveSettings(org.eclipse.ui.IMemento)
-	 */
-	public void saveSettings(IMemento memento) {
-
-		if (selectedTypes.containsAll(contentGenerator.getMarkerTypes()))
-			return;
-
-		Iterator selected = selectedTypes.iterator();
-
-		StringBuffer settings = new StringBuffer();
-		while (selected.hasNext()) {
-			MarkerType markerType = (MarkerType) selected.next();
-			settings.append(markerType.getId());
-			settings.append(TAG_TYPES_DELIMITER);
-		}
-
-		memento.putString(TAG_SELECTED_TYPES, settings.toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.MarkerFieldFilter#loadSettings(org.eclipse.ui.IMemento)
-	 */
-	public void loadSettings(IMemento memento) {
-
-		String types = memento.getString(TAG_SELECTED_TYPES);
-		if (types == null)
-			return;
-
-		selectedTypes.clear();
-
-		int start = 0;
-		int nextSpace = types.indexOf(TAG_TYPES_DELIMITER, 0);
-		while (nextSpace > 0) {
-			String typeId = types.substring(start, nextSpace);
-			start = nextSpace + 1;
-			nextSpace = types.indexOf(TAG_TYPES_DELIMITER, start);
-
-			MarkerType type = contentGenerator.getType(typeId);
-			if (type != null)
-				selectedTypes.add(type);
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.CompatibilityFieldFilter#loadLegacySettings(org.eclipse.ui.IMemento, org.eclipse.ui.internal.views.markers.MarkerContentGenerator)
-	 */
-	void loadLegacySettings(IMemento memento, MarkerContentGenerator generator) {
-
-		setContentGenerator(generator);
-		// new selection list attribute
-		// format is "id:(true|false):"
-		String setting = memento.getString(MarkerFilter.TAG_SELECTION_STATUS);
-
-		if (setting != null) {
-			selectedTypes.clear();
-
-			// get the complete list of types
-			List newTypes = new ArrayList();
-
-			StringTokenizer stringTokenizer = new StringTokenizer(setting);
-
-			while (stringTokenizer.hasMoreTokens()) {
-				String id = stringTokenizer.nextToken(TAG_TYPES_DELIMITER);
-				String status = null;
-				if (stringTokenizer.hasMoreTokens()) {
-					status = stringTokenizer.nextToken(TAG_TYPES_DELIMITER);
-				}
-
-				MarkerType type = contentGenerator.getType(id);
-				if (type != null) {
-
-					newTypes.remove(type);
-
-					// add the type to the selected list
-					if (!MarkerFilter.SELECTED_FALSE.equals(status)
-							&& !selectedTypes.contains(type)) {
-						selectedTypes.add(type);
-					}
-				}
-			}
-		}
-
-	
-		
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.CompatibilityFieldFilter#initialize(org.eclipse.ui.views.markers.internal.ProblemFilter)
-	 */
-	public void initialize(ProblemFilter problemFilter) {
-		selectedTypes.clear();
-		selectedTypes.addAll(problemFilter.getSelectedTypes());
-
-	}
-
-	/**
-	 * Set the content generator that is being configured.
-	 * 
-	 * @param generator
-	 */
-	void setContentGenerator(MarkerContentGenerator generator) {
-		contentGenerator = generator;
-
-		// Set the initial selection to be everything
-		selectedTypes = new HashSet();
-		selectedTypes.addAll(generator.getMarkerTypes());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.MarkerFieldFilter#populateWorkingCopy(org.eclipse.ui.views.markers.MarkerFieldFilter)
-	 */
-	public void populateWorkingCopy(MarkerFieldFilter copy) {
-		super.populateWorkingCopy(copy);
-		
-		((MarkerTypeFieldFilter) copy).selectedTypes = new HashSet(
-				selectedTypes);
-		((MarkerTypeFieldFilter) copy).contentGenerator = contentGenerator;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkersContribution.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkersContribution.java
deleted file mode 100644
index 990c326..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkersContribution.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.CompoundContributionItem;
-
-/**
- * MarkersContribution is the abstract superclass of the compound contribution
- * items used in the Markers views.
- * 
- * @since 3.4
- * 
- */
-abstract class MarkersContribution extends CompoundContributionItem {
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public MarkersContribution() {
-		super();
-	}
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param id
-	 */
-	public MarkersContribution(String id) {
-		super(id);
-	}
-
-	/**
-	 * Get the view this contribution is working on.
-	 * 
-	 * @return ExtendedMarkersView
-	 */
-	ExtendedMarkersView getView() {
-		IWorkbenchWindow active = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (active == null)
-			return null;
-		IWorkbenchPage page = active.getActivePage();
-		if (page == null)
-			return null;
-		IWorkbenchPart part = page.getActivePart();
-		if (part == null)
-			return null;
-
-		return (ExtendedMarkersView) part;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkersPropertyPage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkersPropertyPage.java
deleted file mode 100644
index 199c38d..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkersPropertyPage.java
+++ /dev/null
@@ -1,357 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-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.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPropertyPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PropertyPage;
-import org.eclipse.ui.ide.undo.UpdateMarkersOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.internal.ide.StatusUtil;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-import org.eclipse.ui.views.markers.internal.Util;
-
-/**
- * MarkersPropertyPage is the property page for a marker.
- * 
- * @since 3.4
- * 
- */
-public class MarkersPropertyPage extends PropertyPage implements
-		IWorkbenchPropertyPage {
-
-	private Text descriptionText;
-	private IMarker marker;
-	Combo priorityCombo;
-	Button completedCheckbox;
-
-	/**
-	 * Create a new instance of the reciever.
-	 */
-	public MarkersPropertyPage() {
-		super();
-	}
-
-	protected Control createContents(Composite parent) {
-		// initialize resources/properties
-
-		Object element = getElement().getAdapter(IMarker.class);
-		IResource resource = null;
-
-		if (element != null) {
-			marker = (IMarker) element;
-			resource = marker.getResource();
-		} else if (resource == null) {
-			resource = ResourcesPlugin.getWorkspace().getRoot();
-		}
-
-		if (!Util.isEditable(marker))
-			noDefaultAndApplyButton();
-
-		Composite composite = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout(2, false);
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		composite.setLayout(layout);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		composite.setLayoutData(gridData);
-
-		initializeDialogUnits(composite);
-		createDescriptionArea(composite);
-		if (element != null) {
-			createSeperator(composite);
-			createCreationTimeArea(composite);
-		}
-		createAttributesArea(composite);
-		if (resource != null) {
-			createSeperator(composite);
-			createResourceArea(composite);
-		}
-
-		Dialog.applyDialogFont(composite);
-
-		return composite;
-	}
-
-	/**
-	 * Creates a seperator.
-	 */
-	protected void createSeperator(Composite parent) {
-		Label seperator = new Label(parent, SWT.NULL);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		seperator.setLayoutData(gridData);
-	}
-
-	/**
-	 * Method createCreationTimeArea.
-	 * 
-	 * @param parent
-	 */
-	private void createCreationTimeArea(Composite parent) {
-		Label label = new Label(parent, SWT.NONE);
-		label.setText(MarkerMessages.propertiesDialog_creationTime_text);
-
-		Label creationTime = new Label(parent, SWT.NONE);
-		creationTime.setText(Util.getCreationTime(marker));
-	}
-
-	/**
-	 * Creates the area for the Description field.
-	 */
-	private void createDescriptionArea(Composite parent) {
-		Label label = new Label(parent, SWT.NONE);
-		label.setText(MarkerMessages.propertiesDialog_description_text);
-		descriptionText = new Text(parent, (SWT.SINGLE | SWT.BORDER));
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.widthHint = convertHorizontalDLUsToPixels(400);
-		descriptionText.setLayoutData(gridData);
-		descriptionText.setText(Util.getProperty(IMarker.MESSAGE, marker));
-		descriptionText.selectAll();
-		descriptionText.setEditable(Util.isEditable(marker));
-
-	}
-
-	/**
-	 * This method is intended to be overridden by subclasses. The attributes
-	 * area is created between the creation time area and the resource area.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 */
-	protected void createAttributesArea(Composite parent) {
-		try {
-			if (marker.isSubtypeOf(IMarker.PROBLEM))
-				createProblemAttributes(parent);
-
-			if (marker.isSubtypeOf(IMarker.TASK))
-				createTaskAttributes(parent);
-		} catch (CoreException e) {
-			Policy.handle(e);
-		}
-	}
-
-	/**
-	 * Create the attributes area for editing a task
-	 * 
-	 * @param parent
-	 */
-	private void createTaskAttributes(Composite parent) {
-		createSeperator(parent);
-
-		Label label = new Label(parent, SWT.NONE);
-		label.setText(MarkerMessages.propertiesDialog_priority);
-
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		composite.setLayout(layout);
-
-		priorityCombo = new Combo(composite, SWT.READ_ONLY);
-		priorityCombo.setItems(new String[] {
-				MarkerMessages.propertiesDialog_priorityLow,
-				MarkerMessages.propertiesDialog_priorityNormal,
-				MarkerMessages.propertiesDialog_priorityHigh });
-
-		priorityCombo.select(marker.getAttribute(IMarker.PRIORITY,
-				IMarker.PRIORITY_NORMAL));
-		priorityCombo.setEnabled(Util.isEditable(marker));
-
-		completedCheckbox = new Button(composite, SWT.CHECK);
-		completedCheckbox.setText(MarkerMessages.propertiesDialog_completed);
-		GridData gridData = new GridData();
-		gridData.horizontalIndent = convertHorizontalDLUsToPixels(20);
-		completedCheckbox.setLayoutData(gridData);
-		
-		completedCheckbox.setEnabled(Util.isEditable(marker));
-		
-		Object done;
-		try {
-			done = marker.getAttribute(IMarker.DONE);
-			completedCheckbox.setSelection(done != null
-					&& done instanceof Boolean
-					&& ((Boolean) done).booleanValue());
-		} catch (CoreException e) {
-			Policy.handle(e);
-		}
-
-	}
-
-	/**
-	 * Create the attributes area for problems
-	 * 
-	 * @param parent
-	 */
-	private void createProblemAttributes(Composite parent) {
-		createSeperator(parent);
-
-		new Label(parent, SWT.NONE)
-				.setText(MarkerMessages.propertiesDialog_severityLabel);
-
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		composite.setLayout(layout);
-
-		Label severityImage = new Label(composite, SWT.NONE);
-
-		severityImage.setImage(Util.getImage(marker.getAttribute(
-				IMarker.SEVERITY, -1)));
-
-		Label severityLabel = new Label(composite, SWT.NONE);
-
-		int severity = marker.getAttribute(IMarker.SEVERITY, -1);
-		if (severity == IMarker.SEVERITY_ERROR) {
-			severityLabel.setText(MarkerMessages.propertiesDialog_errorLabel);
-		} else if (severity == IMarker.SEVERITY_WARNING) {
-			severityLabel.setText(MarkerMessages.propertiesDialog_warningLabel);
-		} else if (severity == IMarker.SEVERITY_INFO) {
-			severityLabel.setText(MarkerMessages.propertiesDialog_infoLabel);
-		} else {
-			severityLabel
-					.setText(MarkerMessages.propertiesDialog_noseverityLabel);
-		}
-
-	}
-
-	/**
-	 * Creates the area for the Resource field.
-	 */
-	private void createResourceArea(Composite parent) {
-		Label resourceLabel = new Label(parent, SWT.NONE);
-		resourceLabel.setText(MarkerMessages.propertiesDialog_resource_text);
-		Text resourceText = new Text(parent, SWT.SINGLE | SWT.WRAP
-				| SWT.READ_ONLY | SWT.BORDER);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		resourceText.setLayoutData(gridData);
-		resourceText.setText(Util.getResourceName(marker));
-
-		Label folderLabel = new Label(parent, SWT.NONE);
-		folderLabel.setText(MarkerMessages.propertiesDialog_folder_text);
-		Text folderText = new Text(parent, SWT.SINGLE | SWT.WRAP
-				| SWT.READ_ONLY | SWT.BORDER);
-		gridData = new GridData(GridData.FILL_HORIZONTAL);
-		folderText.setLayoutData(gridData);
-		folderText.setText(Util.getContainerName(marker));
-
-		Label locationLabel = new Label(parent, SWT.NONE);
-		locationLabel.setText(MarkerMessages.propertiesDialog_location_text);
-		Text locationText = new Text(parent, SWT.SINGLE | SWT.WRAP
-				| SWT.READ_ONLY | SWT.BORDER);
-		gridData = new GridData(GridData.FILL_HORIZONTAL);
-		locationText.setLayoutData(gridData);
-
-		String line = Util.getProperty(IMarker.LINE_NUMBER, marker);
-		if (line.length()==0)
-			locationText.setText(MarkerSupportInternalUtilities.EMPTY_STRING);
-		else
-			locationText.setText(NLS
-					.bind(MarkerMessages.label_lineNumber, line));
-
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	public boolean performOk() {
-		if (marker == null || Util.isEditable(marker)) {
-			saveChanges();
-		}
-		return super.performOk();
-	}
-
-	/**
-	 * Saves the changes made in the dialog if needed. Creates a new marker if
-	 * needed. Updates the existing marker only if there have been changes.
-	 */
-	private void saveChanges() {
-		Map attrs;
-		try {
-			attrs = marker.getAttributes();
-		} catch (CoreException e) {
-			attrs = new HashMap();
-			Policy.handle(e);
-		}
-
-		attrs.put(IMarker.MESSAGE, descriptionText.getText());
-
-		// Are we editing a task?
-		if (priorityCombo != null) {
-			int priority = IMarker.PRIORITY_NORMAL;
-
-			int index = priorityCombo.getSelectionIndex();
-			if (index == priorityCombo
-					.indexOf(MarkerMessages.propertiesDialog_priorityHigh))
-				priority = IMarker.PRIORITY_HIGH;
-			else if (index == priorityCombo
-					.indexOf(MarkerMessages.propertiesDialog_priorityLow))
-				priority = IMarker.PRIORITY_LOW;
-
-			attrs.put(IMarker.PRIORITY, new Integer(priority));
-		}
-
-		if (completedCheckbox != null)
-			attrs.put(IMarker.DONE,
-					completedCheckbox.getSelection() ? Boolean.TRUE
-							: Boolean.FALSE);
-
-		IUndoableOperation op = new UpdateMarkersOperation(marker, attrs, NLS
-				.bind(MarkerMessages.qualifiedMarkerCommand_title,
-						new Object[] {
-								MarkerMessages.DialogMarkerProperties_Modify,
-								Util.getResourceName(marker) }), true);
-
-		try {
-			PlatformUI.getWorkbench().getOperationSupport()
-					.getOperationHistory().execute(op, new NullProgressMonitor(),
-							WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
-		} catch (ExecutionException e) {
-			if (e.getCause() instanceof CoreException) {
-				StatusManager.getManager().handle(
-						((CoreException) e.getCause()).getStatus(),
-						StatusManager.SHOW);
-			} else
-				StatusManager.getManager().handle(
-						StatusUtil.newStatus(IStatus.ERROR, e
-								.getLocalizedMessage(), e));
-		}
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkersTreeViewer.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkersTreeViewer.java
deleted file mode 100644
index 1595cdf..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkersTreeViewer.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * The MarkersTreeViewer is a viewer that optimizes the expandToLevel method.
- * 
- * @since 3.4
- * 
- */
-
-// TODO Delete this class if Bug 201135 is fixed.
-// https://bugs.eclipse.org/bugs/show_bug.cgi?id=201135
-public class MarkersTreeViewer extends TreeViewer {
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param parent
-	 * @param style
-	 */
-	public MarkersTreeViewer(Composite parent, int style) {
-		super(parent, style);
-
-	}
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param parent
-	 */
-	public MarkersTreeViewer(Composite parent) {
-		super(parent);
-	}
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param tree
-	 */
-	public MarkersTreeViewer(Tree tree) {
-		super(tree);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#expandToLevel(java.lang.Object,
-	 *      int)
-	 */
-	public void expandToLevel(Object elementOrTreePath, int level) {
-		if (level == 1) {
-			Widget widget = findItem(elementOrTreePath);
-			if (widget != null && widget instanceof TreeItem) {
-				((TreeItem) widget).setExpanded(true);
-				return;
-			}
-		}
-		super.expandToLevel(elementOrTreePath, level);
-	}
-
-	/**
-	 * Remove all of the entries and unmap all of the elements.
-	 */
-	public void removeAndClearAll() {
-		removeAll(getControl());
-		unmapAllElements();		
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkersViewPropertyTester.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkersViewPropertyTester.java
deleted file mode 100644
index 7824f59..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkersViewPropertyTester.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.expressions.PropertyTester;
-
-/**
- * ContentGeneratorPropertyTester is the property tester for what content
- * generator is being shown.
- * 
- * @since 3.4
- * 
- */
-public class MarkersViewPropertyTester extends PropertyTester {
-
-	private static final String ATTRIBUTE_CONTENT_GENERATOR = "contentGenerator"; //$NON-NLS-1$
-
-
-	private static final String ATTRIBUTE_HAS_FILTERS = "hasFilters"; //$NON-NLS-1$
-
-	private static final String ATTRIBUTE_HAS_GROUPS = "hasGroups"; //$NON-NLS-1$
-
-	private static final String ANY_CONTENT_GENERATOR = "any"; //$NON-NLS-1$
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public MarkersViewPropertyTester() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object,
-	 *      java.lang.String, java.lang.Object[], java.lang.Object)
-	 */
-	public boolean test(Object receiver, String property, Object[] args,
-			Object expectedValue) {
-
-		if (!(receiver instanceof ExtendedMarkersView))
-			return false;
-
-		ExtendedMarkersView view = (ExtendedMarkersView) receiver;
-
-		if (property.equals(ATTRIBUTE_CONTENT_GENERATOR))
-			return testContentGenerator(view, args);
-		if (property.equals(ATTRIBUTE_HAS_FILTERS))
-			return view.getAllFilters().size() > 0;
-		if (property.equals(ATTRIBUTE_HAS_GROUPS))
-			return view.getBuilder().getGenerator().getMarkerGroups().size() > 0;
-
-		return false;
-	}
-
-	/**
-	 * Test if the content generator in the args match the receiver.
-	 * 
-	 * @param view
-	 * @param args
-	 * @return boolean
-	 */
-	private boolean testContentGenerator(ExtendedMarkersView view, Object[] args) {
-
-		String currentGenerator = view.getBuilder().getGenerator().getId();
-		for (int i = 0; i < args.length; i++) {
-			if (args[i].equals(currentGenerator))
-				return true;
-
-			// The value 'any' works for any content generator
-			if (args[i].equals(ANY_CONTENT_GENERATOR))
-				return true;
-		}
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/OpenMarkersViewHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/OpenMarkersViewHandler.java
deleted file mode 100644
index 126e0b5..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/OpenMarkersViewHandler.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.views.markers.MarkerViewHandler;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * OpenMarkersViewHandler is used to open another markers view.
- * 
- * @since 3.4
- * 
- */
-public class OpenMarkersViewHandler extends MarkerViewHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		ExtendedMarkersView part = getView(event);
-		if (part == null)
-			return null;
-		try {
-			String count = ExtendedMarkersView.newSecondaryID(part);
-				String defaultName = NLS.bind(MarkerMessages.newViewTitle,
-					new Object[] { part.getSite().getRegisteredName(), count });
-			InputDialog dialog = new InputDialog(part.getSite().getShell(),
-					NLS
-							.bind(MarkerMessages.NewViewHandler_dialogTitle,
-									new String[] { part.getSite()
-											.getRegisteredName() }),
-					MarkerMessages.NewViewHandler_dialogMessage, defaultName,
-					getValidator());
-
-			if (dialog.open() != Window.OK)
-				return this;
-
-			IViewPart newPart = part.getSite().getPage()
-					.showView(part.getSite().getId(), count,
-							IWorkbenchPage.VIEW_ACTIVATE);
-			if (newPart instanceof ExtendedMarkersView) {
-				((ExtendedMarkersView) newPart).initializeTitle(dialog
-						.getValue());
-			}
-		} catch (PartInitException e) {
-			throw new ExecutionException(e.getLocalizedMessage(), e);
-		}
-		return this;
-
-	}
-
-	/**
-	 * Get the input validator for the receiver.
-	 * 
-	 * @return IInputValidator
-	 */
-	private IInputValidator getValidator() {
-		return new IInputValidator() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.dialogs.IInputValidator#isValid(java.lang.String)
-			 */
-			public String isValid(String newText) {
-				if (newText.length() > 0)
-					return null;
-				return MarkerMessages.MarkerFilterDialog_emptyMessage;
-			}
-		};
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/PriorityConfigurationArea.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/PriorityConfigurationArea.java
deleted file mode 100644
index 0db3850..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/PriorityConfigurationArea.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.markers.FilterConfigurationArea;
-import org.eclipse.ui.views.markers.MarkerFieldFilter;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * The PriorityConfigurationArea is the configuration area for the task
- * priority.
- * 
- * @since 3.4
- * 
- */
-public class PriorityConfigurationArea extends FilterConfigurationArea {
-
-	private int priorities;
-	private Button highButton;
-	private Button normalButton;
-	private Button lowButton;
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public PriorityConfigurationArea() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#apply(org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter)
-	 */
-	public void apply(MarkerFieldFilter filter) {
-		((PriorityMarkerFieldFilter) filter).selectedPriorities = priorities;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createContents(Composite parent) {
-		
-		parent.setLayout(new GridLayout(3,false));
-
-		highButton = new Button(parent, SWT.CHECK);
-		highButton.setText(MarkerMessages.filtersDialog_priorityHigh);
-		highButton.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				updatePriorities(PriorityMarkerFieldFilter.PRIORITY_HIGH,
-						highButton.getSelection());
-			}
-
-		});
-
-		normalButton = new Button(parent, SWT.CHECK);
-		normalButton.setText(MarkerMessages.filtersDialog_priorityNormal);
-		normalButton.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				updatePriorities(PriorityMarkerFieldFilter.PRIORITY_NORMAL,
-						normalButton.getSelection());
-			}
-		});
-
-		lowButton = new Button(parent, SWT.CHECK);
-		lowButton.setText(MarkerMessages.filtersDialog_priorityLow);
-		lowButton.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				updatePriorities(PriorityMarkerFieldFilter.PRIORITY_LOW,
-						lowButton.getSelection());
-			}
-		});
-	}
-
-	/**
-	 * Update he priorities set based on the constant and the selection value.
-	 * 
-	 * @param constant
-	 * @param enabled
-	 */
-	void updatePriorities(int constant, boolean enabled) {
-
-		if (enabled)
-			priorities = constant | priorities;
-		else
-			priorities = constant ^ priorities;
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#initialize(org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter)
-	 */
-	public void initialize(MarkerFieldFilter filter) {
-		priorities = ((PriorityMarkerFieldFilter) filter).selectedPriorities;
-
-		lowButton
-				.setSelection((PriorityMarkerFieldFilter.PRIORITY_LOW & priorities) > 0);
-		normalButton
-				.setSelection((PriorityMarkerFieldFilter.PRIORITY_NORMAL & priorities) > 0);
-		highButton
-				.setSelection((PriorityMarkerFieldFilter.PRIORITY_HIGH & priorities) > 0);
-
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#getTitle()
-	 */
-	public String getTitle() {
-		return MarkerMessages.filtersDialog_priorityTitle;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/PriorityMarkerFieldFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/PriorityMarkerFieldFilter.java
deleted file mode 100644
index d64c38b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/PriorityMarkerFieldFilter.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.views.markers.MarkerFieldFilter;
-import org.eclipse.ui.views.markers.MarkerItem;
-import org.eclipse.ui.views.markers.internal.ProblemFilter;
-import org.eclipse.ui.views.markers.internal.TaskFilter;
-
-/**
- * PriorityMarkerFieldFilter is the field filter for priority in markers
- * 
- * @since 3.4
- * 
- */
-public class PriorityMarkerFieldFilter extends CompatibilityFieldFilter {
-
-	final static int PRIORITY_HIGH = 1 << IMarker.PRIORITY_HIGH;
-	final static int PRIORITY_NORMAL = 1 << IMarker.PRIORITY_NORMAL;
-	final static int PRIORITY_LOW = 1 << IMarker.PRIORITY_LOW;
-
-	private static final String TAG_SELECTED_PRIORITIES = "selectedPriorities"; //$NON-NLS-1$
-
-	int selectedPriorities = PRIORITY_HIGH + PRIORITY_LOW + PRIORITY_NORMAL;
-
-	/**
-	 * Create a new instance of the receiver
-	 */
-	public PriorityMarkerFieldFilter() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter#loadSettings(org.eclipse.ui.IMemento)
-	 */
-	public void loadSettings(IMemento memento) {
-		Integer priority = memento.getInteger(TAG_SELECTED_PRIORITIES);
-		if (priority == null)
-			return;
-		selectedPriorities = priority.intValue();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.CompatibilityFieldFilter#loadLegacySettings(org.eclipse.ui.IMemento, org.eclipse.ui.internal.views.markers.MarkerContentGenerator)
-	 */
-	void loadLegacySettings(IMemento memento, MarkerContentGenerator generator) {
-
-		String setting = memento.getString(TaskFilter.TAG_PRIORITY);
-
-		if (setting != null) {
-			try {
-				selectedPriorities = Integer.parseInt(setting);
-			} catch (NumberFormatException eNumberFormat) {
-			}
-		}
-		
-	
-		
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.CompatibilityFieldFilter#initialize(org.eclipse.ui.views.markers.internal.ProblemFilter)
-	 */
-	public void initialize(ProblemFilter problemFilter) {
-		//There is no problem filter support for priority
-		
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.MarkerFieldFilter#saveSettings(org.eclipse.ui.IMemento)
-	 */
-	public void saveSettings(IMemento memento) {
-		memento.putInteger(TAG_SELECTED_PRIORITIES, selectedPriorities);
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.MarkerFieldFilter#select(org.eclipse.ui.views.markers.MarkerItem)
-	 */
-	public boolean select(MarkerItem item) {
-
-		if (selectedPriorities == 0)
-			return true;
-		IMarker marker = item.getMarker();
-		if (marker == null)
-			return false;
-		int markerPriority = 1 << marker.getAttribute(IMarker.PRIORITY,
-				IMarker.PRIORITY_NORMAL);
-
-		switch (markerPriority) {
-		case PRIORITY_HIGH:
-			return (selectedPriorities & PRIORITY_HIGH) > 0;
-		case PRIORITY_NORMAL:
-			return (selectedPriorities & PRIORITY_NORMAL) > 0;
-		case PRIORITY_LOW:
-			return (selectedPriorities & PRIORITY_LOW) > 0;
-
-		default:
-			return true;
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.MarkerFieldFilter#populateWorkingCopy(org.eclipse.ui.views.markers.MarkerFieldFilter)
-	 */
-	public void populateWorkingCopy(MarkerFieldFilter copy) {
-		super.populateWorkingCopy(copy);
-		((PriorityMarkerFieldFilter)copy).selectedPriorities = selectedPriorities;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ProblemsSeverityAndDescriptionConfigurationArea.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ProblemsSeverityAndDescriptionConfigurationArea.java
deleted file mode 100644
index b6cc827..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ProblemsSeverityAndDescriptionConfigurationArea.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * {@link ProblemsSeverityAndDescriptionConfigurationArea} is the
- * configuration area for the problems view.
- * @since 3.4
- *
- */
-public class ProblemsSeverityAndDescriptionConfigurationArea extends
-		SeverityAndDescriptionConfigurationArea {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.DescriptionConfigurationArea#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createContents(Composite parent) {
-	
-		super.createContents(parent);
-		createSeverityGroup(parent);
-	
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ProblemsSeverityAndDescriptionFieldFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ProblemsSeverityAndDescriptionFieldFilter.java
deleted file mode 100644
index 5ed4c58..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ProblemsSeverityAndDescriptionFieldFilter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.views.markers.MarkerItem;
-import org.eclipse.ui.views.markers.internal.ProblemFilter;
-
-/**
- * ProblemsSeverityAndDescriptionFieldFilter is the filter used by the problems
- * view.
- * 
- * @since 3.4
- * 
- */
-public class ProblemsSeverityAndDescriptionFieldFilter extends
-		SeverityAndDescriptionFieldFilter {
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.DescriptionFieldFilter#select(org.eclipse.ui.views.markers.MarkerItem)
-	 */
-	public boolean select(MarkerItem item) {
-
-		IMarker marker = item.getMarker();
-		if (marker == null)
-			return false;
-
-		int markerSeverity = item.getAttributeValue(IMarker.SEVERITY, -1);
-		if (markerSeverity < 0)
-			return false;
-		if (checkSeverity(markerSeverity))
-			return super.select(item);
-		return false;
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.DescriptionFieldFilter#loadLegacySettings(org.eclipse.ui.IMemento, org.eclipse.ui.internal.views.markers.MarkerContentGenerator)
-	 */
-	void loadLegacySettings(IMemento memento, MarkerContentGenerator generator) {
-
-		super.loadLegacySettings(memento,generator);
-		Integer severitySetting = memento
-				.getInteger(ProblemFilter.TAG_SEVERITY);
-
-		if (severitySetting != null) {
-			selectedSeverities = severitySetting.intValue();
-		}
-
-	
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.DescriptionFieldFilter#initialize(org.eclipse.ui.views.markers.internal.ProblemFilter)
-	 */
-	public void initialize(ProblemFilter problemFilter) {
-		super.initialize(problemFilter);
-		if (problemFilter.getSeverity() > 0)
-			selectedSeverities = problemFilter.getSeverity();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ProblemsView.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ProblemsView.java
deleted file mode 100644
index 53e9cca..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ProblemsView.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.ui.views.markers.MarkerSupportView;
-import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
-
-/**
- * The ProblemsView is the view supplied by the ide to show
- * problems.
- * @since 3.4
- *
- */
-public class ProblemsView extends MarkerSupportView {
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public ProblemsView() {
-		super(MarkerSupportRegistry.PROBLEMS_GENERATOR);
-		
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/QuickFixHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/QuickFixHandler.java
deleted file mode 100644
index 49c0d32..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/QuickFixHandler.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
-import org.eclipse.ui.statushandlers.IStatusAdapterConstants;
-import org.eclipse.ui.statushandlers.StatusAdapter;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.views.markers.MarkerViewHandler;
-import org.eclipse.ui.views.markers.WorkbenchMarkerResolution;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * QuickFixHandler is the command handler for the quick fix dialog.
- * 
- * @since 3.4
- * 
- */
-public class QuickFixHandler extends MarkerViewHandler {
-
-	private class QuickFixWizardDialog extends WizardDialog {
-
-		/**
-		 * @param parentShell
-		 * @param newWizard
-		 */
-		public QuickFixWizardDialog(Shell parentShell, IWizard newWizard) {
-			super(parentShell, newWizard);
-			setShellStyle(SWT.CLOSE | SWT.MAX | SWT.TITLE | SWT.BORDER
-					| SWT.MODELESS | SWT.RESIZE | getDefaultOrientation());	
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-
-		final ExtendedMarkersView view = getView(event);
-		if (view == null)
-			return this;
-
-		final Map resolutions = new LinkedHashMap();
-		final IMarker selected = view.getSelectedMarkers()[0];
-
-		IRunnableWithProgress resolutionsRunnable = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor) {
-				monitor
-						.beginTask(
-								MarkerMessages.resolveMarkerAction_computationManyAction,
-								100);
-
-				IMarker[] allMarkers = view.getAllMarkers();
-				monitor.worked(20);
-				IMarkerResolution[] found = IDE.getMarkerHelpRegistry()
-						.getResolutions(selected);
-				int progressCount = 80;
-				if (found.length > 1)
-					progressCount = progressCount / found.length;
-				for (int i = 0; i < found.length; i++) {
-					IMarkerResolution markerResolution = found[i];
-					if (markerResolution instanceof WorkbenchMarkerResolution) {
-						IMarker[] other = ((WorkbenchMarkerResolution) markerResolution)
-								.findOtherMarkers(allMarkers);
-						Collection markers = new ArrayList();
-						markers.add(selected);
-						for (int j = 0; j < other.length; j++) {
-							markers.add(other[j]);
-						}
-						resolutions.put(markerResolution, markers);
-					} else {
-						Collection markers = new ArrayList();
-						markers.add(selected);
-						resolutions.put(markerResolution, markers);
-					}
-					monitor.worked(progressCount);
-				}
-				monitor.done();
-			}
-		};
-
-		Object service = view.getSite().getAdapter(
-				IWorkbenchSiteProgressService.class);
-
-		IRunnableContext context = new ProgressMonitorDialog(view.getSite()
-				.getShell());
-
-		try {
-			if (service == null) {
-				PlatformUI.getWorkbench().getProgressService().runInUI(context,
-						resolutionsRunnable, null);
-			} else {
-				((IWorkbenchSiteProgressService) service).runInUI(context,
-						resolutionsRunnable, null);
-			}
-		} catch (InvocationTargetException exception) {
-			throw new ExecutionException(exception.getLocalizedMessage(),
-					exception);
-		} catch (InterruptedException exception) {
-
-			throw new ExecutionException(exception.getLocalizedMessage(),
-					exception);
-		}
-
-		String markerDescription = selected.getAttribute(IMarker.MESSAGE,
-				MarkerSupportInternalUtilities.EMPTY_STRING);
-		if (resolutions.isEmpty()) {
-			Status newStatus = new Status(
-					IStatus.INFO,
-					IDEWorkbenchPlugin.IDE_WORKBENCH,
-					NLS
-							.bind(
-									MarkerMessages.MarkerResolutionDialog_NoResolutionsFound,
-									new Object[] { markerDescription }));
-			StatusAdapter adapter = new StatusAdapter(newStatus);
-			adapter.setProperty(IStatusAdapterConstants.TITLE_PROPERTY,
-					MarkerMessages.MarkerResolutionDialog_CannotFixTitle);
-			StatusManager.getManager().handle(adapter, StatusManager.SHOW);
-		} else {
-
-			String description = NLS.bind(
-					MarkerMessages.MarkerResolutionDialog_Description,
-					markerDescription);
-
-			Wizard wizard = new QuickFixWizard(description, resolutions, view
-					.getSite());
-			wizard.setWindowTitle(MarkerMessages.resolveMarkerAction_dialogTitle);
-			WizardDialog dialog = new QuickFixWizardDialog(view.getSite()
-					.getShell(), wizard);
-			dialog.open();
-		}
-		return this;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/QuickFixPage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/QuickFixPage.java
deleted file mode 100644
index 36ab0fc..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/QuickFixPage.java
+++ /dev/null
@@ -1,620 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Collection;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-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.ListViewer;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-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.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.views.markers.WorkbenchMarkerResolution;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-import org.eclipse.ui.views.markers.internal.Util;
-
-/**
- * QuickFixPage is a page for the quick fixes of a marker.
- * 
- * @since 3.4
- * 
- */
-public class QuickFixPage extends WizardPage {
-
-	private Map resolutions;
-	private ListViewer resolutionsList;
-	private CheckboxTableViewer markersTable;
-	private IWorkbenchPartSite site;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param problemDescription
-	 *            the description of the problem being fixed
-	 * @param resolutions
-	 *            {@link Map} with key of {@link IMarkerResolution} and value of
-	 *            {@link Collection} of {@link IMarker}
-	 * @param site
-	 *            The IWorkbenchPartSite to show markers
-	 */
-	public QuickFixPage(String problemDescription, Map resolutions,
-			IWorkbenchPartSite site) {
-		super(problemDescription);
-		this.resolutions = resolutions;
-		this.site = site;
-		setTitle(MarkerMessages.resolveMarkerAction_dialogTitle);
-		setMessage(problemDescription);
-	}
-
-	public void createControl(Composite parent) {
-
-		initializeDialogUnits(parent);
-
-		// Create a new composite as there is the title bar seperator
-		// to deal with
-		Composite control = new Composite(parent, SWT.NONE);
-		control.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		setControl(control);
-
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(control,
-				IWorkbenchHelpContextIds.PROBLEMS_VIEW);
-
-		FormLayout layout = new FormLayout();
-		layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
-		layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-		layout.spacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		control.setLayout(layout);
-
-		Label resolutionsLabel = new Label(control, SWT.NONE);
-		resolutionsLabel
-				.setText(MarkerMessages.MarkerResolutionDialog_Resolutions_List_Title);
-
-		resolutionsLabel.setLayoutData(new FormData());
-
-		createResolutionsList(control);
-
-		FormData listData = new FormData();
-		listData.top = new FormAttachment(resolutionsLabel, 0);
-		listData.left = new FormAttachment(0);
-		listData.right = new FormAttachment(100, 0);
-		listData.height = convertHeightInCharsToPixels(10);
-		resolutionsList.getControl().setLayoutData(listData);
-
-		Label title = new Label(control, SWT.NONE);
-		title
-				.setText(MarkerMessages.MarkerResolutionDialog_Problems_List_Title);
-		FormData labelData = new FormData();
-		labelData.top = new FormAttachment(resolutionsList.getControl(), 0);
-		labelData.left = new FormAttachment(0);
-		title.setLayoutData(labelData);
-
-		createMarkerTable(control);
-
-		Composite buttons = createTableButtons(control);
-		FormData buttonData = new FormData();
-		buttonData.top = new FormAttachment(title, 0);
-		buttonData.right = new FormAttachment(100);
-		buttonData.height = convertHeightInCharsToPixels(10);
-		buttons.setLayoutData(buttonData);
-
-		FormData tableData = new FormData();
-		tableData.top = new FormAttachment(buttons, 0, SWT.TOP);
-		tableData.left = new FormAttachment(0);
-		tableData.bottom = new FormAttachment(100);
-		tableData.right = new FormAttachment(buttons, 0);
-		tableData.height = convertHeightInCharsToPixels(10);
-		markersTable.getControl().setLayoutData(tableData);
-
-		Dialog.applyDialogFont(control);
-
-		resolutionsList.setSelection(new StructuredSelection(resolutionsList
-				.getElementAt(0)));
-
-		markersTable.setAllChecked(true);
-	}
-
-	/**
-	 * Create the table buttons for the receiver.
-	 * 
-	 * @param control
-	 * @return {@link Composite}
-	 */
-	private Composite createTableButtons(Composite control) {
-
-		Composite buttonComposite = new Composite(control, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
-		buttonComposite.setLayout(layout);
-
-		Button selectAll = new Button(buttonComposite, SWT.PUSH);
-		selectAll.setText(MarkerMessages.selectAllAction_title);
-		selectAll.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false));
-
-		selectAll.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent arg0) {
-				markersTable.setAllChecked(true);
-				setPageComplete(!resolutionsList.getSelection().isEmpty());
-			}
-		});
-
-		Button deselectAll = new Button(buttonComposite, SWT.PUSH);
-		deselectAll.setText(MarkerMessages.filtersDialog_deselectAll);
-		deselectAll
-				.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false));
-
-		deselectAll.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent arg0) {
-				markersTable.setAllChecked(false);
-				setPageComplete(false);
-			}
-		});
-
-		return buttonComposite;
-	}
-
-	/**
-	 * @param control
-	 */
-	private void createResolutionsList(Composite control) {
-		resolutionsList = new ListViewer(control, SWT.BORDER | SWT.SINGLE
-				| SWT.V_SCROLL);
-		resolutionsList.setContentProvider(new IStructuredContentProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				return resolutions.keySet().toArray();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-
-			}
-		});
-
-		resolutionsList.setLabelProvider(new LabelProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
-			 */
-			public String getText(Object element) {
-				return ((IMarkerResolution) element).getLabel();
-			}
-		});
-
-		resolutionsList.setInput(this);
-
-		resolutionsList.setComparator(new ViewerComparator() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public int compare(Viewer viewer, Object e1, Object e2) {
-				return ((IMarkerResolution) e1).getLabel().compareTo(
-						((IMarkerResolution) e1).getLabel());
-			}
-		});
-
-		resolutionsList
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-					 */
-					public void selectionChanged(SelectionChangedEvent event) {
-
-						markersTable.refresh();
-
-						IWorkbenchWindow window = PlatformUI.getWorkbench()
-								.getActiveWorkbenchWindow();
-						if (window == null)
-							return;
-						IWorkbenchPage page = window.getActivePage();
-						if (page == null)
-							return;
-
-					}
-
-				});
-	}
-
-	/**
-	 * Create the table that shows the markers.
-	 * 
-	 * @param control
-	 */
-	private void createMarkerTable(Composite control) {
-		markersTable = CheckboxTableViewer.newCheckList(control, SWT.BORDER
-				| SWT.V_SCROLL | SWT.SINGLE);
-
-		createTableColumns();
-
-		markersTable.setContentProvider(new IStructuredContentProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				IMarkerResolution selected = getSelectedResolution();
-				if (selected == null) {
-					return new Object[0];
-				}
-
-				if (resolutions.containsKey(selected)) {
-					return ((Collection) resolutions.get(selected)).toArray();
-				}
-				return MarkerSupportInternalUtilities.EMPTY_MARKER_ARRAY;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-
-			}
-		});
-
-		markersTable.setLabelProvider(new ITableLabelProvider() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object,
-			 *      int)
-			 */
-			public Image getColumnImage(Object element, int columnIndex) {
-				if (columnIndex == 0)
-					return Util.getImage(((IMarker) element).getAttribute(
-							IMarker.SEVERITY, -1));
-				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 Util.getResourceName((IMarker) element);
-				int line = ((IMarker) element).getAttribute(
-						IMarker.LINE_NUMBER, -1);
-				if (line < 0) {
-					return MarkerMessages.Unknown;
-				}
-				return NLS.bind(MarkerMessages.label_lineNumber, Integer
-						.toString(line));
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-			 */
-			public void addListener(ILabelProviderListener listener) {
-				// do nothing
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-			 */
-			public void dispose() {
-				// do nothing
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
-			 *      java.lang.String)
-			 */
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-			 */
-			public void removeListener(ILabelProviderListener listener) {
-				// do nothing
-
-			}
-		});
-
-		markersTable.addCheckStateListener(new ICheckStateListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
-			 */
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				if (event.getChecked() == true) {
-					setPageComplete(true);
-				} else {
-					setPageComplete(markersTable.getCheckedElements().length > 0);
-				}
-
-			}
-		});
-
-		markersTable
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-					 */
-					public void selectionChanged(SelectionChangedEvent event) {
-
-						if (event.getSelection().isEmpty())
-							return;
-						IMarker marker = (IMarker) ((IStructuredSelection) event
-								.getSelection()).getFirstElement();
-						ExtendedMarkersView.openMarkerInEditor(marker, site
-								.getPage());
-
-					}
-				});
-
-		markersTable.setInput(this);
-	}
-
-	/**
-	 * Create the table columns for the receiver.
-	 */
-	private void createTableColumns() {
-		TableLayout layout = new TableLayout();
-
-		Table table = markersTable.getTable();
-		table.setLayout(layout);
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-
-		layout.addColumnData(new ColumnWeightData(70, true));
-		TableColumn tc = new TableColumn(table, SWT.NONE, 0);
-		tc
-				.setText(MarkerMessages.MarkerResolutionDialog_Problems_List_Location);
-		layout.addColumnData(new ColumnWeightData(30, true));
-		tc = new TableColumn(table, SWT.NONE, 0);
-		tc
-				.setText(MarkerMessages.MarkerResolutionDialog_Problems_List_Resource);
-
-	}
-
-	/**
-	 * Return the marker being edited.
-	 * 
-	 * @return IMarker or <code>null</code>
-	 */
-	public IMarker getSelectedMarker() {
-		ISelection selection = markersTable.getSelection();
-		if (!selection.isEmpty() && selection instanceof IStructuredSelection) {
-			IStructuredSelection struct = (IStructuredSelection) selection;
-			if (struct.size() == 1)
-				return (IMarker) struct.getFirstElement();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		return true;
-	}
-
-	/**
-	 * Finish has been pressed. Process the resolutions. monitor the monitor to
-	 * report to.
-	 */
-	/**
-	 * @param monitor
-	 */
-	/**
-	 * @param monitor
-	 */
-	void performFinish(IProgressMonitor monitor) {
-
-		final IMarkerResolution resolution = getSelectedResolution();
-		if (resolution == null)
-			return;
-
-		final Object[] checked = markersTable.getCheckedElements();
-		if (checked.length == 0)
-			return;
-
-		if (resolution instanceof WorkbenchMarkerResolution) {
-
-			try {
-				getWizard().getContainer().run(false, true,
-						new IRunnableWithProgress() {
-							/*
-							 * (non-Javadoc)
-							 * 
-							 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
-							 */
-							public void run(IProgressMonitor monitor) {
-								IMarker[] markers = new IMarker[checked.length];
-								System.arraycopy(checked, 0, markers, 0,
-										checked.length);
-								((WorkbenchMarkerResolution) resolution).run(
-										markers, monitor);
-							}
-
-						});
-			} catch (InvocationTargetException e) {
-				StatusManager.getManager().handle(
-						MarkerSupportInternalUtilities.errorFor(e));
-			} catch (InterruptedException e) {
-				StatusManager.getManager().handle(
-						MarkerSupportInternalUtilities.errorFor(e));
-			}
-
-		} else {
-
-			try {
-				getWizard().getContainer().run(false, true,
-						new IRunnableWithProgress() {
-							/*
-							 * (non-Javadoc)
-							 * 
-							 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
-							 */
-							public void run(IProgressMonitor monitor) {
-								monitor
-										.beginTask(
-												MarkerMessages.MarkerResolutionDialog_Fixing,
-												checked.length);
-								for (int i = 0; i < checked.length; i++) {
-									// Allow paint events and wake up the button
-									getShell().getDisplay().readAndDispatch();
-									if (monitor.isCanceled())
-										return;
-									IMarker marker = (IMarker) checked[i];
-									monitor.subTask(Util.getProperty(
-											IMarker.MESSAGE, marker));
-									resolution.run(marker);
-									monitor.worked(1);
-								}
-							}
-
-						});
-			} catch (InvocationTargetException e) {
-				StatusManager.getManager().handle(
-						MarkerSupportInternalUtilities.errorFor(e));
-			} catch (InterruptedException e) {
-				StatusManager.getManager().handle(
-						MarkerSupportInternalUtilities.errorFor(e));
-			}
-
-		}
-
-	}
-
-	/**
-	 * Return the marker resolution that is currently selected/
-	 * 
-	 * @return IMarkerResolution or <code>null</code> if there is no
-	 *         selection.
-	 */
-	private IMarkerResolution getSelectedResolution() {
-		ISelection selection = resolutionsList.getSelection();
-		if (!(selection instanceof IStructuredSelection)) {
-			return null;
-		}
-
-		Object first = ((IStructuredSelection) selection).getFirstElement();
-
-		return (IMarkerResolution) first;
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/QuickFixPropertyTester.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/QuickFixPropertyTester.java
deleted file mode 100644
index a27296f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/QuickFixPropertyTester.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.ui.ide.IDE;
-
-/**
- * QuickFixPropertyTester is the property tester for the quick fix object.
- * 
- * @since 3.4
- * 
- */
-public class QuickFixPropertyTester extends PropertyTester {
-
-	private static final String QUICK_FIX = "quickFix"; //$NON-NLS-1$
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public QuickFixPropertyTester() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object)
-	 */
-	public boolean test(Object receiver, String property, Object[] args,
-			Object expectedValue) {
-		if (property.equals(QUICK_FIX))
-			return IDE.getMarkerHelpRegistry().hasResolutions(
-					((MarkerEntry) receiver).getMarker());
-		return false;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/QuickFixWizard.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/QuickFixWizard.java
deleted file mode 100644
index 26bb848..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/QuickFixWizard.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.ui.internal.ide.StatusUtil;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * QuickFixWizard is the wizard for quick fixes.
- * 
- * @since 3.4
- * 
- */
-class QuickFixWizard extends Wizard {
-
-	private Map resolutionMap;
-	private String description;
-	private IWorkbenchPartSite partSite;
-
-	/**
-	 * Create the wizard with the map of resolutions.
-	 * 
-	 * @param description the description of the problem
-	 * @param resolutions
-	 *            Map key {@link IMarkerResolution} value {@link IMarker} []
-	 * @param site the {@link IWorkbenchPartSite} to open the markers in
-	 */
-	public QuickFixWizard(String description,Map resolutions, IWorkbenchPartSite site) {
-		super();
-		this.resolutionMap = resolutions;
-		this.description = description;
-		partSite = site;
-		setDefaultPageImageDescriptor(IDEInternalWorkbenchImages
-				.getImageDescriptor(IDEInternalWorkbenchImages.IMG_DLGBAN_QUICKFIX_DLG));
-		setNeedsProgressMonitor(true);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		super.addPages();
-		addPage(new QuickFixPage(description,resolutionMap,partSite));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() {
-		IRunnableWithProgress finishRunnable = new IRunnableWithProgress() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
-			 */
-			public void run(IProgressMonitor monitor)
-				 {
-				IWizardPage[] pages = getPages();
-				monitor.beginTask(MarkerMessages.MarkerResolutionDialog_Fixing,
-						(10 * pages.length) + 1);
-				monitor.worked(1);
-				for (int i = 0; i < pages.length; i++) {
-					//Allow for cancel event processing
-					getShell().getDisplay().readAndDispatch();
-					if(monitor.isCanceled())
-						return;
-					QuickFixPage wizardPage = (QuickFixPage) pages[i];
-					wizardPage.performFinish(new SubProgressMonitor(monitor,10));
-					monitor.worked(1);
-				}
-				monitor.done();
-
-			}
-		};
-
-		try {
-			getContainer().run(false, true, finishRunnable);
-		} catch (InvocationTargetException e) {
-			StatusManager.getManager().handle(
-					StatusUtil.newStatus(IStatus.ERROR,
-							e.getLocalizedMessage(), e));
-			return false;
-		} catch (InterruptedException e) {
-			StatusManager.getManager().handle(
-					StatusUtil.newStatus(IStatus.ERROR,
-							e.getLocalizedMessage(), e));
-			return false;
-		}
-
-		return true;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ScopeArea.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ScopeArea.java
deleted file mode 100644
index 025c425..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ScopeArea.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
-import org.eclipse.ui.views.markers.MarkerFieldFilter;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * ScopeArea is the filter configuration area that handles the scope of the
- * filter.
- * 
- * @since 3.4
- * 
- */
-class ScopeArea extends GroupFilterConfigurationArea {
-
-	private Button[] buttons;
-	int scope;
-	private WorkingSetArea workingSetArea;
-
-	private class WorkingSetArea {
-
-		Button button;
-		Button selectButton;
-
-		/**
-		 * Creates the working set filter selection widgets.
-		 * 
-		 * @param parent
-		 *            the parent composite of the working set widgets
-		 */
-		WorkingSetArea(Composite parent) {
-			
-			
-			// radio button has to be part of main radio button group
-			button = createRadioButton(parent,
-					MarkerMessages.filtersDialog_noWorkingSet,
-					MarkerFieldFilterGroup.ON_WORKING_SET);
-			GridData data = new GridData(GridData.FILL_HORIZONTAL);
-			button.setLayoutData(data);
-
-			// Composite composite = new Composite(parent, SWT.NONE);
-			// composite.setFont(parent.getFont());
-			// GridLayout layout = new GridLayout();
-			// Button radio = new Button(parent, SWT.RADIO);
-			// layout.marginWidth = radio.computeSize(SWT.DEFAULT,
-			// SWT.DEFAULT).x;
-			// layout.marginHeight = 0;
-			// radio.dispose();
-			// composite.setLayout(layout);
-			selectButton = new Button(parent, SWT.PUSH);
-			selectButton.setText(MarkerMessages.filtersDialog_workingSetSelect);
-			
-			initializeFontMetrics(parent);
-			GridData layoutData = new GridData();
-			layoutData.horizontalIndent = IDialogConstants.INDENT;
-			int widthHint = Dialog.convertHorizontalDLUsToPixels(getFontMetrics(),IDialogConstants.BUTTON_WIDTH);
-			Point minSize = selectButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-			layoutData.widthHint = Math.max(widthHint, minSize.x);
-			
-			selectButton.setLayoutData(layoutData);
-			selectButton.addSelectionListener(new SelectionAdapter() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-				 */
-				public void widgetSelected(SelectionEvent e) {
-
-					IWorkingSetSelectionDialog dialog = PlatformUI
-							.getWorkbench().getWorkingSetManager()
-							.createWorkingSetSelectionDialog(button.getShell(),
-									false);
-					IWorkingSet workingSet = getWorkingSet();
-
-					if (workingSet != null) {
-						dialog.setSelection(new IWorkingSet[] { workingSet });
-					}
-					if (dialog.open() == Window.OK) {
-						IWorkingSet[] result = dialog.getSelection();
-						if (result != null && result.length > 0) {
-							setWorkingSet(result[0]);
-						} else {
-							setWorkingSet(null);
-						}
-						if (getSelection() == false) {
-							setSelection(true);
-						}
-					}
-
-				}
-			});
-			
-			
-
-		}
-
-		/**
-		 * Returns wether or not a working set filter should be used
-		 * 
-		 * @return true=a working set filter should be used false=a working set
-		 *         filter should not be used
-		 */
-		boolean getSelection() {
-			return button.getSelection();
-		}
-
-		/**
-		 * Returns the selected working set filter or null if none is selected.
-		 * 
-		 * @return the selected working set filter or null if none is selected.
-		 */
-		IWorkingSet getWorkingSet() {
-			return (IWorkingSet) button.getData();
-		}
-
-		/**
-		 * Sets the working set filter selection.
-		 * 
-		 * @param selected
-		 *            true=a working set filter should be used false=no working
-		 *            set filter should be used
-		 */
-		void setSelection(boolean selected) {
-			button.setSelection(selected);
-		}
-
-		/**
-		 * Opens the working set selection dialog.
-		 */
-		void selectPressed() {
-			IWorkingSetSelectionDialog dialog = PlatformUI.getWorkbench()
-					.getWorkingSetManager().createWorkingSetSelectionDialog(
-							button.getShell(), false);
-			IWorkingSet workingSet = getWorkingSet();
-
-			if (workingSet != null) {
-				dialog.setSelection(new IWorkingSet[] { workingSet });
-			}
-			if (dialog.open() == Window.OK) {
-				IWorkingSet[] result = dialog.getSelection();
-				if (result != null && result.length > 0) {
-					setWorkingSet(result[0]);
-				} else {
-					setWorkingSet(null);
-				}
-				if (getSelection() == false) {
-					setSelection(true);
-				}
-			}
-		}
-
-		/**
-		 * Sets the specified working set.
-		 * 
-		 * @param workingSet
-		 *            the working set
-		 */
-		void setWorkingSet(IWorkingSet workingSet) {
-			button.setData(workingSet);
-			if (workingSet != null) {
-				button.setText(NLS.bind(
-						MarkerMessages.filtersDialog_workingSet, workingSet
-								.getLabel()));
-			} else {
-				button.setText(MarkerMessages.filtersDialog_noWorkingSet);
-			}
-		}
-
-		void setEnabled(boolean enabled) {
-			button.setEnabled(enabled);
-			selectButton.setEnabled(enabled);
-		}
-
-		/**
-		 * Return the radio button for the receiver.
-		 * @return Button
-		 */
-		Button getRadioButton() {
-			return button;
-		}
-
-	}
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public ScopeArea() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.FilterConfigurationArea#applyToGroup(org.eclipse.ui.internal.provisional.views.markers.MarkerFieldFilterGroup)
-	 */
-	public void applyToGroup(MarkerFieldFilterGroup group) {
-		group.setScope(scope);
-		group.setWorkingSet(workingSetArea.getWorkingSet());
-		
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.FilterConfigurationArea#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createContents(Composite parent) {
-
-		buttons = new Button[5];
-
-		buttons[MarkerFieldFilterGroup.ON_ANY] = createRadioButton(parent,
-				MarkerMessages.filtersDialog_anyResource,
-				MarkerFieldFilterGroup.ON_ANY);
-		buttons[MarkerFieldFilterGroup.ON_ANY_IN_SAME_CONTAINER] = createRadioButton(
-				parent, MarkerMessages.filtersDialog_anyResourceInSameProject,
-				MarkerFieldFilterGroup.ON_ANY_IN_SAME_CONTAINER);
-		buttons[MarkerFieldFilterGroup.ON_SELECTED_ONLY] = createRadioButton(
-				parent, MarkerMessages.filtersDialog_selectedResource,
-				MarkerFieldFilterGroup.ON_SELECTED_ONLY);
-		buttons[MarkerFieldFilterGroup.ON_SELECTED_AND_CHILDREN] = createRadioButton(
-				parent, MarkerMessages.filtersDialog_selectedAndChildren,
-				MarkerFieldFilterGroup.ON_SELECTED_AND_CHILDREN);
-		workingSetArea = new WorkingSetArea(parent);
-		buttons[MarkerFieldFilterGroup.ON_WORKING_SET] = workingSetArea.getRadioButton();
-	}
-
-	/**
-	 * Creates a radio button with the given parent and text.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the check box
-	 * @return the radio box button
-	 */
-	protected Button createRadioButton(Composite parent, String text,
-			final int value) {
-		Button button = new Button(parent, SWT.RADIO);
-		button.setText(text);
-		button.setSelection(value == scope);
-		button.addSelectionListener(new SelectionAdapter() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				scope = value;
-			}
-		});
-		return button;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.FilterConfigurationArea#getTitle()
-	 */
-	public String getTitle() {
-		return MarkerMessages.filtersDialog_scopeTitle;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.FilterConfigurationArea#initializeFromGroup(org.eclipse.ui.internal.provisional.views.markers.MarkerFieldFilterGroup)
-	 */
-	public void initializeFromGroup(MarkerFieldFilterGroup group) {
-		buttons[scope].setSelection(false);
-		scope = group.getScope();
-		buttons[scope].setSelection(true);
-		workingSetArea.setWorkingSet(group.getWorkingSet());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#apply(org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter)
-	 */
-	public void apply(MarkerFieldFilter filter) {
-		// Do nothing as this is a group level setting
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#initialize(org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter)
-	 */
-	public void initialize(MarkerFieldFilter filter) {
-		// Do nothing as this is a group level setting
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/SelectedWarningsParameters.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/SelectedWarningsParameters.java
deleted file mode 100644
index 96bb889..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/SelectedWarningsParameters.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ui.views.markers.FiltersContributionParameters;
-
-/**
- * SelectedWarningsParameters is the parameters for warnings.
- * 
- * @since 3.4
- * 
- */
-public class SelectedWarningsParameters extends FiltersContributionParameters {
-
-	private static Map warningsMap;
-	static {
-		warningsMap = new HashMap();
-		warningsMap.put(IMarker.SEVERITY, new Integer(
-				SeverityAndDescriptionFieldFilter.SEVERITY_WARNING));
-	}
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public SelectedWarningsParameters() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.FiltersContributionParameters#getParameterValues()
-	 */
-	public Map getParameterValues() {
-		return warningsMap;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/SeverityAndDescriptionConfigurationArea.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/SeverityAndDescriptionConfigurationArea.java
deleted file mode 100644
index 508b7a0..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/SeverityAndDescriptionConfigurationArea.java
+++ /dev/null
@@ -1,174 +0,0 @@
-package org.eclipse.ui.internal.views.markers;
-
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.dialogs.IDialogConstants;
-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.views.markers.MarkerFieldFilter;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * SeverityAndDescriptionConfigurationArea is the configuration area for the
- * severity and description field.
- * 
- * @since 3.4
- * 
- */
-public class SeverityAndDescriptionConfigurationArea extends
-		DescriptionConfigurationArea {
-
-	private int severities;
-	private Button infoButton;
-	private Button errorButton;
-	private Button warningButton;
-	private Label label;
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public SeverityAndDescriptionConfigurationArea() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#apply(org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter)
-	 */
-	public void apply(MarkerFieldFilter filter) {
-		super.apply(filter);
-		((SeverityAndDescriptionFieldFilter) filter).selectedSeverities = severities;
-
-	}
-
-	/**
-	 * Create a group for the severity selection.
-	 * 
-	 * @param parent
-	 * @return {@link Composite}
-	 */
-	Composite createSeverityGroup(Composite parent) {
-
-		Composite severityComposite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout(4, false);
-		layout.horizontalSpacing = IDialogConstants.BUTTON_MARGIN;
-		severityComposite.setLayout(layout);
-		severityComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.GRAB_HORIZONTAL));
-
-		label = new Label(severityComposite, SWT.NONE);
-		label.setText(MarkerMessages.filtersDialog_severityLabel);
-
-		errorButton = new Button(severityComposite, SWT.CHECK);
-		errorButton.setText(MarkerMessages.filtersDialog_severityError);
-		errorButton.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				updateSeverities(
-						SeverityAndDescriptionFieldFilter.SEVERITY_ERROR,
-						errorButton.getSelection());
-			}
-		});
-		GridData data = new GridData();
-		data.horizontalIndent = IDialogConstants.BUTTON_MARGIN;
-		errorButton.setLayoutData(data);
-
-		warningButton = new Button(severityComposite, SWT.CHECK);
-		warningButton.setText(MarkerMessages.filtersDialog_severityWarning);
-		warningButton.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				updateSeverities(
-						SeverityAndDescriptionFieldFilter.SEVERITY_WARNING,
-						warningButton.getSelection());
-			}
-		});
-
-		infoButton = new Button(severityComposite, SWT.CHECK);
-		infoButton.setText(MarkerMessages.filtersDialog_severityInfo);
-		infoButton.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				updateSeverities(
-						SeverityAndDescriptionFieldFilter.SEVERITY_INFO,
-						infoButton.getSelection());
-			}
-		});
-		return severityComposite;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#initialize(org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter)
-	 */
-	public void initialize(MarkerFieldFilter filter) {
-		super.initialize(filter);
-		SeverityAndDescriptionFieldFilter sevFilter = (SeverityAndDescriptionFieldFilter) filter;
-
-		severities = sevFilter.selectedSeverities;
-		infoButton
-				.setSelection((SeverityAndDescriptionFieldFilter.SEVERITY_INFO & severities) > 0);
-		warningButton
-				.setSelection((SeverityAndDescriptionFieldFilter.SEVERITY_WARNING & severities) > 0);
-		errorButton
-				.setSelection((SeverityAndDescriptionFieldFilter.SEVERITY_ERROR & severities) > 0);
-	}
-
-	/**
-	 * Set or clear the flag for the constant based on the enablement.
-	 * 
-	 * @param constant
-	 *            one of {@link IMarker#SEVERITY_ERROR},{@link IMarker#SEVERITY_WARNING},{@link IMarker#SEVERITY_INFO}
-	 * @param enabled
-	 */
-	private void updateSeverities(int constant, boolean enabled) {
-		if (enabled)
-			severities = constant | severities;
-		else
-			severities = constant ^ severities;
-
-	}
-
-	/**
-	 * Set the enabled state of the severity buttons.
-	 * 
-	 * @param enabled
-	 */
-	void setSeverityButtonsEnabled(boolean enabled) {
-		label.setEnabled(enabled);
-		errorButton.setEnabled(enabled);
-		infoButton.setEnabled(enabled);
-		warningButton.setEnabled(enabled);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/SeverityAndDescriptionFieldFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/SeverityAndDescriptionFieldFilter.java
deleted file mode 100644
index 1a383d6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/SeverityAndDescriptionFieldFilter.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.views.markers.MarkerFieldFilter;
-
-/**
- * SeverityAndDescriptionFieldFilter is the filter for the severity and
- * description field.
- * 
- * @since 3.4
- * 
- */
-public abstract class SeverityAndDescriptionFieldFilter extends DescriptionFieldFilter {
-
-	final static int SEVERITY_ERROR = 1 << IMarker.SEVERITY_ERROR;
-	final static int SEVERITY_WARNING = 1 << IMarker.SEVERITY_WARNING;
-	final static int SEVERITY_INFO = 1 << IMarker.SEVERITY_INFO;
-	protected int selectedSeverities = SEVERITY_ERROR + SEVERITY_WARNING + SEVERITY_INFO;
-	private static final String TAG_SELECTED_SEVERITIES = "selectedSeverities"; //$NON-NLS-1$
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public SeverityAndDescriptionFieldFilter() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerFieldFilter#initialize(java.util.Map)
-	 */
-	public void initialize(Map values) {
-		Object value = values.get(IMarker.SEVERITY);
-		if (value != null && value instanceof Integer) {
-			selectedSeverities = ((Integer) value).intValue();
-		}
-		Object modifier = values
-				.get(MarkerSupportInternalUtilities.CONTAINS_MODIFIER_TOKEN);
-		if (modifier != null && modifier instanceof String)
-			containsModifier = (String) modifier;
-
-		Object text = values
-				.get(MarkerSupportInternalUtilities.CONTAINS_TEXT_TOKEN);
-		if (text != null && text instanceof String)
-			containsText = (String) text;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerFieldFilter#populateWorkingCopy(org.eclipse.ui.internal.provisional.views.markers.MarkerFieldFilter)
-	 */
-	public void populateWorkingCopy(MarkerFieldFilter copy) {
-		super.populateWorkingCopy(copy);
-		((SeverityAndDescriptionFieldFilter) copy).selectedSeverities = this.selectedSeverities;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerFieldFilter#saveSettings(org.eclipse.ui.IMemento)
-	 */
-	public void saveSettings(IMemento memento) {
-		super.saveSettings(memento);
-		memento.putInteger(TAG_SELECTED_SEVERITIES, selectedSeverities);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.MarkerFieldFilter#loadSettings(org.eclipse.ui.IMemento)
-	 */
-	public void loadSettings(IMemento memento) {
-		super.loadSettings(memento);
-		selectedSeverities = memento.getInteger(TAG_SELECTED_SEVERITIES)
-				.intValue();
-	}
-
-	/**
-	 * Compare the selected severity and the severity of the marker to see if
-	 * they match
-	 * 
-	 * @param markerSeverity
-	 */
-	protected boolean checkSeverity(int markerSeverity) {
-		// Convert from the marker to the filter
-		return (1 << markerSeverity & selectedSeverities) > 0;
-	
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/SortFieldContribution.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/SortFieldContribution.java
deleted file mode 100644
index 86c323c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/SortFieldContribution.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-
-/**
- * SortFieldContribution is the contribution that allows the user to choose
- * which field will become the primary sort field.
- * 
- * @since 3.4
- * 
- */
-public class SortFieldContribution extends MarkersContribution {
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public SortFieldContribution() {
-		super();
-	}
-
-	/**
-	 * @param id
-	 */
-	public SortFieldContribution(String id) {
-		super(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
-	 */
-	protected IContributionItem[] getContributionItems() {
-
-		MarkerField[] fields = getView().getVisibleFields();
-
-		if (fields.length == 0)
-			return new IContributionItem[0];
-
-		IContributionItem[] items = new IContributionItem[fields.length + 2];
-
-		for (int i = 0; i < fields.length; i++) {
-			items[i] = getContributionItem(fields[i]);
-		}
-
-		items[fields.length] = new Separator();
-		items[fields.length + 1] = getDirectionContribution();
-
-		return items;
-
-	}
-
-	/**
-	 * Return the ascending/descending contriution.
-	 * @return IContributionItem
-	 */
-	private IContributionItem getDirectionContribution() {
-		return new ContributionItem() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Menu,
-			 *      int)
-			 */
-			public void fill(Menu menu, int index) {
-				MenuItem item = new MenuItem(menu, SWT.CHECK);
-				item.setText(MarkerMessages.sortDirectionAscending_text);
-				final ExtendedMarkersView view = getView();
-				item.addListener(SWT.Selection, new Listener() {
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-					 */
-					public void handleEvent(Event event) {
-
-						if (view != null)
-							view.toggleSortDirection();
-					}
-				});
-
-				if (view != null)
-					item.setSelection(view.getSortAscending());
-
-			}
-
-		};
-	}
-
-	/**
-	 * Return the IContributionItem for field.
-	 * 
-	 * @param field
-	 * @return IContributionItem
-	 */
-	private IContributionItem getContributionItem(final MarkerField field) {
-		return new ContributionItem() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Menu,
-			 *      int)
-			 */
-			public void fill(Menu menu, int index) {
-				MenuItem item = new MenuItem(menu, SWT.RADIO);
-				String title = field.getColumnHeaderText();
-				if (title.length() == 0)
-					title = field.getColumnTooltipText();
-				item.setText(title);
-				ExtendedMarkersView view = getView();
-				item.addListener(SWT.Selection,
-						getMenuItemListener(field, view));
-
-				if (view != null)
-					item.setSelection(view.isPrimarySortField(field));
-
-			}
-
-			/**
-			 * Return the menu item listener for selection of a field.
-			 * 
-			 * @param field
-			 * @param view
-			 * @return Listener
-			 */
-			private Listener getMenuItemListener(final MarkerField field,
-					final ExtendedMarkersView view) {
-				return new Listener() {
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-					 */
-					public void handleEvent(Event event) {
-
-						MenuItem item = (MenuItem) event.widget;
-
-						if (item.getSelection() && view != null)
-							view.setPrimarySortField(field);
-					}
-				};
-			}
-		};
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/TasksView.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/TasksView.java
deleted file mode 100644
index 9e47707..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/TasksView.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.ui.views.markers.MarkerSupportView;
-import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
-
-/**
- * TasksView is the ide view for showing tasks.
- * @since 3.4
- *
- */
-public class TasksView extends MarkerSupportView {
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public TasksView() {
-		super(MarkerSupportRegistry.TASKS_GENERATOR);
-		
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/TodoFiltersContributionParameters.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/TodoFiltersContributionParameters.java
deleted file mode 100644
index e6d4c3a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/TodoFiltersContributionParameters.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.eclipse.ui.internal.views.markers;
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.ui.views.markers.FiltersContributionParameters;
-import org.eclipse.ui.views.markers.MarkerSupportConstants;
-
-/**
- * TodoFiltersContributionParameters is the filter to just show TODOs.
- * @since 3.4
- *
- */
-public class TodoFiltersContributionParameters extends
-		FiltersContributionParameters {
-	
-	private static Map todoMap;
-	static {
-		todoMap = new HashMap();
-		todoMap.put(MarkerSupportConstants.CONTAINS_KEY, "TODO"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Return a new instance of the receiver.
-	 */
-	public TodoFiltersContributionParameters() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FiltersContributionParameters#getParameterValues()
-	 */
-	public Map getParameterValues() {
-		return todoMap;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/TypeFieldGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/TypeFieldGroup.java
deleted file mode 100644
index dcfc170..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/TypeFieldGroup.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.views.markers.internal.AbstractField;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-import org.eclipse.ui.views.markers.internal.MarkerType;
-import org.eclipse.ui.views.markers.internal.MarkerTypesModel;
-import org.eclipse.ui.views.markers.internal.TableComparator;
-
-/**
- * TypeFieldGroup is the field used to group by type.
- * 
- * @since 3.3
- * 
- */
-public class TypeFieldGroup extends AbstractField {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDescription()
-	 */
-	public String getDescription() {
-		return MarkerMessages.description_type;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDescriptionImage()
-	 */
-	public Image getDescriptionImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderText()
-	 */
-	public String getColumnHeaderText() {
-		return getDescription();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderImage()
-	 */
-	public Image getColumnHeaderImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getValue(java.lang.Object)
-	 */
-	public String getValue(Object obj) {
-
-		String typeId;
-		try {
-			typeId = ((IMarker) obj).getType();
-		} catch (CoreException e) {
-			Policy.handle(e);
-			return MarkerMessages.FieldCategory_Uncategorized;
-		}
-		MarkerType type = MarkerTypesModel.getInstance().getType(typeId);
-		return type.getLabel();
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object obj) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public int compare(Object obj1, Object obj2) {
-		return getValue(obj1).compareTo(getValue(obj2));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDefaultDirection()
-	 */
-	public int getDefaultDirection() {
-		return TableComparator.ASCENDING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getPreferredWidth()
-	 */
-	public int getPreferredWidth() {
-		return 200;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/TypesConfigurationArea.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/TypesConfigurationArea.java
deleted file mode 100644
index 82b6635..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/TypesConfigurationArea.java
+++ /dev/null
@@ -1,634 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.views.markers;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-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.Composite;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.ui.views.markers.MarkerFieldFilter;
-import org.eclipse.ui.views.markers.internal.MarkerMessages;
-import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
-import org.eclipse.ui.views.markers.internal.MarkerType;
-
-/**
- * TypesConfigurationArea is the FilterConfigurationArea that handles type
- * selection for the filter.
- * 
- * @since 3.4
- * 
- */
-public class TypesConfigurationArea extends GroupFilterConfigurationArea {
-
-	private class CategoryEntry extends TypesEntry {
-
-		private Collection children = new ArrayList();
-		private String name;
-
-		/**
-		 * Create a new instance of the receiver.
-		 * 
-		 * @param categoryName
-		 */
-		public CategoryEntry(String categoryName) {
-			name = categoryName;
-		}
-
-		/**
-		 * Add the node to the receiver.
-		 * 
-		 * @param node
-		 */
-		public void add(MarkerTypeEntry node) {
-			children.add(node);
-			node.setParent(this);
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.provisional.views.markers.TypesConfigurationArea.TypesEntry#addElementsMatching(java.util.Collection,
-		 *      java.util.Collection)
-		 */
-		public void addElementsMatching(Collection selectedTypes,
-				Collection entries) {
-			Iterator childIterator = children.iterator();
-			while (childIterator.hasNext()) {
-				((MarkerTypeEntry) childIterator.next()).addElementsMatching(
-						selectedTypes, entries);
-			}
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.provisional.views.markers.TypesConfigurationArea.TypesEntry#getChildren()
-		 */
-		public Collection getChildren() {
-			return children;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.provisional.views.markers.TypesConfigurationArea.TypesEntry#getLabel()
-		 */
-		public String getLabel() {
-			return name;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.provisional.views.markers.TypesConfigurationArea.TypesEntry#getParent()
-		 */
-		public TypesEntry getParent() {
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.provisional.views.markers.TypesConfigurationArea.TypesEntry#hasChildren()
-		 */
-		public boolean hasChildren() {
-			return children.size() > 0;
-		}
-
-	}
-
-	private class MarkerTypeEntry extends TypesEntry {
-
-		private CategoryEntry category;
-		private MarkerType markerType;
-
-		/**
-		 * Create an instance of the receiver.
-		 * 
-		 * @param markerType
-		 */
-		public MarkerTypeEntry(MarkerType markerType) {
-			this.markerType = markerType;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.provisional.views.markers.TypesConfigurationArea.TypesEntry#addElementsMatching(java.util.Collection,
-		 *      java.util.Collection)
-		 */
-		public void addElementsMatching(Collection selectedTypes,
-				Collection entries) {
-			if (selectedTypes.contains(markerType))
-				entries.add(this);
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.provisional.views.markers.TypesConfigurationArea.TypesEntry#getChildren()
-		 */
-		public Collection getChildren() {
-			return EMPTY_COLLECTION;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.provisional.views.markers.TypesConfigurationArea.TypesEntry#getLabel()
-		 */
-		public String getLabel() {
-			return markerType.getLabel();
-		}
-
-		/**
-		 * Return the marker type for the receiver.
-		 * 
-		 * @return MarkerType
-		 */
-		public MarkerType getMarkerType() {
-			return markerType;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.provisional.views.markers.TypesConfigurationArea.TypesEntry#getParent()
-		 */
-		public TypesEntry getParent() {
-			return category;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.provisional.views.markers.TypesConfigurationArea.TypesEntry#hasChildren()
-		 */
-		public boolean hasChildren() {
-			return false;
-		}
-
-		/**
-		 * Set the category of the receiver.
-		 * 
-		 * @param categoryEntry
-		 */
-		public void setParent(CategoryEntry categoryEntry) {
-			category = categoryEntry;
-
-		}
-
-	}
-
-	private abstract class TypesEntry {
-
-		/**
-		 * Add any elements that contain a type in selectedTypes tp entries.
-		 * 
-		 * @param selectedTypes
-		 * @param entries
-		 */
-		public abstract void addElementsMatching(Collection selectedTypes,
-				Collection entries);
-
-		/**
-		 * Return the children of the receiver.
-		 * 
-		 * @return TypesEntry[]
-		 */
-		public abstract Collection getChildren();
-
-		/**
-		 * Return the label for the receiver.
-		 * 
-		 * @return String
-		 */
-		public abstract String getLabel();
-
-		/**
-		 * Return the parent of the receiver.
-		 * 
-		 * @return TypesEntry
-		 */
-		public abstract TypesEntry getParent();
-
-		/**
-		 * Return whether or not the receiver has children.
-		 * 
-		 * @return boolean
-		 */
-		public abstract boolean hasChildren();
-
-	}
-
-	private static Collection EMPTY_COLLECTION = new HashSet();
-
-	private HashMap models = new HashMap(0);
-
-	private CheckboxTreeViewer typesViewer;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#apply(org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter)
-	 */
-	public void apply(MarkerFieldFilter filter) {
-		Collection selectedTypes = new ArrayList();
-		Object[] elements = typesViewer.getCheckedElements();
-		for (int i = 0; i < elements.length; i++) {
-			if (elements[i] instanceof MarkerTypeEntry)
-				selectedTypes.add(((MarkerTypeEntry) elements[i])
-						.getMarkerType());
-		}
-		MarkerFieldFilterGroup group = (MarkerFieldFilterGroup) typesViewer
-				.getInput();
-
-		((MarkerTypeFieldFilter) filter).setSelectedTypes(selectedTypes,
-				group.builder.getGenerator());
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.FilterConfigurationArea#applyToGroup(org.eclipse.ui.internal.provisional.views.markers.MarkerFieldFilterGroup)
-	 */
-	public void applyToGroup(MarkerFieldFilterGroup group) {
-		// Nothing to set at the group level
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.FilterConfigurationArea#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createContents(Composite parent) {
-
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		composite.setLayout(layout);
-
-		Tree tree = new Tree(composite, SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
-		tree.setLinesVisible(true);
-		tree.setHeaderVisible(false);
-		TableLayout tableLayout = new TableLayout();
-		tree.setLayout(tableLayout);
-		tableLayout.addColumnData(new ColumnWeightData(100, true));
-		new TreeColumn(tree, SWT.NONE, 0);
-
-		typesViewer = new CheckboxTreeViewer(tree);
-		initializeFontMetrics(tree);
-
-		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
-		gridData.widthHint = Dialog.convertVerticalDLUsToPixels(
-				getFontMetrics(), 100);
-		gridData.heightHint = Dialog.convertVerticalDLUsToPixels(
-				getFontMetrics(), 75);
-
-		final ITreeContentProvider typesContentProvider = getTypesContentProvider();
-		typesViewer.getControl().setLayoutData(gridData);
-		typesViewer.setContentProvider(typesContentProvider);
-		typesViewer.setLabelProvider(new LabelProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
-			 */
-			public String getText(Object element) {
-				return ((TypesEntry) element).getLabel();
-			}
-		});
-		typesViewer.setComparator(new ViewerComparator() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public int compare(Viewer viewer, Object e1, Object e2) {
-				return ((TypesEntry) e1).getLabel().compareTo(
-						((TypesEntry) e2).getLabel());
-			}
-		});
-		typesViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				Object element = event.getElement();
-				boolean checked = event.getChecked();
-				setChildrenChecked(element, checked);
-				setParentCheckState(element, checked);
-			}
-
-			/**
-			 * Set the check state of the children of element to
-			 * <code>true</code>.
-			 * 
-			 * @param element
-			 * @param checked
-			 */
-			private void setChildrenChecked(Object element, boolean checked) {
-
-				Object[] children = typesContentProvider.getChildren(element);
-				if (children.length > 0) {
-					for (int i = 0; i < children.length; i++) {
-						typesViewer.setChecked(children[i], checked);
-					}
-				}
-
-			}
-
-			/**
-			 * Update the parent check state based on the state of the element
-			 * 
-			 * @param element
-			 * @param checked
-			 */
-			private void setParentCheckState(Object element, boolean checked) {
-
-				Object parent = typesContentProvider.getParent(element);
-				if (parent == null)
-					return;
-
-				Object[] children = typesContentProvider.getChildren(parent);
-
-				for (int i = 0; i < children.length; i++) {// At least one
-					// different
-					if (typesViewer.getChecked(children[i]) != checked) {
-						typesViewer.setGrayChecked(parent, true);
-						return;
-					}
-				}
-				// All are the same - update the parent
-				typesViewer.setChecked(parent, checked);
-
-			}
-		});
-
-		Composite buttonComposite = new Composite(composite, SWT.NONE);
-		GridLayout buttonLayout = new GridLayout();
-		buttonLayout.marginWidth = 0;
-		buttonComposite.setLayout(buttonLayout);
-		GridData buttonsData = new GridData();
-		buttonsData.verticalAlignment = GridData.BEGINNING;
-		buttonComposite.setLayoutData(buttonsData);
-
-		Button selectAllButton = new Button(buttonComposite, SWT.PUSH);
-		selectAllButton.setText(MarkerMessages.filtersDialog_selectAllTypes);
-		selectAllButton.addSelectionListener(getSelectAllButtonListener(
-				typesContentProvider, true));
-		setButtonLayoutData(selectAllButton);
-
-		Button deselectAllButton = new Button(buttonComposite, SWT.PUSH);
-		deselectAllButton
-				.setText(MarkerMessages.filtersDialog_deselectAllTypes);
-		deselectAllButton.addSelectionListener(getSelectAllButtonListener(
-				typesContentProvider, false));
-		setButtonLayoutData(deselectAllButton);
-	}
-
-	/**
-	 * Get the listener for select all and deselect all.
-	 * 
-	 * @param typesContentProvider
-	 * @param checked
-	 *            the check state to set
-	 * @return SelectionListener
-	 */
-	private SelectionListener getSelectAllButtonListener(
-			final ITreeContentProvider typesContentProvider,
-			final boolean checked) {
-		return new SelectionListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetDefaultSelected(SelectionEvent e) {
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				Object[] elements = typesContentProvider
-						.getElements(typesViewer.getInput());
-				for (int i = 0; i < elements.length; i++) {
-					typesViewer.setSubtreeChecked(elements[i], checked);
-
-				}
-			}
-		};
-	}
-
-	/**
-	 * Return the elements for MarkerFieldFilterGroup groip.
-	 * 
-	 * @param group
-	 * @return List of TypesEntry
-	 */
-	protected List elementsForGroup(MarkerFieldFilterGroup group) {
-
-		if (models.containsKey(group))
-			return (List) models.get(group);
-		Iterator roots = group.getAllTypes().iterator();
-		List markerNodes = new ArrayList();
-		HashMap categories = new HashMap();
-		while (roots.hasNext()) {
-			MarkerType markerType = (MarkerType) roots.next();
-
-			String categoryName = MarkerSupportRegistry.getInstance()
-					.getCategory(markerType.getId());
-
-			if (categoryName == null) {
-				markerNodes.add(new MarkerTypeEntry(markerType));
-			} else {
-				CategoryEntry category;
-				if (categories.containsKey(categoryName)) {
-					category = (CategoryEntry) categories.get(categoryName);
-				} else {
-					category = new CategoryEntry(categoryName);
-					categories.put(categoryName, category);
-					markerNodes.add(category);
-				}
-				MarkerTypeEntry node = new MarkerTypeEntry(markerType);
-				category.add(node);
-			}
-
-		}
-		models.put(group, markerNodes);
-		return markerNodes;
-	}
-
-	/**
-	 * Find the type entries for group that correspond to it's current selection
-	 * and add them to the checked or grey checked lists as appropriate.
-	 * 
-	 * @param group
-	 * @param entries
-	 * @param greyEntries
-	 */
-	private void findTypeEntries(MarkerFieldFilterGroup group,
-			Collection entries, Collection greyEntries) {
-		Iterator elements = elementsForGroup(group).iterator();
-
-		Collection selectedTypes = ((MarkerTypeFieldFilter) group
-				.getFilter(this.getField())).getSelectedTypes();
-		while (elements.hasNext()) {
-			TypesEntry entry = (TypesEntry) elements.next();
-			entry.addElementsMatching(selectedTypes, entries);
-			if (entry.hasChildren()) {// Is it a category?
-				Collection children = entry.getChildren();
-				if (entries.containsAll(children))
-					entries.add(entry);
-				else {// See if we need to gray check it
-					Iterator iterator = children.iterator();
-					while (iterator.hasNext()) {
-						if (entries.contains(iterator.next())) {
-							greyEntries.add(entry);
-							break;
-						}
-					}
-				}
-			}
-
-		}
-	}
-
-	/**
-	 * Get the content provider for the types.
-	 * 
-	 * @return ITreeContentProvider
-	 */
-	private ITreeContentProvider getTypesContentProvider() {
-		return new ITreeContentProvider() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-			 */
-			public Object[] getChildren(Object parentElement) {
-				return ((TypesEntry) parentElement).getChildren().toArray();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				return elementsForGroup((MarkerFieldFilterGroup) inputElement)
-						.toArray();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-			 */
-			public Object getParent(Object element) {
-				return ((TypesEntry) element).getParent();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-			 */
-			public boolean hasChildren(Object element) {
-				return ((TypesEntry) element).hasChildren();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-			}
-		};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.provisional.views.markers.api.FilterConfigurationArea#initialize(org.eclipse.ui.internal.provisional.views.markers.api.MarkerFieldFilter)
-	 */
-	public void initialize(MarkerFieldFilter filter) {
-		// This was already done when initialising from the group.
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.markers.GroupFilterConfigurationArea#initializeFromGroup(org.eclipse.ui.internal.views.markers.MarkerFieldFilterGroup)
-	 */
-	public void initializeFromGroup(MarkerFieldFilterGroup group) {
-		typesViewer.setInput(group);
-		typesViewer.refresh();
-		Collection checked = new HashSet();
-		Collection greyed = new HashSet();
-		findTypeEntries(group, checked, greyed);
-		typesViewer.setCheckedElements(checked.toArray());
-		typesViewer.setGrayedElements(greyed.toArray());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.FilterConfigurationArea#getTitle()
-	 */
-	public String getTitle() {
-		return MarkerMessages.filtersDialog_typesTitle;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/navigator/ResourceNavigatorMessages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/navigator/ResourceNavigatorMessages.java
deleted file mode 100644
index 0c42e4e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/navigator/ResourceNavigatorMessages.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.navigator;
-
-import org.eclipse.osgi.util.NLS;
-
-public class ResourceNavigatorMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.views.navigator.messages";//$NON-NLS-1$
-
-	public static String ResourceNavigator_oneItemSelected;
-	public static String ResourceNavigator_statusLine;
-	public static String ResourceNavigator_workingSetToolTip;
-	public static String ResourceNavigator_workingSetInputToolTip;
-	public static String ResourceManager_toolTip;
-	public static String ShowInNavigator_errorMessage;
-
-	// --- Actions ---
-	public static String ResourceNavigator_sort;
-	public static String SortView_byType;
-	public static String SortView_toolTipByType;
-	public static String SortView_byName;
-	public static String SortView_toolTipByName;
-
-	public static String ToggleLinkingAction_text;
-	public static String ToggleLinkingAction_toolTip;
-
-	public static String ResourceNavigator_filterText;
-
-	public static String ResourceNavigator_new;
-	public static String ResourceNavigator_openWith;
-
-	public static String ShowInNavigator_text;
-	public static String ShowInNavigator_toolTip;
-
-	public static String CopyAction_title;
-	public static String CopyAction_toolTip;
-
-	public static String PasteAction_title;
-	public static String PasteAction_toolTip;
-
-	public static String CollapseAllAction_title;
-	public static String CollapseAllAction_toolTip;
-
-	public static String GoToResource_label;
-
-	public static String NavigatorFrameSource_closedProject_title;
-	public static String NavigatorFrameSource_closedProject_message;
-	// --- Dialogs ---
-	public static String Goto_title;
-	public static String FilterSelection_message;
-	public static String FilterSelection_toolTip;
-	public static String FilterSelection_title;
-
-	public static String DropAdapter_title;
-	public static String DropAdapter_problemImporting;
-	public static String DropAdapter_problemsMoving;
-	public static String DropAdapter_question;
-	public static String DropAdapter_targetMustBeResource;
-	public static String DropAdapter_canNotDropIntoClosedProject;
-	public static String DropAdapter_resourcesCanNotBeSiblings;
-	public static String DropAdapter_ok;
-	public static String DropAdapter_overwriteQuery;
-	public static String DropAdapter_dropOperationErrorOther;
-
-	public static String DragAdapter_title;
-	public static String DragAdapter_checkDeleteMessage;
-
-	public static String CopyToClipboardProblemDialog_title;
-	public static String CopyToClipboardProblemDialog_message;
-
-	public static String MoveResourceAction_title;
-	public static String MoveResourceAction_checkMoveMessage;
-
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, ResourceNavigatorMessages.class);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/navigator/messages.properties b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/navigator/messages.properties
deleted file mode 100644
index 97fdc35..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/navigator/messages.properties
+++ /dev/null
@@ -1,84 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-# package: org.eclipse.ui.views.navigator
-
-
-# ==============================================================================
-# Navigator View
-# ==============================================================================
-ResourceNavigator_oneItemSelected = 1 item selected
-ResourceNavigator_statusLine = {0} items selected
-ResourceNavigator_workingSetToolTip = Working Set: {0}
-ResourceNavigator_workingSetInputToolTip = {0} - Working Set: {1}
-ResourceManager_toolTip = Workspace
-ShowInNavigator_errorMessage = Can't open navigator
-
-# --- Actions ---
-ResourceNavigator_sort = &Sort
-SortView_byType = by &Type
-SortView_toolTipByType = Sort by Type
-SortView_byName = by &Name
-SortView_toolTipByName = Sort by Name
-
-ToggleLinkingAction_text = &Link with Editor
-ToggleLinkingAction_toolTip = Link with Editor
-
-ResourceNavigator_filterText = &Filters...
-
-ResourceNavigator_new = Ne&w
-ResourceNavigator_openWith = Open Wit&h
-
-ShowInNavigator_text = Show in &Navigator
-ShowInNavigator_toolTip = Show Selected Objects in Navigator View
-
-CopyAction_title = &Copy
-CopyAction_toolTip = Copy
-
-PasteAction_title=&Paste
-PasteAction_toolTip = Paste
-
-CollapseAllAction_title = Co&llapse All
-CollapseAllAction_toolTip = Collapse All
-
-GoToResource_label=&Resource...
-
-NavigatorFrameSource_closedProject_title=Closed Project
-NavigatorFrameSource_closedProject_message=You attempted to go into a closed project: {0}\nPlease open the project and try again.
-# --- Dialogs ---
-Goto_title = Go To Resource
-
-FilterSelection_message = Select the &filters to apply (matching files will be hidden):
-FilterSelection_toolTip = Apply Filters
-FilterSelection_title = Navigator Filters
-
-
-# --- Drop Adapter ---
-DropAdapter_title = Drag and Drop Problem
-DropAdapter_problemImporting = Problems occurred while importing resources.
-DropAdapter_problemsMoving = Problems occurred while moving resources.
-DropAdapter_question = Question
-DropAdapter_targetMustBeResource = Target must be a resource
-DropAdapter_canNotDropIntoClosedProject = Cannot drop a resource into closed project
-DropAdapter_resourcesCanNotBeSiblings = Resources cannot be siblings of projects
-DropAdapter_ok = ok
-DropAdapter_overwriteQuery = {0} already exists.  Would you like to overwrite it?
-DropAdapter_dropOperationErrorOther = An error occurred during the drop operation.
-
-DragAdapter_title = Check Move
-DragAdapter_checkDeleteMessage = {0} is read only. Do you still wish to delete it?
-
-CopyToClipboardProblemDialog_title=Problem Copying to Clipboard
-CopyToClipboardProblemDialog_message=There was a problem when accessing the system clipboard. Retry?
-
-MoveResourceAction_title = Check Move
-MoveResourceAction_checkMoveMessage = ''{0}'' is read only. Do you still wish to move it?
-
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/properties/IDEPropertiesMessages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/properties/IDEPropertiesMessages.java
deleted file mode 100644
index 4c2bf37..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/properties/IDEPropertiesMessages.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2005 IBM Corporation and others. All rights reserved.   This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ui.internal.views.properties;
-
-import org.eclipse.osgi.util.NLS;
-
-public class IDEPropertiesMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.views.properties.ideMessages";//$NON-NLS-1$
-
-	// ==============================================================================
-	// Properties View - IDE-specific strings
-	// ==============================================================================
-
-	public static String PropertySource_notLocal;
-	public static String PropertySource_notFound;
-	public static String PropertySource_readOnly;
-	public static String PropertySource_undefinedPathVariable;
-	public static String PropertySource_fileNotExist;
-
-	public static String IResourcePropertyConstants_name;
-	public static String IResourcePropertyConstants_path;
-	public static String IResourcePropertyConstants_editable;
-	public static String IResourcePropertyConstants_derived;
-	public static String IResourcePropertyConstants_size;
-	public static String IResourcePropertyConstants_lastModified;
-	public static String IResourcePropertyConstants_info;
-	public static String IResourcePropertyConstants_location;
-	public static String IResourcePropertyConstants_resolvedLocation;
-	public static String IResourcePropertyConstants_linked;
-	public static String ResourceProperty_false;
-	public static String ResourceProperty_true;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, IDEPropertiesMessages.class);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/properties/ideMessages.properties b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/properties/ideMessages.properties
deleted file mode 100644
index cfadf74..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/properties/ideMessages.properties
+++ /dev/null
@@ -1,35 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-# package: org.eclipse.ui.views.properties
-
-# ==============================================================================
-# Properties View - IDE-specific strings
-# ==============================================================================
-
-PropertySource_notLocal = <not local>
-PropertySource_notFound = <resource does not exist>
-PropertySource_readOnly = Read only
-PropertySource_undefinedPathVariable = <undefined path variable>
-PropertySource_fileNotExist = - (does not exist)
-
-IResourcePropertyConstants_name = name
-IResourcePropertyConstants_path = path
-IResourcePropertyConstants_editable = editable
-IResourcePropertyConstants_derived = derived
-IResourcePropertyConstants_size = size
-IResourcePropertyConstants_lastModified = last modified
-IResourcePropertyConstants_info = Info
-IResourcePropertyConstants_location = location
-IResourcePropertyConstants_resolvedLocation = resolved location
-IResourcePropertyConstants_linked = linked
-ResourceProperty_false = false
-ResourceProperty_true = true
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/tasklist/TaskListMessages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/tasklist/TaskListMessages.java
deleted file mode 100644
index 23212c2..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/tasklist/TaskListMessages.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.tasklist;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * TaskListMessages are the messages used in the TaskList.
- *
- */
-public class TaskListMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.views.tasklist.messages";//$NON-NLS-1$
-
-	// ==============================================================================
-	// TaskList
-	// ==============================================================================
-
-	public static String TaskList_line;
-	public static String TaskList_lineAndLocation;
-
-	public static String TaskList_statusSummaryVisible;
-	public static String TaskList_statusSummarySelected;
-	public static String TaskList_statusSummaryBreakdown;
-	public static String TaskList_titleSummaryUnfiltered;
-	public static String TaskList_titleSummaryFiltered;
-	public static String TaskList_headerIcon;
-	public static String TaskList_headerCompleted;
-	public static String TaskList_headerPriority;
-	public static String TaskList_headerDescription;
-	public static String TaskList_headerResource;
-	public static String TaskList_headerFolder;
-	public static String TaskList_headerLocation;
-
-	public static String TaskList_high;
-	public static String TaskList_low;
-	public static String TaskList_normal;
-
-	public static String TaskList_errorModifyingTask;
-
-	public static String TaskList_reportKind;
-	public static String TaskList_reportStatus;
-	public static String TaskList_reportPriority;
-
-	public static String TaskList_task;
-	public static String TaskList_error;
-	public static String TaskList_warning;
-	public static String TaskList_info;
-
-	public static String TaskList_completed;
-	public static String TaskList_notCompleted;
-
-	public static String TaskList_markerLimitExceeded;
-
-	// --- Actions ---
-	public static String NewTask_text;
-	public static String NewTask_tooltip;
-	public static String NewTask_notShownTitle;
-	public static String NewTask_notShownMsg;
-
-	public static String CopyTask_text;
-	public static String CopyTask_tooltip;
-
-	public static String PasteTask_text;
-	public static String PasteTask_tooltip;
-	public static String PasteTask_errorMessage;
-
-	public static String RemoveTask_text;
-	public static String RemoveTask_tooltip;
-	public static String RemoveTask_undoText;
-	public static String RemoveTask_errorMessage;
-
-	public static String Filters_text;
-	public static String Filters_tooltip;
-
-	public static String SortByMenu_text;
-	public static String SortByCategory_text;
-	public static String SortByCategory_tooltip;
-	public static String SortByCompleted_text;
-	public static String SortByCompleted_tooltip;
-	public static String SortByPriority_text;
-	public static String SortByPriority_tooltip;
-	public static String SortByDescription_text;
-	public static String SortByDescription_tooltip;
-	public static String SortByResource_text;
-	public static String SortByResource_tooltip;
-	public static String SortByContainer_text;
-	public static String SortByContainer_tooltip;
-	public static String SortByLocation_text;
-	public static String SortByLocation_tooltip;
-	public static String SortByCreationTime_text;
-	public static String SortByCreationTime_tooltip;
-	public static String SortAscending_text;
-	public static String SortAscending_tooltip;
-	public static String SortDescending_text;
-	public static String SortDescending_tooltip;
-
-	public static String GotoTask_text;
-	public static String GotoTask_tooltip;
-	public static String GotoTask_errorMessage;
-
-	public static String PurgeCompleted_text;
-	public static String PurgeCompleted_tooltip;
-	public static String PurgeCompleted_title;
-	public static String PurgeCompleted_noneCompleted;
-	public static String PurgeCompleted_permanent;
-	public static String PurgeCompleted_errorMessage;
-
-	public static String MarkCompleted_text;
-	public static String MarkCompleted_tooltip;
-
-	public static String SelectAll_text;
-	public static String SelectAll_tooltip;
-
-	public static String Resolve_text;
-	public static String Resolve_tooltip;
-	public static String Resolve_title;
-	public static String Resolve_noResolutionsLabel;
-
-	public static String Properties_text;
-	public static String Properties_tooltip;
-
-	// --- Filter Dialog ---
-	public static String TaskList_filter;
-	public static String TaskList_showItemsOfType;
-
-	public static String TaskList_anyResource;
-	public static String TaskList_anyResourceInSameProject;
-	public static String TaskList_selectedResource;
-	public static String TaskList_selectedAndChildren;
-	public static String TaskList_workingSet;
-	public static String TaskList_workingSetSelect;
-	public static String TaskList_noWorkingSet;
-
-	public static String TaskList_whereDescription;
-	public static String TaskList_contains;
-	public static String TaskList_doesNotContain;
-
-	public static String TaskList_severity_label;
-	public static String TaskList_severity_error;
-	public static String TaskList_severity_warning;
-	public static String TaskList_severity_info;
-
-	public static String TaskList_priority_label;
-	public static String TaskList_priority_high;
-	public static String TaskList_priority_low;
-	public static String TaskList_priority_normal;
-
-	public static String TaskList_status_label;
-	public static String TaskList_status_completed;
-	public static String TaskList_status_notCompleted;
-
-	public static String TaskList_resetText;
-
-	public static String TaskList_limitVisibleTasksTo;
-	public static String TaskList_titleMarkerLimitInvalid;
-	public static String TaskList_messageMarkerLimitInvalid;
-	public static String TaskPropertiesDialog_WorkingOnMarker;
-	public static String TaskPropertiesDialog_CreatingMarker;
-
-	// --- Properties Dialog ---
-	public static String TaskProp_newTaskTitle;
-	public static String TaskProp_propertiesTitle;
-	//TaskProp.titleFmt = {0} - {1}
-	public static String TaskProp_description;
-	public static String TaskProp_creationTime;
-	public static String TaskProp_priority;
-	public static String TaskProp_completed;
-	public static String TaskProp_severity;
-	public static String TaskProp_onResource;
-	public static String TaskProp_inFolder;
-	public static String TaskProp_location;
-	public static String TaskProp_errorMessage;
-
-	public static String CopyToClipboardProblemDialog_title;
-	public static String CopyToClipboardProblemDialog_message;
-
-	public static String TaskPropertiesDialog_UpdatingAttributes;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, TaskListMessages.class);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/tasklist/messages.properties b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/tasklist/messages.properties
deleted file mode 100644
index 2fee2ba..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/tasklist/messages.properties
+++ /dev/null
@@ -1,183 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-#     Cagatay Kavukcuoglu <cagatayk@acm.org> - Filter for markers in same project
-# 	  Sebastian Davids <sdavids@gmx.de> - bug 132427 - [Markers] TaskPropertiesDialog problems
-###############################################################################
-
-# package: org.eclipse.ui.views.tasklist
-
-
-# ==============================================================================
-# TaskList
-# ==============================================================================
-
-TaskList_line = line {0}
-TaskList_lineAndLocation = line {0} in {1}
-
-TaskList_statusSummaryVisible = {0,choice,0#0 items|1#{0,number,integer} item|1<{0,number,integer} items}: {1}
-TaskList_statusSummarySelected = {0,choice,0#0 items|1#{0,number,integer} item|1<{0,number,integer} items} selected: {1}
-TaskList_statusSummaryBreakdown = {0,choice,0#0 tasks|1#{0,number,integer} task|1<{0,number,integer} tasks}, {1,choice,0#0 errors|1#{1,number,integer} error|1<{1,number,integer} errors}, {2,choice,0#0 warnings|1#{2,number,integer} warning|1<{2,number,integer} warnings}, {3,choice,0#0 infos|1#{3,number,integer} info|1<{3,number,integer} infos}
-TaskList_titleSummaryUnfiltered = {0,choice,0#0 items|1#{0,number,integer} item|1<{0,number,integer} items}
-TaskList_titleSummaryFiltered = Filter matched {0} of {1,choice,0#0 items|1#{1,number,integer} item|1<{1,number,integer} items}
-
-TaskList_headerIcon =
-TaskList_headerCompleted = C
-TaskList_headerPriority = !
-TaskList_headerDescription = Description
-TaskList_headerResource = Resource
-TaskList_headerFolder = In Folder
-TaskList_headerLocation = Location
-
-TaskList_high = High
-TaskList_low = Low
-TaskList_normal = Normal
-
-TaskList_errorModifyingTask = Error modifying task
-
-TaskList_reportKind = Kind
-TaskList_reportStatus = Status
-TaskList_reportPriority = Priority
-
-TaskList_task = Task
-TaskList_error = Error
-TaskList_warning = Warning
-TaskList_info = Info
-
-TaskList_completed = Completed
-TaskList_notCompleted = Not Completed
-
-TaskList_markerLimitExceeded = There are too many items to display.\n\
-To see items in this window, adjust the filter settings.
-
-# --- Actions ---
-NewTask_text = &New Task
-NewTask_tooltip = New Task
-NewTask_notShownTitle = New Task Not Visible
-NewTask_notShownMsg = The new task will not be visible, due to the current filter settings.\n\
-To see all tasks, choose Filter... then select the Reset button.
-
-CopyTask_text = &Copy
-CopyTask_tooltip = Copy
-
-PasteTask_text = &Paste
-PasteTask_tooltip = Paste
-PasteTask_errorMessage = Error pasting task
-
-RemoveTask_text = &Delete
-RemoveTask_tooltip = Delete
-RemoveTask_undoText = Delete Task
-RemoveTask_errorMessage = Error deleting task
-
-Filters_text = &Filters...
-Filters_tooltip = Filters...
-
-SortByMenu_text= &Sort
-SortByCategory_text= by &Type
-SortByCategory_tooltip= Sort by type column
-SortByCompleted_text= by &Completion
-SortByCompleted_tooltip= Sort by completion column
-SortByPriority_text= by &Priority
-SortByPriority_tooltip= Sort by priority column
-SortByDescription_text= by &Description
-SortByDescription_tooltip= Sort by description column
-SortByResource_text= by &Resource
-SortByResource_tooltip= Sort by resource column
-SortByContainer_text= by &Folder
-SortByContainer_tooltip= Sort by folder column
-SortByLocation_text= by &Location
-SortByLocation_tooltip= Sort by location column
-SortByCreationTime_text= by Cr&eation Time
-SortByCreationTime_tooltip= Sort by task creation time
-SortAscending_text= &Ascending
-SortAscending_tooltip= Sort ascending
-SortDescending_text= De&scending
-SortDescending_tooltip= Sort Descending
-
-GotoTask_text = &Go To
-GotoTask_tooltip = Go To
-GotoTask_errorMessage = Problems Opening Editor
-
-PurgeCompleted_text = Delete Completed &Tasks
-PurgeCompleted_tooltip = Delete Completed Tasks
-PurgeCompleted_title = Delete Completed Tasks
-PurgeCompleted_noneCompleted = No completed tasks to delete.
-PurgeCompleted_permanent = Do you want to permanently delete all {0} completed tasks?
-PurgeCompleted_errorMessage = Error deleting completed tasks
-
-MarkCompleted_text = &Mark Completed
-MarkCompleted_tooltip = Mark Completed
-
-SelectAll_text = Select A&ll
-SelectAll_tooltip = Select All
-
-Resolve_text = &Quick Fix...
-Resolve_tooltip = Quick Fix
-Resolve_title = Quick Fix
-Resolve_noResolutionsLabel = There are no quick fixes available for the selected marker.
-
-Properties_text = P&roperties
-Properties_tooltip = Properties
-
-# --- Filter Dialog ---
-TaskList_filter = Filter Tasks
-TaskList_showItemsOfType = Show items of &type:
-
-TaskList_anyResource = On &any resource
-TaskList_anyResourceInSameProject = On any resource in same &project
-TaskList_selectedResource = On selected resource &only
-TaskList_selectedAndChildren = On selected resource and its &children
-TaskList_workingSet = On wor&king set:  {0}
-TaskList_workingSetSelect = &Select...
-TaskList_noWorkingSet = On wor&king set:  <no working set selected>
-
-TaskList_whereDescription = Where &description
-TaskList_contains = contains
-TaskList_doesNotContain = does not contain
-
-TaskList_severity_label = Where problem se&verity is:
-TaskList_severity_error = &Error
-TaskList_severity_warning = Warnin&g
-TaskList_severity_info = &Info
-
-TaskList_priority_label = Where task priorit&y is:
-TaskList_priority_high = &High
-TaskList_priority_low = Lo&w
-TaskList_priority_normal = &Normal
-
-TaskList_status_label = Where task stat&us is:
-TaskList_status_completed = Co&mpleted
-TaskList_status_notCompleted = Not Comp&leted
-
-TaskList_resetText = &Restore Defaults
-
-TaskList_limitVisibleTasksTo = Limit visi&ble items to:
-TaskList_titleMarkerLimitInvalid = Error
-TaskList_messageMarkerLimitInvalid = The visible item limit must be a positive integer.
-TaskPropertiesDialog_WorkingOnMarker=Working on Marker
-TaskPropertiesDialog_CreatingMarker=Creating marker
-
-# --- Properties Dialog ---
-TaskProp_newTaskTitle = New Task
-TaskProp_propertiesTitle = {0} Properties
-#TaskProp.titleFmt = {0} - {1}
-TaskProp_description = &Description:
-TaskProp_creationTime = Creation &Time:
-TaskProp_priority = &Priority:
-TaskProp_completed = &Completed
-TaskProp_severity = Severit&y:
-TaskProp_onResource = On &Resource:
-TaskProp_inFolder = In &Folder:
-TaskProp_location = &Location:
-TaskProp_errorMessage = Error creating or modifying task
-
-CopyToClipboardProblemDialog_title=Problem Copying to Clipboard
-CopyToClipboardProblemDialog_message=There was a problem when accessing the system clipboard. Retry?
-
-TaskPropertiesDialog_UpdatingAttributes=Updating attributes
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ArchiveFileExportOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ArchiveFileExportOperation.java
deleted file mode 100644
index 1c3736e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ArchiveFileExportOperation.java
+++ /dev/null
@@ -1,358 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-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.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.operation.ModalContext;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- *	Operation for exporting a resource and its children to a new .zip or
- *  .tar.gz file.
- *  
- *  @since 3.1
- */
-public class ArchiveFileExportOperation implements IRunnableWithProgress {
-    private IFileExporter exporter;
-
-    private String destinationFilename;
-
-    private IProgressMonitor monitor;
-
-    private List resourcesToExport;
-
-    private IResource resource;
-
-    private List errorTable = new ArrayList(1); //IStatus
-
-    private boolean useCompression = true;
-    
-    private boolean useTarFormat = false;
-
-    private boolean createLeadupStructure = true;
-
-    /**
-     *	Create an instance of this class.  Use this constructor if you wish to
-     *	export specific resources without a common parent resource
-     *
-     *	@param resources java.util.Vector
-     *	@param filename java.lang.String
-     */
-    public ArchiveFileExportOperation(List resources, String filename) {
-        super();
-
-        // Eliminate redundancies in list of resources being exported
-        Iterator elementsEnum = resources.iterator();
-        while (elementsEnum.hasNext()) {
-            IResource currentResource = (IResource) elementsEnum.next();
-            if (isDescendent(resources, currentResource)) {
-				elementsEnum.remove(); //Removes currentResource;
-			}
-        }
-
-        resourcesToExport = resources;
-        destinationFilename = filename;
-    }
-
-    /**
-     *  Create an instance of this class.  Use this constructor if you wish
-     *  to recursively export a single resource.
-     *
-     *  @param res org.eclipse.core.resources.IResource;
-     *  @param filename java.lang.String
-     */
-    public ArchiveFileExportOperation(IResource res, String filename) {
-        super();
-        resource = res;
-        destinationFilename = filename;
-    }
-
-    /**
-     *  Create an instance of this class.  Use this constructor if you wish to
-     *  export specific resources with a common parent resource (affects container
-     *  directory creation)
-     *
-     *  @param res org.eclipse.core.resources.IResource
-     *  @param resources java.util.Vector
-     *  @param filename java.lang.String
-     */
-    public ArchiveFileExportOperation(IResource res, List resources, String filename) {
-        this(res, filename);
-        resourcesToExport = resources;
-    }
-
-    /**
-     * Add a new entry to the error table with the passed information
-     */
-    protected void addError(String message, Throwable e) {
-        errorTable.add(new Status(IStatus.ERROR,
-                IDEWorkbenchPlugin.IDE_WORKBENCH, 0, message, e));
-    }
-
-    /**
-     *  Answer the total number of file resources that exist at or below self
-     *  in the resources hierarchy.
-     *
-     *  @return int
-     *  @param checkResource org.eclipse.core.resources.IResource
-     */
-    protected int countChildrenOf(IResource checkResource) throws CoreException {
-        if (checkResource.getType() == IResource.FILE) {
-			return 1;
-		}
-
-        int count = 0;
-        if (checkResource.isAccessible()) {
-            IResource[] children = ((IContainer) checkResource).members();
-            for (int i = 0; i < children.length; i++) {
-				count += countChildrenOf(children[i]);
-			}
-        }
-
-        return count;
-    }
-
-    /**
-     *	Answer a boolean indicating the number of file resources that were
-     *	specified for export
-     *
-     *	@return int
-     */
-    protected int countSelectedResources() throws CoreException {
-        int result = 0;
-        Iterator resources = resourcesToExport.iterator();
-        while (resources.hasNext()) {
-			result += countChildrenOf((IResource) resources.next());
-		}
-
-        return result;
-    }
-
-    /**
-     *  Export the passed resource to the destination .zip. Export with
-     * no path leadup
-     *
-     *  @param exportResource org.eclipse.core.resources.IResource
-     */
-    protected void exportResource(IResource exportResource)
-            throws InterruptedException {
-        exportResource(exportResource, 1);
-    }
-
-    /**
-     *  Export the passed resource to the destination .zip
-     *
-     *  @param exportResource org.eclipse.core.resources.IResource
-     *  @param leadupDepth the number of resource levels to be included in
-     *                     the path including the resourse itself.
-     */
-    protected void exportResource(IResource exportResource, int leadupDepth)
-            throws InterruptedException {
-        if (!exportResource.isAccessible()) {
-			return;
-		}
-
-        if (exportResource.getType() == IResource.FILE) {
-            String destinationName;
-            IPath fullPath = exportResource.getFullPath();
-            if (createLeadupStructure) {
-				destinationName = fullPath.makeRelative().toString();
-			} else {
-				destinationName = fullPath.removeFirstSegments(
-                        fullPath.segmentCount() - leadupDepth).toString();
-			}
-            monitor.subTask(destinationName);
-
-            try {
-                exporter.write((IFile) exportResource, destinationName);
-            } catch (IOException e) {
-                addError(NLS.bind(DataTransferMessages.DataTransfer_errorExporting, exportResource.getFullPath().makeRelative(), e.getMessage()), e);
-            } catch (CoreException e) {
-                addError(NLS.bind(DataTransferMessages.DataTransfer_errorExporting, exportResource.getFullPath().makeRelative(), e.getMessage()), e);
-            }
-
-            monitor.worked(1);
-            ModalContext.checkCanceled(monitor);
-        } else {
-            IResource[] children = null;
-
-            try {
-                children = ((IContainer) exportResource).members();
-            } catch (CoreException e) {
-                // this should never happen because an #isAccessible check is done before #members is invoked
-                addError(NLS.bind(DataTransferMessages.DataTransfer_errorExporting, exportResource.getFullPath()), e);
-            }
-
-            for (int i = 0; i < children.length; i++) {
-				exportResource(children[i], leadupDepth + 1);
-			}
-
-        }
-    }
-
-    /**
-     *	Export the resources contained in the previously-defined
-     *	resourcesToExport collection
-     */
-    protected void exportSpecifiedResources() throws InterruptedException {
-        Iterator resources = resourcesToExport.iterator();
-
-        while (resources.hasNext()) {
-            IResource currentResource = (IResource) resources.next();
-            exportResource(currentResource);
-        }
-    }
-
-    /**
-     * Returns the status of the operation.
-     * If there were any errors, the result is a status object containing
-     * individual status objects for each error.
-     * If there were no errors, the result is a status object with error code <code>OK</code>.
-     *
-     * @return the status
-     */
-    public IStatus getStatus() {
-        IStatus[] errors = new IStatus[errorTable.size()];
-        errorTable.toArray(errors);
-        return new MultiStatus(
-                IDEWorkbenchPlugin.IDE_WORKBENCH,
-                IStatus.OK,
-                errors,
-                DataTransferMessages.FileSystemExportOperation_problemsExporting,
-                null);
-    }
-
-    /**
-     *	Initialize this operation
-     *
-     *	@exception java.io.IOException
-     */
-    protected void initialize() throws IOException {
-    	if(useTarFormat) {
-    		exporter = new TarFileExporter(destinationFilename, useCompression);
-    	} else {
-        	exporter = new ZipFileExporter(destinationFilename, useCompression);
-    	}
-    }
-
-    /**
-     *  Answer a boolean indicating whether the passed child is a descendent
-     *  of one or more members of the passed resources collection
-     *
-     *  @return boolean
-     *  @param resources java.util.Vector
-     *  @param child org.eclipse.core.resources.IResource
-     */
-    protected boolean isDescendent(List resources, IResource child) {
-        if (child.getType() == IResource.PROJECT) {
-			return false;
-		}
-
-        IResource parent = child.getParent();
-        if (resources.contains(parent)) {
-			return true;
-		}
-
-        return isDescendent(resources, parent);
-    }
-
-    /**
-     *	Export the resources that were previously specified for export
-     *	(or if a single resource was specified then export it recursively)
-     */
-    public void run(IProgressMonitor progressMonitor)
-            throws InvocationTargetException, InterruptedException {
-        this.monitor = progressMonitor;
-
-        try {
-            initialize();
-        } catch (IOException e) {
-            throw new InvocationTargetException(e, NLS.bind(DataTransferMessages.ZipExport_cannotOpen, e.getMessage()));
-        }
-
-        try {
-            // ie.- a single resource for recursive export was specified
-            int totalWork = IProgressMonitor.UNKNOWN;
-            try {
-                if (resourcesToExport == null) {
-					totalWork = countChildrenOf(resource);
-				} else {
-					totalWork = countSelectedResources();
-				}
-            } catch (CoreException e) {
-                // Should not happen
-            }
-            monitor.beginTask(DataTransferMessages.DataTransfer_exportingTitle, totalWork);
-            if (resourcesToExport == null) {
-                exportResource(resource);
-            } else {
-                // ie.- a list of specific resources to export was specified
-                exportSpecifiedResources();
-            }
-
-            try {
-                exporter.finished();
-            } catch (IOException e) {
-                throw new InvocationTargetException(
-                        e,
-                        NLS.bind(DataTransferMessages.ZipExport_cannotClose, e.getMessage()));
-            }
-        } finally {
-            monitor.done();
-        }
-    }
-
-    /**
-     *	Set this boolean indicating whether each exported resource's path should
-     *	include containment hierarchies as dictated by its parents
-     *
-     *	@param value boolean
-     */
-    public void setCreateLeadupStructure(boolean value) {
-        createLeadupStructure = value;
-    }
-
-    /**
-     *	Set this boolean indicating whether exported resources should
-     *	be compressed (as opposed to simply being stored)
-     *
-     *	@param value boolean
-     */
-    public void setUseCompression(boolean value) {
-        useCompression = value;
-    }
-    
-    /**
-     * Set this boolean indicating whether the file should be output
-     * in tar.gz format rather than .zip format.
-     * 
-     * @param value boolean
-     */
-    public void setUseTarFormat(boolean value) {
-    	useTarFormat = value;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ArchiveFileManipulations.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ArchiveFileManipulations.java
deleted file mode 100644
index 9966b36..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ArchiveFileManipulations.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial implementation
- *     Red Hat, Inc - Extracted methods from WizardArchiveFileResourceImportPage1
- *******************************************************************************/
-
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.IOException;
-import java.util.zip.ZipFile;
-
-import org.eclipse.osgi.util.NLS;
-
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-
-/**
- * @since 3.1
- */
-public class ArchiveFileManipulations {
-
-
-	/**
-	 * Determine whether the file with the given filename is in .tar.gz or .tar
-	 * format.
-	 * 
-	 * @param fileName
-	 *            file to test
-	 * @return true if the file is in tar format
-	 */
-	public static boolean isTarFile(String fileName) {
-		if (fileName.length() == 0) {
-			return false;
-		}
-
-		TarFile tarFile = null;
-		try {
-			tarFile = new TarFile(fileName);
-		} catch (TarException tarException) {
-			return false;
-		} catch (IOException ioException) {
-			return false;
-		} finally {
-			if (tarFile != null) {
-				try {
-					tarFile.close();
-				} catch (IOException e) {
-					// ignore
-				}
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * Determine whether the file with the given filename is in .zip or .jar
-	 * format.
-	 * 
-	 * @param fileName
-	 *            file to test
-	 * @return true if the file is in tar format
-	 */
-	public static boolean isZipFile(String fileName) {
-		if (fileName.length() == 0) {
-			return false;
-		}
-
-		ZipFile zipFile = null;
-		try {
-			zipFile = new ZipFile(fileName);
-		} catch (IOException ioException) {
-			return false;
-		} finally {
-			if (zipFile != null) {
-				try {
-					zipFile.close();
-				} catch (IOException e) {
-					// ignore
-				}
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * Closes the given structure provider.
-	 * 
-	 * @param structureProvider
-	 *            The structure provider to be closed, can be <code>null</code>				 
-	 * @param shell
-	 *            The shell to display any possible Dialogs in
-	 */
-	public static void closeStructureProvider(ILeveledImportStructureProvider structureProvider, Shell shell) {
-		if (structureProvider instanceof ZipLeveledStructureProvider) {
-			closeZipFile(((ZipLeveledStructureProvider) structureProvider).getZipFile(), shell);
-		}
-		if (structureProvider instanceof TarLeveledStructureProvider) {
-			closeTarFile(((TarLeveledStructureProvider) structureProvider).getTarFile(), shell);
-		}
-	}
-
-	/**
-	 * Attempts to close the passed zip file, and answers a boolean indicating
-	 * success.
-	 * 
-	 * @param file
-	 *            The zip file to attempt to close
-	 * @param shell
-	 *            The shell to display error dialogs in
-	 * @return Returns true if the operation was successful
-	 */
-	public static boolean closeZipFile(ZipFile file, Shell shell) {
-		try {
-			file.close();
-		} catch (IOException e) {
-			displayErrorDialog(
-					NLS.bind(DataTransferMessages.ZipImport_couldNotClose, file.getName()),
-					shell);
-			return false;
-		}
-
-		return true;
-	}
-	
-	/**
-	 * Attempts to close the passed tar file, and answers a boolean indicating
-	 * success.
-	 * 
-	 * @param file
-	 *            The tar file to attempt to close
-	 * @param shell
-	 *            The shell to display error dialogs in
-	 * @return Returns true if the operation was successful
-	 * @since 3.4
-	 */
-	public static boolean closeTarFile(TarFile file, Shell shell) {
-		try {
-			file.close();
-		} catch (IOException e) {
-			displayErrorDialog(
-					NLS.bind(DataTransferMessages.ZipImport_couldNotClose, file.getName()),
-					shell);
-			return false;
-		}
-		
-		return true;
-	}
-
-	/**
-	 * Display an error dialog with the specified message.
-	 * 
-	 * @param message
-	 *            the error message
-	 */
-	protected static void displayErrorDialog(String message, Shell shell) {
-		MessageDialog.openError(shell, getErrorDialogTitle(), message);
-	}
-
-	/**
-	 * Get the title for an error dialog. Subclasses should override.
-	 */
-	protected static String getErrorDialogTitle() {
-		return IDEWorkbenchMessages.WizardExportPage_internalErrorTitle;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/DataTransferMessages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/DataTransferMessages.java
deleted file mode 100644
index 7a8789e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/DataTransferMessages.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- * Red Hat, Inc - WizardProjectsImportPage[_ArchiveSelectTitle,
- * 										   _SelectArchiveDialogTitle]
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import org.eclipse.osgi.util.NLS;
-
-public class DataTransferMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.wizards.datatransfer.messages";//$NON-NLS-1$
-
-	// ==============================================================================
-	// Data Transfer Wizards
-	// ==============================================================================
-	public static String DataTransfer_fileSystemTitle;
-	public static String ZipExport_exportTitle;
-	public static String ArchiveExport_exportTitle;
-
-	public static String DataTransfer_browse;
-	public static String DataTransfer_selectTypes;
-	public static String DataTransfer_selectAll;
-	public static String DataTransfer_deselectAll;
-	public static String DataTransfer_refresh;
-	public static String DataTransfer_cannotOverwrite;
-	public static String DataTransfer_emptyString;
-	public static String DataTransfer_scanningMatching;
-	public static String DataTransfer_information;
-
-	// --- Import Wizards ---
-	public static String DataTransfer_importTitle;
-
-	public static String DataTransfer_importTask;
-	public static String ImportOperation_cannotCopy;
-	public static String ImportOperation_importProblems;
-	public static String ImportOperation_openStreamError;
-	public static String ImportOperation_closeStreamError;
-	public static String ImportOperation_coreImportError;
-	public static String ImportOperation_targetSameAsSourceError;
-	public static String ImportPage_filterSelections;
-
-	public static String FileImport_selectSource;
-	public static String FileImport_selectSourceTitle;
-	public static String FileImport_fromDirectory;
-	public static String FileImport_importFileSystem;
-	public static String FileImport_overwriteExisting;
-	public static String FileImport_createComplete;
-	public static String FileImport_createSelectedFolders;
-	public static String FileImport_noneSelected;
-	public static String FileImport_invalidSource;
-	public static String FileImport_sourceEmpty;
-	public static String FileImport_importProblems;
-	public static String ZipImport_description;
-	public static String ZipImport_couldNotClose;
-	public static String ZipImport_badFormat;
-	public static String ZipImport_couldNotRead;
-	public static String ZipImport_fromFile;
-	public static String ZipImportSource_title;
-
-	public static String ArchiveImport_description;
-	public static String ArchiveImport_fromFile;
-	public static String ArchiveImportSource_title;
-	public static String TarImport_badFormat;
-
-	public static String WizardExternalProjectImportPage_locationError;
-	public static String WizardExternalProjectImportPage_projectLocationEmpty;
-	public static String WizardExternalProjectImportPage_projectExistsMessage;
-	public static String WizardExternalProjectImportPage_projectContentsLabel;
-	public static String WizardExternalProjectImportPage_nameLabel;
-	public static String WizardExternalProjectImportPage_title;
-	public static String WizardExternalProjectImportPage_description;
-	public static String WizardExternalProjectImportPage_notAProject;
-	public static String WizardProjectsImportPage_ProjectsListTitle;
-	public static String WizardProjectsImportPage_ProcessingMessage;
-	public static String WizardProjectsImportPage_SelectDialogTitle;
-	public static String WizardProjectsImportPage_SearchingMessage;
-	public static String WizardExternalProjectImportPage_errorMessage;
-	public static String WizardProjectsImportPage_ImportProjectsTitle;
-	public static String WizardExternalProjectImportPage_caseVariantExistsError;
-	public static String WizardExternalProjectImportPage_directoryLabel;
-	public static String WizardProjectsImportPage_RootSelectTitle;
-	public static String WizardProjectsImportPage_ImportProjectsDescription;
-	public static String WizardProjectsImportPage_CheckingMessage;
-	public static String WizardProjectsImportPage_ArchiveSelectTitle;
-	public static String WizardProjectsImportPage_SelectArchiveDialogTitle;
-	public static String WizardProjectsImportPage_CreateProjectsTask;
-	public static String WizardProjectsImportPage_CopyProjectsIntoWorkspace;
-	public static String WizardProjectsImportPage_projectsInWorkspace;
-	public static String WizardProjectsImportPage_projectLabel;
-
-	// --- Export Wizards ---
-	public static String DataTransfer_export;
-
-	public static String DataTransfer_exportingTitle;
-	public static String DataTransfer_createTargetDirectory;
-	public static String DataTransfer_directoryCreationError;
-	public static String DataTransfer_errorExporting;
-	public static String DataTransfer_exportProblems;
-
-	public static String ExportFile_overwriteExisting;
-	public static String FileExport_selectDestinationTitle;
-	public static String FileExport_selectDestinationMessage;
-	public static String FileExport_exportLocalFileSystem;
-	public static String FileExport_destinationEmpty;
-	public static String FileExport_createDirectoryStructure;
-	public static String FileExport_createSelectedDirectories;
-	public static String FileExport_noneSelected;
-	public static String FileExport_directoryExists;
-	public static String FileExport_conflictingContainer;
-	public static String FileExport_rootName;
-	public static String FileSystemExportOperation_problemsExporting;
-	public static String FileExport_toDirectory;
-	public static String FileExport_damageWarning;
-
-	public static String ZipExport_compressContents;
-	public static String ZipExport_destinationLabel;
-	public static String ZipExport_mustBeFile;
-	public static String ZipExport_alreadyExists;
-	public static String ZipExport_alreadyExistsError;
-	public static String ZipExport_cannotOpen;
-	public static String ZipExport_cannotClose;
-	public static String ZipExport_selectDestinationTitle;
-	public static String ZipExport_destinationEmpty;
-
-	public static String ArchiveExport_description;
-	public static String ArchiveExport_destinationLabel;
-	public static String ArchiveExport_selectDestinationTitle;
-	public static String ArchiveExport_destinationEmpty;
-	public static String ArchiveExport_saveInZipFormat;
-	public static String ArchiveExport_saveInTarFormat;
-
-	public static String TarImport_invalid_tar_format;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, DataTransferMessages.class);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/FileSystemExportOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/FileSystemExportOperation.java
deleted file mode 100644
index a037493..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/FileSystemExportOperation.java
+++ /dev/null
@@ -1,436 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-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.MultiStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.operation.ModalContext;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.IOverwriteQuery;
-
-
-/**
- *	Operation for exporting the contents of a resource to the local file system.
- */
-public class FileSystemExportOperation implements IRunnableWithProgress {
-    private IPath path;
-
-    private IProgressMonitor monitor;
-
-    private FileSystemExporter exporter = new FileSystemExporter();
-
-    private List resourcesToExport;
-
-    private IOverwriteQuery overwriteCallback;
-
-    private IResource resource;
-
-    private List errorTable = new ArrayList(1);
-
-    //The constants for the overwrite 3 state
-    private static final int OVERWRITE_NOT_SET = 0;
-
-    private static final int OVERWRITE_NONE = 1;
-
-    private static final int OVERWRITE_ALL = 2;
-
-    private int overwriteState = OVERWRITE_NOT_SET;
-
-    private boolean createLeadupStructure = true;
-
-    private boolean createContainerDirectories = true;
-
-    /**
-     *  Create an instance of this class.  Use this constructor if you wish to
-     *  recursively export a single resource
-     */
-    public FileSystemExportOperation(IResource res, String destinationPath,
-            IOverwriteQuery overwriteImplementor) {
-        super();
-        resource = res;
-        path = new Path(destinationPath);
-        overwriteCallback = overwriteImplementor;
-    }
-
-    /**
-     *  Create an instance of this class.  Use this constructor if you wish to
-     *  export specific resources with a common parent resource (affects container
-     *  directory creation)
-     */
-    public FileSystemExportOperation(IResource res, List resources,
-            String destinationPath, IOverwriteQuery overwriteImplementor) {
-        this(res, destinationPath, overwriteImplementor);
-        resourcesToExport = resources;
-    }
-
-    /**
-     *  Answer the total number of file resources that exist at or below self in the
-     *  resources hierarchy.
-     *
-     *  @return int
-     *  @param parentResource org.eclipse.core.resources.IResource
-     */
-    protected int countChildrenOf(IResource parentResource)
-            throws CoreException {
-        if (parentResource.getType() == IResource.FILE) {
-			return 1;
-		}
-
-        int count = 0;
-        if (parentResource.isAccessible()) {
-            IResource[] children = ((IContainer) parentResource).members();
-            for (int i = 0; i < children.length; i++) {
-				count += countChildrenOf(children[i]);
-			}
-        }
-
-        return count;
-    }
-
-    /**
-     *	Answer a boolean indicating the number of file resources that were
-     *	specified for export
-     *
-     *	@return int
-     */
-    protected int countSelectedResources() throws CoreException {
-        int result = 0;
-        Iterator resources = resourcesToExport.iterator();
-
-        while (resources.hasNext()) {
-			result += countChildrenOf((IResource) resources.next());
-		}
-
-        return result;
-    }
-
-    /**
-     *  Create the directories required for exporting the passed resource,
-     *  based upon its container hierarchy
-     *
-     *  @param childResource org.eclipse.core.resources.IResource
-     */
-    protected void createLeadupDirectoriesFor(IResource childResource) {
-        IPath resourcePath = childResource.getFullPath().removeLastSegments(1);
-
-        for (int i = 0; i < resourcePath.segmentCount(); i++) {
-            path = path.append(resourcePath.segment(i));
-            exporter.createFolder(path);
-        }
-    }
-
-    /**
-     *	Recursively export the previously-specified resource
-     */
-    protected void exportAllResources() throws InterruptedException {
-        if (resource.getType() == IResource.FILE) {
-			exportFile((IFile) resource, path);
-		} else {
-            try {
-                exportChildren(((IContainer) resource).members(), path);
-            } catch (CoreException e) {
-                // not safe to show a dialog
-                // should never happen because the file system export wizard ensures that the
-                // single resource chosen for export is both existent and accessible
-                errorTable.add(e.getStatus());
-            }
-        }
-    }
-
-    /**
-     *	Export all of the resources contained in the passed collection
-     *
-     *	@param children java.util.Enumeration
-     *	@param currentPath IPath
-     */
-    protected void exportChildren(IResource[] children, IPath currentPath)
-            throws InterruptedException {
-        for (int i = 0; i < children.length; i++) {
-            IResource child = children[i];
-            if (!child.isAccessible()) {
-				continue;
-			}
-
-            if (child.getType() == IResource.FILE) {
-				exportFile((IFile) child, currentPath);
-			} else {
-                IPath destination = currentPath.append(child.getName());
-                exporter.createFolder(destination);
-                try {
-                    exportChildren(((IContainer) child).members(), destination);
-                } catch (CoreException e) {
-                    // not safe to show a dialog
-                    // should never happen because:
-                    // i. this method is called recursively iterating over the result of #members,
-                    //		which only answers existing children
-                    // ii. there is an #isAccessible check done before #members is invoked
-                    errorTable.add(e.getStatus());
-                }
-            }
-        }
-    }
-
-    /**
-     *  Export the passed file to the specified location
-     *
-     *  @param file org.eclipse.core.resources.IFile
-     *  @param location org.eclipse.core.runtime.IPath
-     */
-    protected void exportFile(IFile file, IPath location)
-            throws InterruptedException {
-        IPath fullPath = location.append(file.getName());
-        monitor.subTask(file.getFullPath().toString());
-        String properPathString = fullPath.toOSString();
-        File targetFile = new File(properPathString);
-
-        if (targetFile.exists()) {
-            if (!targetFile.canWrite()) {
-                errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID,
-                        0, NLS.bind(DataTransferMessages.DataTransfer_cannotOverwrite, targetFile.getAbsolutePath()),
-                        null));
-                monitor.worked(1);
-                return;
-            }
-
-            if (overwriteState == OVERWRITE_NONE) {
-				return;
-			}
-
-            if (overwriteState != OVERWRITE_ALL) {
-                String overwriteAnswer = overwriteCallback
-                        .queryOverwrite(properPathString);
-
-                if (overwriteAnswer.equals(IOverwriteQuery.CANCEL)) {
-					throw new InterruptedException();
-				}
-
-                if (overwriteAnswer.equals(IOverwriteQuery.NO)) {
-                    monitor.worked(1);
-                    return;
-                }
-
-                if (overwriteAnswer.equals(IOverwriteQuery.NO_ALL)) {
-                    monitor.worked(1);
-                    overwriteState = OVERWRITE_NONE;
-                    return;
-                }
-
-                if (overwriteAnswer.equals(IOverwriteQuery.ALL)) {
-					overwriteState = OVERWRITE_ALL;
-				}
-            }
-        }
-
-        try {
-            exporter.write(file, fullPath);
-        } catch (IOException e) {
-            errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0,
-                    NLS.bind(DataTransferMessages.DataTransfer_errorExporting, fullPath, e.getMessage()), e));
-        } catch (CoreException e) {
-            errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0,
-                    NLS.bind(DataTransferMessages.DataTransfer_errorExporting, fullPath, e.getMessage()), e));
-        }
-
-        monitor.worked(1);
-        ModalContext.checkCanceled(monitor);
-    }
-
-    /**
-     *	Export the resources contained in the previously-defined
-     *	resourcesToExport collection
-     */
-    protected void exportSpecifiedResources() throws InterruptedException {
-        Iterator resources = resourcesToExport.iterator();
-        IPath initPath = (IPath) path.clone();
-
-        while (resources.hasNext()) {
-            IResource currentResource = (IResource) resources.next();
-            if (!currentResource.isAccessible()) {
-				continue;
-			}
-
-            path = initPath;
-
-            if (resource == null) {
-                // No root resource specified and creation of containment directories
-                // is required.  Create containers from depth 2 onwards (ie.- project's
-                // child inclusive) for each resource being exported.
-                if (createLeadupStructure) {
-					createLeadupDirectoriesFor(currentResource);
-				}
-
-            } else {
-                // Root resource specified.  Must create containment directories
-                // from this point onwards for each resource being exported
-                IPath containersToCreate = currentResource.getFullPath()
-                        .removeFirstSegments(
-                                resource.getFullPath().segmentCount())
-                        .removeLastSegments(1);
-
-                for (int i = 0; i < containersToCreate.segmentCount(); i++) {
-                    path = path.append(containersToCreate.segment(i));
-                    exporter.createFolder(path);
-                }
-            }
-
-            if (currentResource.getType() == IResource.FILE) {
-				exportFile((IFile) currentResource, path);
-			} else {
-                if (createContainerDirectories) {
-                    path = path.append(currentResource.getName());
-                    exporter.createFolder(path);
-                }
-
-                try {
-                    exportChildren(((IContainer) currentResource).members(),
-                            path);
-                } catch (CoreException e) {
-                    // should never happen because #isAccessible is called before #members is invoked,
-                    // which implicitly does an existence check
-                    errorTable.add(e.getStatus());
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns the status of the export operation.
-     * If there were any errors, the result is a status object containing
-     * individual status objects for each error.
-     * If there were no errors, the result is a status object with error code <code>OK</code>.
-     *
-     * @return the status
-     */
-    public IStatus getStatus() {
-        IStatus[] errors = new IStatus[errorTable.size()];
-        errorTable.toArray(errors);
-        return new MultiStatus(
-                PlatformUI.PLUGIN_ID,
-                IStatus.OK,
-                errors,
-                DataTransferMessages.FileSystemExportOperation_problemsExporting,
-                null);
-    }
-
-    /**
-     *  Answer a boolean indicating whether the passed child is a descendent
-     *  of one or more members of the passed resources collection
-     *
-     *  @return boolean
-     *  @param resources java.util.List
-     *  @param child org.eclipse.core.resources.IResource
-     */
-    protected boolean isDescendent(List resources, IResource child) {
-        if (child.getType() == IResource.PROJECT) {
-			return false;
-		}
-
-        IResource parent = child.getParent();
-        if (resources.contains(parent)) {
-			return true;
-		}
-
-        return isDescendent(resources, parent);
-    }
-
-    /**
-     *	Export the resources that were previously specified for export
-     *	(or if a single resource was specified then export it recursively)
-     */
-    public void run(IProgressMonitor progressMonitor)
-            throws InterruptedException {
-        this.monitor = progressMonitor;
-
-        if (resource != null) {
-            if (createLeadupStructure) {
-				createLeadupDirectoriesFor(resource);
-			}
-
-            if (createContainerDirectories
-                    && resource.getType() != IResource.FILE) {
-                // ensure it's a container
-                path = path.append(resource.getName());
-                exporter.createFolder(path);
-            }
-        }
-
-        try {
-            int totalWork = IProgressMonitor.UNKNOWN;
-            try {
-                if (resourcesToExport == null) {
-					totalWork = countChildrenOf(resource);
-				} else {
-					totalWork = countSelectedResources();
-				}
-            } catch (CoreException e) {
-                // Should not happen
-                errorTable.add(e.getStatus());
-            }
-            monitor.beginTask(DataTransferMessages.DataTransfer_exportingTitle, totalWork);
-            if (resourcesToExport == null) {
-                exportAllResources();
-            } else {
-                exportSpecifiedResources();
-            }
-        } finally {
-            monitor.done();
-        }
-    }
-
-    /**
-     *	Set this boolean indicating whether a directory should be created for
-     *	Folder resources that are explicitly passed for export
-     *
-     *	@param value boolean
-     */
-    public void setCreateContainerDirectories(boolean value) {
-        createContainerDirectories = value;
-    }
-
-    /**
-     *	Set this boolean indicating whether each exported resource's complete path should
-     *	include containment hierarchies as dictated by its parents
-     *
-     *	@param value boolean
-     */
-    public void setCreateLeadupStructure(boolean value) {
-        createLeadupStructure = value;
-    }
-
-    /**
-     *	Set this boolean indicating whether exported resources should automatically
-     *	overwrite existing files when a conflict occurs. If not
-     *	query the user.
-     *
-     *	@param value boolean
-     */
-    public void setOverwriteFiles(boolean value) {
-        if (value) {
-			overwriteState = OVERWRITE_ALL;
-		}
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/FileSystemExporter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/FileSystemExporter.java
deleted file mode 100644
index a09666e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/FileSystemExporter.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * Helper class for exporting resources to the file system.
- */
-public class FileSystemExporter {
-	private static final int DEFAULT_BUFFER_SIZE = 16*1024;
-	
-    /**
-     *  Creates the specified file system directory at <code>destinationPath</code>.
-     *  This creates a new file system directory.
-     *  
-     *  @param destinationPath location to which files will be written
-     */
-    public void createFolder(IPath destinationPath) {
-        new File(destinationPath.toOSString()).mkdir();
-    }
-
-    /**
-     *  Writes the passed resource to the specified location recursively.
-     *  
-     *  @param resource the resource to write out to the file system
-     *  @param destinationPath location where the resource will be written
-     *  @exception CoreException if the operation fails 
-     *  @exception IOException if an I/O error occurs when writing files
-     */
-    public void write(IResource resource, IPath destinationPath)
-            throws CoreException, IOException {
-        if (resource.getType() == IResource.FILE) {
-			writeFile((IFile) resource, destinationPath);
-		} else {
-			writeChildren((IContainer) resource, destinationPath);
-		}
-    }
-
-    /**
-     *  Exports the passed container's children
-     */
-    protected void writeChildren(IContainer folder, IPath destinationPath)
-            throws CoreException, IOException {
-        if (folder.isAccessible()) {
-            IResource[] children = folder.members();
-            for (int i = 0; i < children.length; i++) {
-                IResource child = children[i];
-                writeResource(child, destinationPath.append(child.getName()));
-            }
-        }
-    }
-
-    /**
-     *  Writes the passed file resource to the specified destination on the local
-     *  file system
-     */
-    protected void writeFile(IFile file, IPath destinationPath)
-            throws IOException, CoreException {
-        OutputStream output = null;
-        InputStream contentStream = null;
-
-        try {
-            contentStream = new BufferedInputStream(file.getContents(false));
-            output = new BufferedOutputStream(new FileOutputStream(destinationPath.toOSString()));
-            // for large files, need to make sure the chunk size can be handled by the VM
-            int available = contentStream.available();
-            available = available <= 0 ? DEFAULT_BUFFER_SIZE : available;
-            int chunkSize = Math.min(DEFAULT_BUFFER_SIZE, available);
-            byte[] readBuffer = new byte[chunkSize];
-            int n = contentStream.read(readBuffer);
-
-            while (n > 0) {
-            	// only write the number of bytes read
-                output.write(readBuffer, 0, n);
-                n = contentStream.read(readBuffer);
-            }
-        } finally {
-            if (contentStream != null) {
-            	// wrap in a try-catch to ensure attempt to close output stream
-            	try {
-            		contentStream.close();
-            	}
-            	catch(IOException e){
-            		IDEWorkbenchPlugin
-							.log(
-									"Error closing input stream for file: " + file.getLocation(), e); //$NON-NLS-1$
-            	}
-			}
-        	if (output != null) {
-        		// propogate this error to the user
-           		output.close();
-			}
-        }
-    }
-
-    /**
-     *  Writes the passed resource to the specified location recursively
-     */
-    protected void writeResource(IResource resource, IPath destinationPath)
-            throws CoreException, IOException {
-        if (resource.getType() == IResource.FILE) {
-			writeFile((IFile) resource, destinationPath);
-		} else {
-            createFolder(destinationPath);
-            writeChildren((IContainer) resource, destinationPath);
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/IDataTransferHelpContextIds.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/IDataTransferHelpContextIds.java
deleted file mode 100644
index 8f8ea38..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/IDataTransferHelpContextIds.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Help context ids for the data transfer wizards.
- * <p>
- * This interface contains constants only; it is not intended to be implemented
- * or extended.
- * </p>
- * 
- */
-public interface IDataTransferHelpContextIds {
-    public static final String PREFIX = PlatformUI.PLUGIN_ID + "."; //$NON-NLS-1$
-
-    // Wizard pages
-    public static final String FILE_SYSTEM_EXPORT_WIZARD_PAGE = PREFIX
-            + "file_system_export_wizard_page"; //$NON-NLS-1$
-
-    public static final String FILE_SYSTEM_IMPORT_WIZARD_PAGE = PREFIX
-            + "file_system_import_wizard_page"; //$NON-NLS-1$
-
-    public static final String ZIP_FILE_EXPORT_WIZARD_PAGE = PREFIX
-            + "zip_file_export_wizard_page"; //$NON-NLS-1$
-
-    public static final String ZIP_FILE_IMPORT_WIZARD_PAGE = PREFIX
-            + "zip_file_import_wizard_page"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/IFileExporter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/IFileExporter.java
deleted file mode 100644
index 14ec986..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/IFileExporter.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.IOException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * Interface for file exporters of different file formats.  Used by the
- * zip and tar.gz exporters.
- * 
- * @since 3.1
- */
-public interface IFileExporter {
-
-	/**
-	 * Do all required cleanup now that we are finished with the
-     * currently-open file.
-     * 
-	 * @throws IOException
-	 */
-	public void finished() throws IOException;
-	
-	/**
-	 * Write the passed resource to the current archive
-	 * 
-	 * @param resource
-	 * @param destinationPath
-	 * @throws IOException
-	 * @throws CoreException
-	 */
-    public void write(IFile resource, String destinationPath)
-    	throws IOException, CoreException;
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ILeveledImportStructureProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ILeveledImportStructureProvider.java
deleted file mode 100644
index 9011d7e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ILeveledImportStructureProvider.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Red Hat, Inc - setStrip(int), getStrip()
- *******************************************************************************/
-
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-
-import org.eclipse.ui.wizards.datatransfer.IImportStructureProvider;
-
-/**
- * Interface which can provide structure and content information for an archive 
- * element. Used by the import wizards to abstract the commonalities between 
- * importing from the a zip file and importing from a tar file.
- * 
- * @since 3.1
- */
-public interface ILeveledImportStructureProvider extends IImportStructureProvider {
-	/**
-	 * Returns the entry that this importer uses as the root sentinel.
-	 * 
-	 * @return root entry of the archive file
-	 */
-	public abstract Object getRoot();
-
-	/**
-	 * Tells the provider to strip N number of directories from the path of any
-	 * path or file name returned by the IImportStructureProvider (Default=0).
-	 * 
-	 * @param level
-	 *            The number of directories to strip
-	 */
-	public abstract void setStrip(int level);
-
-	/**
-	 * Returns the number of directories that this IImportStructureProvider is
-	 * stripping from the file name
-	 * 
-	 * @return int Number of entries
-	 */
-	public abstract int getStrip();
-	
-	/**
-	 * Close the archive file that was used to create this leveled structure provider.
-	 * 
-	 * @return <code>true</code> if the archive was closed successfully
-	 */
-	public boolean closeArchive();
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/MinimizedFileSystemElement.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/MinimizedFileSystemElement.java
deleted file mode 100644
index 35ece1e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/MinimizedFileSystemElement.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.ui.dialogs.FileSystemElement;
-import org.eclipse.ui.model.AdaptableList;
-import org.eclipse.ui.wizards.datatransfer.IImportStructureProvider;
-
-/**
- * The <code>MinimizedFileSystemElement</code> is a <code>FileSystemElement</code> that knows
- * if it has been populated or not.
- */
-public class MinimizedFileSystemElement extends FileSystemElement {
-    private boolean populated = false;
-
-    /**
-     * Create a <code>MinimizedFileSystemElement</code> with the supplied name and parent.
-     * @param name the name of the file element this represents
-     * @param parent the containing parent
-     * @param isDirectory indicated if this could have children or not
-     */
-    public MinimizedFileSystemElement(String name, FileSystemElement parent,
-            boolean isDirectory) {
-        super(name, parent, isDirectory);
-    }
-
-    /**
-     * Returns a list of the files that are immediate children. Use the supplied provider
-     * if it needs to be populated.
-     * of this folder.
-     */
-    public AdaptableList getFiles(IImportStructureProvider provider) {
-        if (!populated) {
-            populate(provider);
-        }
-        return super.getFiles();
-    }
-
-    /**
-     * Returns a list of the folders that are immediate children. Use the supplied provider
-     * if it needs to be populated.
-     * of this folder.
-     */
-    public AdaptableList getFolders(IImportStructureProvider provider) {
-        if (!populated) {
-            populate(provider);
-        }
-        return super.getFolders();
-    }
-
-    /**
-     * Return whether or not population has happened for the receiver.
-     */
-    boolean isPopulated() {
-        return this.populated;
-    }
-
-    /**
-     * Populate the files and folders of the receiver using the suppliec structure provider.
-     * @param provider org.eclipse.ui.wizards.datatransfer.IImportStructureProvider
-     */
-    private void populate(IImportStructureProvider provider) {
-
-        Object fileSystemObject = getFileSystemObject();
-
-        List children = provider.getChildren(fileSystemObject);
-        if (children == null) {
-            children = new ArrayList(1);
-        }
-        Iterator childrenEnum = children.iterator();
-        while (childrenEnum.hasNext()) {
-            Object child = childrenEnum.next();
-
-            String elementLabel = provider.getLabel(child);
-            //Create one level below
-            MinimizedFileSystemElement result = new MinimizedFileSystemElement(
-                    elementLabel, this, provider.isFolder(child));
-            result.setFileSystemObject(child);
-        }
-        setPopulated();
-    }
-
-    /**
-     * Set whether or not population has happened for the receiver to true.
-     */
-   public void setPopulated() {
-        this.populated = true;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarEntry.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarEntry.java
deleted file mode 100644
index 009151a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarEntry.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-/**
- * Representation of a file in a tar archive.
- * 
- * @since 3.1
- */
-public class TarEntry implements Cloneable
-{	
-	private String name;
-	private long mode, time, size;
-	private int type;
-	int filepos;
-
-	/**
-	 * Entry type for normal files.
-	 */
-	public static final int FILE = '0';
-
-	/**
-	 * Entry type for directories.
-	 */
-	public static final int DIRECTORY = '5';
-	
-	/**
-	 * Create a new TarEntry for a file of the given name at the
-	 * given position in the file.
-	 * 
-	 * @param name filename
-	 * @param pos position in the file in bytes
-	 */
-	TarEntry(String name, int pos) {
-		this.name = name;
-		mode = 0644;
-		type = FILE;
-		filepos = pos;
-		time = System.currentTimeMillis() / 1000;
-	}
-
-	/**
-	 * Create a new TarEntry for a file of the given name.
-	 * 
-	 * @param name filename
-	 */
-	public TarEntry(String name) {
-		this(name, -1);
-	}
-
-	/**
-	 * Returns the type of this file, one of FILE, LINK, SYM_LINK,
-	 * CHAR_DEVICE, BLOCK_DEVICE, DIRECTORY or FIFO.
-	 * 
-	 * @return file type
-	 */
-	public int getFileType() {
-		return type;
-	}
-
-	/**
-	 * Returns the mode of the file in UNIX permissions format.
-	 * 
-	 * @return file mode
-	 */
-	public long getMode() {
-		return mode;
-	}
-
-	/**
-	 * Returns the name of the file.
-	 * 
-	 * @return filename
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Returns the size of the file in bytes.
-	 * 
-	 * @return filesize
-	 */
-	public long getSize() {
-		return size;
-	}
-
-	/**
-	 * Returns the modification time of the file in seconds since January
-	 * 1st 1970.
-	 * 
-	 * @return time
-	 */
-	public long getTime() {
-		return time;
-	}
-
-	/**
-	 * Sets the type of the file, one of FILE, LINK, SYMLINK, CHAR_DEVICE,
-	 * BLOCK_DEVICE, or DIRECTORY.
-	 * 
-	 * @param type
-	 */
-	public void setFileType(int type) {
-		this.type = type;
-	}
-
-	/**
-	 * Sets the mode of the file in UNIX permissions format.
-	 * 
-	 * @param mode
-	 */
-	public void setMode(long mode) {
-		this.mode = mode;
-	}
-
-	/**
-	 * Sets the size of the file in bytes.
-	 * 
-	 * @param size
-	 */
-	public void setSize(long size) {
-		this.size = size;
-	}
-
-	/**
-	 * Sets the modification time of the file in seconds since January
-	 * 1st 1970.
-	 * 
-	 * @param time
-	 */
-	public void setTime(long time) {
-		this.time = time;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarException.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarException.java
deleted file mode 100644
index 22054de..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarException.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-/**
- * Exception generated upon encountering corrupted tar files.
- */
-public class TarException extends Exception {
-	/**
-	 * Generated serial version UID for this class.
-	 */
-	private static final long serialVersionUID = 2886671254518853528L;
-
-    /**
-     * Constructs a TarException without a detail string.
-     */
-    public TarException() {
-    	super();
-    }
-	
-	/**
-     * Constructs a TarException with the specified detail string.
-     *
-     * @param s the detail string
-     */
-    public TarException(String s) {
-    	super(s);
-    }
-	
-    /**
-     * Constructs a TarException with the specified detail string.
-     *
-     * @param s the detail string
-     * @param cause the cause
-     */
-    public TarException(String s, Throwable cause) {
-    	super(s, cause);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarFile.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarFile.java
deleted file mode 100644
index d57dbd1..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarFile.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- * Remy Chi Jian Suen <remy.suen@gmail.com> - Bug 243347 TarFile should not throw NPE in finalize()
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Enumeration;
-import java.util.zip.GZIPInputStream;
-
-
-/**
- * Reads a .tar or .tar.gz archive file, providing an index enumeration
- * and allows for accessing an InputStream for arbitrary files in the
- * archive.
- * 
- * @since 3.1
- */
-public class TarFile {
-	private File file;
-	private TarInputStream entryEnumerationStream;
-	private TarEntry curEntry;
-	private TarInputStream entryStream;
-
-	private InputStream internalEntryStream;
-	
-	/**
-	 * Create a new TarFile for the given file.
-	 * 
-	 * @param file
-	 * @throws TarException
-	 * @throws IOException
-	 */
-	public TarFile(File file) throws TarException, IOException {
-		this.file = file;
-
-		InputStream in = new FileInputStream(file);
-		// First, check if it's a GZIPInputStream.
-		try {
-			in = new GZIPInputStream(in);
-		} catch(IOException e) {
-			//If it is not compressed we close
-			//the old one and recreate
-			in.close();
-			in = new FileInputStream(file);
-		}
-		try {
-			entryEnumerationStream = new TarInputStream(in);
-		} catch (TarException ex) {
-			in.close();
-			throw ex;
-		}
-		curEntry = entryEnumerationStream.getNextEntry();
-	}
-	
-	/**
-	 * Close the tar file input stream.
-	 * 
-	 * @throws IOException if the file cannot be successfully closed
-	 */
-	public void close() throws IOException {
-		if (entryEnumerationStream != null)
-			entryEnumerationStream.close();
-		if (internalEntryStream != null)
-			internalEntryStream.close();
-	}
-
-	/**
-	 * Create a new TarFile for the given path name.
-	 * 
-	 * @param filename
-	 * @throws TarException
-	 * @throws IOException
-	 */
-	public TarFile(String filename) throws TarException, IOException {
-		this(new File(filename));
-	}
-
-	/**
-	 * Returns an enumeration cataloguing the tar archive.
-	 * 
-	 * @return enumeration of all files in the archive
-	 */
-	public Enumeration entries() {
-		return new Enumeration() {
-			public boolean hasMoreElements() {
-				return (curEntry != null);
-			}
-			
-			public Object nextElement() {
-				TarEntry oldEntry = curEntry;
-				try {
-					curEntry = entryEnumerationStream.getNextEntry();
-				} catch(TarException e) {
-					curEntry = null;
-				} catch(IOException e) {
-					curEntry = null;
-				}
-				return oldEntry;
-			}
-		};
-	}
-
-	/**
-	 * Returns a new InputStream for the given file in the tar archive.
-	 * 
-	 * @param entry
-	 * @return an input stream for the given file
-	 * @throws TarException
-	 * @throws IOException
-	 */
-	public InputStream getInputStream(TarEntry entry) throws TarException, IOException {
-		if(entryStream == null || !entryStream.skipToEntry(entry)) {
-			if (internalEntryStream != null) {
-				internalEntryStream.close();
-			}
-			internalEntryStream = new FileInputStream(file);
-			// First, check if it's a GZIPInputStream.
-			try {
-				internalEntryStream = new GZIPInputStream(internalEntryStream);
-			} catch(IOException e) {
-				//If it is not compressed we close
-				//the old one and recreate
-				internalEntryStream.close();
-				internalEntryStream = new FileInputStream(file);
-			}
-			entryStream = new TarInputStream(internalEntryStream, entry) {
-				public void close() {
-					// Ignore close() since we want to reuse the stream.
-				}
-			};
-		}
-		return entryStream;
-	}
-
-	/**
-	 * Returns the path name of the file this archive represents.
-	 * 
-	 * @return path
-	 */
-	public String getName() {
-		return file.getPath();
-	}
-
-	/* (non-Javadoc)
-	 * @see java.util.zip.ZipFile#finalize()
-	 * 
-	 */
-	protected void finalize() throws Throwable {
-		close();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarFileExporter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarFileExporter.java
deleted file mode 100644
index 055a0e8..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarFileExporter.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.BufferedOutputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.util.zip.GZIPOutputStream;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourceAttributes;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * Exports resources to a .tar.gz file.
- *
- * @since 3.1
- */
-public class TarFileExporter implements IFileExporter {
-    private TarOutputStream outputStream;
-    private GZIPOutputStream gzipOutputStream;
-    
-
-    /**
-     *	Create an instance of this class.
-     *
-     *	@param filename java.lang.String
-     *	@param compress boolean
-     *	@exception java.io.IOException
-     */
-    public TarFileExporter(String filename, boolean compress) throws IOException {
-    	if(compress) {
-    		gzipOutputStream = new GZIPOutputStream(new FileOutputStream(filename));
-    		outputStream = new TarOutputStream(new BufferedOutputStream(gzipOutputStream));
-    	} else {
-    		outputStream = new TarOutputStream(new BufferedOutputStream(new FileOutputStream(filename)));
-    	}
-    }
-
-    /**
-     *	Do all required cleanup now that we're finished with the
-     *	currently-open .tar.gz
-     *
-     *	@exception java.io.IOException
-     */
-    public void finished() throws IOException {
-        outputStream.close();
-        if(gzipOutputStream != null) {
-        	gzipOutputStream.close();
-        }
-    }
-
-    /**
-     *	Write the contents of the file to the tar archive.
-     *
-     *	@param entry
-     *	@param contents
-     *  @exception java.io.IOException
-     *  @exception org.eclipse.core.runtime.CoreException
-     */
-    private void write(TarEntry entry, IFile contents) throws IOException, CoreException {
-		final URI location = contents.getLocationURI();
-		if (location == null) {
-			throw new FileNotFoundException(contents.getFullPath().toOSString());
-		}
-    	
-    	InputStream contentStream = contents.getContents(false);
-    	entry.setSize(EFS.getStore(location).fetchInfo().getLength());
-    	outputStream.putNextEntry(entry);
-        try {
-            int n;
-            byte[] readBuffer = new byte[4096];
-            while ((n = contentStream.read(readBuffer)) > 0) {
-                outputStream.write(readBuffer, 0, n);
-            }
-        } finally {
-            if (contentStream != null) {
-				contentStream.close();
-			}
-        }
-
-    	outputStream.closeEntry();    	
-    }
-
-    /**
-     *  Write the passed resource to the current archive.
-     *
-     *  @param resource org.eclipse.core.resources.IFile
-     *  @param destinationPath java.lang.String
-     *  @exception java.io.IOException
-     *  @exception org.eclipse.core.runtime.CoreException
-     */
-    public void write(IFile resource, String destinationPath)
-            throws IOException, CoreException {
-
-        TarEntry newEntry = new TarEntry(destinationPath);
-        if(resource.getLocalTimeStamp() != IResource.NULL_STAMP) {
-        	newEntry.setTime(resource.getLocalTimeStamp() / 1000);
-        }
-        ResourceAttributes attributes = resource.getResourceAttributes();
-        if (attributes != null && attributes.isExecutable()) {
-        	newEntry.setMode(newEntry.getMode() | 0111);
-        }
-        if (attributes != null && attributes.isReadOnly()) {
-        	newEntry.setMode(newEntry.getMode() & ~0222);
-        }
-        write(newEntry, resource);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarInputStream.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarInputStream.java
deleted file mode 100644
index 27ac0f9..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarInputStream.java
+++ /dev/null
@@ -1,344 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Input stream for reading files in ustar format (tar) compatible
- * with the specification in IEEE Std 1003.1-2001.  Also supports
- * long filenames encoded using the GNU @LongLink extension.
- * 
- * @since 3.1
- */
-public class TarInputStream extends FilterInputStream
-{
-	private int nextEntry = 0;
-	private int nextEOF = 0;
-	private int filepos = 0;
-	private int bytesread = 0;
-	private TarEntry firstEntry = null;
-	private String longLinkName = null;
-
-	/**
-	 * Creates a new tar input stream on the given input stream.
-	 * 
-	 * @param in input stream
-	 * @throws TarException
-	 * @throws IOException
-	 */
-	public TarInputStream(InputStream in) throws TarException, IOException {
-		super(in);
-
-		// Read in the first TarEntry to make sure
-		// the input is a valid tar file stream.
-		firstEntry = getNextEntry();
-	}
-
-	/**
-	 * Create a new tar input stream, skipping ahead to the given entry
-	 * in the file.
-	 * 
-	 * @param in input stream
-	 * @param entry skips to this entry in the file
-	 * @throws TarException
-	 * @throws IOException
-	 */
-	TarInputStream(InputStream in, TarEntry entry) throws TarException, IOException {
-		super(in);
-		skipToEntry(entry);
-	}
-
-	/**
-	 *  The checksum of a tar file header is simply the sum of the bytes in
-	 *  the header.
-	 * 
-	 * @param header
-	 * @return checksum
-	 */
-	private long headerChecksum(byte[] header) {
-		long sum = 0;
-		for(int i = 0; i < 512; i++) {
-			sum += header[i] & 0xff;
-		}
-		return sum;
-	}
-
-	/**
-	 * Skips ahead to the position of the given entry in the file.
-	 * 
-	 * @param entry
-	 * @returns false if the entry has already been passed
-	 * @throws TarException
-	 * @throws IOException
-	 */
-	boolean skipToEntry(TarEntry entry) throws TarException, IOException {
-		int bytestoskip = entry.filepos - bytesread;
-		if(bytestoskip < 0) {
-			return false;
-		}
-		while(bytestoskip > 0) {
-			long ret = in.skip(bytestoskip);
-			if(ret < 0) {
-				throw new IOException("early end of stream"); //$NON-NLS-1$
-			}
-			bytestoskip -= ret;
-			bytesread += ret;
-		}
-		filepos = entry.filepos;
-		nextEntry = 0;
-		nextEOF = 0;
-		// Read next header to seek to file data.
-		getNextEntry();
-		return true;
-	}
-
-	/**
-	 * Returns true if the header checksum is correct.
-	 * 
-	 * @param header
-	 * @return true if this header has a valid checksum
-	 */
-	private boolean isValidTarHeader(byte[] header) {
-		long fileChecksum, calculatedChecksum;
-		int pos, i;
-		
-		pos = 148;
-		StringBuffer checksumString = new StringBuffer();
-		for(i = 0; i < 8; i++) {
-			if(header[pos + i] == ' ') {
-				continue;
-			}
-			if(header[pos + i] == 0 || !Character.isDigit((char) header[pos + i])) {
-				break;
-			}
-			checksumString.append((char) header[pos + i]);
-		}
-		if(checksumString.length() == 0) {
-			return false;
-		}
-		if(checksumString.charAt(0) != '0') {
-			checksumString.insert(0, '0');
-		}
-		try {
-			fileChecksum = Long.decode(checksumString.toString()).longValue();
-		} catch(NumberFormatException exception) {
-			//This is not valid if it cannot be parsed
-			return false;
-		}
-
-		// Blank out the checksum.
-		for(i = 0; i < 8; i++) {
-			header[pos + i] = ' ';
-		}
-		calculatedChecksum = headerChecksum(header);
-
-		return (fileChecksum == calculatedChecksum);
-	}
-
-	/**
-	 * Returns the next entry in the tar file.  Does not handle
-	 * GNU @LongLink extensions.
-	 * 
-	 * @return the next entry in the tar file
-	 * @throws TarException
-	 * @throws IOException
-	 */
-	TarEntry getNextEntryInternal() throws TarException, IOException {
-		byte[] header = new byte[512];
-		int pos = 0;
-		int i;
-
-		if(firstEntry != null) {
-			TarEntry entryReturn = firstEntry;
-			firstEntry = null;
-			return entryReturn;
-		}
-
-		while(nextEntry > 0) {
-			long ret = in.skip(nextEntry);
-			if(ret < 0) {
-				throw new IOException("early end of stream"); //$NON-NLS-1$
-			}
-			nextEntry -= ret;
-			bytesread += ret;
-		}
-
-		int bytestoread = 512;
-		while(bytestoread > 0) {
-			int ret = super.read(header, 512 - bytestoread, bytestoread);
-			if( ret < 0 ) {
-				throw new IOException("early end of stream"); //$NON-NLS-1$
-			}
-			bytestoread -= ret;
-			bytesread += ret;
-		}
-
-		// If we have a header of all zeros, this marks the end of the file.
-		if(headerChecksum(header) == 0) {
-			// We are at the end of the file.
-			if(filepos > 0) {
-				return null;
-			}
-			
-			// Invalid stream.
-			throw new TarException("not in tar format"); //$NON-NLS-1$
-		}
-		
-		// Validate checksum.
-		if(!isValidTarHeader(header)) {
-			throw new TarException("not in tar format"); //$NON-NLS-1$
-		}
-
-		while (pos < 100 && header[pos] != 0) {
-			pos++;
-		}
-		String name = new String(header, 0, pos, "UTF8"); //$NON-NLS-1$
-		// Prepend the prefix here.
-		pos = 345;
-		if(header[pos] != 0) {
-			while (pos < 500 && header[pos] != 0) {
-				pos++;
-			}
-			String prefix = new String(header, 345, pos - 345, "UTF8"); //$NON-NLS-1$
-			name = prefix + "/" + name; //$NON-NLS-1$
-		}
-		
-		TarEntry entry;
-		if(longLinkName != null) {
-			entry = new TarEntry(longLinkName, filepos);
-			longLinkName = null;
-		} else {
-			entry = new TarEntry(name, filepos);
-		}
-		if(header[156] != 0) {
-			entry.setFileType(header[156]);
-		}
-		
-		pos = 100;
-		StringBuffer mode = new StringBuffer();
-		for(i = 0; i < 8; i++) {
-			if(header[pos + i] == 0) {
-				break;
-			}
-			if(header[pos + i] == ' ') {
-				continue;
-			}
-			mode.append((char) header[pos + i]);
-		}
-		if(mode.length() > 0 && mode.charAt(0) != '0') {
-			mode.insert(0, '0');
-		}
-		try {
-			long fileMode = Long.decode(mode.toString()).longValue();
-			entry.setMode(fileMode);
-		} catch(NumberFormatException nfe) {
-			throw new TarException(DataTransferMessages.TarImport_invalid_tar_format, nfe);
-		}
-		
-		pos = 100 + 24;
-		StringBuffer size = new StringBuffer();
-		for(i = 0; i < 12; i++) {
-			if(header[pos + i] == 0) {
-				break;
-			}
-			if(header[pos + i] == ' ') {
-				continue;
-			}
-			size.append((char) header[pos + i]);
-		}
-		if(size.charAt(0) != '0') {
-			size.insert(0, '0');
-		}
-		int fileSize;
-		try {
-			fileSize = Integer.decode(size.toString()).intValue();
-		} catch(NumberFormatException nfe) {
-			throw new TarException(DataTransferMessages.TarImport_invalid_tar_format, nfe);
-		}
-
-		entry.setSize(fileSize);
-		nextEOF = fileSize;
-		if(fileSize % 512 > 0) {
-			nextEntry = fileSize + (512 - (fileSize % 512));
-		} else {
-			nextEntry = fileSize;
-		}
-		filepos += (nextEntry + 512);
-		return entry;
-	}
-
-	/**
-	 * Moves ahead to the next file in the tar archive and returns
-	 * a TarEntry object describing it.
-	 * 
-	 * @return the next entry in the tar file
-	 * @throws TarException
-	 * @throws IOException
-	 */
-	public TarEntry getNextEntry() throws TarException, IOException {
-		TarEntry entry = getNextEntryInternal();
-
-		if(entry != null && entry.getName().equals("././@LongLink")) { //$NON-NLS-1$
-			// This is a GNU extension for doing long filenames.
-			// We get a file called ././@LongLink which just contains
-			// the real pathname.
-			byte[] longNameData = new byte[(int) entry.getSize()];
-			int bytesread = 0;
-			while (bytesread < longNameData.length) {
-				int cur = read(longNameData, bytesread, longNameData.length - bytesread);
-				if (cur < 0) {
-					throw new IOException("early end of stream"); //$NON-NLS-1$
-				}
-				bytesread += cur;
-			}
-
-			int pos = 0;
-			while (pos < longNameData.length && longNameData[pos] != 0) {
-				pos++;
-			}
-			longLinkName = new String(longNameData, 0, pos, "UTF8"); //$NON-NLS-1$
-			return getNextEntryInternal();
-		}
-		return entry;
-	}
-
-	/* (non-Javadoc)
-	 * @see java.io.FilterInputStream#read(byte[], int, int)
-	 */
-	public int read(byte[] b, int off, int len) throws IOException {
-		if(nextEOF == 0) {
-			return -1;
-		}
-		if(len > nextEOF) {
-			len = nextEOF;
-		}
-		int size = super.read(b, off, len);
-		nextEntry -= size;
-		nextEOF -= size;
-		bytesread += size;
-		return size;
-	}
-
-	/* (non-Javadoc)
-	 * @see java.io.FilterInputStream#read()
-	 */
-	public int read() throws IOException {
-		byte[] data = new byte[1];
-		int size = read(data, 0, 1);
-		if (size < 0) {
-			return size;
-		}
-		return data[0];
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarLeveledStructureProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarLeveledStructureProvider.java
deleted file mode 100644
index 03a240e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarLeveledStructureProvider.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Red Hat, Inc - Was TarFileStructureProvider, performed changes from 
- *     IImportStructureProvider to ILeveledImportStructureProvider
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.ResourceAttributes;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * This class provides information regarding the context structure and content
- * of specified tar file entry objects.
- * 
- * @since 3.1
- */
-public class TarLeveledStructureProvider implements
-		ILeveledImportStructureProvider {
-	private TarFile tarFile;
-
-	private TarEntry root = new TarEntry("/");//$NON-NLS-1$
-
-	private Map children;
-
-	private Map directoryEntryCache = new HashMap();
-
-	private int stripLevel;
-
-	/**
-	 * Creates a <code>TarFileStructureProvider</code>, which will operate on
-	 * the passed tar file.
-	 * 
-	 * @param sourceFile
-	 *            the source TarFile
-	 */
-	public TarLeveledStructureProvider(TarFile sourceFile) {
-		super();
-		tarFile = sourceFile;
-		root.setFileType(TarEntry.DIRECTORY);
-	}
-
-	/**
-	 * Creates a new container tar entry with the specified name, iff it has 
-	 * not already been created. If the parent of the given element does not
-	 * already exist it will be recursively created as well.
-	 * @param pathname The path representing the container
-	 * @return The element represented by this pathname (it may have already existed)
-	 */
-	protected TarEntry createContainer(IPath pathname) {
-		TarEntry existingEntry = (TarEntry) directoryEntryCache.get(pathname);
-		if (existingEntry != null) {
-			return existingEntry;
-		}
-
-		TarEntry parent;
-		if (pathname.segmentCount() == 1) {
-			parent = root;
-		} else {
-			parent = createContainer(pathname.removeLastSegments(1));
-		}
-		TarEntry newEntry = new TarEntry(pathname.toString());
-		newEntry.setFileType(TarEntry.DIRECTORY);
-		directoryEntryCache.put(pathname, newEntry);
-		List childList = new ArrayList();
-		children.put(newEntry, childList);
-
-		List parentChildList = (List) children.get(parent);
-		parentChildList.add(newEntry);
-		return newEntry;
-	}
-
-	/**
-	 * Creates a new tar file entry with the specified name.
-	 */
-	protected void createFile(TarEntry entry) {
-		IPath pathname = new Path(entry.getName());
-		TarEntry parent;
-		if (pathname.segmentCount() == 1) {
-			parent = root;
-		} else {
-			parent = (TarEntry) directoryEntryCache.get(pathname
-					.removeLastSegments(1));
-		}
-
-		List childList = (List) children.get(parent);
-		childList.add(entry);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IImportStructureProvider
-	 */
-	public List getChildren(Object element) {
-		if (children == null) {
-			initialize();
-		}
-
-		return ((List) children.get(element));
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IImportStructureProvider
-	 */
-	public InputStream getContents(Object element) {
-		try {
-			return tarFile.getInputStream((TarEntry) element);
-		} catch (TarException e) {
-			IDEWorkbenchPlugin.log(e.getLocalizedMessage(), e);
-			return null;
-		} catch (IOException e) {
-			IDEWorkbenchPlugin.log(e.getLocalizedMessage(), e);
-			return null;
-		}
-	}
-
-	/**
-	 * Returns the resource attributes for this file.
-	 * 
-	 * @param element
-	 * @return the attributes of the file
-	 */
-	public ResourceAttributes getResourceAttributes(Object element) {
-		ResourceAttributes attributes = new ResourceAttributes();
-		TarEntry entry = (TarEntry) element;
-		attributes.setExecutable((entry.getMode() & 0100) != 0);
-		attributes.setReadOnly((entry.getMode() & 0200) == 0);
-		return attributes;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IImportStructureProvider
-	 */
-	public String getFullPath(Object element) {
-		return stripPath(((TarEntry) element).getName());
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IImportStructureProvider
-	 */
-	public String getLabel(Object element) {
-		if (element.equals(root)) {
-			return ((TarEntry) element).getName();
-		}
-
-		return stripPath(new Path(((TarEntry) element).getName()).lastSegment());
-	}
-
-	/**
-	 * Returns the entry that this importer uses as the root sentinel.
-	 * 
-	 * @return TarEntry entry
-	 */
-	public Object getRoot() {
-		return root;
-	}
-
-	/**
-	 * Returns the tar file that this provider provides structure for.
-	 * 
-	 * @return TarFile file
-	 */
-	public TarFile getTarFile() {
-		return tarFile;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.internal.wizards.datatransfer.ILeveledImportStructureProvider#closeArchive()
-	 */
-	public boolean closeArchive(){
-		try {
-			getTarFile().close();
-		} catch (IOException e) {
-			IDEWorkbenchPlugin.log(DataTransferMessages.ZipImport_couldNotClose
-					+ getTarFile().getName(), e);
-			return false;
-		}
-		return true;
-	}
-	
-	/**
-	 * Initializes this object's children table based on the contents of the
-	 * specified source file.
-	 */
-	protected void initialize() {
-		children = new HashMap(1000);
-		
-		children.put(root, new ArrayList());
-		Enumeration entries = tarFile.entries();
-		while (entries.hasMoreElements()) {
-			TarEntry entry = (TarEntry) entries.nextElement();
-			IPath path = new Path(entry.getName()).addTrailingSeparator();
-			
-			if (entry.getFileType() == TarEntry.DIRECTORY) {
-				createContainer(path);
-			} else
-			{
-				// Ensure the container structure for all levels above this is initialized
-				// Once we hit a higher-level container that's already added we need go no further
-				int pathSegmentCount = path.segmentCount();
-				if (pathSegmentCount > 1) {
-					createContainer(path.uptoSegment(pathSegmentCount - 1));
-				}
-				createFile(entry);
-			}
-		}
-	}
-	
-	/*
-	 * (non-Javadoc) Method declared on IImportStructureProvider
-	 */
-	public boolean isFolder(Object element) {
-		return (((TarEntry) element).getFileType() == TarEntry.DIRECTORY);
-	}
-
-	/*
-	 * Strip the leading directories from the path
-	 */
-	private String stripPath(String path) {
-		String pathOrig = new String(path);
-		for (int i = 0; i < stripLevel; i++) {
-			int firstSep = path.indexOf('/');
-			// If the first character was a seperator we must strip to the next
-			// seperator as well
-			if (firstSep == 0) {
-				path = path.substring(1);
-				firstSep = path.indexOf('/');
-			}
-			// No seperator wasw present so we're in a higher directory right
-			// now
-			if (firstSep == -1) {
-				return pathOrig;
-			}
-			path = path.substring(firstSep);
-		}
-		return path;
-	}
-
-	public void setStrip(int level) {
-		stripLevel = level;
-	}
-
-	public int getStrip() {
-		return stripLevel;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarOutputStream.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarOutputStream.java
deleted file mode 100644
index d2c184e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/TarOutputStream.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * Output stream for writing ustar archive files (tar) compatible
- * with the specification in IEEE Std 1003.1-2001.
- *
- * @since 3.1
- */
-public class TarOutputStream extends FilterOutputStream {
-	
-	private int byteswritten = 0;
-	private int datapos = 0;
-	private long cursize = 0;
-
-	/**
-	 * Creates a new tar output stream.
-	 * 
-	 * @param out the stream to write to
-	 */
-	public TarOutputStream(OutputStream out) {
-		super(out);
-	}
-
-	/**
-	 * Close the output stream and write any necessary padding.
-	 */
-	public void close() throws IOException {
-		// Spec says to write 1024 bytes of zeros at the end.
-		byte[] zeros = new byte[1024];
-		cursize = 1024;
-		write(zeros, 0, 1024);
-
-		// Default block size for tar files is 10240, so we have to
-		// pad the end of the file to be a multiple of this size.
-		if((byteswritten % 10240) != 0) {
-			int length = 10240 - (byteswritten % 10240);
-			cursize = length;
-			zeros = new byte[length];
-			write(zeros, 0, length);
-		}
-		super.close();
-	}
-
-	/**
-	 * Close the current entry in the tar file.  Must be called
-	 * after each entry is completed.
-	 * 
-	 * @throws IOException
-	 */
-	public void closeEntry() throws IOException {
-		byte[] data = new byte[512];
-		int len = 512 - datapos;
-		if(len > 0 && datapos > 0) {
-			cursize = len;
-			write(data, 0, len);
-		}
-	}
-
-	/**
-	 *  The checksum of a tar file header is simply the sum of the bytes in
-	 *  the header.
-	 * 
-	 * @param header
-	 * @return checksum
-	 */
-	private long headerChecksum(byte[] header) {
-		long sum = 0;
-		for(int i = 0; i < 512; i++) {
-			sum += header[i] & 0xff;
-		}
-		return sum;
-	}
-
-	/**
-	 * Adds an entry for a new file in the tar archive.
-	 * 
-	 * @param e TarEntry describing the file
-	 * @throws IOException
-	 */
-	public void putNextEntry(TarEntry e) throws IOException {
-		byte[] header = new byte[512];
-		String filename = e.getName();
-		String prefix = null;
-		int pos, i;
-		
-		/* Split filename into name and prefix if necessary. */
-		byte[] filenameBytes = filename.getBytes("UTF8"); //$NON-NLS-1$
-		if (filenameBytes.length > 99) {
-			int seppos = filename.lastIndexOf('/');
-			if(seppos == -1) {
-				throw new IOException("filename too long"); //$NON-NLS-1$
-			}
-			prefix = filename.substring(0, seppos);
-			filename = filename.substring(seppos + 1);
-			filenameBytes = filename.getBytes("UTF8"); //$NON-NLS-1$
-			if (filenameBytes.length > 99) {
-				throw new IOException("filename too long"); //$NON-NLS-1$
-			}
-		}
-		
-		/* Filename. */
-		pos = 0;
-		System.arraycopy(filenameBytes, 0, header, 0, filenameBytes.length);
-		pos += 100;
-		
-		/* File mode. */
-		StringBuffer mode = new StringBuffer(Long.toOctalString(e.getMode()));
-		while(mode.length() < 7) {
-			mode.insert(0,'0');
-		}
-		for(i = 0; i < 7; i++) {
-			header[pos + i] = (byte) mode.charAt(i);
-		}
-		pos += 8;
-		
-		/* UID. */
-		header[pos] = '0';
-		pos += 8;
-		
-		/* GID. */
-		header[pos] = '0';
-		pos += 8;
-		
-		/* Length of the file. */
-		String length = Long.toOctalString(e.getSize());
-		for(i = 0; i < length.length(); i++) {
-			header[pos + i] = (byte) length.charAt(i);
-		}
-		pos += 12;
-		
-		/* mtime */
-		String mtime = Long.toOctalString(e.getTime());
-		for(i = 0; i < mtime.length(); i++) {
-			header[pos + i] = (byte) mtime.charAt(i);
-		}
-		pos += 12;
-		
-		/* "Blank" out the checksum. */
-		for(i = 0; i < 8; i++) {
-			header[pos + i] = ' ';
-		}
-		pos += 8;
-		
-		/* Link flag. */
-		header[pos] = (byte) e.getFileType();
-		pos += 1;
-
-		/* Link destination. */
-		pos += 100;
-
-		/* Add ustar header. */
-		String ustar = "ustar 00"; //$NON-NLS-1$
-		for(i = 0; i < ustar.length(); i++) {
-			header[pos + i] = (byte) ustar.charAt(i);
-		}
-		header[pos + 5] = 0;
-		pos += 8;
-		
-		/* Username. */
-		String uname = "nobody"; //$NON-NLS-1$
-		for(i = 0; i < uname.length(); i++) {
-			header[pos + i] = (byte) uname.charAt(i);
-		}
-		pos += 32;
-		
-		
-		/* Group name. */
-		String gname = "nobody"; //$NON-NLS-1$
-		for(i = 0; i < gname.length(); i++) {
-			header[pos + i] = (byte) gname.charAt(i);
-		}
-		pos += 32;
-		
-		/* Device major. */
-		pos += 8;
-
-		/* Device minor. */
-		pos += 8;
-
-		/* File prefix. */
-		if(prefix != null) {
-			byte[] prefixBytes = prefix.getBytes("UTF8"); //$NON-NLS-1$
-			if (prefixBytes.length > 155) {
-				throw new IOException("prefix too large"); //$NON-NLS-1$
-			}
-			System.arraycopy(prefixBytes, 0, header, pos, prefixBytes.length);
-		}
-
-		long sum = headerChecksum(header);
-		pos = 100 + 8 + 8 + 8 + 12 + 12;
-		String sumval = Long.toOctalString(sum);
-		for(i = 0; i < sumval.length(); i++) {
-			header[pos + i] = (byte) sumval.charAt(i);
-		}
-
-		cursize = 512;
-		write(header, 0, 512);
-		
-		cursize = e.getSize();
-	}
-
-	/**
-	 * Writes data for the current file into the archive.
-	 */
-	public void write(byte[] b, int off, int len) throws IOException {
-		super.write(b, off, len);
-		datapos = (datapos + len) % 512;
-		byteswritten += len;
-		cursize -= len;
-		if(cursize < 0) {
-			throw new IOException("too much data written for current file"); //$NON-NLS-1$
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardArchiveFileResourceExportPage1.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardArchiveFileResourceExportPage1.java
deleted file mode 100644
index d0b8d01..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardArchiveFileResourceExportPage1.java
+++ /dev/null
@@ -1,404 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-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.FileDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.PlatformUI;
-
-/**
- *	Page 1 of the base resource export-to-archive Wizard.
- *
- *	@since 3.1
- */
-public class WizardArchiveFileResourceExportPage1 extends
-		WizardFileSystemResourceExportPage1 {
-
-    // widgets
-    protected Button compressContentsCheckbox;
-    
-    private Button zipFormatButton;
-    private Button targzFormatButton;
-
-    // dialog store id constants
-    private final static String STORE_DESTINATION_NAMES_ID = "WizardZipFileResourceExportPage1.STORE_DESTINATION_NAMES_ID"; //$NON-NLS-1$
-
-    private final static String STORE_CREATE_STRUCTURE_ID = "WizardZipFileResourceExportPage1.STORE_CREATE_STRUCTURE_ID"; //$NON-NLS-1$
-
-    private final static String STORE_COMPRESS_CONTENTS_ID = "WizardZipFileResourceExportPage1.STORE_COMPRESS_CONTENTS_ID"; //$NON-NLS-1$
-
-    /**
-     *	Create an instance of this class. 
-     *
-     *	@param name java.lang.String
-     */
-    protected WizardArchiveFileResourceExportPage1(String name,
-            IStructuredSelection selection) {
-        super(name, selection);
-    }
-
-    /**
-     * Create an instance of this class
-     * @param selection the selection
-     */
-    public WizardArchiveFileResourceExportPage1(IStructuredSelection selection) {
-        this("zipFileExportPage1", selection); //$NON-NLS-1$
-        setTitle(DataTransferMessages.ArchiveExport_exportTitle);
-        setDescription(DataTransferMessages.ArchiveExport_description);
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IDialogPage.
-     */
-    public void createControl(Composite parent) {
-        super.createControl(parent);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
-                IDataTransferHelpContextIds.ZIP_FILE_EXPORT_WIZARD_PAGE);
-    }
-
-    /**
-     *	Create the export options specification widgets.
-     *
-     */
-    protected void createOptionsGroupButtons(Group optionsGroup) {
-    	Font font = optionsGroup.getFont();
-    	optionsGroup.setLayout(new GridLayout(2, true));
-    	
-    	Composite left = new Composite(optionsGroup, SWT.NONE);
-    	left.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false));
-    	left.setLayout(new GridLayout(1, true));
-
-        createFileFormatOptions(left, font);
-        
-        // compress... checkbox
-        compressContentsCheckbox = new Button(left, SWT.CHECK
-                | SWT.LEFT);
-        compressContentsCheckbox.setText(DataTransferMessages.ZipExport_compressContents);
-        compressContentsCheckbox.setFont(font);
-
-        Composite right = new Composite(optionsGroup, SWT.NONE);
-        right.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false));
-        right.setLayout(new GridLayout(1, true));
-
-        createDirectoryStructureOptions(right, font);
-
-        // initial setup
-        createDirectoryStructureButton.setSelection(true);
-        createSelectionOnlyButton.setSelection(false);
-        compressContentsCheckbox.setSelection(true);
-    }
-
-    /**
-     * Create the buttons for the group that determine if the entire or
-     * selected directory structure should be created.
-     * @param optionsGroup
-     * @param font
-     */
-    protected void createFileFormatOptions(Composite optionsGroup, Font font) {
-        // create directory structure radios
-        zipFormatButton = new Button(optionsGroup, SWT.RADIO | SWT.LEFT);
-        zipFormatButton.setText(DataTransferMessages.ArchiveExport_saveInZipFormat);
-        zipFormatButton.setSelection(true);
-        zipFormatButton.setFont(font);
-
-        // create directory structure radios
-        targzFormatButton = new Button(optionsGroup, SWT.RADIO | SWT.LEFT);
-        targzFormatButton.setText(DataTransferMessages.ArchiveExport_saveInTarFormat);
-        targzFormatButton.setSelection(false);
-        targzFormatButton.setFont(font);
-    }    
-    
-    /**
-     * Returns a boolean indicating whether the directory portion of the
-     * passed pathname is valid and available for use.
-     */
-    protected boolean ensureTargetDirectoryIsValid(String fullPathname) {
-        int separatorIndex = fullPathname.lastIndexOf(File.separator);
-
-        if (separatorIndex == -1) {
-			return true;
-		}
-
-        return ensureTargetIsValid(new File(fullPathname.substring(0,
-                separatorIndex)));
-    }
-
-    /**
-     * Returns a boolean indicating whether the passed File handle is
-     * is valid and available for use.
-     */
-    protected boolean ensureTargetFileIsValid(File targetFile) {
-        if (targetFile.exists() && targetFile.isDirectory()) {
-            displayErrorDialog(DataTransferMessages.ZipExport_mustBeFile);
-            giveFocusToDestination();
-            return false;
-        }
-
-        if (targetFile.exists()) {
-            if (targetFile.canWrite()) {
-                if (!queryYesNoQuestion(DataTransferMessages.ZipExport_alreadyExists)) {
-					return false;
-				}
-            } else {
-                displayErrorDialog(DataTransferMessages.ZipExport_alreadyExistsError);
-                giveFocusToDestination();
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Ensures that the target output file and its containing directory are
-     * both valid and able to be used.  Answer a boolean indicating validity.
-     */
-    protected boolean ensureTargetIsValid() {
-        String targetPath = getDestinationValue();
-
-        if (!ensureTargetDirectoryIsValid(targetPath)) {
-			return false;
-		}
-
-        if (!ensureTargetFileIsValid(new File(targetPath))) {
-			return false;
-		}
-
-        return true;
-    }
-
-    /**
-     *  Export the passed resource and recursively export all of its child resources
-     *  (iff it's a container).  Answer a boolean indicating success.
-     */
-    protected boolean executeExportOperation(ArchiveFileExportOperation op) {
-        op.setCreateLeadupStructure(createDirectoryStructureButton
-                .getSelection());
-        op.setUseCompression(compressContentsCheckbox.getSelection());
-        op.setUseTarFormat(targzFormatButton.getSelection());
-
-        try {
-            getContainer().run(true, true, op);
-        } catch (InterruptedException e) {
-            return false;
-        } catch (InvocationTargetException e) {
-            displayErrorDialog(e.getTargetException());
-            return false;
-        }
-
-        IStatus status = op.getStatus();
-        if (!status.isOK()) {
-            ErrorDialog.openError(getContainer().getShell(),
-                    DataTransferMessages.DataTransfer_exportProblems,
-                    null, // no special message
-                    status);
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * The Finish button was pressed.  Try to do the required work now and answer
-     * a boolean indicating success.  If false is returned then the wizard will
-     * not close.
-     * @returns boolean
-     */
-    public boolean finish() {
-    	List resourcesToExport = getWhiteCheckedResources();
-    	
-        if (!ensureTargetIsValid()) {
-			return false;
-		}
-
-        //Save dirty editors if possible but do not stop if not all are saved
-        saveDirtyEditors();
-        // about to invoke the operation so save our state
-        saveWidgetValues();
-
-        return executeExportOperation(new ArchiveFileExportOperation(null,
-                resourcesToExport, getDestinationValue()));
-    }
-
-    /**
-     *	Answer the string to display in the receiver as the destination type
-     */
-    protected String getDestinationLabel() {
-        return DataTransferMessages.ArchiveExport_destinationLabel;
-    }
-
-    /**
-     *	Answer the contents of self's destination specification widget.  If this
-     *	value does not have a suffix then add it first.
-     */
-    protected String getDestinationValue() {
-        String idealSuffix = getOutputSuffix();
-        String destinationText = super.getDestinationValue();
-
-        // only append a suffix if the destination doesn't already have a . in 
-        // its last path segment.  
-        // Also prevent the user from selecting a directory.  Allowing this will 
-        // create a ".zip" file in the directory
-        if (destinationText.length() != 0
-                && !destinationText.endsWith(File.separator)) {
-            int dotIndex = destinationText.lastIndexOf('.');
-            if (dotIndex != -1) {
-                // the last path seperator index
-                int pathSepIndex = destinationText.lastIndexOf(File.separator);
-                if (pathSepIndex != -1 && dotIndex < pathSepIndex) {
-                    destinationText += idealSuffix;
-                }
-            } else {
-                destinationText += idealSuffix;
-            }
-        }
-
-        return destinationText;
-    }
-
-    /**
-     *	Answer the suffix that files exported from this wizard should have.
-     *	If this suffix is a file extension (which is typically the case)
-     *	then it must include the leading period character.
-     *
-     */
-    protected String getOutputSuffix() {
-    	if(zipFormatButton.getSelection()) {
-        	return ".zip"; //$NON-NLS-1$
-    	} else if(compressContentsCheckbox.getSelection()) {
-    		return ".tar.gz"; //$NON-NLS-1$
-    	} else {
-    		return ".tar"; //$NON-NLS-1$
-    	}
-    }
-
-    /**
-     *	Open an appropriate destination browser so that the user can specify a source
-     *	to import from
-     */
-    protected void handleDestinationBrowseButtonPressed() {
-        FileDialog dialog = new FileDialog(getContainer().getShell(), SWT.SAVE);
-        dialog.setFilterExtensions(new String[] { "*.zip;*.tar.gz;*.tar;*.tgz", "*.*" }); //$NON-NLS-1$ //$NON-NLS-2$
-        dialog.setText(DataTransferMessages.ArchiveExport_selectDestinationTitle);
-        String currentSourceString = getDestinationValue();
-        int lastSeparatorIndex = currentSourceString
-                .lastIndexOf(File.separator);
-        if (lastSeparatorIndex != -1) {
-			dialog.setFilterPath(currentSourceString.substring(0,
-                    lastSeparatorIndex));
-		}
-        String selectedFileName = dialog.open();
-
-        if (selectedFileName != null) {
-            setErrorMessage(null);
-            setDestinationValue(selectedFileName);
-        }
-    }
-
-    /**
-     *	Hook method for saving widget values for restoration by the next instance
-     *	of this class.
-     */
-    protected void internalSaveWidgetValues() {
-        // update directory names history
-        IDialogSettings settings = getDialogSettings();
-        if (settings != null) {
-            String[] directoryNames = settings
-                    .getArray(STORE_DESTINATION_NAMES_ID);
-            if (directoryNames == null) {
-				directoryNames = new String[0];
-			}
-
-            directoryNames = addToHistory(directoryNames, getDestinationValue());
-            settings.put(STORE_DESTINATION_NAMES_ID, directoryNames);
-
-            settings.put(STORE_CREATE_STRUCTURE_ID,
-                    createDirectoryStructureButton.getSelection());
-
-            settings.put(STORE_COMPRESS_CONTENTS_ID, compressContentsCheckbox
-                    .getSelection());
-        }
-    }
-
-    /**
-     *	Hook method for restoring widget values to the values that they held
-     *	last time this wizard was used to completion.
-     */
-    protected void restoreWidgetValues() {
-        IDialogSettings settings = getDialogSettings();
-        if (settings != null) {
-            String[] directoryNames = settings
-                    .getArray(STORE_DESTINATION_NAMES_ID);
-            if (directoryNames == null || directoryNames.length == 0) {
-				return; // ie.- no settings stored
-			}
-
-            // destination
-            setDestinationValue(directoryNames[0]);
-            for (int i = 0; i < directoryNames.length; i++) {
-				addDestinationItem(directoryNames[i]);
-			}
-
-            boolean setStructure = settings
-                    .getBoolean(STORE_CREATE_STRUCTURE_ID);
-
-            createDirectoryStructureButton.setSelection(setStructure);
-            createSelectionOnlyButton.setSelection(!setStructure);
-
-            compressContentsCheckbox.setSelection(settings
-                    .getBoolean(STORE_COMPRESS_CONTENTS_ID));
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.wizards.datatransfer.WizardFileSystemResourceExportPage1#destinationEmptyMessage()
-     */
-    protected String destinationEmptyMessage() {
-        return DataTransferMessages.ArchiveExport_destinationEmpty;
-    }
-    
-    /**
-     *	Answer a boolean indicating whether the receivers destination specification
-     *	widgets currently all contain valid values.
-     */
-    protected boolean validateDestinationGroup() {
-    	String destinationValue = getDestinationValue();
-    	if (destinationValue.endsWith(".tar")) { //$NON-NLS-1$
-    		compressContentsCheckbox.setSelection(false);
-    		targzFormatButton.setSelection(true);
-    		zipFormatButton.setSelection(false);
-    	} else if (destinationValue.endsWith(".tar.gz") //$NON-NLS-1$
-				|| destinationValue.endsWith(".tgz")) { //$NON-NLS-1$
-    		compressContentsCheckbox.setSelection(true);
-    		targzFormatButton.setSelection(true);
-    		zipFormatButton.setSelection(false);
-    	} else if (destinationValue.endsWith(".zip")) { //$NON-NLS-1$
-    		zipFormatButton.setSelection(true);
-    		targzFormatButton.setSelection(false);
-    	}
-    	
-    	return super.validateDestinationGroup();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardArchiveFileResourceImportPage1.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardArchiveFileResourceImportPage1.java
deleted file mode 100644
index 7df5911..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardArchiveFileResourceImportPage1.java
+++ /dev/null
@@ -1,503 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Red Hat, Inc - Extracted several methods to ArchiveFileManipulations
- *     Oliver Schaefer <oliver.schaefer@mbtech-services.com> - Fix for
- *     		 Bug 221649 [Import/Export] ZipFileImportWizard has no option to change the FILE_IMPORT_MASK
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-import java.util.zip.ZipException;
-import java.util.zip.ZipFile;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Listener;
-
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.model.AdaptableList;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.wizards.datatransfer.ImportOperation;
-
-
-/**
- *	Page 1 of the base resource import-from-archive Wizard.
- *
- *	Note that importing from .jar is identical to importing from .zip, so
- *	all references to .zip in this class are equally applicable to .jar
- *	references.
- *
- *	@since 3.1
- */
-public class WizardArchiveFileResourceImportPage1 extends
-        WizardFileSystemResourceImportPage1 implements Listener {
-
-    ILeveledImportStructureProvider structureProvider;
-
-    // constants
-    private static final String[] FILE_IMPORT_MASK = { "*.jar;*.zip;*.tar;*.tar.gz;*.tgz", "*.*" }; //$NON-NLS-1$ //$NON-NLS-2$
-
-    // dialog store id constants
-    private final static String STORE_SOURCE_NAMES_ID = "WizardZipFileResourceImportPage1.STORE_SOURCE_NAMES_ID"; //$NON-NLS-1$
-
-    private final static String STORE_OVERWRITE_EXISTING_RESOURCES_ID = "WizardZipFileResourceImportPage1.STORE_OVERWRITE_EXISTING_RESOURCES_ID"; //$NON-NLS-1$
-
-    private final static String STORE_SELECTED_TYPES_ID = "WizardZipFileResourceImportPage1.STORE_SELECTED_TYPES_ID"; //$NON-NLS-1$
-	
-	private final String[] fileImportMask;
-
-    /**
-     *	Creates an instance of this class
-     * @param aWorkbench IWorkbench
-     * @param selection IStructuredSelection
-     */
-    public WizardArchiveFileResourceImportPage1(IWorkbench aWorkbench,
-            IStructuredSelection selection) {
-        this(aWorkbench, selection, null);
-    }
-	
-	/**
-     *	Creates an instance of this class
-     * @param aWorkbench IWorkbench
-     * @param selection IStructuredSelection
-	 * @param fileImportMask != null: override default mask
-     */
-    public WizardArchiveFileResourceImportPage1(IWorkbench aWorkbench,
-            IStructuredSelection selection, String[] fileImportMask) {
-        super("zipFileImportPage1", aWorkbench, selection); //$NON-NLS-1$
-		
-        setTitle(DataTransferMessages.ArchiveExport_exportTitle);
-        setDescription(DataTransferMessages.ArchiveImport_description);
-		
-		if(fileImportMask == null)
-			this.fileImportMask = FILE_IMPORT_MASK;
-		else
-			this.fileImportMask = fileImportMask;
-    }
-
-    /**
-     * Called when the user presses the Cancel button. Return a boolean
-     * indicating permission to close the wizard.
-     *
-     * @return boolean
-     */
-    public boolean cancel() {
-        disposeStructureProvider();
-        return true;
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IDialogPage.
-     */
-    public void createControl(Composite parent) {
-        super.createControl(parent);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
-                IDataTransferHelpContextIds.ZIP_FILE_IMPORT_WIZARD_PAGE);
-    }
-
-    /**
-     *	Create the options specification widgets. There is only one
-     * in this case so create no group.
-     *
-     *	@param parent org.eclipse.swt.widgets.Composite
-     */
-    protected void createOptionsGroup(Composite parent) {
-
-        // overwrite... checkbox
-        overwriteExistingResourcesCheckbox = new Button(parent, SWT.CHECK);
-        overwriteExistingResourcesCheckbox.setText(DataTransferMessages.FileImport_overwriteExisting);
-        overwriteExistingResourcesCheckbox.setFont(parent.getFont());
-    }
-
-    private boolean validateSourceFile(String fileName) {
-    	if(ArchiveFileManipulations.isTarFile(fileName)) {
-    		TarFile tarFile = getSpecifiedTarSourceFile(fileName);
-			if (tarFile != null) {
-				ArchiveFileManipulations.closeTarFile(tarFile, getShell());
-				return true;
-			}
-			return false;
-    	}
-    	ZipFile zipFile = getSpecifiedZipSourceFile(fileName);
-    	if(zipFile != null) {
-    		ArchiveFileManipulations.closeZipFile(zipFile, getShell());
-    		return true;
-    	}
-    	return false;
-    }
-
-    /**
-     *	Answer a boolean indicating whether the specified source currently exists
-     *	and is valid (ie.- proper format)
-     */
-    private boolean ensureZipSourceIsValid() {
-        ZipFile specifiedFile = getSpecifiedZipSourceFile();
-        if (specifiedFile == null) {
-            return false;
-        }
-        return ArchiveFileManipulations.closeZipFile(specifiedFile, getShell());
-    }
-
-    private boolean ensureTarSourceIsValid() {
-    	TarFile specifiedFile = getSpecifiedTarSourceFile();
-    	if( specifiedFile == null ) {
-    		return false;
-    	}
-    	return ArchiveFileManipulations.closeTarFile(specifiedFile, getShell());
-    }
-
-    /**
-     *	Answer a boolean indicating whether the specified source currently exists
-     *	and is valid (ie.- proper format)
-     */
-    protected boolean ensureSourceIsValid() {
-    	if (ArchiveFileManipulations.isTarFile(sourceNameField.getText())) {
-    		return ensureTarSourceIsValid();
-    	}
-    	return ensureZipSourceIsValid();
-    }
-    
-    /**
-     * The Finish button was pressed.  Try to do the required work now and answer
-     * a boolean indicating success.  If <code>false</code> is returned then the
-     * wizard will not close.
-     *
-     * @return boolean
-     */
-    public boolean finish() {
-        if (!super.finish()) {
-			return false;
-		}
-
-        disposeStructureProvider();
-		return true;
-	}
-
-    /**
-     * Closes the structure provider and sets
-     * the field to <code>null</code>.
-     * 
-     * @since 3.4
-     */
-	private void disposeStructureProvider() {
-		ArchiveFileManipulations.closeStructureProvider(structureProvider, getShell());
-		structureProvider= null;
-	}
-
-    /**
-     * Returns a content provider for <code>FileSystemElement</code>s that returns
-     * only files as children.
-     */
-    protected ITreeContentProvider getFileProvider() {
-        return new WorkbenchContentProvider() {
-            public Object[] getChildren(Object o) {
-                if (o instanceof MinimizedFileSystemElement) {
-                    MinimizedFileSystemElement element = (MinimizedFileSystemElement) o;
-                    AdaptableList l = element.getFiles(structureProvider);
-                    return l.getChildren(element);
-                }
-                return new Object[0];
-            }
-        };
-    }
-
-    /**
-     *	Answer the root FileSystemElement that represents the contents of the
-     *	currently-specified .zip file.  If this FileSystemElement is not
-     *	currently defined then create and return it.
-     */
-    protected MinimizedFileSystemElement getFileSystemTree() {
-		disposeStructureProvider();
-
-    	if(ArchiveFileManipulations.isTarFile(sourceNameField.getText())) {
-        	TarFile sourceTarFile = getSpecifiedTarSourceFile();
-        	if (sourceTarFile == null) {
-				return null;
-        	}
-        	structureProvider= new TarLeveledStructureProvider(sourceTarFile);
-			return selectFiles(structureProvider.getRoot(), structureProvider);
-    	}
-
-        ZipFile sourceFile = getSpecifiedZipSourceFile();
-        if (sourceFile == null) {
-            return null;
-        }
-
-        structureProvider = new ZipLeveledStructureProvider(sourceFile);
-		return selectFiles(structureProvider.getRoot(), structureProvider);
-    }
-
-    /**
-     * Returns a content provider for <code>FileSystemElement</code>s that returns
-     * only folders as children.
-     */
-    protected ITreeContentProvider getFolderProvider() {
-        return new WorkbenchContentProvider() {
-            public Object[] getChildren(Object o) {
-                if (o instanceof MinimizedFileSystemElement) {
-                    MinimizedFileSystemElement element = (MinimizedFileSystemElement) o;
-                    AdaptableList l = element.getFolders(structureProvider);
-                    return l.getChildren(element);
-                }
-                return new Object[0];
-            }
-
-            public boolean hasChildren(Object o) {
-                if (o instanceof MinimizedFileSystemElement) {
-                    MinimizedFileSystemElement element = (MinimizedFileSystemElement) o;
-                    if (element.isPopulated()) {
-						return getChildren(element).length > 0;
-					}
-
-                    //If we have not populated then wait until asked
-                    return true;
-                }
-                return false;
-            }
-        };
-    }
-
-    /**
-     *	Answer the string to display as the label for the source specification field
-     */
-    protected String getSourceLabel() {
-        return DataTransferMessages.ArchiveImport_fromFile;
-    }
-
-    /**
-     *	Answer a handle to the zip file currently specified as being the source.
-     *	Return null if this file does not exist or is not of valid format.
-     */
-    protected ZipFile getSpecifiedZipSourceFile() {
-        return getSpecifiedZipSourceFile(sourceNameField.getText());
-    }
-
-    /**
-     *	Answer a handle to the zip file currently specified as being the source.
-     *	Return null if this file does not exist or is not of valid format.
-     */
-    private ZipFile getSpecifiedZipSourceFile(String fileName) {
-        if (fileName.length() == 0) {
-			return null;
-		}
-
-        try {
-            return new ZipFile(fileName);
-        } catch (ZipException e) {
-            displayErrorDialog(DataTransferMessages.ZipImport_badFormat);
-        } catch (IOException e) {
-            displayErrorDialog(DataTransferMessages.ZipImport_couldNotRead);
-        }
-
-        sourceNameField.setFocus();
-        return null;
-    }
-
-    /**
-     *	Answer a handle to the zip file currently specified as being the source.
-     *	Return null if this file does not exist or is not of valid format.
-     */
-    protected TarFile getSpecifiedTarSourceFile() {
-        return getSpecifiedTarSourceFile(sourceNameField.getText());
-    }
-
-    /**
-     *	Answer a handle to the zip file currently specified as being the source.
-     *	Return null if this file does not exist or is not of valid format.
-     */
-    private TarFile getSpecifiedTarSourceFile(String fileName) {
-        if (fileName.length() == 0) {
-			return null;
-		}
-
-        try {
-            return new TarFile(fileName);
-        } catch (TarException e) {
-        	displayErrorDialog(DataTransferMessages.TarImport_badFormat);
-        } catch (IOException e) {
-            displayErrorDialog(DataTransferMessages.ZipImport_couldNotRead);
-        }
-
-        sourceNameField.setFocus();
-        return null;
-    }
-
-    /**
-     *	Open a FileDialog so that the user can specify the source
-     *	file to import from
-     */
-    protected void handleSourceBrowseButtonPressed() {
-        String selectedFile = queryZipFileToImport();
-
-        if (selectedFile != null) {
-            //Be sure it is valid before we go setting any names
-            if (!selectedFile.equals(sourceNameField.getText())
-					&& validateSourceFile(selectedFile)) {
-                setSourceName(selectedFile);
-                selectionGroup.setFocus();
-            }
-        }
-    }
-
-    /**
-     *  Import the resources with extensions as specified by the user
-     */
-    protected boolean importResources(List fileSystemObjects) {
-    	ILeveledImportStructureProvider importStructureProvider = null;
-		if (ArchiveFileManipulations.isTarFile(sourceNameField.getText())) {
-    		if( ensureTarSourceIsValid()) {
-	    		TarFile tarFile = getSpecifiedTarSourceFile();
-	    		importStructureProvider = new TarLeveledStructureProvider(tarFile);
-    		}
-    	} else if(ensureZipSourceIsValid()) {
-    		ZipFile zipFile = getSpecifiedZipSourceFile();
-    		importStructureProvider = new ZipLeveledStructureProvider(zipFile);
-    	}
-    	
-    	if (importStructureProvider == null) {
-    		return false;
-    	}
-    	
-		ImportOperation operation = new ImportOperation(getContainerFullPath(),
-				importStructureProvider.getRoot(), importStructureProvider, this,
-				fileSystemObjects);
-
-		operation.setContext(getShell());
-		if (!executeImportOperation(operation))
-			return false;
-		
-		ArchiveFileManipulations.closeStructureProvider(importStructureProvider, getShell());
-		return true;
-    }
-
-    /**
-     * Initializes the specified operation appropriately.
-     */
-    protected void initializeOperation(ImportOperation op) {
-        op.setOverwriteResources(overwriteExistingResourcesCheckbox
-                .getSelection());
-    }
-
-    /**
-     * Opens a file selection dialog and returns a string representing the
-     * selected file, or <code>null</code> if the dialog was canceled.
-     */
-    protected String queryZipFileToImport() {
-        FileDialog dialog = new FileDialog(sourceNameField.getShell(), SWT.OPEN);
-        dialog.setFilterExtensions(this.fileImportMask);
-        dialog.setText(DataTransferMessages.ArchiveImportSource_title);
-
-        String currentSourceString = sourceNameField.getText();
-        int lastSeparatorIndex = currentSourceString
-                .lastIndexOf(File.separator);
-        if (lastSeparatorIndex != -1) {
-			dialog.setFilterPath(currentSourceString.substring(0,
-                    lastSeparatorIndex));
-		}
-
-        return dialog.open();
-    }
-
-    /**
-     *	Repopulate the view based on the currently entered directory.
-     */
-    protected void resetSelection() {
-
-        super.resetSelection();
-        setAllSelections(true);
-    }
-
-    /**
-     *	Use the dialog store to restore widget values to the values that they held
-     *	last time this wizard was used to completion
-     */
-    protected void restoreWidgetValues() {
-        IDialogSettings settings = getDialogSettings();
-        if (settings != null) {
-            String[] sourceNames = settings.getArray(STORE_SOURCE_NAMES_ID);
-            if (sourceNames == null) {
-				return; // ie.- no settings stored
-			}
-
-            // set filenames history
-            for (int i = 0; i < sourceNames.length; i++) {
-				sourceNameField.add(sourceNames[i]);
-			}
-
-            // radio buttons and checkboxes
-            overwriteExistingResourcesCheckbox.setSelection(settings
-                    .getBoolean(STORE_OVERWRITE_EXISTING_RESOURCES_ID));
-        }
-    }
-
-    /**
-     * 	Since Finish was pressed, write widget values to the dialog store so that they
-     *	will persist into the next invocation of this wizard page.
-     *
-     *	Note that this method is identical to the one that appears in the superclass.
-     *	This is necessary because proper overriding of instance variables is not occurring.
-     */
-    protected void saveWidgetValues() {
-        IDialogSettings settings = getDialogSettings();
-        if (settings != null) {
-            // update source names history
-            String[] sourceNames = settings.getArray(STORE_SOURCE_NAMES_ID);
-            if (sourceNames == null) {
-				sourceNames = new String[0];
-			}
-
-            sourceNames = addToHistory(sourceNames, sourceNameField.getText());
-            settings.put(STORE_SOURCE_NAMES_ID, sourceNames);
-
-            // update specific types to import history
-            String[] selectedTypesNames = settings
-                    .getArray(STORE_SELECTED_TYPES_ID);
-            if (selectedTypesNames == null) {
-				selectedTypesNames = new String[0];
-			}
-
-            settings.put(STORE_OVERWRITE_EXISTING_RESOURCES_ID,
-                    overwriteExistingResourcesCheckbox.getSelection());
-        }
-    }
-
-    /**
-     *	Answer a boolean indicating whether self's source specification
-     *	widgets currently all contain valid values.
-     */
-    protected boolean validateSourceGroup() {
-
-        //If there is nothing being provided to the input then there is a problem
-		if (structureProvider == null) {
-            setMessage(SOURCE_EMPTY_MESSAGE);
-            enableButtonGroup(false);
-            return false;
-        }
-        
-        List resourcesToExport = selectionGroup.getAllWhiteCheckedItems();
-        if (resourcesToExport.size() == 0){
-        	setErrorMessage(DataTransferMessages.FileImport_noneSelected);
-        	return false;
-        }
-        
-        enableButtonGroup(true);
-        setErrorMessage(null);
-        return true;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardFileSystemResourceExportPage1.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardFileSystemResourceExportPage1.java
deleted file mode 100644
index cab5ecc..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardFileSystemResourceExportPage1.java
+++ /dev/null
@@ -1,521 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-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.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-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.DirectoryDialog;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.WizardExportResourcesPage;
-
-
-/**
- *	Page 1 of the base resource export-to-file-system Wizard
- */
-public class WizardFileSystemResourceExportPage1 extends
-        WizardExportResourcesPage implements Listener {
-
-	// widgets
-    private Combo destinationNameField;
-
-    private Button destinationBrowseButton;
-
-    protected Button overwriteExistingFilesCheckbox;
-
-    protected Button createDirectoryStructureButton;
-
-    protected Button createSelectionOnlyButton;
-
-    // dialog store id constants
-    private static final String STORE_DESTINATION_NAMES_ID = "WizardFileSystemResourceExportPage1.STORE_DESTINATION_NAMES_ID"; //$NON-NLS-1$
-
-    private static final String STORE_OVERWRITE_EXISTING_FILES_ID = "WizardFileSystemResourceExportPage1.STORE_OVERWRITE_EXISTING_FILES_ID"; //$NON-NLS-1$
-
-    private static final String STORE_CREATE_STRUCTURE_ID = "WizardFileSystemResourceExportPage1.STORE_CREATE_STRUCTURE_ID"; //$NON-NLS-1$
-
-    //messages
-    private static final String SELECT_DESTINATION_MESSAGE = DataTransferMessages.FileExport_selectDestinationMessage;
-
-    private static final String SELECT_DESTINATION_TITLE = DataTransferMessages.FileExport_selectDestinationTitle;
- 
-
-    /**
-     *	Create an instance of this class
-     */
-    protected WizardFileSystemResourceExportPage1(String name,
-            IStructuredSelection selection) {
-        super(name, selection);
-    }
-
-    /**
-     * Create an instance of this class.
-     *
-     * @param selection the selection
-     */
-    public WizardFileSystemResourceExportPage1(IStructuredSelection selection) {
-        this("fileSystemExportPage1", selection); //$NON-NLS-1$
-        setTitle(DataTransferMessages.DataTransfer_fileSystemTitle);
-        setDescription(DataTransferMessages.FileExport_exportLocalFileSystem);
-    }
-
-    /**
-     *	Add the passed value to self's destination widget's history
-     *
-     *	@param value java.lang.String
-     */
-    protected void addDestinationItem(String value) {
-        destinationNameField.add(value);
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IDialogPage.
-     */
-    public void createControl(Composite parent) {
-        super.createControl(parent);
-        giveFocusToDestination();
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
-                IDataTransferHelpContextIds.FILE_SYSTEM_EXPORT_WIZARD_PAGE);
-    }
-
-    /**
-     *	Create the export destination specification widgets
-     *
-     *	@param parent org.eclipse.swt.widgets.Composite
-     */
-    protected void createDestinationGroup(Composite parent) {
-
-        Font font = parent.getFont();
-        // destination specification group
-        Composite destinationSelectionGroup = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 3;
-        destinationSelectionGroup.setLayout(layout);
-        destinationSelectionGroup.setLayoutData(new GridData(
-                GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
-        destinationSelectionGroup.setFont(font);
-
-        Label destinationLabel = new Label(destinationSelectionGroup, SWT.NONE);
-        destinationLabel.setText(getDestinationLabel());
-        destinationLabel.setFont(font);
-
-        // destination name entry field
-        destinationNameField = new Combo(destinationSelectionGroup, SWT.SINGLE
-                | SWT.BORDER);
-        destinationNameField.addListener(SWT.Modify, this);
-        destinationNameField.addListener(SWT.Selection, this);
-        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-                | GridData.GRAB_HORIZONTAL);
-        data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-        destinationNameField.setLayoutData(data);
-        destinationNameField.setFont(font);
-
-        // destination browse button
-        destinationBrowseButton = new Button(destinationSelectionGroup,
-                SWT.PUSH);
-        destinationBrowseButton.setText(DataTransferMessages.DataTransfer_browse);
-        destinationBrowseButton.addListener(SWT.Selection, this);
-        destinationBrowseButton.setFont(font);
-        setButtonLayoutData(destinationBrowseButton);
-
-        new Label(parent, SWT.NONE); // vertical spacer
-    }
-
-    /**
-     * Create the buttons in the options group.
-     */
-
-    protected void createOptionsGroupButtons(Group optionsGroup) {
-
-        Font font = optionsGroup.getFont();
-        createOverwriteExisting(optionsGroup, font);
-
-        createDirectoryStructureOptions(optionsGroup, font);
-    }
-
-    /**
-     * Create the buttons for the group that determine if the entire or
-     * selected directory structure should be created.
-     * @param optionsGroup
-     * @param font
-     */
-    protected void createDirectoryStructureOptions(Composite optionsGroup, Font font) {
-        // create directory structure radios
-        createDirectoryStructureButton = new Button(optionsGroup, SWT.RADIO
-                | SWT.LEFT);
-        createDirectoryStructureButton.setText(DataTransferMessages.FileExport_createDirectoryStructure);
-        createDirectoryStructureButton.setSelection(false);
-        createDirectoryStructureButton.setFont(font);
-
-        // create directory structure radios
-        createSelectionOnlyButton = new Button(optionsGroup, SWT.RADIO
-                | SWT.LEFT);
-        createSelectionOnlyButton.setText(DataTransferMessages.FileExport_createSelectedDirectories);
-        createSelectionOnlyButton.setSelection(true);
-        createSelectionOnlyButton.setFont(font);
-    }
-
-    /**
-     * Create the button for checking if we should ask if we are going to
-     * overwrite existing files.
-     * @param optionsGroup
-     * @param font
-     */
-    protected void createOverwriteExisting(Group optionsGroup, Font font) {
-        // overwrite... checkbox
-        overwriteExistingFilesCheckbox = new Button(optionsGroup, SWT.CHECK
-                | SWT.LEFT);
-        overwriteExistingFilesCheckbox.setText(DataTransferMessages.ExportFile_overwriteExisting);
-        overwriteExistingFilesCheckbox.setFont(font);
-    }
-
-    /**
-     * Attempts to ensure that the specified directory exists on the local file system.
-     * Answers a boolean indicating success.
-     *
-     * @return boolean
-     * @param directory java.io.File
-     */
-    protected boolean ensureDirectoryExists(File directory) {
-        if (!directory.exists()) {
-            if (!queryYesNoQuestion(DataTransferMessages.DataTransfer_createTargetDirectory)) {
-				return false;
-			}
-
-            if (!directory.mkdirs()) {
-                displayErrorDialog(DataTransferMessages.DataTransfer_directoryCreationError);
-                giveFocusToDestination();
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     *	If the target for export does not exist then attempt to create it.
-     *	Answer a boolean indicating whether the target exists (ie.- if it
-     *	either pre-existed or this method was able to create it)
-     *
-     *	@return boolean
-     */
-    protected boolean ensureTargetIsValid(File targetDirectory) {
-        if (targetDirectory.exists() && !targetDirectory.isDirectory()) {
-            displayErrorDialog(DataTransferMessages.FileExport_directoryExists);
-            giveFocusToDestination();
-            return false;
-        }
-
-        return ensureDirectoryExists(targetDirectory);
-    }
-
-    /**
-     *  Set up and execute the passed Operation.  Answer a boolean indicating success.
-     *
-     *  @return boolean
-     */
-    protected boolean executeExportOperation(FileSystemExportOperation op) {
-        op.setCreateLeadupStructure(createDirectoryStructureButton
-                .getSelection());
-        op.setOverwriteFiles(overwriteExistingFilesCheckbox.getSelection());
-
-        try {
-            getContainer().run(true, true, op);
-        } catch (InterruptedException e) {
-            return false;
-        } catch (InvocationTargetException e) {
-            displayErrorDialog(e.getTargetException());
-            return false;
-        }
-
-        IStatus status = op.getStatus();
-        if (!status.isOK()) {
-            ErrorDialog.openError(getContainer().getShell(),
-                    DataTransferMessages.DataTransfer_exportProblems,
-                    null, // no special message
-                    status);
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     *	The Finish button was pressed.  Try to do the required work now and answer
-     *	a boolean indicating success.  If false is returned then the wizard will
-     *	not close.
-     *
-     *	@return boolean
-     */
-    public boolean finish() {
-        List resourcesToExport = getWhiteCheckedResources();
-        if (!ensureTargetIsValid(new File(getDestinationValue()))) {
-			return false;
-		}
-
-
-        //Save dirty editors if possible but do not stop if not all are saved
-        saveDirtyEditors();
-        // about to invoke the operation so save our state
-        saveWidgetValues();
-
-        return executeExportOperation(new FileSystemExportOperation(null,
-                resourcesToExport, getDestinationValue(), this));
-    }
-
-    /**
-     *	Answer the string to display in self as the destination type
-     *
-     *	@return java.lang.String
-     */
-    protected String getDestinationLabel() {
-        return DataTransferMessages.FileExport_toDirectory;
-    }
-
-    /**
-     *	Answer the contents of self's destination specification widget
-     *
-     *	@return java.lang.String
-     */
-    protected String getDestinationValue() {
-        return destinationNameField.getText().trim();
-    }
-
-    /**
-     *	Set the current input focus to self's destination entry field
-     */
-    protected void giveFocusToDestination() {
-        destinationNameField.setFocus();
-    }
-
-    /**
-     *	Open an appropriate destination browser so that the user can specify a source
-     *	to import from
-     */
-    protected void handleDestinationBrowseButtonPressed() {
-        DirectoryDialog dialog = new DirectoryDialog(getContainer().getShell(),
-                SWT.SAVE);
-        dialog.setMessage(SELECT_DESTINATION_MESSAGE);
-        dialog.setText(SELECT_DESTINATION_TITLE);
-        dialog.setFilterPath(getDestinationValue());
-        String selectedDirectoryName = dialog.open();
-
-        if (selectedDirectoryName != null) {
-            setErrorMessage(null);
-            setDestinationValue(selectedDirectoryName);
-        }
-    }
-
-    /**
-     * Handle all events and enablements for widgets in this page
-     * @param e Event
-     */
-    public void handleEvent(Event e) {
-        Widget source = e.widget;
-
-        if (source == destinationBrowseButton) {
-			handleDestinationBrowseButtonPressed();
-		}
-
-        updatePageCompletion();
-    }
-
-    /**
-     *	Hook method for saving widget values for restoration by the next instance
-     *	of this class.
-     */
-    protected void internalSaveWidgetValues() {
-        // update directory names history
-        IDialogSettings settings = getDialogSettings();
-        if (settings != null) {
-            String[] directoryNames = settings
-                    .getArray(STORE_DESTINATION_NAMES_ID);
-            if (directoryNames == null) {
-				directoryNames = new String[0];
-			}
-
-            directoryNames = addToHistory(directoryNames, getDestinationValue());
-            settings.put(STORE_DESTINATION_NAMES_ID, directoryNames);
-
-            // options
-            settings.put(STORE_OVERWRITE_EXISTING_FILES_ID,
-                    overwriteExistingFilesCheckbox.getSelection());
-
-            settings.put(STORE_CREATE_STRUCTURE_ID,
-                    createDirectoryStructureButton.getSelection());
-
-        }
-    }
-
-    /**
-     *	Hook method for restoring widget values to the values that they held
-     *	last time this wizard was used to completion.
-     */
-    protected void restoreWidgetValues() {
-        IDialogSettings settings = getDialogSettings();
-        if (settings != null) {
-            String[] directoryNames = settings
-                    .getArray(STORE_DESTINATION_NAMES_ID);
-            if (directoryNames == null) {
-				return; // ie.- no settings stored
-			}
-
-            // destination
-            setDestinationValue(directoryNames[0]);
-            for (int i = 0; i < directoryNames.length; i++) {
-				addDestinationItem(directoryNames[i]);
-			}
-
-            // options
-            overwriteExistingFilesCheckbox.setSelection(settings
-                    .getBoolean(STORE_OVERWRITE_EXISTING_FILES_ID));
-
-            boolean createDirectories = settings
-                    .getBoolean(STORE_CREATE_STRUCTURE_ID);
-            createDirectoryStructureButton.setSelection(createDirectories);
-            createSelectionOnlyButton.setSelection(!createDirectories);
-        }
-    }
-
-    /**
-     *	Set the contents of the receivers destination specification widget to
-     *	the passed value
-     *
-     */
-    protected void setDestinationValue(String value) {
-        destinationNameField.setText(value);
-    }
-
-    /**
-     *	Answer a boolean indicating whether the receivers destination specification
-     *	widgets currently all contain valid values.
-     */
-    protected boolean validateDestinationGroup() {
-        String destinationValue = getDestinationValue();
-        if (destinationValue.length() == 0) {
-            setMessage(destinationEmptyMessage());
-            return false;
-        }
-
-        String conflictingContainer = getConflictingContainerNameFor(destinationValue);
-        if (conflictingContainer == null) {
-			// no error message, but warning may exists
-			String threatenedContainer = getOverlappingProjectName(destinationValue);
-			if(threatenedContainer == null)
-				setMessage(null);
-			else
-				setMessage(
-					NLS.bind(DataTransferMessages.FileExport_damageWarning, threatenedContainer),
-					WARNING);
-			
-		} else {
-            setErrorMessage(NLS.bind(DataTransferMessages.FileExport_conflictingContainer, conflictingContainer));
-            giveFocusToDestination();
-            return false;
-        }
-
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.dialogs.WizardDataTransferPage#validateSourceGroup()
-     */
-    protected boolean validateSourceGroup() {
-    	// there must be some resources selected for Export
-    	boolean isValid = true;
-        List resourcesToExport = getWhiteCheckedResources();
-    	if (resourcesToExport.size() == 0){
-    		setErrorMessage(DataTransferMessages.FileExport_noneSelected);
-            isValid =  false;
-    	} else {
-			setErrorMessage(null);
-		}
-		return super.validateSourceGroup() && isValid;
-	}
-
-	/**
-     * Get the message used to denote an empty destination.
-     */
-    protected String destinationEmptyMessage() {
-        return DataTransferMessages.FileExport_destinationEmpty;
-    }
-
-    /**
-     * Returns the name of a container with a location that encompasses targetDirectory.
-     * Returns null if there is no conflict.
-     * 
-     * @param targetDirectory the path of the directory to check.
-     * @return the conflicting container name or <code>null</code>
-     */
-    protected String getConflictingContainerNameFor(String targetDirectory) {
-
-        IPath rootPath = ResourcesPlugin.getWorkspace().getRoot().getLocation();
-        IPath testPath = new Path(targetDirectory);
-        // cannot export into workspace root
-        if(testPath.equals(rootPath))
-        	return rootPath.lastSegment();
-        
-        //Are they the same?
-        if(testPath.matchingFirstSegments(rootPath) == rootPath.segmentCount()){
-        	String firstSegment = testPath.removeFirstSegments(rootPath.segmentCount()).segment(0);
-        	if(!Character.isLetterOrDigit(firstSegment.charAt(0)))
-        		return firstSegment;
-        }
-
-        return null;
-
-    }
-    
-    /**
-	 * Returns the name of a {@link IProject} with a location that includes
-	 * targetDirectory. Returns null if there is no such {@link IProject}.
-	 * 
-	 * @param targetDirectory
-	 *            the path of the directory to check.
-	 * @return the overlapping project name or <code>null</code>
-	 */
-    private String getOverlappingProjectName(String targetDirectory){
-    	IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-    	IPath testPath = new Path(targetDirectory);
-    	IContainer[] containers = root.findContainersForLocation(testPath);
-    	if(containers.length > 0){
-    		return containers[0].getProject().getName();
-    	}
-    	return null;
-    }
-    
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardFileSystemResourceImportPage1.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardFileSystemResourceImportPage1.java
deleted file mode 100644
index 96e781f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardFileSystemResourceImportPage1.java
+++ /dev/null
@@ -1,982 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IContainer;
-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.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-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.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.FileSystemElement;
-import org.eclipse.ui.dialogs.WizardResourceImportPage;
-import org.eclipse.ui.internal.ide.dialogs.IElementFilter;
-import org.eclipse.ui.internal.progress.ProgressMonitorJobsDialog;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.wizards.datatransfer.FileSystemStructureProvider;
-import org.eclipse.ui.wizards.datatransfer.IImportStructureProvider;
-import org.eclipse.ui.wizards.datatransfer.ImportOperation;
-
-/**
- *	Page 1 of the base resource import-from-file-system Wizard
- */
-public class WizardFileSystemResourceImportPage1 extends WizardResourceImportPage
-        implements Listener {
-    // widgets
-    protected Combo sourceNameField;
-
-    protected Button overwriteExistingResourcesCheckbox;
-
-    protected Button createContainerStructureButton;
-
-    protected Button createOnlySelectedButton;
-
-    protected Button sourceBrowseButton;
-
-    protected Button selectTypesButton;
-
-    protected Button selectAllButton;
-
-    protected Button deselectAllButton;
-
-    //A boolean to indicate if the user has typed anything
-    private boolean entryChanged = false;
-
-    // dialog store id constants
-    private final static String STORE_SOURCE_NAMES_ID = "WizardFileSystemResourceImportPage1.STORE_SOURCE_NAMES_ID";//$NON-NLS-1$
-
-    private final static String STORE_OVERWRITE_EXISTING_RESOURCES_ID = "WizardFileSystemResourceImportPage1.STORE_OVERWRITE_EXISTING_RESOURCES_ID";//$NON-NLS-1$
-
-    private final static String STORE_CREATE_CONTAINER_STRUCTURE_ID = "WizardFileSystemResourceImportPage1.STORE_CREATE_CONTAINER_STRUCTURE_ID";//$NON-NLS-1$
-
-    private static final String SELECT_TYPES_TITLE = DataTransferMessages.DataTransfer_selectTypes;
-
-    private static final String SELECT_ALL_TITLE = DataTransferMessages.DataTransfer_selectAll;
-
-    private static final String DESELECT_ALL_TITLE = DataTransferMessages.DataTransfer_deselectAll;
-
-    private static final String SELECT_SOURCE_TITLE = DataTransferMessages.FileImport_selectSourceTitle;
-
-    private static final String SELECT_SOURCE_MESSAGE = DataTransferMessages.FileImport_selectSource;
-
-    protected static final String SOURCE_EMPTY_MESSAGE = DataTransferMessages.FileImport_sourceEmpty;
-
-    /**
-     *	Creates an instance of this class
-     */
-    protected WizardFileSystemResourceImportPage1(String name,
-            IWorkbench aWorkbench, IStructuredSelection selection) {
-        super(name, selection);
-    }
-
-    /**
-     *	Creates an instance of this class
-     *
-     * @param aWorkbench IWorkbench
-     * @param selection IStructuredSelection
-     */
-    public WizardFileSystemResourceImportPage1(IWorkbench aWorkbench,
-            IStructuredSelection selection) {
-        this("fileSystemImportPage1", aWorkbench, selection);//$NON-NLS-1$
-        setTitle(DataTransferMessages.DataTransfer_fileSystemTitle);
-        setDescription(DataTransferMessages.FileImport_importFileSystem);
-    }
-
-    /**
-     * Creates a new button with the given id.
-     * <p>
-     * The <code>Dialog</code> implementation of this framework method
-     * creates a standard push button, registers for selection events
-     * including button presses and registers
-     * default buttons with its shell.
-     * The button id is stored as the buttons client data.
-     * Note that the parent's layout is assumed to be a GridLayout and 
-     * the number of columns in this layout is incremented.
-     * Subclasses may override.
-     * </p>
-     *
-     * @param parent the parent composite
-     * @param id the id of the button (see
-     *  <code>IDialogConstants.*_ID</code> constants 
-     *  for standard dialog button ids)
-     * @param label the label from the button
-     * @param defaultButton <code>true</code> if the button is to be the
-     *   default button, and <code>false</code> otherwise
-     */
-    protected Button createButton(Composite parent, int id, String label,
-            boolean defaultButton) {
-        // increment the number of columns in the button bar
-        ((GridLayout) parent.getLayout()).numColumns++;
-
-        Button button = new Button(parent, SWT.PUSH);
-        button.setFont(parent.getFont());
-
-        GridData buttonData = new GridData(GridData.FILL_HORIZONTAL);
-        button.setLayoutData(buttonData);
-
-        button.setData(new Integer(id));
-        button.setText(label);
-
-        if (defaultButton) {
-            Shell shell = parent.getShell();
-            if (shell != null) {
-                shell.setDefaultButton(button);
-            }
-            button.setFocus();
-        }
-        return button;
-    }
-
-    /**
-     * Creates the buttons for selecting specific types or selecting all or none of the
-     * elements.
-     *
-     * @param parent the parent control
-     */
-    protected final void createButtonsGroup(Composite parent) {
-        // top level group
-        Composite buttonComposite = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 3;
-        layout.makeColumnsEqualWidth = true;
-        buttonComposite.setLayout(layout);
-        buttonComposite.setFont(parent.getFont());
-        GridData buttonData = new GridData(GridData.VERTICAL_ALIGN_FILL
-                | GridData.HORIZONTAL_ALIGN_FILL);
-        buttonData.horizontalSpan = 2;
-        buttonComposite.setLayoutData(buttonData);
-
-        // types edit button
-        selectTypesButton = createButton(buttonComposite,
-                IDialogConstants.SELECT_TYPES_ID, SELECT_TYPES_TITLE, false);
-
-        SelectionListener listener = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                handleTypesEditButtonPressed();
-            }
-        };
-        selectTypesButton.addSelectionListener(listener);
-        setButtonLayoutData(selectTypesButton);
-
-        selectAllButton = createButton(buttonComposite,
-                IDialogConstants.SELECT_ALL_ID, SELECT_ALL_TITLE, false);
-
-        listener = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                setAllSelections(true);
-                updateWidgetEnablements();
-            }
-        };
-        selectAllButton.addSelectionListener(listener);
-        setButtonLayoutData(selectAllButton);
-
-        deselectAllButton = createButton(buttonComposite,
-                IDialogConstants.DESELECT_ALL_ID, DESELECT_ALL_TITLE, false);
-
-        listener = new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                setAllSelections(false);
-                updateWidgetEnablements();
-            }
-        };
-        deselectAllButton.addSelectionListener(listener);
-        setButtonLayoutData(deselectAllButton);
-
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogPage.
-     */
-    public void createControl(Composite parent) {
-        super.createControl(parent);
-        validateSourceGroup();
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
-                IDataTransferHelpContextIds.FILE_SYSTEM_IMPORT_WIZARD_PAGE);
-    }
-
-    /**
-     *	Create the import options specification widgets.
-     */
-    protected void createOptionsGroupButtons(Group optionsGroup) {
-
-        // overwrite... checkbox
-        overwriteExistingResourcesCheckbox = new Button(optionsGroup, SWT.CHECK);
-        overwriteExistingResourcesCheckbox.setFont(optionsGroup.getFont());
-        overwriteExistingResourcesCheckbox.setText(DataTransferMessages.FileImport_overwriteExisting);
-
-        // create containers radio
-        createContainerStructureButton = new Button(optionsGroup, SWT.RADIO);
-        createContainerStructureButton.setFont(optionsGroup.getFont());
-        createContainerStructureButton.setText(DataTransferMessages.FileImport_createComplete);
-        createContainerStructureButton.setSelection(false);
-
-        // create selection only radio
-        createOnlySelectedButton = new Button(optionsGroup, SWT.RADIO);
-        createOnlySelectedButton.setFont(optionsGroup.getFont());
-        createOnlySelectedButton.setText(DataTransferMessages.FileImport_createSelectedFolders);
-        createOnlySelectedButton.setSelection(true);
-
-    }
-
-    /**
-     *	Create the group for creating the root directory
-     */
-    protected void createRootDirectoryGroup(Composite parent) {
-        Composite sourceContainerGroup = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 3;
-        sourceContainerGroup.setLayout(layout);
-        sourceContainerGroup.setFont(parent.getFont());
-        sourceContainerGroup.setLayoutData(new GridData(
-                GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
-
-        Label groupLabel = new Label(sourceContainerGroup, SWT.NONE);
-        groupLabel.setText(getSourceLabel());
-        groupLabel.setFont(parent.getFont());
-
-        // source name entry field
-        sourceNameField = new Combo(sourceContainerGroup, SWT.BORDER);
-        GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-                | GridData.GRAB_HORIZONTAL);
-        data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-        sourceNameField.setLayoutData(data);
-        sourceNameField.setFont(parent.getFont());
-
-        sourceNameField.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                updateFromSourceField();
-            }
-        });
-
-        sourceNameField.addKeyListener(new KeyListener() {
-            /*
-             * @see KeyListener.keyPressed
-             */
-            public void keyPressed(KeyEvent e) {
-                //If there has been a key pressed then mark as dirty
-                entryChanged = true;
-            }
-
-            /*
-             * @see KeyListener.keyReleased
-             */
-            public void keyReleased(KeyEvent e) {
-            }
-        });
-
-        sourceNameField.addFocusListener(new FocusListener() {
-            /*
-             * @see FocusListener.focusGained(FocusEvent)
-             */
-            public void focusGained(FocusEvent e) {
-                //Do nothing when getting focus
-            }
-
-            /*
-             * @see FocusListener.focusLost(FocusEvent)
-             */
-            public void focusLost(FocusEvent e) {
-                //Clear the flag to prevent constant update
-                if (entryChanged) {
-                    entryChanged = false;
-                    updateFromSourceField();
-                }
-
-            }
-        });
-
-        // source browse button
-        sourceBrowseButton = new Button(sourceContainerGroup, SWT.PUSH);
-        sourceBrowseButton.setText(DataTransferMessages.DataTransfer_browse);
-        sourceBrowseButton.addListener(SWT.Selection, this);
-        sourceBrowseButton.setLayoutData(new GridData(
-                GridData.HORIZONTAL_ALIGN_FILL));
-        sourceBrowseButton.setFont(parent.getFont());
-        setButtonLayoutData(sourceBrowseButton);
-    }
-
-    /**
-     * Update the receiver from the source name field.
-     */
-
-    private void updateFromSourceField() {
-
-        setSourceName(sourceNameField.getText());
-        //Update enablements when this is selected
-        updateWidgetEnablements();
-    }
-
-    /**
-     * Creates and returns a <code>FileSystemElement</code> if the specified
-     * file system object merits one.  The criteria for this are:
-     * Also create the children.
-     */
-    protected MinimizedFileSystemElement createRootElement(
-            Object fileSystemObject, IImportStructureProvider provider) {
-        boolean isContainer = provider.isFolder(fileSystemObject);
-        String elementLabel = provider.getLabel(fileSystemObject);
-
-        // Use an empty label so that display of the element's full name
-        // doesn't include a confusing label
-        MinimizedFileSystemElement dummyParent = new MinimizedFileSystemElement(
-                "", null, true);//$NON-NLS-1$
-        dummyParent.setPopulated();
-        MinimizedFileSystemElement result = new MinimizedFileSystemElement(
-                elementLabel, dummyParent, isContainer);
-        result.setFileSystemObject(fileSystemObject);
-
-        //Get the files for the element so as to build the first level
-        result.getFiles(provider);
-
-        return dummyParent;
-    }
-
-    /**
-     *	Create the import source specification widgets
-     */
-    protected void createSourceGroup(Composite parent) {
-
-        createRootDirectoryGroup(parent);
-        createFileSelectionGroup(parent);
-        createButtonsGroup(parent);
-    }
-
-    /**
-     * Enable or disable the button group.
-     */
-    protected void enableButtonGroup(boolean enable) {
-        selectTypesButton.setEnabled(enable);
-        selectAllButton.setEnabled(enable);
-        deselectAllButton.setEnabled(enable);
-    }
-
-    /**
-     *	Answer a boolean indicating whether the specified source currently exists
-     *	and is valid
-     */
-    protected boolean ensureSourceIsValid() {
-        if (new File(getSourceDirectoryName()).isDirectory()) {
-			return true;
-		}
-
-        setErrorMessage(DataTransferMessages.FileImport_invalidSource);
-        return false;
-    }
-
-    /**
-     *	Execute the passed import operation.  Answer a boolean indicating success.
-     */
-    protected boolean executeImportOperation(ImportOperation op) {
-        initializeOperation(op);
-
-        try {
-            getContainer().run(true, true, op);
-        } catch (InterruptedException e) {
-            return false;
-        } catch (InvocationTargetException e) {
-            displayErrorDialog(e.getTargetException());
-            return false;
-        }
-
-        IStatus status = op.getStatus();
-        if (!status.isOK()) {
-            ErrorDialog
-                    .openError(getContainer().getShell(), DataTransferMessages.FileImport_importProblems,
-                            null, // no special message
-                            status);
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     *	The Finish button was pressed.  Try to do the required work now and answer
-     *	a boolean indicating success.  If false is returned then the wizard will
-     *	not close.
-     *
-     * @return boolean
-     */
-    public boolean finish() {
-        if (!ensureSourceIsValid()) {
-			return false;
-		}
-
-        saveWidgetValues();
-
-        Iterator resourcesEnum = getSelectedResources().iterator();
-        List fileSystemObjects = new ArrayList();
-        while (resourcesEnum.hasNext()) {
-            fileSystemObjects.add(((FileSystemElement) resourcesEnum.next())
-                    .getFileSystemObject());
-        }
-
-        if (fileSystemObjects.size() > 0) {
-			return importResources(fileSystemObjects);
-		}
-
-        MessageDialog.openInformation(getContainer().getShell(),
-                DataTransferMessages.DataTransfer_information,
-                DataTransferMessages.FileImport_noneSelected);
-
-        return false;
-    }
-
-    /**
-     * Returns a content provider for <code>FileSystemElement</code>s that returns 
-     * only files as children.
-     */
-    protected ITreeContentProvider getFileProvider() {
-        return new WorkbenchContentProvider() {
-            public Object[] getChildren(Object o) {
-                if (o instanceof MinimizedFileSystemElement) {
-                    MinimizedFileSystemElement element = (MinimizedFileSystemElement) o;
-                    return element.getFiles(
-                            FileSystemStructureProvider.INSTANCE).getChildren(
-                            element);
-                }
-                return new Object[0];
-            }
-        };
-    }
-
-    /**
-     *	Answer the root FileSystemElement that represents the contents of
-     *	the currently-specified source.  If this FileSystemElement is not
-     *	currently defined then create and return it.
-     */
-    protected MinimizedFileSystemElement getFileSystemTree() {
-
-        File sourceDirectory = getSourceDirectory();
-        if (sourceDirectory == null) {
-			return null;
-		}
-
-        return selectFiles(sourceDirectory,
-                FileSystemStructureProvider.INSTANCE);
-    }
-
-    /**
-     * Returns a content provider for <code>FileSystemElement</code>s that returns 
-     * only folders as children.
-     */
-    protected ITreeContentProvider getFolderProvider() {
-        return new WorkbenchContentProvider() {
-            public Object[] getChildren(Object o) {
-                if (o instanceof MinimizedFileSystemElement) {
-                    MinimizedFileSystemElement element = (MinimizedFileSystemElement) o;
-                    return element.getFolders(
-                            FileSystemStructureProvider.INSTANCE).getChildren(
-                            element);
-                }
-                return new Object[0];
-            }
-
-            public boolean hasChildren(Object o) {
-                if (o instanceof MinimizedFileSystemElement) {
-                    MinimizedFileSystemElement element = (MinimizedFileSystemElement) o;
-                    if (element.isPopulated()) {
-						return getChildren(element).length > 0;
-					}
-
-                    //If we have not populated then wait until asked
-                    return true;
-                }
-                return false;
-            }
-        };
-    }
-
-    /**
-     * Returns a File object representing the currently-named source directory iff
-     * it exists as a valid directory, or <code>null</code> otherwise.
-     */
-    protected File getSourceDirectory() {
-        return getSourceDirectory(this.sourceNameField.getText());
-    }
-
-    /**
-     * Returns a File object representing the currently-named source directory iff
-     * it exists as a valid directory, or <code>null</code> otherwise.
-     *
-     * @param path a String not yet formatted for java.io.File compatability
-     */
-    private File getSourceDirectory(String path) {
-        File sourceDirectory = new File(getSourceDirectoryName(path));
-        if (!sourceDirectory.exists() || !sourceDirectory.isDirectory()) {
-            return null;
-        }
-
-        return sourceDirectory;
-    }
-
-    /**
-     *	Answer the directory name specified as being the import source.
-     *	Note that if it ends with a separator then the separator is first
-     *	removed so that java treats it as a proper directory
-     */
-    private String getSourceDirectoryName() {
-        return getSourceDirectoryName(this.sourceNameField.getText());
-    }
-
-    /**
-     *	Answer the directory name specified as being the import source.
-     *	Note that if it ends with a separator then the separator is first
-     *	removed so that java treats it as a proper directory
-     */
-    private String getSourceDirectoryName(String sourceName) {
-        IPath result = new Path(sourceName.trim());
-
-        if (result.getDevice() != null && result.segmentCount() == 0) {
-			result = result.addTrailingSeparator();
-		} else {
-			result = result.removeTrailingSeparator();
-		}
-
-        return result.toOSString();
-    }
-
-    /**
-     *	Answer the string to display as the label for the source specification field
-     */
-    protected String getSourceLabel() {
-        return DataTransferMessages.FileImport_fromDirectory;
-    }
-
-    /**
-     *	Handle all events and enablements for widgets in this dialog
-     *
-     * @param event Event
-     */
-    public void handleEvent(Event event) {
-        if (event.widget == sourceBrowseButton) {
-			handleSourceBrowseButtonPressed();
-		}
-
-        super.handleEvent(event);
-    }
-
-    /**
-     *	Open an appropriate source browser so that the user can specify a source
-     *	to import from
-     */
-    protected void handleSourceBrowseButtonPressed() {
-
-        String currentSource = this.sourceNameField.getText();
-        DirectoryDialog dialog = new DirectoryDialog(
-                sourceNameField.getShell(), SWT.SAVE);
-        dialog.setText(SELECT_SOURCE_TITLE);
-        dialog.setMessage(SELECT_SOURCE_MESSAGE);
-        dialog.setFilterPath(getSourceDirectoryName(currentSource));
-
-        String selectedDirectory = dialog.open();
-        if (selectedDirectory != null) {
-            //Just quit if the directory is not valid
-            if ((getSourceDirectory(selectedDirectory) == null)
-                    || selectedDirectory.equals(currentSource)) {
-				return;
-			}
-            //If it is valid then proceed to populate
-            setErrorMessage(null);
-            setSourceName(selectedDirectory);
-            selectionGroup.setFocus();
-        }
-    }
-
-    /**
-     * Open a registered type selection dialog and note the selections
-     * in the receivers types-to-export field.,
-     * Added here so that inner classes can have access
-     */
-    protected void handleTypesEditButtonPressed() {
-
-        super.handleTypesEditButtonPressed();
-    }
-
-    /**
-     *  Import the resources with extensions as specified by the user
-     */
-    protected boolean importResources(List fileSystemObjects) {
-        ImportOperation operation = new ImportOperation(getContainerFullPath(),
-                getSourceDirectory(), FileSystemStructureProvider.INSTANCE,
-                this, fileSystemObjects);
-
-        operation.setContext(getShell());
-        return executeImportOperation(operation);
-    }
-
-    /**
-     * Initializes the specified operation appropriately.
-     */
-    protected void initializeOperation(ImportOperation op) {
-        op.setCreateContainerStructure(createContainerStructureButton
-                .getSelection());
-        op.setOverwriteResources(overwriteExistingResourcesCheckbox
-                .getSelection());
-    }
-
-    /**
-     * Returns whether the extension provided is an extension that
-     * has been specified for export by the user.
-     *
-     * @param extension the resource name
-     * @return <code>true</code> if the resource name is suitable for export based 
-     *   upon its extension
-     */
-    protected boolean isExportableExtension(String extension) {
-        if (selectedTypes == null) {
-			return true;
-		}
-
-        Iterator itr = selectedTypes.iterator();
-        while (itr.hasNext()) {
-            if (extension.equalsIgnoreCase((String) itr.next())) {
-				return true;
-			}
-        }
-
-        return false;
-    }
-
-    /**
-     *	Repopulate the view based on the currently entered directory.
-     */
-    protected void resetSelection() {
-
-        MinimizedFileSystemElement currentRoot = getFileSystemTree();
-        this.selectionGroup.setRoot(currentRoot);
-
-    }
-
-    /**
-     *	Use the dialog store to restore widget values to the values that they held
-     *	last time this wizard was used to completion
-     */
-    protected void restoreWidgetValues() {
-        IDialogSettings settings = getDialogSettings();
-        if (settings != null) {
-            String[] sourceNames = settings.getArray(STORE_SOURCE_NAMES_ID);
-            if (sourceNames == null) {
-				return; // ie.- no values stored, so stop
-			}
-
-            // set filenames history
-            for (int i = 0; i < sourceNames.length; i++) {
-				sourceNameField.add(sourceNames[i]);
-			}
-
-            // radio buttons and checkboxes	
-            overwriteExistingResourcesCheckbox.setSelection(settings
-                    .getBoolean(STORE_OVERWRITE_EXISTING_RESOURCES_ID));
-
-            boolean createStructure = settings
-                    .getBoolean(STORE_CREATE_CONTAINER_STRUCTURE_ID);
-            createContainerStructureButton.setSelection(createStructure);
-            createOnlySelectedButton.setSelection(!createStructure);
-
-        }
-    }
-
-    /**
-     * 	Since Finish was pressed, write widget values to the dialog store so that they
-     *	will persist into the next invocation of this wizard page
-     */
-    protected void saveWidgetValues() {
-        IDialogSettings settings = getDialogSettings();
-        if (settings != null) {
-            // update source names history
-            String[] sourceNames = settings.getArray(STORE_SOURCE_NAMES_ID);
-            if (sourceNames == null) {
-				sourceNames = new String[0];
-			}
-
-            sourceNames = addToHistory(sourceNames, getSourceDirectoryName());
-            settings.put(STORE_SOURCE_NAMES_ID, sourceNames);
-
-            // radio buttons and checkboxes	
-            settings.put(STORE_OVERWRITE_EXISTING_RESOURCES_ID,
-                    overwriteExistingResourcesCheckbox.getSelection());
-
-            settings.put(STORE_CREATE_CONTAINER_STRUCTURE_ID,
-                    createContainerStructureButton.getSelection());
-
-        }
-    }
-
-    /**
-     * Invokes a file selection operation using the specified file system and
-     * structure provider.  If the user specifies files to be imported then
-     * this selection is cached for later retrieval and is returned.
-     */
-    protected MinimizedFileSystemElement selectFiles(
-            final Object rootFileSystemObject,
-            final IImportStructureProvider structureProvider) {
-
-        final MinimizedFileSystemElement[] results = new MinimizedFileSystemElement[1];
-
-        BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
-            public void run() {
-                //Create the root element from the supplied file system object
-                results[0] = createRootElement(rootFileSystemObject,
-                        structureProvider);
-            }
-        });
-
-        return results[0];
-    }
-
-    /**
-     * Set all of the selections in the selection group to value. Implemented here
-     * to provide access for inner classes.
-     * @param value boolean
-     */
-    protected void setAllSelections(boolean value) {
-        super.setAllSelections(value);
-    }
-
-    /**
-     * Sets the source name of the import to be the supplied path.
-     * Adds the name of the path to the list of items in the
-     * source combo and selects it.
-     *
-     * @param path the path to be added
-     */
-    protected void setSourceName(String path) {
-
-        if (path.length() > 0) {
-
-            String[] currentItems = this.sourceNameField.getItems();
-            int selectionIndex = -1;
-            for (int i = 0; i < currentItems.length; i++) {
-                if (currentItems[i].equals(path)) {
-					selectionIndex = i;
-				}
-            }
-            if (selectionIndex < 0) {
-                int oldLength = currentItems.length;
-                String[] newItems = new String[oldLength + 1];
-                System.arraycopy(currentItems, 0, newItems, 0, oldLength);
-                newItems[oldLength] = path;
-                this.sourceNameField.setItems(newItems);
-                selectionIndex = oldLength;
-            }
-            this.sourceNameField.select(selectionIndex);
-
-            resetSelection();
-        }
-    }
-
-    /**
-     * Update the tree to only select those elements that match the selected types
-     */
-    protected void setupSelectionsBasedOnSelectedTypes() {
-        ProgressMonitorDialog dialog = new ProgressMonitorJobsDialog(
-                getContainer().getShell());
-        final Map selectionMap = new Hashtable();
-
-        final IElementFilter filter = new IElementFilter() {
-
-            public void filterElements(Collection files,
-                    IProgressMonitor monitor) throws InterruptedException {
-                if (files == null) {
-                    throw new InterruptedException();
-                }
-                Iterator filesList = files.iterator();
-                while (filesList.hasNext()) {
-                    if (monitor.isCanceled()) {
-						throw new InterruptedException();
-					}
-                    checkFile(filesList.next());
-                }
-            }
-
-            public void filterElements(Object[] files, IProgressMonitor monitor)
-                    throws InterruptedException {
-                if (files == null) {
-                    throw new InterruptedException();
-                }
-                for (int i = 0; i < files.length; i++) {
-                    if (monitor.isCanceled()) {
-						throw new InterruptedException();
-					}
-                    checkFile(files[i]);
-                }
-            }
-
-            private void checkFile(Object fileElement) {
-                MinimizedFileSystemElement file = (MinimizedFileSystemElement) fileElement;
-                if (isExportableExtension(file.getFileNameExtension())) {
-                    List elements = new ArrayList();
-                    FileSystemElement parent = file.getParent();
-                    if (selectionMap.containsKey(parent)) {
-						elements = (List) selectionMap.get(parent);
-					}
-                    elements.add(file);
-                    selectionMap.put(parent, elements);
-                }
-            }
-
-        };
-
-        IRunnableWithProgress runnable = new IRunnableWithProgress() {
-            public void run(final IProgressMonitor monitor)
-                    throws InterruptedException {
-                monitor
-                        .beginTask(
-                                DataTransferMessages.ImportPage_filterSelections, IProgressMonitor.UNKNOWN);
-                getSelectedResources(filter, monitor);
-            }
-        };
-
-        try {
-            dialog.run(true, true, runnable);
-        } catch (InvocationTargetException exception) {
-            //Couldn't start. Do nothing.
-            return;
-        } catch (InterruptedException exception) {
-            //Got interrupted. Do nothing.
-            return;
-        }
-        // make sure that all paint operations caused by closing the progress 
-        // dialog get flushed, otherwise extra pixels will remain on the screen until 
-        // updateSelections is completed
-        getShell().update();
-        // The updateSelections method accesses SWT widgets so cannot be executed
-        // as part of the above progress dialog operation since the operation forks
-        // a new process.	
-        if (selectionMap != null) {
-            updateSelections(selectionMap);
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDialogPage. Set the selection up when it becomes visible.
-     */
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        resetSelection();
-        if (visible) {
-			this.sourceNameField.setFocus();
-		}
-    }
-
-    /**
-     * Update the selections with those in map . Implemented here to give inner class
-     * visibility
-     * @param map Map - key tree elements, values Lists of list elements
-     */
-    protected void updateSelections(Map map) {
-        super.updateSelections(map);
-    }
-
-    /**
-     * Check if widgets are enabled or disabled by a change in the dialog.
-     * Provided here to give access to inner classes.
-     */
-    protected void updateWidgetEnablements() {
-        super.updateWidgetEnablements();
-        enableButtonGroup(ensureSourceIsValid());
-    }
-
-    /**
-     *	Answer a boolean indicating whether self's source specification
-     *	widgets currently all contain valid values.
-     */
-    protected boolean validateSourceGroup() {
-        File sourceDirectory = getSourceDirectory();
-        if (sourceDirectory == null) {
-            setMessage(SOURCE_EMPTY_MESSAGE);
-            enableButtonGroup(false);
-            return false;
-        }
-
-        if (sourceConflictsWithDestination(new Path(sourceDirectory.getPath()))) {
-        	setMessage(null);
-            setErrorMessage(getSourceConflictMessage());
-            enableButtonGroup(false);
-            return false;
-        }
-
-        List resourcesToExport = selectionGroup.getAllWhiteCheckedItems();
-        if (resourcesToExport.size() == 0){
-        	setMessage(null);
-        	setErrorMessage(DataTransferMessages.FileImport_noneSelected);
-        	return false;
-        }
-        
-		enableButtonGroup(true);
-		setErrorMessage(null);
-        return true;
-    }
-
-    /**
-     * Returns whether the source location conflicts
-     * with the destination resource. This will occur if
-     * the source is already under the destination.
-     * 
-     * @param sourcePath the path to check
-     * @return <code>true</code> if there is a conflict, <code>false</code> if not
-     */
-    protected boolean sourceConflictsWithDestination(IPath sourcePath) {
-
-        IContainer container = getSpecifiedContainer();
-        if (container == null) {
-			return false;
-		}
-        
-        IPath destinationLocation = getSpecifiedContainer().getLocation();
-        if (destinationLocation != null) {
-            return destinationLocation.isPrefixOf(sourcePath);
-        }
-        // null destination location is handled in 
-        // WizardResourceImportPage 
-        return false;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardProjectsImportPage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardProjectsImportPage.java
deleted file mode 100644
index 35815ef..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/WizardProjectsImportPage.java
+++ /dev/null
@@ -1,1469 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Red Hat, Inc - extensive changes to allow importing of Archive Files
- *     Philippe Ombredanne (pombredanne@nexb.com)
- *     		- Bug 101180 [Import/Export] Import Existing Project into Workspace default widget is back button , should be text field
- *     Martin Oberhuber (martin.oberhuber@windriver.com)
- *     		- Bug 187318[Wizards] "Import Existing Project" loops forever with cyclic symbolic links
- *     Remy Chi Jian Suen  (remy.suen@gmail.com)
- *     		- Bug 210568 [Import/Export] [Import/Export] - Refresh button does not update list of projects
- *******************************************************************************/
-
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipException;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-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.OperationCanceledException;
-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.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-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.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-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.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.dialogs.IOverwriteQuery;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.StatusUtil;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.wizards.datatransfer.FileSystemStructureProvider;
-import org.eclipse.ui.wizards.datatransfer.ImportOperation;
-
-/**
- * The WizardProjectsImportPage is the page that allows the user to import
- * projects from a particular location.
- */
-public class WizardProjectsImportPage extends WizardPage implements
-		IOverwriteQuery {
-
-	/**
-	 * The name of the folder containing metadata information for the workspace.
-	 */
-	public static final String METADATA_FOLDER = ".metadata"; //$NON-NLS-1$
-
-	/**
-	 * The import structure provider.
-	 * 
-	 * @since 3.4
-	 */
-	private ILeveledImportStructureProvider structureProvider;
-
-	/**
-	 * Class declared public only for test suite.
-	 * 
-	 */
-	public class ProjectRecord {
-		File projectSystemFile;
-
-		Object projectArchiveFile;
-
-		String projectName;
-
-		Object parent;
-
-		int level;
-
-		IProjectDescription description;
-
-		/**
-		 * Create a record for a project based on the info in the file.
-		 * 
-		 * @param file
-		 */
-		ProjectRecord(File file) {
-			projectSystemFile = file;
-			setProjectName();
-		}
-
-		/**
-		 * @param file
-		 * 		The Object representing the .project file
-		 * @param parent
-		 * 		The parent folder of the .project file
-		 * @param level
-		 * 		The number of levels deep in the provider the file is
-		 */
-		ProjectRecord(Object file, Object parent, int level) {
-			this.projectArchiveFile = file;
-			this.parent = parent;
-			this.level = level;
-			setProjectName();
-		}
-
-		/**
-		 * Set the name of the project based on the projectFile.
-		 */
-		private void setProjectName() {
-			try {
-				if (projectArchiveFile != null) {
-					InputStream stream = structureProvider
-							.getContents(projectArchiveFile);
-
-					// If we can get a description pull the name from there
-					if (stream == null) {
-						if (projectArchiveFile instanceof ZipEntry) {
-							IPath path = new Path(
-									((ZipEntry) projectArchiveFile).getName());
-							projectName = path.segment(path.segmentCount() - 2);
-						} else if (projectArchiveFile instanceof TarEntry) {
-							IPath path = new Path(
-									((TarEntry) projectArchiveFile).getName());
-							projectName = path.segment(path.segmentCount() - 2);
-						}
-					} else {
-						description = IDEWorkbenchPlugin.getPluginWorkspace()
-								.loadProjectDescription(stream);
-						stream.close();
-						projectName = description.getName();
-					}
-
-				}
-
-				// If we don't have the project name try again
-				if (projectName == null) {
-					IPath path = new Path(projectSystemFile.getPath());
-					// if the file is in the default location, use the directory
-					// name as the project name
-					if (isDefaultLocation(path)) {
-						projectName = path.segment(path.segmentCount() - 2);
-						description = IDEWorkbenchPlugin.getPluginWorkspace()
-								.newProjectDescription(projectName);
-					} else {
-						description = IDEWorkbenchPlugin.getPluginWorkspace()
-								.loadProjectDescription(path);
-						projectName = description.getName();
-					}
-
-				}
-			} catch (CoreException e) {
-				// no good couldn't get the name
-			} catch (IOException e) {
-				// no good couldn't get the name
-			}
-		}
-
-		/**
-		 * Returns whether the given project description file path is in the
-		 * default location for a project
-		 * 
-		 * @param path
-		 * 		The path to examine
-		 * @return Whether the given path is the default location for a project
-		 */
-		private boolean isDefaultLocation(IPath path) {
-			// The project description file must at least be within the project,
-			// which is within the workspace location
-			if (path.segmentCount() < 2)
-				return false;
-			return path.removeLastSegments(2).toFile().equals(
-					Platform.getLocation().toFile());
-		}
-
-		/**
-		 * Get the name of the project
-		 * 
-		 * @return String
-		 */
-		public String getProjectName() {
-			return projectName;
-		}
-
-		/**
-		 * Gets the label to be used when rendering this project record in the
-		 * UI.
-		 * 
-		 * @return String the label
-		 * @since 3.4
-		 */
-		public String getProjectLabel() {
-			if (description == null)
-				return projectName;
-
-			String path = projectSystemFile == null ? structureProvider
-					.getLabel(parent) : projectSystemFile
-					.getParent();
-
-			return NLS.bind(
-					DataTransferMessages.WizardProjectsImportPage_projectLabel,
-					projectName, path);
-		}
-	}
-
-	// dialog store id constants
-	private final static String STORE_COPY_PROJECT_ID = "WizardProjectsImportPage.STORE_COPY_PROJECT_ID"; //$NON-NLS-1$
-
-	private final static String STORE_ARCHIVE_SELECTED = "WizardProjectsImportPage.STORE_ARCHIVE_SELECTED"; //$NON-NLS-1$
-
-	private Text directoryPathField;
-
-	private CheckboxTreeViewer projectsList;
-
-	private Button copyCheckbox;
-
-	private boolean copyFiles = false;
-
-	private ProjectRecord[] selectedProjects = new ProjectRecord[0];
-
-	// Keep track of the directory that we browsed to last time
-	// the wizard was invoked.
-	private static String previouslyBrowsedDirectory = ""; //$NON-NLS-1$
-
-	// Keep track of the archive that we browsed to last time
-	// the wizard was invoked.
-	private static String previouslyBrowsedArchive = ""; //$NON-NLS-1$
-
-	private Button projectFromDirectoryRadio;
-
-	private Button projectFromArchiveRadio;
-
-	private Text archivePathField;
-
-	private Button browseDirectoriesButton;
-
-	private Button browseArchivesButton;
-
-	private IProject[] wsProjects;
-
-	// constant from WizardArchiveFileResourceImportPage1
-	private static final String[] FILE_IMPORT_MASK = {
-			"*.jar;*.zip;*.tar;*.tar.gz;*.tgz", "*.*" }; //$NON-NLS-1$ //$NON-NLS-2$
-
-	// The last selected path to minimize searches
-	private String lastPath;
-	// The last time that the file or folder at the selected path was modified
-	// to mimize searches
-	private long lastModified;
-
-	/**
-	 * Creates a new project creation wizard page.
-	 * 
-	 */
-	public WizardProjectsImportPage() {
-		this("wizardExternalProjectsPage"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param pageName
-	 */
-	public WizardProjectsImportPage(String pageName) {
-		super(pageName);
-		setPageComplete(false);
-		setTitle(DataTransferMessages.WizardProjectsImportPage_ImportProjectsTitle);
-		setDescription(DataTransferMessages.WizardProjectsImportPage_ImportProjectsDescription);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
-	 * .Composite)
-	 */
-	public void createControl(Composite parent) {
-
-		initializeDialogUnits(parent);
-
-		Composite workArea = new Composite(parent, SWT.NONE);
-		setControl(workArea);
-
-		workArea.setLayout(new GridLayout());
-		workArea.setLayoutData(new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
-
-		createProjectsRoot(workArea);
-		createProjectsList(workArea);
-		createOptionsArea(workArea);
-		restoreWidgetValues();
-		Dialog.applyDialogFont(workArea);
-
-	}
-
-	/**
-	 * Create the area with the extra options.
-	 * 
-	 * @param workArea
-	 */
-	private void createOptionsArea(Composite workArea) {
-		Composite optionsGroup = new Composite(workArea, SWT.NONE);
-		optionsGroup.setLayout(new GridLayout());
-		optionsGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		copyCheckbox = new Button(optionsGroup, SWT.CHECK);
-		copyCheckbox
-				.setText(DataTransferMessages.WizardProjectsImportPage_CopyProjectsIntoWorkspace);
-		copyCheckbox.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		copyCheckbox.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				copyFiles = copyCheckbox.getSelection();
-			}
-		});
-	}
-
-	/**
-	 * Create the checkbox list for the found projects.
-	 * 
-	 * @param workArea
-	 */
-	private void createProjectsList(Composite workArea) {
-
-		Label title = new Label(workArea, SWT.NONE);
-		title
-				.setText(DataTransferMessages.WizardProjectsImportPage_ProjectsListTitle);
-
-		Composite listComposite = new Composite(workArea, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = 0;
-		layout.makeColumnsEqualWidth = false;
-		listComposite.setLayout(layout);
-
-		listComposite.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
-				| GridData.GRAB_VERTICAL | GridData.FILL_BOTH));
-
-		projectsList = new CheckboxTreeViewer(listComposite, SWT.BORDER);
-		GridData listData = new GridData(GridData.GRAB_HORIZONTAL
-				| GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
-		projectsList.getControl().setLayoutData(listData);
-
-		projectsList.setContentProvider(new ITreeContentProvider() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java
-			 * .lang.Object)
-			 */
-			public Object[] getChildren(Object parentElement) {
-				return null;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.viewers.IStructuredContentProvider#getElements
-			 * (java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				return getValidProjects();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java
-			 * .lang.Object)
-			 */
-			public boolean hasChildren(Object element) {
-				return false;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.viewers.ITreeContentProvider#getParent(java
-			 * .lang.Object)
-			 */
-			public Object getParent(Object element) {
-				return null;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse
-			 * .jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-			}
-
-		});
-
-		projectsList.setLabelProvider(new LabelProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
-			 */
-			public String getText(Object element) {
-				return ((ProjectRecord) element).getProjectLabel();
-			}
-		});
-
-		projectsList.addCheckStateListener(new ICheckStateListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged
-			 * (org.eclipse.jface.viewers.CheckStateChangedEvent)
-			 */
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				setPageComplete(projectsList.getCheckedElements().length > 0);
-			}
-		});
-
-		projectsList.setInput(this);
-		projectsList.setComparator(new ViewerComparator());
-		createSelectionButtons(listComposite);
-	}
-
-	/**
-	 * Create the selection buttons in the listComposite.
-	 * 
-	 * @param listComposite
-	 */
-	private void createSelectionButtons(Composite listComposite) {
-		Composite buttonsComposite = new Composite(listComposite, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		buttonsComposite.setLayout(layout);
-
-		buttonsComposite.setLayoutData(new GridData(
-				GridData.VERTICAL_ALIGN_BEGINNING));
-
-		Button selectAll = new Button(buttonsComposite, SWT.PUSH);
-		selectAll.setText(DataTransferMessages.DataTransfer_selectAll);
-		selectAll.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				projectsList.setCheckedElements(selectedProjects);
-				setPageComplete(projectsList.getCheckedElements().length > 0);
-			}
-		});
-		Dialog.applyDialogFont(selectAll);
-		setButtonLayoutData(selectAll);
-
-		Button deselectAll = new Button(buttonsComposite, SWT.PUSH);
-		deselectAll.setText(DataTransferMessages.DataTransfer_deselectAll);
-		deselectAll.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse
-			 * .swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-
-				projectsList.setCheckedElements(new Object[0]);
-				setPageComplete(false);
-			}
-		});
-		Dialog.applyDialogFont(deselectAll);
-		setButtonLayoutData(deselectAll);
-
-		Button refresh = new Button(buttonsComposite, SWT.PUSH);
-		refresh.setText(DataTransferMessages.DataTransfer_refresh);
-		refresh.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse
-			 * .swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				if (projectFromDirectoryRadio.getSelection()) {
-					updateProjectsList(directoryPathField.getText().trim());
-				} else {
-					updateProjectsList(archivePathField.getText().trim());
-				}
-			}
-		});
-		Dialog.applyDialogFont(refresh);
-		setButtonLayoutData(refresh);
-	}
-
-	/**
-	 * Create the area where you select the root directory for the projects.
-	 * 
-	 * @param workArea
-	 * 		Composite
-	 */
-	private void createProjectsRoot(Composite workArea) {
-
-		// project specification group
-		Composite projectGroup = new Composite(workArea, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 3;
-		layout.makeColumnsEqualWidth = false;
-		layout.marginWidth = 0;
-		projectGroup.setLayout(layout);
-		projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		// new project from directory radio button
-		projectFromDirectoryRadio = new Button(projectGroup, SWT.RADIO);
-		projectFromDirectoryRadio
-				.setText(DataTransferMessages.WizardProjectsImportPage_RootSelectTitle);
-
-		// project location entry field
-		this.directoryPathField = new Text(projectGroup, SWT.BORDER);
-
-		this.directoryPathField.setLayoutData(new GridData(
-				GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
-
-		// browse button
-		browseDirectoriesButton = new Button(projectGroup, SWT.PUSH);
-		browseDirectoriesButton
-				.setText(DataTransferMessages.DataTransfer_browse);
-		setButtonLayoutData(browseDirectoriesButton);
-
-		// new project from archive radio button
-		projectFromArchiveRadio = new Button(projectGroup, SWT.RADIO);
-		projectFromArchiveRadio
-				.setText(DataTransferMessages.WizardProjectsImportPage_ArchiveSelectTitle);
-
-		// project location entry field
-		archivePathField = new Text(projectGroup, SWT.BORDER);
-
-		archivePathField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.GRAB_HORIZONTAL));
-		// browse button
-		browseArchivesButton = new Button(projectGroup, SWT.PUSH);
-		browseArchivesButton.setText(DataTransferMessages.DataTransfer_browse);
-		setButtonLayoutData(browseArchivesButton);
-
-		projectFromDirectoryRadio.setSelection(true);
-		archivePathField.setEnabled(false);
-		browseArchivesButton.setEnabled(false);
-
-		browseDirectoriesButton.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionAdapter#widgetS
-			 * elected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				handleLocationDirectoryButtonPressed();
-			}
-
-		});
-
-		browseArchivesButton.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse
-			 * .swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				handleLocationArchiveButtonPressed();
-			}
-
-		});
-
-		directoryPathField.addTraverseListener(new TraverseListener() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.swt.events.TraverseListener#keyTraversed(org.eclipse
-			 * .swt.events.TraverseEvent)
-			 */
-			public void keyTraversed(TraverseEvent e) {
-				if (e.detail == SWT.TRAVERSE_RETURN) {
-					e.doit = false;
-					updateProjectsList(directoryPathField.getText().trim());
-				}
-			}
-
-		});
-
-		directoryPathField.addFocusListener(new FocusAdapter() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt
-			 * .events.FocusEvent)
-			 */
-			public void focusLost(org.eclipse.swt.events.FocusEvent e) {
-				updateProjectsList(directoryPathField.getText().trim());
-			}
-
-		});
-
-		archivePathField.addTraverseListener(new TraverseListener() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.swt.events.TraverseListener#keyTraversed(org.eclipse
-			 * .swt.events.TraverseEvent)
-			 */
-			public void keyTraversed(TraverseEvent e) {
-				if (e.detail == SWT.TRAVERSE_RETURN) {
-					e.doit = false;
-					updateProjectsList(archivePathField.getText().trim());
-				}
-			}
-
-		});
-
-		archivePathField.addFocusListener(new FocusAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt
-			 * .events.FocusEvent)
-			 */
-			public void focusLost(org.eclipse.swt.events.FocusEvent e) {
-				updateProjectsList(archivePathField.getText().trim());
-			}
-		});
-
-		projectFromDirectoryRadio.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse
-			 * .swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				directoryRadioSelected();
-			}
-		});
-
-		projectFromArchiveRadio.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse
-			 * .swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				archiveRadioSelected();
-			}
-		});
-	}
-
-	private void archiveRadioSelected() {
-		if (projectFromArchiveRadio.getSelection()) {
-			directoryPathField.setEnabled(false);
-			browseDirectoriesButton.setEnabled(false);
-			archivePathField.setEnabled(true);
-			browseArchivesButton.setEnabled(true);
-			updateProjectsList(archivePathField.getText());
-			archivePathField.setFocus();
-			copyCheckbox.setSelection(true);
-			copyCheckbox.setEnabled(false);
-		}
-	}
-
-	private void directoryRadioSelected() {
-		if (projectFromDirectoryRadio.getSelection()) {
-			directoryPathField.setEnabled(true);
-			browseDirectoriesButton.setEnabled(true);
-			archivePathField.setEnabled(false);
-			browseArchivesButton.setEnabled(false);
-			updateProjectsList(directoryPathField.getText());
-			directoryPathField.setFocus();
-			copyCheckbox.setEnabled(true);
-			copyCheckbox.setSelection(copyFiles);
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IDialogPage. Set the focus on path
-	 * fields when page becomes visible.
-	 */
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		if (visible && this.projectFromDirectoryRadio.getSelection()) {
-			this.directoryPathField.setFocus();
-		}
-		if (visible && this.projectFromArchiveRadio.getSelection()) {
-			this.archivePathField.setFocus();
-		}
-	}
-
-	/**
-	 * Update the list of projects based on path. Method declared public only
-	 * for test suite.
-	 * 
-	 * @param path
-	 */
-	public void updateProjectsList(final String path) {
-		// on an empty path empty selectedProjects
-		if (path == null || path.length() == 0) {
-			setMessage(DataTransferMessages.WizardProjectsImportPage_ImportProjectsDescription);
-			selectedProjects = new ProjectRecord[0];
-			projectsList.refresh(true);
-			projectsList.setCheckedElements(selectedProjects);
-			setPageComplete(projectsList.getCheckedElements().length > 0);
-			lastPath = path;
-			return;
-		}
-
-		final File directory = new File(path);
-		long modified = directory.lastModified();
-		if (path.equals(lastPath) && lastModified == modified) {
-			// since the file/folder was not modified and the path did not
-			// change, no refreshing is required
-			return;
-		}
-
-		lastPath = path;
-		lastModified = modified;
-
-		// We can't access the radio button from the inner class so get the
-		// status beforehand
-		final boolean dirSelected = this.projectFromDirectoryRadio
-				.getSelection();
-		try {
-			getContainer().run(true, true, new IRunnableWithProgress() {
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see
-				 * org.eclipse.jface.operation.IRunnableWithProgress#run(org
-				 * .eclipse.core.runtime.IProgressMonitor)
-				 */
-				public void run(IProgressMonitor monitor) {
-
-					monitor
-							.beginTask(
-									DataTransferMessages.WizardProjectsImportPage_SearchingMessage,
-									100);
-					selectedProjects = new ProjectRecord[0];
-					Collection files = new ArrayList();
-					monitor.worked(10);
-					if (!dirSelected
-							&& ArchiveFileManipulations.isTarFile(path)) {
-						TarFile sourceTarFile = getSpecifiedTarSourceFile(path);
-						if (sourceTarFile == null) {
-							return;
-						}
-
-						structureProvider = new TarLeveledStructureProvider(
-								sourceTarFile);
-						Object child = structureProvider.getRoot();
-
-						if (!collectProjectFilesFromProvider(files, child, 0,
-								monitor)) {
-							return;
-						}
-						Iterator filesIterator = files.iterator();
-						selectedProjects = new ProjectRecord[files.size()];
-						int index = 0;
-						monitor.worked(50);
-						monitor
-								.subTask(DataTransferMessages.WizardProjectsImportPage_ProcessingMessage);
-						while (filesIterator.hasNext()) {
-							selectedProjects[index++] = (ProjectRecord) filesIterator
-									.next();
-						}
-					} else if (!dirSelected
-							&& ArchiveFileManipulations.isZipFile(path)) {
-						ZipFile sourceFile = getSpecifiedZipSourceFile(path);
-						if (sourceFile == null) {
-							return;
-						}
-						structureProvider = new ZipLeveledStructureProvider(
-								sourceFile);
-						Object child = structureProvider.getRoot();
-
-						if (!collectProjectFilesFromProvider(files, child, 0,
-								monitor)) {
-							return;
-						}
-						Iterator filesIterator = files.iterator();
-						selectedProjects = new ProjectRecord[files.size()];
-						int index = 0;
-						monitor.worked(50);
-						monitor
-								.subTask(DataTransferMessages.WizardProjectsImportPage_ProcessingMessage);
-						while (filesIterator.hasNext()) {
-							selectedProjects[index++] = (ProjectRecord) filesIterator
-									.next();
-						}
-					}
-
-					else if (dirSelected && directory.isDirectory()) {
-
-						if (!collectProjectFilesFromDirectory(files, directory,
-								null, monitor)) {
-							return;
-						}
-						Iterator filesIterator = files.iterator();
-						selectedProjects = new ProjectRecord[files.size()];
-						int index = 0;
-						monitor.worked(50);
-						monitor
-								.subTask(DataTransferMessages.WizardProjectsImportPage_ProcessingMessage);
-						while (filesIterator.hasNext()) {
-							File file = (File) filesIterator.next();
-							selectedProjects[index] = new ProjectRecord(file);
-							index++;
-						}
-					} else {
-						monitor.worked(60);
-					}
-					monitor.done();
-				}
-
-			});
-		} catch (InvocationTargetException e) {
-			IDEWorkbenchPlugin.log(e.getMessage(), e);
-		} catch (InterruptedException e) {
-			// Nothing to do if the user interrupts.
-		}
-
-		projectsList.refresh(true);
-		projectsList.setCheckedElements(getValidProjects());
-		if (getValidProjects().length < selectedProjects.length) {
-			setMessage(
-					DataTransferMessages.WizardProjectsImportPage_projectsInWorkspace,
-					WARNING);
-		} else {
-			setMessage(DataTransferMessages.WizardProjectsImportPage_ImportProjectsDescription);
-		}
-		setPageComplete(projectsList.getCheckedElements().length > 0);
-	}
-
-	/**
-	 * Answer a handle to the zip file currently specified as being the source.
-	 * Return null if this file does not exist or is not of valid format.
-	 */
-	private ZipFile getSpecifiedZipSourceFile(String fileName) {
-		if (fileName.length() == 0) {
-			return null;
-		}
-
-		try {
-			return new ZipFile(fileName);
-		} catch (ZipException e) {
-			displayErrorDialog(DataTransferMessages.ZipImport_badFormat);
-		} catch (IOException e) {
-			displayErrorDialog(DataTransferMessages.ZipImport_couldNotRead);
-		}
-
-		archivePathField.setFocus();
-		return null;
-	}
-
-	/**
-	 * Answer a handle to the zip file currently specified as being the source.
-	 * Return null if this file does not exist or is not of valid format.
-	 */
-	private TarFile getSpecifiedTarSourceFile(String fileName) {
-		if (fileName.length() == 0) {
-			return null;
-		}
-
-		try {
-			return new TarFile(fileName);
-		} catch (TarException e) {
-			displayErrorDialog(DataTransferMessages.TarImport_badFormat);
-		} catch (IOException e) {
-			displayErrorDialog(DataTransferMessages.ZipImport_couldNotRead);
-		}
-
-		archivePathField.setFocus();
-		return null;
-	}
-
-	/**
-	 * Display an error dialog with the specified message.
-	 * 
-	 * @param message
-	 * 		the error message
-	 */
-	protected void displayErrorDialog(String message) {
-		MessageDialog.openError(getContainer().getShell(),
-				getErrorDialogTitle(), message);
-	}
-
-	/**
-	 * Get the title for an error dialog. Subclasses should override.
-	 */
-	protected String getErrorDialogTitle() {
-		return IDEWorkbenchMessages.WizardExportPage_internalErrorTitle;
-	}
-
-	/**
-	 * Collect the list of .project files that are under directory into files.
-	 * 
-	 * @param files
-	 * @param directory
-	 * @param directoriesVisited
-	 * 		Set of canonical paths of directories, used as recursion guard
-	 * @param monitor
-	 * 		The monitor to report to
-	 * @return boolean <code>true</code> if the operation was completed.
-	 */
-	private boolean collectProjectFilesFromDirectory(Collection files,
-			File directory, Set directoriesVisited, IProgressMonitor monitor) {
-
-		if (monitor.isCanceled()) {
-			return false;
-		}
-		monitor.subTask(NLS.bind(
-				DataTransferMessages.WizardProjectsImportPage_CheckingMessage,
-				directory.getPath()));
-		File[] contents = directory.listFiles();
-		if (contents == null)
-			return false;
-
-		// Initialize recursion guard for recursive symbolic links
-		if (directoriesVisited == null) {
-			directoriesVisited = new HashSet();
-			try {
-				directoriesVisited.add(directory.getCanonicalPath());
-			} catch (IOException exception) {
-				StatusManager.getManager().handle(
-						StatusUtil.newStatus(IStatus.ERROR, exception
-								.getLocalizedMessage(), exception));
-			}
-		}
-
-		// first look for project description files
-		final String dotProject = IProjectDescription.DESCRIPTION_FILE_NAME;
-		for (int i = 0; i < contents.length; i++) {
-			File file = contents[i];
-			if (file.isFile() && file.getName().equals(dotProject)) {
-				files.add(file);
-				// don't search sub-directories since we can't have nested
-				// projects
-				return true;
-			}
-		}
-		// no project description found, so recurse into sub-directories
-		for (int i = 0; i < contents.length; i++) {
-			if (contents[i].isDirectory()) {
-				if (!contents[i].getName().equals(METADATA_FOLDER)) {
-					try {
-						String canonicalPath = contents[i].getCanonicalPath();
-						if (!directoriesVisited.add(canonicalPath)) {
-							// already been here --> do not recurse
-							continue;
-						}
-					} catch (IOException exception) {
-						StatusManager.getManager().handle(
-								StatusUtil.newStatus(IStatus.ERROR, exception
-										.getLocalizedMessage(), exception));
-
-					}
-					collectProjectFilesFromDirectory(files, contents[i],
-							directoriesVisited, monitor);
-				}
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Collect the list of .project files that are under directory into files.
-	 * 
-	 * @param files
-	 * @param monitor
-	 * 		The monitor to report to
-	 * @return boolean <code>true</code> if the operation was completed.
-	 */
-	private boolean collectProjectFilesFromProvider(Collection files,
-			Object entry, int level, IProgressMonitor monitor) {
-
-		if (monitor.isCanceled()) {
-			return false;
-		}
-		monitor.subTask(NLS.bind(
-				DataTransferMessages.WizardProjectsImportPage_CheckingMessage,
-				structureProvider.getLabel(entry)));
-		List children = structureProvider.getChildren(entry);
-		if (children == null) {
-			children = new ArrayList(1);
-		}
-		Iterator childrenEnum = children.iterator();
-		while (childrenEnum.hasNext()) {
-			Object child = childrenEnum.next();
-			if (structureProvider.isFolder(child)) {
-				collectProjectFilesFromProvider(files, child, level + 1,
-						monitor);
-			}
-			String elementLabel = structureProvider.getLabel(child);
-			if (elementLabel.equals(IProjectDescription.DESCRIPTION_FILE_NAME)) {
-				files.add(new ProjectRecord(child, entry, level));
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * The browse button has been selected. Select the location.
-	 */
-	protected void handleLocationDirectoryButtonPressed() {
-
-		DirectoryDialog dialog = new DirectoryDialog(directoryPathField
-				.getShell());
-		dialog
-				.setMessage(DataTransferMessages.WizardProjectsImportPage_SelectDialogTitle);
-
-		String dirName = directoryPathField.getText().trim();
-		if (dirName.length() == 0) {
-			dirName = previouslyBrowsedDirectory;
-		}
-
-		if (dirName.length() == 0) {
-			dialog.setFilterPath(IDEWorkbenchPlugin.getPluginWorkspace()
-					.getRoot().getLocation().toOSString());
-		} else {
-			File path = new File(dirName);
-			if (path.exists()) {
-				dialog.setFilterPath(new Path(dirName).toOSString());
-			}
-		}
-
-		String selectedDirectory = dialog.open();
-		if (selectedDirectory != null) {
-			previouslyBrowsedDirectory = selectedDirectory;
-			directoryPathField.setText(previouslyBrowsedDirectory);
-			updateProjectsList(selectedDirectory);
-		}
-
-	}
-
-	/**
-	 * The browse button has been selected. Select the location.
-	 */
-	protected void handleLocationArchiveButtonPressed() {
-
-		FileDialog dialog = new FileDialog(archivePathField.getShell());
-		dialog.setFilterExtensions(FILE_IMPORT_MASK);
-		dialog
-				.setText(DataTransferMessages.WizardProjectsImportPage_SelectArchiveDialogTitle);
-
-		String fileName = archivePathField.getText().trim();
-		if (fileName.length() == 0) {
-			fileName = previouslyBrowsedArchive;
-		}
-
-		if (fileName.length() == 0) {
-			dialog.setFilterPath(IDEWorkbenchPlugin.getPluginWorkspace()
-					.getRoot().getLocation().toOSString());
-		} else {
-			File path = new File(fileName).getParentFile();
-			if (path != null && path.exists()) {
-				dialog.setFilterPath(path.toString());
-			}
-		}
-
-		String selectedArchive = dialog.open();
-		if (selectedArchive != null) {
-			previouslyBrowsedArchive = selectedArchive;
-			archivePathField.setText(previouslyBrowsedArchive);
-			updateProjectsList(selectedArchive);
-		}
-
-	}
-
-	/**
-	 * Create the selected projects
-	 * 
-	 * @return boolean <code>true</code> if all project creations were
-	 * 	successful.
-	 */
-	public boolean createProjects() {
-		saveWidgetValues();
-		final Object[] selected = projectsList.getCheckedElements();
-		WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
-			protected void execute(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				try {
-					monitor.beginTask("", selected.length); //$NON-NLS-1$
-					if (monitor.isCanceled()) {
-						throw new OperationCanceledException();
-					}
-					for (int i = 0; i < selected.length; i++) {
-						createExistingProject((ProjectRecord) selected[i],
-								new SubProgressMonitor(monitor, 1));
-					}
-				} finally {
-					monitor.done();
-				}
-			}
-		};
-		// run the new project creation operation
-		try {
-			getContainer().run(true, true, op);
-		} catch (InterruptedException e) {
-			return false;
-		} catch (InvocationTargetException e) {
-			// one of the steps resulted in a core exception
-			Throwable t = e.getTargetException();
-			String message = DataTransferMessages.WizardExternalProjectImportPage_errorMessage;
-			IStatus status;
-			if (t instanceof CoreException) {
-				status = ((CoreException) t).getStatus();
-			} else {
-				status = new Status(IStatus.ERROR,
-						IDEWorkbenchPlugin.IDE_WORKBENCH, 1, message, t);
-			}
-			ErrorDialog.openError(getShell(), message, null, status);
-			return false;
-		}
-		ArchiveFileManipulations.closeStructureProvider(structureProvider,
-				getShell());
-		return true;
-	}
-
-	/**
-	 * Performs clean-up if the user cancels the wizard without doing anything
-	 */
-	public void performCancel() {
-		ArchiveFileManipulations.closeStructureProvider(structureProvider,
-				getShell());
-	}
-
-	/**
-	 * Create the project described in record. If it is successful return true.
-	 * 
-	 * @param record
-	 * @return boolean <code>true</code> if successful
-	 * @throws InterruptedException
-	 */
-	private boolean createExistingProject(final ProjectRecord record,
-			IProgressMonitor monitor) throws InvocationTargetException,
-			InterruptedException {
-		String projectName = record.getProjectName();
-		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		final IProject project = workspace.getRoot().getProject(projectName);
-		if (record.description == null) {
-			// error case
-			record.description = workspace.newProjectDescription(projectName);
-			IPath locationPath = new Path(record.projectSystemFile
-					.getAbsolutePath());
-
-			// If it is under the root use the default location
-			if (Platform.getLocation().isPrefixOf(locationPath)) {
-				record.description.setLocation(null);
-			} else {
-				record.description.setLocation(locationPath);
-			}
-		} else {
-			record.description.setName(projectName);
-		}
-		if (record.projectArchiveFile != null) {
-			// import from archive
-			List fileSystemObjects = structureProvider
-					.getChildren(record.parent);
-			structureProvider.setStrip(record.level);
-			ImportOperation operation = new ImportOperation(project
-					.getFullPath(), structureProvider.getRoot(),
-					structureProvider, this, fileSystemObjects);
-			operation.setContext(getShell());
-			operation.run(monitor);
-			return true;
-		}
-		// import from file system
-		File importSource = null;
-		if (copyFiles) {
-			// import project from location copying files - use default project
-			// location for this workspace
-			URI locationURI = record.description.getLocationURI();
-			// if location is null, project already exists in this location or
-			// some error condition occured.
-			if (locationURI != null) {
-				importSource = new File(locationURI);
-				IProjectDescription desc = workspace
-						.newProjectDescription(projectName);
-				desc.setBuildSpec(record.description.getBuildSpec());
-				desc.setComment(record.description.getComment());
-				desc.setDynamicReferences(record.description
-						.getDynamicReferences());
-				desc.setNatureIds(record.description.getNatureIds());
-				desc.setReferencedProjects(record.description
-						.getReferencedProjects());
-				record.description = desc;
-			}
-		}
-
-		try {
-			monitor
-					.beginTask(
-							DataTransferMessages.WizardProjectsImportPage_CreateProjectsTask,
-							100);
-			project.create(record.description, new SubProgressMonitor(monitor,
-					30));
-			project.open(IResource.BACKGROUND_REFRESH, new SubProgressMonitor(
-					monitor, 70));
-		} catch (CoreException e) {
-			throw new InvocationTargetException(e);
-		} finally {
-			monitor.done();
-		}
-
-		// import operation to import project files if copy checkbox is selected
-		if (copyFiles && importSource != null) {
-			List filesToImport = FileSystemStructureProvider.INSTANCE
-					.getChildren(importSource);
-			ImportOperation operation = new ImportOperation(project
-					.getFullPath(), importSource,
-					FileSystemStructureProvider.INSTANCE, this, filesToImport);
-			operation.setContext(getShell());
-			operation.setOverwriteResources(true); // need to overwrite
-			// .project, .classpath
-			// files
-			operation.setCreateContainerStructure(false);
-			operation.run(monitor);
-		}
-
-		return true;
-	}
-
-	/**
-	 * The <code>WizardDataTransfer</code> implementation of this
-	 * <code>IOverwriteQuery</code> method asks the user whether the existing
-	 * resource at the given path should be overwritten.
-	 * 
-	 * @param pathString
-	 * @return the user's reply: one of <code>"YES"</code>, <code>"NO"</code>,
-	 * 	<code>"ALL"</code>, or <code>"CANCEL"</code>
-	 */
-	public String queryOverwrite(String pathString) {
-
-		Path path = new Path(pathString);
-
-		String messageString;
-		// Break the message up if there is a file name and a directory
-		// and there are at least 2 segments.
-		if (path.getFileExtension() == null || path.segmentCount() < 2) {
-			messageString = NLS.bind(
-					IDEWorkbenchMessages.WizardDataTransfer_existsQuestion,
-					pathString);
-		} else {
-			messageString = NLS
-					.bind(
-							IDEWorkbenchMessages.WizardDataTransfer_overwriteNameAndPathQuestion,
-							path.lastSegment(), path.removeLastSegments(1)
-									.toOSString());
-		}
-
-		final MessageDialog dialog = new MessageDialog(getContainer()
-				.getShell(), IDEWorkbenchMessages.Question, null,
-				messageString, MessageDialog.QUESTION, new String[] {
-						IDialogConstants.YES_LABEL,
-						IDialogConstants.YES_TO_ALL_LABEL,
-						IDialogConstants.NO_LABEL,
-						IDialogConstants.NO_TO_ALL_LABEL,
-						IDialogConstants.CANCEL_LABEL }, 0);
-		String[] response = new String[] { YES, ALL, NO, NO_ALL, CANCEL };
-		// run in syncExec because callback is from an operation,
-		// which is probably not running in the UI thread.
-		getControl().getDisplay().syncExec(new Runnable() {
-			public void run() {
-				dialog.open();
-			}
-		});
-		return dialog.getReturnCode() < 0 ? CANCEL : response[dialog
-				.getReturnCode()];
-	}
-
-	/**
-	 * Method used for test suite.
-	 * 
-	 * @return Button the Import from Directory RadioButton
-	 */
-	public Button getProjectFromDirectoryRadio() {
-		return projectFromDirectoryRadio;
-	}
-
-	/**
-	 * Method used for test suite.
-	 * 
-	 * @return CheckboxTreeViewer the viewer containing all the projects found
-	 */
-	public CheckboxTreeViewer getProjectsList() {
-		return projectsList;
-	}
-
-	/**
-	 * Retrieve all the projects in the current workspace.
-	 * 
-	 * @return IProject[] array of IProject in the current workspace
-	 */
-	private IProject[] getProjectsInWorkspace() {
-		if (wsProjects == null) {
-			wsProjects = IDEWorkbenchPlugin.getPluginWorkspace().getRoot()
-					.getProjects();
-		}
-		return wsProjects;
-	}
-
-	/**
-	 * Get the array of valid project records that can be imported from the
-	 * source workspace or archive, selected by the user. If a project with the
-	 * same name exists in both the source workspace and the current workspace,
-	 * it will not appear in the list of projects to import and thus cannot be
-	 * selected for import.
-	 * 
-	 * Method declared public for test suite.
-	 * 
-	 * @return ProjectRecord[] array of projects that can be imported into the
-	 * 	workspace
-	 */
-	public ProjectRecord[] getValidProjects() {
-		List validProjects = new ArrayList();
-		for (int i = 0; i < selectedProjects.length; i++) {
-			if (!isProjectInWorkspace(selectedProjects[i].getProjectName())) {
-				validProjects.add(selectedProjects[i]);
-			}
-		}
-		return (ProjectRecord[]) validProjects
-				.toArray(new ProjectRecord[validProjects.size()]);
-	}
-
-	/**
-	 * Determine if the project with the given name is in the current workspace.
-	 * 
-	 * @param projectName
-	 * 		String the project name to check
-	 * @return boolean true if the project with the given name is in this
-	 * 	workspace
-	 */
-	private boolean isProjectInWorkspace(String projectName) {
-		if (projectName == null) {
-			return false;
-		}
-		IProject[] workspaceProjects = getProjectsInWorkspace();
-		for (int i = 0; i < workspaceProjects.length; i++) {
-			if (projectName.equals(workspaceProjects[i].getName())) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Use the dialog store to restore widget values to the values that they
-	 * held last time this wizard was used to completion.
-	 * 
-	 * Method declared public only for use of tests.
-	 */
-	public void restoreWidgetValues() {
-		IDialogSettings settings = getDialogSettings();
-		if (settings != null) {
-			// checkbox
-			copyFiles = settings.getBoolean(STORE_COPY_PROJECT_ID);
-			copyCheckbox.setSelection(copyFiles);
-
-			// radio selection
-			boolean archiveSelected = settings
-					.getBoolean(STORE_ARCHIVE_SELECTED);
-			projectFromDirectoryRadio.setSelection(!archiveSelected);
-			projectFromArchiveRadio.setSelection(archiveSelected);
-			if (archiveSelected) {
-				archiveRadioSelected();
-			} else {
-				directoryRadioSelected();
-			}
-		}
-	}
-
-	/**
-	 * Since Finish was pressed, write widget values to the dialog store so that
-	 * they will persist into the next invocation of this wizard page.
-	 * 
-	 * Method declared public only for use of tests.
-	 */
-	public void saveWidgetValues() {
-		IDialogSettings settings = getDialogSettings();
-		if (settings != null) {
-			settings.put(STORE_COPY_PROJECT_ID, copyCheckbox.getSelection());
-
-			settings.put(STORE_ARCHIVE_SELECTED, projectFromArchiveRadio
-					.getSelection());
-		}
-	}
-
-	/**
-	 * Method used for test suite.
-	 * 
-	 * @return Button copy checkbox
-	 */
-	public Button getCopyCheckbox() {
-		return copyCheckbox;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ZipFileExporter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ZipFileExporter.java
deleted file mode 100644
index 7133d7b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ZipFileExporter.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.zip.CRC32;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-
-
-/**
- *	Exports resources to a .zip file
- */
-public class ZipFileExporter implements IFileExporter {
-    private ZipOutputStream outputStream;
-
-    private boolean useCompression = true;
-
-    /**
-     *	Create an instance of this class.
-     *
-     *	@param filename java.lang.String
-     *	@param compress boolean
-     *	@exception java.io.IOException
-     */
-    public ZipFileExporter(String filename, boolean compress) throws IOException {
-        outputStream = new ZipOutputStream(new FileOutputStream(filename));
-        useCompression = compress;
-    }
-
-    /**
-     *	Do all required cleanup now that we're finished with the
-     *	currently-open .zip
-     *
-     *	@exception java.io.IOException
-     */
-    public void finished() throws IOException {
-        outputStream.close();
-    }
-
-    /**
-     *	Write the contents of the file to the tar archive.
-     *
-     *	@param entry
-     *	@param contents
-     *  @exception java.io.IOException
-     *  @exception org.eclipse.core.runtime.CoreException
-     */
-    private void write(ZipEntry entry, IFile contents) throws IOException, CoreException {
-        byte[] readBuffer = new byte[4096];
-
-        // If the contents are being compressed then we get the below for free.
-        if (!useCompression) {
-            entry.setMethod(ZipEntry.STORED);
-        	InputStream contentStream = contents.getContents(false);
-        	int length = 0;
-            CRC32 checksumCalculator = new CRC32();
-            try {
-                int n;
-                while ((n = contentStream.read(readBuffer)) > 0) {
-                    checksumCalculator.update(readBuffer, 0, n);
-                    length += n;
-                }
-            } finally {
-                if (contentStream != null) {
-					contentStream.close();
-				}
-            }
-
-            entry.setSize(length);
-            entry.setCrc(checksumCalculator.getValue());
-        }
-
-        outputStream.putNextEntry(entry);
-    	InputStream contentStream = contents.getContents(false);
-        try {
-            int n;
-            while ((n = contentStream.read(readBuffer)) > 0) {
-                outputStream.write(readBuffer, 0, n);
-            }
-        } finally {
-            if (contentStream != null) {
-				contentStream.close();
-			}
-        }
-        outputStream.closeEntry();
-    }
-
-    /**
-     *  Write the passed resource to the current archive.
-     *
-     *  @param resource org.eclipse.core.resources.IFile
-     *  @param destinationPath java.lang.String
-     *  @exception java.io.IOException
-     *  @exception org.eclipse.core.runtime.CoreException
-     */
-    public void write(IFile resource, String destinationPath)
-            throws IOException, CoreException {
-        ZipEntry newEntry = new ZipEntry(destinationPath);
-        write(newEntry, resource);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ZipLeveledStructureProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ZipLeveledStructureProvider.java
deleted file mode 100644
index de1430b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/ZipLeveledStructureProvider.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Red Hat, Inc - Was ZipFileStructureProvider, performed changes from 
- *     IImportStructureProvider to ILeveledImportStructureProvider
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.datatransfer;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * This class provides information regarding the context structure and content
- * of specified zip file entry objects.
- * 
- * @since 3.1
- */
-public class ZipLeveledStructureProvider implements
-		ILeveledImportStructureProvider {
-	private ZipFile zipFile;
-
-	private ZipEntry root = new ZipEntry("/");//$NON-NLS-1$
-
-	private Map children;
-
-	private Map directoryEntryCache = new HashMap();
-
-	private int stripLevel;
-
-	/**
-	 * Creates a <code>ZipFileStructureProvider</code>, which will operate on
-	 * the passed zip file.
-	 * 
-	 * @param sourceFile
-	 *            The source file to create the ZipLeveledStructureProvider
-	 *            around
-	 */
-	public ZipLeveledStructureProvider(ZipFile sourceFile) {
-		super();
-		zipFile = sourceFile;
-		stripLevel = 0;
-	}
-
-	/**
-	 * Creates a new container zip entry with the specified name, iff it has 
-	 * not already been created. If the parent of the given element does not
-	 * already exist it will be recursively created as well.
-	 * @param pathname The path representing the container
-	 * @return The element represented by this pathname (it may have already existed)
-	 */
-	protected ZipEntry createContainer(IPath pathname) {
-		ZipEntry existingEntry = (ZipEntry) directoryEntryCache.get(pathname);
-		if (existingEntry != null) {
-			return existingEntry;
-		}
-
-		ZipEntry parent;
-		if (pathname.segmentCount() == 1) {
-			parent = root;
-		} else {
-			parent = createContainer(pathname.removeLastSegments(1));
-		}
-		ZipEntry newEntry = new ZipEntry(pathname.toString());
-		directoryEntryCache.put(pathname, newEntry);
-		List childList = new ArrayList();
-		children.put(newEntry, childList);
-
-		List parentChildList = (List) children.get(parent);
-		parentChildList.add(newEntry);
-		return newEntry;
-	}
-
-	/**
-	 * Creates a new file zip entry with the specified name.
-	 */
-	protected void createFile(ZipEntry entry) {
-		IPath pathname = new Path(entry.getName());
-		ZipEntry parent;
-		if (pathname.segmentCount() == 1) {
-			parent = root;
-		} else {
-			parent = (ZipEntry) directoryEntryCache.get(pathname
-					.removeLastSegments(1));
-		}
-
-		List childList = (List) children.get(parent);
-		childList.add(entry);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IImportStructureProvider
-	 */
-	public List getChildren(Object element) {
-		if (children == null) {
-			initialize();
-		}
-
-		return ((List) children.get(element));
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IImportStructureProvider
-	 */
-	public InputStream getContents(Object element) {
-		try {
-			return zipFile.getInputStream((ZipEntry) element);
-		} catch (IOException e) {
-			IDEWorkbenchPlugin.log(e.getLocalizedMessage(), e);
-			return null;
-		}
-	}
-
-	/*
-	 * Strip the leading directories from the path
-	 */
-	private String stripPath(String path) {
-		String pathOrig = new String(path);
-		for (int i = 0; i < stripLevel; i++) {
-			int firstSep = path.indexOf('/');
-			// If the first character was a seperator we must strip to the next
-			// seperator as well
-			if (firstSep == 0) {
-				path = path.substring(1);
-				firstSep = path.indexOf('/');
-			}
-			// No seperator wasw present so we're in a higher directory right
-			// now
-			if (firstSep == -1) {
-				return pathOrig;
-			}
-			path = path.substring(firstSep);
-		}
-		return path;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IImportStructureProvider
-	 */
-	public String getFullPath(Object element) {
-		return stripPath(((ZipEntry) element).getName());
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IImportStructureProvider
-	 */
-	public String getLabel(Object element) {
-		if (element.equals(root)) {
-			return ((ZipEntry) element).getName();
-		}
-
-		return stripPath(new Path(((ZipEntry) element).getName()).lastSegment());
-	}
-
-	/**
-	 * Returns the entry that this importer uses as the root sentinel.
-	 * 
-	 * @return java.util.zip.ZipEntry
-	 */
-	public Object getRoot() {
-		return root;
-	}
-
-	/**
-	 * Returns the zip file that this provider provides structure for.
-	 * 
-	 * @return The zip file
-	 */
-	public ZipFile getZipFile() {
-		return zipFile;
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.internal.wizards.datatransfer.ILeveledImportStructureProvider#closeArchive()
-	 */
-	public boolean closeArchive(){
-		try {
-			getZipFile().close();
-		} catch (IOException e) {
-			IDEWorkbenchPlugin.log(DataTransferMessages.ZipImport_couldNotClose
-					+ getZipFile().getName(), e);
-			return false;
-		}
-		return true;
-	}
-	
-	/**
-	 * Initializes this object's children table based on the contents of the
-	 * specified source file.
-	 */
-	protected void initialize() {
-		children = new HashMap(1000);
-
-		children.put(root, new ArrayList());
-		Enumeration entries = zipFile.entries();
-		while (entries.hasMoreElements()) {
-			ZipEntry entry = (ZipEntry) entries.nextElement();
-			IPath path = new Path(entry.getName()).addTrailingSeparator();
-
-			if (entry.isDirectory()) {
-				createContainer(path);
-			} else
-			{
-				// Ensure the container structure for all levels above this is initialized
-				// Once we hit a higher-level container that's already added we need go no further
-				int pathSegmentCount = path.segmentCount();
-				if (pathSegmentCount > 1) {
-					createContainer(path.uptoSegment(pathSegmentCount - 1));
-				}
-				createFile(entry);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IImportStructureProvider
-	 */
-	public boolean isFolder(Object element) {
-		return ((ZipEntry) element).isDirectory();
-	}
-
-	public void setStrip(int level) {
-		stripLevel = level;
-	}
-
-	public int getStrip() {
-		return stripLevel;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/messages.properties b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/messages.properties
deleted file mode 100644
index 97e8433..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/messages.properties
+++ /dev/null
@@ -1,139 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-#     Red Hat, Inc - WizardProjectsImportPage[_ArchiveSelectTitle,
-#											  _SelectArchiveDialogTitle]
-###############################################################################
-
-# package: org.eclipse.ui.wizards.datatransfer
-
-
-# ==============================================================================
-# Data Transfer Wizards
-# ==============================================================================
-DataTransfer_fileSystemTitle = File system
-ZipExport_exportTitle = Zip file
-ArchiveExport_exportTitle = Archive file
-
-DataTransfer_browse = B&rowse...
-DataTransfer_selectTypes = Filter &Types...
-DataTransfer_selectAll = &Select All
-DataTransfer_deselectAll = &Deselect All
-DataTransfer_refresh = R&efresh
-
-DataTransfer_cannotOverwrite = Cannot overwrite file: {0}
-DataTransfer_emptyString =
-DataTransfer_scanningMatching = Scanning for matching files...
-DataTransfer_information = Information
-
-# --- Import Wizards ---
-DataTransfer_importTitle = Import
-
-DataTransfer_importTask = Importing:
-ImportOperation_cannotCopy = Cannot copy root file system.
-ImportOperation_importProblems = Problems were encountered during import:
-ImportOperation_openStreamError = Error opening input stream for {0}
-ImportOperation_closeStreamError = Could not close input stream for {0}
-ImportOperation_coreImportError = Unable to import {0}.  Reason: {1}
-ImportOperation_targetSameAsSourceError = Unable to import {0}. The file cannot be copied onto itself
-ImportPage_filterSelections = Filtering selection
-
-FileImport_selectSource = Select a directory to import from.
-FileImport_selectSourceTitle = Import from directory
-FileImport_fromDirectory = From director&y:
-FileImport_importFileSystem = Import resources from the local file system.
-FileImport_overwriteExisting = &Overwrite existing resources without warning
-FileImport_createComplete = &Create complete folder structure
-FileImport_createSelectedFolders = Create s&elected folders only
-FileImport_noneSelected = There are no resources currently selected for import.
-FileImport_invalidSource = Source directory is not valid or has not been specified.
-FileImport_sourceEmpty = Source must not be empty.
-FileImport_importProblems = Import Problems
-
-ZipImport_description = Import the contents of a Zip file from the local file system.
-ZipImport_couldNotClose = Could not close file {0}
-ZipImport_badFormat = Source file is not a valid Zip file.
-ZipImport_couldNotRead = Source file could not be read.
-ZipImport_fromFile = From &zip file:
-ZipImportSource_title = Import from Zip File
-
-ArchiveImport_description = Import the contents of an archive file in zip or tar format from the local file system.
-ArchiveImport_fromFile = From &archive file:
-ArchiveImportSource_title = Import from Archive File
-TarImport_badFormat = Source file is not a valid tar file.
-TarImport_invalid_tar_format = Not a valid tar format
-
-WizardExternalProjectImportPage_locationError = Invalid project contents directory
-WizardExternalProjectImportPage_projectLocationEmpty = Project contents directory must be specified
-WizardExternalProjectImportPage_projectExistsMessage = Project already exists.
-WizardExternalProjectImportPage_projectContentsLabel = Project &contents:
-WizardExternalProjectImportPage_nameLabel = &Project name:
-WizardProjectsImportPage_RootSelectTitle=Select roo&t directory:
-WizardExternalProjectImportPage_title = Import Project from File System
-WizardExternalProjectImportPage_description = Create a new Project from an Eclipse project in the file system.
-WizardExternalProjectImportPage_notAProject = {0} does not have a .project file.
-WizardExternalProjectImportPage_caseVariantExistsError = The name of {0} conflicts with another project in the workbench. Project names are case-insensitive.
-WizardExternalProjectImportPage_directoryLabel = Select the Project location.
-WizardProjectsImportPage_ArchiveSelectTitle=Select &archive file:
-WizardProjectsImportPage_SelectArchiveDialogTitle=Select archive containing the projects to import
-WizardProjectsImportPage_ProjectsListTitle=&Projects:
-WizardProjectsImportPage_ProcessingMessage=Processing results
-WizardProjectsImportPage_SelectDialogTitle=Select root directory of the projects to import
-WizardProjectsImportPage_SearchingMessage=Searching for projects
-WizardExternalProjectImportPage_errorMessage = Creation Problems
-WizardProjectsImportPage_ImportProjectsTitle=Import Projects
-WizardProjectsImportPage_projectsInWorkspace=Some projects were hidden because they exist in the workspace directory
-WizardProjectsImportPage_CreateProjectsTask=Creating Projects
-WizardProjectsImportPage_ImportProjectsDescription=Select a directory to search for existing Eclipse projects.
-WizardProjectsImportPage_CheckingMessage= Checking: {0}
-WizardProjectsImportPage_CopyProjectsIntoWorkspace=&Copy projects into workspace
-# The first parameter is the project folder name and the second is the name from the project description
-WizardProjectsImportPage_projectLabel={0} ({1})
-
-# --- Export Wizards ---
-DataTransfer_export = Export
-
-DataTransfer_exportingTitle = Exporting:
-DataTransfer_createTargetDirectory = Target directory does not exist.  Would you like to create it?
-DataTransfer_directoryCreationError = Target directory could not be created.
-DataTransfer_errorExporting = Error exporting {0}: {1}
-DataTransfer_exportProblems = Export Problems
-
-ExportFile_overwriteExisting = &Overwrite existing files without warning
-
-FileExport_selectDestinationTitle= Export to Directory
-FileExport_selectDestinationMessage=Select a directory to export to.
-FileExport_exportLocalFileSystem = Export resources to the local file system.
-FileExport_destinationEmpty = Please enter a destination directory.
-FileExport_createDirectoryStructure = &Create directory structure for files
-FileExport_createSelectedDirectories = Create on&ly selected directories
-FileExport_noneSelected = There are no resources currently selected for export.
-FileExport_directoryExists = Target directory already exists as a file.
-FileExport_conflictingContainer = Destination directory conflicts with location of {0}.
-FileExport_rootName = workspace root
-FileSystemExportOperation_problemsExporting = Problems were encountered during export:
-FileExport_toDirectory = To director&y:
-FileExport_damageWarning=The project {0} may be damaged after this operation
-
-ZipExport_compressContents = Co&mpress the contents of the file
-ZipExport_destinationLabel = To &zip file:
-ZipExport_mustBeFile = Export destination must be a file, not a directory.
-ZipExport_alreadyExists = Target file already exists.  Would you like to overwrite it?
-ZipExport_alreadyExistsError = Export destination already exists and cannot be overwritten.
-ZipExport_cannotOpen = Unable to open destination file: {0}
-ZipExport_cannotClose = Unable to close destination file: {0}
-ZipExport_selectDestinationTitle = Export to Zip File
-ZipExport_destinationEmpty = Please enter a destination zip file.
-
-ArchiveExport_description = Export resources to an archive file on the local file system.
-ArchiveExport_destinationLabel = To &archive file:
-ArchiveExport_selectDestinationTitle = Export to Archive File
-ArchiveExport_destinationEmpty = Please enter a destination archive file.
-ArchiveExport_saveInZipFormat = Save in &zip format
-ArchiveExport_saveInTarFormat = Sa&ve in tar format
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/package.html b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/package.html
deleted file mode 100644
index cc78334..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/package.html
+++ /dev/null
@@ -1,20 +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="Microsoft FrontPage 4.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<title>Package-level Javadoc</title>
-</head>
-
-<body>
-Internal implementation of the data transfer support of the Eclipse Platform User 
-Interface. 
-<h2>Package Specification</h2>
-This package does not contain any API.
-
-</body>
-
-</html>
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/newresource/ResourceMessages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/newresource/ResourceMessages.java
deleted file mode 100644
index 2c2cabe..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/newresource/ResourceMessages.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.wizards.newresource;
-
-import org.eclipse.osgi.util.NLS;
-
-public class ResourceMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.wizards.newresource.messages";//$NON-NLS-1$
-	
-	// ==============================================================================
-	// New Resource Wizards
-	// ==============================================================================
-	public static String FileResource_shellTitle;
-	public static String FileResource_pageTitle;
-	public static String FileResource_description;
-	public static String FileResource_errorMessage;
-
-	public static String NewFolder_title;
-	public static String NewFolder_text;
-
-	public static String NewProject_windowTitle;
-	public static String NewProject_title;
-	public static String NewProject_description;
-	public static String NewProject_referenceTitle;
-	public static String NewProject_referenceDescription;
-	public static String NewProject_errorOpeningWindow;
-	public static String NewProject_errorMessage;
-	public static String NewProject_internalError;
-	public static String NewProject_caseVariantExistsError;
-	public static String NewProject_perspSwitchTitle;
-	/**
-	 * Combines a perspective name and text for introducing a perspective switch
-	 */
-	public static String NewProject_perspSwitchMessage;
-	/**
-	 * Combines a perspective name and description with text for introducing 
-	 * a perspective switch
-	 */
-	public static String NewProject_perspSwitchMessageWithDesc;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, ResourceMessages.class);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/newresource/messages.properties b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/newresource/messages.properties
deleted file mode 100644
index ca5ae8c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/newresource/messages.properties
+++ /dev/null
@@ -1,37 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-# package: org.eclipse.ui.wizards.newresource
-
-
-# ==============================================================================
-# New Resource Wizards
-# ==============================================================================
-FileResource_shellTitle = New File
-FileResource_pageTitle = File
-FileResource_description = Create a new file resource.
-FileResource_errorMessage = Problems Opening Editor
-
-NewFolder_title = New Folder
-NewFolder_text = Folder
-
-NewProject_windowTitle = New Project
-NewProject_title = Project
-NewProject_description = Create a new project resource.
-NewProject_referenceTitle = Project References
-NewProject_referenceDescription = Select referenced projects.
-NewProject_errorOpeningWindow = Problems Opening Window
-NewProject_errorMessage = Creation Problems
-NewProject_internalError = Internal error: {0}
-NewProject_caseVariantExistsError = The underlying file system is case insensitive. There is an existing project or directory that conflicts with ''{0}''.
-NewProject_perspSwitchTitle = Open Associated Perspective?
-NewProject_perspSwitchMessage = This kind of project is associated with the {0} perspective.  Do you want to open this perspective now?
-NewProject_perspSwitchMessageWithDesc = This kind of project is associated with the {0} perspective.\n\n{1}\n\nDo you want to open this perspective now?
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkAction.java
deleted file mode 100644
index 37c5fde..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkAction.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.bookmarkexplorer;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.SelectionProviderAction;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * An abstract class for all bookmark view actions.
- */
-abstract class BookmarkAction extends SelectionProviderAction {
-    private BookmarkNavigator view;
-
-    /**
-     * Creates a bookmark action.
-     */
-    protected BookmarkAction(BookmarkNavigator view, String label) {
-        super(view.getViewer(), label);
-        this.view = view;
-    }
-
-    /**
-     * Returns the bookmarks view.
-     */
-    public BookmarkNavigator getView() {
-        return view;
-    }
-    
-	/**
-	 * Execute the specified undoable operation
-	 */
-	void execute(IUndoableOperation operation, String title,
-			IProgressMonitor monitor, IAdaptable uiInfo) {
-		try {
-			PlatformUI.getWorkbench().getOperationSupport()
-					.getOperationHistory().execute(operation, monitor, uiInfo);
-		} catch (ExecutionException e) {
-			if (e.getCause() instanceof CoreException) {
-	           ErrorDialog.openError(view.getShell(), title,
-	                    null, ((CoreException)e.getCause()).getStatus());
-			} else {
-				IDEWorkbenchPlugin.log(title, e);
-			}
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkContentProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkContentProvider.java
deleted file mode 100644
index 96d6328..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkContentProvider.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.bookmarkexplorer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IMarkerDelta;
-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.IWorkspace;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * Provides content for the bookmark navigator
- */
-class BookmarkContentProvider implements IStructuredContentProvider,
-        IResourceChangeListener, IBasicPropertyConstants {
-
-    private IResource input;
-
-    private Viewer viewer;
-
-    /**
-     * The constructor.
-     */
-    public BookmarkContentProvider(BookmarkNavigator bookmarksView) {
-        super();
-    }
-
-    /**
-     * The visual part that is using this content provider is about
-     * to be disposed. Deallocate all allocated SWT resources.
-     */
-    public void dispose() {
-        IResource resource = (IResource) viewer.getInput();
-        if (resource != null) {
-            resource.getWorkspace().removeResourceChangeListener(this);
-        }
-    }
-
-    /**
-     * Returns all the bookmarks that should be shown for
-     * the current settings.
-     */
-    Object[] getBookmarks(IResource resource) {
-        try {
-            return resource.findMarkers(IMarker.BOOKMARK, true,
-                    IResource.DEPTH_INFINITE);
-        } catch (CoreException e) {
-            return new Object[0];
-        }
-    }
-
-    public Object[] getChildren(Object element) {
-        // If the input element is a workbench return a list
-        // of the existing bookmarks.  Otherwise, return an empty list.
-        if (element instanceof IResource) {
-			return getBookmarks((IResource) element);
-		} else {
-			return new Object[0];
-		}
-    }
-
-    public Object[] getElements(Object element) {
-        return getChildren(element);
-    }
-
-    /**
-     * Recursively walks over the resource delta and gathers all marker deltas.  Marker
-     * deltas are placed into one of the three given vectors depending on
-     * the type of delta (add, remove, or change).
-     */
-    void getMarkerDeltas(IResourceDelta delta, List additions, List removals,
-            List changes) {
-        IMarkerDelta[] markerDeltas = delta.getMarkerDeltas();
-        for (int i = 0; i < markerDeltas.length; i++) {
-            IMarkerDelta markerDelta = markerDeltas[i];
-            IMarker marker = markerDelta.getMarker();
-            switch (markerDelta.getKind()) {
-            case IResourceDelta.ADDED:
-                if (markerDelta.isSubtypeOf(IMarker.BOOKMARK)) {
-                    additions.add(marker);
-                }
-                break;
-            case IResourceDelta.REMOVED:
-                if (markerDelta.isSubtypeOf(IMarker.BOOKMARK)) {
-                    removals.add(marker);
-                }
-                break;
-            case IResourceDelta.CHANGED:
-                if (markerDelta.isSubtypeOf(IMarker.BOOKMARK)) {
-                    changes.add(marker);
-                }
-                break;
-            }
-        }
-
-        //recurse on child deltas
-        IResourceDelta[] children = delta.getAffectedChildren();
-        for (int i = 0; i < children.length; i++) {
-            getMarkerDeltas(children[i], additions, removals, changes);
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ITreeContentProvider,
-     */
-    public Object getParent(Object element) {
-        return input;
-    }
-
-    /**
-     * hasChildren method comment.
-     */
-    public boolean hasChildren(Object element) {
-        if (element instanceof IWorkspace) {
-			return true;
-		} else {
-			return false;
-		}
-    }
-
-    public void inputChanged(Viewer newViewer, Object oldInput, Object newInput) {
-        if (oldInput == null) {
-            IResource resource = (IResource) newInput;
-            resource.getWorkspace().addResourceChangeListener(this);
-        }
-        this.viewer = newViewer;
-        this.input = (IResource) newInput;
-    }
-
-    /**
-     * The workbench has changed.  Process the delta and provide updates to the viewer,
-     * inside the UI thread.
-     *
-     * @see IResourceChangeListener#resourceChanged
-     */
-    public void resourceChanged(final IResourceChangeEvent event) {
-
-        // gather all marker changes from the delta.
-        // be sure to do this in the calling thread, 
-        // as the delta is destroyed when this method returns
-        final List additions = new ArrayList();
-        final List removals = new ArrayList();
-        final List changes = new ArrayList();
-
-        IResourceDelta delta = event.getDelta();
-        if (delta == null) {
-			return;
-		}
-        getMarkerDeltas(delta, additions, removals, changes);
-
-        // update the viewer based on the marker changes, in the UI thread
-        if (additions.size() + removals.size() + changes.size() > 0) {
-            viewer.getControl().getDisplay().asyncExec(new Runnable() {
-                public void run() {
-                    // This method runs inside an asyncExec.  The widget may have been destroyed
-                    // by the time this is run.  Check for this and do nothing if so.
-                    Control ctrl = viewer.getControl();
-                    if (ctrl == null || ctrl.isDisposed()) {
-						return;
-					}
-
-                    viewer.refresh();
-                }
-            });
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkLabelProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkLabelProvider.java
deleted file mode 100644
index c2cb68c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkLabelProvider.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.bookmarkexplorer;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.views.bookmarkexplorer.BookmarkMessages;
-
-/**
- * Provides labels for the bookmark navigator table
- */
-class BookmarkLabelProvider extends LabelProvider implements
-        ITableLabelProvider {
-
-    private Image image;
-    private ImageDescriptor desc;
-
-    final static int COLUMN_ICON = 0;
-
-    final static int COLUMN_DESCRIPTION = 1;
-
-    final static int COLUMN_RESOURCE = 2;
-
-    final static int COLUMN_FOLDER = 3;
-
-    final static int COLUMN_LOCATION = 4;
-
-    public BookmarkLabelProvider(BookmarkNavigator view) {
-        desc = IDEWorkbenchPlugin.getIDEImageDescriptor("obj16/bkmrk_tsk.gif"); //$NON-NLS-1$
-        image = JFaceResources.getResources().createImageWithDefault(desc);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on LabelProvider.
-     */
-    public void dispose() {
-        if (image != null) {
-            JFaceResources.getResources().destroyImage(desc);
-            image = null;
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on LabelProvider.
-     */
-    public Image getImage(Object element) {
-        return image;
-    }
-
-    public String getColumnText(Object element, int columnIndex) {
-        if (!(element instanceof IMarker)) {
-			return ""; //$NON-NLS-1$
-		}
-        IMarker marker = (IMarker) element;
-
-        switch (columnIndex) {
-        case COLUMN_DESCRIPTION:
-            return marker.getAttribute(IMarker.MESSAGE, ""); //$NON-NLS-1$
-        case COLUMN_RESOURCE:
-            return marker.getResource().getName();
-        case COLUMN_FOLDER:
-            return getContainerName(marker);
-        case COLUMN_LOCATION: {
-            int line = marker.getAttribute(IMarker.LINE_NUMBER, -1);
-            if (line == -1) {
-				return ""; //$NON-NLS-1$
-			}
-            return NLS.bind(BookmarkMessages.LineIndicator_text, String.valueOf(line));
-        }
-        }
-        return ""; //$NON-NLS-1$ 
-    }
-
-    public Image getColumnImage(Object element, int index) {
-        if (index == COLUMN_ICON) {
-			return image;
-		}
-        return null;
-    }
-
-    /**
-     * Returns the container name if it is defined, or empty string if not.
-     */
-    public static String getContainerName(IMarker marker) {
-        IPath path = marker.getResource().getFullPath();
-        int n = path.segmentCount() - 1;
-        // n is the number of segments in container, not path
-        if (n <= 0) {
-			return ""; //$NON-NLS-1$
-		}
-        int len = 0;
-        for (int i = 0; i < n; ++i) {
-			len += path.segment(i).length();
-		}
-        // account for /'s
-        if (n > 1) {
-			len += n - 1;
-		}
-        StringBuffer sb = new StringBuffer(len);
-        for (int i = 0; i < n; ++i) {
-            if (i != 0) {
-				sb.append('/');
-			}
-            sb.append(path.segment(i));
-        }
-        return sb.toString();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkMessages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkMessages.java
deleted file mode 100644
index 825b297..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkMessages.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.bookmarkexplorer;
-
-
-/**
- * Utility class which helps managing messages
- * @deprecated These messages are not API and should not be referenced
- * outside of this plug-in.
- */
-class BookmarkMessages {
-
-    private BookmarkMessages() {
-        // prevent instantiation of class
-    }
-
-    /**
-     * Returns the formatted message for the given key in
-     * the resource bundle. 
-     *
-     * @param key the resource name
-     * @param args the message arguments
-     * @return the string
-     */
-    public static String format(String key, Object[] args) {
-        return key;
-    }
-
-    /**
-     * Returns the resource object with the given key in
-     * the resource bundle. If there isn't any value under
-     * the given key, the key is returned.
-     *
-     * @param key the resource name
-     * @return the string
-     */
-    public static String getString(String key) {
-       return key;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkNavigator.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkNavigator.java
deleted file mode 100644
index 451eb76..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkNavigator.java
+++ /dev/null
@@ -1,747 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.bookmarkexplorer;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IOpenListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.OpenEvent;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSourceAdapter;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ScrollBar;
-import org.eclipse.swt.widgets.Scrollable;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.views.bookmarkexplorer.BookmarkMessages;
-import org.eclipse.ui.internal.views.markers.ExtendedMarkersView;
-import org.eclipse.ui.part.IShowInSource;
-import org.eclipse.ui.part.IShowInTargetList;
-import org.eclipse.ui.part.MarkerTransfer;
-import org.eclipse.ui.part.ShowInContext;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.views.navigator.ShowInNavigatorAction;
-
-/**
- * Main class for the bookmark navigator for displaying bookmarks on
- * resources and opening an editor on the bookmarked resource when the user
- * commands.
- * <p>
- * @deprecated This view is no longer in use as of Eclipse 3.4.
- * The view referenced by {@link IPageLayout#ID_BOOKMARKS} is an {@link ExtendedMarkersView}.
- * </p>
- * @noinstantiate This class is not intended to be instantiated by clients.
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class BookmarkNavigator extends ViewPart {
-    private Table table;
-
-    private TableViewer viewer;
-
-    private OpenBookmarkAction openAction;
-
-    private CopyBookmarkAction copyAction;
-
-    private PasteBookmarkAction pasteAction;
-
-    private RemoveBookmarkAction removeAction;
-
-    private EditBookmarkAction editAction;
-
-    private SelectAllAction selectAllAction;
-
-    private ShowInNavigatorAction showInNavigatorAction;
-
-    private SortByAction sortByDescriptionAction;
-
-    private SortByAction sortByResourceAction;
-
-    private SortByAction sortByFolderAction;
-
-    private SortByAction sortByLineAction;
-
-    private SortByAction sortByCreationTime;
-
-    private ChangeSortDirectionAction sortAscendingAction;
-
-    private ChangeSortDirectionAction sortDescendingAction;
-
-    private IMemento memento;
-
-    private BookmarkSorter comparator;
-
-    private Clipboard clipboard;
-
-    private final String columnHeaders[] = {
-            BookmarkMessages.ColumnIcon_header,
-            BookmarkMessages.ColumnDescription_header,
-            BookmarkMessages.ColumnResource_header,
-            BookmarkMessages.ColumnFolder_header,
-            BookmarkMessages.ColumnLocation_header };
-
-    private ColumnLayoutData columnLayouts[] = {
-			new ColumnPixelData(16, false, true), new ColumnWeightData(200),
-			new ColumnWeightData(75), new ColumnWeightData(150),
-			new ColumnWeightData(60) };
-
-    // Persistance tags.
-    private static final String TAG_SELECTION = "selection"; //$NON-NLS-1$
-
-    private static final String TAG_ID = "id";//$NON-NLS-1$
-
-    private static final String TAG_MARKER = "marker";//$NON-NLS-1$
-
-    private static final String TAG_RESOURCE = "resource";//$NON-NLS-1$
-
-    private static final String TAG_VERTICAL_POSITION = "verticalPosition";//$NON-NLS-1$
-
-    private static final String TAG_HORIZONTAL_POSITION = "horizontalPosition";//$NON-NLS-1$
-	
-    class SortByAction extends Action {
-
-        private int column;
-
-        /**
-         * @param column
-         */
-        public SortByAction(int column) {
-            this.column = column;
-        }
-
-        public void run() {
-        	comparator.setTopPriority(column);
-            updateSortState();
-            viewer.refresh();
-            IDialogSettings workbenchSettings = getPlugin().getDialogSettings();
-            IDialogSettings settings = workbenchSettings
-                    .getSection("BookmarkSortState");//$NON-NLS-1$
-            if (settings == null) {
-				settings = workbenchSettings.addNewSection("BookmarkSortState");//$NON-NLS-1$
-			}
-            comparator.saveState(settings);
-        }
-    }
-
-    class ChangeSortDirectionAction extends Action {
-
-        private int direction;
-
-        /**
-         * @param direction
-         */
-        public ChangeSortDirectionAction(int direction) {
-            this.direction = direction;
-        }
-
-        public void run() {
-        	comparator.setTopPriorityDirection(direction);
-            updateSortState();
-            viewer.refresh();
-            IDialogSettings workbenchSettings = getPlugin().getDialogSettings();
-            IDialogSettings settings = workbenchSettings
-                    .getSection("BookmarkSortState");//$NON-NLS-1$
-            if (settings == null) {
-				settings = workbenchSettings.addNewSection("BookmarkSortState");//$NON-NLS-1$
-			}
-            comparator.saveState(settings);
-        }
-    }
-
-    /**
-     * Creates the bookmarks view.
-     */
-    public BookmarkNavigator() {
-        super();
-    }
-
-    /**
-     * Adds this views contributions to the workbench.
-     */
-    void addContributions() {
-        ISharedImages sharedImages = PlatformUI.getWorkbench()
-                .getSharedImages();
-
-        // Create the actions.
-        openAction = new OpenBookmarkAction(this);
-        openAction
-                .setImageDescriptor(IDEWorkbenchPlugin.getIDEImageDescriptor("elcl16/gotoobj_tsk.gif"));//$NON-NLS-1$
-
-        copyAction = new CopyBookmarkAction(this);
-        copyAction.setImageDescriptor(sharedImages
-                .getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
-
-        pasteAction = new PasteBookmarkAction(this);
-        pasteAction.setImageDescriptor(sharedImages
-                .getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
-
-        removeAction = new RemoveBookmarkAction(this);
-        removeAction.setImageDescriptor(sharedImages
-                .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
-        removeAction.setDisabledImageDescriptor(sharedImages
-                .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE_DISABLED));
-
-        editAction = new EditBookmarkAction(this);
-
-        selectAllAction = new SelectAllAction(this);
-        showInNavigatorAction = new ShowInNavigatorAction(getViewSite()
-                .getPage(), viewer);
-
-        // initializes action enabled state
-        handleSelectionChanged(StructuredSelection.EMPTY);
-
-        // Create dynamic menu mgr.  Dynamic is currently required to
-        // support action contributions.
-        MenuManager mgr = new MenuManager();
-        mgr.setRemoveAllWhenShown(true);
-        mgr.addMenuListener(new IMenuListener() {
-            public void menuAboutToShow(IMenuManager mgr) {
-                fillContextMenu(mgr);
-            }
-        });
-        Menu menu = mgr.createContextMenu(viewer.getControl());
-        viewer.getControl().setMenu(menu);
-        getSite().registerContextMenu(mgr, viewer);
-
-        // Add actions to the local tool bar
-        IToolBarManager tbm = getViewSite().getActionBars().getToolBarManager();
-        tbm.add(removeAction);
-        tbm.add(openAction);
-        tbm.update(false);
-
-        // Register with action service.
-        IActionBars actionBars = getViewSite().getActionBars();
-        actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-                copyAction);
-        actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-                pasteAction);
-        actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-                removeAction);
-        actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
-                selectAllAction);
-
-        // Set the double click action.
-        viewer.addOpenListener(new IOpenListener() {
-            public void open(OpenEvent event) {
-                openAction.run();
-            }
-        });
-        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-            public void selectionChanged(SelectionChangedEvent event) {
-                handleSelectionChanged((IStructuredSelection) event
-                        .getSelection());
-            }
-        });
-        viewer.getControl().addKeyListener(new KeyAdapter() {
-            public void keyPressed(KeyEvent e) {
-                handleKeyPressed(e);
-            }
-        });
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchPart.
-     */
-    public void createPartControl(Composite parent) {
-        clipboard = new Clipboard(parent.getDisplay());
-        createTable(parent);
-        viewer = new TableViewer(table);
-        createColumns();
-
-        comparator = new BookmarkSorter();
-        viewer.setContentProvider(new BookmarkContentProvider(this));
-        viewer.setLabelProvider(new BookmarkLabelProvider(this));
-        viewer.setInput(ResourcesPlugin.getWorkspace().getRoot());
-        viewer.setComparator(comparator);
-
-        IDialogSettings workbenchSettings = getPlugin().getDialogSettings();
-        IDialogSettings settings = workbenchSettings
-                .getSection("BookmarkSortState");//$NON-NLS-1$
-        comparator.restoreState(settings);
-
-        addContributions();
-        initDragAndDrop();
-        createSortActions();
-        fillActionBars();
-        updateSortState();
-        updatePasteEnablement();
-
-        getSite().setSelectionProvider(viewer);
-
-        if (memento != null) {
-			restoreState(memento);
-		}
-        memento = null;
-
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(),
-                IBookmarkHelpContextIds.BOOKMARK_VIEW);
-    }
-
-    public void dispose() {
-        if (clipboard != null) {
-			clipboard.dispose();
-		}
-    }
-
-    /**
-     * Notifies this listener that the menu is about to be shown by
-     * the given menu manager.
-     *
-     * @param manager the menu manager
-     */
-    void fillContextMenu(IMenuManager manager) {
-        manager.add(openAction);
-        manager.add(copyAction);
-        updatePasteEnablement();
-        manager.add(pasteAction);
-        manager.add(removeAction);
-        manager.add(selectAllAction);
-        manager.add(showInNavigatorAction);
-        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-        manager.add(new Separator());
-        manager.add(editAction);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class)
-     */
-    public Object getAdapter(Class adapter) {
-        if (adapter == IShowInSource.class) {
-            return new IShowInSource() {
-                public ShowInContext getShowInContext() {
-                    return new ShowInContext(null, getViewer().getSelection());
-                }
-            };
-        }
-        if (adapter == IShowInTargetList.class) {
-            return new IShowInTargetList() {
-                public String[] getShowInTargetIds() {
-                    return new String[] { IPageLayout.ID_RES_NAV };
-                }
-
-            };
-        }
-        return super.getAdapter(adapter);
-    }
-
-    /**
-     * Returns the UI plugin for the bookmarks view.
-     */
-    static AbstractUIPlugin getPlugin() {
-        return (AbstractUIPlugin) Platform.getPlugin(PlatformUI.PLUGIN_ID);
-    }
-
-    /**
-     * Returns the shell.
-     */
-    Shell getShell() {
-        return getViewSite().getShell();
-    }
-
-    /**
-     * Returns the viewer used to display bookmarks.
-     *
-     * @return the viewer, or <code>null</code> if this view's controls
-     *  have not been created yet
-     */
-    StructuredViewer getViewer() {
-        return viewer;
-    }
-
-    /**
-     * Returns the workspace.
-     */
-    IWorkspace getWorkspace() {
-        return ResourcesPlugin.getWorkspace();
-    }
-
-    /**
-     * Handles key events in viewer.
-     */
-    void handleKeyPressed(KeyEvent event) {
-        if (event.character == SWT.DEL && event.stateMask == 0
-                && removeAction.isEnabled()) {
-			removeAction.run();
-		}
-    }
-
-    /**
-     * Handles a selection change.
-     *
-     * @param selection the new selection
-     */
-    void handleSelectionChanged(IStructuredSelection selection) {
-        //update the actions
-        openAction.selectionChanged(selection);
-        removeAction.selectionChanged(selection);
-        editAction.selectionChanged(selection);
-        selectAllAction.selectionChanged(selection);
-        showInNavigatorAction.selectionChanged(selection);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IViewPart.
-     */
-    public void init(IViewSite site, IMemento memento) throws PartInitException {
-        super.init(site, memento);
-        this.memento = memento;
-    }
-
-    /**
-     * Adds drag and drop support to the bookmark navigator.
-     */
-    protected void initDragAndDrop() {
-        int operations = DND.DROP_COPY;
-        Transfer[] transferTypes = new Transfer[] {
-                MarkerTransfer.getInstance(), TextTransfer.getInstance() };
-        DragSourceListener listener = new DragSourceAdapter() {
-            public void dragSetData(DragSourceEvent event) {
-                performDragSetData(event);
-            }
-
-            public void dragFinished(DragSourceEvent event) {
-            }
-        };
-        viewer.addDragSupport(operations, transferTypes, listener);
-    }
-
-    /**
-     * The user is attempting to drag marker data.  Add the appropriate
-     * data to the event depending on the transfer type.
-     */
-    void performDragSetData(DragSourceEvent event) {
-        if (MarkerTransfer.getInstance().isSupportedType(event.dataType)) {
-            event.data = ((IStructuredSelection) viewer.getSelection())
-                    .toArray();
-            return;
-        }
-        if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
-            Object[] markers = ((IStructuredSelection) viewer.getSelection())
-                    .toArray();
-            if (markers != null) {
-                StringBuffer buffer = new StringBuffer();
-                ILabelProvider provider = (ILabelProvider) getViewer()
-                        .getLabelProvider();
-                for (int i = 0; i < markers.length; i++) {
-                    if (i > 0) {
-						buffer.append(System.getProperty("line.separator")); //$NON-NLS-1$
-					}
-                    String text = provider.getText(markers[i]);
-                    if(text != null) {
-						buffer.append(text);
-					}
-                }
-                event.data = buffer.toString();
-            }
-            return;
-        }
-    }
-
-    void restoreState(IMemento memento) {
-        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-        IMemento selectionMem = memento.getChild(TAG_SELECTION);
-        if (selectionMem != null) {
-            ArrayList selectionList = new ArrayList();
-            IMemento markerMems[] = selectionMem.getChildren(TAG_MARKER);
-            for (int i = 0; i < markerMems.length; i++) {
-                try {
-                    long id = new Long(markerMems[i].getString(TAG_ID))
-                            .longValue();
-                    IResource resource = root.findMember(markerMems[i]
-                            .getString(TAG_RESOURCE));
-                    if (resource != null) {
-                        IMarker marker = resource.findMarker(id);
-                        if (marker != null) {
-							selectionList.add(marker);
-						}
-                    }
-                } catch (CoreException e) {
-                }
-            }
-            viewer.setSelection(new StructuredSelection(selectionList));
-        }
-
-        Scrollable scrollable = (Scrollable) viewer.getControl();
-        //save vertical position
-        ScrollBar bar = scrollable.getVerticalBar();
-        if (bar != null) {
-            try {
-                String posStr = memento.getString(TAG_VERTICAL_POSITION);
-                int position;
-                position = new Integer(posStr).intValue();
-                bar.setSelection(position);
-            } catch (NumberFormatException e) {
-            }
-        }
-        bar = scrollable.getHorizontalBar();
-        if (bar != null) {
-            try {
-                String posStr = memento.getString(TAG_HORIZONTAL_POSITION);
-                int position;
-                position = new Integer(posStr).intValue();
-                bar.setSelection(position);
-            } catch (NumberFormatException e) {
-            }
-        }
-
-        updateSortState();
-        viewer.refresh();
-    }
-
-    public void saveState(IMemento memento) {
-        if (viewer == null) {
-            if (this.memento != null) {
-				memento.putMemento(this.memento);
-			}
-            return;
-        }
-
-        Scrollable scrollable = (Scrollable) viewer.getControl();
-        Object markers[] = ((IStructuredSelection) viewer.getSelection())
-                .toArray();
-        if (markers.length > 0) {
-            IMemento selectionMem = memento.createChild(TAG_SELECTION);
-            for (int i = 0; i < markers.length; i++) {
-                IMemento elementMem = selectionMem.createChild(TAG_MARKER);
-                IMarker marker = (IMarker) markers[i];
-                elementMem.putString(TAG_RESOURCE, marker.getResource()
-                        .getFullPath().toString());
-                elementMem.putString(TAG_ID, String.valueOf(marker.getId()));
-            }
-        }
-
-        //save vertical position
-        ScrollBar bar = scrollable.getVerticalBar();
-        int position = bar != null ? bar.getSelection() : 0;
-        memento.putString(TAG_VERTICAL_POSITION, String.valueOf(position));
-        //save horizontal position
-        bar = scrollable.getHorizontalBar();
-        position = bar != null ? bar.getSelection() : 0;
-        memento.putString(TAG_HORIZONTAL_POSITION, String.valueOf(position));
-
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchPart.
-     */
-    public void setFocus() {
-        if (viewer != null) {
-			viewer.getControl().setFocus();
-		}
-    }
-
-    void createColumns() {
-        SelectionListener headerListener = new SelectionAdapter() {
-            /**
-             * Handles the case of user selecting the
-             * header area.
-             * <p>If the column has not been selected previously,
-             * it will set the sorter of that column to be
-             * the current tasklist sorter. Repeated
-             * presses on the same column header will
-             * toggle sorting order (ascending/descending).
-             */
-            public void widgetSelected(SelectionEvent e) {
-                // column selected - first column doesn't count
-                int column = table.indexOf((TableColumn) e.widget) - 1;
-                if (column == comparator.getTopPriority()) {
-                	comparator.reverseTopPriority();
-				} else {
-					comparator.setTopPriority(column);
-                }
-                updateSortState();
-                viewer.refresh();
-                IDialogSettings workbenchSettings = getPlugin()
-                        .getDialogSettings();
-                IDialogSettings settings = workbenchSettings
-                        .getSection("BookmarkSortState");//$NON-NLS-1$
-                if (settings == null) {
-					settings = workbenchSettings
-                            .addNewSection("BookmarkSortState");//$NON-NLS-1$
-				}
-                comparator.saveState(settings);
-            }
-        };
-
-        TableLayout layout = new TableLayout();
-        table.setLayout(layout);
-        table.setHeaderVisible(true);
-        for (int i = 0; i < columnHeaders.length; i++) {
-            layout.addColumnData(columnLayouts[i]);
-            TableColumn tc = new TableColumn(table, SWT.NONE, i);
-            tc.setResizable(columnLayouts[i].resizable);
-            tc.setText(columnHeaders[i]);
-            if (i > 0) {
-				tc.addSelectionListener(headerListener);
-			}
-        }
-    }
-
-    /**
-     * Creates the table control.
-     */
-    void createTable(Composite parent) {
-        table = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI
-                | SWT.FULL_SELECTION);
-        table.setLinesVisible(true);
-        //table.setLayout(new TableLayout());
-    }
-
-    /**
-     * Fills the local tool bar and menu manager with actions.
-     */
-    void fillActionBars() {
-        IActionBars actionBars = getViewSite().getActionBars();
-        IMenuManager menu = actionBars.getMenuManager();
-        IMenuManager submenu = new MenuManager(BookmarkMessages.SortMenuGroup_text);
-        menu.add(submenu);
-        submenu.add(sortByDescriptionAction);
-        submenu.add(sortByResourceAction);
-        submenu.add(sortByFolderAction);
-        submenu.add(sortByLineAction);
-        submenu.add(sortByCreationTime);
-        submenu.add(new Separator());
-        submenu.add(sortAscendingAction);
-        submenu.add(sortDescendingAction);
-    }
-
-    void createSortActions() {
-        sortByDescriptionAction = new SortByAction(BookmarkSorter.DESCRIPTION);
-        sortByDescriptionAction.setText(BookmarkMessages.ColumnDescription_text);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(
-				sortByDescriptionAction,
-				IBookmarkHelpContextIds.SORT_DESCRIPTION_ACTION);
-
-        sortByResourceAction = new SortByAction(BookmarkSorter.RESOURCE);
-        sortByResourceAction.setText(BookmarkMessages.ColumnResource_text);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByResourceAction,
-                IBookmarkHelpContextIds.SORT_RESOURCE_ACTION);
-
-        sortByFolderAction = new SortByAction(BookmarkSorter.FOLDER);
-        sortByFolderAction.setText(BookmarkMessages.ColumnFolder_text);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByFolderAction,
-                IBookmarkHelpContextIds.SORT_FOLDER_ACTION);
-
-        sortByLineAction = new SortByAction(BookmarkSorter.LOCATION);
-        sortByLineAction.setText(BookmarkMessages.ColumnLocation_text);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByLineAction,
-                IBookmarkHelpContextIds.SORT_LOCATION_ACTION);
-
-        sortByCreationTime = new SortByAction(BookmarkSorter.CREATION_TIME);
-        sortByCreationTime.setText(BookmarkMessages.ColumnCreationTime_text);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByCreationTime,
-                IBookmarkHelpContextIds.SORT_CREATION_TIME_ACTION);
-
-        sortAscendingAction = new ChangeSortDirectionAction(
-                BookmarkSorter.ASCENDING);
-        sortAscendingAction.setText(BookmarkMessages.SortDirectionAscending_text);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(sortAscendingAction,
-                IBookmarkHelpContextIds.SORT_ASCENDING_ACTION);
-
-        sortDescendingAction = new ChangeSortDirectionAction(
-                BookmarkSorter.DESCENDING);
-        sortDescendingAction.setText(BookmarkMessages.SortDirectionDescending_text);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(sortDescendingAction,
-                IBookmarkHelpContextIds.SORT_DESCENDING_ACTION);
-    }
-
-    void updateSortState() {
-        int column = comparator.getTopPriority();
-        sortByDescriptionAction
-                .setChecked(column == BookmarkSorter.DESCRIPTION);
-        sortByResourceAction.setChecked(column == BookmarkSorter.RESOURCE);
-        sortByFolderAction.setChecked(column == BookmarkSorter.FOLDER);
-        sortByLineAction.setChecked(column == BookmarkSorter.LOCATION);
-        sortByCreationTime.setChecked(column == BookmarkSorter.CREATION_TIME);
-
-        int direction = comparator.getTopPriorityDirection();
-        sortAscendingAction.setChecked(direction == BookmarkSorter.ASCENDING);
-        sortDescendingAction.setChecked(direction == BookmarkSorter.DESCENDING);
-    }
-
-    /**
-     * Updates the enablement of the paste action
-     */
-    void updatePasteEnablement() {
-        // Paste if clipboard contains tasks
-        MarkerTransfer transfer = MarkerTransfer.getInstance();
-        IMarker[] markerData = (IMarker[]) getClipboard().getContents(transfer);
-        boolean canPaste = false;
-        if (markerData != null) {
-            for (int i = 0; i < markerData.length; i++) {
-                try {
-                    if (markerData[i].getType().equals(IMarker.BOOKMARK)) {
-                        canPaste = true;
-                        break;
-                    }
-                } catch (CoreException e) {
-                    canPaste = false;
-                }
-            }
-        }
-        pasteAction.setEnabled(canPaste);
-    }
-
-    Clipboard getClipboard() {
-        return clipboard;
-    }
-
-}
-
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkPropertiesDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkPropertiesDialog.java
deleted file mode 100644
index dbb730b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkPropertiesDialog.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.bookmarkexplorer;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.internal.views.bookmarkexplorer.BookmarkMessages;
-import org.eclipse.ui.views.markers.internal.DialogMarkerProperties;
-
-/**
- * Shows the properties of a new or existing bookmark
- * This class was made public in 3.3.
- * 
- * @since 3.3 
- */
-public class BookmarkPropertiesDialog extends DialogMarkerProperties {
-
-
-
-    /**
-     * Creates the dialog.  By default this dialog creates a new bookmark.
-     * To set the resource and initial attributes for the new bookmark, 
-     * use <code>setResource</code> and <code>setInitialAttributes</code>.
-     * To show or modify an existing bookmark, use <code>setMarker</code>.
-     * 
-     * @param parentShell the parent shell
-     */
-    public BookmarkPropertiesDialog(Shell parentShell) {
-        this(parentShell, BookmarkMessages.PropertiesDialogTitle_text);
-    }
-
-    /**
-     * Creates the dialog.  By default this dialog creates a new bookmark.
-     * To set the resource and initial attributes for the new bookmark, 
-     * use <code>setResource</code> and <code>setInitialAttributes</code>.
-     * To show or modify an existing bookmark, use <code>setMarker</code>.
-     * 
-     * @param parentShell the parent shell
-     * @param title the title for the dialog
-     */
-    public BookmarkPropertiesDialog(Shell parentShell, String title) {
-        super(parentShell, title);
-    	setType(IMarker.BOOKMARK);
-    }
-    
-    /**
-     * Sets the marker to show or modify.
-     * 
-     * @param marker the marker, or <code>null</code> to create a new marker
-     */
-    public void setMarker(IMarker marker) {
-    	// Method is overridden because API is being inherited from an internal class.
-        super.setMarker(marker);
-    }
-
-    /**
-     * Returns the marker being created or modified.
-     * For a new marker, this returns <code>null</code> until
-     * the dialog returns, but is non-null after.
-     * 
-     * @return the marker
-     */
-    public IMarker getMarker() {
-    	// Method is overridden because API is being inherited from an internal class.
-        return super.getMarker();
-    }
-
-    /**
-     * Sets the resource to use when creating a new bookmark.
-     * If not set, the new bookmark is created on the workspace root.
-     * 
-     * @param resource the resource
-     */
-    public void setResource(IResource resource) {
-    	// Method is overridden because API is being inherited from an internal class.
-        super.setResource(resource);
-    }
-
-    /**
-     * Returns the resource to use when creating a new bookmark,
-     * or <code>null</code> if none has been set.
-     * If not set, the new bookmark is created on the workspace root.
-     * 
-     * @return the resource
-     */
-    public IResource getResource() {
-    	// Method is overridden because API is being inherited from an internal class.
-        return super.getResource();
-    }
-
-    /**
-     * Sets initial attributes to use when creating a new bookmark.
-     * If not set, the new bookmark is created with default attributes.
-     * 
-     * @param initialAttributes the initial attributes
-     */
-    public void setInitialAttributes(Map initialAttributes) {
-    	// Method is overridden because API is being inherited from an internal class.
-        super.setInitialAttributes(initialAttributes);
-    }
-
-    /**
-     * Returns the initial attributes to use when creating a new bookmark,
-     * or <code>null</code> if not set.
-     * If not set, the new bookmark is created with default attributes.
-     * 
-     * @return the initial attributes
-     */
-    public Map getInitialAttributes() {
-    	// Method is overridden because API is being inherited from an internal class.
-        return super.getInitialAttributes();
-    }
-    
-	/* (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.DialogMarkerProperties.getModifyOperationTitle()
-     * 
-     * @since 3.3
-     */
-	protected String getModifyOperationTitle() {
-		return BookmarkMessages.ModifyBookmark_undoText;
-	}
-	
-	/* (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.DialogMarkerProperties.getCreateOperationTitle()
-     * 
-     * @since 3.3
-     */
-	protected String getCreateOperationTitle() {
-		return BookmarkMessages.CreateBookmark_undoText;
-		
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkSorter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkSorter.java
deleted file mode 100644
index 7a27d41..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/BookmarkSorter.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.bookmarkexplorer;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-
-class BookmarkSorter extends ViewerComparator {
-
-    private int[] directions;
-
-    private int[] priorities;
-
-    final static int ASCENDING = 1;
-
-    final static int DESCENDING = -1;
-
-    final static int DESCRIPTION = 0;
-
-    final static int RESOURCE = 1;
-
-    final static int FOLDER = 2;
-
-    final static int LOCATION = 3;
-
-    final static int CREATION_TIME = 4;
-
-    final static int[] DEFAULT_PRIORITIES = { FOLDER, RESOURCE, LOCATION,
-            DESCRIPTION, CREATION_TIME };
-
-    final static int[] DEFAULT_DIRECTIONS = { ASCENDING, //description
-            ASCENDING, //resource
-            ASCENDING, //folder
-            ASCENDING, //location
-            ASCENDING, }; //creation time
-
-    public BookmarkSorter() {
-        resetState();
-    }
-
-    public void reverseTopPriority() {
-        directions[priorities[0]] *= -1;
-    }
-
-    public void setTopPriority(int priority) {
-        if (priority < 0 || priority >= priorities.length) {
-			return;
-		}
-
-        int index = -1;
-        for (int i = 0; i < priorities.length; i++) {
-            if (priorities[i] == priority) {
-				index = i;
-			}
-        }
-
-        if (index == -1) {
-            resetState();
-            return;
-        }
-
-        //shift the array
-        for (int i = index; i > 0; i--) {
-            priorities[i] = priorities[i - 1];
-        }
-        priorities[0] = priority;
-        directions[priority] = DEFAULT_DIRECTIONS[priority];
-    }
-
-    public void setTopPriorityDirection(int direction) {
-        if (direction == ASCENDING || direction == DESCENDING) {
-			directions[priorities[0]] = direction;
-		}
-    }
-
-    public int getTopPriorityDirection() {
-        return directions[priorities[0]];
-    }
-
-    public int getTopPriority() {
-        return priorities[0];
-    }
-
-    public int[] getPriorities() {
-        return priorities;
-    }
-
-    public void resetState() {
-        priorities = new int[DEFAULT_PRIORITIES.length];
-        System.arraycopy(DEFAULT_PRIORITIES, 0, priorities, 0,
-                priorities.length);
-        directions = new int[DEFAULT_DIRECTIONS.length];
-        System.arraycopy(DEFAULT_DIRECTIONS, 0, directions, 0,
-                directions.length);
-    }
-
-    private int compare(IMarker marker1, IMarker marker2, int depth) {
-        if (depth >= priorities.length) {
-			return 0;
-		}
-
-        int column = priorities[depth];
-        switch (column) {
-        case DESCRIPTION: {
-            String desc1 = marker1.getAttribute(IMarker.MESSAGE, "");//$NON-NLS-1$
-            String desc2 = marker2.getAttribute(IMarker.MESSAGE, "");//$NON-NLS-1$
-            int result = getComparator().compare(desc1, desc2);
-            if (result == 0) {
-				return compare(marker1, marker2, depth + 1);
-			}
-            return result * directions[column];
-        }
-        case RESOURCE: {
-            String res1 = marker1.getResource().getName();
-            String res2 = marker2.getResource().getName();
-            int result = getComparator().compare(res1, res2);
-            if (result == 0) {
-				return compare(marker1, marker2, depth + 1);
-			}
-            return result * directions[column];
-        }
-        case FOLDER: {
-            String folder1 = BookmarkLabelProvider.getContainerName(marker1);
-            String folder2 = BookmarkLabelProvider.getContainerName(marker2);
-            int result = getComparator().compare(folder1, folder2);
-            if (result == 0) {
-				return compare(marker1, marker2, depth + 1);
-			}
-            return result * directions[column];
-        }
-        case LOCATION: {
-            int line1 = marker1.getAttribute(IMarker.LINE_NUMBER, -1);
-            int line2 = marker2.getAttribute(IMarker.LINE_NUMBER, -1);
-            int result = line1 - line2;
-            if (result == 0) {
-				return compare(marker1, marker2, depth + 1);
-			}
-            return result * directions[column];
-        }
-        case CREATION_TIME: {
-            long result;
-            try {
-                result = marker1.getCreationTime() - marker2.getCreationTime();
-            } catch (CoreException e) {
-                result = 0;
-            }
-            if (result == 0) {
-				return compare(marker1, marker2, depth + 1);
-			}
-            return ((int) result) * directions[column];
-        }
-        }
-
-        return 0;
-    }
-
-    public int compare(Viewer viewer, Object e1, Object e2) {
-        IMarker marker1 = (IMarker) e1;
-        IMarker marker2 = (IMarker) e2;
-
-        return compare(marker1, marker2, 0);
-    }
-
-    public void saveState(IDialogSettings settings) {
-        if (settings == null) {
-			return;
-		}
-
-        for (int i = 0; i < priorities.length; i++) {
-            settings.put("priority" + i, priorities[i]);//$NON-NLS-1$
-            settings.put("direction" + i, directions[i]);//$NON-NLS-1$
-        }
-    }
-
-    public void restoreState(IDialogSettings settings) {
-        if (settings == null) {
-			return;
-		}
-
-        try {
-            for (int i = 0; i < priorities.length; i++) {
-                priorities[i] = settings.getInt("priority" + i);//$NON-NLS-1$
-                directions[i] = settings.getInt("direction" + i);//$NON-NLS-1$
-            }
-        } catch (NumberFormatException e) {
-            resetState();
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/CopyBookmarkAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/CopyBookmarkAction.java
deleted file mode 100644
index fd54a35..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/CopyBookmarkAction.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.bookmarkexplorer;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.views.bookmarkexplorer.BookmarkMessages;
-import org.eclipse.ui.part.MarkerTransfer;
-
-/**
- * Copies one or more bookmark(s) to the clipboard.
- */
-class CopyBookmarkAction extends BookmarkAction {
-
-    /**
-     * Creates the action.
-     * 
-     * @param bookmarkNavigator the view
-     */
-    public CopyBookmarkAction(BookmarkNavigator bookmarkNavigator) {
-        super(bookmarkNavigator, BookmarkMessages.CopyBookmark_text);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                IBookmarkHelpContextIds.COPY_BOOKMARK_ACTION);
-        setEnabled(false);
-    }
-
-    /**
-     * Performs this action.
-     */
-    public void run() {
-        // Get the selected markers
-        BookmarkNavigator bookmarkNavigator = getView();
-        StructuredViewer viewer = bookmarkNavigator.getViewer();
-        IStructuredSelection selection = (IStructuredSelection) viewer
-                .getSelection();
-        if (selection.isEmpty()) {
-            return;
-        }
-        List list = selection.toList();
-        IMarker[] markers = new IMarker[list.size()];
-        list.toArray(markers);
-
-        setClipboard(markers, createBookmarkReport(markers));
-    }
-
-    /** 
-     * Updates enablement based on the current selection
-     */
-    public void selectionChanged(IStructuredSelection sel) {
-        setEnabled(!sel.isEmpty());
-    }
-
-    private void setClipboard(IMarker[] markers, String markerReport) {
-        try {
-            // Place the markers on the clipboard
-            Object[] data = new Object[] { markers, markerReport };
-            Transfer[] transferTypes = new Transfer[] {
-                    MarkerTransfer.getInstance(), TextTransfer.getInstance() };
-
-            // set the clipboard contents
-            getView().getClipboard().setContents(data, transferTypes);
-        } catch (SWTError e) {
-            if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD) {
-				throw e;
-			}
-            if (MessageDialog
-                    .openQuestion(
-                            getView().getShell(),
-                            BookmarkMessages.CopyToClipboardProblemDialog_title, BookmarkMessages.CopyToClipboardProblemDialog_message)) {
-				setClipboard(markers, markerReport);
-			}
-        }
-    }
-
-    private String createBookmarkReport(IMarker[] markers) {
-        String report = ""; //$NON-NLS-1$
-
-        //write header
-        report += BookmarkMessages.ColumnDescription_header + '\t';
-        report += BookmarkMessages.ColumnResource_header + '\t';
-        report += BookmarkMessages.ColumnFolder_header + '\t';
-        report += BookmarkMessages.ColumnLocation_header;
-        report += System.getProperty("line.separator"); //$NON-NLS-1$
-
-        //write markers
-        for (int i = 0; i < markers.length; i++) {
-            report += MarkerUtil.getMessage(markers[i]) + '\t';
-            report += MarkerUtil.getResourceName(markers[i]) + '\t';
-            report += MarkerUtil.getContainerName(markers[i]) + '\t';
-            int line = MarkerUtil.getLineNumber(markers[i]);
-            report += NLS.bind(BookmarkMessages.LineIndicator_text, String.valueOf(line));
-            report += System.getProperty("line.separator"); //$NON-NLS-1$
-        }
-
-        return report;
-    }
-}
-
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/EditBookmarkAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/EditBookmarkAction.java
deleted file mode 100644
index 381ee57..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/EditBookmarkAction.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.bookmarkexplorer;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.views.bookmarkexplorer.BookmarkMessages;
-
-/**
- * Opens a properties dialog allowing the user to edit the bookmark's description.
- */
-class EditBookmarkAction extends BookmarkAction {
-
-    protected EditBookmarkAction(BookmarkNavigator view) {
-        super(view, BookmarkMessages.Properties_text);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                IBookmarkHelpContextIds.BOOKMARK_PROPERTIES_ACTION);
-        setEnabled(false);
-    }
-
-    private IMarker marker;
-
-    public void run() {
-        if (marker != null) {
-			editBookmark();
-		}
-    }
-
-    /**
-     * Sets marker to the current selection if the selection is an instance of 
-     * <code>org.eclipse.core.resources.IMarker<code> and the selected marker's 
-     * resource is an instance of <code>org.eclipse.core.resources.IFile<code>.
-     * Otherwise sets marker to null.
-     */
-    public void selectionChanged(IStructuredSelection selection) {
-        marker = null;
-        setEnabled(false);
-
-        if (selection.size() != 1) {
-			return;
-		}
-
-        Object o = selection.getFirstElement();
-        if (!(o instanceof IMarker)) {
-			return;
-		}
-
-        IMarker selectedMarker = (IMarker) o;
-        IResource resource = selectedMarker.getResource();
-        if (resource instanceof IFile) {
-            marker = selectedMarker;
-            setEnabled(true);
-        }
-    }
-
-    private void editBookmark() {
-    	BookmarkPropertiesDialog dialog = new BookmarkPropertiesDialog(
-    			getView().getSite().getShell());
-    	dialog.setMarker(marker);
-    	dialog.open();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/IBookmarkHelpContextIds.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/IBookmarkHelpContextIds.java
deleted file mode 100644
index af1328c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/IBookmarkHelpContextIds.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.bookmarkexplorer;
-
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Help context ids for the bookmark view.
- * <p>
- * This interface contains constants only; it is not intended to be implemented
- * or extended.
- * </p>
- * 
- */
-interface IBookmarkHelpContextIds {
-    public static final String PREFIX = PlatformUI.PLUGIN_ID + "."; //$NON-NLS-1$
-
-    // Actions
-    public static final String COPY_BOOKMARK_ACTION = PREFIX
-            + "copy_bookmark_action_context"; //$NON-NLS-1$
-
-    public static final String PASTE_BOOKMARK_ACTION = PREFIX
-            + "paste_bookmark_action_context"; //$NON-NLS-1$
-
-    public static final String REMOVE_BOOKMARK_ACTION = PREFIX
-            + "remove_bookmark_action_context"; //$NON-NLS-1$
-
-    public static final String OPEN_BOOKMARK_ACTION = PREFIX
-            + "open_bookmark_action_context"; //$NON-NLS-1$
-
-    public static final String SELECT_ALL_BOOKMARK_ACTION = PREFIX
-            + "select_all_bookmark_action_context"; //$NON-NLS-1$
-
-    public static final String BOOKMARK_PROPERTIES_ACTION = PREFIX
-            + "bookmark_properties_action_context"; //$NON-NLS-1$
-
-    public static final String SORT_ASCENDING_ACTION = PREFIX
-            + "bookmark_sort_ascending_action_context"; //$NON-NLS-1$
-
-    public static final String SORT_DESCENDING_ACTION = PREFIX
-            + "bookmark_sort_descending_action_context"; //$NON-NLS-1$
-
-    public static final String SORT_DESCRIPTION_ACTION = PREFIX
-            + "bookmark_sort_description_action_context"; //$NON-NLS-1$
-
-    public static final String SORT_RESOURCE_ACTION = PREFIX
-            + "bookmark_sort_resource_action_context"; //$NON-NLS-1$
-
-    public static final String SORT_FOLDER_ACTION = PREFIX
-            + "bookmark_sort_folder_action_context"; //$NON-NLS-1$
-
-    public static final String SORT_LOCATION_ACTION = PREFIX
-            + "bookmark_sort_location_action_context"; //$NON-NLS-1$
-
-    public static final String SORT_CREATION_TIME_ACTION = PREFIX
-            + "bookmark_sort_creation_time_action_context"; //$NON-NLS-1$
-
-    // Views
-    public static final String BOOKMARK_VIEW = PREFIX + "bookmark_view_context"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/MarkerUtil.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/MarkerUtil.java
deleted file mode 100644
index f4be0ee..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/MarkerUtil.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.bookmarkexplorer;
-
-import com.ibm.icu.text.DateFormat;
-import java.util.Date;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-
-/**
- * Utility class for accessing marker attributes.
- */
-class MarkerUtil {
-
-    /**
-     * Don't allow instantiation.
-     */
-    private MarkerUtil() {
-    }
-
-    /**
-     * Returns the ending character offset of the given marker.
-     */
-    static int getCharEnd(IMarker marker) {
-        return marker.getAttribute(IMarker.CHAR_END, -1);
-    }
-
-    /**
-     * Returns the starting character offset of the given marker.
-     */
-    static int getCharStart(IMarker marker) {
-        return marker.getAttribute(IMarker.CHAR_START, -1);
-    }
-
-    /**
-     * Returns the container name if it is defined, or empty string if not.
-     */
-    static String getContainerName(IMarker marker) {
-        IPath path = marker.getResource().getFullPath();
-        int n = path.segmentCount() - 1; // n is the number of segments in container, not path
-        if (n <= 0) {
-			return ""; //$NON-NLS-1$
-		}
-        int len = 0;
-        for (int i = 0; i < n; ++i) {
-			len += path.segment(i).length();
-		}
-        // account for /'s
-        if (n > 1) {
-			len += n - 1;
-		}
-        StringBuffer sb = new StringBuffer(len);
-        for (int i = 0; i < n; ++i) {
-            if (i != 0) {
-				sb.append('/');
-			}
-            sb.append(path.segment(i));
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Returns the line number of the given marker.
-     */
-    static int getLineNumber(IMarker marker) {
-        return marker.getAttribute(IMarker.LINE_NUMBER, -1);
-    }
-
-    /**
-     * Returns the text for the location field.
-     */
-    static String getLocation(IMarker marker) {
-        return marker.getAttribute(IMarker.LOCATION, "");//$NON-NLS-1$
-    }
-
-    /**
-     * Returns the message attribute of the given marker,
-     * or the empty string if the message attribute is not defined.
-     */
-    static String getMessage(IMarker marker) {
-        return marker.getAttribute(IMarker.MESSAGE, "");//$NON-NLS-1$
-    }
-
-    /**
-     * Returns the numeric value of the given string, which is assumed to represent a numeric value.
-     *
-     * @return <code>true</code> if numeric, <code>false</code> if not
-     */
-    static int getNumericValue(String value) {
-        boolean negative = false;
-        int i = 0;
-        int len = value.length();
-
-        // skip any leading '#'
-        // workaround for 1GCE69U: ITPJCORE:ALL - Java problems should not have '#' in location.
-        if (i < len && value.charAt(i) == '#') {
-			++i;
-		}
-
-        if (i < len && value.charAt(i) == '-') {
-            negative = true;
-            ++i;
-        }
-
-        int result = 0;
-        while (i < len) {
-            int digit = Character.digit(value.charAt(i++), 10);
-            if (digit < 0) {
-                return result;
-            }
-            result = result * 10 + digit;
-        }
-        if (negative) {
-            result = -result;
-        }
-        return result;
-    }
-
-    /**
-     * Implements IProvider interface by supporting a number of
-     * properties required for visual representation of markers
-     * in the tasklist.
-     */
-
-    /**
-     * Returns name if it is defined, or
-     * blank string if not.
-     */
-    static String getResourceName(IMarker marker) {
-        return marker.getResource().getName();
-    }
-
-    /**
-     * Returns the creation time of the marker as a string.
-     */
-    static String getCreationTime(IMarker marker) {
-        try {
-            return DateFormat.getDateTimeInstance(DateFormat.LONG,
-                    DateFormat.MEDIUM).format(
-                    new Date(marker.getCreationTime()));
-        } catch (CoreException e) {
-            return null;
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/OpenBookmarkAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/OpenBookmarkAction.java
deleted file mode 100644
index 7dd59e0..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/OpenBookmarkAction.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.bookmarkexplorer;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.util.OpenStrategy;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.views.bookmarkexplorer.BookmarkMessages;
-
-/**
- * Action to open an editor on the selected bookmarks.
- */
-class OpenBookmarkAction extends BookmarkAction {
-
-    /**
-     * Create a new instance of this class.
-     * 
-     * @param view the view
-     */
-    public OpenBookmarkAction(BookmarkNavigator view) {
-        super(view, BookmarkMessages.OpenBookmark_text);
-        setToolTipText(BookmarkMessages.OpenBookmark_toolTip);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                IBookmarkHelpContextIds.OPEN_BOOKMARK_ACTION);
-        setEnabled(false);
-    }
-
-    public void run() {
-        IWorkbenchPage page = getView().getSite().getPage();
-        for (Iterator i = getStructuredSelection().iterator(); i.hasNext();) {
-            IMarker marker = (IMarker) i.next();
-            try {
-                IDE.openEditor(page, marker, OpenStrategy.activateOnOpen());
-            } catch (PartInitException e) {
-                // Open an error style dialog for PartInitException by
-                // including any extra information from the nested
-                // CoreException if present.
-
-                // Check for a nested CoreException
-                CoreException nestedException = null;
-                IStatus status = e.getStatus();
-                if (status != null
-                        && status.getException() instanceof CoreException) {
-					nestedException = (CoreException) status.getException();
-				}
-
-                if (nestedException != null) {
-                    // Open an error dialog and include the extra
-                    // status information from the nested CoreException
-                    ErrorDialog.openError(getView().getShell(),
-                            BookmarkMessages.OpenBookmark_errorTitle,
-                            e.getMessage(), nestedException.getStatus());
-                } else {
-                    // Open a regular error dialog since there is no
-                    // extra information to display
-                    MessageDialog.openError(getView().getShell(),
-                            BookmarkMessages.OpenBookmark_errorTitle,
-                            e.getMessage());
-                }
-            }
-        }
-    }
-
-    public void selectionChanged(IStructuredSelection sel) {
-        setEnabled(!sel.isEmpty());
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/PasteBookmarkAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/PasteBookmarkAction.java
deleted file mode 100644
index cc9f4b7..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/PasteBookmarkAction.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.bookmarkexplorer;
-
-import java.util.ArrayList;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.CreateMarkersOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.views.bookmarkexplorer.BookmarkMessages;
-import org.eclipse.ui.part.MarkerTransfer;
-
-/**
- * Pastes one or more bookmark(s) from the clipboard into the bookmark navigator.
- */
-class PasteBookmarkAction extends BookmarkAction {
-
-    private BookmarkNavigator view;
-
-    /**
-     * The constructor.
-     * 
-     * @param view the view
-     */
-    public PasteBookmarkAction(BookmarkNavigator view) {
-        super(view, BookmarkMessages.PasteBookmark_text);
-        this.view = view;
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                IBookmarkHelpContextIds.PASTE_BOOKMARK_ACTION);
-        setEnabled(false);
-    }
-
-    /**
-     * Copies the marker(s) from the clipboard to the bookmark navigator view.
-     */
-    public void run() {
-        // Get the markers from the clipboard
-        MarkerTransfer transfer = MarkerTransfer.getInstance();
-        final IMarker[] markerData = (IMarker[]) view.getClipboard()
-                .getContents(transfer);
-
-        if (markerData == null) {
-			return;
-		}
-        final ArrayList newMarkerAttributes = new ArrayList();
-        final ArrayList newMarkerResources = new ArrayList();
-        try {   
-            ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
-                public void run(IProgressMonitor monitor) throws CoreException {
-					for (int i = 0; i < markerData.length; i++) {
-						// Collect the info about the markers to be pasted.
-						// Ignore any markers that aren't bookmarks.
-						if (!markerData[i].getType().equals(IMarker.BOOKMARK)) {
-							continue;
-						}
-						newMarkerResources.add(markerData[i].getResource());
-						newMarkerAttributes.add(markerData[i].getAttributes());
-					}
-                }
-            }, null);
-        } catch (CoreException e) {
-            ErrorDialog.openError(view.getShell(), BookmarkMessages.PasteBookmark_errorTitle,
-                    null, e.getStatus());
-            return;
-        }
-		final Map [] attrs = (Map []) newMarkerAttributes.toArray(new Map [newMarkerAttributes.size()]);
-		final IResource [] resources = (IResource []) newMarkerResources.toArray(new IResource [newMarkerResources.size()]);
-		final CreateMarkersOperation op = new CreateMarkersOperation(IMarker.BOOKMARK, attrs,
-				resources, BookmarkMessages.PasteBookmark_undoText);
-		execute(op, BookmarkMessages.PasteBookmark_errorTitle, null,
-				WorkspaceUndoUtil.getUIInfoAdapter(view.getShell()));
-
-        // Need to do this in an asyncExec, even though we're in the UI thread here,
-        // since the bookmark navigator updates itself with the addition in an asyncExec,
-        // which hasn't been processed yet.
-        // Must be done outside the create marker operation above since notification for add is
-        // sent after the operation is executed.
-        if (op.getMarkers() != null) {
-            view.getShell().getDisplay().asyncExec(new Runnable() {
-                public void run() {
-                    view.getViewer().setSelection(
-                            new StructuredSelection(op.getMarkers()));
-                    view.updatePasteEnablement();
-                }
-            });
-        }
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/RemoveBookmarkAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/RemoveBookmarkAction.java
deleted file mode 100644
index 32bf00e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/RemoveBookmarkAction.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.bookmarkexplorer;
-
-import java.util.List;
-
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.DeleteMarkersOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.views.bookmarkexplorer.BookmarkMessages;
-
-/**
- * Action to remove the selected bookmarks.
- */
-class RemoveBookmarkAction extends BookmarkAction {
-
-    /**
-     * Create a new instance of this class.
-     * 
-     * @param view the view
-     */
-    public RemoveBookmarkAction(BookmarkNavigator view) {
-        super(view, BookmarkMessages.RemoveBookmark_text);
-        setToolTipText(BookmarkMessages.RemoveBookmark_toolTip);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                IBookmarkHelpContextIds.REMOVE_BOOKMARK_ACTION);
-        setEnabled(false);
-    }
-
-    /**
-     * Delete the marker selection.
-     */
-    public void run() {
-        final IStructuredSelection sel = getStructuredSelection();
-        if (sel.isEmpty()) {
-			return;
-		}
-        List list = sel.toList();
-        IMarker[] markers = new IMarker[list.size()];
-        list.toArray(markers);
-     	IUndoableOperation op = new DeleteMarkersOperation(markers, BookmarkMessages.RemoveBookmark_undoText);
-   		execute(op, BookmarkMessages.RemoveBookmark_errorTitle, null,
-   				WorkspaceUndoUtil.getUIInfoAdapter(getView().getShell()));
-    }
-
-    public void selectionChanged(IStructuredSelection sel) {
-        setEnabled(!sel.isEmpty());
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/SelectAllAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/SelectAllAction.java
deleted file mode 100644
index 79e2aa2..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/SelectAllAction.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.bookmarkexplorer;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.views.bookmarkexplorer.BookmarkMessages;
-
-/**
- * Action to select all bookmarks.
- */
-class SelectAllAction extends BookmarkAction {
-
-    /**
-     * Create a new instance of this class.
-     * 
-     * @param view the view
-     */
-    public SelectAllAction(BookmarkNavigator view) {
-        super(view, BookmarkMessages.SelectAll_text);
-        setToolTipText(BookmarkMessages.SelectAll_toolTip);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                IBookmarkHelpContextIds.SELECT_ALL_BOOKMARK_ACTION);
-        setEnabled(true);
-    }
-
-    public void run() {
-        Viewer viewer = getView().getViewer();
-        Control control = viewer.getControl();
-        if (control instanceof Table) {
-            ((Table) control).selectAll();
-            viewer.setSelection(viewer.getSelection(), false);
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/package.html b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/package.html
deleted file mode 100644
index 15580ea..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/bookmarkexplorer/package.html
+++ /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="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides the standard Bookmarks view which displays
-bookmarks on resources.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/BackAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/BackAction.java
deleted file mode 100644
index 76a6f45..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/BackAction.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.framelist;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.views.framelist.FrameListMessages;
-
-/**
- * Generic "Back" action which goes back one frame,
- */
-public class BackAction extends FrameAction {
-
-    /**
-     * Constructs a new action for the specified frame list.
-     * 
-     * @param frameList the frame list
-     */
-    public BackAction(FrameList frameList) {
-        super(frameList);
-        setText(FrameListMessages.Back_text);
-        ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
-        setImageDescriptor(images
-                .getImageDescriptor(ISharedImages.IMG_TOOL_BACK));
-        setDisabledImageDescriptor(images
-                .getImageDescriptor(ISharedImages.IMG_TOOL_BACK_DISABLED));
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IFrameListHelpContextIds.BACK_ACTION);
-        update();
-    }
-
-    private Frame getPreviousFrame() {
-        FrameList list = getFrameList();
-        return list.getFrame(list.getCurrentIndex() - 1);
-    }
-
-    private String getToolTipText(Frame previousFrame) {
-        if (previousFrame != null) {
-            String text = previousFrame.getToolTipText();
-            if (text != null && text.length() > 0) {
-                return NLS.bind(FrameListMessages.Back_toolTipOneArg, text);
-            }
-        }
-        return FrameListMessages.Back_toolTip;
-    }
-
-    /**
-     * Calls <code>back()</code> on the frame list.
-     */
-    public void run() {
-        getFrameList().back();
-    }
-
-    /**
-     * Updates this action's enabled state and tool tip text.
-     * This action is enabled only when there is a previous frame in the frame list.
-     * The tool tip text is "Back to " plus the tool tip text for the previous frame.
-     */
-    public void update() {
-        super.update();
-        Frame previousFrame = getPreviousFrame();
-        setEnabled(previousFrame != null);
-        setToolTipText(getToolTipText(previousFrame));
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/ForwardAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/ForwardAction.java
deleted file mode 100644
index 82c59b6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/ForwardAction.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.framelist;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.views.framelist.FrameListMessages;
-
-/**
- * Generic "Forward" action which goes forward one frame.
- */
-public class ForwardAction extends FrameAction {
-
-    /**
-     * Constructs a new action for the specified frame list.
-     * 
-     * @param frameList the frame list
-     */
-    public ForwardAction(FrameList frameList) {
-        super(frameList);
-        setText(FrameListMessages.Forward_text);
-        ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
-        setImageDescriptor(images
-                .getImageDescriptor(ISharedImages.IMG_TOOL_FORWARD));
-        setDisabledImageDescriptor(images
-                .getImageDescriptor(ISharedImages.IMG_TOOL_FORWARD_DISABLED));
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IFrameListHelpContextIds.FORWARD_ACTION);
-        update();
-    }
-
-    private Frame getNextFrame() {
-        FrameList list = getFrameList();
-        return list.getFrame(list.getCurrentIndex() + 1);
-    }
-
-    private String getToolTipText(Frame nextFrame) {
-        if (nextFrame != null) {
-            String text = nextFrame.getToolTipText();
-            if (text != null && text.length() > 0) {
-                return NLS.bind(FrameListMessages.Forward_toolTipOneArg, text);
-            }
-        }
-        return FrameListMessages.Forward_toolTip;
-    }
-
-    /**
-     * Calls <code>forward()</code> on the frame list.
-     */
-    public void run() {
-        getFrameList().forward();
-    }
-
-    /**
-     * Updates this action's enabled state and tool tip text.
-     * This action is enabled only when there is a next frame in the frame list.
-     * The tool tip text is "Forward to " plus the tool tip text for the next
-     * frame.
-     */
-    public void update() {
-        super.update();
-        Frame nextFrame = getNextFrame();
-        setEnabled(nextFrame != null);
-        setToolTipText(getToolTipText(nextFrame));
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/Frame.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/Frame.java
deleted file mode 100644
index 380b74f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/Frame.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.framelist;
-
-/**
- * Generic frame, which captures the state for one frame in the frame list.
- * Clients may subclass this frame to add their own state.
- */
-public class Frame {
-
-    private int index = -1;
-
-    private FrameList parent;
-
-    private String name = ""; //$NON-NLS-1$
-
-    private String toolTipText;
-
-    /**
-     * Constructs a new frame. <p>
-     * 
-     * This implementation does nothing.
-     */
-    public Frame() {
-    }
-
-    /**
-     * Returns the index of the frame in the frame list.
-     * Only valid once the frame has been added to the frame list.
-     * 
-     * @return the index of the frame in the frame list.
-     */
-    public int getIndex() {
-        return index;
-    }
-
-    /**
-     * Returns the displayable name for the frame.
-     *
-     * @return the displayable name for the frame.
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Returns the frame list.
-     * 
-     * @return the frame list
-     */
-    public FrameList getParent() {
-        return parent;
-    }
-
-    /**
-     * Returns the tool tip text to show for the frame.
-     * This can form part of the tool tip for actions like the back and forward
-     * actions.
-     * 
-     * @return the tool tip text to show for the frame
-     */
-    public String getToolTipText() {
-        return toolTipText;
-    }
-
-    /**
-     * Sets the index of the frame in the frame list.
-     * Should only be called by the frame list.
-     * 
-     * @param index the index of the frame in the frame list
-     */
-    public void setIndex(int index) {
-        this.index = index;
-    }
-
-    /**
-     * Sets the displayable name for the frame.
-     * 
-     * @param name the displayable name
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    /**
-     * Sets the frame list.
-     * 
-     * @param parent the frame list
-     */
-    public void setParent(FrameList parent) {
-        this.parent = parent;
-    }
-
-    /**
-     * Sets the tool tip text to show for the frame.
-     * This can form part of the tool tip for actions like the back and forward
-     * actions.
-     * 
-     * @param toolTipText the tool tip text to show for the frame.
-     */
-    public void setToolTipText(String toolTipText) {
-        this.toolTipText = toolTipText;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/FrameAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/FrameAction.java
deleted file mode 100644
index e8a3423..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/FrameAction.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.framelist;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * Abstract superclass for actions dealing with frames or a frame list.
- * This listens for changes to the frame list and updates itself
- * accordingly.
- */
-public abstract class FrameAction extends Action {
-    private FrameList frameList;
-	
-    private IPropertyChangeListener propertyChangeListener = new IPropertyChangeListener() {
-        public void propertyChange(PropertyChangeEvent event) {
-            FrameAction.this.handlePropertyChange(event);
-        }
-    };
-
-    /**
-     * Constructs a new action for the specified frame list.
-     * and adds a property change listener on it.
-     * 
-     * @param frameList the frame list
-     */
-    protected FrameAction(FrameList frameList) {
-        this.frameList = frameList;
-        frameList.addPropertyChangeListener(propertyChangeListener);
-    }
-
-    /**
-     * Disposes this frame action.
-     * This implementation removes the property change listener from the frame list.
-     */
-    public void dispose() {
-        frameList.removePropertyChangeListener(propertyChangeListener);
-    }
-
-    /**
-     * Returns the frame list.
-     */
-    public FrameList getFrameList() {
-        return frameList;
-    }
-
-    /**
-     * Handles a property change event from the frame list.
-     * This implementation calls <code>update()</code>.
-     */
-    protected void handlePropertyChange(PropertyChangeEvent event) {
-        update();
-    }
-
-    /**
-     * Updates this action.  This implementation does nothing.
-     * Most implementations will override this method.
-     */
-    public void update() {
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/FrameList.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/FrameList.java
deleted file mode 100644
index a722e03..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/FrameList.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.framelist;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.common.EventManager;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * Supports a web-browser style of navigation by maintaining a list
- * of frames.  Each frame holds a snapshot of a view at some point 
- * in time.
- * <p>
- * The frame list obtains a snapshot of the current frame from a frame source
- * on creation, and whenever switching to a different frame.
- * </p>
- * <p>
- * A property change notification is sent whenever the current page changes.
- * </p>
- */
-public class FrameList extends EventManager {
-
-    /** Property name constant for the current frame. */
-    public static final String P_CURRENT_FRAME = "currentFrame"; //$NON-NLS-1$
-
-    private IFrameSource source;
-
-    private List frames;
-
-    private int current;
-
-    /**
-     * Creates a new frame list with the given source.
-     *
-     * @param source the frame source
-     */
-    public FrameList(IFrameSource source) {
-        this.source = source;
-        Frame frame = source.getFrame(IFrameSource.CURRENT_FRAME, 0);
-        frame.setParent(this);
-        frame.setIndex(0);
-        frames = new ArrayList();
-        frames.add(frame);
-        current = 0;
-    }
-
-    /**
-     * Adds a property change listener.
-     * Has no effect if an identical listener is already registered.
-     *
-     * @param listener a property change listener
-     */
-    public void addPropertyChangeListener(IPropertyChangeListener listener) {
-    	addListenerObject(listener);
-    }
-
-    /**
-     * Moves the frame pointer back by one.
-     * Has no effect if there is no frame before the current one.
-     * Fires a <code>P_CURRENT_FRAME</code> property change event.
-     */
-    public void back() {
-        if (current > 0) {
-            setCurrent(current - 1);
-        }
-    }
-
-    /**
-     * Notifies any property change listeners that a property has changed.
-     * Only listeners registered at the time this method is called are notified.
-     *
-     * @param event the property change event
-     *
-     * @see IPropertyChangeListener#propertyChange
-     */
-    protected void firePropertyChange(PropertyChangeEvent event) {
-        Object[] listeners = getListeners();
-        for (int i = 0; i < listeners.length; ++i) {
-            ((IPropertyChangeListener) listeners[i]).propertyChange(event);
-        }
-    }
-
-    /**
-     * Moves the frame pointer forward by one.
-     * Has no effect if there is no frame after the current one.
-     * Fires a <code>P_CURRENT_FRAME</code> property change event.
-     */
-    public void forward() {
-        if (current < frames.size() - 1) {
-            setCurrent(current + 1);
-        }
-    }
-
-    /**
-     * Returns the current frame.
-     * Returns <code>null</code> if there is no current frame.
-     *
-     * @return the current frame, or <code>null</code>
-     */
-    public Frame getCurrentFrame() {
-        return getFrame(current);
-    }
-
-    /**
-     * Returns the index of the current frame.
-     *
-     * @return the index of the current frame
-     */
-    public int getCurrentIndex() {
-        return current;
-    }
-
-    /**
-     * Returns the frame at the given index, or <code>null</code>
-     * if the index is &le; 0 or &ge; <code>size()</code>.
-     *
-     * @param index the index of the requested frame
-     * @return the frame at the given index or <code>null</code>
-     */
-    public Frame getFrame(int index) {
-        if (index < 0 || index >= frames.size()) {
-			return null;
-		}
-        return (Frame) frames.get(index);
-    }
-
-    /**
-     * Returns the frame source.
-     */
-    public IFrameSource getSource() {
-        return source;
-    }
-
-    /**
-     * Adds the given frame after the current frame,
-     * and advances the pointer to the new frame.
-     * Before doing so, updates the current frame, and removes any frames following the current frame.
-     * Fires a <code>P_CURRENT_FRAME</code> property change event.
-     *
-     * @param frame the frame to add
-     */
-    public void gotoFrame(Frame frame) {
-        for (int i = frames.size(); --i > current;) {
-            frames.remove(i);
-        }
-        frame.setParent(this);
-        int index = frames.size();
-        frame.setIndex(index);
-        frames.add(frame);
-        setCurrent(index);
-    }
-
-    /**
-     * Removes a property change listener.
-     * Has no effect if an identical listener is not registered.
-     *
-     * @param listener a property change listener
-     */
-    public void removePropertyChangeListener(IPropertyChangeListener listener) {
-        removeListenerObject(listener);
-    }
-
-    /**
-     * Sets the current frame to the one with the given index.
-     * Updates the old current frame, and fires a <code>P_CURRENT_FRAME</code> property change event
-     * if the current frame changes.
-     *
-     * @param newCurrent the index of the frame
-     */
-    void setCurrent(int newCurrent) {
-        Assert.isTrue(newCurrent >= 0 && newCurrent < frames.size());
-        int oldCurrent = this.current;
-        if (oldCurrent != newCurrent) {
-            updateCurrentFrame();
-            this.current = newCurrent;
-            firePropertyChange(new PropertyChangeEvent(this, P_CURRENT_FRAME,
-                    getFrame(oldCurrent), getFrame(newCurrent)));
-        }
-    }
-
-    /**
-     * Sets the current frame to the frame with the given index.
-     * Fires a <code>P_CURRENT_FRAME</code> property change event
-     * if the current frame changes.
-     */
-    public void setCurrentIndex(int index) {
-        if (index != -1 && index != current) {
-			setCurrent(index);
-		}
-    }
-
-    /**
-     * Returns the number of frames in the frame list.
-     */
-    public int size() {
-        return frames.size();
-    }
-
-    /**
-     * Replaces the current frame in this list with the current frame 
-     * from the frame source.  No event is fired.
-     */
-    public void updateCurrentFrame() {
-        Assert.isTrue(current >= 0);
-        Frame frame = source.getFrame(IFrameSource.CURRENT_FRAME,
-                IFrameSource.FULL_CONTEXT);
-        frame.setParent(this);
-        frame.setIndex(current);
-        frames.set(current, frame);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/FrameListMessages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/FrameListMessages.java
deleted file mode 100644
index 8e6d6b5..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/FrameListMessages.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.framelist;
-
-
-/**
- * Utility class which helps with managing messages.
- * @deprecated These messages are not API and should not be referenced
- * outside of this plug-in.
- */
-class FrameListMessages {
-
-    private FrameListMessages() {
-        // prevent instantiation of class
-    }
-
-    /**
-     * Returns the formatted message for the given key in
-     * the resource bundle. 
-     *
-     * @param key the resource name
-     * @param args the message arguments
-     * @return the string
-     */
-    public static String format(String key, Object[] args) {
-        return key;
-    }
-
-    /**
-     * Returns the resource object with the given key in
-     * the resource bundle. If there isn't any value under
-     * the given key, the key is returned.
-     *
-     * @param key the resource name
-     * @return the string
-     */
-    public static String getString(String key) {
-      return key;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/GoIntoAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/GoIntoAction.java
deleted file mode 100644
index c8043ae..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/GoIntoAction.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.framelist;
-
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.views.framelist.FrameListMessages;
-
-/**
- * Generic "Go Into" action which goes to the frame for the current selection. 
- */
-public class GoIntoAction extends FrameAction {
-
-    /**
-     * Constructs a new action for the specified frame list.
-     * 
-     * @param frameList the frame list
-     */
-    public GoIntoAction(FrameList frameList) {
-        super(frameList);
-        setText(FrameListMessages.GoInto_text);
-        setToolTipText(FrameListMessages.GoInto_toolTip);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IFrameListHelpContextIds.GO_INTO_ACTION);
-        update();
-    }
-
-    private Frame getSelectionFrame(int flags) {
-        return getFrameList().getSource().getFrame(
-                IFrameSource.SELECTION_FRAME, flags);
-    }
-
-    /**
-     * Calls <code>gotoFrame</code> on the frame list with a frame
-     * representing the currently selected container.
-     */
-    public void run() {
-        Frame selectionFrame = getSelectionFrame(IFrameSource.FULL_CONTEXT);
-        if (selectionFrame != null) {
-            getFrameList().gotoFrame(selectionFrame);
-        }
-    }
-
-    /**
-     * Updates this action's enabled state.
-     * This action is enabled only when there is a frame for the current selection.
-     */
-    public void update() {
-        super.update();
-        Frame selectionFrame = getSelectionFrame(0);
-        setEnabled(selectionFrame != null);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/IFrameListHelpContextIds.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/IFrameListHelpContextIds.java
deleted file mode 100644
index 3f78735..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/IFrameListHelpContextIds.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.framelist;
-
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Help context ids for the frame list.
- * <p>
- * This interface contains constants only; it is not intended to be implemented
- * or extended.
- * </p>
- * 
- */
-/*package*/interface IFrameListHelpContextIds {
-    public static final String PREFIX = PlatformUI.PLUGIN_ID + "."; //$NON-NLS-1$
-
-    // Actions
-    public static final String BACK_ACTION = PREFIX + "back_action_context"; //$NON-NLS-1$
-
-    public static final String FORWARD_ACTION = PREFIX
-            + "forward_action_context"; //$NON-NLS-1$
-
-    public static final String GO_INTO_ACTION = PREFIX
-            + "go_into_action_context"; //$NON-NLS-1$
-
-    public static final String UP_ACTION = PREFIX + "up_action_context"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/IFrameSource.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/IFrameSource.java
deleted file mode 100644
index 3ada72e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/IFrameSource.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.framelist;
-
-/**
- * A frame source is the source of frames which appear in a frame list.
- * The frame list asks for the current frame whenever it switches
- * to another frame, so that the context can be restored when the
- * frame becomes current again.
- *
- * @see FrameList
- */
-public interface IFrameSource {
-
-    /**
-     * Frame constant indicating the current frame.
-     */
-    public static final int CURRENT_FRAME = 0x0001;
-
-    /**
-     * Frame constant indicating the frame for the selection.
-     */
-    public static final int SELECTION_FRAME = 0x0002;
-
-    /**
-     * Frame constant indicating the parent frame.
-     */
-    public static final int PARENT_FRAME = 0x0003;
-
-    /**
-     * Flag constant indicating that the full context should be captured.
-     */
-    public static final int FULL_CONTEXT = 0x0001;
-
-    /**
-     * Returns a new frame describing the state of the source.
-     * If the <code>FULL_CONTEXT</code> flag is specified, then the full
-     * context of the source should be captured by the frame.
-     * Otherwise, only the visible aspects of the frame, such as the name and tool tip text,
-     * will be used.
-     *
-     * @param whichFrame one of the frame constants defined in this interface
-     * @param flags a bit-wise OR of the flag constants defined in this interface
-     * @return a new frame describing the current state of the source
-     */
-    public Frame getFrame(int whichFrame, int flags);
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/TreeFrame.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/TreeFrame.java
deleted file mode 100644
index fefedfa..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/TreeFrame.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.framelist;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IElementFactory;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Frame for tree viewers.  This capture the viewer's input element, selection,
- * and expanded elements.
- */
-public class TreeFrame extends Frame {
-    private static final String TAG_SELECTION = "selection"; //$NON-NLS-1$
-
-    private static final String TAG_EXPANDED = "expanded"; //$NON-NLS-1$
-
-    private static final String TAG_ELEMENT = "element"; //$NON-NLS-1$
-
-    private static final String TAG_FRAME_INPUT = "frameInput"; //$NON-NLS-1$
-
-    private static final String TAG_FACTORY_ID = "factoryID"; //$NON-NLS-1$
-
-    private AbstractTreeViewer viewer;
-
-    private Object input;
-
-    private ISelection selection;
-
-    private Object[] expandedElements;
-
-    /**
-     * Constructs a frame for the specified tree viewer.
-     * The frame's input, name and tool tip text are not set.
-     * 
-     * @param viewer the tree viewer
-     */
-    public TreeFrame(AbstractTreeViewer viewer) {
-        this.viewer = viewer;
-    }
-
-    /**
-     * Constructs a frame for the specified tree viewer.
-     * The frame's input element is set to the specified input element.
-     * The frame's name and tool tip text are set to the text for the input 
-     * element, as provided by the viewer's label provider.
-     * 
-     * @param viewer the tree viewer
-     * @param input the input element
-     */
-    public TreeFrame(AbstractTreeViewer viewer, Object input) {
-        this(viewer);
-        setInput(input);
-        ILabelProvider provider = (ILabelProvider) viewer.getLabelProvider();
-        String name = provider.getText(input);
-        if(name == null) {
-			name = "";//$NON-NLS-1$
-		}
-        setName(name);
-        setToolTipText(name);
-    }
-
-    /**
-     * Returns the expanded elements.
-     * 
-     * @return the expanded elements
-     */
-    public Object[] getExpandedElements() {
-        return expandedElements;
-    }
-
-    /**
-     * Returns the input element.
-     * 
-     * @return the input element
-     */
-    public Object getInput() {
-        return input;
-    }
-
-    /**
-     * Returns the selection.
-     * 
-     * @return the selection
-     */
-    public ISelection getSelection() {
-        return selection;
-    }
-
-    /**
-     * Returns the tree viewer.
-     * 
-     * @return the tree viewer
-     */
-    public AbstractTreeViewer getViewer() {
-        return viewer;
-    }
-
-    /**
-     * Restore IPersistableElements from the specified memento.
-     * 
-     * @param memento memento to restore elements from
-     * @return list of restored elements. May be empty.
-     */
-    private List restoreElements(IMemento memento) {
-        IMemento[] elementMem = memento.getChildren(TAG_ELEMENT);
-        List elements = new ArrayList(elementMem.length);
-
-        for (int i = 0; i < elementMem.length; i++) {
-            String factoryID = elementMem[i].getString(TAG_FACTORY_ID);
-            if (factoryID != null) {
-                IElementFactory factory = PlatformUI.getWorkbench()
-                        .getElementFactory(factoryID);
-                if (factory != null) {
-					elements.add(factory.createElement(elementMem[i]));
-				}
-            }
-        }
-        return elements;
-    }
-
-    /**
-     * Restore the frame from the specified memento.
-     * 
-     * @param memento memento to restore frame from
-     */
-    public void restoreState(IMemento memento) {
-        IMemento childMem = memento.getChild(TAG_FRAME_INPUT);
-
-        if (childMem == null) {
-			return;
-		}
-
-        String factoryID = childMem.getString(TAG_FACTORY_ID);
-        IAdaptable frameInput = null;
-        if (factoryID != null) {
-            IElementFactory factory = PlatformUI.getWorkbench()
-                    .getElementFactory(factoryID);
-            if (factory != null) {
-				frameInput = factory.createElement(childMem);
-			}
-        }
-        if (frameInput != null) {
-            input = frameInput;
-        }
-        IMemento expandedMem = memento.getChild(TAG_EXPANDED);
-        if (expandedMem != null) {
-            List elements = restoreElements(expandedMem);
-            expandedElements = elements.toArray(new Object[elements.size()]);
-        } else {
-            expandedElements = new Object[0];
-        }
-        IMemento selectionMem = memento.getChild(TAG_SELECTION);
-        if (selectionMem != null) {
-            List elements = restoreElements(selectionMem);
-            selection = new StructuredSelection(elements);
-        } else {
-            selection = StructuredSelection.EMPTY;
-        }
-    }
-
-    /**
-     * Save the specified elements to the given memento.
-     * The elements have to be adaptable to IPersistableElement.
-     * 
-     * @param elements elements to persist
-     * @param memento memento to persist elements in
-     */
-    private void saveElements(Object[] elements, IMemento memento) {
-        for (int i = 0; i < elements.length; i++) {
-            if (elements[i] instanceof IAdaptable) {
-                IPersistableElement persistable = (IPersistableElement) ((IAdaptable) elements[i])
-                        .getAdapter(IPersistableElement.class);
-                if (persistable != null) {
-                    IMemento elementMem = memento.createChild(TAG_ELEMENT);
-                    elementMem.putString(TAG_FACTORY_ID, persistable
-                            .getFactoryId());
-                    persistable.saveState(elementMem);
-                }
-            }
-        }
-    }
-
-    /**
-     * Save the frame state in the given memento.
-     * 
-     * @param memento memento to persist the frame state in.
-     */
-    public void saveState(IMemento memento) {
-        if (!(input instanceof IAdaptable)) {
-			return;
-		}
-
-        IPersistableElement persistable = (IPersistableElement) ((IAdaptable) input)
-                .getAdapter(IPersistableElement.class);
-        if (persistable != null) {
-            IMemento frameMemento = memento.createChild(TAG_FRAME_INPUT);
-
-            frameMemento.putString(TAG_FACTORY_ID, persistable.getFactoryId());
-            persistable.saveState(frameMemento);
-
-            if (expandedElements.length > 0) {
-                IMemento expandedMem = memento.createChild(TAG_EXPANDED);
-                saveElements(expandedElements, expandedMem);
-            }
-            // always IStructuredSelection since we only deal with tree viewers
-            if (selection instanceof IStructuredSelection) {
-                Object[] elements = ((IStructuredSelection) selection)
-                        .toArray();
-                if (elements.length > 0) {
-                    IMemento selectionMem = memento.createChild(TAG_SELECTION);
-                    saveElements(elements, selectionMem);
-                }
-            }
-        }
-    }
-
-    /**
-     * Sets the input element.
-     * 
-     * @param input the input element
-     */
-    public void setInput(Object input) {
-        this.input = input;
-    }
-
-    /**
-     * Sets the expanded elements.
-     * 
-     * @param expandedElements the expanded elements
-     */
-    public void setExpandedElements(Object[] expandedElements) {
-        this.expandedElements = expandedElements;
-    }
-
-    /**
-     * Sets the selection.
-     * 
-     * @param selection the selection
-     */
-    public void setSelection(ISelection selection) {
-        this.selection = selection;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/TreeViewerFrameSource.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/TreeViewerFrameSource.java
deleted file mode 100644
index dd0c101..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/TreeViewerFrameSource.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.framelist;
-
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-
-/** 
- * Frame source for tree viewers, which uses <code>TreeFrame</code> to capture
- * the state of the tree viewer.
- * 
- * @see TreeFrame
- */
-public class TreeViewerFrameSource implements IFrameSource {
-
-    private AbstractTreeViewer viewer;
-
-    /**
-     * Constructs a new tree viewer frame source for the specified tree viewer.
-     * 
-     * @param viewer the tree viewer
-     */
-    public TreeViewerFrameSource(AbstractTreeViewer viewer) {
-        this.viewer = viewer;
-    }
-
-    /**
-     * Connects this source as a listener on the frame list,
-     * so that when the current frame changes, the viewer is updated.
-     */
-    public void connectTo(FrameList frameList) {
-        frameList.addPropertyChangeListener(new IPropertyChangeListener() {
-            public void propertyChange(PropertyChangeEvent event) {
-                TreeViewerFrameSource.this.handlePropertyChange(event);
-            }
-        });
-    }
-
-    /**
-     * Returns a new tree frame capturing the specified input element.
-     * 
-     * @param input the input element
-     * @return the tree frame
-     */
-    protected TreeFrame createFrame(Object input) {
-        return new TreeFrame(viewer, input);
-    }
-
-    /**
-     * Updates the viewer in response to the current frame changing.
-     * 
-     * @param frame the new value for the current frame
-     */
-    protected void frameChanged(TreeFrame frame) {
-        viewer.getControl().setRedraw(false);
-        viewer.setInput(frame.getInput());
-        viewer.setExpandedElements(frame.getExpandedElements());
-        viewer.setSelection(frame.getSelection(), true);
-        viewer.getControl().setRedraw(true);
-    }
-
-    /**
-     * Returns the current frame.
-     * 
-     * @param flags a bit-wise OR of the frame source flag constants
-     * @return the current frame
-     */
-    protected Frame getCurrentFrame(int flags) {
-        Object input = viewer.getInput();
-        TreeFrame frame = createFrame(input);
-        if ((flags & IFrameSource.FULL_CONTEXT) != 0) {
-            frame.setSelection(viewer.getSelection());
-            frame.setExpandedElements(viewer.getExpandedElements());
-        }
-        return frame;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IFrameSource.
-     */
-    public Frame getFrame(int whichFrame, int flags) {
-        switch (whichFrame) {
-        case IFrameSource.CURRENT_FRAME:
-            return getCurrentFrame(flags);
-        case IFrameSource.PARENT_FRAME:
-            return getParentFrame(flags);
-        case IFrameSource.SELECTION_FRAME:
-            return getSelectionFrame(flags);
-        default:
-            return null;
-        }
-    }
-
-    /**
-     * Returns the parent frame, or <code>null</code> if there is no parent frame.
-     * 
-     * @param flags a bit-wise OR of the frame source flag constants
-     * @return the parent frame, or <code>null</code>
-     */
-    protected Frame getParentFrame(int flags) {
-        Object input = viewer.getInput();
-        ITreeContentProvider provider = (ITreeContentProvider) viewer
-                .getContentProvider();
-        Object parent = provider.getParent(input);
-        if (parent == null) {
-            return null;
-        } else {
-            TreeFrame frame = createFrame(parent);
-            if ((flags & IFrameSource.FULL_CONTEXT) != 0) {
-                frame.setSelection(viewer.getSelection());
-                // include current input in expanded set
-                Object[] expanded = viewer.getExpandedElements();
-                Object[] newExpanded = new Object[expanded.length + 1];
-                System.arraycopy(expanded, 0, newExpanded, 0, expanded.length);
-                newExpanded[newExpanded.length - 1] = input;
-                frame.setExpandedElements(newExpanded);
-            }
-            return frame;
-        }
-    }
-
-    /**
-     * Returns the frame for the selection, or <code>null</code> if there is no
-     * frame for the selection.
-     * 
-     * @param flags a bit-wise OR of the frame source flag constants
-     * @return the selection frame, or <code>null</code>
-     */
-    protected Frame getSelectionFrame(int flags) {
-        IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
-        if (sel.size() == 1) {
-            Object o = sel.getFirstElement();
-            if (viewer.isExpandable(o)) {
-                TreeFrame frame = createFrame(o);
-                if ((flags & IFrameSource.FULL_CONTEXT) != 0) {
-                    frame.setSelection(viewer.getSelection());
-                    frame.setExpandedElements(viewer.getExpandedElements());
-                }
-                return frame;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns the tree viewer.
-     * 
-     * @return the tree viewer
-     */
-    public AbstractTreeViewer getViewer() {
-        return viewer;
-    }
-
-    /**
-     * Handles a property change event from the frame list.
-     * Calls <code>frameChanged</code> when the current frame changes.
-     */
-    protected void handlePropertyChange(PropertyChangeEvent event) {
-        if (FrameList.P_CURRENT_FRAME.equals(event.getProperty())) {
-            frameChanged((TreeFrame) event.getNewValue());
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/UpAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/UpAction.java
deleted file mode 100644
index 0350d64..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/UpAction.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.framelist;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.views.framelist.FrameListMessages;
-
-/**
- * Generic "Up" action which goes to the parent frame for the current frame.
- */
-public class UpAction extends FrameAction {
-
-    /**
-     * Constructs a new action for the specified frame list.
-     * 
-     * @param frameList the frame list
-     */
-    public UpAction(FrameList frameList) {
-        super(frameList);
-        setText(FrameListMessages.Up_text);
-        ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
-        setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_UP));
-        setDisabledImageDescriptor(images
-                .getImageDescriptor(ISharedImages.IMG_TOOL_UP_DISABLED));
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IFrameListHelpContextIds.UP_ACTION);
-        update();
-    }
-
-    Frame getParentFrame(int flags) {
-        return getFrameList().getSource().getFrame(IFrameSource.PARENT_FRAME,
-                flags);
-    }
-
-    String getToolTipText(Frame parentFrame) {
-        if (parentFrame != null) {
-            String text = parentFrame.getToolTipText();
-            if (text != null && text.length() > 0) {
-                return NLS.bind(FrameListMessages.Up_toolTipOneArg, text);
-            }
-        }
-        return FrameListMessages.Up_toolTip;
-
-    }
-
-    /**
-     * Calls <code>gotoFrame</code> on the frame list with a frame
-     * representing the parent of the current input.
-     */
-    public void run() {
-        Frame parentFrame = getParentFrame(IFrameSource.FULL_CONTEXT);
-        if (parentFrame != null) {
-            getFrameList().gotoFrame(parentFrame);
-        }
-    }
-
-    /**
-     * Updates this action's enabled state and tool tip text.
-     * This action is enabled only when there is a parent frame for the current
-     * frame in the frame list.
-     * The tool tip text is "Up to " plus the tool tip text for the parent
-     * frame.
-     */
-    public void update() {
-        super.update();
-        Frame parentFrame = getParentFrame(0);
-        setEnabled(parentFrame != null);
-        setToolTipText(getToolTipText(parentFrame));
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/package.html b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/package.html
deleted file mode 100644
index 91c8565..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/framelist/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="Microsoft FrontPage 4.0">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-<p>Provides support for a web-browser style of navigation within a view by maintaining a list
-of frames.  Each frame holds a snapshot of a view at some point in time.
-Includes support for use with a tree viewer.</p>
-<p>
-<br>&nbsp;</p>
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/FilterConfigurationArea.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/FilterConfigurationArea.java
deleted file mode 100644
index 9db6a10..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/FilterConfigurationArea.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * FilterConfigurationArea is the area that the user can configure a filter in.
- * 
- * @since 3.4
- * 
- */
-public abstract class FilterConfigurationArea {
-
-	MarkerField field;
-
-	private FontMetrics fontMetrics;
-
-	/**
-	 * Apply the current settings to the filter.
-	 * 
-	 * @param filter
-	 */
-	public abstract void apply(MarkerFieldFilter filter);
-
-	/**
-	 * Create the contents of the configuration area in the parent.
-	 * 
-	 * @param parent
-	 */
-	public abstract void createContents(Composite parent);
-
-
-	/**
-	 * Return the {@link FontMetrics} for the receiver.
-	 * @return {@link FontMetrics} or <code>null</code> if {@link #initializeFontMetrics(Control)}
-	 * has not been called.
-	 */
-	protected FontMetrics getFontMetrics(){
-		return fontMetrics;
-	}
-
-	/**
-	 * Get the title for the receiver.
-	 * 
-	 * @return String
-	 */
-	public String getTitle() {
-		return field.getColumnHeaderText();
-	}
-
-	/**
-	 * Initialise {@link FontMetrics} for the receiver.
-	 * 
-	 * @param control
-	 */
-	protected void initializeFontMetrics(Control control) {
-		GC gc = new GC(control);
-		gc.setFont(JFaceResources.getDialogFont());
-		fontMetrics = gc.getFontMetrics();
-		gc.dispose();
-
-	}
-
-	/**
-	 * Initialise the receiver using the filter.
-	 * 
-	 * @param filter
-	 */
-	public abstract void initialize(MarkerFieldFilter filter);
-	
-	/**
-	 * Set the markerField for the receiver. This method intended to
-	 * be called by the marker support framework directly after
-	 * instantiation of the receiver.
-	 * 
-	 * @param markerField
-	 */
-	public final void setField(MarkerField markerField) {
-		field = markerField;
-	}
-
-	/**
-	 * Set the standard button data for the button.
-	 * @param button
-	 */
-	protected void setButtonLayoutData(Button button) {
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		int widthHint = Dialog.convertHorizontalDLUsToPixels(getFontMetrics(),IDialogConstants.BUTTON_WIDTH);
-		Point minSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-		data.widthHint = Math.max(widthHint, minSize.x);
-		button.setLayoutData(data);
-		
-	}
-
-	/**
-	 * Return the field for the receiver.
-	 * @return MarkerField
-	 */
-	public MarkerField getField() {
-		return field;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/FiltersContributionParameters.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/FiltersContributionParameters.java
deleted file mode 100644
index 9bd3bc0..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/FiltersContributionParameters.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers;
-
-import java.util.Map;
-
-
-/**
- * A MarkerFieldParameters is a class that specifies a Map of parameters
- * to be passed to a {@link MarkerFieldFilter}.
- * @since 3.4
- *
- */
-public abstract class FiltersContributionParameters {
-	
-	/**
-	 * Returns a map keyed names for parameter values. The values should be 
-	 * actual values that will be interpreted by the {@link MarkerFieldFilter}
-	 * these parameters are designed for.
-	 * 
-	 * Note that these parameters will be sent to the MarkerFieldFilter for
-	 * every visible {@link MarkerField} in a markers view.
-	 * 
-	 * 
-	 * @return A map of the name of the parameter value (<code>String</code>)
-	 *         to the actual value of the parameter (<code>String</code>).
-	 */
-	public abstract Map getParameterValues();
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerField.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerField.java
deleted file mode 100644
index 9e81a8b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerField.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.views.markers;
-
-import java.net.URL;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.resource.ResourceManager;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.DecorationOverlayIcon;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.util.BundleUtility;
-import org.eclipse.ui.internal.views.markers.MarkerSupportInternalUtilities;
-
-/**
- * MarkerField is the abstract superclass of the definition of the content
- * providers for columns in a Markers View.
- * 
- * @since 3.4
- * 
- */
-public abstract class MarkerField {
-
-	private IConfigurationElement configurationElement;
-	private ResourceManager imageManager;
-
-	/**
-	 * Annotate the image with indicators for whether or not help or quick fix
-	 * are available.
-	 * 
-	 * @param item
-	 *            the item being decorated
-	 * @param image
-	 *            the image being overlaid
-	 * @return Image
-	 */
-	public Image annotateImage(MarkerItem item, Image image) {
-		ImageDescriptor[] descriptors = new ImageDescriptor[5];
-		if (item.getMarker() != null) {
-			IMarker marker = item.getMarker();
-			// If there is no image get the full image rather than the decorated
-			// one
-			if (marker != null) {
-				String contextId = IDE.getMarkerHelpRegistry().getHelp(marker);
-				if (contextId != null) {
-					if (image == null)
-						image = JFaceResources.getImage(Dialog.DLG_IMG_HELP);
-					else
-						descriptors[IDecoration.TOP_RIGHT] = IDEWorkbenchPlugin
-								.getIDEImageDescriptor(MarkerSupportInternalUtilities.IMG_MARKERS_HELP_DECORATION_PATH);
-				}
-				if (IDE.getMarkerHelpRegistry().hasResolutions(marker)) {
-					if (image == null)
-						image = getImageManager()
-								.createImage(
-										IDEInternalWorkbenchImages
-												.getImageDescriptor(IDEInternalWorkbenchImages.IMG_ELCL_QUICK_FIX_ENABLED));
-					else
-						descriptors[IDecoration.BOTTOM_RIGHT] = IDEWorkbenchPlugin
-								.getIDEImageDescriptor(MarkerSupportInternalUtilities.IMG_MARKERS_QUICK_FIX_DECORATION_PATH);
-				}
-
-				if (descriptors[IDecoration.TOP_RIGHT] != null
-						|| descriptors[IDecoration.BOTTOM_RIGHT] != null)
-					image = getImageManager().createImage(
-							new DecorationOverlayIcon(image, descriptors));
-			}
-		}
-		return image;
-
-	}
-
-	/**
-	 * Compare item1 and item2 for sorting purposes.
-	 * 
-	 * @param item1
-	 * @param item2
-	 * @return Either:
-	 *         <li>a negative number if the value of item1 is less than the
-	 *         value of item2 for this field.
-	 *         <li><code>0</code> if the value of item1 and the value of
-	 *         item2 are equal for this field.
-	 *         <li>a positive number if the value of item1 is greater than the
-	 *         value of item2 for this field.
-	 */
-	public int compare(MarkerItem item1, MarkerItem item2) {
-		return getValue(item1).compareTo(getValue(item2));
-	}
-
-	/**
-	 * @return The image to be displayed in the column header for this field or
-	 *         <code>null<code>.
-	 */
-	public Image getColumnHeaderImage() {
-		String path = configurationElement
-				.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_ICON);
-		if (path == null)
-			return null;
-		URL url = BundleUtility.find(configurationElement.getContributor()
-				.getName(), path);
-		if (url == null)
-			return null;
-		return getImageManager().createImageWithDefault(
-				ImageDescriptor.createFromURL(url));
-	}
-
-	/**
-	 * Return the text to be displayed in the column header for this field.
-	 * 
-	 * @return String
-	 * @see #getColumnTooltipText() this is the default column tooltip text
-	 */
-	public String getColumnHeaderText() {
-		return configurationElement
-				.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_NAME);
-	}
-
-	/**
-	 * Return the text for the column tooltip.
-	 * 
-	 * @return String
-	 * @see #getColumnHeaderText()
-	 */
-	public String getColumnTooltipText() {
-		return getColumnHeaderText();
-	}
-
-	/**
-	 * Get the configuration element for the receiver. This is used by the
-	 * markerSupport internals to retreive the values defined in the extenstion.
-	 * 
-	 * @return IConfigurationElement
-	 */
-	public final IConfigurationElement getConfigurationElement() {
-		return configurationElement;
-	}
-
-	/**
-	 * Get the number of characters that should be reserved for the receiver.
-	 * 
-	 * @param control
-	 *            the control to scale from
-	 * @return int
-	 */
-	public int getDefaultColumnWidth(Control control) {
-		return 15 * MarkerSupportInternalUtilities.getFontWidth(control);
-	}
-
-	/**
-	 * Return the editing support for entries for this field. Return null if it
-	 * cannot be in-line edited.
-	 * 
-	 * @param viewer
-	 *            the viewer this will be applied to
-	 * @return {@link EditingSupport} or <code>null</code>.
-	 */
-	public EditingSupport getEditingSupport(ColumnViewer viewer) {
-		return null;
-	}
-
-	/**
-	 * Return the image manager used by the receiver.
-	 * 
-	 * @return ResourceManager
-	 */
-	protected ResourceManager getImageManager() {
-		if (imageManager == null)
-			return IDEWorkbenchPlugin.getDefault().getResourceManager();
-		return imageManager;
-	}
-
-	/**
-	 * @param item
-	 * @return The String value of the object for this particular field to be
-	 *         displayed to the user.
-	 */
-	public abstract String getValue(MarkerItem item);
-
-	/**
-	 * Set the configuration element used by the receiver.
-	 * 
-	 * @param element
-	 */
-	public final void setConfigurationElement(IConfigurationElement element) {
-		configurationElement = element;
-	}
-
-	/**
-	 * Set the imageManager. This is not normally required to be send if using a
-	 * {@link MarkerSupportView} as this is done for you.
-	 * 
-	 * @param manager
-	 */
-	public final void setImageManager(ResourceManager manager) {
-		this.imageManager = manager;
-	}
-
-	/**
-	 * Update the contents of the cell.
-	 * 
-	 * @param cell
-	 */
-	public void update(ViewerCell cell) {
-		cell.setText(getValue((MarkerItem) cell.getElement()));
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerFieldFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerFieldFilter.java
deleted file mode 100644
index b77cb4d..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerFieldFilter.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers;
-
-import java.util.Map;
-
-import org.eclipse.ui.IMemento;
-
-/**
- * A MarkerFieldFilter is a filter on a particular marker field.
- * @since 3.4
- *
- */
-public abstract class MarkerFieldFilter {
-	
-	private MarkerField field;
-
-	/**
-	 * Return whether or not marker should be filtered by the receiver.
-	 * @param item
-	 * @return boolean <code>true</code> if the marker should be shown.
-	 */
-	public abstract boolean select(MarkerItem item);
-	
-	/**
-	 * Initialise the receiver with the values in the values Map.
-	 * @param values
-	 * @see FiltersContributionParameters
-	 */
-	public void initialize(Map values){
-		//Do nothing by default
-	}
-	
-	/**
-	 * Populate the working copy with the copy of whatever fields are required.
-	 * @param copy
-	 */
-	public void populateWorkingCopy(MarkerFieldFilter copy){
-		copy.field = this.field;
-	}
-
-	/**
-	 * Set the field for the receiver.
-	 * @param markerField
-	 */
-	public final void setField(MarkerField markerField) {
-		field = markerField;
-		
-	}
-
-	/**
-	 * Get the field for the receiver.
-	 * @return MarkerField
-	 */
-	public final MarkerField getField() {
-		return field;
-	}
-
-	/**
-	 * Save any of the relevant state for the receiver in the memento
-	 * so that it can be used to restore the user settings.
-	 * @param memento
-	 * @see #loadSettings(IMemento)
-	 */
-	public abstract void saveSettings(IMemento memento) ;
-
-	/**
-	 * Load any settings for the receiver from the memento.
-	 * @param memento
-	 * @see #saveSettings(IMemento)
-	 */
-	public abstract void loadSettings(IMemento memento) ;
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerItem.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerItem.java
deleted file mode 100644
index 84ff292..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerItem.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.ui.internal.views.markers.MarkerSupportInternalUtilities;
-
-/**
- * The MarkerItem class is the class that represents the objects displayed a 
- * {@link MarkerSupportView}. This class is not intended to be sub-classed by clients,
- * @since 3.4
- * 
- */
-public abstract class MarkerItem {
-
-	/**
-	 * Return the boolean associated with attributeName or defaultValue if it is
-	 * not found.
-	 * 
-	 * @param attribute
-	 * @param defaultValue
-	 * @return <code>boolean</code>
-	 */
-	public boolean getAttributeValue(String attribute, boolean defaultValue) {
-		// There are no boolean values by default
-		return defaultValue;
-
-	}
-
-	/**
-	 * Get the value of the attribute in the enclosed marker.
-	 * 
-	 * @param attribute
-	 * @param defaultValue
-	 *            the defaultValue if the value is not set
-	 * @return int
-	 */
-	public int getAttributeValue(String attribute, int defaultValue) {
-		// There are no integer values by default
-		return defaultValue;
-
-	}
-
-	/**
-	 * Get the String value of the attribute in the enclosed marker.
-	 * 
-	 * @param attribute
-	 * @param defaultValue
-	 *            the defaultValue if the value is not set
-	 * @return String
-	 */
-	public String getAttributeValue(String attribute, String defaultValue) {
-		return defaultValue;
-
-	}
-
-	/**
-	 * Get the location string for the receiver. This method is provided for
-	 * convenience purposes as the location can be inferred from a line number
-	 * or location attribute if the {@link MarkerItem} has an associated
-	 * {@link IMarker}.
-	 * 
-	 * @return String
-	 * @see IMarker#LOCATION
-	 * @see IMarker#LINE_NUMBER
-	 */
-	public String getLocation() {
-		return MarkerSupportInternalUtilities.EMPTY_STRING;
-	}
-
-	/**
-	 * Get the path string for the receiver. This method is provided for
-	 * convenience as a path can be inferred from the location of an
-	 * {@link IResource} or the path attribute if the {@link MarkerItem} has an
-	 * associated {@link IMarker}.
-	 * 
-	 * @return String
-	 * @see MarkerViewUtil#PATH_ATTRIBUTE
-	 * @see IResource#getLocation()
-	 */
-	public String getPath() {
-		// There is no path by default
-		return MarkerSupportInternalUtilities.EMPTY_STRING;
-	}
-
-	/**
-	 * Return the marker for the receiver.
-	 * 
-	 * @return IMarker
-	 */
-	public IMarker getMarker() {
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerSupportConstants.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerSupportConstants.java
deleted file mode 100644
index 6b05628..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerSupportConstants.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers;
-
-/**
- * MarkerSupportConstants is a static class that supplies commonly used constants.
- * 
- * @since 3.4
- *
- */
-public class MarkerSupportConstants {
-	
-	/**
-	 * The constant used to specify the contains value on 
-	 * a {@link FiltersContributionParameters}
-	 */
-	public static final String CONTAINS_KEY = "CONTAINS"; //$NON-NLS-1$
-	
-	/**
-	 * The constant used to specify the does not contain value on 
-	 * a {@link FiltersContributionParameters}
-	 */
-	public static String DOES_NOT_CONTAIN_KEY = "DOES_NOT_CONTAIN"; //$NON-NLS-1$
-	
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerSupportView.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerSupportView.java
deleted file mode 100644
index 2f51355..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerSupportView.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.views.markers;
-
-import org.eclipse.ui.internal.views.markers.ExtendedMarkersView;
-
-/**
- * The MarkerSupportView is a view that supports the extensions
- * in the markerSupport extension point.
- * @since 3.4
- *
- */
-public abstract class MarkerSupportView extends ExtendedMarkersView {
-
-	
-	/**
-	 * Create a new instance of the receiver on contentGeneratorId.
-	 * @param contentGeneratorId the id of a markerContentGenerator
-	 * 	defined in an extension of the markerSupport extension.
-	 */
-	public MarkerSupportView(String contentGeneratorId) {
-		super(contentGeneratorId);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerViewHandler.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerViewHandler.java
deleted file mode 100644
index 7b27455..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerViewHandler.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007,2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.views.markers;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.handlers.HandlerUtil;
-import org.eclipse.ui.internal.ide.StatusUtil;
-import org.eclipse.ui.statushandlers.StatusManager;
-
-/**
- * MarkerViewHandler is the abstract class of the handlers for the
- * {@link MarkerSupportView}
- * 
- * @since 3.4
- * 
- */
-public abstract class MarkerViewHandler extends AbstractHandler {
-
-	private static final IMarker[] EMPTY_MARKER_ARRAY = new IMarker[0];
-
-	/**
-	 * Get the view this event occurred on.
-	 * 
-	 * @param event
-	 * @return {@link MarkerSupportView} or <code>null</code>
-	 */
-	public MarkerSupportView getView(ExecutionEvent event) {
-		IWorkbenchPart part = HandlerUtil.getActivePart(event);
-		if (part == null)
-			return null;
-		return (MarkerSupportView) part;
-	}
-
-	/**
-	 * Execute the specified undoable operation
-	 * 
-	 * @param operation
-	 * @param title
-	 * @param monitor
-	 * @param uiInfo
-	 */
-	public void execute(IUndoableOperation operation, String title,
-			IProgressMonitor monitor, IAdaptable uiInfo) {
-		try {
-			PlatformUI.getWorkbench().getOperationSupport()
-					.getOperationHistory().execute(operation, monitor, uiInfo);
-		} catch (ExecutionException e) {
-			if (e.getCause() instanceof CoreException) {
-				StatusManager.getManager().handle(
-						StatusUtil
-								.newStatus(IStatus.ERROR, title, e.getCause()),
-						StatusManager.SHOW);
-
-			} else {
-				StatusManager.getManager().handle(
-						StatusUtil.newStatus(IStatus.ERROR, title, e));
-			}
-		}
-	}
-
-	/**
-	 * Get the selected markers for the receiver in the view from event. If the
-	 * view cannot be found then return an empty array.
-	 * 
-	 * This is run using {@link Display#syncExec(Runnable)} so that it can be called 
-	 * outside of the UI {@link Thread}.
-	 * 
-	 * @param event
-	 * @return {@link IMarker}[]
-	 */
-	public IMarker[] getSelectedMarkers(ExecutionEvent event) {
-		final MarkerSupportView view = getView(event);
-		if (view == null)
-			return EMPTY_MARKER_ARRAY;
-
-		final IMarker[][] result = new IMarker[1][];
-		view.getSite().getShell().getDisplay().syncExec(new Runnable() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see java.lang.Runnable#run()
-			 */
-			public void run() {
-				result[0] = view.getSelectedMarkers();
-			}
-		});
-		return result[0];
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerViewUtil.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerViewUtil.java
deleted file mode 100644
index d6d72ece..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerViewUtil.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.internal.views.markers.MarkerSupportInternalUtilities;
-import org.eclipse.ui.views.markers.internal.MarkerView;
-
-/**
- * Utility class for showing markers in the marker views.
- */
-public class MarkerViewUtil {
-
-	/**
-	 * The PATH_ATTRIBUTE is the tag for the attribute on a marker that can be
-	 * used to supply the String for the path rather than using the path of the
-	 * underlying resource.
-	 * 
-	 * @see IMarker#getAttribute(java.lang.String)
-	 * @since 3.2
-	 */
-	public static final String PATH_ATTRIBUTE = "org.eclipse.ui.views.markers.path";//$NON-NLS-1$
-
-	/**
-	 * The NAME_ATTRIBUTE is the tag for the attribute on a marker that can be
-	 * used to supply the String for the name rather than using the name of the
-	 * underlying resource.
-	 * 
-	 * @see IMarker#getAttribute(java.lang.String)
-	 * @since 3.2
-	 */
-	public static final String NAME_ATTRIBUTE = "org.eclipse.ui.views.markers.name";//$NON-NLS-1$
-
-	/**
-	 * Returns the id of the view used to show markers of the same type as the
-	 * given marker.
-	 * 
-	 * @param marker
-	 *            the marker
-	 * @return the view id or <code>null</code> if no appropriate view could
-	 *         be determined
-	 * @throws CoreException
-	 *             if an exception occurs testing the type of the marker
-	 * @since 3.0
-	 */
-	public static String getViewId(IMarker marker) throws CoreException {
-		if (marker.isSubtypeOf(IMarker.TASK)) {
-			return IPageLayout.ID_TASK_LIST;
-		} else if (marker.isSubtypeOf(IMarker.PROBLEM)) {
-			return IPageLayout.ID_PROBLEM_VIEW;
-		} else if (marker.isSubtypeOf(IMarker.BOOKMARK)) {
-			return IPageLayout.ID_BOOKMARKS;
-		}
-		return null;
-	}
-
-	/**
-	 * Shows the given marker in the appropriate view in the given page. This
-	 * must be called from the UI thread.
-	 * 
-	 * @param page
-	 *            the workbench page in which to show the marker
-	 * @param marker
-	 *            the marker to show
-	 * @param showView
-	 *            <code>true</code> if the view should be shown first
-	 *            <code>false</code> to only show the marker if the view is
-	 *            already showing
-	 * @return <code>true</code> if the marker was successfully shown,
-	 *         <code>false</code> if not
-	 * @since 3.0
-	 */
-	public static boolean showMarker(IWorkbenchPage page, IMarker marker,
-			boolean showView) {
-
-		boolean returnValue = false;
-		try {
-			String viewId = getViewId(marker);
-			if (viewId == null) // Use the problem view by default
-				viewId = IPageLayout.ID_PROBLEM_VIEW;
-
-			IViewPart view = showView ? page.showView(viewId) : page
-					.findView(viewId);
-			if (view != null)
-				returnValue = MarkerSupportInternalUtilities.showMarker(view,
-						marker);
-
-			// If we have already shown the new one do not open another one
-			viewId = getLegacyViewId(marker);
-			if (viewId != null) {
-				if (returnValue)
-					view = page.findView(viewId);
-				else
-					view = showView ? page.showView(viewId) : page
-							.findView(viewId);
-			}
-
-			if (view != null && view instanceof MarkerView) {
-				StructuredSelection selection = new StructuredSelection(marker);
-				MarkerView markerView = (MarkerView) view;
-				markerView.setSelection(selection, true);
-				returnValue = true;
-
-			}
-		} catch (CoreException e) {
-			Policy.handle(e);
-		}
-		return returnValue;
-	}
-
-	/**
-	 * Returns the id of the view used to show markers of the same type as the
-	 * given marker using.legacy support
-	 * 
-	 * @param marker
-	 *            the marker
-	 * @return the view id or <code>null</code> if no appropriate view could
-	 *         be determined
-	 * @throws CoreException
-	 *             if an exception occurs testing the type of the marker
-	 */
-	private static String getLegacyViewId(IMarker marker) throws CoreException {
-		String viewId = getViewId(marker);
-		if (viewId == null)
-			return null;
-		return viewId + MarkerSupportInternalUtilities.LEGACY_SUFFIX;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/WorkbenchMarkerResolution.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/WorkbenchMarkerResolution.java
deleted file mode 100644
index d71a350..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/WorkbenchMarkerResolution.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ui.IMarkerResolution2;
-import org.eclipse.ui.views.markers.internal.Util;
-
-/**
- * WorkbenchMarkerResolution is the resolution that can be grouped
- * with others that are similar to allow multi selection.
- * @since 3.2
- *
- */
-public abstract class WorkbenchMarkerResolution implements IMarkerResolution2 {
-	
-	/**
-	 * Iterate through the list of supplied markers. Return any that can also have
-	 * the receiver applied to them.
-	 * @param markers
-	 * @return IMarker[]
-	 * 	 
-	 * */
-	public abstract IMarker[] findOtherMarkers(IMarker[] markers);
-
-    /**
-     * Runs this resolution. Resolve all <code>markers</code>.
-     * <code>markers</code> must be a subset of the markers returned
-     * by <code>findOtherMarkers(IMarker[])</code>.
-	 * 
-	 * @param markers The markers to resolve, not null
-	 * @param monitor The monitor to report progress
-	 */
-	public void run(IMarker[] markers, IProgressMonitor monitor) {
-		
-		for (int i = 0; i < markers.length; i++) {
-			monitor.subTask(Util.getProperty(IMarker.MESSAGE, markers[i]));
-			run(markers[i]);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/AbstractField.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/AbstractField.java
deleted file mode 100644
index 966d6ff..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/AbstractField.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/package org.eclipse.ui.views.markers.internal;
-
-
-/**
- * AbstractField is the abstract superclass for fields.
- * @since 3.2
- *
- */
-public abstract class AbstractField implements IField {
-	
-	boolean visible = true;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#isShowing()
-	 */
-	public boolean isShowing() {
-		return visible;
-	}
-	
-	/**
-	 * Set whether or not the receiver is showing.
-	 * @param showing
-	 */
-	public void setShowing(boolean showing){
-		visible = showing;
-		
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionAddGlobalTask.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionAddGlobalTask.java
deleted file mode 100644
index 17ecd80..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionAddGlobalTask.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * The ActionAddGlobalTask is the action for adding a global task.
- *
- */
-public class ActionAddGlobalTask extends Action {
-
-    private static final String ENABLED_IMAGE_PATH = "elcl16/addtsk_tsk.gif"; //$NON-NLS-1$
-
-    private IWorkbenchPart part;
-
-    /**
-     * Create a new instance of the global task.
-     * @param part
-     */
-    public ActionAddGlobalTask(IWorkbenchPart part) {
-        setText(MarkerMessages.addGlobalTaskAction_title); 
-        setImageDescriptor(IDEWorkbenchPlugin.getIDEImageDescriptor(ENABLED_IMAGE_PATH));
-        setToolTipText(MarkerMessages.addGlobalTaskAction_tooltip);
-        this.part = part;
-    }
-
-    public void run() {
-        DialogTaskProperties dialog = new DialogTaskProperties(part.getSite()
-                .getShell(), MarkerMessages.addGlobalTaskDialog_title);
-        dialog.open();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionCopyMarker.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionCopyMarker.java
deleted file mode 100644
index 9c2ed33..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionCopyMarker.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-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.ISharedImages;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.MarkerTransfer;
-
-/**
- * Copies one or more marker to the clipboard.
- */
-public class ActionCopyMarker extends MarkerSelectionProviderAction {
-
-	private IWorkbenchPart part;
-
-	private Clipboard clipboard;
-
-	private IField[] properties;
-
-	/**
-	 * Creates the action.
-	 * 
-	 * @param part
-	 * @param provider
-	 */
-	public ActionCopyMarker(IWorkbenchPart part, ISelectionProvider provider) {
-		super(provider, MarkerMessages.copyAction_title);
-		this.part = part;
-		setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
-				.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
-		setEnabled(false);
-	}
-
-	/**
-	 * Sets the clipboard that the marker(s) will be copied to.
-	 * 
-	 * @param clipboard
-	 *            the clipboard
-	 */
-	void setClipboard(Clipboard clipboard) {
-		this.clipboard = clipboard;
-	}
-
-	/**
-	 * Sets the properties to be added to the plain-text marker report that will
-	 * be copied to the clipboard.
-	 * 
-	 * @param properties
-	 */
-	void setProperties(IField[] properties) {
-		this.properties = properties;
-	}
-
-	/**
-	 * Copies the selected IMarker objects to the clipboard. If properties have
-	 * been set, also copies a plain-text report of the selected markers to the
-	 * clipboard.
-	 */
-	public void run() {
-		IMarker[] markers = getSelectedMarkers();
-		setClipboard(markers, createMarkerReport(markers));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void selectionChanged(IStructuredSelection selection) {
-		setEnabled(Util.allConcreteSelection(selection));
-	}
-
-	private void setClipboard(IMarker[] markers, String markerReport) {
-		try {
-			// Place the markers on the clipboard
-			Object[] data;
-			Transfer[] transferTypes;
-			if (markerReport == null) {
-				data = new Object[] { markers };
-				transferTypes = new Transfer[] { MarkerTransfer.getInstance() };
-			} else {
-				data = new Object[] { markers, markerReport };
-				transferTypes = new Transfer[] { MarkerTransfer.getInstance(),
-						TextTransfer.getInstance() };
-			}
-
-			clipboard.setContents(data, transferTypes);
-		} catch (SWTError e) {
-			if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD) {
-				throw e;
-			}
-			if (MessageDialog.openQuestion(part.getSite().getShell(),
-					MarkerMessages.CopyToClipboardProblemDialog_title,
-					MarkerMessages.CopyToClipboardProblemDialog_message)) {
-				setClipboard(markers, markerReport);
-			}
-		}
-	}
-
-	/**
-	 * Creates a plain-text report of the selected markers based on predefined
-	 * properties.
-	 * 
-	 * @param rawMarkers
-	 * @return the marker report
-	 */
-	String createMarkerReport(IMarker[] rawMarkers) {
-		ConcreteMarker[] markers;
-		try {
-			markers = MarkerList.createMarkers(rawMarkers);
-		} catch (CoreException e) {
-			ErrorDialog.openError(part.getSite().getShell(),
-					MarkerMessages.Error, null, e.getStatus());
-			return ""; //$NON-NLS-1$
-		}
-
-		StringBuffer report = new StringBuffer();
-
-		final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$
-		final char DELIMITER = '\t';
-
-		if (properties == null) {
-			return null;
-		}
-
-		// create header
-		for (int i = 0; i < properties.length; i++) {
-			report.append(properties[i].getDescription());
-			if (i == properties.length - 1) {
-				report.append(NEWLINE);
-			} else {
-				report.append(DELIMITER);
-			}
-		}
-
-		for (int i = 0; i < markers.length; i++) {
-			ConcreteMarker marker = markers[i];
-			for (int j = 0; j < properties.length; j++) {
-				report.append(properties[j].getValue(marker));
-				if (j == properties.length - 1) {
-					report.append(NEWLINE);
-				} else {
-					report.append(DELIMITER);
-				}
-			}
-		}
-
-		return report.toString();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionDeleteCompleted.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionDeleteCompleted.java
deleted file mode 100644
index 53ada8d..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionDeleteCompleted.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.ide.undo.DeleteMarkersOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-
-/**
- * ActionDeleteCompleted is the action for deleting completed markers.
- * 
- */
-public class ActionDeleteCompleted extends MarkerSelectionProviderAction {
-
-	private TaskView part;
-
-	/**
-	 * Constructs an ActionDeleteCompleted instance
-	 * 
-	 * @param part
-	 * @param provider
-	 */
-	public ActionDeleteCompleted(TaskView part, ISelectionProvider provider) {
-		super(provider, MarkerMessages.deleteCompletedAction_title);
-		this.part = part;
-		setEnabled(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		final List completed = getCompletedTasks();
-		// Check if there is anything to do
-		if (completed.size() == 0) {
-			MessageDialog.openInformation(part.getSite().getShell(),
-					MarkerMessages.deleteCompletedTasks_dialogTitle,
-					MarkerMessages.deleteCompletedTasks_noneCompleted);
-			return;
-		}
-		String message;
-		if (completed.size() == 1) {
-			message = MarkerMessages.deleteCompletedTasks_permanentSingular;
-		} else {
-			message = NLS.bind(
-					MarkerMessages.deleteCompletedTasks_permanentPlural, String
-							.valueOf(completed.size()));
-		}
-		// Verify.
-		if (!MessageDialog.openConfirm(part.getSite().getShell(),
-				MarkerMessages.deleteCompletedTasks_dialogTitle, message)) {
-			return;
-		}
-		IMarker[] markers = (IMarker[]) completed.toArray(new IMarker[completed
-				.size()]);
-		IUndoableOperation op = new DeleteMarkersOperation(markers, getText());
-		execute(op, MarkerMessages.deleteCompletedTasks_errorMessage, null,
-				WorkspaceUndoUtil.getUIInfoAdapter(part.getSite().getShell()));
-	}
-
-	private List getCompletedTasks() {
-		List completed = new ArrayList();
-
-		MarkerList markerList = part.getVisibleMarkers();
-
-		ConcreteMarker[] markers = markerList.toArray();
-
-		for (int i = 0; i < markers.length; i++) {
-			ConcreteMarker marker = markers[i];
-			if (marker instanceof TaskMarker) {
-				TaskMarker taskMarker = (TaskMarker) marker;
-
-				if (taskMarker.getDone() == 1) {
-					completed.add(taskMarker.getMarker());
-				}
-			}
-		}
-
-		return completed;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void selectionChanged(IStructuredSelection selection) {
-		setEnabled(!selection.isEmpty());
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionMarkCompleted.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionMarkCompleted.java
deleted file mode 100644
index 00196ca..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionMarkCompleted.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.ide.undo.UpdateMarkersOperation;
-
-/**
- * ActionMarkCompleted is the action for marking task completion.
- * 
- */
-public class ActionMarkCompleted extends MarkerSelectionProviderAction {
-
-	/**
-	 * Create a new instance of the reciever.
-	 * 
-	 * @param provider
-	 */
-	public ActionMarkCompleted(ISelectionProvider provider) {
-		super(provider, MarkerMessages.markCompletedAction_title);
-		setEnabled(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		IMarker[] markers = getSelectedMarkers();
-		Map attrs = new HashMap();
-		attrs.put(IMarker.DONE, Boolean.TRUE);
-		IUndoableOperation op = new UpdateMarkersOperation(markers, attrs,
-				getText(), true);
-		execute(op, getText(), null, null);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void selectionChanged(IStructuredSelection selection) {
-		setEnabled(false);
-		if (selection == null || selection.isEmpty()) {
-			return;
-		}
-		for (Iterator iterator = selection.iterator(); iterator.hasNext();) {
-			Object obj = iterator.next();
-			if (!(obj instanceof ConcreteMarker)) {
-				return;
-			}
-			IMarker marker = ((ConcreteMarker) obj).getMarker();
-			if (!marker.getAttribute(IMarker.USER_EDITABLE, true)) {
-				return;
-			}
-			if (marker.getAttribute(IMarker.DONE, false)) {
-				return;
-			}
-		}
-		setEnabled(true);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionMarkerProperties.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionMarkerProperties.java
deleted file mode 100644
index 86a295a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionMarkerProperties.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.actions.SelectionProviderAction;
-
-/**
- * ActionMarkerProperties is the action for opening a properties dialog.
- * 
- */
-public class ActionMarkerProperties extends SelectionProviderAction {
-
-	private IWorkbenchPart part;
-
-	private String markerName;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param part
-	 * @param provider
-	 * @param markerName
-	 *            the name describing the specific type of marker.
-	 */
-	public ActionMarkerProperties(IWorkbenchPart part,
-			ISelectionProvider provider, String markerName) {
-		super(provider, MarkerMessages.propertiesAction_title);
-		setEnabled(false);
-		this.part = part;
-		this.markerName = markerName;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if (!isEnabled()) {
-			return;
-		}
-		Object obj = getStructuredSelection().getFirstElement();
-		if (!(obj instanceof ConcreteMarker)) {
-			return;
-		}
-		ConcreteMarker marker = (ConcreteMarker) obj;
-		DialogMarkerProperties dialog = new DialogMarkerProperties(part
-				.getSite().getShell(), MarkerMessages.propertiesDialog_title, markerName);
-		dialog.setMarker(marker.getMarker());
-		dialog.open();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void selectionChanged(IStructuredSelection selection) {
-		setEnabled(selection != null && selection.size() == 1);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionOpenMarker.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionOpenMarker.java
deleted file mode 100644
index 099fb4b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionOpenMarker.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - Fix for Bug 73612  
- *        	[Markers] "Open All" does not work with multi-select in the bookmarks view
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.Iterator;
-
-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.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.util.OpenStrategy;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.ide.ResourceUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.statushandlers.StatusAdapter;
-import org.eclipse.ui.statushandlers.StatusManager;
-
-/**
- * Action to open an editor on the selected bookmarks.
- */
-public class ActionOpenMarker extends MarkerSelectionProviderAction {
-
-	private final String IMAGE_PATH = "elcl16/gotoobj_tsk.gif"; //$NON-NLS-1$
-
-	private final String DISABLED_IMAGE_PATH = "dlcl16/gotoobj_tsk.gif"; //$NON-NLS-1$
-
-	protected IWorkbenchPart part;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param part
-	 * @param provider
-	 */
-	public ActionOpenMarker(IWorkbenchPart part, ISelectionProvider provider) {
-		super(provider, MarkerMessages.openAction_title);
-		this.part = part;
-		setImageDescriptor(IDEWorkbenchPlugin.getIDEImageDescriptor(IMAGE_PATH));
-		setDisabledImageDescriptor(IDEWorkbenchPlugin
-				.getIDEImageDescriptor(DISABLED_IMAGE_PATH));
-		setEnabled(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		IMarker[] markers = getSelectedMarkers();
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
-
-			// optimization: if the active editor has the same input as the
-			// selected marker then
-			// RevealMarkerAction would have been run and we only need to
-			// activate the editor
-			IEditorPart editor = part.getSite().getPage().getActiveEditor();
-			if (editor != null) {
-				IEditorInput input = editor.getEditorInput();
-				IFile file = ResourceUtil.getFile(input);
-				if (file != null) {
-					if (marker.getResource().equals(file)) {
-						part.getSite().getPage().activate(editor);
-					}
-				}
-			}
-
-			if (marker.getResource() instanceof IFile) {
-				try {
-					IFile file = (IFile) marker.getResource();
-					if (file.getLocation() == null
-							|| file.getLocationURI() == null)
-						return; // Abort if it cannot be opened
-					IDE.openEditor(part.getSite().getPage(), marker,
-							OpenStrategy.activateOnOpen());
-				} catch (PartInitException e) {
-					// Open an error style dialog for PartInitException by
-					// including any extra information from the nested
-					// CoreException if present.
-
-					// Check for a nested CoreException
-					CoreException nestedException = null;
-					IStatus status = e.getStatus();
-					if (status != null
-							&& status.getException() instanceof CoreException) {
-						nestedException = (CoreException) status.getException();
-					}
-
-					if (nestedException != null) {
-						// Open an error dialog and include the extra
-						// status information from the nested CoreException
-						reportStatus(nestedException.getStatus());
-					} else {
-						// Open a regular error dialog since there is no
-						// extra information to display
-						reportError(e.getLocalizedMessage());
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Report an error message
-	 * 
-	 * @param message
-	 */
-	private void reportError(String message) {
-		IStatus status = new Status(IStatus.ERROR,
-				IDEWorkbenchPlugin.IDE_WORKBENCH, message);
-		reportStatus(status);
-	}
-
-	/**
-	 * Report the status
-	 * 
-	 * @param status
-	 */
-	private void reportStatus(IStatus status) {
-		StatusAdapter adapter = new StatusAdapter(status);
-		adapter.setProperty(StatusAdapter.TITLE_PROPERTY,
-				MarkerMessages.OpenMarker_errorTitle);
-		StatusManager.getManager().handle(adapter, StatusManager.SHOW);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void selectionChanged(IStructuredSelection selection) {
-		if (Util.allConcreteSelection(selection)) {
-			Iterator nodes = selection.iterator();
-			while (nodes.hasNext()) {
-				ConcreteMarker marker = ((MarkerNode) nodes.next()).getConcreteRepresentative();
-				if (marker.getResource().getType() == IResource.FILE) {
-					setEnabled(true);
-					return;
-				}
-			}
-		}
-		setEnabled(false);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionPasteMarker.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionPasteMarker.java
deleted file mode 100644
index 61090c9..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionPasteMarker.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.ArrayList;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.CreateMarkersOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.part.MarkerTransfer;
-
-/**
- * Pastes one or more bookmark(s) from the clipboard into the bookmark
- * navigator.
- */
-public class ActionPasteMarker extends MarkerSelectionProviderAction {
-
-	private IWorkbenchPart part;
-
-	private Clipboard clipboard;
-
-	private String[] pastableTypes;
-
-	private String markerName;
-
-	/**
-	 * Creates the action.
-	 * 
-	 * @param part
-	 * @param provider
-	 * @param markerName
-	 *            the name used to describe the specific kind of marker being
-	 *            pasted.
-	 */
-	public ActionPasteMarker(IWorkbenchPart part, ISelectionProvider provider,
-			String markerName) {
-		super(provider, MarkerMessages.pasteAction_title);
-		this.part = part;
-		this.pastableTypes = new String[0];
-		this.markerName = markerName;
-		setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
-				.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
-		setEnabled(false);
-	}
-
-	void setClipboard(Clipboard clipboard) {
-		this.clipboard = clipboard;
-	}
-
-	/**
-	 * Copies the marker(s) from the clipboard to the bookmark navigator view.
-	 */
-	public void run() {
-		// Get the markers from the clipboard
-		MarkerTransfer transfer = MarkerTransfer.getInstance();
-		IMarker[] markerData = (IMarker[]) clipboard.getContents(transfer);
-		paste(markerData);
-	}
-
-	void paste(final IMarker[] markers) {
-		if (markers == null) {
-			return;
-		}
-
-		final ArrayList newMarkerTypes = new ArrayList();
-		final ArrayList newMarkerAttributes = new ArrayList();
-		final ArrayList newMarkerResources = new ArrayList();
-
-		try {
-			ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
-				public void run(IProgressMonitor monitor) throws CoreException {
-					for (int i = 0; i < markers.length; i++) {
-						// Collect info about the markers to be pasted.
-						newMarkerTypes.add(markers[i].getType());
-						newMarkerResources.add(markers[i].getResource());
-						newMarkerAttributes.add(markers[i].getAttributes());
-
-					}
-				}
-			}, null);
-		} catch (CoreException e) {
-			ErrorDialog.openError(part.getSite().getShell(),
-					MarkerMessages.PasteMarker_errorTitle, null, e.getStatus());
-			return;
-		}
-
-		final String[] types = (String[]) newMarkerTypes
-				.toArray(new String[newMarkerTypes.size()]);
-		final Map[] attrs = (Map[]) newMarkerAttributes
-				.toArray(new Map[newMarkerAttributes.size()]);
-		final IResource[] resources = (IResource[]) newMarkerResources
-				.toArray(new IResource[newMarkerResources.size()]);
-		String operationTitle = NLS.bind(MarkerMessages.qualifiedMarkerCommand_title,
-				MarkerMessages.pasteAction_title, markerName);
-		final CreateMarkersOperation op = new CreateMarkersOperation(types,
-				attrs, resources, operationTitle);
-		execute(op, MarkerMessages.PasteMarker_errorTitle, null,
-				WorkspaceUndoUtil.getUIInfoAdapter(part.getSite().getShell()));
-
-		// Need to do this in an asyncExec, even though we're in the UI thread
-		// here,
-		// since the marker view updates itself with the addition in an
-		// asyncExec,
-		// which hasn't been processed yet.
-		// Must be done outside the create marker operation above since
-		// notification for add is
-		// sent after the operation is executed.
-		if (getSelectionProvider() != null && op.getMarkers() != null) {
-			part.getSite().getShell().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					getSelectionProvider().setSelection(
-							new StructuredSelection(op.getMarkers()));
-				}
-			});
-		}
-	}
-
-	void updateEnablement() {
-		setEnabled(false);
-		if (clipboard == null) {
-			return;
-		}
-
-		// Paste if clipboard contains pastable markers
-		MarkerTransfer transfer = MarkerTransfer.getInstance();
-		IMarker[] markerData = (IMarker[]) clipboard.getContents(transfer);
-		if (markerData == null || markerData.length < 1
-				|| pastableTypes == null) {
-			return;
-		}
-		for (int i = 0; i < markerData.length; i++) {
-			try {
-				IMarker marker = markerData[i];
-				if (!marker.exists()) {
-					break;
-				}
-				boolean pastable = false;
-				for (int j = 0; j < pastableTypes.length; j++) {
-					if (marker.isSubtypeOf(pastableTypes[j])) {
-						pastable = true;
-						break;
-					}
-				}
-				if (!pastable) {
-					return;
-				}
-				if (!Util.isEditable(marker)) {
-					return;
-				}
-			} catch (CoreException e) {
-				return;
-			}
-		}
-		setEnabled(true);
-	}
-
-	/**
-	 * @param strings
-	 */
-	void setPastableTypes(String[] strings) {
-		pastableTypes = strings;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionProblemProperties.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionProblemProperties.java
deleted file mode 100644
index 100063b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionProblemProperties.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * ActionProblemProperties is the action for opening the properties
- * in the problems view.
- *
- */
-public class ActionProblemProperties extends MarkerSelectionProviderAction {
-
-    private IWorkbenchPart part;
-
-    /**
-     * Create a new instance of the receiver.
-     * @param part
-     * @param provider
-     */
-    public ActionProblemProperties(IWorkbenchPart part,
-            ISelectionProvider provider) {
-        super(provider, MarkerMessages.propertiesAction_title);
-        setEnabled(false);
-        this.part = part;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run() {
- 
-    	IMarker marker = getSelectedMarker();
-        DialogMarkerProperties dialog = new DialogProblemProperties(part
-                .getSite().getShell());
-        dialog.setMarker(marker);
-        dialog.open();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection)
-     */
-    public void selectionChanged(IStructuredSelection selection) {
-        setEnabled(Util.isSingleConcreteSelection(selection));
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionRemoveMarker.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionRemoveMarker.java
deleted file mode 100644
index 8eb21e6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionRemoveMarker.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.Iterator;
-
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.DeleteMarkersOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-
-/**
- * Action to remove the selected bookmarks.
- */
-public class ActionRemoveMarker extends MarkerSelectionProviderAction {
-
-	private IWorkbenchPart part;
-	
-	private String markerName;
-
-	/**
-	 * Creates the action.
-	 * 
-	 * @param part
-	 * @param provider
-	 * @param markerName
-	 *            the name describing the specific kind of marker being removed
-	 */
-	public ActionRemoveMarker(IWorkbenchPart part, ISelectionProvider provider,
-			String markerName) {
-		super(provider, MarkerMessages.deleteAction_title);
-		this.part = part;
-		this.markerName = markerName;
-		setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
-				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
-		setDisabledImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
-				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE_DISABLED));
-		setToolTipText(MarkerMessages.deleteAction_tooltip);
-		setEnabled(false);
-	}
-
-	/**
-	 * Delete the marker selection.
-	 */
-	public void run() {
-		String operationTitle = NLS.bind(MarkerMessages.qualifiedMarkerCommand_title,
-				MarkerMessages.deleteAction_title, markerName);
-		DeleteMarkersOperation op = new DeleteMarkersOperation(
-				getSelectedMarkers(), operationTitle);
-		execute(op, MarkerMessages.RemoveMarker_errorTitle, null,
-				WorkspaceUndoUtil.getUIInfoAdapter(part.getSite().getShell()));
-	}
-
-	public void selectionChanged(IStructuredSelection selection) {
-		setEnabled(false);
-		if (selection == null || selection.isEmpty()) {
-			return;
-		}
-		for (Iterator iterator = selection.iterator(); iterator.hasNext();) {
-			Object obj = iterator.next();
-			if (!(obj instanceof ConcreteMarker)) {
-				return;
-			}
-
-			if (!Util.isEditable(((ConcreteMarker) obj).getMarker())) {
-				return;
-			}
-		}
-		setEnabled(true);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionResolveMarker.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionResolveMarker.java
deleted file mode 100644
index 2484c8e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionResolveMarker.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
-
-/**
- * This action displays a list of resolutions for the selected marker
- * 
- * @since 2.0
- */
-public class ActionResolveMarker extends MarkerSelectionProviderAction {
-
-	private MarkerView view;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param markerView
-	 * @param provider
-	 */
-	public ActionResolveMarker(MarkerView markerView,
-			ISelectionProvider provider) {
-		super(provider, MarkerMessages.resolveMarkerAction_title);
-		setEnabled(false);
-		setImageDescriptor(IDEInternalWorkbenchImages
-				.getImageDescriptor(IDEInternalWorkbenchImages.IMG_ELCL_QUICK_FIX_ENABLED));
-		setDisabledImageDescriptor(IDEInternalWorkbenchImages
-				.getImageDescriptor(IDEInternalWorkbenchImages.IMG_DLCL_QUICK_FIX_DISABLED));
-		view = markerView;
-	}
-
-	/**
-	 * Displays a list of resolutions and performs the selection.
-	 */
-	public void run() {
-
-		IRunnableContext context = new ProgressMonitorDialog(view.getSite()
-				.getShell());
-		final Object[] resolutions = new Object[1];
-
-		IRunnableWithProgress resolutionsRunnable = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor) {
-				monitor.beginTask(NLS.bind(
-						MarkerMessages.resolveMarkerAction_computationAction,
-						getMarkerDescription()), 100);
-				monitor.worked(25);
-				resolutions[0] = IDE.getMarkerHelpRegistry().getResolutions(
-						getSelectedMarker());
-				monitor.done();
-			}
-		};
-
-		Object service = view.getSite().getAdapter(
-				IWorkbenchSiteProgressService.class);
-
-		try {
-			if (service == null) {
-				PlatformUI.getWorkbench().getProgressService().runInUI(context,
-						resolutionsRunnable, null);
-			} else {
-				((IWorkbenchSiteProgressService) service).runInUI(context,
-						resolutionsRunnable, null);
-			}
-		} catch (InvocationTargetException exception) {
-			handleException(exception);
-			return;
-		} catch (InterruptedException exception) {
-			handleException(exception);
-			return;
-		}
-
-		IMarkerResolution[] foundResolutions = (IMarkerResolution[]) resolutions[0];
-		if (foundResolutions.length == 0)
-			MessageDialog
-					.openInformation(
-							view.getSite().getShell(),
-							MarkerMessages.MarkerResolutionDialog_CannotFixTitle,
-							NLS
-									.bind(
-											MarkerMessages.MarkerResolutionDialog_CannotFixMessage,
-											getMarkerDescription()));
-		else {
-			Dialog dialog = new MarkerResolutionDialog(view.getSite()
-					.getShell(), getSelectedMarker(), foundResolutions, view);
-			dialog.open();
-		}
-
-	}
-
-	/**
-	 * Handle the exception.
-	 * 
-	 * @param exception
-	 */
-	private void handleException(Exception exception) {
-		IDEWorkbenchPlugin.log(exception.getLocalizedMessage(), exception);
-		ErrorDialog.openError(view.getSite().getShell(), MarkerMessages.Error,
-				NLS.bind(
-						MarkerMessages.MarkerResolutionDialog_CannotFixMessage,
-						getMarkerDescription()), Util.errorStatus(exception));
-	}
-
-	/**
-	 * Return the description of the marker.
-	 * 
-	 * @return String
-	 */
-	private String getMarkerDescription() {
-		return Util.getProperty(IMarker.MESSAGE, getSelectedMarker());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void selectionChanged(IStructuredSelection selection) {
-
-		if (Util.isSingleConcreteSelection(selection)) {
-			if (IDE.getMarkerHelpRegistry().hasResolutions(getSelectedMarker())) {
-				setEnabled(true);
-				return;
-			}
-		}
-
-		setEnabled(false);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionRevealMarker.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionRevealMarker.java
deleted file mode 100644
index d8e9071..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionRevealMarker.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.ide.ResourceUtil;
-
-/**
- * ActionRevealMarker is the action for opening the editor on
- * a marker.
- *
- */
-public class ActionRevealMarker extends MarkerSelectionProviderAction {
-
-	protected IWorkbenchPart part;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * @param part
-	 * @param provider
-	 */
-	public ActionRevealMarker(IWorkbenchPart part, ISelectionProvider provider) {
-		super(provider, Util.EMPTY_STRING); 
-		this.part = part;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		
-		IEditorPart editor = part.getSite().getPage().getActiveEditor();
-		if (editor == null) {
-			return;
-		}
-		IFile file = ResourceUtil.getFile(editor.getEditorInput());
-		if (file != null) {
-			IMarker marker = getSelectedMarker();
-			if (marker.getResource().equals(file)) {
-				try {
-					IDE.openEditor(part.getSite().getPage(),
-							marker, false);
-				} catch (CoreException e) {
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void selectionChanged(IStructuredSelection selection) {
-		setEnabled(Util.isSingleConcreteSelection(selection));
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionSelectAll.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionSelectAll.java
deleted file mode 100644
index 76e6409..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionSelectAll.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.StatusUtil;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.views.markers.internal.MarkerAdapter.MarkerCategory;
-
-/**
- * The ActionSelectAll is the action for selecting all of the entries.
- * 
- */
-public class ActionSelectAll extends MarkerSelectionProviderAction {
-
-	private MarkerView view;
-
-	/**
-	 * Create a new instance of the receiver with the supplied
-	 * 
-	 * @param markerView
-	 */
-	public ActionSelectAll(MarkerView markerView) {
-		super(markerView.getViewer(), MarkerMessages.selectAllAction_title);
-		setEnabled(true);
-		view = markerView;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-
-		if (view.getMarkerAdapter().isBuilding())
-			return;
-
-		IRunnableWithProgress selectionRunnableWithProgress = new IRunnableWithProgress() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
-			 */
-			public void run(IProgressMonitor monitor) {
-
-				try {
-					monitor.beginTask(MarkerMessages.selectAllAction_title,
-							 100);
-					monitor.subTask(MarkerMessages.selectAllAction_calculating);
-					if (view.getMarkerAdapter().isShowingHierarchy()) {
-
-						if (monitor.isCanceled())
-							return;
-
-						monitor.worked(10);
-						PlatformUI.getWorkbench().getDisplay()
-								.readAndDispatch();
-						MarkerCategory[] categories = view.getMarkerAdapter()
-								.getCategories();
-						int totalSize = 0;
-						for (int i = 0; i < categories.length; i++) {
-							MarkerCategory markerCategory = categories[i];
-							totalSize += markerCategory.getDisplayedSize();
-						}
-						monitor.worked(10);
-						PlatformUI.getWorkbench().getDisplay()
-								.readAndDispatch();
-						Object[] selection = new Object[totalSize];
-						int index = 0;
-						for (int i = 0; i < categories.length; i++) {
-							MarkerNode[] children = categories[i].getChildren();
-							System.arraycopy(children, 0, selection, index,
-									children.length);
-							index += children.length;
-						}
-						monitor.worked(10);
-						if (monitor.isCanceled())
-							return;
-						PlatformUI.getWorkbench().getDisplay()
-								.readAndDispatch();
-						monitor
-								.subTask(MarkerMessages.selectAllAction_applying);
-						getSelectionProvider().setSelection(
-								new StructuredSelection(selection));
-					} else {
-						if (monitor.isCanceled())
-							return;
-						monitor.worked(10);
-						List selection = view.getMarkerAdapter()
-								.getCurrentMarkers().asList();
-						monitor.worked(10);
-						monitor
-								.subTask(MarkerMessages.selectAllAction_applying);
-						PlatformUI.getWorkbench().getDisplay()
-								.readAndDispatch();
-						getSelectionProvider().setSelection(
-								new StructuredSelection(selection));
-					}
-				} finally {
-					monitor.done();
-				}
-
-			}
-		};
-
-		try {
-			PlatformUI.getWorkbench().getProgressService().run(false, false,
-					selectionRunnableWithProgress);
-		} catch (InvocationTargetException e) {
-			StatusManager.getManager().handle(
-					StatusUtil.newStatus(IStatus.ERROR,
-							e.getLocalizedMessage(), e), StatusManager.LOG);
-		} catch (InterruptedException e) {
-			StatusManager.getManager().handle(
-					StatusUtil.newStatus(IStatus.ERROR,
-							e.getLocalizedMessage(), e), StatusManager.LOG);
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void selectionChanged(IStructuredSelection selection) {
-		setEnabled(!selection.isEmpty());
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionTaskProperties.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionTaskProperties.java
deleted file mode 100644
index e2564ea..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ActionTaskProperties.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * ActionTaskProperties is the action for setting a tasks properties.
- * 
- */
-public class ActionTaskProperties extends MarkerSelectionProviderAction {
-
-	private IWorkbenchPart part;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param part
-	 * @param provider
-	 */
-	public ActionTaskProperties(IWorkbenchPart part, ISelectionProvider provider) {
-		super(provider, MarkerMessages.propertiesAction_title);
-		setEnabled(false);
-		this.part = part;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-
-		DialogMarkerProperties dialog = new DialogTaskProperties(part.getSite()
-				.getShell());
-		dialog.setMarker(getSelectedMarker());
-		dialog.open();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.SelectionProviderAction#selectionChanged(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void selectionChanged(IStructuredSelection selection) {
-		setEnabled(Util.isSingleConcreteSelection(selection));
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/AttributeMarkerGrouping.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/AttributeMarkerGrouping.java
deleted file mode 100644
index 20deb54..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/AttributeMarkerGrouping.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-
-/**
- * AttributeMarkerGrouping is the configuration element for the
- * markerAttributeGrouping extension.
- * 
- * @since 3.2
- * 
- */
-public class AttributeMarkerGrouping {
-	
-	private static final String DEFAULT_GROUPING_ENTRY = "defaultGroupingEntry";//$NON-NLS-1$
-
-	private static final String MARKER_TYPE = "markerType";//$NON-NLS-1$
-
-	private static final String ATTRIBUTE = "attribute"; //$NON-NLS-1$
-
-	private String attribute;
-
-	private String markerType;
-
-	private String defaultGroupingEntry;
-
-	private IConfigurationElement element;
-
-	// A list of groups we are associated with for unloading
-	private Collection groups = new HashSet();
-
-	/**
-	 * Create a new instance of the receiver from element.
-	 * @param element
-	 */
-	public AttributeMarkerGrouping(IConfigurationElement element) {
-
-		attribute = element.getAttribute(ATTRIBUTE);
-		markerType = element.getAttribute(MARKER_TYPE);
-		defaultGroupingEntry = element.getAttribute(DEFAULT_GROUPING_ENTRY);
-		this.element = element;
-	}
-
-	/**
-	 * Return the id of the default grouping.
-	 * 
-	 * @return String or <code>null</code> if it is not defined.
-	 */
-	public String getDefaultGroupingEntry() {
-		return defaultGroupingEntry;
-	}
-
-	/**
-	 * Return the id of the marker type for this type.
-	 * 
-	 * @return String
-	 */
-	public String getMarkerType() {
-		return markerType;
-	}
-
-	/**
-	 * Return the name of the attribute for the receiver.
-	 * 
-	 * @return String
-	 */
-	public String getAttribute() {
-		return attribute;
-	}
-
-	/**
-	 * Return the IConfigurationElement for the receiver.
-	 * 
-	 * @return IConfigurationElement
-	 */
-	public IConfigurationElement getElement() {
-		return element;
-	}
-
-	/**
-	 * Add markerGroup to the list of referenced groups.
-	 * 
-	 * @param markerGroup
-	 */
-	public void addGroup(MarkerGroup markerGroup) {
-		groups.add(markerGroup);
-
-	}
-
-	/**
-	 * Unmap the receiver from the groups
-	 */
-	public void unmap() {
-		Iterator referencedGroups = groups.iterator();
-		while (referencedGroups.hasNext()) {
-			MarkerGroup group = (MarkerGroup) referencedGroups.next();
-			group.unmap(this);
-		}
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/BookmarkFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/BookmarkFilter.java
deleted file mode 100644
index c7d5069..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/BookmarkFilter.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.ui.IMemento;
-
-public class BookmarkFilter extends MarkerFilter {
-
-	private final static String TAG_CONTAINS = "contains"; //$NON-NLS-1$
-
-	private final static String TAG_DESCRIPTION = "description"; //$NON-NLS-1$
-
-	final static boolean DEFAULT_CONTAINS = true;
-
-	final static String DEFAULT_DESCRIPTION = ""; //$NON-NLS-1$
-
-	private boolean contains;
-
-	private String description;
-
-	/**
-	 * Create a new instance of the recevier with the default name.
-	 * 
-	 */
-	public BookmarkFilter() {
-		this(MarkerMessages.MarkerFilter_defaultFilterName);
-	}
-
-	/**
-	 * Create a new instance of the recevier with the filterName
-	 * 
-	 * @param filterName
-	 */
-	public BookmarkFilter(String filterName) {
-		super(filterName, new String[] { IMarker.BOOKMARK });
-	}
-
-	/**
-	 * Returns true iff the given marker is accepted by this filter
-	 */
-	public boolean selectMarker(ConcreteMarker marker) {
-		return !isEnabled()
-				|| (super.selectMarker(marker) && selectByDescription(marker));
-	}
-
-	private boolean selectByDescription(ConcreteMarker marker) {
-		if (description == null || description.equals("")) { //$NON-NLS-1$
-			return true;
-		}
-
-		String markerDescription = marker.getDescription();
-		int index = markerDescription.indexOf(description);
-		return contains ? (index >= 0) : (index < 0);
-	}
-
-	boolean getContains() {
-		return contains;
-	}
-
-	String getDescription() {
-		return description;
-	}
-
-	void setContains(boolean contains) {
-		this.contains = contains;
-	}
-
-	void setDescription(String description) {
-		this.description = description;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerFilter#resetState()
-	 */
-	void resetState() {
-		super.resetState();
-		contains = DEFAULT_CONTAINS;
-		description = DEFAULT_DESCRIPTION;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerFilter#restoreFilterSettings(org.eclipse.jface.dialogs.IDialogSettings)
-	 */
-	public void restoreFilterSettings(IDialogSettings settings) {
-
-		super.restoreFilterSettings(settings);
-
-		String setting = settings.get(TAG_CONTAINS);
-
-		if (setting != null) {
-			contains = Boolean.valueOf(setting).booleanValue();
-		}
-
-		setting = settings.get(TAG_DESCRIPTION);
-
-		if (setting != null) {
-			description = new String(setting);
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerFilter#restoreFilterSettings(org.eclipse.ui.IMemento)
-	 */
-	protected void restoreFilterSettings(IMemento memento) {
-		super.restoreFilterSettings(memento);
-
-		String setting = memento.getString(TAG_CONTAINS);
-
-		if (setting != null) {
-			contains = Boolean.valueOf(setting).booleanValue();
-		}
-
-		setting = memento.getString(TAG_DESCRIPTION);
-
-		if (setting != null) {
-			description = new String(setting);
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerFilter#saveFilterSettings(org.eclipse.ui.IMemento)
-	 */
-	public void saveFilterSettings(IMemento memento) {
-		super.saveFilterSettings(memento);
-		memento.putString(TAG_CONTAINS, String.valueOf(contains));
-		memento.putString(TAG_DESCRIPTION, description);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/BookmarkMarker.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/BookmarkMarker.java
deleted file mode 100644
index 655b515..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/BookmarkMarker.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IMarker;
-
-/**
- * Represents a marker visible in the Bookmarks view. Currently, this adds no additional
- * fields to the ConcreteMarker class. However, if additional fields were added to the
- * bookmark view that are not general to all views, these fields would be added to this
- * class.
- */
-public class BookmarkMarker extends ConcreteMarker {
-
-    /**
-     * @param toCopy
-     */
-    public BookmarkMarker(IMarker toCopy) {
-        super(toCopy);
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/BookmarkView.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/BookmarkView.java
deleted file mode 100644
index e74a82f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/BookmarkView.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - Fix for
- *     		Bug 154289 [Viewers] - NPE in TreeEditorImpl.activateCellEditor
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.UpdateMarkersOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.part.CellEditorActionHandler;
-
-/**
- * The BookmarkView is the marker view for bookmarks.
- *
- */
-public class BookmarkView extends MarkerView {
-
-	private final IField[] HIDDEN_FIELDS = { new FieldCreationTime() };
-
-	private final static String[] ROOT_TYPES = { IMarker.BOOKMARK };
-
-	private final static String[] TABLE_COLUMN_PROPERTIES = {IMarker.MESSAGE,
-		Util.EMPTY_STRING,
-		Util.EMPTY_STRING,
-		Util.EMPTY_STRING
-	};
-
-	private final static String TAG_DIALOG_SECTION = "org.eclipse.ui.views.bookmark"; //$NON-NLS-1$
-
-	private final IField[] VISIBLE_FIELDS = {new FieldMessage(),
-			new FieldResource(), new FieldFolder(), new FieldLineNumber() };
-
-	private ICellModifier cellModifier = new ICellModifier() {
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
-		 */
-		public Object getValue(Object element, String property) {
-			if (element instanceof ConcreteMarker
-					&& IMarker.MESSAGE.equals(property)) {
-				return ((ConcreteMarker) element).getDescription();
-			}
-			return null;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
-		 */
-		public boolean canModify(Object element, String property) {
-			return element instanceof ConcreteMarker && IMarker.MESSAGE.equals(property);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
-		 */
-		public void modify(Object element, String property, Object value) {
-			if (element instanceof Item) {
-				Item item = (Item) element;
-				Object data = item.getData();
-
-				if (data instanceof ConcreteMarker) {
-					IMarker marker = ((ConcreteMarker) data).getMarker();
-
-					try {
-						if (!marker.getAttribute(property).equals(value)) {
-							if (IMarker.MESSAGE.equals(property)) {
-								Map attrs = new HashMap();
-								attrs.put(IMarker.MESSAGE, value);
-								IUndoableOperation op = new UpdateMarkersOperation(marker, attrs, MarkerMessages.modifyBookmark_title, true);
-						           PlatformUI.getWorkbench().getOperationSupport().getOperationHistory().execute(
-						        		   op, null, WorkspaceUndoUtil.getUIInfoAdapter(getSite().getShell()));
-							}
-						}
-					} catch (ExecutionException e) {
-						if (e.getCause() instanceof CoreException) {
-							ErrorDialog.openError(
-									getSite().getShell(),
-									MarkerMessages.errorModifyingBookmark, null, ((CoreException)e.getCause()).getStatus()); 
-						} else {
-							// something rather unexpected occurred.
-							IDEWorkbenchPlugin.log(MarkerMessages.errorModifyingBookmark, e); 
-						}
-					} catch (CoreException e) {
-						ErrorDialog.openError(
-								getSite().getShell(),
-								MarkerMessages.errorModifyingBookmark, null, e.getStatus()); 
-					}
-				}
-			}
-		}
-	};
-
-	private CellEditorActionHandler cellEditorActionHandler;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-
-		TreeViewer treeViewer = getViewer();
-		CellEditor cellEditors[] = new CellEditor[treeViewer.getTree()
-				.getColumnCount()];
-		CellEditor descriptionCellEditor = new TextCellEditor(treeViewer
-				.getTree());
-		cellEditors[0] = descriptionCellEditor;
-		treeViewer.setCellEditors(cellEditors);
-		treeViewer.setCellModifier(cellModifier);
-		treeViewer.setColumnProperties(TABLE_COLUMN_PROPERTIES);
-
-		cellEditorActionHandler = new CellEditorActionHandler(getViewSite()
-				.getActionBars());
-		cellEditorActionHandler.addCellEditor(descriptionCellEditor);
-		cellEditorActionHandler.setCopyAction(copyAction);
-		cellEditorActionHandler.setPasteAction(pasteAction);
-		cellEditorActionHandler.setDeleteAction(deleteAction);
-		cellEditorActionHandler.setSelectAllAction(selectAllAction);
-		cellEditorActionHandler.setUndoAction(undoAction);
-		cellEditorActionHandler.setRedoAction(redoAction);
-	}
-
-	public void dispose() {
-		if (cellEditorActionHandler != null) {
-			cellEditorActionHandler.dispose();
-		}
-
-		super.dispose();
-	}
-
-	protected IDialogSettings getDialogSettings() {
-		IDialogSettings workbenchSettings = IDEWorkbenchPlugin.getDefault().getDialogSettings();
-		IDialogSettings settings = workbenchSettings
-				.getSection(TAG_DIALOG_SECTION);
-
-		if (settings == null) {
-			settings = workbenchSettings.addNewSection(TAG_DIALOG_SECTION);
-		}
-
-		return settings;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.TableView#getSortingFields()
-	 */
-	protected IField[] getSortingFields() {
-		IField[] all = new IField[VISIBLE_FIELDS.length + HIDDEN_FIELDS.length];
-		
-		System.arraycopy(VISIBLE_FIELDS, 0, all, 0, VISIBLE_FIELDS.length);
-		System.arraycopy(HIDDEN_FIELDS, 0, all, VISIBLE_FIELDS.length, HIDDEN_FIELDS.length);
-		
-		return all;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.TableView#getAllFields()
-	 */
-	protected IField[] getAllFields() {
-		return getSortingFields();
-	}
-
-	protected String[] getRootTypes() {
-		return ROOT_TYPES;
-	}
-
-
-	public void setSelection(IStructuredSelection structuredSelection,
-			boolean reveal) {
-		// TODO: added because nick doesn't like public API inherited from
-		// internal classes
-		super.setSelection(structuredSelection, reveal);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerTypes()
-	 */
-	protected String[] getMarkerTypes() {
-		return new String[] { IMarker.BOOKMARK };
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#createFiltersDialog()
-	 */
-	protected DialogMarkerFilter createFiltersDialog() {
-
-		MarkerFilter[] filters = getUserFilters();
-		BookmarkFilter[] bookmarkFilters = new BookmarkFilter[filters.length];
-		System.arraycopy(filters, 0, bookmarkFilters, 0, filters.length);
-		return new DialogBookmarkFilter(getSite().getShell(), bookmarkFilters);
-	}
-
-	protected String getStaticContextId() {
-		return PlatformUI.PLUGIN_ID + ".bookmark_view_context"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#createFilter(java.lang.String)
-	 */
-	protected MarkerFilter createFilter(String name) {
-		return new BookmarkFilter(name);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getSectionTag()
-	 */
-	protected String getSectionTag() {
-		return TAG_DIALOG_SECTION;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#fillContextMenuAdditions(org.eclipse.jface.action.IMenuManager)
-	 */
-	void fillContextMenuAdditions(IMenuManager manager) {
-		//Do nothing in this view
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerEnablementPreferenceName()
-	 */
-	String getMarkerEnablementPreferenceName() {
-		return IDEInternalPreferences.LIMIT_BOOKMARKS;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerLimitPreferenceName()
-	 */
-	String getMarkerLimitPreferenceName() {
-		return IDEInternalPreferences.BOOKMARKS_LIMIT;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getFiltersPreferenceName()
-	 */
-	String getFiltersPreferenceName() {
-		return IDEInternalPreferences.BOOKMARKS_FILTERS;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerName()
-	 */
-	protected String getMarkerName() {
-		return MarkerMessages.bookmark_title;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getUndoContext()
-	 */
-	protected IUndoContext getUndoContext() {
-		return WorkspaceUndoUtil.getBookmarksUndoContext();
-	}
-	
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/CategoryComparator.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/CategoryComparator.java
deleted file mode 100644
index 0c056d6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/CategoryComparator.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.Comparator;
-
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-
-/**
- * CategorySorter is the sorter that takes categories and the viewer into
- * account.
- * 
- */
-public class CategoryComparator extends ViewerComparator implements Comparator {
-	TableComparator innerSorter;
-
-	IField categoryField;
-
-	private final String TAG_FIELD = "categoryField"; //$NON-NLS-1$
-
-	/**
-	 * Create a new instance of the receiver wrapping a sorter.
-	 * 
-	 * @param sorter
-	 */
-	CategoryComparator(TableComparator sorter) {
-		innerSorter = sorter;
-	}
-
-	/**
-	 * Compare obj1 and obj starting with field depth.
-	 * 
-	 * @param obj1
-	 * @param obj2
-	 * @param depth
-	 * @param continueSearching
-	 * @return int
-	 * @see ViewerComparator#compare(Viewer, Object, Object)
-	 */
-	int compare(Object obj1, Object obj2, int depth, boolean continueSearching) {
-
-		if (obj1 == null || obj2 == null || !(obj1 instanceof MarkerNode)
-				|| !(obj2 instanceof MarkerNode)) {
-			return 0;
-		}
-
-		MarkerNode marker1;
-		MarkerNode marker2;
-
-		marker1 = (MarkerNode) obj1;
-		marker2 = (MarkerNode) obj2;
-
-		if (categoryField == null) {
-			return innerSorter.compare(marker1, marker2, depth,
-					continueSearching);
-		}
-
-		int result = categoryField.compare(marker1, marker2);
-		if (continueSearching && result == 0) {
-			return innerSorter.compare(marker1, marker2, 0, continueSearching);
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Viewer viewer, Object e1, Object e2) {
-		return compare(e1, e2, 0, true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Object arg0, Object arg1) {
-		return compare(arg0, arg1, 0, true);
-	}
-
-	/**
-	 * Get the category field.
-	 * 
-	 * @return IField
-	 */
-	public IField getCategoryField() {
-		return categoryField;
-	}
-
-	/**
-	 * Set the field that we are categorizing by.
-	 * 
-	 * @param field
-	 */
-	public void setCategoryField(IField field) {
-		this.categoryField = field;
-	}
-
-	/**
-	 * Set the inner sorter to the new sorter.
-	 * 
-	 * @param sorter2
-	 */
-	public void setTableSorter(TableComparator sorter2) {
-		innerSorter = sorter2;
-
-	}
-
-	/**
-	 * Save the state of the receiver.
-	 * 
-	 * @param dialogSettings
-	 */
-	public void saveState(IDialogSettings dialogSettings) {
-		if (dialogSettings == null) {
-			return;
-		}
-
-		IDialogSettings settings = dialogSettings
-				.getSection(TableComparator.TAG_DIALOG_SECTION);
-		if (settings == null) {
-			settings = dialogSettings
-					.addNewSection(TableComparator.TAG_DIALOG_SECTION);
-		}
-
-		String description = Util.EMPTY_STRING;
-		if (categoryField != null) {
-			description = categoryField.getDescription();
-		}
-
-		settings.put(TAG_FIELD, description);
-
-	}
-
-	/**
-	 * Restore the state of the receiver from the dialog settings.
-	 * 
-	 * @param dialogSettings
-	 * @param view
-	 */
-	public void restoreState(IDialogSettings dialogSettings, ProblemView view) {
-		if (dialogSettings == null) {
-			selectDefaultGrouping(view);
-			return;
-		}
-
-		IDialogSettings settings = dialogSettings
-				.getSection(TableComparator.TAG_DIALOG_SECTION);
-		if (settings == null) {
-			selectDefaultGrouping(view);
-			return;
-		}
-
-		String description = settings.get(TAG_FIELD);
-		view.selectCategory(description, this);
-	}
-
-	/**
-	 * Select the default grouping in the problem view
-	 * @param view
-	 */
-	private void selectDefaultGrouping(ProblemView view) {
-		view.selectCategoryField(MarkerSupportRegistry.getInstance()
-				.getDefaultGroupField(), this);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ConcreteMarker.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ConcreteMarker.java
deleted file mode 100644
index 3e923bf..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ConcreteMarker.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-import com.ibm.icu.text.CollationKey; 
-import com.ibm.icu.text.Collator; 
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * This is a concrete class that stores the same type of information as the IMarkers
- * used by the IDE. This class exists as an optimization. The various get* methods
- * on IMarker are extremely slow, which makes it very slow to sort markers (for example,
- * in the problems view). This marker class stores the fields in the most efficient form
- * for sorting and display, but necessarily removes some generality from IMarker.
- */
-public class ConcreteMarker extends MarkerNode{
-
-    private String description;
-
-    private String resourceName;
-
-    private String inFolder;
-
-    private CollationKey descriptionKey;
-
-    private CollationKey resourceNameKey;
-
-    private int line;
-    
-    private String locationString;
-
-    private long creationTime;
-
-    private String type;
-
-    private IMarker marker;
-
-    /**
-     * Cache for the marker ID.
-     */
-	private long id = -1L;
-
-	private MarkerNode markerCategory;
-
-	private String shortFolder;
-	
-	private Object group;
-
-	public ConcreteMarker(IMarker toCopy) {
-        marker = toCopy;
-        refresh();
-    }
-
-    /**
-     * Clears any cached information. This frees up some memory, but will slow down
-     * the next comparison operation. It is a good idea to call this on a set of markers
-     * after sorting them, in order to reduce their memory cost. 
-     */
-    public void clearCache() {
-        resourceNameKey = null;
-        descriptionKey = null;
-    }
-
-    /**
-     * Refresh the properties of this marker from the underlying IMarker instance
-     */
-    public void refresh() {
-        clearCache();
-
-        description = Util.getProperty(IMarker.MESSAGE, marker);
-        resourceName = Util.getResourceName(marker);
-        inFolder = Util.getContainerName(marker);
-        shortFolder = null;
-        line = marker.getAttribute(IMarker.LINE_NUMBER, -1);  
-        locationString = marker.getAttribute(IMarker.LOCATION,
-				Util.EMPTY_STRING);
-		
-        try {
-            creationTime = marker.getCreationTime();
-        } catch (CoreException e) {
-            creationTime = 0;
-        }
-
-        try {
-            type = marker.getType();
-        } catch (CoreException e1) {
-            type = Util.EMPTY_STRING; 
-        }
-        
-        // store the marker ID locally
-        id = marker.getId();
-    }
-
-    public IResource getResource() {
-        return marker.getResource();
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.MarkerNode#getDescription()
-     */
-    public String getDescription() {
-        return description;
-    }
-
-    public CollationKey getDescriptionKey() {
-        if (descriptionKey == null) {
-            descriptionKey = Collator.getInstance()
-                    .getCollationKey(description);
-        }
-
-        return descriptionKey;
-    }
-
-    public String getResourceName() {
-        return resourceName;
-    }
-
-    public CollationKey getResourceNameKey() {
-        if (resourceNameKey == null) {
-            resourceNameKey = Collator.getInstance().getCollationKey(
-                    resourceName);
-        }
-        return resourceNameKey;
-    }
-
-    public int getLine() {
-        return line;
-    }
-
-    public String getFolder() {
-        return inFolder;
-    }
-
-    public long getCreationTime() {
-        return creationTime;
-    }
-    
-    /**
-     * The underlying marker ID value.
-     * @return the marker's ID.
-     */
-    public long getId() {
-    	return id;
-    }
-
-    public IMarker getMarker() {
-        return marker;
-    }
-
-    public boolean equals(Object object) {
-        if (!(object instanceof ConcreteMarker)) {
-            return false;
-        }
-
-        ConcreteMarker other = (ConcreteMarker) object;
-
-        return other.getMarker().equals(getMarker());
-    }
-
-    public int hashCode() {
-        return getMarker().hashCode();
-    }
-
-	/**
-	 * Set the category the receiver is in.
-	 * @param category
-	 */
-	public void setCategory(MarkerNode category) {
-		markerCategory = category;
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerNode#getChildren()
-	 */
-	public MarkerNode[] getChildren() {
-		return Util.EMPTY_MARKER_ARRAY;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerNode#getParent()
-	 */
-	public MarkerNode getParent() {
-		return markerCategory;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerNode#isConcrete()
-	 */
-	public boolean isConcrete() {
-		return true;
-	}
-
-	/**
-	 * Return the short name for the folder.
-	 * @return String
-	 */
-	public String getShortFolder() {
-		if(shortFolder == null) {
-			shortFolder = Util.getShortContainerName(marker);
-		}
-		return shortFolder;
-	}
-
-
-	/**
-	 * Get the location string. If the {@link IMarker#LOCATION }
-	 * attribute was not set then return an empty String.
-	 * @return String
-	 */
-	public String getLocationString() {
-		return locationString;
-	}
-
-
-	/**
-	 * Get the group for the reciever.
-	 * @return Returns the group.
-	 */
-	public Object getGroup() {
-		return group;
-	}
-
-	/**
-	 * Set the group name.
-	 * @param group the group name
-	 */
-	public void setGroup(Object group) {
-		this.group = group;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerNode#getConcreteRepresentative()
-	 */
-	public ConcreteMarker getConcreteRepresentative() {
-		return this;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DefaultMarkerResourceAdapter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DefaultMarkerResourceAdapter.java
deleted file mode 100644
index f8fc41c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DefaultMarkerResourceAdapter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.ui.views.tasklist.ITaskListResourceAdapter;
-
-/**
- * The DefaultMarkerResourceAdapter is the default
- * implementation of the IMarkerResourceAdapter used by the
- * MarkerView for resource adaption.
- */
-class DefaultMarkerResourceAdapter implements ITaskListResourceAdapter {
-
-    private static ITaskListResourceAdapter singleton;
-
-    /**
-     * Constructor for DefaultMarkerResourceAdapter.
-     */
-    DefaultMarkerResourceAdapter() {
-        super();
-    }
-
-    /**
-     * Return the default instance used for MarkerView adapting.
-     */
-    static ITaskListResourceAdapter getDefault() {
-        if (singleton == null) {
-			singleton = new DefaultMarkerResourceAdapter();
-		}
-        return singleton;
-    }
-
-    /**
-     * @see IMarkerResourceAdapter#getAffectedResource(IAdaptable)
-     */
-    public IResource getAffectedResource(IAdaptable adaptable) {
-        IResource resource = (IResource) adaptable.getAdapter(IResource.class);
-
-        if (resource == null) {
-			return (IFile) adaptable.getAdapter(IFile.class);
-		} else {
-			return resource;
-		}
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogBookmarkFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogBookmarkFilter.java
deleted file mode 100644
index 4beed40..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogBookmarkFilter.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-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.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * DialogBookmarkFilter is the filter dialog for bookmarks
- * 
- */
-public class DialogBookmarkFilter extends DialogMarkerFilter {
-
-	private DescriptionGroup descriptionGroup;
-
-	private class DescriptionGroup {
-		private Label descriptionLabel;
-
-		private Combo combo;
-
-		private Text description;
-
-		private String contains = MarkerMessages.filtersDialog_contains;
-
-		private String doesNotContain = 
-			MarkerMessages.filtersDialog_doesNotContain;
-
-		/**
-		 * Create a description group.
-		 * 
-		 * @param parent
-		 */
-		public DescriptionGroup(Composite parent) {
-			descriptionLabel = new Label(parent, SWT.NONE);
-			descriptionLabel.setFont(parent.getFont());
-			descriptionLabel.setText(
-				MarkerMessages.filtersDialog_descriptionLabel);
-
-			combo = new Combo(parent, SWT.READ_ONLY);
-			combo.setFont(parent.getFont());
-			combo.add(contains);
-			combo.add(doesNotContain);
-			combo.addSelectionListener(new SelectionAdapter(){
-	        	/* (non-Javadoc)
-	        	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-	        	 */
-	        	public void widgetSelected(SelectionEvent e) {
-	        		  updateForSelection();
-	        	}
-	          });
-			// Prevent Esc and Return from closing the dialog when the combo is
-			// active.
-			combo.addTraverseListener(new TraverseListener() {
-				public void keyTraversed(TraverseEvent e) {
-					if (e.detail == SWT.TRAVERSE_ESCAPE
-							|| e.detail == SWT.TRAVERSE_RETURN) {
-						e.doit = false;
-					}
-				}
-			});
-
-			description = new Text(parent, SWT.SINGLE | SWT.BORDER);
-			description.setFont(parent.getFont());
-			GridData data = new GridData(GridData.FILL_HORIZONTAL);
-			data.horizontalSpan = 3;
-			description.setLayoutData(data);
-			description.addModifyListener(new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					DialogBookmarkFilter.this.markDirty();
-				}
-			});
-		}
-
-		public boolean getContains() {
-			return combo.getSelectionIndex() == combo.indexOf(contains);
-		}
-
-		public void setContains(boolean value) {
-			if (value) {
-				combo.select(combo.indexOf(contains));
-			} else {
-				combo.select(combo.indexOf(doesNotContain));
-			}
-		}
-
-		public void setDescription(String text) {
-			if (text == null) {
-				description.setText(""); //$NON-NLS-1$ 
-			} else {
-				description.setText(text);
-			}
-		}
-
-		public String getDescription() {
-			return description.getText();
-		}
-
-		/**
-		 * Update the enablement based on enabled.
-		 * @param enabled
-		 */
-		public void updateEnablement(boolean enabled) {
-			descriptionLabel.setEnabled(enabled);
-			combo.setEnabled(enabled);
-			description.setEnabled(enabled);
-		}
-	}
-
-	/**
-	 * @param parentShell
-	 * @param filters
-	 */
-	public DialogBookmarkFilter(Shell parentShell, BookmarkFilter[] filters) {
-		super(parentShell, filters);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#createAttributesArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createAttributesArea(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setFont(parent.getFont());
-		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		GridLayout layout = new GridLayout(5, false);
-		layout.verticalSpacing = 7;
-		composite.setLayout(layout);
-
-		descriptionGroup = new DescriptionGroup(composite);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#updateFilterFromUI(org.eclipse.ui.views.markers.internal.MarkerFilter)
-	 */
-	protected void updateFilterFromUI(MarkerFilter filter) {
-		super.updateFilterFromUI(filter);
-
-		BookmarkFilter bookmark = (BookmarkFilter) filter;
-		bookmark.setContains(descriptionGroup.getContains());
-		bookmark.setDescription(descriptionGroup.getDescription().trim());
-	
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#updateUIWithFilter(org.eclipse.ui.views.markers.internal.MarkerFilter)
-	 */
-	protected void updateUIWithFilter(MarkerFilter filter) {
-		super.updateUIWithFilter(filter);
-		BookmarkFilter bookmark = (BookmarkFilter) filter;
-		descriptionGroup.setContains(bookmark.getContains());
-		descriptionGroup.setDescription(bookmark.getDescription());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#updateEnabledState(boolean)
-	 */
-	protected void updateEnabledState(boolean enabled) {
-		super.updateEnabledState(enabled);
-		descriptionGroup.updateEnablement(enabled);
-	}
-	
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markerview.FiltersDialog#resetPressed()
-	 */
-	protected void resetPressed() {
-		descriptionGroup.setContains(BookmarkFilter.DEFAULT_CONTAINS);
-		descriptionGroup.setDescription(BookmarkFilter.DEFAULT_DESCRIPTION);
-
-		super.resetPressed();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#newFilter(java.lang.String)
-	 */
-	protected MarkerFilter newFilter(String newName) {
-
-		return new BookmarkFilter(newName);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogMarkerFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogMarkerFilter.java
deleted file mode 100644
index 1d5eb67..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogMarkerFilter.java
+++ /dev/null
@@ -1,1509 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.dialogs.TrayDialog;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ColumnWeightData;
-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.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-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.Combo;
-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.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
-
-/**
- * Dialog which allows user to modify all settings of an
- * org.eclipse.ui.views.MarkerFilter object. Not intended to be subclassed or
- * instantiated by clients.
- */
-public abstract class DialogMarkerFilter extends TrayDialog {
-
-	static final int SELECT_ALL_FILTERS_ID = IDialogConstants.CLIENT_ID + 4;
-
-	static final int DESELECT_ALL_FILTERS_ID = IDialogConstants.CLIENT_ID + 5;
-
-	/**
-	 * button IDs
-	 */
-	static final int RESET_ID = IDialogConstants.CLIENT_ID;
-
-	static final int SELECT_WORKING_SET_ID = IDialogConstants.CLIENT_ID + 1;
-
-	static final int SELECT_ALL_ID = IDialogConstants.CLIENT_ID + 2;
-
-	static final int DESELECT_ALL_ID = IDialogConstants.CLIENT_ID + 3;
-
-	private class TypesLabelProvider 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) {
-			return ((AbstractNode) element).getName();
-		}
-	}
-
-	/**
-	 * Creates and manages a group of widgets for selecting a working set marker
-	 * filter.
-	 */
-	private class WorkingSetGroup {
-
-		private Button button;
-
-		private Button selectButton;
-
-		/**
-		 * Creates the working set filter selection widgets.
-		 * 
-		 * @param parent
-		 *            the parent composite of the working set widgets
-		 */
-		WorkingSetGroup(Composite parent) {
-			// radio button has to be part of main radio button group
-			button = createRadioButton(parent,
-					MarkerMessages.filtersDialog_noWorkingSet);
-			GridData data = new GridData(GridData.FILL_HORIZONTAL);
-			button.setLayoutData(data);
-
-			Composite composite = new Composite(parent, SWT.NONE);
-			composite.setFont(parent.getFont());
-			GridLayout layout = new GridLayout();
-			Button radio = new Button(parent, SWT.RADIO);
-			layout.marginWidth = radio.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
-			layout.marginHeight = 0;
-			radio.dispose();
-			composite.setLayout(layout);
-			selectButton = createButton(composite, SELECT_WORKING_SET_ID,
-					MarkerMessages.filtersDialog_workingSetSelect, false);
-		}
-
-		/**
-		 * Returns wether or not a working set filter should be used
-		 * 
-		 * @return true=a working set filter should be used false=a working set
-		 *         filter should not be used
-		 */
-		boolean getSelection() {
-			return button.getSelection();
-		}
-
-		/**
-		 * Returns the selected working set filter or null if none is selected.
-		 * 
-		 * @return the selected working set filter or null if none is selected.
-		 */
-		IWorkingSet getWorkingSet() {
-			return (IWorkingSet) button.getData();
-		}
-
-		/**
-		 * Sets the working set filter selection.
-		 * 
-		 * @param selected
-		 *            true=a working set filter should be used false=no working
-		 *            set filter should be used
-		 */
-		void setSelection(boolean selected) {
-			button.setSelection(selected);
-			if (selected) {
-				anyResourceButton.setSelection(false);
-				anyResourceInSameProjectButton.setSelection(false);
-				selectedResourceButton.setSelection(false);
-				selectedResourceAndChildrenButton.setSelection(false);
-			}
-		}
-
-		/**
-		 * Opens the working set selection dialog.
-		 */
-		void selectPressed() {
-			IWorkingSetSelectionDialog dialog = PlatformUI.getWorkbench()
-					.getWorkingSetManager().createWorkingSetSelectionDialog(
-							getShell(), false);
-			IWorkingSet workingSet = getWorkingSet();
-
-			if (workingSet != null) {
-				dialog.setSelection(new IWorkingSet[] { workingSet });
-			}
-			if (dialog.open() == Window.OK) {
-				markDirty();
-				IWorkingSet[] result = dialog.getSelection();
-				if (result != null && result.length > 0) {
-					setWorkingSet(result[0]);
-				} else {
-					setWorkingSet(null);
-				}
-				if (getSelection() == false) {
-					setSelection(true);
-				}
-			}
-		}
-
-		/**
-		 * Sets the specified working set.
-		 * 
-		 * @param workingSet
-		 *            the working set
-		 */
-		void setWorkingSet(IWorkingSet workingSet) {
-			button.setData(workingSet);
-			if (workingSet != null) {
-				button.setText(NLS.bind(
-						MarkerMessages.filtersDialog_workingSet, workingSet
-								.getLabel()));
-			} else {
-				button.setText(MarkerMessages.filtersDialog_noWorkingSet);
-			}
-		}
-
-		void setEnabled(boolean enabled) {
-			button.setEnabled(enabled);
-			selectButton.setEnabled(enabled);
-		}
-	}
-
-	/**
-	 * AbstractNode is the abstract superclass of the node elements for
-	 * MarkerTypes.
-	 * 
-	 */
-	private abstract class AbstractNode {
-
-		/**
-		 * Get the parent element of the receiver.
-		 * 
-		 * @return Object
-		 */
-		public abstract Object getParent();
-
-		/**
-		 * Get the name of the receiver.
-		 * 
-		 * @return String
-		 */
-		public abstract String getName();
-
-		/**
-		 * Return whether or not the receiver has children.
-		 * 
-		 * @return boolean
-		 */
-		public abstract boolean hasChildren();
-
-		/**
-		 * Get the children of the receiver.
-		 * 
-		 * @return Object[]
-		 */
-		public abstract Object[] getChildren();
-
-		/**
-		 * Return whether or not this is a category node.
-		 * 
-		 * @return boolean
-		 */
-		public abstract boolean isCategory();
-
-	}
-
-	/**
-	 * MarkerTypeNode is the wrapper for marker types.
-	 * 
-	 */
-	private class MarkerTypeNode extends AbstractNode {
-
-		MarkerType type;
-
-		MarkerCategory category;
-
-		/**
-		 * Create an instance of the receiver wrapping markerType.
-		 * 
-		 * @param markerType
-		 */
-		public MarkerTypeNode(MarkerType markerType) {
-			type = markerType;
-			nodeToTypeMapping.put(markerType.getId(), this);
-		}
-
-		/**
-		 * Set the category of the receiver.
-		 * 
-		 * @param category
-		 */
-		public void setCategory(MarkerCategory category) {
-			this.category = category;
-		}
-
-		/**
-		 * Get the category for the receiver.
-		 * 
-		 * @return MarkerCategory
-		 */
-		public MarkerCategory getCategory() {
-			return category;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter.AbstractNode#getChildren()
-		 */
-		public Object[] getChildren() {
-			return new Object[0];
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter.AbstractNode#getParent()
-		 */
-		public Object getParent() {
-			return category;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter.AbstractNode#hasChildren()
-		 */
-		public boolean hasChildren() {
-			return false;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter.AbstractNode#getName()
-		 */
-		public String getName() {
-			return type.getLabel();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter.AbstractNode#isCategory()
-		 */
-		public boolean isCategory() {
-			return false;
-		}
-
-		/**
-		 * Return the marker type this is wrapping
-		 * 
-		 * @return Object
-		 */
-		public Object getMarkerType() {
-			return type;
-		}
-	}
-
-	/**
-	 * The MarkerCategory is a data type to represent the categories in the tree
-	 * view.
-	 * 
-	 */
-	private class MarkerCategory extends AbstractNode {
-
-		String name;
-
-		Collection types = new ArrayList();
-
-		/**
-		 * Create a new instance of the receiver with name categoryName.
-		 * 
-		 * @param categoryName
-		 */
-		public MarkerCategory(String categoryName) {
-			name = categoryName;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter.AbstractNode#getName()
-		 */
-		public String getName() {
-			return name;
-		}
-
-		/**
-		 * Add markerType to the list of types.
-		 * 
-		 * @param markerType
-		 */
-		public void add(MarkerTypeNode markerType) {
-			types.add(markerType);
-			markerType.setCategory(this);
-		}
-
-		/**
-		 * Return the marker types contained in the receiver.
-		 * 
-		 * @return Object[]
-		 */
-		public Object[] getMarkerTypes() {
-			return types.toArray();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter.AbstractNode#getChildren()
-		 */
-		public Object[] getChildren() {
-			return getMarkerTypes();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter.AbstractNode#getParent()
-		 */
-		public Object getParent() {
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter.AbstractNode#hasChildren()
-		 */
-		public boolean hasChildren() {
-			return true;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter.AbstractNode#isCategory()
-		 */
-		public boolean isCategory() {
-			return true;
-		}
-
-	}
-
-	private MarkerFilter[] filters;
-
-	private CheckboxTreeViewer typesViewer;
-
-	private Button anyResourceButton;
-
-	private Button anyResourceInSameProjectButton;
-
-	private Button selectedResourceButton;
-
-	private Button selectedResourceAndChildrenButton;
-
-	private Button selectAllButton;
-
-	private Button deselectAllButton;
-
-	private WorkingSetGroup workingSetGroup;
-
-	private boolean dirty = false;
-
-	private CheckboxTableViewer filtersList;
-
-	private MarkerFilter[] selectedFilters;
-
-	private HashMap nodeToTypeMapping = new HashMap();
-
-	private ITreeContentProvider typesContentProvider;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param parentShell
-	 * @param filtersList
-	 */
-	DialogMarkerFilter(Shell parentShell, MarkerFilter[] filtersList) {
-		super(parentShell);
-		setFilters(filtersList);
-	}
-
-	/**
-	 * Set the filters in the filtersList by copying them.
-	 * 
-	 * @param initialFilters
-	 */
-	private void setFilters(MarkerFilter[] initialFilters) {
-		MarkerFilter[] newMarkers = new MarkerFilter[initialFilters.length];
-		for (int i = 0; i < initialFilters.length; i++) {
-			MarkerFilter newFilter;
-			try {
-				newFilter = initialFilters[i].makeClone();
-			} catch (CloneNotSupportedException exception) {
-				ErrorDialog.openError(getShell(),
-						MarkerMessages.MarkerFilterDialog_errorTitle,
-						MarkerMessages.MarkerFilterDialog_failedFilterMessage,
-						Util.errorStatus(exception));
-				return;
-			}
-
-			newMarkers[i] = newFilter;
-
-		}
-		filters = newMarkers;
-
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected void buttonPressed(int buttonId) {
-
-		switch (buttonId) {
-		case RESET_ID:
-			resetPressed();
-			markDirty();
-			break;
-		case SELECT_WORKING_SET_ID:
-			workingSetGroup.selectPressed();
-			break;
-		case SELECT_ALL_ID:
-			setAllTypesChecked(true);
-			break;
-		case DESELECT_ALL_ID:
-			setAllTypesChecked(false);
-			break;
-		case SELECT_ALL_FILTERS_ID:
-			filtersList.setAllChecked(true);
-			break;
-		case DESELECT_ALL_FILTERS_ID:
-			filtersList.setAllChecked(false);
-			break;
-		default:
-			break;
-		}
-		super.buttonPressed(buttonId);
-	}
-
-	/**
-	 * Set the check state of all of the items to checked.
-	 * @param checked
-	 * @since 3.4
-	 */
-	private void setAllTypesChecked(boolean checked) {
-		TreeItem[] items = typesViewer.getTree().getItems();
-		for (int i = 0; i < items.length; i++) {
-			Object element = items[i].getData();
-			typesViewer.setSubtreeChecked(element, checked);
-		}
-		
-	}
-
-	/**
-	 * Method declared on Window.
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(MarkerMessages.filtersDialog_title);
-	}
-
-	protected void createResetArea(Composite parent) {
-
-		Button reset = new Button(parent, SWT.PUSH);
-		reset.setText(MarkerMessages.restoreDefaults_text);
-		reset.setData(new Integer(RESET_ID));
-
-		reset.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				buttonPressed(((Integer) event.widget.getData()).intValue());
-			}
-		});
-
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-		Point minSize = reset.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-		data.widthHint = Math.max(widthHint, minSize.x);
-		data.horizontalSpan = 2;
-		reset.setLayoutData(data);
-	}
-
-	/**
-	 * Creates a check box button with the given parent and text.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the check box
-	 * @param grabRow
-	 *            <code>true</code>to grab the remaining horizontal space,
-	 *            <code>false</code> otherwise
-	 * @return the check box button
-	 */
-	protected Button createCheckbox(Composite parent, String text,
-			boolean grabRow) {
-		Button button = new Button(parent, SWT.CHECK);
-		if (grabRow) {
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-			button.setLayoutData(gridData);
-		}
-		button.setText(text);
-		button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateForSelection();
-			}
-		});
-		button.setFont(parent.getFont());
-		return button;
-	}
-
-	/**
-	 * Creates a combo box with the given parent, items, and selection
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param items
-	 *            the items for the combo box
-	 * @param selectionIndex
-	 *            the index of the item to select
-	 * @return the combo box
-	 */
-	protected Combo createCombo(Composite parent, String[] items,
-			int selectionIndex) {
-		Combo combo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
-		combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		combo.setFont(parent.getFont());
-		combo.setItems(items);
-		combo.select(selectionIndex);
-		combo.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateForSelection();
-			}
-		});
-		return combo;
-	}
-
-	/**
-	 * Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite dialogArea = (Composite) super.createDialogArea(parent);
-
-		dialogArea.setLayout(new GridLayout(2, false));
-
-		createFiltersArea(dialogArea);
-
-		Composite selectedComposite = createSelectedFilterArea(dialogArea);
-		selectedComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
-				true));
-		updateUIFromFilter();
-
-		filtersList.setSelection(new StructuredSelection(filters[0]));
-
-		createResetArea(dialogArea);
-		createSeparatorLine(dialogArea);
-
-		applyDialogFont(dialogArea);
-		return dialogArea;
-	}
-
-	/**
-	 * Create the list in the receiver.
-	 * 
-	 * @param dialogArea
-	 */
-	/**
-	 * @param dialogArea
-	 */
-	void createFiltersArea(Composite dialogArea) {
-
-		Composite listArea = new Composite(dialogArea, SWT.NONE);
-		listArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		listArea.setLayout(new GridLayout());
-
-		createUserFiltersArea(listArea);
-		createFilterSelectButtons(listArea);
-	}
-
-	/**
-	 * Create the area for the user to select thier filters.
-	 * 
-	 * @param listArea
-	 */
-	void createUserFiltersArea(Composite listArea) {
-
-		Composite userComposite = new Composite(listArea, SWT.NONE);
-		userComposite.setLayout(new GridLayout(2, false));
-		userComposite
-				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
-		Label title = new Label(userComposite, SWT.NONE);
-		title.setText(MarkerMessages.MarkerFilter_filtersTitle);
-		GridData titleData = new GridData();
-		titleData.horizontalSpan = 2;
-		title.setLayoutData(titleData);
-
-		filtersList = CheckboxTableViewer.newCheckList(userComposite,
-				SWT.BORDER);
-		filtersList.setContentProvider(new IStructuredContentProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				return filters;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-				// Do nothing
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-				// Do nothing
-			}
-		});
-
-		filtersList.setLabelProvider(new LabelProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-			 */
-			public String getText(Object element) {
-				return ((MarkerFilter) element).getName();
-			}
-		});
-
-		selectedFilters = new MarkerFilter[] { filters[0] };
-		filtersList.setSelection(new StructuredSelection(selectedFilters));
-
-		filtersList
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-					 */
-					public void selectionChanged(SelectionChangedEvent event) {
-						updateFilterFromUI();
-						setSelectedFilter(event);
-
-					}
-				});
-
-		filtersList.setInput(this);
-		for (int i = 0; i < filters.length; i++) {
-			filtersList.setChecked(filters[i], filters[i].isEnabled());
-		}
-
-		GridData listData = new GridData(SWT.FILL, SWT.FILL, true, true);
-		listData.widthHint = convertHorizontalDLUsToPixels(100);
-		filtersList.getControl().setLayoutData(listData);
-
-		Composite buttons = new Composite(userComposite, SWT.NONE);
-		GridLayout buttonLayout = new GridLayout();
-		buttonLayout.marginWidth = 0;
-		buttons.setLayout(buttonLayout);
-		GridData buttonsData = new GridData();
-		buttonsData.verticalAlignment = GridData.BEGINNING;
-		buttons.setLayoutData(buttonsData);
-
-		Button addNew = new Button(buttons, SWT.PUSH);
-		addNew.setText(MarkerMessages.MarkerFilter_addFilterName);
-		addNew.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				InputDialog newDialog = new InputDialog(getShell(),
-						MarkerMessages.MarkerFilterDialog_title,
-						MarkerMessages.MarkerFilterDialog_message,
-						MarkerMessages.MarkerFilter_newFilterName,
-						new IInputValidator() {
-							/*
-							 * (non-Javadoc)
-							 * 
-							 * @see org.eclipse.jface.dialogs.IInputValidator#isValid(java.lang.String)
-							 */
-							public String isValid(String newText) {
-								if (newText.length() == 0)
-									return MarkerMessages.MarkerFilterDialog_emptyMessage;
-								for (int i = 0; i < filters.length; i++) {
-									if (filters[i].getName().equals(newText))
-										return NLS
-												.bind(
-														MarkerMessages.filtersDialog_conflictingName,
-														newText);
-
-								}
-								return null;
-							}
-						});
-				newDialog.open();
-				String newName = newDialog.getValue();
-				if (newName != null) {
-					createNewFilter(newName);
-				}
-			}
-		});
-		setButtonLayoutData(addNew);
-
-		Button remove = new Button(buttons, SWT.PUSH);
-		remove.setText(MarkerMessages.MarkerFilter_deleteSelectedName);
-		remove.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				removeFilters(filtersList.getSelection());
-			}
-		});
-		setButtonLayoutData(remove);
-	}
-
-	/**
-	 * Set the selected filter from event.
-	 * 
-	 * @param event
-	 */
-	protected void setSelectedFilter(SelectionChangedEvent event) {
-
-		ISelection selection = event.getSelection();
-		if (selection instanceof IStructuredSelection) {
-			Collection list = ((IStructuredSelection) selection).toList();
-			MarkerFilter[] selected = new MarkerFilter[list.size()];
-			list.toArray(selected);
-			selectedFilters = selected;
-
-		} else {
-			selectedFilters = new MarkerFilter[0];
-		}
-		updateUIFromFilter();
-
-	}
-
-	/**
-	 * Remove the filters in selection.
-	 * 
-	 * @param selection
-	 */
-	protected void removeFilters(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			List toRemove = ((IStructuredSelection) selection).toList();
-			MarkerFilter[] newFilters = new MarkerFilter[filters.length
-					- toRemove.size()];
-			int index = 0;
-			for (int i = 0; i < filters.length; i++) {
-				if (toRemove.contains(filters[i])) {
-					continue;
-				}
-				newFilters[index] = filters[i];
-				index++;
-			}
-
-			filters = newFilters;
-			filtersList.refresh();
-			updateUIFromFilter();
-		}
-	}
-
-	/**
-	 * Create a new filter called newName.
-	 * 
-	 * @param newName
-	 */
-	private void createNewFilter(String newName) {
-		MarkerFilter[] newFilters = new MarkerFilter[filters.length + 1];
-		System.arraycopy(filters, 0, newFilters, 0, filters.length);
-		MarkerFilter filter = newFilter(newName);
-		newFilters[filters.length] = filter;
-		filters = newFilters;
-		filtersList.refresh();
-		filtersList.setSelection(new StructuredSelection(filter), true);
-		filtersList.getControl().setFocus();
-	}
-
-	/**
-	 * Crate a newFilter called newName
-	 * 
-	 * @param newName
-	 * @return MarkerFilter
-	 */
-	protected abstract MarkerFilter newFilter(String newName);
-
-	/**
-	 * Create the area for the selected filter.
-	 * 
-	 * @param composite
-	 */
-	Composite createSelectedFilterArea(Composite composite) {
-
-		Composite selectedComposite = new Composite(composite, SWT.NONE);
-		selectedComposite.setLayout(new GridLayout(2, false));
-
-		Composite leftComposite = new Composite(selectedComposite, SWT.NONE);
-		leftComposite.setLayout(new GridLayout());
-		leftComposite
-				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		createResourceArea(leftComposite);
-		createAttributesArea(leftComposite);
-
-		Composite rightComposite = new Composite(selectedComposite, SWT.NONE);
-		createTypesArea(rightComposite);
-		rightComposite.setLayout(new GridLayout());
-		rightComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
-				true));
-
-		return selectedComposite;
-	}
-
-	/**
-	 * Creates a separator line above the OK/Cancel buttons bar
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 */
-	protected void createSeparatorLine(Composite parent) {
-		// Build the separator line
-		Label separator = new Label(parent, SWT.HORIZONTAL | SWT.SEPARATOR);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		separator.setLayoutData(gd);
-	}
-
-	/**
-	 * Creates a radio button with the given parent and text.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the check box
-	 * @return the radio box button
-	 */
-	protected Button createRadioButton(Composite parent, String text) {
-		Button button = new Button(parent, SWT.RADIO);
-		button.setText(text);
-		button.setFont(parent.getFont());
-		button.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				updateForSelection();
-			}
-		});
-		return button;
-	}
-
-	/**
-	 * Creates the area showing which resources should be considered.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 */
-	protected void createResourceArea(Composite parent) {
-		Composite group = new Composite(parent, SWT.NONE);
-		group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		group.setLayout(new GridLayout());
-		group.setFont(parent.getFont());
-		anyResourceButton = createRadioButton(group,
-				MarkerMessages.filtersDialog_anyResource);
-		anyResourceInSameProjectButton = createRadioButton(group,
-				MarkerMessages.filtersDialog_anyResourceInSameProject); // added
-		// by
-		// cagatayk@acm.org
-		selectedResourceButton = createRadioButton(group,
-				MarkerMessages.filtersDialog_selectedResource);
-		selectedResourceAndChildrenButton = createRadioButton(group,
-				MarkerMessages.filtersDialog_selectedAndChildren);
-		workingSetGroup = new WorkingSetGroup(group);
-	}
-
-	/**
-	 * Creates the area showing which marker types should be included.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 */
-	protected void createTypesArea(Composite parent) {
-
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		GridLayout layout = new GridLayout();
-		composite.setLayout(layout);
-
-		Label label = new Label(composite, SWT.NONE);
-		label.setText(MarkerMessages.filtersDialog_showItemsOfType);
-
-		Tree tree = new Tree(composite, SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
-		tree.setLinesVisible(true);
-		tree.setHeaderVisible(false);
-		TableLayout tableLayout = new TableLayout();
-		tree.setLayout(tableLayout);
-		tableLayout.addColumnData(new ColumnWeightData(100, true));
-		new TreeColumn(tree, SWT.NONE, 0);
-
-		typesViewer = new CheckboxTreeViewer(tree);
-		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
-		gridData.widthHint = convertVerticalDLUsToPixels(100);
-		gridData.heightHint = convertVerticalDLUsToPixels(125);
-
-		typesContentProvider = getTypesContentProvider();
-		typesViewer.getControl().setLayoutData(gridData);
-		typesViewer.setContentProvider(typesContentProvider);
-		typesViewer.setLabelProvider(getLabelProvider());
-		typesViewer.setComparator(getComparator());
-		typesViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				markDirty();
-				Object element = event.getElement();
-				boolean checked = event.getChecked();
-				setChildrenChecked(element, checked);
-				setParentCheckState(element, checked);
-			}
-		});
-		typesViewer.setInput(getSelectedFilter().getRootTypes().toArray());
-
-		Composite buttonComposite = new Composite(composite, SWT.NONE);
-		GridLayout buttonLayout = new GridLayout();
-		buttonLayout.marginWidth = 0;
-		buttonComposite.setLayout(buttonLayout);
-		selectAllButton = createButton(buttonComposite, SELECT_ALL_ID,
-				MarkerMessages.filtersDialog_selectAllTypes, false);
-		deselectAllButton = createButton(buttonComposite, DESELECT_ALL_ID,
-				MarkerMessages.filtersDialog_deselectAllTypes, false);
-	}
-
-	/**
-	 * Get the currently selected marker filter if there is only one selection.
-	 * 
-	 * @return MarkerFilter or <code>null</code>.
-	 */
-	protected MarkerFilter getSelectedFilter() {
-
-		if (selectedFilters.length == 1) {
-			return selectedFilters[0];
-		}
-		return null;
-	}
-
-	/**
-	 * Get the content provider for the receiver.
-	 * 
-	 * @return ITreeContentProvider
-	 */
-	private ITreeContentProvider getTypesContentProvider() {
-		return new ITreeContentProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				MarkerFilter selected = getSelectedFilter();
-				if (selected == null) {
-					return new Object[0];
-				}
-
-				return getRootEntries(selected);
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-			 */
-			public Object[] getChildren(Object parentElement) {
-				return ((AbstractNode) parentElement).getChildren();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-			 */
-			public Object getParent(Object element) {
-				return ((AbstractNode) element).getParent();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-			 */
-			public boolean hasChildren(Object element) {
-				return ((AbstractNode) element).hasChildren();
-			}
-		};
-	}
-
-	/**
-	 * This method is intended to be overridden by subclasses of FiltersDialog.
-	 * The attributes area will be created just above the Restore Defaults
-	 * button.
-	 * 
-	 * @param parent
-	 *            the parent Composite
-	 */
-	abstract void createAttributesArea(Composite parent);
-
-	private ILabelProvider getLabelProvider() {
-		return new TypesLabelProvider();
-	}
-
-	/**
-	 * Returns the selected marker types.
-	 * 
-	 * @return List the selected marker types
-	 */
-	protected List getSelectedTypes() {
-		Object[] checkElements = typesViewer.getCheckedElements();
-		List selected = new ArrayList();
-		for (int i = 0; i < checkElements.length; i++) {
-			AbstractNode node = (AbstractNode) checkElements[i];
-			if (!node.isCategory()) {
-				selected.add(((MarkerTypeNode) node).getMarkerType());
-			}
-
-		}
-		return selected;
-	}
-
-	/**
-	 * Return the sorter for the receiver.
-	 * 
-	 * @return ViewerSorter
-	 */
-	protected ViewerComparator getComparator() {
-		return new ViewerComparator() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public int compare(Viewer viewer, Object e1, Object e2) {
-				return getComparator().compare(((AbstractNode) e1).getName(),
-						((AbstractNode) e2).getName());
-			}
-		};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		/**
-		 * Updates the filter from the UI state. Must be done here rather than
-		 * by extending open() because after super.open() is called, the
-		 * widgetry is disposed.
-		 */
-		updateFilterFromUI();
-
-		for (int i = 0; i < filters.length; i++) {
-			filters[i].setEnabled(filtersList.getChecked(filters[i]));
-
-		}
-		super.okPressed();
-	}
-
-	/**
-	 * Handles a press of the Reset button. Updates the UI state to correspond
-	 * to a reset filter, but doesn't actually reset our filter.
-	 */
-	protected void resetPressed() {
-		setAllTypesChecked(true);
-		int onResource = MarkerFilter.DEFAULT_ON_RESOURCE;
-		anyResourceButton.setSelection(onResource == MarkerFilter.ON_ANY);
-		anyResourceInSameProjectButton
-				.setSelection(onResource == MarkerFilter.ON_ANY_IN_SAME_CONTAINER);
-		selectedResourceButton
-				.setSelection(onResource == MarkerFilter.ON_SELECTED_ONLY);
-		selectedResourceAndChildrenButton
-				.setSelection(onResource == MarkerFilter.ON_SELECTED_AND_CHILDREN);
-		workingSetGroup.setSelection(onResource == MarkerFilter.ON_WORKING_SET);
-		updateEnabledState(true);
-	}
-
-	/**
-	 * Sets the selected marker types.
-	 * 
-	 * @param markerTypes
-	 */
-	void setSelectedTypes(List markerTypes) {
-		typesViewer.setCheckedElements(new Object[0]);
-		for (int i = 0; i < markerTypes.size(); i++) {
-			Object obj = markerTypes.get(i);
-			if (obj instanceof MarkerType) {
-
-				Object mapping = nodeToTypeMapping.get(((MarkerType) obj)
-						.getId());
-				if (mapping != null) {
-					typesViewer.setChecked(mapping, true);
-					setParentCheckState(mapping, true);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Updates the enabled state of the widgetry based on whether or not it is
-	 * enabled.
-	 */
-	protected void updateEnabledState(boolean enabled) {
-
-		typesViewer.getTree().setEnabled(enabled);
-		selectAllButton.setEnabled(enabled
-				&& typesViewer.getTree().getItemCount() > 0);
-		deselectAllButton.setEnabled(enabled
-				&& typesViewer.getTree().getItemCount() > 0);
-
-		anyResourceButton.setEnabled(enabled);
-		anyResourceInSameProjectButton.setEnabled(enabled);
-		selectedResourceButton.setEnabled(enabled);
-		selectedResourceAndChildrenButton.setEnabled(enabled);
-		workingSetGroup.setEnabled(enabled);
-	}
-
-	/**
-	 * Updates the given filter from the UI state.
-	 */
-	protected final void updateFilterFromUI() {
-
-		MarkerFilter filter = getSelectedFilter();
-
-		if (filter == null) {
-			updateEnabledState(false);
-			return;
-		}
-
-		updateFilterFromUI(filter);
-	}
-
-	/**
-	 * Update the selected filter from the UI.
-	 * 
-	 * @param filter
-	 */
-	protected void updateFilterFromUI(MarkerFilter filter) {
-
-		filter.setSelectedTypes(getSelectedTypes());
-
-		if (selectedResourceButton.getSelection()) {
-			filter.setOnResource(MarkerFilter.ON_SELECTED_ONLY);
-		} else if (selectedResourceAndChildrenButton.getSelection()) {
-			filter.setOnResource(MarkerFilter.ON_SELECTED_AND_CHILDREN);
-		} else if (anyResourceInSameProjectButton.getSelection()) {
-			filter.setOnResource(MarkerFilter.ON_ANY_IN_SAME_CONTAINER);
-		} else if (workingSetGroup.getSelection()) {
-			filter.setOnResource(MarkerFilter.ON_WORKING_SET);
-		} else {
-			filter.setOnResource(MarkerFilter.ON_ANY);
-		}
-
-		filter.setWorkingSet(workingSetGroup.getWorkingSet());
-	}
-
-	/**
-	 * Updates the UI state from the given filter.
-	 */
-	protected final void updateUIFromFilter() {
-
-		MarkerFilter filter = getSelectedFilter();
-
-		if (filter == null) {
-			updateEnabledState(false);
-			return;
-		}
-
-		updateUIWithFilter(filter);
-	}
-
-	/**
-	 * Update the UI with the contents of filter.
-	 * 
-	 * @param filter
-	 */
-	protected void updateUIWithFilter(MarkerFilter filter) {
-		setSelectedTypes(filter.getSelectedTypes());
-
-		int on = filter.getOnResource();
-		anyResourceButton.setSelection(on == MarkerFilter.ON_ANY);
-		anyResourceInSameProjectButton
-				.setSelection(on == MarkerFilter.ON_ANY_IN_SAME_CONTAINER);
-		selectedResourceButton
-				.setSelection(on == MarkerFilter.ON_SELECTED_ONLY);
-		selectedResourceAndChildrenButton
-				.setSelection(on == MarkerFilter.ON_SELECTED_AND_CHILDREN);
-		workingSetGroup.setSelection(on == MarkerFilter.ON_WORKING_SET);
-		workingSetGroup.setWorkingSet(filter.getWorkingSet());
-
-		updateEnabledState(true);
-	}
-
-	/**
-	 * @return <code>true</code> if the dirty flag has been set otherwise
-	 *         <code>false</code>.
-	 */
-	boolean isDirty() {
-		return dirty;
-	}
-
-	/**
-	 * Marks the dialog as dirty.
-	 */
-	void markDirty() {
-		dirty = true;
-	}
-
-	/**
-	 * Set the marker filter.
-	 * 
-	 * @param newFilter
-	 */
-	public void setFilter(MarkerFilter newFilter) {
-		setFilters(new MarkerFilter[] { newFilter });
-		updateUIFromFilter();
-	}
-
-	/**
-	 * @return the MarkerFilters associated with the dialog.
-	 */
-	public MarkerFilter[] getFilters() {
-		return filters;
-	}
-
-	/**
-	 * A selection has occured on one of the checkboxes or combos. Update.
-	 * 
-	 */
-	protected void updateForSelection() {
-		updateEnabledState(true);
-		markDirty();
-	}
-
-	/**
-	 * Get all of the marker types avilable for the filter
-	 * 
-	 * @param selected
-	 * @return Object[]
-	 */
-	Object[] getRootEntries(MarkerFilter selected) {
-
-		List roots = selected.getRootTypes();
-		List markerNodes = new ArrayList();
-		HashMap categories = new HashMap();
-		for (int i = 0; i < roots.size(); i++) {
-			Object obj = roots.get(i);
-			buildTypeTree(markerNodes, obj, categories);
-		}
-		return markerNodes.toArray();
-	}
-
-	/**
-	 * Build the list of types and categories from the supplied object
-	 * 
-	 * @param elements
-	 * @param obj
-	 * @param categories
-	 */
-	private void buildTypeTree(List elements, Object obj, HashMap categories) {
-		if (obj instanceof MarkerType) {
-
-			MarkerType markerType = (MarkerType) obj;
-
-			String categoryName = MarkerSupportRegistry.getInstance()
-					.getCategory(markerType.getId());
-
-			if (categoryName == null) {
-				elements.add(new MarkerTypeNode(markerType));
-			} else {
-				MarkerCategory category;
-				if (categories.containsKey(categoryName)) {
-					category = (MarkerCategory) categories.get(categoryName);
-				} else {
-					category = new MarkerCategory(categoryName);
-					categories.put(categoryName, category);
-					elements.add(category);
-				}
-				MarkerTypeNode node = new MarkerTypeNode(markerType);
-				category.add(node);
-			}
-
-			MarkerType[] subTypes = ((MarkerType) obj).getSubtypes();
-			for (int j = 0; j < subTypes.length; j++) {
-				buildTypeTree(elements, subTypes[j], categories);
-			}
-		}
-	}
-
-	/**
-	 * Grey check the parent if required
-	 * 
-	 * @param element
-	 * @param checked
-	 */
-	private void setParentCheckState(Object element, boolean checked) {
-		Object parent = typesContentProvider.getParent(element);
-		if (parent == null) {
-			return;
-		}
-		Object[] children = typesContentProvider.getChildren(parent);
-		if (children.length == 0) {
-			return;
-		}
-		if (checked) {// at least one is checked
-			for (int i = 0; i < children.length; i++) {
-				Object object = children[i];
-				if (!typesViewer.getChecked(object)) {
-					typesViewer.setGrayChecked(parent, true);
-					return;
-				}
-			}
-			// All checked - check the parent
-			typesViewer.setChecked(parent, true);
-		} else {
-			for (int i = 0; i < children.length; i++) {
-				Object object = children[i];
-				if (typesViewer.getChecked(object)) {
-					typesViewer.setGrayChecked(parent, true);
-					return;
-				}
-			}
-			// All checked - check the parent
-			typesViewer.setChecked(parent, false);
-		}
-
-	}
-
-	/**
-	 * Set the check state of the children of element to checked.
-	 * 
-	 * @param element
-	 * @param checked
-	 */
-	private void setChildrenChecked(Object element, boolean checked) {
-		Object[] children = typesContentProvider.getChildren(element);
-		if (children.length > 0) {
-			for (int i = 0; i < children.length; i++) {
-				typesViewer.setChecked(children[i], checked);
-			}
-		}
-	}
-
-	/**
-	 * Create the buttons for selecting the filters.
-	 * 
-	 * @param listArea
-	 */
-	protected void createFilterSelectButtons(Composite listArea) {
-		Composite buttons = new Composite(listArea, SWT.NONE);
-		GridLayout buttonLayout = new GridLayout(2, false);
-		buttonLayout.marginWidth = 0;
-		buttons.setLayout(buttonLayout);
-
-		createButton(buttons, SELECT_ALL_FILTERS_ID,
-				MarkerMessages.filtersDialog_selectAll, false);
-		createButton(buttons, DESELECT_ALL_FILTERS_ID,
-				MarkerMessages.filtersDialog_deselectAll, false);
-	}
-	
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#isResizable()
-     */
-    protected boolean isResizable() {
-    	return true;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogMarkerProperties.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogMarkerProperties.java
deleted file mode 100644
index 7b13317..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogMarkerProperties.java
+++ /dev/null
@@ -1,644 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - bug 77332 - [Markers] Add task dialog improvements
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IMarker;
-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.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.TrayDialog;
-import org.eclipse.osgi.util.NLS;
-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.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.CreateMarkersOperation;
-import org.eclipse.ui.ide.undo.UpdateMarkersOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * Shows the properties of a new or existing marker
- * 
- * In 3.3, this class was refactored to allow pre-existing public dialog classes
- * to share the implementation.  Note that certain methods are exposed as API
- * in public subclasses, so changes to the methods in this class should be
- * treated carefully as they may affect API methods in subclasses.  The specific
- * methods affected are documented in the method comment.
- */
-public class DialogMarkerProperties extends TrayDialog {
-
-	private static final String DIALOG_SETTINGS_SECTION = "DialogMarkerPropertiesDialogSettings"; //$NON-NLS-1$
-	
-	/**
-	 * The marker being shown, or <code>null</code> for a new marker
-	 */
-	private IMarker marker = null;
-
-	/**
-	 * The resource on which to create a new marker
-	 */
-	private IResource resource = null;
-
-	/**
-	 * The type of marker to be created
-	 */
-	private String type = IMarker.MARKER;
-
-	/**
-	 * The initial attributes to use when creating a new marker
-	 */
-	private Map initialAttributes = null;
-
-	/**
-	 * The text control for the Description field.
-	 */
-	private Text descriptionText;
-
-	/**
-	 * The control for the Creation Time field.
-	 */
-	private Label creationTime;
-
-	/**
-	 * The text control for the Resource field.
-	 */
-	private Text resourceText;
-
-	/**
-	 * The text control for the Folder field.
-	 */
-	private Text folderText;
-
-	/**
-	 * The text control for the Location field.
-	 */
-	private Text locationText;
-
-	/**
-	 * Dirty flag. True if any changes have been made.
-	 */
-	private boolean dirty;
-
-	private String title;
-	
-	/**
-	 * The name used to describe the specific kind of marker.  Used when
-	 * creating an undo command for the dialog, so that a specific name such
-	 * as "Undo Create Task" or "Undo Modify Bookmark" can be used.
-	 */
-	private String markerName;
-
-	/**
-	 * Creates the dialog. By default this dialog creates a new marker. To set
-	 * the resource and initial attributes for the new marker, use
-	 * <code>setResource</code> and <code>setInitialAttributes</code>. To
-	 * show or modify an existing marker, use <code>setMarker</code>.
-	 * 
-	 * @param parentShell
-	 *            the parent shell
-	 */
-	public DialogMarkerProperties(Shell parentShell) {
-		super(parentShell);
-	}
-
-	/**
-	 * Creates the dialog. By default this dialog creates a new marker. To set
-	 * the resource and initial attributes for the new marker, use
-	 * <code>setResource</code> and <code>setInitialAttributes</code>. To
-	 * show or modify an existing marker, use <code>setMarker</code>.
-	 * 
-	 * @param parentShell
-	 *            the parent shell
-	 * @param title
-	 *            the title of the dialog
-	 */
-	public DialogMarkerProperties(Shell parentShell, String title) {
-		super(parentShell);
-		this.title = title;
-	}
-	
-	/**
-	 * Creates the dialog. By default this dialog creates a new marker. To set
-	 * the resource and initial attributes for the new marker, use
-	 * <code>setResource</code> and <code>setInitialAttributes</code>. To
-	 * show or modify an existing marker, use <code>setMarker</code>.
-	 * 
-	 * @param parentShell
-	 *            the parent shell
-	 * @param title
-	 *            the title of the dialog
-	 * @param markerName
-	 *            the name used to describe the specific kind of marker shown
-	 *            
-	 * @since 3.3
-	 */
-	public DialogMarkerProperties(Shell parentShell, String title, String markerName) {
-		super(parentShell);
-		this.title = title;
-		this.markerName = markerName;
-	}
-
-	/**
-     * Sets the marker to show or modify.
-     * <p>IMPORTANT:  Although this class is internal, there are public 
-     * subclasses that expose this method as API.  Changes in 
-     * this implementation should be treated as API changes.
-     * 
-     * @param marker the marker, or <code>null</code> to create a new marker
-     * 
-     * @since 3.3
-	 */
-	public void setMarker(IMarker marker) {
-		this.marker = marker;
-		if (marker != null) {
-			try {
-				type = marker.getType();
-			} catch (CoreException e) {
-			}
-		}
-	}
-
-	/**
-     * Returns the marker being created or modified.
-     * For a new marker, this returns <code>null</code> until
-     * the dialog returns, but is non-null after.
-     * <p>IMPORTANT:  Although this method is protected and the class is 
-     * internal, there are public subclasses that expose this method as API.
-     * Changes in this implementation should be treated as API changes.
-     * 
-     * @return the marker
-     * 
-     * @since 3.3
-	 */
-	protected IMarker getMarker() {
-		return marker;
-	}
-
-	/**
-     * Sets the resource to use when creating a new task.
-     * If not set, the new task is created on the workspace root.
-     * <p>IMPORTANT:  Although this class is internal, there are public 
-     * subclasses that expose this method as API.  Changes in 
-     * this implementation should be treated as API changes.
-     * 
-     * @param resource the resource
-	 */
-	public void setResource(IResource resource) {
-		this.resource = resource;
-	}
-
-	/**
-     * Returns the resource to use when creating a new task,
-     * or <code>null</code> if none has been set.
-     * If not set, the new task is created on the workspace root.
-     * <p>IMPORTANT:  Although this method is protected and the class is 
-     * internal, there are public subclasses that expose this method as API.
-     * Changes in this implementation should be treated as API changes.
-     * 
-     * @return the resource
-     * 
-     * @since 3.3
-	 */
-	protected IResource getResource() {
-		return resource;
-	}
-
-	/**
-     * Sets initial attributes to use when creating a new task.
-     * If not set, the new task is created with default attributes.
-     * <p>IMPORTANT:  Although this method is protected and the class is 
-     * internal, there are public subclasses that expose this method as API.
-     * Changes in this implementation should be treated as API changes.
-     * 
-     * @param initialAttributes the initial attributes
-     * 
-     * @since 3.3
-	 */
-	protected void setInitialAttributes(Map initialAttributes) {
-		this.initialAttributes = initialAttributes;
-	}
-
-	/**
-     * Returns the initial attributes to use when creating a new task,
-     * or <code>null</code> if not set.
-     * If not set, the new task is created with default attributes.
-     * <p>IMPORTANT:  Although this method is protected and the class is 
-     * internal, there are public subclasses that expose this method as API.
-     * Changes in this implementation should be treated as API changes.
-     * 
-     * @return the initial attributes
-     * 
-     * @since 3.3
-	 */
-	protected Map getInitialAttributes() {
-		if (initialAttributes == null) {
-			initialAttributes = new HashMap();
-		}
-		return initialAttributes;
-	}
-
-	/**
-	 * Method declared on Window.
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-        if (title == null) {
-			newShell.setText(MarkerMessages.propertiesDialog_title);
-		} else {
-			newShell.setText(title);
-		}
-    }
-
-	/**
-	 * Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		// initialize resources/properties
-		if (marker != null) {
-			resource = marker.getResource();
-			try {
-				initialAttributes = marker.getAttributes();
-			} catch (CoreException e) {
-			}
-		} else if (resource == null) {
-			resource = ResourcesPlugin.getWorkspace().getRoot();
-		}
-
-        Composite comp = (Composite) super.createDialogArea(parent);
-        Composite composite = new Composite(comp, SWT.NULL);
-        GridLayout layout = new GridLayout(2, false);
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-		composite.setLayout(layout);
-        GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-        composite.setLayoutData(gridData);
-    
-		initializeDialogUnits(composite);
-		createDescriptionArea(composite);
-		if (marker != null) {
-            createSeperator(composite);
-			createCreationTimeArea(composite);
-		}
-		createAttributesArea(composite);
-        if (resource != null) {
-            createSeperator(composite);
-			createResourceArea(composite);
-		}
-		updateDialogFromMarker();
-		updateEnablement();
-        
-        Dialog.applyDialogFont(composite);
-        
-		return composite;
-	}
-
-	/**
-     * Creates a seperator.
-     */
-    protected void createSeperator(Composite parent) {
-		Label seperator = new Label(parent, SWT.NULL);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		seperator.setLayoutData(gridData);
-	}
-    
-    /**
-	 * Method createCreationTimeArea.
-	 * @param parent
-	 */
-	private void createCreationTimeArea(Composite parent) {
-        Label label = new Label(parent, SWT.NONE);
-        label.setText(MarkerMessages
-                .propertiesDialog_creationTime_text);
-
-        creationTime = new Label(parent, SWT.NONE);
-	}
-
-	/**
-	 * Creates the OK and Cancel buttons.
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-	}
-
-	/**
-	 * Creates the area for the Description field.
-	 */
-	private void createDescriptionArea(Composite parent) {
-        Label label = new Label(parent, SWT.NONE);
-        label.setText(MarkerMessages.propertiesDialog_description_text);
-        descriptionText = new Text(parent, (SWT.SINGLE | SWT.BORDER));
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.widthHint = convertHorizontalDLUsToPixels(400);
-		descriptionText.setLayoutData(gridData);
-
-		descriptionText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				markDirty();
-			}
-		});
-	}
-
-	/**
-	 * This method is intended to be overridden by subclasses. The attributes
-	 * area is created between the creation time area and the resource area.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 */
-	protected void createAttributesArea(Composite parent) {
-	}
-
-	/**
-	 * Creates the area for the Resource field.
-	 */
-	private void createResourceArea(Composite parent) {
-        Label resourceLabel = new Label(parent, SWT.NONE);
-		resourceLabel.setText(MarkerMessages.propertiesDialog_resource_text);
-        resourceText = new Text(parent, SWT.SINGLE | SWT.WRAP
-				| SWT.READ_ONLY | SWT.BORDER);
-        GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		resourceText.setLayoutData(gridData);
-
-        Label folderLabel = new Label(parent, SWT.NONE);
-		folderLabel.setText(MarkerMessages.propertiesDialog_folder_text);
-        folderText = new Text(parent, SWT.SINGLE | SWT.WRAP | SWT.READ_ONLY
-				| SWT.BORDER);
-		gridData = new GridData(GridData.FILL_HORIZONTAL);
-		folderText.setLayoutData(gridData);
-
-        Label locationLabel = new Label(parent, SWT.NONE);
-		locationLabel.setText(MarkerMessages.propertiesDialog_location_text);
-        locationText = new Text(parent, SWT.SINGLE | SWT.WRAP
-				| SWT.READ_ONLY | SWT.BORDER);
-		gridData = new GridData(GridData.FILL_HORIZONTAL);
-		locationText.setLayoutData(gridData);
-	}
-
-    /**
-     * Updates the dialog from the marker state.
-     */
-    protected void updateDialogFromMarker() {
-        if (marker == null) {
-            updateDialogForNewMarker();
-            return;
-        }
-        descriptionText.setText(Util.getProperty(IMarker.MESSAGE, marker));
-        if (creationTime != null) {
-			creationTime.setText(Util.getCreationTime(marker));
-		}
-        if (resourceText != null) {
-			resourceText.setText(Util.getResourceName(marker));
-		}
-        if (folderText != null) {
-			folderText.setText(Util.getContainerName(marker));
-		}
-        if (locationText != null) {
-            String line = Util.getProperty(IMarker.LINE_NUMBER, marker);
-            if (line.equals("")) { //$NON-NLS-1$
-				locationText.setText(""); //$NON-NLS-1$
-			} else {
-				locationText.setText(NLS.bind(MarkerMessages.label_lineNumber, line));
-			}
-        }
-
-        descriptionText.selectAll();
-    }
-    
-    /**
-     * Updates the dialog from the predefined attributes.
-     */
-    protected void updateDialogForNewMarker() {
-        if (resource != null && resourceText != null && folderText != null) {
-            resourceText.setText(resource.getName());
-
-            IPath path = resource.getFullPath();
-            int n = path.segmentCount() - 1; // n is the number of segments in container, not path
-            if (n > 0) {
-                int len = 0;
-                for (int i = 0; i < n; ++i) {
-					len += path.segment(i).length();
-				}
-                // account for /'s
-                if (n > 1) {
-					len += n - 1;
-				}
-                StringBuffer sb = new StringBuffer(len);
-                for (int i = 0; i < n; ++i) {
-                    if (i != 0) {
-						sb.append('/');
-					}
-                    sb.append(path.segment(i));
-                }
-                folderText.setText(sb.toString());
-            }
-        }
-
-        if (initialAttributes != null) {
-            Object description = initialAttributes.get(IMarker.MESSAGE);
-            if (description != null && description instanceof String) {
-				descriptionText.setText((String) description);
-			}
-            descriptionText.selectAll();
-
-            Object line = initialAttributes.get(IMarker.LINE_NUMBER);
-            if (line != null && line instanceof Integer && locationText != null) {
-				locationText.setText(
-                    NLS.bind(MarkerMessages.label_lineNumber, line));
-			}
-        }
-    }
-    
-	/**
-	 * Method declared on Dialog
-	 */
-	protected void okPressed() {
-		if (marker == null || Util.isEditable(marker)) {
-			saveChanges();
-		}
-		super.okPressed();
-	}
-
-	/**
-	 * Sets the dialog's dirty flag to <code>true</code>
-	 */
-	protected void markDirty() {
-		dirty = true;
-	}
-
-	/**
-	 * @return
-	 * <ul>
-	 * <li><code>true</code> if the dirty flag has been set to true.</li>
-	 * <li><code>false</code> otherwise.</li>
-	 * </ul>
-	 */
-	protected boolean isDirty() {
-		return dirty;
-	}
-
-	/**
-	 * Saves the changes made in the dialog if needed. Creates a new marker if
-	 * needed. Updates the existing marker only if there have been changes.
-	 */
-	private void saveChanges() {
-		Map attrs = getMarkerAttributes();
-		IUndoableOperation op = null;
-		if (marker == null) {
-			if (resource == null)
-				return;
-			op = new CreateMarkersOperation(type, attrs,
-					resource, getCreateOperationTitle()); 
-		} else {
-			if (isDirty()) {
-				op = new UpdateMarkersOperation(marker, attrs,
-						getModifyOperationTitle(), true);
-			}
-		}
-		if (op != null) {
-			try {
-				PlatformUI.getWorkbench()
-						.getOperationSupport()
-						.getOperationHistory().execute(op,
-								null, WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
-			} catch (ExecutionException e) {
-				if (e.getCause() instanceof CoreException) {
-					ErrorDialog.openError(
-	                        getShell(),
-	                        MarkerMessages.Error, null, ((CoreException)e.getCause()).getStatus());
-				} else
-					IDEWorkbenchPlugin.log(e.getMessage(), e);
-			}
-		}
-	}
-
-	/**
-	 * Returns the marker attributes to save back to the marker, based on the
-	 * current dialog fields.
-	 */
-	protected Map getMarkerAttributes() {
-		Map attrs = getInitialAttributes();
-		attrs.put(IMarker.MESSAGE, descriptionText.getText());
-		return attrs;
-	}
-	
-	/**
-	 * Updates widget enablement for the dialog. Should be overridden by
-	 * subclasses.
-	 */
-	protected void updateEnablement() {
-		descriptionText.setEditable(isEditable());
-	}
-
-	/**
-	 * @return
-	 * <ul>
-	 * <li><code>true</code> if the marker is editable or the dialog is
-	 * creating a new marker.</li>
-	 * <li><code>false</code> if the marker is not editable.</li>
-	 * </ul>
-	 */
-	protected boolean isEditable() {
-		if (marker == null) {
-			return true;
-		}
-		return Util.isEditable(marker);
-	}
-
-	/**
-	 * Sets the marker type when creating a new marker.
-	 * 
-	 * @param type
-	 *            the marker type
-	 *            
-	 * @since 3.3 this method is protected.
-	 */
-	protected void setType(String type) {
-		this.type = type;
-	}
-    
-	/* (non-Javadoc)
-     * @see org.eclipse.jface.window.Dialog#getDialogBoundsSettings()
-     * 
-     * @since 3.2
-     */
-	protected IDialogSettings getDialogBoundsSettings() {
-        IDialogSettings settings = IDEWorkbenchPlugin.getDefault().getDialogSettings();
-        IDialogSettings section = settings.getSection(DIALOG_SETTINGS_SECTION);
-        if (section == null) {
-            section = settings.addNewSection(DIALOG_SETTINGS_SECTION);
-        }
-        return section;
-	}
-	
-	/**
-	 * Return the string that describes a modify marker operation.
-	 * Subclasses may override to more specifically describe the marker.
-	 * 
-	 * @since 3.3
-	 */
-	protected String getModifyOperationTitle() {
-		if (markerName == null) {
-			// we don't know what kind of marker is being modified
-			return MarkerMessages.DialogMarkerProperties_ModifyMarker;
-		} 
-		return NLS.bind(MarkerMessages.qualifiedMarkerCommand_title, 
-				MarkerMessages.DialogMarkerProperties_Modify, markerName);
-	}
-	
-	/**
-	 * Return the string that describes a create marker operation.
-	 * Subclasses may override to more specifically describe the marker.
-	 * 
-	 * @since 3.3
-	 */
-	protected String getCreateOperationTitle() {
-		if (markerName == null) {
-			// we don't know what kind of marker is being created
-			return MarkerMessages.DialogMarkerProperties_CreateMarker;
-		}
-		return NLS.bind(MarkerMessages.qualifiedMarkerCommand_title, 
-				MarkerMessages.DialogMarkerProperties_Create, markerName);
-		
-	}
-	
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#isResizable()
-     */
-    protected boolean isResizable() {
-    	return true;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogProblemFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogProblemFilter.java
deleted file mode 100644
index 574580a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogProblemFilter.java
+++ /dev/null
@@ -1,855 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-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.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.osgi.util.NLS;
-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.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-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.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * DialogProblemFilter is the dialog class for problem filters.
- * 
- * @since 3.2
- * 
- */
-public class DialogProblemFilter extends DialogMarkerFilter {
-
-	private DescriptionGroup descriptionGroup;
-
-	private SeverityGroup severityGroup;
-
-	private Composite userFilterComposite;
-
-	private Label systemSettingsLabel;
-
-	private CheckboxTableViewer definedList;
-
-	private class DescriptionGroup {
-		private Label descriptionLabel;
-
-		private Combo combo;
-
-		private Text description;
-
-		private String contains = MarkerMessages.filtersDialog_contains;
-
-		private String doesNotContain = MarkerMessages.filtersDialog_doesNotContain;
-
-		/**
-		 * Create a descriptor group.
-		 * 
-		 * @param parent
-		 */
-		public DescriptionGroup(Composite parent) {
-
-			Composite descriptionComposite = new Composite(parent, SWT.NONE);
-			descriptionComposite.setLayout(new GridLayout(2, false));
-			descriptionComposite.setLayoutData(new GridData(
-					GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
-
-			descriptionLabel = new Label(descriptionComposite, SWT.NONE);
-			descriptionLabel.setFont(parent.getFont());
-			descriptionLabel
-					.setText(MarkerMessages.filtersDialog_descriptionLabel);
-
-			combo = new Combo(descriptionComposite, SWT.READ_ONLY);
-			combo.setFont(parent.getFont());
-			combo.add(contains);
-			combo.add(doesNotContain);
-			combo.addSelectionListener(new SelectionAdapter() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-				 */
-				public void widgetSelected(SelectionEvent e) {
-					updateForSelection();
-				}
-			});
-			// Prevent Esc and Return from closing the dialog when the combo is
-			// active.
-			combo.addTraverseListener(new TraverseListener() {
-				public void keyTraversed(TraverseEvent e) {
-					if (e.detail == SWT.TRAVERSE_ESCAPE
-							|| e.detail == SWT.TRAVERSE_RETURN) {
-						e.doit = false;
-					}
-				}
-			});
-
-			description = new Text(descriptionComposite, SWT.SINGLE
-					| SWT.BORDER);
-			description.setFont(parent.getFont());
-			GridData data = new GridData(GridData.FILL_HORIZONTAL);
-			data.horizontalSpan = 2;
-
-			description.setLayoutData(data);
-			description.addModifyListener(new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					DialogProblemFilter.this.markDirty();
-				}
-			});
-		}
-
-		/**
-		 * Get the contains value.
-		 * 
-		 * @return boolean
-		 */
-		public boolean getContains() {
-			return combo.getSelectionIndex() == combo.indexOf(contains);
-		}
-
-		/**
-		 * Return whether or not the contains value is of use.
-		 * 
-		 * @param value
-		 */
-		public void setContains(boolean value) {
-			if (value) {
-				combo.select(combo.indexOf(contains));
-			} else {
-				combo.select(combo.indexOf(doesNotContain));
-			}
-		}
-
-		/**
-		 * Set the description field.
-		 * 
-		 * @param text
-		 */
-		public void setDescription(String text) {
-			if (text == null) {
-				description.setText(""); //$NON-NLS-1$ 
-			} else {
-				description.setText(text);
-			}
-		}
-
-		/**
-		 * Return the text for the description.
-		 * 
-		 * @return String
-		 */
-		public String getDescription() {
-			return description.getText();
-		}
-
-		/**
-		 * Update the enablement state based on whether or not the receiver is
-		 * enabled.
-		 * 
-		 * @param enabled
-		 */
-		public void updateEnablement(boolean enabled) {
-			descriptionLabel.setEnabled(enabled);
-			combo.setEnabled(enabled);
-			description.setEnabled(enabled);
-		}
-	}
-
-	private class SeverityGroup {
-		private Button enablementButton;
-
-		private Button errorButton;
-
-		private Button warningButton;
-
-		private Button infoButton;
-
-		/**
-		 * Create a group for severity.
-		 * 
-		 * @param parent
-		 */
-		public SeverityGroup(Composite parent) {
-
-			Composite severityComposite = new Composite(parent, SWT.NONE);
-			severityComposite.setLayout(new GridLayout(4, false));
-			severityComposite.setLayoutData(new GridData(
-					GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
-
-			SelectionListener listener = new SelectionAdapter() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-				 */
-				public void widgetSelected(SelectionEvent e) {
-					updateEnablement(true);
-					DialogProblemFilter.this.markDirty();
-				}
-			};
-
-			enablementButton = new Button(severityComposite, SWT.CHECK);
-			GridData data = new GridData(GridData.FILL_HORIZONTAL);
-			enablementButton.setLayoutData(data);
-			enablementButton.setFont(parent.getFont());
-			enablementButton
-					.setText(MarkerMessages.filtersDialog_severityLabel);
-			enablementButton.addSelectionListener(listener);
-
-			errorButton = new Button(severityComposite, SWT.CHECK);
-			errorButton.setFont(parent.getFont());
-			errorButton.setText(MarkerMessages.filtersDialog_severityError);
-			errorButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			errorButton.addSelectionListener(new SelectionAdapter() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-				 */
-				public void widgetSelected(SelectionEvent e) {
-					updateForSelection();
-				}
-			});
-
-			warningButton = new Button(severityComposite, SWT.CHECK);
-			warningButton.setFont(parent.getFont());
-			warningButton.setText(MarkerMessages.filtersDialog_severityWarning);
-			warningButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			warningButton.addSelectionListener(new SelectionAdapter() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-				 */
-				public void widgetSelected(SelectionEvent e) {
-					updateForSelection();
-				}
-			});
-
-			infoButton = new Button(severityComposite, SWT.CHECK);
-			infoButton.setFont(parent.getFont());
-			infoButton.setText(MarkerMessages.filtersDialog_severityInfo);
-			infoButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			infoButton.addSelectionListener(new SelectionAdapter() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-				 */
-				public void widgetSelected(SelectionEvent e) {
-					updateForSelection();
-				}
-			});
-		}
-
-		/**
-		 * Return whether or not sort by severity is selected.
-		 * 
-		 * @return boolean
-		 */
-		public boolean isSeveritySelected() {
-			return enablementButton.getSelection();
-		}
-
-		/**
-		 * Set whether or not the enabled button is selected.
-		 * 
-		 * @param enabled
-		 */
-		public void setEnabled(boolean enabled) {
-			enablementButton.setSelection(enabled);
-		}
-
-		/**
-		 * Return whether or not the error button is selected.
-		 * 
-		 * @return boolean
-		 */
-		public boolean isErrorSelected() {
-			return errorButton.getSelection();
-		}
-
-		/**
-		 * Set whether or not the error button is selected.
-		 * 
-		 * @param selected
-		 */
-		public void setErrorSelected(boolean selected) {
-			errorButton.setSelection(selected);
-		}
-
-		/**
-		 * Return whether or not the warning button is selected.
-		 * 
-		 * @return boolean
-		 */
-		public boolean isWarningSelected() {
-			return warningButton.getSelection();
-		}
-
-		/**
-		 * Set whether or not the warning button is selected.
-		 * 
-		 * @param selected
-		 */
-		public void setWarningSelected(boolean selected) {
-			warningButton.setSelection(selected);
-		}
-
-		/**
-		 * Return whether or not the info button is selected.
-		 * 
-		 * @return boolean
-		 */
-		public boolean isInfoSelected() {
-			return infoButton.getSelection();
-		}
-
-		/**
-		 * Set whether or not the erinforor button is selected.
-		 * 
-		 * @param selected
-		 */
-		public void setInfoSelected(boolean selected) {
-			infoButton.setSelection(selected);
-		}
-
-		/**
-		 * Update enablement based on the enabled flag.
-		 * 
-		 * @param enabled
-		 */
-		public void updateEnablement(boolean enabled) {
-
-			boolean showingSeverity = isSeveritySelected();
-			enablementButton.setEnabled(enabled);
-			errorButton.setEnabled(showingSeverity && enabled);
-			warningButton.setEnabled(showingSeverity && enabled);
-			infoButton.setEnabled(showingSeverity && enabled);
-
-		}
-	}
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param parentShell
-	 * @param filters
-	 */
-	public DialogProblemFilter(Shell parentShell, ProblemFilter[] filters) {
-		super(parentShell, filters);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#createAttributesArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createAttributesArea(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setFont(parent.getFont());
-		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		GridLayout layout = new GridLayout();
-		composite.setLayout(layout);
-
-		descriptionGroup = new DescriptionGroup(composite);
-		severityGroup = new SeverityGroup(composite);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#updateFilterFromUI(org.eclipse.ui.views.markers.internal.MarkerFilter)
-	 */
-	protected void updateFilterFromUI(MarkerFilter filter) {
-		super.updateFilterFromUI(filter);
-
-		ProblemFilter problemFilter = (ProblemFilter) filter;
-		problemFilter.setContains(descriptionGroup.getContains());
-		problemFilter.setDescription(descriptionGroup.getDescription().trim());
-
-		problemFilter.setSelectBySeverity(severityGroup.isSeveritySelected());
-		int severity = 0;
-		if (severityGroup.isErrorSelected()) {
-			severity = severity | ProblemFilter.SEVERITY_ERROR;
-		}
-		if (severityGroup.isWarningSelected()) {
-			severity = severity | ProblemFilter.SEVERITY_WARNING;
-		}
-		if (severityGroup.isInfoSelected()) {
-			severity = severity | ProblemFilter.SEVERITY_INFO;
-		}
-		problemFilter.setSeverity(severity);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#updateUIWithFilter(org.eclipse.ui.views.markers.internal.MarkerFilter)
-	 */
-	protected void updateUIWithFilter(MarkerFilter filter) {
-
-		ProblemFilter problemFilter = (ProblemFilter) filter;
-		descriptionGroup.setContains(problemFilter.getContains());
-		descriptionGroup.setDescription(problemFilter.getDescription());
-
-		severityGroup.setEnabled(problemFilter.getSelectBySeverity());
-		int severity = problemFilter.getSeverity();
-
-		severityGroup
-				.setErrorSelected((severity & ProblemFilter.SEVERITY_ERROR) > 0);
-		severityGroup
-				.setWarningSelected((severity & ProblemFilter.SEVERITY_WARNING) > 0);
-		severityGroup
-				.setInfoSelected((severity & ProblemFilter.SEVERITY_INFO) > 0);
-
-		super.updateUIWithFilter(filter);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#updateEnabledState(boolean)
-	 */
-	protected void updateEnabledState(boolean enabled) {
-		super.updateEnabledState(enabled);
-		descriptionGroup.updateEnablement(enabled);
-		severityGroup.updateEnablement(enabled);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markerview.FiltersDialog#resetPressed()
-	 */
-	protected void resetPressed() {
-		descriptionGroup.setContains(ProblemFilter.DEFAULT_CONTAINS);
-		descriptionGroup.setDescription(ProblemFilter.DEFAULT_DESCRIPTION);
-
-		severityGroup.setEnabled(ProblemFilter.DEFAULT_SELECT_BY_SEVERITY);
-		severityGroup
-				.setErrorSelected((ProblemFilter.DEFAULT_SEVERITY & ProblemFilter.SEVERITY_ERROR) > 0);
-		severityGroup
-				.setWarningSelected((ProblemFilter.DEFAULT_SEVERITY & ProblemFilter.SEVERITY_WARNING) > 0);
-		severityGroup
-				.setInfoSelected((ProblemFilter.DEFAULT_SEVERITY & ProblemFilter.SEVERITY_INFO) > 0);
-
-		super.resetPressed();
-	}
-
-	protected MarkerFilter newFilter(String newName) {
-		return new ProblemFilter(newName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#createFiltersArea(org.eclipse.swt.widgets.Composite)
-	 */
-	void createFiltersArea(Composite dialogArea) {
-
-		if (MarkerSupportRegistry.getInstance().getRegisteredFilters().size() == 0) {
-			super.createFiltersArea(dialogArea);
-			return;
-		}
-
-		Composite mainComposite = new Composite(dialogArea, SWT.NONE);
-		mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false,
-				true));
-
-		mainComposite.setLayout(new FormLayout());
-
-		Composite topComposite = new Composite(mainComposite, SWT.NONE);
-		FormData topData = new FormData();
-		topData.top = new FormAttachment(0);
-		topData.left = new FormAttachment(0);
-		topData.right = new FormAttachment(100);
-		topData.bottom = new FormAttachment(50);
-
-		topComposite.setLayoutData(topData);
-		topComposite.setLayout(new GridLayout());
-
-		createUserFiltersArea(topComposite);
-
-		Composite bottomComposite = new Composite(mainComposite, SWT.NONE);
-		FormData bottomData = new FormData();
-		bottomData.top = new FormAttachment(50);
-		bottomData.left = new FormAttachment(0);
-		bottomData.right = new FormAttachment(100);
-		bottomData.bottom = new FormAttachment(100);
-
-		bottomComposite.setLayoutData(bottomData);
-		bottomComposite.setLayout(new GridLayout());
-
-		createRegisteredFilters(bottomComposite);
-		createFilterSelectButtons(bottomComposite);
-
-	}
-
-	/**
-	 * Create a composite for the registered filters.
-	 * 
-	 * @param bottomComposite
-	 */
-	private void createRegisteredFilters(Composite bottomComposite) {
-
-		Composite listArea = new Composite(bottomComposite, SWT.NONE);
-		listArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		listArea.setLayout(new GridLayout());
-
-		Label title = new Label(listArea, SWT.NONE);
-		title.setText(MarkerMessages.ProblemFilterDialog_System_Filters_Title);
-		definedList = CheckboxTableViewer.newCheckList(listArea, SWT.BORDER);
-		definedList.setContentProvider(new IStructuredContentProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				return MarkerSupportRegistry.getInstance()
-						.getRegisteredFilters().toArray();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-				// Do nothing
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-				// Do nothing
-			}
-		});
-
-		definedList.setLabelProvider(new LabelProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-			 */
-			public String getText(Object element) {
-				return ((MarkerFilter) element).getName();
-			}
-		});
-
-		definedList
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-					 */
-					public void selectionChanged(SelectionChangedEvent event) {
-
-						ISelection selection = event.getSelection();
-						if (selection instanceof IStructuredSelection) {
-							Object selected = ((IStructuredSelection) selection)
-									.getFirstElement();
-							if (selected == null) {
-								systemSettingsLabel.setText(Util.EMPTY_STRING);
-							} else {
-								systemSettingsLabel
-										.setText(getSystemFilterString((ProblemFilter) selected));
-							}
-						} else {
-							systemSettingsLabel.setText(Util.EMPTY_STRING);
-						}
-						showSystemLabel(true);
-
-					}
-				});
-
-		Iterator definedFilters = MarkerSupportRegistry.getInstance()
-				.getRegisteredFilters().iterator();
-		definedList.setInput(this);
-		while (definedFilters.hasNext()) {
-			MarkerFilter next = (MarkerFilter) definedFilters.next();
-			definedList.setChecked(next, next.isEnabled());
-		}
-
-		definedList.getControl().setLayoutData(
-				new GridData(SWT.FILL, SWT.FILL, true, true));
-
-	}
-
-	/**
-	 * Return the string with the details of filter.
-	 * 
-	 * @param filter
-	 * @return String
-	 */
-	protected String getSystemFilterString(ProblemFilter filter) {
-		StringBuffer filterBuffer = new StringBuffer();
-
-		String scopeString = getScopeString(filter);
-		if (scopeString != null) {
-			filterBuffer.append(scopeString);
-		}
-
-		String descriptionString = getDescriptionString(filter);
-		if (descriptionString != null) {
-			filterBuffer.append(Util.TWO_LINE_FEED);
-			filterBuffer.append(descriptionString);
-		}
-
-		String severityString = getSeverityString(filter);
-		if (severityString != null) {
-			filterBuffer.append(Util.TWO_LINE_FEED);
-			filterBuffer.append(severityString);
-		}
-
-		String typesString = getProblemTypesString(filter);
-		filterBuffer.append(Util.TWO_LINE_FEED);
-		filterBuffer.append(typesString);
-
-		return filterBuffer.toString();
-	}
-
-	/**
-	 * Get the problem types String for filter.
-	 * 
-	 * @param filter
-	 * @return String
-	 */
-	private String getProblemTypesString(ProblemFilter filter) {
-		List types = filter.getSelectedTypes();
-		if (types.size() == getRootEntries(filter).length) {
-			return MarkerMessages.ProblemFilterDialog_All_Problems;
-		}
-		StringBuffer typesBuffer = new StringBuffer();
-		Iterator typesIterator = types.iterator();
-		typesBuffer.append(MarkerMessages.ProblemFilterDialog_Selected_Types);
-
-		while (typesIterator.hasNext()) {
-			typesBuffer.append(Util.LINE_FEED_AND_TAB);
-			typesBuffer.append(((MarkerType) typesIterator.next()).getLabel());
-
-		}
-		return typesBuffer.toString();
-	}
-
-	/**
-	 * Return the string for severity if there is one. Otherwise return
-	 * <code>null</code>.
-	 * 
-	 * @param filter
-	 * @return String
-	 */
-	private String getSeverityString(ProblemFilter filter) {
-		if (filter.getSelectBySeverity()) {
-			switch (filter.getSeverity()) {
-			case ProblemFilter.SEVERITY_INFO:
-				return MarkerMessages.ProblemFilterDialog_Info_Severity;
-			case ProblemFilter.SEVERITY_WARNING:
-				return MarkerMessages.ProblemFilterDialog_Warning_Severity;
-			case ProblemFilter.SEVERITY_ERROR:
-				return MarkerMessages.ProblemFilterDialog_Error_Severity;
-			default:
-				return null;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Return the string for the description if there is one. If not return
-	 * <code>null</code>.
-	 * 
-	 * @param filter
-	 * @return String or <code>null</code>.
-	 */
-	private String getDescriptionString(ProblemFilter filter) {
-		if (filter.getDescription().length() == 0) {
-			return null;
-		}
-		if (filter.getContains()) {
-			return NLS.bind(
-					MarkerMessages.ProblemFilterDialog_Contains_Description,
-					filter.getDescription());
-		}
-		return NLS
-				.bind(
-						MarkerMessages.ProblemFilterDialog_Does_Not_Contain_Description,
-						filter.getDescription());
-
-	}
-
-	/**
-	 * Return the string that describes the scope.
-	 * 
-	 * @param filter
-	 * @return String or <code>null</code> if the severity does not match.
-	 */
-	private String getScopeString(ProblemFilter filter) {
-
-		switch (filter.onResource) {
-		case MarkerFilter.ON_ANY:
-			return MarkerMessages.ProblemFilterDialog_any;
-		case MarkerFilter.ON_ANY_IN_SAME_CONTAINER:
-			return MarkerMessages.ProblemFilterDialog_sameContainer;
-		case MarkerFilter.ON_SELECTED_AND_CHILDREN:
-			return MarkerMessages.ProblemFilterDialog_selectedAndChildren;
-		case MarkerFilter.ON_SELECTED_ONLY:
-			return MarkerMessages.ProblemFilterDialog_selected;
-		case MarkerFilter.ON_WORKING_SET:
-			return NLS.bind(MarkerMessages.ProblemFilterDialog_workingSet,
-					filter.getWorkingSet());
-
-		default:
-			return null;
-
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#setSelectedFilter(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	protected void setSelectedFilter(SelectionChangedEvent event) {
-		showSystemLabel(false);
-		super.setSelectedFilter(event);
-	}
-
-	/**
-	 * Show or hide the system label.
-	 * 
-	 * @param systemLabelShowing
-	 */
-	protected void showSystemLabel(boolean systemLabelShowing) {
-
-		systemSettingsLabel.setVisible(systemLabelShowing);
-		userFilterComposite.setVisible(!systemLabelShowing);
-		userFilterComposite.getParent().layout();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#createSelectedFilterArea(org.eclipse.swt.widgets.Composite)
-	 */
-	Composite createSelectedFilterArea(Composite composite) {
-
-		Composite wrapper = new Composite(composite, SWT.NONE);
-		FormLayout wrapperLayout = new FormLayout();
-		wrapperLayout.marginHeight = 0;
-		wrapperLayout.marginWidth = 0;
-		wrapper.setLayout(wrapperLayout);
-
-		systemSettingsLabel = createSystemSettingsLabel(wrapper);
-		systemSettingsLabel.setVisible(false);
-
-		FormData systemData = new FormData();
-		systemData.top = new FormAttachment(0, IDialogConstants.VERTICAL_MARGIN);
-		systemData.left = new FormAttachment(0,
-				IDialogConstants.HORIZONTAL_MARGIN);
-		systemData.right = new FormAttachment(100, -1
-				* IDialogConstants.HORIZONTAL_MARGIN);
-		systemData.bottom = new FormAttachment(100, -1
-				* IDialogConstants.VERTICAL_MARGIN);
-
-		systemSettingsLabel.setLayoutData(systemData);
-
-		userFilterComposite = super.createSelectedFilterArea(wrapper);
-
-		FormData userData = new FormData();
-		userData.top = new FormAttachment(0);
-		userData.left = new FormAttachment(0);
-		userData.right = new FormAttachment(100);
-		userData.bottom = new FormAttachment(100);
-
-		userFilterComposite.setLayoutData(userData);
-
-		return wrapper;
-	}
-
-	/**
-	 * Create the label for system filters.
-	 * 
-	 * @param wrapper
-	 * @return Label
-	 */
-	private Label createSystemSettingsLabel(Composite wrapper) {
-
-		return new Label(wrapper, SWT.NONE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#buttonPressed(int)
-	 */
-	protected void buttonPressed(int buttonId) {
-		if (definedList != null) {
-			if (buttonId == SELECT_ALL_FILTERS_ID) {
-				definedList.setAllChecked(true);
-			} else if (buttonId == DESELECT_ALL_FILTERS_ID) {
-				definedList.setAllChecked(false);
-			}
-		}
-
-		super.buttonPressed(buttonId);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#okPressed()
-	 */
-	protected void okPressed() {
-
-		Iterator registered = MarkerSupportRegistry.getInstance()
-				.getRegisteredFilters().iterator();
-		while (registered.hasNext()) {
-			ProblemFilter next = (ProblemFilter) registered.next();
-			next.setEnabled(definedList.getChecked(next));
-
-		}
-		super.okPressed();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogProblemProperties.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogProblemProperties.java
deleted file mode 100644
index d9a1751..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogProblemProperties.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - bug 77332 - [Markers] Add task dialog improvements
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-public class DialogProblemProperties extends DialogMarkerProperties {
-
-	private Label severityLabel;
-
-	private Label severityImage;
-
-	public DialogProblemProperties(Shell parentShell) {
-		super(parentShell);
-		setType(IMarker.PROBLEM);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markerview.MarkerPropertiesDialog#createAttributesArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createAttributesArea(Composite parent) {
-		createSeperator(parent);
-		super.createAttributesArea(parent);
-
-		new Label(parent, SWT.NONE)
-				.setText(MarkerMessages.propertiesDialog_severityLabel);
-
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		composite.setLayout(layout);
-
-		severityImage = new Label(composite, SWT.NONE);
-		severityLabel = new Label(composite, SWT.NONE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markerview.MarkerPropertiesDialog#updateDialogFromMarker()
-	 */
-	protected void updateDialogFromMarker() {
-		super.updateDialogFromMarker();
-		IMarker marker = getMarker();
-		if (marker == null) {
-			return;
-		}
-
-		severityImage.setImage(Util.getImage(marker.getAttribute(
-				IMarker.SEVERITY, -1)));
-		int severity = marker.getAttribute(IMarker.SEVERITY, -1);
-		if (severity == IMarker.SEVERITY_ERROR) {
-			severityLabel.setText(MarkerMessages.propertiesDialog_errorLabel);
-		} else if (severity == IMarker.SEVERITY_WARNING) {
-			severityLabel.setText(MarkerMessages.propertiesDialog_warningLabel);
-		} else if (severity == IMarker.SEVERITY_INFO) {
-			severityLabel.setText(MarkerMessages.propertiesDialog_infoLabel);
-		} else {
-			severityLabel
-					.setText(MarkerMessages.propertiesDialog_noseverityLabel);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogTaskFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogTaskFilter.java
deleted file mode 100644
index f422703..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogTaskFilter.java
+++ /dev/null
@@ -1,466 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-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.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-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.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-public class DialogTaskFilter extends
-		org.eclipse.ui.views.markers.internal.DialogMarkerFilter {
-
-	private DescriptionGroup descriptionGroup;
-
-	private PriorityGroup priorityGroup;
-
-	private StatusGroup statusGroup;
-
-	private class DescriptionGroup {
-		private Label descriptionLabel;
-
-		private Combo combo;
-
-		private Text description;
-
-		private String contains = MarkerMessages.filtersDialog_contains;
-
-		private String doesNotContain = MarkerMessages.filtersDialog_doesNotContain;
-
-		/**
-		 * Create a new DescriptionGroup.
-		 * 
-		 * @param parent
-		 */
-		public DescriptionGroup(Composite parent) {
-			descriptionLabel = new Label(parent, SWT.NONE);
-			descriptionLabel.setFont(parent.getFont());
-			descriptionLabel.setText(
-				MarkerMessages.filtersDialog_descriptionLabel);
-
-			combo = new Combo(parent, SWT.READ_ONLY);
-			combo.setFont(parent.getFont());
-			combo.add(contains);
-			combo.add(doesNotContain);
-			combo.addSelectionListener(new SelectionAdapter(){
-	        	/* (non-Javadoc)
-	        	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-	        	 */
-	        	public void widgetSelected(SelectionEvent e) {
-	        		  updateForSelection();
-	        	}
-	          });
-			// Prevent Esc and Return from closing the dialog when the combo is
-			// active.
-			combo.addTraverseListener(new TraverseListener() {
-				public void keyTraversed(TraverseEvent e) {
-					if (e.detail == SWT.TRAVERSE_ESCAPE
-							|| e.detail == SWT.TRAVERSE_RETURN) {
-						e.doit = false;
-					}
-				}
-			});
-
-			description = new Text(parent, SWT.SINGLE | SWT.BORDER);
-			description.setFont(parent.getFont());
-			GridData data = new GridData(GridData.FILL_HORIZONTAL);
-			data.horizontalSpan = 3;
-			description.setLayoutData(data);
-			description.addModifyListener(new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					DialogTaskFilter.this.markDirty();
-				}
-			});
-		}
-
-		public boolean getContains() {
-			return combo.getSelectionIndex() == combo.indexOf(contains);
-		}
-
-		public void setContains(boolean value) {
-			if (value) {
-				combo.select(combo.indexOf(contains));
-			} else {
-				combo.select(combo.indexOf(doesNotContain));
-			}
-		}
-
-		public void setDescription(String text) {
-			if (text == null) {
-				description.setText(""); //$NON-NLS-1$ 
-			} else {
-				description.setText(text);
-			}
-		}
-
-		public String getDescription() {
-			return description.getText();
-		}
-
-		/**
-		 * Update the enabled state.
-		 * @param enabled
-		 */
-		public void updateEnablement(boolean enabled) {
-			descriptionLabel.setEnabled(enabled);
-			combo.setEnabled(enabled);
-			description.setEnabled(enabled);
-		}
-	}
-
-	private class PriorityGroup {
-		private Button enablementButton;
-
-		private Button highButton;
-
-		private Button normalButton;
-
-		private Button lowButton;
-
-		/**
-		 * Create a new priority group.
-		 * 
-		 * @param parent
-		 */
-		public PriorityGroup(Composite parent) {
-			SelectionListener listener = new SelectionAdapter() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-				 */
-				public void widgetSelected(SelectionEvent e) {
-					updateEnablement(true);
-					DialogTaskFilter.this.markDirty();
-				}
-			};
-
-			enablementButton = new Button(parent, SWT.CHECK);
-			GridData data = new GridData(GridData.FILL_HORIZONTAL);
-			data.horizontalSpan = 2;
-			enablementButton.setLayoutData(data);
-			enablementButton.setFont(parent.getFont());
-			enablementButton.setText(
-					MarkerMessages.filtersDialog_priorityLabel);
-			enablementButton.addSelectionListener(listener);
-
-			highButton = new Button(parent, SWT.CHECK);
-			highButton.setFont(parent.getFont());
-			highButton
-					.setText(MarkerMessages.filtersDialog_priorityHigh);
-			highButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			highButton.addSelectionListener(new SelectionAdapter(){
-	        	/* (non-Javadoc)
-	        	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-	        	 */
-	        	public void widgetSelected(SelectionEvent e) {
-	        		  updateForSelection();
-	        	}
-	          });
-
-			normalButton = new Button(parent, SWT.CHECK);
-			normalButton.setFont(parent.getFont());
-			normalButton.setText(MarkerMessages.filtersDialog_priorityNormal);
-			normalButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			normalButton.addSelectionListener(new SelectionAdapter(){
-	        	/* (non-Javadoc)
-	        	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-	        	 */
-	        	public void widgetSelected(SelectionEvent e) {
-	        		  updateForSelection();
-	        	}
-	          });
-
-			lowButton = new Button(parent, SWT.CHECK);
-			lowButton.setFont(parent.getFont());
-			lowButton.setText(MarkerMessages.filtersDialog_priorityLow);
-			lowButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			lowButton.addSelectionListener(new SelectionAdapter(){
-	        	/* (non-Javadoc)
-	        	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-	        	 */
-	        	public void widgetSelected(SelectionEvent e) {
-	        		  updateForSelection();
-	        	}
-	          });
-		}
-
-		public boolean isPriorityEnabled() {
-			return enablementButton.getSelection();
-		}
-
-		public void setEnabled(boolean enabled) {
-			enablementButton.setSelection(enabled);
-		}
-
-		public boolean isHighSelected() {
-			return highButton.getSelection();
-		}
-
-		public void setHighSelected(boolean selected) {
-			highButton.setSelection(selected);
-		}
-
-		public boolean isNormalSelected() {
-			return normalButton.getSelection();
-		}
-
-		public void setNormalSelected(boolean selected) {
-			normalButton.setSelection(selected);
-		}
-
-		public boolean isLowSelected() {
-			return lowButton.getSelection();
-		}
-
-		public void setLowSelected(boolean selected) {
-			lowButton.setSelection(selected);
-		}
-
-		/**
-		 * Update enablement based on enabled.
-		 * @param enabled
-		 */
-		public void updateEnablement(boolean enabled) {
-			enablementButton.setEnabled(enabled);
-			highButton.setEnabled(enabled && isPriorityEnabled());
-			normalButton
-					.setEnabled(enabled && isPriorityEnabled());
-			lowButton.setEnabled(enabled && isPriorityEnabled());
-		}
-	}
-
-	private class StatusGroup {
-		private Button enablementButton;
-
-		private Button completeButton;
-
-		private Button incompleteButton;
-
-		/**
-		 * Create a new StatusGroup.
-		 * 
-		 * @param parent
-		 */
-		public StatusGroup(Composite parent) {
-			SelectionListener enablementListener = new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					updateEnablement(true);
-					DialogTaskFilter.this.markDirty();
-				}
-			};
-
-			enablementButton = new Button(parent, SWT.CHECK);
-			GridData data = new GridData(GridData.FILL_HORIZONTAL);
-			data.horizontalSpan = 2;
-			enablementButton.setLayoutData(data);
-			enablementButton.setFont(parent.getFont());
-			enablementButton.setText(MarkerMessages.filtersDialog_statusLabel);
-			enablementButton.addSelectionListener(enablementListener);
-
-			Composite composite = new Composite(parent, SWT.NONE);
-			composite.setFont(parent.getFont());
-			GridLayout layout = new GridLayout(2, false);
-			layout.marginHeight = 0;
-			layout.marginWidth = 0;
-			composite.setLayout(layout);
-			data = new GridData(GridData.FILL_HORIZONTAL);
-			data.horizontalSpan = 3;
-			composite.setLayoutData(data);
-
-			SelectionListener listener = new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					completeButton.setSelection(!incompleteButton
-							.getSelection());
-					incompleteButton.setSelection(!completeButton
-							.getSelection());
-					DialogTaskFilter.this.markDirty();
-				}
-			};
-
-			completeButton = new Button(composite, SWT.RADIO);
-			completeButton.setFont(composite.getFont());
-			completeButton.setText(MarkerMessages.filtersDialog_statusComplete);
-			completeButton.addSelectionListener(listener);
-
-			incompleteButton = new Button(composite, SWT.RADIO);
-			incompleteButton.setFont(composite.getFont());
-			incompleteButton.setText(MarkerMessages.filtersDialog_statusIncomplete);
-			incompleteButton.addSelectionListener(listener);
-		}
-
-		public boolean isStatusEnabled() {
-			return enablementButton.getSelection();
-		}
-
-		public void setEnabled(boolean enabled) {
-			enablementButton.setSelection(enabled);
-		}
-
-		public boolean getDone() {
-			return completeButton.getSelection();
-		}
-
-		public void setDone(boolean done) {
-			completeButton.setSelection(done);
-			incompleteButton.setSelection(!done);
-		}
-
-		/**
-		 * Update the enablement state of the group.
-		 * @param enabled
-		 */
-		public void updateEnablement(boolean enabled) {
-			enablementButton.setEnabled(enabled);
-			completeButton.setEnabled(isStatusEnabled()
-					&& enabled);
-			incompleteButton.setEnabled(isStatusEnabled()
-					&& enabled);
-		}
-	}
-
-	/**
-	 * Create a new instance of the receiver
-	 * 
-	 * @param parentShell
-	 * @param filters
-	 */
-	public DialogTaskFilter(Shell parentShell, TaskFilter[] filters) {
-		super(parentShell, filters);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#createAttributesArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createAttributesArea(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setFont(parent.getFont());
-		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		GridLayout layout = new GridLayout(5, false);
-		layout.verticalSpacing = 7;
-		composite.setLayout(layout);
-
-		descriptionGroup = new DescriptionGroup(composite);
-		priorityGroup = new PriorityGroup(composite);
-		statusGroup = new StatusGroup(composite);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#updateFilterFromUI(org.eclipse.ui.views.markers.internal.MarkerFilter)
-	 */
-	protected void updateFilterFromUI(MarkerFilter filter) {
-		super.updateFilterFromUI(filter);
-
-		TaskFilter taskFilter = (TaskFilter)filter;
-		taskFilter.setContains(descriptionGroup.getContains());
-		taskFilter.setDescription(descriptionGroup.getDescription().trim());
-
-		taskFilter.setSelectByPriority(priorityGroup.isPriorityEnabled());
-		int priority = 0;
-		if (priorityGroup.isHighSelected()) {
-			priority = priority | TaskFilter.PRIORITY_HIGH;
-		}
-		if (priorityGroup.isNormalSelected()) {
-			priority = priority | TaskFilter.PRIORITY_NORMAL;
-		}
-		if (priorityGroup.isLowSelected()) {
-			priority = priority | TaskFilter.PRIORITY_LOW;
-		}
-		taskFilter.setPriority(priority);
-
-		taskFilter.setSelectByDone(statusGroup.isStatusEnabled());
-		taskFilter.setDone(statusGroup.getDone());
-	
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#updateUIWithFilter(org.eclipse.ui.views.markers.internal.MarkerFilter)
-	 */
-	protected void updateUIWithFilter(MarkerFilter filter) {
-		TaskFilter taskFilter = (TaskFilter)filter;
-		descriptionGroup.setContains(taskFilter.getContains());
-		descriptionGroup.setDescription(taskFilter.getDescription());
-
-		priorityGroup.setEnabled(taskFilter.getSelectByPriority());
-		int priority = taskFilter.getPriority();
-		priorityGroup
-				.setHighSelected((priority & TaskFilter.PRIORITY_HIGH) > 0);
-		priorityGroup
-				.setNormalSelected((priority & TaskFilter.PRIORITY_NORMAL) > 0);
-		priorityGroup.setLowSelected((priority & TaskFilter.PRIORITY_LOW) > 0);
-
-		statusGroup.setEnabled(taskFilter.getSelectByDone());
-		statusGroup.setDone(taskFilter.getDone());
-		
-		super.updateUIWithFilter(filter);
-
-	
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#updateEnabledState(boolean)
-	 */
-	protected void updateEnabledState(boolean enabled) {
-		super.updateEnabledState(enabled);
-		descriptionGroup.updateEnablement(enabled);
-		priorityGroup.updateEnablement(enabled);
-		statusGroup.updateEnablement(enabled);
-	}
-	
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markerview.FiltersDialog#resetPressed()
-	 */
-	protected void resetPressed() {
-		descriptionGroup.setContains(TaskFilter.DEFAULT_CONTAINS);
-		descriptionGroup.setDescription(TaskFilter.DEFAULT_DESCRIPTION);
-
-		priorityGroup.setEnabled(TaskFilter.DEFAULT_SELECT_BY_PRIORITY);
-		priorityGroup
-				.setHighSelected((TaskFilter.DEFAULT_PRIORITY & TaskFilter.PRIORITY_HIGH) > 0);
-		priorityGroup
-				.setNormalSelected((TaskFilter.DEFAULT_PRIORITY & TaskFilter.PRIORITY_NORMAL) > 0);
-		priorityGroup
-				.setLowSelected((TaskFilter.DEFAULT_PRIORITY & TaskFilter.PRIORITY_NORMAL) > 0);
-
-		statusGroup.setEnabled(TaskFilter.DEFAULT_SELECT_BY_DONE);
-		statusGroup.setDone(TaskFilter.DEFAULT_DONE);
-
-		super.resetPressed();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.DialogMarkerFilter#newFilter(java.lang.String)
-	 */
-	protected MarkerFilter newFilter(String newName) {
-		return new TaskFilter(newName);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogTaskProperties.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogTaskProperties.java
deleted file mode 100644
index 0824797..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/DialogTaskProperties.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - bug 77332 - [Markers] Add task dialog improvements
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-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.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * DialogTaskProperties is the properties dialog
- * for tasks.
- *
- */
-public class DialogTaskProperties extends DialogMarkerProperties {
-
-    private static final String PRIORITY_HIGH = 
-    	MarkerMessages.propertiesDialog_priorityHigh;
-
-    private static final String PRIORITY_NORMAL = 
-    	MarkerMessages.propertiesDialog_priorityNormal;
-
-    private static final String PRIORITY_LOW = 
-    	MarkerMessages.propertiesDialog_priorityLow;
-
-    protected Combo priorityCombo;
-
-    protected Button completedCheckbox;
-
-    /**
-     * @param parentShell
-     */
-    public DialogTaskProperties(Shell parentShell) {
-        super(parentShell);
-        setType(IMarker.TASK);
-    }
-
-    /**
-     * @param parentShell
-     */
-    public DialogTaskProperties(Shell parentShell, String title) {
-        super(parentShell, title);
-        setType(IMarker.TASK);
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.DialogMarkerProperties#createAttributesArea(org.eclipse.swt.widgets.Composite)
-     */
-    protected void createAttributesArea(Composite parent) {
-    	createSeperator(parent);
-        super.createAttributesArea(parent);
-
-        Label label = new Label(parent, SWT.NONE);
-        label.setText(MarkerMessages.propertiesDialog_priority);
-        
-        Composite composite = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        composite.setLayout(layout);
-        
-        priorityCombo = new Combo(composite, SWT.READ_ONLY);
-        priorityCombo.setItems(new String[] { PRIORITY_HIGH, PRIORITY_NORMAL,
-                PRIORITY_LOW });
-        // Prevent Esc and Return from closing the dialog when the combo is active.
-        priorityCombo.addTraverseListener(new TraverseListener() {
-            public void keyTraversed(TraverseEvent e) {
-                if (e.detail == SWT.TRAVERSE_ESCAPE
-                        || e.detail == SWT.TRAVERSE_RETURN) {
-                    e.doit = false;
-                }
-            }
-        });
-        priorityCombo.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                if (getMarker() == null) {
-                    Map initialAttributes = getInitialAttributes();
-                    initialAttributes.put(IMarker.PRIORITY, new Integer(
-                            getPriorityFromDialog()));
-                }
-                markDirty();
-            }
-        });
-
-        completedCheckbox = new Button(composite, SWT.CHECK);
-        completedCheckbox.setText(MarkerMessages.propertiesDialog_completed);
-        GridData gridData = new GridData();
-        gridData.horizontalIndent = convertHorizontalDLUsToPixels(20);
-        completedCheckbox.setLayoutData(gridData);
-        completedCheckbox.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                if (getMarker() == null) {
-                    Map initialAttributes = getInitialAttributes();
-                    initialAttributes.put(IMarker.DONE, completedCheckbox.getSelection() ? Boolean.TRUE : Boolean.FALSE);
-                }
-                markDirty();
-            }
-        });
-    }
-
-    protected boolean getCompleted() {
-        IMarker marker = getMarker();
-        if (marker == null) {
-            Map attributes = getInitialAttributes();
-            Object done = attributes.get(IMarker.DONE);
-            return done != null && done instanceof Boolean
-                    && ((Boolean) done).booleanValue();
-        }
-        return marker.getAttribute(IMarker.DONE, false);
-    }
-
-    protected int getPriority() {
-        IMarker marker = getMarker();
-        int priority = IMarker.PRIORITY_NORMAL;
-        if (marker == null) {
-            Map attributes = getInitialAttributes();
-            Object priorityObj = attributes.get(IMarker.PRIORITY);
-            if (priorityObj != null && priorityObj instanceof Integer) {
-                priority = ((Integer) priorityObj).intValue();
-            }
-        } else {
-            priority = marker.getAttribute(IMarker.PRIORITY,
-                    IMarker.PRIORITY_NORMAL);
-        }
-        return priority;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.DialogMarkerProperties#updateEnablement()
-     */
-    protected void updateEnablement() {
-        super.updateEnablement();
-        priorityCombo.setEnabled(isEditable());
-        completedCheckbox.setEnabled(isEditable());
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.DialogMarkerProperties#updateDialogForNewMarker()
-     */
-    protected void updateDialogForNewMarker() {
-        Map initialAttributes = getInitialAttributes();
-        int priority = getPriority();
-        initialAttributes.put(IMarker.PRIORITY, new Integer(priority));
-        if (priority == IMarker.PRIORITY_HIGH) {
-            priorityCombo.select(priorityCombo.indexOf(PRIORITY_HIGH));
-        } else if (priority == IMarker.PRIORITY_LOW) {
-            priorityCombo.select(priorityCombo.indexOf(PRIORITY_LOW));
-        } else {
-            priorityCombo.select(priorityCombo.indexOf(PRIORITY_NORMAL));
-        }
-        boolean completed = getCompleted();
-        initialAttributes.put(IMarker.DONE, completed ? Boolean.TRUE : Boolean.FALSE);
-        completedCheckbox.setSelection(completed);
-        super.updateDialogForNewMarker();
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.DialogMarkerProperties#updateDialogFromMarker()
-     */
-    protected void updateDialogFromMarker() {
-        Map initialAttributes = getInitialAttributes();
-        int priority = getPriority();
-        initialAttributes.put(IMarker.PRIORITY, new Integer(priority));
-        if (priority == IMarker.PRIORITY_HIGH) {
-            priorityCombo.select(priorityCombo.indexOf(PRIORITY_HIGH));
-        } else if (priority == IMarker.PRIORITY_LOW) {
-            priorityCombo.select(priorityCombo.indexOf(PRIORITY_LOW));
-        } else {
-            priorityCombo.select(priorityCombo.indexOf(PRIORITY_NORMAL));
-        }
-        boolean completed = getCompleted();
-        initialAttributes.put(IMarker.DONE, completed ? Boolean.TRUE : Boolean.FALSE);
-        completedCheckbox.setSelection(completed);
-        super.updateDialogFromMarker();
-    }
-
-    private int getPriorityFromDialog() {
-        int priority = IMarker.PRIORITY_NORMAL;
-        if (priorityCombo.getSelectionIndex() == priorityCombo
-                .indexOf(PRIORITY_HIGH)) {
-            priority = IMarker.PRIORITY_HIGH;
-        } else if (priorityCombo.getSelectionIndex() == priorityCombo
-                .indexOf(PRIORITY_LOW)) {
-            priority = IMarker.PRIORITY_LOW;
-        }
-        return priority;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.DialogMarkerProperties#getMarkerAttributes()
-     */
-    protected Map getMarkerAttributes() {
-        Map attrs = super.getMarkerAttributes();
-        attrs.put(IMarker.PRIORITY, new Integer(getPriorityFromDialog()));
-        attrs.put(IMarker.DONE, completedCheckbox.getSelection() ? Boolean.TRUE : Boolean.FALSE);
-        Object userEditable = attrs.get(IMarker.USER_EDITABLE);
-        if (userEditable == null || !(userEditable instanceof Boolean)) {
-            attrs.put(IMarker.USER_EDITABLE, Boolean.TRUE);
-        }
-        return attrs;
-    }
-    
-	/* (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.DialogMarkerProperties.getModifyOperationTitle()
-     * 
-     * @since 3.3
-     */
-	protected String getModifyOperationTitle() {
-		return MarkerMessages.modifyTask_title;
-	}
-	
-	/* (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.DialogMarkerProperties.getCreateOperationTitle()
-     * 
-     * @since 3.3
-     */
-	protected String getCreateOperationTitle() {
-		return MarkerMessages.DialogTaskProperties_CreateTask;
-		
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldCategory.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldCategory.java
deleted file mode 100644
index a78449c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldCategory.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.internal.ide.Policy;
-
-/**
- * FieldCategory is the field for showing categories of markers.
- * 
- */
-public class FieldCategory extends AbstractField {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDescription()
-	 */
-	public String getDescription() {
-		return MarkerMessages.description_type;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDescriptionImage()
-	 */
-	public Image getDescriptionImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderText()
-	 */
-	public String getColumnHeaderText() {
-		return getDescription();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderImage()
-	 */
-	public Image getColumnHeaderImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getValue(java.lang.Object)
-	 */
-	public String getValue(Object obj) {
-
-		if (obj instanceof ConcreteMarker) {
-			ConcreteMarker marker = (ConcreteMarker) obj;
-
-			if (marker.getGroup() == null) {
-				if (!marker.getMarker().exists())
-					return MarkerMessages.FieldCategory_Uncategorized;
-				String groupName = MarkerSupportRegistry.getInstance()
-						.getCategory(marker.getMarker());
-				if (groupName == null) {
-
-					String typeId;
-					try {
-						typeId = marker.getMarker().getType();
-					} catch (CoreException e) {
-						Policy.handle(e);
-						return MarkerMessages.FieldCategory_Uncategorized;
-					}
-					MarkerType type = MarkerTypesModel.getInstance().getType(
-							typeId);
-					groupName = type.getLabel();
-				}
-				marker.setGroup(groupName);
-			}
-
-			return (String) marker.getGroup();
-
-		}
-		return Util.EMPTY_STRING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object obj) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public int compare(Object obj1, Object obj2) {
-		return getValue(obj1).compareTo(getValue(obj2));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDefaultDirection()
-	 */
-	public int getDefaultDirection() {
-		return TableComparator.ASCENDING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getPreferredWidth()
-	 */
-	public int getPreferredWidth() {
-		return 200;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldCreationTime.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldCreationTime.java
deleted file mode 100644
index 0fdf207..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldCreationTime.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Creation time field. Designed to display and compare creation times of IMarker objects.
- */
-public class FieldCreationTime extends AbstractField {
-
-    private String description;
-
-    private Image image;
-
-    /**
-     * The constructor
-     */
-    public FieldCreationTime() {
-        description = MarkerMessages.description_creationTime;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getDescription()
-     */
-    public String getDescription() {
-        return description;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getDescriptionImage()
-     */
-    public Image getDescriptionImage() {
-        return image;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderText()
-     */
-    public String getColumnHeaderText() {
-        return description;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderImage()
-     */
-    public Image getColumnHeaderImage() {
-        return image;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getValue(java.lang.Object)
-     */
-    public String getValue(Object obj) {
-        if (obj == null || !(obj instanceof ConcreteMarker)) {
-            return ""; //$NON-NLS-1$
-        }
-        ConcreteMarker marker = (ConcreteMarker) obj;
-        return String.valueOf(marker.getCreationTime());
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object)
-     */
-    public Image getImage(Object obj) {
-        return null;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object, java.lang.Object)
-     */
-    public int compare(Object obj1, Object obj2) {
-        if (obj1 == null || obj2 == null || !(obj1 instanceof ConcreteMarker)
-                || !(obj2 instanceof ConcreteMarker)) {
-            return 0;
-        }
-
-        ConcreteMarker marker1 = (ConcreteMarker) obj1;
-        ConcreteMarker marker2 = (ConcreteMarker) obj2;
-
-        long value = marker1.getCreationTime() - marker2.getCreationTime();
-        if (value < 0) {
-            return -1;
-        } else if (value > 0) {
-            return 1;
-        } else {
-			return 0;
-		}
-    }
-    
-    /* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDefaultDirection()
-	 */
-	public int getDefaultDirection() {
-		return TableComparator.ASCENDING;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getPreferredWidth()
-	 */
-	public int getPreferredWidth() {
-		return 0;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldDone.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldDone.java
deleted file mode 100644
index f5856d5..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldDone.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * FieldDone is the field for the done marker in tasks.
- *
- */
-public class FieldDone extends AbstractField {
-
-	static final String DESCRIPTION_IMAGE_PATH = "obj16/header_complete.gif"; //$NON-NLS-1$
-
-	static final String COMPLETE_IMAGE_PATH = "obj16/complete_tsk.gif"; //$NON-NLS-1$
-
-	static final String INCOMPLETE_IMAGE_PATH = "obj16/incomplete_tsk.gif"; //$NON-NLS-1$
-
-	private String description = MarkerMessages.completion_description;
-
-
-	/**
-	 * Create a new instance of the receiver
-	 *
-	 */
-	public FieldDone() {
-		
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDescription()
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDescriptionImage()
-	 */
-	public Image getDescriptionImage() {
-		return getImage(DESCRIPTION_IMAGE_PATH);
-	}
-	
-	/**
-	 * Get the image at path.
-	 * @param path
-	 * @return Image
-	 */
-	private Image getImage(String path){
-		return JFaceResources.getResources().createImageWithDefault(
-				IDEWorkbenchPlugin
-						.getIDEImageDescriptor(path));
-		
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderText()
-	 */
-	public String getColumnHeaderText() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderImage()
-	 */
-	public Image getColumnHeaderImage() {
-		return getImage(DESCRIPTION_IMAGE_PATH);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getValue(java.lang.Object)
-	 */
-	public String getValue(Object obj) {
-		return ""; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object obj) {
-		if (obj == null || !(obj instanceof TaskMarker)) {
-			return null;
-		}
-		TaskMarker marker = (TaskMarker) obj;
-		int done = marker.getDone();
-		if (done == -1) {
-			return null;
-		}
-		if (done == 1) {
-			return getImage(COMPLETE_IMAGE_PATH);
-		}
-		return getImage(INCOMPLETE_IMAGE_PATH);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public int compare(Object obj1, Object obj2) {
-		if (obj1 == null || obj2 == null || !(obj1 instanceof TaskMarker)
-				|| !(obj2 instanceof TaskMarker)) {
-			return 0;
-		}
-		TaskMarker marker1 = (TaskMarker) obj1;
-		TaskMarker marker2 = (TaskMarker) obj2;
-		int value1 = marker1.getDone();
-		int value2 = marker2.getDone();
-		return value1 - value2;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDefaultDirection()
-	 */
-	public int getDefaultDirection() {
-		return TableComparator.ASCENDING;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getPreferredWidth()
-	 */
-	public int getPreferredWidth() {
-		return 40;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldDummy.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldDummy.java
deleted file mode 100644
index eaa4809..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldDummy.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * FieldDummy is a dummy field used to eat up the column of the tree
- * which has layout issues,
- * @since 3.2
- *
- */
-public class FieldDummy extends AbstractField implements IField {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDescription()
-	 */
-	public String getDescription() {
-		return Util.EMPTY_STRING;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDescriptionImage()
-	 */
-	public Image getDescriptionImage() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderText()
-	 */
-	public String getColumnHeaderText() {
-		return Util.EMPTY_STRING;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderImage()
-	 */
-	public Image getColumnHeaderImage() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getValue(java.lang.Object)
-	 */
-	public String getValue(Object obj) {
-		return Util.EMPTY_STRING;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object obj) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Object obj1, Object obj2) {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDefaultDirection()
-	 */
-	public int getDefaultDirection() {
-		return TableComparator.ASCENDING;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getPreferredWidth()
-	 */
-	public int getPreferredWidth() {
-		return 0;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldFolder.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldFolder.java
deleted file mode 100644
index 37ed8b3..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldFolder.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Folder field. Designed to display and compare the names of the folders that contain
- * IMarker objects.
- */
-public class FieldFolder extends AbstractField {
-
-    /**
-     * Create a new instance of the receiver.
-     */
-    public FieldFolder() {
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getDescription()
-     */
-    public String getDescription() {
-        return MarkerMessages.description_folder;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getDescriptionImage()
-     */
-    public Image getDescriptionImage() {
-        return null;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderText()
-     */
-    public String getColumnHeaderText() {
-        return MarkerMessages.description_folder;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderImage()
-     */
-    public Image getColumnHeaderImage() {
-        return null;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getValue(java.lang.Object)
-     */
-    public String getValue(Object obj) {
-        if (obj == null || !(obj instanceof ConcreteMarker)) {
-            return Util.EMPTY_STRING;
-        }
-        ConcreteMarker marker = (ConcreteMarker) obj;
-        return marker.getFolder();
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object)
-     */
-    public Image getImage(Object obj) {
-        return null;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object, java.lang.Object)
-     */
-    public int compare(Object obj1, Object obj2) {
-        if (obj1 == null || obj2 == null || !(obj1 instanceof ConcreteMarker)
-                || !(obj2 instanceof ConcreteMarker)) {
-            return 0;
-        }
-        ConcreteMarker marker1 = (ConcreteMarker) obj1;
-        ConcreteMarker marker2 = (ConcreteMarker) obj2;
-
-        return marker1.getFolder().compareTo(marker2.getFolder());
-    }
-
-    /* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDefaultDirection()
-	 */
-	public int getDefaultDirection() {
-		return TableComparator.ASCENDING;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getPreferredWidth()
-	 */
-	public int getPreferredWidth() {
-		return 150;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldId.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldId.java
deleted file mode 100644
index c003a87..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldId.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * FieldId is the field for marker id.
- *
- */
-public class FieldId implements IField {
-
-    private String description;
-
-    private Image image;
-
-    /**
-     * Create a new instance of the receiver.
-     */
-    public FieldId() {
-        description = MarkerMessages.description_markerId;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getDescription()
-     */
-    public String getDescription() {
-        return description;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getDescriptionImage()
-     */
-    public Image getDescriptionImage() {
-        return image;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderText()
-     */
-    public String getColumnHeaderText() {
-        return description;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderImage()
-     */
-    public Image getColumnHeaderImage() {
-        return image;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getValue(java.lang.Object)
-     */
-    public String getValue(Object obj) {
-        if (obj == null || !(obj instanceof ConcreteMarker)) {
-            return ""; //$NON-NLS-1$
-        }
-        ConcreteMarker marker = (ConcreteMarker) obj;
-        return "" + marker.getId(); //$NON-NLS-1$
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object)
-     */
-    public Image getImage(Object obj) {
-        return null;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object, java.lang.Object)
-     */
-    public int compare(Object obj1, Object obj2) {
-        if (obj1 == null || obj2 == null || !(obj1 instanceof ConcreteMarker)
-                || !(obj2 instanceof ConcreteMarker)) {
-            return 0;
-        }
-
-        ConcreteMarker marker1 = (ConcreteMarker) obj1;
-        ConcreteMarker marker2 = (ConcreteMarker) obj2;
-        return (int)(marker1.getId() - marker2.getId());
-    }
-
-    /* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDefaultDirection()
-	 */
-	public int getDefaultDirection() {
-		return TableComparator.ASCENDING;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getPreferredWidth()
-	 */
-	public int getPreferredWidth() {
-		return 0;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#isShowing()
-	 */
-	public boolean isShowing() {
-		// Never show id
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#setShowing(boolean)
-	 */
-	public void setShowing(boolean showing) {
-		// Ignore
-		
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldLineNumber.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldLineNumber.java
deleted file mode 100644
index 108dd64..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldLineNumber.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-/**
- * FieldLineNumber is the field for line numbers.
- *
- */
-public class FieldLineNumber extends AbstractField {
-
-    private String description;
-
-    private Image image;
-
-    /**
-     * Create a new instance of the receiver.
-     */
-    public FieldLineNumber() {
-        description = MarkerMessages.description_lineNumber;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getDescription()
-     */
-    public String getDescription() {
-        return description;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getDescriptionImage()
-     */
-    public Image getDescriptionImage() {
-        return image;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderText()
-     */
-    public String getColumnHeaderText() {
-        return description;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderImage()
-     */
-    public Image getColumnHeaderImage() {
-        return image;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getValue(java.lang.Object)
-     */
-    public String getValue(Object obj) {
-    	if (obj == null) {
-			return MarkerMessages.FieldMessage_NullMessage;
-		}
-
-    	if (obj instanceof MarkerNode){
-			MarkerNode node = (MarkerNode) obj;
-	    	if(node.isConcrete()){
-	    		ConcreteMarker concreteNode = (ConcreteMarker) node;
-	    		if(concreteNode.getLocationString().length() == 0){
-	    			if (concreteNode.getLine() < 0) {
-						return MarkerMessages.Unknown;
-					}	    	   
-	    	        return NLS.bind(
-	    	        		MarkerMessages.label_lineNumber,
-	    	        		Integer.toString(concreteNode.getLine()));
-	    		}
-	    		return concreteNode.getLocationString();
-	    	}
-	    	return Util.EMPTY_STRING;
-		}
-		
-		if(obj instanceof IWorkbenchAdapter) {
-			return Util.EMPTY_STRING;//Don't show pending
-		}
-		
-		if(obj instanceof IMarker) {
-			return Util.getProperty(IMarker.LINE_NUMBER, (IMarker) obj);
-		} 
-		
-		return NLS.bind(MarkerMessages.FieldMessage_WrongType,obj.toString());
-        
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object)
-     */
-    public Image getImage(Object obj) {
-        return null;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object, java.lang.Object)
-     */
-    public int compare(Object obj1, Object obj2) {
-        if (obj1 == null || obj2 == null || !(obj1 instanceof ConcreteMarker)
-                || !(obj2 instanceof ConcreteMarker)) {
-            return 0;
-        }
-
-        ConcreteMarker marker1 = (ConcreteMarker) obj1;
-        ConcreteMarker marker2 = (ConcreteMarker) obj2;
-        
-        String location1 = marker1.getLocationString();
-        String location2 = marker2.getLocationString();
-        
-        if(location1.length() == 0 || location2.length() == 0) {
-			return marker1.getLine() - marker2.getLine();
-		}
-        
-        return location1.compareTo(location2);
-    }
-
-    /* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDefaultDirection()
-	 */
-	public int getDefaultDirection() {
-		return TableComparator.ASCENDING;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getPreferredWidth()
-	 */
-	public int getPreferredWidth() {
-		return 60;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldMessage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldMessage.java
deleted file mode 100644
index 37309b1..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldMessage.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The message field is the field for the description of the marker.
- * 
- * @since 3.1
- * 
- */
-public class FieldMessage extends AbstractField {
-
-	/**
-	 * Create an instance of the receiver.
-	 */
-	public FieldMessage() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDescription()
-	 */
-	public String getDescription() {
-		return MarkerMessages.description_message;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDescriptionImage()
-	 */
-	public Image getDescriptionImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderText()
-	 */
-	public String getColumnHeaderText() {
-		return MarkerMessages.description_message;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderImage()
-	 */
-	public Image getColumnHeaderImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getValue(java.lang.Object)
-	 */
-	public String getValue(Object obj) {
-		if (obj == null) {
-			return MarkerMessages.FieldMessage_NullMessage;
-		}
-
-		if (obj instanceof MarkerNode) {
-			return ((MarkerNode) obj).getDescription();
-		}
-		return NLS.bind(MarkerMessages.FieldMessage_WrongType, obj.toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object obj) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public int compare(Object obj1, Object obj2) {
-		if (obj1 == null || obj2 == null || !(obj1 instanceof ConcreteMarker)
-				|| !(obj2 instanceof ConcreteMarker)) {
-			return 0;
-		}
-
-		ConcreteMarker marker1 = (ConcreteMarker) obj1;
-		ConcreteMarker marker2 = (ConcreteMarker) obj2;
-
-		return marker1.getDescriptionKey().compareTo(
-				marker2.getDescriptionKey());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDefaultDirection()
-	 */
-	public int getDefaultDirection() {
-		return TableComparator.ASCENDING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getPreferredWidth()
-	 */
-	public int getPreferredWidth() {
-		return 250;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldPriority.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldPriority.java
deleted file mode 100644
index b8d7206..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldPriority.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * The FieldPriority is the field for setting a tasks 
- * priority.
- *
- */
-public class FieldPriority extends AbstractField {
-
-    static final String DESCRIPTION_IMAGE_PATH = "obj16/header_priority.gif"; //$NON-NLS-1$
-
-    static final String HIGH_PRIORITY_IMAGE_PATH = "obj16/hprio_tsk.gif"; //$NON-NLS-1$
-
-    static final String LOW_PRIORITY_IMAGE_PATH = "obj16/lprio_tsk.gif"; //$NON-NLS-1$
-
-    private String description;
-
-    /**
-     * Return a new instance of the receiver.
-     */
-    public FieldPriority() {
-        description = MarkerMessages.priority_description;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getDescription()
-     */
-    public String getDescription() {
-        return description;
-    }
-    
-    /**
-	 * Get the image at path.
-	 * @param path
-	 * @return Image
-	 */
-	private Image getImage(String path){
-		return JFaceResources.getResources().createImageWithDefault(
-				IDEWorkbenchPlugin
-						.getIDEImageDescriptor(path));
-		
-	}
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getDescriptionImage()
-     */
-    public Image getDescriptionImage() {
-        return getImage(DESCRIPTION_IMAGE_PATH);
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderText()
-     */
-    public String getColumnHeaderText() {
-        return ""; //$NON-NLS-1$
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderImage()
-     */
-    public Image getColumnHeaderImage() {
-        return getDescriptionImage();
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getValue(java.lang.Object)
-     */
-    public String getValue(Object obj) {
-        return ""; //$NON-NLS-1$
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object)
-     */
-    public Image getImage(Object obj) {
-        if (obj == null || !(obj instanceof TaskMarker)) {
-            return null;
-        }
-        try {
-            int priority = ((TaskMarker) obj).getPriority();
-            if (priority == IMarker.PRIORITY_HIGH) {
-                return getImage(HIGH_PRIORITY_IMAGE_PATH);
-            }
-            if (priority == IMarker.PRIORITY_LOW) {
-                return getImage(LOW_PRIORITY_IMAGE_PATH);
-            }
-        } catch (NumberFormatException e) {
-            return null;
-        }
-        return null;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object, java.lang.Object)
-     */
-    public int compare(Object obj1, Object obj2) {
-        if (obj1 == null || obj2 == null || !(obj1 instanceof TaskMarker)
-                || !(obj2 instanceof TaskMarker)) {
-            return 0;
-        }
-        int priority1 = ((TaskMarker) obj1).getPriority();
-        int priority2 = ((TaskMarker) obj2).getPriority();
-        return priority1 - priority2;
-    }
-    
-    /* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDefaultDirection()
-	 */
-	public int getDefaultDirection() {
-		return TableComparator.DESCENDING;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getPreferredWidth()
-	 */
-	public int getPreferredWidth() {
-		return 16;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldResource.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldResource.java
deleted file mode 100644
index 9ac623b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldResource.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * FieldResource is the field for the resource.
- *
- */
-public class FieldResource extends AbstractField {
-
-    private String description;
-
-    private Image image;
-
-    /**
-     * Create a new instance of the receiver.
-     */
-    public FieldResource() {
-        description = MarkerMessages.description_resource;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getDescription()
-     */
-    public String getDescription() {
-        return description;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getDescriptionImage()
-     */
-    public Image getDescriptionImage() {
-        return image;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderText()
-     */
-    public String getColumnHeaderText() {
-        return description;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderImage()
-     */
-    public Image getColumnHeaderImage() {
-        return image;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getValue(java.lang.Object)
-     */
-    public String getValue(Object obj) {
-        if (obj == null || !(obj instanceof ConcreteMarker)) {
-            return ""; //$NON-NLS-1$
-        }
-        ConcreteMarker marker = (ConcreteMarker) obj;
-        return marker.getResourceName();
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object)
-     */
-    public Image getImage(Object obj) {
-        return null;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object, java.lang.Object)
-     */
-    public int compare(Object obj1, Object obj2) {
-        if (obj1 == null || obj2 == null || !(obj1 instanceof ConcreteMarker)
-                || !(obj2 instanceof ConcreteMarker)) {
-            return 0;
-        }
-
-        ConcreteMarker marker1 = (ConcreteMarker) obj1;
-        ConcreteMarker marker2 = (ConcreteMarker) obj2;
-
-        return marker1.getResourceName().compareTo(
-                marker2.getResourceName());
-    }
-
-    /* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDefaultDirection()
-	 */
-	public int getDefaultDirection() {
-		return TableComparator.ASCENDING;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.IField#getPreferredWidth()
-	 */
-	public int getPreferredWidth() {
-		return 75;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldSeverityAndMessage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldSeverityAndMessage.java
deleted file mode 100644
index e8326c0..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FieldSeverityAndMessage.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.jface.resource.DeviceResourceException;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-
-/**
- * The FieldSeverityAndMessage is the field that
- * displays severities and messages.
- * 
- */
-public class FieldSeverityAndMessage extends FieldMessage {
-
-	private String description;
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public FieldSeverityAndMessage() {
-		description = MarkerMessages.problemSeverity_description;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getDescription()
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object obj) {
-		if (obj == null || !(obj instanceof MarkerNode)) {
-			return null;
-		}
-
-		MarkerNode node = (MarkerNode) obj;
-		if (node.isConcrete()) {
-			if (node instanceof ProblemMarker) {
-				return Util.getImage(((ProblemMarker) obj).getSeverity());
-			}
-			return null;
-		}
-
-		try {
-			return JFaceResources
-					.getResources()
-					.createImageWithDefault(
-							IDEInternalWorkbenchImages
-									.getImageDescriptor(IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEM_CATEGORY));
-		} catch (DeviceResourceException e) {
-			return null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public int compare(Object obj1, Object obj2) {
-		if (obj1 == null || obj2 == null || !(obj1 instanceof ProblemMarker)
-				|| !(obj2 instanceof ProblemMarker)) {
-			return 0;
-		}
-		
-		ProblemMarker marker1 = (ProblemMarker) obj1;
-		ProblemMarker marker2 = (ProblemMarker) obj2;
-
-		int severity1 = marker1.getSeverity();
-		int severity2 = marker2.getSeverity();
-		if(severity1 == severity2)
-			return marker1.getDescriptionKey().compareTo(
-					marker2.getDescriptionKey());
-		return severity2 - severity1;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderImage()
-	 */
-	public Image getColumnHeaderImage() {
-		return getImage(FieldDone.DESCRIPTION_IMAGE_PATH);
-	}
-
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FilterEnablementAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FilterEnablementAction.java
deleted file mode 100644
index af65bf1..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FilterEnablementAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.swt.SWT;
-
-/**
- * The FilterEnablementAction is an action for enabling 
- * or disabling a filter.
- *
- */
-class FilterEnablementAction extends Action {
-
-	private MarkerFilter markerFilter;
-	private MarkerView markerView;
-
-	/**
-	 * Create a new action for the filter.
-	 * @param filter
-	 * @param view
-	 */
-	public FilterEnablementAction(MarkerFilter filter, MarkerView view) {
-		super(filter.getName(),SWT.CHECK);
-		setChecked(filter.isEnabled());
-		markerFilter = filter;
-		markerView = view;
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		markerFilter.setEnabled(!markerFilter.isEnabled());
-		setChecked(markerFilter.isEnabled());
-		markerView.updateForFilterChanges();
-	}
-
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FiltersAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FiltersAction.java
deleted file mode 100644
index 347fd3e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/FiltersAction.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * This action opens a Filters Dialog and notifies the Marker View if the user has
- * modified the filter via the filters dialog.
- */
-class FiltersAction extends Action {
-
-    private MarkerView view;
-
-    /**
-     * Creates the action
-     */
-    public FiltersAction(MarkerView view) {
-        super(MarkerMessages.filtersAction_title);
-        setImageDescriptor(IDEWorkbenchPlugin.getIDEImageDescriptor("elcl16/filter_ps.gif")); //$NON-NLS-1$
-        setToolTipText(MarkerMessages.filtersAction_tooltip);
-        this.view = view;
-        setEnabled(true);
-    }
-
-    /**
-     * Opens the dialog. Notifies the view if the filter has been modified.
-     */
-    public void run() {
-        view.openFiltersDialog();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/IField.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/IField.java
deleted file mode 100644
index 97ff0be..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/IField.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * IField is the definition of fields for marker views.
- *
- */
-public interface IField {
-
-    /**
-     * @return String the description of the field.
-     */
-    String getDescription();
-
-    /**
-     * @return the image associated with the description of the field or <code>null<code>.
-     */
-    Image getDescriptionImage();
-
-    /**
-     * @return The text to be displayed in the column header for this field.
-     */
-    String getColumnHeaderText();
-
-    /**
-     * @return The image to be displayed in the column header for this field or <code>null<code>.
-     */
-    Image getColumnHeaderImage();
-
-    /**
-     * @param obj
-     * @return The String value of the object for this particular field to be displayed to the user.  
-     */
-    String getValue(Object obj);
-
-    /**
-     * @param obj
-     * @return The image value of the object for this particular field to be displayed to the user
-     * or <code>null<code>.
-     */
-    Image getImage(Object obj);
-
-    /**
-     * @param obj1
-     * @param obj2
-     * @return Either:
-     * 	<li>a negative number if the value of obj1 is less than the value of obj2 for this field.
-     *  <li><code>0</code> if the value of obj1 and the value of obj2 are equal for this field.
-     *  <li>a positive number if the value of obj1 is greater than the value of obj2 for this field.
-     */
-    int compare(Object obj1, Object obj2);
-    
-    /**
-     * Get the default direction for the receiver. Return either 
-     * {@link TableComparator#ASCENDING } or {@link TableComparator#DESCENDING }
-     * @return int
-     */
-   int getDefaultDirection();
-   
-   /**
-    * Get the preferred width of the receiver.
-    * @return int
-    */
-   int getPreferredWidth();
-
-   /**
-    * Return whether not the receiver is showing.
-    * @return boolean
-    */
-   boolean isShowing();
-   
-   /**
-    * Set whether or not the receiver is showing.
-    * @param showing
-    */
-  void setShowing(boolean showing);
-   
- 
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/IFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/IFilter.java
deleted file mode 100644
index a36b7de..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/IFilter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-/**
- * Generic filtering interface.
- */
-public interface IFilter {
-
-    /**
-     * Filters the list of elements. Removes the elements that need to filtered out from the list.
-     * 
-     * @param elements
-     */
-    public Object[] filter(Object[] elements);
-
-    /**
-     * @param item
-     * @return
-     * <ul>
-     * <li><code>true</code> if the item will make it through the filter.</li>
-     * <li><code>false</code> if the item will not make it through the filter.</li>
-     * </ul>
-     */
-    public boolean select(Object item);
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/IItemsChangedListener.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/IItemsChangedListener.java
deleted file mode 100644
index 891e437..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/IItemsChangedListener.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.List;
-
-public interface IItemsChangedListener {
-
-    /**
-     * @param additions new items added
-     * @param removals items removed
-     * @param changes changed items
-     */
-    public void itemsChanged(List additions, List removals, List changes);
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/IMarkerChangedListener.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/IMarkerChangedListener.java
deleted file mode 100644
index 83ae340..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/IMarkerChangedListener.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.List;
-
-/**
- * Listener interface that listens for changes in resource markers.
- */
-public interface IMarkerChangedListener {
-
-    /**
-     * @param additions new markers added
-     * @param removals markers removed
-     * @param changes changed markers
-     */
-    public void markerChanged(List additions, List removals, List changes);
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/IMarkerResourceAdapter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/IMarkerResourceAdapter.java
deleted file mode 100644
index 8eff036..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/IMarkerResourceAdapter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * <code>IMarkerResourceAdapter</code> is an adapter interface that
- * supplies the resource to query for markers to display in the marker view
- * or any of its subclasses.
- * 
- * Implementors of this interface are typically registered with an
- * IAdapterFactory for lookup via the getAdapter() mechanism.
- */
-public interface IMarkerResourceAdapter {
-
-    /**
-     * Returns the resource to query for the markers to display
-     * for the given adaptable.
-     * 
-     * @param adaptable the adaptable being queried.
-     * @return the resource or <code>null</code> if there
-     * 	is no adapted resource for this object.
-     */
-    public IResource getAffectedResource(IAdaptable adaptable);
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ITableListener.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ITableListener.java
deleted file mode 100644
index d7f83843..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ITableListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.Collection;
-
-/**
- * 
- */
-public interface ITableListener {
-    public void contentsFound(Collection contents);
-
-    public void invalid();
-
-    public void drawable();
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerAdapter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerAdapter.java
deleted file mode 100644
index 7884d4f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerAdapter.java
+++ /dev/null
@@ -1,448 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.internal.ide.Policy;
-
-/**
- * The MarkerAdapter is the adapter for the deferred update of markers.
- * 
- * @since 3.1
- * 
- */
-public class MarkerAdapter {
-
-	class MarkerCategory extends MarkerNode {
-
-		MarkerAdapter markerAdapter;
-
-		int start;
-
-		int end;
-
-		private ConcreteMarker[] children;
-
-		private String name;
-
-		/**
-		 * Create a new instance of the receiver that has the markers between
-		 * startIndex and endIndex showing.
-		 * 
-		 * @param adapter
-		 * @param startIndex
-		 * @param endIndex
-		 */
-		MarkerCategory(MarkerAdapter adapter, int startIndex, int endIndex,
-				String categoryName) {
-			markerAdapter = adapter;
-			start = startIndex;
-			end = endIndex;
-			name = categoryName;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.MarkerNode#getChildren()
-		 */
-		public MarkerNode[] getChildren() {
-
-			if (children == null) {
-
-				// Return nothing while a build is going on as this could be
-				// stale
-				if (building) {
-					return Util.EMPTY_MARKER_ARRAY;
-				}
-
-				ConcreteMarker[] allMarkers = markerAdapter.lastMarkers
-						.toArray();
-
-				int totalSize = getDisplayedSize();
-				children = new ConcreteMarker[totalSize];
-
-				System.arraycopy(allMarkers, start, children, 0, totalSize);
-				// Sort them locally now
-				view.getTableSorter().sort(view.getViewer(), children);
-
-				for (int i = 0; i < children.length; i++) {
-					children[i].setCategory(this);
-				}
-			}
-			return children;
-
-		}
-
-		/**
-		 * Return the number of errors being displayed.
-		 * 
-		 * @return int
-		 */
-		int getDisplayedSize() {
-			if (view.getMarkerLimit() > 0) {
-				return Math.min(getTotalSize(), view.getMarkerLimit());
-			}
-			return getTotalSize();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.MarkerNode#getParent()
-		 */
-		public MarkerNode getParent() {
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.MarkerNode#getDescription()
-		 */
-		public String getDescription() {
-
-			int size = end - start + 1;
-
-			if (size <= view.getMarkerLimit()) {
-
-				if (size == 1)
-					return NLS.bind(MarkerMessages.Category_One_Item_Label,
-							new Object[] { name });
-
-				return NLS.bind(MarkerMessages.Category_Label, new Object[] {
-						name, String.valueOf(getDisplayedSize()) });
-			}
-			return NLS.bind(MarkerMessages.Category_Limit_Label, new Object[] {
-					name, String.valueOf(getDisplayedSize()),
-					String.valueOf(getTotalSize()) });
-		}
-
-		/**
-		 * Get the total size of the receiver.
-		 * 
-		 * @return int
-		 */
-		private int getTotalSize() {
-			return end - start + 1;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.MarkerNode#isConcrete()
-		 */
-		public boolean isConcrete() {
-			return false;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.MarkerNode#getConcreteRepresentative()
-		 */
-		public ConcreteMarker getConcreteRepresentative() {
-			return markerAdapter.lastMarkers.getMarker(start);
-		}
-
-		/**
-		 * Return the name of the receiver.
-		 * 
-		 * @return String
-		 */
-		public String getName() {
-			return name;
-		}
-	}
-
-	MarkerView view;
-
-	private MarkerList lastMarkers;
-
-	private MarkerCategory[] categories;
-
-	private boolean building = true;// Start with nothing until we have
-
-	// something
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param markerView
-	 */
-	MarkerAdapter(MarkerView markerView) {
-		view = markerView;
-	}
-
-	/**
-	 * Return the category sorter for the receiver. This should only be called
-	 * in hierarchal mode or there will be a ClassCastException.
-	 * 
-	 * @return CategorySorter
-	 */
-	public CategoryComparator getCategorySorter() {
-		return (CategoryComparator) view.getViewer().getComparator();
-	}
-
-	/**
-	 * Build all of the markers in the receiver.
-	 * 
-	 * @param collector
-	 * @param monitor
-	 */
-	public void buildAllMarkers(IProgressMonitor monitor) {
-		building = true;
-		MarkerList newMarkers;
-		try {
-			int markerLimit = view.getMarkerLimit();
-			monitor.beginTask(MarkerMessages.MarkerView_19,
-					markerLimit == -1 ? 60 : 100);
-			try {
-				monitor.subTask(MarkerMessages.MarkerView_waiting_on_changes);
-
-				if (monitor.isCanceled())
-					return;
-
-				monitor
-						.subTask(MarkerMessages.MarkerView_searching_for_markers);
-				SubProgressMonitor subMonitor = new SubProgressMonitor(monitor,
-						10);
-				MarkerFilter[] filters = view.getEnabledFilters();
-				if (filters.length > 0)
-					newMarkers = MarkerList.compute(filters, subMonitor, true);
-				else
-					// Grab any filter as a disabled filter gives all of them
-					newMarkers = MarkerList.compute(new MarkerFilter[] { view
-							.getAllFilters()[0] }, subMonitor, true);
-
-				if (monitor.isCanceled())
-					return;
-
-				view.refreshMarkerCounts(monitor);
-
-			} catch (CoreException e) {
-				Policy.handle(e);
-				newMarkers = new MarkerList();
-				return;
-			}
-
-			if (monitor.isCanceled())
-				return;
-
-			ViewerComparator sorter = view.getViewer().getComparator();
-
-			if (markerLimit == -1 || isShowingHierarchy()) {
-				sorter.sort(view.getViewer(), newMarkers.toArray());
-			} else {
-
-				monitor.subTask(MarkerMessages.MarkerView_18);
-				SubProgressMonitor mon = new SubProgressMonitor(monitor, 40);
-
-				newMarkers = SortUtil.getFirst(newMarkers, (Comparator) sorter,
-						markerLimit, mon);
-				if (monitor.isCanceled()) 
-					return;
-				
-				sorter.sort(view.getViewer(), newMarkers.toArray());
-			}
-
-			if (newMarkers.getSize() == 0) {
-				categories = new MarkerCategory[0];
-				lastMarkers = newMarkers;
-				monitor.done();
-				return;
-			}
-
-			monitor.subTask(MarkerMessages.MarkerView_queueing_updates);
-
-			if (monitor.isCanceled())
-				return;
-
-			if (isShowingHierarchy()) {
-				MarkerCategory[] newCategories = buildHierarchy(newMarkers, 0,
-						newMarkers.getSize() - 1, 0);
-				if (monitor.isCanceled())
-					return;
-				categories = newCategories;
-			}
-
-			lastMarkers = newMarkers;
-			monitor.done();
-		} finally {
-			building = false;
-		}
-
-	}
-
-	/**
-	 * Return whether or not a hierarchy is showing.
-	 * 
-	 * @return boolean
-	 */
-	boolean isShowingHierarchy() {
-
-		ViewerComparator sorter = view.getViewer().getComparator();
-		if (sorter instanceof CategoryComparator) {
-			return ((CategoryComparator) sorter).getCategoryField() != null;
-		}
-		return false;
-	}
-
-	/**
-	 * Break the marker up into categories
-	 * 
-	 * @param markers
-	 * @param start
-	 *            the start index in the markers
-	 * @param end
-	 *            the last index to check
-	 * @param sortIndex -
-	 *            the parent of the field
-	 * @param parent
-	 * @return MarkerCategory[] or <code>null</code> if we are at the bottom
-	 *         of the tree
-	 */
-	MarkerCategory[] buildHierarchy(MarkerList markers, int start, int end,
-			int sortIndex) {
-		CategoryComparator sorter = getCategorySorter();
-
-		if (sortIndex > 0) {
-			return null;// Are we out of categories?
-		}
-
-		Collection categories = new ArrayList();
-
-		Object previous = null;
-		int categoryStart = start;
-
-		Object[] elements = markers.getArray();
-
-		for (int i = start; i <= end; i++) {
-
-			if (previous != null) {
-				// Are we at a category boundary?
-				if (sorter.compare(previous, elements[i], sortIndex, false) != 0) {
-					categories.add(new MarkerCategory(this, categoryStart,
-							i - 1, getNameForIndex(markers, categoryStart)));
-					categoryStart = i;
-				}
-			}
-			previous = elements[i];
-
-		}
-
-		if (end >= categoryStart) {
-			categories.add(new MarkerCategory(this, categoryStart, end,
-					getNameForIndex(markers, categoryStart)));
-		}
-
-		// Flatten single categories
-		// if (categories.size() == 1) {
-		// return buildHierarchy(markers, start, end, sortIndex + 1, parent);
-		// }
-		MarkerCategory[] nodes = new MarkerCategory[categories.size()];
-		categories.toArray(nodes);
-		return nodes;
-
-	}
-
-	/**
-	 * Get the name for the category from the marker at categoryStart in
-	 * markers.
-	 * 
-	 * @param markers
-	 * @param categoryStart
-	 * @return String
-	 */
-	private String getNameForIndex(MarkerList markers, int categoryStart) {
-		return getCategorySorter().getCategoryField().getValue(
-				markers.toArray()[categoryStart]);
-	}
-
-	/**
-	 * Return the current list of markers.
-	 * 
-	 * @return MarkerList
-	 */
-	public MarkerList getCurrentMarkers() {
-		if (lastMarkers == null) {// First time?
-			view.scheduleMarkerUpdate(Util.SHORT_DELAY);
-			building = true;
-		}
-		if (building) {
-			return new MarkerList();
-		}
-		return lastMarkers;
-	}
-
-	/**
-	 * Return the elements in the adapter.
-	 * 
-	 * @param root
-	 * @return Object[]
-	 */
-	public Object[] getElements() {
-
-		if (lastMarkers == null) {// First time?
-			view.scheduleMarkerUpdate(Util.SHORT_DELAY);
-			building = true;
-		}
-		if (building) {
-			return Util.EMPTY_MARKER_ARRAY;
-		}
-		if (isShowingHierarchy() && categories != null) {
-			return categories;
-		}
-		return lastMarkers.toArray();
-	}
-
-	/**
-	 * Return whether or not the receiver has markers without scheduling
-	 * anything if it doesn't.
-	 * 
-	 * @return boolean <code>true</code> if the markers have not been
-	 *         calculated.
-	 */
-	public boolean hasNoMarkers() {
-		return lastMarkers == null;
-	}
-
-	/**
-	 * Return the categories for the receiver.
-	 * 
-	 * @return MarkerCategory[] or <code>null</code> if there are no
-	 *         categories.
-	 */
-	public MarkerCategory[] getCategories() {
-		if (building) {
-			return null;
-		}
-		return categories;
-	}
-
-	/**
-	 * Return whether or not the receiver is building.
-	 * @return boolean
-	 */
-	boolean isBuilding() {
-		return building;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerFilter.java
deleted file mode 100644
index 746243a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerFilter.java
+++ /dev/null
@@ -1,995 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * MarkerFilter is the class that defines a filter on markers in a
- * MarkerView.
- *
- */
-public class MarkerFilter implements Cloneable {
-
-	static final String TAG_ENABLED = "enabled"; //$NON-NLS-1$
-
-	
-	/**
-	 * The tag for the scope.
-	 */
-	public static final String TAG_ON_RESOURCE = "onResource"; //$NON-NLS-1$
-
-	private static final String TAG_SELECTED_TYPES = "selectedType"; //$NON-NLS-1$
-
-	private static final String TAG_WORKING_SET = "workingSet"; //$NON-NLS-1$
-
-	private static final String TAG_TYPES_DELIMITER = ":"; //$NON-NLS-1$
-
-	/**
-	 * New attribute to handle the selection status of marker types.
-	 */
-	public static final String TAG_SELECTION_STATUS = "selectionStatus"; //$NON-NLS-1$
-
-	/**
-	 * Attribute status true.
-	 */
-	public static final String SELECTED_FALSE = "false"; //$NON-NLS-1$
-
-	/**
-	 * Attribute status false.
-	 */
-	private static final String SELECTED_TRUE = "true"; //$NON-NLS-1$
-
-	/**
-	 * Constant for any element.
-	 */
-	public static final int ON_ANY = 0;
-
-	/**
-	 * Constant for any selected element only.
-	 */
-	public static final int ON_SELECTED_ONLY = 1;
-
-	/**
-	 * Constant for selected element and children.
-	 */
-	public static final int ON_SELECTED_AND_CHILDREN = 2;
-
-	/**
-	 * Constant for any element in same container.
-	 */
-	public static final int ON_ANY_IN_SAME_CONTAINER = 3;
-
-	/**
-	 * Constant for on working set.
-	 */
-	public static final int ON_WORKING_SET = 4;
-
-	static final int DEFAULT_ON_RESOURCE = ON_ANY;
-
-	static final boolean DEFAULT_ACTIVATION_STATUS = true;
-
-	protected List rootTypes = new ArrayList();
-
-	protected List selectedTypes = new ArrayList();
-
-	protected IWorkingSet workingSet;
-
-	protected int onResource;
-
-	protected boolean enabled;
-
-	private IResource[] focusResource;
-
-	private Set cachedWorkingSet;
-
-	// The human readable name for the filter
-	private String name;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param filterName
-	 *            The human readable name for the filter
-	 * @param rootTypes
-	 *            The types this filter will be applied to
-	 */
-	MarkerFilter(String filterName, String[] rootTypes) {
-
-		name = filterName;
-
-		for (int i = 0; i < rootTypes.length; i++) {
-			MarkerType type = MarkerTypesModel.getInstance().getType(
-					rootTypes[i]);
-
-			if (!this.rootTypes.contains(type)) {
-				this.rootTypes.add(type);
-			}
-		}
-		resetState();
-	}
-
-	/**
-	 * List all types known to this MarkerFilter.
-	 * 
-	 * @param types
-	 *            list to be filled in with types
-	 */
-	public void addAllSubTypes(List types) {
-		for (int i = 0; i < rootTypes.size(); i++) {
-			MarkerType rootType = (MarkerType) rootTypes.get(i);
-			addAllSubTypes(types, rootType);
-		}
-	}
-
-	private void addAllSubTypes(List types, MarkerType type) {
-		if (type == null) {
-			return;
-		}
-
-		if (!types.contains(type)) {
-			types.add(type);
-		}
-
-		MarkerType[] subTypes = type.getSubtypes();
-
-		for (int i = 0; i < subTypes.length; i++) {
-			addAllSubTypes(types, subTypes[i]);
-		}
-	}
-
-	/**
-	 * Adds all markers in the given set of resources to the given list
-	 * 
-	 * @param resultList
-	 * @param resources
-	 * @param markerTypeId
-	 * @param depth
-	 * @throws CoreException
-	 */
-	private List findMarkers(IResource[] resources, int depth, int limit,
-			IProgressMonitor mon, boolean ignoreExceptions)
-			throws CoreException {
-		if (resources == null) {
-			return Collections.EMPTY_LIST;
-		}
-
-		List resultList = new ArrayList(resources.length * 2);
-
-		// Optimization: if a type appears in the selectedTypes list along with
-		// all of its
-		// subtypes, then combine these in a single search.
-
-		// List of types that haven't been replaced by one of their supertypes
-		HashSet typesToSearch = new HashSet(selectedTypes.size());
-
-		// List of types that appeared in selectedTypes along with all of their
-		// subtypes
-		HashSet includeAllSubtypes = new HashSet(selectedTypes.size());
-
-		typesToSearch.addAll(selectedTypes);
-
-		Iterator iter = selectedTypes.iterator();
-
-		while (iter.hasNext()) {
-			MarkerType type = (MarkerType) iter.next();
-
-			Collection subtypes = Arrays.asList(type.getAllSubTypes());
-
-			if (selectedTypes.containsAll(subtypes)) {
-				typesToSearch.removeAll(subtypes);
-
-				includeAllSubtypes.add(type);
-			}
-		}
-
-		mon.beginTask(MarkerMessages.MarkerFilter_searching, typesToSearch
-				.size()
-				* resources.length);
-
-		// Use this hash set to determine if there are any resources in the
-		// list that appear along with their parent.
-		HashSet resourcesToSearch = new HashSet();
-
-		// Insert all the resources into the hashset
-		for (int idx = 0; idx < resources.length; idx++) {
-			IResource next = resources[idx];
-
-			if (!next.exists()) {
-				continue;
-			}
-
-			if (resourcesToSearch.contains(next)) {
-				mon.worked(typesToSearch.size());
-			} else {
-				resourcesToSearch.add(next);
-			}
-		}
-
-		// Iterate through all the selected resources
-		for (int resourceIdx = 0; resourceIdx < resources.length; resourceIdx++) {
-			iter = typesToSearch.iterator();
-
-			IResource resource = resources[resourceIdx];
-
-			// Skip resources that don't exist
-			if (!resource.isAccessible()) {
-				continue;
-			}
-
-			if (depth == IResource.DEPTH_INFINITE) {
-				// Determine if any parent of this resource is also in our
-				// filter
-				IResource parent = resource.getParent();
-				boolean found = false;
-				while (parent != null) {
-					if (resourcesToSearch.contains(parent)) {
-						found = true;
-					}
-
-					parent = parent.getParent();
-				}
-
-				// If a parent of this resource is also in the filter, we can
-				// skip it
-				// because we'll pick up its markers when we search the parent.
-				if (found) {
-					continue;
-				}
-			}
-
-			// Iterate through all the marker types
-			while (iter.hasNext()) {
-				MarkerType markerType = (MarkerType) iter.next();
-
-				// Only search for subtypes of the marker if we found all of its
-				// subtypes in the filter criteria.
-				IMarker[] markers = resource.findMarkers(markerType.getId(),
-						includeAllSubtypes.contains(markerType), depth);
-
-				mon.worked(1);
-
-				for (int idx = 0; idx < markers.length; idx++) {
-					ConcreteMarker marker;
-					try {
-						marker = MarkerList.createMarker(markers[idx]);
-					} catch (CoreException e) {
-						if (ignoreExceptions) {
-							continue;
-						}
-						throw e;
-
-					}
-
-					if (limit != -1 && resultList.size() >= limit) {
-						return resultList;
-					}
-
-					if (selectMarker(marker)) {
-						resultList.add(marker);
-					}
-				}
-			}
-		}
-
-		mon.done();
-
-		return resultList;
-	}
-
-	/**
-	 * Subclasses should override to determine if the given marker passes the
-	 * filter.
-	 * 
-	 * @param marker
-	 * @return <code>true</code> if the marker passes the filter and
-	 *         <code>false</code> otherwise
-	 */
-	protected boolean selectMarker(ConcreteMarker marker) {
-		return true;
-	}
-
-	/**
-	 * Searches the workspace for markers that pass this filter.
-	 * 
-	 * @return Collection of markers.
-	 */
-	Collection findMarkers(IProgressMonitor mon, boolean ignoreExceptions)
-			throws CoreException {
-
-		List unfiltered = Collections.EMPTY_LIST;
-
-		if (!isEnabled()) {
-			unfiltered = findMarkers(new IResource[] { ResourcesPlugin
-					.getWorkspace().getRoot() }, IResource.DEPTH_INFINITE, -1,
-					mon, ignoreExceptions);
-		} else {
-			// int limit = getFilterOnMarkerLimit() ? getMarkerLimit() + 1 : -1;
-			int limit = -1;
-
-			switch (getOnResource()) {
-			case ON_ANY: {
-				unfiltered = findMarkers(new IResource[] { ResourcesPlugin
-						.getWorkspace().getRoot() }, IResource.DEPTH_INFINITE,
-						limit, mon, ignoreExceptions);
-				break;
-			}
-			case ON_SELECTED_ONLY: {
-				unfiltered = findMarkers(focusResource, IResource.DEPTH_ZERO,
-						limit, mon, ignoreExceptions);
-				break;
-			}
-			case ON_SELECTED_AND_CHILDREN: {
-				unfiltered = findMarkers(focusResource,
-						IResource.DEPTH_INFINITE, limit, mon, ignoreExceptions);
-				break;
-			}
-			case ON_ANY_IN_SAME_CONTAINER: {
-				unfiltered = findMarkers(getProjects(focusResource),
-						IResource.DEPTH_INFINITE, limit, mon, ignoreExceptions);
-				break;
-			}
-			case ON_WORKING_SET: {
-				unfiltered = findMarkers(getResourcesInWorkingSet(),
-						IResource.DEPTH_INFINITE, limit, mon, ignoreExceptions);
-			}
-			}
-		}
-
-		if (unfiltered == null) {
-			unfiltered = Collections.EMPTY_LIST;
-		}
-
-		return unfiltered;
-	}
-
-	/**
-	 * Return the resources in the working set. If it is empty then return the
-	 * workspace root.
-	 * 
-	 * @return IResource[]
-	 */
-	IResource[] getResourcesInWorkingSet() {
-		if (workingSet == null) {
-			return new IResource[0];
-		}
-
-		if (workingSet.isEmpty()) {
-			return new IResource[] { ResourcesPlugin.getWorkspace().getRoot() };
-		}
-
-		IAdaptable[] elements = workingSet.getElements();
-		List result = new ArrayList(elements.length);
-
-		for (int idx = 0; idx < elements.length; idx++) {
-			IResource next = (IResource) elements[idx]
-					.getAdapter(IResource.class);
-
-			if (next != null) {
-				result.add(next);
-			}
-		}
-
-		return (IResource[]) result.toArray(new IResource[result.size()]);
-	}
-
-	/**
-	 * Returns a set of strings representing the full pathnames to every
-	 * resource directly or indirectly contained in the working set. A resource
-	 * is in the working set iff its path name can be found in this set.
-	 * 
-	 * @return Set
-	 */
-	private Set getWorkingSetAsSetOfPaths() {
-		if (cachedWorkingSet == null) {
-			HashSet result = new HashSet();
-
-			addResourcesAndChildren(result, getResourcesInWorkingSet());
-
-			cachedWorkingSet = result;
-		}
-
-		return cachedWorkingSet;
-	}
-
-	/***************************************************************************
-	 * Adds the paths of all resources in the given array to the given set.
-	 */
-	private void addResourcesAndChildren(HashSet result, IResource[] resources) {
-		for (int idx = 0; idx < resources.length; idx++) {
-
-			IResource currentResource = resources[idx];
-
-			result.add(currentResource.getFullPath().toString());
-
-			if (currentResource instanceof IContainer) {
-				IContainer cont = (IContainer) currentResource;
-
-				try {
-					addResourcesAndChildren(result, cont.members());
-				} catch (CoreException e) {
-					// Ignore errors
-				}
-			}
-
-		}
-	}
-
-	/**
-	 * Returns the set of projects that contain the given set of resources.
-	 * 
-	 * @param resources
-	 * @return IProject[]
-	 */
-	static IProject[] getProjects(IResource[] resources) {
-		if (resources == null) {
-			return new IProject[0];
-		}
-
-		Collection projects = getProjectsAsCollection(resources);
-
-		return (IProject[]) projects.toArray(new IProject[projects.size()]);
-	}
-
-	/**
-	 * Return the projects for the elements.
-	 * 
-	 * @param elements
-	 *            collection of IResource or IResourceMapping
-	 * @return Collection of IProject
-	 */
-	static Collection getProjectsAsCollection(Object[] elements) {
-		HashSet projects = new HashSet();
-
-		for (int idx = 0; idx < elements.length; idx++) {
-			if (elements[idx] instanceof IResource) {
-				projects.add(((IResource) elements[idx]).getProject());
-			} else {
-				IProject[] mappingProjects = (((ResourceMapping) elements[idx])
-						.getProjects());
-				for (int i = 0; i < mappingProjects.length; i++) {
-					projects.add(mappingProjects[i]);
-				}
-			}
-
-		}
-
-		return projects;
-	}
-
-	/**
-	 * Return whether or not the receiver would select the marker.
-	 * 
-	 * @param marker
-	 * @return boolean
-	 */
-	public boolean select(ConcreteMarker marker) {
-		if (!isEnabled()) {
-			return true;
-		}
-
-		return selectByType(marker) && selectBySelection(marker)
-				&& selectMarker(marker);
-	}
-
-	private boolean selectByType(ConcreteMarker marker) {
-		return selectedTypes.contains(MarkerTypesModel.getInstance().getType(
-				marker.getType()));
-	}
-
-	/**
-	 * Returns whether the specified marker should be filter out or not.
-	 * 
-	 * @param marker
-	 *            the marker to test
-	 * @return true=the marker should not be filtered out false=the marker
-	 *         should be filtered out
-	 */
-	private boolean selectBySelection(ConcreteMarker marker) {
-		if (onResource == ON_ANY || marker == null) {
-			return true;
-		}
-
-		if (focusResource == null) {
-			return true;
-		}
-
-		IResource resource = marker.getResource();
-
-		if (onResource == ON_WORKING_SET) {
-
-			if (resource != null) {
-				return isEnclosed(resource);
-			}
-
-		} else if (onResource == ON_ANY_IN_SAME_CONTAINER) {
-			IProject project = resource.getProject();
-
-			if (project == null) {
-				return false;
-			}
-
-			for (int i = 0; i < focusResource.length; i++) {
-				IProject selectedProject = focusResource[i].getProject();
-
-				if (selectedProject == null) {
-					continue;
-				}
-
-				if (project.equals(selectedProject)) {
-					return true;
-				}
-			}
-		} else if (onResource == ON_SELECTED_ONLY) {
-			for (int i = 0; i < focusResource.length; i++) {
-				if (resource.equals(focusResource[i])) {
-					return true;
-				}
-			}
-		} else if (onResource == ON_SELECTED_AND_CHILDREN) {
-			for (int i = 0; i < focusResource.length; i++) {
-				IResource parentResource = resource;
-
-				while (parentResource != null) {
-					if (parentResource.equals(focusResource[i])) {
-						return true;
-					}
-
-					parentResource = parentResource.getParent();
-				}
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * Returns if the given resource is enclosed by a working set element.
-	 * Previous versions of this method used IContainmentAdapter for containment
-	 * tests. For performance reasons, this is no longer possible. Code that
-	 * relies on this behavior should be updated appropriately.
-	 * 
-	 * @param element
-	 *            resource to test for enclosure by a working set element
-	 * @return true if element is enclosed by a working set element and false
-	 *         otherwise.
-	 */
-	private boolean isEnclosed(IResource element) {
-		if (workingSet == null) {
-			return false;
-		}
-
-		if (workingSet.isEmpty()) {
-			return true; // Everything is in an empty working set
-		}
-		Set workingSetPaths = getWorkingSetAsSetOfPaths();
-
-		return workingSetPaths.contains(element.getFullPath().toString());
-	}
-
-	/**
-	 * <ul>
-	 * <li><code>MarkerFilter.ON_ANY</code> if showing items associated with
-	 * any resource.</li>
-	 * <li><code>MarkerFilter.ON_SELECTED_ONLY</code> if showing items
-	 * associated with the selected resource within the workbench.</li>
-	 * <li><code>MarkerFilter.ON_SELECTED_AND_CHILDREN</code> if showing
-	 * items associated with the selected resource within the workbench and its
-	 * children.</li>
-	 * <li><code>MarkerFilter.ON_ANY_OF_SAME_PROJECT</code> if showing items
-	 * in the same project as the selected resource within the workbench.</li>
-	 * <li><code>MarkerFilter.ON_WORKING_SET</code> if showing items in some
-	 * working set.</li>
-	 * </ul>
-	 * 
-	 * @return int
-	 */
-	public int getOnResource() {
-		return onResource;
-	}
-
-	/**
-	 * Sets the type of filtering by selection.
-	 * 
-	 * @param onResource
-	 *            must be one of:
-	 *            <ul>
-	 *            <li><code>MarkerFilter.ON_ANY_RESOURCE</code></li>
-	 *            <li><code>MarkerFilter.ON_SELECTED_RESOURCE_ONLY</code></li>
-	 *            <li><code>MarkerFilter.ON_SELECTED_RESOURCE_AND_CHILDREN</code></li>
-	 *            <li><code>MarkerFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT</code></li>
-	 *            <li><code>MarkerFilter.ON_WORKING_SET</code></li>
-	 *            </ul>
-	 */
-	void setOnResource(int onResource) {
-		if (onResource >= ON_ANY && onResource <= ON_WORKING_SET) {
-			this.onResource = onResource;
-		}
-	}
-
-	/**
-	 * @return the selected resource(s) withing the workbench.
-	 */
-	IResource[] getFocusResource() {
-		return focusResource;
-	}
-
-	/**
-	 * Sets the focused resources.
-	 * 
-	 * @param resources
-	 */
-	public void setFocusResource(IResource[] resources) {
-		focusResource = resources;
-	}
-
-	/**
-	 * @return
-	 * <ul>
-	 * <li><code>true</code> if the filter is enabled.</li>
-	 * <li><code>false</code> if the filter is not enabled.</li>
-	 * </ul>
-	 */
-	public boolean isEnabled() {
-		return enabled;
-	}
-
-	/**
-	 * <b>Warning:</b> for internal package use only. Return the root marker
-	 * types.
-	 * 
-	 * @return the root marker types.
-	 */
-	public List getRootTypes() {
-		return rootTypes;
-	}
-
-	/**
-	 * <b>Warning:</b> for internal package use only. Return the selected
-	 * types.
-	 * 
-	 * @return the selected marker types to be displayed.
-	 */
-	public List getSelectedTypes() {
-		return selectedTypes;
-	}
-
-	/**
-	 * Find the typeModel entry that matches id.
-	 * 
-	 * @param id
-	 *            the ID for a marker type
-	 * @return MarkerType or <code>null</code> if it is not found.
-	 */
-	public MarkerType getMarkerType(String id) {
-		return MarkerTypesModel.getInstance().getType(id);
-	}
-
-	/**
-	 * @return the current working set or <code>null</code> if no working set
-	 *         is defined.
-	 */
-	IWorkingSet getWorkingSet() {
-		return workingSet;
-	}
-
-	/**
-	 * Sets the enablement state of the filter.
-	 */
-	void setEnabled(boolean enabled) {
-		this.enabled = enabled;
-	}
-
-	/**
-	 * Sets the current working set.
-	 */
-	void setWorkingSet(IWorkingSet workingSet) {
-		this.workingSet = workingSet;
-		cachedWorkingSet = null;
-	}
-
-	/**
-	 * Reset to the default state.
-	 */
-	void resetState() {
-		enabled = DEFAULT_ACTIVATION_STATUS;
-		onResource = DEFAULT_ON_RESOURCE;
-		selectedTypes.clear();
-		addAllSubTypes(selectedTypes);
-		setWorkingSet(null);
-	}
-
-	/**
-	 * Restore the state in the memento.
-	 * 
-	 * @param memento
-	 */
-	public final void restoreState(IMemento memento) {
-		resetState();
-		restoreFilterSettings(memento);
-
-	}
-
-	/**
-	 * Restore the state of the receiver in the supplied settings. This is kept
-	 * for backwards compatibility with 3.1 dialog settings.
-	 * 
-	 * @param settings
-	 */
-	public void restoreFilterSettings(IDialogSettings settings) {
-
-		resetState();
-
-		String setting = settings.get(TAG_ENABLED);
-
-		if (setting != null) {
-			enabled = Boolean.valueOf(setting).booleanValue();
-		}
-
-		setting = settings.get(TAG_ON_RESOURCE);
-
-		if (setting != null) {
-			try {
-				onResource = Integer.parseInt(setting);
-			} catch (NumberFormatException eNumberFormat) {
-			}
-		}
-
-		// new selection list attribute
-		// format is "id:(true|false):"
-		setting = settings.get(TAG_SELECTION_STATUS);
-
-		if (setting != null) {
-			selectedTypes.clear();
-
-			// get the complete list of types
-			List newTypes = new ArrayList();
-			addAllSubTypes(newTypes);
-
-			StringTokenizer stringTokenizer = new StringTokenizer(setting);
-
-			while (stringTokenizer.hasMoreTokens()) {
-				String id = stringTokenizer.nextToken(TAG_TYPES_DELIMITER);
-				String status = null;
-				if (stringTokenizer.hasMoreTokens()) {
-					status = stringTokenizer.nextToken(TAG_TYPES_DELIMITER);
-				}
-
-				MarkerType markerType = MarkerTypesModel.getInstance().getType(
-						id);
-				if (markerType != null) {
-					newTypes.remove(markerType);
-
-					// add the type to the selected list
-					if (!SELECTED_FALSE.equals(status)
-							&& !selectedTypes.contains(markerType)) {
-						selectedTypes.add(markerType);
-					}
-				}
-			}
-
-			// any types we know about that weren't either true or
-			// false in the selection attribute are new. By default,
-			// new marker types will be selected=true
-			for (int i = 0; i < newTypes.size(); ++i) {
-				selectedTypes.add(newTypes.get(i));
-			}
-		} else {
-			// the settings didn't contain the new selection attribute
-			// so check for the old selection attribute.
-			// format is just "id:"
-			setting = settings.get(TAG_SELECTED_TYPES);
-
-			if (setting != null) {
-				generateSelectedTypes(setting);
-			}
-
-		}
-
-		setting = settings.get(TAG_WORKING_SET);
-
-		if (setting != null) {
-			setWorkingSet(PlatformUI.getWorkbench().getWorkingSetManager()
-					.getWorkingSet(setting));
-		}
-	}
-
-	/**
-	 * Set the selected types based on the value.
-	 * 
-	 * @param selectedTypesValue
-	 */
-	void generateSelectedTypes(String selectedTypesValue) {
-		selectedTypes.clear();
-		StringTokenizer stringTokenizer = new StringTokenizer(
-				selectedTypesValue);
-
-		while (stringTokenizer.hasMoreTokens()) {
-			MarkerType markerType = getMarkerType(stringTokenizer
-					.nextToken(TAG_TYPES_DELIMITER));
-
-			if (markerType != null && !selectedTypes.contains(markerType)) {
-				selectedTypes.add(markerType);
-			}
-		}
-	}
-
-	/**
-	 * Find the markerType matching typeName
-	 * 
-	 * @param typeName
-	 * @return MarkerType
-	 */
-	MarkerType findMarkerType(String typeName) {
-		return MarkerTypesModel.getInstance().getType(typeName);
-	}
-
-	/**
-	 * Restore the state of the receiver in the supplied settings.
-	 * 
-	 * @param memento
-	 */
-	protected void restoreFilterSettings(IMemento memento) {
-		String setting = memento.getString(TAG_ENABLED);
-
-		if (setting != null) {
-			enabled = Boolean.valueOf(setting).booleanValue();
-		}
-
-		Integer resourceSetting = memento.getInteger(TAG_ON_RESOURCE);
-
-		if (resourceSetting != null) {
-			onResource = resourceSetting.intValue();
-		}
-
-		// new selection list attribute
-		// format is "id:(true|false):"
-		setting = memento.getString(TAG_SELECTION_STATUS);
-
-		if (setting != null) {
-			selectedTypes.clear();
-
-			// get the complete list of types
-			List newTypes = new ArrayList();
-			addAllSubTypes(newTypes);
-
-			StringTokenizer stringTokenizer = new StringTokenizer(setting);
-
-			while (stringTokenizer.hasMoreTokens()) {
-				String id = stringTokenizer.nextToken(TAG_TYPES_DELIMITER);
-				String status = null;
-				if (stringTokenizer.hasMoreTokens()) {
-					status = stringTokenizer.nextToken(TAG_TYPES_DELIMITER);
-				}
-
-				MarkerType markerType = MarkerTypesModel.getInstance().getType(
-						id);
-				if (markerType != null) {
-					newTypes.remove(markerType);
-
-					// add the type to the selected list
-					if (!SELECTED_FALSE.equals(status)
-							&& !selectedTypes.contains(markerType)) {
-						selectedTypes.add(markerType);
-					}
-				}
-			}
-
-			// any types we know about that weren't either true or
-			// false in the selection attribute are new. By default,
-			// new marker types will be selected=true
-			for (int i = 0; i < newTypes.size(); ++i) {
-				selectedTypes.add(newTypes.get(i));
-			}
-		} else {
-			// the settings didn't contain the new selection attribute
-			// so check for the old selection attribute.
-			// format is just "id:"
-			setting = memento.getString(TAG_SELECTED_TYPES);
-
-			if (setting != null) {
-				generateSelectedTypes(setting);
-			}
-
-		}
-
-		setting = memento.getString(TAG_WORKING_SET);
-
-		if (setting != null) {
-			setWorkingSet(PlatformUI.getWorkbench().getWorkingSetManager()
-					.getWorkingSet(setting));
-		}
-	}
-
-	/**
-	 * Save the filter settings for the receiver.
-	 * 
-	 * @param settings
-	 */
-	public void saveFilterSettings(IMemento settings) {
-
-		settings.putString(TAG_ENABLED, String.valueOf(enabled));
-		settings.putInteger(TAG_ON_RESOURCE, onResource);
-
-		String markerTypeIds = ""; //$NON-NLS-1$
-
-		List includedTypes = new ArrayList();
-		addAllSubTypes(includedTypes);
-		for (int i = 0; i < includedTypes.size(); i++) {
-			MarkerType markerType = (MarkerType) includedTypes.get(i);
-			markerTypeIds += markerType.getId() + TAG_TYPES_DELIMITER;
-			if (selectedTypes.contains(markerType)) {
-				markerTypeIds += SELECTED_TRUE + TAG_TYPES_DELIMITER;
-			} else {
-				markerTypeIds += SELECTED_FALSE + TAG_TYPES_DELIMITER;
-			}
-		}
-
-		settings.putString(TAG_SELECTION_STATUS, markerTypeIds);
-
-		if (workingSet != null) {
-			settings.putString(TAG_WORKING_SET, workingSet.getName());
-		}
-	}
-
-	/**
-	 * Get the name of the receiver
-	 * 
-	 * @return String
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Make a clone of the receiver.
-	 * 
-	 * @return MarkerFilter
-	 * @throws CloneNotSupportedException
-	 */
-	public MarkerFilter makeClone() throws CloneNotSupportedException {
-		return (MarkerFilter) this.clone();
-	}
-
-	/**
-	 * Set the selected types.
-	 * 
-	 * @param selectedTypes
-	 *            List of MarkerType.
-	 */
-	public void setSelectedTypes(List selectedTypes) {
-		this.selectedTypes = selectedTypes;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerGroup.java
deleted file mode 100644
index 70d0155..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerGroup.java
+++ /dev/null
@@ -1,658 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.internal.views.markers.MarkerSupportInternalUtilities;
-import org.eclipse.ui.views.markers.MarkerField;
-import org.eclipse.ui.views.markers.MarkerItem;
-
-/**
- * @since 3.2
- * 
- */
-public class MarkerGroup {
-
-	/**
-	 * Create a new MarkerGroup from element.
-	 * 
-	 * @param element
-	 * @return MarkerGroup
-	 */
-	public static MarkerGroup createMarkerGroup(IConfigurationElement element) {
-
-		if (element.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_ID).equals(
-				Util.TYPE_MARKER_GROUPING_ID))
-			return new TypeMarkerGroup(element.getAttribute(MarkerSupportRegistry.LABEL));
-		return new MarkerGroup(element);
-	}
-
-	class AttributeMapping extends EntryMapping {
-
-		String attribute;
-
-		String attributeValue;
-
-		AttributeMarkerGrouping grouping;
-
-		/**
-		 * Create a mapping for an attribute with name attributeName and value
-		 * value to the supplied entry.
-		 * 
-		 * @param entry
-		 * @param attributeName
-		 * @param value
-		 */
-		AttributeMapping(MarkerGroupingEntry entry, String attributeName,
-				String value, AttributeMarkerGrouping grouping) {
-			super(entry);
-			attribute = attributeName;
-			attributeValue = value;
-			this.grouping = grouping;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.FieldMarkerGroup.EntryMapping#hasAttributes()
-		 */
-		public boolean hasAttributes() {
-			return true;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.FieldMarkerGroup.EntryMapping#testAttribute(org.eclipse.ui.views.markers.internal.ConcreteMarker)
-		 */
-		public MarkerGroupingEntry testAttribute(IMarker marker) {
-			Object value;
-
-			if (!marker.exists())
-				return null;// If the marker was deleted during the update drop
-			// it
-
-			try {
-				value = marker.getAttribute(attribute);
-			} catch (CoreException e) {
-				Policy.handle(e);
-				return null;
-			}
-
-			if (value != null && attributeValue.equals(value.toString())) {
-				return groupingEntry;
-			}
-			return null;
-		}
-	}
-
-	class EntryMapping {
-		MarkerGroupingEntry groupingEntry;
-
-		/**
-		 * Create an entry mapping for the receiver.
-		 * 
-		 * @param entry
-		 */
-		EntryMapping(MarkerGroupingEntry entry) {
-			groupingEntry = entry;
-		}
-
-		/**
-		 * Return whether or not the receiver tests attributes.
-		 * 
-		 * @return boolean
-		 */
-		public boolean hasAttributes() {
-			return false;
-		}
-
-		/**
-		 * Test the attribute of the marker to find a grouping.
-		 * 
-		 * @param marker
-		 * @return MarkerGroupingEntry or <code>null</code> if there is not
-		 *         entry.
-		 */
-		public MarkerGroupingEntry testAttribute(IMarker marker) {
-			return null;
-		}
-	}
-
-	class FieldGroup implements IField {
-
-		MarkerGroup markerGroup;
-
-		private boolean showing;
-
-		FieldGroup(MarkerGroup group) {
-			markerGroup = group;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.IField#compare(java.lang.Object,
-		 *      java.lang.Object)
-		 */
-		public int compare(Object obj1, Object obj2) {
-
-			MarkerGroupingEntry entry1 = getMapping(((MarkerNode) obj1)
-					.getConcreteRepresentative());
-			MarkerGroupingEntry entry2 = getMapping(((MarkerNode) obj2)
-					.getConcreteRepresentative());
-			return entry2.getPriority() - entry1.getPriority();
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderImage()
-		 */
-		public Image getColumnHeaderImage() {
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.IField#getColumnHeaderText()
-		 */
-		public String getColumnHeaderText() {
-			return markerGroup.getTitle();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.IField#getDefaultDirection()
-		 */
-		public int getDefaultDirection() {
-			return TableComparator.ASCENDING;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.IField#getDescription()
-		 */
-		public String getDescription() {
-			return markerGroup.getTitle();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.IField#getDescriptionImage()
-		 */
-		public Image getDescriptionImage() {
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.IField#getImage(java.lang.Object)
-		 */
-		public Image getImage(Object obj) {
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.IField#getPreferredWidth()
-		 */
-		public int getPreferredWidth() {
-			return 75;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.IField#getValue(java.lang.Object)
-		 */
-		public String getValue(Object obj) {
-			MarkerNode node = (MarkerNode) obj;
-
-			if (node.isConcrete()) {
-				MarkerGroupingEntry groupingEntry = markerGroup
-						.getMapping((ConcreteMarker) node);
-				return groupingEntry.getLabel();
-			}
-			return node.getDescription();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.IField#isShowing()
-		 */
-		public boolean isShowing() {
-			return this.showing;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.internal.IField#setShowing(boolean)
-		 */
-		public void setShowing(boolean showing) {
-			this.showing = showing;
-
-		}
-
-	}
-
-	/**
-	 * GroupMarkerField is the MarkerField used for MarkerGroupungs
-	 * 
-	 * @since 3.4
-	 * 
-	 */
-	class GroupMarkerField extends MarkerField {
-
-		GroupMarkerField() {
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerField#getValue(org.eclipse.ui.internal.provisional.views.markers.api.MarkerItem)
-		 */
-		public String getValue(MarkerItem item) {
-
-			return MarkerSupportInternalUtilities.getGroupValue(MarkerGroup.this, item);
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerField#compare(org.eclipse.ui.internal.provisional.views.markers.api.MarkerItem,
-		 *      org.eclipse.ui.internal.provisional.views.markers.api.MarkerItem)
-		 */
-		public int compare(MarkerItem item1, MarkerItem item2) {
-			// Elements with markers to the top are higher values
-			if (item1.getMarker() == null) {
-				if (item2.getMarker() == null)
-					return 0;
-				return 1;
-			}
-
-			// Elements with markers to the top are higher values
-			if (item2.getMarker() == null)
-				return -1;
-
-			try {
-				return (findGroupValue(item2.getMarker().getType(),
-						item2.getMarker()).getPriority() - findGroupValue(
-						item1.getMarker().getType(), item1.getMarker())
-						.getPriority());
-
-			} catch (CoreException exception) {
-				Policy.handle(exception);
-				return 0;
-			}
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerField#getColumnHeaderText()
-		 */
-		public String getColumnHeaderText() {
-			return MarkerGroup.this.getTitle();
-		}
-
-	}
-
-	private static MarkerGroupingEntry undefinedEntry = new MarkerGroupingEntry(
-			MarkerMessages.FieldCategory_Uncategorized);
-
-	protected IField field;
-
-	protected MarkerField markerField;
-
-	private Map typesToMappings = new HashMap();
-
-	private IConfigurationElement configurationElement;
-
-	private String id;
-
-	/**
-	 * Create a new instance of the receiver called name with id identifier.
-	 * 
-	 * @param element
-	 */
-	protected MarkerGroup(IConfigurationElement element) {
-		configurationElement = element;
-		if (element != null) // Is this an internal one?
-			id = element.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_ID);
-		createFields();
-		processEntries();
-	}
-
-	/**
-	 * Process the markerContentEntries for the reciever.
-	 */
-	private void processEntries() {
-		
-		if(configurationElement == null)
-			return;
-		
-		IConfigurationElement[] markerEntryElements = configurationElement
-				.getChildren(MarkerSupportRegistry.MARKER_GROUPING_ENTRY);
-
-		IConfigurationElement[] attributeGroupingElements = configurationElement
-				.getChildren(MarkerSupportRegistry.MARKER_ATTRIBUTE_GROUPING);
-
-		Map idsToEntries = new HashMap();
-		for (int i = 0; i < markerEntryElements.length; i++) {
-			MarkerGroupingEntry entry = new MarkerGroupingEntry(
-					markerEntryElements[i]);
-			entry.setGroup(this);
-			idsToEntries.put(entry.getId(), entry);
-		}
-
-		for (int i = 0; i < attributeGroupingElements.length; i++) {
-			AttributeMarkerGrouping attributeGrouping = new AttributeMarkerGrouping(
-					attributeGroupingElements[i]);
-
-			String defaultEntryId = attributeGrouping.getDefaultGroupingEntry();
-			if (defaultEntryId != null) {
-				if (idsToEntries.containsKey(defaultEntryId)) {
-					MarkerGroupingEntry entry = (MarkerGroupingEntry) idsToEntries
-							.get(defaultEntryId);
-					entry.setAsDefault(attributeGrouping.getMarkerType());
-				} else {
-					IDEWorkbenchPlugin.log(NLS.bind(
-							"Reference to invalid markerGroupingEntry {0}",//$NON-NLS-1$
-							defaultEntryId));
-				}
-			}
-			IConfigurationElement[] mappings = attributeGrouping.getElement()
-					.getChildren(MarkerSupportRegistry.ATTRIBUTE_MAPPING);
-
-			for (int mappingIndex = 0; mappingIndex < mappings.length; mappingIndex++) {
-				String entryId = mappings[mappingIndex]
-						.getAttribute(MarkerSupportRegistry.MARKER_GROUPING_ENTRY);
-
-				if (idsToEntries.containsKey(entryId)) {
-					MarkerGroupingEntry entry = (MarkerGroupingEntry) idsToEntries
-							.get(entryId);
-					entry.getMarkerGroup().mapAttribute(
-							attributeGrouping,
-							entry,
-							mappings[mappingIndex]
-									.getAttribute(MarkerSupportRegistry.VALUE));
-				} else {
-					IDEWorkbenchPlugin.log(NLS.bind(
-							"Reference to invaild markerGroupingEntry {0}", //$NON-NLS-1$
-							defaultEntryId));
-				}
-
-			}
-		}
-
-	}
-
-	/**
-	 * Create the fields for the marker views.
-	 */
-	protected void createFields() {
-		field = new FieldGroup(this);
-		markerField = new GroupMarkerField();
-	}
-
-	/**
-	 * Add the entry for the markerType.
-	 * 
-	 * @param markerType
-	 * @param entry
-	 */
-	private void addEntry(String markerType, EntryMapping entry) {
-
-		MarkerType[] allDerived = getMarkerTypes(markerType);
-
-		for (int i = 0; i < allDerived.length; i++) {
-			Collection entries = new HashSet();
-			MarkerType type = allDerived[i];
-			if (typesToMappings.containsKey(type.getId())) {
-				entries = (Collection) typesToMappings.get(markerType);
-			} else {
-				entries = new HashSet();
-			}
-
-			entries.add(entry);
-			typesToMappings.put(type.getId(), entries);
-		}
-
-	}
-
-	/**
-	 * Find the group value. If it cannot be found in an attribute mapping then
-	 * return null;
-	 * 
-	 * @param concreteMarker
-	 * @return String or <code>null</code>
-	 */
-	private MarkerGroupingEntry findGroupValue(ConcreteMarker concreteMarker) {
-
-		String type = concreteMarker.getType();
-		IMarker marker = concreteMarker.getMarker();
-
-		return findGroupValue(type, marker);
-
-	}
-
-	/**
-	 * Find the group for the marker of the specified marker type.
-	 * 
-	 * @param type
-	 * @param marker
-	 * @return MarkerGroupingEntry
-	 */
-	public MarkerGroupingEntry findGroupValue(String type, IMarker marker) {
-		if (typesToMappings.containsKey(type)) {
-			EntryMapping defaultMapping = null;
-			Iterator mappings = ((Collection) typesToMappings.get(type))
-					.iterator();
-			while (mappings.hasNext()) {
-				EntryMapping mapping = (EntryMapping) mappings.next();
-				if (mapping.hasAttributes()) {
-					MarkerGroupingEntry entry = mapping.testAttribute(marker);
-					if (entry != null) {
-						return entry;
-					}
-				} else {
-					// If it has no attributes it is our default
-					defaultMapping = mapping;
-				}
-			}
-			if (defaultMapping != null) {
-				return defaultMapping.groupingEntry;
-			}
-
-		}
-
-		return undefinedEntry;
-	}
-
-	/**
-	 * Return the field for the receiver.
-	 * 
-	 * @return {@link IField}
-	 */
-	public IField getField() {
-		return field;
-	}
-
-	/**
-	 * Return the id of the receiver.
-	 * 
-	 * @return String
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * Get the attribute mapping for the marker
-	 * 
-	 * @param marker
-	 * @return MarkerGroupingEntry
-	 */
-	private MarkerGroupingEntry getMapping(ConcreteMarker marker) {
-
-		if (marker.getGroup() == null) {
-			marker.setGroup(findGroupValue(marker));
-		}
-		return (MarkerGroupingEntry) marker.getGroup();
-	}
-
-	/**
-	 * Return the markerField for the receiver.
-	 * 
-	 * @return MarkerField
-	 */
-	public MarkerField getMarkerField() {
-		return markerField;
-	}
-
-	/**
-	 * Return the marker types that match and are subtypes of markerType.
-	 * 
-	 * @param markerType
-	 * @return MarkerType[]
-	 */
-	private MarkerType[] getMarkerTypes(String markerType) {
-		MarkerTypesModel model = MarkerTypesModel.getInstance();
-		Collection types = new HashSet();
-
-		MarkerType type = model.getType(markerType);
-		if (type != null) {
-			types.add(type);
-			MarkerType[] subs = type.getAllSubTypes();
-			for (int j = 0; j < subs.length; j++) {
-				types.add(subs[j]);
-			}
-		}
-
-		if (types.isEmpty()) {
-			return new MarkerType[0];
-		}
-
-		MarkerType[] typesArray = new MarkerType[types.size()];
-		types.toArray(typesArray);
-		return typesArray;
-	}
-
-	/**
-	 * Return the title for the receiver.
-	 * 
-	 * @return String
-	 */
-	public String getTitle() {
-		return configurationElement.getAttribute(MarkerSupportRegistry.LABEL);
-	}
-
-	/**
-	 * Add an attributeMapping for the markerType.
-	 * 
-	 * @param attributeGrouping
-	 * @param entry
-	 * @param attributeValue
-	 */
-	public void mapAttribute(AttributeMarkerGrouping attributeGrouping,
-			MarkerGroupingEntry entry, String attributeValue) {
-		addEntry(attributeGrouping.getMarkerType(), new AttributeMapping(entry,
-				attributeGrouping.getAttribute(), attributeValue,
-				attributeGrouping));
-		attributeGrouping.addGroup(this);
-
-	}
-
-	/**
-	 * Remove the entry from all of the entries in the receiver.
-	 * 
-	 * @param entry
-	 */
-	public void remove(MarkerGroupingEntry entry) {
-		Iterator entries = typesToMappings.values().iterator();
-		Collection removeCollection = new ArrayList();
-		while (entries.hasNext()) {
-			Collection mappings = (Collection) entries.next();
-			Iterator mappingsIterator = mappings.iterator();
-			while (mappingsIterator.hasNext()) {
-				EntryMapping next = (EntryMapping) mappingsIterator.next();
-				if (next.groupingEntry.equals(entry)) {
-					removeCollection.add(next);
-				}
-
-			}
-			mappings.removeAll(removeCollection);
-			removeCollection.clear();
-		}
-
-	}
-
-	/**
-	 * Set entry and the default entry for the supplied markerType.
-	 * 
-	 * @param markerType
-	 * @param entry
-	 */
-
-	public void setAsDefault(String markerType, MarkerGroupingEntry entry) {
-		addEntry(markerType, new EntryMapping(entry));
-
-	}
-
-	/**
-	 * Unmap the attributeMarkerGrouping from the receiver.
-	 * 
-	 * @param attributeMarkerGrouping
-	 */
-	public void unmap(AttributeMarkerGrouping attributeMarkerGrouping) {
-		String type = attributeMarkerGrouping.getMarkerType();
-		Collection removed = new ArrayList();
-		Collection entries = (Collection) typesToMappings.get(type);
-		Iterator mappings = entries.iterator();
-		while (mappings.hasNext()) {
-			Object mapping = mappings.next();
-			if (mapping instanceof AttributeMapping
-					&& (((AttributeMapping) mapping).grouping == attributeMarkerGrouping)) {
-				removed.add(mapping);
-			}
-		}
-		entries.removeAll(removed);
-		if (entries.size() == 0)
-			typesToMappings.remove(type);
-
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerGroupingEntry.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerGroupingEntry.java
deleted file mode 100644
index 425f675..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerGroupingEntry.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.ui.internal.views.markers.MarkerSupportInternalUtilities;
-
-/**
- * MarkerGroupingEntry is the configuration object for the markerGroupingEntry
- * extension.
- * 
- * @since 3.2
- * 
- */
-public class MarkerGroupingEntry {
-
-	private static final String PRIORITY = "priority"; //$NON-NLS-1$
-
-	private MarkerGroup markerGroup;
-	private String label;
-	private String id;
-	private int sortPriority;
-
-	/**
-	 * Create a new instance of the receiver from element.
-	 * @param element
-	 */
-	public MarkerGroupingEntry(IConfigurationElement element) {
-		label = element.getAttribute(MarkerSupportRegistry.LABEL);
-		id = element.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_ID);
-		sortPriority = Integer.valueOf(element.getAttribute(PRIORITY))
-				.intValue();
-	}
-
-	/**
-	 * Create a new instance of the receiver with just a label.
-	 * @param label
-	 */
-	public MarkerGroupingEntry(String label) {
-		this.label = label;
-		sortPriority = 0;
-	}
-
-	/**
-	 * Set the receiver as the default grouping entry for type markerType.
-	 * 
-	 * @param markerType
-	 *            String
-	 */
-	public void setAsDefault(String markerType) {
-		markerGroup.setAsDefault(markerType, this);
-
-	}
-
-	/**
-	 * Return the id for the receiver.
-	 * 
-	 * @return String
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * Set the group for the receiver.
-	 * 
-	 * @param group
-	 */
-	public void setGroup(MarkerGroup group) {
-		markerGroup = group;
-
-	}
-
-	/**
-	 * Get the label of the receiver.
-	 * 
-	 * @return String
-	 */
-	public String getLabel() {
-		return label;
-	}
-
-	/**
-	 * Return the priority of the receiver.
-	 * 
-	 * @return int
-	 */
-	public int getPriority() {
-		return sortPriority;
-	}
-
-	/**
-	 * Return the marker group for the receiver.
-	 * 
-	 * @return FieldMarkerGroup
-	 */
-	public MarkerGroup getMarkerGroup() {
-		return markerGroup;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerLabelProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerLabelProvider.java
deleted file mode 100644
index b4bd1b9..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerLabelProvider.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-class MarkerLabelProvider extends LabelProvider implements ITableLabelProvider {
-
-    IField[] properties;
-
-    public MarkerLabelProvider(IField[] properties) {
-        this.properties = properties;
-    }
-
-    public Image getColumnImage(Object element, int columnIndex) {
-        if (element == null || !(element instanceof IMarker)
-                || properties == null || columnIndex >= properties.length) {
-			return null;
-		}
-
-        return properties[columnIndex].getImage(element);
-    }
-
-    public String getColumnText(Object element, int columnIndex) {
-        if (element == null || !(element instanceof IMarker)
-                || properties == null || columnIndex >= properties.length) {
-			return ""; //$NON-NLS-1$
-		}
-
-        return properties[columnIndex].getValue(element);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerList.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerList.java
deleted file mode 100644
index 592cfb4..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerList.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * Represents a list of ConcreteMarkers.
- */
-public class MarkerList {
-	
-	private int[] markerCounts = null;
-
-	private ConcreteMarker[] markers;
-
-	/**
-	 * Lazily created marker table - maps IMarkers onto ConcreteMarkers. Null if
-	 * not created
-	 */
-	private Map markerTable;
-
-	/**
-	 * Creates an initially empty marker list
-	 */
-	public MarkerList() {
-		this(new ConcreteMarker[0]);
-	}
-
-	public MarkerList(Collection markers) {
-		this((ConcreteMarker[]) markers.toArray(new ConcreteMarker[markers
-				.size()]));
-	}
-
-	/**
-	 * Creates a list containing the given set of markers
-	 * 
-	 * @param markers
-	 */
-	public MarkerList(ConcreteMarker[] markers) {
-		this.markers = markers;
-	}
-
-	/**
-	 * Clears any cached collation keys. Use to free up some memory if the
-	 * markers in this list won't be sorted for awhile.
-	 */
-	public void clearCache() {
-		for (int i = 0; i < markers.length; i++) {
-			ConcreteMarker marker = markers[i];
-
-			marker.clearCache();
-		}
-
-		markerTable = null;
-	}
-
-	/**
-	 * Returns the marker table or lazily creates it if it doesn't exist yet
-	 * 
-	 * @return a map of IMarker onto ConcreteMarker, containing all the
-	 *         ConcreteMarkers in the list
-	 */
-	private Map getMarkerMap() {
-		if (markerTable == null) {
-			markerTable = new HashMap();
-
-			for (int idx = 0; idx < markers.length; idx++) {
-				ConcreteMarker marker = markers[idx];
-				markerTable.put(marker.getMarker(), marker);
-			}
-		}
-
-		return markerTable;
-	}
-
-	/**
-	 * Returns an existing marker from the list that is associated with the
-	 * given IMarker
-	 * 
-	 * @param toFind
-	 *            the IMarker to lookup in the list
-	 * @return the ConcreteMarker that corresponds to the given IMarker
-	 */
-	public ConcreteMarker getMarker(IMarker toFind) {
-		return (ConcreteMarker) getMarkerMap().get(toFind);
-	}
-	
-	/**
-	 * Return the list of IMarkers contained in the receiver.
-	 * @return IMarker[]
-	 */
-	public IMarker[] getIMarkers(){
-		IMarker[] iMarkers = new IMarker[markers.length];
-		for (int i = 0; i < markers.length; i++) {
-			iMarkers[i] = markers[i].getMarker();			
-		}
-		return iMarkers;
-	}
-
-	public static ConcreteMarker createMarker(IMarker marker)
-			throws CoreException {
-		if (marker.isSubtypeOf(IMarker.TASK)) {
-			return new TaskMarker(marker);
-		} else if (marker.isSubtypeOf(IMarker.BOOKMARK)) {
-			return new BookmarkMarker(marker);
-		} else if (marker.isSubtypeOf(IMarker.PROBLEM)) {
-			return new ProblemMarker(marker);
-		} else {
-			return new ConcreteMarker(marker);
-		}
-	}
-
-	public void refresh() {
-		for (int markerIdx = 0; markerIdx < markers.length; markerIdx++) {
-			ConcreteMarker next = markers[markerIdx];
-			next.refresh();
-		}
-	}
-
-	public List asList() {
-		return Arrays.asList(markers);
-	}
-
-	public MarkerList findMarkers(Collection ofIMarker) {
-		List result = new ArrayList(ofIMarker.size());
-
-		Iterator iter = ofIMarker.iterator();
-		while (iter.hasNext()) {
-			IMarker next = (IMarker) iter.next();
-
-			ConcreteMarker marker = getMarker(next);
-			if (marker != null) {
-				result.add(marker);
-			}
-		}
-
-		return new MarkerList(result);
-	}
-
-	public static ConcreteMarker[] createMarkers(IMarker[] source)
-			throws CoreException {
-		ConcreteMarker[] result = new ConcreteMarker[source.length];
-
-		for (int idx = 0; idx < source.length; idx++) {
-			result[idx] = createMarker(source[idx]);
-		}
-
-		return result;
-	}
-
-	/**
-	 * Computes the set of markers that match the given filter
-	 * 
-	 * @param filters
-	 *            the filters to apply
-	 * @param mon
-	 *            the monitor to update
-	 * @param ignoreExceptions
-	 *            whether or not exception will be shown
-	 * @return MarkerList
-	 * @throws CoreException
-	 */
-	public static MarkerList compute(MarkerFilter[] filters,
-			IProgressMonitor mon, boolean ignoreExceptions)
-			throws CoreException {
-
-		Collection returnMarkers = new HashSet();// avoid duplicates
-
-		for (int i = 0; i < filters.length; i++) {
-			returnMarkers.addAll(filters[i].findMarkers(mon, ignoreExceptions));
-		}
-		return new MarkerList(returnMarkers);
-	}
-
-	/**
-	 * Returns a new MarkerList containing all markers in the workspace of the
-	 * specified types
-	 * 
-	 * @param types
-	 * @return IMarker[]
-	 * @throws CoreException
-	 */
-	public static IMarker[] compute(String[] types) throws CoreException {
-
-		ArrayList result = new ArrayList();
-		IResource input = ResourcesPlugin.getWorkspace().getRoot();
-
-		for (int i = 0; i < types.length; i++) {
-			IMarker[] newMarkers = input.findMarkers(types[i], true,
-					IResource.DEPTH_INFINITE);
-			result.addAll(Arrays.asList(newMarkers));
-		}
-
-		return (IMarker[]) result.toArray(new IMarker[result.size()]);
-	}
-
-	/**
-	 * Returns the markers in the list. Read-only.
-	 * 
-	 * @return an array of markers in the list
-	 */
-	public ConcreteMarker[] toArray() {
-		return markers;
-	}
-
-	/**
-	 * Returns the markers in this list. Read-only.
-	 * 
-	 * @return the markers in the list
-	 */
-	// public Collection getMarkers() {
-	// return markers;
-	// }
-	/**
-	 * Returns the number of items in the list
-	 * 
-	 * @return the number of items
-	 */
-	public int getItemCount() {
-		return markers.length;
-	}
-
-	/**
-	 * Returns the number of error markers in the list
-	 * 
-	 * @return the number of errors
-	 */
-	public int getErrors() {
-		return getMarkerCounts()[IMarker.SEVERITY_ERROR];
-	}
-
-	/**
-	 * Returns the number of info markers in the list
-	 * 
-	 * @return the number of info markers
-	 */
-	public int getInfos() {
-		return getMarkerCounts()[IMarker.SEVERITY_INFO];
-	}
-
-	/**
-	 * Returns the number of warning markers in the list
-	 * 
-	 * @return the number of warning markers
-	 */
-	public int getWarnings() {
-		return getMarkerCounts()[IMarker.SEVERITY_WARNING];
-	}
-
-	/**
-	 * Returns an array of marker counts where getMarkerCounts()[severity] is
-	 * the number of markers in the list with the given severity.
-	 * 
-	 * @return an array of marker counts
-	 */
-	private int[] getMarkerCounts() {
-		if (markerCounts == null) {
-			markerCounts = new int[] { 0, 0, 0 };
-
-			for (int idx = 0; idx < markers.length; idx++) {
-				ConcreteMarker marker = markers[idx];
-
-				if (marker instanceof ProblemMarker) {
-					int severity = ((ProblemMarker) markers[idx]).getSeverity();
-					if (severity >= 0 && severity <= 2) {
-						markerCounts[severity]++;
-					}
-				}
-
-			}
-		}
-		return markerCounts;
-	}
-
-	/**
-	 * Get the array that is the internal representation of the marker list
-	 * without making a copy.
-	 * 
-	 * @return Object[]
-	 */
-	public Object[] getArray() {
-		return markers;
-	}
-
-	/**
-	 * Get the size of the receiver.
-	 * 
-	 * @return int
-	 */
-	public int getSize() {
-		return getArray().length;
-	}
-
-	/**
-	 * Return the markers at index
-	 * 
-	 * @param index
-	 * @return ConcreteMarker
-	 */
-	public ConcreteMarker getMarker(int index) {
-		return markers[index];
-	}
-
-	/**
-	 * Add the addedMarkers to the receiver.
-	 * @param addedMarkers Collection of ConcreteMarker
-	 * @param removedMarkers Collection of ConcreteMarker
-	 */
-	public void updateMarkers(Collection addedMarkers,Collection removedMarkers) {
-		List list = new ArrayList(asList());
-		list.addAll(addedMarkers);		
-		list.removeAll(removedMarkers);	
-		markers = new ConcreteMarker[list.size()];
-		list.toArray(markers);
-	}
-	
-	/**
-	 * Refresh all of the markers in the receiver.
-	 */
-	public void refreshAll() {
-		for (int i = 0; i < markers.length; i++) {
-			markers[i].refresh();
-		}		
-	}
-
-	/**
-	 * Clear all of the group settings in the receiver.
-	 */
-	public void clearGroups() {
-		for (int i = 0; i < markers.length; i++) {
-			markers[i].setGroup(null);
-		}
-		
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerMessages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerMessages.java
deleted file mode 100644
index be9498a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerMessages.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * MarkerMessages is the class that handles the messages for the markers.
- * 
- */
-public class MarkerMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.ui.views.markers.internal.messages"; //$NON-NLS-1$
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, MarkerMessages.class);
-	}
-
-	public static String sortAction_title;
-	public static String filtersAction_title;
-	public static String filtersAction_tooltip;
-	public static String filtersSubMenu_title;
-
-	public static String sortDialog_title;
-	public static String sortDialog_label;
-	public static String sortDialog_columnLabel;
-
-	public static String sortDirectionAscending_text;
-	public static String sortDirectionAscending_text2;
-	public static String sortDirectionAscending_text3;
-	public static String sortDirectionAscending_text4;
-
-	public static String sortDirectionDescending_text;
-	public static String sortDirectionDescending_text2;
-	public static String sortDirectionDescending_text3;
-	public static String sortDirectionDescending_text4;
-
-	public static String restoreDefaults_text;
-
-	public static String Error;
-	public static String Unknown;
-
-	public static String description_message;
-	public static String description_resource;
-	public static String description_folder;
-	public static String description_lineNumber;
-	public static String description_creationTime;
-	public static String description_markerId;
-	public static String description_type;
-
-	public static String label_lineNumber;
-
-	public static String openAction_title;
-	public static String copyAction_title;
-	public static String pasteAction_title;
-	public static String deleteAction_title;
-	public static String deleteAction_tooltip;
-	public static String selectAllAction_title;
-	public static String selectAllAction_calculating;
-	public static String selectAllAction_applying;
-	public static String propertiesAction_title;
-	
-	public static String deleteActionConfirmTitle;
-	public static String deleteActionConfirmMessage;
-
-	public static String filtersDialog_title;
-	public static String configureFiltersCommand_title;
-	public static String configureFiltersDialog_title;
-
-	public static String filtersDialog_showItemsOfType;
-	public static String filtersDialog_anyResource;
-	public static String filtersDialog_anyResourceInSameProject;
-	public static String filtersDialogDeselectedFiltersTitle;
-	public static String filtersDialogDeselectedFiltersMessage;
-	public static String filtersDialog_selectedResource;
-	public static String filtersDialog_selectedAndChildren;
-	public static String filtersDialog_workingSet;
-	public static String filtersDialog_workingSetSelect;
-	public static String filtersDialog_noWorkingSet;
-	public static String filtersDialog_currentWorkingSet;
-	public static String filtersDialog_selectAll;
-	public static String filtersDialog_deselectAll;
-	public static String filtersDialog_selectAllTypes;
-	public static String filtersDialog_deselectAllTypes;
-	public static String filtersDialog_descriptionLabel;
-	public static String filtersDialog_contains;
-	public static String filtersDialog_doesNotContain;
-	public static String filtersDialog_entriesTitle;
-	public static String filtersDialog_severityLabel;
-	public static String filtersDialog_filterOnSeverity;
-	public static String filtersDialog_severityError;
-	public static String filtersDialog_severityWarning;
-	public static String filtersDialog_severityInfo;
-	public static String filtersDialog_priorityLabel;
-	public static String filtersDialog_priorityHigh;
-	public static String filtersDialog_priorityNormal;
-	public static String filtersDialog_priorityLow;
-	public static String filtersDialog_statusLabel;
-	public static String filtersDialog_statusComplete;
-	public static String filtersDialog_statusIncomplete;
-	public static String filtersDialog_conflictingName;
-
-	public static String filtersDialog_scopeTitle;
-	public static String filtersDialog_typesTitle;
-	public static String filtersDialog_completionTitle;
-	public static String filtersDialog_priorityTitle;
-
-	public static String propertiesDialog_creationTime_text;
-	public static String propertiesDialog_description_text;
-	public static String propertiesDialog_folder_text;
-	public static String propertiesDialog_location_text;
-	public static String propertiesDialog_resource_text;
-	public static String propertiesDialog_title;
-	public static String propertiesDialog_severityLabel;
-	public static String propertiesDialog_errorLabel;
-	public static String propertiesDialog_warningLabel;
-	public static String propertiesDialog_infoLabel;
-	public static String propertiesDialog_noseverityLabel;
-	public static String propertiesDialog_priority;
-	public static String propertiesDialog_priorityHigh;
-	public static String propertiesDialog_priorityNormal;
-	public static String propertiesDialog_priorityLow;
-	public static String propertiesDialog_completed;
-
-	public static String filter_matchedMessage;
-	public static String filter_itemsMessage;
-	public static String problem_filter_matchedMessage;
-
-	public static String errorModifyingBookmark;
-	public static String errorModifyingTask;
-
-	public static String problemSeverity_description;
-	public static String problem_statusSummaryBreakdown;
-	public static String marker_statusSummarySelected;
-	public static String errorsAndWarningsSummaryBreakdown;
-
-	public static String deleteCompletedAction_title;
-
-	public static String markCompletedAction_title;
-	public static String markCompletedHandler_task;
-
-	public static String resolveMarkerAction_title;
-	public static String resolveMarkerAction_dialogTitle;
-	public static String resolveMarkerAction_computationAction;
-	public static String resolveMarkerAction_computationManyAction;
-
-	public static String deleteCompletedTasks_dialogTitle;
-	public static String deleteCompletedTasks_noneCompleted;
-	public static String deleteCompletedTasks_permanentPlural;
-	public static String deleteCompletedTasks_permanentSingular;
-	public static String deleteCompletedTasks_errorMessage;
-
-	public static String addGlobalTaskAction_title;
-	public static String addGlobalTaskAction_tooltip;
-
-	public static String addGlobalTaskDialog_title;
-
-	public static String completion_description;
-	public static String priority_description;
-	public static String severity_description;
-
-	public static String priority_high;
-	public static String priority_normal;
-	public static String priority_low;
-
-	public static String CopyToClipboardProblemDialog_title;
-	public static String CopyToClipboardProblemDialog_message;
-
-	public static String MarkerFilter_searching;
-
-	public static String MarkerView_waiting_on_changes;
-	public static String MarkerView_searching_for_markers;
-	public static String MarkerView_refreshing_counts;
-	public static String MarkerView_queueing_updates;
-	public static String MarkerView_processUpdates;
-
-	public static String MarkerView_18;
-	public static String MarkerView_19;
-	public static String SortUtil_finding_first;
-	public static String SortUtil_partitioning;
-	public static String OpenMarker_errorTitle;
-	public static String PasteMarker_errorTitle;
-	public static String RemoveMarker_errorTitle;
-
-	public static String MarkerFilter_defaultFilterName;
-	public static String MarkerFilter_newFilterName;
-	public static String MarkerFilter_filtersTitle;
-	public static String MarkerFilter_addFilterName;
-	public static String MarkerFilter_deleteSelectedName;
-	public static String MarkerFilter_showAllCommand_title;
-	public static String MarkerFilter_ConfigureContentsCommand_title;
-
-	public static String MarkerFilterDialog_title;
-	public static String MarkerFilterDialog_message;
-	public static String MarkerFilterDialog_emptyMessage;
-
-	public static String MarkerFilterDialog_errorTitle;
-	public static String MarkerFilterDialog_failedFilterMessage;
-
-	public static String MarkerPreferences_DialogTitle;
-	public static String MarkerPreferences_MarkerLimits;
-	public static String MarkerPreferences_VisibleItems;
-	public static String MarkerPreferences_MoveLeft;
-	public static String MarkerPreferences_MoveRight;
-	public static String MarkerPreferences_ColumnGroupTitle;
-	public static String MarkerPreferences_VisibleColumnsTitle;
-	public static String MarkerPreferences_HiddenColumnsTitle;
-
-	public static String ProblemFilterDialog_System_Filters_Title;
-	public static String ProblemFilterDialog_All_Problems;
-	public static String ProblemFilterDialog_Selected_Types;
-	public static String ProblemFilterDialog_Info_Severity;
-	public static String ProblemFilterDialog_Warning_Severity;
-	public static String ProblemFilterDialog_Error_Severity;
-	public static String ProblemFilterDialog_Contains_Description;
-	public static String ProblemFilterDialog_Does_Not_Contain_Description;
-	public static String ProblemFilterDialog_any;
-	public static String ProblemFilterDialog_sameContainer;
-	public static String ProblemFilterDialog_selectedAndChildren;
-	public static String ProblemFilterDialog_selected;
-	public static String ProblemFilterDialog_workingSet;
-
-	public static String ProblemFilterRegistry_nullType;
-
-	public static String FieldMessage_NullMessage;
-	public static String FieldCategory_Uncategorized;
-	public static String FieldMessage_WrongType;
-	public static String Category_Label;
-	public static String Category_Limit_Label;
-	public static String Category_One_Item_Label;
-
-	public static String MarkerResolutionDialog_Fixing;
-	public static String MarkerResolutionDialog_Description;
-	public static String MarkerResolutionDialog_Problems_List_Title;
-	public static String MarkerResolutionDialog_Problems_List_Resource;
-	public static String MarkerResolutionDialog_Problems_List_Location;
-	public static String MarkerResolutionDialog_Resolutions_List_Title;
-	public static String MarkerResolutionDialog_CannotFixTitle;
-	public static String MarkerResolutionDialog_CannotFixMessage;
-	public static String MarkerResolutionDialog_NoResolutionsFound;
-
-	public static String MarkerResolutionDialog_Title;
-	public static String MarkerResolutionDialog_CalculatingTask;
-	public static String MarkerResolutionDialog_WorkingSubTask;
-
-	public static String MarkerResolutionDialog_AddOthers;
-
-	public static String ProblemView_GroupByMenu;
-	public static String ProblemView_Type;
-	public static String ProblemView_None;
-	public static String ProblemView_UpdateCategoryJob;
-
-	public static String Util_ProjectRoot;
-	public static String Util_WorkspaceRoot;
-
-	public static String DialogMarkerProperties_CreateMarker;
-	public static String DialogMarkerProperties_ModifyMarker;
-	public static String DialogMarkerProperties_Create;
-	public static String DialogMarkerProperties_Modify;
-
-	public static String DialogTaskProperties_CreateTask;
-
-	public static String modifyBookmark_title;
-	public static String modifyTask_title;
-
-	public static String qualifiedMarkerCommand_title;
-	public static String task_title;
-	public static String problem_title;
-	public static String bookmark_title;
-
-	public static String PasteHandler_title;
-
-	public static String AND_Title;
-	public static String OR_Title;
-
-	public static String ContentGenerator_NoGrouping;
-	public static String newViewTitle;
-	public static String NewViewHandler_dialogTitle;
-	public static String NewViewHandler_dialogMessage;
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerNode.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerNode.java
deleted file mode 100644
index 408293a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerNode.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-/**
- * The MarkerNode class is the class that handles category nodes and 
- * concrete markers.
- *
- */
-public abstract class MarkerNode {
-
-	/**
-	 * Get the children of the node.
-	 * @return MarkerNode[]
-	 */
-	public abstract MarkerNode[] getChildren();
-
-	/**
-	 * Return the parent node or <code>null</code> if this is a top
-	 * level element.
-	 * @return MarkerNode
-	 */
-	public abstract MarkerNode getParent() ;
-
-	/**
-	 * Return whether or not this is a concrete node
-	 * @return boolean
-	 */
-	public abstract boolean isConcrete();
-
-	/**
-	 * Return the description of the receiver.
-	 * @return String
-	 */
-	public abstract String getDescription() ;
-
-	/**
-	 * Get a concrete marker from the receiver. If the receiver
-	 * is concrete return the receiver otherwise return one of the
-	 * concrete markers it contains.
-	 * @return ConcreteMarker
-	 */
-	public abstract ConcreteMarker getConcreteRepresentative();
-	
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerNodeRefreshRecord.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerNodeRefreshRecord.java
deleted file mode 100644
index 1b6be7c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerNodeRefreshRecord.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-class MarkerNodeRefreshRecord{
-	Collection removedMarkers;
-	Collection addedMarkers;
-	Collection changedMarkers;
-	
-	/**
-	 * Create a new instance of the receiver with the supplied markers.
-	 * @param removed
-	 * @param added
-	 * @param changed
-	 */
-	MarkerNodeRefreshRecord(Collection removed, Collection added, Collection changed){
-		removedMarkers = new ArrayList(removed);
-		addedMarkers =  new ArrayList(added);
-		changedMarkers =  new ArrayList(changed);
-	}
-
-	/**
-	 * Add the node to the list of removals.
-	 * @param node
-	 */
-	public void remove(MarkerNode node) {
-		removedMarkers.add(node);
-		
-	}
-	
-	/**
-	 * Add the node to the list of adds.
-	 * @param node
-	 */
-	public void add(MarkerNode node) {
-		addedMarkers.add(node);
-		
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerResolutionDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerResolutionDialog.java
deleted file mode 100644
index 9921f56..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerResolutionDialog.java
+++ /dev/null
@@ -1,758 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Hashtable;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-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.ListViewer;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.wizard.ProgressMonitorPart;
-import org.eclipse.osgi.util.NLS;
-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.graphics.Image;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-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.swt.widgets.TableColumn;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.ui.views.markers.WorkbenchMarkerResolution;
-
-/**
- * The MarkerResolutionDialog is the dialog used to select a marker resolution.
- * 
- * @since 3.2
- * 
- */
-public class MarkerResolutionDialog extends TitleAreaDialog {
-
-	private IMarker originalMarker;
-
-	private IMarkerResolution[] resolutions;
-
-	private CheckboxTableViewer markersTable;
-
-	private ListViewer resolutionsList;
-
-	private ProgressMonitorPart progressPart;
-
-	private MarkerView markerView;
-
-	private ViewerComparator resolutionsComparator;
-
-	private boolean calculatingResolutions;
-
-	private boolean progressCancelled = false;
-
-	private Button addMatching;
-
-	private Hashtable markerMap = new Hashtable(0);
-
-	/**
-	 * Create a new instance of the receiver with the given resolutions.
-	 * 
-	 * @param shell
-	 * @param marker
-	 *            the marker to show
-	 * @param newResolutions
-	 * @param view
-	 *            the viewer that is showing these errors
-	 */
-	public MarkerResolutionDialog(Shell shell, IMarker marker,
-			IMarkerResolution[] newResolutions, MarkerView view) {
-		super(shell);
-		initializeResolutionsSorter();
-		resolutionsComparator.sort(view.getViewer(), newResolutions);
-		resolutions = newResolutions;
-		originalMarker = marker;
-		markerView = view;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(MarkerMessages.resolveMarkerAction_dialogTitle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-
-		initializeDialogUnits(parent);
-
-		setTitleImage(JFaceResources
-				.getResources()
-				.createImageWithDefault(
-						IDEInternalWorkbenchImages
-								.getImageDescriptor(IDEInternalWorkbenchImages.IMG_DLGBAN_QUICKFIX_DLG)));
-
-		Composite mainArea = (Composite) super.createDialogArea(parent);
-
-		// Create a new composite as there is the title bar seperator
-		// to deal with
-		Composite control = new Composite(mainArea, SWT.NONE);
-		control.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
-		FormLayout layout = new FormLayout();
-		layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
-		layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-		layout.spacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		control.setLayout(layout);
-
-		Label resolutionsLabel = new Label(control, SWT.NONE);
-		resolutionsLabel
-				.setText(MarkerMessages.MarkerResolutionDialog_Resolutions_List_Title);
-
-		resolutionsLabel.setLayoutData(new FormData());
-
-		resolutionsList = new ListViewer(control, SWT.BORDER | SWT.SINGLE
-				| SWT.V_SCROLL);
-		resolutionsList.setContentProvider(new IStructuredContentProvider() {
-			public Object[] getElements(Object inputElement) {
-				return resolutions;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-
-			}
-		});
-
-		resolutionsList.setLabelProvider(new LabelProvider() {
-			public String getText(Object element) {
-				return ((IMarkerResolution) element).getLabel();
-			}
-		});
-
-		resolutionsList
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-					 */
-					public void selectionChanged(SelectionChangedEvent event) {
-
-						WorkbenchMarkerResolution resolution = getSelectedWorkbenchResolution();
-						if (resolution == null
-								|| markerMap.containsKey(resolution))
-							addMatching.setEnabled(false);
-						else
-							addMatching.setEnabled(true);
-						markersTable.refresh();
-					}
-				});
-
-		resolutionsList.setInput(this);
-
-		resolutionsList.setComparator(resolutionsComparator);
-
-		FormData listData = new FormData();
-		listData.top = new FormAttachment(resolutionsLabel, 0);
-		listData.left = new FormAttachment(0);
-		listData.right = new FormAttachment(100, 0);
-		listData.height = convertHeightInCharsToPixels(10);
-		resolutionsList.getControl().setLayoutData(listData);
-
-		Label title = new Label(control, SWT.NONE);
-		title
-				.setText(MarkerMessages.MarkerResolutionDialog_Problems_List_Title);
-		FormData labelData = new FormData();
-		labelData.top = new FormAttachment(resolutionsList.getControl(), 0);
-		labelData.left = new FormAttachment(0);
-		title.setLayoutData(labelData);
-
-		Composite buttons = createTableButtons(control);
-		FormData buttonData = new FormData();
-		buttonData.top = new FormAttachment(title, 0);
-		buttonData.right = new FormAttachment(100);
-		buttonData.height = convertHeightInCharsToPixels(10);
-		buttons.setLayoutData(buttonData);
-
-		createMarkerTable(control);
-
-		FormData tableData = new FormData();
-		tableData.top = new FormAttachment(buttons, 0, SWT.TOP);
-		tableData.left = new FormAttachment(0);
-		tableData.right = new FormAttachment(buttons, 0);
-		tableData.height = convertHeightInCharsToPixels(10);
-		markersTable.getControl().setLayoutData(tableData);
-
-		progressPart = new ProgressMonitorPart(control, new GridLayout());
-
-		FormData progressData = new FormData();
-		progressData.top = new FormAttachment(markersTable.getControl(), 0);
-		progressData.left = new FormAttachment(0);
-		progressData.right = new FormAttachment(100, 0);
-		progressPart.setLayoutData(progressData);
-
-		Dialog.applyDialogFont(control);
-
-		String message = NLS.bind(
-				MarkerMessages.MarkerResolutionDialog_Description, Util
-						.getProperty(IMarker.MESSAGE, originalMarker));
-		if (message.length() > 50) {
-			// Add a carriage return in the middle if we can
-			int insertionIndex = chooseWhitespace(message);
-			if (insertionIndex > 0) {
-				StringBuffer buffer = new StringBuffer();
-				buffer.append(message.substring(0, insertionIndex));
-				buffer.append("\n"); //$NON-NLS-1$
-				buffer.append(message.substring(insertionIndex, message
-						.length()));
-				message = buffer.toString();
-			}
-		}
-
-		setMessage(message);
-		return mainArea;
-
-	}
-
-	/**
-	 * Choose a good whitespace position for a page break. Start in the middle
-	 * of the message.
-	 * 
-	 * @param message
-	 * @return int -1 if there is no whitespace to choose.
-	 */
-	private int chooseWhitespace(String message) {
-
-		for (int i = message.length() / 2; i < message.length(); i++) {
-			if (Character.isWhitespace(message.charAt(i)))
-				return i;
-		}
-		return -1;
-	}
-
-	/**
-	 * Create the resolutions sorter.
-	 */
-	private void initializeResolutionsSorter() {
-		resolutionsComparator = new ViewerComparator() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public int compare(Viewer viewer, Object e1, Object e2) {
-				return ((IMarkerResolution) e1).getLabel().compareTo(
-						((IMarkerResolution) e1).getLabel());
-			}
-		};
-	}
-
-	/**
-	 * Create the buttons for the table.
-	 * 
-	 * @param control
-	 * @return Composite
-	 */
-	private Composite createTableButtons(Composite control) {
-
-		Composite buttonComposite = new Composite(control, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
-		buttonComposite.setLayout(layout);
-
-		Button selectAll = new Button(buttonComposite, SWT.PUSH);
-		selectAll.setText(MarkerMessages.selectAllAction_title);
-		selectAll.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false));
-
-		selectAll.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent arg0) {
-				markersTable.setAllChecked(true);
-				setComplete(!resolutionsList.getSelection().isEmpty());
-			}
-		});
-
-		Button deselectAll = new Button(buttonComposite, SWT.PUSH);
-		deselectAll.setText(MarkerMessages.filtersDialog_deselectAll);
-		deselectAll
-				.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false));
-
-		deselectAll.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent arg0) {
-				markersTable.setAllChecked(false);
-				setComplete(false);
-			}
-		});
-
-		addMatching = new Button(buttonComposite, SWT.PUSH);
-		addMatching.setText(MarkerMessages.MarkerResolutionDialog_AddOthers);
-		addMatching
-				.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false));
-		addMatching.setEnabled(true);
-		addMatching.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent arg0) {
-
-				WorkbenchMarkerResolution selected = getSelectedWorkbenchResolution();
-				if (selected == null) {
-					return;
-				}
-
-				if (addMatchingMarkers(selected)) {
-					addMatching.setEnabled(false);
-				}
-			}
-		});
-
-		return buttonComposite;
-	}
-
-	/**
-	 * Return the single selected WorkbenchMarkerResolution if there is one.
-	 * 
-	 * @return WorkbenchMarkerResolution or <code>null</code> if there is no
-	 *         selection or the selection is not a WorkbenchMarkerResolution.
-	 */
-	private WorkbenchMarkerResolution getSelectedWorkbenchResolution() {
-		Object selection = getSelectedResolution();
-		if (selection == null
-				|| !(selection instanceof WorkbenchMarkerResolution)) {
-			return null;
-		}
-		return (WorkbenchMarkerResolution) selection;
-
-	}
-
-	/**
-	 * Return the marker resolution that is currenly selected/
-	 * 
-	 * @return IMarkerResolution or <code>null</code> if there is no
-	 *         selection.
-	 */
-	private IMarkerResolution getSelectedResolution() {
-		ISelection selection = resolutionsList.getSelection();
-		if (!(selection instanceof IStructuredSelection)) {
-			return null;
-		}
-
-		Object first = ((IStructuredSelection) selection).getFirstElement();
-
-		return (IMarkerResolution) first;
-
-	}
-
-	/**
-	 * Add all of the markers that have resolutions compatible with the
-	 * receiver.
-	 * 
-	 * @return boolean <code>true</code> if the operation completed.
-	 */
-	protected boolean addMatchingMarkers(
-			final WorkbenchMarkerResolution resolution) {
-
-		calculatingResolutions = true;
-		progressPart.beginTask(
-				MarkerMessages.MarkerResolutionDialog_CalculatingTask, 100);
-
-		progressPart.worked(10);
-		if (progressCancelled()) {
-			calculatingResolutions = false;
-			return false;
-		}
-
-		progressPart.subTask(NLS.bind(
-				MarkerMessages.MarkerResolutionDialog_WorkingSubTask,
-				resolution.getLabel()));
-
-		BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see java.lang.Runnable#run()
-			 */
-			public void run() {
-				IMarker[] others = resolution.findOtherMarkers(markerView
-						.getCurrentMarkers().getIMarkers());
-
-				Collection currentMarkers = new ArrayList();
-				currentMarkers.add(originalMarker);
-
-				for (int i = 0; i < others.length; i++) {
-					currentMarkers.add(others[i]);
-				}
-
-				markerMap.put(resolution, currentMarkers);
-
-				progressPart.worked(90);
-				progressPart.done();
-				progressCancelled = false;
-				calculatingResolutions = false;
-				markersTable.refresh();
-
-			}
-		});
-
-		return true;
-	}
-
-	/**
-	 * Spin the event loop and see if the cancel button was pressed. If it was
-	 * then clear the flags and return <code>true</code>.
-	 * 
-	 * @return boolean
-	 */
-	private boolean progressCancelled() {
-		getShell().getDisplay().readAndDispatch();
-		if (progressCancelled) {
-			progressCancelled = false;
-			calculatingResolutions = false;
-			progressPart.done();
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Create the table for the markers/
-	 * 
-	 * @param control
-	 */
-	private void createMarkerTable(Composite control) {
-		markersTable = CheckboxTableViewer.newCheckList(control, SWT.BORDER
-				| SWT.V_SCROLL);
-
-		createTableColumns();
-
-		markersTable.setContentProvider(new IStructuredContentProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				IMarkerResolution selected = getSelectedResolution();
-				if (selected == null) {
-					return new Object[0];
-				}
-
-				if (markerMap.containsKey(selected)) {
-					return ((Collection) markerMap.get(selected)).toArray();
-				}
-				return new IMarker[] { originalMarker };
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-
-			}
-		});
-
-		markersTable.setLabelProvider(new ITableLabelProvider() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object,
-			 *      int)
-			 */
-			public Image getColumnImage(Object element, int columnIndex) {
-				if (columnIndex == 0)
-					return Util.getImage(((IMarker) element).getAttribute(
-							IMarker.SEVERITY, -1));
-				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 Util.getResourceName((IMarker) element);
-				int line = ((IMarker) element).getAttribute(
-						IMarker.LINE_NUMBER, -1);
-				if (line < 0) {
-					return MarkerMessages.Unknown;
-				}
-				return NLS.bind(MarkerMessages.label_lineNumber, Integer
-						.toString(line));
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-			 */
-			public void addListener(ILabelProviderListener listener) {
-				// do nothing
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-			 */
-			public void dispose() {
-				// do nothing
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
-			 *      java.lang.String)
-			 */
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-			 */
-			public void removeListener(ILabelProviderListener listener) {
-				// do nothing
-
-			}
-		});
-
-		markersTable.addCheckStateListener(new ICheckStateListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
-			 */
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				if (event.getChecked() == true) {
-					setComplete(true);
-				} else {
-					setComplete(markersTable.getCheckedElements().length > 0);
-				}
-
-			}
-		});
-
-		markersTable.setInput(this);
-		markersTable.setAllChecked(true);
-	}
-
-	/**
-	 * Create the table columns for the receiver.
-	 */
-	private void createTableColumns() {
-		TableLayout layout = new TableLayout();
-
-		Table table = markersTable.getTable();
-		table.setLayout(layout);
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-
-		layout.addColumnData(new ColumnWeightData(70, true));
-		TableColumn tc = new TableColumn(table, SWT.NONE, 0);
-		tc
-				.setText(MarkerMessages.MarkerResolutionDialog_Problems_List_Location);
-		layout.addColumnData(new ColumnWeightData(30, true));
-		tc = new TableColumn(table, SWT.NONE, 0);
-		tc
-				.setText(MarkerMessages.MarkerResolutionDialog_Problems_List_Resource);
-
-	}
-
-	/**
-	 * Set the dialog to be complete.
-	 * 
-	 * @param complete
-	 */
-	protected void setComplete(boolean complete) {
-		getButton(IDialogConstants.OK_ID).setEnabled(complete);
-
-	}
-
-	/**
-	 * Return all of the resolutions to choose from in the receiver.
-	 * 
-	 * @return IMarkerResolution[]
-	 */
-	public IMarkerResolution[] getResolutions() {
-		return resolutions;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#create()
-	 */
-	public void create() {
-		super.create();
-		setTitle(MarkerMessages.MarkerResolutionDialog_Title);
-		resolutionsList.getList().select(0);
-		markersTable.refresh();
-		markersTable.setAllChecked(true);
-		setComplete(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		IMarkerResolution resolution = getSelectedResolution();
-		if (resolution == null) {
-			return;
-		}
-
-		Object[] checked = markersTable.getCheckedElements();
-
-		progressPart.beginTask(MarkerMessages.MarkerResolutionDialog_Fixing,
-				checked.length + 1);
-		progressPart.worked(1);
-
-		calculatingResolutions = true;
-
-		if (resolution instanceof WorkbenchMarkerResolution) {
-
-			IMarker[] markers = new IMarker[checked.length];
-			System.arraycopy(checked, 0, markers, 0, checked.length);
-			((WorkbenchMarkerResolution) resolution).run(markers,
-					new SubProgressMonitor(progressPart, checked.length));
-		} else {
-
-			// Allow paint events and wake up the button
-			getShell().getDisplay().readAndDispatch();
-			if (!progressCancelled() && checked.length == 1) {
-
-				// There will only be one
-				IMarker marker = (IMarker) checked[0];
-
-				progressPart.subTask(Util.getProperty(IMarker.MESSAGE, marker));
-				resolution.run(marker);
-				progressPart.worked(1);
-			}
-
-		}
-
-		calculatingResolutions = false;
-		progressPart.done();
-		progressCancelled = false;
-		super.okPressed();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
-	 */
-	protected void cancelPressed() {
-		if (calculatingResolutions) {
-			progressCancelled = true;
-			progressPart.setCanceled(true);
-			return;
-		}
-		super.cancelPressed();
-	}
-	
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jface.dialogs.Dialog#isResizable()
-     */
-    protected boolean isResizable() {
-    	return true;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerSelectionProviderAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerSelectionProviderAction.java
deleted file mode 100644
index 33af605..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerSelectionProviderAction.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.SelectionProviderAction;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * MarkerSelectionProviderAction is the abstract super class of the selection
- * provider actions used by marker views.
- * 
- */
-public abstract class MarkerSelectionProviderAction extends
-		SelectionProviderAction {
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param provider
-	 * @param text
-	 */
-	public MarkerSelectionProviderAction(ISelectionProvider provider,
-			String text) {
-		super(provider, text);
-
-	}
-
-	/**
-	 * Get the selected markers in the receiver.
-	 * 
-	 * @return IMarker[]
-	 */
-	IMarker[] getSelectedMarkers() {
-
-		return getSelectedMarkers(getStructuredSelection());
-	}
-
-	/**
-	 * Return the selected markers for the structured selection.
-	 * 
-	 * @param structured
-	 *            IStructuredSelection
-	 * @return IMarker[]
-	 */
-	IMarker[] getSelectedMarkers(IStructuredSelection structured) {
-		Object[] selection = structured.toArray();
-		ArrayList markers = new ArrayList();
-		for (int i = 0; i < selection.length; i++) {
-			Object object = selection[i];
-			if (!(object instanceof MarkerNode)) {
-				return new IMarker[0];// still pending
-			}
-			MarkerNode marker = (MarkerNode) object;
-			if (marker.isConcrete()) {
-				markers.add(((ConcreteMarker) object).getMarker());
-			}
-		}
-
-		return (IMarker[]) markers.toArray(new IMarker[markers.size()]);
-	}
-
-	/**
-	 * Get the selected marker in the receiver.
-	 * 
-	 * @return IMarker
-	 */
-	IMarker getSelectedMarker() {
-
-		ConcreteMarker selection = (ConcreteMarker) getStructuredSelection()
-				.getFirstElement();
-		return selection.getMarker();
-	}
-
-	/**
-	 * Execute the specified undoable operation
-	 */
-	void execute(IUndoableOperation operation, String title,
-			IProgressMonitor monitor, IAdaptable uiInfo) {
-		try {
-			PlatformUI.getWorkbench().getOperationSupport()
-					.getOperationHistory().execute(operation, monitor, uiInfo);
-		} catch (ExecutionException e) {
-			if (e.getCause() instanceof CoreException) {
-				ErrorDialog
-						.openError(WorkspaceUndoUtil.getShell(uiInfo), title,
-								null, ((CoreException) e.getCause())
-										.getStatus());
-			} else {
-				IDEWorkbenchPlugin.log(title, e);
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerSelectionProviderAdapter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerSelectionProviderAdapter.java
deleted file mode 100644
index a91f8f6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerSelectionProviderAdapter.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-
-/**
- * MarkerSelectionProviderAdapter adapts the concrete markers
- * to IMarkers for contributions.
- */
-class MarkerSelectionProviderAdapter implements ISelectionProvider {
-
-    List listeners = new ArrayList();
-
-    ISelection theSelection = null;
-
-    public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        listeners.add(listener);
-    }
-
-    public ISelection getSelection() {
-        return theSelection;
-    }
-
-    public void removeSelectionChangedListener(
-            ISelectionChangedListener listener) {
-        listeners.remove(listener);
-    }
-
-    public void setSelection(ISelection selection) {
-        theSelection = selection;
-        final SelectionChangedEvent e = new SelectionChangedEvent(this, selection);
-        Object[] listenersArray = listeners.toArray();
-        
-        for (int i = 0; i < listenersArray.length; i++) {
-            final ISelectionChangedListener l = (ISelectionChangedListener) listenersArray[i];
-            SafeRunner.run(new SafeRunnable() {
-                public void run() {
-                    l.selectionChanged(e);
-                }
-            });
-		}
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerSorter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerSorter.java
deleted file mode 100644
index 6e174f3..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerSorter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.Comparator;
-
-import org.eclipse.jface.viewers.TreeViewer;
-
-abstract class MarkerSorter implements Comparator {
-
-	/**
-	 * Sort the array of markers in lastMarkers in place.
-	 * 
-	 * @param viewer
-	 * @param markers
-	 */
-	public abstract void sort(TreeViewer viewer, MarkerList markers);
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerSupportRegistry.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerSupportRegistry.java
deleted file mode 100644
index 93e9310..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerSupportRegistry.java
+++ /dev/null
@@ -1,945 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker;
-import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler;
-import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.internal.views.markers.MarkerContentGenerator;
-import org.eclipse.ui.internal.views.markers.MarkerSupportInternalUtilities;
-import org.eclipse.ui.views.markers.MarkerField;
-
-/**
- * The ProblemFilterRegistryReader is the registry reader for declarative
- * problem filters. See the org.eclipse.ui.markerSupport extension point.
- * 
- * @since 3.2
- * 
- */
-public class MarkerSupportRegistry implements IExtensionChangeHandler {
-
-	private static final String DESCRIPTION = "onDescription"; //$NON-NLS-1$
-
-	/**
-	 * The enabled attribute.
-	 */
-	public static final String ENABLED = "enabled"; //$NON-NLS-1$
-
-	private static final Object ERROR = "ERROR";//$NON-NLS-1$
-
-	private static final Object INFO = "INFO";//$NON-NLS-1$
-
-	private static final Object WARNING = "WARNING";//$NON-NLS-1$
-
-	private static final String MARKER_ID = "markerId"; //$NON-NLS-1$
-
-	/**
-	 * The tag for the marker support extension
-	 */
-	public static final String MARKER_SUPPORT = "markerSupport";//$NON-NLS-1$
-
-	private static final Object ON_ANY = "ON_ANY"; //$NON-NLS-1$
-
-	private static final Object ON_ANY_IN_SAME_CONTAINER = "ON_ANY_IN_SAME_CONTAINER";//$NON-NLS-1$
-
-	private static final Object ON_SELECTED_AND_CHILDREN = "ON_SELECTED_AND_CHILDREN";//$NON-NLS-1$
-
-	private static final Object ON_SELECTED_ONLY = "ON_SELECTED_ONLY"; //$NON-NLS-1$
-
-	private static final Object PROBLEM_FILTER = "problemFilter";//$NON-NLS-1$
-
-	private static final String SCOPE = "scope"; //$NON-NLS-1$
-
-	private static final String SELECTED_TYPE = "selectedType"; //$NON-NLS-1$
-
-	private static final String SEVERITY = "severity";//$NON-NLS-1$
-
-	/**
-	 * The key for marker type references.
-	 */
-	public static final String MARKER_TYPE_REFERENCE = "markerTypeReference"; //$NON-NLS-1$
-
-	private static final String MARKER_CATEGORY = "markerTypeCategory";//$NON-NLS-1$
-
-	/**
-	 * The markerAttributeMapping element.
-	 */
-	public static final String ATTRIBUTE_MAPPING = "markerAttributeMapping"; //$NON-NLS-1$
-
-	/**
-	 * The tag for marker grouping.
-	 */
-	public static final String MARKER_GROUPING = "markerGrouping"; //$NON-NLS-1$
-	/**
-	 * The value attribute.
-	 */
-	public static final String VALUE = "value"; //$NON-NLS-1$
-
-	/**
-	 * The label attribute
-	 */
-	public static final String LABEL = "label"; //$NON-NLS-1$
-
-	/**
-	 * The attribute grouping element name.
-	 */
-	public static final String MARKER_ATTRIBUTE_GROUPING = "markerAttributeGrouping";//$NON-NLS-1$
-
-	/**
-	 * The constant for grouping entries.
-	 */
-	public static final String MARKER_GROUPING_ENTRY = "markerGroupingEntry"; //$NON-NLS-1$
-
-	private static final Object SEVERITY_ID = "org.eclipse.ui.ide.severity";//$NON-NLS-1$
-
-	/**
-	 * The tag for content generators.
-	 */
-	static final String MARKER_CONTENT_GENERATOR = "markerContentGenerator"; //$NON-NLS-1$
-
-	/**
-	 * The tag for content generator.
-	 */
-	private static final String MARKER_CONTENT_GENERATOR_EXTENSION = "markerContentGeneratorExtension"; //$NON-NLS-1$
-
-	private static final String MARKER_FIELD = "markerField"; //$NON-NLS-1$
-
-	private static final String ATTRIBUTE_CLASS = "class"; //$NON-NLS-1$
-	/**
-	 * The bookmarks generator.
-	 */
-	public static final String BOOKMARKS_GENERATOR = "org.eclipse.ui.ide.bookmarksGenerator"; //$NON-NLS-1$
-	/**
-	 * The tasks generator.
-	 */
-	public static final String TASKS_GENERATOR = "org.eclipse.ui.ide.tasksGenerator"; //$NON-NLS-1$
-
-	/**
-	 * The problems generator.
-	 */
-	public static final String PROBLEMS_GENERATOR = "org.eclipse.ui.ide.problemsGenerator"; //$NON-NLS-1$
-
-	
-	/**
-	 * The all markers generator.
-	 */
-	public static final String ALL_MARKERS_GENERATOR = "org.eclipse.ui.ide.allMarkersGenerator"; //$NON-NLS-1$
-
-	/**
-	 * The id for the new markers view.
-	 */
-	public static final String MARKERS_ID = "org.eclipse.ui.ide.MarkersView"; //$NON-NLS-1$;
-
-	private static final String ATTRIBUTE_GENERATOR_ID = "generatorId"; //$NON-NLS-1$
-
-	private static MarkerSupportRegistry singleton;
-
-	// Create a lock so that initialisation happens in one thread
-	private static Object creationLock = new Object();
-
-	/**
-	 * Get the instance of the registry.
-	 * 
-	 * @return MarkerSupportRegistry
-	 */
-	public static MarkerSupportRegistry getInstance() {
-		if (singleton == null) {
-			synchronized (creationLock) {
-				if (singleton == null) {
-					// thread
-					singleton = new MarkerSupportRegistry();
-				}
-			}
-		}
-		return singleton;
-	}
-
-	private Map registeredFilters = new HashMap();
-
-	private Map markerGroups = new HashMap();
-
-	private HashMap categories = new HashMap();
-
-	private HashMap hierarchyOrders = new HashMap();
-
-	private MarkerType rootType;
-
-	private HashMap generators = new HashMap();
-
-	private HashMap fields = new HashMap();
-
-	/**
-	 * Create a new instance of the receiver and read the registry.
-	 */
-	private MarkerSupportRegistry() {
-		IExtensionTracker tracker = PlatformUI.getWorkbench()
-				.getExtensionTracker();
-		IExtensionPoint point = Platform.getExtensionRegistry()
-				.getExtensionPoint(IDEWorkbenchPlugin.IDE_WORKBENCH,
-						MARKER_SUPPORT);
-		if (point == null) {
-			return;
-		}
-		IExtension[] extensions = point.getExtensions();
-		// initial population
-		Map groupingEntries = new HashMap();
-		Map generatorExtensions = new HashMap();
-		Map entryIDsToEntries = new HashMap();
-		Set attributeMappings = new HashSet();
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension extension = extensions[i];
-			processExtension(tracker, extension, groupingEntries,
-					entryIDsToEntries, attributeMappings, generatorExtensions);
-		}
-		postProcessExtensions(groupingEntries, entryIDsToEntries,
-				attributeMappings, generatorExtensions);
-		tracker.registerHandler(this, ExtensionTracker
-				.createExtensionPointFilter(point));
-
-	}
-
-	/**
-	 * Process the extension and register the result with the tracker. Fill the
-	 * map of groupingEntries and attribueMappings processed for post
-	 * processing.
-	 * 
-	 * @param tracker
-	 * @param extension
-	 * @param groupIDsToEntries
-	 *            Mapping of group names to the markerGroupingEntries registered
-	 *            for them
-	 * @param entryIDsToEntries
-	 *            Mapping of entry ids to entries
-	 * @param attributeMappings
-	 *            the markerAttributeGroupings found
-	 * @param generatorExtensions
-	 *            the markerContentGenerator extensions keyed on group id
-	 * @see #postProcessExtensions(Map, Map, Collection, Map)
-	 */
-	private void processExtension(IExtensionTracker tracker,
-			IExtension extension, Map groupIDsToEntries, Map entryIDsToEntries,
-			Collection attributeMappings, Map generatorExtensions) {
-		IConfigurationElement[] elements = extension.getConfigurationElements();
-
-		for (int j = 0; j < elements.length; j++) {
-			IConfigurationElement element = elements[j];
-			if (element.getName().equals(PROBLEM_FILTER)) {
-				ProblemFilter filter = newFilter(element);
-				registeredFilters.put(filter.getId(), filter);
-				tracker.registerObject(extension, filter,
-						IExtensionTracker.REF_STRONG);
-
-				continue;
-			}
-			if (element.getName().equals(MARKER_GROUPING)) {
-
-				MarkerGroup group = MarkerGroup.createMarkerGroup(element);
-
-				markerGroups.put(group.getId(), group);
-				tracker.registerObject(extension, group,
-						IExtensionTracker.REF_STRONG);
-				continue;
-			}
-
-			if (element.getName().equals(MARKER_GROUPING_ENTRY)) {
-
-				MarkerGroupingEntry entry = new MarkerGroupingEntry(element);
-
-				String groupName = element.getAttribute(MARKER_GROUPING);
-
-				Collection entries;
-				if (groupIDsToEntries.containsKey(groupName)) {
-					entries = (Collection) groupIDsToEntries.get(groupName);
-				} else {
-					entries = new HashSet();
-				}
-
-				entries.add(entry);
-				groupIDsToEntries.put(groupName, entries);
-				entryIDsToEntries.put(entry.getId(), entry);
-
-				tracker.registerObject(extension, entry,
-						IExtensionTracker.REF_STRONG);
-				continue;
-			}
-
-			if (element.getName().equals(MARKER_ATTRIBUTE_GROUPING)) {
-
-				AttributeMarkerGrouping grouping = new AttributeMarkerGrouping(
-						element);
-
-				attributeMappings.add(grouping);
-
-				tracker.registerObject(extension, grouping,
-						IExtensionTracker.REF_STRONG);
-				continue;
-			}
-
-			if (element.getName().equals(MARKER_CATEGORY)) {
-
-				String[] markerTypes = getMarkerTypes(element);
-				String categoryName = element
-						.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_NAME);
-
-				for (int i = 0; i < markerTypes.length; i++) {
-					categories.put(markerTypes[i], categoryName);
-
-				}
-				tracker.registerObject(extension, categoryName,
-						IExtensionTracker.REF_STRONG);
-				continue;
-			}
-
-			if (element.getName().equals(MARKER_CONTENT_GENERATOR_EXTENSION)) {
-
-				String generatorName = element
-						.getAttribute(ATTRIBUTE_GENERATOR_ID);
-
-				Collection extensionCollection;
-				if(generatorExtensions.containsKey(generatorName))
-					extensionCollection = (Collection) generatorExtensions.get(generatorName);
-				else
-					extensionCollection = new ArrayList();
-				
-				extensionCollection.add(element);
-				generatorExtensions.put(generatorName, extensionCollection);
-				tracker.registerObject(extension, element,
-						IExtensionTracker.REF_STRONG);
-				continue;
-			}
-
-			if (element.getName().equals(MARKER_CONTENT_GENERATOR)) {
-
-				MarkerContentGenerator generator = new MarkerContentGenerator(
-						element);
-
-				generators.put(generator.getId(), generator);
-
-				tracker.registerObject(extension, generator,
-						IExtensionTracker.REF_STRONG);
-				continue;
-			}
-
-			if (element.getName().equals(MARKER_FIELD)) {
-
-				processMarkerField(tracker, extension, element);
-				continue;
-			}
-		}
-	}
-
-	/**
-	 * Create a table of MarkerFields
-	 * 
-	 * @param tracker
-	 * @param extension
-	 * @param element
-	 */
-	private void processMarkerField(IExtensionTracker tracker,
-			IExtension extension, IConfigurationElement element) {
-		MarkerField field = null;
-		try {
-			field = (MarkerField) IDEWorkbenchPlugin.createExtension(element,
-					ATTRIBUTE_CLASS);
-			field.setConfigurationElement(element);
-		} catch (CoreException e) {
-			Policy.handle(e);
-		}
-
-		if (field != null)
-			fields.put(element
-					.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_ID), field);
-		tracker.registerObject(extension, field, IExtensionTracker.REF_STRONG);
-	}
-
-	/**
-	 * Process the cross references after all of the extensions have been read.
-	 * 
-	 * @param groupIDsToEntries
-	 *            Mapping of group names to the markerGroupingEntries registered
-	 *            for them
-	 * @param entryIDsToEntries
-	 *            Mapping of entry names to the mappings for them
-	 * @param attributeMappings
-	 *            the markerAttributeGroupings found
-	 * @param generatorExtensions
-	 *            map of generator id to generator
-	 */
-	private void postProcessExtensions(Map groupIDsToEntries,
-			Map entryIDsToEntries, Collection attributeMappings,
-			Map generatorExtensions) {
-		processGroupingEntries(groupIDsToEntries);
-		processAttributeMappings(entryIDsToEntries, attributeMappings);
-		postProcessContentGenerators(generatorExtensions);
-	}
-
-	/**
-	 * Set up the fields and filters
-	 * 
-	 * @param generatorExtensions
-	 *            the extensions to the generators,
-	 */
-	private void postProcessContentGenerators(Map generatorExtensions) {
-		Iterator generatorIterator = generators.values().iterator();
-		while (generatorIterator.hasNext()) {
-			MarkerContentGenerator generator = (MarkerContentGenerator) generatorIterator
-					.next();
-			generator.initializeFromConfigurationElement(this);
-			if (generatorExtensions.containsKey(generator.getId()))
-				generator.addExtensions((Collection) generatorExtensions
-						.get(generator.getId()));
-		}
-
-	}
-
-	/**
-	 * Process the grouping entries into thier required grouping entries.
-	 * 
-	 * @param groupingEntries
-	 */
-	private void processGroupingEntries(Map groupingEntries) {
-		Iterator entriesIterator = groupingEntries.keySet().iterator();
-		while (entriesIterator.hasNext()) {
-			String nextGroupId = (String) entriesIterator.next();
-			Iterator nextEntriesIterator = ((Collection) groupingEntries
-					.get(nextGroupId)).iterator();
-			if (markerGroups.containsKey(nextGroupId)) {
-				while (nextEntriesIterator.hasNext()) {
-					MarkerGroupingEntry next = (MarkerGroupingEntry) nextEntriesIterator
-							.next();
-					next.setGroup((MarkerGroup) markerGroups.get(nextGroupId));
-
-				}
-			} else {
-				while (nextEntriesIterator.hasNext()) {
-					MarkerGroupingEntry next = (MarkerGroupingEntry) nextEntriesIterator
-							.next();
-					IDEWorkbenchPlugin
-							.log(NLS
-									.bind(
-											"markerGroupingEntry {0} defines invalid group {1}",//$NON-NLS-1$
-											new String[] { next.getId(),
-													nextGroupId }));
-				}
-			}
-		}
-	}
-
-	/**
-	 * Process the attribute mappings into thier required grouping entries.
-	 * 
-	 * @param entryIDsToEntries
-	 * @param attributeMappings
-	 */
-	private void processAttributeMappings(Map entryIDsToEntries,
-			Collection attributeMappings) {
-		Iterator mappingsIterator = attributeMappings.iterator();
-		while (mappingsIterator.hasNext()) {
-			AttributeMarkerGrouping attributeGrouping = (AttributeMarkerGrouping) mappingsIterator
-					.next();
-			String defaultEntryId = attributeGrouping.getDefaultGroupingEntry();
-			if (defaultEntryId != null) {
-				if (entryIDsToEntries.containsKey(defaultEntryId)) {
-					MarkerGroupingEntry entry = (MarkerGroupingEntry) entryIDsToEntries
-							.get(defaultEntryId);
-					entry.setAsDefault(attributeGrouping.getMarkerType());
-				} else {
-					IDEWorkbenchPlugin.log(NLS.bind(
-							"Reference to invalid markerGroupingEntry {0}",//$NON-NLS-1$
-							defaultEntryId));
-				}
-			}
-			IConfigurationElement[] mappings = attributeGrouping.getElement()
-					.getChildren(ATTRIBUTE_MAPPING);
-
-			for (int i = 0; i < mappings.length; i++) {
-				String entryId = mappings[i]
-						.getAttribute(MARKER_GROUPING_ENTRY);
-
-				if (entryIDsToEntries.containsKey(entryId)) {
-					MarkerGroupingEntry entry = (MarkerGroupingEntry) entryIDsToEntries
-							.get(entryId);
-					entry.getMarkerGroup().mapAttribute(attributeGrouping,
-							entry, mappings[i].getAttribute(VALUE));
-				} else {
-					IDEWorkbenchPlugin.log(NLS.bind(
-							"Reference to invaild markerGroupingEntry {0}", //$NON-NLS-1$
-							defaultEntryId));
-				}
-
-			}
-		}
-
-	}
-
-	/**
-	 * Get the markerTypes defined in element.
-	 * 
-	 * @param element
-	 * @return String[]
-	 */
-	private String[] getMarkerTypes(IConfigurationElement element) {
-		IConfigurationElement[] types = element
-				.getChildren(MARKER_TYPE_REFERENCE);
-		String[] ids = new String[types.length];
-		for (int i = 0; i < ids.length; i++) {
-			ids[i] = types[i].getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_ID);
-		}
-		return ids;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler#addExtension(org.eclipse.core.runtime.dynamichelpers.IExtensionTracker,
-	 *      org.eclipse.core.runtime.IExtension)
-	 */
-	public void addExtension(IExtensionTracker tracker, IExtension extension) {
-		Map groupIDsToEntries = new HashMap();
-		Map entryIDsToEntries = new HashMap();
-		Map generatorExtensions = new HashMap();
-		Set attributeMappings = new HashSet();
-		processExtension(tracker, extension, groupIDsToEntries,
-				entryIDsToEntries, attributeMappings, generatorExtensions);
-		postProcessExtensions(groupIDsToEntries, entryIDsToEntries,
-				attributeMappings, generatorExtensions);
-	}
-
-	/**
-	 * Get the collection of currently registered filters.
-	 * 
-	 * @return Collection of ProblemFilter
-	 */
-	public Collection getRegisteredFilters() {
-		Collection filteredFilters = new ArrayList();
-		Iterator registeredIterator = registeredFilters.values().iterator();
-		while (registeredIterator.hasNext()) {
-			ProblemFilter next = (ProblemFilter) registeredIterator.next();
-			if (next.isFilteredOutByActivity()) {
-				continue;
-			}
-			filteredFilters.add(next);
-		}
-
-		return filteredFilters;
-	}
-
-	/**
-	 * Get the constant for scope from element. Return -1 if there is no value.
-	 * 
-	 * @param element
-	 * @return int one of MarkerView#ON_ANY MarkerView#ON_SELECTED_ONLY
-	 *         MarkerView#ON_SELECTED_AND_CHILDREN
-	 *         MarkerView#ON_ANY_IN_SAME_CONTAINER
-	 */
-	private int getScopeValue(IConfigurationElement element) {
-		String scope = element.getAttribute(SCOPE);
-		if (scope == null) {
-			return -1;
-		}
-		if (scope.equals(ON_ANY)) {
-			return MarkerFilter.ON_ANY;
-		}
-		if (scope.equals(ON_SELECTED_ONLY)) {
-			return MarkerFilter.ON_SELECTED_ONLY;
-		}
-		if (scope.equals(ON_SELECTED_AND_CHILDREN)) {
-			return MarkerFilter.ON_SELECTED_AND_CHILDREN;
-		}
-		if (scope.equals(ON_ANY_IN_SAME_CONTAINER)) {
-			return MarkerFilter.ON_ANY_IN_SAME_CONTAINER;
-		}
-
-		return -1;
-	}
-
-	/**
-	 * Get the constant for scope from element. Return -1 if there is no value.
-	 * 
-	 * @param element
-	 * @return int one of MarkerView#ON_ANY MarkerView#ON_SELECTED_ONLY
-	 *         MarkerView#ON_SELECTED_AND_CHILDREN
-	 *         MarkerView#ON_ANY_IN_SAME_CONTAINER
-	 */
-	private int getSeverityValue(IConfigurationElement element) {
-		String severity = element.getAttribute(SEVERITY);
-		if (severity == null) {
-			return -1;
-		}
-		if (severity.equals(INFO)) {
-			return ProblemFilter.SEVERITY_INFO;
-		}
-		if (severity.equals(WARNING)) {
-			return ProblemFilter.SEVERITY_WARNING;
-		}
-		if (severity.equals(ERROR)) {
-			return ProblemFilter.SEVERITY_ERROR;
-		}
-
-		return -1;
-	}
-
-	/**
-	 * Read the problem filters in the receiver.
-	 * 
-	 * @param element
-	 *            the filter element
-	 * @return ProblemFilter
-	 */
-	private ProblemFilter newFilter(IConfigurationElement element) {
-		ProblemFilter filter = new ProblemFilter(element
-				.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_NAME));
-
-		filter.createContributionFrom(element);
-
-		String enabledValue = element.getAttribute(ENABLED);
-		filter.setEnabled(enabledValue == null
-				|| Boolean.valueOf(enabledValue).booleanValue());
-
-		int scopeValue = getScopeValue(element);
-		if (scopeValue >= 0) {
-			filter.setOnResource(scopeValue);
-		}
-
-		String description = element.getAttribute(DESCRIPTION);
-		if (description != null) {
-			boolean contains = true;
-			if (description.charAt(0) == '!') {// does not contain flag
-				description = description.substring(1, description.length());
-				contains = false;
-			}
-			filter.setContains(contains);
-			filter.setDescription(description);
-		}
-
-		int severityValue = getSeverityValue(element);
-		if (severityValue > 0) {
-			filter.setSelectBySeverity(true);
-			filter.setSeverity(severityValue);
-		} else {
-			filter.setSelectBySeverity(false);
-		}
-
-		List selectedTypes = new ArrayList();
-		IConfigurationElement[] types = element.getChildren(SELECTED_TYPE);
-		for (int j = 0; j < types.length; j++) {
-			String markerId = types[j].getAttribute(MARKER_ID);
-			if (markerId != null) {
-				MarkerType type = filter.getMarkerType(markerId);
-				if (type == null) {
-					IStatus status = new Status(
-							IStatus.WARNING,
-							IDEWorkbenchPlugin.IDE_WORKBENCH,
-							IStatus.WARNING,
-							NLS
-									.bind(
-											MarkerMessages.ProblemFilterRegistry_nullType,
-											new Object[] { markerId,
-													filter.getName() }), null);
-					IDEWorkbenchPlugin.getDefault().getLog().log(status);
-				} else {
-					selectedTypes.add(type);
-				}
-			}
-		}
-
-		if (selectedTypes.size() > 0) {
-			// specified
-			filter.setSelectedTypes(selectedTypes);
-		}
-
-		return filter;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler#removeExtension(org.eclipse.core.runtime.IExtension,
-	 *      java.lang.Object[])
-	 */
-	public void removeExtension(IExtension extension, Object[] objects) {
-
-		for (int i = 0; i < objects.length; i++) {
-			if (objects[i] instanceof ProblemFilter) {
-				registeredFilters.remove(objects[i]);
-				continue;
-			}
-
-			if (objects[i] instanceof MarkerGroup) {
-				markerGroups.remove(((MarkerGroup) objects[i]).getId());
-				continue;
-			}
-
-			if (objects[i] instanceof MarkerGroupingEntry) {
-				MarkerGroupingEntry entry = (MarkerGroupingEntry) objects[i];
-				entry.getMarkerGroup().remove(entry);
-				continue;
-			}
-
-			if (objects[i] instanceof AttributeMarkerGrouping) {
-				AttributeMarkerGrouping entry = (AttributeMarkerGrouping) objects[i];
-				entry.unmap();
-				continue;
-			}
-
-			if (objects[i] instanceof String) {
-				removeValues(objects[i], categories);
-				continue;
-			}
-
-			if (objects[i] instanceof MarkerField) {
-				fields.remove(MarkerSupportInternalUtilities.getId((MarkerField) objects[i]));
-				continue;
-			}
-
-			if (objects[i] instanceof MarkerContentGenerator) {
-				generators
-						.remove(((MarkerContentGenerator) objects[i]).getId());
-				continue;
-			}
-
-			if (objects[i] instanceof IConfigurationElement) {
-				IConfigurationElement element = (IConfigurationElement) objects[i];
-				MarkerContentGenerator generator = (MarkerContentGenerator) generators
-						.get(element.getAttribute(ATTRIBUTE_GENERATOR_ID));
-				generator.removeExtension(element);
-				continue;
-			}
-
-		}
-
-	}
-
-	/**
-	 * Remove the value from all of the collection sets in cache. If the
-	 * collection is empty remove the key as well.
-	 * 
-	 * @param value
-	 * @param cache
-	 */
-	private void removeValues(Object value, HashMap cache) {
-		Collection keysToRemove = new ArrayList();
-		Iterator keys = cache.keySet().iterator();
-		while (keys.hasNext()) {
-			String key = (String) keys.next();
-			Object next = cache.get(key);
-			if (next instanceof Collection) {
-				Collection collection = (Collection) next;
-				if (collection.contains(value)) {
-					collection.remove(value);
-					if (collection.isEmpty()) {
-						keysToRemove.add(key);
-					}
-					break;
-				}
-			} else {
-				if (cache.get(key).equals(value)) {
-					keysToRemove.add(key);
-				}
-			}
-		}
-		Iterator keysToRemoveIterator = keysToRemove.iterator();
-		while (keysToRemoveIterator.hasNext()) {
-			cache.remove(keysToRemoveIterator.next());
-		}
-	}
-
-	/**
-	 * Get the category associated with marker. Return <code>null</code> if
-	 * there are none.
-	 * 
-	 * @param marker
-	 * @return String or <code>null</code>
-	 */
-	public String getCategory(IMarker marker) {
-		try {
-			return getCategory(marker.getType());
-		} catch (CoreException e) {
-			Policy.handle(e);
-		}
-		return null;
-	}
-
-	/**
-	 * Get the category associated with markerType. Return <code>null</code>
-	 * if there are none.
-	 * 
-	 * @param markerType
-	 * @return String or <code>null</code>
-	 */
-	public String getCategory(String markerType) {
-		if (categories.containsKey(markerType)) {
-			return (String) categories.get(markerType);
-		}
-		return null;
-	}
-
-	/**
-	 * Return the TableSorter that corresponds to type.
-	 * 
-	 * @param type
-	 * @return TableSorter
-	 */
-	public TableComparator getSorterFor(String type) {
-		if (hierarchyOrders.containsKey(type)) {
-			return (TableComparator) hierarchyOrders.get(type);
-		}
-
-		TableComparator sorter = findSorterInChildren(type, getRootType());
-		if (sorter == null) {
-			return new TableComparator(new IField[0], new int[0], new int[0]);
-		}
-		return sorter;
-	}
-
-	/**
-	 * Return the list of root marker types.
-	 * 
-	 * @return List of MarkerType.
-	 */
-	private MarkerType getRootType() {
-		if (rootType == null) {
-			rootType = (MarkerTypesModel.getInstance())
-					.getType(IMarker.PROBLEM);
-		}
-		return rootType;
-	}
-
-	/**
-	 * Find the best match sorter for typeName in the children. If it cannot be
-	 * found then return <code>null</code>.
-	 * 
-	 * @param typeName
-	 * @param type
-	 * @return TableSorter or <code>null</code>.
-	 */
-	private TableComparator findSorterInChildren(String typeName,
-			MarkerType type) {
-
-		MarkerType[] types = type.getAllSubTypes();
-		TableComparator defaultSorter = null;
-		if (hierarchyOrders.containsKey(type.getId())) {
-			defaultSorter = (TableComparator) hierarchyOrders.get(type.getId());
-		}
-
-		for (int i = 0; i < types.length; i++) {
-			MarkerType[] subtypes = types[i].getAllSubTypes();
-			for (int j = 0; j < subtypes.length; j++) {
-				TableComparator sorter = findSorterInChildren(typeName,
-						subtypes[j]);
-				if (sorter != null) {
-					return sorter;
-				}
-			}
-		}
-		return defaultSorter;
-
-	}
-
-	/**
-	 * Return the FieldMarkerGroups in the receiver.
-	 * 
-	 * @return Collection of {@link MarkerGroup}
-	 */
-	public Collection getMarkerGroups() {
-		return markerGroups.values();
-	}
-
-	/**
-	 * Return the default groupfield.
-	 * 
-	 * @return IField
-	 */
-	IField getDefaultGroupField() {
-
-		return ((MarkerGroup) markerGroups.get(SEVERITY_ID)).getField();
-	}
-
-	/**
-	 * Get the generator for id
-	 * 
-	 * @param id
-	 * @return MarkerContentGenerator or <code>null</code>.
-	 */
-	public MarkerContentGenerator getGenerator(String id) {
-		if (id != null && generators.containsKey(id))
-			return (MarkerContentGenerator) generators.get(id);
-		return null;
-	}
-
-	/**
-	 * Return the default content generator.
-	 * 
-	 * @return MarkerContentGenerator
-	 */
-	public MarkerContentGenerator getDefaultGenerator() {
-		return (MarkerContentGenerator) generators.get(PROBLEMS_GENERATOR);
-	}
-
-	/**
-	 * Get the markerGroup associated with categoryName
-	 * 
-	 * @param categoryName
-	 * @return FieldMarkerGroup or <code>null</code>
-	 */
-	public MarkerGroup getMarkerGroup(String categoryName) {
-		if (markerGroups.containsKey(categoryName))
-			return (MarkerGroup) markerGroups.get(categoryName);
-		return null;
-	}
-
-	/**
-	 * Return the field that maps to id.
-	 * 
-	 * @param id
-	 * @return {@link MarkerField} or <code>null</code>
-	 */
-	public MarkerField getField(String id) {
-		if (fields.containsKey(id))
-			return (MarkerField) fields.get(id);
-		return null;
-	}
-
-	/**
-	 * Return an array of MarkerContentGenerator for the receiver.
-	 * 
-	 * @return MarkerContentGenerator[]
-	 */
-	public MarkerContentGenerator[] getGenerators() {
-		MarkerContentGenerator[] generatorArray = new MarkerContentGenerator[generators
-				.size()];
-		generators.values().toArray(generatorArray);
-		return generatorArray;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerTreeContentProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerTreeContentProvider.java
deleted file mode 100644
index 2f99f58..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerTreeContentProvider.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * The MarkerTreeContentProvider is the content provider for the marker trees.
- * 
- * @since 3.2
- * 
- */
-public class MarkerTreeContentProvider implements ITreeContentProvider {
-
-	TreeViewer viewer;
-
-	boolean hierarchalMode = true;
-
-	private MarkerAdapter adapter;
-
-	/**
-	 * Create a new content provider for the view.
-	 */
-	MarkerTreeContentProvider() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(Object parentElement) {
-		if (parentElement instanceof MarkerNode) {
-			return ((MarkerNode) parentElement).getChildren();
-		}
-		return Util.EMPTY_MARKER_ARRAY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object element) {
-		if (element instanceof MarkerNode) {
-			return ((MarkerNode) element).getParent();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object element) {
-		if (element instanceof MarkerNode) {
-			return ((MarkerNode) element).getChildren().length > 0;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-		return adapter.getElements();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-		// Nothing to do here.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		this.viewer = (TreeViewer) viewer;
-		adapter = (MarkerAdapter) newInput;
-
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerType.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerType.java
deleted file mode 100644
index 8aab0eb..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerType.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents a marker type.
- */
-public class MarkerType {
-    private MarkerTypesModel model;
-
-    private String id;
-
-    private String label;
-
-    private String[] supertypeIds;
-
-    /**
-     * Creates a new marker type.
-     */
-    public MarkerType(MarkerTypesModel model, String id, String label,
-            String[] supertypeIds) {
-        this.model = model;
-        this.id = id;
-        this.label = label;
-        this.supertypeIds = supertypeIds;
-    }
-
-    /**
-     * Returns all this type's supertypes.
-     */
-    public MarkerType[] getAllSupertypes() {
-        ArrayList result = new ArrayList();
-        getAllSupertypes(result);
-        return (MarkerType[]) result.toArray(new MarkerType[result.size()]);
-    }
-
-    /**
-     * Appends all this type's supertypes to the given list.
-     */
-    private void getAllSupertypes(ArrayList result) {
-        MarkerType[] supers = getSupertypes();
-        for (int i = 0; i < supers.length; ++i) {
-            MarkerType sup = supers[i];
-            if (!result.contains(sup)) {
-                result.add(sup);
-                sup.getAllSupertypes(result);
-            }
-        }
-    }
-
-    /**
-     * Returns the marker type id.
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * Returns the human-readable label for this marker type.
-     */
-    public String getLabel() {
-        return label;
-    }
-
-    /**
-     * Returns the types which have this type as a direct supertype.
-     *
-     * @return the direct subtypes of this type
-     */
-    public MarkerType[] getSubtypes() {
-        MarkerType[] types = model.getTypes();
-        ArrayList result = new ArrayList();
-        for (int i = 0; i < types.length; ++i) {
-            MarkerType type = types[i];
-            String[] supers = type.getSupertypeIds();
-            for (int j = 0; j < supers.length; ++j) {
-                if (supers[j].equals(id)) {
-                    result.add(type);
-                }
-            }
-        }
-        return (MarkerType[]) result.toArray(new MarkerType[result.size()]);
-    }
-
-    public MarkerType[] getAllSubTypes() {
-        List subTypes = new ArrayList();
-        addSubTypes(subTypes, this);
-        MarkerType[] subs = new MarkerType[subTypes.size()];
-        subTypes.toArray(subs);
-        return subs;
-    }
-
-    private void addSubTypes(List list, MarkerType superType) {
-        MarkerType[] subTypes = superType.getSubtypes();
-        for (int i = 0; i < subTypes.length; i++) {
-            MarkerType subType = subTypes[i];
-            if (!list.contains(subType)) {
-                list.add(subType);
-            }
-            addSubTypes(list, subType);
-        }
-    }
-
-    /**
-     * Returns the marker type ids for this type's supertypes.
-     */
-    public String[] getSupertypeIds() {
-        return supertypeIds;
-    }
-
-    /**
-     * Returns this type's direct supertypes.
-     */
-    public MarkerType[] getSupertypes() {
-        ArrayList result = new ArrayList();
-        for (int i = 0; i < supertypeIds.length; ++i) {
-            MarkerType sup = model.getType(supertypeIds[i]);
-            if (sup != null) {
-                result.add(sup);
-            }
-        }
-        return (MarkerType[]) result.toArray(new MarkerType[result.size()]);
-    }
-
-    /**
-     * Returns whether this marker type is considered to be a subtype of
-     * the given marker type. 
-     *
-     * @return boolean <code>true</code>if this type is the same as (or a subtype of) the given type
-     */
-    public boolean isSubtypeOf(MarkerType superType) {
-        if (id.equals(superType.getId())) {
-            return true;
-        }
-        for (int i = 0; i < supertypeIds.length; ++i) {
-            MarkerType sup = model.getType(supertypeIds[i]);
-            if (sup != null && sup.isSubtypeOf(superType)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public boolean equals(Object other) {
-        if (!(other instanceof MarkerType)) {
-            return false;
-        }
-        return ((MarkerType) other).getId().equals(this.id);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerTypesModel.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerTypesModel.java
deleted file mode 100644
index b6db5f3..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerTypesModel.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-
-/**
- * Maintains a model of all known marker types. Accessed statically as
- * the list does not change frequently.
- */
-public class MarkerTypesModel {
-	
-	/**
-	 * Return the singleton implementation.
-	 * @return MarkerTypesModel
-	 */
-	public static MarkerTypesModel getInstance(){
-		if(instance == null) {
-			instance = new MarkerTypesModel();
-		}
-		return instance;
-	}
-
-	static MarkerTypesModel instance;
-
-	/**
-	 * Maps from marker type id to MarkerType.
-	 */
-	private HashMap types;
-
-	/**
-	 * Creates a new marker types model.
-	 */
-	private MarkerTypesModel() {
-		types = readTypes();
-	}
-
-	/**
-	 * Returns the marker type with the given id, or <code>null</code> if
-	 * there is no such marker type.
-	 */
-	public MarkerType getType(String id) {
-		return (MarkerType) types.get(id);
-	}
-
-	/**
-	 * Returns all known marker types.
-	 */
-	public MarkerType[] getTypes() {
-		MarkerType[] result = new MarkerType[types.size()];
-		types.values().toArray(result);
-		return result;
-	}
-
-	/**
-	 * Returns the label for the given marker type. Workaround until we have
-	 * labels in XML.
-	 */
-	private String getWellKnownLabel(String type) {
-		if (type.equals(IMarker.PROBLEM)) {
-			return "Problem";//$NON-NLS-1$
-		}
-		if (type.equals(IMarker.TASK)) {
-			return "Task";//$NON-NLS-1$
-		}
-		if (type.equals("org.eclipse.jdt.core.problem")) { //$NON-NLS-1$
-			return "Java Problem";//$NON-NLS-1$
-		}
-		return type;
-	}
-
-	/**
-	 * Reads the marker types from the registry.
-	 */
-	private HashMap readTypes() {
-		HashMap types = new HashMap();
-
-		IExtensionPoint point = Platform.getExtensionRegistry()
-				.getExtensionPoint(ResourcesPlugin.PI_RESOURCES,
-						ResourcesPlugin.PT_MARKERS);
-		if (point != null) {
-			// Gather all registered marker types.
-			IExtension[] extensions = point.getExtensions();
-			for (int i = 0; i < extensions.length; ++i) {
-				IExtension ext = extensions[i];
-				String id = ext.getUniqueIdentifier();
-				String label = ext.getLabel();
-				if (label.equals("")) {//$NON-NLS-1$
-					label = getWellKnownLabel(id);
-				}
-				ArrayList supersList = new ArrayList();
-				IConfigurationElement[] configElements = ext
-						.getConfigurationElements();
-				for (int j = 0; j < configElements.length; ++j) {
-					IConfigurationElement elt = configElements[j];
-					if (elt.getName().equalsIgnoreCase("super")) {//$NON-NLS-1$
-						String sup = elt.getAttribute("type");//$NON-NLS-1$
-						if (sup != null) {
-							supersList.add(sup);
-						}
-					}
-				}
-				String[] superTypes = new String[supersList.size()];
-				supersList.toArray(superTypes);
-				MarkerType type = new MarkerType(this, id, label, superTypes);
-				types.put(id, type);
-			}
-		}
-		return types;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerView.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerView.java
deleted file mode 100644
index 2e87994..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerView.java
+++ /dev/null
@@ -1,1789 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.resources.mapping.ResourceMappingContext;
-import org.eclipse.core.resources.mapping.ResourceTraversal;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-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.core.runtime.jobs.IJobChangeListener;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.help.HelpSystem;
-import org.eclipse.help.IContext;
-import org.eclipse.help.IContextProvider;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.OpenEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSourceAdapter;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.HelpEvent;
-import org.eclipse.swt.events.HelpListener;
-import org.eclipse.swt.events.TreeAdapter;
-import org.eclipse.swt.events.TreeEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.ContributionItemFactory;
-import org.eclipse.ui.actions.SelectionProviderAction;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.ide.ResourceUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.keys.IBindingService;
-import org.eclipse.ui.operations.RedoActionHandler;
-import org.eclipse.ui.operations.UndoActionHandler;
-import org.eclipse.ui.part.IShowInSource;
-import org.eclipse.ui.part.MarkerTransfer;
-import org.eclipse.ui.part.ShowInContext;
-import org.eclipse.ui.preferences.ViewPreferencesAction;
-import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
-import org.eclipse.ui.progress.WorkbenchJob;
-import org.eclipse.ui.views.markers.internal.MarkerAdapter.MarkerCategory;
-import org.eclipse.ui.views.tasklist.ITaskListResourceAdapter;
-
-/**
- * MarkerView is the abstract super class of the marker based views.
- * 
- */
-public abstract class MarkerView extends TableView {
-
-	private static final String TAG_SELECTION = "selection"; //$NON-NLS-1$
-
-	private static final String TAG_MARKER = "marker"; //$NON-NLS-1$
-
-	private static final String TAG_RESOURCE = "resource"; //$NON-NLS-1$
-
-	private static final String TAG_ID = "id"; //$NON-NLS-1$
-
-	private static final String TAG_FILTERS_SECTION = "filters"; //$NON-NLS-1$
-
-	private static final String TAG_FILTER_ENTRY = "filter"; //$NON-NLS-1$
-
-	private static final String MENU_FILTERS_GROUP = "group.filter";//$NON-NLS-1$
-
-	private static final String MENU_SHOW_IN_GROUP = "group.showIn";//$NON-NLS-1$
-
-	// Section from a 3.1 or earlier workbench
-	private static final String OLD_FILTER_SECTION = "filter"; //$NON-NLS-1$
-
-	static final Object MARKER_UPDATE_FAMILY = new Object();
-
-	class MarkerProcessJob extends Job {
-
-		/**
-		 * Create a new instance of the receiver.
-		 */
-		MarkerProcessJob() {
-			super(MarkerMessages.MarkerView_processUpdates);
-			setSystem(true);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-		 */
-		protected IStatus run(IProgressMonitor monitor) {
-			updateForContentsRefresh(monitor);
-			return Status.OK_STATUS;
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.progress.WorkbenchJob#shouldRun()
-		 */
-		public boolean shouldRun() {
-			// Do not run if the change came in before there is a viewer
-			return PlatformUI.isWorkbenchRunning();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.runtime.jobs.Job#belongsTo(java.lang.Object)
-		 */
-		public boolean belongsTo(Object family) {
-			return MARKER_UPDATE_FAMILY == family;
-		}
-
-	}
-
-	MarkerProcessJob markerProcessJob = new MarkerProcessJob();
-
-	private class UpdateJob extends WorkbenchJob {
-
-		private class MarkerDescriptor {
-			String description;
-
-			String folder;
-
-			String resource;
-
-			int line;
-
-			MarkerDescriptor(ConcreteMarker marker) {
-				description = marker.getDescription();
-				folder = marker.getFolder();
-				resource = marker.getResourceName();
-				line = marker.getLine();
-			}
-
-			boolean isEquivalentTo(ConcreteMarker marker) {
-				return marker.getDescription().equals(description)
-						&& marker.getFolder().equals(folder)
-						&& marker.getResourceName().equals(resource)
-						&& marker.getLine() == line;
-			}
-
-		}
-
-		private Collection categoriesToExpand = new HashSet();
-
-		private Collection preservedSelection = new ArrayList();
-
-		UpdateJob() {
-			super(MarkerMessages.MarkerView_queueing_updates);
-			setSystem(true);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
-		 */
-		public IStatus runInUIThread(IProgressMonitor monitor) {
-
-			if (getViewer().getControl().isDisposed()) {
-				return Status.CANCEL_STATUS;
-			}
-
-			if (monitor.isCanceled())
-				return Status.CANCEL_STATUS;
-
-			getViewer().refresh(true);
-
-			Tree tree = getTree();
-
-			if (tree != null && !tree.isDisposed()) {
-				updateStatusMessage();
-				updateTitle();
-				// Expand all if the list is small
-				if (getCurrentMarkers().getSize() < 20) {
-					getViewer().expandAll();
-				} else {// Reexpand the old categories
-					MarkerCategory[] categories = getMarkerAdapter()
-							.getCategories();
-					if (categories == null)
-						categoriesToExpand.clear();
-					else {
-						if (categories.length == 1) {// Expand if there is
-							// only
-							// one
-							getViewer().expandAll();
-							categoriesToExpand.clear();
-							if (monitor.isCanceled())
-								return Status.CANCEL_STATUS;
-							categoriesToExpand.add(categories[0].getName());
-						} else {
-							Collection newCategories = new HashSet();
-							for (int i = 0; i < categories.length; i++) {
-								if (monitor.isCanceled())
-									return Status.CANCEL_STATUS;
-								MarkerCategory category = categories[i];
-								if (categoriesToExpand.contains(category
-										.getName())) {
-									getViewer().expandToLevel(category,
-											AbstractTreeViewer.ALL_LEVELS);
-									newCategories.add(category.getName());
-								}
-
-							}
-							categoriesToExpand = newCategories;
-						}
-					}
-
-				}
-			}
-
-			if (preservedSelection.size() > 0) {
-
-				Collection newSelection = new ArrayList();
-				ConcreteMarker[] markers = getCurrentMarkers().toArray();
-
-				for (int i = 0; i < markers.length; i++) {
-					Iterator preserved = preservedSelection.iterator();
-					while (preserved.hasNext()) {
-						MarkerDescriptor next = (MarkerDescriptor) preserved
-								.next();
-						if (next.isEquivalentTo(markers[i])) {
-							newSelection.add(markers[i]);
-							continue;
-						}
-					}
-				}
-
-				getViewer().setSelection(
-						new StructuredSelection(newSelection.toArray()), true);
-				preservedSelection.clear();
-			}
-			if (getViewer().getTree().getItemCount() > 0)
-				getViewer().getTree().setTopItem(
-						getViewer().getTree().getItem(0));
-
-			return Status.OK_STATUS;
-		}
-
-		/**
-		 * Add the category to the list of expanded categories.
-		 * 
-		 * @param category
-		 */
-		public void addExpandedCategory(MarkerCategory category) {
-			categoriesToExpand.add(category.getName());
-
-		}
-
-		/**
-		 * Remove the category from the list of expanded ones.
-		 * 
-		 * @param category
-		 */
-		public void removeExpandedCategory(MarkerCategory category) {
-			categoriesToExpand.remove(category.getName());
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.runtime.jobs.Job#belongsTo(java.lang.Object)
-		 */
-		public boolean belongsTo(Object family) {
-			return family == MARKER_UPDATE_FAMILY;
-		}
-
-		/**
-		 * Preserve the selection for reselection after the next update.
-		 * 
-		 * @param selection
-		 */
-		public void saveSelection(ISelection selection) {
-			preservedSelection.clear();
-			if (selection instanceof IStructuredSelection) {
-				IStructuredSelection structured = (IStructuredSelection) selection;
-				Iterator iterator = structured.iterator();
-				while (iterator.hasNext()) {
-					MarkerNode next = (MarkerNode) iterator.next();
-					if (next.isConcrete()) {
-						preservedSelection.add(new MarkerDescriptor(next
-								.getConcreteRepresentative()));
-					}
-				}
-			}
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.progress.WorkbenchJob#shouldRun()
-		 */
-		public boolean shouldRun() {
-			return !getMarkerAdapter().isBuilding();
-		}
-
-	}
-
-	private UpdateJob updateJob = new UpdateJob();
-
-	// A private field for keeping track of the number of markers
-	// before the busy testing started
-	private int preBusyMarkers = 0;
-
-	protected Object[] focusElements;
-
-	private Clipboard clipboard;
-
-	IResourceChangeListener markerUpdateListener = new IResourceChangeListener() {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-		 */
-		public void resourceChanged(IResourceChangeEvent event) {
-			if (!hasMarkerDelta(event))
-				return;
-
-			if (event.getType() == IResourceChangeEvent.POST_BUILD) {
-				scheduleMarkerUpdate(Util.SHORT_DELAY);
-				return;
-			}
-
-			// After 30 seconds do updates anyways
-
-			IWorkbenchSiteProgressService progressService = getProgressService();
-			if (progressService == null)
-				markerProcessJob.schedule(Util.LONG_DELAY);
-			else
-				getProgressService()
-						.schedule(markerProcessJob, Util.LONG_DELAY);
-
-		}
-
-		/**
-		 * Returns whether or not the given even contains marker deltas for this
-		 * view.
-		 * 
-		 * @param event
-		 *            the resource change event
-		 * @return <code>true</code> if the event contains at least one
-		 *         relevant marker delta
-		 * @since 3.3
-		 */
-		private boolean hasMarkerDelta(IResourceChangeEvent event) {
-			String[] markerTypes = getMarkerTypes();
-			for (int i = 0; i < markerTypes.length; i++) {
-				if (event.findMarkerDeltas(markerTypes[i], true).length > 0) {
-					return true;
-				}
-			}
-			return false;
-		}
-
-	};
-
-	private class ContextProvider implements IContextProvider {
-		public int getContextChangeMask() {
-			return SELECTION;
-		}
-
-		public IContext getContext(Object target) {
-			String contextId = null;
-			// See if there is a context registered for the current selection
-			ConcreteMarker marker = getSelectedConcreteMarker();
-			if (marker != null) {
-				contextId = IDE.getMarkerHelpRegistry().getHelp(
-						marker.getMarker());
-			}
-
-			if (contextId == null) {
-				contextId = getStaticContextId();
-			}
-			return HelpSystem.getContext(contextId);
-		}
-
-		/**
-		 * Return the currently selected concrete marker or <code>null</code>
-		 * if there isn't one.
-		 * 
-		 * @return ConcreteMarker
-		 */
-		private ConcreteMarker getSelectedConcreteMarker() {
-
-			IStructuredSelection selection = (IStructuredSelection) getViewer()
-					.getSelection();
-			if (selection.isEmpty())
-				return null;
-
-			if (selection.getFirstElement() instanceof ConcreteMarker)
-				return (ConcreteMarker) selection.getFirstElement();
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.help.IContextProvider#getSearchExpression(java.lang.Object)
-		 */
-		public String getSearchExpression(Object target) {
-			return null;
-		}
-	}
-
-	private ContextProvider contextProvider = new ContextProvider();
-
-	protected ActionCopyMarker copyAction;
-
-	protected ActionPasteMarker pasteAction;
-
-	protected SelectionProviderAction revealAction;
-
-	protected SelectionProviderAction openAction;
-
-	protected SelectionProviderAction deleteAction;
-
-	protected SelectionProviderAction selectAllAction;
-
-	protected SelectionProviderAction propertiesAction;
-
-	protected UndoActionHandler undoAction;
-
-	protected RedoActionHandler redoAction;
-
-	private ISelectionListener focusListener = new ISelectionListener() {
-		public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-			MarkerView.this.focusSelectionChanged(part, selection);
-		}
-	};
-
-	private int totalMarkers = 0;
-
-	private MarkerFilter[] markerFilters = new MarkerFilter[0];
-
-	// A cache of the enabled filters
-	private MarkerFilter[] enabledFilters = null;
-
-	private MenuManager filtersMenu;
-
-	private MenuManager showInMenu;
-
-	private IPropertyChangeListener workingSetListener;
-
-	private MarkerAdapter adapter;
-
-	private IPropertyChangeListener preferenceListener;
-
-	/**
-	 * Create a new instance of the receiver,
-	 */
-	public MarkerView() {
-		super();
-		preferenceListener = new IPropertyChangeListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-			 */
-			public void propertyChange(PropertyChangeEvent event) {
-				if (event.getProperty().equals(getFiltersPreferenceName())) {
-					loadFiltersPreferences();
-					clearEnabledFilters();
-					refreshForFocusUpdate();
-				}
-			}
-		};
-		IDEWorkbenchPlugin.getDefault().getPreferenceStore()
-				.addPropertyChangeListener(preferenceListener);
-	}
-
-	/**
-	 * Get the current markers for the receiver.
-	 * 
-	 * @return MarkerList
-	 */
-	public MarkerList getCurrentMarkers() {
-		return getMarkerAdapter().getCurrentMarkers();
-	}
-
-	/**
-	 * Get the marker adapter for the receiver.
-	 * 
-	 * @return MarkerAdapter
-	 */
-	protected MarkerAdapter getMarkerAdapter() {
-		return adapter;
-	}
-
-	/**
-	 * Update for the change in the contents.
-	 * 
-	 * @param monitor
-	 */
-	public void updateForContentsRefresh(IProgressMonitor monitor) {
-		updateJob.cancel();
-		getMarkerAdapter().buildAllMarkers(monitor);
-		getProgressService().schedule(updateJob);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IViewPart#init(org.eclipse.ui.IViewSite,
-	 *      org.eclipse.ui.IMemento)
-	 */
-	public void init(IViewSite site, IMemento memento) throws PartInitException {
-		super.init(site, memento);
-		IWorkbenchSiteProgressService progressService = getProgressService();
-		if (progressService != null) {
-			getProgressService().showBusyForFamily(
-					ResourcesPlugin.FAMILY_MANUAL_BUILD);
-			getProgressService().showBusyForFamily(
-					ResourcesPlugin.FAMILY_AUTO_BUILD);
-			getProgressService().showBusyForFamily(MARKER_UPDATE_FAMILY);
-		}
-		loadFiltersPreferences();
-
-	}
-
-	/**
-	 * Load the filters preference.
-	 */
-	private void loadFiltersPreferences() {
-
-		String preference = IDEWorkbenchPlugin.getDefault()
-				.getPreferenceStore().getString(getFiltersPreferenceName());
-
-		if (preference.equals(IPreferenceStore.STRING_DEFAULT_DEFAULT)) {
-			createDefaultFilter();
-			return;
-		}
-
-		StringReader reader = new StringReader(preference);
-		try {
-			restoreFilters(XMLMemento.createReadRoot(reader));
-		} catch (WorkbenchException e) {
-			IDEWorkbenchPlugin.log(e.getLocalizedMessage(), e);
-		}
-
-	}
-
-	/**
-	 * Update for filter changes. Save the preference and clear the enabled
-	 * cache.
-	 */
-	void updateForFilterChanges() {
-
-		XMLMemento memento = XMLMemento.createWriteRoot(TAG_FILTERS_SECTION);
-
-		writeFiltersSettings(memento);
-
-		StringWriter writer = new StringWriter();
-		try {
-			memento.save(writer);
-		} catch (IOException e) {
-			IDEWorkbenchPlugin.getDefault().getLog().log(Util.errorStatus(e));
-		}
-
-		IDEWorkbenchPlugin.getDefault().getPreferenceStore().putValue(
-				getFiltersPreferenceName(), writer.toString());
-		IDEWorkbenchPlugin.getDefault().savePluginPreferences();
-
-		clearEnabledFilters();
-		refreshFilterMenu();
-		refreshViewer();
-	}
-
-	/**
-	 * Write the filter settings to the memento.
-	 * 
-	 * @param memento
-	 */
-	protected void writeFiltersSettings(XMLMemento memento) {
-		MarkerFilter[] filters = getUserFilters();
-		for (int i = 0; i < filters.length; i++) {
-			IMemento child = memento.createChild(TAG_FILTER_ENTRY, filters[i]
-					.getName());
-			filters[i].saveFilterSettings(child);
-		}
-	}
-
-	/**
-	 * Get the name of the filters preference for instances of the receiver.
-	 * 
-	 * @return String
-	 */
-	abstract String getFiltersPreferenceName();
-
-	/**
-	 * Restore the filters from the mimento.
-	 * 
-	 * @param memento
-	 */
-	void restoreFilters(IMemento memento) {
-
-		IMemento[] sections = null;
-		if (memento != null) {
-			sections = memento.getChildren(TAG_FILTER_ENTRY);
-		}
-
-		if (sections == null) {
-			// Check if we have an old filter setting around
-			IDialogSettings mainSettings = getDialogSettings();
-			IDialogSettings filtersSection = mainSettings
-					.getSection(OLD_FILTER_SECTION);
-			if (filtersSection != null) {
-				MarkerFilter markerFilter = createFilter(MarkerMessages.MarkerFilter_defaultFilterName);
-				markerFilter.restoreFilterSettings(filtersSection);
-				setFilters(new MarkerFilter[] { markerFilter });
-			}
-
-		} else {
-			MarkerFilter[] newFilters = new MarkerFilter[sections.length];
-
-			for (int i = 0; i < sections.length; i++) {
-				newFilters[i] = createFilter(sections[i].getID());
-				newFilters[i].restoreState(sections[i]);
-			}
-			setFilters(newFilters);
-		}
-
-		if (markerFilters.length == 0) {// Make sure there is at least a default
-			createDefaultFilter();
-		}
-
-	}
-
-	/**
-	 * Create a default filter for the receiver.
-	 * 
-	 */
-	private void createDefaultFilter() {
-		MarkerFilter filter = createFilter(MarkerMessages.MarkerFilter_defaultFilterName);
-		setFilters(new MarkerFilter[] { filter });
-	}
-
-	/**
-	 * Create a filter called name.
-	 * 
-	 * @param name
-	 * @return MarkerFilter
-	 */
-	protected abstract MarkerFilter createFilter(String name);
-
-	/**
-	 * Return the memento tag for the receiver.
-	 * 
-	 * @return String
-	 */
-	protected abstract String getSectionTag();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.internal.tableview.TableView#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-
-		clipboard = new Clipboard(parent.getDisplay());
-		super.createPartControl(parent);
-
-		initDragAndDrop();
-
-		getSite().getPage().addSelectionListener(focusListener);
-		focusSelectionChanged(getSite().getPage().getActivePart(), getSite()
-				.getPage().getSelection());
-		PlatformUI.getWorkbench().getWorkingSetManager()
-				.addPropertyChangeListener(getWorkingSetListener());
-
-		// Set help on the view itself
-		getViewer().getControl().addHelpListener(new HelpListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.HelpListener#helpRequested(org.eclipse.swt.events.HelpEvent)
-			 */
-			public void helpRequested(HelpEvent e) {
-				IContext context = contextProvider.getContext(getViewer()
-						.getControl());
-				PlatformUI.getWorkbench().getHelpSystem().displayHelp(context);
-			}
-		});
-
-		// Hook up to the resource changes after all widget have been created
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(
-				markerUpdateListener,
-				IResourceChangeEvent.POST_CHANGE
-						| IResourceChangeEvent.PRE_BUILD
-						| IResourceChangeEvent.POST_BUILD);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adaptable) {
-		if (adaptable.equals(IContextProvider.class)) {
-			return contextProvider;
-		}
-		if (adaptable.equals(IShowInSource.class)) {
-			return new IShowInSource() {
-				public ShowInContext getShowInContext() {
-					ISelection selection = getViewer().getSelection();
-					if (!(selection instanceof IStructuredSelection)) {
-						return null;
-					}
-					IStructuredSelection structured = (IStructuredSelection) selection;
-					Iterator markerIterator = structured.iterator();
-					List newSelection = new ArrayList();
-					while (markerIterator.hasNext()) {
-						ConcreteMarker element = (ConcreteMarker) markerIterator
-								.next();
-						newSelection.add(element.getResource());
-					}
-					return new ShowInContext(getViewer().getInput(),
-							new StructuredSelection(newSelection));
-				}
-
-			};
-		}
-		return super.getAdapter(adaptable);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.TableView#viewerSelectionChanged(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	protected void viewerSelectionChanged(IStructuredSelection selection) {
-
-		Object[] rawSelection = selection.toArray();
-
-		List markers = new ArrayList();
-
-		for (int idx = 0; idx < rawSelection.length; idx++) {
-
-			if (rawSelection[idx] instanceof ConcreteMarker)
-				markers.add(((ConcreteMarker) rawSelection[idx]).getMarker());
-		}
-
-		setSelection(new StructuredSelection(markers));
-
-		updateStatusMessage(selection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.internal.tableview.TableView#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		cancelJobs();
-
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-				markerUpdateListener);
-		PlatformUI.getWorkbench().getWorkingSetManager()
-				.removePropertyChangeListener(workingSetListener);
-		IDEWorkbenchPlugin.getDefault().getPreferenceStore()
-				.removePropertyChangeListener(preferenceListener);
-		getSite().getPage().removeSelectionListener(focusListener);
-
-		// dispose of selection provider actions (may not have been created yet
-		// if createPartControls was never called)
-		if (openAction != null) {
-			openAction.dispose();
-			copyAction.dispose();
-			selectAllAction.dispose();
-			deleteAction.dispose();
-			revealAction.dispose();
-			propertiesAction.dispose();
-			undoAction.dispose();
-			redoAction.dispose();
-			clipboard.dispose();
-		}
-		if (showInMenu != null) {
-			showInMenu.dispose();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.internal.tableview.TableView#createActions()
-	 */
-	protected void createActions() {
-		revealAction = new ActionRevealMarker(this, getViewer());
-		openAction = new ActionOpenMarker(this, getViewer());
-		copyAction = new ActionCopyMarker(this, getViewer());
-		copyAction.setClipboard(clipboard);
-		copyAction.setProperties(getSortingFields());
-		pasteAction = new ActionPasteMarker(this, getViewer(), getMarkerName());
-		pasteAction.setClipboard(clipboard);
-		pasteAction.setPastableTypes(getMarkerTypes());
-		deleteAction = new ActionRemoveMarker(this, getViewer(),
-				getMarkerName());
-		selectAllAction = new ActionSelectAll(this);
-		propertiesAction = new ActionMarkerProperties(this, getViewer(),
-				getMarkerName());
-
-		IUndoContext undoContext = getUndoContext();
-		undoAction = new UndoActionHandler(getSite(), undoContext);
-		redoAction = new RedoActionHandler(getSite(), undoContext);
-
-		super.createActions();
-
-		setFilterAction(new FiltersAction(this));
-
-		setPreferencesAction(new ViewPreferencesAction() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.preferences.ViewPreferencesAction#openViewPreferencesDialog()
-			 */
-			public void openViewPreferencesDialog() {
-				openPreferencesDialog(getMarkerEnablementPreferenceName(),
-						getMarkerLimitPreferenceName());
-
-			}
-
-		});
-	}
-
-	/**
-	 * Open a dialog to set the preferences.
-	 * 
-	 * @param markerEnablementPreferenceName
-	 * @param markerLimitPreferenceName
-	 */
-	private void openPreferencesDialog(String markerEnablementPreferenceName,
-			String markerLimitPreferenceName) {
-
-		Dialog dialog = new MarkerViewPreferenceDialog(getSite()
-				.getWorkbenchWindow().getShell(),
-				markerEnablementPreferenceName, markerLimitPreferenceName,
-				MarkerMessages.MarkerPreferences_DialogTitle);
-		if (dialog.open() == Window.OK) {
-			refreshViewer();
-		}
-
-	}
-
-	/**
-	 * Get the name of the marker enablement preference.
-	 * 
-	 * @return String
-	 */
-	abstract String getMarkerLimitPreferenceName();
-
-	abstract String[] getMarkerTypes();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.internal.tableview.TableView#initToolBar(org.eclipse.jface.action.IToolBarManager)
-	 */
-	protected void initToolBar(IToolBarManager tbm) {
-		tbm.add(deleteAction);
-		tbm.add(getFilterAction());
-		tbm.update(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.internal.tableview.TableView#registerGlobalActions(org.eclipse.ui.IActionBars)
-	 */
-	protected void registerGlobalActions(IActionBars actionBars) {
-		copyAction.setActionDefinitionId("org.eclipse.ui.edit.copy"); //$NON-NLS-1$
-		pasteAction.setActionDefinitionId("org.eclipse.ui.edit.paste"); //$NON-NLS-1$
-		deleteAction.setActionDefinitionId("org.eclipse.ui.edit.delete"); //$NON-NLS-1$
-		selectAllAction.setActionDefinitionId("org.eclipse.ui.edit.selectAll"); //$NON-NLS-1$
-		propertiesAction
-				.setActionDefinitionId("org.eclipse.ui.file.properties"); //$NON-NLS-1$
-		undoAction.setActionDefinitionId("org.eclipse.ui.edit.undo"); //$NON-NLS-1$
-		redoAction.setActionDefinitionId("org.eclipse.ui.edit.redo"); //$NON-NLS-1$
-		
-		actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-				copyAction);
-		actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-				pasteAction);
-		actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-				deleteAction);
-		actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
-				selectAllAction);
-		actionBars.setGlobalActionHandler(ActionFactory.PROPERTIES.getId(),
-				propertiesAction);
-		actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
-				undoAction);
-		actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
-				redoAction);
-	}
-
-	protected void initDragAndDrop() {
-		int operations = DND.DROP_COPY;
-		Transfer[] transferTypes = new Transfer[] {
-				MarkerTransfer.getInstance(), TextTransfer.getInstance() };
-		DragSourceListener listener = new DragSourceAdapter() {
-			public void dragSetData(DragSourceEvent event) {
-				performDragSetData(event);
-			}
-
-			public void dragFinished(DragSourceEvent event) {
-			}
-		};
-
-		getViewer().addDragSupport(operations, transferTypes, listener);
-	}
-
-	/**
-	 * The user is attempting to drag marker data. Add the appropriate data to
-	 * the event depending on the transfer type.
-	 */
-	private void performDragSetData(DragSourceEvent event) {
-		if (MarkerTransfer.getInstance().isSupportedType(event.dataType)) {
-
-			event.data = getSelectedMarkers();
-			return;
-		}
-		if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
-			List selection = ((IStructuredSelection) getViewer().getSelection())
-					.toList();
-			try {
-				IMarker[] markers = new IMarker[selection.size()];
-				selection.toArray(markers);
-				if (markers != null) {
-					event.data = copyAction.createMarkerReport(markers);
-				}
-			} catch (ArrayStoreException e) {
-			}
-		}
-	}
-
-	/**
-	 * Get the array of selected markers.
-	 * 
-	 * @return IMarker[]
-	 */
-	private IMarker[] getSelectedMarkers() {
-		Object[] selection = ((IStructuredSelection) getViewer().getSelection())
-				.toArray();
-		ArrayList markers = new ArrayList();
-		for (int i = 0; i < selection.length; i++) {
-			if (selection[i] instanceof ConcreteMarker) {
-				markers.add(((ConcreteMarker) selection[i]).getMarker());
-			}
-		}
-		return (IMarker[]) markers.toArray(new IMarker[markers.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.internal.tableview.TableView#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	protected void fillContextMenu(IMenuManager manager) {
-		if (manager == null) {
-			return;
-		}
-		manager.add(openAction);
-		createShowInMenu(manager);
-		manager.add(new Separator());
-		manager.add(copyAction);
-		pasteAction.updateEnablement();
-		manager.add(pasteAction);
-
-		if (canBeEditable()) {
-			manager.add(deleteAction);
-		}
-		manager.add(selectAllAction);
-		fillContextMenuAdditions(manager);
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-		manager.add(new Separator());
-		manager.add(propertiesAction);
-	}
-
-	/**
-	 * Return whether or not any of the types in the receiver can be editable.
-	 * 
-	 * @return <code>true</code> if it is possible to have an editable marker
-	 *         in this view.
-	 */
-	boolean canBeEditable() {
-		return true;
-	}
-
-	/**
-	 * Fill the context menu for the receiver.
-	 * 
-	 * @param manager
-	 */
-	abstract void fillContextMenuAdditions(IMenuManager manager);
-
-	/**
-	 * Get the filters for the receiver.
-	 * 
-	 * @return MarkerFilter[]
-	 */
-	protected final MarkerFilter[] getUserFilters() {
-		return markerFilters;
-	}
-
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.internal.tableview.TableView#handleOpenEvent(org.eclipse.jface.viewers.OpenEvent)
-	 */
-	protected void handleOpenEvent(OpenEvent event) {
-		if (openAction.isEnabled()) {
-			openAction.run();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.internal.tableview.TableView#saveSelection(org.eclipse.ui.IMemento)
-	 */
-	protected void saveSelection(IMemento memento) {
-		IStructuredSelection selection = (IStructuredSelection) getViewer()
-				.getSelection();
-		IMemento selectionMem = memento.createChild(TAG_SELECTION);
-		for (Iterator iterator = selection.iterator(); iterator.hasNext();) {
-			Object next = iterator.next();
-			if (!(next instanceof ConcreteMarker)) {
-				continue;
-			}
-			ConcreteMarker marker = (ConcreteMarker) next;
-			IMemento elementMem = selectionMem.createChild(TAG_MARKER);
-			elementMem.putString(TAG_RESOURCE, marker.getMarker().getResource()
-					.getFullPath().toString());
-			elementMem.putString(TAG_ID, String.valueOf(marker.getMarker()
-					.getId()));
-		}
-	}
-
-	protected abstract String[] getRootTypes();
-
-	/**
-	 * @param part
-	 * @param selection
-	 */
-	protected void focusSelectionChanged(IWorkbenchPart part,
-			ISelection selection) {
-
-		List selectedElements = new ArrayList();
-		if (part instanceof IEditorPart) {
-			IEditorPart editor = (IEditorPart) part;
-			IFile file = ResourceUtil.getFile(editor.getEditorInput());
-			if (file == null) {
-				IEditorInput editorInput = editor.getEditorInput();
-				if (editorInput != null) {
-					Object mapping = editorInput
-							.getAdapter(ResourceMapping.class);
-					if (mapping != null) {
-						selectedElements.add(mapping);
-					}
-				}
-			} else {
-				selectedElements.add(file);
-			}
-		} else {
-			if (selection instanceof IStructuredSelection) {
-				for (Iterator iterator = ((IStructuredSelection) selection)
-						.iterator(); iterator.hasNext();) {
-					Object object = iterator.next();
-					if (object instanceof IAdaptable) {
-						ITaskListResourceAdapter taskListResourceAdapter;
-						Object adapter = ((IAdaptable) object)
-								.getAdapter(ITaskListResourceAdapter.class);
-						if (adapter != null
-								&& adapter instanceof ITaskListResourceAdapter) {
-							taskListResourceAdapter = (ITaskListResourceAdapter) adapter;
-						} else {
-							taskListResourceAdapter = DefaultMarkerResourceAdapter
-									.getDefault();
-						}
-
-						IResource resource = taskListResourceAdapter
-								.getAffectedResource((IAdaptable) object);
-						if (resource == null) {
-							Object mapping = ((IAdaptable) object)
-									.getAdapter(ResourceMapping.class);
-							if (mapping != null) {
-								selectedElements.add(mapping);
-							}
-						} else {
-							selectedElements.add(resource);
-						}
-					}
-				}
-			}
-		}
-		updateFocusMarkers(selectedElements.toArray());
-	}
-
-	/**
-	 * Update the focus resources of the filters.
-	 * 
-	 * @param elements
-	 */
-	protected final void updateFilterSelection(Object[] elements) {
-
-		Collection resourceCollection = new ArrayList();
-		for (int i = 0; i < elements.length; i++) {
-			if (elements[i] instanceof IResource) {
-				resourceCollection.add(elements[i]);
-			} else {
-				addResources(resourceCollection,
-						((ResourceMapping) elements[i]));
-			}
-		}
-
-		IResource[] resources = new IResource[resourceCollection.size()];
-		resourceCollection.toArray(resources);
-
-		for (int i = 0; i < markerFilters.length; i++) {
-			markerFilters[i].setFocusResource(resources);
-		}
-
-		Iterator systemFilters = MarkerSupportRegistry.getInstance()
-				.getRegisteredFilters().iterator();
-
-		while (systemFilters.hasNext()) {
-			MarkerFilter filter = (MarkerFilter) systemFilters.next();
-			filter.setFocusResource(resources);
-
-		}
-
-	}
-
-	/**
-	 * Add the resources for the mapping to resources.
-	 * 
-	 * @param resources
-	 * @param mapping
-	 */
-	private void addResources(Collection resources, ResourceMapping mapping) {
-		try {
-			ResourceTraversal[] traversals = mapping.getTraversals(
-					ResourceMappingContext.LOCAL_CONTEXT,
-					new NullProgressMonitor());
-			for (int i = 0; i < traversals.length; i++) {
-				ResourceTraversal traversal = traversals[i];
-				IResource[] result = traversal.getResources();
-				for (int j = 0; j < result.length; j++) {
-					resources.add(result[j]);
-				}
-			}
-		} catch (CoreException e) {
-			Policy.handle(e);
-			return;
-		}
-
-	}
-
-	protected abstract String getStaticContextId();
-
-	/**
-	 * Update the focus markers for the supplied elements.
-	 * 
-	 * @param elements
-	 */
-	void updateFocusMarkers(Object[] elements) {
-		boolean updateNeeded = updateNeeded(focusElements, elements);
-		if (updateNeeded) {
-			focusElements = elements;
-			refreshForFocusUpdate();
-		}
-	}
-
-	private boolean updateNeeded(Object[] oldElements, Object[] newElements) {
-		// determine if an update if refiltering is required
-		MarkerFilter[] filters = getEnabledFilters();
-		boolean updateNeeded = false;
-
-		for (int i = 0; i < filters.length; i++) {
-			MarkerFilter filter = filters[i];
-			if (!filter.isEnabled()) {
-				continue;
-			}
-
-			int onResource = filter.getOnResource();
-			if (onResource == MarkerFilter.ON_ANY
-					|| onResource == MarkerFilter.ON_WORKING_SET) {
-				continue;
-			}
-			if (newElements == null || newElements.length < 1) {
-				continue;
-			}
-			if (oldElements == null || oldElements.length < 1) {
-				return true;
-			}
-			if (Arrays.equals(oldElements, newElements)) {
-				continue;
-			}
-			if (onResource == MarkerFilter.ON_ANY_IN_SAME_CONTAINER) {
-				Collection oldProjects = MarkerFilter
-						.getProjectsAsCollection(oldElements);
-				Collection newProjects = MarkerFilter
-						.getProjectsAsCollection(newElements);
-
-				if (oldProjects.size() == newProjects.size()) {
-					if (newProjects.containsAll(oldProjects)) {
-						continue;
-					}
-				}
-
-				return true;
-			}
-			updateNeeded = true;// We are updating as there is nothing to stop
-			// us
-		}
-
-		return updateNeeded;
-	}
-
-	void updateTitle() {
-		String status = Util.EMPTY_STRING;
-		int filteredCount = getCurrentMarkers().getItemCount();
-		int totalCount = getTotalMarkers();
-		if (filteredCount == totalCount) {
-			status = NLS.bind(MarkerMessages.filter_itemsMessage, new Integer(
-					totalCount));
-		} else {
-			status = NLS.bind(MarkerMessages.filter_matchedMessage,
-					new Integer(filteredCount), new Integer(totalCount));
-		}
-		setContentDescription(status);
-	}
-
-	/**
-	 * Updates the message displayed in the status line. This method is invoked
-	 * in the following cases:
-	 * <ul>
-	 * <li>when this view is first created</li>
-	 * <li>when new elements are added</li>
-	 * <li>when something is deleted</li>
-	 * <li>when the filters change</li>
-	 * </ul>
-	 * <p>
-	 * By default, this method calls
-	 * <code>updateStatusMessage(IStructuredSelection)</code> with the current
-	 * selection or <code>null</code>. Classes wishing to override this
-	 * functionality, should just override the method
-	 * <code>updateStatusMessage(IStructuredSelection)</code>.
-	 * </p>
-	 */
-	protected void updateStatusMessage() {
-		ISelection selection = getViewer().getSelection();
-
-		if (selection instanceof IStructuredSelection) {
-			updateStatusMessage((IStructuredSelection) selection);
-		} else {
-			updateStatusMessage(null);
-		}
-	}
-
-	/**
-	 * Updates that message displayed in the status line. If the selection
-	 * parameter is <code>null</code> or its size is 0, the status area is
-	 * blanked out. If only 1 marker is selected, the status area is updated
-	 * with the contents of the message attribute of this marker. In other cases
-	 * (more than one marker is selected) the status area indicates how many
-	 * items have been selected.
-	 * <p>
-	 * This method may be overwritten.
-	 * </p>
-	 * <p>
-	 * This method is called whenever a selection changes in this view.
-	 * </p>
-	 * 
-	 * @param selection
-	 *            a valid selection or <code>null</code>
-	 */
-	protected void updateStatusMessage(IStructuredSelection selection) {
-		String message = ""; //$NON-NLS-1$
-
-		if (selection == null || selection.size() == 0) {
-			// Show stats on all items in the view
-			message = updateSummaryVisible();
-		} else if (selection.size() == 1) {
-			// Use the Message attribute of the marker
-			Object first = selection.getFirstElement();
-			if (first instanceof ConcreteMarker) {
-				message = ((ConcreteMarker) first).getDescription();
-			}
-		} else if (selection.size() > 1) {
-			// Show stats on only those items in the selection
-			message = updateSummarySelected(selection);
-		}
-		getViewSite().getActionBars().getStatusLineManager()
-				.setMessage(message);
-	}
-
-	/**
-	 * @param selection
-	 * @return the summary status message
-	 */
-	protected String updateSummarySelected(IStructuredSelection selection) {
-		// Show how many items selected
-		return MessageFormat.format(
-				MarkerMessages.marker_statusSummarySelected,
-				new Object[] { new Integer(selection.size()) });
-	}
-
-	/**
-	 * @return the update summary
-	 */
-	protected String updateSummaryVisible() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * Open a dialog on the filters
-	 * 
-	 */
-	public final void openFiltersDialog() {
-
-		DialogMarkerFilter dialog = createFiltersDialog();
-
-		if (dialog.open() == Window.OK) {
-
-			MarkerFilter[] result = dialog.getFilters();
-			if (result == null) {
-				return;
-			}
-			if (result.length == 0) {
-				setFilters(new MarkerFilter[] { createFilter(MarkerMessages.MarkerFilter_defaultFilterName) });
-			} else {
-				setFilters(result);
-			}
-
-			updateForFilterChanges();
-		}
-	}
-
-	/**
-	 * Refresh the contents of the viewer.
-	 */
-	public void refreshViewer() {
-		scheduleMarkerUpdate(Util.SHORT_DELAY);
-	}
-
-	/**
-	 * Set the filters to newFilters.
-	 * 
-	 * @param newFilters
-	 */
-	void setFilters(MarkerFilter[] newFilters) {
-		markerFilters = newFilters;
-	}
-
-	/**
-	 * Clear the cache of enabled filters.
-	 * 
-	 */
-	void clearEnabledFilters() {
-		enabledFilters = null;
-	}
-
-	/**
-	 * Refresh the contents of the filter sub menu.
-	 */
-	private void refreshFilterMenu() {
-		if (filtersMenu == null) {
-			return;
-		}
-		filtersMenu.removeAll();
-		MarkerFilter[] filters = getAllFilters();
-		for (int i = 0; i < filters.length; i++) {
-			filtersMenu.add(new FilterEnablementAction(filters[i], this));
-		}
-
-	}
-
-	/**
-	 * Open a filter dialog on the receiver.
-	 */
-	protected abstract DialogMarkerFilter createFiltersDialog();
-
-	/**
-	 * Given a selection of IMarker, reveals the corresponding elements in the
-	 * viewer
-	 * 
-	 * @param structuredSelection
-	 * @param reveal
-	 */
-	public void setSelection(IStructuredSelection structuredSelection,
-			boolean reveal) {
-		TreeViewer viewer = getViewer();
-
-		List newSelection = new ArrayList(structuredSelection.size());
-
-		for (Iterator i = structuredSelection.iterator(); i.hasNext();) {
-			Object next = i.next();
-			if (next instanceof IMarker) {
-				ConcreteMarker marker = getCurrentMarkers().getMarker(
-						(IMarker) next);
-				if (marker != null) {
-					newSelection.add(marker);
-				}
-			}
-		}
-
-		if (viewer != null) {
-			viewer.setSelection(new StructuredSelection(newSelection), reveal);
-		}
-	}
-
-	protected MarkerList getVisibleMarkers() {
-		return getCurrentMarkers();
-	}
-
-	/**
-	 * Returns the total number of markers. Should not be called while the
-	 * marker list is still updating.
-	 * 
-	 * @return the total number of markers in the workspace (including
-	 *         everything that doesn't pass the filters)
-	 */
-	int getTotalMarkers() {
-		// The number of visible markers should never exceed the total number of
-		// markers in
-		// the workspace. If this assertation fails, it probably indicates some
-		// sort of concurrency problem
-		// (most likely, getTotalMarkers was called while we were still
-		// computing the marker lists)
-		// Assert.isTrue(totalMarkers >= currentMarkers.getItemCount());
-
-		return totalMarkers;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean)
-	 */
-	public void showBusy(boolean busy) {
-		super.showBusy(busy);
-
-		if (busy) {
-			preBusyMarkers = totalMarkers;
-		} else {// Only bold if there has been a change in count
-			if (totalMarkers != preBusyMarkers) {
-				getProgressService().warnOfContentChange();
-			}
-		}
-
-	}
-
-	/**
-	 * Get the filters that are currently enabled.
-	 * 
-	 * @return MarkerFilter[]
-	 */
-	MarkerFilter[] getEnabledFilters() {
-
-		if (enabledFilters == null) {
-			Collection filters = findEnabledFilters();
-
-			enabledFilters = new MarkerFilter[filters.size()];
-			filters.toArray(enabledFilters);
-		}
-		return enabledFilters;
-
-	}
-
-	/**
-	 * Find the filters enabled in the view.
-	 * 
-	 * @return Collection of MarkerFilter
-	 */
-	protected Collection findEnabledFilters() {
-		MarkerFilter[] allFilters = getAllFilters();
-		ArrayList filters = new ArrayList(0);
-		for (int i = 0; i < allFilters.length; i++) {
-			if (allFilters[i].isEnabled()) {
-				filters.add(allFilters[i]);
-			}
-		}
-		return filters;
-	}
-
-	/**
-	 * Get all of the filters applied to the receiver.
-	 * 
-	 * @return MarkerFilter[]
-	 */
-	MarkerFilter[] getAllFilters() {
-		return getUserFilters();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.TableView#addDropDownContributions(org.eclipse.jface.action.IMenuManager)
-	 */
-	void addDropDownContributions(IMenuManager menu) {
-		super.addDropDownContributions(menu);
-
-		menu.add(new Separator(MENU_FILTERS_GROUP));
-		// Don't add in the filters until they are set
-		filtersMenu = new MenuManager(MarkerMessages.filtersSubMenu_title);
-		refreshFilterMenu();
-		menu.appendToGroup(MENU_FILTERS_GROUP, filtersMenu);
-	}
-
-	/**
-	 * Create the show in menu if there is a single selection.
-	 * 
-	 * @param menu
-	 */
-	void createShowInMenu(IMenuManager menu) {
-		ISelection selection = getViewer().getSelection();
-		if (!(selection instanceof IStructuredSelection)) {
-			return;
-		}
-
-		IStructuredSelection structured = (IStructuredSelection) selection;
-		if (!Util.isSingleConcreteSelection(structured)) {
-			return;
-		}
-
-		menu.add(new Separator(MENU_SHOW_IN_GROUP));
-		// Don't add in the filters until they are set
-
-		String showInLabel = IDEWorkbenchMessages.Workbench_showIn;
-		IBindingService bindingService = (IBindingService) PlatformUI
-				.getWorkbench().getAdapter(IBindingService.class);
-		if (bindingService != null) {
-			String keyBinding = bindingService
-					.getBestActiveBindingFormattedFor("org.eclipse.ui.navigate.showInQuickMenu"); //$NON-NLS-1$
-			if (keyBinding != null) {
-				showInLabel += '\t' + keyBinding;
-			}
-		}
-		showInMenu = new MenuManager(showInLabel);
-		showInMenu.add(ContributionItemFactory.VIEWS_SHOW_IN
-				.create(getViewSite().getWorkbenchWindow()));
-
-		menu.appendToGroup(MENU_SHOW_IN_GROUP, showInMenu);
-
-	}
-
-	/**
-	 * Refresh the marker counts
-	 * 
-	 * @param monitor
-	 */
-	void refreshMarkerCounts(IProgressMonitor monitor) {
-		monitor.subTask(MarkerMessages.MarkerView_refreshing_counts);
-		try {
-			totalMarkers = MarkerList.compute(getMarkerTypes()).length;
-		} catch (CoreException e) {
-			Policy.handle(e);
-			return;
-		}
-
-	}
-
-	/**
-	 * Returns the marker limit or -1 if unlimited
-	 * 
-	 * @return int
-	 */
-	int getMarkerLimit() {
-
-		// If limits are enabled return it. Otherwise return -1
-		if (IDEWorkbenchPlugin.getDefault().getPreferenceStore().getBoolean(
-				getMarkerEnablementPreferenceName())) {
-			return IDEWorkbenchPlugin.getDefault().getPreferenceStore().getInt(
-					getMarkerLimitPreferenceName());
-
-		}
-		return -1;
-
-	}
-
-	/**
-	 * Get the name of the marker limit preference.
-	 * 
-	 * @return String
-	 */
-	abstract String getMarkerEnablementPreferenceName();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.TableView#createViewerInput()
-	 */
-	Object createViewerInput() {
-		adapter = new MarkerAdapter(this);
-		return adapter;
-	}
-
-	/**
-	 * Add a listener for the end of the update.
-	 * 
-	 * @param listener
-	 */
-	public void addUpdateFinishListener(IJobChangeListener listener) {
-		updateJob.addJobChangeListener(listener);
-
-	}
-
-	/**
-	 * Remove a listener for the end of the update.
-	 * 
-	 * @param listener
-	 */
-	public void removeUpdateFinishListener(IJobChangeListener listener) {
-		updateJob.removeJobChangeListener(listener);
-
-	}
-
-	/**
-	 * Create a listener for working set changes.
-	 * 
-	 * @return IPropertyChangeListener
-	 */
-	private IPropertyChangeListener getWorkingSetListener() {
-		workingSetListener = new IPropertyChangeListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-			 */
-			public void propertyChange(PropertyChangeEvent event) {
-				clearEnabledFilters();
-				refreshViewer();
-
-			}
-		};
-		return workingSetListener;
-	}
-
-	/**
-	 * Schedule an update of the markers with a delay of time
-	 * 
-	 * @param time
-	 */
-	void scheduleMarkerUpdate(int time) {
-		cancelJobs();
-		getProgressService().schedule(markerProcessJob, time);
-	}
-
-	/**
-	 * Cancel the pending jobs in the receiver.
-	 */
-	private void cancelJobs() {
-		markerProcessJob.cancel();
-		updateJob.cancel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.TableView#createTree(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Tree createTree(Composite parent) {
-		Tree tree = super.createTree(parent);
-		tree.addTreeListener(new TreeAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.TreeAdapter#treeCollapsed(org.eclipse.swt.events.TreeEvent)
-			 */
-			public void treeCollapsed(TreeEvent e) {
-				updateJob.removeExpandedCategory((MarkerCategory) e.item
-						.getData());
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.TreeAdapter#treeExpanded(org.eclipse.swt.events.TreeEvent)
-			 */
-			public void treeExpanded(TreeEvent e) {
-				updateJob
-						.addExpandedCategory((MarkerCategory) e.item.getData());
-			}
-		});
-
-		return tree;
-	}
-
-	/**
-	 * The focus elements have changed. Update accordingly.
-	 */
-	private void refreshForFocusUpdate() {
-		if (focusElements != null) {
-			updateFilterSelection(focusElements);
-			refreshViewer();
-		}
-	}
-
-	/**
-	 * Save the current selection in the update for reselection after update.
-	 */
-	protected void preserveSelection() {
-		updateJob.saveSelection(getViewer().getSelection());
-
-	}
-
-	/**
-	 * Return the string name of the specific type of marker shown in this view.
-	 */
-	protected abstract String getMarkerName();
-
-	/**
-	 * Return the undo context associated with operations performed in this
-	 * view. By default, return the workspace undo context. Subclasses should
-	 * override if a more specific undo context should be used.
-	 */
-	protected IUndoContext getUndoContext() {
-		return (IUndoContext) ResourcesPlugin.getWorkspace().getAdapter(
-				IUndoContext.class);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerViewLabelProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerViewLabelProvider.java
deleted file mode 100644
index eb6df1a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerViewLabelProvider.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The MarkerViewLabelProvider is a label provider for an individual field.
- * 
- * @since 3.3
- * 
- */
-public class MarkerViewLabelProvider extends ColumnLabelProvider {
-
-	IField field;
-
-	/**
-	 * Create a MarkerViewLabelProvider on a field
-	 * 
-	 * @param field
-	 */
-	MarkerViewLabelProvider(IField field) {
-		this.field = field;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object element) {
-		return field.getValue(element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ColumnLabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object element) {
-		return field.getImage(element);
-	}
-
-	
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerViewPreferenceDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerViewPreferenceDialog.java
deleted file mode 100644
index d6a96f3..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerViewPreferenceDialog.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-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.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.preferences.ViewSettingsDialog;
-
-/**
- * The MarkerViewPreferenceDialog is the dialog that is used for preference
- * settings in a markers view.
- * 
- * @since 3.1
- * 
- */
-public class MarkerViewPreferenceDialog extends ViewSettingsDialog {
-
-	String enablementKey;
-
-	String limitKey;
-
-	String dialogTitle;
-
-	private IntegerFieldEditor limitEditor;
-
-	private Button enablementButton;
-
-	private Composite editArea;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param parentShell
-	 * @param enablementPreference
-	 *            The key for the enablement preference.
-	 * @param limitPreference
-	 *            The key for the limit preference.
-	 * @param title
-	 *            The title for the dialog.
-	 */
-	public MarkerViewPreferenceDialog(Shell parentShell,
-			String enablementPreference, String limitPreference, String title) {
-		super(parentShell);
-		enablementKey = enablementPreference;
-		limitKey = limitPreference;
-		dialogTitle = title;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(dialogTitle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite topComposite = (Composite) super.createDialogArea(parent);
-
-		boolean checked = IDEWorkbenchPlugin.getDefault().getPreferenceStore()
-				.getBoolean(enablementKey);
-		enablementButton = new Button(topComposite, SWT.CHECK);
-		enablementButton.setText(MarkerMessages.MarkerPreferences_MarkerLimits);
-		enablementButton.setSelection(checked);
-
-		editArea = new Composite(topComposite, SWT.NONE);
-		editArea.setLayout(new GridLayout());
-		GridData editData = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
-		editData.horizontalIndent = 10;
-		editArea.setLayoutData(editData);
-
-		limitEditor = new IntegerFieldEditor(
-				"limit", MarkerMessages.MarkerPreferences_VisibleItems, editArea){ //$NON-NLS-1$
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.preference.IntegerFieldEditor#checkState()
-			 */
-			protected boolean checkState() {
-				boolean state = super.checkState();
-				Button okButton = getButton(IDialogConstants.OK_ID);
-				if (okButton != null){
-					okButton.setEnabled(state);
-				}
-				return state;
-			}
-		};
-		limitEditor.setPreferenceStore(IDEWorkbenchPlugin.getDefault()
-				.getPreferenceStore());
-		limitEditor.setPreferenceName(limitKey);
-		limitEditor.load();
-
-		GridData checkedData = new GridData(SWT.FILL, SWT.NONE, true, false);
-		checkedData.horizontalSpan = limitEditor.getNumberOfControls();
-		enablementButton.setLayoutData(checkedData);
-
-		enablementButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				setLimitEditorEnablement(editArea, enablementButton
-						.getSelection());
-			}
-		});
-
-		setLimitEditorEnablement(editArea, checked);
-
-		return topComposite;
-	}
-
-	/**
-	 * Enable the limitEditor based on checked.
-	 * 
-	 * @param control
-	 *            The parent of the editor
-	 * @param checked
-	 */
-	private void setLimitEditorEnablement(Composite control, boolean checked) {
-		limitEditor.setEnabled(checked, control);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		limitEditor.store();
-		IDEWorkbenchPlugin.getDefault().getPreferenceStore().setValue(
-				enablementKey, enablementButton.getSelection());
-		IDEWorkbenchPlugin.getDefault().savePluginPreferences();
-		super.okPressed();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.preferences.ViewSettingsDialog#performDefaults()
-	 */
-	protected void performDefaults() {
-		super.performDefaults();
-		limitEditor.loadDefault();
-		boolean checked = IDEWorkbenchPlugin.getDefault().getPreferenceStore()
-				.getDefaultBoolean(enablementKey);
-		enablementButton.setSelection(checked);
-		setLimitEditorEnablement(editArea, checked);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ProblemFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ProblemFilter.java
deleted file mode 100644
index 61ac2f2..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ProblemFilter.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPluginContribution;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.IIdentifier;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-import org.eclipse.ui.internal.views.markers.MarkerSupportInternalUtilities;
-
-/**
- * ProblemFilters are the filters used in the problems view.
- * 
- */
-public class ProblemFilter extends MarkerFilter {
-
-	/**
-	 * Tag for contains boolean
-	 */
-	public static final String TAG_CONTAINS = "contains"; //$NON-NLS-1$
-	/**
-	 * Tag for contains description.
-	 */
-	public static final String TAG_DESCRIPTION = "description"; //$NON-NLS-1$
-
-	private static final String TAG_SELECT_BY_SEVERITY = "selectBySeverity"; //$NON-NLS-1$
-
-	/**
-	 * Tag for the severity value
-	 */
-	public static final String TAG_SEVERITY = "severity"; //$NON-NLS-1$
-
-	final static boolean DEFAULT_CONTAINS = true;
-
-	final static String DEFAULT_DESCRIPTION = ""; //$NON-NLS-1$	
-
-	final static boolean DEFAULT_SELECT_BY_SEVERITY = false;
-
-	final static int DEFAULT_SEVERITY = 0;
-
-	/**
-	 * Severity for errors
-	 */
-	public final static int SEVERITY_ERROR = 1 << 2;
-
-	/**
-	 * Severity for warnings
-	 */
-	public final static int SEVERITY_WARNING = 1 << 1;
-
-	/**
-	 * Severity for infos
-	 */
-	public final static int SEVERITY_INFO = 1 << 0;
-
-	private boolean contains;
-
-	private String description;
-
-	private boolean selectBySeverity;
-
-	private int severity;
-
-	private IPluginContribution contributionDescriptor = null;
-
-	private IIdentifier identifier;
-
-	/**
-	 * Create a new instance of the receiver with name filterName.
-	 * 
-	 * @param filterName
-	 *            A human readable name for the filter.
-	 */
-	public ProblemFilter(String filterName) {
-		super(filterName, new String[] { IMarker.PROBLEM });
-		if ((PlatformUI.getPreferenceStore()
-				.getBoolean(IWorkbenchPreferenceConstants.USE_WINDOW_WORKING_SET_BY_DEFAULT))) {
-			IWorkbenchWindow window = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow();
-			if (window != null) {
-				IWorkbenchPage page = window.getActivePage();
-				if (page != null) {
-					setOnResource(MarkerFilter.ON_WORKING_SET);
-					setWorkingSet(page.getAggregateWorkingSet());
-				}
-			}
-		}
-
-	}
-
-	public boolean selectMarker(ConcreteMarker marker) {
-		if (!(marker instanceof ProblemMarker)) {
-			return false;
-		}
-
-		ProblemMarker problemMarker = (ProblemMarker) marker;
-
-		return !isEnabled()
-				|| (super.selectMarker(problemMarker)
-						&& selectByDescription(problemMarker) && selectBySeverity(problemMarker));
-	}
-
-	private boolean selectByDescription(ConcreteMarker item) {
-		if (description == null || description.equals("")) { //$NON-NLS-1$
-			return true;
-		}
-
-		String markerDescription = item.getDescription();
-		int index = markerDescription.indexOf(description);
-		return contains ? (index >= 0) : (index < 0);
-	}
-
-	private boolean selectBySeverity(ProblemMarker item) {
-		if (selectBySeverity) {
-			int markerSeverity = item.getSeverity();
-
-			if (markerSeverity == IMarker.SEVERITY_ERROR) {
-				return (severity & SEVERITY_ERROR) > 0;
-			} else if (markerSeverity == IMarker.SEVERITY_WARNING) {
-				return (severity & SEVERITY_WARNING) > 0;
-			} else if (markerSeverity == IMarker.SEVERITY_INFO) {
-				return (severity & SEVERITY_INFO) > 0;
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * Get the value for if there is a check for containing a phrase.
-	 * 
-	 * @return boolean
-	 */
-	public boolean getContains() {
-		return contains;
-	}
-
-	/**
-	 * Get the value for the description.
-	 * 
-	 * @return boolean
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	/**
-	 * Get the value for if there is a check for severity.
-	 * 
-	 * @return boolean
-	 */
-	public boolean getSelectBySeverity() {
-		return selectBySeverity;
-	}
-
-	/**
-	 * Get the value for if there is a severity.
-	 * 
-	 * @return boolean
-	 */
-	public int getSeverity() {
-		return severity;
-	}
-
-	/**
-	 * Set the value for if there is a check for containing a phrase.
-	 * 
-	 * @param contains
-	 */
-	public void setContains(boolean contains) {
-		this.contains = contains;
-	}
-
-	/**
-	 * Set the value for the description.
-	 * 
-	 * @param description
-	 */
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	/**
-	 * Set the value for if there is a check for severity
-	 * 
-	 * @param selectBySeverity
-	 */
-	public void setSelectBySeverity(boolean selectBySeverity) {
-		this.selectBySeverity = selectBySeverity;
-	}
-
-	/**
-	 * Set the value for the severity to match against.
-	 * 
-	 * @param severity
-	 */
-	public void setSeverity(int severity) {
-		this.severity = severity;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerFilter#resetState()
-	 */
-	public void resetState() {
-		super.resetState();
-		contains = DEFAULT_CONTAINS;
-		description = DEFAULT_DESCRIPTION;
-		selectBySeverity = DEFAULT_SELECT_BY_SEVERITY;
-		severity = DEFAULT_SEVERITY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerFilter#restoreFilterSettings(org.eclipse.jface.dialogs.IDialogSettings)
-	 */
-	public void restoreFilterSettings(IDialogSettings settings) {
-
-		super.restoreFilterSettings(settings);
-
-		String setting = settings.get(TAG_CONTAINS);
-
-		if (setting != null) {
-			contains = Boolean.valueOf(setting).booleanValue();
-		}
-
-		setting = settings.get(TAG_DESCRIPTION);
-
-		if (setting != null) {
-			description = new String(setting);
-		}
-
-		setting = settings.get(TAG_SELECT_BY_SEVERITY);
-
-		if (setting != null) {
-			selectBySeverity = Boolean.valueOf(setting).booleanValue();
-		}
-
-		setting = settings.get(TAG_SEVERITY);
-
-		if (setting != null) {
-			try {
-				severity = Integer.parseInt(setting);
-			} catch (NumberFormatException eNumberFormat) {
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerFilter#restoreFilterSettings(org.eclipse.ui.IMemento)
-	 */
-	protected void restoreFilterSettings(IMemento memento) {
-
-		super.restoreFilterSettings(memento);
-
-		String setting = memento.getString(TAG_CONTAINS);
-
-		if (setting != null) {
-			contains = Boolean.valueOf(setting).booleanValue();
-		}
-
-		setting = memento.getString(TAG_DESCRIPTION);
-
-		if (setting != null) {
-			description = new String(setting);
-		}
-
-		setting = memento.getString(TAG_SELECT_BY_SEVERITY);
-
-		if (setting != null) {
-			selectBySeverity = Boolean.valueOf(setting).booleanValue();
-		}
-
-		Integer severitySetting = memento.getInteger(TAG_SEVERITY);
-
-		if (setting != null) {
-			severity = severitySetting.intValue();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerFilter#saveFilterSettings(org.eclipse.ui.IMemento)
-	 */
-	public void saveFilterSettings(IMemento settings) {
-		super.saveFilterSettings(settings);
-		settings.putString(TAG_CONTAINS, String.valueOf(contains));
-		settings.putString(TAG_DESCRIPTION, description);
-		settings.putString(TAG_SELECT_BY_SEVERITY, String
-				.valueOf(selectBySeverity));
-		settings.putInteger(TAG_SEVERITY, severity);
-
-	}
-
-	/**
-	 * Get the id of the filter. <code>null</code> if the filter is user
-	 * defined.
-	 * 
-	 * @return String
-	 */
-	public String getId() {
-		if (contributionDescriptor == null) {
-			return null;
-		}
-		return contributionDescriptor.getLocalId();
-	}
-
-	void createContributionFrom(IConfigurationElement element) {
-		final String id = element.getAttribute(MarkerSupportInternalUtilities.ATTRIBUTE_ID);
-		final String namespace = element.getNamespace();
-		contributionDescriptor = new IPluginContribution() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.IPluginContribution#getLocalId()
-			 */
-			public String getLocalId() {
-				return id;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.IPluginContribution#getPluginId()
-			 */
-			public String getPluginId() {
-				return namespace;
-			}
-		};
-	}
-
-	/**
-	 * Return whether or not the receiver will be filtered out due to an
-	 * activity match.
-	 * 
-	 * @return boolean <code>true</code> if it is filtered out.
-	 */
-	public boolean isFilteredOutByActivity() {
-		if (contributionDescriptor == null) {
-			return false;
-		}
-		if (identifier == null) {
-			identifier = WorkbenchActivityHelper
-					.getIdentifier(contributionDescriptor);
-		}
-		return !identifier.isEnabled();
-	}
-
-	public boolean isEnabled() {
-		return super.isEnabled() && !isFilteredOutByActivity();
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ProblemMarker.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ProblemMarker.java
deleted file mode 100644
index cd56fa8..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ProblemMarker.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IMarker;
-
-/**
- * 
- */
-public class ProblemMarker extends ConcreteMarker {
-
-    private int severity;
-
-    public ProblemMarker(IMarker toCopy) {
-        super(toCopy);
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.views.markers.internal.ConcreteMarker#refresh()
-     */
-    public void refresh() {
-        super.refresh();
-        severity = getMarker().getAttribute(IMarker.SEVERITY, -1);
-    }
-
-    public int getSeverity() {
-        return severity;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ProblemView.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ProblemView.java
deleted file mode 100644
index a948eba..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/ProblemView.java
+++ /dev/null
@@ -1,684 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de>
- *     	 - Fix for Bug 109361 [Markers] Multiselection in problems view yields invalid status message
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import com.ibm.icu.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.commands.ActionHandler;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.activities.ActivityManagerEvent;
-import org.eclipse.ui.activities.IActivityManagerListener;
-import org.eclipse.ui.handlers.IHandlerActivation;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
-
-/**
- * The ProblemView is the view that displays problem markers.
- * 
- */
-public class ProblemView extends MarkerView {
-
-	private final static String[] ROOT_TYPES = { IMarker.PROBLEM };
-
-	private final static String TAG_DIALOG_SECTION = "org.eclipse.ui.views.problem"; //$NON-NLS-1$
-
-	private static final String TAG_SYSTEM_FILTER_ENTRY = "systemFilter";//$NON-NLS-1$
-
-	private ActionResolveMarker resolveMarkerAction;
-
-	private IHandlerService handlerService;
-
-	private IHandlerActivation resolveMarkerHandlerActivation;
-
-	private IActivityManagerListener activityManagerListener;
-
-	private IField severityAndMessage = new FieldSeverityAndMessage();
-
-	private IField folder = new FieldFolder();
-
-	private IField resource = new FieldResource();
-
-	private IField lineNumber = new FieldLineNumber();
-
-	private IField creationTime = new FieldCreationTime();
-
-	// Add the marker ID so the table sorter won't reduce
-	// errors on the same line bug 82502
-	private static IField id = new FieldId();
-
-	private class GroupingAction extends Action {
-
-		IField groupingField;
-
-		ProblemView problemView;
-
-		/**
-		 * Create a new instance of the receiver.
-		 * 
-		 * @param label
-		 * @param field
-		 * @param view
-		 */
-		public GroupingAction(String label, IField field, ProblemView view) {
-			super(label, IAction.AS_RADIO_BUTTON);
-
-			groupingField = field;
-			problemView = view;
-			IField categoryField = view.getMarkerAdapter().getCategorySorter()
-					.getCategoryField();
-			if (categoryField == null) {
-				setChecked(groupingField == null);
-			} else {
-				setChecked(categoryField.equals(groupingField));
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-
-			if (isChecked()) {
-				Job categoryJob = new Job(
-						MarkerMessages.ProblemView_UpdateCategoryJob) {
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-					 */
-					protected IStatus run(IProgressMonitor monitor) {
-						try {
-							markerProcessJob.join();
-						} catch (InterruptedException e) {
-							return Status.CANCEL_STATUS;
-						}
-						problemView.selectCategoryField(groupingField,
-								problemView.getMarkerAdapter()
-										.getCategorySorter());
-
-						getMarkerAdapter().getCategorySorter().saveState(
-								getDialogSettings());
-						return Status.OK_STATUS;
-					}
-				};
-				categoryJob.setSystem(true);
-				problemView.preserveSelection();
-
-				IWorkbenchSiteProgressService progressService = getProgressService();
-				if (progressService == null)
-					categoryJob.schedule();
-				else
-					getProgressService().schedule(categoryJob);
-
-			}
-
-		}
-	}
-
-	/**
-	 * Return a new instance of the receiver.
-	 */
-	public ProblemView() {
-		super();
-		creationTime.setShowing(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#dispose()
-	 */
-	public void dispose() {
-		if (resolveMarkerAction != null) {
-			resolveMarkerAction.dispose();
-		}
-		if (resolveMarkerHandlerActivation != null && handlerService != null) {
-			handlerService.deactivateHandler(resolveMarkerHandlerActivation);
-		}
-
-		PlatformUI.getWorkbench().getActivitySupport().getActivityManager()
-				.removeActivityManagerListener(activityManagerListener);
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.TableView#getSortingFields()
-	 */
-	protected IField[] getSortingFields() {
-		return new IField[] { severityAndMessage, folder, resource, lineNumber,
-				creationTime,
-				// Add the marker ID so the table sorter won't reduce
-				// errors on the same line bug 82502
-				id };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.TableView#getDialogSettings()
-	 */
-	protected IDialogSettings getDialogSettings() {
-		IDialogSettings workbenchSettings = IDEWorkbenchPlugin.getDefault()
-				.getDialogSettings();
-		IDialogSettings settings = workbenchSettings
-				.getSection(TAG_DIALOG_SECTION);
-
-		if (settings == null) {
-			settings = workbenchSettings.addNewSection(TAG_DIALOG_SECTION);
-		}
-
-		return settings;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.TableView#createActions()
-	 */
-	protected void createActions() {
-		super.createActions();
-		propertiesAction = new ActionProblemProperties(this, getViewer());
-		resolveMarkerAction = new ActionResolveMarker(this, getViewer());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.internal.tableview.TableView#registerGlobalActions(org.eclipse.ui.IActionBars)
-	 */
-	protected void registerGlobalActions(IActionBars actionBars) {
-		super.registerGlobalActions(actionBars);
-
-		String quickFixId = "org.eclipse.jdt.ui.edit.text.java.correction.assist.proposals"; //$NON-NLS-1$
-		resolveMarkerAction.setActionDefinitionId(quickFixId);
-
-		handlerService = (IHandlerService) getViewSite().getService(
-				IHandlerService.class);
-		if (handlerService != null) {
-			resolveMarkerHandlerActivation = handlerService.activateHandler(
-					quickFixId, new ActionHandler(resolveMarkerAction));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#fillContextMenuAdditions(org.eclipse.jface.action.IMenuManager)
-	 */
-	protected void fillContextMenuAdditions(IMenuManager manager) {
-		manager.add(new Separator());
-		manager.add(resolveMarkerAction);
-	}
-
-	protected String[] getRootTypes() {
-		return ROOT_TYPES;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.TableView#getAllFields()
-	 */
-	protected IField[] getAllFields() {
-
-		// Add the marker ID so the table sorter won't reduce
-		// errors on the same line bug 82502
-		return new IField[] { severityAndMessage, resource, folder, lineNumber,
-				creationTime };
-	}
-
-	void updateTitle() {
-		MarkerList visibleMarkers = getVisibleMarkers();
-		String breakdown = formatSummaryBreakDown(visibleMarkers);
-		int filteredCount = visibleMarkers.getItemCount();
-		int totalCount = getTotalMarkers();
-		if (filteredCount != totalCount) {
-			breakdown = NLS.bind(MarkerMessages.problem_filter_matchedMessage,
-					new Object[] { breakdown, new Integer(filteredCount),
-							new Integer(totalCount) });
-		}
-		setContentDescription(breakdown);
-	}
-
-	private String formatSummaryBreakDown(MarkerList visibleMarkers) {
-		return MessageFormat.format(
-				MarkerMessages.problem_statusSummaryBreakdown, new Object[] {
-						new Integer(visibleMarkers.getErrors()),
-						new Integer(visibleMarkers.getWarnings()),
-						new Integer(visibleMarkers.getInfos()) });
-	}
-
-	private String getSummary(MarkerList markers) {
-		String message = MessageFormat.format(
-				MarkerMessages.marker_statusSummarySelected, new Object[] {
-						new Integer(markers.getItemCount()),
-						formatSummaryBreakDown(markers) });
-		return message;
-	}
-
-	/**
-	 * Retrieves statistical information (the total number of markers with each
-	 * severity type) for the markers contained in the selection passed in. This
-	 * information is then massaged into a string which may be displayed by the
-	 * caller.
-	 * 
-	 * @param selection
-	 *            a valid selection or <code>null</code>
-	 * @return a message ready for display
-	 */
-	protected String updateSummarySelected(IStructuredSelection selection) {
-		Collection selectionList;
-
-		selectionList = new ArrayList();
-		Iterator selectionIterator = selection.iterator();
-		while (selectionIterator.hasNext()) {
-			MarkerNode next = (MarkerNode) selectionIterator.next();
-			if (next.isConcrete()) {
-				selectionList.add(next);
-			}
-		}
-
-		return getSummary(new MarkerList(selectionList));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerTypes()
-	 */
-	protected String[] getMarkerTypes() {
-		return new String[] { IMarker.PROBLEM };
-	}
-
-	protected String getStaticContextId() {
-		return PlatformUI.PLUGIN_ID + ".problem_view_context";//$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#createFiltersDialog()
-	 */
-	protected DialogMarkerFilter createFiltersDialog() {
-
-		MarkerFilter[] filters = getUserFilters();
-		ProblemFilter[] problemFilters = new ProblemFilter[filters.length];
-		System.arraycopy(filters, 0, problemFilters, 0, filters.length);
-		return new DialogProblemFilter(getSite().getShell(), problemFilters);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#createFilter(java.lang.String)
-	 */
-	protected MarkerFilter createFilter(String name) {
-		return new ProblemFilter(name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getSectionTag()
-	 */
-	protected String getSectionTag() {
-		return TAG_DIALOG_SECTION;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerEnablementPreferenceName()
-	 */
-	String getMarkerEnablementPreferenceName() {
-		return IDEInternalPreferences.LIMIT_PROBLEMS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerLimitPreferenceName()
-	 */
-	String getMarkerLimitPreferenceName() {
-		return IDEInternalPreferences.PROBLEMS_LIMIT;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getFiltersPreferenceName()
-	 */
-	String getFiltersPreferenceName() {
-		return IDEInternalPreferences.PROBLEMS_FILTERS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getAllFilters()
-	 */
-	MarkerFilter[] getAllFilters() {
-		MarkerFilter[] userFilters = super.getAllFilters();
-		Collection declaredFilters = MarkerSupportRegistry.getInstance()
-				.getRegisteredFilters();
-		Iterator iterator = declaredFilters.iterator();
-
-		MarkerFilter[] allFilters = new MarkerFilter[userFilters.length
-				+ declaredFilters.size()];
-		System.arraycopy(userFilters, 0, allFilters, 0, userFilters.length);
-		int index = userFilters.length;
-
-		while (iterator.hasNext()) {
-			allFilters[index] = (MarkerFilter) iterator.next();
-			index++;
-		}
-		return allFilters;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#addDropDownContributions(org.eclipse.jface.action.IMenuManager)
-	 */
-	void addDropDownContributions(IMenuManager menu) {
-
-		MenuManager groupByMenu = new MenuManager(
-				MarkerMessages.ProblemView_GroupByMenu);
-
-		Iterator definedGroups = MarkerSupportRegistry.getInstance()
-				.getMarkerGroups().iterator();
-
-		while (definedGroups.hasNext()) {
-			MarkerGroup group = (MarkerGroup) definedGroups.next();
-			groupByMenu.add(new GroupingAction(group.getField()
-					.getDescription(), group.getField(), this));
-		}
-
-		groupByMenu.add(new GroupingAction(MarkerMessages.ProblemView_None,
-				null, this));
-		menu.add(groupByMenu);
-
-		super.addDropDownContributions(menu);
-	}
-
-	/**
-	 * Resize the category column in the table.
-	 */
-	protected void regenerateLayout() {
-		TableLayout layout = new TableLayout();
-		getViewer().getTree().setLayout(layout);
-
-		ColumnLayoutData[] columnWidths = getDefaultColumnLayouts();
-		for (int i = 0; i < columnWidths.length; i++) {
-			layout.addColumnData(columnWidths[i]);
-
-		}
-		getViewer().getTree().layout(true);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.TableView#setSorter(org.eclipse.ui.views.markers.internal.TableSorter)
-	 */
-	void setComparator(TableComparator sorter2) {
-		getMarkerAdapter().getCategorySorter().setTableSorter(sorter2);
-		getMarkerAdapter().getCategorySorter().saveState(getDialogSettings());
-		updateForNewComparator(sorter2);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getTableSorter()
-	 */
-	public TableComparator getTableSorter() {
-		return ((CategoryComparator) getViewer().getComparator()).innerSorter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-		createActivityManagerListener();
-		PlatformUI.getWorkbench().getActivitySupport().getActivityManager()
-				.addActivityManagerListener(activityManagerListener);
-	}
-
-	/**
-	 * Create a new listener for activity changes.
-	 */
-	private void createActivityManagerListener() {
-		activityManagerListener = new IActivityManagerListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.activities.IActivityManagerListener#activityManagerChanged(org.eclipse.ui.activities.ActivityManagerEvent)
-			 */
-			public void activityManagerChanged(
-					ActivityManagerEvent activityManagerEvent) {
-				clearEnabledFilters();
-				refreshViewer();
-			}
-		};
-
-	}
-
-	/**
-	 * Return the field whose description matches description.
-	 * 
-	 * @param description
-	 * @return IField
-	 */
-	public IField findField(String description) {
-		IField[] fields = getSortingFields();
-		for (int i = 0; i < fields.length; i++) {
-			if (fields[i].getDescription().equals(description)) {
-				return fields[i];
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.TableView#buildComparator()
-	 */
-	protected ViewerComparator buildComparator() {
-
-		TableComparator sorter = createTableComparator();
-		CategoryComparator category = new CategoryComparator(sorter);
-		category.restoreState(getDialogSettings(), this);
-		return category;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#canBeEditable()
-	 */
-	boolean canBeEditable() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#initToolBar(org.eclipse.jface.action.IToolBarManager)
-	 */
-	protected void initToolBar(IToolBarManager tbm) {
-		tbm.add(getFilterAction());
-		tbm.update(false);
-	}
-
-	/**
-	 * Select the category for the receiver.
-	 * 
-	 * @param description
-	 * @param sorter -
-	 *            the sorter to select for
-	 */
-	public void selectCategory(String description, CategoryComparator sorter) {
-
-		if (description == null)
-			selectCategoryField(null, sorter);
-
-		Iterator definedGroups = MarkerSupportRegistry.getInstance()
-				.getMarkerGroups().iterator();
-		while (definedGroups.hasNext()) {
-			MarkerGroup group = (MarkerGroup) definedGroups.next();
-			if (group.getField().getDescription().equals(description)) {
-				selectCategoryField(group.getField(), sorter);
-				return;
-			}
-		}
-		selectCategoryField(null, sorter);
-
-	}
-
-	/**
-	 * Select the field groupingField.
-	 * 
-	 * @param groupingField
-	 * @param sorter
-	 */
-	void selectCategoryField(IField groupingField, CategoryComparator sorter) {
-		sorter.setCategoryField(groupingField);
-
-		// Do not refresh if the input has not been set yet
-		if (getMarkerAdapter() != null) {
-			getMarkerAdapter().getCurrentMarkers().clearGroups();
-			refreshViewer();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#writeFiltersSettings(org.eclipse.ui.XMLMemento)
-	 */
-	protected void writeFiltersSettings(XMLMemento memento) {
-		super.writeFiltersSettings(memento);
-
-		// Add the system filters
-		Iterator filters = MarkerSupportRegistry.getInstance()
-				.getRegisteredFilters().iterator();
-
-		while (filters.hasNext()) {
-			MarkerFilter filter = (MarkerFilter) filters.next();
-			IMemento child = memento.createChild(TAG_SYSTEM_FILTER_ENTRY,
-					filter.getName());
-			child.putString(MarkerFilter.TAG_ENABLED, String.valueOf(filter
-					.isEnabled()));
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#restoreFilters(org.eclipse.ui.IMemento)
-	 */
-	void restoreFilters(IMemento memento) {
-
-		super.restoreFilters(memento);
-
-		if (memento == null)
-			return;
-
-		IMemento[] sections = memento.getChildren(TAG_SYSTEM_FILTER_ENTRY);
-
-		Collection registered = MarkerSupportRegistry.getInstance()
-				.getRegisteredFilters();
-		MarkerFilter[] filters = new MarkerFilter[registered.size()];
-		registered.toArray(filters);
-
-		if (sections != null) {
-
-			for (int i = 0; i < sections.length; i++) {
-				String filterName = sections[i].getID();
-				boolean enabled = Boolean.valueOf(
-						sections[i].getString(MarkerFilter.TAG_ENABLED))
-						.booleanValue();
-				setEnablement(filterName, enabled, filters);
-
-			}
-		}
-
-	}
-
-	/**
-	 * Set the enablement state of the filter called filterName to enabled.
-	 * 
-	 * @param filterName
-	 * @param enabled
-	 * @param filters
-	 */
-	private void setEnablement(String filterName, boolean enabled,
-			MarkerFilter[] filters) {
-		for (int i = 0; i < filters.length; i++) {
-			if (filters[i].getName().equals(filterName)) {
-				filters[i].setEnabled(enabled);
-				return;
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerName()
-	 */
-	protected String getMarkerName() {
-		return MarkerMessages.problem_title;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/SortUtil.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/SortUtil.java
deleted file mode 100644
index 155f099..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/SortUtil.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.SortedSet;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * 
- */
-class SortUtil {
-
-    /**
-     *  * Returns the k smallest items in the given collection. Runs in
-     * O(n) time, average case. The resulting collection is not sorted.
-     * @param elements the MarkerList to check
-     * @param c the comparator
-     * @param k the number of items to collect
-     * @param mon the monitor
-     * @return MarkerList
-     */
-    public static MarkerList getFirst(MarkerList elements, Comparator c, int k,
-            IProgressMonitor mon) {
-    	Collection start = elements.asList();
-        Collection result = new ArrayList(start.size());
-
-        mon.beginTask(MarkerMessages.SortUtil_finding_first, 1000); 
-
-        getFirst(result, start, c, k, mon, 1000);
-
-        mon.done();
-
-        return new MarkerList(result);
-    }
-
-    private static void getFirst(Collection result, Collection elements,
-            Comparator c, int k, IProgressMonitor mon, int totalWork) {
-
-        if (mon.isCanceled()) {
-            return;
-        }
-
-        if (elements.size() <= k) {
-            result.addAll(elements);
-            mon.worked(totalWork);
-            return;
-        }
-
-        Object pivot;
-
-        if (elements instanceof ArrayList) {
-            pivot = ((ArrayList) elements).get(elements.size() / 2);
-        } else {
-            pivot = elements.iterator().next();
-        }
-        Collection more = new ArrayList(elements.size());
-        Collection less = new ArrayList(elements.size());
-        Collection equal = new ArrayList();
-
-        partitionHelper(less, more, equal, elements, c, pivot, mon,
-                totalWork / 2);
-
-        if (less.size() >= k) {
-            getFirst(result, less, c, k, mon, totalWork / 2);
-        } else if (less.size() + equal.size() >= k) {
-
-            int count = k - less.size();
-
-            result.addAll(less);
-
-            Iterator iter = equal.iterator();
-            while (iter.hasNext() && count > 0) {
-                Object next = iter.next();
-
-                result.add(next);
-                count--;
-            }
-            mon.worked(totalWork / 2);
-        } else if (less.size() + equal.size() + more.size() >= k) {
-            result.addAll(less);
-            result.addAll(equal);
-
-            getFirst(result, more, c, k - less.size() - equal.size(), mon,
-                    totalWork / 2);
-        }
-    }
-
-    private static void partitionHelper(Collection less, Collection more,
-            Collection equal, Collection input, Comparator c, Object toTest,
-            IProgressMonitor mon, int totalWork) {
-        int workRemaining = totalWork;
-        int counter = 0;
-        int totalItems = input.size();
-
-        Iterator iter = input.iterator();
-
-        while (iter.hasNext()) {
-            Object next = iter.next();
-
-            int compareResult = c.compare(next, toTest);
-
-            if (compareResult < 0) {
-                less.add(next);
-            } else if (compareResult > 0) {
-                more.add(next);
-            } else {
-                equal.add(next);
-            }
-
-            counter++;
-            if (counter > 100) {
-                if (mon.isCanceled()) {
-                    return;
-                }
-                int nextWorked = counter * workRemaining / totalItems;
-                mon.worked(nextWorked);
-                workRemaining -= nextWorked;
-                totalItems -= counter;
-                counter = 0;
-            }
-        }
-
-        mon.worked(workRemaining);
-    }
-
-    /**
-     * Divides the items in the input collection into three sets based on whether they are less than,
-     * equal to, or greater than the test item.
-     * 
-     * If the given monitor is cancelled (possibly by another thread), the operation will
-     * be aborted. In this case, the insertions may only be partially complete. 
-     * 
-     * @param less
-     * @param more
-     * @param equal
-     * @param input
-     * @param c
-     * @param toTest
-     * @param mon
-     */
-    public static void partition(Collection less, Collection more,
-            Collection equal, Collection input, Comparator c, Object toTest,
-            IProgressMonitor mon) {
-        mon
-                .beginTask(
-                        MarkerMessages.SortUtil_partitioning, input.size()); 
-
-        if (toTest == null || c == null) {
-            int counter = 0;
-            Iterator iter = input.iterator();
-            while (iter.hasNext()) {
-                Object next = iter.next();
-
-                counter++;
-                if (counter >= 20) {
-                    mon.worked(counter);
-                    counter = 0;
-                    if (mon.isCanceled()) {
-                        return;
-                    }
-                }
-
-                more.add(next);
-            }
-            mon.worked(counter);
-        } else {
-            partitionHelper(less, more, equal, input, c, toTest, mon, input
-                    .size());
-        }
-
-        mon.done();
-    }
-
-    /**
-     * Removes and returns the first n items from the given collection.
-     * 
-     * @param collection
-     * @param numToRemove
-     * @return List
-     */
-    public static List removeFirst(Collection collection, int numToRemove) {
-        int toRemove = Math.min(collection.size(), numToRemove);
-
-        List removed = new ArrayList(toRemove);
-
-        Iterator iter = collection.iterator();
-
-        for (int idx = 0; idx < toRemove; idx++) {
-            removed.add(iter.next());
-
-            iter.remove();
-        }
-
-        return removed;
-    }
-
-    /**
-     * Finds and returns the greatest element in the given collection, or null if the collection
-     * is empty.
-     *  
-     * @param toSearch collection to search
-     * @param c comparator used to determine the greatest item
-     * @return the greatest item in the collection
-     */
-    public static Object findGreatest(Collection toSearch, Comparator c) {
-        // If this set is already sorted using the given comparator, just return the last element
-        if (toSearch instanceof SortedSet
-                && ((SortedSet) toSearch).comparator().equals(c)) {
-            return ((SortedSet) toSearch).last();
-        }
-
-        // Otherwise, exhaustively search for the greatest element
-        Object result = null;
-        Iterator iter = toSearch.iterator();
-
-        while (iter.hasNext()) {
-            Object next = iter.next();
-
-            if (result == null || c.compare(result, next) > 0) {
-                result = next;
-            }
-        }
-
-        return result;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableComparator.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableComparator.java
deleted file mode 100644
index b8b1ad6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableComparator.java
+++ /dev/null
@@ -1,372 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.Arrays;
-import java.util.Comparator;
-
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-
-public class TableComparator extends ViewerComparator implements Comparator {
-
-	public static final int MAX_DEPTH = 4;
-
-	public static final int ASCENDING = 1;
-
-	public static final int DESCENDING = -1;
-
-	protected IField[] fields;
-
-	protected int[] priorities;
-
-	protected int[] directions;
-
-	protected int[] defaultPriorities;
-
-	protected int[] defaultDirections;
-
-	public static final String TAG_DIALOG_SECTION = "sorter"; //$NON-NLS-1$
-
-	private static final String TAG_PRIORITY = "priority"; //$NON-NLS-1$ 
-
-	private static final String TAG_DIRECTION = "direction"; //$NON-NLS-1$
-
-	private static final String TAG_DEFAULT_PRIORITY = "defaultPriority"; //$NON-NLS-1$
-
-	private static final String TAG_DEFAULT_DIRECTION = "defaultDirection"; //$NON-NLS-1$
-
-	public TableComparator(TableComparator other) {
-		this(other.getFields(), other.getDefaultPriorities(), other
-				.getDefaultDirections());
-		priorities = other.getPriorities();
-		directions = other.getDirections();
-	}
-
-	public TableComparator(IField[] properties, final int[] defaultPriorities,
-			final int[] defaultDirections) {
-		super();
-		this.fields = properties;
-		if (properties == null
-				|| defaultPriorities == null
-				|| defaultDirections == null
-				|| !(properties.length == defaultPriorities.length && properties.length == defaultDirections.length)
-				|| !verifyPriorities(defaultPriorities)
-				|| !verifyDirections(defaultDirections)) {
-			this.priorities = new int[0];
-			this.directions = new int[0];
-			this.defaultPriorities = new int[0];
-			this.defaultDirections = new int[0];
-		} else {
-			this.priorities = new int[defaultPriorities.length];
-			System.arraycopy(defaultPriorities, 0, this.priorities, 0,
-					priorities.length);
-			this.directions = new int[defaultDirections.length];
-			System.arraycopy(defaultDirections, 0, this.directions, 0,
-					directions.length);
-			this.defaultPriorities = new int[defaultPriorities.length];
-			System.arraycopy(defaultPriorities, 0, this.defaultPriorities, 0,
-					defaultPriorities.length);
-			this.defaultDirections = new int[defaultDirections.length];
-			System.arraycopy(defaultDirections, 0, this.defaultDirections, 0,
-					defaultDirections.length);
-		}
-	}
-
-	/**
-	 * Return a TableSorter based on the supplied fields.
-	 * 
-	 * @param sortingFields
-	 */
-	static TableComparator createTableSorter(IField[] sortingFields) {
-		int[] defaultPriorities = new int[sortingFields.length];
-		for (int i = 0; i < defaultPriorities.length; i++) {
-			defaultPriorities[i] = i;
-		}
-
-		int[] directions = new int[sortingFields.length];
-		for (int i = 0; i < directions.length; i++) {
-			directions[i] = sortingFields[i].getDefaultDirection();
-
-		}
-
-		return new TableComparator(sortingFields, defaultPriorities, directions);
-	}
-
-	protected void resetState() {
-		System
-				.arraycopy(defaultPriorities, 0, priorities, 0,
-						priorities.length);
-		System
-				.arraycopy(defaultDirections, 0, directions, 0,
-						directions.length);
-	}
-
-	public void reverseTopPriority() {
-		directions[priorities[0]] *= -1;
-	}
-
-	public void setTopPriority(IField property) {
-		for (int i = 0; i < fields.length; i++) {
-			if (fields[i].equals(property)) {
-				setTopPriority(i);
-				return;
-			}
-		}
-	}
-
-	public void setTopPriority(int priority) {
-		if (priority < 0 || priority >= priorities.length) {
-			return;
-		}
-
-		int index = -1;
-		for (int i = 0; i < priorities.length; i++) {
-			if (priorities[i] == priority) {
-				index = i;
-			}
-		}
-
-		if (index == -1) {
-			resetState();
-			return;
-		}
-
-		// shift the array
-		for (int i = index; i > 0; i--) {
-			priorities[i] = priorities[i - 1];
-		}
-		priorities[0] = priority;
-		directions[priority] = defaultDirections[priority];
-	}
-
-	public void setTopPriorityDirection(int direction) {
-		if (direction == ASCENDING || direction == DESCENDING) {
-			directions[priorities[0]] = direction;
-		}
-	}
-
-	public int getTopPriorityDirection() {
-		return directions[priorities[0]];
-	}
-
-	public int getTopPriority() {
-		return priorities[0];
-	}
-
-	/**
-	 * Return the field at the top priority.
-	 * 
-	 * @return IField
-	 */
-	public IField getTopField() {
-		return fields[getTopPriority()];
-	}
-
-	public int[] getPriorities() {
-		int[] copy = new int[priorities.length];
-		System.arraycopy(priorities, 0, copy, 0, copy.length);
-		return copy;
-	}
-
-	public int[] getDirections() {
-		int[] copy = new int[directions.length];
-		System.arraycopy(directions, 0, copy, 0, copy.length);
-		return copy;
-	}
-
-	public int[] getDefaultPriorities() {
-		int[] copy = new int[defaultPriorities.length];
-		System.arraycopy(defaultPriorities, 0, copy, 0, copy.length);
-		return copy;
-	}
-
-	public int[] getDefaultDirections() {
-		int[] copy = new int[defaultDirections.length];
-		System.arraycopy(defaultDirections, 0, copy, 0, copy.length);
-		return copy;
-	}
-
-	public int compare(Viewer viewer, Object e1, Object e2) {
-		return compare(e1, e2, 0, true);
-	}
-
-	/**
-	 * Compare obj1 and obj2 at depth. If continueSearching continue searching
-	 * below depth to continue the comparison.
-	 * 
-	 * @param obj1
-	 * @param obj2
-	 * @param depth
-	 * @param continueSearching
-	 * @return int
-	 */
-	protected int compare(Object obj1, Object obj2, int depth,
-			boolean continueSearching) {
-		if (depth >= priorities.length) {
-			return 0;
-		}
-
-		int column = priorities[depth];
-		IField property = fields[column];
-		int result = property.compare(obj1, obj2);
-		if (result == 0 && continueSearching) {
-			return compare(obj1, obj2, depth + 1, continueSearching);
-		}
-		return result * directions[column];
-	}
-
-	/**
-	 * @return IField[] an array of fields
-	 */
-	public IField[] getFields() {
-		return fields;
-	}
-
-	private boolean verifyPriorities(int[] priorities) {
-		int length = priorities.length;
-		boolean[] included = new boolean[length];
-		Arrays.fill(included, false);
-		for (int i = 0; i < length; i++) {
-			int priority = priorities[i];
-			if (priority < 0 || priority >= length) {
-				return false;
-			}
-			if (included[priority]) {
-				return false;
-			}
-			included[priority] = true;
-		}
-		return true;
-	}
-
-	private boolean verifyDirections(int[] directions) {
-		for (int i = 0; i < directions.length; i++) {
-			if (directions[i] != ASCENDING && directions[i] != DESCENDING) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Object o1, Object o2) {
-		return compare(null, o1, o2);
-	}
-
-	public void saveState(IDialogSettings dialogSettings) {
-		if (dialogSettings == null) {
-			return;
-		}
-
-		IDialogSettings settings = dialogSettings
-				.getSection(TAG_DIALOG_SECTION);
-		if (settings == null) {
-			settings = dialogSettings.addNewSection(TAG_DIALOG_SECTION);
-		}
-
-		for (int i = 0; i < priorities.length; i++) {
-			settings.put(TAG_PRIORITY + i, priorities[i]);
-			settings.put(TAG_DIRECTION + i, directions[i]);
-			settings.put(TAG_DEFAULT_PRIORITY + i, defaultPriorities[i]);
-			settings.put(TAG_DEFAULT_DIRECTION + i, defaultDirections[i]);
-		}
-	}
-
-	public void restoreState(IDialogSettings dialogSettings) {
-		if (dialogSettings == null) {
-			resetState();
-			return;
-		}
-
-		IDialogSettings settings = dialogSettings
-				.getSection(TAG_DIALOG_SECTION);
-		if (settings == null) {
-			resetState();
-			return;
-		}
-
-		try {
-			for (int i = 0; i < priorities.length; i++) {
-				String priority = settings.get(TAG_PRIORITY + i);
-				if (priority == null) {
-					resetState();
-					return;
-				}
-				
-				int fieldIndex = Integer.parseInt(priority);
-				
-				//Make sure it is not old data from a different sized array
-				if(fieldIndex < fields.length) {
-					priorities[i] = fieldIndex;
-				}
-				
-				String direction = settings.get(TAG_DIRECTION + i);
-				if (direction == null) {
-					resetState();
-					return;
-				}
-				directions[i] = Integer.parseInt(direction);
-				String defaultPriority = settings.get(TAG_DEFAULT_PRIORITY + i);
-				if (defaultPriority == null) {
-					resetState();
-					return;
-				}
-				defaultPriorities[i] = Integer.parseInt(defaultPriority);
-				String defaultDirection = settings.get(TAG_DEFAULT_DIRECTION
-						+ i);
-				if (defaultDirection == null) {
-					resetState();
-					return;
-				}
-				defaultDirections[i] = Integer.parseInt(defaultDirection);
-			}
-		} catch (NumberFormatException e) {
-			resetState();
-		}
-	}
-
-	/**
-	 * Sort the array of markers in lastMarkers in place.
-	 * 
-	 * @param viewer
-	 * @param lastMarkers
-	 */
-	public void sort(TreeViewer viewer, MarkerList lastMarkers) {
-		sort(viewer, lastMarkers.getArray());
-
-	}
-
-	/**
-	 * Sorts the given elements in-place, modifying the given array from index
-	 * start to index end. <
-	 * 
-	 * @param viewer
-	 * @param elements
-	 * @param start
-	 * @param end
-	 */
-	public void sort(final Viewer viewer, Object[] elements, int start, int end) {
-		Arrays.sort(elements, start, end, new Comparator() {
-			public int compare(Object a, Object b) {
-				return TableComparator.this.compare(viewer, a, b);
-			}
-		});
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableSortAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableSortAction.java
deleted file mode 100644
index e46bd45..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableSortAction.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.window.Window;
-
-public class TableSortAction extends Action {
-
-    private TableView view;
-
-    private TableSortDialog dialog;
-
-    public TableSortAction(TableView view, TableSortDialog dialog) {
-        super(MarkerMessages.sortAction_title);
-        this.view = view;
-        this.dialog = dialog;
-        setEnabled(true);
-    }
-
-    public void run() {
-        if (dialog.open() == Window.OK && dialog.isDirty()) {
-            view.setComparator(dialog.getSorter());
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableSortDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableSortDialog.java
deleted file mode 100644
index a81e3f1..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableSortDialog.java
+++ /dev/null
@@ -1,410 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de>: 
- *         Fix for Bug 77336 [Markers] [Dialogs] TableSortDialog does not use dialog font
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TrayDialog;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.osgi.util.NLS;
-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.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * The TableSortDialog is the dialog that allows sort order to
- * be selected.
- */
-public class TableSortDialog extends TrayDialog {
-
-    private TableComparator sorter;
-
-    private Combo[] priorityCombos;
-
-    private String[] propertyText;
-
-    private IField[] properties;
-
-    private Button[] ascendingButtons;
-
-    private Button[] descendingButtons;
-
-    private boolean dirty;
-
-    private final Comparator columnComparator = new Comparator() {
-        public int compare(Object arg0, Object arg1) {
-            int index0 = -1;
-            int index1 = -1;
-            for (int i = 0; i < propertyText.length; i++) {
-                if (propertyText[i].equals(arg0)) {
-					index0 = i;
-				}
-                if (propertyText[i].equals(arg1)) {
-					index1 = i;
-				}
-            }
-            return index0 - index1;
-        }
-    };
-
-    /**
-     * Create a new instance of the receiver.
-     * @param parentShell
-     * @param sorter
-     */
-    public TableSortDialog(IShellProvider parentShell, TableComparator sorter) {
-        super(parentShell);
-        this.sorter = sorter;
-        dirty = false;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Window.
-     */
-    protected void configureShell(Shell newShell) {
-        super.configureShell(newShell);
-        newShell.setText(MarkerMessages.sortDialog_title);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Dialog.
-     */
-    protected Control createDialogArea(Composite parent) {
-        Composite composite = (Composite) super.createDialogArea(parent);
-        if (sorter == null) {
-			return composite;
-		}
-
-        initializeDialogUnits(composite);
-        
-        createPrioritiesArea(composite);
-        createRestoreDefaultsButton(composite);
-        createSeparatorLine(composite);
-        
-        Dialog.applyDialogFont(composite);
-
-        return composite;
-    }
-
-    /**
-     * Create the proirities area.
-     * @param parent
-     */
-    private void createPrioritiesArea(Composite parent) {
-        Composite prioritiesArea = new Composite(parent, SWT.NULL);
-        prioritiesArea.setLayout(new GridLayout(3, false));
-        
-        int[] priorities = sorter.getPriorities();
-
-        ascendingButtons = new Button[priorities.length];
-        descendingButtons = new Button[priorities.length];
-        priorityCombos = new Combo[Math.min(priorities.length,
-                TableComparator.MAX_DEPTH)];
-        initPriotityText();
-
-        Label sortByLabel = new Label(prioritiesArea, SWT.NULL);
-        sortByLabel.setText(MarkerMessages.sortDialog_label); 
-        GridData data = new GridData();
-        data.horizontalSpan = 3;
-        sortByLabel.setLayoutData(data);
-
-        for (int i = 0; i < priorityCombos.length; i++) {
-            final int index = i;
-            Label numberLabel = new Label(prioritiesArea, SWT.NULL);
-            numberLabel
-                    .setText(NLS
-                            .bind(MarkerMessages.sortDialog_columnLabel,new Integer(i + 1))); 
-
-            priorityCombos[i] = new Combo(prioritiesArea, SWT.READ_ONLY);
-            priorityCombos[i].setLayoutData(new GridData(
-                    GridData.FILL_HORIZONTAL));
-
-            Composite directionGroup = new Composite(prioritiesArea, SWT.NONE);
-            directionGroup.setLayout(new GridLayout(2, false));
-            
-            ascendingButtons[i] = new Button(directionGroup, SWT.RADIO);
-            ascendingButtons[i].setText(getAscendingText(i));
-            ascendingButtons[i].addSelectionListener(new SelectionAdapter() {
-                public void widgetSelected(SelectionEvent e) {
-                    markDirty();
-                }
-            });
-            descendingButtons[i] = new Button(directionGroup, SWT.RADIO);
-            descendingButtons[i].setText(getDescendingText(i));
-            descendingButtons[i].addSelectionListener(new SelectionAdapter() {
-                public void widgetSelected(SelectionEvent e) {
-                    markDirty();
-                }
-            });
-
-            if (i < priorityCombos.length - 1) {
-                priorityCombos[i].addSelectionListener(new SelectionAdapter() {
-                    public void widgetSelected(SelectionEvent e) {
-                        int oldSelectionDirection = TableComparator.ASCENDING;
-                        if (descendingButtons[index].getSelection()) {
-							oldSelectionDirection = TableComparator.DESCENDING;
-						}
-                        ArrayList oldSelectionList = new ArrayList(Arrays
-                                .asList(priorityCombos[index].getItems()));
-                        oldSelectionList.removeAll(Arrays
-                                .asList(priorityCombos[index + 1].getItems()));
-                        if (oldSelectionList.size() != 1) {
-							return;
-						}
-                        String oldSelection = (String) oldSelectionList.get(0);
-                        String newSelection = priorityCombos[index]
-                                .getItem(priorityCombos[index]
-                                        .getSelectionIndex());
-                        if (oldSelection.equals(newSelection)) {
-                            return;
-                        }
-                        for (int j = index + 1; j < priorityCombos.length; j++) {
-                            int newSelectionIndex = priorityCombos[j]
-                                    .indexOf(newSelection);
-                            //this combo's current selection is equal to newSelection
-                            if (priorityCombos[j].getSelectionIndex() == newSelectionIndex) {
-                                priorityCombos[j].remove(newSelection);
-                                int insertionPoint = -1
-                                        - Arrays.binarySearch(priorityCombos[j]
-                                                .getItems(), oldSelection,
-                                                columnComparator);
-                                if (insertionPoint >= 0
-                                        && insertionPoint <= priorityCombos[j]
-                                                .getItemCount()) {
-									priorityCombos[j].add(oldSelection,
-                                            insertionPoint);
-								} else {
-									priorityCombos[j].add(oldSelection);
-								}
-                                priorityCombos[j].select(priorityCombos[j]
-                                        .indexOf(oldSelection));
-                                ascendingButtons[index]
-                                        .setSelection(ascendingButtons[j]
-                                                .getSelection());
-                                descendingButtons[index]
-                                        .setSelection(descendingButtons[j]
-                                                .getSelection());
-                                ascendingButtons[j]
-                                        .setSelection(oldSelectionDirection == TableComparator.ASCENDING);
-                                descendingButtons[j]
-                                        .setSelection(oldSelectionDirection == TableComparator.DESCENDING);
-                            }
-                            //this combo contains newSelection
-                            else if (newSelectionIndex >= 0) {
-                                priorityCombos[j].remove(newSelection);
-                                int insertionPoint = -1
-                                        - Arrays.binarySearch(priorityCombos[j]
-                                                .getItems(), oldSelection,
-                                                columnComparator);
-                                if (insertionPoint >= 0
-                                        && insertionPoint <= priorityCombos[j]
-                                                .getItemCount()) {
-									priorityCombos[j].add(oldSelection,
-                                            insertionPoint);
-								} else {
-									priorityCombos[j].add(oldSelection);
-								}
-                            }
-                        }
-                        markDirty();
-                    }
-                });
-            } else {
-                priorityCombos[i].addSelectionListener(new SelectionAdapter() {
-                    public void widgetSelected(SelectionEvent e) {
-                        markDirty();
-                    }
-                });
-            }
-        }
-        updateUIFromSorter();
-    }
-
-    /**
-     * Get the descending label for the Descending field
-     * at i. Use the index to determine the mnemonic.
-     * @param index
-     * @return String
-     */
-	private String getDescendingText(int index) {
-		switch (index) {
-		case 1:
-			return MarkerMessages.sortDirectionDescending_text2;
-		case 2:
-			return MarkerMessages.sortDirectionDescending_text3;
-		case 3:
-			return MarkerMessages.sortDirectionDescending_text4;
-		default:
-			return MarkerMessages.sortDirectionDescending_text;
-	}
-	
-}
-
-    /**
-     * Get the ascending label for the Ascending field
-     * at i. Use the index to determine the mnemonic.
-     * @param index
-     * @return String
-     */
-	private String getAscendingText(int index) {
-		switch (index) {
-			case 1:
-				return MarkerMessages.sortDirectionAscending_text2;
-			case 2:
-				return MarkerMessages.sortDirectionAscending_text3;
-			case 3:
-				return MarkerMessages.sortDirectionAscending_text4;
-			default:
-				return MarkerMessages.sortDirectionAscending_text;
-		}
-		
-	}
-
-    /**
-     * Create the restore defaults button.
-     * @param parent
-     */
-    private void createRestoreDefaultsButton(Composite parent) {
-        Button defaultsButton = new Button(parent, SWT.PUSH);
-        defaultsButton.setText(MarkerMessages.restoreDefaults_text);
-        setButtonSize(defaultsButton, new GridData(
-                GridData.HORIZONTAL_ALIGN_END | GridData.FILL_HORIZONTAL));
-        defaultsButton.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                restoreDefaults();
-                markDirty();
-            }
-        });
-    }
-
-    private void createSeparatorLine(Composite parent) {
-        Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
-        separator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-                | GridData.VERTICAL_ALIGN_CENTER));
-        //		separator.setForeground(new Color(parent.getDisplay(), 150, 150, 150));
-        //		separator.setBackground(new Color(parent.getDisplay(), 150, 150, 150));
-    }
-
-    private void restoreDefaults() {
-        updateUI(sorter.getDefaultPriorities(), sorter.getDefaultDirections());
-    }
-
-    private void updateUIFromSorter() {
-        updateUI(sorter.getPriorities(), sorter.getDirections());
-    }
-
-    private void updateUI(int[] priorities, int[] directions) {
-        ArrayList availablePriorities = new ArrayList(Arrays
-                .asList(propertyText));
-
-        for (int i = 0; i < priorityCombos.length; i++) {
-            priorityCombos[i].removeAll();
-            for (int j = 0; j < availablePriorities.size(); j++) {
-				priorityCombos[i].add((String) availablePriorities.get(j));
-			}
-            priorityCombos[i].select(priorityCombos[i]
-                    .indexOf(propertyText[priorities[i]]));
-            availablePriorities.remove(propertyText[priorities[i]]);
-
-            ascendingButtons[i]
-                    .setSelection(directions[priorities[i]] == TableComparator.ASCENDING);
-            descendingButtons[i]
-                    .setSelection(directions[priorities[i]] == TableComparator.DESCENDING);
-        }
-    }
-
-    protected void okPressed() {
-        if (isDirty()) {
-            for (int i = priorityCombos.length - 1; i >= 0; i--) {
-                String column = priorityCombos[i].getItem(priorityCombos[i]
-                        .getSelectionIndex());
-                int index = -1;
-                for (int j = 0; j < propertyText.length && index == -1; j++) {
-                    if (propertyText[j].equals(column)) {
-						index = j;
-					}
-                }
-                if (index == -1) {
-                    sorter.resetState();
-                    return;
-                }
-                sorter.setTopPriority(properties[index]);
-                int direction = TableComparator.ASCENDING;
-                if (descendingButtons[i].getSelection()) {
-					direction = TableComparator.DESCENDING;
-				}
-                sorter.setTopPriorityDirection(direction);
-            }
-        }
-        super.okPressed();
-    }
-
-    /**
-     * @return boolean
-     */
-    public boolean isDirty() {
-        return dirty;
-    }
-
-    /**
-     * Sets the dirty flag to true.
-     */
-    public void markDirty() {
-        dirty = true;
-    }
-
-    /**
-     * Set the layout data of the button to a GridData with 
-     * appropriate heights and widths.
-     * @param button
-     */
-    private void setButtonSize(Button button, GridData buttonData) {
-    	button.setFont(button.getParent().getFont());
-        int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-        buttonData.widthHint = Math.max(widthHint, button.computeSize(
-                SWT.DEFAULT, SWT.DEFAULT, true).x);
-        button.setLayoutData(buttonData);
-    }
-
-    private void initPriotityText() {
-        IField[] unorderedProperties = sorter.getFields();
-        properties = new IField[unorderedProperties.length];
-        System.arraycopy(unorderedProperties, 0, properties, 0,
-                properties.length);
-        propertyText = new String[properties.length];
-        for (int i = 0; i < properties.length; i++) {
-            propertyText[i] = properties[i].getDescription();
-        }
-    }
-
-    /**
-     * Return the sorter for the receiver.
-     * @return TableSorter
-     */
-    public TableComparator getSorter() {
-        return sorter;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableView.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableView.java
deleted file mode 100644
index 7f19f70..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableView.java
+++ /dev/null
@@ -1,762 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - 26823 [Markers] cannot reorder columns in task list
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.IOpenListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.OpenEvent;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.TreeViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-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.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ScrollBar;
-import org.eclipse.swt.widgets.Scrollable;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.preferences.ViewPreferencesAction;
-import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
-
-/**
- * The TableView is a view that generically implements views with tables.
- * 
- */
-public abstract class TableView extends ViewPart {
-
-	private static final String TAG_COLUMN_WIDTH = "columnWidth"; //$NON-NLS-1$
-
-	private static final String TAG_COLUMN_ORDER = "columnOrder"; //$NON-NLS-1$
-
-	private static final String TAG_COLUMN_ORDER_INDEX = "columnOrderIndex"; //$NON-NLS-1$
-
-	private static final String TAG_VERTICAL_POSITION = "verticalPosition"; //$NON-NLS-1$
-
-	private static final String TAG_HORIZONTAL_POSITION = "horizontalPosition"; //$NON-NLS-1$
-
-	private TreeViewer viewer;
-
-	private IMemento memento;
-
-	private IAction sortAction;
-
-	private IAction filtersAction;
-
-	private IAction preferencesAction;
-
-	private MarkerTreeContentProvider contentProvider;
-
-	private ISelectionProvider selectionProvider = new MarkerSelectionProviderAdapter();
-
-	/*
-	 * (non-Javadoc) Method declared on IViewPart.
-	 */
-	public void init(IViewSite site, IMemento memento) throws PartInitException {
-		super.init(site, memento);
-		this.memento = memento;
-	}
-
-	/**
-	 * 
-	 */
-	// void haltTableUpdates() {
-	// content.cancelPendingChanges();
-	// }
-	// void change(Collection toRefresh) {
-	// content.change(toRefresh);
-	// }
-	// void setContents(Collection contents, IProgressMonitor mon) {
-	// content.set(contents, mon);
-	// }
-	abstract protected void viewerSelectionChanged(
-			IStructuredSelection selection);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		parent.setLayout(new FillLayout());
-
-		viewer = new TreeViewer(createTree(parent));
-		createColumns(viewer.getTree());
-		
-		viewer.setComparator(buildComparator());
-		setSortIndicators();
-
-		contentProvider = new MarkerTreeContentProvider();
-
-		viewer.setContentProvider(contentProvider);
-
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				IStructuredSelection selection = (IStructuredSelection) event
-						.getSelection();
-				viewerSelectionChanged(selection);
-			}
-		});
-
-
-		// create the actions before the input is set on the viewer but after
-		// the
-		// sorter and filter are set so the actions will be enabled correctly.
-		createActions();
-
-		viewer.setInput(createViewerInput());
-
-		Scrollable scrollable = (Scrollable) viewer.getControl();
-		ScrollBar bar = scrollable.getVerticalBar();
-		if (bar != null) {
-			bar.setSelection(restoreVerticalScrollBarPosition(memento));
-		}
-		bar = scrollable.getHorizontalBar();
-		if (bar != null) {
-			bar.setSelection(restoreHorizontalScrollBarPosition(memento));
-		}
-
-		MenuManager mgr = initContextMenu();
-		Menu menu = mgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(mgr, selectionProvider);
-
-		getSite().setSelectionProvider(selectionProvider);
-
-		IActionBars actionBars = getViewSite().getActionBars();
-		initMenu(actionBars.getMenuManager());
-		initToolBar(actionBars.getToolBarManager());
-
-		registerGlobalActions(getViewSite().getActionBars());
-
-		viewer.addOpenListener(new IOpenListener() {
-			public void open(OpenEvent event) {
-				handleOpenEvent(event);
-			}
-		});
-		
-	}
-
-
-	/**
-	 * Create the viewer input for the receiver.
-	 * 
-	 * @return Object
-	 */
-	abstract Object createViewerInput();
-
-	/**
-	 * Set the comparator to be the new comparator. This should only
-	 * be called if the viewer has been created.
-	 * 
-	 * @param comparator
-	 */
-	void setComparator(TableComparator comparator) {
-		viewer.setComparator(comparator);
-		updateForNewComparator(comparator);
-	}
-
-	/**
-	 * Update the viewer for comparator updates
-	 * 
-	 * @param comparator
-	 */
-	void updateForNewComparator(TableComparator comparator) {
-		comparator.saveState(getDialogSettings());
-		viewer.refresh();
-		setSortIndicators();
-	}
-
-	/**
-	 * Create the main tree control
-	 * 
-	 * @param parent
-	 * @return Tree
-	 */
-	protected Tree createTree(Composite parent) {
-		Tree tree = new Tree(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI
-				| SWT.FULL_SELECTION);
-		tree.setLinesVisible(true);
-		return tree;
-	}
-
-	/**
-	 * Get the pixel data for the columns.
-	 * 
-	 * @return ColumnPixelData[]
-	 */
-	public ColumnPixelData[] getSavedColumnData() {
-		ColumnPixelData[] defaultData = getDefaultColumnLayouts();
-
-		ColumnPixelData[] result = new ColumnPixelData[defaultData.length];
-		for (int i = 0; i < defaultData.length; i++) {
-			
-			ColumnPixelData defaultPixelData = defaultData[i];
-			boolean addTrim = defaultPixelData.addTrim;
-			int width = defaultPixelData.width;
-			// non-resizable columns are always left at their default width
-			if (defaultPixelData.resizable) {
-				if (memento != null) {
-					Integer widthInt = memento.getInteger(TAG_COLUMN_WIDTH + i);
-
-					if (widthInt != null && widthInt.intValue() > 0) {
-						width = widthInt.intValue();
-						addTrim = false;
-					}
-				}
-			}
-
-			result[i] = new ColumnPixelData(width, defaultPixelData.resizable,
-					addTrim);
-		}
-
-		return result;
-	}
-
-	/**
-	 * Return the column sizes from the actual widget. Returns the saved column
-	 * sizes if the widget hasn't been created yet or its columns haven't been
-	 * initialized yet. (Note that TableLayout only initializes the column
-	 * widths after the first layout, so it is possible for the widget to exist
-	 * but have all its columns incorrectly set to zero width - see bug 86329)
-	 * 
-	 * @return ColumnPixelData
-	 */
-	public ColumnPixelData[] getColumnData() {
-		ColumnPixelData[] defaultData = getSavedColumnData();
-
-		Tree tree = getTree();
-
-		if (tree != null && (tree.isDisposed() || tree.getBounds().width == 0)) {
-			tree = null;
-		}
-
-		TreeColumn[] column = null;
-		if (tree != null) {
-			column = tree.getColumns();
-		}
-
-		ColumnPixelData[] result = new ColumnPixelData[defaultData.length];
-		for (int i = 0; i < defaultData.length; i++) {
-			ColumnPixelData defaultPixelData = defaultData[i];
-			int width = defaultData[i].width;
-
-			if (column != null && i < column.length) {
-				TreeColumn col = column[i];
-
-				if (col.getWidth() > 0) {
-					width = col.getWidth();
-				}
-			}
-
-			result[i] = new ColumnPixelData(width, defaultPixelData.resizable,
-					defaultPixelData.addTrim);
-		}
-
-		return result;
-	}
-
-	/**
-	 * Create the columns in the tree.
-	 * 
-	 * @param tree
-	 */
-	protected void createColumns(final Tree tree) {
-		TableLayout layout = new TableLayout();
-		tree.setLayout(layout);
-		tree.setHeaderVisible(true);
-
-		final IField[] fields = getAllFields();
-		ColumnLayoutData[] columnWidths = getSavedColumnData();
-		for (int i = 0; i < fields.length; i++) {
-			layout.addColumnData(columnWidths[i]);
-			TreeColumn tc = new TreeColumn(tree, SWT.NONE, i);
-			IField field = fields[i];
-			tc.setText(field.getColumnHeaderText());
-			tc.setImage(field.getColumnHeaderImage());
-			tc.setResizable(columnWidths[i].resizable);
-			tc.setMoveable(true);
-			tc.addSelectionListener(getHeaderListener());
-			tc.setData(field);
-			TreeViewerColumn viewerColumn = new TreeViewerColumn(viewer, tc);
-			viewerColumn.setLabelProvider(new MarkerViewLabelProvider(field));
-		}
-
-		int[] order = restoreColumnOrder(memento);
-		if (order != null && order.length == fields.length) {
-			tree.setColumnOrder(order);
-		}
-	}
-
-	/**
-	 * Create the actions for the receiver.
-	 */
-	protected void createActions() {
-		if (getSortDialog() != null) {
-			sortAction = new TableSortAction(this, getSortDialog());
-		}
-	}
-
-	protected MenuManager initContextMenu() {
-		MenuManager mgr = new MenuManager();
-		mgr.setRemoveAllWhenShown(true);
-		mgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager mgr) {
-
-				getViewer().cancelEditing();
-				fillContextMenu(mgr);
-			}
-		});
-		return mgr;
-	}
-
-	protected abstract void initToolBar(IToolBarManager tbm);
-
-	/**
-	 * Init the menu for the receiver.
-	 * 
-	 * @param menu
-	 */
-	protected void initMenu(IMenuManager menu) {
-		if (sortAction != null) {
-			menu.add(sortAction);
-		}
-		addDropDownContributions(menu);
-		if (filtersAction != null) {
-			menu.add(filtersAction);
-		}
-		if (preferencesAction != null) {
-			menu.add(preferencesAction);
-		}
-	}
-
-	/**
-	 * Add any extra contributions to the drop down.
-	 * 
-	 * @param menu
-	 */
-	void addDropDownContributions(IMenuManager menu) {
-		// Do nothing by default.
-	}
-
-	protected abstract void registerGlobalActions(IActionBars actionBars);
-
-	protected abstract void fillContextMenu(IMenuManager manager);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		Viewer viewer = getViewer();
-		if (viewer != null && !viewer.getControl().isDisposed()) {
-
-			viewer.getControl().setFocus();
-		}
-	}
-
-	/**
-	 * Build a comparator from the default settings.
-	 * 
-	 * @return ViewerComparator
-	 */
-	protected ViewerComparator buildComparator() {
-
-		return createTableComparator();
-	}
-
-	/**
-	 * Create a TableComparator for the receiver.
-	 * 
-	 * @return TableComparator
-	 */
-	TableComparator createTableComparator() {
-		TableComparator sorter = TableComparator
-				.createTableSorter(getSortingFields());
-		sorter.restoreState(getDialogSettings());
-		return sorter;
-	}
-
-	// protected abstract ITableViewContentProvider getContentProvider();
-
-	protected abstract IField[] getSortingFields();
-
-	protected abstract IField[] getAllFields();
-
-	protected abstract IDialogSettings getDialogSettings();
-
-	/**
-	 * Return the viewer.
-	 * 
-	 * @return TreeViewer
-	 */
-	protected TreeViewer getViewer() {
-		return viewer;
-	}
-
-	/**
-	 * Return the tree for the receiver.
-	 * 
-	 * @return Tree
-	 */
-	protected Tree getTree() {
-		return getViewer().getTree();
-	}
-
-	protected SelectionListener getHeaderListener() {
-		return new SelectionAdapter() {
-			/**
-			 * Handles the case of user selecting the header area.
-			 */
-			public void widgetSelected(SelectionEvent e) {
-
-				final TreeColumn column = (TreeColumn) e.widget;
-				final IField field = (IField) column.getData();
-
-				try {
-					IWorkbenchSiteProgressService progressService = getProgressService();
-					if (progressService == null)
-						BusyIndicator.showWhile(getSite().getShell()
-								.getDisplay(), new Runnable() {
-							/*
-							 * (non-Javadoc)
-							 * 
-							 * @see java.lang.Runnable#run()
-							 */
-							public void run() {
-								resortTable(column, field,
-										new NullProgressMonitor());
-
-							}
-						});
-					else
-						getProgressService().busyCursorWhile(
-								new IRunnableWithProgress() {
-									/*
-									 * (non-Javadoc)
-									 * 
-									 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
-									 */
-									public void run(IProgressMonitor monitor) {
-										resortTable(column, field, monitor);
-									}
-								});
-				} catch (InvocationTargetException e1) {
-					IDEWorkbenchPlugin.getDefault().getLog().log(
-							Util.errorStatus(e1));
-				} catch (InterruptedException e1) {
-					return;
-				}
-
-			}
-
-			/**
-			 * Resort the table based on field.
-			 * 
-			 * @param column
-			 *            the column being updated
-			 * @param field
-			 * @param monitor
-			 */
-			private void resortTable(final TreeColumn column,
-					final IField field, IProgressMonitor monitor) {
-				TableComparator sorter = getTableSorter();
-
-				monitor.beginTask(MarkerMessages.sortDialog_title, 100);
-				monitor.worked(10);
-				if (field.equals(sorter.getTopField()))
-					sorter.reverseTopPriority();
-				else
-					sorter.setTopPriority(field);
-
-				monitor.worked(15);
-				PlatformUI.getWorkbench().getDisplay().asyncExec(
-						new Runnable() {
-							/*
-							 * (non-Javadoc)
-							 * 
-							 * @see java.lang.Runnable#run()
-							 */
-							public void run() {
-								viewer.refresh();
-								updateDirectionIndicator(column);
-							}
-						});
-
-				monitor.done();
-			}
-		};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.TableView#getDefaultColumnLayouts()
-	 */
-	protected ColumnPixelData[] getDefaultColumnLayouts() {
-
-		IField[] fields = getAllFields();
-		ColumnPixelData[] datas = new ColumnPixelData[fields.length];
-
-		for (int i = 0; i < fields.length; i++) {
-			int width = getWidth(fields[i]);
-			boolean resizable = width > 0;
-			datas[i] = new ColumnPixelData(width, resizable, resizable);
-		}
-		return datas;
-	}
-
-	/**
-	 * Return the width of the field to display.
-	 * 
-	 * @param field
-	 * @return int
-	 */
-	private int getWidth(IField field) {
-		if (!field.isShowing()) {
-			return 0;
-		}
-		return field.getPreferredWidth();
-	}
-
-	/**
-	 * Return a sort dialog for the receiver.
-	 * 
-	 * @return TableSortDialog
-	 */
-	protected TableSortDialog getSortDialog() {
-		return new TableSortDialog(getSite(), getTableSorter());
-
-	}
-
-	/**
-	 * Return the table sorter portion of the sorter.
-	 * 
-	 * @return TableSorter
-	 */
-	TableComparator getTableSorter() {
-		return (TableComparator) viewer.getComparator();
-	}
-
-
-	protected abstract void handleOpenEvent(OpenEvent event);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.ViewPart#saveState(org.eclipse.ui.IMemento)
-	 */
-	public void saveState(IMemento memento) {
-		super.saveState(memento);
-
-		ColumnPixelData[] data = getColumnData();
-
-		for (int i = 0; i < data.length; i++) {
-			ColumnPixelData data2 = data[i];
-			memento.putInteger(TAG_COLUMN_WIDTH + i, data2.width);
-		}
-		// save column order
-		Tree tree = getTree();
-		int[] columnOrder = tree.getColumnOrder();
-		for (int i = 0; i < columnOrder.length; i++) {
-			IMemento child = memento.createChild(TAG_COLUMN_ORDER);
-			child.putInteger(TAG_COLUMN_ORDER_INDEX, columnOrder[i]);
-		}
-		// save vertical position
-		Scrollable scrollable = (Scrollable) viewer.getControl();
-		ScrollBar bar = scrollable.getVerticalBar();
-		int position = (bar != null) ? bar.getSelection() : 0;
-		memento.putInteger(TAG_VERTICAL_POSITION, position);
-		// save horizontal position
-		bar = scrollable.getHorizontalBar();
-		position = (bar != null) ? bar.getSelection() : 0;
-		memento.putInteger(TAG_HORIZONTAL_POSITION, position);
-	}
-
-	private int[] restoreColumnOrder(IMemento memento) {
-		if (memento == null) {
-			return null;
-		}
-		IMemento children[] = memento.getChildren(TAG_COLUMN_ORDER);
-		if (children != null) {
-			int n = children.length;
-			int[] values = new int[n];
-			for (int i = 0; i < n; i++) {
-				Integer val = children[i].getInteger(TAG_COLUMN_ORDER_INDEX);
-				if (val != null) {
-					values[i] = val.intValue();
-				} else {
-					// invalid entry so use default column order
-					return null;
-				}
-			}
-			return values;
-		}
-		return null;
-	}
-
-	private int restoreVerticalScrollBarPosition(IMemento memento) {
-		if (memento == null) {
-			return 0;
-		}
-		Integer position = memento.getInteger(TAG_VERTICAL_POSITION);
-		return (position == null) ? 0 : position.intValue();
-	}
-
-	private int restoreHorizontalScrollBarPosition(IMemento memento) {
-		if (memento == null) {
-			return 0;
-		}
-		Integer position = memento.getInteger(TAG_HORIZONTAL_POSITION);
-		return (position == null) ? 0 : position.intValue();
-	}
-
-	/**
-	 * Get the IWorkbenchSiteProgressService for the receiver.
-	 * 
-	 * @return IWorkbenchSiteProgressService or <code>null</code>.
-	 */
-	protected IWorkbenchSiteProgressService getProgressService() {
-		IWorkbenchSiteProgressService service = null;
-		Object siteService = getSite().getAdapter(
-				IWorkbenchSiteProgressService.class);
-		if (siteService != null) {
-			service = (IWorkbenchSiteProgressService) siteService;
-		}
-		return service;
-	}
-
-	/**
-	 * Set the filters action.
-	 * 
-	 * @param action
-	 */
-	void setFilterAction(FiltersAction action) {
-		filtersAction = action;
-
-	}
-
-	/**
-	 * Return the filter action for the receiver.
-	 * 
-	 * @return IAction
-	 */
-	IAction getFilterAction() {
-		return filtersAction;
-	}
-
-	/**
-	 * Return the preferences action.
-	 * 
-	 * @return IAction
-	 */
-	IAction getPreferencesAction() {
-		return preferencesAction;
-	}
-
-	/**
-	 * Set the preferences action.
-	 * 
-	 * @param preferencesAction
-	 */
-	void setPreferencesAction(ViewPreferencesAction preferencesAction) {
-		this.preferencesAction = preferencesAction;
-	}
-
-	/**
-	 * Get the content provider
-	 * 
-	 * @return MarkerTreeContentProvider
-	 */
-	MarkerTreeContentProvider getContentProvider() {
-		return contentProvider;
-	}
-
-	/**
-	 * Return the input to the viewer.
-	 * 
-	 * @return Object
-	 */
-	public Object getViewerInput() {
-		return getViewer().getInput();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.TableView#setSortIndicators()
-	 */
-	void setSortIndicators() {
-		IField top = getTableSorter().getTopField();
-		TreeColumn[] columns = getViewer().getTree().getColumns();
-		for (int i = 0; i < columns.length; i++) {
-			TreeColumn column = columns[i];
-			if (column.getData().equals(top)) {
-				updateDirectionIndicator(column);
-				return;
-			}
-		}
-	}
-
-	/**
-	 * Update the direction indicator as column is now the primary column.
-	 * 
-	 * @param column
-	 */
-	void updateDirectionIndicator(TreeColumn column) {
-		getViewer().getTree().setSortColumn(column);
-		if (getTableSorter().getTopPriorityDirection() == TableComparator.ASCENDING)
-			getViewer().getTree().setSortDirection(SWT.UP);
-		else
-			getViewer().getTree().setSortDirection(SWT.DOWN);
-	}
-
-	/**
-	 * Set the selection of the receiver.
-	 * 
-	 * @param selection
-	 */
-	protected void setSelection(IStructuredSelection selection) {
-		selectionProvider.setSelection(selection);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableViewLabelProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableViewLabelProvider.java
deleted file mode 100644
index 5a2d07a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TableViewLabelProvider.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The TableViewLabelProvider is the content provider for marker views.
- * 
- */
-public class TableViewLabelProvider extends LabelProvider implements
-		ITableLabelProvider, IFontProvider {
-
-	IField[] fields;
-
-	/**
-	 * Create a neew instance of the receiver.
-	 * 
-	 * @param fields
-	 */
-	public TableViewLabelProvider(IField[] fields) {
-		this.fields = fields;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object,
-	 *      int)
-	 */
-	public Image getColumnImage(Object element, int columnIndex) {
-		if (fields == null || columnIndex < 0 || columnIndex >= fields.length) {
-			return null;
-		}
-		return fields[columnIndex].getImage(element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object,
-	 *      int)
-	 */
-	public String getColumnText(Object element, int columnIndex) {
-		if (fields == null || columnIndex < 0 || columnIndex >= fields.length) {
-			return null;
-		}
-		return fields[columnIndex].getValue(element);
-	}
-
-	public Font getFont(Object element) {
-		MarkerNode node = (MarkerNode) element;
-		if (node.isConcrete()) {
-			return null;
-		}
-		return JFaceResources.getFontRegistry().getBold(
-				JFaceResources.DEFAULT_FONT);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TaskFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TaskFilter.java
deleted file mode 100644
index d892841..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TaskFilter.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.ui.IMemento;
-
-public class TaskFilter extends MarkerFilter {
-
-	private static final String TAG_CONTAINS = "contains"; //$NON-NLS-1$
-
-	private static final String TAG_DESCRIPTION = "description"; //$NON-NLS-1$
-	/**
-	 * Tag for the done value.
-	 */
-	public static final String TAG_DONE = "done"; //$NON-NLS-1$
-
-	/**
-	 * Tag for the priority value.
-	 */
-	public static final String TAG_PRIORITY = "priority"; //$NON-NLS-1$
-
-	/**
-	 * Tag for the done value.
-	 */
-	public static final String TAG_SELECT_BY_DONE = "selectByDone"; //$NON-NLS-1$
-	/**
-	 * Tag for the priority value.
-	 */
-	public static final String TAG_SELECT_BY_PRIORITY = "selectByPriority"; //$NON-NLS-1$
-
-	final static boolean DEFAULT_CONTAINS = true;
-
-	final static String DEFAULT_DESCRIPTION = ""; //$NON-NLS-1$	
-
-	final static boolean DEFAULT_DONE = false;
-
-	final static int DEFAULT_PRIORITY = 0;
-
-	final static boolean DEFAULT_SELECT_BY_DONE = false;
-
-	final static boolean DEFAULT_SELECT_BY_PRIORITY = false;
-
-	final static int PRIORITY_HIGH = 1 << 2;
-
-	final static int PRIORITY_NORMAL = 1 << 1;
-
-	final static int PRIORITY_LOW = 1 << 0;
-
-	private boolean contains;
-
-	private String description;
-
-	private boolean done;
-
-	private int priority;
-
-	private boolean selectByPriority = false; 
-
-	private boolean selectByDone = false;
-
-	/**
-	 * Create a new instance of the receiver with the default name.
-	 * 
-	 */
-	public TaskFilter() {
-		this(MarkerMessages.MarkerFilter_defaultFilterName);
-	}
-
-	/**
-	 * Create a new instance of the receiver with the supplied name.
-	 * 
-	 * @param newName
-	 */
-	public TaskFilter(String newName) {
-		super(newName, new String[] { IMarker.TASK });
-	}
-
-	public boolean selectMarker(ConcreteMarker marker) {
-		if (!(marker instanceof TaskMarker)) {
-			return false;
-		}
-
-		TaskMarker taskMarker = (TaskMarker) marker;
-
-		return !isEnabled()
-				|| (super.selectMarker(taskMarker)
-						&& selectByDescription(taskMarker)
-						&& selectByDone(taskMarker) && selectByPriority(taskMarker));
-	}
-
-	private boolean selectByDescription(ConcreteMarker marker) {
-		if (description == null || description.equals("")) { //$NON-NLS-1$
-			return true;
-		}
-
-		int index = marker.getDescription().indexOf(description);
-		return contains ? (index >= 0) : (index < 0);
-	}
-
-	private boolean selectByDone(TaskMarker item) {
-		if (selectByDone) {
-			return done == (item.getDone() == 1);
-		}
-
-		return true;
-	}
-
-	private boolean selectByPriority(TaskMarker marker) {
-		if (priority != 0 && selectByPriority) {
-			int markerPriority = marker.getPriority();
-
-			if (markerPriority == IMarker.PRIORITY_HIGH) {
-				return (priority & PRIORITY_HIGH) > 0;
-			} else if (markerPriority == IMarker.PRIORITY_NORMAL) {
-				return (priority & PRIORITY_NORMAL) > 0;
-			} else if (markerPriority == IMarker.PRIORITY_LOW) {
-				return (priority & PRIORITY_LOW) > 0;
-			}
-		}
-
-		return true;
-	}
-
-	public boolean getContains() {
-		return contains;
-	}
-
-	public String getDescription() {
-		return description;
-	}
-
-	public boolean getDone() {
-		return done;
-	}
-
-	public int getPriority() {
-		return priority;
-	}
-
-	public boolean getSelectByDone() {
-		return selectByDone;
-	}
-
-	public boolean getSelectByPriority() {
-		return selectByPriority;
-	}
-
-	public void setContains(boolean contains) {
-		this.contains = contains;
-	}
-
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	public void setDone(boolean done) {
-		this.done = done;
-	}
-
-	public void setPriority(int priority) {
-		this.priority = priority;
-	}
-
-	public void setSelectByDone(boolean selectByDone) {
-		this.selectByDone = selectByDone;
-	}
-
-	public void setSelectByPriority(boolean selectByPriority) {
-		this.selectByPriority = selectByPriority;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerFilter#resetState()
-	 */
-	public void resetState() {
-		super.resetState();
-		contains = DEFAULT_CONTAINS;
-		description = DEFAULT_DESCRIPTION;
-		done = DEFAULT_DONE;
-		priority = DEFAULT_PRIORITY;
-		selectByDone = DEFAULT_SELECT_BY_DONE;
-		selectByPriority = DEFAULT_SELECT_BY_PRIORITY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerFilter#restoreFilterSettings(org.eclipse.jface.dialogs.IDialogSettings)
-	 */
-	public void restoreFilterSettings(IDialogSettings settings) {
-		super.restoreFilterSettings(settings);
-
-		String setting = settings.get(TAG_CONTAINS);
-
-		if (setting != null) {
-			contains = Boolean.valueOf(setting).booleanValue();
-		}
-
-		setting = settings.get(TAG_DESCRIPTION);
-
-		if (setting != null) {
-			description = new String(setting);
-		}
-
-		setting = settings.get(TAG_DONE);
-
-		if (setting != null) {
-			done = Boolean.valueOf(setting).booleanValue();
-		}
-
-		setting = settings.get(TAG_PRIORITY);
-
-		if (setting != null) {
-			try {
-				priority = Integer.parseInt(setting);
-			} catch (NumberFormatException eNumberFormat) {
-			}
-		}
-
-		setting = settings.get(TAG_SELECT_BY_DONE);
-
-		if (setting != null) {
-			selectByDone = Boolean.valueOf(setting).booleanValue();
-		}
-
-		setting = settings.get(TAG_SELECT_BY_PRIORITY);
-
-		if (setting != null) {
-			selectByPriority = Boolean.valueOf(setting).booleanValue();
-		}
-
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerFilter#restoreFilterSettings(org.eclipse.ui.IMemento)
-	 */
-	protected void restoreFilterSettings(IMemento settings) {
-		super.restoreFilterSettings(settings);
-
-		String setting = settings.getString(TAG_CONTAINS);
-
-		if (setting != null) {
-			contains = Boolean.valueOf(setting).booleanValue();
-		}
-
-		setting = settings.getString(TAG_DESCRIPTION);
-
-		if (setting != null) {
-			description = new String(setting);
-		}
-
-		setting = settings.getString(TAG_DONE);
-
-		if (setting != null) {
-			done = Boolean.valueOf(setting).booleanValue();
-		}
-
-		Integer priorityValue = settings.getInteger(TAG_PRIORITY);
-
-		if (setting != null) {
-			priority = priorityValue.intValue();
-		}
-
-		setting = settings.getString(TAG_SELECT_BY_DONE);
-
-		if (setting != null) {
-			selectByDone = Boolean.valueOf(setting).booleanValue();
-		}
-
-		setting = settings.getString(TAG_SELECT_BY_PRIORITY);
-
-		if (setting != null) {
-			selectByPriority = Boolean.valueOf(setting).booleanValue();
-		}
-
-	}
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerFilter#saveFilterSettings(org.eclipse.ui.IMemento)
-	 */
-	public void saveFilterSettings(IMemento settings) {
-		super.saveFilterSettings(settings);
-		settings.putString(TAG_CONTAINS, String.valueOf(contains));
-		settings.putString(TAG_DESCRIPTION, description);
-		settings.putString(TAG_DONE, String.valueOf(done));
-		settings.putInteger(TAG_PRIORITY, priority);
-		settings.putString(TAG_SELECT_BY_DONE, String.valueOf(selectByDone));
-		settings.putString(TAG_SELECT_BY_PRIORITY, String.valueOf(selectByPriority));
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TaskMarker.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TaskMarker.java
deleted file mode 100644
index fd8f05b..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TaskMarker.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IMarker;
-
-/**
- * Represents a marker visible in the Tasks view. Additional members should be added
- * to this class if new fields are added to the Tasks view. Such members should be
- * initialized in the constructor, and accessed via get methods rather than accessing
- * the IMarker instance directly. This is necessary to support sorting in a reasonable
- * time bound.
- */
-public class TaskMarker extends ConcreteMarker {
-
-    private int priority;
-
-    private int done;
-
-    /**
-     * @param toCopy
-     */
-    public TaskMarker(IMarker toCopy) {
-        super(toCopy);
-    }
-
-    public void refresh() {
-        super.refresh();
-        priority = getMarker().getAttribute(IMarker.PRIORITY,
-                IMarker.PRIORITY_NORMAL);
-        done = -1;
-        if (getMarker().getAttribute(IMarker.USER_EDITABLE, true)) {
-            done = 0;
-            if (getMarker().getAttribute(IMarker.DONE, false)) {
-                done = 1;
-            }
-        }
-    }
-
-    public int getPriority() {
-        return priority;
-    }
-
-    public int getDone() {
-        return done;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TaskView.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TaskView.java
deleted file mode 100644
index af8f3bc..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TaskView.java
+++ /dev/null
@@ -1,362 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CheckboxCellEditor;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.UpdateMarkersOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.part.CellEditorActionHandler;
-
-/**
- * The TaskView is the view for displaying task markers.
- */
-public class TaskView extends MarkerView {
-
-	private static final String COMPLETION = "completion"; //$NON-NLS-1$
-
-	private final IField[] HIDDEN_FIELDS = { new FieldCreationTime() };
-
-	private final static String[] ROOT_TYPES = { IMarker.TASK };
-
-	private final static String[] TABLE_COLUMN_PROPERTIES = {
-			 COMPLETION, IMarker.PRIORITY, IMarker.MESSAGE,
-			Util.EMPTY_STRING, Util.EMPTY_STRING, Util.EMPTY_STRING };
-
-	private final static String TAG_DIALOG_SECTION = "org.eclipse.ui.views.task"; //$NON-NLS-1$
-
-	private final IField[] VISIBLE_FIELDS = {
-			new FieldDone(), new FieldPriority(), new FieldMessage(),
-			new FieldResource(), new FieldFolder(), new FieldLineNumber() };
-
-	private ICellModifier cellModifier = new ICellModifier() {
-		public Object getValue(Object element, String property) {
-			if (element instanceof ConcreteMarker) {
-				IMarker marker = ((ConcreteMarker) element).getMarker();
-
-				if (COMPLETION.equals(property)) {
-					return marker.getAttribute(IMarker.DONE, false) ? Boolean.TRUE : Boolean.FALSE;
-				}
-
-				if (IMarker.PRIORITY.equals(property)) {
-					return new Integer(IMarker.PRIORITY_HIGH
-							- marker.getAttribute(IMarker.PRIORITY,
-									IMarker.PRIORITY_NORMAL));
-				}
-
-				if (IMarker.MESSAGE.equals(property)) {
-					return marker.getAttribute(IMarker.MESSAGE, ""); //$NON-NLS-1$
-				}
-			}
-
-			return null;
-		}
-
-		public boolean canModify(Object element, String property) {
-			return Util.isEditable(((ConcreteMarker) element).getMarker());
-		}
-
-		public void modify(Object element, String property, Object value) {
-			if (element instanceof Item) {
-				Item item = (Item) element;
-				Object data = item.getData();
-
-				if (data instanceof ConcreteMarker) {
-					ConcreteMarker concreteMarker = (ConcreteMarker) data;
-
-					IMarker marker = concreteMarker.getMarker();
-
-					try {
-						Object oldValue = getValue(data, property);
-						if (oldValue != null && !oldValue.equals(value)) {
-							Map attrs = new HashMap();
-							if (COMPLETION.equals(property))
-								attrs.put(IMarker.DONE, value);
-							else if (IMarker.PRIORITY.equals(property))
-								attrs.put(IMarker.PRIORITY,
-										new Integer(IMarker.PRIORITY_HIGH
-												- ((Integer) value).intValue()));
-							else if (IMarker.MESSAGE.equals(property))
-								attrs.put(IMarker.MESSAGE, value);
-							if (!attrs.isEmpty()) {
-								IUndoableOperation op = new UpdateMarkersOperation(marker, attrs, MarkerMessages.modifyTask_title, true);
-						           PlatformUI.getWorkbench().getOperationSupport().getOperationHistory().execute(
-						        		   op, null, WorkspaceUndoUtil.getUIInfoAdapter(getSite().getShell()));
-							}
-						}
-						concreteMarker.refresh();
-					} catch (ExecutionException e) {
-						if (e.getCause() instanceof CoreException) {
-							ErrorDialog.openError(
-									getSite().getShell(),
-									MarkerMessages.errorModifyingTask, null, ((CoreException)e.getCause()).getStatus()); 
-						} else {
-							// something rather unexpected occurred.
-							IDEWorkbenchPlugin.log(MarkerMessages.errorModifyingTask, e); 
-						}
-					}				
-				}
-			}
-		}
-	};
-
-	private CellEditorActionHandler cellEditorActionHandler;
-
-	private ActionAddGlobalTask addGlobalTaskAction;
-
-	private ActionDeleteCompleted deleteCompletedAction;
-
-	private ActionMarkCompleted markCompletedAction;
-
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-
-		TreeViewer treeViewer = getViewer();
-		CellEditor cellEditors[] = new CellEditor[treeViewer.getTree()
-				.getColumnCount()];
-		cellEditors[0] = new CheckboxCellEditor(treeViewer.getTree());
-
-		String[] priorities = new String[] { MarkerMessages.priority_high,
-				MarkerMessages.priority_normal, MarkerMessages.priority_low };
-
-		cellEditors[1] = new ComboBoxCellEditor(treeViewer.getTree(),
-				priorities, SWT.READ_ONLY);
-		CellEditor descriptionCellEditor = new TextCellEditor(treeViewer
-				.getTree());
-		cellEditors[2] = descriptionCellEditor;
-		treeViewer.setCellEditors(cellEditors);
-		treeViewer.setCellModifier(cellModifier);
-		treeViewer.setColumnProperties(TABLE_COLUMN_PROPERTIES);
-
-		cellEditorActionHandler = new CellEditorActionHandler(getViewSite()
-				.getActionBars());
-		cellEditorActionHandler.addCellEditor(descriptionCellEditor);
-		cellEditorActionHandler.setCopyAction(copyAction);
-		cellEditorActionHandler.setPasteAction(pasteAction);
-		cellEditorActionHandler.setDeleteAction(deleteAction);
-		cellEditorActionHandler.setSelectAllAction(selectAllAction);
-		cellEditorActionHandler.setUndoAction(undoAction);
-		cellEditorActionHandler.setRedoAction(redoAction);
-
-	}
-
-	public void dispose() {
-		if (cellEditorActionHandler != null) {
-			cellEditorActionHandler.dispose();
-		}
-
-		if (markCompletedAction != null) {
-			markCompletedAction.dispose();
-		}
-
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.TableView#getDialogSettings()
-	 */
-	protected IDialogSettings getDialogSettings() {
-		IDialogSettings workbenchSettings = IDEWorkbenchPlugin.getDefault()
-				.getDialogSettings();
-		IDialogSettings settings = workbenchSettings
-				.getSection(TAG_DIALOG_SECTION);
-
-		if (settings == null) {
-			settings = workbenchSettings.addNewSection(TAG_DIALOG_SECTION);
-		}
-
-		return settings;
-	}
-
-	protected void createActions() {
-		super.createActions();
-
-		addGlobalTaskAction = new ActionAddGlobalTask(this);
-		deleteCompletedAction = new ActionDeleteCompleted(this, getViewer());
-		markCompletedAction = new ActionMarkCompleted(getViewer());
-		propertiesAction = new ActionTaskProperties(this, getViewer());
-	}
-
-	protected void fillContextMenu(IMenuManager manager) {
-		manager.add(addGlobalTaskAction);
-		manager.add(new Separator());
-		super.fillContextMenu(manager);
-	}
-
-	protected void fillContextMenuAdditions(IMenuManager manager) {
-		manager.add(new Separator());
-		manager.add(markCompletedAction);
-		manager.add(deleteCompletedAction);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.TableView#getSortingFields()
-	 */
-	protected IField[] getSortingFields() {
-		IField[] all = new IField[VISIBLE_FIELDS.length + HIDDEN_FIELDS.length];
-
-		System.arraycopy(VISIBLE_FIELDS, 0, all, 0, VISIBLE_FIELDS.length);
-		System.arraycopy(HIDDEN_FIELDS, 0, all, VISIBLE_FIELDS.length,
-				HIDDEN_FIELDS.length);
-
-		return all;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.TableView#getAllFields()
-	 */
-	protected IField[] getAllFields() {
-		return getSortingFields();
-	}
-
-	protected String[] getRootTypes() {
-		return ROOT_TYPES;
-	}
-
-	protected void initToolBar(IToolBarManager toolBarManager) {
-		toolBarManager.add(addGlobalTaskAction);
-		super.initToolBar(toolBarManager);
-	}
-
-	public void setSelection(IStructuredSelection structuredSelection,
-			boolean reveal) {
-		// TODO: added because nick doesn't like public API inherited from
-		// internal classes
-		super.setSelection(structuredSelection, reveal);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerTypes()
-	 */
-	protected String[] getMarkerTypes() {
-		return new String[] { IMarker.TASK };
-	}
-
-	protected String getStaticContextId() {
-		return PlatformUI.PLUGIN_ID + ".task_list_view_context"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#createFiltersDialog()
-	 */
-	protected DialogMarkerFilter createFiltersDialog() {
-
-		MarkerFilter[] filters = getUserFilters();
-		TaskFilter[] taskFilters = new TaskFilter[filters.length];
-		System.arraycopy(filters, 0, taskFilters, 0, filters.length);
-		return new DialogTaskFilter(getSite().getShell(), taskFilters);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#createFilter(java.lang.String)
-	 */
-	protected MarkerFilter createFilter(String name) {
-		return new TaskFilter(name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getSectionTag()
-	 */
-	protected String getSectionTag() {
-		return TAG_DIALOG_SECTION;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerEnablementPreferenceName()
-	 */
-	String getMarkerEnablementPreferenceName() {
-		return IDEInternalPreferences.LIMIT_TASKS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerLimitPreferenceName()
-	 */
-	String getMarkerLimitPreferenceName() {
-		return IDEInternalPreferences.TASKS_LIMIT;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getFiltersPreferenceName()
-	 */
-	String getFiltersPreferenceName() {
-		return IDEInternalPreferences.TASKS_FILTERS;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.TableView#updateDirectionIndicator(org.eclipse.swt.widgets.TreeColumn)
-	 */
-	void updateDirectionIndicator(TreeColumn column) {
-		// Do nothing due to images being obscured
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getMarkerName()
-	 */
-	protected String getMarkerName() {
-		return MarkerMessages.task_title;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerView#getUndoContext()
-	 */
-	protected IUndoContext getUndoContext() {
-		return WorkspaceUndoUtil.getTasksUndoContext();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TypeMarkerGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TypeMarkerGroup.java
deleted file mode 100644
index 6d47435..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/TypeMarkerGroup.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.views.markers.MarkerItem;
-
-/**
- * The TypeMarkerGroup is a MarkerGroup used for the sorting by type which
- * cannot be expressed currently using the markerSupport extension point.
- * 
- * @since 3.4
- * 
- */
-public class TypeMarkerGroup extends MarkerGroup {
-
-	/**
-	 * TypeMarkerField is the MarkerField used for MarkerGroupungs
-	 * 
-	 * @since 3.4
-	 * 
-	 */
-	class TypeMarkerField extends GroupMarkerField {
-
-
-		/**
-		 * Create a new instance of the receiver.
-		 */
-		TypeMarkerField() {
-			super();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.provisional.views.markers.api.MarkerField#getValue(org.eclipse.ui.internal.provisional.views.markers.api.MarkerItem)
-		 */
-		public String getValue(MarkerItem item) {
-
-			if (item.getMarker() != null) {
-				IMarker marker = item.getMarker();
-				if (marker == null || !marker.exists())
-					return MarkerMessages.FieldCategory_Uncategorized;
-				String groupName = MarkerSupportRegistry.getInstance()
-						.getCategory(marker);
-				if (groupName == null) {
-
-					String typeId;
-					try {
-						typeId = marker.getType();
-					} catch (CoreException e) {
-						Policy.handle(e);
-						return MarkerMessages.FieldCategory_Uncategorized;
-					}
-					MarkerType type = MarkerTypesModel.getInstance().getType(
-							typeId);
-					groupName = type.getLabel();
-				}
-				return groupName;
-			}
-
-			return Util.EMPTY_STRING;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.views.markers.internal.MarkerGroup.GroupMarkerField#compare(org.eclipse.ui.views.markers.MarkerItem, org.eclipse.ui.views.markers.MarkerItem)
-		 */
-		public int compare(MarkerItem item1, MarkerItem item2) {
-			return getValue(item1).compareTo(getValue(item2));
-		}
-
-	}
-
-	private String name;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param name
-	 */
-	public TypeMarkerGroup(String name) {
-		super(null);
-		this.name = name;
-	}
-
-	/**
-	 * Create the fields for the marker views.
-	 */
-	protected void createFields() {
-		field = new FieldCategory();
-		markerField = new TypeMarkerField();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerGroup#getId()
-	 */
-	public String getId() {
-		return Util.TYPE_MARKER_GROUPING_ID;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.internal.MarkerGroup#getTitle()
-	 */
-	public String getTitle() {
-		return name;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/Util.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/Util.java
deleted file mode 100644
index 917aa97..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/Util.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.markers.internal;
-
-import com.ibm.icu.text.DateFormat;
-import java.util.Date;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.Policy;
-import org.eclipse.ui.views.markers.MarkerViewUtil;
-
-/**
- * The Util class is the class of general utilities used by the marker support.
- * 
- */
-public final class Util {
-
-	static String EMPTY_STRING = "";//$NON-NLS-1$
-
-	static String TWO_LINE_FEED = "\n\n";//$NON-NLS-1$
-
-	static String LINE_FEED_AND_TAB = "\n\t";//$NON-NLS-1$
-
-	private static DateFormat format;
-
-	static final MarkerNode[] EMPTY_MARKER_ARRAY = new MarkerNode[0];
-	
-	static final String TYPE_MARKER_GROUPING_ID = "org.eclipse.ui.ide.type"; //$NON-NLS-1$
-
-	/**
-	 * Get the propery called property from the marker. If it is not found
-	 * return the empty string.
-	 * 
-	 * @param property
-	 * @param marker
-	 * @return String
-	 */
-	public static String getProperty(String property, IMarker marker) {
-		if (marker == null || !marker.exists()) {
-			return EMPTY_STRING;
-		}
-		try {
-			Object obj = marker.getAttribute(property);
-			if (obj != null) {
-				return obj.toString();
-			}
-			return EMPTY_STRING;
-		} catch (CoreException e) {
-			Policy.handle(e);
-			return EMPTY_STRING;
-		}
-	}
-
-	/**
-	 * Get the human readable creation time from the timestamp
-	 * 
-	 * @param timestamp
-	 * @return String
-	 */
-	public static String getCreationTime(long timestamp) {
-		if (format == null) {
-			format = DateFormat.getDateTimeInstance(DateFormat.LONG,
-					DateFormat.MEDIUM);
-		}
-		return format.format(new Date(timestamp));
-	}
-
-	/**
-	 * Get the human readable creation time from the marker.
-	 * 
-	 * @param marker
-	 * @return String
-	 */
-	public static String getCreationTime(IMarker marker) {
-		try {
-			return getCreationTime(marker.getCreationTime());
-		} catch (CoreException e) {
-			Policy.handle(e);
-			return EMPTY_STRING;
-		}
-	}
-
-	/**
-	 * Get the name of the container. If the marker has the
-	 * MarkerViewUtil#PATH_ATTRIBUTE set use that. Otherwise use the path of the
-	 * parent resource.
-	 * 
-	 * @param marker
-	 * @return String
-	 */
-	public static String getContainerName(IMarker marker) {
-
-		if (!marker.exists())
-			return Util.EMPTY_STRING;
-
-		try {
-			Object pathAttribute = marker
-					.getAttribute(MarkerViewUtil.PATH_ATTRIBUTE);
-
-			if (pathAttribute != null) {
-				return pathAttribute.toString();
-			}
-		} catch (CoreException exception) {
-			// Log the exception and fall back.
-			Policy.handle(exception);
-		}
-
-		IPath path = marker.getResource().getFullPath();
-		int n = path.segmentCount() - 1; // n is the number of segments in
-		// container, not path
-		if (n <= 0) {
-			return Util.EMPTY_STRING;
-		}
-		int len = 0;
-		for (int i = 0; i < n; ++i) {
-			len += path.segment(i).length();
-		}
-		// account for /'s
-		if (n > 1) {
-			len += n - 1;
-		}
-		StringBuffer sb = new StringBuffer(len);
-		for (int i = 0; i < n; ++i) {
-			if (i != 0) {
-				sb.append('/');
-			}
-			sb.append(path.segment(i));
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Get the name of the element. If the marker has the
-	 * MarkerViewUtil#NAME_ATTRIBUTE set use that. Otherwise use the name of the
-	 * resource.
-	 * 
-	 * @param marker
-	 * @return String
-	 */
-	public static String getResourceName(IMarker marker) {
-
-		if (!marker.exists())
-			return Util.EMPTY_STRING;
-
-		try {
-			Object nameAttribute = marker
-					.getAttribute(MarkerViewUtil.NAME_ATTRIBUTE);
-
-			if (nameAttribute != null) {
-				return nameAttribute.toString();
-			}
-		} catch (CoreException exception) {
-			Policy.handle(exception);
-		}
-
-		return marker.getResource().getName();
-	}
-
-	/**
-	 * Return whether or not the marker is editable.
-	 * 
-	 * @param marker
-	 * @return boolean <code>true</code> if it is editable
-	 */
-	public static boolean isEditable(IMarker marker) {
-		if (marker == null) {
-			return false;
-		}
-		try {
-			return marker.isSubtypeOf(IMarker.BOOKMARK)
-					|| (marker.isSubtypeOf(IMarker.TASK) && marker
-							.getAttribute(IMarker.USER_EDITABLE, true));
-		} catch (CoreException e) {
-			return false;
-		}
-	}
-
-	/**
-	 * Return an error status for the given exception.
-	 * 
-	 * @param exception
-	 * @return IStatus
-	 */
-	public static IStatus errorStatus(Throwable exception) {
-		String message = exception.getLocalizedMessage();
-		if (message == null) {
-			message = EMPTY_STRING;
-		}
-		return new Status(IStatus.ERROR, IDEWorkbenchPlugin.IDE_WORKBENCH,
-				IStatus.ERROR, message, exception);
-	}
-
-	static final int SHORT_DELAY = 100;// The 100 ms short delay for scheduling
-
-	static final int LONG_DELAY = 30000;// The 30s long delay to run without a
-
-	// builder update
-
-	private Util() {
-		super();
-	}
-
-	/**
-	 * Get the image for the severity if it can be identified.
-	 * 
-	 * @param severity
-	 * @return Image or <code>null</code>
-	 */
-	public static Image getImage(int severity) {
-
-		if (severity == IMarker.SEVERITY_ERROR) {
-			return getIDEImage(IDEInternalWorkbenchImages.IMG_OBJS_ERROR_PATH);
-		}
-		if (severity == IMarker.SEVERITY_WARNING) {
-			return getIDEImage(IDEInternalWorkbenchImages.IMG_OBJS_WARNING_PATH);
-		}
-		if (severity == IMarker.SEVERITY_INFO) {
-			return getIDEImage(IDEInternalWorkbenchImages.IMG_OBJS_INFO_PATH);
-		}
-
-		return null;
-	}
-
-	/**
-	 * Get the IDE image at path.
-	 * 
-	 * @param path
-	 * @return Image
-	 */
-	private static Image getIDEImage(String constantName) {
-
-		return JFaceResources.getResources().createImageWithDefault(
-				IDEInternalWorkbenchImages.getImageDescriptor(constantName));
-
-	}
-
-	/**
-	 * Get the short name for the container
-	 * 
-	 * @param marker
-	 * @return String
-	 */
-	public static String getShortContainerName(IMarker marker) {
-
-		if (!marker.exists())
-			return Util.EMPTY_STRING;
-
-		try {
-			Object pathAttribute = marker
-					.getAttribute(MarkerViewUtil.PATH_ATTRIBUTE);
-
-			if (pathAttribute != null) {
-				return pathAttribute.toString();
-			}
-		} catch (CoreException exception) {
-			// Log the exception and fall back.
-			Policy.handle(exception);
-		}
-
-		IResource resource = marker.getResource();
-		int type = resource.getType();
-
-		// Cannot be project relative if it is the root or a project
-		if (type == IResource.PROJECT) {
-			return resource.getName();
-		}
-
-		if (type == IResource.ROOT) {
-			return MarkerMessages.Util_WorkspaceRoot;
-		}
-
-		String result = marker.getResource().getProjectRelativePath()
-				.removeLastSegments(1).toOSString();
-		if (result.trim().length() == 0) {
-			return MarkerMessages.Util_ProjectRoot;
-		}
-		return result;
-	}
-
-	/**
-	 * Return whether or not the selection has one element that is concrete.
-	 * 
-	 * @param selection
-	 * @return <true>code</true> if the selection has one element that is
-	 *         concrete.
-	 */
-	static boolean isSingleConcreteSelection(IStructuredSelection selection) {
-		if (selection != null && selection.size() == 1) {
-			Object first = selection.getFirstElement();
-			if (first instanceof MarkerNode) {
-				return ((MarkerNode) first).isConcrete();
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Return whether or not all of the elements in the selection are concrete.
-	 * 
-	 * @param selection
-	 * @return <true>code</true> if all of the elements are concrete.
-	 */
-	public static boolean allConcreteSelection(IStructuredSelection selection) {
-		if (selection != null && selection.size() > 0) {
-			Iterator nodes = selection.iterator();
-			while (nodes.hasNext()) {
-				if (((MarkerNode) nodes.next()).isConcrete()) {
-					continue;
-				}
-				return false;
-			}
-			return true;
-		}
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/messages.properties b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/messages.properties
deleted file mode 100644
index 1026f27..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/messages.properties
+++ /dev/null
@@ -1,282 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-#     Sebastian Davids <sdavids@gmx.de> 
-#		- Fix for Bug 132145 [Markers] Filter dialog problems
-#		- Fix for Bug 132148 [Markers] [Dialogs] Set Limits dialog problems
-#		- Fix for Bug 109361 [Markers] Multiselection in problems view yields invalid status message
-###############################################################################
-
-sortAction_title = &Sorting...
-filtersSubMenu_title = &Filters
-filtersAction_title = &Configure Filters...
-filtersAction_tooltip = Configure the filters to be applied to this view
-
-sortDialog_title = Sorting
-sortDialog_label = Sort by:
-sortDialog_columnLabel = &{0}. 
-
-sortDirectionAscending_text = &Ascending
-sortDirectionAscending_text2 = A&scending
-sortDirectionAscending_text3 = As&cending
-sortDirectionAscending_text4 = Asce&nding
-
-sortDirectionDescending_text = &Descending
-sortDirectionDescending_text2 = D&escending
-sortDirectionDescending_text3 = Descend&ing
-sortDirectionDescending_text4 = Descendin&g
-
-restoreDefaults_text = Restore De&faults
-
-Error = Error: 
-Unknown = Unknown
-
-description_message = Description
-description_resource = Resource
-description_folder = Path
-description_lineNumber = Location
-description_creationTime = Creation time
-description_markerId = Id
-description_type = Type
-
-label_lineNumber = line {0}
-
-openAction_title = &Go To
-copyAction_title = &Copy
-pasteAction_title = &Paste
-deleteAction_title = &Delete
-deleteAction_tooltip = Delete
-selectAllAction_title = Select &All
-selectAllAction_calculating = Calculating Selection
-selectAllAction_applying = Applying Selection
-propertiesAction_title = P&roperties
-
-deleteActionConfirmTitle = Delete Selected Entries
-deleteActionConfirmMessage = Do you want to delete the selected entries? Deleted markers may be recreated by a build or may not be recoverable.
-
-filtersDialog_title = Filters
-filtersDialog_entriesTitle = &Configurations:
-filtersDialog_showItemsOfType = Show items of &type:
-filtersDialog_anyResource = On any &element
-filtersDialog_anyResourceInSameProject = On any element in same pro&ject
-filtersDialog_selectedResource = On selected ele&ment only
-filtersDialog_selectedAndChildren = On selected element and its c&hildren
-filtersDialog_workingSet = On wor&king set:  {0}
-filtersDialog_currentWorkingSet = On selected wor&king set
-filtersDialog_workingSetSelect = &Select...
-filtersDialog_noWorkingSet = On wor&king set:  <no working set selected>
-filtersDialog_selectAll = Select &All
-filtersDialog_deselectAll = &Deselect All
-filtersDialog_selectAllTypes = Sele&ct All
-filtersDialog_deselectAllTypes = Dese&lect All
-filtersDialog_conflictingName =  A filter already exists with the name {0}
-filtersDialogDeselectedFiltersTitle = Confirm Show All
-filtersDialogDeselectedFiltersMessage = You have not checked any configurations. This will show all entries. Continue?
-
-filtersDialog_descriptionLabel = Descri&ption 
-filtersDialog_contains = contains
-filtersDialog_doesNotContain = doesn't contain
-filtersDialog_severityLabel = Where severit&y is:
-filtersDialog_filterOnSeverity = Sho&w severities:
-filtersDialog_severityError = E&rror
-filtersDialog_severityWarning = Warnin&g
-filtersDialog_severityInfo = Inf&o
-filtersDialog_priorityLabel = Where priorit&y is: 
-filtersDialog_priorityHigh = Hi&gh
-filtersDialog_priorityNormal = No&rmal
-filtersDialog_priorityLow = Lo&w
-filtersDialog_statusLabel = Where stat&us is: 
-filtersDialog_statusComplete = C&ompleted
-filtersDialog_statusIncomplete = Not Completed
-
-filtersDialog_scopeTitle = &Scope
-filtersDialog_typesTitle = &Types
-filtersDialog_completionTitle = &Completed
-filtersDialog_priorityTitle = &Priority
-
-configureFiltersCommand_title = &Configure Contents...
-configureFiltersDialog_title = Configure Contents
-
-propertiesDialog_creationTime_text = Creation &time: 
-propertiesDialog_description_text = &Description: 
-propertiesDialog_folder_text = In &folder: 
-propertiesDialog_location_text = &Location: 
-propertiesDialog_resource_text = On &element: 
-propertiesDialog_title = Properties
-propertiesDialog_severityLabel = &Severity:
-propertiesDialog_errorLabel = Error
-propertiesDialog_warningLabel = Warning
-propertiesDialog_infoLabel = Info
-propertiesDialog_noseverityLabel = Not defined
-propertiesDialog_priority = &Priority:
-propertiesDialog_priorityHigh = High
-propertiesDialog_priorityNormal = Normal
-propertiesDialog_priorityLow = Low
-propertiesDialog_completed = &Completed
-
-filter_matchedMessage = Filter matched {0} of {1} items
-filter_itemsMessage = {0} items
-problem_filter_matchedMessage = {0} (Filter matched {1} of {2} items)
-
-errorModifyingBookmark = Error Modifying Bookmark
-errorModifyingTask = Error Modifying Task
-
-problemSeverity_description = Severity and Description
-problem_statusSummaryBreakdown = {0,choice,0#0 errors|1#{0,number,integer} error|1<{0,number,integer} errors}, {1,choice,0#0 warnings|1#{1,number,integer} warning|1<{1,number,integer} warnings}, {2,choice,0#0 infos|1#{2,number,integer} info|1<{2,number,integer} infos}
-marker_statusSummarySelected =   {0,choice,0#0 items |1#{0,number,integer} item |1<{0,number,integer} items} selected: {1}
-errorsAndWarningsSummaryBreakdown = {0,choice,0#0 errors|1#{0,number,integer} error|1<{0,number,integer} errors}, {1,choice,0#0 warnings|1#{1,number,integer} warning|1<{1,number,integer} warnings}, {2,choice,0#0 others|1#{2,number,integer} other|1<{2,number,integer} others}
-
-deleteCompletedAction_title = Delete Completed &Tasks
-markCompletedAction_title = &Mark Completed
-markCompletedHandler_task = Marking selected tasks completed
-
-deleteCompletedTasks_dialogTitle = Delete Completed Tasks
-deleteCompletedTasks_noneCompleted = No user-editable completed tasks to delete.
-deleteCompletedTasks_permanentPlural = Do you want to permanently delete the {0} completed tasks?
-deleteCompletedTasks_permanentSingular = Do you want to permanently delete the completed task?
-deleteCompletedTasks_errorMessage = Error deleting completed tasks
-
-addGlobalTaskAction_title = &Add Task...
-addGlobalTaskAction_tooltip = Add Task
-
-addGlobalTaskDialog_title = Add Task
-
-completion_description = Completed
-priority_description = Priority
-severity_description = Severity
-
-priority_high = High
-priority_normal = Normal
-priority_low = Low
-
-CopyToClipboardProblemDialog_title=Problem Copying to Clipboard
-CopyToClipboardProblemDialog_message=There was a problem when accessing the system clipboard. Retry?
-
-MarkerFilter_searching=Searching for markers
-MarkerView_processUpdates=Process resource updates
-MarkerView_waiting_on_changes=Waiting for workspace changes to finish
-MarkerView_searching_for_markers=Searching for markers
-MarkerView_refreshing_counts=Refreshing marker counts
-MarkerView_queueing_updates=Queueing viewer updates
-
-MarkerView_18=Filtering on marker limit
-MarkerView_19=Refreshing view
-SortUtil_finding_first=Finding first items
-SortUtil_partitioning=Partitioning items
-OpenMarker_errorTitle=Error
-PasteMarker_errorTitle=Error
-RemoveMarker_errorTitle=Error
-
-MarkerFilter_defaultFilterName=Default
-MarkerFilter_newFilterName=New Filter
-MarkerFilter_filtersTitle=User f&ilters:
-MarkerFilter_addFilterName=&New...
-MarkerFilter_deleteSelectedName = Remo&ve
-MarkerFilter_showAllCommand_title = &Show All
-MarkerFilter_ConfigureContentsCommand_title = &Configure Contents...
-
-MarkerFilterDialog_title=Add New Filter
-MarkerFilterDialog_message=Select Filter Name
-MarkerFilterDialog_emptyMessage=Name must not be empty
-AND_Title = Match a&ll configurations
-OR_Title = Match &any configuration
-
-MarkerFilterDialog_errorTitle = An error has occurred
-MarkerFilterDialog_failedFilterMessage = Could not create filter {0}. 
-
-MarkerPreferences_DialogTitle = Preferences
-MarkerPreferences_MarkerLimits = Use marker &limits
-MarkerPreferences_VisibleItems = Limit visible &items per group to:
-MarkerPreferences_MoveLeft = <<
-MarkerPreferences_MoveRight = >>
-MarkerPreferences_ColumnGroupTitle = Hide/Show Columns
-MarkerPreferences_VisibleColumnsTitle = &Show
-MarkerPreferences_HiddenColumnsTitle = &Hide
-
-ProblemFilterDialog_System_Filters_Title = System filte&rs:
-ProblemFilterDialog_All_Problems = Enabled for all problems
-ProblemFilterDialog_Selected_Types = Selected Types: 
-ProblemFilterDialog_Info_Severity = Where severity is info
-ProblemFilterDialog_Warning_Severity = Where severity is warning
-ProblemFilterDialog_Error_Severity = Where severity is error
-ProblemFilterDialog_Contains_Description = On any description containing {0}
-ProblemFilterDialog_Does_Not_Contain_Description = On any description not containing {0}
-ProblemFilterDialog_any = Filter on any element
-ProblemFilterDialog_sameContainer = Filter on any in the same container
-ProblemFilterDialog_selectedAndChildren = Filter on selected element and it's children
-ProblemFilterDialog_selected = Filter on selected element only
-ProblemFilterDialog_workingSet = Filter on working set {0}  
-
-ProblemFilterRegistry_nullType = Marker type {0} referenced in {1} does not exist.
-
-FieldMessage_NullMessage = Marker is null
-FieldMessage_WrongType = {0} is not of a displayable type
-
-FieldCategory_Uncategorized = Other
-Category_Label = {0} ({1} items)
-Category_One_Item_Label = {0} (1 item)
-Category_Limit_Label = {0} ({1} of {2} items)
-
-MarkerResolutionDialog_Fixing = Fixing
-MarkerResolutionDialog_Description = Select the fix for ''{0}''.
-MarkerResolutionDialog_Problems_List_Title = &Problems:
-MarkerResolutionDialog_Problems_List_Resource = Resource
-MarkerResolutionDialog_Problems_List_Location = Location
-MarkerResolutionDialog_Resolutions_List_Title = &Select a fix:
-MarkerResolutionDialog_CannotFixTitle = Could not fix
-MarkerResolutionDialog_CannotFixMessage = Could not fix {0}
-MarkerResolutionDialog_NoResolutionsFound = No fixes available for ''{0}''.
-
-MarkerResolutionDialog_AddOthers = Find Si&milar Problems
-
-MarkerResolutionDialog_Title = Select a fix
-MarkerResolutionDialog_CalculatingTask = Calculating Possible Resolutions
-MarkerResolutionDialog_WorkingSubTask = Working on: {0}
-resolveMarkerAction_title = &Quick Fix
-resolveMarkerAction_dialogTitle = Quick Fix
-resolveMarkerAction_computationAction = Finding fixes for {0}
-resolveMarkerAction_computationManyAction = Finding fixes
-
-Util_ProjectRoot = project root
-Util_WorkspaceRoot = workspace root
-
-ProblemView_GroupByMenu=&Group By
-ProblemView_Type=&Type
-ProblemView_None=&None
-ProblemView_UpdateCategoryJob=Update Categories
-
-DialogMarkerProperties_CreateMarker=Add Marker
-DialogMarkerProperties_ModifyMarker=Modify Marker
-DialogMarkerProperties_Modify=Modify
-DialogMarkerProperties_Create=Add
-
-DialogTaskProperties_CreateTask=Add Task
-
-modifyBookmark_title=Modify Bookmark
-modifyTask_title=Modify Task
-
-PasteHandler_title = Pasting Markers
-
-newViewTitle = {0} {1}
-NewViewHandler_dialogTitle = New {0} View
-NewViewHandler_dialogMessage = &Enter a name for the new view:
-
-
-################################################################################
-#qualifiedMarkerCommand_title is used to concatenate a command 
-#such as Delete with a specific marker type such as Task, Bookmark, or Problem.
-#
-#{0} represents the command and {1} represents the marker type.
-################################################################################
-qualifiedMarkerCommand_title = {0} {1}
-task_title = Task
-bookmark_title = Bookmark
-problem_title = Problem
-
-ContentGenerator_NoGrouping = The grouping {0} defined in {1} is undefined
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/package.html b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/package.html
deleted file mode 100644
index d1f771a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/package.html
+++ /dev/null
@@ -1,13 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Utility classes for working with markers in views
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/CollapseAllAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/CollapseAllAction.java
deleted file mode 100644
index 0a406de..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/CollapseAllAction.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM Corporation - initial API and implementation 
- *   Sebastian Davids <sdavids@gmx.de> - Collapse all action (25826)
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.handlers.CollapseAllHandler;
-
-/**
- * Collapse all project nodes.
- */
-public class CollapseAllAction extends ResourceNavigatorAction {
-
-    /**
-     * Creates the action.
-     * 
-     * @param navigator the resource navigator
-     * @param label the label for the action
-     */
-    public CollapseAllAction(IResourceNavigator navigator, String label) {
-        super(navigator, label);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                INavigatorHelpContextIds.COLLAPSE_ALL_ACTION);
-        setEnabled(true);
-        setActionDefinitionId(CollapseAllHandler.COMMAND_ID);
-    }
-
-    /*
-     * Implementation of method defined on <code>IAction</code>.
-     */
-    public void run() {
-        getNavigator().getViewer().collapseAll();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/CopyAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/CopyAction.java
deleted file mode 100644
index e330d6f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/CopyAction.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.SelectionListenerAction;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-import org.eclipse.ui.part.ResourceTransfer;
-
-/**
- * Standard action for copying the currently selected resources to the clipboard.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @since 2.0
- */
-/*package*/class CopyAction extends SelectionListenerAction {
-
-    /**
-     * The id of this action.
-     */
-    public static final String ID = PlatformUI.PLUGIN_ID + ".CopyAction"; //$NON-NLS-1$
-
-    /**
-     * The shell in which to show any dialogs.
-     */
-    private Shell shell;
-
-    /**
-     * System clipboard
-     */
-    private Clipboard clipboard;
-
-    /**
-     * Associated paste action. May be <code>null</code>
-     */
-    private PasteAction pasteAction;
-
-    /**
-     * Creates a new action.
-     *
-     * @param shell the shell for any dialogs
-     * @param clipboard a platform clipboard
-     */
-    public CopyAction(Shell shell, Clipboard clipboard) {
-        super(ResourceNavigatorMessages.CopyAction_title);
-        Assert.isNotNull(shell);
-        Assert.isNotNull(clipboard);
-        this.shell = shell;
-        this.clipboard = clipboard;
-        setToolTipText(ResourceNavigatorMessages.CopyAction_toolTip);
-        setId(CopyAction.ID);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				INavigatorHelpContextIds.COPY_ACTION);
-    }
-
-    /**
-     * Creates a new action.
-     *
-     * @param shell the shell for any dialogs
-     * @param clipboard a platform clipboard
-     * @param pasteAction a paste action
-     * 
-     * @since 2.0
-     */
-    public CopyAction(Shell shell, Clipboard clipboard, PasteAction pasteAction) {
-        this(shell, clipboard);
-        this.pasteAction = pasteAction;
-    }
-
-   
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run() {
-    	 /**
-         * The <code>CopyAction</code> implementation of this method defined 
-         * on <code>IAction</code> copies the selected resources to the 
-         * clipboard.
-         */
-        List selectedResources = getSelectedResources();
-        IResource[] resources = (IResource[]) selectedResources
-                .toArray(new IResource[selectedResources.size()]);
-
-        // Get the file names and a string representation
-        final int length = resources.length;
-        int actualLength = 0;
-        String[] fileNames = new String[length];
-        StringBuffer buf = new StringBuffer();
-        for (int i = 0; i < length; i++) {
-            IPath location = resources[i].getLocation();
-            // location may be null. See bug 29491.
-            if (location != null) {
-				fileNames[actualLength++] = location.toOSString();
-			}
-            if (i > 0) {
-				buf.append("\n"); //$NON-NLS-1$
-			}
-            buf.append(resources[i].getName());
-        }
-        // was one or more of the locations null?
-        if (actualLength < length) {
-            String[] tempFileNames = fileNames;
-            fileNames = new String[actualLength];
-            for (int i = 0; i < actualLength; i++) {
-				fileNames[i] = tempFileNames[i];
-			}
-        }
-        setClipboard(resources, fileNames, buf.toString());
-
-        // update the enablement of the paste action
-        // workaround since the clipboard does not suppot callbacks
-        if (pasteAction != null && pasteAction.getStructuredSelection() != null) {
-			pasteAction.selectionChanged(pasteAction.getStructuredSelection());
-		}
-    }
-
-    /**
-     * Set the clipboard contents. Prompt to retry if clipboard is busy.
-     * 
-     * @param resources the resources to copy to the clipboard
-     * @param fileNames file names of the resources to copy to the clipboard
-     * @param names string representation of all names
-     */
-    private void setClipboard(IResource[] resources, String[] fileNames,
-            String names) {
-        try {
-            // set the clipboard contents
-            if (fileNames.length > 0) {
-                clipboard.setContents(new Object[] { resources, fileNames,
-                        names },
-                        new Transfer[] { ResourceTransfer.getInstance(),
-                                FileTransfer.getInstance(),
-                                TextTransfer.getInstance() });
-            } else {
-                clipboard.setContents(new Object[] { resources, names },
-                        new Transfer[] { ResourceTransfer.getInstance(),
-                                TextTransfer.getInstance() });
-            }
-        } catch (SWTError e) {
-            if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD) {
-				throw e;
-			}
-            if (MessageDialog
-                    .openQuestion(
-                            shell,
-                            ResourceNavigatorMessages.CopyToClipboardProblemDialog_title, ResourceNavigatorMessages.CopyToClipboardProblemDialog_message)) {
-				setClipboard(resources, fileNames, names);
-			}
-        }
-    }
-
-   
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-     */
-    protected boolean updateSelection(IStructuredSelection selection) {
-    	
-    	 /**
-         * The <code>CopyAction</code> implementation of this
-         * <code>SelectionListenerAction</code> method enables this action if 
-         * one or more resources of compatible types are selected.
-         */
-    	
-        if (!super.updateSelection(selection)) {
-			return false;
-		}
-
-        if (getSelectedNonResources().size() > 0) {
-			return false;
-		}
-
-        List selectedResources = getSelectedResources();
-        if (selectedResources.size() == 0) {
-			return false;
-		}
-
-        boolean projSelected = selectionIsOfType(IResource.PROJECT);
-        boolean fileFoldersSelected = selectionIsOfType(IResource.FILE
-                | IResource.FOLDER);
-        if (!projSelected && !fileFoldersSelected) {
-			return false;
-		}
-
-        // selection must be homogeneous
-        if (projSelected && fileFoldersSelected) {
-			return false;
-		}
-
-        // must have a common parent	
-        IContainer firstParent = ((IResource) selectedResources.get(0))
-                .getParent();
-        if (firstParent == null) {
-			return false;
-		}
-
-        Iterator resourcesEnum = selectedResources.iterator();
-        while (resourcesEnum.hasNext()) {
-            IResource currentResource = (IResource) resourcesEnum.next();
-            if (!currentResource.getParent().equals(firstParent)) {
-				return false;
-			}
-        }
-
-        return true;
-    }
-
-}
-
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/FilterSelectionAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/FilterSelectionAction.java
deleted file mode 100644
index 77a34a8..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/FilterSelectionAction.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-
-/**
- * The FilterSelectionAction opens the filters dialog.
- */
-public class FilterSelectionAction extends ResourceNavigatorAction {
-    private static final String FILTER_TOOL_TIP = ResourceNavigatorMessages.FilterSelection_toolTip;
-
-    private static final String FILTER_SELECTION_MESSAGE = ResourceNavigatorMessages.FilterSelection_message;
-
-    private static final String FILTER_TITLE_MESSAGE = ResourceNavigatorMessages.FilterSelection_title;
-
-    /**
-     * Creates the action.
-     * 
-     * @param navigator the resource navigator
-     * @param label the label for the action
-     */
-    public FilterSelectionAction(IResourceNavigator navigator, String label) {
-        super(navigator, label);
-        setToolTipText(FILTER_TOOL_TIP);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                INavigatorHelpContextIds.FILTER_SELECTION_ACTION);
-        setEnabled(true);
-    }
-
-    /*
-     * Implementation of method defined on <code>IAction</code>.
-     */
-    public void run() {
-        IResourceNavigator navigator = getNavigator();
-        ResourcePatternFilter filter = navigator.getPatternFilter();
-        FiltersContentProvider contentProvider = new FiltersContentProvider(
-                filter);
-
-        ListSelectionDialog dialog = new ListSelectionDialog(getShell(),
-                getViewer(), contentProvider, new LabelProvider(),
-                FILTER_SELECTION_MESSAGE);
-
-        dialog.setTitle(FILTER_TITLE_MESSAGE);
-        dialog.setInitialSelections(contentProvider.getInitialSelections());
-        dialog.open();
-        if (dialog.getReturnCode() == Window.OK) {
-            Object[] results = dialog.getResult();
-            String[] selectedPatterns = new String[results.length];
-            System.arraycopy(results, 0, selectedPatterns, 0, results.length);
-            filter.setPatterns(selectedPatterns);
-            navigator.setFiltersPreference(selectedPatterns);
-            Viewer viewer = getViewer();
-            viewer.getControl().setRedraw(false);
-            viewer.refresh();
-            viewer.getControl().setRedraw(true);
-        }
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/FiltersContentProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/FiltersContentProvider.java
deleted file mode 100644
index 7daec13..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/FiltersContentProvider.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * The FiltersContentProvider provides the elements for use by the list dialog
- * for selecting the patterns to apply.
- */
-/* package */class FiltersContentProvider implements
-        IStructuredContentProvider {
-
-    private static List definedFilters;
-
-    private static List defaultFilters;
-
-    private ResourcePatternFilter resourceFilter;
-
-    /**
-     * Create a FiltersContentProvider using the selections from the supplied
-     * resource filter.
-     * 
-     * @param filter the resource pattern filter 
-     */
-    public FiltersContentProvider(ResourcePatternFilter filter) {
-        this.resourceFilter = filter;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContentProvider.
-     */
-    public void dispose() {
-    }
-
-    /**
-     * Returns the filters which are enabled by default.
-     *
-     * @return a list of strings
-     */
-    public static List getDefaultFilters() {
-        if (defaultFilters == null) {
-            readFilters();
-        }
-        return defaultFilters;
-    }
-
-    /**
-     * Returns the filters currently defined for the navigator.
-     *
-     * @return a list of strings
-     */
-    public static List getDefinedFilters() {
-        if (definedFilters == null) {
-            readFilters();
-        }
-        return definedFilters;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStructuredContentProvider.
-     */
-    public Object[] getElements(Object inputElement) {
-        return getDefinedFilters().toArray();
-    }
-
-    /**
-     * Return the initially selected elements.
-     * 
-     * @return an array with the initial selections 
-     */
-    public String[] getInitialSelections() {
-        return this.resourceFilter.getPatterns();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContentProvider.
-     */
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-    }
-
-    /**
-     * Reads the filters currently defined for the workbench. 
-     */
-    private static void readFilters() {
-		definedFilters = new ArrayList();
-		defaultFilters = new ArrayList();
-		IExtensionPoint extension = Platform.getExtensionRegistry()
-				.getExtensionPoint(IDEWorkbenchPlugin.IDE_WORKBENCH + '.' 
-						+ ResourcePatternFilter.FILTERS_TAG);
-		if (extension != null) {
-			IExtension[] extensions = extension.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				IConfigurationElement[] configElements = extensions[i]
-						.getConfigurationElements();
-				for (int j = 0; j < configElements.length; j++) {
-					String pattern = configElements[j].getAttribute("pattern");//$NON-NLS-1$
-					if (pattern != null) {
-						definedFilters.add(pattern);
-					}
-					String selected = configElements[j]
-							.getAttribute("selected");//$NON-NLS-1$
-					if (selected != null && selected.equalsIgnoreCase("true")) { //$NON-NLS-1$
-						defaultFilters.add(pattern);
-					}
-				}
-
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/GotoActionGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/GotoActionGroup.java
deleted file mode 100644
index ed8f9dd..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/GotoActionGroup.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-import org.eclipse.ui.views.framelist.BackAction;
-import org.eclipse.ui.views.framelist.ForwardAction;
-import org.eclipse.ui.views.framelist.FrameList;
-import org.eclipse.ui.views.framelist.GoIntoAction;
-import org.eclipse.ui.views.framelist.UpAction;
-
-/**
- * This is the action group for the goto actions.
- */
-public class GotoActionGroup extends ResourceNavigatorActionGroup {
-
-    private BackAction backAction;
-
-    private ForwardAction forwardAction;
-
-    private GoIntoAction goIntoAction;
-
-    private UpAction upAction;
-
-    private GotoResourceAction goToResourceAction;
-
-    public GotoActionGroup(IResourceNavigator navigator) {
-        super(navigator);
-    }
-
-    public void fillContextMenu(IMenuManager menu) {
-        IStructuredSelection selection = (IStructuredSelection) getContext()
-                .getSelection();
-        if (selection.size() == 1) {
-            if (ResourceSelectionUtil.allResourcesAreOfType(selection,
-                    IResource.FOLDER)) {
-                menu.add(goIntoAction);
-            } else {
-                IStructuredSelection resourceSelection = ResourceSelectionUtil
-                        .allResources(selection, IResource.PROJECT);
-                if (resourceSelection != null && !resourceSelection.isEmpty()) {
-                    IProject project = (IProject) resourceSelection
-                            .getFirstElement();
-                    if (project.isOpen()) {
-						menu.add(goIntoAction);
-					}
-                }
-            }
-        }
-    }
-
-    public void fillActionBars(IActionBars actionBars) {
-        actionBars.setGlobalActionHandler(IWorkbenchActionConstants.GO_INTO,
-                goIntoAction);
-        actionBars.setGlobalActionHandler(ActionFactory.BACK.getId(),
-                backAction);
-        actionBars.setGlobalActionHandler(ActionFactory.FORWARD.getId(),
-                forwardAction);
-        actionBars.setGlobalActionHandler(IWorkbenchActionConstants.UP,
-                upAction);
-        actionBars.setGlobalActionHandler(
-                IWorkbenchActionConstants.GO_TO_RESOURCE, goToResourceAction);
-
-        IToolBarManager toolBar = actionBars.getToolBarManager();
-        toolBar.add(backAction);
-        toolBar.add(forwardAction);
-        toolBar.add(upAction);
-    }
-
-    protected void makeActions() {
-        FrameList frameList = navigator.getFrameList();
-        goIntoAction = new GoIntoAction(frameList);
-        backAction = new BackAction(frameList);
-        forwardAction = new ForwardAction(frameList);
-        upAction = new UpAction(frameList);
-        goToResourceAction = new GotoResourceAction(navigator,
-                ResourceNavigatorMessages.GoToResource_label);
-    }
-
-    public void updateActionBars() {
-        ActionContext context = getContext();
-        boolean enable = false;
-
-        // Fix for bug 26126. Resource change listener could call
-        // updateActionBars without a context being set.
-        // This should never happen because resource navigator sets
-        // context immediately after this group is created.
-        if (context != null) {
-            IStructuredSelection selection = (IStructuredSelection) context
-                    .getSelection();
-
-            if (selection.size() == 1) {
-                Object object = selection.getFirstElement();
-                if (object instanceof IProject) {
-                    enable = ((IProject) object).isOpen();
-                } else if (object instanceof IFolder) {
-                    enable = true;
-                }
-            }
-        }
-        goIntoAction.setEnabled(enable);
-        // the rest of the actions update by listening to frame list changes
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/GotoResourceAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/GotoResourceAction.java
deleted file mode 100644
index a5221a3..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/GotoResourceAction.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Implements the go to resource action. Opens a dialog and set
- * the navigator selection with the resource selected by
- * the user.
- */
-public class GotoResourceAction extends ResourceNavigatorAction {
-    /**
-     * Creates a new instance of the class.
-     * 
-     * @param navigator the navigator
-     * @param label the label
-     * @since 2.0
-     */
-    public GotoResourceAction(IResourceNavigator navigator, String label) {
-        super(navigator, label);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                INavigatorHelpContextIds.GOTO_RESOURCE_ACTION);
-    }
-
-    /**
-     * Collect all resources in the workbench open a dialog asking
-     * the user to select a resource and change the selection in
-     * the navigator.
-     */
-    public void run() {
-        IContainer container = (IContainer) getViewer().getInput();
-        GotoResourceDialog dialog = new GotoResourceDialog(getShell(),
-                container, IResource.FILE | IResource.FOLDER
-                        | IResource.PROJECT);
-        dialog.open();
-        Object[] result = dialog.getResult();
-        if (result == null || result.length == 0
-                || result[0] instanceof IResource == false) {
-			return;
-		}
-
-        IResource selection = (IResource) result[0];
-        getViewer().setSelection(new StructuredSelection(selection), true);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/GotoResourceDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/GotoResourceDialog.java
deleted file mode 100644
index bbf337a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/GotoResourceDialog.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-
-/**
- * Shows a list of resources to the user with a text entry field for a string
- * pattern used to filter the list of resources.
- * 
- */
-/* package */class GotoResourceDialog extends FilteredResourcesSelectionDialog {
-
-	/**
-	 * Creates a new instance of the class.
-	 */
-	protected GotoResourceDialog(Shell parentShell, IContainer container,
-			int typesMask) {
-		super(parentShell, false, container, typesMask);
-		setTitle(ResourceNavigatorMessages.Goto_title);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parentShell,
-				INavigatorHelpContextIds.GOTO_RESOURCE_DIALOG);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/INavigatorHelpContextIds.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/INavigatorHelpContextIds.java
deleted file mode 100644
index d7e93a9..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/INavigatorHelpContextIds.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM Corporation - initial API and implementation 
- *   Sebastian Davids <sdavids@gmx.de> - Collapse all action (25826)
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Help context ids for the resource navigator view.
- * <p>
- * This interface contains constants only; it is not intended to be implemented
- * or extended.
- * </p>
- * 
- */
-/*package*/interface INavigatorHelpContextIds {
-    public static final String PREFIX = PlatformUI.PLUGIN_ID + "."; //$NON-NLS-1$
-
-    // Actions
-    public static final String FILTER_SELECTION_ACTION = PREFIX
-            + "filter_selection_action_context"; //$NON-NLS-1$
-
-    public static final String GOTO_RESOURCE_ACTION = PREFIX
-            + "goto_resource_action_context"; //$NON-NLS-1$
-
-    public static final String RESOURCE_NAVIGATOR_MOVE_ACTION = PREFIX
-            + "resource_navigator_move_action_context"; //$NON-NLS-1$
-
-    public static final String RESOURCE_NAVIGATOR_RENAME_ACTION = PREFIX
-            + "resource_navigator_rename_action_context"; //$NON-NLS-1$
-
-    public static final String SHOW_IN_NAVIGATOR_ACTION = PREFIX
-            + "show_in_navigator_action_context"; //$NON-NLS-1$
-
-    public static final String SORT_VIEW_ACTION = PREFIX
-            + "sort_view_action_context"; //$NON-NLS-1$
-
-    public static final String COPY_ACTION = PREFIX
-            + "resource_navigator_copy_action_context"; //$NON-NLS-1$
-
-    public static final String PASTE_ACTION = PREFIX
-            + "resource_navigator_paste_action_context"; //$NON-NLS-1$
-
-    public static final String COLLAPSE_ALL_ACTION = PREFIX
-            + "collapse_all_action_context"; //$NON-NLS-1$
-
-    // Dialogs
-    public static final String GOTO_RESOURCE_DIALOG = PREFIX
-            + "goto_resource_dialog_context"; //$NON-NLS-1$
-
-    // Views
-    public static final String RESOURCE_VIEW = PREFIX + "resource_view_context"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/IResourceNavigator.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/IResourceNavigator.java
deleted file mode 100644
index 3b0dc28..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/IResourceNavigator.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.views.framelist.FrameList;
-
-/**
- * This interface defines the API for the resource navigator.
- * The action groups should restrict themselves to using this API.
- * <p>
- * This interface is not intended to be implemented by clients.
- * Subclass <code>org.eclipse.ui.views.ResourceNavigator</code> 
- * instead.   
- * </p>
- * 
- * @since 2.0
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IResourceNavigator extends IViewPart {
-
-    /**
-     * Returns the pattern filter.
-     *
-     * @return the pattern filter
-     */
-    ResourcePatternFilter getPatternFilter();
-
-    /**
-     * Returns the active working set, or <code>null<code> if none.
-     *
-     * @return the active working set, or <code>null<code> if none
-     * @since 2.0
-     */
-    IWorkingSet getWorkingSet();
-
-    /**
-     * Returns the current sorter.
-     * @return the resource navigator's sorter
-     * 
-     * @deprecated as of 3.3, use {@link IResourceNavigator#getComparator()} instead
-     */
-    ResourceSorter getSorter();
-
-    /**
-     * Sets the current sorter.
-     * @param sorter the sorter to use
-     * 
-     * @deprecated as of 3.3, use {@link IResourceNavigator#setComparator(ResourceComparator)} instead
-     */
-    void setSorter(ResourceSorter sorter);
-
-    /**
-     * Returns the current comparator.
-     * 
-     * @return the resource navigator's comparator
-     * @since 3.3
-     */
-    ResourceComparator getComparator();
-
-    /**
-     * Sets the current comparator.
-     * 
-     * @param comparator the comparator to use
-     * @since 3.3
-     */
-    void setComparator(ResourceComparator comparator);
-    
-    /**
-     * Sets the values of the filter preference to be the 
-     * strings in preference values.
-     * @param patterns filter patterns to use on contents of the resource navigator
-     */
-    void setFiltersPreference(String[] patterns);
-
-    /**
-     * Returns the viewer which shows the resource tree.
-     * @return the resource navigator's tree viewer
-     */
-    TreeViewer getViewer();
-
-    /**
-     * Returns the frame list for this navigator.
-     * @return the list of frames maintained by the resource navigator 
-     */
-    FrameList getFrameList();
-
-    /**
-     * Returns whether this navigator's selection automatically tracks the active editor.
-     * 
-     * @return <code>true</code> if linking is enabled, <code>false</code> if not
-     * @since 2.1
-     */
-    boolean isLinkingEnabled();
-
-    /**
-     * Sets the working set for this view, or <code>null</code> to clear it.
-     * 
-     * @param workingSet the working set, or <code>null</code> to clear it
-     * @since 2.0
-     */
-    void setWorkingSet(IWorkingSet workingSet);
-
-    /**
-     * Sets whether this navigator's selection automatically tracks the active editor.
-     * 
-     * @param enabled <code>true</code> to enable, <code>false</code> to disable
-     * @since 2.1
-     */
-    void setLinkingEnabled(boolean enabled);
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/LocalSelectionTransfer.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/LocalSelectionTransfer.java
deleted file mode 100644
index 691b737..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/LocalSelectionTransfer.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.dnd.TransferData;
-
-/**
- * A LocalSelectionTransfer may be used for drag and drop operations within the
- * same instance of Eclipse. The selection is made available directly for use in
- * the DropTargetListener. dropAccept method. The DropTargetEvent passed to
- * dropAccept does not contain the drop data. The selection may be used for
- * validation purposes so that the drop can be aborted if appropriate. This
- * class is not intended to be subclassed.
- * 
- * @since 2.1
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class LocalSelectionTransfer extends
-		org.eclipse.jface.util.LocalSelectionTransfer {
-
-	private static final LocalSelectionTransfer INSTANCE = new LocalSelectionTransfer();
-
-	/**
-	 * The get/set methods delegate to JFace's LocalSelectionTransfer to allow
-	 * data to be exchanged freely whether the client uses this
-	 * LocalSelectionTransfer or JFace's LocalSelectionTransfer. Protected
-	 * methods such as getTypeIds() are handled via inheritance, not delegation
-	 * due to visibility constraints.
-	 */
-	private org.eclipse.jface.util.LocalSelectionTransfer jfaceTransfer = org.eclipse.jface.util.LocalSelectionTransfer
-			.getTransfer();
-
-	/**
-	 * Only the singleton instance of this class may be used.
-	 */
-	private LocalSelectionTransfer() {
-	}
-
-	/**
-	 * Returns the singleton.
-	 * 
-	 * @return the singleton
-	 */
-	public static LocalSelectionTransfer getInstance() {
-		return INSTANCE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.util.LocalSelectionTransfer#getSelection()
-	 */
-	public ISelection getSelection() {
-		return jfaceTransfer.getSelection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.util.LocalSelectionTransfer#getSelectionSetTime()
-	 */
-	public long getSelectionSetTime() {
-		return jfaceTransfer.getSelectionSetTime();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.util.LocalSelectionTransfer#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection s) {
-		jfaceTransfer.setSelection(s);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.util.LocalSelectionTransfer#setSelectionSetTime(long)
-	 */
-	public void setSelectionSetTime(long time) {
-		jfaceTransfer.setSelectionSetTime(time);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.LocalSelectionTransfer#javaToNative(java.lang.Object, org.eclipse.swt.dnd.TransferData)
-	 */
-	public void javaToNative(Object object, TransferData transferData) {
-		jfaceTransfer.javaToNative(object, transferData);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.LocalSelectionTransfer#nativeToJava(org.eclipse.swt.dnd.TransferData)
-	 */
-	public Object nativeToJava(TransferData transferData) {
-		return jfaceTransfer.nativeToJava(transferData);
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/MainActionGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/MainActionGroup.java
deleted file mode 100644
index 431e4ad..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/MainActionGroup.java
+++ /dev/null
@@ -1,365 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - Collapse all action (25826)
- *     Sebastian Davids <sdavids@gmx.de> - Images for menu items (27481)
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import java.util.List;
-
-import org.eclipse.core.commands.operations.IUndoContext;
-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.ResourcesPlugin;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.AddBookmarkAction;
-import org.eclipse.ui.actions.AddTaskAction;
-import org.eclipse.ui.actions.ExportResourcesAction;
-import org.eclipse.ui.actions.ImportResourcesAction;
-import org.eclipse.ui.actions.NewWizardMenu;
-import org.eclipse.ui.actions.WorkingSetFilterActionGroup;
-import org.eclipse.ui.dialogs.PropertyDialogAction;
-import org.eclipse.ui.ide.IDEActionFactory;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-import org.eclipse.ui.operations.UndoRedoActionGroup;
-
-/**
- * The main action group for the navigator.
- * This contains a few actions and several subgroups.
- */
-public class MainActionGroup extends ResourceNavigatorActionGroup {
-
-    protected AddBookmarkAction addBookmarkAction;
-
-    protected AddTaskAction addTaskAction;
-
-    protected PropertyDialogAction propertyDialogAction;
-
-    protected ImportResourcesAction importAction;
-    
-    protected ExportResourcesAction exportAction;
-
-    protected CollapseAllAction collapseAllAction;
-
-    protected ToggleLinkingAction toggleLinkingAction;
-
-    protected GotoActionGroup gotoGroup;
-
-    protected OpenActionGroup openGroup;
-
-    protected RefactorActionGroup refactorGroup;
-
-    protected WorkingSetFilterActionGroup workingSetGroup;
-
-    protected SortAndFilterActionGroup sortAndFilterGroup;
-    
-    protected UndoRedoActionGroup undoRedoGroup;
-
-    protected WorkspaceActionGroup workspaceGroup;
-
-    private IResourceChangeListener resourceChangeListener;
-
-    private NewWizardMenu newWizardMenu;
-
-    /**
-     * Constructs the main action group.
-     * 
-     * @param navigator the navigator view
-     */
-    public MainActionGroup(IResourceNavigator navigator) {
-        super(navigator);
-        resourceChangeListener = new IResourceChangeListener() {
-            public void resourceChanged(IResourceChangeEvent event) {
-                handleResourceChanged(event);
-            }
-        };
-        ResourcesPlugin.getWorkspace().addResourceChangeListener(
-                resourceChangeListener, IResourceChangeEvent.POST_CHANGE);
-        makeSubGroups();
-    }
-
-    /**
-     * Handles a resource changed event by updating the enablement
-     * if one of the selected projects is opened or closed.
-     */
-    protected void handleResourceChanged(IResourceChangeEvent event) {
-        ActionContext context = getContext();
-        if (context == null) {
-            return;
-        }
-
-        final IStructuredSelection selection = (IStructuredSelection) context
-                .getSelection();
-        if (ResourceSelectionUtil.allResourcesAreOfType(selection,
-                IResource.PROJECT) == false) {
-            return;
-        }
-        List sel = selection.toList();
-        IResourceDelta delta = event.getDelta();
-        if (delta == null) {
-            return;
-        }
-        IResourceDelta[] projDeltas = delta
-                .getAffectedChildren(IResourceDelta.CHANGED);
-        for (int i = 0; i < projDeltas.length; ++i) {
-            IResourceDelta projDelta = projDeltas[i];
-            //changing the project open state or description will effect open/close/build action enablement
-            if ((projDelta.getFlags() & (IResourceDelta.OPEN | IResourceDelta.DESCRIPTION)) != 0) {
-                if (sel.contains(projDelta.getResource())) {
-                    getNavigator().getSite().getShell().getDisplay().syncExec(
-                            new Runnable() {
-                                public void run() {
-                                    addTaskAction.selectionChanged(selection);
-                                    gotoGroup.updateActionBars();
-                                    refactorGroup.updateActionBars();
-                                    workspaceGroup.updateActionBars();
-                                }
-                            });
-                }
-            }
-        }
-    }
-
-    /**
-     * Makes the actions contained directly in this action group.
-     */
-    protected void makeActions() {
-        IShellProvider provider = navigator.getSite();
-
-        newWizardMenu = new NewWizardMenu(navigator.getSite().getWorkbenchWindow());
-        addBookmarkAction = new AddBookmarkAction(provider, true);
-        addTaskAction = new AddTaskAction(provider);
-        propertyDialogAction = new PropertyDialogAction(provider, navigator
-                .getViewer());
-
-        importAction = new ImportResourcesAction(navigator.getSite()
-                .getWorkbenchWindow());
-        importAction
-                .setDisabledImageDescriptor(getImageDescriptor("dtool16/import_wiz.gif")); //$NON-NLS-1$
-        importAction
-                .setImageDescriptor(getImageDescriptor("etool16/import_wiz.gif")); //$NON-NLS-1$		
-
-        exportAction = new ExportResourcesAction(navigator.getSite()
-                .getWorkbenchWindow());
-        exportAction
-                .setDisabledImageDescriptor(getImageDescriptor("dtool16/export_wiz.gif")); //$NON-NLS-1$
-        exportAction
-                .setImageDescriptor(getImageDescriptor("etool16/export_wiz.gif")); //$NON-NLS-1$		
-        
-        
-        collapseAllAction = new CollapseAllAction(navigator,
-                ResourceNavigatorMessages.CollapseAllAction_title);
-        collapseAllAction.setToolTipText(ResourceNavigatorMessages.CollapseAllAction_toolTip);
-        collapseAllAction
-                .setImageDescriptor(getImageDescriptor("elcl16/collapseall.gif")); //$NON-NLS-1$
-
-        toggleLinkingAction = new ToggleLinkingAction(navigator,
-                ResourceNavigatorMessages.ToggleLinkingAction_text);
-        toggleLinkingAction.setToolTipText(ResourceNavigatorMessages.ToggleLinkingAction_toolTip);
-        toggleLinkingAction
-                .setImageDescriptor(getImageDescriptor("elcl16/synced.gif"));//$NON-NLS-1$
-    }
-
-    /**
-     * Makes the sub action groups.
-     */
-    protected void makeSubGroups() {
-        gotoGroup = new GotoActionGroup(navigator);
-        openGroup = new OpenActionGroup(navigator);
-        refactorGroup = new RefactorActionGroup(navigator);
-        IPropertyChangeListener workingSetUpdater = new IPropertyChangeListener() {
-            public void propertyChange(PropertyChangeEvent event) {
-                String property = event.getProperty();
-
-                if (WorkingSetFilterActionGroup.CHANGE_WORKING_SET
-                        .equals(property)) {
-                    IResourceNavigator navigator = getNavigator();
-                    Object newValue = event.getNewValue();
-
-                    if (newValue instanceof IWorkingSet) {
-                        navigator.setWorkingSet((IWorkingSet) newValue);
-                    } else if (newValue == null) {
-                        navigator.setWorkingSet(null);
-                    }
-                }
-            }
-        };
-        TreeViewer treeView = navigator.getViewer();
-        Shell shell = treeView.getControl().getShell();
-        workingSetGroup = new WorkingSetFilterActionGroup(shell,
-                workingSetUpdater);
-        workingSetGroup.setWorkingSet(navigator.getWorkingSet());
-        sortAndFilterGroup = new SortAndFilterActionGroup(navigator);
-        workspaceGroup = new WorkspaceActionGroup(navigator);
-        IUndoContext workspaceContext= (IUndoContext)ResourcesPlugin.getWorkspace().getAdapter(IUndoContext.class);
-		undoRedoGroup= new UndoRedoActionGroup(getNavigator().getSite(), workspaceContext, true);
-
-    }
-    
-    /**
-     * Extends the superclass implementation to set the context in the subgroups.
-     */
-    public void setContext(ActionContext context) {
-        super.setContext(context);
-        gotoGroup.setContext(context);
-        openGroup.setContext(context);
-        refactorGroup.setContext(context);
-        sortAndFilterGroup.setContext(context);
-        workspaceGroup.setContext(context);
-        undoRedoGroup.setContext(context);
-    }
-
-    /**
-     * Fills the context menu with the actions contained in this group
-     * and its subgroups.
-     * 
-     * @param menu the context menu
-     */
-    public void fillContextMenu(IMenuManager menu) {
-        IStructuredSelection selection = (IStructuredSelection) getContext()
-                .getSelection();
-
-        MenuManager newMenu = new MenuManager(ResourceNavigatorMessages.ResourceNavigator_new);
-        menu.add(newMenu);
-        newMenu.add(newWizardMenu);
-
-        gotoGroup.fillContextMenu(menu);
-        openGroup.fillContextMenu(menu);
-        menu.add(new Separator());
-
-        refactorGroup.fillContextMenu(menu);
-        menu.add(new Separator());
-
-        menu.add(importAction);
-        menu.add(exportAction);
-        importAction.selectionChanged(selection);
-        exportAction.selectionChanged(selection);
-        menu.add(new Separator());
-
-        workspaceGroup.fillContextMenu(menu);
-
-        menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-        menu
-                .add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS
-                        + "-end")); //$NON-NLS-1$
-        menu.add(new Separator());
-
-        if (selection.size() == 1) {
-            propertyDialogAction.selectionChanged(selection);
-            menu.add(propertyDialogAction);
-        }
-    }
-
-    /**
-     * Adds the actions in this group and its subgroups to the action bars.
-     */
-    public void fillActionBars(IActionBars actionBars) {
-        actionBars.setGlobalActionHandler(ActionFactory.PROPERTIES.getId(),
-                propertyDialogAction);
-        actionBars.setGlobalActionHandler(IDEActionFactory.BOOKMARK.getId(),
-                addBookmarkAction);
-        actionBars.setGlobalActionHandler(IDEActionFactory.ADD_TASK.getId(),
-                addTaskAction);
-
-        gotoGroup.fillActionBars(actionBars);
-        openGroup.fillActionBars(actionBars);
-        refactorGroup.fillActionBars(actionBars);
-        workingSetGroup.fillActionBars(actionBars);
-        sortAndFilterGroup.fillActionBars(actionBars);
-        workspaceGroup.fillActionBars(actionBars);
-        undoRedoGroup.fillActionBars(actionBars);
-
-        IMenuManager menu = actionBars.getMenuManager();
-        menu.add(toggleLinkingAction);
-
-        IToolBarManager toolBar = actionBars.getToolBarManager();
-        toolBar.add(new Separator());
-        toolBar.add(collapseAllAction);
-        toolBar.add(toggleLinkingAction);
-    }
-
-    /**
-     * Updates the actions which were added to the action bars,
-     * delegating to the subgroups as necessary.
-     */
-    public void updateActionBars() {
-        IStructuredSelection selection = (IStructuredSelection) getContext()
-                .getSelection();
-        propertyDialogAction.setEnabled(selection.size() == 1);
-        addBookmarkAction.selectionChanged(selection);
-        addTaskAction.selectionChanged(selection);
-
-        gotoGroup.updateActionBars();
-        openGroup.updateActionBars();
-        refactorGroup.updateActionBars();
-        workingSetGroup.updateActionBars();
-        sortAndFilterGroup.updateActionBars();
-        workspaceGroup.updateActionBars();
-        undoRedoGroup.updateActionBars();
-    }
-
-    /**
-     * Runs the default action (open file) by delegating the open group.
-     */
-    public void runDefaultAction(IStructuredSelection selection) {
-        openGroup.runDefaultAction(selection);
-    }
-
-    /**
-     * Handles a key pressed event by invoking the appropriate action,
-     * delegating to the subgroups as necessary.
-     */
-    public void handleKeyPressed(KeyEvent event) {
-        refactorGroup.handleKeyPressed(event);
-        workspaceGroup.handleKeyPressed(event);
-    }
-
-    /**
-     * Extends the superclass implementation to dispose the 
-     * actions in this group and its subgroups.
-     */
-    public void dispose() {
-        ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-                resourceChangeListener);
-
-        newWizardMenu.dispose();
-        collapseAllAction.dispose();
-        importAction.dispose();
-        exportAction.dispose();
-        propertyDialogAction.dispose();
-        toggleLinkingAction.dispose();
-
-        gotoGroup.dispose();
-        openGroup.dispose();
-        refactorGroup.dispose();
-        sortAndFilterGroup.dispose();
-        workingSetGroup.dispose();
-        workspaceGroup.dispose();
-        undoRedoGroup.dispose();
-        super.dispose();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/NavigatorDragAdapter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/NavigatorDragAdapter.java
deleted file mode 100644
index d5c41bc..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/NavigatorDragAdapter.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-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.IPath;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSource;
-import org.eclipse.swt.dnd.DragSourceAdapter;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.actions.ReadOnlyStateChecker;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-import org.eclipse.ui.part.ResourceTransfer;
-import org.eclipse.ui.statushandlers.StatusManager;
-
-/**
- * Implements drag behaviour when items are dragged out of the
- * resource navigator.
- * 
- * @since 2.0
- */
-public class NavigatorDragAdapter extends DragSourceAdapter {
-    private static final String CHECK_MOVE_TITLE = ResourceNavigatorMessages.DragAdapter_title;
-
-    private static final String CHECK_DELETE_MESSAGE = ResourceNavigatorMessages.DragAdapter_checkDeleteMessage;
-
-    ISelectionProvider selectionProvider;
-
-    private TransferData lastDataType;
-
-    /**
-     * Constructs a new drag adapter.
-     * @param provider The selection provider
-     */
-    public NavigatorDragAdapter(ISelectionProvider provider) {
-        selectionProvider = provider;
-    }
-
-    /**
-     * This implementation of {@link DragSourceListener#dragFinished(DragSourceEvent)}
-     * responds to a drag that has moved resources outside the Navigator by deleting
-     * the corresponding source resource.
-     */
-    public void dragFinished(DragSourceEvent event) {
-        LocalSelectionTransfer.getInstance().setSelection(null);
-
-        if (event.doit == false) {
-			return;
-		}
-
-        final int typeMask = IResource.FOLDER | IResource.FILE;
-        if (event.detail == DND.DROP_MOVE) {
-            //never delete resources when dragging outside Eclipse. 
-            //workaround for bug 30543.
-            if (lastDataType != null
-                    && FileTransfer.getInstance().isSupportedType(lastDataType)) {
-				return;
-			}
-
-            IResource[] resources = getSelectedResources(typeMask);
-            DragSource dragSource = (DragSource) event.widget;
-            Control control = dragSource.getControl();
-            Shell shell = control.getShell();
-            ReadOnlyStateChecker checker;
-
-            if (resources == null || resources.length == 0) {
-				return;
-			}
-
-            checker = new ReadOnlyStateChecker(shell, CHECK_MOVE_TITLE,
-                    CHECK_DELETE_MESSAGE);
-            resources = checker.checkReadOnlyResources(resources);
-            //delete the old elements
-            for (int i = 0; i < resources.length; i++) {
-                try {
-                    resources[i].delete(IResource.KEEP_HISTORY
-                            | IResource.FORCE, null);
-                } catch (CoreException e) {
-                    StatusManager.getManager().handle(e, IDEWorkbenchPlugin.IDE_WORKBENCH);
-                }
-            }
-        } else if (event.detail == DND.DROP_TARGET_MOVE) {
-            IResource[] resources = getSelectedResources(typeMask);
-
-            // file moved for us by OS, no need to delete the resources, just
-            // update the view
-            if (resources == null) {
-				return;
-			}
-            for (int i = 0; i < resources.length; i++) {
-                try {
-                    resources[i].refreshLocal(IResource.DEPTH_INFINITE, null);
-                } catch (CoreException e) {
-                	 StatusManager.getManager().handle(e, IDEWorkbenchPlugin.IDE_WORKBENCH);
-                }
-            }
-        }
-    }
-
-    /**
-     * This implementation of {@link DragSourceListener#dragSetData(DragSourceEvent)}
-     * sets the drag event data based on the current selection in the Navigator.
-     */
-    public void dragSetData(DragSourceEvent event) {
-        final int typeMask = IResource.FILE | IResource.FOLDER;
-        IResource[] resources = getSelectedResources(typeMask);
-
-        if (resources == null || resources.length == 0) {
-			return;
-		}
-
-        lastDataType = event.dataType;
-        //use local selection transfer if possible
-        if (LocalSelectionTransfer.getInstance()
-                .isSupportedType(event.dataType)) {
-            event.data = LocalSelectionTransfer.getInstance().getSelection();
-            return;
-        }
-        //use resource transfer if possible
-        if (ResourceTransfer.getInstance().isSupportedType(event.dataType)) {
-            event.data = resources;
-            return;
-        }
-        //resort to a file transfer
-        if (!FileTransfer.getInstance().isSupportedType(event.dataType)) {
-			return;
-		}
-
-        // Get the path of each file and set as the drag data
-        final int length = resources.length;
-        int actualLength = 0;
-        String[] fileNames = new String[length];
-        for (int i = 0; i < length; i++) {
-            IPath location = resources[i].getLocation();
-            // location may be null. See bug 29491.
-            if (location != null) {
-				fileNames[actualLength++] = location.toOSString();
-			}
-        }
-        if (actualLength == 0) {
-			return;
-		}
-        // was one or more of the locations null?
-        if (actualLength < length) {
-            String[] tempFileNames = fileNames;
-            fileNames = new String[actualLength];
-            for (int i = 0; i < actualLength; i++) {
-				fileNames[i] = tempFileNames[i];
-			}
-        }
-        event.data = fileNames;
-    }
-
-    /**
-     * This implementation of {@link DragSourceListener#dragStart(DragSourceEvent)}
-     * allows the drag to start if the current Navigator selection contains resources
-     * that can be dragged.
-     */
-    public void dragStart(DragSourceEvent event) {
-        lastDataType = null;
-        // Workaround for 1GEUS9V
-        DragSource dragSource = (DragSource) event.widget;
-        Control control = dragSource.getControl();
-        if (control != control.getDisplay().getFocusControl()) {
-            event.doit = false;
-            return;
-        }
-
-        IStructuredSelection selection = (IStructuredSelection) selectionProvider
-                .getSelection();
-        for (Iterator i = selection.iterator(); i.hasNext();) {
-            Object next = i.next();
-            if (!(next instanceof IFile || next instanceof IFolder)) {
-                event.doit = false;
-                return;
-            }
-        }
-        if (selection.isEmpty()) {
-            event.doit = false;
-            return;
-        }
-        LocalSelectionTransfer.getInstance().setSelection(selection);
-        event.doit = true;
-    }
-
-    private IResource[] getSelectedResources(int resourceTypes) {
-        List resources = new ArrayList();
-        IResource[] result = new IResource[0];
-
-        ISelection selection = selectionProvider.getSelection();
-        if (!(selection instanceof IStructuredSelection) || selection.isEmpty()) {
-            return null;
-        }
-        IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-
-        // loop through list and look for matching items
-        Iterator itr = structuredSelection.iterator();
-        while (itr.hasNext()) {
-            Object obj = itr.next();
-            if (obj instanceof IResource) {
-                IResource res = (IResource) obj;
-                if ((res.getType() & resourceTypes) == res.getType()) {
-                    resources.add(res);
-                }
-            }
-        }
-        result = new IResource[resources.size()];
-        resources.toArray(result);
-        return result;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/NavigatorDropAdapter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/NavigatorDropAdapter.java
deleted file mode 100644
index fb80eae..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/NavigatorDropAdapter.java
+++ /dev/null
@@ -1,422 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.CopyFilesAndFoldersOperation;
-import org.eclipse.ui.actions.MoveFilesAndFoldersOperation;
-import org.eclipse.ui.actions.ReadOnlyStateChecker;
-import org.eclipse.ui.dialogs.IOverwriteQuery;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-import org.eclipse.ui.part.PluginDropAdapter;
-import org.eclipse.ui.part.ResourceTransfer;
-
-/**
- * Implements drop behaviour for drag and drop operations
- * that land on the resource navigator.
- * 
- * @since 2.0
- */
-public class NavigatorDropAdapter extends PluginDropAdapter implements
-        IOverwriteQuery {
-
-    /**
-     * A flag indicating that overwrites should always occur.
-     */
-    private boolean alwaysOverwrite = false;
-
-    /**
-     * The last valid operation.
-     */
-    private int lastValidOperation = DND.DROP_NONE;
-
-    /**
-     * Constructs a new drop adapter.
-     * 
-     * @param viewer the navigator's viewer
-     */
-    public NavigatorDropAdapter(StructuredViewer viewer) {
-        super(viewer);
-    }
-
-    /*
-     * @see org.eclipse.swt.dnd.DropTargetListener#dragEnter(org.eclipse.swt.dnd.DropTargetEvent)
-     */
-    public void dragEnter(DropTargetEvent event) {
-        if (FileTransfer.getInstance().isSupportedType(event.currentDataType)
-                && event.detail == DND.DROP_DEFAULT) {
-            // default to copy when dragging from outside Eclipse. Fixes bug 16308.
-            event.detail = DND.DROP_COPY;
-        }
-        super.dragEnter(event);
-    }
-
-    /**
-     * Returns an error status with the given info.
-     */
-    private IStatus error(String message) {
-        return error(message, null);
-    }
-
-    /**
-     * Returns an error status with the given info.
-     */
-    private IStatus error(String message, Throwable exception) {
-        return new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0, message,
-                exception);
-    }
-
-    /**
-     * Returns the actual target of the drop, given the resource
-     * under the mouse.  If the mouse target is a file, then the drop actually 
-     * occurs in its parent.  If the drop location is before or after the
-     * mouse target and feedback is enabled, the target is also the parent.
-     */
-    private IContainer getActualTarget(IResource mouseTarget) {
-        /* if cursor is before or after mouseTarget, set target to parent */
-        if (getFeedbackEnabled()) {
-            if (getCurrentLocation() == LOCATION_BEFORE
-                    || getCurrentLocation() == LOCATION_AFTER) {
-                return mouseTarget.getParent();
-            }
-        }
-        /* if cursor is on a file, return the parent */
-        if (mouseTarget.getType() == IResource.FILE) {
-            return mouseTarget.getParent();
-        }
-        /* otherwise the mouseTarget is the real target */
-        return (IContainer) mouseTarget;
-    }
-
-    /**
-     * Returns the display
-     */
-    private Display getDisplay() {
-        return getViewer().getControl().getDisplay();
-    }
-
-    /**
-     * Returns the resource selection from the LocalSelectionTransfer.
-     * 
-     * @return the resource selection from the LocalSelectionTransfer
-     */
-    private IResource[] getSelectedResources() {
-        ArrayList selectedResources = new ArrayList();
-
-        ISelection selection = LocalSelectionTransfer.getInstance()
-                .getSelection();
-        if (selection instanceof IStructuredSelection) {
-            IStructuredSelection ssel = (IStructuredSelection) selection;
-            for (Iterator i = ssel.iterator(); i.hasNext();) {
-                Object o = i.next();
-                if (o instanceof IResource) {
-                    selectedResources.add(o);
-                }
-                else if (o instanceof IAdaptable) {
-                    IAdaptable a = (IAdaptable) o;
-                    IResource r = (IResource) a.getAdapter(IResource.class);
-                    if (r != null) {
-                        selectedResources.add(r);
-                    }
-                }
-            }
-        }
-        return (IResource[]) selectedResources.toArray(new IResource[selectedResources.size()]);
-    }
-
-    /**
-     * Returns the shell
-     */
-    private Shell getShell() {
-        return getViewer().getControl().getShell();
-    }
-
-    /**
-     * Returns an error status with the given info.
-     */
-    private IStatus info(String message) {
-        return new Status(IStatus.INFO, PlatformUI.PLUGIN_ID, 0, message, null);
-    }
-
-    /**
-     * Adds the given status to the list of problems.  Discards
-     * OK statuses.  If the status is a multi-status, only its children
-     * are added.
-     */
-    private void mergeStatus(MultiStatus status, IStatus toMerge) {
-        if (!toMerge.isOK()) {
-            status.merge(toMerge);
-        }
-    }
-
-    /**
-     * Returns an status indicating success.
-     */
-    private IStatus ok() {
-        return new Status(IStatus.OK, PlatformUI.PLUGIN_ID, 0,
-                ResourceNavigatorMessages.DropAdapter_ok, null);
-    }
-
-    /**
-     * Opens an error dialog if necessary.  Takes care of
-     * complex rules necessary for making the error dialog look nice.
-     */
-    private void openError(IStatus status) {
-        if (status == null) {
-			return;
-		}
-
-        String genericTitle = ResourceNavigatorMessages.DropAdapter_title;
-        int codes = IStatus.ERROR | IStatus.WARNING;
-
-        //simple case: one error, not a multistatus
-        if (!status.isMultiStatus()) {
-            ErrorDialog
-                    .openError(getShell(), genericTitle, null, status, codes);
-            return;
-        }
-
-        //one error, single child of multistatus
-        IStatus[] children = status.getChildren();
-        if (children.length == 1) {
-            ErrorDialog.openError(getShell(), status.getMessage(), null,
-                    children[0], codes);
-            return;
-        }
-        //several problems
-        ErrorDialog.openError(getShell(), genericTitle, null, status, codes);
-    }
-
-    /**
-     * Perform the drop.
-     * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
-     */
-    public boolean performDrop(final Object data) {
-        alwaysOverwrite = false;
-        if (getCurrentTarget() == null || data == null) {
-            return false;
-        }
-        boolean result = false;
-        IStatus status = null;
-        IResource[] resources = null;
-        TransferData currentTransfer = getCurrentTransfer();
-        if (LocalSelectionTransfer.getInstance().isSupportedType(
-                currentTransfer)) {
-            resources = getSelectedResources();
-        } else if (ResourceTransfer.getInstance().isSupportedType(
-                currentTransfer)) {
-            resources = (IResource[]) data;
-        } else if (FileTransfer.getInstance().isSupportedType(currentTransfer)) {
-            status = performFileDrop(data);
-            result = status.isOK();
-        } else {
-            result = NavigatorDropAdapter.super.performDrop(data);
-        }
-        if (resources != null && resources.length > 0) {
-            if (getCurrentOperation() == DND.DROP_COPY) {
-				status = performResourceCopy(getShell(), resources);
-			} else {
-				status = performResourceMove(resources);
-			}
-        }
-        openError(status);
-        return result;
-    }
-
-    /**
-     * Performs a drop using the FileTransfer transfer type.
-     */
-    private IStatus performFileDrop(Object data) {
-        MultiStatus problems = new MultiStatus(PlatformUI.PLUGIN_ID, 0,
-                ResourceNavigatorMessages.DropAdapter_problemImporting, null);
-        mergeStatus(problems, validateTarget(getCurrentTarget(),
-                getCurrentTransfer()));
-
-        final IContainer target = getActualTarget((IResource) getCurrentTarget());
-        final String[] names = (String[]) data;
-        // Run the import operation asynchronously. 
-        // Otherwise the drag source (e.g., Windows Explorer) will be blocked 
-        // while the operation executes. Fixes bug 16478.
-        Display.getCurrent().asyncExec(new Runnable() {
-            public void run() {
-                getShell().forceActive();
-                CopyFilesAndFoldersOperation operation = new CopyFilesAndFoldersOperation(
-                        getShell());
-                operation.copyFiles(names, target);
-            }
-        });
-        return problems;
-    }
-
-    /**
-     * Performs a resource copy
-     */
-    private IStatus performResourceCopy(Shell shell, IResource[] sources) {
-        MultiStatus problems = new MultiStatus(PlatformUI.PLUGIN_ID, 1,
-                ResourceNavigatorMessages.DropAdapter_problemsMoving, null);
-        mergeStatus(problems, validateTarget(getCurrentTarget(),
-                getCurrentTransfer()));
-
-        IContainer target = getActualTarget((IResource) getCurrentTarget());
-        CopyFilesAndFoldersOperation operation = new CopyFilesAndFoldersOperation(
-                shell);
-        operation.copyResources(sources, target);
-
-        return problems;
-    }
-
-    /**
-     * Performs a resource move
-     */
-    private IStatus performResourceMove(IResource[] sources) {
-        MultiStatus problems = new MultiStatus(PlatformUI.PLUGIN_ID, 1,
-                ResourceNavigatorMessages.DropAdapter_problemsMoving, null);
-        mergeStatus(problems, validateTarget(getCurrentTarget(),
-                getCurrentTransfer()));
-
-        IContainer target = getActualTarget((IResource) getCurrentTarget());
-        ReadOnlyStateChecker checker = new ReadOnlyStateChecker(
-                getShell(),
-                ResourceNavigatorMessages.MoveResourceAction_title,
-                ResourceNavigatorMessages.MoveResourceAction_checkMoveMessage);
-        sources = checker.checkReadOnlyResources(sources);
-        MoveFilesAndFoldersOperation operation = new MoveFilesAndFoldersOperation(
-                getShell());
-        operation.copyResources(sources, target);
-
-        return problems;
-    }
-
-    /*
-     * @see org.eclipse.ui.dialogs.IOverwriteQuery#queryOverwrite(java.lang.String)
-     */
-    public String queryOverwrite(String pathString) {
-        if (alwaysOverwrite) {
-			return ALL;
-		}
-
-        final String returnCode[] = { CANCEL };
-        final String msg = NLS.bind(ResourceNavigatorMessages.DropAdapter_overwriteQuery, pathString);
-        final String[] options = { IDialogConstants.YES_LABEL,
-                IDialogConstants.YES_TO_ALL_LABEL, IDialogConstants.NO_LABEL,
-                IDialogConstants.CANCEL_LABEL };
-        getDisplay().syncExec(new Runnable() {
-            public void run() {
-                MessageDialog dialog = new MessageDialog(
-                        getShell(),
-                        ResourceNavigatorMessages.DropAdapter_question, null, msg, MessageDialog.QUESTION, options, 0);
-                dialog.open();
-                int returnVal = dialog.getReturnCode();
-                String[] returnCodes = { YES, ALL, NO, CANCEL };
-                returnCode[0] = returnVal < 0 ? CANCEL : returnCodes[returnVal];
-            }
-        });
-        if (returnCode[0] == ALL) {
-			alwaysOverwrite = true;
-		}
-        return returnCode[0];
-    }
-
-    /**
-     * This method is used to notify the action that some aspect of
-     * the drop operation has changed.
-     */
-    public boolean validateDrop(Object target, int dragOperation,
-            TransferData transferType) {
-
-        if (dragOperation != DND.DROP_NONE) {
-            lastValidOperation = dragOperation;
-        }
-        if (FileTransfer.getInstance().isSupportedType(transferType)
-                && lastValidOperation != DND.DROP_COPY) {
-            // only allow copying when dragging from outside Eclipse
-            return false;
-        }
-        if (super.validateDrop(target, dragOperation, transferType)) {
-            return true;
-        }
-        return validateTarget(target, transferType).isOK();
-    }
-
-    /**
-     * Ensures that the drop target meets certain criteria
-     */
-    private IStatus validateTarget(Object target, TransferData transferType) {
-        if (!(target instanceof IResource)) {
-            return info(ResourceNavigatorMessages.DropAdapter_targetMustBeResource);
-        }
-        IResource resource = (IResource) target;
-        if (!resource.isAccessible()) {
-            return error(ResourceNavigatorMessages.DropAdapter_canNotDropIntoClosedProject);
-        }
-        IContainer destination = getActualTarget(resource);
-        if (destination.getType() == IResource.ROOT) {
-            return error(ResourceNavigatorMessages.DropAdapter_resourcesCanNotBeSiblings);
-        }
-        String message = null;
-        // drag within Eclipse?
-        if (LocalSelectionTransfer.getInstance().isSupportedType(transferType)) {
-            IResource[] selectedResources = getSelectedResources();
-
-            if (selectedResources.length == 0) {
-				message = ResourceNavigatorMessages.DropAdapter_dropOperationErrorOther;
-			} else {
-                CopyFilesAndFoldersOperation operation;
-                if (lastValidOperation == DND.DROP_COPY) {
-                    operation = new CopyFilesAndFoldersOperation(getShell());
-                } else {
-                    operation = new MoveFilesAndFoldersOperation(getShell());
-                }
-                message = operation.validateDestination(destination,
-                        selectedResources);
-            }
-        } // file import?
-        else if (FileTransfer.getInstance().isSupportedType(transferType)) {
-            String[] sourceNames = (String[]) FileTransfer.getInstance()
-                    .nativeToJava(transferType);
-            if (sourceNames == null) {
-                // source names will be null on Linux. Use empty names to do destination validation.
-                // Fixes bug 29778
-                sourceNames = new String[0];
-            }
-            CopyFilesAndFoldersOperation copyOperation = new CopyFilesAndFoldersOperation(
-                    getShell());
-            message = copyOperation.validateImportDestination(destination,
-                    sourceNames);
-        }
-        if (message != null) {
-            return error(message);
-        }
-        return ok();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/NavigatorFrameSource.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/NavigatorFrameSource.java
deleted file mode 100644
index 8b0bff5..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/NavigatorFrameSource.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-import org.eclipse.ui.views.framelist.TreeFrame;
-import org.eclipse.ui.views.framelist.TreeViewerFrameSource;
-
-/**
- * Frame source for the resource navigator.
- */
-public class NavigatorFrameSource extends TreeViewerFrameSource {
-
-    private ResourceNavigator navigator;
-
-    /**
-     * Constructs a new frame source for the specified resource navigator.
-     * 
-     * @param navigator the resource navigator
-     */
-    public NavigatorFrameSource(ResourceNavigator navigator) {
-        super(navigator.getTreeViewer());
-        this.navigator = navigator;
-    }
-
-    /**
-     * Returns a new frame.  This implementation extends the super implementation
-     * by setting the frame's tool tip text to show the full path for the input
-     * element.
-     */
-    protected TreeFrame createFrame(Object input) {
-        TreeFrame frame = super.createFrame(input);
-        frame.setName(navigator.getFrameName(input));
-        frame.setToolTipText(navigator.getFrameToolTipText(input));
-        return frame;
-    }
-
-    /**
-     * Also updates the navigator's title.
-     */
-    protected void frameChanged(TreeFrame frame) {
-        IResource resource = (IResource) frame.getInput();
-        IProject project = resource.getProject();
-
-        if (project != null && project.isOpen() == false) {
-            MessageDialog
-                    .openInformation(
-                            navigator.getViewSite().getShell(),
-                            ResourceNavigatorMessages.NavigatorFrameSource_closedProject_title,
-                            NLS.bind(ResourceNavigatorMessages.NavigatorFrameSource_closedProject_message, project.getName()));
-            navigator.getFrameList().back();
-        } else {
-            super.frameChanged(frame);
-            navigator.updateTitle();
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/OpenActionGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/OpenActionGroup.java
deleted file mode 100644
index 91ac4e9..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/OpenActionGroup.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.OpenFileAction;
-import org.eclipse.ui.actions.OpenInNewWindowAction;
-import org.eclipse.ui.actions.OpenWithMenu;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-
-/**
- * This is the action group for the open actions.
- */
-public class OpenActionGroup extends ResourceNavigatorActionGroup {
-
-    private OpenFileAction openFileAction;
-
-    /**
-     * The id for the Open With submenu.
-     */
-    public static final String OPEN_WITH_ID = PlatformUI.PLUGIN_ID
-            + ".OpenWithSubMenu"; //$NON-NLS-1$
-
-	/**
-	 * Creates a new action group for open actions.
-	 * 
-	 * @param navigator the resource navigator
-	 */
-    public OpenActionGroup(IResourceNavigator navigator) {
-        super(navigator);
-    }
-
-    protected void makeActions() {
-        openFileAction = new OpenFileAction(navigator.getSite().getPage());
-    }
-
-    public void fillContextMenu(IMenuManager menu) {
-        IStructuredSelection selection = (IStructuredSelection) getContext()
-                .getSelection();
-
-        boolean anyResourceSelected = !selection.isEmpty()
-                && ResourceSelectionUtil.allResourcesAreOfType(selection,
-                        IResource.PROJECT | IResource.FOLDER | IResource.FILE);
-        boolean onlyFilesSelected = !selection.isEmpty()
-                && ResourceSelectionUtil.allResourcesAreOfType(selection,
-                        IResource.FILE);
-
-        if (onlyFilesSelected) {
-            openFileAction.selectionChanged(selection);
-            menu.add(openFileAction);
-            fillOpenWithMenu(menu, selection);
-        }
-
-        if (anyResourceSelected) {
-            addNewWindowAction(menu, selection);
-        }
-    }
-
-    /**
-     * Adds the OpenWith submenu to the context menu.
-     * 
-     * @param menu the context menu
-     * @param selection the current selection
-     */
-    private void fillOpenWithMenu(IMenuManager menu,
-            IStructuredSelection selection) {
-
-        // Only supported if exactly one file is selected.
-        if (selection.size() != 1) {
-			return;
-		}
-        Object element = selection.getFirstElement();
-        if (!(element instanceof IFile)) {
-			return;
-		}
-
-        MenuManager submenu = new MenuManager(ResourceNavigatorMessages.ResourceNavigator_openWith, OPEN_WITH_ID);
-        submenu.add(new OpenWithMenu(navigator.getSite().getPage(),
-                (IFile) element));
-        menu.add(submenu);
-    }
-
-    /**
-     * Adds the Open in New Window action to the context menu.
-     * 
-     * @param menu the context menu
-     * @param selection the current selection
-     */
-    private void addNewWindowAction(IMenuManager menu,
-            IStructuredSelection selection) {
-
-        // Only supported if exactly one container (i.e open project or folder) is selected.
-        if (selection.size() != 1) {
-			return;
-		}
-        Object element = selection.getFirstElement();
-        if (!(element instanceof IContainer)) {
-			return;
-		}
-        if (element instanceof IProject && !(((IProject) element).isOpen())) {
-			return;
-		}
-
-        menu.add(new OpenInNewWindowAction(navigator.getSite()
-                .getWorkbenchWindow(), (IContainer) element));
-    }
-
-    /**
-     * Runs the default action (open file).
-     */
-    public void runDefaultAction(IStructuredSelection selection) {
-        Object element = selection.getFirstElement();
-        if (element instanceof IFile) {
-            openFileAction.selectionChanged(selection);
-            openFileAction.run();
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/PasteAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/PasteAction.java
deleted file mode 100644
index 2d3f8a8..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/PasteAction.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.CopyFilesAndFoldersOperation;
-import org.eclipse.ui.actions.CopyProjectOperation;
-import org.eclipse.ui.actions.SelectionListenerAction;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-import org.eclipse.ui.part.ResourceTransfer;
-
-/**
- * Standard action for pasting resources on the clipboard to the selected resource's location.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @since 2.0
- */
-/*package*/class PasteAction extends SelectionListenerAction {
-
-    /**
-     * The id of this action.
-     */
-    public static final String ID = PlatformUI.PLUGIN_ID + ".PasteAction";//$NON-NLS-1$
-
-    /**
-     * The shell in which to show any dialogs.
-     */
-    private Shell shell;
-
-    /**
-     * System clipboard
-     */
-    private Clipboard clipboard;
-
-    /**
-     * Creates a new action.
-     *
-     * @param shell the shell for any dialogs
-     * @param clipboard the clipboard
-     */
-    public PasteAction(Shell shell, Clipboard clipboard) {
-        super(ResourceNavigatorMessages.PasteAction_title);
-        Assert.isNotNull(shell);
-        Assert.isNotNull(clipboard);
-        this.shell = shell;
-        this.clipboard = clipboard;
-        setToolTipText(ResourceNavigatorMessages.PasteAction_toolTip);
-        setId(PasteAction.ID);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				INavigatorHelpContextIds.PASTE_ACTION);
-    }
-
-    /**
-     * Returns the actual target of the paste action. Returns null
-     * if no valid target is selected.
-     * 
-     * @return the actual target of the paste action
-     */
-    private IResource getTarget() {
-        List selectedResources = getSelectedResources();
-
-        for (int i = 0; i < selectedResources.size(); i++) {
-            IResource resource = (IResource) selectedResources.get(i);
-
-            if (resource instanceof IProject && !((IProject) resource).isOpen()) {
-				return null;
-			}
-            if (resource.getType() == IResource.FILE) {
-				resource = resource.getParent();
-			}
-            if (resource != null) {
-				return resource;
-			}
-        }
-        return null;
-    }
-
-    /**
-     * Returns whether any of the given resources are linked resources.
-     * 
-     * @param resources resource to check for linked type. may be null
-     * @return true=one or more resources are linked. false=none of the 
-     * 	resources are linked
-     */
-    private boolean isLinked(IResource[] resources) {
-        for (int i = 0; i < resources.length; i++) {
-            if (resources[i].isLinked()) {
-				return true;
-			}
-        }
-        return false;
-    }
-
-    /**
-     * Implementation of method defined on <code>IAction</code>.
-     */
-    public void run() {
-        // try a resource transfer
-        ResourceTransfer resTransfer = ResourceTransfer.getInstance();
-        IResource[] resourceData = (IResource[]) clipboard
-                .getContents(resTransfer);
-
-        if (resourceData != null && resourceData.length > 0) {
-            if (resourceData[0].getType() == IResource.PROJECT) {
-                // enablement checks for all projects
-                for (int i = 0; i < resourceData.length; i++) {
-                    CopyProjectOperation operation = new CopyProjectOperation(
-                            this.shell);
-                    operation.copyProject((IProject) resourceData[i]);
-                }
-            } else {
-                // enablement should ensure that we always have access to a container
-                IContainer container = getContainer();
-
-                CopyFilesAndFoldersOperation operation = new CopyFilesAndFoldersOperation(
-                        this.shell);
-                operation.copyResources(resourceData, container);
-            }
-            return;
-        }
-
-        // try a file transfer
-        FileTransfer fileTransfer = FileTransfer.getInstance();
-        String[] fileData = (String[]) clipboard.getContents(fileTransfer);
-
-        if (fileData != null) {
-            // enablement should ensure that we always have access to a container
-            IContainer container = getContainer();
-
-            CopyFilesAndFoldersOperation operation = new CopyFilesAndFoldersOperation(
-                    this.shell);
-            operation.copyFiles(fileData, container);
-        }
-    }
-
-    /**
-     * Returns the container to hold the pasted resources.
-     */
-    private IContainer getContainer() {
-        List selection = getSelectedResources();
-        if (selection.get(0) instanceof IFile) {
-			return ((IFile) selection.get(0)).getParent();
-		} else {
-			return (IContainer) selection.get(0);
-		}
-    }
-
-    /**
-     * The <code>PasteAction</code> implementation of this
-     * <code>SelectionListenerAction</code> method enables this action if 
-     * a resource compatible with what is on the clipboard is selected.
-     * 
-     * -Clipboard must have IResource or java.io.File
-     * -Projects can always be pasted if they are open
-     * -Workspace folder may not be copied into itself
-     * -Files and folders may be pasted to a single selected folder in open 
-     * 	project or multiple selected files in the same folder 
-     */
-    protected boolean updateSelection(IStructuredSelection selection) {
-        if (!super.updateSelection(selection)) {
-			return false;
-		}
-
-        final IResource[][] clipboardData = new IResource[1][];
-        shell.getDisplay().syncExec(new Runnable() {
-            public void run() {
-                // clipboard must have resources or files
-                ResourceTransfer resTransfer = ResourceTransfer.getInstance();
-                clipboardData[0] = (IResource[]) clipboard
-                        .getContents(resTransfer);
-            }
-        });
-        IResource[] resourceData = clipboardData[0];
-        boolean isProjectRes = resourceData != null && resourceData.length > 0
-                && resourceData[0].getType() == IResource.PROJECT;
-
-        if (isProjectRes) {
-            for (int i = 0; i < resourceData.length; i++) {
-                // make sure all resource data are open projects
-                // can paste open projects regardless of selection
-                if (resourceData[i].getType() != IResource.PROJECT
-                        || ((IProject) resourceData[i]).isOpen() == false) {
-					return false;
-				}
-            }
-            return true;
-        }
-
-        if (getSelectedNonResources().size() > 0) {
-			return false;
-		}
-
-        IResource targetResource = getTarget();
-        // targetResource is null if no valid target is selected (e.g., open project) 
-        // or selection is empty	
-        if (targetResource == null) {
-			return false;
-		}
-
-        // can paste files and folders to a single selection (file, folder, 
-        // open project) or multiple file selection with the same parent
-        List selectedResources = getSelectedResources();
-        if (selectedResources.size() > 1) {
-            for (int i = 0; i < selectedResources.size(); i++) {
-                IResource resource = (IResource) selectedResources.get(i);
-                if (resource.getType() != IResource.FILE) {
-					return false;
-				}
-                if (!targetResource.equals(resource.getParent())) {
-					return false;
-				}
-            }
-        }
-        if (resourceData != null) {
-            // linked resources can only be pasted into projects
-            if (isLinked(resourceData)
-                    && targetResource.getType() != IResource.PROJECT
-                    && targetResource.getType() != IResource.FOLDER) {
-				return false;
-			}
-
-            if (targetResource.getType() == IResource.FOLDER) {
-                // don't try to copy folder to self
-                for (int i = 0; i < resourceData.length; i++) {
-                    if (targetResource.equals(resourceData[i])) {
-						return false;
-					}
-                }
-            }
-            return true;
-        }
-        TransferData[] transfers = clipboard.getAvailableTypes();
-        FileTransfer fileTransfer = FileTransfer.getInstance();
-        for (int i = 0; i < transfers.length; i++) {
-            if (fileTransfer.isSupportedType(transfers[i])) {
-				return true;
-			}
-        }
-        return false;
-    }
-}
-
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/RefactorActionGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/RefactorActionGroup.java
deleted file mode 100644
index d76dcf7..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/RefactorActionGroup.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - Images for menu items (27481)
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.DeleteResourceAction;
-import org.eclipse.ui.actions.TextActionHandler;
-
-/**
- * This is the action group for refactor actions,
- * including global action handlers for copy, paste and delete.
- * 
- * @since 2.0
- */
-public class RefactorActionGroup extends ResourceNavigatorActionGroup {
-
-    private Clipboard clipboard;
-
-    private CopyAction copyAction;
-
-    private DeleteResourceAction deleteAction;
-
-    private PasteAction pasteAction;
-
-    private ResourceNavigatorRenameAction renameAction;
-
-    private ResourceNavigatorMoveAction moveAction;
-
-    private TextActionHandler textActionHandler;
-
-    public RefactorActionGroup(IResourceNavigator navigator) {
-        super(navigator);
-    }
-
-    public void dispose() {
-        if (clipboard != null) {
-            clipboard.dispose();
-            clipboard = null;
-        }
-        super.dispose();
-    }
-
-    public void fillContextMenu(IMenuManager menu) {
-        IStructuredSelection selection = (IStructuredSelection) getContext()
-                .getSelection();
-
-        boolean anyResourceSelected = !selection.isEmpty()
-                && ResourceSelectionUtil.allResourcesAreOfType(selection,
-                        IResource.PROJECT | IResource.FOLDER | IResource.FILE);
-
-        copyAction.selectionChanged(selection);
-        menu.add(copyAction);
-        pasteAction.selectionChanged(selection);
-        menu.add(pasteAction);
-
-        if (anyResourceSelected) {
-            deleteAction.selectionChanged(selection);
-            menu.add(deleteAction);
-            moveAction.selectionChanged(selection);
-            menu.add(moveAction);
-            renameAction.selectionChanged(selection);
-            menu.add(renameAction);
-        }
-    }
-
-    public void fillActionBars(IActionBars actionBars) {
-        textActionHandler = new TextActionHandler(actionBars); // hooks handlers
-        textActionHandler.setCopyAction(copyAction);
-        textActionHandler.setPasteAction(pasteAction);
-        textActionHandler.setDeleteAction(deleteAction);
-        renameAction.setTextActionHandler(textActionHandler);
-
-        actionBars.setGlobalActionHandler(ActionFactory.MOVE.getId(),
-                moveAction);
-        actionBars.setGlobalActionHandler(ActionFactory.RENAME.getId(),
-                renameAction);
-    }
-
-    /**
-     * Handles a key pressed event by invoking the appropriate action.
-     */
-    public void handleKeyPressed(KeyEvent event) {
-        if (event.character == SWT.DEL && event.stateMask == 0) {
-            if (deleteAction.isEnabled()) {
-                deleteAction.run();
-            }
-
-            // Swallow the event.
-            event.doit = false;
-
-        } else if (event.keyCode == SWT.F2 && event.stateMask == 0) {
-            if (renameAction.isEnabled()) {
-                renameAction.run();
-            }
-
-            // Swallow the event.
-            event.doit = false;
-        }
-    }
-
-    protected void makeActions() {
-        TreeViewer treeViewer = navigator.getViewer();
-        IShellProvider provider = navigator.getSite();
-        clipboard = new Clipboard(provider.getShell().getDisplay());
-
-        pasteAction = new PasteAction(provider.getShell(), clipboard);
-        ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
-        pasteAction.setDisabledImageDescriptor(images
-                .getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED));
-        pasteAction.setImageDescriptor(images
-                .getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
-
-        copyAction = new CopyAction(provider.getShell(), clipboard, pasteAction);
-        copyAction.setDisabledImageDescriptor(images
-                .getImageDescriptor(ISharedImages.IMG_TOOL_COPY_DISABLED));
-        copyAction.setImageDescriptor(images
-                .getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
-
-        moveAction = new ResourceNavigatorMoveAction(provider.getShell(), treeViewer);
-        renameAction = new ResourceNavigatorRenameAction(provider.getShell(), treeViewer);
-
-        deleteAction = new DeleteResourceAction(provider);
-        deleteAction.setDisabledImageDescriptor(images
-                .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE_DISABLED));
-        deleteAction.setImageDescriptor(images
-                .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
-    }
-
-    public void updateActionBars() {
-        IStructuredSelection selection = (IStructuredSelection) getContext()
-                .getSelection();
-
-        copyAction.selectionChanged(selection);
-        pasteAction.selectionChanged(selection);
-        deleteAction.selectionChanged(selection);
-        moveAction.selectionChanged(selection);
-        renameAction.selectionChanged(selection);
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceComparator.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceComparator.java
deleted file mode 100644
index 3f0a9b1..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceComparator.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-
-/**
- * Comparator for viewers that display items of type <code>IResource</code>.
- * The sorter supports two sort criteria:
- * <p>
- * <code>NAME</code>: Folders are given order precedence, followed by files.
- * Within these two groups resources are ordered by name.  All name comparisons
- * are case-insensitive.
- * </p>
- * <p>
- * <code>TYPE</code>: Folders are given order precedence, followed by files.
- * Within these two groups resources are ordered by extension.  All extension
- * comparisons are case-insensitive.
- * </p>
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @since 3.3
- */
-public class ResourceComparator extends ViewerComparator {
-
-    /**
-     * Constructor argument value that indicates to sort items by name.
-     */
-    public final static int NAME = 1;
-
-    /**
-     * Constructor argument value that indicates to sort items by extension.
-     */
-    public final static int TYPE = 2;
-
-    private int criteria;
-
-    /**
-     * Creates a resource sorter that will use the given sort criteria.
-     *
-     * @param criteria the sort criterion to use: one of <code>NAME</code> or 
-     *   <code>TYPE</code>
-     */
-    public ResourceComparator(int criteria) {
-        super();
-        this.criteria = criteria;
-    }
-
-    /**
-     * Returns an integer value representing the relative sort priority of the 
-     * given element based on its class.
-     * <p>
-     * <ul>
-     *   <li>resources (<code>IResource</code>) - 2</li>
-     *   <li>project references (<code>ProjectReference</code>) - 1</li>
-     *   <li>everything else - 0</li>
-     * </ul>
-     * </p>
-     *
-     * @param element the element
-     * @return the sort priority (larger numbers means more important)
-     */
-    protected int classComparison(Object element) {
-        if (element instanceof IResource) {
-            return 2;
-        }
-        return 0;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ViewerComparator.
-     */
-    public int compare(Viewer viewer, Object o1, Object o2) {
-        //have to deal with non-resources in navigator
-        //if one or both objects are not resources, returned a comparison 
-        //based on class.
-        if (!(o1 instanceof IResource && o2 instanceof IResource)) {
-            return compareClass(o1, o2);
-        }
-        IResource r1 = (IResource) o1;
-        IResource r2 = (IResource) o2;
-
-        if (r1 instanceof IContainer && r2 instanceof IContainer) {
-			return compareNames(r1, r2);
-		} else if (r1 instanceof IContainer) {
-			return -1;
-		} else if (r2 instanceof IContainer) {
-			return 1;
-		} else if (criteria == NAME) {
-			return compareNames(r1, r2);
-		} else if (criteria == TYPE) {
-			return compareTypes(r1, r2);
-		} else {
-			return 0;
-		}
-    }
-
-    /**
-     * Returns a number reflecting the collation order of the given elements
-     * based on their class.
-     *
-     * @param element1 the first element to be ordered
-     * @param element2 the second element to be ordered
-     * @return a negative number if the first element is less  than the 
-     *  second element; the value <code>0</code> if the first element is
-     *  equal to the second element; and a positive number if the first
-     *  element is greater than the second element
-     */
-    protected int compareClass(Object element1, Object element2) {
-        return classComparison(element1) - classComparison(element2);
-    }
-
-    /**
-     * Returns a number reflecting the collation order of the given resources
-     * based on their resource names.
-     *
-     * @param resource1 the first resource element to be ordered
-     * @param resource2 the second resource element to be ordered
-     * @return a negative number if the first element is less  than the 
-     *  second element; the value <code>0</code> if the first element is
-     *  equal to the second element; and a positive number if the first
-     *  element is greater than the second element
-     */
-    protected int compareNames(IResource resource1, IResource resource2) {
-        return getComparator().compare(resource1.getName(), resource2.getName());
-    }
-
-    /**
-     * Returns a number reflecting the collation order of the given resources
-     * based on their respective file extensions. Resources with the same file
-     * extension will be collated based on their names.
-     *
-     * @param resource1 the first resource element to be ordered
-     * @param resource2 the second resource element to be ordered
-     * @return a negative number if the first element is less  than the 
-     *  second element; the value <code>0</code> if the first element is
-     *  equal to the second element; and a positive number if the first
-     *  element is greater than the second element
-     */
-    protected int compareTypes(IResource resource1, IResource resource2) {
-        String ext1 = getExtensionFor(resource1);
-        String ext2 = getExtensionFor(resource2);
-
-        // Compare extensions.  If they're different then return a value that
-        // indicates correct extension ordering.  If they're the same then
-        // return a value that indicates the correct NAME ordering.
-        int result = getComparator().compare(ext1, ext2);
-
-        if (result != 0) {
-			return result;
-		}
-
-        return compareNames(resource1, resource2);
-    }
-
-    /**
-     * Returns the sort criteria of this sorter.
-     *
-     * @return the sort criterion: one of <code>NAME</code> or <code>TYPE</code>
-     */
-    public int getCriteria() {
-        return criteria;
-    }
-
-    /**
-     * Returns the extension portion of the given resource.
-     *
-     * @param resource the resource
-     * @return the file extension, possibily the empty string
-     */
-    private String getExtensionFor(IResource resource) {
-        String ext = resource.getFileExtension();
-        return ext == null ? "" : ext; //$NON-NLS-1$
-    }
-
-    /**
-     * Sets the sort criteria of this sorter.
-     * 
-     * @param criteria the sort criterion: 
-     *	one of <code>ResourceSorter.NAME</code> or 
-     *	<code>ResourceSorter.TYPE</code>
-     */
-    public void setCriteria(int criteria) {
-        this.criteria = criteria;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigator.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigator.java
deleted file mode 100644
index bdccd25..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigator.java
+++ /dev/null
@@ -1,1576 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Benjamin Muskalla - bug 105041
- *     Remy Chi Jian Suen - bug 144102
- *******************************************************************************/
-
-package org.eclipse.ui.views.navigator;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.osgi.util.NLS;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.commands.ActionHandler;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.DecoratingLabelProvider;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.OpenEvent;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.viewers.ViewerSorter;
-
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.OpenAndLinkWithEditorHelper;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ResourceWorkingSetFilter;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.actions.OpenResourceAction;
-import org.eclipse.ui.handlers.CollapseAllHandler;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.ide.ResourceUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.ISetSelectionTarget;
-import org.eclipse.ui.part.IShowInSource;
-import org.eclipse.ui.part.IShowInTarget;
-import org.eclipse.ui.part.PluginTransfer;
-import org.eclipse.ui.part.ResourceTransfer;
-import org.eclipse.ui.part.ShowInContext;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.views.framelist.FrameList;
-import org.eclipse.ui.views.framelist.TreeFrame;
-
-/**
- * Implements the Resource Navigator view.
- */
-public class ResourceNavigator extends ViewPart implements ISetSelectionTarget,
-        IResourceNavigator {
-
-    private TreeViewer viewer;
-
-    private IDialogSettings settings;
-
-    private IMemento memento;
-
-    private FrameList frameList;
-
-    private ResourceNavigatorActionGroup actionGroup;
-
-    private ResourcePatternFilter patternFilter = new ResourcePatternFilter();
-
-    private ResourceWorkingSetFilter workingSetFilter = new ResourceWorkingSetFilter();
-
-    private boolean linkingEnabled;
-
-    private boolean dragDetected;
-
-    private Listener dragDetectListener;
-    /**
-     * Remembered working set.
-     */
-    private IWorkingSet workingSet;
-
-    /**
-	 * Marks whether the working set we're using is currently empty. In this
-	 * event we're effectively not using a working set.
-	 */
-    private boolean emptyWorkingSet = false;
-    
-    /**
-	 * Settings constant for section name (value <code>ResourceNavigator</code>).
-	 */
-    private static final String STORE_SECTION = "ResourceNavigator"; //$NON-NLS-1$
-
-    /**
-     * Settings constant for sort order (value <code>ResourceViewer.STORE_SORT_TYPE</code>).
-     */
-    private static final String STORE_SORT_TYPE = "ResourceViewer.STORE_SORT_TYPE"; //$NON-NLS-1$
-
-    /**
-     * Settings constant for working set (value <code>ResourceWorkingSetFilter.STORE_WORKING_SET</code>).
-     */
-    private static final String STORE_WORKING_SET = "ResourceWorkingSetFilter.STORE_WORKING_SET"; //$NON-NLS-1$
-
-    /**
-     * @deprecated No longer used but preserved to avoid an api change.
-     */
-    public static final String NAVIGATOR_VIEW_HELP_ID = INavigatorHelpContextIds.RESOURCE_VIEW;
-
-    /**
-     * True iff we've already scheduled an asynchronous call to linkToEditor
-     */
-    private boolean linkScheduled = false;
-    
-    // Persistance tags.
-    private static final String TAG_SORTER = "sorter"; //$NON-NLS-1$
-
-    private static final String TAG_FILTERS = "filters"; //$NON-NLS-1$
-
-    private static final String TAG_FILTER = "filter"; //$NON-NLS-1$
-
-    private static final String TAG_SELECTION = "selection"; //$NON-NLS-1$
-
-    private static final String TAG_EXPANDED = "expanded"; //$NON-NLS-1$
-
-    private static final String TAG_ELEMENT = "element"; //$NON-NLS-1$
-
-    private static final String TAG_IS_ENABLED = "isEnabled"; //$NON-NLS-1$
-
-    private static final String TAG_PATH = "path"; //$NON-NLS-1$
-
-    private static final String TAG_CURRENT_FRAME = "currentFrame"; //$NON-NLS-1$
-
-    private IPartListener partListener = new IPartListener() {
-        public void partActivated(IWorkbenchPart part) {
-            if (part instanceof IEditorPart) {
-				editorActivated((IEditorPart) part);
-			}
-        }
-
-        public void partBroughtToTop(IWorkbenchPart part) {
-            if (part instanceof IEditorPart) {
-				editorActivated((IEditorPart) part);
-			}
-        }
-
-        public void partClosed(IWorkbenchPart part) {
-        }
-
-        public void partDeactivated(IWorkbenchPart part) {
-        }
-
-        public void partOpened(IWorkbenchPart part) {
-        }
-    };
-
-    private IPropertyChangeListener propertyChangeListener = new IPropertyChangeListener() {
-        public void propertyChange(PropertyChangeEvent event) {
-            String property = event.getProperty();
-            Object newValue = event.getNewValue();
-            Object oldValue = event.getOldValue();
-           
-            if (IWorkingSetManager.CHANGE_WORKING_SET_REMOVE.equals(property)
-                    && oldValue == workingSet) {
-                setWorkingSet(null);
-            } else if (IWorkingSetManager.CHANGE_WORKING_SET_NAME_CHANGE
-                    .equals(property)
-                    && newValue == workingSet) {
-                updateTitle();
-            } else if (IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE
-                    .equals(property)
-                    && newValue == workingSet) {
-				if (workingSet.isAggregateWorkingSet() && workingSet.isEmpty()) {
-					// act as if the working set has been made null
-					if (!emptyWorkingSet) {
-						emptyWorkingSet = true;
-						workingSetFilter.setWorkingSet(null);
-					}
-				} else {
-					// we've gone from empty to non-empty on our set.
-					// Restore it.
-					if (emptyWorkingSet) {
-					    emptyWorkingSet = false;
-						workingSetFilter.setWorkingSet(workingSet);
-					}
-				}
-				getViewer().refresh();
-            }
-        }
-    };
-
-	private CollapseAllHandler collapseAllHandler;
-	
-	/**
-	 * Helper to open and activate editors.
-	 * 
-	 * @since 3.5
-	 */
-	private OpenAndLinkWithEditorHelper openAndLinkWithEditorHelper;
-
-
-    /**
-     * Constructs a new resource navigator view.
-     */
-    public ResourceNavigator() {
-        IDialogSettings viewsSettings = getPlugin().getDialogSettings();
-
-        settings = viewsSettings.getSection(STORE_SECTION);
-        if (settings == null) {
-            settings = viewsSettings.addNewSection(STORE_SECTION);
-        }
-
-        initLinkingEnabled();
-    }
-
-    /**
-     * Converts the given selection into a form usable by the viewer,
-     * where the elements are resources.
-     */
-    private StructuredSelection convertSelection(ISelection selection) {
-        ArrayList list = new ArrayList();
-        if (selection instanceof IStructuredSelection) {
-            IStructuredSelection ssel = (IStructuredSelection) selection;
-            for (Iterator i = ssel.iterator(); i.hasNext();) {
-                Object o = i.next();
-                IResource resource = null;
-                if (o instanceof IResource) {
-                    resource = (IResource) o;
-                } else {
-                    if (o instanceof IAdaptable) {
-                        resource = (IResource) ((IAdaptable) o)
-                                .getAdapter(IResource.class);
-                    }
-                }
-                if (resource != null) {
-                    list.add(resource);
-                }
-            }
-        }
-        return new StructuredSelection(list);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchPart.
-     */
-    public void createPartControl(Composite parent) {
-        TreeViewer viewer = createViewer(parent);
-        this.viewer = viewer;
-
-        if (memento != null) {
-            restoreFilters();
-            restoreLinkingEnabled();
-        }
-        frameList = createFrameList();
-        initDragAndDrop();
-        updateTitle();
-
-        initContextMenu();
-
-        initResourceComparator();
-        initWorkingSetFilter();
-
-        // make sure input is set after sorters and filters,
-        // to avoid unnecessary refreshes
-        viewer.setInput(getInitialInput());
-
-        // make actions after setting input, because some actions
-        // look at the viewer for enablement (e.g. the Up action)
-        makeActions();
-
-        // Fill the action bars and update the global action handlers'
-        // enabled state to match the current selection.
-        getActionGroup().fillActionBars(getViewSite().getActionBars());
-        updateActionBars((IStructuredSelection) viewer.getSelection());
-
-        getSite().setSelectionProvider(viewer);
-        getSite().getPage().addPartListener(partListener);
-        IWorkingSetManager workingSetManager = getPlugin().getWorkbench()
-                .getWorkingSetManager();
-        workingSetManager.addPropertyChangeListener(propertyChangeListener);
-
-        if (memento != null) {
-			restoreState(memento);
-		}
-        memento = null;
-
-        // Set help for the view
-        getSite().getWorkbenchWindow().getWorkbench().getHelpSystem().setHelp(
-				viewer.getControl(), getHelpContextId());
-    }
-
-    /**
-     * Returns the help context id to use for this view.
-     * 
-     * @since 2.0
-     */
-    protected String getHelpContextId() {
-        return INavigatorHelpContextIds.RESOURCE_VIEW;
-    }
-
-    /**
-     * Initializes and registers the context menu.
-     * 
-     * @since 2.0
-     */
-    protected void initContextMenu() {
-        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
-        menuMgr.setRemoveAllWhenShown(true);
-        menuMgr.addMenuListener(new IMenuListener() {
-            public void menuAboutToShow(IMenuManager manager) {
-                ResourceNavigator.this.fillContextMenu(manager);
-            }
-        });
-        TreeViewer viewer = getTreeViewer();
-        Menu menu = menuMgr.createContextMenu(viewer.getTree());
-        viewer.getTree().setMenu(menu);
-        getSite().registerContextMenu(menuMgr, viewer);
-    }
-
-    /**
-     * Creates the viewer.
-     * 
-     * @param parent the parent composite
-     * @since 2.0
-     */
-    protected TreeViewer createViewer(Composite parent) {
-        TreeViewer viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL
-                | SWT.V_SCROLL);
-        viewer.setUseHashlookup(true);
-        initContentProvider(viewer);
-        initLabelProvider(viewer);
-        initFilters(viewer);
-        initListeners(viewer);
-
-        return viewer;
-    }
-
-    /**
-     * Sets the content provider for the viewer.
-     * 
-     * @param viewer the viewer
-     * @since 2.0
-     */
-    protected void initContentProvider(TreeViewer viewer) {
-        viewer.setContentProvider(new WorkbenchContentProvider());
-    }
-
-    /**
-     * Sets the label provider for the viewer.
-     * 
-     * @param viewer the viewer
-     * @since 2.0
-     */
-    protected void initLabelProvider(TreeViewer viewer) {
-        viewer.setLabelProvider(new DecoratingLabelProvider(
-                new WorkbenchLabelProvider(), getPlugin().getWorkbench()
-                        .getDecoratorManager().getLabelDecorator()));
-    }
-
-    /**
-     * Adds the filters to the viewer.
-     * 
-     * @param viewer the viewer
-     * @since 2.0
-     */
-    protected void initFilters(TreeViewer viewer) {
-        viewer.addFilter(patternFilter);
-        viewer.addFilter(workingSetFilter);
-    }
-
-    /**
-     * Initializes the linking enabled setting from the preference store.
-     */
-    private void initLinkingEnabled() {
-        // Try the dialog settings first, which remember the last choice.
-        String setting = settings
-                .get(IWorkbenchPreferenceConstants.LINK_NAVIGATOR_TO_EDITOR);
-        if (setting != null) {
-            linkingEnabled = setting.equals("true"); //$NON-NLS-1$
-            return;
-        }
-        // If not in the dialog settings, check the preference store for the default setting.
-        // Use the UI plugin's preference store since this is a public preference.
-        linkingEnabled = PlatformUI.getPreferenceStore().getBoolean(
-                IWorkbenchPreferenceConstants.LINK_NAVIGATOR_TO_EDITOR);
-    }
-
-    /**
-     * Adds the listeners to the viewer.
-     * 
-     * @param viewer the viewer
-     * @since 2.0
-     */
-    protected void initListeners(final TreeViewer viewer) {
-        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-            public void selectionChanged(SelectionChangedEvent event) {
-                handleSelectionChanged(event);
-            }
-        });
-        viewer.addDoubleClickListener(new IDoubleClickListener() {
-            public void doubleClick(DoubleClickEvent event) {
-                handleDoubleClick(event);
-            }
-        });
-        
-		openAndLinkWithEditorHelper = new OpenAndLinkWithEditorHelper(viewer) {
-			protected void activate(ISelection selection) {
-				Object selectedElement = getSingleElement(selection);
-				if (selectedElement instanceof IFile) {
-					IEditorInput input = new FileEditorInput((IFile)selectedElement);
-					final IWorkbenchPage page = getSite().getPage();
-					IEditorPart editor = page.findEditor(input);
-					if (editor != null) {
-						page.activate(editor);
-					}
-				}
-				
-			}
-
-			protected void linkToEditor(ISelection selection) {
-		        if (!linkScheduled) {
-					// Ensure that if another selection change arrives while we're waiting for the *syncExec,
-					// we only do this work once.
-					linkScheduled = true;
-					getSite().getShell().getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							// There's no telling what might have changed since the syncExec was scheduled.
-							// Check to make sure that the widgets haven't been disposed.
-							linkScheduled = false;
-
-							if (viewer == null || viewer.getControl() == null || viewer.getControl().isDisposed()) {
-								return;
-							}
-
-							if (dragDetected == false) {
-								// only synchronize with editor when the selection is not the result
-								// of a drag. Fixes bug 22274.
-								ResourceNavigator.this.linkToEditor(viewer.getSelection());
-							}
-						}
-					});
-				}
-			}
-
-			protected void open(ISelection selection, boolean activate) {
-				handleOpen(selection);
-			}
-
-		};
-        
-
-        viewer.getControl().addKeyListener(new KeyListener() {
-            public void keyPressed(KeyEvent event) {
-                handleKeyPressed(event);
-            }
-
-            public void keyReleased(KeyEvent event) {
-                handleKeyReleased(event);
-            }
-        });
-        
-        openAndLinkWithEditorHelper.setLinkWithEditor(linkingEnabled);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchPart.
-     */
-    public void dispose() {
-        getSite().getPage().removePartListener(partListener);
-
-        IWorkingSetManager workingSetManager = getPlugin().getWorkbench()
-                .getWorkingSetManager();
-        workingSetManager.removePropertyChangeListener(propertyChangeListener);
-
-        if (collapseAllHandler != null) {
-			collapseAllHandler.dispose();
-		}
-        
-        if (getActionGroup() != null) {
-            getActionGroup().dispose();
-        }
-        Control control = viewer.getControl();
-        if (dragDetectListener != null && control != null
-                && control.isDisposed() == false) {
-            control.removeListener(SWT.DragDetect, dragDetectListener);
-        }
-        
-        super.dispose();
-    }
-
-    /**
-     * An editor has been activated.  Sets the selection in this navigator
-     * to be the editor's input, if linking is enabled.
-     * 
-     * @param editor the active editor
-     * @since 2.0
-     */
-    protected void editorActivated(IEditorPart editor) {
-        if (!isLinkingEnabled()) {
-            return;
-        }
-
-        IFile file = ResourceUtil.getFile(editor.getEditorInput());
-        if (file != null) {
-            ISelection newSelection = new StructuredSelection(file);
-            if (getTreeViewer().getSelection().equals(newSelection)) {
-                getTreeViewer().getTree().showSelection();
-            } else {
-                getTreeViewer().setSelection(newSelection, true);
-            }
-        }
-    }
-
-    /**
-     * Called when the context menu is about to open.
-     * Delegates to the action group using the viewer's selection as the action context.
-     * @since 2.0
-     */
-    protected void fillContextMenu(IMenuManager menu) {
-        IStructuredSelection selection = (IStructuredSelection) getViewer()
-                .getSelection();
-        getActionGroup().setContext(new ActionContext(selection));
-        getActionGroup().fillContextMenu(menu);
-    }
-
-    /*
-     * @see IResourceNavigatorPart
-     * @since 2.0
-     */
-    public FrameList getFrameList() {
-        return frameList;
-    }
-
-    /**
-     * Returns the initial input for the viewer.
-     * Tries to convert the page input to a resource, either directly or via IAdaptable.
-     * If the resource is a container, it uses that.
-     * If the resource is a file, it uses its parent folder.
-     * If a resource could not be obtained, it uses the workspace root.
-     * 
-     * @since 2.0
-     */
-    protected IAdaptable getInitialInput() {
-        IAdaptable input = getSite().getPage().getInput();
-        if (input != null) {
-            IResource resource = null;
-            if (input instanceof IResource) {
-                resource = (IResource) input;
-            } else {
-                resource = (IResource) input.getAdapter(IResource.class);
-            }
-            if (resource != null) {
-                switch (resource.getType()) {
-                case IResource.FILE:
-                    return resource.getParent();
-                case IResource.FOLDER:
-                case IResource.PROJECT:
-                case IResource.ROOT:
-                    return resource;
-                default:
-                    // Unknown resource type.  Fall through.
-                    break;
-                }
-            }
-        }
-        return ResourcesPlugin.getWorkspace().getRoot();
-    }
-
-    /**
-     * Returns the pattern filter for this view.
-     *
-     * @return the pattern filter
-     * @since 2.0
-     */
-    public ResourcePatternFilter getPatternFilter() {
-        return this.patternFilter;
-    }
-
-    /**
-     * Returns the working set for this view.
-     *
-     * @return the working set
-     * @since 2.0
-     */
-    public IWorkingSet getWorkingSet() {
-        return workingSetFilter.getWorkingSet();
-    }
-
-    /**
-     * Returns the navigator's plugin.
-     * @return the UI plugin for this bundle
-     */
-    public AbstractUIPlugin getPlugin() {
-        return IDEWorkbenchPlugin.getDefault();
-    }
-
-    /**
-	 * Return the sorter. If a comparator was set using
-	 * {@link #setComparator(ResourceComparator)}, this method will return
-	 * <code>null</code>.
-	 * 
-	 * @since 2.0
-	 * @deprecated as of 3.3, use {@link ResourceNavigator#getComparator()}
-	 */
-    public ResourceSorter getSorter() {
-        ViewerSorter sorter = getTreeViewer().getSorter();
-        if (sorter instanceof ResourceSorter) {
-        	return (ResourceSorter) sorter;
-        }
-        return null;
-    }
-
-    /**
-     * Returns the comparator.  If a sorter was set using
-	 * {@link #setSorter(ResourceSorter)}, this method will return
-	 * <code>null</code>.
-     * 
-     * @return the <code>ResourceComparator</code>
-     * @since 3.3
-     */
-
-    public ResourceComparator getComparator(){
-    	ViewerComparator comparator = getTreeViewer().getComparator();
-    	if (comparator instanceof ResourceComparator) {
-    		return (ResourceComparator) comparator;
-    	}
-    	return null;
-    }
-    /**
-     * Returns the resource viewer which shows the resource hierarchy.
-     * @since 2.0
-     */
-    public TreeViewer getViewer() {
-        return viewer;
-    }
-
-    /**
-     * Returns the tree viewer which shows the resource hierarchy.
-     * @return the tree viewer
-     * @since 2.0
-     */
-    public TreeViewer getTreeViewer() {
-        return viewer;
-    }
-
-    /**
-     * Returns the shell to use for opening dialogs.
-     * Used in this class, and in the actions.
-     * 
-     * @return the shell
-     * @deprecated use getViewSite().getShell()
-     */
-    public Shell getShell() {
-        return getViewSite().getShell();
-    }
-
-    /**
-     * Returns the message to show in the status line.
-     *
-     * @param selection the current selection
-     * @return the status line message
-     * @since 2.0
-     */
-    protected String getStatusLineMessage(IStructuredSelection selection) {
-        if (selection.size() == 1) {
-            Object o = selection.getFirstElement();
-            if (o instanceof IResource) {
-                return ((IResource) o).getFullPath().makeRelative().toString();
-            }
-            return ResourceNavigatorMessages.ResourceNavigator_oneItemSelected;
-        }
-        if (selection.size() > 1) {
-            return NLS.bind(ResourceNavigatorMessages.ResourceNavigator_statusLine, String.valueOf(selection.size()));
-        }
-        return ""; //$NON-NLS-1$
-    }
-
-    /**
-     * Returns the name for the given element.
-     * Used as the name for the current frame.
-     */
-    String getFrameName(Object element) {
-        if (element instanceof IResource) {
-			return ((IResource) element).getName();
-		}
-        String text = ((ILabelProvider) getTreeViewer().getLabelProvider())
-        .getText(element);
-        if(text == null) {
-			return "";//$NON-NLS-1$
-		}
-        return text;
-    }
-
-    /**
-     * Returns the tool tip text for the given element.
-     * Used as the tool tip text for the current frame, and for the view title tooltip.
-     */
-    String getFrameToolTipText(Object element) {
-        if (element instanceof IResource) {
-            IPath path = ((IResource) element).getFullPath();
-            if (path.isRoot()) {
-				return ResourceNavigatorMessages.ResourceManager_toolTip;
-			}
-            return path.makeRelative().toString();
-        }
-        
-        String text = ((ILabelProvider) getTreeViewer().getLabelProvider())
-        	.getText(element);
-        if(text == null) {
-			return "";//$NON-NLS-1$
-		}
-        return text;
-    }
-
-	/**
-	 * Handles an open event from the viewer. Opens an editor on the selected file.
-	 * 
-	 * @param event the open event
-	 * @since 2.0
-	 * @deprecated As of 3.5, replaced by {@link #handleOpen(ISelection)}
-	 */
-    protected void handleOpen(OpenEvent event) {
-        handleOpen(event.getSelection());
-	}
-
-	/**
-	 * Handles an open event from the viewer. Opens an editor on the selected file.
-	 * 
-	 * @param selection the selection
-	 * @since 3.5
-	 */
-	protected void handleOpen(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			getActionGroup().runDefaultAction((IStructuredSelection)selection);
-		}
-    }
-
-    /**
-     * Handles a double-click event from the viewer.
-     * Expands or collapses a folder when double-clicked.
-     * 
-     * @param event the double-click event
-     * @since 2.0
-     */
-    protected void handleDoubleClick(DoubleClickEvent event) {
-        IStructuredSelection selection = (IStructuredSelection) event
-                .getSelection();
-        Object element = selection.getFirstElement();
-
-        // 1GBZIA0: ITPUI:WIN2000 - Double-clicking in navigator should expand/collapse containers
-        TreeViewer viewer = getTreeViewer();
-        if (viewer.isExpandable(element)) {
-            viewer.setExpandedState(element, !viewer.getExpandedState(element));
-		} else if (selection.size() == 1 && (element instanceof IResource)
-				&& ((IResource) element).getType() == IResource.PROJECT) {
-			OpenResourceAction ora = new OpenResourceAction(getSite());
-			ora.selectionChanged((IStructuredSelection) viewer.getSelection());
-			if (ora.isEnabled()) {
-				ora.run();
-			}
-		}
-
-    }
-
-    /**
-     * Handles a selection changed event from the viewer.
-     * Updates the status line and the action bars, and links to editor (if option enabled).
-     * 
-     * @param event the selection event
-     * @since 2.0
-     */
-    protected void handleSelectionChanged(SelectionChangedEvent event) {
-        final IStructuredSelection sel = (IStructuredSelection) event
-                .getSelection();
-        updateStatusLine(sel);
-        updateActionBars(sel);
-        dragDetected = false;
-    }
-
-    /**
-     * Handles a key press event from the viewer.
-     * Delegates to the action group.
-     * 
-     * @param event the key event
-     * @since 2.0
-     */
-    protected void handleKeyPressed(KeyEvent event) {
-        getActionGroup().handleKeyPressed(event);
-    }
-
-    /**
-     * Handles a key release in the viewer.  Does nothing by default.
-     * 
-     * @param event the key event
-     * @since 2.0
-     */
-    protected void handleKeyReleased(KeyEvent event) {
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IViewPart.
-     */
-    public void init(IViewSite site, IMemento memento) throws PartInitException {
-        super.init(site, memento);
-        this.memento = memento;
-    }
-
-    /**
-     * Adds drag and drop support to the navigator.
-     * 
-     * @since 2.0
-     */
-    protected void initDragAndDrop() {
-        int ops = DND.DROP_COPY | DND.DROP_MOVE;
-        Transfer[] transfers = new Transfer[] {
-                LocalSelectionTransfer.getInstance(),
-                ResourceTransfer.getInstance(), FileTransfer.getInstance(),
-                PluginTransfer.getInstance() };
-        TreeViewer viewer = getTreeViewer();
-        viewer.addDragSupport(ops, transfers, new NavigatorDragAdapter(viewer));
-        NavigatorDropAdapter adapter = new NavigatorDropAdapter(viewer);
-        adapter.setFeedbackEnabled(false);
-        viewer.addDropSupport(ops | DND.DROP_DEFAULT, transfers, adapter);
-        dragDetectListener = new Listener() {
-            public void handleEvent(Event event) {
-                dragDetected = true;
-            }
-        };
-        viewer.getControl().addListener(SWT.DragDetect, dragDetectListener);
-    }
-
-    /**
-     * Creates the frame source and frame list, and connects them.
-     * 
-     * @since 2.0
-     */
-    protected FrameList createFrameList() {
-        NavigatorFrameSource frameSource = new NavigatorFrameSource(this);
-        FrameList frameList = new FrameList(frameSource);
-        frameSource.connectTo(frameList);
-        return frameList;
-    }
-
-    /**
-     * Initializes the sorter.
-     * 
-     * @deprecated as of 3.3, use {@link ResourceNavigator#initResourceComparator()} instead
-     */
-    protected void initResourceSorter() {
-        int sortType = ResourceSorter.NAME;
-        try {
-            int sortInt = 0;
-            if (memento != null) {
-                String sortStr = memento.getString(TAG_SORTER);
-                if (sortStr != null) {
-					sortInt = new Integer(sortStr).intValue();
-				}
-            } else {
-                sortInt = settings.getInt(STORE_SORT_TYPE);
-            }
-            if (sortInt == ResourceSorter.NAME
-                    || sortInt == ResourceSorter.TYPE) {
-				sortType = sortInt;
-			}
-        } catch (NumberFormatException e) {
-        }
-        setSorter(new ResourceSorter(sortType));
-    }
-    
-    /**
-     * Initializes the comparator.
-	 * @since 3.3
-     */
-    protected void initResourceComparator(){
-        int sortType = ResourceComparator.NAME;
-        try {
-            int sortInt = 0;
-            if (memento != null) {
-                String sortStr = memento.getString(TAG_SORTER);
-                if (sortStr != null) {
-					sortInt = new Integer(sortStr).intValue();
-				}
-            } else {
-                sortInt = settings.getInt(STORE_SORT_TYPE);
-            }
-            if (sortInt == ResourceComparator.NAME
-                    || sortInt == ResourceComparator.TYPE) {
-				sortType = sortInt;
-			}
-        } catch (NumberFormatException e) {
-        }
-        setComparator(new ResourceComparator(sortType));
-    }
-
-    /**
-     * Restores the working set filter from the persistence store.
-     */
-    protected void initWorkingSetFilter() {
-        String workingSetName = settings.get(STORE_WORKING_SET);
-
-        IWorkingSet workingSet = null;
-        
-        if (workingSetName != null && workingSetName.equals("") == false) { //$NON-NLS-1$
-			IWorkingSetManager workingSetManager = getPlugin().getWorkbench()
-					.getWorkingSetManager();
-			workingSet = workingSetManager.getWorkingSet(workingSetName);
-		} else if (PlatformUI
-				.getPreferenceStore()
-				.getBoolean(
-						IWorkbenchPreferenceConstants.USE_WINDOW_WORKING_SET_BY_DEFAULT)) {
-			// use the window set by default if the global preference is set
-			workingSet = getSite().getPage().getAggregateWorkingSet();
-		}
-
-		if (workingSet != null) {
-			// Only initialize filter. Don't set working set into viewer.
-			// Working set is set via WorkingSetFilterActionGroup
-			// during action creation.
-			workingSetFilter.setWorkingSet(workingSet);
-			internalSetWorkingSet(workingSet);
-		}
-    }
-
-    /**
-	 * Returns whether the navigator selection automatically tracks the active
-	 * editor.
-	 * 
-	 * @return <code>true</code> if linking is enabled, <code>false</code>
-	 *         if not
-	 * @since 2.0 (this was protected in 2.0, but was made public in 2.1)
-	 */
-    public boolean isLinkingEnabled() {
-        return linkingEnabled;
-    }
-
-	/**
-	 * Brings the corresponding editor to top if the selected resource is open.
-	 * 
-	 * @since 2.0
-	 * @deprecated As of 3.5, replaced by {@link #linkToEditor(ISelection)}
-	 */
-    protected void linkToEditor(IStructuredSelection selection) {
-    	linkToEditor((ISelection)selection);
-	}
-
-	/**
-	 * Brings the corresponding editor to top if the selected resource is open.
-	 * 
-	 * @since 3.5
-	 */
-	protected void linkToEditor(ISelection selection) {
-
-    	if (this != this.getSite().getPage().getActivePart())
-    		return;
-    	
-        Object obj = getSingleElement(selection);
-		if (obj instanceof IFile) {
-            IFile file = (IFile) obj;
-            IWorkbenchPage page = getSite().getPage();
-            IEditorPart editor = ResourceUtil.findEditor(page, file);
-            if (editor != null) {
-                page.bringToTop(editor);
-                return;
-            }
-        }
-    }
-
-    /**
-     * Creates the action group, which encapsulates all actions for the view.
-     */
-    protected void makeActions() {
-    	MainActionGroup group = new MainActionGroup(this);
-        setActionGroup(group);
-        
-        IHandlerService service = (IHandlerService) getSite().getService(IHandlerService.class);
-    	service.activateHandler("org.eclipse.ui.navigate.linkWithEditor", //$NON-NLS-1$
-    			new ActionHandler(group.toggleLinkingAction));
-    	collapseAllHandler = new CollapseAllHandler(viewer);
-    	service.activateHandler(CollapseAllHandler.COMMAND_ID,
-				collapseAllHandler);
-    }
-
-    /**
-     * Restores the saved filter settings.
-     */
-    private void restoreFilters() {
-        IMemento filtersMem = memento.getChild(TAG_FILTERS);
-
-        if (filtersMem != null) { //filters have been defined
-            IMemento children[] = filtersMem.getChildren(TAG_FILTER);
-
-            // check if first element has new tag defined, indicates new version
-            if (children.length > 0
-                    && children[0].getString(TAG_IS_ENABLED) != null) {
-                ArrayList selectedFilters = new ArrayList();
-                ArrayList unSelectedFilters = new ArrayList();
-                for (int i = 0; i < children.length; i++) {
-                    if (children[i].getString(TAG_IS_ENABLED).equals(
-                            String.valueOf(true))) {
-						selectedFilters.add(children[i].getString(TAG_ELEMENT));
-					} else {
-						//enabled == false
-                        unSelectedFilters.add(children[i]
-                                .getString(TAG_ELEMENT));
-					}
-                }
-
-                /* merge filters from Memento with selected = true filters from plugins
-                 * ensure there are no duplicates & don't override user preferences	 */
-                List pluginFilters = FiltersContentProvider.getDefaultFilters();
-                for (Iterator iter = pluginFilters.iterator(); iter.hasNext();) {
-                    String element = (String) iter.next();
-                    if (!selectedFilters.contains(element)
-                            && !unSelectedFilters.contains(element)) {
-						selectedFilters.add(element);
-					}
-                }
-
-                //Convert to an array of Strings
-                String[] patternArray = new String[selectedFilters.size()];
-                selectedFilters.toArray(patternArray);
-                getPatternFilter().setPatterns(patternArray);
-
-            } else { //filters defined, old version: ignore filters from plugins
-                String filters[] = new String[children.length];
-                for (int i = 0; i < children.length; i++) {
-                    filters[i] = children[i].getString(TAG_ELEMENT);
-                }
-                getPatternFilter().setPatterns(filters);
-            }
-        } else { //no filters defined, old version: ignore filters from plugins
-            getPatternFilter().setPatterns(new String[0]);
-        }
-    }
-
-    /**
-     * Restores the state of the receiver to the state described in the specified memento.
-     *
-     * @param memento the memento
-     * @since 2.0
-     */
-    protected void restoreState(IMemento memento) {
-        TreeViewer viewer = getTreeViewer();
-        IMemento frameMemento = memento.getChild(TAG_CURRENT_FRAME);
-
-        if (frameMemento != null) {
-            TreeFrame frame = new TreeFrame(viewer);
-            frame.restoreState(frameMemento);
-            frame.setName(getFrameName(frame.getInput()));
-            frame.setToolTipText(getFrameToolTipText(frame.getInput()));
-            viewer.setSelection(new StructuredSelection(frame.getInput()));
-            frameList.gotoFrame(frame);
-        } else {
-            IContainer container = ResourcesPlugin.getWorkspace().getRoot();
-            IMemento childMem = memento.getChild(TAG_EXPANDED);
-            if (childMem != null) {
-                ArrayList elements = new ArrayList();
-                IMemento[] elementMem = childMem.getChildren(TAG_ELEMENT);
-                for (int i = 0; i < elementMem.length; i++) {
-                    Object element = container.findMember(elementMem[i]
-                            .getString(TAG_PATH));
-                    if (element != null) {
-                        elements.add(element);
-                    }
-                }
-                viewer.setExpandedElements(elements.toArray());
-            }
-            childMem = memento.getChild(TAG_SELECTION);
-            if (childMem != null) {
-                ArrayList list = new ArrayList();
-                IMemento[] elementMem = childMem.getChildren(TAG_ELEMENT);
-                for (int i = 0; i < elementMem.length; i++) {
-                    Object element = container.findMember(elementMem[i]
-                            .getString(TAG_PATH));
-                    if (element != null) {
-                        list.add(element);
-                    }
-                }
-                viewer.setSelection(new StructuredSelection(list));
-            }
-        }
-    }
-
-    /**
-     * Restores the linking enabled state.
-     */
-    private void restoreLinkingEnabled() {
-        Integer val = memento
-                .getInteger(IWorkbenchPreferenceConstants.LINK_NAVIGATOR_TO_EDITOR);
-        if (val != null) {
-            linkingEnabled = val.intValue() != 0;
-        }
-    }
-
-    /**
-     * @see ViewPart#saveState
-     */
-    public void saveState(IMemento memento) {
-        TreeViewer viewer = getTreeViewer();
-        if (viewer == null) {
-            if (this.memento != null) {
-				memento.putMemento(this.memento);
-			}
-            return;
-        }
-
-        //save sorter
-        if (getComparator() != null) {
-        	memento.putInteger(TAG_SORTER, getComparator().getCriteria());
-        } else if (getSorter() != null) {
-        	memento.putInteger(TAG_SORTER, getSorter().getCriteria());
-        }
-
-        //save filters
-        String filters[] = getPatternFilter().getPatterns();
-        List selectedFilters = Arrays.asList(filters);
-        List allFilters = FiltersContentProvider.getDefinedFilters();
-        IMemento filtersMem = memento.createChild(TAG_FILTERS);
-        for (Iterator iter = allFilters.iterator(); iter.hasNext();) {
-            String element = (String) iter.next();
-            IMemento child = filtersMem.createChild(TAG_FILTER);
-            child.putString(TAG_ELEMENT, element);
-            child.putString(TAG_IS_ENABLED, String.valueOf(selectedFilters
-                    .contains(element)));
-        }
-
-        if (frameList.getCurrentIndex() > 0) {
-            //save frame, it's not the "home"/workspace frame
-            TreeFrame currentFrame = (TreeFrame) frameList.getCurrentFrame();
-            IMemento frameMemento = memento.createChild(TAG_CURRENT_FRAME);
-            currentFrame.saveState(frameMemento);
-        } else {
-            //save visible expanded elements
-            Object expandedElements[] = viewer.getVisibleExpandedElements();
-            if (expandedElements.length > 0) {
-                IMemento expandedMem = memento.createChild(TAG_EXPANDED);
-                for (int i = 0; i < expandedElements.length; i++) {
-                    if (expandedElements[i] instanceof IResource) {
-                        IMemento elementMem = expandedMem
-                                .createChild(TAG_ELEMENT);
-                        elementMem.putString(TAG_PATH,
-                                ((IResource) expandedElements[i]).getFullPath()
-                                        .toString());
-                    }
-                }
-            }
-            //save selection
-            Object elements[] = ((IStructuredSelection) viewer.getSelection())
-                    .toArray();
-            if (elements.length > 0) {
-                IMemento selectionMem = memento.createChild(TAG_SELECTION);
-                for (int i = 0; i < elements.length; i++) {
-                    if (elements[i] instanceof IResource) {
-                        IMemento elementMem = selectionMem
-                                .createChild(TAG_ELEMENT);
-                        elementMem.putString(TAG_PATH,
-                                ((IResource) elements[i]).getFullPath()
-                                        .toString());
-                    }
-                }
-            }
-        }
-
-        saveLinkingEnabled(memento);
-    }
-
-    /**
-     * Saves the linking enabled state.
-     */
-    private void saveLinkingEnabled(IMemento memento) {
-        memento.putInteger(
-                IWorkbenchPreferenceConstants.LINK_NAVIGATOR_TO_EDITOR,
-                linkingEnabled ? 1 : 0);
-    }
-
-    /**
-     * Selects and reveals the specified elements.
-     */
-    public void selectReveal(ISelection selection) {
-        StructuredSelection ssel = convertSelection(selection);
-        if (!ssel.isEmpty()) {
-            getViewer().getControl().setRedraw(false);
-            getViewer().setSelection(ssel, true);
-            getViewer().getControl().setRedraw(true);
-        }
-    }
-
-    /**
-     * Saves the filters defined as strings in <code>patterns</code>
-     * in the preference store.
-     */
-    public void setFiltersPreference(String[] patterns) {
-
-        StringBuffer sb = new StringBuffer();
-
-        for (int i = 0; i < patterns.length; i++) {
-            if (i != 0) {
-				sb.append(ResourcePatternFilter.COMMA_SEPARATOR);
-			}
-            sb.append(patterns[i]);
-        }
-
-        getPlugin().getPreferenceStore().setValue(
-                ResourcePatternFilter.FILTERS_TAG, sb.toString());
-
-        // remove value in old workbench preference store location
-        IPreferenceStore preferenceStore = IDEWorkbenchPlugin.getDefault()
-                .getPreferenceStore();
-        String storedPatterns = preferenceStore
-                .getString(ResourcePatternFilter.FILTERS_TAG);
-        if (storedPatterns.length() > 0) {
-			preferenceStore.setValue(ResourcePatternFilter.FILTERS_TAG, ""); //$NON-NLS-1$
-		}
-    }
-
-    /**
-     * @see IWorkbenchPart#setFocus()
-     */
-    public void setFocus() {
-        getTreeViewer().getTree().setFocus();
-    }
-
-    /**
-     * Note: For experimental use only.
-     * Sets the decorator for the navigator.
-     * <p>
-     * As of 2.0, this method no longer has any effect.
-     * </p>
-     *
-     * @param decorator a label decorator or <code>null</code> for no decorations.
-     * @deprecated use the decorators extension point instead; see IWorkbench.getDecoratorManager()
-     */
-    public void setLabelDecorator(ILabelDecorator decorator) {
-        // do nothing
-    }
-
-    /**
-     * @see IResourceNavigator#setLinkingEnabled(boolean)
-     * @since 2.1
-     */
-    public void setLinkingEnabled(boolean enabled) {
-        this.linkingEnabled = enabled;
-
-        // remember the last setting in the dialog settings
-        settings.put(IWorkbenchPreferenceConstants.LINK_NAVIGATOR_TO_EDITOR,
-                enabled);
-
-        // if turning linking on, update the selection to correspond to the active editor
-        if (enabled) {
-            IEditorPart editor = getSite().getPage().getActiveEditor();
-            if (editor != null) {
-                editorActivated(editor);
-            }
-        }
-        openAndLinkWithEditorHelper.setLinkWithEditor(enabled);
-    }
-
-    /**
-     * Sets the resource sorter.
-     * 
-     * @param sorter the resource sorter
-     * @since 2.0
-     * @deprecated as of 3.3, use {@link ResourceNavigator#setComparator(ResourceComparator)}
-     */
-    public void setSorter(ResourceSorter sorter) {
-        TreeViewer viewer = getTreeViewer();
-        ViewerSorter viewerSorter = viewer.getSorter();
-
-        viewer.getControl().setRedraw(false);
-        if (viewerSorter == sorter) {
-            viewer.refresh();
-        } else {
-            viewer.setSorter(sorter);
-        }
-        viewer.getControl().setRedraw(true);
-        settings.put(STORE_SORT_TYPE, sorter.getCriteria());
-
-        // update the sort actions' checked state
-        updateActionBars((IStructuredSelection) viewer.getSelection());
-    }
-    
-    /**
-     * Sets the resource comparator
-     * 
-     * @param comparator the resource comparator
-     * @since 3.3
-     */
-    public void setComparator(ResourceComparator comparator){
-        TreeViewer viewer = getTreeViewer();
-        ViewerComparator viewerComparator = viewer.getComparator();
-
-        viewer.getControl().setRedraw(false);
-        if (viewerComparator == comparator) {
-            viewer.refresh();
-        } else {
-            viewer.setComparator(comparator);
-        }
-        viewer.getControl().setRedraw(true);
-        settings.put(STORE_SORT_TYPE, comparator.getCriteria());
-
-        // update the sort actions' checked state
-        updateActionBars((IStructuredSelection) viewer.getSelection());
-    }
-
-    /*
-     * @see org.eclipse.ui.views.navigator.IResourceNavigatorPart#setWorkingSet(IWorkingSet)
-     * @since 2.0
-     */
-    public void setWorkingSet(IWorkingSet workingSet) {
-        TreeViewer treeViewer = getTreeViewer();
-        Object[] expanded = treeViewer.getExpandedElements();
-        ISelection selection = treeViewer.getSelection();
-        
-        boolean refreshNeeded = internalSetWorkingSet(workingSet);
-        
-        workingSetFilter.setWorkingSet(emptyWorkingSet ? null : workingSet);
-        if (workingSet != null) {
-            settings.put(STORE_WORKING_SET, workingSet.getName());
-        } else {
-            settings.put(STORE_WORKING_SET, ""); //$NON-NLS-1$
-        }
-        updateTitle();
-        if(refreshNeeded) {
-        	treeViewer.refresh();
-        }
-        treeViewer.setExpandedElements(expanded);
-        if (selection.isEmpty() == false
-                && selection instanceof IStructuredSelection) {
-            IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-            treeViewer.reveal(structuredSelection.getFirstElement());
-        }
-    }
-
-	/**
-	 * Set the internal working set fields specific to the navigator.
-	 * 
-	 * @param workingSet
-	 *            the new working set
-	 * @since 3.2
-	 */
-	private boolean internalSetWorkingSet(IWorkingSet workingSet) {
-		boolean refreshNeeded = !Util.equals(this.workingSet, workingSet);
-		this.workingSet = workingSet;
-		emptyWorkingSet = workingSet != null && workingSet.isAggregateWorkingSet()
-				&& workingSet.isEmpty();
-		return refreshNeeded;
-	}
-
-    /**
-     * Updates the action bar actions.
-     * 
-     * @param selection the current selection
-     * @since 2.0
-     */
-    protected void updateActionBars(IStructuredSelection selection) {
-        ResourceNavigatorActionGroup group = getActionGroup();
-        if (group != null) {
-            group.setContext(new ActionContext(selection));
-            group.updateActionBars();
-        }
-    }
-
-    /**
-     * Updates the message shown in the status line.
-     *
-     * @param selection the current selection
-     */
-    protected void updateStatusLine(IStructuredSelection selection) {
-        String msg = getStatusLineMessage(selection);
-        getViewSite().getActionBars().getStatusLineManager().setMessage(msg);
-    }
-
-    /**
-     * Updates the title text and title tool tip.
-     * Called whenever the input of the viewer changes.
-     * Called whenever the input of the viewer changes.
-     * 
-     * @since 2.0
-     */
-    public void updateTitle() {
-        Object input = getViewer().getInput();
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        IWorkingSet workingSet = workingSetFilter.getWorkingSet();
-
-        if (input == null || input.equals(workspace)
-                || input.equals(workspace.getRoot())) {
-            setContentDescription(""); //$NON-NLS-1$
-            if (workingSet != null) {
-                setTitleToolTip(NLS.bind(ResourceNavigatorMessages.ResourceNavigator_workingSetToolTip, workingSet.getLabel()));
-            } else {
-                setTitleToolTip(""); //$NON-NLS-1$
-            }
-        } else {
-            ILabelProvider labelProvider = (ILabelProvider) getTreeViewer()
-                    .getLabelProvider();
-            String inputToolTip = getFrameToolTipText(input);
-            String text = labelProvider.getText(input);
-            if(text != null) {
-				setContentDescription(text);
-			}
-            if (workingSet != null) {
-                setTitleToolTip(NLS.bind(ResourceNavigatorMessages.ResourceNavigator_workingSetInputToolTip, inputToolTip, workingSet.getLabel()));
-            } else {
-                setTitleToolTip(inputToolTip);
-            }
-        }
-    }
-
-    /**
-     * Returns the action group.
-     * 
-     * @return the action group
-     */
-    protected ResourceNavigatorActionGroup getActionGroup() {
-        return actionGroup;
-    }
-
-    /**
-     * Sets the action group.
-     * 
-     * @param actionGroup the action group
-     */
-    protected void setActionGroup(ResourceNavigatorActionGroup actionGroup) {
-        this.actionGroup = actionGroup;
-    }
-
-    /*
-     * @see IWorkbenchPart#getAdapter(Class)
-     */
-    public Object getAdapter(Class adapter) {
-        if (adapter == IShowInSource.class) {
-            return getShowInSource();
-        }
-        if (adapter == IShowInTarget.class) {
-            return getShowInTarget();
-        }
-        return null;
-    }
-
-    /**
-     * Returns the <code>IShowInSource</code> for this view.
-     */
-    protected IShowInSource getShowInSource() {
-        return new IShowInSource() {
-            public ShowInContext getShowInContext() {
-                return new ShowInContext(getViewer().getInput(), getViewer()
-                        .getSelection());
-            }
-        };
-    }
-
-    /**
-     * Returns the <code>IShowInTarget</code> for this view.
-     */
-    protected IShowInTarget getShowInTarget() {
-        return new IShowInTarget() {
-            public boolean show(ShowInContext context) {
-                ArrayList toSelect = new ArrayList();
-                ISelection sel = context.getSelection();
-                if (sel instanceof IStructuredSelection) {
-                    IStructuredSelection ssel = (IStructuredSelection) sel;
-                    for (Iterator i = ssel.iterator(); i.hasNext();) {
-                        Object o = i.next();
-                        if (o instanceof IResource) {
-                            toSelect.add(o);
-                        } else if (o instanceof IMarker) {
-                            IResource r = ((IMarker) o).getResource();
-                            if (r.getType() != IResource.ROOT) {
-                                toSelect.add(r);
-                            }
-                        } else if (o instanceof IAdaptable) {
-                            IAdaptable adaptable = (IAdaptable) o;
-                            o = adaptable.getAdapter(IResource.class);
-                            if (o instanceof IResource) {
-                                toSelect.add(o);
-                            } else {
-                                o = adaptable.getAdapter(IMarker.class);
-                                if (o instanceof IMarker) {
-                                    IResource r = ((IMarker) o).getResource();
-                                    if (r.getType() != IResource.ROOT) {
-                                        toSelect.add(r);
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-                if (toSelect.isEmpty()) {
-                    Object input = context.getInput();
-                    if (input instanceof IAdaptable) {
-                        IAdaptable adaptable = (IAdaptable) input;
-                        Object o = adaptable.getAdapter(IResource.class);
-                        if (o instanceof IResource) {
-                            toSelect.add(o);
-                        }
-                    }
-                }
-                if (!toSelect.isEmpty()) {
-                    selectReveal(new StructuredSelection(toSelect));
-                    return true;
-                }
-                return false;
-            }
-        };
-    }
-    
-	/**
-	 * Returns the selected element if the selection consists of a single element only.
-	 * 
-	 * @param s the selection
-	 * @return the selected first element or null
-	 * @since 3.5
-	 */
-	protected static final Object getSingleElement(ISelection s) {
-		if (!(s instanceof IStructuredSelection))
-			return null;
-
-		IStructuredSelection selection = (IStructuredSelection)s;
-		if (selection.size() != 1)
-			return null;
-
-		return selection.getFirstElement();
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigatorAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigatorAction.java
deleted file mode 100644
index 43deab5..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigatorAction.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.SelectionProviderAction;
-
-/**
- * Superclass of all actions provided by the resource navigator.
- */
-public abstract class ResourceNavigatorAction extends SelectionProviderAction {
-
-    private IResourceNavigator navigator;
-
-    /**
-     * Creates a new instance of the class.
-     */
-    public ResourceNavigatorAction(IResourceNavigator navigator, String label) {
-        super(navigator.getViewer(), label);
-        this.navigator = navigator;
-    }
-
-    /**
-     * Returns the resource navigator for which this action was created.
-     */
-    public IResourceNavigator getNavigator() {
-        return navigator;
-    }
-
-    /**
-     * Returns the resource viewer
-     */
-    protected Viewer getViewer() {
-        return getNavigator().getViewer();
-    }
-
-    /**
-     * Returns the shell to use within actions.
-     */
-    protected Shell getShell() {
-        return getNavigator().getSite().getShell();
-    }
-
-    /**
-     * Returns the workbench.
-     */
-    protected IWorkbench getWorkbench() {
-        return PlatformUI.getWorkbench();
-    }
-
-    /**
-     * Returns the workbench window.
-     */
-    protected IWorkbenchWindow getWorkbenchWindow() {
-        return getNavigator().getSite().getWorkbenchWindow();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigatorActionGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigatorActionGroup.java
deleted file mode 100644
index 05abd91..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigatorActionGroup.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *        IBM Corporation - initial API and implementation 
- *        Sebastian Davids <sdavids@gmx.de> - Images for menu items (27481)
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * This is the action group for all the resource navigator actions.
- * It delegates to several subgroups for most of the actions.
- * 
- * @see GotoActionGroup
- * @see OpenActionGroup
- * @see RefactorActionGroup
- * @see SortAndFilterActionGroup
- * @see WorkspaceActionGroup
- * 
- * @since 2.0
- */
-public abstract class ResourceNavigatorActionGroup extends ActionGroup {
-
-    /**
-     * The resource navigator.
-     */
-    protected IResourceNavigator navigator;
-	
-    /**
-     * Constructs a new navigator action group and creates its actions.
-     * 
-     * @param navigator the resource navigator
-     */
-    public ResourceNavigatorActionGroup(IResourceNavigator navigator) {
-        this.navigator = navigator;
-        makeActions();
-    }
-
-    /**
-     * Returns the image descriptor with the given relative path.
-     */
-    protected ImageDescriptor getImageDescriptor(String relativePath) {
-       return IDEWorkbenchPlugin.getIDEImageDescriptor(relativePath);
-     
-    }
-
-    /**
-     * Returns the resource navigator.
-     */
-    public IResourceNavigator getNavigator() {
-        return navigator;
-    }
-
-    /**
-     * Handles a key pressed event by invoking the appropriate action.
-     * Does nothing by default.
-     */
-    public void handleKeyPressed(KeyEvent event) {
-    }
-
-    /**
-     * Makes the actions contained in this action group.
-     */
-    protected abstract void makeActions();
-
-    /**
-     * Runs the default action in the group.
-     * Does nothing by default.
-     * 
-     * @param selection the current selection
-     */
-    public void runDefaultAction(IStructuredSelection selection) {
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigatorMessages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigatorMessages.java
deleted file mode 100644
index 7020231..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigatorMessages.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-
-/**
- * Utility class which helps managing messages
- * @since 2.0
- * @deprecated These messages are not API and should not be referenced
- * outside of this plug-in.
- */
-public class ResourceNavigatorMessages {
-    
-	private ResourceNavigatorMessages() {
-        // prevent instantiation of class
-    }
-
-    /**
-     * Returns the formatted message for the given key in
-     * the resource bundle. 
-     *
-     * @param key the resource name
-     * @param args the message arguments
-     * @return the string
-     */
-    public static String format(String key, Object[] args) {
-        return key;
-    }
-
-    /**
-     * Returns the resource object with the given key in
-     * the resource bundle. If there isn't any value under
-     * the given key, the key is returned.
-     *
-     * @param key the resource name
-     * @return the string
-     */
-    public static String getString(String key) {
-        return key;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigatorMoveAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigatorMoveAction.java
deleted file mode 100644
index 8ed54ca..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigatorMoveAction.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.MoveProjectAction;
-import org.eclipse.ui.actions.MoveResourceAction;
-
-/**
- * The ResourceNavigatorMoveAction is a resource move that aso updates the navigator
- * to show the result of the move.
- * It also delegates to MoveProjectAction as needed.
- * 
- * @since 2.0
- */
-public class ResourceNavigatorMoveAction extends MoveResourceAction {
-    private StructuredViewer viewer;
-
-    private MoveProjectAction moveProjectAction;
-
-    /**
-     * Create a ResourceNavigatorMoveAction and use the supplied viewer to update the UI.
-     * @param shell Shell
-     * @param structureViewer StructuredViewer
-     */
-    public ResourceNavigatorMoveAction(Shell shell,
-            StructuredViewer structureViewer) {
-        super(shell);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                INavigatorHelpContextIds.RESOURCE_NAVIGATOR_MOVE_ACTION);
-        this.viewer = structureViewer;
-        this.moveProjectAction = new MoveProjectAction(shell);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IAction.
-     */
-    public void run() {
-        if (moveProjectAction.isEnabled()) {
-            moveProjectAction.run();
-            return;
-        }
-
-        super.run();
-        List destinations = getDestinations();
-        if (destinations != null && destinations.isEmpty() == false) {
-            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-            List resources = new ArrayList();
-            Iterator iterator = destinations.iterator();
-
-            while (iterator.hasNext()) {
-                IResource newResource = root
-                        .findMember((IPath) iterator.next());
-                if (newResource != null) {
-					resources.add(newResource);
-				}
-            }
-
-            this.viewer.setSelection(new StructuredSelection(resources), true);
-        }
-
-    }
-
-    protected boolean updateSelection(IStructuredSelection selection) {
-        moveProjectAction.selectionChanged(selection);
-        return super.updateSelection(selection)
-                || moveProjectAction.isEnabled();
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigatorRenameAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigatorRenameAction.java
deleted file mode 100644
index 3657fbc..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceNavigatorRenameAction.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.RenameResourceAction;
-
-/**
- * The ResourceNavigatorRenameAction is the rename action used by the
- * ResourceNavigator that also allows updating after rename.
- * @since 2.0
- */
-public class ResourceNavigatorRenameAction extends RenameResourceAction {
-    private TreeViewer viewer;
-
-    /**
-     * Create a ResourceNavigatorRenameAction and use the tree of the supplied viewer
-     * for editing.
-     * @param shell Shell
-     * @param treeViewer TreeViewer
-     */
-    public ResourceNavigatorRenameAction(Shell shell, TreeViewer treeViewer) {
-        super(shell, treeViewer.getTree());
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                INavigatorHelpContextIds.RESOURCE_NAVIGATOR_RENAME_ACTION);
-        this.viewer = treeViewer;
-    }
-
-    /* (non-Javadoc)
-     * Run the action to completion using the supplied path.
-     */
-    protected void runWithNewPath(IPath path, IResource resource) {
-        IWorkspaceRoot root = resource.getProject().getWorkspace().getRoot();
-        super.runWithNewPath(path, resource);
-        if (this.viewer != null) {
-            IResource newResource = root.findMember(path);
-            if (newResource != null) {
-				this.viewer.setSelection(new StructuredSelection(newResource),
-                        true);
-			}
-        }
-    }
-
-    /**
-     * Handle the key release
-     */
-    public void handleKeyReleased(KeyEvent event) {
-        if (event.keyCode == SWT.F2 && event.stateMask == 0 && isEnabled()) {
-            run();
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourcePatternFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourcePatternFilter.java
deleted file mode 100644
index 32f6792..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourcePatternFilter.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.util.PrefUtil;
-
-/**
- * Filter used to determine whether resources are to be shown or not.
- * 
- * @since 2.0
- */
-public class ResourcePatternFilter extends ViewerFilter {
-    private String[] patterns;
-
-    private StringMatcher[] matchers;
-
-    static final String COMMA_SEPARATOR = ",";//$NON-NLS-1$
-
-    static final String FILTERS_TAG = "resourceFilters";//$NON-NLS-1$
-
-    /**
-     * Creates a new resource pattern filter.
-     */
-    public ResourcePatternFilter() {
-        super();
-    }
-
-    /**
-     * Return the currently configured StringMatchers. If there aren't any look
-     * them up.
-     */
-    private StringMatcher[] getMatchers() {
-
-        if (this.matchers == null) {
-			initializeFromPreferences();
-		}
-
-        return this.matchers;
-    }
-
-    /**
-     * Gets the patterns for the receiver. Returns the cached values if there
-     * are any - if not look it up.
-     */
-    public String[] getPatterns() {
-
-        if (this.patterns == null) {
-			initializeFromPreferences();
-		}
-
-        return this.patterns;
-
-    }
-
-    /**
-     * Initializes the filters from the preference store.
-     */
-    private void initializeFromPreferences() {
-        // get the filters that were saved by ResourceNavigator.setFiltersPreference
-        IPreferenceStore viewsPrefs = IDEWorkbenchPlugin.getDefault()
-                .getPreferenceStore();
-        String storedPatterns = viewsPrefs.getString(FILTERS_TAG);
-
-        if (storedPatterns.length() == 0) {
-            // try to migrate patterns from old workbench preference store location
-            IPreferenceStore workbenchPrefs = PrefUtil.getInternalPreferenceStore();
-            storedPatterns = workbenchPrefs.getString(FILTERS_TAG);
-            if (storedPatterns.length() > 0) {
-                viewsPrefs.setValue(FILTERS_TAG, storedPatterns);
-                workbenchPrefs.setValue(FILTERS_TAG, ""); //$NON-NLS-1$
-            }
-        }
-
-        if (storedPatterns.length() == 0) {
-            // revert to all filter extensions with selected == "true"
-            // if there are no filters in the preference store
-            List defaultFilters = FiltersContentProvider.getDefaultFilters();
-            String[] patterns = new String[defaultFilters.size()];
-            defaultFilters.toArray(patterns);
-            setPatterns(patterns);
-            return;
-        }
-
-        //Get the strings separated by a comma and filter them from the currently
-        //defined ones
-        List definedFilters = FiltersContentProvider.getDefinedFilters();
-        StringTokenizer entries = new StringTokenizer(storedPatterns,
-                COMMA_SEPARATOR);
-        List patterns = new ArrayList();
-
-        while (entries.hasMoreElements()) {
-            String nextToken = entries.nextToken();
-            if (definedFilters.indexOf(nextToken) > -1) {
-				patterns.add(nextToken);
-			}
-        }
-
-        //Convert to an array of Strings
-        String[] patternArray = new String[patterns.size()];
-        patterns.toArray(patternArray);
-        setPatterns(patternArray);
-
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ViewerFilter.
-     */
-    public boolean select(Viewer viewer, Object parentElement, Object element) {
-        IResource resource = null;
-        if (element instanceof IResource) {
-            resource = (IResource) element;
-        } else if (element instanceof IAdaptable) {
-            IAdaptable adaptable = (IAdaptable) element;
-            resource = (IResource) adaptable.getAdapter(IResource.class);
-        }
-        if (resource != null) {
-            String name = resource.getName();
-            StringMatcher[] testMatchers = getMatchers();
-            for (int i = 0; i < testMatchers.length; i++) {
-                if (testMatchers[i].match(name)) {
-					return false;
-				}
-            }
-            return true;
-        }
-        return true;
-    }
-
-    /**
-     * Sets the patterns to filter out for the receiver.
-     */
-    public void setPatterns(String[] newPatterns) {
-
-        this.patterns = newPatterns;
-        this.matchers = new StringMatcher[newPatterns.length];
-        for (int i = 0; i < newPatterns.length; i++) {
-            //Reset the matchers to prevent constructor overhead
-            matchers[i] = new StringMatcher(newPatterns[i], true, false);
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceSelectionUtil.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceSelectionUtil.java
deleted file mode 100644
index ba2ec03..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceSelectionUtil.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-/**
- * Provides utilities for checking the validity of selections.
- * <p>
- * This class provides static methods only; it is not intended to be instantiated
- * or subclassed.
- * @since 2.0
- * </p>
- * @noinstantiate This class is not intended to be instantiated by clients.
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ResourceSelectionUtil {
-    /* (non-Javadoc)
-     * Private constructor to block instantiation.
-     */
-    private ResourceSelectionUtil() {
-    }
-
-    /**
-     * Returns whether the types of the resources in the given selection are among 
-     * the specified resource types.
-     * 
-     * @param selection the selection
-     * @param resourceMask resource mask formed by bitwise OR of resource type
-     *   constants (defined on <code>IResource</code>)
-     * @return <code>true</code> if all selected elements are resources of the right
-     *  type, and <code>false</code> if at least one element is either a resource
-     *  of some other type or a non-resource
-     * @see IResource#getType()
-     */
-    public static boolean allResourcesAreOfType(IStructuredSelection selection,
-            int resourceMask) {
-        Iterator resources = selection.iterator();
-        while (resources.hasNext()) {
-            Object next = resources.next();
-            if (!(next instanceof IResource)) {
-				return false;
-			}
-            if (!resourceIsType((IResource) next, resourceMask)) {
-				return false;
-			}
-        }
-        return true;
-    }
-
-    /**
-     * Returns the selection adapted to IResource. Returns null
-     * if any of the entries are not adaptable.
-     * 
-     * @param selection the selection
-     * @param resourceMask resource mask formed by bitwise OR of resource type
-     *   constants (defined on <code>IResource</code>)
-     * @return IStructuredSelection or null if any of the entries are not adaptable.
-     * @see IResource#getType()
-     */
-    public static IStructuredSelection allResources(
-            IStructuredSelection selection, int resourceMask) {
-        Iterator adaptables = selection.iterator();
-        List result = new ArrayList();
-        while (adaptables.hasNext()) {
-            Object next = adaptables.next();
-            if (next instanceof IAdaptable) {
-                Object resource = ((IAdaptable) next)
-                        .getAdapter(IResource.class);
-                if (resource == null) {
-					return null;
-				} else if (resourceIsType((IResource) resource, resourceMask)) {
-					result.add(resource);
-				}
-            } else {
-				return null;
-			}
-        }
-        return new StructuredSelection(result);
-
-    }
-
-    /**
-     * Returns whether the type of the given resource is among the specified 
-     * resource types.
-     * 
-     * @param resource the resource
-     * @param resourceMask resource mask formed by bitwise OR of resource type
-     *   constants (defined on <code>IResource</code>)
-     * @return <code>true</code> if the resources has a matching type, and 
-     *   <code>false</code> otherwise
-     * @see IResource#getType()
-     */
-    public static boolean resourceIsType(IResource resource, int resourceMask) {
-        return (resource.getType() & resourceMask) != 0;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceSorter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceSorter.java
deleted file mode 100644
index c4fd634..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ResourceSorter.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-
-/**
- * Sorter for viewers that display items of type <code>IResource</code>.
- * The sorter supports two sort criteria:
- * <p>
- * <code>NAME</code>: Folders are given order precedence, followed by files.
- * Within these two groups resources are ordered by name.  All name comparisons
- * are case-insensitive.
- * </p>
- * <p>
- * <code>TYPE</code>: Folders are given order precedence, followed by files.
- * Within these two groups resources are ordered by extension.  All extension
- * comparisons are case-insensitive.
- * </p>
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @deprecated as of 3.3, use {@link ResourceComparator} instead
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ResourceSorter extends ViewerSorter {
-
-    /**
-     * Constructor argument value that indicates to sort items by name.
-     */
-    public final static int NAME = 1;
-
-    /**
-     * Constructor argument value that indicates to sort items by extension.
-     */
-    public final static int TYPE = 2;
-
-    private int criteria;
-
-    /**
-     * Creates a resource sorter that will use the given sort criteria.
-     *
-     * @param criteria the sort criterion to use: one of <code>NAME</code> or 
-     *   <code>TYPE</code>
-     */
-    public ResourceSorter(int criteria) {
-        super();
-        this.criteria = criteria;
-    }
-
-    /**
-     * Returns an integer value representing the relative sort priority of the 
-     * given element based on its class.
-     * <p>
-     * <ul>
-     *   <li>resources (<code>IResource</code>) - 2</li>
-     *   <li>project references (<code>ProjectReference</code>) - 1</li>
-     *   <li>everything else - 0</li>
-     * </ul>
-     * </p>
-     *
-     * @param element the element
-     * @return the sort priority (larger numbers means more important)
-     */
-    protected int classComparison(Object element) {
-        if (element instanceof IResource) {
-            return 2;
-        }
-        return 0;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ViewerSorter.
-     */
-    public int compare(Viewer viewer, Object o1, Object o2) {
-        //have to deal with non-resources in navigator
-        //if one or both objects are not resources, returned a comparison 
-        //based on class.
-        if (!(o1 instanceof IResource && o2 instanceof IResource)) {
-            return compareClass(o1, o2);
-        }
-        IResource r1 = (IResource) o1;
-        IResource r2 = (IResource) o2;
-
-        if (r1 instanceof IContainer && r2 instanceof IContainer) {
-			return compareNames(r1, r2);
-		} else if (r1 instanceof IContainer) {
-			return -1;
-		} else if (r2 instanceof IContainer) {
-			return 1;
-		} else if (criteria == NAME) {
-			return compareNames(r1, r2);
-		} else if (criteria == TYPE) {
-			return compareTypes(r1, r2);
-		} else {
-			return 0;
-		}
-    }
-
-    /**
-     * Returns a number reflecting the collation order of the given elements
-     * based on their class.
-     *
-     * @param element1 the first element to be ordered
-     * @param element2 the second element to be ordered
-     * @return a negative number if the first element is less  than the 
-     *  second element; the value <code>0</code> if the first element is
-     *  equal to the second element; and a positive number if the first
-     *  element is greater than the second element
-     */
-    protected int compareClass(Object element1, Object element2) {
-        return classComparison(element1) - classComparison(element2);
-    }
-
-    /**
-     * Returns a number reflecting the collation order of the given resources
-     * based on their resource names.
-     *
-     * @param resource1 the first resource element to be ordered
-     * @param resource2 the second resource element to be ordered
-     * @return a negative number if the first element is less  than the 
-     *  second element; the value <code>0</code> if the first element is
-     *  equal to the second element; and a positive number if the first
-     *  element is greater than the second element
-     */
-    protected int compareNames(IResource resource1, IResource resource2) {
-        return collator.compare(resource1.getName(), resource2.getName());
-    }
-
-    /**
-     * Returns a number reflecting the collation order of the given resources
-     * based on their respective file extensions. Resources with the same file
-     * extension will be collated based on their names.
-     *
-     * @param resource1 the first resource element to be ordered
-     * @param resource2 the second resource element to be ordered
-     * @return a negative number if the first element is less  than the 
-     *  second element; the value <code>0</code> if the first element is
-     *  equal to the second element; and a positive number if the first
-     *  element is greater than the second element
-     */
-    protected int compareTypes(IResource resource1, IResource resource2) {
-        String ext1 = getExtensionFor(resource1);
-        String ext2 = getExtensionFor(resource2);
-
-        // Compare extensions.  If they're different then return a value that
-        // indicates correct extension ordering.  If they're the same then
-        // return a value that indicates the correct NAME ordering.
-        int result = collator.compare(ext1, ext2);
-
-        if (result != 0) {
-			return result;
-		}
-
-        return compareNames(resource1, resource2);
-    }
-
-    /**
-     * Returns the sort criteria of this sorter.
-     *
-     * @return the sort criterion: one of <code>NAME</code> or <code>TYPE</code>
-     */
-    public int getCriteria() {
-        return criteria;
-    }
-
-    /**
-     * Returns the extension portion of the given resource.
-     *
-     * @param resource the resource
-     * @return the file extension, possibily the empty string
-     */
-    private String getExtensionFor(IResource resource) {
-        String ext = resource.getFileExtension();
-        return ext == null ? "" : ext; //$NON-NLS-1$
-    }
-
-    /**
-     * Sets the sort criteria of this sorter.
-     * 
-     * @param criteria the sort criterion: 
-     *	one of <code>ResourceSorter.NAME</code> or 
-     *	<code>ResourceSorter.TYPE</code>
-     */
-    public void setCriteria(int criteria) {
-        this.criteria = criteria;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ShowInNavigatorAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ShowInNavigatorAction.java
deleted file mode 100644
index 57382b7..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ShowInNavigatorAction.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.SelectionProviderAction;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-import org.eclipse.ui.part.ISetSelectionTarget;
-
-/**
- * An action which shows the current selection in the Navigator view.
- * For each element in the selection, if it is an <code>IResource</code>
- * it uses it directly, otherwise if it is an <code>IMarker</code> it uses the marker's resource,
- * otherwise if it is an <code>IAdaptable</code>, it tries to get the <code>IResource.class</code> adapter.
- */
-public class ShowInNavigatorAction extends SelectionProviderAction {
-    private IWorkbenchPage page;
-
-    /**
-     * Create a new instance of this class.
-     * 
-     * @param page the page
-     * @param viewer the viewer
-     */
-    public ShowInNavigatorAction(IWorkbenchPage page, ISelectionProvider viewer) {
-        super(viewer, ResourceNavigatorMessages.ShowInNavigator_text);
-        Assert.isNotNull(page);
-        this.page = page;
-        setDescription(ResourceNavigatorMessages.ShowInNavigator_toolTip);
-        page.getWorkbenchWindow().getWorkbench().getHelpSystem().setHelp(this,
-				INavigatorHelpContextIds.SHOW_IN_NAVIGATOR_ACTION);
-    }
-
-    /**
-     * Returns the resources in the given selection.
-     *
-     * @return a list of <code>IResource</code>
-     */
-    List getResources(IStructuredSelection selection) {
-        List v = new ArrayList();
-        for (Iterator i = selection.iterator(); i.hasNext();) {
-            Object o = i.next();
-            if (o instanceof IResource) {
-                v.add(o);
-            } else if (o instanceof IMarker) {
-                IResource resource = ((IMarker) o).getResource();
-                v.add(resource);
-            } else if (o instanceof IAdaptable) {
-                IResource resource = (IResource) ((IAdaptable) o)
-                        .getAdapter(IResource.class);
-                if (resource != null) {
-                    v.add(resource);
-                }
-            }
-        }
-        return v;
-    }
-
-    /*
-     * (non-Javadoc)
-     * Method declared on IAction.
-     */
-    /**
-     * Shows the Navigator view and sets its selection to the resources
-     * selected in this action's selection provider.
-     */
-    public void run() {
-        List v = getResources(getStructuredSelection());
-        if (v.isEmpty()) {
-			return;
-		}
-        try {
-            IViewPart view = page.showView(IPageLayout.ID_RES_NAV);
-            if (view instanceof ISetSelectionTarget) {
-                ISelection selection = new StructuredSelection(v);
-                ((ISetSelectionTarget) view).selectReveal(selection);
-            }
-        } catch (PartInitException e) {
-            ErrorDialog.openError(page.getWorkbenchWindow().getShell(),
-                    ResourceNavigatorMessages.ShowInNavigator_errorMessage,
-                    e.getMessage(), e.getStatus());
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * Method declared on SelectionProviderAction.
-     */
-    public void selectionChanged(IStructuredSelection selection) {
-        setEnabled(!getResources(selection).isEmpty());
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/SortAndFilterActionGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/SortAndFilterActionGroup.java
deleted file mode 100644
index f5c78d0..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/SortAndFilterActionGroup.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - Images for menu items (27481)
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-
-/**
- * This is the action group for the sort and filter actions.
- */
-public class SortAndFilterActionGroup extends ResourceNavigatorActionGroup {
-
-    private SortViewAction sortByTypeAction;
-
-    private SortViewAction sortByNameAction;
-
-    private FilterSelectionAction filterAction;
-
-    /**
-     * Constructor. 
-     * 
-     * @param navigator
-     */
-    public SortAndFilterActionGroup(IResourceNavigator navigator) {
-        super(navigator);
-    }
-
-    protected void makeActions() {
-        sortByNameAction = new SortViewAction(navigator, false);
-        sortByTypeAction = new SortViewAction(navigator, true);
-
-        filterAction = new FilterSelectionAction(navigator,
-                ResourceNavigatorMessages.ResourceNavigator_filterText);
-        filterAction
-                .setDisabledImageDescriptor(getImageDescriptor("dlcl16/filter_ps.gif"));//$NON-NLS-1$
-        filterAction
-                .setImageDescriptor(getImageDescriptor("elcl16/filter_ps.gif"));//$NON-NLS-1$
-    }
-
-    public void fillActionBars(IActionBars actionBars) {
-        IMenuManager menu = actionBars.getMenuManager();
-        IMenuManager submenu = new MenuManager(ResourceNavigatorMessages.ResourceNavigator_sort);
-        menu.add(submenu);
-        submenu.add(sortByNameAction);
-        submenu.add(sortByTypeAction);
-        menu.add(filterAction);
-    }
-
-    public void updateActionBars() {
-        int criteria = navigator.getComparator().getCriteria();
-        sortByNameAction.setChecked(criteria == ResourceComparator.NAME);
-        sortByTypeAction.setChecked(criteria == ResourceComparator.TYPE);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/SortViewAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/SortViewAction.java
deleted file mode 100644
index b56bc2c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/SortViewAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-
-/**
- * Implementation of the view sorting actions.
- * @since 2.0
- */
-public class SortViewAction extends ResourceNavigatorAction {
-    private int sortCriteria;
-
-    /**
-     * Creates the action.
-     *
-     * @param navigator the resource navigator
-     * @param sortByType <code>true</code> for sort by type, <code>false</code> for sort by name
-     */
-    public SortViewAction(IResourceNavigator navigator, boolean sortByType) {
-        super(
-                navigator,
-                sortByType ? ResourceNavigatorMessages.SortView_byType : ResourceNavigatorMessages.SortView_byName);
-        if (sortByType) {
-            setToolTipText(ResourceNavigatorMessages.SortView_toolTipByType);
-        } else {
-            setToolTipText(ResourceNavigatorMessages.SortView_toolTipByName);
-        }
-        setEnabled(true);
-        sortCriteria = sortByType ? ResourceComparator.TYPE : ResourceComparator.NAME;
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				INavigatorHelpContextIds.SORT_VIEW_ACTION);
-    }
-
-    public void run() {
-        IResourceNavigator navigator = getNavigator();
-        ResourceComparator comparator = navigator.getComparator();
-
-        if (comparator == null) {
-			navigator.setComparator(new ResourceComparator(sortCriteria));
-		} else {
-			comparator.setCriteria(sortCriteria);
-            navigator.setComparator(comparator);
-        }
-
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/StringMatcher.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/StringMatcher.java
deleted file mode 100644
index c7dbaed..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/StringMatcher.java
+++ /dev/null
@@ -1,449 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import java.util.Vector;
-
-/**
- * A string pattern matcher, suppporting ?*? and ??? wildcards.
- */
-/* package */class StringMatcher {
-    protected String fPattern;
-
-    protected int fLength; // pattern length
-
-    protected boolean fIgnoreWildCards;
-
-    protected boolean fIgnoreCase;
-
-    protected boolean fHasLeadingStar;
-
-    protected boolean fHasTrailingStar;
-
-    protected String fSegments[]; //the given pattern is split into * separated segments
-
-    /* boundary value beyond which we don't need to search in the text */
-    protected int fBound = 0;
-
-    protected static final char fSingleWildCard = '\u0000';
-
-    public static class Position {
-        int start; //inclusive
-
-        int end; //exclusive
-
-        public Position(int start, int end) {
-            this.start = start;
-            this.end = end;
-        }
-
-        public int getStart() {
-            return start;
-        }
-
-        public int getEnd() {
-            return end;
-        }
-    }
-
-    /**
-     * StringMatcher constructor takes in a String object that is a simple 
-     * pattern which may contain '*' for 0 and many characters and
-     * '?' for exactly one character.  
-     *
-     * Literal '*' and '?' characters must be escaped in the pattern 
-     * e.g., "\*" means literal "*", etc.
-     *
-     * Escaping any other character (including the escape character itself), 
-     * just results in that character in the pattern.
-     * e.g., "\a" means "a" and "\\" means "\"
-     *
-     * If invoking the StringMatcher with string literals in Java, don't forget
-     * escape characters are represented by "\\".
-     *
-     * @param pattern the pattern to match text against
-     * @param ignoreCase if true, case is ignored
-     * @param ignoreWildCards if true, wild cards and their escape sequences are ignored
-     * 		  (everything is taken literally).
-     */
-    public StringMatcher(String pattern, boolean ignoreCase,
-            boolean ignoreWildCards) {
-        if (pattern == null) {
-			throw new IllegalArgumentException();
-		}
-        fIgnoreCase = ignoreCase;
-        fIgnoreWildCards = ignoreWildCards;
-        fPattern = pattern;
-        fLength = pattern.length();
-
-        if (fIgnoreWildCards) {
-            parseNoWildCards();
-        } else {
-            parseWildCards();
-        }
-    }
-
-    /**
-     * Find the first occurrence of the pattern between <code>start</code)(inclusive) 
-     * and <code>end</code>(exclusive).  
-     * @param <code>text</code>, the String object to search in 
-     * @param <code>start</code>, the starting index of the search range, inclusive
-     * @param <code>end</code>, the ending index of the search range, exclusive
-     * @return an <code>StringMatcher.Position</code> object that keeps the starting 
-     * (inclusive) and ending positions (exclusive) of the first occurrence of the 
-     * pattern in the specified range of the text; return null if not found or subtext
-     * is empty (start==end). A pair of zeros is returned if pattern is empty string
-     * Note that for pattern like "*abc*" with leading and trailing stars, position of "abc"
-     * is returned. For a pattern like"*??*" in text "abcdf", (1,3) is returned
-     */
-    public StringMatcher.Position find(String text, int start, int end) {
-        if (text == null) {
-			throw new IllegalArgumentException();
-		}
-
-        int tlen = text.length();
-        if (start < 0) {
-			start = 0;
-		}
-        if (end > tlen) {
-			end = tlen;
-		}
-        if (end < 0 || start >= end) {
-			return null;
-		}
-        if (fLength == 0) {
-			return new Position(start, start);
-		}
-        if (fIgnoreWildCards) {
-            int x = posIn(text, start, end);
-            if (x < 0) {
-				return null;
-			}
-            return new Position(x, x + fLength);
-        }
-
-        int segCount = fSegments.length;
-        if (segCount == 0) {
-			return new Position(start, end);
-		}
-
-        int curPos = start;
-        int matchStart = -1;
-        int i;
-        for (i = 0; i < segCount && curPos < end; ++i) {
-            String current = fSegments[i];
-            int nextMatch = regExpPosIn(text, curPos, end, current);
-            if (nextMatch < 0) {
-				return null;
-			}
-            if (i == 0) {
-				matchStart = nextMatch;
-			}
-            curPos = nextMatch + current.length();
-        }
-        if (i < segCount) {
-			return null;
-		}
-        return new Position(matchStart, curPos);
-    }
-
-    /**
-     * match the given <code>text</code> with the pattern 
-     * @return true if matched eitherwise false
-     * @param <code>text</code>, a String object 
-     */
-    public boolean match(String text) {
-        return match(text, 0, text.length());
-    }
-
-    /**
-     * Given the starting (inclusive) and the ending (exclusive) poisitions in the   
-     * <code>text</code>, determine if the given substring matches with aPattern  
-     * @return true if the specified portion of the text matches the pattern
-     * @param String <code>text</code>, a String object that contains the substring to match 
-     * @param int <code>start<code> marks the starting position (inclusive) of the substring
-     * @param int <code>end<code> marks the ending index (exclusive) of the substring 
-     */
-    public boolean match(String text, int start, int end) {
-        if (null == text) {
-			throw new IllegalArgumentException();
-		}
-
-        if (start > end) {
-			return false;
-		}
-
-        if (fIgnoreWildCards) {
-			return (end - start == fLength)
-                    && fPattern.regionMatches(fIgnoreCase, 0, text, start,
-                            fLength);
-		}
-        int segCount = fSegments.length;
-        if (segCount == 0 && (fHasLeadingStar || fHasTrailingStar)) {
-			return true;
-		}
-        if (start == end) {
-			return fLength == 0;
-		}
-        if (fLength == 0) {
-			return start == end;
-		}
-
-        int tlen = text.length();
-        if (start < 0) {
-			start = 0;
-		}
-        if (end > tlen) {
-			end = tlen;
-		}
-
-        int tCurPos = start;
-        int bound = end - fBound;
-        if (bound < 0) {
-			return false;
-		}
-        int i = 0;
-        String current = fSegments[i];
-        int segLength = current.length();
-
-        /* process first segment */
-        if (!fHasLeadingStar) {
-            if (!regExpRegionMatches(text, start, current, 0, segLength)) {
-                return false;
-            } else {
-                ++i;
-                tCurPos = tCurPos + segLength;
-            }
-        }
-        if ((fSegments.length == 1) && (!fHasLeadingStar)
-                && (!fHasTrailingStar)) {
-            // only one segment to match, no wildcards specified
-            return tCurPos == end;
-        }
-        /* process middle segments */
-        for (; i < segCount && tCurPos <= bound; ++i) {
-            current = fSegments[i];
-            int currentMatch;
-            int k = current.indexOf(fSingleWildCard);
-            if (k < 0) {
-                currentMatch = textPosIn(text, tCurPos, end, current);
-                if (currentMatch < 0) {
-					return false;
-				}
-            } else {
-                currentMatch = regExpPosIn(text, tCurPos, end, current);
-                if (currentMatch < 0) {
-					return false;
-				}
-            }
-            tCurPos = currentMatch + current.length();
-        }
-
-        /* process final segment */
-        if (!fHasTrailingStar && tCurPos != end) {
-            int clen = current.length();
-            return regExpRegionMatches(text, end - clen, current, 0, clen);
-        }
-        return i == segCount;
-    }
-
-    /**
-     * This method parses the given pattern into segments seperated by wildcard '*' characters.
-     * Since wildcards are not being used in this case, the pattern consists of a single segment.
-     */
-    private void parseNoWildCards() {
-        fSegments = new String[1];
-        fSegments[0] = fPattern;
-        fBound = fLength;
-    }
-
-    /**
-     * Parses the given pattern into segments seperated by wildcard '*' characters.
-     * @param p, a String object that is a simple regular expression with '*' and/or '?'
-     */
-    private void parseWildCards() {
-        if (fPattern.startsWith("*")) { //$NON-NLS-1$
-			fHasLeadingStar = true;
-		}
-        if (fPattern.endsWith("*")) {//$NON-NLS-1$
-            /* make sure it's not an escaped wildcard */
-            if (fLength > 1 && fPattern.charAt(fLength - 2) != '\\') {
-                fHasTrailingStar = true;
-            }
-        }
-
-        Vector temp = new Vector();
-
-        int pos = 0;
-        StringBuffer buf = new StringBuffer();
-        while (pos < fLength) {
-            char c = fPattern.charAt(pos++);
-            switch (c) {
-            case '\\':
-                if (pos >= fLength) {
-                    buf.append(c);
-                } else {
-                    char next = fPattern.charAt(pos++);
-                    /* if it's an escape sequence */
-                    if (next == '*' || next == '?' || next == '\\') {
-                        buf.append(next);
-                    } else {
-                        /* not an escape sequence, just insert literally */
-                        buf.append(c);
-                        buf.append(next);
-                    }
-                }
-                break;
-            case '*':
-                if (buf.length() > 0) {
-                    /* new segment */
-                    temp.addElement(buf.toString());
-                    fBound += buf.length();
-                    buf.setLength(0);
-                }
-                break;
-            case '?':
-                /* append special character representing single match wildcard */
-                buf.append(fSingleWildCard);
-                break;
-            default:
-                buf.append(c);
-            }
-        }
-
-        /* add last buffer to segment list */
-        if (buf.length() > 0) {
-            temp.addElement(buf.toString());
-            fBound += buf.length();
-        }
-
-        fSegments = new String[temp.size()];
-        temp.copyInto(fSegments);
-    }
-
-    /** 
-     * @param <code>text</code>, a string which contains no wildcard
-     * @param <code>start</code>, the starting index in the text for search, inclusive
-     * @param <code>end</code>, the stopping point of search, exclusive
-     * @return the starting index in the text of the pattern , or -1 if not found 
-     */
-    protected int posIn(String text, int start, int end) {//no wild card in pattern
-        int max = end - fLength;
-
-        if (!fIgnoreCase) {
-            int i = text.indexOf(fPattern, start);
-            if (i == -1 || i > max) {
-				return -1;
-			}
-            return i;
-        }
-
-        for (int i = start; i <= max; ++i) {
-            if (text.regionMatches(true, i, fPattern, 0, fLength)) {
-				return i;
-			}
-        }
-
-        return -1;
-    }
-
-    /** 
-     * @param <code>text</code>, a simple regular expression that may only contain '?'(s)
-     * @param <code>start</code>, the starting index in the text for search, inclusive
-     * @param <code>end</code>, the stopping point of search, exclusive
-     * @param <code>p</code>, a simple regular expression that may contains '?'
-     * @param <code>caseIgnored</code>, wether the pattern is not casesensitive
-     * @return the starting index in the text of the pattern , or -1 if not found 
-     */
-    protected int regExpPosIn(String text, int start, int end, String p) {
-        int plen = p.length();
-
-        int max = end - plen;
-        for (int i = start; i <= max; ++i) {
-            if (regExpRegionMatches(text, i, p, 0, plen)) {
-				return i;
-			}
-        }
-        return -1;
-    }
-
-    /**
-     * 
-     * @return boolean
-     * @param <code>text</code>, a String to match
-     * @param <code>start</code>, int that indicates the starting index of match, inclusive
-     * @param <code>end</code> int that indicates the ending index of match, exclusive
-     * @param <code>p</code>, String,  String, a simple regular expression that may contain '?'
-     * @param <code>ignoreCase</code>, boolean indicating wether code>p</code> is case sensitive
-     */
-    protected boolean regExpRegionMatches(String text, int tStart, String p,
-            int pStart, int plen) {
-        while (plen-- > 0) {
-            char tchar = text.charAt(tStart++);
-            char pchar = p.charAt(pStart++);
-
-            /* process wild cards */
-            if (!fIgnoreWildCards) {
-                /* skip single wild cards */
-                if (pchar == fSingleWildCard) {
-                    continue;
-                }
-            }
-            if (pchar == tchar) {
-				continue;
-			}
-            if (fIgnoreCase) {
-                if (Character.toUpperCase(tchar) == Character
-                        .toUpperCase(pchar)) {
-					continue;
-				}
-                // comparing after converting to upper case doesn't handle all cases;
-                // also compare after converting to lower case
-                if (Character.toLowerCase(tchar) == Character
-                        .toLowerCase(pchar)) {
-					continue;
-				}
-            }
-            return false;
-        }
-        return true;
-    }
-
-    /** 
-     * @param <code>text</code>, the string to match
-     * @param <code>start</code>, the starting index in the text for search, inclusive
-     * @param <code>end</code>, the stopping point of search, exclusive
-     * @param code>p</code>, a string that has no wildcard
-     * @param <code>ignoreCase</code>, boolean indicating wether code>p</code> is case sensitive
-     * @return the starting index in the text of the pattern , or -1 if not found 
-     */
-    protected int textPosIn(String text, int start, int end, String p) {
-
-        int plen = p.length();
-        int max = end - plen;
-
-        if (!fIgnoreCase) {
-            int i = text.indexOf(p, start);
-            if (i == -1 || i > max) {
-				return -1;
-			}
-            return i;
-        }
-
-        for (int i = 0; i <= max; ++i) {
-            if (text.regionMatches(true, i, p, 0, plen)) {
-				return i;
-			}
-        }
-
-        return -1;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ToggleLinkingAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ToggleLinkingAction.java
deleted file mode 100644
index b573d75..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/ToggleLinkingAction.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.navigator;
-
-/**
- * This action toggles whether this navigator links its selection to the active
- * editor.
- * 
- * @since 2.1
- */
-public class ToggleLinkingAction extends ResourceNavigatorAction {
-
-	private static final String COMMAND_ID = "org.eclipse.ui.navigate.linkWithEditor"; //$NON-NLS-1$
-
-	/**
-     * Constructs a new action.
-     */
-    public ToggleLinkingAction(IResourceNavigator navigator, String label) {
-        super(navigator, label);
-        setActionDefinitionId(COMMAND_ID);
-        setChecked(navigator.isLinkingEnabled());
-    }
-
-    /**
-     * Runs the action.
-     */
-    public void run() {
-        getNavigator().setLinkingEnabled(isChecked());
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/WorkspaceActionGroup.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/WorkspaceActionGroup.java
deleted file mode 100644
index 9dc5dd8..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/WorkspaceActionGroup.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - Images for menu items (27481)
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.ICommand;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.WorkspaceJob;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.BuildAction;
-import org.eclipse.ui.actions.CloseResourceAction;
-import org.eclipse.ui.actions.CloseUnrelatedProjectsAction;
-import org.eclipse.ui.actions.OpenResourceAction;
-import org.eclipse.ui.actions.RefreshAction;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.ide.IDEActionFactory;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.StatusUtil;
-
-/**
- * This is the action group for workspace actions such as Build, Refresh Local,
- * and Open/Close Project.
- */
-public class WorkspaceActionGroup extends ResourceNavigatorActionGroup {
-
-    private BuildAction buildAction;
-
-    private OpenResourceAction openProjectAction;
-
-    private CloseResourceAction closeProjectAction;
-    
-    private CloseUnrelatedProjectsAction closeUnrelatedProjectsAction;
-
-    private RefreshAction refreshAction;
-
-    public WorkspaceActionGroup(IResourceNavigator navigator) {
-        super(navigator);
-    }
-
-    public void fillActionBars(IActionBars actionBars) {
-        actionBars.setGlobalActionHandler(ActionFactory.REFRESH.getId(),
-                refreshAction);
-        actionBars.setGlobalActionHandler(IDEActionFactory.BUILD_PROJECT
-                .getId(), buildAction);
-        actionBars.setGlobalActionHandler(
-                IDEActionFactory.OPEN_PROJECT.getId(), openProjectAction);
-        actionBars.setGlobalActionHandler(IDEActionFactory.CLOSE_PROJECT
-                .getId(), closeProjectAction);
-        actionBars.setGlobalActionHandler(IDEActionFactory.CLOSE_UNRELATED_PROJECTS
-                .getId(), closeUnrelatedProjectsAction);
-    }
-
-    /**
-     * Adds the build, open project, close project and refresh resource
-     * actions to the context menu.
-     * <p>
-     * The following conditions apply: 
-     * 	build-only projects selected, auto build disabled, at least one 
-     * 		builder present
-     * 	open project-only projects selected, at least one closed project
-     * 	close project-only projects selected, at least one open project
-     * 	refresh-no closed project selected
-     * </p>
-     * <p>
-     * Both the open project and close project action may be on the menu
-     * at the same time.
-     * </p>
-     * <p>
-     * No disabled action should be on the context menu.
-     * </p>
-     * 
-     * @param menu context menu to add actions to
-     */
-    public void fillContextMenu(IMenuManager menu) {
-        IStructuredSelection selection = (IStructuredSelection) getContext()
-                .getSelection();
-        boolean isProjectSelection = true;
-        boolean hasOpenProjects = false;
-        boolean hasClosedProjects = false;
-        boolean hasBuilder = true; // false if any project is closed or does not have builder 
-        Iterator resources = selection.iterator();
-
-        while (resources.hasNext()
-                && (!hasOpenProjects || !hasClosedProjects || hasBuilder || isProjectSelection)) {
-            Object next = resources.next();
-            IProject project = null;
-
-            if (next instanceof IProject) {
-				project = (IProject) next;
-			} else if (next instanceof IAdaptable) {
-				project = (IProject) ((IAdaptable) next)
-                        .getAdapter(IProject.class);
-			}
-
-            if (project == null) {
-                isProjectSelection = false;
-                continue;
-            }
-            if (project.isOpen()) {
-                hasOpenProjects = true;
-                if (hasBuilder && !hasBuilder(project)) {
-					hasBuilder = false;
-				}
-            } else {
-                hasClosedProjects = true;
-                hasBuilder = false;
-            }
-        }
-        if (!selection.isEmpty() && isProjectSelection
-                && !ResourcesPlugin.getWorkspace().isAutoBuilding()
-                && hasBuilder) {
-            // Allow manual incremental build only if auto build is off.
-            buildAction.selectionChanged(selection);
-            menu.add(buildAction);
-        }
-        if (!hasClosedProjects) {
-            refreshAction.selectionChanged(selection);
-            menu.add(refreshAction);
-        }
-        if (isProjectSelection) {
-            if (hasClosedProjects) {
-                openProjectAction.selectionChanged(selection);
-                menu.add(openProjectAction);
-            }
-            if (hasOpenProjects) {
-                closeProjectAction.selectionChanged(selection);
-                menu.add(closeProjectAction);
-                closeUnrelatedProjectsAction.selectionChanged(selection);
-                menu.add(closeUnrelatedProjectsAction);
-            }
-        }
-    }
-
-    /**
-     * Handles a key pressed event by invoking the appropriate action.
-     */
-    public void handleKeyPressed(KeyEvent event) {
-        if (event.keyCode == SWT.F5 && event.stateMask == 0) {
-            if (refreshAction.isEnabled()) {
-                refreshAction.refreshAll();
-            }
-
-            // Swallow the event
-            event.doit = false;
-        }
-    }
-
-    /**
-     * Returns whether there are builders configured on the given project.
-     *
-     * @return <code>true</code> if it has builders,
-     *   <code>false</code> if not, or if this could not be determined
-     */
-    boolean hasBuilder(IProject project) {
-        try {
-            ICommand[] commands = project.getDescription().getBuildSpec();
-            if (commands.length > 0) {
-				return true;
-			}
-        } catch (CoreException e) {
-            // Cannot determine if project has builders. Project is closed 
-            // or does not exist. Fall through to return false.
-        }
-        return false;
-    }
-
-    protected void makeActions() {
-        final IShellProvider provider = navigator.getSite();
-        openProjectAction = new OpenResourceAction(provider);
-        closeProjectAction = new CloseResourceAction(provider);
-        closeUnrelatedProjectsAction = new CloseUnrelatedProjectsAction(provider);
-        refreshAction = new RefreshAction(provider) {
-        	public void run() {
-        		final IStatus[] errorStatus = new IStatus[1];
-        		errorStatus[0] = Status.OK_STATUS;
-        		final WorkspaceModifyOperation op = (WorkspaceModifyOperation) createOperation(errorStatus);
-        		WorkspaceJob job = new WorkspaceJob("refresh") { //$NON-NLS-1$
-
-        			public IStatus runInWorkspace(IProgressMonitor monitor)
-        					throws CoreException {
-        				try {
-        					op.run(monitor);
-        					Shell shell = provider.getShell();
-							if (shell != null && !shell.isDisposed()) {
-								shell.getDisplay().asyncExec(new Runnable() {
-									public void run() {
-										TreeViewer viewer = navigator
-												.getViewer();
-										if (viewer != null
-												&& viewer.getControl() != null
-												&& !viewer.getControl()
-														.isDisposed()) {
-											viewer.refresh();
-										}
-									}
-								});
-							}
-        				} catch (InvocationTargetException e) {
-        					String msg = NLS.bind(
-        							IDEWorkbenchMessages.WorkspaceAction_logTitle, getClass()
-        									.getName(), e.getTargetException());
-        					throw new CoreException(StatusUtil.newStatus(IStatus.ERROR,
-        							msg, e.getTargetException()));
-        				} catch (InterruptedException e) {
-        					return Status.CANCEL_STATUS;
-        				}
-        				return errorStatus[0];
-        			}
-        			
-        		};
-        		ISchedulingRule rule = op.getRule();
-        		if (rule != null) {
-        			job.setRule(rule);
-        		}
-        		job.setUser(true);
-        		job.schedule();
-        	}
-        };
-        refreshAction
-                .setDisabledImageDescriptor(getImageDescriptor("dlcl16/refresh_nav.gif"));//$NON-NLS-1$
-        refreshAction
-                .setImageDescriptor(getImageDescriptor("elcl16/refresh_nav.gif"));//$NON-NLS-1$	
-        buildAction = new BuildAction(provider,
-                IncrementalProjectBuilder.INCREMENTAL_BUILD);
-    }
-
-    public void updateActionBars() {
-        IStructuredSelection selection = (IStructuredSelection) getContext()
-                .getSelection();
-        refreshAction.selectionChanged(selection);
-        buildAction.selectionChanged(selection);
-        openProjectAction.selectionChanged(selection);
-        closeUnrelatedProjectsAction.selectionChanged(selection);
-        closeProjectAction.selectionChanged(selection);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/package.html b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/package.html
deleted file mode 100644
index c0507a1..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/navigator/package.html
+++ /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="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides the standard Resource Navigator view which
-presents the tree of resources in the workspace.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/properties/FilePropertySource.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/properties/FilePropertySource.java
deleted file mode 100644
index 0425926..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/properties/FilePropertySource.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.osgi.util.TextProcessor;
-import org.eclipse.ui.internal.ide.dialogs.IDEResourceInfoUtils;
-
-/**
- * The FilePropertySource gives the extra information that is shown for files
- */
-public class FilePropertySource extends ResourcePropertySource {
-
-    private static PropertyDescriptor fileDescriptor;
-    static {
-        fileDescriptor = new PropertyDescriptor(
-                IResourcePropertyConstants.P_SIZE_RES,
-                IResourcePropertyConstants.P_DISPLAY_SIZE);
-        fileDescriptor.setAlwaysIncompatible(true);
-        fileDescriptor
-                .setCategory(IResourcePropertyConstants.P_FILE_SYSTEM_CATEGORY);
-    }
-
-    /**
-     * Creates an property source for a file resource.
-     * @param file the file resource
-     */
-    public FilePropertySource(IFile file) {
-        super(file);
-    }
-
-    /**
-     * Get a PropertyDescriptor that defines the size property
-     * @return the PropertyDescriptor
-     */
-    private static PropertyDescriptor getInitialPropertyDescriptor() {
-        return fileDescriptor;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource.
-     */
-    public IPropertyDescriptor[] getPropertyDescriptors() {
-        IPropertyDescriptor[] superDescriptors = super.getPropertyDescriptors();
-        int superLength = superDescriptors.length;
-        IPropertyDescriptor[] fileDescriptors = new IPropertyDescriptor[superLength + 1];
-        System.arraycopy(superDescriptors, 0, fileDescriptors, 0, superLength);
-        fileDescriptors[superLength] = getInitialPropertyDescriptor();
-
-        return fileDescriptors;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource.
-     */
-    public Object getPropertyValue(Object key) {
-    	Object returnValue = (key.equals(IBasicPropertyConstants.P_TEXT)) ? TextProcessor
-				.process(element.getName())
-				: super.getPropertyValue(key);
-
-        if (returnValue != null) {
-			return returnValue;
-		}
-
-        if (key.equals(IResourcePropertyConstants.P_SIZE_RES)) {
-			return IDEResourceInfoUtils.getSizeString((IFile) element);
-		}
-        return null;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/properties/IDEPropertiesMessages.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/properties/IDEPropertiesMessages.java
deleted file mode 100644
index e2a17be..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/properties/IDEPropertiesMessages.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.properties;
-
-
-/**
- * Utility class which helps manage messages.
- * @deprecated These messages are not API and should not be referenced
- * outside of this plug-in.
- */
-class IDEPropertiesMessages {
-    private IDEPropertiesMessages() {
-        // prevent instantiation of class
-    }
-
-    /**
-     * Returns the formatted message for the given key in
-     * the resource bundle. 
-     *
-     * @param key the resource name
-     * @param args the message arguments
-     * @return the string
-     */
-    public static String format(String key, Object[] args) {
-        return key;
-    }
-
-    /**
-     * Returns the resource object with the given key in
-     * the resource bundle. If there isn't any value under
-     * the given key, the key is returned.
-     *
-     * @param key the resource name
-     * @return the string
-     */
-    public static String getString(String key) {
-        return key;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/properties/IResourcePropertyConstants.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/properties/IResourcePropertyConstants.java
deleted file mode 100644
index 32408c9..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/properties/IResourcePropertyConstants.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.ui.internal.views.properties.IDEPropertiesMessages;
-
-/**
- * This interface documents the property constants used by the resource
- * property source.
- */
-public interface IResourcePropertyConstants {
-    /** 
-     * The <code>IResource</code> property key for name.
-     */
-    public static final String P_LABEL_RES = IDEPropertiesMessages.IResourcePropertyConstants_name;
-
-    /** 
-     * The <code>IResource</code> property key for path.
-     */
-    public static final String P_PATH_RES = "org.eclipse.ui.path"; //$NON-NLS-1$
-
-    /** 
-     * The <code>IResource</code> property key for display path.
-     */
-    public static final String P_DISPLAYPATH_RES = IDEPropertiesMessages.IResourcePropertyConstants_path;
-
-    /** 
-     * The <code>IResource</code> property key for read-only.
-     */
-    public static final String P_EDITABLE_RES = "org.eclipse.ui.editable"; //$NON-NLS-1$
-
-    /** 
-     * The <code>IResource</code> property key for display read-only.
-     */
-    public static final String P_DISPLAYEDITABLE_RES = IDEPropertiesMessages.IResourcePropertyConstants_editable;
-
-    /** 
-     * The <code>IResource</code> property key for read-only.
-     */
-    public static final String P_DERIVED_RES = "org.eclipse.ui.derived"; //$NON-NLS-1$
-
-    /** 
-     * The <code>IResource</code> property key for display read-only.
-     */
-    public static final String P_DISPLAYDERIVED_RES = IDEPropertiesMessages.IResourcePropertyConstants_derived;
-
-    /** 
-     * The <code>IResource</code> property key for location.
-     */
-    public static final String P_LOCATION_RES = "org.eclipse.ui.location"; //$NON-NLS-1$
-
-    /** 
-     * The <code>IResource</code> property key for display location.
-     */
-    public static final String P_DISPLAYLOCATION_RES = IDEPropertiesMessages.IResourcePropertyConstants_location;
-
-    /** 
-     * The <code>IResource</code> property key for resolved location.
-     */
-    public static final String P_RESOLVED_LOCATION_RES = "org.eclipse.ui.resolvedLocation"; //$NON-NLS-1$,
-
-    /** 
-     * The <code>IResource</code> property key for display resolved location.
-     */
-    public static final String P_DISPLAYRESOLVED_LOCATION_RES = IDEPropertiesMessages.IResourcePropertyConstants_resolvedLocation;
-
-    /** 
-     * The <code>IResource</code> property key for linked.
-     */
-    public static final String P_LINKED_RES = "org.eclipse.ui.linked"; //$NON-NLS-1$,
-
-    /** 
-     * The <code>IResource</code> property key for display linked.
-     */
-    public static final String P_DISPLAYLINKED_RES = IDEPropertiesMessages.IResourcePropertyConstants_linked;
-
-    /**
-     * The <code>IResource</code> category for the base values
-     */
-    public static final String P_FILE_SYSTEM_CATEGORY = IDEPropertiesMessages.IResourcePropertyConstants_info;
-
-    /** 
-     * The <code>IResource</code> property key for path.
-     */
-    public static final String P_SIZE_RES = "org.eclipse.ui.size"; //$NON-NLS-1$
-
-    /**
-     * The <code>IResource</code> property key for displaying size
-     */
-    public static final String P_DISPLAY_SIZE = IDEPropertiesMessages.IResourcePropertyConstants_size;
-
-    /** 
-     * The <code>IResource</code> property key for path.
-     */
-    public static final String P_LAST_MODIFIED_RES = "org.eclipse.ui.lastmodified"; //$NON-NLS-1$
-
-    /**
-     * The <code>IResource</code> category for last modified
-     */
-    public static final String P_DISPLAY_LAST_MODIFIED = IDEPropertiesMessages.IResourcePropertyConstants_lastModified;
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/properties/ResourcePropertySource.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/properties/ResourcePropertySource.java
deleted file mode 100644
index ebbe290..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/properties/ResourcePropertySource.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import java.io.File;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourceAttributes;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.osgi.util.TextProcessor;
-import org.eclipse.ui.internal.ide.dialogs.IDEResourceInfoUtils;
-import org.eclipse.ui.internal.views.properties.IDEPropertiesMessages;
-
-/**
- * A Resource property source.
- */
-public class ResourcePropertySource implements IPropertySource {
-    protected static String NOT_LOCAL_TEXT = IDEPropertiesMessages.PropertySource_notLocal;
-
-    protected static String FILE_NOT_FOUND = IDEPropertiesMessages.PropertySource_notFound;
-
-    protected static String UNDEFINED_PATH_VARIABLE = IDEPropertiesMessages.PropertySource_undefinedPathVariable;
-
-    protected static String FILE_NOT_EXIST_TEXT = IDEPropertiesMessages.PropertySource_fileNotExist;
-
-    // The element for the property source
-    protected IResource element;
-
-    // Error message when setting a property incorrectly
-    protected String errorMessage = IDEPropertiesMessages.PropertySource_readOnly;
-
-    // Property Descriptors
-    static protected IPropertyDescriptor[] propertyDescriptors = new IPropertyDescriptor[7];
-
-    static protected IPropertyDescriptor[] propertyDescriptorsLinkVariable = new IPropertyDescriptor[8];
-    static {
-        PropertyDescriptor descriptor;
-
-        // resource name
-        descriptor = new PropertyDescriptor(IBasicPropertyConstants.P_TEXT,
-                IResourcePropertyConstants.P_LABEL_RES);
-        descriptor.setAlwaysIncompatible(true);
-        descriptor
-                .setCategory(IResourcePropertyConstants.P_FILE_SYSTEM_CATEGORY);
-        propertyDescriptors[0] = descriptor;
-        propertyDescriptorsLinkVariable[0] = descriptor;
-
-        // Relative path
-        descriptor = new PropertyDescriptor(
-                IResourcePropertyConstants.P_PATH_RES,
-                IResourcePropertyConstants.P_DISPLAYPATH_RES);
-        descriptor.setAlwaysIncompatible(true);
-        descriptor
-                .setCategory(IResourcePropertyConstants.P_FILE_SYSTEM_CATEGORY);
-        propertyDescriptors[1] = descriptor;
-        propertyDescriptorsLinkVariable[1] = descriptor;
-
-        // readwrite state
-        descriptor = new PropertyDescriptor(
-                IResourcePropertyConstants.P_EDITABLE_RES,
-                IResourcePropertyConstants.P_DISPLAYEDITABLE_RES);
-        descriptor.setAlwaysIncompatible(true);
-        descriptor
-                .setCategory(IResourcePropertyConstants.P_FILE_SYSTEM_CATEGORY);
-        propertyDescriptors[2] = descriptor;
-        propertyDescriptorsLinkVariable[2] = descriptor;
-
-        // derived state
-        descriptor = new PropertyDescriptor(
-                IResourcePropertyConstants.P_DERIVED_RES,
-                IResourcePropertyConstants.P_DISPLAYDERIVED_RES);
-        descriptor.setAlwaysIncompatible(true);
-        descriptor
-                .setCategory(IResourcePropertyConstants.P_FILE_SYSTEM_CATEGORY);
-        propertyDescriptors[3] = descriptor;
-        propertyDescriptorsLinkVariable[3] = descriptor;
-
-        // last modified state
-        descriptor = new PropertyDescriptor(
-                IResourcePropertyConstants.P_LAST_MODIFIED_RES,
-                IResourcePropertyConstants.P_DISPLAY_LAST_MODIFIED);
-        descriptor.setAlwaysIncompatible(true);
-        descriptor
-                .setCategory(IResourcePropertyConstants.P_FILE_SYSTEM_CATEGORY);
-        propertyDescriptors[4] = descriptor;
-        propertyDescriptorsLinkVariable[4] = descriptor;
-
-        // link state
-        descriptor = new PropertyDescriptor(
-                IResourcePropertyConstants.P_LINKED_RES,
-                IResourcePropertyConstants.P_DISPLAYLINKED_RES);
-        descriptor.setAlwaysIncompatible(true);
-        descriptor
-                .setCategory(IResourcePropertyConstants.P_FILE_SYSTEM_CATEGORY);
-        propertyDescriptors[5] = descriptor;
-        propertyDescriptorsLinkVariable[5] = descriptor;
-
-        // location
-        descriptor = new PropertyDescriptor(
-                IResourcePropertyConstants.P_LOCATION_RES,
-                IResourcePropertyConstants.P_DISPLAYLOCATION_RES);
-        descriptor.setAlwaysIncompatible(true);
-        descriptor
-                .setCategory(IResourcePropertyConstants.P_FILE_SYSTEM_CATEGORY);
-        propertyDescriptors[6] = descriptor;
-        propertyDescriptorsLinkVariable[6] = descriptor;
-
-        // resolved location
-        descriptor = new PropertyDescriptor(
-                IResourcePropertyConstants.P_RESOLVED_LOCATION_RES,
-                IResourcePropertyConstants.P_DISPLAYRESOLVED_LOCATION_RES);
-        descriptor.setAlwaysIncompatible(true);
-        descriptor
-                .setCategory(IResourcePropertyConstants.P_FILE_SYSTEM_CATEGORY);
-        propertyDescriptorsLinkVariable[7] = descriptor;
-
-    }
-
-    /**
-     * Creates a PropertySource and stores its IResource
-     *
-     * @param res the resource for which this is a property source
-     */
-    public ResourcePropertySource(IResource res) {
-        Assert.isNotNull(res);
-        this.element = res;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource.
-     */
-    public Object getEditableValue() {
-        return this;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource.
-     */
-    public IPropertyDescriptor[] getPropertyDescriptors() {
-        if (isPathVariable(element)) {
-			return propertyDescriptorsLinkVariable;
-		}
-		return propertyDescriptors;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource.
-     */
-    public Object getPropertyValue(Object name) {
-        if (name.equals(IBasicPropertyConstants.P_TEXT)) {
-            return element.getName();
-        }
-        if (name.equals(IResourcePropertyConstants.P_PATH_RES)) {
-            return TextProcessor.process(element.getFullPath().toString());
-        }
-        if (name.equals(IResourcePropertyConstants.P_LAST_MODIFIED_RES)) {
-            return IDEResourceInfoUtils.getDateStringValue(element);
-        }
-        if (name.equals(IResourcePropertyConstants.P_EDITABLE_RES)) {
-            final ResourceAttributes attributes = element.getResourceAttributes();
-			if (attributes == null || attributes.isReadOnly()) {
-				return IDEPropertiesMessages.ResourceProperty_false;
-			} 
-			return IDEPropertiesMessages.ResourceProperty_true;
-        }
-        if (name.equals(IResourcePropertyConstants.P_DERIVED_RES)) {
-            if (element.isDerived())
-            	return IDEPropertiesMessages.ResourceProperty_true;
-        	return IDEPropertiesMessages.ResourceProperty_false;
-        }
-        if (name.equals(IResourcePropertyConstants.P_LINKED_RES)) {
-        	if (element.isLinked())
-        		return IDEPropertiesMessages.ResourceProperty_true;
-        	return IDEPropertiesMessages.ResourceProperty_false;
-        }
-        if (name.equals(IResourcePropertyConstants.P_LOCATION_RES)) {
-            return TextProcessor.process(IDEResourceInfoUtils.getLocationText(element));
-        }
-        if (name.equals(IResourcePropertyConstants.P_RESOLVED_LOCATION_RES)) {
-            return TextProcessor.process(IDEResourceInfoUtils.getResolvedLocationText(element));
-        }
-        return null;
-    }
-
-    /**
-     * Returns whether the given resource is a linked resource bound 
-     * to a path variable.
-     * 
-     * @param resource resource to test
-     * @return boolean <code>true</code> the given resource is a linked 
-     * 	resource bound to a path variable. <code>false</code> the given 
-     * 	resource is either not a linked resource or it is not using a
-     * 	path variable.  
-     */
-    private boolean isPathVariable(IResource resource) {
-        if (!resource.isLinked()) {
-			return false;
-		}
-
-        IPath resolvedLocation = resource.getLocation();
-        if (resolvedLocation == null) {
-            // missing path variable
-            return true;
-        }
-        IPath rawLocation = resource.getRawLocation();
-        if (resolvedLocation.equals(rawLocation)) {
-			return false;
-		}
-
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource.
-     */
-    public boolean isPropertySet(Object property) {
-        return false;
-    }
-
-    /**
-     * The <code>ResourcePropertySource</code> implementation of this
-     * <code>IPropertySource</code> method does nothing since all
-     * properties are read-only.
-     */
-    public void resetPropertyValue(Object property) {
-    }
-
-    /**
-     * The <code>ResourcePropertySource</code> implementation of this
-     * <code>IPropertySource</code> method does nothing since all
-     * properties are read-only.
-     */
-    public void setPropertyValue(Object name, Object value) {
-    }
-
-    /** 
-     * Get the java.io.File equivalent of the passed
-     * IFile. If the location does not exist then return
-     * <code>null</code>
-     * @param resource the resource to lookup
-     * @return java.io.File or <code>null</code>.
-     */
-    protected File getFile(IResource resource) {
-        IPath location = resource.getLocation();
-        if (location == null) {
-			return null;
-		}
-		return location.toFile();
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/CopyTaskAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/CopyTaskAction.java
deleted file mode 100644
index 26bb730..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/CopyTaskAction.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.views.tasklist.TaskListMessages;
-import org.eclipse.ui.part.MarkerTransfer;
-
-/**
- * Copies a task to the clipboard.
- */
-class CopyTaskAction extends TaskAction {
- 
-	/**
-     * Creates the action.
-	 * @param tasklist the task list
-	 * @param id the id
-     */
-    public CopyTaskAction(TaskList tasklist, String id) {
-        super(tasklist, id);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				ITaskListHelpContextIds.COPY_TASK_ACTION);
-    }
-
-    /**
-     * Performs this action.
-     */
-    public void run() {
-        // Get the selected markers
-        TaskList taskList = getTaskList();
-        TableViewer viewer = taskList.getTableViewer();
-        IStructuredSelection selection = (IStructuredSelection) viewer
-                .getSelection();
-        if (selection.isEmpty()) {
-            return;
-        }
-        taskList.cancelEditing();
-        List list = selection.toList();
-        IMarker[] markers = new IMarker[list.size()];
-        list.toArray(markers);
-
-        setClipboard(markers, TaskList.createMarkerReport(markers));
-
-        //Update paste enablement
-        taskList.updatePasteEnablement();
-    }
-
-    private void setClipboard(IMarker[] markers, String markerReport) {
-        try {
-            // Place the markers on the clipboard
-            Object[] data = new Object[] { markers, markerReport };
-            Transfer[] transferTypes = new Transfer[] {
-                    MarkerTransfer.getInstance(), TextTransfer.getInstance() };
-
-            // set the clipboard contents
-            getTaskList().getClipboard().setContents(data, transferTypes);
-        } catch (SWTError e) {
-            if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD) {
-				throw e;
-			}
-            if (MessageDialog
-                    .openQuestion(
-                            getShell(),
-                            TaskListMessages.CopyToClipboardProblemDialog_title, TaskListMessages.CopyToClipboardProblemDialog_message)) {
-				setClipboard(markers, markerReport);
-			}
-        }
-    }
-}
-
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/DefaultTaskListResourceAdapter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/DefaultTaskListResourceAdapter.java
deleted file mode 100644
index 13527a2..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/DefaultTaskListResourceAdapter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * The DefaultTaskListResourceAdapter is the default
- * implementation of the ITaskListResourceAdapter used by the
- * TaskList for resource adaption.
- */
-class DefaultTaskListResourceAdapter implements ITaskListResourceAdapter {
-
-    private static ITaskListResourceAdapter singleton;
-
-    /**
-     * Constructor for DefaultTaskListResourceAdapter.
-     */
-    DefaultTaskListResourceAdapter() {
-        super();
-    }
-
-    /**
-     * Return the default instance used for TaskList adapting.
-     */
-    static ITaskListResourceAdapter getDefault() {
-        if (singleton == null) {
-			singleton = new DefaultTaskListResourceAdapter();
-		}
-        return singleton;
-    }
-
-    /*
-     * @see ITaskListResourceAdapter#getAffectedResource(IAdaptable)
-     */
-    public IResource getAffectedResource(IAdaptable adaptable) {
-
-        IResource resource = (IResource) adaptable.getAdapter(IResource.class);
-        if (resource == null) {
-			return (IFile) adaptable.getAdapter(IFile.class);
-		} else {
-			return resource;
-		}
-
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/FiltersAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/FiltersAction.java
deleted file mode 100644
index e35524a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/FiltersAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import org.eclipse.jface.window.Window;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This action opens an editor for the resource
- * associated with the selected marker, and
- * jumps to the marker's location in the editor.
- */
-class FiltersAction extends TaskAction {
-
-    /**
-     * Creates the action.
-     * @param tasklist the task list
-     * @param id the id
-     */
-    public FiltersAction(TaskList tasklist, String id) {
-        super(tasklist, id);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				ITaskListHelpContextIds.FILTERS_ACTION);
-    }
-
-    /**
-     * Performs this action.
-     */
-    public void run() {
-        FiltersDialog dialog = new FiltersDialog(getShell());
-        TasksFilter filter = getTaskList().getFilter();
-        dialog.setFilter(filter);
-        int result = dialog.open();
-        if (result == Window.OK) {
-            getTaskList().filterChanged();
-        }
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/FiltersDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/FiltersDialog.java
deleted file mode 100644
index c805300..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/FiltersDialog.java
+++ /dev/null
@@ -1,963 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import com.ibm.icu.text.Collator; 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TrayDialog;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-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.Label;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
-import org.eclipse.ui.internal.views.tasklist.TaskListMessages;
-
-class FiltersDialog extends TrayDialog {
-    /**
-     * ID for the Reset button
-     */
-    static final int RESET_ID = IDialogConstants.CLIENT_ID;
-
-    static final int SELECT_ID = IDialogConstants.CLIENT_ID + 1;
-
-    private static class EnumValue {
-        private int value;
-
-        private String text;
-
-        private Image image;
-
-        EnumValue(int value, String text, Image image) {
-            this.value = value;
-            this.text = text;
-            this.image = image;
-        }
-
-        int getValue() {
-            return value;
-        }
-
-        String getText() {
-            return text;
-        }
-
-        Image getImage() {
-            return image;
-        }
-    }
-
-    private static class EnumType {
-        private EnumValue[] values;
-
-        EnumType(EnumValue[] values) {
-            this.values = values;
-        }
-
-        EnumValue[] getValues() {
-            return values;
-        }
-    }
-
-    private EnumType severityType;
-
-    private EnumType priorityType;
-
-    private EnumType completionType;
-
-    private class CheckboxEnumGroup {
-        private EnumType type;
-
-        private Button enableButton;
-
-        private Button[] valueButtons;
-
-        CheckboxEnumGroup(Composite parent, String text, EnumType type) {
-            this.type = type;
-            // although not needed for layout, this composite is needed to get the tab order right
-            Composite enableComposite = new Composite(parent, SWT.NONE);
-            enableComposite
-                    .setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            enableComposite.setLayout(new FillLayout());
-            enableButton = new Button(enableComposite, SWT.CHECK);
-            enableButton.addSelectionListener(selectionListener);
-            enableButton.setText(text);
-            Composite valueComposite = new Composite(parent, SWT.NONE);
-            valueComposite
-                    .setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-            valueComposite.setLayout(new FillLayout());
-            EnumValue[] values = type.getValues();
-            valueButtons = new Button[values.length];
-            for (int i = 0; i < values.length; ++i) {
-                Button valueButton = new Button(valueComposite, SWT.CHECK);
-                valueButton.setText(values[i].getText());
-                valueButtons[i] = valueButton;
-            }
-        }
-
-        boolean getEnabled() {
-            return enableButton.getEnabled();
-        }
-
-        void setEnabled(boolean enabled) {
-            enableButton.setEnabled(enabled);
-            updateEnabledState();
-        }
-
-        boolean getSelection() {
-            return enableButton.getSelection();
-        }
-
-        void setSelection(boolean selected) {
-            enableButton.setSelection(selected);
-            updateEnabledState();
-        }
-
-        void updateEnabledState() {
-            boolean enabled = enableButton.isEnabled()
-                    && enableButton.getSelection();
-            for (int i = 0; i < valueButtons.length; ++i) {
-                valueButtons[i].setEnabled(enabled);
-            }
-        }
-
-        int getValueMask() {
-            int mask = 0;
-            EnumValue[] values = type.getValues();
-            for (int i = 0; i < valueButtons.length; ++i) {
-                if (valueButtons[i].getSelection()) {
-                    mask |= (1 << values[i].getValue());
-                }
-            }
-            return mask;
-        }
-
-        void setValueMask(int mask) {
-            EnumValue[] values = type.getValues();
-            for (int i = 0; i < values.length; ++i) {
-                valueButtons[i]
-                        .setSelection((mask & (1 << values[i].getValue())) != 0);
-            }
-        }
-    }
-
-    private class LabelComboTextGroup {
-        Label label;
-
-        Combo combo;
-
-        Text text;
-
-        LabelComboTextGroup(Composite parent, String labelText,
-                String[] comboStrings, String initialText, int widthHint) {
-            Font font = parent.getFont();
-            Composite group = new Composite(parent, SWT.NONE);
-            GridLayout layout = new GridLayout();
-            layout.numColumns = 3;
-            //Set the margin width to 0 in order to line up with other items
-            layout.marginWidth = 0;
-            group.setLayout(layout);
-            group.setFont(font);
-            label = new Label(group, SWT.NONE);
-            label.setText(labelText);
-            label.setFont(font);
-            combo = createCombo(group, comboStrings, 0);
-            text = new Text(parent, SWT.SINGLE | SWT.BORDER);
-            GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-            gridData.widthHint = widthHint;
-            text.setLayoutData(gridData);
-            text.setFont(font);
-            text.setText(initialText);
-        }
-    }
-
-    /**
-     * Creates and manages a group of widgets for selecting a working 
-     * set task filter.
-     */
-    private class WorkingSetGroup {
-        private Button button;
-
-        /**
-         * Creates the working set filter selection widgets.
-         * 
-         * @param parent the parent composite of the working set widgets
-         */
-        WorkingSetGroup(Composite parent) {
-            // radio button has to be part of main radio button group
-            button = createRadioButton(parent, TaskListMessages.TaskList_noWorkingSet);
-            GridData data = new GridData(GridData.FILL_HORIZONTAL);
-            button.setLayoutData(data);
-
-            Composite composite = new Composite(parent, SWT.NONE);
-            composite.setFont(parent.getFont());
-            GridLayout layout = new GridLayout();
-            Button radio = new Button(parent, SWT.RADIO);
-            layout.marginWidth = radio.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
-            layout.marginHeight = 0;
-            radio.dispose();
-            composite.setLayout(layout);
-            createButton(composite, SELECT_ID, TaskListMessages.TaskList_workingSetSelect, false);
-        }
-
-        /**
-         * Returns wether or not a working set filter should be used
-         * 
-         * @return 
-         * 	true=a working set filter should be used
-         * 	false=a working set filter should not be used
-         */
-        boolean getSelection() {
-            return button.getSelection();
-        }
-
-        /**
-         * Returns the selected working set filter or null if none 
-         * is selected.
-         * 
-         * @return the selected working set filter or null if none 
-         * 	is selected.
-         */
-        IWorkingSet getWorkingSet() {
-            return (IWorkingSet) button.getData();
-        }
-
-        /**
-         * Sets the working set filter selection.
-         * 
-         * @param selected true=a working set filter should be used
-         * 	false=no working set filter should be used
-         */
-        void setSelection(boolean selected) {
-            button.setSelection(selected);
-            if (selected) {
-                anyResourceButton.setSelection(false);
-                anyResourceInSameProjectButton.setSelection(false);
-                selectedResourceButton.setSelection(false);
-                selectedResourceAndChildrenButton.setSelection(false);
-            }
-        }
-
-        /**
-         * Opens the working set selection dialog.
-         */
-        void selectPressed() {
-            IWorkingSetSelectionDialog dialog = PlatformUI.getWorkbench()
-                    .getWorkingSetManager().createWorkingSetSelectionDialog(
-                            getShell(), false);
-            IWorkingSet workingSet = getWorkingSet();
-
-            if (workingSet != null) {
-                dialog.setSelection(new IWorkingSet[] { workingSet });
-            }
-            if (dialog.open() == Window.OK) {
-                IWorkingSet[] result = dialog.getSelection();
-                if (result != null && result.length > 0) {
-                    setWorkingSet(result[0]);
-                } else {
-                    setWorkingSet(null);
-                }
-                if (getSelection() == false) {
-                    setSelection(true);
-                }
-            }
-        }
-
-        /**
-         * Sets the specified working set.
-         * 
-         * @param workingSet the working set 
-         */
-        void setWorkingSet(IWorkingSet workingSet) {
-            button.setData(workingSet);
-            if (workingSet != null) {
-                button.setText(NLS.bind(TaskListMessages.TaskList_workingSet,  workingSet.getLabel()));
-            } else {
-                button.setText(TaskListMessages.TaskList_noWorkingSet);
-            }
-        }
-    }
-
-    private TasksFilter filter;
-
-    MarkerTypesModel markerTypesModel = new MarkerTypesModel();
-
-    private MarkerType[] markerTypes;
-
-    private CheckboxTreeViewer typesViewer;
-
-    Button anyResourceButton;
-
-    Button anyResourceInSameProjectButton; // added by cagatayk@acm.org
-
-    Button selectedResourceButton;
-
-    Button selectedResourceAndChildrenButton;
-
-    private WorkingSetGroup workingSetGroup;
-
-    private LabelComboTextGroup descriptionGroup;
-
-    private CheckboxEnumGroup severityGroup;
-
-    private CheckboxEnumGroup priorityGroup;
-
-    private CheckboxEnumGroup completionGroup;
-
-    private Button filterOnMarkerLimit;
-
-    private Text markerLimit;
-
-    SelectionListener selectionListener = new SelectionAdapter() {
-        public void widgetSelected(SelectionEvent e) {
-            FiltersDialog.this.widgetSelected(e);
-        }
-    };
-
-    private ICheckStateListener checkStateListener = new ICheckStateListener() {
-        public void checkStateChanged(CheckStateChangedEvent event) {
-            FiltersDialog.this.checkStateChanged(event);
-        }
-    };
-
-    /**
-     * Creates a new filters dialog.
-     * 
-     * @param parentShell the parent shell
-     */
-    public FiltersDialog(Shell parentShell) {
-        super(parentShell);
-        initTypes();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Dialog.
-     */
-    protected void buttonPressed(int buttonId) {
-        if (RESET_ID == buttonId) {
-            resetPressed();
-        } else if (SELECT_ID == buttonId) {
-            workingSetGroup.selectPressed();
-        } else {
-            super.buttonPressed(buttonId);
-        }
-    }
-
-    /**
-     * Check state change.
-     * 
-     * @param event the event
-     */
-    public void checkStateChanged(CheckStateChangedEvent event) {
-        MarkerType type = (MarkerType) event.getElement();
-        typesViewer.setSubtreeChecked(type, event.getChecked());
-        MarkerType[] allSupertypes = type.getAllSupertypes();
-        for (int i = 0; i < allSupertypes.length; ++i) {
-            typesViewer.setChecked(allSupertypes[i], false);
-        }
-        updateEnabledState();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Window.
-     */
-    protected void configureShell(Shell newShell) {
-        super.configureShell(newShell);
-        newShell.setText(TaskListMessages.TaskList_filter);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell,
-				ITaskListHelpContextIds.FILTERS_DIALOG);
-    }
-
-    /**
-     * Creates the area showing filtering criteria on attribute values.
-     *
-     * @param parent the parent composite
-     */
-    void createAttributesArea(Composite parent) {
-        Composite composite = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        composite.setLayout(layout);
-        composite.setFont(parent.getFont());
-
-        String[] filters = {
-                TaskListMessages.TaskList_contains, TaskListMessages.TaskList_doesNotContain }; 
-        descriptionGroup = new LabelComboTextGroup(composite, TaskListMessages.TaskList_whereDescription, filters, "", 200);//$NON-NLS-1$ 
-        severityGroup = new CheckboxEnumGroup(composite, TaskListMessages.TaskList_severity_label, severityType); 
-        priorityGroup = new CheckboxEnumGroup(composite, TaskListMessages.TaskList_priority_label, priorityType); 
-        completionGroup = new CheckboxEnumGroup(composite, TaskListMessages.TaskList_status_label, completionType); 
-    }
-
-    void createResetArea(Composite parent) {
-        Composite composite = new Composite(parent, SWT.NONE);
-        composite.setFont(parent.getFont());
-        composite.setLayout(new GridLayout());
-        composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
-
-        Button reset = new Button(composite, SWT.PUSH);
-        reset.setText(TaskListMessages.TaskList_resetText);
-        reset.setData(new Integer(RESET_ID));
-
-        reset.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent event) {
-                buttonPressed(((Integer) event.widget.getData()).intValue());
-            }
-        });
-
-        reset.setFont(composite.getFont());
-        setButtonLayoutData(reset);
-    }
-
-    /**
-     * Creates a check box button with the given parent and text.
-     *
-     * @param parent the parent composite
-     * @param text the text for the check box
-     * @param grabRow <code>true</code>to grab the remaining horizontal space, <code>false</code> otherwise
-     * @return the check box button
-     */
-    Button createCheckbox(Composite parent, String text, boolean grabRow) {
-        Button button = new Button(parent, SWT.CHECK);
-        if (grabRow) {
-            GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-            button.setLayoutData(gridData);
-        }
-        button.setText(text);
-        button.addSelectionListener(selectionListener);
-        button.setFont(parent.getFont());
-        return button;
-    }
-
-    /**
-     * Creates a combo box with the given parent, items, and selection
-     *
-     * @param parent the parent composite
-     * @param items the items for the combo box
-     * @param selectionIndex the index of the item to select
-     * @return the combo box
-     */
-    Combo createCombo(Composite parent, String[] items, int selectionIndex) {
-        Combo combo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
-        combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        combo.setFont(parent.getFont());
-        combo.setItems(items);
-        combo.select(selectionIndex);
-        combo.addSelectionListener(selectionListener);
-        return combo;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Dialog.
-     */
-    protected Control createDialogArea(Composite parent) {
-        Composite composite = (Composite) super.createDialogArea(parent);
-        createMarkerLimitArea(composite);
-        createTypesArea(composite);
-        createResourceArea(composite);
-        createAttributesArea(composite);
-        createResetArea(composite);
-        createSeparatorLine(composite);
-
-        updateUIFromFilter(getFilter());
-
-        return composite;
-    }
-
-    /**
-     * Creates a separator line above the OK/Cancel buttons bar
-     * 
-     * @param parent the parent composite
-     */
-    void createSeparatorLine(Composite parent) {
-        // Build the separator line
-        Label separator = new Label(parent, SWT.HORIZONTAL | SWT.SEPARATOR);
-        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-        gd.horizontalSpan = 1;
-        separator.setLayoutData(gd);
-    }
-
-    /**
-     * Creates a radio button with the given parent and text.
-     *
-     * @param parent the parent composite
-     * @param text the text for the check box
-     * @return the radio box button
-     */
-    Button createRadioButton(Composite parent, String text) {
-        Button button = new Button(parent, SWT.RADIO);
-        button.setText(text);
-        button.setFont(parent.getFont());
-        button.addSelectionListener(selectionListener);
-        return button;
-    }
-
-    /**
-     * Creates the area showing which resources should be considered.
-     *
-     * @param parent the parent composite
-     */
-    void createResourceArea(Composite parent) {
-        Composite group = new Composite(parent, SWT.NONE);
-        group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        group.setLayout(new GridLayout());
-        group.setFont(parent.getFont());
-        anyResourceButton = createRadioButton(group, TaskListMessages.TaskList_anyResource);
-        anyResourceInSameProjectButton = createRadioButton(group,
-                TaskListMessages.TaskList_anyResourceInSameProject);// added by cagatayk@acm.org
-        selectedResourceButton = createRadioButton(group, TaskListMessages.TaskList_selectedResource); 
-        selectedResourceAndChildrenButton = createRadioButton(group,
-                TaskListMessages.TaskList_selectedAndChildren); 
-        workingSetGroup = new WorkingSetGroup(group);
-    }
-
-    /**
-     * Creates the area showing which marker types should be included.
-     *
-     * @param parent the parent composite
-     */
-    void createTypesArea(Composite parent) {
-        Composite composite = new Composite(parent, SWT.NONE);
-        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        GridLayout layout = new GridLayout();
-        composite.setLayout(layout);
-
-        Label label = new Label(composite, SWT.NONE);
-        label.setText(TaskListMessages.TaskList_showItemsOfType);
-
-        typesViewer = new CheckboxTreeViewer(composite);
-        GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-        gridData.heightHint = 100;
-        typesViewer.getControl().setLayoutData(gridData);
-        typesViewer.setContentProvider(getContentProvider());
-        typesViewer.setLabelProvider(getLabelProvider());
-        typesViewer.setComparator(getViewerComparator());
-        typesViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
-        typesViewer.addCheckStateListener(checkStateListener);
-        typesViewer.setInput(getMarkerTypes());
-    }
-
-    ITreeContentProvider getContentProvider() {
-        return new ITreeContentProvider() {
-            public void inputChanged(Viewer viewer, Object oldInput,
-                    Object newInput) {
-            }
-
-            public void dispose() {
-            }
-
-            public Object[] getElements(Object inputElement) {
-                return new Object[] {
-                        markerTypesModel.getType(IMarker.PROBLEM),
-                        markerTypesModel.getType(IMarker.TASK) };
-            }
-
-            public Object[] getChildren(Object parentElement) {
-                MarkerType type = (MarkerType) parentElement;
-                return type.getSubtypes();
-            }
-
-            public Object getParent(Object element) {
-                return null;
-            }
-
-            public boolean hasChildren(Object element) {
-                return getChildren(element).length > 0;
-            }
-        };
-    }
-
-    void createMarkerLimitArea(Composite parent) {
-        Font font = parent.getFont();
-        Composite composite = new Composite(parent, SWT.NONE);
-        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        composite.setFont(font);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        composite.setLayout(layout);
-        filterOnMarkerLimit = createCheckbox(composite, TaskListMessages.TaskList_limitVisibleTasksTo, false);
-        filterOnMarkerLimit.setLayoutData(new GridData());
-        markerLimit = new Text(composite, SWT.SINGLE | SWT.BORDER);
-        markerLimit.setTextLimit(6);
-        GridData gridData = new GridData();
-        gridData.widthHint = convertWidthInCharsToPixels(10);
-        markerLimit.setLayoutData(gridData);
-        markerLimit.setFont(font);
-    }
-
-    /**
-     * Returns the filter which this dialog is configuring.
-     *
-     * @return the filter
-     */
-    public TasksFilter getFilter() {
-        if (filter == null) {
-			filter = new TasksFilter();
-		}
-        return filter;
-    }
-
-    ILabelProvider getLabelProvider() {
-        return new LabelProvider() {
-            public String getText(Object element) {
-                MarkerType type = (MarkerType) element;
-                return type.getLabel();
-            }
-        };
-    }
-
-    /**
-     * Returns the marker types to display.
-     *
-     * @return the marker types to display
-     */
-    MarkerType[] getMarkerTypes() {
-        if (markerTypes == null) {
-            ArrayList typesList = new ArrayList();
-            MarkerType[] types = markerTypesModel.getTypes();
-            for (int i = 0; i < types.length; ++i) {
-                MarkerType type = types[i];
-                if (type.getLabel().length() > 0) {
-                    if (type.isSubtypeOf(markerTypesModel
-                            .getType(IMarker.PROBLEM))
-                            || type.isSubtypeOf(markerTypesModel
-                                    .getType(IMarker.TASK))) {
-                        typesList.add(type);
-                    }
-                }
-            }
-            Collections.sort(typesList, new Comparator() {
-                Collator collator = Collator.getInstance();
-
-                public int compare(Object o1, Object o2) {
-                    return collator.compare(((MarkerType) o1).getLabel(),
-                            ((MarkerType) o2).getLabel());
-                }
-            });
-            markerTypes = new MarkerType[typesList.size()];
-            typesList.toArray(markerTypes);
-        }
-        return markerTypes;
-    }
-
-    /**
-     * Returns the ids of the selected marker types.
-     *
-     * @return the ids of the selected marker types
-     */
-    String[] getSelectedTypes() {
-        Object[] checked = typesViewer.getCheckedElements();
-        ArrayList list = new ArrayList();
-        for (int i = 0; i < checked.length; ++i) {
-            MarkerType type = (MarkerType) checked[i];
-            // Skip it if any supertypes have already been included.
-            // Relies on getCheckedElements() using a pre-order traversal 
-            // so parents are earlier in the list.
-            boolean found = false;
-            for (int j = list.size(); --j >= 0;) {
-                if (type.isSubtypeOf((MarkerType) list.get(j))) {
-                    found = true;
-                    break;
-                }
-            }
-            if (!found) {
-                list.add(type);
-            }
-        }
-        String[] types = new String[list.size()];
-        for (int i = 0; i < list.size(); ++i) {
-            types[i] = ((MarkerType) list.get(i)).getId();
-        }
-        return types;
-    }
-
-    private ViewerComparator getViewerComparator() {
-        return new ViewerComparator() {
-            public int compare(Viewer viewer, Object e1, Object e2) {
-                MarkerType t1 = (MarkerType) e1;
-                MarkerType t2 = (MarkerType) e2;
-                return getComparator().compare(t1.getLabel(), t2.getLabel());
-            }
-        };
-    }
-
-    /**
-     * Returns the id of the marker type at the given index
-     *
-     * @param typeIndex the index of the marker type in the UI list
-     * @return the id of the marker type at the given index
-     */
-    String getTypeId(int typeIndex) {
-        return getMarkerTypes()[typeIndex].getId();
-    }
-
-    /**
-     * Returns the index of the given marker type
-     *
-     * @param markerType the marker type id
-     * @return the index of the marker type
-     */
-    int getTypeIndex(String markerType) {
-        MarkerType[] types = getMarkerTypes();
-        for (int i = 0; i < types.length; ++i) {
-            String id = types[i].getId();
-            if (id == null ? markerType == null : id.equals(markerType)) {
-				return i;
-			}
-        }
-        return -1;
-    }
-
-    void initTypes() {
-        severityType = new EnumType(
-                new EnumValue[] {
-                        new EnumValue(
-                                IMarker.SEVERITY_ERROR,
-                                TaskListMessages.TaskList_severity_error, MarkerUtil.getImage("error")),//$NON-NLS-1$
-                        new EnumValue(
-                                IMarker.SEVERITY_WARNING,
-                                TaskListMessages.TaskList_severity_warning, MarkerUtil.getImage("warn")),//$NON-NLS-1$
-                        new EnumValue(
-                                IMarker.SEVERITY_INFO,
-                                TaskListMessages.TaskList_severity_info, MarkerUtil.getImage("info"))  //$NON-NLS-1$
-                });
-
-        priorityType = new EnumType(
-                new EnumValue[] {
-                        new EnumValue(
-                                IMarker.PRIORITY_HIGH,
-                                TaskListMessages.TaskList_priority_high, MarkerUtil.getImage("hprio")), //$NON-NLS-1$
-                        new EnumValue(IMarker.PRIORITY_NORMAL, TaskListMessages.TaskList_priority_normal, null), 
-                        new EnumValue(
-                                IMarker.PRIORITY_LOW,
-                                TaskListMessages.TaskList_priority_low, MarkerUtil.getImage("lprio")) //$NON-NLS-1$
-                });
-
-        completionType = new EnumType(new EnumValue[] {
-                new EnumValue(1, TaskListMessages.TaskList_status_completed, null), 
-                new EnumValue(0, TaskListMessages.TaskList_status_notCompleted, null) 
-                });
-    }
-
-    /**
-     * Updates the filter from the UI state.
-     * Must be done here rather than by extending open()
-     * because after super.open() is called, the widgetry is disposed.
-     */
-    protected void okPressed() {
-        try {
-            int parseResult = Integer.parseInt(this.markerLimit.getText());
-
-            if (parseResult < 1) {
-                throw new NumberFormatException();
-            }
-
-            updateFilterFromUI(getFilter());
-            super.okPressed();
-        } catch (NumberFormatException eNumberFormat) {
-            MessageBox messageBox = new MessageBox(getShell(), SWT.OK
-                    | SWT.APPLICATION_MODAL | SWT.ICON_ERROR);
-            messageBox.setText(TaskListMessages.TaskList_titleMarkerLimitInvalid);
-            messageBox.setMessage(TaskListMessages.TaskList_messageMarkerLimitInvalid); 
-            messageBox.open();
-
-            if (markerLimit.forceFocus()) {
-                markerLimit.setSelection(0, markerLimit.getCharCount());
-                markerLimit.showSelection();
-            }
-        }
-    }
-
-    /**
-     * Handles a press of the Reset button.
-     * Updates the UI state to correspond to a reset filter,
-     * but doesn't actually reset our filter.
-     */
-    void resetPressed() {
-        updateUIFromFilter(new TasksFilter());
-    }
-
-    /**
-     * Returns whether any of the selected types are a subtype of the given type.
-     */
-    boolean selectionIncludesSubtypeOf(String type) {
-        MarkerType superType = markerTypesModel.getType(type);
-        if (superType == null) {
-            return false;
-        }
-        Object[] checked = typesViewer.getCheckedElements();
-        for (int i = 0; i < checked.length; ++i) {
-            if (((MarkerType) checked[i]).isSubtypeOf(superType)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Sets the filter which this dialog is to configure.
-     *
-     * @param filter the filter
-     */
-    public void setFilter(TasksFilter filter) {
-        this.filter = filter;
-    }
-
-    /**
-     * Sets the selected marker types.
-     *
-     * @param typeIds the ids of the marker types to select
-     */
-    void setSelectedTypes(String[] typeIds) {
-        typesViewer.setCheckedElements(new MarkerType[0]);
-        for (int i = 0; i < typeIds.length; ++i) {
-            MarkerType type = markerTypesModel.getType(typeIds[i]);
-            if (type != null) {
-                typesViewer.setSubtreeChecked(type, true);
-            }
-        }
-    }
-
-    /**
-     * Updates the enabled state of the widgetry.
-     */
-    void updateEnabledState() {
-        markerLimit.setEnabled(filterOnMarkerLimit.getSelection());
-        boolean isProblemSelected = selectionIncludesSubtypeOf(IMarker.PROBLEM);
-        boolean isTaskSelected = selectionIncludesSubtypeOf(IMarker.TASK);
-        severityGroup.setEnabled(isProblemSelected);
-        priorityGroup.setEnabled(isTaskSelected);
-        completionGroup.setEnabled(isTaskSelected);
-    }
-
-    /**
-     * Updates the given filter from the UI state.
-     *
-     * @param tasksFilter the filter to update
-     */
-    void updateFilterFromUI(TasksFilter tasksFilter) {
-
-        tasksFilter.types = getSelectedTypes();
-
-        if (selectedResourceButton.getSelection()) {
-			tasksFilter.onResource = TasksFilter.ON_SELECTED_RESOURCE_ONLY;
-		} else if (selectedResourceAndChildrenButton.getSelection()) {
-			tasksFilter.onResource = TasksFilter.ON_SELECTED_RESOURCE_AND_CHILDREN;
-		} else if (anyResourceInSameProjectButton.getSelection()) {
-			tasksFilter.onResource = TasksFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT;
-		} else if (workingSetGroup.getSelection()) {
-			tasksFilter.onResource = TasksFilter.ON_WORKING_SET;
-		} else {
-			tasksFilter.onResource = TasksFilter.ON_ANY_RESOURCE;
-		}
-
-        tasksFilter.workingSet = workingSetGroup.getWorkingSet();
-        tasksFilter.descriptionFilterKind = descriptionGroup.combo
-                .getSelectionIndex();
-        tasksFilter.descriptionFilter = descriptionGroup.text.getText();
-        tasksFilter.filterOnDescription = !tasksFilter.descriptionFilter
-                .equals("");//$NON-NLS-1$
-
-        tasksFilter.filterOnSeverity = severityGroup.getSelection();
-        tasksFilter.severityFilter = severityGroup.getValueMask();
-
-        tasksFilter.filterOnPriority = priorityGroup.getSelection();
-        tasksFilter.priorityFilter = priorityGroup.getValueMask();
-
-        tasksFilter.filterOnCompletion = completionGroup.getSelection();
-        tasksFilter.completionFilter = completionGroup.getValueMask();
-
-        int limit = TasksFilter.DEFAULT_MARKER_LIMIT;
-
-        try {
-            limit = Integer.parseInt(this.markerLimit.getText());
-        } catch (NumberFormatException eNumberFormat) {
-        }
-
-        tasksFilter.setMarkerLimit(limit);
-        tasksFilter.setFilterOnMarkerLimit(filterOnMarkerLimit.getSelection());
-    }
-
-    /**
-     * Updates the UI state from the given filter.
-     *
-     * @param tasksFilter the filter to use
-     */
-    void updateUIFromFilter(TasksFilter tasksFilter) {
-
-        setSelectedTypes(tasksFilter.types);
-
-        int on = tasksFilter.onResource;
-        anyResourceButton.setSelection(on == TasksFilter.ON_ANY_RESOURCE);
-        anyResourceInSameProjectButton
-                .setSelection(on == TasksFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT); // added by cagatayk@acm.org
-        selectedResourceButton
-                .setSelection(on == TasksFilter.ON_SELECTED_RESOURCE_ONLY);
-        selectedResourceAndChildrenButton
-                .setSelection(on == TasksFilter.ON_SELECTED_RESOURCE_AND_CHILDREN);
-        workingSetGroup.setSelection(on == TasksFilter.ON_WORKING_SET);
-        workingSetGroup.setWorkingSet(tasksFilter.workingSet);
-
-        descriptionGroup.combo.select(tasksFilter.descriptionFilterKind);
-        descriptionGroup.text.setText(tasksFilter.descriptionFilter);
-
-        severityGroup.setSelection(tasksFilter.filterOnSeverity);
-        severityGroup.setValueMask(tasksFilter.severityFilter);
-
-        priorityGroup.setSelection(tasksFilter.filterOnPriority);
-        priorityGroup.setValueMask(tasksFilter.priorityFilter);
-
-        completionGroup.setSelection(tasksFilter.filterOnCompletion);
-        completionGroup.setValueMask(tasksFilter.completionFilter);
-
-        markerLimit.setText("" + tasksFilter.getMarkerLimit()); //$NON-NLS-1$
-        filterOnMarkerLimit.setSelection(tasksFilter.getFilterOnMarkerLimit());
-
-        updateEnabledState();
-    }
-
-    /**
-     * Handles selection on a check box or combo box.
-     */
-    void widgetSelected(SelectionEvent e) {
-        updateEnabledState();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/GotoTaskAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/GotoTaskAction.java
deleted file mode 100644
index dde0e25..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/GotoTaskAction.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.util.OpenStrategy;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ide.DialogUtil;
-import org.eclipse.ui.internal.views.tasklist.TaskListMessages;
-
-/**
- * This action opens an editor for the resource
- * associated with the selected marker, and
- * jumps to the marker's location in the editor.
- */
-class GotoTaskAction extends TaskAction {
-
-    /**
-     * Creates the action.
-     * 
-     * @param tasklist the task list
-     * @param id the id
-     */
-    public GotoTaskAction(TaskList tasklist, String id) {
-        super(tasklist, id);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				ITaskListHelpContextIds.GOTO_TASK_ACTION);
-    }
-
-    /**
-     * Performs this action. This action works only for single selection.
-     */
-    public void run() {
-        IStructuredSelection selection = (IStructuredSelection) getTaskList()
-                .getSelection();
-        Object o = selection.getFirstElement();
-        if (!(o instanceof IMarker)) {
-			return;
-		}
-        IMarker marker = (IMarker) o;
-        IResource resource = marker.getResource();
-        if (marker.exists() && resource instanceof IFile) {
-            IWorkbenchPage page = getTaskList().getSite().getPage();
-            try {
-                IDE.openEditor(page, marker, OpenStrategy.activateOnOpen());
-            } catch (PartInitException e) {
-                DialogUtil.openError(page.getWorkbenchWindow().getShell(),
-                        TaskListMessages.GotoTask_errorMessage, 
-                        e.getMessage(), e);
-            }
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/IMarkerConstants.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/IMarkerConstants.java
deleted file mode 100644
index d0c57b9..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/IMarkerConstants.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-/**
- * This interface defines constants used for marker properties
- * and attributes.
- *
- * @see org.eclipse.core.resources.IMarker
- */
-interface IMarkerConstants {
-    public static final String PREFIX = "org.eclipse.ui.tasklist."; //$NON-NLS-1$
-
-    public static final String P_PRIORITY_IMAGE = PREFIX + "priorityImage"; //$NON-NLS-1$
-
-    public static final String P_COMPLETE_IMAGE = PREFIX + "completeImage"; //$NON-NLS-1$
-
-    public static final String P_RESOURCE_NAME = PREFIX + "resourceName"; //$NON-NLS-1$
-
-    public static final String P_CONTAINER_NAME = PREFIX + "containerName"; //$NON-NLS-1$
-
-    public static final String P_LINE_AND_LOCATION = PREFIX + "lineAndLocation"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/ITaskListHelpContextIds.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/ITaskListHelpContextIds.java
deleted file mode 100644
index a277478..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/ITaskListHelpContextIds.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Help context ids for the task list view.
- * <p>
- * This interface contains constants only; it is not intended to be implemented
- * or extended.
- * </p>
- * 
- */
-interface ITaskListHelpContextIds {
-    public static final String PREFIX = PlatformUI.PLUGIN_ID + "."; //$NON-NLS-1$
-
-    // Actions
-    public static final String PURGE_COMPLETED_TASK_ACTION = PREFIX
-            + "purge_completed_task_action_context"; //$NON-NLS-1$
-
-    public static final String COPY_TASK_ACTION = PREFIX
-            + "copy_task_action_context"; //$NON-NLS-1$
-
-    public static final String PASTE_TASK_ACTION = PREFIX
-            + "paste_task_action_context"; //$NON-NLS-1$
-
-    public static final String NEW_TASK_ACTION = PREFIX
-            + "new_task_action_context"; //$NON-NLS-1$
-
-    public static final String REMOVE_TASK_ACTION = PREFIX
-            + "remove_task_action_context"; //$NON-NLS-1$
-
-    public static final String GOTO_TASK_ACTION = PREFIX
-            + "goto_task_action_context"; //$NON-NLS-1$
-
-    public static final String FILTERS_ACTION = PREFIX
-            + "filters_action_context"; //$NON-NLS-1$
-
-    public static final String MARK_COMPLETED_ACTION = PREFIX
-            + "mark_completed_action_context"; //$NON-NLS-1$
-
-    public static final String RESOLVE_MARKER_ACTION = PREFIX
-            + "resolve_marker_action_context"; //$NON-NLS-1$
-
-    public static final String SELECT_ALL_TASKS_ACTION = PREFIX
-            + "select_all_tasks_action_context"; //$NON-NLS-1$
-
-    public static final String TASK_PROPERTIES_ACTION = PREFIX
-            + "task_properties_action_context"; //$NON-NLS-1$
-
-    public static final String TASK_SORT_TYPE_ACTION = PREFIX
-            + "task_sort_type_action_context"; //$NON-NLS-1$
-
-    public static final String TASK_SORT_COMPLETED_ACTION = PREFIX
-            + "task_sort_completed_action_context"; //$NON-NLS-1$
-
-    public static final String TASK_SORT_PRIORITY_ACTION = PREFIX
-            + "task_sort_priority_action_context"; //$NON-NLS-1$
-
-    public static final String TASK_SORT_DESCRIPTION_ACTION = PREFIX
-            + "task_sort_description_action_context"; //$NON-NLS-1$
-
-    public static final String TASK_SORT_RESOURCE_ACTION = PREFIX
-            + "task_sort_resource_action_context"; //$NON-NLS-1$
-
-    public static final String TASK_SORT_FOLDER_ACTION = PREFIX
-            + "task_sort_folder_action_context"; //$NON-NLS-1$
-
-    public static final String TASK_SORT_LOCATION_ACTION = PREFIX
-            + "task_sort_location_action_context"; //$NON-NLS-1$
-
-    public static final String TASK_SORT_CREATION_TIME_ACTION = PREFIX
-            + "task_sort_creation_time_action_context"; //$NON-NLS-1$
-
-    public static final String TASK_SORT_ASCENDING_ACTION = PREFIX
-            + "task_sort_ascending_action_context"; //$NON-NLS-1$
-
-    public static final String TASK_SORT_DESCENDING_ACTION = PREFIX
-            + "task_sort_descending_action_context"; //$NON-NLS-1$
-
-    // Dialogs
-    public static final String FILTERS_DIALOG = PREFIX
-            + "task_filters_dialog_context"; //$NON-NLS-1$
-
-    public static final String PROPERTIES_DIALOG = PREFIX
-            + "task_properties_dialog_context"; //$NON-NLS-1$
-
-    // Views
-    public static final String TASK_LIST_VIEW = PREFIX
-            + "task_list_view_context"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/ITaskListResourceAdapter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/ITaskListResourceAdapter.java
deleted file mode 100644
index bed98c0..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/ITaskListResourceAdapter.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * <code>ITaskListResourceAdapter</code> is an adapter interface that
- * supplies the resource to query for markers to display in the task list.
- * <p>
- * The Tasks view checks for this adapter before the <code>IResource</code>
- * adapter, allowing the object to provide a resource to the Tasks view without
- * necessarily exposing it to other components that look for an <code>IResource</code>
- * adapter.     
- * </p>
- * <p>
- * Implementors of this interface are typically registered with an
- * IAdapterFactory for lookup via the getAdapter() mechanism.
- * </p>
- */
-public interface ITaskListResourceAdapter {
-
-    /**
-     * Returns the resource to query for the markers to display
-     * for the given adaptable.
-     * 
-     * @param adaptable the adaptable being queried.
-     * @return the resource or <code>null</code> if there
-     * 	is no adapted resource for this object.
-     */
-    public IResource getAffectedResource(IAdaptable adaptable);
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/MarkCompletedAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/MarkCompletedAction.java
deleted file mode 100644
index 22b0333..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/MarkCompletedAction.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.UpdateMarkersOperation;
-
-class MarkCompletedAction extends TaskAction {
-
-    /**
-     * Create a MarkCompletedAction.
-     * @param tasklist
-     * @param id
-     */
-    protected MarkCompletedAction(TaskList tasklist, String id) {
-        super(tasklist, id);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                ITaskListHelpContextIds.MARK_COMPLETED_ACTION);
-    }
-
-    /**
-     * Sets the completed value of the currently selected
-     * actions.
-     */
-    public void run() {
-        ISelection selectedMarkers = getTaskList().getSelection();
-        if (selectedMarkers instanceof IStructuredSelection) {
-            Iterator selections = ((IStructuredSelection) selectedMarkers).iterator();
-            ArrayList markers = new ArrayList();
-            while (selections.hasNext()) {
-                Object marker = selections.next();
-                if (marker instanceof IMarker) {
-                	markers.add(marker);
-                }
-            }
-    		Map attrs = new HashMap();
-    		attrs.put(IMarker.DONE, Boolean.TRUE);
-    		IUndoableOperation op = new UpdateMarkersOperation((IMarker [])markers.toArray(new IMarker [markers.size()]), 
-    				attrs, getText(), true);
-    		execute(op, getText(), null, null);
-
-        }
-        
-    }
-
-    /**
-     * Returns whether this action should be enabled for the given selection.
-     * 
-     * @param selection the selection
-     * @return enablement
-     */
-    public boolean shouldEnable(IStructuredSelection selection) {
-        if (selection.isEmpty()) {
-			return false;
-		}
-        for (Iterator i = selection.iterator(); i.hasNext();) {
-            IMarker marker = (IMarker) i.next();
-            if (!(MarkerUtil.isMarkerType(marker, IMarker.TASK)
-                    && !MarkerUtil.isComplete(marker) && MarkerUtil
-                    .isEditable(marker))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/MarkerType.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/MarkerType.java
deleted file mode 100644
index 2eae71a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/MarkerType.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import java.util.ArrayList;
-
-/**
- * Represents a marker type.
- */
-class MarkerType {
-    private MarkerTypesModel model;
-
-    private String id;
-
-    private String label;
-
-    private String[] supertypeIds;
-
-    /**
-     * Creates a new marker type.
-     */
-    public MarkerType(MarkerTypesModel model, String id, String label,
-            String[] supertypeIds) {
-        this.model = model;
-        this.id = id;
-        this.label = label;
-        this.supertypeIds = supertypeIds;
-    }
-
-    /**
-     * Returns all this type's supertypes.
-     */
-    public MarkerType[] getAllSupertypes() {
-        ArrayList result = new ArrayList();
-        getAllSupertypes(result);
-        return (MarkerType[]) result.toArray(new MarkerType[result.size()]);
-    }
-
-    /**
-     * Appends all this type's supertypes to the given list.
-     */
-    private void getAllSupertypes(ArrayList result) {
-        MarkerType[] supers = getSupertypes();
-        for (int i = 0; i < supers.length; ++i) {
-            MarkerType sup = supers[i];
-            if (!result.contains(sup)) {
-                result.add(sup);
-                sup.getAllSupertypes(result);
-            }
-        }
-    }
-
-    /**
-     * Returns the marker type id.
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * Returns the human-readable label for this marker type.
-     */
-    public String getLabel() {
-        return label;
-    }
-
-    /**
-     * Returns the types which have this type as a direct supertype.
-     *
-     * @return the direct subtypes of this type
-     */
-    public MarkerType[] getSubtypes() {
-        MarkerType[] types = model.getTypes();
-        ArrayList result = new ArrayList();
-        for (int i = 0; i < types.length; ++i) {
-            MarkerType type = types[i];
-            String[] supers = type.getSupertypeIds();
-            for (int j = 0; j < supers.length; ++j) {
-                if (supers[j].equals(id)) {
-                    result.add(type);
-                }
-            }
-        }
-        return (MarkerType[]) result.toArray(new MarkerType[result.size()]);
-    }
-
-    /**
-     * Returns the marker type ids for this type's supertypes.
-     */
-    public String[] getSupertypeIds() {
-        return supertypeIds;
-    }
-
-    /**
-     * Returns this type's direct supertypes.
-     */
-    public MarkerType[] getSupertypes() {
-        ArrayList result = new ArrayList();
-        for (int i = 0; i < supertypeIds.length; ++i) {
-            MarkerType sup = model.getType(supertypeIds[i]);
-            if (sup != null) {
-                result.add(sup);
-            }
-        }
-        return (MarkerType[]) result.toArray(new MarkerType[result.size()]);
-    }
-
-    /**
-     * Returns whether this marker type is considered to be a subtype of
-     * the given marker type. 
-     *
-     * @return boolean <code>true</code>if this type is the same as (or a subtype of) the given type
-     */
-    public boolean isSubtypeOf(MarkerType superType) {
-        if (id.equals(superType.getId())) {
-            return true;
-        }
-        for (int i = 0; i < supertypeIds.length; ++i) {
-            MarkerType sup = model.getType(supertypeIds[i]);
-            if (sup != null && sup.isSubtypeOf(superType)) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/MarkerTypesModel.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/MarkerTypesModel.java
deleted file mode 100644
index 572baa6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/MarkerTypesModel.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-
-/**
- * Maintains a model of all known marker types.
- */
-class MarkerTypesModel {
-    /**
-     * Maps from marker type id to MarkerType.
-     */
-    private HashMap types;
-
-    /**
-     * Creates a new marker types model.
-     */
-    public MarkerTypesModel() {
-        types = readTypes();
-    }
-
-    /**
-     * Returns the marker type with the given id, or <code>null</code> if there is no such marker type.
-     */
-    public MarkerType getType(String id) {
-        return (MarkerType) types.get(id);
-    }
-
-    /**
-     * Returns all known marker types.
-     */
-    public MarkerType[] getTypes() {
-        MarkerType[] result = new MarkerType[types.size()];
-        types.values().toArray(result);
-        return result;
-    }
-
-    /**
-     * Returns the label for the given marker type.
-     * Workaround until we have labels in XML.
-     */
-    private String getWellKnownLabel(String type) {
-        if (type.equals(IMarker.PROBLEM)) {
-			return "Problem";//$NON-NLS-1$
-		}
-        if (type.equals(IMarker.TASK)) {
-			return "Task";//$NON-NLS-1$
-		}
-        if (type.equals("org.eclipse.jdt.core.problem")) { //$NON-NLS-1$
-			return "Java Problem";//$NON-NLS-1$
-		}
-        return type;
-    }
-
-    /**
-     * Reads the marker types from the registry.
-     */
-    private HashMap readTypes() {
-        HashMap types = new HashMap();
-        IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(
-                ResourcesPlugin.PI_RESOURCES, ResourcesPlugin.PT_MARKERS);
-        if (point != null) {
-            // Gather all registered marker types.
-            IExtension[] extensions = point.getExtensions();
-            for (int i = 0; i < extensions.length; ++i) {
-                IExtension ext = extensions[i];
-                String id = ext.getUniqueIdentifier();
-                String label = ext.getLabel();
-                if (label.equals("")) {//$NON-NLS-1$
-                    label = getWellKnownLabel(id);
-                }
-                ArrayList supersList = new ArrayList();
-                IConfigurationElement[] configElements = ext
-                        .getConfigurationElements();
-                for (int j = 0; j < configElements.length; ++j) {
-                    IConfigurationElement elt = configElements[j];
-                    if (elt.getName().equalsIgnoreCase("super")) {//$NON-NLS-1$
-                        String sup = elt.getAttribute("type");//$NON-NLS-1$
-                        if (sup != null) {
-                            supersList.add(sup);
-                        }
-                    }
-                }
-                String[] superTypes = new String[supersList.size()];
-                supersList.toArray(superTypes);
-                MarkerType type = new MarkerType(this, id, label, superTypes);
-                types.put(id, type);
-            }
-        }
-        return types;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/MarkerUtil.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/MarkerUtil.java
deleted file mode 100644
index 1c58996..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/MarkerUtil.java
+++ /dev/null
@@ -1,497 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import com.ibm.icu.text.DateFormat;
-import com.ibm.icu.text.MessageFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.views.tasklist.TaskListMessages;
-
-/**
- * Utility class for accessing marker attributes.
- */
-class MarkerUtil implements IMarkerConstants {
-	
-   private static Map imageDescriptors;
-
-    private static ImageRegistry imageRegistry = new ImageRegistry();
-
-    private static MessageFormat line = new MessageFormat(TaskListMessages.TaskList_line);
-
-    private static MessageFormat lineAndLocation = new MessageFormat(
-            TaskListMessages.TaskList_lineAndLocation); 
-
-    static {
-        createImageDescriptors();
-    }
-
-    /**
-     * Don't allow instantiation.
-     */
-    private MarkerUtil() {
-    }
-
-    /**
-     * Creates the map of image descriptors.
-     */
-    static void createImageDescriptors() {
-    
-
-        imageDescriptors = new HashMap(51);
-        imageDescriptors
-                .put(
-                        "header_complete", IDEWorkbenchPlugin.getIDEImageDescriptor("obj16/header_complete.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors
-                .put(
-                        "header_priority", IDEWorkbenchPlugin.getIDEImageDescriptor("obj16/header_priority.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors.put(
-                "task", IDEWorkbenchPlugin.getIDEImageDescriptor("obj16/taskmrk_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors.put(
-                "error", IDEWorkbenchPlugin.getIDEImageDescriptor("obj16/error_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors.put(
-                "warn", IDEWorkbenchPlugin.getIDEImageDescriptor("obj16/warn_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors.put(
-                "info", IDEWorkbenchPlugin.getIDEImageDescriptor("obj16/info_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors.put(
-                "hprio", IDEWorkbenchPlugin.getIDEImageDescriptor("obj16/hprio_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors.put(
-                "lprio", IDEWorkbenchPlugin.getIDEImageDescriptor("obj16/lprio_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors
-                .put(
-                        "complete_tsk", IDEWorkbenchPlugin.getIDEImageDescriptor("obj16/complete_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors
-                .put(
-                        "incomplete_tsk", IDEWorkbenchPlugin.getIDEImageDescriptor("obj16/incomplete_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors.put(
-                "gotoobj", IDEWorkbenchPlugin.getIDEImageDescriptor("elcl16/gotoobj_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors.put(
-                "addtsk", IDEWorkbenchPlugin.getIDEImageDescriptor("elcl16/addtsk_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors
-                .put(
-                        "addtsk_disabled", IDEWorkbenchPlugin.getIDEImageDescriptor("dlcl16/addtsk_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors
-                .put(
-                        "showcomplete", IDEWorkbenchPlugin.getIDEImageDescriptor("elcl16/showcomplete_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors
-                .put(
-                        "selected_mode", IDEWorkbenchPlugin.getIDEImageDescriptor("elcl16/selected_mode.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors
-                .put(
-                        "selected_mode_disabled", IDEWorkbenchPlugin.getIDEImageDescriptor("dlcl16/selected_mode.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors
-                .put(
-                        "showchild_mode", IDEWorkbenchPlugin.getIDEImageDescriptor("elcl16/showchild_mode.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors
-                .put(
-                        "showchild_mode_disabled", IDEWorkbenchPlugin.getIDEImageDescriptor("dlcl16/showchild_mode.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors
-                .put(
-                        "showerr_disabled", IDEWorkbenchPlugin.getIDEImageDescriptor("dlcl16/showerr_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors
-                .put(
-                        "showwarn_disabled", IDEWorkbenchPlugin.getIDEImageDescriptor("dlcl16/showwarn_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors
-                .put(
-                        "showtsk_disabled", IDEWorkbenchPlugin.getIDEImageDescriptor("dlcl16/showtsk_tsk.gif"));//$NON-NLS-2$//$NON-NLS-1$
-        imageDescriptors.put(
-                "filter", IDEWorkbenchPlugin.getIDEImageDescriptor("elcl16/filter_ps.gif"));//$NON-NLS-2$//$NON-NLS-1$
-    }
-
-    /**
-     * Returns the ending character offset of the given marker.
-     */
-    public static int getCharEnd(IMarker marker) {
-        return marker.getAttribute(IMarker.CHAR_END, -1);
-    }
-
-    /**
-     * Returns the starting character offset of the given marker.
-     */
-    public static int getCharStart(IMarker marker) {
-        return marker.getAttribute(IMarker.CHAR_START, -1);
-    }
-
-    /**
-     * Returns the icon to be used in the tasklist
-     * for the complete state of a task. Returns null
-     * for markers that are not tasks.
-     */
-    public static Image getCompleteImage(IMarker marker) {
-        if (isMarkerType(marker, IMarker.TASK)) {
-            if (isComplete(marker)) {
-				return getImage("complete_tsk");//$NON-NLS-1$
-			} else if (!isReadOnly(marker)) {
-				return getImage("incomplete_tsk");//$NON-NLS-1$
-			}
-        }
-        return null;
-    }
-
-    /**
-     * Returns the text to be used for the complete state of a task. 
-     * Returns the empty string for markers that are not tasks.
-     */
-    public static String getCompleteText(IMarker marker) {
-        if (isMarkerType(marker, IMarker.TASK)) {
-            if (isComplete(marker)) {
-				return TaskListMessages.TaskList_completed;
-			} else {
-				return TaskListMessages.TaskList_notCompleted;
-			}
-        }
-        return ""; //$NON-NLS-1$
-    }
-
-    /**
-     * Returns the text to be used for the kind of marker.
-     */
-    public static String getKindText(IMarker marker) {
-        if (isMarkerType(marker, IMarker.TASK)) {
-            return TaskListMessages.TaskList_task; 
-        }
-        switch (getSeverity(marker)) {
-        case IMarker.SEVERITY_ERROR:
-            return TaskListMessages.TaskList_error; 
-        case IMarker.SEVERITY_WARNING:
-            return TaskListMessages.TaskList_warning; 
-        case IMarker.SEVERITY_INFO:
-            return TaskListMessages.TaskList_info; 
-        }
-        return ""; //$NON-NLS-1$
-    }
-
-    /**
-     * Returns the container name if it is defined, or empty string if not.
-     */
-    public static String getContainerName(IMarker marker) {
-        IPath path = marker.getResource().getFullPath();
-        int n = path.segmentCount() - 1; // n is the number of segments in container, not path
-        if (n <= 0) {
-			return ""; //$NON-NLS-1$
-		}
-        int len = 0;
-        for (int i = 0; i < n; ++i) {
-			len += path.segment(i).length();
-		}
-        // account for /'s
-        if (n > 1) {
-			len += n - 1;
-		}
-        StringBuffer sb = new StringBuffer(len);
-        for (int i = 0; i < n; ++i) {
-            if (i != 0) {
-				sb.append('/');
-			}
-            sb.append(path.segment(i));
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Returns the image with the given key, or <code>null</code> if not found.
-     */
-    static Image getImage(String key) {
-        Image image = imageRegistry.get(key);
-        if (image == null) {
-            ImageDescriptor desc = getImageDescriptor(key);
-            if (desc != null) {
-                image = desc.createImage(false);
-                if (image == null) {
-                    System.err
-                            .println("TaskList: Error creating image for " + key);//$NON-NLS-1$
-                }
-                imageRegistry.put(key, image);
-            }
-        }
-        return image;
-    }
-
-    /**
-     * Returns the image that should be used to visually represent
-     * the marker, based on its type and priority.
-     */
-    static public Image getImage(IMarker marker) {
-        if (isMarkerType(marker, IMarker.PROBLEM)) {
-            switch (getSeverity(marker)) {
-            case IMarker.SEVERITY_ERROR:
-                return getImage("error");//$NON-NLS-1$
-            case IMarker.SEVERITY_WARNING:
-                return getImage("warn");//$NON-NLS-1$
-            case IMarker.SEVERITY_INFO:
-                return getImage("info");//$NON-NLS-1$
-            }
-        } else if (isMarkerType(marker, IMarker.TASK)) {
-            return getImage("task");//$NON-NLS-1$
-        }
-        return null;
-    }
-
-    /**
-     * Returns the image descriptor with the given key, or <code>null</code> if not found.
-     */
-    static ImageDescriptor getImageDescriptor(String key) {
-        ImageDescriptor desc = (ImageDescriptor) imageDescriptors.get(key);
-        if (desc == null) {
-        		IDEWorkbenchPlugin.log("TaskList: No image descriptor for " + key); //$NON-NLS-1$
-        }
-        return desc;
-    }
-
-    /**
-     * Returns the text for the line and location column given the marker.
-     */
-    public static String getLineAndLocation(IMarker marker) {
-        int lineNumber = getLineNumber(marker);
-        String location = getLocation(marker);
-        return getLineAndLocation(lineNumber, location);
-    }
-
-    /**
-     * Returns the text for the line and location column given the line number and location text.
-     */
-    public static String getLineAndLocation(int lineNumber, String location) {
-        if (lineNumber == -1) {
-            if (location.equals("")) {//$NON-NLS-1$
-                return "";//$NON-NLS-1$
-            } else {
-                return location;
-            }
-        } else {
-            if (location.equals("")) {//$NON-NLS-1$
-                return line
-                        .format(new Object[] { Integer.toString(lineNumber) });
-            } else {
-                return lineAndLocation.format(new Object[] {
-                        Integer.toString(lineNumber), location });
-            }
-        }
-    }
-
-    /**
-     * Returns the line number of the given marker.
-     */
-    public static int getLineNumber(IMarker marker) {
-        return marker.getAttribute(IMarker.LINE_NUMBER, -1);
-    }
-
-    /**
-     * Returns the text for the location field.
-     */
-    public static String getLocation(IMarker marker) {
-        return marker.getAttribute(IMarker.LOCATION, "");//$NON-NLS-1$
-    }
-
-    /**
-     * Returns the message attribute of the given marker,
-     * or the empty string if the message attribute is not defined.
-     */
-    public static String getMessage(IMarker marker) {
-        return marker.getAttribute(IMarker.MESSAGE, "");//$NON-NLS-1$
-    }
-
-    /**
-     * Returns the numeric value of the given string, which is assumed to represent a numeric value.
-     *
-     * @return <code>true</code> if numeric, <code>false</code> if not
-     */
-    static public int getNumericValue(String value) {
-        boolean negative = false;
-        int i = 0;
-        int len = value.length();
-
-        // skip any leading '#'
-        // workaround for 1GCE69U: ITPJCORE:ALL - Java problems should not have '#' in location.
-        if (i < len && value.charAt(i) == '#') {
-			++i;
-		}
-
-        if (i < len && value.charAt(i) == '-') {
-            negative = true;
-            ++i;
-        }
-
-        int result = 0;
-        while (i < len) {
-            int digit = Character.digit(value.charAt(i++), 10);
-            if (digit < 0) {
-                return result;
-            }
-            result = result * 10 + digit;
-        }
-        if (negative) {
-            result = -result;
-        }
-        return result;
-    }
-
-    /**
-     * Returns the priority of the given marker.  Default is PRIORITY_NORMAL.
-     */
-    public static int getPriority(IMarker marker) {
-        return marker.getAttribute(IMarker.PRIORITY, IMarker.PRIORITY_NORMAL);
-    }
-
-    /**
-     * Returns an image that should visually represent marker's priority
-     * in the tasklist.
-     */
-    public static Image getPriorityImage(IMarker marker) {
-        switch (getPriority(marker)) {
-        case IMarker.PRIORITY_HIGH:
-            return getImage("hprio");//$NON-NLS-1$
-        case IMarker.PRIORITY_NORMAL:
-            return null; // no image for normal priority
-        case IMarker.PRIORITY_LOW:
-            return getImage("lprio");//$NON-NLS-1$
-        }
-        return null;
-    }
-
-    /**
-     * Returns the text for the given marker's priority.
-     */
-    public static String getPriorityText(IMarker marker) {
-        if (!isMarkerType(marker, IMarker.TASK)) {
-			return ""; //$NON-NLS-1$
-		}
-
-        switch (getPriority(marker)) {
-        case IMarker.PRIORITY_HIGH:
-            return TaskListMessages.TaskList_high; 
-        case IMarker.PRIORITY_NORMAL:
-            return TaskListMessages.TaskList_normal;
-        case IMarker.PRIORITY_LOW:
-            return TaskListMessages.TaskList_low;
-        }
-        return ""; //$NON-NLS-1$		
-    }
-
-    /**
-     * Implements IProvider interface by supporting a number of
-     * properties required for visual representation of markers
-     * in the tasklist.
-     */
-    static public Object getProperty(Object object, String key) {
-        IMarker marker = (IMarker) object;
-
-        // optimizations:
-        // - check properties needed for TaskListLabelProvider first,
-        //   then those needed for cell modifiers
-        // - use == instead of equals for efficiency
-        if (IBasicPropertyConstants.P_IMAGE == key) {
-            return getImage(marker);
-        }
-        if (IMarkerConstants.P_COMPLETE_IMAGE == key) {
-            return getCompleteImage(marker);
-        }
-        if (IMarkerConstants.P_PRIORITY_IMAGE == key) {
-            return getPriorityImage(marker);
-        }
-        if (IMarker.MESSAGE == key) {
-            return getMessage(marker);
-        }
-        if (IMarkerConstants.P_RESOURCE_NAME == key) {
-            return getResourceName(marker);
-        }
-        if (IMarkerConstants.P_CONTAINER_NAME == key) {
-            return getContainerName(marker);
-        }
-        if (IMarkerConstants.P_LINE_AND_LOCATION == key) {
-            return getLineAndLocation(marker);
-        }
-        if (IMarker.PRIORITY == key) {
-            // this property is used only by cell editor, where order is High, Normal, Low
-            return new Integer(IMarker.PRIORITY_HIGH - getPriority(marker));
-        }
-        if (IMarker.DONE == key) {
-            return isComplete(marker) ? Boolean.TRUE : Boolean.FALSE;
-        }
-        if (IBasicPropertyConstants.P_TEXT == key) {
-            return getMessage(marker);
-        }
-        return null;
-    }
-
-    /**
-     * Returns name if it is defined, or
-     * blank string if not.
-     */
-    public static String getResourceName(IMarker marker) {
-        return marker.getResource().getName();
-    }
-
-    /**
-     * Returns the severity of the given marker.  Default is SEVERITY_WARNING.
-     */
-    public static int getSeverity(IMarker marker) {
-        return marker.getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
-    }
-
-    /**
-     * A helper method that returns true if the given
-     * marker is marked as complete in the tasklist.
-     * Only tasks can be complete.
-     */
-    public static boolean isComplete(IMarker marker) {
-        return marker.getAttribute(IMarker.DONE, false);
-    }
-
-    /**
-     * Returns whether the given marker is editable.
-     * Only tasks which have not been marked as read-only are editable.
-     */
-    public static boolean isEditable(IMarker marker) {
-        return isMarkerType(marker, IMarker.TASK) && !isReadOnly(marker);
-    }
-
-    /**
-     * Returns whether the given marker is of the given type (either directly or indirectly).
-     */
-    public static boolean isMarkerType(IMarker marker, String type) {
-        try {
-            return marker.isSubtypeOf(type);
-        } catch (CoreException e) {
-            return false;
-        }
-    }
-
-    /**
-     * Returns whether the given marker is read-only.
-     */
-    public static boolean isReadOnly(IMarker marker) {
-        return !marker.getAttribute(IMarker.USER_EDITABLE, true);
-    }
-
-    /**
-     * Returns the creation time of the marker as a string.
-     */
-    public static String getCreationTime(IMarker marker) {
-        try {
-            return DateFormat.getDateTimeInstance(DateFormat.LONG,
-                    DateFormat.MEDIUM).format(
-                    new Date(marker.getCreationTime()));
-        } catch (CoreException e) {
-            return null;
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/NewTaskAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/NewTaskAction.java
deleted file mode 100644
index cf7ef7d..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/NewTaskAction.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.views.tasklist.TaskListMessages;
-
-/**
- * This action creates a new task. If a resource is currently
- * present at the tasklist's input, this task will be
- * associated with it. If the tasklist is currently
- * observing all the markers in the workbench, the task
- * will not be associated with any resource.
- * <p>The newly created task will have low priority,
- * fixed description text and will not be subject to
- * sorting or filtering until its desciprion is being
- * changed for the first time. For this reason, new
- * tasks remain at the top of the task list
- * until modified. It is possible that the newly
- * created task dissapears after that if its
- * type or some other property causes it to
- * be filtered out.
- */
-class NewTaskAction extends TaskAction {
-
-    /**
-     * Creates the action.
-     * 
-     * @param tasklist the task list
-     * @param id the id
-     */
-    public NewTaskAction(TaskList tasklist, String id) {
-        super(tasklist, id);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				ITaskListHelpContextIds.NEW_TASK_ACTION);
-    }
-
-    /**
-     * Opens the new task dialog and shows the newly created task when done.
-     * The new task is created on the currently selected resource.
-     */
-    public void run() {
-        TaskPropertiesDialog dialog = new TaskPropertiesDialog(getShell());
-        dialog.setResource(getTaskList().getResource());
-        int result = dialog.open();
-        if (result == Window.OK) {
-            showMarker(dialog.getMarker());
-        }
-    }
-
-    /**
-     * Show the newly created marker.
-     */
-    private void showMarker(final IMarker marker) {
-        if (marker == null) {
-            return;
-        }
-        if (getTaskList().shouldShow(marker)) {
-            // Need to do this in an asyncExec, even though we're in the UI thread here,
-            // since the task list updates itself with the addition in an asyncExec,
-            // which hasn't been processed yet.
-            getShell().getDisplay().asyncExec(new Runnable() {
-                public void run() {
-                    getTaskList().setSelection(new StructuredSelection(marker),
-                            true);
-                }
-            });
-        } else {
-            MessageDialog.openInformation(getShell(), TaskListMessages.NewTask_notShownTitle, 
-                    TaskListMessages.NewTask_notShownMsg); 
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/PasteTaskAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/PasteTaskAction.java
deleted file mode 100644
index b848462..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/PasteTaskAction.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import java.util.ArrayList;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.CreateMarkersOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.views.tasklist.TaskListMessages;
-import org.eclipse.ui.part.MarkerTransfer;
-
-/**
- * Standard action for pasting tasks from the clipboard.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @since 2.0
- */
-class PasteTaskAction extends TaskAction {
-
-    /**
-     * Creates a new action.
-     * 
-     * @param tasklist the task list
-     * @param id the id
-     */
-    public PasteTaskAction(TaskList tasklist, String id) {
-        super(tasklist, id);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				ITaskListHelpContextIds.PASTE_TASK_ACTION);
-    }
-
-    /**
-     * Implementation of method defined on <code>IAction</code>.
-     */
-    public void run() {
-        // Get the markers from the clipboard
-        MarkerTransfer transfer = MarkerTransfer.getInstance();
-        final IMarker[] markerData = (IMarker[]) getTaskList().getClipboard()
-                .getContents(transfer);
-
-        if (markerData == null) {
-			return;
-		}
-
-        final ArrayList newMarkerAttributes = new ArrayList();
-        final ArrayList newMarkerResources = new ArrayList();
-
-        try {
-            getTaskList().getWorkspace().run(new IWorkspaceRunnable() {
-                public void run(IProgressMonitor monitor) throws CoreException {
-                    for (int i = 0; i < markerData.length; i++) {
-                        // Only paste tasks 
-                        if (!markerData[i].getType().equals(IMarker.TASK)) {
-							continue;
-						}
-                        newMarkerResources.add(markerData[i].getResource());
-                        newMarkerAttributes.add(markerData[i].getAttributes());
-                    }
-                }
-            }, null);
-        } catch (CoreException e) {
-            ErrorDialog.openError(getShell(), TaskListMessages.PasteTask_errorMessage, 
-                    null, e.getStatus());
-            return;
-        }
-        
-		final Map [] attrs = (Map []) newMarkerAttributes.toArray(new Map [newMarkerAttributes.size()]);
-		final IResource [] resources = (IResource []) newMarkerResources.toArray(new IResource [newMarkerResources.size()]);
-		final CreateMarkersOperation op = new CreateMarkersOperation(IMarker.TASK, attrs,
-				resources, getText());
-		execute(op, TaskListMessages.PasteTask_errorMessage, null,
-				WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
-
-        // Need to do this in an asyncExec, even though we're in the UI thread here,
-        // since the task list updates itself with the addition in an asyncExec,
-        // which hasn't been processed yet.
-        // Must be done outside the create marker operation above since notification for add is
-        // sent after the operation is executed.
-        if (op.getMarkers() != null) {
-            getShell().getDisplay().asyncExec(new Runnable() {
-                public void run() {
-                    TaskList taskList = getTaskList();
-                    taskList.setSelection(new StructuredSelection(op.getMarkers()),
-                            true);
-                }
-            });
-        }
-    }
-
-}
-
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/PurgeCompletedAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/PurgeCompletedAction.java
deleted file mode 100644
index e1c77c3..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/PurgeCompletedAction.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.DeleteMarkersOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.views.tasklist.TaskListMessages;
-
-/**
- * This action deletes all the tasks found in the registry that
- * are marked as completed.
- */
-class PurgeCompletedAction extends TaskAction {
-
-    /**
-     * Creates the action.
-     * 
-     * @param tasklist the task list
-     * @param id the id
-     */
-    public PurgeCompletedAction(TaskList tasklist, String id) {
-        super(tasklist, id);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                ITaskListHelpContextIds.PURGE_COMPLETED_TASK_ACTION);
-    }
-
-    /**
-     * Fetches all the completed tasks in the workspace and deletes them.
-     */
-    public void run() {
-        IResource resource = getTaskList().getResource();
-        int depth = getTaskList().getResourceDepth();
-        IMarker[] tasks;
-        try {
-        	tasks = resource.findMarkers(IMarker.TASK, true, depth);
-        } catch (CoreException e) {
-            ErrorDialog.openError(
-                    getShell(),
-                    TaskListMessages.PurgeCompleted_errorMessage, null, e.getStatus()); 
-
-        	return;
-        }
-        final List completed = new ArrayList();
-        for (int i = 0; i < tasks.length; i++) {
-            IMarker task = tasks[i];
-            if (MarkerUtil.isComplete(task) && !MarkerUtil.isReadOnly(task)) {
-                completed.add(task);
-            }
-        }
-        // Check if there is anything to do
-        if (completed.size() == 0) {
-            MessageDialog.openInformation(getShell(), TaskListMessages.PurgeCompleted_title, 
-                    TaskListMessages.PurgeCompleted_noneCompleted); 
-            return;
-        }
-
-        // Verify.
-        if (!MessageDialog.openConfirm(getShell(), TaskListMessages.PurgeCompleted_title,
-                NLS.bind(TaskListMessages.PurgeCompleted_permanent,String.valueOf(completed.size())))) {
-            return;
-        }
-
-        IMarker[] toDelete = new IMarker[completed.size()];
-        completed.toArray(toDelete);
-		IUndoableOperation op = new DeleteMarkersOperation(toDelete, getText());
-		execute(op, TaskListMessages.PurgeCompleted_errorMessage, null,
-				WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/RemoveTaskAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/RemoveTaskAction.java
deleted file mode 100644
index e7aacc4..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/RemoveTaskAction.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import java.util.List;
-
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.DeleteMarkersOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.views.tasklist.TaskListMessages;
-
-/**
- * This action removes the selected task(s) from the task list.
- * Only tasks can be removed. Problems can only disappear from
- * the task list when they are fixed in the associated code.
- */
-class RemoveTaskAction extends TaskAction {
-
-    /**
-     * Creates the action.
-     * 
-     * @param tasklist the task list
-     * @param id the id
-     */
-    public RemoveTaskAction(TaskList tasklist, String id) {
-        super(tasklist, id);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				ITaskListHelpContextIds.REMOVE_TASK_ACTION);
-    }
-
-    /**
-     * Removes all the tasks in the current selection from the task list.
-     */
-    public void run() {
-        TaskList taskList = getTaskList();
-        TableViewer viewer = taskList.getTableViewer();
-        IStructuredSelection selection = (IStructuredSelection) viewer
-                .getSelection();
-        if (selection.isEmpty()) {
-            return;
-        }
-        taskList.cancelEditing();
-        // get the index of the selected item which has focus
-        Table table = viewer.getTable();
-        int focusIndex = table.getSelectionIndex();
-        List list = selection.toList();
-        IMarker[] markers = new IMarker[list.size()];
-        list.toArray(markers);
-     	IUndoableOperation op = new DeleteMarkersOperation(markers, TaskListMessages.RemoveTask_undoText);
-   		execute(op, TaskListMessages.RemoveTask_errorMessage, null,
-   				WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
-        // set the selection to be the one which took the place of the one with focus
-        int count = table.getItemCount();
-        if (focusIndex < count) {
-        	table.setSelection(focusIndex);
-        } else if (count != 0) {
-        	table.setSelection(count - 1);
-        }
-        // update the viewer's selection, since setting the table selection does not notify the viewer
-        viewer.setSelection(viewer.getSelection(), true);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/ResolveMarkerAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/ResolveMarkerAction.java
deleted file mode 100644
index f0822ea..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/ResolveMarkerAction.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.MarkerResolutionSelectionDialog;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.views.tasklist.TaskListMessages;
-
-/**
- * This action displays a list of resolutions for the selected marker
- * 
- * @since 2.0
- */
-class ResolveMarkerAction extends TaskAction {
-
-    /**
-     * Creates the action.
-     */
-    protected ResolveMarkerAction(TaskList tasklist, String id) {
-        super(tasklist, id);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                ITaskListHelpContextIds.RESOLVE_MARKER_ACTION);
-    }
-
-    /**
-     * Returns whether this action should be enabled given the selection.
-     * 
-     * @param selection the selection
-     * @return enablement
-     */
-    public boolean shouldEnable(IStructuredSelection selection) {
-        if (selection.size() != 1) {
-			return false;
-		}
-        IMarker marker = (IMarker) selection.getFirstElement();
-        if (marker == null) {
-			return false;
-		}
-        return IDE.getMarkerHelpRegistry().hasResolutions(marker);
-    }
-
-    /**
-     * Displays a list of resolutions and performs the selection.
-     */
-    public void run() {
-        IMarker marker = getMarker();
-        if (marker == null) {
-            return;
-        }
-        getTaskList().cancelEditing();
-        IMarkerResolution[] resolutions = getResolutions(marker);
-        if (resolutions.length == 0) {
-            MessageDialog.openInformation(getShell(), TaskListMessages.Resolve_title, 
-                    TaskListMessages.Resolve_noResolutionsLabel); 
-            return;
-        }
-        MarkerResolutionSelectionDialog d = new MarkerResolutionSelectionDialog(
-                getShell(), resolutions);
-        if (d.open() != Window.OK) {
-			return;
-		}
-        Object[] result = d.getResult();
-        if (result != null && result.length > 0) {
-			((IMarkerResolution) result[0]).run(marker);
-		}
-    }
-
-    /**
-     * Returns the resolutions for the given marker.
-     *
-     * @param marker the marker for which to obtain resolutions
-     * @return the resolutions for the selected marker	
-     */
-    private IMarkerResolution[] getResolutions(IMarker marker) {
-        return IDE.getMarkerHelpRegistry().getResolutions(marker);
-    }
-
-    /**
-     * Returns the selected marker (may be <code>null</code>).
-     * 
-     * @return the selected marker
-     */
-    private IMarker getMarker() {
-        IStructuredSelection selection = (IStructuredSelection) getTaskList()
-                .getSelection();
-        // only enable for single selection
-        if (selection.size() != 1) {
-			return null;
-		}
-        return (IMarker) selection.getFirstElement();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/SelectAllTasksAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/SelectAllTasksAction.java
deleted file mode 100644
index de868ec..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/SelectAllTasksAction.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This action selects all tasks currently showing in the task list.
- */
-class SelectAllTasksAction extends TaskAction {
-
-    /**
-     * Creates the action.
-     */
-    protected SelectAllTasksAction(TaskList tasklist, String id) {
-        super(tasklist, id);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                ITaskListHelpContextIds.SELECT_ALL_TASKS_ACTION);
-    }
-
-    /**
-     * Selects all resources in the view.
-     */
-    public void run() {
-        getTaskList().cancelEditing();
-        TableViewer viewer = getTaskList().getTableViewer();
-        viewer.getTable().selectAll();
-        // force viewer selection change
-        viewer.setSelection(viewer.getSelection());
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskAction.java
deleted file mode 100644
index a25309c..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskAction.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * This is the base class of all the local actions used in the task list view.
- */
-abstract class TaskAction extends Action {
-
-	private TaskList taskList;
-
-	/**
-	 * TaskAction constructor.
-	 */
-	protected TaskAction(TaskList tasklist, String id) {
-		super();
-		this.taskList = tasklist;
-		setId(id);
-	}
-
-	/**
-	 * Returns the shell to use within actions.
-	 */
-	protected Shell getShell() {
-		return taskList.getSite().getShell();
-	}
-
-	/**
-	 * Returns the task list viewer.
-	 */
-	protected TaskList getTaskList() {
-		return taskList;
-	}
-
-	/**
-	 * Stores the current state value of this toggle action into the dialog
-	 * store using action ID as a key.
-	 */
-	protected void storeValue() {
-		IDialogSettings workbenchSettings = TaskList.getPlugin()
-				.getDialogSettings();
-		IDialogSettings settings = workbenchSettings.getSection("TaskAction");//$NON-NLS-1$
-		if (settings == null) {
-			settings = workbenchSettings.addNewSection("TaskAction");//$NON-NLS-1$
-		}
-		settings.put(getId(), isChecked());
-	}
-
-	/**
-	 * Execute the specified undoable operation
-	 */
-	void execute(IUndoableOperation operation, String title,
-			IProgressMonitor monitor, IAdaptable uiInfo) {
-		try {
-			PlatformUI.getWorkbench().getOperationSupport()
-					.getOperationHistory().execute(operation, monitor, uiInfo);
-		} catch (ExecutionException e) {
-			if (e.getCause() instanceof CoreException) {
-				ErrorDialog
-						.openError(WorkspaceUndoUtil.getShell(uiInfo), title,
-								null, ((CoreException) e.getCause())
-										.getStatus());
-			} else {
-				IDEWorkbenchPlugin.log(title, e);
-			}
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskList.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskList.java
deleted file mode 100644
index b1e05dd..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskList.java
+++ /dev/null
@@ -1,1738 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Cagatay Kavukcuoglu <cagatayk@acm.org> - Filter for markers in same project
- *     Sebastian Davids <sdavids@gmx.de> - Reordered menu items
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CheckboxCellEditor;
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IOpenListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.OpenEvent;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.ACC;
-import org.eclipse.swt.accessibility.AccessibleControlAdapter;
-import org.eclipse.swt.accessibility.AccessibleControlEvent;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.custom.StackLayout;
-import org.eclipse.swt.custom.TableEditor;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSourceAdapter;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.HelpEvent;
-import org.eclipse.swt.events.HelpListener;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-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.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.ide.ResourceUtil;
-import org.eclipse.ui.internal.views.tasklist.TaskListMessages;
-import org.eclipse.ui.part.CellEditorActionHandler;
-import org.eclipse.ui.part.IShowInSource;
-import org.eclipse.ui.part.IShowInTargetList;
-import org.eclipse.ui.part.MarkerTransfer;
-import org.eclipse.ui.part.ShowInContext;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.views.markers.MarkerSupportView;
-
-/**
- * Main class for the Task List view for displaying tasks and problem annotations
- * on resources, and for opening an editor on the resource when the user commands.
- * 
- * @deprecated This view is no longer in use as of Eclipse 3.4.
- * The view referenced by {@link IPageLayout#ID_TASK_LIST} is an {@link MarkerSupportView}.
- * </p>
- * @noinstantiate This class is not intended to be instantiated by clients.
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class TaskList extends ViewPart {
-
-    private Table table;
-
-    private TaskSorter comparator;
-
-    private CellEditor descriptionEditor;
-
-    private TableViewer viewer;
-
-    private TasksFilter filter = new TasksFilter();
-
-    private IMemento memento;
-
-    private boolean markerLimitExceeded;
-
-    private Composite parent;
-
-    private StackLayout stackLayout = new StackLayout();
-
-    private Composite compositeMarkerLimitExceeded;
-
-    private CellEditorActionHandler editorActionHandler;
-
-    private TaskAction newTaskAction;
-
-    private TaskAction copyTaskAction;
-
-    private TaskAction pasteTaskAction;
-
-    private TaskAction removeTaskAction;
-
-    private TaskAction purgeCompletedAction;
-
-    private TaskAction gotoTaskAction;
-
-    private TaskAction selectAllAction;
-
-    private ResolveMarkerAction resolveMarkerAction;
-
-    private TaskAction filtersAction;
-
-    private MarkCompletedAction markCompletedAction;
-
-    private TaskAction propertiesAction;
-
-    //sort by action
-    private Action sortByCategoryAction;
-
-    private Action sortByCompletedAction;
-
-    private Action sortByPriorityAction;
-
-    private Action sortByDescriptionAction;
-
-    private Action sortByResourceAction;
-
-    private Action sortByContainerAction;
-
-    private Action sortByLocationAction;
-
-    private Action sortByCreationTimeAction;
-
-    private Action sortAscendingAction;
-
-    private Action sortDescendingAction;
-
-    private Clipboard clipboard;
-
-    private static String[] tableColumnProperties = {
-            IBasicPropertyConstants.P_IMAGE, IMarker.DONE, IMarker.PRIORITY,
-            IMarker.MESSAGE, IMarkerConstants.P_RESOURCE_NAME,
-            IMarkerConstants.P_CONTAINER_NAME,
-            IMarkerConstants.P_LINE_AND_LOCATION };
-
-    // Persistance tags.
-    private static final String TAG_COLUMN = "column"; //$NON-NLS-1$
-
-    private static final String TAG_NUMBER = "number"; //$NON-NLS-1$
-
-    private static final String TAG_WIDTH = "width"; //$NON-NLS-1$
-
-    private static final String TAG_FILTER = "filter"; //$NON-NLS-1$
-
-    private static final String TAG_SELECTION = "selection"; //$NON-NLS-1$
-
-    private static final String TAG_ID = "id"; //$NON-NLS-1$
-
-    private static final String TAG_MARKER = "marker"; //$NON-NLS-1$
-
-    private static final String TAG_RESOURCE = "resource"; //$NON-NLS-1$
-
-    private static final String TAG_TOP_INDEX = "topIndex"; //$NON-NLS-1$
-
-    private static final String TAG_SORT_SECTION = "TaskListSortState"; //$NON-NLS-1$
-
-    static class TaskListLabelProvider extends LabelProvider implements
-            ITableLabelProvider {
-
-        private static String[] keys = { IBasicPropertyConstants.P_IMAGE,
-                IMarkerConstants.P_COMPLETE_IMAGE,
-                IMarkerConstants.P_PRIORITY_IMAGE, IMarker.MESSAGE,
-                IMarkerConstants.P_RESOURCE_NAME,
-                IMarkerConstants.P_CONTAINER_NAME,
-                IMarkerConstants.P_LINE_AND_LOCATION };
-
-        public String getColumnText(Object element, int columnIndex) {
-            if (columnIndex >= 3 && columnIndex <= 6) {
-				return (String) MarkerUtil.getProperty(element,
-                        keys[columnIndex]);
-			}
-            return ""; //$NON-NLS-1$
-        }
-
-        public Image getColumnImage(Object element, int columnIndex) {
-            if (columnIndex >= 0 && columnIndex <= 2) {
-                return (Image) MarkerUtil.getProperty(element,
-                        keys[columnIndex]);
-            }
-            return null;
-        }
-    }
-
-    class SortByAction extends Action {
-
-        private int column;
-
-        /**
-         * @param column
-         */
-        public SortByAction(int column) {
-            this.column = column;
-        }
-
-        public void run() {
-            comparator.setTopPriority(column);
-            updateSortingState();
-            viewer.refresh();
-            IDialogSettings workbenchSettings = getPlugin().getDialogSettings();
-            IDialogSettings settings = workbenchSettings
-                    .getSection(TAG_SORT_SECTION);
-            if (settings == null) {
-				settings = workbenchSettings.addNewSection(TAG_SORT_SECTION);
-			}
-            comparator.saveState(settings);
-        }
-    }
-
-    class SortDirectionAction extends Action {
-
-        private int direction;
-
-        /**
-         * @param direction
-         */
-        public SortDirectionAction(int direction) {
-            this.direction = direction;
-        }
-
-        public void run() {
-            comparator.setTopPriorityDirection(direction);
-            updateSortingState();
-            viewer.refresh();
-            IDialogSettings workbenchSettings = getPlugin().getDialogSettings();
-            IDialogSettings settings = workbenchSettings
-                    .getSection(TAG_SORT_SECTION);
-            if (settings == null) {
-				settings = workbenchSettings.addNewSection(TAG_SORT_SECTION);
-			}
-            comparator.saveState(settings);
-        }
-    }
-
-    private String columnHeaders[] = {
-            TaskListMessages.TaskList_headerIcon,
-            TaskListMessages.TaskList_headerCompleted, 
-            TaskListMessages.TaskList_headerPriority, 
-            TaskListMessages.TaskList_headerDescription, 
-            TaskListMessages.TaskList_headerResource,
-            TaskListMessages.TaskList_headerFolder, 
-            TaskListMessages.TaskList_headerLocation
-    };
-
-    private ColumnLayoutData columnLayouts[] = {
-            new ColumnPixelData(16, false, true), new ColumnPixelData(16, false, true),
-            new ColumnPixelData(16, false, true), new ColumnWeightData(200),
-            new ColumnWeightData(75), new ColumnWeightData(150),
-            new ColumnWeightData(60) };
-
-    private IPartListener partListener = new IPartListener() {
-        public void partActivated(IWorkbenchPart part) {
-            TaskList.this.partActivated(part);
-        }
-
-        public void partBroughtToTop(IWorkbenchPart part) {
-        }
-
-        public void partClosed(IWorkbenchPart part) {
-            TaskList.this.partClosed(part);
-        }
-
-        public void partDeactivated(IWorkbenchPart part) {
-        }
-
-        public void partOpened(IWorkbenchPart part) {
-        }
-    };
-
-    private ISelectionChangedListener focusSelectionChangedListener = new ISelectionChangedListener() {
-        public void selectionChanged(SelectionChangedEvent event) {
-            TaskList.this.focusSelectionChanged(event);
-        }
-    };
-
-    private IResource[] focusResources;
-
-    private IWorkbenchPart focusPart;
-
-    private ISelectionProvider focusSelectionProvider;
-
-    private ICellModifier cellModifier = new ICellModifier() {
-        public Object getValue(Object element, String property) {
-            return MarkerUtil.getProperty(element, property);
-        }
-
-        public boolean canModify(Object element, String property) {
-            return MarkerUtil.isEditable((IMarker) element);
-        }
-
-        /**
-         * Modifies a marker as a result of a successfully completed direct editing.
-         */
-        public void modify(Object element, String property, Object value) {
-            Item item = (Item) element;
-            IMarker marker = (IMarker) item.getData();
-            setProperty(marker, property, value);
-        }
-    };
-
-    /**
-     * Creates a new task list view.
-     */
-    public TaskList() {
-        super();
-    }
-
-    /**
-     * @param control
-     */
-    void addDragSupport(Control control) {
-
-        int operations = DND.DROP_COPY;
-        Transfer[] transferTypes = new Transfer[] {
-                MarkerTransfer.getInstance(), TextTransfer.getInstance() };
-        DragSourceListener listener = new DragSourceAdapter() {
-            public void dragSetData(DragSourceEvent event) {
-                performDragSetData(event);
-            }
-
-            public void dragFinished(DragSourceEvent event) {
-            }
-        };
-        viewer.addDragSupport(operations, transferTypes, listener);
-    }
-
-    void cancelEditing() {
-        getTableViewer().cancelEditing();
-    }
-
-    void createColumns() {
-        /**
-         * This class handles selections of the column headers.
-         * Selection of the column header will cause resorting
-         * of the shown tasks using that column's sorter.
-         * Repeated selection of the header will toggle
-         * sorting order (ascending versus descending).
-         */
-        SelectionListener headerListener = new SelectionAdapter() {
-            /**
-             * Handles the case of user selecting the
-             * header area.
-             * <p>If the column has not been selected previously,
-             * it will set the sorter of that column to be
-             * the current tasklist sorter. Repeated
-             * presses on the same column header will
-             * toggle sorting order (ascending/descending).
-             */
-            public void widgetSelected(SelectionEvent e) {
-                // column selected - need to sort
-                int column = table.indexOf((TableColumn) e.widget);
-                if (column == comparator.getTopPriority()) {
-					comparator.reverseTopPriority();
-				} else {
-                    comparator.setTopPriority(column);
-                }
-                updateSortingState();
-                viewer.refresh();
-                IDialogSettings workbenchSettings = getPlugin()
-                        .getDialogSettings();
-                IDialogSettings settings = workbenchSettings
-                        .getSection(TAG_SORT_SECTION);
-                if (settings == null) {
-					settings = workbenchSettings
-                            .addNewSection(TAG_SORT_SECTION);
-				}
-                comparator.saveState(settings);
-            }
-        };
-
-        if (memento != null) {
-            //restore columns width
-            IMemento children[] = memento.getChildren(TAG_COLUMN);
-            if (children != null) {
-                for (int i = 0; i < children.length; i++) {
-                    Integer val = children[i].getInteger(TAG_NUMBER);
-                    if (val != null) {
-                        int index = val.intValue();
-                        val = children[i].getInteger(TAG_WIDTH);
-                        if (val != null) {
-                            columnLayouts[index] = new ColumnPixelData(val
-                                    .intValue(), true);
-                        }
-                    }
-                }
-            }
-        }
-
-        boolean text = Util.isMac();
-        TableLayout layout = new TableLayout();
-        table.setLayout(layout);
-        table.setHeaderVisible(true);
-
-        for (int i = 0; i < columnHeaders.length; i++) {
-            TableColumn tc = new TableColumn(table, SWT.NONE, i);
-
-            if (!text && i == 1) {
-				tc.setImage(MarkerUtil.getImage("header_complete")); //$NON-NLS-1$
-			} else if (!text && i == 2) {
-				tc.setImage(MarkerUtil.getImage("header_priority")); //$NON-NLS-1$
-			} else {
-				tc.setText(columnHeaders[i]);
-			}
-
-            if (text && (i == 1 || i == 2)) {
-                tc.pack();
-                columnLayouts[i] = new ColumnPixelData(Math.max(16, tc
-                        .getWidth()), false, true);
-            }
-
-            tc.setResizable(columnLayouts[i].resizable);
-            layout.addColumnData(columnLayouts[i]);
-            tc.addSelectionListener(headerListener);
-        }
-    }
-
-    /**
-     * Returns a string that summarizes the contents of the
-     * given markers.
-     */
-    static String createMarkerReport(IMarker[] markers) {
-        StringBuffer buf = new StringBuffer();
-        // Create the header
-        buf.append(TaskListMessages.TaskList_reportKind);
-        buf.append("\t"); //$NON-NLS-1$
-        buf.append(TaskListMessages.TaskList_reportStatus); 
-        buf.append("\t"); //$NON-NLS-1$
-        buf.append(TaskListMessages.TaskList_reportPriority); 
-        buf.append("\t"); //$NON-NLS-1$
-        buf.append(TaskListMessages.TaskList_headerDescription);
-        buf.append("\t"); //$NON-NLS-1$
-        buf.append(TaskListMessages.TaskList_headerResource); 
-        buf.append("\t"); //$NON-NLS-1$
-        buf.append(TaskListMessages.TaskList_headerFolder); 
-        buf.append("\t"); //$NON-NLS-1$
-        buf.append(TaskListMessages.TaskList_headerLocation); 
-        buf.append(System.getProperty("line.separator")); //$NON-NLS-1$
-
-        // Create the report for the markers
-        for (int i = 0; i < markers.length; i++) {
-            writeMarker(buf, markers[i]);
-        }
-        return buf.toString();
-    }
-
-    /**
-     * Writes a string representation of the given marker to the buffer.
-     */
-    static void writeMarker(StringBuffer buf, IMarker marker) {
-        buf.append(MarkerUtil.getKindText(marker));
-        buf.append("\t"); //$NON-NLS-1$
-        buf.append(MarkerUtil.getCompleteText(marker));
-        buf.append("\t"); //$NON-NLS-1$
-        buf.append(MarkerUtil.getPriorityText(marker));
-        buf.append("\t"); //$NON-NLS-1$
-        buf.append(MarkerUtil.getMessage(marker));
-        buf.append("\t"); //$NON-NLS-1$
-        buf.append(MarkerUtil.getResourceName(marker));
-        buf.append("\t"); //$NON-NLS-1$
-        buf.append(MarkerUtil.getContainerName(marker));
-        buf.append("\t"); //$NON-NLS-1$
-        buf.append(MarkerUtil.getLineAndLocation(marker));
-        buf.append(System.getProperty("line.separator")); //$NON-NLS-1$
-    }
-
-    /* package */
-    boolean isMarkerLimitExceeded() {
-        return markerLimitExceeded;
-    }
-
-    /* package */
-    void setMarkerLimitExceeded(boolean markerLimitExceeded) {
-        this.markerLimitExceeded = markerLimitExceeded;
-
-        if (markerLimitExceeded) {
-            stackLayout.topControl = compositeMarkerLimitExceeded;
-        } else {
-            stackLayout.topControl = table;
-        }
-
-        parent.layout();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchPart.
-     */
-    public void createPartControl(Composite parent) {
-        //	long t = System.currentTimeMillis();
-        createPartControl0(parent);
-        //	t = System.currentTimeMillis() - t;
-        //	System.out.println("TaskList.createPartControl: " + t + "ms");
-    }
-
-    private void createPartControl0(Composite parent) {
-        this.parent = parent;
-        clipboard = new Clipboard(parent.getDisplay());
-        createTable(parent);
-        viewer = new TableViewer(table);
-        viewer.setUseHashlookup(true);
-        createColumns();
-        makeActions();
-        fillActionBars();
-        addDragSupport(table);
-
-        compositeMarkerLimitExceeded = new Composite(parent, SWT.NONE);
-        compositeMarkerLimitExceeded.setLayout(new GridLayout());
-        Label labelMarkerLimitExceeded = new Label(
-                compositeMarkerLimitExceeded, SWT.WRAP);
-        labelMarkerLimitExceeded.setText(TaskListMessages.TaskList_markerLimitExceeded);
-        parent.setLayout(stackLayout);
-        setMarkerLimitExceeded(false);
-
-        viewer.setContentProvider(new TaskListContentProvider(this));
-        viewer.setLabelProvider(new TaskListLabelProvider());
-        if (memento != null) {
-            //restore filter
-            IMemento filterMem = memento.getChild(TAG_FILTER);
-            if (filterMem != null) {
-				getFilter().restoreState(filterMem);
-			}
-        }
-
-        comparator = new TaskSorter();
-        IDialogSettings workbenchSettings = getPlugin().getDialogSettings();
-        IDialogSettings settings = workbenchSettings
-                .getSection(TAG_SORT_SECTION);
-        comparator.restoreState(settings);
-        viewer.setComparator(comparator);
-
-        //update the menu to indicate how task are currently sorted
-        updateSortingState();
-        viewer.setInput(getWorkspace().getRoot());
-        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-            public void selectionChanged(SelectionChangedEvent event) {
-                TaskList.this.selectionChanged(event);
-            }
-        });
-        viewer.addOpenListener(new IOpenListener() {
-            public void open(OpenEvent event) {
-                gotoTaskAction.run();
-            }
-        });
-        viewer.getControl().addKeyListener(new KeyAdapter() {
-            public void keyPressed(KeyEvent e) {
-                handleKeyPressed(e);
-            }
-        });
-
-        //Add in some accessibility support to supplement the description that we already 
-        //get from the SWT table.
-        viewer.getControl().getAccessible().addAccessibleControlListener(
-                new AccessibleControlAdapter() {
-
-                    /* (non-Javadoc)
-                     * @see org.eclipse.swt.accessibility.AccessibleControlListener#getValue(org.eclipse.swt.accessibility.AccessibleControlEvent)
-                     */
-                    public void getValue(AccessibleControlEvent e) {
-
-                        int childIndex = e.childID;
-
-                        if (childIndex == ACC.CHILDID_SELF) {
-                            super.getValue(e);
-                            return;
-                        }
-                        Object item = viewer.getElementAt(childIndex);
-                        if (item instanceof IMarker) {
-                            IMarker marker = (IMarker) item;
-
-                            //If it is editable all we need is completeness
-                            // the rest is found by the table accessibility
-                            if (MarkerUtil.isEditable(marker)) {
-								e.result = MarkerUtil.getCompleteText(marker);
-							} else {
-								//Otherwise all it needs is severity
-                                e.result = MarkerUtil.getKindText(marker);
-							}
-
-                        } else {
-                            super.getValue(e);
-                            return;
-                        }
-
-                    }
-
-                });
-
-        CellEditor editors[] = new CellEditor[columnHeaders.length];
-        editors[1] = new CheckboxCellEditor(table);
-        String[] priorities = new String[] {
-                TaskListMessages.TaskList_high, 
-                TaskListMessages.TaskList_normal, 
-                TaskListMessages.TaskList_low
-        };
-        editors[2] = new ComboBoxCellEditor(table, priorities, SWT.READ_ONLY);
-        editors[3] = descriptionEditor = new TextCellEditor(table);
-        viewer.setCellEditors(editors);
-        viewer.setCellModifier(cellModifier);
-        viewer.setColumnProperties(tableColumnProperties);
-
-        // Configure the context menu to be lazily populated on each pop-up.
-        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
-        menuMgr.setRemoveAllWhenShown(true);
-        menuMgr.addMenuListener(new IMenuListener() {
-            public void menuAboutToShow(IMenuManager manager) {
-                TaskList.this.fillContextMenu(manager);
-            }
-        });
-        Menu menu = menuMgr.createContextMenu(table);
-        table.setMenu(menu);
-        // Be sure to register it so that other plug-ins can add actions.
-        getSite().registerContextMenu(menuMgr, viewer);
-
-        // Track selection in the page.
-        getSite().getPage().addPartListener(partListener);
-
-        // Add global action handlers.
-        editorActionHandler = new CellEditorActionHandler(getViewSite()
-                .getActionBars());
-        editorActionHandler.addCellEditor(descriptionEditor);
-        editorActionHandler.setCopyAction(copyTaskAction);
-        editorActionHandler.setPasteAction(pasteTaskAction);
-        editorActionHandler.setDeleteAction(removeTaskAction);
-        editorActionHandler.setSelectAllAction(selectAllAction);
-
-        getViewSite().getActionBars().setGlobalActionHandler(
-                ActionFactory.PROPERTIES.getId(), propertiesAction);
-
-        getSite().setSelectionProvider(viewer);
-
-        if (memento != null) {
-			restoreState(memento);
-		}
-        memento = null;
-
-        // Set help on the view itself
-        viewer.getControl().addHelpListener(new HelpListener() {
-            /*
-             * @see HelpListener#helpRequested(HelpEvent)
-             */
-            public void helpRequested(HelpEvent e) {
-                String contextId = null;
-                // See if there is a context registered for the current selection
-                IMarker marker = (IMarker) ((IStructuredSelection) getSelection())
-                        .getFirstElement();
-                if (marker != null) {
-                    contextId = IDE.getMarkerHelpRegistry().getHelp(marker);
-                }
-
-                if (contextId == null) {
-					contextId = ITaskListHelpContextIds.TASK_LIST_VIEW;
-				}
-
-                getSite().getWorkbenchWindow().getWorkbench().getHelpSystem()
-						.displayHelp(contextId);
-            }
-        });
-
-        // Prime the status line and title.
-        updateStatusMessage();
-        updateTitle();
-    }
-
-    /**
-     * Creates the table control.
-     */
-    void createTable(Composite parent) {
-        table = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI
-                | SWT.FULL_SELECTION);
-        table.setLinesVisible(true);
-        //table.setLayout(new TableLayout());
-
-        new TableEditor(table);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchPart.
-     */
-    public void dispose() {
-        super.dispose();
-        getSite().getPage().removePartListener(partListener);
-        if (focusSelectionProvider != null) {
-            focusSelectionProvider
-                    .removeSelectionChangedListener(focusSelectionChangedListener);
-            focusSelectionProvider = null;
-        }
-        focusPart = null;
-        if (editorActionHandler != null) {
-            editorActionHandler.dispose();
-            editorActionHandler = null;
-        }
-        if (clipboard != null) {
-			clipboard.dispose();
-		}
-    }
-
-    /**
-     * Activates the editor on the given marker.
-     * 
-     * @param marker the marker to edit
-     */
-    public void edit(IMarker marker) {
-        viewer.editElement(marker, 3);
-    }
-
-    /**
-     * Fills the local tool bar and menu manager with actions.
-     */
-    void fillActionBars() {
-        IActionBars actionBars = getViewSite().getActionBars();
-        IMenuManager menu = actionBars.getMenuManager();
-        IMenuManager submenu = new MenuManager(TaskListMessages.SortByMenu_text);
-
-        menu.add(submenu);
-        submenu.add(sortByCategoryAction);
-        submenu.add(sortByCompletedAction);
-        submenu.add(sortByPriorityAction);
-        submenu.add(sortByDescriptionAction);
-        submenu.add(sortByResourceAction);
-        submenu.add(sortByContainerAction);
-        submenu.add(sortByLocationAction);
-        submenu.add(sortByCreationTimeAction);
-        submenu.add(new Separator());
-        submenu.add(sortAscendingAction);
-        submenu.add(sortDescendingAction);
-
-        menu.add(filtersAction);
-
-        IToolBarManager toolBar = actionBars.getToolBarManager();
-        toolBar.add(newTaskAction);
-        toolBar.add(removeTaskAction);
-        toolBar.add(filtersAction);
-    }
-
-    /**
-     * Contributes actions to the pop-up menu.
-     */
-    void fillContextMenu(IMenuManager menu) {
-        // update enabled state for actions that aren't updated in selectionChanged
-        IStructuredSelection selection = (IStructuredSelection) getSelection();
-        markCompletedAction.setEnabled(markCompletedAction
-                .shouldEnable(selection));
-        resolveMarkerAction.setEnabled(resolveMarkerAction
-                .shouldEnable(selection));
-
-        // add the actions to the menu
-        menu.add(newTaskAction);
-        menu.add(gotoTaskAction);
-        menu.add(new Separator());
-        menu.add(copyTaskAction);
-        menu.add(pasteTaskAction);
-        menu.add(removeTaskAction);
-        menu.add(new Separator());
-        menu.add(markCompletedAction);
-        menu.add(purgeCompletedAction);
-        menu.add(new Separator());
-        menu.add(resolveMarkerAction);
-        menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-        menu
-                .add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS
-                        + "-end")); //$NON-NLS-1$
-        menu.add(propertiesAction);
-    }
-
-    /**
-     * The filter settings have changed.
-     * Refreshes the viewer and title bar.
-     */
-    void filterChanged() {
-
-        BusyIndicator.showWhile(viewer.getControl().getShell().getDisplay(),
-                new Runnable() {
-                    public void run() {
-                        // Filter has already been updated by dialog; just refresh.
-                        // Don't need to update labels for existing elements 
-                        // since changes to filter settings don't affect them.
-                        viewer.getControl().setRedraw(false);
-                        viewer.refresh(false);
-                        viewer.getControl().setRedraw(true);
-                        // update after refresh since the content provider caches summary info
-                        updateStatusMessage();
-                        updateTitle();
-                    }
-                });
-
-    }
-
-    void focusSelectionChanged(SelectionChangedEvent event) {
-        updateFocusResource(event.getSelection());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class)
-     */
-    public Object getAdapter(Class adapter) {
-        if (adapter == IShowInSource.class) {
-            return new IShowInSource() {
-                public ShowInContext getShowInContext() {
-                    return new ShowInContext(null, getSelection());
-                }
-            };
-        }
-        if (adapter == IShowInTargetList.class) {
-            return new IShowInTargetList() {
-                public String[] getShowInTargetIds() {
-                    return new String[] { IPageLayout.ID_RES_NAV };
-                }
-
-            };
-        }
-        return super.getAdapter(adapter);
-    }
-
-    /**
-     * Returns a clipboard for cut/copy/paste actions.
-     * <p>
-     * May only be called after this part's viewer has been created.
-     * The clipboard is disposed when this part is disposed.
-     * </p>
-     * @return a clipboard
-     * @since 2.0
-     */
-    /*package*/
-    Clipboard getClipboard() {
-        return clipboard;
-    }
-
-    /**
-     * Returns the filter for the viewer.
-     */
-    TasksFilter getFilter() {
-        return filter;
-    }
-
-    /**
-     * Returns the UI plugin for the task list.
-     */
-    static AbstractUIPlugin getPlugin() {
-        return (AbstractUIPlugin) Platform.getPlugin(PlatformUI.PLUGIN_ID);
-    }
-
-    /**
-     * Returns the resource for which the task list is showing tasks.
-     *
-     * @return the resource, possibly the workspace root
-     */
-    public IResource getResource() {
-        if (showSelections()) {
-            if (focusResources != null && focusResources.length >= 1
-                    && focusResources[0] != null) {
-                return focusResources[0];
-            }
-        }
-
-        return getWorkspace().getRoot();
-    }
-
-    /**
-     * Get the resources.
-     * 
-     * @return the resources
-     */
-    public IResource[] getResources() {
-        if (showSelections()) {
-            if (focusResources != null) {
-                return focusResources;
-            }
-        }
-
-        return new IResource[] { getWorkspace().getRoot() };
-    }
-
-    /**
-     * Returns the resource depth which the task list is using to show tasks.
-     *
-     * @return an <code>IResource.DEPTH_*</code> constant
-     */
-    int getResourceDepth() {
-        if (showSelections() && !showChildrenHierarchy()) {
-			return IResource.DEPTH_ZERO;
-		}
-
-        return IResource.DEPTH_INFINITE;
-    }
-
-    /**
-     * API method which returns the current selection.
-     *
-     * @return the current selection (element type: <code>IMarker</code>)
-     */
-    public ISelection getSelection() {
-        return viewer.getSelection();
-    }
-
-    /**
-     * Returns the message to display in the status line.
-     */
-    String getStatusMessage(IStructuredSelection selection) {
-        if (selection != null && selection.size() == 1) {
-            IMarker marker = (IMarker) selection.getFirstElement();
-            return MarkerUtil.getMessage(marker);
-        }
-
-        TaskListContentProvider provider = (TaskListContentProvider) viewer
-                .getContentProvider();
-
-        if (selection != null && selection.size() > 1) {
-            return provider.getStatusSummarySelected(selection);
-        }
-        return provider.getStatusSummaryVisible();
-    }
-
-    /**
-     * When created, new task instance is cached in
-     * order to keep it at the top of the list until
-     * first edited. This method returns it, or
-     * null if there is no task instance pending
-     * for first editing.
-     */
-    TableViewer getTableViewer() {
-        return viewer;
-    }
-
-    /**
-     * Returns the workspace.
-     */
-    IWorkspace getWorkspace() {
-        return ResourcesPlugin.getWorkspace();
-    }
-
-    /**
-     * Handles key events in viewer.
-     */
-    void handleKeyPressed(KeyEvent event) {
-        if (event.character == SWT.DEL && event.stateMask == 0
-                && removeTaskAction.isEnabled()) {
-			removeTaskAction.run();
-		}
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IViewPart.
-     */
-    public void init(IViewSite site, IMemento memento) throws PartInitException {
-        super.init(site, memento);
-        this.memento = memento;
-    }
-
-    /**
-     * Returns whether we are interested in markers on the given resource.
-     */
-    boolean checkResource(IResource resource) {
-        if (!showSelections()) {
-            return true;
-        }
-
-        IResource[] resources = getResources();
-        IResource resource2;
-
-        if (showOwnerProject()) {
-            IProject project;
-
-            for (int i = 0, l = resources.length; i < l; i++) {
-                resource2 = resources[i];
-
-                if (resource2 == null) {
-                    return true;
-                }
-                project = resource2.getProject();
-
-                if (project == null
-                        || project.equals(resource.getProject())) {
-					return true;
-				}
-            }
-        }
-
-        if (showChildrenHierarchy()) {
-            for (int i = 0, l = resources.length; i < l; i++) {
-                resource2 = resources[i];
-
-                if (resource2 != null
-                        && resource2.getFullPath().isPrefixOf(
-                                resource.getFullPath())) {
-					return true;
-				}
-            }
-        } else {
-			for (int i = 0, l = resources.length; i < l; i++) {
-                resource2 = resources[i];
-
-                if (resource.equals(resource2)) {
-					return true;
-				}
-            }
-		}
-
-        return false;
-    }
-
-    /**
-     * Returns whether the given marker should be shown,
-     * given the current filter settings.
-     */
-    boolean shouldShow(IMarker marker) {
-        return checkResource(marker.getResource())
-                && getFilter().select(marker);
-    }
-
-    /**
-     * Makes actions used in the local tool bar and
-     * popup menu.
-     */
-    void makeActions() {
-        ISharedImages sharedImages = PlatformUI.getWorkbench()
-                .getSharedImages();
-
-        // goto
-        gotoTaskAction = new GotoTaskAction(this, "gotoFile"); //$NON-NLS-1$
-        gotoTaskAction.setText(TaskListMessages.GotoTask_text); 
-        gotoTaskAction.setToolTipText(TaskListMessages.GotoTask_tooltip); 
-        gotoTaskAction.setImageDescriptor(MarkerUtil
-                .getImageDescriptor("gotoobj")); //$NON-NLS-1$
-        gotoTaskAction.setEnabled(false);
-
-        // new task
-        newTaskAction = new NewTaskAction(this, "newTask"); //$NON-NLS-1$
-        newTaskAction.setText(TaskListMessages.NewTask_text); 
-        newTaskAction.setToolTipText(TaskListMessages.NewTask_tooltip);
-        newTaskAction.setImageDescriptor(MarkerUtil
-                .getImageDescriptor("addtsk")); //$NON-NLS-1$
-        newTaskAction.setDisabledImageDescriptor(MarkerUtil
-                .getImageDescriptor("addtsk_disabled")); //$NON-NLS-1$
-
-        // copy task
-        copyTaskAction = new CopyTaskAction(this, "copy"); //$NON-NLS-1$
-        copyTaskAction.setText(TaskListMessages.CopyTask_text); 
-        copyTaskAction.setToolTipText(TaskListMessages.CopyTask_tooltip);
-        copyTaskAction.setEnabled(false);
-
-        // paste task
-        pasteTaskAction = new PasteTaskAction(this, "paste"); //$NON-NLS-1$
-        pasteTaskAction.setText(TaskListMessages.PasteTask_text); 
-        pasteTaskAction.setToolTipText(TaskListMessages.PasteTask_tooltip);
-        pasteTaskAction.setEnabled(false);
-
-        // remove task
-        removeTaskAction = new RemoveTaskAction(this, "delete"); //$NON-NLS-1$
-        removeTaskAction.setText(TaskListMessages.RemoveTask_text);
-        removeTaskAction.setToolTipText(TaskListMessages.RemoveTask_tooltip); 
-        removeTaskAction.setImageDescriptor(sharedImages
-                .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
-        removeTaskAction.setDisabledImageDescriptor(sharedImages
-                .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE_DISABLED));
-        removeTaskAction.setEnabled(false);
-
-        //mark completed task
-        markCompletedAction = new MarkCompletedAction(this, "markCompleted"); //$NON-NLS-1$
-        markCompletedAction.setText(TaskListMessages.MarkCompleted_text);
-        markCompletedAction.setToolTipText(TaskListMessages.MarkCompleted_tooltip);
-        markCompletedAction.setEnabled(false);
-
-        //delete completed task
-        purgeCompletedAction = new PurgeCompletedAction(this, "deleteCompleted"); //$NON-NLS-1$
-        purgeCompletedAction.setText(TaskListMessages.PurgeCompleted_text);
-        purgeCompletedAction.setToolTipText(TaskListMessages.PurgeCompleted_tooltip); 
-        purgeCompletedAction.setImageDescriptor(sharedImages
-                .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
-        purgeCompletedAction.setEnabled(true);
-
-        // select all
-        selectAllAction = new SelectAllTasksAction(this, "selectAll"); //$NON-NLS-1$
-        selectAllAction.setText(TaskListMessages.SelectAll_text); 
-        selectAllAction.setToolTipText(TaskListMessages.SelectAll_tooltip);
-
-        // resolutions
-        resolveMarkerAction = new ResolveMarkerAction(this, "resolve"); //$NON-NLS-1$
-        resolveMarkerAction.setText(TaskListMessages.Resolve_text); 
-        resolveMarkerAction.setToolTipText(TaskListMessages.Resolve_tooltip);
-        resolveMarkerAction.setEnabled(false);
-
-        // Sort by ->	
-        sortByCategoryAction = new SortByAction(TaskSorter.TYPE);
-        sortByCategoryAction.setText(TaskListMessages.SortByCategory_text);
-        sortByCategoryAction.setToolTipText(TaskListMessages.SortByCategory_tooltip);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByCategoryAction,
-				ITaskListHelpContextIds.TASK_SORT_TYPE_ACTION);
-
-        sortByCompletedAction = new SortByAction(TaskSorter.COMPLETION);
-        sortByCompletedAction.setText(TaskListMessages.SortByCompleted_text);
-        sortByCompletedAction.setToolTipText(TaskListMessages.SortByCompleted_tooltip); 
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(
-				sortByCompletedAction,
-				ITaskListHelpContextIds.TASK_SORT_COMPLETED_ACTION);
-
-        sortByPriorityAction = new SortByAction(TaskSorter.PRIORITY);
-        sortByPriorityAction.setText(TaskListMessages.SortByPriority_text); 
-        sortByPriorityAction.setToolTipText(TaskListMessages.SortByPriority_tooltip); 
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByPriorityAction,
-				ITaskListHelpContextIds.TASK_SORT_PRIORITY_ACTION);
-
-        sortByDescriptionAction = new SortByAction(TaskSorter.DESCRIPTION);
-        sortByDescriptionAction.setText(TaskListMessages.SortByDescription_text); 
-        sortByDescriptionAction.setToolTipText(TaskListMessages.SortByDescription_tooltip);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(
-				sortByDescriptionAction,
-				ITaskListHelpContextIds.TASK_SORT_DESCRIPTION_ACTION);
-
-        sortByResourceAction = new SortByAction(TaskSorter.RESOURCE);
-        sortByResourceAction.setText(TaskListMessages.SortByResource_text);
-        sortByResourceAction.setToolTipText(TaskListMessages.SortByResource_tooltip); 
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByResourceAction,
-				ITaskListHelpContextIds.TASK_SORT_RESOURCE_ACTION);
-
-        sortByContainerAction = new SortByAction(TaskSorter.FOLDER);
-        sortByContainerAction.setText(TaskListMessages.SortByContainer_text); 
-        sortByContainerAction.setToolTipText(TaskListMessages.SortByContainer_tooltip);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(
-				sortByContainerAction,
-				ITaskListHelpContextIds.TASK_SORT_FOLDER_ACTION);
-
-        sortByLocationAction = new SortByAction(TaskSorter.LOCATION);
-        sortByLocationAction.setText(TaskListMessages.SortByLocation_text); 
-        sortByLocationAction.setToolTipText(TaskListMessages.SortByLocation_tooltip); 
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(sortByLocationAction,
-				ITaskListHelpContextIds.TASK_SORT_LOCATION_ACTION);
-
-        sortByCreationTimeAction = new SortByAction(TaskSorter.CREATION_TIME);
-        sortByCreationTimeAction.setText(TaskListMessages.SortByCreationTime_text);
-        sortByCreationTimeAction.setToolTipText(TaskListMessages.SortByCreationTime_tooltip); 
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(
-				sortByCreationTimeAction,
-				ITaskListHelpContextIds.TASK_SORT_CREATION_TIME_ACTION);
-
-        sortAscendingAction = new SortDirectionAction(TaskSorter.ASCENDING);
-        sortAscendingAction.setText(TaskListMessages.SortAscending_text);
-        sortAscendingAction.setToolTipText(TaskListMessages.SortAscending_tooltip);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(sortAscendingAction,
-				ITaskListHelpContextIds.TASK_SORT_ASCENDING_ACTION);
-
-        sortDescendingAction = new SortDirectionAction(TaskSorter.DESCENDING);
-        sortDescendingAction.setText(TaskListMessages.SortDescending_text);
-        sortDescendingAction.setToolTipText(TaskListMessages.SortDescending_tooltip);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(sortDescendingAction,
-				ITaskListHelpContextIds.TASK_SORT_DESCENDING_ACTION);
-
-        // filters...
-        filtersAction = new FiltersAction(this, "filter"); //$NON-NLS-1$
-        filtersAction.setText(TaskListMessages.Filters_text); 
-        filtersAction.setToolTipText(TaskListMessages.Filters_tooltip);
-        filtersAction.setImageDescriptor(MarkerUtil
-                .getImageDescriptor("filter")); //$NON-NLS-1$
-
-        // properties
-        propertiesAction = new TaskPropertiesAction(this, "properties"); //$NON-NLS-1$
-        propertiesAction.setText(TaskListMessages.Properties_text); 
-        propertiesAction.setToolTipText(TaskListMessages.Properties_tooltip);
-        propertiesAction.setEnabled(false);
-    }
-
-    /**
-     * The markers have changed.  Update the status line and title bar.
-     */
-    void markersChanged() {
-        updateStatusMessage();
-        updateTitle();
-    }
-
-    void partActivated(IWorkbenchPart part) {
-        if (part == focusPart) {
-			return;
-		}
-
-        if (focusSelectionProvider != null) {
-            focusSelectionProvider
-                    .removeSelectionChangedListener(focusSelectionChangedListener);
-            focusSelectionProvider = null;
-        }
-
-        focusPart = part;
-        if (focusPart != null) {
-            focusSelectionProvider = focusPart.getSite().getSelectionProvider();
-            if (focusSelectionProvider != null) {
-                focusSelectionProvider
-                        .addSelectionChangedListener(focusSelectionChangedListener);
-                updateFocusResource(focusSelectionProvider.getSelection());
-            } else {
-                updateFocusResource(null);
-            }
-        }
-
-    }
-
-    void partClosed(IWorkbenchPart part) {
-        if (part != focusPart) {
-			return;
-		}
-        if (focusSelectionProvider != null) {
-            focusSelectionProvider
-                    .removeSelectionChangedListener(focusSelectionChangedListener);
-            focusSelectionProvider = null;
-        }
-        focusPart = null;
-    }
-
-    /**
-     * The user is attempting to drag marker data.  Add the appropriate
-     * data to the event depending on the transfer type.
-     */
-    void performDragSetData(DragSourceEvent event) {
-        if (MarkerTransfer.getInstance().isSupportedType(event.dataType)) {
-            event.data = ((IStructuredSelection) viewer.getSelection())
-                    .toArray();
-            return;
-        }
-        if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
-            Object[] data = ((IStructuredSelection) viewer.getSelection())
-                    .toArray();
-            if (data != null) {
-                IMarker[] markers = new IMarker[data.length];
-                for (int i = 0; i < markers.length; i++) {
-                    markers[i] = (IMarker) data[i];
-                }
-                event.data = createMarkerReport(markers);
-            }
-            return;
-        }
-    }
-
-    void restoreState(IMemento memento) {
-        //restore selection
-        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-        IMemento selectionMem = memento.getChild(TAG_SELECTION);
-        if (selectionMem != null) {
-            ArrayList selectionList = new ArrayList();
-            IMemento markerMems[] = selectionMem.getChildren(TAG_MARKER);
-            for (int i = 0; i < markerMems.length; i++) {
-                try {
-                    long id = Long.parseLong(markerMems[i].getString(TAG_ID));
-                    IResource resource = root.findMember(markerMems[i]
-                            .getString(TAG_RESOURCE));
-                    if (resource != null) {
-                        IMarker marker = resource.findMarker(id);
-                        if (marker != null) {
-                            selectionList.add(marker);
-                        }
-                    }
-                } catch (NumberFormatException e) {
-                } catch (CoreException e) {
-                }
-
-            }
-            viewer.setSelection(new StructuredSelection(selectionList));
-        }
-
-        Table table = viewer.getTable();
-        //restore vertical position
-        try {
-            String topIndexStr = memento.getString(TAG_TOP_INDEX);
-            table.setTopIndex(Integer.parseInt(topIndexStr));
-        } catch (NumberFormatException e) {
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IViewPart.
-     */
-    public void saveState(IMemento memento) {
-        if (viewer == null) {
-            if (this.memento != null) {
-				memento.putMemento(this.memento);
-			}
-            return;
-        }
-
-        //save filter
-        getFilter().saveState(memento.createChild(TAG_FILTER));
-
-        //save columns width
-        Table table = viewer.getTable();
-        TableColumn columns[] = table.getColumns();
-        //check whether it has ever been layed out
-        //workaround for 1GDTU19: ITPUI:WIN2000 - Task list columns "collapsed" left
-        boolean shouldSave = false;
-        for (int i = 0; i < columns.length; i++) {
-            if (columnLayouts[i].resizable && columns[i].getWidth() != 0) {
-                shouldSave = true;
-                break;
-            }
-        }
-        if (shouldSave) {
-            for (int i = 0; i < columns.length; i++) {
-                if (columnLayouts[i].resizable) {
-                    IMemento child = memento.createChild(TAG_COLUMN);
-                    child.putInteger(TAG_NUMBER, i);
-                    child.putInteger(TAG_WIDTH, columns[i].getWidth());
-                }
-            }
-        }
-
-        //save selection
-        Object markers[] = ((IStructuredSelection) viewer.getSelection())
-                .toArray();
-        if (markers.length > 0) {
-            IMemento selectionMem = memento.createChild(TAG_SELECTION);
-            for (int i = 0; i < markers.length; i++) {
-                IMemento elementMem = selectionMem.createChild(TAG_MARKER);
-                IMarker marker = (IMarker) markers[i];
-                elementMem.putString(TAG_RESOURCE, marker.getResource()
-                        .getFullPath().toString());
-                elementMem.putString(TAG_ID, String.valueOf(marker.getId()));
-            }
-        }
-
-        //save vertical position
-        int topIndex = table.getTopIndex();
-        memento.putString(TAG_TOP_INDEX, String.valueOf(topIndex));
-    }
-
-    /**
-     * Handles marker selection change in the task list by updating availability of
-     * the actions in the local tool bar.
-     */
-    void selectionChanged(SelectionChangedEvent event) {
-        IStructuredSelection selection = (IStructuredSelection) event
-                .getSelection();
-        updateStatusMessage(selection);
-        updateTitle();
-
-        updatePasteEnablement();
-
-        // If selection is empty, then disable copy, remove and goto.	
-        if (selection.isEmpty()) {
-            copyTaskAction.setEnabled(false);
-            removeTaskAction.setEnabled(false);
-            gotoTaskAction.setEnabled(false);
-            propertiesAction.setEnabled(false);
-            return;
-        }
-        
-
-        // Can only open properties for a single task at a time
-        propertiesAction.setEnabled(selection.size() == 1);
-
-        // Can always copy
-        copyTaskAction.setEnabled(true);
-
-        // Determine if goto should be enabled
-        IMarker selectedMarker = (IMarker) selection.getFirstElement();
-        boolean canJump = selection.size() == 1
-                && selectedMarker.getResource().getType() == IResource.FILE;
-        gotoTaskAction.setEnabled(canJump);
-
-        // Determine if remove should be enabled
-        boolean canRemove = true;
-        for (Iterator markers = selection.iterator(); markers.hasNext();) {
-            IMarker m = (IMarker) markers.next();
-            if (!MarkerUtil.isEditable(m)) {
-                canRemove = false;
-                break;
-            }
-        }
-        removeTaskAction.setEnabled(canRemove);
-
-        // if there is an active editor on the selection's input, tell
-        // the editor to goto the marker
-        if (canJump) {
-            IEditorPart editor = getSite().getPage().getActiveEditor();
-            if (editor != null) {
-                IFile file = ResourceUtil.getFile(editor.getEditorInput());
-                if (file != null) {
-                    if (selectedMarker.getResource().equals(file)) {
-                        IDE.gotoMarker(editor, selectedMarker);
-                    }
-                }
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchPart.
-     */
-    public void setFocus() {
-        viewer.getControl().setFocus();
-    }
-
-    /**
-     * Sets the property on a marker to the given value.
-     */
-    void setProperty(IMarker marker, String property, Object value) {
-        if (MarkerUtil.getProperty(marker, property).equals(value)) {
-            return;
-        }
-        try {
-            if (property == tableColumnProperties[1]) { // Completed
-                marker.setAttribute(IMarker.DONE, value);
-            } else if (property == tableColumnProperties[2]) { // Priority
-                // this property is used only by cell editor, where order is High, Normal, Low
-                marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH
-                        - ((Integer) value).intValue());
-            } else if (property == tableColumnProperties[3]) { // Description
-                marker.setAttribute(IMarker.MESSAGE, value);
-                // Let's not refilter too lightly - see if it is needed
-                //			TaskSorter sorter = (TaskSorter) viewer.getSorter();
-                //			if (sorter != null && sorter.getColumnNumber() == 3) {
-                //				viewer.refresh();
-                //			}
-            }
-        } catch (CoreException e) {
-            String msg = TaskListMessages.TaskList_errorModifyingTask; 
-            ErrorDialog.openError(getSite().getShell(), msg, null, e
-                    .getStatus());
-        }
-    }
-
-    /**
-     * API method which sets the current selection of this viewer.
-     *
-     * @param selection a structured selection of <code>IMarker</code> objects
-     * @param reveal <code>true</code> to reveal the selection, <false> otherwise
-     */
-    public void setSelection(ISelection selection, boolean reveal) {
-        Assert.isTrue(selection instanceof IStructuredSelection);
-        IStructuredSelection ssel = (IStructuredSelection) selection;
-
-        for (Iterator i = ssel.iterator(); i.hasNext();) {
-			Assert.isTrue(i.next() instanceof IMarker);
-		}
-
-        if (viewer != null) {
-			viewer.setSelection(selection, reveal);
-		}
-    }
-
-    boolean showChildrenHierarchy() {
-        switch (getFilter().onResource) {
-        case TasksFilter.ON_ANY_RESOURCE:
-        case TasksFilter.ON_SELECTED_RESOURCE_AND_CHILDREN:
-        case TasksFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT:
-        // added by cagatayk@acm.org
-        case TasksFilter.ON_WORKING_SET:
-        default:
-            return true;
-        case TasksFilter.ON_SELECTED_RESOURCE_ONLY:
-            return false;
-        }
-    }
-
-    boolean showSelections() {
-        switch (getFilter().onResource) {
-        case TasksFilter.ON_SELECTED_RESOURCE_ONLY:
-        case TasksFilter.ON_SELECTED_RESOURCE_AND_CHILDREN:
-        case TasksFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT:
-            // added by cagatayk@acm.org
-            return true;
-        case TasksFilter.ON_ANY_RESOURCE:
-        case TasksFilter.ON_WORKING_SET:
-        default:
-            return false;
-        }
-    }
-
-    // showOwnerProject() added by cagatayk@acm.org 
-    boolean showOwnerProject() {
-        return getFilter().onResource == TasksFilter.ON_ANY_RESOURCE_OF_SAME_PROJECT;
-    }
-
-    /**
-     * Processes state change of the 'showSelections' switch.
-     * If true, it will resync with the saved input element.
-     * Otherwise, it will reconfigure to show all the
-     * problems/tasks in the workbench.
-     * 
-     * @param value the value
-     */
-    void toggleInputSelection(boolean value) {
-        /*
-         if (value) {
-         handleInput(inputSelection, false);
-         } else {
-         // detach from input and link to the workbench object
-         handleInput(WorkbenchPlugin.getPluginWorkbench(), true);
-         }
-         updateTitle();
-         */
-    }
-
-    /**
-     * If true, current input will be
-     * remembered and further selections will be
-     * ignored.
-     * 
-     * @param value the value
-     */
-    void toggleLockInput(boolean value) {
-        /*
-         if (!value) {
-         handleInput(inputSelection, false);
-         lockedInput = null;
-         } else {
-         lockedInput = (IElement) getInput();
-         }
-         String lockedInputPath = "";
-         if (lockedInput != null && lockedInput instanceof IResource) {
-         IResource resource = (IResource) lockedInput;
-         lockedInputPath = resource.getFullPath().toString();
-         }
-         IDialogStore store = WorkbenchPlugin.getDefault().getDialogStore();
-         store.put(STORE_LOCKED_INPUT, lockedInputPath);
-         updateTitle();
-         */
-    }
-
-    /**
-     * Updates the focus resource, and refreshes if we're showing only tasks for the focus resource.
-     */
-    void updateFocusResource(ISelection selection) {
-        ArrayList list = new ArrayList();
-
-        if (selection instanceof IStructuredSelection) {
-            Iterator iterator = ((IStructuredSelection) selection).iterator();
-            while (iterator.hasNext()) {
-                Object object = iterator.next();
-
-                if (object instanceof IAdaptable) {
-                    ITaskListResourceAdapter taskListResourceAdapter;
-                    Object adapter = ((IAdaptable) object)
-                            .getAdapter(ITaskListResourceAdapter.class);
-                    if (adapter != null
-                            && adapter instanceof ITaskListResourceAdapter) {
-                        taskListResourceAdapter = (ITaskListResourceAdapter) adapter;
-                    } else {
-                        taskListResourceAdapter = DefaultTaskListResourceAdapter
-                                .getDefault();
-                    }
-
-                    IResource resource = taskListResourceAdapter
-                            .getAffectedResource((IAdaptable) object);
-                    if (resource != null) {
-                        list.add(resource);
-                    }
-                }
-            }
-        }
-
-        if (list.size() == 0 && focusPart instanceof IEditorPart) {
-            IEditorInput input = ((IEditorPart) focusPart).getEditorInput();
-            if (input != null) {
-                IResource resource = ResourceUtil.getResource(input);
-                if (resource != null) {
-                    list.add(resource);
-                }
-            }
-        }
-
-        int l = list.size();
-        if (l < 1) {
-            return; // required to achieve lazy update behavior.
-        }
-
-        IResource[] resources = (IResource[]) list.toArray(new IResource[l]);
-        for (int i = 0; i < l; i++) {
-            Assert.isNotNull(resources[i]);
-        }
-
-        if (!Arrays.equals(resources, focusResources)) {
-            boolean updateNeeded = false;
-
-            if (showOwnerProject()) {
-                int m = focusResources == null ? 0 : focusResources.length;
-                if (l != m) {
-                    updateNeeded = true;
-                } else {
-                    for (int i = 0; i < l; i++) {
-                        IProject oldProject = m < 1 ? null : focusResources[0]
-                                .getProject();
-                        IProject newProject = resources[0].getProject();
-                        boolean projectsEqual = (oldProject == null ? newProject == null
-                                : oldProject.equals(newProject));
-                        if (!projectsEqual) {
-                            updateNeeded = true;
-                            break;
-                        }
-                    }
-                }
-            } else if (showSelections()) {
-                updateNeeded = true;
-            }
-
-            // remember the focus resources even if update is not needed,
-            // so that we know them if the filter settings change
-            focusResources = resources;
-
-            if (updateNeeded) {
-                viewer.getControl().setRedraw(false);
-                viewer.refresh();
-                viewer.getControl().setRedraw(true);
-                updateStatusMessage();
-                updateTitle();
-            }
-        }
-    }
-
-    /**
-     * Updates the enablement of the paste action
-     */
-    void updatePasteEnablement() {
-        // Paste if clipboard contains tasks
-        MarkerTransfer transfer = MarkerTransfer.getInstance();
-        IMarker[] markerData = (IMarker[]) getClipboard().getContents(transfer);
-        boolean canPaste = false;
-        if (markerData != null) {
-            for (int i = 0; i < markerData.length; i++) {
-                if (MarkerUtil.isMarkerType(markerData[i], IMarker.TASK)) {
-                    canPaste = true;
-                    break;
-                }
-            }
-        }
-        pasteTaskAction.setEnabled(canPaste);
-    }
-
-    /**
-     * Updates that message displayed in the status line.
-     */
-    void updateStatusMessage() {
-        ISelection selection = viewer.getSelection();
-
-        if (selection instanceof IStructuredSelection) {
-			updateStatusMessage((IStructuredSelection) selection);
-		} else {
-			updateStatusMessage(null);
-		}
-    }
-
-    /**
-     * Updates that message displayed in the status line.
-     */
-    void updateStatusMessage(IStructuredSelection selection) {
-        String message = getStatusMessage(selection);
-        getViewSite().getActionBars().getStatusLineManager()
-                .setMessage(message);
-    }
-
-    /**
-     * Updates the title of the view.  Should be called when filters change.
-     */
-    void updateTitle() {
-        TaskListContentProvider provider = (TaskListContentProvider) getTableViewer()
-                .getContentProvider();
-        String summary = provider.getTitleSummary();
-        setContentDescription(summary);
-    }
-
-    /**
-     * Method updateSortingState.
-     */
-    void updateSortingState() {
-        int curColumn = comparator.getTopPriority();
-        sortByCategoryAction.setChecked(curColumn == TaskSorter.TYPE);
-        sortByCompletedAction.setChecked(curColumn == TaskSorter.COMPLETION);
-        sortByPriorityAction.setChecked(curColumn == TaskSorter.PRIORITY);
-        sortByDescriptionAction.setChecked(curColumn == TaskSorter.DESCRIPTION);
-        sortByResourceAction.setChecked(curColumn == TaskSorter.RESOURCE);
-        sortByContainerAction.setChecked(curColumn == TaskSorter.FOLDER);
-        sortByLocationAction.setChecked(curColumn == TaskSorter.LOCATION);
-        sortByCreationTimeAction
-                .setChecked(curColumn == TaskSorter.CREATION_TIME);
-
-        int curDirection = comparator.getTopPriorityDirection();
-        sortAscendingAction.setChecked(curDirection == TaskSorter.ASCENDING);
-        sortDescendingAction.setChecked(curDirection == TaskSorter.DESCENDING);
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskListContentProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskListContentProvider.java
deleted file mode 100644
index 726ce5f..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskListContentProvider.java
+++ /dev/null
@@ -1,568 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IMarkerDelta;
-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.runtime.CoreException;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.internal.views.tasklist.TaskListMessages;
-
-/**
- * Task list content provider returns elements that should be
- * in the task list depending on the selection mode.
- * It goes directly to the marker manager and retreives
- * tasks and problems.
- */
-class TaskListContentProvider implements IStructuredContentProvider,
-        IResourceChangeListener {
-
-    private static final int TASKS = 0;
-
-    private static final int ERRORS = 1;
-
-    private static final int WARNINGS = 2;
-
-    private static final int INFOS = 3;
-
-    private TaskList taskList;
-
-    private TableViewer viewer;
-
-    private IResource input;
-
-    /* cached counts of tasks, errors, warnings and infos for the visible 
-     * markers, maintained incrementally */
-    private int[] visibleMarkerCounts = null;
-
-    /* cached count of all markers in workspace matching supported root types 
-     * (tasks & problems), maintained incrementally */
-    private int totalMarkerCount = -1;
-
-    /**
-     * The constructor.
-     */
-    public TaskListContentProvider(TaskList taskList) {
-        this.taskList = taskList;
-        this.viewer = taskList.getTableViewer();
-    }
-
-    private boolean getFilterOnMarkerLimit() {
-        return taskList.getFilter().getFilterOnMarkerLimit();
-    }
-
-    private int getMarkerLimit() {
-        return taskList.getFilter().getMarkerLimit();
-    }
-
-    private boolean isMarkerLimitExceeded() {
-        return taskList.isMarkerLimitExceeded();
-    }
-
-    private void setMarkerLimitExceeded(boolean markerLimitExceeded) {
-        taskList.setMarkerLimitExceeded(markerLimitExceeded);
-    }
-
-    /**
-     * Returns a one-line string containing a summary of the number
-     * of visible tasks and problems.
-     */
-    public String getStatusSummaryVisible() {
-        if (visibleMarkerCounts == null) {
-            return ""; //$NON-NLS-1$
-        }
-
-        return NLS.bind(TaskListMessages.TaskList_statusSummaryVisible,new Integer(sum(visibleMarkerCounts)),
-		getStatusSummaryBreakdown(visibleMarkerCounts));
-    }
-
-    /**
-     * Returns a one-line string containing a summary of the number
-     * of selected tasks and problems.
-     * 
-     * @param selection the current selection
-     */
-    public String getStatusSummarySelected(IStructuredSelection selection) {
-        int[] selectedMarkerCounts = getMarkerCounts(selection.toList());
-        return NLS.bind(TaskListMessages.TaskList_statusSummarySelected, new Integer(sum(selectedMarkerCounts)),
-		getStatusSummaryBreakdown(selectedMarkerCounts) );
-    }
-
-    /**
-     * Returns a one-line string containing a summary of the number of 
-     * given tasks, errors, warnings, and infos.
-     */
-    private String getStatusSummaryBreakdown(int[] counts) {
-        return NLS.bind(
-				TaskListMessages.TaskList_statusSummaryBreakdown, 
-				new Object []{ 
-						new Integer(counts[TASKS]),
-						new Integer(counts[ERRORS]),
-						new Integer(counts[WARNINGS]),
-						new Integer(counts[INFOS])});
-    }
-
-    /**
-     * Returns a one-line string containing a summary of the number items
-     * being shown by the filter, for display in the title bar.
-     */
-    public String getTitleSummary() {
-        if (visibleMarkerCounts == null) {
-            return ""; //$NON-NLS-1$
-        }
-
-        int visibleMarkerCount = sum(visibleMarkerCounts);
-        TasksFilter filter = taskList.getFilter();
-
-        if (filter.isShowingAll()) {
-            return NLS.bind(TaskListMessages.TaskList_titleSummaryUnfiltered, new Integer(visibleMarkerCount));
-        } else {
-            return NLS.bind(TaskListMessages.TaskList_titleSummaryFiltered, new Integer(visibleMarkerCount),
-			new Integer(getTotalMarkerCount()));
-        }
-    }
-
-    /**
-     * Returns the sum of the given counts.
-     */
-    private int sum(int[] counts) {
-        int sum = 0;
-
-        for (int i = 0, l = counts.length; i < l; ++i) {
-            sum += counts[i];
-        }
-
-        return sum;
-    }
-
-    /**
-     * Returns the count of all markers in the workspace which can be shown in 
-     * the task list. This is computed once, then maintained incrementally by 
-     * the delta processing.
-     */
-    private int getTotalMarkerCount() {
-        if (totalMarkerCount == -1) {
-            totalMarkerCount = 0;
-
-            try {
-                IResource root = taskList.getWorkspace().getRoot();
-                IMarker[] markers = root.findMarkers(null, true,
-                        IResource.DEPTH_INFINITE);
-
-                for (int i = 0; i < markers.length; ++i) {
-                    if (isRootType(markers[i])) {
-                        ++totalMarkerCount;
-                    }
-                }
-            } catch (CoreException e) {
-                // shouldn't happen
-            }
-        }
-
-        return totalMarkerCount;
-    }
-
-    /**
-     * Returns whether the given marker is a subtype of one of the root types.
-     */
-    private boolean isRootType(IMarker marker) {
-        String[] rootTypes = TasksFilter.ROOT_TYPES;
-
-        for (int i = 0, l = rootTypes.length; i < l; ++i) {
-            if (MarkerUtil.isMarkerType(marker, rootTypes[i])) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns the markers to show in the task list.
-     */
-    private IMarker[] getMarkers() throws CoreException {
-        IResource[] resources = taskList.getResources();
-        int l = resources.length;
-        IResource resource;
-        boolean bExists = false;
-
-        for (int i = 0; i < l; i++) {
-            resource = resources[i];
-
-            if (resource != null && resource.exists()) {
-                bExists = true;
-                break;
-            }
-        }
-
-        if (!bExists) {
-            return new IMarker[0];
-        }
-
-        if (taskList.showOwnerProject()) {
-            IResource[] projectResources = new IResource[l];
-            IResource project;
-
-            for (int i = 0; i < l; i++) {
-                resource = resources[i];
-
-                if (resource != null) {
-                    project = resource.getProject();
-
-                    if (project != null) {
-                        projectResources[i] = project;
-                    } else {
-                        projectResources[i] = resource;
-                    }
-                }
-            }
-
-            resources = projectResources;
-        }
-
-        int depth = taskList.getResourceDepth();
-        TasksFilter filter = taskList.getFilter();
-        Set set = new HashSet();
-
-        for (int i = 0; i < l; i++) {
-            resource = resources[i];
-
-            if (resource != null) {
-                IMarker[] markers = resource.findMarkers(null, true, depth);
-
-                for (int j = 0; j < markers.length; ++j) {
-                    IMarker marker = markers[j];
-
-                    if (filter.select(marker)) {
-                        set.add(marker);
-                    }
-                }
-            }
-        }
-
-        IMarker[] result = new IMarker[set.size()];
-        set.toArray(result);
-        return result;
-    }
-
-    /**
-     * Returns the number of tasks, errors, warnings, infos
-     * in the given markers.
-     */
-    private int[] getMarkerCounts(List markers) {
-        int[] markerCounts = new int[4];
-        Iterator iterator = markers.iterator();
-
-        while (iterator.hasNext()) {
-            IMarker marker = (IMarker) iterator.next();
-
-            if (MarkerUtil.isMarkerType(marker, IMarker.PROBLEM)) {
-                switch (MarkerUtil.getSeverity(marker)) {
-                case IMarker.SEVERITY_ERROR:
-                    ++markerCounts[ERRORS];
-                    break;
-                case IMarker.SEVERITY_WARNING:
-                    ++markerCounts[WARNINGS];
-                    break;
-                case IMarker.SEVERITY_INFO:
-                    ++markerCounts[INFOS];
-                    break;
-                }
-            } else if (MarkerUtil.isMarkerType(marker, IMarker.TASK)) {
-                ++markerCounts[TASKS];
-            }
-        }
-
-        return markerCounts;
-    }
-
-    /**
-     * Updates the marker counts for the given delta.
-     * Assumptions:
-     *   - the delta is either an addition or a removal
-     *   - problem severities don't change
-     */
-    private void updateMarkerCounts(IMarkerDelta markerDelta, int difference) {
-        if (visibleMarkerCounts == null) {
-			return;
-		}
-
-        if (markerDelta.isSubtypeOf(IMarker.PROBLEM)) {
-            int severity = markerDelta.getAttribute(IMarker.SEVERITY,
-                    IMarker.SEVERITY_WARNING);
-
-            switch (severity) {
-            case IMarker.SEVERITY_ERROR:
-                visibleMarkerCounts[ERRORS] += difference;
-                break;
-            case IMarker.SEVERITY_WARNING:
-                visibleMarkerCounts[WARNINGS] += difference;
-                break;
-            case IMarker.SEVERITY_INFO:
-                visibleMarkerCounts[INFOS] += difference;
-                break;
-            }
-        } else if (markerDelta.isSubtypeOf(IMarker.TASK)) {
-			visibleMarkerCounts[TASKS] += difference;
-		}
-    }
-
-    /**
-     * Updates the viewer given the lists of added, removed, and changes 
-     * markers. This is called inside an syncExec.
-     */
-    private void updateViewer(List additions, List removals, List changes) {
-
-        // The widget may have been destroyed by the time this is run.  
-        // Check for this and do nothing if so.
-        Control ctrl = viewer.getControl();
-
-        if (ctrl == null || ctrl.isDisposed()) {
-            return;
-        }
-
-        //update the viewer based on the marker changes.
-        //process removals before additions, to avoid multiple equal elements in 
-        //the viewer
-        if (removals.size() > 0) {
-
-            // Cancel any open cell editor.  We assume that the one being edited 
-            // is the one being removed.
-            viewer.cancelEditing();
-            viewer.remove(removals.toArray());
-        }
-
-        if (additions.size() > 0) {
-            viewer.add(additions.toArray());
-        }
-
-        if (changes.size() > 0) {
-            viewer.update(changes.toArray(), null);
-        }
-    }
-
-    /**
-     * The visual part that is using this content provider is about
-     * to be disposed. Deallocate all allocated SWT resources.
-     */
-    public void dispose() {
-        if (input != null) {
-            input.getWorkspace().removeResourceChangeListener(this);
-            input = null;
-        }
-    }
-
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-        if (this.input != null) {
-            this.input.getWorkspace().removeResourceChangeListener(this);
-        }
-
-        this.input = (IResource) newInput;
-
-        if (this.input != null) {
-            this.input.getWorkspace().addResourceChangeListener(this,
-                    IResourceChangeEvent.POST_CHANGE);
-        }
-
-        this.viewer = (TableViewer) viewer;
-    }
-
-    /**
-     * Returns all the markers that should be shown for
-     * the current settings.
-     */
-    public Object[] getElements(Object parent) {
-        try {
-            IMarker[] markers = getMarkers();
-            this.visibleMarkerCounts = getMarkerCounts(Arrays.asList(markers));
-
-            if (getFilterOnMarkerLimit() && markers.length > getMarkerLimit()) {
-                if (!isMarkerLimitExceeded()) {
-                    setMarkerLimitExceeded(true);
-
-                    viewer.getControl().getDisplay().syncExec(new Runnable() {
-                        public void run() {
-                            viewer.refresh();
-                        }
-                    });
-                }
-
-                return new IMarker[0];
-            } else {
-                if (isMarkerLimitExceeded()) {
-                    setMarkerLimitExceeded(false);
-
-                    viewer.getControl().getDisplay().syncExec(new Runnable() {
-                        public void run() {
-                            viewer.refresh();
-                        }
-                    });
-                }
-
-                return markers;
-            }
-        } catch (CoreException e) {
-            return new IMarker[0];
-        }
-    }
-
-    /**
-     * The workbench has changed.  Process the delta and issue updates to the 
-     * viewer, inside the UI thread.
-     *
-     * @see IResourceChangeListener#resourceChanged
-     */
-    public void resourceChanged(final IResourceChangeEvent event) {
-        /*
-         * gather all marker changes from the delta. be sure to do this in the 
-         * calling thread, as the delta is destroyed when this method returns
-         */
-        IMarkerDelta[] markerDeltas = event.findMarkerDeltas(null, true);
-
-        if (markerDeltas == null) {
-			return;
-		}
-
-        int oldTotal = totalMarkerCount;
-        final List additions = new ArrayList();
-        final List removals = new ArrayList();
-        final List changes = new ArrayList();
-
-        for (int i = 0; i < markerDeltas.length; i++) {
-            IMarkerDelta markerDelta = markerDeltas[i];
-
-            if (markerDelta == null) {
-				continue;
-			}
-
-            int iKind = markerDelta.getKind();
-
-            for (int j = 0; j < TasksFilter.ROOT_TYPES.length; j++) {
-                if (markerDelta.isSubtypeOf(TasksFilter.ROOT_TYPES[j])) {
-
-                    /* 
-                     * Updates the total count of markers given the applicable 
-                     * marker deltas. 
-                     */
-                    if (totalMarkerCount != -1) {
-                        switch (iKind) {
-                        case IResourceDelta.ADDED:
-                            totalMarkerCount++;
-                            break;
-                        case IResourceDelta.REMOVED:
-                            totalMarkerCount--;
-                            break;
-                        }
-                    }
-
-                    /*
-                     * Partition the marker deltas into one of the three given 
-                     * lists depending on
-                     * the type of delta (add, remove, or change).
-                     * The resulting lists contain the corresponding markers, 
-                     * not the deltas.
-                     * Deltas which are not under the current focus resource are 
-                     * discarded.
-                     * This also updates the marker counts.
-                     */
-
-                    IResource resource = markerDelta.getResource();
-
-                    if (resource == null) {
-						continue;
-					}
-
-                    boolean affectedBy = taskList.checkResource(resource)
-                            && taskList.getFilter().select(markerDelta);
-
-                    if (affectedBy) {
-                        IMarker marker = markerDelta.getMarker();
-
-                        switch (iKind) {
-                        case IResourceDelta.ADDED:
-                            additions.add(marker);
-                            updateMarkerCounts(markerDelta, +1);
-                            break;
-                        case IResourceDelta.REMOVED:
-                            removals.add(marker);
-                            updateMarkerCounts(markerDelta, -1);
-                            break;
-                        case IResourceDelta.CHANGED:
-                            changes.add(marker);
-                            /* 
-                             * Assume attribute changes don't affect marker 
-                             * counts. This is only true if problem severities 
-                             * can't change. 
-                             */
-                            break;
-                        }
-                    }
-
-                    break;
-                }
-            }
-        }
-
-        if (oldTotal == totalMarkerCount
-                && additions.size() + removals.size() + changes.size() == 0) {
-            // no changes to markers that we care about
-            return;
-        }
-
-        /*
-         * do the required viewer updates in the UI thread need to use syncExec; 
-         * see 1G95PU8: ITPUI:WIN2000 - Changing task description flashes old 
-         * description
-         */
-        viewer.getControl().getDisplay().syncExec(new Runnable() {
-            public void run() {
-                if (getFilterOnMarkerLimit()
-                        && sum(visibleMarkerCounts) > getMarkerLimit()) {
-                    if (!isMarkerLimitExceeded()) {
-                        setMarkerLimitExceeded(true);
-                        viewer.refresh();
-                    }
-                } else if (taskList.isMarkerLimitExceeded()) {
-                    setMarkerLimitExceeded(false);
-                    viewer.refresh();
-                } else {
-                    updateViewer(additions, removals, changes);
-                }
-
-                /* Update the task list's status message.
-                 * XXX: Quick and dirty solution here.  
-                 * Would be better to have a separate model for the tasks and
-                 * have both the content provider and the task list register for 
-                 * updates. XXX: Do this inside the syncExec, since we're 
-                 * talking to status line widget.
-                 */
-                taskList.markersChanged();
-            }
-        });
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskPropertiesAction.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskPropertiesAction.java
deleted file mode 100644
index c6145ed..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskPropertiesAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This action opens the properties dialog for the current task.
- */
-class TaskPropertiesAction extends TaskAction {
-
-    /**
-     * Creates the action.
-     * 
-     * @param tasklist the task list
-     * @param id the id
-     */
-    public TaskPropertiesAction(TaskList tasklist, String id) {
-        super(tasklist, id);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                ITaskListHelpContextIds.TASK_PROPERTIES_ACTION);
-    }
-
-    /**
-     * Performs this action.
-     */
-    public void run() {
-        IStructuredSelection sel = (IStructuredSelection) getTaskList()
-                .getSelection();
-        Object o = sel.getFirstElement();
-        if (o instanceof IMarker) {
-            TaskPropertiesDialog dialog = new TaskPropertiesDialog(getShell());
-            dialog.setMarker((IMarker) o);
-            dialog.open();
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskPropertiesDialog.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskPropertiesDialog.java
deleted file mode 100644
index 8dca6b9..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskPropertiesDialog.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - bug 132427 - [Markers] TaskPropertiesDialog problems
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.dialogs.IDialogSettings;
-
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.views.markers.internal.DialogTaskProperties;
-
-/**
- * Shows the properties of a new or existing task, or a problem.
- */
-public class TaskPropertiesDialog extends DialogTaskProperties {
-
-	private static final String DIALOG_SETTINGS_SECTION = "TaskPropertiesDialogSettings"; //$NON-NLS-1$
-
-	/**
-	 * Creates the dialog. By default this dialog creates a new task. To set the
-	 * resource and initial attributes for the new task, use
-	 * <code>setResource</code> and <code>setInitialAttributes</code>. To
-	 * show or modify an existing task, use <code>setMarker</code>.
-	 * 
-	 * @param parentShell
-	 *            the parent shell
-	 */
-	public TaskPropertiesDialog(Shell parentShell) {
-		super(parentShell);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Dialog#getDialogBoundsSettings()
-	 * 
-	 * @since 3.2
-	 */
-	protected IDialogSettings getDialogBoundsSettings() {
-		IDialogSettings settings = IDEWorkbenchPlugin.getDefault()
-				.getDialogSettings();
-		IDialogSettings section = settings.getSection(DIALOG_SETTINGS_SECTION);
-		if (section == null) {
-			section = settings.addNewSection(DIALOG_SETTINGS_SECTION);
-		}
-		return section;
-	}
-	
-    /**
-     * Sets the marker to show or modify.
-     * 
-     * @param marker the marker, or <code>null</code> to create a new marker
-     */
-    public void setMarker(IMarker marker) {
-    	// Method is overridden because API is being inherited from an internal class.
-        super.setMarker(marker);
-    }
-
-    /**
-     * Returns the marker being created or modified.
-     * For a new marker, this returns <code>null</code> until
-     * the dialog returns, but is non-null after.
-     * 
-     * @return the marker
-     */
-    public IMarker getMarker() {
-    	// Method is overridden because API is being inherited from an internal class.
-        return super.getMarker();
-    }
-
-    /**
-     * Sets the resource to use when creating a new task.
-     * If not set, the new task is created on the workspace root.
-     * 
-     * @param resource the resource
-     */
-    public void setResource(IResource resource) {
-    	// Method is overridden because API is being inherited from an internal class.
-        super.setResource(resource);
-    }
-
-    /**
-     * Returns the resource to use when creating a new task,
-     * or <code>null</code> if none has been set.
-     * If not set, the new task is created on the workspace root.
-     * 
-     * @return the resource
-     */
-    public IResource getResource() {
-    	// Method is overridden because API is being inherited from an internal class.
-        return super.getResource();
-    }
-
-    /**
-     * Sets initial attributes to use when creating a new task.
-     * If not set, the new task is created with default attributes.
-     * 
-     * @param initialAttributes the initial attributes
-     */
-    public void setInitialAttributes(Map initialAttributes) {
-    	// Method is overridden because API is being inherited from an internal class.
-        super.setInitialAttributes(initialAttributes);
-    }
-
-    /**
-     * Returns the initial attributes to use when creating a new task,
-     * or <code>null</code> if not set.
-     * If not set, the new task is created with default attributes.
-     * 
-     * @return the initial attributes
-     */
-    public Map getInitialAttributes() {
-    	// Method is overridden because API is being inherited from an internal class.
-        return super.getInitialAttributes();
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskSorter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskSorter.java
deleted file mode 100644
index c0ffef4..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TaskSorter.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-
-/**
- * This is the task list's sorter.
- */
-class TaskSorter extends ViewerComparator {
-    private int[] priorities;
-
-    private int[] directions;
-
-    final static int ASCENDING = 1;
-
-    final static int DEFAULT_DIRECTION = 0;
-
-    final static int DESCENDING = -1;
-
-    final static int TYPE = 0;
-
-    final static int COMPLETION = 1;
-
-    final static int PRIORITY = 2;
-
-    final static int DESCRIPTION = 3;
-
-    final static int RESOURCE = 4;
-
-    final static int FOLDER = 5;
-
-    final static int LOCATION = 6;
-
-    final static int CREATION_TIME = 7;
-
-    final static int[] DEFAULT_PRIORITIES = { FOLDER, RESOURCE, LOCATION,
-            DESCRIPTION, TYPE, PRIORITY, COMPLETION, CREATION_TIME };
-
-    final static int[] DEFAULT_DIRECTIONS = { DESCENDING, //type
-            DESCENDING, //completed
-            DESCENDING, //priority
-            ASCENDING, //description
-            ASCENDING, //resource
-            ASCENDING, //folder
-            ASCENDING, //location
-            ASCENDING }; //creation time
-
-    /**
-     * Creates a new task sorter.
-     */
-    public TaskSorter() {
-        resetState();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ViewerSorter.
-     */
-    /**
-     * Compares two markers, sorting first by the main column of this sorter,
-     * then by subsequent columns, depending on the column sort order.
-     */
-    public int compare(Viewer viewer, Object e1, Object e2) {
-        IMarker m1 = (IMarker) e1;
-        IMarker m2 = (IMarker) e2;
-        return compareColumnValue(m1, m2, 0);
-    }
-
-    public void setTopPriority(int priority) {
-        if (priority < 0 || priority >= priorities.length) {
-			return;
-		}
-
-        int index = -1;
-        for (int i = 0; i < priorities.length; i++) {
-            if (priorities[i] == priority) {
-                index = i;
-                break;
-            }
-        }
-
-        if (index == -1) {
-            resetState();
-            return;
-        }
-
-        //shift the array
-        for (int i = index; i > 0; i--) {
-            priorities[i] = priorities[i - 1];
-        }
-        priorities[0] = priority;
-        directions[priority] = DEFAULT_DIRECTIONS[priority];
-    }
-
-    public int getTopPriority() {
-        return priorities[0];
-    }
-
-    public int[] getPriorities() {
-        return priorities;
-    }
-
-    public void setTopPriorityDirection(int direction) {
-        if (direction == DEFAULT_DIRECTION) {
-			directions[priorities[0]] = DEFAULT_DIRECTIONS[priorities[0]];
-		} else if (direction == ASCENDING || direction == DESCENDING) {
-			directions[priorities[0]] = direction;
-		}
-    }
-
-    public int getTopPriorityDirection() {
-        return directions[priorities[0]];
-    }
-
-    public void reverseTopPriority() {
-        directions[priorities[0]] *= -1;
-    }
-
-    public void resetState() {
-        priorities = new int[DEFAULT_PRIORITIES.length];
-        System.arraycopy(DEFAULT_PRIORITIES, 0, priorities, 0,
-                priorities.length);
-        directions = new int[DEFAULT_DIRECTIONS.length];
-        System.arraycopy(DEFAULT_DIRECTIONS, 0, directions, 0,
-                directions.length);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ViewerSorter.
-     */
-    /**
-     * Compares two markers, based only on the value of the specified column.
-     */
-    private int compareColumnValue(IMarker m1, IMarker m2, int depth) {
-        if (depth >= priorities.length) {
-			return 0;
-		}
-
-        int columnNumber = priorities[depth];
-        int direction = directions[columnNumber];
-        switch (columnNumber) {
-        case TYPE: {
-            /* category */
-            int result = getCategoryOrder(m1) - getCategoryOrder(m2);
-            if (result == 0) {
-				return compareColumnValue(m1, m2, depth + 1);
-			}
-            return result * direction;
-        }
-        case COMPLETION: {
-            /* completed */
-            int result = getCompletedOrder(m1) - getCompletedOrder(m2);
-            if (result == 0) {
-				return compareColumnValue(m1, m2, depth + 1);
-			}
-            return result * direction;
-        }
-        case PRIORITY: {
-            /* priority */
-            int result = getPriorityOrder(m1) - getPriorityOrder(m2);
-            if (result == 0) {
-				return compareColumnValue(m1, m2, depth + 1);
-			}
-            return result * direction;
-        }
-        case DESCRIPTION: {
-            /* description */
-            int result = getComparator().compare(MarkerUtil.getMessage(m1), MarkerUtil
-                    .getMessage(m2));
-            if (result == 0) {
-				return compareColumnValue(m1, m2, depth + 1);
-			}
-            return result * direction;
-        }
-        case RESOURCE: {
-            /* resource name */
-            IResource r1 = m1.getResource();
-            IResource r2 = m2.getResource();
-            String n1 = r1.getName();
-            String n2 = r2.getName();
-            int result = getComparator().compare(n1, n2);
-            if (result == 0) {
-				return compareColumnValue(m1, m2, depth + 1);
-			}
-            return result * direction;
-        }
-        case FOLDER: {
-            /* container name */
-            String c1 = MarkerUtil.getContainerName(m1);
-            String c2 = MarkerUtil.getContainerName(m2);
-            int result = c1.equals(c2) ? 0 : getComparator().compare(c1, c2);
-            if (result == 0) {
-				return compareColumnValue(m1, m2, depth + 1);
-			}
-            return result * direction;
-        }
-        case LOCATION: {
-            /* line and location */
-            int result = compareLineAndLocation(m1, m2);
-            if (result == 0) {
-				return compareColumnValue(m1, m2, depth + 1);
-			}
-            return result * direction;
-        }
-        case CREATION_TIME: {
-            /* creation time */
-            int result = compareCreationTime(m1, m2);
-            if (result == 0) {
-				return compareColumnValue(m1, m2, depth + 1);
-			}
-            return result * direction;
-        }
-        default:
-            return 0;
-        }
-    }
-
-    /**
-     * Compares the creation time of two markers.
-     */
-    private int compareCreationTime(IMarker m1, IMarker m2) {
-        long result;
-        try {
-            result = m1.getCreationTime() - m2.getCreationTime();
-        } catch (CoreException e) {
-            result = 0;
-        }
-        if (result > 0) {
-			return 1;
-		} else if (result < 0) {
-			return -1;
-		}
-        return 0;
-    }
-
-    /**
-     * Compares the line number and location of the two markers.
-     * If line number is specified for both, this sorts first by line number (numerically), 
-     * then by start offset (numerically), then by location (textually).
-     * If line number is not specified for either, this sorts by location.
-     * Otherwise, if only one has a line number, this sorts by the combined text for line number and location.
-     */
-    private int compareLineAndLocation(IMarker m1, IMarker m2) {
-        int line1 = MarkerUtil.getLineNumber(m1);
-        int line2 = MarkerUtil.getLineNumber(m2);
-        if (line1 != -1 && line2 != -1) {
-            if (line1 != line2) {
-                return line1 - line2;
-            }
-            int start1 = MarkerUtil.getCharStart(m1);
-            int start2 = MarkerUtil.getCharStart(m2);
-            if (start1 != -1 && start2 != -1) {
-                if (start1 != start2) {
-                    return start1 - start2;
-                }
-            }
-            String loc1 = MarkerUtil.getLocation(m1);
-            String loc2 = MarkerUtil.getLocation(m2);
-            return getComparator().compare(loc1, loc2);
-        }
-        if (line1 == -1 && line2 == -1) {
-            String loc1 = MarkerUtil.getLocation(m1);
-            String loc2 = MarkerUtil.getLocation(m2);
-            return getComparator().compare(loc1, loc2);
-        }
-        String loc1 = MarkerUtil.getLineAndLocation(m1);
-        String loc2 = MarkerUtil.getLineAndLocation(m2);
-        return getComparator().compare(loc1, loc2);
-    }
-
-    /**
-     * Returns the sort order for the given marker based on its category.
-     * Lower numbers appear first.
-     */
-    private int getCategoryOrder(IMarker marker) {
-        if (MarkerUtil.isMarkerType(marker, IMarker.PROBLEM)) {
-            switch (MarkerUtil.getSeverity(marker)) {
-            case IMarker.SEVERITY_ERROR:
-                return 4;
-            case IMarker.SEVERITY_WARNING:
-                return 3;
-            case IMarker.SEVERITY_INFO:
-                return 2;
-            }
-        } else if (MarkerUtil.isMarkerType(marker, IMarker.TASK)) {
-            return 1;
-        }
-        return 1000;
-    }
-
-    /**
-     * Returns the sort order for the given marker based on its completion status.
-     * Lower numbers appear first.
-     */
-    private int getCompletedOrder(IMarker marker) {
-        if (MarkerUtil.isMarkerType(marker, IMarker.TASK)) {
-			return MarkerUtil.isComplete(marker) ? 2 : 1;
-		}
-        return 0;
-    }
-
-    /**
-     * Returns the sort order for the given marker based on its priority.
-     */
-    private int getPriorityOrder(IMarker marker) {
-        if (MarkerUtil.isMarkerType(marker, IMarker.TASK)) {
-			return MarkerUtil.getPriority(marker);
-		}
-        return -1;
-    }
-
-    public void saveState(IDialogSettings settings) {
-        if (settings == null) {
-			return;
-		}
-
-        for (int i = 0; i < directions.length; i++) {
-            settings.put("direction" + i, directions[i]);//$NON-NLS-1$
-            settings.put("priority" + i, priorities[i]);//$NON-NLS-1$
-        }
-    }
-
-    public void restoreState(IDialogSettings settings) {
-        if (settings == null) {
-			return;
-		}
-
-        try {
-            for (int i = 0; i < priorities.length; i++) {
-                directions[i] = settings.getInt("direction" + i);//$NON-NLS-1$
-                priorities[i] = settings.getInt("priority" + i);//$NON-NLS-1$
-            }
-        } catch (NumberFormatException e) {
-            resetState();
-        }
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TasksFilter.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TasksFilter.java
deleted file mode 100644
index 5676ae2..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/TasksFilter.java
+++ /dev/null
@@ -1,535 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *      IBM Corporation - initial API and implementation 
- * 		Cagatay Kavukcuoglu <cagatayk@acm.org> - Filter for markers in same project
- *******************************************************************************/
-
-package org.eclipse.ui.views.tasklist;
-
-import java.util.Arrays;
-import java.util.HashSet;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.ui.IContainmentAdapter;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPersistable;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.PlatformUI;
-
-class TasksFilter extends ViewerFilter implements Cloneable {
-
-    public static final String[] ROOT_TYPES = new String[] { IMarker.PROBLEM,
-            IMarker.TASK };
-
-    // Filter on resource constants
-    static final int ON_ANY_RESOURCE = 0;
-
-    static final int ON_SELECTED_RESOURCE_ONLY = 1;
-
-    static final int ON_SELECTED_RESOURCE_AND_CHILDREN = 2;
-
-    static final int ON_ANY_RESOURCE_OF_SAME_PROJECT = 3; // added by cagatayk@acm.org
-
-    static final int ON_WORKING_SET = 4;
-
-    // Description filter kind constants
-    static final int FILTER_CONTAINS = 0;
-
-    static final int FILTER_DOES_NOT_CONTAIN = 1;
-
-    //final static int MINIMUM_MARKER_LIMIT = 10;
-    final static int DEFAULT_MARKER_LIMIT = 2000;
-
-    //final static int MAXIMUM_MARKER_LIMIT = 20000;
-
-    String[] types;
-
-    int onResource;
-
-    IWorkingSet workingSet;
-
-    boolean filterOnDescription;
-
-    int descriptionFilterKind;
-
-    String descriptionFilter;
-
-    boolean filterOnSeverity;
-
-    int severityFilter;
-
-    boolean filterOnPriority;
-
-    int priorityFilter;
-
-    boolean filterOnCompletion;
-
-    int completionFilter;
-
-    private boolean filterOnMarkerLimit = true;
-
-    private int markerLimit = DEFAULT_MARKER_LIMIT;
-
-    private static final String TAG_ID = "id"; //$NON-NLS-1$
-
-    private static final String TAG_TYPE = "type"; //$NON-NLS-1$
-
-    private static final String TAG_ON_RESOURCE = "onResource"; //$NON-NLS-1$
-
-    private static final String TAG_WORKING_SET = "workingSet"; //$NON-NLS-1$	
-
-    private static final String TAG_FILTER_ON_DESCRIPTION = "filterOnDescription"; //$NON-NLS-1$
-
-    private static final String TAG_DESCRIPTION_FILTER_KIND = "descriptionFilterKind"; //$NON-NLS-1$
-
-    private static final String TAG_DESCRIPTION_FILTER = "descriptionFilter"; //$NON-NLS-1$
-
-    private static final String TAG_FILTER_ON_SEVERITY = "filterOnSeverity"; //$NON-NLS-1$
-
-    private static final String TAG_SEVERITY_FILTER = "severityFilter"; //$NON-NLS-1$
-
-    private static final String TAG_FILTER_ON_PRIORITY = "filterOnPriority"; //$NON-NLS-1$
-
-    private static final String TAG_PRIORITY_FILTER = "priorityFilter"; //$NON-NLS-1$
-
-    private static final String TAG_FILTER_ON_COMPLETION = "filterOnCompletion"; //$NON-NLS-1$
-
-    private static final String TAG_COMPLETION_FILTER = "completionFilter"; //$NON-NLS-1$
-
-    private static final String TAG_FILTER_ON_MARKER_LIMIT = "filterOnMarkerLimit"; //$NON-NLS-1$ 
-
-    private static final String TAG_MARKER_LIMIT = "markerLimit"; //$NON-NLS-1$
-
-    public TasksFilter() {
-        reset();
-    }
-
-    boolean getFilterOnMarkerLimit() {
-        return filterOnMarkerLimit;
-    }
-
-    void setFilterOnMarkerLimit(boolean filterOnMarkerLimit) {
-        this.filterOnMarkerLimit = filterOnMarkerLimit;
-    }
-
-    int getMarkerLimit() {
-        return markerLimit;
-    }
-
-    void setMarkerLimit(int markerLimit) {
-        if (markerLimit < 1) {
-            markerLimit = TasksFilter.DEFAULT_MARKER_LIMIT;
-        }
-
-        //if (markerLimit < TasksFilter.MINIMUM_MARKER_LIMIT) {
-        //	markerLimit = TasksFilter.MINIMUM_MARKER_LIMIT;
-        //} else if (markerLimit > TasksFilter.MAXIMUM_MARKER_LIMIT) {
-        //	markerLimit = TasksFilter.MAXIMUM_MARKER_LIMIT;
-        //} 
-
-        this.markerLimit = markerLimit;
-    }
-
-    boolean checkDescription(String desc) {
-        if (desc == null) { // be paranoid
-            desc = ""; //$NON-NLS-1$
-        }
-        boolean contains = containsSubstring(desc, descriptionFilter);
-        return descriptionFilterKind == FILTER_CONTAINS ? contains : !contains;
-    }
-
-    public Object clone() {
-        try {
-            return super.clone();
-        } catch (CloneNotSupportedException e) {
-            throw new Error(); // shouldn't happen
-        }
-    }
-
-    boolean containsSubstring(String string, String substring) {
-        int strLen = string.length();
-        int subLen = substring.length();
-        int len = strLen - subLen;
-        for (int i = 0; i <= len; ++i) {
-            if (string.regionMatches(true, i, substring, 0, subLen)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Returns if the given resource is enclosed by a working set element.
-     * The IContainmentAdapter of each working set element is used for the
-     * containment test. If there is no IContainmentAdapter for a working 
-     * set element, a simple resource based test is used. 
-     * 
-     * @param element resource to test for enclosure by a working set
-     * 	element 
-     * @return true if element is enclosed by a working set element and 
-     * 	false otherwise. 
-     */
-    private boolean isEnclosed(IResource element) {
-        IPath elementPath = element.getFullPath();
-        IAdaptable[] workingSetElements = workingSet.getElements();
-
-        if (elementPath.isEmpty() || elementPath.isRoot()) {
-            return false;
-        }
-        for (int i = 0; i < workingSetElements.length; i++) {
-            IAdaptable workingSetElement = workingSetElements[i];
-            IContainmentAdapter containmentAdapter = (IContainmentAdapter) workingSetElement
-                    .getAdapter(IContainmentAdapter.class);
-
-            // if there is no IContainmentAdapter defined for the working  
-            // set element type fall back to using resource based  
-            // containment check 
-            if (containmentAdapter != null) {
-                if (containmentAdapter.contains(workingSetElement, element,
-                        IContainmentAdapter.CHECK_CONTEXT
-                                | IContainmentAdapter.CHECK_IF_CHILD
-                                | IContainmentAdapter.CHECK_IF_DESCENDANT)) {
-					return true;
-				}
-            } else if (isEnclosedResource(element, elementPath,
-                    workingSetElement)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Returns if the given resource is enclosed by a working set element.
-     * A resource is enclosed if it is either a parent of a working set 
-     * element, a child of a working set element or a working set element
-     * itself.
-     * Simple path comparison is used. This is only guaranteed to return
-     * correct results for resource working set elements. 
-     * 
-     * @param element resource to test for enclosure by a working set
-     * 	element
-     * @param elementPath full, absolute path of the element to test 
-     * @return true if element is enclosed by a working set element and 
-     * 	false otherwise. 
-     */
-    private boolean isEnclosedResource(IResource element, IPath elementPath,
-            IAdaptable workingSetElement) {
-        IResource workingSetResource = null;
-
-        if (workingSetElement.equals(element)) {
-			return true;
-		}
-        if (workingSetElement instanceof IResource) {
-            workingSetResource = (IResource) workingSetElement;
-        } else {
-            workingSetResource = (IResource) workingSetElement
-                    .getAdapter(IResource.class);
-        }
-        if (workingSetResource != null) {
-            IPath resourcePath = workingSetResource.getFullPath();
-            if (resourcePath.isPrefixOf(elementPath)) {
-				return true;
-			}
-        }
-        return false;
-    }
-
-    public void reset() {
-        types = ROOT_TYPES;
-        onResource = ON_ANY_RESOURCE;
-        filterOnDescription = false;
-        descriptionFilter = ""; //$NON-NLS-1$
-        filterOnSeverity = false;
-        severityFilter = 0;
-        filterOnPriority = false;
-        priorityFilter = 0;
-        filterOnCompletion = false;
-        completionFilter = 0;
-        filterOnMarkerLimit = true;
-        markerLimit = DEFAULT_MARKER_LIMIT;
-    }
-
-    /**
-     * @see IPersistable
-     */
-    public void restoreState(IMemento memento) {
-        IMemento children[] = memento.getChildren(TAG_TYPE);
-        types = new String[children.length];
-        for (int i = 0; i < children.length; i++) {
-            types[i] = children[i].getString(TAG_ID);
-        }
-        Integer ival = memento.getInteger(TAG_ON_RESOURCE);
-        onResource = ival == null ? ON_ANY_RESOURCE : ival.intValue();
-        restoreWorkingSet(memento.getString(TAG_WORKING_SET));
-        ival = memento.getInteger(TAG_FILTER_ON_DESCRIPTION);
-        filterOnDescription = ival != null && ival.intValue() == 1;
-        ival = memento.getInteger(TAG_DESCRIPTION_FILTER_KIND);
-        descriptionFilterKind = ival == null ? FILTER_CONTAINS : ival
-                .intValue();
-        descriptionFilter = memento.getString(TAG_DESCRIPTION_FILTER);
-        if (descriptionFilter == null) {
-			descriptionFilter = ""; //$NON-NLS-1$
-		}
-        ival = memento.getInteger(TAG_FILTER_ON_SEVERITY);
-        filterOnSeverity = ival != null && ival.intValue() == 1;
-        ival = memento.getInteger(TAG_SEVERITY_FILTER);
-        severityFilter = ival == null ? 0 : ival.intValue();
-        ival = memento.getInteger(TAG_FILTER_ON_PRIORITY);
-        filterOnPriority = ival != null && ival.intValue() == 1;
-        ival = memento.getInteger(TAG_PRIORITY_FILTER);
-        priorityFilter = ival == null ? 0 : ival.intValue();
-        ival = memento.getInteger(TAG_FILTER_ON_COMPLETION);
-        filterOnCompletion = ival != null && ival.intValue() == 1;
-        ival = memento.getInteger(TAG_COMPLETION_FILTER);
-        completionFilter = ival == null ? 0 : ival.intValue();
-        ival = memento.getInteger(TAG_FILTER_ON_MARKER_LIMIT);
-        filterOnMarkerLimit = ival == null || ival.intValue() == 1;
-        ival = memento.getInteger(TAG_MARKER_LIMIT);
-        markerLimit = ival == null ? DEFAULT_MARKER_LIMIT : ival.intValue();
-    }
-
-    /**
-     * Restores the saved working set, if any.
-     * 
-     * @param the saved working set name or null
-     */
-    private void restoreWorkingSet(String workingSetName) {
-        if (workingSetName != null) {
-            IWorkingSetManager workingSetManager = PlatformUI.getWorkbench()
-                    .getWorkingSetManager();
-            IWorkingSet workingSet = workingSetManager
-                    .getWorkingSet(workingSetName);
-
-            if (workingSet != null) {
-                this.workingSet = workingSet;
-            }
-        }
-    }
-
-    /**
-     * Saves the object state within a memento.
-     *
-     * @param memento a memento to receive the object state
-     */
-    public void saveState(IMemento memento) {
-        for (int i = 0; i < types.length; i++) {
-            memento.createChild(TAG_TYPE).putString(TAG_ID, types[i]);
-        }
-        memento.putInteger(TAG_ON_RESOURCE, onResource);
-        if (workingSet != null) {
-            memento.putString(TAG_WORKING_SET, workingSet.getName());
-        }
-        memento.putInteger(TAG_FILTER_ON_DESCRIPTION, filterOnDescription ? 1
-                : 0);
-        memento.putInteger(TAG_DESCRIPTION_FILTER_KIND, descriptionFilterKind);
-        memento.putString(TAG_DESCRIPTION_FILTER, descriptionFilter);
-        memento.putInteger(TAG_FILTER_ON_SEVERITY, filterOnSeverity ? 1 : 0);
-        memento.putInteger(TAG_SEVERITY_FILTER, severityFilter);
-        memento.putInteger(TAG_FILTER_ON_PRIORITY, filterOnPriority ? 1 : 0);
-        memento.putInteger(TAG_PRIORITY_FILTER, priorityFilter);
-        memento
-                .putInteger(TAG_FILTER_ON_COMPLETION, filterOnCompletion ? 1
-                        : 0);
-        memento.putInteger(TAG_COMPLETION_FILTER, completionFilter);
-        memento.putInteger(TAG_FILTER_ON_MARKER_LIMIT, filterOnMarkerLimit ? 1
-                : 0);
-        memento.putInteger(TAG_MARKER_LIMIT, markerLimit);
-    }
-
-    public boolean select(Viewer viewer, Object parentElement, Object element) {
-        return select((IMarker) element);
-    }
-
-    public boolean select(IMarker marker) {
-        // resource settings are handled by the content provider
-        return selectByType(marker) && selectByAttributes(marker)
-                && selectByWorkingSet(marker);
-    }
-
-    public boolean select(IMarkerDelta markerDelta) {
-        // resource settings are handled by the content provider
-        return selectByType(markerDelta) && selectByAttributes(markerDelta)
-                && selectByWorkingSet(markerDelta);
-    }
-
-    private boolean selectByType(IMarker marker) {
-        for (int i = 0; i < types.length; ++i) {
-            if (MarkerUtil.isMarkerType(marker, types[i])) {
-				return true;
-			}
-        }
-        return false;
-    }
-
-    private boolean selectByType(IMarkerDelta markerDelta) {
-        for (int i = 0; i < types.length; ++i) {
-            if (markerDelta.isSubtypeOf(types[i])) {
-				return true;
-			}
-        }
-        return false;
-    }
-
-    /**
-     * Returns whether the specified marker should be filter out or not.
-     * 
-     * @param marker the marker to test
-     * @return 
-     * 	true=the marker should not be filtered out
-     * 	false=the marker should be filtered out
-     */
-    private boolean selectByWorkingSet(IMarker marker) {
-        if (workingSet == null || onResource != ON_WORKING_SET) {
-            return true;
-        }
-        IResource resource = marker.getResource();
-        if (resource != null) {
-            return isEnclosed(resource);
-        }
-        return false;
-    }
-
-    /**
-     * Returns whether the specified marker delta should be filter out 
-     * or not.
-     * 
-     * @param markerDelta the marker delta to test
-     * @return 
-     * 	true=the marker delta should not be filtered out
-     * 	false=the marker delta should be filtered out
-     */
-    private boolean selectByWorkingSet(IMarkerDelta markerDelta) {
-        if (workingSet == null || onResource != ON_WORKING_SET) {
-            return true;
-        }
-        IResource resource = markerDelta.getResource();
-        if (resource != null) {
-            return isEnclosed(resource);
-        }
-        return false;
-    }
-
-    /* 
-     * WARNING: selectByAttributes(IMarker) and selectByAttributes(IMarkerDelta) must correspond.
-     */
-
-    private boolean selectByAttributes(IMarker marker) {
-
-        // severity filter applies only to problems
-        if (filterOnSeverity
-                && MarkerUtil.isMarkerType(marker, IMarker.PROBLEM)) {
-            int sev = MarkerUtil.getSeverity(marker);
-            if ((severityFilter & (1 << sev)) == 0) {
-				return false;
-			}
-        }
-
-        // priority and completion filters apply only to tasks
-        // avoid doing type check more than once
-        if ((filterOnPriority || filterOnCompletion)
-                && MarkerUtil.isMarkerType(marker, IMarker.TASK)) {
-            if (filterOnPriority) {
-                int pri = MarkerUtil.getPriority(marker);
-                if ((priorityFilter & (1 << pri)) == 0) {
-					return false;
-				}
-            }
-            if (filterOnCompletion) {
-                boolean complete = MarkerUtil.isComplete(marker);
-                if ((completionFilter & (complete ? 2 : 1)) == 0) {
-					return false;
-				}
-            }
-        }
-
-        // description applies to all markers
-        if (filterOnDescription) {
-            String desc = MarkerUtil.getMessage(marker);
-            if (!checkDescription(desc)) {
-				return false;
-			}
-        }
-        return true;
-    }
-
-    private boolean selectByAttributes(IMarkerDelta markerDelta) {
-
-        // severity filter applies only to problems
-        if (filterOnSeverity && markerDelta.isSubtypeOf(IMarker.PROBLEM)) {
-            int sev = markerDelta.getAttribute(IMarker.SEVERITY,
-                    IMarker.SEVERITY_WARNING);
-            if ((severityFilter & (1 << sev)) == 0) {
-				return false;
-			}
-        }
-
-        // priority and completion filters apply only to tasks
-        // avoid doing type check more than once
-        if ((filterOnPriority || filterOnCompletion)
-                && markerDelta.isSubtypeOf(IMarker.TASK)) {
-            if (filterOnPriority) {
-                int pri = markerDelta.getAttribute(IMarker.PRIORITY,
-                        IMarker.PRIORITY_NORMAL);
-                if ((priorityFilter & (1 << pri)) == 0) {
-					return false;
-				}
-            }
-            if (filterOnCompletion) {
-                boolean complete = markerDelta
-                        .getAttribute(IMarker.DONE, false);
-                if ((completionFilter & (complete ? 2 : 1)) == 0) {
-					return false;
-				}
-            }
-        }
-
-        // description applies to all markers
-        if (filterOnDescription) {
-            String desc = markerDelta.getAttribute(IMarker.MESSAGE, ""); //$NON-NLS-1$
-            if (!checkDescription(desc)) {
-				return false;
-			}
-        }
-        return true;
-    }
-
-    /**
-     * Returns whether the filter is including all markers.
-     *
-     * @return <code>true</code> if the filter includes all markers, <code>false</code> if not
-     */
-    public boolean isShowingAll() {
-        if (filterOnDescription || filterOnSeverity || filterOnPriority
-                || filterOnCompletion) {
-            return false;
-        }
-        if (onResource != ON_ANY_RESOURCE) {
-            return false;
-        }
-
-        HashSet set = new HashSet(Arrays.asList(types));
-        if (set.size() != ROOT_TYPES.length) {
-            return false;
-        }
-        for (int i = 0; i < ROOT_TYPES.length; ++i) {
-            if (!set.contains(ROOT_TYPES[i])) {
-                return false;
-            }
-        }
-        return true;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/package.html b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/package.html
deleted file mode 100644
index f7fb550..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/views/tasklist/package.html
+++ /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="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides the standard Task List view for displaying
-tasks and problem annotations on resources.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/ExternalProjectImportWizard.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/ExternalProjectImportWizard.java
deleted file mode 100644
index f721686..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/ExternalProjectImportWizard.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.wizards.datatransfer;
-
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.IImportWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.wizards.datatransfer.DataTransferMessages;
-import org.eclipse.ui.internal.wizards.datatransfer.WizardProjectsImportPage;
-
-/**
- * Standard workbench wizard for importing projects defined
- * outside of the currently defined projects into Eclipse.
- * <p>
- * This class may be instantiated and used without further configuration;
- * this class is not intended to be subclassed.
- * </p>
- * <p>
- * Example:
- * <pre>
- * IWizard wizard = new ExternalProjectImportWizard();
- * wizard.init(workbench, selection);
- * WizardDialog dialog = new WizardDialog(shell, wizard);
- * dialog.open();
- * </pre>
- * During the call to <code>open</code>, the wizard dialog is presented to the
- * user. When the user hits Finish, a project is created with the location
- * specified by the user.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-
-public class ExternalProjectImportWizard extends Wizard implements
-        IImportWizard {
-    private static final String EXTERNAL_PROJECT_SECTION = "ExternalProjectImportWizard";//$NON-NLS-1$
-	private WizardProjectsImportPage mainPage;
-	
-    /**
-     * Constructor for ExternalProjectImportWizard.
-     */
-    public ExternalProjectImportWizard() {
-        super();
-        setNeedsProgressMonitor(true);
-        IDialogSettings workbenchSettings = IDEWorkbenchPlugin.getDefault()
-        		.getDialogSettings();
-        
-		IDialogSettings wizardSettings = workbenchSettings
-		        .getSection(EXTERNAL_PROJECT_SECTION);
-		if (wizardSettings == null) {
-			wizardSettings = workbenchSettings
-		            .addNewSection(EXTERNAL_PROJECT_SECTION);
-		}
-		setDialogSettings(wizardSettings);        
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizard.
-     */
-    public void addPages() {
-        super.addPages();
-        mainPage = new WizardProjectsImportPage();
-        addPage(mainPage);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchWizard.
-     */
-    public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
-        setWindowTitle(DataTransferMessages.DataTransfer_importTitle);
-        setDefaultPageImageDescriptor(
-				IDEWorkbenchPlugin.getIDEImageDescriptor("wizban/importproj_wiz.png")); //$NON-NLS-1$
-
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizard.
-     */
-    public boolean performCancel() {
-    	mainPage.performCancel();
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizard.
-     */
-    public boolean performFinish() {
-        return mainPage.createProjects();
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/FileStoreStructureProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/FileStoreStructureProvider.java
deleted file mode 100644
index ed85298..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/FileStoreStructureProvider.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.wizards.datatransfer;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * FileStoreStructureProvider is the structure provider for {@link IFileStore}
- * based file structures.
- * 
- * @since 3.2
- * 
- */
-public class FileStoreStructureProvider implements IImportStructureProvider {
-
-	/**
-	 * Holds a singleton instance of this class.
-	 */
-	public final static FileStoreStructureProvider INSTANCE = new FileStoreStructureProvider();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.wizards.datatransfer.IImportStructureProvider#getChildren(java.lang.Object)
-	 */
-	public List getChildren(Object element) {
-		try {
-			return Arrays.asList(((IFileStore) element).childStores(EFS.NONE,
-					new NullProgressMonitor()));
-		} catch (CoreException exception) {
-			logException(exception);
-			return new ArrayList();
-		}
-	}
-
-	/**
-	 * Log the exception.
-	 * 
-	 * @param exception
-	 */
-	private void logException(CoreException exception) {
-		IDEWorkbenchPlugin.log(exception.getLocalizedMessage(), exception);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.wizards.datatransfer.IImportStructureProvider#getContents(java.lang.Object)
-	 */
-	public InputStream getContents(Object element) {
-		try {
-			return ((IFileStore) element).openInputStream(EFS.NONE,
-					new NullProgressMonitor());
-		} catch (CoreException exception) {
-			logException(exception);
-			return null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.wizards.datatransfer.IImportStructureProvider#getFullPath(java.lang.Object)
-	 */
-	public String getFullPath(Object element) {
-		return ((IFileStore) element).toURI().getSchemeSpecificPart();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.wizards.datatransfer.IImportStructureProvider#getLabel(java.lang.Object)
-	 */
-	public String getLabel(Object element) {
-		return ((IFileStore) element).getName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.wizards.datatransfer.IImportStructureProvider#isFolder(java.lang.Object)
-	 */
-	public boolean isFolder(Object element) {
-		return ((IFileStore) element).fetchInfo().isDirectory();
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/FileSystemExportWizard.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/FileSystemExportWizard.java
deleted file mode 100644
index a66ad10..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/FileSystemExportWizard.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.wizards.datatransfer;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IExportWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.wizards.datatransfer.DataTransferMessages;
-import org.eclipse.ui.internal.wizards.datatransfer.WizardFileSystemResourceExportPage1;
-
-/**
- * Standard workbench wizard for exporting resources from the workspace
- * to the local file system.
- * <p>
- * This class may be instantiated and used without further configuration;
- * this class is not intended to be subclassed.
- * </p>
- * <p>
- * Example:
- * <pre>
- * IWizard wizard = new FileSystemExportWizard();
- * wizard.init(workbench, selection);
- * WizardDialog dialog = new WizardDialog(shell, wizard);
- * dialog.open();
- * </pre>
- * During the call to <code>open</code>, the wizard dialog is presented to the
- * user. When the user hits Finish, the user-selected workspace resources 
- * are exported to the user-specified location in the local file system,
- * the dialog closes, and the call to <code>open</code> returns.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class FileSystemExportWizard extends Wizard implements IExportWizard {
-    private IStructuredSelection selection;
-
-    private WizardFileSystemResourceExportPage1 mainPage;
-
-    /**
-     * Creates a wizard for exporting workspace resources to the local file system.
-     */
-    public FileSystemExportWizard() {
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault().getDialogSettings();
-        IDialogSettings section = workbenchSettings
-                .getSection("FileSystemExportWizard");//$NON-NLS-1$
-        if (section == null) {
-			section = workbenchSettings.addNewSection("FileSystemExportWizard");//$NON-NLS-1$
-		}
-        setDialogSettings(section);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizard.
-     */
-    public void addPages() {
-        super.addPages();
-        mainPage = new WizardFileSystemResourceExportPage1(selection);
-        addPage(mainPage);
-    }
-
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchWizard.
-     */
-    public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
-        this.selection = currentSelection;
-        List selectedResources = IDE.computeSelectedResources(currentSelection);
-        if (!selectedResources.isEmpty()) {
-            this.selection = new StructuredSelection(selectedResources);
-        }
-
-        // look it up if current selection (after resource adapting) is empty
-        if (selection.isEmpty() && workbench.getActiveWorkbenchWindow() != null) {
-            IWorkbenchPage page = workbench.getActiveWorkbenchWindow()
-                    .getActivePage();
-            if (page != null) {
-                IEditorPart currentEditor = page.getActiveEditor();
-                if (currentEditor != null) {
-                    Object selectedResource = currentEditor.getEditorInput()
-                            .getAdapter(IResource.class);
-                    if (selectedResource != null) {
-                        selection = new StructuredSelection(selectedResource);
-                    }
-                }
-            }
-        }
-
-        setWindowTitle(DataTransferMessages.DataTransfer_export);
-        setDefaultPageImageDescriptor(IDEWorkbenchPlugin.getIDEImageDescriptor("wizban/exportdir_wiz.png"));//$NON-NLS-1$
-        setNeedsProgressMonitor(true);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizard.
-     */
-    public boolean performFinish() {
-        return mainPage.finish();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/FileSystemImportWizard.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/FileSystemImportWizard.java
deleted file mode 100644
index b07b4cd..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/FileSystemImportWizard.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.wizards.datatransfer;
-
-import java.util.List;
-
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.IImportWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.wizards.datatransfer.DataTransferMessages;
-import org.eclipse.ui.internal.wizards.datatransfer.WizardFileSystemResourceImportPage1;
-
-/**
- * Standard workbench wizard for importing resources from the local file system
- * into the workspace.
- * <p>
- * This class may be instantiated and used without further configuration;
- * this class is not intended to be subclassed.
- * </p>
- * <p>
- * Example:
- * <pre>
- * IWizard wizard = new FileSystemImportWizard();
- * wizard.init(workbench, selection);
- * WizardDialog dialog = new WizardDialog(shell, wizard);
- * dialog.open();
- * </pre>
- * During the call to <code>open</code>, the wizard dialog is presented to the
- * user. When the user hits Finish, the user-selected files are imported
- * into the workspace, the dialog closes, and the call to <code>open</code>
- * returns.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class FileSystemImportWizard extends Wizard implements IImportWizard {
-    private IWorkbench workbench;
-
-    private IStructuredSelection selection;
-
-    private WizardFileSystemResourceImportPage1 mainPage;
-
-    /**
-     * Creates a wizard for importing resources into the workspace from
-     * the file system.
-     */
-    public FileSystemImportWizard() {
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault().getDialogSettings();
-        IDialogSettings section = workbenchSettings
-                .getSection("FileSystemImportWizard");//$NON-NLS-1$
-        if (section == null) {
-			section = workbenchSettings.addNewSection("FileSystemImportWizard");//$NON-NLS-1$
-		}
-        setDialogSettings(section);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizard.
-     */
-    public void addPages() {
-        super.addPages();
-        mainPage = new WizardFileSystemResourceImportPage1(workbench, selection);
-        addPage(mainPage);
-    }
-
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchWizard.
-     */
-    public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
-        this.workbench = workbench;
-        this.selection = currentSelection;
-
-        List selectedResources = IDE.computeSelectedResources(currentSelection);
-        if (!selectedResources.isEmpty()) {
-            this.selection = new StructuredSelection(selectedResources);
-        }
-
-        setWindowTitle(DataTransferMessages.DataTransfer_importTitle);
-        setDefaultPageImageDescriptor(IDEWorkbenchPlugin.getIDEImageDescriptor("wizban/importdir_wiz.png"));//$NON-NLS-1$
-        setNeedsProgressMonitor(true);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizard.
-     */
-    public boolean performFinish() {
-        return mainPage.finish();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/FileSystemStructureProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/FileSystemStructureProvider.java
deleted file mode 100644
index 7b48b0a..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/FileSystemStructureProvider.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.wizards.datatransfer;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * This class provides information regarding the structure and
- * content of specified file system File objects.
- */
-public class FileSystemStructureProvider implements IImportStructureProvider {
-
-    /**
-     * Holds a singleton instance of this class.
-     */
-    public final static FileSystemStructureProvider INSTANCE = new FileSystemStructureProvider();
-
-    /**
-     * Creates an instance of <code>FileSystemStructureProvider</code>.
-     */
-    private FileSystemStructureProvider() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IImportStructureProvider
-     */
-    public List getChildren(Object element) {
-        File folder = (File) element;
-        String[] children = folder.list();
-        int childrenLength = children == null ? 0 : children.length;
-        List result = new ArrayList(childrenLength);
-
-        for (int i = 0; i < childrenLength; i++) {
-			result.add(new File(folder, children[i]));
-		}
-
-        return result;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IImportStructureProvider
-     */
-    public InputStream getContents(Object element) {
-        try {
-            return new FileInputStream((File) element);
-        } catch (FileNotFoundException e) {
-        	IDEWorkbenchPlugin.log(e.getLocalizedMessage(), e);
-            return null;
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IImportStructureProvider
-     */
-    public String getFullPath(Object element) {
-        return ((File) element).getPath();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IImportStructureProvider
-     */
-    public String getLabel(Object element) {
-
-        //Get the name - if it is empty then return the path as it is a file root
-        File file = (File) element;
-        String name = file.getName();
-        if (name.length() == 0) {
-			return file.getPath();
-		}
-        return name;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IImportStructureProvider
-     */
-    public boolean isFolder(Object element) {
-        return ((File) element).isDirectory();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/IImportStructureProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/IImportStructureProvider.java
deleted file mode 100644
index 4b51378..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/IImportStructureProvider.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.wizards.datatransfer;
-
-import java.io.InputStream;
-import java.util.List;
-
-/**
- * Interface which can provide structure and content information 
- * for an element (for example, a file system element).
- * Used by the import wizards to abstract the commonalities
- * between importing from the file system and importing from an archive.
- */
-public interface IImportStructureProvider {
-    /**
-     * Returns a collection with the children of the specified structured element.
-     * 
-     * @param element the element for which to compute the children
-     * @return the list of child elements 
-     */
-    List getChildren(Object element);
-
-    /**
-     * Returns the contents of the specified structured element, or
-     * <code>null</code> if there is a problem determining the element's
-     * contents.
-     * <p>
-     * <strong>Note:</strong>: The client is responsible for closing the stream when finished.</p>
-     *
-     * @param element a structured element
-     * @return the contents of the structured element, or <code>null</code>
-     */
-    InputStream getContents(Object element);
-
-    /**
-     * Returns the full path of the specified structured element.
-     *
-     * @param element a structured element
-     * @return the display label of the structured element
-     */
-    String getFullPath(Object element);
-
-    /**
-     * Returns the display label of the specified structured element.
-     *
-     * @param element a structured element
-     * @return the display label of the structured element
-     */
-    String getLabel(Object element);
-
-    /**
-     * Returns a boolean indicating whether the passed structured element represents
-     * a container element (as opposed to a leaf element).
-     *
-     * @return boolean
-     * @param element java.lang.Object
-     */
-    boolean isFolder(Object element);
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/ImportOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/ImportOperation.java
deleted file mode 100644
index df78a64..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/ImportOperation.java
+++ /dev/null
@@ -1,867 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Red Hat, Inc - changed TarFileStructureProvider to TarLeveledStructureProvider 
- *******************************************************************************/
-package org.eclipse.ui.wizards.datatransfer;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourceAttributes;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.dialogs.ContainerGenerator;
-import org.eclipse.ui.dialogs.IOverwriteQuery;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.wizards.datatransfer.DataTransferMessages;
-import org.eclipse.ui.internal.wizards.datatransfer.TarLeveledStructureProvider;
-
-/**
- * An operation which does the actual work of copying objects from the local file
- * system into the workspace.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ImportOperation extends WorkspaceModifyOperation {
-    private static final int POLICY_DEFAULT = 0;
-
-    private static final int POLICY_SKIP_CHILDREN = 1;
-
-    private static final int POLICY_FORCE_OVERWRITE = 2;
-
-    private Object source;
-
-    private IPath destinationPath;
-
-    private IContainer destinationContainer;
-
-    private List selectedFiles;
-
-    private List rejectedFiles;
-
-    private IImportStructureProvider provider;
-
-    private IProgressMonitor monitor;
-
-    protected IOverwriteQuery overwriteCallback;
-
-    private Shell context;
-
-    private List errorTable = new ArrayList();
-
-    private boolean createContainerStructure = true;
-
-    //The constants for the overwrite 3 state
-    private static final int OVERWRITE_NOT_SET = 0;
-
-    private static final int OVERWRITE_NONE = 1;
-
-    private static final int OVERWRITE_ALL = 2;
-
-    private int overwriteState = OVERWRITE_NOT_SET;
-
-    /**
-     * Creates a new operation that recursively imports the entire contents of the
-     * specified root file system object.
-     * <p>
-     * The <code>source</code> parameter represents the root file system object to 
-     * import. All contents of this object are imported. Valid types for this parameter
-     * are determined by the supplied <code>IImportStructureProvider</code>.
-     * </p>
-     * <p>
-     * The <code>provider</code> parameter allows this operation to deal with the
-     * source object in an abstract way. This operation calls methods on the provider
-     * and the provider in turn calls specific methods on the source object.
-     * </p>
-     *  <p>
-     * The default import behavior is to recreate the complete container structure
-     * for the contents of the root file system object in their destination. 
-     * If <code>setCreateContainerStructure</code> is set to false then the container 
-     * structure created is relative to the root file system object.
-     * </p>
-     * 
-     * @param containerPath the full path of the destination container within the
-     *   workspace
-     * @param source the root file system object to import
-     * @param provider the file system structure provider to use
-     * @param overwriteImplementor the overwrite strategy to use
-     */
-    public ImportOperation(IPath containerPath, Object source,
-            IImportStructureProvider provider,
-            IOverwriteQuery overwriteImplementor) {
-        super();
-        this.destinationPath = containerPath;
-        this.source = source;
-        this.provider = provider;
-        overwriteCallback = overwriteImplementor;
-    }
-
-    /**
-     * Creates a new operation that imports specific file system objects.
-     * In this usage context, the specified source file system object is used by the
-     * operation solely to determine the destination container structure of the file system
-     * objects being imported.
-     * <p>
-     * The <code>source</code> parameter represents the root file system object to 
-     * import. Valid types for this parameter are determined by the supplied 
-     * <code>IImportStructureProvider</code>. The contents of the source which
-     * are to be imported are specified in the <code>filesToImport</code>
-     * parameter.
-     * </p>
-     * <p>
-     * The <code>provider</code> parameter allows this operation to deal with the
-     * source object in an abstract way. This operation calls methods on the provider
-     * and the provider in turn calls specific methods on the source object.
-     * </p>
-     * <p>
-     * The <code>filesToImport</code> parameter specifies what contents of the root
-     * file system object are to be imported.
-     * </p>
-     * <p>
-     * The default import behavior is to recreate the complete container structure
-     * for the file system objects in their destination. If <code>setCreateContainerStructure</code>
-     * is set to <code>false</code>, then the container structure created for each of 
-     * the file system objects is relative to the supplied root file system object.
-     * </p>
-     *
-     * @param containerPath the full path of the destination container within the
-     *   workspace
-     * @param source the root file system object to import from
-     * @param provider the file system structure provider to use
-     * @param overwriteImplementor the overwrite strategy to use
-     * @param filesToImport the list of file system objects to be imported
-     *  (element type: <code>Object</code>)
-     */
-    public ImportOperation(IPath containerPath, Object source,
-            IImportStructureProvider provider,
-            IOverwriteQuery overwriteImplementor, List filesToImport) {
-        this(containerPath, source, provider, overwriteImplementor);
-        setFilesToImport(filesToImport);
-    }
-
-    /**
-     * Creates a new operation that imports specific file system objects.
-     * <p>
-     * The <code>provider</code> parameter allows this operation to deal with the
-     * source object in an abstract way. This operation calls methods on the provider
-     * and the provider in turn calls specific methods on the source object.
-     * </p>
-     * <p>
-     * The <code>filesToImport</code> parameter specifies what file system objects 
-     * are to be imported.
-     * </p>
-     * <p>
-     * The default import behavior is to recreate the complete container structure
-     * for the file system objects in their destination. If <code>setCreateContainerStructure</code>
-     * is set to <code>false</code>, then no container structure is created for each of 
-     * the file system objects.
-     * </p>
-     *
-     * @param containerPath the full path of the destination container within the
-     *   workspace
-     * @param provider the file system structure provider to use
-     * @param overwriteImplementor the overwrite strategy to use
-     * @param filesToImport the list of file system objects to be imported
-     *  (element type: <code>Object</code>)
-     */
-    public ImportOperation(IPath containerPath,
-            IImportStructureProvider provider,
-            IOverwriteQuery overwriteImplementor, List filesToImport) {
-        this(containerPath, null, provider, overwriteImplementor);
-        setFilesToImport(filesToImport);
-    }
-
-    /**
-     * Prompts if existing resources should be overwritten. Recursively collects
-     * existing read-only files to overwrite and resources that should not be
-     * overwritten.
-     * 
-     * @param sourceStart destination path to check for existing files
-     * @param sources file system objects that may exist in the destination
-     * @param noOverwrite files that were selected to be skipped (don't overwrite).
-     * 	object type IPath
-     * @param overwriteReadonly the collected existing read-only files to overwrite.
-     * 	object type IPath
-     * @param policy on of the POLICY constants defined in the
-     * class.
-     */
-    void collectExistingReadonlyFiles(IPath sourceStart, List sources,
-            ArrayList noOverwrite, ArrayList overwriteReadonly, int policy) {
-        IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-        Iterator sourceIter = sources.iterator();
-        IPath sourceRootPath = null;
-
-        if (this.source != null) {
-            sourceRootPath = new Path(provider.getFullPath(this.source));
-        }
-        while (sourceIter.hasNext()) {
-            Object nextSource = sourceIter.next();
-            IPath sourcePath = new Path(provider.getFullPath(nextSource));
-            IPath newDestinationPath;
-            IResource newDestination;
-
-            if (sourceRootPath == null) {
-                newDestinationPath = sourceStart.append(provider
-                        .getLabel(nextSource));
-            } else {
-                int prefixLength = sourcePath
-                        .matchingFirstSegments(sourceRootPath);
-                IPath relativeSourcePath = sourcePath
-                        .removeFirstSegments(prefixLength);
-                newDestinationPath = this.destinationPath
-                        .append(relativeSourcePath);
-            }
-            newDestination = workspaceRoot.findMember(newDestinationPath);
-            if (newDestination == null) {
-				continue;
-			}
-
-            IFolder folder = getFolder(newDestination);
-            if (folder != null) {
-                if (policy != POLICY_FORCE_OVERWRITE) {
-                    if (this.overwriteState == OVERWRITE_NONE
-                            || !queryOverwrite(newDestinationPath)) {
-                        noOverwrite.add(folder);
-                        continue;
-                    }
-                }
-                if (provider.isFolder(nextSource)) {
-					collectExistingReadonlyFiles(newDestinationPath, provider
-                            .getChildren(nextSource), noOverwrite,
-                            overwriteReadonly, POLICY_FORCE_OVERWRITE);
-				}
-            } else {
-                IFile file = getFile(newDestination);
-
-                if (file != null) {
-                    if (!queryOverwriteFile(file, policy)) {
-						noOverwrite.add(file.getFullPath());
-					} else if (file.isReadOnly()) {
-						overwriteReadonly.add(file);
-					}
-                }
-            }
-        }
-    }
-
-    /**
-     * Creates the folders that appear in the specified resource path.
-     * These folders are created relative to the destination container.
-     *
-     * @param path the relative path of the resource
-     * @return the container resource coresponding to the given path
-     * @exception CoreException if this method failed
-     */
-    IContainer createContainersFor(IPath path) throws CoreException {
-
-        IContainer currentFolder = destinationContainer;
-
-        int segmentCount = path.segmentCount();
-
-        //No containers to create
-        if (segmentCount == 0) {
-			return currentFolder;
-		}
-
-        //Needs to be handles differently at the root
-        if (currentFolder.getType() == IResource.ROOT) {
-			return createFromRoot(path);
-		}
-
-        for (int i = 0; i < segmentCount; i++) {
-            currentFolder = currentFolder.getFolder(new Path(path.segment(i)));
-            if (!currentFolder.exists()) {
-				((IFolder) currentFolder).create(false, true, null);
-			}
-        }
-
-        return currentFolder;
-    }
-
-    /**
-     * Creates the folders that appear in the specified resource path
-     * assuming that the destinationContainer begins at the root. Do not create projects.
-     *
-     * @param path the relative path of the resource
-     * @return the container resource coresponding to the given path
-     * @exception CoreException if this method failed
-     */
-    private IContainer createFromRoot(IPath path) throws CoreException {
-
-        int segmentCount = path.segmentCount();
-
-        //Assume the project exists 
-        IContainer currentFolder = ((IWorkspaceRoot) destinationContainer)
-                .getProject(path.segment(0));
-
-        for (int i = 1; i < segmentCount; i++) {
-            currentFolder = currentFolder.getFolder(new Path(path.segment(i)));
-            if (!currentFolder.exists()) {
-				((IFolder) currentFolder).create(false, true, null);
-			}
-        }
-
-        return currentFolder;
-    }
-
-    /**
-     * Deletes the given resource. If the resource fails to be deleted, adds a
-     * status object to the list to be returned by <code>getResult</code>.
-     *
-     * @param resource the resource
-     */
-    void deleteResource(IResource resource) {
-        try {
-            resource.delete(IResource.KEEP_HISTORY, null);
-        } catch (CoreException e) {
-            errorTable.add(e.getStatus());
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkbenchModifyOperation.
-     * Imports the specified file system objects from the file system.
-     */
-    protected void execute(IProgressMonitor progressMonitor) {
-
-        monitor = progressMonitor;
-
-        try {
-            if (selectedFiles == null) {
-                //Set the amount to 1000 as we have no idea of how long this will take
-                monitor.beginTask(DataTransferMessages.DataTransfer_importTask, 1000);
-                ContainerGenerator generator = new ContainerGenerator(
-                        destinationPath);
-                monitor.worked(30);
-                validateFiles(Arrays.asList(new Object[] { source }));
-                monitor.worked(50);
-                destinationContainer = generator
-                        .generateContainer(new SubProgressMonitor(monitor, 50));
-                importRecursivelyFrom(source, POLICY_DEFAULT);
-                //Be sure it finishes
-                monitor.worked(90);
-            } else {
-                // Choose twice the selected files size to take folders into account
-                int creationCount = selectedFiles.size();
-                monitor.beginTask(DataTransferMessages.DataTransfer_importTask, creationCount + 100);
-                ContainerGenerator generator = new ContainerGenerator(
-                        destinationPath);
-                monitor.worked(30);
-                validateFiles(selectedFiles);
-                monitor.worked(50);
-                destinationContainer = generator
-                        .generateContainer(new SubProgressMonitor(monitor, 50));
-                importFileSystemObjects(selectedFiles);
-                monitor.done();
-            }
-        } catch (CoreException e) {
-            errorTable.add(e.getStatus());
-        } finally {
-            monitor.done();
-        }
-    }
-
-    /**
-     * Returns the container resource that the passed file system object should be
-     * imported into.
-     *
-     * @param fileSystemObject the file system object being imported
-     * @return the container resource that the passed file system object should be
-     *     imported into
-     * @exception CoreException if this method failed
-     */
-    IContainer getDestinationContainerFor(Object fileSystemObject)
-            throws CoreException {
-        IPath pathname = new Path(provider.getFullPath(fileSystemObject));
-
-        if (createContainerStructure) {
-			return createContainersFor(pathname.removeLastSegments(1));
-		}
-        if (source == fileSystemObject) {
-			return null;
-		}
-        IPath sourcePath = new Path(provider.getFullPath(source));
-        IPath destContainerPath = pathname.removeLastSegments(1);
-        IPath relativePath = destContainerPath.removeFirstSegments(
-                sourcePath.segmentCount()).setDevice(null);
-        return createContainersFor(relativePath);
-        
-    }
-
-    /**
-     * Returns the resource either casted to or adapted to an IFile. 
-     * 
-     * @param resource resource to cast/adapt
-     * @return the resource either casted to or adapted to an IFile.
-     * 	<code>null</code> if the resource does not adapt to IFile 
-     */
-    IFile getFile(IResource resource) {
-        if (resource instanceof IFile) {
-            return (IFile) resource;
-        }
-        Object adapted = ((IAdaptable) resource).getAdapter(IFile.class);
-        if(adapted == null) {
-			return null;
-		}
-        return (IFile) adapted;
-      
-    }
-
-    /**
-     * Returns the resource either casted to or adapted to an IFolder. 
-     * 
-     * @param resource resource to cast/adapt
-     * @return the resource either casted to or adapted to an IFolder.
-     * 	<code>null</code> if the resource does not adapt to IFolder 
-     */
-    IFolder getFolder(IResource resource) {
-        if (resource instanceof IFolder) {
-            return (IFolder) resource;
-        }
-        Object adapted = ((IAdaptable) resource).getAdapter(IFolder.class);
-        if(adapted == null) {
-			return null;
-		}
-        return (IFolder) adapted;
-    }
-
-    /**
-     * Returns the rejected files based on the given multi status.
-     *  
-     * @param multiStatus multi status to use to determine file rejection
-     * @param files source files
-     * @return list of rejected files as absolute paths. Object type IPath.
-     */
-    ArrayList getRejectedFiles(IStatus multiStatus, IFile[] files) {
-        ArrayList filteredFiles = new ArrayList();
-
-        IStatus[] status = multiStatus.getChildren();
-        for (int i = 0; i < status.length; i++) {
-            if (status[i].isOK() == false) {
-            	errorTable.add(status[i]);
-            	filteredFiles.add(files[i].getFullPath());
-            }
-        }
-        return filteredFiles;
-    }
-
-    /**
-     * Returns the status of the import operation.
-     * If there were any errors, the result is a status object containing
-     * individual status objects for each error.
-     * If there were no errors, the result is a status object with error code <code>OK</code>.
-     *
-     * @return the status
-     */
-    public IStatus getStatus() {
-        IStatus[] errors = new IStatus[errorTable.size()];
-        errorTable.toArray(errors);
-        return new MultiStatus(PlatformUI.PLUGIN_ID, IStatus.OK, errors,
-                DataTransferMessages.ImportOperation_importProblems,
-                null);
-    }
-
-    /**
-     * Imports the specified file system object into the workspace.
-     * If the import fails, adds a status object to the list to be returned by
-     * <code>getResult</code>.
-     *
-     * @param fileObject the file system object to be imported
-     * @param policy determines how the file object is imported
-     */
-    void importFile(Object fileObject, int policy) {
-        IContainer containerResource;
-        try {
-            containerResource = getDestinationContainerFor(fileObject);
-        } catch (CoreException e) {
-            IStatus coreStatus = e.getStatus();
-            String newMessage = NLS.bind(DataTransferMessages.ImportOperation_coreImportError, fileObject, coreStatus.getMessage());
-            IStatus status = new Status(coreStatus.getSeverity(), coreStatus
-                    .getPlugin(), coreStatus.getCode(), newMessage, null);
-            errorTable.add(status);
-            return;
-        }
-
-        String fileObjectPath = provider.getFullPath(fileObject);
-        monitor.subTask(fileObjectPath);
-        IFile targetResource = containerResource.getFile(new Path(provider
-                .getLabel(fileObject)));
-        monitor.worked(1);
-
-        if (rejectedFiles.contains(targetResource.getFullPath())) {
-			return;
-		}
-
-        // ensure that the source and target are not the same
-        IPath targetPath = targetResource.getLocation();
-        // Use Files for comparison to avoid platform specific case issues
-        if (targetPath != null
-                && (targetPath.toFile().equals(new File(fileObjectPath)))) {
-            errorTable.add(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0,
-                    NLS.bind(DataTransferMessages.ImportOperation_targetSameAsSourceError, fileObjectPath), null));
-            return;
-        }
-
-        InputStream contentStream = provider.getContents(fileObject);
-        if (contentStream == null) {
-            errorTable
-                    .add(new Status(
-                            IStatus.ERROR,
-                            PlatformUI.PLUGIN_ID,
-                            0,
-                            NLS.bind(DataTransferMessages.ImportOperation_openStreamError, fileObjectPath),
-                            null));
-            return;
-        }
-
-        try {
-            if (targetResource.exists()) {
-				targetResource.setContents(contentStream,
-                        IResource.KEEP_HISTORY, null);
-			} else {
-				targetResource.create(contentStream, false, null);
-			}
-            setResourceAttributes(targetResource,fileObject);
-            
-            if (provider instanceof TarLeveledStructureProvider) {
-            	try {
-            		targetResource.setResourceAttributes(((TarLeveledStructureProvider) provider).getResourceAttributes(fileObject));
-            	} catch (CoreException e) {
-            		errorTable.add(e.getStatus());
-            	}
-            }
-        } catch (CoreException e) {
-            errorTable.add(e.getStatus());
-        } finally {
-            try {
-                contentStream.close();
-            } catch (IOException e) {
-                errorTable
-                        .add(new Status(
-                                IStatus.ERROR,
-                                PlatformUI.PLUGIN_ID,
-                                0,
-                                NLS.bind(DataTransferMessages.ImportOperation_closeStreamError, fileObjectPath),
-                                e));
-            }
-        }
-    }
-
-    /**
-     * Reuse the file attributes set in the import.
-     * @param targetResource
-     * @param fileObject
-     */
-    private void setResourceAttributes(IFile targetResource, Object fileObject) {
-    	
-    	if(fileObject instanceof File) {
-			try {
-				targetResource.setResourceAttributes(ResourceAttributes.fromFile((File) fileObject));
-			} catch (CoreException e) {
-				//Inform the log that the attributes reading failed
-				IDEWorkbenchPlugin.log(e.getStatus().getMessage(), e);
-			}
-		}
-		
-	}
-
-	/**
-     * Imports the specified file system objects into the workspace.
-     * If the import fails, adds a status object to the list to be returned by
-     * <code>getStatus</code>.
-     *
-     * @param filesToImport the list of file system objects to import
-     *   (element type: <code>Object</code>)
-     * @exception OperationCanceledException if canceled
-     */
-    void importFileSystemObjects(List filesToImport) {
-        Iterator filesEnum = filesToImport.iterator();
-        while (filesEnum.hasNext()) {
-            Object fileSystemObject = filesEnum.next();
-            if (source == null) {
-                // We just import what we are given into the destination
-                IPath sourcePath = new Path(provider
-                        .getFullPath(fileSystemObject)).removeLastSegments(1);
-                if (provider.isFolder(fileSystemObject) && sourcePath.isEmpty()) {
-                    // If we don't have a parent then we have selected the
-                    // file systems root. Roots can't copied (at least not
-                    // under windows).
-                    errorTable.add(new Status(IStatus.INFO,
-                            PlatformUI.PLUGIN_ID, 0, DataTransferMessages.ImportOperation_cannotCopy,
-                            null));
-                    continue;
-                }
-                source = sourcePath.toFile();
-            }
-            importRecursivelyFrom(fileSystemObject, POLICY_DEFAULT);
-        }
-    }
-
-    /**
-     * Imports the specified file system container object into the workspace.
-     * If the import fails, adds a status object to the list to be returned by
-     * <code>getResult</code>.
-     *
-     * @param folderObject the file system container object to be imported
-     * @param policy determines how the folder object and children are imported
-     * @return the policy to use to import the folder's children
-     */
-    int importFolder(Object folderObject, int policy) {
-        IContainer containerResource;
-        try {
-            containerResource = getDestinationContainerFor(folderObject);
-        } catch (CoreException e) {
-            errorTable.add(e.getStatus());
-            return policy;
-        }
-
-        if (containerResource == null) {
-			return policy;
-		}
-
-        monitor.subTask(provider.getFullPath(folderObject));
-        IWorkspace workspace = destinationContainer.getWorkspace();
-        IPath containerPath = containerResource.getFullPath();
-        IPath resourcePath = containerPath.append(provider
-                .getLabel(folderObject));
-
-        // Do not attempt the import if the resource path is unchanged. This may happen
-        // when importing from a zip file.
-        if (resourcePath.equals(containerPath)) {
-			return policy;
-		}
-
-        if (workspace.getRoot().exists(resourcePath)) {
-            if (rejectedFiles.contains(resourcePath)) {
-				return POLICY_SKIP_CHILDREN;
-			}
-
-            return POLICY_FORCE_OVERWRITE;
-        }
-
-        try {
-            workspace.getRoot().getFolder(resourcePath).create(false, true,
-                    null);
-        } catch (CoreException e) {
-            errorTable.add(e.getStatus());
-        }
-
-        return policy;
-    }
-
-    /**
-     * Imports the specified file system object recursively into the workspace.
-     * If the import fails, adds a status object to the list to be returned by
-     * <code>getStatus</code>.
-     *
-     * @param fileSystemObject the file system object to be imported
-     * @param policy determines how the file system object and children are imported
-     * @exception OperationCanceledException if canceled
-     */
-    void importRecursivelyFrom(Object fileSystemObject, int policy) {
-        if (monitor.isCanceled()) {
-			throw new OperationCanceledException();
-		}
-
-        if (!provider.isFolder(fileSystemObject)) {
-            importFile(fileSystemObject, policy);
-            return;
-        }
-
-        int childPolicy = importFolder(fileSystemObject, policy);
-        if (childPolicy != POLICY_SKIP_CHILDREN) {
-            Iterator children = provider.getChildren(fileSystemObject)
-                    .iterator();
-            while (children.hasNext()) {
-				importRecursivelyFrom(children.next(), childPolicy);
-			}
-        }
-    }
-
-    /**
-     * Queries the user whether the resource with the specified path should be
-     * overwritten by a file system object that is being imported.
-     * 
-     * @param resourcePath the workspace path of the resource that needs to be overwritten
-     * @return <code>true</code> to overwrite, <code>false</code> to not overwrite
-     * @exception OperationCanceledException if canceled
-     */
-    boolean queryOverwrite(IPath resourcePath)
-            throws OperationCanceledException {
-        String overwriteAnswer = overwriteCallback.queryOverwrite(resourcePath
-                .makeRelative().toString());
-
-        if (overwriteAnswer.equals(IOverwriteQuery.CANCEL)) {
-			throw new OperationCanceledException(DataTransferMessages.DataTransfer_emptyString);
-		}
-
-        if (overwriteAnswer.equals(IOverwriteQuery.NO)) {
-            return false;
-        }
-
-        if (overwriteAnswer.equals(IOverwriteQuery.NO_ALL)) {
-            this.overwriteState = OVERWRITE_NONE;
-            return false;
-        }
-
-        if (overwriteAnswer.equals(IOverwriteQuery.ALL)) {
-			this.overwriteState = OVERWRITE_ALL;
-		}
-
-        return true;
-    }
-
-    /**
-     * Returns whether the given file should be overwritten.
-     *
-     * @param targetFile the file to ask to overwrite 
-     * @param policy determines if the user is queried for overwrite 
-     * @return <code>true</code> if the file should be overwritten, and
-     * 	<code>false</code> if not.
-     */
-    boolean queryOverwriteFile(IFile targetFile, int policy) {
-        //If force overwrite is on don't bother
-        if (policy != POLICY_FORCE_OVERWRITE) {
-            if (this.overwriteState == OVERWRITE_NOT_SET
-                    && !queryOverwrite(targetFile.getFullPath())) {
-				return false;
-			}
-            if (this.overwriteState == OVERWRITE_NONE) {
-				return false;
-			}
-        }
-        return true;
-    }
-
-    /**
-     * Sets the context for use by the VCM provider to prompt the user
-     * for check-out of files.
-     * 
-     * @param shell context for use by the VCM provider to prompt user
-     * 	for check-out. The user will not be prompted if set to <code>null</code>.
-     * @see IWorkspace#validateEdit(org.eclipse.core.resources.IFile[], java.lang.Object)
-     * @since 2.1
-     */
-    public void setContext(Shell shell) {
-        context = shell;
-    }
-
-    /**
-     * Sets whether the containment structures that are implied from the full paths
-     * of file system objects being imported should be duplicated in the workbench.
-     *
-     * @param value <code>true</code> if containers should be created, and
-     *  <code>false</code> otherwise
-     */
-    public void setCreateContainerStructure(boolean value) {
-        createContainerStructure = value;
-    }
-
-    /**
-     * Sets the file system objects to import.
-     *
-     * @param filesToImport the list of file system objects to be imported
-     *   (element type: <code>Object</code>)
-     */
-    public void setFilesToImport(List filesToImport) {
-        this.selectedFiles = filesToImport;
-    }
-
-    /**
-     * Sets whether imported file system objects should automatically overwrite
-     * existing workbench resources when a conflict occurs.
-     *
-     * @param value <code>true</code> to automatically overwrite, and 
-     *   <code>false</code> otherwise
-     */
-    public void setOverwriteResources(boolean value) {
-        if (value) {
-			this.overwriteState = OVERWRITE_ALL;
-		}
-    }
-
-    /**
-     * Validates that the given source resources can be copied to the 
-     * destination as decided by the VCM provider.
-     * 
-     * @param existingFiles existing files to validate
-     * @return list of rejected files as absolute paths. Object type IPath.
-     */
-    ArrayList validateEdit(List existingFiles) {
-       
-        if (existingFiles.size() > 0) {
-            IFile[] files = (IFile[]) existingFiles
-                    .toArray(new IFile[existingFiles.size()]);
-            IWorkspace workspace = ResourcesPlugin.getWorkspace();
-            IStatus status = workspace.validateEdit(files, context);
-
-            //If there was a mix return the bad ones
-            if (status.isMultiStatus()) {
-				return getRejectedFiles(status, files);
-			}
-            
-           if(!status.isOK()){
-           		//If just a single status reject them all
-           		errorTable.add(status);
-           		ArrayList filteredFiles = new ArrayList();
-
-           		for (int i = 0; i < files.length; i++) {
-           			filteredFiles.add(files[i].getFullPath());
-           		}
-           		return filteredFiles;
-           }
-            
-        }
-        return new ArrayList();
-    }
-
-    /**
-     * Validates the given file system objects.
-     * The user is prompted to overwrite existing files.
-     * Existing read-only files are validated with the VCM provider.
-     * 
-     * @param sourceFiles files to validate
-     */
-    void validateFiles(List sourceFiles) {
-        ArrayList noOverwrite = new ArrayList();
-        ArrayList overwriteReadonly = new ArrayList();
-
-        collectExistingReadonlyFiles(destinationPath, sourceFiles, noOverwrite,
-                overwriteReadonly, POLICY_DEFAULT);
-        rejectedFiles = validateEdit(overwriteReadonly);
-        rejectedFiles.addAll(noOverwrite);
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/PopulateRootOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/PopulateRootOperation.java
deleted file mode 100644
index 5d93f85..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/PopulateRootOperation.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.wizards.datatransfer;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.operation.ModalContext;
-import org.eclipse.ui.dialogs.FileSystemElement;
-import org.eclipse.ui.internal.wizards.datatransfer.MinimizedFileSystemElement;
-
-/**
- * The PopulateFilesOperation is an operation used to populate a FileSystemElement one
- * level deep rather than the whole way.
- */
-public class PopulateRootOperation extends SelectFilesOperation {
-    /**
-     * Create a new <code>PopulateFilesOperation</code>.
-     * @param rootObject the object to be populated
-     * @param structureProvider the object that defines how we are to populate it.
-     */
-    public PopulateRootOperation(Object rootObject,
-            IImportStructureProvider structureProvider) {
-        super(rootObject, structureProvider);
-    }
-
-    /**
-     * Creates and returns a <code>FileSystemElement</code> if the specified
-     * file system object merits one.  The criteria for this are:
-     * - if the file system object is a container then it must have either a
-     *   child container or an associated file
-     * - if the file system object is a file then it must have an extension
-     *   suitable for selection
-     */
-    protected FileSystemElement createElement(FileSystemElement parent,
-            Object fileSystemObject) throws InterruptedException {
-
-        //Iterate on level deep
-        return createElement(parent, fileSystemObject, 2);
-
-    }
-
-    /**
-     * Creates and returns a <code>FileSystemElement</code> if the specified
-     * file system object merits one.  The criteria for this are:
-     * - if the file system object is a container then it must have either a
-     *   child container or an associated file
-     * - if the file system object is a file then it must have an extension
-     *   suitable for selection
-     * 	recurse down for depth to populate children
-     */
-    protected FileSystemElement createElement(FileSystemElement parent,
-            Object fileSystemObject, int depth) throws InterruptedException {
-        ModalContext.checkCanceled(monitor);
-        boolean isContainer = provider.isFolder(fileSystemObject);
-        String elementLabel = parent == null ? provider
-                .getFullPath(fileSystemObject) : provider
-                .getLabel(fileSystemObject);
-
-        MinimizedFileSystemElement result = new MinimizedFileSystemElement(
-                elementLabel, parent, isContainer);
-        result.setFileSystemObject(fileSystemObject);
-
-        if (isContainer) {
-            if (depth > 0) {
-                List children = provider.getChildren(fileSystemObject);
-                if (children == null) {
-					children = new ArrayList(1);
-				}
-                Iterator childrenEnum = children.iterator();
-                while (childrenEnum.hasNext()) {
-                    createElement(result, childrenEnum.next(), depth - 1);
-                }
-                result.setPopulated();
-            }
-
-        }
-
-        return result;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/SelectFilesOperation.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/SelectFilesOperation.java
deleted file mode 100644
index 309d926..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/SelectFilesOperation.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.wizards.datatransfer;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.operation.ModalContext;
-import org.eclipse.ui.dialogs.FileSystemElement;
-import org.eclipse.ui.internal.wizards.datatransfer.DataTransferMessages;
-
-/**
- *	Operation responsible for traversing a specified file system position
- *	recursively and building
- *	-	a tree that represents the container structure
- *	-	a collection containing all files meeting a specified extension criteria
- *
- *	This is implemented as an Operation in order to provide an escape to the user
- *	(the Cancel button) if the operation drags on for too long
- */
-public class SelectFilesOperation implements IRunnableWithProgress {
-    IProgressMonitor monitor;
-
-    Object root;
-
-    IImportStructureProvider provider;
-
-    String desiredExtensions[];
-
-    FileSystemElement result;
-
-    /**
-     * Creates a new <code>SelectFilesOperation</code>.
-     */
-    public SelectFilesOperation(Object rootObject,
-            IImportStructureProvider structureProvider) {
-        super();
-        root = rootObject;
-        provider = structureProvider;
-    }
-
-    /**
-     * Creates and returns a <code>FileSystemElement</code> if the specified
-     * file system object merits one.  The criteria for this are:
-     * - if the file system object is a container then it must have either a
-     *   child container or an associated file
-     * - if the file system object is a file then it must have an extension
-     *   suitable for selection
-     */
-    protected FileSystemElement createElement(FileSystemElement parent,
-            Object fileSystemObject) throws InterruptedException {
-        ModalContext.checkCanceled(monitor);
-        boolean isContainer = provider.isFolder(fileSystemObject);
-        String elementLabel = parent == null ? provider
-                .getFullPath(fileSystemObject) : provider
-                .getLabel(fileSystemObject);
-
-        if (!isContainer && !hasDesiredExtension(elementLabel)) {
-			return null;
-		}
-
-        FileSystemElement result = new FileSystemElement(elementLabel, parent,
-                isContainer);
-        result.setFileSystemObject(fileSystemObject);
-
-        if (isContainer) {
-            boolean haveChildOrFile = false;
-            List children = provider.getChildren(fileSystemObject);
-            if (children == null) {
-				children = new ArrayList(1);
-			}
-            Iterator childrenEnum = children.iterator();
-            while (childrenEnum.hasNext()) {
-                if (createElement(result, childrenEnum.next()) != null) {
-					haveChildOrFile = true;
-				}
-            }
-
-            if (!haveChildOrFile && parent != null) {
-                parent.removeFolder(result);
-                result = null;
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Returns the extension portion of the passed filename string.
-     */
-    protected String getExtensionFor(String filename) {
-        int nIndex = filename.lastIndexOf('.');
-
-        if (nIndex >= 0) {
-			return filename.substring(nIndex + 1);
-		}
-
-        return "";//$NON-NLS-1$
-
-    }
-
-    /**
-     * Returns the resulting root file system element.
-     */
-    public FileSystemElement getResult() {
-        return result;
-    }
-
-    /**
-     * Returns a boolean indicating whether the extension of the passed filename
-     * is one of the extensions specified as desired by the filter.
-     */
-    protected boolean hasDesiredExtension(String filename) {
-        if (desiredExtensions == null) {
-			return true;
-		}
-
-        int extensionsSize = desiredExtensions.length;
-        for (int i = 0; i < extensionsSize; i++) {
-            if (getExtensionFor(filename)
-                    .equalsIgnoreCase(desiredExtensions[i])) {
-				return true;
-			}
-        }
-
-        return false;
-    }
-
-    /**
-     * Runs the operation.
-     */
-    public void run(IProgressMonitor monitor) throws InterruptedException {
-        try {
-            this.monitor = monitor;
-            monitor.beginTask(DataTransferMessages.DataTransfer_scanningMatching, IProgressMonitor.UNKNOWN);
-            result = createElement(null, root);
-            if (result == null) {
-                result = new FileSystemElement(provider.getLabel(root), null,
-                        provider.isFolder(root));
-                result.setFileSystemObject(root);
-            }
-        } finally {
-            monitor.done();
-        }
-    }
-
-    /**
-     * Sets the file extensions which are desired.  A value of <code>null</code>
-     * indicates that all files should be kept regardless of extension.
-     */
-    public void setDesiredExtensions(String[] extensions) {
-        desiredExtensions = extensions;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/WizardExternalProjectImportPage.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/WizardExternalProjectImportPage.java
deleted file mode 100644
index db10033..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/WizardExternalProjectImportPage.java
+++ /dev/null
@@ -1,503 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.wizards.datatransfer;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceStatus;
-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.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.wizards.datatransfer.DataTransferMessages;
-
-/**
- * Standard main page for a wizard that creates a project resource from
- * whose location already contains a project.
- * <p>
- * This page may be used by clients as-is; it may be also be subclassed to suit.
- * </p>
- * <p>
- * Example usage:
- * <pre>
- * mainPage = new WizardExternalProjectImportPage("basicNewProjectPage");
- * mainPage.setTitle("Project");
- * mainPage.setDescription("Create a new project resource.");
- * </pre>
- * </p>
- */
-public class WizardExternalProjectImportPage extends WizardPage {
-
-    private FileFilter projectFilter = new FileFilter() {
-        //Only accept those files that are .project
-        public boolean accept(File pathName) {
-            return pathName.getName().equals(
-                    IProjectDescription.DESCRIPTION_FILE_NAME);
-        }
-    };
-
-    //Keep track of the directory that we browsed to last time
-    //the wizard was invoked.
-    private static String previouslyBrowsedDirectory = ""; //$NON-NLS-1$
-
-    // widgets
-    private Text projectNameField;
-
-    private Text locationPathField;
-
-    private Button browseButton;
-
-    private IProjectDescription description;
-
-    private Listener locationModifyListener = new Listener() {
-        public void handleEvent(Event e) {
-            setPageComplete(validatePage());
-        }
-    };
-
-    // constants
-    private static final int SIZING_TEXT_FIELD_WIDTH = 250;
-
-    /**
-     * Creates a new project creation wizard page.
-     *
-     */
-    public WizardExternalProjectImportPage() {
-        super("wizardExternalProjectPage"); //$NON-NLS-1$
-        setPageComplete(false);
-        setTitle(DataTransferMessages.WizardExternalProjectImportPage_title);
-        setDescription(DataTransferMessages.WizardExternalProjectImportPage_description);
-
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IDialogPage.
-     */
-    public void createControl(Composite parent) {
-
-        initializeDialogUnits(parent);
-
-        Composite composite = new Composite(parent, SWT.NULL);
-
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(composite,
-                IIDEHelpContextIds.NEW_PROJECT_WIZARD_PAGE);
-
-        composite.setLayout(new GridLayout());
-        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-        composite.setFont(parent.getFont());
-
-        createProjectNameGroup(composite);
-        createProjectLocationGroup(composite);
-        validatePage();
-        // Show description on opening
-        setErrorMessage(null);
-        setMessage(null);
-        setControl(composite);
-    }
-
-    /**
-     * Creates the project location specification controls.
-     *
-     * @param parent the parent composite
-     */
-    private final void createProjectLocationGroup(Composite parent) {
-
-        // project specification group
-        Composite projectGroup = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 3;
-        projectGroup.setLayout(layout);
-        projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        projectGroup.setFont(parent.getFont());
-
-        // new project label
-        Label projectContentsLabel = new Label(projectGroup, SWT.NONE);
-        projectContentsLabel.setText(DataTransferMessages.WizardExternalProjectImportPage_projectContentsLabel);
-        projectContentsLabel.setFont(parent.getFont());
-
-        createUserSpecifiedProjectLocationGroup(projectGroup);
-    }
-
-    /**
-     * Creates the project name specification controls.
-     *
-     * @param parent the parent composite
-     */
-    private final void createProjectNameGroup(Composite parent) {
-
-        Font dialogFont = parent.getFont();
-
-        // project specification group
-        Composite projectGroup = new Composite(parent, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        projectGroup.setFont(dialogFont);
-        projectGroup.setLayout(layout);
-        projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-        // new project label
-        Label projectLabel = new Label(projectGroup, SWT.NONE);
-        projectLabel.setText(DataTransferMessages.WizardExternalProjectImportPage_nameLabel);
-        projectLabel.setFont(dialogFont);
-
-        // new project name entry field
-        projectNameField = new Text(projectGroup, SWT.BORDER | SWT.READ_ONLY);
-        GridData data = new GridData(GridData.FILL_HORIZONTAL);
-        data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-        projectNameField.setLayoutData(data);
-        projectNameField.setFont(dialogFont);
-        projectNameField.setBackground(parent.getDisplay().getSystemColor(
-                SWT.COLOR_WIDGET_BACKGROUND));
-    }
-
-    /**
-     * Creates the project location specification controls.
-     *
-     * @param projectGroup the parent composite
-     */
-    private void createUserSpecifiedProjectLocationGroup(Composite projectGroup) {
-
-        Font dialogFont = projectGroup.getFont();
-
-        // project location entry field
-        this.locationPathField = new Text(projectGroup, SWT.BORDER);
-        GridData data = new GridData(GridData.FILL_HORIZONTAL);
-        data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-        this.locationPathField.setLayoutData(data);
-        this.locationPathField.setFont(dialogFont);
-
-        // browse button
-        this.browseButton = new Button(projectGroup, SWT.PUSH);
-        this.browseButton.setText(DataTransferMessages.DataTransfer_browse);
-        this.browseButton.setFont(dialogFont);
-        setButtonLayoutData(this.browseButton);
-
-        this.browseButton.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent event) {
-                handleLocationBrowseButtonPressed();
-            }
-        });
-
-        locationPathField.addListener(SWT.Modify, locationModifyListener);
-    }
-
-    /**
-     * Returns the current project location path as entered by 
-     * the user, or its anticipated initial value.
-     *
-     * @return the project location path, its anticipated initial value, or <code>null</code>
-     *   if no project location path is known
-     */
-    public IPath getLocationPath() {
-
-        return new Path(getProjectLocationFieldValue());
-    }
-
-    /**
-     * Creates a project resource handle for the current project name field value.
-     * <p>
-     * This method does not create the project resource; this is the responsibility
-     * of <code>IProject::create</code> invoked by the new project resource wizard.
-     * </p>
-     *
-     * @return the new project resource handle
-     */
-    public IProject getProjectHandle() {
-        return ResourcesPlugin.getWorkspace().getRoot().getProject(
-                getProjectName());
-    }
-
-    /**
-     * Returns the current project name as entered by the user, or its anticipated
-     * initial value.
-     *
-     * @return the project name, its anticipated initial value, or <code>null</code>
-     *   if no project name is known
-     */
-    public String getProjectName() {
-        return getProjectNameFieldValue();
-    }
-
-    /**
-     * Returns the value of the project name field
-     * with leading and trailing spaces removed.
-     * 
-     * @return the project name in the field
-     */
-    private String getProjectNameFieldValue() {
-        if (projectNameField == null) {
-			return ""; //$NON-NLS-1$
-		}
-
-        return projectNameField.getText().trim();
-    }
-
-    /**
-     * Returns the value of the project location field
-     * with leading and trailing spaces removed.
-     * 
-     * @return the project location directory in the field
-     */
-    private String getProjectLocationFieldValue() {
-        return locationPathField.getText().trim();
-    }
-
-    /**
-     *	Open an appropriate directory browser
-     */
-    private void handleLocationBrowseButtonPressed() {
-        DirectoryDialog dialog = new DirectoryDialog(locationPathField
-                .getShell());
-        dialog.setMessage(DataTransferMessages.WizardExternalProjectImportPage_directoryLabel);
-
-        String dirName = getProjectLocationFieldValue();
-        if (dirName.length() == 0) {
-			dirName = previouslyBrowsedDirectory;
-		}
-
-        if (dirName.length() == 0) {
-			dialog.setFilterPath(getWorkspace().getRoot().getLocation()
-                    .toOSString());
-		} else {
-            File path = new File(dirName);
-            if (path.exists()) {
-				dialog.setFilterPath(new Path(dirName).toOSString());
-			}
-        }
-
-        String selectedDirectory = dialog.open();
-        if (selectedDirectory != null) {
-            previouslyBrowsedDirectory = selectedDirectory;
-            locationPathField.setText(previouslyBrowsedDirectory);
-            setProjectName(projectFile(previouslyBrowsedDirectory));
-        }
-    }
-
-    /**
-     * Returns whether this page's controls currently all contain valid 
-     * values.
-     *
-     * @return <code>true</code> if all controls are valid, and
-     *   <code>false</code> if at least one is invalid
-     */
-    private boolean validatePage() {
-
-        String locationFieldContents = getProjectLocationFieldValue();
-
-        if (locationFieldContents.equals("")) { //$NON-NLS-1$
-            setErrorMessage(null);
-            setMessage(DataTransferMessages.WizardExternalProjectImportPage_projectLocationEmpty);
-            return false;
-        }
-
-        IPath path = new Path(""); //$NON-NLS-1$
-        if (!path.isValidPath(locationFieldContents)) {
-            setErrorMessage(DataTransferMessages.WizardExternalProjectImportPage_locationError);
-            return false;
-        }
-
-        File projectFile = projectFile(locationFieldContents);
-        if (projectFile == null) {
-            setErrorMessage(NLS.bind(DataTransferMessages.WizardExternalProjectImportPage_notAProject, locationFieldContents));
-            return false;
-        }
-        setProjectName(projectFile);
-
-        if (getProjectHandle().exists()) {
-            setErrorMessage(DataTransferMessages.WizardExternalProjectImportPage_projectExistsMessage);
-            return false;
-        }
-
-        setErrorMessage(null);
-        setMessage(null);
-        return true;
-    }
-
-    private IWorkspace getWorkspace() {
-        IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace();
-        return workspace;
-    }
-
-    /**
-     * Return whether or not the specifed location is a prefix
-     * of the root.
-     */
-    private boolean isPrefixOfRoot(IPath locationPath) {
-        return Platform.getLocation().isPrefixOf(locationPath);
-    }
-
-    /**
-     * Set the project name using either the name of the
-     * parent of the file or the name entry in the xml for 
-     * the file
-     */
-    private void setProjectName(File projectFile) {
-
-        //If there is no file or the user has already specified forget it
-        if (projectFile == null) {
-			return;
-		}
-
-        IPath path = new Path(projectFile.getPath());
-
-        IProjectDescription newDescription = null;
-
-        try {
-            newDescription = getWorkspace().loadProjectDescription(path);
-        } catch (CoreException exception) {
-            //no good couldn't get the name
-        }
-
-        if (newDescription == null) {
-            this.description = null;
-            this.projectNameField.setText(""); //$NON-NLS-1$
-        } else {
-            this.description = newDescription;
-            this.projectNameField.setText(this.description.getName());
-        }
-    }
-
-    /**
-     * Return a.project file from the specified location.
-     * If there isn't one return null.
-     */
-    private File projectFile(String locationFieldContents) {
-        File directory = new File(locationFieldContents);
-        if (directory.isFile()) {
-			return null;
-		}
-
-        File[] files = directory.listFiles(this.projectFilter);
-        if (files != null && files.length == 1) {
-			return files[0];
-		}
-
-        return null;
-    }
-
-    /**
-     * Creates a new project resource with the selected name.
-     * <p>
-     * In normal usage, this method is invoked after the user has pressed Finish on
-     * the wizard; the enablement of the Finish button implies that all controls
-     * on the pages currently contain valid values.
-     * </p>
-     *
-     * @return the created project resource, or <code>null</code> if the project
-     *    was not created
-     */
-    IProject createExistingProject() {
-
-        String projectName = projectNameField.getText();
-        final IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        final IProject project = workspace.getRoot().getProject(projectName);
-        if (this.description == null) {
-            this.description = workspace.newProjectDescription(projectName);
-            IPath locationPath = getLocationPath();
-            //If it is under the root use the default location
-            if (isPrefixOfRoot(locationPath)) {
-				this.description.setLocation(null);
-			} else {
-				this.description.setLocation(locationPath);
-			}
-        } else {
-			this.description.setName(projectName);
-		}
-
-        // create the new project operation
-        WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
-            protected void execute(IProgressMonitor monitor)
-                    throws CoreException {
-                monitor.beginTask("", 2000); //$NON-NLS-1$
-                project.create(description, new SubProgressMonitor(monitor,
-                        1000));
-                if (monitor.isCanceled()) {
-					throw new OperationCanceledException();
-				}
-                project.open(IResource.BACKGROUND_REFRESH, new SubProgressMonitor(monitor, 1000));
-
-            }
-        };
-
-        // run the new project creation operation
-        try {
-            getContainer().run(true, true, op);
-        } catch (InterruptedException e) {
-            return null;
-        } catch (InvocationTargetException e) {
-            // ie.- one of the steps resulted in a core exception	
-            Throwable t = e.getTargetException();
-            if (t instanceof CoreException) {
-                if (((CoreException) t).getStatus().getCode() == IResourceStatus.CASE_VARIANT_EXISTS) {
-                    MessageDialog
-                            .openError(
-                                    getShell(),
-                                    DataTransferMessages.WizardExternalProjectImportPage_errorMessage,
-                                    NLS.bind(
-                                    		DataTransferMessages.WizardExternalProjectImportPage_caseVariantExistsError,
-                                    		projectName)
-                            );
-                } else {
-                    ErrorDialog
-                            .openError(
-                                    getShell(),
-                                    DataTransferMessages.WizardExternalProjectImportPage_errorMessage,
-                                    null, ((CoreException) t).getStatus());
-                }
-            }
-            return null;
-        }
-
-        return project;
-    }
-
-    /*
-     * see @DialogPage.setVisible(boolean)
-     */
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        if (visible) {
-			this.locationPathField.setFocus();
-		}
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/ZipFileExportWizard.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/ZipFileExportWizard.java
deleted file mode 100644
index 91ca0e2..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/ZipFileExportWizard.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.wizards.datatransfer;
-
-import java.util.List;
-
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.IExportWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.wizards.datatransfer.DataTransferMessages;
-import org.eclipse.ui.internal.wizards.datatransfer.WizardArchiveFileResourceExportPage1;
-
-/**
- * Standard workbench wizard for exporting resources from the workspace
- * to a zip file.
- * <p>
- * This class may be instantiated and used without further configuration;
- * this class is not intended to be subclassed.
- * </p>
- * <p>
- * Example:
- * <pre>
- * IWizard wizard = new ZipFileExportWizard();
- * wizard.init(workbench, selection);
- * WizardDialog dialog = new WizardDialog(shell, wizard);
- * dialog.open();
- * </pre>
- * During the call to <code>open</code>, the wizard dialog is presented to the
- * user. When the user hits Finish, the user-selected workspace resources 
- * are exported to the user-specified zip file, the dialog closes, and the call
- * to <code>open</code> returns.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ZipFileExportWizard extends Wizard implements IExportWizard {
-    private IStructuredSelection selection;
-
-    private WizardArchiveFileResourceExportPage1 mainPage;
-
-    /**
-     * Creates a wizard for exporting workspace resources to a zip file.
-     */
-    public ZipFileExportWizard() {
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault().getDialogSettings();
-        IDialogSettings section = workbenchSettings
-                .getSection("ZipFileExportWizard");//$NON-NLS-1$
-        if (section == null) {
-			section = workbenchSettings.addNewSection("ZipFileExportWizard");//$NON-NLS-1$
-		}
-        setDialogSettings(section);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizard.
-     */
-    public void addPages() {
-        super.addPages();
-        mainPage = new WizardArchiveFileResourceExportPage1(selection);
-        addPage(mainPage);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchWizard.
-     */
-    public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
-        this.selection = currentSelection;
-        List selectedResources = IDE.computeSelectedResources(currentSelection);
-        if (!selectedResources.isEmpty()) {
-            this.selection = new StructuredSelection(selectedResources);
-        }
-
-        setWindowTitle(DataTransferMessages.DataTransfer_export);
-        setDefaultPageImageDescriptor(IDEWorkbenchPlugin.getIDEImageDescriptor("wizban/exportzip_wiz.png"));//$NON-NLS-1$
-        setNeedsProgressMonitor(true);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizard.
-     */
-    public boolean performFinish() {
-        return mainPage.finish();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/ZipFileImportWizard.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/ZipFileImportWizard.java
deleted file mode 100644
index 6e77ff6..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/ZipFileImportWizard.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *       Oliver Schaefer <oliver.schaefer@mbtech-services.com> - Fix for
- *     		 Bug 221649 [Import/Export] ZipFileImportWizard has no option to change the FILE_IMPORT_MASK
- *******************************************************************************/
-package org.eclipse.ui.wizards.datatransfer;
-
-import java.util.List;
-
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.IImportWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.wizards.datatransfer.DataTransferMessages;
-import org.eclipse.ui.internal.wizards.datatransfer.WizardArchiveFileResourceImportPage1;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * Standard workbench wizard for importing resources from a zip file into the
- * workspace.
- * <p>
- * This class may be instantiated and used without further configuration; this
- * class is not intended to be subclassed.
- * </p>
- * <p>
- * Example:
- * 
- * <pre>
- * IWizard wizard = new ZipFileImportWizard();
- * wizard.init(workbench, selection);
- * WizardDialog dialog = new WizardDialog(shell, wizard);
- * dialog.open();
- * </pre>
- * 
- * During the call to <code>open</code>, the wizard dialog is presented to
- * the user. When the user hits Finish, the user-selected zip file is imported
- * into the workspace, the dialog closes, and the call to <code>open</code>
- * returns.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ZipFileImportWizard extends Wizard implements IImportWizard {
-	private IWorkbench workbench;
-
-	private IStructuredSelection selection;
-
-	private WizardArchiveFileResourceImportPage1 mainPage;
-
-	/**
-	 * Creates a wizard for importing resources into the workspace from a zip
-	 * file.
-	 */
-	public ZipFileImportWizard() {
-		AbstractUIPlugin plugin = WorkbenchPlugin.getDefault();
-		IDialogSettings workbenchSettings = plugin.getDialogSettings();
-		IDialogSettings section = workbenchSettings
-				.getSection("ZipFileImportWizard");//$NON-NLS-1$
-		if (section == null) {
-			section = workbenchSettings.addNewSection("ZipFileImportWizard");//$NON-NLS-1$
-		}
-		setDialogSettings(section);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IWizard.
-	 */
-	public void addPages() {
-		super.addPages();
-		mainPage = new WizardArchiveFileResourceImportPage1(workbench,
-				selection, getFileImportMask());
-		addPage(mainPage);
-	}
-
-	/**
-	 * Get the file import mask used by the receiver. By default use null so
-	 * that there is no mask.
-	 * 
-	 * @return String[] or <code>null</code>
-	 * @since 3.4
-	 */
-	protected String[] getFileImportMask() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IWorkbenchWizard.
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
-		this.workbench = workbench;
-		this.selection = currentSelection;
-		List selectedResources = IDE.computeSelectedResources(currentSelection);
-		if (!selectedResources.isEmpty()) {
-			this.selection = new StructuredSelection(selectedResources);
-		}
-
-		setWindowTitle(DataTransferMessages.DataTransfer_importTitle);
-		setDefaultPageImageDescriptor(IDEWorkbenchPlugin
-				.getIDEImageDescriptor("wizban/importzip_wiz.png"));//$NON-NLS-1$
-		setNeedsProgressMonitor(true);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IWizard.
-	 */
-	public boolean performCancel() {
-		return mainPage.cancel();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IWizard.
-	 */
-	public boolean performFinish() {
-		return mainPage.finish();
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/ZipFileStructureProvider.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/ZipFileStructureProvider.java
deleted file mode 100644
index 05d5e6e..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/ZipFileStructureProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.wizards.datatransfer;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-
-/**
- * This class provides information regarding the context structure and
- * content of specified zip file entry objects.
- */
-public class ZipFileStructureProvider implements IImportStructureProvider {
-    private ZipFile zipFile;
-
-    private ZipEntry root = new ZipEntry("/");//$NON-NLS-1$
-
-    private Map children;
-
-    private Map directoryEntryCache = new HashMap();
-
-    /**
-     * Creates a <code>ZipFileStructureProvider</code>, which will operate
-     * on the passed zip file.
-     * 
-     * @param sourceFile the zip file used to create this structure provider
-     */
-    public ZipFileStructureProvider(ZipFile sourceFile) {
-        super();
-        zipFile = sourceFile;
-    }
-
-    /**
-     * Adds the specified child to the internal collection of the parent's children.
-     */
-    protected void addToChildren(ZipEntry parent, ZipEntry child) {
-        List childList = (List) children.get(parent);
-        if (childList == null) {
-            childList = new ArrayList();
-            children.put(parent, childList);
-        }
-
-        childList.add(child);
-    }
-
-    /**
-     * Creates a new container zip entry with the specified name, iff
-     * it has not already been created.
-     */
-    protected void createContainer(IPath pathname) {
-        if (directoryEntryCache.containsKey(pathname)) {
-			return;
-		}
-
-        ZipEntry parent;
-        if (pathname.segmentCount() == 1) {
-			parent = root;
-		} else {
-			parent = (ZipEntry) directoryEntryCache.get(pathname
-                    .removeLastSegments(1));
-		}
-
-        ZipEntry newEntry = new ZipEntry(pathname.toString());
-        directoryEntryCache.put(pathname, newEntry);
-        addToChildren(parent, newEntry);
-    }
-
-    /**
-     * Creates a new file zip entry with the specified name.
-     */
-    protected void createFile(ZipEntry entry) {
-        IPath pathname = new Path(entry.getName());
-        ZipEntry parent;
-        if (pathname.segmentCount() == 1) {
-			parent = root;
-		} else {
-			parent = (ZipEntry) directoryEntryCache.get(pathname
-                    .removeLastSegments(1));
-		}
-
-        addToChildren(parent, entry);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IImportStructureProvider
-     */
-    public List getChildren(Object element) {
-        if (children == null) {
-			initialize();
-		}
-
-        return ((List) children.get(element));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IImportStructureProvider
-     */
-    public InputStream getContents(Object element) {
-        try {
-            return zipFile.getInputStream((ZipEntry) element);
-        } catch (IOException e) {
-        	IDEWorkbenchPlugin.log(e.getLocalizedMessage(), e);
-            return null;
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IImportStructureProvider
-     */
-    public String getFullPath(Object element) {
-        return ((ZipEntry) element).getName();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IImportStructureProvider
-     */
-    public String getLabel(Object element) {
-        if (element.equals(root)) {
-			return ((ZipEntry) element).getName();
-		}
-
-        return new Path(((ZipEntry) element).getName()).lastSegment();
-    }
-
-    /**
-     * Returns the entry that this importer uses as the root sentinel.
-     *
-     * @return java.util.zip.ZipEntry
-     */
-    public ZipEntry getRoot() {
-        return root;
-    }
-
-    /**
-     * Returns the zip file that this provider provides structure for.
-     * 
-     * @return the zip file this provider provides structure for
-     */
-    public ZipFile getZipFile() {
-        return zipFile;
-    }
-
-    /**
-     * Initializes this object's children table based on the contents of
-     * the specified source file.
-     */
-    protected void initialize() {
-        children = new HashMap(1000);
-
-        Enumeration entries = zipFile.entries();
-        while (entries.hasMoreElements()) {
-            ZipEntry entry = (ZipEntry) entries.nextElement();
-            if (!entry.isDirectory()) {
-                IPath path = new Path(entry.getName()).addTrailingSeparator();
-                int pathSegmentCount = path.segmentCount();
-
-                for (int i = 1; i < pathSegmentCount; i++) {
-					createContainer(path.uptoSegment(i));
-				}
-                createFile(entry);
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IImportStructureProvider
-     */
-    public boolean isFolder(Object element) {
-        return ((ZipEntry) element).isDirectory();
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/package.html b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/package.html
deleted file mode 100644
index e9e3b09..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/datatransfer/package.html
+++ /dev/null
@@ -1,13 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides the standard Import and Export wizards for
-moving resources into and out of the workspace.
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/newresource/BasicNewFileResourceWizard.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/newresource/BasicNewFileResourceWizard.java
deleted file mode 100644
index b80fc96..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/newresource/BasicNewFileResourceWizard.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Remy Chi Jian Suen <remy.suen@gmail.com>
- *     		- Bug 44162 [Wizards]  Define constants for wizard ids of new.file, new.folder, and new.project
- *******************************************************************************/
-package org.eclipse.ui.wizards.newresource;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ide.DialogUtil;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.wizards.newresource.ResourceMessages;
-
-/**
- * Standard workbench wizard that create a new file resource in the workspace.
- * <p>
- * This class may be instantiated and used without further configuration;
- * this class is not intended to be subclassed.
- * </p>
- * <p>
- * Example:
- * <pre>
- * IWorkbenchWizard wizard = new BasicNewFileResourceWizard();
- * wizard.init(workbench, selection);
- * WizardDialog dialog = new WizardDialog(shell, wizard);
- * dialog.open();
- * </pre>
- * During the call to <code>open</code>, the wizard dialog is presented to the
- * user. When the user hits Finish, a file resource at the user-specified
- * workspace path is created, the dialog closes, and the call to
- * <code>open</code> returns.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class BasicNewFileResourceWizard extends BasicNewResourceWizard {
-
-	/**
-	 * The wizard id for creating new files in the workspace.
-	 * @since 3.4
-	 */
-	public static final String WIZARD_ID = "org.eclipse.ui.wizards.new.file"; //$NON-NLS-1$
-	
-    private WizardNewFileCreationPage mainPage;
-
-    /**
-     * Creates a wizard for creating a new file resource in the workspace.
-     */
-    public BasicNewFileResourceWizard() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizard.
-     */
-    public void addPages() {
-        super.addPages();
-        mainPage = new WizardNewFileCreationPage("newFilePage1", getSelection());//$NON-NLS-1$
-        mainPage.setTitle(ResourceMessages.FileResource_pageTitle);
-        mainPage.setDescription(ResourceMessages.FileResource_description); 
-        addPage(mainPage);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchWizard.
-     */
-    public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
-        super.init(workbench, currentSelection);
-        setWindowTitle(ResourceMessages.FileResource_shellTitle);
-        setNeedsProgressMonitor(true);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on BasicNewResourceWizard.
-     */
-    protected void initializeDefaultPageImageDescriptor() {
-       ImageDescriptor desc = IDEWorkbenchPlugin.getIDEImageDescriptor("wizban/newfile_wiz.png");//$NON-NLS-1$
-	   setDefaultPageImageDescriptor(desc);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizard.
-     */
-    public boolean performFinish() {
-        IFile file = mainPage.createNewFile();
-        if (file == null) {
-			return false;
-		}
-
-        selectAndReveal(file);
-
-        // Open editor on new file.
-        IWorkbenchWindow dw = getWorkbench().getActiveWorkbenchWindow();
-        try {
-            if (dw != null) {
-                IWorkbenchPage page = dw.getActivePage();
-                if (page != null) {
-                    IDE.openEditor(page, file, true);
-                }
-            }
-        } catch (PartInitException e) {
-            DialogUtil.openError(dw.getShell(), ResourceMessages.FileResource_errorMessage, 
-                    e.getMessage(), e);
-        }
-
-        return true;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/newresource/BasicNewFolderResourceWizard.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/newresource/BasicNewFolderResourceWizard.java
deleted file mode 100644
index c228637..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/newresource/BasicNewFolderResourceWizard.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Remy Chi Jian Suen <remy.suen@gmail.com>
- *     		- Bug 44162 [Wizards]  Define constants for wizard ids of new.file, new.folder, and new.project
- *******************************************************************************/
-package org.eclipse.ui.wizards.newresource;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.dialogs.WizardNewFolderMainPage;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.wizards.newresource.ResourceMessages;
-
-/**
- * Standard workbench wizard that create a new folder resource in the workspace.
- * <p>
- * This class may be instantiated and used without further configuration;
- * this class is not intended to be subclassed.
- * </p>
- * <p>
- * Example:
- * <pre>
- * IWorkbenchWizard wizard = new BasicNewFolderResourceWizard();
- * wizard.init(workbench, selection);
- * WizardDialog dialog = new WizardDialog(shell, wizard);
- * dialog.open();
- * </pre>
- * During the call to <code>open</code>, the wizard dialog is presented to the
- * user. When the user hits Finish, a folder resource at the user-specified
- * workspace path is created, the dialog closes, and the call to
- * <code>open</code> returns.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class BasicNewFolderResourceWizard extends BasicNewResourceWizard {
-
-	/**
-	 * The wizard id for creating new folders in the workspace.
-	 * @since 3.4
-	 */
-	public static final String WIZARD_ID = "org.eclipse.ui.wizards.new.folder"; //$NON-NLS-1$
-	
-    private WizardNewFolderMainPage mainPage;
-
-    /**
-     * Creates a wizard for creating a new folder resource in the workspace.
-     */
-    public BasicNewFolderResourceWizard() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizard.
-     */
-    public void addPages() {
-        super.addPages();
-        mainPage = new WizardNewFolderMainPage(ResourceMessages.NewFolder_text, getSelection()); 
-        addPage(mainPage);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchWizard.
-     */
-    public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
-        super.init(workbench, currentSelection);
-        setWindowTitle(ResourceMessages.NewFolder_title);
-        setNeedsProgressMonitor(true);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on BasicNewResourceWizard.
-     */
-    protected void initializeDefaultPageImageDescriptor() {
-      ImageDescriptor desc = IDEWorkbenchPlugin.getIDEImageDescriptor("wizban/newfolder_wiz.png");//$NON-NLS-1$
-      setDefaultPageImageDescriptor(desc);
-       
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWizard.
-     */
-    public boolean performFinish() {
-        IFolder folder = mainPage.createNewFolder();
-        if (folder == null) {
-			return false;
-		}
-
-        selectAndReveal(folder);
-
-        return true;
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/newresource/BasicNewProjectResourceWizard.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/newresource/BasicNewProjectResourceWizard.java
deleted file mode 100644
index e2524ea..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/newresource/BasicNewProjectResourceWizard.java
+++ /dev/null
@@ -1,614 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Remy Chi Jian Suen <remy.suen@gmail.com>
- *     		- Bug 44162 [Wizards]  Define constants for wizard ids of new.file, new.folder, and new.project
- *******************************************************************************/
-
-package org.eclipse.ui.wizards.newresource;
-
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResourceStatus;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IPluginContribution;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.activities.IActivityManager;
-import org.eclipse.ui.activities.IIdentifier;
-import org.eclipse.ui.activities.IWorkbenchActivitySupport;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;
-import org.eclipse.ui.dialogs.WizardNewProjectReferencePage;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.ide.undo.CreateProjectOperation;
-import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
-import org.eclipse.ui.internal.IPreferenceConstants;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.StatusUtil;
-import org.eclipse.ui.internal.registry.PerspectiveDescriptor;
-import org.eclipse.ui.internal.util.PrefUtil;
-import org.eclipse.ui.internal.wizards.newresource.ResourceMessages;
-import org.eclipse.ui.statushandlers.StatusAdapter;
-import org.eclipse.ui.statushandlers.StatusManager;
-
-/**
- * Standard workbench wizard that creates a new project resource in the
- * workspace.
- * <p>
- * This class may be instantiated and used without further configuration; this
- * class is not intended to be subclassed.
- * </p>
- * <p>
- * Example:
- * 
- * <pre>
- * IWorkbenchWizard wizard = new BasicNewProjectResourceWizard();
- * wizard.init(workbench, selection);
- * WizardDialog dialog = new WizardDialog(shell, wizard);
- * dialog.open();
- * </pre>
- * 
- * During the call to <code>open</code>, the wizard dialog is presented to
- * the user. When the user hits Finish, a project resource with the
- * user-specified name is created, the dialog closes, and the call to
- * <code>open</code> returns.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class BasicNewProjectResourceWizard extends BasicNewResourceWizard
-		implements IExecutableExtension {
-	
-	/**
-	 * The wizard id for creating new projects in the workspace.
-	 * @since 3.4
-	 */
-	public static final String WIZARD_ID = "org.eclipse.ui.wizards.new.project"; //$NON-NLS-1$
-	
-	private WizardNewProjectCreationPage mainPage;
-
-	private WizardNewProjectReferencePage referencePage;
-
-	// cache of newly-created project
-	private IProject newProject;
-
-	/**
-	 * The config element which declares this wizard.
-	 */
-	private IConfigurationElement configElement;
-
-	private static String WINDOW_PROBLEMS_TITLE = ResourceMessages.NewProject_errorOpeningWindow;
-
-	/**
-	 * Extension attribute name for final perspective.
-	 */
-	private static final String FINAL_PERSPECTIVE = "finalPerspective"; //$NON-NLS-1$
-
-	/**
-	 * Extension attribute name for preferred perspectives.
-	 */
-	private static final String PREFERRED_PERSPECTIVES = "preferredPerspectives"; //$NON-NLS-1$
-
-	/**
-	 * Creates a wizard for creating a new project resource in the workspace.
-	 */
-	public BasicNewProjectResourceWizard() {
-		IDialogSettings workbenchSettings = IDEWorkbenchPlugin.getDefault()
-				.getDialogSettings();
-		IDialogSettings section = workbenchSettings
-				.getSection("BasicNewProjectResourceWizard");//$NON-NLS-1$
-		if (section == null) {
-			section = workbenchSettings
-					.addNewSection("BasicNewProjectResourceWizard");//$NON-NLS-1$
-		}
-		setDialogSettings(section);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IWizard.
-	 */
-	public void addPages() {
-		super.addPages();
-
-		mainPage = new WizardNewProjectCreationPage("basicNewProjectPage") { //$NON-NLS-1$
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.dialogs.WizardNewProjectCreationPage#createControl(org.eclipse.swt.widgets.Composite)
-			 */
-			public void createControl(Composite parent) {
-				super.createControl(parent);
-				createWorkingSetGroup(
-						(Composite) getControl(),
-						getSelection(),
-						new String[] { "org.eclipse.ui.resourceWorkingSetPage" }); //$NON-NLS-1$
-				Dialog.applyDialogFont(getControl());
-			}
-		}; 
-		mainPage.setTitle(ResourceMessages.NewProject_title);
-		mainPage.setDescription(ResourceMessages.NewProject_description);
-		this.addPage(mainPage);
-
-		// only add page if there are already projects in the workspace
-		if (ResourcesPlugin.getWorkspace().getRoot().getProjects().length > 0) {
-			referencePage = new WizardNewProjectReferencePage(
-					"basicReferenceProjectPage");//$NON-NLS-1$
-			referencePage.setTitle(ResourceMessages.NewProject_referenceTitle);
-			referencePage
-					.setDescription(ResourceMessages.NewProject_referenceDescription);
-			this.addPage(referencePage);
-		}
-	}
-
-	/**
-	 * Creates a new project resource with the selected name.
-	 * <p>
-	 * In normal usage, this method is invoked after the user has pressed Finish
-	 * on the wizard; the enablement of the Finish button implies that all
-	 * controls on the pages currently contain valid values.
-	 * </p>
-	 * <p>
-	 * Note that this wizard caches the new project once it has been
-	 * successfully created; subsequent invocations of this method will answer
-	 * the same project resource without attempting to create it again.
-	 * </p>
-	 * 
-	 * @return the created project resource, or <code>null</code> if the
-	 *         project was not created
-	 */
-	private IProject createNewProject() {
-		if (newProject != null) {
-			return newProject;
-		}
-
-		// get a project handle
-		final IProject newProjectHandle = mainPage.getProjectHandle();
-
-		// get a project descriptor
-		URI location = null;
-		if (!mainPage.useDefaults()) {
-			location = mainPage.getLocationURI();
-		}
-
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		final IProjectDescription description = workspace
-				.newProjectDescription(newProjectHandle.getName());
-		description.setLocationURI(location);
-
-		// update the referenced project if provided
-		if (referencePage != null) {
-			IProject[] refProjects = referencePage.getReferencedProjects();
-			if (refProjects.length > 0) {
-				description.setReferencedProjects(refProjects);
-			}
-		}
-
-		// create the new project operation
-		IRunnableWithProgress op = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException {
-				CreateProjectOperation op = new CreateProjectOperation(
-						description, ResourceMessages.NewProject_windowTitle);
-				try {
-					// see bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=219901
-					// directly execute the operation so that the undo state is
-					// not preserved.  Making this undoable resulted in too many 
-					// accidental file deletions.
-					op.execute(monitor, WorkspaceUndoUtil
-						.getUIInfoAdapter(getShell()));
-				} catch (ExecutionException e) {
-					throw new InvocationTargetException(e);
-				}
-			}
-		};
-
-		// run the new project creation operation
-		try {
-			getContainer().run(true, true, op);
-		} catch (InterruptedException e) {
-			return null;
-		} catch (InvocationTargetException e) {
-			Throwable t = e.getTargetException();
-			if (t instanceof ExecutionException
-					&& t.getCause() instanceof CoreException) {
-				CoreException cause = (CoreException) t.getCause();
-				StatusAdapter status;
-				if (cause.getStatus().getCode() == IResourceStatus.CASE_VARIANT_EXISTS) {
-					status = new StatusAdapter(
-							StatusUtil
-									.newStatus(
-											IStatus.WARNING,
-											NLS
-													.bind(
-															ResourceMessages.NewProject_caseVariantExistsError,
-															newProjectHandle
-																	.getName()),
-											cause));
-				} else {
-					status = new StatusAdapter(StatusUtil.newStatus(cause
-							.getStatus().getSeverity(),
-							ResourceMessages.NewProject_errorMessage, cause));
-				}
-				status.setProperty(StatusAdapter.TITLE_PROPERTY,
-						ResourceMessages.NewProject_errorMessage);
-				StatusManager.getManager().handle(status, StatusManager.BLOCK);
-			} else {
-				StatusAdapter status = new StatusAdapter(new Status(
-						IStatus.WARNING, IDEWorkbenchPlugin.IDE_WORKBENCH, 0,
-						NLS.bind(ResourceMessages.NewProject_internalError, t
-								.getMessage()), t));
-				status.setProperty(StatusAdapter.TITLE_PROPERTY,
-						ResourceMessages.NewProject_errorMessage);
-				StatusManager.getManager().handle(status,
-						StatusManager.LOG | StatusManager.BLOCK);
-			}
-			return null;
-		}
-
-		newProject = newProjectHandle;
-
-		return newProject;
-	}
-
-	/**
-	 * Returns the newly created project.
-	 * 
-	 * @return the created project, or <code>null</code> if project not
-	 *         created
-	 */
-	public IProject getNewProject() {
-		return newProject;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IWorkbenchWizard.
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
-		super.init(workbench, currentSelection);
-		setNeedsProgressMonitor(true);
-		setWindowTitle(ResourceMessages.NewProject_windowTitle);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on BasicNewResourceWizard.
-	 */
-	protected void initializeDefaultPageImageDescriptor() {
-		ImageDescriptor desc = IDEWorkbenchPlugin
-				.getIDEImageDescriptor("wizban/newprj_wiz.png");//$NON-NLS-1$
-		setDefaultPageImageDescriptor(desc);
-	}
-
-	/*
-	 * (non-Javadoc) Opens a new window with a particular perspective and input.
-	 */
-	private static void openInNewWindow(IPerspectiveDescriptor desc) {
-
-		// Open the page.
-		try {
-			PlatformUI.getWorkbench().openWorkbenchWindow(desc.getId(),
-					ResourcesPlugin.getWorkspace().getRoot());
-		} catch (WorkbenchException e) {
-			IWorkbenchWindow window = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow();
-			if (window != null) {
-				ErrorDialog.openError(window.getShell(), WINDOW_PROBLEMS_TITLE,
-						e.getMessage(), e.getStatus());
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IWizard.
-	 */
-	public boolean performFinish() {
-		createNewProject();
-
-		if (newProject == null) {
-			return false;
-		}
-		
-		IWorkingSet[] workingSets = mainPage.getSelectedWorkingSets();
-		getWorkbench().getWorkingSetManager().addToWorkingSets(newProject,
-				workingSets);
-        
-		updatePerspective();
-		selectAndReveal(newProject);
-
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc) Replaces the current perspective with the new one.
-	 */
-	private static void replaceCurrentPerspective(IPerspectiveDescriptor persp) {
-
-		// Get the active page.
-		IWorkbenchWindow window = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (window == null) {
-			return;
-		}
-		IWorkbenchPage page = window.getActivePage();
-		if (page == null) {
-			return;
-		}
-
-		// Set the perspective.
-		page.setPerspective(persp);
-	}
-
-	/**
-	 * 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) {
-		configElement = cfig;
-	}
-
-	/**
-	 * Updates the perspective for the active page within the window.
-	 */
-	protected void updatePerspective() {
-		updatePerspective(configElement);
-	}
-
-	/**
-	 * Updates the perspective based on the current settings in the
-	 * Workbench/Perspectives preference page.
-	 * 
-	 * Use the setting for the new perspective opening if we are set to open in
-	 * a new perspective.
-	 * <p>
-	 * A new project wizard class will need to implement the
-	 * <code>IExecutableExtension</code> interface so as to gain access to the
-	 * wizard's <code>IConfigurationElement</code>. That is the configuration
-	 * element to pass into this method.
-	 * </p>
-	 * 
-	 * @param configElement -
-	 *            the element we are updating with
-	 * 
-	 * @see IPreferenceConstants#OPM_NEW_WINDOW
-	 * @see IPreferenceConstants#OPM_ACTIVE_PAGE
-	 * @see IWorkbenchPreferenceConstants#NO_NEW_PERSPECTIVE
-	 */
-	public static void updatePerspective(IConfigurationElement configElement) {
-		// Do not change perspective if the configuration element is
-		// not specified.
-		if (configElement == null) {
-			return;
-		}
-
-		// Retrieve the new project open perspective preference setting
-		String perspSetting = PrefUtil.getAPIPreferenceStore().getString(
-				IDE.Preferences.PROJECT_OPEN_NEW_PERSPECTIVE);
-
-		String promptSetting = IDEWorkbenchPlugin.getDefault()
-				.getPreferenceStore().getString(
-						IDEInternalPreferences.PROJECT_SWITCH_PERSP_MODE);
-
-		// Return if do not switch perspective setting and are not prompting
-		if (!(promptSetting.equals(MessageDialogWithToggle.PROMPT))
-				&& perspSetting
-						.equals(IWorkbenchPreferenceConstants.NO_NEW_PERSPECTIVE)) {
-			return;
-		}
-
-		// Read the requested perspective id to be opened.
-		String finalPerspId = configElement.getAttribute(FINAL_PERSPECTIVE);
-		if (finalPerspId == null) {
-			return;
-		}
-
-		// Map perspective id to descriptor.
-		IPerspectiveRegistry reg = PlatformUI.getWorkbench()
-				.getPerspectiveRegistry();
-
-		// leave this code in - the perspective of a given project may map to
-		// activities other than those that the wizard itself maps to.
-		IPerspectiveDescriptor finalPersp = reg
-				.findPerspectiveWithId(finalPerspId);
-		if (finalPersp != null && finalPersp instanceof IPluginContribution) {
-			IPluginContribution contribution = (IPluginContribution) finalPersp;
-			if (contribution.getPluginId() != null) {
-				IWorkbenchActivitySupport workbenchActivitySupport = PlatformUI
-						.getWorkbench().getActivitySupport();
-				IActivityManager activityManager = workbenchActivitySupport
-						.getActivityManager();
-				IIdentifier identifier = activityManager
-						.getIdentifier(WorkbenchActivityHelper
-								.createUnifiedId(contribution));
-				Set idActivities = identifier.getActivityIds();
-
-				if (!idActivities.isEmpty()) {
-					Set enabledIds = new HashSet(activityManager
-							.getEnabledActivityIds());
-
-					if (enabledIds.addAll(idActivities)) {
-						workbenchActivitySupport
-								.setEnabledActivityIds(enabledIds);
-					}
-				}
-			}
-		} else {
-			IDEWorkbenchPlugin.log("Unable to find persective " //$NON-NLS-1$
-					+ finalPerspId
-					+ " in BasicNewProjectResourceWizard.updatePerspective"); //$NON-NLS-1$
-			return;
-		}
-
-		// gather the preferred perspectives
-		// always consider the final perspective (and those derived from it)
-		// to be preferred
-		ArrayList preferredPerspIds = new ArrayList();
-		addPerspectiveAndDescendants(preferredPerspIds, finalPerspId);
-		String preferred = configElement.getAttribute(PREFERRED_PERSPECTIVES);
-		if (preferred != null) {
-			StringTokenizer tok = new StringTokenizer(preferred, " \t\n\r\f,"); //$NON-NLS-1$
-			while (tok.hasMoreTokens()) {
-				addPerspectiveAndDescendants(preferredPerspIds, tok.nextToken());
-			}
-		}
-
-		IWorkbenchWindow window = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (window != null) {
-			IWorkbenchPage page = window.getActivePage();
-			if (page != null) {
-				IPerspectiveDescriptor currentPersp = page.getPerspective();
-
-				// don't switch if the current perspective is a preferred
-				// perspective
-				if (currentPersp != null
-						&& preferredPerspIds.contains(currentPersp.getId())) {
-					return;
-				}
-			}
-
-			// prompt the user to switch
-			if (!confirmPerspectiveSwitch(window, finalPersp)) {
-				return;
-			}
-		}
-
-		int workbenchPerspectiveSetting = WorkbenchPlugin.getDefault()
-				.getPreferenceStore().getInt(
-						IPreferenceConstants.OPEN_PERSP_MODE);
-
-		// open perspective in new window setting
-		if (workbenchPerspectiveSetting == IPreferenceConstants.OPM_NEW_WINDOW) {
-			openInNewWindow(finalPersp);
-			return;
-		}
-
-		// replace active perspective setting otherwise
-		replaceCurrentPerspective(finalPersp);
-	}
-
-	/**
-	 * Adds to the list all perspective IDs in the Workbench who's original ID
-	 * matches the given ID.
-	 * 
-	 * @param perspectiveIds
-	 *            the list of perspective IDs to supplement.
-	 * @param id
-	 *            the id to query.
-	 * @since 3.0
-	 */
-	private static void addPerspectiveAndDescendants(List perspectiveIds,
-			String id) {
-		IPerspectiveRegistry registry = PlatformUI.getWorkbench()
-				.getPerspectiveRegistry();
-		IPerspectiveDescriptor[] perspectives = registry.getPerspectives();
-		for (int i = 0; i < perspectives.length; i++) {
-			// @issue illegal ref to workbench internal class;
-			// consider adding getOriginalId() as API on IPerspectiveDescriptor
-			PerspectiveDescriptor descriptor = ((PerspectiveDescriptor) perspectives[i]);
-			if (descriptor.getOriginalId().equals(id)) {
-				perspectiveIds.add(descriptor.getId());
-			}
-		}
-	}
-
-	/**
-	 * Prompts the user for whether to switch perspectives.
-	 * 
-	 * @param window
-	 *            The workbench window in which to switch perspectives; must not
-	 *            be <code>null</code>
-	 * @param finalPersp
-	 *            The perspective to switch to; must not be <code>null</code>.
-	 * 
-	 * @return <code>true</code> if it's OK to switch, <code>false</code>
-	 *         otherwise
-	 */
-	private static boolean confirmPerspectiveSwitch(IWorkbenchWindow window,
-			IPerspectiveDescriptor finalPersp) {
-		IPreferenceStore store = IDEWorkbenchPlugin.getDefault()
-				.getPreferenceStore();
-		String pspm = store
-				.getString(IDEInternalPreferences.PROJECT_SWITCH_PERSP_MODE);
-		if (!IDEInternalPreferences.PSPM_PROMPT.equals(pspm)) {
-			// Return whether or not we should always switch
-			return IDEInternalPreferences.PSPM_ALWAYS.equals(pspm);
-		}
-		String desc = finalPersp.getDescription();
-		String message;
-		if (desc == null || desc.length() == 0)
-			message = NLS.bind(ResourceMessages.NewProject_perspSwitchMessage,
-					finalPersp.getLabel());
-		else
-			message = NLS.bind(
-					ResourceMessages.NewProject_perspSwitchMessageWithDesc,
-					new String[] { finalPersp.getLabel(), desc });
-
-		MessageDialogWithToggle dialog = MessageDialogWithToggle
-				.openYesNoQuestion(window.getShell(),
-						ResourceMessages.NewProject_perspSwitchTitle, message,
-						null /* use the default message for the toggle */,
-						false /* toggle is initially unchecked */, store,
-						IDEInternalPreferences.PROJECT_SWITCH_PERSP_MODE);
-		int result = dialog.getReturnCode();
-
-		// If we are not going to prompt anymore propogate the choice.
-		if (dialog.getToggleState()) {
-			String preferenceValue;
-			if (result == IDialogConstants.YES_ID) {
-				// Doesn't matter if it is replace or new window
-				// as we are going to use the open perspective setting
-				preferenceValue = IWorkbenchPreferenceConstants.OPEN_PERSPECTIVE_REPLACE;
-			} else {
-				preferenceValue = IWorkbenchPreferenceConstants.NO_NEW_PERSPECTIVE;
-			}
-
-			// update PROJECT_OPEN_NEW_PERSPECTIVE to correspond
-			PrefUtil.getAPIPreferenceStore().setValue(
-					IDE.Preferences.PROJECT_OPEN_NEW_PERSPECTIVE,
-					preferenceValue);
-		}
-		return result == IDialogConstants.YES_ID;
-	}
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/newresource/BasicNewResourceWizard.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/newresource/BasicNewResourceWizard.java
deleted file mode 100644
index 8df7ad4..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/newresource/BasicNewResourceWizard.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.wizards.newresource;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-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.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.part.ISetSelectionTarget;
-
-/**
- * Abstract base implementation of the standard workbench wizards
- * that create new resources in the workspace.
- * <p>
- * This class is not intended to be subclassed outside this package.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public abstract class BasicNewResourceWizard extends Wizard implements
-        INewWizard {
-
-    /**
-     * The workbench.
-     */
-    private IWorkbench workbench;
-
-    /**
-     * The current selection.
-     */
-    protected IStructuredSelection selection;
-
-    /**
-     * Creates an empty wizard for creating a new resource in the workspace.
-     */
-    protected BasicNewResourceWizard() {
-        super();
-    }
-
-    /**
-     * Returns the selection which was passed to <code>init</code>.
-     *
-     * @return the selection
-     */
-    public IStructuredSelection getSelection() {
-        return selection;
-    }
-
-    /**
-     * Returns the workbench which was passed to <code>init</code>.
-     *
-     * @return the workbench
-     */
-    public IWorkbench getWorkbench() {
-        return workbench;
-    }
-
-    /**
-     * The <code>BasicNewResourceWizard</code> implementation of this 
-     * <code>IWorkbenchWizard</code> method records the given workbench and
-     * selection, and initializes the default banner image for the pages
-     * by calling <code>initializeDefaultPageImageDescriptor</code>.
-     * Subclasses may extend.
-     */
-    public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
-        this.workbench = workbench;
-        this.selection = currentSelection;
-
-        initializeDefaultPageImageDescriptor();
-    }
-
-    /**
-     * Initializes the default page image descriptor to an appropriate banner.
-     * By calling <code>setDefaultPageImageDescriptor</code>.
-     * The default implementation of this method uses a generic new wizard image.
-     * <p>
-     * Subclasses may reimplement.
-     * </p>
-     */
-    protected void initializeDefaultPageImageDescriptor() {
-		ImageDescriptor desc = IDEWorkbenchPlugin.getIDEImageDescriptor("wizban/new_wiz.png");//$NON-NLS-1$
-        setDefaultPageImageDescriptor(desc);
-    }
-
-    /**
-     * Selects and reveals the newly added resource in all parts
-     * of the active workbench window's active page.
-     *
-     * @see ISetSelectionTarget
-     */
-    protected void selectAndReveal(IResource newResource) {
-        selectAndReveal(newResource, getWorkbench().getActiveWorkbenchWindow());
-    }
-
-    /**
-     * Attempts to select and reveal the specified resource in all
-     * parts within the supplied workbench window's active page.
-     * <p>
-     * Checks all parts in the active page to see if they implement <code>ISetSelectionTarget</code>,
-     * either directly or as an adapter. If so, tells the part to select and reveal the
-     * specified resource.
-     * </p>
-     *
-     * @param resource the resource to be selected and revealed
-     * @param window the workbench window to select and reveal the resource
-     * 
-     * @see ISetSelectionTarget
-     */
-    public static void selectAndReveal(IResource resource,
-            IWorkbenchWindow window) {
-        // validate the input
-        if (window == null || resource == null) {
-			return;
-		}
-        IWorkbenchPage page = window.getActivePage();
-        if (page == null) {
-			return;
-		}
-
-        // get all the view and editor parts
-        List parts = new ArrayList();
-        IWorkbenchPartReference refs[] = page.getViewReferences();
-        for (int i = 0; i < refs.length; i++) {
-            IWorkbenchPart part = refs[i].getPart(false);
-            if (part != null) {
-				parts.add(part);
-			}
-        }
-        refs = page.getEditorReferences();
-        for (int i = 0; i < refs.length; i++) {
-            if (refs[i].getPart(false) != null) {
-				parts.add(refs[i].getPart(false));
-			}
-        }
-
-        final ISelection selection = new StructuredSelection(resource);
-        Iterator itr = parts.iterator();
-        while (itr.hasNext()) {
-            IWorkbenchPart part = (IWorkbenchPart) itr.next();
-
-            // get the part's ISetSelectionTarget implementation
-            ISetSelectionTarget target = null;
-            if (part instanceof ISetSelectionTarget) {
-				target = (ISetSelectionTarget) part;
-			} else {
-				target = (ISetSelectionTarget) part
-                        .getAdapter(ISetSelectionTarget.class);
-			}
-
-            if (target != null) {
-                // select and reveal resource
-                final ISetSelectionTarget finalTarget = target;
-                window.getShell().getDisplay().asyncExec(new Runnable() {
-                    public void run() {
-                        finalTarget.selectReveal(selection);
-                    }
-                });
-            }
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/newresource/package.html b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/newresource/package.html
deleted file mode 100644
index 3c890c0..0000000
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/wizards/newresource/package.html
+++ /dev/null
@@ -1,13 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides the standard wizards for creating files,
-folders, and projects in the workspace.
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.navigator.resources/.classpath b/bundles/org.eclipse.ui.navigator.resources/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.ui.navigator.resources/.cvsignore b/bundles/org.eclipse.ui.navigator.resources/.cvsignore
deleted file mode 100644
index 66fef7b..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-doc
-temp.folder
-wbnavigator.jar
-build.xml
diff --git a/bundles/org.eclipse.ui.navigator.resources/.project b/bundles/org.eclipse.ui.navigator.resources/.project
deleted file mode 100644
index adf410f..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.navigator.resources</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.navigator.resources/.settings/org.eclipse.core.resources.prefs b/bundles/org.eclipse.ui.navigator.resources/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index a66cd9a..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Tue Feb 21 13:59:06 EST 2006
-eclipse.preferences.version=1
-encoding//src/org/eclipse/ui/internal/navigator/resources/plugin/messages.properties=8859_1
diff --git a/bundles/org.eclipse.ui.navigator.resources/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.ui.navigator.resources/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index f2424c8..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,71 +0,0 @@
-#Fri Aug 15 19:31:10 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.ui.navigator.resources/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.ui.navigator.resources/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index cf490c7..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Thu Oct 20 14:37:29 EDT 2005
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.3\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/bundles/org.eclipse.ui.navigator.resources/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.ui.navigator.resources/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index d8d62f0..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,25 +0,0 @@
-#Thu Aug 14 02:41:03 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=0
-compilers.p.discouraged-class=1
-compilers.p.illegal-att-value=0
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/bundles/org.eclipse.ui.navigator.resources/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.navigator.resources/META-INF/MANIFEST.MF
deleted file mode 100644
index 434ec5a..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,23 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui.navigator.resources; singleton:=true
-Bundle-Version: 3.3.200.qualifier
-Bundle-Activator: org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorPlugin
-Bundle-Vendor: %Plugin.providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.ui.internal.navigator.resources.actions;x-internal:=true,
- org.eclipse.ui.internal.navigator.resources.plugin;x-internal:=true,
- org.eclipse.ui.internal.navigator.resources.workbench;x-internal:=true,
- org.eclipse.ui.internal.navigator.workingsets;x-internal:=true,
- org.eclipse.ui.navigator.resources
-Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jface;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.navigator;bundle-version="[3.2.1,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.views.properties.tabbed;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.workbench.texteditor;bundle-version="[3.2.0,4.0.0)"
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.ui.navigator.resources/about.html b/bundles/org.eclipse.ui.navigator.resources/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.navigator.resources/build.properties b/bundles/org.eclipse.ui.navigator.resources/build.properties
deleted file mode 100644
index 9ac718e..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-bin.includes = plugin.xml,\
-               icons/,\
-               .,\
-               META-INF/,\
-               plugin.properties,\
-               about.html
-output.. = bin/
-src.includes = about.html
diff --git a/bundles/org.eclipse.ui.navigator.resources/icons/full/clcl16/collapseall.gif b/bundles/org.eclipse.ui.navigator.resources/icons/full/clcl16/collapseall.gif
deleted file mode 100644
index 0bae56c..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/icons/full/clcl16/collapseall.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator.resources/icons/full/clcl16/synced.gif b/bundles/org.eclipse.ui.navigator.resources/icons/full/clcl16/synced.gif
deleted file mode 100644
index f865f3a..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/icons/full/clcl16/synced.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator.resources/icons/full/cview16/filenav_nav.gif b/bundles/org.eclipse.ui.navigator.resources/icons/full/cview16/filenav_nav.gif
deleted file mode 100644
index 91b9d5a..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/icons/full/cview16/filenav_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator.resources/icons/full/elcl16/collapseall.gif b/bundles/org.eclipse.ui.navigator.resources/icons/full/elcl16/collapseall.gif
deleted file mode 100644
index a2d80a9..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/icons/full/elcl16/collapseall.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator.resources/icons/full/elcl16/filter_ps.gif b/bundles/org.eclipse.ui.navigator.resources/icons/full/elcl16/filter_ps.gif
deleted file mode 100644
index a4c9e60..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/icons/full/elcl16/filter_ps.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator.resources/icons/full/elcl16/synced.gif b/bundles/org.eclipse.ui.navigator.resources/icons/full/elcl16/synced.gif
deleted file mode 100644
index 870934b..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/icons/full/elcl16/synced.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator.resources/icons/full/eview16/resource_persp.gif b/bundles/org.eclipse.ui.navigator.resources/icons/full/eview16/resource_persp.gif
deleted file mode 100644
index 1b8fe00..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/icons/full/eview16/resource_persp.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator.resources/icons/full/obj16/workingsets.gif b/bundles/org.eclipse.ui.navigator.resources/icons/full/obj16/workingsets.gif
deleted file mode 100644
index fa8c9f7..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/icons/full/obj16/workingsets.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator.resources/icons/full/ovr16/error_co.gif b/bundles/org.eclipse.ui.navigator.resources/icons/full/ovr16/error_co.gif
deleted file mode 100644
index 8612eaf..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/icons/full/ovr16/error_co.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator.resources/icons/full/ovr16/warning_co.gif b/bundles/org.eclipse.ui.navigator.resources/icons/full/ovr16/warning_co.gif
deleted file mode 100644
index 3af228c..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/icons/full/ovr16/warning_co.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator.resources/plugin.properties b/bundles/org.eclipse.ui.navigator.resources/plugin.properties
deleted file mode 100644
index 4dd2d8d..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/plugin.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-Plugin.name = Navigator Workbench Components
-Plugin.providerName = Eclipse.org 
-
-resource.extension.name=Resources
-workingsets.extension.name=Working Sets
-Common_Resource_Navigator=Project Explorer
- 
-filters.startsWithDot.name=.* resources
-filters.startsWithDot.description=Hides resources that begin with "."
-filters.endsWithClass.name=*.class resources
-filters.endsWithClass.description=Hides resources that end with ".class"
-filters.closedProject.name=Closed projects
-filters.closedProject.description=Hides closed projects
-
-Resource=Resource
diff --git a/bundles/org.eclipse.ui.navigator.resources/plugin.xml b/bundles/org.eclipse.ui.navigator.resources/plugin.xml
deleted file mode 100644
index b79398f..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/plugin.xml
+++ /dev/null
@@ -1,350 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
- 
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            category="org.eclipse.ui"
-            class="org.eclipse.ui.navigator.CommonNavigator"
-            icon="$nl$/icons/full/eview16/resource_persp.gif"
-            id="org.eclipse.ui.navigator.ProjectExplorer"
-            name="%Common_Resource_Navigator"/>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.navigator.viewer">
-       <viewer
-             viewerId="org.eclipse.ui.navigator.ProjectExplorer">
-          <popupMenu
-                allowsPlatformContributions="true"
-                id="org.eclipse.ui.navigator.ProjectExplorer#PopupMenu">  
-             <insertionPoint name="group.new"/>
-             <insertionPoint
-                   name="group.open"
-                   separator="true"/>
-             <insertionPoint name="group.openWith"/>   
-             <insertionPoint name="group.edit"
-                   separator="true"/>   
-             <insertionPoint name="group.reorganize" />         
-             <insertionPoint
-                   name="group.port"
-                   separator="true"/>     
-             <insertionPoint
-                   name="group.build"
-                   separator="true"/> 
-             <insertionPoint
-                   name="group.generate"
-                   separator="true"/> 
-             <insertionPoint
-                   name="group.search"
-                   separator="true"/>              
-             <insertionPoint
-                   name="additions"
-                   separator="true"/>              
-             <insertionPoint
-                   name="group.properties"
-                   separator="true"/>
-             
-          </popupMenu>
-       </viewer>
-       <viewerContentBinding 
-             viewerId="org.eclipse.ui.navigator.ProjectExplorer">
-          <includes>
-       	      <contentExtension pattern="org.eclipse.ui.navigator.resourceContent" />		       	      
-	          <contentExtension pattern="org.eclipse.ui.navigator.resources.filters.*"/>
-           <contentExtension pattern="org.eclipse.ui.navigator.resources.linkHelper"/>
-           <contentExtension pattern="org.eclipse.ui.navigator.resources.workingSets"/>
-          </includes>
-       </viewerContentBinding>
-       <viewerActionBinding
-            viewerId="org.eclipse.ui.navigator.ProjectExplorer">
-         <includes>
-             <actionExtension pattern="org.eclipse.ui.navigator.resources.*" />
-         </includes>
-       </viewerActionBinding>
-       <dragAssistant
-             class="org.eclipse.ui.navigator.resources.ResourceDragAdapterAssistant"
-             viewerId="org.eclipse.ui.navigator.ProjectExplorer"/>
-       
-   </extension>
-   
-<!-- Resource Content  -->
-   <extension  
-         point="org.eclipse.ui.navigator.navigatorContent">
-      <navigatorContent
-            name="%resource.extension.name"
-            priority="low"
-            icon="$nl$/icons/full/eview16/resource_persp.gif"
-            activeByDefault="true"
-			            contentProvider="org.eclipse.ui.internal.navigator.resources.workbench.ResourceExtensionContentProvider"
-            			labelProvider="org.eclipse.ui.internal.navigator.resources.workbench.ResourceExtensionLabelProvider"			
-            id="org.eclipse.ui.navigator.resourceContent">         
-         <enablement>
-		         <or>         
-		            <adapt type="org.eclipse.core.resources.IProject" /> 
-		            <instanceof 
-		                  	value="org.eclipse.core.resources.IResource" /> 
-		         </or>
-         </enablement>
-         
-        <commonSorter
-              class="org.eclipse.ui.internal.navigator.resources.workbench.ResourceExtensionSorter"
-              id="org.eclipse.ui.navigator.resources.sorters.defaultSorter">
-           <parentExpression>
-           		  <or>           
-		            <instanceof value="org.eclipse.core.resources.IResource" /> 
-		         </or>
-		   </parentExpression>
-        </commonSorter>
-        <dropAssistant
-              class="org.eclipse.ui.navigator.resources.ResourceDropAdapterAssistant"
-              id="org.eclipse.ui.navigator.resources.resourceDropAdapter">
-           <possibleDropTargets>
-              <or>
-                 <adapt type="org.eclipse.core.resources.IProject"/>
-                 <adapt type="org.eclipse.core.resources.IFolder"/>
-                 <adapt type="org.eclipse.core.resources.IFile"/>
-              </or>
-           </possibleDropTargets>
-        </dropAssistant>        
-
-        <actionProvider
-              class="org.eclipse.ui.internal.navigator.resources.actions.EditActionProvider"
-              id="org.eclipse.ui.navigator.resources.actions.EditActions"/>         
-        <actionProvider
-              class="org.eclipse.ui.internal.navigator.resources.actions.RefactorActionProvider"
-              id="org.eclipse.ui.navigator.resources.actions.RefactorActions"/>         
-                      
-	      <!-- Menu Shortcut Actions for Wizards -->
-	      <commonWizard
-	        		type="new"
-					wizardId="org.eclipse.ui.wizards.new.folder">
-				<enablement>
-					<or>
-						<adapt type="org.eclipse.core.resources.IFile" />	
-						<adapt type="org.eclipse.core.resources.IFolder" />
-	         			<adapt type="org.eclipse.core.resources.IProject" /> 
-	               		<adapt type="org.eclipse.core.resources.IWorkspaceRoot" />	
-					</or>
-		         </enablement>
-			</commonWizard>   
-	        <commonWizard
-	            type="new"
-	            wizardId="org.eclipse.ui.wizards.new.file">
-				<enablement>
-					<or>
-						<adapt type="org.eclipse.core.resources.IFile" />	
-						<adapt type="org.eclipse.core.resources.IFolder" />
-	         			<adapt type="org.eclipse.core.resources.IProject" /> 
-	               		<adapt type="org.eclipse.core.resources.IWorkspaceRoot" />	
-					</or>
-		         </enablement>
-			</commonWizard>              
-      </navigatorContent>
-      
-      <!-- Action Providers -->
-      <actionProvider 
-      			id="org.eclipse.ui.navigator.resources.OpenActions"
-				class="org.eclipse.ui.internal.navigator.resources.actions.OpenActionProvider">
-			<enablement>
-				<or>
-					<adapt type="org.eclipse.core.resources.IFile" /> 	
-				</or>
-			</enablement>
-		</actionProvider> 
-		<actionProvider 
-        		id="org.eclipse.ui.navigator.resources.PortingActions"
-				class="org.eclipse.ui.internal.navigator.resources.actions.PortingActionProvider">
-			<enablement> 
-			    <or>
-					<adapt type="org.eclipse.core.resources.IResource" />	 
-					<adapt type="java.util.Collection"> 
-						<count value="0" />
-					</adapt>
-				</or>	 
-			</enablement>
-		</actionProvider>
-        <actionProvider
-            	class="org.eclipse.ui.internal.navigator.resources.actions.NewActionProvider"
-            	id="org.eclipse.ui.navigator.resources.NewActions"> 
-        	<enablement> 
-        			<or>
-						<adapt type="org.eclipse.core.resources.IResource" />	 
-						<adapt type="java.util.Collection"> 
-							<count value="0" />
-						</adapt>
-					</or>
-	         </enablement>
-		</actionProvider> 
-        <actionProvider
-              class="org.eclipse.ui.internal.navigator.resources.actions.PropertiesActionProvider"
-              id="org.eclipse.ui.navigator.resources.PropertiesActionProvider">
-           <enablement>
-        	  <instanceof value="org.eclipse.core.runtime.IAdaptable" />
-           </enablement>
-        </actionProvider>
-        <actionProvider
-              class="org.eclipse.ui.internal.navigator.resources.actions.WorkManagementActionProvider"
-              id="org.eclipse.ui.navigator.resources.WorkManagementActionProvider">
-           <enablement>
-              <adapt type="org.eclipse.core.resources.IResource"/>
-           </enablement>
-        </actionProvider>
-        
-        <actionProvider
-              class="org.eclipse.ui.internal.navigator.resources.actions.ResourceMgmtActionProvider"
-              id="org.eclipse.ui.navigator.resources.ResourceMgmtActions">
-           <enablement>
-                <or>
-					<adapt type="org.eclipse.core.resources.IResource" />	 
-					<adapt type="java.util.Collection"> 
-						<count value="0" />
-					</adapt>
-				</or>
-           </enablement>
-        </actionProvider> 
-        
-        <actionProvider 
-      			id="org.eclipse.ui.navigator.resources.UndoRedoActionProvider"
-				class="org.eclipse.ui.internal.navigator.resources.actions.UndoRedoActionProvider">
-			<enablement> 
-				<!-- 'true' -->
-   				<or/>
-			</enablement>
-		</actionProvider>
-
-      <!-- Expression Filters -->  
-      <commonFilter
-            id="org.eclipse.ui.navigator.resources.filters.startsWithDot"
-            name="%filters.startsWithDot.name"
-            description="%filters.startsWithDot.description"
-            activeByDefault="true"
-            >
-         <filterExpression>
-         	<and>
-	            <adapt type="org.eclipse.core.resources.IResource">
-            		<test property="org.eclipse.core.resources.name" value=".*"/>
-            	</adapt>	            
-	        </and>
-         </filterExpression>
-      </commonFilter>
-      <commonFilter  
-            id="org.eclipse.ui.navigator.resources.filters.endsWithClass"
-            name="%filters.endsWithClass.name"
-            description="%filters.endsWithClass.description"
-            activeByDefault="false"
-            >
-         <filterExpression>
-         	<and>
-	            <instanceof value="org.eclipse.core.resources.IFile"/>
-            	<test property="org.eclipse.core.resources.name" value="*.class"/>	            
-	        </and>
-         </filterExpression>
-      </commonFilter> 
-      <commonFilter
-            id="org.eclipse.ui.navigator.resources.filters.closedProject"
-            name="%filters.closedProject.name"
-            description="%filters.closedProject.description" 
-            activeByDefault="false"
-           >
-         <filterExpression>
-         	<and>
-	            <instanceof value="org.eclipse.core.resources.IProject"/>
-            	<test property="org.eclipse.core.resources.open" value="false"/>	            
-	        </and>
-         </filterExpression>
-      </commonFilter>
-      <actionProvider
-            class="org.eclipse.ui.internal.navigator.resources.actions.WorkingSetActionProvider"
-            id="org.eclipse.ui.navigator.resources.WorkingSetActions">
-           <enablement>
-                <or>
-					<adapt type="org.eclipse.core.resources.IResource" />	 
-					<adapt type="java.util.Collection"> 
-						<count value="0" />
-					</adapt>
-				</or>
-           </enablement>            
-      </actionProvider>
-      <navigatorContent
-            activeByDefault="true"
-            contentProvider="org.eclipse.ui.internal.navigator.workingsets.WorkingSetsContentProvider"
-            icon="$nl$/icons/full/obj16/workingsets.gif"
-            id="org.eclipse.ui.navigator.resources.workingSets"
-            labelProvider="org.eclipse.ui.internal.navigator.workingsets.WorkingSetsLabelProvider"
-            name="%workingsets.extension.name"
-            priority="higher">
-         <triggerPoints>
-            <instanceof value="org.eclipse.ui.IWorkingSet"/>
-         </triggerPoints>
-         <possibleChildren>
-            <instanceof value="java.lang.Object"/>
-         </possibleChildren>
-         <commonSorter
-               class="org.eclipse.ui.internal.navigator.workingsets.WorkingSetSorter"
-               id="org.eclipse.ui.navigator.resources.workingSets.sorter"/>  
-      </navigatorContent>
-      
-   </extension>
-    <extension
-          point="org.eclipse.core.runtime.adapters">
-       <factory
-             adaptableType="org.eclipse.ui.navigator.CommonNavigator"
-            class="org.eclipse.ui.internal.navigator.resources.workbench.TabbedPropertySheetAdapterFactory">
-         <adapter type="org.eclipse.ui.views.properties.IPropertySheetPage"/>
-      </factory>
-    </extension>
-    <extension
-          point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-       <propertyContributor
-             contributorId="org.eclipse.ui.navigator.ProjectExplorer"
-             labelProvider="org.eclipse.ui.internal.navigator.resources.workbench.TabbedPropertySheetTitleProvider">
-          <propertyCategory category="general"/>
-          <propertyCategory category="core"/>
-          <propertyCategory category="appearance"/>
-          <propertyCategory category="resource"/>
-          <propertyCategory category="advanced"/>
-       </propertyContributor>
-    </extension>
-    <extension
-          point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
-       <propertyTabs contributorId="org.eclipse.ui.navigator.ProjectExplorer">
-          <propertyTab
-                label="%Resource"
-                category="resource"
-                id="CommonNavigator.tab.Resource"/>
-       </propertyTabs>
-    </extension>
-    <extension
-          point="org.eclipse.ui.views.properties.tabbed.propertySections">
-       <propertySections contributorId="org.eclipse.ui.navigator.ProjectExplorer">
-          <propertySection
-                class="org.eclipse.ui.views.properties.tabbed.AdvancedPropertySection"
-                id="CommonNavigator.section.Resource"
-                tab="CommonNavigator.tab.Resource">
-             <input type="java.lang.Object"/>
-          </propertySection>
-       </propertySections>
-    </extension>
-    <extension
-          point="org.eclipse.ui.navigator.linkHelper">
-       <linkHelper
-             class="org.eclipse.ui.internal.navigator.resources.workbench.ResourceLinkHelper"
-             id="org.eclipse.ui.navigator.resources.linkHelper">
-          <selectionEnablement>
-             <instanceof value="org.eclipse.core.resources.IFile"/>
-          </selectionEnablement>
-          <editorInputEnablement>
-             <instanceof value="org.eclipse.ui.IFileEditorInput"/>
-          </editorInputEnablement>
-       </linkHelper>
-    </extension>
-	<extension
-      point="org.eclipse.ui.perspectiveExtensions">
-    	<perspectiveExtension targetID = "org.eclipse.ui.resourcePerspective">
-		    <showInPart id = "org.eclipse.ui.navigator.ProjectExplorer"/>
-    	</perspectiveExtension>
-   	</extension>    
-</plugin> 
diff --git a/bundles/org.eclipse.ui.navigator.resources/prepareforpii.xml b/bundles/org.eclipse.ui.navigator.resources/prepareforpii.xml
deleted file mode 100644
index b2cc36f..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/prepareforpii.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<project name="PrepareForPII" default="main" basedir=".">
-		
-	<!-- Setup temp variables -->
-	<target name="init">
-		<property name="nlsDir" value="d:/NLS/Corona/0526"/>
-		<property name="plugin" value="org.eclipse.ui.workbench.navigator"/>
-		<property name="plugindir" value="d:/workspaceCorona/${plugin}"/>
-		<property name="outputDir" value="${nlsDir}/${plugin}"/>
-		
-	
-	</target>
-
-	<!-- Create the destination dir -->
-	<target name="nlsDir" depends="init">
-		<mkdir dir="${nlsDir}"/>
-	</target>
-	
-	<!-- Create the destination dir -->
-	<target name="plugindir" depends="nlsDir">
-		<delete dir="${outputDir}"/>
-		<mkdir dir="${outputDir}"/>
-	</target>
-
-	<!-- Move the files to the correct locations in the workspace. -->
-	<target name="main" depends="plugindir">
-		<messageIdGen folderPath = "${plugindir}" componentId = "E" />
-		
-		<copy todir = "${outputDir}/property_files" >
-			 <fileset dir="${plugindir}/property_files">
-           	  <include name="**/*.properties"/>
-  			 </fileset>
-  		</copy>
-  		
-		<copy file="${plugindir}/plugin.properties" todir="${outputDir}"/>
-  		
-	</target>
-</project>
diff --git a/bundles/org.eclipse.ui.navigator.resources/scripts/src.jardesc b/bundles/org.eclipse.ui.navigator.resources/scripts/src.jardesc
deleted file mode 100644
index 6d2b77c..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/scripts/src.jardesc
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<jardesc>
-	<jar path="C:/dev/workspaces/general-purpose-navigator/org.eclipse.ui.workbench.navigator/wbnavigator.jar"/>
-	<options compress="true"
-		descriptionLocation="/org.eclipse.ui.workbench.navigator/scripts/src.jardesc"
-		exportErrors="true" exportWarnings="true" logErrors="true"
-		logWarnings="true" overwrite="false" saveDescription="true" useSourceFolders="false"/>
-	<manifest generateManifest="false"
-		manifestLocation="/org.eclipse.ui.workbench.navigator/src/META-INF/MANIFEST.MF"
-		manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="false">
-		<sealing sealJar="false"><packagesToSeal/><packagesToUnSeal/></sealing>
-	</manifest>
-	<selectedElements exportClassFiles="true" exportJavaFiles="false">
-		<javaElement handleIdentifier="=org.eclipse.ui.workbench.navigator/src"/>
-	</selectedElements>
-</jardesc>
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/CopyAction.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/CopyAction.java
deleted file mode 100644
index 7c1239b..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/CopyAction.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.SelectionListenerAction;
-import org.eclipse.ui.part.ResourceTransfer;
-import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorMessages;
-
-/**
- * Standard action for copying the currently selected resources to the clipboard.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @since 2.0
- */
-/*package*/class CopyAction extends SelectionListenerAction {
-
-    /**
-     * The id of this action.
-     */
-    public static final String ID = PlatformUI.PLUGIN_ID + ".CopyAction"; //$NON-NLS-1$
-
-    /**
-     * The shell in which to show any dialogs.
-     */
-    private Shell shell;
-
-    /**
-     * System clipboard
-     */
-    private Clipboard clipboard;
-
-    /**
-     * Associated paste action. May be <code>null</code>
-     */
-    private PasteAction pasteAction;
-
-    /**
-     * Creates a new action.
-     *
-     * @param shell the shell for any dialogs
-     * @param clipboard a platform clipboard
-     */
-    public CopyAction(Shell shell, Clipboard clipboard) {
-        super(WorkbenchNavigatorMessages.CopyAction_Cop_); 
-        Assert.isNotNull(shell);
-        Assert.isNotNull(clipboard);
-        this.shell = shell;
-        this.clipboard = clipboard;
-        setToolTipText(WorkbenchNavigatorMessages.CopyAction_Copy_selected_resource_s_); 
-        setId(CopyAction.ID);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this, "CopyHelpId"); //$NON-NLS-1$
-				// TODO INavigatorHelpContextIds.COPY_ACTION);
-    }
-
-    /**
-     * Creates a new action.
-     *
-     * @param shell the shell for any dialogs
-     * @param clipboard a platform clipboard
-     * @param pasteAction a paste action
-     * 
-     * @since 2.0
-     */
-    public CopyAction(Shell shell, Clipboard clipboard, PasteAction pasteAction) {
-        this(shell, clipboard);
-        this.pasteAction = pasteAction;
-    }
-
-    /**
-     * The <code>CopyAction</code> implementation of this method defined 
-     * on <code>IAction</code> copies the selected resources to the 
-     * clipboard.
-     */
-    public void run() {
-        List selectedResources = getSelectedResources();
-        IResource[] resources = (IResource[]) selectedResources
-                .toArray(new IResource[selectedResources.size()]);
-
-        // Get the file names and a string representation
-        final int length = resources.length;
-        int actualLength = 0;
-        String[] fileNames = new String[length];
-        StringBuffer buf = new StringBuffer();
-        for (int i = 0; i < length; i++) {
-            IPath location = resources[i].getLocation();
-            // location may be null. See bug 29491.
-            if (location != null) {
-				fileNames[actualLength++] = location.toOSString();
-			}
-            if (i > 0) {
-				buf.append("\n"); //$NON-NLS-1$
-			}
-            buf.append(resources[i].getName());
-        }
-        // was one or more of the locations null?
-        if (actualLength < length) {
-            String[] tempFileNames = fileNames;
-            fileNames = new String[actualLength];
-            for (int i = 0; i < actualLength; i++) {
-				fileNames[i] = tempFileNames[i];
-			}
-        }
-        setClipboard(resources, fileNames, buf.toString());
-
-        // update the enablement of the paste action
-        // workaround since the clipboard does not suppot callbacks
-        if (pasteAction != null && pasteAction.getStructuredSelection() != null) {
-			pasteAction.selectionChanged(pasteAction.getStructuredSelection());
-		}
-    }
-
-    /**
-     * Set the clipboard contents. Prompt to retry if clipboard is busy.
-     * 
-     * @param resources the resources to copy to the clipboard
-     * @param fileNames file names of the resources to copy to the clipboard
-     * @param names string representation of all names
-     */
-    private void setClipboard(IResource[] resources, String[] fileNames,
-            String names) {
-        try {
-            // set the clipboard contents
-            if (fileNames.length > 0) {
-                clipboard.setContents(new Object[] { resources, fileNames,
-                        names },
-                        new Transfer[] { ResourceTransfer.getInstance(),
-                                FileTransfer.getInstance(),
-                                TextTransfer.getInstance() });
-            } else {
-                clipboard.setContents(new Object[] { resources, names },
-                        new Transfer[] { ResourceTransfer.getInstance(),
-                                TextTransfer.getInstance() });
-            }
-        } catch (SWTError e) {
-            if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD) {
-				throw e;
-			}
-            if (MessageDialog
-                    .openQuestion(
-                            shell,
-                            "Problem with copy title", // TODO ResourceNavigatorMessages.CopyToClipboardProblemDialog_title,  //$NON-NLS-1$
-                            "Problem with copy.")) { //$NON-NLS-1$
-				setClipboard(resources, fileNames, names);
-			}
-        }
-    }
-
-    /**
-     * The <code>CopyAction</code> implementation of this
-     * <code>SelectionListenerAction</code> method enables this action if 
-     * one or more resources of compatible types are selected.
-     */
-    protected boolean updateSelection(IStructuredSelection selection) {
-        if (!super.updateSelection(selection)) {
-			return false;
-		}
-
-        if (getSelectedNonResources().size() > 0) {
-			return false;
-		}
-
-        List selectedResources = getSelectedResources();
-        if (selectedResources.size() == 0) {
-			return false;
-		}
-
-        boolean projSelected = selectionIsOfType(IResource.PROJECT);
-        boolean fileFoldersSelected = selectionIsOfType(IResource.FILE
-                | IResource.FOLDER);
-        if (!projSelected && !fileFoldersSelected) {
-			return false;
-		}
-
-        // selection must be homogeneous
-        if (projSelected && fileFoldersSelected) {
-			return false;
-		}
-
-        // must have a common parent	
-        IContainer firstParent = ((IResource) selectedResources.get(0))
-                .getParent();
-        if (firstParent == null) {
-			return false;
-		}
-
-        Iterator resourcesEnum = selectedResources.iterator();
-        while (resourcesEnum.hasNext()) {
-            IResource currentResource = (IResource) resourcesEnum.next();
-            if (!currentResource.getParent().equals(firstParent)) {
-				return false;
-			}
-            // resource location must exist
-            if (currentResource.getLocationURI() == null) {
-				return false;
-			}
-        }
-
-        return true;
-    }
-
-}
-
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/EditActionGroup.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/EditActionGroup.java
deleted file mode 100644
index 96cdfc6..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/EditActionGroup.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.ui.actions.DeleteResourceAction;
-import org.eclipse.ui.navigator.ICommonMenuConstants;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-
-/**
- * @since 3.2
- * 
- */
-public class EditActionGroup extends ActionGroup {
-
-	private Clipboard clipboard;
-
-	private CopyAction copyAction;
-
-	private DeleteResourceAction deleteAction;
-
-	private PasteAction pasteAction;
-
-	private TextActionHandler textActionHandler;
-
-	private Shell shell;
-
-	/**
-	 * 
-	 * @param aShell
-	 */
-	public EditActionGroup(Shell aShell) {
-		shell = aShell;
-		makeActions();
-	}
-
-	public void dispose() {
-		if (clipboard != null) {
-			clipboard.dispose();
-			clipboard = null;
-		}
-		super.dispose();
-	}
-
-	public void fillContextMenu(IMenuManager menu) {
-		IStructuredSelection selection = (IStructuredSelection) getContext().getSelection();
-
-		boolean anyResourceSelected = !selection.isEmpty()
-				&& ResourceSelectionUtil.allResourcesAreOfType(selection, IResource.PROJECT | IResource.FOLDER | IResource.FILE);
-
-		copyAction.selectionChanged(selection);
-		menu.appendToGroup(ICommonMenuConstants.GROUP_EDIT, copyAction);
-		pasteAction.selectionChanged(selection);
-		// menu.insertAfter(copyAction.getId(), pasteAction);
-		menu.appendToGroup(ICommonMenuConstants.GROUP_EDIT, pasteAction);
-
-		if (anyResourceSelected) {
-			deleteAction.selectionChanged(selection);
-			// menu.insertAfter(pasteAction.getId(), deleteAction);
-			menu.appendToGroup(ICommonMenuConstants.GROUP_EDIT, deleteAction);
-		}
-	}
-
-	public void fillActionBars(IActionBars actionBars) {
-
-		if (textActionHandler == null) {
-			textActionHandler = new TextActionHandler(actionBars); // hook
-																	// handlers
-		}
-		textActionHandler.setCopyAction(copyAction);
-		textActionHandler.setPasteAction(pasteAction);
-		textActionHandler.setDeleteAction(deleteAction);
-		// renameAction.setTextActionHandler(textActionHandler);
-		updateActionBars();
-
-		textActionHandler.updateActionBars();
-	}
-
-	/**
-	 * Handles a key pressed event by invoking the appropriate action.
-	 * 
-	 * @param event
-	 *            The Key Event
-	 */
-	public void handleKeyPressed(KeyEvent event) {
-		if (event.character == SWT.DEL && event.stateMask == 0) {
-			if (deleteAction.isEnabled()) {
-				deleteAction.run();
-			}
-
-			// Swallow the event.
-			event.doit = false;
-		}
-	}
-
-	protected void makeActions() {
-		clipboard = new Clipboard(shell.getDisplay());
-
-		pasteAction = new PasteAction(shell, clipboard);
-		ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
-		pasteAction.setDisabledImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED));
-		pasteAction.setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
-		pasteAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.PASTE);
-
-		copyAction = new CopyAction(shell, clipboard, pasteAction);
-		copyAction.setDisabledImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_COPY_DISABLED));
-		copyAction.setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
-		copyAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.COPY);
-
-		IShellProvider sp = new IShellProvider() {
-			public Shell getShell() {
-				return shell;
-			}
-		};
-
-		deleteAction = new DeleteResourceAction(sp);
-		deleteAction.setDisabledImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE_DISABLED));
-		deleteAction.setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
-		deleteAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.DELETE);
-	}
-
-	public void updateActionBars() {
-		IStructuredSelection selection = (IStructuredSelection) getContext().getSelection();
-
-		copyAction.selectionChanged(selection);
-		pasteAction.selectionChanged(selection);
-		deleteAction.selectionChanged(selection);
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/EditActionProvider.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/EditActionProvider.java
deleted file mode 100644
index 8d58dba..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/EditActionProvider.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-
-/**
- * @since 3.2
- *
- */
-public class EditActionProvider extends CommonActionProvider {
-	 
-	private EditActionGroup editGroup;
-
-	private ICommonActionExtensionSite site;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.CommonActionProvider#init(org.eclipse.ui.navigator.ICommonActionExtensionSite)
-	 */
-	public void init(ICommonActionExtensionSite anActionSite) {
-		site = anActionSite;
-		editGroup = new EditActionGroup(site.getViewSite().getShell());
- 
-	}
-
-	public void dispose() { 
-		editGroup.dispose();
-	}
-
-	public void fillActionBars(IActionBars actionBars) { 
-		editGroup.fillActionBars(actionBars);
-	}
-
-	public void fillContextMenu(IMenuManager menu) { 
-		editGroup.fillContextMenu(menu);
-	}
-
-	public void setContext(ActionContext context) { 
-		editGroup.setContext(context);
-	}
-
-	public void updateActionBars() { 
-		editGroup.updateActionBars();
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/NewActionProvider.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/NewActionProvider.java
deleted file mode 100644
index aa40f4a..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/NewActionProvider.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.NewExampleAction;
-import org.eclipse.ui.actions.NewProjectAction;
-import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorMessages;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-import org.eclipse.ui.navigator.ICommonMenuConstants;
-import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
-import org.eclipse.ui.navigator.WizardActionGroup;
-import org.eclipse.ui.wizards.IWizardCategory;
-import org.eclipse.ui.wizards.IWizardRegistry;
-
-/**
- * Provides the new (artifact creation) menu options for a context menu.
- * 
- * <p>
- * The added submenu has the following structure
- * </p>
- * 
- * <ul>
- * <li>a new generic project wizard shortcut action, </li>
- * <li>a separator, </li>
- * <li>a set of context senstive wizard shortcuts (as defined by
- * <b>org.eclipse.ui.navigator.commonWizard</b>), </li>
- * <li>another separator, </li>
- * <li>a generic examples wizard shortcut action, and finally </li>
- * <li>a generic "Other" new wizard shortcut action</li>
- * </ul>
- * 
- * @since 3.2
- * 
- */
-public class NewActionProvider extends CommonActionProvider {
-
-	private static final String FULL_EXAMPLES_WIZARD_CATEGORY = "org.eclipse.ui.Examples"; //$NON-NLS-1$
-
-	private static final String NEW_MENU_NAME = "common.new.menu";//$NON-NLS-1$
-
-	private ActionFactory.IWorkbenchAction showDlgAction;
-
-	private IAction newProjectAction;
-
-	private IAction newExampleAction;
-
-	private WizardActionGroup newWizardActionGroup;
-
-	private boolean contribute = false;
-
-	public void init(ICommonActionExtensionSite anExtensionSite) {
-
-		if (anExtensionSite.getViewSite() instanceof ICommonViewerWorkbenchSite) {
-			IWorkbenchWindow window = ((ICommonViewerWorkbenchSite) anExtensionSite.getViewSite()).getWorkbenchWindow();
-			showDlgAction = ActionFactory.NEW.create(window);
-			newProjectAction = new NewProjectAction(window);
-			newExampleAction = new NewExampleAction(window);
-
-			newWizardActionGroup = new WizardActionGroup(window, PlatformUI.getWorkbench().getNewWizardRegistry(), WizardActionGroup.TYPE_NEW, anExtensionSite.getContentService());
-
-			contribute = true;
-		}
-	}
-
-	/**
-	 * Adds a submenu to the given menu with the name "group.new" see
-	 * {@link ICommonMenuConstants#GROUP_NEW}). The submenu contains the following structure:
-	 * 
-	 * <ul>
-	 * <li>a new generic project wizard shortcut action, </li>
-	 * <li>a separator, </li>
-	 * <li>a set of context senstive wizard shortcuts (as defined by
-	 * <b>org.eclipse.ui.navigator.commonWizard</b>), </li>
-	 * <li>another separator, </li>
-	 * <li>a generic examples wizard shortcut action, and finally </li>
-	 * <li>a generic "Other" new wizard shortcut action</li>
-	 * </ul>
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		IMenuManager submenu = new MenuManager(
-				WorkbenchNavigatorMessages.NewActionProvider_NewMenu_label,
-				NEW_MENU_NAME);
-		if(!contribute) {
-			return;
-		}
-		// Add new project wizard shortcut
-		submenu.add(newProjectAction);
-		submenu.add(new Separator());
-
-		// fill the menu from the commonWizard contributions
-		newWizardActionGroup.setContext(getContext());
-		newWizardActionGroup.fillContextMenu(submenu);
-
-		submenu.add(new Separator(ICommonMenuConstants.GROUP_ADDITIONS));
-
-		// if there are examples, then add them to the end of the menu
-		if (hasExamples()) {
-			submenu.add(new Separator());
-			submenu.add(newExampleAction);
-		}
-
-		// Add other ..
-		submenu.add(new Separator());
-		submenu.add(showDlgAction);
-
-		// append the submenu after the GROUP_NEW group.
-		menu.insertAfter(ICommonMenuConstants.GROUP_NEW, submenu);
-	}
-
-	/**
-	 * Return whether or not any examples are in the current install.
-	 * 
-	 * @return True if there exists a full examples wizard category.
-	 */
-	private boolean hasExamples() {
-		IWizardRegistry newRegistry = PlatformUI.getWorkbench().getNewWizardRegistry();
-		IWizardCategory category = newRegistry.findCategory(FULL_EXAMPLES_WIZARD_CATEGORY);
-		return category != null;
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.ActionGroup#dispose()
-	 */
-	public void dispose() {
-		if (showDlgAction!=null) {
-			showDlgAction.dispose();
-			showDlgAction = null;
-		}
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/OpenActionProvider.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/OpenActionProvider.java
deleted file mode 100644
index 3561746..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/OpenActionProvider.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.OpenFileAction;
-import org.eclipse.ui.actions.OpenWithMenu;
-import org.eclipse.ui.internal.navigator.AdaptabilityUtility;
-import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorMessages;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionConstants;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-import org.eclipse.ui.navigator.ICommonMenuConstants;
-import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
-
-/**
- * Provides the open and open with menus for IResources.
- * 
- * @since 3.2
- * 
- */
-public class OpenActionProvider extends CommonActionProvider {
-
-	private OpenFileAction openFileAction;
-
-	private ICommonViewerWorkbenchSite viewSite = null;
-
-	private boolean contribute = false;
-
-	public void init(ICommonActionExtensionSite aConfig) {
-		if (aConfig.getViewSite() instanceof ICommonViewerWorkbenchSite) {
-			viewSite = (ICommonViewerWorkbenchSite) aConfig.getViewSite();
-			openFileAction = new OpenFileAction(viewSite.getPage());
-			contribute = true;
-		}
-	}
-
-	public void fillContextMenu(IMenuManager aMenu) {
-		if (!contribute || getContext().getSelection().isEmpty()) {
-			return;
-		}
-
-		IStructuredSelection selection = (IStructuredSelection) getContext()
-				.getSelection();
-
-		openFileAction.selectionChanged(selection);
-		if (openFileAction.isEnabled()) {
-			aMenu.insertAfter(ICommonMenuConstants.GROUP_OPEN, openFileAction);
-		}
-		addOpenWithMenu(aMenu);
-	}
-
-	public void fillActionBars(IActionBars theActionBars) {
-		if (!contribute) {
-			return;
-		}
-		IStructuredSelection selection = (IStructuredSelection) getContext()
-				.getSelection();
-		if (selection.size() == 1
-				&& selection.getFirstElement() instanceof IFile) {
-			openFileAction.selectionChanged(selection);
-			theActionBars.setGlobalActionHandler(ICommonActionConstants.OPEN,
-					openFileAction);
-		}
-
-	}
-
-	private void addOpenWithMenu(IMenuManager aMenu) {
-		IStructuredSelection ss = (IStructuredSelection) getContext()
-				.getSelection();
-
-		if (ss == null || ss.size() != 1) {
-			return;
-		}
-
-		Object o = ss.getFirstElement();
-
-		// first try IResource
-		IAdaptable openable = (IAdaptable) AdaptabilityUtility.getAdapter(o,
-				IResource.class);
-		// otherwise try ResourceMapping
-		if (openable == null) {
-			openable = (IAdaptable) AdaptabilityUtility.getAdapter(o,
-					ResourceMapping.class);
-		} else if (((IResource) openable).getType() != IResource.FILE) {
-			openable = null;
-		}
-
-		if (openable != null) {
-			// Create a menu flyout.
-			IMenuManager submenu = new MenuManager(
-					WorkbenchNavigatorMessages.OpenActionProvider_OpenWithMenu_label,
-					ICommonMenuConstants.GROUP_OPEN_WITH);
-			submenu.add(new GroupMarker(ICommonMenuConstants.GROUP_TOP));
-			submenu.add(new OpenWithMenu(viewSite.getPage(), openable)); 
-			submenu.add(new GroupMarker(ICommonMenuConstants.GROUP_ADDITIONS));
-
-			// Add the submenu.
-			if (submenu.getItems().length > 2 && submenu.isEnabled()) {
-				aMenu.appendToGroup(ICommonMenuConstants.GROUP_OPEN_WITH,
-						submenu);
-			}
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/PasteAction.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/PasteAction.java
deleted file mode 100644
index d82ac8b..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/PasteAction.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.CopyFilesAndFoldersOperation;
-import org.eclipse.ui.actions.CopyProjectOperation;
-import org.eclipse.ui.actions.SelectionListenerAction;
-import org.eclipse.ui.part.ResourceTransfer;
-import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorMessages;
-
-/**
- * Standard action for pasting resources on the clipboard to the selected resource's location.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @since 2.0
- */
-/*package*/class PasteAction extends SelectionListenerAction {
-
-    /**
-     * The id of this action.
-     */
-    public static final String ID = PlatformUI.PLUGIN_ID + ".PasteAction";//$NON-NLS-1$
-
-    /**
-     * The shell in which to show any dialogs.
-     */
-    private Shell shell;
-
-    /**
-     * System clipboard
-     */
-    private Clipboard clipboard;
-
-    /**
-     * Creates a new action.
-     *
-     * @param shell the shell for any dialogs
-     * @param clipboard the clipboard
-     */
-    public PasteAction(Shell shell, Clipboard clipboard) {
-        super(WorkbenchNavigatorMessages.PasteAction_Past_); 
-        Assert.isNotNull(shell);
-        Assert.isNotNull(clipboard);
-        this.shell = shell;
-        this.clipboard = clipboard;
-        setToolTipText(WorkbenchNavigatorMessages.PasteAction_Paste_selected_resource_s_); 
-        setId(PasteAction.ID);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this, "HelpId"); //$NON-NLS-1$
-				// TODO INavigatorHelpContextIds.PASTE_ACTION);
-    }
-
-    /**
-     * Returns the actual target of the paste action. Returns null
-     * if no valid target is selected.
-     * 
-     * @return the actual target of the paste action
-     */
-    private IResource getTarget() {
-        List selectedResources = getSelectedResources();
-
-        for (int i = 0; i < selectedResources.size(); i++) {
-            IResource resource = (IResource) selectedResources.get(i);
-
-            if (resource instanceof IProject && !((IProject) resource).isOpen()) {
-				return null;
-			}
-            if (resource.getType() == IResource.FILE) {
-				resource = resource.getParent();
-			}
-            if (resource != null) {
-				return resource;
-			}
-        }
-        return null;
-    }
-
-    /**
-     * Returns whether any of the given resources are linked resources.
-     * 
-     * @param resources resource to check for linked type. may be null
-     * @return true=one or more resources are linked. false=none of the 
-     * 	resources are linked
-     */
-    private boolean isLinked(IResource[] resources) {
-        for (int i = 0; i < resources.length; i++) {
-            if (resources[i].isLinked()) {
-				return true;
-			}
-        }
-        return false;
-    }
-
-    /**
-     * Implementation of method defined on <code>IAction</code>.
-     */
-    public void run() {
-        // try a resource transfer
-        ResourceTransfer resTransfer = ResourceTransfer.getInstance();
-        IResource[] resourceData = (IResource[]) clipboard
-                .getContents(resTransfer);
-
-        if (resourceData != null && resourceData.length > 0) {
-            if (resourceData[0].getType() == IResource.PROJECT) {
-                // enablement checks for all projects
-                for (int i = 0; i < resourceData.length; i++) {
-                    CopyProjectOperation operation = new CopyProjectOperation(
-                            this.shell);
-                    operation.copyProject((IProject) resourceData[i]);
-                }
-            } else {
-                // enablement should ensure that we always have access to a container
-                IContainer container = getContainer();
-
-                CopyFilesAndFoldersOperation operation = new CopyFilesAndFoldersOperation(
-                        this.shell);
-                operation.copyResources(resourceData, container);
-            }
-            return;
-        }
-
-        // try a file transfer
-        FileTransfer fileTransfer = FileTransfer.getInstance();
-        String[] fileData = (String[]) clipboard.getContents(fileTransfer);
-
-        if (fileData != null) {
-            // enablement should ensure that we always have access to a container
-            IContainer container = getContainer();
-
-            CopyFilesAndFoldersOperation operation = new CopyFilesAndFoldersOperation(
-                    this.shell);
-            operation.copyFiles(fileData, container);
-        }
-    }
-
-    /**
-     * Returns the container to hold the pasted resources.
-     */
-    private IContainer getContainer() {
-        List selection = getSelectedResources();
-        if (selection.get(0) instanceof IFile) {
-			return ((IFile) selection.get(0)).getParent();
-		}
-        return (IContainer) selection.get(0);
-    }
-
-    /**
-     * The <code>PasteAction</code> implementation of this
-     * <code>SelectionListenerAction</code> method enables this action if 
-     * a resource compatible with what is on the clipboard is selected.
-     * 
-     * -Clipboard must have IResource or java.io.File
-     * -Projects can always be pasted if they are open
-     * -Workspace folder may not be copied into itself
-     * -Files and folders may be pasted to a single selected folder in open 
-     * 	project or multiple selected files in the same folder 
-     */
-    protected boolean updateSelection(IStructuredSelection selection) {
-        if (!super.updateSelection(selection)) {
-			return false;
-		}
-
-        final IResource[][] clipboardData = new IResource[1][];
-        shell.getDisplay().syncExec(new Runnable() {
-            public void run() {
-                // clipboard must have resources or files
-                ResourceTransfer resTransfer = ResourceTransfer.getInstance();
-                clipboardData[0] = (IResource[]) clipboard
-                        .getContents(resTransfer);
-            }
-        });
-        IResource[] resourceData = clipboardData[0];
-        boolean isProjectRes = resourceData != null && resourceData.length > 0
-                && resourceData[0].getType() == IResource.PROJECT;
-
-        if (isProjectRes) {
-            for (int i = 0; i < resourceData.length; i++) {
-                // make sure all resource data are open projects
-                // can paste open projects regardless of selection
-                if (resourceData[i].getType() != IResource.PROJECT
-                        || ((IProject) resourceData[i]).isOpen() == false) {
-					return false;
-				}
-            }
-            return true;
-        }
-
-        if (getSelectedNonResources().size() > 0) {
-			return false;
-		}
-
-        IResource targetResource = getTarget();
-        // targetResource is null if no valid target is selected (e.g., open project) 
-        // or selection is empty	
-        if (targetResource == null) {
-			return false;
-		}
-
-        // can paste files and folders to a single selection (file, folder, 
-        // open project) or multiple file selection with the same parent
-        List selectedResources = getSelectedResources();
-        if (selectedResources.size() > 1) {
-            for (int i = 0; i < selectedResources.size(); i++) {
-                IResource resource = (IResource) selectedResources.get(i);
-                if (resource.getType() != IResource.FILE) {
-					return false;
-				}
-                if (!targetResource.equals(resource.getParent())) {
-					return false;
-				}
-            }
-        }
-        if (resourceData != null) {
-            // linked resources can only be pasted into projects
-            if (isLinked(resourceData)
-                && targetResource.getType() != IResource.PROJECT
-                && targetResource.getType() != IResource.FOLDER) {
-				return false;
-			}
-
-            if (targetResource.getType() == IResource.FOLDER) {
-                // don't try to copy folder to self
-                for (int i = 0; i < resourceData.length; i++) {
-                    if (targetResource.equals(resourceData[i])) {
-						return false;
-					}
-                }
-            }
-            return true;
-        }
-        TransferData[] transfers = clipboard.getAvailableTypes();
-        FileTransfer fileTransfer = FileTransfer.getInstance();
-        for (int i = 0; i < transfers.length; i++) {
-            if (fileTransfer.isSupportedType(transfers[i])) {
-				return true;
-			}
-        }
-        return false;
-    }
-}
-
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/PortingActionProvider.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/PortingActionProvider.java
deleted file mode 100644
index b6bd89b..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/PortingActionProvider.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *      IBM Corporation - initial API and implementation 
- *  	Sebastian Davids <sdavids@gmx.de> - Collapse all action
- *      Sebastian Davids <sdavids@gmx.de> - Images for menu items
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import java.net.URL;
-import java.util.Collections;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ExportResourcesAction;
-import org.eclipse.ui.actions.ImportResourcesAction;
-import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorMessages;
-import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorPlugin;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-import org.eclipse.ui.navigator.ICommonMenuConstants;
-import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
-import org.eclipse.ui.navigator.WizardActionGroup;
-
-/**
- * Adds actions for Import/Export wizards. The group is smart, in that it will
- * either add actions for Import and Export, or if there are context sensitive
- * options available (as defined by <b>org.eclipse.ui.navigator.commonWizard</b>),
- * then it will compound these options into a submenu with the appropriate lead
- * text ("Import" or "Export").
- * 
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- */
-public class PortingActionProvider extends CommonActionProvider {
-
-	private static final String COMMON_NAVIGATOR_IMPORT_MENU = "common.import.menu"; //$NON-NLS-1$
-
-	private static final String COMMON_NAVIGATOR_EXPORT_MENU = "common.export.menu"; //$NON-NLS-1$	
-
-	private ImportResourcesAction importAction;
-
-	private ExportResourcesAction exportAction;
-
-	private WizardActionGroup importWizardActionGroup;
-
-	private WizardActionGroup exportWizardActionGroup;
-
-	private boolean disposed = false;
-
-	private boolean contribute= false;
-
-	public void init(ICommonActionExtensionSite anExtensionSite) {
-
-		Assert.isTrue(!disposed);
-
-		if (anExtensionSite.getViewSite() instanceof ICommonViewerWorkbenchSite) {
-
-			IWorkbenchWindow window = ((ICommonViewerWorkbenchSite) anExtensionSite
-					.getViewSite()).getWorkbenchWindow();
-			importAction = new ImportResourcesAction(window);
-			exportAction = new ExportResourcesAction(window);
-			importWizardActionGroup = new WizardActionGroup(window, PlatformUI
-					.getWorkbench().getImportWizardRegistry(),
-					WizardActionGroup.TYPE_IMPORT, anExtensionSite.getContentService());
-			exportWizardActionGroup = new WizardActionGroup(window, PlatformUI
-					.getWorkbench().getExportWizardRegistry(),
-					WizardActionGroup.TYPE_EXPORT, anExtensionSite.getContentService());
-			contribute = true;
-		}
-	}
-
-	/**
-	 * Extends the superclass implementation to dispose the subgroups.
-	 */
-	public void dispose() {
-		if(!contribute) {
-			return;
-		}
-		importWizardActionGroup.dispose();
-		exportWizardActionGroup.dispose();
-		importAction = null;
-		exportAction = null;
-		disposed = true;
-	}
-
-	public void fillContextMenu(IMenuManager aMenu) {
-		if(!contribute) {
-			return;
-		}
-
-		Assert.isTrue(!disposed);
-
-		ISelection selection = getContext().getSelection();
-		if (!(selection instanceof IStructuredSelection) || ((IStructuredSelection) selection).size() > 1) {
-			addSimplePortingMenus(aMenu);
-		} else {
-			addImportMenu(aMenu);
-			addExportMenu(aMenu);
-		}
-	}
-
-	/**
-	 * Returns the image descriptor with the given relative path.
-	 */
-	protected ImageDescriptor getImageDescriptor(String relativePath) {
-		String iconPath = "icons/full/"; //$NON-NLS-1$ 
-		URL url = FileLocator.find(WorkbenchNavigatorPlugin.getDefault().getBundle(), new Path(iconPath + relativePath), Collections.EMPTY_MAP);
-		if (url == null) {
-			return ImageDescriptor.getMissingImageDescriptor();
-		}
-		return ImageDescriptor.createFromURL(url);
-	}
-
-	private void addSimplePortingMenus(IMenuManager aMenu) {
-		aMenu.appendToGroup(ICommonMenuConstants.GROUP_PORT, importAction);
-		aMenu.appendToGroup(ICommonMenuConstants.GROUP_PORT, exportAction);
-	}
-
-	private void addImportMenu(IMenuManager aMenu) {
-
-		importWizardActionGroup.setContext(getContext());
-		if (importWizardActionGroup.getWizardActionIds().length == 0) {
-			aMenu.appendToGroup(ICommonMenuConstants.GROUP_PORT, importAction);
-			return;
-		}
-
-		IMenuManager submenu = new MenuManager(
-				WorkbenchNavigatorMessages.PortingActionProvider_ImportResourcesMenu_label,
-				COMMON_NAVIGATOR_IMPORT_MENU);
-		importWizardActionGroup.fillContextMenu(submenu);
-
-		submenu.add(new Separator(ICommonMenuConstants.GROUP_ADDITIONS));
-		submenu.add(new Separator());
-		submenu.add(importAction);
-		aMenu.appendToGroup(ICommonMenuConstants.GROUP_PORT, submenu);
-	}
-
-	private void addExportMenu(IMenuManager aMenu) {
-
-		exportWizardActionGroup.setContext(getContext());
-		if (exportWizardActionGroup.getWizardActionIds().length == 0) {
-			aMenu.appendToGroup(ICommonMenuConstants.GROUP_PORT, exportAction);
-			return;
-		}
-		IMenuManager submenu = new MenuManager(
-				WorkbenchNavigatorMessages.PortingActionProvider_ExportResourcesMenu_label,
-				COMMON_NAVIGATOR_EXPORT_MENU);
-		exportWizardActionGroup.fillContextMenu(submenu);
-
-		submenu.add(new Separator(ICommonMenuConstants.GROUP_ADDITIONS));
-		submenu.add(new Separator());
-		submenu.add(exportAction);
-		aMenu.appendToGroup(ICommonMenuConstants.GROUP_PORT, submenu);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/PropertiesActionProvider.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/PropertiesActionProvider.java
deleted file mode 100644
index 68e36f4..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/PropertiesActionProvider.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.dialogs.PropertyDialogAction;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-import org.eclipse.ui.navigator.ICommonMenuConstants;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-
-/**
- * Adds the properties action to the menu.
- * 
- * @since 3.2
- * 
- */
-public class PropertiesActionProvider extends CommonActionProvider {
-
-	private PropertyDialogAction propertiesAction;
-	private ISelectionProvider delegateSelectionProvider;
-
-	public void init(final ICommonActionExtensionSite aSite) {
-		
-		delegateSelectionProvider = new DelegateSelectionProvider( aSite.getViewSite().getSelectionProvider());
-		propertiesAction = new PropertyDialogAction(new IShellProvider() {
-			public Shell getShell() {
-				return aSite.getViewSite().getShell();
-			}
-		},delegateSelectionProvider);
-		propertiesAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.PROPERTIES); 
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		super.fillContextMenu(menu);
-
-		if (propertiesAction.isApplicableForSelection()) {
-			menu.appendToGroup(ICommonMenuConstants.GROUP_PROPERTIES,
-					propertiesAction);
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.actions.ActionGroup#fillActionBars(org.eclipse.ui.IActionBars
-	 * )
-	 */
-	public void fillActionBars(IActionBars actionBars) {
-		super.fillActionBars(actionBars);
-
-		actionBars.setGlobalActionHandler(ActionFactory.PROPERTIES.getId(),
-				propertiesAction);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#setContext(org.eclipse.ui.actions.ActionContext)
-	 */
-	public void setContext(ActionContext context) {
-		super.setContext(context);
-
-		propertiesAction.selectionChanged(delegateSelectionProvider
-				.getSelection());
-
-	}
-
-	private class DelegateIAdaptable implements IAdaptable {
-
-		private Object delegate;
-
-		private DelegateIAdaptable(Object o) {
-			delegate = o;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-		 */
-		public Object getAdapter(Class adapter) {
-			if (adapter.isInstance(delegate) || delegate == null) {
-				return delegate;
-			}
-			return Platform.getAdapterManager().getAdapter(delegate, adapter);
-		}
-	}
-
-	private class DelegateSelectionProvider implements ISelectionProvider {
-
-		private ISelectionProvider delegate;
-
-		private DelegateSelectionProvider(ISelectionProvider s) {
-			delegate = s;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-		 */
-		public void addSelectionChangedListener(
-				ISelectionChangedListener listener) {
-			delegate.addSelectionChangedListener(listener);
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-		 */
-		public ISelection getSelection() {
-			if (delegate.getSelection() instanceof IStructuredSelection) {
-				IStructuredSelection sSel = (IStructuredSelection) delegate
-						.getSelection();
-				if (sSel.getFirstElement() instanceof IAdaptable) {
-					return sSel;
-				}
-
-				return new StructuredSelection(new DelegateIAdaptable(sSel
-						.getFirstElement()));
-			}
-			return delegate.getSelection();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-		 */
-		public void removeSelectionChangedListener(
-				ISelectionChangedListener listener) {
-			delegate.removeSelectionChangedListener(listener);
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-		 */
-		public void setSelection(ISelection selection) {
-			delegate.setSelection(selection);
-
-		}
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/QuickMenuAction.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/QuickMenuAction.java
deleted file mode 100644
index c5d762d..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/QuickMenuAction.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
- 
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.keys.IBindingService;
-
-/**
- * A quick menu actions provides support to assign short cuts to sub menus.
- * 
- * Derived from the class of the same name in the JDT internals.
- * 
- * 
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * @since 3.2
- */
-public abstract class QuickMenuAction extends Action {
-
-	private static final int CHAR_INDENT = 3;
-
-	/**
-	 * Creates a new quick menu action with the given command id.
-	 * 
-	 * @param commandId
-	 *            the command id of the short cut used to open the sub menu
-	 */
-	public QuickMenuAction(String commandId) {
-		setActionDefinitionId(commandId);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public void run() {
-		Display display = Display.getCurrent();
-		if (display == null) {
-			return;
-		}
-		Control focus = display.getFocusControl();
-		if (focus == null || focus.isDisposed()) {
-			return;
-		}
-
-		MenuManager menu = new MenuManager();
-		fillMenu(menu);
-		final Menu widget = menu.createContextMenu(focus.getShell());
-		Point location = computeMenuLocation(focus);
-		if (location == null) {
-			return;
-		}
-		widget.setLocation(location);
-		widget.setVisible(true);
-		while (!widget.isDisposed() && widget.isVisible()) {
-			if (!display.readAndDispatch()) {
-				display.sleep();
-			}
-		}
-		if (!widget.isDisposed()) {
-			widget.dispose();
-		}
-	}
-
-	/**
-	 * Hook to fill a menu manager with the items of the sub menu.
-	 * 
-	 * @param menu
-	 *            the sub menu to fill
-	 */
-	protected abstract void fillMenu(IMenuManager menu);
-
-	/**
-	 * Returns the short cut assigned to the sub menu or <code>null</code> if no short cut is
-	 * assigned.
-	 * 
-	 * @return the short cut as a human readable string or <code>null</code>
-	 */
-	public String getShortCutString() {
-		IBindingService bindingService= (IBindingService)PlatformUI.getWorkbench().getAdapter(IBindingService.class);
-		if (bindingService == null)
-			return null;
-		return bindingService.getBestActiveBindingFormattedFor(getActionDefinitionId());
-	}
-
-	private Point computeMenuLocation(Control focus) {
-		Point cursorLocation = focus.getDisplay().getCursorLocation();
-		Rectangle clientArea = null;
-		Point result = null;
-		if (focus instanceof StyledText) {
-			StyledText styledText = (StyledText) focus;
-			clientArea = styledText.getClientArea();
-			result = computeMenuLocation(styledText);
-		} else if (focus instanceof Tree) {
-			Tree tree = (Tree) focus;
-			clientArea = tree.getClientArea();
-			result = computeMenuLocation(tree);
-		} else if (focus instanceof Table) {
-			Table table = (Table) focus;
-			clientArea = table.getClientArea();
-			result = computeMenuLocation(table);
-		}
-		if (result == null) {
-			result = focus.toControl(cursorLocation);
-		}
-		if (clientArea != null && !clientArea.contains(result)) {
-			result = new Point(clientArea.x + clientArea.width / 2, clientArea.y + clientArea.height / 2);
-		}
-		Rectangle shellArea = focus.getShell().getClientArea();
-		if (!shellArea.contains(focus.getShell().toControl(focus.toDisplay(result)))) {
-			result = new Point(shellArea.x + shellArea.width / 2, shellArea.y + shellArea.height / 2);
-		}
-		return focus.toDisplay(result);
-	}
-
-	/**
-	 * Hook to compute the menu location if the focus widget is a styled text widget.
-	 * 
-	 * @param text
-	 *            the styled text widget that has the focus
-	 * 
-	 * @return a widget relative position of the menu to pop up or <code>null</code> if now
-	 *         position inside the widget can be computed
-	 */
-	protected Point computeMenuLocation(StyledText text) {
-		Point result = text.getLocationAtOffset(text.getCaretOffset());
-		result.y += text.getLineHeight();
-		if (!text.getClientArea().contains(result)) {
-			return null;
-		}
-		return result;
-	}
-
-	/**
-	 * Hook to compute the menu location if the focus widget is a tree widget.
-	 * 
-	 * @param tree
-	 *            the tree widget that has the focus
-	 * 
-	 * @return a widget relative position of the menu to pop up or <code>null</code> if now
-	 *         position inside the widget can be computed
-	 */
-	protected Point computeMenuLocation(Tree tree) {
-		TreeItem[] items = tree.getSelection();
-		Rectangle clientArea = tree.getClientArea();
-		switch (items.length) {
-			case 0 :
-				return null;
-			case 1 :
-				Rectangle bounds = items[0].getBounds();
-				Rectangle intersect = clientArea.intersection(bounds);
-				if (intersect != null && intersect.height == bounds.height) {
-					return new Point(Math.max(0, bounds.x + getAvarageCharWith(tree) * CHAR_INDENT), bounds.y + bounds.height);
-				}
-				return null;
-
-			default :
-				Rectangle[] rectangles = new Rectangle[items.length];
-				for (int i = 0; i < rectangles.length; i++) {
-					rectangles[i] = items[i].getBounds();
-				}
-				Point cursorLocation = tree.getDisplay().getCursorLocation();
-				Point result = findBestLocation(getIncludedPositions(rectangles, clientArea), tree.toControl(cursorLocation));
-				if (result != null) {
-					result.x = result.x + getAvarageCharWith(tree) * CHAR_INDENT;
-				}
-				return result;
-		}
-	}
-
-	/**
-	 * Hook to compute the menu location if the focus widget is a table widget.
-	 * 
-	 * @param table
-	 *            the table widget that has the focus
-	 * 
-	 * @return a widget relative position of the menu to pop up or <code>null</code> if now
-	 *         position inside the widget can be computed
-	 */
-	protected Point computeMenuLocation(Table table) {
-		TableItem[] items = table.getSelection();
-		Rectangle clientArea = table.getClientArea();
-		switch (items.length) {
-			case 0 : {
-				return null;
-			}
-			case 1 : {
-				Rectangle bounds = items[0].getBounds(0);
-				Rectangle iBounds = items[0].getImageBounds(0);
-				Rectangle intersect = clientArea.intersection(bounds);
-				if (intersect != null && intersect.height == bounds.height) {
-					return new Point(Math.max(0, bounds.x + iBounds.width + getAvarageCharWith(table) * CHAR_INDENT), bounds.y + bounds.height);
-				}
-				return null;
-
-			}
-			default : {
-				Rectangle[] rectangles = new Rectangle[items.length];
-				for (int i = 0; i < rectangles.length; i++) {
-					rectangles[i] = items[i].getBounds(0);
-				}
-				Rectangle iBounds = items[0].getImageBounds(0);
-				Point cursorLocation = table.getDisplay().getCursorLocation();
-				Point result = findBestLocation(getIncludedPositions(rectangles, clientArea), table.toControl(cursorLocation));
-				if (result != null) {
-					result.x = result.x + iBounds.width + getAvarageCharWith(table) * CHAR_INDENT;
-				}
-				return result;
-			}
-		}
-	}
-
-	private Point[] getIncludedPositions(Rectangle[] rectangles, Rectangle widgetBounds) {
-		List result = new ArrayList();
-		for (int i = 0; i < rectangles.length; i++) {
-			Rectangle rectangle = rectangles[i];
-			Rectangle intersect = widgetBounds.intersection(rectangle);
-			if (intersect != null && intersect.height == rectangle.height) {
-				result.add(new Point(intersect.x, intersect.y + intersect.height));
-			}
-		}
-		return (Point[]) result.toArray(new Point[result.size()]);
-	}
-
-	private Point findBestLocation(Point[] points, Point relativeCursor) {
-		Point result = null;
-		double bestDist = Double.MAX_VALUE;
-		for (int i = 0; i < points.length; i++) {
-			Point point = points[i];
-			int a = 0;
-			int b = 0;
-			if (point.x > relativeCursor.x) {
-				a = point.x - relativeCursor.x;
-			} else {
-				a = relativeCursor.x - point.x;
-			}
-			if (point.y > relativeCursor.y) {
-				b = point.y - relativeCursor.y;
-			} else {
-				b = relativeCursor.y - point.y;
-			}
-			double dist = Math.sqrt(a * a + b * b);
-			if (dist < bestDist) {
-				result = point;
-				bestDist = dist;
-			}
-		}
-		return result;
-	}
-
-	private int getAvarageCharWith(Control control) {
-		GC gc = null;
-		try {
-			gc = new GC(control);
-			return gc.getFontMetrics().getAverageCharWidth();
-		} finally {
-			if (gc != null) {
-				gc.dispose();
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/RefactorActionGroup.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/RefactorActionGroup.java
deleted file mode 100644
index 1c2c370..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/RefactorActionGroup.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - Images for menu items (27481)
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.ui.actions.MoveResourceAction;
-import org.eclipse.ui.actions.RenameResourceAction;
-import org.eclipse.ui.navigator.ICommonMenuConstants;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-
-/**
- * This is the action group for refactor actions, including global action
- * handlers for copy, paste and delete.
- * 
- * @since 2.0
- */
-public class RefactorActionGroup extends ActionGroup {
-
-	private RenameResourceAction renameAction;
-
-	private MoveResourceAction moveAction;
-
-	private Shell shell;
-
-	private Tree tree;
-
-	/**
-	 * 
-	 * @param aShell
-	 * @param aTree
-	 */
-	public RefactorActionGroup(Shell aShell, Tree aTree) {
-		shell = aShell;
-		tree = aTree;
-		makeActions();
-	}
-
-	public void fillContextMenu(IMenuManager menu) {
-		IStructuredSelection selection = (IStructuredSelection) getContext().getSelection();
-
-		boolean anyResourceSelected = !selection.isEmpty()
-				&& ResourceSelectionUtil.allResourcesAreOfType(selection, IResource.PROJECT | IResource.FOLDER | IResource.FILE);
-
-		if (anyResourceSelected) {
-			moveAction.selectionChanged(selection);
-			menu.appendToGroup(ICommonMenuConstants.GROUP_REORGANIZE, moveAction);
-			renameAction.selectionChanged(selection);
-			menu.insertAfter(moveAction.getId(), renameAction);
-		}
-	}
-
-	public void fillActionBars(IActionBars actionBars) {
-
-		// renameAction.setTextActionHandler(textActionHandler);
-		updateActionBars();
-
-		actionBars.setGlobalActionHandler(ActionFactory.MOVE.getId(), moveAction);
-		actionBars.setGlobalActionHandler(ActionFactory.RENAME.getId(), renameAction);
-	}
-
-	/**
-	 * Handles a key pressed event by invoking the appropriate action.
-	 * 
-	 * @param event
-	 *            The Key Event
-	 */
-	public void handleKeyPressed(KeyEvent event) {
-
-		if (event.keyCode == SWT.F2 && event.stateMask == 0) {
-			if (renameAction.isEnabled()) {
-				renameAction.run();
-			}
-
-			// Swallow the event.
-			event.doit = false;
-		}
-	}
-
-	protected void makeActions() {
-		IShellProvider sp = new IShellProvider() {
-			public Shell getShell() {
-				return shell;
-			}
-		};
-
-		moveAction = new MoveResourceAction(sp);
-		moveAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.MOVE);
-
-		renameAction = new RenameResourceAction(sp, tree);
-		renameAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.RENAME);
-	}
-
-	public void updateActionBars() {
-		IStructuredSelection selection = (IStructuredSelection) getContext().getSelection();
-
-		moveAction.selectionChanged(selection);
-		renameAction.selectionChanged(selection);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/RefactorActionProvider.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/RefactorActionProvider.java
deleted file mode 100644
index 2662ffe..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/RefactorActionProvider.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Oakland Software (Francis Upton - francisu@ieee.org) 
- *        bug 214271 Undo/redo not enabled if nothing selected
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-
-/**
- * @since 3.2
- * 
- */
-public class RefactorActionProvider extends CommonActionProvider {
-
-	private RefactorActionGroup refactorGroup;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.CommonActionProvider#init(org.eclipse.ui.navigator.ICommonActionExtensionSite)
-	 */
-	public void init(ICommonActionExtensionSite anActionSite) {
-		refactorGroup = new RefactorActionGroup(anActionSite.getViewSite().getShell(), (Tree)anActionSite.getStructuredViewer().getControl());
-	}
-
-	public void dispose() {
-		refactorGroup.dispose();
-	}
-
-	public void fillActionBars(IActionBars actionBars) {
-		refactorGroup.fillActionBars(actionBars);
-	}
-
-	public void fillContextMenu(IMenuManager menu) {
-		refactorGroup.fillContextMenu(menu);
-	}
-
-	public void setContext(ActionContext context) {
-		refactorGroup.setContext(context);
-	}
-
-	public void updateActionBars() {
-		refactorGroup.updateActionBars();
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/ResourceMgmtActionProvider.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/ResourceMgmtActionProvider.java
deleted file mode 100644
index c63b070..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/ResourceMgmtActionProvider.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.ICommand;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.WorkspaceJob;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.BuildAction;
-import org.eclipse.ui.actions.CloseResourceAction;
-import org.eclipse.ui.actions.CloseUnrelatedProjectsAction;
-import org.eclipse.ui.actions.OpenResourceAction;
-import org.eclipse.ui.actions.RefreshAction;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.ide.IDEActionFactory;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-import org.eclipse.ui.navigator.ICommonMenuConstants;
-
-/**
- * @since 3.2
- * 
- */
-public class ResourceMgmtActionProvider extends CommonActionProvider {
-
-	private BuildAction buildAction;
-
-	private OpenResourceAction openProjectAction;
-
-	private CloseResourceAction closeProjectAction;
-
-	private CloseUnrelatedProjectsAction closeUnrelatedProjectsAction;
-
-	private RefreshAction refreshAction;
-
-	private Shell shell;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.navigator.CommonActionProvider#init(org.eclipse.ui.navigator
-	 * .ICommonActionExtensionSite)
-	 */
-	public void init(ICommonActionExtensionSite aSite) {
-		super.init(aSite);
-		shell = aSite.getViewSite().getShell();
-		makeActions();
-	}
-
-	public void fillActionBars(IActionBars actionBars) {
-		actionBars.setGlobalActionHandler(ActionFactory.REFRESH.getId(), refreshAction);
-		actionBars.setGlobalActionHandler(IDEActionFactory.BUILD_PROJECT.getId(), buildAction);
-		actionBars.setGlobalActionHandler(IDEActionFactory.OPEN_PROJECT.getId(), openProjectAction);
-		actionBars.setGlobalActionHandler(IDEActionFactory.CLOSE_PROJECT.getId(), closeProjectAction);
-		actionBars.setGlobalActionHandler(IDEActionFactory.CLOSE_UNRELATED_PROJECTS.getId(), closeUnrelatedProjectsAction);
-		updateActionBars();
-	}
-
-	/**
-	 * Adds the build, open project, close project and refresh resource actions
-	 * to the context menu.
-	 * <p>
-	 * The following conditions apply: build-only projects selected, auto build
-	 * disabled, at least one builder present open project-only projects
-	 * selected, at least one closed project close project-only projects
-	 * selected, at least one open project refresh-no closed project selected
-	 * </p>
-	 * <p>
-	 * Both the open project and close project action may be on the menu at the
-	 * same time.
-	 * </p>
-	 * <p>
-	 * No disabled action should be on the context menu.
-	 * </p>
-	 * 
-	 * @param menu
-	 *            context menu to add actions to
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		IStructuredSelection selection = (IStructuredSelection) getContext().getSelection();
-		boolean isProjectSelection = true;
-		boolean hasOpenProjects = false;
-		boolean hasClosedProjects = false;
-		boolean hasBuilder = true; // false if any project is closed or does not
-									// have builder
-		Iterator resources = selection.iterator();
-
-		while (resources.hasNext() && (!hasOpenProjects || !hasClosedProjects || hasBuilder || isProjectSelection)) {
-			Object next = resources.next();
-			IProject project = null;
-
-			if (next instanceof IProject) {
-				project = (IProject) next;
-			} else if (next instanceof IAdaptable) {
-				project = (IProject) ((IAdaptable) next).getAdapter(IProject.class);
-			}
-
-			if (project == null) {
-				isProjectSelection = false;
-				continue;
-			}
-			if (project.isOpen()) {
-				hasOpenProjects = true;
-				if (hasBuilder && !hasBuilder(project)) {
-					hasBuilder = false;
-				}
-			} else {
-				hasClosedProjects = true;
-				hasBuilder = false;
-			}
-		}
-		if (!selection.isEmpty() && isProjectSelection && !ResourcesPlugin.getWorkspace().isAutoBuilding() && hasBuilder) {
-			// Allow manual incremental build only if auto build is off.
-			buildAction.selectionChanged(selection);
-			menu.appendToGroup(ICommonMenuConstants.GROUP_BUILD, buildAction);
-		}
-		if (!hasClosedProjects) {
-			refreshAction.selectionChanged(selection);
-			menu.appendToGroup(ICommonMenuConstants.GROUP_BUILD, refreshAction);
-		}
-		if (isProjectSelection) {
-			if (hasClosedProjects) {
-				openProjectAction.selectionChanged(selection);
-				menu.appendToGroup(ICommonMenuConstants.GROUP_BUILD, openProjectAction);
-			}
-			if (hasOpenProjects) {
-				closeProjectAction.selectionChanged(selection);
-				menu.appendToGroup(ICommonMenuConstants.GROUP_BUILD, closeProjectAction);
-				closeUnrelatedProjectsAction.selectionChanged(selection);
-				menu.appendToGroup(ICommonMenuConstants.GROUP_BUILD, closeUnrelatedProjectsAction);
-			}
-		}
-	}
-
-	/**
-	 * Returns whether there are builders configured on the given project.
-	 * 
-	 * @return <code>true</code> if it has builders, <code>false</code> if not,
-	 *         or if this could not be determined
-	 */
-	boolean hasBuilder(IProject project) {
-		try {
-			ICommand[] commands = project.getDescription().getBuildSpec();
-			if (commands.length > 0) {
-				return true;
-			}
-		} catch (CoreException e) {
-			// Cannot determine if project has builders. Project is closed
-			// or does not exist. Fall through to return false.
-		}
-		return false;
-	}
-
-	protected void makeActions() {
-		IShellProvider sp = new IShellProvider() {
-			public Shell getShell() {
-				return shell;
-			}
-		};
-
-		openProjectAction = new OpenResourceAction(sp);
-
-		closeProjectAction = new CloseResourceAction(sp);
-
-		closeUnrelatedProjectsAction = new CloseUnrelatedProjectsAction(sp);
-
-		refreshAction = new RefreshAction(sp) {
-			public void run() {
-				final IStatus[] errorStatus = new IStatus[1];
-				errorStatus[0] = Status.OK_STATUS;
-				final WorkspaceModifyOperation op = (WorkspaceModifyOperation) createOperation(errorStatus);
-				WorkspaceJob job = new WorkspaceJob("refresh") { //$NON-NLS-1$
-
-					public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
-						try {
-							op.run(monitor);
-							if (shell != null && !shell.isDisposed()) {
-								shell.getDisplay().asyncExec(new Runnable() {
-									public void run() {
-										StructuredViewer viewer = getActionSite().getStructuredViewer();
-										if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed()) {
-											viewer.refresh();
-										}
-									}
-								});
-							}
-						} catch (InvocationTargetException e) {
-							String msg = NLS.bind(IDEWorkbenchMessages.WorkspaceAction_logTitle, getClass().getName(), e.getTargetException());
-							throw new CoreException(new Status(IStatus.ERROR, NavigatorPlugin.PLUGIN_ID, IStatus.ERROR, msg, e.getTargetException()));
-						} catch (InterruptedException e) {
-							return Status.CANCEL_STATUS;
-						}
-						return errorStatus[0];
-					}
-
-				};
-				ISchedulingRule rule = op.getRule();
-				if (rule != null) {
-					job.setRule(rule);
-				}
-				job.setUser(true);
-				job.schedule();
-			}
-		};
-		refreshAction.setDisabledImageDescriptor(getImageDescriptor("dlcl16/refresh_nav.gif"));//$NON-NLS-1$
-		refreshAction.setImageDescriptor(getImageDescriptor("elcl16/refresh_nav.gif"));//$NON-NLS-1$       
-		refreshAction.setActionDefinitionId("org.eclipse.ui.file.refresh"); //$NON-NLS-1$
-
-		buildAction = new BuildAction(sp, IncrementalProjectBuilder.INCREMENTAL_BUILD);
-		buildAction.setActionDefinitionId("org.eclipse.ui.project.buildProject"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the image descriptor with the given relative path.
-	 */
-	protected ImageDescriptor getImageDescriptor(String relativePath) {
-		return IDEWorkbenchPlugin.getIDEImageDescriptor(relativePath);
-
-	}
-
-	public void updateActionBars() {
-		IStructuredSelection selection = (IStructuredSelection) getContext().getSelection();
-		refreshAction.selectionChanged(selection);
-		buildAction.selectionChanged(selection);
-		openProjectAction.selectionChanged(selection);
-		closeUnrelatedProjectsAction.selectionChanged(selection);
-		closeProjectAction.selectionChanged(selection);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/ResourceSelectionUtil.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/ResourceSelectionUtil.java
deleted file mode 100644
index d708ad6..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/ResourceSelectionUtil.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-/**
- * Provides utilities for checking the validity of selections.
- * <p>
- * This class provides static methods only; it is not intended to be instantiated
- * or subclassed.
- * @since 2.0
- * </p>
- */
-public class ResourceSelectionUtil {
-    /* (non-Javadoc)
-     * Private constructor to block instantiation.
-     */
-    private ResourceSelectionUtil() {
-    }
-
-    /**
-     * Returns whether the types of the resources in the given selection are among 
-     * the specified resource types.
-     * 
-     * @param selection the selection
-     * @param resourceMask resource mask formed by bitwise OR of resource type
-     *   constants (defined on <code>IResource</code>)
-     * @return <code>true</code> if all selected elements are resources of the right
-     *  type, and <code>false</code> if at least one element is either a resource
-     *  of some other type or a non-resource
-     * @see IResource#getType()
-     */
-    public static boolean allResourcesAreOfType(IStructuredSelection selection,
-            int resourceMask) {
-        Iterator resources = selection.iterator();
-        while (resources.hasNext()) {
-            Object next = resources.next();
-            if (!(next instanceof IResource)) {
-				return false;
-			}
-            if (!resourceIsType((IResource) next, resourceMask)) {
-				return false;
-			}
-        }
-        return true;
-    }
-
-    /**
-     * Returns the selection adapted to IResource. Returns null
-     * if any of the entries are not adaptable.
-     * 
-     * @param selection the selection
-     * @param resourceMask resource mask formed by bitwise OR of resource type
-     *   constants (defined on <code>IResource</code>)
-     * @return IStructuredSelection or null if any of the entries are not adaptable.
-     * @see IResource#getType()
-     */
-    public static IStructuredSelection allResources(
-            IStructuredSelection selection, int resourceMask) {
-        Iterator adaptables = selection.iterator();
-        List result = new ArrayList();
-        while (adaptables.hasNext()) {
-            Object next = adaptables.next();
-            if (next instanceof IAdaptable) {
-                Object resource = ((IAdaptable) next)
-                        .getAdapter(IResource.class);
-                if (resource == null) {
-					return null;
-				} else if (resourceIsType((IResource) resource, resourceMask)) {
-					result.add(resource);
-				}
-            } else {
-				return null;
-			}
-        }
-        return new StructuredSelection(result);
-
-    }
-
-    /**
-     * Returns whether the type of the given resource is among the specified 
-     * resource types.
-     * 
-     * @param resource the resource
-     * @param resourceMask resource mask formed by bitwise OR of resource type
-     *   constants (defined on <code>IResource</code>)
-     * @return <code>true</code> if the resources has a matching type, and 
-     *   <code>false</code> otherwise
-     * @see IResource#getType()
-     */
-    public static boolean resourceIsType(IResource resource, int resourceMask) {
-        return (resource.getType() & resourceMask) != 0;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/TextActionHandler.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/TextActionHandler.java
deleted file mode 100644
index 33b194f..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/TextActionHandler.java
+++ /dev/null
@@ -1,565 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * Handles the redirection of the global Cut, Copy, Paste, and
- * Select All actions to either the current inline text control
- * or the part's supplied action handler.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p><p>
- * Example usage:
- * <pre>
- * textActionHandler = new TextActionHandler(this.getViewSite().getActionBars());
- * textActionHandler.addText((Text)textCellEditor1.getControl());
- * textActionHandler.addText((Text)textCellEditor2.getControl());
- * textActionHandler.setSelectAllAction(selectAllAction);
- * </pre>
- * </p>
- */
-public class TextActionHandler extends org.eclipse.ui.actions.TextActionHandler {
-    private DeleteActionHandler textDeleteAction = new DeleteActionHandler();
-
-    private CutActionHandler textCutAction = new CutActionHandler();
-
-    private CopyActionHandler textCopyAction = new CopyActionHandler();
-
-    private PasteActionHandler textPasteAction = new PasteActionHandler();
-
-    private SelectAllActionHandler textSelectAllAction = new SelectAllActionHandler();
-
-    private IAction deleteAction;
-
-    private IAction cutAction;
-
-    private IAction copyAction;
-
-    private IAction pasteAction;
-
-    private IAction selectAllAction;
-
-    private IPropertyChangeListener deleteActionListener = new PropertyChangeListener(
-            textDeleteAction);
-
-    private IPropertyChangeListener cutActionListener = new PropertyChangeListener(
-            textCutAction);
-
-    private IPropertyChangeListener copyActionListener = new PropertyChangeListener(
-            textCopyAction);
-
-    private IPropertyChangeListener pasteActionListener = new PropertyChangeListener(
-            textPasteAction);
-
-    private IPropertyChangeListener selectAllActionListener = new PropertyChangeListener(
-            textSelectAllAction);
-
-    private Listener textControlListener = new TextControlListener();
-
-    private Text activeTextControl;
-
-    private MouseAdapter mouseAdapter = new MouseAdapter() {
-        public void mouseUp(MouseEvent e) {
-            updateActionsEnableState();
-        }
-    };
-
-    private KeyAdapter keyAdapter = new KeyAdapter() {
-        public void keyReleased(KeyEvent e) {
-            updateActionsEnableState();
-        }
-    };
-
-	private IActionBars actionBars;
-
-    private class TextControlListener implements Listener {
-        public void handleEvent(Event event) {
-            switch (event.type) {
-            case SWT.Activate:
-                activeTextControl = (Text) event.widget;
-                updateActionsEnableState();
-                break;
-            case SWT.Deactivate:
-                activeTextControl = null;
-                updateActionsEnableState();
-                break;
-            default:
-                break;
-            }
-        }
-    }
-
-    private class PropertyChangeListener implements IPropertyChangeListener {
-        private IAction actionHandler;
-
-        protected PropertyChangeListener(IAction actionHandler) {
-            super();
-            this.actionHandler = actionHandler;
-        }
-
-        public void propertyChange(PropertyChangeEvent event) {
-            if (activeTextControl != null) {
-				return;
-			}
-            if (event.getProperty().equals(IAction.ENABLED)) {
-                Boolean bool = (Boolean) event.getNewValue();
-                actionHandler.setEnabled(bool.booleanValue());
-            }
-        }
-    }
-
-    private class DeleteActionHandler extends Action {
-        protected DeleteActionHandler() {
-            super("Delete"); // TODO IDEWorkbenchMessages.Delete); //$NON-NLS-1$
-            setId("TextDeleteActionHandler");//$NON-NLS-1$
-            setEnabled(false);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this, "DeleteHelpId"); //$NON-NLS-1$
-					// TODO IIDEHelpContextIds.TEXT_DELETE_ACTION);
-        }
-
-        public void runWithEvent(Event event) {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-				String text = activeTextControl.getText();
-				Point selection = activeTextControl.getSelection();
-				if (selection.y == selection.x) {
-					++selection.y;
-				}
-				if (selection.y > text.length()) {
-					return;
-				}
-				StringBuffer buf = new StringBuffer(text.substring(0,
-						selection.x));
-				buf.append(text.substring(selection.y));
-				activeTextControl.setText(buf.toString());
-				activeTextControl.setSelection(selection.x, selection.x);
-				updateActionsEnableState();
-				return;
-			}
-            if (deleteAction != null) {
-                deleteAction.runWithEvent(event);
-                return;
-            }
-        }
-
-        /**
-         * Update state.
-         */
-        public void updateEnabledState() {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                setEnabled(activeTextControl.getSelectionCount() > 0
-                        || activeTextControl.getCaretPosition() < activeTextControl
-                                .getCharCount());
-                return;
-            }
-            if (deleteAction != null) {
-                setEnabled(deleteAction.isEnabled());
-                return;
-            }
-            setEnabled(false);
-        }
-    }
-
-    private class CutActionHandler extends Action {
-        protected CutActionHandler() {
-            super("Cut"); // TODO IDEWorkbenchMessages.Cut); //$NON-NLS-1$
-            setId("TextCutActionHandler");//$NON-NLS-1$
-            setEnabled(false);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this, "CutHelpId"); //$NON-NLS-1$
-					// TODO IIDEHelpContextIds.TEXT_CUT_ACTION);
-        }
-
-        public void runWithEvent(Event event) {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                activeTextControl.cut();
-                updateActionsEnableState();
-                return;
-            }
-            if (cutAction != null) {
-                cutAction.runWithEvent(event);
-                return;
-            }
-        }
-
-        /**
-         * Update state.
-         */
-        public void updateEnabledState() {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                setEnabled(activeTextControl.getSelectionCount() > 0);
-                return;
-            }
-            if (cutAction != null) {
-                setEnabled(cutAction.isEnabled());
-                return;
-            }
-            setEnabled(false);
-        }
-    }
-
-    private class CopyActionHandler extends Action {
-        protected CopyActionHandler() {
-            super("Copy"); // TODO IDEWorkbenchMessages.Copy); //$NON-NLS-1$
-            setId("TextCopyActionHandler");//$NON-NLS-1$
-            setEnabled(false);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this, "CopyHelpId"); //$NON-NLS-1$
-					// TODO IIDEHelpContextIds.TEXT_COPY_ACTION);
-        }
-
-        public void runWithEvent(Event event) {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                activeTextControl.copy();
-                updateActionsEnableState();
-                return;
-            }
-            if (copyAction != null) {
-                copyAction.runWithEvent(event);
-                return;
-            }
-        }
-
-        /**
-         * Update the state.
-         */
-        public void updateEnabledState() {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                setEnabled(activeTextControl.getSelectionCount() > 0);
-                return;
-            }
-            if (copyAction != null) {
-                setEnabled(copyAction.isEnabled());
-                return;
-            }
-            setEnabled(false);
-        }
-    }
-
-    private class PasteActionHandler extends Action {
-        protected PasteActionHandler() {
-            super("Paste"); // TODO IDEWorkbenchMessages.Paste); //$NON-NLS-1$
-            setId("TextPasteActionHandler");//$NON-NLS-1$
-            setEnabled(false);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this, "PasteHelpId"); //$NON-NLS-1$
-					// TODO IIDEHelpContextIds.TEXT_PASTE_ACTION);
-        }
-
-        public void runWithEvent(Event event) {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                activeTextControl.paste();
-                updateActionsEnableState();
-                return;
-            }
-            if (pasteAction != null) {
-                pasteAction.runWithEvent(event);
-                return;
-            }
-        }
-
-        /**
-         * Update the state
-         */
-        public void updateEnabledState() {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                setEnabled(true);
-                return;
-            }
-            if (pasteAction != null) {
-                setEnabled(pasteAction.isEnabled());
-                return;
-            }
-            setEnabled(false);
-        }
-    }
-
-    private class SelectAllActionHandler extends Action {
-        protected SelectAllActionHandler() {
-            super("Select All"); // TODO IDEWorkbenchMessages.TextAction_selectAll); //$NON-NLS-1$
-            setId("TextSelectAllActionHandler");//$NON-NLS-1$
-            setEnabled(false);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this, "SelectAllHelpId"); //$NON-NLS-1$
-					// TODO IIDEHelpContextIds.TEXT_SELECT_ALL_ACTION);
-        }
-
-        public void runWithEvent(Event event) {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                activeTextControl.selectAll();
-                updateActionsEnableState();
-                return;
-            }
-            if (selectAllAction != null) {
-                selectAllAction.runWithEvent(event);
-                return;
-            }
-        }
-
-        /**
-         * Update the state.
-         */
-        public void updateEnabledState() {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                setEnabled(true);
-                return;
-            }
-            if (selectAllAction != null) {
-                setEnabled(selectAllAction.isEnabled());
-                return;
-            }
-            setEnabled(false);
-        }
-    }
-
-    /**
-     * Creates a <code>Text</code> control action handler
-     * for the global Cut, Copy, Paste, Delete, and Select All 
-     * of the action bar.
-     *
-     * @param theActionBars the action bar to register global
-     *    action handlers for Cut, Copy, Paste, Delete, 
-     * 	  and Select All
-     */
-    public TextActionHandler(IActionBars theActionBars) {
-        super(theActionBars);
-        actionBars = theActionBars;
-        updateActionBars();
-    }
-
-    /**
-	 * 
-	 */
-	public void updateActionBars() {
-		actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(),
-                textCutAction);
-		actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-                textCopyAction);
-		actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-                textPasteAction);
-		actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
-                textSelectAllAction);
-		actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-                textDeleteAction);
-	}
-
-	/**
-     * Add a <code>Text</code> control to the handler
-     * so that the Cut, Copy, Paste, Delete, and Select All 
-     * actions are redirected to it when active.
-     *
-     * @param textControl the inline <code>Text</code> control
-     */
-    public void addText(Text textControl) {
-        if (textControl == null) {
-			return;
-		}
-
-        activeTextControl = textControl;
-        textControl.addListener(SWT.Activate, textControlListener);
-        textControl.addListener(SWT.Deactivate, textControlListener);
-
-        // We really want a selection listener but it is not supported so we
-        // use a key listener and a mouse listener to know when selection changes
-        // may have occured
-        textControl.addKeyListener(keyAdapter);
-        textControl.addMouseListener(mouseAdapter);
-
-    }
-
-    /**
-     * Dispose of this action handler
-     */
-    public void dispose() {
-        setCutAction(null);
-        setCopyAction(null);
-        setPasteAction(null);
-        setSelectAllAction(null);
-        setDeleteAction(null);
-    }
-
-    /**
-     * Removes a <code>Text</code> control from the handler
-     * so that the Cut, Copy, Paste, Delete, and Select All 
-     * actions are no longer redirected to it when active.
-     *
-     * @param textControl the inline <code>Text</code> control
-     */
-    public void removeText(Text textControl) {
-        if (textControl == null) {
-			return;
-		}
-
-        textControl.removeListener(SWT.Activate, textControlListener);
-        textControl.removeListener(SWT.Deactivate, textControlListener);
-
-        textControl.removeMouseListener(mouseAdapter);
-        textControl.removeKeyListener(keyAdapter);
-
-        activeTextControl = null;
-        updateActionsEnableState();
-    }
-
-    /**
-     * Set the default <code>IAction</code> handler for the Copy
-     * action. This <code>IAction</code> is run only if no active
-     * inline text control.
-     *
-     * @param action the <code>IAction</code> to run for the
-     *    Copy action, or <code>null</code> if not interested.
-     */
-    public void setCopyAction(IAction action) {
-        if (copyAction == action) {
-			return;
-		}
-
-        if (copyAction != null) {
-			copyAction.removePropertyChangeListener(copyActionListener);
-		}
-
-        copyAction = action;
-
-        if (copyAction != null) {
-			copyAction.addPropertyChangeListener(copyActionListener);
-		}
-
-        textCopyAction.updateEnabledState();
-    }
-
-    /**
-     * Set the default <code>IAction</code> handler for the Cut
-     * action. This <code>IAction</code> is run only if no active
-     * inline text control.
-     *
-     * @param action the <code>IAction</code> to run for the
-     *    Cut action, or <code>null</code> if not interested.
-     */
-    public void setCutAction(IAction action) {
-        if (cutAction == action) {
-			return;
-		}
-
-        if (cutAction != null) {
-			cutAction.removePropertyChangeListener(cutActionListener);
-		}
-
-        cutAction = action;
-
-        if (cutAction != null) {
-			cutAction.addPropertyChangeListener(cutActionListener);
-		}
-
-        textCutAction.updateEnabledState();
-    }
-
-    /**
-     * Set the default <code>IAction</code> handler for the Paste
-     * action. This <code>IAction</code> is run only if no active
-     * inline text control.
-     *
-     * @param action the <code>IAction</code> to run for the
-     *    Paste action, or <code>null</code> if not interested.
-     */
-    public void setPasteAction(IAction action) {
-        if (pasteAction == action) {
-			return;
-		}
-
-        if (pasteAction != null) {
-			pasteAction.removePropertyChangeListener(pasteActionListener);
-		}
-
-        pasteAction = action;
-
-        if (pasteAction != null) {
-			pasteAction.addPropertyChangeListener(pasteActionListener);
-		}
-
-        textPasteAction.updateEnabledState();
-    }
-
-    /**
-     * Set the default <code>IAction</code> handler for the Select All
-     * action. This <code>IAction</code> is run only if no active
-     * inline text control.
-     *
-     * @param action the <code>IAction</code> to run for the
-     *    Select All action, or <code>null</code> if not interested.
-     */
-    public void setSelectAllAction(IAction action) {
-        if (selectAllAction == action) {
-			return;
-		}
-
-        if (selectAllAction != null) {
-			selectAllAction
-                    .removePropertyChangeListener(selectAllActionListener);
-		}
-
-        selectAllAction = action;
-
-        if (selectAllAction != null) {
-			selectAllAction.addPropertyChangeListener(selectAllActionListener);
-		}
-
-        textSelectAllAction.updateEnabledState();
-    }
-
-    /**
-     * Set the default <code>IAction</code> handler for the Delete
-     * action. This <code>IAction</code> is run only if no active
-     * inline text control.
-     *
-     * @param action the <code>IAction</code> to run for the
-     *    Delete action, or <code>null</code> if not interested.
-     */
-    public void setDeleteAction(IAction action) {
-        if (deleteAction == action) {
-			return;
-		}
-
-        if (deleteAction != null) {
-			deleteAction.removePropertyChangeListener(deleteActionListener);
-		}
-
-        deleteAction = action;
-
-        if (deleteAction != null) {
-			deleteAction.addPropertyChangeListener(deleteActionListener);
-		}
-
-        textDeleteAction.updateEnabledState();
-    }
-
-    /**
-     * Update the enable state of the Cut, Copy,
-     * Paste, Delete, and Select All action handlers
-     */
-    private void updateActionsEnableState() {
-        textCutAction.updateEnabledState();
-        textCopyAction.updateEnabledState();
-        textPasteAction.updateEnabledState();
-        textSelectAllAction.updateEnabledState();
-        textDeleteAction.updateEnabledState();
-    }
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/UndoRedoActionProvider.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/UndoRedoActionProvider.java
deleted file mode 100644
index ea15c80..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/UndoRedoActionProvider.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation 
- *       (was originally RefactorActionProvider.java)
- *     Oakland Software (Francis Upton - francisu@ieee.org) 
- *        bug 214271 Undo/redo not enabled if nothing selected
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
-import org.eclipse.ui.operations.UndoRedoActionGroup;
-
-/**
- * @since 3.4
- * 
- */
-public class UndoRedoActionProvider extends CommonActionProvider {
-
-	private UndoRedoActionGroup undoRedoGroup;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.CommonActionProvider#init(org.eclipse.ui.navigator.ICommonActionExtensionSite)
-	 */
-	public void init(ICommonActionExtensionSite anActionSite) {
-		IUndoContext workspaceContext = (IUndoContext) ResourcesPlugin
-				.getWorkspace().getAdapter(IUndoContext.class);
-		undoRedoGroup = new UndoRedoActionGroup(((ICommonViewerWorkbenchSite) anActionSite.getViewSite()).getSite(),
-				workspaceContext, true);
-	}
-
-	public void dispose() {
-		undoRedoGroup.dispose();
-	}
-
-	public void fillActionBars(IActionBars actionBars) {
-		undoRedoGroup.fillActionBars(actionBars);
-	}
-
-	public void fillContextMenu(IMenuManager menu) {
-		undoRedoGroup.fillContextMenu(menu);
-	}
-
-	public void setContext(ActionContext context) {
-		undoRedoGroup.setContext(context);
-	}
-
-	public void updateActionBars() {
-		undoRedoGroup.updateActionBars();
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/WorkManagementActionProvider.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/WorkManagementActionProvider.java
deleted file mode 100644
index a423bfc..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/WorkManagementActionProvider.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.actions.AddBookmarkAction;
-import org.eclipse.ui.actions.AddTaskAction;
-import org.eclipse.ui.ide.IDEActionFactory;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-
-/**
- * Supports Add Task and Add Bookmark actions.
- * 
- * @since 3.2
- * 
- */
-public class WorkManagementActionProvider extends CommonActionProvider {
-
-	private AddTaskAction addTaskAction;
-
-	private AddBookmarkAction addBookmarkAction;
-
-	public void init(ICommonActionExtensionSite aSite) {
-		final Shell shell = aSite.getViewSite().getShell();
-		IShellProvider sp = new IShellProvider() {
-			public Shell getShell() {
-				return shell;
-			}
-		};
-		addBookmarkAction = new AddBookmarkAction(sp, true);
-		addTaskAction = new AddTaskAction(sp);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.actions.ActionGroup#fillActionBars(org.eclipse.ui.IActionBars
-	 * )
-	 */
-	public void fillActionBars(IActionBars actionBars) {
-		super.fillActionBars(actionBars);
-		actionBars.setGlobalActionHandler(IDEActionFactory.BOOKMARK.getId(), addBookmarkAction);
-		actionBars.setGlobalActionHandler(IDEActionFactory.ADD_TASK.getId(), addTaskAction);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.actions.ActionGroup#setContext(org.eclipse.ui.actions.
-	 * ActionContext)
-	 */
-	public void setContext(ActionContext context) {
-		super.setContext(context);
-		if (context != null && context.getSelection() instanceof IStructuredSelection) {
-			IStructuredSelection sSel = (IStructuredSelection) context.getSelection();
-			addBookmarkAction.selectionChanged(sSel);
-			addTaskAction.selectionChanged(sSel);
-		} else {
-			addBookmarkAction.selectionChanged(StructuredSelection.EMPTY);
-			addTaskAction.selectionChanged(StructuredSelection.EMPTY);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/WorkingSetActionProvider.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/WorkingSetActionProvider.java
deleted file mode 100644
index a3d74d2..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/WorkingSetActionProvider.java
+++ /dev/null
@@ -1,360 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     anton.leherbauer@windriver.com - bug 212389 [CommonNavigator] working set issues: 
- *         missing project, window working set inconsistency
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ResourceWorkingSetFilter;
-import org.eclipse.ui.actions.WorkingSetFilterActionGroup;
-import org.eclipse.ui.internal.navigator.workingsets.WorkingSetsContentProvider;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-import org.eclipse.ui.navigator.IExtensionActivationListener;
-import org.eclipse.ui.navigator.IExtensionStateModel;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * @since 3.2
- *
- */
-public class WorkingSetActionProvider extends CommonActionProvider {
-
-	private static final String TAG_CURRENT_WORKING_SET_NAME = "currentWorkingSetName"; //$NON-NLS-1$
-
-	private boolean contributedToViewMenu = false;
-
-	private StructuredViewer viewer;
-
-	private INavigatorContentService contentService;
-
-	private WorkingSetFilterActionGroup workingSetActionGroup;
-	private WorkingSetRootModeActionGroup workingSetRootModeActionGroup;
-
-	private Object originalViewerInput = ResourcesPlugin.getWorkspace().getRoot();
-
-	private IExtensionStateModel extensionStateModel;
-
-	private final ResourceWorkingSetFilter workingSetFilter = new ResourceWorkingSetFilter();
-	private boolean filterAdded;
-
-	private boolean emptyWorkingSet;
-	private IWorkingSet workingSet;
-
-	private IPropertyChangeListener topLevelModeListener;
-
-
-	/**
-	 * Provides a smart listener to monitor changes to the Working Set Manager.
-	 *
-	 */
-	public class WorkingSetManagerListener implements IPropertyChangeListener {
-
-		private boolean listening = false;
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-		 */
-		public void propertyChange(PropertyChangeEvent event) {
-			String property = event.getProperty();
-			Object newValue = event.getNewValue();
-			Object oldValue = event.getOldValue();
-
-			if (IWorkingSetManager.CHANGE_WORKING_SET_REMOVE.equals(property) && oldValue == workingSet) {
-				setWorkingSet(null);
-			} else if (IWorkingSetManager.CHANGE_WORKING_SET_NAME_CHANGE.equals(property) && newValue == workingSet) {
-			} else if (IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE.equals(property) && newValue == workingSet) {
-				if (workingSet.isAggregateWorkingSet() && workingSet.isEmpty()) {
-					// act as if the working set has been made null
-					if (!emptyWorkingSet) {
-						emptyWorkingSet = true;
-						workingSetFilter.setWorkingSet(null);
-					}
-				} else {
-					// we've gone from empty to non-empty on our set.
-					// Restore it.
-					if (emptyWorkingSet) {
-						emptyWorkingSet = false;
-						workingSetFilter.setWorkingSet(workingSet);
-					}
-				}
-				if (viewer != null) {
-					viewer.refresh();
-				}
-			}
-		}
-
-		/**
-		 * Begin listening to the correct source if not already listening.
-		 */
-		public synchronized void listen() {
-			if (!listening) {
-				PlatformUI.getWorkbench().getWorkingSetManager().addPropertyChangeListener(managerChangeListener);
-				listening = true;
-			}
-		}
-
-		/**
-		 * Begin listening to the correct source if not already listening.
-		 */
-		public synchronized void ignore() {
-			if (listening) {
-				PlatformUI.getWorkbench().getWorkingSetManager().removePropertyChangeListener(managerChangeListener);
-				listening = false;
-			}
-		}
-	}
-
-	private IPropertyChangeListener filterChangeListener = new IPropertyChangeListener() {
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-		 */
-		public void propertyChange(PropertyChangeEvent event) {
-			IWorkingSet newWorkingSet = (IWorkingSet) event.getNewValue();
-
-			if (newWorkingSet != null && !contentService.isActive(WorkingSetsContentProvider.EXTENSION_ID)) {
-				contentService.getActivationService().activateExtensions(new String[]{WorkingSetsContentProvider.EXTENSION_ID}, false);
-				contentService.getActivationService().persistExtensionActivations();
-			}
-
-			setWorkingSet(newWorkingSet);
-		}
-	};
-
-	private WorkingSetManagerListener managerChangeListener = new WorkingSetManagerListener();
-
-	private IExtensionActivationListener activationListener = new IExtensionActivationListener() {
-
-		private IWorkingSet savedWorkingSet;
-
-		public void onExtensionActivation(String aViewerId, String[] theNavigatorExtensionIds, boolean isActive) {
-
-			for (int i = 0; i < theNavigatorExtensionIds.length; i++) {
-				if (WorkingSetsContentProvider.EXTENSION_ID.equals(theNavigatorExtensionIds[i])) {
-					if (isActive) {
-						extensionStateModel = contentService.findStateModel(WorkingSetsContentProvider.EXTENSION_ID);
-						workingSetRootModeActionGroup.setStateModel(extensionStateModel);
-						extensionStateModel.addPropertyChangeListener(topLevelModeListener);
-
-						if (savedWorkingSet != null) {
-							setWorkingSet(savedWorkingSet);
-							workingSetActionGroup.setWorkingSet(savedWorkingSet);
-						}
-						managerChangeListener.listen();
-
-					} else {
-						savedWorkingSet= workingSet;
-						setWorkingSet(null);
-						managerChangeListener.ignore();
-						workingSetActionGroup.setWorkingSet(null);
-						workingSetRootModeActionGroup.setShowTopLevelWorkingSets(false);
-						extensionStateModel.removePropertyChangeListener(topLevelModeListener);
-
-					}
-				}
-			}
-		}
-
-	};
-
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.ui.navigator.CommonActionProvider#init(org.eclipse.ui.navigator.ICommonActionExtensionSite)
-	 */
-	public void init(ICommonActionExtensionSite aSite) {
-		viewer = aSite.getStructuredViewer();
-		contentService = aSite.getContentService();
-
-		extensionStateModel = contentService.findStateModel(WorkingSetsContentProvider.EXTENSION_ID);
-
-		workingSetActionGroup = new WorkingSetFilterActionGroup(aSite.getViewSite().getShell(), filterChangeListener);
-		workingSetRootModeActionGroup = new WorkingSetRootModeActionGroup(viewer, extensionStateModel);
-
-		topLevelModeListener= new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				setWorkingSet(workingSet);
-			}};
-
-		if (contentService.isActive(WorkingSetsContentProvider.EXTENSION_ID)) {
-			managerChangeListener.listen();
-			extensionStateModel.addPropertyChangeListener(topLevelModeListener);
-		}
-
-		contentService.getActivationService().addExtensionActivationListener(activationListener);
-
-	}
-
-    /**
-     * Restores the working set filter from the persistence store.
-     */
-    protected void initWorkingSetFilter(String workingSetName) {
-        IWorkingSet workingSet = null;
-
-        if (workingSetName != null && workingSetName.length() > 0) {
-			IWorkingSetManager workingSetManager = PlatformUI.getWorkbench().getWorkingSetManager();
-			workingSet = workingSetManager.getWorkingSet(workingSetName);
-		} else if (PlatformUI.getPreferenceStore().getBoolean(
-						IWorkbenchPreferenceConstants.USE_WINDOW_WORKING_SET_BY_DEFAULT)) {
-			// use the window set by default if the global preference is set
-			workingSet = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getAggregateWorkingSet();
-		}
-
-		if (workingSet != null) {
-			workingSetFilter.setWorkingSet(workingSet);
-			internalSetWorkingSet(workingSet);
-			workingSetActionGroup.setWorkingSet(workingSet);
-		}
-    }
-
-	/**
-	 * Set current active working set.
-	 *
-	 * @param workingSet  working set to be activated, may be <code>null</code>
-	 */
-	protected void setWorkingSet(IWorkingSet workingSet) {
-        internalSetWorkingSet(workingSet);
-
-        workingSetFilter.setWorkingSet(emptyWorkingSet ? null : workingSet);
-
-		if (viewer != null) {
-			if (workingSet == null || emptyWorkingSet || !extensionStateModel.getBooleanProperty(WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS)) {
-				if (viewer.getInput() != originalViewerInput) {
-					viewer.setInput(originalViewerInput);
-				}
-				if (!filterAdded) {
-					viewer.addFilter(workingSetFilter);
-					filterAdded = true;
-				} else {
-					viewer.refresh();
-				}
-			} else {
-				viewer.removeFilter(workingSetFilter);
-				filterAdded = false;
-				if (!workingSet.isAggregateWorkingSet()) {
-					IWorkingSetManager workingSetManager = PlatformUI.getWorkbench().getWorkingSetManager();
-					viewer.setInput(workingSetManager.createAggregateWorkingSet("", "", new IWorkingSet[] { workingSet })); //$NON-NLS-1$ //$NON-NLS-2$
-				} else {
-					viewer.setInput(workingSet);
-				}
-			}
-		}
-	}
-
-	private void internalSetWorkingSet(IWorkingSet workingSet) {
-		this.workingSet = workingSet;
-		emptyWorkingSet = workingSet != null && workingSet.isAggregateWorkingSet()
-				&& workingSet.isEmpty();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.CommonActionProvider#restoreState(org.eclipse.ui.IMemento)
-	 */
-	public void restoreState(IMemento aMemento) {
-		super.restoreState(aMemento);
-
-		boolean showWorkingSets = true;
-		if(aMemento != null) {
-			Integer showWorkingSetsInt = aMemento.getInteger(WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS);
-			showWorkingSets = showWorkingSetsInt == null || showWorkingSetsInt.intValue() == 1;
-			extensionStateModel.setBooleanProperty(WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS, showWorkingSets);
-			workingSetRootModeActionGroup.setShowTopLevelWorkingSets(showWorkingSets);
-
-			String lastWorkingSetName = aMemento.getString(TAG_CURRENT_WORKING_SET_NAME);
-			initWorkingSetFilter(lastWorkingSetName);
-		} else {
-			showWorkingSets = false;
-
-			extensionStateModel.setBooleanProperty(WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS, showWorkingSets);
-			workingSetRootModeActionGroup.setShowTopLevelWorkingSets(showWorkingSets);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.CommonActionProvider#saveState(org.eclipse.ui.IMemento)
-	 */
-	public void saveState(IMemento aMemento) {
-		super.saveState(aMemento);
-
-		if(aMemento != null) {
-			int showWorkingSets = extensionStateModel.getBooleanProperty(WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS) ? 1 : 0;
-			aMemento.putInteger(WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS, showWorkingSets);
-
-			if (workingSet != null) {
-				aMemento.putString(TAG_CURRENT_WORKING_SET_NAME, workingSet.getName());
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.ui.actions.ActionGroup#fillActionBars(org.eclipse.ui.IActionBars)
-	 */
-	public void fillActionBars(IActionBars actionBars) {
-		if (!contributedToViewMenu) {
-			try {
-				super.fillActionBars(actionBars);
-				workingSetActionGroup.fillActionBars(actionBars);
-				if (workingSetRootModeActionGroup != null) {
-					workingSetRootModeActionGroup.fillActionBars(actionBars);
-				}
-			} finally {
-				contributedToViewMenu = true;
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.ui.actions.ActionGroup#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		workingSetActionGroup.dispose();
-		if (workingSetRootModeActionGroup != null) {
-			workingSetRootModeActionGroup.dispose();
-		}
-
-		managerChangeListener.ignore();
-		extensionStateModel.removePropertyChangeListener(topLevelModeListener);
-
-		contentService.getActivationService().removeExtensionActivationListener(activationListener);
-	}
-
-	/**
-	 * This is used only for the tests.
-	 * 
-	 * @return a PropertyChangeListener
-	 */
-	public IPropertyChangeListener getFilterChangeListener() {
-		return filterChangeListener;
-	}
-
-	
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/WorkingSetRootModeActionGroup.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/WorkingSetRootModeActionGroup.java
deleted file mode 100644
index 770e6c2..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/actions/WorkingSetRootModeActionGroup.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.resources.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorMessages;
-import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorPlugin;
-import org.eclipse.ui.internal.navigator.workingsets.WorkingSetsContentProvider;
-import org.eclipse.ui.navigator.IExtensionStateModel;
-
-/**
- * @since 3.2
- * 
- */
-public class WorkingSetRootModeActionGroup extends ActionGroup {
-
-	private IExtensionStateModel stateModel;
-	private StructuredViewer structuredViewer;
-
-	private boolean hasContributedToViewMenu = false;
-	private IAction workingSetsAction = null;
-	private IAction projectsAction = null;
-	private IAction[] actions;
-	private int currentSelection;
-	private MenuItem[] items;
-
-	private class TopLevelContentAction extends Action  {
-
-		private final boolean groupWorkingSets;
-
-		/**
-		 * Construct an Action that represents a toggle-able state between
-		 * Showing top level Working Sets and Projects.
-		 * 
-		 * @param toGroupWorkingSets
-		 */
-		public TopLevelContentAction(boolean toGroupWorkingSets) {
-			super("", AS_RADIO_BUTTON); //$NON-NLS-1$
-			groupWorkingSets = toGroupWorkingSets;
-		}
-
-		/*
-		 * @see org.eclipse.jface.action.IAction#run()
-		 */
-		public void run() {
-			if (stateModel
-					.getBooleanProperty(WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS) != groupWorkingSets) {
-				stateModel.setBooleanProperty(
-						WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS,
-						groupWorkingSets);
-
-				structuredViewer.getControl().setRedraw(false);
-				try {
-					structuredViewer.refresh();
-				} finally {
-					structuredViewer.getControl().setRedraw(true);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Create an action group that will listen to the stateModel and update the
-	 * structuredViewer when necessary.
-	 * 
-	 * @param aStructuredViewer
-	 * @param aStateModel
-	 */
-	public WorkingSetRootModeActionGroup(StructuredViewer aStructuredViewer,
-			IExtensionStateModel aStateModel) {
-		super();
-		structuredViewer = aStructuredViewer;
-		stateModel = aStateModel;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ActionGroup#fillActionBars(IActionBars)
-	 */
-	public void fillActionBars(IActionBars actionBars) {
-		synchronized (this) {
-			if (!hasContributedToViewMenu) {
-				contributeToViewMenu(actionBars.getMenuManager()); 
-				hasContributedToViewMenu = true;
-			}
-		}
-	}
-
-	private void contributeToViewMenu(IMenuManager viewMenu) {
-
-		IMenuManager topLevelSubMenu = new MenuManager(
-				WorkbenchNavigatorMessages.WorkingSetRootModeActionGroup_Top_Level_Element_);
-		addActions(topLevelSubMenu);
-		viewMenu.insertBefore(IWorkbenchActionConstants.MB_ADDITIONS,
-				topLevelSubMenu);
-	}
-
-	/**
-	 * Adds the actions to the given menu manager.
-	 */
-	protected void addActions(IMenuManager viewMenu) {
-
-		viewMenu.add(new Separator());
-		items = new MenuItem[actions.length];
-
-		for (int i = 0; i < actions.length; i++) {
-			final int j = i;
-
-			viewMenu.add(new ContributionItem() {
-
-				public void fill(Menu menu, int index) {
-
-					int style = SWT.CHECK;
-					if ((actions[j].getStyle() & IAction.AS_RADIO_BUTTON) != 0)
-						style = SWT.RADIO;
-
-					final MenuItem mi = new MenuItem(menu, style, index);
-					items[j] = mi;
-					mi.setText(actions[j].getText());
-					mi.setSelection(currentSelection == j);
-					mi.addSelectionListener(new SelectionAdapter() {
-
-						public void widgetSelected(SelectionEvent e) {
-							if (currentSelection == j) {
-								items[currentSelection].setSelection(true);
-								return;
-							}
-							actions[j].run();
-
-							// Update checked state
-							items[currentSelection].setSelection(false);
-							currentSelection = j;
-							items[currentSelection].setSelection(true);
-						}
-
-					});
-
-				}
-
-				public boolean isDynamic() {
-					return false;
-				}
-			});
-		}
-	}
-
-	private IAction[] createActions() {
-
-		ISharedImages sharedImages = PlatformUI.getWorkbench()
-				.getSharedImages();
-
-		projectsAction = new TopLevelContentAction(false);
-		projectsAction
-				.setText(WorkbenchNavigatorMessages.WorkingSetRootModeActionGroup_Project_);
-		projectsAction.setImageDescriptor(sharedImages
-				.getImageDescriptor(IDE.SharedImages.IMG_OBJ_PROJECT));
-
-		workingSetsAction = new TopLevelContentAction(true);
-		workingSetsAction
-				.setText(WorkbenchNavigatorMessages.WorkingSetRootModeActionGroup_Working_Set_);
-		workingSetsAction.setImageDescriptor(WorkbenchNavigatorPlugin
-				.getDefault().getImageRegistry().getDescriptor(
-						"full/obj16/workingsets.gif")); //$NON-NLS-1$
-
-		return new IAction[] { projectsAction, workingSetsAction };
-	}
-
-	/**
-	 * Toggle whether top level working sets should be displayed as a group or
-	 * collapse to just show their contents.
-	 * 
-	 * @param showTopLevelWorkingSets
-	 */
-	public void setShowTopLevelWorkingSets(boolean showTopLevelWorkingSets) {
-		if (actions == null) {
-			actions = createActions();
-			setActions(actions, showTopLevelWorkingSets ? 1 /*
-															 * Show Top Level
-															 * Working Sets
-															 */
-					: 0);
-		}
-		workingSetsAction.setChecked(showTopLevelWorkingSets);
-		projectsAction.setChecked(!showTopLevelWorkingSets);
-
-		if (items != null) {
-			for (int i = 0; i < items.length; i++) {
-				if(items[i] != null && actions[i] != null)
-					items[i].setSelection(actions[i].isChecked());
-			}
-		}
-		if (stateModel != null) {
-			stateModel.setBooleanProperty(
-					WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS,
-					showTopLevelWorkingSets);
-		}
-
-	}
-
-	/**
-	 * Configure the actions that are displayed in the menu by this ActionGroup.
-	 * 
-	 * @param theActions
-	 *            An array of possible actions.
-	 * @param selected
-	 *            The index of the "enabled" action.
-	 */
-	private void setActions(IAction[] theActions, int selected) {
-		actions = theActions;
-		currentSelection = selected;
-
-	}
-
-	/**
-	 * @param sStateModel
-	 */
-	public void setStateModel(IExtensionStateModel sStateModel) {
-		stateModel = sStateModel;
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/plugin/NavigatorUIPluginImages.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/plugin/NavigatorUIPluginImages.java
deleted file mode 100644
index 0b85df3..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/plugin/NavigatorUIPluginImages.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.resources.plugin;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Collections;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-
-/**
- * Handles all images and icons for the ui.
- * 
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as part
- * of a work in progress. There is a guarantee neither that this API will work
- * nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- */
-public class NavigatorUIPluginImages {
-
-	private static URL fgIconLocation;
-
-	// Create image registry
-	private final static ImageRegistry NAVIGATORUIPLUGIN_REGISTRY = NavigatorPlugin.getDefault().getImageRegistry();
-
-	// Create the icon location
-	static {
-		String pathSuffix = "icons/full/"; //$NON-NLS-1$ 
-		fgIconLocation = FileLocator.find(NavigatorPlugin.getDefault().getBundle(), new Path(pathSuffix), Collections.EMPTY_MAP);
-	}
-
-	/**
-	 * Gets the current image.
-	 * 
-	 * @param key
-	 *            - Name of the icon.
-	 * @return Image
-	 */
-	public static Image get(String key) {
-		return NAVIGATORUIPLUGIN_REGISTRY.get(key);
-	}
-
-	/**
-	 * Create and returns a image descriptor.
-	 * 
-	 * @param prefix
-	 *            - Icon dir structure.
-	 * @param name
-	 *            - The name of the icon.
-	 * @return ImageDescriptor
-	 */
-	private static ImageDescriptor create(String prefix, String name) {
-		return ImageDescriptor.createFromURL(makeIconFileURL(prefix, name));
-	}
-
-	/**
-	 * Creates the icon url
-	 * 
-	 * @param prefix
-	 *            - Icon dir structure.
-	 * @param name
-	 *            - The name of the icon.
-	 * @return URL
-	 */
-	private static URL makeIconFileURL(String prefix, String name) {
-		StringBuffer buffer = new StringBuffer(prefix);
-		buffer.append(name);
-		try {
-			return new URL(fgIconLocation, buffer.toString());
-		} catch (MalformedURLException ex) {
-
-			return null;
-		}
-	}
-
-	/**
-	 * Sets the three image descriptors for enabled, disabled, and hovered to an
-	 * action. The actions are retrieved from the *lcl16 folders.
-	 * 
-	 * @param action
-	 *            the action
-	 * @param iconName
-	 *            the icon name
-	 */
-	public static void setLocalImageDescriptors(IAction action, String iconName) {
-		setImageDescriptors(action, "lcl16/", iconName); //$NON-NLS-1$
-	}
-
-	/**
-	 * Sets all available image descriptors for the given action.
-	 * 
-	 * @param action
-	 *            - The action associated with the icon.
-	 * @param type
-	 *            - The type of icon.
-	 * @param relPath
-	 *            - The relative path of the icon.
-	 */
-	public static void setImageDescriptors(IAction action, String type, String relPath) {
-		// /*relPath= relPath.substring(NAVIGATORUI_NAME_PREFIX_LENGTH);*/
-		// action.setDisabledImageDescriptor(create("d" + type, relPath));
-		// //$NON-NLS-1$
-		// action.setHoverImageDescriptor(create("c" + type, relPath));
-		// //$NON-NLS-1$
-		action.setImageDescriptor(create("e" + type, relPath)); //$NON-NLS-1$
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/plugin/WorkbenchNavigatorMessages.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/plugin/WorkbenchNavigatorMessages.java
deleted file mode 100644
index b923de6..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/plugin/WorkbenchNavigatorMessages.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.resources.plugin;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Utility class which helps managing messages
- * 
- * 
- * @since 3.2
- */
-public class WorkbenchNavigatorMessages extends NLS {
-	/** The bundle properties file */
-	public static final String BUNDLE_NAME = "org.eclipse.ui.internal.navigator.resources.plugin.messages"; //$NON-NLS-1$
-
-	/** Message key. */
-	public static String PortingActionProvider_ImportResourcesMenu_label;
-
-	/** Message key. */
-	public static String PortingActionProvider_ExportResourcesMenu_label;
-
-	/** Message key. */
-	public static String NewActionProvider_NewMenu_label;
-
-	/** Message key. */
-	public static String OpenActionProvider_OpenWithMenu_label;
-
-	/** Message key. */
-	public static String DropAdapter_title;
-
-	/** Message key. */
-	public static String DropAdapter_problemImporting;
-
-	/** Message key. */
-	public static String DropAdapter_problemsMoving;
-
-	/** Message key. */
-	public static String DropAdapter_targetMustBeResource;
-
-	/** Message key. */
-	public static String DropAdapter_canNotDropIntoClosedProject;
-
-	/** Message key. */
-	public static String DropAdapter_resourcesCanNotBeSiblings;
-
-	/** Message key. */
-	public static String DropAdapter_canNotDropProjectIntoProject;
-	
-	/** Message key. */
-	public static String DropAdapter_dropOperationErrorOther;
-	
-
-	/** Message key. */
-	public static String MoveResourceAction_title;
-
-	/** Message key. */
-	public static String MoveResourceAction_checkMoveMessage;
-
-	/** Message key. */
-	public static String WorkingSetRootModeActionGroup_Top_Level_Element_;
-
-	/** Message key. */
-	public static String WorkingSetRootModeActionGroup_Project_;
-
-	/** Message key. */
-	public static String WorkingSetRootModeActionGroup_Working_Set_;
-
-	/** Message key. */
-	public static String CopyAction_Cop_;
-
-	/** Message key. */
-	public static String CopyAction_Copy_selected_resource_s_;
-
-	/** Message key. */
-	public static String PasteAction_Past_;
-
-	/** Message key. */
-	public static String PasteAction_Paste_selected_resource_s_;
-
-	static {
-		initializeMessages(BUNDLE_NAME, WorkbenchNavigatorMessages.class);
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/plugin/WorkbenchNavigatorPlugin.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/plugin/WorkbenchNavigatorPlugin.java
deleted file mode 100644
index 8cb080d..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/plugin/WorkbenchNavigatorPlugin.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.resources.plugin;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * The main plugin class for the workbench Navigator.
- * 
- * 
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- */
-public class WorkbenchNavigatorPlugin extends AbstractUIPlugin {
-	// The shared instance.
-	private static WorkbenchNavigatorPlugin plugin;
-
-	/** The plugin id */
-	public static String PLUGIN_ID = "org.eclipse.ui.navigator.resources"; //$NON-NLS-1$
-
-	/**
-	 * Creates a new instance of the receiver
-	 */
-	public WorkbenchNavigatorPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @return the shared instance.
-	 */
-	public static WorkbenchNavigatorPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * @return the workspace instance.
-	 */
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/**
-	 * Logs errors.
-	 * @param message The message to log
-	 * @param status The status to log
-	 */
-	public static void log(String message, IStatus status) {
-		if (message != null) {
-			getDefault().getLog().log(
-					new Status(IStatus.ERROR, PLUGIN_ID, 0, message, null));
-			System.err.println(message + "\nReason:"); //$NON-NLS-1$
-		}
-		if(status != null) {
-			getDefault().getLog().log(status);
-			System.err.println(status.getMessage());
-		}
-	}
-
-	/**
-	 * Create a status associated with this plugin.
-	 * 
-	 * @param severity
-	 * @param aCode
-	 * @param aMessage
-	 * @param exception
-	 * @return A status configured with this plugin's id and the given
-	 *         parameters.
-	 */
-	public static IStatus createStatus(int severity, int aCode,
-			String aMessage, Throwable exception) {
-		return new Status(severity, PLUGIN_ID, aCode,
-				aMessage != null ? aMessage : "No message.", exception); //$NON-NLS-1$
-	}
-
-	/**
-	 * 
-	 * @param aCode
-	 * @param aMessage
-	 * @param exception
-	 * @return A status configured with this plugin's id and the given
-	 *         parameters.
-	 */
-	public static IStatus createErrorStatus(int aCode, String aMessage,
-			Throwable exception) {
-		return createStatus(IStatus.ERROR, aCode, aMessage, exception);
-	}
-	
-
-	/**
-	 *  
-	 * @param aMessage
-	 * @param exception
-	 * @return A status configured with this plugin's id and the given
-	 *         parameters.
-	 */
-	public static IStatus createErrorStatus(String aMessage,	Throwable exception) {
-		return createStatus(IStatus.ERROR, 0, aMessage, exception);
-	}
-	
-	/**
-	 *  
-	 * @param aMessage 
-	 * @return A status configured with this plugin's id and the given
-	 *         parameters.
-	 */
-	public static IStatus createErrorStatus(String aMessage) {
-		return createStatus(IStatus.ERROR, 0, aMessage, null);
-	}
-	
-	
-	/**
-	 *  
-	 * @param aMessage 
-	 * @return A status configured with this plugin's id and the given
-	 *         parameters.
-	 */
-	public static IStatus createInfoStatus(String aMessage) {
-		return createStatus(IStatus.INFO, 0, aMessage, null);
-	}
-	
-	
-	/**
-	 *  
-	 * @param aMessage 
-	 * @return A status configured with this plugin's id and the given
-	 *         parameters.
-	 */
-	public static IStatus createWarningStatus(String aMessage) {
-		return createStatus(IStatus.WARNING, 0, aMessage, null);
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/plugin/messages.properties b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/plugin/messages.properties
deleted file mode 100644
index 8b699d4..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/plugin/messages.properties
+++ /dev/null
@@ -1,33 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-#String externalization, key=value
-#Tue Aug 15 11:29:14 EDT 2006
-DropAdapter_title=Drag and Drop Problem
-OpenActionProvider_OpenWithMenu_label=Open With
-WorkingSetRootModeActionGroup_Top_Level_Element_=&Top Level Elements
-WorkingSetRootModeActionGroup_Project_=Projects
-DropAdapter_resourcesCanNotBeSiblings=Resources cannot be siblings of projects
-PortingActionProvider_ImportResourcesMenu_label=&Import
-MoveResourceAction_title=Check Move
-PortingActionProvider_ExportResourcesMenu_label=E&xport
-WorkingSetRootModeActionGroup_Working_Set_=Working Sets
-DropAdapter_targetMustBeResource=Target must be a resource
-DropAdapter_problemImporting=Problems occurred while importing resources.
-MoveResourceAction_checkMoveMessage=''{0}'' is read only. Do you still wish to move it?
-DropAdapter_canNotDropIntoClosedProject=Cannot drop a resource into closed project
-DropAdapter_canNotDropProjectIntoProject=Cannot drop a project into another project
-DropAdapter_problemsMoving=Problems occurred while moving resources.
-DropAdapter_dropOperationErrorOther=An error occurred during the drop operation.
-NewActionProvider_NewMenu_label=&New
-CopyAction_Cop_=Copy
-CopyAction_Copy_selected_resource_s_=Copy selected resource(s)
-PasteAction_Past_=Paste
-PasteAction_Paste_selected_resource_s_=Paste selected resource(s)
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/ResourceExtensionContentProvider.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/ResourceExtensionContentProvider.java
deleted file mode 100644
index 5525982..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/ResourceExtensionContentProvider.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.resources.workbench;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-
-/**
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * @since 3.2
- */
-public class ResourceExtensionContentProvider extends WorkbenchContentProvider {
- 
-	private static final Object[] NO_CHILDREN = new Object[0];
-	private Viewer viewer;
-	
-	/**
-	 *  
-	 */
-	public ResourceExtensionContentProvider() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.model.BaseWorkbenchContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object element) {
-		return super.getChildren(element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.model.BaseWorkbenchContentProvider#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(Object element) {
-		if(element instanceof IResource)
-			return super.getChildren(element);
-		return NO_CHILDREN;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.BaseWorkbenchContentProvider#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object element) {
-		return element instanceof IContainer && super.hasChildren(element);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.WorkbenchContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 
-		super.inputChanged(viewer, oldInput, newInput);
-		this.viewer = viewer;
-	}
-
-
-	/**
-	 * Process the resource delta.
-	 * 
-	 * @param delta
-	 */
-	protected void processDelta(IResourceDelta delta) {		
-
-		Control ctrl = viewer.getControl();
-		if (ctrl == null || ctrl.isDisposed()) {
-			return;
-		}
-		
-		
-		final Collection runnables = new ArrayList();
-		processDelta(delta, runnables);
-
-		if (runnables.isEmpty()) {
-			return;
-		}
-
-		//Are we in the UIThread? If so spin it until we are done
-		if (ctrl.getDisplay().getThread() == Thread.currentThread()) {
-			runUpdates(runnables);
-		} else {
-			ctrl.getDisplay().asyncExec(new Runnable(){
-				/* (non-Javadoc)
-				 * @see java.lang.Runnable#run()
-				 */
-				public void run() {
-					//Abort if this happens after disposes
-					Control ctrl = viewer.getControl();
-					if (ctrl == null || ctrl.isDisposed()) {
-						return;
-					}
-					
-					runUpdates(runnables);
-				}
-			});
-		}
-
-	}
-	
-	/**
-	 * Process a resource delta. Add any runnables
-	 */
-	private void processDelta(IResourceDelta delta, Collection runnables) {
-		//he widget may have been destroyed
-		// by the time this is run. Check for this and do nothing if so.
-		Control ctrl = viewer.getControl();
-		if (ctrl == null || ctrl.isDisposed()) {
-			return;
-		}
-
-		// Get the affected resource
-		final IResource resource = delta.getResource();
-	
-		// If any children have changed type, just do a full refresh of this
-		// parent,
-		// since a simple update on such children won't work,
-		// and trying to map the change to a remove and add is too dicey.
-		// The case is: folder A renamed to existing file B, answering yes to
-		// overwrite B.
-		IResourceDelta[] affectedChildren = delta
-				.getAffectedChildren(IResourceDelta.CHANGED);
-		for (int i = 0; i < affectedChildren.length; i++) {
-			if ((affectedChildren[i].getFlags() & IResourceDelta.TYPE) != 0) {
-				runnables.add(getRefreshRunnable(resource));
-				return;
-			}
-		}
-
-		// Check the flags for changes the Navigator cares about.
-		// See ResourceLabelProvider for the aspects it cares about.
-		// Notice we don't care about F_CONTENT or F_MARKERS currently.
-		int changeFlags = delta.getFlags();
-		if ((changeFlags & (IResourceDelta.OPEN | IResourceDelta.SYNC
-				| IResourceDelta.TYPE | IResourceDelta.DESCRIPTION)) != 0) {
-//			Runnable updateRunnable =  new Runnable(){
-//				public void run() {
-//					((StructuredViewer) viewer).update(resource, null);
-//				}
-//			};
-//			runnables.add(updateRunnable);
-			
-			/* support the Closed Projects filter; 
-			 * when a project is closed, it may need to be removed from the view.
-			 */
-			runnables.add(getRefreshRunnable(resource.getParent()));
-		}
-		// Replacing a resource may affect its label and its children
-		if ((changeFlags & IResourceDelta.REPLACED) != 0) {
-			runnables.add(getRefreshRunnable(resource));
-			return;
-		}
-
-
-		// Handle changed children .
-		for (int i = 0; i < affectedChildren.length; i++) {
-			processDelta(affectedChildren[i], runnables);
-		}
-
-		// @issue several problems here:
-		//  - should process removals before additions, to avoid multiple equal
-		// elements in viewer
-		//   - Kim: processing removals before additions was the indirect cause of
-		// 44081 and its varients
-		//   - Nick: no delta should have an add and a remove on the same element,
-		// so processing adds first is probably OK
-		//  - using setRedraw will cause extra flashiness
-		//  - setRedraw is used even for simple changes
-		//  - to avoid seeing a rename in two stages, should turn redraw on/off
-		// around combined removal and addition
-		//   - Kim: done, and only in the case of a rename (both remove and add
-		// changes in one delta).
-
-		IResourceDelta[] addedChildren = delta
-				.getAffectedChildren(IResourceDelta.ADDED);
-		IResourceDelta[] removedChildren = delta
-				.getAffectedChildren(IResourceDelta.REMOVED);
-
-		if (addedChildren.length == 0 && removedChildren.length == 0) {
-			return;
-		}
-
-		final Object[] addedObjects;
-		final Object[] removedObjects;
-
-		// Process additions before removals as to not cause selection
-		// preservation prior to new objects being added
-		// Handle added children. Issue one update for all insertions.
-		int numMovedFrom = 0;
-		int numMovedTo = 0;
-		if (addedChildren.length > 0) {
-			addedObjects = new Object[addedChildren.length];
-			for (int i = 0; i < addedChildren.length; i++) {
-				addedObjects[i] = addedChildren[i].getResource();
-				if ((addedChildren[i].getFlags() & IResourceDelta.MOVED_FROM) != 0) {
-					++numMovedFrom;
-				}
-			}
-		} else {
-			addedObjects = new Object[0];
-		}
-
-		// Handle removed children. Issue one update for all removals.
-		if (removedChildren.length > 0) {
-			removedObjects = new Object[removedChildren.length];
-			for (int i = 0; i < removedChildren.length; i++) {
-				removedObjects[i] = removedChildren[i].getResource();
-				if ((removedChildren[i].getFlags() & IResourceDelta.MOVED_TO) != 0) {
-					++numMovedTo;
-				}
-			}
-		} else {
-			removedObjects = new Object[0];
-		}
-		// heuristic test for items moving within same folder (i.e. renames)
-		final boolean hasRename = numMovedFrom > 0 && numMovedTo > 0;
-		
-		Runnable addAndRemove = new Runnable(){
-			public void run() {
-				if (viewer instanceof AbstractTreeViewer) {
-					AbstractTreeViewer treeViewer = (AbstractTreeViewer) viewer;
-					// Disable redraw until the operation is finished so we don't
-					// get a flash of both the new and old item (in the case of
-					// rename)
-					// Only do this if we're both adding and removing files (the
-					// rename case)
-					if (hasRename) {
-						treeViewer.getControl().setRedraw(false);
-					}
-					try {
-						if (addedObjects.length > 0) {
-							treeViewer.add(resource, addedObjects);
-						}
-						if (removedObjects.length > 0) {
-							treeViewer.remove(removedObjects);
-						}
-					}
-					finally {
-						if (hasRename) {
-							treeViewer.getControl().setRedraw(true);
-						}
-					}
-				} else {
-					((StructuredViewer) viewer).refresh(resource);
-				}
-			}
-		};
-		runnables.add(addAndRemove);
-	}
-	
-	/**
-	 * Return a runnable for refreshing a resource.
-	 * @param resource
-	 * @return Runnable
-	 */
-	private Runnable getRefreshRunnable(final IResource resource) {
-		return new Runnable(){
-			public void run() {
-				((StructuredViewer) viewer).refresh(resource);
-			}
-		};
-	}
-	
-	/**
-	 * Run all of the runnables that are the widget updates
-	 * @param runnables
-	 */
-	private void runUpdates(Collection runnables) {
-		Iterator runnableIterator = runnables.iterator();
-		while(runnableIterator.hasNext()){
-			((Runnable)runnableIterator.next()).run();
-		}
-		
-	}
-	
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/ResourceExtensionLabelProvider.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/ResourceExtensionLabelProvider.java
deleted file mode 100644
index 860de43..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/ResourceExtensionLabelProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.resources.workbench;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.navigator.ICommonContentExtensionSite;
-import org.eclipse.ui.navigator.ICommonLabelProvider;
-
-/**
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * @since 3.2
- */
-public class ResourceExtensionLabelProvider extends WorkbenchLabelProvider implements ICommonLabelProvider {
- 
- 
-	public void init(ICommonContentExtensionSite aConfig) {
-		//init
-	}
-
- 
-	public String getDescription(Object anElement) {
-
-		if (anElement instanceof IResource) {
-			return ((IResource) anElement).getFullPath().makeRelative().toString();
-		}
-		return null;
-	}
-
-	public void restoreState(IMemento aMemento) { 
-		
-	}
-
-	public void saveState(IMemento aMemento) { 
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/ResourceExtensionSorter.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/ResourceExtensionSorter.java
deleted file mode 100644
index 7a48069..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/ResourceExtensionSorter.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.resources.workbench;
-
-import org.eclipse.ui.views.navigator.ResourceSorter;
-
-/**
- * TODO - This refers to the deprecated ResourceSorter, however we are stuck with this
- * for the time being because the CommonSorter extension point uses a ViewerSorter.
- * We should provide an option for a ViewerComparator and then we can remove this
- * class.
- * 
- * @since 3.2
- * 
- */
-public class ResourceExtensionSorter extends ResourceSorter {
-
-	/**
-	 * Construct a sorter that uses the name of the resource as its sorting
-	 * criteria.
-	 * 
-	 */
-	public ResourceExtensionSorter() {
-		super(ResourceSorter.NAME);
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/ResourceLinkHelper.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/ResourceLinkHelper.java
deleted file mode 100644
index a374dbd..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/ResourceLinkHelper.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.resources.workbench;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.ide.ResourceUtil;
-import org.eclipse.ui.navigator.ILinkHelper;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * 
- * Links IFileEditorInput to IFiles, and vice versa.
- * 
- * @since 3.2
- *
- */
-public class ResourceLinkHelper implements ILinkHelper {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.ILinkHelper#findSelection(org.eclipse.ui.IEditorInput)
-	 */
-	public IStructuredSelection findSelection(IEditorInput anInput) {
-		IFile file = ResourceUtil.getFile(anInput);
-		if (file != null) {
-			return new StructuredSelection(file);
-		}
-		return StructuredSelection.EMPTY;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.ILinkHelper#activateEditor(org.eclipse.ui.IWorkbenchPage, org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void activateEditor(IWorkbenchPage aPage,
-			IStructuredSelection aSelection) {
-		if (aSelection == null || aSelection.isEmpty())
-			return;
-		if (aSelection.getFirstElement() instanceof IFile) {
-			IEditorInput fileInput = new FileEditorInput((IFile) aSelection.getFirstElement());
-			IEditorPart editor = null;
-			if ((editor = aPage.findEditor(fileInput)) != null)
-				aPage.bringToTop(editor);
-		}
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/TabbedPropertySheetAdapterFactory.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/TabbedPropertySheetAdapterFactory.java
deleted file mode 100644
index 37e3d5d..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/TabbedPropertySheetAdapterFactory.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.resources.workbench;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.ui.navigator.CommonNavigator;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * An property sheet page adapter factory for the Project Explorer.
- *  
- * @since 3.2
- */
-public class TabbedPropertySheetAdapterFactory
-    implements IAdapterFactory {
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object,
-     *      java.lang.Class)
-     */
-    public Object getAdapter(Object adaptableObject, Class adapterType) {
-
-        if (adaptableObject instanceof CommonNavigator) {
-            if (IPropertySheetPage.class == adapterType)
-                return new TabbedPropertySheetPage(
-                    new TabbedPropertySheetProjectExplorerContributor(
-                        (CommonNavigator) adaptableObject));
-        }
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-     */
-    public Class[] getAdapterList() {
-        return new Class[] {IPropertySheetPage.class};
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/TabbedPropertySheetProjectExplorerContributor.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/TabbedPropertySheetProjectExplorerContributor.java
deleted file mode 100644
index 2eb2b3e..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/TabbedPropertySheetProjectExplorerContributor.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.resources.workbench;
-
-import org.eclipse.ui.navigator.CommonNavigator;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-
-/**
- * A tabbed property view contributor for the Project Explorer.
- * 
- * @since 3.2
- */
-public class TabbedPropertySheetProjectExplorerContributor implements
-		ITabbedPropertySheetPageContributor {
-	
-	private final String contributorId;
-	
-	protected TabbedPropertySheetProjectExplorerContributor(CommonNavigator aCommonNavigator) {
-		contributorId = aCommonNavigator.getViewSite().getId();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor#getContributorId()
-	 */
-	public String getContributorId() { 
-		return contributorId;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/TabbedPropertySheetTitleProvider.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/TabbedPropertySheetTitleProvider.java
deleted file mode 100644
index 5f0c103..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/resources/workbench/TabbedPropertySheetTitleProvider.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.resources.workbench;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorPlugin;
-import org.eclipse.ui.navigator.IDescriptionProvider;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * Defines a label provider for the title bar in the tabbed properties view.
- * 
- * @since 3.2
- */
-public class TabbedPropertySheetTitleProvider extends LabelProvider {
-
-	private ILabelProvider labelProvider;
-
-	private IDescriptionProvider descriptionProvider;
-
-	/**
-	 * Constructor for CommonNavigatorTitleProvider.
-	 */
-	public TabbedPropertySheetTitleProvider() {
-		super();
-		IWorkbenchPart part = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage().getActivePart();
-
-		INavigatorContentService contentService = (INavigatorContentService) part
-				.getAdapter(INavigatorContentService.class);
-
-		if (contentService != null) {
-			labelProvider = contentService.createCommonLabelProvider();
-			descriptionProvider = contentService
-					.createCommonDescriptionProvider();
-		} else {
-			WorkbenchNavigatorPlugin.log(
-					"Could not acquire INavigatorContentService from part (\"" //$NON-NLS-1$
-							+ part.getTitle() + "\").", null); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object object) {
-		return labelProvider != null ? labelProvider.getImage(object) : null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return descriptionProvider != null ? descriptionProvider
-				.getDescription(object) : null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/workingsets/WorkingSetSorter.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/workingsets/WorkingSetSorter.java
deleted file mode 100644
index 8f0417e..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/workingsets/WorkingSetSorter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.workingsets;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-
-/**
- * @since 3.2
- *
- */
-public class WorkingSetSorter extends ViewerSorter {
-  
-	public int compare(Viewer viewer, Object e1, Object e2) {
-		if(viewer instanceof StructuredViewer) {			
-			 ILabelProvider labelProvider = (ILabelProvider) ((StructuredViewer)viewer).getLabelProvider();
-			 String text1 = labelProvider.getText(e1);
-			 String text2 = labelProvider.getText(e2);
-			 if(text1 != null) {			
-				 return text1.compareTo(text2);
-			 }
-		}
-		return -1;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/workingsets/WorkingSetsContentProvider.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/workingsets/WorkingSetsContentProvider.java
deleted file mode 100644
index 8343889..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/workingsets/WorkingSetsContentProvider.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.workingsets;
-
-import java.util.Map;
-import java.util.WeakHashMap;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkingSet;
-// Access to this internal class can be removed when
-// bug 217955 is fixed
-import org.eclipse.ui.internal.AggregateWorkingSet;
-import org.eclipse.ui.navigator.ICommonContentExtensionSite;
-import org.eclipse.ui.navigator.ICommonContentProvider;
-import org.eclipse.ui.navigator.IExtensionStateModel;
-
-/**
- * Provides children and parents for IWorkingSets.
- * 
- * @since 3.2.1
- * 
- */
-public class WorkingSetsContentProvider implements ICommonContentProvider {
-
-	/**
-	 * The extension id for the WorkingSet extension.
-	 */
-	public static final String EXTENSION_ID = "org.eclipse.ui.navigator.resources.workingSets"; //$NON-NLS-1$
-
-	/**
-	 * A key used by the Extension State Model to keep track of whether top level Working Sets or
-	 * Projects should be shown in the viewer.
-	 */
-	public static final String SHOW_TOP_LEVEL_WORKING_SETS = EXTENSION_ID + ".showTopLevelWorkingSets"; //$NON-NLS-1$
-
-
-	private static final Object[] NO_CHILDREN = new Object[0];
-	/* package */ static final int WORKING_SETS = 0;
-	/* package */ static final int PROJECTS = 1;
-
-	private WorkingSetHelper helper;
-	private int rootMode = WORKING_SETS;
-	private IExtensionStateModel extensionStateModel;	
-
-	private IPropertyChangeListener rootModeListener = new IPropertyChangeListener() {
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-		 */
-		public void propertyChange(PropertyChangeEvent event) {
-			if(SHOW_TOP_LEVEL_WORKING_SETS.equals(event.getProperty())) {
-				updateRootMode();
-			}
-			
-		} 
-
-	};
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.ICommonContentProvider#init(org.eclipse.ui.navigator.ICommonContentExtensionSite)
-	 */  
-	public void init(ICommonContentExtensionSite aConfig) {
-		extensionStateModel = aConfig.getExtensionStateModel(); 
-		extensionStateModel.addPropertyChangeListener(rootModeListener);
-		updateRootMode();
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.IMementoAware#restoreState(org.eclipse.ui.IMemento)
-	 */
-	public void restoreState(IMemento aMemento) { 
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.IMementoAware#saveState(org.eclipse.ui.IMemento)
-	 */
-	public void saveState(IMemento aMemento) { 
-		
-	}
-
-	public Object[] getChildren(Object parentElement) {
-		if (parentElement instanceof IWorkingSet) {
-			IWorkingSet workingSet = (IWorkingSet) parentElement;
-			if (workingSet.isAggregateWorkingSet()) {
-				switch (rootMode) {
-					case WORKING_SETS :
-						return ((AggregateWorkingSet) workingSet).getComponents();
-					case PROJECTS :
-						return workingSet.getElements();
-				}
-			}
-			return workingSet.getElements();
-		}
-		return NO_CHILDREN;
-	}
-
-	public Object getParent(Object element) {
-		if (helper != null)
-			return helper.getParent(element);
-		return null;
-	}
-
-	public boolean hasChildren(Object element) {
-		return true;
-	}
-
-	public Object[] getElements(Object inputElement) {
-		return getChildren(inputElement);
-	}
-
-	public void dispose() {
-		helper = null;
-
-		extensionStateModel.removePropertyChangeListener(rootModeListener);
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		if (newInput instanceof IWorkingSet) {
-			IWorkingSet rootSet = (IWorkingSet) newInput;
-			helper = new WorkingSetHelper(rootSet);
-		}
-
-	} 
- 
-	private void updateRootMode() {
-		if( extensionStateModel.getBooleanProperty(SHOW_TOP_LEVEL_WORKING_SETS) )
-			rootMode = WORKING_SETS;
-		else 
-			rootMode = PROJECTS;
-	}
-
-	protected class WorkingSetHelper {
-
-		private final IWorkingSet workingSet;
-		private final Map parents = new WeakHashMap();
-
-		/**
-		 * Create a Helper class for the given working set
-		 * 
-		 * @param set
-		 *            The set to use to build the item to parent map.
-		 */
-		public WorkingSetHelper(IWorkingSet set) {
-			workingSet = set;
-
-			if (workingSet.isAggregateWorkingSet()) {
-				AggregateWorkingSet aggregateSet = (AggregateWorkingSet) workingSet;
-
-				IWorkingSet[] components = aggregateSet.getComponents();
-
-				for (int componentIndex = 0; componentIndex < components.length; componentIndex++) {
-					IAdaptable[] elements = components[componentIndex].getElements();
-					for (int elementsIndex = 0; elementsIndex < elements.length; elementsIndex++) {
-						parents.put(elements[elementsIndex], components[componentIndex]);
-					}
-					parents.put(components[componentIndex], aggregateSet);
-
-				}
-			} else {
-				IAdaptable[] elements = workingSet.getElements();
-				for (int elementsIndex = 0; elementsIndex < elements.length; elementsIndex++) {
-					parents.put(elements[elementsIndex], workingSet);
-				}
-			}
-		}
-
-		/**
-		 * 
-		 * @param element
-		 *            An element from the viewer
-		 * @return The parent associated with the element, if any.
-		 */
-		public Object getParent(Object element) {
-			return parents.get(element);
-		}
-	}
-	
-
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/workingsets/WorkingSetsLabelProvider.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/workingsets/WorkingSetsLabelProvider.java
deleted file mode 100644
index f49bbfd..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/internal/navigator/workingsets/WorkingSetsLabelProvider.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.workingsets;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * Provides a text label and icon for Working Sets.
- * 
- */
-public class WorkingSetsLabelProvider implements ILabelProvider {
-
-	private WorkbenchLabelProvider labelProvider = new WorkbenchLabelProvider();
-
-	public Image getImage(Object element) {
-		if (element instanceof IWorkingSet)
-			return labelProvider.getImage(element);
-		return null;
-	}
-
-	public String getText(Object element) {
-		if (element instanceof IWorkingSet)
-			return ((IWorkingSet) element).getLabel();
-		return null;
-	}
-
-	public void addListener(ILabelProviderListener listener) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void dispose() {
-		// TODO Auto-generated method stub
-
-	}
-
-	public boolean isLabelProperty(Object element, String property) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	public void removeListener(ILabelProviderListener listener) {
-		// TODO Auto-generated method stub
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/navigator/resources/ProjectExplorer.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/navigator/resources/ProjectExplorer.java
deleted file mode 100644
index 0ec77c4..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/navigator/resources/ProjectExplorer.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.navigator.resources;
-
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.navigator.CommonNavigator;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * Provides constant for the view identifier for the standard instance of the
- * Common Navigator.
- * 
- * @see CommonNavigator
- * @see INavigatorContentService
- * @since 3.2
- * 
- */
-public final class ProjectExplorer {
-
-	/**
-	 * Provides a constant for the standard instance of the Common Navigator.
-	 * 
-	 * @see PlatformUI#getWorkbench()
-	 * @see IWorkbench#getActiveWorkbenchWindow()
-	 * @see IWorkbenchWindow#getActivePage()
-	 * 
-	 * @see IWorkbenchPage#findView(String)
-	 * @see IWorkbenchPage#findViewReference(String)
-	 */
-	public static final String VIEW_ID = "org.eclipse.ui.navigator.ProjectExplorer"; //$NON-NLS-1$
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/navigator/resources/ResourceDragAdapterAssistant.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/navigator/resources/ResourceDragAdapterAssistant.java
deleted file mode 100644
index 24d207e..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/navigator/resources/ResourceDragAdapterAssistant.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.navigator.resources;
-
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.ui.navigator.CommonDragAdapterAssistant;
-import org.eclipse.ui.navigator.INavigatorDnDService;
-import org.eclipse.ui.part.ResourceTransfer;
-import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
-
-/**
- * Clients may reference this class in the <b>dragAssistant</b> element of a
- * <b>org.eclipse.ui.navigator.viewer</b> extension point.
- * 
- * <p>
- * Clients may not extend or instantiate this class for any purpose other than
- * {@link INavigatorDnDService#bindDragAssistant(CommonDragAdapterAssistant)}.
- * Clients may have no direct dependencies on the contract of this class.
- * </p>
- * 
- * @since 3.2
- * 
- */
-public final class ResourceDragAdapterAssistant extends
-		CommonDragAdapterAssistant {
-
-	private static final boolean DEBUG = false;
-
-	private static final Transfer[] SUPPORTED_TRANSFERS = new Transfer[] {
-			ResourceTransfer.getInstance(),
-			LocalSelectionTransfer.getInstance(), FileTransfer.getInstance() };
-
-	private static final Class IRESOURCE_TYPE = IResource.class;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.CommonDragAdapterAssistant#getSupportedTransferTypes()
-	 */
-	public Transfer[] getSupportedTransferTypes() {
-		return SUPPORTED_TRANSFERS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.CommonDragAdapterAssistant#setDragData(org.eclipse.swt.dnd.DragSourceEvent,
-	 *      org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean setDragData(DragSourceEvent anEvent,
-			IStructuredSelection aSelection) {
-
-		if (LocalSelectionTransfer.getInstance().isSupportedType(
-				anEvent.dataType)) {
-			anEvent.data = aSelection;
-			if (DEBUG) {
-				System.out
-						.println("ResourceDragAdapterAssistant.dragSetData set LocalSelectionTransfer"); //$NON-NLS-1$
-			}
-			return true;
-		} else if (ResourceTransfer.getInstance().isSupportedType(
-				anEvent.dataType)) {
-			anEvent.data = getSelectedResources(aSelection);
-			if (DEBUG) {
-				System.out
-						.println("ResourceDragAdapterAssistant.dragSetData set ResourceTransfer"); //$NON-NLS-1$
-			}
-			return true;
-		} else if (FileTransfer.getInstance().isSupportedType(anEvent.dataType)) {
-
-			IResource[] resources = getSelectedResources(aSelection);
-
-			// Get the path of each file and set as the drag data
-			final int length = resources.length;
-			int actualLength = 0;
-			String[] fileNames = new String[length];
-			for (int i = 0; i < length; i++) {
-				IPath location = resources[i].getLocation();
-				// location may be null. See bug 29491.
-				if (location != null) {
-					fileNames[actualLength++] = location.toOSString();
-				}
-			}
-			if (actualLength > 0) { 
-				// was one or more of the locations null?
-				if (actualLength < length) {
-					String[] tempFileNames = fileNames;
-					fileNames = new String[actualLength];
-					for (int i = 0; i < actualLength; i++)
-						fileNames[i] = tempFileNames[i];
-				}
-				anEvent.data = fileNames;
-	
-				if (DEBUG)
-					System.out
-							.println("ResourceDragAdapterAssistant.dragSetData set FileTransfer"); //$NON-NLS-1$
-				return true;
-			}
-		}
-		return false;
-
-	}
-
-	private IResource[] getSelectedResources(IStructuredSelection aSelection) {
-		Set resources = new LinkedHashSet();
-		IResource resource = null;
-		for (Iterator iter = aSelection.iterator(); iter.hasNext();) {
-			Object selected = iter.next();
-			resource = adaptToResource(selected);
-			if (resource != null) {
-				resources.add(resource);
-		}
-		}
-		return (IResource[]) resources.toArray(new IResource[resources.size()]);
-	}
-
-	private IResource adaptToResource(Object selected) {
-		IResource resource;
-		if (selected instanceof IResource) {
-			resource = (IResource) selected;
-		} else if (selected instanceof IAdaptable) {
-			resource = (IResource) ((IAdaptable) selected)
-					.getAdapter(IRESOURCE_TYPE);
-		} else {
-			resource = (IResource) Platform.getAdapterManager().getAdapter(
-					selected, IRESOURCE_TYPE);
-		}
-		return resource;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/navigator/resources/ResourceDropAdapterAssistant.java b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/navigator/resources/ResourceDropAdapterAssistant.java
deleted file mode 100644
index 327076d..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/navigator/resources/ResourceDropAdapterAssistant.java
+++ /dev/null
@@ -1,522 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.navigator.resources;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.CopyFilesAndFoldersOperation;
-import org.eclipse.ui.actions.MoveFilesAndFoldersOperation;
-import org.eclipse.ui.actions.ReadOnlyStateChecker;
-import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorMessages;
-import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorPlugin;
-import org.eclipse.ui.navigator.CommonDropAdapter;
-import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
-import org.eclipse.ui.part.ResourceTransfer;
-
-/**
- *  
- * Clients may reference this class in the <b>dropAssistant</b> element of a
- * <b>org.eclipse.ui.navigator.navigatorContent</b> extension point.
- * 
- * <p>
- * Clients may not extend or instantiate this class for any purpose.
- * Clients may have no direct dependencies on the contract of this class.
- * </p>
- * 
- * @since 3.2
- * 
- */ 
-public class ResourceDropAdapterAssistant extends CommonDropAdapterAssistant {
-
-	private static final boolean DEBUG = false;
-	private static final IResource[] NO_RESOURCES = new IResource[0];
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#isSupportedType(org.eclipse.swt.dnd.TransferData)
-	 */
-	public boolean isSupportedType(TransferData aTransferType) {
-		return super.isSupportedType(aTransferType)
-				|| FileTransfer.getInstance().isSupportedType(aTransferType);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#validateDrop(java.lang.Object,
-	 *      int, org.eclipse.swt.dnd.TransferData)
-	 */
-	public IStatus validateDrop(Object target, int aDropOperation,
-			TransferData transferType) {
-
-		if (!(target instanceof IResource)) {
-			return WorkbenchNavigatorPlugin
-					.createStatus(
-							IStatus.INFO,
-							0,
-							WorkbenchNavigatorMessages.DropAdapter_targetMustBeResource,
-							null);
-		}
-		IResource resource = (IResource) target;
-		if (!resource.isAccessible()) {
-			return WorkbenchNavigatorPlugin
-					.createErrorStatus(
-							0,
-							WorkbenchNavigatorMessages.DropAdapter_canNotDropIntoClosedProject,
-							null);
-		}
-		IContainer destination = getActualTarget(resource);
-		if (destination.getType() == IResource.ROOT) {
-			return WorkbenchNavigatorPlugin
-					.createErrorStatus(
-							0,
-							WorkbenchNavigatorMessages.DropAdapter_resourcesCanNotBeSiblings,
-							null);
-		}
-		String message = null;
-		// drag within Eclipse?
-		if (LocalSelectionTransfer.getTransfer().isSupportedType(transferType)) {
-			IResource[] selectedResources = getSelectedResources();
-			
-			boolean bProjectDrop = false;
-			for (int iRes = 0; iRes < selectedResources.length; iRes++) {
-				IResource res = selectedResources[iRes];
-				if(res instanceof IProject) {
-					bProjectDrop = true;
-				}
-			}
-			if(bProjectDrop) {
-				// drop of projects not supported on other IResources
-				// "Path for project must have only one segment."
-				message = WorkbenchNavigatorMessages.DropAdapter_canNotDropProjectIntoProject;
-			} else {
-				if (selectedResources.length == 0) {
-					message = WorkbenchNavigatorMessages.DropAdapter_dropOperationErrorOther;
-				} else {
-					CopyFilesAndFoldersOperation operation;
-					if (aDropOperation == DND.DROP_COPY) {
-						if (DEBUG) {
-							System.out
-									.println("ResourceDropAdapterAssistant.validateDrop validating COPY."); //$NON-NLS-1$
-						}
-	
-						operation = new CopyFilesAndFoldersOperation(getShell());
-					} else {
-						if (DEBUG) {
-							System.out
-									.println("ResourceDropAdapterAssistant.validateDrop validating MOVE."); //$NON-NLS-1$
-						}
-						operation = new MoveFilesAndFoldersOperation(getShell());
-					}
-					message = operation.validateDestination(destination,
-							selectedResources);
-				}
-			}
-		} // file import?
-		else if (FileTransfer.getInstance().isSupportedType(transferType)) {
-			String[] sourceNames = (String[]) FileTransfer.getInstance()
-					.nativeToJava(transferType);
-			if (sourceNames == null) {
-				// source names will be null on Linux. Use empty names to do
-				// destination validation.
-				// Fixes bug 29778
-				sourceNames = new String[0];
-			}
-			CopyFilesAndFoldersOperation copyOperation = new CopyFilesAndFoldersOperation(
-					getShell());
-			message = copyOperation.validateImportDestination(destination,
-					sourceNames);
-		}
-		if (message != null) {
-			return WorkbenchNavigatorPlugin.createErrorStatus(0, message, null);
-		}
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#handleDrop(CommonDropAdapter,
-	 *      DropTargetEvent, Object)
-	 */
-	public IStatus handleDrop(CommonDropAdapter aDropAdapter,
-			DropTargetEvent aDropTargetEvent, Object aTarget) {
-
-		if (DEBUG) {
-			System.out
-					.println("ResourceDropAdapterAssistant.handleDrop (begin)"); //$NON-NLS-1$
-		}
-
-		// alwaysOverwrite = false;
-		if (aDropAdapter.getCurrentTarget() == null
-				|| aDropTargetEvent.data == null) {
-			return Status.CANCEL_STATUS;
-		}
-		IStatus status = null;
-		IResource[] resources = null;
-		TransferData currentTransfer = aDropAdapter.getCurrentTransfer();
-		if (LocalSelectionTransfer.getTransfer().isSupportedType(
-				currentTransfer)) {
-			resources = getSelectedResources();
-		} else if (ResourceTransfer.getInstance().isSupportedType(
-				currentTransfer)) {
-			resources = (IResource[]) aDropTargetEvent.data;
-		}
-
-		if (FileTransfer.getInstance().isSupportedType(currentTransfer)) {
-			status = performFileDrop(aDropAdapter, aDropTargetEvent.data);
-		} else if (resources != null && resources.length > 0) {
-			if (aDropAdapter.getCurrentOperation() == DND.DROP_COPY) {
-				if (DEBUG) {
-					System.out
-							.println("ResourceDropAdapterAssistant.handleDrop executing COPY."); //$NON-NLS-1$
-				}
-				status = performResourceCopy(aDropAdapter, getShell(),
-						resources);
-			} else {
-				if (DEBUG) {
-					System.out
-							.println("ResourceDropAdapterAssistant.handleDrop executing MOVE."); //$NON-NLS-1$
-				}
-
-				status = performResourceMove(aDropAdapter, resources);
-			}
-		}
-		openError(status);
-		IContainer target = getActualTarget((IResource) aDropAdapter
-				.getCurrentTarget());
-		if (target != null && target.isAccessible()) {
-			try {
-				target.refreshLocal(IResource.DEPTH_ONE, null);
-			} catch (CoreException e) {
-			}
-		}
-		return status;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#validatePluginTransferDrop(org.eclipse.jface.viewers.IStructuredSelection,
-	 *      java.lang.Object)
-	 */
-	public IStatus validatePluginTransferDrop(
-			IStructuredSelection aDragSelection, Object aDropTarget) {
-		if (!(aDropTarget instanceof IResource)) {
-			return WorkbenchNavigatorPlugin
-					.createStatus(
-							IStatus.INFO,
-							0,
-							WorkbenchNavigatorMessages.DropAdapter_targetMustBeResource,
-							null);
-		}
-		IResource resource = (IResource) aDropTarget;
-		if (!resource.isAccessible()) {
-			return WorkbenchNavigatorPlugin
-					.createErrorStatus(
-							0,
-							WorkbenchNavigatorMessages.DropAdapter_canNotDropIntoClosedProject,
-							null);
-		}
-		IContainer destination = getActualTarget(resource);
-		if (destination.getType() == IResource.ROOT) {
-			return WorkbenchNavigatorPlugin
-					.createErrorStatus(
-							0,
-							WorkbenchNavigatorMessages.DropAdapter_resourcesCanNotBeSiblings,
-							null);
-		}
-
-		IResource[] selectedResources = getSelectedResources(aDragSelection);
-
-		String message = null;
-		if (selectedResources.length == 0) {
-			message = WorkbenchNavigatorMessages.DropAdapter_dropOperationErrorOther;
-		} else {
-			MoveFilesAndFoldersOperation operation;
-
-			operation = new MoveFilesAndFoldersOperation(getShell());
-			message = operation.validateDestination(destination,
-					selectedResources);
-		}
-		if (message != null) {
-			return WorkbenchNavigatorPlugin.createErrorStatus(0, message, null);
-		}
-		return Status.OK_STATUS;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#handlePluginTransferDrop(org.eclipse.jface.viewers.IStructuredSelection, java.lang.Object)
-	 */
-	public IStatus handlePluginTransferDrop(IStructuredSelection aDragSelection, Object aDropTarget) {
-
-		IContainer target = getActualTarget((IResource) aDropTarget);
-		IResource[] resources = getSelectedResources(aDragSelection);
-		
-		MoveFilesAndFoldersOperation operation = new MoveFilesAndFoldersOperation(
-				 getShell());
-		operation.copyResources(resources, target);
-
-		if (target != null && target.isAccessible()) {
-			try {
-				target.refreshLocal(IResource.DEPTH_ONE, null);
-			} catch (CoreException e) {
-			}
-		}
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Returns the actual target of the drop, given the resource under the
-	 * mouse. If the mouse target is a file, then the drop actually occurs in
-	 * its parent. If the drop location is before or after the mouse target and
-	 * feedback is enabled, the target is also the parent.
-	 */
-	private IContainer getActualTarget(IResource mouseTarget) {
-
-		/* if cursor is on a file, return the parent */
-		if (mouseTarget.getType() == IResource.FILE) {
-			return mouseTarget.getParent();
-		}
-		/* otherwise the mouseTarget is the real target */
-		return (IContainer) mouseTarget;
-	}
-
-	/**
-	 * Returns the resource selection from the LocalSelectionTransfer.
-	 * 
-	 * @return the resource selection from the LocalSelectionTransfer
-	 */
-	private IResource[] getSelectedResources() {
-
-		ISelection selection = LocalSelectionTransfer.getTransfer()
-				.getSelection();
-		if (selection instanceof IStructuredSelection) {
-			return getSelectedResources((IStructuredSelection)selection);
-		} 
-		return NO_RESOURCES;
-	}
-
-	/**
-	 * Returns the resource selection from the LocalSelectionTransfer.
-	 * 
-	 * @return the resource selection from the LocalSelectionTransfer
-	 */
-	private IResource[] getSelectedResources(IStructuredSelection selection) {
-		ArrayList selectedResources = new ArrayList();
-
-		for (Iterator i = selection.iterator(); i.hasNext();) {
-			Object o = i.next();
-			if (o instanceof IResource) {
-				selectedResources.add(o);
-			} else if (o instanceof IAdaptable) {
-				IAdaptable a = (IAdaptable) o;
-				IResource r = (IResource) a.getAdapter(IResource.class);
-				if (r != null) {
-					selectedResources.add(r);
-				}
-			}
-		}
-		return (IResource[]) selectedResources
-				.toArray(new IResource[selectedResources.size()]);
-	}
-
-	/**
-	 * Performs a resource copy
-	 */
-	private IStatus performResourceCopy(CommonDropAdapter dropAdapter,
-			Shell shell, IResource[] sources) {
-		MultiStatus problems = new MultiStatus(PlatformUI.PLUGIN_ID, 1,
-				WorkbenchNavigatorMessages.DropAdapter_problemsMoving, null);
-		mergeStatus(problems, validateTarget(dropAdapter.getCurrentTarget(),
-				dropAdapter.getCurrentTransfer(), dropAdapter
-						.getCurrentOperation()));
-
-		IContainer target = getActualTarget((IResource) dropAdapter
-				.getCurrentTarget());
-		CopyFilesAndFoldersOperation operation = new CopyFilesAndFoldersOperation(
-				shell);
-		operation.copyResources(sources, target);
-
-		return problems;
-	}
-
-	/**
-	 * Performs a resource move
-	 */
-	private IStatus performResourceMove(CommonDropAdapter dropAdapter,
-			IResource[] sources) {
-		MultiStatus problems = new MultiStatus(PlatformUI.PLUGIN_ID, 1,
-				WorkbenchNavigatorMessages.DropAdapter_problemsMoving, null);
-		mergeStatus(problems, validateTarget(dropAdapter.getCurrentTarget(),
-				dropAdapter.getCurrentTransfer(), dropAdapter
-						.getCurrentOperation()));
-
-		IContainer target = getActualTarget((IResource) dropAdapter
-				.getCurrentTarget());
-		ReadOnlyStateChecker checker = new ReadOnlyStateChecker(getShell(),
-				WorkbenchNavigatorMessages.MoveResourceAction_title,
-				WorkbenchNavigatorMessages.MoveResourceAction_checkMoveMessage);
-		sources = checker.checkReadOnlyResources(sources);
-		MoveFilesAndFoldersOperation operation = new MoveFilesAndFoldersOperation(
-				getShell());
-		operation.copyResources(sources, target);
-
-		return problems;
-	}
-
-	/**
-	 * Performs a drop using the FileTransfer transfer type.
-	 */
-	private IStatus performFileDrop(CommonDropAdapter anAdapter, Object data) {
-		MultiStatus problems = new MultiStatus(PlatformUI.PLUGIN_ID, 0,
-				WorkbenchNavigatorMessages.DropAdapter_problemImporting, null);
-		mergeStatus(problems,
-				validateTarget(anAdapter.getCurrentTarget(), anAdapter
-						.getCurrentTransfer(), anAdapter.getCurrentOperation()));
-
-		final IContainer target = getActualTarget((IResource) anAdapter
-				.getCurrentTarget());
-		final String[] names = (String[]) data;
-		// Run the import operation asynchronously.
-		// Otherwise the drag source (e.g., Windows Explorer) will be blocked
-		// while the operation executes. Fixes bug 16478.
-		Display.getCurrent().asyncExec(new Runnable() {
-			public void run() {
-				getShell().forceActive();
-				CopyFilesAndFoldersOperation operation = new CopyFilesAndFoldersOperation(
-						getShell());
-				operation.copyFiles(names, target);
-			}
-		});
-		return problems;
-	}
-
-	/**
-	 * Ensures that the drop target meets certain criteria
-	 */
-	private IStatus validateTarget(Object target, TransferData transferType,
-			int dropOperation) {
-		if (!(target instanceof IResource)) {
-			return WorkbenchNavigatorPlugin
-					.createInfoStatus(WorkbenchNavigatorMessages.DropAdapter_targetMustBeResource);
-		}
-		IResource resource = (IResource) target;
-		if (!resource.isAccessible()) {
-			return WorkbenchNavigatorPlugin
-					.createErrorStatus(WorkbenchNavigatorMessages.DropAdapter_canNotDropIntoClosedProject);
-		}
-		IContainer destination = getActualTarget(resource);
-		if (destination.getType() == IResource.ROOT) {
-			return WorkbenchNavigatorPlugin
-					.createErrorStatus(WorkbenchNavigatorMessages.DropAdapter_resourcesCanNotBeSiblings);
-		}
-		String message = null;
-		// drag within Eclipse?
-		if (LocalSelectionTransfer.getTransfer().isSupportedType(transferType)) {
-			IResource[] selectedResources = getSelectedResources();
-
-			if (selectedResources.length == 0) {
-				message = WorkbenchNavigatorMessages.DropAdapter_dropOperationErrorOther;
-			} else {
-				CopyFilesAndFoldersOperation operation;
-				if (dropOperation == DND.DROP_COPY) {
-					operation = new CopyFilesAndFoldersOperation(getShell());
-				} else {
-					operation = new MoveFilesAndFoldersOperation(getShell());
-				}
-				message = operation.validateDestination(destination,
-						selectedResources);
-			}
-		} // file import?
-		else if (FileTransfer.getInstance().isSupportedType(transferType)) {
-			String[] sourceNames = (String[]) FileTransfer.getInstance()
-					.nativeToJava(transferType);
-			if (sourceNames == null) {
-				// source names will be null on Linux. Use empty names to do
-				// destination validation.
-				// Fixes bug 29778
-				sourceNames = new String[0];
-			}
-			CopyFilesAndFoldersOperation copyOperation = new CopyFilesAndFoldersOperation(
-					getShell());
-			message = copyOperation.validateImportDestination(destination,
-					sourceNames);
-		}
-		if (message != null) {
-			return WorkbenchNavigatorPlugin.createErrorStatus(message);
-		}
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Adds the given status to the list of problems. Discards OK statuses. If
-	 * the status is a multi-status, only its children are added.
-	 */
-	private void mergeStatus(MultiStatus status, IStatus toMerge) {
-		if (!toMerge.isOK()) {
-			status.merge(toMerge);
-		}
-	}
-
-	/**
-	 * Opens an error dialog if necessary. Takes care of complex rules necessary
-	 * for making the error dialog look nice.
-	 */
-	private void openError(IStatus status) {
-		if (status == null) {
-			return;
-		}
-
-		String genericTitle = WorkbenchNavigatorMessages.DropAdapter_title;
-		int codes = IStatus.ERROR | IStatus.WARNING;
-
-		// simple case: one error, not a multistatus
-		if (!status.isMultiStatus()) {
-			ErrorDialog
-					.openError(getShell(), genericTitle, null, status, codes);
-			return;
-		}
-
-		// one error, single child of multistatus
-		IStatus[] children = status.getChildren();
-		if (children.length == 1) {
-			ErrorDialog.openError(getShell(), status.getMessage(), null,
-					children[0], codes);
-			return;
-		}
-		// several problems
-		ErrorDialog.openError(getShell(), genericTitle, null, status, codes);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/navigator/resources/package.html b/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/navigator/resources/package.html
deleted file mode 100644
index 97fe4e7..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/src/org/eclipse/ui/navigator/resources/package.html
+++ /dev/null
@@ -1,11 +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">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides reusable components for clients that need to expand on the capabilities
-provided by the reference Common Navigator Resources extension.
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.navigator.resources/test.txt b/bundles/org.eclipse.ui.navigator.resources/test.txt
deleted file mode 100644
index 30d74d2..0000000
--- a/bundles/org.eclipse.ui.navigator.resources/test.txt
+++ /dev/null
@@ -1 +0,0 @@
-test
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.navigator/.classpath b/bundles/org.eclipse.ui.navigator/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.ui.navigator/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.ui.navigator/.cvsignore b/bundles/org.eclipse.ui.navigator/.cvsignore
deleted file mode 100644
index 9e03f0a..0000000
--- a/bundles/org.eclipse.ui.navigator/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-temp.folder
-navigator.jar
-build.xml
-doc
diff --git a/bundles/org.eclipse.ui.navigator/.options b/bundles/org.eclipse.ui.navigator/.options
deleted file mode 100755
index e7b9e06..0000000
--- a/bundles/org.eclipse.ui.navigator/.options
+++ /dev/null
@@ -1,14 +0,0 @@
-# Debugging options for the org.eclipse.ui.navigator plugin.
-
-# Turn on debugging for the org.eclipse.navigator plugin.
-org.eclipse.ui.navigator/debug=false
-
-# Shows the reading and setup of the extensions
-org.eclipse.ui.navigator/debug/setup=false
-
-# Extension resolution
-org.eclipse.ui.navigator/debug/resolution=false
-
-# Drag and drop 
-org.eclipse.ui.navigator/debug/dnd=false
-
diff --git a/bundles/org.eclipse.ui.navigator/.project b/bundles/org.eclipse.ui.navigator/.project
deleted file mode 100644
index d14a930..0000000
--- a/bundles/org.eclipse.ui.navigator/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.navigator</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.navigator/.settings/.api_filters b/bundles/org.eclipse.ui.navigator/.settings/.api_filters
deleted file mode 100644
index 90f9470..0000000
--- a/bundles/org.eclipse.ui.navigator/.settings/.api_filters
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<component id="org.eclipse.ui.navigator" version="2">
-<resource path="src/org/eclipse/ui/navigator/INavigatorContentExtension.java" type="org.eclipse.ui.navigator.INavigatorContentExtension">
-<filter id="403853384">
-<message_arguments>
-<message_argument value="org.eclipse.ui.navigator.INavigatorContentExtension"/>
-</message_arguments>
-</filter>
-</resource>
-<resource path="src/org/eclipse/ui/navigator/INavigatorSaveablesService.java" type="org.eclipse.ui.navigator.INavigatorSaveablesService">
-<filter id="403853384">
-<message_arguments>
-<message_argument value="org.eclipse.ui.navigator.INavigatorSaveablesService"/>
-</message_arguments>
-</filter>
-</resource>
-<resource path="src/org/eclipse/ui/navigator/IExtensionStateModel.java" type="org.eclipse.ui.navigator.IExtensionStateModel">
-<filter id="403853384">
-<message_arguments>
-<message_argument value="org.eclipse.ui.navigator.IExtensionStateModel"/>
-</message_arguments>
-</filter>
-</resource>
-<resource path="src/org/eclipse/ui/navigator/INavigatorDnDService.java" type="org.eclipse.ui.navigator.INavigatorDnDService">
-<filter id="403853384">
-<message_arguments>
-<message_argument value="org.eclipse.ui.navigator.INavigatorDnDService"/>
-</message_arguments>
-</filter>
-</resource>
-<resource path="src/org/eclipse/ui/navigator/INavigatorContentDescriptor.java" type="org.eclipse.ui.navigator.INavigatorContentDescriptor">
-<filter id="405901410">
-<message_arguments>
-<message_argument value="org.eclipse.ui.navigator.INavigatorContentDescriptor"/>
-<message_argument value="getOverridePolicy()"/>
-</message_arguments>
-</filter>
-</resource>
-<resource path="src/org/eclipse/ui/navigator/INavigatorFilterService.java" type="org.eclipse.ui.navigator.INavigatorFilterService">
-<filter id="403853384">
-<message_arguments>
-<message_argument value="org.eclipse.ui.navigator.INavigatorFilterService"/>
-</message_arguments>
-</filter>
-</resource>
-<resource path="src/org/eclipse/ui/navigator/INavigatorViewerDescriptor.java" type="org.eclipse.ui.navigator.INavigatorViewerDescriptor">
-<filter id="403853384">
-<message_arguments>
-<message_argument value="org.eclipse.ui.navigator.INavigatorViewerDescriptor"/>
-</message_arguments>
-</filter>
-</resource>
-<resource path="src/org/eclipse/ui/navigator/CommonViewer.java" type="org.eclipse.ui.navigator.CommonViewer">
-<filter id="571473929">
-<message_arguments>
-<message_argument value="TreeViewer"/>
-<message_argument value="CommonViewer"/>
-</message_arguments>
-</filter>
-</resource>
-<resource path="src/org/eclipse/ui/navigator/INavigatorPipelineService.java" type="org.eclipse.ui.navigator.INavigatorPipelineService">
-<filter id="403853384">
-<message_arguments>
-<message_argument value="org.eclipse.ui.navigator.INavigatorPipelineService"/>
-</message_arguments>
-</filter>
-</resource>
-<resource path="src/org/eclipse/ui/navigator/INavigatorSorterService.java" type="org.eclipse.ui.navigator.INavigatorSorterService">
-<filter id="403853384">
-<message_arguments>
-<message_argument value="org.eclipse.ui.navigator.INavigatorSorterService"/>
-</message_arguments>
-</filter>
-</resource>
-</component>
diff --git a/bundles/org.eclipse.ui.navigator/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.ui.navigator/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index bbc66df..0000000
--- a/bundles/org.eclipse.ui.navigator/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,72 +0,0 @@
-#Fri Aug 15 19:28:47 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.ui.navigator/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.ui.navigator/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index b653c09..0000000
--- a/bundles/org.eclipse.ui.navigator/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Thu Jul 21 14:21:56 EDT 2005
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.3\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/bundles/org.eclipse.ui.navigator/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.ui.navigator/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index d8e8469..0000000
--- a/bundles/org.eclipse.ui.navigator/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Nov 16 14:12:29 EST 2004
-compilers.p.unused-element-or-attribute=1
-compilers.p.unresolved-ex-points=0
-compilers.p.deprecated=0
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unknown-class=1
-compilers.p.unknown-attribute=0
-compilers.p.no-required-att=0
-eclipse.preferences.version=1
-compilers.p.unresolved-import=0
-compilers.p.not-externalized-att=0
-compilers.p.illegal-att-value=0
-compilers.use-project=true
diff --git a/bundles/org.eclipse.ui.navigator/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.navigator/META-INF/MANIFEST.MF
deleted file mode 100644
index d5d50f2..0000000
--- a/bundles/org.eclipse.ui.navigator/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,22 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui.navigator; singleton:=true
-Bundle-Version: 3.4.0.qualifier
-Bundle-Activator: org.eclipse.ui.internal.navigator.NavigatorPlugin
-Bundle-Vendor: %Plugin.providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.ui.internal.navigator;x-friends:="org.eclipse.ui.navigator.ide,org.eclipse.ui.navigator.resources",
- org.eclipse.ui.internal.navigator.actions;x-friends:="org.eclipse.ui.navigator.ide,org.eclipse.ui.navigator.resources",
- org.eclipse.ui.internal.navigator.dnd;x-friends:="org.eclipse.ui.navigator.ide,org.eclipse.ui.navigator.resources",
- org.eclipse.ui.internal.navigator.extensions;x-friends:="org.eclipse.ui.navigator.ide,org.eclipse.ui.navigator.resources",
- org.eclipse.ui.internal.navigator.filters;x-friends:="org.eclipse.ui.navigator.ide,org.eclipse.ui.navigator.resources,org.eclipse.ui.tests.navigator",
- org.eclipse.ui.internal.navigator.sorters;x-internal:=true,
- org.eclipse.ui.internal.navigator.wizards;x-internal:=true,
- org.eclipse.ui.navigator
-Require-Bundle: 
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui;bundle-version="[3.5.0,4.0.0)",
- org.eclipse.core.expressions;bundle-version="[3.2.0,4.0.0)"
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.ui.navigator/about.html b/bundles/org.eclipse.ui.navigator/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.ui.navigator/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.navigator/build.properties b/bundles/org.eclipse.ui.navigator/build.properties
deleted file mode 100644
index 17b04be..0000000
--- a/bundles/org.eclipse.ui.navigator/build.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-bin.includes = plugin.xml,\
-               icons/,\
-               .,\
-               META-INF/,\
-               plugin.properties,\
-               about.html
-output.. = bin/
-src.includes = about.html,\
-               schema/
diff --git a/bundles/org.eclipse.ui.navigator/icons/full/clcl16/collapseall.gif b/bundles/org.eclipse.ui.navigator/icons/full/clcl16/collapseall.gif
deleted file mode 100644
index 0bae56c..0000000
--- a/bundles/org.eclipse.ui.navigator/icons/full/clcl16/collapseall.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator/icons/full/clcl16/elipses.gif b/bundles/org.eclipse.ui.navigator/icons/full/clcl16/elipses.gif
deleted file mode 100644
index cb41506..0000000
--- a/bundles/org.eclipse.ui.navigator/icons/full/clcl16/elipses.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator/icons/full/clcl16/pause.gif b/bundles/org.eclipse.ui.navigator/icons/full/clcl16/pause.gif
deleted file mode 100644
index d645fa5..0000000
--- a/bundles/org.eclipse.ui.navigator/icons/full/clcl16/pause.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator/icons/full/clcl16/synced.gif b/bundles/org.eclipse.ui.navigator/icons/full/clcl16/synced.gif
deleted file mode 100644
index f865f3a..0000000
--- a/bundles/org.eclipse.ui.navigator/icons/full/clcl16/synced.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator/icons/full/elcl16/collapseall.gif b/bundles/org.eclipse.ui.navigator/icons/full/elcl16/collapseall.gif
deleted file mode 100644
index a2d80a9..0000000
--- a/bundles/org.eclipse.ui.navigator/icons/full/elcl16/collapseall.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator/icons/full/elcl16/content.gif b/bundles/org.eclipse.ui.navigator/icons/full/elcl16/content.gif
deleted file mode 100644
index 17f927e..0000000
--- a/bundles/org.eclipse.ui.navigator/icons/full/elcl16/content.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator/icons/full/elcl16/filter_ps.gif b/bundles/org.eclipse.ui.navigator/icons/full/elcl16/filter_ps.gif
deleted file mode 100644
index a4c9e60..0000000
--- a/bundles/org.eclipse.ui.navigator/icons/full/elcl16/filter_ps.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator/icons/full/elcl16/synced.gif b/bundles/org.eclipse.ui.navigator/icons/full/elcl16/synced.gif
deleted file mode 100644
index 870934b..0000000
--- a/bundles/org.eclipse.ui.navigator/icons/full/elcl16/synced.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator/javadoc-images/framework-overview.jpg b/bundles/org.eclipse.ui.navigator/javadoc-images/framework-overview.jpg
deleted file mode 100644
index 95122e2..0000000
--- a/bundles/org.eclipse.ui.navigator/javadoc-images/framework-overview.jpg
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator/javadoc-images/navigator_logical_extension.jpg b/bundles/org.eclipse.ui.navigator/javadoc-images/navigator_logical_extension.jpg
deleted file mode 100644
index eff9f7c..0000000
--- a/bundles/org.eclipse.ui.navigator/javadoc-images/navigator_logical_extension.jpg
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.navigator/jdt-patch/org.eclipse.jdt.ui_patch.txt b/bundles/org.eclipse.ui.navigator/jdt-patch/org.eclipse.jdt.ui_patch.txt
deleted file mode 100644
index 45bdabc..0000000
--- a/bundles/org.eclipse.ui.navigator/jdt-patch/org.eclipse.jdt.ui_patch.txt
+++ /dev/null
@@ -1,1577 +0,0 @@
-### Eclipse Workspace Patch 1.0
-#P org.eclipse.jdt.ui
-Index: ui/org/eclipse/jdt/internal/ui/workingsets/ConfigureWorkingSetAction.java
-===================================================================
-RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/workingsets/ConfigureWorkingSetAction.java,v
-retrieving revision 1.9
-diff -u -r1.9 ConfigureWorkingSetAction.java
---- ui/org/eclipse/jdt/internal/ui/workingsets/ConfigureWorkingSetAction.java	18 Nov 2005 14:45:35 -0000	1.9
-+++ ui/org/eclipse/jdt/internal/ui/workingsets/ConfigureWorkingSetAction.java	8 Feb 2006 00:46:03 -0000
-@@ -14,6 +14,8 @@
- import java.util.Arrays;
- import java.util.List;
- 
-+import org.eclipse.swt.widgets.Shell;
-+
- import org.eclipse.jface.action.Action;
- import org.eclipse.jface.dialogs.IDialogConstants;
- 
-@@ -21,13 +23,18 @@
- import org.eclipse.ui.IWorkingSet;
- 
- public class ConfigureWorkingSetAction extends Action {
--
--	private final IWorkbenchPartSite fSite;
-+ 
- 	private WorkingSetModel fWorkingSetModel;
-+	private Shell fShell; 
- 
- 	public ConfigureWorkingSetAction(IWorkbenchPartSite site) {
- 		super(WorkingSetMessages.ConfigureWorkingSetAction_label); 
--		fSite= site;
-+		fShell= site.getShell();
-+	}
-+	
-+	public ConfigureWorkingSetAction(Shell shell) {
-+		super(WorkingSetMessages.ConfigureWorkingSetAction_label); 
-+		fShell= shell;
- 	}
- 	
- 	public void setWorkingSetModel(WorkingSetModel model) {
-@@ -39,9 +46,10 @@
- 	 */
- 	public void run() {
- 		List workingSets= new ArrayList(Arrays.asList(fWorkingSetModel.getAllWorkingSets()));
-+
- 		IWorkingSet[] activeWorkingSets= fWorkingSetModel.getActiveWorkingSets();
- 		WorkingSetConfigurationDialog dialog= new WorkingSetConfigurationDialog(
--			fSite.getShell(), 
-+			fShell, 
- 			(IWorkingSet[])workingSets.toArray(new IWorkingSet[workingSets.size()]),
- 			activeWorkingSets); 
- 		dialog.setSelection(activeWorkingSets);
-Index: ui/org/eclipse/jdt/internal/ui/workingsets/ViewActionGroup.java
-===================================================================
-RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/workingsets/ViewActionGroup.java,v
-retrieving revision 1.8
-diff -u -r1.8 ViewActionGroup.java
---- ui/org/eclipse/jdt/internal/ui/workingsets/ViewActionGroup.java	13 Apr 2005 17:35:11 -0000	1.8
-+++ ui/org/eclipse/jdt/internal/ui/workingsets/ViewActionGroup.java	8 Feb 2006 00:46:03 -0000
-@@ -45,7 +45,12 @@
- 
- 	public ViewActionGroup(int mode, IPropertyChangeListener changeListener, IWorkbenchPartSite site) {
- 		fChangeListener= changeListener;
--		fFilterActionGroup= new WorkingSetFilterActionGroup(site, changeListener);
-+		if(fChangeListener == null) {
-+			fChangeListener = new IPropertyChangeListener() {
-+				public void propertyChange(PropertyChangeEvent event) {}
-+			};
-+		}
-+		fFilterActionGroup= new WorkingSetFilterActionGroup(site, fChangeListener);
- 		fShowActionGroup= new WorkingSetShowActionGroup(site);
- 		fMode= mode;
- 		if (showWorkingSets())
-@@ -70,16 +75,24 @@
- 	 */
- 	public void fillActionBars(IActionBars actionBars) {
- 		super.fillActionBars(actionBars);
--		fMenuManager= actionBars.getMenuManager();
--		IMenuManager showMenu= new MenuManager(WorkingSetMessages.ViewActionGroup_show_label); 
--		fillShowMenu(showMenu);
--		fMenuManager.add(showMenu);
--		fMenuManager.add(new Separator(IWorkingSetActionGroup.ACTION_GROUP));
-+		if(fMenuManager == null) {
-+			fMenuManager= actionBars.getMenuManager();
-+			fillViewMenu(fMenuManager);
-+		}
-+
- 		if (fActiveActionGroup == null)
- 			fActiveActionGroup= fFilterActionGroup;
- 		((ActionGroup)fActiveActionGroup).fillActionBars(actionBars);
- 	}
- 	
-+	private void fillViewMenu(IMenuManager menu) { 
-+		
-+		IMenuManager showMenu= new MenuManager(WorkingSetMessages.ViewActionGroup_show_label); 
-+		fillShowMenu(showMenu);
-+		menu.add(showMenu);
-+		menu.add(new Separator(IWorkingSetActionGroup.ACTION_GROUP));
-+	}
-+	
- 	private void fillShowMenu(IMenuManager menu) {
- 		ViewAction projects= new ViewAction(this, SHOW_PROJECTS);
- 		projects.setText(WorkingSetMessages.ViewActionGroup_projects_label); 
-@@ -116,7 +129,8 @@
- 		}
- 		fActiveActionGroup.fillViewMenu(fMenuManager);
- 		fMenuManager.updateAll(true);
--		fChangeListener.propertyChange(event);
-+		if(fChangeListener != null)
-+			fChangeListener.propertyChange(event);
- 	}
- 	
- 	public WorkingSetFilterActionGroup getFilterGroup() {
-Index: ui/org/eclipse/jdt/internal/ui/workingsets/WorkingSetModel.java
-===================================================================
-RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/workingsets/WorkingSetModel.java,v
-retrieving revision 1.14
-diff -u -r1.14 WorkingSetModel.java
---- ui/org/eclipse/jdt/internal/ui/workingsets/WorkingSetModel.java	26 Jan 2006 14:54:03 -0000	1.14
-+++ ui/org/eclipse/jdt/internal/ui/workingsets/WorkingSetModel.java	8 Feb 2006 00:46:03 -0000
-@@ -1,13 +1,11 @@
--/*******************************************************************************
-- * Copyright (c) 2000, 2005 IBM Corporation and others.
-- * All rights reserved. This program and the accompanying materials
-- * are made available under the terms of the Eclipse Public License v1.0
-+/***************************************************************************************************
-+ * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved. This program and the
-+ * accompanying materials are made available under the terms of the Eclipse Public License v1.0
-  * which accompanies this distribution, and is available at
-  * http://www.eclipse.org/legal/epl-v10.html
-- *
-- * Contributors:
-- *     IBM Corporation - initial API and implementation
-- *******************************************************************************/
-+ * 
-+ * Contributors: IBM Corporation - initial API and implementation
-+ **************************************************************************************************/
- package org.eclipse.jdt.internal.ui.workingsets;
- 
- import java.util.ArrayList;
-@@ -36,12 +34,12 @@
- import org.eclipse.ui.PlatformUI;
- 
- public class WorkingSetModel {
--	
-+
- 	public static final String CHANGE_WORKING_SET_MODEL_CONTENT= "workingSetModelChanged"; //$NON-NLS-1$
--	
-+
- 	public static final IElementComparer COMPARER= new WorkingSetComparar();
--	
--	private static final String TAG_LOCAL_WORKING_SET_MANAGER= "localWorkingSetManager"; //$NON-NLS-1$
-+
-+	public static final String TAG_LOCAL_WORKING_SET_MANAGER= "localWorkingSetManager"; //$NON-NLS-1$
- 	private static final String TAG_ACTIVE_WORKING_SET= "activeWorkingSet"; //$NON-NLS-1$
- 	private static final String TAG_WORKING_SET_NAME= "workingSetName"; //$NON-NLS-1$
- 	private static final String TAG_CONFIGURED= "configured"; //$NON-NLS-1$
-@@ -53,28 +51,29 @@
- 	private OthersWorkingSetUpdater fOthersWorkingSetUpdater;
- 
- 	private ElementMapper fElementMapper= new ElementMapper();
--	
-+
- 	private boolean fConfigured;
- 
- 	private static class WorkingSetComparar implements IElementComparer {
- 		public boolean equals(Object o1, Object o2) {
--			IWorkingSet w1= o1 instanceof IWorkingSet ? (IWorkingSet)o1 : null;
--			IWorkingSet w2= o2 instanceof IWorkingSet ? (IWorkingSet)o2 : null;
-+			IWorkingSet w1= o1 instanceof IWorkingSet ? (IWorkingSet) o1 : null;
-+			IWorkingSet w2= o2 instanceof IWorkingSet ? (IWorkingSet) o2 : null;
- 			if (w1 == null || w2 == null)
- 				return o1.equals(o2);
- 			return w1 == w2;
- 		}
-+
- 		public int hashCode(Object element) {
- 			if (element instanceof IWorkingSet)
- 				return System.identityHashCode(element);
- 			return element.hashCode();
- 		}
- 	}
--	
-+
- 	private static class ElementMapper {
- 		private Map fElementToWorkingSet= new HashMap();
- 		private Map fWorkingSetToElement= new IdentityHashMap();
--		
-+
- 		private Map fResourceToWorkingSet= new HashMap();
- 
- 		public void clear() {
-@@ -82,14 +81,16 @@
- 			fWorkingSetToElement.clear();
- 			fResourceToWorkingSet.clear();
- 		}
-+
- 		public void rebuild(IWorkingSet[] workingSets) {
- 			clear();
- 			for (int i= 0; i < workingSets.length; i++) {
- 				put(workingSets[i]);
- 			}
- 		}
-+
- 		public IAdaptable[] remove(IWorkingSet ws) {
--			IAdaptable[] elements= (IAdaptable[])fWorkingSetToElement.remove(ws);
-+			IAdaptable[] elements= (IAdaptable[]) fWorkingSetToElement.remove(ws);
- 			if (elements != null) {
- 				for (int i= 0; i < elements.length; i++) {
- 					removeElement(elements[i], ws);
-@@ -97,8 +98,9 @@
- 			}
- 			return elements;
- 		}
-+
- 		public IAdaptable[] refresh(IWorkingSet ws) {
--			IAdaptable[] oldElements= (IAdaptable[])fWorkingSetToElement.get(ws);
-+			IAdaptable[] oldElements= (IAdaptable[]) fWorkingSetToElement.get(ws);
- 			if (oldElements == null)
- 				return null;
- 			IAdaptable[] newElements= ws.getElements();
-@@ -106,15 +108,16 @@
- 			List toAdd= new ArrayList(Arrays.asList(newElements));
- 			computeDelta(toRemove, toAdd, oldElements, newElements);
- 			for (Iterator iter= toAdd.iterator(); iter.hasNext();) {
--				addElement((IAdaptable)iter.next(), ws);
-+				addElement((IAdaptable) iter.next(), ws);
- 			}
- 			for (Iterator iter= toRemove.iterator(); iter.hasNext();) {
--				removeElement((IAdaptable)iter.next(), ws);
-+				removeElement((IAdaptable) iter.next(), ws);
- 			}
- 			if (toRemove.size() > 0 || toAdd.size() > 0)
- 				fWorkingSetToElement.put(ws, newElements);
- 			return oldElements;
- 		}
-+
- 		private void computeDelta(List toRemove, List toAdd, IAdaptable[] oldElements, IAdaptable[] newElements) {
- 			for (int i= 0; i < oldElements.length; i++) {
- 				toAdd.remove(oldElements[i]);
-@@ -122,20 +125,25 @@
- 			for (int i= 0; i < newElements.length; i++) {
- 				toRemove.remove(newElements[i]);
- 			}
--			
-+
- 		}
-+
- 		public IWorkingSet getFirstWorkingSet(Object element) {
--			return (IWorkingSet)getFirstElement(fElementToWorkingSet, element);
-+			return (IWorkingSet) getFirstElement(fElementToWorkingSet, element);
- 		}
-+
- 		public List getAllWorkingSets(Object element) {
- 			return getAllElements(fElementToWorkingSet, element);
- 		}
-+
- 		public IWorkingSet getFirstWorkingSetForResource(IResource resource) {
--			return (IWorkingSet)getFirstElement(fResourceToWorkingSet, resource);
-+			return (IWorkingSet) getFirstElement(fResourceToWorkingSet, resource);
- 		}
-+
- 		public List getAllWorkingSetsForResource(IResource resource) {
- 			return getAllElements(fResourceToWorkingSet, resource);
- 		}
-+
- 		private void put(IWorkingSet ws) {
- 			if (fWorkingSetToElement.containsKey(ws))
- 				return;
-@@ -145,20 +153,23 @@
- 				addElement(elements[i], ws);
- 			}
- 		}
-+
- 		private void addElement(IAdaptable element, IWorkingSet ws) {
- 			addToMap(fElementToWorkingSet, element, ws);
--			IResource resource= (IResource)element.getAdapter(IResource.class);
-+			IResource resource= (IResource) element.getAdapter(IResource.class);
- 			if (resource != null) {
- 				addToMap(fResourceToWorkingSet, resource, ws);
- 			}
- 		}
-+
- 		private void removeElement(IAdaptable element, IWorkingSet ws) {
- 			removeFromMap(fElementToWorkingSet, element, ws);
--			IResource resource= (IResource)element.getAdapter(IResource.class);
-+			IResource resource= (IResource) element.getAdapter(IResource.class);
- 			if (resource != null) {
- 				removeFromMap(fResourceToWorkingSet, resource, ws);
- 			}
- 		}
-+
- 		private void addToMap(Map map, IAdaptable key, IWorkingSet value) {
- 			Object obj= map.get(key);
- 			if (obj == null) {
-@@ -169,21 +180,22 @@
- 				l.add(value);
- 				map.put(key, l);
- 			} else if (obj instanceof List) {
--				((List)obj).add(value);
-+				((List) obj).add(value);
- 			}
- 		}
-+
- 		private void removeFromMap(Map map, IAdaptable key, IWorkingSet value) {
- 			Object current= map.get(key);
- 			if (current == null) {
- 				return;
- 			} else if (current instanceof List) {
--				List list= (List)current;
-+				List list= (List) current;
- 				list.remove(value);
- 				switch (list.size()) {
--					case 0:
-+					case 0 :
- 						map.remove(key);
- 						break;
--					case 1:
-+					case 1 :
- 						map.put(key, list.get(0));
- 						break;
- 				}
-@@ -191,16 +203,18 @@
- 				map.remove(key);
- 			}
- 		}
-+
- 		private Object getFirstElement(Map map, Object key) {
- 			Object obj= map.get(key);
--			if (obj instanceof List) 
--				return ((List)obj).get(0);
-+			if (obj instanceof List)
-+				return ((List) obj).get(0);
- 			return obj;
- 		}
-+
- 		private List getAllElements(Map map, Object key) {
- 			Object obj= map.get(key);
- 			if (obj instanceof List)
--				return (List)obj;
-+				return (List) obj;
- 			if (obj == null)
- 				return Collections.EMPTY_LIST;
- 			List result= new ArrayList(1);
-@@ -208,27 +222,27 @@
- 			return result;
- 		}
- 	}
--	
-+
- 	public WorkingSetModel() {
- 		fLocalWorkingSetManager= PlatformUI.getWorkbench().createLocalWorkingSetManager();
- 		addListenersToWorkingSetManagers();
--    	fActiveWorkingSets= new ArrayList(2);
--    	
--    	IWorkingSet others= fLocalWorkingSetManager.createWorkingSet(WorkingSetMessages.WorkingSetModel_others_name, new IAdaptable[0]); 
--    	others.setId(OthersWorkingSetUpdater.ID);
--    	fLocalWorkingSetManager.addWorkingSet(others);
--    	fActiveWorkingSets.add(others);
--    	
--    	fOthersWorkingSetUpdater.init(this);
--    	fElementMapper.rebuild(getActiveWorkingSets());
-+		fActiveWorkingSets= new ArrayList(2);
-+
-+		IWorkingSet others= fLocalWorkingSetManager.createWorkingSet(WorkingSetMessages.WorkingSetModel_others_name, new IAdaptable[0]);
-+		others.setId(OthersWorkingSetUpdater.ID);
-+		fLocalWorkingSetManager.addWorkingSet(others);
-+		fActiveWorkingSets.add(others);
-+
-+		fOthersWorkingSetUpdater.init(this);
-+		fElementMapper.rebuild(getActiveWorkingSets());
- 	}
--	
-+
- 	public WorkingSetModel(IMemento memento) {
- 		restoreState(memento);
- 		fOthersWorkingSetUpdater.init(this);
--    	fElementMapper.rebuild(getActiveWorkingSets());
-+		fElementMapper.rebuild(getActiveWorkingSets());
- 	}
--	
-+
- 	private void addListenersToWorkingSetManagers() {
- 		fListeners= new ListenerList(ListenerList.IDENTITY);
- 		fWorkingSetManagerListener= new IPropertyChangeListener() {
-@@ -239,7 +253,7 @@
- 		PlatformUI.getWorkbench().getWorkingSetManager().addPropertyChangeListener(fWorkingSetManagerListener);
- 		fLocalWorkingSetManager.addPropertyChangeListener(fWorkingSetManagerListener);
- 	}
--	
-+
- 	public void dispose() {
- 		if (fWorkingSetManagerListener != null) {
- 			PlatformUI.getWorkbench().getWorkingSetManager().removePropertyChangeListener(fWorkingSetManagerListener);
-@@ -248,118 +262,119 @@
- 			fWorkingSetManagerListener= null;
- 		}
- 	}
--	
--	//---- model relationships ---------------------------------------
--	
-+
-+	// ---- model relationships ---------------------------------------
-+
-     public IAdaptable[] getChildren(IWorkingSet workingSet) {
--    	return workingSet.getElements();
--    }
--    
--    public Object getParent(Object element) {
--    	if (element instanceof IWorkingSet && fActiveWorkingSets.contains(element))
--    		return this;
--    	return fElementMapper.getFirstWorkingSet(element);
--    }
--    
--    public Object[] getAllParents(Object element) {
--    	if (element instanceof IWorkingSet && fActiveWorkingSets.contains(element))
--    		return new Object[] {this};
--    	return fElementMapper.getAllWorkingSets(element).toArray();
--    }
--    
--    public Object[] addWorkingSets(Object[] elements) {
--    	List result= null;
--    	for (int i= 0; i < elements.length; i++) {
--    		Object element= elements[i];
--    		List sets= null;
-+		return workingSet.getElements();
-+	}
-+
-+	public Object getParent(Object element) {
-+		if (element instanceof IWorkingSet && fActiveWorkingSets.contains(element))
-+			return this;
-+		return fElementMapper.getFirstWorkingSet(element);
-+	}
-+
-+	public Object[] getAllParents(Object element) {
-+		if (element instanceof IWorkingSet && fActiveWorkingSets.contains(element))
-+			return new Object[]{this};
-+		return fElementMapper.getAllWorkingSets(element).toArray();
-+	}
-+
-+	public Object[] addWorkingSets(Object[] elements) {
-+		List result= null;
-+		for (int i= 0; i < elements.length; i++) {
-+			Object element= elements[i];
-+			List sets= null;
- 			if (element instanceof IResource) {
--    			sets= fElementMapper.getAllWorkingSetsForResource((IResource)element);
--    		} else {
--    			sets= fElementMapper.getAllWorkingSets(element);
--    		}
-+				sets= fElementMapper.getAllWorkingSetsForResource((IResource) element);
-+			} else {
-+				sets= fElementMapper.getAllWorkingSets(element);
-+			}
- 			if (sets != null && sets.size() > 0) {
- 				if (result == null)
- 					result= new ArrayList(Arrays.asList(elements));
- 				result.addAll(sets);
- 			}
- 		}
--    	if (result == null)
--    		return elements;
--    	return result.toArray();
--    }
--    
--    public boolean needsConfiguration() {
--    	return !fConfigured && fActiveWorkingSets.size() == 1 &&
--			OthersWorkingSetUpdater.ID.equals(((IWorkingSet)fActiveWorkingSets.get(0)).getId());
--    }
--    
--    public void configured() {
--    	fConfigured= true;
--    }
--    
--    //---- working set management -----------------------------------
--    
-+		if (result == null)
-+			return elements;
-+		return result.toArray();
-+	}
-+
-+	public boolean needsConfiguration() {
-+		return !fConfigured && fActiveWorkingSets.size() == 1 && OthersWorkingSetUpdater.ID.equals(((IWorkingSet) fActiveWorkingSets.get(0)).getId());
-+	}
-+
-+	public void configured() {
-+		fConfigured= true;
-+	}
-+
-+	// ---- working set management -----------------------------------
-+
- 	/**
--     * Adds a property change listener.
--     * 
--     * @param listener the property change listener to add
--     */
--    public void addPropertyChangeListener(IPropertyChangeListener listener) {
--    	fListeners.add(listener);
--    }
--    
--    /**
--     * Removes the property change listener.
--     * 
--     * @param listener the property change listener to remove
--     */
--    public void removePropertyChangeListener(IPropertyChangeListener listener) {
--    	fListeners.remove(listener);
--    }
--    
--    public IWorkingSet[] getActiveWorkingSets() {
--    	return (IWorkingSet[])fActiveWorkingSets.toArray(new IWorkingSet[fActiveWorkingSets.size()]);
--    }
--    
--    public IWorkingSet[] getAllWorkingSets() {
--    	List result= new ArrayList();
--    	result.addAll(fActiveWorkingSets);
--    	IWorkingSet[] locals= fLocalWorkingSetManager.getWorkingSets();
--    	for (int i= 0; i < locals.length; i++) {
-+	 * Adds a property change listener.
-+	 * 
-+	 * @param listener
-+	 *            the property change listener to add
-+	 */
-+	public void addPropertyChangeListener(IPropertyChangeListener listener) {
-+		fListeners.add(listener);
-+	}
-+
-+	/**
-+	 * Removes the property change listener.
-+	 * 
-+	 * @param listener
-+	 *            the property change listener to remove
-+	 */
-+	public void removePropertyChangeListener(IPropertyChangeListener listener) {
-+		fListeners.remove(listener);
-+	}
-+
-+	public IWorkingSet[] getActiveWorkingSets() {
-+		return (IWorkingSet[]) fActiveWorkingSets.toArray(new IWorkingSet[fActiveWorkingSets.size()]);
-+	}
-+
-+	public IWorkingSet[] getAllWorkingSets() {
-+		List result= new ArrayList();
-+		result.addAll(fActiveWorkingSets);
-+		IWorkingSet[] locals= fLocalWorkingSetManager.getWorkingSets();
-+		for (int i= 0; i < locals.length; i++) {
- 			if (!result.contains(locals[i]))
- 				result.add(locals[i]);
- 		}
--    	IWorkingSet[] globals= PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets();
--    	for (int i= 0; i < globals.length; i++) {
-+		IWorkingSet[] globals= PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets();
-+		for (int i= 0; i < globals.length; i++) {
- 			if (!result.contains(globals[i]))
- 				result.add(globals[i]);
- 		}
--    	return (IWorkingSet[])result.toArray(new IWorkingSet[result.size()]);
--    }
--    
--    public void setActiveWorkingSets(IWorkingSet[] workingSets) {
--    	fActiveWorkingSets= new ArrayList(Arrays.asList(workingSets));
--    	fElementMapper.rebuild(getActiveWorkingSets());
--    	fOthersWorkingSetUpdater.updateElements();
--    	fireEvent(new PropertyChangeEvent(this, CHANGE_WORKING_SET_MODEL_CONTENT, null, null));
--    }
--	
-+		return (IWorkingSet[]) result.toArray(new IWorkingSet[result.size()]);
-+	}
-+
-+	public void setActiveWorkingSets(IWorkingSet[] workingSets) {
-+		fActiveWorkingSets= new ArrayList(Arrays.asList(workingSets));
-+		fElementMapper.rebuild(getActiveWorkingSets());
-+		fOthersWorkingSetUpdater.updateElements();
-+		fireEvent(new PropertyChangeEvent(this, CHANGE_WORKING_SET_MODEL_CONTENT, null, null));
-+	}
-+
- 	public void saveState(IMemento memento) {
- 		memento.putString(TAG_CONFIGURED, Boolean.toString(fConfigured));
- 		fLocalWorkingSetManager.saveState(memento.createChild(TAG_LOCAL_WORKING_SET_MANAGER));
- 		for (Iterator iter= fActiveWorkingSets.iterator(); iter.hasNext();) {
- 			IMemento active= memento.createChild(TAG_ACTIVE_WORKING_SET);
--			IWorkingSet workingSet= (IWorkingSet)iter.next();
-+			IWorkingSet workingSet= (IWorkingSet) iter.next();
- 			active.putString(TAG_WORKING_SET_NAME, workingSet.getName());
- 		}
- 	}
--	
-+
- 	private void restoreState(IMemento memento) {
- 		String configured= memento.getString(TAG_CONFIGURED);
- 		if (configured != null)
- 			fConfigured= Boolean.valueOf(configured).booleanValue();
- 		fLocalWorkingSetManager= PlatformUI.getWorkbench().createLocalWorkingSetManager();
--		addListenersToWorkingSetManagers();
-+		addListenersToWorkingSetManagers(); 
- 		fLocalWorkingSetManager.restoreState(memento.getChild(TAG_LOCAL_WORKING_SET_MANAGER));
- 		IWorkingSet history= getHistoryWorkingSet();
- 		if (history != null) {
-@@ -380,54 +395,54 @@
- 			}
- 		}
- 	}
--    private void workingSetManagerChanged(PropertyChangeEvent event) {
-+
-+	private void workingSetManagerChanged(PropertyChangeEvent event) {
- 		String property= event.getProperty();
--    	if (IWorkingSetManager.CHANGE_WORKING_SET_UPDATER_INSTALLED.equals(property) && event.getSource() == fLocalWorkingSetManager) {
--			IWorkingSetUpdater updater= (IWorkingSetUpdater)event.getNewValue();
-+		if (IWorkingSetManager.CHANGE_WORKING_SET_UPDATER_INSTALLED.equals(property) && event.getSource() == fLocalWorkingSetManager) {
-+			IWorkingSetUpdater updater= (IWorkingSetUpdater) event.getNewValue();
- 			if (updater instanceof OthersWorkingSetUpdater) {
--				fOthersWorkingSetUpdater= (OthersWorkingSetUpdater)updater;
-+				fOthersWorkingSetUpdater= (OthersWorkingSetUpdater) updater;
- 			}
- 			return;
- 		}
--    	// don't handle working sets not managed by the model
--    	if (!isAffected(event))
--    		return;
--    	
-+		// don't handle working sets not managed by the model
-+		if (!isAffected(event))
-+			return;
-+
- 		if (IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE.equals(property)) {
--			IWorkingSet workingSet= (IWorkingSet)event.getNewValue();
-+			IWorkingSet workingSet= (IWorkingSet) event.getNewValue();
- 			IAdaptable[] elements= fElementMapper.refresh(workingSet);
- 			if (elements != null) {
- 				fireEvent(event);
- 			}
- 		} else if (IWorkingSetManager.CHANGE_WORKING_SET_REMOVE.equals(property)) {
--			IWorkingSet workingSet= (IWorkingSet)event.getOldValue();
-+			IWorkingSet workingSet= (IWorkingSet) event.getOldValue();
- 			List elements= new ArrayList(fActiveWorkingSets);
- 			elements.remove(workingSet);
--			setActiveWorkingSets((IWorkingSet[])elements.toArray(new IWorkingSet[elements.size()]));
--    	} else if (IWorkingSetManager.CHANGE_WORKING_SET_NAME_CHANGE.equals(property)) {
-+			setActiveWorkingSets((IWorkingSet[]) elements.toArray(new IWorkingSet[elements.size()]));
-+		} else if (IWorkingSetManager.CHANGE_WORKING_SET_NAME_CHANGE.equals(property)) {
- 			fireEvent(event);
- 		}
- 	}
--    
--    private void fireEvent(PropertyChangeEvent event) {
--    	Object[] listeners= fListeners.getListeners();
--    	for (int i= 0; i < listeners.length; i++) {
--			((IPropertyChangeListener)listeners[i]).propertyChange(event);
--		}
--    }
--    
--    private boolean isAffected(PropertyChangeEvent event) {
--    	if (fActiveWorkingSets == null)
--    		return false;
--    	Object oldValue= event.getOldValue();
--    	Object newValue= event.getNewValue();
--    	if ((oldValue != null && fActiveWorkingSets.contains(oldValue)) 
--    		|| (newValue != null && fActiveWorkingSets.contains(newValue))) {
--    		return true;
--    	}
--    	return false;
--    }
--	
-+
-+	private void fireEvent(PropertyChangeEvent event) {
-+		Object[] listeners= fListeners.getListeners();
-+		for (int i= 0; i < listeners.length; i++) {
-+			((IPropertyChangeListener) listeners[i]).propertyChange(event);
-+		}
-+	}
-+
-+	private boolean isAffected(PropertyChangeEvent event) {
-+		if (fActiveWorkingSets == null)
-+			return false;
-+		Object oldValue= event.getOldValue();
-+		Object newValue= event.getNewValue();
-+		if ((oldValue != null && fActiveWorkingSets.contains(oldValue)) || (newValue != null && fActiveWorkingSets.contains(newValue))) {
-+			return true;
-+		}
-+		return false;
-+	}
-+
- 	private IWorkingSet getHistoryWorkingSet() {
- 		IWorkingSet[] workingSets= fLocalWorkingSetManager.getWorkingSets();
- 		for (int i= 0; i < workingSets.length; i++) {
-Index: ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerContentProvider.java
-===================================================================
-RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerContentProvider.java,v
-retrieving revision 1.50
-diff -u -r1.50 PackageExplorerContentProvider.java
---- ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerContentProvider.java	11 Jan 2006 15:49:15 -0000	1.50
-+++ ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerContentProvider.java	8 Feb 2006 00:46:03 -0000
-@@ -76,14 +76,22 @@
- 	private PackageFragmentProvider fPackageFragmentProvider= new PackageFragmentProvider();
- 	
- 	private int fPendingChanges;
--	PackageExplorerPart fPart;
-+	//PackageExplorerPart fPart;
-+	
-+	/**
-+	 * Creates a new content provider for Java elements.
-+	 */
-+	public PackageExplorerContentProvider(boolean provideMembers) {
-+		super(provideMembers);	
-+		//fPart= part;
-+	}
- 	
- 	/**
- 	 * Creates a new content provider for Java elements.
- 	 */
- 	public PackageExplorerContentProvider(PackageExplorerPart part, boolean provideMembers) {
- 		super(provideMembers);	
--		fPart= part;
-+		//fPart= part;
- 	}
- 	
- 	/* package */ PackageFragmentProvider getPackageFragmentProvider() {
-@@ -620,7 +628,7 @@
- 		});
- 	}
- 
--	private void postAdd(final Object parent, final Object element) {
-+	/* package */ void postAdd(final Object parent, final Object element) {
- 		postRunnable(new Runnable() {
- 			public void run() {
- 				Control ctrl= fViewer.getControl();
-@@ -647,7 +655,14 @@
- 	private void postProjectStateChanged(final Object root) {
- 		postRunnable(new Runnable() {
- 			public void run() {
--				fPart.projectStateChanged(root);
-+				//fPart.projectStateChanged(root); 
-+				Control ctrl= fViewer.getControl();
-+				if (ctrl != null && !ctrl.isDisposed()) {
-+					fViewer.refresh(root, true);
-+					// trigger a syntetic selection change so that action refresh their
-+					// enable state.
-+					fViewer.setSelection(fViewer.getSelection());
-+				}
- 			}
- 		});
- 	}
-Index: plugin.xml
-===================================================================
-RCS file: /home/eclipse/org.eclipse.jdt.ui/plugin.xml,v
-retrieving revision 1.617
-diff -u -r1.617 plugin.xml
---- plugin.xml	5 Feb 2006 18:11:23 -0000	1.617
-+++ plugin.xml	8 Feb 2006 00:46:02 -0000
-@@ -5047,4 +5047,97 @@
-       </objectContribution>
-    </extension>
- 
-+
-+    <!-- ADDITIONS BELOW THIS LINE -->
-+      
-+    <extension
-+          point="org.eclipse.ui.navigator.viewer">
-+       <viewerContentBinding 
-+             viewerId="org.eclipse.ui.navigator.resourceContent">
-+          <includes>
-+       	      <contentExtension pattern="org.eclipse.jdt.java.ui.javaContent" />       
-+          </includes>       
-+       </viewerContentBinding>
-+    </extension> 
-+      
-+    <extension
-+          point="org.eclipse.ui.navigator.navigatorContent">
-+       <navigatorContent
-+             activeByDefault="true"
-+             contentProvider="org.eclipse.jdt.internal.ui.packageview.PreferenceAwareContentProvider"
-+             icon="$nl$/icons/full/obj16/java_model.gif"
-+             id="org.eclipse.jdt.java.ui.javaContent"
-+             labelProvider="org.eclipse.jdt.internal.ui.packageview.PreferenceAwareLabelProvider"
-+             name="Java Elements"
-+             priority="high">
-+          <triggerPoints> 
-+	         <or>           
-+               <adapt 
-+	                     type="org.eclipse.core.resources.IProject" > 
-+		                  <test
-+		                     property="org.eclipse.core.resources.projectNature"
-+		                     value="org.eclipse.jdt.core.javanature" />
-+               </adapt>             
-+	           <instanceof 
-+	                 value="org.eclipse.core.resources.IWorkspaceRoot" /> 
-+	                 
-+	           <instanceof
-+	                 value="org.eclipse.core.resources.IFolder" /> 
-+	           <instanceof
-+	                value="org.eclipse.core.resources.IFile" /> 
-+	           <instanceof 
-+	                 value="org.eclipse.jdt.core.IJavaProject" /> 
-+	           <instanceof 
-+	                 value="org.eclipse.jdt.core.IJavaElement" /> 
-+	           <instanceof
-+	                 value="org.eclipse.jdt.internal.core.JarEntryFile" /> 
-+	           <instanceof
-+	                 value="org.eclipse.jdt.core.IClassFile" /> 
-+	           <instanceof
-+	                 value="org.eclipse.jdt.internal.ui.packageview.ClassPathContainer" /> 
-+	            <!--
-+				<instanceof 
-+ 					value="org.eclipse.jdt.internal.ui.workingsets.WorkingSetModel" /> 
-+ 					-->
-+	         </or>
-+          </triggerPoints>
-+          <possibleChildren> 
-+	         <or>           
-+               <adapt 
-+					type="org.eclipse.core.resources.IProject" >  
-+               </adapt>             
-+	           <instanceof 
-+	                 value="org.eclipse.core.resources.IWorkspaceRoot" /> 	                 
-+	           <instanceof
-+	                 value="org.eclipse.core.resources.IFolder" /> 
-+	           <instanceof
-+	                value="org.eclipse.core.resources.IFile" /> 
-+	           <instanceof 
-+	                 value="org.eclipse.jdt.core.IJavaProject" /> 
-+	           <instanceof 
-+	                 value="org.eclipse.jdt.core.IJavaElement" /> 
-+	           <instanceof
-+	                 value="org.eclipse.jdt.internal.core.JarEntryFile" /> 
-+	           <instanceof
-+	                 value="org.eclipse.jdt.core.IClassFile" /> 
-+	           <instanceof
-+	                 value="org.eclipse.jdt.internal.ui.packageview.ClassPathContainer" />  
-+	         </or>
-+          </possibleChildren>          
-+          <actionProvider 
-+	               class="org.eclipse.jdt.internal.ui.packageview.PackageExplorerActionProvider">
-+	               <enablement>	               
-+	               <adapt 
-+	                     type="org.eclipse.jdt.core.IJavaElement" /> 
-+	               </enablement>
-+          </actionProvider>
-+          <override
-+                policy="InvokeAlwaysRegardlessOfSuppressedExt"
-+                suppressedExtensionId="org.eclipse.ui.navigator.resourceContent"/>
-+          <commonSorter
-+                class="org.eclipse.jdt.ui.JavaElementSorter"
-+                id="org.eclipse.jdt.ui.javaElementSorter"/> 
-+       </navigatorContent>
-+    </extension>
-+     
- </plugin>
-\ No newline at end of file
-Index: ui/org/eclipse/jdt/internal/ui/actions/MultiActionGroup.java
-===================================================================
-RCS file: /home/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/actions/MultiActionGroup.java,v
-retrieving revision 1.7
-diff -u -r1.7 MultiActionGroup.java
---- ui/org/eclipse/jdt/internal/ui/actions/MultiActionGroup.java	17 Jun 2005 15:51:51 -0000	1.7
-+++ ui/org/eclipse/jdt/internal/ui/actions/MultiActionGroup.java	8 Feb 2006 00:46:02 -0000
-@@ -37,6 +37,8 @@
-  */
- public class MultiActionGroup extends ActionGroup {
- 	
-+	public IAction[] NO_ACTIONS = new IAction[0];
-+	
- 	private IAction[] fActions; 
- 	
- 	private int fCurrentSelection;
-@@ -57,6 +59,32 @@
- 		fCurrentSelection= currentSelection;
- 		fActions= actions;
- 	}
-+	
-+	/**
-+	 * Creates a new action group with a given set of actions.
-+	 * 
-+	 * @param actions			the actions for this multi group
-+	 * @param currentSelection	decides which action is selected in the menu on start up.
-+	 * 							Denotes the location in the actions array of the current
-+	 * 							selected state. It cannot be null.
-+	 */
-+	public MultiActionGroup(int currentSelection) {
-+		super();
-+		
-+		fCurrentSelection= currentSelection;
-+		fActions= NO_ACTIONS;
-+	}
-+	
-+	/**
-+	 * 
-+	 * @param actions			the actions for this multi group 
-+	 */
-+	protected final void setActions(IAction[] actions) {
-+		if(actions != null)
-+			fActions = actions;
-+		else
-+			fActions = NO_ACTIONS;
-+	}
- 
- 	/**
- 	 * Add the actions to the given menu manager.
-Index: ui/org/eclipse/jdt/internal/ui/packageview/CommonLayoutActionGroup.java
-===================================================================
-RCS file: ui/org/eclipse/jdt/internal/ui/packageview/CommonLayoutActionGroup.java
-diff -N ui/org/eclipse/jdt/internal/ui/packageview/CommonLayoutActionGroup.java
---- /dev/null	1 Jan 1970 00:00:00 -0000
-+++ ui/org/eclipse/jdt/internal/ui/packageview/CommonLayoutActionGroup.java	1 Jan 1970 00:00:00 -0000
-@@ -0,0 +1,131 @@
-+/*******************************************************************************
-+ * Copyright (c) 2000, 2005 IBM Corporation and others.
-+ * All rights reserved. This program and the accompanying materials
-+ * are made available under the terms of the Eclipse Public License v1.0
-+ * which accompanies this distribution, and is available at
-+ * http://www.eclipse.org/legal/epl-v10.html
-+ *
-+ * Contributors:
-+ *     IBM Corporation - initial API and implementation
-+ *******************************************************************************/
-+package org.eclipse.jdt.internal.ui.packageview;
-+
-+import org.eclipse.jface.action.Action;
-+import org.eclipse.jface.action.IAction;
-+import org.eclipse.jface.action.IMenuManager;
-+import org.eclipse.jface.action.MenuManager;
-+import org.eclipse.jface.action.Separator;
-+import org.eclipse.jface.viewers.StructuredViewer;
-+
-+import org.eclipse.ui.IActionBars;
-+import org.eclipse.ui.IWorkbenchActionConstants;
-+import org.eclipse.ui.PlatformUI;
-+import org.eclipse.ui.navigator.IExtensionStateModel;
-+
-+import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
-+import org.eclipse.jdt.internal.ui.JavaPluginImages;
-+import org.eclipse.jdt.internal.ui.actions.MultiActionGroup;
-+import org.eclipse.jdt.internal.ui.packageview.IExtensionStateConstants.Values;
-+
-+/**
-+ * Adds view menus to switch between flat and hierarchical layout.
-+ * 
-+ * @since 2.1
-+ */
-+public class CommonLayoutActionGroup extends MultiActionGroup {
-+
-+	private boolean fHasContributedToViewMenu = false;
-+	private IAction fHierarchicalLayout = null;
-+	private IAction fFlatLayoutAction = null; 
-+
-+	public CommonLayoutActionGroup(StructuredViewer structuredViewer, IExtensionStateModel stateModel) {
-+		super(stateModel.getBooleanProperty(Values.IS_LAYOUT_FLAT) ? 0 : 1);
-+		IAction[] actions = createActions(structuredViewer, stateModel);
-+		setActions(actions); 
-+	}
-+
-+	/* (non-Javadoc)
-+	 * @see ActionGroup#fillActionBars(IActionBars)
-+	 */
-+	public void fillActionBars(IActionBars actionBars) {
-+		super.fillActionBars(actionBars);
-+		if(!fHasContributedToViewMenu) {
-+			synchronized(this) {
-+				if(!fHasContributedToViewMenu) {
-+					fHasContributedToViewMenu = true;
-+					contributeToViewMenu(actionBars.getMenuManager());
-+				}
-+			}
-+		}
-+	}
-+	
-+	private void contributeToViewMenu(IMenuManager viewMenu) {
-+		viewMenu.add(new Separator());
-+
-+		// Create layout sub menu
-+		
-+		IMenuManager layoutSubMenu= new MenuManager(PackagesMessages.LayoutActionGroup_label); 
-+		final String layoutGroupName= "layout"; //$NON-NLS-1$
-+		Separator marker= new Separator(layoutGroupName);
-+
-+		viewMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-+		viewMenu.add(marker);
-+		viewMenu.appendToGroup(layoutGroupName, layoutSubMenu);
-+		viewMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS+"-end"));//$NON-NLS-1$		
-+		addActions(layoutSubMenu);
-+	}
-+	
-+	
-+	private IAction[] createActions(StructuredViewer structuredViewer, IExtensionStateModel stateModel) {
-+		
-+		fFlatLayoutAction= new CommonLayoutAction(structuredViewer, stateModel, true);
-+		fFlatLayoutAction.setText(PackagesMessages.LayoutActionGroup_flatLayoutAction_label); 
-+		JavaPluginImages.setLocalImageDescriptors(fFlatLayoutAction, "flatLayout.gif"); //$NON-NLS-1$
-+		
-+		fHierarchicalLayout= new CommonLayoutAction(structuredViewer, stateModel, false);
-+		fHierarchicalLayout.setText(PackagesMessages.LayoutActionGroup_hierarchicalLayoutAction_label);	  
-+		JavaPluginImages.setLocalImageDescriptors(fHierarchicalLayout, "hierarchicalLayout.gif"); //$NON-NLS-1$
-+		
-+		fHierarchicalLayout.setChecked(!stateModel.getBooleanProperty(Values.IS_LAYOUT_FLAT));
-+		fFlatLayoutAction.setChecked(stateModel.getBooleanProperty(Values.IS_LAYOUT_FLAT));
-+		
-+		return new IAction[]{fFlatLayoutAction, fHierarchicalLayout};
-+	}
-+	
-+	public void setFlatLayout(boolean flatLayout) {
-+		fHierarchicalLayout.setChecked(!flatLayout);
-+		fFlatLayoutAction.setChecked(flatLayout);
-+	}
-+	 
-+}
-+
-+class CommonLayoutAction extends Action implements IAction {
-+
-+	private final boolean fIsFlatLayout;
-+	private IExtensionStateModel fStateModel;
-+	private StructuredViewer fStructuredViewer;
-+
-+	public CommonLayoutAction(StructuredViewer structuredViewer, IExtensionStateModel stateModel, boolean flat) {
-+		super("", AS_RADIO_BUTTON); //$NON-NLS-1$
-+		fStateModel = stateModel;
-+		fStructuredViewer = structuredViewer;
-+		fIsFlatLayout= flat; 
-+		if (fIsFlatLayout)
-+			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IJavaHelpContextIds.LAYOUT_FLAT_ACTION);
-+		else
-+			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IJavaHelpContextIds.LAYOUT_HIERARCHICAL_ACTION);
-+	}
-+
-+	/*
-+	 * @see org.eclipse.jface.action.IAction#run()
-+	 */
-+	public void run() {
-+		if (fStateModel.getBooleanProperty(Values.IS_LAYOUT_FLAT) != fIsFlatLayout) {
-+			fStateModel.setBooleanProperty(Values.IS_LAYOUT_FLAT, fIsFlatLayout);
-+  			 	
-+			fStructuredViewer.getControl().setRedraw(false);
-+			fStructuredViewer.refresh();
-+			fStructuredViewer.getControl().setRedraw(true);
-+		}
-+	}
-+}
-Index: ui/org/eclipse/jdt/internal/ui/packageview/PreferenceAwareContentProvider.java
-===================================================================
-RCS file: ui/org/eclipse/jdt/internal/ui/packageview/PreferenceAwareContentProvider.java
-diff -N ui/org/eclipse/jdt/internal/ui/packageview/PreferenceAwareContentProvider.java
---- /dev/null	1 Jan 1970 00:00:00 -0000
-+++ ui/org/eclipse/jdt/internal/ui/packageview/PreferenceAwareContentProvider.java	1 Jan 1970 00:00:00 -0000
-@@ -0,0 +1,174 @@
-+/***************************************************************************************************
-+ * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
-+ * accompanying materials are made available under the terms of the Eclipse Public License v1.0
-+ * which accompanies this distribution, and is available at
-+ * http://www.eclipse.org/legal/epl-v10.html
-+ * 
-+ * Contributors: IBM Corporation - initial API and implementation
-+ **************************************************************************************************/
-+package org.eclipse.jdt.internal.ui.packageview;
-+
-+import java.util.Arrays;
-+import java.util.HashSet;
-+import java.util.Iterator;
-+import java.util.Set;
-+
-+import org.eclipse.core.resources.IResource;
-+import org.eclipse.core.resources.IWorkspaceRoot;
-+
-+import org.eclipse.jface.preference.IPreferenceStore;
-+import org.eclipse.jface.util.IPropertyChangeListener;
-+import org.eclipse.jface.util.PropertyChangeEvent;
-+import org.eclipse.jface.viewers.Viewer;
-+
-+import org.eclipse.ui.IMemento;
-+import org.eclipse.ui.navigator.IExtensionStateModel;
-+import org.eclipse.ui.navigator.IPipelinedTreeContentProvider;
-+import org.eclipse.ui.navigator.PipelinedShapeModification;
-+import org.eclipse.ui.navigator.PipelinedViewerUpdate;
-+
-+import org.eclipse.jdt.core.IJavaElement;
-+import org.eclipse.jdt.core.IJavaModel;
-+import org.eclipse.jdt.core.JavaCore;
-+
-+import org.eclipse.jdt.ui.PreferenceConstants;
-+
-+import org.eclipse.jdt.internal.ui.packageview.IExtensionStateConstants.Values;
-+
-+public class PreferenceAwareContentProvider extends
-+		PackageExplorerContentProvider implements IPipelinedTreeContentProvider {
-+
-+	public PreferenceAwareContentProvider() {
-+		super(false);
-+	}
-+
-+	public PreferenceAwareContentProvider(boolean provideMembers) {
-+		super(provideMembers);
-+	}
-+
-+	public static final String JDT_EXTENSION_ID = "org.eclipse.jdt.ui.javaContent"; //$NON-NLS-1$ 
-+
-+	private IExtensionStateModel fStateModel;
-+
-+	public void init(IExtensionStateModel stateModel, IMemento memento) {
-+		fStateModel = stateModel;
-+		// fManager = new WorkingSetModelManager(fStateModel, this);
-+		// expose the manager for the action provider
-+		// fStateModel.setProperty(WorkingSetModelManager.INSTANCE_KEY,
-+		// fManager);
-+		restoreState(memento);
-+		fStateModel.addPropertyChangeListener(new IPropertyChangeListener() {
-+			public void propertyChange(PropertyChangeEvent event) {
-+				if (Values.IS_LAYOUT_FLAT.equals(event.getProperty())) {
-+					if (event.getNewValue() != null) {
-+						boolean newValue = ((Boolean) event.getNewValue())
-+								.booleanValue() ? true : false;
-+						setIsFlatLayout(newValue);
-+					}
-+				}
-+
-+			}
-+		});
-+
-+		IPreferenceStore store = PreferenceConstants.getPreferenceStore();
-+		boolean showCUChildren = store
-+				.getBoolean(PreferenceConstants.SHOW_CU_CHILDREN);
-+		setProvideMembers(showCUChildren);
-+	}
-+
-+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-+		super.inputChanged(viewer, oldInput, findInputElement(newInput));
-+	}
-+
-+	public Object[] getElements(Object inputElement) {
-+		if (inputElement instanceof IWorkspaceRoot)
-+			return super.getElements(JavaCore
-+					.create((IWorkspaceRoot) inputElement));
-+		return super.getElements(inputElement);
-+	}
-+
-+	private Object findInputElement(Object newInput) {
-+		if (newInput instanceof IWorkspaceRoot) {
-+			return JavaCore.create((IWorkspaceRoot) newInput);
-+		}
-+		return newInput;
-+	}
-+
-+	public void restoreState(IMemento memento) {
-+
-+	}
-+
-+	public void saveState(IMemento memento) {
-+
-+	}
-+
-+	public void getPipelinedChildren(Object parent, Set currentChildren) {
-+		Object[] children = getChildren(parent);
-+		for (Iterator iter = currentChildren.iterator(); iter.hasNext();)
-+			if (iter.next() instanceof IResource)
-+				iter.remove();
-+		currentChildren.addAll(Arrays.asList(children));
-+	}
-+
-+	public void getPipelinedElements(Object input, Set currentElements) {
-+		Object[] children = getElements(input);
-+
-+		for (Iterator iter = currentElements.iterator(); iter.hasNext();)
-+			if (iter.next() instanceof IResource)
-+				iter.remove();
-+
-+		currentElements.addAll(Arrays.asList(children));
-+	}
-+
-+	public Object getPipelinedParent(Object object, Object suggestedParent) {
-+		return getParent(object);
-+	}
-+
-+	public PipelinedShapeModification interceptAdd(
-+			PipelinedShapeModification anAddModification) {
-+		// TODO Auto-generated method stub
-+		return null;
-+	}
-+
-+	public PipelinedShapeModification interceptRemove(
-+			PipelinedShapeModification aRemoveModification) {
-+		// TODO Auto-generated method stub
-+		return null;
-+	}
-+
-+	public boolean interceptRefresh(
-+			PipelinedViewerUpdate aRefreshSynchronization) {
-+		IJavaElement javaElement;
-+		Set interceptedElements = new HashSet();
-+		for (Iterator iter = aRefreshSynchronization.getRefreshTargets()
-+				.iterator(); iter.hasNext();) {
-+			Object element = iter.next();
-+			if (element instanceof IResource) {
-+				if ((javaElement = JavaCore.create((IResource) element)) != null && javaElement.exists()) {
-+					iter.remove();
-+					interceptedElements.add(javaElement);
-+				}
-+			}
-+		}
-+		if (interceptedElements.size() > 0) {
-+			aRefreshSynchronization.getRefreshTargets().addAll(
-+					interceptedElements);
-+			return true;
-+		}
-+		return false;
-+
-+	}
-+
-+	public boolean interceptUpdate(PipelinedViewerUpdate anUpdateSynchronization) {
-+		// TODO Auto-generated method stub
-+		return false;
-+	}
-+
-+	/* package */void postAdd(final Object parent, final Object element) {
-+		if (parent instanceof IJavaModel)
-+			super.postAdd(((IJavaModel) parent).getWorkspace(), element);
-+		else
-+			super.postAdd(parent, element);
-+	}
-+
-+}
-Index: ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerActionProvider.java
-===================================================================
-RCS file: ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerActionProvider.java
-diff -N ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerActionProvider.java
---- /dev/null	1 Jan 1970 00:00:00 -0000
-+++ ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerActionProvider.java	1 Jan 1970 00:00:00 -0000
-@@ -0,0 +1,126 @@
-+/***************************************************************************************************
-+ * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
-+ * accompanying materials are made available under the terms of the Eclipse Public License v1.0
-+ * which accompanies this distribution, and is available at
-+ * http://www.eclipse.org/legal/epl-v10.html
-+ * 
-+ * Contributors: IBM Corporation - initial API and implementation
-+ **************************************************************************************************/
-+package org.eclipse.jdt.internal.ui.packageview;
-+
-+import org.eclipse.jface.action.IMenuManager;
-+import org.eclipse.jface.preference.IPreferenceStore;
-+import org.eclipse.jface.viewers.StructuredViewer;
-+
-+import org.eclipse.ui.IActionBars;
-+import org.eclipse.ui.IMemento;
-+import org.eclipse.ui.IViewPart;
-+import org.eclipse.ui.navigator.CommonActionProvider;
-+import org.eclipse.ui.navigator.CommonActionProviderConfig;
-+import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
-+import org.eclipse.ui.navigator.IExtensionStateModel;
-+import org.eclipse.ui.navigator.INavigatorContentService;
-+
-+import org.eclipse.jdt.ui.actions.CCPActionGroup;
-+
-+import org.eclipse.jdt.internal.ui.JavaPlugin;
-+import org.eclipse.jdt.internal.ui.packageview.IExtensionStateConstants.Values;
-+import org.eclipse.jdt.internal.ui.workingsets.ViewActionGroup;
-+
-+public class PackageExplorerActionProvider extends CommonActionProvider { 
-+
-+	private static final int HIERARCHICAL_LAYOUT = 0x1;
-+
-+	private static final int FLAT_LAYOUT = 0x2;
-+
-+	private static final String TAG_LAYOUT = "layout"; //$NON-NLS-1$
-+
-+	private ViewActionGroup fViewActionGroup;
-+
-+	private CommonLayoutActionGroup fLayoutActionGroup;
-+
-+	private boolean fHasFilledViewMenu = false;
-+
-+	private IExtensionStateModel fStateModel;
-+
-+	private CCPActionGroup fCCPGroup;
-+
-+	public void fillActionBars(IActionBars actionBars) {
-+		if (!fHasFilledViewMenu) {
-+			if(fViewActionGroup != null)
-+				fViewActionGroup.fillActionBars(actionBars);
-+			fLayoutActionGroup.fillActionBars(actionBars);
-+			fHasFilledViewMenu = true;
-+		}
-+
-+	}
-+
-+	public void fillContextMenu(IMenuManager menu) {
-+
-+		if(fCCPGroup != null)
-+			fCCPGroup.fillContextMenu(menu);
-+
-+	}
-+
-+	public void init(CommonActionProviderConfig config) {
-+
-+		ICommonViewerWorkbenchSite workbenchSite = null;
-+		if (config.getViewSite() instanceof ICommonViewerWorkbenchSite)
-+			workbenchSite = (ICommonViewerWorkbenchSite) config.getViewSite();
-+
-+		fStateModel = config.getExtensionStateModel();
-+//		WorkingSetModelManager workingSetModelManager = (WorkingSetModelManager) fStateModel
-+//				.getProperty(WorkingSetModelManager.INSTANCE_KEY);
-+
-+		fLayoutActionGroup = new CommonLayoutActionGroup(config
-+				.getStructuredViewer(), fStateModel);
-+
-+		if (workbenchSite != null) {
-+//			fViewActionGroup = new ViewActionGroup(
-+//					ViewActionGroup.SHOW_PROJECTS, /*workingSetModelManager,*/
-+//					workbenchSite.getSite());
-+			if (workbenchSite.getPart() != null
-+					&& workbenchSite.getPart() instanceof IViewPart) {
-+				fCCPGroup = new CCPActionGroup((IViewPart) workbenchSite
-+						.getPart());
-+			}
-+
-+		}
-+
-+	}
-+
-+	public void init(final String extensionId, final IViewPart viewPart,
-+			final INavigatorContentService contentService,
-+			final StructuredViewer structuredViewer) {
-+
-+	}
-+
-+	public void restoreState(IMemento memento) {
-+		super.restoreState(memento);
-+		restoreLayoutState(memento);
-+	}
-+
-+	private void restoreLayoutState(IMemento memento) {
-+		boolean isCurrentLayoutFlat = true;
-+		Integer state = null;
-+		if (memento != null)
-+			state = memento.getInteger(TAG_LAYOUT);
-+
-+		// If no memento try an restore from preference store
-+		if (state == null) {
-+			IPreferenceStore store = JavaPlugin.getDefault()
-+					.getPreferenceStore();
-+			state = new Integer(store.getInt(TAG_LAYOUT));
-+		}
-+
-+		if (state.intValue() == FLAT_LAYOUT)
-+			isCurrentLayoutFlat = true;
-+		else if (state.intValue() == HIERARCHICAL_LAYOUT)
-+			isCurrentLayoutFlat = false;
-+
-+		fStateModel.setBooleanProperty(Values.IS_LAYOUT_FLAT,
-+				isCurrentLayoutFlat);
-+		fLayoutActionGroup.setFlatLayout(isCurrentLayoutFlat);
-+	}
-+
-+}
-Index: ui/org/eclipse/jdt/internal/ui/packageview/PreferenceAwareLabelProvider.java
-===================================================================
-RCS file: ui/org/eclipse/jdt/internal/ui/packageview/PreferenceAwareLabelProvider.java
-diff -N ui/org/eclipse/jdt/internal/ui/packageview/PreferenceAwareLabelProvider.java
---- /dev/null	1 Jan 1970 00:00:00 -0000
-+++ ui/org/eclipse/jdt/internal/ui/packageview/PreferenceAwareLabelProvider.java	1 Jan 1970 00:00:00 -0000
-@@ -0,0 +1,191 @@
-+/***************************************************************************************************
-+ * 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 Eclipse Public License v1.0
-+ * which accompanies this distribution, and is available at
-+ * http://www.eclipse.org/legal/epl-v10.html
-+ * 
-+ * Contributors: IBM Corporation - initial API and implementation
-+ **************************************************************************************************/
-+package org.eclipse.jdt.internal.ui.packageview;
-+
-+import org.eclipse.core.resources.IContainer;
-+import org.eclipse.core.resources.IResource;
-+
-+import org.eclipse.swt.graphics.Color;
-+import org.eclipse.swt.graphics.Image;
-+
-+import org.eclipse.jface.util.IPropertyChangeListener;
-+import org.eclipse.jface.util.PropertyChangeEvent;
-+import org.eclipse.jface.viewers.ILabelDecorator;
-+import org.eclipse.jface.viewers.ILabelProviderListener;
-+import org.eclipse.jface.viewers.ITreeContentProvider;
-+
-+import org.eclipse.ui.IMemento;
-+import org.eclipse.ui.navigator.ICommonLabelProvider;
-+import org.eclipse.ui.navigator.IExtensionStateModel;
-+
-+import org.eclipse.jdt.core.IJavaElement;
-+
-+import org.eclipse.jdt.ui.JavaElementLabels;
-+
-+import org.eclipse.jdt.internal.ui.packageview.IExtensionStateConstants.Values;
-+import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider;
-+import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider;
-+
-+/**
-+ * Provides the labels for the Package Explorer.
-+ * <p>
-+ * It provides labels for the packages in hierarchical layout and in all other
-+ * cases delegates it to its super class.
-+ * </p>
-+ * 
-+ * @since 2.1
-+ */
-+public class PreferenceAwareLabelProvider implements ICommonLabelProvider {
-+
-+	private final long LABEL_FLAGS = JavaElementLabels.DEFAULT_QUALIFIED
-+			| JavaElementLabels.ROOT_POST_QUALIFIED
-+			| JavaElementLabels.APPEND_ROOT_PATH
-+			| JavaElementLabels.M_PARAMETER_TYPES
-+			| JavaElementLabels.M_PARAMETER_NAMES
-+			| JavaElementLabels.M_APP_RETURNTYPE
-+			| JavaElementLabels.M_EXCEPTIONS
-+			| JavaElementLabels.F_APP_TYPE_SIGNATURE
-+			| JavaElementLabels.T_TYPE_PARAMETERS;
-+
-+	private PackageExplorerLabelProvider delegeteLabelProvider;
-+
-+	private PackageExplorerContentProvider fContentProvider;
-+
-+	private IExtensionStateModel fStateModel;
-+
-+	public PreferenceAwareLabelProvider() {
-+
-+	}
-+
-+	public void init(IExtensionStateModel aStateModel,
-+			ITreeContentProvider contentProvider) {
-+		fStateModel = aStateModel;
-+
-+		fContentProvider = (PackageExplorerContentProvider) contentProvider;
-+		delegeteLabelProvider = createLabelProvider();
-+
-+		delegeteLabelProvider.setIsFlatLayout(fStateModel
-+				.getBooleanProperty(Values.IS_LAYOUT_FLAT));
-+		fStateModel.addPropertyChangeListener(new IPropertyChangeListener() {
-+			public void propertyChange(PropertyChangeEvent event) {
-+				if (Values.IS_LAYOUT_FLAT.equals(event.getProperty())) {
-+					if (event.getNewValue() != null) {
-+						boolean newValue = ((Boolean) event.getNewValue())
-+								.booleanValue() ? true : false;
-+						delegeteLabelProvider.setIsFlatLayout(newValue);
-+					}
-+				}
-+
-+			}
-+		});
-+	}
-+
-+	public String getDescription(Object anElement) {
-+		return formatMessage(anElement);
-+	}
-+
-+	private PackageExplorerLabelProvider createLabelProvider() {
-+
-+		return new PackageExplorerLabelProvider(
-+				AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS
-+						| JavaElementLabels.P_COMPRESSED,
-+				AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS
-+						| JavaElementImageProvider.SMALL_ICONS,
-+				fContentProvider);
-+
-+	}
-+
-+	public void dispose() {
-+		delegeteLabelProvider.dispose();
-+	}
-+
-+	public void propertyChange(PropertyChangeEvent event) {
-+		delegeteLabelProvider.propertyChange(event);
-+	}
-+
-+	public void addLabelDecorator(ILabelDecorator decorator) {
-+		delegeteLabelProvider.addLabelDecorator(decorator);
-+	}
-+
-+	public void addListener(ILabelProviderListener listener) {
-+		delegeteLabelProvider.addListener(listener);
-+	}
-+
-+	public Color getBackground(Object element) {
-+		return delegeteLabelProvider.getBackground(element);
-+	}
-+
-+	public Color getForeground(Object element) {
-+		return delegeteLabelProvider.getForeground(element);
-+	}
-+
-+	public Image getImage(Object element) {
-+		return delegeteLabelProvider.getImage(element);
-+	}
-+
-+	public boolean isLabelProperty(Object element, String property) {
-+		return delegeteLabelProvider.isLabelProperty(element, property);
-+	}
-+
-+	public void removeListener(ILabelProviderListener listener) {
-+		delegeteLabelProvider.removeListener(listener);
-+	}
-+
-+	public boolean equals(Object obj) {
-+		return delegeteLabelProvider.equals(obj);
-+	}
-+
-+	public int hashCode() {
-+		return delegeteLabelProvider.hashCode();
-+	}
-+
-+	public String toString() {
-+		return delegeteLabelProvider.toString();
-+	}
-+
-+	public String getText(Object element) {
-+		return delegeteLabelProvider.getText(element);
-+	}
-+
-+	public void setIsFlatLayout(boolean state) {
-+		delegeteLabelProvider.setIsFlatLayout(state);
-+	}
-+
-+	// Taken from StatusBarUpdater
-+
-+	protected String formatMessage(Object element) {
-+		if (element instanceof IJavaElement) {
-+			return formatJavaElementMessage((IJavaElement) element);
-+		} else if (element instanceof IResource) {
-+			return formatResourceMessage((IResource) element);
-+		}
-+		return ""; //$NON-NLS-1$
-+	}
-+
-+	private String formatJavaElementMessage(IJavaElement element) {
-+		return JavaElementLabels.getElementLabel(element, LABEL_FLAGS);
-+	}
-+
-+	private String formatResourceMessage(IResource element) {
-+		IContainer parent = element.getParent();
-+		if (parent != null && parent.getType() != IResource.ROOT)
-+			return element.getName() + JavaElementLabels.CONCAT_STRING
-+					+ parent.getFullPath().makeRelative().toString();
-+		else
-+			return element.getName();
-+	}
-+
-+	public void restoreState(IMemento aMemento) {
-+
-+	}
-+
-+	public void saveState(IMemento aMemento) {
-+
-+	}
-+}
-Index: ui/org/eclipse/jdt/internal/ui/packageview/IExtensionStateConstants.java
-===================================================================
-RCS file: ui/org/eclipse/jdt/internal/ui/packageview/IExtensionStateConstants.java
-diff -N ui/org/eclipse/jdt/internal/ui/packageview/IExtensionStateConstants.java
---- /dev/null	1 Jan 1970 00:00:00 -0000
-+++ ui/org/eclipse/jdt/internal/ui/packageview/IExtensionStateConstants.java	1 Jan 1970 00:00:00 -0000
-@@ -0,0 +1,23 @@
-+/***************************************************************************************************
-+ * Copyright (c) 2003, 2004 IBM Corporation and others. All rights reserved. This program and the
-+ * accompanying materials are made available under the terms of the Eclipse Public License v1.0
-+ * which accompanies this distribution, and is available at
-+ * http://www.eclipse.org/legal/epl-v10.html
-+ * 
-+ * Contributors: IBM Corporation - initial API and implementation
-+ **************************************************************************************************/
-+package org.eclipse.jdt.internal.ui.packageview;
-+
-+
-+public interface IExtensionStateConstants {
-+ 
-+	String ROOT_MODE= "rootMode"; //$NON-NLS-1$ 
-+
-+	interface Values {
-+
-+		String IS_LAYOUT_FLAT= "isLayoutFlat"; //$NON-NLS-1$
-+ 
-+
-+	}
-+
-+}
diff --git a/bundles/org.eclipse.ui.navigator/models/CommonNavigator.emx b/bundles/org.eclipse.ui.navigator/models/CommonNavigator.emx
deleted file mode 100644
index 42fcc12..0000000
--- a/bundles/org.eclipse.ui.navigator/models/CommonNavigator.emx
+++ /dev/null
@@ -1,3387 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--xtools2_universal_type_manager-->
-<uml:Model xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:notation="http://www.ibm.com/xtools/1.5.0/Notation" xmlns:uml="http://www.eclipse.org/uml2/1.0.0/UML" xmlns:umlnotation="http://www.ibm.com/xtools/1.5.0/Umlnotation" xmi:id="_SWX3UH5GEdm797szikHjoQ" name="CommonNavigator" appliedProfile="_SWX3VH5GEdm797szikHjoQ _SWX3V35GEdm797szikHjoQ _SWX3Wn5GEdm797szikHjoQ _SWX3XX5GEdm797szikHjoQ _SWX3YH5GEdm797szikHjoQ">
-  <eAnnotations xmi:id="_SWX3UX5GEdm797szikHjoQ" source="uml2.diagrams" references="_SWX3Un5GEdm797szikHjoQ">
-    <contents xmi:type="notation:Diagram" xmi:id="_SWX3Un5GEdm797szikHjoQ" type="Class" name="Core">
-      <children xmi:id="_YIiqQH5GEdm797szikHjoQ" sourceEdges="_gmJvwH5GEdm797szikHjoQ _pbicEH5GEdm797szikHjoQ _cVmOoH5IEdm797szikHjoQ _qqjuAPy4Edm185zvv0WM_Q" targetEdges="_gmP2Y35GEdm797szikHjoQ">
-        <children xmi:id="_YIiqQ35GEdm797szikHjoQ" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_YIiqRH5GEdm797szikHjoQ" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_YIiqRX5GEdm797szikHjoQ" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_YIiqRn5GEdm797szikHjoQ" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_YIiqR35GEdm797szikHjoQ" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_YIiqSH5GEdm797szikHjoQ" filtering="Automatic" filteringKeys="public,protected,private,package"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_YIiqSX5GEdm797szikHjoQ" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_YIiqSn5GEdm797szikHjoQ" filtering="Manual">
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=createCommonViewer^sign=(QComposite%3b)QCommonViewer%3b[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=initListeners^sign=(QTreeViewer%3b)V[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=handleDoubleClick^sign=(QDoubleClickEvent%3b)V[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=createCommonManager^sign=()QCommonNavigatorManager%3b[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=createCommonActionGroup^sign=()QActionGroup%3b[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=createCommonFilter^sign=(QCommonViewer%3b)QViewerFilter%3b[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=createDisposeListener^sign=()QDisposeListener%3b[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=getInitialInput^sign=()QIAdaptable%3b[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=updateTitle^sign=()V[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=getFrameToolTipText^sign=(QObject%3b)QString%3b[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </styles>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_YIiqS35GEdm797szikHjoQ" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_YIiqTH5GEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_YIiqTX5GEdm797szikHjoQ" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_YIiqTn5GEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_YIiqQX5GEdm797szikHjoQ" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_YIiqQn5GEdm797szikHjoQ" x="36252" y="1590"/>
-      </children>
-      <children xmi:id="_gYyCIH5GEdm797szikHjoQ" sourceEdges="_gmP2Y35GEdm797szikHjoQ _bpR7MH5IEdm797szikHjoQ" targetEdges="_gmJvwH5GEdm797szikHjoQ _w9XssPy0Edm185zvv0WM_Q">
-        <children xmi:id="_gYyCI35GEdm797szikHjoQ" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_gYyCJH5GEdm797szikHjoQ" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_gYyCJX5GEdm797szikHjoQ" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_gYyCJn5GEdm797szikHjoQ" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_gYyCJ35GEdm797szikHjoQ" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_gYyCKH5GEdm797szikHjoQ" filtering="Automatic" filteringKeys="public,protected,private,package"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_gYyCKX5GEdm797szikHjoQ" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_gYyCKn5GEdm797szikHjoQ" filtering="Manual">
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=init^sign=()V[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=selectionChanged^sign=(QSelectionChangedEvent%3b)V[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=restoreState^sign=(QIMemento%3b)V[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=saveState^sign=(QIMemento%3b)V[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=fillContextMenu^sign=(QIMenuManager%3b)V[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=initContextMenu^sign=()V[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=updateStatusBar^sign=(QISelection%3b)V[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=getDefaultStatusBarMessage^sign=(QIStructuredSelection%3b)QString%3b[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </styles>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_gYyCK35GEdm797szikHjoQ" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_gYyCLH5GEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_gYyCLX5GEdm797szikHjoQ" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_gYyCLn5GEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_gYyCIX5GEdm797szikHjoQ" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gYyCIn5GEdm797szikHjoQ" x="43248" y="5406"/>
-      </children>
-      <children xmi:id="_pX0ZsH5GEdm797szikHjoQ" sourceEdges="_cVsVQH5IEdm797szikHjoQ" targetEdges="_pbicEH5GEdm797szikHjoQ">
-        <children xmi:id="_pX0Zs35GEdm797szikHjoQ" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_pX0ZtH5GEdm797szikHjoQ" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_pX0ZtX5GEdm797szikHjoQ" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_pX0Ztn5GEdm797szikHjoQ" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_pX0Zt35GEdm797szikHjoQ" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_pX0ZuH5GEdm797szikHjoQ" filtering="Automatic" filteringKeys="public,protected,private,package"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_pX0ZuX5GEdm797szikHjoQ" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_pX0Zun5GEdm797szikHjoQ" filtering="Manual">
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=init^sign=()V[jsrctype^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=internalAdd^sign=(QWidget%3bQObject%3b%5bQObject%3b)V[jsrctype^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=initDragAndDrop^sign=()V[jsrctype^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=createTreeItem^sign=(QWidget%3bQObject%3bI)V[jsrctype^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </styles>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_pX0Zu35GEdm797szikHjoQ" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_pX0ZvH5GEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_pX0ZvX5GEdm797szikHjoQ" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_pX0Zvn5GEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_pX0ZsX5GEdm797szikHjoQ" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_pX0Zsn5GEdm797szikHjoQ" x="28620" y="1908"/>
-      </children>
-      <children xmi:id="_blp_cH5IEdm797szikHjoQ" sourceEdges="_cVyb4H5IEdm797szikHjoQ _SjfAUPy4Edm185zvv0WM_Q _cYMbofy4Edm185zvv0WM_Q" targetEdges="_bpR7MH5IEdm797szikHjoQ _Vs4hkPy1Edm185zvv0WM_Q">
-        <children xmi:id="_blp_c35IEdm797szikHjoQ" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_blp_dH5IEdm797szikHjoQ" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_blp_dX5IEdm797szikHjoQ" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_blp_dn5IEdm797szikHjoQ" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_blp_d35IEdm797szikHjoQ" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_blp_eH5IEdm797szikHjoQ" filtering="Automatic" filteringKeys="public,protected,private,package"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_blp_eX5IEdm797szikHjoQ" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_blp_en5IEdm797szikHjoQ" filtering="Manual">
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=init^sign=()V[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=addCommonActionProviderMenu^sign=(QIMenuManager%3bQIStructuredSelection%3bQActionContext%3b)V[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=addContentDescriptorMenu^sign=(QIMenuManager%3bQIStructuredSelection%3bQActionContext%3b)V[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=findRelevantActionDescriptors^sign=(QIStructuredSelection%3b)%5bQCommonActionProviderDescriptor%3b[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=getActionProviderInstance^sign=(QCommonActionProviderDescriptor%3b)QICommonActionProvider%3b[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=addActionDescriptor^sign=(QCommonActionProviderDescriptor%3b)V[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=complainIfDisposed^sign=()V[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=onLoad^sign=(QNavigatorContentDescriptorInstance%3b)V[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-            <filteredObjects xmi:type="uml:Operation" href="vizref:///#jmethod^vcore.target=uml2.Operation^name=initialize^sign=(QICommonActionProvider%3b)V[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </styles>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_blp_e35IEdm797szikHjoQ" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_blp_fH5IEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_blp_fX5IEdm797szikHjoQ" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_blp_fn5IEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_blp_cX5IEdm797szikHjoQ" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_blp_cn5IEdm797szikHjoQ" x="45792" y="10812"/>
-      </children>
-      <children xmi:id="_cS1OgH5IEdm797szikHjoQ" sourceEdges="_zRaDEH5IEdm797szikHjoQ _2IBD0H5IEdm797szikHjoQ _STCGUfy0Edm185zvv0WM_Q _UZHpEPy0Edm185zvv0WM_Q _UZNvsvy0Edm185zvv0WM_Q _1xTY8Py4Edm185zvv0WM_Q" targetEdges="_cVmOoH5IEdm797szikHjoQ _cVsVQH5IEdm797szikHjoQ _cVyb4H5IEdm797szikHjoQ _zRaDGH5IEdm797szikHjoQ _2IBD2H5IEdm797szikHjoQ _UZNvwvy0Edm185zvv0WM_Q _mNKdAPy1Edm185zvv0WM_Q _SjfAWPy4Edm185zvv0WM_Q _qqjuCPy4Edm185zvv0WM_Q">
-        <children xmi:id="_cS1Og35IEdm797szikHjoQ" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_cS1OhH5IEdm797szikHjoQ" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_cS1OhX5IEdm797szikHjoQ" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_cS1Ohn5IEdm797szikHjoQ" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_cS1Oh35IEdm797szikHjoQ" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_cS1OiH5IEdm797szikHjoQ" filtering="Automatic" filteringKeys="public,protected,private,package"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_cS1OiX5IEdm797szikHjoQ" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_cS1Oin5IEdm797szikHjoQ" filtering="Automatic" filteringKeys="private,package,protected"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_cS1Oi35IEdm797szikHjoQ" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_cS1OjH5IEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_cS1OjX5IEdm797szikHjoQ" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_cS1Ojn5IEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_cS1OgX5IEdm797szikHjoQ" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_cS1Ogn5IEdm797szikHjoQ" x="28938" y="16854"/>
-      </children>
-      <children xmi:id="_zPTxUH5IEdm797szikHjoQ" sourceEdges="_zRaDGH5IEdm797szikHjoQ" targetEdges="_zRaDEH5IEdm797szikHjoQ _yKo7oPy1Edm185zvv0WM_Q">
-        <children xmi:id="_zPTxU35IEdm797szikHjoQ" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_zPTxVH5IEdm797szikHjoQ" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_zPZ38H5IEdm797szikHjoQ" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_zPZ38X5IEdm797szikHjoQ" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_zPZ38n5IEdm797szikHjoQ" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_zPZ3835IEdm797szikHjoQ" filtering="Automatic" filteringKeys="public,protected,private,package"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_zPZ39H5IEdm797szikHjoQ" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_zPZ39X5IEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_zPZ39n5IEdm797szikHjoQ" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_zPZ3935IEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_zPZ3-H5IEdm797szikHjoQ" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_zPZ3-X5IEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_zPTxUX5IEdm797szikHjoQ" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zPTxUn5IEdm797szikHjoQ" x="11086" y="17457"/>
-      </children>
-      <children xmi:id="_2F0rcH5IEdm797szikHjoQ" sourceEdges="_2IBD2H5IEdm797szikHjoQ" targetEdges="_2IBD0H5IEdm797szikHjoQ _ypezwPy1Edm185zvv0WM_Q">
-        <children xmi:id="_2F0rc35IEdm797szikHjoQ" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_2F0rdH5IEdm797szikHjoQ" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_2F0rdX5IEdm797szikHjoQ" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_2F0rdn5IEdm797szikHjoQ" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_2F0rd35IEdm797szikHjoQ" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_2F0reH5IEdm797szikHjoQ" filtering="Automatic" filteringKeys="public,protected,private,package"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_2F0reX5IEdm797szikHjoQ" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_2F0ren5IEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_2F0re35IEdm797szikHjoQ" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_2F0rfH5IEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_2F0rfX5IEdm797szikHjoQ" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_2F0rfn5IEdm797szikHjoQ"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_2F0rcX5IEdm797szikHjoQ" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2F0rcn5IEdm797szikHjoQ" x="19393" y="17449"/>
-      </children>
-      <children xmi:id="_SJw1kPy0Edm185zvv0WM_Q" sourceEdges="_STINA_y0Edm185zvv0WM_Q _STOTkvy0Edm185zvv0WM_Q" targetEdges="_STOTkvy0Edm185zvv0WM_Q">
-        <children xmi:id="_SJ28MPy0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_SJ28Mfy0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_SJ28Mvy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_SJ28M_y0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_SJ28NPy0Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_SJ28Nfy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_SJ28Nvy0Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_SJ28N_y0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_SJ28OPy0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_SJ28Ofy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_SJ28Ovy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_SJ28O_y0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_SJw1kfy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_SJw1kvy0Edm185zvv0WM_Q" x="11448" y="31800"/>
-      </children>
-      <children xmi:id="_SLrhIPy0Edm185zvv0WM_Q" targetEdges="_STCGUfy0Edm185zvv0WM_Q _STINA_y0Edm185zvv0WM_Q">
-        <children xmi:id="_SLrhI_y0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_SLrhJPy0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_SLrhJfy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_SLrhJvy0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_SLrhJ_y0Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_SLrhKPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_SLrhKfy0Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_SLrhKvy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_SLrhK_y0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_SLrhLPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_SLrhLfy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_SLrhLvy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_SLrhIfy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_SLrhIvy0Edm185zvv0WM_Q" x="21624" y="31164"/>
-      </children>
-      <children xmi:id="_UTY0gPy0Edm185zvv0WM_Q" sourceEdges="_UZNvuvy0Edm185zvv0WM_Q _UZNvwvy0Edm185zvv0WM_Q _UZT2Vfy0Edm185zvv0WM_Q" targetEdges="_UZNvsvy0Edm185zvv0WM_Q _UZT2Vfy0Edm185zvv0WM_Q _KhpYMPy1Edm185zvv0WM_Q">
-        <children xmi:id="_UTY0g_y0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_UTY0hPy0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_UTY0hfy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_UTY0hvy0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_UTY0h_y0Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_UTY0iPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_UTY0ify0Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_UTY0ivy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_UTY0i_y0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_UTY0jPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_UTY0jfy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_UTY0jvy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_UTY0gfy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UTY0gvy0Edm185zvv0WM_Q" x="37524" y="26394"/>
-      </children>
-      <children xmi:id="_UXl_EPy0Edm185zvv0WM_Q" targetEdges="_UZHpEPy0Edm185zvv0WM_Q _UZNvuvy0Edm185zvv0WM_Q">
-        <children xmi:id="_UXl_E_y0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_UXl_FPy0Edm185zvv0WM_Q" width="530" height="530"/>
-        </children>
-        <children xmi:id="_UXl_Ffy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_UXl_Fvy0Edm185zvv0WM_Q" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_UXl_F_y0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_UXl_GPy0Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_UXl_Gfy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_UXl_Gvy0Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_UXl_G_y0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_UXl_HPy0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_UXl_Hfy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_UXl_Efy0Edm185zvv0WM_Q" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UXl_Evy0Edm185zvv0WM_Q" x="30210" y="31164"/>
-      </children>
-      <children xmi:id="_mh4lQPy0Edm185zvv0WM_Q" sourceEdges="_w9XssPy0Edm185zvv0WM_Q" element="_mJViYPy0Edm185zvv0WM_Q">
-        <children xmi:id="_mh4lQ_y0Edm185zvv0WM_Q" type="CommentBody" element="_mJViYPy0Edm185zvv0WM_Q"/>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_mh4lQfy0Edm185zvv0WM_Q" fillColor="16763850" lineColor="16744576" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mh4lQvy0Edm185zvv0WM_Q" x="45474" y="2226" width="4928" height="1674"/>
-      </children>
-      <children xmi:id="_ADfXQPy1Edm185zvv0WM_Q" sourceEdges="_KhpYMPy1Edm185zvv0WM_Q" element="_ADTKAPy1Edm185zvv0WM_Q">
-        <children xmi:id="_ADfXQ_y1Edm185zvv0WM_Q" type="CommentBody" element="_ADTKAPy1Edm185zvv0WM_Q"/>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_ADfXQfy1Edm185zvv0WM_Q" fillColor="16763850" lineColor="16744576" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ADfXQvy1Edm185zvv0WM_Q" x="50244" y="26712" width="5715" height="2540"/>
-      </children>
-      <children xmi:id="_MRrLYPy1Edm185zvv0WM_Q" sourceEdges="_Vs4hkPy1Edm185zvv0WM_Q" element="_MRe-IPy1Edm185zvv0WM_Q">
-        <children xmi:id="_MRrLY_y1Edm185zvv0WM_Q" type="CommentBody" element="_MRe-IPy1Edm185zvv0WM_Q"/>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_MRrLYfy1Edm185zvv0WM_Q" fillColor="16763850" lineColor="16744576" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_MRrLYvy1Edm185zvv0WM_Q" x="41658" y="10812" width="3175" height="5432"/>
-      </children>
-      <children xmi:id="_XJC9kPy1Edm185zvv0WM_Q" sourceEdges="_mNKdAPy1Edm185zvv0WM_Q" element="_XIwpsPy1Edm185zvv0WM_Q">
-        <children xmi:id="_XJC9k_y1Edm185zvv0WM_Q" type="CommentBody" element="_XIwpsPy1Edm185zvv0WM_Q"/>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_XJC9kfy1Edm185zvv0WM_Q" fillColor="16763850" lineColor="16744576" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_XJC9kvy1Edm185zvv0WM_Q" x="22260" y="11130" width="5715" height="4762"/>
-      </children>
-      <children xmi:id="_vA1SEPy1Edm185zvv0WM_Q" sourceEdges="_yKo7oPy1Edm185zvv0WM_Q _ypezwPy1Edm185zvv0WM_Q" element="_vAWw8Py1Edm185zvv0WM_Q">
-        <children xmi:id="_vA1SE_y1Edm185zvv0WM_Q" type="CommentBody" element="_vAWw8Py1Edm185zvv0WM_Q"/>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_vA1SEfy1Edm185zvv0WM_Q" fillColor="16763850" lineColor="16744576" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vA1SEvy1Edm185zvv0WM_Q" x="16826" y="9900" width="4471" height="1270"/>
-      </children>
-      <children xmi:id="_She1MPy4Edm185zvv0WM_Q" sourceEdges="_SjfAWPy4Edm185zvv0WM_Q" targetEdges="_SjfAUPy4Edm185zvv0WM_Q _cYSiQ_y4Edm185zvv0WM_Q">
-        <children xmi:id="_She1M_y4Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_She1NPy4Edm185zvv0WM_Q" width="530" height="530"/>
-        </children>
-        <children xmi:id="_She1Nfy4Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_She1Nvy4Edm185zvv0WM_Q" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_She1N_y4Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_She1OPy4Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_She1Ofy4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_She1Ovy4Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_She1O_y4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_She1PPy4Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_She1Pfy4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_She1Mfy4Edm185zvv0WM_Q" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_She1Mvy4Edm185zvv0WM_Q" x="49608" y="18444"/>
-      </children>
-      <children xmi:id="_cT5xgPy4Edm185zvv0WM_Q" sourceEdges="_cYSiQ_y4Edm185zvv0WM_Q" targetEdges="_cYMbofy4Edm185zvv0WM_Q">
-        <children xmi:id="_cT_4IPy4Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_cT_4Ify4Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_cT_4Ivy4Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_cT_4I_y4Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_cT_4JPy4Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_cT_4Jfy4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_cT_4Jvy4Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_cT_4J_y4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_cT_4KPy4Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_cT_4Kfy4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_cT_4Kvy4Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_cT_4K_y4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_cT5xgfy4Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_cT5xgvy4Edm185zvv0WM_Q" x="52034" y="10759" width="8804"/>
-      </children>
-      <children xmi:id="_qn-7IPy4Edm185zvv0WM_Q" sourceEdges="_qqjuCPy4Edm185zvv0WM_Q" targetEdges="_qqjuAPy4Edm185zvv0WM_Q">
-        <children xmi:id="_qn-7I_y4Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_qn-7JPy4Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_qn-7Jfy4Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_qn-7Jvy4Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_qn-7J_y4Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_qn-7KPy4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_qn-7Kfy4Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_qn-7Kvy4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_qn-7K_y4Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_qn-7LPy4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_qn-7Lfy4Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_qn-7Lvy4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_qn-7Ify4Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_qn-7Ivy4Edm185zvv0WM_Q" x="13705" y="25135"/>
-      </children>
-      <children xmi:id="_1ucSMPy4Edm185zvv0WM_Q" targetEdges="_1xTY8Py4Edm185zvv0WM_Q _8M1R8Py4Edm185zvv0WM_Q">
-        <children xmi:id="_1ucSM_y4Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_1ucSNPy4Edm185zvv0WM_Q" width="530" height="530"/>
-        </children>
-        <children xmi:id="_1ucSNfy4Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_1ucSNvy4Edm185zvv0WM_Q" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_1ucSN_y4Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_1ucSOPy4Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_1ucSOfy4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_1ucSOvy4Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_1ucSO_y4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_1ucSPPy4Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_1ucSPfy4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_1ucSMfy4Edm185zvv0WM_Q" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_1ucSMvy4Edm185zvv0WM_Q" x="4452" y="17490"/>
-      </children>
-      <children xmi:id="_8MEc8Py4Edm185zvv0WM_Q" sourceEdges="_8M1R8Py4Edm185zvv0WM_Q _E9EYgPy5Edm185zvv0WM_Q">
-        <children xmi:id="_8MKjkPy4Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_8MKjkfy4Edm185zvv0WM_Q" width="530" height="530"/>
-        </children>
-        <children xmi:id="_8MKjkvy4Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_8MKjk_y4Edm185zvv0WM_Q" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_8MKjlPy4Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_8MKjlfy4Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_8MKjlvy4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_8MKjl_y4Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_8MKjmPy4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_8MKjmfy4Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_8MKjmvy4Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_8MEc8fy4Edm185zvv0WM_Q" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8MEc8vy4Edm185zvv0WM_Q" x="42294" y="21624"/>
-      </children>
-      <children xmi:id="_E7KUAPy5Edm185zvv0WM_Q" targetEdges="_E9EYgPy5Edm185zvv0WM_Q">
-        <children xmi:id="_E7KUA_y5Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDescriptionProvider[jcu^name=IDescriptionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_E7KUBPy5Edm185zvv0WM_Q" width="530" height="530"/>
-        </children>
-        <children xmi:id="_E7KUBfy5Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDescriptionProvider[jcu^name=IDescriptionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_E7KUBvy5Edm185zvv0WM_Q" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDescriptionProvider[jcu^name=IDescriptionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_E7KUB_y5Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDescriptionProvider[jcu^name=IDescriptionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_E7KUCPy5Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_E7KUCfy5Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDescriptionProvider[jcu^name=IDescriptionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_E7KUCvy5Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_E7KUC_y5Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDescriptionProvider[jcu^name=IDescriptionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_E7KUDPy5Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_E7KUDfy5Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDescriptionProvider[jcu^name=IDescriptionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_E7KUAfy5Edm185zvv0WM_Q" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDescriptionProvider[jcu^name=IDescriptionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_E7KUAvy5Edm185zvv0WM_Q" x="42612" y="18126"/>
-      </children>
-      <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_SWX3U35GEdm797szikHjoQ"/>
-      <edges xmi:id="_gmJvwH5GEdm797szikHjoQ" source="_YIiqQH5GEdm797szikHjoQ" target="_gYyCIH5GEdm797szikHjoQ">
-        <children xmi:id="_gmJvw35GEdm797szikHjoQ" type="KindLabel">
-          <children xmi:id="_gmP2YH5GEdm797szikHjoQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_gmP2Yn5GEdm797szikHjoQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_gmP2YX5GEdm797szikHjoQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_gmJvxH5GEdm797szikHjoQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_gmJvwX5GEdm797szikHjoQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gmJvwn5GEdm797szikHjoQ" points="[-14, 3413, -6800, -4577]$[6786, 5000, 0, -2990]"/>
-      </edges>
-      <edges xmi:id="_gmP2Y35GEdm797szikHjoQ" source="_gYyCIH5GEdm797szikHjoQ" target="_YIiqQH5GEdm797szikHjoQ">
-        <children xmi:id="_gmP2Zn5GEdm797szikHjoQ" type="KindLabel">
-          <children xmi:id="_gmP2aH5GEdm797szikHjoQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_gmP2an5GEdm797szikHjoQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_gmP2aX5GEdm797szikHjoQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_gmP2Z35GEdm797szikHjoQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_gmP2ZH5GEdm797szikHjoQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gmP2ZX5GEdm797szikHjoQ" points="[0, -2990, 6786, 5000]$[-6800, -4577, -14, 3413]"/>
-      </edges>
-      <edges xmi:id="_pbicEH5GEdm797szikHjoQ" source="_YIiqQH5GEdm797szikHjoQ" target="_pX0ZsH5GEdm797szikHjoQ">
-        <children xmi:id="_pbicE35GEdm797szikHjoQ" type="KindLabel">
-          <children xmi:id="_pbicFX5GEdm797szikHjoQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_pbicF35GEdm797szikHjoQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_pbicFn5GEdm797szikHjoQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_pbicFH5GEdm797szikHjoQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_pbicEX5GEdm797szikHjoQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_pbicEn5GEdm797szikHjoQ" points="[-14, 3413, 3161, -4577]$[-3189, 5000, -14, -2990]"/>
-      </edges>
-      <edges xmi:id="_bpR7MH5IEdm797szikHjoQ" source="_gYyCIH5GEdm797szikHjoQ" target="_blp_cH5IEdm797szikHjoQ">
-        <children xmi:id="_bpR7M35IEdm797szikHjoQ" type="KindLabel">
-          <children xmi:id="_bpR7NX5IEdm797szikHjoQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_bpR7N35IEdm797szikHjoQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_bpR7Nn5IEdm797szikHjoQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_bpR7NH5IEdm797szikHjoQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_bpR7MX5IEdm797szikHjoQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_bpR7Mn5IEdm797szikHjoQ" points="[0, 2990, 3915, -5927]$[-3916, 4578, -1, -4339]"/>
-      </edges>
-      <edges xmi:id="_cVmOoH5IEdm797szikHjoQ" source="_YIiqQH5GEdm797szikHjoQ" target="_cS1OgH5IEdm797szikHjoQ">
-        <children xmi:id="_cVmOo35IEdm797szikHjoQ" type="KindLabel">
-          <children xmi:id="_cVmOpX5IEdm797szikHjoQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_cVmOp35IEdm797szikHjoQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_cVmOpn5IEdm797szikHjoQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_cVmOpH5IEdm797szikHjoQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_cVmOoX5IEdm797szikHjoQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_cVmOon5IEdm797szikHjoQ" points="[-14, 3413, 10001, -25585]$[-14, 21247, 10001, -7751]$[-10015, 22833, 0, -6165]"/>
-      </edges>
-      <edges xmi:id="_cVsVQH5IEdm797szikHjoQ" source="_pX0ZsH5GEdm797szikHjoQ" target="_cS1OgH5IEdm797szikHjoQ">
-        <children xmi:id="_cVsVQ35IEdm797szikHjoQ" type="KindLabel">
-          <children xmi:id="_cVsVRX5IEdm797szikHjoQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_cVsVR35IEdm797szikHjoQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_cVsVRn5IEdm797szikHjoQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_cVsVRH5IEdm797szikHjoQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_cVsVQX5IEdm797szikHjoQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonViewer[jcu^name=CommonViewer.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_cVsVQn5IEdm797szikHjoQ" points="[-14, 2990, 6826, -18018]$[2738, 4578, 9578, -16430]$[2738, 13257, 9578, -7751]$[-6840, 14843, 0, -6165]"/>
-      </edges>
-      <edges xmi:id="_cVyb4H5IEdm797szikHjoQ" source="_blp_cH5IEdm797szikHjoQ" target="_cS1OgH5IEdm797szikHjoQ">
-        <children xmi:id="_cVyb435IEdm797szikHjoQ" type="KindLabel">
-          <children xmi:id="_cVyb5X5IEdm797szikHjoQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_cVyb535IEdm797szikHjoQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_cVyb5n5IEdm797szikHjoQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_cVyb5H5IEdm797szikHjoQ" y="1"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_cVyb4X5IEdm797szikHjoQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_cVyb4n5IEdm797szikHjoQ" points="[26, 2963, 16325, -6244]$[26, 6562, 16325, -2645]$[-13335, 6562, 2964, -2645]"/>
-      </edges>
-      <edges xmi:id="_zRaDEH5IEdm797szikHjoQ" source="_cS1OgH5IEdm797szikHjoQ" target="_zPTxUH5IEdm797szikHjoQ">
-        <children xmi:id="_zRaDE35IEdm797szikHjoQ" type="KindLabel">
-          <children xmi:id="_zRaDFX5IEdm797szikHjoQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_zRaDF35IEdm797szikHjoQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_zRaDFn5IEdm797szikHjoQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_zRaDFH5IEdm797szikHjoQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_zRaDEX5IEdm797szikHjoQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_zRaDEn5IEdm797szikHjoQ" points="[0, -6165, 14565, 5926]$[-14579, -7752, -14, 4339]"/>
-      </edges>
-      <edges xmi:id="_zRaDGH5IEdm797szikHjoQ" source="_zPTxUH5IEdm797szikHjoQ" target="_cS1OgH5IEdm797szikHjoQ">
-        <children xmi:id="_zRaDG35IEdm797szikHjoQ" type="KindLabel">
-          <children xmi:id="_zRaDHX5IEdm797szikHjoQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_zRaDH35IEdm797szikHjoQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_zRaDHn5IEdm797szikHjoQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_zRaDHH5IEdm797szikHjoQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_zRaDGX5IEdm797szikHjoQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_zRaDGn5IEdm797szikHjoQ" points="[-14, 4339, -14579, -7752]$[14565, 5926, 0, -6165]"/>
-      </edges>
-      <edges xmi:id="_2IBD0H5IEdm797szikHjoQ" source="_cS1OgH5IEdm797szikHjoQ" target="_2F0rcH5IEdm797szikHjoQ">
-        <children xmi:id="_2IBD035IEdm797szikHjoQ" type="KindLabel">
-          <children xmi:id="_2IBD1X5IEdm797szikHjoQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_2IBD135IEdm797szikHjoQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_2IBD1n5IEdm797szikHjoQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_2IBD1H5IEdm797szikHjoQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_2IBD0X5IEdm797szikHjoQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_2IBD0n5IEdm797szikHjoQ" points="[0, -6165, 6509, 5926]$[-6509, -7752, 0, 4339]"/>
-      </edges>
-      <edges xmi:id="_2IBD2H5IEdm797szikHjoQ" source="_2F0rcH5IEdm797szikHjoQ" target="_cS1OgH5IEdm797szikHjoQ">
-        <children xmi:id="_2IBD235IEdm797szikHjoQ" type="KindLabel">
-          <children xmi:id="_2IBD3X5IEdm797szikHjoQ" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_2IBD335IEdm797szikHjoQ" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_2IBD3n5IEdm797szikHjoQ" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_2IBD3H5IEdm797szikHjoQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_2IBD2X5IEdm797szikHjoQ" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_2IBD2n5IEdm797szikHjoQ" points="[0, 4339, -6509, -7752]$[6509, 5926, 0, -6165]"/>
-      </edges>
-      <edges xmi:id="_STCGUfy0Edm185zvv0WM_Q" source="_cS1OgH5IEdm797szikHjoQ" target="_SLrhIPy0Edm185zvv0WM_Q">
-        <children xmi:id="_STCGVPy0Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_STIM8Py0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_STIM8vy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_STIM8fy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_STCGVfy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_STCGUvy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_STCGU_y0Edm185zvv0WM_Q" points="[0, 6165, 3612, -6337]$[-3625, 7752, -13, -4750]"/>
-      </edges>
-      <edges xmi:id="_STINA_y0Edm185zvv0WM_Q" source="_SJw1kPy0Edm185zvv0WM_Q" target="_SLrhIPy0Edm185zvv0WM_Q">
-        <children xmi:id="_STINBvy0Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_STINCPy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_STOTkfy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_STOTkPy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_STINB_y0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_STINBPy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerDescriptor[jcu^name=NavigatorViewerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_STINBfy0Edm185zvv0WM_Q" points="[0, 6165, -3638, -6337]$[3625, 7752, -13, -4750]"/>
-      </edges>
-      <edges xmi:id="_STOTkvy0Edm185zvv0WM_Q" source="_SJw1kPy0Edm185zvv0WM_Q" target="_SJw1kPy0Edm185zvv0WM_Q">
-        <children xmi:id="_STOTlfy0Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_STOTl_y0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_STOTmfy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_STOTmPy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_STOTlvy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_STOTk_y0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerDescriptorRegistry[jcu^name=NavigatorViewerDescriptorRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_STOTlPy0Edm185zvv0WM_Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
-      </edges>
-      <edges xmi:id="_UZHpEPy0Edm185zvv0WM_Q" source="_cS1OgH5IEdm797szikHjoQ" target="_UXl_EPy0Edm185zvv0WM_Q">
-        <children xmi:id="_UZHpE_y0Edm185zvv0WM_Q" type="NameLabel">
-          <children xmi:id="_UZNvsPy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Implementation" href="vizref:///#jimpl^vcore.target=uml2.Implementation[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_UZNvsfy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Implementation" href="vizref:///#jimpl^vcore.target=uml2.Implementation[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Implementation" href="vizref:///#jimpl^vcore.target=uml2.Implementation[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_UZHpFPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_UZHpEfy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Implementation" href="vizref:///#jimpl^vcore.target=uml2.Implementation[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_UZHpEvy0Edm185zvv0WM_Q" points="[0, 6165, -3400, -6337]$[3387, 7752, -13, -4750]"/>
-      </edges>
-      <edges xmi:id="_UZNvsvy0Edm185zvv0WM_Q" source="_cS1OgH5IEdm797szikHjoQ" target="_UTY0gPy0Edm185zvv0WM_Q">
-        <children xmi:id="_UZNvtfy0Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_UZNvt_y0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_UZNvufy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_UZNvuPy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_UZNvtvy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_UZNvs_y0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_UZNvtPy0Edm185zvv0WM_Q" points="[0, -6165, -3387, 5926]$[3387, -7752, 0, 4339]"/>
-      </edges>
-      <edges xmi:id="_UZNvuvy0Edm185zvv0WM_Q" source="_UTY0gPy0Edm185zvv0WM_Q" target="_UXl_EPy0Edm185zvv0WM_Q">
-        <children xmi:id="_UZNvvfy0Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_UZNvv_y0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_UZNvwfy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_UZNvwPy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_UZNvvvy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_UZNvu_y0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionActivationListener[jcu^name=IExtensionActivationListener.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_UZNvvPy0Edm185zvv0WM_Q" points="[0, 4339, -13, -20254]$[0, 19843, -13, -4750]"/>
-      </edges>
-      <edges xmi:id="_UZNvwvy0Edm185zvv0WM_Q" source="_UTY0gPy0Edm185zvv0WM_Q" target="_cS1OgH5IEdm797szikHjoQ">
-        <children xmi:id="_UZT2UPy0Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_UZT2Uvy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_UZT2VPy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_UZT2U_y0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_UZT2Ufy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_UZNvw_y0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_UZNvxPy0Edm185zvv0WM_Q" points="[0, 4339, 3387, -7752]$[-3387, 5926, 0, -6165]"/>
-      </edges>
-      <edges xmi:id="_UZT2Vfy0Edm185zvv0WM_Q" source="_UTY0gPy0Edm185zvv0WM_Q" target="_UTY0gPy0Edm185zvv0WM_Q">
-        <children xmi:id="_UZT2WPy0Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_UZT2Wvy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_UZT2XPy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_UZT2W_y0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_UZT2Wfy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_UZT2Vvy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_UZT2V_y0Edm185zvv0WM_Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
-      </edges>
-      <edges xmi:id="_w9XssPy0Edm185zvv0WM_Q" type="Reference" source="_mh4lQPy0Edm185zvv0WM_Q" target="_gYyCIH5GEdm797szikHjoQ">
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_w9Xssfy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_w9Xssvy0Edm185zvv0WM_Q" points="[0, 3413, 0, -4577]$[0, 5000, 0, -2990]"/>
-      </edges>
-      <edges xmi:id="_KhpYMPy1Edm185zvv0WM_Q" type="Reference" source="_ADfXQPy1Edm185zvv0WM_Q" target="_UTY0gPy0Edm185zvv0WM_Q">
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_KhpYMfy1Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_KhpYMvy1Edm185zvv0WM_Q" points="[-13, 2990, -2593, -5927]$[2580, 4578, 0, -4339]"/>
-      </edges>
-      <edges xmi:id="_Vs4hkPy1Edm185zvv0WM_Q" type="Reference" source="_MRrLYPy1Edm185zvv0WM_Q" target="_blp_cH5IEdm797szikHjoQ">
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_Vs4hkfy1Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Vs4hkvy1Edm185zvv0WM_Q" points="[-14, 2990, -874, -5927]$[859, 4578, -1, -4339]"/>
-      </edges>
-      <edges xmi:id="_mNKdAPy1Edm185zvv0WM_Q" type="Reference" source="_XJC9kPy1Edm185zvv0WM_Q" target="_cS1OgH5IEdm797szikHjoQ">
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_mNKdAfy1Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_mNKdAvy1Edm185zvv0WM_Q" points="[2170, 2434, -4603, -7064]$[2170, 3782, -4603, -5716]$[3810, 3782, -2963, -5716]"/>
-      </edges>
-      <edges xmi:id="_yKo7oPy1Edm185zvv0WM_Q" type="Reference" source="_vA1SEPy1Edm185zvv0WM_Q" target="_zPTxUH5IEdm797szikHjoQ">
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_yKo7ofy1Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_yKo7ovy1Edm185zvv0WM_Q" points="[0, 2990, 4035, -5927]$[-4049, 4578, -14, -4339]"/>
-      </edges>
-      <edges xmi:id="_ypezwPy1Edm185zvv0WM_Q" type="Reference" source="_vA1SEPy1Edm185zvv0WM_Q" target="_2F0rcH5IEdm797szikHjoQ">
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_ypezwfy1Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ypezwvy1Edm185zvv0WM_Q" points="[0, 2990, -4021, -5927]$[4021, 4578, 0, -4339]"/>
-      </edges>
-      <edges xmi:id="_SjfAUPy4Edm185zvv0WM_Q" source="_blp_cH5IEdm797szikHjoQ" target="_She1MPy4Edm185zvv0WM_Q">
-        <children xmi:id="_SjfAU_y4Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_SjfAVfy4Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_SjfAV_y4Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_SjfAVvy4Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_SjfAVPy4Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_SjfAUfy4Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_SjfAUvy4Edm185zvv0WM_Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
-      </edges>
-      <edges xmi:id="_SjfAWPy4Edm185zvv0WM_Q" source="_She1MPy4Edm185zvv0WM_Q" target="_cS1OgH5IEdm797szikHjoQ">
-        <children xmi:id="_SjfAW_y4Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_SjfAXfy4Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_SjlG8Py4Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_SjfAXvy4Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_SjfAXPy4Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_SjfAWfy4Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_SjfAWvy4Edm185zvv0WM_Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
-      </edges>
-      <edges xmi:id="_cYMbofy4Edm185zvv0WM_Q" source="_blp_cH5IEdm797szikHjoQ" target="_cT5xgPy4Edm185zvv0WM_Q">
-        <children xmi:id="_cYMbpPy4Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_cYSiQPy4Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_cYSiQvy4Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_cYSiQfy4Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_cYMbpfy4Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_cYMbovy4Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_cYMbo_y4Edm185zvv0WM_Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
-      </edges>
-      <edges xmi:id="_cYSiQ_y4Edm185zvv0WM_Q" source="_cT5xgPy4Edm185zvv0WM_Q" target="_She1MPy4Edm185zvv0WM_Q">
-        <children xmi:id="_cYSiRvy4Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_cYSiSPy4Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_cYSiSvy4Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_cYSiSfy4Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_cYSiR_y4Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_cYSiRPy4Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonActionProviderDescriptor[jcu^name=CommonActionProviderDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.actions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ICommonActionProvider[jcu^name=ICommonActionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_cYSiRfy4Edm185zvv0WM_Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
-      </edges>
-      <edges xmi:id="_qqjuAPy4Edm185zvv0WM_Q" source="_YIiqQH5GEdm797szikHjoQ" target="_qn-7IPy4Edm185zvv0WM_Q">
-        <children xmi:id="_qqjuA_y4Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_qqjuBfy4Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_qqjuB_y4Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_qqjuBvy4Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_qqjuBPy4Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_qqjuAfy4Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigator[jcu^name=CommonNavigator.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_qqjuAvy4Edm185zvv0WM_Q" points="[-2249, 3439, 17251, -19156]$[-2249, 36459, 17251, 13864]$[-19473, 36459, 27, 13864]$[-19473, 24976, 27, 2381]"/>
-      </edges>
-      <edges xmi:id="_qqjuCPy4Edm185zvv0WM_Q" source="_qn-7IPy4Edm185zvv0WM_Q" target="_cS1OgH5IEdm797szikHjoQ">
-        <children xmi:id="_qqjuC_y4Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_qqjuDfy4Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_qqjuD_y4Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_qqjuDvy4Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_qqjuDPy4Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_qqjuCfy4Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonSorter[jcu^name=CommonSorter.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_qqjuCvy4Edm185zvv0WM_Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
-      </edges>
-      <edges xmi:id="_1xTY8Py4Edm185zvv0WM_Q" source="_cS1OgH5IEdm797szikHjoQ" target="_1ucSMPy4Edm185zvv0WM_Q">
-        <children xmi:id="_1xTY8_y4Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_1xTY9fy4Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_1xTY9_y4Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_1xTY9vy4Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_1xTY9Py4Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_1xTY8fy4Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_1xTY8vy4Edm185zvv0WM_Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
-      </edges>
-      <edges xmi:id="_8M1R8Py4Edm185zvv0WM_Q" source="_8MEc8Py4Edm185zvv0WM_Q" target="_1ucSMPy4Edm185zvv0WM_Q">
-        <children xmi:id="_8M1R8_y4Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_8M1R9fy4Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_8M1R9_y4Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_8M1R9vy4Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_8M1R9Py4Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_8M1R8fy4Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IExtensionStateModel[jcu^name=IExtensionStateModel.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_8M1R8vy4Edm185zvv0WM_Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
-      </edges>
-      <edges xmi:id="_E9EYgPy5Edm185zvv0WM_Q" source="_8MEc8Py4Edm185zvv0WM_Q" target="_E7KUAPy5Edm185zvv0WM_Q">
-        <children xmi:id="_E9EYg_y5Edm185zvv0WM_Q" type="NameLabel">
-          <children xmi:id="_E9EYhfy5Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDescriptionProvider[jcu^name=IDescriptionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_E9EYhvy5Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDescriptionProvider[jcu^name=IDescriptionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDescriptionProvider[jcu^name=IDescriptionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_E9EYhPy5Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_E9EYgfy5Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=ICommonLabelProvider[jcu^name=ICommonLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDescriptionProvider[jcu^name=IDescriptionProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_E9EYgvy5Edm185zvv0WM_Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
-      </edges>
-    </contents>
-    <contents xmi:type="notation:Diagram" xmi:id="_0Lw7oIOwEdmyd--cXlrqyQ" type="Component" name="Extension">
-      <children xmi:id="_GABgEIO0Edmyd--cXlrqyQ" type="rectangle">
-        <children xmi:id="_GABgE4O0Edmyd--cXlrqyQ" type="DiagramName"/>
-        <children xmi:id="_GABgFIO0Edmyd--cXlrqyQ" type="Description"/>
-        <styles xmi:type="notation:ShapeStyle" xmi:id="_GABgEYO0Edmyd--cXlrqyQ" fillColor="13369343" lineColor="6737151"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_GABgEoO0Edmyd--cXlrqyQ" x="14310" y="6042" width="6058" height="8254"/>
-      </children>
-      <children xmi:id="_bdRhQIOzEdmyd--cXlrqyQ" type="rectangle">
-        <children xmi:id="_bdRhQ4OzEdmyd--cXlrqyQ" type="DiagramName"/>
-        <children xmi:id="_bdRhRIOzEdmyd--cXlrqyQ" type="Description"/>
-        <styles xmi:type="notation:ShapeStyle" xmi:id="_bdRhQYOzEdmyd--cXlrqyQ" fillColor="13420443" lineColor="6737151"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_bdRhQoOzEdmyd--cXlrqyQ" x="636" y="6350" width="5715" height="7937"/>
-      </children>
-      <children xmi:id="_uX5iwIO0Edmyd--cXlrqyQ" type="rectangle">
-        <children xmi:id="_uX5iw4O0Edmyd--cXlrqyQ" type="DiagramName"/>
-        <children xmi:id="_uX5ixIO0Edmyd--cXlrqyQ" type="Description"/>
-        <styles xmi:type="notation:ShapeStyle" xmi:id="_uX5iwYO0Edmyd--cXlrqyQ" fillColor="13369343" lineColor="6737151"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_uX5iwoO0Edmyd--cXlrqyQ" x="635" y="9525" width="5714" height="2222"/>
-      </children>
-      <children xmi:id="_-Cw18IOwEdmyd--cXlrqyQ" targetEdges="_DeykUIOyEdmyd--cXlrqyQ" element="_9330kIOwEdmyd--cXlrqyQ">
-        <children xmi:id="_-DPXEIOwEdmyd--cXlrqyQ" type="Stereotype" element="_9330kIOwEdmyd--cXlrqyQ"/>
-        <children xmi:id="_-DPXEYOwEdmyd--cXlrqyQ" type="Kind" element="_9330kIOwEdmyd--cXlrqyQ"/>
-        <children xmi:id="_-DPXEoOwEdmyd--cXlrqyQ" type="Name" element="_9330kIOwEdmyd--cXlrqyQ"/>
-        <children xmi:id="_-DPXE4OwEdmyd--cXlrqyQ" visible="false" type="AttributeCompartment" element="_9330kIOwEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_-DPXFIOwEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_-DPXFYOwEdmyd--cXlrqyQ" visible="false" type="OperationCompartment" element="_9330kIOwEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_-DPXFoOwEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_-DPXF4OwEdmyd--cXlrqyQ" visible="false" type="RealizationListCompartment" element="_9330kIOwEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_-DPXGIOwEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_-DVdsIOwEdmyd--cXlrqyQ" visible="false" type="RequiredInterfaceListCompartment" element="_9330kIOwEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_-DVdsYOwEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_-DVdsoOwEdmyd--cXlrqyQ" visible="false" type="ProvidedInterfaceListCompartment" element="_9330kIOwEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_-DVds4OwEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_-DVdtIOwEdmyd--cXlrqyQ" visible="false" type="StructureCompartment" element="_9330kIOwEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_-DVdtYOwEdmyd--cXlrqyQ"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLComponentStyle" xmi:id="_-Cw18YOwEdmyd--cXlrqyQ" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-Cw18oOwEdmyd--cXlrqyQ" x="1086" y="12402"/>
-      </children>
-      <children xmi:id="_X4hTAIOxEdmyd--cXlrqyQ" sourceEdges="_gS43QIOxEdmyd--cXlrqyQ" element="_X4I4gIOxEdmyd--cXlrqyQ">
-        <children xmi:id="_X4oAsIOxEdmyd--cXlrqyQ" type="Stereotype" element="_X4I4gIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_X4oAsYOxEdmyd--cXlrqyQ" type="Kind" element="_X4I4gIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_X4oAsoOxEdmyd--cXlrqyQ" type="Name" element="_X4I4gIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_X4oAs4OxEdmyd--cXlrqyQ" visible="false" type="AttributeCompartment" element="_X4I4gIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_X4oAtIOxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_X4oAtYOxEdmyd--cXlrqyQ" visible="false" type="OperationCompartment" element="_X4I4gIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_X4oAtoOxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_X4oAt4OxEdmyd--cXlrqyQ" visible="false" type="RealizationListCompartment" element="_X4I4gIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_X4oAuIOxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_X4oAuYOxEdmyd--cXlrqyQ" visible="false" type="RequiredInterfaceListCompartment" element="_X4I4gIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_X4oAuoOxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_X4oAu4OxEdmyd--cXlrqyQ" visible="false" type="ProvidedInterfaceListCompartment" element="_X4I4gIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_X4oAvIOxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_X4oAvYOxEdmyd--cXlrqyQ" visible="false" type="StructureCompartment" element="_X4I4gIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_X4oAvoOxEdmyd--cXlrqyQ"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLComponentStyle" xmi:id="_X4hTAYOxEdmyd--cXlrqyQ" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_X4hTAoOxEdmyd--cXlrqyQ" x="954" y="9858"/>
-      </children>
-      <children xmi:id="_b7Ja8IOxEdmyd--cXlrqyQ" targetEdges="_gS43QIOxEdmyd--cXlrqyQ _AbrYoIOyEdmyd--cXlrqyQ" element="_b6MYsIOxEdmyd--cXlrqyQ">
-        <children xmi:id="_b7Ja84OxEdmyd--cXlrqyQ" type="Stereotype" element="_b6MYsIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_b7Ja9IOxEdmyd--cXlrqyQ" type="Kind" element="_b6MYsIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_b7Ja9YOxEdmyd--cXlrqyQ" type="Name" element="_b6MYsIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_b7Ja9oOxEdmyd--cXlrqyQ" visible="false" type="AttributeCompartment" element="_b6MYsIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_b7Ja94OxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_b7Ja-IOxEdmyd--cXlrqyQ" visible="false" type="OperationCompartment" element="_b6MYsIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_b7Ja-YOxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_b7Ja-oOxEdmyd--cXlrqyQ" visible="false" type="RealizationListCompartment" element="_b6MYsIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_b7Ja-4OxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_b7Ja_IOxEdmyd--cXlrqyQ" visible="false" type="RequiredInterfaceListCompartment" element="_b6MYsIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_b7Ja_YOxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_b7Ja_oOxEdmyd--cXlrqyQ" visible="false" type="ProvidedInterfaceListCompartment" element="_b6MYsIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_b7Ja_4OxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_b7JbAIOxEdmyd--cXlrqyQ" visible="false" type="StructureCompartment" element="_b6MYsIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_b7JbAYOxEdmyd--cXlrqyQ"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLComponentStyle" xmi:id="_b7Ja8YOxEdmyd--cXlrqyQ" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_b7Ja8oOxEdmyd--cXlrqyQ" x="1590" y="7021"/>
-      </children>
-      <children xmi:id="_jhv_8IOxEdmyd--cXlrqyQ" targetEdges="_mJKuIIOxEdmyd--cXlrqyQ _Jsqb0IOyEdmyd--cXlrqyQ" element="_jhjysIOxEdmyd--cXlrqyQ">
-        <children xmi:id="_jhv_84OxEdmyd--cXlrqyQ" type="Stereotype" element="_jhjysIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_jhv_9IOxEdmyd--cXlrqyQ" type="Kind" element="_jhjysIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_jhv_9YOxEdmyd--cXlrqyQ" type="Name" element="_jhjysIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_jhv_9oOxEdmyd--cXlrqyQ" visible="false" type="AttributeCompartment" element="_jhjysIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_jhv_94OxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_jhv_-IOxEdmyd--cXlrqyQ" visible="false" type="OperationCompartment" element="_jhjysIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_jhv_-YOxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_jhv_-oOxEdmyd--cXlrqyQ" visible="false" type="RealizationListCompartment" element="_jhjysIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_jhv_-4OxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_jhv__IOxEdmyd--cXlrqyQ" visible="false" type="RequiredInterfaceListCompartment" element="_jhjysIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_jhv__YOxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_jhv__oOxEdmyd--cXlrqyQ" visible="false" type="ProvidedInterfaceListCompartment" element="_jhjysIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_jhv__4OxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_jhwAAIOxEdmyd--cXlrqyQ" visible="false" type="StructureCompartment" element="_jhjysIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_jhwAAYOxEdmyd--cXlrqyQ"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLComponentStyle" xmi:id="_jhv_8YOxEdmyd--cXlrqyQ" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jhv_8oOxEdmyd--cXlrqyQ" x="15713" y="9631"/>
-      </children>
-      <children xmi:id="_kdDxoIOxEdmyd--cXlrqyQ" sourceEdges="_mJKuIIOxEdmyd--cXlrqyQ" element="_kc3kYIOxEdmyd--cXlrqyQ">
-        <children xmi:id="_kdDxo4OxEdmyd--cXlrqyQ" type="Stereotype" element="_kc3kYIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_kdDxpIOxEdmyd--cXlrqyQ" type="Kind" element="_kc3kYIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_kdDxpYOxEdmyd--cXlrqyQ" type="Name" element="_kc3kYIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_kdDxpoOxEdmyd--cXlrqyQ" visible="false" type="AttributeCompartment" element="_kc3kYIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kdDxp4OxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_kdDxqIOxEdmyd--cXlrqyQ" visible="false" type="OperationCompartment" element="_kc3kYIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kdDxqYOxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_kdDxqoOxEdmyd--cXlrqyQ" visible="false" type="RealizationListCompartment" element="_kc3kYIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kdDxq4OxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_kdDxrIOxEdmyd--cXlrqyQ" visible="false" type="RequiredInterfaceListCompartment" element="_kc3kYIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kdDxrYOxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_kdDxroOxEdmyd--cXlrqyQ" visible="false" type="ProvidedInterfaceListCompartment" element="_kc3kYIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_kdDxr4OxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_kdDxsIOxEdmyd--cXlrqyQ" visible="false" type="StructureCompartment" element="_kc3kYIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_kdDxsYOxEdmyd--cXlrqyQ"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLComponentStyle" xmi:id="_kdDxoYOxEdmyd--cXlrqyQ" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_kdDxooOxEdmyd--cXlrqyQ" x="14972" y="12408"/>
-      </children>
-      <children xmi:id="_mor7sIOxEdmyd--cXlrqyQ" targetEdges="_LdKwIIOyEdmyd--cXlrqyQ" element="_mol1EIOxEdmyd--cXlrqyQ">
-        <children xmi:id="_mor7s4OxEdmyd--cXlrqyQ" type="Stereotype" element="_mol1EIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_mor7tIOxEdmyd--cXlrqyQ" type="Kind" element="_mol1EIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_mor7tYOxEdmyd--cXlrqyQ" type="Name" element="_mol1EIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_mor7toOxEdmyd--cXlrqyQ" visible="false" type="AttributeCompartment" element="_mol1EIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_mor7t4OxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_mor7uIOxEdmyd--cXlrqyQ" visible="false" type="OperationCompartment" element="_mol1EIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_mor7uYOxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_mor7uoOxEdmyd--cXlrqyQ" visible="false" type="RealizationListCompartment" element="_mol1EIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_mor7u4OxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_moyCUIOxEdmyd--cXlrqyQ" visible="false" type="RequiredInterfaceListCompartment" element="_mol1EIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_moyCUYOxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_moyCUoOxEdmyd--cXlrqyQ" visible="false" type="ProvidedInterfaceListCompartment" element="_mol1EIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_moyCU4OxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_moyCVIOxEdmyd--cXlrqyQ" visible="false" type="StructureCompartment" element="_mol1EIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_moyCVYOxEdmyd--cXlrqyQ"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLComponentStyle" xmi:id="_mor7sYOxEdmyd--cXlrqyQ" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mor7soOxEdmyd--cXlrqyQ" x="14839" y="6762"/>
-      </children>
-      <children xmi:id="_4TvoMIOxEdmyd--cXlrqyQ" sourceEdges="_AbrYoIOyEdmyd--cXlrqyQ _DeykUIOyEdmyd--cXlrqyQ _Jsqb0IOyEdmyd--cXlrqyQ _LdKwIIOyEdmyd--cXlrqyQ _IVOVgIO3Edmyd--cXlrqyQ" element="_4TXNsIOxEdmyd--cXlrqyQ">
-        <children xmi:id="_4TvoM4OxEdmyd--cXlrqyQ" type="Stereotype" element="_4TXNsIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_4TvoNIOxEdmyd--cXlrqyQ" type="Kind" element="_4TXNsIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_4TvoNYOxEdmyd--cXlrqyQ" type="Name" element="_4TXNsIOxEdmyd--cXlrqyQ"/>
-        <children xmi:id="_4TvoNoOxEdmyd--cXlrqyQ" type="AttributeCompartment" element="_4TXNsIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_4TvoN4OxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_4TvoOIOxEdmyd--cXlrqyQ" visible="false" type="OperationCompartment" element="_4TXNsIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_4TvoOYOxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_4TvoOoOxEdmyd--cXlrqyQ" visible="false" type="RealizationListCompartment" element="_4TXNsIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_4TvoO4OxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_4TvoPIOxEdmyd--cXlrqyQ" visible="false" type="RequiredInterfaceListCompartment" element="_4TXNsIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_4TvoPYOxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_4TvoPoOxEdmyd--cXlrqyQ" visible="false" type="ProvidedInterfaceListCompartment" element="_4TXNsIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_4TvoP4OxEdmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_4T1u0IOxEdmyd--cXlrqyQ" visible="false" type="StructureCompartment" element="_4TXNsIOxEdmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_4T1u0YOxEdmyd--cXlrqyQ"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLComponentStyle" xmi:id="_4TvoMYOxEdmyd--cXlrqyQ" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4TvoMoOxEdmyd--cXlrqyQ" x="7923" y="8983" width="4921" height="3256"/>
-      </children>
-      <children xmi:id="_DnN1oIO0Edmyd--cXlrqyQ" type="rectangle">
-        <children xmi:id="_DnN1o4O0Edmyd--cXlrqyQ" type="DiagramName"/>
-        <children xmi:id="_DnN1pIO0Edmyd--cXlrqyQ" type="Description"/>
-        <styles xmi:type="notation:ShapeStyle" xmi:id="_DnN1oYO0Edmyd--cXlrqyQ" bold="true" description="Optional" fillColor="13369343" lineColor="6737151"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_DnN1ooO0Edmyd--cXlrqyQ" x="18126" y="14946" width="2247" height="635"/>
-      </children>
-      <children xmi:id="_d429cIO0Edmyd--cXlrqyQ" type="rectangle">
-        <children xmi:id="_d49EEoO0Edmyd--cXlrqyQ" type="DiagramName"/>
-        <children xmi:id="_d49EE4O0Edmyd--cXlrqyQ" type="Description"/>
-        <styles xmi:type="notation:ShapeStyle" xmi:id="_d49EEIO0Edmyd--cXlrqyQ" bold="true" description="Required" fillColor="13420443" lineColor="6737151"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_d49EEYO0Edmyd--cXlrqyQ" x="18126" y="15900" width="2222" height="635"/>
-      </children>
-      <children xmi:id="_hzkqEIO1Edmyd--cXlrqyQ" type="rectangle">
-        <children xmi:id="_hzkqE4O1Edmyd--cXlrqyQ" type="DiagramName"/>
-        <children xmi:id="_hzkqFIO1Edmyd--cXlrqyQ" type="Description"/>
-        <styles xmi:type="notation:ShapeStyle" xmi:id="_hzkqEYO1Edmyd--cXlrqyQ" fillColor="13420443" lineColor="6737151"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_hzkqEoO1Edmyd--cXlrqyQ" x="7314" y="9858" width="634" height="317"/>
-      </children>
-      <children xmi:id="_uNsBYIO1Edmyd--cXlrqyQ" type="rectangle">
-        <children xmi:id="_uNsBY4O1Edmyd--cXlrqyQ" type="DiagramName"/>
-        <children xmi:id="_uNsBZIO1Edmyd--cXlrqyQ" type="Description"/>
-        <styles xmi:type="notation:ShapeStyle" xmi:id="_uNsBYYO1Edmyd--cXlrqyQ" fillColor="13420443" lineColor="6737151"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_uNsBYoO1Edmyd--cXlrqyQ" x="7314" y="10812" width="635" height="317"/>
-      </children>
-      <children xmi:id="_1rTpgIO1Edmyd--cXlrqyQ" element="_1rBVoIO1Edmyd--cXlrqyQ">
-        <children xmi:id="_1rTpg4O1Edmyd--cXlrqyQ" type="CommentBody" element="_1rBVoIO1Edmyd--cXlrqyQ"/>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_1rTpgYO1Edmyd--cXlrqyQ" fillColor="16763850" lineColor="16744576" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_1rTpgoO1Edmyd--cXlrqyQ" x="636" y="14946" width="6376" height="2565"/>
-      </children>
-      <children xmi:id="_2N_DUIO2Edmyd--cXlrqyQ" targetEdges="_IVOVgIO3Edmyd--cXlrqyQ" element="_2NsvcIO2Edmyd--cXlrqyQ">
-        <children xmi:id="_2N_DU4O2Edmyd--cXlrqyQ" type="Stereotype" element="_2NsvcIO2Edmyd--cXlrqyQ"/>
-        <children xmi:id="_2N_DVIO2Edmyd--cXlrqyQ" type="Kind" element="_2NsvcIO2Edmyd--cXlrqyQ"/>
-        <children xmi:id="_2N_DVYO2Edmyd--cXlrqyQ" type="Name" element="_2NsvcIO2Edmyd--cXlrqyQ"/>
-        <children xmi:id="_2N_DVoO2Edmyd--cXlrqyQ" visible="false" type="AttributeCompartment" element="_2NsvcIO2Edmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_2N_DV4O2Edmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_2N_DWIO2Edmyd--cXlrqyQ" visible="false" type="OperationCompartment" element="_2NsvcIO2Edmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_2N_DWYO2Edmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_2N_DWoO2Edmyd--cXlrqyQ" visible="false" type="RealizationListCompartment" element="_2NsvcIO2Edmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_2N_DW4O2Edmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_2N_DXIO2Edmyd--cXlrqyQ" visible="false" type="RequiredInterfaceListCompartment" element="_2NsvcIO2Edmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_2N_DXYO2Edmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_2N_DXoO2Edmyd--cXlrqyQ" visible="false" type="ProvidedInterfaceListCompartment" element="_2NsvcIO2Edmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_2N_DX4O2Edmyd--cXlrqyQ"/>
-        </children>
-        <children xmi:id="_2N_DYIO2Edmyd--cXlrqyQ" visible="false" type="StructureCompartment" element="_2NsvcIO2Edmyd--cXlrqyQ">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_2N_DYYO2Edmyd--cXlrqyQ"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLComponentStyle" xmi:id="_2N_DUYO2Edmyd--cXlrqyQ" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2N_DUoO2Edmyd--cXlrqyQ" x="7725" y="13228"/>
-      </children>
-      <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_0Lw7oYOwEdmyd--cXlrqyQ"/>
-      <edges xmi:id="_gS43QIOxEdmyd--cXlrqyQ" element="_gSmjYIOxEdmyd--cXlrqyQ" source="_X4hTAIOxEdmyd--cXlrqyQ" target="_b7Ja8IOxEdmyd--cXlrqyQ">
-        <children xmi:id="_gS43Q4OxEdmyd--cXlrqyQ" type="NameLabel" element="_gSmjYIOxEdmyd--cXlrqyQ">
-          <children xmi:id="_gS43RYOxEdmyd--cXlrqyQ" type="Stereotype" element="_gSmjYIOxEdmyd--cXlrqyQ"/>
-          <children xmi:id="_gS43RoOxEdmyd--cXlrqyQ" type="Name" element="_gSmjYIOxEdmyd--cXlrqyQ"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_gS43RIOxEdmyd--cXlrqyQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_gS43QYOxEdmyd--cXlrqyQ" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gS43QoOxEdmyd--cXlrqyQ" points="[2, -31, 5, 90]$[62, -95, 65, 26]"/>
-      </edges>
-      <edges xmi:id="_mJKuIIOxEdmyd--cXlrqyQ" element="_mI-g4IOxEdmyd--cXlrqyQ" source="_kdDxoIOxEdmyd--cXlrqyQ" target="_jhv_8IOxEdmyd--cXlrqyQ">
-        <children xmi:id="_mJKuI4OxEdmyd--cXlrqyQ" type="NameLabel" element="_mI-g4IOxEdmyd--cXlrqyQ">
-          <children xmi:id="_mJKuJYOxEdmyd--cXlrqyQ" type="Stereotype" element="_mI-g4IOxEdmyd--cXlrqyQ"/>
-          <children xmi:id="_mJQ0wIOxEdmyd--cXlrqyQ" type="Name" element="_mI-g4IOxEdmyd--cXlrqyQ"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_mJKuJIOxEdmyd--cXlrqyQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_mJKuIYOxEdmyd--cXlrqyQ" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_mJKuIoOxEdmyd--cXlrqyQ" points="[-42, -820, 11, 2249]$[-42, -2249, 11, 820]"/>
-      </edges>
-      <edges xmi:id="_AbrYoIOyEdmyd--cXlrqyQ" element="_AbfLYIOyEdmyd--cXlrqyQ" source="_4TvoMIOxEdmyd--cXlrqyQ" target="_b7Ja8IOxEdmyd--cXlrqyQ">
-        <children xmi:id="_AbrYo4OyEdmyd--cXlrqyQ" type="KindLabel" element="_AbfLYIOyEdmyd--cXlrqyQ">
-          <children xmi:id="_AbrYpYOyEdmyd--cXlrqyQ" type="Stereotype" element="_AbfLYIOyEdmyd--cXlrqyQ"/>
-          <children xmi:id="_AbrYp4OyEdmyd--cXlrqyQ" type="Kind" element="_AbfLYIOyEdmyd--cXlrqyQ"/>
-          <children xmi:id="_AbrYpoOyEdmyd--cXlrqyQ" type="Name" element="_AbfLYIOyEdmyd--cXlrqyQ"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_AbrYpIOyEdmyd--cXlrqyQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_AbrYoYOyEdmyd--cXlrqyQ" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_AbrYooOyEdmyd--cXlrqyQ" points="[-2434, -1085, 4604, 2011]$[-2857, -1085, 4181, 2011]$[-2857, -2963, 4181, 133]$[-5318, -2963, 1720, 133]"/>
-      </edges>
-      <edges xmi:id="_DeykUIOyEdmyd--cXlrqyQ" element="_DeUDMIOyEdmyd--cXlrqyQ" source="_4TvoMIOxEdmyd--cXlrqyQ" target="_-Cw18IOwEdmyd--cXlrqyQ">
-        <children xmi:id="_DeykU4OyEdmyd--cXlrqyQ" type="KindLabel" element="_DeUDMIOyEdmyd--cXlrqyQ">
-          <children xmi:id="_DeykVYOyEdmyd--cXlrqyQ" type="Stereotype" element="_DeUDMIOyEdmyd--cXlrqyQ"/>
-          <children xmi:id="_DeykV4OyEdmyd--cXlrqyQ" type="Kind" element="_DeUDMIOyEdmyd--cXlrqyQ"/>
-          <children xmi:id="_DeykVoOyEdmyd--cXlrqyQ" type="Name" element="_DeUDMIOyEdmyd--cXlrqyQ"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_DeykVIOyEdmyd--cXlrqyQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_DeykUYOyEdmyd--cXlrqyQ" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_DeykUoOyEdmyd--cXlrqyQ" points="[-2434, 1032, 4524, -1270]$[-2857, 1032, 4101, -1270]$[-2857, 2275, 4101, -27]$[-4630, 2275, 2328, -27]"/>
-      </edges>
-      <edges xmi:id="_Jsqb0IOyEdmyd--cXlrqyQ" element="_JsSBUIOyEdmyd--cXlrqyQ" source="_4TvoMIOxEdmyd--cXlrqyQ" target="_jhv_8IOxEdmyd--cXlrqyQ">
-        <children xmi:id="_Jsqb04OyEdmyd--cXlrqyQ" type="KindLabel" element="_JsSBUIOyEdmyd--cXlrqyQ">
-          <children xmi:id="_Jsqb1YOyEdmyd--cXlrqyQ" type="Stereotype" element="_JsSBUIOyEdmyd--cXlrqyQ"/>
-          <children xmi:id="_Jsqb14OyEdmyd--cXlrqyQ" type="Kind" element="_JsSBUIOyEdmyd--cXlrqyQ"/>
-          <children xmi:id="_Jsqb1oOyEdmyd--cXlrqyQ" type="Name" element="_JsSBUIOyEdmyd--cXlrqyQ"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_Jsqb1IOyEdmyd--cXlrqyQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_Jsqb0YOyEdmyd--cXlrqyQ" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Jsqb0oOyEdmyd--cXlrqyQ" points="[2143, 80, -4921, 185]$[5371, 80, -1693, 185]"/>
-      </edges>
-      <edges xmi:id="_LdKwIIOyEdmyd--cXlrqyQ" element="_Lc-i4IOyEdmyd--cXlrqyQ" source="_4TvoMIOxEdmyd--cXlrqyQ" target="_mor7sIOxEdmyd--cXlrqyQ">
-        <children xmi:id="_LdKwI4OyEdmyd--cXlrqyQ" type="KindLabel" element="_Lc-i4IOyEdmyd--cXlrqyQ">
-          <children xmi:id="_LdKwJYOyEdmyd--cXlrqyQ" type="Stereotype" element="_Lc-i4IOyEdmyd--cXlrqyQ"/>
-          <children xmi:id="_LdKwJ4OyEdmyd--cXlrqyQ" type="Kind" element="_Lc-i4IOyEdmyd--cXlrqyQ"/>
-          <children xmi:id="_LdKwJoOyEdmyd--cXlrqyQ" type="Name" element="_Lc-i4IOyEdmyd--cXlrqyQ"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_LdKwJIOyEdmyd--cXlrqyQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_LdKwIYOyEdmyd--cXlrqyQ" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_LdKwIoOyEdmyd--cXlrqyQ" points="[2143, -502, -4895, 2461]$[3122, -502, -3916, 2461]$[3122, -2989, -3916, -26]$[4498, -2989, -2540, -26]"/>
-      </edges>
-      <edges xmi:id="_IVOVgIO3Edmyd--cXlrqyQ" element="_ITURAIO3Edmyd--cXlrqyQ" source="_4TvoMIOxEdmyd--cXlrqyQ" target="_2N_DUIO2Edmyd--cXlrqyQ">
-        <children xmi:id="_IVOVg4O3Edmyd--cXlrqyQ" type="KindLabel" element="_ITURAIO3Edmyd--cXlrqyQ">
-          <children xmi:id="_IVOVhYO3Edmyd--cXlrqyQ" type="Stereotype" element="_ITURAIO3Edmyd--cXlrqyQ"/>
-          <children xmi:id="_IVOVh4O3Edmyd--cXlrqyQ" type="Kind" element="_ITURAIO3Edmyd--cXlrqyQ"/>
-          <children xmi:id="_IVOVhoO3Edmyd--cXlrqyQ" type="Name" element="_ITURAIO3Edmyd--cXlrqyQ"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_IVOVhIO3Edmyd--cXlrqyQ" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_IVOVgYO3Edmyd--cXlrqyQ" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_IVOVgoO3Edmyd--cXlrqyQ" points="[-15, 61, -17, -57]$[-100, 120, -102, 2]"/>
-      </edges>
-    </contents>
-    <contents xmi:type="notation:Diagram" xmi:id="_yKPk8PyzEdm185zvv0WM_Q" type="Class" element="_SWX3UH5GEdm797szikHjoQ" name="Drag-n-Drop">
-      <children xmi:id="_FS5Q0Py0Edm185zvv0WM_Q" sourceEdges="_GBT2APy0Edm185zvv0WM_Q _GBT2CPy0Edm185zvv0WM_Q _GBZ8oPy0Edm185zvv0WM_Q _GBZ8qPy0Edm185zvv0WM_Q">
-        <children xmi:id="_FXGbYPy0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_FXGbYfy0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_FXGbYvy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FXGbY_y0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FXGbZPy0Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FXGbZfy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FXGbZvy0Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FXGbZ_y0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FXGbaPy0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FXGbafy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FXMiAPy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_FXMiAfy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_FS5Q0fy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_FS5Q0vy0Edm185zvv0WM_Q" x="1272" y="7314"/>
-      </children>
-      <children xmi:id="_FYuMAPy0Edm185zvv0WM_Q" sourceEdges="_GBZ8sPy0Edm185zvv0WM_Q" targetEdges="_GBZ8uPy0Edm185zvv0WM_Q _GBsQgPy0Edm185zvv0WM_Q">
-        <children xmi:id="_FYuMA_y0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_FYuMBPy0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_FYuMBfy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FYuMBvy0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FYuMB_y0Edm185zvv0WM_Q" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FYuMCPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FYuMCfy0Edm185zvv0WM_Q" visible="false" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FYuMCvy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FYuMC_y0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FYuMDPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FYuMDfy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_FYuMDvy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_FYuMAfy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_FYuMAvy0Edm185zvv0WM_Q" x="1908" y="16218"/>
-      </children>
-      <children xmi:id="_FZ9iIPy0Edm185zvv0WM_Q" sourceEdges="_GBZ8uPy0Edm185zvv0WM_Q _GBgDQPy0Edm185zvv0WM_Q _GBgDSPy0Edm185zvv0WM_Q _GBgDUPy0Edm185zvv0WM_Q _GBgDWPy0Edm185zvv0WM_Q _GBmJ4_y0Edm185zvv0WM_Q" targetEdges="_GCErEfy0Edm185zvv0WM_Q _GCErGfy0Edm185zvv0WM_Q">
-        <children xmi:id="_FZ9iI_y0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_FZ9iJPy0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_FZ9iJfy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FZ9iJvy0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FZ9iJ_y0Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FZ9iKPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FZ9iKfy0Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FZ9iKvy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FZ9iK_y0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FZ9iLPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FZ9iLfy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_FZ9iLvy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_FZ9iIfy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_FZ9iIvy0Edm185zvv0WM_Q" x="13038" y="7314"/>
-      </children>
-      <children xmi:id="_FcKhkPy0Edm185zvv0WM_Q" sourceEdges="_GBmJ7vy0Edm185zvv0WM_Q _GBmJ9vy0Edm185zvv0WM_Q" targetEdges="_GBZ8sPy0Edm185zvv0WM_Q _GBgDSPy0Edm185zvv0WM_Q _GBsQmPy0Edm185zvv0WM_Q _GB4dwPy0Edm185zvv0WM_Q">
-        <children xmi:id="_FcKhk_y0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_FcKhlPy0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_FcKhlfy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FcKhlvy0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FcKhl_y0Edm185zvv0WM_Q" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FcKhmPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FcKhmfy0Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FcKhmvy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FcQoMPy0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FcQoMfy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FcQoMvy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_FcQoM_y0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_FcKhkfy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_FcKhkvy0Edm185zvv0WM_Q" x="32754" y="33072"/>
-      </children>
-      <children xmi:id="_Fe1bEPy0Edm185zvv0WM_Q" sourceEdges="_GBmJ_vy0Edm185zvv0WM_Q" targetEdges="_GByXNfy0Edm185zvv0WM_Q _GB4d2Py0Edm185zvv0WM_Q _GB-kcvy0Edm185zvv0WM_Q">
-        <children xmi:id="_Fe1bE_y0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_Fe1bFPy0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_Fe7hsPy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Fe7hsfy0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Fe7hsvy0Edm185zvv0WM_Q" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_Fe7hs_y0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Fe7htPy0Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_Fe7htfy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Fe7htvy0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_Fe7ht_y0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Fe7huPy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_Fe7hufy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_Fe1bEfy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Fe1bEvy0Edm185zvv0WM_Q" x="32754" y="29892"/>
-      </children>
-      <children xmi:id="_FfgJcPy0Edm185zvv0WM_Q" sourceEdges="_GBsQgPy0Edm185zvv0WM_Q _GBsQiPy0Edm185zvv0WM_Q _GBsQkPy0Edm185zvv0WM_Q _GBsQmPy0Edm185zvv0WM_Q _GBsQoPy0Edm185zvv0WM_Q _GByXIvy0Edm185zvv0WM_Q _GByXKvy0Edm185zvv0WM_Q">
-        <children xmi:id="_FfgJc_y0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_FfgJdPy0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_FfgJdfy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FfgJdvy0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FfgJd_y0Edm185zvv0WM_Q" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FfgJePy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FfmQEPy0Edm185zvv0WM_Q" visible="false" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FfmQEfy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FfmQEvy0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FfmQE_y0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FfmQFPy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_FfmQFfy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_FfgJcfy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_FfgJcvy0Edm185zvv0WM_Q" x="9858" y="16218"/>
-      </children>
-      <children xmi:id="_Ff-qkPy0Edm185zvv0WM_Q" targetEdges="_GBZ8qPy0Edm185zvv0WM_Q">
-        <children xmi:id="_Ff-qk_y0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=FileTransferDragAdapter[jcu^name=FileTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_Ff-qlPy0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_Ff-qlfy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=FileTransferDragAdapter[jcu^name=FileTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Ff-qlvy0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=FileTransferDragAdapter[jcu^name=FileTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Ff-ql_y0Edm185zvv0WM_Q" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_Ff-qmPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=FileTransferDragAdapter[jcu^name=FileTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Ff-qmfy0Edm185zvv0WM_Q" visible="false" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_Ff-qmvy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=FileTransferDragAdapter[jcu^name=FileTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Ff-qm_y0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_Ff-qnPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=FileTransferDragAdapter[jcu^name=FileTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Ff-qnfy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_Ff-qnvy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=FileTransferDragAdapter[jcu^name=FileTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_Ff-qkfy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=FileTransferDragAdapter[jcu^name=FileTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Ff-qkvy0Edm185zvv0WM_Q" y="13674"/>
-      </children>
-      <children xmi:id="_Fhsh0Py0Edm185zvv0WM_Q" targetEdges="_GBT2CPy0Edm185zvv0WM_Q">
-        <children xmi:id="_Fhsh0_y0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ResourceTransferDragAdapter[jcu^name=ResourceTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_Fhsh1Py0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_Fhsh1fy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ResourceTransferDragAdapter[jcu^name=ResourceTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Fhsh1vy0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ResourceTransferDragAdapter[jcu^name=ResourceTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Fhsh1_y0Edm185zvv0WM_Q" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_Fhsh2Py0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ResourceTransferDragAdapter[jcu^name=ResourceTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Fhsh2fy0Edm185zvv0WM_Q" visible="false" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_Fhsh2vy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ResourceTransferDragAdapter[jcu^name=ResourceTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Fhsh2_y0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_Fhsh3Py0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ResourceTransferDragAdapter[jcu^name=ResourceTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Fhsh3fy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_Fhsh3vy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ResourceTransferDragAdapter[jcu^name=ResourceTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_Fhsh0fy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ResourceTransferDragAdapter[jcu^name=ResourceTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Fhsh0vy0Edm185zvv0WM_Q" x="5406" y="13674"/>
-      </children>
-      <children xmi:id="_FikEgPy0Edm185zvv0WM_Q" sourceEdges="_GByXNfy0Edm185zvv0WM_Q" targetEdges="_GBmJ7vy0Edm185zvv0WM_Q _GByXPfy0Edm185zvv0WM_Q">
-        <children xmi:id="_FikEg_y0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_FikEhPy0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_FikEhfy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FikEhvy0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FikEh_y0Edm185zvv0WM_Q" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FikEiPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FikEify0Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FikEivy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FikEi_y0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FikEjPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FikEjfy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_FikEjvy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_FikEgfy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_FikEgvy0Edm185zvv0WM_Q" x="33072" y="25440"/>
-      </children>
-      <children xmi:id="_FjtUAPy0Edm185zvv0WM_Q" sourceEdges="_GByXPfy0Edm185zvv0WM_Q _GB4dwPy0Edm185zvv0WM_Q _GB4dyPy0Edm185zvv0WM_Q _GB4d0Py0Edm185zvv0WM_Q _GB4d2Py0Edm185zvv0WM_Q" targetEdges="_GBmJ4_y0Edm185zvv0WM_Q _GByXIvy0Edm185zvv0WM_Q _GB4dyPy0Edm185zvv0WM_Q _GCErCfy0Edm185zvv0WM_Q">
-        <children xmi:id="_FjtUA_y0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_FjtUBPy0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_FjtUBfy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FjtUBvy0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FjtUB_y0Edm185zvv0WM_Q" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FjtUCPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FjtUCfy0Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FjtUCvy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FjtUC_y0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_FjtUDPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FjtUDfy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_FjtUDvy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_FjtUAfy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_FjtUAvy0Edm185zvv0WM_Q" x="24995" y="25418"/>
-      </children>
-      <children xmi:id="_FyglAPy0Edm185zvv0WM_Q" sourceEdges="_GB-kYPy0Edm185zvv0WM_Q _GB-kY_y0Edm185zvv0WM_Q _GB-kavy0Edm185zvv0WM_Q _GB-kcvy0Edm185zvv0WM_Q _GCErAfy0Edm185zvv0WM_Q _GCErCfy0Edm185zvv0WM_Q" targetEdges="_GBT2APy0Edm185zvv0WM_Q _GBgDWPy0Edm185zvv0WM_Q _GByXKvy0Edm185zvv0WM_Q">
-        <children xmi:id="_FymroPy0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_Fymrofy0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_Fymrovy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Fymro_y0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FymrpPy0Edm185zvv0WM_Q" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_Fymrpfy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Fymrpvy0Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_Fymrp_y0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_FymrqPy0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_Fymrqfy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_Fymrqvy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_Fymrq_y0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_FyglAfy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_FyglAvy0Edm185zvv0WM_Q" x="17808" y="25440"/>
-      </children>
-      <children xmi:id="_F5evsPy0Edm185zvv0WM_Q" sourceEdges="_GCErEfy0Edm185zvv0WM_Q" targetEdges="_GBgDQPy0Edm185zvv0WM_Q _GBmJ9vy0Edm185zvv0WM_Q _GBsQiPy0Edm185zvv0WM_Q _GB4d0Py0Edm185zvv0WM_Q">
-        <children xmi:id="_F5evs_y0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_F5evtPy0Edm185zvv0WM_Q" width="530" height="530"/>
-        </children>
-        <children xmi:id="_F5evtfy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_F5evtvy0Edm185zvv0WM_Q" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_F5evt_y0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_F5evuPy0Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_F5evufy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_F5evuvy0Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_F5evu_y0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_F5evvPy0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_F5evvfy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_F5evsfy0Edm185zvv0WM_Q" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_F5evsvy0Edm185zvv0WM_Q" x="33339" y="745"/>
-      </children>
-      <children xmi:id="_F5xDkfy0Edm185zvv0WM_Q" targetEdges="_GBsQoPy0Edm185zvv0WM_Q _GB-kYPy0Edm185zvv0WM_Q _GCErAfy0Edm185zvv0WM_Q">
-        <children xmi:id="_F5xDlPy0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_F5xDlfy0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_F5xDlvy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <children xmi:id="_F5xDl_y0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <children xmi:id="_F5xDmPy0Edm185zvv0WM_Q" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_F5xDmfy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <children xmi:id="_F5xDmvy0Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_F5xDm_y0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <children xmi:id="_F5xDnPy0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_F5xDnfy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <children xmi:id="_F5xDnvy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_F5xDn_y0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_F5xDkvy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_F5xDk_y0Edm185zvv0WM_Q" x="18126" y="33390"/>
-      </children>
-      <children xmi:id="_F6n_MPy0Edm185zvv0WM_Q" targetEdges="_GBZ8oPy0Edm185zvv0WM_Q _GBgDUPy0Edm185zvv0WM_Q _GBmJ_vy0Edm185zvv0WM_Q _GBsQkPy0Edm185zvv0WM_Q _GB-kY_y0Edm185zvv0WM_Q _GB-kavy0Edm185zvv0WM_Q">
-        <children xmi:id="_F6n_M_y0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_F6n_NPy0Edm185zvv0WM_Q" width="530" height="530"/>
-        </children>
-        <children xmi:id="_F6n_Nfy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_F6n_Nvy0Edm185zvv0WM_Q" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_F6n_N_y0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_F6n_OPy0Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_F6n_Ofy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_F6n_Ovy0Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_F6n_O_y0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_F6n_PPy0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_F6n_Pfy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_F6n_Mfy0Edm185zvv0WM_Q" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_F6n_Mvy0Edm185zvv0WM_Q" x="28251" y="745"/>
-      </children>
-      <children xmi:id="_F66TEPy0Edm185zvv0WM_Q" sourceEdges="_GCErGfy0Edm185zvv0WM_Q">
-        <children xmi:id="_F66TE_y0Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropActionDelegate[jcu^name=NavigatorDropActionDelegate.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_F66TFPy0Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_F66TFfy0Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropActionDelegate[jcu^name=NavigatorDropActionDelegate.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_F66TFvy0Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropActionDelegate[jcu^name=NavigatorDropActionDelegate.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_F66TF_y0Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_F66TGPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropActionDelegate[jcu^name=NavigatorDropActionDelegate.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_F66TGfy0Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_F66TGvy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropActionDelegate[jcu^name=NavigatorDropActionDelegate.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_F66TG_y0Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_F66THPy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropActionDelegate[jcu^name=NavigatorDropActionDelegate.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_F66THfy0Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_F66THvy0Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropActionDelegate[jcu^name=NavigatorDropActionDelegate.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_F66TEfy0Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorDropActionDelegate[jcu^name=NavigatorDropActionDelegate.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_F66TEvy0Edm185zvv0WM_Q" x="20670" y="636"/>
-      </children>
-      <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_yKPk8fyzEdm185zvv0WM_Q"/>
-      <edges xmi:id="_GBT2APy0Edm185zvv0WM_Q" source="_FS5Q0Py0Edm185zvv0WM_Q" target="_FyglAPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBT2A_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBT2Bfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBT2B_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBT2Bvy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBT2BPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBT2Afy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBT2Avy0Edm185zvv0WM_Q" points="[-14, 3691, -8560, -5491]$[8532, 5279, -14, -3903]"/>
-      </edges>
-      <edges xmi:id="_GBT2CPy0Edm185zvv0WM_Q" source="_FS5Q0Py0Edm185zvv0WM_Q" target="_Fhsh0Py0Edm185zvv0WM_Q">
-        <children xmi:id="_GBT2C_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBT2Dfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ResourceTransferDragAdapter[jcu^name=ResourceTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBT2D_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ResourceTransferDragAdapter[jcu^name=ResourceTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBT2Dvy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ResourceTransferDragAdapter[jcu^name=ResourceTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ResourceTransferDragAdapter[jcu^name=ResourceTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBT2DPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBT2Cfy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ResourceTransferDragAdapter[jcu^name=ResourceTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBT2Cvy0Edm185zvv0WM_Q" points="[-14, 3691, 648, -5491]$[-675, 5279, -13, -3903]"/>
-      </edges>
-      <edges xmi:id="_GBZ8oPy0Edm185zvv0WM_Q" source="_FS5Q0Py0Edm185zvv0WM_Q" target="_F6n_MPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBZ8o_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBZ8pfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBZ8p_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBZ8pvy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBZ8pPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBZ8ofy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBZ8ovy0Edm185zvv0WM_Q" points="[27, -2407, -23680, 5504]$[27, -4630, -23680, 3281]$[23733, -4630, 26, 3281]$[23733, -6826, 26, 1085]"/>
-      </edges>
-      <edges xmi:id="_GBZ8qPy0Edm185zvv0WM_Q" source="_FS5Q0Py0Edm185zvv0WM_Q" target="_Ff-qkPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBZ8q_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBZ8rfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=FileTransferDragAdapter[jcu^name=FileTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBZ8r_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=FileTransferDragAdapter[jcu^name=FileTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBZ8rvy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=FileTransferDragAdapter[jcu^name=FileTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=FileTransferDragAdapter[jcu^name=FileTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBZ8rPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBZ8qfy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDragAdapter[jcu^name=CommonNavigatorDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=FileTransferDragAdapter[jcu^name=FileTransferDragAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBZ8qvy0Edm185zvv0WM_Q" points="[-14, 3691, 6640, -5491]$[-6655, 5279, -1, -3903]"/>
-      </edges>
-      <edges xmi:id="_GBZ8sPy0Edm185zvv0WM_Q" source="_FYuMAPy0Edm185zvv0WM_Q" target="_FcKhkPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBZ8s_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBZ8tfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBZ8t_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBZ8tvy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBZ8tPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBZ8sfy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBZ8svy0Edm185zvv0WM_Q" points="[27, 503, -30242, -18468]$[27, 4789, -30242, -14182]$[19976, 4789, -10293, -14182]$[19976, 19315, -10293, 344]$[27887, 19315, -2382, 344]"/>
-      </edges>
-      <edges xmi:id="_GBZ8uPy0Edm185zvv0WM_Q" source="_FZ9iIPy0Edm185zvv0WM_Q" target="_FYuMAPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBZ8u_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBZ8vfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBZ8v_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBZ8vvy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBZ8vPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBZ8ufy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBZ8uvy0Edm185zvv0WM_Q" points="[-14, 3691, -10756, -5491]$[10728, 5279, -14, -3903]"/>
-      </edges>
-      <edges xmi:id="_GBgDQPy0Edm185zvv0WM_Q" source="_FZ9iIPy0Edm185zvv0WM_Q" target="_F5evsPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBgDQ_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBgDRfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBgDR_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBgDRvy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBgDRPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBgDQfy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBgDQvy0Edm185zvv0WM_Q" points="[-14, 3691, -2673, -35084]$[-3665, 5279, -6324, -33496]$[-3665, 34410, -6324, -4365]$[2659, 35997, 0, -2778]"/>
-      </edges>
-      <edges xmi:id="_GBgDSPy0Edm185zvv0WM_Q" source="_FZ9iIPy0Edm185zvv0WM_Q" target="_FcKhkPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBgDS_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBgDTfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBgDT_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBgDTvy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBgDTPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBgDSfy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBgDSvy0Edm185zvv0WM_Q" points="[3096, 3335, -15928, -21351]$[8652, 3335, -10372, -21351]$[8652, 10478, -10372, -14208]$[15399, 10478, -3625, -14208]$[15399, 24686, -3625, 0]$[16616, 24686, -2408, 0]"/>
-      </edges>
-      <edges xmi:id="_GBgDUPy0Edm185zvv0WM_Q" source="_FZ9iIPy0Edm185zvv0WM_Q" target="_F6n_MPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBgDU_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBgDVfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBgDV_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBgDVvy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBgDVPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBgDUfy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBgDUvy0Edm185zvv0WM_Q" points="[2117, 3678, -11721, 12859]$[2117, 11563, -11721, 20744]$[15161, 11563, 1323, 20744]$[15161, -8096, 1323, 1085]"/>
-      </edges>
-      <edges xmi:id="_GBgDWPy0Edm185zvv0WM_Q" source="_FZ9iIPy0Edm185zvv0WM_Q" target="_FyglAPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBgDW_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBmJ4Py0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBmJ4vy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBmJ4fy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBgDXPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBgDWfy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBgDWvy0Edm185zvv0WM_Q" points="[-14, 3691, -14, -5491]$[-14, 5279, -14, -3903]"/>
-      </edges>
-      <edges xmi:id="_GBmJ4_y0Edm185zvv0WM_Q" source="_FZ9iIPy0Edm185zvv0WM_Q" target="_FjtUAPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBmJ5vy0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBmJ6Py0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBmJ6vy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBmJ6fy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBmJ5_y0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBmJ5Py0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBmJ5fy0Edm185zvv0WM_Q" points="[-14, 3691, -9036, -15519]$[3294, 5279, -5728, -13931]$[3294, 13085, -5728, -6125]$[9009, 14672, -13, -4538]"/>
-      </edges>
-      <edges xmi:id="_GBmJ7vy0Edm185zvv0WM_Q" source="_FcKhkPy0Edm185zvv0WM_Q" target="_FikEgPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBmJ8fy0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBmJ8_y0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBmJ9fy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBmJ9Py0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBmJ8vy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBmJ7_y0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBmJ8Py0Edm185zvv0WM_Q" points="[-1, 4537, 5278, -4366]$[-5292, 6125, -13, -2778]"/>
-      </edges>
-      <edges xmi:id="_GBmJ9vy0Edm185zvv0WM_Q" source="_FcKhkPy0Edm185zvv0WM_Q" target="_F5evsPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBmJ-fy0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBmJ-_y0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBmJ_fy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBmJ_Py0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBmJ-vy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBmJ9_y0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBmJ-Py0Edm185zvv0WM_Q" points="[-1, 4537, 11641, -4366]$[-11642, 6125, 0, -2778]"/>
-      </edges>
-      <edges xmi:id="_GBmJ_vy0Edm185zvv0WM_Q" source="_Fe1bEPy0Edm185zvv0WM_Q" target="_F6n_MPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBmKAfy0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBmKA_y0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBmKBfy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBmKBPy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBmKAvy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBmJ__y0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBmKAPy0Edm185zvv0WM_Q" points="[-2090, 0, 2778, 28999]$[-5450, 0, -582, 28999]$[-5450, -27914, -582, 1085]"/>
-      </edges>
-      <edges xmi:id="_GBsQgPy0Edm185zvv0WM_Q" source="_FfgJcPy0Edm185zvv0WM_Q" target="_FYuMAPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBsQg_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBsQhfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBsQh_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBsQhvy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBsQhPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBsQgfy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorDropSelectionDialog[jcu^name=NavigatorDropSelectionDialog.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBsQgvy0Edm185zvv0WM_Q" points="[0, 3691, -4009, -5491]$[3995, 5279, -14, -3903]"/>
-      </edges>
-      <edges xmi:id="_GBsQiPy0Edm185zvv0WM_Q" source="_FfgJcPy0Edm185zvv0WM_Q" target="_F5evsPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBsQi_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBsQjfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBsQj_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBsQjvy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBsQjPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBsQify0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBsQivy0Edm185zvv0WM_Q" points="[26, -502, -23204, 14605]$[26, -10213, -23204, 4894]$[23283, -10213, 53, 4894]$[23283, -14234, 53, 873]"/>
-      </edges>
-      <edges xmi:id="_GBsQkPy0Edm185zvv0WM_Q" source="_FfgJcPy0Edm185zvv0WM_Q" target="_F6n_MPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBsQk_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBsQlfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBsQl_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBsQlvy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBsQlPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBsQkfy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBsQkvy0Edm185zvv0WM_Q" points="[1058, 503, -17066, 15399]$[1058, 8123, -17066, 23019]$[18600, 8123, 476, 23019]$[18600, -13811, 476, 1085]"/>
-      </edges>
-      <edges xmi:id="_GBsQmPy0Edm185zvv0WM_Q" source="_FfgJcPy0Edm185zvv0WM_Q" target="_FcKhkPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBsQm_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBsQnfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBsQn_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GBsQnvy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBsQnPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBsQmfy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBsQmvy0Edm185zvv0WM_Q" points="[26, 503, -23284, -18468]$[26, 19712, -23284, 741]$[20928, 19712, -2382, 741]"/>
-      </edges>
-      <edges xmi:id="_GBsQoPy0Edm185zvv0WM_Q" source="_FfgJcPy0Edm185zvv0WM_Q" target="_F5xDkfy0Edm185zvv0WM_Q">
-        <children xmi:id="_GBsQo_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GBsQpfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          </children>
-          <children xmi:id="_GByXIfy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          </children>
-          <children xmi:id="_GByXIPy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GBsQpPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GBsQofy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GBsQovy0Edm185zvv0WM_Q" points="[27, 1376, 6324, -16775]$[27, 20876, 6324, 2725]$[7938, 20876, 14235, 2725]$[7938, 18574, 14235, 423]$[-3466, 18574, 2831, 423]"/>
-      </edges>
-      <edges xmi:id="_GByXIvy0Edm185zvv0WM_Q" source="_FfgJcPy0Edm185zvv0WM_Q" target="_FjtUAPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GByXJfy0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GByXJ_y0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GByXKfy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GByXKPy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GByXJvy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GByXI_y0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GByXJPy0Edm185zvv0WM_Q" points="[0, 1376, -2249, -20161]$[0, 16987, -2249, -4550]"/>
-      </edges>
-      <edges xmi:id="_GByXKvy0Edm185zvv0WM_Q" source="_FfgJcPy0Edm185zvv0WM_Q" target="_FyglAPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GByXLfy0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GByXL_y0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GByXMfy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GByXMPy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GByXLvy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GByXK_y0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=PluginDropAction[jcu^name=PluginDropAction.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GByXLPy0Edm185zvv0WM_Q" points="[53, 1376, 6800, -7991]$[53, 6827, 6800, -2540]$[-6720, 6827, 27, -2540]$[-6720, 7620, 27, -1747]"/>
-      </edges>
-      <edges xmi:id="_GByXNfy0Edm185zvv0WM_Q" source="_FikEgPy0Edm185zvv0WM_Q" target="_Fe1bEPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GByXOPy0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GByXOvy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GByXPPy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GByXO_y0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GByXOfy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GByXNvy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GByXN_y0Edm185zvv0WM_Q" points="[-13, 2778, 7673, -3374]$[-7686, 4366, 0, -1786]"/>
-      </edges>
-      <edges xmi:id="_GByXPfy0Edm185zvv0WM_Q" source="_FjtUAPy0Edm185zvv0WM_Q" target="_FikEgPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GByXQPy0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GByXQvy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GByXRPy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GByXQ_y0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GByXQfy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GByXPvy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerCollectionDescriptor[jcu^name=SerializerCollectionDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GByXP_y0Edm185zvv0WM_Q" points="[-13, 4537, -13, -15028]$[-13, 16787, -13, -2778]"/>
-      </edges>
-      <edges xmi:id="_GB4dwPy0Edm185zvv0WM_Q" source="_FjtUAPy0Edm185zvv0WM_Q" target="_FcKhkPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GB4dw_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GB4dxfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GB4dx_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GB4dxvy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GB4dxPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GB4dwfy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=DropHandlerDescriptor[jcu^name=DropHandlerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GB4dwvy0Edm185zvv0WM_Q" points="[-13, 4537, -5292, -6125]$[5278, 6124, -1, -4538]"/>
-      </edges>
-      <edges xmi:id="_GB4dyPy0Edm185zvv0WM_Q" source="_FjtUAPy0Edm185zvv0WM_Q" target="_FjtUAPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GB4dy_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GB4dzfy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GB4dz_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GB4dzvy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GB4dzPy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GB4dyfy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GB4dyvy0Edm185zvv0WM_Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
-      </edges>
-      <edges xmi:id="_GB4d0Py0Edm185zvv0WM_Q" source="_FjtUAPy0Edm185zvv0WM_Q" target="_F5evsPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GB4d0_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GB4d1fy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GB4d1_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GB4d1vy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GB4d1Py0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GB4d0fy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GB4d0vy0Edm185zvv0WM_Q" points="[-13, 4537, 6350, -15028]$[-4617, 6124, 1746, -13441]$[-4617, 15200, 1746, -4365]$[-6363, 16787, 0, -2778]"/>
-      </edges>
-      <edges xmi:id="_GB4d2Py0Edm185zvv0WM_Q" source="_FjtUAPy0Edm185zvv0WM_Q" target="_Fe1bEPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GB4d2_y0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GB4d3fy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GB4d3_y0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GB4d3vy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GB4d3Py0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GB4d2fy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GB4d2vy0Edm185zvv0WM_Q" points="[1614, 3466, -5371, 1534]$[1614, 3916, -5371, 1984]$[6297, 3916, -688, 1984]$[6297, 2858, -688, 926]"/>
-      </edges>
-      <edges xmi:id="_GB-kYPy0Edm185zvv0WM_Q" type="OwnedElement" source="_FyglAPy0Edm185zvv0WM_Q" target="_F5xDkfy0Edm185zvv0WM_Q">
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GB-kYfy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GB-kYvy0Edm185zvv0WM_Q" points="[-14, 3902, -477, -6126]$[462, 5490, -1, -4538]"/>
-      </edges>
-      <edges xmi:id="_GB-kY_y0Edm185zvv0WM_Q" source="_FyglAPy0Edm185zvv0WM_Q" target="_F6n_MPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GB-kZvy0Edm185zvv0WM_Q" visible="false" type="NameLabel">
-          <children xmi:id="_GB-kaPy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Implementation" href="vizref:///#jimpl^vcore.target=uml2.Implementation[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GB-kafy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Implementation" href="vizref:///#jimpl^vcore.target=uml2.Implementation[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Implementation" href="vizref:///#jimpl^vcore.target=uml2.Implementation[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GB-kZ_y0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GB-kZPy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Implementation" href="vizref:///#jimpl^vcore.target=uml2.Implementation[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GB-kZfy0Edm185zvv0WM_Q" points="[-14, 3902, 4921, -36301]$[-4935, 5490, 0, -34713]$[-4935, 39118, 0, -1085]"/>
-      </edges>
-      <edges xmi:id="_GB-kavy0Edm185zvv0WM_Q" source="_FyglAPy0Edm185zvv0WM_Q" target="_F6n_MPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GB-kbfy0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GB-kb_y0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GB-kcfy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GB-kcPy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GB-kbvy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GB-ka_y0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ISerializer[jcu^name=ISerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GB-kbPy0Edm185zvv0WM_Q" points="[2778, 0, -6588, 25189]$[10239, 0, 873, 25189]$[10239, -24104, 873, 1085]"/>
-      </edges>
-      <edges xmi:id="_GB-kcvy0Edm185zvv0WM_Q" source="_FyglAPy0Edm185zvv0WM_Q" target="_Fe1bEPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GB-kdfy0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GB-kd_y0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GCErAPy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GB-kePy0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GB-kdvy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GB-kc_y0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=SerializerDescriptor[jcu^name=SerializerDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GB-kdPy0Edm185zvv0WM_Q" points="[2302, 1561, -11932, -2249]$[2302, 13176, -11932, 9366]$[4894, 13176, -9340, 9366]$[4894, 5609, -9340, 1799]$[14287, 5609, 53, 1799]$[14287, 4736, 53, 926]"/>
-      </edges>
-      <edges xmi:id="_GCErAfy0Edm185zvv0WM_Q" source="_FyglAPy0Edm185zvv0WM_Q" target="_F5xDkfy0Edm185zvv0WM_Q">
-        <children xmi:id="_GCErBPy0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GCErBvy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          </children>
-          <children xmi:id="_GCErCPy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          </children>
-          <children xmi:id="_GCErB_y0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GCErBfy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GCErAvy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorSerializedSelection[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GCErA_y0Edm185zvv0WM_Q" points="[-14, 3902, -477, -6126]$[462, 5490, -1, -4538]"/>
-      </edges>
-      <edges xmi:id="_GCErCfy0Edm185zvv0WM_Q" source="_FyglAPy0Edm185zvv0WM_Q" target="_FjtUAPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GCErDPy0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GCErDvy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GCErEPy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GCErD_y0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GCErDfy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GCErCvy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorSelectionSerializer[jcu^name=NavigatorSelectionSerializer.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonDropHandlerService[jcu^name=CommonDropHandlerService.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GCErC_y0Edm185zvv0WM_Q" points="[-14, 3902, -9036, -6126]$[9009, 5490, -13, -4538]"/>
-      </edges>
-      <edges xmi:id="_GCErEfy0Edm185zvv0WM_Q" source="_F5evsPy0Edm185zvv0WM_Q" target="_FZ9iIPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GCErFPy0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GCErFvy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GCErGPy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GCErF_y0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GCErFfy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GCErEvy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=IDropValidator[jcu^name=IDropValidator.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GCErE_y0Edm185zvv0WM_Q" points="[0, -2778, 2659, 35997]$[-5901, -4365, -3242, 34410]$[-5901, -33496, -3242, 5279]$[-2673, -35084, -14, 3691]"/>
-      </edges>
-      <edges xmi:id="_GCErGfy0Edm185zvv0WM_Q" source="_F66TEPy0Edm185zvv0WM_Q" target="_FZ9iIPy0Edm185zvv0WM_Q">
-        <children xmi:id="_GCErHPy0Edm185zvv0WM_Q" visible="false" type="KindLabel">
-          <children xmi:id="_GCErHvy0Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorDropActionDelegate[jcu^name=NavigatorDropActionDelegate.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GCErIPy0Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorDropActionDelegate[jcu^name=NavigatorDropActionDelegate.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_GCErH_y0Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorDropActionDelegate[jcu^name=NavigatorDropActionDelegate.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorDropActionDelegate[jcu^name=NavigatorDropActionDelegate.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_GCErHfy0Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_GCErGvy0Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=NavigatorDropActionDelegate[jcu^name=NavigatorDropActionDelegate.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=CommonNavigatorDropAdapter[jcu^name=CommonNavigatorDropAdapter.java[jpack^name=org.eclipse.ui.navigator.views.internal.dnd[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GCErG_y0Edm185zvv0WM_Q" points="[-13, 1997, -14, -5278]$[-13, 3584, -14, -3691]"/>
-      </edges>
-    </contents>
-    <contents xmi:type="notation:Diagram" xmi:id="_H10VAPy-Edm185zvv0WM_Q" type="Class" element="_SWX3UH5GEdm797szikHjoQ" name="Link-with-Editor">
-      <children xmi:id="_KDiw0Py-Edm185zvv0WM_Q" targetEdges="_NC76IPy-Edm185zvv0WM_Q">
-        <children xmi:id="_KDiw0_y-Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ILinkHelper[jcu^name=ILinkHelper.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_KDiw1Py-Edm185zvv0WM_Q" width="530" height="530"/>
-        </children>
-        <children xmi:id="_KDiw1fy-Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ILinkHelper[jcu^name=ILinkHelper.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_KDiw1vy-Edm185zvv0WM_Q" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ILinkHelper[jcu^name=ILinkHelper.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_KDiw1_y-Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ILinkHelper[jcu^name=ILinkHelper.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_KDiw2Py-Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_KDiw2fy-Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ILinkHelper[jcu^name=ILinkHelper.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_KDiw2vy-Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_KDiw2_y-Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ILinkHelper[jcu^name=ILinkHelper.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_KDiw3Py-Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_KDiw3fy-Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ILinkHelper[jcu^name=ILinkHelper.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_KDiw0fy-Edm185zvv0WM_Q" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ILinkHelper[jcu^name=ILinkHelper.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_KDiw0vy-Edm185zvv0WM_Q" x="5688" y="3439"/>
-      </children>
-      <children xmi:id="_M7rbkPy-Edm185zvv0WM_Q" sourceEdges="_NC1zgfy-Edm185zvv0WM_Q _NC76IPy-Edm185zvv0WM_Q _NC76KPy-Edm185zvv0WM_Q _NC76MPy-Edm185zvv0WM_Q" targetEdges="_NC76KPy-Edm185zvv0WM_Q">
-        <children xmi:id="_M7rbk_y-Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_M7rblPy-Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_M7rblfy-Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_M7rblvy-Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_M7rbl_y-Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_M7rbmPy-Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_M7rbmfy-Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_M7rbmvy-Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_M7rbm_y-Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_M7rbnPy-Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_M7rbnfy-Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_M7rbnvy-Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_M7rbkfy-Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M7rbkvy-Edm185zvv0WM_Q" x="10176" y="3180"/>
-      </children>
-      <children xmi:id="_M9fZcPy-Edm185zvv0WM_Q" targetEdges="_NC1zgfy-Edm185zvv0WM_Q _NC76MPy-Edm185zvv0WM_Q">
-        <children xmi:id="_M9fZc_y-Edm185zvv0WM_Q" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=Descriptor[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_M9fZdPy-Edm185zvv0WM_Q" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_M9fZdfy-Edm185zvv0WM_Q" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=Descriptor[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <children xmi:id="_M9fZdvy-Edm185zvv0WM_Q" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=Descriptor[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <children xmi:id="_M9fZd_y-Edm185zvv0WM_Q" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_M9fZePy-Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=Descriptor[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <children xmi:id="_M9fZefy-Edm185zvv0WM_Q" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_M9fZevy-Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=Descriptor[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <children xmi:id="_M9fZe_y-Edm185zvv0WM_Q" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_M9fZfPy-Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=Descriptor[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <children xmi:id="_M9fZffy-Edm185zvv0WM_Q" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_M9fZfvy-Edm185zvv0WM_Q"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=Descriptor[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_M9fZcfy-Edm185zvv0WM_Q" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=Descriptor[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_M9fZcvy-Edm185zvv0WM_Q" x="11561" y="10466"/>
-      </children>
-      <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_H10VAfy-Edm185zvv0WM_Q"/>
-      <edges xmi:id="_NC1zgfy-Edm185zvv0WM_Q" type="OwnedElement" source="_M7rbkPy-Edm185zvv0WM_Q" target="_M9fZcPy-Edm185zvv0WM_Q">
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_NC1zgvy-Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_NC1zg_y-Edm185zvv0WM_Q" points="[0, 2857, 0, -6125]$[0, 4444, 0, -4538]"/>
-      </edges>
-      <edges xmi:id="_NC76IPy-Edm185zvv0WM_Q" source="_M7rbkPy-Edm185zvv0WM_Q" target="_KDiw0Py-Edm185zvv0WM_Q">
-        <children xmi:id="_NC76I_y-Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_NC76Jfy-Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ILinkHelper[jcu^name=ILinkHelper.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_NC76J_y-Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ILinkHelper[jcu^name=ILinkHelper.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_NC76Jvy-Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ILinkHelper[jcu^name=ILinkHelper.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ILinkHelper[jcu^name=ILinkHelper.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_NC76JPy-Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_NC76Ify-Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ILinkHelper[jcu^name=ILinkHelper.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_NC76Ivy-Edm185zvv0WM_Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
-      </edges>
-      <edges xmi:id="_NC76KPy-Edm185zvv0WM_Q" source="_M7rbkPy-Edm185zvv0WM_Q" target="_M7rbkPy-Edm185zvv0WM_Q">
-        <children xmi:id="_NC76K_y-Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_NC76Lfy-Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_NC76L_y-Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_NC76Lvy-Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_NC76LPy-Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_NC76Kfy-Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_NC76Kvy-Edm185zvv0WM_Q" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
-      </edges>
-      <edges xmi:id="_NC76MPy-Edm185zvv0WM_Q" source="_M7rbkPy-Edm185zvv0WM_Q" target="_M9fZcPy-Edm185zvv0WM_Q">
-        <children xmi:id="_NC76M_y-Edm185zvv0WM_Q" type="KindLabel">
-          <children xmi:id="_NC76Nfy-Edm185zvv0WM_Q" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=Descriptor[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          </children>
-          <children xmi:id="_NC76N_y-Edm185zvv0WM_Q" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=Descriptor[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          </children>
-          <children xmi:id="_NC76Nvy-Edm185zvv0WM_Q" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=Descriptor[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=Descriptor[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_NC76NPy-Edm185zvv0WM_Q" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_NC76Mfy-Edm185zvv0WM_Q" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=Descriptor[jsrctype^name=LinkHelperRegistry[jcu^name=LinkHelperRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_NC76Mvy-Edm185zvv0WM_Q" points="[0, 2857, 0, -6125]$[0, 4444, 0, -4538]"/>
-      </edges>
-    </contents>
-    <contents xmi:type="notation:Diagram" xmi:id="_Mkq0UPy_Edm185zvv0WM_Q" type="Class" element="_SWX3UH5GEdm797szikHjoQ" name="Diagram2">
-      <children xmi:id="_HJWQ8P0IEdmIXMUQntzgXA" sourceEdges="_Hci5wP0IEdmIXMUQntzgXA _Hci5yP0IEdmIXMUQntzgXA" targetEdges="_coh54P0JEdmIXMUQntzgXA">
-        <children xmi:id="_HJok0P0IEdmIXMUQntzgXA" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_HJok0f0IEdmIXMUQntzgXA" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_HJok0v0IEdmIXMUQntzgXA" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HJok0_0IEdmIXMUQntzgXA" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HJok1P0IEdmIXMUQntzgXA" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJok1f0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HJok1v0IEdmIXMUQntzgXA" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJok1_0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HJok2P0IEdmIXMUQntzgXA" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJok2f0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HJok2v0IEdmIXMUQntzgXA" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJok2_0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJWQ8f0IEdmIXMUQntzgXA" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJWQ8v0IEdmIXMUQntzgXA" x="22260" y="6678"/>
-      </children>
-      <children xmi:id="_HK4iAP0IEdmIXMUQntzgXA" sourceEdges="_HcpAZf0IEdmIXMUQntzgXA _HcpAbf0IEdmIXMUQntzgXA" targetEdges="_Hci5wP0IEdmIXMUQntzgXA _HcpAZf0IEdmIXMUQntzgXA">
-        <children xmi:id="_HK4iA_0IEdmIXMUQntzgXA" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_HK4iBP0IEdmIXMUQntzgXA" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_HK4iBf0IEdmIXMUQntzgXA" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HK4iBv0IEdmIXMUQntzgXA" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HK4iB_0IEdmIXMUQntzgXA" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HK4iCP0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HK4iCf0IEdmIXMUQntzgXA" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HK4iCv0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HK4iC_0IEdmIXMUQntzgXA" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HK4iDP0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HK4iDf0IEdmIXMUQntzgXA" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HK4iDv0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HK4iAf0IEdmIXMUQntzgXA" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HK4iAv0IEdmIXMUQntzgXA" x="14746" y="6650"/>
-      </children>
-      <children xmi:id="_HLjQYP0IEdmIXMUQntzgXA" sourceEdges="_HcpAdf0IEdmIXMUQntzgXA _HcpAff0IEdmIXMUQntzgXA _HcvHAf0IEdmIXMUQntzgXA _HcvHCf0IEdmIXMUQntzgXA _HcvHEf0IEdmIXMUQntzgXA" targetEdges="_HcpAbf0IEdmIXMUQntzgXA _Hc1Nu_0IEdmIXMUQntzgXA">
-        <children xmi:id="_HLjQY_0IEdmIXMUQntzgXA" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_HLjQZP0IEdmIXMUQntzgXA" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_HLjQZf0IEdmIXMUQntzgXA" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HLjQZv0IEdmIXMUQntzgXA" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HLjQZ_0IEdmIXMUQntzgXA" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HLjQaP0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HLjQaf0IEdmIXMUQntzgXA" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HLjQav0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HLjQa_0IEdmIXMUQntzgXA" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HLjQbP0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HLjQbf0IEdmIXMUQntzgXA" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HLjQbv0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HLjQYf0IEdmIXMUQntzgXA" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HLjQYv0IEdmIXMUQntzgXA" x="14946" y="13674"/>
-      </children>
-      <children xmi:id="_HSJAkP0IEdmIXMUQntzgXA" sourceEdges="_HcvHGf0IEdmIXMUQntzgXA" targetEdges="_Hc1Ns_0IEdmIXMUQntzgXA _Bl_rMP0KEdmIXMUQntzgXA">
-        <children xmi:id="_HSJAk_0IEdmIXMUQntzgXA" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_HSJAlP0IEdmIXMUQntzgXA" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_HSPHMP0IEdmIXMUQntzgXA" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HSPHMf0IEdmIXMUQntzgXA" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HSPHMv0IEdmIXMUQntzgXA" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HSPHM_0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HSPHNP0IEdmIXMUQntzgXA" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HSPHNf0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HSPHNv0IEdmIXMUQntzgXA" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HSPHN_0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HSPHOP0IEdmIXMUQntzgXA" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HSPHOf0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HSJAkf0IEdmIXMUQntzgXA" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HSJAkv0IEdmIXMUQntzgXA" x="7314" y="27348"/>
-      </children>
-      <children xmi:id="_HStoUP0IEdmIXMUQntzgXA" targetEdges="_HcvHGf0IEdmIXMUQntzgXA">
-        <children xmi:id="_HStoU_0IEdmIXMUQntzgXA" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorExtensionFilter[jcu^name=NavigatorExtensionFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_HStoVP0IEdmIXMUQntzgXA" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_HStoVf0IEdmIXMUQntzgXA" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorExtensionFilter[jcu^name=NavigatorExtensionFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HStoVv0IEdmIXMUQntzgXA" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorExtensionFilter[jcu^name=NavigatorExtensionFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HStoV_0IEdmIXMUQntzgXA" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HStoWP0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorExtensionFilter[jcu^name=NavigatorExtensionFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HStoWf0IEdmIXMUQntzgXA" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HStoWv0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorExtensionFilter[jcu^name=NavigatorExtensionFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HStoW_0IEdmIXMUQntzgXA" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HStoXP0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorExtensionFilter[jcu^name=NavigatorExtensionFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HSzu8P0IEdmIXMUQntzgXA" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HSzu8f0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorExtensionFilter[jcu^name=NavigatorExtensionFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HStoUf0IEdmIXMUQntzgXA" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorExtensionFilter[jcu^name=NavigatorExtensionFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HStoUv0IEdmIXMUQntzgXA" x="6996" y="22578"/>
-      </children>
-      <children xmi:id="_HTMJcP0IEdmIXMUQntzgXA" sourceEdges="_Hc1NoP0IEdmIXMUQntzgXA _Hc1No_0IEdmIXMUQntzgXA" targetEdges="_HcvHAf0IEdmIXMUQntzgXA _sp32kP0JEdmIXMUQntzgXA">
-        <children xmi:id="_HTMJc_0IEdmIXMUQntzgXA" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_HTMJdP0IEdmIXMUQntzgXA" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_HTMJdf0IEdmIXMUQntzgXA" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HTMJdv0IEdmIXMUQntzgXA" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HTMJd_0IEdmIXMUQntzgXA" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HTMJeP0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HTMJef0IEdmIXMUQntzgXA" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HTMJev0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HTMJe_0IEdmIXMUQntzgXA" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HTMJfP0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HTMJff0IEdmIXMUQntzgXA" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HTMJfv0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HTMJcf0IEdmIXMUQntzgXA" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HTMJcv0IEdmIXMUQntzgXA" x="13722" y="22584"/>
-      </children>
-      <children xmi:id="_HT8-cP0IEdmIXMUQntzgXA" targetEdges="_HcvHCf0IEdmIXMUQntzgXA _Hc1NoP0IEdmIXMUQntzgXA _Hc1No_0IEdmIXMUQntzgXA">
-        <children xmi:id="_HT8-c_0IEdmIXMUQntzgXA" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_HT8-dP0IEdmIXMUQntzgXA" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_HT8-df0IEdmIXMUQntzgXA" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <children xmi:id="_HT8-dv0IEdmIXMUQntzgXA" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <children xmi:id="_HT8-d_0IEdmIXMUQntzgXA" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HT8-eP0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <children xmi:id="_HT8-ef0IEdmIXMUQntzgXA" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HT8-ev0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <children xmi:id="_HT8-e_0IEdmIXMUQntzgXA" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HT8-fP0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <children xmi:id="_HT8-ff0IEdmIXMUQntzgXA" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HT8-fv0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HT8-cf0IEdmIXMUQntzgXA" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HT8-cv0IEdmIXMUQntzgXA" x="13992" y="27030"/>
-      </children>
-      <children xmi:id="_HVAHUP0IEdmIXMUQntzgXA" sourceEdges="_Hc1Nq_0IEdmIXMUQntzgXA _Hc1Ns_0IEdmIXMUQntzgXA" targetEdges="_Hci5yP0IEdmIXMUQntzgXA _HcpAff0IEdmIXMUQntzgXA _Hc1Nq_0IEdmIXMUQntzgXA _Hc7UQP0IEdmIXMUQntzgXA">
-        <children xmi:id="_HVAHU_0IEdmIXMUQntzgXA" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_HVAHVP0IEdmIXMUQntzgXA" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_HVAHVf0IEdmIXMUQntzgXA" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HVAHVv0IEdmIXMUQntzgXA" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HVAHV_0IEdmIXMUQntzgXA" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HVAHWP0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HVAHWf0IEdmIXMUQntzgXA" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HVAHWv0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HVAHW_0IEdmIXMUQntzgXA" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HVAHXP0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HVAHXf0IEdmIXMUQntzgXA" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HVAHXv0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HVAHUf0IEdmIXMUQntzgXA" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HVAHUv0IEdmIXMUQntzgXA" x="6042" y="14628"/>
-      </children>
-      <children xmi:id="_HXk6MP0IEdmIXMUQntzgXA" targetEdges="_HcvHEf0IEdmIXMUQntzgXA">
-        <children xmi:id="_HXk6M_0IEdmIXMUQntzgXA" type="ImageCompartment">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ExtensionFilterProvider[jcu^name=ExtensionFilterProvider.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_HXk6NP0IEdmIXMUQntzgXA" width="530" height="530"/>
-        </children>
-        <children xmi:id="_HXk6Nf0IEdmIXMUQntzgXA" type="Stereotype">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ExtensionFilterProvider[jcu^name=ExtensionFilterProvider.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HXk6Nv0IEdmIXMUQntzgXA" type="Kind">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ExtensionFilterProvider[jcu^name=ExtensionFilterProvider.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HXk6N_0IEdmIXMUQntzgXA" type="Name">
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ExtensionFilterProvider[jcu^name=ExtensionFilterProvider.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HXk6OP0IEdmIXMUQntzgXA" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HXk6Of0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ExtensionFilterProvider[jcu^name=ExtensionFilterProvider.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HXk6Ov0IEdmIXMUQntzgXA" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HXk6O_0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ExtensionFilterProvider[jcu^name=ExtensionFilterProvider.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HXk6PP0IEdmIXMUQntzgXA" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HXk6Pf0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ExtensionFilterProvider[jcu^name=ExtensionFilterProvider.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLClassifierStyle" xmi:id="_HXk6Mf0IEdmIXMUQntzgXA" showStereotype="Label" useClassifierShape="true"/>
-        <element xmi:type="uml:Interface" href="vizref:///#jsrctype^vcore.target=uml2.Interface^name=ExtensionFilterProvider[jcu^name=ExtensionFilterProvider.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HXk6Mv0IEdmIXMUQntzgXA" x="21690" y="22588"/>
-      </children>
-      <children xmi:id="_HYWWQP0IEdmIXMUQntzgXA" sourceEdges="_Hc1Nu_0IEdmIXMUQntzgXA _Hc7UQP0IEdmIXMUQntzgXA" targetEdges="_HcpAdf0IEdmIXMUQntzgXA _ifGrsP0JEdmIXMUQntzgXA">
-        <children xmi:id="_HYWWQ_0IEdmIXMUQntzgXA" type="ImageCompartment">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-          <layoutConstraint xmi:type="notation:Size" xmi:id="_HYWWRP0IEdmIXMUQntzgXA" width="1320" height="1320"/>
-        </children>
-        <children xmi:id="_HYWWRf0IEdmIXMUQntzgXA" type="Stereotype">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HYcc4P0IEdmIXMUQntzgXA" type="Name">
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HYcc4f0IEdmIXMUQntzgXA" visible="false" type="AttributeCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HYcc4v0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HYcc4_0IEdmIXMUQntzgXA" type="OperationCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HYcc5P0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HYcc5f0IEdmIXMUQntzgXA" visible="false" type="SignalCompartment">
-          <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HYcc5v0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <children xmi:id="_HYcc5_0IEdmIXMUQntzgXA" visible="false" type="StructureCompartment">
-          <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HYcc6P0IEdmIXMUQntzgXA"/>
-          <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HYWWQf0IEdmIXMUQntzgXA" showStereotype="Label"/>
-        <element xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HYWWQv0IEdmIXMUQntzgXA" x="6210" y="6661"/>
-      </children>
-      <children xmi:id="_W3B1UP0JEdmIXMUQntzgXA" sourceEdges="_coh54P0JEdmIXMUQntzgXA" element="_WrLxsP0JEdmIXMUQntzgXA">
-        <children xmi:id="_W3H78P0JEdmIXMUQntzgXA" type="CommentBody" element="_WrLxsP0JEdmIXMUQntzgXA"/>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_W3B1Uf0JEdmIXMUQntzgXA" fillColor="16763850" lineColor="16744576" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_W3B1Uv0JEdmIXMUQntzgXA" x="22260" y="3498" width="4445" height="2222"/>
-      </children>
-      <children xmi:id="_eM52sP0JEdmIXMUQntzgXA" sourceEdges="_ifGrsP0JEdmIXMUQntzgXA" element="_eMhcMP0JEdmIXMUQntzgXA">
-        <children xmi:id="_eM52s_0JEdmIXMUQntzgXA" type="CommentBody" element="_eMhcMP0JEdmIXMUQntzgXA"/>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_eM52sf0JEdmIXMUQntzgXA" fillColor="16763850" lineColor="16744576" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eM52sv0JEdmIXMUQntzgXA" x="952" y="6667" width="4127" height="2539"/>
-      </children>
-      <children xmi:id="_lGtnIP0JEdmIXMUQntzgXA" sourceEdges="_sp32kP0JEdmIXMUQntzgXA" element="_lGVMoP0JEdmIXMUQntzgXA">
-        <children xmi:id="_lGtnI_0JEdmIXMUQntzgXA" type="CommentBody" element="_lGVMoP0JEdmIXMUQntzgXA"/>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_lGtnIf0JEdmIXMUQntzgXA" fillColor="16763850" lineColor="16744576" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_lGtnIv0JEdmIXMUQntzgXA" x="21942" y="24804" width="5397" height="2248"/>
-      </children>
-      <children xmi:id="_-xrwgP0JEdmIXMUQntzgXA" sourceEdges="_Bl_rMP0KEdmIXMUQntzgXA" element="_-xTWAP0JEdmIXMUQntzgXA">
-        <children xmi:id="_-xrwg_0JEdmIXMUQntzgXA" type="CommentBody" element="_-xTWAP0JEdmIXMUQntzgXA"/>
-        <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_-xrwgf0JEdmIXMUQntzgXA" fillColor="16763850" lineColor="16744576" showStereotype="Label"/>
-        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-xrwgv0JEdmIXMUQntzgXA" x="7314" y="30210" width="3492" height="1587"/>
-      </children>
-      <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_Mkq0Ufy_Edm185zvv0WM_Q"/>
-      <edges xmi:id="_Hci5wP0IEdmIXMUQntzgXA" source="_HJWQ8P0IEdmIXMUQntzgXA" target="_HK4iAP0IEdmIXMUQntzgXA">
-        <children xmi:id="_Hci5w_0IEdmIXMUQntzgXA" type="KindLabel">
-          <children xmi:id="_Hci5xf0IEdmIXMUQntzgXA" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_Hci5x_0IEdmIXMUQntzgXA" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_Hci5xv0IEdmIXMUQntzgXA" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_Hci5xP0IEdmIXMUQntzgXA" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_Hci5wf0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Hci5wv0IEdmIXMUQntzgXA" points="[0, 1799, 4008, -5279]$[-4022, 3387, -14, -3691]"/>
-      </edges>
-      <edges xmi:id="_Hci5yP0IEdmIXMUQntzgXA" source="_HJWQ8P0IEdmIXMUQntzgXA" target="_HVAHUP0IEdmIXMUQntzgXA">
-        <children xmi:id="_HcpAYP0IEdmIXMUQntzgXA" type="KindLabel">
-          <children xmi:id="_HcpAYv0IEdmIXMUQntzgXA" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_HcpAZP0IEdmIXMUQntzgXA" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_HcpAY_0IEdmIXMUQntzgXA" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_HcpAYf0IEdmIXMUQntzgXA" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_Hci5yf0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Hci5yv0IEdmIXMUQntzgXA" points="[0, 1799, 12078, -28509]$[0, 21009, 12078, -9299]$[-12092, 22595, -14, -7713]"/>
-      </edges>
-      <edges xmi:id="_HcpAZf0IEdmIXMUQntzgXA" source="_HK4iAP0IEdmIXMUQntzgXA" target="_HK4iAP0IEdmIXMUQntzgXA">
-        <children xmi:id="_HcpAaP0IEdmIXMUQntzgXA" type="KindLabel">
-          <children xmi:id="_HcpAav0IEdmIXMUQntzgXA" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_HcpAbP0IEdmIXMUQntzgXA" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_HcpAa_0IEdmIXMUQntzgXA" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_HcpAaf0IEdmIXMUQntzgXA" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HcpAZv0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HcpAZ_0IEdmIXMUQntzgXA" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
-      </edges>
-      <edges xmi:id="_HcpAbf0IEdmIXMUQntzgXA" source="_HK4iAP0IEdmIXMUQntzgXA" target="_HLjQYP0IEdmIXMUQntzgXA">
-        <children xmi:id="_HcpAcP0IEdmIXMUQntzgXA" type="KindLabel">
-          <children xmi:id="_HcpAcv0IEdmIXMUQntzgXA" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_HcpAdP0IEdmIXMUQntzgXA" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_HcpAc_0IEdmIXMUQntzgXA" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_HcpAcf0IEdmIXMUQntzgXA" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HcpAbv0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterRegistryManager[jcu^name=ExtensionFilterRegistryManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HcpAb_0IEdmIXMUQntzgXA" points="[-14, 3690, 1442, -5914]$[-1469, 5278, -13, -4326]"/>
-      </edges>
-      <edges xmi:id="_HcpAdf0IEdmIXMUQntzgXA" source="_HLjQYP0IEdmIXMUQntzgXA" target="_HYWWQP0IEdmIXMUQntzgXA">
-        <children xmi:id="_HcpAeP0IEdmIXMUQntzgXA" type="KindLabel">
-          <children xmi:id="_HcpAev0IEdmIXMUQntzgXA" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_HcpAfP0IEdmIXMUQntzgXA" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_HcpAe_0IEdmIXMUQntzgXA" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_HcpAef0IEdmIXMUQntzgXA" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HcpAdv0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HcpAd_0IEdmIXMUQntzgXA" points="[-13, -4326, 6614, 5278]$[-6628, -5914, -1, 3690]"/>
-      </edges>
-      <edges xmi:id="_HcpAff0IEdmIXMUQntzgXA" source="_HLjQYP0IEdmIXMUQntzgXA" target="_HVAHUP0IEdmIXMUQntzgXA">
-        <children xmi:id="_HcpAgP0IEdmIXMUQntzgXA" type="KindLabel">
-          <children xmi:id="_HcpAgv0IEdmIXMUQntzgXA" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_HcvHAP0IEdmIXMUQntzgXA" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_HcpAg_0IEdmIXMUQntzgXA" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_HcpAgf0IEdmIXMUQntzgXA" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HcpAfv0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HcpAf_0IEdmIXMUQntzgXA" points="[-13, 4326, 6601, -9300]$[-6628, 5913, -14, -7713]"/>
-      </edges>
-      <edges xmi:id="_HcvHAf0IEdmIXMUQntzgXA" source="_HLjQYP0IEdmIXMUQntzgXA" target="_HTMJcP0IEdmIXMUQntzgXA">
-        <children xmi:id="_HcvHBP0IEdmIXMUQntzgXA" type="KindLabel">
-          <children xmi:id="_HcvHBv0IEdmIXMUQntzgXA" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_HcvHCP0IEdmIXMUQntzgXA" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_HcvHB_0IEdmIXMUQntzgXA" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_HcvHBf0IEdmIXMUQntzgXA" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HcvHAv0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HcvHA_0IEdmIXMUQntzgXA" points="[-13, 4326, -529, -9300]$[516, 5913, 0, -7713]"/>
-      </edges>
-      <edges xmi:id="_HcvHCf0IEdmIXMUQntzgXA" source="_HLjQYP0IEdmIXMUQntzgXA" target="_HT8-cP0IEdmIXMUQntzgXA">
-        <children xmi:id="_HcvHDP0IEdmIXMUQntzgXA" type="KindLabel">
-          <children xmi:id="_HcvHDv0IEdmIXMUQntzgXA" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          </children>
-          <children xmi:id="_HcvHEP0IEdmIXMUQntzgXA" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          </children>
-          <children xmi:id="_HcvHD_0IEdmIXMUQntzgXA" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_HcvHDf0IEdmIXMUQntzgXA" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HcvHCv0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HcvHC_0IEdmIXMUQntzgXA" points="[-13, 4326, -2514, -20386]$[4485, 5913, 1984, -18799]$[4485, 21339, 1984, -3373]$[2500, 22926, -1, -1786]"/>
-      </edges>
-      <edges xmi:id="_HcvHEf0IEdmIXMUQntzgXA" source="_HLjQYP0IEdmIXMUQntzgXA" target="_HXk6MP0IEdmIXMUQntzgXA">
-        <children xmi:id="_HcvHFP0IEdmIXMUQntzgXA" type="KindLabel">
-          <children xmi:id="_HcvHFv0IEdmIXMUQntzgXA" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterProvider[jcu^name=ExtensionFilterProvider.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_HcvHGP0IEdmIXMUQntzgXA" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterProvider[jcu^name=ExtensionFilterProvider.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_HcvHF_0IEdmIXMUQntzgXA" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterProvider[jcu^name=ExtensionFilterProvider.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterProvider[jcu^name=ExtensionFilterProvider.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_HcvHFf0IEdmIXMUQntzgXA" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HcvHEv0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterProvider[jcu^name=ExtensionFilterProvider.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HcvHE_0IEdmIXMUQntzgXA" points="[-13, 4326, -7726, -9300]$[7713, 5913, 0, -7713]"/>
-      </edges>
-      <edges xmi:id="_HcvHGf0IEdmIXMUQntzgXA" source="_HSJAkP0IEdmIXMUQntzgXA" target="_HStoUP0IEdmIXMUQntzgXA">
-        <children xmi:id="_HcvHHP0IEdmIXMUQntzgXA" type="NameLabel">
-          <children xmi:id="_HcvHHv0IEdmIXMUQntzgXA" type="Stereotype">
-            <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorExtensionFilter[jcu^name=NavigatorExtensionFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_HcvHH_0IEdmIXMUQntzgXA" type="Name">
-            <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorExtensionFilter[jcu^name=NavigatorExtensionFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorExtensionFilter[jcu^name=NavigatorExtensionFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_HcvHHf0IEdmIXMUQntzgXA" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HcvHGv0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Generalization" href="vizref:///#jgen^vcore.target=uml2.Generalization[jsrctype^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorExtensionFilter[jcu^name=NavigatorExtensionFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HcvHG_0IEdmIXMUQntzgXA" points="[0, -1786, 3056, 9300]$[-3070, -3373, -14, 7713]"/>
-      </edges>
-      <edges xmi:id="_Hc1NoP0IEdmIXMUQntzgXA" type="OwnedElement" source="_HTMJcP0IEdmIXMUQntzgXA" target="_HT8-cP0IEdmIXMUQntzgXA">
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_Hc1Nof0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Hc1Nov0IEdmIXMUQntzgXA" points="[0, 7713, -1985, -3373]$[1984, 9300, -1, -1786]"/>
-      </edges>
-      <edges xmi:id="_Hc1No_0IEdmIXMUQntzgXA" source="_HTMJcP0IEdmIXMUQntzgXA" target="_HT8-cP0IEdmIXMUQntzgXA">
-        <children xmi:id="_Hc1Npv0IEdmIXMUQntzgXA" type="KindLabel">
-          <children xmi:id="_Hc1NqP0IEdmIXMUQntzgXA" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          </children>
-          <children xmi:id="_Hc1Nqv0IEdmIXMUQntzgXA" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          </children>
-          <children xmi:id="_Hc1Nqf0IEdmIXMUQntzgXA" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_Hc1Np_0IEdmIXMUQntzgXA" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_Hc1NpP0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ThirdPartyFilterProviderDescriptor[jsrctype^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Hc1Npf0IEdmIXMUQntzgXA" points="[0, 7713, -1985, -3373]$[1984, 9300, -1, -1786]"/>
-      </edges>
-      <edges xmi:id="_Hc1Nq_0IEdmIXMUQntzgXA" source="_HVAHUP0IEdmIXMUQntzgXA" target="_HVAHUP0IEdmIXMUQntzgXA">
-        <children xmi:id="_Hc1Nrv0IEdmIXMUQntzgXA" type="KindLabel">
-          <children xmi:id="_Hc1NsP0IEdmIXMUQntzgXA" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_Hc1Nsv0IEdmIXMUQntzgXA" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_Hc1Nsf0IEdmIXMUQntzgXA" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_Hc1Nr_0IEdmIXMUQntzgXA" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_Hc1NrP0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Hc1Nrf0IEdmIXMUQntzgXA" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
-      </edges>
-      <edges xmi:id="_Hc1Ns_0IEdmIXMUQntzgXA" source="_HVAHUP0IEdmIXMUQntzgXA" target="_HSJAkP0IEdmIXMUQntzgXA">
-        <children xmi:id="_Hc1Ntv0IEdmIXMUQntzgXA" type="KindLabel">
-          <children xmi:id="_Hc1NuP0IEdmIXMUQntzgXA" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_Hc1Nuv0IEdmIXMUQntzgXA" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_Hc1Nuf0IEdmIXMUQntzgXA" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_Hc1Nt_0IEdmIXMUQntzgXA" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_Hc1NtP0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Hc1Ntf0IEdmIXMUQntzgXA" points="[-2566, 27, -3519, -10372]$[-3704, 27, -4657, -10372]$[-3704, 10425, -4657, 26]$[-1296, 10425, -2249, 26]"/>
-      </edges>
-      <edges xmi:id="_Hc1Nu_0IEdmIXMUQntzgXA" source="_HYWWQP0IEdmIXMUQntzgXA" target="_HLjQYP0IEdmIXMUQntzgXA">
-        <children xmi:id="_Hc1Nvv0IEdmIXMUQntzgXA" type="KindLabel">
-          <children xmi:id="_Hc1NwP0IEdmIXMUQntzgXA" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_Hc1Nwv0IEdmIXMUQntzgXA" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_Hc1Nwf0IEdmIXMUQntzgXA" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_Hc1Nv_0IEdmIXMUQntzgXA" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_Hc1NvP0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterViewerRegistry[jcu^name=ExtensionFilterViewerRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Hc1Nvf0IEdmIXMUQntzgXA" points="[-1, 3690, -6628, -5914]$[6614, 5278, -13, -4326]"/>
-      </edges>
-      <edges xmi:id="_Hc7UQP0IEdmIXMUQntzgXA" source="_HYWWQP0IEdmIXMUQntzgXA" target="_HVAHUP0IEdmIXMUQntzgXA">
-        <children xmi:id="_Hc7UQ_0IEdmIXMUQntzgXA" type="KindLabel">
-          <children xmi:id="_Hc7URf0IEdmIXMUQntzgXA" type="Stereotype">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_Hc7UR_0IEdmIXMUQntzgXA" type="Kind">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <children xmi:id="_Hc7URv0IEdmIXMUQntzgXA" type="Name">
-            <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          </children>
-          <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-          <layoutConstraint xmi:type="notation:Location" xmi:id="_Hc7URP0IEdmIXMUQntzgXA" y="-185"/>
-        </children>
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_Hc7UQf0IEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <element xmi:type="uml:Usage" href="vizref:///#jdep^vcore.target=uml2.Usage[jsrctype^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]][jsrctype^name=ExtensionFilterDescriptor[jcu^name=ExtensionFilterDescriptor.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]]"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Hc7UQv0IEdmIXMUQntzgXA" points="[-1, 3690, -14, -19540]$[-1, 15517, -14, -7713]"/>
-      </edges>
-      <edges xmi:id="_coh54P0JEdmIXMUQntzgXA" type="Reference" source="_W3B1UP0JEdmIXMUQntzgXA" target="_HJWQ8P0IEdmIXMUQntzgXA">
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_coh54f0JEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_coh54v0JEdmIXMUQntzgXA" points="[-85, 8, 261, -24]$[-129, 8, 217, -24]"/>
-      </edges>
-      <edges xmi:id="_ifGrsP0JEdmIXMUQntzgXA" type="Reference" source="_eM52sP0JEdmIXMUQntzgXA" target="_HYWWQP0IEdmIXMUQntzgXA">
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_ifGrsf0JEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ifGrsv0JEdmIXMUQntzgXA" points="[79, 10, -194, -80]$[222, -49, -51, -139]"/>
-      </edges>
-      <edges xmi:id="_sp32kP0JEdmIXMUQntzgXA" type="Reference" source="_lGtnIP0JEdmIXMUQntzgXA" target="_HTMJcP0IEdmIXMUQntzgXA">
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_sp32kf0JEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_sp32kv0JEdmIXMUQntzgXA" points="[-103, 1, 232, 62]$[-264, 38, 71, 99]"/>
-      </edges>
-      <edges xmi:id="_Bl_rMP0KEdmIXMUQntzgXA" type="Reference" source="_-xrwgP0JEdmIXMUQntzgXA" target="_HSJAkP0IEdmIXMUQntzgXA">
-        <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_Bl_rMf0KEdmIXMUQntzgXA" routing="Rectilinear" showStereotype="Text"/>
-        <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Bl_rMv0KEdmIXMUQntzgXA" points="[67, 28, -126, -35]$[108, 56, -85, -7]"/>
-      </edges>
-    </contents>
-  </eAnnotations>
-  <ownedComment xmi:id="_1rBVoIO1Edmyd--cXlrqyQ" body="The Logical Extension uses various classes to supply information to the Common Navigator. See the extension point: &#xD;&#xA;org.eclipse.ui.navigator.views&#xD;&#xA; for more details."/>
-  <ownedComment xmi:id="_mJViYPy0Edm185zvv0WM_Q" body="The CNM handles the logic for selection listeners and menus for the CommonNavigator view part.">
-    <annotatedElement xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonNavigatorManager[jcu^name=CommonNavigatorManager.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-  </ownedComment>
-  <ownedComment xmi:id="_ADTKAPy1Edm185zvv0WM_Q" body="The NAS can notify interested parties when Content Extensions are initialized for a specific instance of the CommonNavigator. (Used to force the initialization of CommonActionProviders for the various extensions).">
-    <annotatedElement xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActivationService[jcu^name=NavigatorActivationService.java[jpack^name=org.eclipse.ui.navigator.views.internal.extensions[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-  </ownedComment>
-  <ownedComment xmi:id="_MRe-IPy1Edm185zvv0WM_Q" body="The NAS handles the work of allowing CommonActionProviders to inject items into the context menu of the viewer and to update the action bars as the user changes their selection in the Common Navigator.">
-    <annotatedElement xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorActionService[jcu^name=NavigatorActionService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-  </ownedComment>
-  <ownedComment xmi:id="_XIwpsPy1Edm185zvv0WM_Q" body="The NCS is the heart of the framework for content. Any viewer can use a instance of the NCS. The instance does not have a dependency to an Eclipse view part, so any StructuredViewer could use the service. The NCS will create specific Content Providers and Label Providers for use in any viewer. Each of the provider instances are tied to the NCS that created them.">
-    <annotatedElement xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentService[jcu^name=NavigatorContentService.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-  </ownedComment>
-  <ownedComment xmi:id="_vAWw8Py1Edm185zvv0WM_Q" body="Used to supply a viewer with content or labels">
-    <annotatedElement xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceContentProvider[jcu^name=NavigatorContentServiceContentProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-    <annotatedElement xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorContentServiceLabelProvider[jcu^name=NavigatorContentServiceLabelProvider.java[jpack^name=org.eclipse.ui.navigator.views[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-  </ownedComment>
-  <ownedComment xmi:id="_WrLxsP0JEdmIXMUQntzgXA" body="Integrates the filters from extensions. There is one CommonViewerFilter per viewer, not per filter.">
-    <annotatedElement xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=CommonViewerFilter[jcu^name=CommonViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-  </ownedComment>
-  <ownedComment xmi:id="_eMhcMP0JEdmIXMUQntzgXA" body="Handles activating filters and managing the persistance and restoration of these activations.">
-    <annotatedElement xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ExtensionFilterActivationManager[jcu^name=ExtensionFilterActivationManager.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-  </ownedComment>
-  <ownedComment xmi:id="_lGVMoP0JEdmIXMUQntzgXA" body="Provides integration point for Resource Navigator and Package Explorer filters. Likely to be removed.">
-    <annotatedElement xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=ThirdPartyFilterProviderRegistry[jcu^name=ThirdPartyFilterProviderRegistry.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-  </ownedComment>
-  <ownedComment xmi:id="_-xTWAP0JEdmIXMUQntzgXA" body="Used to wrap filters provided from ThirdPartyProviders">
-    <annotatedElement xmi:type="uml:Class" href="vizref:///#jsrctype^vcore.target=uml2.Class^name=NavigatorViewerFilter[jcu^name=NavigatorViewerFilter.java[jpack^name=org.eclipse.ui.navigator.views.internal.filters[jsrcroot^srcfolder=src[project^vcore.target=uml2.Model^id=org.eclipse.ui.navigator.views]]]]"/>
-  </ownedComment>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_SWX3VH5GEdm797szikHjoQ">
-    <eAnnotations xmi:id="_SWX3VX5GEdm797szikHjoQ" source="attributes">
-      <details xmi:id="_SWX3Vn5GEdm797szikHjoQ" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_PROFILES/Basic.profile.uml2#_6mFRgK86Edih9-GG5afQ0g"/>
-    <importedProfile href="pathmap://UML2_PROFILES/Basic.profile.uml2#_6mFRgK86Edih9-GG5afQ0g"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_SWX3V35GEdm797szikHjoQ">
-    <eAnnotations xmi:id="_SWX3WH5GEdm797szikHjoQ" source="attributes">
-      <details xmi:id="_SWX3WX5GEdm797szikHjoQ" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_PROFILES/Intermediate.profile.uml2#_Cz7csK87Edih9-GG5afQ0g"/>
-    <importedProfile href="pathmap://UML2_PROFILES/Intermediate.profile.uml2#_Cz7csK87Edih9-GG5afQ0g"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_SWX3Wn5GEdm797szikHjoQ">
-    <eAnnotations xmi:id="_SWX3W35GEdm797szikHjoQ" source="attributes">
-      <details xmi:id="_SWX3XH5GEdm797szikHjoQ" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_PROFILES/Complete.profile.uml2#_M7pTkK87Edih9-GG5afQ0g"/>
-    <importedProfile href="pathmap://UML2_PROFILES/Complete.profile.uml2#_M7pTkK87Edih9-GG5afQ0g"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_SWX3XX5GEdm797szikHjoQ">
-    <eAnnotations xmi:id="_SWX3Xn5GEdm797szikHjoQ" source="attributes">
-      <details xmi:id="_SWX3X35GEdm797szikHjoQ" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_MSL_PROFILES/Default.epx#_a_S3wNWLEdiy4IqP8whjFA?Default"/>
-    <importedProfile href="pathmap://UML2_MSL_PROFILES/Default.epx#_a_S3wNWLEdiy4IqP8whjFA?Default"/>
-  </packageImport>
-  <packageImport xmi:type="uml:ProfileApplication" xmi:id="_SWX3YH5GEdm797szikHjoQ">
-    <eAnnotations xmi:id="_SWX3YX5GEdm797szikHjoQ" source="attributes">
-      <details xmi:id="_SWX3Yn5GEdm797szikHjoQ" key="version" value="0"/>
-    </eAnnotations>
-    <importedPackage xmi:type="uml:Profile" href="pathmap://UML2_MSL_PROFILES/Deployment.epx#_vjbuwOvHEdiDX5bji0iVSA?Deployment"/>
-    <importedProfile href="pathmap://UML2_MSL_PROFILES/Deployment.epx#_vjbuwOvHEdiDX5bji0iVSA?Deployment"/>
-  </packageImport>
-  <packageImport xmi:id="_SWX3Y35GEdm797szikHjoQ">
-    <importedPackage xmi:type="uml:Model" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_EfRZoK86EdieaYgxtVWN8Q"/>
-  </packageImport>
-  <ownedMember xmi:type="uml:Component" xmi:id="_9330kIOwEdmyd--cXlrqyQ" name="ITreeContentProvider"/>
-  <ownedMember xmi:type="uml:Component" xmi:id="_X4I4gIOxEdmyd--cXlrqyQ" name="ICommonLabelProvider" clientDependency="_gSmjYIOxEdmyd--cXlrqyQ">
-    <realization xmi:id="_gSmjYIOxEdmyd--cXlrqyQ" client="_X4I4gIOxEdmyd--cXlrqyQ" supplier="_b6MYsIOxEdmyd--cXlrqyQ" realizingClassifier="_b6MYsIOxEdmyd--cXlrqyQ">
-      <mapping xmi:id="_gSmjYYOxEdmyd--cXlrqyQ"/>
-    </realization>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Component" xmi:id="_b6MYsIOxEdmyd--cXlrqyQ" name="ILabelProvider"/>
-  <ownedMember xmi:type="uml:Component" xmi:id="_jhjysIOxEdmyd--cXlrqyQ" name="IOpenListener"/>
-  <ownedMember xmi:type="uml:Component" xmi:id="_kc3kYIOxEdmyd--cXlrqyQ" name="ICommonOpenListener" clientDependency="_mI-g4IOxEdmyd--cXlrqyQ">
-    <realization xmi:id="_mI-g4IOxEdmyd--cXlrqyQ" client="_kc3kYIOxEdmyd--cXlrqyQ" supplier="_jhjysIOxEdmyd--cXlrqyQ" realizingClassifier="_jhjysIOxEdmyd--cXlrqyQ">
-      <mapping xmi:id="_mI-g4YOxEdmyd--cXlrqyQ"/>
-    </realization>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Component" xmi:id="_mol1EIOxEdmyd--cXlrqyQ" name="ICommonActionProvider"/>
-  <ownedMember xmi:type="uml:Component" xmi:id="_4TXNsIOxEdmyd--cXlrqyQ" name="Logical Extension" clientDependency="_AbfLYIOyEdmyd--cXlrqyQ _DeUDMIOyEdmyd--cXlrqyQ _JsSBUIOyEdmyd--cXlrqyQ _Lc-i4IOyEdmyd--cXlrqyQ _ITURAIO3Edmyd--cXlrqyQ">
-    <ownedAttribute xmi:id="_Ssv8QIOyEdmyd--cXlrqyQ" name="id">
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_T8lzgIOyEdmyd--cXlrqyQ" name="priority">
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_sTa0cIOyEdmyd--cXlrqyQ" name="name">
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_BP7DkIOzEdmyd--cXlrqyQ" name="enabledByDefault">
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXfBUK86EdieaYgxtVWN8Q"/>
-    </ownedAttribute>
-    <ownedAttribute xmi:id="_LqEuQIOzEdmyd--cXlrqyQ" name="icon">
-      <type xmi:type="uml:PrimitiveType" href="pathmap://UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2#_IXlH8a86EdieaYgxtVWN8Q"/>
-    </ownedAttribute>
-    <ownedOperation xmi:id="_u47eIIOyEdmyd--cXlrqyQ" name="Operation1"/>
-  </ownedMember>
-  <ownedMember xmi:type="uml:Usage" xmi:id="_AbfLYIOyEdmyd--cXlrqyQ" client="_4TXNsIOxEdmyd--cXlrqyQ" supplier="_b6MYsIOxEdmyd--cXlrqyQ"/>
-  <ownedMember xmi:type="uml:Usage" xmi:id="_DeUDMIOyEdmyd--cXlrqyQ" client="_4TXNsIOxEdmyd--cXlrqyQ" supplier="_9330kIOwEdmyd--cXlrqyQ"/>
-  <ownedMember xmi:type="uml:Usage" xmi:id="_JsSBUIOyEdmyd--cXlrqyQ" client="_4TXNsIOxEdmyd--cXlrqyQ" supplier="_jhjysIOxEdmyd--cXlrqyQ"/>
-  <ownedMember xmi:type="uml:Usage" xmi:id="_Lc-i4IOyEdmyd--cXlrqyQ" client="_4TXNsIOxEdmyd--cXlrqyQ" supplier="_mol1EIOxEdmyd--cXlrqyQ"/>
-  <ownedMember xmi:type="uml:Component" xmi:id="_2NsvcIO2Edmyd--cXlrqyQ" name="Logical Enablement Clause"/>
-  <ownedMember xmi:type="uml:Usage" xmi:id="_ITURAIO3Edmyd--cXlrqyQ" client="_4TXNsIOxEdmyd--cXlrqyQ" supplier="_2NsvcIO2Edmyd--cXlrqyQ"/>
-</uml:Model>
diff --git a/bundles/org.eclipse.ui.navigator/notes.txt b/bundles/org.eclipse.ui.navigator/notes.txt
deleted file mode 100644
index 91613e6..0000000
--- a/bundles/org.eclipse.ui.navigator/notes.txt
+++ /dev/null
@@ -1,80 +0,0 @@
-Some notes about the CNF in attempt to understand things.
-
-30 Nov 08 FRU
-
-Navigator Content
-
-The purpose of the navigatorContent extension (NCE) is to bind a content provider
-and label provider to the navigator under the right circumstances depending
-on what is selected.
-
-A navigator content descriptor has a one-to-one correspondence with the
-navigator content extension, which is the higher level object representing
-the navigator content.
-
-
-
-
-Overriding
-
-An NCE may specify that it overrides another through the user of the override
-mechanism where it specifies the NCE extension ID of the extension to override.
-
-When doing the processing associated with the label and content provider, it is possible
-that multiple NCEs meet the criteria for processing based on their triggerPoints and/or 
-possibleChildren.  When this happens, the NCEs are ordered in a tree based
-on the overrides specification, and then with that based on priority.
-The first NCE in the tree that provides the answer (label or content) being
-sought is used.
-
-When the NCE is bound to the viewer (using the contentExtension element) it may
-specify that that NCE serves as "root content" for that viewer, which allows
-the viewer to start with an initial set of NCEs to process the root(s) [why exactly --
-I understand intuitively but can't put it into words].
-
-
-Pipelining
-
-In some cases, it is desirable to have multiple NCEs be invoked during
-content provider processing to modify the objects to be returned by the
-content provider.  This is done using the pipelining mechanism where each NCE
-in the tree has the opportunity to modify the objects to be returned by the
-content provider.  There are also hooks for these pipelined NCEs to 
-be invoked at the Add/Remove/Update/Refresh methods on the viewer.
-
-Dependency
-
-
-
-Questions/Issues:
-
-1) In NavigatorContentServicedLabelProvider, seems that we look for label providers
-by looking for matching NCEs by possibleChild.  It seems to make more sense to 
-look for them by triggerPoint, since possibleChild is used mainly in the content
-provider getParent() case.
-
-2) Should the NCE class and NavigatorContentDescriptor classes be combined?
-
-3) In NavigatorContentServiceLabel provider, there seems to be special
-processing to handle overriding instead of using the normal processing to
-get only the relevant NCEs.  Also, the way to get the NCEs is different
-depending on whether doing a getImage() or getForeground() for example
-and I don't understand why.  Also NavigatorContentServiceDescriptionProvider does not
-seem to consider overrides at all.
-
-4) The triggerPoints and possibleChildren descriptions in the exsd are confusing:
-
-The triggerPoints expression defines the nodes in a tree that should cause this extension to be invoked for children.
-
-The possibleChildren expression defines the nodes in a tree that could be contributed by this extension. 
-Clients should describes when this content extension could provide a parent for elements that match the expression.
-
-I think a clearer description is:
-
-The triggerPoints expression defines the tree nodes for which this extension
-(and associated content/label providers) is to be invoked.
-
-The possibleChildren expression defines the content provider to be selected when processing 
-the ITreeContentProvider.getParent() call.
-
-
diff --git a/bundles/org.eclipse.ui.navigator/plugin.properties b/bundles/org.eclipse.ui.navigator/plugin.properties
deleted file mode 100644
index 4963f53..0000000
--- a/bundles/org.eclipse.ui.navigator/plugin.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Plugin.name=Common Navigator View
-Plugin.providerName=Eclipse.org
-
-
-Link_Helper= Link Helper
-ExtPoint_navigatorViewer = Navigator Viewer Configuration Extension Port
-ExtPoint_navigatorContent = Navigator Content Extension Point
-
-
diff --git a/bundles/org.eclipse.ui.navigator/plugin.xml b/bundles/org.eclipse.ui.navigator/plugin.xml
deleted file mode 100644
index af55b54..0000000
--- a/bundles/org.eclipse.ui.navigator/plugin.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension-point id="navigatorContent" name="%ExtPoint_navigatorContent" schema="schema/navigatorContent.exsd"/>
-   <extension-point id="viewer" name="%ExtPoint_navigatorViewer" schema="schema/viewer.exsd"/>
-   <extension-point id="linkHelper" name="%Link_Helper" schema="schema/linkHelper.exsd"/>
- 
-   <extension
-         point="org.eclipse.ui.dropActions">
-      <action
-            class="org.eclipse.ui.internal.navigator.dnd.NavigatorPluginDropAction"
-            id="org.eclipse.ui.navigator.PluginDropAction">
-      </action>
-   </extension> 
-   
-</plugin>
diff --git a/bundles/org.eclipse.ui.navigator/schema/linkHelper.exsd b/bundles/org.eclipse.ui.navigator/schema/linkHelper.exsd
deleted file mode 100644
index ac24449..0000000
--- a/bundles/org.eclipse.ui.navigator/schema/linkHelper.exsd
+++ /dev/null
@@ -1,183 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.navigator">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui.navigator" id="linkHelper" name="Navigator Link Helper"/>
-      </appInfo>
-      <documentation>
-         Provides a hook for clients that wish to extend the &quot;Link with Editor&quot; capability of a Common Navigator.  A link helper must be included in a &lt;b&gt;viewerContentBinding&lt;/b&gt; element of the &lt;b&gt;org.eclipse.ui.navigator.viewer&lt;/b&gt; extension point.
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="linkHelper"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="linkHelper">
-      <complexType>
-         <sequence>
-            <element ref="editorInputEnablement"/>
-            <element ref="selectionEnablement" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Implements &lt;code&gt;org.eclipse.ui.navigator.ILinkHelper&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.navigator.ILinkHelper"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A unique id for this &lt;b&gt;linkHelper&lt;/b&gt; extension.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="editorInputEnablement">
-      <annotation>
-         <documentation>
-            An Eclipse Core Expression that describes when this helper can provide a selection from an editor input.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-            <element ref="reference"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <element name="selectionEnablement">
-      <annotation>
-         <documentation>
-            An Eclipse Core Expression that describes when this extension can provide an IEditorInput for a given selection.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-            <element ref="reference"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.2
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;pre&gt;
-    &lt;extension
-          point=&quot;org.eclipse.ui.navigator.linkHelper&quot;&gt;
-       &lt;linkHelper
-             class=&quot;org.eclipse.ui.internal.navigator.resources.workbench.ResourceLinkHelper&quot;
-             id=&quot;org.eclipse.ui.navigator.resources.linkHelper&quot;&gt;
-          &lt;selectionEnablement&gt;
-             &lt;instanceof value=&quot;org.eclipse.core.resources.IFile&quot;/&gt;
-          &lt;/selectionEnablement&gt;
-          &lt;editorInputEnablement&gt;
-             &lt;instanceof value=&quot;org.eclipse.ui.IFileEditorInput&quot;/&gt;
-          &lt;/editorInputEnablement&gt;
-       &lt;/linkHelper&gt;
-    &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2002, 2008 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui.navigator/schema/navigatorContent.exsd b/bundles/org.eclipse.ui.navigator/schema/navigatorContent.exsd
deleted file mode 100644
index c44d8e0..0000000
--- a/bundles/org.eclipse.ui.navigator/schema/navigatorContent.exsd
+++ /dev/null
@@ -1,904 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.navigator" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui.navigator" id="navigatorContent" name="navigatorContent"/>
-      </appinfo>
-      <documentation>
-         A content extension provides a content and label provider 
-that can be used by a navigator content service. The
-&lt;b&gt;navigatorContent&lt;/b&gt; extension defines the specific classes 
-for the content provider, label provider, and action provider
-in addition to the types of elements the extension knows about. 
-&lt;p&gt;
-The &lt;b&gt;triggerPoints&lt;/b&gt; expression describes the elements that will
-cause this extension to be invoked for either children or for
-labels. The &lt;b&gt;possibleChildren&lt;/b&gt; expression describes the elements 
-that the extension may be able to provide a parent for. Clients
-should describe all elements that could be set as the selection
-to ensure that the link with editor support can properly 
-expand to the right node.
-&lt;p&gt;
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <choice>
-               <element ref="navigatorContent" minOccurs="0" maxOccurs="unbounded"/>
-               <element ref="actionProvider" minOccurs="0" maxOccurs="unbounded"/>
-               <element ref="commonWizard" minOccurs="0" maxOccurs="unbounded"/>
-               <element ref="commonFilter" minOccurs="0" maxOccurs="unbounded"/>
-            </choice>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="navigatorContent">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name"/>
-         </appinfo>
-         <documentation>
-            A navigator content extension defines a content provider and label provider that can be used to provide children whenever an element matches the &lt;b&gt;triggerPoints&lt;/b&gt; expression and also to provide a parent whenever an element matches the &lt;b&gt;possibleChildren&lt;/b&gt; expression. 
-&lt;br&gt;&lt;br&gt;
-Optionally, clients may also provide an action provider which can provide menu contributions and action bar contributions when an element is selected that the extension contributed, or that matches the &lt;b&gt;triggerPoints&lt;/b&gt; expression. Clients may also choose to contribute a sorter to sort elements that are contributed by the extension.
-&lt;br&gt;&lt;br&gt;
-When an extension is deactivated by the user, the content and label providers are disposed. However, because many of the Image resources might be in use by other extensions in the Common Navigator Viewer, clients should not dispose of Image Resources until the viewer itself is disposed.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <choice>
-               <element ref="enablement"/>
-               <sequence>
-                  <element ref="triggerPoints"/>
-                  <element ref="possibleChildren"/>
-               </sequence>
-            </choice>
-            <element ref="actionProvider" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="commonSorter" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="override" minOccurs="0" maxOccurs="1"/>
-            <element ref="dropAssistant" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="commonWizard" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A unique ID to identify this extension. Used for extension activation and by other extensions that would like to extend the defined extension (e.g. add another &lt;code&gt;org.eclipse.ui.navigator.CommonActionProvider&lt;/code&gt;)
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Specify a display name for the Content Extension. The display name is used in the activation dialog to allow clients to turn an extension on or off.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="priority">
-            <annotation>
-               <documentation>
-                  Indicates the relative priority of this extension to other extensions. Used by the Common Navigator to handle sorting and organization of the contributed content from this extension in relation to content from other extensions. Defaults to &quot;normal&quot;
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="lowest">
-                  </enumeration>
-                  <enumeration value="lower">
-                  </enumeration>
-                  <enumeration value="low">
-                  </enumeration>
-                  <enumeration value="normal">
-                  </enumeration>
-                  <enumeration value="high">
-                  </enumeration>
-                  <enumeration value="higher">
-                  </enumeration>
-                  <enumeration value="highest">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="contentProvider" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Supplies the name of a class which implements &lt;code&gt;org.eclipse.jface.viewers.ITreeContentProvider&lt;/code&gt; or &lt;code&gt;org.eclipse.ui.navigator.ICommonContentProvider&lt;/code&gt;.
-&lt;br&gt;&lt;br&gt;
-The content provider will be consulted when addeding children to the tree. Use the &lt;b&gt;enablement&lt;/b&gt; or &lt;b&gt;triggerPoints&lt;/b&gt; clause to indicate what kinds of content should trigger a request to your content provider.
-&lt;br&gt;&lt;br&gt; 
-Elements contributed from the content provider are not guaranteed to appear in the tree in the same order. Clients should take advantage of the sorting extension (&lt;b&gt;commonSorter&lt;/b&gt;) to ensure proper ordering of their elements.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jface.viewers.ITreeContentProvider"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  A plugin-relative path to an icon for use when displaying the metadata about the content extension to the user.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="activeByDefault" type="boolean">
-            <annotation>
-               <documentation>
-                  Indicates whether the current extension will be &lt;i&gt;active&lt;/i&gt; by default. Each content extension may be turned on or off by the user. The &lt;i&gt;active&lt;/i&gt; state is differentiated from the &lt;i&gt;visible&lt;/i&gt; state. See &lt;b&gt;org.eclipse.ui.navigator.viewer/viewerContentBinding&lt;/b&gt; for more information on &lt;i&gt;visibility&lt;/i&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="providesSaveables" type="boolean">
-            <annotation>
-               <documentation>
-                  Indicates whether this extension provides saveables. The default is false. If set to true, the content provider must adapt to SaveablesProvider.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="labelProvider" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Supplies the name of a class which implements &lt;code&gt;org.eclipse.jface.viewers.ILabelProvider&lt;/code&gt; or for more advanced functionality, the &lt;code&gt;org.eclipse.ui.navigator.ICommonLabelProvider&lt;/code&gt;.
-&lt;br&gt;&lt;br&gt;
-Clients may also implement &lt;code&gt;org.eclipse.ui.navigator.IDescriptionProvider&lt;/code&gt; in order to add text to the status bar at the bottom of the Eclipse workbench based on the selection in the viewer.
-&lt;br&gt;&lt;br&gt;
-Since 3.4, clients may also implement &lt;code&gt;org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider&lt;/code&gt; to provide styled text labels. Note that the empty styled string signals that the label provider does not wish to render the label.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jface.viewers.ILabelProvider"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="enablement">
-      <annotation>
-         <documentation>
-            The enablement expression allows clients to specify the same expression for both &lt;b&gt;triggerPoints&lt;/b&gt; and &lt;b&gt;possibleChildren&lt;/b&gt;.
-&lt;br&gt;&lt;br&gt;
-In the case of &lt;b&gt;actionProvider&lt;/b&gt;, clients must define an expression that will indicate to the framework when their &lt;code&gt;org.eclipse.ui.navigator.CommonActionProvider&lt;/code&gt; should be invoked. Because of contributions to the IActionBars, clients must be invoked whenever an object they are interested in is selected. Therefore, clients should use discretion in deciding when their extension should be enabled.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-            <element ref="reference"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <element name="triggerPoints">
-      <annotation>
-         <documentation>
-            The &lt;b&gt;triggerPoints&lt;/b&gt; expression defines the nodes in a tree that should cause this extension to be invoked for children.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-            <element ref="reference"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <element name="possibleChildren">
-      <annotation>
-         <documentation>
-            The &lt;b&gt;possibleChildren&lt;/b&gt; expression defines the nodes in a tree that could be contributed by this extension. Clients should describes when this content extension could provide a parent for elements that match the expression.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-            <element ref="reference"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <element name="actionProvider">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="class"/>
-         </appinfo>
-         <documentation>
-            Supplies the name of a class that implements &lt;code&gt;org.eclipse.ui.navigator.CommonActionProvider&lt;/code&gt;. The action provider has an opportunity to contribute to the context menu and the retargetable actions defined in the IActionBars for the view that holds the navigator. Clients may also contribute directly to the view menu through the IActionBars view menu.
-&lt;br&gt;&lt;br&gt;
-A top level &lt;b&gt;actionProvider&lt;/b&gt; is &lt;i&gt;visible&lt;/i&gt; to an abstract viewer if there is a &lt;b&gt;viewerActionBinding&lt;/b&gt; for that &lt;b&gt;actionProvider&lt;/b&gt;. For actionProviders that are nested under a &lt;b&gt;navigatorContent&lt;/b&gt; element, the visibility will be controlled by the id of the navigatorContent extension id. Child action providers will automatically
-be picked up by matching &lt;b&gt;viewerContentBinding&lt;/b&gt;s. See &lt;b&gt;org.eclipse.ui.navigator.viewer&lt;/b&gt; for more information on visibility bindings.
-&lt;br&gt;&lt;br&gt;
-Clients may provide &lt;b&gt;actionProvider&lt;/b&gt;(s) under the root &lt;b&gt;extension&lt;/b&gt; element (peer to other &lt;b&gt;navigatorContent&lt;/b&gt;) in order to better control their enablement and viewer binding (see &lt;b&gt;veiwerActionBinding&lt;/b&gt;).
-&lt;br&gt;&lt;br&gt;
-For root &lt;b&gt;actionProviders&lt;/b&gt; with no id, the id defaults to &quot;org.eclipse.ui.navigator.actionProvider.X&quot;. For these &lt;b&gt;actionProvider&lt;/b&gt;s to be given the opportunity to contribute the menus or action bars of a viewer, a &lt;b&gt;viewerActionBinding&lt;/b&gt; must be defined (as part of the &lt;b&gt;org.eclipse.ui.navigator.viewer extension point&lt;/b&gt;) which declares a binding between the specific viewer and the default id (&quot;org.eclipse.ui.navigator.actionProvider.*&quot;). See the documentation for &lt;b&gt;viewerActionBinding&lt;/b&gt; under the schema documentation of &lt;b&gt;org.eclipse.ui.navigator.viewer&lt;/b&gt; for more information.
-&lt;br&gt;&lt;br&gt;
-Any items contributed to the toolbar or the view menu should be removed with the &lt;b&gt;actionProviders&lt;/b&gt; is disposed.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="enablement" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.navigator.CommonActionProvider"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  Clients may optionally define an id to use for filtering purposes (either through activities or &lt;b&gt;viewerContentBinding&lt;/b&gt;s).
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="dependsOn" type="string">
-            <annotation>
-               <documentation>
-                  Specifies the ID of an action provider that configures some menu or submenu that must be prepared before this action provider is applied. 
-&lt;br&gt;&lt;br&gt;
-Specifying a dependency on another action provider does not guarantee that this action provider will be invoked whereever the required action provider is invoked. The downstream action provider must be bound to the particular viewer to be invoked.  
-&lt;br&gt;&lt;br&gt;
-If the required action provider is disabled or unbound to the current viewer, then this action provider will not be applied. If a cycle exists, the framework will try to continue, but there are no guarantees as to what menu items or action bar contributions will be available.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="overrides" type="string">
-            <annotation>
-               <documentation>
-                  Specify the id of an &lt;b&gt;actionProvider&lt;/b&gt; which is defined by an upstream contributor that must be overridden. The upstream &lt;b&gt;actionProvider&lt;/b&gt; will not be given an opportunity to contribute menu options or retargetable actions when this &lt;b&gt;actionProvider&lt;/b&gt; is &lt;i&gt;visible&lt;/i&gt; and &lt;i&gt;enabled&lt;/i&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="priority">
-            <annotation>
-               <documentation>
-                  Indicates the relative priority of this extension to other extensions. Used by the Common Navigator to handle sorting and organization of the contributed content from this extension in relation to content from other extensions. Defaults to &quot;normal&quot;
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="lowest">
-                  </enumeration>
-                  <enumeration value="lower">
-                  </enumeration>
-                  <enumeration value="low">
-                  </enumeration>
-                  <enumeration value="normal">
-                  </enumeration>
-                  <enumeration value="high">
-                  </enumeration>
-                  <enumeration value="higher">
-                  </enumeration>
-                  <enumeration value="highest">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="commonWizard">
-      <annotation>
-         <documentation>
-            Defines a binding between an existing Eclipse New/Import/Export Wizard and a given set of items. Each valid binding determines which menu items will appear in the submenus for New/Import/Export in the context menu of a Common Navigator Viewer. Since Eclipse 3.2.1, the wizard menu items respect Eclipse Capabilities (see &lt;b&gt;org.eclipse.ui.activites&lt;/b&gt; for more information). 
-&lt;br&gt;&lt;br&gt;
-All of the following conditions must be met for a &lt;b&gt;commonWizard&lt;/b&gt; item to appear in the menu: (1) The &lt;b&gt;commonWizard&lt;/b&gt; is NOT filtered by an Eclipse Capability, (2) The identifier of the &lt;b&gt;commonWizard&lt;/b&gt; is NOT null, (3) The associated &lt;b&gt;navigatorContent&lt;/b&gt; extension is &lt;i&gt;visible&lt;/i&gt; for the current content service (the content service used to initialize the &lt;code&gt;NavigatorActionService&lt;/code&gt; or supplied to &lt;code&gt;WizardActionGroup&lt;/code&gt;), (4) The associated &lt;b&gt;navigatorContent&lt;/b&gt; extension is &lt;i&gt;active&lt;/i&gt; for the current content service, and (5) The &lt;b&gt;enablement&lt;/b&gt; of the &lt;b&gt;commonWizard&lt;/b&gt; returns true for the current selection that was supplied to the context menu.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="enablement"/>
-         </sequence>
-         <attribute name="type" use="required">
-            <annotation>
-               <documentation>
-                  The type atttribute should be the value of the root category of the expected wizard. The possible values include &quot;import&quot; for &lt;b&gt;org.eclipse.ui.importWizards&lt;/b&gt;, &quot;export&quot; &lt;b&gt;org.eclipse.ui.exportWizards&lt;/b&gt;, and &quot;new&quot; for &lt;b&gt;org.eclipse.ui.newWizards&lt;/b&gt;
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="import">
-                  </enumeration>
-                  <enumeration value="export">
-                  </enumeration>
-                  <enumeration value="new">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="wizardId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id of the desired wizard shortcut as defined by &lt;b&gt;org.eclipse.ui.importWizards&lt;/b&gt;, &lt;b&gt;org.eclipse.ui.exportWizards&lt;/b&gt;, or &lt;b&gt;org.eclipse.ui.newWizards&lt;/b&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="menuGroupId" type="string">
-            <annotation>
-               <documentation>
-                  Indicates a user-defined logical grouping id. &lt;b&gt;commonWizard&lt;/b&gt; extensions with matching &lt;i&gt;menuGroupId&lt;/i&gt;s will be indicated as related items when rendered as menu options to endusers. How the grouping will be done is not guaranteed. In particular, clients should never anticipate a menu separator or group marker of the given name to be present in the menu.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="associatedExtensionId" type="string">
-            <annotation>
-               <documentation>
-                  A &lt;b&gt;commonWizard&lt;/b&gt; may be defined as the nested child of a &lt;b&gt;navigatorContent&lt;/b&gt; extension point, in which case the &lt;i&gt;associatedExtensionId&lt;/i&gt; is automatically set to the id of its enclosing &lt;b&gt;naviagatorContent&lt;/b&gt; element. However, when specified as a top-level extension, a &lt;b&gt;commonWizard&lt;/b&gt; may indicate an content extension that it should be associated with explicitly. When a &lt;b&gt;commonWizard&lt;/b&gt; is associated with a content extension, it will inherit the &lt;i&gt;visibility&lt;/i&gt; and the &lt;i&gt;activation&lt;/i&gt; of that content extension. It will not inherit the &lt;i&gt;enablement&lt;/i&gt;; so you must specify an &lt;b&gt;enablement&lt;/b&gt; for the wizard menu item to appear.
-&lt;br&gt;&lt;br&gt;
-That is, if the content extension is bound to a Common Navigator (see &lt;b&gt;org.eclipse.ui.navigator.viewer/viewerContentBinding&lt;/b&gt;) and the user has the content extension &lt;i&gt;activated&lt;/i&gt; either by default or through the &quot;Available Extensions&quot; dialog, then the &lt;b&gt;commonWizard&lt;/b&gt; menu option would appear. However, when the user &lt;i&gt;deactivates&lt;/i&gt; that content extension, the &lt;b&gt;commonWizard&lt;/b&gt; menu option would no longer be shown in the menu.
-&lt;br&gt;&lt;br&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="commonFilter">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name"/>
-         </appinfo>
-         <documentation>
-            Defines a filter that can big associated with a particular Common Viewer. Common filters are bound to a viewer like content extensions by using &lt;b&gt;org.eclipse.ui.navigator.viewer/viewerContentBinding&lt;/b&gt;.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="filterExpression" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A unique identifier that will be used for management of this &lt;b&gt;filterExpression&lt;/b&gt;. The id will be used by the &lt;b&gt;org.eclipse.ui.navigator.viewer/viewerContentBinding&lt;/b&gt; to bind this filter to a matching viewer.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A translateable name that will be used to refer to this particular filter in dialogs presented to the user.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A translatable description of what this filter is designed to hide from the view.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  Clients may choose to define an explicit ViewerFilter subclass via the &quot;class&quot; attribute. Alternatively, clients may choose to nest a &lt;b&gt;filterExpression&lt;/b&gt; element to describe what the filter should hide. Clients may use either &lt;b&gt;filterExpression&lt;/b&gt; or the &quot;class&quot; attribute, but not both.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jface.viewers.ViewerFilter"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="activeByDefault" type="boolean">
-            <annotation>
-               <documentation>
-                  A value of true indicates the filter should be &quot;on&quot; by default. The user may customize whether the filter is on or off regardless of the value of this attribute. This attribute defines whether the filter is &quot;on&quot; the first time the view is brought up.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="filterExpression">
-      <annotation>
-         <documentation>
-            An optional Eclipse Core Expression that defines what the filter should hide from a particular view. 
-&lt;br&gt;&lt;br&gt;
-For instance, clients may decide to hide all resources that have a particular pattern in their name (like &quot;*.acme&quot;). When the filter is active (turned on by default or by the user), then all resources that end in &quot;acme&quot; would be hidden from the view of the user. 
-&lt;br&gt;&lt;br&gt;
-Clients may use either &lt;b&gt;filterExpression&lt;/b&gt; or the &quot;class&quot; attribute, but not both.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-            <element ref="reference"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <element name="commonSorter">
-      <annotation>
-         <documentation>
-            A &lt;b&gt;commonSorter&lt;/b&gt; declares an subclass of &lt;code&gt;org.eclipse.jface.viewers.ViewerSorter&lt;/code&gt; which is used to sort children in the tree. The nested &lt;b&gt;parentExpression&lt;/b&gt; describes when the &lt;b&gt;commonSorter&lt;/b&gt; should be used. If an element matches the &lt;b&gt;parentExpression&lt;/b&gt;, then its children will be sorted by this &lt;b&gt;commonSorter&lt;/b&gt;.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="parentExpression" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  The id is used to identify the sorter when debugging a viewer.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A subclass of &lt;code&gt;org.eclipse.jface.viewers.ViewerSorter&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jface.viewers.ViewerSorter"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="parentExpression">
-      <annotation>
-         <documentation>
-            A &lt;b&gt;parentExpression&lt;/b&gt; is used by &lt;b&gt;commonSorter&lt;/b&gt; to identify when it is applicable. If the &lt;b&gt;parentExpression&lt;/b&gt; for a &lt;b&gt;commonSorter&lt;/b&gt; matches a given element, then that &lt;b&gt;commonSorter&lt;/b&gt; will be used to sort the children of that element (as returned by the content provider of the content service).
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-            <element ref="reference"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <element name="override">
-      <annotation>
-         <documentation>
-            When the &lt;b&gt;triggerPoints&lt;/b&gt; expression of the suppressed extension and the declared extension are both &lt;i&gt;enabled&lt;/i&gt; on a given element, this extension will be invoked, but its suppressed extension will not. Clients that specify an &lt;b&gt;override&lt;/b&gt; element may provide a content provider which implements &lt;code&gt;org.eclipse.ui.navigator.IPipelinedTreeContentProvider&lt;/code&gt;, which provides methods to intercept requests for children, parents, and direct updates to the viewer.
-&lt;br&gt;&lt;br&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="suppressedExtensionId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id of an extension should be suppressed when this extension is &lt;i&gt;visible&lt;/i&gt; and &lt;i&gt;active&lt;/i&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="policy" use="default" value="InvokeAlwaysRegardlessOfSuppressedExt">
-            <annotation>
-               <documentation>
-                  The policy declares how the extension should be invoked by the framework. If the policy is left unspecified, then it defaults to &lt;i&gt;InvokeAlwaysRegardlessOfSuppressedExt&lt;/i&gt;. The available policies are as follows:&lt;br&gt;
-&lt;ul&gt;
-  &lt;li&gt;&lt;i&gt;InvokeOnlyIfSuppressedExtAlsoVisibleAndActive&lt;/i&gt;: This extension is expressly an overriding extension; unless its suppressed extension is &lt;i&gt;visible&lt;/i&gt; and &lt;i&gt;active&lt;/i&gt; to the viewer, this extension should not be given opportunities to contribute. When using this policy, this extension will only be invoked when the &lt;b&gt;triggerPoints&lt;/b&gt; expression of its suppressed extension and the &lt;b&gt;triggerPoints&lt;/b&gt; expression of this extension are &lt;i&gt;enabled&lt;/i&gt; for a given element. Therefore, the &lt;b&gt;triggerPoints&lt;/b&gt; and &lt;b&gt;possibleChildren&lt;/b&gt; expressions of this extension should be a subset of the &lt;b&gt;triggerPoints&lt;/b&gt; and &lt;b&gt;possibleChildren&lt;/b&gt; expressions respectively of its suppressed extension.&lt;/li&gt;
-  &lt;li&gt;&lt;i&gt;InvokeAlwaysRegardlessOfSuppressedExt&lt;/i&gt; (default): Indicates that this extension is a first class extension; it should be given opportunities to contribute content regardless if its &lt;i&gt;suppressedExtensionId&lt;/i&gt; is &lt;i&gt;visible&lt;/i&gt; or &lt;i&gt;active&lt;/i&gt; to the viewer. Thus, the extension is a first-class extension and an overriding extension. It will be invoked whenever its &lt;b&gt;triggerPoints&lt;/b&gt; expression is matched. When the suppressed extension and its &lt;b&gt;triggerPoints&lt;/b&gt; extension is matched, it will be invoked with the contributed items from its suppressed extension; the suppressed extension will not be given an opportunity to directly contribute.&lt;/li&gt;
-&lt;/ul&gt;
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="InvokeOnlyIfSuppressedExtAlsoVisibleAndActive">
-                  </enumeration>
-                  <enumeration value="InvokeAlwaysRegardlessOfSuppressedExt">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="dropAssistant">
-      <annotation>
-         <documentation>
-            Provides a subclass of &lt;code&gt;org.eclipse.ui.navigator.CommonDropAdapterAssistant&lt;/code&gt; which can provide programatic validation for a drop operation, request additional transfer types, and handle the drop operation. 
-&lt;br&gt;&lt;br&gt;
-A &lt;b&gt;dropAssistant&lt;/b&gt; will be invoked whenever elements that are dragged match the &lt;b&gt;possibleChildren&lt;/b&gt; expression of the containing &lt;b&gt;navigatorContent&lt;/b&gt; extension &lt;i&gt;and&lt;/i&gt; the drop target of the operation is described by the &lt;b&gt;possibleDropTargets&lt;/b&gt; expression of the &lt;b&gt;dropAssistant&lt;/b&gt; element.
-&lt;br&gt;&lt;br&gt;
-An extension may have multiple drop adapters with mutually exclusive &lt;b&gt;possibleDropTargets&lt;/b&gt; expressions. The first drop adapter found that matches the given drop target and returns an OK status for &lt;code&gt;CommonDropAdapterAssistant.validateDrop(...)&lt;/code&gt; will be given an opportunity to handle the drop. 
-&lt;br&gt;&lt;br&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="possibleDropTargets"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id is used to refer to the drop assistant internally. The id should be unique.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  An implementation of &lt;code&gt;org.eclipse.ui.navigator.CommonDropAdapterAssistant&lt;/code&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.navigator.CommonDropAdapterAssistant"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="possibleDropTargets">
-      <annotation>
-         <documentation>
-            Describe the possible drop targets that a particular &lt;b&gt;dropAssistant&lt;/b&gt; can handle.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-            <element ref="reference"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.2
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         &lt;br&gt;
-&lt;h2&gt;Adding content&lt;/h2&gt;
-&lt;p&gt;
-The following example describes a content extension that 
-provides resource content. The &lt;b&gt;triggerPoints&lt;/b&gt; expression
-determines when this extension is initially invoked. If 
-a &lt;b&gt;viewerContentBinding&lt;/b&gt; matches this extension with
-the &quot;isRoot&quot; attribute set to true, then the extension
-will be used, regardless of whether the root element
-matches the &lt;b&gt;triggerPoints&lt;/b&gt; expression.   
-&lt;p&gt;
-&lt;pre&gt;
-&lt;extension  
-  point=&quot;org.eclipse.ui.navigator.navigatorContent&quot;&gt;
- &lt;navigatorContent
-            name=&quot;%resource.extension.name&quot;
-            priority=&quot;low&quot;
-            icon=&quot;icons/full/eview16/resource_persp.gif&quot;
-            activeByDefault=&quot;true&quot;
-               contentProvider=&quot;org.eclipse.ui.navigator.resources.internal.workbench.ResourceExtensionContentProvider&quot;
-               labelProvider=&quot;org.eclipse.ui.navigator.resources.internal.workbench.ResourceExtensionLabelProvider&quot;   
-               sorter=&quot;org.eclipse.ui.navigator.resources.internal.workbench.ResourceSorter&quot;
-            id=&quot;org.eclipse.ui.navigator.resourceContent&quot;&gt;         
-  &lt;triggerPoints&gt;
-           &lt;or&gt;         
-              &lt;instanceof 
-                    value=&quot;org.eclipse.core.resources.IWorkspaceRoot&quot; /&gt; 
-              &lt;instanceof
-                    value=&quot;org.eclipse.core.resources.IProject&quot; /&gt;  
-              &lt;instanceof  
-                     value=&quot;org.eclipse.core.resources.IFolder&quot; /&gt; 
-           &lt;/or&gt;
-  &lt;/triggerPoints&gt;
-        &lt;possibleChildren&gt;
-           &lt;or&gt;         
-              &lt;instanceof 
-                    value=&quot;org.eclipse.core.resources.IWorkspaceRoot&quot; /&gt; 
-              &lt;instanceof
-                    value=&quot;org.eclipse.core.resources.IProject&quot; /&gt; 
-              &lt;instanceof 
-                     value=&quot;org.eclipse.core.resources.IResource&quot; /&gt; 
-              &lt;instanceof  
-                     value=&quot;org.eclipse.core.resources.IFolder&quot; /&gt;
-              &lt;instanceof 
-                     value=&quot;org.eclipse.core.resources.IFile&quot; /&gt; 
-         &lt;/or&gt;
-     &lt;/possibleChildren&gt;
- &lt;/navigatorContent&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-&lt;h2&gt;Adding Actions&lt;/h2&gt;
-&lt;p&gt;
-Clients may use object or viewer contributions (see &lt;b&gt;org.eclipse.ui.popupMenus&lt;/b&gt;) to provide
-actions for their view. Sometimes, clients require a greater degree of flexibility than either
-of these approaches allow, and therefore the Common Navigator framework supports adding 
-action providers. &quot;Action providers&quot; subclass &lt;code&gt;org.eclipse.ui.actions.ActionGroup&lt;/code&gt;
-and have opportunities to fill the action bars and the menus based on different events 
-(selection and right click respectively).
-&lt;/p&gt;
-&lt;p&gt;
-Clients may either associate one or more action providers with a particular
-content extension, or declare the action providers as top level contributions, unassociated
-with any particular content extension. Top level action provideers must be associated with
-a particular instance of vierwer using the &lt;b&gt;org.eclipse.ui.navigator.viewer/viewerActionBinding&lt;/b&gt;
-extension point. Nested action providers are automatically bound to a viewer based on whether
-their containing content extension is also bound to the viewer 
-(see &lt;b&gt;org.eclipse.ui.navigator/viewerContentBinding&lt;/b&gt;). 
-&lt;p&gt;
-&lt;p&gt;
-The following example demonstrates both approaches. The &quot;TestNestedActionProvider&quot; will be 
-given an opporunity to contribute to the menu and &lt;code&gt;org.eclipse.ui.IActionBars&lt;/code&gt; only
-when the &quot;org.eclipse.ui.tests.navigator.testContent&quot; extension is &lt;i&gt;visible&lt;/i&gt; and &lt;i&gt;active&lt;/i&gt;.
-If the user deactivates the test extension from the &quot;Available customizations&quot; dialog, then the
-nested action provider will no longer be given the opportunity to contribute. 
-&lt;pre&gt;
-&lt;extension  
-  point=&quot;org.eclipse.ui.navigator.navigatorContent&quot;&gt; 
-      &lt;navigatorContent 
-            id=&quot;org.eclipse.ui.tests.navigator.testContent&quot; 
-            name=&quot;%test.navigator.extension&quot;
-            contentProvider=&quot;org.eclipse.ui.tests.navigator.extension.TestContentProvider&quot;
-            labelProvider=&quot;org.eclipse.ui.tests.navigator.extension.TestLabelProvider&quot;
-            activeByDefault=&quot;true&quot;
-            priority=&quot;normal&quot;&gt;
-         &lt;triggerPoints&gt;
-            &lt;instanceof value=&quot;org.eclipse.core.resources.IProject&quot;/&gt;
-         &lt;/triggerPoints&gt; 
-        &lt;actionProvider
-            class=&quot;org.eclipse.ui.tests.navigator.extension.TestNestedActionProvider&quot;
-            id=&quot;org.eclipse.ui.tests.navigator.extension.TestNestedActionProvider&quot;&gt;
-          &lt;enablement&gt;
-             &lt;instanceof value=&quot;org.eclipse.core.resources.IResource&quot;/&gt;
-          &lt;/enablement&gt;
-        &lt;/actionProvider&gt;
-      &lt;/navigatorContent&gt;  
-        &lt;actionProvider
-             class=&quot;org.eclipse.ui.navigator.resources.internal.actions.NewActionProvider&quot;
-             id=&quot;org.eclipse.ui.navigator.resources.NewActions&quot;&gt; 
-         &lt;enablement&gt;
-    &lt;or&gt;
-     &lt;adapt type=&quot;org.eclipse.core.resources.IFile&quot; /&gt; 
-     &lt;adapt type=&quot;org.eclipse.core.resources.IFolder&quot; /&gt;
-            &lt;adapt type=&quot;org.eclipse.core.resources.IProject&quot; /&gt; 
-                 &lt;adapt type=&quot;org.eclipse.core.resources.IWorkspaceRoot&quot; /&gt; 
-    &lt;/or&gt;
-          &lt;/enablement&gt;
-  &lt;/actionProvider&gt;
-&lt;/extension&gt;  
-&lt;/pre&gt;
-&lt;/p&gt;
-
-
-&lt;p&gt;
-Clients may define filters using either subclasses of &lt;code&gt;org.eclipse.jface.viewers.ViewerFilter&lt;/code&gt; 
-or through Eclipse core expressions. The folowing example demonstrates both techniques. Clients may 
-only use of the two options. Extensions that specify both in error will result in only the core
-expression filter being respected. The name and description fields are translateable, and should externalized
-strings in real environments.
-
-&lt;p&gt;
-&lt;pre&gt;
-&lt;extension  
-  point=&quot;org.eclipse.ui.navigator.navigatorContent&quot;&gt;
- &lt;commonFilter
-      class=&quot;org.eclipse.ui.tests.navigator.extension.TestItemsThatEndIn3&quot;
-            description=&quot;Hide TestItem objects that end in the number &amp;quot;3&amp;quot;&quot;
-            id=&quot;org.eclipse.ui.tests.navigator.filters.TestItemsThatEndWith3&quot;
-            name=&quot;TestItems that end with &amp;quot;3&amp;quot;&quot;
-            activeByDefault=&quot;true&quot;
-            /&gt; 
- &lt;commonFilter
-            description=&quot;Hides all instances of Test Item&quot;
-            id=&quot;org.eclipse.ui.tests.navigator.filters.AllTestItems&quot;
-            name=&quot;A TestItem Exp Filter (should be sorted alphab..)&quot;&gt;
-         &lt;filterExpression&gt;
-            &lt;instanceof value=&quot;org.eclipse.ui.tests.navigator.extension.TestExtensionTreeData&quot;/&gt;
-         &lt;/filterExpression&gt;
- &lt;/commonFilter&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-&lt;/p&gt;
-
-&lt;p&gt;
-A common sorter is determined for a set of children based on their parent. The sorter class
-must subclass the &lt;code&gt;org.eclipse.jface.viewers.ViewerSorter&lt;/code&gt;. 
-&lt;p&gt;
-&lt;pre&gt;
-
-&lt;extension  
-  point=&quot;org.eclipse.ui.navigator.navigatorContent&quot;&gt;
- &lt;commonSorter
-      class=&quot;org.eclipse.ui.navigator.resources.internal.workbench.ResourceExtensionSorter&quot;
-            id=&quot;org.eclipse.ui.navigator.resources.sorters.defaultSorter&quot;&gt;
-  &lt;parentExpression&gt;
-         &lt;or&gt;         
-       &lt;instanceof 
-           value=&quot;org.eclipse.core.resources.IWorkspaceRoot&quot; /&gt; 
-          &lt;instanceof
-           value=&quot;org.eclipse.core.resources.IProject&quot; /&gt; 
-          &lt;instanceof 
-           value=&quot;org.eclipse.core.resources.IResource&quot; /&gt; 
-          &lt;instanceof  
-           value=&quot;org.eclipse.core.resources.IFolder&quot; /&gt;
-          &lt;instanceof 
-           value=&quot;org.eclipse.core.resources.IFile&quot; /&gt; 
-   &lt;/or&gt;
-  &lt;/parentExpression&gt;
- &lt;/commonSorter&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-&lt;p&gt;
-The following example demonstrates how to add wizard shortcut actions for 
-&quot;New Folder&quot; and &quot;New File&quot;, which are enabled on the specific subclasses 
-of org.eclipse.core.resources.IResource. Clients may use whatever parts of 
-the &lt;b&gt;org.eclipse.core.expressions&lt;/b&gt; that are necessary to describe when the 
-menu options should be available. The wizardId specified below must correspond
-to one of the &lt;b&gt;org.eclipse.ui.xxxWizards&lt;/b&gt; extension points.
-&lt;/p&gt;
-&lt;p&gt;
-For clients building their own viewers or
-view parts, be sure to use &lt;code&gt;org.eclipse.ui.navigator.WizardActionGroup&lt;/code&gt;
-to correctly populate the menu. See that class for more documentation on
-using this feature.
-&lt;/p&gt;
-&lt;p&gt;
-&lt;pre&gt;
-
-&lt;extension  
-  point=&quot;org.eclipse.ui.navigator.navigatorContent&quot;&gt;
- &lt;commonWizard
-      type=&quot;new&quot;
-   wizardId=&quot;org.eclipse.ui.wizards.new.folder&quot;&gt;
-  &lt;enablement&gt;
-   &lt;or&gt;
-    &lt;adapt type=&quot;org.eclipse.core.resources.IFile&quot; /&gt; 
-    &lt;adapt type=&quot;org.eclipse.core.resources.IFolder&quot; /&gt;
-           &lt;adapt type=&quot;org.eclipse.core.resources.IProject&quot; /&gt; 
-             &lt;adapt type=&quot;org.eclipse.core.resources.IWorkspaceRoot&quot; /&gt; 
-   &lt;/or&gt;
-  &lt;/enablement&gt;
- &lt;/commonWizard&gt;   
- &lt;commonWizard
-            type=&quot;new&quot;
-            wizardId=&quot;org.eclipse.ui.wizards.new.file&quot;&gt;
-  &lt;enablement&gt;
-   &lt;or&gt;
-    &lt;adapt type=&quot;org.eclipse.core.resources.IFile&quot; /&gt; 
-    &lt;adapt type=&quot;org.eclipse.core.resources.IFolder&quot; /&gt;
-           &lt;adapt type=&quot;org.eclipse.core.resources.IProject&quot; /&gt; 
-             &lt;adapt type=&quot;org.eclipse.core.resources.IWorkspaceRoot&quot; /&gt; 
-   &lt;/or&gt;
-  &lt;/enablement&gt;
- &lt;/commonWizard&gt;
-&lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2006, 2008 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui.navigator/schema/viewer.exsd b/bundles/org.eclipse.ui.navigator/schema/viewer.exsd
deleted file mode 100644
index dfcaef9..0000000
--- a/bundles/org.eclipse.ui.navigator/schema/viewer.exsd
+++ /dev/null
@@ -1,622 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.navigator">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui.navigator" id="viewer" name="Common Viewer Configuration"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;
-The &lt;b&gt;viewer&lt;/b&gt; element defines the configuration for a common viewer. The extension
-may provide a custom popup menu id, override whether the viewer provides link with
-editor support, provides a filter dialog, and/or provides an &quot;Available customizations&quot; 
-dialog. In addition, nested configuration elements give full control over the structure
-and behavior of the popup context menu.
-&lt;p&gt;
-&lt;b&gt;viewerContentBinding&lt;/b&gt; binds defined content extensions (through the &lt;b&gt;navigatorContent&lt;/b&gt; 
-extension point) to viewers (defined through the 
-&lt;b&gt;org.eclipse.ui.views&lt;/b&gt; extension point). &lt;b&gt;viewerContentBinding&lt;/b&gt; also binds a 
-&lt;b&gt;linkHelper&lt;/b&gt; extension point to a viewer.  
-Any content extension bound to a viewer is described as &lt;i&gt;visible&lt;/i&gt;. A
-content service (&lt;code&gt;org.eclipse.ui.navigator.INavigatorContentService&lt;/code&gt;)
-will not return any extensions which are not visible for
-its viewer id.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="viewer" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="viewerContentBinding" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="viewerActionBinding" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="dragAssistant" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="viewer">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="id"/>
-         </appInfo>
-         <documentation>
-            Provides basic configuration to establish the characteristics of a viewer. Clients must also define an &lt;b&gt;org.eclipse.ui.views&lt;/b&gt; extension to create the view part.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="popupMenu" minOccurs="0" maxOccurs="1"/>
-            <element ref="options" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="viewerId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id that matches the id provides in an &lt;b&gt;org.eclipse.ui.views&lt;/b&gt; extension.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="popupMenuId" type="string">
-            <annotation>
-               <documentation>
-                  The popupMenuId of the defined viewer. If not specified, the popupMenuId defaults to the id of the viewer. Clients may specify only the &quot;popupMenuId&quot; OR a &lt;b&gt;popupMenu&lt;/b&gt; element, but not both. The default list of insertion points is declared in the documentation for the &lt;b&gt;popupMenu&lt;/b&gt; element.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="viewerContentBinding">
-      <annotation>
-         <documentation>
-            Clients must define one or more &lt;b&gt;viewerContentBinding&lt;/b&gt; elements to describe which content extensions, common filters, and link helpers are &lt;i&gt;visible&lt;/i&gt; to the viewer. A content extension or common filter is &lt;i&gt;visible&lt;/i&gt; if the id of the content extension or common filter matches an &lt;b&gt;includes&lt;/b&gt; statement under a &lt;b&gt;viewerContentBinding&lt;/b&gt; and is not excluded by an &lt;b&gt;excludes&lt;/b&gt; statement. If a content extension or common filter is not &lt;i&gt;visible&lt;/i&gt; to a viewer, then the extension will never be asked for content by a content service for that viewer or be presented to the user in the available filters dialog. 
-&lt;br&gt;&lt;br&gt;
-Clients may define an &lt;b&gt;includes&lt;/b&gt; element to select which extensions are &lt;i&gt;visible&lt;/i&gt; to the viewer, and similarly an &lt;b&gt;excludes&lt;/b&gt; element for extensions that should not be made &lt;i&gt;visible&lt;/i&gt; to the viewer. Clients may further define the extensions that should be explicitly queried for root elements (through  ITreeContentProvider.getElements()) by the &quot;isRoot&quot; attribute. If one or more &lt;b&gt;contentExtension&lt;/b&gt; elements have &quot;isRoot&quot; set to true within the &lt;b&gt;includes&lt;/b&gt; statement, only those extensions will be queried for root elements. The &quot;isRoot&quot; attribute has no effect for exclusions.
-&lt;br&gt;&lt;br&gt;
-A viewer may have multiple viewerContentBindings defined, and their includes/excludes statements will be aggregated to produce the final behavior.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="includes" minOccurs="0" maxOccurs="1"/>
-            <element ref="excludes" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="viewerId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  There should be a corresponding &lt;b&gt;org.eclipse.ui.views&lt;/b&gt; extension that corresponds to this Id. That extension should specify an instance of &lt;code&gt;org.eclipse.ui.navigator.CommonNavigator&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="viewerActionBinding">
-      <annotation>
-         <documentation>
-            Clients must define which action providers are visible to their viewer. Clients may define an &lt;b&gt;includes&lt;/b&gt; element to select which extensions are visible to the viewer, and  similarly an &lt;b&gt;excludes&lt;/b&gt; element for extensions that should not be made visible to the viewer. 
-&lt;br&gt;&lt;br&gt;
-A viewer may have multiple &lt;b&gt;viewerActionBinding&lt;/b&gt;s defined, and their &lt;b&gt;includes&lt;/b&gt;/&lt;b&gt;excludes&lt;/b&gt; statements will be aggregated to produce the final behavior.
-&lt;br&gt;&lt;br&gt;
-For &lt;b&gt;actionProvider&lt;/b&gt; definitions which are not nested under a &lt;b&gt;navigatorContent&lt;/b&gt; definition, clients may specify a custom id. If clients do not specify an id, the id defaults to &quot;org.eclipse.ui.navigator.actionProvider.X&quot;. For clients that wish to pick up &lt;b&gt;actionProvider&lt;/b&gt;s with no specific id, clients must define a &lt;b&gt;viewerActionBinding&lt;/b&gt; for the default id. See the examples section for how this is done.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="includes" minOccurs="0" maxOccurs="1"/>
-            <element ref="excludes" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="viewerId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  There should be a corresponding &lt;b&gt;org.eclipse.ui.views&lt;/b&gt; extension that corresponds to this Id. That extension should specify an instance of &lt;code&gt;org.eclipse.ui.navigator.CommonNavigator&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="includes">
-      <annotation>
-         <documentation>
-            Define a set of patterns that should be included when looking for content extensions for the viewer that matches the &quot;viewerId&quot; attribute. When the includes and excludes statements intersect, the excludes statement will be given precedence.
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice>
-            <sequence>
-               <element ref="contentExtension" minOccurs="1" maxOccurs="unbounded"/>
-            </sequence>
-            <sequence>
-               <element ref="actionExtension" minOccurs="1" maxOccurs="unbounded"/>
-            </sequence>
-         </choice>
-      </complexType>
-   </element>
-
-   <element name="excludes">
-      <annotation>
-         <documentation>
-            Define a set of patterns that should be excluded when looking for content extensions for the viewer that matches the &quot;viewerId&quot; attribute. When the includes and excludes statements intersect, the excludes statement will be given precedence.
-            To be meaningful this will be a subset of the includes pattern.
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice>
-            <sequence>
-               <element ref="contentExtension" minOccurs="1" maxOccurs="unbounded"/>
-            </sequence>
-            <sequence>
-               <element ref="actionExtension" minOccurs="1" maxOccurs="unbounded"/>
-            </sequence>
-         </choice>
-      </complexType>
-   </element>
-
-   <element name="contentExtension">
-      <annotation>
-         <documentation>
-            Indicates the id (or matching pattern) of a content extension that should be queried by &lt;code&gt;ITreeContentProvider.getElements()&lt;/code&gt; or &lt;code&gt;ITreeContentProvider.getChildren()&lt;/code&gt;
-for the root of the viewer or a common filter that should be available to the user in the &quot;Available Filters&quot; dialog.
-&lt;br&gt;&lt;br&gt;
-Clients may specify &quot;isRoot&quot; to select specific root extensions to override 
-the extensions which would otherwise be enabled for the viewer input element
-(based on the matching &lt;b&gt;triggerPoints&lt;/b&gt; expression for the viewer input element). 
-&lt;br&gt;&lt;br&gt;
-See the documentation for &lt;b&gt;viewerContentBinding&lt;/b&gt; for more information.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="pattern" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Content extensions may be selected exactly by using their content extension id. Clients may also use a regular expression pattern to select any content extensions that have ids that match the pattern. 
-&lt;p&gt;
-Patterns are regular expressions which match unique identifiers. Please see the Java(tm) Platform documentation for &lt;code&gt;java.util.regex.Pattern&lt;/code&gt; for further details.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="isRoot" type="boolean">
-            <annotation>
-               <documentation>
-                  A value of true indicates the content extension will provide root content, and override the default &lt;b&gt;triggerPoints&lt;/b&gt; expressions defined in the bound content extensions for a given viewer.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="actionExtension">
-      <annotation>
-         <documentation>
-            Indicates that the action extension that should be given opportunities
-to contribute to the context menu and action bars. 
-&lt;br&gt;&lt;br&gt;          
-See the documentation for &lt;b&gt;viewerActionBinding&lt;/b&gt; for more information.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="pattern" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Content extensions may be selected exactly by using their content extension id. Clients may also use a regular expression pattern to select any content extensions that have ids that match the pattern. 
-&lt;p&gt;
-Patterns are regular expressions which match unique identifiers. Please see the Java(tm) Platform documentation for &lt;code&gt;java.util.regex.Pattern&lt;/code&gt; for further details.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="popupMenu">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="id"/>
-         </appInfo>
-         <documentation>
-            A popupMenu element may only be defined if the &quot;popupMenuId&quot; attribute of the 
-&lt;b&gt;viewer&lt;/b&gt; element is not specified. 
-&lt;br&gt;&lt;br&gt;
-The &lt;b&gt;popupMenu&lt;/b&gt; element allows further customization of the context menu associated 
-with the viewer. For the options to be applied correctly, an instance of the viewer
-must delegate to a &lt;code&gt;org.eclipse.ui.navigator.NavigatorActionService&lt;/code&gt;, which behaves
-like a normal &lt;code&gt;org.eclipse.ui.ActionGroup&lt;/code&gt;. See the documentation for this API class
-for more information on exploiting this functionality. For clients that use an 
-instance of &lt;code&gt;org.eclipse.ui.navigator.CommonNavigator&lt;/code&gt; do not need to do any extra work. 
-&lt;br&gt;&lt;br&gt;
-A &lt;b&gt;popupMenu&lt;/b&gt; declares one or more &lt;b&gt;insertionPoints&lt;/b&gt; that will be used by contributors to 
-organize their contributions into a meaningful, more user-friendly, consistent list. 
-&lt;br&gt;
-If clients only specify the &quot;popupMenuId&quot; attribute of the &lt;b&gt;viewer&lt;/b&gt; element, then the
-set of &lt;b&gt;insertionPoints&lt;/b&gt; used by the context menu will default to the following list 
-in the given order:
-&lt;br&gt;
-&lt;pre&gt;
-&quot;group.new&quot;             separator=&quot;true&quot;
-&quot;group.goto&quot;            
-&quot;group.open&quot;            separator=&quot;true&quot;
-&quot;group.openWith&quot;
-&quot;group.show&quot;            separator=&quot;true&quot;
-&quot;group.edit&quot;            separator=&quot;true&quot;
-&quot;group.reorganize&quot;
-&quot;group.port&quot;
-&quot;group.generate&quot;        separator=&quot;true&quot;
-&quot;group.search&quot;          separator=&quot;true&quot;
-&quot;group.build&quot;           separator=&quot;true&quot;
-&quot;additions&quot;             separator=&quot;true&quot; 
-&quot;group.properties&quot;      separator=&quot;true&quot;
-&lt;/pre&gt;
-&lt;br&gt;&lt;br&gt;
-Clients that wish to refer to these values programmatically may use the corresponding constants in &lt;code&gt;org.eclipse.ui.navigator.ICommonMenuConstants&lt;/code&gt;. 
-&lt;br&gt;&lt;br&gt;
-Clients that wish to customize their menus are encouraged to start with this list and add or remove insertion points as necessary. Clients are also
-encouraged to follow the pattern of beginning each group name with &quot;group.&quot;. 
-&lt;br&gt;&lt;br&gt;
-If the &lt;b&gt;popupMenu&lt;/b&gt; element is specified and contains NO &lt;b&gt;insertionPoint&lt;/b&gt; children elements, then the context menu will have no published insertion points. Of course, programmatic clients are not restricted from adding their own insertion points as necessary. Clients defining viewers are encouraged to publish their insertion points for documentation purposes and clarity for downstream extensions to their viewers/navigators, or to explicitly document which insertion points are considered API and which are considered internal.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="insertionPoint" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  The id of the menu. Has the same function as the &quot;popupMenuId&quot; attribute of &lt;b&gt;viewer&lt;/b&gt;, but if a &lt;b&gt;popupMenu&lt;/b&gt; nested element is used, you must use this &quot;popupMenuId&quot; attribute and NOT specify the &quot;popupMenuId&quot; of &lt;b&gt;viewer&lt;/b&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="allowsPlatformContributions" type="boolean">
-            <annotation>
-               <documentation>
-                  A value of &lt;b&gt;true&lt;/b&gt; will register the declared &lt;b&gt;popupMenu&lt;/b&gt; (by id) for object or viewer contributions as declared by the &lt;b&gt;org.eclipse.ui.popupMenus&lt;/b&gt; extension point. A value of &lt;b&gt;false&lt;/b&gt; will restrict the popupMenu to programmatic contributions as declared by &lt;code&gt;org.eclipse.ui.navigator.CommonActionProviders&lt;/code&gt; (see &lt;b&gt;org.eclipse.ui.navigator.navigatorContent/actionProvider&lt;/b&gt; and &lt;b&gt;org.eclipse.ui.navigator.navigatorContent/navigatorContent/actionProvider&lt;/b&gt;).
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="insertionPoint">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="name"/>
-         </appInfo>
-         <documentation>
-            Defines an insertion point for the context menu. Indcludes the name of the point for clients to refer to, and whether the insertion point should be rendered as a separator or a group marker.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Indicates the name of the insertion point. Clients will use the name to refer to the insertion point as part of a menu path when providing either programmatic contributions via &lt;code&gt;org.eclipse.ui.navigator.CommonActionProvider&lt;/code&gt; or declarative contributions via the &lt;b&gt;org.eclipse.ui.popupMenus&lt;/b&gt; extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="separator" type="boolean">
-            <annotation>
-               <documentation>
-                  A value of true will cause the insertion point to be represented as a bar in the menu. This allows clients to visually group items in the context menu, based on their relevance to the user. By default, the value is &lt;b&gt;false&lt;/b&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="options">
-      <annotation>
-         <documentation>
-            Provide options to the viewer to custom how it is presented to the user. See &lt;code&gt;org.eclipse.ui.navigator.INavigatorViewerDescriptor&lt;/code&gt; for the available properties.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="property" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-      </complexType>
-   </element>
-
-   <element name="property">
-      <annotation>
-         <documentation>
-            Provide a name=value pair. The value will be provided as-is to the viewer (so empty strings will be propagated as empty strings). See &lt;code&gt;org.eclipse.ui.navigator.INavigatorViewerDescriptor&lt;/code&gt; for the available properties and their descriptions.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="dragAssistant">
-      <annotation>
-         <documentation>
-            A Drag and Drop assistant provides lightweight hook to supply extra transfer types and logic to set the drag data. This element is not required as the basic &lt;b&gt;org.eclipse.ui.navigator.CommonViewer&lt;/b&gt; provides a &lt;b&gt;org.eclipse.jface.util.LocalSelectionTransfer&lt;/b&gt; type. 
-&lt;br&gt;&lt;br&gt;
-&lt;b&gt;
-Clients should only define this extension in lightweight plugins with shallow dependency trees. The drag assistants must be loaded up front when the viewer is created, which will force the load of affected plugins. 
-&lt;/b&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Provide an implementation of &lt;code&gt;org.eclipse.ui.navigator.CommonDragAdapterAssistant&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.navigator.CommonDragAdapterAssistant"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="viewerId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Associate this drag assistant with a particular viewer id.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.2
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;
-The following example configures the popup menu id for a viewer.      
-&lt;p&gt;
-&lt;pre&gt;
-
-   &lt;extension
-         point=&quot;org.eclipse.ui.navigator.viewer&quot;&gt;
-      &lt;viewer 
-         id=&quot;org.eclipse.testViewer&quot; 
-         popupMenuId=&quot;org.eclipse.testViewer#PopupMenu&quot;/&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-Since the &lt;b&gt;popupMenu&lt;/b&gt; child element of viewer is not used in the above example, the default set of
-&lt;b&gt;insertionPoints&lt;/b&gt; will be used. This set is defined as follows. See the documentation for
-the &lt;b&gt;popupMenu&lt;/b&gt; element for more information.
-&lt;p&gt;
-&lt;pre&gt;
-&quot;group.new&quot;             separator=&quot;true&quot;
-&quot;group.goto&quot;            
-&quot;group.open&quot;            separator=&quot;true&quot;
-&quot;group.openWith&quot;
-&quot;group.show&quot;            separator=&quot;true&quot;
-&quot;group.edit&quot;            separator=&quot;true&quot;
-&quot;group.reorganize&quot;
-&quot;group.port&quot;
-&quot;group.generate&quot;        separator=&quot;true&quot;
-&quot;group.search&quot;          separator=&quot;true&quot;
-&quot;group.build&quot;           separator=&quot;true&quot;
-&quot;additions&quot;             separator=&quot;true&quot; 
-&quot;group.properties&quot;      separator=&quot;true&quot;
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-The following example demonstrates a viewer configuration which declares custom
-&lt;b&gt;popupMenu/insertionPoints&lt;/b&gt;, but restricts object and viewer contributions
-with the &quot;allowsPlatformContributions&quot; attribute. Clients may only contribute
-to the defined menu via &lt;code&gt;org.eclipse.ui.navigator.CommonActionProvider&lt;/code&gt;s declared
-for the viewer (either top-level or associated with content extensions). 
-&lt;p&gt;
-Note that the &quot;popupMenuId&quot; attribute is not concurrently specified with the 
-&lt;b&gt;popupMenu&lt;/b&gt; element. Only one or the other, but not both, is a valid configuration.
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.ui.navigator.viewer&quot;&gt;
-       &lt;viewer
-             viewerId=&quot;org.eclipse.ui.navigator.resourceContent&quot;&gt;
-          &lt;popupMenu
-                allowsPlatformContributions=&quot;false&quot;
-                id=&quot;org.eclipse.ui.navigator.resourceContent#PopupMenu&quot;&gt;  
-             &lt;insertionPoint name=&quot;group.new&quot;/&gt;
-             &lt;insertionPoint
-                   name=&quot;group.open&quot;
-                   separator=&quot;true&quot;/&gt;
-             &lt;insertionPoint name=&quot;group.openWith&quot;/&gt;             
-             &lt;insertionPoint
-                   name=&quot;group.port&quot;
-                   separator=&quot;true&quot;/&gt; 
-             &lt;insertionPoint
-                   name=&quot;additions&quot;
-                   separator=&quot;true&quot;/&gt;              
-             &lt;insertionPoint
-                   name=&quot;group.properties&quot;
-                   separator=&quot;true&quot;/&gt;
-          &lt;/popupMenu&gt;
-       &lt;/viewer&gt;
-       &lt;viewerContentBinding 
-             viewerId=&quot;org.eclipse.ui.navigator.resourceContent&quot;&gt;
-            &lt;includes&gt;
-                &lt;contentExtension pattern=&quot;org.eclipse.ui.navigator.resourceContent&quot; /&gt;
-            &lt;/includes&gt;
-       &lt;/viewerContentBinding&gt;
-   &lt;/extension&gt;
-
-&lt;/pre&gt;
-&lt;/p&gt;
-
-&lt;p&gt;
-The following example declares that one content extension (id: &quot;org.eclipse.ui.navigator.resourceContent&quot;) is bound to a viewer matching the id &quot;org.eclipse.ui.navigator.resourceContent&quot;. (In this example the content extension and viewer ids match, but this is not required.) 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.ui.navigator.viewer&quot;&gt;
-       &lt;viewerContentBinding 
-             viewerId=&quot;org.eclipse.ui.navigator.resourceContent&quot;&gt;
-            &lt;includes&gt;
-                &lt;contentExtension pattern=&quot;org.eclipse.ui.navigator.resourceContent&quot; /&gt;
-            &lt;/includes&gt;
-       &lt;/viewerContentBinding&gt;
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-The following example declares a &lt;b&gt;viewerActionBinding&lt;/b&gt; for all &lt;b&gt;actionProvider&lt;/b&gt;s (not 
-nested under a &lt;b&gt;navigatorContent&lt;/b&gt; extension) that match the regular expression
-&quot;org.acme.actions.*&quot; but not &quot;org.acme.actions.tests.*&quot;. This expression 
-will make any &lt;b&gt;actionProvider&lt;/b&gt; whose id begins with &quot;org.acme.actions.&quot; but not &quot;org.acme.actions.tests.&quot; &lt;i&gt;visible&lt;/i&gt; to the viewer with the id &quot;org.acme.viewer&quot;.
-Of course, the &lt;b&gt;viewerActionBindings&lt;/b&gt; only apply to &lt;b&gt;actionProvider&lt;/b&gt; elements that 
-are not nested under a &lt;b&gt;navigatorContent&lt;/b&gt; element. The &lt;i&gt;visibility&lt;/i&gt; of nested 
-&lt;b&gt;actionProvider&lt;/b&gt; elements is controlled by &lt;b&gt;viewerContentBindings&lt;/b&gt; for the enclosing
-&lt;b&gt;navigatorContent&lt;/b&gt; element.
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.ui.navigator.viewer&quot;&gt;
-       &lt;viewerActionBinding 
-             viewerId=&quot;org.acme.viewer&quot;&gt;
-            &lt;includes&gt;
-                &lt;actionExtension pattern=&quot;org.acme.actions.*&quot; /&gt;
-            &lt;/includes&gt;
-            &lt;excludes&gt;
-                &lt;actionExtension pattern=&quot;org.acme.actions.tests.*&quot; /&gt;
-            &lt;/excludes&gt;
-       &lt;/viewerActionBinding&gt;
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-The following example makes any actionProvider with no &quot;id&quot; attribute &lt;i&gt;visible&lt;/i&gt;
-to the viewer &quot;org.acme.viewer&quot;. The &lt;b&gt;actionProvider&lt;/b&gt;s with no &quot;id&quot; attribute
-have a default id of &quot;org.eclipse.ui.navigator.actionProvider.X&quot;. Of course,
-the &lt;b&gt;viewerActionBindings&lt;/b&gt; only apply to &lt;b&gt;actionProvider&lt;/b&gt; elements that 
-are not nested under a &lt;b&gt;navigatorContent&lt;/b&gt; element. The &lt;i&gt;visibility&lt;/i&gt; of nested 
-&lt;b&gt;actionProvider&lt;/b&gt; elements is controlled by &lt;b&gt;viewerContentBinding&lt;/b&gt;s for the enclosing
-&lt;b&gt;navigatorContent&lt;/b&gt; element.
-
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.ui.navigator.viewer&quot;&gt;
-       &lt;viewerActionBinding 
-             viewerId=&quot;org.acme.viewer&quot;&gt;
-            &lt;includes&gt;
-                &lt;actionExtension pattern=&quot;org.eclipse.ui.navigator.actionProvider.*&quot; /&gt;
-            &lt;/includes&gt; 
-       &lt;/viewerActionBinding&gt;
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-
-&lt;p&gt;
-The following example demonstrates the standard properties available to the viewer.
-&lt;/p&gt;
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.ui.navigator.viewer&quot;&gt;
-      &lt;viewer
-            popupMenuId=&quot;org.eclipse.ui.tests.navigator.TestView#PopupMenu&quot;
-            viewerId=&quot;org.eclipse.ui.tests.navigator.TestView&quot;&gt;
-         &lt;options&gt; 
-            &lt;!-- Hide the &quot;Available Extensions&quot; tab in the &quot;Available Customizations&quot; 
-                 dialog (available from the &quot;Filters&quot; action --&gt;
-            &lt;property
-                  name=&quot;org.eclipse.ui.navigator.hideAvailableExtensionsTab&quot;
-                  value=&quot;true&quot;/&gt;
-            &lt;!-- Hide the &quot;Available Customizations&quot; dialog completely. This includes hiding the 
-              filters and the available content extensions. --&gt;
-            &lt;property
-                  name=&quot;org.eclipse.ui.navigator.hideAvailableCustomizationsDialog&quot;
-                  value=&quot;true&quot;/&gt; 
-            &lt;!-- Hide the &quot;Link with Editor&quot; action from the toolbar of the viewer --&gt;
-            &lt;property
-                  name=&quot;org.eclipse.ui.navigator.hideLinkWithEditorAction&quot;
-                  value=&quot;true&quot;/&gt; 
-            &lt;!-- Hide the &quot;Collapse All&quot; action from the toolbar of the viewer --&gt;
-            &lt;property
-                  name=&quot;org.eclipse.ui.navigator.hideCollapseAllAction&quot;
-                  value=&quot;true&quot;/&gt;  
-         &lt;/options&gt;
-      &lt;/viewer&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2002, 2008 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui.navigator/scripts/src.jardesc b/bundles/org.eclipse.ui.navigator/scripts/src.jardesc
deleted file mode 100644
index 36c3da5..0000000
--- a/bundles/org.eclipse.ui.navigator/scripts/src.jardesc
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<jardesc>
-	<jar path="C:/dev/workspaces/general-purpose-navigator/org.eclipse.ui.views.navigator/navigator.jar"/>
-	<options compress="true"
-		descriptionLocation="/org.eclipse.ui.views.navigator/scripts/src.jardesc"
-		exportErrors="true" exportWarnings="true" logErrors="true"
-		logWarnings="true" overwrite="false" saveDescription="true" useSourceFolders="false"/>
-	<manifest generateManifest="false"
-		manifestLocation="/org.eclipse.ui.views.navigator/src/META-INF/MANIFEST.MF"
-		manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="false">
-		<sealing sealJar="false"><packagesToSeal/><packagesToUnSeal/></sealing>
-	</manifest>
-	<selectedElements exportClassFiles="true" exportJavaFiles="false">
-		<javaElement handleIdentifier="=org.eclipse.ui.views.navigator/src"/>
-	</selectedElements>
-</jardesc>
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/AdaptabilityUtility.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/AdaptabilityUtility.java
deleted file mode 100644
index 68d858a..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/AdaptabilityUtility.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.PlatformObject;
-
-/**
- * Provides utilities for working with adaptable and non-adaptable objects.
- * 
- * @since 3.2
- */
-public class AdaptabilityUtility {
-
-	/**
-	 * <p>
-	 * Returns an adapter of the requested type (anAdapterType)
-	 * 
-	 * @param anElement
-	 *            The element to adapt, which may or may not implement
-	 *            {@link IAdaptable}, or null
-	 * @param anAdapterType
-	 *            The class type to return
-	 * @return An adapter of the requested type or null
-	 */
-	public static Object getAdapter(Object anElement, Class anAdapterType) {
-		Assert.isNotNull(anAdapterType);
-        if (anElement == null) {
-            return null;
-        }
-        if (anAdapterType.isInstance(anElement)) {
-            return anElement;
-        }
-
-        if (anElement instanceof IAdaptable) {
-            IAdaptable adaptable = (IAdaptable) anElement;
-
-            Object result = adaptable.getAdapter(anAdapterType);
-            if (result != null) {
-                // Sanity-check
-                Assert.isTrue(anAdapterType.isInstance(result));
-                return result;
-            }
-        } 
-        
-        if (!(anElement instanceof PlatformObject)) {
-            Object result = Platform.getAdapterManager().getAdapter(anElement, anAdapterType);
-            if (result != null) {
-                return result;
-            }
-        }
-
-        return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonNavigatorActionGroup.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonNavigatorActionGroup.java
deleted file mode 100644
index d70b5aa..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonNavigatorActionGroup.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.commands.ActionHandler;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.ui.handlers.CollapseAllHandler;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.internal.navigator.actions.CollapseAllAction;
-import org.eclipse.ui.internal.navigator.actions.LinkEditorAction;
-import org.eclipse.ui.internal.navigator.extensions.LinkHelperService;
-import org.eclipse.ui.internal.navigator.filters.FilterActionGroup;
-import org.eclipse.ui.navigator.CommonNavigator;
-import org.eclipse.ui.navigator.CommonViewer;
-import org.eclipse.ui.navigator.INavigatorViewerDescriptor;
-
-/**
- * 
- * 
- * @since 3.2
- */
-public class CommonNavigatorActionGroup extends ActionGroup {
-
-	private LinkEditorAction toggleLinkingAction;
-
-	private CollapseAllAction collapseAllAction;
-
-	private FilterActionGroup filterGroup;
-
-	private final CommonViewer commonViewer;
-
-	private CommonNavigator commonNavigator;
-
-	private final LinkHelperService linkHelperService;
-
-	private CollapseAllHandler collapseAllHandler;
-
-	/**
-	 * Create a action group for Collapse All, Link with editor, and Select
-	 * Filters.
-	 * 
-	 * @param aNavigator
-	 *            The IViewPart for this action group
-	 * @param aViewer
-	 *            The Viewer for this action group
-	 * @param linkHelperService the link service helper
-	 */
-	public CommonNavigatorActionGroup(CommonNavigator aNavigator,
-			CommonViewer aViewer, LinkHelperService linkHelperService) {
-		super();
-		commonNavigator = aNavigator;
-		commonViewer = aViewer;
-		this.linkHelperService = linkHelperService;
-		makeActions();
-	}
-
-	/**
-	 * Returns the image descriptor with the given relative path.
-	 */
-	protected final ImageDescriptor getImageDescriptor(String relativePath) {
-		return NavigatorPlugin.getImageDescriptor("icons/full/" + relativePath); //$NON-NLS-1$
-
-	}
-
-	/**
-	 * 
-	 */
-	private void makeActions() {
-		IHandlerService service = (IHandlerService) commonNavigator.getSite()
-				.getService(IHandlerService.class);
-
-		INavigatorViewerDescriptor viewerDescriptor = commonViewer
-				.getNavigatorContentService().getViewerDescriptor();
-		boolean hideLinkWithEditorAction = viewerDescriptor
-				.getBooleanConfigProperty(INavigatorViewerDescriptor.PROP_HIDE_LINK_WITH_EDITOR_ACTION);
-		if (!hideLinkWithEditorAction) {
-			toggleLinkingAction = new LinkEditorAction(commonNavigator,
-					commonViewer, linkHelperService);
-			ImageDescriptor syncIcon = getImageDescriptor("elcl16/synced.gif"); //$NON-NLS-1$
-			toggleLinkingAction.setImageDescriptor(syncIcon);
-			toggleLinkingAction.setHoverImageDescriptor(syncIcon);
-			service.activateHandler(toggleLinkingAction.getActionDefinitionId(),
-					new ActionHandler(toggleLinkingAction));
-		}
-
-		boolean hideCollapseAllAction = viewerDescriptor
-				.getBooleanConfigProperty(INavigatorViewerDescriptor.PROP_HIDE_COLLAPSE_ALL_ACTION);
-		if (!hideCollapseAllAction) {
-			collapseAllAction = new CollapseAllAction(commonViewer);
-			ImageDescriptor collapseAllIcon = getImageDescriptor("elcl16/collapseall.gif"); //$NON-NLS-1$
-			collapseAllAction.setImageDescriptor(collapseAllIcon);
-			collapseAllAction.setHoverImageDescriptor(collapseAllIcon);
-			collapseAllHandler = new CollapseAllHandler(commonViewer);
-			service.activateHandler(CollapseAllHandler.COMMAND_ID, collapseAllHandler);
-		}
-
-		filterGroup = new FilterActionGroup(commonViewer);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillActionBars(org.eclipse.ui.IActionBars)
-	 */
-	public void fillActionBars(IActionBars theActionBars) {
-		IMenuManager menu = theActionBars.getMenuManager();
-
-		filterGroup.fillActionBars(theActionBars);
-
-		if (collapseAllAction != null) {
-			theActionBars.getToolBarManager().add(collapseAllAction);
-		}
-
-		if (toggleLinkingAction != null) {
-			menu
-					.insertAfter(IWorkbenchActionConstants.MB_ADDITIONS
-							+ "-end", toggleLinkingAction); //$NON-NLS-1$
-
-			theActionBars.getToolBarManager().add(toggleLinkingAction);
-		}
-
-		theActionBars.updateActionBars();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		if (toggleLinkingAction != null) {
-			toggleLinkingAction.dispose();
-		}
-		if (collapseAllHandler!=null) {
-			collapseAllHandler.dispose();
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonNavigatorManager.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonNavigatorManager.java
deleted file mode 100644
index 3870acf..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonNavigatorManager.java
+++ /dev/null
@@ -1,349 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Menu;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.util.OpenStrategy;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.OpenAndLinkWithEditorHelper;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.actions.RetargetAction;
-import org.eclipse.ui.navigator.CommonNavigator;
-import org.eclipse.ui.navigator.CommonViewer;
-import org.eclipse.ui.navigator.CommonViewerSiteFactory;
-import org.eclipse.ui.navigator.ICommonActionConstants;
-import org.eclipse.ui.navigator.ICommonViewerSite;
-import org.eclipse.ui.navigator.IDescriptionProvider;
-import org.eclipse.ui.navigator.INavigatorContentService;
-import org.eclipse.ui.navigator.NavigatorActionService;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * <p>
- * Manages the non-viewer responsibilities of the Common Navigator View Part,
- * including the display and population of the context menu and the registration
- * of extensions for opening content.
- * </p>
- * <p>
- * This class is not intended to be instantiated or subclassed by clients
- * </p>
- * 
- * @since 3.2
- */
-public final class CommonNavigatorManager implements ISelectionChangedListener {
-
-	// delay for updating the action bars (in ms)
-	private static final long DELAY = 200;
-
-	private final CommonNavigator commonNavigator;
-
-	private final INavigatorContentService contentService;
-
-	private NavigatorActionService actionService;
-
-	private final IDescriptionProvider commonDescriptionProvider;
-
-	private final IStatusLineManager statusLineManager;
-
-	private final ILabelProvider labelProvider;
-
-	private UpdateActionBarsJob updateActionBars;
-	
-	private ISelectionChangedListener statusBarListener = new ISelectionChangedListener() {
-
-		public void selectionChanged(SelectionChangedEvent anEvent) {
-			updateStatusBar(anEvent.getSelection());
-		}
-		
-	};
-	
-
-	
-	private class UpdateActionBarsJob extends UIJob {
-		public UpdateActionBarsJob(String label) {
-			super(label);
-		}
-		  
-		public IStatus runInUIThread(IProgressMonitor monitor) {
-
-			SafeRunner.run(new ISafeRunnable() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-				 */
-				public void run() throws Exception {
-					if(commonNavigator.getCommonViewer().getInput() != null) {
-						IStructuredSelection selection = new StructuredSelection(commonNavigator.getCommonViewer().getInput());
-						actionService.setContext(new ActionContext(selection));
-						actionService.fillActionBars(commonNavigator.getViewSite().getActionBars());
-					}
-				}
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-				 */
-				public void handleException(Throwable exception) {
-					NavigatorPlugin.logError(0, exception.getMessage(), exception);
-				}
-			});
-			return Status.OK_STATUS;
-		}
-	}
-
-	/**
-	 * <p>
-	 * Adds listeners to aNavigator to listen for selection changes and respond
-	 * to mouse events.
-	 * </p>
-	 * 
-	 * @param aNavigator
-	 *            The CommonNavigator managed by this class. Requires a non-null
-	 *            value.
-	 */
-	public CommonNavigatorManager(CommonNavigator aNavigator) {
-		this(aNavigator, null);
-	}
-	
-	/**
-	 * <p>
-	 * Adds listeners to aNavigator to listen for selection changes and respond
-	 * to mouse events.
-	 * </p>
-	 * 
-	 * @param aNavigator
-	 *            The CommonNavigator managed by this class. Requires a non-null
-	 *            value.
-	 * @param aMemento a memento for restoring state, or <code>null</code>
-	 */
-	public CommonNavigatorManager(CommonNavigator aNavigator, IMemento aMemento) {
-		super();
-		commonNavigator = aNavigator;
-		contentService = commonNavigator.getNavigatorContentService();
-		statusLineManager = commonNavigator.getViewSite().getActionBars()
-				.getStatusLineManager();
-		commonDescriptionProvider = contentService
-				.createCommonDescriptionProvider();
-		labelProvider = (ILabelProvider) commonNavigator.getCommonViewer()
-				.getLabelProvider();
-	
-		init(aMemento);
-	}
-
-
-	private void init(IMemento memento) {
-		
-		updateActionBars = new UpdateActionBarsJob(commonNavigator.getTitle());
-		
-		CommonViewer commonViewer = commonNavigator.getCommonViewer();
-		commonViewer.addSelectionChangedListener(this);
-		commonViewer.addPostSelectionChangedListener(statusBarListener);
-		updateStatusBar(commonViewer.getSelection());
-
-		ICommonViewerSite commonViewerSite = CommonViewerSiteFactory
-				.createCommonViewerSite(commonNavigator.getViewSite());
-		actionService = new NavigatorActionService(commonViewerSite,
-				commonViewer, commonViewer.getNavigatorContentService());
-
-		final RetargetAction openAction = new RetargetAction(
-				ICommonActionConstants.OPEN,
-				CommonNavigatorMessages.Open_action_label);
-		commonNavigator.getViewSite().getPage().addPartListener(openAction);
-		openAction.setActionDefinitionId(ICommonActionConstants.OPEN);
-
-		new OpenAndLinkWithEditorHelper(commonNavigator.getCommonViewer()) {
-			protected void activate(ISelection selection) {
-				final int currentMode = OpenStrategy.getOpenMethod();
-				try {
-					/*
-					 * XXX:
-					 * Currently the only way to activate the editor because there is no API to
-					 * get an editor input for a given object.
-					 */
-					OpenStrategy.setOpenMethod(OpenStrategy.DOUBLE_CLICK);
-					actionService.setContext(new ActionContext(commonNavigator.getCommonViewer().getSelection()));
-					actionService.fillActionBars(commonNavigator.getViewSite().getActionBars());
-					openAction.run();
-				} finally {
-					OpenStrategy.setOpenMethod(currentMode);
-				}
-			}
-
-			protected void linkToEditor(ISelection selection) {
-				// do nothing: this is handled by org.eclipse.ui.internal.navigator.actions.LinkEditorAction
-			}
-
-			protected void open(ISelection selection, boolean activate) {
-				actionService.setContext(new ActionContext(commonNavigator.getCommonViewer().getSelection()));
-				actionService.fillActionBars(commonNavigator.getViewSite().getActionBars());
-				openAction.run();
-			}
-			
-		};
-
-		if(memento != null)
-			restoreState(memento);
-		
-		initContextMenu();
-		initViewMenu();
-
-	}
-
-	/**
-	 * <p>
-	 * Called by {@link CommonNavigator} when the View Part is disposed.
-	 * 
-	 */
-	public void dispose() {
-		commonNavigator.getCommonViewer().removeSelectionChangedListener(this);
-		commonNavigator.getCommonViewer().removeSelectionChangedListener(statusBarListener);
-		actionService.dispose();
-	}
-
-	/**
-	 * 
-	 * @param anEvent
-	 *            An event indicating the current selection of the
-	 *            {@link CommonViewer}
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent anEvent) {
-		if (anEvent.getSelection() instanceof IStructuredSelection) {
-			IStructuredSelection structuredSelection = (IStructuredSelection) anEvent
-					.getSelection();
-			actionService.setContext(new ActionContext(structuredSelection));
-			actionService.fillActionBars(commonNavigator.getViewSite()
-					.getActionBars());
-		}
-	}
-
-	/**
-	 * @param aMemento
-	 *            Used to restore state of action extensions via the
-	 *            {@link NavigatorActionService}.
-	 */
-	public void restoreState(IMemento aMemento) {
-		actionService.restoreState(aMemento);
-		 
-	}
-
-	/**
-	 * @param aMemento
-	 *            Used to save state of action extensions via the
-	 *            {@link NavigatorActionService}.
-	 */
-	public void saveState(IMemento aMemento) {
-		actionService.saveState(aMemento);
-	}
-
-	/**
-	 * <p>
-	 * Fills aMenuManager with menu contributions from the
-	 * {@link NavigatorActionService}.
-	 * </p>
-	 * 
-	 * @param aMenuManager
-	 *            A popup menu
-	 * @see NavigatorActionService#fillContextMenu(IMenuManager)
-	 * 
-	 */
-	protected void fillContextMenu(IMenuManager aMenuManager) {
-		ISelection selection = commonNavigator.getCommonViewer().getSelection();
-		actionService.setContext(new ActionContext(selection));
-		actionService.fillContextMenu(aMenuManager);
-	}
-
-	/**
-	 * <p>
-	 * Initializes and registers the context menu.
-	 * </p>
-	 */
-	protected void initContextMenu() {
-		MenuManager menuMgr = new MenuManager(contentService
-				.getViewerDescriptor().getPopupMenuId());
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-
-			public void menuAboutToShow(IMenuManager manager) {
-				fillContextMenu(manager);
-			}
-		});
-		TreeViewer commonViewer = commonNavigator.getCommonViewer();
-		Menu menu = menuMgr.createContextMenu(commonViewer.getTree());
-
-		commonViewer.getTree().setMenu(menu);
-
-		actionService.prepareMenuForPlatformContributions(menuMgr,
-				commonViewer, false);
-
-	}
-
-	protected void initViewMenu() {
-		IMenuManager viewMenu = commonNavigator.getViewSite().getActionBars()
-				.getMenuManager();
-		viewMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-		viewMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS
-				+ "-end"));//$NON-NLS-1$
-		
-		updateActionBars.schedule(DELAY);
-		
-	}
-
-	/**
-	 * @param aSelection
-	 *            The current selection from the {@link CommonViewer}
-	 */
-	protected void updateStatusBar(ISelection aSelection) {
-
-		Image img = null;
-		if (aSelection != null && !aSelection.isEmpty()
-				&& aSelection instanceof IStructuredSelection) {
-			img = labelProvider.getImage(((IStructuredSelection) aSelection)
-					.getFirstElement());
-		}
-
-		statusLineManager.setMessage(img, commonDescriptionProvider
-				.getDescription(aSelection));
-	}
-
-	/**
-	 * 
-	 * @return The action service used by this manager
-	 */
-	public NavigatorActionService getNavigatorActionService() {
-		return actionService;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonNavigatorMessages.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonNavigatorMessages.java
deleted file mode 100644
index 7cb314c..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonNavigatorMessages.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * 
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- * 
- */
-public class CommonNavigatorMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.navigator.messages"; //$NON-NLS-1$
-
-	/** */
-	public static String Link_With_Editor_Job_;
-
-	/** */
-	public static String Could_not_provide_children_for_element;
-
-	/** */
-	public static String NavigatorViewerDescriptor_Popup_Menu_Overridden;
-
-	/** */
-	public static String StructuredViewerManager_0;
-
-	/** */
-	public static String TextAction_selectAll;
-
-	/** */
-	public static String Cut;
-
-	/** */
-	public static String Copy;
-
-	/** */
-	public static String Paste;
-
-	/** */
-	public static String Delete;
-
-	/** */
-	public static String Navigator_statusLineMultiSelect;
-
-	/** */
-	public static String SelectFiltersActionDelegate_1;
-
-	/** */
-	public static String CommonFilterSelectionDialog_Available_Filters;
-
-	/** */
-	public static String CommonFilterSelectionDialog_Available_Content;
-
-	/** */
-	public static String CommonFilterSelectionDialog_Hides_all_content_associated;
-
-	/** */
-	public static String CommonFilterSelectionDialog_Select_the_available_extensions;
-
-	/** */
-	public static String CommonFilterSelectionDialog_Select_the_filters_to_apply;
-
-	/** */
-	public static String SelectFiltersActionDelegate_0;
-
-	/** */
-	public static String CollapseAllActionDelegate_0;
-
-	/** */
-	public static String LinkEditorActionDelegate_1;
-
-	/** */
-	public static String LinkEditorActionDelegate_0;
-
-	/** */
-	public static String Attribute_Missing_Warning;
-
-	/** */
-	public static String Too_many_elements_Warning;
-
-	/** */
-	public static String Open_action_label;
-
-	/** */
-	public static String NewProjectWizard_errorTitle;
-
-	/** */
-	public static String NewProjectAction_text;
-
-	/** */
-	public static String UpdateFiltersOperation_Update_CommonViewer_Filter_;
-
-	/** */
-	public static String CommonFilterSelectionDialog_enter_name_of_filte_;
-
-	/** */
-	public static String CommonFilterSelectionDialog_Available_customization_;
-
-	/** */
-	public static String CommonSorterDescriptorManager_A_navigatorContent_extesnion_in_0_;
-
-	/** */
-	public static String CommonSorterDescriptorManager_A_navigatorContent_extension_does_n_;
-
-	/** */
-	public static String FilterDialogSelectionListener_Enable_the_0_filter_;
-
-	/** */
-	public static String NavigatorContentServiceLabelProvider_Error_no_label_provider_for_0_;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, CommonNavigatorMessages.class);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonViewerSiteDelegate.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonViewerSiteDelegate.java
deleted file mode 100644
index 264d1b6..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonViewerSiteDelegate.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.navigator.ICommonViewerSite;
-
-/**
- * Provides a delegate implementation of {@link ICommonViewerSite}.
- * 
- * @since 3.2
- *
- */
-public class CommonViewerSiteDelegate implements ICommonViewerSite {
-	
-	
-	private String id; 
-	private ISelectionProvider selectionProvider; 
-	private Shell shell;
-
-	/**
-	 * 
-	 * @param anId
-	 * @param aSelectionProvider
-	 * @param aShell
-	 */
-	public CommonViewerSiteDelegate(String anId,  ISelectionProvider aSelectionProvider, Shell aShell) {
-		Assert.isNotNull(anId);
-		Assert.isNotNull(aSelectionProvider);
-		Assert.isNotNull(aShell);
-		id = anId;
-		selectionProvider = aSelectionProvider;		
-		shell = aShell;
-	} 
-
-	public String getId() {
-		return id;
-	} 
-
-	public Shell getShell() {
-		return shell;
-	}
-
-	public ISelectionProvider getSelectionProvider() {
-		return selectionProvider;
-	}  
-
-
-	public void setSelectionProvider(ISelectionProvider aSelectionProvider) {
-		selectionProvider = aSelectionProvider;
-	}
-
-	public Object getAdapter(Class adapter) { 
-		return Platform.getAdapterManager().getAdapter(this, adapter);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonViewerSiteIEditorPartSiteDelegate.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonViewerSiteIEditorPartSiteDelegate.java
deleted file mode 100644
index dc2bbd4..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonViewerSiteIEditorPartSiteDelegate.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
-
-/**
- * Provides a delegate implementation of {@link ICommonViewerWorkbenchSite}.
- * @since 3.2
- *
- */
-public class CommonViewerSiteIEditorPartSiteDelegate implements
-		ICommonViewerWorkbenchSite {
-
-	private IEditorSite editorSite;  
-
-	/**
-	 * 
-	 * @param anEditorSite
-	 */
-	public CommonViewerSiteIEditorPartSiteDelegate(IEditorSite anEditorSite) {
-		editorSite = anEditorSite; 
-	}
-
-	public String getId() {
-		return editorSite.getId();
-	}
-
-	public IActionBars getActionBars() {
-		return editorSite.getActionBars();
-	}
-
-	public Object getAdapter(Class adapter) {
-		return editorSite.getAdapter(adapter);
-	} 
-
-	public IWorkbenchPage getPage() {
-		return editorSite.getPage();
-	}
-
-	public ISelectionProvider getSelectionProvider() {
-		return editorSite.getSelectionProvider();
-	}
-
-	public void setSelectionProvider(ISelectionProvider aSelectionProvider) {
-		editorSite.setSelectionProvider(aSelectionProvider);
-	}
-
-	public Shell getShell() {
-		return editorSite.getShell();
-	}
-
-	public IWorkbenchWindow getWorkbenchWindow() {
-		return editorSite.getWorkbenchWindow();
-	}
-
-	public void registerContextMenu(String menuId, MenuManager menuManager,
-			ISelectionProvider selectionProvider) {
-		editorSite.registerContextMenu(menuId, menuManager, selectionProvider);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.ICommonViewerWorkbenchSite#getViewPart()
-	 */
-	public IWorkbenchPart getPart() { 
-		return editorSite.getPart();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.ICommonViewerWorkbenchSite#getSite()
-	 */
-	public IWorkbenchPartSite getSite() {
-		return editorSite;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonViewerSiteIPageSiteDelegate.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonViewerSiteIPageSiteDelegate.java
deleted file mode 100644
index f16f919..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonViewerSiteIPageSiteDelegate.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator;
-
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.navigator.ICommonViewerSite;
-import org.eclipse.ui.part.IPageSite;
-
-/**
- * Provides a delegate implementation of {@link ICommonViewerSite}.
- * 
- * @since 3.2
- * 
- */
-public class CommonViewerSiteIPageSiteDelegate implements ICommonViewerSite {
-
-	private IPageSite pageSite;
-
-	private String viewerId;
-
-	/**
-	 * 
-	 * @param aViewerId
-	 * @param aPageSite
-	 */
-	public CommonViewerSiteIPageSiteDelegate(String aViewerId,
-			IPageSite aPageSite) {
-		viewerId = aViewerId;
-		pageSite = aPageSite;
-	}
-
-	public String getId() {
-		return viewerId;
-	}
-
-	public Object getAdapter(Class adapter) {
-		return pageSite.getAdapter(adapter);
-	}
-
-	public ISelectionProvider getSelectionProvider() {
-		return pageSite.getSelectionProvider();
-	}
-
-	public void setSelectionProvider(ISelectionProvider aSelectionProvider) {
-		pageSite.setSelectionProvider(aSelectionProvider);
-	}
-
-	public Shell getShell() {
-		return pageSite.getShell();
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonViewerSiteIViewSiteDelegate.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonViewerSiteIViewSiteDelegate.java
deleted file mode 100644
index 1c962f7..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CommonViewerSiteIViewSiteDelegate.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
-
-/**
- * Provides a delegate implementation of {@link ICommonViewerWorkbenchSite}.
- * 
- * @since 3.2
- * 
- */
-public class CommonViewerSiteIViewSiteDelegate implements ICommonViewerWorkbenchSite {
-
-	private IViewSite viewSite; 
-
-	/**
-	 * 
-	 * @param aViewSite
-	 */
-	public CommonViewerSiteIViewSiteDelegate(IViewSite aViewSite) {
-		viewSite = aViewSite; 
-	}
-
-	public String getId() {
-		return viewSite.getId();
-	}
-
-	public IActionBars getActionBars() {
-		return viewSite.getActionBars();
-	}
-
-	public Object getAdapter(Class adapter) {
-		return viewSite.getAdapter(adapter);
-	}
-
-	public IWorkbenchPage getPage() {
-		return viewSite.getPage();
-	}
-
-	public ISelectionProvider getSelectionProvider() {
-		return viewSite.getSelectionProvider();
-	}
-
-	public void setSelectionProvider(ISelectionProvider aSelectionProvider) {
-		viewSite.setSelectionProvider(aSelectionProvider);
-	}
-
-	public Shell getShell() {
-		return viewSite.getShell();
-	}
-
-	public IWorkbenchWindow getWorkbenchWindow() {
-		return viewSite.getWorkbenchWindow();
-	}
-
-	public void registerContextMenu(String menuId, MenuManager menuManager,
-			ISelectionProvider selectionProvider) {
-		viewSite.registerContextMenu(menuId, menuManager, selectionProvider);
-	}
- 
-	public IWorkbenchPart getPart() { 
-		return viewSite.getPart();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.ICommonViewerWorkbenchSite#getSite()
-	 */
-	public IWorkbenchPartSite getSite() { 
-		return viewSite;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/ContributorTrackingSet.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/ContributorTrackingSet.java
deleted file mode 100644
index 421289e..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/ContributorTrackingSet.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator;
-
-import java.util.LinkedHashSet;
-
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptor;
-
-/**
- * @since 3.2
- *
- */
-public class ContributorTrackingSet extends LinkedHashSet {
-
-	
-	private static final long serialVersionUID = 2516241537206281972L;
-	
-	private NavigatorContentDescriptor contributor;
-	private NavigatorContentService contentService;
-	
-	/**
-	 * Construct a tracking set.
-	 * 
-	 * @param aContentService 
-	 */
-	public ContributorTrackingSet(NavigatorContentService aContentService) {
-		contentService = aContentService;
-	}
-	
-	/**
-	 * Construct a tracking set.
-	 * 
-	 * @param aContentService
-	 * @param elements
-	 */
-	public ContributorTrackingSet(NavigatorContentService aContentService, Object[] elements) {
-		
-		for (int i = 0; i < elements.length; i++) 
-			super.add(elements[i]); 
-		
-		contentService = aContentService;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.util.HashSet#add(java.lang.Object)
-	 */
-	public boolean add(Object o) { 
-		if(contributor != null)
-			contentService.rememberContribution(contributor, o);
-		return super.add(o);
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.util.HashSet#remove(java.lang.Object)
-	 */
-	public boolean remove(Object o) { 
-		contentService.forgetContribution(o);
-		return super.remove(o);
-	}
-
-	/**
-	 * 
-	 * @return The current contributor.
-	 */
-	public NavigatorContentDescriptor getContributor() {
-		return contributor;
-	}
-
-	/**
-	 * 
-	 * @param newContributor The contributor to record for the next series of adds.
-	 */
-	public void setContributor(NavigatorContentDescriptor newContributor) {
-		contributor = newContributor;
-	}
-
-	/**
-	 * @param contents
-	 */
-	public void setContents(Object[] contents) {
-		super.clear();
-		if(contents != null) 
-			for (int i = 0; i < contents.length; i++) 
-				super.add(contents[i]); 
-		
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CustomAndExpression.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CustomAndExpression.java
deleted file mode 100644
index 07f1373..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/CustomAndExpression.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.expressions.ElementHandler;
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionConverter;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Create an AND-type core expression from an IConfigurationElement of arbitrary
- * name.
- * 
- */
-public class CustomAndExpression extends Expression {
-
-	protected List fExpressions;
-
-	/**
-	 * Create an AND-type core expression from an IConfigurationElement of
-	 * arbitrary name. The children elements are combined using boolean AND
-	 * semantics to evaluate the expression.
-	 * 
-	 * @param element
-	 *            An IConfigurationElement of arbitrary name.
-	 */
-	public CustomAndExpression(IConfigurationElement element) {
-		Assert.isNotNull(element);
-
-		IConfigurationElement[] children = element.getChildren();
-
-		if (children.length > 0) {
-			fExpressions = new ArrayList();
-		}
-		for (int i = 0; i < children.length; i++) {
-			try {
-				fExpressions.add(ElementHandler.getDefault().create(
-						ExpressionConverter.getDefault(), children[i]));
-			} catch (CoreException ce) {
-				NavigatorPlugin.log(IStatus.ERROR, 0, ce.getMessage(), ce);
-			}
-		}
-	}
-
-	public EvaluationResult evaluate(IEvaluationContext scope)
-			throws CoreException {
-		if (fExpressions == null) {
-			return EvaluationResult.TRUE;
-		}
-		EvaluationResult result = EvaluationResult.TRUE;
-		for (Iterator iter = fExpressions.iterator(); iter.hasNext();) {
-			Expression expression = (Expression) iter.next();
-			result = result.and(expression.evaluate(scope));
-			// keep iterating even if we have a not loaded found. It can be
-			// that we find a false which will result in a better result.
-			if (result == EvaluationResult.FALSE) {
-				return result;
-			}
-		}
-		return result;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/INavigatorHelpContextIds.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/INavigatorHelpContextIds.java
deleted file mode 100644
index 9ed0cd3..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/INavigatorHelpContextIds.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-/**
- * The help context ids for the Common Navigator.
- * 
- * @since 3.2
- * 
- */
-public interface INavigatorHelpContextIds {
-
-	/** */
-	public static final String PREFIX = NavigatorPlugin.PLUGIN_ID + "."; //$NON-NLS-1$
-
-	/** */
-	public static final String TEXT_CUT_ACTION = PREFIX
-			+ "text_cut_action_context"; //$NON-NLS-1$
-
-	/** */
-	public static final String TEXT_COPY_ACTION = PREFIX
-			+ "text_copy_action_context"; //$NON-NLS-1$
-
-	/** */
-	public static final String TEXT_PASTE_ACTION = PREFIX
-			+ "text_paste_action_context"; //$NON-NLS-1$
-
-	/** */
-	public static final String TEXT_DELETE_ACTION = PREFIX
-			+ "text_delete_action_context"; //$NON-NLS-1$
-
-	/** */
-	public static final String TEXT_SELECT_ALL_ACTION = PREFIX
-			+ "text_select_all_action_context"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorActivationService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorActivationService.java
deleted file mode 100644
index c88a3c5..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorActivationService.java
+++ /dev/null
@@ -1,397 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptor;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptorManager;
-import org.eclipse.ui.navigator.IExtensionActivationListener;
-import org.eclipse.ui.navigator.INavigatorActivationService;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * 
- * The activation service determines if an extension is <i>active</i> within the
- * context of a given viewer. If an extension is <i>active</i> then the extension
- * will contribute functionality to the viewer. If an extension is not <i>active</i>,
- * then the extension will not be given opportunities to contribute
- * functionality to the given viewer. See {@link INavigatorContentService} for
- * more detail on what states are associated with a content extension.
- *  
- * 
- * @since 3.2
- */
-public final class NavigatorActivationService implements
-		INavigatorActivationService {
-
-	private static final String ACTIVATED_EXTENSIONS = ".activatedExtensions"; //$NON-NLS-1$
-
-	private static final NavigatorContentDescriptorManager CONTENT_DESCRIPTOR_REGISTRY = NavigatorContentDescriptorManager
-			.getInstance();	
-
-	private static final INavigatorContentDescriptor[] NO_DESCRIPTORS = new INavigatorContentDescriptor[0];
-
-	private static final String DELIM = ";"; //$NON-NLS-1$
-
-	private static final char EQUALS = '=';  
-
-	/*
-	 * Set of ids of activated extensions.
-	 */
-	//private final Set activatedExtensions = new HashSet();
-
-	/*
-	 * Set of ids of activated extensions.
-	 */
-	private final Map/*<String, Boolean>*/ activatedExtensionsMap = new HashMap();
-
-	/*
-	 * IExtensionActivationListeners
-	 */
-	private final ListenerList listeners = new ListenerList();
-
-	private INavigatorContentService contentService;
-
-	/**
-	 * Create an instance of the service.
-	 * 
-	 * @param aContentService
-	 *            The associated content service.
-	 */
-	public NavigatorActivationService(INavigatorContentService aContentService) {
-		contentService = aContentService;
-		revertExtensionActivations();
-	}
-
-	/**
-	 * 
-	 * Checks the known activation state for the given viewer id to determine if
-	 * the given navigator extension is 'active'.
-	 *  
-	 * @param aNavigatorExtensionId
-	 *            The unique identifier associated with a given extension.
-	 * 
-	 * @return True if the extension is active in the context of the viewer id.
-	 */
-	public boolean isNavigatorExtensionActive(String aNavigatorExtensionId) {
-		Boolean b = (Boolean) activatedExtensionsMap.get(aNavigatorExtensionId);
-		if(b != null)
-			return b.booleanValue();
-		synchronized (activatedExtensionsMap) {
-			NavigatorContentDescriptor descriptor = CONTENT_DESCRIPTOR_REGISTRY.getContentDescriptor(aNavigatorExtensionId);
-			if(descriptor.isActiveByDefault())
-				activatedExtensionsMap.put(aNavigatorExtensionId, Boolean.TRUE);
-			else
-				activatedExtensionsMap.put(aNavigatorExtensionId, Boolean.FALSE);
-			return descriptor.isActiveByDefault();
-		}
-		//return activatedExtensions.contains(aNavigatorExtensionId);
-	}
-
-	/**
-	 * Set the activation state for the given extension in the context of the
-	 * given viewer id. Each instance of an INavigatorContentService listens for
-	 * the activation service to update; and if those instances were created
-	 * with viewers, they will issue a refresh. Otherwise, clients are
-	 * responsible for refreshing the viewers.
-	 * 
-	 * <p>
-	 * Clients must call {@link #persistExtensionActivations()} to save
-	 * the the activation state.
-	 * </p>
-	 * 
-	 * <p>
-	 * When clients are updating a batch of extensions, consider using
-	 * {@link #setActive(String[], boolean)} when
-	 * possible to avoid unnecessary notifications.
-	 * </p>
-	 * 
-	 * @param aNavigatorExtensionId
-	 *            The unique identifier associated with a given extension.
-	 * @param toEnable
-	 *            True indicates the extension should be enabled; False
-	 *            indicates otherwise.
-	 * 
-	 */
-	public void setActive(
-			String aNavigatorExtensionId, boolean toEnable) {
-
-		boolean currentlyActive = isNavigatorExtensionActive(aNavigatorExtensionId);
-		if (currentlyActive == toEnable) {
-			return;
-		}
-
-		if (toEnable) {
-			//activatedExtensions.add(aNavigatorExtensionId);
-			activatedExtensionsMap.put(aNavigatorExtensionId, Boolean.TRUE);
-		} else {
-			//activatedExtensions.remove(aNavigatorExtensionId);
-			activatedExtensionsMap.put(aNavigatorExtensionId, Boolean.FALSE);
-		}
-		notifyListeners(new String[] { aNavigatorExtensionId }, toEnable);
-
-	}
-
-	/**
-	 * Set the activation state for the given extension in the context of the
-	 * given viewer id. Each instance of an INavigatorContentService listens for
-	 * the activation service to update; and if those instances were created
-	 * with viewers, they will issue a refresh. Otherwise, clients are
-	 * responsible for refreshing the viewers.
-	 * 
-	 * <p>
-	 * Clients must call {@link #persistExtensionActivations()} to save
-	 * the the activation state.
-	 * </p>
-	 * 
-	 * @param aNavigatorExtensionIds
-	 *            An array of unique identifiers associated with existing
-	 *            extension.
-	 * @param toEnable
-	 *            True indicates the extension should be enabled; False
-	 *            indicates otherwise.
-	 * 
-	 */
-	public void setActive(String[] aNavigatorExtensionIds,
-			boolean toEnable) {
-
-		if (toEnable) {
-			for (int i = 0; i < aNavigatorExtensionIds.length; i++) {
-				//activatedExtensions.add(aNavigatorExtensionIds[i]);
-				activatedExtensionsMap.put(aNavigatorExtensionIds[i], Boolean.TRUE);
-			}
-		} else {
-			for (int i = 0; i < aNavigatorExtensionIds.length; i++) {
-				//activatedExtensions.remove(aNavigatorExtensionIds[i]);
-				activatedExtensionsMap.put(aNavigatorExtensionIds[i], Boolean.FALSE);
-			}
-		}
-		notifyListeners(aNavigatorExtensionIds, toEnable);
-
-	}
-
-	/**
-	 * Save the activation state for the given viewer.
-	 * 
-	 */
-	public void persistExtensionActivations() {
-
-		Preferences preferences = NavigatorPlugin.getDefault()
-				.getPluginPreferences();
-
-		//synchronized (activatedExtensions) {
-		synchronized (activatedExtensionsMap) {
-			//Iterator activatedExtensionsIterator = activatedExtensions.iterator();
-			Iterator activatedExtensionsIterator = activatedExtensionsMap.keySet().iterator();
-			
-			/* ensure that the preference will be non-empty */
-			StringBuffer preferenceValue = new StringBuffer();
-			String navigatorExtensionId = null;
-			boolean isActive = false;
-			while (activatedExtensionsIterator.hasNext()) {
-				navigatorExtensionId = (String) activatedExtensionsIterator.next();
-				isActive = isNavigatorExtensionActive(navigatorExtensionId);
-				preferenceValue.append(navigatorExtensionId)
-									.append(EQUALS)
-										.append( isActive ? Boolean.TRUE : Boolean.FALSE )				
-											.append(DELIM);
-			}
-			preferences.setValue(getPreferenceKey(), preferenceValue.toString());
-		}
-		NavigatorPlugin.getDefault().savePluginPreferences();
-	}
-
-	/**
-	 * Request notification when the activation state changes for the given
-	 * viewer id.
-	 * 
-	 * @param aListener
-	 *            An implementation of {@link IExtensionActivationListener}
-	 */
-	public void addExtensionActivationListener(
-			IExtensionActivationListener aListener) {
-		listeners.add(aListener);
-	}
-
-	/**
-	 * No longer receive notification when activation state changes.
-	 * 
-	 * @param aListener
-	 *            An implementation of {@link IExtensionActivationListener}
-	 */
-	public void removeExtensionActivationListener(
-			IExtensionActivationListener aListener) {
-		listeners.remove(aListener);
-	}
-
-	private void notifyListeners(String[] navigatorExtensionIds,
-			boolean toEnable) {
-		
-		if(navigatorExtensionIds != null) { // should really never be null, but just in case
-			if(navigatorExtensionIds.length > 1)
-				Arrays.sort(navigatorExtensionIds);
-			
-			Object[] listenerArray = listeners.getListeners();
-			for (int i = 0; i < listenerArray.length; i++) {
-				((IExtensionActivationListener) listenerArray[i])
-						.onExtensionActivation(contentService.getViewerId(),
-								navigatorExtensionIds, toEnable);
-			}
-		}
-
-	}
-
-	private void revertExtensionActivations() {
-
-		Preferences preferences = NavigatorPlugin.getDefault()
-				.getPluginPreferences();
-
-		String activatedExtensionsString = preferences
-				.getString(getPreferenceKey());
-
-		if (activatedExtensionsString != null
-				&& activatedExtensionsString.length() > 0) {
-			String[] contentExtensionIds = activatedExtensionsString
-					.split(DELIM);
-			
-			String id = null;
-			String booleanString = null;
-			int indx=0;
-			for (int i = 0; i < contentExtensionIds.length; i++) {
-				//activatedExtensions.add(contentExtensionIds[i]);
-				if( (indx = contentExtensionIds[i].indexOf(EQUALS)) > -1) {
-					// up to but not including the equals
-					id = contentExtensionIds[i].substring(0, indx);
-					booleanString = contentExtensionIds[i].substring(indx+1, contentExtensionIds[i].length());
-					activatedExtensionsMap.put(id, Boolean.valueOf(booleanString));
-				} else {
-					// IS THIS THE RIGHT WAY TO HANDLE THIS CASE?
-					NavigatorContentDescriptor descriptor = CONTENT_DESCRIPTOR_REGISTRY.getContentDescriptor(contentExtensionIds[i]);
-					if(descriptor != null)
-						activatedExtensionsMap.put(id, Boolean.valueOf(descriptor.isActiveByDefault()));
-				}
-			}
-
-		} else {
-			/*
-			 * We add the default activation of every known extension, even
-			 * though some may not be bound to the associated content service;
-			 * this is because they could be bound at a later time through the
-			 * programmatic binding mechanism in INavigatorContentService.
-			 */
-			INavigatorContentDescriptor[] contentDescriptors = CONTENT_DESCRIPTOR_REGISTRY
-					.getAllContentDescriptors();
-			for (int i = 0; i < contentDescriptors.length; i++) {
-				if (contentDescriptors[i].isActiveByDefault()) {					
-					//activatedExtensions.add(contentDescriptors[i].getId());
-					activatedExtensionsMap.put(contentDescriptors[i].getId(), Boolean.TRUE);
-				}
-			}
-		} 
-	}
-
-	private String getPreferenceKey() {
-		return contentService.getViewerId() + ACTIVATED_EXTENSIONS;
-	}
-
-
-	public INavigatorContentDescriptor[] activateExtensions(
-			String[] extensionIds, boolean toDeactivateAllOthers) {
-
-		Set activatedDescriptors = new HashSet(); 
-		setActive(extensionIds, true);
-		for (int extId = 0; extId < extensionIds.length; extId++) {
-			activatedDescriptors.add(CONTENT_DESCRIPTOR_REGISTRY
-					.getContentDescriptor(extensionIds[extId]));
-		}
-
-		if (toDeactivateAllOthers) {
-			NavigatorContentDescriptor[] descriptors = CONTENT_DESCRIPTOR_REGISTRY
-					.getAllContentDescriptors();
-			List descriptorList = new ArrayList(Arrays.asList(descriptors));
-
-			for (int descriptorIndx = 0; descriptorIndx < descriptors.length; descriptorIndx++) {
-				for (int extId = 0; extId < extensionIds.length; extId++) {
-					if (descriptors[descriptorIndx].getId().equals(
-							extensionIds[extId])) {
-						descriptorList.remove(descriptors[descriptorIndx]);
-					}
-				}
-			}
-
-			String[] deactivatedExtensions = new String[descriptorList.size()];
-			for (int i = 0; i < descriptorList.size(); i++) {
-				INavigatorContentDescriptor descriptor = (INavigatorContentDescriptor) descriptorList
-						.get(i);
-				deactivatedExtensions[i] = descriptor.getId();
-			}
-			setActive(deactivatedExtensions, false);
-		}
-
-		if (activatedDescriptors.size() == 0) {
-			return NO_DESCRIPTORS;
-		}
-		return (INavigatorContentDescriptor[]) activatedDescriptors
-				.toArray(new NavigatorContentDescriptor[activatedDescriptors
-						.size()]);
-	}
-
-	public INavigatorContentDescriptor[] deactivateExtensions(
-			String[] extensionIds, boolean toEnableAllOthers) {
-
-		Set activatedDescriptors = new HashSet(); 
-		setActive(extensionIds, false);
-
-		if (toEnableAllOthers) {
-			NavigatorContentDescriptor[] descriptors = CONTENT_DESCRIPTOR_REGISTRY
-					.getAllContentDescriptors();
-			List descriptorList = new ArrayList(Arrays.asList(descriptors));
-
-			for (int descriptorIndx = 0; descriptorIndx < descriptors.length; descriptorIndx++) {
-				for (int extId = 0; extId < extensionIds.length; extId++) {
-					if (descriptors[descriptorIndx].getId().equals(
-							extensionIds[extId])) {
-						descriptorList.remove(descriptors[descriptorIndx]);
-					}
-				}
-			}
-
-			String[] activatedExtensions = new String[descriptorList.size()];
-			for (int i = 0; i < descriptorList.size(); i++) {
-				NavigatorContentDescriptor descriptor = (NavigatorContentDescriptor) descriptorList
-						.get(i);
-				activatedExtensions[i] = descriptor.getId();
-				activatedDescriptors.add(descriptor);
-			}
-			setActive(activatedExtensions,	true);
-		}
-		if (activatedDescriptors.size() == 0) {
-			return NO_DESCRIPTORS;
-		}
-
-		return (INavigatorContentDescriptor[]) activatedDescriptors
-				.toArray(new NavigatorContentDescriptor[activatedDescriptors
-						.size()]);
-	}
-
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentService.java
deleted file mode 100644
index 839191c..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentService.java
+++ /dev/null
@@ -1,1197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import java.util.WeakHashMap;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.internal.navigator.dnd.NavigatorDnDService;
-import org.eclipse.ui.internal.navigator.extensions.ExtensionPriorityComparator;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptor;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptorManager;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentExtension;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorViewerDescriptor;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorViewerDescriptorManager;
-import org.eclipse.ui.internal.navigator.extensions.StructuredViewerManager;
-import org.eclipse.ui.internal.navigator.sorters.NavigatorSorterService;
-import org.eclipse.ui.navigator.IDescriptionProvider;
-import org.eclipse.ui.navigator.IExtensionActivationListener;
-import org.eclipse.ui.navigator.IExtensionStateModel;
-import org.eclipse.ui.navigator.IMementoAware;
-import org.eclipse.ui.navigator.INavigatorActivationService;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentExtension;
-import org.eclipse.ui.navigator.INavigatorContentService;
-import org.eclipse.ui.navigator.INavigatorContentServiceListener;
-import org.eclipse.ui.navigator.INavigatorDnDService;
-import org.eclipse.ui.navigator.INavigatorFilterService;
-import org.eclipse.ui.navigator.INavigatorPipelineService;
-import org.eclipse.ui.navigator.INavigatorSaveablesService;
-import org.eclipse.ui.navigator.INavigatorSorterService;
-import org.eclipse.ui.navigator.INavigatorViewerDescriptor;
-
-/**
- * <p>
- * Provides centralized access to the information provided by
- * NavigatorContentExtensions. Can be instantiated as needed, but should be
- * cached for active viewers. Information specific to a given viewer will be
- * cached by the NavigatorContentService, not including ContentProviders and
- * Label Providers created by {@link #createCommonContentProvider()}and
- * {@link #createCommonLabelProvider()}respectively.
- * </p>
- * 
- * <p>
- * The following class is experimental until fully documented.
- * </p>
- */
-public class NavigatorContentService implements IExtensionActivationListener,
-		IMementoAware, INavigatorContentService {
-
-	private static final NavigatorContentDescriptorManager CONTENT_DESCRIPTOR_REGISTRY = NavigatorContentDescriptorManager
-			.getInstance();
-
-	private static final NavigatorViewerDescriptorManager VIEWER_DESCRIPTOR_REGISTRY = NavigatorViewerDescriptorManager
-			.getInstance();
-
-	private static final ITreeContentProvider[] NO_CONTENT_PROVIDERS = new ITreeContentProvider[0];
-
-	private static final ILabelProvider[] NO_LABEL_PROVIDERS = new ILabelProvider[0];
-
-	private static final INavigatorContentDescriptor[] NO_DESCRIPTORS = new INavigatorContentDescriptor[0];
-
-	private static final String[] NO_EXTENSION_IDS = new String[0];
-
-	private final NavigatorViewerDescriptor viewerDescriptor;
-
-	private final List listeners = new ArrayList();
-
-	/*
-	 * A map of (String-based-Navigator-Content-Extension-IDs,
-	 * NavigatorContentExtension-objects)-pairs
-	 */
-	private final Map contentExtensions = new HashMap();
-
-	private StructuredViewerManager structuredViewerManager;
-
-	private ITreeContentProvider[] rootContentProviders;
-
-	private WeakHashMap contributionMemory;
-
-	private ITreeContentProvider contentProvider;
-
-	private ILabelProvider labelProvider;
-
-	private final VisibilityAssistant assistant;
-
-	private NavigatorFilterService navigatorFilterService;
-
-	private INavigatorSorterService navigatorSorterService;
-
-	private INavigatorPipelineService navigatorPipelineService;
-
-	private INavigatorDnDService navigatorDnDService;
-
-	private INavigatorActivationService navigatorActivationService;
-
-	private NavigatorSaveablesService navigatorSaveablesService;
-
-	private NavigatorExtensionStateService navigatorExtensionStateService;
-
-	private IDescriptionProvider descriptionProvider;
-
-	private boolean contentProviderInitialized;
-
-	private boolean labelProviderInitialized;
-
-	/**
-	 * @param aViewerId
-	 *            The viewer id for this content service; normally from the
-	 *            <b>org.eclipse.ui.views</b> extension.
-	 */
-	public NavigatorContentService(String aViewerId) {
-		super();
-		aViewerId = aViewerId != null ? aViewerId : ""; //$NON-NLS-1$
-		viewerDescriptor = VIEWER_DESCRIPTOR_REGISTRY
-				.getNavigatorViewerDescriptor(aViewerId);
-		assistant = new VisibilityAssistant(viewerDescriptor,
-				getActivationService());
-		getActivationService().addExtensionActivationListener(this);
-	}
-
-	/**
-	 * @param aViewerId
-	 *            The viewer id for this content service; normally from the
-	 *            <b>org.eclipse.ui.views</b> extension.
-	 * @param aViewer
-	 *            The viewer that this content service will be associated with.
-	 */
-	public NavigatorContentService(String aViewerId, StructuredViewer aViewer) {
-		this(aViewerId);
-		structuredViewerManager = new StructuredViewerManager(aViewer);
-	}
-
-	public String[] getVisibleExtensionIds() {
-
-		List visibleExtensionIds = new ArrayList();
-
-		NavigatorContentDescriptor[] descriptors = CONTENT_DESCRIPTOR_REGISTRY
-				.getAllContentDescriptors();
-		for (int i = 0; i < descriptors.length; i++) {
-			if (assistant.isVisible(descriptors[i].getId())) {
-				visibleExtensionIds.add(descriptors[i].getId());
-			}
-		}
-		if (visibleExtensionIds.isEmpty()) {
-			return NO_EXTENSION_IDS;
-		}
-		return (String[]) visibleExtensionIds
-				.toArray(new String[visibleExtensionIds.size()]);
-
-	}
-
-	public INavigatorContentDescriptor[] getVisibleExtensions() {
-		List visibleDescriptors = new ArrayList();
-
-		NavigatorContentDescriptor[] descriptors = CONTENT_DESCRIPTOR_REGISTRY
-				.getAllContentDescriptors();
-		for (int i = 0; i < descriptors.length; i++) {
-			if (assistant.isVisible(descriptors[i].getId())) {
-				visibleDescriptors.add(descriptors[i]);
-			}
-		}
-		if (visibleDescriptors.isEmpty()) {
-			return NO_DESCRIPTORS;
-		}
-		return (INavigatorContentDescriptor[]) visibleDescriptors
-				.toArray(new INavigatorContentDescriptor[visibleDescriptors
-						.size()]);
-
-	}
-
-	/* package */INavigatorContentDescriptor[] getActiveDescriptorsWithSaveables() {
-		List result = new ArrayList();
-
-		NavigatorContentDescriptor[] descriptors = CONTENT_DESCRIPTOR_REGISTRY
-				.getContentDescriptorsWithSaveables();
-		for (int i = 0; i < descriptors.length; i++) {
-			if (assistant.isVisible(descriptors[i].getId())
-					&& assistant.isActive(descriptors[i])) {
-				result.add(descriptors[i]);
-			}
-		}
-		if (result.isEmpty()) {
-			return NO_DESCRIPTORS;
-		}
-		return (INavigatorContentDescriptor[]) result
-				.toArray(new INavigatorContentDescriptor[result.size()]);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.navigator.INavigatorContentService#bindExtensions(java
-	 * .lang.String[], boolean)
-	 */
-	public INavigatorContentDescriptor[] bindExtensions(String[] extensionIds,
-			boolean isRoot) {
-		if (extensionIds == null || extensionIds.length == 0) {
-			return NO_DESCRIPTORS;
-		}
-
-		for (int i = 0; i < extensionIds.length; i++) {
-			assistant.bindExtensions(extensionIds, isRoot);
-		}
-		Set boundDescriptors = new HashSet();
-		INavigatorContentDescriptor descriptor;
-		for (int i = 0; i < extensionIds.length; i++) {
-			descriptor = CONTENT_DESCRIPTOR_REGISTRY
-					.getContentDescriptor(extensionIds[i]);
-			if (descriptor != null) {
-				boundDescriptors.add(descriptor);
-			}
-		}
-
-		if (boundDescriptors.size() == 0) {
-			return NO_DESCRIPTORS;
-		}
-		
-		if (Policy.DEBUG_EXTENSION_SETUP) {
-			System.out.println("bindExtensions: " + //$NON-NLS-1$
-					boundDescriptors);
-		}
-		return (INavigatorContentDescriptor[]) boundDescriptors
-				.toArray(new INavigatorContentDescriptor[boundDescriptors
-						.size()]);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @seeorg.eclipse.ui.internal.navigator.INavigatorContentService#
-	 * createCommonContentProvider()
-	 */
-	public ITreeContentProvider createCommonContentProvider() {
-		if (contentProviderInitialized) {
-			return contentProvider;
-		}
-		synchronized (this) {
-			if (contentProvider == null) {
-				contentProvider = new NavigatorContentServiceContentProvider(
-						this);
-			}
-			contentProviderInitialized = true;
-		}
-		return contentProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @seeorg.eclipse.ui.internal.navigator.INavigatorContentService#
-	 * createCommonLabelProvider()
-	 */
-	public ILabelProvider createCommonLabelProvider() {
-		if (labelProviderInitialized) {
-			return labelProvider;
-		}
-		synchronized (this) {
-			if (labelProvider == null) {
-				labelProvider = new NavigatorContentServiceLabelProvider(this);
-			}
-			labelProviderInitialized = true;
-		}
-		return labelProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @seeorg.eclipse.ui.navigator.INavigatorContentService#
-	 * createCommonDescriptionProvider()
-	 */
-	public IDescriptionProvider createCommonDescriptionProvider() {
-		if (descriptionProvider != null) {
-			return descriptionProvider;
-		}
-		synchronized (this) {
-			if (descriptionProvider == null) {
-				descriptionProvider = new NavigatorContentServiceDescriptionProvider(
-						this);
-			}
-		}
-		return descriptionProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.navigator.INavigatorContentService#dispose()
-	 */
-	public void dispose() {
-		if (navigatorSaveablesService != null) {
-			assistant.removeListener(navigatorSaveablesService);
-		}
-		for (Iterator contentItr = contentExtensions.values().iterator(); contentItr
-				.hasNext();) {
-			((NavigatorContentExtension) contentItr.next()).dispose();
-		}
-		getActivationService().removeExtensionActivationListener(this);
-		assistant.dispose();
-	}
-
-	protected void updateService(Viewer aViewer, Object anOldInput,
-			Object aNewInput) {
-
-		synchronized (this) {
-
-			if (structuredViewerManager == null) {
-				structuredViewerManager = new StructuredViewerManager(aViewer);
-				structuredViewerManager.inputChanged(anOldInput, aNewInput);
-			} else {
-				structuredViewerManager.inputChanged(aViewer, anOldInput,
-						aNewInput);
-			}
-
-			for (Iterator contentItr = contentExtensions.values().iterator(); contentItr
-					.hasNext();) {
-				NavigatorContentExtension ext = (NavigatorContentExtension) contentItr
-						.next();
-				if (ext.isLoaded()) {
-					structuredViewerManager
-							.initialize(ext.getContentProvider());
-				}
-			}
-
-			rootContentProviders = extractContentProviders(findRootContentExtensions(aNewInput));
-		}
-	}
-
-	public IExtensionStateModel findStateModel(String anExtensionId) {
-		if (anExtensionId == null) {
-			return null;
-		}
-		INavigatorContentDescriptor desc = CONTENT_DESCRIPTOR_REGISTRY
-				.getContentDescriptor(anExtensionId);
-		if (desc == null) {
-			return null;
-		}
-		INavigatorContentExtension ext = getExtension(desc);
-		if (ext == null) {
-			return null;
-		}
-		return ext.getStateModel();
-	}
-
-	/**
-	 * Return a set of content providers that could provide a parent for the
-	 * given element. These content extensions are determined by consulting the
-	 * <b>possibleChildren</b> expression in the <b>navigatorContent</b>
-	 * extension.
-	 * 
-	 * <p>
-	 * Clients that wish to tap into the link with editor support must describe
-	 * all of their possible children in their <b>possibleChildren</b>
-	 * expressions.
-	 * </p>
-	 * 
-	 * @param anElement
-	 *            An element from the tree (generally from a setSelection()
-	 *            method).
-	 * @return The set of content providers that may be able to provide a
-	 *         parent.
-	 */
-	public ITreeContentProvider[] findParentContentProviders(Object anElement) {
-		return extractContentProviders(findContentExtensionsWithPossibleChild(anElement));
-	}
-
-	/**
-	 * <p>
-	 * Return all of the content providers that are relevant for the viewer. The
-	 * viewer is determined by the ID used to create the
-	 * INavigatorContentService ({@link #getViewerId() }). See
-	 * {@link #createCommonContentProvider() } for more information about how
-	 * content providers are located for the root of the viewer. The root
-	 * content providers are calculated once. If a new element is supplied, a
-	 * client must call {@link #update() } prior in order to reset the calculated
-	 * root providers.
-	 * </p>
-	 * 
-	 * @param anElement
-	 *            An element from the tree (generally the input of the viewer)
-	 * @return The set of content providers that can provide root elements for a
-	 *         viewer.
-	 */
-	public ITreeContentProvider[] findRootContentProviders(Object anElement) {
-		if (rootContentProviders != null) {
-			return rootContentProviders;
-		}
-		synchronized (this) {
-			if (rootContentProviders == null) {
-				rootContentProviders = extractContentProviders(findRootContentExtensions(anElement));
-
-			}
-		}
-		return rootContentProviders;
-	}
-
-	/**
-	 * 
-	 * Return all of the label providers that are enabled for the given element.
-	 * A label provider is 'enabled' if its corresponding content provider
-	 * returned the element, or the element is described in the content
-	 * extension's <b>triggerPoints</b> expression.
-	 * 
-	 * @param anElement
-	 *            An element from the tree (any element contributed to the
-	 *            tree).
-	 * @return The set of label providers that may be able to provide a valid
-	 *         (non-null) label.
-	 */
-	public ILabelProvider[] findRelevantLabelProviders(Object anElement) {
-		return extractLabelProviders(findContentExtensionsWithPossibleChild(
-				anElement, false));
-	}
-
-	/**
-	 * Search for extensions that declare the given element in their
-	 * <b>triggerPoints</b> expression.
-	 * 
-	 * @param anElement
-	 *            The element to use in the query
-	 * @return The set of {@link INavigatorContentExtension}s that are
-	 *         <i>visible</i> and <i>active</i> for this content service and
-	 *         either declared through a
-	 *         <b>org.eclipse.ui.navigator.viewer/viewerContentBinding</b> to be
-	 *         a root element or have a <b>triggerPoints</b> expression that is
-	 *         <i>enabled</i> for the given element.
-	 */
-	public Set findRootContentExtensions(Object anElement) {
-		return findRootContentExtensions(anElement, true);
-	}
-
-	/**
-	 * Search for extensions that declare the given element in their
-	 * <b>triggerPoints</b> expression.
-	 * 
-	 * @param anElement
-	 *            The element to use in the query
-	 * @param toRespectViewerRoots
-	 *            True respect the <b>viewerContentBinding</b>s, False will look
-	 *            only for matching <b>triggerPoints</b> expressions.
-	 * @return The set of {@link INavigatorContentExtension}s that are
-	 *         <i>visible</i> and <i>active</i> for this content service and
-	 *         either declared through a
-	 *         <b>org.eclipse.ui.navigator.viewer/viewerContentBinding</b> to be
-	 *         a root element or have a <b>triggerPoints</b> expression that is
-	 *         <i>enabled</i> for the given element.
-	 */
-	public Set findRootContentExtensions(Object anElement,
-			boolean toRespectViewerRoots) {
-
-		SortedSet rootExtensions = new TreeSet(
-				ExtensionPriorityComparator.INSTANCE);
-		if (toRespectViewerRoots
-				&& viewerDescriptor.hasOverriddenRootExtensions()) {
-
-			NavigatorContentDescriptor[] descriptors = CONTENT_DESCRIPTOR_REGISTRY
-					.getAllContentDescriptors();
-
-			NavigatorContentExtension extension = null;
-			for (int i = 0; i < descriptors.length; i++) {
-				if (isActive(descriptors[i].getId())
-						&& isRootExtension(descriptors[i].getId())) {
-					extension = getExtension(descriptors[i]);
-					if (!extension.hasLoadingFailed()) {
-						rootExtensions.add(extension);
-					}
-				}
-			}
-		}
-		if (rootExtensions.isEmpty()) {
-			return findContentExtensionsByTriggerPoint(anElement);
-		}
-		return rootExtensions;
-	}
-
-	/**
-	 * Search for extensions that declare the given element in their
-	 * <b>possibleChildren</b> expression.
-	 * 
-	 * @param anElement
-	 *            The element to use in the query
-	 * @return The set of {@link INavigatorContentExtension}s that are
-	 *         <i>visible</i> and <i>active</i> for this content service and
-	 *         have a <b>possibleChildren</b> expression that is <i>enabled</i>
-	 *         for the given element.
-	 */
-	public Set findOverrideableContentExtensionsByTriggerPoint(Object anElement) {
-		Set overrideableExtensions = new TreeSet(
-				ExtensionPriorityComparator.INSTANCE);
-		Set descriptors = findDescriptorsByTriggerPoint(anElement);
-		for (Iterator iter = descriptors.iterator(); iter.hasNext();) {
-			INavigatorContentDescriptor descriptor = (INavigatorContentDescriptor) iter
-					.next();
-			if (descriptor.hasOverridingExtensions()) {
-				overrideableExtensions.add(getExtension(descriptor));
-			}
-		}
-		return overrideableExtensions;
-	}
-
-	/**
-	 * Search for extensions that declare the given element in their
-	 * <b>possibleChildren</b> expression.
-	 * 
-	 * @param anElement
-	 *            The element to use in the query
-	 * @return The set of {@link INavigatorContentExtension}s that are
-	 *         <i>visible</i> and <i>active</i> for this content service and
-	 *         have a <b>possibleChildren</b> expression that is <i>enabled</i>
-	 *         for the given element.
-	 */
-	public Set findOverrideableContentExtensionsForPossibleChild(
-			Object anElement) {
-		Set overrideableExtensions = new TreeSet(
-				ExtensionPriorityComparator.INSTANCE);
-		Set descriptors = findDescriptorsWithPossibleChild(anElement, false);
-		for (Iterator iter = descriptors.iterator(); iter.hasNext();) {
-			INavigatorContentDescriptor descriptor = (INavigatorContentDescriptor) iter
-					.next();
-			if (descriptor.hasOverridingExtensions()) {
-				overrideableExtensions.add(getExtension(descriptor));
-			}
-		}
-		return overrideableExtensions;
-	}
-
-	/*
-	 * (Non-Javadoc)
-	 * 
-	 * @see INavigatorContentService#getContentDescriptorById(String)
-	 */
-	public INavigatorContentDescriptor getContentDescriptorById(
-			String anExtensionId) {
-		return CONTENT_DESCRIPTOR_REGISTRY.getContentDescriptor(anExtensionId);
-	}
-
-	/**
-	 * 
-	 * @param anExtensionId
-	 *            The id used to define the
-	 *            <b>org.eclipse.ui.navigator.navigatorContent
-	 *            /navigatorContent</b> extension.
-	 * @return An instance of the content extension for the given extension id.
-	 *         May return <b>null</b> if the id is invalid.
-	 */
-	public INavigatorContentExtension getContentExtensionById(
-			String anExtensionId) {
-		NavigatorContentDescriptor descriptor = CONTENT_DESCRIPTOR_REGISTRY
-				.getContentDescriptor(anExtensionId);
-		if (descriptor != null)
-			return getExtension(descriptor);
-		return null;
-	}
-
-	/**
-	 * Search for extensions that declare the given element in their
-	 * <b>triggerPoints</b> expression.
-	 * 
-	 * @param anElement
-	 *            The element to use in the query
-	 * @return The set of {@link INavigatorContentExtension}s that are
-	 *         <i>visible</i> and <i>active</i> for this content service and
-	 *         have a <b>triggerPoints</b> expression that is <i>enabled</i> for
-	 *         the given element.
-	 */
-	public Set findContentExtensionsByTriggerPoint(Object anElement) {
-		return findContentExtensionsByTriggerPoint(anElement, true);
-	}
-
-	/**
-	 * Search for extensions that declare the given element in their
-	 * <b>triggerPoints</b> expression.
-	 * 
-	 * @param anElement
-	 *            The element to use in the query
-	 * @param toLoadIfNecessary
-	 *            True will force the load of the extension, False will not
-	 * @return The set of {@link INavigatorContentExtension}s that are
-	 *         <i>visible</i> and <i>active</i> for this content service and
-	 *         have a <b>triggerPoints</b> expression that is <i>enabled</i> for
-	 *         the given element.
-	 */
-	public Set findContentExtensionsByTriggerPoint(Object anElement,
-			boolean toLoadIfNecessary) {
-		Set enabledDescriptors = findDescriptorsByTriggerPoint(anElement);
-		return extractDescriptorInstances(enabledDescriptors, toLoadIfNecessary);
-	}
-
-	/**
-	 * Search for extensions that declare the given element in their
-	 * <b>possibleChildren</b> expression.
-	 * 
-	 * @param anElement
-	 *            The element to use in the query
-	 * @return The set of {@link INavigatorContentExtension}s that are
-	 *         <i>visible</i> and <i>active</i> for this content service and
-	 *         have a <b>possibleChildren</b> expression that is <i>enabled</i>
-	 *         for the given element.
-	 */
-	public Set findContentExtensionsWithPossibleChild(Object anElement) {
-		return findContentExtensionsWithPossibleChild(anElement, true);
-	}
-
-	/**
-	 * Search for extensions that declare the given element in their
-	 * <b>possibleChildren</b> expression.
-	 * 
-	 * @param anElement
-	 *            The element to use in the query
-	 * @param toLoadIfNecessary
-	 *            True will force the load of the extension, False will not
-	 * @return The set of {@link INavigatorContentExtension}s that are
-	 *         <i>visible</i> and <i>active</i> for this content service and
-	 *         have a <b>possibleChildren</b> expression that is <i>enabled</i>
-	 *         for the given element.
-	 */
-	public Set findContentExtensionsWithPossibleChild(Object anElement,
-			boolean toLoadIfNecessary) {
-		Set enabledDescriptors = findDescriptorsWithPossibleChild(anElement);
-		return extractDescriptorInstances(enabledDescriptors, toLoadIfNecessary);
-	}
-
-	/**
-	 * Remember that the elements in the given array came from the given source
-	 * 
-	 * @param source
-	 *            The descriptor of the extension that contributed the set of
-	 *            elements.
-	 * @param elements
-	 *            An array of elements from the given source.
-	 */
-	public synchronized void rememberContribution(
-			NavigatorContentDescriptor source, Object[] elements) {
-		if (source != null && elements != null) {
-			for (int i = 0; i < elements.length; i++)
-				rememberContribution(source, elements[i]);
-		}
-	}
-
-	/**
-	 * Remember that the elements in the given array came from the given source
-	 * 
-	 * @param source
-	 *            The descriptor of the extension that contributed the set of
-	 *            elements.
-	 * @param element
-	 *            An element from the given source.
-	 */
-	public synchronized void rememberContribution(
-			NavigatorContentDescriptor source, Object element) {
-		Map memory = getContributionMemory();
-		if (element != null) {
-			if (memory.containsKey(element))
-				return;
-			if (source != null)
-				memory.put(element, source);
-		}
-	}
-
-	/**
-	 * Forget about the specified element
-	 * 
-	 * @param element
-	 *            The element to forget.
-	 */
-	public synchronized void forgetContribution(Object element) {
-		if (element != null)
-			getContributionMemory().remove(element);
-	}
-
-	/**
-	 * 
-	 * @param element
-	 *            The element contributed by the descriptor to be returned
-	 * @return The descriptor that contributed the element or null.
-	 * @see #findContentExtensionsWithPossibleChild(Object)
-	 */
-	public NavigatorContentDescriptor getSourceOfContribution(Object element) {
-		return (NavigatorContentDescriptor) getContributionMemory()
-				.get(element);
-	}
-
-	/**
-	 * @return Returns the contributionMemory.
-	 */
-	public Map getContributionMemory() {
-		if (contributionMemory != null) {
-			return contributionMemory;
-		}
-		synchronized (this) {
-			if (contributionMemory == null) {
-				contributionMemory = new WeakHashMap();
-			}
-		}
-
-		return contributionMemory;
-	}
-
-	/**
-	 * Search for extensions that declare the given element in their
-	 * <b>triggerPoints</b> expression.
-	 * 
-	 * @param anElement
-	 *            The element to use in the query
-	 * 
-	 * @return The set of {@link INavigatorContentDescriptor}s that are
-	 *         <i>visible</i> and <i>active</i> for this content service and
-	 *         have a <b>triggerPoints</b> expression that is <i>enabled</i> for
-	 *         the given element.
-	 */
-	public Set findDescriptorsByTriggerPoint(Object anElement) {
-
-		NavigatorContentDescriptor descriptor = getSourceOfContribution(anElement);
-		Set result = new TreeSet(ExtensionPriorityComparator.INSTANCE);
-		if (descriptor != null) {
-			result.add(descriptor);
-		}
-		result.addAll(CONTENT_DESCRIPTOR_REGISTRY
-				.findDescriptorsForTriggerPoint(anElement, assistant));
-		return result;
-	}
-
-	/**
-	 * Search for extensions that declare the given element in their
-	 * <b>possibleChildren</b> expression.
-	 * 
-	 * @param anElement
-	 *            The element to use in the query
-	 * @return The set of {@link INavigatorContentDescriptor}s that are
-	 *         <i>visible</i> and <i>active</i> for this content service and
-	 *         have a <b>possibleChildren</b> expression that is <i>enabled</i>
-	 *         for the given element.
-	 */
-	public Set findDescriptorsWithPossibleChild(Object anElement) {
-		return findDescriptorsWithPossibleChild(anElement, true);
-	}
-
-	/**
-	 * Search for extensions that declare the given element in their
-	 * <b>possibleChildren</b> expression.
-	 * 
-	 * @param anElement
-	 *            The element to use in the query
-	 * @param toComputeOverrides
-	 *            True indicates the overridden tree should be traversed.
-	 * @return The set of {@link INavigatorContentDescriptor}s that are
-	 *         <i>visible</i> and <i>active</i> for this content service and
-	 *         have a <b>possibleChildren</b> expression that is <i>enabled</i>
-	 *         for the given element.
-	 */
-	public Set findDescriptorsWithPossibleChild(Object anElement,
-			boolean toComputeOverrides) {
-
-		NavigatorContentDescriptor descriptor = getSourceOfContribution(anElement);
-		Set result = new TreeSet(ExtensionPriorityComparator.INSTANCE);
-		if (descriptor != null) {
-			result.add(descriptor);
-		}
-		result.addAll(CONTENT_DESCRIPTOR_REGISTRY
-				.findDescriptorsForPossibleChild(anElement, assistant,
-						toComputeOverrides));
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @seeorg.eclipse.ui.internal.navigator.INavigatorContentService#
-	 * onExtensionActivation(java.lang.String, java.lang.String, boolean)
-	 */
-	public void onExtensionActivation(String aViewerId,
-			String[] aNavigatorExtensionId, boolean toEnable) {
-		synchronized (this) {
-			try {
-				NavigatorContentDescriptor key;
-				NavigatorContentExtension extension;
-				for (Iterator iter = contentExtensions.keySet().iterator(); iter
-						.hasNext();) {
-					key = (NavigatorContentDescriptor) iter.next();
-					INavigatorActivationService activation = getActivationService();
-					if (!activation.isNavigatorExtensionActive(key.getId())) {
-						extension = (NavigatorContentExtension) contentExtensions
-								.get(key);
-						iter.remove();
-						/*
-						 * There really shouldn't be any way that this can be
-						 * null, but just to be safe
-						 */
-						if (extension != null) {
-							extension.dispose();
-						}
-					}
-				}
-			} catch (RuntimeException e) {
-				String msg = e.getMessage() != null ? e.getMessage() : e
-						.toString();
-				NavigatorPlugin.logError(0, msg, e);
-			}
-		}
-		update();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.navigator.INavigatorContentService#update()
-	 */
-	public void update() {
-		rootContentProviders = null;
-		if (structuredViewerManager != null) {
-			structuredViewerManager.safeRefresh();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.internal.navigator.INavigatorContentService#getViewerId()
-	 */
-	public final String getViewerId() {
-		return viewerDescriptor.getViewerId();
-	}
-
-	/**
-	 * 
-	 * @param aDescriptorKey
-	 *            A descriptor
-	 * @return The cached NavigatorContentExtension from the descriptor
-	 */
-	public final NavigatorContentExtension getExtension(
-			INavigatorContentDescriptor aDescriptorKey) {
-		return getExtension(aDescriptorKey, true);
-	}
-
-	/**
-	 * 
-	 * @param aDescriptorKey
-	 * @param toLoadIfNecessary
-	 *            True if the extension should be loaded if it is not already.
-	 * @return The instance of the extension for the given descriptor key.
-	 */
-	public final NavigatorContentExtension getExtension(
-			INavigatorContentDescriptor aDescriptorKey,
-			boolean toLoadIfNecessary) {
-		/* Query and return the relevant descriptor instance */
-		NavigatorContentExtension extension = (NavigatorContentExtension) contentExtensions
-				.get(aDescriptorKey);
-		if (extension != null || !toLoadIfNecessary) {
-			return extension;
-		}
-
-		/*
-		 * If the descriptor instance hasn't been created yet, then we need to
-		 * (1) verify that it wasn't added by another thread, (2) create and add
-		 * the result into the map
-		 */
-		synchronized (this) {
-			extension = (NavigatorContentExtension) contentExtensions
-					.get(aDescriptorKey);
-			if (extension == null) {
-				contentExtensions.put(aDescriptorKey,
-						(extension = new NavigatorContentExtension(
-								(NavigatorContentDescriptor) aDescriptorKey,
-								this, structuredViewerManager)));
-				notifyListeners(extension);
-			}
-		}
-		return extension;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @seeorg.eclipse.ui.internal.navigator.INavigatorContentService#
-	 * getViewerDescriptor()
-	 */
-	public INavigatorViewerDescriptor getViewerDescriptor() {
-		return viewerDescriptor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.internal.navigator.INavigatorContentService#restoreState
-	 * (org.eclipse.ui.IMemento)
-	 */
-	public void restoreState(final IMemento aMemento) {
-		synchronized (this) {
-			List runnables = new ArrayList();
-			for (Iterator extensionItr = getExtensions().iterator(); extensionItr
-					.hasNext();) {
-				final NavigatorContentExtension element = (NavigatorContentExtension) extensionItr
-						.next();
-				ISafeRunnable runnable = new ISafeRunnable() {
-					public void run() throws Exception {
-						element.restoreState(aMemento);
-
-					}
-
-					public void handleException(Throwable exception) {
-						NavigatorPlugin.logError(0,
-								"Could not restore state for Common Navigator content extension" //$NON-NLS-1$
-										+ element.getId(), exception);
-
-					}
-				};
-				runnables.add(runnable);
-			}
-			for (Iterator iterator = runnables.iterator(); iterator.hasNext();) {
-				ISafeRunnable runnable = (ISafeRunnable) iterator.next();
-				SafeRunner.run(runnable);
-
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.internal.navigator.INavigatorContentService#saveState(
-	 * org.eclipse.ui.IMemento)
-	 */
-	public void saveState(IMemento aMemento) {
-		synchronized (this) {
-			for (Iterator extensionItr = getExtensions().iterator(); extensionItr
-					.hasNext();) {
-				NavigatorContentExtension element = (NavigatorContentExtension) extensionItr
-						.next();
-				element.saveState(aMemento);
-			}
-		}
-	}
-
-	public boolean isActive(String anExtensionId) {
-		return assistant.isActive(anExtensionId);
-	}
-
-	public boolean isVisible(String anExtensionId) {
-		return assistant.isVisible(anExtensionId);
-	}
-
-	protected final Collection getExtensions() {
-		return (contentExtensions.size() > 0) ? Collections
-				.unmodifiableCollection(contentExtensions.values())
-				: Collections.EMPTY_LIST;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.internal.navigator.INavigatorContentService#addListener
-	 * (org
-	 * .eclipse.ui.internal.navigator.extensions.INavigatorContentServiceListener
-	 * )
-	 */
-	public void addListener(INavigatorContentServiceListener aListener) {
-		listeners.add(aListener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.INavigatorContentService#getFilterService()
-	 */
-	public INavigatorFilterService getFilterService() {
-		if (navigatorFilterService == null) {
-			navigatorFilterService = new NavigatorFilterService(this);
-		}
-		return navigatorFilterService;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.INavigatorContentService#getFilterService()
-	 */
-	public INavigatorSorterService getSorterService() {
-		if (navigatorSorterService == null) {
-			navigatorSorterService = new NavigatorSorterService(this);
-		}
-		return navigatorSorterService;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.INavigatorContentService#getFilterService()
-	 */
-	public INavigatorPipelineService getPipelineService() {
-		if (navigatorPipelineService == null) {
-			navigatorPipelineService = new NavigatorPipelineService(this);
-		}
-		return navigatorPipelineService;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.INavigatorContentService#getDnDService()
-	 */
-	public INavigatorDnDService getDnDService() {
-		if (navigatorDnDService == null) {
-			navigatorDnDService = new NavigatorDnDService(this);
-		}
-		return navigatorDnDService;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.navigator.INavigatorContentService#getActivationService()
-	 */
-	public INavigatorActivationService getActivationService() {
-
-		if (navigatorActivationService == null) {
-			navigatorActivationService = new NavigatorActivationService(this);
-		}
-		return navigatorActivationService;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.navigator.INavigatorContentService#getSaveableService()
-	 */
-	public INavigatorSaveablesService getSaveablesService() {
-		synchronized (this) {
-			if (navigatorSaveablesService == null) {
-				navigatorSaveablesService = new NavigatorSaveablesService(this);
-				assistant.addListener(navigatorSaveablesService);
-			}
-			return navigatorSaveablesService;
-		}
-	}
-
-	/**
-	 * Not API as of 3.3.
-	 * 
-	 * @return The extension state service for this content service.
-	 * 
-	 */
-	public NavigatorExtensionStateService getExtensionStateService() {
-		if (navigatorExtensionStateService == null) {
-			navigatorExtensionStateService = new NavigatorExtensionStateService(
-					this);
-		}
-		return navigatorExtensionStateService;
-	}
-
-	/**
-	 * Non-API method to return a shell.
-	 * 
-	 * @return A shell associated with the current viewer (if any) or
-	 *         <b>null</b>.
-	 */
-	public Shell getShell() {
-		if (structuredViewerManager != null
-				&& structuredViewerManager.getViewer() != null) {
-			return structuredViewerManager.getViewer().getControl().getShell();
-		}
-		return null;
-	}
-
-	protected boolean isRootExtension(String anExtensionId) {
-		return assistant.isRootExtension(anExtensionId);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.internal.navigator.INavigatorContentService#removeListener
-	 * (
-	 * org.eclipse.ui.internal.navigator.extensions.INavigatorContentServiceListener
-	 * )
-	 */
-	public void removeListener(INavigatorContentServiceListener aListener) {
-		listeners.remove(aListener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "ContentService[" + viewerDescriptor.getViewerId() + "]"; //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	private void notifyListeners(NavigatorContentExtension aDescriptorInstance) {
-
-		if (listeners.size() == 0) {
-			return;
-		}
-		INavigatorContentServiceListener listener = null;
-		List failedListeners = null;
-		for (Iterator listenersItr = listeners.iterator(); listenersItr
-				.hasNext();) {
-			try {
-				listener = (INavigatorContentServiceListener) listenersItr
-						.next();
-				listener.onLoad(aDescriptorInstance);
-			} catch (RuntimeException re) {
-				if (failedListeners == null) {
-					failedListeners = new ArrayList();
-				}
-				failedListeners.add(listener);
-			}
-		}
-		if (failedListeners != null) {
-			listeners.removeAll(failedListeners);
-		}
-	}
-
-	private ITreeContentProvider[] extractContentProviders(
-			Set theDescriptorInstances) {
-		if (theDescriptorInstances.size() == 0) {
-			return NO_CONTENT_PROVIDERS;
-		}
-		List resultProvidersList = new ArrayList();
-		for (Iterator itr = theDescriptorInstances.iterator(); itr.hasNext();) {
-			resultProvidersList.add(((NavigatorContentExtension) itr.next())
-					.internalGetContentProvider());
-		}
-		return (ITreeContentProvider[]) resultProvidersList
-				.toArray(new ITreeContentProvider[resultProvidersList.size()]);
-	}
-
-	private Set extractDescriptorInstances(Set theDescriptors,
-			boolean toLoadAllIfNecessary) {
-		if (theDescriptors.size() == 0) {
-			return Collections.EMPTY_SET;
-		}
-		Set resultInstances = new TreeSet(ExtensionPriorityComparator.INSTANCE);
-		for (Iterator descriptorIter = theDescriptors.iterator(); descriptorIter
-				.hasNext();) {
-			NavigatorContentExtension extension = getExtension(
-					(NavigatorContentDescriptor) descriptorIter.next(),
-					toLoadAllIfNecessary);
-			if (extension != null) {
-				resultInstances.add(extension);
-
-			}
-		}
-		return resultInstances;
-	}
-
-	private ILabelProvider[] extractLabelProviders(Set theDescriptorInstances) {
-		if (theDescriptorInstances.size() == 0) {
-			return NO_LABEL_PROVIDERS;
-		}
-		List resultProvidersList = new ArrayList();
-		for (Iterator itr = theDescriptorInstances.iterator(); itr.hasNext();) {
-			resultProvidersList.add(((NavigatorContentExtension) itr.next())
-					.getLabelProvider());
-		}
-		return (ILabelProvider[]) resultProvidersList
-				.toArray(new ILabelProvider[resultProvidersList.size()]);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentServiceContentProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentServiceContentProvider.java
deleted file mode 100644
index 828cc04..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentServiceContentProvider.java
+++ /dev/null
@@ -1,911 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.ITreePathContentProvider;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptor;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentExtension;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorViewerDescriptor;
-import org.eclipse.ui.navigator.CommonViewer;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorViewerDescriptor;
-import org.eclipse.ui.navigator.IPipelinedTreeContentProvider;
-import org.eclipse.ui.navigator.OverridePolicy;
-
-/**
- * <p>
- * Provides relevant content based on the associated
- * {@link org.eclipse.ui.internal.navigator.NavigatorContentService}&nbsp; for
- * a TreeViewer .
- * </p>
- * <p>
- * Except for the dependency on
- * {@link org.eclipse.ui.internal.navigator.NavigatorContentService}, this
- * class has no dependencies on the rest of the Common Navigator framework. Tree
- * viewers that would like to use the extensions defined by the Common
- * Navigator, without using the actual view part or other pieces of
- * functionality (filters, sorting, etc) may choose to use this class, in effect
- * using an extensible, aggregating, delegate content provider.
- * </p>
- * 
- * @see org.eclipse.ui.internal.navigator.NavigatorContentService
- * @see org.eclipse.ui.internal.navigator.NavigatorContentServiceLabelProvider
- * 
- * @since 3.2
- * 
- */
-public class NavigatorContentServiceContentProvider implements
-		ITreeContentProvider, ITreePathContentProvider {
-
-	private static final Object[] NO_CHILDREN = new Object[0];
-
-	private final NavigatorContentService contentService;
-
-	private final boolean isContentServiceSelfManaged;
-	
-	private final boolean enforceHasChildren;
-
-	private Viewer viewer;
-
-	/**
-	 * <p>
-	 * Creates a cached {@link NavigatorContentService}&nbsp;from the given
-	 * viewer Id.
-	 * </p>
-	 * 
-	 * @param aViewerId
-	 *            The associated viewer id that this
-	 *            NavigatorContentServiceContentProvider will provide content
-	 *            for
-	 */
-	public NavigatorContentServiceContentProvider(String aViewerId) {
-		super();
-		contentService = new NavigatorContentService(aViewerId);
-		INavigatorViewerDescriptor vDesc = contentService.getViewerDescriptor();
-		enforceHasChildren = vDesc.getBooleanConfigProperty(NavigatorViewerDescriptor.PROP_ENFORCE_HAS_CHILDREN);
-		isContentServiceSelfManaged = true;
-	}
-
-	/**
-	 * <p>
-	 * Uses the supplied content service to acquire the available extensions.
-	 * </p>
-	 * 
-	 * @param aContentService
-	 *            The associated NavigatorContentService that should be used to
-	 *            acquire information.
-	 */
-	public NavigatorContentServiceContentProvider(
-			NavigatorContentService aContentService) {
-		super();
-		contentService = aContentService;
-		isContentServiceSelfManaged = false;
-		INavigatorViewerDescriptor vDesc = contentService.getViewerDescriptor();
-		enforceHasChildren = vDesc.getBooleanConfigProperty(NavigatorViewerDescriptor.PROP_ENFORCE_HAS_CHILDREN);
-	}
-
-	/**
-	 * 
-	 * <p>
-	 * Return the root objects for the supplied anInputElement. anInputElement
-	 * is the root thing that the viewer visualizes.
-	 * </p>
-	 * <p>
-	 * This method will call out to its {@link NavigatorContentService}&nbsp;for
-	 * extensions that are enabled on the supplied anInputElement or enabled on
-	 * the viewerId supplied when the {@link NavigatorContentService}&nbsp; was
-	 * created (either by this class or its client). The extensions will then be
-	 * queried for relevant content. The children returned from each extension
-	 * will be aggregated and returned as is -- there is no additional sorting
-	 * or filtering at this level.
-	 * </p>
-	 * <p>
-	 * The results of this method will be displayed in the root of the
-	 * TreeViewer.
-	 * </p>
-	 * {@inheritDoc}
-	 * 
-	 * @param anInputElement
-	 *            The relevant element that a client would like children for -
-	 *            the input element of the TreeViewer
-	 * @return A non-null array of objects that are logical children of
-	 *         anInputElement
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public synchronized Object[] getElements(Object anInputElement) {
-		Set rootContentExtensions = contentService
-				.findRootContentExtensions(anInputElement);
-		if (rootContentExtensions.size() == 0) {
-			return NO_CHILDREN;
-		}
-		ContributorTrackingSet finalElementsSet = new ContributorTrackingSet(contentService);
-		ContributorTrackingSet localSet = new ContributorTrackingSet(contentService);		
-
-		Object[] contributedChildren = null;
-		NavigatorContentExtension foundExtension;
-		NavigatorContentExtension[] overridingExtensions;
-		for (Iterator itr = rootContentExtensions.iterator(); itr.hasNext();) {
-			foundExtension = (NavigatorContentExtension) itr.next();
-			try {
-
-				if (!isOverridingExtensionInSet(foundExtension.getDescriptor(),
-						rootContentExtensions)) {
-
-					contributedChildren = foundExtension.internalGetContentProvider()
-							.getElements(anInputElement);
-					
-					localSet.setContents(contributedChildren);
-
-					overridingExtensions = foundExtension
-							.getOverridingExtensionsForTriggerPoint(anInputElement);
-
-					if (overridingExtensions.length > 0) { 
-						localSet = pipelineElements(anInputElement,
-								overridingExtensions, localSet);						
-					}
-					finalElementsSet.addAll(localSet);
-				}
-			} catch (RuntimeException re) {
-				NavigatorPlugin
-						.logError(
-								0,
-								NLS
-										.bind(
-												CommonNavigatorMessages.Could_not_provide_children_for_element,
-												new Object[] { foundExtension
-														.getDescriptor()
-														.getId() }), re);
-			} catch (Error e) {
-				NavigatorPlugin
-						.logError(
-								0,
-								NLS
-										.bind(
-												CommonNavigatorMessages.Could_not_provide_children_for_element,
-												new Object[] { foundExtension
-														.getDescriptor()
-														.getId() }), e);
-
-			}
-		}
-		return finalElementsSet.toArray();
-	}
-
-	/**
-	 * <p>
-	 * Return the children of the supplied aParentElement
-	 * </p>
-	 * 
-	 * <p>
-	 * This method will call out to its {@link NavigatorContentService}&nbsp;for
-	 * extensions that are enabled on the supplied aParentElement. The
-	 * extensions will then be queried for children for aParentElement. The
-	 * children returned from each extension will be aggregated and returned as
-	 * is -- there is no additional sorting or filtering at this level.
-	 * </p>
-	 * <p>
-	 * The results of this method will be displayed as children of the supplied
-	 * element in the TreeViewer.
-	 * </p>
-	 * {@inheritDoc}
-	 * 
-	 * @param aParentElement
-	 *            An element that requires children content in the viewer (e.g.
-	 *            an end-user expanded a node)
-	 * @return A non-null array of objects that are logical children of
-	 *         aParentElement
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-	 */
-	public synchronized Object[] getChildren(Object aParentElement) {	
-		return internalGetChildren(aParentElement);
-	}
-
-	private Object[] internalGetChildren(Object aParentElementOrPath) {
-		Object aParentElement = internalAsElement(aParentElementOrPath);
-		Set enabledExtensions = contentService
-				.findContentExtensionsByTriggerPoint(aParentElement);
-		if (enabledExtensions.size() == 0) {
-			return NO_CHILDREN;
-		}
-		ContributorTrackingSet finalChildrenSet = new ContributorTrackingSet(contentService);
-		ContributorTrackingSet localSet = new ContributorTrackingSet(contentService);
-
-		Object[] contributedChildren = null;
-		NavigatorContentExtension foundExtension;
-		NavigatorContentExtension[] overridingExtensions;
-		for (Iterator itr = enabledExtensions.iterator(); itr.hasNext();) {
-			foundExtension = (NavigatorContentExtension) itr.next();
-			try {
-
-				if (!isOverridingExtensionInSet(foundExtension.getDescriptor(),
-						enabledExtensions)) {
-
-					contributedChildren = foundExtension.internalGetContentProvider()
-							.getChildren(aParentElementOrPath);
-
-					overridingExtensions = foundExtension
-							.getOverridingExtensionsForTriggerPoint(aParentElement);
-					
-					localSet.setContents(contributedChildren);
-
-					if (overridingExtensions.length > 0) {
-						// TODO: could pass tree path through pipeline						
-						localSet = pipelineChildren(aParentElement,
-								overridingExtensions, localSet);
-					}
-					finalChildrenSet.addAll(localSet);
-				}
-			} catch (RuntimeException re) {
-				NavigatorPlugin
-						.logError(
-								0,
-								NLS
-										.bind(
-												CommonNavigatorMessages.Could_not_provide_children_for_element,
-												new Object[] { foundExtension
-														.getDescriptor()
-														.getId() }), re);
-			} catch (Error e) {
-				NavigatorPlugin
-						.logError(
-								0,
-								NLS
-										.bind(
-												CommonNavigatorMessages.Could_not_provide_children_for_element,
-												new Object[] { foundExtension
-														.getDescriptor()
-														.getId() }), e);
-
-			}
-		}
-		return finalChildrenSet.toArray();
-	}
-
-	/**
-	 * Query each of <code>theOverridingExtensions</code> for children, and
-	 * then pipe them through the Pipeline content provider.
-	 * 
-	 * @param aParentOrPath
-	 *            The parent element in the tree
-	 * @param theOverridingExtensions
-	 *            The set of overriding extensions that should participate in
-	 *            the pipeline chain
-	 * @param theCurrentChildren
-	 *            The current children to return to the viewer (should be
-	 *            modifiable)
-	 * @return The set of children to return to the viewer
-	 */
-	private ContributorTrackingSet pipelineChildren(Object aParentOrPath,
-			NavigatorContentExtension[] theOverridingExtensions,
-			ContributorTrackingSet theCurrentChildren) {
-		IPipelinedTreeContentProvider pipelinedContentProvider;
-		NavigatorContentExtension[] overridingExtensions;
-		ContributorTrackingSet pipelinedChildren = theCurrentChildren;
-		for (int i = 0; i < theOverridingExtensions.length; i++) {
-
-			if (theOverridingExtensions[i].getContentProvider() instanceof IPipelinedTreeContentProvider) {
-				pipelinedContentProvider = (IPipelinedTreeContentProvider) theOverridingExtensions[i]
-						.getContentProvider();
-				
-				pipelinedChildren.setContributor((NavigatorContentDescriptor) theOverridingExtensions[i].getDescriptor());				
-				pipelinedContentProvider.getPipelinedChildren(aParentOrPath,
-						pipelinedChildren);
-				
-				pipelinedChildren.setContributor(null);
-				
-				overridingExtensions = theOverridingExtensions[i]
-						.getOverridingExtensionsForTriggerPoint(aParentOrPath);
-				if (overridingExtensions.length > 0) {
-					pipelinedChildren = pipelineChildren(aParentOrPath,
-							overridingExtensions, pipelinedChildren);
-				}
-			}
-		}
-
-		return pipelinedChildren;
-
-	}
-
-	/**
-	 * Query each of <code>theOverridingExtensions</code> for elements, and
-	 * then pipe them through the Pipeline content provider.
-	 * 
-	 * @param anInputElement
-	 *            The input element in the tree
-	 * @param theOverridingExtensions
-	 *            The set of overriding extensions that should participate in
-	 *            the pipeline chain
-	 * @param theCurrentElements
-	 *            The current elements to return to the viewer (should be
-	 *            modifiable)
-	 * @return The set of elements to return to the viewer
-	 */
-	private ContributorTrackingSet pipelineElements(Object anInputElement,
-			NavigatorContentExtension[] theOverridingExtensions,
-			ContributorTrackingSet theCurrentElements) {
-		IPipelinedTreeContentProvider pipelinedContentProvider;
-		NavigatorContentExtension[] overridingExtensions;
-		ContributorTrackingSet pipelinedElements = theCurrentElements;
-		for (int i = 0; i < theOverridingExtensions.length; i++) {
-
-			if (theOverridingExtensions[i].getContentProvider() instanceof IPipelinedTreeContentProvider) {
-				pipelinedContentProvider = (IPipelinedTreeContentProvider) theOverridingExtensions[i]
-						.getContentProvider();
-
-				pipelinedElements.setContributor((NavigatorContentDescriptor) theOverridingExtensions[i].getDescriptor());
-				pipelinedContentProvider.getPipelinedElements(anInputElement,
-						pipelinedElements);
-				pipelinedElements.setContributor(null);
-
-				overridingExtensions = theOverridingExtensions[i]
-						.getOverridingExtensionsForTriggerPoint(anInputElement);
-				if (overridingExtensions.length > 0) {
-					pipelinedElements = pipelineElements(anInputElement,
-							overridingExtensions, pipelinedElements);
-				}
-			}
-		}
-		return pipelinedElements;
-	}
-
-	/**
-	 * Currently this method only checks one level deep. If the suppressed
-	 * extension of the given descriptor is contained lower in the tree, then
-	 * the extension could still be invoked twice.
-	 * 
-	 * @param aDescriptor
-	 *            The descriptor which may be overriding other extensions.
-	 * @param theEnabledExtensions
-	 *            The other available extensions.
-	 * @return True if the results should be pipelined through the downstream
-	 *         extensions.
-	 */
-	private boolean isOverridingExtensionInSet(
-			INavigatorContentDescriptor aDescriptor, Set theEnabledExtensions) {
-
-		if (aDescriptor.getSuppressedExtensionId() != null /*
-															 * The descriptor is
-															 * an override
-															 * descriptor
-															 */
-				&& aDescriptor.getOverridePolicy() == OverridePolicy.InvokeAlwaysRegardlessOfSuppressedExt) {
-			/*
-			 * if the policy is set as such, it can lead to this extension being
-			 * invoked twice; once as a first class extension, and once an
-			 * overriding extension.
-			 */
-			if (theEnabledExtensions.contains(contentService
-					.getExtension(aDescriptor.getOverriddenDescriptor()))) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Currently this method only checks one level deep. If the suppressed
-	 * extension of the given descriptor is contained lower in the tree, then
-	 * the extension could still be invoked twice.
-	 * 
-	 * @param aDescriptor
-	 *            The descriptor which may be overriding other extensions.
-	 * @param theEnabledDescriptors
-	 *            The other available descriptors.
-	 * @return True if the results should be pipelined through the downstream
-	 *         extensions.
-	 */
-	private boolean isOverridingDescriptorInSet(
-			INavigatorContentDescriptor aDescriptor, Set theEnabledDescriptors) {
-
-		if (aDescriptor.getSuppressedExtensionId() != null /*
-															 * The descriptor is
-															 * an override
-															 * descriptor
-															 */
-				&& aDescriptor.getOverridePolicy() == OverridePolicy.InvokeAlwaysRegardlessOfSuppressedExt) {
-			/*
-			 * if the policy is set as such, it can lead to this extension being
-			 * invoked twice; once as a first class extension, and once an
-			 * overriding extension.
-			 */
-			if (theEnabledDescriptors.contains(aDescriptor.getOverriddenDescriptor())) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	
-
-	/**
-	 * <p>
-	 * Returns the logical parent of anElement.
-	 * </p>
-	 * <p>
-	 * This method requires that any extension that would like an opportunity to
-	 * supply a parent for anElement expressly indicate that in the action
-	 * expression &lt;enables&gt; statement of the
-	 * <b>org.eclipse.ui.navigator.navigatorContent </b> extension point.
-	 * </p>
-	 * {@inheritDoc}
-	 * 
-	 * @param anElement
-	 *            An element that requires its logical parent - generally as a
-	 *            result of setSelection(expand=true) on the viewer
-	 * @return The logical parent if available or null if the parent cannot be
-	 *         determined
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-	 */
-	public synchronized Object getParent(Object anElement) {
-		Set extensions = contentService
-				.findContentExtensionsWithPossibleChild(anElement);
-
-		Object parent;
-		NavigatorContentExtension foundExtension;
-		NavigatorContentExtension[] overridingExtensions;
-		for (Iterator itr = extensions.iterator(); itr.hasNext();) {
-			foundExtension = (NavigatorContentExtension) itr.next();
-			try {
-
-				if (!isOverridingExtensionInSet(foundExtension.getDescriptor(),
-						extensions)) {
-
-					parent = foundExtension.internalGetContentProvider().getParent(
-							anElement);
-
-					overridingExtensions = foundExtension
-							.getOverridingExtensionsForPossibleChild(anElement);
-
-					if (overridingExtensions.length > 0) {
-						parent = pipelineParent(anElement,
-								overridingExtensions, parent);
-					}
-
-					if (parent != null) {
-						return parent;
-					}
-				}
-			} catch (RuntimeException re) {
-				NavigatorPlugin
-						.logError(
-								0,
-								NLS
-										.bind(
-												CommonNavigatorMessages.Could_not_provide_children_for_element,
-												new Object[] { foundExtension
-														.getDescriptor()
-														.getId() }), re);
-			} catch (Error e) {
-				NavigatorPlugin
-						.logError(
-								0,
-								NLS
-										.bind(
-												CommonNavigatorMessages.Could_not_provide_children_for_element,
-												new Object[] { foundExtension
-														.getDescriptor()
-														.getId() }), e);
-
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * Query each of <code>theOverridingExtensions</code> for elements, and
-	 * then pipe them through the Pipeline content provider.
-	 * 
-	 * @param anInputElement
-	 *            The input element in the tree
-	 * @param theOverridingExtensions
-	 *            The set of overriding extensions that should participate in
-	 *            the pipeline chain
-	 * @param theCurrentParent
-	 *            The current elements to return to the viewer (should be
-	 *            modifiable)
-	 * @return The set of elements to return to the viewer
-	 */
-	private Object pipelineParent(Object anInputElement,
-			NavigatorContentExtension[] theOverridingExtensions,
-			Object theCurrentParent) {
-		IPipelinedTreeContentProvider pipelinedContentProvider;
-		NavigatorContentExtension[] overridingExtensions;
-		Object aSuggestedParent = null;
-		for (int i = 0; i < theOverridingExtensions.length; i++) {
-
-			if (theOverridingExtensions[i].getContentProvider() instanceof IPipelinedTreeContentProvider) {
-				pipelinedContentProvider = (IPipelinedTreeContentProvider) theOverridingExtensions[i]
-						.getContentProvider();
-
-				aSuggestedParent = pipelinedContentProvider.getPipelinedParent(
-						anInputElement, aSuggestedParent);
-
-				overridingExtensions = theOverridingExtensions[i]
-						.getOverridingExtensionsForTriggerPoint(anInputElement);
-				if (overridingExtensions.length > 0) {
-					aSuggestedParent = pipelineParent(anInputElement,
-							overridingExtensions, aSuggestedParent);
-				}
-			}
-		}
-		return aSuggestedParent != null ? aSuggestedParent : theCurrentParent;
-	}
-
-	/**
-	 * <p>
-	 * Used to determine of anElement should be displayed with a '+' or not.
-	 * </p>
-	 * {@inheritDoc}
-	 * 
-	 * @param anElement
-	 *            The element in question
-	 * @return True if anElement has logical children as returned by this
-	 *         content provider.
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-	 */
-	public synchronized boolean hasChildren(Object anElement) {
-		Set resultInstances = contentService
-				.findContentExtensionsByTriggerPoint(anElement);
-
-		NavigatorContentExtension ext;
-		for (Iterator itr = resultInstances.iterator(); itr.hasNext();) {
-			ext = (NavigatorContentExtension) itr.next();
-			if (!ext.isLoaded() && !enforceHasChildren) {
-				return true;
-			} else if (ext.internalGetContentProvider().hasChildren(anElement)) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * <p>
-	 * Handles any necessary clean up of the {@link NavigatorContentService}
-	 * </p>
-	 * 
-	 * <p>
-	 * <b>If a client uses this class outside of the framework of
-	 * {@link CommonViewer}, the client must ensure that this method is called
-	 * when finished. </b>
-	 * </p>
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public synchronized void dispose() {
-		if (isContentServiceSelfManaged) {
-			contentService.dispose();
-		}
-	}
-
-	/**
-	 * <p>
-	 * Indicates that the current content provider is now representing a
-	 * different input element. The input element is the root thing that the
-	 * viewer displays.
-	 * </p>
-	 * <p>
-	 * This method should handle any cleanup associated with the old input
-	 * element and any initialization associated with the new input element.
-	 * </p>
-	 * {@inheritDoc}
-	 * 
-	 * @param aViewer
-	 *            The viewer that the current content provider is associated
-	 *            with
-	 * @param anOldInput
-	 *            The original input element that the viewer was visualizing
-	 * @param aNewInput
-	 *            The new input element that the viewer will visualize.
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 * 
-	 */
-	public synchronized void inputChanged(Viewer aViewer, Object anOldInput,
-			Object aNewInput) {
-		viewer = aViewer;
-		contentService.updateService(aViewer, anOldInput, aNewInput);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITreePathContentProvider#getChildren(org.eclipse.jface.viewers.TreePath)
-	 */
-	public Object[] getChildren(TreePath parentPath) {
-		return internalGetChildren(parentPath);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITreePathContentProvider#hasChildren(org.eclipse.jface.viewers.TreePath)
-	 */
-	public boolean hasChildren(TreePath path) {
-		Object anElement = internalAsElement(path);
-		Set resultInstances = contentService
-				.findContentExtensionsByTriggerPoint(anElement);
-
-		NavigatorContentExtension ext;
-		for (Iterator itr = resultInstances.iterator(); itr.hasNext();) {
-			ext = (NavigatorContentExtension) itr.next();
-			if (!ext.isLoaded() && !enforceHasChildren)
-				return true;
-			ITreeContentProvider cp = ext.internalGetContentProvider();
-			if (cp instanceof ITreePathContentProvider) {
-				ITreePathContentProvider tpcp = (ITreePathContentProvider) cp;
-				if (tpcp.hasChildren(path)) {
-					return true;
-				}
-			} else if (cp.hasChildren(anElement))
-				return true;
-		}
-
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITreePathContentProvider#getParents(java.lang.Object)
-	 */
-	public TreePath[] getParents(Object anElement) {
-		
-		List paths = new ArrayList();
-		TreePathCompiler compiler = new TreePathCompiler(anElement); 
-		Set compilers = findPaths(compiler);
-		for (Iterator iter = compilers.iterator(); iter.hasNext();) {
-			TreePathCompiler c = (TreePathCompiler) iter.next();
-			paths.add(c.createParentPath());
-			
-		}
-		return (TreePath[]) paths.toArray(new TreePath[paths.size()]);
-		 
-	}
-  
-
-	/**
-	 * Get the element from an element or tree path argument.
-	 * @param parentElementOrPath the element or tree path
-	 * @return the element
-	 */
-	private Object internalAsElement(Object parentElementOrPath) {
-		if (parentElementOrPath instanceof TreePath) {
-			TreePath tp = (TreePath) parentElementOrPath;
-			if (tp.getSegmentCount() > 0) {
-				return tp.getLastSegment();
-			}
-			// If the path is empty, the parent element is the root
-			return viewer.getInput();
-		}
-		return parentElementOrPath;
-	}
-	
-
-	class CyclicPathException extends Exception {
-
-		private static final long serialVersionUID = 2111962579612444989L;
-
-		protected CyclicPathException(TreePathCompiler compiler, Object invalidSegment, boolean asChild) {
-			super("Cannot add " + invalidSegment + //$NON-NLS-1$ 
-					" to the list of segments in " + compiler +  //$NON-NLS-1$ 
-					(asChild ? " as a child." : " as a parent.") ); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	class TreePathCompiler {
-
-
-		private final LinkedList segments = new LinkedList();
-
-		protected TreePathCompiler(Object segment) {
-			segments.add(segment);
-		}
-
-		protected TreePathCompiler(TreePathCompiler aCompiler) {
-			segments.addAll(aCompiler.segments);
-		}
-
-		protected TreePathCompiler(TreePath aPath) {
-			for (int i = 0; i < aPath.getSegmentCount(); i++) {
-				segments.addLast(aPath.getSegment(i));
-			}
-		}
-
-		protected void addParent(Object segment) throws CyclicPathException {
-			if(segments.contains(segment)) {
-				throw new CyclicPathException(this, segment, false);
-			}
-			segments.addFirst(segment);
-		}
-
-		protected void addChild(Object segment) throws CyclicPathException {
-			if(segments.contains(segment)) {
-				throw new CyclicPathException(this, segment, false);
-			}
-			segments.addLast(segment);
-		}
-
-		/**
-		 * Create the full tree path.
-		 * 
-		 * @return A TreePath with all segments from the compiler.
-		 */
-		public TreePath createPath() {
-			return new TreePath(segments.toArray());
-		}
-
-		/**
-		 * Create parent tree path.
-		 * 
-		 * @return A TreePath with all segments but the last from the compiler
-		 */
-		public TreePath createParentPath() {
-			LinkedList parentSegments = new LinkedList(segments);
-			parentSegments.removeLast();
-			return new TreePath(parentSegments.toArray());
-		}
-		
-		public Object getLastSegment() {
-			return segments.getLast();
-		}
-		
-		public Object getFirstSegment() {
-			return segments.getFirst();
-		}
-		
-		/* (non-Javadoc)
-		 * @see java.lang.Object#toString()
-		 */
-		public String toString() {
-		
-			StringBuffer buffer = new StringBuffer();
-			for (Iterator iter = segments.iterator(); iter.hasNext();) {
-				Object segment = iter.next();
-				buffer.append(segment).append("::"); //$NON-NLS-1$  
-			}
-			return buffer.toString();
-		}
-
-	}
-
-	private Set findPaths(TreePathCompiler aPathCompiler) {
-
-		Set/* <Object> */ parents = findParents(aPathCompiler.getFirstSegment());
-		Set/* <TreePathCompiler> */ parentPaths = new LinkedHashSet();
-		Set/* <TreePathCompiler> */ foundPaths = Collections.EMPTY_SET;
-		if (parents.size() > 0) {
-			for (Iterator parentIter = parents.iterator(); parentIter.hasNext();) {
-				Object parent = (Object) parentIter.next();
-				TreePathCompiler c = new TreePathCompiler(aPathCompiler);
-				try {
-					c.addParent(parent); 
-					foundPaths = findPaths(c);
-				} catch(CyclicPathException cpe) {
-					String msg = cpe.getMessage() != null ? cpe.getMessage() : cpe.toString();
-					NavigatorPlugin.logError(0, msg, cpe);
-				}
-				if (foundPaths.isEmpty())
-					parentPaths.add(c);
-				else
-					parentPaths.addAll(foundPaths);
-			}
-		}
-		return parentPaths;
-
-	}
-
-	private Set findParents(Object anElement) {
-
-		Set descriptors = contentService.findDescriptorsWithPossibleChild(
-				anElement, false);
-		Set parents = new LinkedHashSet();
-		NavigatorContentDescriptor foundDescriptor;
-		NavigatorContentExtension foundExtension;
-		Object parent = null;
-		for (Iterator itr = descriptors.iterator(); itr.hasNext();) {
-			foundDescriptor = (NavigatorContentDescriptor) itr.next();
-			foundExtension = contentService.getExtension(foundDescriptor);
-			try {
-
-				if (!isOverridingDescriptorInSet(
-						foundExtension.getDescriptor(), descriptors)) {
-
-					/* internalGetContentProvider returns the real delegate */
-					if (foundExtension.getContentProvider() instanceof ITreePathContentProvider) {
-						/*
-						 * but we use the safe version to automatically handle
-						 * errors
-						 */
-						TreePath[] parentTreePaths = ((ITreePathContentProvider) foundExtension
-								.internalGetContentProvider())
-								.getParents(anElement);
-
-						for (int i = 0; i < parentTreePaths.length; i++) {
-
-							parent = parentTreePaths[i].getLastSegment();
-							if ((parent = findParent(foundExtension, anElement,
-									parent)) != null)
-								parents.add(parent);
-						}
-
-					} else {
-
-						parent = foundExtension.internalGetContentProvider()
-								.getParent(anElement);
-						if ((parent = findParent(foundExtension, anElement,
-								parent)) != null)
-							parents.add(parent);
-					}
-				}
-
-			} catch (RuntimeException re) {
-				NavigatorPlugin
-						.logError(
-								0,
-								NLS
-										.bind(
-												CommonNavigatorMessages.Could_not_provide_children_for_element,
-												new Object[] { foundExtension
-														.getDescriptor()
-														.getId() }), re);
-			} catch (Error e) {
-				NavigatorPlugin
-						.logError(
-								0,
-								NLS
-										.bind(
-												CommonNavigatorMessages.Could_not_provide_children_for_element,
-												new Object[] { foundExtension
-														.getDescriptor()
-														.getId() }), e);
-		
-			} 
-		}
-		
-		return parents;
-		
-	}
-	 
-	
-	private Object findParent(NavigatorContentExtension anExtension, Object anElement, Object aSuggestedParent) {
-		
-		/* the last valid (non-null) parent for the anElement */
-		Object lastValidParent = aSuggestedParent;
-		/* used to keep track of new suggestions */
-		Object suggestedOverriddenParent = null;
-		IPipelinedTreeContentProvider piplineContentProvider; 
-		NavigatorContentExtension[] overridingExtensions = anExtension.getOverridingExtensionsForPossibleChild(anElement); 
-		for (int i = 0; i < overridingExtensions.length; i++) {
-			if(overridingExtensions[i].getContentProvider() instanceof IPipelinedTreeContentProvider) {
-				piplineContentProvider = (IPipelinedTreeContentProvider) overridingExtensions[i].getContentProvider(); 
-				suggestedOverriddenParent = piplineContentProvider.getPipelinedParent(anElement, lastValidParent);
-				
-				if(suggestedOverriddenParent != null)
-					lastValidParent = suggestedOverriddenParent; 
-				
-				// should never return null 
-				lastValidParent = findParent(overridingExtensions[i], anElement, lastValidParent);
-			}
-				
-		} 
-		return lastValidParent;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentServiceDescriptionProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentServiceDescriptionProvider.java
deleted file mode 100644
index c65659c..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentServiceDescriptionProvider.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.navigator.ICommonLabelProvider;
-import org.eclipse.ui.navigator.IDescriptionProvider;
-
-/**
- * 
- * @since 3.2
- * 
- */
-public final class NavigatorContentServiceDescriptionProvider implements
-		IDescriptionProvider {
-
-	private final NavigatorContentService contentService;
-
-	/**
-	 * Creates a description provider that targets the given service.
-	 * 
-	 * @param aContentService
-	 *            The content service associated with this provider.
-	 */
-	public NavigatorContentServiceDescriptionProvider(
-			NavigatorContentService aContentService) {
-		Assert.isNotNull(aContentService);
-		contentService = aContentService;
-	}
-
-	public String getDescription(Object anElement) {
-
-		Object target;
-
-		if (anElement instanceof IStructuredSelection) {
-
-			IStructuredSelection structuredSelection = (IStructuredSelection) anElement;
-			if (structuredSelection.size() > 1) {
-				return getDefaultStatusBarMessage(structuredSelection.size());
-			}
-			target = structuredSelection.getFirstElement();
-		} else {
-			target = anElement;
-		}
-		String message = null;
-		ILabelProvider[] providers = contentService
-				.findRelevantLabelProviders(target);
-		if (providers.length == 0) {
-			return getDefaultStatusBarMessage(0);
-		}
-		for (int i = 0; i < providers.length && (message == null || message.length() == 0); i++) {
-			if (providers[i] instanceof ICommonLabelProvider) {
-				message = ((ICommonLabelProvider) providers[i])
-						.getDescription(target); 
-			}
-		}
-		message = (message != null) ? message : getDefaultStatusBarMessage(1);
-		return message;
-
-	}
-
-	/**
-	 * @param aSize
-	 *            The number of items selected.
-	 * @return A string of the form "# items selected"
-	 */
-	protected final String getDefaultStatusBarMessage(int aSize) {
-		return NLS.bind(
-				CommonNavigatorMessages.Navigator_statusLineMultiSelect,
-				new Object[] { new Integer(aSize) });
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentServiceLabelProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentServiceLabelProvider.java
deleted file mode 100644
index 9a128ff..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentServiceLabelProvider.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.commands.common.EventManager;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ITreePathLabelProvider;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.ViewerLabel;
-import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentExtension;
-import org.eclipse.ui.navigator.CommonViewer;
-import org.eclipse.ui.navigator.ICommonLabelProvider;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * <p>
- * Provides relevant labels based on the associated
- * {@link INavigatorContentService}for the contents of a
- * TreeViewer .
- * <p>
- * 
- * <p>
- * Except for the dependency on
- * {@link INavigatorContentService}, this class has no
- * dependencies on the rest of the Common Navigator framework. Tree viewers that would like to use
- * the extensions defined by the Common Navigator, without using the actual view part or other
- * pieces of functionality (filters, sorting, etc) may choose to use this class, in effect using an
- * extensible label provider.
- * </p>
- * <p>
- * 
- * @since 3.2
- * 
- * @see org.eclipse.ui.internal.navigator.NavigatorContentService
- * @see org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider
- */
-public class NavigatorContentServiceLabelProvider extends EventManager
-		implements ILabelProvider, IColorProvider, IFontProvider, ITreePathLabelProvider, ILabelProviderListener, IStyledLabelProvider {
- 
-	private final NavigatorContentService contentService;
-	private final boolean isContentServiceSelfManaged;
-	private final ReusableViewerLabel reusableLabel = new ReusableViewerLabel();
-
-  
-	/**
-	 * <p>
-	 * Uses the supplied content service to acquire the available extensions.
-	 * </p>
-	 * 
-	 * @param aContentService
-	 *            The associated NavigatorContentService that should be used to acquire information.
-	 */
-	public NavigatorContentServiceLabelProvider(NavigatorContentService aContentService) {
-		contentService = aContentService; 
-		isContentServiceSelfManaged = false;
-	}
-
-	/**
-	 * <p>
-	 * Return the appropriate image for anElement. The image will be used as the icon for anElement
-	 * when displayed in the tree viewer. This method uses information from its contentService to
-	 * know what extensions to use to supply the correct label.
-	 * </p>
-	 * {@inheritDoc}
-	 * 
-	 * @param anElement 
-	 *            An element from the Tree Viewer 
-	 * @return The Image that will be used as the icon when anElement is displayed in the viewer.
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object anElement) {
-
-		Set contentExtensions = contentService.findContentExtensionsWithPossibleChild(anElement);
-		Image image = null; 
-		for (Iterator itr = contentExtensions.iterator(); itr.hasNext() && image == null; ) { 
-			image = findImage((NavigatorContentExtension) itr.next(), anElement);
-		}
-		return image;  
-	}
-
-	/**
-	 * <p>
-	 * Return a String representation of anElement to be used as the display name in the tree
-	 * viewer.
-	 * </p>
-	 * {@inheritDoc}
-	 * 
-	 * @param anElement
-	 *            An element from the Tree Viewer 
-	 * @return The String label to display for the object when represented in the viewer.
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object anElement) {
-		Set contentExtensions = contentService.findContentExtensionsWithPossibleChild(anElement);
-		String text = null; 
-		for (Iterator itr = contentExtensions.iterator(); itr.hasNext() && text == null; ) { 
-			text = findText((NavigatorContentExtension) itr.next(), anElement);
-		}
-		// decorate the element
-		return text == null ? (NLS.bind(CommonNavigatorMessages.NavigatorContentServiceLabelProvider_Error_no_label_provider_for_0_, anElement)) : text; 
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getStyledText(java.lang.Object)
-	 */
-	public StyledString getStyledText(Object anElement) {
-		Set contentExtensions = contentService.findContentExtensionsWithPossibleChild(anElement);
-		StyledString text = null; 
-		for (Iterator itr = contentExtensions.iterator(); itr.hasNext() && text == null; ) { 
-			text = findStyledText((NavigatorContentExtension) itr.next(), anElement);
-		}
-		// decorate the element
-		return (text == null)? (new StyledString(NLS.bind(CommonNavigatorMessages.NavigatorContentServiceLabelProvider_Error_no_label_provider_for_0_, anElement))) : text; 
-	}
-	
-	/**
-	 * Search for a styled text label and take overrides into account. 
-	 * Uses only simple ITreeContentProvider.getParent() style semantics. 
-	 * 
-	 * @returns the styled text or <code>null</code> if no extension has been found that provides a label
-	 */
-	private StyledString findStyledText(NavigatorContentExtension foundExtension, Object anElement) { 
-		INavigatorContentDescriptor foundDescriptor;
-		ICommonLabelProvider labelProvider= foundExtension.getLabelProvider();
-		if (labelProvider instanceof IStyledLabelProvider) {
-			StyledString styledText= ((IStyledLabelProvider) labelProvider).getStyledText(anElement);
-			// paranoia check for null, although null is not a valid return value for IStyledLabelProvider.getStyledText
-			if (styledText != null && styledText.length() > 0) {
-				return styledText;
-			}
-		} else {
-			String text= labelProvider.getText(anElement);
-			if (text != null) {
-				return new StyledString(text);
-			}
-		}
-		if ((foundDescriptor = foundExtension.getDescriptor()).getOverriddenDescriptor() != null) {
-			return findStyledText(contentService.getExtension(foundDescriptor.getOverriddenDescriptor()), anElement);
-		}  
-		return null;
-	}
-	
-	/**
-	 * Search for text label and take overrides into account. 
-	 * Uses only simple ITreeContentProvider.getParent() style semantics. 
-	 */
-	private String findText(NavigatorContentExtension foundExtension, Object anElement) { 
-		String text = null; 
-		INavigatorContentDescriptor foundDescriptor;  
-		text = foundExtension.getLabelProvider().getText(anElement); 
-		if(text == null && (foundDescriptor = foundExtension.getDescriptor()).getOverriddenDescriptor() != null) {
-			return findText(contentService.getExtension(foundDescriptor.getOverriddenDescriptor()), anElement);
-		}  
-		return text;
-	}
-	
-	/**
-	 * Search for image and take overrides into account. 
-	 * Uses only simple ITreeContentProvider.getParent() style semantics. 
-	 */
-	private Image findImage(NavigatorContentExtension foundExtension, Object anElement) { 
-		Image image = null;
-		INavigatorContentDescriptor foundDescriptor;  
-		image = foundExtension.getLabelProvider().getImage(anElement); 
-		if(image == null && (foundDescriptor = foundExtension.getDescriptor()).getOverriddenDescriptor() != null) {
-			return findImage(contentService.getExtension(foundDescriptor.getOverriddenDescriptor()), anElement);
-		}  
-		return image;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-	 */
-	public Font getFont(Object anElement) {
-		ILabelProvider[] labelProviders = contentService.findRelevantLabelProviders(anElement);
-		for (int i = 0; i < labelProviders.length; i++) {
-			ILabelProvider provider = labelProviders[i];
-			if (provider instanceof IFontProvider) {
-				IFontProvider fontProvider = (IFontProvider) provider;
-				Font font = fontProvider.getFont(anElement);
-				if (font != null) {
-					return font;
-				}
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-	 */
-	public Color getForeground(Object anElement) {
-		ILabelProvider[] labelProviders = contentService.findRelevantLabelProviders(anElement);
-		for (int i = 0; i < labelProviders.length; i++) {
-			ILabelProvider provider = labelProviders[i];
-			if (provider instanceof IColorProvider) {
-				IColorProvider colorProvider = (IColorProvider) provider;
-				Color color = colorProvider.getForeground(anElement);
-				if (color != null) {
-					return color;
-				}
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-	 */
-	public Color getBackground(Object anElement) {
-		ILabelProvider[] labelProviders = contentService.findRelevantLabelProviders(anElement);
-		for (int i = 0; i < labelProviders.length; i++) {
-			ILabelProvider provider = labelProviders[i];
-			if (provider instanceof IColorProvider) {
-				IColorProvider colorProvider = (IColorProvider) provider;
-				Color color = colorProvider.getBackground(anElement);
-				if (color != null) {
-					return color;
-				}
-			}
-		}
-		return null;
-	}	
-
-	/**
-	 * <p>
-	 * Indicates whether anElelement has aProperty that affects the display of the label.
-	 * </p>
-	 * {@inheritDoc}
-	 * 
-	 * @param anElement
-	 *            An element from the Tree Viewer
-	 * @param aProperty
-	 *            A property of the given element that could be a label provider
-	 * @return True if any of the extensions enabled on anElement consider aProperty a
-	 *         label-changing property.
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
-	 *      java.lang.String)
-	 */
-	public boolean isLabelProperty(Object anElement, String aProperty) {
-		boolean result = false;
-		ILabelProvider[] labelProviders = contentService.findRelevantLabelProviders(anElement);
-		for (int i = 0; i < labelProviders.length && !result; i++) {
-			result = labelProviders[i].isLabelProperty(anElement, aProperty);
-		}
-		return result;
-	}
-
-
-	/**
-	 * <p>
-	 * Label provider listeners are currently supported.
-	 * </p>
-	 * 
-	 * {@inheritDoc}
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener aListener) {
-		addListenerObject(aListener);
-	}
-
-	/**
-	 * <p>
-	 * Label provider listeners are currently supported.
-	 * </p>
-	 * 
-	 * {@inheritDoc}
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener aListener) {
-		removeListenerObject(aListener);
-	}
-
-	/**
-	 * <p>
-	 * Dispose of the content service, if it was created and not supplied.
-	 * </p>
-	 * <p>
-	 * <b>If a client uses this class outside of the framework of {@link CommonViewer}, this method
-	 * must be called when finished. </b>
-	 * </p>
-	 * 
-	 * {@inheritDoc}
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		if (isContentServiceSelfManaged) {
-			contentService.dispose();
-		}
-
-	}
-	
-	/**
-     * Fires a label provider changed event to all registered listeners
-     * Only listeners registered at the time this method is called are notified.
-     *
-     * @param event a label provider changed event
-     *
-     * @see ILabelProviderListener#labelProviderChanged
-     */
-    protected void fireLabelProviderChanged(
-            final LabelProviderChangedEvent event) {
-        Object[] theListeners = getListeners();
-        for (int i = 0; i < theListeners.length; ++i) {
-            final ILabelProviderListener l = (ILabelProviderListener) theListeners[i];
-            SafeRunner.run(new SafeRunnable() {
-                public void run() {
-                    l.labelProviderChanged(event);
-                }
-            });
-
-        }
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITreePathLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel, org.eclipse.jface.viewers.TreePath)
-	 */
-	public void updateLabel(ViewerLabel label, TreePath elementPath) { 
-		 
-		Set contentExtensions = contentService.findContentExtensionsWithPossibleChild(elementPath.getLastSegment());
-		reusableLabel.reset(label);
-		for (Iterator itr = contentExtensions.iterator(); itr.hasNext() && !(reusableLabel.isValid() && reusableLabel.hasChanged()); ) {			 
-			findUpdateLabel((NavigatorContentExtension)itr.next(), reusableLabel, elementPath);			 
-		}
-		reusableLabel.fill(label);
-	}
-
-
-	/**
-	 * Search for text label and take overrides into account. 
-	 * Uses only simple ITreeContentProvider.getParent() style semantics. 
-	 */
-	private void findUpdateLabel(NavigatorContentExtension foundExtension, ReusableViewerLabel label, TreePath elementPath) {
-		
-		ILabelProvider labelProvider = foundExtension.getLabelProvider();
-		if (labelProvider instanceof ITreePathLabelProvider) {
-			ITreePathLabelProvider tplp = (ITreePathLabelProvider) labelProvider;
-			tplp.updateLabel(label, elementPath);
-		} else {
-			label.setImage(labelProvider.getImage(elementPath.getLastSegment()));
-			label.setText(labelProvider.getText(elementPath.getLastSegment()));
-		}		
-		 
-		if(shouldContinue(label, foundExtension)) {
-			findUpdateLabel(contentService.getExtension(foundExtension.getDescriptor().getOverriddenDescriptor()), label, elementPath);
-		}   
-	}
- 
-	private boolean shouldContinue(ReusableViewerLabel label, NavigatorContentExtension foundExtension) {
-
-		if(foundExtension.getDescriptor().getOverriddenDescriptor() != null) {			
-			return !(label.isValid() && label.hasChanged()); 
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILabelProviderListener#labelProviderChanged(org.eclipse.jface.viewers.LabelProviderChangedEvent)
-	 */
-	public void labelProviderChanged(LabelProviderChangedEvent event) { 
-		fireLabelProviderChanged(event);		
-	}
-
-
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorDecoratingLabelProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorDecoratingLabelProvider.java
deleted file mode 100644
index 69f677d..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorDecoratingLabelProvider.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import org.eclipse.jface.preference.JFacePreferences;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider;
-import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.jface.viewers.ViewerColumn;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Decorating label provider with styled label support for the navigator.
- * <p>
- * If the wrapped label provider is a {@link DelegatingStyledCellLabelProvider.IStyledLabelProvider} it will use
- * the styled label it provides.
- * </p>
- * <p>The label provider listens to the built-in decoration colors ({@link JFacePreferences#QUALIFIER_COLOR}, 
- * {@link JFacePreferences#COUNTER_COLOR} and {@link JFacePreferences#DECORATIONS_COLOR}. If other
- * colors are used, it is the responsibility of the wrapped label provider to fire the refresh.
- * </p>
- */
-public class NavigatorDecoratingLabelProvider extends DecoratingStyledCellLabelProvider implements IPropertyChangeListener, ILabelProvider {
-
-	private static class StyledLabelProviderAdapter implements IStyledLabelProvider, IColorProvider, IFontProvider {
-
-		private final ILabelProvider provider;
-
-		public StyledLabelProviderAdapter(ILabelProvider provider) {
-			this.provider= provider;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getImage(java.lang.Object)
-		 */
-		public Image getImage(Object element) {
-			return provider.getImage(element);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getStyledText(java.lang.Object)
-		 */
-		public StyledString getStyledText(Object element) {
-			if (provider instanceof IStyledLabelProvider) {
-				return ((IStyledLabelProvider) provider).getStyledText(element);
-			}
-			String text= provider.getText(element);
-			if (text == null)
-				text= ""; //$NON-NLS-1$
-			return new StyledString(text);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-		 */
-		public void addListener(ILabelProviderListener listener) {
-			provider.addListener(listener);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-		 */
-		public void dispose() {
-			provider.dispose();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-		 */
-		public boolean isLabelProperty(Object element, String property) {
-			return provider.isLabelProperty(element, property);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-		 */
-		public void removeListener(ILabelProviderListener listener) {
-			provider.removeListener(listener);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-		 */
-		public Color getBackground(Object element) {
-			if (provider instanceof IColorProvider) {
-				return ((IColorProvider) provider).getBackground(element);
-			}
-			return null;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-		 */
-		public Color getForeground(Object element) {
-			if (provider instanceof IColorProvider) {
-				return ((IColorProvider) provider).getForeground(element);
-			}
-			return null;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-		 */
-		public Font getFont(Object element) {
-			if (provider instanceof IFontProvider) {
-				return ((IFontProvider) provider).getFont(element);
-			}
-			return null;
-		}	
-	}
-	
-	/**
-	 * Creates a {@link NavigatorDecoratingLabelProvider}
-	 * 
-	 * @param commonLabelProvider the label provider to use
-	 */
-	public NavigatorDecoratingLabelProvider(ILabelProvider commonLabelProvider) {
-		super(new StyledLabelProviderAdapter(commonLabelProvider), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator(), null);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StyledCellLabelProvider#initialize(org.eclipse.jface.viewers.ColumnViewer, org.eclipse.jface.viewers.ViewerColumn)
-	 */
-	public void initialize(ColumnViewer viewer, ViewerColumn column) {
-		PlatformUI.getPreferenceStore().addPropertyChangeListener(this);
-		JFaceResources.getColorRegistry().addListener(this);
-		
-		setOwnerDrawEnabled(showColoredLabels());
-		
-		super.initialize(viewer, column);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		PlatformUI.getPreferenceStore().removePropertyChangeListener(this);
-		JFaceResources.getColorRegistry().removeListener(this);
-	}
-	
-	private void refresh() {
-		ColumnViewer viewer= getViewer();
-		if (viewer == null) {
-			return;
-		}
-		boolean showColoredLabels= showColoredLabels();
-		if (showColoredLabels != isOwnerDrawEnabled()) {
-			setOwnerDrawEnabled(showColoredLabels);
-			viewer.refresh();
-		} else if (showColoredLabels) {
-			viewer.refresh();
-		}
-	}
-	
-	private static boolean showColoredLabels() {
-		return PlatformUI.getPreferenceStore().getBoolean(IWorkbenchPreferenceConstants.USE_COLORED_LABELS);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		String property= event.getProperty();
-		if (property.equals(JFacePreferences.QUALIFIER_COLOR) || property.equals(JFacePreferences.COUNTER_COLOR) || property.equals(JFacePreferences.DECORATIONS_COLOR)
-				|| property.equals(IWorkbenchPreferenceConstants.USE_COLORED_LABELS)) {
-			Display.getDefault().asyncExec(new Runnable() {
-				public void run() {
-					refresh();
-				}
-			});
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object element) {
-		return getStyledText(element).getString();
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorExtensionStateService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorExtensionStateService.java
deleted file mode 100644
index 385d466..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorExtensionStateService.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.ui.internal.navigator.extensions.ExtensionStateModel;
-import org.eclipse.ui.navigator.IExtensionStateModel;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * 
- * A content extension may have its content and label providers disposed
- * whenever the extension is activated or deactivated. However, the state model
- * lives throughout the life of the viewer to allow Action Providers to drive
- * their behavior from it.
- * 
- * @since 3.3
- * 
- */
-public class NavigatorExtensionStateService {
-
-	private final Object lock = new Object();
-	private INavigatorContentService contentService;
-
-	/**
-	 * Create an ExtensionStateServie that will keep track of the state models
-	 * of content extensions.
-	 * 
-	 * @param theContentService
-	 *            The content service which manages this state model service.
-	 */
-	public NavigatorExtensionStateService(INavigatorContentService theContentService) {
-		contentService = theContentService;
-	}
-
-	/*
-	 * A map of (String-based-Navigator-Content-Extension-IDs,
-	 * NavigatorContentExtension-objects)-pairs
-	 */
-	private final Map/* <INavigatorContentDescriptor, IExtensionStateModel> */stateModels = new HashMap();
-
-	/**
-	 * Return the state model for the given descriptor. 
-	 * 
-	 * @param aDescriptor A content descriptor 
-	 * @return The state model for the given descriptor.
-	 */
-	public IExtensionStateModel getExtensionStateModel(
-			INavigatorContentDescriptor aDescriptor) {
-		synchronized (lock) {
-			IExtensionStateModel model = (IExtensionStateModel) stateModels
-					.get(aDescriptor);
-			if (model == null)
-				stateModels.put(aDescriptor, model = new ExtensionStateModel(
-						aDescriptor.getId(), contentService.getViewerId()));
-			return model;
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorFilterService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorFilterService.java
deleted file mode 100644
index 14cee22..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorFilterService.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.ui.internal.navigator.filters.CommonFilterDescriptor;
-import org.eclipse.ui.internal.navigator.filters.CommonFilterDescriptorManager;
-import org.eclipse.ui.internal.navigator.filters.SkeletonViewerFilter;
-import org.eclipse.ui.navigator.ICommonFilterDescriptor;
-import org.eclipse.ui.navigator.INavigatorFilterService;
-
-/**
- * @since 3.2
- * 
- */
-public class NavigatorFilterService implements INavigatorFilterService {
-
-	private static final ViewerFilter[] NO_FILTERS = new ViewerFilter[0];
-
-	private static final String ACTIVATION_KEY = ".filterActivation"; //$NON-NLS-1$
-
-	private static final String DELIM = ":"; //$NON-NLS-1$
-
-	private final NavigatorContentService contentService;
-
-	/* Map of (ICommonFilterDescriptor, ViewerFilter)-pairs */
-	private final Map declaredViewerFilters = new HashMap();
-
-	/* Set of ViewerFilters enforced from visible/active content extensions */
-	private final Set enforcedViewerFilters = new HashSet();
-
-	/* A set of active filter String ids */
-	private final Set activeFilters = new HashSet();
-
-	/**
-	 * @param aContentService
-	 *            The corresponding content service
-	 */
-	public NavigatorFilterService(NavigatorContentService aContentService) {
-		contentService = aContentService;
-		restoreFilterActivation();
-	}
-
-	private synchronized void restoreFilterActivation() {
-
-		try {
-			Preferences preferences = NavigatorPlugin.getDefault()
-					.getPluginPreferences();
-
-			if (preferences.contains(getFilterActivationPreferenceKey())) {
-				String activatedFiltersPreferenceValue = preferences
-						.getString(getFilterActivationPreferenceKey());
-				String[] activeFilterIds = activatedFiltersPreferenceValue
-						.split(DELIM);
-				for (int i = 0; i < activeFilterIds.length; i++) {
-					activeFilters.add(activeFilterIds[i]);
-				}
-
-			} else {
-				ICommonFilterDescriptor[] visibleFilterDescriptors = getVisibleFilterDescriptors();
-				for (int i = 0; i < visibleFilterDescriptors.length; i++) {
-					if (visibleFilterDescriptors[i].isActiveByDefault()) {
-						activeFilters.add(visibleFilterDescriptors[i].getId());
-					}
-				}
-			}
-
-		} catch (RuntimeException e) {
-			NavigatorPlugin.logError(0, e.getMessage(), e);
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.INavigatorFilterService#persistFilterActivationState()
-	 */
-	public void persistFilterActivationState() {
-
-		try {
-			synchronized (activeFilters) {
-
-				/* by creating a StringBuffer with DELIM, we ensure the string is not empty when persisted.*/
-				StringBuffer activatedFiltersPreferenceValue = new StringBuffer(DELIM);
-
-				for (Iterator activeItr = activeFilters.iterator(); activeItr
-						.hasNext();) {
-					activatedFiltersPreferenceValue.append(
-							activeItr.next().toString()).append(DELIM);
-				}
-
-				Preferences preferences = NavigatorPlugin.getDefault()
-						.getPluginPreferences();
-
-				preferences.setValue(getFilterActivationPreferenceKey(),
-						activatedFiltersPreferenceValue.toString());
-			}
-
-		} catch (RuntimeException e) {
-			NavigatorPlugin.logError(0, e.getMessage(), e);
-		}
-
-	}
-
-	/**
-	 * @return The correct filter activation preference key for the
-	 *         corresponding content service.
-	 */
-	private String getFilterActivationPreferenceKey() {
-		return contentService.getViewerId() + ACTIVATION_KEY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.INavigatorFilterService#getVisibleFilters(boolean)
-	 */
-	public ViewerFilter[] getVisibleFilters(boolean toReturnOnlyActiveFilters) {
-		CommonFilterDescriptor[] descriptors = CommonFilterDescriptorManager
-				.getInstance().findVisibleFilters(contentService);
-
-		List filters = new ArrayList();
-
-		ViewerFilter instance;
-		for (int i = 0; i < descriptors.length; i++) {
-			if (!toReturnOnlyActiveFilters || isActive(descriptors[i].getId())) {
-				instance = getViewerFilter(descriptors[i]);
-				if (instance != null) {
-					filters.add(instance);
-				}
-			}
-		}
-
-		/* return the enforced viewer filters always */
-		filters.addAll(enforcedViewerFilters);
-
-		if (filters.size() == 0) {
-			return NO_FILTERS;
-		}
-		return (ViewerFilter[]) filters
-				.toArray(new ViewerFilter[filters.size()]);
-	}
-
-	/**
-	 * @param descriptor
-	 *            A key into the viewerFilters map.
-	 * @return A non-null ViewerFilter from the extension (or
-	 *         {@link SkeletonViewerFilter#INSTANCE}).
-	 */
-	public ViewerFilter getViewerFilter(ICommonFilterDescriptor descriptor) {
-		ViewerFilter filter = null;
-		synchronized (declaredViewerFilters) {
-			filter = (ViewerFilter) declaredViewerFilters.get(descriptor);
-			if (filter == null) {
-				declaredViewerFilters.put(descriptor,
-						(filter = ((CommonFilterDescriptor) descriptor)
-								.createFilter()));
-			}
-		}
-		return filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.INavigatorFilterService#getVisibleFilterIds()
-	 */
-	public ICommonFilterDescriptor[] getVisibleFilterDescriptors() {
-		return CommonFilterDescriptorManager.getInstance().findVisibleFilters(
-				contentService);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.INavigatorFilterService#isActive(java.lang.String)
-	 */
-	public boolean isActive(String aFilterId) {
-		synchronized (activeFilters) {
-			return activeFilters.contains(aFilterId);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.INavigatorFilterService#activateFilters(java.lang.String[])
-	 */
-	public void setActiveFilterIds(String[] theFilterIds) {
-		Assert.isNotNull(theFilterIds);
-		synchronized (activeFilters) {
-			activeFilters.clear();
-			activeFilters.addAll(Arrays.asList(theFilterIds));
-		}
-	}
-
-	/**
-	 * Activate the given array without disabling all other filters.
-	 * 
-	 * @param theFilterIds
-	 *            The filter ids to activate.
-	 */
-	public void addActiveFilterIds(String[] theFilterIds) {
-		Assert.isNotNull(theFilterIds);
-		synchronized (activeFilters) {
-			activeFilters.addAll(Arrays.asList(theFilterIds));
-		}
-	}
-	
-	/**
-	 * 
-	 * @param aFilterId The id of the filter to activate or deactivate
-	 * @param toMakeActive True to make the filter active, false to make the filter inactive
-	 */
-	public void setActive(String aFilterId, boolean toMakeActive) {
-
-		synchronized (activeFilters) {
-			boolean isActive = activeFilters.contains(aFilterId);
-			if(isActive ^ toMakeActive) {
-				if(toMakeActive)
-					activeFilters.remove(aFilterId);
-				else
-					activeFilters.add(aFilterId);
-					
-			}
-				
-		}
-	}
- 
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorImages.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorImages.java
deleted file mode 100644
index 01fe175..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorImages.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Collections;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-
-/**
- *  
- * 
- * @since 3.2
- */
-public class NavigatorImages {
-
-	// Create image registry
-	private final static ImageRegistry NAVIGATOR_PLUGIN_REGISTRY = NavigatorPlugin
-			.getDefault().getImageRegistry();
-
-	private static URL ICONS_LOCATION;
-	static {
-		ICONS_LOCATION = FileLocator.find(NavigatorPlugin.getDefault()
-				.getBundle(), new Path("icons/full/"), Collections.EMPTY_MAP); //$NON-NLS-1$  
-	}
-
-	/**
-	 * Gets the current image.
-	 * 
-	 * @param key
-	 *            Name of the icon.
-	 * @return Image
-	 */
-	public static Image get(String key) {
-		return NAVIGATOR_PLUGIN_REGISTRY.get(key);
-	}
-
-	/**
-	 * Create and returns a image descriptor and adds the image to the
-	 * registery.
-	 * 
-	 * @param prefix
-	 *            Icon dir structure.
-	 * @param name
-	 *            The name of the icon.
-	 * @return ImageDescriptor
-	 */
-	public static ImageDescriptor createManaged(String prefix, String name) {
-		ImageDescriptor result = ImageDescriptor.createFromURL(makeIconFileURL(
-				prefix, name));
-		NAVIGATOR_PLUGIN_REGISTRY.put(name, result);
-		return result;
-	}
-
-	/**
-	 * Creates the icon url
-	 * 
-	 * @param prefix
-	 *            Icon dir structure.
-	 * @param name
-	 *            The name of the icon.
-	 * @return URL
-	 */
-	private static URL makeIconFileURL(String prefix, String name) {
-		StringBuffer buffer = new StringBuffer(prefix);
-		buffer.append(name);
-		try {
-			return new URL(ICONS_LOCATION, buffer.toString());
-		} catch (MalformedURLException ex) {
-			return null;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorPipelineService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorPipelineService.java
deleted file mode 100644
index 8446d96..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorPipelineService.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptor;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentExtension;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorPipelineService;
-import org.eclipse.ui.navigator.IPipelinedTreeContentProvider;
-import org.eclipse.ui.navigator.PipelinedShapeModification;
-import org.eclipse.ui.navigator.PipelinedViewerUpdate;
-
-/**
- * @since 3.2
- * 
- */
-public class NavigatorPipelineService implements INavigatorPipelineService {
-
-	private NavigatorContentService contentService;
-
-	/**
-	 * Create a pipeline assistant for the given content service.
-	 * 
-	 * @param aContentService
-	 *            The content service that will drive this pipeline assistant.
-	 */
-	public NavigatorPipelineService(NavigatorContentService aContentService) {
-		contentService = aContentService;
-	}
-
-	/**
-	 * Intercept attempts to add elements directly to the viewer.
-	 * 
-	 * <p>
-	 * For content extensions that reshape the structure of children in a
-	 * viewer, their overridden extensions may sometimes use optimized refreshes
-	 * to add elements to the tree. These attempts must be intercepted and
-	 * mapped to the correct set of model elements in the overridding extension.
-	 * Clients may add, remove, or modify elements in the given set of added
-	 * children. Clients should return a set for downstream extensions to
-	 * massage further.
-	 * </p>
-	 * <p>
-	 * <b>Clients should not call any of the add, remove, refresh, or update
-	 * methods on the viewer from this method or any code invoked by the
-	 * implementation of this method.</b>
-	 * </p>
-	 * 
-	 * @param anAddModification
-	 *            The shape modification which contains the current suggested
-	 *            parent and children. Clients may modify this parameter
-	 *            directly and return it as the new shape modification.
-	 * @return The new shape modification to use. Clients should <b>never</b>
-	 *         return <b>null</b> from this method.
-	 */
-	public PipelinedShapeModification interceptAdd(
-			PipelinedShapeModification anAddModification) {
-		
-		ContributorTrackingSet trackedSet =(ContributorTrackingSet) anAddModification.getChildren();
-		
-		Set contentDescriptors = contentService.findDescriptorsByTriggerPoint(anAddModification.getParent());
-		
-		
-		for (Iterator descriptorsItr = contentDescriptors.iterator(); descriptorsItr.hasNext();) {
-			INavigatorContentDescriptor descriptor = (INavigatorContentDescriptor) descriptorsItr.next();
-			pipelineInterceptAdd(anAddModification, trackedSet, descriptor); 
-		}		 
-
-		// for consistency, we register the contribution from our best known match
-		registerContribution(anAddModification.getParent(), anAddModification.getChildren().toArray()); 
-		return anAddModification;
-
-	}
- 
-	/** 
-	 * @param parent The object to which data was contributed 
-	 * @param contributions Data contributed to the viewer
-	 */
-	private void registerContribution(Object parent, Object[] contributions) {
-		 
-		// returns an array sorted by priority
-		Set possibleContributors = contentService.findDescriptorsByTriggerPoint(parent);
-		Set possibleMatches = null;
-		for (int i = 0; i < contributions.length; i++) {
-			// returns an array sorted by reverse priority
-			possibleMatches = contentService.findDescriptorsWithPossibleChild(contributions[i]); 
-			NavigatorContentDescriptor[] descriptors = (NavigatorContentDescriptor[]) possibleMatches.toArray(new NavigatorContentDescriptor[possibleMatches.size()]); 
-			for (int indx = possibleMatches.size()-1; indx > -1; indx--) {
-								
-				// terminates once the highest priority match is found for this child
-				if(possibleContributors.contains(descriptors[indx])) {
-					contentService.rememberContribution(descriptors[indx], contributions[i]);
-					break;
-				}
-				
-			}
-		}
-	}
-
-	private void pipelineInterceptAdd(PipelinedShapeModification anAddModification, ContributorTrackingSet trackedSet, INavigatorContentDescriptor descriptor) {
-		if(descriptor.hasOverridingExtensions()) {
-			Set overridingDescriptors = descriptor.getOverriddingExtensions();
-			for (Iterator overridingDescriptorsItr = overridingDescriptors.iterator(); overridingDescriptorsItr
-					.hasNext();) {
-				INavigatorContentDescriptor overridingDescriptor = (INavigatorContentDescriptor) overridingDescriptorsItr.next();
-				if(contentService.isVisible(overridingDescriptor.getId()) && contentService.isActive(overridingDescriptor.getId())) {
-					trackedSet.setContributor((NavigatorContentDescriptor) overridingDescriptor);
-					NavigatorContentExtension extension = contentService.getExtension(overridingDescriptor);
-					((IPipelinedTreeContentProvider) extension.internalGetContentProvider()).interceptAdd(anAddModification);					
-					trackedSet.setContributor(null);
-					pipelineInterceptAdd(anAddModification, trackedSet, overridingDescriptor);
-				}
-			}		
-		}  
-	} 
-	 
-
-	/**
-	 * Intercept attempts to remove elements directly from the viewer.
-	 * 
-	 * <p>
-	 * For content extensions that reshape the structure of children in a
-	 * viewer, their overridden extensions may sometimes use optimized refreshes
-	 * to remove elements to the tree. These attempts must be intercepted and
-	 * mapped to the correct set of model elements in the overridding extension.
-	 * Clients may add, remove, or modify elements in the given set of removed
-	 * children. Clients should return a set for downstream extensions to
-	 * massage further.
-	 * </p>
-	 * <p>
-	 * <b>Clients should not call any of the add, remove, refresh, or update
-	 * methods on the viewer from this method or any code invoked by the
-	 * implementation of this method.</b>
-	 * </p>
-	 * 
-	 * @param aRemoveModification
-	 *            The shape modification which contains the current suggested
-	 *            parent and children. Clients may modify this parameter
-	 *            directly and return it as the new shape modification.
-	 * @return The new shape modification to use. Clients should <b>never</b>
-	 *         return <b>null</b> from this method.
-	 */
-	public PipelinedShapeModification interceptRemove(
-			PipelinedShapeModification aRemoveModification) {
-		
-		ContributorTrackingSet trackedSet =(ContributorTrackingSet) aRemoveModification.getChildren(); 
-
-		Set interestedExtensions = new LinkedHashSet(); 	
-		for (Iterator iter = trackedSet.iterator(); iter.hasNext();) {
-			Object element = (Object) iter.next();
-			if(element instanceof TreePath) {
-				interestedExtensions.addAll(contentService.findOverrideableContentExtensionsForPossibleChild(((TreePath)element).getLastSegment()));
-			} else { 
-				interestedExtensions = contentService.findOverrideableContentExtensionsForPossibleChild(element);
-				
-			} 
-		}
-		for (Iterator overridingExtensionsIter = interestedExtensions.iterator(); overridingExtensionsIter.hasNext();)  
-			pipelineInterceptRemove(aRemoveModification, trackedSet, (NavigatorContentExtension) overridingExtensionsIter.next());
-		return aRemoveModification;
-	}
-	
-
-	private void pipelineInterceptRemove(PipelinedShapeModification aRemoveModification, ContributorTrackingSet trackedSet, NavigatorContentExtension overrideableExtension) {
-		
-		
-		try {
-			NavigatorContentExtension overridingExtension = null;
-			Set overridingExtensions = new LinkedHashSet();
-			for (Iterator iter = trackedSet.iterator(); iter.hasNext();) {
-				Object element = (Object) iter.next();
-				if(element instanceof TreePath) {
-					overridingExtensions.addAll(Arrays.asList(overrideableExtension.getOverridingExtensionsForPossibleChild(((TreePath)element).getLastSegment())));
-				} else { 
-					overridingExtensions.addAll(Arrays.asList(overrideableExtension.getOverridingExtensionsForPossibleChild(element)));				
-				} 
-			}
-			 
-			for (Iterator extensionsItr = overridingExtensions.iterator(); extensionsItr.hasNext();) {
-				overridingExtension = (NavigatorContentExtension) extensionsItr.next();
-				trackedSet.setContributor((NavigatorContentDescriptor) overridingExtension.getDescriptor());
-				if (overridingExtension.getContentProvider() instanceof IPipelinedTreeContentProvider) {
-					((IPipelinedTreeContentProvider) overridingExtension.getContentProvider()).interceptRemove(aRemoveModification);
-				}
-				trackedSet.setContributor(null);
-				if(overridingExtension.getDescriptor().hasOverridingExtensions())
-					pipelineInterceptRemove(aRemoveModification, trackedSet, overridingExtension);
-												
-			} 	
-			
-		} catch (Throwable e) {
-			String msg = e.getMessage() != null ? e.getMessage()  : e.toString();
-			NavigatorPlugin.logError(0, msg, e);
-		}  
-	}
-
-	/**
-	 * Intercept calls to viewer <code>refresh()</code> methods.
-	 * 
-	 * <p>
-	 * Clients may modify the given update to add or remove the elements to be
-	 * refreshed. Clients may return the same instance that was passed in for
-	 * the next downstream extension.
-	 * </p>
-	 * 
-	 * <p>
-	 * <b>Clients should not call any of the add, remove, refresh, or update
-	 * methods on the viewer from this method or any code invoked by the
-	 * implementation of this method.</b>
-	 * </p>
-	 * 
-	 * @param aRefreshSynchronization
-	 *            The (current) refresh update to execute against the viewer.
-	 * @return The (potentially reshaped) refresh to execute against the viewer.
-	 */
-	public boolean interceptRefresh(
-			PipelinedViewerUpdate aRefreshSynchronization) {
- 
-		boolean pipelined = false;
-		Object refreshable = null;
-		Set overrideableExtensions = new LinkedHashSet();
-		for (Iterator iter = aRefreshSynchronization.getRefreshTargets().iterator(); iter.hasNext();) {
-			refreshable = iter.next();
-			overrideableExtensions.addAll(contentService.findOverrideableContentExtensionsForPossibleChild(refreshable));
-		}
-		for (Iterator overrideableExtensionItr = overrideableExtensions.iterator(); overrideableExtensionItr.hasNext();) { 
-			pipelined |= pipelineInterceptRefresh((NavigatorContentExtension) overrideableExtensionItr.next(), aRefreshSynchronization, refreshable);
-		}
-
-		return pipelined;
-		
-	}
-
-	private boolean pipelineInterceptRefresh(NavigatorContentExtension overrideableExtension,
-			PipelinedViewerUpdate aRefreshSynchronization, Object refreshable) {
-
-		boolean intercepted = false;
-		
-		NavigatorContentExtension[] overridingExtensionsForPossibleChild = overrideableExtension.getOverridingExtensionsForPossibleChild(refreshable);
-		for (int i=0; i<overridingExtensionsForPossibleChild.length; i++) { 
-			try {
-				if (overridingExtensionsForPossibleChild[i].getContentProvider() instanceof IPipelinedTreeContentProvider) {
-
-					intercepted |= ((IPipelinedTreeContentProvider) overridingExtensionsForPossibleChild[i]
-							.getContentProvider())
-							.interceptRefresh(aRefreshSynchronization);
-					
-					if (overridingExtensionsForPossibleChild[i].getDescriptor().hasOverridingExtensions())  
-						intercepted |= pipelineInterceptRefresh(overridingExtensionsForPossibleChild[i], aRefreshSynchronization, refreshable);					
-				}
-			} catch (Throwable e) {
-				String msg = e.getMessage() != null ? e.getMessage()  : e.toString();
-				NavigatorPlugin.logError(0, msg, e);
-			}  
-		}
-
-		return intercepted;
-	}
-	
-
-
-	/**
-	 * Intercept calls to viewer <code>update()</code> methods.
-	 * 
-	 * <p>
-	 * Clients may modify the given update to add or remove the elements to be
-	 * updated. Clients may also add or remove properties for the given targets
-	 * to optimize the refresh. Clients may return the same instance that was
-	 * passed in for the next downstream extension.
-	 * </p>
-	 * 
-	 * <p>
-	 * <b>Clients should not call any of the add, remove, refresh, or update
-	 * methods on the viewer from this method or any code invoked by the
-	 * implementation of this method.</b>
-	 * </p>
-	 * 
-	 * @param anUpdateSynchronization
-	 *            The (current) update to execute against the viewer.
-	 * @return The (potentially reshaped) update to execute against the viewer.
-	 */
-	public boolean interceptUpdate(
-			PipelinedViewerUpdate anUpdateSynchronization) { 
-		 
-		boolean pipelined = false;
-		Object refreshable = null;
-
-		Set overrideableExtensions = new LinkedHashSet();
-		for (Iterator iter = anUpdateSynchronization.getRefreshTargets().iterator(); iter.hasNext();) {
-			refreshable = iter.next();
-			overrideableExtensions.addAll(contentService.findOverrideableContentExtensionsForPossibleChild(refreshable));
-		}
-		for (Iterator overrideableExtensionItr = overrideableExtensions.iterator(); overrideableExtensionItr.hasNext();) { 
-			pipelined |= pipelineInterceptUpdate((NavigatorContentExtension) overrideableExtensionItr.next(), anUpdateSynchronization, refreshable);
-		}
-
-		return pipelined;
-		
-	}
-
-	private boolean pipelineInterceptUpdate(NavigatorContentExtension overrideableExtension,
-					PipelinedViewerUpdate anUpdateSynchronization, Object refreshable) {
-
-		boolean intercepted = false; 
-		NavigatorContentExtension[] overridingExtensionsForPossibleChild = overrideableExtension.getOverridingExtensionsForPossibleChild(refreshable);
-		for (int i=0; i<overridingExtensionsForPossibleChild.length; i++) { 
-			try {
-				if (overridingExtensionsForPossibleChild[i].getContentProvider() instanceof IPipelinedTreeContentProvider) {
-
-					intercepted |= ((IPipelinedTreeContentProvider) overridingExtensionsForPossibleChild[i]
-							.getContentProvider())
-							.interceptUpdate(anUpdateSynchronization);
-					
-					if (overridingExtensionsForPossibleChild[i].getDescriptor().hasOverridingExtensions())  
-						intercepted |= pipelineInterceptUpdate(overridingExtensionsForPossibleChild[i], anUpdateSynchronization, refreshable);					
-				}
-			} catch (Throwable e) {
-				String msg = e.getMessage() != null ? e.getMessage()  : e.toString();
-				NavigatorPlugin.logError(0, msg, e);
-			}  
-		}
-
-		return intercepted;
-	} 
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorPlugin.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorPlugin.java
deleted file mode 100644
index 43a665b..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorPlugin.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleEvent;
-import org.osgi.framework.BundleListener;
-
-/**
- * The main plugin class for the Navigator. 
- *  
- * @since 3.2
- */
-public class NavigatorPlugin extends AbstractUIPlugin {
-	// The shared instance.
-	private static NavigatorPlugin plugin;
-	
-	private static final int LOG_DELAY = 100;
-	
-	private static class LogJob extends Job { 		
-		
-		
-		private ListenerList messages = new ListenerList() {
-			
-			public synchronized Object[] getListeners() {
-				Object[] mesgs = super.getListeners();
-				clear();
-				return mesgs;
-			}
-		};
-
-		
-		/**
-		 * Creates a Job which offloads the logging work into a non-UI thread.
-		 *
-		 */
-		public LogJob() {
-			super("");  //$NON-NLS-1$
-			setSystem(true); 
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-		 */
-		protected IStatus run(IProgressMonitor monitor) {
-			
-			Object[] mesgs = messages.getListeners();
-			ILog pluginLog = getDefault().getLog();
-			for (int i = 0; i < mesgs.length; i++) {
-				pluginLog.log((IStatus)mesgs[i]);
-			}
-			return Status.OK_STATUS;
-						
-		}
-		
-		/**
-		 * @param mesg The message to add to the Plugin's log.
-		 */
-		public void log(IStatus mesg) {
-			messages.add(mesg);
-
-		}
-		
-	}
-	
-	private static final LogJob logJob = new LogJob(); 
-
-	/** The id of the orge.eclipse.ui.navigator plugin. */
-	public static String PLUGIN_ID = "org.eclipse.ui.navigator"; //$NON-NLS-1$
-
-	private BundleListener bundleListener = new BundleListener() {
-		public void bundleChanged(BundleEvent event) {
-			NavigatorSaveablesService.bundleChanged(event);
-		}
-	};
-
-	/**
-	 * Creates a new instance of the receiver
-	 */
-	public NavigatorPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @return the shared instance.
-	 */
-	public static NavigatorPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given plug-in
-	 * relative path.
-	 * 
-	 * @param path
-	 *            the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin(PLUGIN_ID, path);
-	} 
-	
-
-	/**
-	 * Returns an image descriptor for the image file at the given plug-in
-	 * relative path.
-	 * 
-	 * @param path
-	 *            the path
-	 * @return the image 
-	 */
-	public Image getImage(String path) {
-		Image image = getImageRegistry().get(path);
-		if(image == null) {
-			ImageDescriptor descriptor = getImageDescriptor(path);
-			if(descriptor != null) {
-				getImageRegistry().put(path, image = descriptor.createImage());
-			}
-		}
-		return image;
-	} 
-
-	/**
-	 * Record an error against this plugin's log. 
-	 * 
-	 * @param aCode
-	 * @param aMessage
-	 * @param anException
-	 */
-	public static void logError(int aCode, String aMessage,
-			Throwable anException) {
-		getDefault().getLog().log(
-				createErrorStatus(aCode, aMessage, anException));
-	}
-
-	/**
-	 * 
-	 * Record a message against this plugin's log. 
-	 * 
-	 * @param severity
-	 * @param aCode
-	 * @param aMessage
-	 * @param exception
-	 */
-	public static void log(int severity, int aCode, String aMessage,
-			Throwable exception) {
-		log(createStatus(severity, aCode, aMessage, exception));
-	}
-
-	/**
-	 * 
-	 * Record a status against this plugin's log. 
-	 * 
-	 * @param aStatus
-	 */
-	public static void log(IStatus aStatus) {
-		//getDefault().getLog().log(aStatus);
-		logJob.log(aStatus);
-		logJob.schedule(LOG_DELAY);
-	}
-
-	/**
-	 * Create a status associated with this plugin.
-	 *  
-	 * @param severity
-	 * @param aCode
-	 * @param aMessage
-	 * @param exception
-	 * @return A status configured with this plugin's id and the given parameters.
-	 */
-	public static IStatus createStatus(int severity, int aCode,
-			String aMessage, Throwable exception) {
-		return new Status(severity, PLUGIN_ID, aCode,
-				aMessage != null ? aMessage : "No message.", exception); //$NON-NLS-1$
-	}
-
-	/**
-	 * 
-	 * @param aCode
-	 * @param aMessage
-	 * @param exception
-	 * @return A status configured with this plugin's id and the given parameters.
-	 */
-	public static IStatus createErrorStatus(int aCode, String aMessage,
-			Throwable exception) {
-		return createStatus(IStatus.ERROR, aCode, aMessage, exception);
-	}
-
-	public void start(BundleContext context) throws Exception {
-		// System.out.println("Navigator plugin starting"); //$NON-NLS-1$
-		super.start(context);
-		context.addBundleListener(bundleListener);
-	}
-
-	public void stop(BundleContext context) throws Exception {
-		context.removeBundleListener(bundleListener);
-		super.stop(context);
-		// System.out.println("Navigator plugin stopped"); //$NON-NLS-1$
-	}
-	
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorSaveablesService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorSaveablesService.java
deleted file mode 100644
index 3641497..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorSaveablesService.java
+++ /dev/null
@@ -1,599 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.ITreePathContentProvider;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.ISaveablesLifecycleListener;
-import org.eclipse.ui.ISaveablesSource;
-import org.eclipse.ui.Saveable;
-import org.eclipse.ui.SaveablesLifecycleEvent;
-import org.eclipse.ui.internal.navigator.VisibilityAssistant.VisibilityListener;
-import org.eclipse.ui.internal.navigator.extensions.ExtensionPriorityComparator;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptor;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentExtension;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorSaveablesService;
-import org.eclipse.ui.navigator.SaveablesProvider;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleEvent;
-
-/**
- * Implementation of INavigatorSaveablesService.
- * <p>
- * Implementation note: all externally callable methods are synchronized. The
- * private helper methods are not synchronized since they can only be called
- * from methods that already hold the lock.
- * </p>
- * @since 3.2
- * 
- */
-public class NavigatorSaveablesService implements INavigatorSaveablesService, VisibilityListener {
-
-	private NavigatorContentService contentService;
-
-	private static List instances = new ArrayList();
-
-	/**
-	 * @param contentService
-	 */
-	public NavigatorSaveablesService(NavigatorContentService contentService) {
-		this.contentService = contentService;
-	}
-
-	private static void addInstance(NavigatorSaveablesService saveablesService) {
-		synchronized (instances) {
-			instances.add(saveablesService);
-		}
-	}
-
-	private static void removeInstance(
-			NavigatorSaveablesService saveablesService) {
-		synchronized (instances) {
-			instances.remove(saveablesService);
-		}
-	}
-
-	/**
-	 * @param event
-	 */
-	/* package */ static void bundleChanged(BundleEvent event) {
-		synchronized(instances) {
-			if (event.getType() == BundleEvent.STARTED) {
-				// System.out.println("bundle started: " + event.getBundle().getSymbolicName()); //$NON-NLS-1$
-				for (Iterator it = instances.iterator(); it.hasNext();) {
-					NavigatorSaveablesService instance = (NavigatorSaveablesService) it
-							.next();
-					instance.handleBundleStarted(event.getBundle()
-							.getSymbolicName());
-				}
-			} else if (event.getType() == BundleEvent.STOPPED) {
-				// System.out.println("bundle stopped: " + event.getBundle().getSymbolicName()); //$NON-NLS-1$
-				for (Iterator it = instances.iterator(); it.hasNext();) {
-					NavigatorSaveablesService instance = (NavigatorSaveablesService) it
-							.next();
-					instance.handleBundleStopped(event.getBundle()
-							.getSymbolicName());
-				}
-			}
-		}
-	}
-
-	private class LifecycleListener implements ISaveablesLifecycleListener {
-		public void handleLifecycleEvent(SaveablesLifecycleEvent event) {
-			Saveable[] saveables = event.getSaveables();
-			Saveable[] shownSaveables = null;
-			// synchronize in the same order as in the init method.
-			synchronized (instances) {
-				synchronized (NavigatorSaveablesService.this) {
-					if (isDisposed())
-						return;
-					switch (event.getEventType()) {
-					case SaveablesLifecycleEvent.POST_OPEN:
-						recomputeSaveablesAndNotify(false, null);
-						break;
-					case SaveablesLifecycleEvent.POST_CLOSE:
-						recomputeSaveablesAndNotify(false, null);
-						break;
-					case SaveablesLifecycleEvent.DIRTY_CHANGED:
-						Set result = new HashSet(Arrays.asList(currentSaveables));
-						result.retainAll(Arrays.asList(saveables));
-						shownSaveables = (Saveable[]) result.toArray(new Saveable[result.size()]);
-						break;
-					}
-				}
-			}
-
-			// Notify outside of synchronization
-			if (shownSaveables != null && shownSaveables.length > 0) {
-				outsideListener.handleLifecycleEvent(new SaveablesLifecycleEvent(saveablesSource, SaveablesLifecycleEvent.DIRTY_CHANGED,
-						shownSaveables, false));
-			}
-		}
-	}
-
-	private Saveable[] currentSaveables;
-
-	private ISaveablesLifecycleListener outsideListener;
-
-	private ISaveablesLifecycleListener saveablesLifecycleListener = new LifecycleListener();
-
-	private ISaveablesSource saveablesSource;
-
-	private StructuredViewer viewer;
-
-	private SaveablesProvider[] saveablesProviders;
-
-	private DisposeListener disposeListener = new DisposeListener() {
-
-		public void widgetDisposed(DisposeEvent e) {
-			// synchronize in the same order as in the init method.
-			synchronized (instances) {
-				synchronized (NavigatorSaveablesService.this) {
-					if (saveablesProviders != null) {
-						for (int i = 0; i < saveablesProviders.length; i++) {
-							saveablesProviders[i].dispose();
-						}
-					}
-					removeInstance(NavigatorSaveablesService.this);
-					contentService = null;
-					currentSaveables = null;
-					outsideListener = null;
-					saveablesLifecycleListener = null;
-					saveablesSource = null;
-					viewer = null;
-					saveablesProviders = null;
-					disposeListener = null;
-				}
-			}
-		}
-	};
-
-	private Map inactivePluginsWithSaveablesProviders;
-
-    /**
-	 * a TreeMap (NavigatorContentDescriptor->SaveablesProvider) which uses
-	 * ExtensionPriorityComparator.INSTANCE as its Comparator
-	 */
-	private Map saveablesProviderMap;
-
-	/**
-	 * Implementation note: This is not synchronized at the method level because it needs to
-	 * synchronize on "instances" first, then on "this", to avoid potential deadlock.
-	 * 
-	 * @param saveablesSource
-	 * @param viewer
-	 * @param outsideListener
-	 * 
-	 */
-	public void init(final ISaveablesSource saveablesSource,
-			final StructuredViewer viewer,
-			ISaveablesLifecycleListener outsideListener) {
-		// Synchronize on instances to make sure that we don't miss bundle started events. 
-		synchronized (instances) {
-			// Synchronize on this because we are calling computeSaveables.
-			// Synchronization must remain in this order to avoid deadlock.
-			// This might not be necessary because at this time, no other
-			// concurrent calls should be possible, but it doesn't hurt either.
-			// For example, the initialization sequence might change in the
-			// future.
-			synchronized (this) {
-				this.saveablesSource = saveablesSource;
-				this.viewer = viewer;
-				this.outsideListener = outsideListener;
-				currentSaveables = computeSaveables();
-				// add this instance after we are fully inialized.
-				addInstance(this);
-			}
-		}
-		viewer.getControl().addDisposeListener(disposeListener);
-	}
-
-	private boolean isDisposed() {
-		return contentService == null;
-	}
-	
-	/** helper to compute the saveables for which elements are part of the tree.
-	 * Must be called from a synchronized method.
-	 * 
-	 * @return the saveables
-	 */ 
-	private Saveable[] computeSaveables() {
-		ITreeContentProvider contentProvider = (ITreeContentProvider) viewer
-				.getContentProvider();
-		boolean isTreepathContentProvider = contentProvider instanceof ITreePathContentProvider;
-		Object viewerInput = viewer.getInput();
-		List result = new ArrayList();
-		Set roots = new HashSet(Arrays.asList(contentProvider
-				.getElements(viewerInput)));
-		SaveablesProvider[] saveablesProviders = getSaveablesProviders();
-		for (int i = 0; i < saveablesProviders.length; i++) {
-			SaveablesProvider saveablesProvider = saveablesProviders[i];
-			Saveable[] saveables = saveablesProvider.getSaveables();
-			for (int j = 0; j < saveables.length; j++) {
-				Saveable saveable = saveables[j];
-				Object[] elements = saveablesProvider.getElements(saveable);
-				// the saveable is added to the result if at least one of the
-				// elements representing the saveable appears in the tree, i.e.
-				// if its parent chain leads to a root node.
-				boolean foundRoot = false;
-				for (int k = 0; !foundRoot && k < elements.length; k++) {
-					Object element = elements[k];
-					if (roots.contains(element)) {
-					    result.add(saveable);
-					    foundRoot = true;
-					} else if (isTreepathContentProvider) {
-						ITreePathContentProvider treePathContentProvider = (ITreePathContentProvider) contentProvider;
-						TreePath[] parentPaths = treePathContentProvider.getParents(element);
-						for (int l = 0; !foundRoot && l < parentPaths.length; l++) {
-							TreePath parentPath = parentPaths[l];
-                            for (int m = 0; !foundRoot && m < parentPath.getSegmentCount(); m++) {
-                                if (roots.contains(parentPath.getSegment(m))) {
-                                    result.add(saveable);
-                                    foundRoot = true;
-                                }
-                            }
-						}
-					} else {
-						while (!foundRoot && element != null) {
-							if (roots.contains(element)) {
-								// found a parent chain leading to a root. The
-								// saveable is part of the tree.
-								result.add(saveable);
-								foundRoot = true;
-							} else {
-								element = contentProvider.getParent(element);
-							}
-						}
-					}
-				}
-			}
-		}
-		return (Saveable[]) result.toArray(new Saveable[result.size()]);
-	}
-
-	public synchronized Saveable[] getActiveSaveables() {
-		ITreeContentProvider contentProvider = (ITreeContentProvider) viewer
-				.getContentProvider();
-		IStructuredSelection selection = (IStructuredSelection) viewer
-				.getSelection();
-		if (selection instanceof ITreeSelection) {
-			return getActiveSaveablesFromTreeSelection((ITreeSelection) selection);
-		} else if (contentProvider instanceof ITreePathContentProvider) {
-			return getActiveSaveablesFromTreePathProvider(selection, (ITreePathContentProvider) contentProvider);
-		} else {
-			return getActiveSaveablesFromTreeProvider(selection, contentProvider);
-		}
-	}
-	
-	/**
-	 * @param selection
-	 * @return the active saveables
-	 */
-	private Saveable[] getActiveSaveablesFromTreeSelection(
-			ITreeSelection selection) {
-		Set result = new HashSet();
-		TreePath[] paths = selection.getPaths();
-		for (int i = 0; i < paths.length; i++) {
-			TreePath path = paths[i];
-			Saveable saveable = findSaveable(path);
-			if (saveable != null) {
-				result.add(saveable);
-			}
-		}
-		return (Saveable[]) result.toArray(new Saveable[result.size()]);
-	}
-
-	/**
-	 * @param selection
-	 * @param provider
-	 * @return the active saveables
-	 */
-	private Saveable[] getActiveSaveablesFromTreePathProvider(
-			IStructuredSelection selection, ITreePathContentProvider provider) {
-		Set result = new HashSet();
-		for (Iterator it = selection.iterator(); it.hasNext();) {
-			Object element = it.next();
-			Saveable saveable = getSaveable(element);
-			if (saveable != null) {
-				result.add(saveable);
-			} else {
-				TreePath[] paths = provider.getParents(element);
-				saveable = findSaveable(paths);
-				if (saveable != null) {
-					result.add(saveable);
-				}
-			}
-		}
-		return (Saveable[]) result.toArray(new Saveable[result.size()]);
-	}
-
-	/**
-	 * @param selection
-	 * @param contentProvider
-	 * @return the active saveables
-	 */
-	private Saveable[] getActiveSaveablesFromTreeProvider(
-			IStructuredSelection selection, ITreeContentProvider contentProvider) {
-		Set result = new HashSet();
-		for (Iterator it = selection.iterator(); it.hasNext();) {
-			Object element = it.next();
-			Saveable saveable = findSaveable(element, contentProvider);
-			if (saveable != null) {
-				result.add(saveable);
-			}
-		}
-		return (Saveable[]) result.toArray(new Saveable[result.size()]);
-	}
-
-	/**
-	 * @param element
-	 * @param contentProvider
-	 * @return the saveable, or null
-	 */
-	private Saveable findSaveable(Object element,
-			ITreeContentProvider contentProvider) {
-		while (element != null) {
-			Saveable saveable = getSaveable(element);
-			if (saveable != null) {
-				return saveable;
-			}
-			element = contentProvider.getParent(element);
-		}
-		return null;
-	}
-
-	/**
-	 * @param paths
-	 * @return the saveable, or null
-	 */
-	private Saveable findSaveable(TreePath[] paths) {
-		for (int i = 0; i < paths.length; i++) {
-			Saveable saveable = findSaveable(paths[i]);
-			if (saveable != null) {
-				return saveable;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * @param path
-	 * @return a saveable, or null
-	 */
-	private Saveable findSaveable(TreePath path) {
-		int count = path.getSegmentCount();
-		for (int j = count - 1; j >= 0; j--) {
-			Object parent = path.getSegment(j);
-			Saveable saveable = getSaveable(parent);
-			if (saveable != null) {
-				return saveable;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param element
-	 * @return the saveable associated with the given element
-	 */
-	private Saveable getSaveable(Object element) {
-		if (saveablesProviderMap==null) {
-			// has the side effect of recomputing saveablesProviderMap:
-			getSaveablesProviders();
-		}
-        for(Iterator sItr = saveablesProviderMap.keySet().iterator(); sItr.hasNext();) {
-        	NavigatorContentDescriptor descriptor = (NavigatorContentDescriptor) sItr.next();
-                if(descriptor.isTriggerPoint(element) || descriptor.isPossibleChild(element)) {
-                	SaveablesProvider provider = (SaveablesProvider) saveablesProviderMap.get(descriptor);
-                	Saveable  saveable = provider.getSaveable(element);
-                        if(saveable != null) {
-                                return saveable;
-                        }
-                }
-        }
-        return null;
-	}
-
-	/**
-	 * @return the saveables
-	 */
-	public synchronized Saveable[] getSaveables() {
-		return currentSaveables;
-	}
-
-	/**
-	 * @return all SaveablesProvider objects
-	 */
-	private SaveablesProvider[] getSaveablesProviders() {
-		// TODO optimize this
-		if (saveablesProviders == null) {
-			inactivePluginsWithSaveablesProviders = new HashMap();
-			saveablesProviderMap = new TreeMap(ExtensionPriorityComparator.INSTANCE);
-			INavigatorContentDescriptor[] descriptors = contentService
-					.getActiveDescriptorsWithSaveables();
-			List result = new ArrayList();
-			for (int i = 0; i < descriptors.length; i++) {
-				NavigatorContentDescriptor descriptor = (NavigatorContentDescriptor) descriptors[i];
-				String pluginId = ((NavigatorContentDescriptor) descriptor)
-						.getContribution().getPluginId();
-				if (Platform.getBundle(pluginId).getState() != Bundle.ACTIVE) {
-					List inactiveDescriptors = (List) inactivePluginsWithSaveablesProviders
-							.get(pluginId);
-					if (inactiveDescriptors == null) {
-						inactiveDescriptors = new ArrayList();
-						inactivePluginsWithSaveablesProviders.put(pluginId,
-								inactiveDescriptors);
-					}
-					inactiveDescriptors.add(descriptor);
-				} else {
-					SaveablesProvider saveablesProvider = createSaveablesProvider(descriptor);
-					if (saveablesProvider != null) {
-						saveablesProvider.init(saveablesLifecycleListener);
-						result.add(saveablesProvider);
-						saveablesProviderMap.put(descriptor, saveablesProvider);
-					}
-				}
-			}
-			saveablesProviders = (SaveablesProvider[]) result
-					.toArray(new SaveablesProvider[result.size()]);
-		}
-		return saveablesProviders;
-	}
-
-	/**
-	 * @param descriptor
-	 * @return the SaveablesProvider, or null
-	 */
-	private SaveablesProvider createSaveablesProvider(NavigatorContentDescriptor descriptor) {
-		NavigatorContentExtension extension = contentService
-				.getExtension(descriptor, true);
-		ITreeContentProvider contentProvider = extension
-				.getContentProvider();
-        
-        return (SaveablesProvider)AdaptabilityUtility.getAdapter(contentProvider, SaveablesProvider.class);
-	}
-
-	private void recomputeSaveablesAndNotify(boolean recomputeProviders,
-			String startedBundleIdOrNull) {
-		if (recomputeProviders && startedBundleIdOrNull == null
-				&& saveablesProviders != null) {
-			// a bundle was stopped, dispose of all saveablesProviders and
-			// recompute
-			// TODO optimize this
-			for (int i = 0; i < saveablesProviders.length; i++) {
-				saveablesProviders[i].dispose();
-			}
-			saveablesProviders = null;
-		} else if (startedBundleIdOrNull != null){
-			if(inactivePluginsWithSaveablesProviders.containsKey(startedBundleIdOrNull)) {
-				updateSaveablesProviders(startedBundleIdOrNull);
-			}
-		}
-		Set oldSaveables = new HashSet(Arrays.asList(currentSaveables));
-		currentSaveables = computeSaveables();
-		Set newSaveables = new HashSet(Arrays.asList(currentSaveables));
-		final Set removedSaveables = new HashSet(oldSaveables);
-		removedSaveables.removeAll(newSaveables);
-		final Set addedSaveables = new HashSet(newSaveables);
-		addedSaveables.removeAll(oldSaveables);
-		if (addedSaveables.size() > 0) {
-			Display.getDefault().asyncExec(new Runnable() {
-				public void run() {
-					if (isDisposed()) {
-						return;
-					}
-					outsideListener.handleLifecycleEvent(new SaveablesLifecycleEvent(
-							saveablesSource, SaveablesLifecycleEvent.POST_OPEN,
-							(Saveable[]) addedSaveables
-							.toArray(new Saveable[addedSaveables.size()]),
-							false));
-				}
-			});
-		}
-		// TODO this will make the closing of saveables non-cancelable.
-		// Ideally, we should react to PRE_CLOSE events and fire
-		// an appropriate PRE_CLOSE
-		if (removedSaveables.size() > 0) {
-			Display.getDefault().asyncExec(new Runnable() {
-				public void run() {
-					if (isDisposed()) {
-						return;
-					}
-					outsideListener
-							.handleLifecycleEvent(new SaveablesLifecycleEvent(
-									saveablesSource,
-									SaveablesLifecycleEvent.PRE_CLOSE,
-									(Saveable[]) removedSaveables
-											.toArray(new Saveable[removedSaveables
-													.size()]), true));
-					outsideListener
-							.handleLifecycleEvent(new SaveablesLifecycleEvent(
-									saveablesSource,
-									SaveablesLifecycleEvent.POST_CLOSE,
-									(Saveable[]) removedSaveables
-											.toArray(new Saveable[removedSaveables
-													.size()]), false));
-				}
-			});
-		}
-	}
-
-	/**
-	 * @param startedBundleId
-	 */
-	private void updateSaveablesProviders(String startedBundleId) {
-		List result = new ArrayList(Arrays.asList(saveablesProviders));
-		List descriptors = (List) inactivePluginsWithSaveablesProviders
-				.get(startedBundleId);
-		for (Iterator it = descriptors.iterator(); it.hasNext();) {
-			NavigatorContentDescriptor descriptor = (NavigatorContentDescriptor) it
-					.next();
-			SaveablesProvider saveablesProvider = createSaveablesProvider(descriptor);
-			if (saveablesProvider != null) {
-				saveablesProvider.init(saveablesLifecycleListener);
-				result.add(saveablesProvider);
-				saveablesProviderMap.put(descriptor, saveablesProvider);
-			}
-		}
-		saveablesProviders = (SaveablesProvider[]) result
-				.toArray(new SaveablesProvider[result.size()]);
-	}
-
-	/**
-	 * @param symbolicName
-	 */
-	private synchronized void handleBundleStarted(String symbolicName) {
-		if (!isDisposed()) {
-			if (inactivePluginsWithSaveablesProviders.containsKey(symbolicName)) {
-				recomputeSaveablesAndNotify(true, symbolicName);
-			}
-		}
-	}
-
-	/**
-	 * @param symbolicName
-	 */
-	private synchronized void handleBundleStopped(String symbolicName) {
-		if (!isDisposed()) {
-			recomputeSaveablesAndNotify(true, null);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.navigator.VisibilityAssistant.VisibilityListener#onVisibilityOrActivationChange()
-	 */
-	public synchronized void onVisibilityOrActivationChange() {
-		if (!isDisposed()) {
-			recomputeSaveablesAndNotify(true, null);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorSiteEditor.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorSiteEditor.java
deleted file mode 100644
index d7be8a4..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorSiteEditor.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TreeEditor;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.internal.navigator.extensions.INavigatorSiteEditor;
-import org.eclipse.ui.navigator.CommonViewer;
-
-
-/**
- * A NavigatorSiteEditor is used to edit (i.e., rename) elements in a Navigator view. It displays a
- * text editor box overlay on the Navigator tree widget.
- *  
- * @since 3.2
- */
-public class NavigatorSiteEditor implements INavigatorSiteEditor {
-
-	private Tree navigatorTree;
-	private TreeEditor treeEditor;
-	private Text textEditor;
-	private Composite textEditorParent;
-	private TextActionHandler textActionHandler;
-	private String text; // the text being edited
-	private CommonViewer commonViewer;
-
-
-	/**
-	 * Creates an instance of a NavigatorSiteEditor.
-	 * 
-	 * @param aCommonViewer
-	 *            the viewer this editor applies to
-	 * @param navigatorTree
-	 *            the tree that is being edited
-	 */
-	public NavigatorSiteEditor(CommonViewer aCommonViewer, Tree navigatorTree) {
-		commonViewer = aCommonViewer;
-		this.navigatorTree = navigatorTree;
-		treeEditor = new TreeEditor(navigatorTree);
-	}
-
-	/**
-	 * Creates the parent composite for the editor overlay.
-	 * 
-	 * @return the parent composite for the editor overlay
-	 */
-	Composite createParent() {
-		Composite result = new Composite(navigatorTree, SWT.NONE);
-		TreeItem[] selectedItems = navigatorTree.getSelection();
-		treeEditor.horizontalAlignment = SWT.LEFT;
-		treeEditor.grabHorizontal = true;
-		treeEditor.setEditor(result, selectedItems[0]);
-		return result;
-	}
-
-	/**
-	 * Creates the text editor widget.
-	 * 
-	 * @param runnable
-	 *            the Runnable to execute when editing ends by the user pressing enter or clicking
-	 *            outside the text editor box.
-	 */
-	void createTextEditor(final Runnable runnable) {
-		// Create text editor parent. This draws a nice bounding rect.
-		textEditorParent = createParent();
-		textEditorParent.setVisible(false);
-		textEditorParent.addListener(SWT.Paint, new Listener() {
-			public void handleEvent(Event e) {
-				Point textSize = textEditor.getSize();
-				Point parentSize = textEditorParent.getSize();
-				e.gc.drawRectangle(0, 0, Math.min(textSize.x + 4, parentSize.x - 1), parentSize.y - 1);
-			}
-		});
-
-		// Create inner text editor.
-		textEditor = new Text(textEditorParent, SWT.NONE);
-		textEditorParent.setBackground(textEditor.getBackground());
-		textEditor.addListener(SWT.Modify, new Listener() {
-			public void handleEvent(Event e) {
-				Point textSize = textEditor.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-				textSize.x += textSize.y; // Add extra space for new characters.
-				Point parentSize = textEditorParent.getSize();
-				textEditor.setBounds(2, 1, Math.min(textSize.x, parentSize.x - 4), parentSize.y - 2);
-				textEditorParent.redraw();
-			}
-		});
-		textEditor.addListener(SWT.Traverse, new Listener() {
-			public void handleEvent(Event event) {
-				//Workaround for Bug 20214 due to extra
-				//traverse events
-				switch (event.detail) {
-					case SWT.TRAVERSE_ESCAPE :
-						//Do nothing in this case
-						disposeTextWidget();
-						event.doit = true;
-						event.detail = SWT.TRAVERSE_NONE;
-						break;
-					case SWT.TRAVERSE_RETURN :
-						saveChangesAndDispose(runnable);
-						event.doit = true;
-						event.detail = SWT.TRAVERSE_NONE;
-						break;
-				}
-			}
-		});
-		textEditor.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent fe) {
-				saveChangesAndDispose(runnable);
-			}
-		});
-
-		if (textActionHandler != null) {
-			textActionHandler.addText(textEditor);
-		}
-	}
-
-	/**
-	 * Closes the text editor widget.
-	 */
-	void disposeTextWidget() {
-		if (textActionHandler != null) {
-			textActionHandler.removeText(textEditor);
-		}
-		if (textEditorParent != null) {
-			textEditorParent.dispose();
-			textEditorParent = null;
-			textEditor = null;
-			treeEditor.setEditor(null, null);
-		}
-	}
-
-	/**
-	 * Displays a text editor overlay on the tree widget.
-	 * 
-	 * @param runnable
-	 *            Runnable to execute when editing ends either by the user pressing enter or
-	 *            clicking outside the editor box.
-	 */
-	public void edit(Runnable runnable) {
-		IStructuredSelection selection = (IStructuredSelection) commonViewer.getSelection();
-
-		if (selection.size() != 1) {
-			return;
-		}
-		text = getLabel(selection.getFirstElement());
-		if (text == null) {
-			return;
-		}
-		// Make sure text editor is created only once. Simply reset text
-		// editor when action is executed more than once. Fixes bug 22269.
-		if (textEditorParent == null) {
-			createTextEditor(runnable);
-		}
-		textEditor.setText(text);
-		// Open text editor with initial size.
-		textEditorParent.setVisible(true);
-		Point textSize = textEditor.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		textSize.x += textSize.y; // Add extra space for new characters.
-		Point parentSize = textEditorParent.getSize();
-		textEditor.setBounds(2, 1, Math.min(textSize.x, parentSize.x - 4), parentSize.y - 2);
-		textEditorParent.redraw();
-		textEditor.selectAll();
-		textEditor.setFocus();
-	}
-
-	/**
-	 * Returns the displayed label of the given element.
-	 * 
-	 * @param element
-	 *            the element that is displayed in the navigator
-	 * @return the displayed label of the given element.
-	 */
-	String getLabel(Object element) {
-		return ((ILabelProvider) commonViewer.getLabelProvider()).getText(element);
-	}
-
- 
-	public String getText() {
-		return text;
-	}
-
-	/**
-	 * Saves the changes and disposes of the text widget.
-	 * 
-	 * @param runnable
-	 *            Runnable to execute
-	 */
-	void saveChangesAndDispose(final Runnable runnable) {
-		final String newText = textEditor.getText();
-		// Run this in an async to make sure that the operation that triggered
-		// this action is completed. Otherwise this leads to problems when the
-		// icon of the item being renamed is clicked (i.e., which causes the rename
-		// text widget to lose focus and trigger this method).
-		Runnable editRunnable = new Runnable() {
-			public void run() {
-				disposeTextWidget();
-				if (newText.length() > 0 && newText.equals(text) == false) {
-					text = newText;
-					runnable.run();
-				}
-				text = null;
-			}
-		};
-		navigatorTree.getShell().getDisplay().asyncExec(editRunnable);
-	}
-
- 
-	public void setTextActionHandler(TextActionHandler actionHandler) {
-		textActionHandler = actionHandler;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/Policy.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/Policy.java
deleted file mode 100755
index 4fa3d37..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/Policy.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import org.eclipse.core.runtime.Platform;
-
-/**
- * Policy is the class for the debug arguments in the navigator
- * 
- */
-public class Policy {
-
-	/**
-	 * The default value
-	 */
-	public static final boolean DEFAULT = false;
-
-	/**
-	 * Option for tracing the reading and setup of the extensions
-	 */
-	public static boolean DEBUG_EXTENSION_SETUP = DEFAULT;
-
-	/**
-	 * Option for tracing extension resolution
-	 */
-	public static boolean DEBUG_RESOLUTION = DEFAULT;
-
-	/**
-	 * Option for tracing drag and drop
-	 */
-	public static boolean DEBUG_DND = DEFAULT;
-
-	static {
-		if (getDebugOption("/debug")) { //$NON-NLS-1$
-			DEBUG_EXTENSION_SETUP = getDebugOption("/debug/setup"); //$NON-NLS-1$
-			DEBUG_RESOLUTION = getDebugOption("/debug/resolution"); //$NON-NLS-1$
-			DEBUG_DND = getDebugOption("/debug/dnd"); //$NON-NLS-1$
-		}
-	}
-
-	private static boolean getDebugOption(String option) {
-		return "true".equalsIgnoreCase(Platform.getDebugOption(NavigatorPlugin.PLUGIN_ID + option)); //$NON-NLS-1$
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/ReusableViewerLabel.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/ReusableViewerLabel.java
deleted file mode 100644
index 4fb27b9..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/ReusableViewerLabel.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2006 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- **************************************************************************************************/
-
-package org.eclipse.ui.internal.navigator;
-
-import org.eclipse.jface.viewers.ViewerLabel;
-
-/**
- * Provides a subclass of ViewerLabel that can be re-used for multiple viewer updates.
- * 
- * @since 3.2
- * 
- */
-public class ReusableViewerLabel extends ViewerLabel {
-
-	private ViewerLabel original = null;
-	/**
-	 * Creates a ViewerLabel with null text and image.
-	 *
-	 */
-	public ReusableViewerLabel() {
-		super(null, null);
-	}
-
-
-	/**
-	 * Updates the Background, Foreground, and Font to the given ViewerLabel. The 
-	 * Text and Image are reset to <b>null</b>.
-	 * 
-	 * @param theOriginal The ViewerLabel to represent.
-	 */
-	public void reset(ViewerLabel theOriginal) {
-		original = theOriginal;
-		setBackground(original.getBackground());
-		setFont(original.getFont());
-		setForeground(original.getForeground());
-		setImage(null);
-		setText(null);
-	}
-	
-	/**
-	 * 
-	 * @param theOriginal The ViewerLabel to fill with my values. 
-	 */
-	public void fill(ViewerLabel theOriginal) {
-
-		theOriginal.setBackground(getBackground());
-		theOriginal.setFont(getFont());
-		theOriginal.setForeground(getForeground());
-		theOriginal.setImage(getImage());
-		theOriginal.setText(getText() != null ? getText() : ""); //$NON-NLS-1$
-	}
-
-	/** 
-	 * 
-	 * @return True if the ReusableViewerLabel has different text or image than the original
-	 *         ViewerLabel.
-	 */
-	public boolean hasChanged() {
-		
-		boolean changed = false;
-		if(original != null) {
-			if(original.getText() == null ^ getText() != null)
-				changed |= getText() != null;
-			if(original.getText() != null && getImage() != null)
-				changed |= !getImage().equals(original.getImage());
-		}
-		return changed;
-	}
-
-	/**
-	 * @return True if the text is non-null and non-zero in length.
-	 */
-	public boolean isValid() {
-		return getText() != null && getText().length() > 0 && getImage() != null;
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/StringMatcher.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/StringMatcher.java
deleted file mode 100644
index 238cea4..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/StringMatcher.java
+++ /dev/null
@@ -1,492 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator;
-
-import java.util.Vector;
-
-/**
- * A string pattern matcher, suppporting "*" and "?" wildcards.
- */
-public class StringMatcher {
-	protected String fPattern;
-
-	protected int fLength; // pattern length
-
-	protected boolean fIgnoreWildCards;
-
-	protected boolean fIgnoreCase;
-
-	protected boolean fHasLeadingStar;
-
-	protected boolean fHasTrailingStar;
-
-	protected String fSegments[]; // the given pattern is split into *
-
-	// separated segments
-
-	/* boundary value beyond which we don't need to search in the text */
-	protected int fBound = 0;
-
-	protected static final char fSingleWildCard = '\u0000';
-
-	/**
-	 * 
-	 */
-	static class Position {
-		int start; // inclusive
-
-		int end; // exclusive
-
-		Position(int start, int end) {
-			this.start = start;
-			this.end = end;
-		}
-
-		int getStart() {
-			return start;
-		}
-
-		int getEnd() {
-			return end;
-		}
-	}
-
-	/**
-	 * StringMatcher constructor takes in a String object that is a simple
-	 * pattern which may contain '*' for 0 and many characters and '?' for
-	 * exactly one character.
-	 * 
-	 * Literal '*' and '?' characters must be escaped in the pattern e.g., "\*"
-	 * means literal "*", etc.
-	 * 
-	 * Escaping any other character (including the escape character itself),
-	 * just results in that character in the pattern. e.g., "\a" means "a" and
-	 * "\\" means "\"
-	 * 
-	 * If invoking the StringMatcher with string literals in Java, don't forget
-	 * escape characters are represented by "\\".
-	 * 
-	 * @param pattern
-	 *            the pattern to match text against
-	 * @param ignoreCase
-	 *            if true, case is ignored
-	 * @param ignoreWildCards
-	 *            if true, wild cards and their escape sequences are ignored
-	 *            (everything is taken literally).
-	 */
-	public StringMatcher(String pattern, boolean ignoreCase,
-			boolean ignoreWildCards) {
-		if (pattern == null) {
-			throw new IllegalArgumentException();
-		}
-		fIgnoreCase = ignoreCase;
-		fIgnoreWildCards = ignoreWildCards;
-		fPattern = pattern;
-		fLength = pattern.length();
-
-		if (fIgnoreWildCards) {
-			parseNoWildCards();
-		} else {
-			parseWildCards();
-		}
-	}
-
-	/**
-	 * Find the first occurrence of the pattern between
-	 * <code>start</code)(inclusive) 
-	 * and <code>end</code>(exclusive).  
-	 * @param  text  the String object to search in 
-	 * @param  start  the starting index of the search range, inclusive
-	 * @param  end  the ending index of the search range, exclusive
-	 * @return an <code>StringMatcher.Position</code> object that keeps the starting 
-	 * (inclusive) and ending positions (exclusive) of the first occurrence of the 
-	 * pattern in the specified range of the text; return null if not found or subtext
-	 * is empty (start==end). A pair of zeros is returned if pattern is empty string
-	 * Note that for pattern like "*abc*" with leading and trailing stars, position of "abc"
-	 * is returned. For a pattern like"*??*" in text "abcdf", (1,3) is returned
-	 */
-	public StringMatcher.Position find(String text, int start, int end) {
-		if (text == null) {
-			throw new IllegalArgumentException();
-		}
-
-		int tlen = text.length();
-		if (start < 0) {
-			start = 0;
-		}
-		if (end > tlen) {
-			end = tlen;
-		}
-		if (end < 0 || start >= end) {
-			return null;
-		}
-		if (fLength == 0) {
-			return new Position(start, start);
-		}
-		if (fIgnoreWildCards) {
-			int x = posIn(text, start, end);
-			if (x < 0) {
-				return null;
-			}
-			return new Position(x, x + fLength);
-		}
-
-		int segCount = fSegments.length;
-		if (segCount == 0) {
-			return new Position(start, end);
-		}
-
-		int curPos = start;
-		int matchStart = -1;
-		int i;
-		for (i = 0; i < segCount && curPos < end; ++i) {
-			String current = fSegments[i];
-			int nextMatch = regExpPosIn(text, curPos, end, current);
-			if (nextMatch < 0) {
-				return null;
-			}
-			if (i == 0) {
-				matchStart = nextMatch;
-			}
-			curPos = nextMatch + current.length();
-		}
-		if (i < segCount) {
-			return null;
-		}
-		return new Position(matchStart, curPos);
-	}
-
-	/**
-	 * match the given <code>text</code> with the pattern
-	 * 
-	 * @return true if matched eitherwise false
-	 * @param text
-	 *            a String object
-	 */
-	public boolean match(String text) {
-		if (text == null) {
-			return false;
-		}
-		return match(text, 0, text.length());
-	}
-
-	/**
-	 * Given the starting (inclusive) and the ending (exclusive) positions in
-	 * the <code>text</code>, determine if the given substring matches with
-	 * aPattern
-	 * 
-	 * @return true if the specified portion of the text matches the pattern
-	 * @param text
-	 *            a String object that contains the substring to match
-	 * @param start
-	 *            marks the starting position (inclusive) of the substring
-	 * @param end
-	 *            marks the ending index (exclusive) of the substring
-	 */
-	public boolean match(String text, int start, int end) {
-		if (null == text) {
-			throw new IllegalArgumentException();
-		}
-
-		if (start > end) {
-			return false;
-		}
-
-		if (fIgnoreWildCards) {
-			return (end - start == fLength)
-					&& fPattern.regionMatches(fIgnoreCase, 0, text, start,
-							fLength);
-		}
-		int segCount = fSegments.length;
-		if (segCount == 0 && (fHasLeadingStar || fHasTrailingStar)) {
-			// contains
-			// only
-			// '*'(s)
-			return true;
-		}
-		if (start == end) {
-			return fLength == 0;
-		}
-		if (fLength == 0) {
-			return start == end;
-		}
-
-		int tlen = text.length();
-		if (start < 0) {
-			start = 0;
-		}
-		if (end > tlen) {
-			end = tlen;
-		}
-
-		int tCurPos = start;
-		int bound = end - fBound;
-		if (bound < 0) {
-			return false;
-		}
-		int i = 0;
-		String current = fSegments[i];
-		int segLength = current.length();
-
-		/* process first segment */
-		if (!fHasLeadingStar) {
-			if (!regExpRegionMatches(text, start, current, 0, segLength)) {
-				return false;
-			}
-			++i;
-			tCurPos = tCurPos + segLength;
-
-		}
-		if ((fSegments.length == 1) && (!fHasLeadingStar)
-				&& (!fHasTrailingStar)) {
-			// only one segment to match, no wildcards specified
-			return tCurPos == end;
-		}
-		/* process middle segments */
-		while (i < segCount) {
-			current = fSegments[i];
-			int currentMatch;
-			int k = current.indexOf(fSingleWildCard);
-			if (k < 0) {
-				currentMatch = textPosIn(text, tCurPos, end, current);
-				if (currentMatch < 0) {
-					return false;
-				}
-			} else {
-				currentMatch = regExpPosIn(text, tCurPos, end, current);
-				if (currentMatch < 0) {
-					return false;
-				}
-			}
-			tCurPos = currentMatch + current.length();
-			i++;
-		}
-
-		/* process final segment */
-		if (!fHasTrailingStar && tCurPos != end) {
-			int clen = current.length();
-			return regExpRegionMatches(text, end - clen, current, 0, clen);
-		}
-		return i == segCount;
-	}
-
-	/**
-	 * This method parses the given pattern into segments seperated by wildcard
-	 * '*' characters. Since wildcards are not being used in this case, the
-	 * pattern consists of a single segment.
-	 */
-	private void parseNoWildCards() {
-		fSegments = new String[1];
-		fSegments[0] = fPattern;
-		fBound = fLength;
-	}
-
-	/**
-	 * Parses the given pattern into segments seperated by wildcard '*'
-	 * characters.
-	 * 
-	 */
-	private void parseWildCards() {
-		if (fPattern.startsWith("*")) { //$NON-NLS-1$
-			fHasLeadingStar = true;
-		}
-		if (fPattern.endsWith("*")) {//$NON-NLS-1$
-			/* make sure it's not an escaped wildcard */
-			if (fLength > 1 && fPattern.charAt(fLength - 2) != '\\') {
-				fHasTrailingStar = true;
-			}
-		}
-
-		Vector temp = new Vector();
-
-		int pos = 0;
-		StringBuffer buf = new StringBuffer();
-		while (pos < fLength) {
-			char c = fPattern.charAt(pos++);
-			switch (c) {
-			case '\\':
-				if (pos >= fLength) {
-					buf.append(c);
-				} else {
-					char next = fPattern.charAt(pos++);
-					/* if it's an escape sequence */
-					if (next == '*' || next == '?' || next == '\\') {
-						buf.append(next);
-					} else {
-						/* not an escape sequence, just insert literally */
-						buf.append(c);
-						buf.append(next);
-					}
-				}
-				break;
-			case '*':
-				if (buf.length() > 0) {
-					/* new segment */
-					temp.addElement(buf.toString());
-					fBound += buf.length();
-					buf.setLength(0);
-				}
-				break;
-			case '?':
-				/* append special character representing single match wildcard */
-				buf.append(fSingleWildCard);
-				break;
-			default:
-				buf.append(c);
-			}
-		}
-
-		/* add last buffer to segment list */
-		if (buf.length() > 0) {
-			temp.addElement(buf.toString());
-			fBound += buf.length();
-		}
-
-		fSegments = new String[temp.size()];
-		temp.copyInto(fSegments);
-	}
-
-	/**
-	 * @param text
-	 *            a string which contains no wildcard
-	 * @param start
-	 *            the starting index in the text for search, inclusive
-	 * @param end
-	 *            the stopping point of search, exclusive
-	 * @return the starting index in the text of the pattern , or -1 if not
-	 *         found
-	 */
-	protected int posIn(String text, int start, int end) {// no wild card in
-		// pattern
-		int max = end - fLength;
-
-		if (!fIgnoreCase) {
-			int i = text.indexOf(fPattern, start);
-			if (i == -1 || i > max) {
-				return -1;
-			}
-			return i;
-		}
-
-		for (int i = start; i <= max; ++i) {
-			if (text.regionMatches(true, i, fPattern, 0, fLength)) {
-				return i;
-			}
-		}
-
-		return -1;
-	}
-
-	/**
-	 * @param text
-	 *            a simple regular expression that may only contain '?'(s)
-	 * @param start
-	 *            the starting index in the text for search, inclusive
-	 * @param end
-	 *            the stopping point of search, exclusive
-	 * @param p
-	 *            a simple regular expression that may contains '?'
-	 * @return the starting index in the text of the pattern , or -1 if not
-	 *         found
-	 */
-	protected int regExpPosIn(String text, int start, int end, String p) {
-		int plen = p.length();
-
-		int max = end - plen;
-		for (int i = start; i <= max; ++i) {
-			if (regExpRegionMatches(text, i, p, 0, plen)) {
-				return i;
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * 
-	 * @return boolean
-	 * @param text
-	 *            a String to match
-	 * @param tStart
-	 *            indicates the starting index of match, inclusive
-	 * @param p
-	 *            a simple regular expression that may contain '?'
-	 * @param pStart
-	 * @param plen
-	 */
-	protected boolean regExpRegionMatches(String text, int tStart, String p,
-			int pStart, int plen) {
-		while (plen-- > 0) {
-			char tchar = text.charAt(tStart++);
-			char pchar = p.charAt(pStart++);
-
-			/* process wild cards */
-			if (!fIgnoreWildCards) {
-				/* skip single wild cards */
-				if (pchar == fSingleWildCard) {
-					continue;
-				}
-			}
-			if (pchar == tchar) {
-				continue;
-			}
-			if (fIgnoreCase) {
-				if (Character.toUpperCase(tchar) == Character
-						.toUpperCase(pchar)) {
-					continue;
-				}
-				// comparing after converting to upper case doesn't handle all
-				// cases;
-				// also compare after converting to lower case
-				if (Character.toLowerCase(tchar) == Character
-						.toLowerCase(pchar)) {
-					continue;
-				}
-			}
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * @param text
-	 *            the string to match
-	 * @param start
-	 *            the starting index in the text for search, inclusive
-	 * @param end
-	 *            the stopping point of search, exclusive
-	 * @param p
-	 *            a string that has no wildcard
-	 * @return the starting index in the text of the pattern , or -1 if not
-	 *         found
-	 */
-	protected int textPosIn(String text, int start, int end, String p) {
-
-		int plen = p.length();
-		int max = end - plen;
-
-		if (!fIgnoreCase) {
-			int i = text.indexOf(p, start);
-			if (i == -1 || i > max) {
-				return -1;
-			}
-			return i;
-		}
-
-		for (int i = start; i <= max; ++i) {
-			if (text.regionMatches(true, i, p, 0, plen)) {
-				return i;
-			}
-		}
-
-		return -1;
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/TextActionHandler.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/TextActionHandler.java
deleted file mode 100644
index 88d2a61..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/TextActionHandler.java
+++ /dev/null
@@ -1,538 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * Handles the redirection of the global Cut, Copy, Paste, and
- * Select All actions to either the current inline text control
- * or the part's supplied action handler.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p><p>
- * Example usage:
- * <pre>
- * textActionHandler = new TextActionHandler(this.getViewSite().getActionBars());
- * textActionHandler.addText((Text)textCellEditor1.getControl());
- * textActionHandler.addText((Text)textCellEditor2.getControl());
- * textActionHandler.setSelectAllAction(selectAllAction);
- * </pre>
- * </p>
- */
-public class TextActionHandler {
-    private DeleteActionHandler textDeleteAction = new DeleteActionHandler();
-
-    private CutActionHandler textCutAction = new CutActionHandler();
-
-    private CopyActionHandler textCopyAction = new CopyActionHandler();
-
-    private PasteActionHandler textPasteAction = new PasteActionHandler();
-
-    private SelectAllActionHandler textSelectAllAction = new SelectAllActionHandler();
-
-    private IAction deleteAction;
-
-    private IAction cutAction;
-
-    private IAction copyAction;
-
-    private IAction pasteAction;
-
-    private IAction selectAllAction;
-
-    private IPropertyChangeListener deleteActionListener = new PropertyChangeListener(
-            textDeleteAction);
-
-    private IPropertyChangeListener cutActionListener = new PropertyChangeListener(
-            textCutAction);
-
-    private IPropertyChangeListener copyActionListener = new PropertyChangeListener(
-            textCopyAction);
-
-    private IPropertyChangeListener pasteActionListener = new PropertyChangeListener(
-            textPasteAction);
-
-    private IPropertyChangeListener selectAllActionListener = new PropertyChangeListener(
-            textSelectAllAction);
-
-    private Listener textControlListener = new TextControlListener();
-
-    private Text activeTextControl;
-
-    private MouseAdapter mouseAdapter = new MouseAdapter() {
-        public void mouseUp(MouseEvent e) {
-            updateActionsEnableState();
-        }
-    };
-
-    private KeyAdapter keyAdapter = new KeyAdapter() {
-        public void keyReleased(KeyEvent e) {
-            updateActionsEnableState();
-        }
-    };
-
-    private class TextControlListener implements Listener {
-        public void handleEvent(Event event) {
-            switch (event.type) {
-            case SWT.Activate:
-                activeTextControl = (Text) event.widget;
-                updateActionsEnableState();
-                break;
-            case SWT.Deactivate:
-                activeTextControl = null;
-                updateActionsEnableState();
-                break;
-            default:
-                break;
-            }
-        }
-    }
-
-    private class PropertyChangeListener implements IPropertyChangeListener {
-        private IAction actionHandler;
-
-        protected PropertyChangeListener(IAction actionHandler) {
-            super();
-            this.actionHandler = actionHandler;
-        }
-
-        public void propertyChange(PropertyChangeEvent event) {
-            if (activeTextControl != null) {
-				return;
-			}
-            if (event.getProperty().equals(IAction.ENABLED)) {
-                Boolean bool = (Boolean) event.getNewValue();
-                actionHandler.setEnabled(bool.booleanValue());
-            }
-        }
-    }
-
-    private class DeleteActionHandler extends Action {
-        protected DeleteActionHandler() {
-            super(CommonNavigatorMessages.Delete);
-            setId("TextDeleteActionHandler");//$NON-NLS-1$
-            setEnabled(false);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-            		INavigatorHelpContextIds.TEXT_DELETE_ACTION);
-        }
-
-        public void runWithEvent(Event event) {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                activeTextControl.clearSelection();
-                return;
-            }
-            if (deleteAction != null) {
-                deleteAction.runWithEvent(event);
-                return;
-            }
-        }
-
-        /**
-         * Update state.
-         */
-        public void updateEnabledState() {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                setEnabled(activeTextControl.getSelectionCount() > 0
-                        || activeTextControl.getCaretPosition() < activeTextControl
-                                .getCharCount());
-                return;
-            }
-            if (deleteAction != null) {
-                setEnabled(deleteAction.isEnabled());
-                return;
-            }
-            setEnabled(false);
-        }
-    }
-
-    private class CutActionHandler extends Action {
-        protected CutActionHandler() {
-            super(CommonNavigatorMessages.Cut);
-            setId("TextCutActionHandler");//$NON-NLS-1$
-            setEnabled(false);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-            		INavigatorHelpContextIds.TEXT_CUT_ACTION);
-        }
-
-        public void runWithEvent(Event event) {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                activeTextControl.cut();
-                return;
-            }
-            if (cutAction != null) {
-                cutAction.runWithEvent(event);
-                return;
-            }
-        }
-
-        /**
-         * Update state.
-         */
-        public void updateEnabledState() {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                setEnabled(activeTextControl.getSelectionCount() > 0);
-                return;
-            }
-            if (cutAction != null) {
-                setEnabled(cutAction.isEnabled());
-                return;
-            }
-            setEnabled(false);
-        }
-    }
-
-    private class CopyActionHandler extends Action {
-        protected CopyActionHandler() {
-            super(CommonNavigatorMessages.Copy);
-            setId("TextCopyActionHandler");//$NON-NLS-1$
-            setEnabled(false);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-            		INavigatorHelpContextIds.TEXT_COPY_ACTION);
-        }
-
-        public void runWithEvent(Event event) {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                activeTextControl.copy();
-                return;
-            }
-            if (copyAction != null) {
-                copyAction.runWithEvent(event);
-                return;
-            }
-        }
-
-        /**
-         * Update the state.
-         */
-        public void updateEnabledState() {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                setEnabled(activeTextControl.getSelectionCount() > 0);
-                return;
-            }
-            if (copyAction != null) {
-                setEnabled(copyAction.isEnabled());
-                return;
-            }
-            setEnabled(false);
-        }
-    }
-
-    private class PasteActionHandler extends Action {
-        protected PasteActionHandler() {
-            super(CommonNavigatorMessages.Paste);
-            setId("TextPasteActionHandler");//$NON-NLS-1$
-            setEnabled(false);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-            		INavigatorHelpContextIds.TEXT_PASTE_ACTION);
-        }
-
-        public void runWithEvent(Event event) {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                activeTextControl.paste();
-                return;
-            }
-            if (pasteAction != null) {
-                pasteAction.runWithEvent(event);
-                return;
-            }
-        }
-
-        /**
-         * Update the state
-         */
-        public void updateEnabledState() {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                setEnabled(true);
-                return;
-            }
-            if (pasteAction != null) {
-                setEnabled(pasteAction.isEnabled());
-                return;
-            }
-            setEnabled(false);
-        }
-    }
-
-    private class SelectAllActionHandler extends Action {
-        protected SelectAllActionHandler() {
-            super(CommonNavigatorMessages.TextAction_selectAll);
-            setId("TextSelectAllActionHandler");//$NON-NLS-1$
-            setEnabled(false);
-            PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-					INavigatorHelpContextIds.TEXT_SELECT_ALL_ACTION);
-        }
-
-        public void runWithEvent(Event event) {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                activeTextControl.selectAll();
-                return;
-            }
-            if (selectAllAction != null) {
-                selectAllAction.runWithEvent(event);
-                return;
-            }
-        }
-
-        /**
-         * Update the state.
-         */
-        public void updateEnabledState() {
-            if (activeTextControl != null && !activeTextControl.isDisposed()) {
-                setEnabled(true);
-                return;
-            }
-            if (selectAllAction != null) {
-                setEnabled(selectAllAction.isEnabled());
-                return;
-            }
-            setEnabled(false);
-        }
-    }
-
-    /**
-     * Creates a <code>Text</code> control action handler
-     * for the global Cut, Copy, Paste, Delete, and Select All 
-     * of the action bar.
-     *
-     * @param actionBar the action bar to register global
-     *    action handlers for Cut, Copy, Paste, Delete, 
-     * 	  and Select All
-     */
-    public TextActionHandler(IActionBars actionBar) {
-        super();
-        actionBar.setGlobalActionHandler(ActionFactory.CUT.getId(),
-                textCutAction);
-        actionBar.setGlobalActionHandler(ActionFactory.COPY.getId(),
-                textCopyAction);
-        actionBar.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-                textPasteAction);
-        actionBar.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
-                textSelectAllAction);
-        actionBar.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-                textDeleteAction);
-    }
-
-    /**
-     * Add a <code>Text</code> control to the handler
-     * so that the Cut, Copy, Paste, Delete, and Select All 
-     * actions are redirected to it when active.
-     *
-     * @param textControl the inline <code>Text</code> control
-     */
-    public void addText(Text textControl) {
-        if (textControl == null) {
-			return;
-		}
-
-        activeTextControl = textControl;
-        textControl.addListener(SWT.Activate, textControlListener);
-        textControl.addListener(SWT.Deactivate, textControlListener);
-
-        // We really want a selection listener but it is not supported so we
-        // use a key listener and a mouse listener to know when selection changes
-        // may have occured
-        textControl.addKeyListener(keyAdapter);
-        textControl.addMouseListener(mouseAdapter);
-
-    }
-
-    /**
-     * Dispose of this action handler
-     */
-    public void dispose() {
-        setCutAction(null);
-        setCopyAction(null);
-        setPasteAction(null);
-        setSelectAllAction(null);
-        setDeleteAction(null);
-    }
-
-    /**
-     * Removes a <code>Text</code> control from the handler
-     * so that the Cut, Copy, Paste, Delete, and Select All 
-     * actions are no longer redirected to it when active.
-     *
-     * @param textControl the inline <code>Text</code> control
-     */
-    public void removeText(Text textControl) {
-        if (textControl == null) {
-			return;
-		}
-
-        textControl.removeListener(SWT.Activate, textControlListener);
-        textControl.removeListener(SWT.Deactivate, textControlListener);
-
-        textControl.removeMouseListener(mouseAdapter);
-        textControl.removeKeyListener(keyAdapter);
-
-        activeTextControl = null;
-        updateActionsEnableState();
-    }
-
-    /**
-     * Set the default <code>IAction</code> handler for the Copy
-     * action. This <code>IAction</code> is run only if no active
-     * inline text control.
-     *
-     * @param action the <code>IAction</code> to run for the
-     *    Copy action, or <code>null</code> if not interested.
-     */
-    public void setCopyAction(IAction action) {
-        if (copyAction == action) {
-			return;
-		}
-
-        if (copyAction != null) {
-			copyAction.removePropertyChangeListener(copyActionListener);
-		}
-
-        copyAction = action;
-
-        if (copyAction != null) {
-			copyAction.addPropertyChangeListener(copyActionListener);
-		}
-
-        textCopyAction.updateEnabledState();
-    }
-
-    /**
-     * Set the default <code>IAction</code> handler for the Cut
-     * action. This <code>IAction</code> is run only if no active
-     * inline text control.
-     *
-     * @param action the <code>IAction</code> to run for the
-     *    Cut action, or <code>null</code> if not interested.
-     */
-    public void setCutAction(IAction action) {
-        if (cutAction == action) {
-			return;
-		}
-
-        if (cutAction != null) {
-			cutAction.removePropertyChangeListener(cutActionListener);
-		}
-
-        cutAction = action;
-
-        if (cutAction != null) {
-			cutAction.addPropertyChangeListener(cutActionListener);
-		}
-
-        textCutAction.updateEnabledState();
-    }
-
-    /**
-     * Set the default <code>IAction</code> handler for the Paste
-     * action. This <code>IAction</code> is run only if no active
-     * inline text control.
-     *
-     * @param action the <code>IAction</code> to run for the
-     *    Paste action, or <code>null</code> if not interested.
-     */
-    public void setPasteAction(IAction action) {
-        if (pasteAction == action) {
-			return;
-		}
-
-        if (pasteAction != null) {
-			pasteAction.removePropertyChangeListener(pasteActionListener);
-		}
-
-        pasteAction = action;
-
-        if (pasteAction != null) {
-			pasteAction.addPropertyChangeListener(pasteActionListener);
-		}
-
-        textPasteAction.updateEnabledState();
-    }
-
-    /**
-     * Set the default <code>IAction</code> handler for the Select All
-     * action. This <code>IAction</code> is run only if no active
-     * inline text control.
-     *
-     * @param action the <code>IAction</code> to run for the
-     *    Select All action, or <code>null</code> if not interested.
-     */
-    public void setSelectAllAction(IAction action) {
-        if (selectAllAction == action) {
-			return;
-		}
-
-        if (selectAllAction != null) {
-			selectAllAction
-                    .removePropertyChangeListener(selectAllActionListener);
-		}
-
-        selectAllAction = action;
-
-        if (selectAllAction != null) {
-			selectAllAction.addPropertyChangeListener(selectAllActionListener);
-		}
-
-        textSelectAllAction.updateEnabledState();
-    }
-
-    /**
-     * Set the default <code>IAction</code> handler for the Delete
-     * action. This <code>IAction</code> is run only if no active
-     * inline text control.
-     *
-     * @param action the <code>IAction</code> to run for the
-     *    Delete action, or <code>null</code> if not interested.
-     */
-    public void setDeleteAction(IAction action) {
-        if (deleteAction == action) {
-			return;
-		}
-
-        if (deleteAction != null) {
-			deleteAction.removePropertyChangeListener(deleteActionListener);
-		}
-
-        deleteAction = action;
-
-        if (deleteAction != null) {
-			deleteAction.addPropertyChangeListener(deleteActionListener);
-		}
-
-        textDeleteAction.updateEnabledState();
-    }
-
-    /**
-     * Update the enable state of the Cut, Copy,
-     * Paste, Delete, and Select All action handlers
-     */
-    private void updateActionsEnableState() {
-        textCutAction.updateEnabledState();
-        textCopyAction.updateEnabledState();
-        textPasteAction.updateEnabledState();
-        textSelectAllAction.updateEnabledState();
-        textDeleteAction.updateEnabledState();
-    }
-}
-
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/VisibilityAssistant.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/VisibilityAssistant.java
deleted file mode 100644
index dc0446f..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/VisibilityAssistant.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.ui.navigator.IExtensionActivationListener;
-import org.eclipse.ui.navigator.INavigatorActivationService;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentService;
-import org.eclipse.ui.navigator.INavigatorViewerDescriptor;
-
-/**
- * Stores information about programmatic bindings and activation settings.
- * 
- */
-public class VisibilityAssistant implements IExtensionActivationListener {
-
-	private final INavigatorViewerDescriptor viewerDescriptor;
-
-	private final Set programmaticVisibilityBindings = new HashSet();
-
-	private final Set programmaticRootBindings = new HashSet();
-
-	private final ListenerList listeners = new ListenerList();
-
-	private final INavigatorActivationService activationService;
-
-	/**
-	 * Notifies clients of changes in extension visibility or activation.
-	 * 
-	 */
-	public interface VisibilityListener {
-
-		/**
-		 * Respond to the change in visibility or activation.
-		 * 
-		 */
-		void onVisibilityOrActivationChange();
-	}
-
-	/**
-	 * Create a visibility assistant for the given viewer descriptor.
-	 * 
-	 * @param aViewerDescriptor
-	 *            A non-nullviewer descriptor.
-	 * @param anActivationService
-	 *            The activation service associated with the content service.
-	 */
-	public VisibilityAssistant(INavigatorViewerDescriptor aViewerDescriptor,
-			INavigatorActivationService anActivationService) {
-		Assert.isNotNull(aViewerDescriptor);
-		viewerDescriptor = aViewerDescriptor;
-
-		activationService = anActivationService;
-		activationService.addExtensionActivationListener(this);
-	}
-
-	/**
-	 * Dispose of any resources held onto by this assistant.
-	 * 
-	 */
-	public void dispose() {
-		activationService.removeExtensionActivationListener(this);
-	}
-
-	/**
-	 * 
-	 * @param theExtensions
-	 *            The extensions that should be made visible to the viewer.
-	 * @param isRoot
-	 */
-	public void bindExtensions(String[] theExtensions, boolean isRoot) {
-		if (theExtensions == null) {
-			return;
-		}
-		for (int i = 0; i < theExtensions.length; i++) {
-			programmaticVisibilityBindings.add(theExtensions[i]);
-			if (isRoot) {
-				programmaticRootBindings.add(theExtensions[i]);
-			}
-		}
-		notifyClients();
-	}
-
-	/**
-	 * Add a listener to be notified when the visibility or activation state
-	 * associated with this assistant changes.
-	 * 
-	 * @param aListener
-	 *            a listener to be notified when the visibility or activation
-	 *            state associated with this assistant changes.
-	 */
-	public void addListener(VisibilityListener aListener) {
-		listeners.add(aListener);
-	}
-
-	/**
-	 * Remove a listener to be notified when the visibility or activation state
-	 * associated with this assistant changes.
-	 * 
-	 * @param aListener
-	 *            a listener to be notified when the visibility or activation
-	 *            state associated with this assistant changes.
-	 */
-	public void removeListener(VisibilityListener aListener) {
-		listeners.remove(aListener);
-	}
-
-	private void notifyClients() {
-		Object[] clients = listeners.getListeners();
-		for (int i = 0; i < clients.length; i++) {
-			((VisibilityListener) clients[i]).onVisibilityOrActivationChange();
-		}
-	}
-
-	/**
-	 * 
-	 * @param aContentDescriptor
-	 *            The content descriptor of inquiry
-	 * @return True if and only if the content descriptor is <i>active</i> and
-	 *         <i>visible</i> for the viewer descriptor and enabled for the
-	 *         given element.
-	 */
-	public boolean isVisibleAndActive(
-			INavigatorContentDescriptor aContentDescriptor) {
-		return isActive(aContentDescriptor) && isVisible(aContentDescriptor);
-	}
-
-	/**
-	 * 
-	 * @param aContentDescriptor
-	 *            The content descriptor of inquiry
-	 * @return True if and only if the given extension is <i>active</i>
-	 * 
-	 * @see INavigatorContentService For more information on what <i>active</i>
-	 *      means.
-	 * @see INavigatorActivationService#activateExtensions(String[], boolean)
-	 * @see INavigatorActivationService#deactivateExtensions(String[], boolean)
-	 */
-	public boolean isActive(INavigatorContentDescriptor aContentDescriptor) {
-		return activationService.isNavigatorExtensionActive(aContentDescriptor
-				.getId());
-	}
-
-	/**
-	 * 
-	 * @param aContentExtensionId
-	 *            The unique id of the content extension
-	 * @return True if and only if the given extension is <i>active</i>
-	 * @see INavigatorContentService For more information on what <i>active</i>
-	 *      means.
-	 * @see INavigatorActivationService#activateExtensions(String[], boolean)
-	 * @see INavigatorActivationService#deactivateExtensions(String[], boolean)
-	 */
-	public boolean isActive(String aContentExtensionId) {
-		return activationService
-				.isNavigatorExtensionActive(aContentExtensionId);
-	}
-
-	/**
-	 * 
-	 * @param aContentDescriptor
-	 *            The content descriptor of inquiry
-	 * @return True if and only if the given content extension is declaratively
-	 *         or programmatically made visible to the viewer.
-	 * @see INavigatorContentService#bindExtensions(String[], boolean) For more
-	 *      information on what <i>visible</i> means.
-	 */
-	public boolean isVisible(INavigatorContentDescriptor aContentDescriptor) {
-		return programmaticVisibilityBindings.contains(aContentDescriptor
-				.getId())
-				|| viewerDescriptor
-						.isVisibleContentExtension(aContentDescriptor.getId());
-	}
-
-	/**
-	 * 
-	 * @param aContentExtensionId
-	 *            The unique id of the content extension
-	 * @return True if and only if the given content extension is declaratively
-	 *         or programmatically made visible to the viewer.
-	 * @see INavigatorContentService#bindExtensions(String[], boolean) For more
-	 *      information on what <i>visible</i> means.
-	 */
-	public boolean isVisible(String aContentExtensionId) {
-		return programmaticVisibilityBindings.contains(aContentExtensionId)
-				|| viewerDescriptor
-						.isVisibleContentExtension(aContentExtensionId);
-	}
-
-	/**
-	 * Return whether the given content extension is a root extension.
-	 * 
-	 * @param aContentExtensionId
-	 *            the id of the content extension.
-	 * @return whether the given content extension is a root extension
-	 */
-	public boolean isRootExtension(String aContentExtensionId) {
-		return programmaticRootBindings.contains(aContentExtensionId)
-				|| viewerDescriptor.isRootExtension(aContentExtensionId);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.IExtensionActivationListener#onExtensionActivation(java.lang.String,
-	 *      java.lang.String[], boolean)
-	 */
-	public void onExtensionActivation(String aViewerId,
-			String[] theNavigatorExtensionIds, boolean isActive) {
-		if (aViewerId.equals(viewerDescriptor.getViewerId())) {
-			notifyClients();
-		}
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/actions/CollapseAllAction.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/actions/CollapseAllAction.java
deleted file mode 100644
index 17e9a71..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/actions/CollapseAllAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.handlers.CollapseAllHandler;
-import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
-import org.eclipse.ui.navigator.CommonViewer;
-
-/**
- * This action delegate collapses all expanded elements in a Navigator view.
- * 
- */
-public class CollapseAllAction extends Action {
-
-	private final CommonViewer commonViewer;
-
-	/**
-	 * Create the CollapseAll action.
-	 * 
-	 * @param aViewer
-	 *            The viewer to be collapsed.
-	 */
-	public CollapseAllAction(CommonViewer aViewer) {
-		super(CommonNavigatorMessages.CollapseAllActionDelegate_0);
-		setToolTipText(CommonNavigatorMessages.CollapseAllActionDelegate_0);
-		setActionDefinitionId(CollapseAllHandler.COMMAND_ID);
-		commonViewer = aViewer;
-	}
-
-	public void run() {
-		if (commonViewer != null) {
-			commonViewer.collapseAll();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/actions/CommonActionDescriptorManager.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/actions/CommonActionDescriptorManager.java
deleted file mode 100644
index e3a1956..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/actions/CommonActionDescriptorManager.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentRegistryReader;
-import org.eclipse.ui.navigator.INavigatorContentService;
-import org.eclipse.ui.navigator.Priority;
-
-/**
- * Manages descriptors consumed from the 'actionProvider' elements of the
- * <b>org.eclipse.ui.navigator.navigatorContent</b> extension point.
- * 
- * @since 3.2
- * 
- */
-public class CommonActionDescriptorManager {
-
-	private static final CommonActionProviderDescriptor[] NO_DESCRIPTORS = new CommonActionProviderDescriptor[0];
-
-	private static final CommonActionDescriptorManager INSTANCE = new CommonActionDescriptorManager();
-
-	private CommonActionDescriptorManager() {
-
-		new ActionProviderRegistry().readRegistry();
-	}
-
-	/**
-	 * @return the singleton instance of the registry
-	 */
-	public static CommonActionDescriptorManager getInstance() {
-		return INSTANCE;
-	}
-
-	/* Provides a map of (ids, CommonActionProviderDescriptor)-pairs. */
-	private final Map dependentDescriptors = new LinkedHashMap();
-
-	/* Provides a map of (ids, CommonActionProviderDescriptor)-pairs. */
-	private final Set overridingDescriptors = new LinkedHashSet();
-
-	/* Provides a map of (ids, CommonActionProviderDescriptor)-pairs. */
-	private final Map rootDescriptors = new LinkedHashMap();
-
-	/**
-	 * 
-	 * @param aDescriptor
-	 *            A valid descriptor to begin managing.
-	 */
-	protected void addActionDescriptor(
-			CommonActionProviderDescriptor aDescriptor) {
-
-		if (aDescriptor.getDependsOnId() == null) {
-			rootDescriptors.put(aDescriptor.getDefinedId(), aDescriptor);
-		} else {
-			dependentDescriptors.put(aDescriptor.getDefinedId(), aDescriptor);
-		}
-
-		if (aDescriptor.getOverridesId() != null) {
-			overridingDescriptors.add(aDescriptor);
-		}
-	}
-
-	/**
-	 * Orders the set of availabe descriptors based on the order defined by the
-	 * <i>dependsOn</i> attribute from the <actionProvider /> element in
-	 * <b>org.eclipse.ui.navigator.navigatorContent</b>
-	 * 
-	 */
-	protected void computeOrdering() {
-		CommonActionProviderDescriptor dependentDescriptor;
-		CommonActionProviderDescriptor requiredDescriptor;
-
-		CommonActionProviderDescriptor descriptor;
-		CommonActionProviderDescriptor overriddenDescriptor;
-		for (Iterator iter = overridingDescriptors.iterator(); iter.hasNext();) {
-			descriptor = (CommonActionProviderDescriptor) iter.next();
-			if (rootDescriptors.containsKey(descriptor.getOverridesId())) {
-				overriddenDescriptor = (CommonActionProviderDescriptor) rootDescriptors
-						.get(descriptor.getOverridesId());
-				overriddenDescriptor.addOverridingDescriptor(descriptor);
-			} else if (dependentDescriptors.containsKey(descriptor
-					.getOverridesId())) {
-				overriddenDescriptor = (CommonActionProviderDescriptor) dependentDescriptors
-						.get(descriptor.getOverridesId());
-				overriddenDescriptor.addOverridingDescriptor(descriptor);
-			}
-
-		}
-
-		Collection unresolvedDependentDescriptors = new ArrayList(
-				dependentDescriptors.values());
-
-		for (Iterator iter = dependentDescriptors.values().iterator(); iter
-				.hasNext();) {
-			dependentDescriptor = (CommonActionProviderDescriptor) iter.next();
-			requiredDescriptor = (CommonActionProviderDescriptor) rootDescriptors
-					.get(dependentDescriptor.getDependsOnId());
-			if (requiredDescriptor == null) {
-				requiredDescriptor = (CommonActionProviderDescriptor) dependentDescriptors
-						.get(dependentDescriptor.getDependsOnId());
-			}
-			if (requiredDescriptor != null) {
-				requiredDescriptor.addDependentDescriptor(dependentDescriptor);
-				unresolvedDependentDescriptors.remove(dependentDescriptor);
-			}
-
-		}
-
-		dependentDescriptors.clear();
-
-		if (!unresolvedDependentDescriptors.isEmpty()) {
-			StringBuffer errorMessage = new StringBuffer(
-					"There were unresolved dependencies for action provider extensions to a Common Navigator.\n" + //$NON-NLS-1$
-							"Verify that the \"dependsOn\" attribute for each <actionProvider /> element is valid."); //$NON-NLS-1$
-
-			CommonActionProviderDescriptor[] unresolvedDescriptors = (CommonActionProviderDescriptor[]) unresolvedDependentDescriptors
-					.toArray(new CommonActionProviderDescriptor[unresolvedDependentDescriptors
-							.size()]);
-			for (int i = 0; i < unresolvedDescriptors.length; i++) {
-				errorMessage
-						.append(
-								"\nUnresolved dependency specified for actionProvider: ").append(unresolvedDescriptors[i].getDefinedId()); //$NON-NLS-1$
-			}
-
-			NavigatorPlugin.log(IStatus.WARNING, 0, errorMessage.toString(),
-					null);
-
-		}
-		unresolvedDependentDescriptors.clear();
-
-	}
-
-	/**
-	 * 
-	 * @param aContentService
-	 *            The content service to use when filtering action providers;
-	 *            only action providers bound directly or indirectly will be
-	 *            returned.
-	 * @param aContext
-	 *            The action context that contains a valid selection.
-	 * @return An array of visible, active, and enabled CommonActionProviders.
-	 *         See <b>org.eclipse.ui.navigator.navigatorContent</b> for the
-	 *         details of what each of these adjectives implies.
-	 */
-	public CommonActionProviderDescriptor[] findRelevantActionDescriptors(
-			INavigatorContentService aContentService, ActionContext aContext) {
-		Assert.isNotNull(aContext);
-		IStructuredSelection structuredSelection = null;
-		if (aContext.getSelection() instanceof IStructuredSelection) {
-			structuredSelection = (IStructuredSelection) aContext
-					.getSelection();
-		} else {
-			structuredSelection = StructuredSelection.EMPTY;
-		}
-
-		Set blockedProviders = new HashSet();
-		CommonActionProviderDescriptor actionDescriptor = null;
-		Set providers = new LinkedHashSet();
-		for (Iterator providerItr = rootDescriptors.values().iterator(); providerItr
-				.hasNext();) {
-			actionDescriptor = (CommonActionProviderDescriptor) providerItr
-					.next();
-			addProviderIfRelevant(aContentService, structuredSelection,
-					actionDescriptor, providers, blockedProviders);
-		}
-		if (providers.size() > 0) {
-			providers.removeAll(blockedProviders);
-			return (CommonActionProviderDescriptor[]) providers
-					.toArray(new CommonActionProviderDescriptor[providers
-							.size()]);
-		}
-		return NO_DESCRIPTORS;
-	}
-
-	/**
-	 * @param aContentService
-	 * @param structuredSelection
-	 * @param actionDescriptor
-	 * @param providers
-	 */
-	private boolean addProviderIfRelevant(
-			INavigatorContentService aContentService,
-			IStructuredSelection structuredSelection,
-			CommonActionProviderDescriptor actionDescriptor, Set providers, Set blockedProviders) {
-		if (isVisible(aContentService, actionDescriptor)
-				&& actionDescriptor.isEnabledFor(structuredSelection)) {
-			
-			if(actionDescriptor.hasOverridingDescriptors()) {
-				for (Iterator iter = actionDescriptor.overridingDescriptors(); iter.hasNext();) {
-					CommonActionProviderDescriptor descriptor = (CommonActionProviderDescriptor) iter.next();
-					if(addProviderIfRelevant(aContentService, structuredSelection, descriptor, providers, blockedProviders)) {
-						while(iter.hasNext())
-							blockedProviders.add(iter.next());
-						return true;
-					}
-					
-				}
-			}			
-			providers.add(actionDescriptor);
-			if (actionDescriptor.hasDependentDescriptors()) {
-				for (Iterator iter = actionDescriptor.dependentDescriptors(); iter
-						.hasNext();) {
-					addProviderIfRelevant(aContentService, structuredSelection,
-							(CommonActionProviderDescriptor) iter.next(),
-							providers, blockedProviders);
-				}
-			}
-			return true;
-		}
-		return false;
-	}
-
-	private boolean isVisible(INavigatorContentService aContentService,
-			CommonActionProviderDescriptor descriptor) {
-		if (descriptor.isNested()) {
-			return aContentService.isActive(descriptor.getId())
-					&& aContentService.isVisible(descriptor.getId());
-		}
-		return aContentService.getViewerDescriptor().isVisibleActionExtension(
-				descriptor.getId());
-	}
-
-	private class ActionProviderRegistry extends NavigatorContentRegistryReader {
-
-		public void readRegistry() {
-			super.readRegistry();
-			computeOrdering();
-		}
-
-		protected boolean readElement(IConfigurationElement anElement) {
-			if (TAG_ACTION_PROVIDER.equals(anElement.getName())) {
-				addActionDescriptor(new CommonActionProviderDescriptor(
-						anElement));
-				return true;
-			} else if (TAG_NAVIGATOR_CONTENT.equals(anElement.getName())) {
-				
-				IConfigurationElement[] actionProviders = anElement.getChildren(TAG_ACTION_PROVIDER);
-				
-				if (actionProviders.length > 0) {
-					
-					IConfigurationElement defaultEnablement = null;
-					IConfigurationElement[] inheritedEnablement = anElement.getChildren(TAG_ENABLEMENT);
-					if (inheritedEnablement.length == 0) {
-						inheritedEnablement = anElement.getChildren(TAG_POSSIBLE_CHILDREN);
-					}
-					
-					defaultEnablement = inheritedEnablement.length == 1 ? inheritedEnablement[0] : null;
-  
-					Priority defaultPriority = Priority.get(anElement.getAttribute(ATT_PRIORITY));
-					
-					
-					if(defaultEnablement == null) {
-						NavigatorPlugin.logError(0, 
-							"An actionProvider has been defined as the child " + //$NON-NLS-1$
-							"of a navigatorContent extension that does not specify " + //$NON-NLS-1$
-							"an <enablement/> or <possibleChildren /> expression. Please " + //$NON-NLS-1$
-							"review the documentation and correct this error.", null); //$NON-NLS-1$
-					}
-					for (int i = 0; i < actionProviders.length; i++) { 
-						if(defaultEnablement == null) { 
-							NavigatorPlugin.logError(0, 
-											"Disabling actionProvider: " + actionProviders[i].getAttribute(ATT_ID), null); //$NON-NLS-1$
-						} else {
-							SafeRunner.run(new AddProviderSafeRunner(actionProviders[i], defaultEnablement, defaultPriority, anElement));
-						}
-					}
-				}
-				return true;
-			}
-			return super.readElement(anElement);
-		}
-	
-		private class AddProviderSafeRunner implements ISafeRunnable {
-			
-			private IConfigurationElement parentElement;
-			private IConfigurationElement defaultEnablement;
-			private IConfigurationElement actionProvider;
-			private Priority defaultPriority;
-
-			protected AddProviderSafeRunner(IConfigurationElement actionProvider, 
-											 IConfigurationElement defaultEnablement, 
-											 Priority defaultPriority,
-											 IConfigurationElement parentElement) {
-				this.actionProvider = actionProvider;
-				this.defaultEnablement = defaultEnablement;
-				this.defaultPriority = defaultPriority;
-				this.parentElement = parentElement;
-			}
-			
-			/* (non-Javadoc)
-			 * @see org.eclipse.core.runtime.ISafeRunnable#run()
-			 */
-			public void run() throws Exception { 
-				addActionDescriptor(new CommonActionProviderDescriptor(
-							actionProvider, defaultEnablement, defaultPriority, parentElement
-									.getAttribute(ATT_ID), true));
-			}
-			
-			/* (non-Javadoc)
-			 * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
-			 */
-			public void handleException(Throwable t) {
-				NavigatorPlugin.logError(0, "Recovering from error while parsing actionProviders.", t); //$NON-NLS-1$ 
-			}
-			
-			
-		}
-	}
-
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/actions/CommonActionProviderDescriptor.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/actions/CommonActionProviderDescriptor.java
deleted file mode 100644
index 7afe5ef..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/actions/CommonActionProviderDescriptor.java
+++ /dev/null
@@ -1,448 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.actions;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.Set;
-import java.util.TreeSet;
-
-import org.eclipse.core.expressions.ElementHandler;
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionConverter;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.internal.navigator.CustomAndExpression;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtPtConstants;
-import org.eclipse.ui.internal.navigator.extensions.SkeletonActionProvider;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.Priority;
-
-/**
- *  
- * 
- * @since 3.2
- */
-public class CommonActionProviderDescriptor implements
-		INavigatorContentExtPtConstants {
-
-	private static final String DEFAULT_ID = "org.eclipse.ui.navigator.actionProvider"; //$NON-NLS-1$
-	
-	private static int count = 0;
-
-	private final IConfigurationElement configurationElement;
-
-	private final boolean isNested;
-
-	private Set dependentDescriptors;
-
-	private Set overridingDescriptors;
-
-	private IConfigurationElement enablementElement;
-
-	private Expression enablement;
-
-	private boolean hasLoadingFailed;
-
-	private String definedId;
-
-	private String visibilityId;
-
-	private String dependsOnId;
-
-	private String overridesId;
-
-	private String toString;
-
-	private Priority priority;
-
-	/**
-	 * @param aConfigElement
-	 *            A configuration element with the name "actionProvider" and a
-	 *            "class" attribute which subclasses
-	 *            {@link CommonActionProvider}.
-	 */
-	public CommonActionProviderDescriptor(IConfigurationElement aConfigElement) {
-		super();
-		Assert.isTrue(TAG_ACTION_PROVIDER.equals(aConfigElement.getName()));
-		configurationElement = aConfigElement;
-		isNested = false;
-		init();
-	}
-
-	/**
-	 * @param aConfigElement
-	 *            A configuration element with the name "actionProvider" and a
-	 *            "class" attribute which subclasses
-	 *            {@link CommonActionProvider}.
-	 * @param anEnablementExpression
-	 *            A configuration element with the name 'enablement' or
-	 *            'triggerPoints' and containing an Eclipse Core Expression
-	 * @param defaultPriority 
-	 * @param anOverrideId
-	 *            A unique identifier for this descriptor. Ids can be used as a
-	 *            filtering device for activities or viewer***Bindings.
-	 * @param nestedUnderNavigatorContent
-	 *            A value of <b>true</b> indicates that this
-	 *            CommonActionProvider was declared as a nested
-	 *            &lt;actionProvider /&gt; element under a &lt;navigatorContent
-	 *            /&gt; element.
-	 */
-	public CommonActionProviderDescriptor(IConfigurationElement aConfigElement,
-			IConfigurationElement anEnablementExpression, Priority defaultPriority, String anOverrideId,
-			boolean nestedUnderNavigatorContent) {
-		super();
-		Assert.isTrue(TAG_ACTION_PROVIDER.equals(aConfigElement.getName()));
-		Assert.isTrue(TAG_POSSIBLE_CHILDREN.equals(anEnablementExpression
-				.getName())
-				|| TAG_ENABLEMENT.equals(anEnablementExpression.getName()));
-		configurationElement = aConfigElement;
-		enablementElement = anEnablementExpression;
-		visibilityId = anOverrideId;
-		isNested = nestedUnderNavigatorContent;
-		priority = defaultPriority;
-		init();
-	}
-
-	private void init() {
-
-		try {
-
-			definedId = configurationElement.getAttribute(ATT_ID);
-
-			// if there was no id attribute, use the default id.
-			if (definedId == null) {
-				definedId = DEFAULT_ID + "." + count++; //$NON-NLS-1$
-			}
-
-			// we try the id attribute if no override id was supplied.
-			if (visibilityId == null) {
-				visibilityId = definedId;
-			}
-
-			dependsOnId = configurationElement.getAttribute(ATT_DEPENDS_ON);
-
-			overridesId = configurationElement.getAttribute(ATT_OVERRIDES);
-			
-			if(priority == null) {
-				String prio = configurationElement.getAttribute(ATT_PRIORITY);
-				if(prio != null)
-					priority = Priority.get(prio);
-				else
-					priority = Priority.NORMAL;
-			}
-
-			IConfigurationElement[] children = configurationElement
-					.getChildren(TAG_ENABLEMENT);
-			// if no child enablement is specified, and we have an override, use
-			// it
-			if (children.length == 0 && enablementElement != null) {
-				enablement = new CustomAndExpression(enablementElement);
-				// otherwise the child enablement takes priority
-			} else if (children.length == 1) {
-				enablement = ElementHandler.getDefault().create(
-						ExpressionConverter.getDefault(), children[0]);
-
-			} else {
-				System.err.println("Incorrect number of expressions: " + //$NON-NLS-1$
-						TAG_ENABLEMENT
-						+ " in navigator extension: " + //$NON-NLS-1$
-						configurationElement.getDeclaringExtension()
-								.getUniqueIdentifier() + " in plugin " + //$NON-NLS-1$ 
-								configurationElement.getDeclaringExtension().getNamespaceIdentifier());
-			}
-		} catch (CoreException e) {
-			NavigatorPlugin.log(IStatus.ERROR, 0, e.getMessage(), e);
-		}
-	}
-
-	/**
-	 * 
-	 * @return The instantiated CommonActionProvider for this descriptor as
-	 *         declared in the ATT_CLASS attribute or
-	 *         {@link SkeletonActionProvider} if a problem occurs while loading
-	 *         the instance.
-	 */
-	public CommonActionProvider createActionProvider() {
-		if (hasLoadingFailed) {
-			return SkeletonActionProvider.INSTANCE;
-		}
-		CommonActionProvider provider = null;
-		try {
-			provider = (CommonActionProvider) configurationElement
-					.createExecutableExtension(ATT_CLASS);
-		} catch (CoreException exception) {
-			NavigatorPlugin.log(exception.getStatus());
-			hasLoadingFailed = true;
-			provider = SkeletonActionProvider.INSTANCE;
-		} catch (Exception e) {
-			NavigatorPlugin.log(new Status(IStatus.ERROR,
-					NavigatorPlugin.PLUGIN_ID, 0, e.getMessage(), e));
-			hasLoadingFailed = true;
-			provider = SkeletonActionProvider.INSTANCE;
-		}
-
-		return provider;
-	}
-
-	/**
-	 * Determine if this content extension is enabled for the given selection.
-	 * The content extension is enabled for the selection if and only if it is
-	 * enabled for each element in the selection.
-	 * 
-	 * @param aStructuredSelection
-	 *            The selection from the viewer
-	 * @return True if and only if the extension is enabled for each element in
-	 *         the selection.
-	 */
-	public boolean isEnabledFor(IStructuredSelection aStructuredSelection) {
-		if (enablement == null) {
-			return false;
-		}
-		
-		if(aStructuredSelection.isEmpty()) {
-			IEvaluationContext context = null; 
-			context = new EvaluationContext(null, Collections.EMPTY_LIST);
-			context.setAllowPluginActivation(true);
-			try { 
-				if (enablement.evaluate(context) != EvaluationResult.TRUE) {
-					return false;
-				}
-			} catch (CoreException e) {
-				NavigatorPlugin.log(IStatus.ERROR, 0, e.getMessage(), e);
-				return false;
-			} 
-		} else {
-
-			IEvaluationContext context = null;
-			Iterator elements = aStructuredSelection.iterator();
-			while (elements.hasNext()) {
-				context = new EvaluationContext(null, elements.next());
-				context.setAllowPluginActivation(true);
-				try { 
-					if (enablement.evaluate(context) != EvaluationResult.TRUE) {
-						return false;
-					}
-				} catch (CoreException e) {
-					NavigatorPlugin.log(IStatus.ERROR, 0, e.getMessage(), e);
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Determine if this content extension is enabled for the given element.
-	 * 
-	 * @param anElement
-	 *            The element that should be used for the evaluation.
-	 * @return True if and only if the extension is enabled for the element.
-	 */
-	public boolean isEnabledFor(Object anElement) {
-		if (enablement == null || anElement == null) {
-			return false;
-		}
-
-		try {
-			EvaluationContext context = new EvaluationContext(null, anElement);
-			context.setAllowPluginActivation(true);
-			return (enablement.evaluate(context) == EvaluationResult.TRUE);
-		} catch (CoreException e) {
-			NavigatorPlugin.log(IStatus.ERROR, 0, e.getMessage(), e);
-		}
-		return false;
-	}
-
-	/**
-	 * 
-	 * @return An identifier for this ICommonActionProvider. Defaults to
-	 *         "org.eclipse.ui.navigator.actionProvider". May not be unique.
-	 *         Used to filter the actionProvider using the visibility state
-	 *         information.
-	 */
-	public String getId() {
-		return visibilityId;
-	}
-
-	/**
-	 * 
-	 * @return An identifier for this ICommonActionProvider. Defaults to
-	 *         'org.eclipse.ui.navigator.actionProvider'. May not be unique.
-	 *         Used to determine override or depends on cases.
-	 */
-	public String getDefinedId() {
-		return definedId;
-	}
-
-	/**
-	 * 
-	 * @return True if this is a nested &lt;actionProvider /&gt; element.
-	 */
-	public boolean isNested() {
-		return isNested;
-	}
-
-	/**
-	 * 
-	 * @return The value specified by the <i>dependsOn</i> attribute of the
-	 *         &lt;actionProvider /&gt; element.
-	 */
-	public String getDependsOnId() {
-		return dependsOnId;
-	}
-
-	/**
-	 * 
-	 * @return The value specified by the <i>overridesId</i> attribute of the
-	 *         &lt;actionProvider /&gt; element.
-	 */
-	public String getOverridesId() {
-		return overridesId;
-	}
-	
-	/**
-	 * Only nested Action Providers have priority (as of 3.2.1). 
-	 * 
-	 * @return The priority associated with this Action Provider Descriptor. 
-	 */
-	public Priority getPriority() {
-		return priority;
-	}
-
-
-	public int hashCode() {
-		final int PRIME = 31;
-		int result = 1;
-		result = PRIME * result + ((definedId == null) ? 0 : definedId.hashCode());
-		result = PRIME * result + ((visibilityId == null) ? 0 : visibilityId.hashCode());
-		return result;
-	}
-
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (!super.equals(obj))
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		final CommonActionProviderDescriptor other = (CommonActionProviderDescriptor) obj;
-		if (definedId == null) {
-			if (other.definedId != null)
-				return false;
-		} else if (!definedId.equals(other.definedId))
-			return false;
-		if (visibilityId == null) {
-			if (other.visibilityId != null)
-				return false;
-		} else if (!visibilityId.equals(other.visibilityId))
-			return false;
-		return true;
-	} 
-	
-	 
-
-	protected void addDependentDescriptor(
-			CommonActionProviderDescriptor dependentDescriptor) {
-		Assert.isTrue(this != dependentDescriptor);
-		if (dependentDescriptors == null) {
-			dependentDescriptors = new LinkedHashSet();
-		}
-		dependentDescriptors.add(dependentDescriptor);
-	}
-
-	protected void addOverridingDescriptor(
-			CommonActionProviderDescriptor overridingDescriptor) {
-		Assert.isTrue(this != overridingDescriptor);
-		if (overridingDescriptors == null) {
-			overridingDescriptors = new TreeSet(CommonActionProviderDescriptorCompator.INSTANCE);
-		}
-		overridingDescriptors.add(overridingDescriptor);
-	}
-
-	protected boolean hasDependentDescriptors() {
-		return dependentDescriptors != null && !dependentDescriptors.isEmpty();
-	}
-
-	protected boolean hasOverridingDescriptors() {
-		return overridingDescriptors != null
-				&& !overridingDescriptors.isEmpty();
-	}
-
-	protected Iterator dependentDescriptors() {
-		return dependentDescriptors.iterator();
-	}
-
-	protected Iterator overridingDescriptors() {
-		return overridingDescriptors.iterator();
-	}
-
-	public String toString() {
-		if (toString == null) {
-			toString = "CommonActionProviderDescriptor[definedId=" + getDefinedId() + ", visibilityId=" + getId() + ", dependsOn=" + getDependsOnId() + ", overrides=" + getOverridesId() + "]"; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-		}
-		return toString;
-	} 
-
-	
-	/**
-	 * Sorts CommonActionProviderDescriptors by priority, and then by defined id. 
-	 * @since 3.2
-	 *
-	 */
-	public static class CommonActionProviderDescriptorCompator implements Comparator { 
-
-		/**
-		 * The singleton instance.
-		 */
-		public static final CommonActionProviderDescriptorCompator INSTANCE = new CommonActionProviderDescriptorCompator();
-		
-		private static final int LESS_THAN = -1;
-		private static final int EQUALS = 0; 
-		
-		/* (non-Javadoc)
-		 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-		 */
-		public int compare(Object o1, Object o2) {
-			CommonActionProviderDescriptor lvalue= null, rvalue= null;
-			
-			if(o1 instanceof CommonActionProviderDescriptor)
-				lvalue = (CommonActionProviderDescriptor) o1;
-			
-			if(o2 instanceof CommonActionProviderDescriptor)
-				rvalue = (CommonActionProviderDescriptor) o2;
-			
-			if(lvalue == null || rvalue == null)
-				return LESS_THAN;
-			if(lvalue.equals(rvalue))
-				return EQUALS;
-			int comparison = lvalue.getPriority().getValue() - rvalue.getPriority().getValue();
-			if(comparison == 0) 
-				return lvalue.getDefinedId().compareTo(rvalue.getDefinedId());
-			return comparison;
-			
-		}
-		
-		 
-	}
-
-}
- 
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/actions/LinkEditorAction.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/actions/LinkEditorAction.java
deleted file mode 100644
index a834538..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/actions/LinkEditorAction.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.actions;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.extensions.LinkHelperService;
-import org.eclipse.ui.navigator.CommonNavigator;
-import org.eclipse.ui.navigator.CommonViewer;
-import org.eclipse.ui.navigator.ILinkHelper;
-import org.eclipse.ui.navigator.INavigatorContentService;
-import org.eclipse.ui.part.ISetSelectionTarget;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * This action links the activate editor with the Navigator selection.
- * 
- * @since 3.2
- */
-public class LinkEditorAction extends Action implements
-		ISelectionChangedListener, IPropertyListener {
-
-	private static final long BRIEF_DELAY = 100;
-
-	private IPartListener partListener;
-
-	private final CommonNavigator commonNavigator;
-
-	private final CommonViewer commonViewer;
-
-	private final LinkHelperService linkService;
-
-	private UIJob activateEditorJob = new UIJob(
-			CommonNavigatorMessages.Link_With_Editor_Job_) {
-		public IStatus runInUIThread(IProgressMonitor monitor) {
-
-			if (!commonViewer.getControl().isDisposed()) {
-				ISelection selection = commonViewer.getSelection();
-				if (selection != null && !selection.isEmpty()
-						&& selection instanceof IStructuredSelection) {
-
-					IStructuredSelection sSelection = (IStructuredSelection) selection;
-					if (sSelection.size() == 1) {
-						ILinkHelper[] helpers = linkService
-								.getLinkHelpersFor(sSelection.getFirstElement());
-						if (helpers.length > 0) {
-							helpers[0].activateEditor(commonNavigator.getSite()
-									.getPage(), sSelection);
-						}
-					}
-				}
-			}
-			return Status.OK_STATUS;
-		}
-	};
-
-	private UIJob updateSelectionJob = new UIJob(
-			CommonNavigatorMessages.Link_With_Editor_Job_) {
-		public IStatus runInUIThread(IProgressMonitor monitor) {
-
-			if (!commonNavigator.getCommonViewer().getControl().isDisposed()) {
-				SafeRunner.run(new ISafeRunnable() {
-
-					public void run() throws Exception {
-						IWorkbenchPage page = commonNavigator.getSite()
-								.getPage();
-						if (page != null) {
-							IEditorPart editor = page.getActiveEditor();
-							if (editor != null) {
-								IEditorInput input = editor.getEditorInput();
-								IStructuredSelection newSelection = linkService
-										.getSelectionFor(input);
-								if (!newSelection.isEmpty()) {
-									commonNavigator.selectReveal(newSelection);
-								}
-							}
-						}
-					}
-
-					public void handleException(Throwable e) {
-						String msg = e.getMessage() != null ? e.getMessage()
-								: e.toString();
-						NavigatorPlugin.logError(0, msg, e);
-					}
-				});
-
-			}
-
-			return Status.OK_STATUS;
-		}
-	};
-
-	/**
-	 * Create a LinkEditorAction for the given navigator and viewer.
-	 * 
-	 * @param aNavigator
-	 *            The navigator which defines whether linking is enabled and
-	 *            implements {@link ISetSelectionTarget}.
-	 * @param aViewer
-	 *            The common viewer instance with a
-	 *            {@link INavigatorContentService}.
-	 * @param linkHelperService
-	 */
-	public LinkEditorAction(CommonNavigator aNavigator, CommonViewer aViewer,
-			LinkHelperService linkHelperService) {
-		super(CommonNavigatorMessages.LinkEditorActionDelegate_0);
-		linkService = linkHelperService;
-		setToolTipText(CommonNavigatorMessages.LinkEditorActionDelegate_1);
-		commonNavigator = aNavigator;
-		commonViewer = aViewer;
-		setActionDefinitionId("org.eclipse.ui.navigate.linkWithEditor"); //$NON-NLS-1$
-		init();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	protected void init() {
-		partListener = new IPartListener() {
-
-			public void partActivated(IWorkbenchPart part) {
-				if (part instanceof IEditorPart) {
-					updateSelectionJob.schedule(BRIEF_DELAY);
-				}
-			}
-
-			public void partBroughtToTop(IWorkbenchPart part) {
-				if (part instanceof IEditorPart) {
-					updateSelectionJob.schedule(BRIEF_DELAY);
-				}
-			}
-
-			public void partClosed(IWorkbenchPart part) {
-
-			}
-
-			public void partDeactivated(IWorkbenchPart part) {
-			}
-
-			public void partOpened(IWorkbenchPart part) {
-			}
-		};
-
-		updateLinkingEnabled(commonNavigator.isLinkingEnabled());
-
-		commonNavigator.addPropertyListener(this);
-
-		// linkHelperRegistry = new
-		// LinkHelperManager(commonViewer.getNavigatorContentService());
-	}
-
-	/**
-	 * 
-	 */
-	public void dispose() {
-		commonNavigator.removePropertyListener(this);
-		if (isChecked()) {
-			commonViewer.removePostSelectionChangedListener(this);
-			commonNavigator.getSite().getPage()
-					.removePartListener(partListener);
-		}
-
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run() {
-		commonNavigator.setLinkingEnabled(!commonNavigator.isLinkingEnabled());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedList
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		if (commonNavigator.isLinkingEnabled() && commonNavigator == commonNavigator.getSite().getPage().getActivePart()) {
-			activateEditor();
-		}
-	}
-
-	/**
-	 * Update the active editor based on the current selection in the Navigator.
-	 */
-	protected void activateEditor() {
-		ISelection selection = commonViewer.getSelection();
-		if (selection != null && !selection.isEmpty()
-				&& selection instanceof IStructuredSelection) {
-			/*
-			 * Create and schedule a UI Job to activate the editor in a valid
-			 * Display thread
-			 */
-			activateEditorJob.schedule(BRIEF_DELAY);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IPropertyListener#propertyChanged(java.lang.Object,
-	 *      int)
-	 */
-	public void propertyChanged(Object aSource, int aPropertyId) {
-		switch (aPropertyId) {
-		case CommonNavigator.IS_LINKING_ENABLED_PROPERTY:
-			updateLinkingEnabled(((CommonNavigator) aSource).isLinkingEnabled());
-		}
-	}
-
-	/**
-	 * @param toEnableLinking
-	 */
-	private void updateLinkingEnabled(boolean toEnableLinking) {
-		setChecked(toEnableLinking);
-
-		if (toEnableLinking) {
-
-			updateSelectionJob.schedule(BRIEF_DELAY);
-
-			commonViewer.addPostSelectionChangedListener(this);
-			commonNavigator.getSite().getPage().addPartListener(partListener);
-		} else {
-			commonViewer.removePostSelectionChangedListener(this);
-			commonNavigator.getSite().getPage()
-					.removePartListener(partListener);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/CommonDropAdapterDescriptor.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/CommonDropAdapterDescriptor.java
deleted file mode 100644
index 8853d3c..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/CommonDropAdapterDescriptor.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.dnd;
-
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.internal.navigator.CustomAndExpression;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtPtConstants;
-import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-
-/**
- * @since 3.2
- * 
- */
-public final class CommonDropAdapterDescriptor implements
-		INavigatorContentExtPtConstants {
-
-	private final IConfigurationElement element;
-
-	private final INavigatorContentDescriptor contentDescriptor;
-
-	private Expression dropExpr;
-
-	/* package */CommonDropAdapterDescriptor(
-			IConfigurationElement aConfigElement,
-			INavigatorContentDescriptor aContentDescriptor) {
-		element = aConfigElement;
-		contentDescriptor = aContentDescriptor;
-		init();
-	}
-
-	private void init() {
-		IConfigurationElement[] children = element.getChildren(TAG_POSSIBLE_DROP_TARGETS);
-		if (children.length == 1) {
-			dropExpr = new CustomAndExpression(children[0]);
-		}
-	}
-
-	/**
-	 * 
-	 * @param anElement
-	 *            The element from the set of elements being dragged.
-	 * @return True if the element matches the drag expression from the
-	 *         extension.
-	 */
-	public boolean isDragElementSupported(Object anElement) { 
-		return contentDescriptor.isPossibleChild(anElement); 
-	}
-
-	/**
-	 * 
-	 * @param aSelection
-	 *            The set of elements being dragged.
-	 * @return True if the element matches the drag expression from the
-	 *         extension.
-	 */
-	public boolean areDragElementsSupported(IStructuredSelection aSelection) {
-		if (aSelection.isEmpty()) {
-			return false;
-		}
-		return contentDescriptor.arePossibleChildren(aSelection);
-	}
-
-	/**
-	 * 
-	 * @param anElement
-	 *            The element from the set of elements benig dropped.
-	 * @return True if the element matches the drop expression from the
-	 *         extension.
-	 */
-	public boolean isDropElementSupported(Object anElement) {
-		if (dropExpr != null && anElement != null) {
-			try {
-				EvaluationContext context = new EvaluationContext(null, anElement);
-				context.setAllowPluginActivation(true);
-				return dropExpr
-						.evaluate(context) == EvaluationResult.TRUE;
-			} catch (CoreException e) {
-				NavigatorPlugin.logError(0, e.getMessage(), e);
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * 
-	 * @return An instance of {@link CommonDropAdapterAssistant} from the
-	 *         descriptor or {@link SkeletonCommonDropAssistant}.
-	 */
-	public CommonDropAdapterAssistant createDropAssistant() {
-
-		try {
-			return (CommonDropAdapterAssistant) element
-					.createExecutableExtension(ATT_CLASS);
-		} catch (CoreException e) {
-			NavigatorPlugin.logError(0, e.getMessage(), e);
-		} catch (RuntimeException re) {
-			NavigatorPlugin.logError(0, re.getMessage(), re);
-		}
-		return SkeletonCommonDropAssistant.INSTANCE;
-	}
-
-	/**
-	 * 
-	 * @return The content descriptor that contains this drop descriptor.
-	 */
-	public INavigatorContentDescriptor getContentDescriptor() {
-		return contentDescriptor;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/CommonDropDescriptorManager.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/CommonDropDescriptorManager.java
deleted file mode 100644
index 162abc4..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/CommonDropDescriptorManager.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.dnd;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.ui.internal.navigator.extensions.ExtensionPriorityComparator;
-import org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtPtConstants;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentRegistryReader;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * @since 3.2
- * 
- */
-public class CommonDropDescriptorManager {
-
-	private static final CommonDropDescriptorManager INSTANCE = new CommonDropDescriptorManager();
-
-	private static final CommonDropAdapterDescriptor[] NO_DESCRIPTORS = new CommonDropAdapterDescriptor[0];
-
-	/**
-	 * A map of (INavigatorContentDescriptor,
-	 * CommonDropAdapterDescriptor)-pairs.
-	 */
-	private final Map dropDescriptors = new TreeMap(ExtensionPriorityComparator.INSTANCE);
-
-	/**
-	 * 
-	 * @return An initialized singleton instance of the
-	 *         CommonDropDescriptorManager.
-	 */
-	public static CommonDropDescriptorManager getInstance() {
-		return INSTANCE;
-	}
-
-	private CommonDropDescriptorManager() {
-		new CommonDropAdapterRegistry().readRegistry();
-	}
-
-	/**
-	 * 
-	 * @param aDropTarget
-	 *            The drop target of the operation
-	 * @param aContentService
-	 *            The associated content service to filter results by.
-	 * @return An array of drop descriptors that can handle the given drop
-	 *         target and are <i>visible</i> and <i>active</i> for the given
-	 *         service and <i>enabled</i> for the given drop target..
-	 */
-	public CommonDropAdapterDescriptor[] findCommonDropAdapterAssistants(Object aDropTarget, INavigatorContentService aContentService) {
-
-		Set foundDescriptors = new LinkedHashSet();
-		for (Iterator iter = dropDescriptors.keySet().iterator(); iter
-				.hasNext();) {
-			INavigatorContentDescriptor contentDescriptor = (INavigatorContentDescriptor) iter
-					.next();
-			if (aContentService.isVisible(contentDescriptor.getId())
-					&& aContentService.isActive(contentDescriptor.getId())) {
-				List dropDescriptors = getDropDescriptors(contentDescriptor);
-				for (Iterator iterator = dropDescriptors.iterator(); iterator
-						.hasNext();) {
-					CommonDropAdapterDescriptor dropDescriptor = (CommonDropAdapterDescriptor) iterator
-							.next();
-					if (dropDescriptor.isDropElementSupported(aDropTarget)) {
-						foundDescriptors.add(dropDescriptor);
-					}
-				}
-			}
-		}
-
-		if (foundDescriptors.isEmpty()) {
-			return NO_DESCRIPTORS;
-		}
-		return (CommonDropAdapterDescriptor[]) foundDescriptors
-				.toArray(new CommonDropAdapterDescriptor[foundDescriptors
-						.size()]);
-	}
-
-	private List getDropDescriptors(
-			INavigatorContentDescriptor aContentDescriptor) {
-		List descriptors = (List) dropDescriptors.get(aContentDescriptor);
-		if (descriptors != null) {
-			return descriptors;
-		}
-		synchronized (dropDescriptors) {
-			descriptors = (List) dropDescriptors.get(aContentDescriptor);
-			if (descriptors == null) {
-				dropDescriptors.put(aContentDescriptor,
-						(descriptors = new ArrayList()));
-			}
-
-		}
-		return descriptors;
-	}
-
-	/**
-	 * @param aContentDescriptor
-	 *            A non-null content descriptor.
-	 * @param aDropDescriptor
-	 *            A non-null drop descriptor.
-	 */
-	private void addCommonDropAdapter(
-			INavigatorContentDescriptor aContentDescriptor,
-			CommonDropAdapterDescriptor aDropDescriptor) { 
-		getDropDescriptors(aContentDescriptor).add(aDropDescriptor);
-	}
-
-	private class CommonDropAdapterRegistry extends
-			NavigatorContentRegistryReader implements
-			INavigatorContentExtPtConstants {
-
-		private CommonDropAdapterRegistry() {
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.navigator.extensions.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
-		 */
-		protected boolean readElement(IConfigurationElement element) {
-
-			if (TAG_NAVIGATOR_CONTENT.equals(element.getName())) {
-
-				String id = element.getAttribute(ATT_ID);
-				if (id != null) {
-					INavigatorContentDescriptor contentDescriptor = CONTENT_DESCRIPTOR_MANAGER
-							.getContentDescriptor(id);
-					if (contentDescriptor != null) {
-
-						IConfigurationElement[] commonDropAdapters = element
-								.getChildren(TAG_COMMON_DROP_ADAPTER);
-
-						for (int i = 0; i < commonDropAdapters.length; i++) {
-							addCommonDropAdapter(contentDescriptor,
-									new CommonDropAdapterDescriptor(commonDropAdapters[i], contentDescriptor));
-						} 
-					}
-				}
-
-			}
-			return super.readElement(element);
-		}
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/NavigatorContentServiceTransfer.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/NavigatorContentServiceTransfer.java
deleted file mode 100644
index 6b59985..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/NavigatorContentServiceTransfer.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.dnd;
-
-import java.lang.ref.WeakReference;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * Caches instances of {@link INavigatorContentService} to facilitate the
- * handling of drop operations in other viewers.
- * 
- * @since 3.2
- * 
- */
-public class NavigatorContentServiceTransfer {
-	
-	private static final NavigatorContentServiceTransfer instance = new NavigatorContentServiceTransfer(); 
-	
-	/**
-	 * 
-	 * @return The singleton instance of the transfer service.
-	 */
-	public static NavigatorContentServiceTransfer getInstance() {
-		return instance;
-	}
-
-	private final Set registeredContentServices = new HashSet();
-	
-	/**
-	 *  
-	 * @param aContentService The Content Service to register.
-	 */
-	public synchronized void registerContentService(INavigatorContentService aContentService) { 
-		if(findService(aContentService.getViewerId()) == null) {
-			registeredContentServices.add(new WeakReference(aContentService));
-		}
-	}
-	
-	/**
-	 *  
-	 * @param aContentService The Content Service to unregister.
-	 */
-	public synchronized void unregisterContentService(INavigatorContentService aContentService) { 
-  
-		for (Iterator iter = registeredContentServices.iterator(); iter.hasNext();) {
-			WeakReference ref = (WeakReference) iter.next();
-			if(ref.get() == null) {
-				iter.remove();
-			} else { 
-				if(ref.get() == aContentService) {
-					iter.remove(); 
-					return;
-				}
-			}
-		} 
-	}
-	
-	/**
-	 * 
-	 * @param aViewerId A viewer id that should have previously been registered with the service.
-	 * @return The registered content service for the given viewer id.
-	 */
-	public synchronized INavigatorContentService findService(String aViewerId) {
-		if(aViewerId == null || aViewerId.length() == 0) {
-			return null;
-		}
-		INavigatorContentService contentService;
-		for (Iterator iter = registeredContentServices.iterator(); iter.hasNext();) {
-			WeakReference ref = (WeakReference) iter.next();
-			if(ref.get() == null) {
-				iter.remove();
-			} else {
-				contentService = (INavigatorContentService)ref.get();
-				if(aViewerId.equals(contentService.getViewerId())) {
-					return contentService;
-				} 
-			}
-		}
-		return null;
-	} 
-	
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/NavigatorDnDService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/NavigatorDnDService.java
deleted file mode 100644
index 540b5a6..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/NavigatorDnDService.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.dnd;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-import org.eclipse.ui.internal.navigator.extensions.CommonDragAssistantDescriptor;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorViewerDescriptor;
-import org.eclipse.ui.navigator.CommonDragAdapterAssistant;
-import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
-import org.eclipse.ui.navigator.INavigatorContentService;
-import org.eclipse.ui.navigator.INavigatorDnDService;
-
-/**
- * 
- * Provides instances of {@link CommonDragAdapterAssistant} and
- * {@link CommonDropAdapterAssistant} for the associated
- * {@link INavigatorContentService}.
- * 
- * <p>
- * Clients may not extend, instantiate or directly reference this class.
- * </p>
- * 
- * @since 3.2
- * 
- */
-public class NavigatorDnDService implements INavigatorDnDService {
-
-	private static final CommonDropAdapterAssistant[] NO_ASSISTANTS = new CommonDropAdapterAssistant[0];
-
-	private NavigatorContentService contentService;
-
-	private CommonDragAdapterAssistant[] dragAssistants;
-
-	private final Map dropAssistants = new HashMap();
-
-	/**
-	 * 
-	 * @param aContentService
-	 *            The associated content service
-	 */
-	public NavigatorDnDService(NavigatorContentService aContentService) {
-		contentService = aContentService;
-	}
-
-	public synchronized CommonDragAdapterAssistant[] getCommonDragAssistants() {
-
-		if (dragAssistants == null) 
-			initializeDragAssistants(); 
-		return dragAssistants;
-	}
- 
-	private void initializeDragAssistants() {
-		int i = 0;
-		Set dragDescriptors = ((NavigatorViewerDescriptor) contentService
-				.getViewerDescriptor()).getDragAssistants();
-		dragAssistants = new CommonDragAdapterAssistant[dragDescriptors
-				.size()];
-		for (Iterator iter = dragDescriptors.iterator(); iter.hasNext();) {
-			CommonDragAssistantDescriptor descriptor = (CommonDragAssistantDescriptor) iter
-					.next();
-			dragAssistants[i++] = descriptor.createDragAssistant();
-		}
-	}
-	
-
-	public synchronized void bindDragAssistant(CommonDragAdapterAssistant anAssistant) {
-		if(dragAssistants == null) 
-			initializeDragAssistants(); 
-		CommonDragAdapterAssistant[] newDragAssistants = new CommonDragAdapterAssistant[dragAssistants.length + 1];
-		System.arraycopy(dragAssistants, 0, newDragAssistants, 0, dragAssistants.length);
-		newDragAssistants[dragAssistants.length] = anAssistant;
-		dragAssistants = newDragAssistants;		
-	}
-
-	public CommonDropAdapterAssistant[] findCommonDropAdapterAssistants(
-			Object aDropTarget, TransferData aTransferType) {
- 
-		// TODO Make sure descriptors are sorted by priority 
-		CommonDropAdapterDescriptor[] descriptors = CommonDropDescriptorManager
-				.getInstance().findCommonDropAdapterAssistants(aDropTarget,
-						contentService);
-
-		if (descriptors.length == 0) {
-			return NO_ASSISTANTS;
-		}
-
-		if (LocalSelectionTransfer.getTransfer().isSupportedType(aTransferType)  
-						&& LocalSelectionTransfer.getTransfer().getSelection() instanceof IStructuredSelection) {
-			return getAssistantsBySelection(descriptors, (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection());
-		} 
-		return getAssistantsByTransferData(descriptors, aTransferType);
-	}
-	
-
-	public CommonDropAdapterAssistant[] findCommonDropAdapterAssistants(
-			Object aDropTarget, IStructuredSelection theDragSelection) {
- 
-		// TODO Make sure descriptors are sorted by priority 
-		CommonDropAdapterDescriptor[] descriptors = CommonDropDescriptorManager
-				.getInstance().findCommonDropAdapterAssistants(aDropTarget,
-						contentService);
-
-		if (descriptors.length == 0) {
-			return NO_ASSISTANTS;
-		}
-
-		return getAssistantsBySelection(descriptors, theDragSelection);  
-	}
-
-	private CommonDropAdapterAssistant[] getAssistantsByTransferData(
-			CommonDropAdapterDescriptor[] descriptors,
-			TransferData aTransferType) {
-
-		Set assistants = new LinkedHashSet();
-		for (int i = 0; i < descriptors.length; i++) {
-			CommonDropAdapterAssistant asst = getAssistant(descriptors[i]);
-			if (asst.isSupportedType(aTransferType)) {
-				assistants.add(asst);
-			}
-		}
-		return (CommonDropAdapterAssistant[]) assistants
-				.toArray(new CommonDropAdapterAssistant[assistants.size()]);
-
-	}
-
-	private CommonDropAdapterAssistant[] getAssistantsBySelection(
-			CommonDropAdapterDescriptor[] descriptors, IStructuredSelection aSelection) {
-
-		Set assistants = new LinkedHashSet(); 
-			
-		for (int i = 0; i < descriptors.length; i++) {
-			if(descriptors[i].areDragElementsSupported(aSelection)) {
-				assistants.add(getAssistant(descriptors[i]));
-			}
-		}  
-
-		return (CommonDropAdapterAssistant[]) assistants
-				.toArray(new CommonDropAdapterAssistant[assistants.size()]);
-	}
-
-	private CommonDropAdapterAssistant getAssistant(
-			CommonDropAdapterDescriptor descriptor) {
-		CommonDropAdapterAssistant asst = (CommonDropAdapterAssistant) dropAssistants
-				.get(descriptor);
-		if (asst != null) {
-			return asst;
-		}
-		synchronized (dropAssistants) {
-			asst = (CommonDropAdapterAssistant) dropAssistants.get(descriptor);
-			if (asst == null) {
-				dropAssistants.put(descriptor, (asst = descriptor
-						.createDropAssistant()));
-				asst.init(contentService);
-			}
-		}
-		return asst;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/NavigatorPluginDropAction.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/NavigatorPluginDropAction.java
deleted file mode 100644
index 900d40a..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/NavigatorPluginDropAction.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.dnd;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
-import org.eclipse.ui.navigator.INavigatorContentService;
-import org.eclipse.ui.part.IDropActionDelegate;
-import org.eclipse.ui.part.PluginTransferData;
-
-/**
- * 
- * 
- * @since 3.2
- * 
- */
-public class NavigatorPluginDropAction implements IDropActionDelegate {
-
-	private static final boolean DEBUG = false;
-
-	private static final String CN_PLUGIN_ACTION_ID = "org.eclipse.ui.navigator.PluginDropAction"; //$NON-NLS-1$
-
-	/**
-	 * A default no-args constructor is required by the
-	 * <b>org.eclipse.ui.dropAdapters</b> extension point
-	 */
-	public NavigatorPluginDropAction() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.IDropActionDelegate#run(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public boolean run(Object sourceData, Object target) {
-
-		if (DEBUG) {
-			System.out.println("NavigatorPluginDropAction.run (begin)"); //$NON-NLS-1$
-		}
-
-		String sourceViewerId = new String((byte[]) sourceData);
-
-		IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer
-				.getTransfer().getSelection();
-
-		INavigatorContentService contentService = NavigatorContentServiceTransfer
-				.getInstance().findService(sourceViewerId);
-
-		if (contentService == null) {
-			return false;
-		}
-		try {
-			CommonDropAdapterAssistant[] assistants = contentService
-					.getDnDService().findCommonDropAdapterAssistants(target,
-							selection); 
-
-			IStatus valid = null;
-			for (int i = 0; i < assistants.length; i++) {
-				valid = assistants[i].validatePluginTransferDrop(selection, target);
-				if (valid != null && valid.isOK()) {
-					valid = assistants[i].handlePluginTransferDrop(selection, target);
-					return valid != null && valid.isOK();
-				}
-			}
-		} finally {
-			NavigatorContentServiceTransfer.getInstance()
-					.unregisterContentService(contentService);
-		}
-
-		if (DEBUG) {
-			System.out.println("NavigatorPluginDropAction.run (exit)"); //$NON-NLS-1$
-		}
-
-		return false;
-	}
-
-	/**
-	 * 
-	 * @param aContentService
-	 *            The associated content service that is the source of the drag
-	 * @return A PluginTransferData properly configured to call the Common
-	 *         Navigator's PluginDropAction.
-	 */
-	public static PluginTransferData createTransferData(
-			INavigatorContentService aContentService) {
-		NavigatorContentServiceTransfer.getInstance().registerContentService(
-				aContentService);
-		return new PluginTransferData(CN_PLUGIN_ACTION_ID, aContentService
-				.getViewerId().getBytes());
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/SkeletonCommonDropAssistant.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/SkeletonCommonDropAssistant.java
deleted file mode 100644
index 5bf92d1..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/dnd/SkeletonCommonDropAssistant.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.dnd;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.ui.navigator.CommonDropAdapter;
-import org.eclipse.ui.navigator.CommonDropAdapterAssistant;
-
-/**
- * A Skeleton implementation of {@link CommonDropAdapterAssistant}.
- * 
- * @since 3.2
- * 
- */
-public class SkeletonCommonDropAssistant extends CommonDropAdapterAssistant {
-
-	/**
-	 * The singleton instance.
-	 */
-	public static final SkeletonCommonDropAssistant INSTANCE = new SkeletonCommonDropAssistant();
-
-	private SkeletonCommonDropAssistant() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#handleDrop(org.eclipse.ui.navigator.CommonDropAdapter,
-	 *      org.eclipse.swt.dnd.DropTargetEvent, java.lang.Object)
-	 */
-	public IStatus handleDrop(CommonDropAdapter aDropAdapter,
-			DropTargetEvent aDropTargetEvent, Object aTarget) {
-		return Status.CANCEL_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.CommonDropAdapterAssistant#validateDrop(java.lang.Object,
-	 *      int, org.eclipse.swt.dnd.TransferData)
-	 */
-	public IStatus validateDrop(Object target, int operation,
-			TransferData transferType) {
-		return Status.CANCEL_STATUS;
-	}
-
-	// /*
-	// * (non-Javadoc)
-	// *
-	// * @see
-	// org.eclipse.ui.navigator.CommonDropAdapterAssistant#findSupportedTransferData(org.eclipse.swt.dnd.TransferData[])
-	// */
-	// public TransferData findSupportedTransferData(
-	// TransferData[] theAvailableTransferData) {
-	//
-	// return null;
-	// }
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/Binding.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/Binding.java
deleted file mode 100644
index 59e1270..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/Binding.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006,2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.extensions;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.Policy;
-
-class Binding {
-
-	private final Set rootPatterns = new HashSet();
-
-	private final Set includePatterns = new HashSet();
-
-	private final Set excludePatterns = new HashSet();
-
-	private final String TAG_EXTENSION;
-
-	private final Map knownIds = new HashMap();
-	private final Map knownRootIds = new HashMap();
-
-	protected Binding(String tagExtension) {
-		TAG_EXTENSION = tagExtension;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.navigator.extensions.INavigatorViewerDescriptor#isVisibleExtension(java.lang.String)
-	 */
-	boolean isVisibleExtension(String anExtensionId) {
-		
-
-		// Have we seen this pattern before?
-		if (knownIds.containsKey(anExtensionId)) {
-			// we have, don't recompute
-			return ((Boolean) knownIds.get(anExtensionId)).booleanValue();
-		}
-		
-		for (Iterator itr = includePatterns.iterator(); itr.hasNext();) {
-			Pattern pattern = (Pattern) itr.next();
-			if (pattern.matcher(anExtensionId).matches()) {
-				// keep track of the result for next time
-				knownIds.put(anExtensionId, Boolean.TRUE);
-				if (Policy.DEBUG_RESOLUTION) {
-					System.out.println("Binding: " + TAG_EXTENSION +//$NON-NLS-1$
-							" to: " + anExtensionId); //$NON-NLS-1$
-				}
-				return true;
-			}
-		}
-
-		for (Iterator itr = excludePatterns.iterator(); itr.hasNext();) {
-			Pattern pattern = (Pattern) itr.next();
-			if (pattern.matcher(anExtensionId).matches()) {
-				knownIds.put(anExtensionId, Boolean.FALSE);
-				return false;
-			}
-		}
-
-		knownIds.put(anExtensionId, Boolean.FALSE);
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.navigator.extensions.INavigatorViewerDescriptor#isRootExtension(java.lang.String)
-	 */
-	boolean isRootExtension(String anExtensionId) {
-		if (rootPatterns.size() == 0) {
-			return false;
-		} 
-		// Have we seen this pattern before?
-		if (knownRootIds.containsKey(anExtensionId)) {
-			// we have, don't recompute
-			return ((Boolean) knownRootIds.get(anExtensionId)).booleanValue();
-		}
-		Pattern pattern = null;
-		for (Iterator itr = rootPatterns.iterator(); itr.hasNext();) {
-			pattern = (Pattern) itr.next();
-			if (pattern.matcher(anExtensionId).matches()) {
-				knownRootIds.put(anExtensionId, Boolean.TRUE);
-				return true;
-			}
-		}
-		knownRootIds.put(anExtensionId, Boolean.FALSE);
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.navigator.extensions.INavigatorViewerDescriptor#hasOverriddenRootExtensions()
-	 */
-	boolean hasOverriddenRootExtensions() {
-		return rootPatterns.size() > 0;
-	}
-
-	void consumeIncludes(IConfigurationElement element, boolean toRespectRoots) {
-
-		Assert.isTrue(NavigatorViewerDescriptor.TAG_INCLUDES.equals(element
-				.getName()));
-		IConfigurationElement[] contentExtensionPatterns = element
-				.getChildren(TAG_EXTENSION);
-		String isRootString = null;
-		boolean isRoot = false;
-		String patternString = null;
-		Pattern compiledPattern = null;
-		for (int i = 0; i < contentExtensionPatterns.length; i++) {
-			if (toRespectRoots) {
-				isRootString = contentExtensionPatterns[i]
-						.getAttribute(NavigatorViewerDescriptor.ATT_IS_ROOT);
-				isRoot = (isRootString != null) ? Boolean.valueOf(
-						isRootString.trim()).booleanValue() : false;
-			}
-
-			patternString = contentExtensionPatterns[i]
-					.getAttribute(NavigatorViewerDescriptor.ATT_PATTERN);
-			if (patternString == null) {
-				NavigatorPlugin
-						.logError(
-								0,
-								NLS
-										.bind(
-												CommonNavigatorMessages.Attribute_Missing_Warning,
-												new Object[] {
-														NavigatorViewerDescriptor.ATT_PATTERN,
-														element
-																.getDeclaringExtension()
-																.getUniqueIdentifier(),
-														element
-																.getDeclaringExtension()
-																.getNamespaceIdentifier() }),
-								null);
-			} else {
-				compiledPattern = Pattern.compile(patternString);
-				includePatterns.add(compiledPattern);
-				knownIds.clear();// Cache is now invlaid
-				if (toRespectRoots && isRoot) {
-					rootPatterns.add(compiledPattern);
-				}
-			}
-		}
-
-	}
-
-	void consumeExcludes(IConfigurationElement element) {
-		Assert.isTrue(NavigatorViewerDescriptor.TAG_EXCLUDES.equals(element
-				.getName()));
-		IConfigurationElement[] contentExtensionPatterns = element
-				.getChildren(TAG_EXTENSION);
-		String patternString = null;
-		Pattern compiledPattern = null;
-		for (int i = 0; i < contentExtensionPatterns.length; i++) {
-
-			patternString = contentExtensionPatterns[i]
-					.getAttribute(NavigatorViewerDescriptor.ATT_PATTERN);
-			if (patternString == null) {
-				NavigatorPlugin
-						.logError(
-								0,
-								NLS
-										.bind(
-												CommonNavigatorMessages.Attribute_Missing_Warning,
-												new Object[] {
-														NavigatorViewerDescriptor.ATT_PATTERN,
-														element
-																.getDeclaringExtension()
-																.getUniqueIdentifier(),
-														element
-																.getDeclaringExtension()
-																.getNamespaceIdentifier() }),
-								null);
-			} else {
-				compiledPattern = Pattern.compile(patternString);
-				excludePatterns.add(compiledPattern);
-				knownIds.clear();// Clear the cache
-			}
-		}
-
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/CommonActionExtensionSite.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/CommonActionExtensionSite.java
deleted file mode 100644
index f75ebbd..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/CommonActionExtensionSite.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-import org.eclipse.ui.navigator.ICommonViewerSite;
-
-/**
- * 
- * Provides access to information required for the initialization of
- * CommonActionProviders.
- * 
- * <p>
- * See the documentation of the <b>org.eclipse.ui.navigator.navigatorContent</b>
- * extension point and {@link CommonActionProvider} for more information on
- * declaring {@link CommonActionProvider}s.
- * </p>
- * 
- * 
- * @since 3.2
- */
-public final class CommonActionExtensionSite extends CommonExtensionSite
-		implements ICommonActionExtensionSite {
-
-	private String extensionId;
-
-	private ICommonViewerSite commonViewerSite;
-
-	private StructuredViewer structuredViewer;
-
-	/**
-	 * Create a config element for the initialization of Common Action
-	 * Providers.
-	 * 
-	 * @param anExtensionId
-	 *            The unique identifier of the associated content extension or
-	 *            the top-level action provider. <b>May NOT be null.</b>
-	 * @param aCommonViewerSite
-	 *            The common viewer site may be used to access information about
-	 *            the part for which the instantiated CommonActionProvider will
-	 *            be used. <b>May NOT be null.</b>
-	 * @param aContentService
-	 *            The associated content service to allow coordination with
-	 *            content extensions via the IExtensionStateModel. Clients may
-	 *            access the content providers and label providers as necessary
-	 *            also to render labels or images in their UI. <b>May NOT be
-	 *            null.</b>
-	 * @param aStructuredViewer
-	 *            The viewer control that will use the instantiated Common
-	 *            Action Provider. <b>May NOT be null.</b>
-	 */
-	public CommonActionExtensionSite(String anExtensionId,
-			ICommonViewerSite aCommonViewerSite,
-			NavigatorContentService aContentService,
-			StructuredViewer aStructuredViewer) {
-		super(aContentService, anExtensionId); 
-
-		Assert.isNotNull(aCommonViewerSite);
-		Assert.isNotNull(aStructuredViewer);
-		extensionId = anExtensionId;
-		commonViewerSite = aCommonViewerSite;
-		structuredViewer = aStructuredViewer;
-
-	}
-
-	/**
-	 * 
-	 * @return The unique identifier of the associated content extension or the
-	 *         top-level Common Action Provider.
-	 */
-	public String getExtensionId() {
-		return extensionId;
-	}
-
-	/**
-	 * 
-	 * @return The associated structured viewer for the instantiated Common
-	 *         Action Provider.
-	 */
-	public StructuredViewer getStructuredViewer() {
-		return structuredViewer;
-	}
-
-	/**
-	 * 
-	 * @return The ICommonViewerSite from the CommonViewer.
-	 */
-	public ICommonViewerSite getViewSite() {
-		return commonViewerSite;
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/CommonContentExtensionSite.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/CommonContentExtensionSite.java
deleted file mode 100644
index 691eec1..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/CommonContentExtensionSite.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.extensions;
-
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-import org.eclipse.ui.navigator.ICommonContentExtensionSite;
-import org.eclipse.ui.navigator.INavigatorContentExtension;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * @since 3.2
- * 
- */
-public class CommonContentExtensionSite extends CommonExtensionSite implements
-		ICommonContentExtensionSite {
-
-	private NavigatorContentExtension extension;
-
-	private IMemento memento;
-
-	private NavigatorContentService contentService;
-
-	/**
-	 * Create a config element for the initialization of Content Extensions.
-	 * 
-	 * @param anExtensionId
-	 *            The unique identifier of the associated content extension or
-	 *            the top-level action provider. <b>May NOT be null.</b>
-	 * @param aContentService
-	 *            The associated content service to allow coordination with
-	 *            content extensions via the IExtensionStateModel. Clients may
-	 *            access the content providers and label providers as necessary
-	 *            also to render labels or images in their UI. <b>May NOT be
-	 *            null.</b>
-	 * @param aMemento
-	 *            The memento associated with the parent viewer.
-	 */
-	public CommonContentExtensionSite(String anExtensionId,
-			NavigatorContentService aContentService, IMemento aMemento) {
-		super(aContentService, anExtensionId);
-
-		NavigatorContentDescriptor contentDescriptor = NavigatorContentDescriptorManager
-				.getInstance().getContentDescriptor(anExtensionId);
-
-		extension = aContentService.getExtension(contentDescriptor);
-		memento = aMemento;
-		contentService = aContentService;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.ICommonContentExtensionSite#getMemento()
-	 */
-	public IMemento getMemento() {
-		return memento;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.ICommonContentExtensionSite#getExtension()
-	 */
-	public INavigatorContentExtension getExtension() {
-		return extension;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.ICommonContentExtensionSite#getService()
-	 */
-	public INavigatorContentService getService() { 
-		return contentService;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/CommonDragAssistantDescriptor.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/CommonDragAssistantDescriptor.java
deleted file mode 100644
index c13d51c..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/CommonDragAssistantDescriptor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.extensions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.navigator.CommonDragAdapterAssistant;
-
-/**
- * 
- * Drag assistants allow clients to provide new TransferTypes to a particular
- * viewer.
- * 
- * @since 3.2
- * 
- */
-public final class CommonDragAssistantDescriptor implements IViewerExtPtConstants {
-
-	private IConfigurationElement element;
-
-	
-	/* package */ CommonDragAssistantDescriptor(IConfigurationElement aConfigElement) {
-		element = aConfigElement;
-	}
-
-	/**
-	 * Create an instance of the {@link CommonDragAdapterAssistant} defined by
-	 * this descriptor.
-	 * 
-	 * @return an instance of the {@link CommonDragAdapterAssistant} or
-	 *         {@link SkeletonCommonDragAssistant} if a problem occurs with the
-	 *         instantiation.
-	 */
-	public CommonDragAdapterAssistant createDragAssistant() {
-
-		try {
-			return (CommonDragAdapterAssistant) element
-					.createExecutableExtension(ATT_CLASS);
-		} catch (CoreException e) {
-			NavigatorPlugin.logError(0, e.getMessage(), e);
-		} catch (RuntimeException re) {
-			NavigatorPlugin.logError(0, re.getMessage(), re);
-		}
-		return SkeletonCommonDragAssistant.INSTANCE;
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/CommonExtensionSite.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/CommonExtensionSite.java
deleted file mode 100644
index 215f851..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/CommonExtensionSite.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.extensions;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-import org.eclipse.ui.navigator.ICommonContentExtensionSite;
-import org.eclipse.ui.navigator.IExtensionStateModel;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * 
- * Provides a common base class for {@link ICommonContentExtensionSite} and
- * {@link ICommonActionExtensionSite}.
- * 
- * @since 3.2
- * 
- */
-public class CommonExtensionSite {
-
-	private final INavigatorContentService contentService;
-
-	private IExtensionStateModel extensionStateModel;
-
-	protected CommonExtensionSite(INavigatorContentService aContentService,
-			String anExtensionId) {
-
-		Assert.isNotNull(aContentService);
-
-		contentService = aContentService;
-		if (anExtensionId != null) {
-			extensionStateModel = aContentService.findStateModel(anExtensionId);
-		}
-	}
-
-	/**
-	 * 
-	 * @return The content service used to create this extension site
-	 */
-	public final INavigatorContentService getContentService() {
-		return contentService;
-	}
-
-	/**
-	 * By default, the extension state model returned is for the associated
-	 * content extension (if this is NOT a top-level action provider).
-	 * Otherwise, clients may use
-	 * {@link INavigatorContentService#findStateModel(String)} to locate the
-	 * state model of another content extension.
-	 * 
-	 * @return The extension state model of the associated extension.
-	 * @see IExtensionStateModel
-	 */
-	public final IExtensionStateModel getExtensionStateModel() {
-		return extensionStateModel;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/EvalutationReference.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/EvalutationReference.java
deleted file mode 100644
index 8fe16e3..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/EvalutationReference.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.extensions;
-
-import java.lang.ref.SoftReference;
-
-/**
- * @since 3.3
- * 
- */
-public class EvalutationReference extends SoftReference {
-
-	private final int hashCode;
-
-	private final Class type;
-
-	/**
-	 * @param referent
-	 *            The object to be referenced
-	 */
-	public EvalutationReference(Object referent) {
-		super(referent);
-		hashCode = referent.hashCode();
-		type = referent.getClass();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return hashCode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (obj == null)
-			return false;
-		else if (obj instanceof EvalutationReference) {
-			if (!type.equals(((EvalutationReference) obj).type))
-				return false;
-			return hashCode == obj.hashCode();
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		Object referent = get();
-		if(referent == null)
-			return "Evalutation[type="+ type +"]";  //$NON-NLS-1$//$NON-NLS-2$
-		return "Evalutation[referent="+ referent +"]"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/ExtensionPriorityComparator.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/ExtensionPriorityComparator.java
deleted file mode 100644
index e201e26..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/ExtensionPriorityComparator.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.extensions;
-
-import java.util.Comparator;
-
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentExtension;
-
-/**
- * @since 3.2
- * 
- */
-public class ExtensionPriorityComparator implements Comparator {
-
-	/**
-	 * The initialized singleton instance.
-	 */
-	public static final ExtensionPriorityComparator INSTANCE = new ExtensionPriorityComparator(true);
-
-	/**
-	 * The initialized singleton instance.
-	 */
-	public static final ExtensionPriorityComparator DESCENDING = new ExtensionPriorityComparator(false);
-	
-	private final int sortAscending;
-	
-	/**
-	 * Creates an instance that sorts according to the given boolean flag.
-	 * 
-	 * @param toSortAscending
-	 *            <code>true</code> for ascending sort order or
-	 *            <code>false</code> for descending sort order.
-	 */
-	public ExtensionPriorityComparator(boolean toSortAscending) {
-		sortAscending = toSortAscending ? 1 : -1; 
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Object o1, Object o2) {
-
-		INavigatorContentDescriptor lvalue = null;
-		INavigatorContentDescriptor rvalue = null;
-
-		if (o1 instanceof INavigatorContentDescriptor) {
-			lvalue = (INavigatorContentDescriptor) o1;
-		} else if (o1 instanceof INavigatorContentExtension) {
-			lvalue = ((INavigatorContentExtension) o1).getDescriptor();
-		}
-
-		if (o2 instanceof INavigatorContentDescriptor) {
-			rvalue = (INavigatorContentDescriptor) o2;
-		} else if (o2 instanceof INavigatorContentExtension) {
-			rvalue = ((INavigatorContentExtension) o2).getDescriptor();
-		}
-
-		if (lvalue == null || rvalue == null) {
-			return  -1 * sortAscending;
-		}
-
-		int c = lvalue.getPriority() - rvalue.getPriority();
-		if (c != 0) {
-			return c * sortAscending;
-		}
-		return lvalue.getId().compareTo(rvalue.getId()) * sortAscending;
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/ExtensionStateModel.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/ExtensionStateModel.java
deleted file mode 100644
index cc475f5..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/ExtensionStateModel.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.commands.common.EventManager;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.navigator.IExtensionStateModel;
-
-/**
- * 
- * 
- * @since 3.2
- * @see IExtensionStateModel
- */
-public class ExtensionStateModel extends EventManager implements
-		IExtensionStateModel {
-
-	private final String id;
-
-	private final String viewerId;
-
-	private final Map values = new HashMap();
-
-	/**
-	 * Create an extension state model for the given extension (anId) associated
-	 * with the given viewer (aViewerId).
-	 * 
-	 * @param anId
-	 *            The id of the extension this state model is used for.
-	 * @param aViewerId
-	 *            The id of the viewer this state model is associated with.
-	 */
-	public ExtensionStateModel(String anId, String aViewerId) {
-		id = anId;
-		viewerId = aViewerId;
-	}
-
-	public String getId() {
-		return id;
-	}
-
-	public String getViewerId() {
-		return viewerId;
-	}
-
-	public String getStringProperty(String aPropertyName) {
-		return (String) values.get(aPropertyName);
-	}
-
-	public boolean getBooleanProperty(String aPropertyName) {
-
-		Boolean b = (Boolean) values.get(aPropertyName);
-		return b != null ? b.booleanValue() : false;
-	}
-
-	public int getIntProperty(String aPropertyName) {
-		Integer i = (Integer) values.get(aPropertyName);
-		return i != null ? i.intValue() : -1;
-	}
-
-	public void setStringProperty(String aPropertyName, String aPropertyValue) {
-		String oldValue = (String) values.get(aPropertyName);
-		String newValue = aPropertyValue;
-		if (hasPropertyChanged(oldValue, newValue)) {
-			values.put(aPropertyName, newValue);
-			firePropertyChangeEvent(new PropertyChangeEvent(this,
-					aPropertyName, oldValue, newValue));
-		}
-	}
-
-	public void setBooleanProperty(String aPropertyName, boolean aPropertyValue) {
-		Boolean oldValue = (Boolean) values.get(aPropertyName);
-		Boolean newValue = aPropertyValue ? Boolean.TRUE : Boolean.FALSE;
-		if (hasPropertyChanged(oldValue, newValue)) {
-
-			values.put(aPropertyName, aPropertyValue ? Boolean.TRUE
-					: Boolean.FALSE);
-			firePropertyChangeEvent(new PropertyChangeEvent(this,
-					aPropertyName, oldValue, newValue));
-		}
-	}
-
-	public void setIntProperty(String aPropertyName, int aPropertyValue) {
-		Integer oldValue = (Integer) values.get(aPropertyName);
-		Integer newValue = new Integer(aPropertyValue);
-		if (hasPropertyChanged(oldValue, newValue)) {
-			values.put(aPropertyName, newValue);
-			firePropertyChangeEvent(new PropertyChangeEvent(this,
-					aPropertyName, oldValue, newValue));
-		}
-	}
-
-	public void addPropertyChangeListener(IPropertyChangeListener aListener) {
-		addListenerObject(aListener);
-	}
-
-	public void removePropertyChangeListener(IPropertyChangeListener aListener) {
-		removeListenerObject(aListener);
-	}
-
-	public Object getProperty(String aPropertyName) {
-		return values.get(aPropertyName);
-	}
-
-	public void setProperty(String aPropertyName, Object aPropertyValue) {
-
-		Object oldValue = values.get(aPropertyName);
-		Object newValue = aPropertyValue;
-		if (hasPropertyChanged(oldValue, newValue)) {
-			values.put(aPropertyName, newValue);
-			firePropertyChangeEvent(new PropertyChangeEvent(this,
-					aPropertyName, oldValue, newValue));
-		}
-	}
- 
-	private boolean hasPropertyChanged(Object oldValue, Object newValue) {
-		return oldValue == null || !oldValue.equals(newValue);
-	}
-
-	protected void firePropertyChangeEvent(PropertyChangeEvent anEvent) {
-		Object[] listeners = getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			((IPropertyChangeListener) listeners[i]).propertyChange(anEvent);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/ILinkHelperExtPtConstants.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/ILinkHelperExtPtConstants.java
deleted file mode 100644
index b852f30..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/ILinkHelperExtPtConstants.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.extensions;
-
-/**
- * @since 3.2
- *
- */
-public interface ILinkHelperExtPtConstants {
-
-
-	/** */
-	String LINK_HELPER = "linkHelper"; //$NON-NLS-1$
-
-	/** */
-	String ATT_ID = "id"; //$NON-NLS-1$
-
-	/** */
-	String ATT_CLASS = "class"; //$NON-NLS-1$
-
-	/** */
-	String ATT_NAVIGATOR_CONTENT_EXTENSION_ID = "navigatorContentExtensionId"; //$NON-NLS-1$
-
-	/** */
-	String EDITOR_INPUT_ENABLEMENT = "editorInputEnablement"; //$NON-NLS-1$
-
-	/** */
-	String SELECTION_ENABLEMENT = "selectionEnablement"; //$NON-NLS-1$
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/INavigatorContentExtPtConstants.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/INavigatorContentExtPtConstants.java
deleted file mode 100644
index e131531..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/INavigatorContentExtPtConstants.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-/**
- * 
- * Constants for Extension Point managers and descriptors.
- */
-public interface INavigatorContentExtPtConstants {
-
-	/** */
-	String TAG_ACTION_PROVIDER = "actionProvider"; //$NON-NLS-1$
-
-	/** */
-	String TAG_NAVIGATOR_CONTENT = "navigatorContent"; //$NON-NLS-1$
-
-	/** */
-	String TAG_COMMON_WIZARD = "commonWizard"; //$NON-NLS-1$
-
-	/** */
-	String TAG_ENABLEMENT = "enablement"; //$NON-NLS-1$
-
-	/** */
-	String TAG_TRIGGER_POINTS = "triggerPoints"; //$NON-NLS-1$
-
-	/** */
-	String TAG_POSSIBLE_CHILDREN = "possibleChildren"; //$NON-NLS-1$
-
-	/** */
-	String TAG_DUPLICATE_CONTENT_FILTER = "duplicateContentFilter"; //$NON-NLS-1$	
-
-	/** */
-	String TAG_COMMON_FILTER = "commonFilter"; //$NON-NLS-1$
-
-	/** */
-	String TAG_COMMON_SORTER = "commonSorter"; //$NON-NLS-1$
-	
-	/** */
-	String TAG_COMMON_DROP_ADAPTER = "dropAssistant"; //$NON-NLS-1$	 
-	
-	/** */
-	String TAG_POSSIBLE_DROP_TARGETS = "possibleDropTargets"; //$NON-NLS-1$	 
-	
-	/** */
-	String TAG_OVERRIDE = "override"; //$NON-NLS-1$	
-
-	/** */
-	String TAG_FILTER_EXPRESSION = "filterExpression"; //$NON-NLS-1$
-
-	/** */
-	String TAG_PARENT_EXPRESSION = "parentExpression"; //$NON-NLS-1$ 
-
-	/** */
-	String ATT_ID = "id"; //$NON-NLS-1$
-
-	/** */
-	String ATT_NAME = "name"; //$NON-NLS-1$	 
-
-	/** */
-	String ATT_DESCRIPTION = "description"; //$NON-NLS-1$	  
-
-	/** */
-	String ATT_CLASS = "class"; //$NON-NLS-1$ 
-
-	/** */
-	String ATT_PRIORITY = "priority"; //$NON-NLS-1$
-
-	/** */
-	String ATT_ICON = "icon"; //$NON-NLS-1$
-
-	/** */
-	String ATT_WIZARD_ID = "wizardId"; //$NON-NLS-1$
-
-	/** */
-	String ATT_TYPE = "type"; //$NON-NLS-1$		
-
-	/** */
-	String ATT_ACTIVE_BY_DEFAULT = "activeByDefault"; //$NON-NLS-1$
-
-	/** */
-	String ATT_PROVIDES_SAVEABLES = "providesSaveables"; //$NON-NLS-1$
-	
-	/** */
-	String ATT_CONTENT_PROVIDER = "contentProvider"; //$NON-NLS-1$
-
-	/** */
-	String ATT_LABEL_PROVIDER = "labelProvider"; //$NON-NLS-1$
-
-	/** */
-	String ATT_VIEWER_FILTER = "viewerFilter"; //$NON-NLS-1$
-
-	/** */
-	String ATT_ACTION_PROVIDER = "actionProvider"; //$NON-NLS-1$  
-
-	/** */
-	String ATT_DEPENDS_ON = "dependsOn"; //$NON-NLS-1$	
-	
-	/** */
-	String ATT_OVERRIDES = "overrides"; //$NON-NLS-1$	
-	
-	/** */
-	String ATT_POLICY = "policy"; //$NON-NLS-1$
-	
-	/** */
-	String ATT_SUPPRESSED_EXT_ID = "suppressedExtensionId"; //$NON-NLS-1$  
-	
-	/** */
-	String ATT_MENU_GROUP_ID = "menuGroupId"; //$NON-NLS-1$
-	
-	/** */
-	String ATT_ASSOCIATED_EXTENSION_ID = "associatedExtensionId"; //$NON-NLS-1$
-
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/INavigatorSiteEditor.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/INavigatorSiteEditor.java
deleted file mode 100644
index 89a7658..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/INavigatorSiteEditor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import org.eclipse.ui.internal.navigator.TextActionHandler;
-
-
-/**
- * An INavigatorSiteEditor is used to edit (i.e., rename) elements in a NavigatorViewer.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * <p>
- * This interface is experimental and is subject to change.
- * </p>
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as part of a work in
- * progress. There is a guarantee neither that this API will work nor that it will remain the same.
- * Please do not use this API without consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- */
-public interface INavigatorSiteEditor {
-	/**
-	 * Starts the editing. An editor box will be overlaid on the selected element in the Navigator
-	 * tree.
-	 * 
-	 * @param runnable
-	 *            Runnable to execute when editing ends successfully
-	 */
-	public void edit(Runnable runnable);
-
-	/**
-	 * Returns the new text. Returns <code>null</code> if editing was cancelled. Editing is
-	 * cancelled when the user pressed the Escape key.
-	 * 
-	 * @return the new text or <code>null</code> if editing was cancelled
-	 */
-	public String getText();
-
-	/**
-	 * Set the text handler that handles cut, copy, paste, delete and select all operations within
-	 * the editor box.
-	 * 
-	 * @param actionHandler
-	 *            the text action handler
-	 */
-	public void setTextActionHandler(TextActionHandler actionHandler);
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/IViewerExtPtConstants.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/IViewerExtPtConstants.java
deleted file mode 100644
index f6d9eb1..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/IViewerExtPtConstants.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.extensions;
-
-/**
- * @since 3.2
- *
- */
-public interface IViewerExtPtConstants {
-
-	/** */
-	String TAG_SAVEABLES_PROVIDER_FACTORY = "saveablesProviderFactory"; //$NON-NLS-1$
-
-	/** */
-	String TAG_VIEWER = "viewer"; //$NON-NLS-1$
-	
-	/** */
-	String TAG_VIEWER_CONTENT_BINDING = "viewerContentBinding"; //$NON-NLS-1$
-
-	/** */
-	String TAG_VIEWER_ACTION_BINDING = "viewerActionBinding"; //$NON-NLS-1$
-
-	/** */
-	String TAG_POPUP_MENU = "popupMenu"; //$NON-NLS-1$ 
-
-	/** */
-	String TAG_OPTIONS = "options"; //$NON-NLS-1$ 
-
-	/** */
-	String TAG_PROPERTY = "property"; //$NON-NLS-1$
-	
-	/** */
-	String TAG_DRAG_ASSISTANT = "dragAssistant"; //$NON-NLS-1$
-
-	/** */
-	String ATT_ID = "id"; //$NON-NLS-1$
-
-	/** */
-	String ATT_ALLOWS_PLATFORM_CONTRIBUTIONS = "allowsPlatformContributions"; //$NON-NLS-1$
-
-	/** */
-	String TAG_INSERTION_POINT = "insertionPoint"; //$NON-NLS-1$
-
-	/** */
-	String ATT_NAME = "name"; //$NON-NLS-1$
-
-	/** */
-	String ATT_SEPARATOR = "separator"; //$NON-NLS-1$
-
-	/** */
-	String ATT_VIEWER_ID = "viewerId"; //$NON-NLS-1$
-
-	/** */
-	String ATT_POPUP_MENU_ID = "popupMenuId"; //$NON-NLS-1$
-
-	/** */
-	String ATT_VALUE = "value"; //$NON-NLS-1$
-	
-	/** */
-	String ATT_CLASS = "class"; //$NON-NLS-1$
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/LinkHelperDescriptor.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/LinkHelperDescriptor.java
deleted file mode 100644
index 060d359..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/LinkHelperDescriptor.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.extensions;
-
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.internal.navigator.CustomAndExpression;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.navigator.ILinkHelper;
-
-/**
- * Provides a wrapper around
- * <b>org.eclipse.ui.navigator.navigatorContent/linkHelper</b> extensions.
- * 
- * @since 3.2
- * 
- */
-public class LinkHelperDescriptor implements ILinkHelperExtPtConstants {
-
-	private final IConfigurationElement configElement;
-
-	private String id;
-
-	private Expression editorInputEnablement;
-
-	/* The following field may be null */
-	private Expression selectionEnablement;
-
-	private boolean hasLinkHelperFailedCreation;
-
-	/* package */LinkHelperDescriptor(IConfigurationElement aConfigElement) {
-		Assert.isNotNull(aConfigElement,
-				"LinkHelperRegistry.Descriptor objects cannot be null."); //$NON-NLS-1$
-		Assert
-				.isLegal(LINK_HELPER.equals(aConfigElement.getName()),
-						"LinkHelperRegistry.Descriptor objects must have the name \"linkHelper\"."); //$NON-NLS-1$
-		configElement = aConfigElement;
-		init();
-	}
-
-	void init() {
-		id = configElement.getAttribute(ATT_ID);
-		IConfigurationElement[] expressions = this.configElement
-				.getChildren(EDITOR_INPUT_ENABLEMENT);
-		Assert
-				.isLegal(
-						expressions.length == 1,
-						"The linkHelper extension point requires exactly one editorInputEnablement child."); //$NON-NLS-1$
-
-		editorInputEnablement = new CustomAndExpression(expressions[0]);
-
-		expressions = configElement.getChildren(SELECTION_ENABLEMENT);
-		if (expressions.length > 0) {
-			/* The following attribute is optional */
-			// navigatorContentExtensionId = expressions[0]
-			// .getAttribute(ATT_NAVIGATOR_CONTENT_EXTENSION_ID);
-			if (expressions[0].getChildren() != null
-					&& expressions[0].getChildren().length > 0) {
-
-				selectionEnablement = new CustomAndExpression(expressions[0]);
-
-			}
-		}
-	}
-
-	/**
-	 * @return Returns the id.
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * Create a link helper instance from this descriptors class attribute.
-	 * 
-	 * @return An instance of the helper that is defined by the extension, or a
-	 *         Skeleton Link Helper.
-	 */
-	public ILinkHelper createLinkHelper() {
-		if (hasLinkHelperFailedCreation)
-			return SkeletonLinkHelper.INSTANCE;
-		try {
-			return (ILinkHelper) configElement
-					.createExecutableExtension(ATT_CLASS);
-		} catch (Throwable t) {
-			hasLinkHelperFailedCreation = true;
-			NavigatorPlugin.logError(0, t.getMessage(), t);
-		}
-		return SkeletonLinkHelper.INSTANCE;
-	}
-
-	/**
-	 * 
-	 * @param anInput
-	 *            The editor input from the editor that was activated.
-	 * @return True if this linkHelper descriptor can produce a selection from
-	 *         the editor input.
-	 */
-	public boolean isEnabledFor(IEditorInput anInput) {
-
-		if (editorInputEnablement == null || anInput == null) {
-			return false;
-		}
-
-		try {
-			EvaluationContext context = new EvaluationContext(null, anInput);
-			context.setAllowPluginActivation(true);
-			return (editorInputEnablement.evaluate(context) == EvaluationResult.TRUE);
-		} catch (CoreException e) {
-			NavigatorPlugin.log(IStatus.ERROR, 0, e.getMessage(), e);
-		}
-		return false;
-	}
-
-	/**
-	 * @param anObject
-	 *            The selection from the CommonViewer
-	 * @return True if this dscriptor can determine a valid editor to activate
-	 *         from the selection.
-	 */
-	public boolean isEnabledFor(Object anObject) {
-		if (selectionEnablement == null) {
-			return false;
-		}
-
-		IEvaluationContext context = new EvaluationContext(null, anObject);
-		context.setAllowPluginActivation(true);
-		try {
-			if (selectionEnablement.evaluate(context) != EvaluationResult.TRUE) {
-				return false;
-			}
-		} catch (CoreException e) {
-			NavigatorPlugin.log(IStatus.ERROR, 0, e.getMessage(), e);
-			return false;
-		}
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/LinkHelperManager.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/LinkHelperManager.java
deleted file mode 100644
index e27b838..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/LinkHelperManager.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.extensions;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- * 
- */
-public class LinkHelperManager {
-
-	private static final LinkHelperManager instance = new LinkHelperManager();
-
-	private static final LinkHelperDescriptor[] NO_DESCRIPTORS = new LinkHelperDescriptor[0];
-
-	private List descriptors;
-
-	/**
-	 * @return the singleton instance.
-	 */
-	public static LinkHelperManager getInstance() {
-		return instance;
-	}
-
-	private LinkHelperManager() {
-		new LinkHelperRegistry().readRegistry();
-	}
-
-	/**
-	 * Return the link helper descriptors for a given selection and content
-	 * service.
-	 * 
-	 * @param anObject
-	 *            An object from the viewer.
-	 * @param aContentService
-	 *            The content service to use for visibility filtering. Link
-	 *            Helpers are filtered by contentExtension elements in
-	 *            viewerContentBindings.
-	 * @return An array of <i>visible</i> and <i>enabled</i> Link Helpers or
-	 *         an empty array.
-	 */
-	public LinkHelperDescriptor[] getLinkHelpersFor(
-			Object anObject,
-			INavigatorContentService aContentService) {
-
-		List helpersList = new ArrayList();
-		LinkHelperDescriptor descriptor = null;
-		for (Iterator itr = getDescriptors().iterator(); itr.hasNext();) {
-			descriptor = (LinkHelperDescriptor) itr.next();
-			if (aContentService.isVisible(descriptor.getId())
-					&& descriptor.isEnabledFor(anObject)) {
-				helpersList.add(descriptor);
-			}
-		}
-		if (helpersList.size() == 0) {
-			return NO_DESCRIPTORS;
-		}
-		return (LinkHelperDescriptor[]) helpersList
-				.toArray(new LinkHelperDescriptor[helpersList.size()]);
-
-	}
-
-	/**
-	 * Return the link helper descriptors for a given selection and content
-	 * service.
-	 * 
-	 * @param anInput
-	 *            The input of the active viewer.
-	 * @param aContentService
-	 *            The content service to use for visibility filtering. Link
-	 *            Helpers are filtered by contentExtension elements in
-	 *            viewerContentBindings.
-	 * @return An array of <i>visible</i> and <i>enabled</i> Link Helpers or
-	 *         an empty array.
-	 */
-	public LinkHelperDescriptor[] getLinkHelpersFor(IEditorInput anInput,
-			INavigatorContentService aContentService) {
-
-		List helpersList = new ArrayList();
-		LinkHelperDescriptor descriptor = null;
-		for (Iterator itr = getDescriptors().iterator(); itr.hasNext();) {
-			descriptor = (LinkHelperDescriptor) itr.next();
-			if (aContentService.isVisible(descriptor.getId())
-					&& descriptor.isEnabledFor(anInput)) {
-				helpersList.add(descriptor);
-			}
-		}
-		if (helpersList.size() == 0) {
-			return NO_DESCRIPTORS;
-		}
-		return (LinkHelperDescriptor[]) helpersList
-				.toArray(new LinkHelperDescriptor[helpersList.size()]);
-
-	}
-
-	protected List getDescriptors() {
-		if (descriptors == null) {
-			descriptors = new ArrayList();
-		}
-		return descriptors;
-	}
-
-	private class LinkHelperRegistry extends RegistryReader implements
-			ILinkHelperExtPtConstants {
-
-		private LinkHelperRegistry() {
-			super(NavigatorPlugin.PLUGIN_ID, LINK_HELPER);
-		}
-
-		public boolean readElement(IConfigurationElement element) {
-			if (LINK_HELPER.equals(element.getName())) {
-				try {
-					getDescriptors().add(new LinkHelperDescriptor(element));
-				} catch (Throwable e) {
-					String msg = e.getMessage() != null ? e.getMessage() : e.toString();
-					NavigatorPlugin.logError(0, msg, e);
-				}
-				return true;
-			}
-			return false;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/LinkHelperService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/LinkHelperService.java
deleted file mode 100644
index 64a6e4c..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/LinkHelperService.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.extensions;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-import org.eclipse.ui.navigator.ILinkHelper;
-
-/**
- * @since 3.2
- * 
- */
-public class LinkHelperService {
-
-	private static final ILinkHelper[] CANT_GET_NO_HELP = new ILinkHelper[0];
-
-	private NavigatorContentService contentService;
-
-	private final Map linkHelpers = new HashMap();
-
-	/**
-	 * @param aContentService
-	 *            The associated content service for this link helper service.
-	 */
-	public LinkHelperService(NavigatorContentService aContentService) {
-		contentService = aContentService;
-	}
-
-	/**
-	 * 
-	 * @param anObject
-	 *            An object from the viewer
-	 * @return An array of link helpers that know about elements in the
-	 *         selection or null
-	 */
-	public ILinkHelper[] getLinkHelpersFor(Object anObject) {
-
-		LinkHelperDescriptor[] descriptors = LinkHelperManager.getInstance()
-				.getLinkHelpersFor(anObject, contentService);
-		if (descriptors.length == 0) {
-			return CANT_GET_NO_HELP;
-		}
-
-		Set helpers = new LinkedHashSet();
-		for (int i = 0; i < descriptors.length; i++) {
-			helpers.add(getLinkHelper(descriptors[i]));
-		}
-		if (helpers.size() == 0)
-			return CANT_GET_NO_HELP;
-		return (ILinkHelper[]) helpers.toArray(new ILinkHelper[helpers.size()]);
-
-	}
-
-	/**
-	 * 
-	 * @param input
-	 *            The Editor input from the active viewer.
-	 * @return An array of link helpers that know about elements in the
-	 *         selection or null
-	 */
-	public ILinkHelper[] getLinkHelpersFor(IEditorInput input) {
-		LinkHelperDescriptor[] descriptors = LinkHelperManager.getInstance()
-				.getLinkHelpersFor(input, contentService);
-		if (descriptors.length == 0) {
-			return CANT_GET_NO_HELP;
-		}
-
-		Set helpers = new LinkedHashSet();
-		for (int i = 0; i < descriptors.length; i++) {
-			helpers.add(getLinkHelper(descriptors[i]));
-		}
-		if (helpers.size() == 0)
-			return CANT_GET_NO_HELP;
-		return (ILinkHelper[]) helpers.toArray(new ILinkHelper[helpers.size()]);
-	}
-
-	private ILinkHelper getLinkHelper(LinkHelperDescriptor descriptor) {
-		ILinkHelper helper = (ILinkHelper) linkHelpers.get(descriptor);
-		if (helper == null) {
-			synchronized (this) {
-				if (helper == null) {
-					linkHelpers.put(descriptor, helper = descriptor
-							.createLinkHelper());
-				}
-			}
-		}
-		return helper;
-	}
-	
-	/**
-	 * Return a selection that contains the elements that the given editor input 
-	 * represent.
-	 * @param input the editor input
-	 * @return a selection that contains the elements that the given editor input 
-	 * represent
-	 */
-	public IStructuredSelection getSelectionFor(IEditorInput input) {
-		ILinkHelper[] helpers = getLinkHelpersFor(input);
-
-		IStructuredSelection selection = StructuredSelection.EMPTY;
-		IStructuredSelection newSelection = StructuredSelection.EMPTY;
-
-		for (int i = 0; i < helpers.length; i++) {
-			selection = helpers[i].findSelection(input);
-			if (selection != null && !selection.isEmpty()) {
-				newSelection = mergeSelection(newSelection, selection);
-			}
-		}
-		return newSelection;
-	} 
-	
-	private IStructuredSelection mergeSelection(IStructuredSelection aBase,
-			IStructuredSelection aSelectionToAppend) {
-		if (aBase == null || aBase.isEmpty()) {
-			return (aSelectionToAppend != null) ? aSelectionToAppend
-					: StructuredSelection.EMPTY;
-		} else if (aSelectionToAppend == null || aSelectionToAppend.isEmpty()) {
-			return aBase;
-		} else {
-			List newItems = new ArrayList(aBase.toList());
-			newItems.addAll(aSelectionToAppend.toList());
-			return new StructuredSelection(newItems);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentDescriptor.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentDescriptor.java
deleted file mode 100644
index c8c7c9f..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentDescriptor.java
+++ /dev/null
@@ -1,461 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import java.util.Iterator;
-import java.util.Set;
-import java.util.TreeSet;
-
-import org.eclipse.core.expressions.ElementHandler;
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionConverter;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.IPluginContribution;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
-import org.eclipse.ui.internal.navigator.CustomAndExpression;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.navigator.ICommonContentProvider;
-import org.eclipse.ui.navigator.ICommonLabelProvider;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.OverridePolicy;
-import org.eclipse.ui.navigator.Priority;
-
-/**
- * Encapsulates the <code>org.eclipse.ui.navigator.navigatorContent</code>
- * extension point.
- * 
- * @since 3.2
- */
-public final class NavigatorContentDescriptor implements
-		INavigatorContentDescriptor, INavigatorContentExtPtConstants {
-
-	private static final int HASH_CODE_NOT_COMPUTED = -1;
-	private String id;
-
-	private String name;
-
-	private IConfigurationElement configElement;
-
-	private int priority = Priority.NORMAL_PRIORITY_VALUE;
-
-	private Expression enablement;
-
-	private Expression possibleChildren;
-
-	private String icon;
-
-	private boolean activeByDefault;
-
-	private IPluginContribution contribution;
-
-	private Set overridingExtensions;
-
-	private OverridePolicy overridePolicy;
-
-	private String suppressedExtensionId;
-
-	private INavigatorContentDescriptor overriddenDescriptor;
-
-	private int hashCode = HASH_CODE_NOT_COMPUTED;
-
-	private boolean providesSaveables;
-
-	/**
-	 * Creates a new content descriptor from a configuration element.
-	 * 
-	 * @param configElement
-	 *            configuration element to create a descriptor from
-	 * 
-	 * @throws WorkbenchException
-	 *             if the configuration element could not be parsed. Reasons
-	 *             include:
-	 *             <ul>
-	 *             <li>A required attribute is missing.</li>
-	 *             <li>More elements are define than is allowed.</li>
-	 *             </ul>
-	 */
-	/* package */ NavigatorContentDescriptor(IConfigurationElement configElement)
-			throws WorkbenchException {
-		super();
-		this.configElement = configElement;
-		init();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.navigator.extensions.INavigatorContentDescriptor#getId()
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.navigator.extensions.INavigatorContentDescriptor#getName()
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.navigator.extensions.INavigatorContentDescriptor#getPriority()
-	 */
-	public int getPriority() {
-		return priority;
-	}
-
-	/**
-	 * Parses the configuration element.
-	 * 
-	 * @throws WorkbenchException
-	 *             if the configuration element could not be parsed. Reasons
-	 *             include:
-	 *             <ul>
-	 *             <li>A required attribute is missing.</li>
-	 *             <li>More elements are define than is allowed.</li>
-	 *             </ul>
-	 */
-	private void init() throws WorkbenchException {
-		id = configElement.getAttribute(ATT_ID);
-		name = configElement.getAttribute(ATT_NAME);
-		String priorityString = configElement.getAttribute(ATT_PRIORITY);
-		icon = configElement.getAttribute(ATT_ICON);
-
-		String activeByDefaultString = configElement
-				.getAttribute(ATT_ACTIVE_BY_DEFAULT);
-		activeByDefault = (activeByDefaultString != null && activeByDefaultString
-				.length() > 0) ? Boolean.valueOf(
-				configElement.getAttribute(ATT_ACTIVE_BY_DEFAULT))
-				.booleanValue() : true;
-
-		String providesSaveablesString = configElement
-			.getAttribute(ATT_PROVIDES_SAVEABLES);
-		providesSaveables = (providesSaveablesString != null && providesSaveablesString
-				.length() > 0) ? Boolean.valueOf(providesSaveablesString)
-						.booleanValue() : false;
-
-		if (priorityString != null) {
-			try {
-				Priority p = Priority.get(priorityString);
-				priority = p != null ? p.getValue()
-						: Priority.NORMAL_PRIORITY_VALUE;
-			} catch (NumberFormatException exception) {
-				priority = Priority.NORMAL_PRIORITY_VALUE;
-			}
-		}
-		if (id == null) {
-			throw new WorkbenchException(NLS.bind(
-					CommonNavigatorMessages.Attribute_Missing_Warning,
-					new Object[] {
-							ATT_ID,
-							id,
-							configElement.getDeclaringExtension()
-									.getNamespaceIdentifier() }));
-		}
-
-		IConfigurationElement[] children = configElement
-				.getChildren(TAG_ENABLEMENT);
-		if (children.length == 0) {
-
-			children = configElement.getChildren(TAG_TRIGGER_POINTS);
-			if (children.length == 1) {
-				enablement = new CustomAndExpression(children[0]);
-			} else {
-				throw new WorkbenchException(NLS.bind(
-						CommonNavigatorMessages.Attribute_Missing_Warning,
-						new Object[] {
-								TAG_TRIGGER_POINTS,
-								id,
-								configElement.getDeclaringExtension()
-										.getNamespaceIdentifier() }));
-			}
-
-			children = configElement.getChildren(TAG_POSSIBLE_CHILDREN);
-			if (children.length == 1) {
-				possibleChildren = new CustomAndExpression(children[0]);
-			} else if(children.length > 1){
-				throw new WorkbenchException(NLS.bind(
-						CommonNavigatorMessages.Attribute_Missing_Warning,
-						new Object[] {
-								TAG_POSSIBLE_CHILDREN,
-								id,
-								configElement.getDeclaringExtension()
-										.getNamespaceIdentifier() }));
-			}
-		} else if (children.length == 1) {
-			try {
-				enablement = ElementHandler.getDefault().create(
-						ExpressionConverter.getDefault(), children[0]);
-			} catch (CoreException e) {
-				NavigatorPlugin.log(IStatus.ERROR, 0, e.getMessage(), e);
-			}
-		} else if (children.length > 1) {
-			throw new WorkbenchException(NLS.bind(
-					CommonNavigatorMessages.Attribute_Missing_Warning,
-					new Object[] {
-							TAG_ENABLEMENT,
-							id,
-							configElement.getDeclaringExtension()
-									.getNamespaceIdentifier() }));
-		}
-
-		contribution = new IPluginContribution() {
-
-			public String getLocalId() {
-				return getId();
-			}
-
-			public String getPluginId() {
-				return configElement.getDeclaringExtension().getNamespaceIdentifier();
-			}
-
-		};
-
-		children = configElement.getChildren(TAG_OVERRIDE);
-		if (children.length == 1) {
-			suppressedExtensionId = children[0]
-					.getAttribute(ATT_SUPPRESSED_EXT_ID);
-			overridePolicy = OverridePolicy.get(children[0]
-					.getAttribute(ATT_POLICY));
-		}
-	}
-
-	/**
-	 * @return Returns the icon.
-	 */
-	public String getIcon() {
-		return icon;
-	}
-
-	/**
-	 * @return Returns the suppressedExtensionId or null if none specified.
-	 */
-	public String getSuppressedExtensionId() {
-		return suppressedExtensionId;
-	}
-
-	/**
-	 * @return Returns the overridePolicy or null if this extension does not
-	 *         override another extension.
-	 */
-	public OverridePolicy getOverridePolicy() {
-		return overridePolicy;
-	}
-
-	/**
-	 * @return Returns the contribution.
-	 */
-	public IPluginContribution getContribution() {
-		return contribution;
-	}
-
-	/**
-	 * The content provider could be an instance of
-	 * {@link ICommonContentProvider}, but only {@link ITreeContentProvider} is
-	 * required.
-	 * 
-	 * 
-	 * @return An instance of the Content provider defined for this extension.
-	 * @throws CoreException
-	 *             if an instance of the executable extension could not be
-	 *             created for any reason
-	 * 
-	 */
-	public ITreeContentProvider createContentProvider() throws CoreException {
-		return (ITreeContentProvider) configElement
-				.createExecutableExtension(ATT_CONTENT_PROVIDER);
-	}
-
-	/**
-	 * 
-	 * The content provider could be an instance of {@link ICommonLabelProvider},
-	 * but only {@link ILabelProvider} is required.
-	 * 
-	 * @return An instance of the Label provider defined for this extension
-	 * @throws CoreException
-	 *             if an instance of the executable extension could not be
-	 *             created for any reason
-	 */
-	public ILabelProvider createLabelProvider() throws CoreException {
-		return (ILabelProvider) configElement
-				.createExecutableExtension(ATT_LABEL_PROVIDER);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.navigator.extensions.INavigatorContentDescriptor#isEnabledByDefault()
-	 */
-	public boolean isActiveByDefault() {
-		return activeByDefault;
-	}
-
-	/**
-	 * Determine if this content extension would be able to provide children for
-	 * the given element.
-	 * 
-	 * @param anElement
-	 *            The element that should be used for the evaluation.
-	 * @return True if and only if the extension is enabled for the element.
-	 */
-	public boolean isTriggerPoint(Object anElement) {
-
-		if (enablement == null || anElement == null) {
-			return false;
-		}
-
-		try {
-			EvaluationContext context = new EvaluationContext(null, anElement);
-			context.setAllowPluginActivation(true);
-			return (enablement.evaluate(context) == EvaluationResult.TRUE);
-		} catch (CoreException e) {
-			NavigatorPlugin.logError(0, e.getMessage(), e);
-		}
-		return false;
-	}
-
-	/**
-	 * Determine if this content extension could provide the given element as a
-	 * child.
-	 * 
-	 * <p>
-	 * This method is used to determine what the parent of an element could be
-	 * for Link with Editor support.
-	 * </p>
-	 * 
-	 * @param anElement
-	 *            The element that should be used for the evaluation.
-	 * @return True if and only if the extension might provide an object of this
-	 *         type as a child.
-	 */
-	public boolean isPossibleChild(Object anElement) {
-
-		if ((enablement == null && possibleChildren == null)
-				|| anElement == null) {
-			return false;
-		} else if(anElement instanceof IStructuredSelection) {
-			return arePossibleChildren((IStructuredSelection) anElement);
-		}
-
-		try {
-			EvaluationContext context = new EvaluationContext(null, anElement);
-			context.setAllowPluginActivation(true);
-			if (possibleChildren != null) {
-				return (possibleChildren.evaluate(context) == EvaluationResult.TRUE);
-			} else if (enablement != null) {
-				return (enablement.evaluate(context) == EvaluationResult.TRUE);
-			}
-		} catch (CoreException e) {
-			NavigatorPlugin.logError(0, e.getMessage(), e);
-		}
-		return false;
-	}
-	
-	/**
-	 * A convenience method to check all elements in a selection. 
-	 * 
-	 * @param aSelection A non-null selection
-	 * @return True if and only if every element in the selection is a possible child.
-	 */
-	public boolean arePossibleChildren(IStructuredSelection aSelection) {
-		if(aSelection.isEmpty()) {
-			return false;
-		}
-		for (Iterator iter = aSelection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if(!isPossibleChild(element)) {
-				return false;
-			}			
-		}
-		return true;
-	}
-
-	/**
-	 * 
-	 * Does not force the creation of the set of overriding extensions.
-	 * 
-	 * @return True if this extension has overridding extensions.
-	 */
-	public boolean hasOverridingExtensions() {
-		return overridingExtensions != null && overridingExtensions.size() > 0;
-	}
-
-	/**
-	 * @return The set of overriding extensions (of type
-	 *         {@link INavigatorContentDescriptor}
-	 */
-	public Set getOverriddingExtensions() {
-		if (overridingExtensions == null) {
-			overridingExtensions = new TreeSet(ExtensionPriorityComparator.DESCENDING);
-		}
-		return overridingExtensions;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "Content[" + id + ", \"" + name + "\"]"; //$NON-NLS-1$ //$NON-NLS-2$//$NON-NLS-3$
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		if (hashCode == HASH_CODE_NOT_COMPUTED) {
-			String hashCodeString = configElement.getNamespaceIdentifier() + getId();
-			hashCode = hashCodeString.hashCode();
-			if (hashCode == HASH_CODE_NOT_COMPUTED)
-				hashCode++;
-		}
-		return hashCode;
-	}
-
-	/**
-	 * @return The descriptor of the <code>suppressedExtensionId</code> if
-	 *         non-null.
-	 */
-	public INavigatorContentDescriptor getOverriddenDescriptor() {
-		return overriddenDescriptor;
-	}
-
-	/**
-	 * @param theOverriddenDescriptor
-	 *            The overriddenDescriptor to set.
-	 */
-	/* package */void setOverriddenDescriptor(
-			INavigatorContentDescriptor theOverriddenDescriptor) {
-		overriddenDescriptor = theOverriddenDescriptor;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.INavigatorContentDescriptor#hasSaveablesProvider()
-	 */
-	public boolean hasSaveablesProvider() {
-		return providesSaveables;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentDescriptorManager.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentDescriptorManager.java
deleted file mode 100644
index cc96f1a..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentDescriptorManager.java
+++ /dev/null
@@ -1,516 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import java.lang.ref.SoftReference;
-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 java.util.TreeSet;
-import java.util.WeakHashMap;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.Policy;
-import org.eclipse.ui.internal.navigator.VisibilityAssistant;
-import org.eclipse.ui.internal.navigator.VisibilityAssistant.VisibilityListener;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.OverridePolicy;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * @since 3.2
- */
-public class NavigatorContentDescriptorManager {
-
-	private static final NavigatorContentDescriptorManager INSTANCE = new NavigatorContentDescriptorManager();
- 
-	private final Map firstClassDescriptorsMap = new HashMap();
-
-	private final Map allDescriptors = new HashMap();
-
-	private class EvaluationCache implements VisibilityListener {
-
-		private final Map evaluations/*<Object, NavigatorContentDescriptor[]>*/ = new HashMap();
-		private final Map evaluationsWithOverrides/*<Object, NavigatorContentDescriptor[]>*/ = new HashMap();
-
-		EvaluationCache(VisibilityAssistant anAssistant) {
-			anAssistant.addListener(this);
-		}
-
-		protected final NavigatorContentDescriptor[] getDescriptors(Object anElement) {
-			return getDescriptors(anElement, true);
-		}
-
-		protected final void setDescriptors(Object anElement, NavigatorContentDescriptor[] theDescriptors) {
-			setDescriptors(anElement, theDescriptors, true);		
-		}
-		
-		protected final NavigatorContentDescriptor[] getDescriptors(Object anElement, boolean toComputeOverrides) {
-			
-			if(anElement == null)
-				return null;
-			
-			NavigatorContentDescriptor[] cachedDescriptors = null;
-			if(toComputeOverrides) {
-				SoftReference cache = (SoftReference) evaluations.get(anElement);
-				if( cache != null && (cachedDescriptors = (NavigatorContentDescriptor[]) cache.get()) == null) 
-					evaluations.remove(anElement);
-				return cachedDescriptors;
-			}
-			SoftReference cache = (SoftReference) evaluationsWithOverrides.get(anElement);
-			if( cache != null && (cachedDescriptors = (NavigatorContentDescriptor[]) cache.get()) == null) 
-				evaluationsWithOverrides.remove(anElement);
-			return cachedDescriptors;
-			 
-		}
-
-		protected final void setDescriptors(Object anElement, NavigatorContentDescriptor[] theDescriptors, boolean toComputeOverrides) {
-			if(anElement != null) {
-				if(toComputeOverrides)
-					evaluations.put(new EvalutationReference(anElement), new SoftReference(theDescriptors));
-				else 
-					evaluationsWithOverrides.put(new EvalutationReference(anElement), new SoftReference(theDescriptors));
-			}
-		}
-	  
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.navigator.VisibilityAssistant.VisibilityListener#onVisibilityOrActivationChange()
-		 */
-		public void onVisibilityOrActivationChange() {
-			evaluations.clear();
-			evaluationsWithOverrides.clear();
-		}
-	}
-
-	/* Map of (VisibilityAssistant, EvaluationCache)-pairs */
-	private final Map cachedTriggerPointEvaluations = new WeakHashMap();
-
-	/* Map of (VisibilityAssistant, EvaluationCache)-pairs */
-	private final Map cachedPossibleChildrenEvaluations = new WeakHashMap();
-
-	private ImageRegistry imageRegistry;
-
-	private final Set overridingDescriptors = new HashSet();
-
-	private final Set saveablesProviderDescriptors = new HashSet();
-	
-	private final Set firstClassDescriptorsSet = new HashSet();
-
-	/**
-	 * @return the singleton instance of the manager
-	 */
-	public static NavigatorContentDescriptorManager getInstance() {
-		return INSTANCE;
-	}
-
-	private NavigatorContentDescriptorManager() {
-		new NavigatorContentDescriptorRegistry().readRegistry();
-	}
-
-	/**
-	 * 
-	 * @return Returns all content descriptor(s).
-	 */
-	public NavigatorContentDescriptor[] getAllContentDescriptors() {
-		NavigatorContentDescriptor[] finalDescriptors = new NavigatorContentDescriptor[allDescriptors
-				.size()];
-		finalDescriptors = (NavigatorContentDescriptor[]) allDescriptors.values().toArray(finalDescriptors);
-		Arrays.sort(finalDescriptors, ExtensionPriorityComparator.INSTANCE);
-		return finalDescriptors;
-	}
-
-	/**
-	 * 
-	 * @return Returns all content descriptors that provide saveables.
-	 */
-	public NavigatorContentDescriptor[] getContentDescriptorsWithSaveables() {
-		NavigatorContentDescriptor[] finalDescriptors = new NavigatorContentDescriptor[saveablesProviderDescriptors
-		                                                                               .size()];
-		saveablesProviderDescriptors.toArray(finalDescriptors);
-		Arrays.sort(finalDescriptors, ExtensionPriorityComparator.INSTANCE);
-		return finalDescriptors;
-	}
-	
-	/**
-	 * 
-	 * Returns all content descriptor(s) which enable for the given element.
-	 * 
-	 * @param anElement
-	 *            the element to return the best content descriptor for
-	 * 
-	 * @param aVisibilityAssistant
-	 *            The relevant viewer assistant; used to filter out unbound
-	 *            content descriptors.
-	 * @return the best content descriptor for the given element.
-	 */
-	public Set findDescriptorsForTriggerPoint(Object anElement,
-			VisibilityAssistant aVisibilityAssistant) {
-		EvaluationCache cache = getEvaluationCache(
-				cachedTriggerPointEvaluations, aVisibilityAssistant);
-
-		Set descriptors = new TreeSet(ExtensionPriorityComparator.INSTANCE);
-		NavigatorContentDescriptor[] cachedDescriptors = null;
-		if ( (cachedDescriptors = cache.getDescriptors(anElement)) != null) {
-			descriptors.addAll(Arrays.asList(cachedDescriptors));
-		} 
-
-	 	/* Find other ContentProviders which enable for this object */
-		for (Iterator contentDescriptorsItr = firstClassDescriptorsMap.values()
-				.iterator(); contentDescriptorsItr.hasNext();) {
-			NavigatorContentDescriptor descriptor = (NavigatorContentDescriptor) contentDescriptorsItr
-					.next();
-
-			if (aVisibilityAssistant.isActive(descriptor)
-					&& aVisibilityAssistant.isVisible(descriptor)
-					&& descriptor.isTriggerPoint(anElement)) {
-				descriptors.add(descriptor);
-			}
-		}
-
-		cache.setDescriptors(anElement, (NavigatorContentDescriptor[]) descriptors.toArray(new NavigatorContentDescriptor[descriptors.size()]));
-
-		return descriptors;
-	}
-
-	private EvaluationCache getEvaluationCache(Map anEvaluationMap,
-			VisibilityAssistant aVisibilityAssistant) {
-		EvaluationCache c = (EvaluationCache) anEvaluationMap
-				.get(aVisibilityAssistant);
-		if (c == null) {
-			anEvaluationMap.put(aVisibilityAssistant, c = new EvaluationCache(
-					aVisibilityAssistant));
-		}
-		return c;
-
-	}
-	
-	/**
-	 * 
-	 * Returns all content descriptor(s) which enable for the given element.
-	 * 
-	 * @param anElement
-	 *            the element to return the best content descriptor for
-	 * 
-	 * @param aVisibilityAssistant
-	 *            The relevant viewer assistant; used to filter out unbound
-	 *            content descriptors.
-	 * @return the best content descriptor for the given element.
-	 */
-	public Set findDescriptorsForPossibleChild(Object anElement,
-			VisibilityAssistant aVisibilityAssistant) {
-		return findDescriptorsForPossibleChild(anElement, aVisibilityAssistant, true);
-	}
-
-	/**
-	 * 
-	 * Returns all content descriptor(s) which enable for the given element.
-	 * 
-	 * @param anElement
-	 *            the element to return the best content descriptor for
-	 * 
-	 * @param aVisibilityAssistant
-	 *            The relevant viewer assistant; used to filter out unbound
-	 *            content descriptors.
-	 * @param toComputeOverrides
-	 * @return the best content descriptor for the given element.
-	 */
-	public Set findDescriptorsForPossibleChild(Object anElement,
-			VisibilityAssistant aVisibilityAssistant, boolean toComputeOverrides) {
-
-		EvaluationCache cache = getEvaluationCache(
-				cachedPossibleChildrenEvaluations, aVisibilityAssistant);
-		
-		Set descriptors = new TreeSet(ExtensionPriorityComparator.INSTANCE);
-		NavigatorContentDescriptor[] cachedDescriptors = null;
-		if ( (cachedDescriptors = cache.getDescriptors(anElement, toComputeOverrides)) != null) {
-			descriptors.addAll(Arrays.asList(cachedDescriptors));
-		} 
-		
-		if(toComputeOverrides) {
-			addDescriptorsForPossibleChild(anElement, firstClassDescriptorsSet,
-				aVisibilityAssistant, descriptors);
-			if (Policy.DEBUG_RESOLUTION) {
-				System.out.println("Find descriptors for: (" + anElement+//$NON-NLS-1$
-						"): " + descriptors); //$NON-NLS-1$
-			}
-		} else {
-
-			NavigatorContentDescriptor descriptor;
-			/* Find other ContentProviders which enable for this object */
-			for (Iterator contentDescriptorsItr = allDescriptors.values().iterator(); contentDescriptorsItr
-					.hasNext();) {
-				descriptor = (NavigatorContentDescriptor) contentDescriptorsItr
-						.next();
-
-				boolean isApplicable = aVisibilityAssistant.isActive(descriptor)
-						&& aVisibilityAssistant.isVisible(descriptor)
-						&& descriptor.isPossibleChild(anElement);
-
-				 if (isApplicable) {
-					descriptors.add(descriptor);
-				}
-
-			}
-		} 
-		cache.setDescriptors(anElement, (NavigatorContentDescriptor[]) descriptors.toArray(new NavigatorContentDescriptor[descriptors.size()]), toComputeOverrides);
-
-		return descriptors;
-	}
-
-	private boolean addDescriptorsForPossibleChild(Object anElement,
-			Set theChildDescriptors, VisibilityAssistant aVisibilityAssistant,
-			Set theFoundDescriptors) {
-		int initialSize = theFoundDescriptors.size();
-
-		NavigatorContentDescriptor descriptor;
-		/* Find other ContentProviders which enable for this object */
-		for (Iterator contentDescriptorsItr = theChildDescriptors.iterator(); contentDescriptorsItr
-				.hasNext();) {
-			descriptor = (NavigatorContentDescriptor) contentDescriptorsItr
-					.next();
-
-			boolean isApplicable = aVisibilityAssistant.isActive(descriptor)
-					&& aVisibilityAssistant.isVisible(descriptor)
-					&& descriptor.isPossibleChild(anElement);
-
-			if (descriptor.hasOverridingExtensions()) {
-
-				boolean isOverridden;
-
-				boolean oldWay = true;
-				if (oldWay) {
-					isOverridden = addDescriptorsForPossibleChild(anElement,
-							descriptor.getOverriddingExtensions(),
-							aVisibilityAssistant, theFoundDescriptors);
-
-					if (!isOverridden && isApplicable) {
-						theFoundDescriptors.add(descriptor);
-					}
-				} else {
-					// Part of the proposed solution for bug 252293, will turn
-					// this on when testing is completed
-					Set overridingDescriptors = new TreeSet(
-							ExtensionPriorityComparator.INSTANCE);
-					isOverridden = addDescriptorsForPossibleChild(anElement,
-							descriptor.getOverriddingExtensions(),
-							aVisibilityAssistant, overridingDescriptors);
-
-					if (!isOverridden && isApplicable) {
-						theFoundDescriptors.add(descriptor);
-					} else if (isOverridden) {
-						theFoundDescriptors.addAll(overridingDescriptors);
-					}
-				}
-
-			} else if (isApplicable) {
-				theFoundDescriptors.add(descriptor);
-			}
-
-		}
-		return initialSize < theFoundDescriptors.size();
-
-	}
-
-	/**
-	 * Returns the navigator content descriptor with the given id.
-	 * 
-	 * @param id
-	 *            The id of the content descriptor that should be returned
-	 * @return The content descriptor of the given id
-	 */
-	public NavigatorContentDescriptor getContentDescriptor(String id) {
-		return (NavigatorContentDescriptor) allDescriptors.get(id);
-	}
-
-	/**
-	 * 
-	 * @param descriptorId
-	 *            The unique id of a particular descriptor
-	 * @return The name (value of the 'name' attribute) of the given descriptor
-	 */
-	public String getText(String descriptorId) {
-		INavigatorContentDescriptor descriptor = getContentDescriptor(descriptorId);
-		if (descriptor != null) {
-			return descriptor.getName();
-		}
-		return descriptorId;
-	}
-
-	/**
-	 * 
-	 * @param descriptorId
-	 *            The unique id of a particular descriptor
-	 * @return The image (corresponding to the value of the 'icon' attribute) of
-	 *         the given descriptor
-	 */
-	public Image getImage(String descriptorId) {
-		return retrieveAndStoreImage(descriptorId);
-	}
-
-	protected Image retrieveAndStoreImage(String descriptorId) {
-		NavigatorContentDescriptor contentDescriptor = getContentDescriptor(descriptorId);
-
-		Image image = null;
-		if (contentDescriptor != null) {
-			String icon = contentDescriptor.getIcon();
-			if (icon != null) {
-				image = getImageRegistry().get(icon);
-				if (image == null || image.isDisposed()) {
-					ImageDescriptor imageDescriptor = AbstractUIPlugin
-							.imageDescriptorFromPlugin(contentDescriptor
-									.getContribution().getPluginId(), icon);
-					if (imageDescriptor != null) {
-						image = imageDescriptor.createImage();
-						if (image != null) {
-							getImageRegistry().put(icon, image);
-						}
-					}
-				}
-			}
-		}
-		return image;
-	}
-
-	/**
-	 * @param desc
-	 */
-	private void addNavigatorContentDescriptor(NavigatorContentDescriptor desc) {
-		if (desc == null) {
-			return;
-		}
-		synchronized (firstClassDescriptorsMap) {
-			if (firstClassDescriptorsMap.containsKey(desc.getId())) {
-				NavigatorPlugin
-						.logError(
-								0,
-								"An extension already exists with id \"" + desc.getId() + "\".", null); //$NON-NLS-1$ //$NON-NLS-2$
-			} else {
-				if (desc.getSuppressedExtensionId() == null) {
-					firstClassDescriptorsMap.put(desc.getId(), desc);
-					firstClassDescriptorsSet.add(desc);
-					if (Policy.DEBUG_EXTENSION_SETUP) {
-						System.out.println("First class descriptor: " + desc); //$NON-NLS-1$
-					}
-				} else {
-					overridingDescriptors.add(desc);
-					if (Policy.DEBUG_EXTENSION_SETUP) {
-						System.out.println("Overriding descriptor: " + desc); //$NON-NLS-1$
-					}
-				}
-				allDescriptors.put(desc.getId(), desc);
-				if (desc.hasSaveablesProvider()) {
-					saveablesProviderDescriptors.add(desc);
-					if (Policy.DEBUG_EXTENSION_SETUP) {
-						System.out.println("Saveables provider descriptor: " + desc); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void computeOverrides() {
-		if (overridingDescriptors.size() > 0) {
-			NavigatorContentDescriptor descriptor;
-			NavigatorContentDescriptor overriddenDescriptor;
-			for (Iterator overridingIterator = overridingDescriptors.iterator(); overridingIterator
-					.hasNext();) {
-				descriptor = (NavigatorContentDescriptor) overridingIterator
-						.next();
-				overriddenDescriptor = (NavigatorContentDescriptor) allDescriptors
-						.get(descriptor.getSuppressedExtensionId());
-				if (overriddenDescriptor != null) {
-
-					if (Policy.DEBUG_EXTENSION_SETUP) {
-						System.out.println(descriptor + " overrides: " + overriddenDescriptor); //$NON-NLS-1$
-					}
-					/*
-					 * add the descriptor as an overriding extension for its
-					 * suppressed extension
-					 */
-					overriddenDescriptor.getOverriddingExtensions().add(
-							descriptor);
-					descriptor.setOverriddenDescriptor(overriddenDescriptor);
-					/*
-					 * the always policy implies this is also a top-level
-					 * extension
-					 */
-					if (descriptor.getOverridePolicy() == OverridePolicy.InvokeAlwaysRegardlessOfSuppressedExt) {
-						if (Policy.DEBUG_EXTENSION_SETUP) {
-							System.out.println(descriptor + " is first class"); //$NON-NLS-1$
-						}
-						firstClassDescriptorsMap.put(descriptor.getId(),
-								descriptor);
-						firstClassDescriptorsSet.add(descriptor);
-					}
-
-				} else {
-					NavigatorPlugin.logError(0,
-							"Invalid suppressedExtensionId (\"" //$NON-NLS-1$
-									+ descriptor.getSuppressedExtensionId()
-									+ "\" specified from " //$NON-NLS-1$
-									+ descriptor.getContribution()
-											.getPluginId()
-									+ ". No extension with matching id found.", //$NON-NLS-1$
-							null);
-				}
-			}
-		}
-	}
- 
-	private ImageRegistry getImageRegistry() {
-		if (imageRegistry == null) {
-			imageRegistry = new ImageRegistry();
-		}
-		return imageRegistry;
-	}
-
-	private class NavigatorContentDescriptorRegistry extends
-			NavigatorContentRegistryReader {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.navigator.extensions.RegistryReader#readRegistry()
-		 */
-		public void readRegistry() {
-			super.readRegistry();
-			computeOverrides();
-		}
-
-		protected boolean readElement(IConfigurationElement anElement) {
-			if (TAG_NAVIGATOR_CONTENT.equals(anElement.getName())) {
-				try {
-					addNavigatorContentDescriptor(new NavigatorContentDescriptor(
-							anElement));
-
-				} catch (WorkbenchException e) {
-					// log an error since its not safe to open a dialog here
-					NavigatorPlugin.log(e.getStatus());
-				}
-			}
-			return super.readElement(anElement);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentExtension.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentExtension.java
deleted file mode 100644
index 749c52b..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentExtension.java
+++ /dev/null
@@ -1,439 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.Policy;
-import org.eclipse.ui.navigator.ICommonContentProvider;
-import org.eclipse.ui.navigator.ICommonLabelProvider;
-import org.eclipse.ui.navigator.IExtensionStateModel;
-import org.eclipse.ui.navigator.IMementoAware;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentExtension;
-
-/**
- * 
- * @since 3.2
- */
-public class NavigatorContentExtension implements IMementoAware,
-		INavigatorContentExtension {
-
-	private static final NavigatorContentExtension[] NO_EXTENSIONS = new NavigatorContentExtension[0];
-
-	private NavigatorContentService contentService;
-
-	private NavigatorContentDescriptor descriptor;
-
-	private ICommonContentProvider contentProvider;
-
-	private ICommonLabelProvider labelProvider;
-
-	private boolean labelProviderInitializationFailed = false;
-
-	private boolean contentProviderInitializationFailed = false;
-
-	private boolean isDisposed = false;
-
-	private IMemento appliedMemento;
-
-	private StructuredViewerManager viewerManager;
-
-	/**
-	 * Create an object to manage the instantiated elements from the extension.
-	 * 
-	 * @param aDescriptor
-	 *            The descriptor that knows how to create elements and knows the
-	 *            id of the extension
-	 * @param aContentService
-	 *            The content service that will manage this extension
-	 * @param aViewerManager
-	 *            The viewer manager that knows how to initialize the content
-	 *            provider created by this extension.
-	 */
-	public NavigatorContentExtension(NavigatorContentDescriptor aDescriptor,
-			NavigatorContentService aContentService,
-			StructuredViewerManager aViewerManager) {
-		super();
-		Assert.isNotNull(aDescriptor);
-
-		descriptor = aDescriptor;
-		contentService = aContentService;
-		viewerManager = aViewerManager;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtension
-	 * #getId()
-	 */
-	public String getId() {
-		return descriptor.getId();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtension
-	 * #getDescriptor()
-	 */
-	public INavigatorContentDescriptor getDescriptor() {
-		return descriptor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.navigator.INavigatorContentExtension#getContentProvider()
-	 */
-	public ITreeContentProvider getContentProvider() {
-
-		ITreeContentProvider provider = internalGetContentProvider();
-		if (provider != SkeletonTreeContentProvider.INSTANCE) {
-			return ((SafeDelegateTreeContentProvider) provider)
-					.getDelegateContentProvider();
-		}
-		return provider;
-	}
-
-	/**
-	 * 
-	 * @return The internal content provider that is wrapped by this extension.
-	 */
-	public ITreeContentProvider internalGetContentProvider() {
-		if (contentProvider != null || contentProviderInitializationFailed) {
-			return contentProvider;
-		}
-		synchronized (this) {
-			try {
-				if (contentProvider == null) {
-					ITreeContentProvider treeContentProvider = descriptor
-							.createContentProvider();
-					if (treeContentProvider != null) {
-						contentProvider = new SafeDelegateTreeContentProvider(
-								treeContentProvider, descriptor, contentService);
-						contentProvider.init(new CommonContentExtensionSite(
-								getId(), contentService, appliedMemento));
-						viewerManager.initialize(contentProvider);
-					} else {
-						contentProvider = SkeletonTreeContentProvider.INSTANCE;
-					}
-				}
-			} catch (CoreException e) {
-				contentProviderInitializationFailed = true;
-				e.printStackTrace();
-			} catch (RuntimeException e) {
-				contentProviderInitializationFailed = true;
-				e.printStackTrace();
-			}
-			if (contentProviderInitializationFailed) {
-				contentProvider = SkeletonTreeContentProvider.INSTANCE;
-			}
-		}
-		return contentProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtension
-	 * #getLabelProvider()
-	 */
-	public ICommonLabelProvider getLabelProvider() {
-		if (labelProvider != null || labelProviderInitializationFailed) {
-			return labelProvider;
-		}
-		synchronized (this) {
-			try {
-
-				if (labelProvider == null) {
-					ILabelProvider tempLabelProvider = descriptor
-							.createLabelProvider();
-
-					if (tempLabelProvider instanceof ICommonLabelProvider) {
-						labelProvider = (ICommonLabelProvider) tempLabelProvider;
-						labelProvider.init(new CommonContentExtensionSite(
-								getId(), contentService, appliedMemento));
-					} else {
-						labelProvider = new SafeDelegateCommonLabelProvider(
-								tempLabelProvider);
-					}
-
-					labelProvider
-							.addListener((ILabelProviderListener) contentService
-									.createCommonLabelProvider());
-				}
-			} catch (CoreException e) {
-				labelProviderInitializationFailed = true;
-				e.printStackTrace();
-			} catch (RuntimeException e) {
-				labelProviderInitializationFailed = true;
-				e.printStackTrace();
-			}
-
-			if (labelProviderInitializationFailed) {
-				labelProvider = SkeletonLabelProvider.INSTANCE;
-			}
-		}
-		return labelProvider;
-	}
-
-	/**
-	 * Dispose of any resources acquired during the lifecycle of the extension.
-	 * 
-	 */
-	public void dispose() {
-		try {
-			synchronized (this) {
-
-				SafeRunner.run(new ISafeRunnable() {
-
-					public void handleException(Throwable exception) {
-						String msg = exception.getMessage() != null ? exception
-								.getMessage() : exception.toString();
-						NavigatorPlugin.logError(0, msg, exception);
-
-					}
-
-					public void run() throws Exception {
-						if (contentProvider != null) {
-							contentProvider.dispose();
-						}
-
-					}
-
-				});
-
-				SafeRunner.run(new ISafeRunnable() {
-
-					public void handleException(Throwable exception) {
-						String msg = exception.getMessage() != null ? exception
-								.getMessage() : exception.toString();
-						NavigatorPlugin.logError(0, msg, exception);
-
-					}
-
-					public void run() throws Exception {
-						if (labelProvider != null) {
-							labelProvider
-									.removeListener((ILabelProviderListener) contentService
-											.createCommonLabelProvider());
-							labelProvider.dispose();
-						}
-
-					}
-
-				});
-
-			}
-		} finally {
-			isDisposed = true;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtension
-	 * #getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-	/**
-	 * @return Returns the contentProviderInitializationFailed.
-	 */
-	public boolean hasContentProviderInitializationFailed() {
-		return contentProviderInitializationFailed;
-	}
-
-	/**
-	 * @return Returns the labelProviderInitializationFailed.
-	 */
-	public boolean hasLabelProviderInitializationFailed() {
-		return labelProviderInitializationFailed;
-	}
-
-	/**
-	 * 
-	 * @return True if the loading of the content provider has failed.
-	 */
-	public boolean hasLoadingFailed() {
-		return contentProviderInitializationFailed;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtension
-	 * #isLoaded()
-	 */
-	public boolean isLoaded() {
-		return contentProvider != null;
-	}
-
-	public void restoreState(IMemento aMemento) {
-		synchronized (this) {
-			appliedMemento = aMemento;
-			applyMemento(contentProvider);
-			applyMemento(labelProvider);
-
-		}
-	}
-
-	public void saveState(IMemento aMemento) {
-		synchronized (this) {
-			if (contentProvider != null
-					&& contentProvider instanceof IMementoAware)
-				((IMementoAware) contentProvider).saveState(aMemento);
-			if (labelProvider != null && labelProvider instanceof IMementoAware)
-				((IMementoAware) labelProvider).saveState(aMemento);
-
-		}
-	}
-
-	private void applyMemento(IMementoAware target) {
-		if (target != null) {
-			target.restoreState(appliedMemento);
-		}
-
-	}
-
-	protected final void complainDisposedIfNecessary() {
-		if (isDisposed) {
-			throw new IllegalStateException("INavigatorContentExtension " //$NON-NLS-1$
-					+ descriptor.getId() + " is disposed!"); //$NON-NLS-1$
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtension
-	 * #getStateModel()
-	 */
-	public IExtensionStateModel getStateModel() {
-		return contentService.getExtensionStateService()
-				.getExtensionStateModel(getDescriptor());
-	}
-
-	/**
-	 * @param anElement
-	 *            The element for the query.
-	 * @return Returns the overridingExtensions.
-	 */
-	public NavigatorContentExtension[] getOverridingExtensionsForTriggerPoint(
-			Object anElement) {
-		if (!descriptor.hasOverridingExtensions()) {
-			return NO_EXTENSIONS;
-		}
-
-		NavigatorContentDescriptor overriddingDescriptor;
-		Set overridingExtensions = new LinkedHashSet();
-		for (Iterator contentDescriptorsItr = descriptor
-				.getOverriddingExtensions().iterator(); contentDescriptorsItr
-				.hasNext();) {
-			overriddingDescriptor = (NavigatorContentDescriptor) contentDescriptorsItr
-					.next();
-
-			if (contentService.isActive(overriddingDescriptor.getId())
-					&& contentService.isVisible(overriddingDescriptor.getId())
-					&& overriddingDescriptor.isTriggerPoint(anElement)) {
-				overridingExtensions.add(contentService
-						.getExtension(overriddingDescriptor));
-			}
-		}
-		if (overridingExtensions.size() == 0) {
-			return NO_EXTENSIONS;
-		}
-		if (Policy.DEBUG_EXTENSION_SETUP) {
-			System.out.println(this +  " overriding: "+//$NON-NLS-1$
-					"(trigger pt: " + anElement + "): " + overridingExtensions); //$NON-NLS-1$//$NON-NLS-2$
-		}
-		return (NavigatorContentExtension[]) overridingExtensions
-				.toArray(new NavigatorContentExtension[overridingExtensions
-						.size()]);
-	}
-
-	/**
-	 * 
-	 * @param anElement
-	 *            The element for the query.
-	 * @return Returns the overridingExtensions.
-	 */
-	public NavigatorContentExtension[] getOverridingExtensionsForPossibleChild(
-			Object anElement) {
-		if (!descriptor.hasOverridingExtensions()) {
-			return NO_EXTENSIONS;
-		}
-
-		NavigatorContentDescriptor overriddingDescriptor;
-		Set overridingExtensions = new LinkedHashSet();
-		for (Iterator contentDescriptorsItr = descriptor
-				.getOverriddingExtensions().iterator(); contentDescriptorsItr
-				.hasNext();) {
-			overriddingDescriptor = (NavigatorContentDescriptor) contentDescriptorsItr
-					.next();
-
-			if (contentService.isActive(overriddingDescriptor.getId())
-					&& contentService.isVisible(overriddingDescriptor.getId())
-					&& overriddingDescriptor.isPossibleChild(anElement)) {
-				overridingExtensions.add(contentService
-						.getExtension(overriddingDescriptor));
-			}
-		}
-		if (overridingExtensions.size() == 0) {
-			return NO_EXTENSIONS;
-		}
-		if (Policy.DEBUG_EXTENSION_SETUP) {
-			System.out.println(this +  " overriding: "+//$NON-NLS-1$
-					"(poss child: " + anElement + "): " + overridingExtensions); //$NON-NLS-1$//$NON-NLS-2$
-		}
-		return (NavigatorContentExtension[]) overridingExtensions
-				.toArray(new NavigatorContentExtension[overridingExtensions
-						.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return descriptor.toString() + " Instance"; //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentRegistryReader.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentRegistryReader.java
deleted file mode 100644
index 7f18122..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorContentRegistryReader.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-
-/**
- * Provides a common superclass for all consumers of the
- * <b>org.eclipse.ui.navigator.navigatorContent</b> extension point.
- * 
- * @since 3.2
- * 
- */
-public class NavigatorContentRegistryReader extends RegistryReader implements
-		INavigatorContentExtPtConstants {
-
-	protected final NavigatorContentDescriptorManager CONTENT_DESCRIPTOR_MANAGER = NavigatorContentDescriptorManager
-			.getInstance();
-
-	protected NavigatorContentRegistryReader() {
-		super(NavigatorPlugin.PLUGIN_ID, TAG_NAVIGATOR_CONTENT);
-	}
-
-	protected boolean readElement(IConfigurationElement element) {
-		String elementName = element.getName();
-
-		/* These are all of the valid root tags that exist */
-		return TAG_ACTION_PROVIDER.equals(elementName)
-				|| TAG_NAVIGATOR_CONTENT.equals(elementName)
-				|| TAG_COMMON_WIZARD.equals(elementName)
-				|| TAG_COMMON_FILTER.equals(elementName);
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorViewerDescriptor.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorViewerDescriptor.java
deleted file mode 100644
index dcd6d19..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorViewerDescriptor.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import java.util.HashSet;
-import java.util.Properties;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.INavigatorViewerDescriptor;
-import org.eclipse.ui.navigator.MenuInsertionPoint;
-import org.eclipse.ui.navigator.NavigatorActionService;
-
-/**
- * Encapsulates the <code>org.eclipse.ui.navigator.viewer</code> extension.
- * <p>
- * 
- * @since 3.2
- */
-public final class NavigatorViewerDescriptor implements
-		INavigatorViewerDescriptor {
-	
-
-	/**
-	 * {@value} (boolean): True indicates the ITreeContentProvider.hasChildren() 
-	 * should force plugins to load if necessary <b>false</b>).
-	 */
-	public static final String PROP_ENFORCE_HAS_CHILDREN = "org.eclipse.ui.navigator.enforceHasChildren"; //$NON-NLS-1$
-
-	static final String TAG_INCLUDES = "includes"; //$NON-NLS-1$
-
-	static final String TAG_EXCLUDES = "excludes"; //$NON-NLS-1$
-
-	static final String ATT_IS_ROOT = "isRoot"; //$NON-NLS-1$
-
-	static final String ATT_PATTERN = "pattern"; //$NON-NLS-1$
-
-	private static final String TAG_CONTENT_EXTENSION = "contentExtension"; //$NON-NLS-1$
-
-	private static final String TAG_ACTION_EXTENSION = "actionExtension"; //$NON-NLS-1$ 
-
-	private final String viewerId;
-
-	private String popupMenuId = null;
-
-	private Binding actionBinding = new Binding(TAG_ACTION_EXTENSION);
-
-	private Binding contentBinding = new Binding(TAG_CONTENT_EXTENSION);
-
-	private MenuInsertionPoint[] customInsertionPoints = null;
-
-	private boolean allowsPlatformContributions = true;
-
-	private final Properties properties = new Properties();
-
-	private Set dragAssistants; 
-
-	/**
-	 * Creates a new content descriptor from a configuration element.
-	 * 
-	 * @param aViewerId
-	 *            The identifier for this descriptor.
-	 */
-	/* package */NavigatorViewerDescriptor(String aViewerId) {
-		super();
-		this.viewerId = aViewerId;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.navigator.extensions.INavigatorViewerDescriptor#getViewerId()
-	 */
-	public String getViewerId() {
-		return viewerId;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.navigator.extensions.INavigatorViewerDescriptor#getPopupMenuId()
-	 */
-	public String getPopupMenuId() {
-		return popupMenuId != null ? popupMenuId : viewerId;
-	}
-
-	/**
-	 * Consume an action binding for this viewer.
-	 * 
-	 * @param element
-	 *            The IConfigurationElement containing a viewerActionBinding
-	 *            element.
-	 */
-	public void consumeActionBinding(IConfigurationElement element) {
-		consumeBinding(element, false);
-	}
-
-	/**
-	 * Consume a content binding for this viewer.
-	 * 
-	 * @param element
-	 *            The IConfigurationElement containing a viewerContentBinding
-	 *            element.
-	 */
-	public void consumeContentBinding(IConfigurationElement element) {
-		consumeBinding(element, true);
-	}
-
-	public boolean isRootExtension(String aContentExtensionId) {
-		return contentBinding.isRootExtension(aContentExtensionId);
-	}
-
-	public boolean allowsPlatformContributionsToContextMenu() {
-		return allowsPlatformContributions;
-	}
-
-	public boolean isVisibleContentExtension(String aContentExtensionId) {
-		return contentBinding.isVisibleExtension(aContentExtensionId);
-	}
-
-	public boolean isVisibleActionExtension(String anActionExtensionId) {
-		return actionBinding.isVisibleExtension(anActionExtensionId);
-	}
-
-	public boolean hasOverriddenRootExtensions() {
-		return contentBinding.hasOverriddenRootExtensions();
-	}
-
-	public MenuInsertionPoint[] getCustomInsertionPoints() {
-		return customInsertionPoints;
-	}
-
-	/**
-	 * 
-	 * @param newCustomInsertionPoints
-	 *            The set of custom insertion points, if any. A null list
-	 *            indicates the default set (as defined by
-	 *            {@link NavigatorActionService}) should be used. An empty list
-	 *            indicates there are no declarative insertion points.
-	 */
-	public void setCustomInsertionPoints(
-			MenuInsertionPoint[] newCustomInsertionPoints) {
-		if (customInsertionPoints != null) {
-			NavigatorPlugin
-					.logError(
-							0,
-							"Attempt to override custom insertion points denied. Verify there are no colliding org.eclipse.ui.navigator.viewer extension points.", null); //$NON-NLS-1$
-			return; // do not let them override the insertion points.
-		}
-		customInsertionPoints = newCustomInsertionPoints;
-	}
-
-	/**
-	 * 
-	 * @param toAllowPlatformContributions
-	 *            A value of 'true' enables object/viewer contributions. 'false'
-	 *            will only allow programmatic contributions from
-	 *            {@link CommonActionProvider}s.
-	 */
-	public void setAllowsPlatformContributions(
-			boolean toAllowPlatformContributions) {
-		allowsPlatformContributions = toAllowPlatformContributions;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.INavigatorViewerDescriptor#getStringConfigProperty(java.lang.String)
-	 */
-	public String getStringConfigProperty(String aPropertyName) {
-		return properties.getProperty(aPropertyName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.INavigatorViewerDescriptor#getBooleanConfigProperty(java.lang.String)
-	 */
-	public boolean getBooleanConfigProperty(String aPropertyName) {
-		String propValue = properties.getProperty(aPropertyName);
-		if (propValue == null) {
-			return false;
-		}
-		return Boolean.valueOf(propValue).booleanValue();
-	}
-	 
-
-	/* package */ void setProperty(String aPropertyName, String aPropertyValue) {
-		properties.setProperty(aPropertyName, aPropertyValue);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "ViewerDescriptor[" + viewerId + "]"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Update the popupMenuId. If a value is already set, then a warning message
-	 * will be logged.
-	 * 
-	 * @param newPopupMenuId
-	 *            The new popup menu id.
-	 */
-	/* package */ void setPopupMenuId(String newPopupMenuId) {
-
-		if (newPopupMenuId != null) {
-			if (popupMenuId != null) {
-				NavigatorPlugin
-						.log(
-								IStatus.WARNING,
-								0,
-								NLS
-										.bind(
-												CommonNavigatorMessages.NavigatorViewerDescriptor_Popup_Menu_Overridden,
-												new Object[] { getViewerId(),
-														popupMenuId,
-														newPopupMenuId }), null);
-			}
-			popupMenuId = newPopupMenuId;
-		}
-	}
-
-	/**
-	 * @param descriptor
-	 *            A non-null descriptor to add
-	 */
-	/* package */ void addDragAssistant(CommonDragAssistantDescriptor descriptor) {
-		getDragAssistants().add(descriptor);
-
-	}
-
-	/**
-	 * 
-	 * @return The set of {@link CommonDragAssistantDescriptor}s for this
-	 *         viewer.
-	 */
-	public Set getDragAssistants() {
-		if (dragAssistants == null) {
-			dragAssistants = new HashSet();
-		}
-		return dragAssistants;
-	}
-
-	private void consumeBinding(IConfigurationElement element, boolean isContent) {
-		IConfigurationElement[] includesElement = element
-				.getChildren(TAG_INCLUDES);
-
-		if (includesElement.length == 1) {
-			if (isContent) {
-				contentBinding.consumeIncludes(includesElement[0], true);
-			} else {
-				actionBinding.consumeIncludes(includesElement[0], false);
-			}
-		} else if (includesElement.length >= 1) {
-			NavigatorPlugin.logError(0, NLS.bind(
-					CommonNavigatorMessages.Too_many_elements_Warning,
-					new Object[] {
-							TAG_INCLUDES,
-							element.getDeclaringExtension()
-									.getUniqueIdentifier(),
-							element.getDeclaringExtension().getNamespaceIdentifier() }),
-					null);
-		}
-
-		IConfigurationElement[] excludesElement = element
-				.getChildren(TAG_EXCLUDES);
-
-		if (excludesElement.length == 1) {
-
-			if (isContent) {
-				contentBinding.consumeExcludes(excludesElement[0]);
-			} else {
-				actionBinding.consumeExcludes(excludesElement[0]);
-			}
-		} else if (excludesElement.length >= 1) {
-			NavigatorPlugin.logError(0, NLS.bind(
-					CommonNavigatorMessages.Too_many_elements_Warning,
-					new Object[] {
-							TAG_EXCLUDES,
-							element.getDeclaringExtension()
-									.getUniqueIdentifier(),
-							element.getDeclaringExtension().getNamespaceIdentifier() }),
-					null);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorViewerDescriptorManager.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorViewerDescriptorManager.java
deleted file mode 100644
index c9c2b37..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/NavigatorViewerDescriptorManager.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.navigator.MenuInsertionPoint;
-
-/**
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- */
-public class NavigatorViewerDescriptorManager {
-
-	private static final NavigatorViewerDescriptorManager INSTANCE = new NavigatorViewerDescriptorManager();
-
-	private final Map viewerDescriptors = new HashMap();
-
-	/**
-	 * @return The intialized singleton instance of the viewer descriptor
-	 *         registry.
-	 */
-	public static NavigatorViewerDescriptorManager getInstance() {
-		return INSTANCE;
-	}
-
-	protected NavigatorViewerDescriptorManager() {
-		new NavigatorViewerDescriptorRegistry().readRegistry();
-	}
-
-	/**
-	 * 
-	 * @param aViewerId
-	 *            The viewer id for the viewer configuration
-	 * @return The viewer descriptor for the given viewer id.
-	 */
-	public NavigatorViewerDescriptor getNavigatorViewerDescriptor(
-			String aViewerId) {
-
-		NavigatorViewerDescriptor viewerDescriptor = (NavigatorViewerDescriptor) viewerDescriptors
-				.get(aViewerId);
-		if (viewerDescriptor != null) {
-			return viewerDescriptor;
-		}
-
-		synchronized (viewerDescriptors) {
-			viewerDescriptor = (NavigatorViewerDescriptor) viewerDescriptors
-					.get(aViewerId);
-			if (viewerDescriptor == null) {
-				viewerDescriptor = new NavigatorViewerDescriptor(aViewerId);
-				viewerDescriptors.put(viewerDescriptor.getViewerId(),
-						viewerDescriptor);
-			}
-		}
-		return viewerDescriptor;
-
-	}
-
-	private class NavigatorViewerDescriptorRegistry extends RegistryReader
-			implements IViewerExtPtConstants {
-
-		protected NavigatorViewerDescriptorRegistry() {
-			super(NavigatorPlugin.PLUGIN_ID, TAG_VIEWER);
-		}
-
-		protected boolean readElement(IConfigurationElement element) {
-			if (TAG_VIEWER.equals(element.getName())) {
-				String viewerId = element.getAttribute(ATT_VIEWER_ID);
-				NavigatorViewerDescriptor descriptor = getNavigatorViewerDescriptor(viewerId);
-
-				String attPopupMenuId = element.getAttribute(ATT_POPUP_MENU_ID);
-				IConfigurationElement[] tagPopupMenu = element
-						.getChildren(TAG_POPUP_MENU);
-				if (tagPopupMenu.length == 0 && attPopupMenuId != null) {
-					descriptor.setPopupMenuId(attPopupMenuId);
-				} else {
-					if (attPopupMenuId != null) {
-						NavigatorPlugin
-								.logError(
-										0,
-										"A popupMenuId attribute and popupMenu element may NOT be concurrently specified. (see " + element.getNamespaceIdentifier() + ")", null); //$NON-NLS-1$ //$NON-NLS-2$
-					} else if (tagPopupMenu.length > 1) {
-						NavigatorPlugin
-								.logError(
-										0,
-										"Only one \"popupMenu\" child of \"viewer\" may be specified. (see " + element.getNamespaceIdentifier() + ")", null); //$NON-NLS-1$ //$NON-NLS-2$
-					} else if(tagPopupMenu.length == 1) { // valid case
-
-						String popupMenuId = tagPopupMenu[0]
-								.getAttribute(ATT_ID);
-						String allowsPlatformContributions = tagPopupMenu[0]
-								.getAttribute(ATT_ALLOWS_PLATFORM_CONTRIBUTIONS);
-
-						if (popupMenuId != null) {
-							descriptor.setPopupMenuId(popupMenuId);
-						}
-
-						if (allowsPlatformContributions != null) {
-							descriptor.setAllowsPlatformContributions(Boolean
-									.valueOf(allowsPlatformContributions)
-									.booleanValue());
-						}
-
-						IConfigurationElement[] insertionPointElements = tagPopupMenu[0]
-								.getChildren(TAG_INSERTION_POINT);
-						MenuInsertionPoint[] insertionPoints = new MenuInsertionPoint[insertionPointElements.length];
-						String name;
-						String stringAttSeparator;
-
-						boolean isSeparator;
-						for (int indx = 0; indx < insertionPointElements.length; indx++) {
-							name = insertionPointElements[indx]
-									.getAttribute(ATT_NAME);
-							stringAttSeparator = insertionPointElements[indx]
-									.getAttribute(ATT_SEPARATOR);
-							isSeparator = stringAttSeparator != null ? Boolean
-									.valueOf(stringAttSeparator).booleanValue()
-									: false;
-							insertionPoints[indx] = new MenuInsertionPoint(name,
-									isSeparator);
-						}
-						descriptor.setCustomInsertionPoints(insertionPoints);
-					}
-				}
-
-				IConfigurationElement[] options = element
-						.getChildren(TAG_OPTIONS);
-				if (options.length == 1) {
-					IConfigurationElement[] properties = options[0]
-							.getChildren(TAG_PROPERTY);
-					String name;
-					String value;
-					for (int i = 0; i < properties.length; i++) {
-						name = properties[i].getAttribute(ATT_NAME);
-						if (name != null) {
-							value = properties[i].getAttribute(ATT_VALUE);
-							descriptor.setProperty(name, value);
-						}
-					}
-				} else if (options.length > 1) {
-					NavigatorPlugin
-							.logError(
-									0,
-									"Only one \"options\" child of \"viewer\" may be specified. (see " + element.getNamespaceIdentifier() + ")", null); //$NON-NLS-1$ //$NON-NLS-2$
-
-				}
-				return true;
-			}
-			if (TAG_VIEWER_CONTENT_BINDING.equals(element.getName())) {
-				String viewerId = element.getAttribute(ATT_VIEWER_ID);
-				NavigatorViewerDescriptor descriptor = getNavigatorViewerDescriptor(viewerId);
-				descriptor.consumeContentBinding(element);
-				return true;
-			}
-			if (TAG_VIEWER_ACTION_BINDING.equals(element.getName())) {
-				String viewerId = element.getAttribute(ATT_VIEWER_ID);
-				NavigatorViewerDescriptor descriptor = getNavigatorViewerDescriptor(viewerId);
-				descriptor.consumeActionBinding(element);
-				return true;
-			} if (TAG_DRAG_ASSISTANT.equals(element.getName())) {
-				String viewerId = element.getAttribute(ATT_VIEWER_ID);
-				NavigatorViewerDescriptor descriptor = getNavigatorViewerDescriptor(viewerId);
-				descriptor.addDragAssistant(new CommonDragAssistantDescriptor(element));
-				return true;
-			}
-			return false;
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/RegistryReader.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/RegistryReader.java
deleted file mode 100644
index ab2e9ef..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/RegistryReader.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-
-/**
- * Template implementation of a registry reader that creates objects representing registry contents.
- * Typically, an extension contains one element, but this reader handles multiple elements per
- * extension.
- * 
- * To start reading the extensions from the registry for an extension point, call the method
- * <code>readRegistry</code>.
- * 
- * To read children of an IConfigurationElement, call the method <code>readElementChildren</code>
- * from your implementation of the method <code>readElement</code>, as it will not be done by
- * default.
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as part of a work in
- * progress. There is a guarantee neither that this API will work nor that it will remain the same.
- * Please do not use this API without consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- */
-public abstract class RegistryReader {
-
-	protected static final String TAG_DESCRIPTION = "description"; //$NON-NLS-1$
-
-	private boolean isInitialized;
-	private final String extensionPointId;
-	private final String pluginId;
-	private final IExtensionRegistry registry;
-
-	/**
-	 * The constructor.
-	 */
-	protected RegistryReader(String aPluginId, String anExtensionPoint) {
-		this.registry = Platform.getExtensionRegistry();
-		this.pluginId = aPluginId;
-		this.extensionPointId = anExtensionPoint;
-	}
-
-	/**
-	 * This method extracts description as a subelement of the given element.
-	 * 
-	 * @return description string if defined, or empty string if not.
-	 */
-	protected String getDescription(IConfigurationElement config) {
-		IConfigurationElement[] children = config.getChildren(TAG_DESCRIPTION);
-		if (children.length >= 1) {
-			return children[0].getValue();
-		}
-		return "";//$NON-NLS-1$
-	}
-
-	/**
-	 * Logs the error in the workbench log using the provided text and the information in the
-	 * configuration element.
-	 */
-	protected static void logError(IConfigurationElement element, String text) {
-		IExtension extension = element.getDeclaringExtension();
-		StringBuffer buf = new StringBuffer();
-		buf.append("Plugin " + extension.getNamespaceIdentifier() + ", extension " + extension.getExtensionPointUniqueIdentifier());//$NON-NLS-2$//$NON-NLS-1$
-		buf.append("\n" + text);//$NON-NLS-1$
-		NavigatorPlugin.logError(0, buf.toString(), null);
-	}
-
-	/**
-	 * Logs a very common registry error when a required attribute is missing.
-	 */
-	protected static void logMissingAttribute(IConfigurationElement element, String attributeName) {
-		logError(element, "Required attribute '" + attributeName + "' not defined");//$NON-NLS-2$//$NON-NLS-1$
-	}
-
-	/**
-	 * Logs a very common registry error when a required child is missing.
-	 */
-	protected static void logMissingElement(IConfigurationElement element, String elementName) {
-		logError(element, "Required sub element '" + elementName + "' not defined");//$NON-NLS-2$//$NON-NLS-1$
-	}
-
-	/**
-	 * Logs a registry error when the configuration element is unknown.
-	 */
-	protected static void logUnknownElement(IConfigurationElement element) {
-		logError(element, "Unknown extension tag found: " + element.getName());//$NON-NLS-1$
-	}
-
-	/**
-	 * Apply a reproducable order to the list of extensions provided, such that the order will not
-	 * change as extensions are added or removed.
-	 */
-	protected IExtension[] orderExtensions(IExtension[] extensions) {
-		// By default, the order is based on plugin id sorted
-		// in ascending order. The order for a plugin providing
-		// more than one extension for an extension point is
-		// dependent in the order listed in the XML file.
-		IExtension[] sortedExtension = new IExtension[extensions.length];
-		System.arraycopy(extensions, 0, sortedExtension, 0, extensions.length);
-		Comparator comparer = new Comparator() {
-			public int compare(Object arg0, Object arg1) {
-				String s1 = ((IExtension) arg0).getNamespaceIdentifier();
-				String s2 = ((IExtension) arg1).getNamespaceIdentifier();
-				return s1.compareToIgnoreCase(s2);
-			}
-		};
-		Collections.sort(Arrays.asList(sortedExtension), comparer);
-		return sortedExtension;
-	}
-
-	/**
-	 * Implement this method to read element's attributes. If children should also be read, then
-	 * implementor is responsible for calling <code>readElementChildren</code>. Implementor is
-	 * also responsible for logging missing attributes.
-	 * 
-	 * @return true if element was recognized, false if not.
-	 */
-	protected abstract boolean readElement(IConfigurationElement element);
-
-	/**
-	 * Read the element's children. This is called by the subclass' readElement method when it wants
-	 * to read the children of the element.
-	 */
-	protected void readElementChildren(IConfigurationElement element) {
-		readElements(element.getChildren());
-	}
-
-	/**
-	 * Read each element one at a time by calling the subclass implementation of
-	 * <code>readElement</code>.
-	 * 
-	 * Logs an error if the element was not recognized.
-	 */
-	protected void readElements(IConfigurationElement[] elements) {
-		for (int i = 0; i < elements.length; i++) {
-			if (!readElement(elements[i])) {
-				logUnknownElement(elements[i]);
-			}
-		}
-	}
-
-	/**
-	 * Read one extension by looping through its configuration elements.
-	 */
-	protected void readExtension(IExtension extension) {
-		readElements(extension.getConfigurationElements());
-	}
-
-	/**
-	 * Start the registry reading process using the supplied plugin ID and extension point.
-	 */
-	public void readRegistry() {
-		if (isInitialized) {
-			return;
-		}
-		synchronized (this) {
-			if (!isInitialized) {
-				IExtensionPoint point = registry.getExtensionPoint(pluginId, extensionPointId);
-				if (point == null) {
-					return;
-				}
-				IExtension[] extensions = point.getExtensions();
-				extensions = orderExtensions(extensions);
-				for (int i = 0; i < extensions.length; i++) {
-					readExtension(extensions[i]);
-				}
-				isInitialized = true;
-			}
-
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SafeDelegateCommonLabelProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SafeDelegateCommonLabelProvider.java
deleted file mode 100644
index 0f2371c..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SafeDelegateCommonLabelProvider.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- * Anton Leherbauer, Wind River - bug 146788
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ITreePathLabelProvider;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.ViewerLabel;
-import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.navigator.ICommonContentExtensionSite;
-import org.eclipse.ui.navigator.ICommonLabelProvider;
-import org.eclipse.ui.navigator.IDescriptionProvider;
-
-/**
- * @since 3.2
- */
-public class SafeDelegateCommonLabelProvider implements ICommonLabelProvider, IColorProvider, IFontProvider, ITreePathLabelProvider, IStyledLabelProvider {
-
-	private final ILabelProvider delegateLabelProvider;
-
-	/**
-	 * @param aLabelProvider
-	 *            A non-null label provider.
-	 * 
-	 */
-	public SafeDelegateCommonLabelProvider(ILabelProvider aLabelProvider) {
-		super();
-		delegateLabelProvider = aLabelProvider;
-	}
-
-	/**
-	 * <p>
-	 * No-op.
-	 * </p>
-	 * 
-	 * @see org.eclipse.ui.navigator.ICommonLabelProvider#init(ICommonContentExtensionSite)
-	 */
-	public void init(ICommonContentExtensionSite aConfig) {
-	}
-
-	/**
-	 * <p>
-	 * If the delegate label provider implements <code>IDescriptionProvider</code>,
-	 * it is used to retrieve the status bar message. 
-	 * </p>
-	 * <p>
-	 * Returns <b>null </b> otherwise, forcing the CommonNavigator to provide the default
-	 * message.
-	 * </p>
-	 * 
-	 * @see org.eclipse.ui.navigator.ICommonLabelProvider#getDescription(java.lang.Object)
-	 */
-	public String getDescription(Object element) {
-		/* The following few lines were contributed as part of a patch. */
-		if (delegateLabelProvider instanceof IDescriptionProvider) {
-			IDescriptionProvider provider = (IDescriptionProvider) delegateLabelProvider;
-			return provider.getDescription(element);
-		}
-		return null;
-	}
-
-	/**
-	 * @param listener
-	 */
-	public void addListener(ILabelProviderListener listener) {
-		delegateLabelProvider.addListener(listener);
-	}
-
-	/**
-	 * 
-	 */
-	public void dispose() {
-		delegateLabelProvider.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		return delegateLabelProvider.equals(obj);
-	}
-
-	public Image getImage(Object element) {
-		return delegateLabelProvider.getImage(element);
-	}
-
-	public String getText(Object element) {
-		return delegateLabelProvider.getText(element);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getStyledText(java.lang.Object)
-	 */
-	public StyledString getStyledText(Object element) {
-		if (delegateLabelProvider instanceof IStyledLabelProvider) {
-			return ((IStyledLabelProvider)delegateLabelProvider).getStyledText(element);
-		}
-		String text= getText(element);
-		if (text == null)
-			text= ""; //$NON-NLS-1$
-		return new StyledString(text);
-	}	
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return delegateLabelProvider.hashCode();
-	}
-
-	public boolean isLabelProperty(Object element, String property) {
-		return delegateLabelProvider.isLabelProperty(element, property);
-	}
-
-	/**
-	 * @param listener
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-		delegateLabelProvider.removeListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return delegateLabelProvider.toString();
-	}
-
-	public void restoreState(IMemento aMemento) {
-
-	}
-
-	public void saveState(IMemento aMemento) {
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITreePathLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel, org.eclipse.jface.viewers.TreePath)
-	 */
-	public void updateLabel(ViewerLabel label, TreePath elementPath) {
-		if (delegateLabelProvider instanceof ITreePathLabelProvider) {
-			ITreePathLabelProvider tplp = (ITreePathLabelProvider) delegateLabelProvider;
-			String text = label.getText() != null ? label.getText() : ""; //$NON-NLS-1$
-			Image image = label.getImage();
-			tplp.updateLabel(label, elementPath);
-			if(label.getText() == null)
-				label.setText(text);
-			if(label.getImage() == null && image != null)
-				label.setImage(image);
-		} else {
-			Image image = getImage(elementPath.getLastSegment());
-			if(image != null)
-				label.setImage(image);
-			String text = getText(elementPath.getLastSegment());
-			if(text != null)
-				label.setText(text);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-	 */
-	public Color getForeground(Object element) {
-		if(delegateLabelProvider instanceof IColorProvider) {
-			return ((IColorProvider)delegateLabelProvider).getForeground(element);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-	 */
-	public Color getBackground(Object element) {
-		if(delegateLabelProvider instanceof IColorProvider) {
-			return ((IColorProvider)delegateLabelProvider).getBackground(element);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-	 */
-	public Font getFont(Object element) {
-		if(delegateLabelProvider instanceof IFontProvider) {
-			return ((IFontProvider)delegateLabelProvider).getFont(element);
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SafeDelegateTreeContentProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SafeDelegateTreeContentProvider.java
deleted file mode 100644
index ee84e24..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SafeDelegateTreeContentProvider.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import java.util.ArrayList;
-import java.util.Set;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.ITreePathContentProvider;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.navigator.ICommonContentExtensionSite;
-import org.eclipse.ui.navigator.ICommonContentProvider;
-import org.eclipse.ui.navigator.IMementoAware;
-import org.eclipse.ui.navigator.IPipelinedTreeContentProvider;
-import org.eclipse.ui.navigator.PipelinedShapeModification;
-import org.eclipse.ui.navigator.PipelinedViewerUpdate;
-
-/**
- * @since 3.2
- */
-public class SafeDelegateTreeContentProvider implements
-		IPipelinedTreeContentProvider, ITreePathContentProvider {
-
-	private static final TreePath[] NO_PATHS = new TreePath[0];
-
-	private final ITreeContentProvider contentProvider;
-
-	private NavigatorContentService contentService;
-
-	private NavigatorContentDescriptor descriptor;
-
-	private Viewer viewer;
-
-	SafeDelegateTreeContentProvider(ITreeContentProvider aContentProvider,
-			NavigatorContentDescriptor aDescriptor,
-			NavigatorContentService theContentService) {
-		super();
-		contentProvider = aContentProvider;
-		contentService = theContentService;
-		descriptor = aDescriptor;
-	}
-
-	/**
-	 * 
-	 */
-	public void dispose() {
-		SafeRunner.run(new ISafeRunnable() {
-
-			public void handleException(Throwable exception) { 
-				String msg = exception.getMessage() != null ? exception.getMessage() : exception.toString() ;
-				NavigatorPlugin.logError(0, msg, exception);
-				
-			}
-
-			public void run() throws Exception {
-				contentProvider.dispose(); 
-			}
-			
-		});
-		
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object anObject) {
-		return contentProvider.equals(anObject);
-	}
-
-	public Object[] getChildren(Object aParentElement) {
-		if (aParentElement instanceof TreePath) {
-			TreePath tp = (TreePath) aParentElement;
-			return getChildren(tp);
-		}
-		Object[] children = contentProvider.getChildren(aParentElement);
-		contentService.rememberContribution(descriptor, children);
-		return children;
-	}
-
-	public Object[] getElements(Object anInputElement) {
-		Object[] elements = contentProvider.getElements(anInputElement);
-		contentService.rememberContribution(descriptor, elements);
-		return elements;
-	}
-
-	public Object getParent(Object anElement) {
-		return contentProvider.getParent(anElement);
-	}
-
-	public boolean hasChildren(Object anElement) {
-		return contentProvider.hasChildren(anElement);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return contentProvider.hashCode();
-	}
-
-	public void inputChanged(final Viewer aViewer, final Object anOldInput, final Object aNewInput) {
-		viewer = aViewer;
-		
-		SafeRunner.run(new ISafeRunnable() {
-
-			public void handleException(Throwable exception) { 
-				String msg = exception.getMessage() != null ? exception.getMessage() : exception.toString() ;
-				NavigatorPlugin.logError(0, msg, exception);
-				
-			}
-
-			public void run() throws Exception {
-				contentProvider.inputChanged(aViewer, anOldInput, aNewInput);
-			}
-			
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return contentProvider.toString();
-	}
-
-	/**
-	 * 
-	 * @return The real content provider.
-	 */
-	public ITreeContentProvider getDelegateContentProvider() {
-		return contentProvider;
-	}
-
-	public void restoreState(IMemento aMemento) {
-		if (contentProvider != null && contentProvider instanceof IMementoAware) {
-			((IMementoAware) contentProvider).restoreState(aMemento);
-		}
-
-	}
-
-	public void saveState(IMemento aMemento) {
-		if (contentProvider != null && contentProvider instanceof IMementoAware) {
-			((IMementoAware) contentProvider).saveState(aMemento);
-		}
-
-	}
-
-	public void init(ICommonContentExtensionSite aConfig) {
-		if (contentProvider instanceof ICommonContentProvider) {
-			((ICommonContentProvider) contentProvider).init(aConfig);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#getPipelinedChildren(java.lang.Object,
-	 *      java.util.Set)
-	 */
-	public void getPipelinedChildren(Object aParent, Set theCurrentChildren) {
-		if (contentProvider instanceof IPipelinedTreeContentProvider) {
-			((IPipelinedTreeContentProvider) contentProvider)
-					.getPipelinedChildren(aParent, theCurrentChildren);
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#getPipelinedElements(java.lang.Object,
-	 *      java.util.Set)
-	 */
-	public void getPipelinedElements(Object anInput, Set theCurrentElements) {
-		if (contentProvider instanceof IPipelinedTreeContentProvider) {
-			((IPipelinedTreeContentProvider) contentProvider)
-					.getPipelinedElements(anInput, theCurrentElements);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#getPipelinedParent(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public Object getPipelinedParent(Object anObject, Object aSuggestedParent) {
-		if (contentProvider instanceof IPipelinedTreeContentProvider) {
-			return ((IPipelinedTreeContentProvider) contentProvider)
-					.getPipelinedParent(anObject, aSuggestedParent);
-		}
-		return anObject;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#interceptAdd(org.eclipse.ui.navigator.PipelinedShapeModification)
-	 */
-	public PipelinedShapeModification interceptAdd(
-			PipelinedShapeModification anAddModification) { 
-		if (contentProvider instanceof IPipelinedTreeContentProvider) {
-			return ((IPipelinedTreeContentProvider) contentProvider)
-					.interceptAdd(anAddModification);
-		}
-		return anAddModification;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#interceptRemove(org.eclipse.ui.navigator.PipelinedShapeModification)
-	 */
-	public PipelinedShapeModification interceptRemove(
-			PipelinedShapeModification aRemoveModification) { 
-		if (contentProvider instanceof IPipelinedTreeContentProvider) {
-			return ((IPipelinedTreeContentProvider) contentProvider)
-					.interceptRemove(aRemoveModification);
-		}
-		return aRemoveModification;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#interceptRefresh(org.eclipse.ui.navigator.PipelinedViewerUpdate)
-	 */
-	public boolean interceptRefresh(
-			PipelinedViewerUpdate aRefreshSynchronization) {
-		if (contentProvider instanceof IPipelinedTreeContentProvider) {
-			return ((IPipelinedTreeContentProvider) contentProvider)
-					.interceptRefresh(aRefreshSynchronization);
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.IPipelinedTreeContentProvider#interceptUpdate(org.eclipse.ui.navigator.PipelinedViewerUpdate)
-	 */
-	public boolean interceptUpdate(
-			PipelinedViewerUpdate anUpdateSynchronization) {
-		if (contentProvider instanceof IPipelinedTreeContentProvider) {
-			return ((IPipelinedTreeContentProvider) contentProvider)
-					.interceptUpdate(anUpdateSynchronization);
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITreePathContentProvider#getChildren(org.eclipse.jface.viewers.TreePath)
-	 */
-	public Object[] getChildren(TreePath parentPath) {
-		if (contentProvider instanceof ITreePathContentProvider) {
-			ITreePathContentProvider tpcp = (ITreePathContentProvider) contentProvider;
-			Object[] children = tpcp.getChildren(parentPath);
-			contentService.rememberContribution(descriptor, children);
-			return children;
-		}
-		return getChildren(parentPath.getLastSegment());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITreePathContentProvider#hasChildren(org.eclipse.jface.viewers.TreePath)
-	 */
-	public boolean hasChildren(TreePath path) {
-		if (contentProvider instanceof ITreePathContentProvider) {
-			ITreePathContentProvider tpcp = (ITreePathContentProvider) contentProvider;
-			return tpcp.hasChildren(path);
-		}
-		return hasChildren(path.getLastSegment());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITreePathContentProvider#getParents(java.lang.Object)
-	 */
-	public TreePath[] getParents(Object element) {
-		if (contentProvider instanceof ITreePathContentProvider) {
-			ITreePathContentProvider tpcp = (ITreePathContentProvider) contentProvider;
-			return tpcp.getParents(element);
-		}
-		ArrayList segments = new ArrayList();
-		Object parent = element;
-		do {
-			parent = contentProvider.getParent(parent);
-			if (parent != null && parent != viewer.getInput())
-				segments.add(0, parent);
-		} while (parent != null && parent != viewer.getInput());
-		if (!segments.isEmpty()) {
-			// Loop backwards over the array to create the path.			
-			return new TreePath[] { new TreePath(segments.toArray()) };
-		}
-		return NO_PATHS;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SkeletonActionProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SkeletonActionProvider.java
deleted file mode 100644
index 4502cdf..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SkeletonActionProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-
-/**
- * 
- * A skeleton action provider is used as a shortcut to avoid a bunch of null
- * checks. Instead, if a client fails to provide a valid Action Provider or
- * there is some problem instantiating the class, a skeleton (no-op singleton)
- * is used in its place. 
- * 
- * @since 3.2
- */
-public final  class SkeletonActionProvider extends CommonActionProvider {
-
-	/**
-	 * A skeleton action provider is used as a shortcut to avoid a bunch of null
-	 * checks. Instead, if a client fails to provide a valid Action Provider or
-	 * there is some problem instantiating the class, a skeleton (no-op
-	 * singleton) is used in its place.
-	 */
-	public static final CommonActionProvider INSTANCE = new SkeletonActionProvider();
- 
-	private SkeletonActionProvider() {
-		super();
-	}
-
-	public void init(ICommonActionExtensionSite aConfig) {
-
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SkeletonCommonDragAssistant.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SkeletonCommonDragAssistant.java
deleted file mode 100644
index b72c670..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SkeletonCommonDragAssistant.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.extensions;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.ui.navigator.CommonDragAdapterAssistant;
-
-/**
- * A Skeleton implementation of {@link CommonDragAdapterAssistant}.
- * 
- * @since 3.2
- * 
- */
-public final class SkeletonCommonDragAssistant extends
-		CommonDragAdapterAssistant {
-
-	/**
-	 * The singleton instance.
-	 */
-	public static final SkeletonCommonDragAssistant INSTANCE = new SkeletonCommonDragAssistant();
-
-	private static final Transfer[] NO_TRANSFER_TYPES = new Transfer[0];
-
-	private SkeletonCommonDragAssistant() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.CommonDragAdapterAssistant#getSupportedTransferTypes()
-	 */
-	public Transfer[] getSupportedTransferTypes() {
-		return NO_TRANSFER_TYPES;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.CommonDragAdapterAssistant#setDragData(org.eclipse.swt.dnd.DragSourceEvent,
-	 *      org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean setDragData(DragSourceEvent anEvent,
-			IStructuredSelection aSelection) {
-		return false;
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SkeletonLabelProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SkeletonLabelProvider.java
deleted file mode 100644
index ea1f467..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SkeletonLabelProvider.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.navigator.ICommonContentExtensionSite;
-import org.eclipse.ui.navigator.ICommonLabelProvider;
-
-/** 
- * 
- * @since 3.2
- */
-public final class SkeletonLabelProvider implements ICommonLabelProvider {
-
-	/**
-	 * The initialized singleton instance.
-	 */
-	public static final SkeletonLabelProvider INSTANCE = new SkeletonLabelProvider();
-
-	/**
-	 *  
-	 */
-	private SkeletonLabelProvider() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object element) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object element) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener listener) {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
-	 *      java.lang.String)
-	 */
-	public boolean isLabelProperty(Object element, String property) {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-
-	}
-
- 
-	public void init(ICommonContentExtensionSite aConfig) {
-
-	}
-
- 
-	public String getDescription(Object anElement) {
-		return null;
-	}
-
-	public void restoreState(IMemento aMemento) { 
-		
-	}
-
-	public void saveState(IMemento aMemento) { 
-		
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SkeletonLinkHelper.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SkeletonLinkHelper.java
deleted file mode 100644
index 5594ac3..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SkeletonLinkHelper.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.extensions;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.navigator.ILinkHelper;
-
-/**
- * @since 3.2
- *
- */
-public class SkeletonLinkHelper implements ILinkHelper {
-
-	/**
-	 * The singleton instance.
-	 */
-	public static final ILinkHelper INSTANCE = new SkeletonLinkHelper();
-	
-	private SkeletonLinkHelper() {
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.ILinkHelper#findSelection(org.eclipse.ui.IEditorInput)
-	 */
-	public IStructuredSelection findSelection(IEditorInput anInput) {
-		return StructuredSelection.EMPTY;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.ILinkHelper#activateEditor(org.eclipse.ui.IWorkbenchPage, org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void activateEditor(IWorkbenchPage aPage, IStructuredSelection aSelection) {
-		// no-op
-		
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SkeletonTreeContentProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SkeletonTreeContentProvider.java
deleted file mode 100644
index 5e80ca5..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SkeletonTreeContentProvider.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.navigator.ICommonContentExtensionSite;
-import org.eclipse.ui.navigator.ICommonContentProvider;
-
-/**
- * @since 3.2
- */
-public final class SkeletonTreeContentProvider implements ICommonContentProvider {
-
-	/**
-	 * The initialized singleton instance.
-	 */
-	public static final SkeletonTreeContentProvider INSTANCE = new SkeletonTreeContentProvider();
-
-	private static final Object[] NO_CHILDREN = new Object[0];
-
-	private SkeletonTreeContentProvider() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(Object parentElement) {
-
-		return NO_CHILDREN;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object element) {
-
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object element) {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-
-		return NO_CHILDREN;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-	}
-
-	public void restoreState(IMemento aMemento) {
-
-	}
-
-	public void saveState(IMemento aMemento) {
-
-	}
-
-	public void init(ICommonContentExtensionSite aConfig) {
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/StructuredViewerManager.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/StructuredViewerManager.java
deleted file mode 100644
index b2cf8e7..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/StructuredViewerManager.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.extensions;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * <p>
- * Provides a consistent mechanism to interact with StructuredViewers over time.
- * The Common Navigator framework attempts to defer the loading of extensions,
- * which also means defering the loading of Content Providers. To follow the
- * contracts already in place by
- * {@link org.eclipse.jface.viewers.ITreeContentProvider}, the Viewer, Old
- * Input, and New Input parameters for
- * {@link org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)}
- * are cached for content providers that have not been loaded yet.
- * </p>
- * <p>
- * <b>WARNING: </b> The following class is not inherently thread-safe.
- * Appropriate measures should be taken to ensure that
- * {@link #inputChanged(Object, Object)}and
- * {@link #inputChanged(Viewer, Object, Object)}are not called concurrently
- * with {@link #initialize(IStructuredContentProvider)}.
- * 
- * 
- * 
- * @since 3.2
- */
-public class StructuredViewerManager {
-
-	private Viewer viewer;
-
-	private Object cachedOldInput;
-
-	private Object cachedNewInput;
-	
-	private UIJob refreshJob = new UIJob(
-			CommonNavigatorMessages.StructuredViewerManager_0) {
-		public IStatus runInUIThread(IProgressMonitor monitor) {
-			if(viewer != null) {
-				try {
-					if (viewer.getControl().isDisposed()) {
-						return Status.OK_STATUS;
-					}					
-	
-					
-					Display display = viewer.getControl().getDisplay();
-					if (!display.isDisposed() && viewer != null) {
-						try {
-							viewer.getControl().setRedraw(false);
-							viewer.refresh();
-						} finally {
-							viewer.getControl().setRedraw(true);
-						}
-						 
-					}
-				} catch (RuntimeException e) {
-					NavigatorPlugin.logError(0, e.toString(), e);
-				}
-			}
-			return Status.OK_STATUS;
-		}
-	};
-
-	/**
-	 * 
-	 * @param aViewer
-	 */
-	public StructuredViewerManager(Viewer aViewer) {
-		super();
-		viewer = aViewer;
-		refreshJob.setSystem(true);
-	}
-
-	/**
-	 * 
-	 * @return The real viewer.
-	 */
-	public Viewer getViewer() {
-		return viewer;
-	}
-
-	/**
-	 * 
-	 * @param anOldInput
-	 * @param aNewInput
-	 */
-	public void inputChanged(Object anOldInput, Object aNewInput) {
-		cachedOldInput = anOldInput;
-		cachedNewInput = aNewInput;
-	}
-
-	/**
-	 * 
-	 * @param aViewer
-	 * @param anOldInput
-	 * @param aNewInput
-	 */
-	public void inputChanged(Viewer aViewer, Object anOldInput, Object aNewInput) {
-		viewer = aViewer;
-		cachedOldInput = anOldInput;
-		cachedNewInput = aNewInput;
-	}
-
-	/**
-	 * 
-	 * @param aContentProvider
-	 * @return True if all is well.
-	 */
-	public boolean initialize(IStructuredContentProvider aContentProvider) {
-		boolean result = true;
-		try {
-			if (aContentProvider != null) {
-				aContentProvider.inputChanged(viewer, cachedOldInput,
-						cachedNewInput);
-			}
-		} catch (RuntimeException e) {
-			NavigatorPlugin.logError(0, e.toString(), e);
-			result = false;
-		}
-		return result;
-	}
-
-	/**
-	 * 
-	 */
-	public void safeRefresh() {
-		refreshJob.schedule(10);
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFilterContentProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFilterContentProvider.java
deleted file mode 100644
index 62469b6..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFilterContentProvider.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.filters;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.navigator.INavigatorContentService;
-import org.eclipse.ui.navigator.INavigatorFilterService;
-
-/**
- * 
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as part of a work in
- * progress. There is a guarantee neither that this API will work nor that it will remain the same.
- * Please do not use this API without consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2 
- *
- */
-public class CommonFilterContentProvider implements IStructuredContentProvider {
-
-	private INavigatorContentService contentService;
-	private Object[] NO_ELEMENTS = new Object[0];
- 
- 
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		if (newInput instanceof INavigatorContentService) {
-			contentService = (INavigatorContentService) newInput;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-		if(contentService != null) {
-			INavigatorFilterService filterService = contentService.getFilterService();
-			return filterService.getVisibleFilterDescriptors();
-		}
-		return NO_ELEMENTS ;
-		
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFilterDescriptor.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFilterDescriptor.java
deleted file mode 100644
index 661262c..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFilterDescriptor.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.filters;
-
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.ui.internal.navigator.CustomAndExpression;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtPtConstants;
-import org.eclipse.ui.navigator.ICommonFilterDescriptor;
-
-/**
- * 
- * Describes a <b>commonFilter</b> element under a
- * <b>org.eclipse.ui.navigator.navigatorContent</b> extension.
- * 
- * @since 3.2
- * 
- */
-public class CommonFilterDescriptor implements ICommonFilterDescriptor,
-		INavigatorContentExtPtConstants {
-
-	private IConfigurationElement element;
-
-	private Expression filterExpression;
-
-	private String id;
-
-	protected CommonFilterDescriptor(IConfigurationElement anElement) {
-
-		element = anElement;
-		init();
-	}
-
-	private void init() {
-		id = element.getAttribute(ATT_ID);
-		if (id == null) {
-			id = ""; //$NON-NLS-1$
-		}
-		IConfigurationElement[] children = element
-				.getChildren(TAG_FILTER_EXPRESSION);
-		if (children.length == 1) {
-			filterExpression = new CustomAndExpression(children[0]);
-		}
-	}
-
-	/**
-	 * 
-	 * @return An identifier used to determine whether the filter is visible.
-	 *         May not be unique.
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * 
-	 * @return A translated name to identify the filter
-	 */
-	public String getName() {
-		return element.getAttribute(ATT_NAME);
-	}
-
-	/**
-	 * 
-	 * @return A translated description to explain to the user what the defined
-	 *         filter will hide from the view.
-	 */
-	public String getDescription() {
-		return element.getAttribute(ATT_DESCRIPTION);
-	}
-
-	/**
-	 * 
-	 * @return Indicates the filter should be in an "Active" state by default.
-	 */
-	public boolean isActiveByDefault() {
-		return Boolean.valueOf(element.getAttribute(ATT_ACTIVE_BY_DEFAULT))
-				.booleanValue();
-	}
-
-	/**
-	 * 
-	 * @return An instance of the ViewerFilter defined by the extension. Callers
-	 *         of this method are responsible for managing the instantiated
-	 *         filter.
-	 */
-	public ViewerFilter createFilter() {
-		try {
-
-			if (filterExpression != null) {
-
-				if (element.getAttribute(ATT_CLASS) != null) {
-					NavigatorPlugin
-							.log(
-									IStatus.WARNING,
-									0,
-									"A \"commonFilter\" was specified in " + //$NON-NLS-1$
-											element.getDeclaringExtension().getNamespaceIdentifier()
-											+ " which specifies a \"class\" attribute and an Core Expression.\n" + //$NON-NLS-1$
-											"Only the Core Expression will be respected.", //$NON-NLS-1$
-									null);
-				} 
-
-				return new CoreExpressionFilter(filterExpression);
-			}
-
-			return (ViewerFilter) element.createExecutableExtension(ATT_CLASS);
-		} catch (RuntimeException re) {
-			NavigatorPlugin.logError(0, re.getMessage(), re);
-		} catch (CoreException e) {
-			NavigatorPlugin.logError(0, e.getMessage(), e);
-		}
-
-		return SkeletonViewerFilter.INSTANCE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "CommonFilterDescriptor[" + getName() + " (" + getId() + ")]"; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFilterDescriptorManager.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFilterDescriptorManager.java
deleted file mode 100644
index c0478d5..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFilterDescriptorManager.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.filters;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentRegistryReader;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * @since 3.2
- * 
- */
-public class CommonFilterDescriptorManager {
-
-	private static final CommonFilterDescriptorManager INSTANCE = new CommonFilterDescriptorManager();
-
-	private static final CommonFilterDescriptor[] NO_FILTER_DESCRIPTORS = new CommonFilterDescriptor[0];
-
-	private final Set filters = new HashSet();
-
-	/**
-	 * 
-	 * @return An initialized singleton instance of the
-	 *         CommonFilterDescriptorManager.
-	 */
-	public static CommonFilterDescriptorManager getInstance() {
-		return INSTANCE;
-	}
-
-	private CommonFilterDescriptorManager() {
-		new CommonFilterDescriptorRegistry().readRegistry();
-	}
-
-	/**
-	 * 
-	 * @param contentService
-	 *            A content service to filter the visible filters.
-	 * @return The set of filters that are 'visible' to the given viewer
-	 *         descriptor.
-	 */
-	public CommonFilterDescriptor[] findVisibleFilters(INavigatorContentService contentService) {
-
-		List visibleFilters = new ArrayList();
-		CommonFilterDescriptor descriptor;
-		for (Iterator filtersItr = filters.iterator(); filtersItr.hasNext();) {
-			descriptor = (CommonFilterDescriptor) filtersItr.next();
-			if (contentService.isVisible(descriptor.getId())) {
-				visibleFilters.add(descriptor);
-			}
-		}
-		if (visibleFilters.size() == 0) {
-			return NO_FILTER_DESCRIPTORS;
-		}
-		return (CommonFilterDescriptor[]) visibleFilters
-				.toArray(new CommonFilterDescriptor[visibleFilters.size()]);
-	}
-
-	/**
-	 * @param aDescriptor
-	 *            A non-null descriptor
-	 */
-	private void addCommonFilter(CommonFilterDescriptor aDescriptor) {
-		filters.add(aDescriptor);
-	}
-
-	private class CommonFilterDescriptorRegistry extends
-			NavigatorContentRegistryReader {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.navigator.extensions.NavigatorContentRegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
-		 */
-		protected boolean readElement(IConfigurationElement element) {
-			if (TAG_COMMON_FILTER.equals(element.getName())) {
-				addCommonFilter(new CommonFilterDescriptor(element));
-				return true;
-			}
-			return super.readElement(element);
-		}
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFilterLabelProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFilterLabelProvider.java
deleted file mode 100644
index 2c726b4..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFilterLabelProvider.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.filters;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptor;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptorManager;
-import org.eclipse.ui.navigator.ICommonFilterDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-/**
- * 
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as part of a work in
- * progress. There is a guarantee neither that this API will work nor that it will remain the same.
- * Please do not use this API without consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2 
- *
- */
-public class CommonFilterLabelProvider implements ITableLabelProvider, ILabelProvider {
-
-	private static final NavigatorContentDescriptorManager CONTENT_DESCRIPTOR_REGISTRY = NavigatorContentDescriptorManager.getInstance();
-
-	 
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object element) {
-		if (element instanceof NavigatorContentDescriptor) {
-			return CONTENT_DESCRIPTOR_REGISTRY.getImage(((INavigatorContentDescriptor) element).getId());
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object element) {
-		if (element instanceof NavigatorContentDescriptor) {
-			return ((INavigatorContentDescriptor) element).getName();
-		} else if (element instanceof ICommonFilterDescriptor) {
-			return ((ICommonFilterDescriptor) element).getName();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener listener) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
-	 *      java.lang.String)
-	 */
-	public boolean isLabelProperty(Object element, String property) {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Image getColumnImage(Object element, int columnIndex) {
-		switch (columnIndex) {
-			case 0 :
-				return getImage(element);
-
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object element, int columnIndex) {
-		switch (columnIndex) {
-			case 0 :
-				return getText(element);
-			case 1 : {
-				if (element instanceof ICommonFilterDescriptor) {
-					String d = ((ICommonFilterDescriptor) element).getDescription();
-					return d == null ? "" : d; //$NON-NLS-1$
-				}
-			}
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFilterSelectionDialog.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFilterSelectionDialog.java
deleted file mode 100644
index a1a9bb4..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFilterSelectionDialog.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Feb 9, 2004
- *  
- */
-package org.eclipse.ui.internal.navigator.filters;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.resource.ColorRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-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.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.navigator.CommonViewer;
-import org.eclipse.ui.navigator.ICommonFilterDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentService;
-import org.eclipse.ui.navigator.INavigatorViewerDescriptor;
-
-/**
- * 
- * @since 3.2
- * 
- */
-public class CommonFilterSelectionDialog extends Dialog {
-   
-	private static final String FILTER_ICON = "icons/full/elcl16/filter_ps.gif"; //$NON-NLS-1$
-	private static final String CONTENT_ICON = "icons/full/elcl16/content.gif"; //$NON-NLS-1$
-
-	private static final int TAB_WIDTH_IN_DLUS = 300;
-
-	private static final int TAB_HEIGHT_IN_DLUS = 150;
-
-	private final CommonViewer commonViewer;
-
-	private final INavigatorContentService contentService;
-
-	private CTabFolder customizationsTabFolder;
-
-	private CommonFiltersTab commonFiltersTab;
-
-	private ContentExtensionsTab contentExtensionsTab;
-
-	private Text descriptionText;
-
-	private ISelectionChangedListener updateDescriptionSelectionListener; 
-
-	/**
-	 * Public only for tests.
-	 * 
-	 * @param aCommonViewer
-	 */
-	public CommonFilterSelectionDialog(CommonViewer aCommonViewer) {
-		super(aCommonViewer.getControl().getShell());
-		setShellStyle(SWT.RESIZE | getShellStyle());
-
-		commonViewer = aCommonViewer;
-		contentService = commonViewer.getNavigatorContentService(); 
-	} 
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		 
-		getShell()
-				.setText(
-						CommonNavigatorMessages.CommonFilterSelectionDialog_Available_customization_);
-		 
-		
-		Composite superComposite = (Composite) super.createDialogArea(parent);
-		 
-		createCustomizationsTabFolder(superComposite); 
-		
-		commonFiltersTab = new CommonFiltersTab(customizationsTabFolder,
-				contentService);
-		createTabItem(
-				customizationsTabFolder,
-				CommonNavigatorMessages.CommonFilterSelectionDialog_Available_Filters,
-				commonFiltersTab, FILTER_ICON);
-		
-
-		boolean hideExtensionsTab = contentService.getViewerDescriptor()
-				.getBooleanConfigProperty(
-						INavigatorViewerDescriptor.PROP_HIDE_AVAILABLE_EXT_TAB);
-
-		if (!hideExtensionsTab) { 
-			contentExtensionsTab = new ContentExtensionsTab(
-					customizationsTabFolder, contentService);
-
-			createTabItem(
-					customizationsTabFolder,
-					CommonNavigatorMessages.CommonFilterSelectionDialog_Available_Content,
-					contentExtensionsTab, CONTENT_ICON);
-			
-		}
-
-		createDescriptionText(superComposite);
-
-		if (commonFiltersTab != null) {
-			commonFiltersTab.addSelectionChangedListener(getSelectionListener());
-		}
-
-		if (contentExtensionsTab != null) {
-			contentExtensionsTab
-					.addSelectionChangedListener(getSelectionListener());
-		}
-		
-		return customizationsTabFolder;
-	}
-
-	private void createCustomizationsTabFolder(Composite superComposite) {
-		customizationsTabFolder = new CTabFolder (superComposite, SWT.RESIZE | SWT.BORDER);
- 
-		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
-		gd.widthHint = convertHorizontalDLUsToPixels(TAB_WIDTH_IN_DLUS);
-		gd.heightHint = convertVerticalDLUsToPixels(TAB_HEIGHT_IN_DLUS);
-		
-		customizationsTabFolder.setLayout(new GridLayout());
-		customizationsTabFolder.setLayoutData(gd);
-
-		customizationsTabFolder.setFont(superComposite.getFont()); 
-
-		customizationsTabFolder.addSelectionListener(new SelectionListener() {
-
-			public void widgetSelected(SelectionEvent e) {
-				if (descriptionText != null) {
-					descriptionText.setText(""); //$NON-NLS-1$
-				}
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-
-			}
-
-		});
-	  
-		customize();
-
-	}
-
-	private void customize() {
-		ColorRegistry reg = JFaceResources.getColorRegistry();
-		Color c1 = reg.get("org.eclipse.ui.workbench.ACTIVE_TAB_BG_START"), //$NON-NLS-1$
-		  c2 = reg.get("org.eclipse.ui.workbench.ACTIVE_TAB_BG_END"); //$NON-NLS-1$
-		customizationsTabFolder.setSelectionBackground(new Color[] {c1, c2},	new int[] {100}, true);
-		customizationsTabFolder.setSelectionForeground(reg.get("org.eclipse.ui.workbench.ACTIVE_TAB_TEXT_COLOR")); //$NON-NLS-1$
-		customizationsTabFolder.setSimple(true);
-	}
-
-	private CTabItem createTabItem(CTabFolder aTabFolder, String label,
-			Composite composite, String imageKey) {
-		CTabItem extensionsTabItem = new CTabItem(aTabFolder, SWT.BORDER);
-		extensionsTabItem.setText(label);
- 		extensionsTabItem.setControl(composite); 
- 		extensionsTabItem.setImage(NavigatorPlugin.getDefault().getImage(imageKey));
- 		return extensionsTabItem;
-	}
-
-	private void createDescriptionText(Composite composite) {
-
-		descriptionText = new Text(composite, SWT.WRAP | SWT.V_SCROLL
-				| SWT.BORDER);
-		descriptionText.setFont(composite.getFont());
-		descriptionText.setBackground(composite.getBackground());
-		GridData descriptionTextGridData = new GridData(
-				GridData.FILL_HORIZONTAL);
-		descriptionTextGridData.heightHint = convertHeightInCharsToPixels(3);
-		descriptionText.setLayoutData(descriptionTextGridData);
-	}
-
-	private ISelectionChangedListener getSelectionListener() {
-		if (updateDescriptionSelectionListener == null) {
-			updateDescriptionSelectionListener = new FilterDialogSelectionListener(
-					descriptionText);
-		}
-		return updateDescriptionSelectionListener;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-
-		if (contentExtensionsTab != null) {
-			List checkedExtensions = new ArrayList();
-			TableItem[] tableItems = contentExtensionsTab.getTable().getItems();
-			INavigatorContentDescriptor descriptor;
-			for (int i = 0; i < tableItems.length; i++) {
-				descriptor = (INavigatorContentDescriptor) tableItems[i]
-						.getData();
-
-				if (tableItems[i].getChecked()) {
-					checkedExtensions.add(descriptor.getId());
-				}
-			}
-			String[] contentExtensionIdsToActivate = (String[]) checkedExtensions
-					.toArray(new String[checkedExtensions.size()]);
-			UpdateActiveExtensionsOperation updateExtensions = new UpdateActiveExtensionsOperation(
-					commonViewer, contentExtensionIdsToActivate);
-			updateExtensions.execute(null, null);
-		}
-
-		if (commonFiltersTab != null) {
-			Set checkedFilters = commonFiltersTab.getCheckedItems();
-			
-			String[] filterIdsToActivate = new String[checkedFilters.size()];
-			int indx = 0;
-			for (Iterator iterator = checkedFilters.iterator(); iterator
-					.hasNext();) {
-				ICommonFilterDescriptor descriptor = (ICommonFilterDescriptor) iterator
-						.next();
-
-				filterIdsToActivate[indx++] = descriptor.getId();
-
-			} 
-			UpdateActiveFiltersOperation updateFilters = new UpdateActiveFiltersOperation(
-					commonViewer, filterIdsToActivate, true);
-			updateFilters.execute(null, null);
-		}
-
-		super.okPressed();
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFiltersTab.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFiltersTab.java
deleted file mode 100644
index efcd73d..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CommonFiltersTab.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.filters;
-
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-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.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
-import org.eclipse.ui.internal.navigator.StringMatcher;
-import org.eclipse.ui.navigator.ICommonFilterDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentService;
-import org.eclipse.ui.navigator.INavigatorFilterService;
-
-/**
- * @since 3.2
- * 
- */
-public class CommonFiltersTab extends CustomizationTab { 
- 
-	private static final String ALL = "*"; //$NON-NLS-1$
-
-	private String initialFilterTextValue = CommonNavigatorMessages.CommonFilterSelectionDialog_enter_name_of_filte_;
-
-	private Text filterText;
-
-	private ILabelProvider filterLabelProvider = new CommonFilterLabelProvider();
-
-	private CommonFilterContentProvider filterContentProvider = new CommonFilterContentProvider();
-
-	private TablePatternFilter patternFilter = new TablePatternFilter();
-
-	protected CommonFiltersTab(Composite parent,
-			INavigatorContentService aContentService) {
-		super(parent, aContentService);
-		createControl();
-	} 
-	  
-	private void createControl() {  
-
-		createInstructionsLabel(CommonNavigatorMessages.CommonFilterSelectionDialog_Select_the_filters_to_apply);
-		
-		createPatternFilterText(this);
-		
-		createTable(); 
-
-		getTableViewer().setContentProvider(filterContentProvider);
-		getTableViewer().setLabelProvider(filterLabelProvider);
-		getTableViewer().setSorter(new CommonFilterSorter());
-		getTableViewer().setInput(getContentService());
-		
-		getTableViewer().addFilter(patternFilter);
-		
-		updateFiltersCheckState();
-
-	}
-
-	private void createPatternFilterText(Composite composite) {
-		filterText = new Text(composite, SWT.SINGLE | SWT.BORDER);
-		GridData filterTextGridData = new GridData(GridData.FILL_HORIZONTAL); 
-		filterText.setLayoutData(filterTextGridData);
-		filterText.setText(initialFilterTextValue);
-		filterText.setFont(composite.getFont());
-
-		filterText.getAccessible().addAccessibleListener(
-				new AccessibleAdapter() {
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.swt.accessibility.AccessibleListener#getName(org.eclipse.swt.accessibility.AccessibleEvent)
-					 */
-					public void getName(AccessibleEvent e) {
-						String filterTextString = filterText.getText();
-						if (filterTextString.length() == 0) {
-							e.result = initialFilterTextValue;
-						} else {
-							e.result = filterTextString;
-						}
-					}
-				});
-
-		filterText.addFocusListener(new FocusAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt.events.FocusEvent)
-			 */
-			public void focusGained(FocusEvent e) {
-				if (initialFilterTextValue.equals(filterText.getText().trim())) {
-					filterText.selectAll();
-				}
-			}
-		});
-
-		filterText.addMouseListener(new MouseAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.MouseAdapter#mouseUp(org.eclipse.swt.events.MouseEvent)
-			 */
-			public void mouseUp(MouseEvent e) {
-				super.mouseUp(e);
-				if (initialFilterTextValue.equals(filterText.getText().trim())) {
-					filterText.selectAll();
-				}
-			}
-		});
-
-		filterText.addKeyListener(new KeyAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.KeyAdapter#keyReleased(org.eclipse.swt.events.KeyEvent)
-			 */
-			public void keyPressed(KeyEvent e) {
-				// on a CR we want to transfer focus to the list
-				boolean hasItems = getTable().getItemCount() > 0;
-				if (hasItems && e.keyCode == SWT.ARROW_DOWN) {
-					getTable().setFocus();
-				} else if (e.character == SWT.CR) {
-					return;
-				}
-			}
-		});
-
-		// enter key set focus to tree
-		filterText.addTraverseListener(new TraverseListener() {
-			public void keyTraversed(TraverseEvent e) {
-				if (e.detail == SWT.TRAVERSE_RETURN) {
-					e.doit = false;
-					if (getTableViewer().getTable().getItemCount() == 0) {
-						Display.getCurrent().beep();
-					} else {
-						// if the initial filter text hasn't changed, do not try
-						// to match
-						boolean hasFocus = getTable().setFocus();
-						boolean textChanged = !initialFilterTextValue
-								.equals(filterText.getText().trim());
-						if (hasFocus && textChanged
-								&& filterText.getText().trim().length() > 0) {
-							TableItem item = getFirstHighlightedItem(getTable()
-									.getItems());
-							if (item != null) {
-								getTable().setSelection(
-										new TableItem[] { item });
-								ISelection sel = getTableViewer()
-										.getSelection();
-								getTableViewer().setSelection(sel, true);
-							}
-						}
-					}
-				}
-			}
-
-			private TableItem getFirstHighlightedItem(TableItem[] items) {
-				for (int i = 0; i < items.length; i++) {
-					if (patternFilter.match(items[i].getText())) {
-						return items[i];
-					}
-				}
-				return null;
-			}
-		});
-
-		filterText.addModifyListener(new ModifyListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
-			 */
-			public void modifyText(ModifyEvent e) {
-				textChanged();
-			}
-		});
-	}
-
-	private void textChanged() {
-		patternFilter.setPattern(filterText.getText());
-		getTableViewer().refresh();
-		
-		Set checkedItems = getCheckedItems();
-		for (Iterator iterator = checkedItems.iterator(); iterator.hasNext();) {  
-			getTableViewer().setChecked(iterator.next(), true);
-		}
-	} 
-
-	private void updateFiltersCheckState() {
-		Object[] children = filterContentProvider
-				.getElements(getContentService());
-		ICommonFilterDescriptor filterDescriptor;
-		INavigatorFilterService filterService = getContentService()
-				.getFilterService();
-		for (int i = 0; i < children.length; i++) {
-			filterDescriptor = (ICommonFilterDescriptor) children[i];
-			if(filterService.isActive(filterDescriptor.getId())) {
-				getTableViewer().setChecked(children[i], true);
-				getCheckedItems().add(children[i]);
-			} else {
-				getTableViewer().setChecked(children[i], false);
-			}
-		}
-	}
-
-	private class TablePatternFilter extends ViewerFilter {
-
-		private StringMatcher matcher = null;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public boolean select(Viewer viewer, Object parentElement,
-				Object element) {
-			return match(filterLabelProvider.getText(element));
-		}
-
-		protected void setPattern(String newPattern) {
-			if (newPattern == null || newPattern.trim().length() == 0) {
-				matcher = new StringMatcher(ALL, true, false);  
-			} else {
-				String patternString = ALL + newPattern + ALL; 
-				matcher = new StringMatcher(patternString, true, false);
-			}
-
-		} 
-
-		/**
-		 * Answers whether the given String matches the pattern.
-		 * 
-		 * @param input
-		 *            the String to test
-		 * 
-		 * @return whether the string matches the pattern
-		 */
-		protected boolean match(String input) {
-			if (input == null) {
-				return false;
-			}
-			return matcher == null || matcher.match(input);
-		}
-
-		protected boolean match(TableItem tableItem) {
-			if (tableItem == null || tableItem.getData() == null) {
-				return false;
-			}
-			return match(filterLabelProvider.getText(tableItem.getData()));
-		}
-	}
- 
-	private class CommonFilterSorter extends ViewerSorter {
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ViewerSorter#sort(org.eclipse.jface.viewers.Viewer, java.lang.Object[])
-		 */
-		public void sort(Viewer viewer, Object[] elements) {
-			Arrays.sort(elements, new Comparator() {
-				/* (non-Javadoc)
-				 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-				 */
-				public int compare(Object o1, Object o2) { 
-					ICommonFilterDescriptor lvalue = (ICommonFilterDescriptor) o1;
-					ICommonFilterDescriptor rvalue = (ICommonFilterDescriptor) o2;
-					
-					return lvalue.getName().compareTo(rvalue.getName());
-				}
-			});
-		
-		}
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/ContentDescriptorContentProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/ContentDescriptorContentProvider.java
deleted file mode 100644
index c63855a..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/ContentDescriptorContentProvider.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.filters;
-
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-class ContentDescriptorContentProvider implements ITreeContentProvider {
-
-	private static final Object[] NO_CHILDREN = new Object[0];
-
-	private INavigatorContentService contentService;
-
-	private CheckboxTableViewer talbleViewer;
-
-	public void inputChanged(Viewer aViewer, Object anOldInput, Object aNewInput) {
-
-		if (aNewInput != null) {
-
-			if (aNewInput instanceof INavigatorContentService) {
-				contentService = (INavigatorContentService) aNewInput;
-			}
-
-			if (aViewer instanceof CheckboxTableViewer) {
-				talbleViewer = (CheckboxTableViewer) aViewer;
-			}
-
-			updateCheckState();
-		} else {
-			contentService = null;
-			talbleViewer = null;
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(Object aParentElement) {
-		return NO_CHILDREN;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object anElement) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object anElement) {
-		return getChildren(anElement).length != 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object anInputElement) {
-		return contentService != null ? contentService.getVisibleExtensions()
-				: NO_CHILDREN;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-
-	}
-
-	private void updateCheckState() {
-		if (talbleViewer == null || contentService == null) {
-			return;
-		}
-
-		INavigatorContentDescriptor descriptor;
-		boolean enabled;
-
-		TableItem[] descriptorTableItems = talbleViewer.getTable().getItems();
-		for (int i = 0; i < descriptorTableItems.length; i++) {
-			if (descriptorTableItems[i].getData() instanceof INavigatorContentDescriptor) {
-				descriptor = (INavigatorContentDescriptor) descriptorTableItems[i]
-						.getData();
-				enabled = contentService.getActivationService()
-						.isNavigatorExtensionActive(descriptor.getId());
-				talbleViewer.setChecked(descriptor, enabled);
-			}
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/ContentExtensionsTab.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/ContentExtensionsTab.java
deleted file mode 100644
index 65ad163..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/ContentExtensionsTab.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.filters;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * @since 3.2
- * 
- */
-public class ContentExtensionsTab extends CustomizationTab {
-
-	protected ContentExtensionsTab(Composite parent,
-			INavigatorContentService aContentService) {
-		super(parent, aContentService);
-		createControl();
-
-	}
-
-	private void createControl() { 
-				
-		createInstructionsLabel(CommonNavigatorMessages.CommonFilterSelectionDialog_Select_the_available_extensions);
-		
-		createTable();
-
-		getTableViewer().setContentProvider(new ContentDescriptorContentProvider());
-		getTableViewer().setLabelProvider(new CommonFilterLabelProvider());
-		getTableViewer().setInput(getContentService());
-
-		updateCheckedState();
-
-	}
-
-
-	private void updateCheckedState() {
-		INavigatorContentDescriptor[] visibleExtensions = getContentService()
-				.getVisibleExtensions();
-		for (int i = 0; i < visibleExtensions.length; i++) {
-			if (getContentService().isActive(visibleExtensions[i].getId())) {
-				getTableViewer().setChecked(visibleExtensions[i], true);
-			}
-		}
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CoreExpressionFilter.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CoreExpressionFilter.java
deleted file mode 100644
index e643534..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CoreExpressionFilter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.filters;
-
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-
-/**
- * @since 3.2
- * 
- */
-public class CoreExpressionFilter extends ViewerFilter {
-
-	private Expression filterExpression;
-
-	/**
-	 * Creates a filter which hides all elements that match the given
-	 * expression.
-	 * 
-	 * @param aFilterExpression
-	 *            An expression to hide elements in the viewer.
-	 */
-	public CoreExpressionFilter(Expression aFilterExpression) {
-		filterExpression = aFilterExpression;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public boolean select(Viewer viewer, Object parentElement, Object element) {
-
-		try {
-			return (filterExpression.evaluate(new EvaluationContext(null,
-					element)) != EvaluationResult.TRUE);
-		} catch (CoreException e) {
-			NavigatorPlugin.logError(0, e.getMessage(), e);
-		}
-		return true;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CustomizationTab.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CustomizationTab.java
deleted file mode 100644
index 85da6c6..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/CustomizationTab.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.filters;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-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.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * @since 3.2
- * 
- */
-public class CustomizationTab extends Composite { 
- 
- 
-	private final INavigatorContentService contentService;
-
-	private CheckboxTableViewer tableViewer;
-	private final Set checkedItems = new HashSet();
-
-	private ICheckStateListener checkListener = new ICheckStateListener() {
-
-		public void checkStateChanged(CheckStateChangedEvent event) {
-			if(event.getChecked())
-				checkedItems.add(event.getElement());
-			else
-				checkedItems.remove(event.getElement());
-		}
-		
-	};
- 
-	protected CustomizationTab(Composite parent,
-			INavigatorContentService aContentService) {
-		super(parent, SWT.RESIZE);
- 
-		contentService = aContentService;
-		setFont(getParent().getFont()); 
-		setLayout(new GridLayout()); 
-		GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); 
-		setData(data);
- 
-	}
-
-	protected Table getTable() {
-		return tableViewer.getTable();
-	}
-
-	protected void addSelectionChangedListener(
-			ISelectionChangedListener selectionListener) {
-		if (tableViewer != null) {
-			tableViewer
-					.addSelectionChangedListener(selectionListener);
-		}
-	}
-
-	protected void createTable() {
-		  
-		tableViewer = CheckboxTableViewer.newCheckList(this,SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);		
-		tableViewer.addCheckStateListener(checkListener);		
-		
-		tableViewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));		
-		tableViewer.getControl().setFont(getFont());
-
-	} 
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Widget#dispose()
-	 */
-	public void dispose() { 
-		tableViewer.removeCheckStateListener(checkListener);
-		super.dispose();
-		
-	}
-
-	protected void createInstructionsLabel(String labelText) {
-		 
-		Label extensionsInstructionLabel = new Label(this, SWT.BOLD | SWT.WRAP);
-
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.VERTICAL_ALIGN_FILL); 
-
-		extensionsInstructionLabel.setLayoutData(gridData);
-		extensionsInstructionLabel.setFont(getFont());
-		extensionsInstructionLabel.setText(labelText);
-	}
-	 
-
-	protected final INavigatorContentService getContentService() {
-		return contentService;
-	}
-
-	protected final CheckboxTableViewer getTableViewer() {
-		return tableViewer;
-	}
-
-	protected Set getCheckedItems() {
-		return checkedItems;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/FilterActionGroup.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/FilterActionGroup.java
deleted file mode 100644
index c575cc6..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/FilterActionGroup.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.filters;
-
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.navigator.CommonViewer;
-import org.eclipse.ui.navigator.INavigatorViewerDescriptor;
-
-/**
- * Creates the last 5 filters that were touched as view menu options.
- * 
- * @since 3.2
- * 
- */
-public class FilterActionGroup extends ActionGroup {	
-
-	private static final String FILTER_ACTION_GROUP = "filterActionGroup"; //$NON-NLS-1$
-	
-	private static final String FILTER_ACTION_GROUP_FILTERS_START = FILTER_ACTION_GROUP+"Filters-start"; //$NON-NLS-1$
-
-	private static final String FILTER_ACTION_GROUP_FILTERS_END = FILTER_ACTION_GROUP+"Filters-end"; //$NON-NLS-1$	
-	
-	private SelectFiltersAction selectFiltersAction;
-	private CommonViewer commonViewer;
-	private INavigatorViewerDescriptor viewerDescriptor;
-	
-	private final Set filterShortcutActions = new LinkedHashSet();
-	
-
-	/**
-	 * @param aCommonViewer The viewer this action group is associated with
-	 */
-	public FilterActionGroup(CommonViewer aCommonViewer) {
-		Assert.isNotNull(aCommonViewer);
-		commonViewer = aCommonViewer;
-		viewerDescriptor = commonViewer.getNavigatorContentService().getViewerDescriptor();
-		makeActions();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillActionBars(org.eclipse.ui.IActionBars)
-	 */
-	public void fillActionBars(IActionBars actionBars) {
-		IMenuManager menu = actionBars.getMenuManager();
-		menu.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS,
-				new Separator(FILTER_ACTION_GROUP));
-		if (selectFiltersAction != null) { 
-			menu.appendToGroup(FILTER_ACTION_GROUP,
-					selectFiltersAction);
-			
-			menu.appendToGroup(FILTER_ACTION_GROUP,
-					new GroupMarker(FILTER_ACTION_GROUP_FILTERS_START));
-			
-			menu.appendToGroup(FILTER_ACTION_GROUP_FILTERS_START,
-					new Separator(FILTER_ACTION_GROUP_FILTERS_END));
-			
-			
-			for (Iterator iter = filterShortcutActions.iterator(); iter.hasNext();) {
-				IAction action = (IAction) iter.next();
-				menu.appendToGroup(FILTER_ACTION_GROUP_FILTERS_START, action);				
-			}			
-			
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) { 
-		super.fillContextMenu(menu);
-	}
-
-	/**
-	 * 
-	 */
-	private void makeActions() {
-		boolean hideAvailableCustomizationsDialog = viewerDescriptor
-				.getBooleanConfigProperty(INavigatorViewerDescriptor.PROP_HIDE_AVAILABLE_CUSTOMIZATIONS_DIALOG);
-		if (!hideAvailableCustomizationsDialog) {
-			selectFiltersAction = new SelectFiltersAction(commonViewer, this);
-			ImageDescriptor selectFiltersIcon = NavigatorPlugin.getImageDescriptor("icons/full/elcl16/filter_ps.gif"); //$NON-NLS-1$ 
-			selectFiltersAction.setImageDescriptor(selectFiltersIcon);
-			selectFiltersAction.setHoverImageDescriptor(selectFiltersIcon);
-		}
-	}
-	
-	protected void updateFilterShortcuts() {
-		
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/FilterDialogSelectionListener.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/FilterDialogSelectionListener.java
deleted file mode 100644
index d5d7a1c..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/FilterDialogSelectionListener.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.filters;
-
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
-import org.eclipse.ui.navigator.ICommonFilterDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-
-/**
- * @since 3.2
- * 
- */
-public class FilterDialogSelectionListener implements ISelectionChangedListener {
-	
-	
-	private Text descriptionText;
-
-	protected FilterDialogSelectionListener(Text aDescriptionText) {
-		descriptionText = aDescriptionText;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-
-		IStructuredSelection structuredSelection = (IStructuredSelection) event
-				.getSelection();
-		Object element = structuredSelection.getFirstElement();
-		if (element instanceof INavigatorContentDescriptor) {
-			INavigatorContentDescriptor ncd = (INavigatorContentDescriptor) element;
-			String desc = NLS
-					.bind(
-							CommonNavigatorMessages.CommonFilterSelectionDialog_Hides_all_content_associated,
-							new Object[] { ncd.getName() });
-			descriptionText.setText(desc);
-		} else if (element instanceof ICommonFilterDescriptor) {
-			ICommonFilterDescriptor cfd = (ICommonFilterDescriptor) element;
-			String description = 	cfd.getDescription();
-			if(description != null)
-				descriptionText.setText(description);
-			else 
-				descriptionText.setText(NLS.bind(CommonNavigatorMessages.FilterDialogSelectionListener_Enable_the_0_filter_, cfd.getName()));
-		}
-
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/SelectFiltersAction.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/SelectFiltersAction.java
deleted file mode 100644
index 2219dbe..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/SelectFiltersAction.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Feb 9, 2004
- *
- */
-package org.eclipse.ui.internal.navigator.filters;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
-import org.eclipse.ui.navigator.CommonViewer;
-
-/**
- * 
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as part of a work in
- * progress. There is a guarantee neither that this API will work nor that it will remain the same.
- * Please do not use this API without consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- */
-public class SelectFiltersAction extends Action {
-
-	private final CommonViewer commonViewer;
-	private FilterActionGroup filterGroup; 
-
-	/**
-	 * Create an action to drive the Filter selection dialog
-	 * for a particular instance of the CommonViewer.
-	 * @param aCommonViewer
-	 * @param aFilterGroup 
-	 */
-	public SelectFiltersAction(CommonViewer aCommonViewer, FilterActionGroup aFilterGroup) {
-		super(CommonNavigatorMessages.SelectFiltersActionDelegate_0); 
-		setToolTipText(CommonNavigatorMessages.SelectFiltersActionDelegate_1); 
-		commonViewer = aCommonViewer; 
-		filterGroup = aFilterGroup;
-	}
-
-	public void run() {
-		CommonFilterSelectionDialog filterSelectionDialog = new CommonFilterSelectionDialog(commonViewer);
-		filterSelectionDialog.open();
-		filterGroup.updateFilterShortcuts();
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/SkeletonViewerFilter.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/SkeletonViewerFilter.java
deleted file mode 100644
index 51cd63b..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/SkeletonViewerFilter.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.filters;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-/**
- * 
- * A no-op viewer filter used to prevent null return values from
- * {@link CommonFilterDescriptor#createFilter()}.
- * 
- * @since 3.2
- * 
- */
-public class SkeletonViewerFilter extends ViewerFilter {
-
-	/**
-	 * The singleton instance.
-	 */
-	public static final SkeletonViewerFilter INSTANCE = new SkeletonViewerFilter();
-
-	private SkeletonViewerFilter() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public boolean select(Viewer viewer, Object parentElement, Object element) {
-
-		return true;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/ToggleFilterAction.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/ToggleFilterAction.java
deleted file mode 100644
index dd24ab8..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/ToggleFilterAction.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.filters;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.ui.internal.navigator.NavigatorFilterService;
-import org.eclipse.ui.navigator.CommonViewer;
-import org.eclipse.ui.navigator.ICommonFilterDescriptor;
-
-/**
- * @since 3.2
- * 
- */
-public class ToggleFilterAction extends Action {
-
-	private ICommonFilterDescriptor descriptor;
-
-	private NavigatorFilterService filterService;
-
-	private CommonViewer commonViewer;
-
-	protected ToggleFilterAction(CommonViewer aCommonViewer,
-			NavigatorFilterService aFilterService,
-			ICommonFilterDescriptor aFilterDescriptor) {
-		Assert.isNotNull(aCommonViewer);
-		Assert.isNotNull(aFilterService);
-		Assert.isNotNull(aFilterDescriptor);
-
-		commonViewer = aCommonViewer;
-		filterService = aFilterService;
-		descriptor = aFilterDescriptor;
-
-		setChecked(filterService.isActive(descriptor.getId()));
-		setText(descriptor.getName());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-
-		boolean toMakeActive = !isChecked();
-
-		filterService.setActive(descriptor.getId(), toMakeActive);
-		filterService.persistFilterActivationState();
-
-		ViewerFilter viewerFilter = filterService.getViewerFilter(descriptor);
-		if (toMakeActive) {
-			commonViewer.addFilter(viewerFilter);
-		} else {
-			commonViewer.removeFilter(viewerFilter);
-		}
-
-		// the action providers may no longer be enabled, so we
-		// reset the selection.
-		commonViewer.setSelection(StructuredSelection.EMPTY);
-
-		setChecked(toMakeActive);
-
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/UpdateActiveExtensionsOperation.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/UpdateActiveExtensionsOperation.java
deleted file mode 100644
index ec9f3bc..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/UpdateActiveExtensionsOperation.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.filters;
-
-import java.util.Arrays;
-
-import org.eclipse.core.commands.operations.AbstractOperation;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
-import org.eclipse.ui.navigator.CommonViewer;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * Ensures that a given set of content extensions is <i>active</i> and a second
- * non-intersecting set of content extensions are not <i>active</i>.
- * 
- * <p>
- * This operation is smart enough not to force any change if each id in each set
- * is already in its desired state (<i>active</i> or <i>inactive</i>).
- * </p>
- * 
- * @since 3.2
- * 
- */
-public class UpdateActiveExtensionsOperation extends AbstractOperation {
-
-	private String[] contentExtensionsToActivate;
-
-	private final CommonViewer commonViewer;
-
-	private final INavigatorContentService contentService;
-
-	/**
-	 * Create an operation to activate extensions and refresh the viewer.
-	 * 
-	 * p> To use only one part of this operation (either "activate" or
-	 * "deactivate", but not both), then supply <b>null</b> for the array state
-	 * you are not concerned with.
-	 * </p>
-	 * 
-	 * @param aCommonViewer
-	 *            The CommonViewer instance to update
-	 * @param theExtensionsToActivate
-	 *            An array of ids that correspond to the extensions that should
-	 *            be in the <i>active</i> state after this operation executes.
-	 */
-	public UpdateActiveExtensionsOperation(CommonViewer aCommonViewer,
-			String[] theExtensionsToActivate) {
-		super(
-				CommonNavigatorMessages.UpdateFiltersOperation_Update_CommonViewer_Filter_);
-		commonViewer = aCommonViewer;
-		contentService = commonViewer.getNavigatorContentService();
-		contentExtensionsToActivate = theExtensionsToActivate;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.AbstractOperation#execute(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info) {
-
-		boolean updateExtensionActivation = false;
-
-		// we sort the array in order to use Array.binarySearch();
-		Arrays.sort(contentExtensionsToActivate);
-		
-		IStructuredSelection ssel = null;
-	
-		try {
-			commonViewer.getControl().setRedraw(false);
-			
-			ISelection selection = commonViewer.getSelection();
-			if(selection instanceof IStructuredSelection)
-				ssel = (IStructuredSelection) selection;
-
-			INavigatorContentDescriptor[] visibleContentDescriptors = contentService
-					.getVisibleExtensions();
-
-			int indexofContentExtensionIdToBeActivated;
-			/* is there a delta? */
-			for (int i = 0; i < visibleContentDescriptors.length
-					&& !updateExtensionActivation; i++) {
-				indexofContentExtensionIdToBeActivated = Arrays.binarySearch(
-						contentExtensionsToActivate,
-						visibleContentDescriptors[i].getId());
-				/*
-				 * Either we have a filter that should be active that isn't XOR
-				 * a filter that shouldn't be active that is currently
-				 */
-				if (indexofContentExtensionIdToBeActivated >= 0
-						^ contentService.isActive(visibleContentDescriptors[i]
-								.getId())) {
-					updateExtensionActivation = true;
-				}
-			}
-
-			/* If so, update */
-			if (updateExtensionActivation) {
-				 
-				contentService.getActivationService().activateExtensions(
-						contentExtensionsToActivate, true);
-				contentService.getActivationService()
-						.persistExtensionActivations();
-				
-
-				Object[] expandedElements = commonViewer.getExpandedElements();
-
-				contentService.update();
-
-				commonViewer.refresh();
-				
-				Object[] originalObjects = ssel.toArray(); 
-				
-				commonViewer.setExpandedElements(expandedElements);
-
-				IStructuredSelection newSelection = new StructuredSelection(originalObjects);
-				commonViewer.setSelection(newSelection, true); 				
-			}
-
-		} finally {
-			commonViewer.getControl().setRedraw(true);
-		} 
-
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.AbstractOperation#redo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus redo(IProgressMonitor monitor, IAdaptable info) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.AbstractOperation#undo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus undo(IProgressMonitor monitor, IAdaptable info) {
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/UpdateActiveFiltersOperation.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/UpdateActiveFiltersOperation.java
deleted file mode 100644
index d8fd68f..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/filters/UpdateActiveFiltersOperation.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.filters;
-
-import java.util.Arrays;
-
-import org.eclipse.core.commands.operations.AbstractOperation;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
-import org.eclipse.ui.internal.navigator.NavigatorFilterService;
-import org.eclipse.ui.navigator.CommonViewer;
-import org.eclipse.ui.navigator.ICommonFilterDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentService;
-import org.eclipse.ui.navigator.INavigatorFilterService;
-
-/**
- * Ensures that a given set of filters is <i>active</i> and the complement of
- * that set of filters are not <i>active</i>.
- * 
- * <p>
- * This operation is smart enough not to force any change if each id in each set
- * is already in its desired state (<i>active</i> or <i>inactive</i>).
- * </p>
- * 
- * @since 3.2
- * 
- */
-public class UpdateActiveFiltersOperation extends AbstractOperation {
-
-	private String[] filterIdsToActivate; 
-
-	private final CommonViewer commonViewer;
-
-	private final INavigatorContentService contentService;
-
-	private boolean disableTheComplement;
-
-	/**
-	 * Create an operation to activate extensions and refresh the viewer.
-	 * 
-	 * 
-	 * @param aCommonViewer
-	 *            The CommonViewer instance to update
-	 * @param theActiveFilterIds
-	 *            An array of ids that correspond to the filters that should be
-	 *            in the <i>active</i> state after this operation executes. The
-	 *            complement of this set will likewise be in the <i>inactive</i>
-	 *            state after this operation executes.
-	 *            @param toDisableTheComplement True indicates that all filters not in the set should be made inactive.
-	 */
-	public UpdateActiveFiltersOperation(CommonViewer aCommonViewer,
-			String[] theActiveFilterIds, boolean toDisableTheComplement) {
-		super(
-				CommonNavigatorMessages.UpdateFiltersOperation_Update_CommonViewer_Filter_);
-		Assert.isNotNull(theActiveFilterIds);
-		
-		commonViewer = aCommonViewer;
-		contentService = commonViewer.getNavigatorContentService();
-		filterIdsToActivate = theActiveFilterIds;
-		disableTheComplement = toDisableTheComplement;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.AbstractOperation#execute(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info) {
-
-		boolean updateFilterActivation = false;
-		
-		// we sort the array in order to use Array.binarySearch();
-		Arrays.sort(filterIdsToActivate);
-		
-
-		try {
-			commonViewer.getControl().setRedraw(false);
-
-			INavigatorFilterService filterService = contentService
-					.getFilterService();
-
-			if(disableTheComplement) {
-			
-				ICommonFilterDescriptor[] visibleFilterDescriptors = filterService
-						.getVisibleFilterDescriptors();
-
-				int indexofFilterIdToBeActivated;
-
-				/* is there a delta? */
-				for (int i = 0; i < visibleFilterDescriptors.length
-						&& !updateFilterActivation; i++) {
-					indexofFilterIdToBeActivated = Arrays.binarySearch(
-							filterIdsToActivate, visibleFilterDescriptors[i]
-									.getId());
-
-					/*
-					 * Either we have a filter that should be active that isn't
-					 * XOR a filter that shouldn't be active that is currently
-					 */
-					if (indexofFilterIdToBeActivated >= 0
-							^ filterService
-									.isActive(visibleFilterDescriptors[i]
-											.getId())) {
-						updateFilterActivation = true;
-					}
-				}
-
-				/* If so, update */
-				if (updateFilterActivation) {
-
-					filterService.setActiveFilterIds(filterIdsToActivate);
-					filterService.persistFilterActivationState();
-
-					commonViewer.resetFilters();
-
-					ViewerFilter[] visibleFilters = filterService
-							.getVisibleFilters(true);
-					for (int i = 0; i < visibleFilters.length; i++) {
-						commonViewer.addFilter(visibleFilters[i]);
-					}
-
-					// the action providers may no longer be enabled, so we
-					// reset the selection.
-					commonViewer.setSelection(StructuredSelection.EMPTY);
-				}
-			} else {
-				NavigatorFilterService internalFilterService = (NavigatorFilterService)filterService;
-				
-				internalFilterService.addActiveFilterIds(filterIdsToActivate);
-
-				ICommonFilterDescriptor[] visibleDescriptors = filterService
-						.getVisibleFilterDescriptors();
-				for (int i = 0; i < visibleDescriptors.length; i++) {
-					if(Arrays.binarySearch(filterIdsToActivate, visibleDescriptors[i].getId()) >= 0 ) {
-						commonViewer.addFilter(internalFilterService.getViewerFilter(visibleDescriptors[i]));
-					}
-				}
-
-				// the action providers may no longer be enabled, so we
-				// reset the selection.
-				commonViewer.setSelection(StructuredSelection.EMPTY);
-			}
-
-		} finally {
-			commonViewer.getControl().setRedraw(true);
-		}
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.AbstractOperation#redo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus redo(IProgressMonitor monitor, IAdaptable info) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.AbstractOperation#undo(org.eclipse.core.runtime.IProgressMonitor,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus undo(IProgressMonitor monitor, IAdaptable info) {
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/messages.properties b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/messages.properties
deleted file mode 100644
index 63492ad..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/messages.properties
+++ /dev/null
@@ -1,45 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-#String externalization, key=value
-#Thu Feb 02 14:22:56 EST 2006
-CommonFilterSelectionDialog_Available_customization_=Available Customizations
-CommonSorterDescriptorManager_A_navigatorContent_extension_does_n_=A navigatorContent extension does not exist with id\: {0} in plugin {1}
-
-Delete=Delete
-Could_not_provide_children_for_element=Could not acquire children from extension\: {0}
-NewProjectWizard_errorTitle=New Project Problems
-Link_With_Editor_Job_=Linking viewer selection with current editor   
-Navigator_statusLineMultiSelect={0} items selected
-SelectFiltersActionDelegate_1=Select and deselect filters to apply to the content in the tree
-CommonFilterSelectionDialog_Select_the_available_extensions=Select the available extensions to show (unchecked extensions will not display content)\:
-SelectFiltersActionDelegate_0=&Customize View...
-CollapseAllActionDelegate_0=Collapse All 
-Too_many_elements_Warning=Too many elements of type\: {0} in extension "{1}" defined in bundle "{2}".
-NewProjectAction_text=P&roject...
-CommonFilterSelectionDialog_Available_Content=Content
-CommonFilterSelectionDialog_Hides_all_content_associated=Provides content from the "{0}" extension.
-Attribute_Missing_Warning=Missing attribute\: {0} in extension "{1}" defined in bundle "{2}".
-Open_action_label=Open
-TextAction_selectAll=Select All
-Paste=Paste 
-CommonFilterSelectionDialog_Available_Filters=Filters
-StructuredViewerManager_0=Refresh Common Viewer Tree
-LinkEditorActionDelegate_1=Link open editors with content in the Navigator
-LinkEditorActionDelegate_0=&Link Editor
-Copy=Copy 
-Cut=Cut
-NavigatorViewerDescriptor_Popup_Menu_Overridden=Warning\: popupMenuId of "{0}" was overridden\: old value \= "{1}", new value \= "{2}".
-CommonFilterSelectionDialog_Select_the_filters_to_apply=Select the filters to apply (matching items will be hidden)\:
-UpdateFiltersOperation_Update_CommonViewer_Filter_=Update CommonViewer Filters
-CommonFilterSelectionDialog_enter_name_of_filte_=enter name of filter
-CommonSorterDescriptorManager_A_navigatorContent_extesnion_in_0_=A navigatorContent extesnion in {0} is missing an id.
-FilterDialogSelectionListener_Enable_the_0_filter_=Enable the {0} filter.
-NavigatorContentServiceLabelProvider_Error_no_label_provider_for_0_=Error: no label provider for {0}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/sorters/CommonSorterDescriptor.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/sorters/CommonSorterDescriptor.java
deleted file mode 100644
index 14a1230..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/sorters/CommonSorterDescriptor.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.sorters;
-
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.ui.internal.navigator.CustomAndExpression;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtPtConstants;
-
-/**
- * 
- * Describes a <b>commonSorter</b> element under a
- * <b>org.eclipse.ui.navigator.navigatorContent</b> extension.
- * 
- * @since 3.2
- */
-public class CommonSorterDescriptor implements INavigatorContentExtPtConstants {
-
-	private IConfigurationElement element;
-
-	private Expression parentExpression;
-
-	private String id;
-
-	protected CommonSorterDescriptor(IConfigurationElement anElement) { 
-		element = anElement;
-		init();
-	}
-
-	private void init() {
-		id = element.getAttribute(ATT_ID);
-		if (id == null) {
-			id = ""; //$NON-NLS-1$
-		}
-		IConfigurationElement[] children = element
-				.getChildren(TAG_PARENT_EXPRESSION);
-		if (children.length == 1) {
-			parentExpression = new CustomAndExpression(children[0]);
-		}
-	}
-
-	/**
-	 * 
-	 * @return An identifier used to determine whether the sorter is visible.
-	 *         May not be unique.
-	 */
-	public String getId() {
-		return id;
-	}
- 
-	/**
-	 * 
-	 * @param aParent
-	 *            An element from the viewer
-	 * @return True if and only if this CommonSorter can sort the children of
-	 *         the given parent.
-	 */
-	public boolean isEnabledForParent(Object aParent) {
-		if(aParent == null) {
-			return false;
-		}
-
-		if (parentExpression != null) {
-			EvaluationContext context = new EvaluationContext(null, aParent);
-			context.setAllowPluginActivation(true);
-			try {
-				return parentExpression.evaluate(context) == EvaluationResult.TRUE;
-			} catch (CoreException e) {
-				NavigatorPlugin.logError(0, e.getMessage(), e);
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * 
-	 * @return An instance of the ViewerSorter defined by the extension. Callers
-	 *         of this method are responsible for managing the instantiated
-	 *         filter.
-	 */
-	public ViewerSorter createSorter() {
-		try {
-			return (ViewerSorter) element.createExecutableExtension(ATT_CLASS);
-		} catch (RuntimeException re) {
-			NavigatorPlugin.logError(0, re.getMessage(), re);
-		} catch (CoreException e) {
-			NavigatorPlugin.logError(0, e.getMessage(), e);
-		}
-		return SkeletonViewerSorter.INSTANCE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "CommonSorterDescriptor[" + getId() + "]"; //$NON-NLS-1$//$NON-NLS-2$
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/sorters/CommonSorterDescriptorManager.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/sorters/CommonSorterDescriptorManager.java
deleted file mode 100644
index adb434f..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/sorters/CommonSorterDescriptorManager.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.sorters;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptor;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentRegistryReader;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-
-/**
- * @since 3.2
- * 
- */
-public class CommonSorterDescriptorManager {
-
-	private static final CommonSorterDescriptorManager INSTANCE = new CommonSorterDescriptorManager();
-
-	private static final CommonSorterDescriptor[] NO_SORTER_DESCRIPTORS = new CommonSorterDescriptor[0];
-
-	private final Map sortersMap = new HashMap();
-
-	/**
-	 * 
-	 * @return An initialized singleton instance of the
-	 *         CommonSorterDescriptorManager.
-	 */
-	public static CommonSorterDescriptorManager getInstance() {
-		return INSTANCE;
-	}
-
-	private CommonSorterDescriptorManager() {
-		new CommonSorterDescriptorRegistry().readRegistry();
-	}
-
-	/**
-	 * 
-	 * @param contentService
-	 *            A content service to filter the visible filters.
-	 * @param aParent
-	 *            The parent used to search for a sorter.
-	 * @return The set of filters that are 'visible' to the given viewer
-	 *         descriptor.
-	 */
-	public CommonSorterDescriptor[] findApplicableSorters(
-			NavigatorContentService contentService, Object aParent) {
-
-		INavigatorContentDescriptor sourceOfContribution = contentService
-				.getSourceOfContribution(aParent);
-
-		List applicableSorters = new ArrayList();
-
-		CommonSorterDescriptor descriptor;
-		Set sorters = getCommonSorters(sourceOfContribution);
-		for (Iterator sortersItr = sorters.iterator(); sortersItr.hasNext();) {
-			descriptor = (CommonSorterDescriptor) sortersItr.next();
-			if (descriptor.isEnabledForParent(aParent)) {
-				applicableSorters.add(descriptor);
-			}
-		}
-		if (applicableSorters.size() == 0) {
-			return NO_SORTER_DESCRIPTORS;
-		}
-		return (CommonSorterDescriptor[]) applicableSorters
-				.toArray(new CommonSorterDescriptor[applicableSorters.size()]);
-	}
-
-	/**
-	 * 
-	 * @param aContentService
-	 *            A content service to filter the visible filters.
-	 * @param theSource
-	 *            The source of each *value.
-	 * @param aParent
-	 *            The parent used to search for a sorter.
-	 * @param anLvalue
-	 *            The left operand to compare.
-	 * @param anRvalue
-	 *            The right operand to compare.
-	 * @return The set of filters that are 'visible' to the given viewer
-	 *         descriptor.
-	 */
-	public CommonSorterDescriptor[] findApplicableSorters(
-			NavigatorContentService aContentService,
-			INavigatorContentDescriptor theSource, Object aParent,
-			Object anLvalue, Object anRvalue) {
-
-		List applicableSorters = new ArrayList();
-
-		CommonSorterDescriptor descriptor;
-		Set sorters = getCommonSorters(theSource);
-		for (Iterator sortersItr = sorters.iterator(); sortersItr.hasNext();) {
-			descriptor = (CommonSorterDescriptor) sortersItr.next();
-			if (descriptor.isEnabledForParent(aParent)) {
-				applicableSorters.add(descriptor);
-			}
-		}
-		if (applicableSorters.size() == 0) {
-			return NO_SORTER_DESCRIPTORS;
-		}
-		return (CommonSorterDescriptor[]) applicableSorters
-				.toArray(new CommonSorterDescriptor[applicableSorters.size()]);
-	}
-	
-
-	/**
-	 * 
-	 * @param theSource
-	 *            The source of each *value. 
-	 * @return The set of filters that are 'visible' to the given viewer
-	 *         descriptor.
-	 */
-	public CommonSorterDescriptor[] findApplicableSorters(INavigatorContentDescriptor theSource) {
-  
-		Set sorters = getCommonSorters(theSource); 
-		if (sorters.size() == 0) {
-			return NO_SORTER_DESCRIPTORS;
-		}
-		return (CommonSorterDescriptor[]) sorters
-				.toArray(new CommonSorterDescriptor[sorters.size()]);
-	}
-
-	private class CommonSorterDescriptorRegistry extends
-			NavigatorContentRegistryReader {
-
-		private CommonSorterDescriptorRegistry() {
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.internal.navigator.extensions.NavigatorContentRegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
-		 */
-		protected boolean readElement(IConfigurationElement element) {
-
-			if (TAG_NAVIGATOR_CONTENT.equals(element.getName())) {
-				String id = element.getAttribute(ATT_ID);
-				if (id != null) {
-					NavigatorContentDescriptor contentDescriptor = CONTENT_DESCRIPTOR_MANAGER
-							.getContentDescriptor(id);
-					if (contentDescriptor != null) {
-						IConfigurationElement[] children = element
-								.getChildren(TAG_COMMON_SORTER);
-
-						if (children.length > 0) {
-							Set localSorters = getCommonSorters(contentDescriptor);
-							for (int i = 0; i < children.length; i++) {
-								localSorters.add(new CommonSorterDescriptor(
-										children[i]));
-							}
-							return true;
-						}
-					} else {
-						NavigatorPlugin
-								.logError(
-										0,
-										NLS
-												.bind(
-														CommonNavigatorMessages.CommonSorterDescriptorManager_A_navigatorContent_extension_does_n_,
-														new Object[] {
-																id,
-																element
-																		.getDeclaringExtension()
-																		.getNamespaceIdentifier() }),
-										null);
-					}
-				} else {
-					NavigatorPlugin
-							.logError(
-									0,
-									NLS
-											.bind(
-													CommonNavigatorMessages.CommonSorterDescriptorManager_A_navigatorContent_extesnion_in_0_,
-													element.getNamespaceIdentifier()),
-									null);
-				}
-			}
-			return super.readElement(element);
-		}
-
-	}
-
-	private Set getCommonSorters(INavigatorContentDescriptor contentDescriptor) {
-		Set descriptors = null;
-		synchronized (sortersMap) {
-			descriptors = (Set) sortersMap.get(contentDescriptor);
-			if (descriptors == null) {
-				sortersMap.put(contentDescriptor, descriptors = new HashSet());
-			}
-		}
-		return descriptors;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/sorters/NavigatorSorterService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/sorters/NavigatorSorterService.java
deleted file mode 100644
index 835b217..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/sorters/NavigatorSorterService.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.sorters;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorSorterService;
-
-/**
- * 
- * Provides a default implementation of {@link INavigatorSorterService}.
- * 
- * @since 3.2
- * 
- */
-public class NavigatorSorterService implements INavigatorSorterService {
-
-	private final NavigatorContentService contentService;
-
-	/* A map of (CommonSorterDescriptor, ViewerSorter)-pairs */
-	private final Map sorters = new HashMap();
-
-	/**
-	 * Create a sorter service attached to the given content service.
-	 * 
-	 * @param aContentService
-	 *            The content service used by the viewer that will use this
-	 *            sorter service.
-	 */
-	public NavigatorSorterService(NavigatorContentService aContentService) {
-		contentService = aContentService;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.INavigatorSorterService#findSorterForParent(java.lang.Object)
-	 */
-	public ViewerSorter findSorterForParent(Object aParent) {
-
-		CommonSorterDescriptor[] descriptors = CommonSorterDescriptorManager
-				.getInstance().findApplicableSorters(contentService, aParent);
-		if (descriptors.length > 0) {
-			return getSorter(descriptors[0]);
-		}
-		return SkeletonViewerSorter.INSTANCE;
-	}
-
-	private ViewerSorter getSorter(CommonSorterDescriptor descriptor) {
-		ViewerSorter sorter = null;
-		synchronized (sorters) {
-			sorter = (ViewerSorter) sorters.get(descriptor);
-			if (sorter == null) {
-				sorters.put(descriptor, sorter = descriptor.createSorter());
-			}
-		}
-		return sorter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.navigator.INavigatorSorterService#findSorterForParent(org.eclipse.ui.navigator.INavigatorContentDescriptor,
-	 *      java.lang.Object, java.lang.Object, java.lang.Object)
-	 */
-	public ViewerSorter findSorter(INavigatorContentDescriptor source, 
-			Object parent, Object lvalue, Object rvalue) { 
-
-		CommonSorterDescriptor[] descriptors = CommonSorterDescriptorManager
-				.getInstance().findApplicableSorters(contentService, source, parent, lvalue, rvalue);
-		if(descriptors.length > 0) {
-			return getSorter(descriptors[0]);
-		} 
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.INavigatorSorterService#findAvailableSorters(org.eclipse.ui.navigator.INavigatorContentDescriptor)
-	 */
-	public Map findAvailableSorters(INavigatorContentDescriptor theSource) {
-		
-		CommonSorterDescriptor[] descriptors = CommonSorterDescriptorManager.getInstance().findApplicableSorters(theSource);
-		Map sorters = new HashMap();
-
-		int count = 0;
-		for (int i = 0; i < descriptors.length; i++) {
-			if(descriptors[i].getId() != null && descriptors[i].getId().length() > 0)
-				sorters.put(descriptors[i].getId(), getSorter(descriptors[i]));
-			else 
-				sorters.put(theSource.getId()+".sorter."+ (++count), getSorter(descriptors[i])); //$NON-NLS-1$
-		}
-		return sorters;
-	} 
-	 
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/sorters/SkeletonViewerSorter.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/sorters/SkeletonViewerSorter.java
deleted file mode 100644
index 4082ab7..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/sorters/SkeletonViewerSorter.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.sorters;
-
-import org.eclipse.jface.viewers.ViewerSorter;
-
-/**
- * @since 3.2
- *
- */
-public class SkeletonViewerSorter extends ViewerSorter {
-
-	/** The singleton instance. */
-	public static final ViewerSorter INSTANCE = new SkeletonViewerSorter();
-	
-	private SkeletonViewerSorter() {}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/wizards/CommonWizardDescriptor.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/wizards/CommonWizardDescriptor.java
deleted file mode 100644
index b19ddd1..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/wizards/CommonWizardDescriptor.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.navigator.wizards;
-
-import java.util.Iterator;
-
-import org.eclipse.core.expressions.ElementHandler;
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionConverter;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IPluginContribution;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtPtConstants;
-
-/**
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- */
-public class CommonWizardDescriptor implements INavigatorContentExtPtConstants, IPluginContribution {
-	
-	/** The default menu group id for commonWizards without a menuGroupId attribute. */
-	public static final String DEFAULT_MENU_GROUP_ID = "all-uncategorized"; //$NON-NLS-1$
-
-	private String id;
-	
-	private String wizardId;
-	
-	private String menuGroupId; 
-
-	private String type;
-
-	private Expression enablement;
-
-	private IConfigurationElement configElement;
-
-	/**
-	 * @param aConfigElement The configuration element from the extension point. 
-	 * @throws WorkbenchException
-	 *             if the configuration element could not be parsed. Reasons
-	 *             include:
-	 *             <ul>
-	 *             <li>A required attribute is missing.</li>
-	 *             <li>More elements are define than is allowed.</li>
-	 *             </ul>
-	 */
-	public CommonWizardDescriptor(IConfigurationElement aConfigElement)
-			throws WorkbenchException {
-		super();
-		configElement = aConfigElement;
-		init();
-	} 
-
-	/**
-	 * @param aConfigElement The configuration element from the extension point.
-	 * @param anId the identifier for visibility purposes.
-	 *  
-	 * @throws WorkbenchException
-	 *             if the configuration element could not be parsed. Reasons
-	 *             include:
-	 *             <ul>
-	 *             <li>A required attribute is missing.</li>
-	 *             <li>More elements are define than is allowed.</li>
-	 *             </ul>
-	 */
-	public CommonWizardDescriptor(IConfigurationElement aConfigElement, String anId)
-			throws WorkbenchException {
-		super();
-		configElement = aConfigElement;
-		id = anId;
-		init();
-		
-	}
-
-	/**
-	 * Determine if this content extension is enabled for the given selection.
-	 * The content extension is enabled for the selection if and only if it is
-	 * enabled for each element in the selection.
-	 * 
-	 * @param aStructuredSelection
-	 *            The selection from the viewer
-	 * @return True if and only if the extension is enabled for each element in
-	 *         the selection.
-	 */
-	public boolean isEnabledFor(IStructuredSelection aStructuredSelection) {
-		if (enablement == null) {
-			return false;
-		}
-
-		IEvaluationContext context = null;
-
-		Iterator elements = aStructuredSelection.iterator();
-		while (elements.hasNext()) {
-			context = new EvaluationContext(null, elements.next());
-			context.setAllowPluginActivation(true);
-			try {
-				if (enablement.evaluate(context) == EvaluationResult.FALSE) {
-					return false;
-				}
-			} catch (CoreException e) {
-				NavigatorPlugin.log(IStatus.ERROR, 0, e.getMessage(), e);
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Determine if this content extension is enabled for the given element.
-	 * 
-	 * @param anElement
-	 *            The element that should be used for the evaluation.
-	 * @return True if and only if the extension is enabled for the element.
-	 */
-	public boolean isEnabledFor(Object anElement) {
-
-		if (enablement == null) {
-			return false;
-		}
-
-		try {
-			EvaluationContext context = new EvaluationContext(null, anElement);
-			context.setAllowPluginActivation(true);
-			return (enablement.evaluate(context) == EvaluationResult.TRUE);
-		} catch (CoreException e) {
-			NavigatorPlugin.log(IStatus.ERROR, 0, e.getMessage(), e);
-		}
-		return false;
-	}
-
-	void init() throws WorkbenchException { 
-		wizardId = configElement.getAttribute(ATT_WIZARD_ID);
-		type = configElement.getAttribute(ATT_TYPE);
-		
-		menuGroupId = configElement.getAttribute(ATT_MENU_GROUP_ID);
-		if(menuGroupId == null) {
-			menuGroupId = DEFAULT_MENU_GROUP_ID;
-		}
-		
-		/* 
-		 * The id defaults to the id of the enclosing navigatorContent extension, if any
-		 * If not enclosed, this can be null initially, so it will default to the 
-		 * value of the associatedExtensionId
-		 *  
-		 * Code elsewhere anticipates that this attribute may be null, so there is 
-		 * no need to set it to a default non-null value. Indeed, this will cause
-		 * incorrect behavior. 
-		 * */
-		if(id == null) {
-			id = configElement.getAttribute(ATT_ASSOCIATED_EXTENSION_ID);
-		}
-
-		if (wizardId == null || wizardId.length() == 0) {
-			throw new WorkbenchException("Missing attribute: " + //$NON-NLS-1$
-					ATT_WIZARD_ID + " in common wizard extension: " + //$NON-NLS-1$
-					configElement.getDeclaringExtension().getNamespaceIdentifier());
-		}
-
-		if (type == null || type.length() == 0) {
-			throw new WorkbenchException("Missing attribute: " + //$NON-NLS-1$
-					ATT_TYPE + " in common wizard extension: " + //$NON-NLS-1$
-					configElement.getDeclaringExtension().getNamespaceIdentifier());
-		}
-
-		IConfigurationElement[] children = configElement
-				.getChildren(TAG_ENABLEMENT);
-		if (children.length == 1) {
-			try {
-				enablement = ElementHandler.getDefault().create(
-						ExpressionConverter.getDefault(), children[0]);
-			} catch (CoreException e) {
-				NavigatorPlugin.log(IStatus.ERROR, 0, e.getMessage(), e);
-			}
-		} else if (children.length > 1) {
-			throw new WorkbenchException("More than one element: " + //$NON-NLS-1$
-					TAG_ENABLEMENT + " in common wizard extension: " + //$NON-NLS-1$
-					configElement.getDeclaringExtension().getUniqueIdentifier());
-		} 
-	}
-
-	/**
-	 * 
-	 * @return Returns the common wizard wizardId
-	 */
-	public String getWizardId() {
-		return wizardId;
-	}
-
-	/**
-	 * @return Returns the type.
-	 */
-	public String getType() {
-		return type;
-	}
-	
-	/**
-	 * @return the declaring namespace.
-	 */
-	public String getNamespace() {
-		return configElement.getDeclaringExtension().getNamespaceIdentifier(); 
-	}
-	
-	/**
-	 * 
-	 * @return The identifier of the wizard descriptor for visiblity purposes (or null) if none.
-	 */
-	public String getId() {
-		return id;
-	}
-	
-
-	/**
-	 * 
-	 * @return A developer-defined logical group that this wizard menu option and 
-	 * 	others like it should be rendered in a localized manner.
-	 */
-	public String getMenuGroupId() {
-		return menuGroupId;
-	}
-
-	
-	public String toString() {
-		return "CommonWizardDescriptor["+getId()+", wizardId="+getWizardId()+"]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPluginContribution#getLocalId()
-	 */
-	public String getLocalId() {
-		return getWizardId();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPluginContribution#getPluginId()
-	 */
-	public String getPluginId() {
-        return (configElement != null) ? configElement.getNamespaceIdentifier() : null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/wizards/CommonWizardDescriptorManager.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/wizards/CommonWizardDescriptorManager.java
deleted file mode 100644
index 8882fcd..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/wizards/CommonWizardDescriptorManager.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.wizards;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.extensions.NavigatorContentRegistryReader;
-import org.eclipse.ui.navigator.INavigatorContentService;
-
-/**
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- */
-public class CommonWizardDescriptorManager {
-
-	private static final CommonWizardDescriptorManager INSTANCE = new CommonWizardDescriptorManager();
-
-	private static boolean isInitialized = false;
-
-	private static final String[] NO_DESCRIPTOR_IDS = new String[0];
-
-	private static final CommonWizardDescriptor[] NO_DESCRIPTORS = new CommonWizardDescriptor[0];
-	
-	/**
-	 * Find wizards of type 'new'.
-	 */
-	public static final String WIZARD_TYPE_NEW = "new"; //$NON-NLS-1$
-
-	private Map commonWizardDescriptors = new HashMap();
-
-	/**
-	 * @return the singleton instance of the registry
-	 */
-	public static CommonWizardDescriptorManager getInstance() {
-		if (isInitialized) {
-			return INSTANCE;
-		}
-		synchronized (INSTANCE) {
-			if (!isInitialized) {
-				INSTANCE.init();
-				isInitialized = true;
-			}
-		}
-		return INSTANCE;
-	}
-
-	private void init() {
-		new CommonWizardRegistry().readRegistry();
-	}
-
-	private void addCommonWizardDescriptor(CommonWizardDescriptor aDesc) {
-		if (aDesc == null) {
-			return;
-		} else if(aDesc.getWizardId() == null) {
-			NavigatorPlugin.logError(0, "A null wizardId was supplied for a commonWizard in " + aDesc.getNamespace(), null); //$NON-NLS-1$
-		}
-		synchronized (commonWizardDescriptors) {
-			Set descriptors = (Set) commonWizardDescriptors.get(aDesc
-					.getType());
-			if (descriptors == null) { 
-				commonWizardDescriptors.put(aDesc.getType(), descriptors = new HashSet());
-			}
-			if (!descriptors.contains(aDesc)) {
-				descriptors.add(aDesc);
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * Returns all wizard id(s) which enable for the given element.
-	 * 
-	 * @param anElement
-	 *            the element to return the best content descriptor for
-	 * @param aType
-	 *            The type of wizards to locate (e.g. 'new', 'import', or
-	 *            'export' etc).
-	 * @param aContentService 
-	 * 			 The content service to use when deciding visibility.   
-	 * @return The set of commonWizard ids for the given element
-	 */
-	public String[] getEnabledCommonWizardDescriptorIds(Object anElement,
-			String aType, INavigatorContentService aContentService) {
-
-		Set commonDescriptors = (Set) commonWizardDescriptors.get(aType);
-		if (commonDescriptors == null) {
-			return NO_DESCRIPTOR_IDS;
-		}
-		/* Find other Common Wizard providers which enable for this object */
-		List descriptorIds = new ArrayList();
-		for (Iterator commonWizardDescriptorsItr = commonDescriptors.iterator(); commonWizardDescriptorsItr
-				.hasNext();) {
-			CommonWizardDescriptor descriptor = (CommonWizardDescriptor) commonWizardDescriptorsItr
-					.next();
-
-			if (isVisible(aContentService, descriptor)
-					&& descriptor.isEnabledFor(anElement)) {
-				descriptorIds.add(descriptor.getWizardId());
-			}
-		}
-		String[] wizardIds = new String[descriptorIds.size()];
-		return (String[]) descriptorIds.toArray(wizardIds); 
-	}
-	
-
-	/**
-	 * 
-	 * Returns all wizard descriptor(s) which enable for the given element.
-	 * 
-	 * @param anElement
-	 *            the element to return the best content descriptor for
-	 * @param aType
-	 *            The type of wizards to locate (e.g. 'new', 'import', or
-	 *            'export' etc).
-	 * @param aContentService 
-	 * 			 The content service to use when deciding visibility.   
-	 * @return The set of commonWizard descriptors for the element
-	 */
-	public CommonWizardDescriptor[] getEnabledCommonWizardDescriptors(Object anElement,
-			String aType, INavigatorContentService aContentService) {
-
-		Set commonDescriptors = (Set) commonWizardDescriptors.get(aType);
-		if (commonDescriptors == null) {
-			return NO_DESCRIPTORS;
-		}
-		/* Find other Common Wizard providers which enable for this object */
-		List descriptors = new ArrayList();
-		for (Iterator commonWizardDescriptorsItr = commonDescriptors.iterator(); commonWizardDescriptorsItr
-				.hasNext();) {
-			CommonWizardDescriptor descriptor = (CommonWizardDescriptor) commonWizardDescriptorsItr
-					.next();
-
-			if (isVisible(aContentService, descriptor)
-					&& descriptor.isEnabledFor(anElement)) {
-				descriptors.add(descriptor);
-			}
-		}
-		CommonWizardDescriptor[] enabledDescriptors = new CommonWizardDescriptor[descriptors.size()];
-		return (CommonWizardDescriptor[]) descriptors.toArray(enabledDescriptors);  
-	}
-
-	/**
-	 * @param aContentService
-	 * @param descriptor
-	 * @return True if the descriptor is visible to the given content service.
-	 */
-	private boolean isVisible(INavigatorContentService aContentService, CommonWizardDescriptor descriptor) {
-		return !WorkbenchActivityHelper.filterItem(descriptor) && 
-					(aContentService == null || 
-							(descriptor.getId() == null || 
-									( aContentService.isVisible(descriptor.getId()) && 
-											aContentService.isActive(descriptor.getId())
-									)
-							)
-					);
-	}
-  
-	private class CommonWizardRegistry extends NavigatorContentRegistryReader {
- 
-
-		protected boolean readElement(IConfigurationElement anElement) {
-			if (TAG_COMMON_WIZARD.equals(anElement.getName())) {
-				try {
-					addCommonWizardDescriptor(new CommonWizardDescriptor(
-							anElement));
-				} catch (WorkbenchException e) {
-					// log an error since its not safe to open a dialog here
-					NavigatorPlugin
-							.logError(0, e.getMessage(), e);
-					return false;
-				}
-				return true;
-			} if(TAG_NAVIGATOR_CONTENT.equals(anElement.getName())) {
-				
-				IConfigurationElement[] commonWizards = anElement.getChildren(TAG_COMMON_WIZARD);
-				
-				String contentExtensionId = anElement.getAttribute(ATT_ID);
-				for (int i = 0; i < commonWizards.length; i++) {
-					try {
-						addCommonWizardDescriptor(new CommonWizardDescriptor(
-									commonWizards[i], contentExtensionId));
-					} catch (WorkbenchException e) {
-						// log an error since its not safe to open a dialog here
-						NavigatorPlugin
-								.logError(0, e.getMessage(), e);
-						return false;
-					}					
-				}
-				return true;
-			}
-			return super.readElement(anElement);
-		}
-	}
-	 
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/wizards/WizardShortcutAction.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/wizards/WizardShortcutAction.java
deleted file mode 100644
index 09366ae..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/wizards/WizardShortcutAction.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.navigator.wizards;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IPluginContribution;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWizard;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
-import org.eclipse.ui.wizards.IWizardDescriptor;
-
-/**
- * <p>
- * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
- * part of a work in progress. There is a guarantee neither that this API will
- * work nor that it will remain the same. Please do not use this API without
- * consulting with the Platform/UI team.
- * </p>
- * 
- * @since 3.2
- * 
- */
-public class WizardShortcutAction extends Action implements IPluginContribution {
-	private IWizardDescriptor descriptor;
-
-	private IWorkbenchWindow window;
-
-	/**
-	 * 
-	 * @param aWindow
-	 *            The window to use for the shell and selection service.
-	 * @param aDescriptor
-	 *            The descriptor with information for triggering the desired
-	 *            wizard.
-	 */
-	public WizardShortcutAction(IWorkbenchWindow aWindow,
-			IWizardDescriptor aDescriptor) {
-		super(aDescriptor.getLabel());
-		descriptor = aDescriptor;
-		setToolTipText(descriptor.getDescription());
-		setImageDescriptor(descriptor.getImageDescriptor());
-		setId(ActionFactory.NEW.getId());
-		this.window = aWindow;
-	}
-
-	/**
-	 * This action has been invoked by the user 
-	 */
-	public void run() {
-		// create instance of target wizard
-
-		IWorkbenchWizard wizard;
-		try {
-			wizard = descriptor.createWizard();
-		} catch (CoreException e) {
-			ErrorDialog.openError(window.getShell(),
-					CommonNavigatorMessages.NewProjectWizard_errorTitle,
-					CommonNavigatorMessages.NewProjectAction_text, e
-							.getStatus());
-			return;
-		}
-
-		ISelection selection = window.getSelectionService().getSelection();
-
-		if (selection instanceof IStructuredSelection) {
-			wizard
-					.init(window.getWorkbench(),
-							(IStructuredSelection) selection);
-		} else {
-			wizard.init(window.getWorkbench(), StructuredSelection.EMPTY);
-		}
-
-		Shell parent = window.getShell();
-		WizardDialog dialog = new WizardDialog(parent, wizard);
-		dialog.create();
-		// WorkbenchHelp.setHelp(dialog.getShell(),
-		// IWorkbenchHelpContextIds.NEW_WIZARD_SHORTCUT);
-		dialog.open();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.activities.support.IPluginContribution#getLocalId()
-	 */
-	public String getLocalId() {
-		return descriptor.getId();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.activities.support.IPluginContribution#getPluginId()
-	 */
-	public String getPluginId() {
-		return descriptor.getId();
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonActionProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonActionProvider.java
deleted file mode 100644
index 8d7343c..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonActionProvider.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.actions.ActionGroup;
-
-/**
- * <p>
- * Provides actions from extensions for menu and
- * {@link org.eclipse.ui.IActionBars} contributions.
- * </p>
- * <p>
- * This abstract class should be extended by clients of the
- * <b>org.eclipse.ui.navigator.navigatorContent</b> extension point for
- * top-level and nested <b>actionProvider </b> elements.
- * </p>
- * <p>
- * {@link CommonActionProvider}s may be declared as top-level elements in the
- * extension point (e.g. an <b>actionProvider</b> element at the root of the
- * extension point). Alternatively, <b>actionProvider</b> elements may be
- * nested under a <b>navigatorContent</b> element, in which case they are
- * considered to be "associated" with that content extension. For more
- * information, see the <b>org.eclipse.ui.navigator.navigatorContent</b>
- * extension point.
- * </p>
- * <p>
- * Each action provider will have the opportunity to contribute to the context
- * menu when a user right clicks and also contribute to the {@link IActionBars}
- * each time the selection changes. Clients should re-configure the
- * {@link IActionBars} each time that {@link #fillActionBars(IActionBars)} is
- * called (which is once per selection changes). {@link #updateActionBars()}
- * will never be called from the {@link NavigatorActionService}. This behavior
- * is required since each selection could determine a different set of
- * retargetable actions. For instance, the "Delete" operation for a custom model
- * element is likely to be different than for a resource.
- * </p>
- * <p>
- * Therefore, each extension will have an opportunity to contribute to the
- * IActionBars based on the <b>possibleChildren</b> expression of the enclosing
- * <b>navigatorContent</b> extension or the <b>enablement</b> expression of
- * the <b>actionProvider</b> (for both top-level <b>actionProvider</b>s and
- * nested <b>actionProvider</b>s which only support a subset of the enclosing
- * content extensions <b>possibleChildren</b> expression).
- * <p>
- * Clients may extend this class.
- * </p>
- * 
- * @since 3.2
- */
-public abstract class CommonActionProvider extends ActionGroup implements
-		IMementoAware {
-
-	private ICommonActionExtensionSite actionSite;
-
-	/**
-	 * <p>
-	 * Initialize the current ICommonActionProvider with the supplied
-	 * information.
-	 * </p>
-	 * <p>
-	 * init() is guaranteed to be called before any other method of the
-	 * ActionGroup super class.
-	 * 
-	 * @param aSite
-	 *            The configuration information for the instantiated Common
-	 *            Action Provider.
-	 */
-	public void init(ICommonActionExtensionSite aSite) {
-		actionSite = aSite;
-	}
-
-	/**
-	 * <p>
-	 * Restore the previous state of any actions using the flags in aMemento.
-	 * This method allows the state of any actions that persist from session to
-	 * session to be restored.
-	 * </p>
-	 * 
-	 * <p>
-	 * The default behavior is to do nothing.
-	 * </p>
-	 * 
-	 * @param aMemento
-	 *            A memento that was given to the view part to restore its
-	 *            state.
-	 */
-	public void restoreState(IMemento aMemento) {
-	}
-
-	/**
-	 * <p>
-	 * Save flags in aMemento to remember the state of any actions that persist
-	 * from session to session.
-	 * </p>
-	 * <p>
-	 * Extensions should qualify any keys stored in the memento with their
-	 * plugin id
-	 * </p>
-	 * 
-	 * <p>
-	 * The default behavior is to do nothing.
-	 * </p>
-	 * 
-	 * @param aMemento
-	 *            A memento that was given to the view part to save its state.
-	 */
-	public void saveState(IMemento aMemento) {
-	}
-
-	/**
-	 * 
-	 * @return The cached reference to the action site. Will only be non-null if
-	 *         the subclass calls super.init() first.
-	 */
-	protected final ICommonActionExtensionSite getActionSite() {
-		return actionSite;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonDragAdapter.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonDragAdapter.java
deleted file mode 100644
index 4b88ac3..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonDragAdapter.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.dnd.DragSource;
-import org.eclipse.swt.dnd.DragSourceAdapter;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.dnd.NavigatorPluginDropAction;
-import org.eclipse.ui.part.PluginTransfer;
-
-/**
- * 
- * Provides an implementation of {@link DragSourceAdapter} which uses the
- * extensions provided by the associated {@link INavigatorContentService}.
- * 
- * <p>
- * Clients should not need to create an instance of this class unless they are
- * creating their own custom viewer. Otherwise, {@link CommonViewer} configures
- * its drag adapter automatically.
- * </p> 
- * 
- * @see INavigatorDnDService
- * @see CommonDragAdapterAssistant
- * @see CommonDropAdapter
- * @see CommonDropAdapterAssistant
- * @see CommonViewer
- * @since 3.2
- * 
- */
-public final class CommonDragAdapter extends DragSourceAdapter {
-
-	private static final boolean DEBUG = false;
-
-	private final INavigatorContentService contentService;
-
-	private final ISelectionProvider provider;
-
-	/**
-	 * Create a DragAdapter that drives the configuration of the drag data.
-	 * 
-	 * @param aContentService
-	 *            The content service this Drag Adapter is associated with
-	 * @param aProvider
-	 *            The provider that can give the current selection from the
-	 *            appropriate viewer.
-	 */
-	public CommonDragAdapter(INavigatorContentService aContentService,
-			ISelectionProvider aProvider) {
-		super();
-		contentService = aContentService;
-		provider = aProvider;
-	}
-
-	/**
-	 * 
-	 * @return An array of supported Drag Transfer types. The list contains [
-	 *         {@link LocalSelectionTransfer#getTransfer()},
-	 *         {@link PluginTransfer#getInstance()}] in addition to any
-	 *         supported types contributed by the
-	 *         {@link CommonDragAdapterAssistant assistants}.
-	 * @see CommonDragAdapterAssistant
-	 * @see LocalSelectionTransfer
-	 * @see PluginTransfer
-	 */
-	public Transfer[] getSupportedDragTransfers() {
-		CommonDragAdapterAssistant[] assistants = contentService
-				.getDnDService().getCommonDragAssistants();
-
-		Set supportedTypes = new LinkedHashSet();
-		supportedTypes.add(PluginTransfer.getInstance());
-		supportedTypes.add(LocalSelectionTransfer.getTransfer());
-		Transfer[] transferTypes = null;
-		for (int i = 0; i < assistants.length; i++) {
-			transferTypes = assistants[i].getSupportedTransferTypes();
-			for (int j = 0; j < transferTypes.length; j++) {
-				if (transferTypes[j] != null) {
-					supportedTypes.add(transferTypes[j]);
-				}
-			}
-		}
-		
-		Transfer[] transfers = (Transfer[]) supportedTypes
-				.toArray(new Transfer[supportedTypes.size()]);
-		return transfers;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DragSourceAdapter#dragStart(org.eclipse.swt.dnd.DragSourceEvent)
-	 */
-	public void dragStart(DragSourceEvent event) {
-		if (DEBUG) {
-			System.out.println("CommonDragAdapter.dragStart (begin): " + event); //$NON-NLS-1$
-		}
-		try {
-			// Workaround for 1GEUS9V
-			DragSource dragSource = (DragSource) event.widget;
-			Control control = dragSource.getControl();
-			if (control == control.getDisplay().getFocusControl()) {
-				ISelection selection = provider.getSelection();
-				if (!selection.isEmpty()) {
-					LocalSelectionTransfer.getTransfer()
-							.setSelection(selection);
-					event.doit = true;
-				} else {
-					event.doit = false;
-				}
-			} else {
-				event.doit = false;
-			}
-		} catch (RuntimeException e) {
-			NavigatorPlugin.logError(0, e.getMessage(), e);
-		}
-
-		if (DEBUG) {
-			System.out
-					.println("CommonDragAdapter.dragStart (end): doit=" + event.doit); //$NON-NLS-1$
-	}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DragSourceAdapter#dragSetData(org.eclipse.swt.dnd.DragSourceEvent)
-	 */
-	public void dragSetData(DragSourceEvent event) {
-
-		ISelection selection = LocalSelectionTransfer.getTransfer()
-				.getSelection();
-
-		if (DEBUG) {
-			System.out
-					.println("CommonDragAdapter.dragSetData (begin): event" + event + " selection=" + selection); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		if (LocalSelectionTransfer.getTransfer()
-				.isSupportedType(event.dataType)) {
-			event.data = selection;
-
-			if (DEBUG) {
-				System.out
-						.println("CommonDragAdapter.dragSetData set LocalSelectionTransfer"); //$NON-NLS-1$
-			}
-		} else if (PluginTransfer.getInstance().isSupportedType(event.dataType)) {
-			event.data = NavigatorPluginDropAction
-					.createTransferData(contentService);
-			if (DEBUG) {
-				System.out
-						.println("CommonDragAdapter.dragSetData set PluginTransfer"); //$NON-NLS-1$
-			}
-		} else if (selection instanceof IStructuredSelection) {
-			if (DEBUG) {
-				System.out
-						.println("CommonDragAdapter.dragSetData looking for assistants"); //$NON-NLS-1$
-			}
-
-			INavigatorDnDService dndService = contentService.getDnDService();
-			CommonDragAdapterAssistant[] assistants = dndService
-					.getCommonDragAssistants();
-			for (int i = 0; i < assistants.length; i++) {
-
-				Transfer[] supportedTransferTypes = assistants[i]
-						.getSupportedTransferTypes();
-				for (int j = 0; j < supportedTransferTypes.length; j++) {
-					if (supportedTransferTypes[j]
-							.isSupportedType(event.dataType)) {
-						try {
-							if (DEBUG) {
-								System.out
-										.println("CommonDragAdapter.dragSetData set assistant transfer type"); //$NON-NLS-1$
-							}
-							if(assistants[i].setDragData(event,
-									(IStructuredSelection) selection)) {
-								return;
-							}
-						} catch (RuntimeException re) {
-							NavigatorPlugin.logError(0, re.getMessage(), re);
-						}
-					}
-
-				}
-			}
-
-			event.doit = false;
-
-		} else {
-			event.doit = false;
-		}
-
-		if (DEBUG) {
-			System.out.println("CommonDragAdapter.dragSetData (end): " + event); //$NON-NLS-1$
-		}
-	}
-	 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DragSourceAdapter#dragFinished(org.eclipse.swt.dnd.DragSourceEvent)
-	 */
-	public void dragFinished(DragSourceEvent event) {
-
-		if (DEBUG) {
-			System.out.println("CommonDragAdapter.dragFinished()."); //$NON-NLS-1$
-		}
-
-		LocalSelectionTransfer.getTransfer().setSelection(null);
-
-		// TODO Handle clean up if drop target was outside of workbench
-		// if (event.doit != false) {
-		//			
-		// }
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonDragAdapterAssistant.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonDragAdapterAssistant.java
deleted file mode 100644
index 085b9ae..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonDragAdapterAssistant.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-import org.eclipse.ui.part.PluginTransfer;
-
-/**
- * Assist the {@link CommonDragAdapter} by providing new TransferTypes and the
- * logic to handle setting up the transfer data. Clients must extend this class
- * as part of the <b>org.eclipse.ui.navigator.viewer/dragAssistant</b>
- * extension. By default, the Common Navigator supports
- * {@link LocalSelectionTransfer} and {@link PluginTransfer}.
- * 
- * <p>
- * Clients may extend this class.
- * </p>
- * 
- * @see INavigatorDnDService
- * @see CommonDragAdapter
- * @see CommonDropAdapter
- * @see CommonDropAdapterAssistant
- * @see CommonViewer
- * @see <a
- *      href="http://www.eclipse.org/articles/Article-SWT-DND/DND-in-SWT.html">Drag
- *      and Drop: Adding Drag and Drop to an SWT Application</a>
- * @see <a
- *      href="http://www.eclipse.org/articles/Article-Workbench-DND/drag_drop.html">Drag
- *      and Drop in the Eclipse UI (Custom Transfer Types)</a>
- * 
- * @since 3.2
- * 
- */
-public abstract class CommonDragAdapterAssistant {
-
-	private INavigatorContentService contentService;
-
-	/**
-	 * Extra TransferTypes allow the Navigator to generate different kinds of
-	 * payloads for DND clients. By default, the {@link CommonDragAdapter}
-	 * supports {@link LocalSelectionTransfer} and {@link PluginTransfer}.
-	 * 
-	 * <p>
-	 * CommonDragAdapterAssistants can extend the available TransferTypes that a
-	 * Common Navigator Viewer can generate. Clients should return the set of
-	 * Transfer Types they support. When a drop event occurs, the available drag
-	 * assistants will be searched for a <i>enabled</i> assistants for the
-	 * {@link DragSourceEvent}. Only if the drop event occurs will
-	 * {@link #setDragData(DragSourceEvent, IStructuredSelection)} be called. If
-	 * the drop event is cancelled,
-	 * {@link #setDragData(DragSourceEvent, IStructuredSelection)} will not be
-	 * called.
-	 * </p>
-	 * 
-	 * @return The added transfer types. (e.g. FileTransfer.getInstance()).
-	 */
-	public abstract Transfer[] getSupportedTransferTypes();
-
-	/**
-	 * Set the value of the {@link org.eclipse.swt.widgets.Event#data} field using the given selection.
-	 * Clients will only have an opportunity to set the drag data if they have
-	 * returned a matching Transfer Type from
-	 * {@link #getSupportedTransferTypes()} for the
-	 * {@link DragSourceEvent#dataType}.
-	 * <p>
-	 * Clients will only have an opportunity to set the data when the drop event
-	 * occurs. If the drop operation is cancelled, then this method will not be
-	 * called.
-	 * </p>
-	 * 
-	 * @param anEvent
-	 *            The event object should have its {@link Event#data} field set
-	 *            to a value that matches a supported {@link TransferData} type.
-	 * @param aSelection
-	 *            The current selection from the viewer.
-	 * @return True if the data could be set; false otherwise.
-	 */
-	public abstract boolean setDragData(DragSourceEvent anEvent,
-			IStructuredSelection aSelection);
-
-	/**
-	 * Accept and remember the content service this assistant is associated
-	 * with.
-	 * 
-	 * @param aContentService
-	 */
-	public final void setContentService(INavigatorContentService aContentService) {
-		contentService = aContentService;
-	}
-
-	/**
-	 * 
-	 * @return The associated content service.
-	 */
-	public INavigatorContentService getContentService() {
-		return contentService;
-	}
-
-	/**
-	 * 
-	 * @return The shell for the viewer this assistant is associated with or the
-	 *         shell of the active workbench window.
-	 */
-	public final Shell getShell() {
-		if (contentService != null) {
-			((NavigatorContentService) contentService).getShell();
-		}
-		return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonDropAdapter.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonDropAdapter.java
deleted file mode 100644
index ba35d2f..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonDropAdapter.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- * ken.ryall@nokia.com - 157506 drop from external sources does not work on Linux/Mac
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.dnd.NavigatorDnDService;
-import org.eclipse.ui.internal.navigator.dnd.NavigatorPluginDropAction;
-import org.eclipse.ui.part.PluginDropAdapter;
-import org.eclipse.ui.part.PluginTransfer;
-
-/**
- * Provides an implementation of {@link PluginDropAdapter} which uses the
- * extensions provided by the associated {@link INavigatorContentService}.
- * 
- * <p>
- * Clients should not need to create an instance of this class unless they are
- * creating their own custom viewer. Otherwise, {@link CommonViewer} configures
- * its drop adapter automatically.
- * </p>
- *  
- * 
- * @see INavigatorDnDService
- * @see CommonDragAdapter
- * @see CommonDragAdapterAssistant
- * @see CommonDropAdapterAssistant
- * @see CommonViewer
- * @since 3.2
- */
-public final class CommonDropAdapter extends PluginDropAdapter {
-
-	private static final Transfer[] SUPPORTED_DROP_TRANSFERS = new Transfer[] {
-			LocalSelectionTransfer.getTransfer(), FileTransfer.getInstance(),
-			PluginTransfer.getInstance() };
-
-	private static final boolean DEBUG = false;
-
-	private final INavigatorContentService contentService;
-
-	private final NavigatorDnDService dndService;
-
-	/**
-	 * Create a DropAdapter that handles a drop based on the given content
-	 * service and selection provider.
-	 * 
-	 * @param aContentService
-	 *            The content service this Drop Adapter is associated with
-	 * @param aStructuredViewer
-	 *            The viewer this DropAdapter is associated with.
-	 */
-	public CommonDropAdapter(INavigatorContentService aContentService,
-			StructuredViewer aStructuredViewer) {
-		super(aStructuredViewer);
-		contentService = aContentService;
-		dndService = (NavigatorDnDService) contentService.getDnDService();
-	}
-
-	/**
-	 * 
-	 * @return An array of Transfers allowed by the CommonDropAdapter. Includes
-	 *         {@link LocalSelectionTransfer#getTransfer()},
-	 *         {@link FileTransfer#getInstance()},
-	 *         {@link PluginTransfer#getInstance()}.
-	 * @see LocalSelectionTransfer
-	 * @see FileTransfer
-	 * @see PluginTransfer
-	 */
-	public Transfer[] getSupportedDropTransfers() {
-		return SUPPORTED_DROP_TRANSFERS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ViewerDropAdapter#dragEnter(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragEnter(DropTargetEvent event) {
-		super.dragEnter(event);
-		if (event.detail == DND.DROP_NONE)
-			return;
-		
-		for (int i = 0; i < event.dataTypes.length; i++) {
-			if (LocalSelectionTransfer.getTransfer().isSupportedType(
-					event.dataTypes[i])) {
-				event.currentDataType = event.dataTypes[i]; 
-				return;
-			}
-		}
-
-		for (int i = 0; i < event.dataTypes.length; i++) {
-			if (FileTransfer.getInstance().isSupportedType(event.dataTypes[i])) {
-				event.currentDataType = event.dataTypes[i];
-				event.detail = DND.DROP_COPY; 
-				return;
-			}
-		}
-
-		for (int i = 0; i < event.dataTypes.length; i++) {
-			if (PluginTransfer.getInstance()
-					.isSupportedType(event.dataTypes[i])) {
-				event.currentDataType = event.dataTypes[i]; 
-				return;
-			}
-		}
-
-		event.detail = DND.DROP_NONE; 
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetAdapter#dragLeave(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragLeave(DropTargetEvent event) {
-		super.dragLeave(event);
-		if (LocalSelectionTransfer.getTransfer().isSupportedType(
-				event.currentDataType)) {
-			event.data = NavigatorPluginDropAction
-					.createTransferData(contentService);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.PluginDropAdapter#drop(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void drop(DropTargetEvent event) {
-		// Must validate the drop here because on some platforms (Linux, Mac) the event 
-		// is not populated with the correct currentDataType until the drop actually
-		// happens, and validateDrop sets the currentTransfer based on that.  The 
-		// call to validateDrop in dragAccept is too early.
-		validateDrop(getCurrentTarget(), getCurrentOperation(), event.currentDataType);
-		if (PluginTransfer.getInstance().isSupportedType(event.currentDataType)) {
-			super.drop(event);
-		} else {
-
-			Object target = getCurrentTarget() != null ? 
-							getCurrentTarget() : getViewer().getInput();
-							
-			CommonDropAdapterAssistant[] assistants = dndService
-				.findCommonDropAdapterAssistants(target, getCurrentTransfer());
-
-			IStatus valid = null;
-			for (int i = 0; i < assistants.length; i++) {
-				try {
- 
-					valid = assistants[i].validateDrop(getCurrentTarget(),
-							getCurrentOperation(), getCurrentTransfer());
-					if (valid != null && valid.isOK()) {
-						assistants[i].handleDrop(this, event,
-								getCurrentTarget());
-						return;
-					} 
-				} catch (Throwable t) {
-					NavigatorPlugin.logError(0, t.getMessage(), t);
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ViewerDropAdapter#validateDrop(java.lang.Object,
-	 *      int, org.eclipse.swt.dnd.TransferData)
-	 */
-	public boolean validateDrop(Object aDropTarget, int theDropOperation,
-			TransferData theTransferData) {
-
-		if (DEBUG) {
-			System.out.println("CommonDropAdapter.validateDrop (begin)"); //$NON-NLS-1$
-		}
-
-		boolean result = false;
-
-		IStatus valid = null;
-
-		if (super.validateDrop(aDropTarget, theDropOperation, theTransferData)) {
-			result = true; 
-		} else {
-
-			Object target = aDropTarget != null ? aDropTarget : getViewer().getInput();
-			CommonDropAdapterAssistant[] assistants = dndService
-					.findCommonDropAdapterAssistants(target,
-							theTransferData);
-			if (DEBUG) {
-				System.out
-						.println("CommonDropAdapter.validateDrop found " + assistants.length + " drop assistants"); //$NON-NLS-1$//$NON-NLS-2$
-				for(int i=0; i<assistants.length; i++)
-					System.out.println("CommonDropAdapter.validateDrop :" + assistants[i].getClass().getName()); //$NON-NLS-1$
-				
-			}
-			for (int i = 0; i < assistants.length; i++) {
-				try { 
-					valid = assistants[i].validateDrop(target,
-							theDropOperation, theTransferData); 
-				} catch (Throwable t) {
-					NavigatorPlugin.logError(0, t.getMessage(), t);
-				}
-				if (valid != null && valid.isOK()) {
-					result = true;
-					if (DEBUG) { 
-						System.out
-								.println("CommonDropAdapter.validateDrop found \""+assistants[i].getClass().getName()+"\" would handle drop."); //$NON-NLS-1$ //$NON-NLS-2$ 
-					}					
-					break;
-				}
-			}
-		}
-
-		if (DEBUG) {
-			System.out
-					.println("CommonDropAdapter.validateDrop (returning " + (valid != null ? valid.getSeverity() + ": " + valid.getMessage() : "" + result) + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		}
-
-
-		setScrollExpandEnabled(true);
-		return result;
-
-	}
-
-	/*
-	 * The visibility of the following methods is raised for downstream clients
-	 * (assistants).
-	 */
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ViewerDropAdapter#getBounds(org.eclipse.swt.widgets.Item)
-	 */
-	public Rectangle getBounds(Item item) {
-		return super.getBounds(item);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ViewerDropAdapter#getCurrentLocation()
-	 */
-	public int getCurrentLocation() {
-		return super.getCurrentLocation();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ViewerDropAdapter#getCurrentOperation()
-	 */
-	public int getCurrentOperation() {
-		return super.getCurrentOperation();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ViewerDropAdapter#getCurrentTarget()
-	 */
-	public Object getCurrentTarget() {
-		return super.getCurrentTarget();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.PluginDropAdapter#getCurrentTransfer()
-	 */
-	public TransferData getCurrentTransfer() {
-		return super.getCurrentTransfer();
-	}
-	
-    /**
-     * Returns the position of the given event's coordinates relative to its target.
-     * The position is determined to be before, after, or on the item, based on
-     * some threshold value.
-     *
-     * @param event the event
-     * @return one of the <code>LOCATION_* </code>constants defined in this class
-     */
-    protected int determineLocation(DropTargetEvent event) {
-        if (!(event.item instanceof Item)) {
-            return LOCATION_NONE;
-        }
-//        Item item = (Item) event.item;
-        Point coordinates = new Point(event.x, event.y);
-        coordinates = getViewer().getControl().toControl(coordinates);
-//        if (item != null) {
-//            Rectangle bounds = getBounds(item);
-//            if (bounds == null) {
-//                return LOCATION_NONE;
-//            }
-//            if ((coordinates.y - bounds.y) < 5) {
-//                return LOCATION_BEFORE;
-//            }
-//            if ((bounds.y + bounds.height - coordinates.y) < 5) {
-//                return LOCATION_AFTER;
-//            }
-//        }
-        return LOCATION_ON;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonDropAdapterAssistant.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonDropAdapterAssistant.java
deleted file mode 100644
index 6dccecf..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonDropAdapterAssistant.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-
-/**
- * <p>
- * Used by the
- * <b>org.eclipse.ui.navigator.navigatorContent/navigatorContent/commonDropAdapter</b>
- * extension point to carry out pluggable drop operations.
- * </p>
- * <p>
- * Each {@link CommonDropAdapterAssistant} is contained by single content
- * extension. The opportunity for each assistant to handle the drop operation is
- * determined by the <b>possibleChildren</b> expression of the
- * <b>org.eclipse.ui.navigator.navigatorContent/navigatorContent</b> extension;
- * whenever every element in the drag set matches the <b>possibleChildren</b>
- * expression of an extension, it is eligible to handle the drop operation. This
- * initial set is further culled using the <b>possibleDropTargets</b>
- * expression of the <b>commonDropAdapter</b> using the current drop target.
- * </p>
- * <p>
- * If drag operations originate outside of Eclipse, then the set of eligible
- * drop adapters is determined based on the drop target (using the
- * <b>possibleDropTargets</b> expression). Each assistant can then indicate 
- * whether {@link #isSupportedType(TransferData) the incoming type is supported}.
- * <p>
- * Whenever a match is found, the assistant will be given an opportunity to
- * first {@link #validateDrop(Object, int, TransferData)}, and then if the
- * assistant returns true, the assist must
- * {@link #handleDrop(CommonDropAdapter, DropTargetEvent, Object)}. If
- * multiple assistants match the drop target, then the potential assistants are
- * ordered based on priority and their override relationships and given an
- * opportunity to validate the drop operation in turn. The first one to validate
- * will have the opportunty to carry out the drop.
- * </p>
- * 
- * <p>
- * Clients may handle DND operations that begin and end in the current viewer by
- * overriding the following methods:
- * <ul>
- * <li>{@link #validateDrop(Object, int, TransferData)}: Indicate whether this
- * assistant can handle a drop onto the current viewer.</li>
- * <li>{@link #handleDrop(CommonDropAdapter, DropTargetEvent, Object)}: Handle
- * the drop operation onto the current viewer.</li>
- * </ul>
- * </p>
- * <p>
- * If a user originates a drag operation to another viewer that cannot handle
- * one of the available drag transfer types, drop assistants may handle the drop
- * operation for the target viewer. Clients must override :
- * <ul>
- * <li>{@link #validatePluginTransferDrop(IStructuredSelection, Object)}:
- * Indicate whether this assistant can handle the drop onto another viewer.
- * <li>{@link #handlePluginTransferDrop(IStructuredSelection, Object)}: Handle
- * the drop operation onto the other viewer.</li>
- * </ul>
- * </p> 
- * <p>
- * Clients may subclass this.
- * </p>
- * 
- * @see INavigatorDnDService
- * @see INavigatorDnDService#findCommonDropAdapterAssistants(Object,
- *      TransferData)
- * @since 3.2
- * 
- */
-public abstract class CommonDropAdapterAssistant {
-
-	private INavigatorContentService contentService;
-
-	/**
-	 * Perform any necessary initialization using the
-	 * {@link INavigatorContentService}.
-	 * 
-	 * 
-	 * @param aContentService
-	 *            The instance of {@link INavigatorContentService} that the
-	 *            current CommonDropAdapterAssistant will be associated with
-	 */
-	public final void init(INavigatorContentService aContentService) {
-		contentService = aContentService;
-		doInit();
-	}
-
-	/**
-	 * Override to perform any one-time initialization.
-	 */
-	protected void doInit() {
-
-	}
-
-	/**
-	 * Validates dropping on the given object. This method is called whenever
-	 * some aspect of the drop operation changes.
-	 * <p>
-	 * Subclasses must implement this method to define which drops make sense.
-	 * If clients return true, then they will be allowed to handle the drop in
-	 * {@link #handleDrop(CommonDropAdapter, DropTargetEvent, Object) }.
-	 * </p>
-	 * 
-	 * @param target
-	 *            the object that the mouse is currently hovering over, or
-	 *            <code>null</code> if the mouse is hovering over empty space
-	 * @param operation
-	 *            the current drag operation (copy, move, etc.)
-	 * @param transferType
-	 *            the current transfer type
-	 * @return A status indicating whether the drop is valid.
-	 */
-	public abstract IStatus validateDrop(Object target, int operation,
-			TransferData transferType);
-
-	/**
-	 * Carry out the DND operation.
-	 * 
-	 * @param aDropAdapter
-	 *            The Drop Adapter contains information that has already been
-	 *            parsed from the drop event.
-	 * @param aDropTargetEvent
-	 *            The drop target event.
-	 * @param aTarget
-	 *            The object being dragged onto
-	 * @return A status indicating whether the drop completed OK.
-	 */
-	public abstract IStatus handleDrop(CommonDropAdapter aDropAdapter,
-			DropTargetEvent aDropTargetEvent, Object aTarget);
-
-	/**
-	 * Clients may extend the supported transfer types beyond the default
-	 * {@link LocalSelectionTransfer#getTransfer()} and
-	 * {@link org.eclipse.ui.part.PluginTransfer#getInstance()} transfer types. When a transfer type
-	 * other than one of these is encountered, the DND Service will query the
-	 * <b>visible</b> and <b>active</b> descriptors that are <b>enabled</b>
-	 * for the drop target of the current operation.
-	 * 
-	 * @param aTransferType
-	 *            The transfer data from the drop operation
-	 * @return True if the given TransferData can be understood by this
-	 *         assistant.
-	 */
-	public boolean isSupportedType(TransferData aTransferType) {
-		return LocalSelectionTransfer.getTransfer().isSupportedType(
-				aTransferType);
-	}
-
-	/**
-	 * 
-	 * Return true if the client can handle the drop onto the target viewer of
-	 * the drop operation.
-	 * <p>
-	 * The default behavior of this method is to return <b>Status.CANCEL_STATUS</b>.
-	 * </p>
-	 * 
-	 * @param aDragSelection
-	 *            The selection dragged from the viewer.
-	 * @param aDropTarget
-	 *            The target of the drop operation.
-	 * 
-	 * @return OK if the plugin transfer can be handled by this assistant.
-	 */
-	public IStatus validatePluginTransferDrop(
-			IStructuredSelection aDragSelection, Object aDropTarget) {
-		return Status.CANCEL_STATUS;
-	}
-
-	/**
-	 * Handle the drop operation for the target viewer.
-	 * <p>
-	 * The default behavior of this method is to return <b>Status.CANCEL_STATUS</b>.
-	 * </p>
-	 * 
-	 * @param aDragSelection
-	 *            The selection dragged from the viewer.
-	 * @param aDropTarget
-	 *            The target of the drop operation.
-	 * 
-	 * @return OK if the drop operation succeeded.
-	 */
-	public IStatus handlePluginTransferDrop(
-			IStructuredSelection aDragSelection, Object aDropTarget) {
-		return Status.CANCEL_STATUS;
-	}
-
-	/**
-	 * 
-	 * @return The associated content service.
-	 */
-	protected INavigatorContentService getContentService() {
-		return contentService;
-	}
-
-	/**
-	 * 
-	 * @return A shell for the viewer currently used by the
-	 *         {@link INavigatorContentService}.
-	 */
-	protected final Shell getShell() {
-		return ((NavigatorContentService) contentService).getShell();
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonNavigator.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonNavigator.java
deleted file mode 100644
index 53456b8..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonNavigator.java
+++ /dev/null
@@ -1,658 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     anton.leherbauer@windriver.com - bug 220599 make CommonNavigator a ShowInSource
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.ISaveablePart;
-import org.eclipse.ui.ISaveablesLifecycleListener;
-import org.eclipse.ui.ISaveablesSource;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.Saveable;
-import org.eclipse.ui.SaveablesLifecycleEvent;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.ui.internal.navigator.CommonNavigatorActionGroup;
-import org.eclipse.ui.internal.navigator.CommonNavigatorManager;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.extensions.LinkHelperService;
-import org.eclipse.ui.part.ISetSelectionTarget;
-import org.eclipse.ui.part.IShowInSource;
-import org.eclipse.ui.part.IShowInTarget;
-import org.eclipse.ui.part.ShowInContext;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * <p>
- * This class provides the IViewPart for the Common Navigator framework in the
- * Eclipse workbench. This class also serves as the backbone for navigational
- * viewers. The following types are used by this class to render the Common
- * Navigator:
- * <ul>
- * <li>
- * <p>
- * {@link org.eclipse.ui.navigator.CommonViewer}: The viewer that renders the
- * extensible tree. Creates and manages the lifecycle of the Navigator Content
- * Service (described below).
- * </p>
- * </li>
- * <li>
- * <p>
- * {@link org.eclipse.ui.navigator.NavigatorActionService}: Manages instances
- * of {@link org.eclipse.ui.navigator.CommonActionProvider}s provided by
- * individual extensions and content extensions.
- * </p>
- * </li>
- * <li>
- * <p>
- * {@link org.eclipse.ui.navigator.INavigatorContentService}: Manages instances
- * of Navigator Content Extensions. Instances are created as needed, and
- * disposed of upon the disposal of the Navigator Content Service.
- * </p>
- * </li>
- * </ul>
- * <p>
- * Clients are not expected to subclass CommonNavigator. Clients that wish to
- * define their own custom extensible navigator view need to specify an instance
- * of the <b>org.eclipse.ui.views</b> extension point:
- * 
- * <pre>
- *   
- *          &lt;extension
- *          		point=&quot;org.eclipse.ui.views&quot;&gt;
- *          	&lt;view
- *          		name=&quot;My Custom View&quot;
- *          		icon=&quot;relative/path/to/icon.gif&quot;
- *          		category=&quot;org.acme.mycategory&quot;
- *          		class=&quot;org.eclipse.ui.navigator.CommonNavigator&quot;
- *          		id=&quot;org.acme.MyCustomNavigatorID&quot;&gt;
- *          	&lt;/view&gt;
- *          &lt;/extension&gt; 
- *    
- * </pre>
- * 
- * </p> 
- * Clients that wish to extend the view menu provided via the
- * <b>org.eclipse.ui.popupMenu</b>s extension may specify the the <i>popupMenuId</i>
- * specified by <b>org.eclipse.ui.navigator.viewer</b> (or a nested <b>popupMenu</b> element) of their target viewer
- * as their target menu id.
- * 
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- *  
- * @since 3.2
- */
-public class CommonNavigator extends ViewPart implements ISetSelectionTarget, ISaveablePart, ISaveablesSource, IShowInTarget {
- 
-	private static final Class INAVIGATOR_CONTENT_SERVICE = INavigatorContentService.class;
-	private static final Class COMMON_VIEWER_CLASS = CommonViewer.class;
-	private static final Class ISHOW_IN_SOURCE_CLASS = IShowInSource.class;
-	private static final Class ISHOW_IN_TARGET_CLASS = IShowInTarget.class;
-	
-	private static final String HELP_CONTEXT =  NavigatorPlugin.PLUGIN_ID + ".common_navigator"; //$NON-NLS-1$
-
-	/**
-	 * <p>
-	 * Used to track changes to the {@link #isLinkingEnabled}&nbsp;property.
-	 * </p>
-	 */
-	public static final int IS_LINKING_ENABLED_PROPERTY = 1;
-
-	private CommonViewer commonViewer;
-
-	private CommonNavigatorManager commonManager;
-
-	private ActionGroup commonActionGroup;
-
-	private IMemento memento;
-
-	private boolean isLinkingEnabled = false;
-
-	private String LINKING_ENABLED = "CommonNavigator.LINKING_ENABLED"; //$NON-NLS-1$ 
-
-	private LinkHelperService linkService;
-	
-	/**
-	 * 
-	 */
-	public CommonNavigator() {
-		super();
-	}
-
-	/**
-	 * <p>
-	 * Create the CommonViewer part control and setup the default providers as
-	 * necessary.
-	 * </p>
-	 * 
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite aParent) {
-
-		commonViewer = createCommonViewer(aParent);	
-
-		try {
-			commonViewer.getControl().setRedraw(false);
-			
-			INavigatorFilterService filterService = commonViewer
-					.getNavigatorContentService().getFilterService();
-			ViewerFilter[] visibleFilters = filterService.getVisibleFilters(true);
-			for (int i = 0; i < visibleFilters.length; i++) {
-				commonViewer.addFilter(visibleFilters[i]);
-			}
-	
-			commonViewer.setSorter(new CommonViewerSorter());
-	
-			/*
-			 * make sure input is set after sorters and filters to avoid unnecessary
-			 * refreshes
-			 */
-			commonViewer.setInput(getInitialInput()); 
-	
-			getSite().setSelectionProvider(commonViewer);
-	
-			updateTitle();
-		} finally { 
-			commonViewer.getControl().setRedraw(true);
-		}
-
-		/*
-		 * Create the CommonNavigatorManager last because information about the
-		 * state of the CommonNavigator is required for the initialization of
-		 * the CommonNavigatorManager
-		 */
-		commonManager = createCommonManager();
-		if (memento != null) {			
-			commonViewer.getNavigatorContentService().restoreState(memento);
-		}
-
-		commonActionGroup = createCommonActionGroup();
-		commonActionGroup.fillActionBars(getViewSite().getActionBars());
-		
-		ISaveablesLifecycleListener saveablesLifecycleListener = new ISaveablesLifecycleListener() {
-			ISaveablesLifecycleListener siteSaveablesLifecycleListener = (ISaveablesLifecycleListener) getSite()
-					.getService(ISaveablesLifecycleListener.class);
-
-			public void handleLifecycleEvent(SaveablesLifecycleEvent event) {
-				if (event.getEventType() == SaveablesLifecycleEvent.DIRTY_CHANGED) {
-					firePropertyChange(PROP_DIRTY);
-				}
-				siteSaveablesLifecycleListener.handleLifecycleEvent(event);
-			}
-		};
-		commonViewer.getNavigatorContentService()
-				.getSaveablesService().init(this, getCommonViewer(),
-						saveablesLifecycleListener);
-		
-		commonViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				firePropertyChange(PROP_DIRTY);
-			}});
-		
-	      PlatformUI.getWorkbench().getHelpSystem().setHelp(commonViewer.getControl(),  HELP_CONTEXT);
-	}
-
-	/**
-	 * <p>
-	 * Note: This method is for internal use only. Clients should not call this
-	 * method.
-	 * </p>
-	 * <p>
-	 * This method will be invoked when the DisposeListener is notified of the
-	 * disposal of the Eclipse view part.
-	 * </p>
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		if (commonManager != null) {
-			commonManager.dispose();
-		}
-		if(commonActionGroup != null) {
-			commonActionGroup.dispose();
-		}
-		super.dispose();
-	}
-
-	/**
-	 * <p>
-	 * Note: This method is for internal use only. Clients should not call this
-	 * method.
-	 * </p>
-	 * 
-	 * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite,
-	 *      org.eclipse.ui.IMemento)
-	 */
-	public void init(IViewSite aSite, IMemento aMemento)
-			throws PartInitException {
-		super.init(aSite, aMemento);
-		memento = aMemento;
-		if (memento != null) {
-			Integer linkingEnabledInteger = memento.getInteger(LINKING_ENABLED);
-			setLinkingEnabled(((linkingEnabledInteger != null) ? linkingEnabledInteger
-					.intValue() == 1
-					: false));
-		}
-
-	}
-
-	/**
-	 * 
-	 * <p>
-	 * Note: This method is for internal use only. Clients should not call this
-	 * method.
-	 * </p>
-	 * 
-	 * @see org.eclipse.ui.part.ViewPart#saveState(org.eclipse.ui.IMemento)
-	 */
-	public void saveState(IMemento aMemento) {
-		aMemento.putInteger(LINKING_ENABLED, (isLinkingEnabled) ? 1 : 0);
-		super.saveState(aMemento);
-		commonManager.saveState(aMemento);
-		commonViewer.getNavigatorContentService().saveState(aMemento);
-	}
-
-	/**
-	 * <p>
-	 * Force the workbench to focus on the Common Navigator tree.
-	 * </p>
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		if (commonViewer != null) {
-			commonViewer.getTree().setFocus();
-		}
-	}
-
-	/**
-	 * <p>
-	 * Set the selection to the Common Navigator tree, and expand nodes if
-	 * necessary. Use caution when invoking this method as it can cause
-	 * Navigator Content Extensions to load, thus causing plugin activation.
-	 * </p>
-	 * 
-	 * @see org.eclipse.ui.part.ISetSelectionTarget#selectReveal(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectReveal(ISelection selection) {
-		if (commonViewer != null) {
-			commonViewer.setSelection(selection, true);
-		}
-	}
-
-	/**
-	 * <p>
-	 * Linking is handled by an action which listens for
-	 * changes to the {@link CommonNavigator#IS_LINKING_ENABLED_PROPERTY}.
-	 * Custom implementations that wish to override this functionality, need to
-	 * override the action used by the default ActionGroup and listen for
-	 * changes to the above property.
-	 * 
-	 * @param toEnableLinking
-	 *            True enables linking the current selection with open editors
-	 */
-	public final void setLinkingEnabled(boolean toEnableLinking) {
-		isLinkingEnabled = toEnableLinking;
-		firePropertyChange(IS_LINKING_ENABLED_PROPERTY);
-	}
-
-	/**
-	 * @return Whether linking the current selection with open editors is
-	 *         enabled.
-	 */
-	public final boolean isLinkingEnabled() {
-		return isLinkingEnabled;
-	}
-
-	/**
-	 * <p>
-	 * Provides access to the commonViewer used by the current CommonNavigator.
-	 * The field will not be valid until after
-	 * {@link #init(IViewSite, IMemento)}&nbsp;has been called by the
-	 * Workbench.
-	 * </p>
-	 *  
-	 * @return The (already created) instance of Common Viewer.
-	 */
-	public CommonViewer getCommonViewer() {
-		return commonViewer;
-	}
-
-	/**
-	 * @return The Navigator Content Service which populates this instance of
-	 *         Common Navigator
-	 */
-	public INavigatorContentService getNavigatorContentService() {
-		return getCommonViewer().getNavigatorContentService();
-	}
-
-	/**
-	 * Returns an object which is an instance of the given class
-	 * associated with this object. Returns <code>null</code> if
-	 * no such object can be found.
-	 *
-	 * @param adapter the adapter class to look up
-	 * @return a object castable to the given class, 
-	 *    or <code>null</code> if this object does not
-	 *    have an adapter for the given class
-	 */
-	public Object getAdapter(Class adapter) {
-		if (adapter == COMMON_VIEWER_CLASS) {
-			return getCommonViewer();
-		} else if (adapter == INAVIGATOR_CONTENT_SERVICE) {
-			return getCommonViewer().getNavigatorContentService();
-		} else if (adapter == ISHOW_IN_TARGET_CLASS) {
-			return this;
-		} else if (adapter == ISHOW_IN_SOURCE_CLASS) {
-            return getShowInSource();
-        }
-		return super.getAdapter(adapter);
-	}
-
-    /**
-     * Returns the <code>IShowInSource</code> for this view.
-     */
-    private IShowInSource getShowInSource() {
-        return new IShowInSource() {
-            public ShowInContext getShowInContext() {
-                return new ShowInContext(getCommonViewer().getInput(), getCommonViewer().getSelection());
-            }
-        };
-    }
-
-	/**
-	 * @return The Navigator Content Service which populates this instance of
-	 *         Common Navigator
-	 */
-	public NavigatorActionService getNavigatorActionService() {
-		return commonManager.getNavigatorActionService();
-	}
-
-	/**
-	 * <p>
-	 * Constructs and returns an instance of {@link CommonViewer}. The ID of
-	 * the Eclipse view part will be used to create the viewer. The ID is
-	 * important as some extensions indicate they should only be used with a
-	 * particular viewer ID.
-	 * <p>
-	 * 
-	 * @param aParent
-	 *            A composite parent to contain the Common Viewer
-	 * @return An initialized instance of CommonViewer
-	 */
-	protected CommonViewer createCommonViewer(Composite aParent) {
-		CommonViewer aViewer = new CommonViewer(getViewSite().getId(), aParent,
-				SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		initListeners(aViewer);
-		aViewer.getNavigatorContentService().restoreState(memento);
-		return aViewer;
-	}
-
-	/**
-	 * <p>
-	 * Adds the listeners to the Common Viewer.
-	 * </p>
-	 * 
-	 * @param viewer
-	 *            The viewer
-	 * @since 2.0
-	 */
-	protected void initListeners(TreeViewer viewer) {
-
-		viewer.addDoubleClickListener(new IDoubleClickListener() {
-
-			public void doubleClick(DoubleClickEvent event) {
-				try {
-					handleDoubleClick(event);
-				} catch (RuntimeException re) {
-					re.printStackTrace();
-				}
-			}
-		});
-	}
-
-	/**
-	 * <p>
-	 * Note: This method is for internal use only. Clients should not call this
-	 * method.
-	 * </p>
-	 * 
-	 * @param anEvent
-	 *            Supplied by the DoubleClick listener.
-	 */
-	protected void handleDoubleClick(DoubleClickEvent anEvent) {
-
-		IAction openHandler = getViewSite().getActionBars().getGlobalActionHandler(ICommonActionConstants.OPEN);
-		
-		if(openHandler == null) {
-			IStructuredSelection selection = (IStructuredSelection) anEvent
-					.getSelection();
-			Object element = selection.getFirstElement();
-	
-			TreeViewer viewer = getCommonViewer();
-			if (viewer.isExpandable(element)) {
-				viewer.setExpandedState(element, !viewer.getExpandedState(element));
-			}
-		}
-	}
-
-	/**
-	 * <p>
-	 * The Common Navigator Manager handles the setup of the Common Navigator
-	 * Menu, manages updates to the ActionBars from
-	 * {@link CommonActionProvider}&nbsp; extensions as the user's selection
-	 * changes, and also updates the status bar based on the current selection.
-	 * 
-	 * @return The Common Navigator Manager class which handles menu population
-	 *         and ActionBars
-	 */
-	protected CommonNavigatorManager createCommonManager() {
-		return new CommonNavigatorManager(this, memento);
-	}
-
-	/**
-	 * <p>
-	 * The ActionGroup is used to populate the ActionBars of Common Navigator
-	 * View Part, and the returned implementation will have an opportunity to
-	 * fill the ActionBars of the view as soon as it is created. ({@link ActionGroup#fillActionBars(org.eclipse.ui.IActionBars)}.
-	 * </p>
-	 * <p>
-	 * The default implementation returns an action group which will add the
-	 * following actions:
-	 * <ul>
-	 * <li>
-	 * <p>
-	 * Link with editor support. Allows the user to toggling linking the current
-	 * selection with the active editors.
-	 * </p>
-	 * <li>
-	 * <p>
-	 * Collapse all. Collapses all expanded nodes.
-	 * </p>
-	 * <li>
-	 * <p>
-	 * Select Filters. Provides access to the "Select Filters" dialog that
-	 * allows users to enable/disable filters and also the Content Extension
-	 * activations.
-	 * </p>
-	 * </ul>
-	 * 
-	 * @return The Action Group to be associated with the Common Navigator View
-	 *         Part.
-	 */
-	protected ActionGroup createCommonActionGroup() {
-		return new CommonNavigatorActionGroup(this, commonViewer, getLinkHelperService());
-	}
-
-	/**
-	 * @return The initial input for the viewer. Defaults to
-	 *         getSite().getPage().getInput()
-	 */
-	protected IAdaptable getInitialInput() {
-		return getSite().getPage().getInput();
-	}
-
-	/**
-	 * <p>
-	 * Updates the title text and title tool tip. Called whenever the input of
-	 * the viewer changes.
-	 * </p>
-	 */
-	protected void updateTitle() {
-
-		if (commonViewer == null) {
-			return;
-		}
-
-		Object input = commonViewer.getInput();
-		String viewName = getConfigurationElement().getAttribute("name"); //$NON-NLS-1$ 
-		// IWorkingSet workingSet = workingSetFilter.getWorkingSet();
-
-		if (input == null) {
-			setPartName(viewName);
-			setTitleToolTip(""); //$NON-NLS-1$ 
-		} else {
-			String inputToolTip = getFrameToolTipText(input);
-
-			setPartName(viewName);
-			setTitleToolTip(inputToolTip);
-		}
-	}
-
-	/**
-	 * <p>
-	 * Returns the tool tip text for the given element. Used as the tool tip
-	 * text for the current frame, and for the view title tooltip.
-	 * </p>
-	 */
-	protected String getFrameToolTipText(Object anElement) {
-		if (commonViewer != null) {
-			return ((ILabelProvider) commonViewer.getLabelProvider())
-					.getText(anElement);
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablesSource#getSaveables()
-	 */
-	public Saveable[] getSaveables() {
-		return getNavigatorContentService().getSaveablesService().getSaveables();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablesSource#getActiveSaveables()
-	 */
-	public Saveable[] getActiveSaveables() {
-		return getNavigatorContentService().getSaveablesService().getActiveSaveables();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		// Ignore. This method is not called because CommonNavigator implements
-		// ISaveablesSource. All saves will go through the ISaveablesSource /
-		// Saveable protocol.
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-		// ignore
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() {
-		Saveable[] saveables = getSaveables();
-		for (int i = 0; i < saveables.length; i++) {
-			if(saveables[i].isDirty()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isSaveOnCloseNeeded()
-	 */
-	public boolean isSaveOnCloseNeeded() {
-		return isDirty();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.IShowInTarget#show(org.eclipse.ui.part.ShowInContext)
-	 */
-	public boolean show(ShowInContext context) {
-		IStructuredSelection selection = getSelection(context);
-		if (selection != null && !selection.isEmpty()) {
-			selectReveal(selection);
-			return true;
-		} 
-		return false;
-	}
-
-	private IStructuredSelection getSelection(ShowInContext context) {
-		if (context == null)
-			return StructuredSelection.EMPTY;
-		ISelection selection = context.getSelection();
-		if (selection != null && !selection.isEmpty() && selection instanceof IStructuredSelection)
-			return (IStructuredSelection)selection;
-		Object input = context.getInput();
-		if (input instanceof IEditorInput) {
-			LinkHelperService lhs = getLinkHelperService();
-			return lhs.getSelectionFor((IEditorInput) input);
-		}
-		if (input != null) {
-			return new StructuredSelection(input);
-		}
-		return StructuredSelection.EMPTY;
-	}
-
-	private synchronized LinkHelperService getLinkHelperService() {
-		if (linkService == null)
-			linkService = new LinkHelperService((NavigatorContentService)getCommonViewer().getNavigatorContentService());
-		return linkService;
-	}
- 
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonViewer.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonViewer.java
deleted file mode 100644
index 10b0465..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonViewer.java
+++ /dev/null
@@ -1,476 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- * Oakland Software (Francis Upton - francisu@ieee.org) 
- *    bug 197113 Project Explorer drag and drop selection not working properly
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.internal.navigator.ContributorTrackingSet;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-import org.eclipse.ui.internal.navigator.NavigatorDecoratingLabelProvider;
-import org.eclipse.ui.internal.navigator.NavigatorPipelineService;
-
-/**
- * 
- * Provides the Tree Viewer for the Common Navigator. Content and labels are
- * provided by an instance of {@link INavigatorContentService}&nbsp; which uses
- * the ID supplied in the constructor
- * {@link CommonViewer#CommonViewer(String, Composite, int)} or through
- * {@link NavigatorContentServiceFactory#createContentService(String, org.eclipse.jface.viewers.StructuredViewer)}.
- * 
- * <p>
- * Clients may extend this class.
- * </p>
- * 
- * <p>
- * Note that as of 3.2.1 and 3.3, the common viewer caches its selection.
- * Clients must not set the selection of the viewer's tree control directly.
- * </p>
- * 
- * @since 3.2
- */
-public class CommonViewer extends TreeViewer {
-
-	private final NavigatorContentService contentService;
-
-	private ISelection cachedSelection;
-	
-	/**
-	 * <p>
-	 * Constructs the Tree Viewer for the Common Navigator and the corresponding
-	 * NavigatorContentService. The NavigatorContentService will provide the
-	 * Content Provider and Label Provider -- these need not be supplied by
-	 * clients.
-	 * <p>
-	 * For the valid bits to supply in the style mask (aStyle), see
-	 * documentation provided by {@link TreeViewer}.
-	 * </p>
-	 * 
-	 * @param aViewerId
-	 *            An id tied to the extensions that is used to focus specific
-	 *            content to a particular instance of the Common Navigator
-	 * @param aParent
-	 *            A Composite parent to contain the actual SWT widget
-	 * @param aStyle
-	 *            A style mask that will be used to create the TreeViewer
-	 *            Composite.
-	 */
-	public CommonViewer(String aViewerId, Composite aParent, int aStyle) {
-		super(aParent, aStyle);
-		contentService = new NavigatorContentService(aViewerId, this);
-		init();
-	}
-
-	/**
-	 * <p>
-	 * Initializes the content provider, label provider, and drag and drop
-	 * support. Should not be called by clients -- this method is invoked when
-	 * the constructor is invoked.
-	 * </p>
-	 */
-	protected void init() {
-		setUseHashlookup(true);
-		setContentProvider(contentService.createCommonContentProvider());
-		setLabelProvider(new NavigatorDecoratingLabelProvider(contentService.createCommonLabelProvider()));
-		initDragAndDrop();
-
-	}
-
-	protected void removeWithoutRefresh(Object[] elements) {
-		super.remove(elements);
-	}
-
-	/**
-	 * <p>
-	 * Adds DND support to the Navigator. Uses hooks into the extensible
-	 * framework for DND.
-	 * </p>
-	 * <p>
-	 * By default, the following Transfer types are supported:
-	 * <ul>
-	 * <li>LocalSelectionTransfer.getInstance(),
-	 * <li>PluginTransfer.getInstance()
-	 * </ul>
-	 * </p>
-	 * 
-	 * @see CommonDragAdapter
-	 * @see CommonDropAdapter
-	 */
-	protected void initDragAndDrop() {
-
-		/* Handle Drag and Drop */
-		int operations = DND.DROP_COPY | DND.DROP_MOVE;
-
-		CommonDragAdapter dragAdapter = new CommonDragAdapter(contentService,
-				this);
-		addDragSupport(operations, dragAdapter.getSupportedDragTransfers(),
-				dragAdapter);
-
-		CommonDropAdapter dropAdapter = new CommonDropAdapter(contentService,
-				this);
-		addDropSupport(operations, dropAdapter.getSupportedDropTransfers(),
-				dropAdapter);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#createTreeItem(org.eclipse.swt.widgets.Widget,
-	 *      java.lang.Object, int)
-	 */
-	protected void createTreeItem(Widget parent, final Object element, int index) {
-		try {
-			super.createTreeItem(parent, element, index);
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		} catch (Error e) {
-			e.printStackTrace();
-		}
-
-	}
-
-	/*
-	 * @see ContentViewer#handleLabelProviderChanged(LabelProviderChangedEvent)
-	 */
-	protected void handleLabelProviderChanged(LabelProviderChangedEvent event) {
-
-		Object[] changed = event.getElements();
-		if (changed != null) {
-			List others = Arrays.asList(changed);
-			for (Iterator iter = others.iterator(); iter.hasNext();) {
-				if(iter.next() == null)
-					iter.remove(); 
-			} 
-			if (others.isEmpty()) {
-				return;
-			}
-			event = new LabelProviderChangedEvent((IBaseLabelProvider) event
-					.getSource(), others.toArray());
-		}
-		super.handleLabelProviderChanged(event);
-	}
-
-	protected void handleDispose(DisposeEvent event) {
-		dispose();
-		super.handleDispose(event);
-	}
- 
-	/**
-	 * <p>
-	 * Disposes of the NavigatorContentService, which will dispose the Content
-	 * and Label providers.
-	 * </p>
-	 */
-	public void dispose() {
-		if (contentService != null) {
-			contentService.dispose();
-		}
-		clearSelectionCache();
-	}
-
-	/**
-	 * Sets this viewer's sorter and triggers refiltering and resorting of this
-	 * viewer's element. Passing <code>null</code> turns sorting off.
-	 * 
-	 * @param sorter
-	 *            a viewer sorter, or <code>null</code> if none
-	 */
-	public void setSorter(ViewerSorter sorter) {
-		if (sorter != null && sorter instanceof CommonViewerSorter) {
-			((CommonViewerSorter) sorter).setContentService(contentService);
-		}
-
-		super.setSorter(sorter);
-	}
-
-	/**
-	 * <p>
-	 * The {@link INavigatorContentService}provides the hook into the framework
-	 * to provide content from the various extensions.
-	 * </p>
-	 * 
-	 * @return The {@link INavigatorContentService}that was created when the
-	 *         viewer was created.
-	 */
-	public INavigatorContentService getNavigatorContentService() {
-		return contentService;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#add(java.lang.Object,
-	 *      java.lang.Object[])
-	 */
-	public void add(Object parentElement, Object[] childElements) {
-		// TODO Intercept ADD for the pipeline service.
-
-		NavigatorPipelineService pipeDream = (NavigatorPipelineService) contentService
-				.getPipelineService();
-
-		PipelinedShapeModification modification = new PipelinedShapeModification(
-				parentElement, new ContributorTrackingSet(contentService,
-						childElements));
-
-		pipeDream.interceptAdd(modification);
-
-		Object parent = (parentElement == getInput()) ? getInput()
-				: modification.getParent();
-
-		super.add(parent, modification.getChildren().toArray());
-
-	}
-
-	/**
-	 * <p>
-	 * Removals are handled by refreshing the parents of each of the given
-	 * elements. The parents are determined via calls ot the contentProvider.
-	 * </p>
-	 * 
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#remove(java.lang.Object[])
-	 */
-	public void remove(Object[] elements) {
-
-		// TODO Intercept REMOVE for the pipeline service.
-
-		NavigatorPipelineService pipeDream = (NavigatorPipelineService) contentService
-				.getPipelineService();
-
-		PipelinedShapeModification modification = new PipelinedShapeModification(
-				null, new ContributorTrackingSet(contentService, elements));
-
-		pipeDream.interceptRemove(modification);
-
-		super.remove(modification.getChildren().toArray());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.StructuredViewer#refresh(java.lang.Object,
-	 *      boolean)
-	 */
-	public void refresh(Object element, boolean updateLabels) {
-
-		
-		if(element != getInput()) {
-		
-			INavigatorPipelineService pipeDream = contentService
-					.getPipelineService();
-	
-			PipelinedViewerUpdate update = new PipelinedViewerUpdate();
-			update.getRefreshTargets().add(element);
-			update.setUpdateLabels(updateLabels);
-			/* if the update is modified */
-			if (pipeDream.interceptRefresh(update)) {
-				/* intercept and apply the update */
-				boolean toUpdateLabels = update.isUpdateLabels();
-				for (Iterator iter = update.getRefreshTargets().iterator(); iter
-						.hasNext();) {
-					super.refresh(iter.next(), toUpdateLabels);
-				}
-			} else {
-				super.refresh(element, updateLabels);
-			}
-		} else {
-			super.refresh(element, updateLabels);
-		}
-	}
-	
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.Viewer#setSelection(org.eclipse.jface.viewers.ISelection, boolean)
-	 */
-	public void setSelection(ISelection selection, boolean reveal) { 
-
-		if(selection instanceof IStructuredSelection) {
-			IStructuredSelection sSelection = (IStructuredSelection) selection;
-			
-			INavigatorPipelineService pipeDream = contentService
-					.getPipelineService();
-
-			PipelinedViewerUpdate update = new PipelinedViewerUpdate();
-			update.getRefreshTargets().addAll(sSelection.toList());
-			update.setUpdateLabels(false);
-			/* if the update is modified */
-			if (pipeDream.interceptRefresh(update)) {
-				/* intercept and apply the update */ 
-				super.setSelection(new StructuredSelection(update.getRefreshTargets().toArray()) , reveal);
-			} else {
-				super.setSelection(selection, reveal);
-			}
-		}
-	}
-	
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.ContentViewer#hookControl(Control)
-     */
-    protected void hookControl(Control control) {
-    	super.hookControl(control);
-        // FIXME - This caching thing should not be here; it's brittle.
-        // The underlying problem of over-calling of getSelection() should
-        // be addressed instead (see bugs 144294 and 140032)
-        // The DragStart event will come before the SelectionEvent on
-        // some platforms (GTK).  Since DragStart can turn around and
-        // call getSelection(), we need to clear the cache.
-        control.addMouseListener(new MouseAdapter() {
-            public void mouseDown(MouseEvent e) {
-            	clearSelectionCache();
-            }
-        });
-    }
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#setSelectionToWidget(java.util.List, boolean)
-	 */
-	protected void setSelectionToWidget(List v, boolean reveal) {
-		clearSelectionCache();
-		super.setSelectionToWidget(v, reveal);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#handleDoubleSelect(org.eclipse.swt.events.SelectionEvent)
-	 */
-	protected void handleDoubleSelect(SelectionEvent event) {
-		clearSelectionCache();
-		super.handleDoubleSelect(event);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StructuredViewer#handleOpen(org.eclipse.swt.events.SelectionEvent)
-	 */
-	protected void handleOpen(SelectionEvent event) {
-		clearSelectionCache();
-		super.handleOpen(event);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StructuredViewer#handlePostSelect(org.eclipse.swt.events.SelectionEvent)
-	 */
-	protected void handlePostSelect(SelectionEvent e) {
-		clearSelectionCache();
-		super.handlePostSelect(e);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.StructuredViewer#handleSelect(org.eclipse.swt.events.SelectionEvent)
-	 */
-	protected void handleSelect(SelectionEvent event) {
-		clearSelectionCache();
-		super.handleSelect(event);
-	}
-	
-	/**
-	 * Clears the selection cache.
-	 */
-	private void clearSelectionCache() {
-		cachedSelection = null;
-	}
-	
-	/**
-	 * Returns the current selection.
-	 * <p>
-	 * Note that as of 3.2.1 and 3.3, the common viewer caches its selection.
-	 * Clients must not set the selection of the viewer's tree control directly.
-	 * </p>
-	 * 
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#getSelection()
-	 */
-	public ISelection getSelection() {
-		if (cachedSelection == null) {
-			cachedSelection = super.getSelection();
-		}
-		return cachedSelection;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.StructuredViewer#refresh(java.lang.Object)
-	 */
-	public void refresh(Object element) {
-		refresh(element, true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.StructuredViewer#update(java.lang.Object,
-	 *      java.lang.String[])
-	 */
-	public void update(Object element, String[] properties) {
-
-
-		if(element != getInput()) {
-			INavigatorPipelineService pipeDream = contentService
-					.getPipelineService();
-	
-			PipelinedViewerUpdate update = new PipelinedViewerUpdate();
-			update.getRefreshTargets().add(element);
-			update.setUpdateLabels(true);
-			/* if the update is modified */
-			if (pipeDream.interceptUpdate(update)) {
-				/* intercept and apply the update */ 
-				for (Iterator iter = update.getRefreshTargets().iterator(); iter
-						.hasNext();) {
-					super.update(iter.next(), properties);
-				}
-			} else {
-				super.update(element, properties);
-			}
-		} else {
-			super.update(element, properties);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return contentService.toString() + " Viewer"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#internalRefresh(java.lang.Object,
-	 *      boolean)
-	 */
-	protected void internalRefresh(Object element, boolean updateLabels) {
-		if (element == null && getRoot() == null) {
-			return;
-		}
-		super.internalRefresh(element, updateLabels);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonViewerSiteFactory.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonViewerSiteFactory.java
deleted file mode 100644
index 27b6903..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonViewerSiteFactory.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.internal.navigator.CommonViewerSiteDelegate;
-import org.eclipse.ui.internal.navigator.CommonViewerSiteIEditorPartSiteDelegate;
-import org.eclipse.ui.internal.navigator.CommonViewerSiteIPageSiteDelegate;
-import org.eclipse.ui.internal.navigator.CommonViewerSiteIViewSiteDelegate;
-import org.eclipse.ui.part.IPageSite;
-
-/**
- * Allows clients to create {@link ICommonViewerSite} for a variety of contexts.
- * The {@link ICommonViewerSite} may be used by the
- * {@link NavigatorActionService} to allow customization for any
- * {@link CommonActionProvider} used by a particular instance of the Common
- * Navigator.
- *  
- * 
- * @since 3.2
- */
-public final class CommonViewerSiteFactory {
-	/**
-	 * 
-	 * @param aViewSite
-	 *            The viewer site that should be delegated to to satisfy the
-	 *            contract of ICommonViewerSite.
-	 * @return An ICommonViewerSite that delegates to the given parameter.
-	 */
-	public static ICommonViewerWorkbenchSite createCommonViewerSite(
-			IViewSite aViewSite) {
-		return new CommonViewerSiteIViewSiteDelegate(aViewSite);
-	}
-
-	/**
-	 * 
-	 * @param aEditorSite
-	 *            The editor site that should be delegated to to satisfy the
-	 *            contract of ICommonViewerSite.
-	 * @return An ICommonViewerSite that delegates to the given parameter.
-	 */
-	public static ICommonViewerWorkbenchSite createCommonViewerSite(
-			IEditorSite aEditorSite) {
-		return new CommonViewerSiteIEditorPartSiteDelegate(aEditorSite);
-	}
-
-	/**
-	 * 
-	 * @param anId
-	 *            The unique identifier corresponding to the abstract viewer for
-	 *            the returned ICommonViewerSite.
-	 * 
-	 * @param aSelectionProvider
-	 *            The selection provider that will initially be returned by
-	 *            {@link ICommonViewerSite#getSelectionProvider()}
-	 * 
-	 * @param aShell
-	 *            The shell that will be returned by
-	 *            {@link ICommonViewerSite#getShell()}
-	 * @return An ICommonViewerSite that delegates to the given parameter.
-	 */
-	public static ICommonViewerSite createCommonViewerSite(String anId,
-			ISelectionProvider aSelectionProvider, Shell aShell) {
-		return new CommonViewerSiteDelegate(anId, aSelectionProvider, aShell);
-	}
-
-	/**
-	 * 
-	 * @param anId
-	 *            The unique identifier corresponding to the abstract viewer for
-	 *            the returned ICommonViewerSite.
-	 * @param aPageSite
-	 *            The page site that should be delegated to to satisfy the
-	 *            contract of ICommonViewerSite.
-	 * @return An ICommonViewerSite that delegates to the given parameter.
-	 */
-	public static ICommonViewerSite createCommonViewerSite(String anId,
-			IPageSite aPageSite) {
-		return new CommonViewerSiteIPageSiteDelegate(anId, aPageSite);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonViewerSorter.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonViewerSorter.java
deleted file mode 100644
index 7ca0062..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/CommonViewerSorter.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-import java.util.Set;
-
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreePathViewerSorter;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-
-/**
- * 
- * Provides an implementation of TreeViewerSorter that uses the given parent to determine the
- * correct sort order based on the defined
- * <b>org.eclipse.ui.navigator.navigatorContent/navigatorContent/commonSorter</b> elements
- * available in the set of <i>visible</i> content extensions.
- * 
- * <p>
- * The CommonViewerSorter must be assigned a {@link INavigatorContentService} to drive its sorting
- * algorithm. Without a vaild content service, the sorter will return the default ordering.
- * </p>
- * <p>
- * A CommonViewerSorter may not be attached to more than one CommonViewer.
- * </p>
- * 
- * <p>
- * Clients may not extend this class.
- * </p>
- * 
- * 
- * 
- * @since 3.2
- * 
- */
-public final class CommonViewerSorter extends TreePathViewerSorter {
-	
-	private static final int LEFT_UNDERSTANDS = 1;
-	private static final int RIGHT_UNDERSTANDS = 2; 
-	private static final int BOTH_UNDERSTAND = LEFT_UNDERSTANDS | RIGHT_UNDERSTANDS; 
-
-	private NavigatorContentService contentService;
-
-	private INavigatorSorterService sorterService;
-
-	/**
-	 * Create a sorter service attached to the given content service.
-	 * 
-	 * @param aContentService
-	 *            The content service used by the viewer that will use this sorter service.
-	 * @since 3.3
-	 */
-	public void setContentService(INavigatorContentService aContentService) {
-		contentService = (NavigatorContentService) aContentService;
-		sorterService = contentService.getSorterService();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ViewerSorter#category(java.lang.Object)
-	 */
-	public int category(Object element) {
-		if (contentService == null)
-			return 0;
-
-		INavigatorContentDescriptor source = contentService.getSourceOfContribution(element);
-		if (source == null)
-			source = getSource(element);
-		return source != null ? source.getPriority() : Priority.NORMAL_PRIORITY_VALUE;
-	}
-
-	public int compare(Viewer viewer, TreePath parentPath, Object e1, Object e2) {
-		if (contentService == null)
-			return -1;
-		INavigatorContentDescriptor sourceOfLvalue = contentService.getSourceOfContribution(e1);
-		INavigatorContentDescriptor sourceOfRvalue = contentService.getSourceOfContribution(e2);
-		
-		Object parent;
-		if (parentPath == null) {
-			parent = viewer.getInput();
-		} else {
-			parent = parentPath.getLastSegment();
-		}
-		
-		// shortcut if contributed by same source
-		if(sourceOfLvalue == sourceOfRvalue) {
-			ViewerSorter sorter = sorterService.findSorter(sourceOfLvalue, parent, e1, e2);
-			if (sorter != null) {
-				return sorter.compare(viewer, e1, e2);
-			}
-		} 
-
-		if (sourceOfLvalue == null)
-			sourceOfLvalue = getSource(e1);
-		if (sourceOfRvalue == null)
-			sourceOfRvalue = getSource(e2);		
-
-		boolean flags[] = new boolean[4];
-		flags[0] = sourceOfLvalue.isPossibleChild(e1);
-		flags[1] = sourceOfLvalue.isPossibleChild(e2);
-		flags[2] = sourceOfRvalue.isPossibleChild(e1);
-		flags[3] = sourceOfRvalue.isPossibleChild(e2);
-		
-		int whoknows  = 0;		 
-		whoknows  = whoknows  | (flags[0] & flags[1] ? LEFT_UNDERSTANDS : 0); 
-		whoknows  = whoknows  | (flags[2] & flags[3] ? RIGHT_UNDERSTANDS : 0); 
-		
-
-		ViewerSorter sorter = null;
-		
-		switch(whoknows) {
-			case BOTH_UNDERSTAND: 
-				sorter = sourceOfLvalue.getPriority() > sourceOfRvalue.getPriority() ? 
-						sorterService.findSorter(sourceOfLvalue, parent, e1, e2) : 
-						sorterService.findSorter(sourceOfRvalue, parent, e1, e2);
-				break;
-			case LEFT_UNDERSTANDS: 
-				sorter =  sorterService.findSorter(sourceOfLvalue,
-					parent, e1, e2) ;
-					break;
-			case RIGHT_UNDERSTANDS: 
-				sorter =  sorterService.findSorter(sourceOfRvalue,
-					parent, e1, e2) ;
-					break;
-		}
-		 
-		if (sorter != null) {
-			return sorter.compare(viewer, e1, e2);
-		}
- 
-		int categoryDelta = category(e1) - category(e2);
-		if (categoryDelta == 0) {
-			return super.compare(viewer, e1, e2);
-		}
-		return categoryDelta;
-	}
-
-	private INavigatorContentDescriptor getSource(Object o) {
-		Set descriptors = contentService.findDescriptorsWithPossibleChild(o);
-		if (descriptors != null && descriptors.size() > 0) {
-			return (INavigatorContentDescriptor) descriptors.iterator().next();
-		}
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonActionConstants.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonActionConstants.java
deleted file mode 100644
index 4423904..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonActionConstants.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-/**
- * 
- * Defines constants for the retargetable actions available in the Common Viewer
- * context menu.
- * 
- * 
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @since 3.2
- * 
- */
-public interface ICommonActionConstants {
-
-	/**
-	 * The 'open' retargetable action id.
-	 */
-	public static final String OPEN = "org.eclipse.ui.navigator.Open"; //$NON-NLS-1$
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonActionExtensionSite.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonActionExtensionSite.java
deleted file mode 100644
index 758d34a..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonActionExtensionSite.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-
-/**
- * 
- * Provides access to information required for the initialization of
- * CommonActionProviders.
- * 
- * <p>
- * See the documentation of the <b>org.eclipse.ui.navigator.navigatorContent</b>
- * extension point and {@link CommonActionProvider} for more information on
- * contributing actions.
- * </p> 
- * 
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @see CommonActionProvider
- * 
- * @since 3.2
- */
-public interface ICommonActionExtensionSite {
-
-	/**
-	 * By default, the extension state model returned is for the associated
-	 * content extension (if this is NOT a top-level action provider).
-	 * Otherwise, clients may use
-	 * {@link INavigatorContentService#findStateModel(String)} to locate the
-	 * state model of another content extension.
-	 * 
-	 * @return The extension state model of the associated Content Extension (if
-	 *         any) or a state model specifically for this
-	 *         ICommonActionProvider.
-	 * @see IExtensionStateModel
-	 */
-	IExtensionStateModel getExtensionStateModel();
-
-	/**
-	 * 
-	 * @return The unique identifier of the associated content extension or the
-	 *         top-level Common Action Provider.
-	 */
-	String getExtensionId();
-
-	/**
-	 * 
-	 * @return The associated content service for the instantiated Common Action
-	 *         Provider.
-	 */
-	INavigatorContentService getContentService();
-
-	/**
-	 * 
-	 * @return The associated structured viewer for the instantiated Common
-	 *         Action Provider.
-	 */
-	StructuredViewer getStructuredViewer();
-
-	/**
-	 * 
-	 * @return The ICommonViewerSite from the CommonViewer.
-	 */
-	ICommonViewerSite getViewSite();
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonContentExtensionSite.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonContentExtensionSite.java
deleted file mode 100644
index 79e298f..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonContentExtensionSite.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-import org.eclipse.ui.IMemento;
-
-/**
- * 
- * Provides initialization data for a content extension. Supplied in the
- * <code>init()</code> methods of various interfaces allowed by the framework.
- * 
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @since 3.2
- * @see ICommonLabelProvider
- * @see ICommonContentProvider
- * 
- */
-public interface ICommonContentExtensionSite {
-
-	/**
-	 * The extension state model allows an extension to isolate all of the
-	 * dynamic state information that affects how it presents content or
-	 * displays actions. Clients may use this state model to drive values from
-	 * actions that will cause label or content providers to change their
-	 * behavior.
-	 * 
-	 * @return The state model associated with this logical extension.
-	 */
-	IExtensionStateModel getExtensionStateModel();
-
-	/**
-	 * Advanced extensions may expose user-customizeable properties that affect
-	 * the structure or behavior of the extension. Clients may use the given
-	 * memento to restore or persist these settings between sessions.
-	 * 
-	 * @return A memento which can be used to restore or persist settings
-	 *         between workbench sessions.
-	 */
-	IMemento getMemento(); 
-  
-	/**
-	 * 
-	 * @return The extension instance. Clients may use their extension
-	 *         instance to get access to other components defined by the logical
-	 *         extension.
-	 */
-	INavigatorContentExtension getExtension();
-	
-	/**
-	 * 
-	 * @return The content service associated with this extension site.
-	 * @since 3.3
-	 */
-	INavigatorContentService getService();
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonContentProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonContentProvider.java
deleted file mode 100644
index f49011d..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonContentProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-
-/**
- * 
- * Allows extensions to vary their behavior based on properties in the extension
- * model and the given memento. The state model should be initialized from
- * values in the memento if necessary.
- * 
- * <p>
- * Clients should refer to the <b>org.eclipse.ui.navigator.navigatorContent</b>
- * extension point for more information on building a content extension.
- * </p>
- * 
- * <p>
- * Clients may implement this interface if they require the methods defined here.
- * {@link ITreeContentProvider} is respected by the Common
- * Navigator.
- * </p>
- * 
- * @since 3.2
- * 
- */
-public interface ICommonContentProvider extends ITreeContentProvider,
-		IMementoAware {
-
-	/**
-	 * Initialize the content provider with the given configuration.
-	 * 
-	 * @param aConfig
-	 *            The extension site provides information that some extensions
-	 *            will find useful to configure themselves properly in a
-	 *            particular viewer.
-	 * 
-	 * @see ICommonLabelProvider
-	 */
-	void init(ICommonContentExtensionSite aConfig);
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonFilterDescriptor.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonFilterDescriptor.java
deleted file mode 100644
index 659cbd0..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonFilterDescriptor.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-/**
- * Provides information about a <b>commonFilter</b> extension.
- *  
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @since 3.2
- * 
- */
-public interface ICommonFilterDescriptor {
-	
-	/**
-	 * 
-	 * @return An identifier used to determine whether the filter is visible.
-	 * 
-	 */
-	String getId();
-
-	/**
-	 * 
-	 * @return A translated name to identify the filter
-	 */
-	String getName();
-
-	/**
-	 * 
-	 * @return A translated description to explain to the user what the defined
-	 *         filter will hide from the view.
-	 */
-	String getDescription();
-
-	/**
-	 * 
-	 * @return Indicates the filter should be in an "Active" state by default.
-	 */
-	boolean isActiveByDefault();
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonLabelProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonLabelProvider.java
deleted file mode 100644
index bf9d460..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonLabelProvider.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-
-/**
- * 
- * Allows extensions to vary their behavior based on properties in the extension
- * model and the given memento.
- * 
- * <p>
- * Clients should refer to the <b>org.eclipse.ui.navigator.navigatorContent</b>
- * extension point for more information on building a content extension.
- * </p>
- * <p>
- * Clients should not dispose of any Image Resources that might be shared by
- * other extensions when their Label Provider is disposed. When a content extension
- * is deactivated, both its content and label providers are disposed, but the
- * viewer remains visible to the user. If clients dispose of Image Resources used
- * by other extensions, then it will cause problems for those extensions and the 
- * viewer in general. 
- * </p>
- * <p>
- * Clients may implement this interface if they require the methods provided here.
- * {@link org.eclipse.jface.viewers.ILabelProvider} is respected by the Common
- * Navigator.
- * </p>
- * 
- * 
- * @since 3.2
- */
-public interface ICommonLabelProvider extends ILabelProvider, IMementoAware,
-		IDescriptionProvider {
-
-	/**
-	 * Initialize the label provider with the given configuration.
-	 * 
-	 * @param aConfig
-	 *            The extension site provides information that some extensions
-	 *            will find useful to configure themselves properly in a
-	 *            particular viewer.
-	 * 
-	 * @see ICommonContentProvider
-	 */
-	void init(ICommonContentExtensionSite aConfig);
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonMenuConstants.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonMenuConstants.java
deleted file mode 100644
index a045742..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonMenuConstants.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-/*
- * Created on Feb 5, 2004
- *
- * To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-package org.eclipse.ui.navigator;
-
-import org.eclipse.ui.IWorkbenchActionConstants;
-
-/**
- * Defines strings used for menu insertion points.
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @since 3.2
- */
-public interface ICommonMenuConstants {
-
-	/**
-	 * Pop-up menu: name of group for the top of the menu (value
-	 * <code>"group.top"</code>).
-	 */
-	public static final String GROUP_TOP = "group.top"; //$NON-NLS-1$ 
-
-	/**
-	 * Pop-up menu: name of group for goto actions (value
-	 * <code>"group.goto"</code>).
-	 * <p>
-	 * Examples for open actions are:
-	 * <ul>
-	 * <li>Go Into</li>
-	 * <li>Go To</li>
-	 * </ul>
-	 * </p>
-	 */
-	public static final String GROUP_GOTO = "group.goto"; //$NON-NLS-1$
-
-	/**
-	 * Pop-up menu: name of group for show actions (value
-	 * <code>"group.show"</code>).
-	 * <p>
-	 * Examples for show actions are:
-	 * <ul>
-	 * <li>Show in Navigator</li>
-	 * <li>Show in Type Hierarchy</li>
-	 * </ul>
-	 * </p>
-	 */
-	public static final String GROUP_SHOW = "group.show"; //$NON-NLS-1$
-
-	/**
-	 * Pop-up menu: name of group for new actions (value
-	 * <code>"group.new"</code>).
-	 * <p>
-	 * Examples for new actions are:
-	 * <ul>
-	 * <li>Create new class</li>
-	 * <li>Create new interface</li>
-	 * </ul>
-	 * </p>
-	 */
-	public static final String GROUP_NEW = "group.new"; //$NON-NLS-1$
-
-	/**
-	 * Pop-up menu: name of group for open actions (value
-	 * <code>"group.open"</code>).
-	 * <p>
-	 * Examples for open actions are:
-	 * <ul>
-	 * <li>Open To</li>
-	 * <li>Open With</li>
-	 * </ul>
-	 * </p>
-	 * 
-	 * @see #GROUP_OPEN_WITH
-	 */
-	public static final String GROUP_OPEN = "group.open"; //$NON-NLS-1$
-
-	/**
-	 * Pop-up menu: name of group for open actions (value
-	 * <code>"group.openWith"</code>).
-	 * <p>
-	 * Examples for open actions are:
-	 * <ul>
-	 * <li>Open With</li>
-	 * </ul>
-	 * </p>
-	 */
-	public static final String GROUP_OPEN_WITH = "group.openWith"; //$NON-NLS-1$
-
-	/**
-	 * Pop-up menu: name of group for porting actions (value
-	 * <code>"group.port"</code>).
-	 * <p>
-	 * Examples for open actions are:
-	 * <ul>
-	 * <li>Import</li>
-	 * <li>Export</li>
-	 * </ul>
-	 * </p>
-	 */
-	public static final String GROUP_PORT = "group.port";//$NON-NLS-1$
-
-	/**
-	 * Pop-up menu: name of group for properties actions (value
-	 * <code>"group.edit"</code>).
-	 */
-	public static final String GROUP_EDIT = "group.edit"; //$NON-NLS-1$ 
-
-	/**
-	 * Pop-up menu: name of group for build actions (value
-	 * <code>"group.build"</code>).
-	 */
-	public static final String GROUP_BUILD = "group.build"; //$NON-NLS-1$
-
-	/**
-	 * Pop-up menu: name of group for reorganize actions (value
-	 * <code>"group.reorganize"</code>).
-	 */
-	public static final String GROUP_REORGANIZE = IWorkbenchActionConstants.GROUP_REORGANIZE;
-
-	/**
-	 * Pop-up menu: name of group for code generation actions ( value
-	 * <code>"group.generate"</code>).
-	 */
-	public static final String GROUP_GENERATE = "group.generate"; //$NON-NLS-1$
-
-	/**
-	 * Pop-up menu: name of group for source actions. This is an alias for
-	 * <code>GROUP_GENERATE</code> to be more consistent with main menu bar
-	 * structure.
-	 *  
-	 */
-	public static final String GROUP_SOURCE = GROUP_GENERATE;
-
-	/**
-	 * Pop-up menu: name of group for search actions (value
-	 * <code>"group.search"</code>).
-	 */
-	public static final String GROUP_SEARCH = "group.search"; //$NON-NLS-1$
-
-	/**
-	 * Pop-up menu: name of group for additional actions (value
-	 * <code>"additions"</code>).
-	 */
-	public static final String GROUP_ADDITIONS = "additions"; //$NON-NLS-1$
-
-	/**
-	 * Pop-up menu: name of group for viewer setup actions (value
-	 * <code>"group.viewerSetup"</code>).
-	 */
-	public static final String GROUP_VIEWER_SETUP = "group.viewerSetup"; //$NON-NLS-1$
-
-	/**
-	 * Pop-up menu: name of group for properties actions (value
-	 * <code>"group.properties"</code>).
-	 */
-	public static final String GROUP_PROPERTIES = "group.properties"; //$NON-NLS-1$ 
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonViewerSite.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonViewerSite.java
deleted file mode 100644
index 41fdbfe..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonViewerSite.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * 
- * Provides context for extensions including a valid shell, a selection
- * provider, and a unique identifer corresponding to the abstract viewer behind
- * the viewer site.
- *  
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @since 3.2
- */
-public interface ICommonViewerSite extends IAdaptable {
-
-	/**
-	 * 
-	 * @return The unique identifier associated with the defined abstract
-	 *         viewer. In general, this will be the id of the
-	 *         <b>org.eclipse.ui.views</b> extension that defines the view
-	 *         part.
-	 */
-	String getId();
-
-
-	/**
-	 * 
-	 * @return A valid shell corresponding to the shell of the
-	 *         {@link CommonViewer}
-	 */
-	Shell getShell();
-
-	/**
-	 * 
-	 * @return The selection provider that can provide a current, valid
-	 *         selection. The default selection provider is the
-	 *         {@link CommonViewer}.
-	 */
-	ISelectionProvider getSelectionProvider();
-
-	/**
-	 * Sets the selection provider for this common viewer site.
-	 * 
-	 * @param provider
-	 *            the selection provider, or <code>null</code> to clear it
-	 */
-	public void setSelectionProvider(ISelectionProvider provider);
-	
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonViewerWorkbenchSite.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonViewerWorkbenchSite.java
deleted file mode 100644
index 3efefd7..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ICommonViewerWorkbenchSite.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * 
- * Provides a page, set of action bars, menu registration callback, and active
- * window.
- * 
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @since 3.2
- * 
- */
-public interface ICommonViewerWorkbenchSite extends ICommonViewerSite {
-
-	/**
-	 * Returns the page corresponding to this viewer site.
-	 * 
-	 * @return the page corresponding to this viewer site
-	 */
-	public IWorkbenchPage getPage();
-
-	/**
-	 * Registers a pop-up menu with a particular id for extension.
-	 * <p>
-	 * Within the workbench one plug-in may extend the pop-up menus for a view
-	 * or editor within another plug-in. In order to be eligible for extension,
-	 * the menu must be registered by calling <code>registerContextMenu</code>.
-	 * Once this has been done the workbench will automatically insert any
-	 * action extensions which exist.
-	 * </p>
-	 * <p>
-	 * A unique menu id must be provided for each registered menu. This id
-	 * should be published in the Javadoc for the page.
-	 * </p>
-	 * <p>
-	 * Any pop-up menu which is registered with the workbench should also define
-	 * a <code>GroupMarker</code> in the registered menu with id
-	 * <code>IWorkbenchActionConstants.MB_ADDITIONS</code>. Other plug-ins
-	 * will use this group as a reference point for insertion. The marker should
-	 * be defined at an appropriate location within the menu for insertion.
-	 * </p>
-	 * 
-	 * @param menuId
-	 *            the menu id
-	 * @param menuManager
-	 *            the menu manager
-	 * @param selectionProvider
-	 *            the selection provider
-	 */
-	void registerContextMenu(String menuId, MenuManager menuManager,
-			ISelectionProvider selectionProvider);
-
-	/**
-	 * Returns the action bars for this page site. Pages have exclusive use of
-	 * their site's action bars.
-	 * 
-	 * @return the action bars
-	 */
-	IActionBars getActionBars();
-
-	/**
-	 * 
-	 * @return A workbench window corresponding to the container of the
-	 *         {@link CommonViewer}
-	 */
-	IWorkbenchWindow getWorkbenchWindow();
-
-	/**
-	 * @return the IWorkbenchPart that this site is embedded within.
-	 */
-	IWorkbenchPart getPart();
-
-	/**
-	 * @return the IWorkbenchPartSite that this site is embedded within.
-	 */
-	IWorkbenchPartSite getSite();
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IDescriptionProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IDescriptionProvider.java
deleted file mode 100644
index b7590ea..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IDescriptionProvider.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-/**
- * 
- * Label providers (as specified by the <i>labelProvider</i> attribute of the
- * <b>org.eclipse.ui.navigator.navigatorContent</b> extension point) may 
- * choose to also implement this interface in order to provide text for 
- * the status bar at the bottom of the Eclipse window. 
- * 
- * <p>
- * Clients may implement this interface, but are not required to do so.
- * </p>
- * 
- * @since 3.2
- */
-public interface IDescriptionProvider {
-
-	/**
-	 * <p>
-	 * Provide a description for the status bar view, if available. A default
-	 * string of the form "(x) items selected" will be used if this method
-	 * choosed to return null.
-	 * </p>
-	 * 
-	 * <p>
-	 * The empty string ("") will be respected as a valid value if returned.
-	 * Return <b>null </b> if the extension defers to the default method of
-	 * supplying status bar descriptions.
-	 * </p>
-	 * 
-	 * @param anElement
-	 *            The element selected in the Navigator
-	 * @return A description for the status bar view, or null if not available.
-	 */
-	String getDescription(Object anElement);
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IExtensionActivationListener.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IExtensionActivationListener.java
deleted file mode 100644
index 07cd14f..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IExtensionActivationListener.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-
-/**
- * 
- * An extension activation listener is notified whenever the activation state
- * changese for one or more content extensions.
- * 
- *   
- * <p>
- * Clients may implement this interface.
- * </p>
- * 
- * @since 3.2
- * @see INavigatorActivationService
- * @see INavigatorActivationService#addExtensionActivationListener(IExtensionActivationListener)
- * @see INavigatorActivationService#removeExtensionActivationListener(IExtensionActivationListener)
- */
-public interface IExtensionActivationListener {
-	/**
-	 * @param aViewerId
-	 *            The viewer id of the INavigatorContentService
-	 * @param theNavigatorExtensionIds
-	 *            A sorted array of updated extension ids
-	 * @param isActive
-	 *            The new activation state of the extensions
-	 */
-	void onExtensionActivation(String aViewerId,
-			String[] theNavigatorExtensionIds, boolean isActive);
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IExtensionStateModel.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IExtensionStateModel.java
deleted file mode 100644
index e7da616..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IExtensionStateModel.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import org.eclipse.jface.util.IPropertyChangeListener;
-
-/**
- * 
- * Allows clients to coordinate state across components that are part of the
- * same logical extension.
- * 
- * <p>
- * That is, a content provider might vary how it exposes its content based on
- * the state of a specific property in the model. Interested parties may add
- * themselves as {@link IPropertyChangeListener}s to track changes in the state
- * model.
- * </p>
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- * @since 3.2
- * 
- */
-public interface IExtensionStateModel {
-
-	/**
-	 * The id is used to look up the state model across different components of
-	 * the same logical extension. Generally, the id of the content extension is
-	 * used.
-	 * 
-	 * @return The unique identifier of this state model.
-	 */
-	String getId();
-
-	/**
-	 * 
-	 * @return The viewer id that this state model is associated with.
-	 */
-	String getViewerId();
-
-	/**
-	 * 
-	 * @param aPropertyName
-	 *            The name of a given property
-	 * @return The current value of the property.
-	 */
-	String getStringProperty(String aPropertyName);
-
-	/**
-	 * 
-	 * @param aPropertyName
-	 *            The name of a given property
-	 * @return The current value of the property.
-	 */
-	boolean getBooleanProperty(String aPropertyName);
-
-	/**
-	 * 
-	 * @param aPropertyName
-	 *            The name of a given property
-	 * @return The current value of the property.
-	 */
-	int getIntProperty(String aPropertyName);
-
-	/**
-	 * 
-	 * @param aPropertyName
-	 *            The name of a given property
-	 * @return The current value of the property.
-	 */
-	Object getProperty(String aPropertyName);
-
-	/**
-	 * 
-	 * @param aPropertyName
-	 *            The name of a given property
-	 * @param aPropertyValue
-	 *            The new value of a the given property.
-	 */
-	void setStringProperty(String aPropertyName, String aPropertyValue);
-
-	/**
-	 * 
-	 * @param aPropertyName
-	 *            The name of a given property
-	 * @param aPropertyValue
-	 *            The new value of a the given property.
-	 */
-	void setBooleanProperty(String aPropertyName, boolean aPropertyValue);
-
-	/**
-	 * 
-	 * @param aPropertyName
-	 *            The name of a given property
-	 * @param aPropertyValue
-	 *            The new value of a the given property.
-	 */
-	void setIntProperty(String aPropertyName, int aPropertyValue);
-
-	/**
-	 * 
-	 * @param aPropertyName
-	 *            The name of a given property
-	 * @param aPropertyValue
-	 *            The new value of a the given property.
-	 */
-	void setProperty(String aPropertyName, Object aPropertyValue);
-
-	/**
-	 * 
-	 * @param aListener
-	 *            An implementation of {@link IPropertyChangeListener} that
-	 *            should be notified when changes occur in this model.
-	 */
-	void addPropertyChangeListener(IPropertyChangeListener aListener);
-
-	/**
-	 * 
-	 * @param aListener
-	 *            An implementation of {@link IPropertyChangeListener} that
-	 *            should no longer be notified when changes occur in this model.
-	 */
-	void removePropertyChangeListener(IPropertyChangeListener aListener);
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ILinkHelper.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ILinkHelper.java
deleted file mode 100644
index e804fa9..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/ILinkHelper.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-
-/**
- * <p>
- * Provides information to the Common Navigator on how to link selections with
- * active editors and vice versa.
- * </p>
- * <p>
- * The Common Navigator allows clients to plug-in their own custom logic for
- * linking selections from the Viewer to active editors. This interface is used
- * by the <b>org.eclipse.ui.navigator.linkHelper </b> extension
- * point to gather information and trigger editor activations.
- * </p>
- *  
- * <p>
- * Clients may implement this interface.
- * </p>
- * 
- * @since 3.2
- */
-public interface ILinkHelper {
-
-	/**
-	 * <p>
-	 * Determine the correct structured selection for the Common Navigator given
-	 * anInput.
-	 * </p>
-	 * 
-	 * @param anInput
-	 *            An Editor input
-	 * @return A selection to be set against the {@link CommonViewer}
-	 */
-	IStructuredSelection findSelection(IEditorInput anInput);
-
-	/**
-	 * <p>
-	 * Activate the correct editor for aSelection.
-	 * </p>
-	 * 
-	 * @param aPage
-	 *            A WorkbenchPage to use for editor location and activation
-	 * @param aSelection
-	 *            The current selection from the {@link CommonViewer}
-	 */
-	void activateEditor(IWorkbenchPage aPage, IStructuredSelection aSelection);
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IMementoAware.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IMementoAware.java
deleted file mode 100644
index d4d7293..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IMementoAware.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import org.eclipse.ui.IMemento;
-
-/**
- * Clients may use mementos to persist interesting state between sessions.
- * Clients should ensure that the memento keys are unique; generally by using
- * the id of the content extension as a prefix.
- * 
- * <p>
- * Clients may implement this interface.
- * </p>
- * 
- * @since 3.2
- * 
- */
-public interface IMementoAware {
-
-	/**
-	 * <p>
-	 * Restore the previous state of any actions using the flags in aMemento.
-	 * This method allows the state of any actions that persist from session to
-	 * session to be restored.
-	 * </p>
-	 * 
-	 * @param aMemento
-	 *            A memento that was given to the view part to restore its
-	 *            state.
-	 */
-	public void restoreState(IMemento aMemento);
-
-	/**
-	 * <p>
-	 * Save flags in aMemento to remember the state of any actions that persist
-	 * from session to session.
-	 * </p>
-	 * <p>
-	 * Extensions should qualify any keys stored in the memento with their
-	 * plugin id
-	 * </p>
-	 * 
-	 * @param aMemento
-	 *            A memento that was given to the view part to save its state.
-	 */
-	public void saveState(IMemento aMemento);
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorActivationService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorActivationService.java
deleted file mode 100644
index fc98ce1..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorActivationService.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-/**
- * 
- * Determines if an extension is <i>active</i> within the context of a given
- * viewer and manages the persistence of this information. If an extension is
- * <i>active</i> then the extension will contribute functionality to the
- * viewer. If an extension is not <i>active</i>, then the extension will not be
- * given opportunities to contribute functionality to the given viewer. See
- * {@link INavigatorContentService} for more detail on what states are
- * associated with a content extension.
- * 
- * @since 3.2
- * 
- */
-public interface INavigatorActivationService {
-
-	/**
-	 * Activate the extensions specified by the extensionIds array. Clients may
-	 * also choose to disable all other extensions. The set of descriptors
-	 * returned is the set that were activated as a result of this call. In the
-	 * case of this method, that means that a descriptor will be returned for
-	 * each extensionId in the array, regardless of whether that extension is
-	 * already enabled.
-	 * 
-	 * <p>
-	 * Clients must call {@link #persistExtensionActivations()} to save the the
-	 * activation state after activating or deactivating extensions.
-	 * </p>
-	 * 
-	 * @param extensionIds
-	 *            The list of extensions to activate
-	 * @param toDeactivateAllOthers
-	 *            True will deactivate all other extensions; False will leave
-	 *            the other activations as-is
-	 * @return A list of all INavigatorContentDescriptors that were activated as
-	 *         a result of this call. This will be the set of
-	 *         INavigatorContentDescriptors that corresponds exactly to the set
-	 *         of given extensionIds.
-	 */
-	public INavigatorContentDescriptor[] activateExtensions(
-			String[] extensionIds, boolean toDeactivateAllOthers);
-
-	/**
-	 * Deactivate the extensions specified by the extensionIds. Clients may
-	 * choose to activate all other extensions which are not explicitly
-	 * disabled. If toActivateAllOthers is true, the array of returned
-	 * descriptors will be the collection of all extensions not specified in the
-	 * extensionIds array. If it is false, the array will be empty.
-	 * 
-	 * <p>
-	 * Clients must call {@link #persistExtensionActivations()} to save the the
-	 * activation state after activating or deactivating extensions.
-	 * </p>
-	 * 
-	 * @param extensionIds
-	 *            The list of extensions to activate
-	 * @param toActivateAllOthers
-	 *            True will activate all other extensions; False will leave the
-	 *            other activations as-is
-	 * @return A list of all INavigatorContentDescriptors that were activated as
-	 *         a result of this call. If toActivateAllOthers is false, the
-	 *         result will be an empty array. Otherwise, it will be the set of
-	 *         all visible extensions minus those given in the 'extensionIds'
-	 *         parameter.
-	 */
-	public INavigatorContentDescriptor[] deactivateExtensions(
-			String[] extensionIds, boolean toActivateAllOthers);
-
-	/**
-	 * 
-	 * Checks the known activation state for the given viewer id to determine if
-	 * the given navigator extension is 'active'.
-	 * 
-	 * @param aNavigatorExtensionId
-	 *            The unique identifier associated with a given extension.
-	 * 
-	 * @return True if the extension is active in the context of the viewer id.
-	 */
-	public boolean isNavigatorExtensionActive(String aNavigatorExtensionId);
-
-	/**
-	 * Save the activation state of each content extension for the associated
-	 * content service. Clients should persist the activation state after any
-	 * call to {@link #activateExtensions(String[], boolean)} or
-	 * {@link #deactivateExtensions(String[], boolean)}.
-	 * 
-	 */
-	public void persistExtensionActivations();
-
-	/**
-	 * Request notification when the activation state changes.
-	 * 
-	 * @param aListener
-	 *            An implementation of {@link IExtensionActivationListener}
-	 */
-	public void addExtensionActivationListener(
-			IExtensionActivationListener aListener);
-
-	/**
-	 * No longer receive notification when activation state changes.
-	 * 
-	 * @param aListener
-	 *            An implementation of {@link IExtensionActivationListener}
-	 */
-	public void removeExtensionActivationListener(
-			IExtensionActivationListener aListener);
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorContentDescriptor.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorContentDescriptor.java
deleted file mode 100644
index 1968616..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorContentDescriptor.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import java.util.Set;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * 
- * The descriptor provides a the low-level handle to a content extension. Information such as
- * the Id, the name, the priority, and whether the descriptor provides one or
- * more root elements is provided.  This descriptor is used to form the 
- * {@link INavigatorContentExtension}.
- * 
- * <p>
- * There is a one-to-many correspondence between the {@link INavigatorContentDescriptor} and
- * {@link INavigatorContentExtension}.  An instance of the {@link INavigatorContentExtension} is
- * created for each {@link INavigatorContentDescriptor} used by a 
- * {@link INavigatorContentService}.
- * </p>
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- * @since 3.2
- * 
- */
-public interface INavigatorContentDescriptor {
-
-	/**
-	 * Returns the navigator content extension id
-	 * 
-	 * @return the navigator content extension id
-	 */
-	String getId();
-
-	/**
-	 * Returns the name of this navigator extension
-	 * 
-	 * @return the name of this navigator extension
-	 */
-	String getName();
-
-	/**
-	 * Returns the priority of the navigator content extension.
-	 * 
-	 * @return the priority of the navigator content extension. Returns {@link Priority#NORMAL}
-	 *         if no priority was specified.
-	 */
-	int getPriority();
-
-	/**
-	 * The enabledByDefault attribute specifies whether an extension should be
-	 * activated in the context of a viewer automatically. Users may override
-	 * this setting through the "Types of Content" dialog.
-	 * 
-	 * @return true if the extension is enabled by default.
-	 */
-	boolean isActiveByDefault();
-
-	/**
-	 * Determine if this content extension is enabled for the given element.
-	 * 
-	 * @param anElement
-	 *            The element that should be used for the evaluation.
-	 * @return True if and only if the extension is enabled for the element.
-	 */
-	boolean isTriggerPoint(Object anElement);
-
-	/**
-	 * Determine if this content extension could provide the given element as a
-	 * child.
-	 * 
-	 * <p>
-	 * This method is used to determine what the parent of an element could be
-	 * for Link with Editor support.
-	 * </p>
-	 * 
-	 * @param anElement
-	 *            The element that should be used for the evaluation.
-	 * @return True if and only if the extension might provide an object of this
-	 *         type as a child.
-	 */
-	boolean isPossibleChild(Object anElement);
-
-	/**
-	 * A convenience method to check all elements in a selection.
-	 * 
-	 * @param aSelection
-	 *            A non-null selection
-	 * @return True if and only if every element in the selection is a possible
-	 *         child.
-	 */
-	boolean arePossibleChildren(IStructuredSelection aSelection);
-
-	/**
-	 * @return Returns the suppressedExtensionId or null if none specified.
-	 */
-	String getSuppressedExtensionId();
-
-	/**
-	 * @return Returns the overridePolicy or null if this extension does not
-	 *         override another extension.
-	 * @since 3.4
-	 */
-	OverridePolicy getOverridePolicy();
-
-	/**
-	 * @return The descriptor of the <code>suppressedExtensionId</code> if
-	 *         non-null.
-	 */
-	INavigatorContentDescriptor getOverriddenDescriptor();
-
-	/**
-	 * 
-	 * Does not force the creation of the set of overriding extensions.
-	 * 
-	 * @return True if this extension has overriding extensions.
-	 */
-	boolean hasOverridingExtensions();
-
-	/**
-	 * @return The set of overriding extensions (of type
-	 *         {@link INavigatorContentDescriptor})
-	 */
-	Set getOverriddingExtensions();
-
-	/**
-	 * @return true if the extension's content provider may adapt to a {@link SaveablesProvider}.
-	 */
-	boolean hasSaveablesProvider();
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorContentExtension.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorContentExtension.java
deleted file mode 100644
index 18c8e3d..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorContentExtension.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-
-/**
- * The content extension represents the components of a <b>navigatorContent</b>
- * extension. These handles are managed by a content service
- * {@link INavigatorContentService}.  An extension is formed from the
- * {@link INavigatorContentDescriptor}. 
- * 
- * <p>
- * There is a one-to-many correspondence between the {@link INavigatorContentDescriptor} and
- * {@link INavigatorContentExtension}.  An instance of the {@link INavigatorContentExtension} is
- * created for each {@link INavigatorContentDescriptor} used by a 
- * {@link INavigatorContentService}.
- * </p>
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- * @since 3.2
- * 
- */
-public interface INavigatorContentExtension extends IAdaptable {
-
-	/**
-	 * 
-	 * @return The id attribute of the navigatorContent extension.
-	 */
-	String getId();
-
-	/**
-	 * There is one descriptor for all instances of a
-	 * INavigatorContentExtension.
-	 * 
-	 * 
-	 * @return A handle to the descriptor used to manage this extension.
-	 */
-	INavigatorContentDescriptor getDescriptor();
-
-	/**
-	 * Clients may choose to implement {@link ICommonContentProvider}, but are
-	 * only required to supply an implementation of {@link ITreeContentProvider}.
-	 * 
-	 * @return The content provider defined by the <b>navigatorContent</b>
-	 *         extension.
-	 * @see ICommonContentProvider
-	 * @see ITreeContentProvider
-	 */
-	ITreeContentProvider getContentProvider();
-
-	/**
-	 * The real underlying implementation may only support the
-	 * {@link ILabelProvider} interface, but a simple delegate is used when this
-	 * is the case to ensure that clients may anticpate an
-	 * {@link ICommonLabelProvider} interface.
-	 * 
-	 * <p>Since 3.4, the returned label provider may also implement
-	 * {@link org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider}
-	 * to provide styled text labels. Note that the empty styled string signals
-	 * that the label provider does not wish to render the label.
-	 * </p>
-	 * 
-	 * @return The content provider defined by the <b>navigatorContent</b>
-	 *         extension.
-	 * @see ICommonLabelProvider
-	 * @see ILabelProvider
-	 */
-	ICommonLabelProvider getLabelProvider(); 
-
-	/**
-	 * 
-	 * @return True if any class has been instantiated by this extension.
-	 */
-	boolean isLoaded();
-
-	/**
-	 * 
-	 * @return The state model associated with this content extension.
-	 * @see IExtensionStateModel
-	 */
-	IExtensionStateModel getStateModel();
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorContentService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorContentService.java
deleted file mode 100644
index 86ee755..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorContentService.java
+++ /dev/null
@@ -1,447 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import java.util.Set;
-
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.ISaveablesSource;
-
-/**
- * 
- * Manages content extensions for extensible viewers and provides reusable
- * services for filters, sorting, the activation of content extensions, and DND.
- * The service can locate the appropriate providers (for contents or labels) for
- * an element and provide a ready-to-go {@link ITreeContentProvider} and
- * {@link ILabelProvider} for viewers that wish to take advantage of the
- * <b>org.eclipse.ui.navigator.navigatorContent</b> extensions defined for a
- * particular <i>viewerId</i>.
- * 
- * <p>
- * Clients should create instances of the this class using the factory ({@link NavigatorContentServiceFactory}).
- * </p>
- * 
- * <p>
- * Clients may contribute logical extensions using
- * <b>org.eclipse.ui.navigator.navigatorContent</b>. Each extension has three
- * states which determine whether the extension is used by the content service:
- * <ul>
- * <li><a name="visible"><i>visible</i>: If a content extension id matches a
- * <b>viewerContentBinding</b> for the <i>viewerId</i> of this content
- * service, then the extension is <i>visible</i>. Visible extensions may only
- * be configured through <b>viewerContentBinding</b>s. </li>
- * 
- * <li><a name="active"><i>active</i>: The active state may be set to a default using the
- * <i>activeByDefault</i> attribute of <b>navigatorContent</b>. Users may
- * toggle the <i>active</i> state through the "Available customizations"
- * dialog. Clients may also configure the active extensions using
- * {@link INavigatorActivationService#activateExtensions(String[], boolean)} or
- * {@link INavigatorActivationService#deactivateExtensions(String[], boolean)}
- * from the {@link #getActivationService() Activation Service} </li>
- * 
- * <li><a name="enabled"><i>enabled</i>: An extension is <i>enabled</i> for an element if the
- * extension contributed that element or if the element is described in the
- * <i>triggerPoints</i> element of the <b>navigatorContent</b> extension. The
- * findXXX() methods search for <i>enabled</i> extensions. </li>
- * </ul>
- * </p>
- * <p>
- * A new instance of the content service should be created for each viewer.
- * Clients should use {@link #createCommonContentProvider()} and
- * {@link #createCommonLabelProvider()} for the viewer. Each content service
- * tracks the viewer it is attached to. Clients may create the content service
- * with a viewer using ({@link NavigatorContentServiceFactory#createContentService(String)}).
- * Alternatively, when the content provider is created and set on a viewer,
- * {@link IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, Object, Object)}
- * will be called and the content provider will update the viewer used by its
- * backing content service. Therefore, only each content service has exactly one
- * content provider and one label provider.
- * </p>
- * <p>
- * Extensions may also coordinate their behavior through a
- * {@link IExtensionStateModel state model}. The state model holds properties
- * and supports property change listeners. Actions can toggle the setting of
- * properties and the corresponding content/label providers will respond to
- * property change event. Each <b>navigatorContent</b> extension has its own
- * contained state model keyed off of the content extension id.
- * </p>
- * <p>
- * Clients may respond when content extensions are loaded by attaching a
- * {@link INavigatorContentServiceListener} to the content service.
- * </p>
- * <p>
- * Some extensions may provide content or label providers which implement
- * {@link IMemento}. Clients must call {@link #restoreState(IMemento)} and
- * {@link #saveState(IMemento)} at the appropriate times for these extensions to
- * prepare themselves with the memento.
- * </p>
- * <p>
- * This interface is not intended to be implemented by clients.
- * </p>
- * 
- * @since 3.2
- * 
- */
-public interface INavigatorContentService {
-
-	/**
-	 * Create a Content Provider which will use an enhanced delegation model to
-	 * locate extension content providers using this content service for each
-	 * element in the tree.
-	 * 
-	 * <p>
-	 * The content provider returned will populate the root of the viewer in one
-	 * of two ways.
-	 * <p>
-	 * In the first approach, the content provider will seek out content
-	 * extensions which are bound using a <b>viewerContentBinding</b>. If any
-	 * of the found <b>viewerContentBindings</b> declare the <i>isRoot</i>
-	 * attribute on as true, then that set of extensions will be consulted for
-	 * the root elements of the tree. The input of the viewer will be supplied
-	 * to each of their {@link IStructuredContentProvider#getElements(Object)}
-	 * methods and aggregate the results for the root of the viewer.
-	 * </p>
-	 * <p>
-	 * In the second approach, if no <b>viewerContentBindings</b> declare
-	 * <i>isRoot</i> as true, then all matching extensions are consulted based
-	 * on their <b>triggerPoints</b> expression in the <b>navigatorContent</b>
-	 * extension. Any matching extensions are then consulted via their
-	 * {@link IStructuredContentProvider#getElements(Object)} methods and the
-	 * results are aggregated into the root.
-	 * </p>
-	 * <p>
-	 * After the root is populated, the children of each root element are
-	 * determined by consulting the source extension and all extension which
-	 * describe the element in their <b>triggerPoints</b> expression.
-	 * </p>
-	 * <p>
-	 * If clients wish to use a viewer other than the CommonViewer, then they
-	 * are responsible for creating the content provider, and setting it on
-	 * their viewer.
-	 * </p>
-	 * 
-	 * @return An enhanced content provider that will use this content service
-	 *         to drive the viewer.
-	 */
-	ITreeContentProvider createCommonContentProvider();
-
-	/**
-	 * Create a Label Provider which will use an enhanced delegation model to
-	 * locate extension label providers using this content service for each
-	 * element in the tree.
-	 * 
-	 * <p>
-	 * The label of each element is determined by consulting the source of the
-	 * element. If the source chooses to return null, then other extensions
-	 * which declare the element in their <b>triggerPoints</b> extension are
-	 * consulted. The first non-null value is used (including the empty label).
-	 * </p>
-	 * 
-	 * <p>
-	 * If clients wish to use a viewer other than the CommonViewer, then they
-	 * are responsible for creating the label provider, and setting it on their
-	 * viewer.
-	 * </p>
-	 * 
-	 * @return An enhanced label provider that will use this content service to
-	 *         drive labels in the viewer.
-	 */
-	ILabelProvider createCommonLabelProvider();
-
-	/**
-	 * 
-	 * @return The description provider for this content service.
-	 */
-	IDescriptionProvider createCommonDescriptionProvider();
-
-	/**
-	 * The state model stores properties associated with the extension. Each
-	 * content extension has its own contained state model. Components of the
-	 * extension (content provider, label provider, action providers, etc) may
-	 * attach themselves as listeners to the model ({@link IExtensionStateModel#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)})
-	 * and respond to changes to the values of the properties.
-	 * 
-	 * @param anExtensionId
-	 *            The extension id defined by a <b>navigatorContent</b>
-	 *            extension.
-	 * @return The state model for the given extension id.
-	 */
-	IExtensionStateModel findStateModel(String anExtensionId);
-
-	/**
-	 * The viewer id is used to locate matching <b>viewerContentBindings</b>.
-	 * In general, this would be the id of the view defined by a
-	 * <b>org.eclipse.ui.views</b> extension. However, there is no formal
-	 * requirement that this is the case.
-	 * 
-	 * @return The viewerId used to create this content service.
-	 */
-	String getViewerId();
-
-	/**
-	 * The viewer descriptor provides some basic information about the abstract
-	 * viewer that uses this content service.
-	 * 
-	 * @return The viewer descriptor for this content service.
-	 * @see INavigatorViewerDescriptor
-	 */
-	INavigatorViewerDescriptor getViewerDescriptor();
-
-	/**
-	 * See <a href="#active">above</a> for the definition of <i>active</i>.
-	 * 
-	 * @param anExtensionId
-	 *            The unqiue identifier from a content extension.
-	 * @return True if and only if the given extension id is <i>active</i> for
-	 *         this content service.
-	 * @see INavigatorContentService For more information on what <i>active</i>
-	 *      means.
-	 * 
-	 */
-	boolean isActive(String anExtensionId);
-
-	/**
-	 *  See <a href="#visible">above</a> for the definition of <i>visible</i>.
-	 *  
-	 * @param anExtensionId
-	 *            The unqiue identifier from a content extension.
-	 * @return True if and only if the given extension id is <i>visible</i> to
-	 *         this content service.
-	 * @see INavigatorContentService For more information on what <i>visible</i>
-	 *      means.
-	 */
-	boolean isVisible(String anExtensionId);
-
-	/**
-	 * Return the set of <i>visible</i> extension ids for this content service,
-	 * which includes those that are bound through <b>viewerContentBinding</b>s
-	 * and those that are bound through
-	 * {@link #bindExtensions(String[], boolean)}.
-	 * 
-	 * @return The set of <i>visible</i> extension ids for this content service
-	 */
-	String[] getVisibleExtensionIds();
-
-	/**
-	 * Return the set of <i>visible</i> content descriptors for this content
-	 * service, which includes those that are bound through
-	 * <b>viewerContentBinding</b>s and those that are bound through
-	 * {@link #bindExtensions(String[], boolean)}.
-	 * 
-	 * @return The set of <i>visible</i> content descriptors for this content
-	 *         service
-	 */
-	INavigatorContentDescriptor[] getVisibleExtensions();
-
-	/**
-	 * Bind the set of given extensions to this content service. Programmatic
-	 * bindings allow clients to make extensions <i>visible</i> to an instance
-	 * of the content service by appending to the bindings declared through
-	 * <b>org.eclipse.ui.navigator.viewer</b>. Programmtic bindings are not
-	 * persisted and are not remembered or propagated to other instances of the
-	 * INavigatorContentService in the same session. Programmatic bindings
-	 * cannot be undone for a given instance of the INavigatorContentService and
-	 * do not override declarative bindings.
-	 * <p>
-	 * Once a content extension has been bound to the INavigatorContentService,
-	 * clients may use
-	 * {@link INavigatorActivationService#activateExtensions(String[], boolean) }
-	 * or
-	 * {@link  INavigatorActivationService#deactivateExtensions(String[], boolean) }
-	 * to control the <i>activation</i> state of the extension. See
-	 * {@link INavigatorContentService} for more information on the difference
-	 * between <i>visible</i> and <i>active</i>.
-	 * </p>
-	 * 
-	 * @param extensionIds
-	 *            The list of extensions to make visible.
-	 * @param isRoot
-	 *            whether the context provider should be a root content provider
-	 * @return A list of all INavigatorContentDescriptors that correspond to the
-	 *         given extensionIds.
-	 */
-	INavigatorContentDescriptor[] bindExtensions(String[] extensionIds,
-			boolean isRoot);
-
-	/**
-	 * Restore the state associated with the memento.
-	 * 
-	 * @param aMemento
-	 *            The memento for extensions to use when restoring previous
-	 *            settings.
-	 */
-	void restoreState(IMemento aMemento);
-
-	/**
-	 * Persist any session-to-session state with the memento.
-	 * 
-	 * @param aMemento
-	 *            The memento for extensions to use when persisting previous
-	 *            settings.
-	 */
-	void saveState(IMemento aMemento);
-
-	/**
-	 * Add a listener to be notified whenever an extension is loaded.
-	 * 
-	 * @param aListener
-	 *            A listener to be attached.
-	 */
-	void addListener(INavigatorContentServiceListener aListener);
-
-	/**
-	 * Remove a listener (by identity) from the set of listeners.
-	 * 
-	 * @param aListener
-	 *            A listener to be detached.
-	 */
-	void removeListener(INavigatorContentServiceListener aListener);
-
-	/**
-	 * The root content providers are recalculated by this method. The attached
-	 * viewer is also refreshed as a result of this method.
-	 * 
-	 */
-	void update();
-
-	/**
-	 * Release any acquired resources and instantiated content extensions.
-	 * 
-	 */
-	void dispose();
-
-	/**
-	 * Search for extensions that declare the given element in their
-	 * <b>triggerPoints</b> expression or that indicate they should be bound as
-	 * a root extension.
-	 * 
-	 * @param anElement
-	 *            The element to use in the query
-	 * @return The set of {@link INavigatorContentExtension}s that are
-	 *         <i>visible</i> and <i>active</i> for this content service and
-	 *         either declared through a
-	 *         <b>org.eclipse.ui.navigator.viewer/viewerContentBinding</b> to
-	 *         be a root element or have a <b>triggerPoints</b> expression that
-	 *         is <i>enabled</i> for the given element.
-	 */
-	Set findRootContentExtensions(Object anElement);
-
-	/**
-	 * Search for extensions that declare the given element in their
-	 * <b>triggerPoints</b> expression.
-	 * 
-	 * @param anElement
-	 *            The element to use in the query
-	 * @return The set of {@link INavigatorContentExtension}s that are
-	 *         <i>visible</i> and <i>active</i> for this content service and
-	 *         have a <b>triggerPoints</b> expression that is <i>enabled</i>
-	 *         for the given element.
-	 */
-	Set findContentExtensionsByTriggerPoint(Object anElement);
-
-	/**
-	 * Search for extensions that declare the given element in their
-	 * <b>possibleChildren</b> expression.
-	 * 
-	 * @param anElement
-	 *            The element to use in the query
-	 * @return The set of {@link INavigatorContentExtension}s that are
-	 *         <i>visible</i> and <i>active</i> for this content service and
-	 *         have a <b>possibleChildren</b> expression that is <i>enabled</i>
-	 *         for the given element.
-	 */
-	Set findContentExtensionsWithPossibleChild(Object anElement);
-
-	/**
-	 * The filter service can provide the available filters for the viewer, and
-	 * manage which filters are <i>active</i>.
-	 * 
-	 * @return An {@link INavigatorFilterService} that can provide information
-	 *         to a viewer about what filters are <i>visible</i> and <i>active</i>.
-	 */
-	INavigatorFilterService getFilterService();
-
-	/**
-	 * The sorter service provides the appropriate sorter based on the current
-	 * items being sorted. By default, the CommonViewer uses
-	 * {@link CommonViewerSorter} which delegates to this service. Clients do
-	 * not need to provide their own {@link ViewerSorter} unless they wish to
-	 * override this functionality.
-	 * 
-	 * @return An {@link INavigatorSorterService} that can provide
-	 *         {@link ViewerSorter} based on the context of the parent.
-	 */
-	INavigatorSorterService getSorterService();
-
-	/**
-	 * The pipeline service calculates the appropriate viewer modification or
-	 * refresh that should be applied for viewers that wish to take advantage of
-	 * the model pipelining that some extensions use to massage or reshape
-	 * contents in the viewer. Clients that use the {@link CommonViewer} do not
-	 * need to be concerned with this service as the refreshes are automatically
-	 * computed using this service.
-	 * 
-	 * 
-	 * @return The {@link INavigatorPipelineService} which can determine the
-	 *         correct updates to apply to a viewer.
-	 */
-	INavigatorPipelineService getPipelineService();
-
-	/**
-	 * The DND Service provides instances of {@link CommonDragAdapterAssistant}
-	 * and {@link CommonDropAdapterAssistant} for this content service.
-	 * 
-	 * @return The {@link INavigatorDnDService} which can add additional
-	 *         TransferTypes for the DragAdapter and setup the data correctly
-	 *         for those extended Transfer Types.
-	 */
-	INavigatorDnDService getDnDService();
-
-	/**
-	 * The activation service is used to toggle whether certain extensions have
-	 * the opportunity to contribute content and/or actions.
-	 * 
-	 * @return The {@link INavigatorActivationService} for this content service.
-	 */
-	INavigatorActivationService getActivationService();
-	
-	/**
-	 * The saveable service helps implementing {@link ISaveablesSource}.
-	 * 
-	 * @return the {@link INavigatorSaveablesService} for this content service.
-	 */
-	INavigatorSaveablesService getSaveablesService();
-	
-	/** 
-	 * Return the content extension for the given id. 
-	 * 
-	 * @param anExtensionId The id used to define the <b>org.eclipse.ui.navigator.navigatorContent/navigatorContent</b> extension.
-	 * @return An instance of the content extension for the given extension id. May return <b>null</b> if the id is invalid.
-	 */
-	public INavigatorContentExtension getContentExtensionById(String anExtensionId);
-	
-	/** 
-	 * Return the content extension for the given id. 
-	 * 
-	 * @param anExtensionId The id used to define the <b>org.eclipse.ui.navigator.navigatorContent/navigatorContent</b> extension.
-	 * @return An instance of the content extension for the given extension id. May return <b>null</b> if the id is invalid.
-	 * @since 3.3
-	 */
-	public INavigatorContentDescriptor getContentDescriptorById(String anExtensionId);
-
-
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorContentServiceListener.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorContentServiceListener.java
deleted file mode 100644
index 1c3286f..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorContentServiceListener.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-
-
-/**
- * <p>
- * Used by clients who would like to listen for the load event of am
- * {@link INavigatorContentExtension}.
- *  
- * 
- * <p>
- * Clients may implement this interface.
- * </p>
- * @since 3.2
- */
-public interface INavigatorContentServiceListener {
-
-	
-	/**
-	 * Notifies the listener that the given extension
-	 * has now been loaded. Extensions are loaded as 
-	 * needed as the user expands nodes in the tree viewer. 
-	 * 
-	 * @param anExtension The extension that was loaded.
-	 */
-	void onLoad(INavigatorContentExtension anExtension);
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorDnDService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorDnDService.java
deleted file mode 100644
index 821b930..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorDnDService.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.dnd.TransferData;
-
-/**
- * 
- * Provides instances of {@link CommonDragAdapterAssistant} and
- * {@link CommonDropAdapterAssistant} for the associated
- * {@link INavigatorContentService}.
- * 
- * <p>
- * Clients should only take note of this Service they are are using the
- * {@link INavigatorContentService} in the context of a viewer which is not or
- * does not extend {@link CommonViewer}. Clients should take a look at the
- * initialization of the DND support in the {@link CommonViewer} if they wish to
- * support this capability in their own viewers.
- * </p>
- * 
- * @see CommonDragAdapter
- * @see CommonDragAdapterAssistant
- * @see CommonDropAdapter
- * @see CommonDropAdapterAssistant
- * @see CommonViewer
- * @see INavigatorContentService#getDnDService()
- * @see <a
- *      href="http://www.eclipse.org/articles/Article-SWT-DND/DND-in-SWT.html">Drag
- *      and Drop: Adding Drag and Drop to an SWT Application</a>
- * @see <a
- *      href="http://www.eclipse.org/articles/Article-Workbench-DND/drag_drop.html">Drag
- *      and Drop in the Eclipse UI (Custom Transfer Types)</a>
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- * @since 3.2
- * 
- * 
- */
-public interface INavigatorDnDService {
-
-	/**
-	 * 
-	 * As part of the <b>org.eclipse.ui.navigator.viewer</b> extension point,
-	 * clients may explicit extend the support Transfer Types of a particular
-	 * viewer using the <b>dragAssistant</b> element. This element defines a
-	 * class which extends {@link CommonDragAdapterAssistant} and can direct the
-	 * viewer on how to provide different kinds of DND Transfer Types. The array
-	 * is returned in no particular order.
-	 * 
-	 * @return An array of {@link CommonDragAdapterAssistant} or an empty array.
-	 */
-	CommonDragAdapterAssistant[] getCommonDragAssistants();
-
-	/**
-	 * Clients may choose to programmatically bind drag assistants to an
-	 * instance of the DND Service. A programmatic binding is not persisted
-	 * between sessions and is not propagated to other instances of
-	 * {@link INavigatorContentService} with the same id. 
-	 * 
-	 * @param anAssistant The assistant to bind.
-	 */
-	void bindDragAssistant(CommonDragAdapterAssistant anAssistant);
-
-	/**
-	 * 
-	 * This method returns an array of {@link CommonDropAdapterAssistant} from
-	 * content extensions that are <i>visible</i> and <i>active</i> for the
-	 * associated {@link INavigatorContentService}. The array is sorted by
-	 * priority, with overrides taken into account.
-	 * 
-	 * <p>
-	 * The array should be processed from the first element to the last, asking
-	 * each extension to
-	 * {@link CommonDropAdapterAssistant#validateDrop(Object, int, org.eclipse.swt.dnd.TransferData)}.
-	 * The first to successfully validate the drop operation will have the
-	 * opportunity to
-	 * {@link CommonDropAdapterAssistant#handleDrop(CommonDropAdapter, org.eclipse.swt.dnd.DropTargetEvent, Object) handle the drop}
-	 * </p>
-	 * 
-	 * @param aDropTarget
-	 *            The target element in the viewer of the drop operation.
-	 * @param theTransferType
-	 *            The transfer type of the current drop operation.
-	 * @return An array of {@link CommonDropAdapterAssistant}s that are defined
-	 *         by the set of
-	 *         <b>org.eclipse.ui.navigator.navigatorContent/navigatorContent</b>
-	 *         extensions that provide a <b>possibleChildren</b> expression
-	 *         that matches the given drop target.
-	 */
-	CommonDropAdapterAssistant[] findCommonDropAdapterAssistants(
-			Object aDropTarget, TransferData theTransferType);
-
-	/**
-	 * 
-	 * This method returns an array of {@link CommonDropAdapterAssistant} from
-	 * content extensions that are <i>visible</i> and <i>active</i> for the
-	 * associated {@link INavigatorContentService}.
-	 * 
-	 * <p>
-	 * The array should be processed from the first element to the last, asking
-	 * each extension to
-	 * {@link CommonDropAdapterAssistant#validateDrop(Object, int, org.eclipse.swt.dnd.TransferData)}.
-	 * The first to successfully validate the drop operation will have the
-	 * opportunity to
-	 * {@link CommonDropAdapterAssistant#handleDrop(CommonDropAdapter, org.eclipse.swt.dnd.DropTargetEvent, Object) handle the drop}
-	 * </p>
-	 * 
-	 * @param aDropTarget
-	 *            The target element in the viewer of the drop operation.
-	 * @param theDragSelection
-	 *            The drag selection of the current drop operation.
-	 * @return An array of {@link CommonDropAdapterAssistant}s that are defined
-	 *         by the set of
-	 *         <b>org.eclipse.ui.navigator.navigatorContent/navigatorContent</b>
-	 *         extensions that provide a <b>possibleChildren</b> expression
-	 *         that matches the given drop target.
-	 */
-	CommonDropAdapterAssistant[] findCommonDropAdapterAssistants(
-			Object aDropTarget, IStructuredSelection theDragSelection);
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorFilterService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorFilterService.java
deleted file mode 100644
index 1adba1a..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorFilterService.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-import org.eclipse.jface.viewers.ViewerFilter;
-
-/**
- * Provides support for managing the filters defined for a Common Navigator
- * viewer.
- * 
- * <p>
- * An INavigatorFilterService manages the available common filters and their
- * current activation state for a particular INavigatorContentService. An
- * INavigatorFilterService cannot be acquired without an
- * INavigatorContentService (through
- * {@link INavigatorContentService#getFilterService}). Each instance will
- * provide information specific to the content service associated with it.
- * </p>
- * <p>
- * The visibility of commonFilters is controlled through matching
- * <b>viewerContentBinding</b>s. That is, like content extensions, the id of a
- * commonFilter must match an includes expression for at least one
- * <b>viewerContentBinding</b> element for the corresponding
- * INavigatorContentService.
- * </p>
- * <p>
- * The activation of each filter should be persisted from session to session.
- * Clients of this interface have control over when the persistence occurs. In
- * particular, clients should call {@link  #persistFilterActivationState()}
- * after each call to {@link #setActiveFilterIds(String[])}.
- * </p> 
- * 
- * @see INavigatorContentService#getFilterService()
- * @see ViewerFilter
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- * @since 3.2
- * 
- */
-public interface INavigatorFilterService {
-
-	/**
-	 * 
-	 * Determine the set of filters which are <i>visible</i> to the
-	 * content service associated with this filter service. 
-	 * 
-	 * @param toReturnOnlyActiveFilters
-	 *            True indicates that only active filters should be returned.
-	 * @return An array of ViewerFilters that should be applied to the viewer
-	 *         rendering the content from this INavigatorContentService
-	 */
-	ViewerFilter[] getVisibleFilters(boolean toReturnOnlyActiveFilters);
-
-	/**
-	 * 
-	 * <i>Visible</i> filters are filters whose ids match a
-	 * <b>viewerContentBinding</b> for the corresponding viewer.
-	 * 
-	 * @return An array of all visible filter descriptors.
-	 */
-	ICommonFilterDescriptor[] getVisibleFilterDescriptors();
-
-	/**
-	 * @param aFilterId
-	 *            Check the activation of aFilterId for the content service
-	 *            corresponding to this filter service.
-	 * @return True if the filter specified by the id is active for the content
-	 *         service corresponding to this filter service.
-	 */
-	boolean isActive(String aFilterId);
-
-	/**
-	 * Activate the set of given filters. An <i>active</i> filter will always be
-	 * returned from {@link #getVisibleFilters(boolean)}. An <i>inactive</i> filter will
-	 * only be returned from {@link #getVisibleFilters(boolean)} when it is
-	 * called with <b>false</b>.
-	 * 
-	 * 
-	 * @param theFilterIds
-	 *            An array of filter ids to activate.
-	 * 
-	 */
-	void setActiveFilterIds(String[] theFilterIds);
-
-	/** 
-	 * Persist the current activation state for visible filters.
-	 */
-	void persistFilterActivationState();
-	
-	/**
-	 * 
-	 * Return the viewer filter for the given descriptor
-	 * 
-	 * @param theDescriptor
-	 *            A non-null filter descriptor.
-	 * @return the viewer filter for the given descriptor
-	 * @since 3.3
-	 */
-	ViewerFilter getViewerFilter(ICommonFilterDescriptor theDescriptor);
-	
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorPipelineService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorPipelineService.java
deleted file mode 100644
index 6627e27..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorPipelineService.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-/**
- * 
- * Performs calculations that are necessary to determine the correct children to
- * render in the viewer.
- * 
- * @see INavigatorContentService#getPipelineService()
- * @see PipelinedShapeModification
- * @see PipelinedViewerUpdate
- * @see IPipelinedTreeContentProvider
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- * @since 3.2
- */
-public interface INavigatorPipelineService {
-	
-
-	/**
-	 * Intercept attempts to add elements directly to the viewer.
-	 * 
-	 * <p>
-	 * For content extensions that reshape the structure of children in a
-	 * viewer, their overridden extensions may sometimes use optimized refreshes
-	 * to add elements to the tree. These attempts must be intercepted and
-	 * mapped to the correct set of model elements in the overridding extension.
-	 * Clients may add, remove, or modify elements in the given set of added
-	 * children. Clients should return a set for downstream extensions to
-	 * massage further.
-	 * </p>
-	 * <p>
-	 * <b>Clients should not call any of the add, remove, refresh, or update
-	 * methods on the viewer from this method or any code invoked by the
-	 * implementation of this method.</b>
-	 * </p>
-	 * 
-	 * @param anAddModification
-	 *            The shape modification which contains the current suggested
-	 *            parent and children. Clients may modify this parameter
-	 *            directly and return it as the new shape modification.
-	 * @return The new shape modification to use. Clients should <b>never</b>
-	 *         return <b>null</b> from this method.
-	 */
-	public PipelinedShapeModification interceptAdd(
-			PipelinedShapeModification anAddModification);
-	
-	/**
-	 * Intercept attempts to remove elements directly from the viewer.
-	 * 
-	 * <p>
-	 * For content extensions that reshape the structure of children in a
-	 * viewer, their overridden extensions may sometimes use optimized refreshes
-	 * to remove elements to the tree. These attempts must be intercepted and
-	 * mapped to the correct set of model elements in the overridding extension.
-	 * Clients may add, remove, or modify elements in the given set of removed
-	 * children. Clients should return a set for downstream extensions to
-	 * massage further.
-	 * </p>
-	 * <p>
-	 * <b>Clients should not call any of the add, remove, refresh, or update
-	 * methods on the viewer from this method or any code invoked by the
-	 * implementation of this method.</b>
-	 * </p>
-	 * 
-	 * @param aRemoveModification
-	 *            The shape modification which contains the current suggested
-	 *            parent and children. Clients may modify this parameter
-	 *            directly and return it as the new shape modification.
-	 * @return The new shape modification to use. Clients should <b>never</b>
-	 *         return <b>null</b> from this method.
-	 */
-	public PipelinedShapeModification interceptRemove(
-			PipelinedShapeModification aRemoveModification);
-	
-	/**
-	 * Intercept calls to viewer <code>refresh()</code> methods.
-	 * 
-	 * <p>
-	 * Clients may modify the given update to add or remove the elements to be
-	 * refreshed. Clients may return the same instance that was passed in for
-	 * the next downstream extension.
-	 * </p>
-	 * 
-	 * <p>
-	 * <b>Clients should not call any of the add, remove, refresh, or update
-	 * methods on the viewer from this method or any code invoked by the
-	 * implementation of this method.</b>
-	 * </p>
-	 * 
-	 * @param aRefreshSynchronization
-	 *            The (current) refresh update to execute against the viewer.
-	 * @return The (potentially reshaped) refresh to execute against the viewer.
-	 */
-	boolean interceptRefresh(PipelinedViewerUpdate aRefreshSynchronization);
-	
-	/**
-	 * Intercept calls to viewer <code>update()</code> methods.
-	 * 
-	 * <p>
-	 * Clients may modify the given update to add or remove the elements to be
-	 * updated. Clients may also add or remove properties for the given targets
-	 * to optimize the refresh. Clients may return the same instance that was
-	 * passed in for the next downstream extension.
-	 * </p>
-	 * 
-	 * <p>
-	 * <b>Clients should not call any of the add, remove, refresh, or update
-	 * methods on the viewer from this method or any code invoked by the
-	 * implementation of this method.</b>
-	 * </p>
-	 * 
-	 * @param anUpdateSynchronization
-	 *            The (current) update to execute against the viewer.
-	 * @return The (potentially reshaped) update to execute against the viewer.
-	 */
-	public boolean interceptUpdate(
-			PipelinedViewerUpdate anUpdateSynchronization);
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorSaveablesService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorSaveablesService.java
deleted file mode 100644
index e4ad4f6..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorSaveablesService.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.ui.ISaveablesLifecycleListener;
-import org.eclipse.ui.ISaveablesSource;
-import org.eclipse.ui.Saveable;
-
-/**
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- * @since 3.2
- * 
- */
-public interface INavigatorSaveablesService {
-
-	/**
-	 * Initializes this service. Must be called on the UI thread, and may only
-	 * be called once. The given viewer's control must not be disposed.
-	 * <p>
-	 * The given listener will be notified of changes to the result of
-	 * {@link #getSaveables()} and to the dirty state of those saveables. The
-	 * given source will be used as the event source for these event
-	 * notifications.
-	 * </p>
-	 * <p>
-	 * The given viewer's selection will be used by
-	 * {@link #getActiveSaveables()} to determine the active saveables. The
-	 * active saveables are determined by iterating over the current selection,
-	 * and for each element, walking up its parent chain until an element
-	 * representing a saveable is found, or a root element is reached.
-	 * </p>
-	 * 
-	 * @param source
-	 * @param viewer
-	 * @param listener
-	 * 
-	 */
-	public void init(ISaveablesSource source, StructuredViewer viewer,
-			ISaveablesLifecycleListener listener);
-
-	/**
-	 * Returns the Saveable objects for which elements are contained in the
-	 * tree.
-	 * 
-	 * @return the saveables
-	 */
-	public Saveable[] getSaveables();
-
-	/**
-	 * Returns the active saveables based on the current selection. This method
-	 * must be called on the UI thread.
-	 * 
-	 * @return the active saveables based on the current selection
-	 */
-	public Saveable[] getActiveSaveables();
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorSorterService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorSorterService.java
deleted file mode 100644
index 4a9d2f7..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorSorterService.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ViewerSorter;
-
-/**
- * 
- * Provides an interface to extensions declared in
- * <b>org.eclipse.ui.navigator.navigatorContent/commonSorter</b>.
- * 
- * <p>
- * Like other extensions to the Common Navigator framework, sorters defined by
- * the above extension point must be bound to the associated
- * {@link INavigatorContentService} through a
- * <b>org.eclipse.ui.navigator.viewer/viewerContentBinding</b> extension.
- * </p>
- * 
- * @see INavigatorContentService#getSorterService()
- * @see ViewerSorter
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- * @since 3.2
- */
-public interface INavigatorSorterService {
-
-	/**
-	 * Return a {@link ViewerSorter} from an extension which is visible to the
-	 * associated {@link INavigatorContentService} and whose <b>parentExpression</b>
-	 * matches the given parent.
-	 * 
-	 * @param aParent
-	 *            An element from the tree
-	 * @return An applicable ViewerSorter or simple {@link ViewerSorter} if no
-	 *         sorter is found.
-	 */
-	ViewerSorter findSorterForParent(Object aParent);
-
-	/**
-	 * Return a {@link ViewerSorter} from an extension which is visible to the
-	 * associated {@link INavigatorContentService} and whose <b>parentExpression</b>
-	 * matches the given parent.
-	 * 
-	 * @param source
-	 *            The source of the element.
-	 * @param parent
-	 *            An element from the tree
-	 * @param lvalue
-	 *            An element from the tree
-	 * @param rvalue
-	 *            An element from the tree
-	 * @return An applicable ViewerSorter or simple {@link ViewerSorter} if no
-	 *         sorter is found.
-	 */
-	ViewerSorter findSorter(INavigatorContentDescriptor source, Object parent,
-			Object lvalue, Object rvalue);
-
-	/**
-	 * Find and return all viewer sorters associated with the given descriptor.
-	 * 
-	 * <p>
-	 * The <i>commonSorter</i> element is not required to have an id, so in
-	 * some cases, an auto-generated id, using the content extension id as a
-	 * base, is generated to ensure the map is properly filled with all
-	 * available sorters. No guarantees are given as to the order or consistency
-	 * of these generated ids between invocations.
-	 * </p>
-	 * 
-	 * @param theSource
-	 *            A descriptor that identifies a particular content extension
-	 * @return A Map[String sorterDescriptorId, ViewerSorter instance] where the
-	 *         key is the id defined in the extension and the value is the
-	 *         instantiated sorter.
-	 * 
-	 * @see INavigatorContentService#getContentDescriptorById(String)
-	 * @see INavigatorContentService#getContentExtensionById(String)
-	 * @see INavigatorContentExtension#getDescriptor()
-	 * @since 3.3
-	 */
-	public Map findAvailableSorters(INavigatorContentDescriptor theSource);
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorViewerDescriptor.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorViewerDescriptor.java
deleted file mode 100644
index f5b8b48..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/INavigatorViewerDescriptor.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.Separator;
-
-/**
- * Provides a basic metadata about the abstract viewer for a particular content
- * service.
- * 
- * @noimplement This interface is not intended to be implemented by clients.
- * @since 3.2
- * 
- */
-public interface INavigatorViewerDescriptor {
-
-	/**
-	 * {@value} (boolean): True indicates the
-	 * "Available Extensions" tab in the "Available Customizations" dialog
-	 * should not be available for the user (defaults to <b>false</b>).
-	 * 
-	 */
-	String PROP_HIDE_AVAILABLE_EXT_TAB = "org.eclipse.ui.navigator.hideAvailableExtensionsTab"; //$NON-NLS-1$
-
-	/**
-	 * {@value} (boolean): True
-	 * indicates the entire "Available Customizations" dialog should not be
-	 * available for the user (defaults to <b>false</b>).
-	 */
-	String PROP_HIDE_AVAILABLE_CUSTOMIZATIONS_DIALOG = "org.eclipse.ui.navigator.hideAvailableCustomizationsDialog"; //$NON-NLS-1$
-
-	/**
-	 * {@value} (boolean): True indicates the
-	 * "Collapse All" button should not be available for the user (defaults to
-	 * <b>false</b>).
-	 */
-	String PROP_HIDE_COLLAPSE_ALL_ACTION = "org.eclipse.ui.navigator.hideCollapseAllAction"; //$NON-NLS-1$
-
-	/**
-	 * {@value} (boolean): True indicates
-	 * the "Link With Editor" action should not be available for the user
-	 * (defaults to <b>false</b>).
-	 */
-	String PROP_HIDE_LINK_WITH_EDITOR_ACTION = "org.eclipse.ui.navigator.hideLinkWithEditorAction"; //$NON-NLS-1$
-
-	/**
-	 * Returns the id of the viewer targeted by this extension.
-	 * 
-	 * @return the id of the viewer targeted by this extension.
-	 */
-	String getViewerId();
-
-	/**
-	 * The default value of the popup menu id is the viewer id. Clients may
-	 * override this value using a <b>navigatorConfiguration</b> extension.
-	 * 
-	 * @return The id of the context menu of the viewer.
-	 */
-	String getPopupMenuId();
-
-	/**
-	 * Returns true if the content extension of the given id is 'visible'. A
-	 * content extension is 'visible' if it matches a viewerContentBinding for
-	 * the given viewer id.
-	 * 
-	 * @param aContentExtensionId
-	 *            The id to query
-	 * @return True if the content extension matches a viewerContentBinding for
-	 *         the viewer id of this descriptor.
-	 */
-	boolean isVisibleContentExtension(String aContentExtensionId);
-
-	/**
-	 * Returns true if the action extension of the given id is 'visible'. An
-	 * action extension is 'visible' if it matches a viewerActionBinding for the
-	 * given viewer id.
-	 * 
-	 * @param anActionExtensionId
-	 *            The id to query
-	 * @return True if the action extension matches a viewerActionBinding for
-	 *         the viewer id of this descriptor.
-	 */
-	boolean isVisibleActionExtension(String anActionExtensionId);
-
-	/**
-	 * Returns true if the content extension of the given id matches a
-	 * viewerContentBinding extension that declares isRoot as true.
-	 * 
-	 * @param aContentExtensionId
-	 *            The id to query
-	 * @return True if the content extension matches a viewerContentBinding
-	 *         which declares 'isRoot' as true for the viewer id of this
-	 *         descriptor.
-	 */
-	boolean isRootExtension(String aContentExtensionId);
-
-	/**
-	 * Returns true if there exists at least one matching viewerContentBinding
-	 * which declares isRoot as true. This behavior will override the default
-	 * enablement for the viewer root.
-	 * 
-	 * @return True if there exists a matching viewerContentBinding which
-	 *         declares isRoot as true.
-	 */
-	boolean hasOverriddenRootExtensions();
-
-	/**
-	 * Returns true by default. A true value indicates that object and view
-	 * contributions should be supported by the popup menu of any viewer
-	 * described by this viewer descriptor. The value may be overridden from the
-	 * &lt;popupMenu /&gt; child element of the &lt;viewer /&gt; element in the
-	 * <b>org.eclipse.ui.navigator.viewer</b> extension point.
-	 * 
-	 * @return True if object/view contributions should be allowed or False
-	 *         otherwise.
-	 */
-	boolean allowsPlatformContributionsToContextMenu();
-
-	/**
-	 * 
-	 * Custom insertion points are declared through a nested 'popupMenu' element
-	 * in the <b>org.eclipse.ui.navigator.viewer</b> extension point. Each
-	 * insertion point represents either a {@link Separator} or
-	 * {@link GroupMarker} in the context menu of the viewer.
-	 * <p>
-	 * 
-	 * @return The set of custom insertion points, if any. A null list indicates
-	 *         the default set (as defined by {@link NavigatorActionService})
-	 *         should be used. An empty list indicates there are no declarative
-	 *         insertion points.
-	 */
-	MenuInsertionPoint[] getCustomInsertionPoints();
-
-	/**
-	 * @param aPropertyName
-	 *            A property name corresponding to a configuration option from
-	 *            <b>org.eclipse.ui.navigator.viewer</b>
-	 * @return The unmodified string value returned from the extension (<b>null</b>
-	 *         is a possible return value).
-	 */
-	String getStringConfigProperty(String aPropertyName);
-
-	/**
-	 * @param aPropertyName
-	 *            A property name corresponding to a configuration option from
-	 *            <b>org.eclipse.ui.navigator.viewer</b>
-	 * @return The boolean value returned from the extension (<b>null</b> is a
-	 *         possible return value).
-	 */
-	boolean getBooleanConfigProperty(String aPropertyName);
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IPipelinedTreeContentProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IPipelinedTreeContentProvider.java
deleted file mode 100644
index dbd9c89..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/IPipelinedTreeContentProvider.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-import java.util.Set;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-
-/**
- * 
- * A pipelined content provider allows an extension to reshape the contributions
- * of an upstream content extension.
- * 
- * <p>
- * An "upstream" extension is either:
- * <ul>
- * <li> the extension overridden by this extension using the
- * <b>org.eclipse.ui.navigatorContent/navigatorContent/override</b> element, or
- * </li>
- * <li>another extension that overrides the same extension this extension
- * overrides, but with higher priority than this extension. </li>
- * </ul>
- * </p>
- * <p>
- * Overridden extensions form a tree where the nodes of the tree represent the
- * content extensions, children represent overridding extensions, and the
- * children are sorted by priority. Pipeline contributions traverse the tree,
- * allowing children to override the contributions of their parent, giving
- * precedence to the children of highest priority.
- * </p> 
- * 
- * <p>
- * Clients may (but are not required to) implement this interface if there is no
- * cause to do so. {@link ITreeContentProvider} is respected by the Common
- * Navigator.
- * </p>
- * 
- * @see INavigatorPipelineService
- * @see INavigatorContentService#getPipelineService()
- * @since 3.2
- * 
- */
-public interface IPipelinedTreeContentProvider extends ICommonContentProvider {
-
-	/**
-	 * Intercept the children that would be contributed to the viewer and
-	 * determine how to change the shape of those children. The set of children
-	 * should be modified to contain the correct children to return to the
-	 * viewer.
-	 * 
-	 * 
-	 * @param aParent
-	 *            A parent from the viewer
-	 * @param theCurrentChildren
-	 *            The set of children contributed thus far from upstream content
-	 *            providers.
-	 */
-	void getPipelinedChildren(Object aParent, Set theCurrentChildren);
-
-	/**
-	 * Intercept the elements that would be contributed to the root of the
-	 * viewer and determine how to change the shape of those children. The given
-	 * set of elements should be modified to contain the correct elements to
-	 * return to the viewer.
-	 * 
-	 * @param anInput
-	 *            An input from the viewer
-	 * @param theCurrentElements
-	 *            The set of children contributed thus far from upstream content
-	 *            providers.
-	 */
-	void getPipelinedElements(Object anInput, Set theCurrentElements);
-
-	/**
-	 * Intercept requests for a parent of the given object.
-	 * 
-	 * @param anObject
-	 *            The object being queried for a parent.
-	 * @param aSuggestedParent
-	 *            The parent already suggested from upstream extensions.
-	 * @return The intended parent from this pipelined content provider.
-	 */
-	Object getPipelinedParent(Object anObject, Object aSuggestedParent);
-
-	/**
-	 * Intercept attempts to add elements directly to the viewer.
-	 * 
-	 * <p>
-	 * For content extensions that reshape the structure of children in a
-	 * viewer, their overridden extensions may sometimes use optimized refreshes
-	 * to add elements to the tree. These attempts must be intercepted and
-	 * mapped to the correct set of model elements in the overridding extension.
-	 * Clients may add, remove, or modify elements in the given set of added
-	 * children. Clients should return a set for downstream extensions to
-	 * massage further. 
-	 * </p>
-	 * <p>
-	 * Clients may change what parent the reshaped elements are added to, so
-	 * long as that parent is not the root of the viewer.
-	 * </p>
-	 * <p>
-	 * Clients should never create their own pipeline shape
-	 * modifications, but instead return the shape modification that was passed
-	 * in with appropriate changes.
-	 * </p>
-	 * <p>
-	 * <b>Clients should not call any of the add, remove, refresh, or update
-	 * methods on the viewer from this method or any code invoked by the
-	 * implementation of this method.</b>
-	 * </p>
-	 * 
-	 * @param anAddModification
-	 *            The shape modification which contains the current suggested
-	 *            parent and children. Clients may modify this parameter
-	 *            directly and return it as the new shape modification.
-	 * @return The new shape modification to use. Clients should <b>never</b>
-	 *         return <b>null</b> from this method.
-	 */
-	PipelinedShapeModification interceptAdd(
-			PipelinedShapeModification anAddModification);
-
-	/**
-	 * Intercept attempts to remove elements directly from the viewer.
-	 * 
-	 * <p>
-	 * For content extensions that reshape the structure of children in a
-	 * viewer, their overridden extensions may sometimes use optimized refreshes
-	 * to remove elements to the tree. These attempts must be intercepted and
-	 * mapped to the correct set of model elements in the overridding extension.
-	 * Clients may add, remove, or modify elements in the given set of removed
-	 * children. Clients should return a set for downstream extensions to
-	 * massage further.
-	 * </p>
-	 * <p>
-	 * The parent will be <b>null</b> for remove modifications.
-	 * <p>
-	 * Clients should never create their own pipeline shape
-	 * modifications, but instead return the shape modification that was passed
-	 * in with appropriate changes.
-	 * </p>
-	 * <p>
-	 * <b>Clients should not call any of the add, remove, refresh, or update
-	 * methods on the viewer from this method or any code invoked by the
-	 * implementation of this method.</b>
-	 * </p>
-	 * 
-	 * @param aRemoveModification
-	 *            The shape modification which contains the current suggested
-	 *            parent and children. Clients may modify this parameter
-	 *            directly and return it as the new shape modification.
-	 * @return The new shape modification to use. Clients should <b>never</b>
-	 *         return <b>null</b> from this method.
-	 */
-	PipelinedShapeModification interceptRemove(
-			PipelinedShapeModification aRemoveModification);
-
-	/**
-	 * Intercept calls to viewer <code>refresh()</code> methods.
-	 * 
-	 * <p>
-	 * Clients may modify the given update to add or remove the elements to be
-	 * refreshed. Clients may return the same instance that was passed in for
-	 * the next downstream extension.
-	 * </p>
-	 * 
-	 * <p>
-	 * <b>Clients should not call any of the add, remove, refresh, or update
-	 * methods on the viewer from this method or any code invoked by the
-	 * implementation of this method.</b>
-	 * </p>
-	 * 
-	 * @param aRefreshSynchronization
-	 *            The (current) refresh update to execute against the viewer.
-	 * @return True if the viewer update was modified.
-	 */
-	boolean interceptRefresh(PipelinedViewerUpdate aRefreshSynchronization);
-
-	/**
-	 * Intercept calls to viewer <code>update()</code> methods.
-	 * 
-	 * <p>
-	 * Clients may modify the given update to add or remove the elements to be
-	 * updated. Clients may also add or remove properties for the given targets
-	 * to optimize the refresh. Clients may return the same instance that was
-	 * passed in for the next downstream extension.
-	 * </p>
-	 * 
-	 * <p>
-	 * <b>Clients should not call any of the add, remove, refresh, or update
-	 * methods on the viewer from this method or any code invoked by the
-	 * implementation of this method.</b>
-	 * </p>
-	 * 
-	 * @param anUpdateSynchronization
-	 *            The (current) update to execute against the viewer.
-	 * @return True if the viewer update was modified.
-	 */
-	boolean interceptUpdate(PipelinedViewerUpdate anUpdateSynchronization);
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/MenuInsertionPoint.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/MenuInsertionPoint.java
deleted file mode 100644
index 589383c..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/MenuInsertionPoint.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-/**
- * A descriptive construct to relay information about a menu insertion point;
- * including the name of the insertion point and whether the item should be
- * rendered as a separator or group marker.
- * 
- * @since 3.2
- * 
- */
-public final class MenuInsertionPoint {
-	private String name;
-
-	private boolean isSeparator;
-	
-	private String toString;
-
-	/**
-	 * 
-	 * @param aName
-	 *            The name that clients will refer to when inserting items into
-	 *            the menu at this point.
-	 * @param toMakeASeparator
-	 *            A value of true will cause the point to be rendered as a
-	 *            org.eclipse.jface.action.Separator (a "bar" in the menu);
-	 *            false will cause the point to be rendered as a
-	 *            org.eclipse.jface.action.GroupMarker.
-	 */
-	public MenuInsertionPoint(String aName, boolean toMakeASeparator) {
-		name = aName;
-		isSeparator = toMakeASeparator;
-	}
-
-	/**
-	 * 
-	 * @return True if the point should be rendered as a
-	 *         org.eclipse.jface.action.Separator (a "bar" in the menu); or
-	 *         false if the point should be rendered as a
-	 *         org.eclipse.jface.action.GroupMarker.
-	 */
-	public boolean isSeparator() {
-		return isSeparator;
-	}
-
-	/**
-	 * 
-	 * @return The name that clients will refer to when inserting items into the
-	 *         menu at this point.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	public String toString() { 
-		if(toString == null) {
-			toString = "MenuInsertionPoint[name=\""+name+"\", isSeparator="+isSeparator+"]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-		return toString;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/NavigatorActionService.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/NavigatorActionService.java
deleted file mode 100644
index 8883a2f..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/NavigatorActionService.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-import org.eclipse.ui.internal.navigator.NavigatorPlugin;
-import org.eclipse.ui.internal.navigator.actions.CommonActionDescriptorManager;
-import org.eclipse.ui.internal.navigator.actions.CommonActionProviderDescriptor;
-import org.eclipse.ui.internal.navigator.extensions.CommonActionExtensionSite;
-import org.eclipse.ui.internal.navigator.extensions.SkeletonActionProvider;
-
-/**
- * <p>
- * Provides context menu items and {@link IActionBars} contributions for a particular abstract
- * viewer. The interface matches that of {@link ActionGroup} and may be used in the same manner.
- * Clients must call
- * {@link NavigatorActionService#prepareMenuForPlatformContributions(MenuManager, ISelectionProvider, boolean)}
- * when using this class to allow object or viewer contributions. The
- * <b>org.eclipse.ui.navigator.viewer/viewer/popupMenu</b> element may override whether platform
- * contributions are allowed to the menu with its <i>allowsPlatformContributions</i> attribute.
- * "Platform Contributions" are menu items that are added through the <b>org.eclipse.ui.popupMenus</b>
- * extension point.
- * </p>
- * <p>
- * A {@link CommonActionProvider} has opportunities to contribute to the context menu and
- * {@link org.eclipse.ui.IActionBars} whenever the selection in the viewer changes. Action Providers
- * are selected based on the enablement expressions of their associated content extension or their
- * own enablement expression if it is declared as a top-level &lt;actionProvider /&gt; element (of
- * the <b>org.eclipse.ui.navigator.navigatorContent</b> extension point). See the schema
- * documentation of <b>org.eclipse.ui.navigator.navigatorContent</b> for more information on how to
- * specify an Action Provider.
- * </p>
- * <p>
- * Clients that reuse this service outside of an instance of {@link CommonNavigator} must be sure
- * that {{@link #fillActionBars(IActionBars)} is called whenever the selection changes. The
- * retargetable actions for each selection could change, based on who contributed the items.
- * 
- * @since 3.2
- * 
- */
-public final class NavigatorActionService extends ActionGroup implements IMementoAware {
-
-	private static final IContributionItem[] DEFAULT_GROUPS = new IContributionItem[]{new Separator(ICommonMenuConstants.GROUP_NEW), new GroupMarker(ICommonMenuConstants.GROUP_GOTO), new GroupMarker(ICommonMenuConstants.GROUP_OPEN), new GroupMarker(ICommonMenuConstants.GROUP_OPEN_WITH), new Separator(ICommonMenuConstants.GROUP_EDIT), new GroupMarker(ICommonMenuConstants.GROUP_SHOW), new GroupMarker(ICommonMenuConstants.GROUP_REORGANIZE), new GroupMarker(ICommonMenuConstants.GROUP_PORT), new Separator(ICommonMenuConstants.GROUP_GENERATE), new Separator(ICommonMenuConstants.GROUP_SEARCH), new Separator(ICommonMenuConstants.GROUP_BUILD), new Separator(ICommonMenuConstants.GROUP_ADDITIONS), new Separator(ICommonMenuConstants.GROUP_PROPERTIES)};
-
-	private final ICommonViewerSite commonViewerSite;
-
-	private final StructuredViewer structuredViewer;
-
-	private final NavigatorContentService contentService;
-
-	private final INavigatorViewerDescriptor viewerDescriptor;
-
-	private final Set actionProviderDescriptors = new HashSet();
-
-	/*
-	 * Map of CommonActionProviderDescriptors to CommonActionProviders
-	 */
-	private final Map actionProviderInstances = new HashMap();
-
-	private IMemento memento;
-
-	private IContributionItem[] menuGroups;
-
-	private boolean disposed = false;
-
-	/**
-	 * @param aCommonViewerSite
-	 *            A site that provides information about the context for extensions.
-	 * @param aStructuredViewer
-	 *            The associated StructuredViewer. Used to initialize extensions. <b>May NOT be
-	 *            null.</b>
-	 * @param aContentService
-	 *            The associated INavigatorContentService (for extensions that coordinate behavior
-	 *            with content extensions -- either nested or top-level action providers). <b>May
-	 *            NOT be null.</b>
-	 */
-	public NavigatorActionService(ICommonViewerSite aCommonViewerSite, StructuredViewer aStructuredViewer, INavigatorContentService aContentService) {
-		super();
-		Assert.isNotNull(aCommonViewerSite);
-		Assert.isNotNull(aStructuredViewer);
-		Assert.isNotNull(aContentService);
-
-		commonViewerSite = aCommonViewerSite;
-		contentService = (NavigatorContentService) aContentService;
-		structuredViewer = aStructuredViewer;
-		viewerDescriptor = contentService.getViewerDescriptor();
-
-	}
-
-	/**
-	 * Prepares the menu for object contributions, if the option is set in the extension. The option
-	 * is controlled by the &lgt;popupMenu /&gt; element's 'allowPlatformContributions' attribute.
-	 * Clients may choose to ignore this setting by supplying a value of <b>true</b> for the
-	 * <code>force</code> attribute.
-	 * 
-	 * @param menu
-	 *            The context menu of the IViewPart
-	 * @param aSelectionProvider
-	 *            The selection provider that will supplement actions with a valid, current
-	 *            selection.
-	 * @param force
-	 *            A value of 'true' forces the menu to be registered for object/view contributions.
-	 *            Otherwise, the option from the extension point will be respected. See
-	 *            <b>org.eclipse.ui.navigator.viewer/viewer</b> for more information.
-	 */
-	public void prepareMenuForPlatformContributions(MenuManager menu, ISelectionProvider aSelectionProvider, boolean force) {
-		Assert.isTrue(!disposed);
-
-		if (commonViewerSite instanceof ICommonViewerWorkbenchSite) {
-			/*
-			 * Hooks into the Eclipse framework for Object contributions, and View contributions.
-			 */
-			if (force || viewerDescriptor.allowsPlatformContributionsToContextMenu()) {
-				((ICommonViewerWorkbenchSite) commonViewerSite).registerContextMenu(contentService.getViewerDescriptor().getPopupMenuId(), menu, aSelectionProvider);
-			}
-		}
-	}
-
-	/**
-	 * Requests that the service invoke extensions to fill the given menu with Action Providers that
-	 * are interested in elements from the given selection.
-	 * 
-	 * <p>
-	 * Object contributions (see <b>org.eclipes.ui.popupMenus</b>) may also respected by this
-	 * method if <code>toRespectObjectContributions</code> is true.
-	 * </p>
-	 * 
-	 * @param aMenu
-	 *            The menu being presented to the user.
-	 * @see ActionGroup#fillContextMenu(IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager aMenu) {
-		Assert.isTrue(!disposed);
-
-		if (menuGroups == null) {
-			createMenuGroups();
-		}
-
-		for (int i = 0; i < menuGroups.length; i++) {
-			aMenu.add(menuGroups[i]);
-		}
-
-		addCommonActionProviderMenu(aMenu);
-
-	}
-
-	private void createMenuGroups() {
-		MenuInsertionPoint[] customPoints = viewerDescriptor.getCustomInsertionPoints();
-
-		if (customPoints == null) {
-			menuGroups = DEFAULT_GROUPS;
-		} else {
-			menuGroups = new IContributionItem[customPoints.length];
-			for (int i = 0; i < customPoints.length; i++) {
-				if (customPoints[i].isSeparator()) {
-					menuGroups[i] = new Separator(customPoints[i].getName());
-				} else {
-					menuGroups[i] = new GroupMarker(customPoints[i].getName());
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param aMenu
-	 */
-	private void addCommonActionProviderMenu(IMenuManager aMenu) {
-
-		CommonActionProviderDescriptor[] providerDescriptors = CommonActionDescriptorManager.getInstance().findRelevantActionDescriptors(contentService, getContext());
-		if (providerDescriptors.length > 0) {
-			CommonActionProvider provider = null;
-			for (int i = 0; i < providerDescriptors.length; i++) {
-				try {
-					provider = getActionProviderInstance(providerDescriptors[i]);
-					provider.setContext(getContext());
-					provider.fillContextMenu(aMenu);
-				} catch (Throwable t) {
-					NavigatorPlugin.logError(0, t.getMessage(), t);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Request that the service invoke extensions to fill the given IActionBars with retargetable
-	 * actions or view menu contributions from Action Providers that are interested in the given
-	 * selection.
-	 * 
-	 * @param theActionBars
-	 *            The action bars in use by the current view site.
-	 * @see ActionGroup#fillActionBars(IActionBars)
-	 */
-	public void fillActionBars(IActionBars theActionBars) {
-		Assert.isTrue(!disposed);
-
-		theActionBars.clearGlobalActionHandlers();
-		ActionContext context = getContext();
-		if (context == null) {
-			context = new ActionContext(StructuredSelection.EMPTY);
-		}
-
-		CommonActionProviderDescriptor[] providerDescriptors = CommonActionDescriptorManager.getInstance().findRelevantActionDescriptors(contentService, context);
-		if (providerDescriptors.length > 0) {
-			CommonActionProvider provider = null;
-			for (int i = 0; i < providerDescriptors.length; i++) {
-				try {
-					provider = getActionProviderInstance(providerDescriptors[i]);
-					if(provider != null) {
-						provider.setContext(context);
-						provider.fillActionBars(theActionBars);
-						provider.updateActionBars();
-					}
-
-				} catch (RuntimeException e) {
-					NavigatorPlugin.logError(0, e.getMessage(), e);
-				}
-			}
-		}
-		theActionBars.updateActionBars();
-		theActionBars.getMenuManager().update();
-	}
-
-	/**
-	 * Dispose of any state or resources held by the service.
-	 * 
-	 * @see ActionGroup#dispose()
-	 */
-	public void dispose() {
-		synchronized (actionProviderInstances) {
-			for (Iterator iter = actionProviderInstances.values().iterator(); iter.hasNext();) {
-				CommonActionProvider element = (CommonActionProvider) iter.next();
-				element.dispose();
-			}
-			actionProviderInstances.clear();
-		}
-		actionProviderDescriptors.clear();
-		disposed = false;
-	}
-
-	/**
-	 * Use the given memento to restore the state of each Action Provider as it is initialized.
-	 * 
-	 * @param aMemento
-	 *            The memento retrieved from the dialog settings
-	 */
-	public void restoreState(IMemento aMemento) {
-		Assert.isTrue(!disposed);
-		memento = aMemento;
-
-		synchronized (actionProviderInstances) {
-			for (Iterator actionProviderIterator = actionProviderInstances.values().iterator(); actionProviderIterator.hasNext();) {
-				final CommonActionProvider provider = (CommonActionProvider) actionProviderIterator.next();
-				ISafeRunnable runnable = new ISafeRunnable() {
-					public void run() throws Exception {
-						provider.restoreState(memento);
-					}
-
-					public void handleException(Throwable exception) {
-						NavigatorPlugin.logError(0, "Could not restore state for action provider " + provider.getClass(), exception); //$NON-NLS-1$
-
-					}
-				};
-				SafeRunner.run(runnable);
-
-			}
-		}
-	}
-
-	/**
-	 * Request that Action Providers save any state that they find interesting.
-	 * 
-	 * @param aMemento
-	 *            The memento retrieved from the dialog settings
-	 */
-	public void saveState(IMemento aMemento) {
-		Assert.isTrue(!disposed);
-
-		memento = aMemento;
-		CommonActionProvider provider = null;
-		synchronized (actionProviderInstances) {
-			for (Iterator actionProviderIterator = actionProviderInstances.values().iterator(); actionProviderIterator.hasNext();) {
-				provider = (CommonActionProvider) actionProviderIterator.next();
-				provider.saveState(memento);
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @param aProviderDescriptor
-	 * @return a CommonActionProvider
-	 * @noreference This method is not intended to be referenced by clients.
-	 */
-	public CommonActionProvider getActionProviderInstance(
-			CommonActionProviderDescriptor aProviderDescriptor) {
-		CommonActionProvider provider = null;
-		try {
-			provider = (CommonActionProvider) actionProviderInstances
-					.get(aProviderDescriptor);
-			if (provider != null) {
-				return provider;
-			}
-			synchronized (actionProviderInstances) {
-				provider = (CommonActionProvider) actionProviderInstances
-						.get(aProviderDescriptor);
-				if (provider == null) {
-					provider = aProviderDescriptor.createActionProvider();
-					if (provider != null) {
-						actionProviderInstances.put(aProviderDescriptor, provider);
-						initialize(aProviderDescriptor.getId(), provider);
-					} else {
-						actionProviderInstances.put(aProviderDescriptor,
-								(provider = SkeletonActionProvider.INSTANCE));
-					}
-				}
-			}
-		} catch(Throwable t) {
-			NavigatorPlugin.logError(0, t.getMessage(), t);
-		}
-		return provider;
-	}
-
-	private void initialize(String id, CommonActionProvider anActionProvider) {
-		if (anActionProvider != null && anActionProvider != SkeletonActionProvider.INSTANCE) {
-			ICommonActionExtensionSite configuration = new CommonActionExtensionSite(id, commonViewerSite, contentService, structuredViewer);
-			anActionProvider.init(configuration);
-			anActionProvider.restoreState(memento);
-			anActionProvider.setContext(new ActionContext(StructuredSelection.EMPTY));
-			if (commonViewerSite instanceof ICommonViewerWorkbenchSite) {
-				anActionProvider.fillActionBars(((ICommonViewerWorkbenchSite) commonViewerSite).getActionBars());
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/NavigatorContentServiceFactory.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/NavigatorContentServiceFactory.java
deleted file mode 100644
index fb39881..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/NavigatorContentServiceFactory.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-
-
-/**
- * Provides a factory pattern for creating {@link INavigatorContentService}s 
- * for given viewer ids.  
- * 
- * <p>
- * Clients may supply the viewer in {@link #createContentService(String, StructuredViewer) }
- * or wait until the content provider is created by the service 
- * and set on the viewer. When the content provider is set, the 
- * viewer will call inputChanged(), and the content service
- * will update its managed viewer accordingly. Therefore, each
- * content service should be attached to at most one viewer. 
- * </p>
- *  
- * @since 3.2  
- *
- */
-public final class NavigatorContentServiceFactory {
-	
-	/**
-	 * The singleton instance for creating NavigatorContentServices. 
-	 */
-	public static final NavigatorContentServiceFactory INSTANCE = new NavigatorContentServiceFactory(); 
-	
-	
-	/**
-	 * Returns an instance of INavigatorContentService configured 
-	 * for the given id. Instances are not shared for the same 
-	 * viewerId. 
-	 * 
-	 * @param aViewerId The viewer id of interest
-	 * @return An instance of INavigatorContentService configured for the given id. 
-	 */
-	public INavigatorContentService createContentService(String aViewerId) { 
-		return createContentService(aViewerId, null);
-	}
-	
-	/**
-	 * Returns an instance of INavigatorContentService configured 
-	 * for the given id. Instances are not shared for the same 
-	 * viewerId. 
-	 * 
-	 * @param aViewerId The viewer id of interest
-	 * @param aViewer The content service can use the given viewer to initialize content providers 
-	 * @return An instance of INavigatorContentService configured for the given id. 
-	 * @see IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, Object, Object)
-	 */
-	public INavigatorContentService createContentService(String aViewerId, StructuredViewer aViewer) {
-		if(aViewer == null) {
-			return new NavigatorContentService(aViewerId);
-		}
-		return new NavigatorContentService(aViewerId, aViewer);
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/OverridePolicy.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/OverridePolicy.java
deleted file mode 100755
index 454f6c0..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/OverridePolicy.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-/**
- * <p>
- * Enumeration of the OverridePolicy values supported by the Common Navigator.
- * </p>
- * 
- * @since 3.4
- */
-public final class OverridePolicy {
-
-	/**
-	 * Indicates InvokeOnlyIfSuppressedExtAlsoVisibleAndActive OverridePolicy as
-	 * an int.
-	 */
-	public static final int InvokeOnlyIfSuppressedExtAlsoVisibleAndActive_VALUE = -1;
-
-	/**
-	 * Indicates InvokeAlwaysRegardlessOfSuppressedExt OverridePolicy as an int.
-	 */
-	public static final int InvokeAlwaysRegardlessOfSuppressedExt_VALUE = 1;
-
-	/**
-	 * Indicates InvokeOnlyIfSuppressedExtAlsoVisibleAndActive OverridePolicy as
-	 * a String.
-	 */
-	public static final String InvokeOnlyIfSuppressedExtAlsoVisibleAndActive_LITERAL = "InvokeOnlyIfSuppressedExtAlsoVisibleAndActive"; //$NON-NLS-1$
-
-	/**
-	 * Indicates InvokeAlwaysRegardlessOfSuppressedExt OverridePolicy as a
-	 * String.
-	 */
-	public static final String InvokeAlwaysRegardlessOfSuppressedExt_LITERAL = "InvokeAlwaysRegardlessOfSuppressedExt"; //$NON-NLS-1$
-
-	/**
-	 * Indicates InvokeOnlyIfSuppressedExtAlsoVisibleAndActive OverridePolicy as
-	 * a OverridePolicy enumeration.
-	 */
-	public static final OverridePolicy InvokeOnlyIfSuppressedExtAlsoVisibleAndActive = new OverridePolicy(
-			InvokeOnlyIfSuppressedExtAlsoVisibleAndActive_VALUE,
-			InvokeOnlyIfSuppressedExtAlsoVisibleAndActive_LITERAL);
-
-	/**
-	 * Indicates InvokeAlwaysRegardlessOfSuppressedExt OverridePolicy as a
-	 * OverridePolicy enumeration.
-	 */
-	public static final OverridePolicy InvokeAlwaysRegardlessOfSuppressedExt = new OverridePolicy(
-			InvokeAlwaysRegardlessOfSuppressedExt_VALUE,
-			InvokeAlwaysRegardlessOfSuppressedExt_LITERAL);
-
-	/**
-	 * The ordered array of possible enumeration values.
-	 */
-	public static final OverridePolicy[] ENUM_ARRAY = new OverridePolicy[] {
-			InvokeOnlyIfSuppressedExtAlsoVisibleAndActive,
-			InvokeAlwaysRegardlessOfSuppressedExt };
-
-	/**
-	 * 
-	 * Returns the correct instance of the OverridePolicy ENUM for aLiteral.
-	 * 
-	 * <p>
-	 * This method will return InvokeAlwaysRegardlessOfSuppressedExt if the
-	 * supplied value of aLiteral is invalid.
-	 * </p>
-	 * 
-	 * @param aLiteral
-	 *            One of the defined *_LITERAL constants of this class
-	 * @return The corresponding OverridePolicy Enum or
-	 *         InvokeAlwaysRegardlessOfSuppressedExt if aLiteral is invalid
-	 */
-	public static OverridePolicy get(String aLiteral) {
-		for (int i = 0; i < ENUM_ARRAY.length; i++) {
-			if (ENUM_ARRAY[i].getLiteral().equals(aLiteral)) {
-				return ENUM_ARRAY[i];
-			}
-		}
-		return InvokeAlwaysRegardlessOfSuppressedExt;
-	}
-
-	/**
-	 * 
-	 * Returns the correct instance of the OverridePolicy ENUM for aValue.
-	 * 
-	 * <p>
-	 * This method will return InvokeAlwaysRegardlessOfSuppressedExt if the
-	 * supplied value of aValue is invalid.
-	 * </p>
-	 * 
-	 * @param aValue
-	 *            One of the defined *_VALUE constants of this class
-	 * @return The corresponding OverridePolicy Enum or
-	 *         InvokeAlwaysRegardlessOfSuppressedExt if aValue is invalid
-	 */
-	public static OverridePolicy get(int aValue) {
-
-		switch (aValue) {
-		case InvokeOnlyIfSuppressedExtAlsoVisibleAndActive_VALUE:
-			return InvokeOnlyIfSuppressedExtAlsoVisibleAndActive;
-		case InvokeAlwaysRegardlessOfSuppressedExt_VALUE:
-		default:
-			return InvokeAlwaysRegardlessOfSuppressedExt;
-
-		}
-	}
-
-	private final int value;
-
-	private final String literal;
-
-	protected OverridePolicy(int aValue, String aLiteral) {
-		value = aValue;
-		literal = aLiteral;
-	}
-
-	/**
-	 * 
-	 * @return The literal string for this specific OverridePolicy.
-	 */
-	public String getLiteral() {
-		return literal;
-	}
-
-	/**
-	 * 
-	 * @return The integer value for this specific OverridePolicy.
-	 */
-	public int getValue() {
-		return value;
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/PipelinedShapeModification.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/PipelinedShapeModification.java
deleted file mode 100644
index 61afd34..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/PipelinedShapeModification.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-import java.util.Set;
-
-/**
- * 
- * Indicates how a shape modification should be transformed when applied to the
- * tree. Clients use {@link PipelinedShapeModification} as the input and return
- * type from intercept methods on {@link IPipelinedTreeContentProvider}.
- * 
- * <p>
- * Overridding extensions should use these to map attempts to directly modify
- * the tree down to the overridden model. A shape modification can either be an
- * <i>add</i> or <i>remove</i> shape modification, and the type is determined
- * by the context of its use. If supplied to an <code>interceptRemove</code>
- * method, then it is a remove shape modification, otherwise if supplied to an
- * <code>interceptAdd</code> method, then it is an add shape modification.
- * </p>
- *  
- * 
- * @since 3.2
- * 
- */
-public final class PipelinedShapeModification {
-
-	private Object parent;
-
-	private final Set children;
-
-	/**
-	 * Create a shape modification. The given parent and children will be set as
-	 * the initial values for the shape modification.
-	 * 
-	 * @param aParent
-	 *            The parent for the add or remove call to the tree.
-	 * @param theChildren
-	 *            The children that should be added or removed from the tree.
-	 */
-	public PipelinedShapeModification(Object aParent, Set theChildren) {
-		parent = aParent;
-		children = theChildren;
-	}
-
-	/**
-	 * 
-	 * @return The parent to use for the shape modification.
-	 */
-	public final Object getParent() {
-		return parent;
-	}
-
-	/**
-	 * 
-	 * @param aParent
-	 *            The parent to use for the shape modification.
-	 */
-	public final void setParent(Object aParent) {
-		parent = aParent;
-	}
-
-	/**
-	 * 
-	 * @return The current set of children. Clients may add or remove elements
-	 *         directly to this set.
-	 */
-	public final Set getChildren() {
-		return children;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/PipelinedViewerUpdate.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/PipelinedViewerUpdate.java
deleted file mode 100644
index 3b194f9..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/PipelinedViewerUpdate.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-
-/**
- * 
- * A pipelined viewer update should map requests to refresh or update elements
- * in the viewer to their correct, modified structure. Clients use
- * {@link PipelinedViewerUpdate} as the input and return type from intercept
- * methods on {@link IPipelinedTreeContentProvider}.
- * 
- * <p>
- * Clients should use the viewer update to describe how the request from the
- * upstream extension (see {@link IPipelinedTreeContentProvider} for more
- * information on <i>upstream</i> extensions) should be reshaped when applied
- * to the tree. A request from an upstream extension to refresh a given element
- * could result in multiple refresh requests from downstream extensions.
- * Therefore, the refresh targets are modeled as a set.
- * </p>
- * <p>
- * Initially, this set will contain the original element that was passed to the
- * refresh requests. Clients may squash the refresh by clearing the set, change
- * the original target by removing the current element and adding a new target,
- * or expand the refresh by adding more elements to the set.
- * </p>
- * <p>
- * A pipelined extension may receive a {@link PipelinedViewerUpdate} as the
- * result of a call to {@link AbstractTreeViewer#refresh()}-methods or
- * {@link AbstractTreeViewer#update(Object, String[])}-methods. The
- * <code>properties</code> field is only applicable for <code>update()</code>
- * calls and the <code>updateLabels</code> field is only applicable for
- * <code>refresh()</code> calls.
- * </p>
- *  
- * @since 3.2
- * 
- */
-public final class PipelinedViewerUpdate {
-
-	private static final String[] NO_PROPERTIES = new String[0];
-
-	private final Set refreshTargets = new LinkedHashSet();
-
-	private boolean updateLabels = false;
-
-	private Map properties;
-
-	/**
-	 * Properties allow optimization for <code>update</code> calls.
-	 * 
-	 * @param aTarget
-	 *            The target which may have specific properties associated with
-	 *            it for an optimized refresh.
-	 * 
-	 * @return Returns the properties for the given target. If no properties are
-	 *         specified, then an empty array is returned. <b>null</b> will
-	 *         never be returned.
-	 */
-	public final String[] getProperties(Object aTarget) {
-		if (properties != null && properties.containsKey(aTarget)) {
-			String[] props = (String[]) properties.get(aTarget);
-			return props != null ? props : NO_PROPERTIES;
-		}
-		return NO_PROPERTIES;
-	}
-
-	/**
-	 * 
-	 * Properties allow optimization for <code>update</code> calls.
-	 * 
-	 * @param aTarget
-	 *            The target of the properties.
-	 * @param theProperties
-	 *            The properties to pass along to the <code>update</code>
-	 *            call.
-	 * @see AbstractTreeViewer#update(Object, String[])
-	 */
-	public final void setProperties(Object aTarget, String[] theProperties) {
-		if (theProperties != null && theProperties.length > 0) {
-			if (properties == null) {
-				properties = new HashMap();
-			}
-			properties.put(aTarget, theProperties);
-
-		} else {
-			properties.remove(aTarget);
-		}
-
-		if (properties.size() == 0) {
-			properties = null;
-		}
-
-	}
-
-	/**
-	 * @return Returns the current set of refresh targets. Clients may add or
-	 *         remove directly to or from this set.
-	 */
-	public final Set getRefreshTargets() {
-		return refreshTargets;
-	}
-
-	/**
-	 * @return Returns the true if the labels should also be updated during the
-	 *         <code>refresh</code>.
-	 */
-	public final boolean isUpdateLabels() {
-		return updateLabels;
-	}
-
-	/**
-	 * @param toUpdateLabels
-	 *            True indicates that calls to <code>refresh</code> should
-	 *            force the update of the labels in addition to refreshing the
-	 *            structure.
-	 */
-	public final void setUpdateLabels(boolean toUpdateLabels) {
-		updateLabels = toUpdateLabels;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/Priority.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/Priority.java
deleted file mode 100644
index 61164db..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/Priority.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-/**
- * <p>
- * Enumeration of the Priority values supported by the Common Navigator.
- * </p>
- *  
- * @since 3.2
- */
-public final class Priority {
-
-	/**
-	 * Indicates Highest priority as an int.
-	 */
-	public static final int HIGHEST_PRIORITY_VALUE = 0;
-
-	/**
-	 * Indicates Higher priority as an int.
-	 */
-	public static final int HIGHER_PRIORITY_VALUE = 1;
-
-	/**
-	 * Indicates High priority as an int.
-	 */
-	public static final int HIGH_PRIORITY_VALUE = 2;
-
-	/**
-	 * Indicates Normal priority as an int.
-	 */
-	public static final int NORMAL_PRIORITY_VALUE = 3;
-
-	/**
-	 * Indicates Low priority as an int.
-	 */
-	public static final int LOW_PRIORITY_VALUE = 4;
-
-	/**
-	 * Indicates Lower priority as an int.
-	 */
-	public static final int LOWER_PRIORITY_VALUE = 5;
-
-	/**
-	 * Indicates Lowest priority as an int.
-	 */
-	public static final int LOWEST_PRIORITY_VALUE = 6;
-
-	/**
-	 * Indicates Highest priority as a String.
-	 */
-	public static final String HIGHEST_PRIORITY_LITERAL = "highest"; //$NON-NLS-1$
-
-	/**
-	 * Indicates Higher priority as a String.
-	 */
-	public static final String HIGHER_PRIORITY_LITERAL = "higher"; //$NON-NLS-1$
-
-	/**
-	 * Indicates High priority as a String.
-	 */
-	public static final String HIGH_PRIORITY_LITERAL = "high"; //$NON-NLS-1$
-
-	/**
-	 * Indicates Normal priority as a String.
-	 */
-	public static final String NORMAL_PRIORITY_LITERAL = "normal"; //$NON-NLS-1$
-
-	/**
-	 * Indicates Low priority as a String.
-	 */
-	public static final String LOW_PRIORITY_LITERAL = "low"; //$NON-NLS-1$
-
-	/**
-	 * Indicates Lower priority as a String.
-	 */
-	public static final String LOWER_PRIORITY_LITERAL = "lower"; //$NON-NLS-1$
-
-	/**
-	 * Indicates Lowest priority as a String.
-	 */
-	public static final String LOWEST_PRIORITY_LITERAL = "lowest"; //$NON-NLS-1$
-
-	/**
-	 * Indicates Highest priority as a Priority enumeration.
-	 */
-	public static final Priority HIGHEST = new Priority(HIGHEST_PRIORITY_VALUE,
-			HIGHEST_PRIORITY_LITERAL);
-
-	/**
-	 * Indicates Higher priority as a Priority enumeration.
-	 */
-	public static final Priority HIGHER = new Priority(HIGHER_PRIORITY_VALUE,
-			HIGHER_PRIORITY_LITERAL);
-
-	/**
-	 * Indicates High priority as a Priority enumeration.
-	 */
-	public static final Priority HIGH = new Priority(HIGH_PRIORITY_VALUE,
-			HIGH_PRIORITY_LITERAL);
-
-	/**
-	 * Indicates Normal priority as a Priority enumeration.
-	 */
-	public static final Priority NORMAL = new Priority(NORMAL_PRIORITY_VALUE,
-			NORMAL_PRIORITY_LITERAL);
-
-	/**
-	 * Indicates Low priority as a Priority enumeration.
-	 */
-	public static final Priority LOW = new Priority(LOW_PRIORITY_VALUE,
-			LOW_PRIORITY_LITERAL);
-
-	/**
-	 * Indicates Lower priority as a Priority enumeration.
-	 */
-	public static final Priority LOWER = new Priority(LOWER_PRIORITY_VALUE,
-			LOWER_PRIORITY_LITERAL);
-
-	/**
-	 * Indicates Lowest priority as a Priority enumeration.
-	 */
-	public static final Priority LOWEST = new Priority(LOWEST_PRIORITY_VALUE,
-			LOWEST_PRIORITY_LITERAL);
-
-	/**
-	 * The ordered array of possible enumeration values (0=> Highest,
-	 * length-1=>Lowest)
-	 */
-	public static final Priority[] ENUM_ARRAY = new Priority[] { HIGHEST,
-			HIGHER, HIGH, NORMAL, LOW, LOWER, LOWEST };
-
-	/**
-	 * 
-	 * Returns the correct instance of the Priority ENUM for aLiteral.
-	 * 
-	 * <p>
-	 * This method will return NORMAL if the supplied value of aLiteral is
-	 * invalid.
-	 * </p>
-	 * 
-	 * @param aLiteral
-	 *            One of the defined *_LITERAL constants of this class
-	 * @return The corresponding Priority Enum or NORMAL if aLiteral is invalid
-	 */
-	public static Priority get(String aLiteral) {
-		for (int i = 0; i < ENUM_ARRAY.length; i++) {
-			if (ENUM_ARRAY[i].getLiteral().equals(aLiteral)) {
-				return ENUM_ARRAY[i];
-			}
-		}
-		return NORMAL;
-	}
-
-	/**
-	 * 
-	 * Returns the correct instance of the Priority ENUM for aValue.
-	 * 
-	 * <p>
-	 * This method will return NORMAL if the supplied value of aValue is
-	 * invalid.
-	 * </p>
-	 * 
-	 * @param aValue
-	 *            One of the defined *_VALUE constants of this class
-	 * @return The corresponding Priority Enum or NORMAL if aValue is invalid
-	 */
-	public static Priority get(int aValue) {
-
-		switch (aValue) {
-		case HIGHEST_PRIORITY_VALUE:
-			return HIGHEST;
-		case HIGHER_PRIORITY_VALUE:
-			return HIGHER;
-		case HIGH_PRIORITY_VALUE:
-			return HIGH;
-		case LOWER_PRIORITY_VALUE:
-			return LOWER;
-		case LOWEST_PRIORITY_VALUE:
-			return LOWEST;
-		case NORMAL_PRIORITY_VALUE:
-		default:
-			return NORMAL;
-		}
-	}
-
-	private final int value;
-
-	private final String literal;
-
-	protected Priority(int aValue, String aLiteral) {
-		value = aValue;
-		literal = aLiteral;
-	}
-
-	/**
-	 * 
-	 * @return The literal string for this specific Priority.
-	 */
-	public String getLiteral() {
-		return literal;
-	}
-
-	/**
-	 * 0 is the lowest priority; 7 is the highest.
-	 * 
-	 * @return The integer value for this specific Priority. 
-	 */
-	public int getValue() {
-		return value;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "Priority ["+getLiteral()+"]";  //$NON-NLS-1$//$NON-NLS-2$
-	}
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/SaveablesProvider.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/SaveablesProvider.java
deleted file mode 100644
index 10c2034..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/SaveablesProvider.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.navigator;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.ui.ISaveablesLifecycleListener;
-import org.eclipse.ui.Saveable;
-import org.eclipse.ui.SaveablesLifecycleEvent;
-import org.eclipse.ui.services.IDisposable;
-
-/**
- * Provides {@link Saveable} objects to the common navigator, and allows to map
- * between elements in the tree and models.
- * <p>
- * This class is intended to be subclassed by clients.
- * </p>
- * Instances of subclasses will be returned from content extensions that
- * implement {@link IAdaptable}.
- * 
- * @since 3.2
- * 
- */
-public abstract class SaveablesProvider implements IDisposable {
-
-	private ISaveablesLifecycleListener listener;
-
-	/**
-	 * Creates a new saveable model provider. May only be called by subclasses.
-	 * 
-	 */
-	protected SaveablesProvider() {
-	}
-
-	/**
-	 * Initializes this SaveablesProvider with the given listener, and calls the hook method doInit().
-	 * 
-	 * @param listener
-	 */
-	final public void init(ISaveablesLifecycleListener listener) {
-		this.listener = listener;
-		doInit();
-	}
-
-	/**
-	 * May be overridden by clients. The default implementation does nothing.
-	 */
-	protected void doInit() {
-	}
-
-	/**
-	 * Notifies the listener that the given models were opened in this model
-	 * provider. This method must be called on the UI thread.
-	 * 
-	 * @param models
-	 */
-	final protected void fireSaveablesOpened(Saveable[] models) {
-		listener.handleLifecycleEvent(new SaveablesLifecycleEvent(this,
-				SaveablesLifecycleEvent.POST_OPEN, models, false));
-	}
-
-	/**
-	 * Notifies the listener that the given models are about to be closed in
-	 * this model provider. This method must be called on the UI thread.
-	 * 
-	 * @param models
-	 * @param force
-	 *            true if the closing may be canceled by the user
-	 * @return true if the listener vetoed the closing (may be ignored if force
-	 *         is true)
-	 */
-	final protected boolean fireSaveablesClosing(Saveable[] models,
-			boolean force) {
-		SaveablesLifecycleEvent saveablesLifecycleEvent = new SaveablesLifecycleEvent(
-				this, SaveablesLifecycleEvent.PRE_CLOSE, models, force);
-		listener.handleLifecycleEvent(saveablesLifecycleEvent);
-		return saveablesLifecycleEvent.isVeto();
-	}
-
-	/**
-	 * Notifies the listener that the given models were closed in this model
-	 * provider. This method must be called on the UI thread.
-	 * 
-	 * @param models
-	 */
-	final protected void fireSaveablesClosed(Saveable[] models) {
-		listener.handleLifecycleEvent(new SaveablesLifecycleEvent(this,
-				SaveablesLifecycleEvent.POST_CLOSE, models, false));
-	}
-
-	/**
-	 * Notifies the listener that the given models' dirty state has changed.
-	 * This method must be called on the UI thread.
-	 * 
-	 * @param models
-	 */
-	final protected void fireSaveablesDirtyChanged(Saveable[] models) {
-		listener.handleLifecycleEvent(new SaveablesLifecycleEvent(this,
-				SaveablesLifecycleEvent.DIRTY_CHANGED, models, false));
-	}
-
-	/**
-	 * Returns the saveables reachable through this provider. Changes to the
-	 * list of saveables or to the saveables' dirty state must be announced
-	 * using the appropriate fire* methods.
-	 * 
-	 * @return the saveables returned by this saveables provider.
-	 */
-	public abstract Saveable[] getSaveables();
-
-	/**
-	 * Returns the elements representing the given saveable. It is recommended
-	 * that a saveable be represented by only one element.
-	 * 
-	 * @param saveable
-	 * @return the elements representing the given saveable (array may be empty)
-	 */
-	public abstract Object[] getElements(Saveable saveable);
-
-	/**
-	 * Returns the saveable for the given element, or null if the element does
-	 * not represent a saveable.
-	 * 
-	 * @param element
-	 * @return the saveable for the given element, or null
-	 */
-	public abstract Saveable getSaveable(Object element);
-
-	/**
-	 * Disposes of this saveables provider. Subclasses may extend, but must call
-	 * the super implementation.
-	 */
-	public void dispose() {
-		listener = null;
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/WizardActionGroup.java b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/WizardActionGroup.java
deleted file mode 100644
index ed37a43..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/WizardActionGroup.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.navigator;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.ui.internal.navigator.wizards.CommonWizardDescriptor;
-import org.eclipse.ui.internal.navigator.wizards.CommonWizardDescriptorManager;
-import org.eclipse.ui.internal.navigator.wizards.WizardShortcutAction;
-import org.eclipse.ui.wizards.IWizardDescriptor;
-import org.eclipse.ui.wizards.IWizardRegistry;
-
-/**
- * 
- * Populates context menus with shortcut actions for defined wizards. Wizards
- * may be defined by any of the following extension points:
- * <p>
- * <ul>
- * <li><b>org.eclipse.ui.newWizards</b></li>
- * <li><b>org.eclipse.ui.importWizards</b></li>
- * <li><b>org.eclipse.ui.exportWizards</b></li>
- * </ul>
- * </p>
- * <p>
- * Here are the required steps for using this feature correctly:
- * <ol>
- * <li>Declare all new/import/export wizards from the extension points above,
- * or locate the existing wizards that you intend to reuse.</li>
- * <li>Declare <b>org.eclipse.ui.navigator.navigatorContent/commonWizard</b>
- * elements to identify which wizards should be associated with what items in
- * your viewer or navigator.</li>
- * <li>If you are using Resources in your viewer and have bound the resource
- * extension declared in <b>org.eclipse.ui.navigator.resources</b>, then you
- * will get most of this functionality for free.</li>
- * <li>Otherwise, you may choose to build your own custom menu. In which case,
- * you may instantiate this class, and hand it the menu or submenu that you want
- * to list out the available wizard shortcuts via
- * {@link WizardActionGroup#fillContextMenu(IMenuManager)}.</li>
- * </ol>
- * </p>
- * <p>
- * Clients may instantiate, but not subclass WizardActionGroup.
- * </p>
- * 
- * @see PlatformUI#getWorkbench()
- * @see IWorkbench#getNewWizardRegistry()
- * @see IWorkbench#getImportWizardRegistry()
- * @see IWorkbench#getExportWizardRegistry()
- * @since 3.2
- * 
- */
-public final class WizardActionGroup extends ActionGroup {
-
-	/**
-	 * The type for commonWizard extensions with the value "new" for their type
-	 * attribute.
-	 */
-	public static final String TYPE_NEW = "new"; //$NON-NLS-1$
-
-	/**
-	 * The type for commonWizard extensions with the value "new" for their type
-	 * attribute.
-	 */
-	public static final String TYPE_IMPORT = "import"; //$NON-NLS-1$
-
-	/**
-	 * The type for commonWizard extensions with the value "new" for their type
-	 * attribute.
-	 */
-	public static final String TYPE_EXPORT = "export"; //$NON-NLS-1$
-
-	private static final CommonWizardDescriptor[] NO_DESCRIPTORS = new CommonWizardDescriptor[0];
-	
-	private static final String[] NO_IDS = new String[0];  
-	
-	private CommonWizardDescriptor[] descriptors;
-
-	/* a map of (id, IAction)-pairs. */
-	private Map actions;
-
-	/*
-	 * the window is passed to created WizardShortcutActions for the shell and
-	 * selection service.
-	 */
-	private IWorkbenchWindow window;
-
-	/* the correct wizard registry for this action group (getRegistry()) */
-	private IWizardRegistry wizardRegistry; 
-
-	private boolean disposed = false;
-
-	private String type;
-
-	private INavigatorContentService contentService;
-
-	/**
-	 * 
-	 * @param aWindow
-	 *            The window that will be used to acquire a Shell and a
-	 *            Selection Service
-	 * @param aWizardRegistry
-	 *            The wizard registry will be used to locate the correct wizard
-	 *            descriptions.
-	 * @param aType
-	 *            Indicates the value of the type attribute of the commonWizard
-	 *            extension point. Use any of the TYPE_XXX constants defined on
-	 *            this class.
-	 * @see PlatformUI#getWorkbench()
-	 * @see IWorkbench#getNewWizardRegistry()
-	 * @see IWorkbench#getImportWizardRegistry()
-	 * @see IWorkbench#getExportWizardRegistry()
-	 */
-	public WizardActionGroup(IWorkbenchWindow aWindow,
-			IWizardRegistry aWizardRegistry, String aType) {
-		super();
-		Assert.isNotNull(aWindow);
-		Assert.isNotNull(aWizardRegistry);
-		Assert
-				.isTrue(aType != null
-						&& (TYPE_NEW.equals(aType) || TYPE_IMPORT.equals(aType) || TYPE_EXPORT
-								.equals(aType)));
-		window = aWindow;
-		wizardRegistry = aWizardRegistry;
-		type = aType;
-
-	}
-	
-
-	/**
-	 * 
-	 * @param aWindow
-	 *            The window that will be used to acquire a Shell and a
-	 *            Selection Service
-	 * @param aWizardRegistry
-	 *            The wizard registry will be used to locate the correct wizard
-	 *            descriptions.
-	 * @param aType
-	 *            Indicates the value of the type attribute of the commonWizard
-	 *            extension point. Use any of the TYPE_XXX constants defined on
-	 *            this class.
-	 * @param aContentService 
-	 * 			 The content service to use when deciding visibility.         
-	 * @see PlatformUI#getWorkbench()
-	 * @see IWorkbench#getNewWizardRegistry()
-	 * @see IWorkbench#getImportWizardRegistry()
-	 * @see IWorkbench#getExportWizardRegistry()
-	 */
-	public WizardActionGroup(IWorkbenchWindow aWindow,
-			IWizardRegistry aWizardRegistry, String aType, INavigatorContentService aContentService) {
-		this(aWindow, aWizardRegistry, aType);
-		contentService = aContentService;
-
-	}
-
-	public void setContext(ActionContext aContext) {
-		Assert.isTrue(!disposed);
-
-		super.setContext(aContext);
-		if (aContext != null) {
-			ISelection selection = aContext.getSelection();
-			Object element = null;
-			if (selection instanceof IStructuredSelection) {
-				element = ((IStructuredSelection) selection).getFirstElement();
-			}
-			if(element == null) {
-				element = Collections.EMPTY_LIST;
-			}
-			// null should be okay here
-			setWizardActionDescriptors(CommonWizardDescriptorManager.getInstance()
-					.getEnabledCommonWizardDescriptors(element, type, contentService));
-		} else {
-			setWizardActionDescriptors(NO_DESCRIPTORS);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		Assert.isTrue(!disposed);
- 
-		if (descriptors != null) { 
-			Map groups = findGroups(); 
-			SortedSet sortedWizards = null;
-			String menuGroupId = null;
-			for (Iterator menuGroupItr = groups.keySet().iterator(); menuGroupItr.hasNext();) {
-				menuGroupId = (String) menuGroupItr.next();
-				sortedWizards = (SortedSet) groups.get(menuGroupId); 
-				menu.add(new Separator(menuGroupId));
-				for (Iterator wizardItr = sortedWizards.iterator(); wizardItr.hasNext();) {
-					menu.add((IAction) wizardItr.next());				
-				}
-			} 
-		} 
-	}
-
-	/**
-	 * @return A Map of menuGroupIds to SortedSets of IActions. 
-	 */
-	private synchronized Map/*<String, SortedSet<IAction>>*/  findGroups() {  
-		IAction action = null;
-		Map groups = new TreeMap();
-		SortedSet sortedWizards = null;
-		String menuGroupId = null;
-		for (int i = 0; i < descriptors.length; i++) {
-			menuGroupId = descriptors[i].getMenuGroupId() != null ? 
-							descriptors[i].getMenuGroupId() : CommonWizardDescriptor.DEFAULT_MENU_GROUP_ID;
-			sortedWizards = (SortedSet) groups.get(menuGroupId);
-			if(sortedWizards == null) {
-				groups.put(descriptors[i].getMenuGroupId(), sortedWizards = new TreeSet(ActionComparator.INSTANCE));
-			}  
-			if ((action = getAction(descriptors[i].getWizardId())) != null) {
-				sortedWizards.add(action); 
-			}			
-		}
-		return groups;
-	}
-
-
-	public void dispose() {
-		super.dispose();
-		actions = null;
-		window = null;
-		descriptors = null;
-		wizardRegistry = null;
-		disposed = true;
-	}
-
-	/*
-	 * (non-Javadoc) Returns the action for the given wizard id, or null if not
-	 * found.
-	 */
-	protected IAction getAction(String id) {
-		if (id == null || id.length() == 0) {
-			return null;
-		}
-
-		// Keep a cache, rather than creating a new action each time,
-		// so that image caching in ActionContributionItem works.
-		IAction action = (IAction) getActions().get(id);
-		if (action == null) {
-			IWizardDescriptor descriptor = wizardRegistry.findWizard(id);
-			if (descriptor != null) {
-				action = new WizardShortcutAction(window, descriptor);
-				getActions().put(id, action);
-			}
-		}
-
-		return action;
-	}
-
-	/**
-	 * @return a map of (id, IAction)-pairs.
-	 */
-	protected Map getActions() {
-		if (actions == null) {
-			actions = new HashMap();
-		}
-		return actions;
-	}
-
-	/**
-	 * @return Returns the wizardActionIds.
-	 */
-	public synchronized String[] getWizardActionIds() { 
-		if(descriptors != null && descriptors.length > 0) { 
-			String[] wizardActionIds = new String[descriptors.length]; 
-			for (int i = 0; i < descriptors.length; i++) {
-				wizardActionIds[i] = descriptors[i].getWizardId();
-			}
-			return wizardActionIds;
-		}
-		return NO_IDS;
-	}
-
-	/**
-	 * @param theWizardDescriptors
-	 *            The wizard action ids to set. These should be defined through
-	 *            <b>org.eclipse.ui.xxxWizards</b>
-	 */
-	private synchronized void setWizardActionDescriptors(CommonWizardDescriptor[] theWizardDescriptors) { 
-		descriptors = theWizardDescriptors;
-	}
-	  
-	private static class ActionComparator implements Comparator {
-		
-		private static final ActionComparator INSTANCE = new ActionComparator();
-		/* (non-Javadoc)
-		 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-		 */
-		public int compare(Object arg0, Object arg1) {
-			return ((IAction)arg0).getText().compareTo(((IAction)arg1).getText());
-		}
-	} 
-}
diff --git a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/package.html b/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/package.html
deleted file mode 100644
index 2a81cf8..0000000
--- a/bundles/org.eclipse.ui.navigator/src/org/eclipse/ui/navigator/package.html
+++ /dev/null
@@ -1,12 +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">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides the Common Navigator framework. Services allow clients to contribute
-reusable content/label providers and define viewers that use the available content/label
-providers.
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.presentations.r21/.classpath b/bundles/org.eclipse.ui.presentations.r21/.classpath
deleted file mode 100644
index ce73933..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.ui.presentations.r21/.cvsignore b/bundles/org.eclipse.ui.presentations.r21/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.presentations.r21/.project b/bundles/org.eclipse.ui.presentations.r21/.project
deleted file mode 100644
index 5da924d..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/.project
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.presentations.r21</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.ui</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.presentations.r21/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.ui.presentations.r21/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 0db0d73..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Mon Oct 29 10:37:38 EDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.ui.presentations.r21/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.ui.presentations.r21/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 29e9857..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Oct 29 10:37:42 EDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.3\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template></templates>
diff --git a/bundles/org.eclipse.ui.presentations.r21/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.ui.presentations.r21/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 77b65f8..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Nov 16 14:11:51 EST 2004
-compilers.p.unused-element-or-attribute=1
-compilers.p.unresolved-ex-points=0
-compilers.p.deprecated=0
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unknown-class=1
-compilers.p.unknown-attribute=0
-compilers.p.no-required-att=0
-eclipse.preferences.version=1
-compilers.p.unresolved-import=0
-compilers.p.not-externalized-att=0
-compilers.p.illegal-att-value=0
-compilers.use-project=true
diff --git a/bundles/org.eclipse.ui.presentations.r21/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.presentations.r21/META-INF/MANIFEST.MF
deleted file mode 100644
index b744e77..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ui.presentations.r21; singleton:=true
-Bundle-Version: 3.2.100.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.ui.internal.presentations.r21.R21PresentationPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.ui.internal.presentations;x-internal:=true,
- org.eclipse.ui.internal.presentations.r21;x-internal:=true,
- org.eclipse.ui.internal.presentations.r21.widgets;x-internal:=true
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui;bundle-version="[3.2.0,4.0.0)"
-Import-Package: com.ibm.icu.text
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.ui.presentations.r21/README.TXT b/bundles/org.eclipse.ui.presentations.r21/README.TXT
deleted file mode 100644
index 33b17e3..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/README.TXT
+++ /dev/null
@@ -1,15 +0,0 @@
-The r21presentation plugin provides an R2.1 style look and feel for
-Eclipse.  This look and feel is accomplished entirely through the
-Presentations API, no changes are needed to the base eclipse release.
-
-Use:
-
-1. Ensure the plugin is installed (look in your eclipse/plugins
-   directory for org.eclipse.ui.presentations.r21_3.0.0).
-2. Add the contents of the r21presentation.ini file to your primary
-   plugin's "plugin_customization.ini" file.  In the basic Eclipse
-   IDE, this file is located in plugins/org.eclipse.platform_3.0.0.
-3. Resolve any conflicts in the plugin_customization.ini file to favour
-   the settings for this project.  E.g., DOCK_PERSPECTIVE_BAR is set
-   to "topRight" in the basic platform but should be "left" for the
-   R21 presentation.
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.presentations.r21/about.html b/bundles/org.eclipse.ui.presentations.r21/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.presentations.r21/build.properties b/bundles/org.eclipse.ui.presentations.r21/build.properties
deleted file mode 100644
index eccd880..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/build.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2004, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-bin.includes = plugin.properties,\
-               plugin.xml,\
-               .,\
-               r21presentation.ini,\
-               README.TXT,\
-               about.html,\
-               META-INF/
-src.includes = about.html
-source.. = src/
diff --git a/bundles/org.eclipse.ui.presentations.r21/plugin.properties b/bundles/org.eclipse.ui.presentations.r21/plugin.properties
deleted file mode 100644
index 516f332..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/plugin.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName= R21 Presentation Plug-in
-providerName= Eclipse.org
-
-Presentation.r21.name=Eclipse 2.1 Style Presentation
diff --git a/bundles/org.eclipse.ui.presentations.r21/plugin.xml b/bundles/org.eclipse.ui.presentations.r21/plugin.xml
deleted file mode 100644
index dd5bcd3..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/plugin.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-     <extension
-         point="org.eclipse.ui.presentationFactories">
-      <factory
-            name="%Presentation.r21.name"
-            class="org.eclipse.ui.internal.presentations.R21PresentationFactory"
-            id="org.eclipse.ui.internal.r21presentationFactory">
-      </factory>
-   </extension>
-
-</plugin>
diff --git a/bundles/org.eclipse.ui.presentations.r21/r21presentation.ini b/bundles/org.eclipse.ui.presentations.r21/r21presentation.ini
deleted file mode 100644
index be8c8e3..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/r21presentation.ini
+++ /dev/null
@@ -1,18 +0,0 @@
-# R21 presentation settings: copy these values to your product's
-# plugin_customization.ini file before starting eclipse
-#
-# Its possible that platform has its own setting for some of these
-# values.  Be sure to resolve conflicts to favour the values in this
-# file.
-
-# use the R2.1 style
-org.eclipse.ui/presentationFactoryId=org.eclipse.ui.internal.r21presentationFactory
-
-# put the view tabs on the bottom (1024 == SWT.BOTTOM)
-org.eclipse.ui.workbench/VIEW_TAB_POSITION=1024
-
-# put the perspective switcher on the left
-org.eclipse.ui/DOCK_PERSPECTIVE_BAR=left
-
-# put the fast view bar on the left
-org.eclipse.ui/initialFastViewBarLocation=left
diff --git a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/R21BasicStackPresentation.java b/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/R21BasicStackPresentation.java
deleted file mode 100644
index 13f9041..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/R21BasicStackPresentation.java
+++ /dev/null
@@ -1,1217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Gunnar Wagenknecht - some contributions (bug fixes and enhancements)
- *******************************************************************************/
-package org.eclipse.ui.internal.presentations;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-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.MouseListener;
-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.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.internal.IWorkbenchConstants;
-import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
-import org.eclipse.ui.internal.WorkbenchImages;
-import org.eclipse.ui.internal.dnd.DragUtil;
-import org.eclipse.ui.internal.presentations.r21.R21Colors;
-import org.eclipse.ui.internal.presentations.r21.R21PresentationMessages;
-import org.eclipse.ui.internal.presentations.r21.widgets.CTabItem;
-import org.eclipse.ui.internal.presentations.r21.widgets.R21PaneFolder;
-import org.eclipse.ui.internal.util.Util;
-import org.eclipse.ui.presentations.IPartMenu;
-import org.eclipse.ui.presentations.IPresentablePart;
-import org.eclipse.ui.presentations.IPresentationSerializer;
-import org.eclipse.ui.presentations.IStackPresentationSite;
-import org.eclipse.ui.presentations.PresentationUtil;
-import org.eclipse.ui.presentations.StackDropResult;
-import org.eclipse.ui.presentations.StackPresentation;
-
-/**
- * Base class for StackPresentations that display IPresentableParts in a
- * CTabFolder.
- * 
- * @since 3.0
- */
-public class R21BasicStackPresentation extends StackPresentation {
-
-	private R21PaneFolder paneFolder;
-
-	private IPresentablePart current;
-
-	private boolean activeState = false;
-
-	private MenuManager systemMenuManager = new MenuManager();
-
-	private CLabel titleLabel;
-
-	private boolean shellActive = true;
-
-	private final static String TAB_DATA = R21BasicStackPresentation.class
-			.getName()
-			+ ".partId"; //$NON-NLS-1$
-
-	// private PaneFolderButtonListener buttonListener = new
-	// PaneFolderButtonListener() {
-	// public void stateButtonPressed(int buttonId) {
-	// getSite().setState(buttonId);
-	// }
-	//
-	// public void closeButtonPressed(CTabItem item) {
-	// IPresentablePart part = getPartForTab(item);
-	//			
-	// getSite().close(part);
-	// }
-	// };
-	//	
-	private MouseListener mouseListener = new MouseAdapter() {
-		public void mouseDown(MouseEvent e) {
-			if (e.widget instanceof Control) {
-				Control ctrl = (Control) e.widget;
-				Point globalPos = ctrl.toDisplay(new Point(e.x, e.y));
-
-				// PR#1GDEZ25 - If selection will change in mouse up ignore
-				// mouse down.
-				// Else, set focus.
-				CTabItem newItem = paneFolder.getItem(paneFolder.getControl()
-						.toControl(globalPos));
-				if (newItem != null) {
-					CTabItem oldItem = paneFolder.getSelection();
-					if (newItem != oldItem) {
-						return;
-					}
-				}
-				if (current != null) {
-					current.setFocus();
-				}
-			}
-		}
-
-		public void mouseDoubleClick(MouseEvent e) {
-			if (getSite().getState() == IStackPresentationSite.STATE_MAXIMIZED) {
-				getSite().setState(IStackPresentationSite.STATE_RESTORED);
-			} else {
-				getSite().setState(IStackPresentationSite.STATE_MAXIMIZED);
-			}
-		}
-	};
-
-	private MouseListener titleMouseListener = new MouseAdapter() {
-		public void mouseDown(MouseEvent e) {
-			if (e.widget instanceof Control) {
-				Control ctrl = (Control) e.widget;
-				Point globalPos = ctrl.toDisplay(new Point(0, titleLabel
-						.getBounds().height));
-
-				if ((e.button == 1) && overImage(e.x)) {
-					showSystemMenu(globalPos);
-				}
-			}
-		}
-	};
-
-	private Listener menuListener = new Listener() {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-		 */
-		public void handleEvent(Event event) {
-			Point pos = new Point(event.x, event.y);
-
-			showSystemMenu(pos);
-		}
-	};
-
-	private Listener dragListener = new Listener() {
-		public void handleEvent(Event event) {
-
-			Point localPos = new Point(event.x, event.y);
-			CTabItem tabUnderPointer = paneFolder.getItem(localPos);
-
-			// Drags on the title area drag the selected part only
-			if (tabUnderPointer == null) {
-				if (paneFolder.getTabPosition() == SWT.BOTTOM
-						&& localPos.y < paneFolder.getControl().getBounds().height
-								- paneFolder.getTabHeight()) {
-					tabUnderPointer = paneFolder.getSelection();
-				} else if (paneFolder.getTabPosition() == SWT.TOP
-						&& localPos.y > paneFolder.getTabHeight()) {
-					tabUnderPointer = paneFolder.getSelection();
-				}
-			}
-
-			// Not in a tab, not in a title area, must be dragging the whole
-			// stack
-			if (tabUnderPointer == null) {
-				getSite().dragStart(
-						paneFolder.getControl().toDisplay(localPos), false);
-				return;
-			}
-
-			IPresentablePart part = getPartForTab(tabUnderPointer);
-
-			if (getSite().isPartMoveable(part)) {
-				getSite().dragStart(part,
-						paneFolder.getControl().toDisplay(localPos), false);
-			}
-		}
-	};
-
-	private Listener selectionListener = new Listener() {
-		public void handleEvent(Event e) {
-			IPresentablePart item = getPartForTab((CTabItem) e.item);
-
-			if (item != null) {
-				getSite().selectPart(item);
-			}
-		}
-	};
-
-	private Listener resizeListener = new Listener() {
-		public void handleEvent(Event e) {
-			setControlSize();
-		}
-	};
-
-	private IPropertyListener childPropertyChangeListener = new IPropertyListener() {
-		public void propertyChanged(Object source, int property) {
-			if (source instanceof IPresentablePart) {
-				IPresentablePart part = (IPresentablePart) source;
-				childPropertyChanged(part, property);
-			}
-		}
-	};
-
-	private DisposeListener tabDisposeListener = new DisposeListener() {
-		public void widgetDisposed(DisposeEvent e) {
-			if (e.widget instanceof CTabItem) {
-				CTabItem item = (CTabItem) e.widget;
-
-				IPresentablePart part = getPartForTab(item);
-
-				part.removePropertyListener(childPropertyChangeListener);
-			}
-		}
-	};
-
-	/** the shell listener for upgrading the gradient */
-	private ShellAdapter shellListener = new ShellAdapter() {
-
-		public void shellActivated(ShellEvent event) {
-			shellActive = true;
-			updateGradient();
-		}
-
-		public void shellDeactivated(ShellEvent event) {
-			shellActive = false;
-			updateGradient();
-		}
-	};
-
-	private ToolBar viewToolBar;
-
-	private ToolItem pullDownButton;
-
-	private ToolItem closeButton;
-
-	/**
-	 * @param control
-	 * @param stackSite
-	 */
-	public R21BasicStackPresentation(R21PaneFolder control,
-			IStackPresentationSite stackSite) {
-		super(stackSite);
-		paneFolder = control;
-
-		shellActive = paneFolder.getControl().getShell().equals(
-				control.getControl().getDisplay().getActiveShell());
-
-		// tabFolder.setMinimizeVisible(stackSite.supportsState(IStackPresentationSite.STATE_MINIMIZED));
-		// tabFolder.setMaximizeVisible(stackSite.supportsState(IStackPresentationSite.STATE_MAXIMIZED));
-		//				
-		titleLabel = new CLabel(paneFolder.getControl(), SWT.SHADOW_NONE);
-		titleLabel.setVisible(false);
-		titleLabel.moveAbove(null);
-		titleLabel.addMouseListener(titleMouseListener);
-		titleLabel.addMouseListener(mouseListener);
-		titleLabel.addListener(SWT.MenuDetect, menuListener);
-		PresentationUtil.addDragListener(titleLabel, dragListener);
-
-		// ColorSchemeService.setViewTitleFont(this, titleLabel);
-
-		viewToolBar = new ToolBar(control.getControl(), SWT.HORIZONTAL
-				| SWT.FLAT);
-		viewToolBar.moveAbove(null);
-
-		pullDownButton = new ToolItem(viewToolBar, SWT.PUSH);
-		// Image img =
-		// WorkbenchImages.getImage(IWorkbenchGraphicConstants.IMG_LCL_VIEW_MENU);
-		Image hoverImage = WorkbenchImages
-				.getImage(IWorkbenchGraphicConstants.IMG_LCL_VIEW_MENU);
-		pullDownButton.setDisabledImage(null); // TODO: comment this out?
-		// PR#1GE56QT - Avoid creation of unnecessary image.
-		pullDownButton.setImage(hoverImage);
-		pullDownButton.setToolTipText(R21PresentationMessages
-				.getString("BasicStackPresentation.menu.tooltip")); //$NON-NLS-1$
-		pullDownButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				showPaneMenu();
-			}
-		});
-
-		// listener to switch between visible tabItems
-		paneFolder.getControl().addListener(SWT.Selection, selectionListener);
-
-		// listener to resize visible components
-		paneFolder.getControl().addListener(SWT.Resize, resizeListener);
-
-		// listen for mouse down on tab to set focus.
-		paneFolder.getControl().addMouseListener(mouseListener);
-
-		paneFolder.getControl().addListener(SWT.MenuDetect, menuListener);
-
-		// tabFolder.addButtonListener(buttonListener);
-
-		PresentationUtil.addDragListener(paneFolder.getControl(), dragListener);
-
-		// add the shell listener to track shell activations
-		// TODO: check if workaround can be removed (see bug 55458)
-		paneFolder.getControl().getShell().addShellListener(shellListener);
-
-		// Uncomment to allow dragging from the title label
-		// PresentationUtil.addDragListener(titleLabel, new Listener() {
-		// public void handleEvent(Event event) {
-		// if (layout.isTrimOnTop()) {
-		// Point localPos = new Point(event.x, event.y);
-		// getSite().dragStart(titleLabel.toDisplay(localPos), false);
-		// }
-		// }
-		// });
-
-		// // Compute the tab height
-		// int tabHeight = viewToolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
-		//
-		// // Enforce a minimum tab height
-		// if (tabHeight < 20) {
-		// tabHeight = 20;
-		// }
-		// paneFolder.setTabHeight(tabHeight);
-		//		
-		populateSystemMenu(systemMenuManager);
-	}
-
-	/*
-	 * Return true if <code>x</code> is over the label image.
-	 */
-	private boolean overImage(int x) {
-		return x < titleLabel.getImage().getBounds().width;
-	}
-
-	/**
-	 * @param systemMenuManager
-	 */
-	private void populateSystemMenu(IMenuManager systemMenuManager) {
-
-		systemMenuManager.add(new GroupMarker("misc")); //$NON-NLS-1$
-		systemMenuManager.add(new GroupMarker("restore")); //$NON-NLS-1$
-		systemMenuManager.add(new UpdatingActionContributionItem(
-				new SystemMenuRestore(getSite())));
-
-		systemMenuManager.add(new SystemMenuMove(getSite(), getPaneName()));
-		systemMenuManager.add(new GroupMarker("size")); //$NON-NLS-1$
-		systemMenuManager.add(new GroupMarker("state")); //$NON-NLS-1$
-		systemMenuManager.add(new UpdatingActionContributionItem(
-				new SystemMenuMinimize(getSite())));
-
-		systemMenuManager.add(new UpdatingActionContributionItem(
-				new SystemMenuMaximize(getSite())));
-		systemMenuManager.add(new Separator("close")); //$NON-NLS-1$
-		systemMenuManager.add(new UpdatingActionContributionItem(
-				new SystemMenuClose(getSite())));
-
-		getSite().addSystemActions(systemMenuManager);
-	}
-
-	protected String getPaneName() {
-		return R21PresentationMessages.getString("BasicStackPresentation.pane"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Displays the view menu as a popup
-	 */
-	public void showPaneMenu() {
-		IPartMenu menu = getPartMenu();
-
-		if (menu != null) {
-			Rectangle bounds = DragUtil.getDisplayBounds(viewToolBar);
-			menu.showMenu(new Point(bounds.x, bounds.y + bounds.height));
-		}
-	}
-
-	/**
-	 * Returns the currently selected part, or <code>null</code>.
-	 * 
-	 * @return the currently selected part, or <code>null</code>
-	 */
-	protected IPresentablePart getCurrent() {
-		return current;
-	}
-
-	/**
-	 * Returns the index of the tab for the given part, or returns
-	 * tabFolder.getItemCount() if there is no such tab.
-	 * 
-	 * @param part
-	 *            part being searched for
-	 * @return the index of the tab for the given part, or the number of tabs if
-	 *         there is no such tab
-	 */
-	private final int indexOf(IPresentablePart part) {
-		if (part == null) {
-			return paneFolder.getItemCount();
-		}
-
-		CTabItem[] items = paneFolder.getItems();
-
-		for (int idx = 0; idx < items.length; idx++) {
-			IPresentablePart tabPart = getPartForTab(items[idx]);
-
-			if (part == tabPart) {
-				return idx;
-			}
-		}
-
-		return items.length;
-	}
-
-	/**
-	 * Returns the tab for the given part, or null if there is no such tab
-	 * 
-	 * @param part
-	 *            the part being searched for
-	 * @return the tab for the given part, or null if there is no such tab
-	 */
-	protected final CTabItem getTab(IPresentablePart part) {
-		CTabItem[] items = paneFolder.getItems();
-
-		int idx = indexOf(part);
-
-		if (idx < items.length) {
-			return items[idx];
-		}
-
-		return null;
-	}
-
-	/**
-	 * @param part
-	 * @param property
-	 */
-	protected void childPropertyChanged(IPresentablePart part, int property) {
-
-		CTabItem tab = getTab(part);
-		initTab(tab, part);
-
-		switch (property) {
-		case IPresentablePart.PROP_BUSY:
-			break;
-		case IPresentablePart.PROP_HIGHLIGHT_IF_BACK:
-			// FontRegistry registry =
-			// PlatformUI.getWorkbench().
-			// getThemeManager().getCurrentTheme().
-			// getFontRegistry();
-			//	     	
-			// if(!getCurrent().equals(part))//Set bold if it does currently
-			// have focus
-			// tab.setFont(registry.getBold(IWorkbenchThemeConstants.TAB_TEXT_FONT));
-			// break;
-		case IPresentablePart.PROP_TOOLBAR:
-		case IPresentablePart.PROP_PANE_MENU:
-		case IPresentablePart.PROP_TITLE:
-			setControlSize();
-			break;
-		}
-	}
-
-	protected final IPresentablePart getPartForTab(CTabItem item) {
-		IPresentablePart part = (IPresentablePart) item.getData(TAB_DATA);
-
-		return part;
-	}
-
-	/**
-	 * Returns the underlying tab folder for this presentation.
-	 * 
-	 * @return the tab folder
-	 */
-	protected R21PaneFolder getPaneFolder() {
-		return paneFolder;
-	}
-
-	/**
-	 * Returns true iff the underlying tab folder has been disposed.
-	 * 
-	 * @return true if disposed
-	 */
-	public boolean isDisposed() {
-		return paneFolder == null || paneFolder.isDisposed();
-	}
-
-	/**
-	 * Update the tab folder's colours to match the current theme settings and
-	 * active state
-	 */
-	protected void updateGradient() {
-
-		if (isDisposed()) {
-			return;
-		}
-
-		Color fgColor;
-		Color[] bgColors;
-		int[] bgPercents;
-		boolean vertical = false;
-		if (isActive()) {
-			if (getShellActivated()) {
-				fgColor = R21Colors.getSystemColor(SWT.COLOR_TITLE_FOREGROUND);
-				bgColors = R21Colors.getActiveViewGradient();
-				bgPercents = R21Colors.getActiveViewGradientPercents();
-			} else {
-				fgColor = R21Colors
-						.getSystemColor(SWT.COLOR_TITLE_INACTIVE_FOREGROUND);
-				bgColors = R21Colors.getDeactivatedViewGradient();
-				bgPercents = R21Colors.getDeactivatedViewGradientPercents();
-			}
-
-		} else {
-			fgColor = R21Colors.getSystemColor(SWT.COLOR_LIST_FOREGROUND);
-			bgColors = null;
-			bgPercents = null;
-		}
-
-		drawGradient(fgColor, bgColors, bgPercents, vertical);
-
-		// Color fgColor;
-		// ITheme currentTheme =
-		// PlatformUI.getWorkbench().getThemeManager().getCurrentTheme();
-		// FontRegistry fontRegistry = currentTheme.getFontRegistry();
-		// ColorRegistry colorRegistry = currentTheme.getColorRegistry();
-		// Color [] bgColors = new Color[2];
-		// int [] percent = new int[1];
-		// boolean vertical;
-
-		// if (isActive()){
-		//        	
-		// CTabItem item = getPaneFolder().getSelection();
-		// if(item != null && !getPartForTab(item).isBusy()){
-		// Font tabFont =
-		// fontRegistry.get(IWorkbenchThemeConstants.TAB_TEXT_FONT);
-		// // item.setFont(tabFont);
-		// }
-		//            
-		// fgColor =
-		// colorRegistry.get(IWorkbenchThemeConstants.ACTIVE_TAB_TEXT_COLOR);
-		// bgColors[0] =
-		// colorRegistry.get(IWorkbenchThemeConstants.ACTIVE_TAB_BG_START);
-		// bgColors[1] =
-		// colorRegistry.get(IWorkbenchThemeConstants.ACTIVE_TAB_BG_END);
-		// percent[0] =
-		// currentTheme.getInt(IWorkbenchThemeConstants.ACTIVE_TAB_PERCENT);
-		// vertical =
-		// currentTheme.getBoolean(IWorkbenchThemeConstants.ACTIVE_TAB_VERTICAL);
-		// } else {
-		// fgColor =
-		// colorRegistry.get(IWorkbenchThemeConstants.INACTIVE_TAB_TEXT_COLOR);
-		// bgColors[0] =
-		// colorRegistry.get(IWorkbenchThemeConstants.INACTIVE_TAB_BG_START);
-		// bgColors[1] =
-		// colorRegistry.get(IWorkbenchThemeConstants.INACTIVE_TAB_BG_END);
-		// percent[0] =
-		// currentTheme.getInt(IWorkbenchThemeConstants.INACTIVE_TAB_PERCENT);
-		// vertical =
-		// currentTheme.getBoolean(IWorkbenchThemeConstants.INACTIVE_TAB_VERTICAL);
-		// }
-		//      
-		//		
-		// drawGradient(fgColor, bgColors, bgPercents, false);
-	}
-
-	/**
-	 * Draws the applicable gradient on the title area
-	 * 
-	 * @param fgColor
-	 * @param bgColors
-	 * @param percentages
-	 * @param vertical
-	 */
-	public void drawGradient(Color fgColor, Color[] bgColors,
-			int[] percentages, boolean vertical) {
-		// paneFolder.setSelectionForeground(fgColor);
-		// paneFolder.setSelectionBackground(bgColors, percentages, vertical);
-
-		if (titleLabel == null || viewToolBar == null) {
-			return;
-		}
-
-		titleLabel.setBackground(bgColors, percentages, vertical);
-		titleLabel.setForeground(fgColor);
-
-		titleLabel.update();
-	}
-
-	/**
-	 * @return true if active
-	 */
-	public boolean isActive() {
-		return activeState;
-	}
-
-	/**
-	 * Set the size of a page in the folder.
-	 * 
-	 * TODO: Kim here...I had to make this public so that the when the font was
-	 * updated via the color scheme service it could relayout the
-	 * presentation... calling control.getLayout() doesn't do the trick.
-	 */
-	public void setControlSize() {
-		// Set up the top-right controls
-		// List topRight = new ArrayList(3);
-
-		if (current != null) {
-			paneFolder.setTopLeft(titleLabel);
-			titleLabel.setText(current.getTitle());
-			titleLabel.setImage(current.getTitleImage());
-			titleLabel.setVisible(true);
-
-			// set tooltip (https://bugs.eclipse.org/bugs/show_bug.cgi?id=67513)
-			String toolTipText = current.getTitleToolTip();
-			titleLabel.setToolTipText(toolTipText
-					.equals(Util.ZERO_LENGTH_STRING) ? null : toolTipText);
-			
-		}
-
-		Control currentToolbar = getCurrentToolbar();
-		paneFolder.setTopCenter(currentToolbar);
-
-		IPartMenu partMenu = getPartMenu();
-
-		if (partMenu != null) {
-			pullDownButton.setEnabled(true);
-		} else {
-			pullDownButton.setEnabled(false);
-		}
-		paneFolder.setTopRight(viewToolBar);
-		viewToolBar.setVisible(true);
-
-		paneFolder.layout(true);
-
-		if (current != null) {
-			Rectangle clientArea = paneFolder.getClientArea();
-			Rectangle bounds = paneFolder.getControl().getBounds();
-			clientArea.x += bounds.x;
-			clientArea.y += bounds.y;
-
-			current.setBounds(clientArea);
-		}
-
-	}
-
-	/**
-	 * Returns the IPartMenu for the currently selected part, or null if the
-	 * current part does not have a menu.
-	 * 
-	 * @return the IPartMenu for the currently selected part or null if none
-	 */
-	protected IPartMenu getPartMenu() {
-		IPresentablePart part = getCurrentPart();
-		if (part == null) {
-			return null;
-		}
-
-		return part.getMenu();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.Presentation#dispose()
-	 */
-	public void dispose() {
-		if (isDisposed()) {
-			return;
-		}
-
-		// remove shell listener
-		paneFolder.getControl().getShell().removeShellListener(shellListener);
-
-		PresentationUtil.removeDragListener(paneFolder.getControl(),
-				dragListener);
-		PresentationUtil.removeDragListener(titleLabel, dragListener);
-
-		systemMenuManager.dispose();
-		systemMenuManager.removeAll();
-		paneFolder.getControl().dispose();
-		paneFolder = null;
-
-		titleLabel.dispose();
-		titleLabel = null;
-
-		viewToolBar.dispose();
-	}
-
-	/**
-	 * @param isActive
-	 */
-	public void setActive(boolean isActive) {
-		activeState = isActive;
-		updateGradient();
-	}
-
-	/**
-	 * Return whether the window's shell is activated
-	 */
-	/* package */boolean getShellActivated() {
-		return shellActive;
-	}
-
-	/**
-	 * Returns the top level window.
-	 * @return the window
-	 */
-	public Window getWindow() {
-		Control ctrl = getControl();
-		if (ctrl != null) {
-			Object data = ctrl.getShell().getData();
-			if (data instanceof Window) {
-				return (Window) data;
-			}
-		}
-		return null;
-	}
-
-	private CTabItem createPartTab(IPresentablePart part, int tabIndex) {
-		CTabItem tabItem;
-
-		int style = SWT.NONE;
-
-		if (getSite().isCloseable(part)) {
-			style |= SWT.CLOSE;
-		}
-
-		tabItem = paneFolder.createItem(style, tabIndex);
-
-		tabItem.setData(TAB_DATA, part);
-
-		part.addPropertyListener(childPropertyChangeListener);
-		tabItem.addDisposeListener(tabDisposeListener);
-
-		initTab(tabItem, part);
-
-		return tabItem;
-	}
-
-	// Create a close button in the title bar for the argument part (if needed).
-	private void updateCloseButton() {
-		// remove the close button if needed
-		if (current == null || !getSite().isCloseable(current)) {
-			if (closeButton != null) {
-				closeButton.dispose();
-				closeButton = null;
-
-				paneFolder.flush();
-			}
-			return;
-		}
-
-		// a close button is needed, so if its already there, we're done
-		if (closeButton != null) {
-			return;
-		}
-
-		// otherwise create it
-		closeButton = new ToolItem(viewToolBar, SWT.PUSH);
-		closeButton.setDisabledImage(null);
-		closeButton.setImage(WorkbenchImages
-				.getImage(IWorkbenchGraphicConstants.IMG_LCL_CLOSE_VIEW));
-		closeButton.setToolTipText(R21PresentationMessages
-				.getString("BasicStackPresentation.close.tooltip")); //$NON-NLS-1$
-		closeButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				close(getCurrent());
-			}
-		});
-
-		paneFolder.flush();
-	}
-
-	/**
-	 * Initializes a tab for the given part. Sets the text, icon, tool tip, etc.
-	 * This will also be called whenever a relevant property changes in the part
-	 * to reflect those changes in the tab. Subclasses may override to change
-	 * the appearance of tabs for a particular part.
-	 * 
-	 * @param tabItem
-	 *            tab for the part
-	 * @param part
-	 *            the part being displayed
-	 */
-	protected void initTab(CTabItem tabItem, IPresentablePart part) {
-		tabItem.setText(part.getName());
-
-		// tabItem.setImage(part.getTitleImage());
-
-		// String toolTipText = part.getTitleToolTip();
-		// if (!toolTipText.equals(Util.ZERO_LENGTH_STRING)) {
-		// tabItem.setToolTipText(toolTipText);
-		// }
-
-		// FontRegistry registry =
-		// PlatformUI.getWorkbench().
-		// getThemeManager().getCurrentTheme().
-		// getFontRegistry();
-		//		
-		// if(part.isBusy())
-		// tabItem.setFont(registry.getItalic(IWorkbenchThemeConstants.TAB_TEXT_FONT));
-		// else{
-		// tabItem.setFont(registry.get(IWorkbenchThemeConstants.TAB_TEXT_FONT));
-		// }
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.StackPresentation#addPart(org.eclipse.ui.internal.skins.IPresentablePart,
-	 *      org.eclipse.ui.internal.skins.IPresentablePart)
-	 */
-	public void addPart(IPresentablePart newPart, Object cookie) {
-
-		int idx;
-
-		if (cookie instanceof Integer) {
-			idx = ((Integer) cookie).intValue();
-		} else {
-			// Select a location for newly inserted parts
-			idx = paneFolder.getItemCount();
-		}
-
-		addPart(newPart, idx);
-	}
-
-	/**
-	 * Adds the given presentable part to this presentation at the given index.
-	 * Does nothing if a tab already exists for the given part.
-	 * 
-	 * @param newPart
-	 * @param index
-	 */
-	public void addPart(IPresentablePart newPart, int index) {
-		// If we already have a tab for this part, do nothing
-		if (getTab(newPart) != null) {
-			return;
-		}
-		createPartTab(newPart, index);
-
-		setControlSize();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.StackPresentation#removePart(org.eclipse.ui.internal.skins.IPresentablePart)
-	 */
-	public void removePart(IPresentablePart oldPart) {
-		if (current == oldPart) {
-			titleLabel.setImage(null);
-			current = null;
-		}
-
-		CTabItem item = getTab(oldPart);
-		if (item == null) {
-			return;
-		}
-		oldPart.setVisible(false);
-
-		item.dispose();
-
-		// Layout the folder again in case there is only one item
-		setControlSize();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.StackPresentation#selectPart(org.eclipse.ui.internal.skins.IPresentablePart)
-	 */
-	public void selectPart(IPresentablePart toSelect) {
-		if (toSelect == current) {
-			return;
-		}
-
-		IPresentablePart oldPart = current;
-
-		current = toSelect;
-
-		if (current != null) {
-			paneFolder.setSelection(indexOf(current));
-			current.setVisible(true);
-			updateCloseButton();
-			setControlSize();
-		}
-
-		if (oldPart != null) {
-			oldPart.setVisible(false);
-		}
-	}
-
-	/**
-	 * @return the current part
-	 */
-	public IPresentablePart getCurrentPart() {
-		return current;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.Presentation#setBounds(org.eclipse.swt.graphics.Rectangle)
-	 */
-	public void setBounds(Rectangle bounds) {
-		if (getSite().getState() == IStackPresentationSite.STATE_MINIMIZED) {
-			bounds = Geometry.copy(bounds);
-			bounds.height = computePreferredSize(false, Integer.MAX_VALUE,
-					bounds.width, Integer.MAX_VALUE);
-		}
-
-		paneFolder.getControl().setBounds(bounds);
-		setControlSize();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.Presentation#computeMinimumSize()
-	 */
-	public Point computeMinimumSize() {
-		Point result = Geometry.getSize(paneFolder.computeTrim(0, 0, 0, 0));
-
-		result.x += 100;
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.Presentation#setVisible(boolean)
-	 */
-	public void setVisible(boolean isVisible) {
-		if (current != null) {
-			current.setVisible(isVisible);
-		}
-		paneFolder.getControl().setVisible(isVisible);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.Presentation#setState(int)
-	 */
-	public void setState(int state) {
-		// tabFolder.setState(state);
-	}
-
-	/**
-	 * @return the menu manager
-	 */
-	public IMenuManager getSystemMenuManager() {
-		return systemMenuManager;
-	}
-
-	/**
-	 * @param point
-	 */
-	protected void showSystemMenu(Point point) {
-		Menu aMenu = systemMenuManager.createContextMenu(paneFolder
-				.getControl().getParent());
-		systemMenuManager.update(true);
-		aMenu.setLocation(point.x, point.y);
-		aMenu.setVisible(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.Presentation#getControl()
-	 */
-	public Control getControl() {
-		return paneFolder.getControl();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.StackPresentation#dragOver(org.eclipse.swt.widgets.Control,
-	 *      org.eclipse.swt.graphics.Point)
-	 */
-	public StackDropResult dragOver(Control currentControl, Point location) {
-
-		// Determine which tab we're currently dragging over
-		Point localPos = paneFolder.getControl().toControl(location);
-		final CTabItem tabUnderPointer = paneFolder.getItem(localPos);
-
-		// This drop target only deals with tabs... if we're not dragging over
-		// a tab, exit.
-		if (tabUnderPointer == null) {
-			return null;
-		}
-
-		// workaround when left tab is dragged over next
-		int dragOverIndex = paneFolder.indexOf(tabUnderPointer);
-
-		return new StackDropResult(Geometry.toDisplay(paneFolder.getControl(),
-				tabUnderPointer.getBounds()), new Integer(dragOverIndex));
-	}
-
-	/**
-	 * Returns the toolbar control for the currently selected part, or null if
-	 * none (not all parts have a toolbar).
-	 * 
-	 * @return the current toolbar or null if none
-	 */
-	protected Control getCurrentToolbar() {
-		IPresentablePart part = getCurrentPart();
-		if (part == null) {
-			return null;
-		}
-
-		return part.getToolBar();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.presentations.StackPresentation#showSystemMenu()
-	 */
-	public void showSystemMenu() {
-		IPresentablePart part = getCurrentPart();
-		if (part != null) {
-			Rectangle bounds = DragUtil.getDisplayBounds(paneFolder
-					.getControl());
-
-			int idx = paneFolder.getSelectionIndex();
-			if (idx > -1) {
-				CTabItem item = paneFolder.getItem(idx);
-				Rectangle itemBounds = item.getBounds();
-
-				bounds.x += itemBounds.x;
-				bounds.y += itemBounds.y;
-			}
-
-			Point location = new Point(bounds.x, bounds.y
-					+ paneFolder.getTabHeight());
-			showSystemMenu(location);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.presentations.StackPresentation#getTabList(IPresentablePart)
-	 */
-	public Control[] getTabList(IPresentablePart part) {
-		ArrayList list = new ArrayList();
-		if (paneFolder.getTabPosition() == SWT.BOTTOM) {
-			if (part.getToolBar() != null) {
-				list.add(part.getToolBar());
-			}
-			if (part.getControl() != null) {
-				list.add(part.getControl());
-			}
-			if (getPaneFolder() != null) {
-				list.add(getPaneFolder().getControl());
-			}
-		} else {
-			if (getPaneFolder() != null) {
-				list.add(getPaneFolder().getControl());
-			}
-			if (part.getToolBar() != null) {
-				list.add(part.getToolBar());
-			}
-			if (part.getControl() != null) {
-				list.add(part.getControl());
-			}
-		}
-		return (Control[]) list.toArray(new Control[list.size()]);
-	}
-
-	/**
-	 * @param parentShell 
-	 * @param x 
-	 * @param y 
-	 */
-	protected void showList(Shell parentShell, int x, int y) {
-		// final R21PaneFolder tabFolder = getTabFolder();
-		//
-		// int shellStyle = SWT.RESIZE | SWT.ON_TOP | SWT.NO_TRIM;
-		// int tableStyle = SWT.V_SCROLL | SWT.H_SCROLL;
-		// final BasicStackList editorList = new
-		// BasicStackList(tabFolder.getControl().getShell(),
-		// shellStyle, tableStyle);
-		// editorList.setInput(this);
-		// Point size = editorList.computeSizeHint();
-		//        
-		// Rectangle bounds = Display.getCurrent().getBounds();
-		// if (x + size.x > bounds.width) x = bounds.width - size.x;
-		// if (y + size.y > bounds.height) y = bounds.height - size.y;
-		// editorList.setLocation(new Point(x, y));
-		// editorList.setVisible(true);
-		// editorList.setFocus();
-		// editorList.getTableViewer().getTable().getShell().addListener(
-		// SWT.Deactivate, new Listener() {
-		//
-		// public void handleEvent(Event event) {
-		// editorList.setVisible(false);
-		// }
-		// });
-	}
-
-	/*
-	 * Shows the list of tabs at the top left corner of the editor
-	 */
-	protected void showListDefaultLocation() {
-		R21PaneFolder tabFolder = getPaneFolder();
-		Shell shell = tabFolder.getControl().getShell();
-		Rectangle clientArea = tabFolder.getClientArea();
-		Point location = tabFolder.getControl().getDisplay().map(
-				tabFolder.getControl(), null, clientArea.x, clientArea.y);
-		showList(shell, location.x, location.y);
-	}
-
-	void setSelection(CTabItem tabItem) {
-		getSite().selectPart(getPartForTab(tabItem));
-	}
-
-	void close(IPresentablePart presentablePart) {
-		getSite().close(new IPresentablePart[] { presentablePart });
-	}
-
-	Image getLabelImage(IPresentablePart presentablePart) {
-		return presentablePart.getTitleImage();
-	}
-
-	/**
-	 * @param presentablePart
-	 * @param includePath  
-	 */
-	String getLabelText(IPresentablePart presentablePart, boolean includePath) {
-		String title = presentablePart.getTitle().trim();
-		return title;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.presentations.StackPresentation#setActive(int)
-	 */
-	public void setActive(int newState) {
-		setActive(newState == AS_ACTIVE_FOCUS);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.presentations.StackPresentation#restoreState(org.eclipse.ui.presentations.IPresentationSerializer,
-	 *      org.eclipse.ui.IMemento)
-	 */
-	public void restoreState(IPresentationSerializer serializer,
-			IMemento savedState) {
-		IMemento[] parts = savedState.getChildren(IWorkbenchConstants.TAG_PART);
-
-		for (int idx = 0; idx < parts.length; idx++) {
-			String id = parts[idx].getString(IWorkbenchConstants.TAG_ID);
-
-			if (id != null) {
-				IPresentablePart part = serializer.getPart(id);
-
-				if (part != null) {
-					addPart(part, getPaneFolder().getItemCount());
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.presentations.StackPresentation#saveState(org.eclipse.ui.presentations.IPresentationSerializer,
-	 *      org.eclipse.ui.IMemento)
-	 */
-	public void saveState(IPresentationSerializer context, IMemento memento) {
-		super.saveState(context, memento);
-
-		List parts = getPresentableParts();
-
-		Iterator iter = parts.iterator();
-		while (iter.hasNext()) {
-			IPresentablePart next = (IPresentablePart) iter.next();
-
-			IMemento childMem = memento
-					.createChild(IWorkbenchConstants.TAG_PART);
-			childMem.putString(IWorkbenchConstants.TAG_ID, context.getId(next));
-		}
-	}
-
-	/**
-	 * Returns the List of IPresentablePart currently in this presentation
-	 */
-	private List getPresentableParts() {
-		Assert.isTrue(!isDisposed());
-
-		CTabItem[] items = getPaneFolder().getItems();
-		List result = new ArrayList(items.length);
-
-		for (int idx = 0; idx < getPaneFolder().getItemCount(); idx++) {
-			result.add(getPartForTab(items[idx]));
-		}
-
-		return result;
-	}
-}
diff --git a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/R21EditorStackPresentation.java b/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/R21EditorStackPresentation.java
deleted file mode 100644
index c50a355..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/R21EditorStackPresentation.java
+++ /dev/null
@@ -1,1007 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.presentations;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-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.MouseListener;
-import org.eclipse.swt.events.ShellAdapter;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-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.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.IPreferenceConstants;
-import org.eclipse.ui.internal.IWorkbenchConstants;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.internal.dnd.DragUtil;
-import org.eclipse.ui.internal.presentations.r21.R21Colors;
-import org.eclipse.ui.internal.presentations.r21.R21PresentationMessages;
-import org.eclipse.ui.internal.presentations.r21.widgets.CTabFolder;
-import org.eclipse.ui.internal.presentations.r21.widgets.CTabFolderEvent;
-import org.eclipse.ui.internal.presentations.r21.widgets.CTabFolderListener;
-import org.eclipse.ui.internal.presentations.r21.widgets.CTabItem;
-import org.eclipse.ui.presentations.IPartMenu;
-import org.eclipse.ui.presentations.IPresentablePart;
-import org.eclipse.ui.presentations.IPresentationSerializer;
-import org.eclipse.ui.presentations.IStackPresentationSite;
-import org.eclipse.ui.presentations.PresentationUtil;
-import org.eclipse.ui.presentations.StackDropResult;
-import org.eclipse.ui.presentations.StackPresentation;
-
-/**
- * A stack presentation for editors using a widget set that is close to what was
- * provided in 2.1.
- * <p>
- * EXPERIMENTAL
- * </p>
- * 
- * @since 3.0
- */
-public class R21EditorStackPresentation extends StackPresentation {
-
-	/** the tab folder */
-	private CTabFolder tabFolder;
-
-	/** the drag listener */
-	private Listener dragListener = new Listener() {
-
-		public void handleEvent(Event event) {
-			Point localPos = new Point(event.x, event.y);
-			CTabItem tabUnderPointer = tabFolder.getItem(localPos);
-
-			if (tabUnderPointer == null) {
-				// drag the entire stack
-				if (getSite().isStackMoveable()) {
-					getSite().dragStart(tabFolder.toDisplay(localPos), false);
-				}
-				return;
-			}
-
-			IPresentablePart part = getPartForTab(tabUnderPointer);
-
-			if (getSite().isPartMoveable(part)) {
-				// drag the part
-				getSite().dragStart(part, tabFolder.toDisplay(localPos), false);
-			}
-		}
-	};
-
-	/** the listener that will close the tab */
-	private CTabFolderListener closeListener = new CTabFolderListener() {
-
-		public void itemClosed(CTabFolderEvent e) {
-			CTabItem item = (CTabItem) e.item;
-			if (null != item) {
-				e.doit = false; // otherwise tab is auto disposed on return
-				getSite().close(new IPresentablePart[] { getPartForTab(item) });
-			}
-		}
-	};
-
-	/** the current part */
-	private IPresentablePart current;
-
-	/** the system menu */
-	private MenuManager systemMenuManager = new MenuManager();
-
-	/** the shared preference store */
-	private static IPreferenceStore preferenceStore = WorkbenchPlugin
-			.getDefault().getPreferenceStore();
-
-	// don't reset this dynamically, so just keep the information static.
-	// see bug:
-	// 75422 [Presentations] Switching presentation to R21 switches immediately,
-	// but only partially
-	private static int tabPos = PlatformUI.getPreferenceStore()
-			.getInt(IWorkbenchPreferenceConstants.EDITOR_TAB_POSITION);
-
-	/** the tab item property holding the part */
-	private final static String TAB_DATA = R21EditorStackPresentation.class
-			.getName()
-			+ ".partId"; //$NON-NLS-1$
-
-	/** the mouse listener for setting focus */
-	private MouseListener mouseListener = new MouseAdapter() {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
-		 */
-		public void mouseDown(MouseEvent e) {
-			if (e.widget instanceof Control) {
-				Control ctrl = (Control) e.widget;
-
-				Point globalPos = ctrl.toDisplay(new Point(e.x, e.y));
-
-				CTabItem newItem = tabFolder.getItem(tabFolder
-						.toControl(globalPos));
-				if (newItem != null) {
-
-					// show menu over icon
-					if ((e.button == 1) && overImage(newItem, e.x)) {
-						getSite().selectPart(getPartForTab(newItem));
-						showSystemMenu();
-					}
-
-					// PR#1GDEZ25 - If selection will change in mouse up ignore
-					// mouse down.
-					CTabItem oldItem = tabFolder.getSelection();
-					if (newItem != oldItem) {
-						return;
-					}
-				}
-
-				// set focus
-				if (current != null) {
-					current.setFocus();
-				}
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.swt.events.MouseAdapter#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
-		 */
-		public void mouseDoubleClick(MouseEvent e) {
-			if (getSite().getState() == IStackPresentationSite.STATE_MAXIMIZED) {
-				getSite().setState(IStackPresentationSite.STATE_RESTORED);
-			} else {
-				getSite().setState(IStackPresentationSite.STATE_MAXIMIZED);
-			}
-		}
-	};
-
-	/**
-	 * Return true if <code>x</code> is over the tab item image.
-	 * 
-	 * @return true if <code>x</code> is over the tab item image
-	 */
-	static boolean overImage(CTabItem item, int x) {
-		Rectangle imageBounds = item.getImage().getBounds();
-		return x < (item.getBounds().x + imageBounds.x + imageBounds.width);
-	}
-
-	/** the menu listener for showing the menu */
-	private Listener menuListener = new Listener() {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-		 */
-		public void handleEvent(Event event) {
-			Point pos = new Point(event.x, event.y);
-			showSystemMenu(pos);
-		}
-	};
-
-	/** the selection listener */
-	private Listener selectionListener = new Listener() {
-
-		public void handleEvent(Event e) {
-			IPresentablePart item = getPartForTab((CTabItem) e.item);
-			if (item != null) {
-				getSite().selectPart(item);
-			}
-		}
-	};
-
-	private Listener resizeListener = new Listener() {
-
-		public void handleEvent(Event e) {
-			setControlSize();
-		}
-	};
-
-	/** a property change listener for the parts */
-	private IPropertyListener childPropertyChangeListener = new IPropertyListener() {
-
-		public void propertyChanged(Object source, int property) {
-			if (source instanceof IPresentablePart) {
-				IPresentablePart part = (IPresentablePart) source;
-				childPropertyChanged(part, property);
-			}
-		}
-	};
-
-	/** a dispose listener to do some cleanups when a tab is disposed */
-	private DisposeListener tabDisposeListener = new DisposeListener() {
-
-		public void widgetDisposed(DisposeEvent e) {
-			if (e.widget instanceof CTabItem) {
-				CTabItem item = (CTabItem) e.widget;
-				IPresentablePart part = getPartForTab(item);
-				part.removePropertyListener(childPropertyChangeListener);
-			}
-		}
-	};
-
-	/** the shell listener for upgrading the gradient */
-	private ShellAdapter shellListener = new ShellAdapter() {
-
-		public void shellActivated(ShellEvent event) {
-			updateGradient();
-		}
-
-		public void shellDeactivated(ShellEvent event) {
-			updateGradient();
-		}
-	};
-
-	/**
-	 * Create a new presentation stack.
-	 * 
-	 * @param parent
-	 *            the parent widget
-	 * @param stackSite
-	 *            the site
-	 */
-	public R21EditorStackPresentation(Composite parent,
-			IStackPresentationSite stackSite) {
-		super(stackSite);
-
-		// create the tab folder
-		tabFolder = new CTabFolder(parent, tabPos | SWT.BORDER);
-
-		// minimum tab width
-		tabFolder.MIN_TAB_WIDTH = preferenceStore
-				.getInt(IPreferenceConstants.EDITOR_TAB_WIDTH);
-
-		// prevent close button and scroll buttons from taking focus
-		tabFolder.setTabList(new Control[0]);
-
-		// enable close button in tab folder
-		tabFolder.addCTabFolderListener(closeListener);
-
-		// listener to switch between visible tabItems
-		tabFolder.addListener(SWT.Selection, selectionListener);
-
-		// listener to resize visible components
-		tabFolder.addListener(SWT.Resize, resizeListener);
-
-		// listen for mouse down on tab to set focus, show system menu and
-		// maximize/restore.
-		tabFolder.addMouseListener(mouseListener);
-
-		// the menu
-		tabFolder.addListener(SWT.MenuDetect, menuListener);
-
-		// register drag listener
-		PresentationUtil.addDragListener(tabFolder, dragListener);
-
-		// add the shell listener to track shell activations
-		// TODO: check if workaround can be removed (see bug 55458)
-		tabFolder.getShell().addShellListener(shellListener);
-
-		// initialize system menu
-		populateSystemMenu(systemMenuManager);
-	}
-
-	/**
-	 * Initializes the specified menu manager.
-	 * 
-	 * @param menuManager
-	 */
-	private void populateSystemMenu(IMenuManager menuManager) {
-
-		menuManager.add(new GroupMarker("misc")); //$NON-NLS-1$
-		menuManager.add(new GroupMarker("restore")); //$NON-NLS-1$
-		menuManager.add(new UpdatingActionContributionItem(
-				new SystemMenuRestore(getSite())));
-		menuManager.add(new SystemMenuMove(getSite(), getPaneName()));
-		menuManager.add(new GroupMarker("size")); //$NON-NLS-1$
-		menuManager.add(new GroupMarker("state")); //$NON-NLS-1$
-		// systemMenuManager.add(new UpdatingActionContributionItem(new
-		// SystemMenuMinimize(getSite())));
-		menuManager.add(new UpdatingActionContributionItem(
-				new SystemMenuMaximize(getSite())));
-		menuManager.add(new Separator("close")); //$NON-NLS-1$
-		menuManager.add(new UpdatingActionContributionItem(new SystemMenuClose(
-				getSite())));
-
-		getSite().addSystemActions(menuManager);
-	}
-
-	/**
-	 * Returns the index of the tab for the given part, or returns
-	 * tabFolder.getItemCount() if there is no such tab.
-	 * 
-	 * @param part
-	 *            part being searched for
-	 * @return the index of the tab for the given part, or the number of tabs if
-	 *         there is no such tab
-	 */
-	private final int indexOf(IPresentablePart part) {
-		if (part == null) {
-			return tabFolder.getItemCount();
-		}
-
-		CTabItem[] items = tabFolder.getItems();
-		for (int idx = 0; idx < items.length; idx++) {
-			if (part == getPartForTab(items[idx])) {
-				return idx;
-			}
-		}
-
-		return items.length;
-	}
-
-	/**
-	 * Returns the tab for the given part, or null if there is no such tab
-	 * 
-	 * @param part
-	 *            the part being searched for
-	 * @return the tab for the given part, or null if there is no such tab
-	 */
-	protected final CTabItem getTab(IPresentablePart part) {
-		CTabItem[] items = tabFolder.getItems();
-		int idx = indexOf(part);
-		return idx < items.length ? items[idx] : null;
-	}
-
-	/**
-	 * @param part
-	 * @param property
-	 */
-	protected void childPropertyChanged(IPresentablePart part, int property) {
-		initTab(getTab(part), part);
-	}
-
-	protected final IPresentablePart getPartForTab(CTabItem item) {
-		return (IPresentablePart) item.getData(TAB_DATA);
-	}
-
-	protected CTabFolder getTabFolder() {
-		return tabFolder;
-	}
-
-	/**
-	 * Answer whether the receiver is disposed.
-	 * 
-	 * @return boolean <code>true</code> if disposed
-	 */
-	public boolean isDisposed() {
-		return tabFolder == null || tabFolder.isDisposed();
-	}
-
-	/**
-	 * Set the size of a page in the folder.
-	 */
-	private void setControlSize() {
-		if (current != null && tabFolder != null) {
-			current.setBounds(calculatePageBounds(tabFolder));
-		}
-	}
-
-	/**
-	 * Calculate the bounds of the client area inside the folder
-	 * 
-	 * @param folder
-	 * @return Rectangle the bounds of the client
-	 */
-	public static Rectangle calculatePageBounds(CTabFolder folder) {
-		if (folder == null) {
-			return new Rectangle(0, 0, 0, 0);
-		}
-
-		Rectangle bounds = folder.getBounds();
-		Rectangle offset = folder.getClientArea();
-		bounds.x += offset.x;
-		bounds.y += offset.y;
-		bounds.width = offset.width;
-		bounds.height = offset.height;
-		return bounds;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.Presentation#dispose()
-	 */
-	public void dispose() {
-		if (isDisposed()) {
-			return;
-		}
-
-		// remove shell listener
-		tabFolder.getShell().removeShellListener(shellListener);
-
-		// remove close listener
-		tabFolder.removeCTabFolderListener(closeListener);
-
-		// remove drag listener
-		PresentationUtil.removeDragListener(tabFolder, dragListener);
-
-		// dispose system menu manager
-		systemMenuManager.dispose();
-		systemMenuManager.removeAll();
-
-		// dispose tab folder
-		tabFolder.dispose();
-		tabFolder = null;
-	}
-
-	/** the active state */
-	private int activeState = AS_INACTIVE;
-
-	/**
-	 * Update the tab folder's colours to match the current theme settings and
-	 * active state
-	 */
-	private void updateGradient() {
-
-		if (isDisposed()) {
-			return;
-		}
-
-		Color fgColor;
-		Color[] bgColors;
-		int[] bgPercents;
-		boolean vertical = false;
-		if (activeState == AS_ACTIVE_FOCUS) {
-			if (getShellActivated()) {
-				fgColor = R21Colors.getSystemColor(SWT.COLOR_TITLE_FOREGROUND);
-				bgColors = R21Colors.getActiveEditorGradient();
-				bgPercents = R21Colors.getActiveEditorGradientPercents();
-			} else {
-				fgColor = R21Colors
-						.getSystemColor(SWT.COLOR_TITLE_INACTIVE_FOREGROUND);
-				bgColors = R21Colors.getDeactivatedEditorGradient();
-				bgPercents = R21Colors.getDeactivatedEditorGradientPercents();
-			}
-
-		} else if (activeState == AS_ACTIVE_NOFOCUS) {
-			fgColor = R21Colors.getSystemColor(SWT.COLOR_LIST_FOREGROUND);
-			bgColors = R21Colors.getActiveNoFocusEditorGradient();
-			bgPercents = R21Colors.getActiveNoFocusEditorGradientPercents();
-		} else {
-			fgColor = null;
-			bgColors = null;
-			bgPercents = null;
-		}
-
-		drawGradient(fgColor, bgColors, bgPercents, vertical);
-	}
-
-	/**
-	 * Sets the gradient for the selected tab
-	 * 
-	 * @param fgColor
-	 * @param bgColors
-	 * @param percentages
-	 * @param vertical
-	 */
-	protected void drawGradient(Color fgColor, Color[] bgColors,
-			int[] percentages, boolean vertical) {
-		tabFolder.setSelectionForeground(fgColor);
-		tabFolder.setSelectionBackground(bgColors, percentages);
-		tabFolder.update();
-	}
-
-	/**
-	 * Return whether the window's shell is activated
-	 */
-	/* package */boolean getShellActivated() {
-		Window window = getWindow();
-		if (window instanceof WorkbenchWindow) {
-			return ((WorkbenchWindow) window).getShellActivated();
-		}
-		return false;
-	}
-
-	/**
-	 * Returns the top level window.
-	 * 
-	 * @return Window the window for the receiver
-	 */
-	public Window getWindow() {
-		Control ctrl = getControl();
-		if (ctrl != null) {
-			Object data = ctrl.getShell().getData();
-			if (data instanceof Window) {
-				return (Window) data;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Creates the tab item for the specified part.
-	 * 
-	 * @param part
-	 * @param tabIndex
-	 * @return the tab item for the part
-	 */
-	private CTabItem createPartTab(IPresentablePart part, int tabIndex) {
-		CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE, tabIndex);
-		tabItem.setData(TAB_DATA, part);
-		part.addPropertyListener(childPropertyChangeListener);
-		tabItem.addDisposeListener(tabDisposeListener);
-		initTab(tabItem, part);
-		return tabItem;
-	}
-
-	/**
-	 * Initializes a tab for the given part. Sets the text, icon, tool tip, etc.
-	 * This will also be called whenever a relevant property changes in the part
-	 * to reflect those changes in the tab. Subclasses may override to change
-	 * the appearance of tabs for a particular part.
-	 * 
-	 * @param tabItem
-	 *            tab for the part
-	 * @param part
-	 *            the part being displayed
-	 */
-	protected void initTab(CTabItem tabItem, IPresentablePart part) {
-
-		// set tab text and tooltip
-		tabItem.setText(getLabelText(part, true, false));
-		tabItem.setToolTipText(getLabelToolTipText(part));
-
-		// set tab image
-		tabItem.setImage(getLabelImage(part));
-
-		// following code allows a disabled image
-		// but the result was distracting: didn't see any disabled image
-
-		// Image image = getLabelImage(part);
-		// boolean useColorIcons = false; // should we use a preference setting?
-		//
-		// if (image == null || image.isDisposed()) {
-		// // normal image
-		// tabItem.setImage(null);
-		// // disabled image
-		// if (!useColorIcons) {
-		// Image disableImage = tabItem.getDisabledImage();
-		// if (disableImage != null) {
-		// disableImage.dispose();
-		// tabItem.setDisabledImage(null);
-		// }
-		// }
-		// } else if (!image.equals(tabItem.getImage())) {
-		// // normal image
-		// tabItem.setImage(image);
-		// // disabled image
-		// if (!useColorIcons) {
-		// Image disableImage = tabItem.getDisabledImage();
-		// if (disableImage != null)
-		// disableImage.dispose();
-		// Display display = tabItem.getDisplay();
-		// disableImage = new Image(display, image, SWT.IMAGE_DISABLE);
-		// tabItem.setDisabledImage(disableImage);
-		// }
-		// }
-
-	}
-
-	/**
-	 * Returns the label text that should be used for the tab item for the
-	 * specified part
-	 * 
-	 * @param presentablePart
-	 * @param dirtyLeft
-	 * @param includePath
-	 * @return a formated label text
-	 */
-	String getLabelText(IPresentablePart presentablePart, boolean dirtyLeft,
-			boolean includePath) {
-		String title = presentablePart.getName().trim();
-		String text = title;
-
-		if (includePath) {
-			String titleTooltip = presentablePart.getTitleToolTip().trim();
-
-			if (titleTooltip.endsWith(title)) {
-				titleTooltip = titleTooltip.substring(0,
-						titleTooltip.lastIndexOf(title)).trim();
-			}
-
-			if (titleTooltip.endsWith("\\")) { //$NON-NLS-1$
-				titleTooltip = titleTooltip.substring(0,
-						titleTooltip.lastIndexOf("\\")).trim(); //$NON-NLS-1$
-			}
-
-			if (titleTooltip.endsWith("/")) { //$NON-NLS-1$
-				titleTooltip = titleTooltip.substring(0,
-						titleTooltip.lastIndexOf("/")).trim(); //$NON-NLS-1$
-			}
-
-			if (titleTooltip.length() >= 1) {
-				text += " - " + titleTooltip; //$NON-NLS-1$
-			}
-		}
-
-		if (presentablePart.isDirty()) {
-			if (dirtyLeft) {
-				text = "* " + text; //$NON-NLS-1$
-			} else {
-				text = text + " *"; //$NON-NLS-1$
-			}
-		}
-
-		return text;
-	}
-
-	/**
-	 * Returns the image used for the tab item
-	 * 
-	 * @param presentablePart
-	 * @return an image
-	 */
-	Image getLabelImage(IPresentablePart presentablePart) {
-		return presentablePart.getTitleImage();
-	}
-
-	/**
-	 * Returns the tool tip text used for the tab item
-	 * 
-	 * @param presentablePart
-	 * @return a tool tip text
-	 */
-	String getLabelToolTipText(IPresentablePart presentablePart) {
-		return presentablePart.getTitleToolTip();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.StackPresentation#addPart(org.eclipse.ui.internal.skins.IPresentablePart,
-	 *      org.eclipse.ui.internal.skins.IPresentablePart)
-	 */
-	public void addPart(IPresentablePart newPart, Object cookie) {
-
-		int idx;
-
-		if (cookie instanceof Integer) {
-			idx = ((Integer) cookie).intValue();
-		} else {
-			// Select a location for newly inserted parts
-			idx = tabFolder.getItemCount();
-		}
-
-		addPart(newPart, idx);
-	}
-
-	/**
-	 * Adds the given presentable part to this presentation at the given index.
-	 * Does nothing if a tab already exists for the given part.
-	 * 
-	 * @param newPart
-	 * @param index
-	 */
-	public void addPart(IPresentablePart newPart, int index) {
-		// If we already have a tab for this part, do nothing
-		if (getTab(newPart) != null) {
-			return;
-		}
-		createPartTab(newPart, index);
-
-		// setControlSize();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.StackPresentation#removePart(org.eclipse.ui.internal.skins.IPresentablePart)
-	 */
-	public void removePart(IPresentablePart oldPart) {
-		if (current == oldPart) {
-			current = null;
-		}
-
-		CTabItem item = getTab(oldPart);
-		if (item == null) {
-			return;
-		}
-		oldPart.setVisible(false);
-
-		item.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.StackPresentation#selectPart(org.eclipse.ui.internal.skins.IPresentablePart)
-	 */
-	public void selectPart(IPresentablePart toSelect) {
-		if (toSelect == current) {
-			return;
-		}
-		
-		IPresentablePart oldPart = current;
-
-		current = toSelect;
-		
-		if (current != null) {
-			tabFolder.setSelection(indexOf(current));
-			current.setVisible(true);
-			setControlSize();
-
-		}
-
-		if (oldPart != null) {
-			oldPart.setVisible(false);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.Presentation#setBounds(org.eclipse.swt.graphics.Rectangle)
-	 */
-	public void setBounds(Rectangle bounds) {
-		tabFolder.setBounds(bounds);
-		setControlSize();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.Presentation#computeMinimumSize()
-	 */
-	public Point computeMinimumSize() {
-		return Geometry.getSize(tabFolder.computeTrim(0, 0, 0, 0));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.Presentation#setVisible(boolean)
-	 */
-	public void setVisible(boolean isVisible) {
-		if (current != null) {
-			current.setVisible(isVisible);
-		}
-
-		getTabFolder().setVisible(isVisible);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.Presentation#setState(int)
-	 */
-	public void setState(int state) {
-		// tabFolder.setMinimized(state == IPresentationSite.STATE_MINIMIZED);
-		// tabFolder.setMaximized(state == IPresentationSite.STATE_MAXIMIZED);
-	}
-
-	/**
-	 * Returns the system menu manager.
-	 * 
-	 * @return the system menu manager
-	 */
-	public IMenuManager getSystemMenuManager() {
-		return systemMenuManager;
-	}
-
-	/**
-	 * Shows the system context menu at the specified location
-	 * 
-	 * @param point
-	 */
-	protected void showSystemMenu(Point point) {
-		Menu aMenu = systemMenuManager.createContextMenu(tabFolder.getParent());
-		systemMenuManager.update(true);
-		aMenu.setLocation(point.x, point.y);
-		aMenu.setVisible(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.Presentation#getControl()
-	 */
-	public Control getControl() {
-		return tabFolder;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.skins.StackPresentation#dragOver(org.eclipse.swt.widgets.Control,
-	 *      org.eclipse.swt.graphics.Point)
-	 */
-	public StackDropResult dragOver(Control currentControl, Point location) {
-
-		// Determine which tab we're currently dragging over
-		Point localPos = tabFolder.toControl(location);
-		final CTabItem tabUnderPointer = tabFolder.getItem(localPos);
-
-		// This drop target only deals with tabs... if we're not dragging over
-		// a tab, exit.
-		if (tabUnderPointer == null) {
-			return null;
-		}
-
-		// workaround when left tab is dragged over next
-		int dragOverIndex = tabFolder.indexOf(tabUnderPointer);
-
-		return new StackDropResult(Geometry.toDisplay(tabFolder,
-				tabUnderPointer.getBounds()), new Integer(dragOverIndex));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.presentations.StackPresentation#showSystemMenu()
-	 */
-	public void showSystemMenu() {
-		if (null != current) {
-			// switch to the editor
-			CTabItem item = getTab(current);
-			getSite().selectPart(getCurrentPart());
-			Rectangle bounds = item.getBounds();
-			int y = bounds.height;
-			if (getTabFolder().getTabPosition() == SWT.BOTTOM) {
-				y += bounds.y;
-			}
-			showSystemMenu(getTabFolder().toDisplay(bounds.x, y));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.presentations.StackPresentation#showPaneMenu()
-	 */
-	public void showPaneMenu() {
-		IPartMenu menu = getPartMenu();
-
-		if (null != menu) {
-			CTabItem tab = getTab(getCurrentPart());
-
-			if (null != tab && null != tab.getControl()) {
-				Rectangle bounds = DragUtil.getDisplayBounds(tab.getControl());
-				menu.showMenu(new Point(bounds.x, bounds.y + bounds.height));
-			}
-		}
-	}
-
-	/**
-	 * Returns the IPartMenu for the currently selected part, or null if the
-	 * current part does not have a menu.
-	 * 
-	 * @return the IPartMenu for the currently selected part or null if none
-	 */
-	protected IPartMenu getPartMenu() {
-		IPresentablePart part = getCurrentPart();
-		if (part == null) {
-			return null;
-		}
-
-		return part.getMenu();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.presentations.StackPresentation#getTabList(IPresentablePart)
-	 */
-	public Control[] getTabList(IPresentablePart part) {
-		ArrayList list = new ArrayList();
-		if (getControl() != null) {
-			list.add(getControl());
-		}
-		if (part.getToolBar() != null) {
-			list.add(part.getToolBar());
-		}
-		if (part.getControl() != null) {
-			list.add(part.getControl());
-		}
-		return (Control[]) list.toArray(new Control[list.size()]);
-	}
-
-	/**
-	 * @return the current part
-	 */
-	public IPresentablePart getCurrentPart() {
-		return current;
-	}
-
-	protected String getPaneName() {
-		return R21PresentationMessages.getString("EditorPane.moveEditor"); //$NON-NLS-1$ 
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.presentations.StackPresentation#setActive(int)
-	 */
-	public void setActive(int newState) {
-		activeState = newState;
-		updateGradient();
-	}
-	
-    /**
-     * Restores a presentation from a previously stored state
-     * 
-     * @param serializer (not null)
-     * @param savedState (not null)
-     */
-    public void restoreState(IPresentationSerializer serializer, IMemento savedState) {
-        IMemento[] parts = savedState.getChildren(IWorkbenchConstants.TAG_PART);
-        
-        for (int idx = 0; idx < parts.length; idx++) {
-            String id = parts[idx].getString(IWorkbenchConstants.TAG_ID);
-            
-            if (id != null) {
-                IPresentablePart part = serializer.getPart(id);
-                
-                if (part != null) {
-                    addPart(part, tabFolder.getItemCount());
-                }
-            } 
-        }
-    }
-    
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.presentations.StackPresentation#saveState(org.eclipse.ui.presentations.IPresentationSerializer, org.eclipse.ui.IMemento)
-     */
-    public void saveState(IPresentationSerializer context, IMemento memento) {
-        super.saveState(context, memento);
-        
-        List parts = getPresentableParts();
-        
-        Iterator iter = parts.iterator();
-        while (iter.hasNext()) {
-            IPresentablePart next = (IPresentablePart)iter.next();
-            
-            IMemento childMem = memento.createChild(IWorkbenchConstants.TAG_PART);
-            childMem.putString(IWorkbenchConstants.TAG_ID, context.getId(next));
-        }
-    }
-    
-    /**
-     * Returns the List of IPresentablePart currently in this presentation
-     */
-    private List getPresentableParts() {
-        Assert.isTrue(!isDisposed());
-        
-        CTabItem[] items = tabFolder.getItems();
-        List result = new ArrayList(items.length);
-        
-        for (int idx = 0; idx < tabFolder.getItemCount(); idx++) {
-            result.add(getPartForTab(items[idx]));
-        }
-        
-        return result;
-    }
-    }
diff --git a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/R21PresentationFactory.java b/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/R21PresentationFactory.java
deleted file mode 100644
index 04f2b83..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/R21PresentationFactory.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.presentations;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.presentations.IStackPresentationSite;
-import org.eclipse.ui.presentations.StackPresentation;
-import org.eclipse.ui.presentations.WorkbenchPresentationFactory;
-
-/**
- * A presentation factory that creates a look similar to previous verisons of eclipse.
- */
-public class R21PresentationFactory extends WorkbenchPresentationFactory {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.presentations.AbstractPresentationFactory
-     */
-    public StackPresentation createEditorPresentation(Composite parent,
-            IStackPresentationSite site) {
-        return new R21EditorStackPresentation(parent, site);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.presentations.AbstractPresentationFactory
-     */
-    public StackPresentation createViewPresentation(Composite parent,
-            IStackPresentationSite site) {
-        return new R21ViewStackPresentation(parent, site);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.presentations.AbstractPresentationFactory
-     */
-    public StackPresentation createStandaloneViewPresentation(Composite parent,
-            IStackPresentationSite site, boolean showTitle) {
-        // TODO: honour showTitle
-        return new R21ViewStackPresentation(parent, site);
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/R21ViewStackPresentation.java b/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/R21ViewStackPresentation.java
deleted file mode 100644
index 348bc92..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/R21ViewStackPresentation.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.presentations;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.presentations.r21.R21PresentationMessages;
-import org.eclipse.ui.internal.presentations.r21.widgets.CTabFolderEvent;
-import org.eclipse.ui.internal.presentations.r21.widgets.R21PaneFolder;
-import org.eclipse.ui.internal.presentations.r21.widgets.R21PaneFolderButtonListener;
-import org.eclipse.ui.presentations.IStackPresentationSite;
-
-/**
- * Controls the appearance of views stacked into the workbench.
- * 
- * @since 3.0
- */
-public class R21ViewStackPresentation extends R21BasicStackPresentation {
-
-   	// don't reset this dynamically, so just keep the information static.
-	// see bug:
-	//   75422 [Presentations] Switching presentation to R21 switches immediately, but only partially
-    private static int tabPos = PlatformUI.getPreferenceStore().getInt(IWorkbenchPreferenceConstants.VIEW_TAB_POSITION);
-  
-    private R21PaneFolderButtonListener showListListener = new R21PaneFolderButtonListener() {
-
-        public void showList(CTabFolderEvent event) {
-            event.doit = false;
-            showListDefaultLocation();
-        }
-    };
-
-    /**
-	 * Create a new view stack presentation.
-	 *
-     * @param parent
-     * @param newSite
-     */
-    public R21ViewStackPresentation(Composite parent,
-            IStackPresentationSite newSite) {
-
-        super(new R21PaneFolder(parent, SWT.BORDER), newSite);
-        R21PaneFolder tabFolder = getPaneFolder();
-
-        tabFolder.addButtonListener(showListListener);
-
-        tabFolder.setTabPosition(tabPos);
-        updateGradient();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.internal.skins.Presentation#setActive(boolean)
-     */
-    public void setActive(boolean isActive) {
-        super.setActive(isActive);
-
-        updateGradient();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.internal.presentations.DefaultPartPresentation#getPartMenu()
-     */
-    protected String getPaneName() {
-        return R21PresentationMessages.getString("ViewPane.moveView"); //$NON-NLS-1$ 
-    }
-}
diff --git a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/R21Colors.java b/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/R21Colors.java
deleted file mode 100644
index 157c602..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/R21Colors.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.presentations.r21;
-
-import java.util.HashMap;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * This class manages the R21 workbench colors (they are fixed).
- */
-public class R21Colors {
-
-    static private boolean init = false;
-
-    static private HashMap colorMap;
-
-    static private HashMap systemColorMap;
-
-    static private Color workbenchColors[];
-
-    static private Color[] activeViewGradient;
-
-    static private Color[] deactivatedViewGradient;
-
-    static private Color[] activeEditorGradient;
-
-    static private Color[] activeNoFocusEditorGradient;
-
-    static private Color[] deactivatedEditorGradient;
-
-    static private int[] activeViewPercentages;
-
-    static private int[] deactivatedViewPercentages;
-
-    static private int[] activeEditorPercentages;
-
-    static private int[] activeNoFocusEditorPercentages;
-
-    static private int[] deactivatedEditorPercentages;
-
-    static private final String CLR_VIEW_GRAD_START = "clrViewGradStart";//$NON-NLS-1$
-
-    static private final String CLR_VIEW_GRAD_END = "clrViewGradEnd";//$NON-NLS-1$
-
-    static private final String CLR_EDITOR_GRAD_START = "clrEditorGradStart";//$NON-NLS-1$
-
-    static private final String CLR_EDITOR_GRAD_END = "clrEditorGradEnd";//$NON-NLS-1$
-
-    /**
-     * Dispose all color pre-allocated by the workbench.
-     */
-    private static void disposeWorkbenchColors() {
-        for (int i = 0; i < workbenchColors.length; i++) {
-            workbenchColors[i].dispose();
-        }
-    }
-
-    /**
-     * Returns the active editor gradient.
-     * @return an array of colors
-     */
-    static public Color[] getActiveEditorGradient() {
-        return activeEditorGradient;
-    }
-
-    /**
-     * Returns the active editor gradient end color.
-     * @return the color
-     */
-    static public Color getActiveEditorGradientEnd() {
-        Color clr = (Color) systemColorMap.get(CLR_EDITOR_GRAD_END);
-        Assert.isNotNull(clr);
-        return clr;
-    }
-
-    /**
-     * Returns the active editor gradient percents.
-     * @return an array of ints
-     */
-    static public int[] getActiveEditorGradientPercents() {
-        return activeEditorPercentages;
-    }
-
-    /**
-     * Returns the active editor gradient start color.
-     * @return the color
-     */
-    static public Color getActiveEditorGradientStart() {
-        Color clr = (Color) systemColorMap.get(CLR_EDITOR_GRAD_START);
-        Assert.isNotNull(clr);
-        return clr;
-    }
-
-    /**
-     * Returns the active no focus editor gradient.
-     * @return an array of colors
-     */
-    static public Color[] getActiveNoFocusEditorGradient() {
-        return activeNoFocusEditorGradient;
-    }
-
-    /**
-     * Returns the active no focus editor gradient percents.
-     * @return an array of ints
-     */
-    static public int[] getActiveNoFocusEditorGradientPercents() {
-        return activeNoFocusEditorPercentages;
-    }
-
-    /**
-     * Returns the active gradient for views.
-     * @return an arry of colors
-     */
-    static public Color[] getActiveViewGradient() {
-        return activeViewGradient;
-    }
-
-    /**
-     * Returns the active view gradient end color.
-     * @return the color
-     */
-    static public Color getActiveViewGradientEnd() {
-        Color clr = (Color) systemColorMap.get(CLR_VIEW_GRAD_END);
-        Assert.isNotNull(clr);
-        return clr;
-    }
-
-    /**
-     * Returns the active view gradient percents.
-     * @return an arry of ints
-     */
-    static public int[] getActiveViewGradientPercents() {
-        return activeViewPercentages;
-    }
-
-    /**
-     * Returns the active view gradient start color.
-     * @return the color
-     */
-    static public Color getActiveViewGradientStart() {
-        Color clr = (Color) systemColorMap.get(CLR_VIEW_GRAD_START);
-        Assert.isNotNull(clr);
-        return clr;
-    }
-
-    /**
-     * Returns the gradient for editors when the window is deactivated.
-     * @return an array of colors
-     */
-    static public Color[] getDeactivatedEditorGradient() {
-        return deactivatedEditorGradient;
-    }
-
-    /**
-     * Returns the editor gradient percents when the window is deactivated.
-     * @return an array of ints
-     */
-    static public int[] getDeactivatedEditorGradientPercents() {
-        return deactivatedEditorPercentages;
-    }
-
-    /**
-     * Returns the gradient for views when the window is deactivated.
-     * @return an array of colors
-     */
-    static public Color[] getDeactivatedViewGradient() {
-        return deactivatedViewGradient;
-    }
-
-    /**
-     * Returns the view gradient percents when the window is deactivated.
-     * @return an array of ints
-     */
-    static public int[] getDeactivatedViewGradientPercents() {
-        return deactivatedViewPercentages;
-    }
-
-    /**
-     * Returns a color identified by an RGB value.
-     * @param rgbValue 
-     * @return the color 
-     */
-    static public Color getColor(RGB rgbValue) {
-        Color clr = (Color) colorMap.get(rgbValue);
-        if (clr == null) {
-            Display disp = Display.getDefault();
-            clr = new Color(disp, rgbValue);
-            colorMap.put(rgbValue, clr);
-        }
-        return clr;
-    }
-
-    /**
-     * Returns a system color identified by a SWT constant.
-     * @param swtId 
-     * @return the color
-     */
-    static public Color getSystemColor(int swtId) {
-        Integer bigInt = new Integer(swtId);
-        Color clr = (Color) systemColorMap.get(bigInt);
-        if (clr == null) {
-            Display disp = Display.getDefault();
-            clr = disp.getSystemColor(swtId);
-            systemColorMap.put(bigInt, clr);
-        }
-        return clr;
-    }
-
-    /**
-     * Initialize all colors used in the workbench in case the OS is using a 256
-     * color palette making sure the workbench colors are allocated.
-     * 
-     * This list comes from the designers.
-     */
-    private static void initWorkbenchColors(Display d) {
-        if (workbenchColors != null) {
-			return;
-		}
-
-        workbenchColors = new Color[] {
-        //Product pallet
-                new Color(d, 255, 255, 255), new Color(d, 255, 251, 240),
-                new Color(d, 223, 223, 191), new Color(d, 223, 191, 191),
-                new Color(d, 192, 220, 192), new Color(d, 192, 192, 192),
-                new Color(d, 191, 191, 191), new Color(d, 191, 191, 159),
-                new Color(d, 191, 159, 191), new Color(d, 160, 160, 164),
-                new Color(d, 159, 159, 191), new Color(d, 159, 159, 159),
-                new Color(d, 159, 159, 127), new Color(d, 159, 127, 159),
-                new Color(d, 159, 127, 127), new Color(d, 128, 128, 128),
-                new Color(d, 127, 159, 159), new Color(d, 127, 159, 127),
-                new Color(d, 127, 127, 159), new Color(d, 127, 127, 127),
-                new Color(d, 127, 127, 95), new Color(d, 127, 95, 127),
-                new Color(d, 127, 95, 95), new Color(d, 95, 127, 127),
-                new Color(d, 95, 127, 95), new Color(d, 95, 95, 127),
-                new Color(d, 95, 95, 95), new Color(d, 95, 95, 63),
-                new Color(d, 95, 63, 95), new Color(d, 95, 63, 63),
-                new Color(d, 63, 95, 95), new Color(d, 63, 95, 63),
-                new Color(d, 63, 63, 95), new Color(d, 0, 0, 0),
-                //wizban pallet
-                new Color(d, 195, 204, 224), new Color(d, 214, 221, 235),
-                new Color(d, 149, 168, 199), new Color(d, 128, 148, 178),
-                new Color(d, 106, 128, 158), new Color(d, 255, 255, 255),
-                new Color(d, 0, 0, 0), new Color(d, 0, 0, 0),
-                //Perspective
-                new Color(d, 132, 130, 132), new Color(d, 143, 141, 138),
-                new Color(d, 171, 168, 165),
-                //PreferenceDialog and TitleAreaDialog
-                new Color(d, 230, 226, 221) };
-    }
-
-    /**
-     * Disposes of the colors. Ignore all system colors as they do not need to
-     * be disposed.
-     */
-    static public void shutdown() {
-        if (!init) {
-			return;
-		}
-
-        disposeWorkbenchColors();
-
-        Iterator iter = colorMap.values().iterator();
-        while (iter.hasNext()) {
-            Color clr = (Color) iter.next();
-            if (clr != null) {
-                clr.dispose();
-            }
-        }
-
-        colorMap.clear();
-        systemColorMap.clear();
-        init = false;
-    }
-
-    /**
-     * Initializes the colors.
-     */
-    static public void startup() {
-        if (init) {
-			return;
-		}
-
-        // Initialize the caches first.
-        init = true;
-        colorMap = new HashMap(10);
-        systemColorMap = new HashMap(10);
-
-        initWorkbenchColors(Display.getDefault());
-        // Define active view gradient using same OS title gradient colors.
-        Color clr1 = getSystemColor(SWT.COLOR_TITLE_BACKGROUND);
-        Color clr2 = getSystemColor(SWT.COLOR_TITLE_BACKGROUND_GRADIENT);
-        Color clr3 = getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
-        systemColorMap.put(CLR_VIEW_GRAD_START, clr1);
-        systemColorMap.put(CLR_VIEW_GRAD_END, clr3);
-        activeViewGradient = new Color[] { clr1, clr2, clr3 };
-        activeViewPercentages = new int[] { 50, 100 };
-
-        // Define active editor gradient using same OS title gradient colors.
-        systemColorMap.put(CLR_EDITOR_GRAD_START, clr1);
-        systemColorMap.put(CLR_EDITOR_GRAD_END, null); // use widget default
-        // background
-        activeEditorGradient = new Color[] { clr1, clr2, null, null };
-        activeEditorPercentages = new int[] { 50, 90, 100 };
-
-        // Define active no focus editor gradient
-        activeNoFocusEditorGradient = new Color[] { getSystemColor(SWT.COLOR_LIST_BACKGROUND) };
-        activeNoFocusEditorPercentages = new int[0];
-
-        // Define view gradient for deactivated window using same OS title
-        // gradient colors.
-        clr1 = getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND);
-        clr2 = getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT);
-        clr3 = getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
-        deactivatedViewGradient = new Color[] { clr1, clr2, clr3 };
-        deactivatedViewPercentages = new int[] { 70, 100 };
-
-        // Define editor gradient for deactivated window using same OS title
-        // gradient colors.
-        deactivatedEditorGradient = new Color[] { clr1, clr2, null, null };
-        deactivatedEditorPercentages = new int[] { 70, 95, 100 };
-
-        // Preload.
-        getSystemColor(SWT.COLOR_WIDGET_FOREGROUND);
-        getSystemColor(SWT.COLOR_BLACK);
-    }
-}
diff --git a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/R21PresentationMessages.java b/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/R21PresentationMessages.java
deleted file mode 100644
index 9ef639c..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/R21PresentationMessages.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.presentations.r21;
-
-import com.ibm.icu.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Utility class which helps managing messages
- */
-public abstract class R21PresentationMessages {
-
-    private static final String RESOURCE_BUNDLE = "org.eclipse.ui.internal.presentations.r21.messages"; //$NON-NLS-1$
-
-    private static ResourceBundle bundle = ResourceBundle
-            .getBundle(RESOURCE_BUNDLE);
-
-    /**
-     * Returns the formatted message for the given key in the resource bundle.
-     * 
-     * @param key
-     *            the resource name
-     * @param args
-     *            the message arguments
-     * @return the string
-     */
-    public static String format(String key, Object[] args) {
-        return MessageFormat.format(getString(key), args);
-    }
-
-    /**
-     * Returns the resource object with the given key in the resource bundle. If
-     * there isn't any value under the given key, the key is returned.
-     * 
-     * @param key
-     *            the resource name
-     * @return the string
-     */
-    public static String getString(String key) {
-        try {
-            return bundle.getString(key);
-        } catch (MissingResourceException e) {
-            return key;
-        }
-    }
-
-    /**
-     * Returns the resource object with the given key in the resource bundle. If
-     * there isn't any value under the given key, the default value is returned.
-     * 
-     * @param key
-     *            the resource name
-     * @param def
-     *            the default value
-     * @return the string
-     */
-    public static String getString(String key, String def) {
-        try {
-            return bundle.getString(key);
-        } catch (MissingResourceException e) {
-            return def;
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/R21PresentationPlugin.java b/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/R21PresentationPlugin.java
deleted file mode 100644
index 4217209..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/R21PresentationPlugin.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.presentations.r21;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class R21PresentationPlugin extends AbstractUIPlugin {
-    //The shared instance.
-    private static R21PresentationPlugin plugin;
-
-    //Resource bundle.
-    private ResourceBundle resourceBundle;
-
-    /**
-     * The constructor.
-     */
-    public R21PresentationPlugin() {
-        super();
-        plugin = this;
-        try {
-            resourceBundle = ResourceBundle
-                    .getBundle("org.eclipse.ui.internal.r21presentation.R21lookPluginResources"); //$NON-NLS-1$
-        } catch (MissingResourceException x) {
-            resourceBundle = null;
-        }
-    }
-
-    /**
-     * Returns the shared instance.
-     * @return the plug-in
-     */
-    public static R21PresentationPlugin getDefault() {
-        return plugin;
-    }
-
-    /**
-     * Returns the string from the plugin's resource bundle,
-     * or 'key' if not found.
-     * @param key 
-     * @return the string
-     */
-    public static String getResourceString(String key) {
-        ResourceBundle bundle = R21PresentationPlugin.getDefault()
-                .getResourceBundle();
-        try {
-            return (bundle != null) ? bundle.getString(key) : key;
-        } catch (MissingResourceException e) {
-            return key;
-        }
-    }
-
-    /**
-     * Returns the plugin's resource bundle,
-     * @return the resource bundle
-     */
-    public ResourceBundle getResourceBundle() {
-        return resourceBundle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext)
-     */
-    public void start(BundleContext context) throws Exception {
-        super.start(context);
-        R21Colors.startup();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
-     */
-    public void stop(BundleContext context) throws Exception {
-        super.stop(context);
-        R21Colors.shutdown();
-    }
-}
diff --git a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/messages.properties b/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/messages.properties
deleted file mode 100644
index db4b916..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/messages.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2004, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-# package: org.eclipse.ui.internal.r21presentation
-
-BasicStackPresentation.menu.tooltip=Menu
-BasicStackPresentation.close.tooltip=Close
-BasicStackPresentation.pane=&Pane
-
-ViewPane.moveView=&View
-EditorPane.moveEditor=&Editor
diff --git a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/CTabFolder.java b/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/CTabFolder.java
deleted file mode 100644
index 2311c56..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/CTabFolder.java
+++ /dev/null
@@ -1,2574 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.presentations.r21.widgets;
-
-import org.eclipse.jface.util.Util;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.accessibility.ACC;
-import org.eclipse.swt.accessibility.Accessible;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleControlAdapter;
-import org.eclipse.swt.accessibility.AccessibleControlEvent;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-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.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.swt.widgets.TypedListener;
-
-/**
- * Instances of this class implement the notebook user interface
- * metaphor.  It allows the user to select a notebook page from
- * set of pages.
- * <p>
- * The item children that may be added to instances of this class
- * must be of type <code>CTabItem</code>.
- * <code>Control</code> children are created and then set into a
- * tab item using <code>CTabItem#setControl</code>.
- * </p><p>
- * Note that although this class is a subclass of <code>Composite</code>,
- * it does not make sense to set a layout on it.
- * </p><p>
- * <dl>
- * <dt><b>Styles:</b></dt>
- * <dd>TOP, BOTTOM, FLAT</dd>
- * <dt><b>Events:</b></dt>
- * <dd>Selection</dd>
- * <dd>"CTabFolder"</dd>
- * </dl>
- * <p>
- * Note: Only one of the styles TOP and BOTTOM 
- * may be specified.
- * </p><p>
- * IMPORTANT: This class is <em>not</em> intended to be subclassed.
- * </p>
- */
-
-public class CTabFolder extends Composite {
-
-    /**
-     * marginWidth specifies the number of pixels of horizontal margin
-     * that will be placed along the left and right edges of the form.
-     *
-     * The default value is 0.
-     */
-    public int marginWidth = 0;
-
-    /**
-     * marginHeight specifies the number of pixels of vertical margin
-     * that will be placed along the top and bottom edges of the form.
-     *
-     * The default value is 0.
-     */
-    public int marginHeight = 0;
-
-    /**
-     * Color of innermost line of drop shadow border.
-     */
-    public static RGB borderInsideRGB = new RGB(132, 130, 132);
-
-    /**
-     * Color of middle line of drop shadow border.
-     */
-    public static RGB borderMiddleRGB = new RGB(143, 141, 138);
-
-    /**
-     * Color of outermost line of drop shadow border.
-     */
-    public static RGB borderOutsideRGB = new RGB(171, 168, 165);
-
-    /**
-     * A multiple of the tab height that specifies the minimum width to which a tab 
-     * will be compressed before scrolling arrows are used to navigate the tabs.
-     */
-    public int MIN_TAB_WIDTH = 3;
-
-    /* sizing, positioning */
-    int xClient, yClient;
-
-    boolean onBottom = false;
-
-    boolean fixedTabHeight;
-
-    int tabHeight;
-
-    /* item management */
-    private CTabItem items[] = new CTabItem[0];
-
-    private int selectedIndex = -1;
-
-    int topTabIndex = -1; // index of the left most visible tab.
-
-    /* External Listener management */
-    private CTabFolderListener[] tabListeners = new CTabFolderListener[0];
-
-    /* Color appearance */
-    Image backgroundImage;
-
-    Color[] gradientColors;
-
-    int[] gradientPercents;
-
-    Color selectionForeground;
-
-    Color background;
-
-    // internal constants
-    private static final int DEFAULT_WIDTH = 64;
-
-    private static final int DEFAULT_HEIGHT = 64;
-
-    // scrolling arrows
-    private ToolBar arrowBar;
-
-    private Image arrowLeftImage;
-
-    private Image arrowRightImage;
-
-    private Control topRight;
-
-    // close button
-    boolean showClose = false;
-
-    private Image closeImage;
-
-    ToolBar closeBar;
-
-    private ToolBar inactiveCloseBar;
-
-    private CTabItem inactiveItem;
-
-    // borders
-    boolean showBorders = false;
-
-    private int borderBottom = 0;
-
-    private int borderLeft = 0;
-
-    private int borderRight = 0;
-
-    private int borderTop = 0;
-
-    private Color borderColor1;
-
-    private Color borderColor2;
-
-    private Color borderColor3;
-
-    // when disposing CTabFolder, don't try to layout the items or 
-    // change the selection as each child is destroyed.
-    private boolean inDispose = false;
-
-    // keep track of size changes in order to redraw only affected area
-    // on Resize
-    private Point oldSize;
-
-    private Font oldFont;
-
-    // insertion marker
-    int insertionIndex = -2; // Index of insert marker.  Marker always shown after index.
-
-    // -2 means no insert marker
-
-    // tool tip
-    private Shell tip;
-
-    private Label label;
-
-    private boolean showToolTip = false;
-
-    private CTabItem toolTipItem;
-
-    /**
-     * Constructs a new instance of this class given its parent
-     * and a style value describing its behavior and appearance.
-     * <p>
-     * The style value is either one of the style constants defined in
-     * class <code>SWT</code> which is applicable to instances of this
-     * class, or must be built by <em>bitwise OR</em>'ing together 
-     * (that is, using the <code>int</code> "|" operator) two or more
-     * of those <code>SWT</code> style constants. The class description
-     * lists the style constants that are applicable to the class.
-     * Style bits are also inherited from superclasses.
-     * </p>
-     *
-     * @param parent a widget which will be the parent of the new instance (cannot be null)
-     * @param style the style of widget to construct
-     *
-     * @exception IllegalArgumentException <ul>
-     *    <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
-     * </ul>
-     * @exception SWTException <ul>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
-     * </ul>
-     *
-     * @see SWT#TOP
-     * @see SWT#BOTTOM
-     * @see SWT#FLAT
-     * @see #getStyle()
-     */
-    public CTabFolder(Composite parent, int style) {
-        super(parent, checkStyle(style));
-
-        onBottom = (getStyle() & SWT.BOTTOM) != 0;
-
-        borderColor1 = new Color(getDisplay(), borderInsideRGB);
-        borderColor2 = new Color(getDisplay(), borderMiddleRGB);
-        borderColor3 = new Color(getDisplay(), borderOutsideRGB);
-
-        // tool tip support
-        tip = new Shell(getShell(), SWT.ON_TOP);
-        label = new Label(tip, SWT.CENTER);
-
-        // Add all listeners
-        Listener listener = new Listener() {
-            public void handleEvent(Event event) {
-                switch (event.type) {
-                case SWT.Dispose:
-                    onDispose();
-                    break;
-                case SWT.Paint:
-                    onPaint(event);
-                    break;
-                case SWT.Resize:
-                    onResize();
-                    break;
-                case SWT.MouseDoubleClick:
-                    onMouseDoubleClick(event);
-                    break;
-                case SWT.MouseDown:
-                    onMouseDown(event);
-                    break;
-                case SWT.MouseExit:
-                    onMouseExit(event);
-                    break;
-                case SWT.MouseHover:
-                    onMouseHover(event);
-                    break;
-                case SWT.MouseMove:
-                    onMouseMove(event);
-                    break;
-                case SWT.FocusIn:
-                    onFocus(event);
-                    break;
-                case SWT.FocusOut:
-                    onFocus(event);
-                    break;
-                case SWT.KeyDown:
-                    onKeyDown(event);
-                    break;
-                case SWT.Traverse:
-                    onTraverse(event);
-                    break;
-                }
-            }
-        };
-
-        int[] folderEvents = new int[] { SWT.Dispose, SWT.Paint, SWT.Resize,
-                SWT.MouseDoubleClick, SWT.MouseDown, SWT.MouseExit,
-                SWT.MouseHover, SWT.MouseMove, SWT.FocusIn, SWT.FocusOut,
-                SWT.KeyDown, SWT.Traverse, };
-        for (int i = 0; i < folderEvents.length; i++) {
-            addListener(folderEvents[i], listener);
-        }
-
-        createArrowBar();
-        createCloseBar();
-
-        setBorderVisible((style & SWT.BORDER) != 0);
-
-        initAccessible();
-
-    }
-
-    private static int checkStyle(int style) {
-        int mask = SWT.TOP | SWT.BOTTOM | SWT.FLAT | SWT.LEFT_TO_RIGHT
-                | SWT.RIGHT_TO_LEFT;
-        style = style & mask;
-        // TOP and BOTTOM are mutually exlusive.
-        // TOP is the default
-        if ((style & SWT.TOP) != 0) {
-			style = style & ~(SWT.TOP | SWT.BOTTOM) | SWT.TOP;
-		}
-        // reduce the flash by not redrawing the entire area on a Resize event
-        style |= SWT.NO_REDRAW_RESIZE;
-        return style;
-    }
-
-    /**	 
-     * Adds the listener to receive events.
-     * <p>
-     *
-     * @param listener the listener
-     *
-     * @exception SWTError <ul>
-     *		<li>ERROR_THREAD_INVALID_ACCESS when called from the wrong thread</li>
-     *		<li>ERROR_WIDGET_DISPOSED when the widget has been disposed</li>
-     * 		<li>ERROR_NULL_ARGUMENT when listener is null</li>
-     *	</ul>
-     */
-    public void addSelectionListener(SelectionListener listener) {
-        checkWidget();
-        if (listener == null) {
-            SWT.error(SWT.ERROR_NULL_ARGUMENT);
-        }
-        TypedListener typedListener = new TypedListener(listener);
-        addListener(SWT.Selection, typedListener);
-        addListener(SWT.DefaultSelection, typedListener);
-    }
-
-    /**
-     * Adds the listener to the collection of listeners who will
-     * be notified when a tab item is closed.
-     *
-     * @param listener the listener which should be notified
-     *
-     * @exception IllegalArgumentException <ul>
-     *		<li>ERROR_THREAD_INVALID_ACCESS when called from the wrong thread</li>
-     *		<li>ERROR_WIDGET_DISPOSED when the widget has been disposed</li>
-     *      <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-     * </ul>
-     *
-     * @see CTabFolderListener
-     * @see #removeCTabFolderListener
-     */
-    public void addCTabFolderListener(CTabFolderListener listener) {
-        checkWidget();
-        if (listener == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-        // add to array
-        CTabFolderListener[] newTabListeners = new CTabFolderListener[tabListeners.length + 1];
-        System.arraycopy(tabListeners, 0, newTabListeners, 0,
-                tabListeners.length);
-        tabListeners = newTabListeners;
-        tabListeners[tabListeners.length - 1] = listener;
-        showClose = true;
-        setButtonBounds();
-    }
-
-    private void closeNotify(CTabItem item, int time) {
-        if (item == null) {
-			return;
-		}
-
-        CTabFolderEvent event = new CTabFolderEvent(this);
-        event.widget = this;
-        event.time = time;
-        event.item = item;
-        event.doit = true;
-        if (tabListeners != null) {
-            for (int i = 0; i < tabListeners.length; i++) {
-                tabListeners[i].itemClosed(event);
-            }
-        }
-        if (event.doit) {
-            item.dispose();
-        }
-    }
-
-    public Point computeSize(int wHint, int hHint, boolean changed) {
-        checkWidget();
-        int minWidth = 0;
-        int minHeight = 0;
-
-        // preferred width of tab area to show all tabs
-        GC gc = new GC(this);
-        for (int i = 0; i < items.length; i++) {
-            minWidth += items[i].preferredWidth(gc);
-        }
-        gc.dispose();
-
-        // preferred size of controls in tab items
-        for (int i = 0; i < items.length; i++) {
-            Control control = items[i].getControl();
-            if (control != null && !control.isDisposed()) {
-                Point size = control.computeSize(wHint, hHint);
-                minWidth = Math.max(minWidth, size.x);
-                minHeight = Math.max(minHeight, size.y);
-            }
-        }
-        if (minWidth == 0) {
-			minWidth = DEFAULT_WIDTH;
-		}
-        if (minHeight == 0) {
-			minHeight = DEFAULT_HEIGHT;
-		}
-
-        if (wHint != SWT.DEFAULT) {
-			minWidth = wHint;
-		}
-        if (hHint != SWT.DEFAULT) {
-			minHeight = hHint;
-		}
-
-        Rectangle trim = computeTrim(0, 0, minWidth, minHeight);
-        return new Point(trim.width, trim.height);
-    }
-
-    public Rectangle computeTrim(int x, int y, int width, int height) {
-        checkWidget();
-        if (items.length == 0) {
-            if (!showBorders) {
-				return new Rectangle(x, y, width, height);
-			}
-            int trimX = x - borderRight - 1;
-            int trimY = y - borderBottom - 1;
-            int trimWidth = width + borderRight + 2;
-            int trimHeight = height + borderBottom + 2;
-            return new Rectangle(trimX, trimY, trimWidth, trimHeight);
-        }
-		int trimX = x - marginWidth - borderLeft;
-		int trimY = y - marginHeight - tabHeight - borderTop - 1;
-		// -1 is for the line at the bottom of the tabs
-		if (onBottom) {
-		    trimY = y - marginHeight - borderTop;
-		}
-		int trimWidth = width + borderLeft + borderRight + 2 * marginWidth;
-		int trimHeight = height + borderTop + borderBottom + 2
-		        * marginHeight + tabHeight + 1;
-		return new Rectangle(trimX, trimY, trimWidth, trimHeight);
-    }
-
-    /**
-     * Create the specified item at 'index'.
-     */
-    void createItem(CTabItem item, int index) {
-        if (0 > index || index > getItemCount()) {
-            SWT.error(SWT.ERROR_INVALID_RANGE);
-        }
-        // grow by one and rearrange the array.
-        CTabItem[] newItems = new CTabItem[items.length + 1];
-        System.arraycopy(items, 0, newItems, 0, index);
-        newItems[index] = item;
-        System.arraycopy(items, index, newItems, index + 1, items.length
-                - index);
-        items = newItems;
-
-        item.parent = this;
-
-        if (selectedIndex >= index) {
-            selectedIndex++;
-        }
-        if (items.length == 1) {
-            topTabIndex = 0;
-            resetTabSize(true);
-        } else {
-            setItemBounds();
-            showItem(item);
-        }
-
-        if (items.length == 1) {
-            redraw();
-        } else {
-            redrawTabArea(-1);
-        }
-    }
-
-    private void createArrowBar() {
-        // create arrow buttons for scrolling 
-        arrowBar = new ToolBar(this, SWT.FLAT);
-        arrowBar.setVisible(false);
-        arrowBar.setBackground(background);
-        ToolItem scrollLeft = new ToolItem(arrowBar, SWT.PUSH);
-        scrollLeft.setEnabled(false);
-        ToolItem scrollRight = new ToolItem(arrowBar, SWT.PUSH);
-        scrollRight.setEnabled(false);
-
-        scrollLeft.addListener(SWT.Selection, new Listener() {
-            public void handleEvent(Event event) {
-                scroll_scrollLeft();
-            }
-        });
-        scrollRight.addListener(SWT.Selection, new Listener() {
-            public void handleEvent(Event event) {
-                scroll_scrollRight();
-            }
-        });
-
-    }
-
-    private void createCloseBar() {
-        closeBar = new ToolBar(this, SWT.FLAT);
-        closeBar.setVisible(false);
-        if (gradientColors != null && gradientColors.length > 0) {
-            closeBar.setBackground(gradientColors[gradientColors.length - 1]);
-        } else {
-            closeBar.setBackground(background);
-        }
-        ToolItem closeItem = new ToolItem(closeBar, SWT.PUSH);
-
-        inactiveCloseBar = new ToolBar(this, SWT.FLAT);
-        inactiveCloseBar.setVisible(false);
-        inactiveCloseBar.setBackground(background);
-        ToolItem inactiveCloseItem = new ToolItem(inactiveCloseBar, SWT.PUSH);
-
-        closeItem.addListener(SWT.Selection, new Listener() {
-            public void handleEvent(Event event) {
-                closeNotify(getSelection(), event.time);
-            }
-        });
-        inactiveCloseItem.addListener(SWT.Selection, new Listener() {
-            public void handleEvent(Event event) {
-                closeNotify(inactiveItem, event.time);
-                inactiveCloseBar.setVisible(false);
-                inactiveItem = null;
-            }
-        });
-        inactiveCloseBar.addListener(SWT.MouseExit, new Listener() {
-            public void handleEvent(Event event) {
-                if (inactiveItem != null) {
-                    Rectangle itemBounds = inactiveItem.getBounds();
-                    if (itemBounds.contains(event.x, event.y)) {
-						return;
-					}
-                }
-                inactiveCloseBar.setVisible(false);
-                inactiveItem = null;
-            }
-        });
-
-    }
-
-    /**
-     * Destroy the specified item.
-     */
-    void destroyItem(CTabItem item) {
-        if (inDispose) {
-			return;
-		}
-
-        int index = indexOf(item);
-        if (index == -1) {
-			return; // should this trigger an error?
-		}
-
-        insertionIndex = -2;
-
-        if (items.length == 1) {
-            items = new CTabItem[0];
-            selectedIndex = -1;
-            topTabIndex = 0;
-
-            Control control = item.getControl();
-            if (control != null && !control.isDisposed()) {
-                control.setVisible(false);
-            }
-            closeBar.setVisible(false);
-            if (!fixedTabHeight) {
-				tabHeight = 0;
-			}
-            redraw();
-            return;
-        }
-
-        // shrink by one and rearrange the array.
-        CTabItem[] newItems = new CTabItem[items.length - 1];
-        System.arraycopy(items, 0, newItems, 0, index);
-        System.arraycopy(items, index + 1, newItems, index, items.length
-                - index - 1);
-        items = newItems;
-
-        if (topTabIndex == items.length) {
-            --topTabIndex;
-        }
-
-        // move the selection if this item is selected
-        if (selectedIndex == index) {
-            Control control = item.getControl();
-            if (control != null && !control.isDisposed()) {
-                control.setVisible(false);
-            }
-            selectedIndex = -1;
-            setSelection(Math.max(0, index - 1), true);
-        } else if (selectedIndex > index) {
-            selectedIndex--;
-        }
-
-        setItemBounds();
-        redrawTabArea(-1);
-    }
-
-    private void onKeyDown(Event e) {
-        if (e.keyCode != SWT.ARROW_LEFT && e.keyCode != SWT.ARROW_RIGHT) {
-			return;
-		}
-        int leadKey = (getStyle() & SWT.MIRRORED) != 0 ? SWT.ARROW_RIGHT
-                : SWT.ARROW_LEFT;
-        if (e.keyCode == leadKey) {
-            if (selectedIndex > 0) {
-                setSelection(selectedIndex - 1, true);
-            }
-        } else {
-            if (selectedIndex < items.length - 1) {
-                setSelection(selectedIndex + 1, true);
-            }
-        }
-    }
-
-    /**
-     * Dispose the items of the receiver
-     */
-    private void onDispose() {
-        /*
-         * Usually when an item is disposed, destroyItem will change the size of the items array, 
-         * reset the bounds of all the tabs and manage the widget associated with the tab.
-         * Since the whole folder is being disposed, this is not necessary.  For speed
-         * the inDispose flag is used to skip over this part of the item dispose.
-         */
-        inDispose = true;
-
-        int length = items.length;
-        for (int i = 0; i < length; i++) {
-            if (items[i] != null) {
-                items[i].dispose();
-            }
-        }
-
-        // clean up resources
-        if (tip != null && !tip.isDisposed()) {
-            tip.dispose();
-            tip = null;
-            label = null;
-        }
-
-        if (arrowLeftImage != null) {
-			arrowLeftImage.dispose();
-		}
-        arrowLeftImage = null;
-        if (arrowRightImage != null) {
-			arrowRightImage.dispose();
-		}
-        arrowRightImage = null;
-        if (closeImage != null) {
-			closeImage.dispose();
-		}
-        closeImage = null;
-
-        gradientColors = null;
-        gradientPercents = null;
-        backgroundImage = null;
-
-        if (borderColor1 != null) {
-			borderColor1.dispose();
-		}
-        borderColor1 = null;
-
-        if (borderColor2 != null) {
-			borderColor2.dispose();
-		}
-        borderColor2 = null;
-
-        if (borderColor3 != null) {
-			borderColor3.dispose();
-		}
-        borderColor3 = null;
-    }
-
-    /**
-	 * @param e  
-	 */
-    private void onFocus(Event e) {
-        checkWidget();
-        if (selectedIndex >= 0) {
-            redrawTabArea(selectedIndex);
-        } else {
-            setSelection(0, true);
-        }
-    }
-
-    /** 
-     * Draw a border around the receiver.
-     */
-    private void drawBorder(GC gc) {
-
-        Rectangle d = super.getClientArea();
-
-        if (showBorders) {
-            if ((getStyle() & SWT.FLAT) != 0) {
-                gc.setForeground(borderColor1);
-                gc.drawRectangle(d.x, d.y, d.x + d.width - 1, d.y + d.height
-                        - 1);
-            } else {
-                gc.setForeground(borderColor1);
-                gc.drawRectangle(d.x, d.y, d.x + d.width - 3, d.y + d.height
-                        - 3);
-
-                gc.setForeground(borderColor2);
-                gc.drawLine(d.x + 1, d.y + d.height - 2, d.x + d.width - 1, d.y
-                        + d.height - 2);
-                gc.drawLine(d.x + d.width - 2, d.y + 1, d.x + d.width - 2, d.y
-                        + d.height - 1);
-
-                gc.setForeground(borderColor3);
-                gc.drawLine(d.x + 2, d.y + d.height - 1, d.x + d.width - 2, d.y
-                        + d.height - 1);
-                gc.drawLine(d.x + d.width - 1, d.y + 2, d.x + d.width - 1, d.y
-                        + d.height - 2);
-
-                // fill in corners with parent's background
-                gc.setForeground(getParent().getBackground());
-                gc.drawLine(d.x + d.width - 2, d.y, d.x + d.width - 1, d.y);
-                gc.drawLine(d.x + d.width - 1, d.y + 1, d.x + d.width - 1,
-                        d.y + 1);
-
-                gc.drawLine(d.x, d.y + d.height - 2, d.x, d.y + d.height - 2);
-                gc.drawLine(d.x, d.y + d.height - 1, d.x + 1, d.y + d.height
-                        - 1);
-
-                gc.drawLine(d.x + d.width - 1, d.y + d.height - 1, d.x
-                        + d.width - 1, d.y + d.height - 1);
-            }
-
-        }
-
-        // draw a separator line
-        if (items.length > 0) {
-            int lineY = d.y + borderTop + tabHeight;
-            if (onBottom) {
-                lineY = d.y + d.height - borderBottom - tabHeight - 1;
-            }
-            gc.setForeground(borderColor1);
-            gc.drawLine(d.x + borderLeft, lineY, d.x + d.width - borderRight,
-                    lineY);
-        }
-
-        gc.setForeground(getForeground());
-    }
-
-    public Rectangle getClientArea() {
-        checkWidget();
-        Point size = getSize();
-        if (items.length == 0) {
-            if (!showBorders) {
-				return super.getClientArea();
-			}
-            int width = size.x - borderRight - 2;
-            int height = size.y - borderBottom - 2;
-            return new Rectangle(borderRight + 1, borderBottom + 1, width,
-                    height);
-        }
-		int width = size.x - 2 * marginWidth - borderLeft - borderRight;
-		int height = size.y - 2 * marginHeight - borderTop - borderBottom
-		        - tabHeight - 1;
-		return new Rectangle(xClient, yClient, width, height);
-    }
-
-    /**
-     * Returns the height of the tab
-     * 
-     * @return the height of the tab
-     * 
-     * @exception SWTError <ul>
-     *		<li>ERROR_THREAD_INVALID_ACCESS when called from the wrong thread</li>
-     *		<li>ERROR_WIDGET_DISPOSED when the widget has been disposed</li>
-     *	</ul>
-     */
-    public int getTabHeight() {
-        checkWidget();
-        return tabHeight;
-    }
-
-    /**
-     * Return the tab that is located at the specified index.
-     * @param index 
-     * 
-     * @return the item at the specified index
-     */
-    public CTabItem getItem(int index) {
-        //checkWidget();
-        if (index < 0 || index >= items.length) {
-			SWT.error(SWT.ERROR_INVALID_RANGE);
-		}
-        return items[index];
-    }
-
-    /**
-     * Gets the item at a point in the widget.
-     * <p>
-     * @param pt 
-     *
-     * @return the item at a point
-     */
-    public CTabItem getItem(Point pt) {
-        //checkWidget();
-        if (items.length == 0) {
-			return null;
-		}
-        int lastItem = getLastItem();
-        lastItem = Math.min(items.length - 1, lastItem + 1);
-        for (int i = topTabIndex; i <= lastItem; i++) {
-            Rectangle bounds = items[i].getBounds();
-            if (bounds.contains(pt)) {
-				return items[i];
-			}
-        }
-        return null;
-    }
-
-    /**
-     * Return the number of tabs in the folder.
-     * 
-     * @return the number of tabs in the folder
-     */
-    public int getItemCount() {
-        //checkWidget();
-        return items.length;
-    }
-
-    /**
-     * Return the tab items.
-     * 
-     * @return the tab items
-     */
-    public CTabItem[] getItems() {
-        //checkWidget();
-        CTabItem[] tabItems = new CTabItem[items.length];
-        System.arraycopy(items, 0, tabItems, 0, items.length);
-        return tabItems;
-    }
-
-    private int getLastItem() {
-        if (items.length == 0) {
-			return -1;
-		}
-        Rectangle area = getClientArea();
-        if (area.width <= 0) {
-			return 0;
-		}
-        Rectangle toolspace = getToolSpace();
-        if (toolspace.width == 0) {
-			return items.length - 1;
-		}
-        int width = area.width - toolspace.width;
-        int index = topTabIndex;
-        int tabWidth = items[index].width;
-        while (index < items.length - 1) {
-            tabWidth += items[index + 1].width;
-            if (tabWidth > width) {
-				break;
-			}
-            index++;
-        }
-        return index;
-    }
-
-    /**
-     * Return the selected tab item, or an empty array if there
-     * is no selection.
-     * 
-     * @return the selected tab item
-     */
-    public CTabItem getSelection() {
-        //checkWidget();
-        if (selectedIndex == -1) {
-			return null;
-		}
-        return items[selectedIndex];
-    }
-
-    /**
-     * Return the index of the selected tab item, or -1 if there
-     * is no selection.
-     * 
-     * @return the index of the selected tab item or -1
-     */
-    public int getSelectionIndex() {
-        //checkWidget();
-        return selectedIndex;
-    }
-
-    private Rectangle getToolSpace() {
-        boolean showArrows = scroll_leftVisible() || scroll_rightVisible();
-        if (!showArrows && topRight == null) {
-			return new Rectangle(0, 0, 0, 0);
-		}
-        Rectangle toolspace;
-        if (showArrows) {
-            toolspace = arrowBar.getBounds();
-            toolspace.width += borderRight;
-            if (topRight != null) {
-				toolspace.width += topRight.getSize().x;
-			}
-        } else {
-            toolspace = topRight.getBounds();
-            toolspace.width += borderRight;
-        }
-        return toolspace;
-    }
-
-    /**
-     * Returns the control in the top right corner of the tab folder. 
-     * Typically this is a close button or a composite with a menu and close button.
-     *
-     * @since 2.1
-     *
-     * @return the control in the top right corner of the tab folder or null
-     * 
-     * @exception  SWTError <ul>
-     *		<li>ERROR_THREAD_INVALID_ACCESS when called from the wrong thread</li>
-     *		<li>ERROR_WIDGET_DISPOSED when the widget has been disposed</li>
-     *	</ul>
-     */
-    public Control getTopRight() {
-        checkWidget();
-        return topRight;
-    }
-
-    /**
-     * Return the index of the specified tab or -1 if the tab is not 
-     * in the receiver.
-     * @param item 
-     * 
-     * @return the index of the specified tab item or -1
-     * 
-     * @exception SWTError <ul>
-     *      <li>ERROR_NULL_ARGUMENT when the item is null</li>
-     *	</ul>
-     */
-    public int indexOf(CTabItem item) {
-        //checkWidget();
-        if (item == null) {
-            SWT.error(SWT.ERROR_NULL_ARGUMENT);
-        }
-        for (int i = 0; i < items.length; i++) {
-            if (items[i] == item) {
-				return i;
-			}
-        }
-        return -1;
-    }
-
-    private void initAccessible() {
-        final Accessible accessible = getAccessible();
-        accessible.addAccessibleListener(new AccessibleAdapter() {
-            public void getName(AccessibleEvent e) {
-                String name = null;
-                int childID = e.childID;
-                if (childID >= 0 && childID < items.length) {
-                    name = items[childID].getText();
-                    int index = name.indexOf('&');
-                    if (index > 0) {
-                        name = name.substring(0, index)
-                                + name.substring(index + 1);
-                    }
-                }
-                e.result = name;
-            }
-
-            public void getHelp(AccessibleEvent e) {
-                String help = null;
-                int childID = e.childID;
-                if (childID == ACC.CHILDID_SELF) {
-                    help = getToolTipText();
-                } else if (childID >= 0 && childID < items.length) {
-                    help = items[childID].getToolTipText();
-                }
-                e.result = help;
-            }
-
-            public void getKeyboardShortcut(AccessibleEvent e) {
-                String shortcut = null;
-                int childID = e.childID;
-                if (childID >= 0 && childID < items.length) {
-                    String text = items[childID].getText();
-                    if (text != null) {
-                        char mnemonic = getMnemonic(text);
-                        if (mnemonic != '\0') {
-                            shortcut = "Alt+" + mnemonic; //$NON-NLS-1$
-                        }
-                    }
-                }
-                e.result = shortcut;
-            }
-        });
-
-        accessible.addAccessibleControlListener(new AccessibleControlAdapter() {
-            public void getChildAtPoint(AccessibleControlEvent e) {
-                Point testPoint = toControl(new Point(e.x, e.y));
-                int childID = ACC.CHILDID_NONE;
-                for (int i = 0; i < items.length; i++) {
-                    if (items[i].getBounds().contains(testPoint)) {
-                        childID = i;
-                        break;
-                    }
-                }
-                if (childID == ACC.CHILDID_NONE) {
-                    Rectangle location = getBounds();
-                    location.height = location.height - getClientArea().height;
-                    if (location.contains(testPoint)) {
-                        childID = ACC.CHILDID_SELF;
-                    }
-                }
-                e.childID = childID;
-            }
-
-            public void getLocation(AccessibleControlEvent e) {
-                Rectangle location = null;
-                int childID = e.childID;
-                if (childID == ACC.CHILDID_SELF) {
-                    location = getBounds();
-                }
-                if (childID >= 0 && childID < items.length) {
-                    location = items[childID].getBounds();
-                }
-                if (location != null) {
-                    Point pt = toDisplay(new Point(location.x, location.y));
-                    e.x = pt.x;
-                    e.y = pt.y;
-                    e.width = location.width;
-                    e.height = location.height;
-                }
-            }
-
-            public void getChildCount(AccessibleControlEvent e) {
-                e.detail = items.length;
-            }
-
-            public void getDefaultAction(AccessibleControlEvent e) {
-                String action = null;
-                int childID = e.childID;
-                if (childID >= 0 && childID < items.length) {
-                    action = "Switch"; //$NON-NLS-1$
-                }
-                e.result = action;
-            }
-
-            public void getFocus(AccessibleControlEvent e) {
-                int childID = ACC.CHILDID_NONE;
-                if (isFocusControl()) {
-                    if (selectedIndex == -1) {
-                        childID = ACC.CHILDID_SELF;
-                    } else {
-                        childID = selectedIndex;
-                    }
-                }
-                e.childID = childID;
-            }
-
-            public void getRole(AccessibleControlEvent e) {
-                int role = 0;
-                int childID = e.childID;
-                if (childID == ACC.CHILDID_SELF) {
-                    role = ACC.ROLE_TABFOLDER;
-                } else if (childID >= 0 && childID < items.length) {
-                    role = ACC.ROLE_TABITEM;
-                }
-                e.detail = role;
-            }
-
-            public void getSelection(AccessibleControlEvent e) {
-                e.childID = (selectedIndex == -1) ? ACC.CHILDID_NONE
-                        : selectedIndex;
-            }
-
-            public void getState(AccessibleControlEvent e) {
-                int state = 0;
-                int childID = e.childID;
-                if (childID == ACC.CHILDID_SELF) {
-                    state = ACC.STATE_NORMAL;
-                } else if (childID >= 0 && childID < items.length) {
-                    state = ACC.STATE_SELECTABLE;
-                    if (isFocusControl()) {
-                        state |= ACC.STATE_FOCUSABLE;
-                    }
-                    if (selectedIndex == childID) {
-                        state |= ACC.STATE_SELECTED;
-                        if (isFocusControl()) {
-                            state |= ACC.STATE_FOCUSED;
-                        }
-                    }
-                }
-                e.detail = state;
-            }
-
-            public void getChildren(AccessibleControlEvent e) {
-                Object[] children = new Object[items.length];
-                for (int i = 0; i < items.length; i++) {
-                    children[i] = new Integer(i);
-                }
-                e.children = children;
-            }
-        });
-
-        addListener(SWT.Selection, new Listener() {
-            public void handleEvent(Event event) {
-                if (isFocusControl()) {
-                    if (selectedIndex == -1) {
-                        accessible.setFocus(ACC.CHILDID_SELF);
-                    } else {
-                        accessible.setFocus(selectedIndex);
-                    }
-                }
-            }
-        });
-
-        addListener(SWT.FocusIn, new Listener() {
-            public void handleEvent(Event event) {
-                if (selectedIndex == -1) {
-                    accessible.setFocus(ACC.CHILDID_SELF);
-                } else {
-                    accessible.setFocus(selectedIndex);
-                }
-            }
-        });
-    }
-
-    private void setButtonBounds() {
-
-        updateArrowBar();
-        updateCloseBar();
-
-        Rectangle area = super.getClientArea();
-
-        int offset = 0;
-        if (topRight != null) {
-            Point size = topRight.computeSize(SWT.DEFAULT, tabHeight);
-            int x = area.x + area.width - borderRight - size.x;
-            int y = onBottom ? area.y + area.height - borderBottom - size.y
-                    : area.y + borderTop;
-            topRight.setBounds(x, y, size.x, size.y);
-            offset = size.x;
-        }
-        boolean leftVisible = scroll_leftVisible();
-        boolean rightVisible = scroll_rightVisible();
-        if (leftVisible || rightVisible) {
-            Point size = arrowBar.computeSize(SWT.DEFAULT, tabHeight);
-            int x = area.x + area.width - borderRight - size.x - offset;
-            int y = (onBottom) ? area.y + area.height - borderBottom - size.y
-                    : area.y + borderTop;
-
-            arrowBar.setBounds(x, y, size.x, size.y);
-            ToolItem[] items = arrowBar.getItems();
-            items[0].setEnabled(leftVisible);
-            items[1].setEnabled(rightVisible);
-            arrowBar.setVisible(true);
-        } else {
-            arrowBar.setVisible(false);
-        }
-
-        // When the close button is right at the edge of the Tab folder, hide it because
-        // otherwise it may block off a part of the border on the right
-        if (showClose) {
-            inactiveCloseBar.setVisible(false);
-            CTabItem item = getSelection();
-            if (item == null) {
-                closeBar.setVisible(false);
-            } else {
-                int toolbarHeight = tabHeight - CTabItem.TOP_MARGIN
-                        - CTabItem.BOTTOM_MARGIN + 2; // +2 to ignore gap between focus rectangle
-                Point size = closeBar.computeSize(SWT.DEFAULT, toolbarHeight);
-                int x = item.x + item.width - size.x - 2; // -2 to not overlap focus rectangle and trim
-                int y = item.y + Math.max(0, (item.height - toolbarHeight) / 2);
-                closeBar.setBounds(x, y, size.x, toolbarHeight);
-                Rectangle toolspace = getToolSpace();
-                Point folderSize = getSize();
-                boolean visible = (toolspace.width == 0 || x < toolspace.x)
-                        && x + size.x < folderSize.x - borderRight;
-                closeBar.setVisible(visible);
-            }
-        }
-    }
-
-    private boolean setItemLocation() {
-        if (items.length == 0) {
-			return false;
-		}
-        Rectangle area = super.getClientArea();
-        int x = area.x;
-        int y = area.y + borderTop;
-        if (onBottom) {
-			y = Math.max(0, area.y + area.height - borderBottom - tabHeight);
-		}
-
-        boolean changed = false;
-        for (int i = topTabIndex - 1; i >= 0; i--) {
-            // if the first visible tab is not the first tab
-            CTabItem tab = items[i];
-            x -= tab.width;
-            if (!changed && (tab.x != x || tab.y != y)) {
-				changed = true;
-			}
-            // layout tab items from right to left thus making them invisible
-            tab.x = x;
-            tab.y = y;
-        }
-
-        x = area.x + borderLeft;
-        for (int i = topTabIndex; i < items.length; i++) {
-            // continue laying out remaining, visible items left to right 
-            CTabItem tab = items[i];
-            tab.x = x;
-            tab.y = y;
-            x = x + tab.width;
-        }
-        setButtonBounds();
-        return changed;
-    }
-
-    private void setLastItem(int index) {
-        if (index < 0 || index > items.length - 1) {
-			return;
-		}
-        Rectangle area = getClientArea();
-        if (area.width <= 0) {
-			return;
-		}
-        int maxWidth = area.width;
-        Rectangle toolspace = getToolSpace();
-        if (toolspace.width > 0) {
-            maxWidth -= toolspace.width;
-        }
-        int tabWidth = items[index].width;
-        while (index > 0) {
-            tabWidth += items[index - 1].width;
-            if (tabWidth > maxWidth) {
-				break;
-			}
-            index--;
-        }
-        topTabIndex = index;
-        setItemLocation();
-        redrawTabArea(-1);
-    }
-
-    /**
-     * Layout the items and store the client area size.
-     */
-    boolean setItemBounds() {
-        boolean changed = false;
-        if (isDisposed()) {
-			return changed;
-		}
-        Rectangle area = super.getClientArea();
-
-        xClient = area.x + borderLeft + marginWidth;
-        if (onBottom) {
-            yClient = area.y + borderTop + marginHeight;
-        } else {
-            yClient = area.y + borderTop + tabHeight + 1 + marginHeight;
-            // +1 is for the line at the bottom of the tabs
-        }
-
-        if (area.width <= 0 || area.height <= 0 || items.length == 0) {
-			return changed;
-		}
-
-        int[] widths = new int[items.length];
-        GC gc = new GC(this);
-        for (int i = 0; i < items.length; i++) {
-            widths[i] = items[i].preferredWidth(gc);
-        }
-        gc.dispose();
-
-        int oldAverageWidth = 0;
-        int averageWidth = (area.width - borderLeft - borderRight)
-                / items.length;
-        while (averageWidth > oldAverageWidth) {
-            int width = area.width - borderLeft - borderRight;
-            int count = items.length;
-            for (int i = 0; i < items.length; i++) {
-                if (widths[i] < averageWidth) {
-                    width -= widths[i];
-                    count--;
-                }
-            }
-            oldAverageWidth = averageWidth;
-            if (count > 0) {
-                averageWidth = width / count;
-            }
-        }
-        averageWidth = Math.max(averageWidth, MIN_TAB_WIDTH * tabHeight);
-        for (int i = 0; i < items.length; i++) {
-            if (widths[i] > averageWidth) {
-                widths[i] = averageWidth;
-            }
-        }
-
-        int totalWidth = 0;
-        for (int i = 0; i < items.length; i++) {
-            CTabItem tab = items[i];
-            if (tab.height != tabHeight || tab.width != widths[i]) {
-				changed = true;
-			}
-            tab.height = tabHeight;
-            tab.width = widths[i];
-            totalWidth += widths[i];
-        }
-
-        int areaWidth = area.x + area.width - borderRight;
-        if (totalWidth <= areaWidth) {
-            topTabIndex = 0;
-        }
-        if (setItemLocation()) {
-			changed = true;
-		}
-
-        // Is there a gap after last item showing
-        if (correctLastItem()) {
-			changed = true;
-		}
-        return changed;
-    }
-
-    private boolean onMnemonic(Event event) {
-        char key = event.character;
-        for (int i = 0; i < items.length; i++) {
-            if (items[i] != null) {
-                char mnemonic = getMnemonic(items[i].getText());
-                if (mnemonic != '\0') {
-                    if (Character.toUpperCase(key) == Character
-                            .toUpperCase(mnemonic)) {
-                        setSelection(i, true);
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    /** 
-     * Paint the receiver.
-     */
-    private void onPaint(Event event) {
-        Font font = getFont();
-        if (oldFont == null || !oldFont.equals(font)) {
-            oldFont = font;
-            resetTabSize(true);
-        }
-        GC gc = event.gc;
-        Rectangle rect = super.getClientArea();
-        if (items.length == 0) {
-            if (showBorders) {
-                if ((getStyle() & SWT.FLAT) != 0) {
-                    gc.setForeground(borderColor1);
-                    gc.drawRectangle(rect.x, rect.y, rect.x + rect.width - 1,
-                            rect.y + rect.height - 1);
-                } else {
-                    gc.setForeground(borderColor1);
-                    gc.drawRectangle(rect.x, rect.y, rect.x + rect.width - 3,
-                            rect.y + rect.height - 3);
-
-                    // fill in right and bottom edges with parent's background
-                    gc.setBackground(getParent().getBackground());
-                    gc.fillRectangle(rect.x + rect.width - 2, rect.y, 2,
-                            rect.height);
-                    gc.fillRectangle(rect.x, rect.y + rect.height - 2,
-                            rect.width, 2);
-                }
-                gc.setForeground(getForeground());
-            }
-            return;
-        }
-
-        // redraw the Border
-        drawBorder(gc);
-
-        rect.x += borderLeft;
-        rect.y += borderTop;
-        rect.width -= borderLeft + borderRight;
-        rect.height -= borderTop + borderBottom;
-        Rectangle clip = gc.getClipping();
-        gc.setClipping(clip.intersection(rect));
-
-        // Draw the unselected tabs first.
-        for (int i = 0; i < items.length; i++) {
-            if (i != selectedIndex
-                    && event.getBounds().intersects(items[i].getBounds())) {
-                items[i].onPaint(gc, false);
-            }
-        }
-        // Selected tab comes last
-        if (selectedIndex != -1) {
-            items[selectedIndex].onPaint(gc, true);
-        }
-
-        // draw insertion mark
-        if (insertionIndex > -2) {
-            gc.setForeground(getDisplay().getSystemColor(
-                    SWT.COLOR_LIST_SELECTION));
-            if (insertionIndex == -1) {
-                Rectangle bounds = items[0].getBounds();
-                gc.drawLine(bounds.x, bounds.y, bounds.x, bounds.y
-                        + bounds.height - 1);
-                gc.drawLine(bounds.x - 2, bounds.y, bounds.x + 2, bounds.y);
-                gc.drawLine(bounds.x - 1, bounds.y + 1, bounds.x + 1,
-                        bounds.y + 1);
-                gc.drawLine(bounds.x - 1, bounds.y + bounds.height - 2,
-                        bounds.x + 1, bounds.y + bounds.height - 2);
-                gc.drawLine(bounds.x - 2, bounds.y + bounds.height - 1,
-                        bounds.x + 2, bounds.y + bounds.height - 1);
-
-            } else {
-                Rectangle bounds = items[insertionIndex].getBounds();
-                gc.drawLine(bounds.x + bounds.width, bounds.y, bounds.x
-                        + bounds.width, bounds.y + bounds.height - 1);
-                gc.drawLine(bounds.x + bounds.width - 2, bounds.y, bounds.x
-                        + bounds.width + 2, bounds.y);
-                gc.drawLine(bounds.x + bounds.width - 1, bounds.y + 1, bounds.x
-                        + bounds.width + 1, bounds.y + 1);
-                gc.drawLine(bounds.x + bounds.width - 1, bounds.y
-                        + bounds.height - 2, bounds.x + bounds.width + 1,
-                        bounds.y + bounds.height - 2);
-                gc.drawLine(bounds.x + bounds.width - 2, bounds.y
-                        + bounds.height - 1, bounds.x + bounds.width + 2,
-                        bounds.y + bounds.height - 1);
-            }
-        }
-
-        gc.setForeground(getForeground());
-        gc.setBackground(getBackground());
-    }
-
-    private void redrawTabArea(int index) {
-        int x = 0, y = 0, width = 0, height = 0;
-        if (index == -1) {
-            Rectangle area = super.getClientArea();
-            if (area.width == 0 || area.height == 0) {
-				return;
-			}
-            width = area.x + area.width - borderLeft - borderRight;
-            height = tabHeight + 1; // +1 causes top line between content and tabs to be redrawn
-            x = area.x + borderLeft;
-            y = area.y + borderTop;
-            if (onBottom) {
-                y = Math.max(0, area.y + area.height - borderBottom - height);
-            }
-        } else {
-            CTabItem item = items[index];
-            x = item.x;
-            y = item.y;
-            Rectangle area = super.getClientArea();
-            width = area.x + area.width - x;
-            height = item.height;
-        }
-        redraw(x, y, width, height, false);
-    }
-
-    /**	 
-     * Removes the listener.
-     *
-     * @param listener the listener
-     *
-     * @exception SWTError
-     *	<ul><li>ERROR_THREAD_INVALID_ACCESS	when called from the wrong thread</li>
-     * 		<li>ERROR_WIDGET_DISPOSED when the widget has been disposed</li>
-     * 		<li>ERROR_NULL_ARGUMENT when listener is null</li></ul>
-     */
-    public void removeSelectionListener(SelectionListener listener) {
-        checkWidget();
-        if (listener == null) {
-            SWT.error(SWT.ERROR_NULL_ARGUMENT);
-        }
-        removeListener(SWT.Selection, listener);
-        removeListener(SWT.DefaultSelection, listener);
-    }
-
-    /**	 
-     * Removes the listener.
-     *
-     * @param listener the listener
-     *
-     * @exception SWTError
-     *	<ul><li>ERROR_THREAD_INVALID_ACCESS	when called from the wrong thread</li>
-     * 		<li>ERROR_WIDGET_DISPOSED when the widget has been disposed</li>
-     * 		<li>ERROR_NULL_ARGUMENT when listener is null</li></ul>
-     */
-    public void removeCTabFolderListener(CTabFolderListener listener) {
-        checkWidget();
-        if (listener == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-        if (tabListeners.length == 0) {
-			return;
-		}
-        int index = -1;
-        for (int i = 0; i < tabListeners.length; i++) {
-            if (listener == tabListeners[i]) {
-                index = i;
-                break;
-            }
-        }
-        if (index == -1) {
-			return;
-		}
-        if (tabListeners.length == 1) {
-            tabListeners = new CTabFolderListener[0];
-            showClose = false;
-            setButtonBounds();
-            return;
-        }
-        CTabFolderListener[] newTabListeners = new CTabFolderListener[tabListeners.length - 1];
-        System.arraycopy(tabListeners, 0, newTabListeners, 0, index);
-        System.arraycopy(tabListeners, index + 1, newTabListeners, index,
-                tabListeners.length - index - 1);
-        tabListeners = newTabListeners;
-    }
-
-    /**
-     * The widget was resized. Adjust the size of the currently selected page.
-     */
-    private void onResize() {
-
-        if (items.length == 0) {
-            redraw();
-            return;
-        }
-
-        if (setItemBounds()) {
-            redrawTabArea(-1);
-        }
-
-        Point size = getSize();
-        if (oldSize == null) {
-            redraw();
-        } else {
-            if (onBottom && size.y != oldSize.y) {
-                redraw();
-            } else {
-                int x1 = Math.min(size.x, oldSize.x);
-                if (size.x != oldSize.x) {
-					x1 -= 10;
-				}
-                int y1 = Math.min(size.y, oldSize.y);
-                if (size.y != oldSize.y) {
-					y1 -= 10;
-				}
-                int x2 = Math.max(size.x, oldSize.x);
-                int y2 = Math.max(size.y, oldSize.y);
-                redraw(0, y1, x2 + 10, y2 - y1, false);
-                redraw(x1, 0, x2 - x1, y2, false);
-            }
-        }
-        oldSize = size;
-
-        // resize content
-        if (selectedIndex != -1) {
-            Control control = items[selectedIndex].getControl();
-            if (control != null && !control.isDisposed()) {
-                control.setBounds(getClientArea());
-            }
-        }
-    }
-
-    public void setBackground(Color color) {
-        super.setBackground(color);
-        background = color;
-        // init inactive close button
-        inactiveCloseBar.setBackground(color);
-
-        // init scroll buttons
-        arrowBar.setBackground(color);
-
-        //init topRight control
-        if (topRight != null) {
-			topRight.setBackground(color);
-		}
-
-        // init close button
-        if (gradientColors == null) {
-            closeBar.setBackground(color);
-        }
-    }
-
-    /**
-     * Specify a gradient of colours to be draw in the background of the selected tab.
-     * For example to draw a gradient that varies from dark blue to blue and then to
-     * white, use the following call to setBackground:
-     * <pre>
-     *	cfolder.setBackground(new Color[]{display.getSystemColor(SWT.COLOR_DARK_BLUE), 
-     *		                           display.getSystemColor(SWT.COLOR_BLUE),
-     *		                           display.getSystemColor(SWT.COLOR_WHITE), 
-     *		                           display.getSystemColor(SWT.COLOR_WHITE)},
-     *		               new int[] {25, 50, 100});
-     * </pre>
-     *
-     * @param colors an array of Color that specifies the colors to appear in the gradient 
-     *               in order of appearance left to right.  The value <code>null</code> clears the
-     *               background gradient. The value <code>null</code> can be used inside the array of 
-     *               Color to specify the background color.
-     * @param percents an array of integers between 0 and 100 specifying the percent of the width 
-     *                 of the widget at which the color should change.  The size of the percents array must be one 
-     *                 less than the size of the colors array.
-     * 
-     * @exception SWTError <ul>
-     *		<li>ERROR_THREAD_INVALID_ACCESS when called from the wrong thread</li>
-     *		<li>ERROR_WIDGET_DISPOSED when the widget has been disposed</li>
-     *	</ul>
-     */
-
-    public void setSelectionBackground(Color[] colors, int[] percents) {
-        checkWidget();
-        if (colors != null) {
-            if (percents == null || percents.length != colors.length - 1) {
-                SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-            }
-            if (getDisplay().getDepth() < 15) {
-                // Don't use gradients on low color displays
-                colors = new Color[] { colors[0] };
-                percents = new int[] {};
-            }
-            for (int i = 0; i < percents.length; i++) {
-                if (percents[i] < 0 || percents[i] > 100) {
-                    SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-                }
-                if (i > 0 && percents[i] < percents[i - 1]) {
-                    SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-                }
-            }
-        }
-
-        // Are these settings the same as before?
-        if (backgroundImage == null) {
-            if ((gradientColors != null) && (colors != null)
-                    && (gradientColors.length == colors.length)) {
-                boolean same = false;
-                for (int i = 0; i < gradientColors.length; i++) {
-                    if (gradientColors[i] == null) {
-                        same = colors[i] == null;
-                    } else {
-                        same = gradientColors[i].equals(colors[i]);
-                    }
-                    if (!same) {
-						break;
-					}
-                }
-                if (same) {
-                    for (int i = 0; i < gradientPercents.length; i++) {
-                        same = gradientPercents[i] == percents[i];
-                        if (!same) {
-							break;
-						}
-                    }
-                }
-                if (same) {
-					return;
-				}
-            }
-        } else {
-            backgroundImage = null;
-        }
-        // Store the new settings
-        if (colors == null) {
-            gradientColors = null;
-            gradientPercents = null;
-            closeBar.setBackground(background);
-        } else {
-            gradientColors = new Color[colors.length];
-            for (int i = 0; i < colors.length; ++i) {
-				gradientColors[i] = colors[i];
-			}
-            gradientPercents = new int[percents.length];
-            for (int i = 0; i < percents.length; ++i) {
-				gradientPercents[i] = percents[i];
-			}
-            if (getDisplay().getDepth() < 15) {
-				closeBar.setBackground(background);
-			} else {
-				closeBar
-                        .setBackground(gradientColors[gradientColors.length - 1]);
-			}
-        }
-
-        // Refresh with the new settings
-        if (selectedIndex > -1) {
-			redrawTabArea(selectedIndex);
-		}
-    }
-
-    /**
-     * Set the image to be drawn in the background of the selected tab.
-     * 
-     * @param image the image to be drawn in the background
-     * 
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setSelectionBackground(Image image) {
-        checkWidget();
-        if (image == backgroundImage) {
-			return;
-		}
-        if (image != null) {
-            gradientColors = null;
-            gradientPercents = null;
-        }
-        backgroundImage = image;
-        redrawTabArea(selectedIndex);
-    }
-
-    /**
-     * Toggle the visibility of the border
-     * 
-     * @param show true if the border should be displayed
-     * 
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setBorderVisible(boolean show) {
-        checkWidget();
-        //	if (showBorders == show) return;
-
-        showBorders = show;
-        if (showBorders) {
-            if ((getStyle() & SWT.FLAT) != 0) {
-                borderBottom = borderTop = borderLeft = borderRight = 1;
-            } else {
-                borderLeft = borderTop = 1;
-                borderRight = borderBottom = 3;
-            }
-        } else {
-            borderBottom = borderTop = borderLeft = borderRight = 0;
-        }
-        oldSize = null;
-        notifyListeners(SWT.Resize, new Event());
-    }
-
-    public void setFont(Font font) {
-        checkWidget();
-        if (font != null && font.equals(getFont())) {
-			return;
-		}
-        super.setFont(font);
-        oldFont = getFont();
-        resetTabSize(true);
-    }
-
-    /**
-     * Set the foreground color of the selected tab.
-     * 
-     * @param color the color of the text displayed in the selected tab
-     * 
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setSelectionForeground(Color color) {
-        checkWidget();
-        if (selectionForeground == color) {
-			return;
-		}
-        if (color == null) {
-			color = getForeground();
-		}
-        selectionForeground = color;
-        if (selectedIndex > -1) {
-            redrawTabArea(selectedIndex);
-        }
-    }
-
-    /**
-     * Display an insert marker before or after the specified tab item. 
-     * 
-     * A value of null will clear the mark.
-     * 
-     * @param item the item with which the mark is associated or null
-     * 
-     * @param after true if the mark should be displayed after the specified item
-     * 
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setInsertMark(CTabItem item, boolean after) {
-        checkWidget();
-        int index = -1;
-        if (item != null) {
-            index = indexOf(item);
-        }
-        setInsertMark(index, after);
-    }
-
-    /**
-     * Display an insert marker before or after the specified tab item.
-     * 
-     * A value of -1 will clear the mark.
-     * 
-     * @param index the index of the item with which the mark is associated or null
-     * 
-     * @param after true if the mark should be displayed after the specified item
-     * 
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setInsertMark(int index, boolean after) {
-        checkWidget();
-        if (index < -1 || index >= getItemCount()) {
-            SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-        }
-
-        if (index == -1) {
-            index = -2;
-        } else {
-            index = after ? index : --index;
-        }
-
-        if (insertionIndex == index) {
-			return;
-		}
-        int oldIndex = insertionIndex;
-        insertionIndex = index;
-        if (index > -1) {
-			redrawTabArea(index);
-		}
-        if (oldIndex > 1) {
-			redrawTabArea(oldIndex);
-		}
-    }
-
-    /**
-     * Set the selection to the tab at the specified index.
-     * 
-     * @param index the index of the tab item to be selected
-     * 
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setSelection(int index) {
-        checkWidget();
-        if (index < 0 || index >= items.length) {
-			return;
-		}
-        if (selectedIndex == index) {
-			return;
-		}
-
-        int oldIndex = selectedIndex;
-        selectedIndex = index;
-
-        Control control = items[index].control;
-        if (control != null && !control.isDisposed()) {
-            control.setBounds(getClientArea());
-            control.setVisible(true);
-        }
-
-        if (oldIndex != -1) {
-            control = items[oldIndex].control;
-            if (control != null && !control.isDisposed()) {
-                control.setVisible(false);
-            }
-        }
-        showItem(items[selectedIndex]);
-        setButtonBounds();
-        redrawTabArea(-1);
-    }
-
-    /**
-     * Set the control that appears in the top right corner of the tab folder.
-     * Typically this is a close button or a composite with a Menu and close button. 
-     * The topRight control is optional.  Setting the top right control to null will remove it from the tab folder.
-     *
-     * @since 2.1
-     * 
-     * @param control the control to be displayed in the top right corner or null
-     *
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     *    <li>ERROR_INVALID_ARGUMENT - if the control is not a child of this CTabFolder</li>
-     * </ul>
-     */
-    public void setTopRight(Control control) {
-        checkWidget();
-        if (control != null && control.getParent() != this) {
-            SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-        }
-        topRight = control;
-        resetTabSize(true);
-    }
-
-    /**
-     * Shows the item.  If the item is already showing in the receiver,
-     * this method simply returns.  Otherwise, the items are scrolled until
-     * the item is visible.
-     *
-     * @param item the item to be shown
-     *
-     * @exception IllegalArgumentException <ul>
-     *    <li>ERROR_NULL_ARGUMENT - if the item is null</li>
-     *    <li>ERROR_INVALID_ARGUMENT - if the item has been disposed</li>
-     * </ul>
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     *
-     * @see CTabFolder#showSelection()
-     * 
-     * @since 2.0
-     */
-    public void showItem(CTabItem item) {
-        checkWidget();
-        if (item == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-        if (item.isDisposed()) {
-			SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-		}
-
-        int index = indexOf(item);
-        if (index < topTabIndex) {
-            topTabIndex = index;
-            setItemLocation();
-            redrawTabArea(-1);
-            return;
-        }
-        Rectangle area = getClientArea();
-        if (area.width <= 0) {
-            topTabIndex = index;
-            return;
-        }
-        int rightEdge = area.x + area.width;
-        Rectangle rect = getToolSpace();
-        if (rect.width > 0) {
-            rightEdge -= rect.width;
-        }
-        if (item.x + item.width < rightEdge) {
-			return;
-		}
-        setLastItem(index);
-    }
-
-    /**
-     * Shows the selection.  If the selection is already showing in the receiver,
-     * this method simply returns.  Otherwise, the items are scrolled until
-     * the selection is visible.
-     *
-     * @exception IllegalArgumentException <ul>
-     *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-     * </ul>
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     *
-     * @see CTabFolder#showItem(CTabItem)
-     * 
-     * @since 2.0
-     * 
-     */
-    public void showSelection() {
-        checkWidget();
-        if (selectedIndex != -1) {
-            showItem(getSelection());
-        }
-    }
-
-    char getMnemonic(String string) {
-        int index = 0;
-        int length = string.length();
-        do {
-            while ((index < length) && (string.charAt(index) != '&')) {
-				index++;
-			}
-            if (++index >= length) {
-				return '\0';
-			}
-            if (string.charAt(index) != '&') {
-				return string.charAt(index);
-			}
-            index++;
-        } while (index < length);
-        return '\0';
-    }
-
-    /**
-     * Set the selection to the tab at the specified item.
-     * 
-     * @param item the tab item to be selected
-     * 
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     *    <li>ERROR_NULL_ARGUMENT - if argument is null</li>
-     * </ul>
-     */
-    public void setSelection(CTabItem item) {
-        checkWidget();
-        if (item == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-        int index = indexOf(item);
-        setSelection(index);
-    }
-
-    /**
-     * Set the selection to the tab at the specified index.
-     */
-    private void setSelection(int index, boolean notify) {
-        int oldSelectedIndex = selectedIndex;
-        setSelection(index);
-        if (notify && selectedIndex != oldSelectedIndex && selectedIndex != -1) {
-            Event event = new Event();
-            event.item = getItem(selectedIndex);
-            notifyListeners(SWT.Selection, event);
-        }
-    }
-
-    private Image scaleImage(Image image, int oldSize, int newSize) {
-        Display display = getDisplay();
-        Color foreground = getForeground();
-        Color black = display.getSystemColor(SWT.COLOR_BLACK);
-        Color background = getBackground();
-        PaletteData palette = new PaletteData(new RGB[] { foreground.getRGB(),
-                background.getRGB(), black.getRGB() });
-        ImageData imageData = new ImageData(newSize, newSize, 4, palette);
-        imageData.transparentPixel = 1;
-        Image temp = new Image(display, imageData);
-        GC gc = new GC(temp);
-        gc.setBackground(background);
-        gc.fillRectangle(0, 0, newSize, newSize);
-        gc.drawImage(image, 0, 0, oldSize, oldSize, 0, 0, newSize, newSize);
-        gc.dispose();
-        return temp;
-    }
-
-    private void updateCloseBar() {
-        //Temporary code - need a better way to determine toolBar trim
-        int toolbarTrim = 4;
-        if (Util.isPhoton()) {
-			toolbarTrim = 6;
-		}
-        if (Util.isGtk()) {
-			toolbarTrim = 8;
-		}
-
-        int maxHeight = tabHeight - CTabItem.TOP_MARGIN
-                - CTabItem.BOTTOM_MARGIN - toolbarTrim;
-        if (maxHeight < 3) {
-			return;
-		}
-        int imageHeight = (maxHeight < 9) ? 9 : maxHeight;
-
-        if (closeImage != null && closeImage.getBounds().height == imageHeight) {
-			return;
-		}
-
-        if (closeBar != null) {
-			closeBar.dispose();
-		}
-        closeBar = null;
-        if (inactiveCloseBar != null) {
-			inactiveCloseBar.dispose();
-		}
-        inactiveCloseBar = null;
-        createCloseBar();
-
-        ToolItem closeItem = closeBar.getItems()[0];
-        ToolItem inactiveCloseItem = inactiveCloseBar.getItems()[0];
-
-        if (closeImage != null) {
-			closeImage.dispose();
-		}
-
-        Display display = getDisplay();
-        Color foreground = getForeground();
-        Color black = display.getSystemColor(SWT.COLOR_BLACK);
-        Color background = getBackground();
-
-        PaletteData palette = new PaletteData(new RGB[] { foreground.getRGB(),
-                background.getRGB(), black.getRGB() });
-        ImageData imageData = new ImageData(imageHeight, imageHeight, 4,
-                palette);
-        imageData.transparentPixel = 1;
-        closeImage = new Image(display, imageData);
-        GC gc = new GC(closeImage);
-        gc.setBackground(background);
-        gc.fillRectangle(0, 0, imageHeight, imageHeight);
-        gc.setForeground(black);
-
-        //draw an 9x8 'x' centered in image
-        int h = (imageHeight / 2) * 2;
-        int inset = (h - 8) / 2;
-        gc.drawLine(inset, inset, h - inset - 1, h - inset - 1);
-        gc.drawLine(inset + 1, inset, h - inset, h - inset - 1);
-        gc.drawLine(inset, h - inset - 1, h - inset - 1, inset);
-        gc.drawLine(inset + 1, h - inset - 1, h - inset, inset);
-
-        gc.dispose();
-
-        if (maxHeight < imageHeight) {
-            //rescale image
-            Image temp = scaleImage(closeImage, imageHeight, maxHeight);
-            closeImage.dispose();
-            closeImage = temp;
-        }
-        closeItem.setImage(closeImage);
-        inactiveCloseItem.setImage(closeImage);
-    }
-
-    private void updateArrowBar() {
-        //Temporary code - need a better way to determine toolBar trim
-        int toolbarTrim = 6; // Windows needs 6, photon needs 6, gtk needs 8
-        if (Util.isGtk()) {
-			toolbarTrim = 8;
-		}
-
-        int maxHeight = tabHeight - toolbarTrim;
-        if (maxHeight < 3) {
-			return;
-		}
-        int imageHeight = (maxHeight < 9) ? 9 : maxHeight;
-
-        if (arrowLeftImage != null
-                && arrowLeftImage.getBounds().height == imageHeight) {
-			return;
-		}
-
-        if (arrowBar != null) {
-			arrowBar.dispose();
-		}
-        arrowBar = null;
-        if (arrowLeftImage != null) {
-			arrowLeftImage.dispose();
-		}
-        if (arrowRightImage != null) {
-			arrowRightImage.dispose();
-		}
-
-        createArrowBar();
-        ToolItem[] items = arrowBar.getItems();
-        ToolItem left = items[0];
-        ToolItem right = items[1];
-
-        Display display = getDisplay();
-        Color foreground = getForeground();
-        Color black = display.getSystemColor(SWT.COLOR_BLACK);
-        Color background = getBackground();
-
-        PaletteData palette = new PaletteData(new RGB[] { foreground.getRGB(),
-                background.getRGB(), black.getRGB() });
-        ImageData imageData = new ImageData(7, imageHeight, 4, palette);
-        imageData.transparentPixel = 1;
-        arrowLeftImage = new Image(display, imageData);
-        GC gc = new GC(arrowLeftImage);
-        gc.setBackground(background);
-        gc.fillRectangle(0, 0, 7, imageHeight);
-        gc.setBackground(black);
-        //draw a 9x5 '<' centered vertically in image
-        int h = (imageHeight / 2) * 2;
-        int midpoint = h / 2 - 1;
-        int[] pointArr = new int[] { 6, midpoint - 5, 1, midpoint, 6,
-                midpoint + 5, };
-        gc.fillPolygon(pointArr);
-        gc.dispose();
-
-        palette = new PaletteData(new RGB[] { foreground.getRGB(),
-                background.getRGB(), black.getRGB() });
-        imageData = new ImageData(7, imageHeight, 4, palette);
-        imageData.transparentPixel = 1;
-        arrowRightImage = new Image(display, imageData);
-        gc = new GC(arrowRightImage);
-        gc.setBackground(background);
-        gc.fillRectangle(0, 0, 7, imageHeight);
-        gc.setBackground(black);
-        //draw a 9x5 '>' centered vertically in image
-        pointArr = new int[] { 1, midpoint - 5, 6, midpoint, 1, midpoint + 5, };
-        gc.fillPolygon(pointArr);
-        gc.dispose();
-
-        if (maxHeight < imageHeight) {
-            //rescale image
-            Image leftTemp = scaleImage(arrowLeftImage, imageHeight, maxHeight);
-            arrowLeftImage.dispose();
-            arrowLeftImage = leftTemp;
-
-            Image rightTemp = scaleImage(arrowRightImage, imageHeight,
-                    maxHeight);
-            arrowRightImage.dispose();
-            arrowRightImage = rightTemp;
-        }
-        left.setImage(arrowLeftImage);
-        right.setImage(arrowRightImage);
-    }
-
-    private void onMouseDoubleClick(Event event) {
-        Event e = new Event();
-        e.item = getItem(new Point(event.x, event.y));
-        notifyListeners(SWT.DefaultSelection, e);
-    }
-
-    /** 
-     * A mouse button was pressed down. 
-     * If a tab was hit select the tab.
-     */
-    private void onMouseDown(Event event) {
-        for (int i = 0; i < items.length; i++) {
-            if (items[i].getBounds().contains(new Point(event.x, event.y))) {
-                if (i == selectedIndex) {
-                    showSelection();
-                    return;
-                }
-                forceFocus();
-                setSelection(i, true);
-                if (isFocusControl()) {
-					setFocus();
-				}
-                return;
-            }
-        }
-    }
-
-    private void onMouseExit(Event event) {
-        Rectangle inactiveBounds = inactiveCloseBar.getBounds();
-        if (inactiveBounds.contains(event.x, event.y)) {
-			return;
-		}
-        inactiveCloseBar.setVisible(false);
-        inactiveItem = null;
-
-        showToolTip = false;
-        toolTipItem = null;
-        if (tip != null && !tip.isDisposed() && tip.isVisible()) {
-			tip.setVisible(false);
-		}
-    }
-
-    private void onMouseHover(Event event) {
-        if (tip == null || tip.isDisposed()) {
-			return;
-		}
-        showToolTip = true;
-        showToolTip(event.x, event.y);
-    }
-
-    private void showToolTip(int x, int y) {
-        CTabItem item = getItem(new Point(x, y));
-        if (item != null) {
-            if (item == toolTipItem) {
-				return;
-			}
-            toolTipItem = item;
-            String tooltip = item.getToolTipText();
-            if (tooltip != null && tooltip.length() > 0) {
-                Display display = tip.getDisplay();
-                label.setForeground(display
-                        .getSystemColor(SWT.COLOR_INFO_FOREGROUND));
-                label.setBackground(display
-                        .getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-                label.setText(tooltip);
-                Point labelSize = label.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-                labelSize.x += 2;
-                labelSize.y += 2;
-                label.setSize(labelSize);
-                tip.pack();
-                /*
-                 * On some platforms, there is a minimum size for a shell  
-                 * which may be greater than the label size.
-                 * To avoid having the background of the tip shell showing
-                 * around the label, force the label to fill the entire client area.
-                 */
-                Rectangle area = tip.getClientArea();
-                label.setSize(area.width, area.height);
-                /*
-                 * Position the tooltip and ensure that it is not located off
-                 * the screen.
-                 */
-                Point pt = new Point(item.x + item.width / 4, item.y
-                        + item.height + 2);
-                pt = toDisplay(pt);
-                Rectangle rect = display.getBounds();
-                Point tipSize = tip.getSize();
-                pt.x = Math.max(0, Math.min(pt.x, rect.width - tipSize.x));
-                pt.y = Math.max(0, Math.min(pt.y, rect.height - tipSize.y));
-                tip.setLocation(pt);
-                tip.setVisible(true);
-                return;
-            }
-        }
-
-        toolTipItem = null;
-        if (tip != null && !tip.isDisposed() && tip.isVisible()) {
-			tip.setVisible(false);
-		}
-    }
-
-    private void onMouseMove(Event event) {
-        if (showToolTip) {
-            showToolTip(event.x, event.y);
-        }
-
-        if (!showClose) {
-			return;
-		}
-
-        CTabItem item = null;
-        for (int i = 0; i < items.length; i++) {
-            Rectangle rect = items[i].getBounds();
-            if (rect.contains(new Point(event.x, event.y))) {
-                item = items[i];
-                break;
-            }
-        }
-        if (item == inactiveItem) {
-			return;
-		}
-
-        inactiveCloseBar.setVisible(false);
-        inactiveItem = null;
-
-        if (item == null || item == getSelection()) {
-			return;
-		}
-
-        int toolbarHeight = tabHeight - CTabItem.TOP_MARGIN
-                - CTabItem.BOTTOM_MARGIN + 2; // +2 to ignore gap between focus rectangle
-        Point size = inactiveCloseBar.computeSize(SWT.DEFAULT, toolbarHeight);
-        int x = item.x + item.width - size.x - 2; // -2 to not overlap focus rectangle and trim
-        int y = item.y + Math.max(0, (item.height - toolbarHeight) / 2);
-        Rectangle toolspace = getToolSpace();
-        Point folderSize = getSize();
-        if ((toolspace.width == 0 || x < toolspace.x)
-                && x + size.x < folderSize.x - borderRight) {
-            inactiveCloseBar.setBounds(x, y, size.x, toolbarHeight);
-            inactiveCloseBar.setVisible(true);
-            inactiveItem = item;
-        }
-    }
-
-    private void onTraverse(Event event) {
-        switch (event.detail) {
-        case SWT.TRAVERSE_ESCAPE:
-        // TEMPORARY CODE See bug report 17372
-        //		case SWT.TRAVERSE_RETURN:
-        case SWT.TRAVERSE_TAB_NEXT:
-        case SWT.TRAVERSE_TAB_PREVIOUS:
-            event.doit = true;
-            break;
-        case SWT.TRAVERSE_MNEMONIC:
-            event.doit = onMnemonic(event);
-            if (event.doit) {
-				event.detail = SWT.TRAVERSE_NONE;
-			}
-            break;
-        case SWT.TRAVERSE_PAGE_NEXT:
-        case SWT.TRAVERSE_PAGE_PREVIOUS:
-            event.doit = onPageTraversal(event);
-            if (event.doit) {
-				event.detail = SWT.TRAVERSE_NONE;
-			}
-            break;
-        }
-    }
-
-    private boolean onPageTraversal(Event event) {
-        int count = getItemCount();
-        if (count == 0) {
-			return false;
-		}
-        int index = getSelectionIndex();
-        if (index == -1) {
-            index = 0;
-        } else {
-            int offset = (event.detail == SWT.TRAVERSE_PAGE_NEXT) ? 1 : -1;
-            index = (index + offset + count) % count;
-        }
-        setSelection(index, true);
-        return true;
-    }
-
-    /**
-     * Answer true if not all tabs can be visible in the receive
-     * thus requiring the scroll buttons to be visible.
-     */
-    private boolean scroll_leftVisible() {
-        return topTabIndex > 0;
-    }
-
-    /**
-     * Answer true if not all tabs can be visible in the receive
-     * thus requiring the scroll buttons to be visible.
-     */
-    private boolean scroll_rightVisible() {
-        // only show Scroll buttons if there is more than one item
-        // and if we are not already at the last item
-        if (items.length < 2) {
-			return false;
-		}
-        Rectangle area = getClientArea();
-        int rightEdge = area.x + area.width;
-        if (rightEdge <= 0) {
-			return false;
-		}
-        if (topTabIndex > 0) {
-            rightEdge -= arrowBar.getSize().x;
-        }
-        if (topRight != null) {
-            rightEdge -= topRight.getSize().x;
-        }
-        CTabItem item = items[items.length - 1];
-        return (item.x + item.width > rightEdge);
-    }
-
-    /**
-     * Scroll the tab items to the left.
-     */
-    private void scroll_scrollLeft() {
-        if (items.length == 0) {
-			return;
-		}
-        setLastItem(topTabIndex - 1);
-    }
-
-    /**
-     * Scroll the tab items to the right.
-     */
-    private void scroll_scrollRight() {
-        int lastIndex = getLastItem();
-        topTabIndex = lastIndex + 1;
-        setItemLocation();
-        correctLastItem();
-        redrawTabArea(-1);
-    }
-
-    private boolean correctLastItem() {
-        Rectangle area = getClientArea();
-        int rightEdge = area.x + area.width;
-        if (rightEdge <= 0) {
-			return false;
-		}
-        Rectangle toolspace = getToolSpace();
-        if (toolspace.width > 0) {
-            rightEdge -= toolspace.width;
-        }
-        CTabItem item = items[items.length - 1];
-        if (item.x + item.width < rightEdge) {
-            setLastItem(items.length - 1);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Specify a fixed height for the tab items.  If no height is specified,
-     * the default height is the height of the text or the image, whichever 
-     * is greater. Specifying a height of 0 will revert to the default height.
-     * 
-     * @param height the pixel value of the height or 0
-     * 
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     *    <li>ERROR_INVALID_ARGUMENT - if called with a height of less than 0</li>
-     * </ul>
-     */
-    public void setTabHeight(int height) {
-        checkWidget();
-        if (height < 0) {
-            SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-        }
-        fixedTabHeight = true;
-        if (tabHeight == height) {
-			return;
-		}
-        tabHeight = height;
-        oldSize = null;
-        notifyListeners(SWT.Resize, new Event());
-    }
-
-    void resetTabSize(boolean checkHeight) {
-        int oldHeight = tabHeight;
-        if (!fixedTabHeight && checkHeight) {
-            int tempHeight = 0;
-            GC gc = new GC(this);
-            for (int i = 0; i < items.length; i++) {
-                tempHeight = Math.max(tempHeight, items[i].preferredHeight(gc));
-            }
-            gc.dispose();
-            if (topRight != null) {
-				tempHeight = Math.max(tempHeight, topRight.computeSize(
-                        SWT.DEFAULT, SWT.DEFAULT).y);
-			}
-            tabHeight = tempHeight;
-        }
-
-        if (tabHeight != oldHeight) {
-            oldSize = null;
-            notifyListeners(SWT.Resize, new Event());
-        } else {
-            setItemBounds();
-            redraw();
-        }
-    }
-
-    /**
-     * 
-     * @param position 
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     *    <li>ERROR_INVALID_ARGUMENT - if the position value is not either SWT.TOP or SWT.BOTTOM</li>
-     * </ul>
-     * 
-     * UNDER CONSTRUCTION
-     * @since 3.0
-     */
-    public void setTabPosition(int position) {
-        checkWidget();
-        if (position != SWT.TOP && position != SWT.BOTTOM) {
-            SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-        }
-        if (onBottom != (position == SWT.BOTTOM)) {
-            onBottom = position == SWT.BOTTOM;
-            setBorderVisible(showBorders);
-            resetTabSize(true);
-            //		updateTabHeight(true);
-            //		Rectangle rectBefore = getClientArea();
-            //		updateItems();
-            //		Rectangle rectAfter = getClientArea();
-            //		if (!rectBefore.equals(rectAfter)) {
-            //			notifyListeners(SWT.Resize, new Event());
-            //		}
-            //		setItemBounds();
-            //		redrawTabArea(-1);
-            //		redraw();
-        }
-    }
-
-    /**
-     * @return one of {@link SWT#TOP} or {@link SWT#BOTTOM}
-     */
-    public int getTabPosition() {
-        if (onBottom) {
-			return SWT.BOTTOM;
-		}
-        return SWT.TOP;
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/CTabFolderEvent.java b/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/CTabFolderEvent.java
deleted file mode 100644
index 7b4a880..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/CTabFolderEvent.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.presentations.r21.widgets;
-
-import org.eclipse.swt.events.TypedEvent;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- *
- */
-public class CTabFolderEvent extends TypedEvent {
-
-    /**
-     * Generated serial version UID for this class.
-     * @since 3.1
-     */
-    private static final long serialVersionUID = 3258688793199719730L;
-
-    /**
-     * 
-     */
-    public Widget item;
-
-    /**
-     * 
-     */
-    public boolean doit;
-
-    CTabFolderEvent(Widget w) {
-        super(w);
-    }
-}
diff --git a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/CTabFolderListener.java b/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/CTabFolderListener.java
deleted file mode 100644
index 4d07e63..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/CTabFolderListener.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.presentations.r21.widgets;
-
-/**
- */
-public interface CTabFolderListener {
-    /**
-     * @param event
-     */
-    public void itemClosed(CTabFolderEvent event);
-}
diff --git a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/CTabItem.java b/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/CTabItem.java
deleted file mode 100644
index 594e014..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/CTabItem.java
+++ /dev/null
@@ -1,623 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.presentations.r21.widgets;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- */
-public class CTabItem extends Item {
-    CTabFolder parent;
-
-    int x, y, width, height = 0;
-
-    String toolTipText;
-
-    Control control; // the tab page
-
-    private Image disabledImage;
-
-    // internal constants
-    static final int LEFT_MARGIN = 4;
-
-    static final int RIGHT_MARGIN = 4;
-
-    static final int TOP_MARGIN = 3;
-
-    static final int BOTTOM_MARGIN = 3;
-
-    private static final int INTERNAL_SPACING = 2;
-
-    private static final String ellipsis = "..."; //$NON-NLS-1$
-
-    String shortenedText;
-
-    int shortenedTextWidth;
-
-    /**
-     * Constructs a new instance of this class given its parent
-     * (which must be a <code>CTabFolder</code>) and a style value
-     * describing its behavior and appearance. The item is added
-     * to the end of the items maintained by its parent.
-     * <p>
-     * The style value is either one of the style constants defined in
-     * class <code>SWT</code> which is applicable to instances of this
-     * class, or must be built by <em>bitwise OR</em>'ing together 
-     * (that is, using the <code>int</code> "|" operator) two or more
-     * of those <code>SWT</code> style constants. The class description
-     * lists the style constants that are applicable to the class.
-     * Style bits are also inherited from superclasses.
-     * </p>
-     *
-     * @param parent a CTabFolder which will be the parent of the new instance (cannot be null)
-     * @param style the style of control to construct
-     *
-     * @exception IllegalArgumentException <ul>
-     *    <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
-     * </ul>
-     * @exception SWTException <ul>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
-     * </ul>
-     *
-     * @see SWT
-     * @see Widget#getStyle
-     */
-    public CTabItem(CTabFolder parent, int style) {
-        this(parent, style, parent.getItemCount());
-    }
-
-    /**
-     * Constructs a new instance of this class given its parent
-     * (which must be a <code>CTabFolder</code>), a style value
-     * describing its behavior and appearance, and the index
-     * at which to place it in the items maintained by its parent.
-     * <p>
-     * The style value is either one of the style constants defined in
-     * class <code>SWT</code> which is applicable to instances of this
-     * class, or must be built by <em>bitwise OR</em>'ing together 
-     * (that is, using the <code>int</code> "|" operator) two or more
-     * of those <code>SWT</code> style constants. The class description
-     * lists the style constants that are applicable to the class.
-     * Style bits are also inherited from superclasses.
-     * </p>
-     *
-     * @param parent a CTabFolder which will be the parent of the new instance (cannot be null)
-     * @param style the style of control to construct
-     * @param index the index to store the receiver in its parent
-     *
-     * @exception IllegalArgumentException <ul>
-     *    <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
-     * </ul>
-     * @exception SWTException <ul>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
-     * </ul>
-     *
-     * @see SWT
-     * @see Widget#getStyle
-     */
-    public CTabItem(CTabFolder parent, int style, int index) {
-        super(parent, checkStyle(style));
-        parent.createItem(this, index);
-    }
-
-    /**
-	 * @param style  
-	 */
-    private static int checkStyle(int style) {
-        return SWT.NONE;
-    }
-
-    public void dispose() {
-        if (isDisposed()) {
-			return;
-		}
-        parent.destroyItem(this);
-        super.dispose();
-        parent = null;
-        control = null;
-        toolTipText = null;
-    }
-
-    /**
-     * Returns a rectangle describing the receiver's size and location
-     * relative to its parent.
-     *
-     * @return the receiver's bounding column rectangle
-     *
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public Rectangle getBounds() {
-        //checkWidget();
-        return new Rectangle(x, y, width, height);
-    }
-
-    /**
-     * Gets the control that is displayed in the content are of the tab item.
-     *
-     * @return the control
-     *
-     * @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
-     *	when called from the wrong thread
-     * @exception SWTError(ERROR_WIDGET_DISPOSED)
-     *	when the widget has been disposed
-     */
-    public Control getControl() {
-        checkWidget();
-        return control;
-    }
-
-    public Display getDisplay() {
-        if (parent == null) {
-			SWT.error(SWT.ERROR_WIDGET_DISPOSED);
-		}
-        return parent.getDisplay();
-    }
-
-    /**
-     * Get the image displayed in the tab if the tab is disabled.
-     * 
-     * @return the disabled image or null
-     */
-    public Image getDisabledImage() {
-        //checkWidget();
-        return disabledImage;
-    }
-
-    /**
-     * Returns the receiver's parent, which must be a <code>CTabFolder</code>.
-     *
-     * @return the receiver's parent
-     */
-    public CTabFolder getParent() {
-        //checkWidget();
-        return parent;
-    }
-
-    /**
-     * Returns the receiver's tool tip text, or null if it has
-     * not been set.
-     *
-     * @return the receiver's tool tip text
-     *
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public String getToolTipText() {
-        checkWidget();
-        return toolTipText;
-    }
-
-    /**
-     * Paint the receiver.
-     */
-    void onPaint(GC gc, boolean isSelected) {
-
-        if (width == 0 || height == 0) {
-			return;
-		}
-
-        Display display = getDisplay();
-        Color highlightShadow = display
-                .getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW);
-        Color normalShadow = display
-                .getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW);
-
-        int index = parent.indexOf(this);
-
-        if (isSelected) {
-
-            Rectangle bounds = null;
-            if (!parent.onBottom) {
-                if (index == parent.topTabIndex) {
-                    bounds = new Rectangle(x + 1, y + 1, width - 2, height - 1);
-                } else {
-                    bounds = new Rectangle(x + 2, y + 1, width - 3, height - 1);
-                }
-            } else {
-                if (index == parent.topTabIndex) {
-                    bounds = new Rectangle(x + 1, y + 1, width - 2, height - 2);
-                } else {
-                    bounds = new Rectangle(x + 2, y + 1, width - 3, height - 2);
-                }
-            }
-            if (parent.backgroundImage != null) {
-                // draw a background image behind the text
-                Rectangle imageRect = parent.backgroundImage.getBounds();
-                gc.drawImage(parent.backgroundImage, 0, 0, imageRect.width,
-                        imageRect.height, bounds.x, bounds.y, bounds.width,
-                        bounds.height);
-            } else if (parent.gradientColors != null) {
-                // draw a gradient behind the text
-                Color oldBackground = gc.getBackground();
-                if (parent.gradientColors.length == 1) {
-                    if (parent.gradientColors[0] != null) {
-						gc.setBackground(parent.gradientColors[0]);
-					}
-                    gc.fillRectangle(bounds.x, bounds.y, bounds.width,
-                            bounds.height);
-                } else {
-                    Color oldForeground = gc.getForeground();
-                    Color lastColor = parent.gradientColors[0];
-                    if (lastColor == null) {
-						lastColor = oldBackground;
-					}
-                    for (int i = 0, pos = 0; i < parent.gradientPercents.length; ++i) {
-                        gc.setForeground(lastColor);
-                        lastColor = parent.gradientColors[i + 1];
-                        if (lastColor == null) {
-							lastColor = oldBackground;
-						}
-                        gc.setBackground(lastColor);
-                        int gradientWidth = (parent.gradientPercents[i]
-                                * bounds.width / 100)
-                                - pos;
-                        gc.fillGradientRectangle(bounds.x + pos, bounds.y,
-                                gradientWidth, bounds.height, false);
-                        pos += gradientWidth;
-                    }
-                    gc.setForeground(oldForeground);
-                }
-                gc.setBackground(oldBackground);
-            }
-
-            // draw tab lines
-            if (!parent.onBottom) {
-                gc.setForeground(normalShadow);
-                if (index != parent.topTabIndex) {
-                    gc.drawLine(x + 1, y, x + 1, y);
-                    gc.drawLine(x, y + 1, x, y + height - 2);
-                    gc.drawLine(x, y + height - 1, x, y + height - 1);
-                }
-                gc.drawLine(x + width - 1, y, x + width - 1, y);
-                gc.drawLine(x + width, y + 1, x + width, y + height - 2);
-                gc.drawLine(x + width, y + height - 1, x + width, y + height
-                        - 1);
-
-                gc.setForeground(highlightShadow);
-                if (index != parent.topTabIndex) {
-                    gc.drawLine(x + 2, y, x + 2, y);
-                    gc.drawLine(x + 1, y + 1, x + 1, y + height - 2);
-                    gc.drawLine(x + 1, y + height - 1, x + 1, y + height - 1);
-                } else {
-                    gc.drawLine(x, y, x, y + height - 1);
-                }
-
-                gc.drawLine(x + width - 2, y, x + width - 2, y);
-                gc
-                        .drawLine(x + width - 1, y + 1, x + width - 1, y
-                                + height - 2);
-                gc.drawLine(x + width - 1, y + height - 1, x + width - 1, y
-                        + height - 1);
-
-                // light line across top
-                if (index != parent.topTabIndex) {
-                    gc.drawLine(x + 3, y, x + width - 3, y);
-                } else {
-                    gc.drawLine(x + 1, y, x + width - 3, y);
-                }
-            } else {
-                gc.setForeground(normalShadow);
-                if (index != parent.topTabIndex) {
-                    gc.drawLine(x, y, x, y);
-                    gc.drawLine(x, y + 1, x, y + height - 2);
-                    gc.drawLine(x + 1, y + height - 1, x + 1, y + height - 1);
-                }
-                gc.drawLine(x + width, y, x + width, y);
-                gc.drawLine(x + width, y + 1, x + width, y + height - 2);
-                gc.drawLine(x + width - 1, y + height - 1, x + width - 1, y
-                        + height - 1);
-
-                gc.setForeground(highlightShadow);
-                if (index != parent.topTabIndex) {
-                    gc.drawLine(x + 1, y, x + 1, y);
-                    gc.drawLine(x + 1, y + 1, x + 1, y + height - 2);
-                    gc.drawLine(x + 2, y + height - 1, x + 2, y + height - 1);
-                } else {
-                    gc.drawLine(x, y, x, y + height - 1);
-                }
-
-                gc.drawLine(x + width - 1, y, x + width - 1, y);
-                gc
-                        .drawLine(x + width - 1, y + 1, x + width - 1, y
-                                + height - 2);
-                gc.drawLine(x + width - 2, y + height - 1, x + width - 2, y
-                        + height - 1);
-
-                // light line across top and bottom
-                if (index != parent.topTabIndex) {
-                    gc.drawLine(x + 1, y, x + width - 2, y);
-                    gc.drawLine(x + 2, y + height - 1, x + width - 3, y
-                            + height - 1);
-                } else {
-                    gc.drawLine(x + 1, y, x + width - 2, y);
-                    gc.drawLine(x + 1, y + height - 1, x + width - 3, y
-                            + height - 1);
-                }
-            }
-            if (parent.isFocusControl()) {
-                // draw a focus rectangle
-                int x1, y1, width1, height1;
-                if (!parent.onBottom) {
-                    if (index == parent.topTabIndex) {
-                        x1 = x + 1;
-                        y1 = y + 1;
-                        width1 = width - 2;
-                        height1 = height - 1;
-                    } else {
-                        x1 = x + 2;
-                        y1 = y + 1;
-                        width1 = width - 3;
-                        height1 = height - 1;
-                    }
-                } else {
-                    if (index == parent.topTabIndex) {
-                        x1 = x + 1;
-                        y1 = y + 1;
-                        width1 = width - 2;
-                        height1 = height - 2;
-                    } else {
-                        x1 = x + 2;
-                        y1 = y + 1;
-                        width1 = width - 3;
-                        height1 = height - 2;
-                    }
-                }
-                gc.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
-                gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
-                gc.drawFocus(x1, y1, width1, height1);
-            }
-        } else {
-            // draw tab lines for unselected items
-            gc.setForeground(normalShadow);
-            if (!parent.onBottom) {
-                if (index != parent.topTabIndex
-                        && index != parent.getSelectionIndex() + 1) {
-                    gc.drawLine(x, y, x, y + (height / 2));
-                }
-            } else {
-                if (index != parent.topTabIndex
-                        && index != parent.getSelectionIndex() + 1) {
-                    gc.drawLine(x, y + (height / 2), x, y + height - 1);
-                }
-            }
-
-        }
-
-        // draw Image
-        int xDraw = x + LEFT_MARGIN;
-
-        Image image = getImage();
-        if (!isSelected && image != null) {
-            Image temp = getDisabledImage();
-            if (temp != null) {
-                image = temp;
-            }
-        }
-        if (image != null) {
-            Rectangle imageBounds = image.getBounds();
-            int imageX = xDraw;
-            int imageHeight = Math.min(height - BOTTOM_MARGIN - TOP_MARGIN,
-                    imageBounds.height);
-            int imageY = y + (height - imageHeight) / 2;
-            int imageWidth = imageBounds.width * imageHeight
-                    / imageBounds.height;
-            gc.drawImage(image, imageBounds.x, imageBounds.y,
-                    imageBounds.width, imageBounds.height, imageX, imageY,
-                    imageWidth, imageHeight);
-            xDraw += imageWidth + INTERNAL_SPACING;
-        }
-
-        // draw Text
-        int textWidth = x + width - xDraw - RIGHT_MARGIN;
-        if (isSelected && parent.showClose) {
-            textWidth = x + width - xDraw - parent.closeBar.getSize().x
-                    - RIGHT_MARGIN;
-        }
-        if (shortenedText == null || shortenedTextWidth != textWidth) {
-            shortenedText = shortenText(gc, getText(), textWidth);
-            shortenedTextWidth = textWidth;
-        }
-        String text = shortenedText;
-
-        if (isSelected && parent.selectionForeground != null) {
-            gc.setForeground(parent.selectionForeground);
-        } else {
-            gc.setForeground(parent.getForeground());
-        }
-        int textY = y + (height - gc.textExtent(text, SWT.DRAW_MNEMONIC).y) / 2;
-        gc.drawText(text, xDraw, textY, SWT.DRAW_TRANSPARENT
-                | SWT.DRAW_MNEMONIC);
-
-        gc.setForeground(parent.getForeground());
-    }
-
-    private static String shortenText(GC gc, String text, int width) {
-        if (gc.textExtent(text, SWT.DRAW_MNEMONIC).x <= width) {
-			return text;
-		}
-
-        int ellipseWidth = gc.textExtent(ellipsis, SWT.DRAW_MNEMONIC).x;
-        int length = text.length();
-        int end = length - 1;
-        while (end > 0) {
-            text = text.substring(0, end);
-            int l1 = gc.textExtent(text, SWT.DRAW_MNEMONIC).x;
-            if (l1 + ellipseWidth <= width) {
-                return text + ellipsis;
-            }
-            end--;
-        }
-        return text + ellipsis;
-    }
-
-    /**
-     * Answer the preferred height of the receiver for the GC.
-     */
-    int preferredHeight(GC gc) {
-        Image image = getImage();
-        int height = 0;
-        if (image != null) {
-			height = image.getBounds().height;
-		}
-        String text = getText();
-        height = Math.max(height, gc.textExtent(text, SWT.DRAW_MNEMONIC).y);
-        return height + TOP_MARGIN + BOTTOM_MARGIN;
-    }
-
-    /**
-     * Answer the preferred width of the receiver for the GC.
-     */
-    int preferredWidth(GC gc) {
-        int width = 0;
-        Image image = getImage();
-        if (image != null) {
-			width += image.getBounds().width;
-		}
-        String text = getText();
-        if (text != null) {
-            if (image != null) {
-				width += INTERNAL_SPACING;
-			}
-            width += gc.textExtent(text, SWT.DRAW_MNEMONIC).x;
-        }
-        if (parent.showClose) {
-			width += INTERNAL_SPACING + preferredHeight(gc); // closebar will be square and will fill preferred height
-		}
-        return width + LEFT_MARGIN + RIGHT_MARGIN;
-    }
-
-    /**
-     * Sets the control that is used to fill the client area of
-     * the tab folder when the user selects the tab item.
-     * <p>
-     * @param control the new control (or null)
-     *
-     * @exception IllegalArgumentException <ul>
-     *    <li>ERROR_INVALID_ARGUMENT - if the control has been disposed</li> 
-     *    <li>ERROR_INVALID_PARENT - if the control is not in the same widget tree</li>
-     * </ul>
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setControl(Control control) {
-        checkWidget();
-        if (control != null) {
-            if (control.isDisposed()) {
-				SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-			}
-            if (control.getParent() != parent) {
-				SWT.error(SWT.ERROR_INVALID_PARENT);
-			}
-        }
-        if (this.control != null && !this.control.isDisposed()) {
-            this.control.setVisible(false);
-        }
-        this.control = control;
-        if (this.control != null) {
-            int index = parent.indexOf(this);
-            if (index == parent.getSelectionIndex()) {
-                this.control.setBounds(parent.getClientArea());
-                this.control.setVisible(true);
-            } else {
-                this.control.setVisible(false);
-            }
-        }
-    }
-
-    public void setImage(Image image) {
-        checkWidget();
-        if (image != null && image.equals(getImage())) {
-			return;
-		}
-        super.setImage(image);
-        parent.resetTabSize(true);
-    }
-
-    /**
-     * Sets the image that is displayed if the tab item is disabled.
-     * Null will clear the image.
-     * 
-     * @param image the image to be displayed when the item is disabled or null
-     *
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setDisabledImage(Image image) {
-        checkWidget();
-        if (image != null && image.equals(getDisabledImage())) {
-			return;
-		}
-        disabledImage = image;
-        parent.redraw();
-    }
-
-    /**
-     * Set the widget text.
-     * <p>
-     * This method sets the widget label.  The label may include
-     * mnemonic characters but must not contain line delimiters.
-     *
-     * @param string the new label for the widget
-     *
-     * @exception IllegalArgumentException <ul>
-     *    <li>ERROR_NULL_ARGUMENT - if the text is null</li>
-     * </ul>
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setText(String string) {
-        checkWidget();
-        if (string.equals(getText())) {
-			return;
-		}
-        super.setText(string);
-        shortenedText = null;
-        shortenedTextWidth = 0;
-        parent.resetTabSize(false);
-    }
-
-    /**
-     * Sets the receiver's tool tip text to the argument, which
-     * may be null indicating that no tool tip text should be shown.
-     *
-     * @param string the new tool tip text (or null)
-     *
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setToolTipText(String string) {
-        checkWidget();
-        toolTipText = string;
-    }
-}
diff --git a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/R21PaneFolder.java b/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/R21PaneFolder.java
deleted file mode 100644
index 0a67928..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/R21PaneFolder.java
+++ /dev/null
@@ -1,487 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.presentations.r21.widgets;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.graphics.Color;
-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.ui.internal.layout.SizeCache;
-import org.eclipse.ui.internal.presentations.util.ProxyControl;
-import org.eclipse.ui.presentations.IStackPresentationSite;
-
-/**
- * This class implements the tab folders that contains can contain two toolbars and
- * status text. Wherever possible, the toolbars are aligned with the tabs. 
- * If there is not enough room beside the tabs, the toolbars are aligned with the status text. This
- * is the same tab folder that is used to arrange views and editors in Eclipse. 
- * <p>
- * This is closely related to DefaultPartPresentation, but they have different responsibilities. This
- * is essentially a CTabFolder that can manage a toolbar. It should not depend on 
- * data structures from the workbench, and its public interface should only use SWT objects or
- * listeners. DefaultPartPresentation uses a PaneFolder to arrange views or editors. Knowledge
- * of higher-level data structures should go there. 
- * </p>
- * <p>
- * Although it is not actually a control, the public interface is much like 
- * an SWT control. Implementation-wise, this is actually a combination of a CTabFolder and 
- * a ViewForm. It encapsulates the details of moving the toolbar between the CTabFolder and
- * the ViewForm, and provides a simpler interface to the ViewForm/CTabFolder. 
- * </p>
- * 
- * @since 3.0
- */
-public final class R21PaneFolder {
-    // Tab folder and associated proxy controls
-    private CTabFolder tabFolder;
-
-    //	private Control titleAreaProxy;	
-
-    // View form and associated proxy controls
-    private ViewForm viewForm;
-
-    private ProxyControl contentProxy;
-
-    private ProxyControl viewFormTopLeftProxy;
-
-    private ProxyControl viewFormTopRightProxy;
-
-    private ProxyControl viewFormTopCenterProxy;
-
-    // Cached sizes of the top-right and top-center controls
-    private SizeCache topRightCache = new SizeCache();
-
-    private SizeCache topCenterCache = new SizeCache();
-
-    private SizeCache topLeftCache = new SizeCache();
-
-    private int tabPos;
-
-    private boolean putTrimOnTop = false;
-
-    /**
-     * List of PaneFolderButtonListener
-     */
-    private List buttonListeners = new ArrayList(1);
-
-    private int state = IStackPresentationSite.STATE_RESTORED;
-
-    /**
-     * State of the folder at the last mousedown event. This is used to prevent
-     * a mouseup over the minimize or maximize buttons from undoing a state change 
-     * that was caused by the mousedown.
-     */
-    private int mousedownState = -1;
-
-    //	// CTabFolder listener
-    //	private CTabFolder2Adapter expandListener = new CTabFolder2Adapter() {
-    //		public void minimize(CTabFolderEvent event) {
-    //			event.doit = false;
-    //			notifyButtonListeners(IStackPresentationSite.STATE_MINIMIZED);
-    //		}
-    //		
-    //		public void restore(CTabFolderEvent event) {
-    //			event.doit = false;
-    //			notifyButtonListeners(IStackPresentationSite.STATE_RESTORED);
-    //		}
-    //		
-    //		public void maximize(CTabFolderEvent event) {
-    //			event.doit = false;
-    //			notifyButtonListeners(IStackPresentationSite.STATE_MAXIMIZED);
-    //		}
-    //		
-    //		/* (non-Javadoc)
-    //		 * @see org.eclipse.swt.custom.CTabFolder2Adapter#close(org.eclipse.swt.custom.CTabFolderEvent)
-    //		 */
-    //		public void close(CTabFolderEvent event) {
-    //			event.doit = false;
-    //			notifyCloseListeners((CTabItem)event.item);
-    //		}
-    //		
-    //		public void showList(CTabFolderEvent event) {
-    //			notifyShowListeners(event);
-    //		}
-    //		
-    //	};
-    //	
-    private MouseListener mouseListener = new MouseAdapter() {
-        public void mouseDown(MouseEvent e) {
-            mousedownState = getState();
-        }
-
-        public void mouseDoubleClick(MouseEvent e) {
-        }
-    };
-
-    /**
-     * Creates a pane folder. This will create exactly one child control in the
-     * given parent.
-     * 
-     * @param parent
-     * @param flags
-     */
-    public R21PaneFolder(Composite parent, int flags) {
-        // Initialize tab folder
-        {
-            tabFolder = new CTabFolder(parent, flags);
-
-            //			// Create a proxy control to measure the title area of the tab folder
-            //			titleAreaProxy = new Composite(tabFolder, SWT.NONE);
-            //			titleAreaProxy.setVisible(false);
-            //			tabFolder.setTopRight(titleAreaProxy, SWT.FILL);
-
-            //			tabFolder.addCTabFolder2Listener(expandListener);
-            //			
-            tabFolder.addMouseListener(mouseListener);
-        }
-
-        // Initialize view form
-        {
-            viewForm = new ViewForm(tabFolder, SWT.NONE);
-
-            // Only attach these to the viewForm when there's actuall a control to display
-            viewFormTopLeftProxy = new ProxyControl(viewForm);
-            viewFormTopCenterProxy = new ProxyControl(viewForm);
-            viewFormTopRightProxy = new ProxyControl(viewForm);
-
-            contentProxy = new ProxyControl(viewForm);
-            viewForm.setContent(contentProxy.getControl());
-        }
-    }
-
-    /**
-     * Return the main control for this pane folder
-     * 
-     * @return Composite the control
-     */
-    public Composite getControl() {
-        return tabFolder;
-    }
-
-    /**
-     * Sets the top-center control (usually a toolbar), or null if none.
-     * Note that the control can have any parent.
-     * 
-     * @param topCenter the top-center control or null if none
-     */
-    public void setTopCenter(Control topCenter) {
-        topCenterCache.setControl(topCenter);
-        if (topCenter != null) {
-            if (!putTrimOnTop) {
-                viewFormTopCenterProxy.setTarget(topCenterCache);
-                viewForm.setTopCenter(viewFormTopCenterProxy.getControl());
-            }
-        } else {
-            if (!putTrimOnTop) {
-                viewForm.setTopCenter(null);
-            }
-        }
-    }
-
-    /**
-     * Sets the top-right control (usually a dropdown), or null if none
-     * 
-     * @param topRight
-     */
-    public void setTopRight(Control topRight) {
-        topRightCache.setControl(topRight);
-        if (topRight != null) {
-            if (!putTrimOnTop) {
-                viewFormTopRightProxy.setTarget(topRightCache);
-                viewForm.setTopRight(viewFormTopRightProxy.getControl());
-            }
-        } else {
-            if (!putTrimOnTop) {
-                viewForm.setTopRight(null);
-            }
-        }
-    }
-
-    /**
-     * Sets the top-left control (usually a title label), or null if none
-     * 
-     * @param topLeft
-     */
-    public void setTopLeft(Control topLeft) {
-        if (topLeftCache.getControl() != topLeft) {
-            topLeftCache.setControl(topLeft);
-            // The top-left control always goes directly in the ViewForm
-            if (topLeft != null) {
-                viewFormTopLeftProxy.setTarget(topLeftCache);
-                viewForm.setTopLeft(viewFormTopLeftProxy.getControl());
-            } else {
-                viewFormTopLeftProxy.setTargetControl(null);
-                viewForm.setTopLeft(null);
-            }
-        }
-    }
-
-    /**
-     * Flush all of this folder's size caches to ensure they will be re-computed
-     * on the next layout.
-     */
-    public void flush() {
-        topLeftCache.flush();
-        topRightCache.flush();
-        topCenterCache.flush();
-    }
-
-    /**
-     * Layout the receiver, flusing the cache if needed.
-     * 
-     * @param flushCache
-     */
-    public void layout(boolean flushCache) {
-        // Flush the cached sizes if necessary
-        if (flushCache) {
-			flush();
-		}
-
-        Rectangle tabFolderClientArea = tabFolder.getClientArea();
-
-        // Hide tabs if there is only one
-        if (tabFolder.getItemCount() < 2) {
-            //Rectangle tabFolderBounds = tabFolder.getBounds();
-
-            int delta = getTabHeight() + 1;
-            tabFolderClientArea.height += delta;
-
-            if (getTabPosition() == SWT.TOP) {
-                tabFolderClientArea.y -= delta;
-            }
-        }
-
-        viewForm.setBounds(tabFolderClientArea);
-        viewFormTopRightProxy.layout();
-        viewFormTopLeftProxy.layout();
-        viewFormTopCenterProxy.layout();
-    }
-
-    /**
-     * Returns the client area for this PaneFolder, relative to the pane folder's control.
-     * 
-     * @return Rectangle the client area 
-     */
-    public Rectangle getClientArea() {
-        Rectangle bounds = contentProxy.getControl().getBounds();
-
-        Rectangle formArea = viewForm.getBounds();
-
-        bounds.x += formArea.x;
-        bounds.y += formArea.y;
-
-        return bounds;
-    }
-
-    /**
-     * Returns the current state of the folder (as shown on the button icons)
-     * 
-     * @return one of the IStackPresentationSite.STATE_* constants
-     */
-    public int getState() {
-        return state;
-    }
-
-    /**
-     * @param buttonId one of the IStackPresentationSite.STATE_* constants
-     */
-    protected void notifyButtonListeners(int buttonId) {
-        if (mousedownState == getState()) {
-            Iterator iter = buttonListeners.iterator();
-
-            while (iter.hasNext()) {
-                R21PaneFolderButtonListener listener = (R21PaneFolderButtonListener) iter
-                        .next();
-
-                listener.stateButtonPressed(buttonId);
-            }
-        }
-    }
-
-    /**
-     * Notifies all listeners that the user clicked on the chevron
-     * 
-     * @param event
-     */
-    protected void notifyShowListeners(CTabFolderEvent event) {
-        Iterator iter = buttonListeners.iterator();
-
-        while (iter.hasNext()) {
-            R21PaneFolderButtonListener listener = (R21PaneFolderButtonListener) iter
-                    .next();
-
-            listener.showList(event);
-        }
-    }
-
-    /**
-     * Notifies all listeners that the close button was pressed
-     * 
-     * @param tabItem
-     */
-    protected void notifyCloseListeners(CTabItem tabItem) {
-        Iterator iter = buttonListeners.iterator();
-
-        while (iter.hasNext()) {
-            R21PaneFolderButtonListener listener = (R21PaneFolderButtonListener) iter
-                    .next();
-
-            listener.closeButtonPressed(tabItem);
-        }
-    }
-
-    /**
-     * @param listener
-     */
-    public void addButtonListener(R21PaneFolderButtonListener listener) {
-        buttonListeners.add(listener);
-    }
-
-    /**
-     * @param listener
-     */
-    public void removeButtonListener(R21PaneFolderButtonListener listener) {
-        buttonListeners.remove(listener);
-    }
-
-    /**
-     * @param newTabPosition
-     */
-    public void setTabPosition(int newTabPosition) {
-        tabPos = newTabPosition;
-        tabFolder.setTabPosition(tabPos);
-    }
-
-    /**
-     * @return int the postion of the tab
-     */
-    public int getTabPosition() {
-        return tabPos;
-    }
-
-    /**
-     * @return boolean <code>true</code> if the receiver has been disposed
-     */
-    public boolean isDisposed() {
-        return tabFolder == null || tabFolder.isDisposed();
-    }
-
-    /**
-     * @param style
-     * @param index
-     * @return CTabItem the created item
-     */
-    public CTabItem createItem(int style, int index) {
-        return new CTabItem(tabFolder, style, index);
-    }
-
-    // The remainder of the methods in this class redirect directly to CTabFolder methods
-
-    /**
-     * @param selection
-     */
-    public void setSelection(int selection) {
-        tabFolder.setSelection(selection);
-    }
-
-    /**
-     * @param i
-     * @param j
-     * @param k
-     * @param l
-     * @return Rectangle the trim rectangle
-     */
-    public Rectangle computeTrim(int i, int j, int k, int l) {
-        return tabFolder.computeTrim(i, j, k, l);
-    }
-
-    /**
-     * @param fgColor
-     */
-    public void setSelectionForeground(Color fgColor) {
-        tabFolder.setSelectionForeground(fgColor);
-    }
-
-    /**
-     * @param idx
-     * @return CTabItem the indexed item
-     */
-    public CTabItem getItem(int idx) {
-        return tabFolder.getItem(idx);
-    }
-
-    /**
-     * @return int the selected items index
-     */
-    public int getSelectionIndex() {
-        return tabFolder.getSelectionIndex();
-    }
-
-    /**
-     * @return int the height of the tabs
-     */
-    public int getTabHeight() {
-        return tabFolder.getTabHeight();
-    }
-
-    /**
-     * @param toFind
-     * @return int the index of the item to find
-     */
-    public int indexOf(CTabItem toFind) {
-        return tabFolder.indexOf(toFind);
-    }
-
-    /**
-     * @param height
-     */
-    public void setTabHeight(int height) {
-        tabFolder.setTabHeight(height);
-    }
-
-    /**
-     * @return int the item count
-     */
-    public int getItemCount() {
-        return tabFolder.getItemCount();
-    }
-
-    /**
-     * @return CTabItem the items
-     */
-    public CTabItem[] getItems() {
-        return tabFolder.getItems();
-    }
-
-    /**
-     * @param toGet
-     * @return CTabItem the indexed item
-     */
-    public CTabItem getItem(Point toGet) {
-        return tabFolder.getItem(toGet);
-    }
-
-    /**
-     * @return CTabItem the selected item
-     */
-    public CTabItem getSelection() {
-        return tabFolder.getSelection();
-    }
-}
diff --git a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/R21PaneFolderButtonListener.java b/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/R21PaneFolderButtonListener.java
deleted file mode 100644
index 5316e12..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/R21PaneFolderButtonListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.presentations.r21.widgets;
-
-/**
- * This listener receives notifications when the user clicks on one of
- * the buttons (minimize, maximize, or restore) on a pane folder.  
- * 
- * @since 3.0
- */
-public abstract class R21PaneFolderButtonListener {
-
-    /**
-     * Called when the minimize, maximize, or restore buttons are pressed.
-     *   
-     * @param buttonId one of the IStackPresentationSite.STATE_* constants
-     */
-    public void stateButtonPressed(int buttonId) {
-    }
-
-    /**
-     * Called when a close button is pressed.
-     *   
-     * @param item the tab whose close button was pressed
-     */
-    public void closeButtonPressed(CTabItem item) {
-    }
-
-    /**
-     * 
-     * @param event 
-     * @since 3.0
-     */
-    public void showList(CTabFolderEvent event) {
-    }
-}
diff --git a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/ViewForm.java b/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/ViewForm.java
deleted file mode 100644
index 21920da..0000000
--- a/bundles/org.eclipse.ui.presentations.r21/src/org/eclipse/ui/internal/presentations/r21/widgets/ViewForm.java
+++ /dev/null
@@ -1,696 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.presentations.r21.widgets;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * Instances of this class implement a Composite that lays out three
- * children horizontally and allows programmatic control of layout and
- * border parameters. ViewForm is used in the workbench to implement a
- * view's label/menu/toolbar local bar.
- * <p>
- * Note that although this class is a subclass of <code>Composite</code>,
- * it does not make sense to set a layout on it.
- * </p><p>
- * <dl>
- * <dt><b>Styles:</b></dt>
- * <dd>BORDER, FLAT</dd>
- * <dt><b>Events:</b></dt>
- * <dd>(None)</dd>
- * </dl>
- * <p>
- * IMPORTANT: This class is <em>not</em> intended to be subclassed.
- * </p>
- */
-
-public class ViewForm extends Composite {
-
-    /**
-     * marginWidth specifies the number of pixels of horizontal margin
-     * that will be placed along the left and right edges of the form.
-     *
-     * The default value is 0.
-     */
-    public int marginWidth = 0;
-
-    /**
-     * marginHeight specifies the number of pixels of vertical margin
-     * that will be placed along the top and bottom edges of the form.
-     *
-     * The default value is 0.
-     */
-    public int marginHeight = 0;
-
-    /**
-     * Color of innermost line of drop shadow border.
-     */
-    public static RGB borderInsideRGB = new RGB(132, 130, 132);
-
-    /**
-     * Color of middle line of drop shadow border.
-     */
-    public static RGB borderMiddleRGB = new RGB(143, 141, 138);
-
-    /**
-     * Color of outermost line of drop shadow border.
-     */
-    public static RGB borderOutsideRGB = new RGB(171, 168, 165);
-
-    // SWT widgets
-    private Control topLeft;
-
-    private Control topCenter;
-
-    private Control topRight;
-
-    private Control content;
-
-    // Configuration and state info
-    private boolean separateTopCenter = false;
-
-    private int drawLine1 = -1;
-
-    private int drawLine2 = -1;
-
-    private boolean showBorder = false;
-
-    private int BORDER_TOP = 0;
-
-    private int BORDER_BOTTOM = 0;
-
-    private int BORDER_LEFT = 0;
-
-    private int BORDER_RIGHT = 0;
-
-    private Color borderColor1;
-
-    private Color borderColor2;
-
-    private Color borderColor3;
-
-    private Rectangle oldArea;
-
-    private static final int OFFSCREEN = -200;
-
-    /**
-     * Constructs a new instance of this class given its parent
-     * and a style value describing its behavior and appearance.
-     * <p>
-     * The style value is either one of the style constants defined in
-     * class <code>SWT</code> which is applicable to instances of this
-     * class, or must be built by <em>bitwise OR</em>'ing together 
-     * (that is, using the <code>int</code> "|" operator) two or more
-     * of those <code>SWT</code> style constants. The class description
-     * lists the style constants that are applicable to the class.
-     * Style bits are also inherited from superclasses.
-     * </p>
-     *
-     * @param parent a widget which will be the parent of the new instance (cannot be null)
-     * @param style the style of widget to construct
-     *
-     * @exception IllegalArgumentException <ul>
-     *    <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
-     * </ul>
-     * @exception SWTException <ul>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
-     * </ul>
-     *
-     * @see SWT#BORDER
-     * @see SWT#FLAT
-     * @see #getStyle()
-     */
-    public ViewForm(Composite parent, int style) {
-        super(parent, checkStyle(style));
-
-        borderColor1 = new Color(getDisplay(), borderInsideRGB);
-        borderColor2 = new Color(getDisplay(), borderMiddleRGB);
-        borderColor3 = new Color(getDisplay(), borderOutsideRGB);
-        setBorderVisible((style & SWT.BORDER) != 0);
-
-        addPaintListener(new PaintListener() {
-            public void paintControl(PaintEvent event) {
-                onPaint(event.gc);
-            }
-        });
-        addControlListener(new ControlAdapter() {
-            public void controlResized(ControlEvent e) {
-                onResize();
-            }
-        });
-
-        addListener(SWT.Dispose, new Listener() {
-            public void handleEvent(Event e) {
-                onDispose();
-            }
-        });
-    }
-
-    /**
-     * Check the style bits to ensure that no invalid styles are applied.
-     * @private
-     */
-    private static int checkStyle(int style) {
-        int mask = SWT.FLAT | SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT;
-        return style & mask | SWT.NO_REDRAW_RESIZE;
-    }
-
-    public Point computeSize(int wHint, int hHint, boolean changed) {
-        checkWidget();
-        // size of title bar area
-        Point leftSize = new Point(0, 0);
-        if (topLeft != null) {
-            leftSize = topLeft.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-            leftSize.x += 1; // +1 for highlight line
-        }
-        Point centerSize = new Point(0, 0);
-        if (topCenter != null) {
-            centerSize = topCenter.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-        }
-        Point rightSize = new Point(0, 0);
-        if (topRight != null) {
-            rightSize = topRight.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-        }
-        Point size = new Point(0, 0);
-        // calculate width of title bar
-        if (separateTopCenter
-                || (wHint != SWT.DEFAULT && leftSize.x + centerSize.x
-                        + rightSize.x > wHint)) {
-            size.x = leftSize.x + rightSize.x;
-            size.x = Math.max(centerSize.x, size.x);
-            size.y = Math.max(leftSize.y, rightSize.y) + 1; // +1 for highlight line
-            if (topCenter != null) {
-                size.y += centerSize.y;
-            }
-        } else {
-            size.x = leftSize.x + centerSize.x + rightSize.x;
-            size.y = Math.max(leftSize.y, Math.max(centerSize.y, rightSize.y)) + 1; // +1 for highlight line
-        }
-
-        if (content != null) {
-            Point contentSize = new Point(0, 0);
-            contentSize = content.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-            size.x = Math.max(size.x, contentSize.x);
-            size.y += contentSize.y + 1; // +1 for line bewteen content and header
-        }
-
-        size.x += 2 * marginWidth;
-        size.y += 2 * marginHeight;
-
-        if (wHint != SWT.DEFAULT) {
-			size.x = wHint;
-		}
-        if (hHint != SWT.DEFAULT) {
-			size.y = hHint;
-		}
-
-        Rectangle trim = computeTrim(0, 0, size.x, size.y);
-        return new Point(trim.width, trim.height);
-    }
-
-    public Rectangle computeTrim(int x, int y, int width, int height) {
-        checkWidget();
-        int trimX = x - BORDER_LEFT;
-        int trimY = y - BORDER_TOP;
-        int trimWidth = width + BORDER_LEFT + BORDER_RIGHT;
-        int trimHeight = height + BORDER_TOP + BORDER_BOTTOM;
-        return new Rectangle(trimX, trimY, trimWidth, trimHeight);
-    }
-
-    public Rectangle getClientArea() {
-        checkWidget();
-        Rectangle clientArea = super.getClientArea();
-        clientArea.x += BORDER_LEFT;
-        clientArea.y += BORDER_TOP;
-        clientArea.width -= BORDER_LEFT + BORDER_RIGHT;
-        clientArea.height -= BORDER_TOP + BORDER_BOTTOM;
-        return clientArea;
-    }
-
-    /**
-     * Returns the content area.
-     * 
-     * @return the control in the content area of the pane or null
-     */
-    public Control getContent() {
-        //checkWidget();
-        return content;
-    }
-
-    /**
-     * Returns Control that appears in the top center of the pane.
-     * Typically this is a toolbar.
-     * 
-     * @return the control in the top center of the pane or null
-     */
-    public Control getTopCenter() {
-        //checkWidget();
-        return topCenter;
-    }
-
-    /**
-     * Returns the Control that appears in the top left corner of the pane.
-     * Typically this is a label such as CLabel.
-     * 
-     * @return the control in the top left corner of the pane or null
-     */
-    public Control getTopLeft() {
-        //checkWidget();
-        return topLeft;
-    }
-
-    /**
-     * Returns the control in the top right corner of the pane.
-     * Typically this is a Close button or a composite with a Menu and Close button.
-     * 
-     * @return the control in the top right corner of the pane or null
-     */
-    public Control getTopRight() {
-        //checkWidget();
-        return topRight;
-    }
-
-    public void layout(boolean changed) {
-        checkWidget();
-        Rectangle rect = getClientArea();
-
-        drawLine1 = -1;
-        drawLine2 = -1;
-
-        Point leftSize = new Point(0, 0);
-        if (topLeft != null && !topLeft.isDisposed()) {
-            leftSize = topLeft.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-        }
-        Point centerSize = new Point(0, 0);
-        if (topCenter != null && !topCenter.isDisposed()) {
-            centerSize = topCenter.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-        }
-        Point rightSize = new Point(0, 0);
-        if (topRight != null && !topRight.isDisposed()) {
-            rightSize = topRight.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-        }
-
-        int minTopWidth = leftSize.x + centerSize.x + rightSize.x + 2
-                * marginWidth + 1; // +1 for highlight line	
-        int height = rect.y + marginHeight;
-
-        boolean top = false;
-        if (separateTopCenter || minTopWidth > rect.width) {
-            int topHeight = Math.max(rightSize.y, leftSize.y);
-            if (topRight != null && !topRight.isDisposed()) {
-                top = true;
-                topRight.setBounds(rect.x + rect.width - marginWidth
-                        - rightSize.x, rect.y + 1 + marginHeight, rightSize.x,
-                        topHeight);
-                height += 1 + topHeight; // +1 for highlight line
-            }
-            if (topLeft != null && !topLeft.isDisposed()) {
-                top = true;
-                leftSize = topLeft.computeSize(rect.width - 2 * marginWidth
-                        - rightSize.x - 1, SWT.DEFAULT);
-                topLeft.setBounds(rect.x + 1 + marginWidth, rect.y + 1
-                        + marginHeight, leftSize.x, topHeight);
-                height = Math
-                        .max(height, rect.y + marginHeight + 1 + topHeight); // +1 for highlight line
-            }
-            if (topCenter != null && !topCenter.isDisposed()) {
-                top = true;
-                if (height > rect.y + marginHeight) {
-                    drawLine1 = height;
-                    height += 1; // +1 for divider line
-                }
-                centerSize = topCenter.computeSize(
-                        rect.width - 2 * marginWidth, SWT.DEFAULT);
-                topCenter.setBounds(rect.x + rect.width - marginWidth
-                        - centerSize.x, height, centerSize.x, centerSize.y);
-                height += centerSize.y;
-
-            }
-        } else {
-            int topHeight = Math.max(rightSize.y, Math.max(centerSize.y,
-                    leftSize.y));
-            if (topRight != null && !topRight.isDisposed()) {
-                top = true;
-                topRight.setBounds(rect.x + rect.width - marginWidth
-                        - rightSize.x, rect.y + marginHeight + 1, // +1 for highlight line
-                        rightSize.x, topHeight);
-                height += 1 + topHeight; // +1 for highlight line
-            }
-            if (topCenter != null && !topCenter.isDisposed()) {
-                top = true;
-                topCenter.setBounds(rect.x + rect.width - marginWidth
-                        - rightSize.x - centerSize.x,
-                        rect.y + marginHeight + 1, // +1 for highlight line
-                        centerSize.x, topHeight);
-                height = Math
-                        .max(height, rect.y + marginHeight + 1 + topHeight); // +1 for highlight line                    
-            }
-            if (topLeft != null && !topLeft.isDisposed()) {
-                top = true;
-                leftSize = topLeft.computeSize(rect.width - 2 * marginWidth
-                        - rightSize.x - centerSize.x - 1, topHeight);
-                topLeft.setBounds(rect.x + marginWidth + 1, // +1 for highlight line
-                        rect.y + marginHeight + 1, // +1 for highlight line
-                        leftSize.x, topHeight);
-                height = Math
-                        .max(height, rect.y + marginHeight + 1 + topHeight); // +1 for highlight line
-            }
-        }
-
-        if (content != null && !content.isDisposed()) {
-            if (top) {
-                drawLine2 = height;
-                height += 1; // +1 for divider line
-            }
-            content
-                    .setBounds(rect.x + marginWidth, height, rect.width - 2
-                            * marginWidth, rect.y + rect.height - height
-                            - marginHeight);
-        }
-    }
-
-    private void onDispose() {
-        if (borderColor1 != null) {
-            borderColor1.dispose();
-        }
-        borderColor1 = null;
-
-        if (borderColor2 != null) {
-            borderColor2.dispose();
-        }
-        borderColor2 = null;
-
-        if (borderColor3 != null) {
-            borderColor3.dispose();
-        }
-        borderColor3 = null;
-
-        topLeft = null;
-        topCenter = null;
-        topRight = null;
-        content = null;
-        oldArea = null;
-    }
-
-    /**
-     * Draws the focus border.
-     */
-    private void onPaint(GC gc) {
-        Rectangle d = super.getClientArea();
-
-        if (showBorder) {
-            if ((getStyle() & SWT.FLAT) != 0) {
-                gc.setForeground(borderColor1);
-                gc.drawRectangle(d.x, d.y, d.x + d.width - 1, d.y + d.height
-                        - 1);
-            } else {
-                gc.setForeground(borderColor1);
-                gc.drawRectangle(d.x, d.y, d.x + d.width - 3, d.y + d.height
-                        - 3);
-
-                gc.setForeground(borderColor2);
-                gc.drawLine(d.x + 1, d.y + d.height - 2, d.x + d.width - 1, d.y
-                        + d.height - 2);
-                gc.drawLine(d.x + d.width - 2, d.y + 1, d.x + d.width - 2, d.y
-                        + d.height - 1);
-
-                gc.setForeground(borderColor3);
-                gc.drawLine(d.x + 2, d.y + d.height - 1, d.x + d.width - 2, d.y
-                        + d.height - 1);
-                gc.drawLine(d.x + d.width - 1, d.y + 2, d.x + d.width - 1, d.y
-                        + d.height - 2);
-            }
-        }
-
-        if (drawLine1 != -1) {
-            // top seperator line
-            gc.setForeground(borderColor1);
-            gc.drawLine(d.x + BORDER_LEFT, drawLine1, d.x + d.width
-                    - BORDER_RIGHT, drawLine1);
-        }
-        if (drawLine2 != -1) {
-            // content separator line
-            gc.setForeground(borderColor1);
-            gc.drawLine(d.x + BORDER_LEFT, drawLine2, d.x + d.width
-                    - BORDER_RIGHT, drawLine2);
-        }
-        // highlight on top
-        int y = drawLine1;
-        if (y == -1) {
-            y = drawLine2;
-        }
-        if (y != -1) {
-            gc.setForeground(getDisplay().getSystemColor(
-                    SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW));
-            gc.drawLine(d.x + BORDER_LEFT + marginWidth, d.y + BORDER_TOP
-                    + marginHeight, d.x + BORDER_LEFT + marginWidth, y - 1);
-            gc.drawLine(d.x + BORDER_LEFT + marginWidth, d.y + BORDER_TOP
-                    + marginHeight, d.x + d.width - BORDER_RIGHT - marginWidth
-                    - 1, d.y + BORDER_TOP + marginHeight);
-        }
-
-        gc.setForeground(getForeground());
-    }
-
-    private void onResize() {
-        layout();
-
-        Rectangle area = super.getClientArea();
-        if (oldArea == null || oldArea.width == 0 || oldArea.height == 0) {
-            redraw();
-        } else {
-            int width = 0;
-            if (oldArea.width < area.width) {
-                width = area.width - oldArea.width + BORDER_RIGHT;
-            } else if (oldArea.width > area.width) {
-                width = BORDER_RIGHT;
-            }
-            redraw(area.x + area.width - width, area.y, width, area.height,
-                    false);
-
-            int height = 0;
-            if (oldArea.height < area.height) {
-                height = area.height - oldArea.height + BORDER_BOTTOM;
-            }
-            if (oldArea.height > area.height) {
-                height = BORDER_BOTTOM;
-            }
-            redraw(area.x, area.y + area.height - height, area.width, height,
-                    false);
-        }
-        oldArea = area;
-    }
-
-    /**
-     * Sets the content.
-     * Setting the content to null will remove it from 
-     * the pane - however, the creator of the content must dispose of the content.
-     * 
-     * @param content the control to be displayed in the content area or null
-     * 
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setContent(Control content) {
-        checkWidget();
-        if (content != null && content.getParent() != this) {
-            SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-        }
-        if (this.content != null && !this.content.isDisposed()) {
-            this.content.setBounds(OFFSCREEN, OFFSCREEN, 0, 0);
-        }
-        this.content = content;
-        layout();
-    }
-
-    /**
-     * Set the widget font.
-     * This will apply the font to the topLeft, topRight and topCenter widgets.
-     */
-    public void setFont(Font f) {
-        super.setFont(f);
-        if (topLeft != null && !topLeft.isDisposed()) {
-			topLeft.setFont(f);
-		}
-        if (topCenter != null && !topCenter.isDisposed()) {
-			topCenter.setFont(f);
-		}
-        if (topRight != null && !topRight.isDisposed()) {
-			topRight.setFont(f);
-		}
-
-        layout();
-    }
-
-    /**
-     * Sets the layout which is associated with the receiver to be
-     * the argument which may be null.
-     * <p>
-     * Note : ViewForm does not use a layout class to size and position its children.
-     * </p>
-     *
-     * @param layout the receiver's new layout or null
-     *
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setLayout(Layout layout) {
-        checkWidget();
-        return;
-    }
-
-    /**
-     * Set the control that appears in the top center of the pane.
-     * Typically this is a toolbar.
-     * The topCenter is optional.  Setting the topCenter to null will remove it from 
-     * the pane - however, the creator of the topCenter must dispose of the topCenter.
-     * 
-     * @param topCenter the control to be displayed in the top center or null
-     * 
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setTopCenter(Control topCenter) {
-        checkWidget();
-        if (topCenter != null && topCenter.getParent() != this) {
-            SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-        }
-        if (this.topCenter != null && !this.topCenter.isDisposed()) {
-            this.topCenter.setBounds(OFFSCREEN, OFFSCREEN, 0, 0);
-        }
-        this.topCenter = topCenter;
-        layout();
-    }
-
-    /**
-     * Set the control that appears in the top left corner of the pane.
-     * Typically this is a label such as CLabel.
-     * The topLeft is optional.  Setting the top left control to null will remove it from 
-     * the pane - however, the creator of the control must dispose of the control.
-     * 
-     * @param c the control to be displayed in the top left corner or null
-     * 
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setTopLeft(Control c) {
-        checkWidget();
-        if (c != null && c.getParent() != this) {
-            SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-        }
-        if (this.topLeft != null && !this.topLeft.isDisposed()) {
-            this.topLeft.setBounds(OFFSCREEN, OFFSCREEN, 0, 0);
-        }
-        this.topLeft = c;
-        layout();
-    }
-
-    /**
-     * Set the control that appears in the top right corner of the pane.
-     * Typically this is a Close button or a composite with a Menu and Close button.
-     * The topRight is optional.  Setting the top right control to null will remove it from 
-     * the pane - however, the creator of the control must dispose of the control.
-     * 
-     * @param c the control to be displayed in the top right corner or null
-     * 
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     *    <li>ERROR_INVALID_ARGUMENT - if the control is not a child of this ViewForm</li>
-     * </ul>
-     */
-    public void setTopRight(Control c) {
-        checkWidget();
-        if (c != null && c.getParent() != this) {
-            SWT.error(SWT.ERROR_INVALID_ARGUMENT);
-        }
-        if (this.topRight != null && !this.topRight.isDisposed()) {
-            this.topRight.setBounds(OFFSCREEN, OFFSCREEN, 0, 0);
-        }
-        this.topRight = c;
-        layout();
-    }
-
-    /**
-     * Specify whether the border should be displayed or not.
-     * 
-     * @param show true if the border should be displayed
-     * 
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setBorderVisible(boolean show) {
-        checkWidget();
-        if (showBorder == show) {
-			return;
-		}
-
-        showBorder = show;
-        if (showBorder) {
-            if ((getStyle() & SWT.FLAT) != 0) {
-                BORDER_LEFT = BORDER_TOP = BORDER_RIGHT = BORDER_BOTTOM = 1;
-            } else {
-                BORDER_LEFT = BORDER_TOP = 1;
-                BORDER_RIGHT = BORDER_BOTTOM = 3;
-            }
-        } else {
-            BORDER_BOTTOM = BORDER_TOP = BORDER_LEFT = BORDER_RIGHT = 0;
-        }
-
-        layout();
-        redraw();
-    }
-
-    /**
-     * If true, the topCenter will always appear on a separate line by itself, otherwise the 
-     * topCenter will appear in the top row if there is room and will be moved to the second row if
-     * required.
-     * 
-     * @param show true if the topCenter will always appear on a separate line by itself
-     * 
-     * @exception SWTException <ul>
-     *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-     * </ul>
-     */
-    public void setTopCenterSeparate(boolean show) {
-        checkWidget();
-        separateTopCenter = show;
-        layout();
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part1/.classpath b/bundles/org.eclipse.ui.tutorials.rcp.part1/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part1/.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/bundles/org.eclipse.ui.tutorials.rcp.part1/.cvsignore b/bundles/org.eclipse.ui.tutorials.rcp.part1/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part1/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part1/.project b/bundles/org.eclipse.ui.tutorials.rcp.part1/.project
deleted file mode 100644
index e6589e0..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part1/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.tutorials.rcp.part1</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part1/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.tutorials.rcp.part1/META-INF/MANIFEST.MF
deleted file mode 100644
index 200e474..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part1/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,10 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Part1 Plug-in
-Bundle-SymbolicName: org.eclipse.ui.tutorials.rcp.part1; singleton:=true
-Bundle-Version: 1.0.0
-Bundle-Activator: org.eclipse.ui.tutorials.rcp.part1.Part1Plugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime
-Eclipse-AutoStart: true
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part1/build.properties b/bundles/org.eclipse.ui.tutorials.rcp.part1/build.properties
deleted file mode 100644
index 2b0d95b..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part1/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part1/part1.product b/bundles/org.eclipse.ui.tutorials.rcp.part1/part1.product
deleted file mode 100644
index e8c972a..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part1/part1.product
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?pde version="3.1"?>
-
-<product name="RCP Tutorial 1" id="org.eclipse.ui.tutorials.rcp.part1.product" application="org.eclipse.ui.tutorials.rcp.part1.application" useFeatures="false">
-
-   <configIni use="default"/>
-
-   <launcherArgs>
-   </launcherArgs>
-
-   <plugins>
-      <plugin id="org.eclipse.core.commands"/>
-      <plugin id="org.eclipse.core.expressions"/>
-      <plugin id="org.eclipse.core.runtime"/>
-      <plugin id="org.eclipse.help"/>
-      <plugin id="org.eclipse.jface"/>
-      <plugin id="org.eclipse.osgi"/>
-      <plugin id="org.eclipse.swt"/>
-      <plugin id="org.eclipse.swt.win32.win32.x86"/>
-      <plugin id="org.eclipse.ui"/>
-      <plugin id="org.eclipse.ui.tutorials.rcp.part1"/>
-      <plugin id="org.eclipse.ui.workbench"/>
-   </plugins>
-
-</product>
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part1/plugin.xml b/bundles/org.eclipse.ui.tutorials.rcp.part1/plugin.xml
deleted file mode 100644
index df1d470..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part1/plugin.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         id="application"
-         point="org.eclipse.core.runtime.applications">
-      <application>
-         <run
-               class="org.eclipse.ui.tutorials.rcp.part1.Application">
-         </run>
-      </application>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            name="Part1 Perspective"
-            class="org.eclipse.ui.tutorials.rcp.part1.Perspective"
-            id="org.eclipse.ui.tutorials.rcp.part1.perspective">
-      </perspective>
-   </extension>
-   <extension
-         id="product"
-         point="org.eclipse.core.runtime.products">
-      <product
-            application="org.eclipse.ui.tutorials.rcp.part1.application"
-            name="RCP Tutorial 1"/>
-   </extension>
-
-</plugin>
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/Application.java b/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/Application.java
deleted file mode 100644
index 4b7822e..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/Application.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part1;
-
-import org.eclipse.core.runtime.IPlatformRunnable;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This class controls all aspects of the application's execution
- */
-public class Application implements IPlatformRunnable {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IPlatformRunnable#run(java.lang.Object)
-	 */
-	public Object run(Object args) throws Exception {
-		Display display = PlatformUI.createDisplay();
-		try {
-			int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());
-			if (returnCode == PlatformUI.RETURN_RESTART) {
-				return IPlatformRunnable.EXIT_RESTART;
-			}
-			return IPlatformRunnable.EXIT_OK;
-		} finally {
-			display.dispose();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/ApplicationActionBarAdvisor.java b/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/ApplicationActionBarAdvisor.java
deleted file mode 100644
index 5da3f82..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/ApplicationActionBarAdvisor.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part1;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-
-public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
-
-    public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
-        super(configurer);
-    }
-
-    protected void makeActions(IWorkbenchWindow window) {
-    }
-
-    protected void fillMenuBar(IMenuManager menuBar) {
-    }
-    
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/ApplicationWorkbenchAdvisor.java b/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/ApplicationWorkbenchAdvisor.java
deleted file mode 100644
index 58cd3e5..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/ApplicationWorkbenchAdvisor.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part1;
-
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-
-public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
-
-	private static final String PERSPECTIVE_ID = "org.eclipse.ui.tutorials.rcp.part1.perspective";
-
-    public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-        return new ApplicationWorkbenchWindowAdvisor(configurer);
-    }
-
-	public String getInitialWindowPerspectiveId() {
-		return PERSPECTIVE_ID;
-	}
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/ApplicationWorkbenchWindowAdvisor.java b/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/ApplicationWorkbenchWindowAdvisor.java
deleted file mode 100644
index e6d5b32..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/ApplicationWorkbenchWindowAdvisor.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part1;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-
-public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
-
-    public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-        super(configurer);
-    }
-
-    public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
-        return new ApplicationActionBarAdvisor(configurer);
-    }
-    
-    public void preWindowOpen() {
-        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-        configurer.setInitialSize(new Point(400, 300));
-        configurer.setShowCoolBar(false);
-        configurer.setShowStatusLine(false);
-        configurer.setTitle("Hello RCP");
-    }
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/Part1Plugin.java b/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/Part1Plugin.java
deleted file mode 100644
index b2ed123..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/Part1Plugin.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part1;
-
-import org.eclipse.ui.plugin.*;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class Part1Plugin extends AbstractUIPlugin {
-
-	//The shared instance.
-	private static Part1Plugin plugin;
-	
-	/**
-	 * The constructor.
-	 */
-	public Part1Plugin() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static Part1Plugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path.
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ui.tutorials.rcp.part1", path);
-	}
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/Perspective.java b/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/Perspective.java
deleted file mode 100644
index 0680b93..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part1/src/org/eclipse/ui/tutorials/rcp/part1/Perspective.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part1;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-public class Perspective implements IPerspectiveFactory {
-
-	public void createInitialLayout(IPageLayout layout) {
-	}
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part2/.classpath b/bundles/org.eclipse.ui.tutorials.rcp.part2/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part2/.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/bundles/org.eclipse.ui.tutorials.rcp.part2/.cvsignore b/bundles/org.eclipse.ui.tutorials.rcp.part2/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part2/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part2/.project b/bundles/org.eclipse.ui.tutorials.rcp.part2/.project
deleted file mode 100644
index 240ce3a..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part2/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.tutorials.rcp.part2</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part2/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.tutorials.rcp.part2/META-INF/MANIFEST.MF
deleted file mode 100644
index 54860e8..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part2/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,10 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Part2 Plug-in
-Bundle-SymbolicName: org.eclipse.ui.tutorials.rcp.part2; singleton:=true
-Bundle-Version: 1.0.0
-Bundle-Activator: org.eclipse.ui.tutorials.rcp.part2.Part2Plugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime
-Eclipse-AutoStart: true
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part2/build.properties b/bundles/org.eclipse.ui.tutorials.rcp.part2/build.properties
deleted file mode 100644
index 2b0d95b..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part2/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part2/part2.product b/bundles/org.eclipse.ui.tutorials.rcp.part2/part2.product
deleted file mode 100644
index 8aa4fef..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part2/part2.product
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?pde version="3.1"?>
-
-<product name="RCP Tutorial 2" id="org.eclipse.ui.tutorials.rcp.part2.product" application="org.eclipse.ui.tutorials.rcp.part2.application" useFeatures="false">
-
-   <configIni use="default"/>
-
-   <launcherArgs>
-   </launcherArgs>
-
-   <plugins>
-      <plugin id="org.eclipse.core.commands"/>
-      <plugin id="org.eclipse.core.expressions"/>
-      <plugin id="org.eclipse.core.runtime"/>
-      <plugin id="org.eclipse.help"/>
-      <plugin id="org.eclipse.jface"/>
-      <plugin id="org.eclipse.osgi"/>
-      <plugin id="org.eclipse.swt"/>
-      <plugin id="org.eclipse.swt.win32.win32.x86"/>
-      <plugin id="org.eclipse.ui"/>
-      <plugin id="org.eclipse.ui.tutorials.rcp.part2"/>
-      <plugin id="org.eclipse.ui.workbench"/>
-   </plugins>
-
-</product>
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part2/plugin.xml b/bundles/org.eclipse.ui.tutorials.rcp.part2/plugin.xml
deleted file mode 100644
index ea7415b..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part2/plugin.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         id="application"
-         point="org.eclipse.core.runtime.applications">
-      <application>
-         <run
-               class="org.eclipse.ui.tutorials.rcp.part2.Application">
-         </run>
-      </application>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            name="Part2 Perspective"
-            class="org.eclipse.ui.tutorials.rcp.part2.Perspective"
-            id="org.eclipse.ui.tutorials.rcp.part2.perspective">
-      </perspective>
-   </extension>
-   <extension
-         id="product"
-         point="org.eclipse.core.runtime.products">
-      <product
-            application="org.eclipse.ui.tutorials.rcp.part2.application"
-            name="RCP Tutorial 2"/>
-   </extension>
-
-</plugin>
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/Application.java b/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/Application.java
deleted file mode 100644
index 6292541..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/Application.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part2;
-
-import org.eclipse.core.runtime.IPlatformRunnable;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This class controls all aspects of the application's execution
- */
-public class Application implements IPlatformRunnable {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IPlatformRunnable#run(java.lang.Object)
-	 */
-	public Object run(Object args) throws Exception {
-		Display display = PlatformUI.createDisplay();
-		try {
-			int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());
-			if (returnCode == PlatformUI.RETURN_RESTART) {
-				return IPlatformRunnable.EXIT_RESTART;
-			}
-			return IPlatformRunnable.EXIT_OK;
-		} finally {
-			display.dispose();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/ApplicationActionBarAdvisor.java b/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/ApplicationActionBarAdvisor.java
deleted file mode 100644
index 351bc6d..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/ApplicationActionBarAdvisor.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part2;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-
-public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
-
-    public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
-        super(configurer);
-    }
-
-    protected void makeActions(IWorkbenchWindow window) {
-    }
-
-    protected void fillMenuBar(IMenuManager menuBar) {
-    }
-    
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/ApplicationWorkbenchAdvisor.java b/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/ApplicationWorkbenchAdvisor.java
deleted file mode 100644
index a76ee8b..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/ApplicationWorkbenchAdvisor.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part2;
-
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-
-public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
-
-	private static final String PERSPECTIVE_ID = "org.eclipse.ui.tutorials.rcp.part2.perspective";
-
-    public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-        return new ApplicationWorkbenchWindowAdvisor(configurer);
-    }
-
-	public String getInitialWindowPerspectiveId() {
-		return PERSPECTIVE_ID;
-	}
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/ApplicationWorkbenchWindowAdvisor.java b/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/ApplicationWorkbenchWindowAdvisor.java
deleted file mode 100644
index 2d9d918..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/ApplicationWorkbenchWindowAdvisor.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part2;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-
-public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
-
-    public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-        super(configurer);
-    }
-
-    public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
-        return new ApplicationActionBarAdvisor(configurer);
-    }
-    
-    public void preWindowOpen() {
-        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-        configurer.setInitialSize(new Point(400, 300));
-        configurer.setShowCoolBar(false);
-        configurer.setShowStatusLine(false);
-        configurer.setTitle("Hello RCP");
-    }
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/Part2Plugin.java b/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/Part2Plugin.java
deleted file mode 100644
index aac1f4e..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/Part2Plugin.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part2;
-
-import org.eclipse.ui.plugin.*;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class Part2Plugin extends AbstractUIPlugin {
-
-	//The shared instance.
-	private static Part2Plugin plugin;
-	
-	/**
-	 * The constructor.
-	 */
-	public Part2Plugin() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static Part2Plugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path.
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ui.tutorials.rcp.part2", path);
-	}
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/Perspective.java b/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/Perspective.java
deleted file mode 100644
index 913f0a4..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part2/src/org/eclipse/ui/tutorials/rcp/part2/Perspective.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part2;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-public class Perspective implements IPerspectiveFactory {
-
-	public void createInitialLayout(IPageLayout layout) {
-	}
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/.classpath b/bundles/org.eclipse.ui.tutorials.rcp.part3/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/.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/bundles/org.eclipse.ui.tutorials.rcp.part3/.cvsignore b/bundles/org.eclipse.ui.tutorials.rcp.part3/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/.project b/bundles/org.eclipse.ui.tutorials.rcp.part3/.project
deleted file mode 100644
index 0f0612a..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.tutorials.rcp.part3</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.tutorials.rcp.part3/META-INF/MANIFEST.MF
deleted file mode 100644
index 42daae3..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,10 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Part3 Plug-in
-Bundle-SymbolicName: org.eclipse.ui.tutorials.rcp.part3; singleton:=true
-Bundle-Version: 1.0.0
-Bundle-Activator: org.eclipse.ui.tutorials.rcp.part3.Part3Plugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime
-Eclipse-AutoStart: true
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/build.properties b/bundles/org.eclipse.ui.tutorials.rcp.part3/build.properties
deleted file mode 100644
index 7493b25..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .,\
-               icons/,\
-               plugin.properties,\
-               product_lg.gif,\
-               splash.bmp
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/icons/sample.gif b/bundles/org.eclipse.ui.tutorials.rcp.part3/icons/sample.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/icons/sample.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/icons/sample.icns b/bundles/org.eclipse.ui.tutorials.rcp.part3/icons/sample.icns
deleted file mode 100644
index 1e92ccc..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/icons/sample.icns
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/icons/sample2.gif b/bundles/org.eclipse.ui.tutorials.rcp.part3/icons/sample2.gif
deleted file mode 100644
index 252d7eb..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/icons/sample2.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/icons/sample3.gif b/bundles/org.eclipse.ui.tutorials.rcp.part3/icons/sample3.gif
deleted file mode 100644
index b949ac9..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/icons/sample3.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/part3.product b/bundles/org.eclipse.ui.tutorials.rcp.part3/part3.product
deleted file mode 100644
index 0fcf82e..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/part3.product
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?pde version="3.1"?>
-
-<product name="RCP Tutorial 3" id="org.eclipse.ui.tutorials.rcp.part3.product" application="org.eclipse.ui.tutorials.rcp.part3.application" useFeatures="false">
-
-   <aboutInfo>
-      <image path="/org.eclipse.ui.tutorials.rcp.part3/product_lg.gif"/>
-      <text>
-         RCP Tutorial 3
-Version 1.0.0
-by Ed Burnette
-
-For more information on Eclipse and the
-Rich Client Platform visit:
-http://www.eclipse.org
-
-Copyrights and other legal stuff goes here.
-      </text>
-   </aboutInfo>
-
-   <configIni use="default"/>
-
-   <launcherArgs>
-   </launcherArgs>
-
-   <windowImages/>
-
-
-   <launcher>
-      <solaris/>
-      <win useIco="false">
-         <bmp/>
-      </win>
-   </launcher>
-
-   <plugins>
-      <plugin id="org.eclipse.core.commands"/>
-      <plugin id="org.eclipse.core.expressions"/>
-      <plugin id="org.eclipse.core.runtime"/>
-      <plugin id="org.eclipse.help"/>
-      <plugin id="org.eclipse.jface"/>
-      <plugin id="org.eclipse.osgi"/>
-      <plugin id="org.eclipse.swt"/>
-      <plugin id="org.eclipse.swt.win32.win32.x86"/>
-      <plugin id="org.eclipse.ui"/>
-      <plugin id="org.eclipse.ui.tutorials.rcp.part3"/>
-      <plugin id="org.eclipse.ui.workbench"/>
-   </plugins>
-
-</product>
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/plugin.properties b/bundles/org.eclipse.ui.tutorials.rcp.part3/plugin.properties
deleted file mode 100644
index 77a85f2..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/plugin.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-aboutText=This RCP Application was generated from\n\
-the PDE Plug-in Project wizard.\n\n\
-This sample shows how to:\n\
-- add a top-level menu and toolbar with actions\n\
-- add keybindings to actions\n\
-- create views that can't be closed and\n\
-  multiple instances of the same view\n\
-- perspectives with placeholders for new views\n\
-- use the default about dialog\n\
-- create a product definition\n
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/plugin.xml b/bundles/org.eclipse.ui.tutorials.rcp.part3/plugin.xml
deleted file mode 100644
index da19e7c..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/plugin.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         id="application"
-         point="org.eclipse.core.runtime.applications">
-      <application>
-         <run
-               class="org.eclipse.ui.tutorials.rcp.part3.Application">
-         </run>
-      </application>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            name="Part3 Perspective"
-            class="org.eclipse.ui.tutorials.rcp.part3.Perspective"
-            id="org.eclipse.ui.tutorials.rcp.part3.perspective">
-      </perspective>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            name="Message"
-            allowMultiple="true"
-            icon="icons/sample2.gif"
-            class="org.eclipse.ui.tutorials.rcp.part3.View"
-            id="org.eclipse.ui.tutorials.rcp.part3.view">
-      </view>
-      <view
-            name="Mailboxes"
-            allowMultiple="true"
-            icon="icons/sample3.gif"
-            class="org.eclipse.ui.tutorials.rcp.part3.NavigationView"
-            id="org.eclipse.ui.tutorials.rcp.part3.navigationView">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commands">
-      <category
-            name="Mail"
-            id="org.eclipse.ui.tutorials.rcp.part3.category">
-      </category>
-      <command
-            name="Open Mailbox"
-            description="Opens a mailbox"
-            categoryId="org.eclipse.ui.tutorials.rcp.part3.category"
-            id="org.eclipse.ui.tutorials.rcp.part3.open">
-      </command>
-      <command
-            name="Open Message Dialog"
-            description="Open a message dialog"
-            categoryId="org.eclipse.ui.tutorials.rcp.part3.category"
-            id="org.eclipse.ui.tutorials.rcp.part3.openMessage">
-      </command>
-   </extension>
-   <extension
-         point="org.eclipse.ui.bindings">
-      <key
-            commandId="org.eclipse.ui.tutorials.rcp.part3.open"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+2">
-      </key>
-      <key
-            commandId="org.eclipse.ui.tutorials.rcp.part3.openMessage"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+3">
-      </key>
-      <key
-            commandId="org.eclipse.ui.file.exit"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+X">
-      </key>
-   </extension>
-   <extension
-         id="product"
-         point="org.eclipse.core.runtime.products">
-      <product
-            application="org.eclipse.ui.tutorials.rcp.part3.application"
-            name="RCP Tutorial 3">
-         <property
-               name="aboutImage"
-               value="product_lg.gif"/>
-         <property
-               name="aboutText"
-               value="RCP Tutorial 3&#x0A;Version 1.0.0&#x0A;by Ed Burnette&#x0A;&#x0A;For more information on Eclipse and the&#x0A;Rich Client Platform visit:&#x0A;http://www.eclipse.org&#x0A;&#x0A;Copyrights and other legal stuff goes here."/>
-      </product>
-   </extension>
-
-</plugin>
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/product_lg.gif b/bundles/org.eclipse.ui.tutorials.rcp.part3/product_lg.gif
deleted file mode 100644
index bd95e28..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/product_lg.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/splash.bmp b/bundles/org.eclipse.ui.tutorials.rcp.part3/splash.bmp
deleted file mode 100644
index 99ea60d..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/splash.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/Application.java b/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/Application.java
deleted file mode 100644
index 2e1c6eb..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/Application.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part3;
-
-import org.eclipse.core.runtime.IPlatformRunnable;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This class controls all aspects of the application's execution
- */
-public class Application implements IPlatformRunnable {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IPlatformRunnable#run(java.lang.Object)
-	 */
-	public Object run(Object args) throws Exception {
-		Display display = PlatformUI.createDisplay();
-		try {
-			int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());
-			if (returnCode == PlatformUI.RETURN_RESTART) {
-				return IPlatformRunnable.EXIT_RESTART;
-			}
-			return IPlatformRunnable.EXIT_OK;
-		} finally {
-			display.dispose();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/ApplicationActionBarAdvisor.java b/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/ApplicationActionBarAdvisor.java
deleted file mode 100644
index e500bf1..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/ApplicationActionBarAdvisor.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part3;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.ICoolBarManager;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.action.ToolBarContributionItem;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-
-/**
- * An action bar advisor is responsible for creating, adding, and disposing of the
- * actions added to a workbench window. Each window will be populated with
- * new actions.
- */
-public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
-
-    // Actions - important to allocate these only in makeActions, and then use them
-    // in the fill methods.  This ensures that the actions aren't recreated
-    // when fillActionBars is called with FILL_PROXY.
-    private IWorkbenchAction exitAction;
-    private IWorkbenchAction aboutAction;
-    private IWorkbenchAction newWindowAction;
-    private OpenViewAction openViewAction;
-    private Action messagePopupAction;
-    
-
-    public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
-        super(configurer);
-    }
-    
-    protected void makeActions(final IWorkbenchWindow window) {
-        // Creates the actions and registers them.
-        // Registering is needed to ensure that key bindings work.
-        // The corresponding commands keybindings are defined in the plugin.xml file.
-        // Registering also provides automatic disposal of the actions when
-        // the window is closed.
-
-        exitAction = ActionFactory.QUIT.create(window);
-        register(exitAction);
-        
-        aboutAction = ActionFactory.ABOUT.create(window);
-        register(aboutAction);
-        
-        newWindowAction = ActionFactory.OPEN_NEW_WINDOW.create(window);
-        register(newWindowAction);
-        
-        openViewAction = new OpenViewAction(window, "Open Another Message View", View.ID);
-        register(openViewAction);
-        
-        messagePopupAction = new MessagePopupAction("Open Message", window);
-        register(messagePopupAction);
-    }
-    
-    protected void fillMenuBar(IMenuManager menuBar) {
-        MenuManager fileMenu = new MenuManager("&File", IWorkbenchActionConstants.M_FILE);
-        MenuManager helpMenu = new MenuManager("&Help", IWorkbenchActionConstants.M_HELP);
-        
-        menuBar.add(fileMenu);
-        // Add a group marker indicating where action set menus will appear.
-        menuBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-        menuBar.add(helpMenu);
-        
-        // File
-        fileMenu.add(newWindowAction);
-        fileMenu.add(new Separator());
-        fileMenu.add(messagePopupAction);
-        fileMenu.add(openViewAction);
-        fileMenu.add(new Separator());
-        fileMenu.add(exitAction);
-        
-        // Help
-        helpMenu.add(aboutAction);
-    }
-    
-    protected void fillCoolBar(ICoolBarManager coolBar) {
-        IToolBarManager toolbar = new ToolBarManager(SWT.FLAT | SWT.RIGHT);
-        coolBar.add(new ToolBarContributionItem(toolbar, "main"));   
-        toolbar.add(openViewAction);
-        toolbar.add(messagePopupAction);
-    }
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/ApplicationWorkbenchAdvisor.java b/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/ApplicationWorkbenchAdvisor.java
deleted file mode 100644
index fb51c0f..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/ApplicationWorkbenchAdvisor.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part3;
-
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-
-/**
- * This workbench advisor creates the window advisor, and specifies
- * the perspective id for the initial window.
- */
-public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
-	
-	private static final String PERSPECTIVE_ID = "org.eclipse.ui.tutorials.rcp.part3.perspective";
-
-    public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-        return new ApplicationWorkbenchWindowAdvisor(configurer);
-    }
-
-	public String getInitialWindowPerspectiveId() {
-		return PERSPECTIVE_ID;
-	} 
-	
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/ApplicationWorkbenchWindowAdvisor.java b/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/ApplicationWorkbenchWindowAdvisor.java
deleted file mode 100644
index 432df34..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/ApplicationWorkbenchWindowAdvisor.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part3;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-
-public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
-
-    public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-        super(configurer);
-    }
-
-    public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
-        return new ApplicationActionBarAdvisor(configurer);
-    }
-    
-    public void preWindowOpen() {
-        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-        configurer.setInitialSize(new Point(600, 400));
-        configurer.setShowCoolBar(true);
-        configurer.setShowStatusLine(false);
-    }
-    
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/ICommandIds.java b/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/ICommandIds.java
deleted file mode 100644
index 8e7ea30..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/ICommandIds.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part3;
-
-/**
- * Interface defining the application's command IDs.
- * Key bindings can be defined for specific commands.
- * To associate an action with a command, use IAction.setActionDefinitionId(commandId).
- *
- * @see org.eclipse.jface.action.IAction#setActionDefinitionId(String)
- */
-public interface ICommandIds {
-
-    public static final String CMD_OPEN = "org.eclipse.ui.tutorials.rcp.part3.open";
-    public static final String CMD_OPEN_MESSAGE = "org.eclipse.ui.tutorials.rcp.part3.openMessage";
-    
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/MessagePopupAction.java b/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/MessagePopupAction.java
deleted file mode 100644
index 7d011ae..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/MessagePopupAction.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part3;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ui.IWorkbenchWindow;
-
-
-public class MessagePopupAction extends Action {
-
-    private final IWorkbenchWindow window;
-
-    MessagePopupAction(String text, IWorkbenchWindow window) {
-        super(text);
-        this.window = window;
-        // The id is used to refer to the action in a menu or toolbar
-        setId(ICommandIds.CMD_OPEN_MESSAGE);
-        // Associate the action with a pre-defined command, to allow key bindings.
-        setActionDefinitionId(ICommandIds.CMD_OPEN_MESSAGE);
-        setImageDescriptor(org.eclipse.ui.tutorials.rcp.part3.Part3Plugin.getImageDescriptor("/icons/sample3.gif"));
-    }
-
-    public void run() {
-        MessageDialog.openInformation(window.getShell(), "Open", "Open Message Dialog!");
-    }
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/NavigationView.java b/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/NavigationView.java
deleted file mode 100644
index 1e72e1f..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/NavigationView.java
+++ /dev/null
@@ -1,151 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part3;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.ViewPart;
-
-public class NavigationView extends ViewPart {
-	public static final String ID = "org.eclipse.ui.tutorials.rcp.part3.navigationView";
-	private TreeViewer viewer;
-	 
-	class TreeObject {
-		private String name;
-		private TreeParent parent;
-		
-		public TreeObject(String name) {
-			this.name = name;
-		}
-		public String getName() {
-			return name;
-		}
-		public void setParent(TreeParent parent) {
-			this.parent = parent;
-		}
-		public TreeParent getParent() {
-			return parent;
-		}
-		public String toString() {
-			return getName();
-		}
-	}
-	
-	class TreeParent extends TreeObject {
-		private ArrayList children;
-		public TreeParent(String name) {
-			super(name);
-			children = new ArrayList();
-		}
-		public void addChild(TreeObject child) {
-			children.add(child);
-			child.setParent(this);
-		}
-		public void removeChild(TreeObject child) {
-			children.remove(child);
-			child.setParent(null);
-		}
-		public TreeObject[] getChildren() {
-			return (TreeObject[]) children.toArray(new TreeObject[children.size()]);
-		}
-		public boolean hasChildren() {
-			return children.size()>0;
-		}
-	}
-
-	class ViewContentProvider implements IStructuredContentProvider, 
-										   ITreeContentProvider {
-
-        public void inputChanged(Viewer v, Object oldInput, Object newInput) {
-		}
-        
-		public void dispose() {
-		}
-        
-		public Object[] getElements(Object parent) {
-			return getChildren(parent);
-		}
-        
-		public Object getParent(Object child) {
-			if (child instanceof TreeObject) {
-				return ((TreeObject)child).getParent();
-			}
-			return null;
-		}
-        
-		public Object[] getChildren(Object parent) {
-			if (parent instanceof TreeParent) {
-				return ((TreeParent)parent).getChildren();
-			}
-			return new Object[0];
-		}
-
-        public boolean hasChildren(Object parent) {
-			if (parent instanceof TreeParent)
-				return ((TreeParent)parent).hasChildren();
-			return false;
-		}
-	}
-	
-	class ViewLabelProvider extends LabelProvider {
-
-		public String getText(Object obj) {
-			return obj.toString();
-		}
-		public Image getImage(Object obj) {
-			String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
-			if (obj instanceof TreeParent)
-			   imageKey = ISharedImages.IMG_OBJ_FOLDER;
-			return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
-		}
-	}
-
-    /**
-     * We will set up a dummy model to initialize tree heararchy. In real
-     * code, you will connect to a real model and expose its hierarchy.
-     */
-    private TreeObject createDummyModel() {
-        TreeObject to1 = new TreeObject("Inbox");
-        TreeObject to2 = new TreeObject("Drafts");
-        TreeObject to3 = new TreeObject("Sent");
-        TreeParent p1 = new TreeParent("me@this.com");
-        p1.addChild(to1);
-        p1.addChild(to2);
-        p1.addChild(to3);
-
-        TreeObject to4 = new TreeObject("Inbox");
-        TreeParent p2 = new TreeParent("other@aol.com");
-        p2.addChild(to4);
-
-        TreeParent root = new TreeParent("");
-        root.addChild(p1);
-        root.addChild(p2);
-        return root;
-    }
-
-	/**
-     * This is a callback that will allow us to create the viewer and initialize
-     * it.
-     */
-	public void createPartControl(Composite parent) {
-		viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		viewer.setContentProvider(new ViewContentProvider());
-		viewer.setLabelProvider(new ViewLabelProvider());
-		viewer.setInput(createDummyModel());
-	}
-
-	/**
-	 * Passing the focus request to the viewer's control.
-	 */
-	public void setFocus() {
-		viewer.getControl().setFocus();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/OpenViewAction.java b/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/OpenViewAction.java
deleted file mode 100644
index 96fad50..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/OpenViewAction.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part3;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-
-
-public class OpenViewAction extends Action {
-	
-	private final IWorkbenchWindow window;
-	private int instanceNum = 0;
-	private final String viewId;
-	
-	public OpenViewAction(IWorkbenchWindow window, String label, String viewId) {
-		this.window = window;
-		this.viewId = viewId;
-        setText(label);
-        // The id is used to refer to the action in a menu or toolbar
-		setId(ICommandIds.CMD_OPEN);
-        // Associate the action with a pre-defined command, to allow key bindings.
-		setActionDefinitionId(ICommandIds.CMD_OPEN);
-		setImageDescriptor(org.eclipse.ui.tutorials.rcp.part3.Part3Plugin.getImageDescriptor("/icons/sample2.gif"));
-	}
-	
-	public void run() {
-		if(window != null) {	
-			try {
-				window.getActivePage().showView(viewId, Integer.toString(instanceNum++), IWorkbenchPage.VIEW_ACTIVATE);
-			} catch (PartInitException e) {
-				MessageDialog.openError(window.getShell(), "Error", "Error opening view:" + e.getMessage());
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/Part3Plugin.java b/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/Part3Plugin.java
deleted file mode 100644
index c8b7d98..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/Part3Plugin.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part3;
-
-import org.eclipse.ui.plugin.*;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class Part3Plugin extends AbstractUIPlugin {
-
-	//The shared instance.
-	private static Part3Plugin plugin;
-	
-	/**
-	 * The constructor.
-	 */
-	public Part3Plugin() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static Part3Plugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path.
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ui.tutorials.rcp.part3", path);
-	}
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/Perspective.java b/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/Perspective.java
deleted file mode 100644
index 91c7171..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/Perspective.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part3;
-
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-public class Perspective implements IPerspectiveFactory {
-
-	public void createInitialLayout(IPageLayout layout) {
-		String editorArea = layout.getEditorArea();
-		layout.setEditorAreaVisible(false);
-		
-		layout.addStandaloneView(NavigationView.ID,  false, IPageLayout.LEFT, 0.25f, editorArea);
-		IFolderLayout folder = layout.createFolder("messages", IPageLayout.TOP, 0.5f, editorArea);
-		folder.addPlaceholder(View.ID + ":*");
-		folder.addView(View.ID);
-		
-		layout.getViewLayout(NavigationView.ID).setCloseable(false);
-	}
-}
diff --git a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/View.java b/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/View.java
deleted file mode 100644
index 36fc658..0000000
--- a/bundles/org.eclipse.ui.tutorials.rcp.part3/src/org/eclipse/ui/tutorials/rcp/part3/View.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.eclipse.ui.tutorials.rcp.part3;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-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.Link;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.part.ViewPart;
-
-public class View extends ViewPart {
-
-	public static final String ID = "org.eclipse.ui.tutorials.rcp.part3.view";
-	
-	public void createPartControl(Composite parent) {
-		Composite top = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		top.setLayout(layout);
-		// top banner
-		Composite banner = new Composite(top, SWT.NONE);
-		banner.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL, GridData.VERTICAL_ALIGN_BEGINNING, true, false));
-		layout = new GridLayout();
-		layout.marginHeight = 5;
-		layout.marginWidth = 10;
-		layout.numColumns = 2;
-		banner.setLayout(layout);
-		
-		// setup bold font
-		Font boldFont = JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT);    
-		
-		Label l = new Label(banner, SWT.WRAP);
-		l.setText("Subject:");
-		l.setFont(boldFont);
-		l = new Label(banner, SWT.WRAP);
-		l.setText("This is a message about the cool Eclipse RCP!");
-		
-		l = new Label(banner, SWT.WRAP);
-		l.setText("From:");
-		l.setFont(boldFont);
-    
-		final Link link = new Link(banner, SWT.NONE);
-		link.setText("<a>nicole@mail.org</a>");
-		link.addSelectionListener(new SelectionAdapter() {    
-			public void widgetSelected(SelectionEvent e) {
-				MessageDialog.openInformation(getSite().getShell(), "Not Implemented", "Imagine the address book or a new message being created now.");
-			}    
-		});
-    
-		l = new Label(banner, SWT.WRAP);
-		l.setText("Date:");
-		l.setFont(boldFont);
-		l = new Label(banner, SWT.WRAP);
-		l.setText("10:34 am");
-		// message contents
-		Text text = new Text(top, SWT.MULTI | SWT.WRAP);
-		text.setText("This RCP Application was generated from the PDE Plug-in Project wizard. This sample shows how to:\n"+
-						"- add a top-level menu and toolbar with actions\n"+
-						"- add keybindings to actions\n" +
-						"- create views that can't be closed and\n"+
-						"  multiple instances of the same view\n"+
-						"- perspectives with placeholders for new views\n"+
-						"- use the default about dialog\n"+
-						"- create a product definition\n");
-		text.setLayoutData(new GridData(GridData.FILL_BOTH));
-	}
-
-	public void setFocus() {
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/.classpath b/bundles/org.eclipse.ui.views.properties.tabbed/.classpath
deleted file mode 100644
index ce0c7a5..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/CDC-1.0%Foundation-1.0"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/.cvsignore b/bundles/org.eclipse.ui.views.properties.tabbed/.cvsignore
deleted file mode 100644
index f0a691e..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-doc
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/.project b/bundles/org.eclipse.ui.views.properties.tabbed/.project
deleted file mode 100644
index a1d39d5..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.views.properties.tabbed</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/.settings/.api_filters b/bundles/org.eclipse.ui.views.properties.tabbed/.settings/.api_filters
deleted file mode 100644
index b591f7b..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/.settings/.api_filters
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<component id="org.eclipse.ui.views.properties.tabbed" version="2">
-    <resource path="src/org/eclipse/ui/views/properties/tabbed/ITabSelectionListener.java" type="org.eclipse.ui.views.properties.tabbed.ITabSelectionListener">
-        <filter id="403804204">
-            <message_arguments>
-                <message_argument value="org.eclipse.ui.views.properties.tabbed.ITabSelectionListener"/>
-                <message_argument value="tabSelected(ITabDescriptor)"/>
-            </message_arguments>
-        </filter>
-        <filter id="405901410">
-            <message_arguments>
-                <message_argument value="org.eclipse.ui.views.properties.tabbed.ITabSelectionListener"/>
-                <message_argument value="tabSelected(TabDescriptor)"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/ui/views/properties/tabbed/ISectionDescriptor.java" type="org.eclipse.ui.views.properties.tabbed.ISectionDescriptor">
-        <filter id="403767336">
-            <message_arguments>
-                <message_argument value="org.eclipse.ui.views.properties.tabbed.ISectionDescriptor"/>
-                <message_argument value="TOP"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/ui/views/properties/tabbed/TabbedPropertySheetPage.java" type="org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage">
-        <filter id="338792546">
-            <message_arguments>
-                <message_argument value="org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage"/>
-                <message_argument value="getCurrentTab()"/>
-            </message_arguments>
-        </filter>
-        <filter id="338792546">
-            <message_arguments>
-                <message_argument value="org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage"/>
-                <message_argument value="updateTabs(TabDescriptor[])"/>
-            </message_arguments>
-        </filter>
-    </resource>
-</component>
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.ui.views.properties.tabbed/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 9a50745..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,70 +0,0 @@
-#Tue Sep 11 09:39:14 EDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.1
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.3
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.ui.views.properties.tabbed/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index b323b7f..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Wed Jul 02 15:17:10 EDT 2008
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} The ${bare_field_name} to set.\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n ******************************************************************************/\r\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @since 3.5\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template></templates>
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.ui.views.properties.tabbed/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index d8e8469..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Nov 16 14:12:29 EST 2004
-compilers.p.unused-element-or-attribute=1
-compilers.p.unresolved-ex-points=0
-compilers.p.deprecated=0
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unknown-class=1
-compilers.p.unknown-attribute=0
-compilers.p.no-required-att=0
-eclipse.preferences.version=1
-compilers.p.unresolved-import=0
-compilers.p.not-externalized-att=0
-compilers.p.illegal-att-value=0
-compilers.use-project=true
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.views.properties.tabbed/META-INF/MANIFEST.MF
deleted file mode 100644
index d6657a7..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui.views.properties.tabbed;singleton:=true
-Bundle-Version: 3.5.0.qualifier
-Bundle-Activator: org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewPlugin
-Bundle-Vendor: %Plugin.providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.ui.internal.views.properties.tabbed;x-internal:=true,
- org.eclipse.ui.internal.views.properties.tabbed.l10n;x-internal:=true,
- org.eclipse.ui.internal.views.properties.tabbed.view;x-internal:=true,
- org.eclipse.ui.views.properties.tabbed
-Require-Bundle: org.eclipse.ui.forms;bundle-version="[3.3.0,4.0.0)";visibility:=reexport,
- org.eclipse.ui.views;bundle-version="[3.2.0,4.0.0)";visibility:=reexport,
- org.eclipse.ui;bundle-version="[3.3.0,4.0.0)";visibility:=reexport,
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)"
-Import-Package: com.ibm.icu.text
-Bundle-RequiredExecutionEnvironment: CDC-1.0/Foundation-1.0,
- J2SE-1.3
-Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/about.html b/bundles/org.eclipse.ui.views.properties.tabbed/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/build.properties b/bundles/org.eclipse.ui.views.properties.tabbed/build.properties
deleted file mode 100644
index a4efc20..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               plugin.properties,\
-               .,\
-               META-INF/,\
-               about.html
-src.includes = about.html,\
-               schema/
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/plugin.properties b/bundles/org.eclipse.ui.views.properties.tabbed/plugin.properties
deleted file mode 100644
index be38cad..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Plugin.name = Tabbed Properties View
-Plugin.providerName = Eclipse.org
-
-ExtPoint.propertyContributor = Property Contributor
-ExtPoint.propertyTabs = Property Tabs
-ExtPoint.propertySections = Property Sections
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/plugin.xml b/bundles/org.eclipse.ui.views.properties.tabbed/plugin.xml
deleted file mode 100644
index 848ec50..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/plugin.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension-point id="propertyContributor" name="%ExtPoint.propertyContributor" schema="schema/propertyContributor.exsd"/>
-   <extension-point id="propertyTabs" name="%ExtPoint.propertyTabs" schema="schema/propertyTabs.exsd"/>
-   <extension-point id="propertySections" name="%ExtPoint.propertySections" schema="schema/propertySections.exsd"/>
-
-</plugin>
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/schema/propertyContributor.exsd b/bundles/org.eclipse.ui.views.properties.tabbed/schema/propertyContributor.exsd
deleted file mode 100644
index 21166c6..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/schema/propertyContributor.exsd
+++ /dev/null
@@ -1,188 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.views.properties.tabbed">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui.views.properties.tabbed" id="propertyContributor" name="Property Contributor"/>
-      </appInfo>
-      <documentation>
-         Describes a workbench part that is a contributor of properties to be displayed within tabs in the tabbed property sheet page.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="propertyContributor"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="propertyContributor">
-      <complexType>
-         <sequence>
-            <element ref="propertyCategory" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="contributorId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique identifier of the property sheet page contributor.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="typeMapper" type="string">
-            <annotation>
-               <documentation>
-                  The class that implements the type mapper, i.e. implements &lt;tt&gt;org.eclipse.ui.views.properties.tabbed.ITypeMapper&lt;/tt&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.views.properties.tabbed.ITypeMapper"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="labelProvider" type="string">
-            <annotation>
-               <documentation>
-                  The class that implements the label provider for the title for the property sheet page, i.e. implements &lt;tt&gt;org.eclipse.jface.viewers.ILabelProvider&lt;/tt&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jface.viewers.ILabelProvider"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="actionProvider" type="string">
-            <annotation>
-               <documentation>
-                  The class that implements the action provider for the property sheet page, i.e. implements &lt;tt&gt;org.eclipse.ui.views.properties.tabbed.IActionProvider&lt;/tt&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.views.properties.tabbed.IActionProvider"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="sectionDescriptorProvider" type="string">
-            <annotation>
-               <documentation>
-                  The class that implements the section descriptor provider for the property sheet page, i.e. implements &lt;tt&gt;org.eclipse.ui.views.properties.tabbed.ISectionDescriptorProvider&lt;/tt&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.views.properties.tabbed.ISectionDescriptorProvider"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="tabDescriptorProvider" type="string">
-            <annotation>
-               <documentation>
-                  The class that implements the tab descriptor provider for the property sheet page, i.e. implements &lt;tt&gt;org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider&lt;/tt&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="overridableTabListContentProvider" type="boolean">
-            <annotation>
-               <documentation>
-                  If true then this contributor will override the list of tabs by using sections that extend &lt;tt&gt;org.eclipse.ui.views.properties.tabbed.AbstractOverridableTabListPropertySection&lt;/tt&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="propertyCategory">
-      <complexType>
-         <attribute name="category" type="string">
-            <annotation>
-               <documentation>
-                  A category used to group tabs.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.ui.views.properties.tabbed.propertyContributor&quot;&gt;
-      &lt;propertyContributor
-            contributorId=&quot;org.eclipse.ui.tests.views.properties.tabbed.views.TestsView&quot;
-            labelProvider=&quot;org.eclipse.ui.tests.views.properties.tabbed.views.LabelProvider&quot;
-            typeMapper=&quot;org.eclipse.ui.tests.views.properties.tabbed.views.TypeMapper&quot;&gt;
-         &lt;propertyCategory category=&quot;first&quot;&gt;
-         &lt;/propertyCategory&gt;
-         &lt;propertyCategory category=&quot;second&quot;&gt;
-         &lt;/propertyCategory&gt;
-      &lt;/propertyContributor&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/schema/propertySections.exsd b/bundles/org.eclipse.ui.views.properties.tabbed/schema/propertySections.exsd
deleted file mode 100644
index bd77cfc..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/schema/propertySections.exsd
+++ /dev/null
@@ -1,201 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.views.properties.tabbed">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui.views.properties.tabbed" id="propertySections" name="Property Sections"/>
-      </appInfo>
-      <documentation>
-         Describes a list of sections to be displayed within tabs that will be contributed to the tabbed property sheet page.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="propertySections"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="propertySections">
-      <complexType>
-         <sequence>
-            <element ref="propertySection" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="contributorId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique identifier of the property sheet page contributor.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="propertySection">
-      <complexType>
-         <sequence>
-            <element ref="input" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="tab" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The tab in which this section appears.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id for the section.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class that implements the section, i.e. extends &lt;tt&gt;org.eclipse.ui.views.properties.tabbed.AbstractPropertySection&lt;/tt&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.views.properties.tabbed.AbstractPropertySection"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="afterSection" type="string">
-            <annotation>
-               <documentation>
-                  When there is more than one section in a tab, sections are sorted by the afterSection attribute.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="filter" type="string">
-            <annotation>
-               <documentation>
-                  The class that implements a section filter, i.e. implements &lt;tt&gt;org.eclipse.jface.viewers.IFilter&lt;/tt&gt;.
-A filter is used to override the type mapper and input for the selection. When a filter is specified, type mapper and input are ignored.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jface.viewers.IFilter"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="enablesFor" type="string">
-            <annotation>
-               <documentation>
-                  a value indicating the selection count which must be met to enable the section. If specified and the condition is not met, the section is not displayed. If omitted, the section enablement is not affected. The following attribute formats are currently supported: 
-    &lt;table border=&quot;0&quot; width=&quot;80%&quot;&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;n&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- a precise number of items selected.&amp;nbsp;
-          For example: enablesFor=&amp;quot; 1&amp;quot; enables the section only when 1
-          item is selected&lt;/td&gt;
-      &lt;/tr&gt;
-    &lt;/table&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="input">
-      <complexType>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The selected class or interface that will enable the display on the section in the tab.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.ui.tests.views.properties.tabbed.propertySections&quot;&gt;
-      &lt;propertySections contributorId=&quot;org.eclipse.ui.views.properties.tabbed.views.TestsView&quot;&gt;
-         &lt;propertySection
-               class=&quot;org.eclipse.ui.tests.views.properties.tabbed.sections.NameSection&quot;
-               enablesFor=&quot;1&quot;
-               id=&quot;propertySection1&quot;
-               tab=&quot;propertyTab1&quot;&gt;
-            &lt;input type=&quot;org.eclipse.ui.tests.views.properties.tabbed.model.Element&quot;&gt;
-            &lt;/input&gt;
-         &lt;/propertySection&gt;
-      &lt;/propertySections&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/schema/propertyTabs.exsd b/bundles/org.eclipse.ui.views.properties.tabbed/schema/propertyTabs.exsd
deleted file mode 100644
index 63bcd13..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/schema/propertyTabs.exsd
+++ /dev/null
@@ -1,162 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.views.properties.tabbed" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui.views.properties.tabbed" id="propertyTabs" name="Property Tabs"/>
-      </appinfo>
-      <documentation>
-         Describes a list of tabs that will be contributed to the tabbed property sheet page.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="propertyTabs"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="propertyTabs">
-      <complexType>
-         <sequence>
-            <element ref="propertyTab" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="contributorId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique identifier of the property sheet page contributor.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="propertyTab">
-      <complexType>
-         <attribute name="label" type="string" use="required">
-         	<annotation>
-            	<appInfo>
-                  <meta.attribute translatable="true"/>
-               	</appInfo>
-               <documentation>
-                  The label to be displayed on the tab.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="category" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The category used to group tabs.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="afterTab" type="string">
-            <annotation>
-               <documentation>
-                  When there is more than one tab in a category, tabs are sorted by the afterTab attribute.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id for the tab.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="indented" type="boolean">
-            <annotation>
-               <documentation>
-                  If &lt;code&gt;true&lt;/code&gt;, then this tab is idented. This is meant to indicate subtabs or categories of the parent tab.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="image" type="string">
-            <annotation>
-               <documentation>
-                  If an image is provided, the icon image is displayed on the tab when the tab is active.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         &lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.ui.views.properties.tabbed.propertyTabs&quot;&gt;
-      &lt;propertyTabs contributorId=&quot;org.eclipse.ui.tests.views.properties.tabbed.views.TestsView&quot;&gt;
-         &lt;propertyTab
-               category=&quot;first&quot;
-               id=&quot;propertyTab1&quot;
-               label=&quot;Name&quot;&gt;
-         &lt;/propertyTab&gt;
-         &lt;propertyTab
-               afterTab=&quot;propertyTab1&quot;
-               category=&quot;first&quot;
-               id=&quot;propertyTab2&quot;
-               label=&quot;Project&quot;&gt;
-         &lt;/propertyTab&gt;
-         &lt;propertyTab
-               category=&quot;second&quot;
-               id=&quot;propertyTab8&quot;
-               label=&quot;Message&quot;&gt;
-         &lt;/propertyTab&gt;
-      &lt;/propertyTabs&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2005, 2008 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which accompanies 
-this distribution, and is available at &lt;a
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/TabbedPropertyViewPlugin.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/TabbedPropertyViewPlugin.java
deleted file mode 100755
index 0f1447f..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/TabbedPropertyViewPlugin.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.properties.tabbed;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * The common ui properties plug-in.
- * 
- * @author Anthony Hunter
- */
-public class TabbedPropertyViewPlugin
-	extends AbstractUIPlugin {
-
-	private static TabbedPropertyViewPlugin plugin;
-
-    /**
-     * Constructor for TabbedPropertyViewPlugin.
-     */
-	public TabbedPropertyViewPlugin() {
-		super();
-		plugin = this;
-	}
-
-    /**
-     * Retrieve the plug-in class for this plug-in.
-     * @return the plug-in class for this plug-in.
-     */
-	public static TabbedPropertyViewPlugin getPlugin() {
-		return plugin;
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/TabbedPropertyViewStatusCodes.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/TabbedPropertyViewStatusCodes.java
deleted file mode 100755
index eafad48..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/TabbedPropertyViewStatusCodes.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.properties.tabbed;
-
-/**
- * A list of status codes for this plug-in.
- * 
- * @author Anthony Hunter
- */
-public final class TabbedPropertyViewStatusCodes {
-
-	/**
-	 * This class should not be instantiated since it is a static constant
-	 * class.
-	 */
-	private TabbedPropertyViewStatusCodes() {
-		/* not used */
-	}
-
-	/**
-	 * Status code indicating that everything is OK.
-	 */
-	public static final int OK = 0;
-
-	/**
-	 * Status code indicating that a tab was not found for the given tab id.
-	 */
-	public static final int NO_TAB_ERROR = 1;
-
-	/**
-	 * Status code indicating that issue was found loading the section extension
-	 * configuration element.
-	 */
-	public static final int SECTION_ERROR = 2;
-
-	/**
-	 * Status code indicating that issue was found loading the tab extension
-	 * configuration element.
-	 */
-	public static final int TAB_ERROR = 3;
-
-	/**
-	 * Status code indicating that issue was found loading the contributor
-	 * extension configuration element.
-	 */
-	public static final int CONTRIBUTOR_ERROR = 4;
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/l10n/TabbedPropertyMessages.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/l10n/TabbedPropertyMessages.java
deleted file mode 100755
index e0af002..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/l10n/TabbedPropertyMessages.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.properties.tabbed.l10n;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Message Bundle class for the tabbed properties view plug-in.
- * 
- * @author Anthony Hunter
- * 
- */
-public final class TabbedPropertyMessages
-	extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.views.properties.tabbed.l10n.TabbedPropertyMessages";//$NON-NLS-1$
-
-	/**
-	 * Constructor for TabbedPropertyMessages.
-	 */
-	private TabbedPropertyMessages() {
-		// private constructor
-	}
-
-    /**
-     * Message when a property section extension is in error.
-     */
-	public static String SectionDescriptor_Section_error;
-
-	/**
-     * Message when a property section extension causes a class not found exception.
-     */
-	public static String SectionDescriptor_class_not_found_error;
-	
-    /**
-     * Message when a property tab extension is in error.
-     */
-	public static String TabDescriptor_Tab_error;
-
-    /**
-     * Message when a property tab extension has an unknown category.
-     */
-	public static String TabDescriptor_Tab_unknown_category;
-
-    /**
-     * Message when a non existing tab is found in a property section extension.
-     */
-	public static String TabbedPropertyRegistry_Non_existing_tab;
-
-    /**
-     * Message when a property contributor extension is in error.
-     */
-	public static String TabbedPropertyRegistry_contributor_error;
-
-    /**
-     * No properties available message.
-     */
-	public static String TabbedPropertyList_properties_not_available;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, TabbedPropertyMessages.class);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/l10n/TabbedPropertyMessages.properties b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/l10n/TabbedPropertyMessages.properties
deleted file mode 100755
index 01c6477..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/l10n/TabbedPropertyMessages.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-SectionDescriptor_Section_error=Section in {0} must provide an id and a tab.
-SectionDescriptor_class_not_found_error=Section {0} declares non-existing filter or section class.
-TabDescriptor_Tab_error=Tab in {0} must provide an id, label and category.
-TabDescriptor_Tab_unknown_category=Tab in {0} declares non-existing category {1}.
-TabbedPropertyRegistry_Non_existing_tab=Section {0} declares non-existing tab {1}.
-TabbedPropertyRegistry_contributor_error=Contributor {0} cannot be created.
-TabbedPropertyList_properties_not_available=Properties are not available.
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/OverridableTabListContentProvider.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/OverridableTabListContentProvider.java
deleted file mode 100644
index 84c70eb..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/OverridableTabListContentProvider.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.properties.tabbed.view;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.IContributedContentsView;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.AbstractOverridableTabListPropertySection;
-import org.eclipse.ui.views.properties.tabbed.IOverridableTabListContentProvider;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ITabItem;
-import org.eclipse.ui.views.properties.tabbed.ITabSelectionListener;
-import org.eclipse.ui.views.properties.tabbed.TabContents;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * An extended implementation of the content provider for the tabbed property
- * sheet page's list of tabs.
- * <p>
- * This implementation allows the section to override the list of what tabs are
- * displayed, rather than using the default list of tabs from the tabbed
- * property registry.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class OverridableTabListContentProvider extends TabListContentProvider
-		implements IOverridableTabListContentProvider, ITabSelectionListener {
-
-	/**
-	 * Constructor for OverrideTabListContentProvider.
-	 * 
-	 * @param registry
-	 *            the tabbed property registry.
-	 */
-	public OverridableTabListContentProvider(TabbedPropertyRegistry registry) {
-		super(registry);
-	}
-
-	private TabbedPropertySheetPage tabbedPropertySheetPage;
-
-	private TabbedPropertyViewer tabbedPropertyViewer;
-
-	/**
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-		if (tabbedPropertySheetPage.getCurrentTab() == null) {
-			/*
-			 * In this case, return the default list of tabs from the registry.
-			 * The contributor will not have had a chance to load and override
-			 * the tabs.
-			 */
-			return registry.getTabDescriptors(currentPart,
-					(ISelection) inputElement);
-		}
-		return getOverrideTabs(inputElement);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.properties.tabbed.view.TabListContentProvider#dispose()
-	 */
-	public void dispose() {
-		stopListening();
-		this.tabbedPropertyViewer = null;
-		this.currentPart = null;
-		this.tabbedPropertySheetPage = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.internal.views.properties.tabbed.view.TabListContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		if (tabbedPropertyViewer == null) {
-			Assert.isTrue(viewer instanceof TabbedPropertyViewer);
-			init((TabbedPropertyViewer) viewer);
-		}
-	}
-
-	/**
-	 * Initialize the content provider for a tabbed property viewer.
-	 * 
-	 * @param newTabbedPropertyViewer
-	 *            a tabbed property viewer.
-	 */
-	private void init(TabbedPropertyViewer newTabbedPropertyViewer) {
-		this.tabbedPropertyViewer = newTabbedPropertyViewer;
-		currentPart = tabbedPropertyViewer.getWorkbenchPart();
-		if (currentPart.getAdapter(IPropertySheetPage.class) != null) {
-			tabbedPropertySheetPage = (TabbedPropertySheetPage) currentPart
-					.getAdapter(IPropertySheetPage.class);
-		} else {
-			/*
-			 * Is the part is a IContributedContentsView for the contributor,
-			 * for example, outline view.
-			 */
-			IContributedContentsView view = (IContributedContentsView) currentPart
-					.getAdapter(IContributedContentsView.class);
-			if (view != null) {
-				IWorkbenchPart part = view.getContributingPart();
-				if (part != null) {
-					tabbedPropertySheetPage = (TabbedPropertySheetPage) part
-							.getAdapter(IPropertySheetPage.class);
-				}
-			}
-		}
-		Assert
-				.isNotNull(
-						tabbedPropertySheetPage,
-						"DynamicTabListContentProvider could not find the TabbedPropertySheetPage for the active part");//$NON-NLS-1$
-		startListening();
-	}
-
-	/**
-	 * Start listening to tab selection change events.
-	 */
-	private void startListening() {
-		tabbedPropertySheetPage.addTabSelectionListener(this);
-	}
-
-	/**
-	 * Stop listening to tab selection change events.
-	 */
-	private void stopListening() {
-		tabbedPropertySheetPage.removeTabSelectionListener(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabSelectionListener#tabSelected(org.eclipse.ui.views.properties.tabbed.ITabDescriptor)
-	 */
-	public void tabSelected(ITabDescriptor tabDescriptor) {
-		AbstractOverridableTabListPropertySection section = getOverridableTabListPropertySection();
-		Assert.isNotNull(section);
-		int selectedIndex = tabbedPropertyViewer.getSelectionIndex();
-		section.selectTab(selectedIndex);
-	}
-
-	/**
-	 * set the selected tab from the list of tabs provided by the section.
-	 */
-	private void setSelectedTab() {
-		TabDescriptor currentSelectedTabInList = null;
-		IStructuredSelection selectionFromList = (IStructuredSelection) tabbedPropertyViewer
-				.getSelection();
-		if (!selectionFromList.equals(StructuredSelection.EMPTY)) {
-			currentSelectedTabInList = (TabDescriptor) selectionFromList
-					.getFirstElement();
-		}
-		AbstractOverridableTabListPropertySection section = getOverridableTabListPropertySection();
-		if (section == null) {
-			if (currentSelectedTabInList == null) {
-				/*
-				 * make sure there is a selected tab in the list.
-				 */
-				TabDescriptor newSelectedTab = (TabDescriptor) tabbedPropertyViewer
-						.getElementAt(0);
-				if (newSelectedTab != null) {
-					tabbedPropertyViewer.setSelection(new StructuredSelection(
-							newSelectedTab), true);
-				}
-			}
-			return;
-		}
-		ITabItem[] dynamicTabItems = section.getTabs();
-		if (dynamicTabItems == null) {
-			/*
-			 * if the section does not provide overridden tabs, return.
-			 */
-			return;
-		}
-		int selectedTabIndex = -1;
-		for (int i = 0; i < dynamicTabItems.length; i++) {
-			if (dynamicTabItems[i].isSelected()) {
-				selectedTabIndex = i;
-			}
-		}
-		if (currentSelectedTabInList == null ||
-				!currentSelectedTabInList.getText().equals(
-						dynamicTabItems[selectedTabIndex].getText())) {
-			TabDescriptor newSelectedTab = (TabDescriptor) tabbedPropertyViewer
-					.getElementAt(selectedTabIndex);
-			tabbedPropertyViewer.setSelection(new StructuredSelection(
-					newSelectedTab), true);
-		}
-	}
-
-	/**
-	 * Get the list of tabs to display in the tabbed property sheet page.
-	 * 
-	 * @param inputElement
-	 *            The current input element.
-	 * @return the list of tabs.
-	 */
-	private ITabDescriptor[] getOverrideTabs(Object inputElement) {
-		ITabDescriptor tabDescriptors[] = registry.getTabDescriptors(
-				currentPart, (ISelection) inputElement);
-		if (tabDescriptors == TabbedPropertyRegistry.EMPTY_DESCRIPTOR_ARRAY) {
-			/*
-			 * We clone the dynamic tabs from the single tab in the registry. If
-			 * the registry has no tabs for the selection, return.
-			 */
-			return tabDescriptors;
-		}
-		AbstractOverridableTabListPropertySection section = getOverridableTabListPropertySection();
-		Assert.isNotNull(section);
-		ITabItem[] tabItems = section.getTabs();
-		if (tabItems == null) {
-			/*
-			 * if the section does not provide overridden tabs, return the
-			 * default tabs from the registry.
-			 */
-			return tabDescriptors;
-		}
-		ITabDescriptor[] overrideTabDescriptors = new ITabDescriptor[tabItems.length];
-		TabDescriptor target = (TabDescriptor) tabDescriptors[0];
-		for (int i = 0; i < tabItems.length; i++) {
-			TabDescriptor cloneTabDescriptor = (TabDescriptor) target.clone();
-			cloneTabDescriptor.setLabel(tabItems[i].getText());
-			cloneTabDescriptor.setImage(tabItems[i].getImage());
-			cloneTabDescriptor.setIndented(tabItems[i].isIndented());
-			cloneTabDescriptor.setSelected(tabItems[i].isSelected());
-			overrideTabDescriptors[i] = cloneTabDescriptor;
-			// System.out.print("override " + i + " [" +  //$NON-NLS-1$//$NON-NLS-2$
-			// tabItems[i].getText() + "]");//$NON-NLS-1$
-			// if (tabItems[i].isSelected()) {
-			// System.out.print(" selected");//$NON-NLS-1$
-			// }
-			// System.out.println("");//$NON-NLS-1$
-		}
-		return overrideTabDescriptors;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.IOverridableTabListContentProvider#overrideTabs()
-	 */
-	public void overrideTabs() {
-		stopListening();
-		Object input = tabbedPropertyViewer.getInput();
-		tabbedPropertyViewer.setInput(input);
-		setSelectedTab();
-		startListening();
-	}
-
-	/**
-	 * Get the section implementation that provides the list of tabs. In our
-	 * implementation, all the sections provide the list of tabs, so we select
-	 * the first section from the tab descriptor.
-	 * 
-	 * @return the section.
-	 */
-	private AbstractOverridableTabListPropertySection getOverridableTabListPropertySection() {
-		TabContents tab = tabbedPropertySheetPage.getCurrentTab();
-		Assert.isNotNull(tab);
-		if (tab != null) {
-			ISection section = tab.getSectionAtIndex(0);
-			if (section instanceof AbstractOverridableTabListPropertySection) {
-				return (AbstractOverridableTabListPropertySection) section;
-			}
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/SectionDescriptor.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/SectionDescriptor.java
deleted file mode 100755
index 5489912..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/SectionDescriptor.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.properties.tabbed.view;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewPlugin;
-import org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewStatusCodes;
-import org.eclipse.ui.internal.views.properties.tabbed.l10n.TabbedPropertyMessages;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Represents the default implementation of a section descriptor on the tabbed
- * property sections extensions. This implementation assumes that we are
- * interested in selected objects in an IStructuredSelection.
- * 
- * @author Anthony Hunter
- */
-public class SectionDescriptor extends AbstractSectionDescriptor {
-
-	private static final String ATT_ID = "id"; //$NON-NLS-1$
-
-	private static final String ATT_TARGET_TAB = "tab"; //$NON-NLS-1$
-
-	private static final String ATT_AFTER_SECTION = "afterSection"; //$NON-NLS-1$
-
-	private static final String ATT_CLASS = "class"; //$NON-NLS-1$
-
-	private static final String ATT_SECTION_FILTER = "filter"; //$NON-NLS-1$	
-
-	private static final String ATT_SECTION_ENABLES_FOR = "enablesFor"; //$NON-NLS-1$	
-
-	private static final String ATT_INPUT_TYPE = "type"; //$NON-NLS-1$
-
-	private static final String ELEMENT_INPUT = "input"; //$NON-NLS-1$
-
-	private String id;
-
-	private String targetTab;
-
-	private String afterSection;
-
-	private ArrayList inputTypes;
-
-	private IFilter filter;
-
-	private int enablesFor = ENABLES_FOR_ANY;
-
-	private IConfigurationElement configurationElement;
-
-	/**
-	 * Constructor for the section descriptor.
-	 * 
-	 * @param configurationElement
-	 *            the configuration element for the section descriptor.
-	 * @param typeMapper
-	 *            The type mapper.
-	 */
-	protected SectionDescriptor(IConfigurationElement configurationElement,
-			ITypeMapper typeMapper) {
-		super(typeMapper);
-		this.configurationElement = configurationElement;
-
-		id = getConfigurationElement().getAttribute(ATT_ID);
-		targetTab = getConfigurationElement().getAttribute(ATT_TARGET_TAB);
-		afterSection = getConfigurationElement()
-				.getAttribute(ATT_AFTER_SECTION);
-		if (getConfigurationElement().getAttribute(ATT_SECTION_ENABLES_FOR) != null) {
-			String enablesForStr = getConfigurationElement().getAttribute(
-					ATT_SECTION_ENABLES_FOR);
-			int enablesForTest = Integer.parseInt(enablesForStr);
-			if (enablesForTest > 0) {
-				enablesFor = enablesForTest;
-			}
-		}
-
-		if (id == null || targetTab == null) {
-			// the section id and tab are mandatory - log error
-			handleSectionError(null);
-		}
-	}
-
-	/**
-	 * Handle the section error when an issue is found loading from the
-	 * configuration element.
-	 * 
-	 * @param exception
-	 *            an optional CoreException
-	 */
-	private void handleSectionError(CoreException exception) {
-		String pluginId = getConfigurationElement().getDeclaringExtension()
-				.getNamespaceIdentifier();
-		String message = TabbedPropertyMessages.SectionDescriptor_Section_error;
-		if (exception == null) {
-			message = MessageFormat.format(
-					TabbedPropertyMessages.SectionDescriptor_Section_error,
-					new Object[] { pluginId });
-		} else {
-			message = MessageFormat
-					.format(
-							TabbedPropertyMessages.SectionDescriptor_class_not_found_error,
-							new Object[] { pluginId });
-		}
-		IStatus status = new Status(IStatus.ERROR, pluginId,
-				TabbedPropertyViewStatusCodes.SECTION_ERROR, message, exception);
-		TabbedPropertyViewPlugin.getPlugin().getLog().log(status);
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getId()
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getFilter()
-	 */
-	public IFilter getFilter() {
-		if (filter == null) {
-			try {
-				if (getConfigurationElement().getAttribute(ATT_SECTION_FILTER) != null) {
-					filter = (IFilter) configurationElement
-							.createExecutableExtension(ATT_SECTION_FILTER);
-				}
-			} catch (CoreException exception) {
-				handleSectionError(exception);
-			}
-		}
-		return filter;
-	}
-
-	/**
-	 * Retrieves the value for section enablement which is a precise number of
-	 * items selected. For example: enablesFor=" 4" enables the action only when
-	 * 4 items are selected. If not specified, enable for all selections.
-	 * 
-	 * @return the value for section enablement.
-	 */
-	public int getEnablesFor() {
-		return enablesFor;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getTargetTab()
-	 */
-	public String getTargetTab() {
-		return targetTab;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getAfterSection()
-	 */
-	public String getAfterSection() {
-		if (afterSection == null) {
-			return super.getAfterSection();
-		}
-		return afterSection;
-	}
-
-	/**
-	 * Creates an instance of a section described by this descriptor
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getSectionClass()
-	 */
-	public ISection getSectionClass() {
-		ISection section = null;
-		try {
-			section = (ISection) getConfigurationElement()
-					.createExecutableExtension(ATT_CLASS);
-		} catch (CoreException exception) {
-			handleSectionError(exception);
-		}
-
-		return section;
-	}
-
-	/**
-	 * Gets the input types that are valid for this section.
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getInputTypes()
-	 */
-	public List getInputTypes() {
-		if (inputTypes == null) {
-			inputTypes = new ArrayList();
-			IConfigurationElement[] elements = getConfigurationElement()
-					.getChildren(ELEMENT_INPUT);
-			for (int i = 0; i < elements.length; i++) {
-				IConfigurationElement element = elements[i];
-				inputTypes.add(element.getAttribute(ATT_INPUT_TYPE));
-			}
-		}
-
-		return inputTypes;
-	}
-
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return getId();
-	}
-
-	/**
-	 * @return Returns the configurationElement.
-	 */
-	private IConfigurationElement getConfigurationElement() {
-		return configurationElement;
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabDescriptor.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabDescriptor.java
deleted file mode 100755
index e47cd18..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabDescriptor.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.properties.tabbed.view;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewPlugin;
-import org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewStatusCodes;
-import org.eclipse.ui.internal.views.properties.tabbed.l10n.TabbedPropertyMessages;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Represents the default implementation of a tab descriptor on the tabbed
- * property tabs extensions.
- * 
- * @author Anthony Hunter
- */
-public class TabDescriptor extends AbstractTabDescriptor {
-
-	private static final String ATT_ID = "id"; //$NON-NLS-1$
-
-	private static final String ATT_LABEL = "label"; //$NON-NLS-1$
-
-	private static final String ATT_IMAGE = "image"; //$NON-NLS-1$
-
-	private static final String ATT_INDENTED = "indented"; //$NON-NLS-1$
-
-	private static final String ATT_CATEGORY = "category"; //$NON-NLS-1$
-
-	private static final String ATT_AFTER_TAB = "afterTab"; //$NON-NLS-1$
-
-	private final static String TAB_ERROR = TabbedPropertyMessages.TabDescriptor_Tab_error;
-
-	private String id;
-
-	private String label;
-
-	private Image image;
-
-	private boolean selected;
-
-	private boolean indented;
-
-	private String category;
-
-	private String afterTab;
-
-	/**
-	 * Constructor for TabDescriptor.
-	 * 
-	 * @param configurationElement
-	 *            the configuration element for the tab descriptor.
-	 */
-	public TabDescriptor(IConfigurationElement configurationElement) {
-		super();
-		if (configurationElement != null) {
-			id = configurationElement.getAttribute(ATT_ID);
-			label = configurationElement.getAttribute(ATT_LABEL);
-			String imageString = configurationElement.getAttribute(ATT_IMAGE);
-			if (imageString != null) {
-				image = AbstractUIPlugin.imageDescriptorFromPlugin(
-						configurationElement.getDeclaringExtension()
-								.getNamespaceIdentifier(), imageString)
-						.createImage();
-			}
-			String indentedString = configurationElement
-					.getAttribute(ATT_INDENTED);
-			indented = indentedString != null && indentedString.equals("true"); //$NON-NLS-1$
-			category = configurationElement.getAttribute(ATT_CATEGORY);
-			afterTab = configurationElement.getAttribute(ATT_AFTER_TAB);
-			if (id == null || label == null || category == null) {
-				// the tab id, label and category are mandatory - log error
-				handleTabError(configurationElement, null);
-			}
-		}
-		selected = false;
-	}
-
-	/**
-	 * Get the unique identifier for the tab.
-	 * 
-	 * @return the unique identifier for the tab.
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * Get the text label for the tab.
-	 * 
-	 * @return the text label for the tab.
-	 */
-	public String getLabel() {
-		return label;
-	}
-
-	/**
-	 * Get the identifier of the tab after which this tab should be displayed.
-	 * When two or more tabs belong to the same category, they are sorted by the
-	 * after tab values.
-	 * 
-	 * @return the identifier of the tab.
-	 */
-	public String getAfterTab() {
-		if (afterTab == null) {
-			return super.getAfterTab();
-		}
-		return afterTab;
-	}
-
-	/**
-	 * Get the category this tab belongs to.
-	 * 
-	 * @return Get the category this tab belongs to.
-	 */
-	public String getCategory() {
-		return category;
-	}
-
-	/**
-	 * Returns whether the given section was added to this tab. The section can
-	 * be appended if its tab attribute matches the tab id. The afterSection
-	 * attribute indicates the order in which the section should be appended.
-	 * 
-	 * @param target
-	 *            the section descriptor to append.
-	 */
-	protected boolean append(ISectionDescriptor target) {
-		if (!target.getTargetTab().equals(id)) {
-			return false;
-		}
-
-		if (insertSectionDescriptor(target)) {
-			return true;
-		}
-
-		getSectionDescriptors().add(target);
-		return true;
-	}
-
-	/**
-	 * Insert the section descriptor into the section descriptor list.
-	 * 
-	 * @param target
-	 *            the section descriptor to insert.
-	 * @return <code>true</code> if the target descriptor was added to the
-	 *         descriptors list.
-	 */
-	private boolean insertSectionDescriptor(ISectionDescriptor target) {
-		if (target.getAfterSection().equals(TOP)) {
-			getSectionDescriptors().add(0, target);
-			return true;
-		}
-		for (int i = 0; i < getSectionDescriptors().size(); i++) {
-			ISectionDescriptor descriptor = (ISectionDescriptor) getSectionDescriptors()
-					.get(i);
-			if (target.getAfterSection().equals(descriptor.getId())) {
-				getSectionDescriptors().add(i + 1, target);
-				return true;
-			} else if (descriptor.getAfterSection().equals(target.getId())) {
-				getSectionDescriptors().add(i, target);
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return getId();
-	}
-
-	/**
-	 * Handle the tab error when an issue is found loading from the
-	 * configuration element.
-	 * 
-	 * @param configurationElement
-	 *            the configuration element
-	 * @param exception
-	 *            an optional CoreException
-	 */
-	private void handleTabError(IConfigurationElement configurationElement,
-			CoreException exception) {
-		String pluginId = configurationElement.getDeclaringExtension()
-				.getNamespaceIdentifier();
-		String message = MessageFormat.format(TAB_ERROR,
-				new Object[] { pluginId });
-		IStatus status = new Status(IStatus.ERROR, pluginId,
-				TabbedPropertyViewStatusCodes.TAB_ERROR, message, exception);
-		TabbedPropertyViewPlugin.getPlugin().getLog().log(status);
-	}
-
-	/**
-	 * Set the image for the tab.
-	 * 
-	 * @param image
-	 *            the image for the tab.
-	 */
-	protected void setImage(Image image) {
-		this.image = image;
-	}
-
-	/**
-	 * Set the indicator to determine if the tab should be displayed as
-	 * indented.
-	 * 
-	 * @param indented
-	 *            <code>true</code> if the tab should be displayed as
-	 *            indented.
-	 */
-	protected void setIndented(boolean indented) {
-		this.indented = indented;
-	}
-
-	/**
-	 * Set the indicator to determine if the tab should be the selected tab in
-	 * the list.
-	 * 
-	 * @param selected
-	 *            <code>true</code> if the tab should be the selected tab in
-	 *            the list.
-	 */
-	protected void setSelected(boolean selected) {
-		this.selected = selected;
-	}
-
-	/**
-	 * Set the text label for the tab.
-	 * 
-	 * @param label
-	 *            the text label for the tab.
-	 */
-	protected void setLabel(String label) {
-		this.label = label;
-	}
-
-	/**
-	 * Get the image for the tab.
-	 * 
-	 * @return the image for the tab.
-	 */
-	public Image getImage() {
-		return image;
-	}
-
-	/**
-	 * Determine if the tab is selected.
-	 * 
-	 * @return <code>true</code> if the tab is selected.
-	 */
-	public boolean isSelected() {
-		return selected;
-	}
-
-	/**
-	 * Determine if the tab should be displayed as indented.
-	 * 
-	 * @return <code>true</code> if the tab should be displayed as indented.
-	 */
-	public boolean isIndented() {
-		return indented;
-	}
-
-	/**
-	 * Get the text label for the tab.
-	 * 
-	 * @return the text label for the tab.
-	 */
-	public String getText() {
-		return label;
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabListContentProvider.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabListContentProvider.java
deleted file mode 100755
index 14c1771..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabListContentProvider.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.properties.tabbed.view;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * The default implementation of the content provider for the 
- * tabbed property sheet page's list of tabs.
- * 
- * @author Anthony Hunter
- */
-public class TabListContentProvider
-	implements IStructuredContentProvider {
-	
-	protected TabbedPropertyRegistry registry;
-
-	protected IWorkbenchPart currentPart;
-	
-	/**
-	 * Constructor for TabListContentProvider.
-	 * @param registry the tabbed property registry.
-	 */
-	public TabListContentProvider(TabbedPropertyRegistry registry) {
-		this.registry = registry;
-	}
-	
-	/**
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-		Assert.isTrue(inputElement instanceof ISelection);
-			return registry
-			.getTabDescriptors(currentPart, (ISelection) inputElement);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-		/* not used */
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		this.currentPart = ((TabbedPropertyViewer)viewer).getWorkbenchPart();
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyComposite.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyComposite.java
deleted file mode 100755
index 1fb31e7..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyComposite.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.properties.tabbed.view;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-
-
-/**
- * Composite responsible for drawing the tabbed property sheet page.
- * 
- * @author Anthony Hunter
- */
-public class TabbedPropertyComposite
-	extends Composite {
-
-	private TabbedPropertySheetWidgetFactory factory;
-
-	private Composite mainComposite;
-
-	private Composite leftComposite;
-
-	private ScrolledComposite scrolledComposite;
-
-	private Composite tabComposite;
-
-	private TabbedPropertyTitle title;
-
-	private TabbedPropertyList listComposite;
-
-	private boolean displayTitle;
-
-	/**
-	 * Constructor for a TabbedPropertyComposite
-	 * 
-	 * @param parent
-	 *            the parent widget.
-	 * @param factory
-	 *            the widget factory.
-	 * @param displayTitle
-	 *            if <code>true</code>, then the title bar will be displayed.
-	 */
-	public TabbedPropertyComposite(Composite parent,
-			TabbedPropertySheetWidgetFactory factory, boolean displayTitle) {
-		super(parent, SWT.NO_FOCUS);
-		this.factory = factory;
-		this.displayTitle = displayTitle;
-
-		createMainComposite();
-	}
-
-	/**
-	 * Create the main composite.
-	 */
-	protected void createMainComposite() {
-		mainComposite = factory.createComposite(this, SWT.NO_FOCUS);
-		mainComposite.setLayout(new FormLayout());
-		FormData formData = new FormData();
-		formData.left = new FormAttachment(0, 0);
-		formData.right = new FormAttachment(100, 0);
-		formData.top = new FormAttachment(0, 0);
-		formData.bottom = new FormAttachment(100, 0);
-		mainComposite.setLayoutData(formData);
-
-		createMainContents();
-	}
-
-	/**
-	 * Create the contents in the main composite.
-	 */
-	protected void createMainContents() {
-        if (displayTitle) {
-            title = new TabbedPropertyTitle(mainComposite, factory);
-
-            FormData data = new FormData();
-            data.left = new FormAttachment(0, 0);
-            data.right = new FormAttachment(100, 0);
-            data.top = new FormAttachment(0, 0);
-            title.setLayoutData(data);
-        }
-
-		leftComposite = factory.createComposite(mainComposite, SWT.NO_FOCUS);
-		leftComposite.setLayout(new FormLayout());
-
-		scrolledComposite = factory.createScrolledComposite(mainComposite, SWT.H_SCROLL
-			| SWT.V_SCROLL | SWT.NO_FOCUS);
-
-		FormData formData = new FormData();
-		formData.left = new FormAttachment(leftComposite, 0);
-		formData.right = new FormAttachment(100, 0);
-        if (displayTitle) {
-            formData.top = new FormAttachment(title, 0);
-        } else {
-            formData.top = new FormAttachment(0, 0);
-        }
-		formData.bottom = new FormAttachment(100, 0);
-		scrolledComposite.setLayoutData(formData);
-
-		formData = new FormData();
-		formData.left = new FormAttachment(0, 0);
-		formData.right = new FormAttachment(scrolledComposite, 0);
-        if (displayTitle) {
-            formData.top = new FormAttachment(title, 0);
-        } else {
-            formData.top = new FormAttachment(0, 0);
-        }
-		formData.bottom = new FormAttachment(100, 0);
-		leftComposite.setLayoutData(formData);
-
-        tabComposite = factory.createComposite(scrolledComposite, SWT.NO_FOCUS);
-        tabComposite.setLayout(new FormLayout());
-
-		scrolledComposite.setContent(tabComposite);
-		scrolledComposite.setAlwaysShowScrollBars(false);
-		scrolledComposite.setExpandVertical(true);
-		scrolledComposite.setExpandHorizontal(true);
-
-		listComposite = new TabbedPropertyList(leftComposite, factory);
-		formData = new FormData();
-		formData.left = new FormAttachment(0, 0);
-		formData.right = new FormAttachment(100, 0);
-		formData.top = new FormAttachment(0, 0);
-		formData.bottom = new FormAttachment(100, 0);
-		listComposite.setLayoutData(formData);
-	}
-
-	/**
-	 * Get the tabbed property list, which is the list of tabs on the left hand
-	 * side of this composite.
-	 * 
-	 * @return the tabbed property list.
-	 */
-	public TabbedPropertyList getList() {
-		return listComposite;
-	}
-
-	/**
-	 * Get the tabbed property title bar.
-	 * 
-	 * @return the tabbed property title bar or <code>null</code> if not used.
-	 */
-	public TabbedPropertyTitle getTitle() {
-		return title;
-	}
-
-	/**
-	 * Get the tab composite where sections display their property contents.
-	 * 
-	 * @return the tab composite.
-	 */
-	public Composite getTabComposite() {
-		return tabComposite;
-	}
-
-	/**
-	 * Get the scrolled composite which surrounds the title bar and tab
-	 * composite.
-	 * 
-	 * @return the scrolled composite.
-	 */
-	public ScrolledComposite getScrolledComposite() {
-		return scrolledComposite;
-	}
-
-	/**
-	 * Get the widget factory.
-	 * 
-	 * @return the widget factory.
-	 */
-	protected TabbedPropertySheetWidgetFactory getFactory() {
-		return factory;
-	}
-
-	/**
-	 * @see org.eclipse.swt.widgets.Widget#dispose()
-	 */
-	public void dispose() {
-		listComposite.dispose();
-		if (displayTitle) {
-			title.dispose();
-		}
-		super.dispose();
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyList.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyList.java
deleted file mode 100755
index 6ef7b5f..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyList.java
+++ /dev/null
@@ -1,1047 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.properties.tabbed.view;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.ACC;
-import org.eclipse.swt.accessibility.Accessible;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleControlAdapter;
-import org.eclipse.swt.accessibility.AccessibleControlEvent;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.MouseTrackAdapter;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.forms.FormColors;
-import org.eclipse.ui.internal.views.properties.tabbed.l10n.TabbedPropertyMessages;
-import org.eclipse.ui.views.properties.tabbed.ITabItem;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-
-
-/**
- * Shows the list of tabs in the tabbed property sheet page.
- * 
- * @author Anthony Hunter
- */
-public class TabbedPropertyList
-	extends Composite {
-
-	private static final ListElement[] ELEMENTS_EMPTY = new ListElement[0];
-
-	protected static final int NONE = -1;
-
-	protected static final int INDENT = 7;
-
-	private boolean focus = false;
-
-	private ListElement[] elements;
-
-	private int selectedElementIndex = NONE;
-
-	private int topVisibleIndex = NONE;
-
-	private int bottomVisibleIndex = NONE;
-
-	private TopNavigationElement topNavigationElement;
-
-	private BottomNavigationElement bottomNavigationElement;
-
-	private int widestLabelIndex = NONE;
-
-	private int tabsThatFitInComposite = NONE;
-
-	private Color widgetForeground;
-
-	private Color widgetBackground;
-
-	private Color widgetNormalShadow;
-
-	private Color widgetDarkShadow;
-
-	private Color listBackground;
-
-	private Color hoverGradientStart;
-
-	private Color hoverGradientEnd;
-
-	private Color defaultGradientStart;
-
-	private Color defaultGradientEnd;
-
-	private Color indentedDefaultBackground;
-
-	private Color indentedHoverBackground;
-
-	private Color navigationElementShadowStroke;
-
-	private Color bottomNavigationElementShadowStroke1;
-
-	private Color bottomNavigationElementShadowStroke2;
-
-	private TabbedPropertySheetWidgetFactory factory;
-
-	/**
-	 * One of the tabs in the tabbed property list.
-	 */
-	public class ListElement extends Canvas {
-
-		private ITabItem tab;
-
-		private int index;
-
-		private boolean selected;
-
-		private boolean hover;
-
-		/**
-		 * Constructor for ListElement.
-		 * 
-		 * @param parent
-		 *            the parent Composite.
-		 * @param tab
-		 *            the tab item for the element.
-		 * @param index
-		 *            the index in the list.
-		 */
-		public ListElement(Composite parent, final ITabItem tab, int index) {
-			super(parent, SWT.NO_FOCUS);
-			this.tab = tab;
-			hover = false;
-			selected = false;
-			this.index = index;
-
-			addPaintListener(new PaintListener() {
-
-				public void paintControl(PaintEvent e) {
-					paint(e);
-				}
-			});
-			addMouseListener(new MouseAdapter() {
-
-				public void mouseUp(MouseEvent e) {
-					if (!selected) {
-						select(getIndex(ListElement.this));
-						/*
-						 * We set focus to the tabbed property composite so that
-						 * focus is moved to the appropriate widget in the
-						 * section.
-						 */
-						Composite tabbedPropertyComposite = getParent();
-						while (!(tabbedPropertyComposite instanceof TabbedPropertyComposite)) {
-							tabbedPropertyComposite = tabbedPropertyComposite
-								.getParent();
-						}
-						tabbedPropertyComposite.setFocus();
-					}
-				}
-			});
-			addMouseMoveListener(new MouseMoveListener() {
-
-				public void mouseMove(MouseEvent e) {
-					if (!hover) {
-						hover = true;
-						redraw();
-					}
-				}
-			});
-			addMouseTrackListener(new MouseTrackAdapter() {
-
-				public void mouseExit(MouseEvent e) {
-					hover = false;
-					redraw();
-				}
-			});
-		}
-
-		/**
-		 * Set selected value for this element.
-		 * 
-		 * @param selected
-		 *            the selected value.
-		 */
-		public void setSelected(boolean selected) {
-			this.selected = selected;
-			redraw();
-		}
-
-		/**
-		 * Paint the element.
-		 * 
-		 * @param e
-		 *            the paint event.
-		 */
-		private void paint(PaintEvent e) {
-			/*
-			 * draw the top two lines of the tab, same for selected, hover and
-			 * default
-			 */
-			Rectangle bounds = getBounds();
-			e.gc.setForeground(widgetNormalShadow);
-			e.gc.drawLine(0, 0, bounds.width - 1, 0);
-			e.gc.setForeground(listBackground);
-			e.gc.drawLine(0, 1, bounds.width - 1, 1);
-
-			/* draw the fill in the tab */
-			if (selected) {
-				e.gc.setBackground(listBackground);
-				e.gc.fillRectangle(0, 2, bounds.width, bounds.height - 1);
-			} else if (hover && tab.isIndented()) {
-				e.gc.setBackground(indentedHoverBackground);
-				e.gc.fillRectangle(0, 2, bounds.width - 1, bounds.height - 1);
-			} else if (hover) {
-				e.gc.setForeground(hoverGradientStart);
-				e.gc.setBackground(hoverGradientEnd);
-				e.gc.fillGradientRectangle(0, 2, bounds.width - 1,
-						bounds.height - 1, true);
-			} else if (tab.isIndented()) {
-				e.gc.setBackground(indentedDefaultBackground);
-				e.gc.fillRectangle(0, 2, bounds.width - 1, bounds.height - 1);
-			} else {
-				e.gc.setForeground(defaultGradientStart);
-				e.gc.setBackground(defaultGradientEnd);
-				e.gc.fillGradientRectangle(0, 2, bounds.width - 1,
-						bounds.height - 1, true);
-			}
-
-			if (!selected) {
-				e.gc.setForeground(widgetNormalShadow);
-				e.gc.drawLine(bounds.width - 1, 1, bounds.width - 1,
-						bounds.height + 1);
-			}
-
-			int textIndent = INDENT;
-			FontMetrics fm = e.gc.getFontMetrics();
-			int height = fm.getHeight();
-			int textMiddle = (bounds.height - height) / 2;
-
-			if (selected && tab.getImage() != null
-				&& !tab.getImage().isDisposed()) {
-				/* draw the icon for the selected tab */
-				if (tab.isIndented()) {
-					textIndent = textIndent + INDENT;
-				} else {
-					textIndent = textIndent - 3;
-				}
-				e.gc.drawImage(tab.getImage(), textIndent, textMiddle - 1);
-				textIndent = textIndent + 16 + 5;
-			} else if (tab.isIndented()) {
-				textIndent = textIndent + INDENT;
-			}
-
-			/* draw the text */
-			e.gc.setForeground(widgetForeground);
-			if (selected) {
-				/* selected tab is bold font */
-				e.gc.setFont(JFaceResources.getFontRegistry().getBold(
-						JFaceResources.DEFAULT_FONT));
-			}
-			e.gc.drawText(tab.getText(), textIndent, textMiddle, true);
-			if (((TabbedPropertyList) getParent()).focus && selected) {
-				/* draw a line if the tab has focus */
-				Point point = e.gc.textExtent(tab.getText());
-				e.gc.drawLine(textIndent, bounds.height - 4, textIndent
-					+ point.x, bounds.height - 4);
-			}
-
-			/* draw the bottom line on the tab for selected and default */
-			if (!hover) {
-				e.gc.setForeground(listBackground);
-				e.gc.drawLine(0, bounds.height - 1, bounds.width - 2,
-						bounds.height - 1);
-			}
-		}
-
-		/**
-		 * Get the tab item.
-		 * 
-		 * @return the tab item.
-		 */
-		public ITabItem getTabItem() {
-			return tab;
-		}
-
-		public String toString() {
-			return tab.getText();
-		}
-	}
-
-	/**
-	 * The top navigation element in the tabbed property list. It looks like a
-	 * scroll button when scrolling is needed or is just a spacer when no
-	 * scrolling is required.
-	 */
-	public class TopNavigationElement extends Canvas {
-
-		/**
-		 * Constructor for TopNavigationElement.
-		 * 
-		 * @param parent
-		 *            the parent Composite.
-		 */
-		public TopNavigationElement(Composite parent) {
-			super(parent, SWT.NO_FOCUS);
-			addPaintListener(new PaintListener() {
-
-				public void paintControl(PaintEvent e) {
-					paint(e);
-				}
-			});
-			addMouseListener(new MouseAdapter() {
-
-				public void mouseUp(MouseEvent e) {
-					if (isUpScrollRequired()) {
-						bottomVisibleIndex--;
-						if (topVisibleIndex != 0) {
-							topVisibleIndex--;
-						}
-						layoutTabs();
-						topNavigationElement.redraw();
-						bottomNavigationElement.redraw();
-					}
-				}
-			});
-		}
-
-		/**
-		 * Paint the element.
-		 * 
-		 * @param e
-		 *            the paint event.
-		 */
-		private void paint(PaintEvent e) {
-			e.gc.setBackground(widgetBackground);
-			e.gc.setForeground(widgetForeground);
-			Rectangle bounds = getBounds();
-
-			if (elements.length != 0) {
-				e.gc.fillRectangle(0, 0, bounds.width, bounds.height);
-				e.gc.setForeground(widgetNormalShadow);
-				e.gc.drawLine(bounds.width - 1, 0, bounds.width - 1,
-					bounds.height - 1);
-			} else {
-				e.gc.setBackground(listBackground);
-				e.gc.fillRectangle(0, 0, bounds.width, bounds.height);
-				int textIndent = INDENT;
-				FontMetrics fm = e.gc.getFontMetrics();
-				int height = fm.getHeight();
-				int textMiddle = (bounds.height - height) / 2;
-				e.gc.setForeground(widgetForeground);
-				String properties_not_available = TabbedPropertyMessages.TabbedPropertyList_properties_not_available;
-				e.gc.drawText(properties_not_available, textIndent, textMiddle);
-			}
-
-			if (isUpScrollRequired()) {
-				e.gc.setForeground(widgetDarkShadow);
-				int middle = bounds.width / 2;
-				e.gc.drawLine(middle + 1, 3, middle + 5, 7);
-				e.gc.drawLine(middle, 3, middle - 4, 7);
-				e.gc.drawLine(middle - 3, 7, middle + 4, 7);
-
-				e.gc.setForeground(listBackground);
-				e.gc.drawLine(middle, 4, middle + 1, 4);
-				e.gc.drawLine(middle - 1, 5, middle + 2, 5);
-				e.gc.drawLine(middle - 2, 6, middle + 3, 6);
-
-				e.gc.setForeground(widgetNormalShadow);
-				e.gc.drawLine(0, 0, bounds.width - 2, 0);
-				e.gc.setForeground(navigationElementShadowStroke);
-				e.gc.drawLine(0, 1, bounds.width - 2, 1);
-				e.gc.drawLine(0, bounds.height - 1, bounds.width - 2,
-						bounds.height - 1);
-			}
-		}
-	}
-
-	/**
-	 * The top navigation element in the tabbed property list. It looks like a
-	 * scroll button when scrolling is needed or is just a spacer when no
-	 * scrolling is required.
-	 */
-	public class BottomNavigationElement extends Canvas {
-
-		/**
-		 * Constructor for BottomNavigationElement.
-		 * 
-		 * @param parent
-		 *            the parent Composite.
-		 */
-		public BottomNavigationElement(Composite parent) {
-			super(parent, SWT.NO_FOCUS);
-			addPaintListener(new PaintListener() {
-
-				public void paintControl(PaintEvent e) {
-					paint(e);
-				}
-			});
-			addMouseListener(new MouseAdapter() {
-
-				public void mouseUp(MouseEvent e) {
-					if (isDownScrollRequired()) {
-						topVisibleIndex++;
-						if (bottomVisibleIndex != elements.length - 1) {
-							bottomVisibleIndex++;
-						}
-						layoutTabs();
-						topNavigationElement.redraw();
-						bottomNavigationElement.redraw();
-					}
-				}
-			});
-		}
-
-		/**
-		 * Paint the element.
-		 * 
-		 * @param e
-		 *            the paint event.
-		 */
-		private void paint(PaintEvent e) {
-			e.gc.setBackground(widgetBackground);
-			e.gc.setForeground(widgetForeground);
-			Rectangle bounds = getBounds();
-
-			if (elements.length != 0) {
-				e.gc.fillRectangle(0, 0, bounds.width, bounds.height);
-				e.gc.setForeground(widgetNormalShadow);
-				e.gc.drawLine(bounds.width - 1, 0, bounds.width - 1,
-						bounds.height - 1);
-				e.gc.drawLine(0, 0, bounds.width - 1, 0);
-
-				e.gc.setForeground(bottomNavigationElementShadowStroke1);
-				e.gc.drawLine(0, 1, bounds.width - 2, 1);
-				e.gc.setForeground(bottomNavigationElementShadowStroke2);
-				e.gc.drawLine(0, 2, bounds.width - 2, 2);
-			} else {
-				e.gc.setBackground(listBackground);
-				e.gc.fillRectangle(0, 0, bounds.width, bounds.height);
-			}
-
-			if (isDownScrollRequired()) {
-				e.gc.setForeground(widgetDarkShadow);
-				int middle = bounds.width / 2;
-				int bottom = bounds.height - 3;
-				e.gc.drawLine(middle + 1, bottom, middle + 5, bottom - 4);
-				e.gc.drawLine(middle, bottom, middle - 4, bottom - 4);
-				e.gc.drawLine(middle - 3, bottom - 4, middle + 4, bottom - 4);
-
-				e.gc.setForeground(listBackground);
-				e.gc.drawLine(middle, bottom - 1, middle + 1, bottom - 1);
-				e.gc.drawLine(middle - 1, bottom - 2, middle + 2, bottom - 2);
-				e.gc.drawLine(middle - 2, bottom - 3, middle + 3, bottom - 3);
-
-				e.gc.setForeground(widgetNormalShadow);
-				e.gc.drawLine(0, bottom - 7, bounds.width - 2, bottom - 7);
-				e.gc.setForeground(navigationElementShadowStroke);
-				e.gc.drawLine(0, bottom + 2, bounds.width - 2, bottom + 2);
-				e.gc.drawLine(0, bottom - 6, bounds.width - 2, bottom - 6);
-			}
-		}
-	}
-
-	/**
-	 * Constructor for TabbedPropertyList.
-	 * 
-	 * @param parent
-	 *            the parent widget.
-	 * @param factory
-	 *            the widget factory.
-	 */
-	public TabbedPropertyList(Composite parent,
-			TabbedPropertySheetWidgetFactory factory) {
-		super(parent, SWT.NO_FOCUS);
-		this.factory = factory;
-		removeAll();
-		setLayout(new FormLayout());
-		initColours();
-		initAccessible();
-		topNavigationElement = new TopNavigationElement(this);
-		bottomNavigationElement = new BottomNavigationElement(this);
-
-		this.addFocusListener(new FocusListener() {
-
-			public void focusGained(FocusEvent e) {
-				focus = true;
-				int i = getSelectionIndex();
-				if (i >= 0) {
-					elements[i].redraw();
-				}
-			}
-
-			public void focusLost(FocusEvent e) {
-				focus = false;
-				int i = getSelectionIndex();
-				if (i >= 0) {
-					elements[i].redraw();
-				}
-			}
-		});
-		this.addControlListener(new ControlAdapter() {
-
-			public void controlResized(ControlEvent e) {
-				computeTopAndBottomTab();
-			}
-		});
-		this.addTraverseListener(new TraverseListener() {
-
-			public void keyTraversed(TraverseEvent e) {
-				if (e.detail == SWT.TRAVERSE_ARROW_PREVIOUS
-					|| e.detail == SWT.TRAVERSE_ARROW_NEXT) {
-					int nMax = elements.length - 1;
-					int nCurrent = getSelectionIndex();
-					if (e.detail == SWT.TRAVERSE_ARROW_PREVIOUS) {
-						nCurrent -= 1;
-						nCurrent = Math.max(0, nCurrent);
-					} else if (e.detail == SWT.TRAVERSE_ARROW_NEXT) {
-						nCurrent += 1;
-						nCurrent = Math.min(nCurrent, nMax);
-					}
-					select(nCurrent);
-					redraw();
-				} else {
-					e.doit = true;
-				}
-			}
-		});
-	}
-
-	/**
-	 * Calculate the number of tabs that will fit in the tab list composite.
-	 */
-	protected void computeTabsThatFitInComposite() {
-		tabsThatFitInComposite = Math
-			.round((getSize().y - 22) / getTabHeight());
-		if (tabsThatFitInComposite <= 0) {
-			tabsThatFitInComposite = 1;
-		}
-	}
-
-	/**
-	 * Returns the element with the given index from this list viewer. Returns
-	 * <code>null</code> if the index is out of range.
-	 * 
-	 * @param index
-	 *            the zero-based index
-	 * @return the element at the given index, or <code>null</code> if the
-	 *         index is out of range
-	 */
-	public Object getElementAt(int index) {
-		if (index >= 0 && index < elements.length) {
-			return elements[index];
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the zero-relative index of the item which is currently selected
-	 * in the receiver, or -1 if no item is selected.
-	 * 
-	 * @return the index of the selected item
-	 */
-	public int getSelectionIndex() {
-		return selectedElementIndex;
-	}
-
-	/**
-	 * Removes all elements from this list.
-	 */
-	public void removeAll() {
-		if (elements != null) {
-			for (int i = 0; i < elements.length; i++) {
-				elements[i].dispose();
-			}
-		}
-		elements = ELEMENTS_EMPTY;
-		selectedElementIndex = NONE;
-		widestLabelIndex = NONE;
-		topVisibleIndex = NONE;
-		bottomVisibleIndex = NONE;
-	}
-
-	/**
-	 * Sets the new list elements.
-	 * 
-	 * @param children
-	 */
-	public void setElements(Object[] children) {
-		if (elements != ELEMENTS_EMPTY) {
-			removeAll();
-		}
-		elements = new ListElement[children.length];
-		if (children.length == 0) {
-			widestLabelIndex = NONE;
-		} else {
-			widestLabelIndex = 0;
-			for (int i = 0; i < children.length; i++) {
-				elements[i] = new ListElement(this, (ITabItem) children[i], i);
-				elements[i].setVisible(false);
-				elements[i].setLayoutData(null);
-
-				if (i != widestLabelIndex) {
-					String label = ((ITabItem) children[i]).getText();
-					int width = getTextDimension(label).x;
-					if (((ITabItem) children[i]).isIndented()) {
-						width = width + INDENT;
-					}
-					if (width > getTextDimension(((ITabItem) children[widestLabelIndex])
-							.getText()).x) {
-						widestLabelIndex = i;
-					}
-				}
-			}
-		}
-
-		computeTopAndBottomTab();
-	}
-
-	/**
-	 * Selects one of the elements in the list.
-	 * 
-	 * @param index
-	 *            the index of the element to select.
-	 */
-	protected void select(int index) {
-		if (getSelectionIndex() == index) {
-			/*
-			 * this index is already selected.
-			 */
-			return;
-		}
-		if (index >= 0 && index < elements.length) {
-			int lastSelected = getSelectionIndex();
-			elements[index].setSelected(true);
-			selectedElementIndex = index;
-			if (lastSelected != NONE) {
-				elements[lastSelected].setSelected(false);
-				if (getSelectionIndex() != elements.length - 1) {
-					/*
-					 * redraw the next tab to fix the border by calling
-					 * setSelected()
-					 */
-					elements[getSelectionIndex() + 1].setSelected(false);
-				}
-			}
-			topNavigationElement.redraw();
-			bottomNavigationElement.redraw();
-
-			if (selectedElementIndex < topVisibleIndex
-				|| selectedElementIndex > bottomVisibleIndex) {
-				computeTopAndBottomTab();
-			}
-		}
-		notifyListeners(SWT.Selection, new Event());
-	}
-
-	/**
-	 * Deselects all the elements in the list.
-	 */
-	public void deselectAll() {
-		if (getSelectionIndex() != NONE) {
-			elements[getSelectionIndex()].setSelected(false);
-			selectedElementIndex = NONE;
-		}
-	}
-
-	private int getIndex(ListElement element) {
-		return element.index;
-	}
-
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		Point result = super.computeSize(hHint, wHint, changed);
-		if (widestLabelIndex == -1) {
-			String properties_not_available = TabbedPropertyMessages.TabbedPropertyList_properties_not_available;
-			result.x = getTextDimension(properties_not_available).x + INDENT;
-		} else {
-			ITabItem widestTab = elements[widestLabelIndex].getTabItem();
-			int width = getTextDimension(widestTab.getText()).x + INDENT;
-			/*
-			 * To anticipate for the icon placement we should always keep the
-			 * space available after the label. So when the active tab includes
-			 * an icon the width of the tab doesn't change.
-			 */
-			if (widestTab.getImage() != null) {
-				width = width + 16 + 4;
-			}
-			if (widestTab.isIndented()) {
-				width = width + 10;
-			}
-			/*
-			 * Add 10 pixels to the right of the longest string as a margin.
-			 */
-			result.x = width + 10;
-		}
-		return result;
-	}
-
-	/**
-	 * Get the dimensions of the provided string.
-	 * 
-	 * @param text
-	 *            the string.
-	 * @return the dimensions of the provided string.
-	 */
-	private Point getTextDimension(String text) {
-		Shell shell = new Shell();
-		GC gc = new GC(shell);
-		gc.setFont(JFaceResources.getFontRegistry().getBold(
-				JFaceResources.DEFAULT_FONT));
-		Point point = gc.textExtent(text);
-		point.x++;
-		gc.dispose();
-		shell.dispose();
-		return point;
-	}
-
-	/**
-	 * Initialize the colours used in the list.
-	 */
-	private void initColours() {
-		/*
-		 * Colour 3 COLOR_LIST_BACKGROUND
-		 */
-		listBackground = Display.getCurrent().getSystemColor(
-				SWT.COLOR_LIST_BACKGROUND);
-
-		/*
-		 * Colour 13 COLOR_WIDGET_BACKGROUND
-		 */
-		widgetBackground = Display.getCurrent().getSystemColor(
-				SWT.COLOR_WIDGET_BACKGROUND);
-
-		/*
-		 * Colour 15 COLOR_WIDGET_DARK_SHADOW
-		 */
-		widgetDarkShadow = Display.getCurrent().getSystemColor(
-				SWT.COLOR_WIDGET_DARK_SHADOW);
-
-		/*
-		 * Colour 16 COLOR_WIDGET_FOREGROUND
-		 */
-		widgetForeground = Display.getCurrent().getSystemColor(
-				SWT.COLOR_WIDGET_FOREGROUND);
-
-		/*
-		 * Colour 19 COLOR_WIDGET_NORMAL_SHADOW
-		 */
-		widgetNormalShadow = Display.getCurrent().getSystemColor(
-				SWT.COLOR_WIDGET_NORMAL_SHADOW);
-
-		RGB infoBackground = Display.getCurrent().getSystemColor(
-				SWT.COLOR_INFO_BACKGROUND).getRGB();
-		RGB white = Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)
-				.getRGB();
-		RGB black = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK)
-				.getRGB();
-
-		/*
-		 * gradient in the default tab: start colour WIDGET_NORMAL_SHADOW 100% +
-		 * white 20% + INFO_BACKGROUND 60% end colour WIDGET_NORMAL_SHADOW 100% +
-		 * INFO_BACKGROUND 40%
-		 */
-		defaultGradientStart = factory.getColors().createColor(
-				"TabbedPropertyList.defaultTabGradientStart", //$NON-NLS-1$
-				FormColors.blend(infoBackground, FormColors.blend(white,
-						widgetNormalShadow.getRGB(), 20), 60));
-		defaultGradientEnd = factory.getColors().createColor(
-				"TabbedPropertyList.defaultTabGradientEnd", //$NON-NLS-1$
-				FormColors.blend(infoBackground, widgetNormalShadow.getRGB(),
-						40));
-
-		navigationElementShadowStroke = factory.getColors().createColor(
-				"TabbedPropertyList.shadowStroke", //$NON-NLS-1$
-				FormColors.blend(white, widgetNormalShadow.getRGB(), 55));
-		bottomNavigationElementShadowStroke1 = factory.getColors().createColor(
-				"TabbedPropertyList.tabShadowStroke1", //$NON-NLS-1$
-				FormColors.blend(black, widgetBackground.getRGB(), 10));
-		bottomNavigationElementShadowStroke2 = factory.getColors().createColor(
-				"TabbedPropertyList.tabShadowStroke2", //$NON-NLS-1$
-				FormColors.blend(black, widgetBackground.getRGB(), 5));
-
-		/*
-		 * gradient in the hover tab: start colour WIDGET_BACKGROUND 100% +
-		 * white 20% end colour WIDGET_BACKGROUND 100% + WIDGET_NORMAL_SHADOW
-		 * 10%
-		 */
-		hoverGradientStart = factory.getColors().createColor(
-				"TabbedPropertyList.hoverBackgroundGradientStart", //$NON-NLS-1$
-				FormColors.blend(white, widgetBackground.getRGB(), 20));
-		hoverGradientEnd = factory.getColors().createColor(
-				"TabbedPropertyList.hoverBackgroundGradientEnd", //$NON-NLS-1$
-				FormColors.blend(widgetNormalShadow.getRGB(), widgetBackground
-						.getRGB(), 10));
-
-		indentedDefaultBackground = factory.getColors().createColor(
-				"TabbedPropertyList.indentedDefaultBackground", //$NON-NLS-1$
-				FormColors.blend(white, widgetBackground.getRGB(), 10));
-		indentedHoverBackground = factory.getColors().createColor(
-				"TabbedPropertyList.indentedHoverBackground", //$NON-NLS-1$
-				FormColors.blend(white, widgetBackground.getRGB(), 75));
-	}
-
-	/**
-	 * Get the height of a tab. The height of the tab is the height of the text
-	 * plus buffer.
-	 * 
-	 * @return the height of a tab.
-	 */
-	private int getTabHeight() {
-		int tabHeight = getTextDimension("").y + INDENT; //$NON-NLS-1$ 
-		if (tabsThatFitInComposite == 1) {
-			/*
-			 * if only one tab will fix, reduce the size of the tab height so
-			 * that the navigation elements fit.
-			 */
-			int ret = getBounds().height - 20;
-			return (ret > tabHeight) ? tabHeight
-				: (ret < 5) ? 5
-					: ret;
-		}
-		return tabHeight;
-	}
-
-	/**
-	 * Determine if a downward scrolling is required.
-	 * 
-	 * @return true if downward scrolling is required.
-	 */
-	private boolean isDownScrollRequired() {
-		return elements.length > tabsThatFitInComposite
-			&& bottomVisibleIndex != elements.length - 1;
-	}
-
-	/**
-	 * Determine if an upward scrolling is required.
-	 * 
-	 * @return true if upward scrolling is required.
-	 */
-	private boolean isUpScrollRequired() {
-		return elements.length > tabsThatFitInComposite && topVisibleIndex != 0;
-	}
-
-	/**
-	 * Based on available space, figure out the top and bottom tabs in the list.
-	 */
-	private void computeTopAndBottomTab() {
-		computeTabsThatFitInComposite();
-		if (elements.length == 0) {
-			/*
-			 * no tabs to display.
-			 */
-			topVisibleIndex = 0;
-			bottomVisibleIndex = 0;
-		} else if (tabsThatFitInComposite >= elements.length) {
-			/*
-			 * all the tabs fit.
-			 */
-			topVisibleIndex = 0;
-			bottomVisibleIndex = elements.length - 1;
-		} else if (getSelectionIndex() == NONE) {
-			/*
-			 * there is no selected tab yet, assume that tab one would
-			 * be selected for now.
-			 */
-			topVisibleIndex = 0;
-			bottomVisibleIndex = tabsThatFitInComposite - 1;
-		} else if (getSelectionIndex() + tabsThatFitInComposite > elements.length) {
-			/*
-			 * the selected tab is near the bottom.
-			 */
-			bottomVisibleIndex = elements.length - 1;
-			topVisibleIndex = bottomVisibleIndex - tabsThatFitInComposite + 1;
-		} else {
-			/*
-			 * the selected tab is near the top.
-			 */
-			topVisibleIndex = selectedElementIndex;
-			bottomVisibleIndex = selectedElementIndex + tabsThatFitInComposite
-				- 1;
-		}
-		layoutTabs();
-	}
-
-	/**
-	 * Layout the tabs.
-	 */
-	private void layoutTabs() {
-		//System.out.println("TabFit " + tabsThatFitInComposite + " length "
-		//	+ elements.length + " top " + topVisibleIndex + " bottom "
-		//	+ bottomVisibleIndex);
-		if (tabsThatFitInComposite == NONE || elements.length == 0) {
-			FormData formData = new FormData();
-			formData.left = new FormAttachment(0, 0);
-			formData.right = new FormAttachment(100, 0);
-			formData.top = new FormAttachment(0, 0);
-			formData.height = getTabHeight();
-			topNavigationElement.setLayoutData(formData);
-
-			formData = new FormData();
-			formData.left = new FormAttachment(0, 0);
-			formData.right = new FormAttachment(100, 0);
-			formData.top = new FormAttachment(topNavigationElement, 0);
-			formData.bottom = new FormAttachment(100, 0);
-			bottomNavigationElement.setLayoutData(formData);
-		} else {
-
-			FormData formData = new FormData();
-			formData.left = new FormAttachment(0, 0);
-			formData.right = new FormAttachment(100, 0);
-			formData.top = new FormAttachment(0, 0);
-			formData.height = 10;
-			topNavigationElement.setLayoutData(formData);
-
-			/*
-			 * use nextElement to attach the layout to the previous canvas
-			 * widget in the list.
-			 */
-			Canvas nextElement = topNavigationElement;
-
-			for (int i = 0; i < elements.length; i++) {
-				//System.out.print(i + " [" + elements[i].getText() + "]");
-				if (i < topVisibleIndex || i > bottomVisibleIndex) {
-					/*
-					 * this tab is not visible
-					 */
-					elements[i].setLayoutData(null);
-					elements[i].setVisible(false);
-				} else {
-					/*
-					 * this tab is visible.
-					 */
-					//System.out.print(" visible");
-					formData = new FormData();
-					formData.height = getTabHeight();
-					formData.left = new FormAttachment(0, 0);
-					formData.right = new FormAttachment(100, 0);
-					formData.top = new FormAttachment(nextElement, 0);
-					nextElement = elements[i];
-					elements[i].setLayoutData(formData);
-					elements[i].setVisible(true);
-				}
-
-				//if (i == selectedElementIndex) {
-				//	System.out.print(" selected");
-				//}
-				//System.out.println("");
-			}
-			formData = new FormData();
-			formData.left = new FormAttachment(0, 0);
-			formData.right = new FormAttachment(100, 0);
-			formData.top = new FormAttachment(nextElement, 0);
-			formData.bottom = new FormAttachment(100, 0);
-			formData.height = 10;
-			bottomNavigationElement.setLayoutData(formData);
-		}
-		//System.out.println("");
-
-		// layout so that we have enough space for the new labels
-		Composite grandparent = getParent().getParent();
-		grandparent.layout(true);
-		layout(true);
-	}
-
-	/**
-	 * Initialize the accessibility adapter.
-	 */
-	private void initAccessible() {
-		final Accessible accessible = getAccessible();
-		accessible.addAccessibleListener(new AccessibleAdapter() {
-
-			public void getName(AccessibleEvent e) {
-				if (getSelectionIndex() != NONE) {
-					e.result = elements[getSelectionIndex()].getTabItem()
-							.getText();
-				}
-			}
-
-			public void getHelp(AccessibleEvent e) {
-				if (getSelectionIndex() != NONE) {
-					e.result = elements[getSelectionIndex()].getTabItem()
-							.getText();
-				}
-			}
-		});
-
-		accessible.addAccessibleControlListener(new AccessibleControlAdapter() {
-
-			public void getChildAtPoint(AccessibleControlEvent e) {
-				Point pt = toControl(new Point(e.x, e.y));
-				e.childID = (getBounds().contains(pt)) ? ACC.CHILDID_SELF
-					: ACC.CHILDID_NONE;
-			}
-
-			public void getLocation(AccessibleControlEvent e) {
-				if (getSelectionIndex() != NONE) {
-					Rectangle location = elements[getSelectionIndex()]
-						.getBounds();
-					Point pt = toDisplay(new Point(location.x, location.y));
-					e.x = pt.x;
-					e.y = pt.y;
-					e.width = location.width;
-					e.height = location.height;
-				}
-			}
-
-			public void getChildCount(AccessibleControlEvent e) {
-				e.detail = 0;
-			}
-
-			public void getRole(AccessibleControlEvent e) {
-				e.detail = ACC.ROLE_TABITEM;
-			}
-
-			public void getState(AccessibleControlEvent e) {
-				e.detail = ACC.STATE_NORMAL | ACC.STATE_SELECTABLE
-					| ACC.STATE_SELECTED | ACC.STATE_FOCUSED
-					| ACC.STATE_FOCUSABLE;
-			}
-		});
-
-		addListener(SWT.Selection, new Listener() {
-
-			public void handleEvent(Event event) {
-				if (isFocusControl()) {
-					accessible.setFocus(ACC.CHILDID_SELF);
-				}
-			}
-		});
-
-		addListener(SWT.FocusIn, new Listener() {
-
-			public void handleEvent(Event event) {
-				accessible.setFocus(ACC.CHILDID_SELF);
-			}
-		});
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistry.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistry.java
deleted file mode 100755
index a6b3c33..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistry.java
+++ /dev/null
@@ -1,540 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.properties.tabbed.view;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewPlugin;
-import org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewStatusCodes;
-import org.eclipse.ui.internal.views.properties.tabbed.l10n.TabbedPropertyMessages;
-import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
-import org.eclipse.ui.views.properties.tabbed.IActionProvider;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptorProvider;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-import com.ibm.icu.text.MessageFormat;
-
-/**
- * Provides information about the tabbed property extension points. Each tabbed
- * property registry is associated with a unique contributor ID.
- * 
- * @author Anthony Hunter
- */
-public class TabbedPropertyRegistry {
-
-	private final static String NO_TAB_ERROR = TabbedPropertyMessages.TabbedPropertyRegistry_Non_existing_tab;
-
-	private final static String CONTRIBUTOR_ERROR = TabbedPropertyMessages.TabbedPropertyRegistry_contributor_error;
-
-	private final static String TAB_ERROR = TabbedPropertyMessages.TabDescriptor_Tab_unknown_category;
-
-	// extension point constants
-	private static final String EXTPT_CONTRIBUTOR = "propertyContributor"; //$NON-NLS-1$
-
-	private static final String EXTPT_TABS = "propertyTabs"; //$NON-NLS-1$
-
-	private static final String EXTPT_SECTIONS = "propertySections"; //$NON-NLS-1$
-
-	private static final String ELEMENT_TAB = "propertyTab"; //$NON-NLS-1$
-
-	private static final String ELEMENT_SECTION = "propertySection"; //$NON-NLS-1$
-
-	private static final String ELEMENT_PROPERTY_CATEGORY = "propertyCategory"; //$NON-NLS-1$
-
-	private static final String ATT_CATEGORY = "category"; //$NON-NLS-1$
-
-	private static final String ATT_CONTRIBUTOR_ID = "contributorId"; //$NON-NLS-1$
-
-	private static final String ATT_TYPE_MAPPER = "typeMapper"; //$NON-NLS-1$	
-
-	private static final String ATT_LABEL_PROVIDER = "labelProvider"; //$NON-NLS-1$
-
-	private static final String ATT_ACTION_PROVIDER = "actionProvider"; //$NON-NLS-1$
-
-	private static final String ATT_SECTION_DESCRIPTOR_PROVIDER = "sectionDescriptorProvider"; //$NON-NLS-1$
-
-	private static final String ATT_TAB_DESCRIPTOR_PROVIDER = "tabDescriptorProvider"; //$NON-NLS-1$
-
-	private static final String ATT_OVERRIDABLE_TAB_LIST_CONTENT_PROVIDER = "overridableTabListContentProvider"; //$NON-NLS-1$
-
-	private static final String TOP = "top"; //$NON-NLS-1$
-
-	protected String contributorId;
-
-	protected IConfigurationElement contributorConfigurationElement;
-
-	protected List propertyCategories;
-
-	protected ILabelProvider labelProvider;
-
-	protected IActionProvider actionProvider;
-
-	protected ITypeMapper typeMapper;
-
-	protected ISectionDescriptorProvider sectionDescriptorProvider;
-
-	protected ITabDescriptorProvider tabDescriptorProvider;
-
-	protected ITabDescriptor[] tabDescriptors;
-
-	protected static final AbstractTabDescriptor[] EMPTY_DESCRIPTOR_ARRAY = new TabDescriptor[0];
-
-	protected boolean overridableTabListContentProvider = false;
-
-	/**
-	 * There is one details registry for each contributor type.
-	 */
-	protected TabbedPropertyRegistry(String id) {
-		this.contributorId = id;
-		this.propertyCategories = new ArrayList();
-		IConfigurationElement[] extensions = getConfigurationElements(EXTPT_CONTRIBUTOR);
-		for (int i = 0; i < extensions.length; i++) {
-			IConfigurationElement configurationElement = extensions[i];
-			String contributor = configurationElement
-					.getAttribute(ATT_CONTRIBUTOR_ID);
-			if (contributor == null || !id.equals(contributor)) {
-				continue;
-			}
-			this.contributorConfigurationElement = configurationElement;
-			try {
-				if (configurationElement.getAttribute(ATT_LABEL_PROVIDER) != null) {
-					labelProvider = (ILabelProvider) configurationElement
-							.createExecutableExtension(ATT_LABEL_PROVIDER);
-				}
-				if (configurationElement.getAttribute(ATT_ACTION_PROVIDER) != null) {
-					actionProvider = (IActionProvider) configurationElement
-							.createExecutableExtension(ATT_ACTION_PROVIDER);
-				}
-				if (configurationElement.getAttribute(ATT_TYPE_MAPPER) != null) {
-					typeMapper = (ITypeMapper) configurationElement
-							.createExecutableExtension(ATT_TYPE_MAPPER);
-				}
-				if (configurationElement
-						.getAttribute(ATT_SECTION_DESCRIPTOR_PROVIDER) != null) {
-					sectionDescriptorProvider = (ISectionDescriptorProvider) configurationElement
-							.createExecutableExtension(ATT_SECTION_DESCRIPTOR_PROVIDER);
-				}
-				if (configurationElement
-						.getAttribute(ATT_TAB_DESCRIPTOR_PROVIDER) != null) {
-					tabDescriptorProvider = (ITabDescriptorProvider) configurationElement
-							.createExecutableExtension(ATT_TAB_DESCRIPTOR_PROVIDER);
-				}
-				if (configurationElement
-						.getAttribute(ATT_OVERRIDABLE_TAB_LIST_CONTENT_PROVIDER) != null) {
-					String attributeBoolean = configurationElement
-							.getAttribute(ATT_OVERRIDABLE_TAB_LIST_CONTENT_PROVIDER);
-					overridableTabListContentProvider = attributeBoolean
-							.equals("true");//$NON-NLS-1$
-				}
-			} catch (CoreException exception) {
-				handleConfigurationError(id, exception);
-			}
-			addPropertyCategories(configurationElement);
-		}
-		if (propertyCategories == null || contributorId == null ||
-				contributorConfigurationElement == null) {
-			handleConfigurationError(id, null);
-			this.contributorId = null;
-		}
-	}
-
-	/**
-	 * Gets the categories that are valid for this contributor.
-	 * 
-	 * @param configurationElement
-	 *            the configuration element for this contributor.
-	 */
-	private void addPropertyCategories(
-			IConfigurationElement configurationElement) {
-		IConfigurationElement[] elements = configurationElement
-				.getChildren(ELEMENT_PROPERTY_CATEGORY);
-		for (int i = 0; i < elements.length; i++) {
-			IConfigurationElement element = elements[i];
-			propertyCategories.add(element.getAttribute(ATT_CATEGORY));
-		}
-	}
-
-	/**
-	 * Handle the error when an issue is found loading from the configuration
-	 * element.
-	 * 
-	 * @param id
-	 *            the configuration id.
-	 * @param exception
-	 *            an optional CoreException
-	 */
-	private void handleConfigurationError(String id, CoreException exception) {
-		String message = MessageFormat.format(CONTRIBUTOR_ERROR,
-				new Object[] { id });
-		IStatus status = new Status(IStatus.ERROR, TabbedPropertyViewPlugin
-				.getPlugin().getBundle().getSymbolicName(),
-				TabbedPropertyViewStatusCodes.CONTRIBUTOR_ERROR, message,
-				exception);
-		TabbedPropertyViewPlugin.getPlugin().getLog().log(status);
-	}
-
-	/**
-	 * Reads property section extensions. Returns all section descriptors for
-	 * the current contributor id or an empty array if none is found.
-	 */
-	protected ISectionDescriptor[] readSectionDescriptors() {
-		List result = new ArrayList();
-		IConfigurationElement[] extensions = getConfigurationElements(EXTPT_SECTIONS);
-		for (int i = 0; i < extensions.length; i++) {
-			IConfigurationElement extension = extensions[i];
-			IConfigurationElement[] sections = extension
-					.getChildren(ELEMENT_SECTION);
-			for (int j = 0; j < sections.length; j++) {
-				IConfigurationElement section = sections[j];
-				ISectionDescriptor descriptor = new SectionDescriptor(section,
-						typeMapper);
-				result.add(descriptor);
-			}
-		}
-		return (ISectionDescriptor[]) result
-				.toArray(new ISectionDescriptor[result.size()]);
-	}
-
-	/**
-	 * Returns the configuration elements targeted for the given extension point
-	 * and the current contributor id. The elements are also sorted by plugin
-	 * prerequisite order.
-	 */
-	protected IConfigurationElement[] getConfigurationElements(
-			String extensionPointId) {
-		if (contributorId == null) {
-			return new IConfigurationElement[0];
-		}
-		IExtensionPoint point = Platform.getExtensionRegistry()
-				.getExtensionPoint(
-						TabbedPropertyViewPlugin.getPlugin().getBundle()
-								.getSymbolicName(), extensionPointId);
-		IConfigurationElement[] extensions = point.getConfigurationElements();
-		List unordered = new ArrayList(extensions.length);
-		for (int i = 0; i < extensions.length; i++) {
-			IConfigurationElement extension = extensions[i];
-			if (!extension.getName().equals(extensionPointId)) {
-				continue;
-			}
-			String contributor = extension.getAttribute(ATT_CONTRIBUTOR_ID);
-			if (!contributorId.equals(contributor)) {
-				continue;
-			}
-			unordered.add(extension);
-		}
-		return (IConfigurationElement[]) unordered
-				.toArray(new IConfigurationElement[unordered.size()]);
-	}
-
-	/**
-	 * Returns the index of the given element in the array.
-	 */
-	private int getIndex(Object[] array, Object target) {
-		for (int i = 0; i < array.length; i++) {
-			if (array[i].equals(target)) {
-				return i;
-			}
-		}
-		return -1; // should never happen
-	}
-
-	/**
-	 * Returns all section descriptors for the provided selection.
-	 * 
-	 * @param part
-	 *            the workbench part containing the selection
-	 * @param selection
-	 *            the current selection.
-	 * @return all section descriptors.
-	 */
-	public ITabDescriptor[] getTabDescriptors(IWorkbenchPart part,
-			ISelection selection) {
-		if (selection == null || selection.isEmpty()) {
-			return EMPTY_DESCRIPTOR_ARRAY;
-		}
-
-		ITabDescriptor[] allDescriptors = null;
-		if (tabDescriptorProvider == null) {
-			allDescriptors = getAllTabDescriptors();
-		} else {
-			allDescriptors = tabDescriptorProvider.getTabDescriptors(part,
-					selection);
-		}
-
-		ITabDescriptor[] result = filterTabDescriptors(allDescriptors, part,
-				selection);
-		return result;
-	}
-
-	/**
-	 * Filters out the tab descriptors that do not have any sections for the
-	 * given input.
-	 */
-	protected ITabDescriptor[] filterTabDescriptors(
-			ITabDescriptor[] descriptors, IWorkbenchPart part,
-			ISelection selection) {
-		List result = new ArrayList();
-		for (int i = 0; i < descriptors.length; i++) {
-			ITabDescriptor descriptor = adaptDescriptorFor(descriptors[i],
-					part, selection);
-			if (!descriptor.getSectionDescriptors().isEmpty()) {
-				result.add(descriptor);
-			}
-		}
-		if (result.size() == 0) {
-			return EMPTY_DESCRIPTOR_ARRAY;
-		}
-		return (ITabDescriptor[]) result.toArray(new ITabDescriptor[result
-				.size()]);
-	}
-
-	/**
-	 * Given a property tab descriptor remove all its section descriptors that
-	 * do not apply to the given input object.
-	 */
-	protected ITabDescriptor adaptDescriptorFor(ITabDescriptor target,
-			IWorkbenchPart part, ISelection selection) {
-		List filteredSectionDescriptors = new ArrayList();
-		List descriptors = target.getSectionDescriptors();
-		for (Iterator iter = descriptors.iterator(); iter.hasNext();) {
-			ISectionDescriptor descriptor = (ISectionDescriptor) iter.next();
-			if (descriptor.appliesTo(part, selection)) {
-				filteredSectionDescriptors.add(descriptor);
-			}
-		}
-		AbstractTabDescriptor result = (AbstractTabDescriptor) ((AbstractTabDescriptor) target)
-				.clone();
-		result.setSectionDescriptors(filteredSectionDescriptors);
-		return result;
-	}
-
-	/**
-	 * Reads property tab extensions. Returns all tab descriptors for the
-	 * current contributor id or an empty array if none is found.
-	 */
-	protected ITabDescriptor[] getAllTabDescriptors() {
-		if (tabDescriptors == null) {
-			List temp = readTabDescriptors();
-			populateWithSectionDescriptors(temp);
-			temp = sortTabDescriptorsByCategory(temp);
-			temp = sortTabDescriptorsByAfterTab(temp);
-			tabDescriptors = (TabDescriptor[]) temp
-					.toArray(new TabDescriptor[temp.size()]);
-		}
-		return tabDescriptors;
-	}
-
-	/**
-	 * Reads property tab extensions. Returns all tab descriptors for the
-	 * current contributor id or an empty list if none is found.
-	 */
-	protected List readTabDescriptors() {
-		List result = new ArrayList();
-		IConfigurationElement[] extensions = getConfigurationElements(EXTPT_TABS);
-		for (int i = 0; i < extensions.length; i++) {
-			IConfigurationElement extension = extensions[i];
-			IConfigurationElement[] tabs = extension.getChildren(ELEMENT_TAB);
-			for (int j = 0; j < tabs.length; j++) {
-				IConfigurationElement tab = tabs[j];
-				TabDescriptor descriptor = new TabDescriptor(tab);
-				if (getIndex(propertyCategories.toArray(), descriptor
-						.getCategory()) == -1) {
-					/* tab descriptor has unknown category */
-					handleTabError(tab, descriptor.getCategory() == null ? "" //$NON-NLS-1$
-							: descriptor.getCategory());
-				} else {
-					result.add(descriptor);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Populates the given tab descriptors with section descriptors.
-	 */
-	protected void populateWithSectionDescriptors(List aTabDescriptors) {
-		ISectionDescriptor[] sections = null;
-		if (sectionDescriptorProvider != null) {
-			sections = sectionDescriptorProvider.getSectionDescriptors();
-		} else {
-			sections = readSectionDescriptors();
-		}
-		for (int i = 0; i < sections.length; i++) {
-			ISectionDescriptor section = sections[i];
-			appendToTabDescriptor(section, aTabDescriptors);
-		}
-	}
-
-	/**
-	 * Appends the given section to a tab from the list.
-	 */
-	protected void appendToTabDescriptor(ISectionDescriptor section,
-			List aTabDescriptors) {
-		for (Iterator i = aTabDescriptors.iterator(); i.hasNext();) {
-			TabDescriptor tab = (TabDescriptor) i.next();
-			if (tab.append(section)) {
-				return;
-			}
-		}
-		// could not append the section to any of the existing tabs - log error
-		String message = MessageFormat.format(NO_TAB_ERROR, new Object[] {
-				section.getId(), section.getTargetTab() });
-		IStatus status = new Status(IStatus.ERROR, TabbedPropertyViewPlugin
-				.getPlugin().getBundle().getSymbolicName(),
-				TabbedPropertyViewStatusCodes.NO_TAB_ERROR, message, null);
-		TabbedPropertyViewPlugin.getPlugin().getLog().log(status);
-	}
-
-	/**
-	 * Sorts the tab descriptors in the given list according to category.
-	 */
-	protected List sortTabDescriptorsByCategory(List descriptors) {
-		Collections.sort(descriptors, new Comparator() {
-
-			public int compare(Object arg0, Object arg1) {
-				TabDescriptor one = (TabDescriptor) arg0;
-				TabDescriptor two = (TabDescriptor) arg1;
-				String categoryOne = one.getCategory();
-				String categoryTwo = two.getCategory();
-				int categoryOnePosition = getIndex(
-						propertyCategories.toArray(), categoryOne);
-				int categoryTwoPosition = getIndex(
-						propertyCategories.toArray(), categoryTwo);
-				return categoryOnePosition - categoryTwoPosition;
-			}
-		});
-		return descriptors;
-	}
-
-	/**
-	 * Sorts the tab descriptors in the given list according to afterTab.
-	 */
-	protected List sortTabDescriptorsByAfterTab(List tabs) {
-		if (tabs.size() == 0 || propertyCategories == null) {
-			return tabs;
-		}
-		List sorted = new ArrayList();
-		int categoryIndex = 0;
-		for (int i = 0; i < propertyCategories.size(); i++) {
-			List categoryList = new ArrayList();
-			String category = (String) propertyCategories.get(i);
-			int topOfCategory = categoryIndex;
-			int endOfCategory = categoryIndex;
-			while (endOfCategory < tabs.size() &&
-					((TabDescriptor) tabs.get(endOfCategory)).getCategory()
-							.equals(category)) {
-				endOfCategory++;
-			}
-			for (int j = topOfCategory; j < endOfCategory; j++) {
-				TabDescriptor tab = (TabDescriptor) tabs.get(j);
-				if (tab.getAfterTab().equals(TOP)) {
-					categoryList.add(0, tabs.get(j));
-				} else {
-					categoryList.add(tabs.get(j));
-				}
-			}
-			Collections.sort(categoryList, new Comparator() {
-
-				public int compare(Object arg0, Object arg1) {
-					TabDescriptor one = (TabDescriptor) arg0;
-					TabDescriptor two = (TabDescriptor) arg1;
-					if (two.getAfterTab().equals(one.getId())) {
-						return -1;
-					} else if (one.getAfterTab().equals(two.getId())) {
-						return 1;
-					} else {
-						return 0;
-					}
-				}
-			});
-			for (int j = 0; j < categoryList.size(); j++) {
-				sorted.add(categoryList.get(j));
-			}
-			categoryIndex = endOfCategory;
-		}
-		return sorted;
-	}
-
-	/**
-	 * Gets the type mapper for the contributor.
-	 * 
-	 * @return the type mapper for the contributor.
-	 */
-	public ITypeMapper getTypeMapper() {
-		return typeMapper;
-	}
-
-	/**
-	 * Gets the label provider for the contributor.
-	 * 
-	 * @return the label provider for the contributor.
-	 */
-	public ILabelProvider getLabelProvider() {
-		return labelProvider;
-	}
-
-	/**
-	 * Gets the action provider for the contributor.
-	 * 
-	 * @return the action provider for the contributor.
-	 */
-	public IActionProvider getActionProvider() {
-		return actionProvider;
-	}
-
-	/**
-	 * Gets the tab list content provider for the contributor.
-	 * 
-	 * @return the tab list content provider for the contributor.
-	 */
-	public IStructuredContentProvider getTabListContentProvider() {
-		if (overridableTabListContentProvider) {
-			return new OverridableTabListContentProvider(this);
-		}
-		return new TabListContentProvider(this);
-	}
-
-	/**
-	 * Handle the tab error when an issue is found loading from the
-	 * configuration element.
-	 * 
-	 * @param configurationElement
-	 *            the configuration element
-	 */
-	private void handleTabError(IConfigurationElement configurationElement,
-			String category) {
-		String pluginId = configurationElement.getDeclaringExtension()
-				.getNamespaceIdentifier();
-		String message = MessageFormat.format(TAB_ERROR, new Object[] {
-				pluginId, category });
-		IStatus status = new Status(IStatus.ERROR, pluginId,
-				TabbedPropertyViewStatusCodes.TAB_ERROR, message, null);
-		TabbedPropertyViewPlugin.getPlugin().getLog().log(status);
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistryClassSectionFilter.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistryClassSectionFilter.java
deleted file mode 100755
index 60119c2..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistryClassSectionFilter.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.properties.tabbed.view;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-/**
- * Provides a section filtering mechanism where the selection is an
- * IStructuredSelection and filtering is based on class.
- * 
- * @author Anthony Hunter
- */
-public class TabbedPropertyRegistryClassSectionFilter {
-
-	private ITypeMapper typeMapper = null;
-
-	/**
-	 * Constructor for TabbedPropertyRegistryClassSectionFilter
-	 * 
-	 * @param typeMapper
-	 *            the type mapper.
-	 */
-	public TabbedPropertyRegistryClassSectionFilter(ITypeMapper typeMapper) {
-		super();
-		this.typeMapper = typeMapper;
-	}
-
-	/**
-	 * Verifies if the property section extension represented by sectionElement
-	 * applies to the given input.
-	 * 
-	 * @param descriptor
-	 *            the section descriptor.
-	 * @param selection
-	 *            the selection.
-	 * @return <code>true</code> if this section applies to the current
-	 *         selection.
-	 */
-	public boolean appliesToSelection(ISectionDescriptor descriptor,
-			ISelection selection) {
-
-		if (selection instanceof IStructuredSelection &&
-				selection.isEmpty() == false) {
-
-			if (descriptor.getEnablesFor() != ISectionDescriptor.ENABLES_FOR_ANY &&
-					((IStructuredSelection) selection).size() != descriptor
-							.getEnablesFor()) {
-				/**
-				 * enablesFor does not match the size of the selection, do not
-				 * display section.
-				 */
-				return false;
-			}
-
-			IFilter filter = descriptor.getFilter();
-
-			if (filter != null) {
-				for (Iterator i = ((IStructuredSelection) selection).iterator(); i
-						.hasNext();) {
-					Object object = i.next();
-
-					if (filter != null && filter.select(object) == false) {
-						/**
-						 * filter fails so section does not apply to the
-						 * selection, do not display section.
-						 */
-						return false;
-					}
-				}
-				/**
-				 * filter passes for all objects in the selection.
-				 */
-				return true;
-			}
-
-			Set effectiveTypes = new HashSet();
-
-			for (Iterator i = ((IStructuredSelection) selection).iterator(); i
-					.hasNext();) {
-
-				Object object = i.next();
-
-				Class remapType = object.getClass();
-				if (typeMapper != null) {
-					remapType = typeMapper.mapType(object);
-				}
-
-				if (effectiveTypes.add(remapType)) {
-
-					// the effective types of the selection
-					if (appliesToEffectiveType(descriptor, remapType) == false) {
-						return false;
-					}
-				}
-			}
-		} else {
-			/* Bug 245690 selection is not a IStructuredSelection */
-			if (descriptor.getFilter() != null) {
-				return descriptor.getFilter().select(selection);
-			}
-		}
-
-		return true;
-	}
-
-	private boolean appliesToEffectiveType(ISectionDescriptor descriptor,
-			Class inputClass) {
-
-		ArrayList classTypes = getClassTypes(inputClass);
-
-		List sectionInputTypes = descriptor.getInputTypes();
-		for (Iterator j = sectionInputTypes.iterator(); j.hasNext();) {
-			String type = (String) j.next();
-			if (classTypes.contains(type)) {
-				// found a match
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * Returns the classes and interfaces the given target class
-	 * extends/implements.
-	 */
-	protected ArrayList getClassTypes(Class target) {
-		ArrayList result = new ArrayList();
-		// add classes
-		List classes = computeClassOrder(target);
-		for (Iterator i = classes.iterator(); i.hasNext();) {
-			result.add(((Class) i.next()).getName());
-		}
-		// add interfaces
-		result.addAll(computeInterfaceOrder(classes));
-		return result;
-	}
-
-	private List computeClassOrder(Class target) {
-		List result = new ArrayList(4);
-		Class clazz = target;
-		while (clazz != null) {
-			result.add(clazz);
-			clazz = clazz.getSuperclass();
-		}
-		return result;
-	}
-
-	private List computeInterfaceOrder(List classes) {
-		List result = new ArrayList(4);
-		Map seen = new HashMap(4);
-		for (Iterator iter = classes.iterator(); iter.hasNext();) {
-			Class[] interfaces = ((Class) iter.next()).getInterfaces();
-			internalComputeInterfaceOrder(interfaces, result, seen);
-		}
-		return result;
-	}
-
-	private void internalComputeInterfaceOrder(Class[] interfaces, List result,
-			Map seen) {
-		List newInterfaces = new ArrayList(seen.size());
-		for (int i = 0; i < interfaces.length; i++) {
-			Class interfac = interfaces[i];
-			if (seen.get(interfac) == null) {
-				result.add(interfac.getName());
-				seen.put(interfac, interfac);
-				newInterfaces.add(interfac);
-			}
-		}
-		for (Iterator iter = newInterfaces.iterator(); iter.hasNext();) {
-			internalComputeInterfaceOrder(
-					((Class) iter.next()).getInterfaces(), result, seen);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistryFactory.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistryFactory.java
deleted file mode 100755
index 53714da..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyRegistryFactory.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.properties.tabbed.view;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-
-/**
- * tabbed property registry factory. Caches the tabbed property registry by
- * tabbed property contributor ID.
- * 
- * @author Anthony Hunter
- */
-public class TabbedPropertyRegistryFactory {
-
-	class CacheData {
-		TabbedPropertyRegistry registry;
-		List references;
-	}
-
-	/**
-	 * singleton instance of this class
-	 */
-	private static TabbedPropertyRegistryFactory INSTANCE = new TabbedPropertyRegistryFactory();
-
-	/**
-	 * get the singleton instance of this class.
-	 * 
-	 * @return the TabbedPropertyRegistryFactory instance.
-	 */
-	public static TabbedPropertyRegistryFactory getInstance() {
-		return INSTANCE;
-	}
-
-	/**
-	 * private constructor.
-	 */
-	private TabbedPropertyRegistryFactory() {
-		super();
-		idToCacheData = new HashMap();
-	}
-
-	protected Map idToCacheData; // cache
-
-	/**
-	 * Creates a registry for the given contributor.
-	 * 
-	 * @param target
-	 *            the contributor.
-	 * @return a registry for the given contributor.
-	 */
-	public TabbedPropertyRegistry createRegistry(
-			ITabbedPropertySheetPageContributor target) {
-		/**
-		 * Get the contributor id from the ITabbedPropertySheetPageContributor
-		 * interface
-		 */
-		String key = target.getContributorId();
-		CacheData data = (CacheData) idToCacheData.get(key);
-		if (data == null) {
-			data = new CacheData();
-			data.registry = new TabbedPropertyRegistry(key);
-			data.references = new ArrayList(5);
-			idToCacheData.put(key, data);
-		}
-		data.references.add(target);
-		// keeps track of contributor using the same registry
-		return data.registry;
-	}
-
-	/**
-	 * Indicates that the given contributor no longer needs a registry. The
-	 * registry will be disposed when no other contributor of the same type
-	 * needs it.
-	 * 
-	 * @param target
-	 *            the contributor;
-	 */
-	public void disposeRegistry(ITabbedPropertySheetPageContributor target) {
-		/**
-		 * Get the contributor id from the ITabbedPropertySheetPageContributor
-		 * interface
-		 */
-		String key = target.getContributorId();
-		CacheData data = (CacheData) idToCacheData.get(key);
-		if (data != null) {
-			data.references.remove(target);
-			if (data.references.isEmpty()) {
-				idToCacheData.remove(key);
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyTitle.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyTitle.java
deleted file mode 100755
index e9fd1a8..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyTitle.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.properties.tabbed.view;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IFormColors;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-
-
-/**
- * The title in the tabbed property sheet page.
- * 
- * @author Anthony Hunter
- */
-public class TabbedPropertyTitle
-	extends Composite {
-
-	private CLabel label;
-
-	private Image image = null;
-
-	private String text = null;
-	
-	private static final String BLANK = ""; //$NON-NLS-1$
-
-	private static final String TITLE_FONT = "org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyTitle"; //$NON-NLS-1$
-	
-	private TabbedPropertySheetWidgetFactory factory;
-
-	/**
-	 * Constructor for TabbedPropertyTitle.
-	 * 
-	 * @param parent
-	 *            the parent composite.
-	 * @param factory
-	 *            the widget factory for the tabbed property sheet
-	 */
-	public TabbedPropertyTitle(Composite parent,
-			TabbedPropertySheetWidgetFactory factory) {
-		super(parent, SWT.NO_FOCUS);
-		this.factory = factory;
-
-		this.addPaintListener(new PaintListener() {
-
-			public void paintControl(PaintEvent e) {
-				if (image == null && (text == null || text.equals(BLANK))) {
-					label.setVisible(false);
-				} else {
-					label.setVisible(true);
-					drawTitleBackground(e);
-				}
-			}
-		});
-
-		factory.getColors().initializeSectionToolBarColors();
-		setBackground(factory.getColors().getBackground());
-		setForeground(factory.getColors().getForeground());
-
-		FormLayout layout = new FormLayout();
-		layout.marginWidth = 1;
-		layout.marginHeight = 2;
-		setLayout(layout);
-
-		Font font;
-		if (! JFaceResources.getFontRegistry().hasValueFor(TITLE_FONT)) {
-			FontData[] fontData = JFaceResources.getFontRegistry().getBold(
-					JFaceResources.DEFAULT_FONT).getFontData();
-			/* title font is 2pt larger than that used in the tabs. */  
-			fontData[0].setHeight(fontData[0].getHeight() + 2);
-			JFaceResources.getFontRegistry().put(TITLE_FONT, fontData);
-		}
-		font = JFaceResources.getFont(TITLE_FONT);
-		
-		label = factory.createCLabel(this, BLANK);
-		label.setBackground(new Color[] {
-				factory.getColors().getColor(IFormColors.H_GRADIENT_END),
-				factory.getColors().getColor(IFormColors.H_GRADIENT_START) },
-				new int[] { 100 }, true);
-		label.setFont(font);
-		label.setForeground(factory.getColors().getColor(IFormColors.TITLE));
-		FormData data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.top = new FormAttachment(0, 0);
-		data.right = new FormAttachment(100, 0);
-		data.bottom = new FormAttachment(100, 0);
-		label.setLayoutData(data);
-
-		/*
-		 * setImage(PlatformUI.getWorkbench().getSharedImages().getImage(
-		 * ISharedImages.IMG_OBJ_ELEMENT));
-		 */
-	}
-
-	/**
-	 * @param e
-	 */
-	protected void drawTitleBackground(PaintEvent e) {
-		Rectangle bounds = getClientArea();
-		label.setBackground(new Color[] {
-				factory.getColors().getColor(IFormColors.H_GRADIENT_END),
-				factory.getColors().getColor(IFormColors.H_GRADIENT_START) },
-				new int[] { 100 }, true);
-		Color bg = factory.getColors().getColor(IFormColors.H_GRADIENT_END);
-		Color gbg = factory.getColors().getColor(IFormColors.H_GRADIENT_START);
-		GC gc = e.gc;
-		gc.setForeground(bg);
-		gc.setBackground(gbg);
-		gc.fillGradientRectangle(bounds.x, bounds.y, bounds.width,
-				bounds.height, true);
-		// background bottom separator
-		gc.setForeground(factory.getColors().getColor(
-				IFormColors.H_BOTTOM_KEYLINE1));
-		gc.drawLine(bounds.x, bounds.height - 2, bounds.x + bounds.width - 1,
-				bounds.height - 2);
-		gc.setForeground(factory.getColors().getColor(
-				IFormColors.H_BOTTOM_KEYLINE2));
-		gc.drawLine(bounds.x, bounds.height - 1, bounds.x + bounds.width - 1,
-				bounds.height - 1);
-	}
-
-	/**
-	 * Set the text label.
-	 * 
-	 * @param text
-	 *            the text label.
-	 * @param image
-	 *            the image for the label.
-	 */
-	public void setTitle(String text, Image image) {
-		this.text = text;
-		this.image = image;
-		if (text != null) {
-			label.setText(text);
-		} else {
-			label.setText(BLANK); 
-		}
-		label.setImage(image);
-		redraw();
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyViewer.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyViewer.java
deleted file mode 100755
index 5c5da17..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/internal/views/properties/tabbed/view/TabbedPropertyViewer.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.properties.tabbed.view;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Viewer representing the property sheet page. On the left side it 
- * contains a list of tabs and on the right side it contains the
- * current selected tab.
- * 
- * @author Anthony Hunter 
- */
-public class TabbedPropertyViewer extends StructuredViewer {
-
-	protected TabbedPropertyList list;
-	protected List elements;
-	protected IWorkbenchPart part;
-
-	/**
-	 * Constructor for TabbedPropertyViewer.
-	 * 
-	 * @param list
-	 *            the TabbedPropertyList.
-	 */
-	public TabbedPropertyViewer(TabbedPropertyList list) {
-		this.list = list;
-		hookControl(list);
-		elements = new ArrayList();
-	}
-
-	/**
-	 * Returns the element with the given index from this list viewer.
-	 * Returns <code>null</code> if the index is out of range.
-	 *
-	 * @param index the zero-based index
-	 * @return the element at the given index, or <code>null</code> if the
-	 *   index is out of range
-	 */
-	public Object getElementAt(int index) {
-		if (index >= 0 && index < elements.size()) {
-			return elements.get(index);
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the zero-relative index of the item which is currently
-	 * selected in the receiver, or -1 if no item is selected.
-	 *
-	 * @return the index of the selected item
-	 */
-	public int getSelectionIndex() {
-		return list.getSelectionIndex();
-	}
-
-	protected Widget doFindInputItem(Object element) {
-		/* not implemented */
-		return null;
-	}
-
-	protected Widget doFindItem(Object element) {
-		/* not implemented */
-		return null;
-	}
-
-	protected void doUpdateItem(Widget item, Object element, boolean fullMap) {
-		/* not implemented */
-	}
-
-	protected List getSelectionFromWidget() {
-		int index = list.getSelectionIndex();
-		if (index == TabbedPropertyList.NONE) {
-			return Collections.EMPTY_LIST;
-		}
-		List result = new ArrayList(1);
-		result.add(getElementAt(index));
-		return result;
-	}
-
-	protected void internalRefresh(Object element) {
-		/* not implemented */
-	}
-
-	public void reveal(Object element) {
-		/* not implemented */
-	}
-
-	/**
-	 * We do not consider multiple selections. Only the first
-	 * element will represent the selection.
-	 */
-	protected void setSelectionToWidget(List l, boolean reveal) {
-		if (l == null || l.size() == 0) { // clear selection
-			list.deselectAll();
-		} else {
-			Object object = l.get(0);
-			int index = -1;
-			for (int i = 0; i < elements.size(); i++) {
-				if (elements.get(i) == object) {
-					index = i;
-				}
-			}
-			Assert.isTrue(index != -1, "Could not set the selected tab in the tabbed property viewer");//$NON-NLS-1$
-			list.select(index);
-		}
-	}
-
-	public Control getControl() {
-		return list;
-	}
-
-	protected void inputChanged(Object input, Object oldInput) {
-		elements.clear();
-		Object[] children = getSortedChildren(getRoot());
-		list.removeAll();
-		for (int i = 0; i < children.length; i++) {
-			elements.add(children[i]);
-			mapElement(children[i], list);
-		}
-		list.setElements(children);
-	}
-
-	/**
-	 * Set the input for viewer.
-	 * 
-	 * @param part
-	 *            the workbench part.
-	 * @param selection
-	 *            the selection in the workbench part.
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		this.part = part;
-		setInput(selection);
-	}
-
-	/**
-	 * Get the current workbench part.
-	 * 
-	 * @return the current workbench part.
-	 */
-	public IWorkbenchPart getWorkbenchPart() {
-		return part;
-	}
-
-	/**
-	 * Returns the elements in this list viewer.
-
-	 * @return the elements in this list viewer.
-	 * @since 3.5
-	 */
-	public List getElements() {
-		return elements;
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractOverridableTabListPropertySection.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractOverridableTabListPropertySection.java
deleted file mode 100644
index 1b8b45a..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractOverridableTabListPropertySection.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-/**
- * An abstract implementation of a section in a tab that overrides the tabs that
- * are provided by the tabbed property registry with a new list of tabs.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class AbstractOverridableTabListPropertySection
-	extends AbstractPropertySection
-	implements IOverridableTabList {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.views.properties.tabbed.IOverridableTabList#getTabs()
-	 */
-	public ITabItem[] getTabs() {
-		return new ITabItem[] {};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.views.properties.tabbed.IOverridableTabList#selectTab(int)
-	 */
-	public void selectTab(int tab) {
-		/* no default implementation */
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractPropertySection.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractPropertySection.java
deleted file mode 100644
index ae5276e..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractPropertySection.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * An abstract implementation of a section in a tab in the tabbed property sheet
- * page.
- * 
- * @author Anthony Hunter
- */
-public abstract class AbstractPropertySection
-	implements ISection {
-
-	/**
-	 * The standard label width when labels for sections line up on the left
-	 * hand side of the composite.
-	 */
-	public static final int STANDARD_LABEL_WIDTH = 85;
-
-	/**
-	 * The tabbed property sheet page
-	 */
-	private TabbedPropertySheetPage tabbedPropertySheetPage;
-
-	/**
-	 * The current workbench selection.
-	 */
-	private ISelection selection;
-
-	/**
-	 * The current active workbench part.
-	 */
-	private IWorkbenchPart part;
-
-	/**
-	 * Get the widget factory for the property sheet page.
-	 * 
-	 * @return the widget factory.
-	 */
-	public TabbedPropertySheetWidgetFactory getWidgetFactory() {
-		return tabbedPropertySheetPage.getWidgetFactory();
-	}
-
-	/**
-	 * Get the current workbench selection.
-	 * 
-	 * @return the current workbench selection.
-	 */
-	public ISelection getSelection() {
-		return selection;
-	}
-
-	/**
-	 * @return Returns the part.
-	 */
-	public IWorkbenchPart getPart() {
-		return part;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		this.tabbedPropertySheetPage = aTabbedPropertySheetPage;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#setInput(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		this.selection = selection;
-		this.part = part;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#aboutToBeShown()
-	 */
-	public void aboutToBeShown() {
-		/* empty default implementation */
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#aboutToBeHidden()
-	 */
-	public void aboutToBeHidden() {
-		/* empty default implementation */
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#dispose()
-	 */
-	public void dispose() {
-		/* empty default implementation */
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#getMinimumHeight()
-	 */
-	public int getMinimumHeight() {
-		return SWT.DEFAULT;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#shouldUseExtraSpace()
-	 */
-	public boolean shouldUseExtraSpace() {
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#refresh()
-	 */
-	public void refresh() {
-		/* empty default implementation */
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractSectionDescriptor.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractSectionDescriptor.java
deleted file mode 100644
index 54c34c5..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractSectionDescriptor.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.views.properties.tabbed;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyRegistryClassSectionFilter;
-
-/**
- * An abstract implementation of a section descriptor for the tabbed property
- * view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public abstract class AbstractSectionDescriptor implements ISectionDescriptor {
-
-	private TabbedPropertyRegistryClassSectionFilter classFilter;
-
-	/**
-	 * Constructor for AbstractSectionDescriptor.
-	 */
-	public AbstractSectionDescriptor() {
-		super();
-		classFilter = new TabbedPropertyRegistryClassSectionFilter(null);
-	}
-
-	/**
-	 * Constructor for AbstractSectionDescriptor.
-	 * 
-	 * @param typeMapper
-	 *            the type mapper for the section.
-	 */
-	public AbstractSectionDescriptor(ITypeMapper typeMapper) {
-		super();
-		classFilter = new TabbedPropertyRegistryClassSectionFilter(typeMapper);
-	}
-
-	/*
-	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		return classFilter.appliesToSelection(this, selection);
-	}
-
-	/*
-	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getAfterSection()
-	 */
-	public String getAfterSection() {
-		return TOP;
-	}
-
-	/*
-	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getEnablesFor()
-	 */
-	public int getEnablesFor() {
-		return ENABLES_FOR_ANY;
-	}
-
-	/*
-	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getFilter()
-	 */
-	public IFilter getFilter() {
-		return null;
-	}
-
-	public List getInputTypes() {
-		return new ArrayList();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractTabDescriptor.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractTabDescriptor.java
deleted file mode 100644
index 124733f..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractTabDescriptor.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.views.properties.tabbed;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.internal.views.properties.tabbed.TabbedPropertyViewPlugin;
-
-/**
- * An abstract implementation of a tab descriptor for the tabbed property view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public abstract class AbstractTabDescriptor implements ITabDescriptor,
-		Cloneable {
-
-	private List sectionDescriptors;
-
-	/**
-	 * Constructor for AbstractTabDescriptor.
-	 */
-	public AbstractTabDescriptor() {
-		super();
-		sectionDescriptors = new ArrayList(5);
-	}
-
-	/*
-	 * @see java.lang.Object#clone()
-	 */
-	public Object clone() {
-		try {
-			return super.clone();
-		} catch (CloneNotSupportedException exception) {
-			IStatus status = new Status(IStatus.ERROR, TabbedPropertyViewPlugin
-					.getPlugin().getBundle().getSymbolicName(), 666, exception
-					.getMessage(), exception);
-			TabbedPropertyViewPlugin.getPlugin().getLog().log(status);
-		}
-		return null;
-	}
-
-	/*
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabDescriptor#createTab()
-	 */
-	public TabContents createTab() {
-		List sections = new ArrayList(getSectionDescriptors().size());
-		for (Iterator iter = getSectionDescriptors().iterator(); iter.hasNext();) {
-			ISectionDescriptor descriptor = (ISectionDescriptor) iter.next();
-			ISection section = descriptor.getSectionClass();
-			sections.add(section);
-		}
-		TabContents tab = new TabContents();
-		tab.setSections((ISection[]) sections.toArray(new ISection[sections
-				.size()]));
-		return tab;
-	}
-
-	/*
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object object) {
-		if (this == object) {
-			return true;
-		}
-
-		if (this.getClass() == object.getClass()) {
-			AbstractTabDescriptor descriptor = (AbstractTabDescriptor) object;
-			if (this.getCategory().equals(descriptor.getCategory()) &&
-					this.getId().equals(descriptor.getId()) &&
-					this.getSectionDescriptors().size() == descriptor
-							.getSectionDescriptors().size()) {
-
-				Iterator i = this.getSectionDescriptors().iterator();
-				Iterator j = descriptor.getSectionDescriptors().iterator();
-
-				// the order is important here - so as long as the sizes of the
-				// lists are the same and id of the section at the same
-				// positions are the same - the lists are the same
-				while (i.hasNext()) {
-					ISectionDescriptor source = (ISectionDescriptor) i.next();
-					ISectionDescriptor target = (ISectionDescriptor) j.next();
-					if (!source.getId().equals(target.getId())) {
-						return false;
-					}
-				}
-
-				return true;
-			}
-
-		}
-
-		return false;
-	}
-
-	/*
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabDescriptor#getAfterTab()
-	 */
-	public String getAfterTab() {
-		return TOP;
-	}
-
-	/*
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabItem#getImage()
-	 */
-	public Image getImage() {
-		return null;
-	}
-
-	/**
-	 * Get the list of section descriptors for the tab.
-	 * 
-	 * @return the list of section descriptors for the tab.
-	 */
-	public List getSectionDescriptors() {
-		return sectionDescriptors;
-	}
-
-	/*
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabItem#getText()
-	 */
-	public String getText() {
-		return getLabel();
-	}
-
-	/*
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-
-		int hashCode = getCategory().hashCode();
-		hashCode ^= getId().hashCode();
-		Iterator i = this.getSectionDescriptors().iterator();
-		while (i.hasNext()) {
-			ISectionDescriptor section = (ISectionDescriptor) i.next();
-			hashCode ^= section.getId().hashCode();
-		}
-		return hashCode;
-	}
-
-	/*
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabItem#isIndented()
-	 */
-	public boolean isIndented() {
-		return false;
-	}
-
-	/*
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabItem#isSelected()
-	 */
-	public boolean isSelected() {
-		return false;
-	}
-
-	/**
-	 * Set the list of section descriptors for the tab.
-	 * 
-	 * @param sectionDescriptors
-	 *            the list of section descriptors for the tab.
-	 */
-	public void setSectionDescriptors(List sectionDescriptors) {
-		this.sectionDescriptors = sectionDescriptors;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractTypeMapper.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractTypeMapper.java
deleted file mode 100644
index a2503d8..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AbstractTypeMapper.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-/**
- * Default implementation of a type mapper.
- * 
- * @author Anthony Hunter
- */
-public class AbstractTypeMapper
-    implements ITypeMapper {
-
-    public Class mapType(Object object) {
-        return object.getClass();
-    }
-
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AdvancedPropertySection.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AdvancedPropertySection.java
deleted file mode 100644
index ffc9acf..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/AdvancedPropertySection.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.PropertySheetPage;
-
-/**
- * An advanced section that is intended to show the original table format properties view
- * provided by base Eclipse.
- * 
- * @author Anthony Hunter 
- */
-public class AdvancedPropertySection
-	extends AbstractPropertySection {
-
-	/**
-	 * The Property Sheet Page.
-	 */
-	protected PropertySheetPage page;
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			final TabbedPropertySheetPage atabbedPropertySheetPage) {
-		super.createControls(parent, atabbedPropertySheetPage);
-		Composite composite = getWidgetFactory()
-			.createFlatFormComposite(parent);
-		page = new PropertySheetPage();
-
-		page.createControl(composite);
-		FormData data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, 0);
-		data.bottom = new FormAttachment(100, 0);
-		page.getControl().setLayoutData(data);
-		
-		page.getControl().addControlListener(new ControlAdapter() {
-
-			public void controlResized(ControlEvent e) {
-				atabbedPropertySheetPage.resizeScrolledComposite();
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#setInput(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		page.selectionChanged(part, selection);
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-
-		if (page != null) {
-			page.dispose();
-			page = null;
-		}
-
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#refresh()
-	 */
-	public void refresh() {
-		page.refresh();
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#shouldUseExtraSpace()
-	 */
-	public boolean shouldUseExtraSpace() {
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IActionProvider.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IActionProvider.java
deleted file mode 100644
index f44d417..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IActionProvider.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.views.properties.tabbed;
-
-import org.eclipse.ui.IActionBars;
-
-/**
- * Allows a tabbed properties view to make contributions to action bars.
- * <p>
- * An action provider is called when the tabbed properties view becomes the
- * active view. It is at this point where the action provider can override the
- * action bars.
- * </p>
- * <p>
- * Normally {@link TabbedPropertySheetPage#setActionBars(IActionBars)} is
- * sufficient, but this is only called once and is not sufficient for a
- * contributor that is selection based. An example is the Project Explorer where
- * different providers contribute different action sets and properties
- * configurations.
- * </p>
- * <p>
- * The most frequent use of setActionBars() is to retarget the global actions
- * for undo and redo based on the active tabbed properties view contributor.
- * </p>
- * 
- * @author Anthony Hunter
- * @since 3.2.1
- */
-public interface IActionProvider {
-
-    /**
-     * Allows the page to make contributions to the given action bars. The
-     * contributions will be visible when the page is visible.
-     * 
-     * @param contributor
-     *            the tabbed property sheet page contributor.
-     * @param actionBars
-     *            the action bars for this page
-     */
-    public void setActionBars(ITabbedPropertySheetPageContributor contributor,
-            IActionBars actionBars);
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IOverridableTabList.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IOverridableTabList.java
deleted file mode 100644
index 8ba2c7e..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IOverridableTabList.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-/**
- * Represents a list of tabs. Used by a section that overrides the tabs that are
- * provided by the tabbed property registry with a new list of tabs.
- * <p>
- * The overridable tab list is a content provider that provides both the
- * sections and the tab labels.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public interface IOverridableTabList {
-
-	/**
-	 * Returns the list of tabs.
-	 * 
-	 * @return the list of tabs.
-	 */
-	public ITabItem[] getTabs();
-
-	/**
-	 * Select the tab at the provided index.
-	 * 
-	 * @param index
-	 *            the index in the list of tabs to select.
-	 */
-	public void selectTab(int index);
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IOverridableTabListContentProvider.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IOverridableTabListContentProvider.java
deleted file mode 100644
index 76991cd..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/IOverridableTabListContentProvider.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-
-/**
- * A content provider for the tabbed property sheet page's list of tabs. Used by
- * a section that overrides the tabs that are provided by the tabbed property
- * registry with a new list of tabs.
- * <p>
- * The overridable tab list is a content provider that provides both the
- * sections and the tab labels.
-
- * @author Anthony Hunter
- * @since 3.4
- */
-public interface IOverridableTabListContentProvider extends IStructuredContentProvider {
-
-	/**
-	 * Override the tabs displayed in the tab list with a new list of tabs.
-	 */
-	public void overrideTabs();
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISection.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISection.java
deleted file mode 100644
index ddc6388..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISection.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Represents a section of properties for a given input.
- * <p>
- * The lifecycle of an ISection is as follows:
- * <ul>
- * <li><code>ISection.createControls()</code></li>
- * <li><code>ISection.setInput()</code></li>
- * <li><code>ISection.aboutToBeShown()</code></li>
- * <li><code>ISection.refresh()</code></li>
- * <li><code>ISection.aboutToBeHidden()</code></li>
- * <li><code>ISection.dispose()</code></li>
- * </ul>
- * </p>
- * <p>
- * Implementors of this class should be aware that a section instance might be
- * reused for different input objects (as long as they are valid section
- * inputs). It means that <code>ISection.setInput</code> can be called at any
- * time between <code>ISection.createControls</code> and
- * <code>ISection.dispose</code>.
- * </p>
- * <p>
- * When an input change event occurs, such as a tab selection or a workbench
- * selection change, an ISection is sent:
- * <ul>
- * <li><code>ISection.setInput()</code></li>
- * <li><code>ISection.refresh()</code></li>
- * </ul>
- * </p>
- * <p>
- * When an part activation event occurs, such as the contributor part activation
- * event, an ISection is sent:
- * <ul>
- * <li><code>ISection.setInput()</code></li>
- * <li><code>ISection.aboutToBeShown()</code></li>
- * <li><code>ISection.refresh()</code></li>
- * <li><code>ISection.setInput()</code></li>
- * <li><code>ISection.refresh()</code></li>
- * </ul>
- * This is because both a tab selection event and an input selection event have
- * occurred.
- * </p>
- * <p>
- * This interface should not be extended or implemented. New section instances
- * should be created using <code>AbstractPropertySection</code>.
- * </p>
- * @see org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage
- * 
- * @author Anthony Hunter
- */
-public interface ISection {
-
-	/**
-	 * Creates the controls for the section.
-	 * <p>
-	 * Clients should take advantage of the widget factory provided by the
-	 * framework to achieve a common look between property sections.
-	 * </p>
-	 * @see org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage#getWidgetFactory()
-	 * 
-	 * @param parent
-	 *            the parent composite for the section.
-	 * @param tabbedPropertySheetPage
-	 *            the tabbed property sheet page.
-	 */
-	public abstract void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage);
-
-	/**
-	 * Notifies the section that the workbench selection has changed. 
-	 * @param part The active workench part.
-	 * @param selection The active selection in the workbench part.
-	 */
-	public abstract void setInput(IWorkbenchPart part, ISelection selection);
-
-	/**
-	 * Notifies the section that its controls are about to be shown. It is
-	 * expected that sections enable domain related functions in this method,
-	 * most commonly add listeners.
-	 * <p>
-	 * Since the controls are not visible, the section should wait for the
-	 * refresh() before updating the section controls.
-	 * </p>
-	 */
-	public abstract void aboutToBeShown();
-
-	/**
-	 * Notifies the section that its controls are about to be hidden. It is
-	 * expected that sections disable domain related functions in this method,
-	 * most commonly remove listeners.
-	 */
-	public abstract void aboutToBeHidden();
-
-	/**
-	 * Dispose this section.
-	 */
-	public abstract void dispose();
-
-	/**
-	 * Returns the minimum height needed by this section. A return value of
-	 * <code>SWT.DEFAULT</code> indicates that no minimum height is defined.
-	 * 
-	 * @return the minimum height needed by this section.
-	 */
-	public abstract int getMinimumHeight();
-
-	/**
-	 * Determine whether this section would like extra height space in case
-	 * there is some left. Normally this is true when the section is the last to
-	 * be displayed on a tab or is the only section on a tab.
-	 * @return <code>true</code> if this section would like extra height space.
-	 */
-	public abstract boolean shouldUseExtraSpace();
-
-	/**
-	 * Refresh the contents of the controls displayed in this section.
-	 */
-	public abstract void refresh();
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISectionDescriptor.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISectionDescriptor.java
deleted file mode 100644
index ad1ed18..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISectionDescriptor.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Represents a section descriptor on the tabbed property sections extensions.
- * <p>
- * This interface should not be extended or implemented. New instances should be
- * created using <code>AbstractSectionDescriptor</code>.
- * </p>
- * 
- * @author Anthony Hunter
- */
-public interface ISectionDescriptor {
-
-	/**
-	 * If enabledFor is not specified in the descriptor, enable for any
-	 * selection.
-	 */
-	public final int ENABLES_FOR_ANY = -1;
-
-	/**
-	 * If afterSection is not specified in the descriptor, we default to be the
-	 * top section.
-	 * @since 3.4
-	 */
-	public static final String TOP = "top"; //$NON-NLS-1$
-
-	/**
-	 * Get the unique identifier for the section.
-	 * 
-	 * @return the unique identifier for the section.
-	 */
-	public String getId();
-
-	/**
-	 * Get the section filter instance for this section. Return null if no
-	 * filter for this section.
-	 * 
-	 * @return the section filter instance.
-	 */
-	public IFilter getFilter();
-
-	/**
-	 * Get the valid input types for this section.
-	 * 
-	 * @return the valid input types for this section.
-	 */
-	public List getInputTypes();
-
-	/**
-	 * Get the class that implements this section.
-	 * 
-	 * @return the class that implements this section.
-	 */
-	public ISection getSectionClass();
-
-	/**
-	 * Get the target tab where this section will appear.
-	 * 
-	 * @return the target tab where this section will appear.
-	 */
-	public String getTargetTab();
-
-	/**
-	 * Get the value for section enablement which is a precise number of items
-	 * selected. For example: enablesFor="1" enables the section only when one
-	 * item is selected. If not specified, enable for any selection and return
-	 * ENABLES_FOR_ANY.
-	 * 
-	 * @return the value for section enablement.
-	 */
-	public int getEnablesFor();
-
-	/**
-	 * Determines if this section applies to the selection.
-	 * 
-	 * @param part
-	 *            the current workbench part.
-	 * @param selection
-	 *            the selection.
-	 * @return <code>true</code> if this section applies to the current
-	 *         selection.
-	 */
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection);
-
-	/**
-	 * Get the section identifier below which this section is displayed.
-	 * <code>"top"</code> is returned if this section is the top most section
-	 * or if there is one section in the tab.
-	 * 
-	 * @return the section identifier.
-	 */
-	public String getAfterSection();
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISectionDescriptorProvider.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISectionDescriptorProvider.java
deleted file mode 100644
index e47aeb4..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ISectionDescriptorProvider.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-/**
- * Represents a section descriptor provider for tabbed property sections.
- * 
- * @author Anthony Hunter
- */
-public interface ISectionDescriptorProvider {
-
-	/**
-	 * Returns all section descriptors for the contributor.
-	 * @return all section descriptors.
-	 */
-	public ISectionDescriptor[] getSectionDescriptors();
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabDescriptor.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabDescriptor.java
deleted file mode 100644
index 2680e3f..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabDescriptor.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.views.properties.tabbed;
-
-import java.util.List;
-
-/**
- * Represents a tab descriptor for the tabbed property view.
- * <p>
- * This interface should not be extended or implemented. New instances should be
- * created using <code>AbstractTabDescriptor</code>.
- * </p>
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public interface ITabDescriptor extends ITabItem {
-
-	/**
-	 * If afterTab is not specified in the descriptor, we default to be the top
-	 * tab.
-	 */
-	public static final String TOP = "top"; //$NON-NLS-1$
-
-	/**
-	 * Instantiate this tab's sections.
-	 * 
-	 * @return The tab contents for this section.
-	 */
-	public TabContents createTab();
-
-	/**
-	 * Get the identifier of the tab after which this tab should be displayed.
-	 * When two or more tabs belong to the same category, they are sorted by the
-	 * after tab values.
-	 * 
-	 * @return the identifier of the tab.
-	 */
-	public String getAfterTab();
-
-	/**
-	 * Get the category this tab belongs to.
-	 * 
-	 * @return Get the category this tab belongs to.
-	 */
-	public String getCategory();
-
-	/**
-	 * Get the unique identifier for the tab.
-	 * 
-	 * @return the unique identifier for the tab.
-	 */
-	public String getId();
-
-	/**
-	 * Get the text label for the tab.
-	 * 
-	 * @return the text label for the tab.
-	 */
-	public String getLabel();
-
-	/**
-	 * Get the list of section descriptors for the tab.
-	 * 
-	 * @return the list of section descriptors for the tab.
-	 */
-	public List getSectionDescriptors();
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabDescriptorProvider.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabDescriptorProvider.java
deleted file mode 100644
index 3583d4e..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabDescriptorProvider.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Represents a tab descriptor provider for the tabbed property view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public interface ITabDescriptorProvider {
-
-	/**
-	 * Returns all tab descriptors.
-	 * 
-	 * @param part
-	 *            the workbench part containing the selection
-	 * @param selection
-	 *            the current selection.
-	 * @return all section descriptors.
-	 */
-	public ITabDescriptor[] getTabDescriptors(IWorkbenchPart part,
-			ISelection selection);
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabItem.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabItem.java
deleted file mode 100644
index 9cd387c..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabItem.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Represents a tab to be displayed in the tab list in the tabbed property sheet
- * page.
- * 
- * @author Anthony Hunter 
- */
-public interface ITabItem {
-
-	/**
-	 * Get the icon image for the tab.
-	 * 
-	 * @return the icon image for the tab.
-	 */
-	public Image getImage();
-
-	/**
-	 * Get the text label for the tab.
-	 * 
-	 * @return the text label for the tab.
-	 */
-	public String getText();
-
-	/**
-	 * Determine if this tab is selected.
-	 * 
-	 * @return <code>true</code> if this tab is selected.
-	 */
-	public boolean isSelected();
-
-	/**
-	 * Determine if this tab is indented.
-	 * 
-	 * @return <code>true</code> if this tab is indented.
-	 */
-	public boolean isIndented();
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabSelectionListener.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabSelectionListener.java
deleted file mode 100644
index ac662c7..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabSelectionListener.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-/**
- * A listener interested in tab selection events that occur for the tabbed
- * property sheet page.
- * 
- * @author Anthony Hunter 
- */
-public interface ITabSelectionListener {
-
-	/**
-	 * Notifies this listener that the selected tab has changed.
-	 * 
-	 * @param tabDescriptor
-	 *            the selected tab descriptor.
-	 * @since 3.4
-	 */
-	public void tabSelected(ITabDescriptor tabDescriptor);
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabbedPropertyConstants.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabbedPropertyConstants.java
deleted file mode 100644
index 8b9395c..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabbedPropertyConstants.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-/**
- * Constants used by the implementors of ITabbedPropertySection.
- * 
- * @author Anthony Hunter 
- */
-public interface ITabbedPropertyConstants {
-
-	/**
-	 * These horizontal margin around the composite.
-	 * Each section should use a margin of 0, 0.
-	 */
-	public static final int HMARGIN = 6;
-	
-	/**
-	 * These horizontal margin around the composite.
-	 */
-	public static final int VMARGIN = 6;
-
-	/**
-	 * Horizontal space to leave between related widgets. 
-	 * Each section should use these values for spacing its widgets. 
-	 * For example, you can use +/- HSPACE as the offset of a left or 
-	 * right FlatFormAttachment.
-	 * 
-	 * The tabbed property composite also inserts VSPACE pixels between 
-	 * section composites if more than one section is displayed.  
-	 */
-	public static final int HSPACE = 5;
-	
-	/**
-	 * Horizontal space to leave between related widgets.
-	 */ 
-	public static final int VSPACE = 4;
-
-	/**
-	 * Space to leave between the center of the property tab and the closest
-	 * widget to the left or right. I.e. for a property tab whose widgets are
-	 * logically divided into two halves, the total space between the halves
-	 * should be 2*CENTER_SPACE.
-	 */
-	public static final int CENTER_SPACE = 10;
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabbedPropertySheetPageContributor.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabbedPropertySheetPageContributor.java
deleted file mode 100644
index 3b5b009..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITabbedPropertySheetPageContributor.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-/**
- * Interface for a workbench part to contribute content to the tabbed property
- * view.
- * <p>
- * It is expected that the contributor ID is unique for a configuration of tabs
- * and sections. Editors and views can share a configuration by sharing a
- * contributor ID. Editors and views cannot share tabs and sections from
- * multiple contributors.
- * </p>
- * <p>
- * As a workaround, if all the elements in a structured selection implement
- * ITabbedPropertySheetPageContributor and they all return the same unique
- * contributor ID, then that configuration of tabs and sections will be used by
- * the tabbed property view for that selection.
- * </p>
- * 
- * @author Anthony Hunter
- */
-public interface ITabbedPropertySheetPageContributor {
-
-	/**
-	 * Returns the contributor ID for the tabbed property sheet page.
-	 * 
-	 * @return the contributor ID for the tabbed property sheet page.
-	 */
-	public String getContributorId();
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITypeMapper.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITypeMapper.java
deleted file mode 100644
index 66939d8..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/ITypeMapper.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-/**
- * Allows property sheet page contributors to map the input object type to a
- * domain model type. The domain model type is then used for matching against
- * the input attribute of the propertySection extension.
- * <p>
- * The type mapper is most frequently used to return the type of the model
- * object when selecting a view object in a workbench part. For example, nodes
- * in a tree may all be TreeObjects in a structured selection. The type mapper
- * will take the tree node and return the type of the model object the node
- * represents.
- * </p>
- * <p>
- * This interface should not be extended or implemented. New type mapper instances
- * should be created using <code>AbstractTypeMapper</code>.
- * </p>
- * 
- * @author Anthony Hunter
- */
-public interface ITypeMapper {
-
-	/**
-	 * Map the input object to a domain model type.
-	 * 
-	 * @param object
-	 *            the input object.
-	 * @return the type of the input object, mapped to the domain type if
-	 *         required.
-	 */
-	public Class mapType(Object object);
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabContents.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabContents.java
deleted file mode 100644
index ec95fde..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabContents.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * A property tab is composed by one or more property sections and is used to
- * categorize sections.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public final class TabContents {
-
-    private ISection[] sections;
-
-    private boolean controlsCreated;
-
-    /**
-     * 
-     */
-    public TabContents() {
-        controlsCreated = false;
-    }
-
-    /**
-     * Retrieve a numbered index for the section.
-     * @param section the section.
-     * @return the section index.
-     */
-    public int getSectionIndex(ISection section) {
-        for (int i = 0; i < sections.length; i++) {
-			if (section == sections[i]) {
-				return i;
-			}
-		}
-        return -1;
-    }
-
-    /**
-     * Retrieve the section at a numbered index.
-     * @param i a numbered index.
-     * @return the section.
-     */
-    public ISection getSectionAtIndex(int i) {
-        if (i >= 0 && i < sections.length) {
-			return sections[i];
-		}
-        return null;
-    }
-
-    /**
-     * Retrieve the sections on the tab.
-     * 
-     * @return the sections on the tab.
-     */
-    public ISection[] getSections() {
-        return sections;
-    }
-
-    /**
-     * Creates page's sections controls.
-     * 
-     * @param parent
-     * @param page
-     */
-    public void createControls(Composite parent,
-            final TabbedPropertySheetPage page) {
-        Composite pageComposite = page.getWidgetFactory().createComposite(
-            parent, SWT.NO_FOCUS);
-        GridLayout layout = new GridLayout();
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        layout.verticalSpacing = 0;
-        pageComposite.setLayout(layout);
-
-        for (int i = 0; i < sections.length; i++) {
-            final ISection section = sections[i];
-            final Composite sectionComposite = page.getWidgetFactory()
-                .createComposite(pageComposite, SWT.NO_FOCUS);
-            sectionComposite.setLayout(new FillLayout());
-            int style = (section.shouldUseExtraSpace()) ? GridData.FILL_BOTH
-                : GridData.FILL_HORIZONTAL;
-            GridData data = new GridData(style);
-            data.heightHint = section.getMinimumHeight();
-            sectionComposite.setLayoutData(data);
-
-            ISafeRunnable runnable = new SafeRunnable() {
-
-                public void run()
-                    throws Exception {
-                    section.createControls(sectionComposite, page);
-                }
-            };
-            SafeRunnable.run(runnable);
-        }
-        controlsCreated = true;
-    }
-
-    /**
-     * Dispose of page's sections controls.
-     */
-    public void dispose() {
-        for (int i = 0; i < sections.length; i++) {
-            final ISection section = sections[i];
-            ISafeRunnable runnable = new SafeRunnable() {
-
-                public void run()
-                    throws Exception {
-                    section.dispose();
-                }
-            };
-            SafeRunnable.run(runnable);
-        }
-    }
-
-    /**
-     * Sends the lifecycle event to the page's sections.
-     */
-    public void aboutToBeShown() {
-        for (int i = 0; i < sections.length; i++) {
-            final ISection section = sections[i];
-            ISafeRunnable runnable = new SafeRunnable() {
-
-                public void run()
-                    throws Exception {
-                    section.aboutToBeShown();
-                }
-            };
-            SafeRunnable.run(runnable);
-        }
-    }
-
-    /**
-     * Sends the lifecycle event to the page's sections.
-     */
-    public void aboutToBeHidden() {
-        for (int i = 0; i < sections.length; i++) {
-            final ISection section = sections[i];
-            ISafeRunnable runnable = new SafeRunnable() {
-
-                public void run()
-                    throws Exception {
-                    section.aboutToBeHidden();
-                }
-            };
-            SafeRunnable.run(runnable);
-        }
-    }
-
-    /**
-     * Sets page's sections input objects.
-     * 
-     * @param part
-     * @param selection
-     */
-    public void setInput(final IWorkbenchPart part, final ISelection selection) {
-        for (int i = 0; i < sections.length; i++) {
-            final ISection section = sections[i];
-            ISafeRunnable runnable = new SafeRunnable() {
-
-                public void run()
-                    throws Exception {
-                    section.setInput(part, selection);
-                }
-            };
-            SafeRunnable.run(runnable);
-        }
-    }
-
-    /**
-     * Set the sections for the tab.
-     * 
-     * @param sections the sections for the tab.
-     */
-    public void setSections(ISection[] sections) {
-        this.sections = sections;
-    }
-
-    /**
-     * Determine if the controls have been created.
-     * 
-     * @return <code>true</code> if controls have been created.
-     */
-    public boolean controlsHaveBeenCreated() {
-        return controlsCreated;
-    }
-
-    /**
-     * If controls have been created, refresh all sections on the page.
-     */
-    public void refresh() {
-        if (controlsCreated) {
-            for (int i = 0; i < sections.length; i++) {
-                final ISection section = sections[i];
-                ISafeRunnable runnable = new SafeRunnable() {
-
-                    public void run()
-                        throws Exception {
-                        section.refresh();
-                    }
-                };
-                SafeRunnable.run(runnable);
-            }
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabbedPropertySheetPage.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabbedPropertySheetPage.java
deleted file mode 100644
index e82afcf..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabbedPropertySheetPage.java
+++ /dev/null
@@ -1,1070 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-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.LabelProvider;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.ScrollBar;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyComposite;
-import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyRegistry;
-import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyRegistryFactory;
-import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyTitle;
-import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyViewer;
-import org.eclipse.ui.part.IContributedContentsView;
-import org.eclipse.ui.part.Page;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheet;
-
-/**
- * A property sheet page that provides a tabbed UI.
- * 
- * @author Anthony Hunter
- */
-public class TabbedPropertySheetPage
-	extends Page
-	implements IPropertySheetPage, ILabelProviderListener {
-
-	// widgets
-	private TabbedPropertyComposite tabbedPropertyComposite;
-
-	private TabbedPropertySheetWidgetFactory widgetFactory;
-
-	private ITabbedPropertySheetPageContributor contributor;
-
-	private TabbedPropertyRegistry registry;
-
-	private ITabbedPropertySheetPageContributor selectionContributor = null;
-
-	/**
-	 * The currently active contributor id, which may not match the contributor
-	 * id from the workbench part that created this instance.
-	 */
-	private String currentContributorId;
-
-	protected IStructuredContentProvider tabListContentProvider;
-
-	private ISelection currentSelection;
-
-	private boolean activePropertySheet;
-
-	private TabbedPropertyViewer tabbedPropertyViewer;
-
-	private TabContents currentTab;
-
-	private Map descriptorToTab;
-
-	private Map tabToComposite;
-
-	private List selectionQueue;
-
-	private boolean selectionQueueLocked;
-
-	private List tabSelectionListeners;
-
-	private IWorkbenchWindow cachedWorkbenchWindow;
-
-	private boolean hasTitleBar;
-	
-	private boolean registerPartActivationListener = true;
-
-	/**
-	 * a listener that is interested in part activation events.
-	 */
-	private IPartListener partActivationListener = new IPartListener() {
-
-		public void partActivated(IWorkbenchPart part) {
-			handlePartActivated(part);
-		}
-
-		public void partBroughtToTop(IWorkbenchPart part) {
-		}
-
-		public void partClosed(IWorkbenchPart part) {
-		}
-
-		public void partDeactivated(IWorkbenchPart part) {
-		}
-
-		public void partOpened(IWorkbenchPart part) {
-		}
-	};
-
-	private class TabbedPropertySheetPageContributorFromSelection
-		implements ITabbedPropertySheetPageContributor {
-
-		private String contributorId;
-
-		/**
-		 * Constructor that takes in a contributor id taken from a selection.
-		 * 
-		 * @param contributorId
-		 *            the contributor id.
-		 */
-		public TabbedPropertySheetPageContributorFromSelection(
-				String contributorId) {
-			super();
-			this.contributorId = contributorId;
-		}
-
-		/**
-		 * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor#getContributorId()
-		 */
-		public String getContributorId() {
-			return contributorId;
-		}
-
-	}
-
-	/**
-	 * Label provider for the ListViewer.
-	 */
-	class TabbedPropertySheetPageLabelProvider
-		extends LabelProvider {
-
-		public String getText(Object element) {
-			if (element instanceof ITabDescriptor) {
-				return ((ITabDescriptor) element).getLabel();
-			}
-			return null;
-		}
-	}
-
-	/**
-	 * SelectionChangedListener for the ListViewer.
-	 */
-	class SelectionChangedListener
-		implements ISelectionChangedListener {
-
-		/**
-		 * Shows the tab associated with the selection.
-		 */
-		public void selectionChanged(SelectionChangedEvent event) {
-			IStructuredSelection selection = (IStructuredSelection) event
-				.getSelection();
-			TabContents tab = null;
-			ITabDescriptor descriptor = (ITabDescriptor) selection
-					.getFirstElement();
-
-			if (descriptor == null) {
-				// pretend the tab is empty.
-				hideTab(currentTab);
-			} else {
-				// create tab if necessary
-				// can not cache based on the id - tabs may have the same id,
-				// but different section depending on the selection
-				tab = (TabContents) descriptorToTab.get(descriptor);
-
-				if (tab != currentTab) {
-					hideTab(currentTab);
-				}
-
-				Composite tabComposite = (Composite) tabToComposite.get(tab);
-				if (tabComposite == null) {
-					tabComposite = createTabComposite();
-					tab.createControls(tabComposite,
-						TabbedPropertySheetPage.this);
-					// tabAreaComposite.layout(true);
-					tabToComposite.put(tab, tabComposite);
-				}
-				// force widgets to be resized
-				tab.setInput(tabbedPropertyViewer.getWorkbenchPart(),
-					(ISelection) tabbedPropertyViewer.getInput());
-
-				// store tab selection
-				storeCurrentTabSelection(descriptor.getLabel());
-
-				if (tab != currentTab) {
-					showTab(tab);
-				}
-
-				tab.refresh();
-			}
-			tabbedPropertyComposite.getTabComposite().layout(true);
-			currentTab = tab;
-			resizeScrolledComposite();
-
-			if (descriptor != null) {
-				handleTabSelection(descriptor);
-			}
-		}
-
-		/**
-		 * Shows the given tab.
-		 */
-		private void showTab(TabContents target) {
-			if (target != null) {
-				Composite tabComposite = (Composite) tabToComposite.get(target);
-				if (tabComposite != null) {
-					/**
-					 * the following method call order is important - do not
-					 * change it or the widgets might be drawn incorrectly
-					 */
-					tabComposite.moveAbove(null);
-					target.aboutToBeShown();
-					tabComposite.setVisible(true);
-				}
-			}
-		}
-
-		/**
-		 * Hides the given tab.
-		 */
-		private void hideTab(TabContents target) {
-			if (target != null) {
-				Composite tabComposite = (Composite) tabToComposite.get(target);
-				if (tabComposite != null) {
-					target.aboutToBeHidden();
-					tabComposite.setVisible(false);
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * create a new tabbed property sheet page.
-	 * 
-	 * @param tabbedPropertySheetPageContributor
-	 *            the tabbed property sheet page contributor.
-	 */
-	public TabbedPropertySheetPage(
-			ITabbedPropertySheetPageContributor tabbedPropertySheetPageContributor) {
-		this(tabbedPropertySheetPageContributor, true);
-	}
-	
-	/**
-	 * create a new tabbed property sheet page.
-	 *
-	 * @param tabbedPropertySheetPageContributor
-	 *            the tabbed property sheet page contributor.	  
-	 * @param showTitleBar
-	 *            boolean indicating if the title bar should be shown; 
-	 *            default value is <code>true</code> 	
-	 * @since 3.5
-	 */
-	public TabbedPropertySheetPage(
-			ITabbedPropertySheetPageContributor tabbedPropertySheetPageContributor,
-			boolean showTitleBar) {
-		hasTitleBar = showTitleBar;
-		contributor = tabbedPropertySheetPageContributor;
-		tabToComposite = new HashMap();
-		selectionQueue = new ArrayList(10);
-		tabSelectionListeners = new ArrayList();
-		initContributor(contributor.getContributorId());
-	}
-
-	/**
-	 * Handle the part activated event.
-	 * 
-	 * @param part
-	 *            the new activated part.
-	 */
-	protected void handlePartActivated(IWorkbenchPart part) {
-		/*
-		 * The properties view has been activated and the current page is this
-		 * instance of TabbedPropertySheetPage
-		 */
-		boolean thisActivated = part instanceof PropertySheet
-			&& ((PropertySheet) part).getCurrentPage() == this;
-
-		/*
-		 * When the active part changes and the part does not provide a
-		 * selection that affects this property sheet page, the PropertySheet
-		 * does not send us a selectionChanged() event. We need to be informed
-		 * of these events since we want to send aboutToBeHidden() and
-		 * aboutToBeShown() when the property sheet is hidden or shown.
-		 */
-        if (!thisActivated && !part.equals(contributor)
-                && !part.getSite().getId().equals(contributor.getContributorId())) {
-			/*
-			 * Is the part is a IContributedContentsView for the contributor,
-			 * for example, outline view.
-			 */
-			IContributedContentsView view = (IContributedContentsView) part
-				.getAdapter(IContributedContentsView.class);
-			if (view == null
-				|| (view.getContributingPart() != null && !view
-					.getContributingPart().equals(contributor))) {
-				if (activePropertySheet) {
-					if (currentTab != null) {
-						currentTab.aboutToBeHidden();
-					}
-					activePropertySheet = false;
-				}
-				return;
-			}
-		}
-		if (!activePropertySheet && currentTab != null) {
-			currentTab.aboutToBeShown();
-			currentTab.refresh();
-		}
-		activePropertySheet = true;
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		widgetFactory = new TabbedPropertySheetWidgetFactory();
-		tabbedPropertyComposite = new TabbedPropertyComposite(parent,
-			widgetFactory, hasTitleBar);
-		widgetFactory.paintBordersFor(tabbedPropertyComposite);
-		tabbedPropertyComposite.setLayout(new FormLayout());
-		FormData formData = new FormData();
-		formData.left = new FormAttachment(0, 0);
-		formData.right = new FormAttachment(100, 0);
-		formData.top = new FormAttachment(0, 0);
-		formData.bottom = new FormAttachment(100, 0);
-		tabbedPropertyComposite.setLayoutData(formData);
-
-		tabbedPropertyViewer = new TabbedPropertyViewer(tabbedPropertyComposite
-			.getList());
-		tabbedPropertyViewer.setContentProvider(tabListContentProvider);
-		tabbedPropertyViewer
-			.setLabelProvider(new TabbedPropertySheetPageLabelProvider());
-		tabbedPropertyViewer
-			.addSelectionChangedListener(new SelectionChangedListener());
-
-		tabbedPropertyComposite.getScrolledComposite().addControlListener(
-				new ControlAdapter() {
-
-					public void controlResized(ControlEvent e) {
-						resizeScrolledComposite();
-					}
-				});
-
-		/**
-		 * Add a part activation listener.
-		 */
-		if (registerPartActivationListener) {
-			cachedWorkbenchWindow = getSite().getWorkbenchWindow();
-			cachedWorkbenchWindow.getPartService().addPartListener(
-					partActivationListener);
-		}
-
-		/**
-		 * Add a label provider change listener.
-		 */
-		if (hasTitleBar) {
-			registry.getLabelProvider().addListener(this);
-		}
-	}
-
-	/**
-	 * Initialize the contributor with the provided contributor id.
-	 * 
-	 * @param contributorId
-	 *            the contributor id.
-	 */
-	private void initContributor(String contributorId) {
-		descriptorToTab = new HashMap();
-		if (contributor.getContributorId().equals(contributorId)) {
-			/**
-			 * default contributor from the workbench part.
-			 */
-			registry = TabbedPropertyRegistryFactory.getInstance()
-				.createRegistry(contributor);
-		} else {
-			/**
-			 * selection contributor.
-			 */
-			selectionContributor = new TabbedPropertySheetPageContributorFromSelection(
-				contributorId);
-			registry = TabbedPropertyRegistryFactory.getInstance()
-				.createRegistry(selectionContributor);
-		}
-		currentContributorId = contributorId;
-		tabListContentProvider = getTabListContentProvider();
-		hasTitleBar = hasTitleBar && registry.getLabelProvider() != null;
-
-		if (tabbedPropertyViewer != null) {
-			tabbedPropertyViewer.setContentProvider(tabListContentProvider);
-		}
-
-		/**
-		 * Add a label provider change listener.
-		 */
-		if (hasTitleBar) {
-			registry.getLabelProvider().addListener(this);
-		}
-
-	}
-
-	/**
-	 * Gets the tab list content provider for the contributor.
-	 * 
-	 * @return the tab list content provider for the contributor.
-	 */
-	protected IStructuredContentProvider getTabListContentProvider() {
-		return registry.getTabListContentProvider();
-	}
-
-	/**
-	 * Dispose the contributor with the provided contributor id. This happens on
-	 * part close as well as when contributors switch between the workbench
-	 * part and contributor from a selection.
-	 */
-	private void disposeContributor() {
-		/**
-		 * If the current tab is about to be disposed we have to call
-		 * aboutToBeHidden
-		 */
-		if (currentTab != null) {
-			currentTab.aboutToBeHidden();
-			currentTab = null;
-		}
-
-		disposeTabs(descriptorToTab.values());
-		descriptorToTab = new HashMap();
-
-		/**
-		 * Remove the label provider change listener.
-		 */
-		if (hasTitleBar && registry != null) {
-			registry.getLabelProvider().removeListener(this);
-		}
-
-		if (selectionContributor != null) {
-			/**
-			 * remove the selection contributed registry.
-			 */
-			TabbedPropertyRegistryFactory.getInstance().disposeRegistry(
-				selectionContributor);
-			selectionContributor = null;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.IPage#dispose()
-	 */
-	public void dispose() {
-
-		disposeContributor();
-
-		if (widgetFactory != null) {
-			widgetFactory.dispose();
-			widgetFactory = null;
-		}
-		/**
-		 * Remove the part activation listener.
-		 */
-		if (cachedWorkbenchWindow != null) {
-			cachedWorkbenchWindow.getPartService().removePartListener(
-				partActivationListener);
-			cachedWorkbenchWindow = null;
-		}
-
-		if (registry != null) {
-			TabbedPropertyRegistryFactory.getInstance().disposeRegistry(
-				contributor);
-			registry = null;
-		}
-        
-        contributor = null;
-        currentSelection = null;
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.IPage#getControl()
-	 */
-	public Control getControl() {
-		return tabbedPropertyComposite;
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.IPage#setActionBars(org.eclipse.ui.IActionBars)
-	 */
-	public void setActionBars(IActionBars actionBars) {
-		// Override the undo and redo global action handlers
-		// to use the contributor action handlers
-        IActionBars partActionBars = null;
-		if (contributor instanceof IEditorPart) {
-			IEditorPart editorPart = (IEditorPart) contributor;
-            partActionBars = editorPart.getEditorSite().getActionBars();
-		} else if (contributor instanceof IViewPart) {
-            IViewPart viewPart = (IViewPart) contributor;
-            partActionBars = viewPart.getViewSite().getActionBars();
-        } 
-        
-        if (partActionBars != null) {
-            IAction action = partActionBars.getGlobalActionHandler(ActionFactory.UNDO
-                .getId());
-            if (action != null) {
-                actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(), action);
-            }
-            action = partActionBars.getGlobalActionHandler(ActionFactory.REDO
-                .getId()); 
-            if (action != null) {
-                actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(), action);
-            }
-        }
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.IPage#setFocus()
-	 */
-	public void setFocus() {
-		getControl().setFocus();
-	}
-
-	/**
-	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		setInput(part, selection);
-	}
-
-	/**
-	 * Stores the current tab label in the selection queue. Tab labels are used
-	 * to carry the tab context from one input object to another. The queue
-	 * specifies the selection priority. So if the first tab in the queue is not
-	 * available for the input we try the second tab and so on. If none of the
-	 * tabs are available we default to the first tab available for the input.
-	 */
-	private void storeCurrentTabSelection(String label) {
-		if (!selectionQueueLocked) {
-			selectionQueue.remove(label);
-			selectionQueue.add(0, label);
-		}
-	}
-
-	/**
-	 * Resize the scrolled composite enclosing the sections, which may result in the 
-	 * addition or removal of scroll bars.
-	 * 
-	 * @since 3.5
-	 */
-	public void resizeScrolledComposite() {
-		Point currentTabSize = new Point(0, 0);
-		if (currentTab != null) {
-			Composite sizeReference = (Composite) tabToComposite
-				.get(currentTab);
-			if (sizeReference != null) {
-				currentTabSize = sizeReference.computeSize(SWT.DEFAULT, SWT.DEFAULT); 
-			}
-		}
-		tabbedPropertyComposite.getScrolledComposite().setMinSize(
-				currentTabSize);
-
-		ScrollBar verticalScrollBar = tabbedPropertyComposite
-				.getScrolledComposite().getVerticalBar();
-		if (verticalScrollBar != null) {
-			Rectangle clientArea = tabbedPropertyComposite
-					.getScrolledComposite().getClientArea();
-			int increment = clientArea.height - 5;
-			verticalScrollBar.setPageIncrement(increment);
-		}
-
-		ScrollBar horizontalScrollBar = tabbedPropertyComposite
-				.getScrolledComposite().getHorizontalBar();
-		if (horizontalScrollBar != null) {
-			Rectangle clientArea = tabbedPropertyComposite
-					.getScrolledComposite().getClientArea();
-			int increment = clientArea.width - 5;
-			horizontalScrollBar.setPageIncrement(increment);
-		}
-	}
-
-	private void disposeTabs(Collection tabs) {
-		for (Iterator iter = tabs.iterator(); iter.hasNext();) {
-			TabContents tab = (TabContents) iter.next();
-			Composite composite = (Composite) tabToComposite.remove(tab);
-			tab.dispose();
-			if (composite != null) {
-				composite.dispose();
-			}
-		}
-	}
-
-	/**
-	 * Returns the last known selected tab for the given input.
-	 */
-	private int getLastTabSelection(IWorkbenchPart part, ISelection input) {
-		ITabDescriptor[] descriptors = registry.getTabDescriptors(part, input);
-		if (descriptors.length != 0) {
-			for (Iterator iter = selectionQueue.iterator(); iter.hasNext();) {
-				String text = (String) iter.next();
-				for (int i = 0; i < descriptors.length; i++) {
-					if (text.equals(descriptors[i].getLabel())) {
-						return i;
-					}
-				}
-			}
-		}
-		return 0;
-	}
-
-	/**
-	 * Update the current tabs to represent the given input object. When tabs
-	 * apply for both the old and new input they are reused otherwise they are
-	 * disposed. If the current visible tab will not be reused (i.e. will be
-	 * disposed) we have to send it an aboutToBeHidden() message.
-	 * @since 3.4
-	 */
-	protected void updateTabs(ITabDescriptor[] descriptors) {
-		Map newTabs = new HashMap(descriptors.length * 2);
-		boolean disposingCurrentTab = (currentTab != null);
-		for (int i = 0; i < descriptors.length; i++) {
-			TabContents tab = (TabContents) descriptorToTab
-					.remove(descriptors[i]);
-
-			if (tab != null && tab.controlsHaveBeenCreated()) {
-				if (tab == currentTab) {
-					disposingCurrentTab = false;
-				}
-			} else {
-				tab = createTab(descriptors[i]);
-			}
-
-			newTabs.put(descriptors[i], tab);
-		}
-		if (disposingCurrentTab) {
-			/**
-			 * If the current tab is about to be disposed we have to call
-			 * aboutToBeHidden
-			 */
-			currentTab.aboutToBeHidden();
-			currentTab = null;
-		}
-		disposeTabs(descriptorToTab.values());
-		descriptorToTab = newTabs;
-	}
-
-	/**
-	 * Create the tab contents for the provided tab descriptor.
-	 * 
-	 * @param tabDescriptor
-	 *            the tab descriptor.
-	 * @return the tab contents.
-	 * @since 3.4
-	 */
-	protected TabContents createTab(ITabDescriptor tabDescriptor) {
-		return tabDescriptor.createTab();
-	}
-
-	/**
-	 * Helper method for creating property tab composites.
-	 * 
-	 * @return the property tab composite.
-	 */
-	private Composite createTabComposite() {
-		Composite result = widgetFactory.createComposite(
-			tabbedPropertyComposite.getTabComposite(), SWT.NO_FOCUS);
-		result.setVisible(false);
-		result.setLayout(new FillLayout());
-		FormData data = new FormData();
-		if (hasTitleBar) {
-			data.top = new FormAttachment(tabbedPropertyComposite.getTitle(), 0);
-		} else {
-			data.top = new FormAttachment(0, 0);
-		}
-		data.bottom = new FormAttachment(100, 0);
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(100, 0);
-		result.setLayoutData(data);
-		return result;
-	}
-
-	private void setInput(IWorkbenchPart part, ISelection selection) {
-		if (selection.equals(currentSelection)) {
-			return;
-		}
-
-		this.currentSelection = selection;
-
-		// see if the selection provides a new contributor
-		validateRegistry(selection);
-		ITabDescriptor[] descriptors = registry.getTabDescriptors(part,
-				currentSelection);
-		// If there are no descriptors for the given input we do not need to
-		// touch the tab objects. We might reuse them for the next valid
-		// input.
-		if (descriptors.length > 0) {
-			updateTabs(descriptors);
-		}
-		// update tabs list
-		tabbedPropertyViewer.setInput(part, currentSelection);
-		int lastTabSelectionIndex = getLastTabSelection(part, currentSelection);
-		Object selectedTab = tabbedPropertyViewer
-			.getElementAt(lastTabSelectionIndex);
-		selectionQueueLocked = true;
-		try {
-			if (selectedTab == null) {
-				tabbedPropertyViewer.setSelection(null);
-			} else {
-				tabbedPropertyViewer.setSelection(new StructuredSelection(
-					selectedTab));
-			}
-		} finally {
-			selectionQueueLocked = false;
-		}
-		refreshTitleBar();
-	}
-
-	/**
-	 * Refresh the currently active tab.
-	 */
-	public void refresh() {
-		currentTab.refresh();
-	}
-
-	/**
-	 * Get the currently active tab.
-	 * 
-	 * @return the currently active tab.
-	 * @since 3.4
-	 */
-	public TabContents getCurrentTab() {
-		return currentTab;
-	}
-
-	/**
-	 * Handle the tab selected change event.
-	 * 
-	 * @param tabDescriptor
-	 *            the new selected tab.
-	 */
-	private void handleTabSelection(ITabDescriptor tabDescriptor) {
-		if (selectionQueueLocked) {
-			/*
-			 * don't send tab selection events for non user changes.
-			 */
-			return;
-		}
-		for (Iterator i = tabSelectionListeners.iterator(); i.hasNext();) {
-			ITabSelectionListener listener = (ITabSelectionListener) i.next();
-			listener.tabSelected(tabDescriptor);
-		}
-	}
-
-	/**
-	 * Add a tab selection listener.
-	 * 
-	 * @param listener
-	 *            a tab selection listener.
-	 */
-	public void addTabSelectionListener(ITabSelectionListener listener) {
-		tabSelectionListeners.add(listener);
-	}
-
-	/**
-	 * Remove a tab selection listener.
-	 * 
-	 * @param listener
-	 *            a tab selection listener.
-	 */
-	public void removeTabSelectionListener(ITabSelectionListener listener) {
-		tabSelectionListeners.remove(listener);
-	}
-
-	/**
-	 * Override the tabs with a new set of tabs. The tab list is obtained from
-	 * the {@link AbstractOverridableTabListPropertySection} by the
-	 * {@link IOverridableTabListContentProvider}.
-	 * @since 3.4
-	 */
-	public void overrideTabs() {
-		if (tabListContentProvider instanceof IOverridableTabListContentProvider) {
-			IOverridableTabListContentProvider overridableTabListContentProvider = (IOverridableTabListContentProvider) tabListContentProvider;
-			overridableTabListContentProvider.overrideTabs();
-		}
-	}
-
-	/**
-	 * Get the widget factory.
-	 * 
-	 * @return the widget factory.
-	 */
-	public TabbedPropertySheetWidgetFactory getWidgetFactory() {
-		return widgetFactory;
-	}
-
-	/**
-	 * Update the title bar of the contributor has a label provider.
-	 */
-	private void refreshTitleBar() {
-		if (hasTitleBar) {
-			TabbedPropertyTitle title = tabbedPropertyComposite.getTitle();
-			if (currentTab == null) {
-				/**
-				 * No tabs are shown so hide the title bar, otherwise you see
-				 * "No properties available" and a title bar for the selection.
-				 */
-				title.setTitle(null, null);
-			} else {
-				String text = registry.getLabelProvider().getText(
-					currentSelection);
-				Image image = registry.getLabelProvider().getImage(
-					currentSelection);
-				title.setTitle(text, image);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ILabelProviderListener#labelProviderChanged(org.eclipse.jface.viewers.LabelProviderChangedEvent)
-	 */
-	public void labelProviderChanged(LabelProviderChangedEvent event) {
-		refreshTitleBar();
-	}
-
-    /**
-     * Retrieve the contributor from the selection.
-     * 
-     * @param object -
-     *            the selected element
-     * @return the TabbedPropertySheetPageContributor or null if not applicable
-     */
-    private ITabbedPropertySheetPageContributor getTabbedPropertySheetPageContributor(
-            Object object) {
-        if (object instanceof ITabbedPropertySheetPageContributor) {
-            return (ITabbedPropertySheetPageContributor) object;
-        }
-
-        if (object instanceof IAdaptable
-            && ((IAdaptable) object)
-                .getAdapter(ITabbedPropertySheetPageContributor.class) != null) {
-            return (ITabbedPropertySheetPageContributor) (((IAdaptable) object)
-                .getAdapter(ITabbedPropertySheetPageContributor.class));
-        }
-
-        if (Platform.getAdapterManager().hasAdapter(object,
-            ITabbedPropertySheetPageContributor.class.getName())) {
-            return (ITabbedPropertySheetPageContributor) Platform
-                .getAdapterManager().loadAdapter(object,
-                    ITabbedPropertySheetPageContributor.class.getName());
-        }
-
-        return null;
-	}
-
-	/**
-	 * The workbench part creates this instance of the TabbedPropertySheetPage
-	 * and implements ITabbedPropertySheetPageContributor which is unique
-	 * contributor id. This unique contributor id is used to load a registry
-	 * with the extension point This id matches the registry.
-	 * <p>
-	 * It is possible for elements in a selection to implement
-	 * ITabbedPropertySheetPageContributor to provide a different contributor id
-	 * and thus a differenent registry.
-	 * 
-	 * @param selection
-	 *            the current selection in the active workbench part.
-	 */
-	private void validateRegistry(ISelection selection) {
-		if (selection == null) {
-			return;
-		}
-
-		if (!(selection instanceof IStructuredSelection)) {
-			return;
-		}
-
-		IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-		if (structuredSelection.size() == 0) {
-			return;
-		}
-
-        ITabbedPropertySheetPageContributor newContributor = getTabbedPropertySheetPageContributor(structuredSelection.getFirstElement());
-        
-		if (newContributor == null) {
-			/**
-			 * selection does not implement or adapt ITabbedPropertySheetPageContributor.
-			 */
-			newContributor = contributor;
-		}
-		
-        String selectionContributorId = newContributor.getContributorId();
-		if (selectionContributorId.equals(currentContributorId)) {
-			/**
-			 * selection has the same contributor id as current, so leave
-			 * existing registry.
-			 */
-			return;
-		}
-
-		/**
-		 * Selection implements ITabbedPropertySheetPageContributor different
-		 * than current contributor id, so make sure all elements implement the
-		 * new id. If all contributor id do not match, then fall back to default
-		 * contributor from the workbench part.
-		 */
-		Iterator i = structuredSelection.iterator();
-        i.next();
-		while (i.hasNext()) {
-            newContributor = getTabbedPropertySheetPageContributor(i.next());
-			if (newContributor == null || !newContributor.getContributorId().equals(selectionContributorId)) {
-				/**
-				 * fall back to use the default contributor id from the
-				 * workbench part.
-				 */
-				if (selectionContributor != null) {
-					disposeContributor();
-					currentContributorId = contributor.getContributorId();
-					initContributor(currentContributorId);
-				}
-				return;
-			}
-		}
-
-		/**
-		 * All the elements in the selection implement a new contributor id, so
-		 * use that id.
-		 */
-		disposeContributor();
-		currentContributorId = selectionContributorId;
-		initContributor(currentContributorId);
-        overrideActionBars();
-	}
-
-    /**
-     * Override the action bars for the selection based contributor.
-     */
-    private void overrideActionBars() {
-        if (registry.getActionProvider() != null ) {
-            IActionProvider actionProvider = registry.getActionProvider();
-            actionProvider.setActionBars(contributor, getSite().getActionBars());
-        }
-    }
-
-	/**
-	 * Returns the currently selected tab.
-	 * 
-	 * @return the currently selected tab or <code>null</code> if there is no
-	 *         tab selected.
-	 * @since 3.5
-	 */
-	public ITabDescriptor getSelectedTab() {
-		int selectedTab = tabbedPropertyViewer.getSelectionIndex();
-		if (selectedTab != -1) {
-			Object object = tabbedPropertyViewer.getElementAt(selectedTab);
-			if (object instanceof ITabDescriptor) {
-				return (ITabDescriptor) object;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the list of currently active tabs.
-	 * 
-	 * @return the currently active tabs.
-	 * @since 3.5
-	 */
-	public ITabDescriptor[] getActiveTabs() {
-		List elements = tabbedPropertyViewer.getElements();
-		if (elements != null && elements.size() > 0) {
-			ITabDescriptor[] tabDescriptors = (ITabDescriptor[]) elements
-					.toArray(new ITabDescriptor[0]);
-			return tabDescriptors;
-		}
-		return new ITabDescriptor[] {};
-	}
-	
-	/**
-	 * Set the currently selected tab to be that of the provided tab id.
-	 * 
-	 * @param id
-	 *            The string id of the tab to select.
-	 * @since 3.5
-	 */
-	public void setSelectedTab(String id) {
-		List elements = tabbedPropertyViewer.getElements();
-		if (elements != null && elements.size() > 0) {
-			for (Iterator i = elements.iterator(); i.hasNext();) {
-				ITabDescriptor tabDescriptor = (ITabDescriptor) i.next();
-				if (tabDescriptor.getId() != null &&
-						tabDescriptor.getId().equals(id)) {
-					tabbedPropertyViewer.setSelection(new StructuredSelection(
-							tabDescriptor), true);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Sets the value indicating if the part activation listener should be registered. Default is true.
-	 * 
-	 * @param registerPartActivationListener true if the part activation listener should be registered
-	 * @since 3.5
-	 */
-	protected void setRegisterPartActivationListener(
-			boolean registerPartActivationListener) {
-		this.registerPartActivationListener = registerPartActivationListener;
-	}
-	
-	/**
-	 * Returns the value indicating if the part activation listener should be registered.
-	 * 
-	 * @return the value indicating if the part activation listener should be registered.
-	 * @since 3.5
-	 */ 
-	protected boolean registerPartActivationListener() {
-		return registerPartActivationListener;
-	}	
-
-	/**
-     * Returns text of the properties title.
-     *  
-     * @return String representing title text.
-	 * @since 3.5
-     */	
-    public String getTitleText() {
-    	return registry.getLabelProvider().getText(currentSelection);
-    }
-    
-    /**
-     * Returns the copy of the title image.
-     * 
-     * @return Image that is used as a title image.
-     * @since 3.5
-     */
-    public Image getTitleImage() {
-		return registry.getLabelProvider().getImage(currentSelection);
-    }
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabbedPropertySheetWidgetFactory.java b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabbedPropertySheetWidgetFactory.java
deleted file mode 100644
index dedd4c9..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/TabbedPropertySheetWidgetFactory.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties.tabbed;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * A FormToolkit customized for use by tabbed property sheet page.
- * 
- * @author Anthony Hunter
- */
-public class TabbedPropertySheetWidgetFactory
-    extends FormToolkit {
-
-    /**
-     * private constructor.
-     */
-    public TabbedPropertySheetWidgetFactory() {
-        super(Display.getCurrent());
-    }
-
-    /**
-     * Creates the tab folder as a part of the form.
-     * 
-     * @param parent
-     *            the composite parent.
-     * @param style
-     *            the tab folder style.
-     * @return the tab folder
-     */
-    public CTabFolder createTabFolder(Composite parent, int style) {
-        CTabFolder tabFolder = new CTabFolder(parent, style);
-        return tabFolder;
-    }
-
-    /**
-     * Creates the tab item as a part of the tab folder.
-     * 
-     * @param tabFolder
-     *            the parent.
-     * @param style
-     *            the tab folder style.
-     * @return the tab item.
-     */
-    public CTabItem createTabItem(CTabFolder tabFolder, int style) {
-        CTabItem tabItem = new CTabItem(tabFolder, style);
-        return tabItem;
-    }
-
-    /**
-     * Creates the list as a part of the form.
-     * 
-     * @param parent
-     *            the composite parent.
-     * @param style
-     *            the list style.
-     * @return the list.
-     */
-    public List createList(Composite parent, int style) {
-        List list = new org.eclipse.swt.widgets.List(parent, style);
-        return list;
-    }
-
-    public Composite createComposite(Composite parent, int style) {
-        Composite c = super.createComposite(parent, style);
-        paintBordersFor(c);
-        return c;
-    }
-
-    public Composite createComposite(Composite parent) {
-        Composite c = createComposite(parent, SWT.NONE);
-        return c;
-    }
-
-    /**
-     * Creates a plain composite as a part of the form.
-     * 
-     * @param parent
-     *            the composite parent.
-     * @param style
-     *            the composite style.
-     * @return the composite.
-     */
-    public Composite createPlainComposite(Composite parent, int style) {
-        Composite c = super.createComposite(parent, style);
-        c.setBackground(parent.getBackground());
-        paintBordersFor(c);
-        return c;
-    }
-
-    /**
-     * Creates a scrolled composite as a part of the form.
-     * 
-     * @param parent
-     *            the composite parent.
-     * @param style
-     *            the composite style.
-     * @return the composite.
-     */
-    public ScrolledComposite createScrolledComposite(Composite parent, int style) {
-        ScrolledComposite scrolledComposite = new ScrolledComposite(parent,
-            style);
-        return scrolledComposite;
-    }
-
-    /**
-     * Creates a combo box as a part of the form.
-     * 
-     * @param parent
-     *            the combo box parent.
-     * @param comboStyle
-     *            the combo box style.
-     * @return the combo box.
-     */
-    public CCombo createCCombo(Composite parent, int comboStyle) {
-        CCombo combo = new CCombo(parent, comboStyle);
-        adapt(combo, true, false);
-        // Bugzilla 145837 - workaround for no borders on Windows XP
-		if (getBorderStyle() == SWT.BORDER) {
-			combo.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
-		}
-        return combo;
-    }
-
-    /**
-     * Creates a combo box as a part of the form.
-     * 
-     * @param parent
-     *            the combo box parent.
-     * @return the combo box.
-     */
-    public CCombo createCCombo(Composite parent) {
-        return createCCombo(parent, SWT.FLAT | SWT.READ_ONLY);
-    }
-
-    /**
-     * Creates a group as a part of the form.
-     * 
-     * @param parent
-     *            the group parent.
-     * @param text
-     *            the group title.
-     * @return the composite.
-     */
-    public Group createGroup(Composite parent, String text) {
-        Group group = new Group(parent, SWT.SHADOW_NONE);
-        group.setText(text);
-        group.setBackground(getColors().getBackground());
-        group.setForeground(getColors().getForeground());
-        return group;
-    }
-
-    /**
-     * Creates a flat form composite as a part of the form.
-     * 
-     * @param parent
-     *            the composite parent.
-     * @return the composite.
-     */
-    public Composite createFlatFormComposite(Composite parent) {
-        Composite composite = createComposite(parent);
-        FormLayout layout = new FormLayout();
-        layout.marginWidth = ITabbedPropertyConstants.HSPACE + 2;
-        layout.marginHeight = ITabbedPropertyConstants.VSPACE;
-        layout.spacing = ITabbedPropertyConstants.VMARGIN + 1;
-        composite.setLayout(layout);
-        return composite;
-    }
-
-    /**
-     * Creates a label as a part of the form.
-     * 
-     * @param parent
-     *            the label parent.
-     * @param text
-     *            the label text.
-     * @return the label.
-     */
-    public CLabel createCLabel(Composite parent, String text) {
-        return createCLabel(parent, text, SWT.NONE);
-    }
-
-    /**
-     * Creates a label as a part of the form.
-     * 
-     * @param parent
-     *            the label parent.
-     * @param text
-     *            the label text.
-     * @param style
-     *            the label style.
-     * @return the label.
-     */
-    public CLabel createCLabel(Composite parent, String text, int style) {
-        final CLabel label = new CLabel(parent, style);
-        label.setBackground(parent.getBackground());
-        label.setText(text);
-        return label;
-    }
-
-    public void dispose() {
-        if (getColors() != null) {
-            super.dispose();
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/package.html b/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/package.html
deleted file mode 100644
index a6397e0..0000000
--- a/bundles/org.eclipse.ui.views.properties.tabbed/src/org/eclipse/ui/views/properties/tabbed/package.html
+++ /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">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides the Tabbed Properties framework. This allows client views and editors to
-provide a tabbed property sheet page to the Properties view. 
-See TabbedPropertySheetPage.
-The tabs and sections to show for the selected element(s) in the source part are
-defined by extensions to this plug-in's extension points.
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.views/.classpath b/bundles/org.eclipse.ui.views/.classpath
deleted file mode 100644
index ce73933..0000000
--- a/bundles/org.eclipse.ui.views/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.ui.views/.cvsignore b/bundles/org.eclipse.ui.views/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.ui.views/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.ui.views/.project b/bundles/org.eclipse.ui.views/.project
deleted file mode 100644
index 770eaa2..0000000
--- a/bundles/org.eclipse.ui.views/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.views</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.views/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.ui.views/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 852d566..0000000
--- a/bundles/org.eclipse.ui.views/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,93 +0,0 @@
-#Wed Apr 30 16:16:06 EDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.ui.views/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.ui.views/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index f27cfb9..0000000
--- a/bundles/org.eclipse.ui.views/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Tue Sep 12 08:59:34 EDT 2006
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.3\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template></templates>
diff --git a/bundles/org.eclipse.ui.views/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.ui.views/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 0f029be..0000000
--- a/bundles/org.eclipse.ui.views/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,26 +0,0 @@
-#Wed Apr 30 16:16:06 EDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=0
-compilers.p.discouraged-class=1
-compilers.p.illegal-att-value=0
-compilers.p.internal=1
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=2
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/bundles/org.eclipse.ui.views/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.views/META-INF/MANIFEST.MF
deleted file mode 100644
index 51120dd..0000000
--- a/bundles/org.eclipse.ui.views/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ui.views; singleton:=true
-Bundle-Version: 3.3.100.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.ui.internal.views.ViewsPlugin
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.ui.internal.views;x-internal:=true,
- org.eclipse.ui.internal.views.contentoutline;x-internal:=true,
- org.eclipse.ui.internal.views.properties; ui.views="split"; mandatory:="ui.views"; x-internal:=true,
- org.eclipse.ui.views.contentoutline,
- org.eclipse.ui.views.properties; ui.views="split"; mandatory:="ui.views"
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.help;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui;bundle-version="[3.3.0,4.0.0)"
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/bundles/org.eclipse.ui.views/about.html b/bundles/org.eclipse.ui.views/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.ui.views/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.views/build.properties b/bundles/org.eclipse.ui.views/build.properties
deleted file mode 100644
index bbfa0a5..0000000
--- a/bundles/org.eclipse.ui.views/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               about.html,\
-               .,\
-               META-INF/
-src.includes = about.html
-source.. = src/
diff --git a/bundles/org.eclipse.ui.views/icons/full/dlcl16/defaults_ps.gif b/bundles/org.eclipse.ui.views/icons/full/dlcl16/defaults_ps.gif
deleted file mode 100644
index 641ba72..0000000
--- a/bundles/org.eclipse.ui.views/icons/full/dlcl16/defaults_ps.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.views/icons/full/dlcl16/filter_ps.gif b/bundles/org.eclipse.ui.views/icons/full/dlcl16/filter_ps.gif
deleted file mode 100644
index ba6d891..0000000
--- a/bundles/org.eclipse.ui.views/icons/full/dlcl16/filter_ps.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.views/icons/full/dlcl16/tree_mode.gif b/bundles/org.eclipse.ui.views/icons/full/dlcl16/tree_mode.gif
deleted file mode 100644
index 62bdbe2..0000000
--- a/bundles/org.eclipse.ui.views/icons/full/dlcl16/tree_mode.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.views/icons/full/elcl16/defaults_ps.gif b/bundles/org.eclipse.ui.views/icons/full/elcl16/defaults_ps.gif
deleted file mode 100644
index c064899..0000000
--- a/bundles/org.eclipse.ui.views/icons/full/elcl16/defaults_ps.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.views/icons/full/elcl16/filter_ps.gif b/bundles/org.eclipse.ui.views/icons/full/elcl16/filter_ps.gif
deleted file mode 100644
index 6fe6f0e..0000000
--- a/bundles/org.eclipse.ui.views/icons/full/elcl16/filter_ps.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.views/icons/full/elcl16/tree_mode.gif b/bundles/org.eclipse.ui.views/icons/full/elcl16/tree_mode.gif
deleted file mode 100644
index dda8bae..0000000
--- a/bundles/org.eclipse.ui.views/icons/full/elcl16/tree_mode.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.views/icons/full/eview16/outline_co.gif b/bundles/org.eclipse.ui.views/icons/full/eview16/outline_co.gif
deleted file mode 100644
index 0dc862c..0000000
--- a/bundles/org.eclipse.ui.views/icons/full/eview16/outline_co.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.views/icons/full/eview16/prop_ps.gif b/bundles/org.eclipse.ui.views/icons/full/eview16/prop_ps.gif
deleted file mode 100644
index d11c996..0000000
--- a/bundles/org.eclipse.ui.views/icons/full/eview16/prop_ps.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui.views/plugin.properties b/bundles/org.eclipse.ui.views/plugin.properties
deleted file mode 100644
index 0fae877..0000000
--- a/bundles/org.eclipse.ui.views/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName= Views
-providerName= Eclipse.org
-
-Views.PropertySheet = Properties
-Views.ContentOutline = Outline
-
diff --git a/bundles/org.eclipse.ui.views/plugin.xml b/bundles/org.eclipse.ui.views/plugin.xml
deleted file mode 100644
index 86d2559..0000000
--- a/bundles/org.eclipse.ui.views/plugin.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   
-     <extension
-         point="org.eclipse.ui.views">
-      <view
-            name="%Views.PropertySheet"
-            icon="$nl$/icons/full/eview16/prop_ps.gif"
-            category="org.eclipse.ui"
-            class="org.eclipse.ui.views.properties.PropertySheet"
-            id="org.eclipse.ui.views.PropertySheet">
-      </view>
-      <view
-            name="%Views.ContentOutline"
-            icon="$nl$/icons/full/eview16/outline_co.gif"
-            category="org.eclipse.ui"
-            class="org.eclipse.ui.views.contentoutline.ContentOutline"
-            id="org.eclipse.ui.views.ContentOutline">
-      </view>
-   </extension>
-   
-</plugin>
diff --git a/bundles/org.eclipse.ui.views/scripts/exportplugin.xml b/bundles/org.eclipse.ui.views/scripts/exportplugin.xml
deleted file mode 100644
index 5e71e54..0000000
--- a/bundles/org.eclipse.ui.views/scripts/exportplugin.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<project name="Eclipse Views" default="export" basedir="..">
-	<target name="init">
-		<tstamp/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="plugin"  value="org.eclipse.ui.views" />
-		<property name="version"  value="_2.1.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}/views.jar"
-			basedir="bin"
-		/>
-		<copy file="plugin.xml" todir="${dest}"/>
-		<copy file="plugin.properties" todir="${dest}"/>
-		<zip zipfile="${dest}/viewssrc.zip">
-		    <fileset dir="src" />
-		    <fileset dir="extensions" />
-  		</zip>				
-	</target>
-</project>
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/ViewsPlugin.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/ViewsPlugin.java
deleted file mode 100644
index e23b672..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/ViewsPlugin.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * The plug-in runtime class for the views UI plug-in (id <code>"org.eclipse.ui.views"</code>).
- * <p>
- * This class provides static methods and fields only; it is not intended to be
- * instantiated or subclassed by clients.
- * </p>
- * 
- * @since 2.1
- */
-public final class ViewsPlugin extends AbstractUIPlugin {
-    /**
-     * Views UI plug-in id (value <code>"org.eclipse.ui.views"</code>).
-     */
-    public static final String PLUGIN_ID = "org.eclipse.ui.views"; //$NON-NLS-1$
-	
-	private final static String ICONS_PATH = "$nl$/icons/full/";//$NON-NLS-1$
-
-    private static ViewsPlugin instance;
-
-    /**
-     * Returns the singleton instance.
-     * 
-     * @return the singleton instance.
-     */
-    public static ViewsPlugin getDefault() {
-        return instance;
-    }
-
-    /**
-     * Creates a new instance of the receiver.
-     * 
-     * @see org.eclipse.core.runtime.Plugin#Plugin()
-     */
-    public ViewsPlugin() {
-        super();
-        instance = this;
-    }
-	
-	/**
-	 * Get the workbench image with the given path relative to
-	 * ICON_PATH.
-	 * @param relativePath
-	 * @return ImageDescriptor
-	 */
-	public static ImageDescriptor getViewImageDescriptor(String relativePath){
-		return imageDescriptorFromPlugin(PLUGIN_ID, ICONS_PATH + relativePath);
-	}
-    
-    /**
-     * If it is possible to adapt the given object to the given type, this
-     * returns the adapter. Performs the following checks:
-     * 
-     * <ol>
-     * <li>Returns <code>sourceObject</code> if it is an instance of the
-     * adapter type.</li>
-     * <li>If sourceObject implements IAdaptable, it is queried for adapters.</li>
-     * <li>If sourceObject is not an instance of PlatformObject (which would have
-     * already done so), the adapter manager is queried for adapters</li>
-     * </ol>
-     * 
-     * Otherwise returns null.
-     * 
-     * @param sourceObject
-     *            object to adapt, or null
-     * @param adapter
-     *            type to adapt to
-     * @param activatePlugins 
-     *            true if IAdapterManager.loadAdapter should be used (may trigger plugin activation)
-     * @return a representation of sourceObject that is assignable to the
-     *         adapter type, or null if no such representation exists
-     */
-    public static Object getAdapter(Object sourceObject, Class adapter, boolean activatePlugins) {
-    	Assert.isNotNull(adapter);
-        if (sourceObject == null) {
-            return null;
-        }
-        if (adapter.isInstance(sourceObject)) {
-            return sourceObject;
-        }
-
-        if (sourceObject instanceof IAdaptable) {
-            IAdaptable adaptable = (IAdaptable) sourceObject;
-
-            Object result = adaptable.getAdapter(adapter);
-            if (result != null) {
-                // Sanity-check
-                Assert.isTrue(adapter.isInstance(result));
-                return result;
-            }
-        } 
-        
-        if (!(sourceObject instanceof PlatformObject)) {
-        	Object result;
-        	if (activatePlugins) {
-        		result = Platform.getAdapterManager().loadAdapter(sourceObject, adapter.getName());
-        	} else {
-        		result = Platform.getAdapterManager().getAdapter(sourceObject, adapter);
-        	}
-            if (result != null) {
-                return result;
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/contentoutline/ContentOutlineMessages.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/contentoutline/ContentOutlineMessages.java
deleted file mode 100644
index e038dcc..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/contentoutline/ContentOutlineMessages.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.contentoutline;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * ContentOutlineMessages is the message class for the messages used in the content outline.
- *
- */
-public class ContentOutlineMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.views.contentoutline.messages";//$NON-NLS-1$
-
-	// ==============================================================================
-	// Outline View
-	// ==============================================================================
-	/** */
-	public static String ContentOutline_noOutline;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, ContentOutlineMessages.class);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/contentoutline/messages.properties b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/contentoutline/messages.properties
deleted file mode 100644
index 2e229b9..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/contentoutline/messages.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2005  IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-# package: org.eclipse.ui.views.contentoutline
-
-
-# ==============================================================================
-# Outline View
-# ==============================================================================
-ContentOutline_noOutline = An outline is not available.
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/contentoutline/package.html b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/contentoutline/package.html
deleted file mode 100644
index 87324c3..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/contentoutline/package.html
+++ /dev/null
@@ -1,13 +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.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides the internal support for the Content Outline view.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/properties/PropertiesMessages.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/properties/PropertiesMessages.java
deleted file mode 100644
index 76a001c..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/properties/PropertiesMessages.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.views.properties;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- */
-public class PropertiesMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ui.internal.views.properties.messages";//$NON-NLS-1$
-
-	// package: org.eclipse.ui.views.properties
-
-	// ==============================================================================
-	// Properties View
-	// ==============================================================================
-
-	/** */
-	public static String Categories_text;
-	/** */
-	public static String Categories_toolTip;
-
-	/** */
-	public static String Columns_text;
-	/** */
-	public static String Columns_toolTip;
-	
-	/** */
-	public static String CopyProperty_text;
-
-	/** */
-	public static String Defaults_text;
-	/** */
-	public static String Defaults_toolTip;
-
-	/** */
-	public static String Filter_text;
-	/** */
-	public static String Filter_toolTip;
-
-	/** */
-	public static String PropertyViewer_property;
-	/** */
-	public static String PropertyViewer_value;
-	/** */
-	public static String PropertyViewer_misc;
-
-	/** */
-	public static String CopyToClipboardProblemDialog_title;
-	/** */
-	public static String CopyToClipboardProblemDialog_message;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, PropertiesMessages.class);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/properties/messages.properties b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/properties/messages.properties
deleted file mode 100644
index 7e54679..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/internal/views/properties/messages.properties
+++ /dev/null
@@ -1,37 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-# package: org.eclipse.ui.views.properties
-
-# ==============================================================================
-# Properties View
-# ==============================================================================
-
-Categories_text = Show &Categories
-Categories_toolTip = Show Categories
-
-Columns_text = Co&lumns...
-Columns_toolTip = Configure Columns
-
-CopyProperty_text = &Copy
-
-Defaults_text = &Restore Default Value
-Defaults_toolTip = Restore Default Value
-
-Filter_text = Show &Advanced Properties
-Filter_toolTip = Show Advanced Properties
-
-PropertyViewer_property = Property
-PropertyViewer_value = Value
-PropertyViewer_misc = Misc
-
-CopyToClipboardProblemDialog_title=Problem Copying to Clipboard
-CopyToClipboardProblemDialog_message=There was a problem when accessing the system clipboard. Retry?
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/contentoutline/ContentOutline.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/contentoutline/ContentOutline.java
deleted file mode 100644
index ec48552..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/contentoutline/ContentOutline.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.contentoutline;
-
-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.swt.widgets.Composite;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.views.ViewsPlugin;
-import org.eclipse.ui.internal.views.contentoutline.ContentOutlineMessages;
-import org.eclipse.ui.part.IContributedContentsView;
-import org.eclipse.ui.part.IPage;
-import org.eclipse.ui.part.IPageBookViewPage;
-import org.eclipse.ui.part.IPageSite;
-import org.eclipse.ui.part.MessagePage;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.part.PageBookView;
-
-/**
- * Main class for the Content Outline View.
- * <p>
- * This standard view has id <code>"org.eclipse.ui.views.ContentOutline"</code>.
- * </p>
- * When a <b>content outline view</b> notices an editor being activated, it 
- * asks the editor whether it has a <b>content outline page</b> to include
- * in the outline view. This is done using <code>getAdapter</code>:
- * <pre>
- * IEditorPart editor = ...;
- * IContentOutlinePage outlinePage = (IContentOutlinePage) editor.getAdapter(IContentOutlinePage.class);
- * if (outlinePage != null) {
- *    // editor wishes to contribute outlinePage to content outline view
- * }
- * </pre>
- * If the editor supports a content outline page, the editor instantiates
- * and configures the page, and returns it. This page is then added to the 
- * content outline view (a pagebook which presents one page at a time) and 
- * immediately made the current page (the content outline view need not be
- * visible). If the editor does not support a content outline page, the content
- * outline view shows a special default page which makes it clear to the user
- * that the content outline view is disengaged. A content outline page is free
- * to report selection events; the content outline view forwards these events 
- * along to interested parties. When the content outline view notices a
- * different editor being activated, it flips to the editor's corresponding
- * content outline page. When the content outline view notices an editor being
- * closed, it destroys the editor's corresponding content outline page.
- * </p>
- * <p>
- * The workbench will automatically instantiate this class when a Content
- * Outline view is needed for a workbench window. This class was not intended
- * to be instantiated or subclassed by clients.
- * </p>
- * @noinstantiate This class is not intended to be instantiated by clients.
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ContentOutline extends PageBookView implements ISelectionProvider,
-        ISelectionChangedListener {
-
-
-
-    /**
-     * The plugin prefix.
-     */
-    public static final String PREFIX = PlatformUI.PLUGIN_ID + "."; //$NON-NLS-1$
-
-    /**
-     * Help context id used for the content outline view
-     * (value <code>"org.eclipse.ui.content_outline_context"</code>).
-     */
-    public static final String CONTENT_OUTLINE_VIEW_HELP_CONTEXT_ID = PREFIX
-            + "content_outline_context";//$NON-NLS-1$
-
-    /**
-     * Message to show on the default page.
-     */
-    private String defaultText =ContentOutlineMessages.ContentOutline_noOutline; 
-
-    /**
-     * Creates a content outline view with no content outline pages.
-     */
-    public ContentOutline() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ISelectionProvider.
-     */
-    public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        getSelectionProvider().addSelectionChangedListener(listener);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on PageBookView.
-     */
-    protected IPage createDefaultPage(PageBook book) {
-        MessagePage page = new MessagePage();
-        initPage(page);
-        page.createControl(book);
-        page.setMessage(defaultText);
-        return page;
-    }
-
-    /**
-     * The <code>PageBookView</code> implementation of this <code>IWorkbenchPart</code>
-     * method creates a <code>PageBook</code> control with its default page showing.
-     */
-    public void createPartControl(Composite parent) {
-        super.createPartControl(parent);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(getPageBook(),
-                CONTENT_OUTLINE_VIEW_HELP_CONTEXT_ID);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on PageBookView.
-     */
-    protected PageRec doCreatePage(IWorkbenchPart part) {
-        // Try to get an outline page.
-        Object obj = ViewsPlugin.getAdapter(part, IContentOutlinePage.class, false);
-        if (obj instanceof IContentOutlinePage) {
-            IContentOutlinePage page = (IContentOutlinePage) obj;
-            if (page instanceof IPageBookViewPage) {
-				initPage((IPageBookViewPage) page);
-			}
-            page.createControl(getPageBook());
-            return new PageRec(part, page);
-        }
-        // There is no content outline
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on PageBookView.
-     */
-    protected void doDestroyPage(IWorkbenchPart part, PageRec rec) {
-        IContentOutlinePage page = (IContentOutlinePage) rec.page;
-        page.dispose();
-        rec.dispose();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IAdaptable.
-     */
-    public Object getAdapter(Class key) {
-        if (key == IContributedContentsView.class) {
-			return new IContributedContentsView() {
-                public IWorkbenchPart getContributingPart() {
-                    return getContributingEditor();
-                }
-            };
-		}
-        return super.getAdapter(key);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on PageBookView.
-     */
-    protected IWorkbenchPart getBootstrapPart() {
-        IWorkbenchPage page = getSite().getPage();
-        if (page != null) {
-			return page.getActiveEditor();
-		}
-
-        return null;
-    }
-
-    /**
-     * Returns the editor which contributed the current 
-     * page to this view.
-     *
-     * @return the editor which contributed the current page
-     * or <code>null</code> if no editor contributed the current page
-     */
-    private IWorkbenchPart getContributingEditor() {
-        return getCurrentContributingPart();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ISelectionProvider.
-     */
-    public ISelection getSelection() {
-        // get the selection from the selection provider
-        return getSelectionProvider().getSelection();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on PageBookView.
-     * We only want to track editors.
-     */
-    protected boolean isImportant(IWorkbenchPart part) {
-        //We only care about editors
-        return (part instanceof IEditorPart);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IViewPart.
-     * Treat this the same as part activation.
-     */
-    public void partBroughtToTop(IWorkbenchPart part) {
-        partActivated(part);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ISelectionProvider.
-     */
-    public void removeSelectionChangedListener(
-            ISelectionChangedListener listener) {
-        getSelectionProvider().removeSelectionChangedListener(listener);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ISelectionChangedListener.
-     */
-    public void selectionChanged(SelectionChangedEvent event) {
-        getSelectionProvider().selectionChanged(event);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ISelectionProvider.
-     */
-    public void setSelection(ISelection selection) {
-        getSelectionProvider().setSelection(selection);
-    }
-
-    /**
-     * The <code>ContentOutline</code> implementation of this <code>PageBookView</code> method
-     * extends the behavior of its parent to use the current page as a selection provider.
-     * 
-     * @param pageRec the page record containing the page to show
-     */
-    protected void showPageRec(PageRec pageRec) {
-        IPageSite pageSite = getPageSite(pageRec.page);
-        ISelectionProvider provider = pageSite.getSelectionProvider();
-        if (provider == null && (pageRec.page instanceof IContentOutlinePage)) {
-			// This means that the page did not set a provider during its initialization 
-            // so for backward compatibility we will set the page itself as the provider.
-            pageSite.setSelectionProvider((IContentOutlinePage) pageRec.page);
-		}
-        super.showPageRec(pageRec);
-    }
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/contentoutline/ContentOutlinePage.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/contentoutline/ContentOutlinePage.java
deleted file mode 100644
index 5bf036c..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/contentoutline/ContentOutlinePage.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.contentoutline;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.part.IPageSite;
-import org.eclipse.ui.part.Page;
-
-/**
- * An abstract base class for content outline pages.
- * <p>
- * Clients who are defining an editor may elect to provide a corresponding
- * content outline page. This content outline page will be presented to the
- * user via the standard Content Outline View (the user decides whether their
- * workbench window contains this view) whenever that editor is active.
- * This class should be subclassed.
- * </p>
- * <p>
- * Internally, each content outline page consists of a standard tree viewer; 
- * selections made in the tree viewer are reported as selection change events 
- * by the page (which is a selection provider). The tree viewer is not created 
- * until <code>createPage</code> is called; consequently, subclasses must extend
- * <code>createControl</code> to configure the tree viewer with a proper content 
- * provider, label provider, and input element.
- * </p>
- * <p>
- * Note that those wanting to use a control other than internally created
- * <code>TreeViewer</code> will need to implement 
- * <code>IContentOutlinePage</code> directly rather than subclassing this class.
- * </p> 
- */
-public abstract class ContentOutlinePage extends Page implements
-        IContentOutlinePage, ISelectionChangedListener {
-    private ListenerList selectionChangedListeners = new ListenerList();
-
-    private TreeViewer treeViewer;
-
-    /**
-     * Create a new content outline page.
-     */
-    protected ContentOutlinePage() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ISelectionProvider.
-     */
-    public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        selectionChangedListeners.add(listener);
-    }
-
-    /**
-     * The <code>ContentOutlinePage</code> implementation of this 
-     * <code>IContentOutlinePage</code> method creates a tree viewer. Subclasses
-     * must extend this method configure the tree viewer with a proper content 
-     * provider, label provider, and input element.
-     * @param parent
-     */
-    public void createControl(Composite parent) {
-        treeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL
-                | SWT.V_SCROLL);
-        treeViewer.addSelectionChangedListener(this);
-    }
-
-    /**
-     * Fires a selection changed event.
-     *
-     * @param selection the new selection
-     */
-    protected void fireSelectionChanged(ISelection selection) {
-        // create an event
-        final SelectionChangedEvent event = new SelectionChangedEvent(this,
-                selection);
-
-        // fire the event
-        Object[] listeners = selectionChangedListeners.getListeners();
-        for (int i = 0; i < listeners.length; ++i) {
-            final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
-            SafeRunner.run(new SafeRunnable() {
-                public void run() {
-                    l.selectionChanged(event);
-                }
-            });
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPage (and Page).
-     */
-    public Control getControl() {
-        if (treeViewer == null) {
-			return null;
-		}
-        return treeViewer.getControl();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ISelectionProvider.
-     */
-    public ISelection getSelection() {
-        if (treeViewer == null) {
-			return StructuredSelection.EMPTY;
-		}
-        return treeViewer.getSelection();
-    }
-
-    /**
-     * Returns this page's tree viewer.
-     *
-     * @return this page's tree viewer, or <code>null</code> if 
-     *   <code>createControl</code> has not been called yet
-     */
-    protected TreeViewer getTreeViewer() {
-        return treeViewer;
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.part.IPageBookViewPage#init(org.eclipse.ui.part.IPageSite)
-     */
-    public void init(IPageSite pageSite) {
-        super.init(pageSite);
-        pageSite.setSelectionProvider(this);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ISelectionProvider.
-     */
-    public void removeSelectionChangedListener(
-            ISelectionChangedListener listener) {
-        selectionChangedListeners.remove(listener);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ISelectionChangeListener.
-     * Gives notification that the tree selection has changed.
-     */
-    public void selectionChanged(SelectionChangedEvent event) {
-        fireSelectionChanged(event.getSelection());
-    }
-
-    /**
-     * Sets focus to a part in the page.
-     */
-    public void setFocus() {
-        treeViewer.getControl().setFocus();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ISelectionProvider.
-     */
-    public void setSelection(ISelection selection) {
-        if (treeViewer != null) {
-			treeViewer.setSelection(selection);
-		}
-    }
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/contentoutline/IContentOutlinePage.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/contentoutline/IContentOutlinePage.java
deleted file mode 100644
index 6893210..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/contentoutline/IContentOutlinePage.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.contentoutline;
-
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.ui.part.IPage;
-
-/**
- * Marker-style interface for a content outline page. This interface defines
- * the minimum requirement for pages within the content outline view, namely
- * they must be pages (implement <code>IPage</code>) and provide selections
- * (implement <code>ISelectionProvider</code>).
- * <p>
- * Access to a content outline page begins when an editor is activated. When
- * activation occurs, the content outline view will ask the editor for its
- * content outline page. This is done by invoking 
- * <code>getAdapter(IContentOutlinePage.class)</code> on the editor.  
- * If the editor returns a page, the view then creates the controls for that
- * page (using <code>createControl</code>) and makes the page visible.
- * </p>
- * <p>
- * Clients may implement this interface from scratch, or subclass the
- * abstract base class <code>ContentOutlinePage</code>.
- * </p>
- * <p> 
- * Note that this interface extends <code>ISelectionProvider</code>.
- * This is no longer required in the case of implementors who also 
- * implement <code>IPageBookViewPage</code> (or extend <code>Page</code>)
- * as they are now passed an <code>IPageSite</code> during their initialization 
- * and this site can be configured with a selection provider. 
- * However to avoid a breaking change 
- *  1) this interface will continue to extend ISelectionProvider 
- *  2) if an IContentOutlinePage does not set a selection provider for its 
- * site, the ContentOutline will continue to use the page itself for 
- * this purpose. 
- * </p> 
- *
- * @see ContentOutlinePage
- */
-public interface IContentOutlinePage extends IPage, ISelectionProvider {
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/contentoutline/package.html b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/contentoutline/package.html
deleted file mode 100644
index 70d2165..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/contentoutline/package.html
+++ /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="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides the standard Content Outline view which can
-show the active editor's custom outline for the document being edited.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/CategoriesAction.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/CategoriesAction.java
deleted file mode 100644
index 6e949e3..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/CategoriesAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This action hides or shows categories in the <code>PropertySheetViewer</code>.
- */
-/*package*/class CategoriesAction extends PropertySheetAction {
-    /**
-     * Creates the Categories action. This action is used to show
-     * or hide categories properties.
-     * @param viewer the viewer
-     * @param name the name
-     */
-    public CategoriesAction(PropertySheetViewer viewer, String name) {
-        super(viewer, name);
-        PlatformUI.getWorkbench().getHelpSystem()
-                .setHelp(this, IPropertiesHelpContextIds.CATEGORIES_ACTION);
-    }
-
-    /**
-     * Toggles the display of categories for the properties.
-     */
-    public void run() {
-        PropertySheetViewer ps = getPropertySheet();
-        ps.deactivateCellEditor();
-        if (isChecked()) {
-            ps.showCategories();
-        } else {
-            ps.hideCategories();
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/ColorPropertyDescriptor.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/ColorPropertyDescriptor.java
deleted file mode 100644
index 4d001c7..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/ColorPropertyDescriptor.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColorCellEditor;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Descriptor for a property that has a color value which should be edited
- * with a color cell editor.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * <p>
- * Example:
- * <pre>
- * IPropertyDescriptor pd = new ColorPropertyDescriptor("fg", "Foreground Color");
- * </pre>
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ColorPropertyDescriptor extends PropertyDescriptor {
-    /**
-     * Creates an property descriptor with the given id and display name.
-     * 
-     * @param id the id of the property
-     * @param displayName the name to display for the property
-     */
-    public ColorPropertyDescriptor(Object id, String displayName) {
-        super(id, displayName);
-    }
-
-    /**
-     * The <code>ColorPropertyDescriptor</code> implementation of this 
-     * <code>IPropertyDescriptor</code> method creates and returns a new
-     * <code>ColorCellEditor</code>.
-     * <p>
-     * The editor is configured with the current validator if there is one.
-     * </p>
-     */
-    public CellEditor createPropertyEditor(Composite parent) {
-        CellEditor editor = new ColorCellEditor(parent);
-        if (getValidator() != null) {
-			editor.setValidator(getValidator());
-		}
-        return editor;
-    }
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/ComboBoxLabelProvider.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/ComboBoxLabelProvider.java
deleted file mode 100644
index ff41832..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/ComboBoxLabelProvider.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.jface.viewers.LabelProvider;
-
-/**
- * An <code>ILabelProvider</code> that assists in rendering labels for 
- * <code>ComboBoxPropertyDescriptors</code>.  The label for a given 
- * <code>Integer</code> value is the <code>String</code> at the value in 
- * the provided values array.  
- * 
- * @since 3.0
- */
-public class ComboBoxLabelProvider extends LabelProvider {
-
-    /**
-     * The array of String labels.
-     */
-    private String[] values;
-
-    /**
-     * @param values the possible label values that this 
-     * <code>ILabelProvider</code> may return.
-     */
-    public ComboBoxLabelProvider(String[] values) {
-        this.values = values;
-    }
-
-    /**
-     * @return the possible label values that this 
-     * <code>ILabelProvider</code> may return.
-     */
-    public String[] getValues() {
-        return values;
-    }
-
-    /**
-     * @param values the possible label values that this 
-     * <code>ILabelProvider</code> may return.
-     */
-    public void setValues(String[] values) {
-        this.values = values;
-    }
-
-    /**
-     * Returns the <code>String</code> that maps to the given 
-     * <code>Integer</code> offset in the values array.
-     * 
-     * @param element an <code>Integer</code> object whose value is a valid 
-     * location within the values array of the receiver
-     * @return a <code>String</code> from the provided values array, or the 
-     * empty <code>String</code> 
-     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-     */
-    public String getText(Object element) {
-        if (element == null) {
-            return ""; //$NON-NLS-1$
-        }
-
-        if (element instanceof Integer) {
-            int index = ((Integer) element).intValue();
-            if (index >= 0 && index < values.length) {
-                return values[index];
-            }
-			return ""; //$NON-NLS-1$
-        }
-
-        return ""; //$NON-NLS-1$
-    }
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/ComboBoxPropertyDescriptor.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/ComboBoxPropertyDescriptor.java
deleted file mode 100644
index c431968..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/ComboBoxPropertyDescriptor.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Descriptor for a property that has a value which should be edited
- * with a combo box cell editor.  This class provides a default 
- * <code>ILabelProvider</code> that will render the label of the given 
- * descriptor as the <code>String</code> found in the labels array at the 
- * currently selected index.
- * <p>
- * The value of the property is a 0-based <code>Integer</code> index into
- * the labels array. 
- * </p>
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * <p>
- * Example:
- * <pre>
- * String[] values = {"Top left", "Top right", "Bottom left", "Bottom right"};
- * IPropertyDescriptor pd = new ComboBoxPropertyDescriptor("origin", "Origin", values);
- * </pre>
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class ComboBoxPropertyDescriptor extends PropertyDescriptor {
-
-    /**
-     * The labels to display in the combo box
-     */
-    private String[] labels;
-
-    /**
-     * Creates an property descriptor with the given id, display name, and list
-     * of value labels to display in the combo box cell editor.
-     * 
-     * @param id the id of the property
-     * @param displayName the name to display for the property
-     * @param labelsArray the labels to display in the combo box
-     */
-    public ComboBoxPropertyDescriptor(Object id, String displayName,
-            String[] labelsArray) {
-        super(id, displayName);
-        labels = labelsArray;
-    }
-
-    /**
-     * The <code>ComboBoxPropertyDescriptor</code> implementation of this 
-     * <code>IPropertyDescriptor</code> method creates and returns a new
-     * <code>ComboBoxCellEditor</code>.
-     * <p>
-     * The editor is configured with the current validator if there is one.
-     * </p>
-     */
-    public CellEditor createPropertyEditor(Composite parent) {
-        CellEditor editor = new ComboBoxCellEditor(parent, labels,
-                SWT.READ_ONLY);
-        if (getValidator() != null) {
-			editor.setValidator(getValidator());
-		}
-        return editor;
-    }
-
-    /**
-     * The <code>ComboBoxPropertyDescriptor</code> implementation of this 
-     * <code>IPropertyDescriptor</code> method returns the value set by
-     * the <code>setProvider</code> method or, if no value has been set
-     * it returns a <code>ComboBoxLabelProvider</code> created from the 
-     * valuesArray of this <code>ComboBoxPropertyDescriptor</code>.
-     *
-     * @see #setLabelProvider(ILabelProvider)
-     */
-    public ILabelProvider getLabelProvider() {
-        if (isLabelProviderSet()) {
-			return super.getLabelProvider();
-		}
-		return new ComboBoxLabelProvider(labels);
-    }
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/CopyPropertyAction.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/CopyPropertyAction.java
deleted file mode 100644
index c851042..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/CopyPropertyAction.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-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.PlatformUI;
-import org.eclipse.ui.internal.views.properties.PropertiesMessages;
-
-/**
- * Copies a property to the clipboard.
- */
-/*package*/class CopyPropertyAction extends PropertySheetAction {
-    /**
-     * System clipboard
-     */
-    private Clipboard clipboard;
-
-    /**
-     * Creates the action.
-     * 
-     * @param viewer the viewer
-     * @param name the name
-     * @param clipboard the clipboard
-     */
-    public CopyPropertyAction(PropertySheetViewer viewer, String name,
-            Clipboard clipboard) {
-        super(viewer, name);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-                IPropertiesHelpContextIds.COPY_PROPERTY_ACTION);
-        this.clipboard = clipboard;
-    }
-
-    /**
-     * Performs this action.
-     */
-    public void run() {
-        // Get the selected property
-        IStructuredSelection selection = (IStructuredSelection) getPropertySheet()
-                .getSelection();
-        if (selection.isEmpty()) {
-			return;
-		}
-        // Assume single selection
-        IPropertySheetEntry entry = (IPropertySheetEntry) selection
-                .getFirstElement();
-
-        // Place text on the clipboard
-        StringBuffer buffer = new StringBuffer();
-        buffer.append(entry.getDisplayName());
-        buffer.append("\t"); //$NON-NLS-1$
-        buffer.append(entry.getValueAsString());
-
-        setClipboard(buffer.toString());
-    }
-
-    /** 
-     * Updates enablement based on the current selection.
-     * 
-     * @param sel the selection
-     */
-    public void selectionChanged(IStructuredSelection sel) {
-        setEnabled(!sel.isEmpty());
-    }
-
-    private void setClipboard(String text) {
-        try {
-            Object[] data = new Object[] { text };
-            Transfer[] transferTypes = new Transfer[] { TextTransfer
-                    .getInstance() };
-            clipboard.setContents(data, transferTypes);
-        } catch (SWTError e) {
-            if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD) {
-				throw e;
-			}
-            if (MessageDialog.openQuestion(getPropertySheet().getControl()
-                    .getShell(), PropertiesMessages.CopyToClipboardProblemDialog_title,
-                    PropertiesMessages.CopyToClipboardProblemDialog_message)) {
-				setClipboard(text);
-			}
-        }
-    }
-}
-
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/DefaultsAction.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/DefaultsAction.java
deleted file mode 100644
index f14cc19..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/DefaultsAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This action resets the <code>PropertySheetViewer</code> values back
- * to the default values.
- *
- * [Issue: should listen for selection changes in the viewer and set enablement]
- */
-/*package*/class DefaultsAction extends PropertySheetAction {
-    /**
-     * Create the Defaults action. This action is used to set
-     * the properties back to their default values.
-     * 
-     * @param viewer the viewer
-     * @param name the name
-     */
-    public DefaultsAction(PropertySheetViewer viewer, String name) {
-        super(viewer, name);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IPropertiesHelpContextIds.DEFAULTS_ACTION);
-    }
-
-    /**
-     * Reset the properties to their default values.
-     */
-    public void run() {
-        getPropertySheet().deactivateCellEditor();
-        getPropertySheet().resetProperties();
-    }
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/FilterAction.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/FilterAction.java
deleted file mode 100644
index e9c344d..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/FilterAction.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This action hides or shows expert properties in the <code>PropertySheetViewer</code>.
- */
-/*package*/class FilterAction extends PropertySheetAction {
-    /**
-     * Create the Filter action. This action is used to show
-     * or hide expert properties.
-     * 
-     * @param viewer the viewer
-     * @param name the name
-     */
-    public FilterAction(PropertySheetViewer viewer, String name) {
-        super(viewer, name);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(this,
-				IPropertiesHelpContextIds.FILTER_ACTION);
-    }
-
-    /**
-     * Toggle the display of expert properties.
-     */
-
-    public void run() {
-        PropertySheetViewer ps = getPropertySheet();
-        ps.deactivateCellEditor();
-        if (isChecked()) {
-            ps.showExpert();
-        } else {
-            ps.hideExpert();
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/ICellEditorActivationListener.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/ICellEditorActivationListener.java
deleted file mode 100644
index fffb571..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/ICellEditorActivationListener.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.jface.viewers.CellEditor;
-
-/**
- * A listener which is notified when a cell editor is 
- * activated/deactivated
- */
-/*package*/interface ICellEditorActivationListener {
-    /**
-     * Notifies that the cell editor has been activated
-     *
-     * @param cellEditor the cell editor which has been activated
-     */
-    public void cellEditorActivated(CellEditor cellEditor);
-
-    /**
-     * Notifies that the cell editor has been deactivated
-     *
-     * @param cellEditor the cell editor which has been deactivated
-     */
-    public void cellEditorDeactivated(CellEditor cellEditor);
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertiesHelpContextIds.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertiesHelpContextIds.java
deleted file mode 100644
index 7d3e4c0..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertiesHelpContextIds.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Help context ids for the properties view.
- * <p>
- * This interface contains constants only; it is not intended to be implemented
- * or extended.
- * </p>
- * 
- */
-/*package*/interface IPropertiesHelpContextIds {
-    public static final String PREFIX = PlatformUI.PLUGIN_ID + "."; //$NON-NLS-1$
-
-    // Actions
-    public static final String CATEGORIES_ACTION = PREFIX
-            + "properties_categories_action_context"; //$NON-NLS-1$
-
-    public static final String DEFAULTS_ACTION = PREFIX
-            + "properties_defaults_action_context"; //$NON-NLS-1$
-
-    public static final String FILTER_ACTION = PREFIX
-            + "properties_filter_action_context"; //$NON-NLS-1$
-
-    public static final String COPY_PROPERTY_ACTION = PREFIX
-            + "properties_copy_action_context"; //$NON-NLS-1$
-
-    // Views
-    public static final String PROPERTY_SHEET_VIEW = PREFIX
-            + "property_sheet_view_context"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertyDescriptor.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertyDescriptor.java
deleted file mode 100644
index 40d7c9b..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertyDescriptor.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A descriptor for a property to be presented by a standard property sheet page
- * (<code>PropertySheetPage</code>). These descriptors originate with property 
- * sources (<code>IPropertySource</code>).
- * <p>
- * A property descriptor carries the following information:
- * <ul>
- *   <li>property id (required)</li>
- *   <li>display name (required)</li>
- *   <li>brief description of the property (optional)</li>
- *   <li>category for grouping related properties (optional)</li>
- *   <li>label provider used to display the property value (optional)</li>
- *   <li>cell editor for changing the property value (optional)</li>
- *   <li>help context id (optional)</li>
- * </ul>
- * </p>
- * <p>
- * Clients may implement this interface to provide specialized property 
- * descriptors; however, there are standard implementations declared in
- * this package that take care of the most common cases:
- * <ul>
- *   <li><code>PropertyDescriptor - read-only property</li>
- *   <li><code>TextPropertyDescriptor</code> - edits with a 
- *      <code>TextCellEditor</code></li>
- *   <li><code>CheckboxPropertyDescriptor - edits with a 
- *      <code>CheckboxCellEditor</code></code></li>
- *   <li><code>ComboBoxPropertyDescriptor - edits with a
- *      <code>ComboBoxCellEditor</code></code></li>
- *   <li><code>ColorPropertyDescriptor - edits with a 
- *      <code>ColorCellEditor</code></code></li>
- * </ul>
- * </p>
- *
- * @see IPropertySource#getPropertyDescriptors
- */
-public interface IPropertyDescriptor {
-    /**
-     * Creates and returns a new cell editor for editing this property. Returns 
-     * <code>null</code> if the property is not editable.
-     *
-     * @param parent the parent widget for the cell editor
-     * @return the cell editor for this property, or <code>null</code> if this
-     *  property cannot be edited
-     */
-    public CellEditor createPropertyEditor(Composite parent);
-
-    /**
-     * Returns the name of the category to which this property belongs. Properties
-     * belonging to the same category are grouped together visually. This localized 
-     * string is shown to the user
-     * 
-     * @return the category name, or <code>null</code> if the default category is to
-     *   be used
-     */
-    public String getCategory();
-
-    /**
-     * Returns a brief description of this property. This localized string is shown 
-     * to the user when this property is selected.
-     * 
-     * @return a brief description, or <code>null</code> if none
-     */
-    public String getDescription();
-
-    /**
-     * Returns the display name for this property. This localized string is shown to
-     * the user as the name of this property.
-     * 
-     * @return a displayable name
-     */
-    public String getDisplayName();
-
-    /**
-     * Returns a list of filter types to which this property belongs.
-     * The user is able to toggle the filters to show/hide properties belonging to
-     * a filter type.
-     * <p>
-     * Valid values for these flags are declared as constants on 
-     *  <code>IPropertySheetEntry</code>
-     * </p> 
-     * @return a list of filter types to which this property belongs, or
-     *   <code>null</code> if none
-     */
-    public String[] getFilterFlags();
-
-    /**
-     * Returns the help context id for this property or 
-     * <code>null</code> if this property has no help context id.
-     * <p>
-     * NOTE: Help support system API's changed since 2.0 and arrays
-     * of contexts are no longer supported.
-     * </p>
-     * <p>
-     * Thus the only valid non-<code>null</code> return type for this method
-     * is a <code>String</code> representing a context id. The previously
-     * valid return types are deprecated. The plural name for this method
-     * is unfortunate.
-     * </p>
-     * 
-     * @return the help context id for this entry
-     */
-    public Object getHelpContextIds();
-
-    /**
-     * Returns the id for this property. This object is
-     * used internally to distinguish one property descriptor 
-     * from another.
-     *
-     * @return the property id
-     */
-    public Object getId();
-
-    /**
-     * Returns the label provider for this property. The label provider is used
-     * to obtain the text (and possible image) for displaying the <it>value</it>
-     * of this property.
-     *
-     * @return the label provider used to display this property
-     */
-    public ILabelProvider getLabelProvider();
-
-    /**
-     * Returns whether this property descriptor and the given one are compatible.
-     * <p>
-     * The property sheet uses this method during multiple selection to determine
-     * whether two property descriptors with the same id are in fact the same 
-     * property and can be displayed as a single entry in the property sheet.
-     * </p>
-     *
-     * @param anotherProperty the other property descriptor 
-     * @return <code>true</code> if the property descriptors are compatible, and 
-     *   <code>false</code> otherwise
-     */
-    public boolean isCompatibleWith(IPropertyDescriptor anotherProperty);
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySheetEntry.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySheetEntry.java
deleted file mode 100644
index 9d67f17..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySheetEntry.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * <code>IPropertySheetEntry</code> describes the model interface for the
- * property sheet.
- * <p>
- * May be implemented when supplying a custom root entry to a property page.
- * </p>
- */
-public interface IPropertySheetEntry {
-
-    /**
-     * The filter id for expert properties
-     */
-    public String FILTER_ID_EXPERT = "org.eclipse.ui.views.properties.expert"; //$NON-NLS-1$
-
-    /**
-     * Adds the given listener to this entry's collection of listeners.
-     * 
-     * @param listener
-     *            the listener to add
-     */
-    public void addPropertySheetEntryListener(
-            IPropertySheetEntryListener listener);
-
-    /**
-     * Apply the current cell editor value.
-     */
-    public void applyEditorValue();
-
-    /**
-     * Called when the entry is no longer needed
-     */
-    public void dispose();
-
-    /**
-     * Returns the entry's category.
-     * 
-     * @return the entry's category
-     */
-    public String getCategory();
-
-    /**
-     * Returns the child entries for this entry.
-     * 
-     * @return the child entries for this entry
-     */
-    public IPropertySheetEntry[] getChildEntries();
-
-    /**
-     * Return a short description of the property sheet entry. Typically this
-     * description is shown in a status line when the entry is selected.
-     * 
-     * @return the entry's description
-     */
-    public String getDescription();
-
-    /**
-     * Returns the name used to display the property.
-     * 
-     * @return the name used to display the property
-     */
-    public String getDisplayName();
-
-    /**
-     * Return the <code>CellEditor</code> used to edit the property.
-     * 
-     * @param parent
-     *            the parent widget for the editor
-     * @return the <code>CellEditor</code> used to edit the property
-     */
-    CellEditor getEditor(Composite parent);
-
-    /**
-     * Returns the error text to display if the value is invalid.
-     * 
-     * @return the error text to display when the value is invalid or
-     *         <code>null</code>
-     */
-    public String getErrorText();
-
-    /**
-     * Return the filter ids used to group entries into levels such as Expert.
-     * Valid values are defined as constants on this interface.
-     * 
-     * @return the filter ids used to group entries into levels such as Expert.
-     */
-    public String[] getFilters();
-
-    /**
-     * Returns the help context id for this entry, or <code>null</code> if
-     * this entry has no help context id.
-     * <p>
-     * NOTE: Help support system API's changed since 2.0 and arrays of contexts
-     * are no longer supported.
-     * </p>
-     * <p>
-     * Thus the only valid non- <code>null</code> return type for this method
-     * is a <code>String</code> representing a context id. The previously
-     * valid return types are deprecated. The plural name for this method is
-     * unfortunate.
-     * </p>
-     * 
-     * @return the help context id for this entry
-     */
-    public Object getHelpContextIds();
-
-    /**
-     * Returns the image for the property value, if there is one. This image is
-     * managed by the entry it came from. Callers of this method must never
-     * dispose the returned image.
-     * 
-     * @return the image for this property value or <code>null</code>
-     */
-    public Image getImage();
-
-    /**
-     * Returns the value of the objects expressed as a String.
-     * 
-     * @return the value of the objects expressed as a String
-     */
-    public String getValueAsString();
-
-    /**
-     * Returns <code>true</code> if the entry has children.
-     * 
-     * @return <code>true</code> if the entry has children
-     */
-    public boolean hasChildEntries();
-
-    /**
-     * Removes the given listener from this entry's collection of listeners.
-     * 
-     * @param listener
-     *            the listener to remove
-     */
-    public void removePropertySheetEntryListener(
-            IPropertySheetEntryListener listener);
-
-    /**
-     * Resets the property value to its default value if it has been changed.
-     * <p>
-     * Does nothing if the notion of a default value is not meaningful for 
-     * the property.
-     * </p>
-     */
-    void resetPropertyValue();
-
-    /**
-     * Sets the objects which represent the property values for this entry. In
-     * the case of the root entry these objects are the input to the viewer.
-     * 
-     * @param values the values for this entry
-     */
-    public void setValues(Object[] values);
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySheetEntryListener.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySheetEntryListener.java
deleted file mode 100644
index 12b79d2..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySheetEntryListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-/**
- * Listener for changes in objects of type 
- * <code>IPropertySheetEntry</code>.
- * <p>
- * This interface is public since it appears in the api
- * of <code>IPropertySheetEntry</code>.  It is not intended
- * to be implemented outside of this package.
- * <p>
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IPropertySheetEntryListener {
-    /**
-     * A node's children have changed (children added or removed) 
-     *
-     * @param node the node whose's children have changed
-     */
-    void childEntriesChanged(IPropertySheetEntry node);
-
-    /**
-     * A entry's error message has changed
-     *
-     * @param entry the entry whose's error message has changed
-     */
-    void errorMessageChanged(IPropertySheetEntry entry);
-
-    /**
-     * A entry's value has changed 
-     *
-     * @param entry the entry whose's value has changed
-     */
-    void valueChanged(IPropertySheetEntry entry);
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySheetPage.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySheetPage.java
deleted file mode 100644
index f43126a..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySheetPage.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.part.IPage;
-
-/**
- * Interface for a property sheet page that appears in a property sheet view.
- * This interface defines the minimum requirement for pages within the
- * property sheet view, namely they must be pages (implement <code>IPage</code>)
- * be prepared to contribute actions to the property sheet view's tool bar
- * and status line, and listen for selection changes in the active part.
- * <p>
- * Clients may implement this interface from scratch if the property sheet
- * viewer's default page is unsuitable for displaying a part's properties.
- * </p>
- *
- * @see PropertySheetPage
- */
-public interface IPropertySheetPage extends IPage, ISelectionListener {
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySource.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySource.java
deleted file mode 100644
index 0bbf203..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySource.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Gunnar Wagenknecht - fix for bug 21756 (https://bugs.eclipse.org/bugs/show_bug.cgi?id=21756)
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-/**
- * Interface to an object which is capable of supplying properties for display
- * by the standard property sheet page implementation (<code>PropertySheetPage</code>).
- * <p>
- * This interface should be implemented by clients.
- * <code>PropertySheetPage</code> discovers the properties to display from
- * currently selected elements. Elements that implement
- * <code>IPropertySource</code> directly are included, as are elements that
- * implement <code>IAdaptable</code> and have an <code>IPropertySource</code>
- * adapter. Clients should implement this interface for any newly-defined
- * elements that are to have properties displayable by
- * <code>PropertySheetPage</code>. Note that in the latter case, the client
- * will also need to register a suitable adapter factory with the platform's
- * adapter manager (<code>Platform.getAdapterManager</code>).
- * </p>
- * 
- * @see org.eclipse.core.runtime.IAdaptable
- * @see org.eclipse.core.runtime.Platform#getAdapterManager()
- * @see org.eclipse.ui.views.properties.PropertySheetPage
- * @see org.eclipse.ui.views.properties.IPropertySource2
- */
-public interface IPropertySource {
-
-	/**
-	 * Returns a value for this property source that can be edited in a property
-	 * sheet.
-	 * <p>
-	 * This value is used when this <code>IPropertySource</code> is appearing
-	 * in the property sheet as the value of a property of some other
-	 * <code>IPropertySource</code>
-	 * </p>
-	 * <p>
-	 * This value is passed as the input to a cell editor opening on an
-	 * <code>IPropertySource</code>.
-	 * </p>
-	 * <p>
-	 * This value is also used when an <code>IPropertySource</code> is being
-	 * used as the value in a <code>setPropertyValue</code> message. The
-	 * reciever of the message would then typically use the editable value to
-	 * update the original property source or construct a new instance.
-	 * </p>
-	 * <p>
-	 * For example an email address which is a property source may have an
-	 * editable value which is a string so that it can be edited in a text cell
-	 * editor. The email address would also have a constructor or setter that
-	 * takes the edited string so that an appropriate instance can be created or
-	 * the original instance modified when the edited value is set.
-	 * </p>
-	 * <p>
-	 * This behavior is important for another reason. When the property sheet is
-	 * showing properties for more than one object (multiple selection), a
-	 * property sheet entry will display and edit a single value (typically
-	 * coming from the first selected object). After a property has been edited
-	 * in a cell editor, the same value is set as the property value for all of
-	 * the objects. This is fine for primitive types but otherwise all of the
-	 * objects end up with a reference to the same value. Thus by creating an
-	 * editable value and using it to update the state of the original property
-	 * source object, one is able to edit several property source objects at
-	 * once (multiple selection).
-	 * 
-	 * @return a value that can be edited
-	 */
-	public Object getEditableValue();
-
-	/**
-	 * Returns the list of property descriptors for this property source. The
-	 * <code>getPropertyValue</code> and <code>setPropertyValue</code>
-	 * methods are used to read and write the actual property values by
-	 * specifying the property ids from these property descriptors.
-	 * <p>
-	 * Implementors should cache the descriptors as they will be asked for the
-	 * descriptors with any edit/update. Since descriptors provide cell editors,
-	 * returning the same descriptors if possible allows for efficient updating.
-	 * </p>
-	 * 
-	 * @return the property descriptors
-	 */
-	public IPropertyDescriptor[] getPropertyDescriptors();
-
-	/**
-	 * Returns the value of the property with the given id if it has one.
-	 * Returns <code>null</code> if the property's value is <code>null</code>
-	 * value or if this source does not have the specified property.
-	 * 
-	 * @see #setPropertyValue
-	 * @param id
-	 *            the id of the property being set
-	 * @return the value of the property, or <code>null</code>
-	 */
-	public Object getPropertyValue(Object id);
-
-	/**
-	 * Returns whether the value of the property with the given id has changed
-	 * from its default value. Returns <code>false</code> if this source does
-	 * not have the specified property.
-	 * <p>
-	 * If the notion of default value is not meaningful for the specified
-	 * property then <code>false</code> is returned.
-	 * </p>
-	 * 
-	 * @param id
-	 *            the id of the property
-	 * @return <code>true</code> if the value of the specified property has
-	 *         changed from its original default value, <code>false</code> if
-	 *         the specified property does not have a meaningful default value,
-	 *         and <code>false</code> if this source does not have the
-	 *         specified property
-	 * @see IPropertySource2#isPropertyResettable(Object)
-	 * @see #resetPropertyValue(Object)
-	 */
-	public boolean isPropertySet(Object id);
-
-	/**
-	 * Resets the property with the given id to its default value if possible.
-	 * <p>
-	 * Does nothing if the notion of a default value is not meaningful for the
-	 * specified property, or if the property's value cannot be changed, or if
-	 * this source does not have the specified property.
-	 * </p>
-	 * <p>
-	 * Callers will check if this <code>IPropertySource</code> implements
-	 * <code>IPropertySource2</code> and this method will only be called if
-	 * <code>IPropertySource2#isPropertyResettable(Object)</code> returns
-	 * <code>true</code> for the property with the given id.
-	 * </p>
-	 * 
-	 * @param id
-	 *            the id of the property being reset
-	 * @see #isPropertySet(Object)
-	 * @see IPropertySource2#isPropertyResettable(Object)
-	 */
-	public void resetPropertyValue(Object id);
-
-	/**
-	 * Sets the property with the given id if possible. Does nothing if the
-	 * property's value cannot be changed or if this source does not have the
-	 * specified property.
-	 * <p>
-	 * In general, a property source should not directly reference the value
-	 * parameter unless it is an atomic object that can be shared, such as a
-	 * string.
-	 * </p>
-	 * <p>
-	 * An important reason for this is that several property sources with
-	 * compatible descriptors could be appearing in the property sheet at the
-	 * same time. An editor produces a single edited value which is passed as
-	 * the value parameter of this message to all the property sources. Thus to
-	 * avoid a situation where all of the property sources reference the same
-	 * value they should use the value parameter to create a new instance of the
-	 * real value for the given property.
-	 * </p>
-	 * <p>
-	 * There is another reason why a level of indirection is useful. The real
-	 * value of property may be a type that cannot be edited with a standard
-	 * cell editor. However instead of returning the real value in
-	 * <code>getPropertyValue</code>, the value could be converted to a
-	 * <code>String</code> which could be edited with a standard cell editor.
-	 * The edited value will be passed to this method which can then turn it
-	 * back into the real property value.
-	 * </p>
-	 * <p>
-	 * Another variation on returning a value other than the real property value
-	 * in <code>getPropertyValue</code> is to return a value which is an
-	 * <code>IPropertySource</code> (or for which the property sheet can
-	 * obtain an <code>IPropertySource</code>). In this case the value to
-	 * edit is obtained from the child property source using
-	 * <code>getEditableValue</code>. It is this editable value that will be
-	 * passed back via this method when it has been editted
-	 * </p>
-	 * 
-	 * @see #getPropertyValue
-	 * @see #getEditableValue
-	 * @param id
-	 *            the id of the property being set
-	 * @param value
-	 *            the new value for the property; <code>null</code> is allowed
-	 */
-	public void setPropertyValue(Object id, Object value);
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySource2.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySource2.java
deleted file mode 100644
index ca973ae..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySource2.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Gunnar Wagenknecht - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-/**
- * Extension to the standard <code>IPropertySource</code> interface.
- * <p>
- * This interface provides extended API to <code>IPropertySource</code> to
- * allow an easier indication of properties that have a default value and can be
- * resetted.
- * </p>
- * 
- * @since 3.0
- * @see org.eclipse.ui.views.properties.IPropertySource
- */
-public interface IPropertySource2 extends IPropertySource {
-
-    /**
-     * Returns whether the value of the property with the specified id is
-     * resettable to a default value.
-     * 
-     * @param id
-     *            the id of the property
-     * @return <code>true</code> if the property with the specified id has a
-     *         meaningful default value to which it can be resetted, and
-     *         <code>false</code> otherwise
-     * @see IPropertySource#resetPropertyValue(Object)
-     * @see IPropertySource#isPropertySet(Object)
-     */
-    boolean isPropertyResettable(Object id);
-
-    /**
-     * <code>IPropertySource2</code> overrides the specification of this <code>IPropertySource</code> 
-     * method to return <code>true</code> instead of <code>false</code> if the specified 
-     * property does not have a meaningful default value.
-     * <code>isPropertyResettable</code> will only be called if <code>isPropertySet</code> returns
-     * <code>true</code>.
-     * <p> 
-     * Returns whether the value of the property with the given id has changed
-     * from its default value. Returns <code>false</code> if this source does
-     * not have the specified property.
-     * </p>
-     * <p>
-     * If the notion of default value is not meaningful for the specified
-     * property then <code>true</code> is returned.
-     * </p>
-     * 
-     * @param id
-     *            the id of the property
-     * @return <code>true</code> if the value of the specified property has
-     *         changed from its original default value, <code>true</code> if
-     *         the specified property does not have a meaningful default value,
-     *         and <code>false</code> if this source does not have the
-     *         specified property
-     * @see IPropertySource2#isPropertyResettable(Object)
-     * @see #resetPropertyValue(Object)
-     * @since 3.1
-     */
-    public boolean isPropertySet(Object id);
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySourceProvider.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySourceProvider.java
deleted file mode 100644
index 9b79b13..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/IPropertySourceProvider.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-/**
- * Interface used by {@link org.eclipse.ui.views.properties.PropertySheetEntry}
- * to obtain an {@link org.eclipse.ui.views.properties.IPropertySource} for a
- * given object.
- * <p>
- * This interface may be implemented by clients.
- * </p>
- */
-public interface IPropertySourceProvider {
-	
-	/**
-	 * Returns a property source for the given object.
-	 * 
-	 * @param object
-	 *            the object
-	 * @return the property source for the object passed in (maybe
-	 *         <code>null</code>)
-	 */
-	public IPropertySource getPropertySource(Object object);
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertyColumnLabelProvider.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertyColumnLabelProvider.java
deleted file mode 100644
index 1db706d..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertyColumnLabelProvider.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   Ed Merks, IBM - Initial API and implementation (bug 220843)
- *
- */
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A column label provider that returns label text and images based on a
- * {@link IPropertySourceProvider}, forwarding requests for text and image to
- * the label provider returned from the property descriptor for the given
- * property id.
- * 
- * @see IPropertyDescriptor#getLabelProvider()
- * 
- * @since 3.3
- * 
- * @see PropertyEditingSupport
- */
-public class PropertyColumnLabelProvider extends ColumnLabelProvider {
-	protected IPropertySourceProvider propertySourceProvider;
-	protected Object propertyID;
-
-	/**
-	 * Creates a new instance based on the given property source provider and
-	 * property id.
-	 * 
-	 * @param propertySourceProvider
-	 *            the property source provider
-	 * @param propertyID
-	 *            the property id
-	 */
-	public PropertyColumnLabelProvider(
-			IPropertySourceProvider propertySourceProvider, Object propertyID) {
-		this.propertySourceProvider = propertySourceProvider;
-		this.propertyID = propertyID;
-	}
-
-	public String getText(Object object) {
-		IPropertySource propertySource = propertySourceProvider
-				.getPropertySource(object);
-		IPropertyDescriptor[] propertyDescriptors = propertySource
-				.getPropertyDescriptors();
-		for (int i = 0; i < propertyDescriptors.length; i++) {
-			IPropertyDescriptor propertyDescriptor = propertyDescriptors[i];
-			if (propertyID.equals(propertyDescriptor.getId())) {
-				return propertyDescriptor.getLabelProvider().getText(
-						propertySource.getPropertyValue(propertyID));
-			}
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-	public Image getImage(Object object) {
-		IPropertySource propertySource = propertySourceProvider
-				.getPropertySource(object);
-		IPropertyDescriptor[] propertyDescriptors = propertySource
-				.getPropertyDescriptors();
-		for (int i = 0; i < propertyDescriptors.length; i++) {
-			IPropertyDescriptor propertyDescriptor = propertyDescriptors[i];
-			if (propertyID.equals(propertyDescriptor.getId())) {
-				return propertyDescriptor.getLabelProvider().getImage(
-						propertySource.getPropertyValue(propertyID));
-			}
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertyDescriptor.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertyDescriptor.java
deleted file mode 100644
index ab02701..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertyDescriptor.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Standard implementation for property descriptors.
- * <p>
- * The required attributes of property descriptors (id and display name) are
- * passed to the constructor; the optional attributes can be configured using
- * the various set methods (all have reasonable default values):
- * <ul>
- *   <li><code>setDescription</code></li>
- *   <li><code>setCategory</code></li>
- *   <li><code>setLabelProvider</code></li>
- *   <li><code>setHelpContexts</code></li>
- * </ul>
- * Subclasses should reimplement <code>getPropertyEditor</code> to provide a
- * cell editor for changing the value; otherwise the property will be 
- * effectively read only.
- * </p>
- * <p>
- * There are several concrete subclasses provided in this package that cover
- * the most common cases:
- * <ul>
- *   <li><code>TextPropertyDescriptor</code> - edits with a 
- *      <code>TextCellEditor</code></li>
- *   <li><code>ComboBoxPropertyDescriptor - edits with a
- *      <code>ComboBoxCellEditor</code></code></li>
- *   <li><code>ColorPropertyDescriptor - edits with a 
- *      <code>ColorCellEditor</code></code></li>
- * </ul>
- * </p>
- */
-public class PropertyDescriptor implements IPropertyDescriptor {
-
-    /**
-     * The property id.
-     */
-    private Object id;
-
-    /**
-     * The name to display for the property.
-     */
-    private String display;
-
-    /**
-     * Category name, or <code>null</code> if none (the default).
-     */
-    private String category = null;
-
-    /**
-     * Description of the property, or <code>null</code> if none (the default). 
-     */
-    private String description = null;
-
-    /**
-     * The help context ids, or <code>null</code> if none (the default). 
-     */
-    private Object helpIds;
-
-    /**
-     * The flags used to filter the property.
-     */
-    private String[] filterFlags;
-
-    /**
-     * The object that provides the property value's text and image, or 
-     * <code>null</code> if the default label provider is used (the default).
-     */
-    private ILabelProvider labelProvider = null;
-
-    /**
-     * The object to validate the values in the cell editor, or <code>null</code>
-     * if none (the default).
-     */
-    private ICellEditorValidator validator;
-
-    /**
-     * Indicates if the descriptor is compatible with other descriptors of this
-     * type. <code>false</code> by default.
-     */
-    private boolean incompatible = false;
-
-    /**
-     * Creates a new property descriptor with the given id and display name
-     * @param id 
-     * @param displayName 
-     */
-    public PropertyDescriptor(Object id, String displayName) {
-        Assert.isNotNull(id);
-        Assert.isNotNull(displayName);
-        this.id = id;
-        this.display = displayName;
-    }
-
-    /**
-     * The <code>PropertyDescriptor</code> implementation of this 
-     * <code>IPropertyDescriptor</code> method returns <code>null</code>.
-     * <p>
-     * Since no cell editor is returned, the property is read only.
-     * </p>
-     */
-    public CellEditor createPropertyEditor(Composite parent) {
-        return null;
-    }
-
-    /**
-     * Returns <code>true</code> if this property descriptor is to be always 
-     * considered incompatible with any other property descriptor.
-     * This prevents a property from displaying during multiple 
-     * selection.
-     *
-     * @return <code>true</code> to indicate always incompatible
-     */
-    protected boolean getAlwaysIncompatible() {
-        return incompatible;
-    }
-
-    /**
-     * The <code>PropertyDescriptor</code> implementation of this 
-     * <code>IPropertyDescriptor</code> method returns the value set by
-     * the <code>setCategory</code> method. If unset, this method returns
-     * <code>null</code> indicating the default category.
-     *
-     * @see #setCategory
-     */
-    public String getCategory() {
-        return category;
-    }
-
-    /**
-     * The <code>PropertyDescriptor</code> implementation of this 
-     * <code>IPropertyDescriptor</code> method returns the value set by
-     * the <code>setDescription</code> method. If unset, this method returns
-     * <code>null</code> indicating no description.
-     *
-     * @see #setDescription
-     */
-    public String getDescription() {
-        return description;
-    }
-
-    /**
-     * The <code>SimplePropertyDescriptor</code> implementation of this 
-     * <code>IPropertyDescriptor</code> method returns the value supplied
-     * on the constructor.
-     */
-    public String getDisplayName() {
-        return display;
-    }
-
-    /**
-     * The <code>SimplePropertyDescriptor</code> implementation of this 
-     * <code>IPropertyDescriptor</code> method returns the value set by
-     * the <code>setFilterFlags</code> method. If unset, this method returns
-     * <code>null</code>.
-     * <p>
-     * Valid values for these flags are declared as constants on 
-     *  <code>IPropertySheetEntry</code>
-     */
-    public String[] getFilterFlags() {
-        return filterFlags;
-    }
-
-    /**
-     * The <code>SimplePropertyDescriptor</code> implementation of this 
-     * <code>IPropertyDescriptor</code> method returns the value set by
-     * the <code>setHelpContextId</code> method. If unset, this method returns
-     * <code>null</code>.
-     *
-     * @see #setHelpContextIds
-     */
-    public Object getHelpContextIds() {
-        return helpIds;
-    }
-
-    /**
-     * The <code>PropertyDescriptor</code> implementation of this 
-     * <code>IPropertyDescriptor</code> method returns the value supplied
-     * on the constructor.
-     */
-    public Object getId() {
-        return id;
-    }
-
-    /**
-     * The <code>PropertyDescriptor</code> implementation of this 
-     * <code>IPropertyDescriptor</code> method returns the value set by
-     * the <code>setProvider</code> method or, if no value has been set
-     * it returns a <code>LabelProvider</code>
-     *
-     * @see #setLabelProvider
-     */
-    public ILabelProvider getLabelProvider() {
-        if (labelProvider != null) {
-			return labelProvider;
-		}
-		return new LabelProvider();
-    }
-
-    /**
-     * Returns the input validator for editing the property.
-     *
-     * @return the validator used to verify correct values for this property,
-     *   or <code>null</code>
-     */
-    protected ICellEditorValidator getValidator() {
-        return validator;
-    }
-
-    /** 
-     * Returns whether a label provider has been set on the receiver.
-     * @return whether a label provider has been set on the receiver.
-     * @see #setLabelProvider
-     * @since 3.0
-     */
-    public boolean isLabelProviderSet() {
-        return labelProvider != null;
-    }
-
-    /**
-     * The <code>SimplePropertyDescriptor</code> implementation of this 
-     * <code>IPropertyDescriptor</code> method returns true if the other
-     * property has the same id and category and <code>getAlwaysIncompatible()</code>
-     * returns false
-     */
-    public boolean isCompatibleWith(IPropertyDescriptor anotherProperty) {
-        if (getAlwaysIncompatible()) {
-			return false;
-		}
-
-        // Compare id		
-        Object id1 = getId();
-        Object id2 = anotherProperty.getId();
-        if (!id1.equals(id2)) {
-			return false;
-		}
-
-        // Compare Category (may be null)
-        if (getCategory() == null) {
-            if (anotherProperty.getCategory() != null) {
-				return false;
-			}
-        } else {
-            if (!getCategory().equals(anotherProperty.getCategory())) {
-				return false;
-			}
-        }
-
-        return true;
-    }
-
-    /**
-     * Sets a flag indicating whether this property descriptor is to be always 
-     * considered incompatible with any other property descriptor.
-     * Setting this flag prevents a property from displaying during multiple 
-     * selection.
-     *
-     * @param flag <code>true</code> to indicate always incompatible
-     */
-    public void setAlwaysIncompatible(boolean flag) {
-        incompatible = flag;
-    }
-
-    /**
-     * Sets the category for this property descriptor.
-     * 
-     * @param category the category for the descriptor, or <code>null</code> if none
-     * @see #getCategory
-     */
-    public void setCategory(String category) {
-        this.category = category;
-    }
-
-    /**
-     * Sets the description for this property descriptor.
-     * The description should be limited to a single line so that it can be
-     * displayed in the status line.
-     * 
-     * @param description the description, or <code>null</code> if none
-     * @see #getDescription
-     */
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    /**
-     * Sets the the filter flags for this property descriptor.
-     * The description should be limited to a single line so that it can be
-     * displayed in the status line.
-     * <p>
-     * Valid values for these flags are declared as constants on 
-     *  <code>IPropertySheetEntry</code>
-     * </p>
-     * 
-     * @param value the filter flags
-     * @see #getFilterFlags
-     */
-    public void setFilterFlags(String value[]) {
-        filterFlags = value;
-    }
-
-    /**
-     * Sets the help context id for this property descriptor.
-     *
-     * NOTE: Help support system API's changed since 2.0 and arrays
-     * of contexts are no longer supported.
-     * </p>
-     * <p>
-     * Thus the only valid parameter type for this method
-     * is a <code>String</code> representing a context id. 
-     * The previously valid parameter types are deprecated. 
-     * The plural name for this method is unfortunate.
-     * </p>
-     * 
-     * @param contextIds the help context ids, or <code>null</code> if none
-     * @see #getHelpContextIds
-     */
-    public void setHelpContextIds(Object contextIds) {
-        helpIds = contextIds;
-    }
-
-    /**
-     * Sets the label provider for this property descriptor.
-     * <p>
-     * If no label provider is set an instance of <code>LabelProvider</code>
-     * will be created as the default when needed.
-     * </p>
-     * 
-     * @param provider the label provider for the descriptor, or 
-     *   <code>null</code> if the default label provider should be used
-     * @see #getLabelProvider
-     */
-    public void setLabelProvider(ILabelProvider provider) {
-        labelProvider = provider;
-    }
-
-    /**
-     * Sets the input validator for the cell editor for this property descriptor.
-     * <p>
-     * [Issue: This method should be unnecessary is the cell editor's own
-     *  validator is used.
-     * ]
-     * </p>
-     * 
-     * @param validator the cell input validator, or <code>null</code> if none
-     */
-    public void setValidator(ICellEditorValidator validator) {
-        this.validator = validator;
-    }
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertyEditingSupport.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertyEditingSupport.java
deleted file mode 100644
index f43dff7..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertyEditingSupport.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   Ed Merks, IBM - Initial API and implementation (bug 220843)
- *
- */
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A concrete subclass of {@link EditingSupport} that implements cell editing
- * support for column-based viewers (such as e.g. {@link TreeViewer} or
- * {@link TableViewer}) based on an {@link IPropertySourceProvider},
- * forwarding requests to the {@link IPropertySource} or
- * {@link IPropertyDescriptor} for the given property ID.
- * 
- * @since 3.3
- * 
- * @see PropertyColumnLabelProvider
- */
-public class PropertyEditingSupport extends EditingSupport {
-	protected IPropertySourceProvider propertySourceProvider;
-	protected Object propertyID;
-
-	/**
-	 * Creates a new instance to be used with the given viewer, based on the
-	 * given property source provider and property ID.
-	 * 
-	 * @param viewer
-	 *            the column viewer
-	 * @param propertySourceProvider
-	 *            the property source provider
-	 * @param propertyID
-	 *            the property ID
-	 */
-	public PropertyEditingSupport(ColumnViewer viewer,
-			IPropertySourceProvider propertySourceProvider, Object propertyID) {
-		super(viewer);
-		this.propertySourceProvider = propertySourceProvider;
-		this.propertyID = propertyID;
-	}
-
-	protected boolean canEdit(Object object) {
-		IPropertySource propertySource = propertySourceProvider
-				.getPropertySource(object);
-		IPropertyDescriptor[] propertyDescriptors = propertySource
-				.getPropertyDescriptors();
-		for (int i = 0; i < propertyDescriptors.length; i++) {
-			IPropertyDescriptor propertyDescriptor = propertyDescriptors[i];
-			if (propertyID.equals(propertyDescriptor.getId())) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	protected CellEditor getCellEditor(Object object) {
-		IPropertySource propertySource = propertySourceProvider
-				.getPropertySource(object);
-		IPropertyDescriptor[] propertyDescriptors = propertySource
-				.getPropertyDescriptors();
-		for (int i = 0; i < propertyDescriptors.length; i++) {
-			IPropertyDescriptor propertyDescriptor = propertyDescriptors[i];
-			if (propertyID.equals(propertyDescriptor.getId())) {
-				return propertyDescriptor
-						.createPropertyEditor((Composite) getViewer()
-								.getControl());
-			}
-		}
-		return null;
-	}
-
-	protected Object getValue(Object object) {
-		IPropertySource propertySource = propertySourceProvider
-				.getPropertySource(object);
-		Object value = propertySource.getPropertyValue(propertyID);
-		IPropertySource valuePropertySource = propertySourceProvider
-				.getPropertySource(value);
-		if (valuePropertySource != null) {
-			value = valuePropertySource.getEditableValue();
-		}
-		return value;
-	}
-
-	protected void setValue(Object object, Object value) {
-		IPropertySource propertySource = propertySourceProvider
-				.getPropertySource(object);
-		propertySource.setPropertyValue(propertyID, value);
-	}
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheet.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheet.java
deleted file mode 100644
index ae5e28f..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheet.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.ISaveablePart;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.internal.views.ViewsPlugin;
-import org.eclipse.ui.part.IContributedContentsView;
-import org.eclipse.ui.part.IPage;
-import org.eclipse.ui.part.IPageBookViewPage;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.part.PageBookView;
-
-/**
- * Main class for the Property Sheet View.
- * <p>
- * This standard view has id <code>"org.eclipse.ui.views.PropertySheet"</code>.
- * </p>
- * <p>
- * Note that property <it>sheets</it> and property sheet pages are not the
- * same thing as property <it>dialogs</it> and their property pages (the property
- * pages extension point is for contributing property pages to property dialogs).
- * Within the property sheet view, all pages are <code>IPropertySheetPage</code>s.
- * </p>
- * <p>
- * Property sheet pages are discovered by the property sheet view automatically
- * when a part is first activated. The property sheet view asks the active part
- * for its property sheet page; this is done by invoking 
- * <code>getAdapter(IPropertySheetPage.class)</code> on the part. If the part 
- * returns a page, the property sheet view then creates the controls for that
- * property sheet page (using <code>createControl</code>), and adds the page to 
- * the property sheet view. Whenever this part becomes active, its corresponding
- * property sheet page is shown in the property sheet view (which may or may not
- * be visible at the time). A part's property sheet page is discarded when the
- * part closes. The property sheet view has a default page (an instance of 
- * <code>PropertySheetPage</code>) which services all parts without a property
- * sheet page of their own.
- * </p>
- * <p>
- * The workbench will automatically instantiates this class when a Property
- * Sheet view is needed for a workbench window. This class is not intended
- * to be instantiated or subclassed by clients.
- * </p>
- *
- * @see IPropertySheetPage
- * @see PropertySheetPage
- * @noinstantiate This class is not intended to be instantiated by clients.
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class PropertySheet extends PageBookView implements ISelectionListener {
-    /**
-     * No longer used but preserved to avoid api change
-     */
-    public static final String HELP_CONTEXT_PROPERTY_SHEET_VIEW = IPropertiesHelpContextIds.PROPERTY_SHEET_VIEW;
-
-    /**
-     * The initial selection when the property sheet opens
-     */
-    private ISelection bootstrapSelection;
-
-    /**
-     * Creates a property sheet view.
-     */
-    public PropertySheet() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on PageBookView.
-     * Returns the default property sheet page.
-     */
-    protected IPage createDefaultPage(PageBook book) {
-        PropertySheetPage page = new PropertySheetPage();
-        initPage(page);
-        page.createControl(book);
-        return page;
-    }
-
-    /**
-     * The <code>PropertySheet</code> implementation of this <code>IWorkbenchPart</code>
-     * method creates a <code>PageBook</code> control with its default page showing.
-     */
-    public void createPartControl(Composite parent) {
-        super.createPartControl(parent);
-        getSite().getPage().getWorkbenchWindow().getWorkbench().getHelpSystem()
-				.setHelp(getPageBook(),
-						IPropertiesHelpContextIds.PROPERTY_SHEET_VIEW);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchPart.
-     */
-    public void dispose() {
-        // run super.
-        super.dispose();
-
-        // remove ourselves as a selection listener
-        getSite().getPage().removeSelectionListener(this);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on PageBookView.
-     */
-    protected PageRec doCreatePage(IWorkbenchPart part) {
-        // Try to get a custom property sheet page.
-        IPropertySheetPage page = (IPropertySheetPage) ViewsPlugin.getAdapter(part,
-                IPropertySheetPage.class, false);
-        if (page != null) {
-            if (page instanceof IPageBookViewPage) {
-				initPage((IPageBookViewPage) page);
-			}
-            page.createControl(getPageBook());
-            return new PageRec(part, page);
-        }
-
-        // Use the default page		
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on PageBookView.
-     */
-    protected void doDestroyPage(IWorkbenchPart part, PageRec rec) {
-        IPropertySheetPage page = (IPropertySheetPage) rec.page;
-        page.dispose();
-        rec.dispose();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on PageBookView.
-     * Returns the active part on the same workbench page as this property 
-     * sheet view.
-     */
-    protected IWorkbenchPart getBootstrapPart() {
-        IWorkbenchPage page = getSite().getPage();
-        if (page != null) {
-            bootstrapSelection = page.getSelection();
-            return page.getActivePart();
-        } 
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IViewPart.
-     */
-    public void init(IViewSite site) throws PartInitException {
-        site.getPage().addSelectionListener(this);
-        super.init(site);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on PageBookView.
-     * The property sheet may show properties for any view other than this view.
-     */
-    protected boolean isImportant(IWorkbenchPart part) {
-        return part != this;
-    }
-
-    /**
-     * The <code>PropertySheet</code> implementation of this <code>IPartListener</code>
-     * method first sees if the active part is an <code>IContributedContentsView</code>
-     * adapter and if so, asks it for its contributing part.
-     */
-    public void partActivated(IWorkbenchPart part) {
-    	// Look for a declaratively-contributed adapter - including not yet loaded adapter factories.
-    	// See bug 86362 [PropertiesView] Can not access AdapterFactory, when plugin is not loaded.
-        IContributedContentsView view = (IContributedContentsView) ViewsPlugin.getAdapter(part,
-                IContributedContentsView.class, true);
-        IWorkbenchPart source = null;
-        if (view != null) {
-			source = view.getContributingPart();
-		}
-        if (source != null) {
-			super.partActivated(source);
-		} else {
-			super.partActivated(part);
-		}
-
-        // When the view is first opened, pass the selection to the page		
-        if (bootstrapSelection != null) {
-            IPropertySheetPage page = (IPropertySheetPage) getCurrentPage();
-            if (page != null) {
-				page.selectionChanged(part, bootstrapSelection);
-			}
-            bootstrapSelection = null;
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ISelectionListener.
-     * Notify the current page that the selection has changed.
-     */
-    public void selectionChanged(IWorkbenchPart part, ISelection sel) {
-        // we ignore our own selection or null selection
-        if (part == this || sel == null) {
-			return;
-		}
-
-        // pass the selection to the page		
-        IPropertySheetPage page = (IPropertySheetPage) getCurrentPage();
-        if (page != null) {
-			page.selectionChanged(part, sel);
-		}
-    }
-    
-    /**
-	 * The <code>PropertySheet</code> implementation of this
-	 * <code>PageBookView</code> method handles the <code>ISaveablePart</code>
-	 * adapter case by calling <code>getSaveablePart()</code>.
-	 * 
-	 * @since 3.2
-	 */
-	protected Object getViewAdapter(Class key) {
-		if (ISaveablePart.class.equals(key)) {
-			return getSaveablePart();
-		}
-		return super.getViewAdapter(key);
-	}
-
-	/**
-	 * Returns an <code>ISaveablePart</code> that delegates to the source part
-	 * for the current page if it implements <code>ISaveablePart</code>, or
-	 * <code>null</code> otherwise.
-	 * 
-	 * @return an <code>ISaveablePart</code> or <code>null</code>
-	 * @since 3.2
-	 */
-	protected ISaveablePart getSaveablePart() {
-		IWorkbenchPart part = getCurrentContributingPart();
-		if (part instanceof ISaveablePart) {
-			return (ISaveablePart) part;
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetAction.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetAction.java
deleted file mode 100644
index 238a95b..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.jface.action.Action;
-
-/**
- * This is the base class of all the local actions used
- * in the PropertySheet.
- */
-/*package*/abstract class PropertySheetAction extends Action {
-    protected PropertySheetViewer viewer;
-
-    private String id;
-
-    /**
-     * Create a PropertySheetViewer action.
-     */
-    protected PropertySheetAction(PropertySheetViewer viewer, String name) {
-        super(name);
-        this.id = name;
-        this.viewer = viewer;
-    }
-
-    /**
-     * Return the unique action ID that will be
-     * used in contribution managers.
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * Return the PropertySheetViewer
-     * @return the PropertySheetViewer
-     */
-    public PropertySheetViewer getPropertySheet() {
-        return viewer;
-    }
-
-    /**
-     * Set the unique ID that should be used
-     * in the contribution managers.
-     */
-    public void setId(String newId) {
-        id = newId;
-    }
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetCategory.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetCategory.java
deleted file mode 100644
index 1ab9876..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetCategory.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A category in a PropertySheet used to group <code>IPropertySheetEntry</code>
- * entries so they are displayed together.
- */
-/*package*/class PropertySheetCategory {
-    private String categoryName;
-
-    private List entries = new ArrayList();
-
-    private boolean shouldAutoExpand = true;
-
-    /**
-     * Create a PropertySheet category with name.
-     * @param name 
-     */
-    public PropertySheetCategory(String name) {
-        categoryName = name;
-    }
-
-    /**
-     * Add an <code>IPropertySheetEntry</code> to the list
-     * of entries in this category. 
-     * @param entry 
-     */
-    public void addEntry(IPropertySheetEntry entry) {
-        entries.add(entry);
-    }
-
-    /**
-     * Return the category name.
-     * @return the category name
-     */
-    public String getCategoryName() {
-        return categoryName;
-    }
-
-    /**
-     * Returns <code>true</code> if this category should be automatically 
-     * expanded. The default value is <code>true</code>.
-     * 
-     * @return <code>true</code> if this category should be automatically 
-     * expanded, <code>false</code> otherwise
-     */
-    public boolean getAutoExpand() {
-        return shouldAutoExpand;
-    }
-
-    /**
-     * Sets if this category should be automatically 
-     * expanded.
-     * @param autoExpand 
-     */
-    public void setAutoExpand(boolean autoExpand) {
-        shouldAutoExpand = autoExpand;
-    }
-
-    /**
-     * Returns the entries in this category.
-     *
-     * @return the entries in this category
-     */
-    public IPropertySheetEntry[] getChildEntries() {
-        return (IPropertySheetEntry[]) entries
-                .toArray(new IPropertySheetEntry[entries.size()]);
-    }
-
-    /**
-     * Removes all of the entries in this category.
-     * Doing so allows us to reuse this category entry.
-     */
-    public void removeAllEntries() {
-        entries = new ArrayList();
-    }
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetEntry.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetEntry.java
deleted file mode 100644
index c95bfd5..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetEntry.java
+++ /dev/null
@@ -1,791 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Gunnar Wagenknecht - fix for bug 21756 [PropertiesView] property view sorting
- *******************************************************************************/
-
-package org.eclipse.ui.views.properties;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.commands.common.EventManager;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.internal.views.ViewsPlugin;
-
-/**
- * <code>PropertySheetEntry</code> is an implementation of
- * <code>IPropertySheetEntry</code> which uses <code>IPropertySource</code>
- * and <code>IPropertyDescriptor</code> to interact with domain model objects.
- * <p>
- * Every property sheet entry has a single descriptor (except the root entry
- * which has none). This descriptor determines what property of its objects it
- * will display/edit.
- * </p>
- * <p>
- * Entries do not listen for changes in their objects. Since there is no
- * restriction on properties being independent, a change in one property may
- * affect other properties. The value of a parent's property may also change. As
- * a result we are forced to refresh the entire entry tree when a property
- * changes value.
- * </p>
- * 
- * @since 3.0 (was previously internal)
- */
-public class PropertySheetEntry extends EventManager implements
-		IPropertySheetEntry {
-
-	/**
-	 * The values we are displaying/editing. These objects repesent the value of
-	 * one of the properties of the values of our parent entry. Except for the
-	 * root entry where they represent the input (selected) objects.
-	 */
-	private Object[] values = new Object[0];
-
-	/**
-	 * The property sources for the values we are displaying/editing.
-	 */
-	private Map sources = new HashMap(0);
-
-	/**
-	 * The value of this entry is defined as the the first object in its value
-	 * array or, if that object is an <code>IPropertySource</code>, the value
-	 * it returns when sent <code>getEditableValue</code>
-	 */
-	private Object editValue;
-
-	private PropertySheetEntry parent;
-
-	private IPropertySourceProvider propertySourceProvider;
-
-	private IPropertyDescriptor descriptor;
-
-	private CellEditor editor;
-
-	private String errorText;
-
-	private PropertySheetEntry[] childEntries = null;
-
-	/**
-	 * Create the CellEditorListener for this entry. It listens for value
-	 * changes in the CellEditor, and cancel and finish requests.
-	 */
-	private ICellEditorListener cellEditorListener = new ICellEditorListener() {
-		public void editorValueChanged(boolean oldValidState,
-				boolean newValidState) {
-			if (!newValidState) {
-				// currently not valid so show an error message
-				setErrorText(editor.getErrorMessage());
-			} else {
-				// currently valid
-				setErrorText(null);
-			}
-		}
-
-		public void cancelEditor() {
-			setErrorText(null);
-		}
-
-		public void applyEditorValue() {
-			PropertySheetEntry.this.applyEditorValue();
-		}
-	};
-
-	/*
-	 * (non-Javadoc) Method declared on IPropertySheetEntry.
-	 */
-	public void addPropertySheetEntryListener(
-			IPropertySheetEntryListener listener) {
-		addListenerObject(listener);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPropertySheetEntry.
-	 */
-	public void applyEditorValue() {
-		if (editor == null) {
-			return;
-		}
-
-		// Check if editor has a valid value
-		if (!editor.isValueValid()) {
-			setErrorText(editor.getErrorMessage());
-			return;
-		}
-
-		setErrorText(null);
-
-		// See if the value changed and if so update
-		Object newValue = editor.getValue();
-		boolean changed = false;
-		if (values.length > 1) {
-			changed = true;
-		} else if (editValue == null) {
-			if (newValue != null) {
-				changed = true;
-			}
-		} else if (!editValue.equals(newValue)) {
-			changed = true;
-		}
-
-		// Set the editor value
-		if (changed) {
-			setValue(newValue);
-		}
-	}
-
-	/**
-	 * Return the unsorted intersection of all the
-	 * <code>IPropertyDescriptor</code>s for the objects.
-	 * 
-	 * @return List
-	 */
-	private List computeMergedPropertyDescriptors() {
-		if (values.length == 0) {
-			return new ArrayList(0);
-		}
-
-		IPropertySource firstSource = getPropertySource(values[0]);
-		if (firstSource == null) {
-			return new ArrayList(0);
-		}
-
-		if (values.length == 1) {
-			return Arrays.asList(firstSource.getPropertyDescriptors());
-		}
-
-		// get all descriptors from each object
-		Map[] propertyDescriptorMaps = new Map[values.length];
-		for (int i = 0; i < values.length; i++) {
-			Object object = values[i];
-			IPropertySource source = getPropertySource(object);
-			if (source == null) {
-				// if one of the selected items is not a property source
-				// then we show no properties
-				return new ArrayList(0);
-			}
-			// get the property descriptors keyed by id
-			propertyDescriptorMaps[i] = computePropertyDescriptorsFor(source);
-		}
-
-		// intersect
-		Map intersection = propertyDescriptorMaps[0];
-		for (int i = 1; i < propertyDescriptorMaps.length; i++) {
-			// get the current ids
-			Object[] ids = intersection.keySet().toArray();
-			for (int j = 0; j < ids.length; j++) {
-				Object object = propertyDescriptorMaps[i].get(ids[j]);
-				if (object == null ||
-				// see if the descriptors (which have the same id) are
-						// compatible
-						!((IPropertyDescriptor) intersection.get(ids[j]))
-								.isCompatibleWith((IPropertyDescriptor) object)) {
-					intersection.remove(ids[j]);
-				}
-			}
-		}
-
-		// sorting is handled in the PropertySheetViewer, return unsorted (in
-		// the original order)
-		ArrayList result = new ArrayList(intersection.size());
-		IPropertyDescriptor[] firstDescs = firstSource.getPropertyDescriptors();
-		for (int i = 0; i < firstDescs.length; i++) {
-			IPropertyDescriptor desc = firstDescs[i];
-			if (intersection.containsKey(desc.getId())) {
-				result.add(desc);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns an map of property descritptors (keyed on id) for the given
-	 * property source.
-	 * 
-	 * @param source
-	 *            a property source for which to obtain descriptors
-	 * @return a table of decriptors keyed on their id
-	 */
-	private Map computePropertyDescriptorsFor(IPropertySource source) {
-		IPropertyDescriptor[] descriptors = source.getPropertyDescriptors();
-		Map result = new HashMap(descriptors.length * 2 + 1);
-		for (int i = 0; i < descriptors.length; i++) {
-			result.put(descriptors[i].getId(), descriptors[i]);
-		}
-		return result;
-	}
-
-	/**
-	 * Create our child entries.
-	 */
-	private void createChildEntries() {
-		// get the current descriptors
-		List descriptors = computeMergedPropertyDescriptors();
-
-		// rebuild child entries using old when possible
-		PropertySheetEntry[] newEntries = new PropertySheetEntry[descriptors
-				.size()];
-		for (int i = 0; i < descriptors.size(); i++) {
-			IPropertyDescriptor d = (IPropertyDescriptor) descriptors.get(i);
-			// create new entry
-			PropertySheetEntry entry = createChildEntry();
-			entry.setDescriptor(d);
-			entry.setParent(this);
-			entry.setPropertySourceProvider(propertySourceProvider);
-			entry.refreshValues();
-			newEntries[i] = entry;
-		}
-		// only assign if successful
-		childEntries = newEntries;
-	}
-
-	/**
-	 * Factory method to create a new child <code>PropertySheetEntry</code>
-	 * instance.
-	 * <p>
-	 * Subclasses may overwrite to create new instances of their own class.
-	 * </p>
-	 * 
-	 * @return a new <code>PropertySheetEntry</code> instance for the
-	 *         descriptor passed in
-	 * @since 3.1
-	 */
-	protected PropertySheetEntry createChildEntry() {
-		return new PropertySheetEntry();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPropertySheetEntry.
-	 */
-	public void dispose() {
-		if (editor != null) {
-			editor.dispose();
-			editor = null;
-		}
-		// recursive call to dispose children
-		PropertySheetEntry[] entriesToDispose = childEntries;
-		childEntries = null;
-		if (entriesToDispose != null) {
-			for (int i = 0; i < entriesToDispose.length; i++) {
-				// an error in a property source may cause refreshChildEntries
-				// to fail. Since the Workbench handles such errors we
-				// can be left in a state where a child entry is null.
-				if (entriesToDispose[i] != null) {
-					entriesToDispose[i].dispose();
-				}
-			}
-		}
-	}
-
-	/**
-	 * The child entries of this entry have changed (children added or removed).
-	 * Notify all listeners of the change.
-	 */
-	private void fireChildEntriesChanged() {
-		Object[] array = getListeners();
-		for (int i = 0; i < array.length; i++) {
-			IPropertySheetEntryListener listener = (IPropertySheetEntryListener) array[i];
-			listener.childEntriesChanged(this);
-		}
-	}
-
-	/**
-	 * The error message of this entry has changed. Notify all listeners of the
-	 * change.
-	 */
-	private void fireErrorMessageChanged() {
-		Object[] array = getListeners();
-		for (int i = 0; i < array.length; i++) {
-			IPropertySheetEntryListener listener = (IPropertySheetEntryListener) array[i];
-			listener.errorMessageChanged(this);
-		}
-	}
-
-	/**
-	 * The values of this entry have changed. Notify all listeners of the
-	 * change.
-	 */
-	private void fireValueChanged() {
-		Object[] array = getListeners();
-		for (int i = 0; i < array.length; i++) {
-			IPropertySheetEntryListener listener = (IPropertySheetEntryListener) array[i];
-			listener.valueChanged(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPropertySheetEntry.
-	 */
-	public String getCategory() {
-		return descriptor.getCategory();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPropertySheetEntry.
-	 */
-	public IPropertySheetEntry[] getChildEntries() {
-		if (childEntries == null) {
-			createChildEntries();
-		}
-		return childEntries;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPropertySheetEntry.
-	 */
-	public String getDescription() {
-		return descriptor.getDescription();
-	}
-
-	/**
-	 * Returns the descriptor for this entry.
-	 * 
-	 * @return the descriptor for this entry
-	 * @since 3.1 (was previously private)
-	 */
-	protected IPropertyDescriptor getDescriptor() {
-		return descriptor;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPropertySheetEntry.
-	 */
-	public String getDisplayName() {
-		return descriptor.getDisplayName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySheetEntry#getEditor(org.eclipse.swt.widgets.Composite)
-	 */
-	public CellEditor getEditor(Composite parent) {
-
-		if (editor == null) {
-			editor = descriptor.createPropertyEditor(parent);
-			if (editor != null) {
-				editor.addListener(cellEditorListener);
-			}
-		}
-		if (editor != null) {
-			editor.setValue(editValue);
-			setErrorText(editor.getErrorMessage());
-		}
-		return editor;
-	}
-
-	/**
-	 * Returns the edit value for the object at the given index.
-	 * 
-	 * @param index
-	 *            the value object index
-	 * @return the edit value for the object at the given index
-	 */
-	protected Object getEditValue(int index) {
-		Object value = values[index];
-		IPropertySource source = getPropertySource(value);
-		if (source != null) {
-			value = source.getEditableValue();
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPropertySheetEntry.
-	 */
-	public String getErrorText() {
-		return errorText;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPropertySheetEntry.
-	 */
-	public String getFilters()[] {
-		return descriptor.getFilterFlags();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPropertySheetEntry.
-	 */
-	public Object getHelpContextIds() {
-		return descriptor.getHelpContextIds();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPropertySheetEntry.
-	 */
-	public Image getImage() {
-		ILabelProvider provider = descriptor.getLabelProvider();
-		if (provider == null) {
-			return null;
-		}
-		return provider.getImage(editValue);
-	}
-
-	/**
-	 * Returns the parent of this entry.
-	 * 
-	 * @return the parent entry, or <code>null</code> if it has no parent
-	 * @since 3.1
-	 */
-	protected PropertySheetEntry getParent() {
-		return parent;
-	}
-
-	/**
-	 * Returns an property source for the given object.
-	 * 
-	 * @param object
-	 *            an object for which to obtain a property source or
-	 *            <code>null</code> if a property source is not available
-	 * @return an property source for the given object
-	 * @since 3.1 (was previously private)
-	 */
-	protected IPropertySource getPropertySource(Object object) {
-		if (sources.containsKey(object))
-			return (IPropertySource) sources.get(object);
-
-		IPropertySource result = null;
-		IPropertySourceProvider provider = propertySourceProvider;
-
-		if (provider == null && object != null) {
-			provider = (IPropertySourceProvider) ViewsPlugin.getAdapter(object, 
-                    IPropertySourceProvider.class, false);
-        }
-
-		if (provider != null) {
-			result = provider.getPropertySource(object);
-		} else {
-            result = (IPropertySource)ViewsPlugin.getAdapter(object, IPropertySource.class, false);
-        }
-
-		sources.put(object, result);
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPropertySheetEntry.
-	 */
-	public String getValueAsString() {
-		if (editValue == null) {
-			return "";//$NON-NLS-1$
-		}
-		ILabelProvider provider = descriptor.getLabelProvider();
-		if (provider == null) {
-			return editValue.toString();
-		}
-		String text = provider.getText(editValue);
-		if (text == null) {
-			return "";//$NON-NLS-1$
-		}
-		return text;
-	}
-
-	/**
-	 * Returns the value objects of this entry.
-	 * 
-	 * @return the value objects of this entry
-	 * @since 3.1 (was previously private)
-	 */
-	public Object[] getValues() {
-		return values;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPropertySheetEntry.
-	 */
-	public boolean hasChildEntries() {
-		if (childEntries != null && childEntries.length > 0) {
-			return true;
-		}
-		// see if we could have entires if we were asked
-		return computeMergedPropertyDescriptors().size() > 0;
-	}
-
-	/**
-	 * Update our child entries. This implementation tries to reuse child
-	 * entries if possible (if the id of the new descriptor matches the
-	 * descriptor id of the old entry).
-	 */
-	private void refreshChildEntries() {
-		if (childEntries == null) {
-			// no children to refresh
-			return;
-		}
-
-		// get the current descriptors
-		List descriptors = computeMergedPropertyDescriptors();
-
-		// cache old entries by their descriptor id
-		Map entryCache = new HashMap(childEntries.length * 2 + 1);
-		for (int i = 0; i < childEntries.length; i++) {
-			PropertySheetEntry childEntry = childEntries[i];
-			if (childEntry != null) {
-				entryCache.put(childEntry.getDescriptor().getId(), childEntry);
-			}
-		}
-
-		// create a list of entries to dispose
-		List entriesToDispose = new ArrayList(Arrays.asList(childEntries));
-
-		// clear the old entries
-		this.childEntries = null;
-
-		// rebuild child entries using old when possible
-		PropertySheetEntry[] newEntries = new PropertySheetEntry[descriptors
-				.size()];
-		boolean entriesChanged = descriptors.size() != entryCache.size();
-		for (int i = 0; i < descriptors.size(); i++) {
-			IPropertyDescriptor d = (IPropertyDescriptor) descriptors.get(i);
-			// see if we have an entry matching this descriptor
-			PropertySheetEntry entry = (PropertySheetEntry) entryCache.get(d
-					.getId());
-			if (entry != null) {
-				// reuse old entry
-				entry.setDescriptor(d);
-				entriesToDispose.remove(entry);
-			} else {
-				// create new entry
-				entry = createChildEntry();
-				entry.setDescriptor(d);
-				entry.setParent(this);
-				entry.setPropertySourceProvider(propertySourceProvider);
-				entriesChanged = true;
-			}
-			entry.refreshValues();
-			newEntries[i] = entry;
-		}
-
-		// only assign if successful
-		this.childEntries = newEntries;
-
-		if (entriesChanged) {
-			fireChildEntriesChanged();
-		}
-
-		// Dispose of entries which are no longer needed
-		for (int i = 0; i < entriesToDispose.size(); i++) {
-			((IPropertySheetEntry) entriesToDispose.get(i)).dispose();
-		}
-	}
-
-	/**
-	 * Refresh the entry tree from the root down.
-	 * 
-	 * @since 3.1 (was previously private)
-	 */
-	protected void refreshFromRoot() {
-		if (parent == null) {
-			refreshChildEntries();
-		} else {
-			parent.refreshFromRoot();
-		}
-	}
-
-	/**
-	 * Update our value objects. We ask our parent for the property values based
-	 * on our descriptor.
-	 */
-	private void refreshValues() {
-		// get our parent's value objects
-		Object[] currentSources = parent.getValues();
-
-		// loop through the objects getting our property value from each
-		Object[] newValues = new Object[currentSources.length];
-		for (int i = 0; i < currentSources.length; i++) {
-			IPropertySource source = parent
-					.getPropertySource(currentSources[i]);
-			newValues[i] = source.getPropertyValue(descriptor.getId());
-		}
-
-		// set our new values
-		setValues(newValues);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPropertySheetEntry.
-	 */
-	public void removePropertySheetEntryListener(
-			IPropertySheetEntryListener listener) {
-		removeListenerObject(listener);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPropertySheetEntry.
-	 */
-	public void resetPropertyValue() {
-		if (parent == null) {
-			// root does not have a default value
-			return;
-		}
-
-		// Use our parent's values to reset our values.
-		boolean change = false;
-		Object[] objects = parent.getValues();
-		for (int i = 0; i < objects.length; i++) {
-			IPropertySource source = getPropertySource(objects[i]);
-			if (source.isPropertySet(descriptor.getId())) {
-				// fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=21756
-				if (source instanceof IPropertySource2) {
-					IPropertySource2 extendedSource = (IPropertySource2) source;
-					// continue with next if property is not resettable
-					if (!extendedSource
-							.isPropertyResettable(descriptor.getId())) {
-						continue;
-					}
-				}
-				source.resetPropertyValue(descriptor.getId());
-				change = true;
-			}
-		}
-		if (change) {
-			refreshFromRoot();
-		}
-	}
-
-	/**
-	 * Set the descriptor.
-	 * 
-	 * @param newDescriptor
-	 */
-	private void setDescriptor(IPropertyDescriptor newDescriptor) {
-		// if our descriptor is changing, we have to get rid
-		// of our current editor if there is one
-		if (descriptor != newDescriptor && editor != null) {
-			editor.dispose();
-			editor = null;
-		}
-		descriptor = newDescriptor;
-	}
-
-	/**
-	 * Set the error text. This should be set to null when the current value is
-	 * valid, otherwise it should be set to a error string
-	 */
-	private void setErrorText(String newErrorText) {
-		errorText = newErrorText;
-		// inform listeners
-		fireErrorMessageChanged();
-	}
-
-	/**
-	 * Sets the parent of the entry to be propertySheetEntry.
-	 * 
-	 * @param propertySheetEntry
-	 */
-	private void setParent(PropertySheetEntry propertySheetEntry) {
-		parent = propertySheetEntry;
-	}
-
-	/**
-	 * Sets a property source provider for this entry. This provider is used to
-	 * obtain an <code>IPropertySource</code> for each of this entries
-	 * objects. If no provider is set then a default provider is used.
-	 * 
-	 * @param provider
-	 *            IPropertySourceProvider
-	 */
-	public void setPropertySourceProvider(IPropertySourceProvider provider) {
-		propertySourceProvider = provider;
-	}
-
-	/**
-	 * Set the value for this entry.
-	 * <p>
-	 * We set the given value as the value for all our value objects. We then
-	 * call our parent to update the property we represent with the given value.
-	 * We then trigger a model refresh.
-	 * <p>
-	 * 
-	 * @param newValue
-	 *            the new value
-	 */
-	private void setValue(Object newValue) {
-		// Set the value
-		for (int i = 0; i < values.length; i++) {
-			values[i] = newValue;
-		}
-
-		// Inform our parent
-		parent.valueChanged(this);
-
-		// Refresh the model
-		refreshFromRoot();
-	}
-
-	/**
-	 * The <code>PropertySheetEntry</code> implmentation of this method
-	 * declared on<code>IPropertySheetEntry</code> will obtain an editable
-	 * value for the given objects and update the child entries.
-	 * <p>
-	 * Updating the child entries will typically call this method on the child
-	 * entries and thus the entire entry tree is updated
-	 * </p>
-	 * 
-	 * @param objects
-	 *            the new values for this entry
-	 */
-	public void setValues(Object[] objects) {
-		values = objects;
-		sources = new HashMap(values.length * 2 + 1);
-
-		if (values.length == 0) {
-			editValue = null;
-		} else {
-			// set the first value object as the entry's value
-			Object newValue = values[0];
-
-			// see if we should convert the value to an editable value
-			IPropertySource source = getPropertySource(newValue);
-			if (source != null) {
-				newValue = source.getEditableValue();
-			}
-			editValue = newValue;
-		}
-
-		// update our child entries
-		refreshChildEntries();
-
-		// inform listeners that our value changed
-		fireValueChanged();
-	}
-
-	/**
-	 * The value of the given child entry has changed. Therefore we must set
-	 * this change into our value objects.
-	 * <p>
-	 * We must inform our parent so that it can update its value objects
-	 * </p>
-	 * <p>
-	 * Subclasses may override to set the property value in some custom way.
-	 * </p>
-	 * 
-	 * @param child
-	 *            the child entry that changed its value
-	 */
-	protected void valueChanged(PropertySheetEntry child) {
-		for (int i = 0; i < values.length; i++) {
-			IPropertySource source = getPropertySource(values[i]);
-			source.setPropertyValue(child.getDescriptor().getId(), child
-					.getEditValue(i));
-		}
-
-		// inform our parent
-		if (parent != null) {
-			parent.valueChanged(this);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetPage.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetPage.java
deleted file mode 100644
index 10259ad..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetPage.java
+++ /dev/null
@@ -1,595 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Gunnar Wagenknecht - fix for bug 21756 [PropertiesView] property view sorting
- *******************************************************************************/
-
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.help.IContext;
-
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSource;
-import org.eclipse.swt.dnd.DragSourceAdapter;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.HelpEvent;
-import org.eclipse.swt.events.HelpListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-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.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.internal.ConfigureColumnsDialog;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.window.SameShellProvider;
-
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.ISaveablePart;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.help.IContextComputer;
-import org.eclipse.ui.help.IWorkbenchHelpSystem;
-import org.eclipse.ui.internal.views.ViewsPlugin;
-import org.eclipse.ui.internal.views.properties.PropertiesMessages;
-import org.eclipse.ui.part.CellEditorActionHandler;
-import org.eclipse.ui.part.Page;
-
-/**
- * The standard implementation of property sheet page which presents
- * a table of property names and values obtained from the current selection
- * in the active workbench part.
- * <p>
- * This page obtains the information about what properties to display from
- * the current selection (which it tracks).
- * </p>
- * <p>
- * The model for this page is a hierarchy of <code>IPropertySheetEntry</code>.
- * The page may be configured with a custom model by setting the root entry.
- * <p>
- * If no root entry is set then a default model is created which uses the
- * <code>IPropertySource</code> interface to obtain the properties of
- * the current selection. This requires that the selected objects provide an
- * <code>IPropertySource</code> adapter (or implement
- * <code>IPropertySource</code> directly). This restiction can be overcome
- * by providing this page with an <code>IPropertySourceProvider</code>. If
- * supplied, this provider will be used by the default model to obtain a
- * property source for the current selection
- * </p>
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- *
- * @see IPropertySource
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class PropertySheetPage extends Page implements IPropertySheetPage, IAdaptable {
-    /**
-     * Help context id
-     * (value <code>"org.eclipse.ui.property_sheet_page_help_context"</code>).
-     */
-    public static final String HELP_CONTEXT_PROPERTY_SHEET_PAGE = "org.eclipse.ui.property_sheet_page_help_context"; //$NON-NLS-1$
-
-    private PropertySheetViewer viewer;
-    
-    private PropertySheetSorter sorter;
-
-    private IPropertySheetEntry rootEntry;
-
-    private IPropertySourceProvider provider;
-
-    private DefaultsAction defaultsAction;
-
-    private FilterAction filterAction;
-
-    private CategoriesAction categoriesAction;
-
-    private CopyPropertyAction copyAction;
-
-    private ICellEditorActivationListener cellEditorActivationListener;
-
-    private CellEditorActionHandler cellEditorActionHandler;
-
-    private Clipboard clipboard;
-
-	private IWorkbenchPart sourcePart;
-
-	/**
-	 * Part listener which cleans up this page when the source part is closed.
-	 * This is hooked only when there is a source part.
-	 * 
-	 * @since 3.2
-	 */
-	private class PartListener implements IPartListener {
-		public void partActivated(IWorkbenchPart part) {
-		}
-
-		public void partBroughtToTop(IWorkbenchPart part) {
-		}
-
-		public void partClosed(IWorkbenchPart part) {
-			if (sourcePart == part) {
-				sourcePart = null;
-				if (viewer != null && !viewer.getControl().isDisposed()) {
-					viewer.setInput(new Object[0]);
-				}
-			}
-		}
-
-		public void partDeactivated(IWorkbenchPart part) {
-		}
-
-		public void partOpened(IWorkbenchPart part) {
-		}
-	}
-	
-	private PartListener partListener = new PartListener();
-
-	private Action columnsAction;
-	
-    /**
-     * Creates a new property sheet page.
-     */
-    public PropertySheetPage() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on <code>IPage</code>.
-     */
-    public void createControl(Composite parent) {
-        // create a new viewer
-        viewer = new PropertySheetViewer(parent);
-        viewer.setSorter(sorter);
-        
-        // set the model for the viewer
-        if (rootEntry == null) {
-            // create a new root
-            PropertySheetEntry root = new PropertySheetEntry();
-            if (provider != null) {
-				// set the property source provider
-                root.setPropertySourceProvider(provider);
-			}
-            rootEntry = root;
-        }
-        viewer.setRootEntry(rootEntry);
-        viewer.addActivationListener(getCellEditorActivationListener());
-        // add a listener to track when the entry selection changes
-        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-            public void selectionChanged(SelectionChangedEvent event) {
-                handleEntrySelection(event.getSelection());
-            }
-        });
-        initDragAndDrop();
-        makeActions();
-
-        // Create the popup menu for the page.
-        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
-        menuMgr.add(copyAction);
-        menuMgr.add(new Separator());
-        menuMgr.add(defaultsAction);
-        Menu menu = menuMgr.createContextMenu(viewer.getControl());
-        viewer.getControl().setMenu(menu);
-
-        // Set help on the viewer
-        viewer.getControl().addHelpListener(new HelpListener() {
-            /*
-             * @see HelpListener#helpRequested(HelpEvent)
-             */
-            public void helpRequested(HelpEvent e) {
-                // Get the context for the selected item
-                IStructuredSelection selection = (IStructuredSelection) viewer
-                        .getSelection();
-                if (!selection.isEmpty()) {
-                    IPropertySheetEntry entry = (IPropertySheetEntry) selection
-                            .getFirstElement();
-                    Object helpContextId = entry.getHelpContextIds();
-                    if (helpContextId != null) {
-                    	IWorkbenchHelpSystem helpSystem = PlatformUI.getWorkbench().getHelpSystem();
-                    	
-                        // Since 2.0 the only valid type for helpContextIds
-                        // is a String (a single id).
-                        if (helpContextId instanceof String) {
-                            helpSystem.displayHelp((String) helpContextId);
-                            return;
-                        }
-
-                        // For backward compatibility we have to handle
-                        // and array of contexts (Strings and/or IContexts)
-                        // or a context computer.
-                        Object context= getFirstContext(helpContextId, e);
-                        if (context instanceof IContext) {
-							helpSystem.displayHelp((IContext) context);
-						} else if (context instanceof String) {
-							helpSystem.displayHelp((String) context);
-						}
-                        return;
-                    }
-                }
-
-                // No help for the selection so show page help
-                PlatformUI.getWorkbench().getHelpSystem().displayHelp(HELP_CONTEXT_PROPERTY_SHEET_PAGE);
-            }
-
-			/**
-			 * Returns the first help context.
-			 * 
-			 * @param helpContext the help context which is either an array of contexts (strings
-			 *            and/or {@linkplain IContext}s) or an {@link IContextComputer}
-			 * 
-			 * @param e the help event
-			 * @return the first context which is either a <code>String</code>, {@link IContext} or
-			 *         <code>null</code> if none
-			 * @deprecated As of 2.0, nested contexts are no longer supported by the help support
-			 *             system
-			 */
-			private Object getFirstContext(Object helpContext, HelpEvent e) {
-				Object[] contexts;
-				if (helpContext instanceof IContextComputer) {
-				    // get local contexts
-					contexts= ((IContextComputer)helpContext)
-				            .getLocalContexts(e);
-				} else {
-					contexts= (Object[])helpContext;
-				}
-
-				if (contexts.length > 0)
-					return contexts[0];
-				return null;
-			}
-        });
-    }
-
-    /**
-     * The <code>PropertySheetPage</code> implementation of this <code>IPage</code> method
-     * disposes of this page's entries.
-     */
-    public void dispose() {
-        super.dispose();
-        if (sourcePart != null) {
-        	sourcePart.getSite().getPage().removePartListener(partListener);
-        }
-        if (rootEntry != null) {
-            rootEntry.dispose();
-            rootEntry = null;
-        }
-        if (clipboard != null) {
-            clipboard.dispose();
-            clipboard = null;
-        }
-    }
-
-    /**
-     * The <code>PropertySheetPage</code> implementation of this <code>IAdaptable</code> method
-     * handles the <code>ISaveablePart</code> adapter by delegating to the source part.
-     * 
-     * @since 3.2
-     */
-    public Object getAdapter(Class adapter) {
-		if (ISaveablePart.class.equals(adapter)) {
-			return getSaveablePart();
-		}
-    	return null;
-    }
-    
-	/**
-	 * Returns an <code>ISaveablePart</code> that delegates to the source part
-	 * for the current page if it implements <code>ISaveablePart</code>, or
-	 * <code>null</code> otherwise.
-	 * 
-	 * @return an <code>ISaveablePart</code> or <code>null</code>
-	 * @since 3.2
-	 */
-	protected ISaveablePart getSaveablePart() {
-		if (sourcePart instanceof ISaveablePart) {
-			return (ISaveablePart) sourcePart;
-		}
-		return null;
-	}
-    
-    /**
-     * Returns the cell editor activation listener for this page
-     * @return ICellEditorActivationListener the cell editor activation listener for this page
-     */
-    private ICellEditorActivationListener getCellEditorActivationListener() {
-        if (cellEditorActivationListener == null) {
-            cellEditorActivationListener = new ICellEditorActivationListener() {
-                public void cellEditorActivated(CellEditor cellEditor) {
-                    if (cellEditorActionHandler != null) {
-						cellEditorActionHandler.addCellEditor(cellEditor);
-					}
-                }
-
-                public void cellEditorDeactivated(CellEditor cellEditor) {
-                    if (cellEditorActionHandler != null) {
-						cellEditorActionHandler.removeCellEditor(cellEditor);
-					}
-                }
-            };
-        }
-        return cellEditorActivationListener;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPage (and Page).
-     */
-    public Control getControl() {
-        if (viewer == null) {
-			return null;
-		}
-        return viewer.getControl();
-    }
-
-    /**
-     * Handles a selection change in the entry table.
-     *
-     * @param selection the new selection
-     */
-    public void handleEntrySelection(ISelection selection) {
-        if (defaultsAction != null) {
-            if (selection.isEmpty()) {
-                defaultsAction.setEnabled(false);
-                return;
-            }
-            // see if item is editable
-            boolean editable = viewer.getActiveCellEditor() != null;
-            defaultsAction.setEnabled(editable);
-        }
-    }
-
-    /**
-     * Adds drag and drop support.
-     */
-    protected void initDragAndDrop() {
-        int operations = DND.DROP_COPY;
-        Transfer[] transferTypes = new Transfer[] { TextTransfer.getInstance() };
-        DragSourceListener listener = new DragSourceAdapter() {
-            public void dragSetData(DragSourceEvent event) {
-                performDragSetData(event);
-            }
-
-            public void dragFinished(DragSourceEvent event) {
-                //Nothing to do here
-            }
-        };
-        DragSource dragSource = new DragSource(
-                viewer.getControl(), operations);
-        dragSource.setTransfer(transferTypes);
-        dragSource.addDragListener(listener);
-    }
-
-    /**
-     * The user is attempting to drag.  Add the appropriate
-     * data to the event.
-     * @param event The event sent from the drag and drop support.
-     */
-    void performDragSetData(DragSourceEvent event) {
-        // Get the selected property
-        IStructuredSelection selection = (IStructuredSelection) viewer
-                .getSelection();
-        if (selection.isEmpty()) {
-			return;
-		}
-        // Assume single selection
-        IPropertySheetEntry entry = (IPropertySheetEntry) selection
-                .getFirstElement();
-
-        // Place text as the data
-        StringBuffer buffer = new StringBuffer();
-        buffer.append(entry.getDisplayName());
-        buffer.append("\t"); //$NON-NLS-1$
-        buffer.append(entry.getValueAsString());
-
-        event.data = buffer.toString();
-    }
-
-    /**
-     * Make action objects.
-     */
-    private void makeActions() {
-        ISharedImages sharedImages = PlatformUI.getWorkbench()
-                .getSharedImages();
-
-        // Restore Default Value
-        defaultsAction = new DefaultsAction(viewer, "defaults"); //$NON-NLS-1$
-        defaultsAction.setText(PropertiesMessages.Defaults_text);
-        defaultsAction.setToolTipText(PropertiesMessages.Defaults_toolTip);
-        defaultsAction
-                .setImageDescriptor(ViewsPlugin.getViewImageDescriptor("elcl16/defaults_ps.gif")); //$NON-NLS-1$
-        defaultsAction
-                .setDisabledImageDescriptor(ViewsPlugin.getViewImageDescriptor("dlcl16/defaults_ps.gif")); //$NON-NLS-1$
-        defaultsAction.setEnabled(false);
-
-        // Show Advanced Properties
-        filterAction = new FilterAction(viewer, "filter"); //$NON-NLS-1$
-        filterAction.setText(PropertiesMessages.Filter_text);
-        filterAction.setToolTipText(PropertiesMessages.Filter_toolTip);
-        filterAction
-                .setImageDescriptor(ViewsPlugin.getViewImageDescriptor("elcl16/filter_ps.gif")); //$NON-NLS-1$
-        filterAction.setChecked(false);
-
-        // Show Categories
-        categoriesAction = new CategoriesAction(viewer, "categories"); //$NON-NLS-1$
-        categoriesAction.setText(PropertiesMessages.Categories_text);
-        categoriesAction.setToolTipText(PropertiesMessages.Categories_toolTip);
-        categoriesAction
-                .setImageDescriptor(ViewsPlugin.getViewImageDescriptor("elcl16/tree_mode.gif")); //$NON-NLS-1$
-        categoriesAction.setChecked(true);
-
-        // Columns...
-        columnsAction = new Action(PropertiesMessages.Columns_text){
-        	public void run() {
-        		Tree tree = (Tree) viewer.getControl();
-        		new ConfigureColumnsDialog(new SameShellProvider(tree), tree).open();
-        	}
-		};
-        columnsAction.setToolTipText(PropertiesMessages.Columns_toolTip);
-        
-        // Copy
-        Shell shell = viewer.getControl().getShell();
-        clipboard = new Clipboard(shell.getDisplay());
-        copyAction = new CopyPropertyAction(viewer, "copy", clipboard); //$NON-NLS-1$
-        copyAction.setText(PropertiesMessages.CopyProperty_text);
-        copyAction.setImageDescriptor(sharedImages
-                .getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPage (and Page).
-     */
-    public void makeContributions(IMenuManager menuManager,
-            IToolBarManager toolBarManager, IStatusLineManager statusLineManager) {
-
-        // add actions to the tool bar
-        toolBarManager.add(categoriesAction);
-        toolBarManager.add(filterAction);
-        toolBarManager.add(defaultsAction);
-
-        // add actions to the menu
-        menuManager.add(categoriesAction);
-        menuManager.add(filterAction);
-        menuManager.add(columnsAction);
-
-        // set status line manager into the viewer
-        viewer.setStatusLineManager(statusLineManager);
-    }
-
-    /**
-     * Updates the model for the viewer.
-     * <p>
-     * Note that this means ensuring that the model reflects the state
-     * of the current viewer input.
-     * </p>
-     */
-    public void refresh() {
-        if (viewer == null) {
-			return;
-		}
-        // calling setInput on the viewer will cause the model to refresh
-        viewer.setInput(viewer.getInput());
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ISelectionListener.
-     */
-    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-        if (viewer == null) {
-			return;
-		}
-
-        if (sourcePart != null) {
-        	sourcePart.getSite().getPage().removePartListener(partListener);
-        	sourcePart = null;
-        }
-        
-        // change the viewer input since the workbench selection has changed.
-        if (selection instanceof IStructuredSelection) {
-        	sourcePart = part;
-            viewer.setInput(((IStructuredSelection) selection).toArray());
-        }
-
-        if (sourcePart != null) {
-        	sourcePart.getSite().getPage().addPartListener(partListener);
-        }
-    }
-
-    /**
-     * The <code>PropertySheetPage</code> implementation of this <code>IPage</code> method
-     * calls <code>makeContributions</code> for backwards compatibility with
-     * previous versions of <code>IPage</code>.
-     * <p>
-     * Subclasses may reimplement.
-     * </p>
-     */
-    public void setActionBars(IActionBars actionBars) {
-        super.setActionBars(actionBars);
-        cellEditorActionHandler = new CellEditorActionHandler(actionBars);
-        cellEditorActionHandler.setCopyAction(copyAction);
-    }
-
-    /**
-     * Sets focus to a part in the page.
-     */
-    public void setFocus() {
-        viewer.getControl().setFocus();
-    }
-
-    /**
-     * Sets the given property source provider as
-     * the property source provider.
-     * <p>
-     * Calling this method is only valid if you are using
-     * this page's default root entry.
-     * </p>
-     * @param newProvider the property source provider
-     */
-    public void setPropertySourceProvider(IPropertySourceProvider newProvider) {
-        provider = newProvider;
-        if (rootEntry instanceof PropertySheetEntry) {
-            ((PropertySheetEntry) rootEntry)
-                    .setPropertySourceProvider(provider);
-            // the following will trigger an update
-            viewer.setRootEntry(rootEntry);
-        }
-    }
-
-    /**
-     * Sets the given entry as the model for the page.
-     *
-     * @param entry the root entry
-     */
-    public void setRootEntry(IPropertySheetEntry entry) {
-        rootEntry = entry;
-        if (viewer != null) {
-			// the following will trigger an update
-            viewer.setRootEntry(rootEntry);
-		}
-    }
-
-    /**
-	 * Sets the sorter used for sorting categories and entries in the viewer
-	 * of this page.
-	 * <p>
-	 * The default sorter sorts categories and entries alphabetically.
-	 * </p>
-	 * @param sorter the sorter to set (<code>null</code> will reset to the
-	 * default sorter)
-     * @since 3.1
-	 */
-	protected void setSorter(PropertySheetSorter sorter) {
-		this.sorter = sorter;
-        if (viewer != null) {
-        	viewer.setSorter(sorter);
-        	
-        	// the following will trigger an update
-        	if(null != viewer.getRootEntry()) {
-				viewer.setRootEntry(rootEntry);
-			}
-        }
-	}
-
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetSorter.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetSorter.java
deleted file mode 100644
index 336c9e1..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetSorter.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Gunnar Wagenknecht and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gunnar Wagenknecht - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import java.text.Collator; // can't use ICU, in public API
-import java.util.Arrays;
-import java.util.Comparator;
-
-/**
- * Class used by {@link org.eclipse.ui.views.properties.PropertySheetPage} to
- * sort properties.
- * <p>
- * The default implementation sorts alphabetically. Subclasses may overwrite to
- * implement custom sorting.
- * </p>
- *
- * @since 3.1
- */
-public class PropertySheetSorter  {
-
-	/**
-	 * The collator used to sort strings.
-	 */
-	private Collator collator;
-
-	/**
-	 * Creates a new sorter, which uses the default collator to sort strings.
-	 */
-	public PropertySheetSorter() {
-		this(Collator.getInstance());
-	}
-
-	/**
-	 * Creates a new sorter, which uses the given collator to sort strings.
-	 * 
-	 * @param collator
-	 *            the collator to use to sort strings
-	 */
-	public PropertySheetSorter(Collator collator) {
-		this.collator = collator;
-	}
-
-	/**
-	 * Returns a negative, zero, or positive number depending on whether the
-	 * first element is less than, equal to, or greater than the second element.
-	 * <p>
-	 * The default implementation of this method uses the collator to
-	 * compare the display names. Subclasses may override.
-	 * </p>
-	 * 
-	 * @param entryA
-	 *            the first element
-	 * @param entryB
-	 *            the second element
-	 * @return a negative number if the first element is less than the second
-	 *         element; the value <code>0</code> if the first element is equal
-	 *         to the second element; and a positive number if the first element
-	 *         is greater than the second element
-	 */
-	public int compare(IPropertySheetEntry entryA, IPropertySheetEntry entryB) {
-		return getCollator().compare(entryA.getDisplayName(),
-				entryB.getDisplayName());
-	}
-
-	/**
-	 * Returns a negative, zero, or positive number depending on whether the
-	 * first element is less than, equal to, or greater than the second element.
-	 * <p>
-	 * The default implementation of this method uses the collator to
-	 * compare the strings. Subclasses may override.
-	 * </p>
-	 * 
-	 * @param categoryA
-	 *            the first element
-	 * @param categoryB
-	 *            the second element
-	 * @return a negative number if the first element is less than the second
-	 *         element; the value <code>0</code> if the first element is equal
-	 *         to the second element; and a positive number if the first element
-	 *         is greater than the second element
-	 */
-	public int compareCategories(String categoryA, String categoryB) {
-		return getCollator().compare(categoryA, categoryB);
-	}
-
-	/**
-	 * Returns the collator used to sort strings.
-	 * 
-	 * @return the collator used to sort strings
-	 */
-	protected Collator getCollator() {
-		return collator;
-	}
-
-	/**
-	 * Sorts the given elements in-place, modifying the given array.
-	 * <p>
-	 * The default implementation of this method uses the java.util.Arrays#sort
-	 * algorithm on the given array, calling <code>compare</code> to compare
-	 * elements.
-	 * </p>
-	 * <p>
-	 * Subclasses may reimplement this method to provide a more optimized
-	 * implementation.
-	 * </p>
-	 * 
-	 * @param entries
-	 *            the elements to sort
-	 */
-	public void sort(IPropertySheetEntry[] entries) {
-		Arrays.sort(entries, new Comparator() {
-			public int compare(Object a, Object b) {
-				return PropertySheetSorter.this.compare(
-						(IPropertySheetEntry) a, (IPropertySheetEntry) b);
-			}
-		});
-	}
-
-	/**
-	 * Sorts the given categories in-place, modifying the given array.
-	 * 
-	 * @param categories
-	 *            the categories to sort
-	 */
-	void sort(PropertySheetCategory[] categories) {
-		Arrays.sort(categories, new Comparator() {
-			public int compare(Object a, Object b) {
-				return PropertySheetSorter.this.compareCategories(
-						((PropertySheetCategory) a).getCategoryName(),
-						((PropertySheetCategory) b).getCategoryName());
-			}
-		});
-	}
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetViewer.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetViewer.java
deleted file mode 100644
index 744e604..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/PropertySheetViewer.java
+++ /dev/null
@@ -1,1390 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Gunnar Wagenknecht - fix for bug 21756 [PropertiesView] property view sorting
- *******************************************************************************/
-
-package org.eclipse.ui.views.properties;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TreeEditor;
-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.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TreeEvent;
-import org.eclipse.swt.events.TreeListener;
-import org.eclipse.swt.graphics.Image;
-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.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.internal.views.properties.PropertiesMessages;
-
-/**
- * The PropertySheetViewer displays the properties of objects. The model for the
- * viewer consists of a hierarchy of <code>IPropertySheetEntry</code>.
- * <p>
- * This viewer also supports the optional catogorization of the first level
- * <code>IPropertySheetEntry</code> s by using instances of
- * <code>PropertySheetCategory</code>.
- *  
- */
-/* package */
-class PropertySheetViewer extends Viewer {
-    // The input objects for the viewer
-    private Object[] input;
-
-    // The root entry of the viewer
-    private IPropertySheetEntry rootEntry;
-
-    // The current categories
-    private PropertySheetCategory[] categories;
-
-    // SWT widgets
-    private Tree tree;
-
-    /**
-     * Maintain a map from the PropertySheet entry to its
-     * corresponding TreeItem. This is used in 'findItem' to
-     * greatly increase the performance.
-     */
-    private HashMap entryToItemMap = new HashMap();
-    
-    private TreeEditor treeEditor;
-
-    private static String[] columnLabels = {
-            PropertiesMessages.PropertyViewer_property, PropertiesMessages.PropertyViewer_value };
-
-    private static String MISCELLANEOUS_CATEGORY_NAME = PropertiesMessages.PropertyViewer_misc;
-
-    // Cell editor support.
-    private int columnToEdit = 1;
-
-    private CellEditor cellEditor;
-
-    private IPropertySheetEntryListener entryListener;
-
-    private ICellEditorListener editorListener;
-
-    // Flag to indicate if categories (if any) should be shown
-    private boolean isShowingCategories = true;
-
-    // Flag to indicate expert properties should be shown
-    private boolean isShowingExpertProperties = false;
-
-    // The status line manager for showing messages
-    private IStatusLineManager statusLineManager;
-
-    // Cell editor activation listeners
-    private ListenerList activationListeners = new ListenerList();
-    
-    // the property sheet sorter
-    private PropertySheetSorter sorter = new PropertySheetSorter();
-
-    /**
-     * Creates a property sheet viewer on a newly-created tree control
-     * under the given parent. The viewer has no input, and no root entry.
-     * 
-     * @param parent
-     *            the parent control
-     */
-    public PropertySheetViewer(Composite parent) {
-        tree = new Tree(parent, SWT.FULL_SELECTION | SWT.SINGLE
-                | SWT.HIDE_SELECTION);
-
-        // configure the widget
-        tree.setLinesVisible(true);
-        tree.setHeaderVisible(true);
-
-        // configure the columns
-        addColumns();
-
-        // add our listeners to the widget
-        hookControl();
-
-        // create a new tree editor
-        treeEditor = new TreeEditor(tree);
-
-        // create the entry and editor listener
-        createEntryListener();
-        createEditorListener();
-    }
-
-    /**
-     * Activate a cell editor for the given selected tree item.
-     * 
-     * @param item
-     *            the selected tree item
-     */
-    private void activateCellEditor(TreeItem item) {
-        // ensure the cell editor is visible
-        tree.showSelection();
-
-        // Get the entry for this item
-        IPropertySheetEntry activeEntry = (IPropertySheetEntry) item.getData();
-
-        // Get the cell editor for the entry.
-        // Note that the editor parent must be the Tree control
-        cellEditor = activeEntry.getEditor(tree);
-
-        if (cellEditor == null) {
-			// unable to create the editor
-            return;
-		}
-
-        // activate the cell editor
-        cellEditor.activate();
-
-        // if the cell editor has no control we can stop now
-        Control control = cellEditor.getControl();
-        if (control == null) {
-            cellEditor.deactivate();
-            cellEditor = null;
-            return;
-        }
-
-        // add our editor listener
-        cellEditor.addListener(editorListener);
-
-        // set the layout of the tree editor to match the cell editor
-        CellEditor.LayoutData layout = cellEditor.getLayoutData();
-        treeEditor.horizontalAlignment = layout.horizontalAlignment;
-        treeEditor.grabHorizontal = layout.grabHorizontal;
-        treeEditor.minimumWidth = layout.minimumWidth;
-        treeEditor.setEditor(control, item, columnToEdit);
-
-        // set the error text from the cel editor
-        setErrorMessage(cellEditor.getErrorMessage());
-
-        // give focus to the cell editor
-        cellEditor.setFocus();
-
-        // notify of activation
-        fireCellEditorActivated(cellEditor);
-    }
-
-    /**
-     * Adds a cell editor activation listener. Has no effect if an identical
-     * activation listener is already registered.
-     * 
-     * @param listener
-     *            a cell editor activation listener
-     */
-    /* package */
-    void addActivationListener(ICellEditorActivationListener listener) {
-        activationListeners.add(listener);
-    }
-
-    /**
-     * Add columns to the tree and set up the layout manager accordingly.
-     */
-    private void addColumns() {
-
-        // create the columns
-        TreeColumn[] columns = tree.getColumns();
-        for (int i = 0; i < columnLabels.length; i++) {
-            String string = columnLabels[i];
-            if (string != null) {
-                TreeColumn column;
-                if (i < columns.length) {
-					column = columns[i];
-				} else {
-					column = new TreeColumn(tree, 0);
-				}
-                column.setText(string);
-            }
-        }
-
-        tree.addControlListener(new ControlAdapter() {
-            public void controlResized(ControlEvent e) {
-                Rectangle area = tree.getClientArea();
-                TreeColumn[] columns = tree.getColumns();
-                if (area.width > 0) {
-                    columns[0].setWidth(area.width * 40 / 100);
-                    columns[1].setWidth(area.width - columns[0].getWidth() - 4);
-                    tree.removeControlListener(this);
-                }
-            }
-        });
-
-    }
-
-    /**
-     * Asks the entry currently being edited to apply its current cell editor
-     * value.
-     */
-    private void applyEditorValue() {
-        TreeItem treeItem = treeEditor.getItem();
-        // treeItem can be null when view is opened
-        if (treeItem == null || treeItem.isDisposed()) {
-			return;
-		}
-        IPropertySheetEntry entry = (IPropertySheetEntry) treeItem.getData();
-        entry.applyEditorValue();
-    }
-
-    /**
-     * Creates the child items for the given widget (item or tree). This
-     * method is called when the item is expanded for the first time or when an
-     * item is assigned as the root of the tree.
-     * @param widget TreeItem or Tree to create the children in.
-     */
-    private void createChildren(Widget widget) {
-        // get the current child items
-        TreeItem[] childItems = getChildItems(widget);
-
-        if (childItems.length > 0) {
-            Object data = childItems[0].getData();
-            if (data != null) {
-				// children already there!
-                return;
-			}
-            // remove the dummy
-            childItems[0].dispose();
-        }
-
-        // get the children and create their tree items
-        Object node = widget.getData();
-        List children = getChildren(node);
-        if (children.isEmpty()) {
-			// this item does't actually have any children
-            return;
-		}
-        for (int i = 0; i < children.size(); i++) {
-            // create a new tree item
-            createItem(children.get(i), widget, i);
-        }
-    }
-
-    /**
-     * Creates a new cell editor listener.
-     */
-    private void createEditorListener() {
-        editorListener = new ICellEditorListener() {
-            public void cancelEditor() {
-                deactivateCellEditor();
-            }
-
-            public void editorValueChanged(boolean oldValidState,
-                    boolean newValidState) {
-                //Do nothing
-            }
-
-            public void applyEditorValue() {
-                //Do nothing
-            }
-        };
-    }
-
-    /**
-     * Creates a new property sheet entry listener.
-     */
-    private void createEntryListener() {
-        entryListener = new IPropertySheetEntryListener() {
-            public void childEntriesChanged(IPropertySheetEntry entry) {
-                // update the children of the given entry
-                if (entry == rootEntry) {
-					updateChildrenOf(entry, tree);
-				} else {
-                    TreeItem item = findItem(entry);
-                    if (item != null) {
-						updateChildrenOf(entry, item);
-					}
-                }
-            }
-
-            public void valueChanged(IPropertySheetEntry entry) {
-                // update the given entry
-                TreeItem item = findItem(entry);
-                if (item != null) {
-					updateEntry(entry, item);
-				}
-            }
-
-            public void errorMessageChanged(IPropertySheetEntry entry) {
-                // update the error message
-                setErrorMessage(entry.getErrorText());
-            }
-        };
-    }
-
-    /**
-     * Creates a new tree item, sets the given entry or category (node)in
-     * its user data field, and adds a listener to the node if it is an entry.
-     * 
-     * @param node
-     *            the entry or category associated with this item
-     * @param parent
-     *            the parent widget
-     * @param index
-     *            indicates the position to insert the item into its parent
-     */
-    private void createItem(Object node, Widget parent, int index) {
-        // create the item
-        TreeItem item;
-        if (parent instanceof TreeItem) {
-			item = new TreeItem((TreeItem) parent, SWT.NONE, index);
-		} else {
-			item = new TreeItem((Tree) parent, SWT.NONE, index);
-		}
-
-        // set the user data field
-        item.setData(node);
-        
-        // Cache the entry <-> tree item relationship 
-        entryToItemMap.put(node, item);
-        
-        // Always ensure that if the tree item goes away that it's
-        // removed from the cache
-        item.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				Object possibleEntry = e.widget.getData();
-				if (possibleEntry != null)
-					entryToItemMap.remove(possibleEntry);
-			}
-        });        
-
-        // add our listener
-        if (node instanceof IPropertySheetEntry) {
-			((IPropertySheetEntry) node)
-                    .addPropertySheetEntryListener(entryListener);
-		}
-
-        // update the visual presentation
-        if (node instanceof IPropertySheetEntry) {
-			updateEntry((IPropertySheetEntry) node, item);
-		} else {
-			updateCategory((PropertySheetCategory) node, item);
-		}
-    }
-
-    /**
-     * Deactivate the currently active cell editor.
-     */
-    /* package */
-    void deactivateCellEditor() {
-        treeEditor.setEditor(null, null, columnToEdit);
-        if (cellEditor != null) {
-            cellEditor.deactivate();
-            fireCellEditorDeactivated(cellEditor);
-            cellEditor.removeListener(editorListener);
-            cellEditor = null;
-        }
-        // clear any error message from the editor
-        setErrorMessage(null);
-    }
-
-    /**
-     * Sends out a selection changed event for the entry tree to all registered
-     * listeners.
-     */
-    private void entrySelectionChanged() {
-        SelectionChangedEvent changeEvent = new SelectionChangedEvent(this,
-                getSelection());
-        fireSelectionChanged(changeEvent);
-    }
-
-    /**
-     * Return a tree item in the property sheet that has the same entry in
-     * its user data field as the supplied entry. Return <code>null</code> if
-     * there is no such item.
-     * 
-     * @param entry
-     *            the entry to serach for
-     * @return the TreeItem for the entry or <code>null</code> if
-     * there isn't one.
-     */
-    private TreeItem findItem(IPropertySheetEntry entry) {
-        // Iterate through treeItems to find item
-        TreeItem[] items = tree.getItems();
-        for (int i = 0; i < items.length; i++) {
-            TreeItem item = items[i];
-            TreeItem findItem = findItem(entry, item);
-            if (findItem != null) {
-				return findItem;
-			}
-        }
-        return null;
-    }
-
-    /**
-     * Return a tree item in the property sheet that has the same entry in
-     * its user data field as the supplied entry. Return <code>null</code> if
-     * there is no such item.
-     * 
-     * @param entry
-     *            the entry to search for
-     * @param item
-     *            the item look in
-     * @return the TreeItem for the entry or <code>null</code> if
-     * there isn't one.
-     */
-    private TreeItem findItem(IPropertySheetEntry entry, TreeItem item) {
-    	// If we can find the TreeItem in the cache, just return it
-    	Object mapItem = entryToItemMap.get(entry);
-    	if (mapItem != null && mapItem instanceof TreeItem)
-    		return (TreeItem) mapItem;
-    	
-        // compare with current item
-        if (entry == item.getData()) {
-			return item;
-		}
-
-        // recurse over children
-        TreeItem[] items = item.getItems();
-        for (int i = 0; i < items.length; i++) {
-            TreeItem childItem = items[i];
-            TreeItem findItem = findItem(entry, childItem);
-            if (findItem != null) {
-				return findItem;
-			}
-        }
-        return null;
-    }
-
-    /**
-     * Notifies all registered cell editor activation listeners of a cell editor
-     * activation.
-     * 
-     * @param activatedCellEditor
-     *            the activated cell editor
-     */
-    private void fireCellEditorActivated(CellEditor activatedCellEditor) {
-        Object[] listeners = activationListeners.getListeners();
-        for (int i = 0; i < listeners.length; ++i) {
-            ((ICellEditorActivationListener) listeners[i])
-                    .cellEditorActivated(activatedCellEditor);
-        }
-    }
-
-    /**
-     * Notifies all registered cell editor activation listeners of a cell editor
-     * deactivation.
-     * 
-     * @param activatedCellEditor
-     *            the deactivated cell editor
-     */
-    private void fireCellEditorDeactivated(CellEditor activatedCellEditor) {
-        Object[] listeners = activationListeners.getListeners();
-        for (int i = 0; i < listeners.length; ++i) {
-            ((ICellEditorActivationListener) listeners[i])
-                    .cellEditorDeactivated(activatedCellEditor);
-        }
-    }
-
-    /**
-     * Returns the active cell editor of this property sheet viewer or
-     * <code>null</code> if no cell editor is active.
-     * 
-     * @return the active cell editor
-     */
-    public CellEditor getActiveCellEditor() {
-        return cellEditor;
-    }
-
-    private TreeItem[] getChildItems(Widget widget) {
-        if (widget instanceof Tree) {
-            return ((Tree) widget).getItems();
-        }
-        else if (widget instanceof TreeItem) {
-            return ((TreeItem) widget).getItems();
-        }
-        // shouldn't happen
-        return new TreeItem[0];
-    }
-    
-    /**
-     * Returns the sorted children of the given category or entry
-     *
-     * @param node a category or entry
-     * @return the children of the given category or entry
-     *  (element type <code>IPropertySheetEntry</code> or 
-     *  <code>PropertySheetCategory</code>)
-     */
-    private List getChildren(Object node) {
-        // cast the entry or category
-        IPropertySheetEntry entry = null;
-        PropertySheetCategory category = null;
-        if (node instanceof IPropertySheetEntry) {
-			entry = (IPropertySheetEntry) node;
-		} else {
-			category = (PropertySheetCategory) node;
-		}
-
-        // get the child entries or categories
-        List children;
-        if (category == null) {
-			children = getChildren(entry);
-		} else {
-			children = getChildren(category);
-		}
-
-        return children;
-    }
-
-    /**
-     * Returns the child entries of the given entry
-     * @param entry The entry to search
-     * 
-     * @return the children of the given entry (element type
-     *         <code>IPropertySheetEntry</code>)
-     */
-    private List getChildren(IPropertySheetEntry entry) {
-        // if the entry is the root and we are showing categories, and we have
-        // more than the
-        // defualt category, return the categories
-        if (entry == rootEntry && isShowingCategories) {
-            if (categories.length > 1
-                    || (categories.length == 1 && !categories[0]
-                            .getCategoryName().equals(
-                                    MISCELLANEOUS_CATEGORY_NAME))) {
-				return Arrays.asList(categories);
-			}
-        }
-
-        // return the sorted & filtered child entries
-        return getSortedEntries(getFilteredEntries(entry.getChildEntries()));
-    }
-
-    /**
-     * Returns the child entries of the given category
-     * 
-     * @param category The category to search
-     * 
-     * @return the children of the given category (element type
-     *         <code>IPropertySheetEntry</code>)
-     */
-    private List getChildren(PropertySheetCategory category) {
-        return getSortedEntries(getFilteredEntries(category.getChildEntries()));
-    }
-
-    /*
-     * (non-Javadoc) Method declared on Viewer.
-     */
-    public Control getControl() {
-        return tree;
-    }
-
-    /**
-     * Returns the entries which match the current filter.
-     *
-     * @param entries the entries to filter
-     * @return the entries which match the current filter
-     *  (element type <code>IPropertySheetEntry</code>)
-     */
-    private List getFilteredEntries(IPropertySheetEntry[] entries) {
-        // if no filter just return all entries
-        if (isShowingExpertProperties) {
-			return Arrays.asList(entries);
-		}
-
-        // check each entry for the filter
-        List filteredEntries = new ArrayList(entries.length);
-        for (int i = 0; i < entries.length; i++) {
-            IPropertySheetEntry entry = entries[i];
-            if (entry != null) {
-                String[] filters = entry.getFilters();
-                boolean expert = false;
-                if (filters != null) {
-                    for (int j = 0; j < filters.length; j++) {
-                        if (filters[j].equals(IPropertySheetEntry.FILTER_ID_EXPERT)) {
-                            expert = true;
-                            break;
-                        }
-                    }
-                }
-                if (!expert) {
-					filteredEntries.add(entry);
-				}
-            }
-        }
-        return filteredEntries;
-    }
-    
-    /**
-	 * Returns a sorted list of <code>IPropertySheetEntry</code> entries.
-	 * 
-	 * @param unsortedEntries
-	 *            unsorted list of <code>IPropertySheetEntry</code>
-	 * @return a sorted list of the specified entries
-	 */
-	private List getSortedEntries(List unsortedEntries) {
-		IPropertySheetEntry[] propertySheetEntries = (IPropertySheetEntry[]) unsortedEntries
-				.toArray(new IPropertySheetEntry[unsortedEntries.size()]);
-		sorter.sort(propertySheetEntries);
-		return Arrays.asList(propertySheetEntries);
-	}
-    
-
-    /**
-	 * The <code>PropertySheetViewer</code> implementation of this method
-	 * declared on <code>IInputProvider</code> returns the objects for which
-	 * the viewer is currently showing properties. It returns an
-	 * <code>Object[]</code> or <code>null</code>.
-	 */
-    public Object getInput() {
-        return input;
-    }
-
-    /**
-     * Returns the root entry for this property sheet viewer. The root entry is
-     * not visible in the viewer.
-     * 
-     * @return the root entry or <code>null</code>.
-     */
-    public IPropertySheetEntry getRootEntry() {
-        return rootEntry;
-    }
-
-    /**
-     * The <code>PropertySheetViewer</code> implementation of this
-     * <code>ISelectionProvider</code> method returns the result as a
-     * <code>StructuredSelection</code>.
-     * <p>
-     * Note that this method only includes <code>IPropertySheetEntry</code> in
-     * the selection (no categories).
-     * </p>
-     */
-    public ISelection getSelection() {
-        if (tree.getSelectionCount() == 0) {
-			return StructuredSelection.EMPTY;
-		}
-        TreeItem[] sel = tree.getSelection();
-        List entries = new ArrayList(sel.length);
-        for (int i = 0; i < sel.length; i++) {
-            TreeItem ti = sel[i];
-            Object data = ti.getData();
-            if (data instanceof IPropertySheetEntry) {
-				entries.add(data);
-			}
-        }
-        return new StructuredSelection(entries);
-    }
-
-    /**
-     * Selection in the viewer occurred. Check if there is an active cell
-     * editor. If yes, deactivate it and check if a new cell editor must be
-     * activated.
-     * 
-     * @param selection
-     *            the TreeItem that is selected
-     */
-    private void handleSelect(TreeItem selection) {
-        // deactivate the current cell editor
-        if (cellEditor != null) {
-            applyEditorValue();
-            deactivateCellEditor();
-        }
-
-        // get the new selection
-        TreeItem[] sel = new TreeItem[] { selection };
-        if (sel.length == 0) {
-            setMessage(null);
-            setErrorMessage(null);
-        } else {
-            Object object = sel[0].getData(); // assume single selection
-            if (object instanceof IPropertySheetEntry) {
-                // get the entry for this item
-                IPropertySheetEntry activeEntry = (IPropertySheetEntry) object;
-
-                // display the description for the item
-                setMessage(activeEntry.getDescription());
-
-                // activate a cell editor on the selection
-                activateCellEditor(sel[0]);
-            }
-        }
-        entrySelectionChanged();
-    }
-
-    /**
-     * The expand icon for a node in this viewer has been selected to collapse a
-     * subtree. Deactivate the cell editor
-     * 
-     * @param event
-     *            the SWT tree event
-     */
-    private void handleTreeCollapse(TreeEvent event) {
-        if (cellEditor != null) {
-            applyEditorValue();
-            deactivateCellEditor();
-        }
-    }
-
-    /**
-     * The expand icon for a node in this viewer has been selected to expand the
-     * subtree. Create the children 1 level deep.
-     * <p>
-     * Note that we use a "dummy" item (no user data) to show a "+" icon beside
-     * an item which has children before the item is expanded now that it is
-     * being expanded we have to create the real child items
-     * </p>
-     * 
-     * @param event
-     *            the SWT tree event
-     */
-    private void handleTreeExpand(TreeEvent event) {
-        createChildren(event.item);
-    }
-
-    /**
-     * Hides the categories.
-     */
-    /* package */
-    void hideCategories() {
-        isShowingCategories = false;
-        categories = null;
-        refresh();
-    }
-
-    /**
-     * Hides the expert properties.
-     */
-    /* package */
-    void hideExpert() {
-        isShowingExpertProperties = false;
-        refresh();
-    }
-
-    /**
-     * Establish this viewer as a listener on the control
-     */
-    private void hookControl() {
-        // Handle selections in the Tree
-        // Part1: Double click only (allow traversal via keyboard without
-        // activation
-        tree.addSelectionListener(new SelectionAdapter() {
-            /* (non-Javadoc)
-             * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-             */
-            public void widgetSelected(SelectionEvent e) {
-            	// The viewer only owns the status line when there is
-            	// no 'active' cell editor
-            	if (cellEditor == null || !cellEditor.isActivated()) {
-					updateStatusLine(e.item);
-				}
-			}
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetDefaultSelected(SelectionEvent e) {
-                handleSelect((TreeItem) e.item);
-            }
-        });
-        // Part2: handle single click activation of cell editor
-        tree.addMouseListener(new MouseAdapter() {
-            public void mouseDown(MouseEvent event) {
-                // only activate if there is a cell editor
-                Point pt = new Point(event.x, event.y);
-                TreeItem item = tree.getItem(pt);
-                if (item != null) {
-                    handleSelect(item);
-                }
-            }
-        });
-
-        // Add a tree listener to expand and collapse which
-        // allows for lazy creation of children
-        tree.addTreeListener(new TreeListener() {
-            public void treeExpanded(final TreeEvent event) {
-                handleTreeExpand(event);
-            }
-
-            public void treeCollapsed(final TreeEvent event) {
-                handleTreeCollapse(event);
-            }
-        });
-
-        // Refresh the tree when F5 pressed
-        tree.addKeyListener(new KeyAdapter() {
-            public void keyReleased(KeyEvent e) {
-                if (e.character == SWT.ESC) {
-					deactivateCellEditor();
-				} else if (e.keyCode == SWT.F5) {
-					// The following will simulate a reselect
-                    setInput(getInput());
-				}
-            }
-        });
-    }
-
-    /**
-     * Update the status line based on the data of item.
-     * @param item
-     */
-    protected void updateStatusLine(Widget item) {
-    	setMessage(null);
-    	setErrorMessage(null);
-    	
-    	// Update the status line
-    	if (item != null) {
-    		if (item.getData() instanceof PropertySheetEntry) {
-    			PropertySheetEntry psEntry = (PropertySheetEntry) item.getData();
-    			
-    			// For entries, show the description if any, else show the label
-    			String desc = psEntry.getDescription();
-    			if (desc != null && desc.length() > 0) {
-					setMessage(psEntry.getDescription());
-				} else {
-					setMessage(psEntry.getDisplayName());
-				}
-    		}
-    			
-    		else if (item.getData() instanceof PropertySheetCategory) {
-    			PropertySheetCategory psCat = (PropertySheetCategory) item.getData();
-    			setMessage(psCat.getCategoryName());
-    		}
-    	}
-	}
-
-    /**
-     * Updates all of the items in the tree.
-     * <p>
-     * Note that this means ensuring that the tree items reflect the state of
-     * the model (entry tree) it does not mean telling the model to update
-     * itself.
-     * </p>
-     */
-    public void refresh() {
-        if (rootEntry != null) {
-            updateChildrenOf(rootEntry, tree);
-        }
-    }
-
-    /**
-     * Removes the given cell editor activation listener from this viewer. Has
-     * no effect if an identical activation listener is not registered.
-     * 
-     * @param listener
-     *            a cell editor activation listener
-     */
-    /* package */
-    void removeActivationListener(ICellEditorActivationListener listener) {
-        activationListeners.remove(listener);
-    }
-
-    /**
-     * Remove the given item from the tree. Remove our listener if the
-     * item's user data is a an entry then set the user data to null
-     * 
-     * @param item
-     *            the item to remove
-     */
-    private void removeItem(TreeItem item) {
-        Object data = item.getData();
-        if (data instanceof IPropertySheetEntry) {
-			((IPropertySheetEntry) data)
-                    .removePropertySheetEntryListener(entryListener);
-		}
-        item.setData(null);
-        
-        // We explicitly remove the entry from the map since it's data has been null'd
-        entryToItemMap.remove(data);
-
-        item.dispose();
-    }
-
-    /**
-     * Reset the selected properties to their default values.
-     */
-    public void resetProperties() {
-        // Determine the selection
-        IStructuredSelection selection = (IStructuredSelection) getSelection();
-
-        // Iterate over entries and reset them
-        Iterator itr = selection.iterator();
-        while (itr.hasNext()) {
-			((IPropertySheetEntry) itr.next()).resetPropertyValue();
-		}
-    }
-
-    /**
-     * Sets the error message to be displayed in the status line.
-     * 
-     * @param errorMessage
-     *            the message to be displayed, or <code>null</code>
-     */
-    private void setErrorMessage(String errorMessage) {
-        // show the error message
-        if (statusLineManager != null) {
-			statusLineManager.setErrorMessage(errorMessage);
-		}
-    }
-
-    /**
-     * The <code>PropertySheetViewer</code> implementation of this method
-     * declared on <code>Viewer</code> method sets the objects for which the
-     * viewer is currently showing properties.
-     * <p>
-     * The input must be an <code>Object[]</code> or <code>null</code>.
-     * </p>
-     * 
-     * @param newInput
-     *            the input of this viewer, or <code>null</code> if none
-     */
-    public void setInput(Object newInput) {
-        // need to save any changed value when user clicks elsewhere
-        applyEditorValue();
-        // deactivate our cell editor
-        deactivateCellEditor();
-
-        // set the new input to the root entry
-        input = (Object[]) newInput;
-        if (input == null) {
-			input = new Object[0];
-		}
-
-        if (rootEntry != null) {
-            rootEntry.setValues(input);
-            // ensure first level children are visible
-            updateChildrenOf(rootEntry, tree);
-        }
-        
-        // Clear any previous StatusLine messages
-    	updateStatusLine(null);
-    }
-
-    /**
-     * Sets the message to be displayed in the status line. This message is
-     * displayed when there is no error message.
-     * 
-     * @param message
-     *            the message to be displayed, or <code>null</code>
-     */
-    private void setMessage(String message) {
-        // show the message
-        if (statusLineManager != null) {
-			statusLineManager.setMessage(message);
-		}
-    }
-
-    /**
-     * Sets the root entry for this property sheet viewer. The root entry is not
-     * visible in the viewer.
-     * 
-     * @param root
-     *            the root entry
-     */
-    public void setRootEntry(IPropertySheetEntry root) {
-        // If we have a root entry, remove our entry listener
-        if (rootEntry != null) {
-			rootEntry.removePropertySheetEntryListener(entryListener);
-		}
-
-        rootEntry = root;
-
-        // Set the root as user data on the tree
-        tree.setData(rootEntry);
-
-        // Add an IPropertySheetEntryListener to listen for entry change
-        // notifications
-        rootEntry.addPropertySheetEntryListener(entryListener);
-
-        // Pass our input to the root, this will trigger entry change
-        // callbacks to update this viewer
-        setInput(input);
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.jface.viewers.Viewer#setSelection(org.eclipse.jface.viewers.ISelection, boolean)
-     */
-    public void setSelection(ISelection selection, boolean reveal) {
-        //Do nothing by default
-    }
-
-    /**
-	 * Sets the sorter for this viewer.
-	 * <p>
-	 * The default sorter sorts categories and entries alphabetically. 
-	 * A viewer update needs to be triggered after the sorter has changed.
-	 * </p>
-	 * @param sorter the sorter to set (<code>null</code> will reset to the
-	 * default sorter)
-     * @since 3.1
-	 */
-	public void setSorter(PropertySheetSorter sorter) {
-		if (null == sorter) {
-			sorter = new PropertySheetSorter();
-		}
-		this.sorter = sorter;
-	}
-
-    /**
-     * Sets the status line manager this view will use to show messages.
-     * 
-     * @param manager
-     *            the status line manager
-     */
-    public void setStatusLineManager(IStatusLineManager manager) {
-        statusLineManager = manager;
-    }
-
-    /**
-     * Shows the categories.
-     */
-    /* package */
-    void showCategories() {
-        isShowingCategories = true;
-        refresh();
-    }
-
-    /**
-     * Shows the expert properties.
-     */
-    /* package */
-    void showExpert() {
-        isShowingExpertProperties = true;
-        refresh();
-    }
-
-    /**
-     * Updates the categories. Reuses old categories if possible.
-     */
-    private void updateCategories() {
-        // lazy initialize
-        if (categories == null) {
-			categories = new PropertySheetCategory[0];
-		}
-
-        // get all the filtered child entries of the root
-        List childEntries = getFilteredEntries(rootEntry.getChildEntries());
-
-        // if the list is empty, just set an empty categories array
-        if (childEntries.size() == 0) {
-            categories = new PropertySheetCategory[0];
-            return;
-        }
-
-        // cache old categories by their descriptor name
-        Map categoryCache = new HashMap(categories.length * 2 + 1);
-        for (int i = 0; i < categories.length; i++) {
-            categories[i].removeAllEntries();
-            categoryCache.put(categories[i].getCategoryName(), categories[i]);
-        }
-
-        // create a list of categories to get rid of
-        List categoriesToRemove = new ArrayList(Arrays.asList(categories));
-
-        // Determine the categories
-        PropertySheetCategory misc = (PropertySheetCategory) categoryCache
-                .get(MISCELLANEOUS_CATEGORY_NAME);
-        if (misc == null) {
-			misc = new PropertySheetCategory(MISCELLANEOUS_CATEGORY_NAME);
-		}
-        boolean addMisc = false;
-
-        for (int i = 0; i < childEntries.size(); i++) {
-            IPropertySheetEntry childEntry = (IPropertySheetEntry) childEntries
-                    .get(i);
-            String categoryName = childEntry.getCategory();
-            if (categoryName == null) {
-                misc.addEntry(childEntry);
-                addMisc = true;
-                categoriesToRemove.remove(misc);
-            } else {
-                PropertySheetCategory category = (PropertySheetCategory) categoryCache
-                        .get(categoryName);
-                if (category == null) {
-                    category = new PropertySheetCategory(categoryName);
-                    categoryCache.put(categoryName, category);
-                } else {
-                    categoriesToRemove.remove(category);
-                }
-                category.addEntry(childEntry);
-            }
-        }
-
-        // Add the PSE_MISC category if it has entries
-        if (addMisc) {
-			categoryCache.put(MISCELLANEOUS_CATEGORY_NAME, misc);
-		}
-        
-        // Sort the categories.
-        // Rather than just sorting categoryCache.values(), we'd like the original order to be preserved
-        // (with misc added at the end, if needed) before passing to the sorter.
-        ArrayList categoryList = new ArrayList();
-        Set seen = new HashSet(childEntries.size());
-        for (int i = 0; i < childEntries.size(); i++) {
-            IPropertySheetEntry childEntry = (IPropertySheetEntry) childEntries
-                    .get(i);
-            String categoryName = childEntry.getCategory();
-            if (categoryName != null && !seen.contains(categoryName)) {
-                seen.add(categoryName);
-                PropertySheetCategory category = (PropertySheetCategory) categoryCache
-                        .get(categoryName);
-                if (category != null) { 
-                    categoryList.add(category);
-                }
-            }
-        }
-        if (addMisc && !seen.contains(MISCELLANEOUS_CATEGORY_NAME)) {
-            categoryList.add(misc);
-        }
-        
-        PropertySheetCategory[] categoryArray = (PropertySheetCategory[]) categoryList
-        	.toArray(new PropertySheetCategory[categoryList.size()]);
-        sorter.sort(categoryArray);
-        categories = categoryArray;
-    }
-
-    /**
-     * Update the category (but not its parent or children).
-     * 
-     * @param category
-     *            the category to update
-     * @param item
-     *            the tree item for the given entry
-     */
-    private void updateCategory(PropertySheetCategory category,
-            TreeItem item) {
-        // ensure that backpointer is correct
-        item.setData(category);
-        
-        // Update the map accordingly
-        entryToItemMap.put(category, item);
-
-        // Update the name and value columns
-        item.setText(0, category.getCategoryName());
-        item.setText(1, ""); //$NON-NLS-1$
-
-        // update the "+" icon
-        if (category.getAutoExpand()) {
-            // we auto expand categories when they first appear
-            createChildren(item);
-            item.setExpanded(true);
-            category.setAutoExpand(false);
-        } else {
-            // we do not want to auto expand categories if the user has
-            // collpased them
-            updatePlus(category, item);
-        }
-    }
-
-    /**
-     * Update the child entries or categories of the given entry or category. If
-     * the given node is the root entry and we are showing categories then the
-     * child entries are categories, otherwise they are entries.
-     * 
-     * @param node
-     *            the entry or category whose children we will update
-     * @param widget
-     *            the widget for the given entry, either a
-     *            <code>TableTree</code> if the node is the root node or a
-     *            <code>TreeItem</code> otherwise.
-     */
-    private void updateChildrenOf(Object node, Widget widget) {
-        // cast the entry or category
-        IPropertySheetEntry entry = null;
-        PropertySheetCategory category = null;
-        if (node instanceof IPropertySheetEntry) {
-			entry = (IPropertySheetEntry) node;
-		} else {
-			category = (PropertySheetCategory) node;
-		}
-
-        // get the current child tree items
-        TreeItem[] childItems = getChildItems(widget);
-
-        // optimization! prune collapsed subtrees
-        TreeItem item = null;
-        if (widget instanceof TreeItem) {
-            item = (TreeItem) widget;
-        }
-        if (item != null && !item.getExpanded()) {
-            // remove all children
-            for (int i = 0; i < childItems.length; i++) {
-                if (childItems[i].getData() != null) {
-                    removeItem(childItems[i]);
-                }
-            }
-
-            // append a dummy if necessary
-            if (category != null || entry.hasChildEntries()) {
-                // may already have a dummy
-                // It is either a category (which always has at least one child)
-                // or an entry with chidren.
-                // Note that this test is not perfect, if we have filtering on
-                // then there in fact may be no entires to show when the user
-                // presses the "+" expand icon. But this is an acceptable
-                // compromise.
-                childItems = getChildItems(widget);
-                if (childItems.length == 0) {
-                    new TreeItem(item, SWT.NULL);
-                }
-            }
-            return;
-        }
-
-        // get the child entries or categories
-        if (node == rootEntry && isShowingCategories) {
-			// update the categories
-            updateCategories();
-		}
-        List children = getChildren(node);
-
-        // remove items
-        Set set = new HashSet(childItems.length * 2 + 1);
-
-        for (int i = 0; i < childItems.length; i++) {
-            Object data = childItems[i].getData();
-            if (data != null) {
-                Object e = data;
-                int ix = children.indexOf(e);
-                if (ix < 0) { // not found
-                    removeItem(childItems[i]);
-                } else { // found
-                    set.add(e);
-                }
-            } else if (data == null) { // the dummy
-                childItems[i].dispose();
-            }
-        }
-
-        // WORKAROUND
-        int oldCnt = -1;
-        if (widget == tree) {
-			oldCnt = tree.getItemCount();
-		}
-
-        // add new items
-        int newSize = children.size();
-        for (int i = 0; i < newSize; i++) {
-            Object el = children.get(i);
-            if (!set.contains(el)) {
-				createItem(el, widget, i);
-			}
-        }
-
-        // WORKAROUND
-        if (widget == tree && oldCnt == 0 && tree.getItemCount() == 1) {
-            tree.setRedraw(false);
-            tree.setRedraw(true);
-        }
-
-        // get the child tree items after our changes
-        childItems = getChildItems(widget);
-
-        // update the child items
-        // This ensures that the children are in the correct order
-        // are showing the correct values.
-        for (int i = 0; i < newSize; i++) {
-            Object el = children.get(i);
-            if (el instanceof IPropertySheetEntry) {
-				updateEntry((IPropertySheetEntry) el, childItems[i]);
-			} else {
-                updateCategory((PropertySheetCategory) el, childItems[i]);
-                updateChildrenOf(el, childItems[i]);
-            }
-        }
-        // The tree's original selection may no longer apply after the update,
-        // so fire the selection changed event.
-        entrySelectionChanged();
-    }
-
-    /**
-     * Update the given entry (but not its children or parent)
-     * 
-     * @param entry
-     *            the entry we will update
-     * @param item
-     *            the tree item for the given entry
-     */
-    private void updateEntry(IPropertySheetEntry entry, TreeItem item) {
-        // ensure that backpointer is correct
-        item.setData(entry);
-        
-        // update the map accordingly
-        entryToItemMap.put(entry, item);
-
-        // update the name and value columns
-        item.setText(0, entry.getDisplayName());
-        item.setText(1, entry.getValueAsString());
-        Image image = entry.getImage();
-        if (item.getImage(1) != image) {
-			item.setImage(1, image);
-		}
-
-        // update the "+" icon
-        updatePlus(entry, item);
-    }
-
-    /**
-     * Updates the "+"/"-" icon of the tree item from the given entry
-     * or category.
-     *
-     * @param node the entry or category
-     * @param item the tree item being updated
-     */
-    private void updatePlus(Object node, TreeItem item) {
-        // cast the entry or category
-        IPropertySheetEntry entry = null;
-        PropertySheetCategory category = null;
-        if (node instanceof IPropertySheetEntry) {
-			entry = (IPropertySheetEntry) node;
-		} else {
-			category = (PropertySheetCategory) node;
-		}
-
-        boolean hasPlus = item.getItemCount() > 0;
-        boolean needsPlus = category != null || entry.hasChildEntries();
-        boolean removeAll = false;
-        boolean addDummy = false;
-
-        if (hasPlus != needsPlus) {
-            if (needsPlus) {
-                addDummy = true;
-            } else {
-                removeAll = true;
-            }
-        }
-        if (removeAll) {
-            // remove all children
-            TreeItem[] items = item.getItems();
-            for (int i = 0; i < items.length; i++) {
-                removeItem(items[i]);
-            }
-        }
-
-        if (addDummy) {
-            new TreeItem(item, SWT.NULL); // append a dummy to create the
-            // plus sign
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/TextPropertyDescriptor.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/TextPropertyDescriptor.java
deleted file mode 100644
index c9ff7c4..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/TextPropertyDescriptor.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.properties;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Descriptor for a property that has a value which should be edited with a 
- * text cell editor.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * <p>
- * Example:
- * <pre>
- * IPropertyDescriptor pd = new TextPropertyDescriptor("surname", "Last Name");
- * </pre>
- * </p>
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class TextPropertyDescriptor extends PropertyDescriptor {
-    /**
-     * Creates an property descriptor with the given id and display name.
-     * 
-     * @param id the id of the property
-     * @param displayName the name to display for the property
-     */
-    public TextPropertyDescriptor(Object id, String displayName) {
-        super(id, displayName);
-    }
-
-    /**
-     * The <code>TextPropertyDescriptor</code> implementation of this 
-     * <code>IPropertyDescriptor</code> method creates and returns a new
-     * <code>TextCellEditor</code>.
-     * <p>
-     * The editor is configured with the current validator if there is one.
-     * </p>
-     */
-    public CellEditor createPropertyEditor(Composite parent) {
-        CellEditor editor = new TextCellEditor(parent);
-        if (getValidator() != null) {
-			editor.setValidator(getValidator());
-		}
-        return editor;
-    }
-}
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/package.html b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/package.html
deleted file mode 100644
index 1a6a1b5..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/properties/package.html
+++ /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="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.5 [en] (Win98; I) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Provides the standard Property Sheet view which displays
-custom properties of the active workbench part's current selection.
-<br>&nbsp;
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui.win32/.classpath b/bundles/org.eclipse.ui.win32/.classpath
deleted file mode 100644
index ce73933..0000000
--- a/bundles/org.eclipse.ui.win32/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.ui.win32/.cvsignore b/bundles/org.eclipse.ui.win32/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.ui.win32/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.ui.win32/.project b/bundles/org.eclipse.ui.win32/.project
deleted file mode 100644
index 9e21dbf..0000000
--- a/bundles/org.eclipse.ui.win32/.project
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.win32</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.help</project>
-		<project>org.eclipse.ui</project>
-		<project>org.eclipse.ui.ide</project>
-		<project>org.eclipse.ui.views</project>
-		<project>org.eclipse.update.core</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.win32/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.ui.win32/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 59e432f..0000000
--- a/bundles/org.eclipse.ui.win32/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,71 +0,0 @@
-#Tue Sep 11 09:39:08 EDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.ui.win32/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.ui.win32/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 8d20c9f..0000000
--- a/bundles/org.eclipse.ui.win32/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Mon Feb 06 11:21:10 EST 2006
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=false
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.1\n *\n * ${tags}\n */</template><template context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/bundles/org.eclipse.ui.win32/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.win32/META-INF/MANIFEST.MF
deleted file mode 100644
index fc72144..0000000
--- a/bundles/org.eclipse.ui.win32/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %fragmentName
-Bundle-SymbolicName: org.eclipse.ui.win32
-Bundle-Version: 3.2.100.qualifier
-Bundle-ClassPath: .
-Bundle-Vendor: %providerName
-Fragment-Host: org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)"
-Bundle-Localization: fragment-win32
-Export-Package: org.eclipse.ui.internal.editorsupport.win32;x-internal:=true
-Eclipse-PlatformFilter: (osgi.ws=win32)
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/bundles/org.eclipse.ui.win32/about.html b/bundles/org.eclipse.ui.win32/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.ui.win32/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.win32/build.properties b/bundles/org.eclipse.ui.win32/build.properties
deleted file mode 100644
index f15b424..0000000
--- a/bundles/org.eclipse.ui.win32/build.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source..=src/
-src.includes=about.html
-bin.includes = .,\
-               META-INF/,\
-               fragment-win32.properties,\
-               about.html
diff --git a/bundles/org.eclipse.ui.win32/fragment-win32.properties b/bundles/org.eclipse.ui.win32/fragment-win32.properties
deleted file mode 100644
index 1d259fc..0000000
--- a/bundles/org.eclipse.ui.win32/fragment-win32.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-providerName=Eclipse.org
-fragmentName=Eclipse UI Win32 Enhancements
diff --git a/bundles/org.eclipse.ui.win32/src/org/eclipse/ui/internal/editorsupport/win32/OleEditor.java b/bundles/org.eclipse.ui.win32/src/org/eclipse/ui/internal/editorsupport/win32/OleEditor.java
deleted file mode 100644
index f4af7d1..0000000
--- a/bundles/org.eclipse.ui.win32/src/org/eclipse/ui/internal/editorsupport/win32/OleEditor.java
+++ /dev/null
@@ -1,738 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.editorsupport.win32;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Vector;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-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.ResourcesPlugin;
-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.Status;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceColors;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.ole.win32.OLE;
-import org.eclipse.swt.ole.win32.OleAutomation;
-import org.eclipse.swt.ole.win32.OleClientSite;
-import org.eclipse.swt.ole.win32.OleFrame;
-import org.eclipse.swt.ole.win32.Variant;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IPathEditorInput;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.ide.ResourceUtil;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- */
-public class OleEditor extends EditorPart {
-
-    /**
-     * The resource listener updates the receiver when
-     * a change has occurred.
-     */
-    private IResourceChangeListener resourceListener = new IResourceChangeListener() {
-
-        /*
-         * @see IResourceChangeListener#resourceChanged(IResourceChangeEvent)
-         */
-        public void resourceChanged(IResourceChangeEvent event) {
-            IResourceDelta mainDelta = event.getDelta();
-            if (mainDelta == null)
-                return;
-            IResourceDelta affectedElement = mainDelta.findMember(resource
-                    .getFullPath());
-            if (affectedElement != null)
-                processDelta(affectedElement);
-        }
-
-        /*
-         * Process the delta for the receiver
-         */
-        private boolean processDelta(final IResourceDelta delta) {
-
-            Runnable changeRunnable = null;
-
-            switch (delta.getKind()) {
-            case IResourceDelta.REMOVED:
-                if ((IResourceDelta.MOVED_TO & delta.getFlags()) != 0) {
-                    changeRunnable = new Runnable() {
-                        public void run() {
-                            IPath path = delta.getMovedToPath();
-                            IFile newFile = delta.getResource().getWorkspace()
-                                    .getRoot().getFile(path);
-                            if (newFile != null) {
-                                sourceChanged(newFile);
-                            }
-                        }
-                    };
-                } else {
-                    changeRunnable = new Runnable() {
-                        public void run() {
-                            sourceDeleted = true;
-                            getSite().getPage().closeEditor(OleEditor.this,
-                                    true);
-                        }
-                    };
-
-                }
-
-                break;
-            }
-
-            if (changeRunnable != null)
-                update(changeRunnable);
-
-            return true; // because we are sitting on files anyway
-        }
-
-    };
-
-    private OleFrame clientFrame;
-
-    private OleClientSite clientSite;
-
-    private File source;
-
-    private IFile resource;
-
-    private Image oleTitleImage;
-
-    //The sourceDeleted flag makes sure that the receiver is not
-    //dirty when shutting down
-    boolean sourceDeleted = false;
-
-    //The sourceChanged flag indicates whether or not the save from the ole component
-    //can be used or if the input changed
-    boolean sourceChanged = false;
-
-    /**
-     * Keep track of whether we have an active client so we do not
-     * deactivate multiple times
-     */
-    private boolean clientActive = false;
-
-    /**
-     * Keep track of whether we have activated OLE or not as some applications
-     * will only allow single activations.
-     */
-    private boolean oleActivated = false;
-
-    private IPartListener partListener = new IPartListener() {
-        public void partActivated(IWorkbenchPart part) {
-            activateClient(part);
-        }
-
-        public void partBroughtToTop(IWorkbenchPart part) {
-        }
-
-        public void partClosed(IWorkbenchPart part) {
-        }
-
-        public void partOpened(IWorkbenchPart part) {
-        }
-
-        public void partDeactivated(IWorkbenchPart part) {
-            deactivateClient(part);
-        }
-    };
-
-    private static final String RENAME_ERROR_TITLE = OleMessages
-            .getString("OleEditor.errorSaving"); //$NON-NLS-1$
-
-    private static final String OLE_EXCEPTION_TITLE = OleMessages
-            .getString("OleEditor.oleExceptionTitle"); //$NON-NLS-1$
-
-    private static final String OLE_EXCEPTION_MESSAGE = OleMessages
-            .getString("OleEditor.oleExceptionMessage"); //$NON-NLS-1$
-
-    private static final String OLE_CREATE_EXCEPTION_MESSAGE = OleMessages
-            .getString("OleEditor.oleCreationExceptionMessage"); //$NON-NLS-1$
-
-    private static final String OLE_CREATE_EXCEPTION_REASON = OleMessages
-            .getString("OleEditor.oleCreationExceptionReason"); //$NON-NLS-1$
-
-    private static final String SAVE_ERROR_TITLE = OleMessages
-            .getString("OleEditor.savingTitle"); //$NON-NLS-1$
-
-    private static final String SAVE_ERROR_MESSAGE = OleMessages
-            .getString("OleEditor.savingMessage"); //$NON-NLS-1$
-
-    /**
-     * Return a new ole editor.
-     */
-    public OleEditor() {
-        //Do nothing
-    }
-
-    private void activateClient(IWorkbenchPart part) {
-        if (part == this) {
-            oleActivate();
-            this.clientActive = true;
-        }
-    }
-
-    /**
-     * createPartControl method comment.
-     */
-    public void createPartControl(Composite parent) {
-
-        // Create a frame.
-        clientFrame = new OleFrame(parent, SWT.CLIP_CHILDREN);
-        clientFrame.setBackground(JFaceColors.getBannerBackground(clientFrame
-                .getDisplay()));
-
-        initializeWorkbenchMenus();
-
-        createClientSite();
-        updateDirtyFlag();
-    }
-
-    /**
-     * Create the client site for the receiver
-     */
-
-    private void createClientSite() {
-        //If there was an OLE Error or nothing has been created yet
-        if (clientFrame == null || clientFrame.isDisposed())
-            return;
-        // Create a OLE client site.
-        try {
-            clientSite = new OleClientSite(clientFrame, SWT.NONE, source);
-        } catch (SWTException exception) {
-
-            IStatus errorStatus = new Status(IStatus.ERROR,
-                    WorkbenchPlugin.PI_WORKBENCH, IStatus.ERROR,
-                    OLE_CREATE_EXCEPTION_REASON, exception);
-            //ErrorDialog.openError(null, OLE_EXCEPTION_TITLE, OLE_CREATE_EXCEPTION_REASON, errorStatus);
-            ErrorDialog.openError(null, OLE_EXCEPTION_TITLE, OLE_CREATE_EXCEPTION_MESSAGE, errorStatus);
-            return;
-        }
-        clientSite.setBackground(JFaceColors.getBannerBackground(clientFrame
-                .getDisplay()));
-
-    }
-
-    private void deactivateClient(IWorkbenchPart part) {
-        //Check the client active flag. Set it to false when we have deactivated
-        //to prevent multiple de-activations.
-        if (part == this && clientActive) {
-            if (clientSite != null)
-                clientSite.deactivateInPlaceClient();
-            this.clientActive = false;
-            this.oleActivated = false;
-        }
-    }
-
-    /**
-     * Display an error dialog with the supplied title and message.
-     * @param title
-     * @param message
-     */
-    private void displayErrorDialog(String title, String message) {
-        Shell parent = null;
-        if (getClientSite() != null)
-            parent = getClientSite().getShell();
-        MessageDialog.openError(parent, title, message);
-    }
-
-    /**
-     * @see IWorkbenchPart#dispose
-     */
-    public void dispose() {
-        if (resource != null) {
-            ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-                    resourceListener);
-            resource = null;
-        }
-
-        //can dispose the title image because it was created in init
-        if (oleTitleImage != null) {
-            oleTitleImage.dispose();
-            oleTitleImage = null;
-        }
-
-        if (getSite() != null && getSite().getPage() != null)
-            getSite().getPage().removePartListener(partListener);
-
-    }
-
-    /**
-     *	Print this object's contents
-     */
-    public void doPrint() {
-        if (clientSite == null)
-            return;
-        BusyIndicator.showWhile(clientSite.getDisplay(), new Runnable() {
-            public void run() {
-                clientSite.exec(OLE.OLECMDID_PRINT,
-                        OLE.OLECMDEXECOPT_PROMPTUSER, null, null);
-                // note: to check for success: above == SWTOLE.S_OK
-            }
-        });
-    }
-
-    /**
-     *	Save the viewer's contents to the source file system file
-     */
-    public void doSave(final IProgressMonitor monitor) {
-        if (clientSite == null)
-            return;
-        BusyIndicator.showWhile(clientSite.getDisplay(), new Runnable() {
-
-            /*
-             *  (non-Javadoc)
-             * @see java.lang.Runnable#run()
-             */
-            public void run() {
-
-                //Do not try and use the component provided save if the source has
-                //changed in Eclipse
-                if (!sourceChanged) {
-                    int result = clientSite.queryStatus(OLE.OLECMDID_SAVE);
-                    if ((result & OLE.OLECMDF_ENABLED) != 0) {
-                        result = clientSite.exec(OLE.OLECMDID_SAVE,
-                                OLE.OLECMDEXECOPT_PROMPTUSER, null, null);
-                        if (result == OLE.S_OK) {
-                            try {
-                                resource.refreshLocal(IResource.DEPTH_ZERO,
-                                        monitor);
-                            } catch (CoreException ex) {
-                                //Do nothing on a failed refresh
-                            }
-                            return;
-                        }
-                        displayErrorDialog(OLE_EXCEPTION_TITLE,
-                                OLE_EXCEPTION_MESSAGE + String.valueOf(result));
-                        return;
-                    }
-                }
-                if (saveFile(source)) {
-                    try {
-                    	if (resource != null)
-                    		resource.refreshLocal(IResource.DEPTH_ZERO, monitor);
-                    } catch (CoreException ex) {
-                        //Do nothing on a failed refresh
-                    }
-                } else
-                    displayErrorDialog(SAVE_ERROR_TITLE, SAVE_ERROR_MESSAGE
-                            + source.getName());
-            }
-        });
-    }
-
-    /**
-     *	Save the viewer's contents into the provided resource.
-     */
-    public void doSaveAs() {
-        if (clientSite == null)
-            return;
-        WorkspaceModifyOperation op = saveNewFileOperation();
-        Shell shell = clientSite.getShell();
-        try {
-            new ProgressMonitorDialog(shell).run(false, true, op);
-        } catch (InterruptedException interrupt) {
-            //Nothing to reset so do nothing
-        } catch (InvocationTargetException invocationException) {
-            MessageDialog.openError(shell, RENAME_ERROR_TITLE,
-                    invocationException.getTargetException().getMessage());
-        }
-
-    }
-
-    /**
-     *	Answer self's client site
-     *
-     *	@return org.eclipse.swt.ole.win32.OleClientSite
-     */
-    public OleClientSite getClientSite() {
-        return clientSite;
-    }
-
-    /**
-     *	Answer the file system representation of self's input element
-     *
-     *	@return java.io.File
-     */
-    public File getSourceFile() {
-        return source;
-    }
-
-    private void handleWord() {
-        OleAutomation dispInterface = new OleAutomation(clientSite);
-        // Get Application
-        int[] appId = dispInterface
-                .getIDsOfNames(new String[] { "Application" }); //$NON-NLS-1$
-        if (appId != null) {
-            Variant pVarResult = dispInterface.getProperty(appId[0]);
-            if (pVarResult != null) {
-                OleAutomation application = pVarResult.getAutomation();
-                int[] dispid = application
-                        .getIDsOfNames(new String[] { "DisplayScrollBars" }); //$NON-NLS-1$
-                if (dispid != null) {
-                    Variant rgvarg = new Variant(true);
-                    application.setProperty(dispid[0], rgvarg);
-                }
-                application.dispose();
-            }
-        }
-        dispInterface.dispose();
-    }
-
-    /* (non-Javadoc)
-     * Initializes the editor when created from scratch.
-     * 
-     * This method is called soon after part construction and marks 
-     * the start of the extension lifecycle.  At the end of the
-     * extension lifecycle <code>shutdown</code> will be invoked
-     * to terminate the lifecycle.
-     *
-     * @param container an interface for communication with the part container
-     * @param input The initial input element for the editor.  In most cases
-     *    it is an <code>IFile</code> but other types are acceptable.
-     * @see IWorkbenchPart#shutdown
-     */
-    public void init(IEditorSite site, IEditorInput input)
-            throws PartInitException {
-    	
-    	validatePathEditorInput(input);
-
-        // Save input.
-        setSite(site);
-        setInputWithNotify(input);
-
-        // Update titles.
-        setPartName(input.getName());
-        setTitleToolTip(input.getToolTipText());
-        ImageDescriptor desc = input.getImageDescriptor();
-        if (desc != null) {
-            oleTitleImage = desc.createImage();
-            setTitleImage(oleTitleImage);
-        }
-
-        // Listen for part activation.
-        site.getPage().addPartListener(partListener);
-
-    }
-    
-    /**
-     * Validates the given input
-     * 
-     * @param input the editor input to validate
-     * @throws PartInitException if the editor input is not OK
-     */
-    private boolean validatePathEditorInput(IEditorInput input) throws PartInitException {
-        // Check input type.
-    	IPathEditorInput pathEditorInput = (IPathEditorInput)input.getAdapter(IPathEditorInput.class);
-        if (pathEditorInput == null)
-            throw new PartInitException(OleMessages.format(
-                    "OleEditor.invalidInput", new Object[] { input })); //$NON-NLS-1$
-        
-        IPath path = pathEditorInput.getPath();
-
-        //Cannot create this with a file and no physical location
-        if (!(new File(path.toOSString()).exists()))
-            throw new PartInitException(
-                    OleMessages
-                            .format(
-                                    "OleEditor.noFileInput", new Object[] { path.toOSString() })); //$NON-NLS-1$
-        return true;
-    }
-    
-    /**
-     *	Initialize the workbench menus for proper merging
-     */
-    protected void initializeWorkbenchMenus() {
-        //If there was an OLE Error or nothing has been created yet
-        if (clientFrame == null || clientFrame.isDisposed())
-            return;
-        // Get the browser menu bar.  If one does not exist then
-        // create it.
-        Shell shell = clientFrame.getShell();
-        Menu menuBar = shell.getMenuBar();
-        if (menuBar == null) {
-            menuBar = new Menu(shell, SWT.BAR);
-            shell.setMenuBar(menuBar);
-        }
-
-        // Swap the file and window menus.
-        MenuItem[] windowMenu = new MenuItem[1];
-        MenuItem[] fileMenu = new MenuItem[1];
-        Vector containerItems = new Vector();
-
-        IWorkbenchWindow window = getSite().getWorkbenchWindow();
-
-        for (int i = 0; i < menuBar.getItemCount(); i++) {
-            MenuItem item = menuBar.getItem(i);
-            String id = ""; //$NON-NLS-1$
-            if (item.getData() instanceof IMenuManager)
-                id = ((IMenuManager) item.getData()).getId();
-            if (id.equals(IWorkbenchActionConstants.M_FILE))
-                fileMenu[0] = item;
-            else if (id.equals(IWorkbenchActionConstants.M_WINDOW))
-                windowMenu[0] = item;
-            else {
-                if (window.isApplicationMenu(id)) {
-                    containerItems.addElement(item);
-                }
-            }
-        }
-        MenuItem[] containerMenu = new MenuItem[containerItems.size()];
-        containerItems.copyInto(containerMenu);
-        clientFrame.setFileMenus(fileMenu);
-        clientFrame.setContainerMenus(containerMenu);
-        clientFrame.setWindowMenus(windowMenu);
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.ISaveablePart#isDirty()
-     */
-    public boolean isDirty() {
-        /*Return only if we have a clientSite which is dirty 
-         as this can be asked before anything is opened*/
-        return clientSite != null && clientSite.isDirty();
-    }
-
-    /* 
-     * (non-Javadoc)
-     * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-     */
-    public boolean isSaveAsAllowed() {
-        return true;
-    }
-
-    /**
-     *Since we don't know when a change has been made, always answer true
-     * @return <code>false</code> if it was not opened and <code>true</code> 
-     * only if it is dirty
-     */
-    public boolean isSaveNeeded() {
-        return isDirty();
-    }
-
-    /**
-     * Save the supplied file using the SWT API.
-     * @param file java.io.File
-     * @return <code>true</code> if the save was successful
-     */
-    private boolean saveFile(File file) {
-
-        File tempFile = new File(file.getAbsolutePath() + ".tmp"); //$NON-NLS-1$
-        file.renameTo(tempFile);
-        boolean saved = false;
-        if (OLE.isOleFile(file) || usesStorageFiles(clientSite.getProgramID())) {
-            saved = clientSite.save(file, true);
-        } else {
-            saved = clientSite.save(file, false);
-        }
-
-        if (saved) {
-            // save was successful so discard the backup
-            tempFile.delete();
-            return true;
-        }
-        // save failed so restore the backup
-        tempFile.renameTo(file);
-        return false;
-    }
-
-    /**
-     * Save the new File using the client site.
-     * @return WorkspaceModifyOperation
-     */
-    private WorkspaceModifyOperation saveNewFileOperation() {
-
-        return new WorkspaceModifyOperation() {
-            public void execute(final IProgressMonitor monitor)
-                    throws CoreException {
-                SaveAsDialog dialog = new SaveAsDialog(clientFrame.getShell());
-                IFile sFile = ResourceUtil.getFile(getEditorInput());
-                if (sFile != null) {
-                    dialog.setOriginalFile(sFile);
-                    dialog.open();
-    
-                    IPath newPath = dialog.getResult();
-                    if (newPath == null)
-                        return;
-    
-                    if (dialog.getReturnCode() == Window.OK) {
-                        String projectName = newPath.segment(0);
-                        newPath = newPath.removeFirstSegments(1);
-                        IProject project = resource.getWorkspace().getRoot()
-                                .getProject(projectName);
-                        newPath = project.getLocation().append(newPath);
-                        File newFile = newPath.toFile();
-                        if (saveFile(newFile)) {
-                            IFile newResource = resource.getWorkspace().getRoot()
-                                    .getFileForLocation(newPath);
-                            if (newResource != null) {
-                                sourceChanged(newResource);
-                                newResource.refreshLocal(IResource.DEPTH_ZERO,
-                                        monitor);
-                            }
-                        } else {
-                            displayErrorDialog(SAVE_ERROR_TITLE, SAVE_ERROR_MESSAGE
-                                    + newFile.getName());
-                            return;
-                        }
-                    }
-                }
-            }
-        };
-
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-     */
-    public void setFocus() {
-        //Do not take focus
-    }
-
-    /**
-     * Make ole active so that the controls are rendered.
-     */
-    private void oleActivate() {
-        //If there was an OLE Error or nothing has been created yet
-        if (clientSite == null || clientFrame == null
-                || clientFrame.isDisposed())
-            return;
-
-        if (!oleActivated) {
-            clientSite.doVerb(OLE.OLEIVERB_SHOW);
-            oleActivated = true;
-            String progId = clientSite.getProgramID();
-            if (progId != null && progId.startsWith("Word.Document")) { //$NON-NLS-1$
-                handleWord();
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.part.EditorPart#setInputWithNotify(org.eclipse.ui.IEditorInput)
-     */
-    protected void setInputWithNotify(IEditorInput input) {
-    	IPathEditorInput pathEditorInput = (IPathEditorInput)input.getAdapter(IPathEditorInput.class);
-    	if (pathEditorInput != null)
-    		source = new File(pathEditorInput.getPath().toOSString());
-    	
-        if (input instanceof IFileEditorInput) {
-        	if (resource == null)
-        		ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceListener);
-        	resource = ((IFileEditorInput)input).getFile();
-        } else if (resource != null) {
-        	ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceListener);
-        	resource = null;
-        }
-        
-        super.setInputWithNotify(input);
-    }
-
-    /**
-     * See if it is one of the known types that use OLE Storage.
-     * @param progID the type to test
-     * @return <code>true</code> if it is one of the known types
-     */
-    private static boolean usesStorageFiles(String progID) {
-        return (progID != null && (progID.startsWith("Word.", 0) //$NON-NLS-1$
-                || progID.startsWith("MSGraph", 0) //$NON-NLS-1$
-                || progID.startsWith("PowerPoint", 0) //$NON-NLS-1$
-        || progID.startsWith("Excel", 0))); //$NON-NLS-1$
-    }
-
-    /**
-     * The source has changed to the newFile. Update
-     * editors and set any required flags
-     * @param newFile The file to get the new contents from.
-     */
-    private void sourceChanged(IFile newFile) {
-
-        FileEditorInput newInput = new FileEditorInput(newFile);
-        setInputWithNotify(newInput);
-        sourceChanged = true;
-        setPartName(newInput.getName());
-
-    }
-
-    /* 
-     * See IEditorPart.isSaveOnCloseNeeded() 
-     */
-    public boolean isSaveOnCloseNeeded() {
-        return !sourceDeleted && super.isSaveOnCloseNeeded();
-    }
-
-    /**
-     * Posts the update code "behind" the running operation.
-     *
-     * @param runnable the update code
-     */
-    private void update(Runnable runnable) {
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
-        if (windows != null && windows.length > 0) {
-            Display display = windows[0].getShell().getDisplay();
-            display.asyncExec(runnable);
-        } else
-            runnable.run();
-    }
-
-    private boolean isDirty = false;
-    private void updateDirtyFlag() {
-    	final Runnable dirtyFlagUpdater = new Runnable() {
-			public void run() {
-				if (clientSite == null || resource == null) return;
-				boolean dirty = isDirty(); 
-				if (isDirty != dirty) {
-					isDirty = dirty;
-					firePropertyChange(PROP_DIRTY);
-				}
-				clientSite.getDisplay().timerExec(1000, this);
-			}
-    	};
-    	dirtyFlagUpdater.run();
-    }
-}
diff --git a/bundles/org.eclipse.ui.win32/src/org/eclipse/ui/internal/editorsupport/win32/OleMessages.java b/bundles/org.eclipse.ui.win32/src/org/eclipse/ui/internal/editorsupport/win32/OleMessages.java
deleted file mode 100644
index 91f658d..0000000
--- a/bundles/org.eclipse.ui.win32/src/org/eclipse/ui/internal/editorsupport/win32/OleMessages.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.editorsupport.win32;
-
-import com.ibm.icu.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Utility class which helps managing messages
- */
-public class OleMessages {
-    private static final String RESOURCE_BUNDLE = "org.eclipse.ui.internal.editorsupport.win32.messages";//$NON-NLS-1$
-
-    private static ResourceBundle bundle = ResourceBundle
-            .getBundle(RESOURCE_BUNDLE);
-
-    private OleMessages() {
-        // prevent instantiation of class
-    }
-
-    /**
-     * Returns the formatted message for the given key in the resource bundle.
-     * 
-     * @param key
-     *            the resource name
-     * @param args
-     *            the message arguments
-     * @return the string
-     */
-    public static String format(String key, Object[] args) {
-        return MessageFormat.format(getString(key), args);
-    }
-
-    /**
-     * Returns the resource object with the given key in the resource bundle. If
-     * there isn't any value under the given key, the key is returned.
-     * 
-     * @param key
-     *            the resource name
-     * @return the string
-     */
-    public static String getString(String key) {
-        try {
-            return bundle.getString(key);
-        } catch (MissingResourceException e) {
-            return key;
-        }
-    }
-
-    /**
-     * Returns the resource object with the given key in the resource bundle. If
-     * there isn't any value under the given key, the default value is returned.
-     * 
-     * @param key
-     *            the resource name
-     * @param def
-     *            the default value
-     * @return the string
-     */
-    public static String getString(String key, String def) {
-        try {
-            return bundle.getString(key);
-        } catch (MissingResourceException e) {
-            return def;
-        }
-    }
-}
diff --git a/bundles/org.eclipse.ui.win32/src/org/eclipse/ui/internal/editorsupport/win32/messages.properties b/bundles/org.eclipse.ui.win32/src/org/eclipse/ui/internal/editorsupport/win32/messages.properties
deleted file mode 100644
index 13507d7..0000000
--- a/bundles/org.eclipse.ui.win32/src/org/eclipse/ui/internal/editorsupport/win32/messages.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2004, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-OleEditor.errorSaving = Exception saving file
-OleEditor.oleExceptionTitle = OLE Exception
-OleEditor.oleExceptionMessage = OLE Error Saving 
-OleEditor.oleCreationExceptionMessage = Cannot create the in-place editor
-OleEditor.oleCreationExceptionReason = This is probably because there is no OLE editor registered against the type of file you were trying to open.
-OleEditor.savingTitle = Error Saving
-OleEditor.savingMessage = Could not save 
-OleEditor.invalidInput = Invalid Input: {0}.  Input must adapt to IFile
-OleEditor.noFileInput = Invalid Input: {0}.  Input must also exist in the filesystem
diff --git a/bundles/org.eclipse.ui.workbench.compatibility/.classpath b/bundles/org.eclipse.ui.workbench.compatibility/.classpath
deleted file mode 100644
index ce73933..0000000
--- a/bundles/org.eclipse.ui.workbench.compatibility/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.ui.workbench.compatibility/.cvsignore b/bundles/org.eclipse.ui.workbench.compatibility/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/bundles/org.eclipse.ui.workbench.compatibility/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/bundles/org.eclipse.ui.workbench.compatibility/.project b/bundles/org.eclipse.ui.workbench.compatibility/.project
deleted file mode 100644
index 85354bd..0000000
--- a/bundles/org.eclipse.ui.workbench.compatibility/.project
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.workbench.compatibility</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.core.runtime.compatibility</project>
-		<project>org.eclipse.help</project>
-		<project>org.eclipse.jface</project>
-		<project>org.eclipse.swt</project>
-		<project>org.eclipse.ui.workbench</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui.workbench.compatibility/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.ui.workbench.compatibility/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 8bbcd5e..0000000
--- a/bundles/org.eclipse.ui.workbench.compatibility/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,71 +0,0 @@
-#Tue Sep 11 09:38:54 EDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.ui.workbench.compatibility/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.ui.workbench.compatibility/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 2341629..0000000
--- a/bundles/org.eclipse.ui.workbench.compatibility/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Tue Sep 12 08:58:52 EDT 2006
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.3\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template></templates>
diff --git a/bundles/org.eclipse.ui.workbench.compatibility/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.ui.workbench.compatibility/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 7f9ef27..0000000
--- a/bundles/org.eclipse.ui.workbench.compatibility/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Nov 23 11:21:27 EST 2004
-compilers.p.unused-element-or-attribute=1
-compilers.p.unresolved-ex-points=0
-compilers.p.deprecated=0
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unknown-class=1
-compilers.p.unknown-attribute=0
-compilers.p.no-required-att=0
-eclipse.preferences.version=1
-compilers.p.unresolved-import=0
-compilers.p.not-externalized-att=0
-compilers.p.illegal-att-value=0
-compilers.use-project=true
diff --git a/bundles/org.eclipse.ui.workbench.compatibility/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.workbench.compatibility/META-INF/MANIFEST.MF
deleted file mode 100644
index 539ec02..0000000
--- a/bundles/org.eclipse.ui.workbench.compatibility/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %fragmentName
-Bundle-SymbolicName: org.eclipse.ui.workbench.compatibility
-Bundle-Version: 3.2.0.qualifier
-Bundle-Vendor: %providerName
-Fragment-Host: org.eclipse.ui.workbench;bundle-version="[3.0.0,4.0.0)"
-Bundle-Localization: fragment-compatibility
-Require-Bundle: org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)"
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ClassPath: compatibility.jar
diff --git a/bundles/org.eclipse.ui.workbench.compatibility/about.html b/bundles/org.eclipse.ui.workbench.compatibility/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.ui.workbench.compatibility/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.workbench.compatibility/build.properties b/bundles/org.eclipse.ui.workbench.compatibility/build.properties
deleted file mode 100644
index 2bb5ca5..0000000
--- a/bundles/org.eclipse.ui.workbench.compatibility/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-source.compatibility.jar=src/
-src.includes=about.html
-bin.includes = fragment-compatibility.properties,\
-               about.html,\
-               compatibility.jar,\
-               META-INF/
diff --git a/bundles/org.eclipse.ui.workbench.compatibility/fragment-compatibility.properties b/bundles/org.eclipse.ui.workbench.compatibility/fragment-compatibility.properties
deleted file mode 100644
index f667586..0000000
--- a/bundles/org.eclipse.ui.workbench.compatibility/fragment-compatibility.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-providerName=Eclipse.org
-fragmentName=Workbench Compatibility
diff --git a/bundles/org.eclipse.ui.workbench.compatibility/src/org/eclipse/ui/internal/CompatibleWorkbenchPage.java b/bundles/org.eclipse.ui.workbench.compatibility/src/org/eclipse/ui/internal/CompatibleWorkbenchPage.java
deleted file mode 100644
index 5db7cbb..0000000
--- a/bundles/org.eclipse.ui.workbench.compatibility/src/org/eclipse/ui/internal/CompatibleWorkbenchPage.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-
-/**
- * Internal class used in providing increased binary compatibility for pre-3.0
- * plug-ins. This declaration masks the empty class of the same name declared in
- * the Workbench proper. This class implements IWorkbenchPage that existed in
- * 2.1 but were removed in 3.0 because they referenced resource API.
- * <p>
- * Plug-ins should not refer to this type or its containing fragment from their
- * class path. It is intended only to provide binary compatibility for pre-3.0
- * plug-ins, and should not be referenced at development time.
- * </p>
- * 
- * @since 3.0
- */
-public class CompatibleWorkbenchPage implements ICompatibleWorkbenchPage {
-
-    /**
-     * openEditor(IFile) is declared on IWorkbenchPage in 2.1. This method was
-     * removed in 3.0 because it references resource API.
-     */
-    public IEditorPart openEditor(IFile input) throws PartInitException {
-        // invoke org.eclipse.ui.ide.IDE.openEditor(IWorkbenchPage, IFile,
-        // boolean);
-        return openEditor(new Class[] { IWorkbenchPage.class, IFile.class,
-                boolean.class },
-                new Object[] { this, input, new Boolean(true) });
-    }
-
-    /**
-     * openEditor(IFile,String) is declared on IWorkbenchPage in 2.1. This
-     * method was removed in 3.0 because it references resource API.
-     */
-    public IEditorPart openEditor(IFile input, String editorID)
-            throws PartInitException {
-        return openEditor(input, editorID, true);
-    }
-
-    /**
-     * openEditor(IFile,String,boolean) is declared on IWorkbenchPage in 2.1.
-     * This method was removed in 3.0 because it references resource API.
-     */
-    public IEditorPart openEditor(IFile input, String editorID, boolean activate)
-            throws PartInitException {
-        return ((IWorkbenchPage) this).openEditor(getFileEditorInput(input),
-                editorID);
-    }
-
-    /**
-     * openEditor(IMarker) is declared on IWorkbenchPage in 2.1. This method was
-     * removed in 3.0 because it references resource API.
-     */
-    public IEditorPart openEditor(IMarker marker) throws PartInitException {
-        return openEditor(marker, true);
-    }
-
-    /**
-     * openEditor(IMarker,boolean) is declared on IWorkbenchPage in 2.1. This
-     * method was removed in 3.0 because it references resource API.
-     */
-    public IEditorPart openEditor(IMarker marker, boolean activate)
-            throws PartInitException {
-        // invoke org.eclipse.ui.ide.IDE.openEditor(IWorkbenchPage, IMarker,
-        // boolean);
-        return openEditor(new Class[] { IWorkbenchPage.class, IMarker.class,
-                boolean.class }, new Object[] { this, marker,
-                new Boolean(activate) });
-    }
-
-    /**
-     * openSystemEditor(IFile) is declared on IWorkbenchPage in 2.1. This method
-     * was removed in 3.0 because it references resource API.
-     */
-    public void openSystemEditor(IFile file) throws PartInitException {
-        ((IWorkbenchPage) this).openEditor(getFileEditorInput(file),
-                IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID);
-
-    }
-
-    /*
-     * Implementation support: Use reflection for the following code pattern:
-     * new org.eclipse.ui.part.FileEditorInput(file) The class FileEditorInput
-     * is found in the org.eclipse.ui.ide plug-in.
-     */
-    private IEditorInput getFileEditorInput(IFile file)
-            throws PartInitException {
-        IPluginDescriptor desc = Platform.getPluginRegistry()
-                .getPluginDescriptor("org.eclipse.ui.ide"); //$NON-NLS-1$		
-        Exception problem;
-        try {
-            Class clazz = desc.getPluginClassLoader().loadClass(
-                    "org.eclipse.ui.part.FileEditorInput"); //$NON-NLS-1$
-            Constructor constructor = clazz
-                    .getConstructor(new Class[] { IFile.class });
-            return (IEditorInput) constructor
-                    .newInstance(new Object[] { file });
-        } catch (NullPointerException e) {
-            problem = e;
-        } catch (ClassNotFoundException e) {
-            problem = e;
-        } catch (NoSuchMethodException e) {
-            problem = e;
-        } catch (IllegalArgumentException e) {
-            problem = e;
-        } catch (IllegalAccessException e) {
-            problem = e;
-        } catch (InvocationTargetException e) {
-            problem = e;
-        } catch (InstantiationException e) {
-            problem = e;
-        }
-        IStatus status = new Status(
-                IStatus.ERROR,
-                WorkbenchPlugin.PI_WORKBENCH,
-                0,
-                "openEditor() compatibility support failed - new FileEditorInput(file)", problem); //$NON-NLS-1$
-        WorkbenchPlugin.log(status.getMessage(), status);
-        throw new PartInitException(status);
-    }
-
-    /*
-     * Implementation support: Use reflection to invoke the appropriate static
-     * openEditor(...) method on IDE The IDE class is found in the
-     * org.eclipse.ui.ide plug-in.
-     */
-    private IEditorPart openEditor(Class[] argTypes, Object[] args)
-            throws PartInitException {
-        IPluginDescriptor desc = Platform.getPluginRegistry()
-                .getPluginDescriptor("org.eclipse.ui.ide"); //$NON-NLS-1$
-        Throwable problem;
-        try {
-            Class clazz = desc.getPluginClassLoader().loadClass(
-                    "org.eclipse.ui.ide.IDE"); //$NON-NLS-1$
-            Method method = clazz.getMethod("openEditor", argTypes); //$NON-NLS-1$
-            return (IEditorPart) method.invoke(null, args);
-        } catch (NullPointerException e) {
-            problem = e;
-        } catch (ClassNotFoundException e) {
-            problem = e;
-        } catch (NoSuchMethodException e) {
-            problem = e;
-        } catch (IllegalArgumentException e) {
-            problem = e;
-        } catch (IllegalAccessException e) {
-            problem = e;
-        } catch (InvocationTargetException e) {
-            problem = e;
-        }
-        IStatus status = new Status(
-                IStatus.ERROR,
-                WorkbenchPlugin.PI_WORKBENCH,
-                0,
-                "openEditor() compatibility support failed - IDE.openEditor()", problem); //$NON-NLS-1$
-        WorkbenchPlugin.log(status.getMessage(), status);
-        throw new PartInitException(status);
-    }
-}
diff --git a/bundles/org.eclipse.ui.workbench.compatibility/src/org/eclipse/ui/internal/ICompatibleWorkbenchPage.java b/bundles/org.eclipse.ui.workbench.compatibility/src/org/eclipse/ui/internal/ICompatibleWorkbenchPage.java
deleted file mode 100644
index 1258328..0000000
--- a/bundles/org.eclipse.ui.workbench.compatibility/src/org/eclipse/ui/internal/ICompatibleWorkbenchPage.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-
-/**
- * Internal interface used in providing increased binary compatibility for
- * pre-3.0 plug-ins. This declaration masks the empty interface of the same name
- * declared in the Workbench proper. This interface declares IWorkbenchPage that
- * existed in 2.1 but were removed in 3.0 because they referenced resource API.
- * <p>
- * Plug-ins should not refer to this type or its containing fragment from their
- * class path. It is intended only to provide binary compatibility for pre-3.0
- * plug-ins, and should not be referenced at development time.
- * </p>
- * 
- * @since 3.0
- */
-public interface ICompatibleWorkbenchPage {
-
-    /**
-     * Opens an editor on the given file resource.
-     * <p>
-     * If this page already has an editor open on the target object that editor
-     * is activated; otherwise, a new editor is opened.
-     * <p>
-     * <p>
-     * An appropriate editor for the input is determined using a multistep
-     * process.
-     * </p>
-     * <ol>
-     * <li>The workbench editor registry is consulted to determine if an editor
-     * extension has been registered for the file type. If so, an instance of
-     * the editor extension is opened on the file. See
-     * <code>IEditorRegistry.getDefaultEditor(IFile)</code>.
-     * <li>Next, the native operating system will be consulted to determine if
-     * a native editor exists for the file type. If so, a new process is started
-     * and the native editor is opened on the file.
-     * <li>If all else fails the file will be opened in a default text editor.
-     * </li>
-     * </ol>
-     * </p>
-     * 
-     * @param input
-     *            the file to edit
-     * @return an open and active editor, or <code>null</code> if a system
-     *         editor was opened
-     * @exception PartInitException
-     *                if the editor could not be initialized
-     * @deprecated In 3.0 this resource-specific method moved from this
-     *             interface to
-     *             <code>org.eclipse.ui.ide.IDE.openEditor(IWorkbenchPage,IFile)</code>.
-     *             This method should not be referenced at development time. See
-     *             the class comment for more details.
-     */
-    public IEditorPart openEditor(IFile input) throws PartInitException;
-
-    /**
-     * Opens an editor on the given file resource.
-     * <p>
-     * If this page already has an editor open on the target object that editor
-     * is brought to front; otherwise, a new editor is opened. If
-     * <code>activate == true</code> the editor will be activated.
-     * <p>
-     * <p>
-     * The editor type is determined by mapping <code>editorId</code> to an
-     * editor extension registered with the workbench. An editor id is passed
-     * rather than an editor object to prevent the accidental creation of more
-     * than one editor for the same input. It also guarantees a consistent
-     * lifecycle for editors, regardless of whether they are created by the user
-     * or restored from saved data.
-     * </p>
-     * 
-     * @param input
-     *            the file to edit
-     * @param editorId
-     *            the id of the editor extension to use or null
-     * @param activate
-     *            if <code>true</code> the editor will be activated
-     * @return an open and active editor
-     * @exception PartInitException
-     *                if the editor could not be initialized
-     * @deprecated In 3.0 this resource-specific method moved from this
-     *             interface to
-     *             <code>org.eclipse.ui.ide.IDE.openEditor(IWorkbenchPage,IFile,String,boolean)</code>.
-     *             This method should not be referenced at development time. See
-     *             the class comment for more details.
-     */
-    public IEditorPart openEditor(IFile input, String editorId, boolean activate)
-            throws PartInitException;
-
-    /**
-     * Opens an editor on the given file resource.
-     * <p>
-     * If this page already has an editor open on the target object that editor
-     * is activated; otherwise, a new editor is opened.
-     * <p>
-     * <p>
-     * The editor type is determined by mapping <code>editorId</code> to an
-     * editor extension registered with the workbench. An editor id is passed
-     * rather than an editor object to prevent the accidental creation of more
-     * than one editor for the same input. It also guarantees a consistent
-     * lifecycle for editors, regardless of whether they are created by the user
-     * or restored from saved data.
-     * </p>
-     * 
-     * @param editorId
-     *            the id of the editor extension to use
-     * @param input
-     *            the file to edit
-     * @return an open and active editor
-     * @exception PartInitException
-     *                if the editor could not be initialized
-     * @deprecated In 3.0 this resource-specific method moved from this
-     *             interface to
-     *             <code>org.eclipse.ui.ide.IDE.openEditor(IWorkbenchPage,IFile,String)</code>.
-     *             This method should not be referenced at development time. See
-     *             the class comment for more details.
-     */
-    public IEditorPart openEditor(IFile input, String editorId)
-            throws PartInitException;
-
-    /**
-     * Opens an editor on the file resource of the given marker.
-     * <p>
-     * If this page already has an editor open on the target object that editor
-     * is activated; otherwise, a new editor is opened. The cursor and selection
-     * state of the editor is then updated from information recorded in the
-     * marker.
-     * <p>
-     * <p>
-     * If the marker contains an <code>EDITOR_ID_ATTR</code> attribute the
-     * attribute value will be used to determine the editor type to be opened.
-     * If not, the registered editor for the marker resource will be used.
-     * </p>
-     * 
-     * @param marker
-     *            the marker to open
-     * @return an open and active editor, or null if a system editor was opened
-     * @exception PartInitException
-     *                if the editor could not be initialized
-     * @deprecated In 3.0 this resource-specific method moved from this
-     *             interface to
-     *             <code>org.eclipse.ui.ide.IDE.openEditor(IWorkbenchPage,IMarker)</code>.
-     *             This method should not be referenced at development time. See
-     *             the class comment for more details.
-     */
-    public IEditorPart openEditor(IMarker marker) throws PartInitException;
-
-    /**
-     * Opens an editor on the file resource of the given marker.
-     * <p>
-     * If this page already has an editor open on the target object that editor
-     * is brought to front; otherwise, a new editor is opened. If
-     * <code>activate == true</code> the editor will be activated. The cursor
-     * and selection state of the editor are then updated from information
-     * recorded in the marker.
-     * <p>
-     * <p>
-     * If the marker contains an <code>EDITOR_ID_ATTR</code> attribute the
-     * attribute value will be used to determine the editor type to be opened.
-     * If not, the registered editor for the marker resource will be used.
-     * </p>
-     * 
-     * @param marker
-     *            the marker to open
-     * @param activate
-     *            if <code>true</code> the editor will be activated
-     * @return an open editor, or null if a system editor was opened
-     * @exception PartInitException
-     *                if the editor could not be initialized
-     * @deprecated In 3.0 this resource-specific method moved from this
-     *             interface to
-     *             <code>org.eclipse.ui.ide.IDE.openEditor(IWorkbenchPage,IMarker,boolean)</code>.
-     *             This method should not be referenced at development time. See
-     *             the class comment for more details.
-     */
-    public IEditorPart openEditor(IMarker marker, boolean activate)
-            throws PartInitException;
-
-    /**
-     * Opens an operating system editor on a given file. Once open, the
-     * workbench has no knowledge of the editor or the state of the file being
-     * edited. Users are expected to perform a "Local Refresh" from the
-     * workbench user interface.
-     * 
-     * @param input
-     *            the file to edit
-     * @exception PartInitException
-     *                if the editor could not be opened.
-     * @deprecated In 3.0 this resource-specific method was removed. Use
-     *             <code>openEditor(new FileEditorInput(file), IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID)</code>
-     *             instead. This method should not be referenced at development
-     *             time. See the class comment for more details.
-     */
-    public void openSystemEditor(IFile input) throws PartInitException;
-}
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/CustomizePerspectiveDialog.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/CustomizePerspectiveDialog.java
index 3b8904c..a6a9701 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/CustomizePerspectiveDialog.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/CustomizePerspectiveDialog.java
@@ -850,7 +850,7 @@
 			this.showKeyBindings = showKeyBindings;
 			this.filter = filter;
 			this.setHideOnMouseDown(false);
-			this.setShift(new Point(-1, -1));
+			this.setShift(new Point(-5, -5));
 		}
 
 		protected void addContent(Composite destination, Object modelElement) {
diff --git a/bundles/org.eclipse.ui/.classpath b/bundles/org.eclipse.ui/.classpath
deleted file mode 100644
index ce0c7a5..0000000
--- a/bundles/org.eclipse.ui/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/CDC-1.0%Foundation-1.0"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.ui/.cvsignore b/bundles/org.eclipse.ui/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/bundles/org.eclipse.ui/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui/.options b/bundles/org.eclipse.ui/.options
deleted file mode 100644
index 8822dc0..0000000
--- a/bundles/org.eclipse.ui/.options
+++ /dev/null
@@ -1,151 +0,0 @@
-# Debugging options for the org.eclipse.ui plugin.
-
-# Turn on debugging for the org.eclipse.ui plugin.
-org.eclipse.ui/debug=false
-
-# Show all jobs in dialogs and the progress view including the support jobs
-org.eclipse.ui/debug/showAllJobs=false
-
-#Report if a stale job was found
-org.eclipse.ui/debug/job.stale=false
-
-#Report if an image cannot be resolved when it is declared
-org.eclipse.ui/debug/declaredImages=false
-
-# Enable extended SWT debugging of the Device.
-org.eclipse.ui/debug/swtdebug=false
-
-# Enable the global SWT debugging (Device#DEBUG)
-org.eclipse.ui/debug/swtdebugglobal=false
-
-# Enable logging of certain contribution related messages
-org.eclipse.ui/debug/contributions=false
-
-# Enable logging of additional working set messages
-org.eclipse.ui/debug/workingSets=false
-
-# Enable the trace of SWT graphics.
-org.eclipse.ui/trace/graphics=false
-
-## Note that logging of all performance events are controlled by a central flag
-## Turn this flag on to enable tracking of performance events
-## org.eclipse.core.runtime/perf=true
-
-
-# Reports the time to restore the workbench.
-org.eclipse.ui/perf/workbench.restore=30000
-
-# Reports the time to start up the workbench.
-org.eclipse.ui/perf/workbench.start=45000
-
-# Reports the time to activate parts.
-org.eclipse.ui/perf/part.activate=200
-
-# Reports the time to create a part.
-org.eclipse.ui/perf/part.create=800
-
-# Reports the time to initialize a part.
-org.eclipse.ui/perf/part.init=800
-
-# Reports the time to create a part's input
-org.eclipse.ui/perf/part.input=200
-
-# Reports the time to create a part's control
-org.eclipse.ui/perf/part.control=800
-
-# Reports the time to notify part listeners.
-org.eclipse.ui/perf/part.listeners=200
-
-# Reports the time to notify page listeners.
-org.eclipse.ui/perf/page.listeners=200
-
-# Reports the time to create perspectives
-org.eclipse.ui/perf/perspective.create=800
-
-# Reports the time to notify perspective listeners.
-org.eclipse.ui/perf/perspective.listeners=200
-
-# Reports the time to switch perspectives
-org.eclipse.ui/perf/perspective.switch=800
-
-# Reports the time to run UI jobs
-org.eclipse.ui/perf/uijob=200
-
-# Reports the time to determine the content type of a file
-org.eclipse.ui/perf/contentTypes=200
-
-# Controls whether the heap status indicator is shown
-org.eclipse.ui/perf/showHeapStatus=true
-
-# Reports all events entering through the common event framework used by the
-# commands architecture.  See ISourceProvider and AbstractSourceProvider.DEBUG.
-org.eclipse.ui/trace/sources=false
-
-# Reports events received and dispatched by the key binding architecture
-org.eclipse.ui/trace/keyBindings=false
-
-# Report every event received by the key binding architecture
-org.eclipse.ui/trace/keyBindings.verbose=false
-
-# Report information about command execution
-org.eclipse.ui/trace/commands=false
-
-# Report every change in the list of contexts.
-org.eclipse.ui/trace/contexts=false
-
-# Track the performance of context decision-making in the workbench.
-org.eclipse.ui/trace/contexts.performance=false
-
-# Report a bit of stack around every change in the list of contexts.
-org.eclipse.ui/trace/contexts.verbose=false
-
-# Report handler conflicts within the workbench
-org.eclipse.ui/trace/handlers=false
-
-# Track the performance of handler decision-making in the workbench.
-org.eclipse.ui/trace/handlers.performance=false
-
-# Report verbose information about changing handlers in the system.
-org.eclipse.ui/trace/handlers.verbose=false
-
-# Restrict the verbose information to a particular command
-org.eclipse.ui/trace/handlers.verbose.commandId=
-
-# Report unexpected (undo) operations history events.
-org.eclipse.ui/trace/operations=false
-
-# Report verbose information about (undo) operations history changes.
-org.eclipse.ui/trace/operations.verbose=false
-
-# Turns on experimental code dealing with the rendering of menus.  This is not
-# guaranteed to provide a working workbench.
-org.eclipse.ui/experimental/menus=false
-
-# Report multi page editor tracing information
-org.eclipse.ui/trace/multipageeditor=false
-
-# Enable logging of events fired from an IWorkbenchPage to an IPartListener
-org.eclipse.ui/listeners/IWorkbenchPage.IPartListener=false
-
-# Enable logging of events fired from an IWorkbenchPage to an IPartListener2
-org.eclipse.ui/listeners/IWorkbenchPage.IPartListener2=false
-
-# Enable logging of events fired from an IWorkbenchPage to an IPropertyChangeListener
-org.eclipse.ui/listeners/IWorkbenchPage.IPropertyChangeListener=false
-
-# Enable logging of events fired from an IWorkbenchPartReference
-org.eclipse.ui/listeners/IWorkbenchPartReference=false
-
-# Enable logging of events fired from an IWorkbenchWindow to an IPerspectiveListener
-org.eclipse.ui/listeners/IWorkbenchWindow.IPerspectiveListener=false
-
-# Enable logging of events fired from an IWorkbenchWindow to an IPartListener
-org.eclipse.ui/listeners/IWorkbenchWindow.IPartListener=false
-
-# Enable logging of events fired from an IWorkbenchWindow to an IPartListener2
-org.eclipse.ui/listeners/IWorkbenchWindow.IPartListener2=false
-
-# Enable logging of events fired from an IWorkbenchWindow to an IPageListener
-org.eclipse.ui/listeners/IWorkbenchWindow.IPageListener=false
-
-
diff --git a/bundles/org.eclipse.ui/.project b/bundles/org.eclipse.ui/.project
deleted file mode 100644
index c61795f..0000000
--- a/bundles/org.eclipse.ui/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 3a98de6..0000000
--- a/bundles/org.eclipse.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,71 +0,0 @@
-#Tue Sep 11 09:40:38 EDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.1
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.3
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.ui/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.ui/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index dd12de8..0000000
--- a/bundles/org.eclipse.ui/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Mon Feb 06 11:15:32 EST 2006
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.3\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template></templates>
diff --git a/bundles/org.eclipse.ui/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.ui/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 3544248..0000000
--- a/bundles/org.eclipse.ui/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Nov 16 14:10:37 EST 2004
-compilers.p.unused-element-or-attribute=1
-compilers.p.unresolved-ex-points=0
-compilers.p.deprecated=0
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unknown-class=1
-compilers.p.unknown-attribute=0
-compilers.p.no-required-att=0
-eclipse.preferences.version=1
-compilers.p.unresolved-import=0
-compilers.p.not-externalized-att=0
-compilers.p.illegal-att-value=0
-compilers.use-project=true
diff --git a/bundles/org.eclipse.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 2acfc52..0000000
--- a/bundles/org.eclipse.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,18 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui; singleton:=true
-Bundle-Version: 3.5.0.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.ui.internal.UIPlugin
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: %Plugin.providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.ui.internal;x-internal:=true
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.swt;bundle-version="[3.4.0,4.0.0)";visibility:=reexport,
- org.eclipse.jface;bundle-version="[3.5.0,4.0.0)";visibility:=reexport,
- org.eclipse.ui.workbench;bundle-version="[3.5.0,4.0.0)";visibility:=reexport,
- org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)"
-Bundle-RequiredExecutionEnvironment: CDC-1.0/Foundation-1.0,
- J2SE-1.3
diff --git a/bundles/org.eclipse.ui/about.html b/bundles/org.eclipse.ui/about.html
deleted file mode 100644
index 4602330..0000000
--- a/bundles/org.eclipse.ui/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui/build.properties b/bundles/org.eclipse.ui/build.properties
deleted file mode 100644
index e86fc1e..0000000
--- a/bundles/org.eclipse.ui/build.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = icons/,\
-               .options,\
-               plugin.properties,\
-               plugin.xml,\
-               about.html,\
-               .,\
-               META-INF/
-src.includes = about.html,\
-               schema/
-source.. = src/
diff --git a/bundles/org.eclipse.ui/buildnotes_workbench.html b/bundles/org.eclipse.ui/buildnotes_workbench.html
deleted file mode 100644
index a1f6002..0000000
--- a/bundles/org.eclipse.ui/buildnotes_workbench.html
+++ /dev/null
@@ -1,5117 +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="Build" content="Build">
-   <title>Eclipse Platform Release Notes (3.5) - JFace and Workbench</title>
-</head>
-
-<body>
-
-<h1>Eclipse Platform Build Notes (3.5)<br>
-JFace and Workbench</h1>
-
-<p>Integration Build (December 08, 2008, 1:50 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=255829">Bug 255829</a>. [JFace] Wrong types and methods used in org.eclipse.jface (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=257752">Bug 257752</a>. [Metadata] IWorkbenchBrowserSupport needs @noextend flag (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=257790">Bug 257790</a>. [MPE] [regression] MultiPageEditorPart.pageChange(int) fires PageChangedEvent if selected page is null. (FIXED)<br>
-  </p>
-
-<p>Integration Build (December 05, 2008, 6:12 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=155805">Bug 155805</a>. [refactoring] Status line permanently shows "Building Workspace" while rename dialog is up (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204879">Bug 204879</a>. [LinkedResources] PathVariableDialog's button positioning is confusing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217906">Bug 217906</a>. [WorkingSets] IWorkingSetManager.createWorkingSetSelectionDialog javadoc states wrong behavior (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=243758">Bug 243758</a>. [Contributions] Accelerators in menus are not installed until menu shown (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=247806">Bug 247806</a>. [ErrorHandling] [plan item] configurable statushandlers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=248733">Bug 248733</a>. Expression is not evaluated at startup (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=254524">Bug 254524</a>. [DataBinding] Bindings should self-dispose when target or model is disposed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=256556">Bug 256556</a>. [Progress] Possibly broken code in DetailedProgressViewer.setFocus (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=256558">Bug 256558</a>. [Viewers] Possibly broken code in FilteredTree.getFirstMatchingItem(TreeItem[]) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=257089">Bug 257089</a>. e4 workbench compatibility fragment (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=257234">Bug 257234</a>. [statushandling] class created during new statushandler definiton process is not derived from AbstractStatusHandler (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=257324">Bug 257324</a>. [Mac] Menu items "About Eclipse SDk" and "Preferences" of Top menu "Eclipse" not disable after show the dialog of "About Eclipse SDK" (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=257531">Bug 257531</a>. [ErrorHandling] WorkbenchStatusDialogManager leaks two images in StatusTray (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=257723">Bug 257723</a>. [Mac] Menu items "About Eclipse SDk" and "Preferences" of Top menu "Eclipse" not disable after show the dialog of "About Eclipse SDK" (FIXED)<br>
-  </p>
-
-<p>Integration Build (December 01, 2008, 5:23 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=49316">Bug 49316</a>. [Workbench] isStarting() public API of Workbench (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=141690">Bug 141690</a>. [Graphics] Improve Look and Feel of FilteredTree (FIXED)<br>
-  </p>
-
-<p>Integration Build (December 01, 2008, 4:40 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=2035">Bug 2035</a>. [Wizards] Previous location of project content area not remembered (1GDQUX8) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119085">Bug 119085</a>. [TabbedProperties] need getters and setters for the current Tab and current Section (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175069">Bug 175069</a>. [Preferences] ResourceInfoPage is not setting dialog font on all widgets (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177337">Bug 177337</a>. Make nested services API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181308">Bug 181308</a>. [Viewers] Add checked state provider to CheckBox*Viewer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182714">Bug 182714</a>. [Contributions] Improve toolbar configurability (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228397">Bug 228397</a>. Add font support for StyledCellLabelProvider (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229127">Bug 229127</a>. [Services] Provide the IWorkbenchLocationService (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229782">Bug 229782</a>. Performance tests for ICU Collator (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=238397">Bug 238397</a>. [Commands] Concurrent modification possible in DefaultOperationHistory (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242208">Bug 242208</a>. [Markers] Filtering problems by working set doesn't take into account new files (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=245155">Bug 245155</a>. [TabbedProperties] IllegalArgumentException: Argument not valid (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=245690">Bug 245690</a>. [TabbedProperties] All tabs will be shown for ISelection instances not implementing IStructuredSelection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=249442">Bug 249442</a>. [Contributions] VisibleWhen with checkedEnabled expression on menuContribution (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=249498">Bug 249498</a>. [Wizards] Increase size of Help Icon on wizards (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=249647">Bug 249647</a>. [ErrorHandling] Enable new ErrorDialog to open the SupportDialog by default (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=250651">Bug 250651</a>. [Contributions] CommandContributionItemParameter's constructor javadoc needs correction (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=254492">Bug 254492</a>. [Import/Export] ILeveledImportStructureProvider interface is not declared public (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=255393">Bug 255393</a>. [Import/Export] Browse button missing for the export wizard icon field (plugin.xml editor) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=256516">Bug 256516</a>. [TabbedProperties] TabbedPropertySheetPage to allow some options (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=256716">Bug 256716</a>. [Viewers] FilteredTree job delay should be overridable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=256830">Bug 256830</a>. [Contributions] [regression] IElementUpdater.updateElement() - IWorkbenchPartSite service not in scope of provided UIElement (FIXED)<br>
-  </p>
-
-<p>Integration Build (November 24, 2008, 6:25 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=74298">Bug 74298</a>. [Dialogs] no null check in WorkbenchEditorsDialog. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242789">Bug 242789</a>. [Markers]If you hit escape on the delete markers dialog it deletes them anyway (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242819">Bug 242819</a>. [ErrorHandling] [statushandling] WorkbenchStatusDialogManager.setStatusListLabelProvider is inconsistent (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242821">Bug 242821</a>. [ErrorHandling] [statushandling ]Need a way to configure label providers on StatusDialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=254547">Bug 254547</a>. [DND] PluginDropAdapter does not accept multiple actions in an extension (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=254673">Bug 254673</a>. [JFace] Window javadoc hints at overriding createShell() when this is not possible (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=256124">Bug 256124</a>. [Menu] Allow programatic additions to the menu system via the extension point (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=256158">Bug 256158</a>. [Metadata] Constants in ISharedImages cause API tooling errors (FIXED)<br>
-  </p>
-
-<p>Integration Build (November 17, 2008, 6:30 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56368">Bug 56368</a>. [View Mgmt] ?Show? menu contains unnecessary separator when it only contains one menu item. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128684">Bug 128684</a>. [Help] Dialog help tray does not resize correctly (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189752">Bug 189752</a>. [Dialogs] TwoPaneElementSelector doesn't validate proper selection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198941">Bug 198941</a>. [About] About dialogue should use "name" (i.e. plug-in name) instead of provider name for hover-over popup (CLOSED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=232076">Bug 232076</a>. [WorkingSets] Calls to WorkingSet executable extensions need SafeRunnable wrappers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246103">Bug 246103</a>. [DataBinding] JavaBeanObservableValue does not generate correct ValueDiff when oldValue == newValue == null (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=251517">Bug 251517</a>. [Preferences] Increase visibility for the ListEditor fields or methods (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=253979">Bug 253979</a>. [About] Remove dependency on update manager (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=255042">Bug 255042</a>. [Dialogs] TwoPaneElementSelector is broken if multi-selection is requested (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=255314">Bug 255314</a>. Job description for clean job is misleading (FIXED)<br>
-  </p>
-
-<p>Integration Build (October 29, 2008, 12:57 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=248392">Bug 248392</a>. View becomes disabled and completly nonfunctional (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=252487">Bug 252487</a>. [DataBinding] use Double.isNaN(d) instead of d!=d to check for NaN (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=252617">Bug 252617</a>. The dynamic test 'testMenuContribution' is throwing an InvalidRegistryObjectException (NEW)<br>
-  </p>
-
-<p>Integration Build (October 26, 2008, 3:45 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=11001">Bug 11001</a>. [Perspectives] DCR: Would like configurable "per perspective" editor sharing (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=38789">Bug 38789</a>. [Commands] parameters: Provide commands for the "Show In" menu items -- allowing key bindings (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=97786">Bug 97786</a>. [Viewers] - Lazy Virtual Table View Test - duplicate items appear after delete (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134190">Bug 134190</a>. [JFace] NPE in StatusLine class (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180392">Bug 180392</a>. [DataBinding] Add support for shorts, bytes, and BigDecimal to StringToNumberConverter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201391">Bug 201391</a>. [MPE] notifaction when active page of a MultiPageEditorPart changes (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201441">Bug 201441</a>. [Undo] Undoing a deleted project with UTF-8 charset encoding raise an message error (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217761">Bug 217761</a>. [Viewers] Widget is disposed when DecoratorManager tries to update Viewer that's gone (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219901">Bug 219901</a>. [Undo] new file creation subjec to Undo (file deleted without warning) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223956">Bug 223956</a>. [Undo] Undoing a project delete re-assigns markers from the file to the project (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230349">Bug 230349</a>. [StatusHandling] Status label provider should not be disposed when its modality is switched (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=234345">Bug 234345</a>. [Viewers] AbstractTreeViewer#getChildren(Widget,Object[]) holds doc that it is experimental (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=236795">Bug 236795</a>. [JFace] SWT Exception creates endless cycle (CLOSED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=237856">Bug 237856</a>. [Wizards] [DataBinding] WizardPageSupport class should track the staleness state of relevant observables (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=241849">Bug 241849</a>. [Markers] Need a property tester to test the marker type of a MarkerEntry (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242225">Bug 242225</a>. [Viewers] EditingSupport#setValue() doc (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=243347">Bug 243347</a>. [Wizards] TarFile should not throw NPE in finalize() (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=244246">Bug 244246</a>. [JFace] StatusLine#setCanceled method of IProgressMonitor interface requires UI Access (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246105">Bug 246105</a>. [Dialogs] Title and description not layed out properly when title image is null (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246462">Bug 246462</a>. [DataBinding] [Databinding] Extend ControlObservableValue to observe Size, Location, Bounds and Focus of a control (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246700">Bug 246700</a>. [Metadata] Action 'style' attribute cannot be set to "pulldown" (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246782">Bug 246782</a>. [DataBinding] observeDetail* methods in BeansObservables and PojoObservables should not take a realm argument (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246875">Bug 246875</a>. [About] allow for an extensible About dialog (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=247720">Bug 247720</a>. [FieldAssist] Field Assist Example password field mixes chars with *'s (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=247818">Bug 247818</a>. [StatusHandling] WorkbenchStatusDialogManager should inform of dialog closure (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=249498">Bug 249498</a>. [Wizards] Increase size of Help Icon on wizards (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=251001">Bug 251001</a>. [Commands] Removed unused Action classes related to Update Manager (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=251003">Bug 251003</a>. [DataBinding] MultiValidator misses some dependencies (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=251193">Bug 251193</a>. closing the WorkbenchWindow causes the RectangleAnimation to fail (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=251257">Bug 251257</a>. [Contributions] IAction.setImageDescriptor() javadoc needs to note "image vs. checked" platform discrepancy (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=251444">Bug 251444</a>. [Contributions] MenuService registry changes causes CME (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=251568">Bug 251568</a>. javadoc warnings in N20081020-2000 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=251796">Bug 251796</a>. [Contributions] [Metadata] org.eclipse.ui.menu menu element labeled by mnemonic instead of label (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=251884">Bug 251884</a>. [DataBinding] applyTo() methods in SetDiff, ListDiff and MapDiff (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=251995">Bug 251995</a>. [LinkedResources] Error logged when opening Properties dlg on a Linked Resource folder involving a path variable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=251996">Bug 251996</a>. [Workbench] WorkbenchLabelProvider leaks (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=251997">Bug 251997</a>. [Wizards] StackOverflowError in WizardsRegistryReader (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=252117">Bug 252117</a>. [DataBinding] ListBinding does not update from model to target in some cases (FIXED)<br>
-  </p>
-
-<p>Integration Build (October 20, 2008, 8:35 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=84107">Bug 84107</a>. [DnD] DragCursors should be shared (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=84220">Bug 84220</a>. [Dialogs] TwoPaneElementSelector: can't set sorter / initial order is not kept (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=146397">Bug 146397</a>. [DataBinding] IObservable needs an isDisposed method (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226289">Bug 226289</a>. [DataBinding] Add getKeyType() and getValueType() to IObservableMap (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231304">Bug 231304</a>. [Contributions] Tooltip for Menu Contributions placed on toolbar: does not include keybinding sequence(inconsistency in migrating from ActionSets to MenuContributions) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=239900">Bug 239900</a>. [DataBinding] DialogPageSupport, PreferencePageSupport, TitleAreaDialogSupport (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246999">Bug 246999</a>. [Contributions] menuContribution/dynamic element cause plugin startup (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=247506">Bug 247506</a>. [Markers] Marker views behave wrong in single-click mode (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=247875">Bug 247875</a>. [Databinding] NPE when ComputedValue depends on detail list backed by AbstractObservableList (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=249809">Bug 249809</a>. [EditorMgmt] adopt schema identifier attribute for org.eclipse.ui.editors (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=251242">Bug 251242</a>. [DataBinding] Javadoc errors in IObservableCollection (FIXED)<br>
-  </p>
-
-<p>Integration Build (October 14, 2008, 1:53 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=85708">Bug 85708</a>. [KeyBindings] preference page: Export button is poorly named (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231304">Bug 231304</a>. [Contributions] Tooltip for Menu Contributions placed on toolbar: does not include keybinding sequence(inconsistency in migrating from ActionSets to MenuContributions) (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=245690">Bug 245690</a>. [TabbedProperties] All tabs will be shown for ISelection instances not implementing IStructuredSelection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246999">Bug 246999</a>. [Contributions] menuContribution/dynamic element cause plugin startup (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=249313">Bug 249313</a>. [TabbedProperties] [properties.tabbed]The label on the extension point propertyTab is not marked as translatable (FIXED)<br>
-  </p>
-
-<p>Integration Build (October 06, 2008, 5:58 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=43573">Bug 43573</a>. [Contributions] Support icon in <menu> (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=145780">Bug 145780</a>. [ActionSets] org.eclipse.ui.actionSets schema implicitly indicates deprecation in descriptions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=148845">Bug 148845</a>. [Contributions] viewActions schema is missing definitionId (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217810">Bug 217810</a>. [KeyBindings] org.eclipse.ui.bindings -> key becomes awkward with carbon and cocoa (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218137">Bug 218137</a>. [ErrorHandling]  Errors for multiple jobs are displayed in many dialogs (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=239485">Bug 239485</a>. [Workbench] Better handling of ws/os specific code (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246875">Bug 246875</a>. [About] allow for an extensible About dialog (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246999">Bug 246999</a>. [Contributions] menuContribution/dynamic element cause plugin startup (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=247945">Bug 247945</a>. [WorkbenchParts] IWorkbenchPartReference's getPart(boolean) method refers to editors (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=248740">Bug 248740</a>. [Databinding] Add 'Item' support (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=249272">Bug 249272</a>. [StatusHandling] Clipboard in WSDM is never used (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=249281">Bug 249281</a>. [StatusHandling] Display.sleep should be used instead of Thread.yield (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=249378">Bug 249378</a>. [Viewers] Make ArrayContentProvider a singleton (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=249433">Bug 249433</a>. [GlobalActions] Change File > Restart mnemonic to something else than File > Revert mnemonic (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=249514">Bug 249514</a>. [Viewers] [JFace] NPE setting StructuredSelection(Object[]) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=249574">Bug 249574</a>. [Contributions] ExternalActionManager.addPropertyChangeListener() doesn't register the ListenerList (FIXED)<br>
-  </p>
-
-<p>Integration Build (September 29, 2008, 10:50 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227559">Bug 227559</a>. Need API to process StyledString (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=232749">Bug 232749</a>. [Preferences] [Themes] Colors and Fonts preference page: Tooltip stays when mouse moved (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=232917">Bug 232917</a>. [DataBinding] SWTObservables.observeText API docs error (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=233306">Bug 233306</a>. [DataBinding] Improve CompositeMap / BidiMap, and add tests (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=241244">Bug 241244</a>. [Status Handling] StatusManager.handle(status, StatusManager.BLOCK) does not block within Wizard.performFinish (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=245647">Bug 245647</a>. [Databinding] Delay for Non-SWT-Observables (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246875">Bug 246875</a>. [About] allow for an extensible About dialog (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246999">Bug 246999</a>. [Contributions] menuContribution/dynamic element cause plugin startup (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=248621">Bug 248621</a>. [DataBinding] Consider supporting Text as argument to SWTObservables.observeText(Control) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=248833">Bug 248833</a>. Fix Javadoc for StyledString.insert(char, int) (FIXED)<br>
-  </p>
-
-<p>Integration Build (September 17, 2008, 3:51 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=84603">Bug 84603</a>. [RCP] [PerspectiveBar] New API or pref to set default perspective bar size (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246612">Bug 246612</a>. [FilteredTree] FilteredTree renders all parent items of matches bold (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=247209">Bug 247209</a>. [JFace] An extra space causes odd-looking indentation in ErrorDialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=247367">Bug 247367</a>. [DataBinding] NPE in AbstractObservableList after disposal (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=247394">Bug 247394</a>. [DataBinding] ComputedObservableMap does not remove listeners from the keyset elements when disposed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=247440">Bug 247440</a>. API error in IWorkbenchPreferenceConstants (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=247651">Bug 247651</a>. javadoc warning in org.eclipse.ui.workbench in I20080916-2000 (FIXED)<br>
-  </p>
-
-<p>Integration Build (September 15, 2008, 3:58 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=84603">Bug 84603</a>. [RCP] [PerspectiveBar] New API or pref to set default perspective bar size (FIXED)<br>
-  </p>
-
-<p>Integration Build (September 15, 2008, 3:37 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=40632">Bug 40632</a>. [Dialogs] Open Resource should have "open with" area to override default open behavior (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173092">Bug 173092</a>. [EditorMgmt] "Open With > Other..." must be resizable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246209">Bug 246209</a>. [Viewers] OpenStrategy postSelection delay hinders automated testing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246373">Bug 246373</a>. [Dialogs] [Progress] ProgressMonitor dialog missing a null check when blocked (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246625">Bug 246625</a>. [DataBinding] Change BeanObservable*Decorator classes to extend DecoratingObservable* (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246875">Bug 246875</a>. [About] allow for an extensible About dialog (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246959">Bug 246959</a>. [WorkingSets] addPropertyChangeListener deprecated on impl but not on interface (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246991">Bug 246991</a>. [Dialogs] Open Resource dialog stays open when I choose Open With > Default Editor (FIXED)<br>
-  </p>
-
-<p>Integration Build (September 08, 2008, 4:05 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=45186">Bug 45186</a>. [UI Guidelines] Double clicking a view does not activate editor (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204700">Bug 204700</a>. [CommonNavigator] ConcurrentModificationException trying to see phys - view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=222289">Bug 222289</a>. [DataBinding] MultiList (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=222991">Bug 222991</a>. [DataBinding] Add getRealizedElements() to complement getKnownElements() in content providers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=234252">Bug 234252</a>. [RCP][CommonNavigator][ResourceNavigator] Secret magic required for images for project (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=237718">Bug 237718</a>. [DataBinding]  Introduce decorator observable classes (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=243466">Bug 243466</a>. [CommonNavigator] documentation missing about how to configure linkHelper (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=245206">Bug 245206</a>. [CommonNavigator] Add test code for dependsOn with overrides in actionProvider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=245359">Bug 245359</a>. 'Open Resource...' dialog looses working set selection if more than one selected (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=245437">Bug 245437</a>. [Preferences] (HEAD) Preference pages not scrollable (accessible) via keyboard (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=245710">Bug 245710</a>. [Workbench] Eclipse process continues to run in background after shutdown (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=245761">Bug 245761</a>. [Presentations] Lazy IndexOutOfBoundsException in PresentationSerializer.getPart (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246381">Bug 246381</a>. [GlobalActions] GlobalUndoAction / GlobalRedoAction causes NPE by unsafely disposing old delegate (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246382">Bug 246382</a>. [KeyBindings] Emacs Binding not visible (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246383">Bug 246383</a>. [KeyBindings] AWT Text fields no longer receive delete key pressed event in workbench (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246384">Bug 246384</a>. [PropertiesDialog] propertyPages extension point does not allow forcePluginActivation when using core.expression's property tester (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=246626">Bug 246626</a>. [DataBinding] Add protected handle* methods to DecoratingObservable* (FIXED)<br>
-  </p>
-
-<p>Integration Build (August 25, 2008, 3:49 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169559">Bug 169559</a>. [CommonNavigator] [DND] - Drag/drop within the project explorer; doesn't scroll (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180881">Bug 180881</a>. [Trim] Cheese when calling Shell#layout() on invisible Shell in RCP (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185561">Bug 185561</a>. [CommonNavigator] When hideAvailableExtensionsTab sets to true, all available content will be removed upon filter select changed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212389">Bug 212389</a>. [CommonNavigator] working set issues: missing project, window working set inconsistency (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228359">Bug 228359</a>. [CommonNavigator] CommonNavigator.selectReveal() should not expand selected elements (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=233618">Bug 233618</a>. [CommonNavigator] Cannot copy/paste a linked resources into a Folder. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=239136">Bug 239136</a>. [CommonNavigator] 'Advanced' as name for the "normal" properties in Properties view seems wrong (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=244610">Bug 244610</a>. [CommonNavigator] tests - test file not correctly closed, causes exception in tearDown (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=244697">Bug 244697</a>. [CommonNavigator] Remove/fix .api-filter (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=245151">Bug 245151</a>. [JFace] [3.5] Arithmetic exception in AbstractColumnLayout (FIXED)<br>
-  </p>
-
-<p>Integration Build (August 18, 2008, 4:09 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115897">Bug 115897</a>. [CommonNavigator] Common Navigator framework should compile and run against JCL/Foundation (CLOSED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161095">Bug 161095</a>. [CommonNavigator] Drag and Drop of non IResource items causes FileTransfer to be created with null data (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=170758">Bug 170758</a>. [CommonNavigator] org.eclipse.ui.navigator.resources should export all packages (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189529">Bug 189529</a>. [CommonNavigator] Project Navigator - Customization dialog should use straight tabs or border (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=200316">Bug 200316</a>. [CommonNavigator] Can not contribute property page to classpath container in project explorer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208804">Bug 208804</a>. [CommonNavigator] change "Navigator" view perspective links (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217801">Bug 217801</a>. [CommonNavigator] Capability filtering of commonWizard extensions uses wrong identifier (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220559">Bug 220559</a>. Regression in some open editor performance tests (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=236612">Bug 236612</a>. [ActivityMgmt] Endless loop in MutableActivityManager.getIdentifier(..) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=238162">Bug 238162</a>. [RCP] Remove dependency on org.eclipse.update.core (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242371">Bug 242371</a>. [About] Looking at Help->Plugins and then closing produces many errors (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242466">Bug 242466</a>. [JFace] Widget is disposed error when closing dialog from OSX dock (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=243209">Bug 243209</a>. [ActivityMgmt] NPE in org.eclipse.ui.internal.activities.Identifer prevents menu contributions from showing up (FIXED)<br>
-  </p>
-
-<p>Integration Build (August 11, 2008, 5:47 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-  </p>
-
-<p>Integration Build (August 05, 2008, 4:14 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=235018">Bug 235018</a>. [Markers] Regression: Columns in Problems view grow wider with each restart (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242900">Bug 242900</a>. [Markers] (3.4 maint.) Test failure in MarkersViewColumnSizeTest.testColumnRestore (NEW)<br>
-  </p>
-
-<p>Integration Build (August 04, 2008, 6:22 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204879">Bug 204879</a>. [LinkedResources] PathVariableDialog's button positioning is confusing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208160">Bug 208160</a>. [JFace] Request for RowLayoutFactory (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=235018">Bug 235018</a>. [Markers] Regression: Columns in Problems view grow wider with each restart (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=235195">Bug 235195</a>. [Wizards] [DataBinding] Non-error statuses not handled correctly by WizardPageSupport class (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=236605">Bug 236605</a>. [DataBinding] Duplicate entries in bound list after update (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=238862">Bug 238862</a>. org.eclipse.ui.tests needs to set a proper JRE in its .classpath file (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=238909">Bug 238909</a>. [DataBinding] Correctly set the staleness state of the validation status observable of the MultiValidator (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=240009">Bug 240009</a>. [Viewers] FilteredTree.getBoldFont calls filter.setPattern many times (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=241117">Bug 241117</a>. [Viewers] Possible java.lang.ArrayIndexOutOfBoundsException (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=241209">Bug 241209</a>. [Markers] [Problems View] Changing columns in the preferences makes errors disappear from the view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242017">Bug 242017</a>. [DataBinding] ButtonObservableValue does bot store the inital value during init causing the next change to be dropped (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242166">Bug 242166</a>. [DataBinding] Add StaleEventTracker class to conformance tests (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242371">Bug 242371</a>. [About] Looking at Help->Plugins and then closing produces many errors (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242409">Bug 242409</a>. [Preferences] Preference links don't switch preference pages if dialog already open in tips and tricks (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242411">Bug 242411</a>. [GlobalActions]'Export...' and 'Exit' menu items under the 'File' menu share the same mnemonic (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242421">Bug 242421</a>. [KeyBindings] WARNING messages generated for incorrect message content in plugin org.eclipse.ui.workbench (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242427">Bug 242427</a>. [Commands] IAction.AS_RADIO_BUTTON actions contributed with ActionContributionItem to MenuManager have problems getting checked on selection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242446">Bug 242446</a>. [Contributions] ActionDelegateHandlerProxy fails with ClassCastException (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242583">Bug 242583</a>. [About] Feature info text area in about dialog does not wrap text (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242760">Bug 242760</a>. [Browser] Delete key is eaten in Internal Web Browser (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242765">Bug 242765</a>. [Commands] NPE in ContributedAction.runWithEvent() (FIXED)<br>
-  </p>
-
-<p>Integration Build (July 28, 2008, 3:30 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=233313">Bug 233313</a>. [Preferences] Mistake in javadoc for PreferencePage (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=240381">Bug 240381</a>. [Progress] NPE in org.eclipse.ui.workbench GroupInfo.java and JobTreeElement.java (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=240697">Bug 240697</a>. [DataBinding] StringToNumberConverter extends non-API type NumberFormatConverter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=241277">Bug 241277</a>. [ErrorHandling] DefaultDetailsArea and StackTraceSupportArea leak Clipboards (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=241318">Bug 241318</a>. [DataBinding] DetailObservable(Value|List|Set) disposes the master observable in its own dispose() method (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=241384">Bug 241384</a>. [Markers] Cannot delete marker from in marker, problems, task or bookmarks view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=241585">Bug 241585</a>. [DataBinding] JavaBeanObservableMap returns non-null values for keys not in keySet (FIXED)<br>
-  </p>
-
-<p>Integration Build (July 21, 2008, 3:33 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230296">Bug 230296</a>. [DataBinding] Refactoring in ViewerUpdaters (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=237273">Bug 237273</a>. [About] About dialog does not change about.mappings for dynamic product (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=238901">Bug 238901</a>. [Viewers] TableViewer with SWT.VIRTUAL performance not optimal when selection changes (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=239302">Bug 239302</a>. [DataBinding] ViewersObservables.observeFilters() (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=239981">Bug 239981</a>. [DataBinding] API error in org.eclipse.core.databinding (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=240363">Bug 240363</a>. [Viewers] [open type] Problem with Open Type filtering (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=240444">Bug 240444</a>. [DataBinding] WizardPageSupport illegally instantiates AssertionFailedException (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=240562">Bug 240562</a>. [DataBinding] Strange constants in StringToNumberConverter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=240590">Bug 240590</a>. [DataBinding] MultiValidator should set the new validation status outside the observable tracking runnable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=240651">Bug 240651</a>. [EditorMgmt] Introduce AbstractMultiEditor (FIXED)<br>
-  </p>
-
-<p>Integration Build (July 07, 2008, 3:27 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112502">Bug 112502</a>. [TabbedProperties] Properties view doesn't scroll normally (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=140314">Bug 140314</a>. [TabbedProperties] Advanced Info tab doesn't scroll to reveal (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168012">Bug 168012</a>. [TabbedProperties] Incomplete doc for org.eclipse.ui.views.properties.tabbed.propertyTabs ext point (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219946">Bug 219946</a>. [TabbedProperties] Tabbed property sheet tab titles can get truncated when selected (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=234686">Bug 234686</a>. [DataBinding] API for creating observables should not require realm (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=236666">Bug 236666</a>. [DataBinding] Need snippet for two combo example (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=237163">Bug 237163</a>. [DataBinding] UnmodifiableObservableValue should delegate the isStale() method to its wrapped value. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=237703">Bug 237703</a>. [DataBinding] ComputedSet (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=238901">Bug 238901</a>. [Viewers] TableViewer with SWT.VIRTUAL performance not optimal when selection changes (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=239260">Bug 239260</a>. [Mac] [KeyBindings] Keybindings wrong on Cocoa (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=239288">Bug 239288</a>. [DataBinding] Apply 237884 patch to HEAD (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=239289">Bug 239289</a>. [DataBinding] Apply 239015 patch to HEAD (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=239300">Bug 239300</a>. [TabbedProperties] underline missing from tab label when tab has focus (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=239523">Bug 239523</a>. [TabbedProperties] Three JavaDoc warnings (FIXED)<br>
-  </p>
-
-<p>Integration Build (June 23, 2008, 3:06 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137478">Bug 137478</a>. [Preferences] ProjectReferencePage has too wide left margin (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172692">Bug 172692</a>. [About] About dialog text - Add capability to read system properties (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210491">Bug 210491</a>. [Mac] FilteredItemsSelectionDialog can use SWT.SEARCH attribute (FIXED)<br>
-  </p>
-
-<p>Integration Build (June 10, 2008, 12:00 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=236265">Bug 236265</a>. org.eclipse.ui.carbon missing about.html (FIXED)<br>
-  </p>
-
-<p>Integration Build (June 06, 2008, 12:54 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223259">Bug 223259</a>. [Contributions] Typos in menus schema (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229306">Bug 229306</a>. Doc rewording (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=236083">Bug 236083</a>. [Doc] Copyright update (NEW)<br>
-  </p>
-
-<p>Integration Build (June 05, 2008, 9:45 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=235009">Bug 235009</a>. [Workbench] 3.4 Platform UI API still marked as experimental (FIXED)<br>
-  </p>
-
-<p>Integration Build (June 05, 2008, 3:13 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228956">Bug 228956</a>. [RCP] [Doc] Document expression-based actitivies (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=235343">Bug 235343</a>. [Doc] Update services javadoc with the correct information (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=235613">Bug 235613</a>. [DetachedView] Widget disposed exception when disposing ShellPool on shutdown (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=235819">Bug 235819</a>. [Services] [Doc] Small blurb for org.eclipse.ui.ISaveablesLifecycleListener (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=235845">Bug 235845</a>. [Services] [Doc] Add documentation for org.eclipse.ui.services (ASSIGNED)<br>
-  </p>
-
-<p>Integration Build (June 04, 2008, 3:19 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=234362">Bug 234362</a>. [Graphics] Update the marker help graphic (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=235009">Bug 235009</a>. [Workbench] 3.4 Platform UI API still marked as experimental (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=235455">Bug 235455</a>. [sec] Documentation for the secure storage (FIXED)<br>
-  </p>
-
-<p>Integration Build (June 03, 2008, 3:25 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109241">Bug 109241</a>. Creating Working Sets docs unclear (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=197587">Bug 197587</a>. [Workbench] Document that workbench window doesn't fire activation/deactivation events if no active page opened in that window (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=232196">Bug 232196</a>. Workspace chooser cancel button results in crash on Linux (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=234350">Bug 234350</a>. Screen shots need updating for 3.4 (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=235179">Bug 235179</a>. [GlobalActions] Help/Tips and Tricks menu is missing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=235343">Bug 235343</a>. [Doc] Update services javadoc with the correct information (NEW)<br>
-  </p>
-
-<p>Integration Build (May 30, 2008, 1:26 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186198">Bug 186198</a>. [CommonNavigator]  View menu items need accelerator keys (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218249">Bug 218249</a>. [Markers] Protect against invalid IMarker attribute values (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=233709">Bug 233709</a>. [EditorMgmt] TVT34:TCT545: JA: One item missing mnemonic in Editor preferences panel (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 29, 2008, 12:10 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=232489">Bug 232489</a>. [Contributions] Switching editors updates TooItems updated due to calls to org.eclipse.ui.menus.CommandContributionItem.updateIcons() (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=234372">Bug 234372</a>. [Contributions] objectContributions enablement needs org.eclipse.core.runtime.Platform (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 28, 2008, 6:31 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218197">Bug 218197</a>. [Workbench] Handle missing parts on startup more elegantly (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223976">Bug 223976</a>. [Decorators] Content type decorator: Updating missing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227721">Bug 227721</a>. [Decorators] ContentTypeDecorator causes NPE in JFaceResources.getResources (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=232036">Bug 232036</a>. [ErrorHandling] "Multiple Problems have occurred" dialog should not be modal (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=234228">Bug 234228</a>. [JavaDoc] [Viewers] AbstractTableViewer#replace(Object, int) JavaDoc misses description for arguments (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 27, 2008, 4:53 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=225425">Bug 225425</a>. [DataBinding] Load of known null value in CompositeMap (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=232048">Bug 232048</a>. [Viewers] binary incompatibility (adding public fields) reported against jface.viewers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=232997">Bug 232997</a>. [Commands][Mac] context menu submenus are disabled when selecting on OSX (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=233285">Bug 233285</a>. [TabbedProperties] Adopt API tooling (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 21, 2008, 3:52 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229789">Bug 229789</a>. [Examples] examples plugins create duplicate menus in menubar (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=232541">Bug 232541</a>. [ViewMgmt] Reset Perspective ignores saveable parts (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=232556">Bug 232556</a>. [DetachedView] Saveable views can't cancel when detached (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=232851">Bug 232851</a>. Performance regression: OpenCloseViewTest#showView:ResourceNavigator (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 16, 2008, 9:11 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231611">Bug 231611</a>. [Contributions] Provide a project configure context menu (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 15, 2008, 7:24 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=199179">Bug 199179</a>. [DataBinding] WizardPageSupport does not report exceptions thrown in bindings (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230012">Bug 230012</a>. [FieldAssist] Replace Information overlay in JFace with standard 7x8 size (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231163">Bug 231163</a>. [ErrorHandling] WorkbenchStatusDialogManager shouldn't hold onto parentShell (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 15, 2008, 3:49 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157506">Bug 157506</a>. [CommonNavigator] Can't Drop an External File into Project Explorer (Mac and Linux) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=197113">Bug 197113</a>. Project Explorer drag and drop selection not working properly (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229983">Bug 229983</a>. [Markers] Order of Quick Fix entries should not be random (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 14, 2008, 7:38 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189588">Bug 189588</a>. [WorkingSets] ConcurrentModificationException in AbstractWorkingSetManager on startup (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=225601">Bug 225601</a>. Adopt API tooling for UI bundles (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226547">Bug 226547</a>. [ActivityMgmt] Can't open PreferenceDialog with own PreferenceNodes (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228880">Bug 228880</a>. [Themes] Running test suites in HighContrast crashes on launch (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230351">Bug 230351</a>. [StatusHandling] The details area doesn't fit into the dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230365">Bug 230365</a>. [StatusHandling] Status dialog buttons glued to bottom edge (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230467">Bug 230467</a>. [ActivityMgmt] To make things clearer activityRequirementBindings shouldn't interfere with expression controlled activities (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231016">Bug 231016</a>. [Contributions] PopupMenuExtender causes CCE with GMF (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231358">Bug 231358</a>. [Contributions] Provide a core expression to check for bundle activation (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 13, 2008, 3:43 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226342">Bug 226342</a>. [KeyBindings] Keys preference page conflict table is hard to read (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230467">Bug 230467</a>. [ActivityMgmt] To make things clearer activityRequirementBindings shouldn't interfere with expression controlled activities (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231255">Bug 231255</a>. [PropertiesDialog] Properties dialog should show busy cursor while initialising page (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231338">Bug 231338</a>. [JFace] JFace ToolTip should disappear when underlying widget is scrolled (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231341">Bug 231341</a>. [Commands] Menu disappears when dialog pops up (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 12, 2008, 4:23 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227421">Bug 227421</a>. [Viewers] TableViewerEditor loops trying to find next cell when the last column has width 0 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229777">Bug 229777</a>. [Viewers] Wrong argument in the first statement of the method org.eclipse.jface.viewers.ColumnViewer.setColumnViewerEditor (?) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231328">Bug 231328</a>. [JFace] Javadoc typo in ToolTip.setShift(Point): default is 3px to right (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231525">Bug 231525</a>. [Viewers] FocusCellManager for Table/Tree produces a WidgetDisposedException on OS-X (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231636">Bug 231636</a>. [DynamicUI] Installing releng tools dynamically results in preference page in the property dialog (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 09, 2008, 4:08 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=152473">Bug 152473</a>. [TabbedProperties] Registry does not support unkown categories (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231103">Bug 231103</a>. [Markers] Remove marker preference page (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231151">Bug 231151</a>. [Markers] markers view "Preferences..." should be "Preferences" (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231175">Bug 231175</a>. [Workbench] WorkbenchLabelProvider leaks (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231182">Bug 231182</a>. ProgressManagerUtil.getModalShellExcluding() should work for stacked dialogs (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231307">Bug 231307</a>. [Themes] Colors and Fonts preference page: Tooltip blocks doubleclick (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 08, 2008, 6:28 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131855">Bug 131855</a>. [TabbedProperties] Provide dynamic tab and section support (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139214">Bug 139214</a>. [Keybindings] Stack overflow in keybindings (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214271">Bug 214271</a>. [CommonNavigator] Undo/redo not enabled if nothing selected (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227317">Bug 227317</a>. [Perspectives] [WorkbenchParts] Fast view on startup causes view ref count to be 2 instead of 1 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227982">Bug 227982</a>. Open Resource dialog should support colored labels (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 08, 2008, 4:15 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62789">Bug 62789</a>. [Themes] Colors and Fonts page does not show selected font (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207350">Bug 207350</a>. [Trim] View disappears when perspective is switched while expanded, minimized view is opened (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210083">Bug 210083</a>. [Show View] Dialog creates all view parts upon node expansion (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=224921">Bug 224921</a>. [IDE] BIDI3.4:HCG_Incorrect display of history in File menu in mirrored mode (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230472">Bug 230472</a>. [ActivityMgmt] Expression controlled Activities aren't correctly synchronized with the internal enabled list when they are persisted and reloaded (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230865">Bug 230865</a>. [EditorMgmt] File > Open File editor should also use content describer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230988">Bug 230988</a>. [Workbench] NPE in OpenNavigatorFolderTest (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=231119">Bug 231119</a>. [GlobalActions] RefreshAction markes as @noextend but should be (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 07, 2008, 4:26 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62789">Bug 62789</a>. [Themes] Colors and Fonts page does not show selected font (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=97553">Bug 97553</a>. [WorkingSets] odd behaviour with select/deselect all buttons (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107799">Bug 107799</a>. [Workbench] API for workbench settings (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218703">Bug 218703</a>. [LinkedResources] linked folder / file wizards fills error log with errors (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=224357">Bug 224357</a>. BIDI3.4:HCG Incomplete mirroring of the Outline view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227107">Bug 227107</a>. [MPE] Next/Previous Page commands: Popup for multi-page editors dislocated (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227983">Bug 227983</a>. [Viewers] FilteredItemsSelectionDialog should obey colored labels preference (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228017">Bug 228017</a>. StyledCellLabelProvider wastes CPU in TableItem#getBounds(..) even if owner draw disabled (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228616">Bug 228616</a>. [KeyBindings] Show View Menu command should not open view menu when dialog is up (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228717">Bug 228717</a>. [KeyBindings] "Alt + Enter" does not open breakpoint properties (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230179">Bug 230179</a>. [JFace] Configure Columns dialog does not use dialog font (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230218">Bug 230218</a>. [JFace] Test failures in PresentationsTestSuite and RCP Tests (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230420">Bug 230420</a>. [ActivityMgmt] The ignoring of default enabling expression enabled activities should be logged (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230879">Bug 230879</a>. Bad test in PlatformUITest (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230970">Bug 230970</a>. [ViewMgmt] NPE in view code should not prevent closing it (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 06, 2008, 4:12 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=97553">Bug 97553</a>. [WorkingSets] odd behaviour with select/deselect all buttons (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=225949">Bug 225949</a>. [Wizards] invalid warning on usage of nested wizard categories (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228197">Bug 228197</a>. [StatusHandling] IAE in WorkbenchStatusDialogManager.refreshSingleStatusArea (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228890">Bug 228890</a>. [Commands] WidgetMethodHandler should not use obsolete Swing API any when possible (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230218">Bug 230218</a>. [JFace] Test failures in PresentationsTestSuite and RCP Tests (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230267">Bug 230267</a>. [DataBinding] ObservableViewerElementSet illegally implements IObservableSet (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=230270">Bug 230270</a>. [DataBinding] Ignore internal implementers/extenders of @noimplement/@noextend interfaces (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 05, 2008, 4:14 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=94825">Bug 94825</a>. [WorkingSets] possible problem in shutdown sequence (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107799">Bug 107799</a>. [Workbench] API for workbench settings (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=225601">Bug 225601</a>. Adopt API tooling for UI bundles (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=225754">Bug 225754</a>. [Import/Export] Project name should not be same as the folder name (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226547">Bug 226547</a>. [ActivityMgmt] Can't open PreferenceDialog with own PreferenceNodes (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229684">Bug 229684</a>. [Progress] Potential bug in ProgressManagerUtil#getModalShellExcluding (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229864">Bug 229864</a>. Table columns dialog list selection length looks odd (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 01, 2008, 12:32 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229807">Bug 229807</a>. [JFace] ConfigureColumnsDialog does not work correctly with reordered columns (NEW)<br>
-  </p>
-
-<p>Integration Build (May 01, 2008, 12:16 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229719">Bug 229719</a>. JFace's default collator not using ICU when running IDE (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229779">Bug 229779</a>. NPE in session tests (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 30, 2008, 7:25 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229440">Bug 229440</a>. [Commands] Ctrl-C not working in marker properties dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229473">Bug 229473</a>. [Contributions] ShowInMenu dispose is attempting to get a service after the workbench has disposed it (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229623">Bug 229623</a>. [Commands] ShowViewAction no longer respects the 'makeFast' parameter (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 30, 2008, 4:43 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169997">Bug 169997</a>. [CellEditors] TableViewer doesn't activate TextCellEditor consistently (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185216">Bug 185216</a>. [CellEditors] Double click behavior on editable cells for tables happens regardless of the button used to execute the second click. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201731">Bug 201731</a>. [WorkbenchLauncher] WorkbenchAdvisor.eventLoopException() no longer called before workbench fully started (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229158">Bug 229158</a>. [Perspectives] perspectiveExtension schema improvement (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229180">Bug 229180</a>. WorkbenchPreferenceNode swallows exceptions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229351">Bug 229351</a>. [Contributions] Customize Perspective dialog removes menu entires (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229386">Bug 229386</a>. [ActivityMgmt] Expression Activities show up like normal activities in the preference page (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 29, 2008, 4:55 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=13895">Bug 13895</a>. [Markers] Cannot resize table columns with keyboard or change sort order (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136698">Bug 136698</a>. [Preferences] Cannot resize sash using keyboard (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188674">Bug 188674</a>. [ViewMgmt] Bad page layout when there are many views in a perspective (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226765">Bug 226765</a>. [DataBinding] Refactor content providers to prevent leaking internal API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229022">Bug 229022</a>. [Progress] Display#getShells returns disposed shell (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229084">Bug 229084</a>. [About] up/down buttons don't enable for About->Plug-in Details->Columns (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229240">Bug 229240</a>. CachedMarkerBuilder writes to console (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 29, 2008, 12:16 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=216758">Bug 216758</a>. [EditorMgmt] NavigationHistory - mergeInto produces NavigationHistoryEntries with disposed locations (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227721">Bug 227721</a>. [Decorators] ContentTypeDecorator causes NPE in JFaceResources.getResources (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 28, 2008, 4:02 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210706">Bug 210706</a>. Make sure that services contributed by third parties work with dynamic plug-ins (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218916">Bug 218916</a>. [Jface] Interfaces component not refreshing when removing an interface (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223405">Bug 223405</a>. [ErrorHandling] IDEExceptionHandler appears to be unused (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223680">Bug 223680</a>. [ErrorHandling] calls to WorkbenchAdvisor.getWorkbenchErrorHandler() come from many threads (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=224997">Bug 224997</a>. [Workbench] Impossible to copy project (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228760">Bug 228760</a>. [Markers] Column orientation not stored when markers views are closed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229127">Bug 229127</a>. [Services] Provide the IWorkbenchLocationService (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 27, 2008, 7:43 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=197787">Bug 197787</a>. [Viewers] wrong cell editor activated after table refresh (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202297">Bug 202297</a>. [Trim] Toolbars appear in wrong order when using org.eclipse.ui.menus (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203259">Bug 203259</a>. [Viewers] Widget is disposed from ColumnViewer.getViewerColumn (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206334">Bug 206334</a>. [Contributions] [Examples] org.eclipse.ui.examples.contributions needs to set an EE (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206584">Bug 206584</a>. [Commands] Memory leak after closing a Workbenchwindow in a RCP Application (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208934">Bug 208934</a>. [EditorMgmt]  Back and Forward menu items don't open dropdown menus (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219635">Bug 219635</a>. [CellEditors] CheckboxEditor flips state when tabbed into (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=225190">Bug 225190</a>. [JFace] ToolTip fails to accept mouse down event in Ganymede (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228125">Bug 228125</a>. [DataBinding] org.eclipse.jface.tests.databinding testEntrySet_Remove and testEntrySet_RemoveAll fail under IBM Java 1.6.0 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228967">Bug 228967</a>. [DataBinding] Unit tests for ViewerElementWrapper (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 25, 2008, 3:51 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=13895">Bug 13895</a>. [Markers] Cannot resize table columns with keyboard or change sort order (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=38662">Bug 38662</a>. [Viewers] Accessibility: unable to resize a table column using keyboard only (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=86268">Bug 86268</a>. [About] About dialog plug-ins and features tables do not meet accessibility requirements (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136698">Bug 136698</a>. [Preferences] Cannot resize sash using keyboard (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=155273">Bug 155273</a>. [Markers] Visibility of problems view columns should be configurable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160329">Bug 160329</a>. [Progress] DetailedProgressViewer needs to limit resources (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=170161">Bug 170161</a>. [Themes] Font Preview is not visible in HighContrast mode (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=197446">Bug 197446</a>. getVisibleItemCount() in a table (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205474">Bug 205474</a>. [Themes] The wrong default font is loaded when you specify a different theme. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206584">Bug 206584</a>. [Commands] Memory leak after closing a Workbenchwindow in a RCP Application (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210750">Bug 210750</a>. [StatusHandling] StatusDialog needs tests (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215672">Bug 215672</a>. [WorkbenchParts] The Workbench's SaveablesList contained some null Saveable and caused NullPointerException (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220841">Bug 220841</a>. [Views] ClassCastException when platform cast from ResourceSorter to ResourceComparator. 3.2 to 3.3 upward compatability issue. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=222107">Bug 222107</a>. [WorkbenchLauncher] Switching workspaces crashes eclipse (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=222153">Bug 222153</a>. Test failure (Invalid registry object) in N20080310-0010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=222750">Bug 222750</a>. [ViewMgmt] Placeholder folders are lost when multi-instance views are dragged (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223056">Bug 223056</a>. [StatusHandling] Status dialog does not resize nicely (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=224681">Bug 224681</a>. [Viewers] jface: StackOverflow using Lazy TreeViewer content provider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226972">Bug 226972</a>. [Mac] move CarbonUIEnhancer to an internal package (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227336">Bug 227336</a>. View menu item doesn't provide a name for screen reader (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227544">Bug 227544</a>. [DataBinding] provisional internal packages should be tagged as x-internal:= true (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227773">Bug 227773</a>. FilteredTree: wrong message for accessibility (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227868">Bug 227868</a>. [Progress] NPE in ProgressManagerUtil$1.compare(...) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227973">Bug 227973</a>. [WorkbenchParts] Variables view is empty until first activation (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228006">Bug 228006</a>. [Markers] Marker generation should not run on shutdown (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228120">Bug 228120</a>. [ActivityMgmt] Expression controlled Activities aren't correctly synchronized with the enabledList if they are enabled directly from the beginning (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228204">Bug 228204</a>. [StatusHandling] NPE in WorkbenchStatusDialogManager.openStatusDialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228475">Bug 228475</a>. [StatusHandling] "Bug" in status dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228786">Bug 228786</a>. [Contributions] Unable to invoke contributed popup menu items - exception in log (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=228863">Bug 228863</a>. [WorkbenchParts] ConcurrentModificationException in org.eclipse.ui.workbench (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 21, 2008, 4:07 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=88098">Bug 88098</a>. [Graphics] Some icons may be obsolete in the workbench (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=152473">Bug 152473</a>. [TabbedProperties] Registry does not support unkown categories (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177669">Bug 177669</a>. [Viewers] AbstractTreeViewer.setAutoExpandLevel has an off-by-1 error (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186022">Bug 186022</a>. [KeyBindings]  keybindings don't work for legacy actions in multipage editors (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198283">Bug 198283</a>. [WorkbenchParts] Assert.isTrue(activePartReference != ref) hit although no actrive editor open (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204489">Bug 204489</a>. [Contributions] Need methods to notify show/hide toolbar and statusline to ActionBarAdvisor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206584">Bug 206584</a>. [Commands] Memory leak after closing a Workbenchwindow in a RCP Application (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214560">Bug 214560</a>. [MPE] MultiPageEditorPart setFocus gives error if no pages (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=216483">Bug 216483</a>. [Commands] [Contributions] HandlerProxy should ask for refresh of IElementUpdater when loading handler (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217940">Bug 217940</a>. [Databinding] Unneeded Messages in org/eclipse/core/internal/databinding/messages.properties (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218054">Bug 218054</a>. [Contributions] ActionFactory.OPEN_NEW_WINDOW needs to be converted (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219184">Bug 219184</a>. [Commands] [Commands] IHandler#dispose is never called (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221914">Bug 221914</a>. [Workbench] Need enhancement to WorkbenchPage API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=222107">Bug 222107</a>. [WorkbenchLauncher] Switching workspaces crashes eclipse (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=222331">Bug 222331</a>. [Commands] commandImages update for org.eclipse.ui (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=222804">Bug 222804</a>. [QuickAccess] Quick access to open perspective failed with event loop exception (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223299">Bug 223299</a>. [Commands] org.eclipse.ui.internal.services.EvaluationResultCache.evaluate(IEvaluationContext) incorrectly returns true when evaluate (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223388">Bug 223388</a>. [Commands] Ensure all sources use UNDEFINED_VARIABLE (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223880">Bug 223880</a>. [KeyBindings] Command keybinding enabled even though action is disabled (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=224422">Bug 224422</a>. [JFace] ImageDescriptor.createFromURL should use faster image loading (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=224584">Bug 224584</a>. [Decorators] 'More Specific File Icons' decorator name not clear (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=224682">Bug 224682</a>. [Contributions] WorkbenchMenuService leaks editors after auto-closing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=224865">Bug 224865</a>. [Metadata] Fix inadvertent deletions of metadata in schema files (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=224951">Bug 224951</a>. [MPE] MultiPageEditorPart.pageChange() removes focus from SharedHeaderFormEditor's header (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=225370">Bug 225370</a>. [Viewers] remove SimpleStyledCellLabelProvider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226217">Bug 226217</a>. [Perspectives] [ViewMgmt] createView called without corresponding  releaseView (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226277">Bug 226277</a>. project explorer should support colored labels (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226718">Bug 226718</a>. [PerspectiveBar] problem with the Perspective Switcher/Bar (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226809">Bug 226809</a>. [ActivityMgmt] Forbid to add activities to the enabled list which are originally disabled (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227023">Bug 227023</a>. [TabbedProperties][ACC] section header has a fixed font size (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227327">Bug 227327</a>. fix labels in the Editor Selection dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227617">Bug 227617</a>. UI failures in N20080416-2000 appear to be caused by SWT changes (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227657">Bug 227657</a>. [StatusHandling] Support tray icon missing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227659">Bug 227659</a>. [StatusHandling] Support tray broken (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=227661">Bug 227661</a>. [StatusHandling] Support tray broken for single errors, shows wrong IStatus (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 14, 2008, 3:43 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=90959">Bug 90959</a>. [Commands] parameters: Duplicate commands for opening views: should old-style be deleted? (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127308">Bug 127308</a>. [WorkbenchParts] PageBook documentation should tell users not to set layouts (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134884">Bug 134884</a>. [DataBinding] CComboObservableValue does not support null (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136337">Bug 136337</a>. [IDE] Allow a user to force the removal of all problem markers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=141102">Bug 141102</a>. [WorkbenchParts] Link With Editor not pointing to current file being edited (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=145557">Bug 145557</a>. [WorkbenchParts] Content description label needs a hover (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168524">Bug 168524</a>. [WorkbenchParts] On restart partActivated (and partVisible) called before widgets are visible (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179305">Bug 179305</a>. [DataBinding] Required-Bundle: org.eclipse.core.runtime (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186522">Bug 186522</a>. [KeyBindings] New Keys preference page does not resort by binding with conflicts (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=200376">Bug 200376</a>. [IDE] Bidi issues with ContainerAndSelectionGroup's containerNameField (in ResourceAndContainerGroup) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202170">Bug 202170</a>. [Wizards] Empy Source Folder and Package in New Class Wizard (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202187">Bug 202187</a>. [Contributions] WorkbenchWindowControlContribution getWorkbenchWindow returns null (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205521">Bug 205521</a>. "Reset Perspective" action missing ellipsis (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205974">Bug 205974</a>. Window->"Preferences..." shouldn't have ellipsis (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206178">Bug 206178</a>. [Contributions] null pointer referenced is not caught when registering an action ActionBarAdvisor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206179">Bug 206179</a>. [Contributions] null pointer referenced is not caught when adding an action/item to menu in org.eclipse.jface.action.ContributionManager (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206619">Bug 206619</a>. [Contributions] editor leaked when invoking action from visible action set via keybinding (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212526">Bug 212526</a>. [KeyBindings] 'emacs' keyword should link to keys preference page (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218540">Bug 218540</a>. [Perspectives] Perspectives always open in same window, regardless of preference (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219913">Bug 219913</a>. Display.asyncExec should not be delayed till the workbench is initialized (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221662">Bug 221662</a>. [Contributions] Extension point org.eclipse.ui.menus: sub menu contribution does not have icon even if specified (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223188">Bug 223188</a>. [ErrorHandling] Crash of ModalContext thread freezes UI thread (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223976">Bug 223976</a>. [Decorators] Content type decorator: Updating missing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=225331">Bug 225331</a>. ScopedPreferenceStore.setToDefault(String) sends unneccessary event (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=225531">Bug 225531</a>. [Markers] Delete in Problems view should ask before deleting a marker (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=225601">Bug 225601</a>. Adopt API tooling for UI bundles (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226124">Bug 226124</a>. [GlobalActions] [regression] ActionFactory must return RetargetActions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226216">Bug 226216</a>. [DataBinding] ListDiff is calculated incorrectly (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226305">Bug 226305</a>. [Markers] Tasks view not clearing high and low priority items (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226530">Bug 226530</a>. [ActivityMgmt] IDEWorkbenchActivityHelper creates lots of runnables (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226732">Bug 226732</a>. [GlobalActions] WorkbenchActionBuilder should use CommandContributionItems (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=226930">Bug 226930</a>. Debug tests DNF (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 08, 2008, 4:02 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223266">Bug 223266</a>. [DataBinding] Refactor internal package names (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 08, 2008, 3:44 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223266">Bug 223266</a>. [DataBinding] Refactor internal package names (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 28, 2008, 12:06 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=224568">Bug 224568</a>. [Preferences] Preferences dialog fails to create hierarchy if category referenced before declared (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=224571">Bug 224571</a>. [Decorators] Missing problem markers on IFile in Package Explorer (NEW)<br>
-  </p>
-
-<p>Integration Build (March 27, 2008, 7:53 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221988">Bug 221988</a>. [Viewers] AbstractTreeViewer.insert fails if parent element has no children realized (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=224428">Bug 224428</a>. [Viewers] Add set/getStyleRanges to ViewerRow (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=224451">Bug 224451</a>. [IDE] The field shell has been removed (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 27, 2008, 12:44 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215797">Bug 215797</a>. [ViewMgmt] [WorkbenchParts] Extends org.eclipse.ui.views EP to allow non-restorable views (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223824">Bug 223824</a>. [JFace] [QuickAccess] popup is very small (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=224335">Bug 224335</a>. [MPE] MultiPageEditorPart.dispose() not calling super.dispose() (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 26, 2008, 4:46 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223824">Bug 223824</a>. [JFace] [QuickAccess] popup is very small (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 26, 2008, 5:10 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223342">Bug 223342</a>. [Markers] Columns in markers view are very small (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223790">Bug 223790</a>. [Decorators] disappearing incoming decorators in synchronize view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223846">Bug 223846</a>. [Viewers] Open Resource dialog causes 'Ignored reentrant call while viewer is busy' (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 26, 2008, 12:54 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215947">Bug 215947</a>. [GlobalActions] [breadcrumb] Delete on project is a no-op (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=216860">Bug 216860</a>. [GlobalActions] Copy is not enabled for resources with alternate file systems (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220411">Bug 220411</a>. [Markers] Update Marker extension points to use identifier (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=222391">Bug 222391</a>. [StatusHandling] Error dialog flickers on opening and very strange temporary button visible (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223808">Bug 223808</a>. [PropertiesDialog] Properties dialog page hierarchy screwed up (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223886">Bug 223886</a>. [Import/Export] ArrayIndexOutOfBoundsException while importing project in archive (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223983">Bug 223983</a>. [Markers] Listeners not being unregistered (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 25, 2008, 3:24 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211655">Bug 211655</a>. [Mac] Separator line in 'Window' menu doesn't look good on the Mac (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=222627">Bug 222627</a>. [ActivityMgmt] Stack overflow after hooking in property tester to activities (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 24, 2008, 10:02 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219273">Bug 219273</a>. [PropertiesDialog] [RCP]  allow initial property page to be specified (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 24, 2008, 8:42 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=143162">Bug 143162</a>. [Actions] Allow to set MODE_FORCE_TEXT in Action (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218269">Bug 218269</a>. [DataBinding] Cross-field validation support (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223274">Bug 223274</a>. [DataBinding] API to control getParent() / hasChildren() in Observable(List|Set)TreeContentProvider (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 24, 2008, 5:49 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202990">Bug 202990</a>. [Viewers] ColumnViewerEditor incorrectly handles mouse click in activated cell editor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215797">Bug 215797</a>. [ViewMgmt] [WorkbenchParts] Extends org.eclipse.ui.views EP to allow non-restorable views (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219874">Bug 219874</a>. Exploit Vista progress bars (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223274">Bug 223274</a>. [DataBinding] API to control getParent() / hasChildren() in Observable(List|Set)TreeContentProvider (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223481">Bug 223481</a>. [GlobalActions] regression : Refresh is no longer performed in background (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223653">Bug 223653</a>. [Contributions] NPE on shutdown via ShowIn code (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223732">Bug 223732</a>. [Viewers] Rename StyledStringBuilder to StyledString (NEW)<br>
-  </p>
-
-<p>Integration Build (March 24, 2008, 12:48 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=216562">Bug 216562</a>. [Markers] Sort order destroyed after changing grouping (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223649">Bug 223649</a>. [Progress] Job with action shows up twice if progress view is not opened (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223680">Bug 223680</a>. [ErrorHandling] calls to WorkbenchAdvisor.getWorkbenchErrorHandler() come from many threads (NEW)<br>
-  </p>
-
-<p>Integration Build (March 24, 2008, 3:42 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=98108">Bug 98108</a>. [Viewers] JFace StructuredViewer.preservingSelection ends up using Object.equals instead of comparer for comparing elements (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=144260">Bug 144260</a>. [DataBinding] CellEditor support for TableViewer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171800">Bug 171800</a>. [Viewers] AbstractTreeViewer.insert needs to handle empty tree path (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180223">Bug 180223</a>. [DataBinding]  ObservableValue for org.eclipse.widgets.Link (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202832">Bug 202832</a>. [EditorMgmt] Make it easier to turn off in-place editing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211455">Bug 211455</a>. [Viewers] ColumnViewer should expose a public getCell(Point) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213315">Bug 213315</a>. [Viewers] [JFace] ComboBoxViewerCellEditor does not handle nulls and activation correctly (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213787">Bug 213787</a>. [Databinding] BeanObservableValueDecorator should update PropertyDescriptor (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 23, 2008, 8:00 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133731">Bug 133731</a>. [Field Assist] -Platform UI should define preferences for content assist colors (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136244">Bug 136244</a>. [Dialogs] PopupDialog - API - overriding default colors should be simpler (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=143798">Bug 143798</a>. [Actions] Enhance MenuManager to be subclassable for a custom menu widget (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=146951">Bug 146951</a>. [EditorMgmt] Files shown with wrong icons in the navigator (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=191254">Bug 191254</a>. [WorkbenchLauncher] Eclipse launched with gcj should alert user to potential problems (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209699">Bug 209699</a>. [WorkbenchParts] org.eclipse.ui.IWorkbenchPartConstants should clarify its restrictions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210706">Bug 210706</a>. Make sure that services contributed by third parties work with dynamic plug-ins (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215531">Bug 215531</a>. [DataBinding] Content providers should respect viewer's IElementComparer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218967">Bug 218967</a>. [Workbench] org.eclipse.ui.IWorkbenchPreferenceConstants should update its specifications (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220767">Bug 220767</a>. [Dialogs] PopupDialog's HOVER_SHELLSTYLE should use SWT.TOOL (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223266">Bug 223266</a>. [DataBinding] Refactor internal package names (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223313">Bug 223313</a>. [Markers] Marker not found in QuickFixPropertyTester (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223339">Bug 223339</a>. [PopupDialog] ordering of size and location menu items (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223353">Bug 223353</a>. [Contributions] inconsistent deprecation in menus.exsd (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223375">Bug 223375</a>. [Commands] CommandSerializationTest failure in HEAD (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 19, 2008, 7:56 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=222861">Bug 222861</a>. [Commands] ParameterizedCommand#equals broken (ASSIGNED)<br>
-  </p>
-
-<p>Integration Build (March 19, 2008, 7:35 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133731">Bug 133731</a>. [Field Assist] -Platform UI should define preferences for content assist colors (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=140226">Bug 140226</a>. [PopupDialog] Separate persisting of bounds and location (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173649">Bug 173649</a>. [Contributions] Need a durable enablement story for ShowIn targets (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207858">Bug 207858</a>. [DataBinding] TreeContentProviders for observable collections (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211128">Bug 211128</a>. [Services] Services that allow cleanup should be clearly marked (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215797">Bug 215797</a>. [ViewMgmt] [WorkbenchParts] Extends org.eclipse.ui.views EP to allow non-restorable views (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223246">Bug 223246</a>. [Markers] Rename markerFieldFilterGrouping (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223266">Bug 223266</a>. [DataBinding] Refactor internal package names (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 19, 2008, 2:23 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76351">Bug 76351</a>. [Dialogs] API - InputDialog with customizable style bits (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157445">Bug 157445</a>. [JFace] PopupDialog does not allow direct selection of text in editor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167294">Bug 167294</a>. [Progress] Sleeping jobs show up even though pref unchecked (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210376">Bug 210376</a>. [Undo] Wording in Undo dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212501">Bug 212501</a>. [FieldAssist] ControlDecoration setImage doesn't properly redraw (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213504">Bug 213504</a>. [Markers] Problems View no longer supports dragging into the Editor Area (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214392">Bug 214392</a>. [JFace] missing implementation of ComboFieldEditor.setEnabled (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=216174">Bug 216174</a>. [FieldAssist] ControlDecoration hover should be hidden when decoration is hidden (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=216562">Bug 216562</a>. [Markers] Sort order destroyed after changing grouping (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218467">Bug 218467</a>. [Undo] Tighten up  IUndoableOperation spec and AbstractOperation to discourage/prevent null labels (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219433">Bug 219433</a>. Sleep and awake events not sent by JobManager (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220696">Bug 220696</a>. [Undo] When deleting files and externally moving files from navigator, we get an exception (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220697">Bug 220697</a>. [Undo] Exceptions when validating a delete operation (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221222">Bug 221222</a>. WorkbenchStatusDialog assumes that the WorkbenchWindow is open (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223074">Bug 223074</a>. [ErrorHandling] WorkbenchStatusDialog API review (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223114">Bug 223114</a>. [DataBinding] DetailObservableMap should be modifiable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223123">Bug 223123</a>. [DataBinding] Compile errors in ViewerLabelProvider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=223164">Bug 223164</a>. [DataBinding] JavaBeanObservableList|Set|Map should fire change events on the observable's realm (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 17, 2008, 3:43 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207858">Bug 207858</a>. [DataBinding] TreeContentProviders for observable collections (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213273">Bug 213273</a>. Bad display of disabled command icons on toolbars (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213485">Bug 213485</a>. [Markers] [Markers] Problems view's description  no longer shows how many errors and warnings there are (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214919">Bug 214919</a>. [Markers] [Markers] Problems view settings for column width and grouping are not persisted (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215531">Bug 215531</a>. [DataBinding] Content providers should respect viewer's IElementComparer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217902">Bug 217902</a>. [Markers] You have browsed configurations that you did not enable with the toggle button (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217985">Bug 217985</a>. Port 3.3.2 CommonNavigator performance improvements to 3.4 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218360">Bug 218360</a>. [Servicability] Fix places that pop up message dialogues under ISafeRunnable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218882">Bug 218882</a>. [Markers] markers views fail to refresh on working set changes with 3.4M5 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220404">Bug 220404</a>. [Contributions] Update action extension points to use identifier (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220411">Bug 220411</a>. [Markers] Update Marker extension points to use identifier (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220412">Bug 220412</a>. [IDE] Update IDE extension points to use identifier (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220662">Bug 220662</a>. [Markers] Problems view custom configuration with all types selected does not pick up new types (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221520">Bug 221520</a>. [Decorators] NPE in CVS decorator (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221521">Bug 221521</a>. [Markers] New markers API needs to be pared down (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221642">Bug 221642</a>. StyledStringBuilder: additional append() methods (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221649">Bug 221649</a>. [Import/Export] ZipFileImportWizard has no option to change the FILE_IMPORT_MASK (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221704">Bug 221704</a>. [DataBinding] BeansObservables.observeMap(Object bean, String propertyName) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=222375">Bug 222375</a>. [Markers] copy markers from markers view should 'pretty print' (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=222397">Bug 222397</a>. [Markers] Problems view no longer shows selected description in status bar (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=222411">Bug 222411</a>. [Dialogs] SaveAsDialog displays OS string file path, whereas it should display the workspace-style path instead. (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 12, 2008, 11:14 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221520">Bug 221520</a>. [Decorators] NPE in CVS decorator (NEW)<br>
-  </p>
-
-<p>Integration Build (March 10, 2008, 9:36 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=84225">Bug 84225</a>. [WorkingSets][DynamicUI] NPE in WorkingSetRegistry (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124684">Bug 124684</a>. [DataBinding] support binding to the checked elements of a CheckboxTableViewer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133495">Bug 133495</a>. [StatusHandling] ErrorDialog: Wrap message (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162140">Bug 162140</a>. [Progress] Be more resilient to null args in StatusLine's progress monitor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183810">Bug 183810</a>. [Contributions] Provide API to execute a command in a specific context (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184830">Bug 184830</a>. [DataBinding] Introduce a map entry observable value (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201052">Bug 201052</a>. [RCP] RCP should provide some role based access control to UI elements (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203767">Bug 203767</a>. [Markers] multiple instances of the new view a bit confusing to work with (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205064">Bug 205064</a>. [Contributions] Cannot create additions marker using org.eclipse.ui.menus (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210747">Bug 210747</a>. [Viewers] AbstractTreeViewer.remove() fails to remove plus sign (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211655">Bug 211655</a>. [Mac] Separator line in 'Window' menu doesn't look good on the Mac (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213145">Bug 213145</a>. [DataBinding] Refactor conformance tests for mutability vs modifiability aspects (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215531">Bug 215531</a>. [DataBinding] Known element sets should use viewer's IElementComparer (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215543">Bug 215543</a>. [WorkbenchLauncher] WorkenchWindowAdvisor.postWindowRestore invoked in non-UI thread (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220406">Bug 220406</a>. [WorkbenchParts] Update part extension points to use identifier (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220407">Bug 220407</a>. [Wizards] Update wizards extension points to use identifier (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220523">Bug 220523</a>. [StatusHandling] Improve information on error dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220535">Bug 220535</a>. [Themes] colored labels preferences (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220694">Bug 220694</a>. [Viewers] Javadoc warnings in I20080227-1100 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220766">Bug 220766</a>. [JFace] ImageRegistry.get does not work as expected (crashes with NullPointerException) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221319">Bug 221319</a>. [validation] A plugin.xml that references an internal class should be flagged (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221330">Bug 221330</a>. [Metadata] org.eclipse.ui references internal classes in extensions (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221337">Bug 221337</a>. [Markers] MarkerItem has too much API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221351">Bug 221351</a>. [DataBinding] DetailObservable(List|Set) and JavaBeanObservableSet should be modifiable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221416">Bug 221416</a>. [Dialogs] button id not correct for DETAILS in MessageDialogWithToggle (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221493">Bug 221493</a>. [StatusHandling] WorkbenchStatusDialog should not extend TrayDialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221528">Bug 221528</a>. [Progress] Jobs started from ProgressViewerContentProvider doesn't check if viewer is disposed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221768">Bug 221768</a>. [Viewers] Fix for bug 210747 causes NPE when parent is TreePath.EMPTY (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221860">Bug 221860</a>. [Workbench] Workbench should use transient start to activate UI (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221988">Bug 221988</a>. [Viewers] AbstractTreeViewer.insert fails if parent element has no children realized (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 03, 2008, 3:35 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172087">Bug 172087</a>. [Themes] Problems with JFaceColors in High Contrast (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181215">Bug 181215</a>. [Decorators] Image lives too long in OverlayCache (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183810">Bug 183810</a>. [Contributions] Provide API to execute a command in a specific context (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187762">Bug 187762</a>. [FilteredTree] clear icon fails to appear on FilteredTree if expand time gets maxed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189991">Bug 189991</a>. [Progress] Progress view truncates progress widgets for long task names (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=199454">Bug 199454</a>. [Commands] Provide source variable or a property tester for Perspective (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205044">Bug 205044</a>. [Commands] activate, enable, and execute a command from the same context (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208103">Bug 208103</a>. [Markers] Mark Completed needs a busy cursor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208392">Bug 208392</a>. [Markers] Improve 'Quick Fix' dialog from new Marker view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210568">Bug 210568</a>. [Import/Export] - Refresh button does not update list of projects (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212177">Bug 212177</a>. [Services] Register sources for the IEvaluationService (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215531">Bug 215531</a>. [DataBinding] Known element sets should use viewer's IElementComparer (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219432">Bug 219432</a>. [JFace] ImageDescriptor should use SWT's faster operating system image loading (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219620">Bug 219620</a>. [Decorators] Issues with the resource manager in decoration context (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219767">Bug 219767</a>. [Servicability] CoreExceptions being logged without descriptions or traces (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220368">Bug 220368</a>. [ErrorHandling] Javadoc warnings in N20080226-0010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220404">Bug 220404</a>. [Contributions] Update action extension points to use identifier (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220405">Bug 220405</a>. [ActivityMgmt] Update activities extension points to use identifier (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220406">Bug 220406</a>. [WorkbenchParts] Update part extension points to use identifier (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220407">Bug 220407</a>. [Wizards] Update wizards extension points to use identifier (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220408">Bug 220408</a>. [WorkingSets] [Themes] Update themes and workingSets extension points to use identifier (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220409">Bug 220409</a>. [Preferences] Update preferences and properties extension points to use identifier (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220411">Bug 220411</a>. [Markers] Update Marker extension points to use identifier (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220423">Bug 220423</a>. [Commands] PageSwitcher should not assume that current page is always first (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220456">Bug 220456</a>. [Markers] All Markers view filters only show problems (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220473">Bug 220473</a>. [WorkingSets] unable to recover from corrupt workingsets.xml file (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220534">Bug 220534</a>. [Viewers] tests for StyledStringBuilder (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220546">Bug 220546</a>. [Decorators] performance problem with resource manager in decoaration context (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220564">Bug 220564</a>. [Preferences] IWorkbenchPreferenceConstant#SHOW_MULTIPLE_EDITOR_TABS is mutable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220582">Bug 220582</a>. FilteredItemsSelectionDialog: add support for styled labels (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220663">Bug 220663</a>. [ActivityMgmt] Invalid thread access when activity is enabled (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220700">Bug 220700</a>. [DataBinding] Simplify ValueBinding.doUpdate (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220791">Bug 220791</a>. [Progress] Shrinking the progress view does not resize the job title (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220843">Bug 220843</a>. [Properties] Tree editors with columns, using JFace 3.3 infrastructure (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=220979">Bug 220979</a>. [Commands] HandlerAuthority should use IEvaluationService (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221131">Bug 221131</a>. [Databinding] Compile-Error for ViewerElementMap/ ViewerElementSet because of missing JavaDoc (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=221204">Bug 221204</a>. [Markers] IDE plugin.xml refers to old provisional package (FIXED)<br>
-  </p>
-
-<p>Integration Build (February 26, 2008, 10:30 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219393">Bug 219393</a>. [Viewers] StyledCellLabelProvider update (FIXED)<br>
-  </p>
-
-<p>Integration Build (February 25, 2008, 10:32 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218989">Bug 218989</a>. [Viewers] CustomHashtable NPEs on change set removal in 3.4M5 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219393">Bug 219393</a>. StyledCellLabelProvider update (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219432">Bug 219432</a>. [JFace] ImageDescriptor should use SWT's faster operating system image loading (REOPENED)<br>
-  </p>
-
-<p>Integration Build (February 25, 2008, 4:48 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=73979">Bug 73979</a>. [Decorators] CVS decorations blink on build [package explorer] (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168301">Bug 168301</a>. [ErrorHandling] JFace SafeRunnable should use new error handling (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174739">Bug 174739</a>. [Viewers] TableViewer - Combo cell editor - on single click needs to open (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181215">Bug 181215</a>. [Decorators] Image lives too long in OverlayCache (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184533">Bug 184533</a>. [Progress] ProgressIndicator uses hardcoded style for ProgressBar (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=190819">Bug 190819</a>. [WorkingSets] [CommonNavigator]  Project Explorer is empty when there is no window working set (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=191684">Bug 191684</a>. [StatusHandling] Status Dialog needs enhancements (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198089">Bug 198089</a>. [ToolTips] Open/Add new API for ToolTips (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=199734">Bug 199734</a>. [Progress] Progress view shows two entries for same job - only one is updated (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201052">Bug 201052</a>. [RCP] RCP should provide some role based access control to UI elements (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201906">Bug 201906</a>. [Viewers] 3.4 ColumnViewerEditor leaks ViewerCell instances. (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205618">Bug 205618</a>. [Metadata] org.eclipse.core.tests.harness and org.eclipse.ui.tests does not have an execution environment set (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206401">Bug 206401</a>. [Progress] ProgressView doesn't track property of IAction (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208830">Bug 208830</a>. [Preferences] Need ability to get at property page details without using internal code (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209509">Bug 209509</a>. [StatusHandling]  Addition of StatusAdapter#EXPLANATION_PROPERTY and #HINT_PROPERTY is not binary compatible (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214532">Bug 214532</a>. [JFace] Open up the API for org.eclipse.jface.layout.AbstractColumnLayout (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215735">Bug 215735</a>. [Viewers] Exclude none visible cell from navigation and traversing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215914">Bug 215914</a>. [prov] Enabling / disabling old update UI (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=216706">Bug 216706</a>. [Viewers] Disable 'check for expiration of doubleClickTime' in TreeViewer and TableViewer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218336">Bug 218336</a>. [Viewers] Give CellEditors more control about the activation/deactivation process (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218932">Bug 218932</a>. [Status Handling][Tests] Show View shows category 'Status Handling' twice (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218973">Bug 218973</a>. [Import/Export]  Import existing projects wizard: can't import two version of same project (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219081">Bug 219081</a>. FilteredItemsSelectionDialog: Avoid unecessary calls to cp.getElements() (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219361">Bug 219361</a>. RCPTestWorkbenchAdvisor has widget exception (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219386">Bug 219386</a>. [Markers] Configuring the high/normal/low filters do not change the view display (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219432">Bug 219432</a>. [JFace] ImageDescriptor should use SWT's faster operating system image loading (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219483">Bug 219483</a>. [Markers] MarkerField needs to support font and colours (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219892">Bug 219892</a>. [About] Tooltip for branded features in about dialog should include feature name (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219909">Bug 219909</a>. [DataBinding] UnmodifiableObservableValue (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219958">Bug 219958</a>. NPE when opening Open Type dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=219972">Bug 219972</a>. Core commands needs to be updated to 3.4 (FIXED)<br>
-  </p>
-
-<p>Integration Build (February 18, 2008, 8:48 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=44162">Bug 44162</a>. [Wizards]  Define constants for wizard ids of new.file, new.folder, and new.project (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56483">Bug 56483</a>. [Themes] PerspectiveBarManager accesses JFaceResources.fontRegistry directly as oppsed to the current theme (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164695">Bug 164695</a>. [Workbench] Project copy doesn't validate location and uses invalid location as default (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181515">Bug 181515</a>. Provide more structure, safety, and convenience for ID-based references between extension points (id hell) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184533">Bug 184533</a>. [Progress] ProgressIndicator uses hardcoded style for ProgressBar (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189953">Bug 189953</a>. [PresentationAPI] Allow for custom sashes (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208332">Bug 208332</a>. [DataBinding] Accept element types in Observables factory methods (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211977">Bug 211977</a>. [Dialogs] Open Resource does not sort entries correctly (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212340">Bug 212340</a>. [ErrorHandling] CoreExceptions logged without stack trace (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212518">Bug 212518</a>. [DataBinding] ConstantObservableValue contribution (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212559">Bug 212559</a>. [Markers] Quick fix allows multi select but only handles first fix (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215005">Bug 215005</a>. [ErrorHandling] [StatusHandling] Manual tests should be updated. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=216904">Bug 216904</a>. [Markers] Configure Contents dialog missing mnemonics and punctuation (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217294">Bug 217294</a>. [Preferences] Preferences Store shoudn't use locale for storing data (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217777">Bug 217777</a>. [Workbench] Workbench event loop does not terminate if Display is closed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218297">Bug 218297</a>. [Markers] [Import/Export] Export Problems View entry is missing an icon (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218375">Bug 218375</a>. [Markers] Remove legacy markers views (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218553">Bug 218553</a>. [JFace] mis-spelling of their in applyDialogFont(...) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218804">Bug 218804</a>. [Commands] JDT UI tests fail due to leak (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218903">Bug 218903</a>. [Viewers] support extensibility of the refresh job in FilteredTree (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218973">Bug 218973</a>. [Import/Export]  Import existing projects wizard: can't import two version of same project (ASSIGNED)<br>
-  </p>
-
-<p>Integration Build (February 11, 2008, 3:08 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182176">Bug 182176</a>. Need API that allows RCP apps/splash to update the UI synchronously/asynchronously (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189167">Bug 189167</a>. [KeyBindings] Binding.equals() gives back wrong value (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217848">Bug 217848</a>. [Commands] Provide commands for copying build ID/config info to the clipboard (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217922">Bug 217922</a>. [KeyBindings] CTRL+Z EOF no longer works in console (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=218365">Bug 218365</a>. [Accessibility] The FVB and Progress buttons need accessibiilty listeners (FIXED)<br>
-  </p>
-
-<p>Integration Build (February 07, 2008, 10:12 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=196785">Bug 196785</a>. [DataBinding] Support for nested attributes in tables (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217491">Bug 217491</a>. [Commands] WorkbenchWindowSubordinateSourcesTests failing (NEW)<br>
-  </p>
-
-<p>Integration Build (February 04, 2008, 6:36 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217458">Bug 217458</a>. [Viewers] SimpleStyledCellLabelProvider improvements (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217558">Bug 217558</a>. [DataBinding] Databinding -  BeansObservables.observeList() - error when external code modifies observed list. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217610">Bug 217610</a>. [Contributions] Main menu is no longer populated from org.eclipse.ui.menus (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217671">Bug 217671</a>. [Contributions] WorkbenchMenuService leaks editor after context menu opened (FIXED)<br>
-  </p>
-
-<p>Integration Build (February 04, 2008, 12:11 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102440">Bug 102440</a>. [Viewers] StructuredViewer.update() loops unnecessarily (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=196785">Bug 196785</a>. [DataBinding] Support for nested attributes in tables (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208432">Bug 208432</a>. [DataBinding] ObservableList exposes underlying list (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209497">Bug 209497</a>. [EditorMgmt] Contradicting Javadoc in org.eclipse.ui.IElementFactory.createElement(IMemento) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210747">Bug 210747</a>. [Viewers] AbstractTreeViewer.remove() fails to remove plus sign (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213623">Bug 213623</a>. DataBinding ViewersObservables should expose widget (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213757">Bug 213757</a>. [DataBinding] StringToIntegerValidator throws StringIndexOutOfBoundsE when String is empty (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217458">Bug 217458</a>. [Viewers] SimpleStyledCellLabelProvider improvements (FIXED)<br>
-  </p>
-
-<p>Integration Build (February 03, 2008, 3:06 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=149890">Bug 149890</a>. [Contributions] MenuManager does not properly handle dynamic submenus (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177740">Bug 177740</a>. [Contributions] menu contributions need to support checkEnabled (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=197922">Bug 197922</a>. [Commands] Restart command In file Menu (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=199278">Bug 199278</a>. [Contributions] control element does not have a visibleWhen option in org.eclipse.ui.menus extension point (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204857">Bug 204857</a>. [Contributions] Fix CommandContributionItem IDs generated by menus (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210862">Bug 210862</a>. [Contributions] CommandContributionItem must ensure that updates are forwarded in Display thread (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212292">Bug 212292</a>. [Contributions] <enabledWhen> does not work when view is detached (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217422">Bug 217422</a>. [GlobalActions] Can no longer open new perspective (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217558">Bug 217558</a>. [DataBinding] Databinding -  BeansObservables.observeList() - error when external code modidies observed list. (FIXED)<br>
-  </p>
-
-<p>Integration Build (February 01, 2008, 3:01 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=64486">Bug 64486</a>. [GlobalActions] [Services] Actions taking a shell should be changed to take an IWorkbenchSite (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=97649">Bug 97649</a>. [Preferences] [Themes] Colors and Fonts preference page shows with no buttons (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153895">Bug 153895</a>. [KeyBindings] Key Assist (Ctrl+Shift+L) shows wrong key sequence (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181215">Bug 181215</a>. [Decorators] Image lives too long in OverlayCache (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184602">Bug 184602</a>. [Progress] "Widget is disposed" when setting builders twice during build (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184908">Bug 184908</a>. [Wizards] [Forms] Widget disposed error in forms while closing Java project wizard (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187796">Bug 187796</a>. [KeyBindings] IBindingService cannot return best active bindings for a ParameterizedCommand (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187963">Bug 187963</a>. [Viewers] Make TableEditor and TreeEditor minumHeight controllable from CellEditor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=195137">Bug 195137</a>. [Viewers] Tooltip for multiline comment in History view hinders selection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198821">Bug 198821</a>. [IDE] Declare some required plug-ins as optional (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=199114">Bug 199114</a>. [Commands] SelectAllHandler sends invalid selection event to Combos (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=199454">Bug 199454</a>. [Commands] Provide source variable or a property tester for Perspective (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202639">Bug 202639</a>. [Import/Export] [Import/Export] Improve warning messages in WizardFileSystemResourceExportPage1 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203767">Bug 203767</a>. [Markers] multiple instances of the new view a bit confusing to work with (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204905">Bug 204905</a>. [Contributions] Allow introspection on handlers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205043">Bug 205043</a>. [Commands] Dynamically loading plugin causes command framework error (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208858">Bug 208858</a>. [DataBinding] better support for moves in observable lists (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210752">Bug 210752</a>. [Viewers]Cannot use custom CellNavigationStrategy  in TableViewerFocusCellManager (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215069">Bug 215069</a>. [Viewers] Problems with FocusCellOwnerDrawHighlighter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215582">Bug 215582</a>. [DataBinding] ObservableSetContentProvider is final (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215734">Bug 215734</a>. [Progress] Need way to listen to when DeferredTreeContentManager is finished (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215897">Bug 215897</a>. [Contributions] (regression) popup menu missing contributions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=216212">Bug 216212</a>. [FastView] Views cannot get focus when opening as FastView and dragging to a position (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=216271">Bug 216271</a>. [Workbench] UI plug-ins need to change from lazy start to Bundle Activiation Policy (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=216667">Bug 216667</a>. [Decorators] DecorationScheduler hangs onto objects forever sometimes (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=216811">Bug 216811</a>. [Markers] ExtendedMarkersView#setFocus doesn't (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=216947">Bug 216947</a>. [Metadata] Workbench dependency on JFace needs updating (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217096">Bug 217096</a>. [Markers] NPE from new problems view on startup (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217200">Bug 217200</a>. [Markers] MarkerPreferencePage not setting the dialog font (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217217">Bug 217217</a>. [KeyBindings] NPE in WidgetMethodHandler during shutdown (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=217309">Bug 217309</a>. [Metadata] org.eclipse.ui.workbench.compatibility fragment bundle classpath is boggus (FIXED)<br>
-  </p>
-
-<p>Integration Build (January 28, 2008, 2:58 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=64486">Bug 64486</a>. [GlobalActions] [Services] Actions taking a shell should be changed to take an IWorkbenchSite (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138359">Bug 138359</a>. [ProblemsView] Filters not restored on import (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177337">Bug 177337</a>. Make nested services API (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=194790">Bug 194790</a>. [DataBinding] ObservableTracker/CompositeUpdater improvements (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=195137">Bug 195137</a>. [Viewers] Tooltip for multiline comment in History view hinders selection (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206745">Bug 206745</a>. [Commands] finish providing core expression evaluation service (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206839">Bug 206839</a>. [DataBinding] Add ViewersObservables.observeInput() (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211926">Bug 211926</a>. [Markers] Invalid entries allowed for marker limits (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212223">Bug 212223</a>. [DataBinding] Test case for DelayedObservableValue (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212468">Bug 212468</a>. [DataBinding] Tests for StalenessObservableValue (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213155">Bug 213155</a>. [Markers] Problems view: polish the 'Preferences' menu entry (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213181">Bug 213181</a>. [ActivityMgmt] Activities pattern bindings should provide the option to use non-regular Expression strings (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213480">Bug 213480</a>. [Markers] Line sorting using string sort in new markers view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215297">Bug 215297</a>. [DataBinding] DelayedObservableValue can cache incorrect value (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215913">Bug 215913</a>. [Markers] Configure Contents uses radio style of siblings (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215985">Bug 215985</a>. [Markers] Description column not sorting text (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=216146">Bug 216146</a>. [Decorators] Lightweight Decorator Manager holds onto element in lightweight runnable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=216271">Bug 216271</a>. [Workbench] UI plug-ins need to change from lazy start to Bundle Activiation Policy (NEW)<br>
-  </p>
-
-<p>Integration Build (January 21, 2008, 4:06 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58419">Bug 58419</a>. [Progress] "Run in Background" dialog should be possible to remember my decision (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120691">Bug 120691</a>. [Markers] Expanded categories not persisted between sessions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=146713">Bug 146713</a>. [OLE] In-place (OLE) document marked dirty when opened (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176986">Bug 176986</a>. [Markers] Move tasks into the problems view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=195137">Bug 195137</a>. [Viewers] Tooltip for multiline comment in History view hinders selection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205043">Bug 205043</a>. [Commands] Dynamically loading plugin causes command framework error (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208335">Bug 208335</a>. [JFace] AbstractColumnLayout does not handle columns with minimum and weight correctly (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213012">Bug 213012</a>. [Markers] New view filtering is hard to discover (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213162">Bug 213162</a>. [Markers] Problems view: Clean up 'Configure Contents' (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213168">Bug 213168</a>. [Markers] problems view: polish sort menu (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213479">Bug 213479</a>. [Markers] Move more often used view menu items up (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213480">Bug 213480</a>. [Markers] Line sorting using string sort in new markers view (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213718">Bug 213718</a>. [Viewers] OwnerDrawLabelProvider: bug with getData (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214443">Bug 214443</a>. [Markers] Problem view filter created even if I hit Escape (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214762">Bug 214762</a>. [Markers] "Filters" list should be "Show" (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214763">Bug 214763</a>. [Markers] "Configure Contents" dialog needs title changed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215159">Bug 215159</a>. [PropertiesView] description of last selected item stays in status line after deselection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215356">Bug 215356</a>. [Markers] Need to warn if editing an unselected filter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215365">Bug 215365</a>. [About] Migrate about dialog to new signed content API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215945">Bug 215945</a>. [OLE] NullPointerException when saving an ole document (FIXED)<br>
-  </p>
-
-<p>Integration Build (January 14, 2008, 4:04 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107799">Bug 107799</a>. [Workbench] API for workbench settings (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=140038">Bug 140038</a>. [Metadata] split ui packages should define mandatory directives (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168757">Bug 168757</a>. [KeyBindings] Add keybinding for 'collapse all' button in Navigator & Package Explorer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173752">Bug 173752</a>. [About] Sorting column with Jar signing info in about plugins dialog not working (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186522">Bug 186522</a>. [KeyBindings] New Keys preference page does not resort by binding with conflicts (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205332">Bug 205332</a>. [FilteredItemsSelectionDialog] FilteredItemsSelectionDialog: history size off by 1 and Javadoc clarifications (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214355">Bug 214355</a>. [Databinding] Make ObservableListContentProvider useable for 3rd party AbstractTableViewer implementations (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214492">Bug 214492</a>. [Markers] Need to be able to add filters to existing markers views (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214502">Bug 214502</a>. [ErrorHandling] [Status Handling] test bed should be removed from org.eclipse.ui.tests (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214621">Bug 214621</a>. [Viewers] Make ComboViewer non-final (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214648">Bug 214648</a>. [Markers] AttributeMarkerGroupings and GroupingEntries not being cleaned up on removal (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214649">Bug 214649</a>. [Markers] Allow markerAttributeGroupings and markerGroups to be specified within contentGenerators (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214680">Bug 214680</a>. [Trim] TrimContributionManager won't accept IToolBarContributionItem (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214697">Bug 214697</a>. [Viewers] No @since tag for DeferredTreeContentManager(AbstractTreeViewer) constructor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214813">Bug 214813</a>. [PerspectiveBar] Perspective bar does not expand to show newly opened perspective(s) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214913">Bug 214913</a>. [Markers] Public API for writing marker view handlers should be made available (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=214939">Bug 214939</a>. [Markers] CachedMarkerBuilder using too much CPU (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215004">Bug 215004</a>. [Markers] New Problems view: 'Group by > Type' broken (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215005">Bug 215005</a>. [ErrorHandling] [StatusHandling] Manual tests should be updated. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=215244">Bug 215244</a>. [Markers] Show All menu entry is not persisted (FIXED)<br>
-  </p>
-
-<p>Integration Build (December 17, 2007, 3:23 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=97645">Bug 97645</a>. [Content Types] Add... button in File Associations section yields "New File Type" dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173752">Bug 173752</a>. [About] Sorting column with Jar signing info in about plugins dialog not working (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186800">Bug 186800</a>. [Trim] Provide public API to re-layout Trim contents (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188333">Bug 188333</a>. [Viewers] Label provider for multi-colored TableItems/TreeItems (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212408">Bug 212408</a>. [Markers] Markers updating during inconsistent state (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212724">Bug 212724</a>. [Markers] 'Group By' is useless in Bookmarks view in SDK (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212832">Bug 212832</a>. [Markers] Second problems views not updated on selection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212901">Bug 212901</a>. [QuickAccess] spurious empty roll-over tooltips (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213014">Bug 213014</a>. [Markers] New view doesn't rank fatal errors first any longer when sorting per Java type (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213040">Bug 213040</a>. [Markers] Selected filters not being kept on restart (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=213166">Bug 213166</a>. [Viewers] Problems with OwnerDrawLabelProvider.setUpOwnerDraw (FIXED)<br>
-  </p>
-
-<p>Integration Build (December 13, 2007, 3:15 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207551">Bug 207551</a>. Generated perf results pages are empty when using local data files (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212913">Bug 212913</a>. perspective bar not resized (FIXED)<br>
-  </p>
-
-<p>Integration Build (December 13, 2007, 3:14 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207551">Bug 207551</a>. Generated perf results pages are empty when using local data files (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212913">Bug 212913</a>. perspective bar not resized (FIXED)<br>
-  </p>
-
-<p>Integration Build (December 13, 2007, 10:47 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212621">Bug 212621</a>. [Commands] linkWithEditor command should be called 'Toggle Link with Editor' (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212725">Bug 212725</a>. [Markers] Tasks views completion entry needs to be wider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212821">Bug 212821</a>. Only WorkbenchMarkerResolutions being shown (FIXED)<br>
-  </p>
-
-<p>Integration Build (December 12, 2007, 12:25 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198211">Bug 198211</a>. [DataBinding] ComputedValue invokes doGetValue outside realm when adding a change listener (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212663">Bug 212663</a>. [QuickAccess] Roll-over tooltip too wide (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212724">Bug 212724</a>. [Markers] 'Group By' is useless in Bookmarks view in SDK (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212725">Bug 212725</a>. [Markers] Tasks views completion entry needs to be wider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212728">Bug 212728</a>. [Markers] New Tasks view not showing completion icon (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212729">Bug 212729</a>. [Markers] 'Open Another' is inconsistent label (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212730">Bug 212730</a>. [Markers] New Problems view must not have Contents > All (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212731">Bug 212731</a>. [Markers] New marker views: Show is actualy Filter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212733">Bug 212733</a>. [Markers] Problem view no longer updates when changing the visible marker limit (NEW)<br>
-  </p>
-
-<p>Integration Build (December 11, 2007, 4:30 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177740">Bug 177740</a>. [Contributions] menu contributions need to support checkEnabled (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=191673">Bug 191673</a>. [QuickAccess] Tooltips only partially overlap the hovered item (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208916">Bug 208916</a>. [Viewers] Expose API to determine whether a viewer is busy (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210535">Bug 210535</a>. [WorkbenchLauncher] build id doesn't line up with Ganymede graphic (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212550">Bug 212550</a>. [Markers] "Open Another" does not work (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212623">Bug 212623</a>. [Metadata] update version number of org.eclipse.ui.ide (FIXED)<br>
-  </p>
-
-<p>Integration Build (December 10, 2007, 3:45 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58777">Bug 58777</a>. [Viewers] add API to not deactivate CellEditor on FocusLost (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211111">Bug 211111</a>. [Markers] NPE updating MarkersView (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212235">Bug 212235</a>. [DataBinding] Tests for ShellObservableValue (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212305">Bug 212305</a>. [Markers] NPE in Perspective.findView trying to open Markers view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212340">Bug 212340</a>. [ErrorHandling] CoreExceptions logged without stack trace (NEW)<br>
-  </p>
-
-<p>Integration Build (December 07, 2007, 4:15 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=100688">Bug 100688</a>. [JFace] Geometry.setLocation does not behave as documented (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127344">Bug 127344</a>. [Import/Export] Test failures due to sleep interrupted (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=152021">Bug 152021</a>. [Preferences] JAWS7.0 not working correctly for Eclipse preferences: not stating the results of filter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177740">Bug 177740</a>. [Contributions] menu contributions need to support checkEnabled (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=193814">Bug 193814</a>. [Progress] [Progress] Part leaked via ProgressAnimationItem.lastJobInfo (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201293">Bug 201293</a>. [MinMax] NPE when maximixing a minimized window (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204788">Bug 204788</a>. [Contributions] Second context menu created from MenuManager does not show (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208456">Bug 208456</a>. [Workbench] StatusAdapterHelper does not check for unregistered  status adapters (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208602">Bug 208602</a>. [Dialogs] Open Type dialog needs accessible labels (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209803">Bug 209803</a>. [Progress] Group job can't canceled with a single click of the cancel button (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209804">Bug 209804</a>. [Progress] Job message in the group are not kept if they are sequential (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211595">Bug 211595</a>. [Mac] update ui.carbon fragment to include about.html in source bundle (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211646">Bug 211646</a>. [JFace] StructuredSelection.toList(...) allows modification to original selection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211647">Bug 211647</a>. [Workbench] 'Open Referenced Projects' dialog prompt ignores 'esc' key (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211786">Bug 211786</a>. [DataBinding] ComputedList refinements (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212002">Bug 212002</a>. [Markers] NPE in CachedMarkerBuilder.getMarkerItem (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212008">Bug 212008</a>. [Presentations] Problemss View loses icon when it gets focus in n  I20071204-1547 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=212038">Bug 212038</a>. [Preferences] WorkbenchPreferenceManager mishandles dynamic contributions (FIXED)<br>
-  </p>
-
-<p>Integration Build (December 03, 2007, 4:04 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=19229">Bug 19229</a>. Changing color scheme in windows messes up view colors (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=23146">Bug 23146</a>. [Perspectives] Prompt when deleting an open Perspective (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36446">Bug 36446</a>. [Contributions] widgets: Associating Actions with Buttons (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=78746">Bug 78746</a>. [Contributions] [JFace] Compiler error message containing '& ' is rendered with '_' in status line (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=79581">Bug 79581</a>. [Commands] request: Declare a command for "Link with Editor" (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102616">Bug 102616</a>. [Contributions] StatusLineContributionItem should be moved to JFace (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=146623">Bug 146623</a>. [Commands] Define command / retargetable action / keybinding for switching pages in a PageBookView (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162505">Bug 162505</a>. [Markers] DCR: Make MarkerView API (to support client feedback view) (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177334">Bug 177334</a>. SharedHeaderFormEditor needs services for header (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177337">Bug 177337</a>. Make nested services API (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184074">Bug 184074</a>. [MPE] Need API to disable key bindings in shared editor header (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187956">Bug 187956</a>. [ActionSets] ActionContributionItem.MODE_FORCE_TEXT should apply to Buttons too (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203595">Bug 203595</a>. [Contributions] SubMenuManager should use ListenerList's clear() method (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204769">Bug 204769</a>. [MPE] MultiPageEditorPart.pageChange() sets focus unconditionally (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205497">Bug 205497</a>. [Markers] Change the old marker view references to the new one (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206043">Bug 206043</a>. [DND] Wrong operations mode/feedback for text drag over/drop in text editors (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207838">Bug 207838</a>. [DataBinding] ComputedList contribution (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208075">Bug 208075</a>. [Commands] File > Move in Project Explorer misses ellipsis (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208462">Bug 208462</a>. [Perspectives] newly created project do not appear in the Project Explorer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209023">Bug 209023</a>. [Markers] New Problems view does not select current problem from editor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209239">Bug 209239</a>. [Services] Convert the ISelectionService (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209240">Bug 209240</a>. [Services] Convert the IPageService (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209873">Bug 209873</a>. [Workbench] [Incubator] Support dependency injection for contributed views, editors, etc (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210934">Bug 210934</a>. [ErrorHandling] [StatusHandling] StatusManager#handle(StatusAdapter) should log that the adapter or status is null (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210946">Bug 210946</a>. [Workbench] Unproper error handling in class ModalContext (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211058">Bug 211058</a>. [WorkbenchLauncher] SplashHandler: org.eclipse.ui.splashHandlers must have at least 2 childElements, but one is optional (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211111">Bug 211111</a>. [Markers] NPE updating MarkersView (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211122">Bug 211122</a>. [Markers] Errors 'Marker id 301832 not found.' logged when opening new Markers view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211179">Bug 211179</a>. [DetachedWindows] Detached eclipse windows may render outside desktop (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211212">Bug 211212</a>. Cannot delete a bookmark in the new markers view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211213">Bug 211213</a>. Support parameterization in ExtendedMarkersView (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211294">Bug 211294</a>. [Workbench] chkpii failure in N20071128-0010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=211493">Bug 211493</a>. [Markers] [Markers] New Markers view slows down traversal in Package Explorer (FIXED)<br>
-  </p>
-
-<p>Integration Build (November 26, 2007, 9:49 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115360">Bug 115360</a>. [Import/Export] archive file not closed after importing project from archive (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=143949">Bug 143949</a>. [CommonNavigator] Sorting for added items does not work as expected (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=151158">Bug 151158</a>. [KeyBindings][MPE] MultiPageEditorPart sends key events to editor without focus (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156792">Bug 156792</a>. [EditorMgmt] Close a Tab with the middle button (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180746">Bug 180746</a>. [DataBinding] TextObservableValue should take a delay-argument (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183730">Bug 183730</a>. [IDE] zip file itself is opened on the selection dialog when you try to import project . (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188333">Bug 188333</a>. [Viewers] Label provider for multi-colored TableItems/TreeItems (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=191662">Bug 191662</a>. [Import/Export] Warn of duplicate projects in project import wizard (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=195046">Bug 195046</a>. [CommonNavigator] SWTException: "Widget is disposed" on closing view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205053">Bug 205053</a>. [Navigator] Navigator Filters dialog box is empty (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207844">Bug 207844</a>. [DataBinding] Support SWTObservables.observeText for Shells. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208989">Bug 208989</a>. [Markers] Switching from Task to Problems freezes my machine for several seconds (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209238">Bug 209238</a>. [Services] Convert the IPartService (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209484">Bug 209484</a>. [Databinding] ObservableSetContentProvider does not update knownElements (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209558">Bug 209558</a>. [Import/Export] FileSystemImportWizard and FileSystemExportWizard require the compatibility plug-in (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209836">Bug 209836</a>. [Services] Support service locator creation (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210115">Bug 210115</a>. [DataBinding]  NPE when getter called on disposed observable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210209">Bug 210209</a>. Change Perspective needs org.eclipse.ui.ide dependency (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210424">Bug 210424</a>. [Trim] (Regression) Minimize view fails to expand adjacent views in its place (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210448">Bug 210448</a>. [Viewers] [JFace] AbstractTreeViewer inputChanged setRedraw should be in try/finally (FIXED)<br>
-  </p>
-
-<p>Integration Build (November 20, 2007, 1:59 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=74724">Bug 74724</a>. [DND] EditorAreaDropAdapter should ignore non-existing resources should be disabled (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103810">Bug 103810</a>. [WorkbenchParts] Sites should release their part after part is disposed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=151688">Bug 151688</a>. [GlobalActions] [IDE] Allow to extend RefreshAction (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185838">Bug 185838</a>. [Parts] CoreExceptions are thrown as PartInitExceptions by TextFileDocumentProvider (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202780">Bug 202780</a>. [EFS] Dirty editors are restored even if the project is deleted (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203799">Bug 203799</a>. [Markers] All entry has duplicated entries with Java Problem Type (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208052">Bug 208052</a>. [Markers] Tasks does not sort by completion (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208994">Bug 208994</a>. [Markers] Revert to old Problems view (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209097">Bug 209097</a>. [Viewers] TreeViewer: Refreshing from a large number of entries to a small number of entries very slow (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209466">Bug 209466</a>. [Markers] Cannot select working set in Show Markers for Problems (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209667">Bug 209667</a>. [Markers] Add a TODO filter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209706">Bug 209706</a>. [Trim] Need wrapping trim (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209786">Bug 209786</a>. [Progress] Elements not refreshing on completion (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209879">Bug 209879</a>. [Databinding] Inadvertent commit to UpdateValueStrategy and UpdateStrategy (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209919">Bug 209919</a>. Widget is disposed exception in TreeViewer (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210124">Bug 210124</a>. [Markers] MarkersView not listening to the build jobs (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210127">Bug 210127</a>. [Markers] All entry uses the problems view description filter (FIXED)<br>
-  </p>
-
-<p>Integration Build (November 20, 2007, 1:53 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=74724">Bug 74724</a>. [DND] EditorAreaDropAdapter should ignore non-existing resources should be disabled (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103810">Bug 103810</a>. [WorkbenchParts] Sites should release their part after part is disposed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=151688">Bug 151688</a>. [GlobalActions] [IDE] Allow to extend RefreshAction (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185838">Bug 185838</a>. [Parts] CoreExceptions are thrown as PartInitExceptions by TextFileDocumentProvider (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202780">Bug 202780</a>. [EFS] Dirty editors are restored even if the project is deleted (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203799">Bug 203799</a>. [Markers] All entry has duplicated entries with Java Problem Type (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208052">Bug 208052</a>. [Markers] Tasks does not sort by completion (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208994">Bug 208994</a>. [Markers] Revert to old Problems view (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209097">Bug 209097</a>. [Viewers] TreeViewer: Refreshing from a large number of entries to a small number of entries very slow (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209466">Bug 209466</a>. [Markers] Cannot select working set in Show Markers for Problems (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209667">Bug 209667</a>. [Markers] Add a TODO filter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209706">Bug 209706</a>. [Trim] Need wrapping trim (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209786">Bug 209786</a>. [Progress] Elements not refreshing on completion (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209879">Bug 209879</a>. [Databinding] Inadvertent commit to UpdateValueStrategy and UpdateStrategy (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209919">Bug 209919</a>. Widget is disposed exception in TreeViewer (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210124">Bug 210124</a>. [Markers] MarkersView not listening to the build jobs (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210127">Bug 210127</a>. [Markers] All entry uses the problems view description filter (FIXED)<br>
-  </p>
-
-<p>Integration Build (November 12, 2007, 3:55 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103810">Bug 103810</a>. [WorkbenchParts] Sites should release their part after part is disposed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104225">Bug 104225</a>. [CellEditors] Using Viewer for ComboBoxCellEditor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117079">Bug 117079</a>. [KeyBindings] registry: BindingPersistance should clean up its preference store listener (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117505">Bug 117505</a>. [Commands] handlers: Legacy actions are active even when they shouldn't be (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120336">Bug 120336</a>. [Model] FileEditorInput.getAdapter has dangerous redirection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120652">Bug 120652</a>. [Commands] handlers: Cannot add evaluations to Display or Expressions View (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122053">Bug 122053</a>. [KeyBindings] Shortcut Key Not Working In 3.2M4 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122639">Bug 122639</a>. [WorkbenchParts] PageBookView's toolbar doesn't properly re-layout after page switching (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164499">Bug 164499</a>. [Commands] org.eclipse.ui.commandImages API and documentation error (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180732">Bug 180732</a>. [Presentations] R33 presentation classes: do we still need? (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=197679">Bug 197679</a>. [DataBinding] char and Character type support needs to be complete (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205064">Bug 205064</a>. [Commands] Cannot add in an additions seperator without getting a warning (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205209">Bug 205209</a>. [WorkbenchParts] NPE due to null mappingService during dispose (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205700">Bug 205700</a>. [Viewers] IllegalArgumentException occurs when adding elements to TreeViewer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207676">Bug 207676</a>. [CellEditors] [3.4] showing dialog in ICellModifier.modify() calls the method again (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207846">Bug 207846</a>. [Viewers] Virtual TableViewer setSelection() does not work properly (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208014">Bug 208014</a>. [Trim] [Layout] AbstractColumnLayout and Trim on Win32 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208055">Bug 208055</a>. [Markers] Need a sorting method for the markers view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208916">Bug 208916</a>. [Viewers] Expose API to determine whether a viewer is busy (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208989">Bug 208989</a>. [Markers] Switching from Task to Problems freezes my machine for several seconds (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209000">Bug 209000</a>. [Markers] Copy in Problems view broken (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209097">Bug 209097</a>. [Viewers] TreeViewer: Refreshing from a large number of entries to a small number of entries very slow (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=209466">Bug 209466</a>. [Markers] Cannot select working set in Show Markers for Problems (NEW)<br>
-  </p>
-
-<p>Integration Build (November 05, 2007, 11:03 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=72327">Bug 72327</a>. [WorkbenchLauncher] Workspace Launcher Dialog grows in width for long paths (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=74163">Bug 74163</a>. [IDE] Tips and Tricks dialog; disable OK if no selection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184533">Bug 184533</a>. [Progress] ProgressIndicator uses hardcoded style for ProgressBar (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=192051">Bug 192051</a>. [StatusHandling] NPE in StatusNotificationManager (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=197679">Bug 197679</a>. [DataBinding] char and Character type support needs to be complete (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203934">Bug 203934</a>. [Markers] markers view: New filter dialog is missing ellipses (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205497">Bug 205497</a>. [Markers] Change the old marker view references to the new one (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207570">Bug 207570</a>. [ErrorHandling] NPE on shutdown in IDEWorkbenchErrorHandler (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207940">Bug 207940</a>. [Mac] Cannot clear preferences filter on the Mac (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208092">Bug 208092</a>. [Markers] Markers are using the category icon when flat (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208098">Bug 208098</a>. [Markers] All content provider needs a type field (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208101">Bug 208101</a>. [Markers] Tasks content has mark completed enabled for non editable tasks (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208205">Bug 208205</a>. [Markers] New Markers view: Limit visible items should be per group (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208389">Bug 208389</a>. [Markers] New Marker view should use default Properties dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208390">Bug 208390</a>. [Markers] Improve 'No Quick Fix' dialog from new Marker view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208393">Bug 208393</a>. [Markers] Go to Resource should use Open as a title (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208478">Bug 208478</a>. [ErrorHandling] Status Handling makes infos and warnings look like errors (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208791">Bug 208791</a>. [Markers] NPE in ExtendedMarkersView (FIXED)<br>
-  </p>
-
-<p>Integration Build (October 31, 2007, 3:15 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206458">Bug 206458</a>. [GlobalActions] convert retarget actions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207829">Bug 207829</a>. [Contributions] Unnecessary plugin activation on shutdown (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208099">Bug 208099</a>. [Contributions] Toggling logical structure "Show As > Array" has no effect (FIXED)<br>
-  </p>
-
-<p>Integration Build (October 30, 2007, 6:57 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204683">Bug 204683</a>. [Commands] activePart of CycleBaseHandler leaks last editor<br>
-  </p>
-
-<p>Integration Build (October 29, 2007, 10:13 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189092">Bug 189092</a>. Can't Replace A Menu<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=193832">Bug 193832</a>. [ViewMgmt] ViewPart selection listeners don't work when perspective with secondary IDs first open<br>
-  </p>
-
-<p>Integration Build (Oktober 29, 2007, 5:26 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=65731">Bug 65731</a>. [EditorMgmt] editor extension panel missing * for icon (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106059">Bug 106059</a>. [Viewers] Disappearing icon in problem view when selecting the row (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121794">Bug 121794</a>. [Viewers] preservingSelection(Runnable) comments are stale (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198101">Bug 198101</a>. [DataBinding] ComboObservableValue fails to clear cached value (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198211">Bug 198211</a>. [DataBinding] ComputedValue invokes doGetValue outside realm when adding a change listener (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198603">Bug 198603</a>. [DataBinding] ObservableListContentProvider should use AbstractListViewer.insert (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204754">Bug 204754</a>. [DataBinding] BeanObservableValueDecorator.equals method implementation is incorrect (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207619">Bug 207619</a>. [CommonNavigator] StackOverflowError when attempting to import with at least 2 projects in workspace (FIXED)<br>
-  </p>
-
-<p>Integration Build (October 26, 2007, 3:21 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108493">Bug 108493</a>. [Markers] Show tooltips for table columns in marker views (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110087">Bug 110087</a>. [Markers] "Filters" menu doesn't remember the last selected filter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204842">Bug 204842</a>. [Contributions] setGlobalActionHandler ignores some IActions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206064">Bug 206064</a>. [GlobalActions] Provide LTK aware IDE actions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206321">Bug 206321</a>. [Metadata] Update ui.ide.application project preferences (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206794">Bug 206794</a>. 'Open With > ...' submenu behaves strange when file out of sync (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207174">Bug 207174</a>. [Markers] Issue when dynamically unloading a bundle containing markers (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207188">Bug 207188</a>. [Dialogs] org.eclipse.jface.dialogs.Dialog.shortenText calls GC.textExtent too often (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207226">Bug 207226</a>. [Markers] Add task is never enabled (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207263">Bug 207263</a>. NPE in org.eclipse.swt.widgets.Control.WM_MENUSELECT (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207366">Bug 207366</a>. Circular dependancy introduced by bug 206064 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207494">Bug 207494</a>. Missing tasks actions in MarkersView (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207601">Bug 207601</a>. [Commands] NullPointerException in HandlerActivation.toString() when tracing enabled (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207604">Bug 207604</a>. [KeyBindings] Always include unbound commands (FIXED)<br>
-  </p>
-
-<p>Integration Build (October 22, 2007, 4:34 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207075">Bug 207075</a>. ResourceManagerTest#testDeviceManagerAllocations failing (NEW)<br>
-  </p>
-
-<p>Integration Build (October 22, 2007, 4:06 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=46164">Bug 46164</a>. [Tasks] Go To enabled for non-file markers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=89610">Bug 89610</a>. [KeyBindings] preference page: IllegalArgumentException using KeySequenceText delete (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136397">Bug 136397</a>. [ActionSets] toolbar: specifying pull-down forces plugin load (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164499">Bug 164499</a>. [Commands] org.eclipse.ui.commandImages documentation error (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189092">Bug 189092</a>. Can't Replace A Menu (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=197171">Bug 197171</a>. OpenActionMarker has unused optimization (INVALID)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198201">Bug 198201</a>. [DataBinding] Provide POJO observables (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202893">Bug 202893</a>. [Contributions] F1 key does not work when context id set in org.eclipse.ui.menu (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203334">Bug 203334</a>. [IDE] IDE help icon is not required (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203753">Bug 203753</a>. [Markers] Errors expanding on every select (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203789">Bug 203789</a>. [Markers] ShowIn menu has no sub entries (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203799">Bug 203799</a>. [Markers] All entry has duplicated entries with Java Problem Type (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203805">Bug 203805</a>. [Markers] [Markers] Cheese after switching marker type in Markers view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204303">Bug 204303</a>. [GlobalActions] Convert MAXIMIZE and MINIMIZE to handlers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204428">Bug 204428</a>. [CommonNavigator] Project explorer shows new created projects twice (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204458">Bug 204458</a>. [Commands] Allow menu and toolbars to fire execution events (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204579">Bug 204579</a>. [GlobalActions] convert OPEN_PERSPECTIVE_DIALOG (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204580">Bug 204580</a>. [GlobalActions] convert NEW_EDITOR (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205070">Bug 205070</a>. [JFace] ImageDataImageDescriptor's hashCode doesn't correspond to its equals method (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205331">Bug 205331</a>. [GlobalActions] Move "Uncategorized > Open File..." to "File > Open File..." (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205497">Bug 205497</a>. [Markers] Change the old marker view references to the new one (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205792">Bug 205792</a>. [Mac] Enhance org.eclipse.ui.carbon plugin in order to modify the system menus (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206034">Bug 206034</a>. [CellEditors] ColumnViewerEditor does not check if the last cell editor listener has cancelled the event (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206458">Bug 206458</a>. [GlobalActions] convert retarget actions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206475">Bug 206475</a>. [Markers] Switch the markers view to a non virtual view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206489">Bug 206489</a>. [Markers] Tasks column too small in the new markers view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206554">Bug 206554</a>. [DataBinding] Remove x-friends declaration from core.databinding MANIFEST (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206752">Bug 206752</a>. [OLE] Error when opening not SQL files (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=206754">Bug 206754</a>. [KeyBindings] CommandContributionItem does not pick the best key binding (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=207060">Bug 207060</a>. [Markers] Filtered count is -1 when not using marker limits (FIXED)<br>
-  </p>
-
-<p>Integration Build (Oktober 15, 2007, 7:39 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=151204">Bug 151204</a>. [Progress] Blocked status of jobs are not applied/reported (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=155436">Bug 155436</a>. [IDE] Project>Clean dialog should not use a question-mark icon (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157511">Bug 157511</a>. [Preferences] FileFieldEditor should have a constructor allowing the validation strategy to be set (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162505">Bug 162505</a>. [Markers] DCR: Make MarkerView API (to support client feedback view) (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167191">Bug 167191</a>. [Markers] Add icon support for marker groupings (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172000">Bug 172000</a>. [Wizards] WizardNewFileCreationPage should support overwriting existing resources (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172734">Bug 172734</a>. [PropertiesDialog] PropertyDialogAction.isApplicableForSelection does not consider if the page is applicable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173995">Bug 173995</a>. [Progress] Switch progress monitoring to asyncExec (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175606">Bug 175606</a>. [Decorators] ConcurrentModificationException during DecorationScheduler$3.setUpUpdates (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179789">Bug 179789</a>. [Progress] [RCP] Progress Service Dialog requires a call to the progress service (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183218">Bug 183218</a>. [Model] Unused parameter / field in DeferredTreeContentManager (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186823">Bug 186823</a>. [Wizards] New Project Wizard has colliding mnemonics (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=192996">Bug 192996</a>. [Workbench] Reduce amount of garbage created by HeapStatus (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=194825">Bug 194825</a>. IconAndMessage dialog has an inconsistent margin (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=197171">Bug 197171</a>. OpenActionMarker has unused optimization (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=199337">Bug 199337</a>. [key binding][preferences] TemplatePreferencePage has Hard-Coded Content Assist Trigger (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201664">Bug 201664</a>. [Markers] Problems view's "Show items of type" filter does not work correctly (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202735">Bug 202735</a>. [DataBinding] Add tests for IObservable.dispose() to conformance tests (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204581">Bug 204581</a>. [Preferences] Filtered tree doesn't update font and size (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205058">Bug 205058</a>. [Markers] Tasks had no filters for description, completion and priority (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205194">Bug 205194</a>. [ErrorHandling] [StatusHandling] StatusAdapter needs Action and Explanation constants (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205248">Bug 205248</a>. [Databinding] Observables on Text with FOCUS_OUT event incorrectly notify with no change (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205541">Bug 205541</a>. view becomes non-responsive after fastview/close/open in two perspectives (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205869">Bug 205869</a>. [Markers] org.eclipse.ui.ide does not compile due to usage of Java 6 APIs (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205923">Bug 205923</a>. [Viewers] Javadoc for setAllChecked() does not mention that only visible items are checked (FIXED)<br>
-  </p>
-
-<p>Integration Build (Oktober 05, 2007, 4:43 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203753">Bug 203753</a>. [Markers] Errors expanding on every select (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204304">Bug 204304</a>. [GlobalActions] Convert some File actions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204574">Bug 204574</a>. [GlobalActions] convert SHOW_WORKBOOK_EDITORS (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204576">Bug 204576</a>. [GlobalActions] convert SHOW_QUICK_ACCESS (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204577">Bug 204577</a>. [GlobalActions] convert SHOW_OPEN_EDITORS (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204580">Bug 204580</a>. [GlobalActions] convert NEW_EDITOR (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204790">Bug 204790</a>. [Workbench] lock on .metadata/.lock is never released (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205058">Bug 205058</a>. [Markers] Tasks had no filters for description, completion and priority (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205069">Bug 205069</a>. [Trim] Dragging a maximized editor's tab restores editor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205222">Bug 205222</a>. [WorkingSets] use 'Properties' to configure working sets (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205224">Bug 205224</a>. [Databinding] Removing LinkedList dependency from Realm (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205286">Bug 205286</a>. [ViewMgmt] Icons from one view's toolbar appear in another view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205474">Bug 205474</a>. [Themes] The wrong default font is loaded when you specify a different theme. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205497">Bug 205497</a>. [Markers] Change the old marker view references to the new one (NEW)<br>
-  </p>
-
-<p>Integration Build (Oktober 02, 2007, 12:10 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=35358">Bug 35358</a>. [Global Actions] missing icon in File / Refresh menu (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=53617">Bug 53617</a>. [Icons] New/alternate icons required by platform-ui for 3.0 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=88098">Bug 88098</a>. [Graphics] Some icons may be obsolete in the workbench (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=91047">Bug 91047</a>. [About] About dialog buttons seemingly not responsive (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=97676">Bug 97676</a>. [Preferences] Pref Page General/Editors/Content Types problems - File Associations (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138078">Bug 138078</a>. [Preferences] Preferences Store for i18n support (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139063">Bug 139063</a>. [Field Assist] - API - behavior of text insert not taking selection into account (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164748">Bug 164748</a>. [FieldAssist] Content assist popup in Find Replace dialog for regexp covers regexp text (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182059">Bug 182059</a>. [DataBinding] Expose conformance tests (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184533">Bug 184533</a>. [Progress] ProgressIndicator uses hardcoded style for ProgressBar (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187362">Bug 187362</a>. Problems when Windows folder not exactly same as Project name (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=190581">Bug 190581</a>. [Themes]Inconsistent presentation/theme names (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=191735">Bug 191735</a>. [About] Plug-ins table from About dialog should show sort arrows (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=192630">Bug 192630</a>. [FieldAssist] auto activation of proposal popup should be canceled on keystroke (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=200424">Bug 200424</a>. [Undo] Undo operation deletes a file from the file system (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=200762">Bug 200762</a>. [FieldAssist] SimpleContentProposalProvider filters out exact matches (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202937">Bug 202937</a>. [FieldAssist] ContentProposalAdapter on Combo opens popup when a selection is made (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203774">Bug 203774</a>. [Markers] configure filters dialog for anything but problems is empty (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203784">Bug 203784</a>. [Markers] Switching between contents slow (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203791">Bug 203791</a>. [Markers] Need the additions entry in the context menu (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203838">Bug 203838</a>. [Markers] [Markers] clicking on column headers does not sort table (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203863">Bug 203863</a>. [Markers] Grouping should be optional and based on content provider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203974">Bug 203974</a>. [Markers] [Markers] markers view: Twistis on configure filter dialog not correctly laid out (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204135">Bug 204135</a>. [Commands] Update CommandAction (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204843">Bug 204843</a>. [Field Assist] - API - should deprecate FILTER_CUMULATIVE in ContentProposalAdapter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204902">Bug 204902</a>. [Markers] Quick FIx dialog should select all markers by default (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=204935">Bug 204935</a>. [Markers] MarkersView should use fixed default widths (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=205049">Bug 205049</a>. Other plug-ins should be able to define default content generator (FIXED)<br>
-  </p>
-
-<p>Integration Build (September 24, 2007, 3:37 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137893">Bug 137893</a>. [Markers] Filtering ion Problems view should allow "ANDing" filter conditions (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137898">Bug 137898</a>. [Contributions] Icon tool tips should also show key bindings in Debug view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162505">Bug 162505</a>. [Markers] DCR: Make MarkerView API (to support client feedback view) (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188587">Bug 188587</a>. [FastView] Search view stepping in fast view mode broken (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203630">Bug 203630</a>. [GlobalActions] Convert CLOSE_ALL_PERSPECTIVES to a handler (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203631">Bug 203631</a>. [GlobalActions] Convert CLOSE_PERSPECTIVE to a handler (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203632">Bug 203632</a>. [GlobalActions] Convert EDIT_ACTION_SETS to a handler (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203805">Bug 203805</a>. [Markers] [Markers] Cheese after switching marker type in Markers view (NEW)<br>
-  </p>
-
-<p>Integration Build (September 19, 2007, 4:14 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203987">Bug 203987</a>. [Commands] Adding breakpoint stopps working (FIXED)<br>
-  </p>
-
-<p>Integration Build (September 18, 2007, 11:00 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203276">Bug 203276</a>. [Metadata] Some 3.4 plugins have lower versions that 3.3.1 plugins (FIXED)<br>
-  </p>
-
-<p>Integration Build (September 18, 2007, 3:40 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202779">Bug 202779</a>. [MinMax] Unhandled event loop exception when maximizing Console view (ASSIGNED)<br>
-  </p>
-
-<p>Integration Build (September 17, 2007, 10:38 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201905">Bug 201905</a>. [Viewers] 3.4 ArrayIndexOutOfBoundsException in ColumnViewer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201907">Bug 201907</a>. [CellEditors] 3.4 Cell editors don't activate in TableViewer without SWT.FULL_SELECTION and they used to in 3.1.2 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203657">Bug 203657</a>. [Viewers] 3.4 - ColumnViewer leaks ViewerCell (and model elements) (FIXED)<br>
-  </p>
-
-<p>Integration Build (September 14, 2007, 3:37 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=84702">Bug 84702</a>. [DynamicUI][RCP]AbstractUIPlugin.stop missing imageRegistry.dispose() (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=97901">Bug 97901</a>. [ViewMgmt] [RCP] tab group with non-closeable view can still be moved (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123205">Bug 123205</a>. [Contributions] ToolBarManger displays wrong number of items, if pack() is not called (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=147785">Bug 147785</a>. [Contributions] ISelectionListener doesn't extend EventListener... (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162505">Bug 162505</a>. [Markers] DCR: Make MarkerView API (to support client feedback view) (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171463">Bug 171463</a>. [Working Sets] hashCode of workingSet may change (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182761">Bug 182761</a>. [Themes] Undefined color entry will cause an NPE if looked up (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=199769">Bug 199769</a>. [Commands] HandlerService.createExecutionEvent always throws NullPointerException (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=200166">Bug 200166</a>. [KeyBindings] Keybindings on the Mac conflict with reserved OS bindings (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=200558">Bug 200558</a>. [Viewers] ArrayIndexOutOfBoundsException in ColumnViewer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201055">Bug 201055</a>. [RCP] Limit offered perspectives in the perspective chooser (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202911">Bug 202911</a>. javadoc warning in N20070911-0010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203090">Bug 203090</a>. [WorkingSets] working set 'description' element not correctly documented (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=203126">Bug 203126</a>. [WorkingSets] Allow location of WorkingSetConfigurationBlock to be changed by implementors (FIXED)<br>
-  </p>
-
-<p>Integration Build (September 10, 2007, 4:19 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=27842">Bug 27842</a>. [Working Sets] What is a working set type? (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=73872">Bug 73872</a>. [ActionSets] Action delegates promotes memory leaks (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=83307">Bug 83307</a>. [WorkingSets] Unable to restore working set item (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136397">Bug 136397</a>. [ActionSets] toolbar: specifying pull-down forces plugin load (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139298">Bug 139298</a>. [ErrorHandling] eclipse will silently fail to launch with invalid colorDefinition value (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161044">Bug 161044</a>. [Import/Export] Error: Destination directory conflicts with location of workspace root (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162505">Bug 162505</a>. [Markers] DCR: Make MarkerView API (to support client feedback view) (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166761">Bug 166761</a>. [Actions] StepIntoSelectionActionDelegate "leaks" editor after close all (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174345">Bug 174345</a>. [WorkingSets] IWorkingSetElementAdapter documentation is sparse/misleading (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180747">Bug 180747</a>. [DetachedView] Detached variable view is not responding when it is opened from another perspective (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182059">Bug 182059</a>. [DataBinding] Expose conformance tests (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184712">Bug 184712</a>. [Viewers] Label provider of a tree vewier is not called (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198880">Bug 198880</a>. [DataBinding] ObservablesManager does not dispose model (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198903">Bug 198903</a>. [DataBinding] ComboSingleSelectionObservableValue setValue() does not change selection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198904">Bug 198904</a>. [DataBinding] Listeners in swt Observables are not removed on dispose (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198906">Bug 198906</a>. [DataBinding] SelectionProviderSingleSelectionObservableValue doesn't remove selectionChangedListener on dispose (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=199904">Bug 199904</a>. [WorkingSets] Move WorkingSetConfigurationBlock down to platform UI (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=200252">Bug 200252</a>. [JFace] Use logger instead of printStackTrace() in SafeRunnable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201906">Bug 201906</a>. [Viewers] 3.4 ColumnViewerEditor leaks ViewerCell instances. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201910">Bug 201910</a>. [Viewers] 3.4 TableViewer/TreeViewer#editElement() doesn't scroll the selected editor into view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202208">Bug 202208</a>. [ViewMgmt] Standalone View does not resize when implementing ISizeProvider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202421">Bug 202421</a>. [Progress] JobInfo.canceled should be volatile (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202424">Bug 202424</a>. Missing current theme causes crash on startup (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202441">Bug 202441</a>. Typo in extension point description org.eclipse.ui.menus (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=202663">Bug 202663</a>. Presence of tweaklets during test runs causes grief (FIXED)<br>
-  </p>
-
-<p>Integration Build (August 31, 2007, 1:48 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=83216">Bug 83216</a>. [WorkingSets] Layout changes in New Working Set wizard (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131855">Bug 131855</a>. [TabbedProperties] Provide dynamic tab and section support (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171719">Bug 171719</a>. IMemento/XMLMemento being extended to add functionality (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=193571">Bug 193571</a>. [Dialogs] FilteredItemsSelectionDialog does not immediately remove last history match (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=199904">Bug 199904</a>. [WorkingSets] Move WorkingSetConfigurationBlock down to platform UI (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201540">Bug 201540</a>. [Preferences] 'encoding' should find 'Content Types' preference page (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201616">Bug 201616</a>. [Min.Max] Need to be able to change the orientation of a minimized stack (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201640">Bug 201640</a>. [TabbedProperties] NullPointerException in TabbedPropertyRegistryFactory (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201661">Bug 201661</a>. [WorkingSets] Selecting 'Other Projects' working set in combo control throws exception in 'New Project' wizard (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201731">Bug 201731</a>. [WorkbenchLauncher] WorkbenchAdvisor.eventLoopException() no longer called before workbench fully started (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201906">Bug 201906</a>. [Viewers] 3.4 ColumnViewerEditor leaks ViewerCell instances. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201907">Bug 201907</a>. [CellEditors] 3.4 Cell editors don't activate in TableViewer without SWT.FULL_SELECTION and they used to in 3.1.2 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=201910">Bug 201910</a>. [Viewers] 3.4 TableViewer/TreeViewer#editElement() doesn't scroll the selected editor into view (FIXED)<br>
-  </p>
-
-<p>Integration Build (August 27, 2007, 3:34 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=51580">Bug 51580</a>. [RCP][Views] Need the ability to resize views programmatically (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162505">Bug 162505</a>. [Markers] DCR: Make MarkerView API (to support client feedback view) (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188587">Bug 188587</a>. [FastView] Search view stepping in fast view mode broken (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189999">Bug 189999</a>. [PropertiesView] [PropertiesView] Setting 1 value causes very slow recursive refresh (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=191046">Bug 191046</a>. [Min/Max] View does not open 2nd time when editor max'd (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=191611">Bug 191611</a>. NPE in FilteredItemsSelectionDialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=194760">Bug 194760</a>. [CellEditors] [Viewers] JavaDoc DialogCellEditor updateLabel mistake (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=200731">Bug 200731</a>. [Viewers] 3.4: FocusCell and focused row not in sync (FIXED)<br>
-  </p>
-
-<p>Integration Build (August 20, 2007, 4:36 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=12116">Bug 12116</a>. [Contributions] widgets: MenuManager.setImageDescriptor() method needed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=66219">Bug 66219</a>. [Contributions] ActionContributionItem always gets the currentTimeMillis (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124683">Bug 124683</a>. [DataBinding] support binding to a multi-selection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=143592">Bug 143592</a>. [Contributions] Toolbar contributions from two editors displayed simultaneously (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=144851">Bug 144851</a>. MultiPageEditorPart.getAdapter uses code that requires UI thread (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162505">Bug 162505</a>. [Markers] DCR: Make MarkerView API (to support client feedback view) (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179374">Bug 179374</a>. [ErrorHandling] Resize the support area when detail is clicked (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188178">Bug 188178</a>. [Commands] workbench System.out (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188343">Bug 188343</a>. [KeyBindings] NPE in Keys (Legacy) preference page (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188587">Bug 188587</a>. [FastView] Search view stepping in fast view mode broken (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=191511">Bug 191511</a>. [Perspecitves] Workbench.showPerspective gets NullPointerException, if active page have no perspective. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=192587">Bug 192587</a>. [KeyBindings] Extra entries appear in Keys preference page after pressing "restore command" (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=194221">Bug 194221</a>. [Commands] Slow to close dialogs due to ContextAuthority.sourceChanged triggering multiple menu updates (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=196164">Bug 196164</a>. IDE plugin broken due to missing dependency on runtime compatibility (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=196306">Bug 196306</a>. [Commands] RegistryRadioState cannot properly initialize because of NPE (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=200127">Bug 200127</a>. [DataBinding] Realm documentation is wrong (3.4) (FIXED)<br>
-  </p>
-
-<p>Integration Build (August 14, 2007, 9:51 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=199873">Bug 199873</a>. 'zoomTestSuite' and others broken (NEW)<br>
-  </p>
-
-<p>Integration Build (August 13, 2007, 4:33 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180747">Bug 180747</a>. [DetachedView] Detached variable view is not responding when it is opened from another perspective (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198562">Bug 198562</a>. [Contributions] Change ActionContributionItem + CommandContributionItem to use event coordinates (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198575">Bug 198575</a>. [Intro] display problems -- standby and maximized (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198694">Bug 198694</a>. [EditorMgmt] [registry] Improve InstantiationException message thrown from RegistryStrategyOSGI.createExecutableExtension (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=199449">Bug 199449</a>. NPE due to null actionBuilder when closing a view that failed in createPartControl (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=199770">Bug 199770</a>. Check for invalid FileEditorInputs (FIXED)<br>
-  </p>
-
-<p>Integration Build (August 01, 2007, 2:50 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=151221">Bug 151221</a>. [DataBinding] Patch: Binding to untyped (Object) properties when the type is known (WONTFIX)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162505">Bug 162505</a>. [Markers] DCR: Make MarkerView API (to support client feedback view) (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180747">Bug 180747</a>. [DetachedView] Detached variable view is not responding when it is opened from another perspective (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=196553">Bug 196553</a>. [Dialogs] Support IColorProvider/IFontProvider in FilteredItemsSelectionDialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=197475">Bug 197475</a>. [TrayDialog] Redundant check in isCompatibleLayout (FIXED)<br>
-  </p>
-
-<p>Integration Build (July 30, 2007, 4:00 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162505">Bug 162505</a>. [Markers] DCR: Make MarkerView API (to support client feedback view) (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178946">Bug 178946</a>. [Viewers] ColumnViewerEditorDeactivationEvent should hold informations why the editor is deactivated (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182800">Bug 182800</a>. [Viewers] FocusCellHighlighter#focusCellChanged(ViewerCell) should be replaced by  focusCellChanged(ViewerCell,ViewerCell) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182822">Bug 182822</a>. [DataBinding] AggregateValidationStatus assumes a default Realm has been set (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=190210">Bug 190210</a>. Update ISV Workbench doc (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=195908">Bug 195908</a>. [Viewers] Keyboard navigation doesn't work when columns reordered (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=196921">Bug 196921</a>. [DnD] Wrong api doc for org.eclipse.ui.part.PluginTransfer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=197962">Bug 197962</a>. chkpii error in N20070726-0010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198035">Bug 198035</a>. [Viewers] Open API for Reordered Columns as proposed in 195908 (FIXED)<br>
-  </p>
-
-<p>Integration Build (July 16, 2007, 3:39 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=29853">Bug 29853</a>. [Workbench] OpenWithMenu and setFile (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=35243">Bug 35243</a>. [Import/Export] File and Import and Export Dialog have inconsistent labels (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=46197">Bug 46197</a>. [Workbench] bogus javadoc for IMemento.TAG_ID (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63075">Bug 63075</a>. [PropertiesDialog] The file size in the file Properties dialog and the file Properties view is not formatted for the locale (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=70370">Bug 70370</a>. [Viewers] ViewerDropAdapter couples auto-scroll and auto-expand (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=72489">Bug 72489</a>. [Dialogs] ErrorDialog resize behaviour should be improved (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=73092">Bug 73092</a>. [IDE] WorkspaceModifyOperation does not avoid updates, although comment indicates it does (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=74549">Bug 74549</a>. [Workbench] UIPlugin should remove initializeDefaultPreferences (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=82937">Bug 82937</a>. [Dialogs] There is no title in the dialog (FileDialog class) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=85742">Bug 85742</a>. [RCP] Doc clarification required for IWorkbenchConfigurer.create* (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=93353">Bug 93353</a>. [Dialogs] InternalErrorDialog#buttonPressed should explicitly call super (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=93373">Bug 93373</a>. [Intro] TipsAndTricksAction should not use magic numbers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=95292">Bug 95292</a>. [Intro] Help > Welcome missing F1 context (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=95882">Bug 95882</a>. [Progress] Provide toString() for PendingUpdateAdapter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=96943">Bug 96943</a>. [Dialogs] [open type] Open Type dialog should open menu on Ctrl+F10 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=97229">Bug 97229</a>. [Dialogs] ListSelectionDialog should be resizable by default (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=97667">Bug 97667</a>. [Preferences][PatchProvided] Pref Page General/Editors - problems (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=98467">Bug 98467</a>. [WorkbenchLauncher] [Preferences] Workspace path with comma (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=101468">Bug 101468</a>. [Workbench] Incorrect doctype line in package.html files (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103747">Bug 103747</a>. [Viewers] calling refresh on treeviewer in treeExpanded function, but it mess (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107029">Bug 107029</a>. [Dialogs] API - Many resizable dialogs do not have a maximize button, but should. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107771">Bug 107771</a>. [WorkingSets] Working Set selection dialogs have thier own image caches (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108479">Bug 108479</a>. [Preferences] Workspace preference page is not correctly vertically aligned (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109389">Bug 109389</a>. [JFace] API -  IntegerFieldEditor does not fire property change all the time (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111034">Bug 111034</a>. Eclipse allows me to create a project named '.metadata' (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121727">Bug 121727</a>. [Viewers] ContentViewer.getLabelProvider javadoc is wrong (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121789">Bug 121789</a>. [Viewers] ColorAndFontCollector javadoc is wrong (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121794">Bug 121794</a>. [Viewers] preservingSelection(Runnable) comments are stale (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121796">Bug 121796</a>. [Viewers] getControl() contains no javadoc (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121797">Bug 121797</a>. [Viewers] internalRefresh(Object) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123169">Bug 123169</a>. [Progress] NPE from JobInfo (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124282">Bug 124282</a>. [Dialogs] TypeFilteringDialog: label has wrong case (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128526">Bug 128526</a>. [ViewMgmt] Show View Dialog should remember size & location (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128529">Bug 128529</a>. [ViewMgmt] Show View Dialog should be able to show a view's description (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130315">Bug 130315</a>. [JFace] ImageRegistry.put(String, Image) cannot accept null Image (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131989">Bug 131989</a>. [Browser] NullPointerException in WorkbenchBrowserSupport.createBrowser (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135818">Bug 135818</a>. ITreeSelection does not offer getElementComparer() (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138034">Bug 138034</a>. [Preferences] Label decorations page - extra space (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=140041">Bug 140041</a>. [Preferences] ConcurrentModificationException in WorkingCopyManager.applyChanges (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=142802">Bug 142802</a>. [Markers] FieldSeverityAndMessage should protect against uninitialzed images (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=144219">Bug 144219</a>. [Workbench] org.eclipse.tests.ui.harness has unneccessary reliance on ide (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156852">Bug 156852</a>. [Wizards] New spelling error marking: add to dictionary and fix with dictionary (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161026">Bug 161026</a>. [Wizards] ProjectContentsLocationArea uses wrong file separator (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162505">Bug 162505</a>. [Markers] DCR: Make MarkerView API (to support client feedback view) (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164662">Bug 164662</a>. [Workbench] Minor typo in IPageLayout (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165676">Bug 165676</a>. [JFace] Add javadoc to Window.close() to tell that no shellClosed event is sent (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172261">Bug 172261</a>. [Actions] When rename a file in one project's navigator, the other selected file's name is renamed (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174228">Bug 174228</a>. [Preferences] PreferencePage javadoc needs tidying up (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177767">Bug 177767</a>. [Markers] In task preferences dialog, negative value results in internal error (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180248">Bug 180248</a>. [Progress] NPE in JobTreeElement.compareTo(...) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180701">Bug 180701</a>. [JFace] API - Popup dialog is creating image descriptors every time it is opened (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180731">Bug 180731</a>. [Preferences] Appearance preference page should have keyword 'animations' (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180989">Bug 180989</a>. [Progress] Stale API field in IWorkbenchSiteProgressService (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182354">Bug 182354</a>. [Dialogs] API - make ElementTreeSelectionDialog usable with a FilteredTree (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182505">Bug 182505</a>. [FieldAssist]  API - ContentProposalAdapter needs hasProposalPopupFocus() method (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184423">Bug 184423</a>. [JFace] ColorRegistry.getRGB(String) can return null (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185347">Bug 185347</a>. [Progress] Concatenate task and subtask with ": " in ProgressMonitorPart (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185500">Bug 185500</a>. [Common Navigator] DND allows to Drop Projects on Projects but shows error (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185892">Bug 185892</a>. [Import/Export] Unexpectedly cursor moving in import dialog. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186344">Bug 186344</a>. [CommonNavigator] Project Explorer duplicates Working Set actions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187877">Bug 187877</a>. [EFS] Null pointer exception when getting path of FileEditorInput whose file does not exist (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188269">Bug 188269</a>. [IDE] [Dialogs] - conflicting mnemonics caused by AbstractEncodingFieldEditor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188448">Bug 188448</a>. Javadoc for PathEditorInput#getPath is ambiguous (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189636">Bug 189636</a>. Custom rule template failing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189867">Bug 189867</a>. [Preferences] [preferences] Editors prefs page should have keywords 'restore' and 'state' (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189885">Bug 189885</a>. [Dialogs] SafeRunnableDialog class Javadoc contains special char: ? (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=190360">Bug 190360</a>. [pde viz] Nodes appear on top of one another (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=191042">Bug 191042</a>. Missing since tags in schemas (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=191147">Bug 191147</a>. [CommonNavigator] Problem with selection causes view to fail to load (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=191694">Bug 191694</a>. [EFS] NPE in FileEditorInput.getPath (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=192536">Bug 192536</a>. [Progress] Progress view doesn't differentiate between cancelled and canel requested (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=192577">Bug 192577</a>. Support explicit "Embedded" type for IReportItemPresentation (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=193260">Bug 193260</a>. [Databinding] Incorrect javadoc for TextObservableValue (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=194353">Bug 194353</a>. [DataBinding] AbstractStringToNumberValidator caches message across validation requests (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=194587">Bug 194587</a>. [DataBinding] Policy.getLog().log() could be a bit more informative (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=194790">Bug 194790</a>. [DataBinding] ObservableTracker/CompositeUpdater improvements (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=195152">Bug 195152</a>. [KeyBindings] NPE when opening Keys preference page (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=196204">Bug 196204</a>. [Intro] SWT Welcome RSS Feed doesn't Work (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=196352">Bug 196352</a>. [WorkbenchLauncher] Null Display using Display.getCurrent() (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=196362">Bug 196362</a>. [Themes] Incorrect use of IThemeRegistry.HierarchyComparator in ThemeElementHelper.addDefaulted(...) (FIXED)<br>
-  </p>
-
-<p>Integration Build (June 13, 2007, 2:32 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179578">Bug 179578</a>. [EditorMgmt] OpenMultipleEditorTest#testOpenMultipleEditors: running (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179581">Bug 179581</a>. [Perspectives] perspectiveSwitchTest#testPerspectiveSwitch 50% slower than M5 (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179725">Bug 179725</a>. [Commands] Commands takes 81% of the time to open a workbench window (NEW)<br>
-  </p>
-
-<p>Integration Build (June 08, 2007, 10:38 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187380">Bug 187380</a>. Several UI packages missing javadoc (FIXED)<br>
-  </p>
-
-<p>Integration Build (June 07, 2007, 10:39 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174622">Bug 174622</a>. [Contributions] [Doc] Add comments to 5 schema docs (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177741">Bug 177741</a>. [Contributions] [Doc] Update the doc with a contribution example (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189697">Bug 189697</a>. [Commands] [Doc] incomplete extension point description for org.eclipse.ui.handlers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=191467">Bug 191467</a>. [KeyBindings] New keys preference page doesn't link to help (FIXED)<br>
-  </p>
-
-<p>Integration Build (June 06, 2007, 8:35 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177741">Bug 177741</a>. [Contributions] [Doc] Update the doc with a contribution example (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189159">Bug 189159</a>. [Preferences] Javadoc tags in org.eclipse.ui.preferenceTransfer doc (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=191250">Bug 191250</a>. [FastView] [Presentations] 3.0 representation and fast view bar (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=191255">Bug 191255</a>. [Activities] GenerateIdentifiersTest#Generate 10000 identifiers() is not enough reliable to be in fingerprints (FIXED)<br>
-  </p>
-
-<p>Integration Build (June 05, 2007, 8:17 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=98242">Bug 98242</a>. [Viewers] [Javadoc] clarify that StructuredViewer does not update sort order if null properties are given (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172534">Bug 172534</a>. [Workbench] Document when getSaveables is called by workbench (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177741">Bug 177741</a>. [Contributions] [Doc] Update the doc with a contribution example (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182046">Bug 182046</a>. [Trim] configurer.setSaveAndRestore(true) doesn't work in 3.3M6 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187376">Bug 187376</a>. [DataBinding] packages missing javadoc summary sentences (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188911">Bug 188911</a>. [Contributions] [Doc] IContributionItem.dispose() says it should not be called by clients (FIXED)<br>
-  </p>
-
-<p>Integration Build (June 04, 2007, 5:19 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=190061">Bug 190061</a>. [Metadata] Update @since tags for new API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=190538">Bug 190538</a>. [Tests] Need test views for saveables (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=190849">Bug 190849</a>. [Metadata] UI Plug-in version number pass (NEW)<br>
-  </p>
-
-<p>Integration Build (June 01, 2007, 12:12 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185094">Bug 185094</a>. [Keybindings] Enter and Esc keys don't work any more in dialogs (FIXED)<br>
-  </p>
-
-<p>Integration Build (Mai 31, 2007, 11:16 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=190056">Bug 190056</a>. [WorkbenchParts] Memory is leaked when opening a saveable part in new window (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 31, 2007, 4:39 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184622">Bug 184622</a>. [Graphics] [WorkbenchLauncher] Splash screen shows incorrect year in the copyright notice (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=190256">Bug 190256</a>. [FastView] Help view opened as fast view cannot be closed and prevents exiting from eclipse (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=190336">Bug 190336</a>. [Actions] Rename border does not show up on the Mac (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 30, 2007, 4:39 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177741">Bug 177741</a>. [Contributions] [Doc] Update the readme tool example (NEW)<br>
-  </p>
-
-<p>Integration Build (May 30, 2007, 4:39 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177741">Bug 177741</a>. [Contributions] [Doc] Update the readme tool example (NEW)<br>
-  </p>
-
-<p>Integration Build (May 30, 2007, 4:17 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189106">Bug 189106</a>. FilteredItemsSelectionDialog flickers when pattern changes (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=190006">Bug 190006</a>. [QuickAccess] Empty string should not be associated with an element (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 30, 2007, 3:53 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179077">Bug 179077</a>. [Graphics] Suppress red Xs in Help > About Eclipse > Plugin Details for unsigned jars? (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189448">Bug 189448</a>. [Metadata] Organize Manifest update (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189664">Bug 189664</a>. [QuickAccess] can't find Open Perspective/Show View->Other with Quick Access (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189896">Bug 189896</a>. [Commands] handler service snapshot context assertion failed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189901">Bug 189901</a>. [ErrorHandling] NPE showing error (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189934">Bug 189934</a>. [WorkingSets] Break apart working set action set (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 29, 2007, 2:21 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186677">Bug 186677</a>. [PerspectiveBar] Perspective switcher "show text" enables after saving prefs. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186814">Bug 186814</a>. [Min/Max] New restore images for the Trim Stacks (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188808">Bug 188808</a>. [Preferences] Workbench Preferences dialog cannot filter default preference page (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188958">Bug 188958</a>. [Min/Max] Dragging a view back into the presentation doesn't 'unzoom' (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189161">Bug 189161</a>. [WorkbenchLauncher] Splash javadoc nits (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189448">Bug 189448</a>. [Metadata] Organize Manifest update (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189521">Bug 189521</a>. [QuickAccess] Ctrl+3 popup doesn't handle Home and End keys (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189694">Bug 189694</a>. ApplicationWindow#run() can hang Eclipse (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 29, 2007, 2:15 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186677">Bug 186677</a>. [PerspectiveBar] Perspective switcher "show text" enables after saving prefs. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186814">Bug 186814</a>. [Min/Max] New restore images for the Trim Stacks (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188808">Bug 188808</a>. [Preferences] Workbench Preferences dialog cannot filter default preference page (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188958">Bug 188958</a>. [Min/Max] Dragging a view back into the presentation doesn't 'unzoom' (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189161">Bug 189161</a>. [WorkbenchLauncher] Splash javadoc nits (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189448">Bug 189448</a>. [Metadata] Organize Manifest update (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189521">Bug 189521</a>. [QuickAccess] Ctrl+3 popup doesn't handle Home and End keys (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=189694">Bug 189694</a>. ApplicationWindow#run() can hang Eclipse (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 28, 2007, 3:32 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-  </p>
-
-<p>Integration Build (May 25, 2007, 10:17 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184732">Bug 184732</a>. [KeyBindings] Re-enable old keys preferences page until new version has stabilized (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188056">Bug 188056</a>. [Preferences] PreferencePage s have to less indent in PreferenceDialog (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 24, 2007, 8:40 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188958">Bug 188958</a>. [Min/Max] Dragging a view back into the presentation doesn't 'unzoom' (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 24, 2007, 4:23 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174349">Bug 174349</a>. [open type] Open Type dialog should support '<' and ' ' in combination with camel case (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176108">Bug 176108</a>. Icons not centered in minimized trim stack (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182509">Bug 182509</a>. [Dialogs] [dialogs] Strange selection behaviour in FilteredItemsSelectionDialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182917">Bug 182917</a>. [Dialogs] Improve progress in FilteredItemsSelectionDialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185386">Bug 185386</a>. [EditorMgmt] Uses the least recently used perspective when trying to close view that implements ISaveablePart2 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187544">Bug 187544</a>. [Trim] [Trim] Trim contributions not disabled during editor save (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 23, 2007, 3:06 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128927">Bug 128927</a>. [FastView] Problem occurs when "weclome" view be put into "Fast View" bar (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=140799">Bug 140799</a>. [Keybindings] Keyboard shortcuts don't work if a view is detached (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172485">Bug 172485</a>. o.e.u.ide  action sets need to be converted to commands and moved to ide.application (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174378">Bug 174378</a>. [ViewMgmt] [Contributions] activating the view menu does not activate the view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175181">Bug 175181</a>. NavigatorSaveablesServices NPEs on shutdown (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178284">Bug 178284</a>. [DynamicUI] [Contributions] Loading/unloading action set leaves handlers and keybindings behind (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179077">Bug 179077</a>. [Graphics] Suppress red Xs in Help > About Eclipse > Plugin Details for unsigned jars? (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182308">Bug 182308</a>. [Contributions] [Doc] CompoundContributionItem's getContributionItems() method has no javadocs (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184045">Bug 184045</a>. [JFace] TableColumnLayout leaves space for scrollbar, goes away when shell is resized (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185067">Bug 185067</a>. [KeyBindings] New Keys pref page: cannot sort 'User' column (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185107">Bug 185107</a>. [Themes] [europa] appearance preference page corrupted after switch wks (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185891">Bug 185891</a>. [WorkingSets] Use safe runnable in AbstractWorkingSetManager.firePropertyChange (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186801">Bug 186801</a>. [Min/Max] Un-detaching a View restores to maximized perspective (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187069">Bug 187069</a>. [Min/Max] Adding a legacy fast view with a maximized part puts the view in the wrong stack (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187546">Bug 187546</a>. [FastView] [Min/Max] Editor Area empty after perspective switch (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187632">Bug 187632</a>. [Trim] [Min/Max] Closing the last perspective leaves minimized editor stack in the trim (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187812">Bug 187812</a>. [KeyBindings] IBindingService.getActiveBindingsFor(ParameterizedCommand)  does not work (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187817">Bug 187817</a>. [Viewers] Can't select multiple items in "externalize strings" dialog. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187826">Bug 187826</a>. [Viewers] Active Editor is not closed before refreshing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187890">Bug 187890</a>. [Progress] [Decorators] Systems with many jobs can delay decoration >10 seconds (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188056">Bug 188056</a>. [Preferences] PreferencePage s have to less indent in PreferenceDialog (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188357">Bug 188357</a>. [EFS] Export to tar not working with pluggable filesystem (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188467">Bug 188467</a>. [GlobalActions] CyclePerspectiveHandler leaks one image per perspective per switch (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188588">Bug 188588</a>. [KeyBindings] [KeyBindings] missing keyboard shortcut for opening a view in my RCP app (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=188593">Bug 188593</a>. [KeyBindings] Conflicts with Emacs keybindings scheme in zh locale for same command (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 17, 2007, 3:23 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178375">Bug 178375</a>. Selection jumps while multi-selecting in FilteredItemsSelectionDialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186927">Bug 186927</a>. [WorkbenchLauncher] [RCP] regression: WorkbenchAdvisor.preStartup() not called on the UI thread anymore (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187497">Bug 187497</a>. [StatusHandling] NullPointerException in StatusAdapterHelper#clear() (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187594">Bug 187594</a>. Compiler warnings in I20070517-0010 (NEW)<br>
-  </p>
-
-<p>Integration Build (Mai 16, 2007, 11:19 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153933">Bug 153933</a>. [Dialogs] [RCP] Dialog.DLG_IMG_HELP not available in RCP apps (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186927">Bug 186927</a>. [WorkbenchLauncher] [RCP] regression: WorkbenchAdvisor.preStartup() not called on the UI thread anymore (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187189">Bug 187189</a>. [ViewMgmt] TreeViewer disposes of widget when the third item in the tree is deleted (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187200">Bug 187200</a>. [Viewers] Deleting filtered config doesn't reset filter + errors (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187264">Bug 187264</a>. [DataBinding] "not to be implemented by clients" missing in IConverter Javadoc (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 16, 2007, 8:32 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154537">Bug 154537</a>. [Import/Export] NPE in import page (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173049">Bug 173049</a>. [ErrorHandling] multiple stacked "Internal error" dialogs after OutOfMemoryError (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182624">Bug 182624</a>. [Status Handling] Jobs show up twice when NO_IMMEDIATE_ERROR_PROMPT set (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186727">Bug 186727</a>. [ErrorHandling] NullPointerException when trying to show a Status with OK severity (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187318">Bug 187318</a>. [Wizards] "Import Existing Project" loops forever with cyclic symbolic links (FIXED)<br>
-  </p>
-
-<p>Integration Build (Mai 15, 2007, 11:14 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177770">Bug 177770</a>. [DataBinding] Mutators not implemented on JavaBeansObservableList (FIXED)<br>
-  </p>
-
-<p>Integration Build (Mai 15, 2007, 10:24 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137442">Bug 137442</a>. [DataBinding] (C)ComboObservableValue should bind to selection index (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175817">Bug 175817</a>. FilteredItemsSelectionDialog should show "n items selected" in status line (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178277">Bug 178277</a>. [StatusHandling] Missing javadoc in status handling (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183650">Bug 183650</a>. [FieldAssist] ContentProposalAdapter with Text produces unwanted popup on Enter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183679">Bug 183679</a>. [QuickAccess] Polish QuickAccess dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184502">Bug 184502</a>. [Contributions] conflict reported for 2 different contexts (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186403">Bug 186403</a>. [KeyBindings] provide conflict information to users outside of logging (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186475">Bug 186475</a>. [ActivityMgmt] The wizard entry is displayed in the New dialog, even if activities extension is specified to hide the wizard entry. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186762">Bug 186762</a>. [WorkingSets] IWorkingSetManager#createWorkingSetNewWizard(String[]) does not work as speced (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186768">Bug 186768</a>. [Trim] AbstractContributionFactory cannot be used (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186808">Bug 186808</a>. [JFace] regression: JFace standalone apps should work without org.eclipse.osgi (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186854">Bug 186854</a>. [Contributions] separator with visible="false" is still visible (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187002">Bug 187002</a>. [Min/Max] SampleView appears minimized (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187007">Bug 187007</a>. [Min/Max] non-closeable view gets close menu item (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187020">Bug 187020</a>. [Min/Max] stand-alone views don't honor their state when minimized (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187026">Bug 187026</a>. [Min/Max] non-movable views can be dragged out of minimized stacks (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=187046">Bug 187046</a>. [Min/Max] 'show title' false leads to missing icon in minimized stack (FIXED)<br>
-  </p>
-
-<p>Integration Build (Mai 14, 2007, 11:49 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174737">Bug 174737</a>. [IDE] New Plug-in Project wizard status handling is inconsistent (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179205">Bug 179205</a>. [Import/Export] Basic Project Creation error reporting result in SWT thread access error (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180302">Bug 180302</a>. [StatusHandling] Protect the StatusManager code from faulty StatusHandler (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185673">Bug 185673</a>. [Viewers] Mac only: In variables and expressions views, up/down keyboard navigation doesn't work correctly (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186119">Bug 186119</a>. [Contributions] org.eclipse.ui.commands added  to main.toolbar via menuContribution do not have a "flat" look on W2K (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186526">Bug 186526</a>. [KeyBindings] New Keys preference page removed binding for command with initial keybinding conflict (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 13, 2007, 7:16 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172191">Bug 172191</a>. [GlobalActions] Window>Show View>Other fails with NPE (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184818">Bug 184818</a>. [DataBinding] Typo in example 3 (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 11, 2007, 4:23 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=152919">Bug 152919</a>. [Import/Export] import existing project w/ copy is inefficient (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177064">Bug 177064</a>. [Viewers] org.eclipse.jface.viewers.TreeSelection#equals/hashcode should use IElementComparer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178277">Bug 178277</a>. [StatusHandling] Missing javadoc in status handling (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180004">Bug 180004</a>. [Min/Max] Opening a view that gets placed in a minimized stack doesn't get focus (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183998">Bug 183998</a>. [Win32] Failure in IWorkbenchPageTest: testOpenEditor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184000">Bug 184000</a>. [Win32] Failure in IDeprecatedWorkbenchPageTest: testopenEditor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184476">Bug 184476</a>. [Dialogs] Open Resource Dialog; Capitalization: Show Derived Resources (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185494">Bug 185494</a>. [EditorMgmt] Mnemonic conflict on 'Editors' preference page (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185891">Bug 185891</a>. [WorkingSets] Use safe runnable in AbstractWorkingSetManager.firePropertyChange (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186211">Bug 186211</a>. [Viewers] SWT/JFace: TreeViewer unable to show same image in different columns (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186355">Bug 186355</a>. [DetachedView] Detached View doesn't remember content for invisible perspectives (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186614">Bug 186614</a>. [Trim] empty fast view stack when closing a view (FIXED)<br>
-  </p>
-
-<p>Integration Build (Mai 10, 2007, 11:56 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118028">Bug 118028</a>. [Commands] misc: Many identical entries in 'Uncategorized' (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174806">Bug 174806</a>. [Import/Export] setupSelectionsBasedOnSelectedTypes() casts to IResource (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178397">Bug 178397</a>. [StatusHandling] View with an error opens an error dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178987">Bug 178987</a>. [Min./Max] Unchecking the 'Fast View' menu entry causes floating TB's (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180565">Bug 180565</a>. [StatusHandling] [BiDi] Stacktrace "Details" text area should always be LTR (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180758">Bug 180758</a>. [IDE] Deleting a project but not the contents asks if you want to delete read-only files (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184012">Bug 184012</a>. [Win32] Failure in IEditorRegistryTest: testGetImageDescriptor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184346">Bug 184346</a>. [Viewers]Double-Click-Activation not working on Linux-Gtk (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184441">Bug 184441</a>. [Viewers] Wrong selection event on change visible working sets (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184688">Bug 184688</a>. org.eclipse.ui.dialogs.SearchPattern has a few painful glitches (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185150">Bug 185150</a>. [KeyBindings] Do not allow duplicate key bindings (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185551">Bug 185551</a>. [KeyBindings] [KeyBindings] New Keys pref page: should have useful secondary sort order (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185570">Bug 185570</a>. [Min/Max] Maximized Views show restored state on restart (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185663">Bug 185663</a>. [Trim] 3.0 presentation: Minimised stack restore button doesn't work (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185824">Bug 185824</a>. [QuickAccess] CamelCase algorithm needs to be better (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185841">Bug 185841</a>. Colour treatement of active non-focus tabs (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186178">Bug 186178</a>. [QuickAccess] Text not shown on selected item. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186203">Bug 186203</a>. [ActionSets] Undead tooltips in customize perspective dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186218">Bug 186218</a>. [RCP] 'WorkbenchWindowConfigurerTest' failing on all platforms (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=186423">Bug 186423</a>. [Themes] Reduce Palette shouldn't use TITLE_BACKGROUND_GRADIENT (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 07, 2007, 4:06 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173481">Bug 173481</a>. Bloopers on Problems view's Quick Fix Dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178875">Bug 178875</a>. all asyncExec calls from startup threads are being called prior to the workbench being fully initialized (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179364">Bug 179364</a>. [BIDI} BiDi3.3: Improper Ordering of File Path in Window Title (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184087">Bug 184087</a>. [ActivityMgmt] Optimize performance of MutableActivityManager#setEnabledActivityIds() (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184632">Bug 184632</a>. [ErrorHandling] DynamicStatusHandler class has a compile error (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184980">Bug 184980</a>. [WorkbenchLauncher] Three colors and a font leaked on switch workspace dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185475">Bug 185475</a>. [Contributions] legacy actions become disabled in multipage editors after being invoked (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 03, 2007, 1:39 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184910">Bug 184910</a>. [Workbench] stack trace in UI when starting eclipse compiled with 1.6 settings from source build (NEW)<br>
-  </p>
-
-<p>Integration Build (May 03, 2007, 10:30 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185245">Bug 185245</a>. [Contributions] legacy actions no longer work for multipage editors (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 02, 2007, 10:56 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185063">Bug 185063</a>. [KeyBindings] New Keys preference page: enabling "Include unbound commands" takes 30s (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185245">Bug 185245</a>. [Contributions] legacy actions no longer work for multipage editors (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 02, 2007, 5:40 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153156">Bug 153156</a>. [CommonNavigator] Project Explorer filters dialog needs UI polishing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153924">Bug 153924</a>. [CommonNavigator] Project Explorer: ugly blinking when resizing Filters dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179255">Bug 179255</a>. Closing maximized Editor should restore Views (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183679">Bug 183679</a>. [QuickAccess] Polish QuickAccess dialog (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184697">Bug 184697</a>. [CommonNavigator] StructuredViewerManager refresh job shows up in the progress view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184877">Bug 184877</a>. [CommonNavigator] No F1 help for Project Explorer view (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184914">Bug 184914</a>. [Dialogs] Leaked cursor opening wizard from Quick Access (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184991">Bug 184991</a>. RuntimeException on startup with Project Explorer open (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185063">Bug 185063</a>. [KeyBindings] New Keys preference page: enabling "Include unbound commands" takes 30s (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185068">Bug 185068</a>. [KeyBindings] New Keys pref page: table does not update when binding is cleared (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185072">Bug 185072</a>. [KeyBindings] New Keys pref page: When field does not trigger table update (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185074">Bug 185074</a>. [KeyBindings] New Keys preference page: should enlarge combo like old page did (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185181">Bug 185181</a>. [CommonNavigator] NPE from Customize View of Project Explorer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185215">Bug 185215</a>. [Common Navigator] Increment version number for org.eclipse.ui.navigator (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 02, 2007, 4:04 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=170950">Bug 170950</a>. [ActivityMgmt] If activity for the fast view is disabled (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179255">Bug 179255</a>. Closing maximized Editor should restore Views (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184421">Bug 184421</a>. [KeyBindings] Unreadable message: 'A conflict occurred for [keybinding...]' (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184732">Bug 184732</a>. [KeyBindings] Re-enable old keys preferences page until new version has stabilized (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184783">Bug 184783</a>. [ActivityMgmt] Capabilities returning to default enabled state after user disabled capability (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185055">Bug 185055</a>. [KeyBindings] New Keys preference page: Remove Delete button next to schema (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=185070">Bug 185070</a>. [KeyBindings] New Keys pref page: 'Remove Binding' removes the selection (NEW)<br>
-  </p>
-
-<p>Integration Build (May 01, 2007, 11:33 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160166">Bug 160166</a>. [CommonNavigator] Actions not synched with selection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184855">Bug 184855</a>. [KeyBindings] Keys Preference Page is interpreting keybindings (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 01, 2007, 8:01 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184956">Bug 184956</a>. Internal error (NPE) when switching perspectives (FIXED)<br>
-  </p>
-
-<p>Integration Build (May 01, 2007, 4:29 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183679">Bug 183679</a>. [QuickAccess] Polish QuickAccess dialog (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184730">Bug 184730</a>. [KeyBindings] New Keys preference page: cannot restore binding for a single command (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184736">Bug 184736</a>. [Commands] 'testOpenBasicEditor' is giving a failure based on a Handler clash (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 30, 2007, 11:21 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133224">Bug 133224</a>. [DataBinding] Fix ITreeProvider and UpdatableTreeContentProvider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153630">Bug 153630</a>. [DataBinding] Extract SWT specific code from JFace databinding into its own bundle (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183448">Bug 183448</a>. [Contributions] IActionDelegate2.dispose() does not get called when view is closed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183679">Bug 183679</a>. [QuickAccess] Polish QuickAccess dialog (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184730">Bug 184730</a>. [KeyBindings] New Keys preference page: cannot restore binding for a single command (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184755">Bug 184755</a>. [DataBinding] internal tree content provider does not work (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184775">Bug 184775</a>. [Min/Max] Enable Image Animation Tweaklet (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184817">Bug 184817</a>. [DataBinding] WritableMap.put(...) fires an incorrect event (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 30, 2007, 4:37 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135837">Bug 135837</a>. [Viewers] Problems with TreeSelection#equals(..) and StructuredSelection#equals(..) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=170903">Bug 170903</a>. Implement a generic Animation Engine /w Image Animations (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172735">Bug 172735</a>. [Viewers] regression? Selection not revealed in tree of launch configuration dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177064">Bug 177064</a>. [Viewers] org.eclipse.jface.viewers.TreeSelection#equals/hashcode should use IElementComparer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181642">Bug 181642</a>. [Viewers] [JFace] Why doesn't BaseLabelProvider.dispose() call clearListeners()? (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183679">Bug 183679</a>. [QuickAccess] Polish QuickAccess dialog (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184589">Bug 184589</a>. [KeyBindings] New keys preference page unusably slow (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184597">Bug 184597</a>. [Contributions] ActionContributionItem should show accelerator text even if accelerator cannot be parsed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184604">Bug 184604</a>. [Undo] - Action handlers should initially support local context if there are operations available (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184659">Bug 184659</a>. [KeyBindings] The dialog font is not applied to the General > Keys page. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184668">Bug 184668</a>. [KeyBindings] (new) keys preference page has no mnemonics (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184669">Bug 184669</a>. [KeyBindings] (new) keys preference page layout problems (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 26, 2007, 7:48 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=13221">Bug 13221</a>. [EditorMgmt] [RCP] dragging an external file onto the editor area should open it (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=78666">Bug 78666</a>. [KeyBindings] errors: No warning if keybinding definitions collide (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122639">Bug 122639</a>. [WorkbenchParts] PageBookView's toolbar doesn't properly re-layout after page switching (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=140604">Bug 140604</a>. [KeyBindings] Keybinding from a viewer contribution is shown, but not handled (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=147072">Bug 147072</a>. [JFace] CompositeImageDescriptor is lossy (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=151990">Bug 151990</a>. [Progress] Task Name Not Displayed in ProgressMonitorDialog with openOnRun==false (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153156">Bug 153156</a>. [CommonNavigator] Project Explorer filters dialog needs UI polishing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153924">Bug 153924</a>. [CommonNavigator] Project Explorer: ugly blinking when resizing Filters dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162534">Bug 162534</a>. [Trim] Dock On-> bottom/top/ect not remembered when restored again. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164475">Bug 164475</a>. [Viewers] v3.2/v3.3 TableViewer sort performance much slower than v3.0.1 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=170950">Bug 170950</a>. [ActivityMgmt] If activity for the fast view is disabled (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171132">Bug 171132</a>. [DataBinding] Incorrect interaction between observeText(field, FocusOut) and Binding.updateModelFromTarget (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171906">Bug 171906</a>. [DataBinding] API sanity pass (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172574">Bug 172574</a>. [IDE] DeleteProjectDialog inconsequent selection behavior (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173248">Bug 173248</a>. [IDE] Failure in IDE.saveAll reports "An error has occurred when closing the workbench... (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175135">Bug 175135</a>. [Menus] Multiple entries for Share Project in the new menu support (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175146">Bug 175146</a>. [IDE] Review use of Bundle#start (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175417">Bug 175417</a>. [Contributions] runtime exception in objectContribution selectionChanged sabatoges popup menu (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176235">Bug 176235</a>. [Contributions] polish new keys preference page (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176399">Bug 176399</a>. FilteredItemsSelectionDialog should remove history items with Delete key (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177557">Bug 177557</a>. [PropertiesDialog] - clarify migration from objectClass to enabledWhen in propertyPage schema (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178684">Bug 178684</a>. ArrayIndexOutOfBoundsException when searching for debug exception breakpoint (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178937">Bug 178937</a>. [Contributions] Disabled icon not shown in toolbar button for a disabled Action in ActionSet (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178980">Bug 178980</a>. [Dialogs] FilteredItemsSelectionDialog should protect against null names (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179205">Bug 179205</a>. [Import/Export] Basic Project Creation error reporting result in SWT thread access error (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182490">Bug 182490</a>. [WorkbenchLauncher] DBCS3.3: new workspace with copy layout makes invalid workbench.xml (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182652">Bug 182652</a>. [Viewers] Performance of Penalty when using SWTCellFocusManager (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182716">Bug 182716</a>. [IDE] Improve 'New' menu regarding projects (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182874">Bug 182874</a>. [Preferences] The width of the ColorSelector button is too wider than that of other buttons. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183013">Bug 183013</a>. [Wizards] Errror importing into linked EFS folder - "undefined path variable" (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183596">Bug 183596</a>. BiDi3.3: Cannot open a workspace with an Arabic name (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183732">Bug 183732</a>. [DataBinding] swallowing the exception in get/set value of the JavaBeanObservableValue (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184034">Bug 184034</a>. Test failures/errors occurred in the following:  org.eclipse.ui.tests.navigator_win32.win32.x86 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184088">Bug 184088</a>. [Min/Max] 'Orientation' menu entry does nothing for minimized stacks (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=184090">Bug 184090</a>. Test Status Handler should only be enabled when running the test suites (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 23, 2007, 7:12 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136397">Bug 136397</a>. [ActionSets] toolbar: specifying pull-down forces plugin load (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138666">Bug 138666</a>. [EditorMgmt] provide mechanism for restoring editors without materialization (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=147072">Bug 147072</a>. [JFace] CompositeImageDescriptor is lossy (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154140">Bug 154140</a>. Fix Net4j source plugins (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168295">Bug 168295</a>. [Decorators] File icons with more than one Label Decoration get black background (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171126">Bug 171126</a>. [Viewers] TreeViewerRow: use iteration instead of recursion (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171149">Bug 171149</a>. [Contributions] Convert platform actions to the new menus API (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171906">Bug 171906</a>. [DataBinding] API sanity pass (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172640">Bug 172640</a>. [Viewers] Virtual TreeViewer/ILazyTreePathContentProvider: preservingSelection and refresh not always working (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173213">Bug 173213</a>. [Commands] Show View cannot be executed from the Command Composer (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176373">Bug 176373</a>. [Preferences] NLS33:button labels on Content Types Preferences truncated (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176419">Bug 176419</a>. [Progress] Unlabelled progress monitors shiuld have a default value in the blocked jobs dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176525">Bug 176525</a>. Cleartext proxy password shown in Help->About->Configuration Details (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178363">Bug 178363</a>. Navigate > Next/Previous and Ctrl+,/. don't work any more in Synchronize view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178858">Bug 178858</a>. [Wizards][ErrorHandling] Error in wizard page creation not logged (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180205">Bug 180205</a>. [Progress] Progress view shows two entries for same job (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180363">Bug 180363</a>. [LinkedResources] No way to create a linked resource based on a variable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180503">Bug 180503</a>. [Contributions] Updating UIElement from Command Handler not working (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180542">Bug 180542</a>. [Contributions] Save action UIElement state incorrect at times (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180674">Bug 180674</a>. [Presentations] Many colors allocated over and over again when opening same editor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180779">Bug 180779</a>. [Contributions] popup menus defined via org.eclipse.ui.menus do not appear (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181155">Bug 181155</a>. [FieldAssist] Opening Find/Replace dialog flashes whole workbench (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182110">Bug 182110</a>. Clean up new JFace Viewers APIs (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182402">Bug 182402</a>. [JFace] FontRegistry.defaultFontRecord() leaks a Font (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182443">Bug 182443</a>. [Viewers]Native tooltip behaviour lost when using ColumnViewerToolTipSupport (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182602">Bug 182602</a>. [StatusHandling] Switching between non modal/modal dialog in WorkbenchErrorHandler (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182630">Bug 182630</a>. [DataBinding] org.eclipse.jface.databinding doesn't export org.eclipse.jface.databinding.wizard (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182651">Bug 182651</a>. [FastView] WorkbenchPage.isPageZoomed class cast error (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182747">Bug 182747</a>. Rename system default theme (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182755">Bug 182755</a>. [DataBinding] infinite loop when binding to validation status (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182780">Bug 182780</a>. [DataBinding] Default a converter for IStatus to String (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182812">Bug 182812</a>. [Contributions] Lots of IllegalArgumentExceptions from CommandContributionItem (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182898">Bug 182898</a>. [KeyBindings] IAE trying to open Keys (Experimental) preference page (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182926">Bug 182926</a>. Build N20070418-0010 Compile errors in build (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182971">Bug 182971</a>. [Commands] Error in Bug73756Test#testUndefinedCommandIsActiveLogged (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183034">Bug 183034</a>. [DataBinding] Content providers should support AbstractTableViewer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183036">Bug 183036</a>. Need to move HighContrast check out of the PreferenceInitializer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183101">Bug 183101</a>. [Workbench] [CommonNavigator] The projects are not displayed in Project Explorer immediately after the launch of the workbench. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183167">Bug 183167</a>. [ErrorHandling] Assertion problem in testWizardWithNoDefaultContructor during N20070419-0010 tests (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183190">Bug 183190</a>. [IDE] missing keywords for General > Workspace preference page (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183438">Bug 183438</a>. [Viewers] AIOOBE in AbstractTableViewer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183599">Bug 183599</a>. Navigator tests failing in  N20070423-0010 (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 16, 2007, 7:47 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=98144">Bug 98144</a>. Open view tests need degradation comment removed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138021">Bug 138021</a>. [Preferences][Themes] Appearance page cumulative fixes (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153081">Bug 153081</a>. [Commands] commands doesn't recognize the objectcontribution for popups (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153888">Bug 153888</a>. [Markers] Marker views update on each resource delta (was: Problems view flashes when launching anything) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166600">Bug 166600</a>. [DataBinding] Refactor tests to be in the correct packages (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169985">Bug 169985</a>. [ErrorHandling] Hooking the error handling into jobs again (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=170381">Bug 170381</a>. [Viewers] Make Sorting and Filtering work for Virtual-Tables without ILazyContentProvider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176419">Bug 176419</a>. [Progress] Unlabelled progress monitors shiuld have a default value in the blocked jobs dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177449">Bug 177449</a>. [Themes] Font setting changes don't take effect until restart (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177619">Bug 177619</a>. [Viewers] AbstractListViewer#setSelectionToWidget() doesn't care about the reveal flag (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178280">Bug 178280</a>. [JFace] AbstractColumnLayout updating of column sizes not working correct on gtk (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178367">Bug 178367</a>. [Min/Max] Stack 'selectedTabId' handling does no correctly handle multi-instance views (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178858">Bug 178858</a>. [Wizards][ErrorHandling] Error in wizard page creation not logged (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178875">Bug 178875</a>. all asyncExec calls from startup threads are being called prior to the workbench being fully initialized (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178906">Bug 178906</a>. Infinite error dialogs due to error closing error dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178917">Bug 178917</a>. [Databinding] Create snippet to demonstrate Databinding for Table-Inline-Editing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179458">Bug 179458</a>. [Presentations] EditorArea shown when application restored (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179580">Bug 179580</a>. [Menus] Action set not shown on startup (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179582">Bug 179582</a>. [Menus] Enablement of menu item not updated (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179584">Bug 179584</a>. OpenCloseViewTest#showView:org.eclipse.ui.views.ResourceNavigator() should be removed from the fingerprints (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179875">Bug 179875</a>. [Trim] [Presentations] NPE when using IStackPresentationSite#dragStart (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180805">Bug 180805</a>. [Markers] Performance issue when doing 'Select all' in Problems View with large number of warnings (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181155">Bug 181155</a>. [FieldAssist] Opening Find/Replace dialog flashes whole workbench (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181535">Bug 181535</a>. [Viewers] test failure in N20070408-0010 on GTK (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181616">Bug 181616</a>. [StatusHandling] StatusDialog formats a message with no parameters and does not use NLS (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181729">Bug 181729</a>. [FastView] View ordering not restored on restart after minimize (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181756">Bug 181756</a>. [WorkbenchLauncher] [BiDi] Bidi3.3: ProgressBar is not mirrored in mirrored eclipse (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181839">Bug 181839</a>. [Min/Max] Mazimizing the editor area causes it to lose focus (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181950">Bug 181950</a>. [WorkbenchLauncher] [BiDi] BIDI3.3<HCG:Undesired order of dir path when selecting threw "Workspace Launcher"> (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181982">Bug 181982</a>. [Viewers] content provider in TreeTest should return children when getElements is called (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181991">Bug 181991</a>. [Contributions] ContributedAction leaks editors (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182013">Bug 182013</a>. [Viewers] Viewer#setSelection() reveals for TreeViewer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182190">Bug 182190</a>. [Wizards] getControl assert on wizard page has no message (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182395">Bug 182395</a>. [Workbench] Workbench not disposing default images (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182443">Bug 182443</a>. [Viewers]Native tooltip behaviour lost when using ColumnViewerToolTipSupport (REOPENED)<br>
-  </p>
-
-<p>Integration Build (April 09, 2007, 10:21 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179089">Bug 179089</a>. [ViewMgmt] Provide API to set a view's busy state (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 09, 2007, 6:42 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=44295">Bug 44295</a>. [WorkbenchParts] Workbench-Shutdown/Startup: Saving/Restoring Cursor Positions in Texteditor-Windows (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113957">Bug 113957</a>. [ErrorHandling] Difficult to interpret error dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132424">Bug 132424</a>. [Markers] Quick Fix dialog problems (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154398">Bug 154398</a>. [Dialogs] Javadoc - IconAndMessageDialog.createMessageArea assumes parent composite is using GridLayout (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157879">Bug 157879</a>. [CommonNavigator] Link With Editor should be at the bottom of the view menu (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169637">Bug 169637</a>. [DataBinding] Multiple validation statuses per binding (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=170903">Bug 170903</a>. Implement AnimatedTabItem using the Animation Engine (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172113">Bug 172113</a>. [Workbench] The default browser handler(DefaultWebBrowser) in ui.workbench doesn't work on SLED10 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172352">Bug 172352</a>. [Presentations] Leakage: system menu not disposed for TabbedStackPresentation (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175742">Bug 175742</a>. [Markers] contributed marker resolutions only showing first contribution (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176235">Bug 176235</a>. [Contributions] polish new keys preference page (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176993">Bug 176993</a>. [Wizards/BiDi] JFace Wizard background image not mirrored for Bidi Languages (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177181">Bug 177181</a>. [Min/Max] Editor area state not perspective based (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177405">Bug 177405</a>. [Preferences] Layout issues with Text Boxes and Scrollbars (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177434">Bug 177434</a>. [Wizards] New Project wizard is not big enought in High Contrast (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177438">Bug 177438</a>. Accessibility : Preferences Dialog UI has problems in High Contrast Mode on SLED 10 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178989">Bug 178989</a>. [Min/Max] Handle 'non-standard' stack/view types (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179036">Bug 179036</a>. [Commands][Contributions][Context][KitchenSink] verify expression evaluation characteristics (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179089">Bug 179089</a>. [ViewMgmt] Provide API to set a view's busy state (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179094">Bug 179094</a>. [min/max] switch between perspectives ends up with maximizing the active view of the first perspective (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179408">Bug 179408</a>. [DataBinding] Externalize Date Format (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179409">Bug 179409</a>. [DataBinding] Rework StringToBooleanPrimitiveConverter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179551">Bug 179551</a>. [Undo] DefaultOperationHistory should write exceptions to log when running in Eclipse (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180242">Bug 180242</a>. [DND] Drag and drop test errrors (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180394">Bug 180394</a>. [DND] [EditorMgmt] Simple D&D strategy for editors and multiple windows (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180415">Bug 180415</a>. Implement "Kelvin Colours" (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180466">Bug 180466</a>. [ErrorHandling] [StatusHandling] StatusManager#getManager() can't return null (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180928">Bug 180928</a>. [Commands] NPE in ToggleBreakpointAction.getDocument (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181061">Bug 181061</a>. [Viewers] JFace viewers performance issues in 3.3 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181535">Bug 181535</a>. [Viewers] test failure in N20070408-0010 on GTK (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181613">Bug 181613</a>. [FastView] Min/max rectangle should use stack border colour (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181624">Bug 181624</a>. [Contributions] [ActivityMgmt] new menu story does not acknowledge activities (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=181668">Bug 181668</a>. The readmetool example has un-externalized labels (FIXED)<br>
-  </p>
-
-<p>Integration Build (April 02, 2007, 7:20 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107599">Bug 107599</a>. [Preferences] Line delimiter field editor will not switch to defaults (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137073">Bug 137073</a>. [Preferences] Encoding field editor never fires value change events (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159198">Bug 159198</a>. [About] Date and Time of Configuration Details panel are not localized (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163281">Bug 163281</a>. FieldEditorPreferencePage needs a default constructor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171099">Bug 171099</a>. [Sync View] Java content provider provides wrong label for folder (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171815">Bug 171815</a>. [Metadata] org.eclipse.ui.ide.application doesn't specify plugin requirements in its manifest (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171845">Bug 171845</a>. [Viewers] AbstractListViewer#insert should get @since 3.3 tag (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173088">Bug 173088</a>. [Dialogs] Remove from type selection history action label could be less generic (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173438">Bug 173438</a>. [Contexts] ContextAuthority$1.widgetDisposed(..) does not handle case where shell is already disposed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174846">Bug 174846</a>. [Menus] Strange entry in log opening Commit Wizard (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174908">Bug 174908</a>. [Contributions] Leakage: PluginActionContributionItem not being removed as activity manager listener (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175085">Bug 175085</a>. SWT errors due to oversized overlay icon (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175859">Bug 175859</a>. [DataBinding] Use MessageFormat for validation hints (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176282">Bug 176282</a>. Link With Editor in Navigator and Project Explorer should work for IEditInput that can adapt to IFile (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176607">Bug 176607</a>. [Dialogs] FilteredItemsSelectionDialog.GranualProgressMonitor does not support subTask(..) and misses message updates (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176764">Bug 176764</a>. [Undo] - DeleteResourcesOperation does not handle overlapped selections (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176845">Bug 176845</a>. [Min/Max] Restore from Editor-Area leaves View unrestored (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176873">Bug 176873</a>. [Preferences] ColorFieldEditor should not set button size to IDialogConstants.BUTTON_WIDTH (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177183">Bug 177183</a>. [Dialogs] PopupDialog should show the view menu on mouseDown (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178189">Bug 178189</a>. [Preferences][Dialogs] New File Type dialog problems (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178228">Bug 178228</a>. Double-Click in Java editor ruler broken (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178297">Bug 178297</a>. [Dialogs] - remove required field color (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178331">Bug 178331</a>. [Dialog] Invalid result in Open Resource dialog when spaces in pattern (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178399">Bug 178399</a>. [Mni/Max] Editor area both visible and minimized (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178458">Bug 178458</a>. Tab from other window shows displaying Intro if new content available (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178522">Bug 178522</a>. [Progress] Progress dialog is updating for blocked after it is closed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178791">Bug 178791</a>. [FastViews] 'Context menu > Close' on 'Restore' button does nothing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178798">Bug 178798</a>. [FastViews] Duplicated new FVB after moving around (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178987">Bug 178987</a>. [Min./Max] Unchecking the 'Fast View' menu entry causes floating TB's (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179031">Bug 179031</a>. Breakpoints View showing Search results (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179036">Bug 179036</a>. [Commands][Contributions][Context][KitchenSink] verify expression evaluation characteristics (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179110">Bug 179110</a>. [Perspectives] Log entry switching perspectives (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179369">Bug 179369</a>. [Viewers]NPE when only using Tab-Editing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179422">Bug 179422</a>. [Viewers] ColumnViewerToolTipSupport shows blank tooltips if no text or image is provided (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179455">Bug 179455</a>. [DataBinding] core.databinding package.html outdated (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179461">Bug 179461</a>. [Viewers] ViewerLabelProviders that implement IColorProvider do not clear colours (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179679">Bug 179679</a>. [Dialogs] FilteredItemsSelectionDialog: make sure all jobs are cancelled when closing dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179875">Bug 179875</a>. [Trim] [Presentations] NPE when using IStackPresentationSite#dragStart (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=179980">Bug 179980</a>. [Contributions] visibleWhen does not work properly for multiple workbench windows (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180177">Bug 180177</a>. ColorsAndFonts test cannot check against the default font (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180178">Bug 180178</a>. Compiler warning in N20070330-0010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180194">Bug 180194</a>. [WorkbenchLauncher] allow placement of buildID by product variable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180245">Bug 180245</a>. [Preferences] JFace NPE while running tests (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180287">Bug 180287</a>. [WorkingSets] Working Set tools should not be visible by default (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=180293">Bug 180293</a>. [FastViews] NPE in bring up a fast view (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 26, 2007, 3:53 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=19462">Bug 19462</a>. [Wizards] WizardDialog always reserves space for progressbar (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=46469">Bug 46469</a>. [Contributions] widgets: Tooltips for menu/toolbar items should include all key bindings (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=85608">Bug 85608</a>. [ViewMgmt] [EditorMgmt] Create option to disable views that open automatically (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130281">Bug 130281</a>. [Dialogs] Empty error message shouldn't take focus in JFace InputDialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=147448">Bug 147448</a>. [Viewers] TreeViewer holds on to filters after being disposed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165838">Bug 165838</a>. [Keybindings] Creating a key binding on "new untitled empty text file" weirdness (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173027">Bug 173027</a>. [KeyBindings] Ctrl+Enter for preview does not work (maximizes editor) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173844">Bug 173844</a>. [WorkbenchLauncher] Splash not showing progress, error "Could not instantiate splash" in log (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176001">Bug 176001</a>. [WorkbenchLauncher] NPE in BasicSplashHandler (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176501">Bug 176501</a>. Dynamic StatusHandler Failures in N20070306 (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178277">Bug 178277</a>. [StatusHandling] Missing javadoc in status handling (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178394">Bug 178394</a>. NPE in marker adapter buildAll markers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178523">Bug 178523</a>. [WorkbenchLauncher] clean up BasicSplashHandler (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178654">Bug 178654</a>. Add test suites for DecoratingLabelProvider (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178780">Bug 178780</a>. [MPE] Improve MultiPageEditorPart.setActiveEditor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178914">Bug 178914</a>. [Trim] Maximize/restore on new presentation makes part lose focus (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178956">Bug 178956</a>. [Preferences] Preferences Dialog does not protect against exceptions on close (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 22, 2007, 8:06 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178192">Bug 178192</a>. [Min/Max] RCP mail looks messed up with the 3.3 look (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178743">Bug 178743</a>. [Trim] IndexOutOfBoundsException restoring View (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 22, 2007, 2:40 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178677">Bug 178677</a>. [Launcher] "Invalid thread access" if invoked it with -perspective argument (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178743">Bug 178743</a>. [Trim] IndexOutOfBoundsException restoring View (FIXED)<br>
-  </p>
-
-<p>Integration Build (M??????rz 21, 2007, 11:19 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178643">Bug 178643</a>. [DataBinding] ValueBinding does not remove model/target listeners on dispose (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178680">Bug 178680</a>. [Databinding] UpdateValueStrategy.setBeforeSetValidator() breaks call chaining (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178712">Bug 178712</a>. [Perspectives] Minimized stacks in 'perspectiveExtensions' use the old behavior (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 21, 2007, 5:10 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165650">Bug 165650</a>. [Viewers] Regression: Viewer with DecoratingLabelProvider does not render color (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178242">Bug 178242</a>. [Themes] Cannot customize foreground font any longer with 3.0 presentation (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178288">Bug 178288</a>. Javadoc only: Platform UI API still marked experimental (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178521">Bug 178521</a>. [Min/Max] Restored view stack should become active (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178643">Bug 178643</a>. [DataBinding] ValueBinding does not remove model/target listeners on dispose (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178667">Bug 178667</a>. [DataBinding] error message printed to stdout when running test suite (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 21, 2007, 4:48 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178288">Bug 178288</a>. Javadoc only: Platform UI API still marked experimental (NEW)<br>
-  </p>
-
-<p>Integration Build (March 21, 2007, 3:36 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174692">Bug 174692</a>. Typos in org.eclipse.ui.menus description (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177507">Bug 177507</a>. [Presentations] New tab coloring looks broken (NEW)<br>
-  </p>
-
-<p>Integration Build (March 20, 2007, 9:56 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176847">Bug 176847</a>. FVB: Animations not working (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178155">Bug 178155</a>. Cannot switch to default (3.3) presentation (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178439">Bug 178439</a>. [DataBinding] WritableList.removeAll(...) ListDiffEntry reports addition (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 20, 2007, 4:12 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177517">Bug 177517</a>. 3.3 presentation: wrong view on top after restore (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178155">Bug 178155</a>. Cannot switch to default (3.3) presentation (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178173">Bug 178173</a>. [Contributions] Popup menu does not appear (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178181">Bug 178181</a>. [trim] problems on OS/X (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178200">Bug 178200</a>. org.eclipse.ui.workbench does not export org.eclipse.ui.swt (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178220">Bug 178220</a>. [Viewers] Senseless method in AbstractTableViewer#setColumnPart() (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178228">Bug 178228</a>. Double-Click in Java editor ruler broken (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178240">Bug 178240</a>. [Min/Max] NPE on startup (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 19, 2007, 7:27 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174213">Bug 174213</a>. [ViewMgmt] add attribute to close a sticky view in all open perspectives (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176395">Bug 176395</a>. [Contributions] Allow Reference core expressions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177200">Bug 177200</a>. [Min/Max] Toolbar and Perspective bar should not be default locations for fast view trim (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177412">Bug 177412</a>. [Decorators] [Contributions] LegacyResourceSupport should cache its reflective method lookups (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177862">Bug 177862</a>. Move CTabFolder, CTabItem work to SWT from 3.3. presentation (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177941">Bug 177941</a>. [Min/Max] 'drag maximized Problems folder to right of Editor Area' test failure (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178083">Bug 178083</a>. [Contributions] Provide selection adapter factory for new core expression interfaces (FIXED)<br>
-  </p>
-
-<p>Integration Build (M?rz 19, 2007, 6:00 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=147448">Bug 147448</a>. [Viewers] TreeViewer holds on to filters after being disposed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178105">Bug 178105</a>. [Viewers] Cell highlighting not customizable for users (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 19, 2007, 2:45 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172646">Bug 172646</a>. [Viewers] Activate Editors using a specialized Event (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176501">Bug 176501</a>. Dynamic StatusHandler Failures in N20070306 (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177592">Bug 177592</a>. [Decorators] [Contributions] ObjectContributionManager.getContributors(List) creates reams of garbage (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=178083">Bug 178083</a>. [Contributions] Provide selection adapter factory for new core expression interfaces (NEW)<br>
-  </p>
-
-<p>Integration Build (March 19, 2007, 12:58 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171824">Bug 171824</a>. [Viewers] Lots of flickering when using TableColumnAdapter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172314">Bug 172314</a>. [Dialogs] FilteredItemsSelectionDialog does not allow us adding camel case navigation handler (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175901">Bug 175901</a>. [DataBinding] Provide support for wizard pages (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176395">Bug 176395</a>. [Contributions] Allow Reference core expressions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177592">Bug 177592</a>. [Decorators] [Contributions] ObjectContributionManager.getContributors(List) creates reams of garbage (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177736">Bug 177736</a>. [Contributions] toolbar updates don't cause a re-layout (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177806">Bug 177806</a>. [Trim] Provide a way for a trim control to participate in commands/handler (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177953">Bug 177953</a>. [DataBinding] test failure (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 18, 2007, 4:48 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=17256">Bug 17256</a>. Exception due to bug 17208 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=82256">Bug 82256</a>. [Contributions] Need EditorPluginAction and ActionDescriptor.ATT_DEFINITION_ID as API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=82541">Bug 82541</a>. [Dialogs] SaveAsDialog should better handle closed projects (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136591">Bug 136591</a>. [Dialogs] TypeFilteringDialog appends unnecessary comma (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138137">Bug 138137</a>. [DnD] Drag-and-drop of source files into editor (DUPLICATE)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153315">Bug 153315</a>. [Contributions] The ToggleAutoBuildAction lacks an action definition id (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153957">Bug 153957</a>. [FastViews] Create Multiple FVB's (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161425">Bug 161425</a>. [Viewers] TableTreeViewer => EditingSupport broken (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163345">Bug 163345</a>. [Field Assist] - API - Deprecate DecoratedField and related classes (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164796">Bug 164796</a>. [Viewers] TableViewer setSelectionToWidget always scrolls to widget (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168888">Bug 168888</a>. [Wizards] PageTransition classes may need rename/reorg (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171522">Bug 171522</a>. [KeyBindings] When "@Ctrl+Break" was appended into lable of menu, Workbench can not startup (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171612">Bug 171612</a>. [Viewers] Breaking API change: DecoratingLabelProvider no longer extends LabelProvider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171783">Bug 171783</a>. [MPE] Breaked contract of SelectionProvider (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171824">Bug 171824</a>. [Viewers] Lots of flickering when using TableColumnAdapter (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172294">Bug 172294</a>. [FieldAssist] [ControlDecoration] API - Decoration does not disappear inside a closed section (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172646">Bug 172646</a>. [Viewers] Activate Editors using a specialized Event (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172844">Bug 172844</a>. [Dialogs] FilteredItemsSelectionDialog: make history separator string configurable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173438">Bug 173438</a>. [Contexts] ContextAuthority$1.widgetDisposed(..) does not handle case where shell is already disposed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173571">Bug 173571</a>. [Viewers] TreeViewer.updateHasChildren() does not work if item is already expanded (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173577">Bug 173577</a>. [Contributions] deactivating actionSet context doesn't make menu disappear (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173902">Bug 173902</a>. remove EXPERIMENTAL markings from 3.3 IDE Undo API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174355">Bug 174355</a>. [Viewers] IViewerLabelProvider isn't supported by the TreeViewer anymore (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174633">Bug 174633</a>. [Contributions] objectContributions replacement needs selection provider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174692">Bug 174692</a>. Typos in org.eclipse.ui.menus description (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174694">Bug 174694</a>. Invalid example in org.eclipse.ui.menus description (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174701">Bug 174701</a>. [Viewers] ViewerRow should be reused instead of connected to the Item (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175763">Bug 175763</a>. [DataBinding] ScaleObservableValue (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175889">Bug 175889</a>. Allow early splash bundles to participate in ui splashHandler (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175890">Bug 175890</a>. [Contributions] need a way to restrict Expression evaluation (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176043">Bug 176043</a>. [Commands] Need to be able to restore the toolbar without breking plug-in boundaries (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176158">Bug 176158</a>. Tool tip flickers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176198">Bug 176198</a>. [Field Assist] - API - ControlDecoration should provide mouse events (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176474">Bug 176474</a>. [key binding] DBCS3.3: please back to the key binding for Content Assist (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176604">Bug 176604</a>. [Dialogs] FilteredItemsSelectionDialog should show view menu on mouseDown (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176607">Bug 176607</a>. [Dialogs] FilteredItemsSelectionDialog.GranualProgressMonitor does not support subTask(..) and misses message updates (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176661">Bug 176661</a>. [Intro] Show intro if new intro content is available (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176882">Bug 176882</a>. [DataBinding] Create SWTObservables.observeEditable(...) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177037">Bug 177037</a>. [StatusHandling] Remove style from StatusAdapter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177116">Bug 177116</a>. [Contributions] NPE in PopupMenuExtender.dispose (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177144">Bug 177144</a>. API problems in FilteredItemsSelectionDialog (2) (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177172">Bug 177172</a>. org.eclipse.ui.editors extension point schema should mention org.eclipse.core.runtime.contentTypes (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177176">Bug 177176</a>. [Field Assist] [API] - Add 7x7 information control decoration to FieldDecorationRegistry (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177181">Bug 177181</a>. [Min/Max] Editor area state not perspective based (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177264">Bug 177264</a>. [DataBinding] Failure in DefaultBindSupportFactoryBooleanPrimitiveTest.testStringToBooleanPrimitiveConverter against Eclipse 3.2.2 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177328">Bug 177328</a>. javadoc warning in N20070314-0010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177353">Bug 177353</a>. Make the 3.3 presentation the default (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177447">Bug 177447</a>. No preference keyword for "presentation" (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177448">Bug 177448</a>. New Presentation leaks colors (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177463">Bug 177463</a>. [DataBinding] SWT Observable API additions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177489">Bug 177489</a>. [Viewers] Document usability of IColorProvider, IFontProvider not usable for ListViewers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177633">Bug 177633</a>. [Field Assist] - Remove experimental and deprecated class ComboControlCreator (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177755">Bug 177755</a>. [DataBinding] Please javadoc org.eclipse.core.databinding.observable.ObservableEvent and subclasses (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177787">Bug 177787</a>. Incorrect Javadoc in org.eclipse.jface.preference.PreferenceNode (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177842">Bug 177842</a>. [Min/Max] 'zoom' tests failing in PartsReferencesTestSuite (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177844">Bug 177844</a>. javadoc warning in N200703160010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177905">Bug 177905</a>. [Min/Max] Dragging open Fast View by using its tab makes it go unresponsive (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177942">Bug 177942</a>. [Min/Max] Two 'drag MockEditor...' tests fail under the new presentation (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177953">Bug 177953</a>. [DataBinding] test failure (NEW)<br>
-  </p>
-
-<p>Integration Build (M?rz 13, 2007, 12:25 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162630">Bug 162630</a>. [DataBinding] Issues with IDiff (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172193">Bug 172193</a>. [DataBinding] Binding customization story (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175418">Bug 175418</a>. [DataBinding] TreePath moved to internal package (NEW)<br>
-  </p>
-
-<p>Integration Build (March 12, 2007, 8:22 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=149193">Bug 149193</a>. [Viewers] JFace Table and Tree Viewers need to handle SWT events in an extensible way (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154100">Bug 154100</a>. Platform level proxy settings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154523">Bug 154523</a>. [Viewers] Needless API function in ViewerLabelProvider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=155884">Bug 155884</a>. Remove columnIndices from ViewerLabelProviders (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156109">Bug 156109</a>. [Viewers] Javadocs of ViewerLabel, ViewerLabelProvider, etc. should tell about null values (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157174">Bug 157174</a>. [Viewers] Refactor new Viewer API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161312">Bug 161312</a>. [Presentations] Intro broken with the 3.3 presentation (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166465">Bug 166465</a>. [Undo] NPE in undo code when deleting folder and subfolder (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167619">Bug 167619</a>. [Undo] 'Undo Delete Resources' should not be available after full project deletion (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=170071">Bug 170071</a>. [Undo] Undo deleting *.properties file sets explicit encoding (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171149">Bug 171149</a>. [Contributions] Convert platform actions to the new menus API (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171612">Bug 171612</a>. [Viewers] Breaking API change: DecoratingLabelProvider no longer extends LabelProvider (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172294">Bug 172294</a>. [FieldAssist] [ControlDecoration] API - Decoration does not disappear inside a closed section (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173051">Bug 173051</a>. [Contributions] separator with no name causes startup exception (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173052">Bug 173052</a>. [Contributions] CommandContributionItem does not show keybinding (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173576">Bug 173576</a>. [Contributions] menus toolbar element does not support visibleWhen (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174580">Bug 174580</a>. [Progress] Progress user dialog not resizeable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174844">Bug 174844</a>. [JFace] JFace ToolTip class should support manual activation (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175098">Bug 175098</a>. [Viewers] Should be possible to override TooltipSupport (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175117">Bug 175117</a>. [StatusHandling] Cannot generally plug status support into ErrorDialogs (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175524">Bug 175524</a>. API problems in FilteredItemsSelectionDialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175559">Bug 175559</a>. [StatusHandling] Rename handlingHint to style + extra style value (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175606">Bug 175606</a>. [Decorators] ConcurrentModificationException during DecorationScheduler$3.setUpUpdates (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175892">Bug 175892</a>. [Contributions] need a way to automatically associate visible when clauses to user contributed items (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176182">Bug 176182</a>. [Contributions] Allow the active handler to update the dropdown menu (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176198">Bug 176198</a>. [Field Assist] - API - ControlDecoration should provide mouse events (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176408">Bug 176408</a>. [Min/Max] Minimizing a ViewStack activates all views (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176418">Bug 176418</a>. [WorkbenchLauncher] Can't display progress bar on splash screen (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176441">Bug 176441</a>. [Markers] NPE while refreshing the problem view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176612">Bug 176612</a>. BasicSplashHandler documentation needs clarification (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=176709">Bug 176709</a>. Javadoc warnings in N20070308-0010 (FIXED)<br>
-  </p>
-
-<p>Integration Build (March 05, 2007, 2:44 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153957">Bug 153957</a>. [FastViews] Create Multiple FVB's (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161312">Bug 161312</a>. [Presentations] Intro broken with the 3.3 presentation (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164677">Bug 164677</a>. [EditorMgmt] can we remove IURIEditorInput? (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165172">Bug 165172</a>. [EFS] FileEditorInput should implement IURIEditorInput (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169591">Bug 169591</a>. [Common Navigator] Show In fails for editor inputs (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172841">Bug 172841</a>. [Dialogs] FilteredItemsSelectionDialog should always select first item on update (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173088">Bug 173088</a>. [Dialogs] Remove from type selection history action label could be less generic (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173472">Bug 173472</a>. [StatusHandling] Dynamic tests for status handlers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173927">Bug 173927</a>. [Workbench] Remove the hide/show toolbar entry from the Window menu (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174349">Bug 174349</a>. [open type] Open Type dialog should support '<' and ' ' in combination with camel case (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174818">Bug 174818</a>. [Viewers]TreeViewer.setSelection(ISelection , false) behaves as TreeViewer.setSelection(ISelection , true) (LATER)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175228">Bug 175228</a>. Opening external files with no registered editor fails (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175545">Bug 175545</a>. [Dialogs] Dialog: impossible to turn off double-click resizing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175596">Bug 175596</a>. [StatusHandling] Reference to internal class in StatusManager API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175732">Bug 175732</a>. [Mac] Test launch configs no longer finish (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175952">Bug 175952</a>. [WorkbenchLauncher] Incorrect Service ranking for splash StartupMonitor (FIXED)<br>
-  </p>
-
-<p>Integration Build (February 26, 2007, 8:09 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138655">Bug 138655</a>. [Workbench] Provide API for opening external file (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164677">Bug 164677</a>. [EditorMgmt] can we remove IURIEditorInput? (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171797">Bug 171797</a>. improve FilteredItemsSelectionDialog.ItemsFilter.equalsFilter(ItemsFilter) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171985">Bug 171985</a>. [FieldAssist] Let ControlDecoration  listen on activation events (INVALID)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172517">Bug 172517</a>. [IDE] the application name for the IDE should be consistent with 3.2 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172673">Bug 172673</a>. [StatusHandling] Add StatusAdapter class (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172804">Bug 172804</a>. [EditorMgmt] Convert new tab behaviour into a tweaklet (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172841">Bug 172841</a>. [Dialogs] FilteredItemsSelectionDialog should always select first item on update (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173108">Bug 173108</a>. [Dialogs] small fixes in manual tests for FilteredResourcesSelectionDialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173577">Bug 173577</a>. [Contributions] deactivating actionSet context doesn't make menu disappear (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174272">Bug 174272</a>. FileStoreEditorInput needs to be restorable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174846">Bug 174846</a>. [Menus] Strange entry in log opening Commit Wizard (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174888">Bug 174888</a>. Java 5 references in EvaluationAuthority (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175034">Bug 175034</a>. [FilteredDialog] Filter searching uses too many jobs (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175041">Bug 175041</a>. [ErrorHandling] OutOfMemory error handling is commented out (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175097">Bug 175097</a>. [Viewers] CellLabelProvider#getToolTipImage() not working (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175159">Bug 175159</a>. WorkbenchMenuService issues (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175174">Bug 175174</a>. [ErrorHandling] Back out of ILogDialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175192">Bug 175192</a>. [Viewers] Loop exception on shutdown (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175236">Bug 175236</a>. [StatusHandling] Move StatusDialog and StatusNotificationManager into WorkbenchErrorHandler (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175257">Bug 175257</a>. [StatusHandling] Add properties in StatusAdapter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175261">Bug 175261</a>. [Contributions] NPE in command service (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175314">Bug 175314</a>. Delete commented code in WorkbenchActionBuilder (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175552">Bug 175552</a>. [StatusHandling] Remove returned param from AbstractStatusHandler#handle method (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175559">Bug 175559</a>. [StatusHandling] Rename handlingHint to style + extra style value (FIXED)<br>
-  </p>
-
-<p>Integration Build (February 19, 2007, 7:49 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114569">Bug 114569</a>. [Markers] Use Ctrl+1 as binding for Quick Fix in problems view (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=140306">Bug 140306</a>. [Dialogs] double clicking on help button or disabled button may resize the dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=150379">Bug 150379</a>. [MPE] Warning in MultiPageEditorPart#pageChange(int) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153957">Bug 153957</a>. [FastViews] Create Multiple FVB's (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156790">Bug 156790</a>. [JFace] Adopt GridLayoutFactory within JFace (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162124">Bug 162124</a>. [Dialogs] Double click to resize dialog should be tray-aware (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164677">Bug 164677</a>. [EditorMgmt] can we remove IURIEditorInput? (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171079">Bug 171079</a>. [Contributions] enablement state does not update when an element is selected (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171149">Bug 171149</a>. [Contributions] Convert platform actions to the new menus API (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171437">Bug 171437</a>. [Presentations] Change the selected tab colours to be title based (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171586">Bug 171586</a>. [Progress] Group progress updates too late (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171638">Bug 171638</a>. [Dialogs] Shifted initial text in "Open Resource" dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171797">Bug 171797</a>. improve FilteredItemsSelectionDialog.ItemsFilter.equalsFilter(ItemsFilter) (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171833">Bug 171833</a>. [Workbench] Use BundleEvents to narrow down starting state (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172005">Bug 172005</a>. Open Resource Dialog deadlocks on the UI Thread (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172692">Bug 172692</a>. [About] About dialog text - Add capability to read system properties (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172765">Bug 172765</a>. [DataBinding] Consistency when registering property change listeners (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173881">Bug 173881</a>. [IDE] Error logged about missing ResourceNavigator when opening Resource Perspective (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174169">Bug 174169</a>. [Viewers] OwnerDrawLabel provider should have a default implementation of erase (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174423">Bug 174423</a>. [Progress] org.eclipse.ui.progress.DeferredTreeContentManager adds duplicate items in a tree (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174435">Bug 174435</a>. [WorkbenchLauncher] Illegal Thread access on startup (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=174555">Bug 174555</a>. [DataBinding] Run validation on binding construction (FIXED)<br>
-  </p>
-
-<p>Integration Build (February 12, 2007, 7:54 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153957">Bug 153957</a>. [FastViews] Create Multiple FVB's (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171437">Bug 171437</a>. [Presentations] Change the selected tab colours to be title based (FIXED)<br>
-  </p>
-
-<p>Integration Build (February 08, 2007, 11:44 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173442">Bug 173442</a>. [WorkbenchLauncher] SWTException: Invalid thread access when launching workspace with >1 window (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173445">Bug 173445</a>. [Workbench] Invalid thread access on startup (FIXED)<br>
-  </p>
-
-<p>Integration Build (February 07, 2007, 12:52 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173287">Bug 173287</a>. Restoring visible intro in existing workspace fails in I20070207-0800 (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173292">Bug 173292</a>. [Contributions] menus command has label attribute as mandatory (FIXED)<br>
-  </p>
-
-<p>Integration Build (Februar 07, 2007, 11:23 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173250">Bug 173250</a>. [EditorMgmt] NPE upon save all (FIXED)<br>
-  </p>
-
-<p>Integration Build (February 06, 2007, 4:08 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168011">Bug 168011</a>. [Keybindings] acceleratorConfigurations ext point is deprecated (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171361">Bug 171361</a>. [ErrorHandling] Platform error dialog not correctly parented (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172875">Bug 172875</a>. [WorkbenchLauncher] self-hosting fails with Invalid thread access (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172917">Bug 172917</a>. [ErrorHandling] Possibility of accessing the status manager before workbench starts up (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173006">Bug 173006</a>. PDE compile error on org.eclipse.ui.workbench (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173016">Bug 173016</a>. [WorkbenchLauncher] Invalid thread access when starting 3.3M5 with 312 workspace in NavigationHistory (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173086">Bug 173086</a>. [Trim] Fix the test package's 'TextWidget' to conform to the new story (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=173133">Bug 173133</a>. Portions of the splash API have been rolled back! (FIXED)<br>
-  </p>
-
-<p>Integration Build (Februar 05, 2007, 11:44 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127861">Bug 127861</a>. [DataBinding] Mark API provisional (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162192">Bug 162192</a>. Need a way to remove drop target that was added using IDragAndDropService.addMergedDropTarget(...) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171612">Bug 171612</a>. [Viewers] Breaking API change: DecoratingLabelProvider no longer extends LabelProvider (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171824">Bug 171824</a>. [Viewers] Lots of flickering when using TableColumnAdapter (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172475">Bug 172475</a>. [DataBinding] databinding javadoc warnings in N20070201-0010 (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172808">Bug 172808</a>. [ErrorHandling] Invalid thread access on startup (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172946">Bug 172946</a>. [DataBinding] Create Binding.getTarget() and Binding.getModel() (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172991">Bug 172991</a>. [DataBinding] move tree observables into internal package (FIXED)<br>
-  </p>
-
-<p>Integration Build (February 05, 2007, 8:42 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172673">Bug 172673</a>. [StatusHandling] Add StatusAdapter class (NEW)<br>
-  </p>
-
-<p>Integration Build (Februar 05, 2007, 12:05 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=88359">Bug 88359</a>. [RCP] Application Control of the FastViewBar (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164343">Bug 164343</a>. [DataBinding] Realm needs consistent Exception handling strategy (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165368">Bug 165368</a>. [Viewers] TreePath.getParentPath() should return empty path (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167858">Bug 167858</a>. [Viewers] Make ColumnViewer#getViewerColumn and ViewerColumn#getLabelProvider public again (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168266">Bug 168266</a>. Quick access (Ctrl+E) takes key binding from all RCP apps (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168617">Bug 168617</a>. [WorkbenchLauncher] Painting the splash screen while the application starts (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169893">Bug 169893</a>. [MPE] ClassCastException in NavigationHistory when using MultiPageEditorSite (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169898">Bug 169898</a>. [MPE] ClassCastException in EditorManager when using multi-page editor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=170525">Bug 170525</a>. [Viewers] Edit support constants misspelled (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171800">Bug 171800</a>. [Viewers] AbstractTreeViewer.insert needs to handle empty tree path (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171906">Bug 171906</a>. [DataBinding] API sanity pass (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172019">Bug 172019</a>. [Viewers] Plus sign doesn't disappear when using deferred content providers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172475">Bug 172475</a>. [DataBinding] databinding javadoc warnings in N20070201-0010 (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172746">Bug 172746</a>. [DataBinding] Snippet to validate across bindings (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172810">Bug 172810</a>. [QuickAccess] Don't open QuickAccess dialog fully expanded (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172814">Bug 172814</a>. [Viewers] Rename AbstractViewerEditor to ColumnViewerEditor (FIXED)<br>
-  </p>
-
-<p>Integration Build (January 29, 2007, 4:56 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134740">Bug 134740</a>. [Wizards] PDE product wizard is not obvious to use. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=147515">Bug 147515</a>. [DataBinding] separate run-time type information from IObservable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167131">Bug 167131</a>. [StatusHandling] constants in StatusManager not futureproof (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167647">Bug 167647</a>. [WorkingSets] Adding arbitrary elements to working sets (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168058">Bug 168058</a>. [Commands] re-work patches and tests (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168432">Bug 168432</a>. [Progress] busy spinners are too fast (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168536">Bug 168536</a>. [Dialogs] Tests for FilteredResourcesSelectionDialog and SearchPattern (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169023">Bug 169023</a>. [WorkingSets] "Add to working set" drop down should include a "new working set" option (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169122">Bug 169122</a>. [ErrorHandling] Hooking the facility into Susan's components (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=170118">Bug 170118</a>. [Presentations] Change the border around tabs to a gray and white faded line (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=170119">Bug 170119</a>. [Presentations] Unselected tabs should be rounded in the round tab treatment (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=170331">Bug 170331</a>. [WorkbenchLauncer] provide API for extending the splash in Eclipse (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=170505">Bug 170505</a>. [ErrorHandling] No details when errors occur in parts during initialization (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=170884">Bug 170884</a>. [open type] problem with incomplete results (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171149">Bug 171149</a>. [Contributions] Convert platform actions to the new menus API (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171262">Bug 171262</a>. [Dialogs] uncaught NPE in FilteredResourcesSelectionDialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171403">Bug 171403</a>. [KeyBindings] Update NativeKeyFormatter to consider wpf port. (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171434">Bug 171434</a>. [Presentations] Add icons to the background tabs (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171616">Bug 171616</a>. [DataBinding] Introduce IBeanObservable (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171649">Bug 171649</a>. [Viewers] AbstractTreeViewerisExpandable(elementOrTreePath) is not called when using a ITreePathContentProvider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171733">Bug 171733</a>. Reference to Java 5 methods on SearchPatternAuto (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171746">Bug 171746</a>. [DataBinding] [Workbench] Set default realm in createAndRunWorkbench() (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171906">Bug 171906</a>. [DataBinding] API sanity pass (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=171998">Bug 171998</a>. NPE in file store during ui tests in N20070129-0010 console log (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172005">Bug 172005</a>. Open Resource Dialog deadlocks on the UI Thread (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=172020">Bug 172020</a>. [Trim] NPE on startup for contributed trim (FIXED)<br>
-  </p>
-
-<p>Integration Build (January 08, 2007, 5:04 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=48939">Bug 48939</a>. [WorkingSets] New working set should preselect with UI selection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=57996">Bug 57996</a>. [key binding] DBCS: Content-Assist Key conflicts with toggle-key of Wnn (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=94461">Bug 94461</a>. [About] Indicate whether plug-ins are signed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=140697">Bug 140697</a>. [Viewers] selection not preserved when setting has children (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=155650">Bug 155650</a>. [Preferences] Accessibility: Tab can't access to the "Forward to..." Split button on Preferences window (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166619">Bug 166619</a>. [Trim] TrimLayout.computeSize hardcoded to return 0, 0 (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168341">Bug 168341</a>. [DataBinding] make setting of the default realm safe (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168379">Bug 168379</a>. [EditorMgmt] Investigate possible editor tab management improvements (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168424">Bug 168424</a>. [WorkingSets] roll with elementAdapterClass in IDE (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168536">Bug 168536</a>. [Dialogs] Tests for FilteredResourcesSelectionDialog and SearchPattern (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169226">Bug 169226</a>. [ErrorHandling] Hooking the facility into Decorators, Progress and Handlers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169228">Bug 169228</a>. [ErrorHandling] Hooking the status handling facility into Douglas' components (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169346">Bug 169346</a>. [ErrorHandling] Changes in status handlers' API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169473">Bug 169473</a>. Failures in N20070103-0010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169529">Bug 169529</a>. [Databinding] Bug in WritableList.addAll (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169543">Bug 169543</a>. FilteredItemsSelectionDialog changes required by the JDT team. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169778">Bug 169778</a>. [ErrorHandling] NPE in org.eclipse.ui.internal.ide.StatusUtil [PatchAttached] (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169804">Bug 169804</a>. [DataBinding] Web conference / EclipseCon presentation (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169843">Bug 169843</a>. Leak Tests failing in N20070106-0010 (NEW)<br>
-  </p>
-
-<p>Integration Build (January 01, 2007, 9:41 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=44295">Bug 44295</a>. [WorkbenchParts] Workbench-Shutdown/Startup: Saving/Restoring Cursor Positions in Texteditor-Windows (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118107">Bug 118107</a>. [DynamicUI] [WorkingSets] WorkingSetDescriptor (org.eclipse.ui.internal.registry) caches IConfigurationElement causing intermittent crash (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153957">Bug 153957</a>. [FastViews] Create Multiple FVB's (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164615">Bug 164615</a>. [JFace] ToolTip should respect Display.boundaries (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165375">Bug 165375</a>. [QuickAccess] should not match on categories (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165945">Bug 165945</a>. [rulers] Support in-place CVS annotation ruler in PDE editor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167647">Bug 167647</a>. [WorkingSets] Adding arbitrary elements to working sets (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168218">Bug 168218</a>. [WorkingSets] IWorkingSetUpdaters are not unloaded when declaring bundles are unloaded (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168379">Bug 168379</a>. [EditorMgmt] Investigate possible editor tab management improvements (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168442">Bug 168442</a>. [Quick Access] Quick Access should not close when user tries to select a Node (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168527">Bug 168527</a>. [ErrorHandling] Hooking the facility into Kim's components (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168686">Bug 168686</a>. [WorkingSets] ElementAdapter/Updater loading is keyed on bundle activation rather than availability of the specified class (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168704">Bug 168704</a>. [Viewers] ViewerRow constructor default access - cant subclass (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168709">Bug 168709</a>. [Viewers] Request to open up ViewerColumn#setEditingSupport (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168720">Bug 168720</a>. [Progress] No prompting on errors from jobs (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168806">Bug 168806</a>. [DataBinding] Realm.ensureWorkerThreadIsRunning() doesn't start a new thread (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168901">Bug 168901</a>. [QuickAccess] Quick Access Dialog should include properties (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169275">Bug 169275</a>. [DataBinding] IConverter javadoc references nonexistant methods (FIXED)<br>
-  </p>
-
-<p>Integration Build (Dezember 18, 2006, 11:46 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167607">Bug 167607</a>. [EditorMgmt] Closing compare editor asks to save editor - Saveable should implement IAdaptable (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168379">Bug 168379</a>. [EditorMgmt] Investigate possible editor tab management improvements (NEW)<br>
-  </p>
-
-<p>Integration Build (December 18, 2006, 3:17 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154122">Bug 154122</a>. [EditorMgmt] Enable background saving of editors (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165528">Bug 165528</a>. [QuickAccess] We should only list enabled commands / actions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165530">Bug 165530</a>. [QuickAccess] Add new matching heuristics (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167486">Bug 167486</a>. [Quick Access] Remove Mnemonics from tooltip text in ActionElement.java (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167642">Bug 167642</a>. [QuickAccess] Unexpected behaviour in Cmd-E dialog matching plugin.xml (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167647">Bug 167647</a>. [WorkingSets] Adding arbitrary elements to working sets (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167789">Bug 167789</a>. [DataBinding] Colors not changing in Snippet007ColorLabelProvider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168153">Bug 168153</a>. [DataBinding] Simplify the management of the default Realm (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168379">Bug 168379</a>. [EditorMgmt] Investigate possible editor tab management improvements (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168419">Bug 168419</a>. [WorkingSets] schema needs clarification regarding loading behaviour (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168424">Bug 168424</a>. [WorkingSets] roll with elementAdapterClass in IDE (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168433">Bug 168433</a>. [WorkingSets] ModifyWorkingSetDelegate does too much work on selection change (FIXED)<br>
-  </p>
-
-<p>Integration Build (December 14, 2006, 1:39 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=168057">Bug 168057</a>. Fast view bar shared between perspectives after restart (NEW)<br>
-  </p>
-
-<p>Integration Build (December 13, 2006, 4:08 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=44295">Bug 44295</a>. [WorkbenchParts] Workbench-Shutdown/Startup: Saving/Restoring Cursor Positions in Texteditor-Windows (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167484">Bug 167484</a>. [Workbench] ui plugin versioning issues (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167641">Bug 167641</a>. [ErrorHandling] MessageDialog.showError(...)  not opening a dialog (FIXED)<br>
-  </p>
-
-<p>Integration Build (Dezember 12, 2006, 11:50 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=98536">Bug 98536</a>. [Perspectives] [RCP] [ViewMgmt] How to prevent multiple instances of the same view from being closed/moved (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167085">Bug 167085</a>. [QuickAccess] Quick Access dialog shows null and duplicate entries (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167668">Bug 167668</a>. [Viewers] Changing logical structures using the Show Structure As..  menu breaks view (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167786">Bug 167786</a>. [DataBinding] Disable ThreadRealmTest (NEW)<br>
-  </p>
-
-<p>Integration Build (Dezember 11, 2006, 11:50 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128142">Bug 128142</a>. [DataBinding] IDomainValidator needs to provide partial validation / be merged with IValidator (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=147530">Bug 147530</a>. [DataBinding] Provide event objects for change listeners (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166899">Bug 166899</a>. [CommonNavigator] Unused NLS messages reported with I20061205-1200 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167450">Bug 167450</a>. [DataBinding] Get rid of bind support factory magic (FIXED)<br>
-  </p>
-
-<p>Integration Build (Dezember 11, 2006, 10:38 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167412">Bug 167412</a>. Compiler warnings in 3.3M4 warmup build (FIXED)<br>
-  </p>
-
-<p>Integration Build (December 11, 2006, 8:44 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-  </p>
-
-<p>Integration Build (Dezember 10, 2006, 11:52 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154122">Bug 154122</a>. [EditorMgmt] Enable background saving of editors (FIXED)<br>
-  </p>
-
-<p>Integration Build (December 10, 2006, 8:24 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105041">Bug 105041</a>. [IDE] Double-clicking on a closed project should open it (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117079">Bug 117079</a>. [KeyBindings] registry: BindingPersistance should clean up its preference store listener (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118429">Bug 118429</a>. [DataBinding] Validation should use IStatus, not just Strings (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125327">Bug 125327</a>. [Dialogs] Error message shown in the InputDialog is not fully visible (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139211">Bug 139211</a>. "Open Referenced Projects" dialog pops up even when there are no referenced projects (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154329">Bug 154329</a>. [Viewers] Provide widget independent TableViewer  implementation (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160959">Bug 160959</a>. [EFS] IDE.openEditor fails to open system editors for links referencing non-local IFileStore URIs (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164134">Bug 164134</a>. [DataBinding] 3.2 compilation errors in AbstractObservableTree and ObservableMapLabelProvider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164182">Bug 164182</a>. [StatusHandling] Comments on new StatusManager API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164653">Bug 164653</a>. [DataBinding] Ensure and document thread safety (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164757">Bug 164757</a>. [DataBinding] ComputedValue snippet (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165691">Bug 165691</a>. [Preferences] Need help and description support for settingsTransfers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166346">Bug 166346</a>. [Viewers] ViewerRow#getCell(Point) not working for Viewers without columns (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166635">Bug 166635</a>. [Viewers] DelegatingCellLabelProvider breaks OwnerDrawLabelProvider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166706">Bug 166706</a>. [Databinding] WritableList.clear() does not clear the list (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166789">Bug 166789</a>. [Preferences] Warnings to log when switching workspaces (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166800">Bug 166800</a>. The Status Handling hooking into Eclipse (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167170">Bug 167170</a>. [Markers] Need to check for duplicate filter names (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167183">Bug 167183</a>. [ActivityMgmt] Activities property tester should test on IWorkbench instead of Object (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167204">Bug 167204</a>. [DataBinding] Ensure that getterCalled() is invoked correctly in WritableList (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167231">Bug 167231</a>. Hooking the status handling facility into the log (FIXED)<br>
-  </p>
-
-<p>Integration Build (December 04, 2006, 7:14 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=34528">Bug 34528</a>. [Dialogs] Error text in Move dialog is red, layed out poorly (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130975">Bug 130975</a>. [Common Navigator] Need to set the content service of the CommonViewerSorter (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135731">Bug 135731</a>. [Dialogs] Open resource dialog should honor Window Working sets (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138651">Bug 138651</a>. [Markers] Bookmark, problem and tasks view don't restore column widths (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=155083">Bug 155083</a>. [JFace] Provide an animated  tab item (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158316">Bug 158316</a>. [Dialogs] Open Resource dialog: history items should not look disabled (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161553">Bug 161553</a>. Invalid javadoc in org.eclipse.ui.workbench (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163317">Bug 163317</a>. [Viewers] Take over SWT programming pattern to JFace Viewers (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164361">Bug 164361</a>. [Progress] Task name not shown in user job progress dialog (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164653">Bug 164653</a>. [DataBinding] Ensure and document thread safety (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164679">Bug 164679</a>. [StatusHandling] StatusManager - remove use of 1.4 API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165039">Bug 165039</a>. [Progress] Stack Overflow when clicking links in Progress View (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165135">Bug 165135</a>. [Open Resource] Do not Show derived resources (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165318">Bug 165318</a>. Open Resource dialog flashes on every keystroke (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165530">Bug 165530</a>. [QuickAccess] Add new matching heuristics (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165970">Bug 165970</a>. [navigation] I somtimes need two Navigate->Back to get back to where I was (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166052">Bug 166052</a>. [Viewers] Regression: decorator of DecoratingLabelProvider completely replaces label provider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166107">Bug 166107</a>. [Quick Access] Quick Access should allow matching to an element for more than one string (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166236">Bug 166236</a>. [Viewers] ViewerColumn needs a dispose method (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166289">Bug 166289</a>. [Preferences] When exporting preferences: "Unknown extension tag found: settingsTranfer" (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166368">Bug 166368</a>. [Viewers] LabelProvider disposed twice (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166383">Bug 166383</a>. [Viewers] Provide Tabing from Editor to Editor (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166472">Bug 166472</a>. IDE plugin does not export package org.eclipse.ui.internal.ide.undo (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166478">Bug 166478</a>. [Viewers] Compiler warnings in N20061130-2300 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166500">Bug 166500</a>. [Viewers] AbstractViewerEditor too much optimization (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166502">Bug 166502</a>. [Preferences] Settings transfer is not transferring input state (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166577">Bug 166577</a>. [WorkingSets] Add To working sets actions need to be filtered (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166634">Bug 166634</a>. [Dialogs] refactoring code (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166682">Bug 166682</a>. [WorkingSets] isApplicable needs to be used in the UI (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166684">Bug 166684</a>. [WorkingSets] isApplicable needs optional adaptability (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=166712">Bug 166712</a>. [DataBinding] fix for 164653 broke the suites (NEW)<br>
-  </p>
-
-<p>Integration Build (November 27, 2006, 7:13 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76850">Bug 76850</a>. [Preferences] [WorkingSets] [Import/Export] Save perspective layouts  in preferences (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135731">Bug 135731</a>. [Dialogs] Open resource dialog should honor Window Working sets (REOPENED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137693">Bug 137693</a>. [Progress] Progress Dialog is huge and hides buttons during sync (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153993">Bug 153993</a>. [Viewers] Common Baseclass for Tree/TableEditorImpl (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162005">Bug 162005</a>. [QuickAccess] Persist previous picks (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162006">Bug 162006</a>. [QuickAccess] Make Ctrl-E extensible (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164394">Bug 164394</a>. [Decorators] Too many copies of OverlayIcon (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164878">Bug 164878</a>. [Capabilities] Need a property tester for activities (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164989">Bug 164989</a>. [Viewers] ColumnViewer#getColumnViewerOwner() doesn't respects column count (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165306">Bug 165306</a>. Compiler warnings in JFace (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165375">Bug 165375</a>. [QuickAccess] should not match on categories (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165542">Bug 165542</a>. [Trim] NPE in WidgetProxy.fill (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165650">Bug 165650</a>. [Viewers] Regression: Viewer with DecoratingLabelProvider does not render color (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165690">Bug 165690</a>. [Preferences] Allow transfer of working sets (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165908">Bug 165908</a>. Javadoc warnings in  N20061124-0010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=165911">Bug 165911</a>. [Workbench] workbench needs javadoc warnings set to the same values as JFace (NEW)<br>
-  </p>
-
-<p>Integration Build (November 20, 2006, 4:19 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137934">Bug 137934</a>. [DataBinding] Add support for IColorProvider, IFontProvider, and images for TableViewer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154130">Bug 154130</a>. [KeyBindings] Finish re-work of commands and key bindings (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160303">Bug 160303</a>. [ErrorHandling] New EH facility (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161399">Bug 161399</a>. [Viewers] ColumnViewer#getCell(Point point) can not work (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164350">Bug 164350</a>. [JFace] Listener optimization in ToolTip (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164371">Bug 164371</a>. [Viewers] Collapsed item get's child count re-set to 1 if children already retrieved (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164504">Bug 164504</a>. [Viewers] AssertionFailedException when removing element from tree (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164509">Bug 164509</a>. Breaking API change: ColumnViewer#getItemAt(Point) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164529">Bug 164529</a>. [FieldAssist] Provide the ability to listen to start and end field assist events (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164532">Bug 164532</a>. [FieldAssist] Ctrl+Space triggers two calls to getProposals when only one is needed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164615">Bug 164615</a>. [JFace] ToolTip should respect Display.boundaries (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164621">Bug 164621</a>. [Menus] wrong line endings on source code (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164635">Bug 164635</a>. checkpii errors in N20061115-0010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164639">Bug 164639</a>. [JFace] improve usability of DefaultToolTip (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164678">Bug 164678</a>. [Keys] KeysPreferencePage - remove use of 1.4 API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164681">Bug 164681</a>. [WorkingSets] WorkingSetFilterActionGroup - remove use of 1.4 API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164810">Bug 164810</a>. [EFS] FileStoreEditorInput doesn't work on non-"file:" URIs (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164984">Bug 164984</a>. [JFace] DefaultToolTip shouldn't be abstract (FIXED)<br>
-  </p>
-
-<p>Integration Build (November 13, 2006, 4:19 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=44295">Bug 44295</a>. [WorkbenchParts] Workbench-Shutdown/Startup: Saving/Restoring Cursor Positions in Texteditor-Windows (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=77014">Bug 77014</a>. [Commands] request: Provide close view command and binding (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139324">Bug 139324</a>. [Contributions] plugin XML giving parameters to IExecutableExtension causes spurious runtime warning (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=140049">Bug 140049</a>. [Dialogs] - deprecate ImageAndMessageArea (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=147563">Bug 147563</a>. [DataBinding] Need a standard factory for data binding contexts (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=149648">Bug 149648</a>. [Markers] Error accessing marker type. Marker id 2135563 not found. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156410">Bug 156410</a>. [Workbench] [RCP] SaveAllEditors ArrayIndexOutofBoundsException (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160000">Bug 160000</a>. [DataBinding] Convert scenarios to official APIs (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160303">Bug 160303</a>. [ErrorHandling] New EH facility (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161025">Bug 161025</a>. [WorkbenchParts] SelectionListener possible bug (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161716">Bug 161716</a>. [Perspectives] Premature end of file error when deleting a cloned perspective (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161848">Bug 161848</a>. [JFace] Javadoc quality in org.eclipse.jface (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161906">Bug 161906</a>. [Markers] Default task priority sorting shouldn't be ascending (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161922">Bug 161922</a>. [Metadata] Inaccurate org.eclipse.ui.ide.markerSupport extension point schema with respect to min / max element occurrences (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162724">Bug 162724</a>. [Progress] "Building workspace" job message starts with colon (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162805">Bug 162805</a>. [Undo] [IDE] Navigator Undo happens in UI thread with no progress (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162920">Bug 162920</a>. [Undo] [IDE] - No prompt when deleting read only file via undo/redo (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162964">Bug 162964</a>. [Undo] - Resource undo only works when Navigator is active (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163105">Bug 163105</a>. [Preferences] WizardPreferences export page not using dialog font correctly (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163241">Bug 163241</a>. [Undo] Allow Undo notification to be turned off (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163274">Bug 163274</a>. [JFace] Provide customizable ToolTip at JFace level (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163324">Bug 163324</a>. [Activities] Disabling of activities by plugin_customization.ini setting broken (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163474">Bug 163474</a>. [Undo/Redo] Wrong Tooltips for Undo and Redo actions (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163589">Bug 163589</a>. [Undo] Tooltips for Undo and Redo have shortcuts but should not (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163662">Bug 163662</a>. [Progress] ProgressManagerUtil javadoc  incorrect (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163683">Bug 163683</a>. [FieldAssist] - Javadoc warnings in I20061107-0800 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163809">Bug 163809</a>. [Progress] NullPointer in AnimationManager (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163840">Bug 163840</a>. [Undo/Redo] Asian language Undo and Redo menus have quick key in wrong location when Action is appended (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163956">Bug 163956</a>. [Preferences] "Keep Next/Previous Part Dialog Open" confusing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164001">Bug 164001</a>. Themes schema needs to mention API fonts and colors (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164133">Bug 164133</a>. NPE while filtering tree in Plugin Registry (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164217">Bug 164217</a>. Javadoc warning in N20061111-0010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164247">Bug 164247</a>. [DataBinding] NPE from ObservableMapLabelProvider when value is null (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164268">Bug 164268</a>. [DataBinding] BeansObservables.observeList returns a list without an element type (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164375">Bug 164375</a>. [Undo] - WorkspaceUndoUtil shouldn't reset change count for any context (FIXED)<br>
-  </p>
-
-<p>Integration Build (November 06, 2006, 5:20 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=69254">Bug 69254</a>. [Viewers]  CCombo needs a viewer too (CComboViewer?) (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137879">Bug 137879</a>. Unable to specify resources in zip filesystem (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=140944">Bug 140944</a>. [Themes] PERF: org.eclipse.ui.themes.ColorUtil.process should cache result from getDeclaredFields (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=143535">Bug 143535</a>. [Field Assist] - example needs to vary placement of decorations (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=148357">Bug 148357</a>. [Field Assist] - API - provide access for closing the proposal popup (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=149055">Bug 149055</a>. [FieldAssist] Simplifying auto-completion scenario (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162421">Bug 162421</a>. [FastView] 3.3. presentation: view locked after minimize - show - restore (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162594">Bug 162594</a>. [Field Assist] - API - Allow ControlDecoration to uninstall from a control (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162655">Bug 162655</a>. [Undo] [IDE] - Undoing a delete should check for existence of resources to be restored (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162724">Bug 162724</a>. [Progress] "Building workspace" job message starts with colon (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162964">Bug 162964</a>. Resource undo only works when Navigator is active (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163096">Bug 163096</a>. [Undo] WorkspaceUndoUtil#delete should not attempt to open project (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163245">Bug 163245</a>. [Progress] make the progress viewer virtual (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163360">Bug 163360</a>. [Field Assist] - API - Provide ControlDecoration constructor without specifying decoration (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=163461">Bug 163461</a>. [Field Assist] - API - ControlDecoration should work with image+text, not FieldDecoration (FIXED)<br>
-  </p>
-
-<p>Integration Build (Oktober 31, 2006, 4:59 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162915">Bug 162915</a>. [Undo] Cause of error not reported on undo (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162916">Bug 162916</a>. [Undo] [IDE] Invalid thread access from new file wizard (FIXED)<br>
-  </p>
-
-<p>Integration Build (Oktober 30, 2006, 4:35 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=140944">Bug 140944</a>. [Themes] PERF: org.eclipse.ui.themes.ColorUtil.process should cache result from getDeclaredFields (FIXED)<br>
-  </p>
-
-<p>Integration Build (Oktober 30, 2006, 3:44 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=140944">Bug 140944</a>. [Themes] PERF: org.eclipse.ui.themes.ColorUtil.process should cache result from getDeclaredFields (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156030">Bug 156030</a>. [DataBinding] BindSpec not filled automatically / snippets not working (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161805">Bug 161805</a>. [Viewers] JFace TreeViewer collapses node when sibbling removed (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162668">Bug 162668</a>. [FieldAssist] Javadoc warnings in N20061028-0010 (FIXED)<br>
-  </p>
-
-<p>Integration Build (Oktober 30, 2006, 1:14 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124783">Bug 124783</a>. Major problems on x86_64 (DUPLICATE)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=144703">Bug 144703</a>. [FieldAssist] DecoratedField does not play well with Forms (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=145622">Bug 145622</a>. [FieldAssist] Allow underlying Control to be created manually instead of through IControlCreator (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153957">Bug 153957</a>. [FastViews] Create Multiple FVB's (ASSIGNED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160918">Bug 160918</a>. [KeyBindings] Nullpointer exception in Win > Pref > General > Keys (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161000">Bug 161000</a>. [Metadata] org.eclipse.ui.workbench MANIFEST.MF is polluted (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161303">Bug 161303</a>. [Commands] handlers: StackOverflowError in ActionHandler framework (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161401">Bug 161401</a>. [Viewers] Tweak ColumnViewer-API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161716">Bug 161716</a>. [Perspectives] Premature end of file error when deleting a cloned perspective (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161902">Bug 161902</a>. [JFace] Enhancements to GridLayoutFactory.margins (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162033">Bug 162033</a>. [Viewers] test failure in VirtualLazyTreeViewerTest.testSetInput (WORKSFORME)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162095">Bug 162095</a>. [Workbench] Add default icons to Quick Access (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162425">Bug 162425</a>. Javadoc warnings in N20061026-0010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162443">Bug 162443</a>. [Undo] DeleteResourcesOperation halts Bug99858Test on linux (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162455">Bug 162455</a>. [Themes][Trim] View and Editor Folders theme category doesn't show with 3.3 presentation (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162460">Bug 162460</a>. [Undo] - DeleteResourcesOperation doesn't allow deletion of closed project (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162469">Bug 162469</a>. [Undo] - CopyProjectOperation does not handle closed project (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162497">Bug 162497</a>. [Field Assist] - need a ControlDecoration for table rows (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162546">Bug 162546</a>. [Field Assist] ControlDecoration leaks listeners installed on parents (FIXED)<br>
-  </p>
-
-<p>Integration Build (Oktober 23, 2006, 11:55 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=23172">Bug 23172</a>. [Undo] Undo support in Navigator (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=94977">Bug 94977</a>. [Undo] - review/beef up all test cases (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128233">Bug 128233</a>. need to investigate scalability of FilteredTree (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128386">Bug 128386</a>. CloseUnrelatedProjectsAction as API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156676">Bug 156676</a>. QuickAccess popup should include dirty indicator (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156883">Bug 156883</a>. [Viewers] enhancements to ILazyTreeContentProvider (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157980">Bug 157980</a>. 'AbstractSearchDialog': Confusing name (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160505">Bug 160505</a>. [Viewers]TableLayout available for TreeViewer, ... (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160536">Bug 160536</a>. [Workbench] ArrayIndexOutOfBoundsException during workbench close if no workbench windows exist (DUPLICATE)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161114">Bug 161114</a>. [Presentations] Close all perspectives leaves empty editor area behind (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161254">Bug 161254</a>. [IDE][WorkbenchLauncher] workspace MRU should be shown in the menu (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161433">Bug 161433</a>. Quick access in dialogs broken (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161464">Bug 161464</a>. Workspace.run reports null task name in beginTask (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161482">Bug 161482</a>. [Metadata] Inaccurate extension point schemas with respect to min / max element occurrences (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161616">Bug 161616</a>. [Undo] - AdvancedValidationUserApprover should allow suppression of prompts during testing (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161738">Bug 161738</a>. [Undo] - API - promote ability to quietly compute status to operations API (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161786">Bug 161786</a>. [Undo] - operations with multiple, matching contexts not disposed properly (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161790">Bug 161790</a>. [Undo] - CopyResourcesOperation should invalidate if source resources are gone (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161799">Bug 161799</a>. [Undo] - consider more aggressively merging CopyFilesAndFoldersOperation into the undoable operation (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161828">Bug 161828</a>. [Undo] - second undo on folder move/copy merge restores old snapshot (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161894">Bug 161894</a>. [Undo] Warning in N20061022-0010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161897">Bug 161897</a>. [Undo] Javadoc warnings in N20061022-0010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161983">Bug 161983</a>. Add functionality to Quick Access to remember selection for entered text value (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=162033">Bug 162033</a>. [Viewers] test failure in VirtualLazyTreeViewerTest.testSetInput (NEW)<br>
-  </p>
-
-<p>Integration Build (Oktober 17, 2006, 3:57 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161263">Bug 161263</a>. Broken fast view bars (NEW)<br>
-  </p>
-
-<p>Integration Build (Oktober 16, 2006, 11:44 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=87494">Bug 87494</a>. [Undo] Define a consistent, efficient validation strategy for undoable workspace operations (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=93611">Bug 93611</a>. [Viewers] Please refactor TableLayout to behave like standard layout (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111887">Bug 111887</a>. [EFS] Provide IFileStoreEditorInput (+ impl) for new IFileStore (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128386">Bug 128386</a>. CloseUnrelatedProjectsAction as API (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156678">Bug 156678</a>. QuickAccess items are unordered (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157495">Bug 157495</a>. [Viewers] public subclasses of ViewerSorter should be changed to ViewerComparator (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157646">Bug 157646</a>. [Import/Export] "Import Existing Project" from zip locks file - prevents deletion (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157980">Bug 157980</a>. 'AbstractSearchDialog': Confusing name (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158521">Bug 158521</a>. [FieldAssist] FieldDecorationRegistry does not obey the contracts for getMaximumDecorationWidth() and getMaximumDecorationHeight() (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158778">Bug 158778</a>. [Viewers] request for remove(parent, index) API on tree viewer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158960">Bug 158960</a>. [PerspectiveBar] Get rid of "Close All Perspectives" in contextual menu (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159190">Bug 159190</a>. [Viewers] multiple dispose listeners for elements in VIRTUAL tree viewer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159597">Bug 159597</a>. [Viewers] getRowPart(Point) behaves differently on Table than on Tree (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159600">Bug 159600</a>. [Viewers] Tooltips not working on TreeViewer (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159918">Bug 159918</a>. [Viewers] TreeViewer.setChildCount(...) should preserve selection (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160128">Bug 160128</a>. Chkpii error in latest build (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160153">Bug 160153</a>. [Viewers] tableViewer.setUseHashlookup causes wrong selections (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160231">Bug 160231</a>. [Undo] Operations_undoRedoCommand needs to be translated correctly. (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160505">Bug 160505</a>. [Viewers]TableLayout available for TreeViewer, ... (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160543">Bug 160543</a>. [FastViews] View Menu button needs accessible name (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160545">Bug 160545</a>. IResourceNavigator javadoc errors in build N200610110010 (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160659">Bug 160659</a>. CCE in ResourceNavigator (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160700">Bug 160700</a>. [Viewers] Editing backwards compatility (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160720">Bug 160720</a>. [Undo] - need tracing options to monitor workspace undo history validation (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=160746">Bug 160746</a>. [Workbench] Dangerous use of getActiveShell in the workbench (FIXED)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161037">Bug 161037</a>. Compile warnings in N20061014-0010/compilelogs/platform.doc.isv.javadoc.txt (NEW)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161086">Bug 161086</a>. [Viewers] performance problem in AbstractTreeViewer.internalExpandToLevel (FIXED)<br>
-  </p>
-
-<p>Integration Build (Oktober 09, 2006, 11:20 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=16179">Bug 16179</a>. [Wizards] Wizard API: confusion over notifying of pages being entered, left<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=23172">Bug 23172</a>. [Undo] Undo support in Navigator<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=99054">Bug 99054</a>. [Doc] [Preferences] Nitpicking "org.eclipse.ui.preferenceTransfer" extension point<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=140644">Bug 140644</a>. [DataBinding] Binding to ValidationError of DataBindingContext is broken<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158065">Bug 158065</a>. [DataBinding] ValidationError observables need a nudge to hook themselves up<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158658">Bug 158658</a>. Eclipse 3.3 presentation: Minimize too slow on Windows<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159009">Bug 159009</a>. Errors opening resource<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159305">Bug 159305</a>. [Undo] - operation approval runs twice on non-linear undo<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159425">Bug 159425</a>. Fix for javadoc warnings in latest nightly builds<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159486">Bug 159486</a>. [Preferences] Preferences Transfer schema incomplete<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159538">Bug 159538</a>. [Trim] 6 test failures in the test suite with examples loaded<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159550">Bug 159550</a>. [Viewers] Deprecate TableTreeViewer<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159890">Bug 159890</a>. [Markers] Bug75909Test failing in N20061005 build<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159930">Bug 159930</a>. [Dialogs] Remove the ControlAnimator from the Preferences and TitleArea dialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159940">Bug 159940</a>. [DataBinding] DataBindingContext shouldn't expose the bindings list as a mutable list<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159998">Bug 159998</a>. NPE in TableViewerTests<br>
-  </p>
-
-<p>Integration Build (Oktober 04, 2006, 9:48 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153630">Bug 153630</a>. [DataBinding] Extract SWT specific code from JFace databinding into its own bundle<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159539">Bug 159539</a>. [DataBinding] Create a static initializer to create DBC with support for java primitives<br>
-  </p>
-
-<p>Integration Build (October 02, 2006, 9:43 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=11624">Bug 11624</a>. [DnD] [navigation] text drag and drop<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67133">Bug 67133</a>. [WorkingSets] Navigator VS Package Explorer: working set menu items are inconsistent<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=94667">Bug 94667</a>. [KeyBindings] preference page: Export writes bad CSV file<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109528">Bug 109528</a>. [RCP] [Workbench] Eclipse automatically attempts to save modified files when OutOfMemoryException occurs<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123375">Bug 123375</a>. [DataBinding] Enhancements to the data binding framework<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126839">Bug 126839</a>. [DataBinding] IObservable refactoring<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127861">Bug 127861</a>. [DataBinding] Mark API provisional<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133224">Bug 133224</a>. [DataBinding] Fix ITreeProvider and UpdatableTreeContentProvider<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134856">Bug 134856</a>. [DataBinding] ValueDiff overrides Object.equals(Object) but not Object.hashCode()<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137435">Bug 137435</a>. [DataBinding] IdentityWrapper violates requirements for equals<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=141435">Bug 141435</a>. [Viewers] ListViewer without a selection loses scrolled state when refreshed<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=152540">Bug 152540</a>. [DataBinding] Provide a way to create an unmodifiable decorator for an IObservableList<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=152543">Bug 152543</a>. [DataBinding] ValueBinding NPE when update target from model is false<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=155147">Bug 155147</a>. [PropertiesDialog] Property Page enabledWhen not documented<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156672">Bug 156672</a>. QuickAccess command should appear in menu Window > Navigation<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156674">Bug 156674</a>. QuickAccess popup: remembering size and position does not work<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157978">Bug 157978</a>. 5 errors on I20060920-0010<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158016">Bug 158016</a>. [Perspectives] GDI leak: Each time you create a perspective switcher an image is leaked<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158118">Bug 158118</a>. Change ViewerSorter.getComparator?<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158279">Bug 158279</a>. FilteredTree must not create the widgets in the constructor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158569">Bug 158569</a>. [FastViews] Fast view opened with button disappears on focus loss<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158687">Bug 158687</a>. [Databinding] WritableValue throws ValueChange events when a change has not occurred<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158791">Bug 158791</a>. [EditorMgmt] NPE in NavigationHistoryAction.update<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158876">Bug 158876</a>. [OpenModes] Synchronizer execs OpenStrategy Runnable mulitple times for one selection<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158959">Bug 158959</a>. [Viewers] testRefreshBug141435 and testNoSelectionRefresh failing on  N20060927-0010<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158973">Bug 158973</a>. [Markers] All labels in tasks and breakpoints views are  bold<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159159">Bug 159159</a>. [Undo] - redundant/awkward warning message when rename causes overwrite<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159205">Bug 159205</a>. [DataBinding] ClassCastException in StructuredContentProviderTest<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=159254">Bug 159254</a>. [WorkingSets] commands named 'XAdd to Working Set' and 'XRemove from Working Set'<br>
-  </p>
-
-<p>Integration Build (September 25, 2006, 11:05 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=80116">Bug 80116</a>. [DynamicUI] AbstractWorkingSetManager tries to get namespace for bundles with no symbolic name<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=90170">Bug 90170</a>. [Dialogs] CamelCase search on OpenResource/OpenType<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104714">Bug 104714</a>. [ActivityMgmt] Preferences/Capabilities not sorted alphabetically.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129986">Bug 129986</a>. FilteredTree - needs JUnit tests<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=150593">Bug 150593</a>. Enhancements for ResourceManager<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154431">Bug 154431</a>. [EditorMgmt] Back Navigation broken for last closed editor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=155788">Bug 155788</a>. [JFace] Deprecate org.eclipse.jface.util.Assert and adopt org.eclipse.core.runtime.Assert<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156775">Bug 156775</a>. Allow fonts to benefit from ResourceManager<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156982">Bug 156982</a>. [JFace] GridLayoutFactory lacks method to set margins individually<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157174">Bug 157174</a>. [Viewers] Refactor new Viewer API<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157793">Bug 157793</a>. [PropertiesDialog] 'Resource' and 'Project References' property page fail if modifying closed project<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157805">Bug 157805</a>. [Workbench] Add Hide Toolbars to the Window menu<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157842">Bug 157842</a>. [Examples] Alt-F malfunction when Examples plugin installed<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157867">Bug 157867</a>. ScopedPreferenceStore stops firing events after removing the last listener<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157981">Bug 157981</a>. Open resource dialog: Missing colons in labels<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157985">Bug 157985</a>. [Workbench] Add 'Hide toolbar' action to context menu<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158020">Bug 158020</a>. Lazy initialize ViewerComparator.comparator<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158125">Bug 158125</a>. ArithmeticException in GridInfo<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158127">Bug 158127</a>. org.eclipse.ui.menus extension point docs specify toolbars incorrectly<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158130">Bug 158130</a>. LegacyActionPersistence causing test failures on Linux with 1.5 VM<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158204">Bug 158204</a>. [Decorators] DecorationScheduler hangs on to listeners for too long<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158279">Bug 158279</a>. FilteredTree must not create the widgets in the constructor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=158606">Bug 158606</a>. make BaseLabelProvider public<br>
-  </p>
-
-<p>Integration Build (September 20, 2006, 10:17 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157633">Bug 157633</a>. WorkbenchOperationStressTests takes a long time<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157799">Bug 157799</a>. [WorkingSets] Add to working can cause stack overflow<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157883">Bug 157883</a>. Very long parameters in selection drop-down for new wizards<br>
-  </p>
-
-<p>Integration Build (September 18, 2006, 11:36 a.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=53178">Bug 53178</a>. [Dialogs] Open Type and Open Resource enhancements<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157044">Bug 157044</a>. [Wizards] Wizard content area disabled after going back<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157566">Bug 157566</a>. [Viewers] Application doesn't shutdown because background thread is running<br>
-  </p>
-
-<p>Integration Build (September 17, 2006, 5:48 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36918">Bug 36918</a>. [Working Sets] Add to / Remove from Working Set... Context Menu in Navigator and Package Explorer<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124338">Bug 124338</a>. [Dialogs] ResourceSelectionDialog should allow to implement custom acceptance criteria<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=151205">Bug 151205</a>. [Viewers] Add setFilters() to change multiple filters at once efficiently<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153957">Bug 153957</a>. [FastViews] Create Multiple FVB's<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154210">Bug 154210</a>. Build warnings in navigator tests<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154794">Bug 154794</a>. [Wizards] Wizard controls not disabled after 'Next'<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154884">Bug 154884</a>. [ICU] Platform should adopt using ICU Collator using new APIs<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=155788">Bug 155788</a>. [JFace] Deprecate org.eclipse.jface.util.Assert and adopt org.eclipse.core.runtime.Assert<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156109">Bug 156109</a>. [Viewers] Javadocs of ViewerLabel, ViewerLabelProvider, etc. should tell about null values<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156537">Bug 156537</a>. [Viewers] Virtual tree viewer does not populate with initial children<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156544">Bug 156544</a>. [Viewers] Vitrual lazy tree viewer - refreshing a node does not make it expandable<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156581">Bug 156581</a>. [Workbench] Inconsistent adapter usage in the workbench<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156747">Bug 156747</a>. Adopt Resource.getDevice() in the JFace resource managers<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156864">Bug 156864</a>. [Undo] Edit > Add Bookmark... does not work<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156865">Bug 156865</a>. Undo / Redo marker actions not updated<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=156982">Bug 156982</a>. [JFace] GridLayoutFactory lacks method to set margins individually<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157020">Bug 157020</a>. Update code templates for 3.3<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157044">Bug 157044</a>. [Wizards] Wizard content area disabled after going back<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157072">Bug 157072</a>. [ActionSets][Contributions] QuickMenuAction funtionality should be made public<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157080">Bug 157080</a>. releng warnings in the carbon plug-in<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157100">Bug 157100</a>. [CommonNavigator] Fix warnings from navigator tests plugin<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157158">Bug 157158</a>. CCE In ModifyWorkingSetDelegate<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=157309">Bug 157309</a>. [Viewers] ListViewer should provide insert-method<br>
-  </p>
-
-<p>Integration Build (August 28, 2006, 4:36 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=7691">Bug 7691</a>. [Undo] Add undo support on deletion of task list items<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=66375">Bug 66375</a>. [Dialogs] TaskPropertiesDialog and DialogMarkerProperties need a common superclass<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=142836">Bug 142836</a>. No F1 help for problems view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=152052">Bug 152052</a>. [CommonNavigator, Saveables] Common Navigator's saveables framework does not work in Java projects<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153463">Bug 153463</a>. [Wizards] Referenced Projects box in New Project wizard uses wrong sort<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154104">Bug 154104</a>. [Workbench] Search based navigation<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154410">Bug 154410</a>. [Cell Editors] - Cell Editor action handler doesn't handle dynamic undo text<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154445">Bug 154445</a>. [Wizards] Incomplete javadoc for WizardNewProjectCreationClass.getProjectHandle<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=154755">Bug 154755</a>. [Viewers] Bugs in VIRTUAL support in TableViewer<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=155083">Bug 155083</a>. [JFace] Provide an animated  tab item<br>
-  </p>
-
-<p>Integration Build (August 14, 2006, 4:34 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=68178">Bug 68178</a>. [ActivityMgmt] Capabilities Preference Page Resizing<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=73729">Bug 73729</a>. [Workbench] [Mac] Dual preferences menu items<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135709">Bug 135709</a>. [WorkingSets] Select Working Sets Select All/Deselect All Enablement<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138006">Bug 138006</a>. [Themes] Theme description read incorrectly<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=150597">Bug 150597</a>. Patch that adds enhancements to GridDataFactory<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=151511">Bug 151511</a>. [KeyBindings] Editor scoped actions sometimes execute against wrong editor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=151838">Bug 151838</a>. [Markers] ArrayIndexOutOfBoundsException while queuing viewer updates<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=152785">Bug 152785</a>. Improve javadocs for org.eclipse.ui.IStartup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=152927">Bug 152927</a>. [Decorators] ArrayOutOfBoundsException in DecorationBuilder.java<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=152966">Bug 152966</a>. [EditorMgmt] MockMapping is missing an equals method<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153071">Bug 153071</a>. Errors when showing properties for non-existing location of linked folder<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153103">Bug 153103</a>. [Wizards] NPE while validating project location<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153201">Bug 153201</a>. Not externalizing string "false" in the Properties panel for a stored procedure<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153536">Bug 153536</a>. [Wizards] Description in wizard does not wrap<br>
-  </p>
-
-<p>Integration Build (August 14, 2006, 3:58 p.m.)</p>
-  <p>Problem reports updated</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=68178">Bug 68178</a>. [ActivityMgmt] Capabilities Preference Page Resizing<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=73729">Bug 73729</a>. [Workbench] [Mac] Dual preferences menu items<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135709">Bug 135709</a>. [WorkingSets] Select Working Sets Select All/Deselect All Enablement<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138006">Bug 138006</a>. [Themes] Theme description read incorrectly<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=150597">Bug 150597</a>. Patch that adds enhancements to GridDataFactory<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=151511">Bug 151511</a>. [KeyBindings] Editor scoped actions sometimes execute against wrong editor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=151838">Bug 151838</a>. [Markers] ArrayIndexOutOfBoundsException while queuing viewer updates<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=152785">Bug 152785</a>. Improve javadocs for org.eclipse.ui.IStartup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=152927">Bug 152927</a>. [Decorators] ArrayOutOfBoundsException in DecorationBuilder.java<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=152966">Bug 152966</a>. [EditorMgmt] MockMapping is missing an equals method<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153071">Bug 153071</a>. Errors when showing properties for non-existing location of linked folder<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153103">Bug 153103</a>. [Wizards] NPE while validating project location<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153201">Bug 153201</a>. Not externalizing string "false" in the Properties panel for a stored procedure<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153536">Bug 153536</a>. [Wizards] Description in wizard does not wrap<br>
-  </p>
-
-<p>Integration Build (July 17, 2006, 4:11 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119779">Bug 119779</a>. TVT3.1.x:TCT238: Text not aligned vertically<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=140306">Bug 140306</a>. [Dialogs] double clicking on help button may resize the dialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=144726">Bug 144726</a>. [Field Assist] - API - provide a ComboControlCreator<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=148137">Bug 148137</a>. errors in Platform user and isv doc<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=149240">Bug 149240</a>. [Workbench] Search-based navigation<br>
-  </p>
-
-<p>Integration Build (June 2, 2006, 12:10 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=144207">Bug 144207</a>.  next / prev not working anymore in search view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=144225">Bug 144225</a>. [FieldAssist] NullPointerException in ContentProposalAdapter$ContentProposalPopup.open()<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=143950">Bug 143950</a>. Broken API Reference Links<br>
-  </p>
-
-<p>Integration Build (May 26, 2006, 12:10 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=142498">Bug 142498</a>.  [WorkingSets] TVT3.2:TCT539: DA: Working Window Set in English<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=92564">Bug 92564</a>. [Viewers] (doc only) incorrect use of html in javadoc of BackgroundContentProvider<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=95659">Bug 95659</a>. [Workbench] Workbench#isRunning returns true when the event loop is not yet running<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139814">Bug 139814</a>.  Exceptions after closing window with the Data Source Explorer view open<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=142744">Bug 142744</a>. [FieldAssist] NPE in DecoratedField.updateControlAttachments(...)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=143446">Bug 143446</a>. Update org.eclipse.ui.menus exsd doc<br>
-  </p>
-
-
-<p>Integration Build (May 19, 2006, 12:10 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136724">Bug 136724</a>. [CommonNavigator] Compile error decorations remain until the element is selected<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137091">Bug 137091</a>. [KeyBindings] Toggle Mark Occurrences shortcut is broken<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=141594">Bug 141594</a>. markerSupport is missing it's since 3.2 tag<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=141612">Bug 141612</a>. IWorkbenchWidget has incorrect copyright info<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=141637">Bug 141637</a>. [Mac] EE in manifest of carbon UI fragment needs to be set<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=142264">Bug 142264</a>. [Workbench] After closing all perspectives, Project Explorer will never show content<br>
-  </p>
-
-
-
-<p>Integration Build (May 5, 2006, 12:00)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135535">Bug 135535</a>. [KeyBindings] Key bindings lost in the Java editor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138455">Bug 138455</a>. [Viewers] ArrayIndexOutOfBounds in TreeSelection<br>
-  </p>
-
-<p>Integration Build (May 4, 2006, 16:00)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=140057">Bug 140057</a>. [CommonNavigator] (NeedsApproval) Please harden against IllegalAccessError<br>
-  </p>
-
-<p>Integration Build (May 4, 2006, 12:00 noon)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125708">Bug 125708</a>. [Viewers] subtle change with AbstractTreeViewer#getSelection() and #setSelection(..)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130979">Bug 130979</a>. [Common Navigator] (NeedsApproval) Provide access to INavigatorContentExtension by id<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137079">Bug 137079</a>. [CommonNavigator] (NeedsApproval) Add group id and associatedExtensionId to commonWizard<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139894">Bug 139894</a>. [Dialogs] Hovering over icon of a wizard status message produces strange flickering effect<br>
-  </p>
-
-<p>Integration Build (May 4, 2006, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=99149">Bug 99149</a>. [Examples] example project installs ugly icons on toolbar<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133749">Bug 133749</a>. [Contributions] Create WatchExpression action show up twice in Variables View<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136849">Bug 136849</a>. [CommonNavigator] NPE is thrown and navigator dies<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138149">Bug 138149</a>. [CommonNavigator] (NeedsApproval) Problem with selection causes view to fail to load<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138759">Bug 138759</a>. [Dialogs] Compile errors against foundation 1.0: org.eclipse.jface<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138823">Bug 138823</a>. [MPE] Changes to MultiPageEditorPart causing endless loop<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139067">Bug 139067</a>. [IDE] Compile errors against Foundation 1.0: org.eclipse.ui.workbench<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139176">Bug 139176</a>. Javadoc problems in ExternalActionManager<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139385">Bug 139385</a>. [Viewers] Viewer#setComparator(ViewerComparator) has no effect<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139483">Bug 139483</a>. IDEIdleHelper should be a system job<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139494">Bug 139494</a>. [JFace] Update manifest to compile against Foundation 1.0: org.eclipse.jface<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139511">Bug 139511</a>. [CommonNavigator] (NeedsApproval) getParent() fails in certain cases<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139700">Bug 139700</a>. Long delay on package explorer selection changes in large workspace<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139704">Bug 139704</a>. Opening the Run.. dialog edits Launch configurations (could tell user)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139792">Bug 139792</a>. Update manifest to compile against Foundation 1.0: org.eclipse.core.commands<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=139922">Bug 139922</a>. [Markers] markerSupportRegistry not reading categories<br>
-  </p>
-
-<p>Integration Build (April 27, 2006, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=1305">Bug 1305</a>. Invalid Bug ID<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=34527">Bug 34527</a>. [Dialogs] &quot;Select Perspective&quot; dialog does not match invoking action<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=42056">Bug 42056</a>. [Dialogs] New Path Variable Dialog; lable alignment<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=55817">Bug 55817</a>. [Progress] Progress Information dialog appears on start bar, and shows up on wrong monitor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=060417">Bug 060417</a>. Configured activities not persisted<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=66292">Bug 66292</a>. [Dialogs] InputDialog NPE when invoking setErrorMessage(...) too early<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=82064">Bug 82064</a>. [Dialogs] TitleAreaDialog#setTitleImage cannot be called before open()<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=90273">Bug 90273</a>. [Dialogs] ListSelectionDialog dialog alignment<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=95950">Bug 95950</a>. [KeyBindings] interactions: ALT/COMMAND+ARROW keybindings should be swapped on Mac<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=97565">Bug 97565</a>. [KeyBindings] preference page: AIOOBE trying to change key bindings<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=100993">Bug 100993</a>. [EditorMgmt][Presentations] Regression: Editor tabs do not remember order or active tab after restarting Eclipse<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107107">Bug 107107</a>. Location.setURL does not provide sufficient information when failing to set the workspace location<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109361">Bug 109361</a>. [Markers] Multiselection in problems view yields invalid status message<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110169">Bug 110169</a>. [Navigator] ResourceNavigator.initWorkingSetFilter should be protected visibility.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111424">Bug 111424</a>. [Markers] Missing markerImageProvider extension for bookmark marker<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113370">Bug 113370</a>. [Dialogs] The window title SafeRunnable displays is always English in non-English language<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125753">Bug 125753</a>. [CommonNavigator] Nav doesn't synchronize with file sys on delete<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125948">Bug 125948</a>. [TabbedProperties] Types should specify subclassing/implementing contract<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127029">Bug 127029</a>. [JFace] [DND] LocalSelectionTransfer should be supported on the JFace layer.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127173">Bug 127173</a>. New API elements missing &#64;since<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127550">Bug 127550</a>. [Progress] Little text centred in a big view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128455">Bug 128455</a>. [Presentation] [ViewBar] Outline view toolbar is visible above a maximized editor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129599">Bug 129599</a>. Mark the org.eclipse.ui.menus extension point as experimental<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129841">Bug 129841</a>. [DynamicUI] Calling reg.removeExtension, then reg.addContribution not showing actionSet in UI<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130297">Bug 130297</a>. [Progress] dozens of &quot;Scheduled refresh postponed due to conflicting operations&quot; in Progress view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130315">Bug 130315</a>. [JFace] ImageRegistry.put(String, Image) cannot accept null Image<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130340">Bug 130340</a>. [Decorators] lightweight decorator blinking problem<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131105">Bug 131105</a>. [EFS] CopyFilesAndFoldersOperation does not handle null locations<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131344">Bug 131344</a>. [project explorer] Nav not refreshing after adding xdoclet bean to existing project<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132161">Bug 132161</a>. [KeyBindings] &quot;Open Workspace&quot; command should be &quot;Switch Workspace...&quot;<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132550">Bug 132550</a>. [FastViews] BIDI:Fast Views become hidden when selected<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132821">Bug 132821</a>. [Dialogs] Stored Dialog location and size invalid after changing font<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133044">Bug 133044</a>. [JFace] - should we show error status when required fields are empty if they have required field emphasis<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133416">Bug 133416</a>. Open with references should only prompt if necessary<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133541">Bug 133541</a>. [Import/Export] 'testImportArchiveMultiProject is failing<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133794">Bug 133794</a>. [KeyBindings] default keybinding for Window &gt; Show View &gt; Other...<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135535">Bug 135535</a>. [KeyBindings] Key bindings lost in the Java editor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135787">Bug 135787</a>. need to adopt ICU4J APIs<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135956">Bug 135956</a>. [Trim] no perspective switcher on resize<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136130">Bug 136130</a>. [TabbedProperties] Incorrect package names in org.eclipse.ui.views.properties.tabbed<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136292">Bug 136292</a>. [Markers] problems view: NPE after delete<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136475">Bug 136475</a>. [Trim] Graphic is disposed error on shutdown<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136696">Bug 136696</a>. CHKPII error in org.eclipse.ui<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136763">Bug 136763</a>. Performance improvements to BindingManager<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136830">Bug 136830</a>. Close Unrelated Projects closes needed projects<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136855">Bug 136855</a>. [IDE] Deadlock caused by IDEIdleHelper and HeapStatus calls to runFinalization from UI thread<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136870">Bug 136870</a>. Progress bar in progress dialog too long<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136921">Bug 136921</a>. [IDE] New File dialog locks for 20 seconds<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136981">Bug 136981</a>. [Trim] Failing trim gives multiple error dialogs<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137097">Bug 137097</a>. [Trim] provide a vertically oriented progress bar<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137148">Bug 137148</a>. [Markers] Contributions to IMarker no longer show up on elements in the Problems View<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137199">Bug 137199</a>. Generate Identifiers Test has very unstable Elapsed process<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137227">Bug 137227</a>. [Trim] occasionally last moved trim is moved instead of current<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137228">Bug 137228</a>. [Trim] right click to start a trim drag will position the cursor on the top right of the screen<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137310">Bug 137310</a>. [CommonNavigator] NewActionProvider should use a different name than the group.new marker<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137315">Bug 137315</a>. [Dialogs] Doubleclickable area to restore dialog size is often very small<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137330">Bug 137330</a>. [Commands] remove experimental keys preference page for 3.2<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137334">Bug 137334</a>. [PerspectiveBar] Order of perspective bar items not maintained across sessions when coolbar not shown<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137341">Bug 137341</a>. [WorkbenchParts] WorkbenchPage.closeEditors calls IWorkbenchPart.getSaveables after disposing the part<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137356">Bug 137356</a>. [Markers] marker grouping not working as expected via markerSupport<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137375">Bug 137375</a>. [Trim] too many resize calls<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137384">Bug 137384</a>. [Presentations] ClassCastException in org.eclipse.ui.internal.PartStack line 1305<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137410">Bug 137410</a>. [Presentations] ViewPane does not ask the ActionBarPresentation to create the toolbar control<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137477">Bug 137477</a>. Error in the documentation for org.eclipse.ui.navigator.viewer<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137527">Bug 137527</a>. [PresentationAPI] (regression) Implementors of StackPresentation now must implement save/restore state methods<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137640">Bug 137640</a>. [CommonNavigator] New java elements not selected in project explorer<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137693">Bug 137693</a>. [Progress] Progress Dialog is huge and hides buttons during sync<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137767">Bug 137767</a>. [Progress] UISynchronizer must clear Interrupt Status of the UI thread<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137784">Bug 137784</a>. [Progress] progress colors not alternating correctly<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137849">Bug 137849</a>. Unable to set comparator in StructuredViewer<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137913">Bug 137913</a>. [key binding][content assist] Chinese content assist key bindings broken when moved down to org.eclipse.ui<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137938">Bug 137938</a>. [Progress] Actions lost on refresh of finished jobs<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=137977">Bug 137977</a>. Missing view toolbars<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138253">Bug 138253</a>. [Trim] Extra space added by the Trim 'group' layout<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138378">Bug 138378</a>. [Trim] can't drag a trim bar at all<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138400">Bug 138400</a>. [Workbench] Problem deleting a perspective descriptor created from restore state<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=138645">Bug 138645</a>. QuickFix dialog has no wizard graphic or menu icon<br>
-  </p>
-
-<p>Integration Build (April 13, 2006, 12:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136316">Bug 136316</a>. Animated messages do not work before workbench runs (WorkbenchControlAnimator not running)<br>
-  </p>
-
-
-<p>Integration Build (April 12, 2006, 8:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=2101">Bug 2101</a>. [Markers] Need indication of sort order in marker views (1GE6P7W)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=58840">Bug 58840</a>. [Markers] task list sort order not persisted across sessions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124655">Bug 124655</a>. [Markers] can't easily sort Problems view by severity<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136450">Bug 136450</a>. [Progress] Widget disposed at end of update<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136489">Bug 136489</a>. [EditorMgmt] Prompt for saving when closing parts, but Saveable is still held onto by other part<br>
-  </p>
-
-
-<p>Integration Build (April 12, 2006, 4:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=90517">Bug 90517</a>. Define a command for Editor &quot;Close Others&quot; option<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116924">Bug 116924</a>. [LinkedResources] Links can now be at arbitrary depth<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134328">Bug 134328</a>. [Wizards] Two error messages interact in two different wizards<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134509">Bug 134509</a>. [Intro] Need ability to override &quot;Welcome&quot; string<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134648">Bug 134648</a>. [Intro] IDEWorkbenchWindowAdvisor should not call Bundle#start<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135058">Bug 135058</a>. new error message popup in wizards is too &quot;distracting&quot;<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135535">Bug 135535</a>. [KeyBindings] Key bindings lost in the Java editor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136373">Bug 136373</a>. [EFS] Can't browse for files when creating linked resources<br>
-  </p>
-
-<p>Integration Build (April 12, 2006, 12:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=90517">Bug 90517</a>. Define a command for Editor &quot;Close Others&quot; option<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112215">Bug 112215</a>. [CommonNavigator] Allow extensions to participate in the save lifecycle<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130440">Bug 130440</a>. org.eclipse.ui.workbench does not ship a .options file<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131139">Bug 131139</a>. Animated errors in wizards are disturbing and incomplete<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132798">Bug 132798</a>. [Field Assist] - Pressing Backspace at offset 0 should not reload field assist popup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133536">Bug 133536</a>. [Field Assist] - PageUp and PageDown in ContentAssistFields change combo contents<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133599">Bug 133599</a>. [FieldAssist] Left and right arrow keys should work with open proposals list<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133615">Bug 133615</a>. [FieldAssist] ContentAssistField: proposal popup and additional info should have different bg color<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133620">Bug 133620</a>. [FieldAssist] auto activation of proposal popup should be canceled on keystroke<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133689">Bug 133689</a>. Part of the third line of text shows up in sliding message area<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135147">Bug 135147</a>. ComboBox viewer population tests failing on windows<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136178">Bug 136178</a>. [Markers] Quick filter selection is not updating the view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136199">Bug 136199</a>. Close Others should be disabled when only one editor open<br>
-  </p>
-
-
-<p>Integration Build (April 12, 2006, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=26823">Bug 26823</a>. [Markers] cannot reorder columns in task list<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=43523">Bug 43523</a>. [MPE] getAdapter(IEditorStatusLine.class) not working for MultipageEditor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=43581">Bug 43581</a>. [MPE] MultiPageEditorPart has class cast error in pageChange<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=55817">Bug 55817</a>. [Progress] Progress Information dialog appears on start bar, and shows up on wrong monitor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=68076">Bug 68076</a>. [Markers] Tasks view's &quot;Add Task&quot; pop-up item should end with ellipses<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=73612">Bug 73612</a>. [Markers] &quot;Open All&quot; does not work with multi-select in the bookmarks view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=77336">Bug 77336</a>. [Markers] [Dialogs] TableSortDialog does not use dialog font<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=84226">Bug 84226</a>. [RCP][PerspectiveBar] Option to preload perspective bar<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104496">Bug 104496</a>. [BIDI] Need to support Hebrew language code change to &quot;he&quot; from &quot;iw&quot;<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105312">Bug 105312</a>. [CommonNavigator] [arch] Support sorting and grouping for context-sensitive New(Import/Export) menu<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108102">Bug 108102</a>. [Viewers] Project expands in wrong working set<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112215">Bug 112215</a>. [CommonNavigator] Allow extensions to participate in the save lifecycle<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115061">Bug 115061</a>. [Progress] Progress entries should have a smaller minimum size<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122819">Bug 122819</a>. [Metadata] Some UI classes use CPL<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123409">Bug 123409</a>. [FastViews][DnD] Fastview bar is vertically oriented in status bar after switch from 3.1.2 to 3.2<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124873">Bug 124873</a>. [FieldAssist] API: How to deal with CellEditors, DecoratedFields and ContentProposalAdapters?<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126155">Bug 126155</a>. [Markers] Issues of multi quick fix dialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127040">Bug 127040</a>. problems view quick fix: labels<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127519">Bug 127519</a>. [Markers] Disabling all filters gives empty list<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127629">Bug 127629</a>. [Markers] problems view: keep selection stable<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128178">Bug 128178</a>. [Workbench] earlyStartup does not work in runtime eclipse with binary-imported plugins<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129342">Bug 129342</a>. [CommonNavigator] [Resource] Support Project Open/Close and Refresh<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129343">Bug 129343</a>. [Workbench] NullPointerException in saveTrimState when there is no defaultlayout<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130338">Bug 130338</a>. Eclipse Core Expressions Property Testers not loaded on demand<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132186">Bug 132186</a>. [CommonNavigator] Javadoc errors in ui.navigator.ICommonMenuConstants<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132257">Bug 132257</a>. [CommonNavigator] When you scroll using up/down keys, is slow : Updating status bar image a cause<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132427">Bug 132427</a>. [Markers] TaskPropertiesDialog problems<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133214">Bug 133214</a>. [Field Assist] - required field color hard to see<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133529">Bug 133529</a>. [FieldAssist] Usability improvements for required field emphasis<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133541">Bug 133541</a>. [Import/Export] 'testImportArchiveMultiProject is failing<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133867">Bug 133867</a>. [EFS] Project wizard browse button not connected to file system contributor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133941">Bug 133941</a>. [Properties] Can't contribute properties page for non IAdaptable<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134044">Bug 134044</a>. Required field inconsistency on New File wizard<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134238">Bug 134238</a>. [Undo] TriggeredOperations should close open operation on RuntimeExceptions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134266">Bug 134266</a>. [Wizard] Page description not set if page message already set<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134401">Bug 134401</a>. Bug in JFace Window JavaDoc<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134588">Bug 134588</a>. [Markers] Problems view not indicating pending update after deletion<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134600">Bug 134600</a>. [DataBinding] DefaultBindingSupport.isAssignableFromTo() creates new Booleans<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134750">Bug 134750</a>. [DataBinding] TextObservableValue throws NPE on change if the intial model value is null<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134834">Bug 134834</a>. [Commands] Ctrl+shift+r keybinding does not show up on menu<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134868">Bug 134868</a>. [DataBinding] API feedback from the newsgroup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=134879">Bug 134879</a>. [DataBinding] Provide toString implementations for implementations of IDiff<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135023">Bug 135023</a>. [Trim] Contributed trim 'fill' failures can prevent Workbench from opening<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135071">Bug 135071</a>. [Trim] Swtich to 'ragged' trim<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135088">Bug 135088</a>. [JFace] AbstractResourceManager.find() returns a RefCount instead of the created resource<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135173">Bug 135173</a>. [Markers] ArrayIndexOutOfBoundsException from Problems view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135266">Bug 135266</a>. [Common Navigator] Need a story and example of how to deal with content de-activation<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135284">Bug 135284</a>. [Viewers] API: need to add methods to StructuredViewer to support ViewerComparator<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135535">Bug 135535</a>. [KeyBindings] Key bindings lost in the Java editor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135586">Bug 135586</a>. [Markers] ClassCastException invoking help from ProblemsView<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135624">Bug 135624</a>. [Common Navigator] Navigator action service should call updateActionBars<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135630">Bug 135630</a>. [Import/Export] wrong message in Export Prefs wizard<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135641">Bug 135641</a>. [CommonNavigator] NPE when closing common navigator<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135648">Bug 135648</a>. [Trim] Need API to lock all trim<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135650">Bug 135650</a>. [Trim] Contributed trim needs to know which workbench window it's in<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135787">Bug 135787</a>. need to adopt ICU4J APIs<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=135991">Bug 135991</a>. [CommonNavigator] Allow Context Menu Wizards to be filtered by id<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136101">Bug 136101</a>. [Markers] ProblemsView constantly busy when empty<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=136121">Bug 136121</a>. [Markers] &quot;Find similar problems&quot; should be capitalized in Quick fix wizard.<br>
-  </p>
-
-
-<p>Integration Build (March 30, 2006, 8:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128888">Bug 128888</a>. View Toolbars no longer wrap<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133920">Bug 133920</a>. [CommonNavigator] Need to expose methods on INavigatorPipelineService<br>
-  </p>
-
-
-<p>Integration Build (March 30, 2006, 12:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112215">Bug 112215</a>. [CommonNavigator] Allow extensions to participate in the save lifecycle<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127209">Bug 127209</a>. [CommonNavigator] Double decorators?<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129359">Bug 129359</a>. [Metadata] UI plugins - externalize strings and plugin cleanup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133946">Bug 133946</a>. [DataBinding] New TableViewer Implementation Does Not Support Converters for Columns<br>
-  </p>
-
-
-<p>Integration Build (March 29, 2006, 8:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112225">Bug 112225</a>. [WorkbenchParts] Need consistent save lifecycle when multiple parts share the same model<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127209">Bug 127209</a>. [CommonNavigator] Double decorators?<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132731">Bug 132731</a>. Move deprecated API back to 'internal'<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133533">Bug 133533</a>. [JFace} Animated warning in new class wizard moves away but never reveals message text<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133847">Bug 133847</a>. Javadoc bug in StackPresentation.setState(int)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133896">Bug 133896</a>. [DataBinding] TableModelDescription Needs Enhancement<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133935">Bug 133935</a>. [CommonNavigator] Export menu creation issue<br>
-  </p>
-
-
-
-<p>Integration Build (March 29, 2006, 12:10 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129061">Bug 129061</a>. [Common Navigator] Request to support programmatic binding of drag adapter<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131884">Bug 131884</a>. [Contributions] NPE in org.eclipse.debug.internal.ui.actions.CopyToClipboardActionDelegate.initialize(CopyToClipboardActionDelegate.java:43)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132706">Bug 132706</a>. [Navigator] Programmatic content provider binding failing<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133058">Bug 133058</a>. [CommonNavigator] &#64;value tag reports unknown reference if javadoc 1.5 is used<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133375">Bug 133375</a>. [Viewers] Need access to the element comparer of a tree selection<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133531">Bug 133531</a>. Tests - OutOfMemoryError<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133557">Bug 133557</a>. [Trim] Opening and Closing a window leaks TrimAreas<br>
-  </p>
-
-
-
-
-<p>Integration Build (March 27, 2006, 4:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111144">Bug 111144</a>. WorkingCopyPreferences tries to flush removed pref nodes<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128888">Bug 128888</a>. View Toolbars no longer wrap<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129359">Bug 129359</a>. [Metadata] UI plugins - externalize strings and plugin cleanup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131771">Bug 131771</a>. Match animated message behaviour in Preferences<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133059">Bug 133059</a>. [Markers] CCE when switching Problems view grouping<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133342">Bug 133342</a>. [Commands] handlers: Global keybindings don't work (Open Type, Search, ...)<br>
-  </p>
-
-<p>Integration Build (March 27, 2006, 12:10 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=229">Bug 229</a>. Bug 229 - [Team API] Project meta information should be consolidated (1GIRW80)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=240">Bug 240</a>. Bug 240 - API Issue: breadth vs. depth resource accessing (1GJL2O7)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242">Bug 242</a>. Bug 242 - [Progress] Rework: revisit cancel (1GJN42Y)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=0321">Bug 0321</a>. Bug 321 - Internal Error when adding an extension point (1GJP22U)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=0800">Bug 0800</a>. Invalid Bug ID<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=1210">Bug 1210</a>. Invalid Bug ID<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=78722">Bug 78722</a>. [Perspectives] First time perspective trigger doesn't explain what perspective is<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=95945">Bug 95945</a>. [Navigator ] Opening compare editor switches to Java editor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=99155">Bug 99155</a>. [RCP] [Perspectives] Perspective extension with standalone=true and visible=false doesn't work<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119517">Bug 119517</a>. TVT3.1.x:TCT229: Directory/path/file name fields must be LTR<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119904">Bug 119904</a>. TVT3.1.x:TCT240: Wrong reading order of file type for editor association<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119928">Bug 119928</a>. TVT3.1.x:TCT242: File types displayed incorrectly<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120238">Bug 120238</a>. [Dialogs] - should required field indicators be used in Eclipse?<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126170">Bug 126170</a>. [Progress] IndexOutOfBoundsException during progress view refresh<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127451">Bug 127451</a>. [Mapping] Model provider and working set mappings must be dynamic<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127929">Bug 127929</a>. [DnD] Change Preferences option for draggable trim should be removed in M5<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128381">Bug 128381</a>. [Markers] group should only show (10 of 10 items) if beyond the limit<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128455">Bug 128455</a>. [Presentation] [ViewBar] Outline view toolbar is visible above a maximized editor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129359">Bug 129359</a>. [Metadata] UI plugins - externalize strings and plugin cleanup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129591">Bug 129591</a>. [Contributions] Create a two-way proxy for the workbench window menu manager<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129812">Bug 129812</a>. [Markers] Enabling problem categorization per default<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131022">Bug 131022</a>. [Markers] Filters view shows duplicate marker when super different from problem marker<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131517">Bug 131517</a>. [BiDi] Bidi3.2: [HCG]Wrong display of title window in RTL layout<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131559">Bug 131559</a>. [Markers] Layout of marker filters dialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132003">Bug 132003</a>. Animate warnings and info messages in same way as error messages<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132158">Bug 132158</a>. [Progress] Job, Operation, Task used interchangably<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132678">Bug 132678</a>. Contributed Trim is not sited correctly<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132731">Bug 132731</a>. Move deprecated API back to 'internal'<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132763">Bug 132763</a>. [Markers] Unused NLS messages reported on startup using I0321-1210<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132996">Bug 132996</a>. [IDE] IDE does not need to check for VM version<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133020">Bug 133020</a>. Info Properties page not available for files and folders<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=133044">Bug 133044</a>. [JFace] - should we show error status when required fields are empty if they have required field emphasis<br>
-  </p>
-
-
-<p>Integration Build (March 21, 2006, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=77332">Bug 77332</a>. [Markers] Add task dialog improvements<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106839">Bug 106839</a>. [Workbench] Use core.expressions in properties extensions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126901">Bug 126901</a>. [Commands] handlers: ExpressionAuthority and HandlerAuthority cause huge performance degradation<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127658">Bug 127658</a>. [Dialogs] help icon beween status and buttons<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129359">Bug 129359</a>. [Metadata] UI plugins - externalize strings and plugin cleanup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129591">Bug 129591</a>. [Contributions] Create a two-way proxy for the workbench window menu manager<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130398">Bug 130398</a>. [EFS] File copy not enabled if IResource#getLocation() == null<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130638">Bug 130638</a>. Cannot create a project with the zip example<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131000">Bug 131000</a>. [EFS] Drag and Drop of Folder with Spaces produces two folders in Navigator View (and other views that deal with resources)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131476">Bug 131476</a>. freeze due to IO in the UI thread<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131534">Bug 131534</a>. [Common Navigator] Tabbed Properties View is not integrated with Common Navigator<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131541">Bug 131541</a>. [PropertiesView] PropertySheetPage: Typo in javadoc<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131692">Bug 131692</a>. [Contributions] ContributionManager.insertAfter throws unhelpful IllegalArgumentException<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131847">Bug 131847</a>. [Workbench] ui.workbench should check starting status of ui before starting it<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131853">Bug 131853</a>. [Progress] NPE in BlockedJobsDialog$2.compare<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131884">Bug 131884</a>. [Contributions] NPE in org.eclipse.debug.internal.ui.actions.CopyToClipboardActionDelegate.initialize(CopyToClipboardActionDelegate.java:43)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131927">Bug 131927</a>. [CommonNavigator] actionProvider extension should support overrides<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131978">Bug 131978</a>. [Wizards] WizardDialog shell size keeps growing<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132038">Bug 132038</a>. [Field Assist] - ContentAssistCommandAdapter should have autoactivation delay<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132039">Bug 132039</a>. [Field Assist] - secondary popup should update on same delay as its invocation delay<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132101">Bug 132101</a>. [Field Assist] does not work for characters that need AltGr, Ctrl+Alt or Strg+Alt<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132145">Bug 132145</a>. [Markers] Filter dialog problems<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132148">Bug 132148</a>. [Markers] [Dialogs] Set Limits dialog problems<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132156">Bug 132156</a>. [Dialogs] Progress Preferences dialog problems<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132158">Bug 132158</a>. [Progress] Job, Operation, Task used interchangably<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132172">Bug 132172</a>. [Common Navigator] OutOfMemoryError when running navigator tests<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132178">Bug 132178</a>. [ActivityMgmt] UI Trigger Points are missing<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132217">Bug 132217</a>. [Markers] invalid thread access in Problems view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=132250">Bug 132250</a>. [Decorators] DecoratoratingLabelProvider doesn't work with ITreePathLabelProvider<br>
-  </p>
-
-<p>Integration Build (March 13, 2006, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=47098">Bug 47098</a>. [ActivityMgmt] Empty Menu bar item (Run) when External tools filtered out<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115360">Bug 115360</a>. archive file not closed after importing project from archive<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124061">Bug 124061</a>. Exceptions occur opening the sync view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124281">Bug 124281</a>. [MarkerView] &quot;Marker id: 1012046 not found&quot; in log<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126170">Bug 126170</a>. [Progress] IndexOutOfBoundsException during progress view refresh<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126839">Bug 126839</a>. [DataBinding] IObservable refactoring<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127108">Bug 127108</a>. [Field Assist] - KeyEvents and content proposal requests<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128293">Bug 128293</a>. [Contributions] visible/enabled: Object contributions contributed to submenus do not show up<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129193">Bug 129193</a>. [JFace] Setting the sorter on AbstractTreeViewer before input can cause NPE<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129359">Bug 129359</a>. [Metadata] UI plugins - externalize strings and plugin cleanup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129591">Bug 129591</a>. [Contributions] Create a two-way proxy for the workbench window menu manager<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129594">Bug 129594</a>. [Commands] help: Read help context id from legacy extension points<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130325">Bug 130325</a>. [project explorer] Reuse the Project Explorer provided by Eclipse platform ui<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130605">Bug 130605</a>. CBanner needs to use both the left and right sides to compute its height<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130630">Bug 130630</a>. Fixed errors shown again when next is pressed<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130631">Bug 130631</a>. Sliding job should be a system job<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130745">Bug 130745</a>. [Markers] Progress message: Queueing viewer updates<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130825">Bug 130825</a>. [Properties] Error in log about invalid extension element<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130976">Bug 130976</a>. [Viewers] Error is calculation of parent path when calling TreePathViewerSorter<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130993">Bug 130993</a>. FilteredTree does not expand all elements<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131164">Bug 131164</a>. [Markers] Calculating a markers creation time takes 7.5 ms<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131369">Bug 131369</a>. [Import/Export] import project from zip cannot locate projects<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131390">Bug 131390</a>. IDE javadoc refers to IProposedResourceDeltaFactory instead of IResourceChangeDescriptionFactory<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=131398">Bug 131398</a>. [Markers] Problems view doing a bundle lookup everytime it populates a table enty<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=1012046">Bug 1012046</a>. Invalid Bug ID<br>
-  </p>
-
-<p>Integration Build (March 7, 2006, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=75206">Bug 75206</a>. [Import/Export] Export large file using Export filesystem wizard causes OutOfMemory<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=88098">Bug 88098</a>. [Graphics] Some icons may be obsolete in the workbench<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=90971">Bug 90971</a>. [KeyBindings] assist: popup not correctly sized with non-default dialog font<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=97428">Bug 97428</a>. [Preferences] Add preference key word for 'line delimiter' and 'encoding'<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106839">Bug 106839</a>. [Workbench] Allow &lt;enablement&gt; tag in properties extensions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113455">Bug 113455</a>. [Markers] Some error markers do not appear<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115360">Bug 115360</a>. archive file not closed after importing project from archive<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115791">Bug 115791</a>. [RCP] Adaptable=true contributions to IResource depend on ui.ide<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115873">Bug 115873</a>. [Progress] User Jobs don't provide feedback on error unless run in background<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117594">Bug 117594</a>. Remove copies of Assert<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124281">Bug 124281</a>. [MarkerView] &quot;Marker id: 1012046 not found&quot; in log<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125234">Bug 125234</a>. [Help] Missing context help<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125521">Bug 125521</a>. [EFS] [Wizards] WorkbenchWizardElement.java 's convertToResources() method doesn't consider ResourceMapping cases<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125972">Bug 125972</a>. [PerspectiveBar] Show text for perspective is set again when changing preferences<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126138">Bug 126138</a>. [Field Assist] - KeyEvent issues on Mac and Linux<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127039">Bug 127039</a>. problems view quick fix: dialog should check resource by default<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127108">Bug 127108</a>. [Field Assist] - KeyEvents and content proposal requests<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127289">Bug 127289</a>. [Markers] SystemFilter and group selection state not preserved<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127523">Bug 127523</a>. [TasksView] User-defined tasks lost in the masses of generated tasks<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128117">Bug 128117</a>. [Undo/Redo] Context not removed from TriggeredOperations<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128233">Bug 128233</a>. need to investigate scalability of FilteredTree<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128425">Bug 128425</a>. [Help] Help button should not show up in dialogs without help context ID<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128472">Bug 128472</a>. [Workbench] Need to consider restarting Eclipse when the workspace settings change<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128953">Bug 128953</a>. [Markers] Problems view loses focus<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129184">Bug 129184</a>. Progress view should be made more prominent<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129246">Bug 129246</a>. [JFace] - API - access to images and colors for standard field decorations<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129318">Bug 129318</a>. [Preferences] ScopedPreferenceStore forever disconnected after last call to removePropertyChangeListener<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129320">Bug 129320</a>. [IDE] Cannot move external project<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129359">Bug 129359</a>. [Metadata] UI plugins - externalize strings and plugin cleanup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129377">Bug 129377</a>. [Viewers] IDecorationContext.getContextIds() comment says it should be removed before M5<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129796">Bug 129796</a>. [Markers] Problems view filter configuration dialog has duplicate mnemonic 'v'<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129829">Bug 129829</a>. Request for API for message animation<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129887">Bug 129887</a>. &quot;system settings have changed&quot; dialog - why<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129942">Bug 129942</a>. [Import/Export] Filtering the imported files don't work<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130171">Bug 130171</a>. [Markers] MarkerView tests should not have filters enabled by default<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130248">Bug 130248</a>. Scoped Preference Store: Set To Default -&gt; No Property Change Event<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130325">Bug 130325</a>. [project explorer] Reuse the Project Explorer provided by Eclipse platform ui<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130378">Bug 130378</a>. Extra separator in progress status item<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=1012046">Bug 1012046</a>. Invalid Bug ID<br>
-  </p>
-
-<p>Integration Build (February 28, 2006, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=92601">Bug 92601</a>. [Properties] Can't contribute properties page for non IAdaptable<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=97859">Bug 97859</a>. [DetachedViews] non-closeable view can be closed after detaching<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=99904">Bug 99904</a>. [RCP] Layout not updated when visibility of coolbar, perspectivebar etc. toggled after startup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111761">Bug 111761</a>. [CommonNavigator] Part activation listener not removed when Project Explorer is disposed.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115873">Bug 115873</a>. [Progress] User Jobs don't provide feedback on error unless run in background<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116260">Bug 116260</a>. [Graphics] [Wizards] Improve the look of the wizard when non-default colours are used<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117184">Bug 117184</a>. [Viewers] Failure in VirtualLazyTreeViewerTest.testExpand<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120587">Bug 120587</a>. [Common Navigator] Manifest.MF appears twice in Java content<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122627">Bug 122627</a>. [RCP] (regression) Coolbar only shown when MainWindow-Resized<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122808">Bug 122808</a>. [Common Navigator] NavigatorActionService doesn't use ActionGroup#updateActionBars()<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122910">Bug 122910</a>. [CommonNavigator] API types should specify subclassing / implementation contract<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124935">Bug 124935</a>. [CommonNavigator] Resource extension is missing several actions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125575">Bug 125575</a>. [Common Navigator] Label provider should support custom fonts and colors<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125647">Bug 125647</a>. [CommonNavigator] Refactor ActivationService to remove singleton pattern<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125717">Bug 125717</a>. [Common Navigator] CommonViewer should not override isExpandable<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126459">Bug 126459</a>. [Common Navigator] CommonViewer should use TreePathViewerSorter<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126553">Bug 126553</a>. [Field Assist] light bulb image looks ugly on white background<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126658">Bug 126658</a>. [CommonNavigator] [DND] Complete definition of DND API<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126901">Bug 126901</a>. [Commands] handlers: ExpressionAuthority and HandlerAuthority cause huge performance degradation<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127165">Bug 127165</a>. [CommonNavigator] Update init() signatures of user-implemented extensions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127202">Bug 127202</a>. [CommonNavigator] Provide default implementation for CommonActionProvider.init<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127211">Bug 127211</a>. [CommonNavigator] Double-click should either open or expand, not both<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127261">Bug 127261</a>. [Common Navigator] Add support for ITreePathContent/LabelProvider<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127320">Bug 127320</a>. [Wizards] NPE importing from zip file<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128472">Bug 128472</a>. [Workbench] Need to consider restarting Eclipse when the workspace settings change<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128644">Bug 128644</a>. [Markers] ArrayIndexOutOfBoundsException while queuing viewer updates<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128939">Bug 128939</a>. [Wizards] NPE when checking option &quot;Link to folder in the file system&quot;<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129027">Bug 129027</a>. [Workbench] remove comment about experimental status from IProductConstants<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129156">Bug 129156</a>. [Wizards] NPE in IDESelectionConversionService.convertToResources<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129214">Bug 129214</a>. [Field Assist] - Decorated Field attachments not centering images horizontally<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=129359">Bug 129359</a>. [Metadata] UI plugins - externalize strings and plugin cleanup<br>
-  </p>
-
-<p>Integration Build (February 21, 2006, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56490">Bug 56490</a>. [Problems] Remove delete action from the Problem View<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=95507">Bug 95507</a>. [Preferences] Colors and font defaults should differ in High Contrast Mode<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127139">Bug 127139</a>. Problem View Filters are exported in preferences but not imported<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127745">Bug 127745</a>. [Preferences] Encoding keyword goes to wrong page<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128287">Bug 128287</a>. [Contributions] being 'relativeTo' a non-existent group throws NPE<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128298">Bug 128298</a>. ViewerSorter.compare() does not need to be overridden from superclass<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128316">Bug 128316</a>. [Themes] Themes not applied on restart<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128707">Bug 128707</a>. SchedulingRule problems importing a Team Project Set<br>
-  </p>
- 
-<p>Integration Build (February 16, 2006, 4:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127394">Bug 127394</a>. [Commands] handlers: Ctrl+. and Ctrl+, key bindings constantly broken in PDE editor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128243">Bug 128243</a>. [JFace] jface.util.ListenerList deprecation message should tell difference in ListenerList(int)<br>
-  </p>
-
-<p>Integration Build (February 15, 2006, 12:10 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127505">Bug 127505</a>. [Dialogs] NPE from saveDialogBounds<br>
-  </p>
-
-<p>Integration Build (February 14, 2006, 4:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107656">Bug 107656</a>. [Viewers] DeferredTreeContentManager has API methods that take internal parameters<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120150">Bug 120150</a>. [Commands] Javadoc bugs in ParameterizedCommand and ExecutionEvent<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122674">Bug 122674</a>. [Contributions] errors: Eclipse stops startup silently when error in action set<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127470">Bug 127470</a>. [PerspectiveBar] Reseting perspective removes it from the perspective switcher<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127531">Bug 127531</a>. [Examples] Warnings/errors in UI samples<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127549">Bug 127549</a>. [Markers] Sometimes the Problems view goes blank<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127607">Bug 127607</a>. [Viewers] Remove deprecated DecoratingLabelProvider.UPDATE_LABEL<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127762">Bug 127762</a>. [Viewers] new ViewerComparator class not released in M5<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127861">Bug 127861</a>. [DataBinding] Mark API provisional<br>
-  </p>
-  
-<p>Integration Build (February 14, 2006, 12:10 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111631">Bug 111631</a>. [Viewers] TreeViewer needs more TableViewer API<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127172">Bug 127172</a>. [JFace] New API elements missing &#64;since<br>
-  </p>
- 
-<p>Integration Build (February 13, 2006, 8:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107656">Bug 107656</a>. [Viewers] DeferredTreeContentManager has API methods that take internal parameters<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116924">Bug 116924</a>. [LinkedResources] Links can now be at arbitrary depth<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122457">Bug 122457</a>. [Viewers] IllegalThreadStateException in BackgroundContentProvider<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123653">Bug 123653</a>. Ctrl-Shift-D does not work in dialogs<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125386">Bug 125386</a>. [PropertiesView] Properties view should delegate Save back to source part<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127031">Bug 127031</a>. [Commands] request: add command to show intro/welcome main page<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127063">Bug 127063</a>. [KeyBindings] doc: Javadoc references to IBindingService need to be cleaned up<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127151">Bug 127151</a>. [Contributions] Warnings for menus/actionSet elements in IDE's plugin.xml<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127171">Bug 127171</a>. [Commands] New API elements missing &#64;since<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127172">Bug 127172</a>. [JFace] New API elements missing &#64;since<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127318">Bug 127318</a>. [Contributions] Need to review docs for 'org.eclipse.ui.menus'<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127344">Bug 127344</a>. [IDE] Test failure in Bug99858Test.testDeleteClosedProject<br>
-  </p>
-
-<p>Integration Build (February 13, 2006, 12:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109052">Bug 109052</a>. Exposure of workbench part controls to clients<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109661">Bug 109661</a>. [Presentation] Improve customizable window trim<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111959">Bug 111959</a>. [Viewers] ColorAndFontCollector and getColorAndFontCollector() visibility conflict<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120590">Bug 120590</a>. [WorkingSets] API cleanup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122688">Bug 122688</a>. [Workbench] Should cast to IStructuredSelection instead of StructuredSelection<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126553">Bug 126553</a>. [Field Assist] light bulb image looks ugly on white background<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126638">Bug 126638</a>. [Viewers] Remove GTK checks from StructuredViewerTest<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127063">Bug 127063</a>. [KeyBindings] doc: Javadoc references to IBindingService need to be cleaned up<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127476">Bug 127476</a>. [DND] Trim Drag handles don't show up; can't initiate a drag op<br>
-  </p>
-
-<p>Integration Build (February 10, 2006, 4:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=42643">Bug 42643</a>. [Editor Mgmt] Need extension to intercept editor opening<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=71701">Bug 71701</a>. [Workbench] Allow plugins to veto shutdown<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=84226">Bug 84226</a>. [RCP][PerspectiveBar] Option to preload perspective bar<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109661">Bug 109661</a>. [Presentation] Improve customizable window trim<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120460">Bug 120460</a>. [Perspectives] Promote deletePerspective( ) from PerspectiveRegistry to IPerspectiveRegistry<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123316">Bug 123316</a>. [Undo] - API BEHAVIOR - should always place a successfully undone/redone op on the redo/undo history<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126082">Bug 126082</a>. Should ISaveableModel#doSave throw a CoreException?<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126465">Bug 126465</a>. [MPE] first page is blank upon creation<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127139">Bug 127139</a>. Problem View Filters are exported in preferences but not imported<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127167">Bug 127167</a>. [Workbench] Remove services extension point and references<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127200">Bug 127200</a>. [Tests] Performance test extensions still in org.eclipse.ui.tests<br>
-  </p>
-  
-<p>Integration Build (February 10, 2006, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=42643">Bug 42643</a>. [Editor Mgmt] Need extension to intercept editor opening<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=74795">Bug 74795</a>. [Viewers] Generic quick filter for large tree-based views<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=99155">Bug 99155</a>. [RCP] [Perspectives] Perspective extension with standalone=true and visible=false doesn't work<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109661">Bug 109661</a>. [Presentation] Improve customizable window trim<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115996">Bug 115996</a>. [Commands] [RCP] Document available services in IWorkbench<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120587">Bug 120587</a>. [Common Navigator] Manifest.MF appears twice in Java content<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122910">Bug 122910</a>. [CommonNavigator] API types should specify subclassing / implementation contract<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123257">Bug 123257</a>. [RCP] [CoolBar] Need ability to provide a custom toolbar similar to the way we can supply a custom statusbar<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123965">Bug 123965</a>. [Preferences] Cancelling Compiler Error/Warning property page still puts them in effect<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124281">Bug 124281</a>. [MarkerView] &quot;Marker id: 1012046 not found&quot; in log<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125011">Bug 125011</a>. [Contributions] ActionContributionItem should use text for tooltip in toolitems<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125521">Bug 125521</a>. [EFS] [Wizards] WorkbenchWizardElement.java 's convertToResources() method doesn't consider ResourceMapping cases<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126341">Bug 126341</a>. [Markers] problems view: rebuild collapses all groups<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126414">Bug 126414</a>. [Commands] handlers: Provide help context ids<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126507">Bug 126507</a>. [CommonNavigator] [Java] Proposed Java extension for Common Navigator<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126508">Bug 126508</a>. [CommonNavigator] Support overriding an existing extension<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126555">Bug 126555</a>. [Field Assist] assist not opened at caret location<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126569">Bug 126569</a>. [FieldAssist] Duplicate javadoc in DecoratedField<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126573">Bug 126573</a>. [Dialogs] StatusDialog should extend TrayDialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126651">Bug 126651</a>. [Commands] request: enhance commands to open import/export/new wizards with parameter to indicate desired wizard<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126654">Bug 126654</a>. [EFS] Eclipse 3.2M4's SelectionListenerAction's computeResources() method does not take ResourceMappings into consideration<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126658">Bug 126658</a>. [CommonNavigator] [DND] Cleanup DND API<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126754">Bug 126754</a>. [Progress] Infinit number of Building Workspace jobss<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126779">Bug 126779</a>. [IDE] Removed deprecated project capabilities API and implementation<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126811">Bug 126811</a>. Compile errors after updating to latest changes<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126847">Bug 126847</a>. [FieldAssist] API - Typo in FieldDecorationRegistry#geMaximumDecorationWidth()<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127029">Bug 127029</a>. [JFace] [DND] LocalSelectionTransfer should be supported on the JFace layer.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127063">Bug 127063</a>. Javadoc references to IBindingService need to be cleaned up<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127080">Bug 127080</a>. [Field Assist] widget disposed error on proposal insertion<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127165">Bug 127165</a>. [CommonNavigator] Update init() signatures of user-implemented extensions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=1012046">Bug 1012046</a>. Invalid Bug ID<br>
-  </p>
-
-<p>Integration Build (February 7, 2006, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=29840">Bug 29840</a>. [WorkbenchParts] Need API to get the zoomed state of a workbench page<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=40348">Bug 40348</a>. [ViewMgmt] PageBook does not support IPostSelectionProvider (was: JavaDoc &amp; Declaration view and fast selection changes)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=70117">Bug 70117</a>. [Progress] Help Context<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=85350">Bug 85350</a>. [Markers] [Progress] NoClassDefFoundError from job running during shutdown<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102666">Bug 102666</a>. [Commands] registry: ISourceProvider for selection and context change is not implemented<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105928">Bug 105928</a>. [Progress] Blocked jobs dialog showing empty message<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108509">Bug 108509</a>. [Dialogs] Help button support<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112000">Bug 112000</a>. [Viewers] TreeViewer SWT.VIRTUAL support.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113178">Bug 113178</a>. [IDE] Open Dependant Projects<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113455">Bug 113455</a>. [Markers] Some error markers do not appear<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115858">Bug 115858</a>. [Model API] ResourceMapping#getModelProviderId() should be abstract<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120379">Bug 120379</a>. [CommonNavigator] Comparator vs. ViewerSorter<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120392">Bug 120392</a>. [CommonNavigator] CommonViewer doesn't use CommonSorter<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120457">Bug 120457</a>. [Field Assist] - popup shell not dismissing correctly<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120587">Bug 120587</a>. [Common Navigator] Manifest.MF appears twice in Java content<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122749">Bug 122749</a>. [Dialogs] Store size and position of ElementList/TreeSelectionDialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122756">Bug 122756</a>. [Viewers] Support for TreePath based content providers<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123789">Bug 123789</a>. [WorkbenchParts] 'Maximize' state should be view, not folder-bound<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123800">Bug 123800</a>. [Progress] InterruptedExceptions being logged many times<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124128">Bug 124128</a>. [CommonNavigator] Internal navigator package names don't follow conventions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124200">Bug 124200</a>. [WorkbenchParts] hideView does not work on perspective deactivate callback<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124393">Bug 124393</a>. Deprecate IKeyBindingService<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124395">Bug 124395</a>. Make sure all slave and nested services clean up all resources<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124520">Bug 124520</a>. [FieldAssist] API - Applications should be able to install a reserved decoration size and commonly used decorations<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124883">Bug 124883</a>. problems view: automatically disable marker limits when in group mode<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125526">Bug 125526</a>. [IDE] BuildUtilities.java's extractProjects() method does not consider ResourceMapping cases<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125540">Bug 125540</a>. Add IBindingService to all of the sites<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125541">Bug 125541</a>. Add ICommandService to all of the sites<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125600">Bug 125600</a>. [Field Assist] - popup shell should be resizable with size retained<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125654">Bug 125654</a>. Project &quot;expose&quot; would be cool for removing unrelated projects<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125808">Bug 125808</a>. [Field Assist] assist hint hover should use tool tip caption<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125943">Bug 125943</a>. [CommonNavigator] No need to include schema folder in binary build<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125952">Bug 125952</a>. [Field Assist] - cumulative filtering can be confusing<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125955">Bug 125955</a>. [Field Assist] - StringIndexOutOfBoundsException when backspacing out of a filter<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126027">Bug 126027</a>. [CommonNavigator] Support sorting based on different parents<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126044">Bug 126044</a>. [Contexts] Latest key binding changes break Quick view key bindings<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126071">Bug 126071</a>. [CommonNavigator][arch] Should common sorters be associated with a content extension?<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126079">Bug 126079</a>. [Commands] request: add commands to open/show resource with path parameter<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126233">Bug 126233</a>. [FieldAssist] DecoratedField should not automatically reserve space on field ends<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126258">Bug 126258</a>. [Commands] handlers: Inspect doesn't work<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126264">Bug 126264</a>. [Progress] ProgressMonitorJobsDialog and BlockedJobsDialog needs to migrate to new progress viewer<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126404">Bug 126404</a>. [Commands] handlers: Key binding availability dependant on view focus<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126461">Bug 126461</a>. [Common Navigator] Priority should default to normal<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126462">Bug 126462</a>. setBatch() not refreshing XML model.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126506">Bug 126506</a>. [Viewers] TreePath based sorting<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126508">Bug 126508</a>. [CommonNavigator] Support overriding an existing extension<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126527">Bug 126527</a>. [Field Assist] - API - Field Decoration alignment issues are different for cell editors<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126553">Bug 126553</a>. [Field Assist] light bulb image looks ugly on white background<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126555">Bug 126555</a>. [Field Assist] assist not opened at caret location<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126566">Bug 126566</a>. [Workbench] test failure in StartupTest.testStartup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126570">Bug 126570</a>. [Common Navigator] NavigatorContentService EXTENSION_COMPARATOR problem<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126578">Bug 126578</a>. [Commands] handlers: Each opened Text and Java editor is leaked due to ProxyKeyBindingService<br>
-  </p>
-
-<p>Integration Build (January 31, 2006, 12:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112225">Bug 112225</a>. [WorkbenchParts] Need consistent save lifecycle when multiple parts share the same model<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125703">Bug 125703</a>. [Commands] handlers: Some handlers are not being registered in the Java editor<br>
-  </p>
-
-
-<p>Integration Build (January 31, 2006, 8:00 a.m.)</p>
-  <p>Problem reports fixed (or worked on)</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=32553">Bug 32553</a>. [Viewers] Closing a project does not remove [+] icon<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56490">Bug 56490</a>. [Problems] Remove delete action from the Problem View<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=74795">Bug 74795</a>. [Viewers] Generic quick filter for large tree-based views<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=84407">Bug 84407</a>. [ViewMgmt] Mark the title of a view as dirty<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=86389">Bug 86389</a>. [CommonNavigator] Filters dialog should support embedded &quot;searching&quot; metaphor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=90257">Bug 90257</a>. [Preferences] Want to create an instanceof of a WorkingCopyManager<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112225">Bug 112225</a>. [WorkbenchParts] Need consistent save lifecycle when multiple parts share the same model<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112237">Bug 112237</a>. [Graphics] Exporting key preferences shows icon of different type of key<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113290">Bug 113290</a>. [CommonNavigator] NavigatorContentServiceLabelProvider does not support listeners<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116904">Bug 116904</a>. [DataBinding] Table elements aren't IUpdatable<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118323">Bug 118323</a>. [DataBinding] Need editing life cycle events on the data binding framework<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119208">Bug 119208</a>. [CommonNavigator]: Options for org.eclipse.ui.navigator.viewer<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120237">Bug 120237</a>. [Field Assist] - adapt find/replace dialog to use field assist<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120408">Bug 120408</a>. [Field Assist] - API - Specification of invoking key stroke/sequence<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121544">Bug 121544</a>. [Presentations] (regression) Changing Tab Position from Top to Bottom doesn't work<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121866">Bug 121866</a>. [MPE] MultiPageEditorPart toolbar initially hidden<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122773">Bug 122773</a>. [CommonNavigator] Open action appears with empty selection<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122861">Bug 122861</a>. [Common Navigator] Support for programmatic control of visibility<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123375">Bug 123375</a>. [DataBinding] Enhancements to the data binding framework<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123989">Bug 123989</a>. Should ResourceChangeValidator#validateChange take a progress monitor<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124141">Bug 124141</a>. [Progress] ProgressView does not populate until first update occurs<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124393">Bug 124393</a>. Deprecate IKeyBindingService<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124396">Bug 124396</a>. Finish adding context services to the chain<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124520">Bug 124520</a>. [FieldAssist] API - Applications should be able to install a reserved decoration size and commonly used decorations<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124564">Bug 124564</a>. [Presentations] DetachedWindow should not use TabbedStackPresentation<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124633">Bug 124633</a>. [Common Navigator] navigatorContent name attribute should be marked as translatable<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124812">Bug 124812</a>. [CommonNavigator] Should NavigatorActionService support programmatic binding?<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124874">Bug 124874</a>. [CommonNavigator] Open and Open With should have their own enablement logic<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124912">Bug 124912</a>. [CommonNavigator] Remove ResourcePropertyTester<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124953">Bug 124953</a>. [Markers] AIOB when applying quick fix<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125012">Bug 125012</a>. [Field Assist] Clarify lifecycle of the ILabelProvider used by ContentProposalAdapter<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125071">Bug 125071</a>. [Commands] request: command-ify update actions in org.eclipse.ui.ide<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125076">Bug 125076</a>. [ActionSets] dynamicplugins.ActionSetTests.testActionSets sometimes fails on the Mac<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125147">Bug 125147</a>. [WorkingSets] Deadlock on startup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125155">Bug 125155</a>. [Commands] handlers: ConcurrentModificationException from SlaveHandlerService closing workbench<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125198">Bug 125198</a>. Problem view: can't use diffenert marker types in same grouping<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125200">Bug 125200</a>. Problem view: NPE after access on non existing attribute<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125202">Bug 125202</a>. Problems view grouping: Show number of elements in a group<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125205">Bug 125205</a>. Problems view grouping: Rename 'Category' to 'Marker type'<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125224">Bug 125224</a>. Delete ProjectPersistentPropertyTester<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125272">Bug 125272</a>. [Viewers] AbstractTreeViewer needs remove(Object parentElement, Object[] childElements)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125346">Bug 125346</a>. Delete IDE copy of CompositeResourceMapping<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125386">Bug 125386</a>. [PropertiesView] Properties view should delegate Save back to source part<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125401">Bug 125401</a>. Chkpii errors in ui.navigator extension points<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125418">Bug 125418</a>. [Field Assist] - API - Should ContentProposalPopup be public?<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125420">Bug 125420</a>. [Commands] parameters: allow commands to specify return type<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125501">Bug 125501</a>. [CommonNavigator] org.eclipse.ui.navigator.navigatorContent/viewer<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125516">Bug 125516</a>. [KeyBindings] misc: API to return a KeySequence string for a command id<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125567">Bug 125567</a>. [MPE] Service activation should be done in a different method<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125587">Bug 125587</a>. [Field Assist] - need API access to the content assist cue image<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125632">Bug 125632</a>. [Commands] request: enhance command to show preferences dialog with parameter identifying which page to show<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125652">Bug 125652</a>. [CommonNavigator] Default filter activations causes failure in OpenTest<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125654">Bug 125654</a>. Project &quot;expose&quot; would be cool for removing unrelated projects<br>
-  </p>
-
-<p>Integration Build (January 24, 2006, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=93955">Bug 93955</a>. [Undo] [implementation] Rename Type/CompilationUnit flushes the editor undo stack<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109661">Bug 109661</a>. [Presentation] Improve customizable window trim<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118323">Bug 118323</a>. [DataBinding] Need editing life cycle events on the data binding framework<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119634">Bug 119634</a>. EFS UI Support in project wizard<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119890">Bug 119890</a>. [ViewMgmt] Allow control of view tab compression<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120023">Bug 120023</a>. TVT3.1.x:TCT244: Should Hebrew characters be added to valid mnemonics?<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120921">Bug 120921</a>. [PopupDialog] Keybindings lost after using PopupDialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121254">Bug 121254</a>. [CommonNavigator] Comments on ICommonActionProvider<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122814">Bug 122814</a>. NPE in ResourceMappingMarkersTest.testResourceMappings<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122861">Bug 122861</a>. [Common Navigator] Support for programmatic control of visibility<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123392">Bug 123392</a>. [PopupDialog] Quick Outline stays up after opening &quot;view&quot; menu<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123496">Bug 123496</a>. [IDE] Use operation validation API for IDE actions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123758">Bug 123758</a>. [DataBinding] CComboUpdatableValue Doesn't Handle Text That Isn't in The List of Selected Items<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123972">Bug 123972</a>. [Undo] Support approval of undoable operation execution<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124124">Bug 124124</a>. [Markers] Group sorting needs criterea other than lexical value<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124138">Bug 124138</a>. NPE in FieldCategory<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124162">Bug 124162</a>. [Contributions] Warnings in log about Next/Previous Annotation action contributions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124201">Bug 124201</a>. [Viewers] Additional baheviour for TreeSelection<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124202">Bug 124202</a>. [Field Assist] - decorated fields should not size the created control<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124376">Bug 124376</a>. Widget is disposed exception in FilteredTree<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124387">Bug 124387</a>. Updating service model<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124529">Bug 124529</a>. [EFS] Need file system support in linked resources<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124656">Bug 124656</a>. Several ui plug-ins have references to plugin and fragment.xml in build properties<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124673">Bug 124673</a>. [Commands] handlers: TextActionHandler's text actions do not work as expected<br>
-  </p>
-
-<p>Integration Build (January 17, 2006, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109661">Bug 109661</a>. [Presentation] Improve customizable window trim<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116906">Bug 116906</a>. [Dialogs] Can't restore original size of dialogs remembering size<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118435">Bug 118435</a>. [Markers] Trying to implement WorkbenchMarkerResolution<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119054">Bug 119054</a>. TVT3.1.x:TCT223: variable value not set<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119617">Bug 119617</a>. [Wizards] Missing icon in New Class wizard<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119864">Bug 119864</a>. A more lightweight hierarchical problems view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120023">Bug 120023</a>. TVT3.1.x:TCT244: Should Hebrew characters be added to valid mnemonics?<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120414">Bug 120414</a>. [Viewers] Type-ahead filter in New wizard does not catch Ctrl+x<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120458">Bug 120458</a>. [Field Assist] - auto-activation should occur on a delay<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120696">Bug 120696</a>. [Viewers] Filtered Tree: could we be smarter with &quot;type filter text&quot;?<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120925">Bug 120925</a>. [Import/Export] wizards missing context help<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120935">Bug 120935</a>. ImportExistingTest.verifyProjectInWorkspace has timing issues<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121949">Bug 121949</a>. [Wizards] The width of the button in the dialog of &quot;Exitsting Projects into Workspace&quot; doesn't extend when the dialog font is changed<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122029">Bug 122029</a>. [Wizards] Change &quot;General&quot; back to &quot;Basic&quot;<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122822">Bug 122822</a>. [WorkbenchParts] error in EditorPart javadoc<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122936">Bug 122936</a>. IResource isLocal and setLocal should be deprecated<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122957">Bug 122957</a>. NPE in PatternFilter.match<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123040">Bug 123040</a>. [Commands] request: display help topic<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123296">Bug 123296</a>. [JFace] Memory leak in org.eclipse.jface.window.Window<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123319">Bug 123319</a>. [Markers] ClassCastException during marker update<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123323">Bug 123323</a>. [Markers] Problems view does not display anything (index out of bounds)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123415">Bug 123415</a>. [Commands] handlers: action set handlers stop working when two workbench windows open<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123442">Bug 123442</a>. [Commands] handlers: Retarget action handlers aren't registered properly<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123740">Bug 123740</a>. Provide shorthand for creating GridLayouts<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123761">Bug 123761</a>. [Decorators] Add properties to decoration context<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123952">Bug 123952</a>. [Metadata] org.eclipse.ui.workbench build.properties broken<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123977">Bug 123977</a>. [Markers] NPE in ActionCopyMarker.setClipboard<br>
-  </p>
-
-<p>Integration Build (January 10, 2006, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111820">Bug 111820</a>. [CommonNavigator] actionProvider extension should support dependencies<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117505">Bug 117505</a>. [Commands] handlers: Legacy actions are active even when they shouldn't be<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118435">Bug 118435</a>. [Markers] Trying to implement WorkbenchMarkerResolution<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118934">Bug 118934</a>. [Dialogs] Introduce dialog trays<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119864">Bug 119864</a>. A more lightweight hierarchical problems view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119927">Bug 119927</a>. [KeyBindings] TVT3.1.x:TCT241: Reading order in key sequences containing neutral chars<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119960">Bug 119960</a>. [CommonNavigator] Navigator plugins should be JARed<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120142">Bug 120142</a>. [DataBinding] DataBinding is static<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120632">Bug 120632</a>. [DnD] Drag indicators hard to see on OS X<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120652">Bug 120652</a>. [Commands] handlers: Cannot add evaluations to Display or Expressions View<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120932">Bug 120932</a>. [CommonNavigator] Provider for ui.navigator is different<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120934">Bug 120934</a>. [WorkbenchParts] NPE in PresentablePart.removePropertyListener(<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121562">Bug 121562</a>. [IDE] Need a way to disable forced GC done by IDEIdleHelper<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121623">Bug 121623</a>. [Decorators] Patch to support logical model decoration<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121632">Bug 121632</a>. [CommonNavigator] classes with template class commetn<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121709">Bug 121709</a>. [Commands] parameters: Add types<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121883">Bug 121883</a>. [Markers] org.eclipse.ui.tests plug-in makes lots of performance tests red<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122053">Bug 122053</a>. [KeyBindings] Shortcut Key Not Working In 3.2M4<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122515">Bug 122515</a>. [CommonNavigator] CommonActionProvider should be made an API-level abstract class<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122517">Bug 122517</a>. [CommonNavigator] CommonActionProvider should subclass ActionGroup<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122518">Bug 122518</a>. [CommonNavigator] Improve CommonActionProvider's init() method<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122520">Bug 122520</a>. [CommonNavigator] Open up INavigatorActionService as instantiatable API<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122525">Bug 122525</a>. [CommonNavigator] Allow menu insertion points to be extensible per viewer<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122665">Bug 122665</a>. [CommonNavigator] Move commonWizard ext pt to org.eclipse.ui.navigator<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122674">Bug 122674</a>. [Contributions] errors: Eclipse stops startup silently when error in action set<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122683">Bug 122683</a>. [CommonNavigator] The registry readers for consolidated ext pts should be refactored<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122688">Bug 122688</a>. [Workbench] Should cast to IStructuredSelection instead of StructuredSelection<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122791">Bug 122791</a>. [DnD] uncaught exceptions during trim dragging cause subsequent issues<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122814">Bug 122814</a>. NPE in ResourceMappingMarkersTest.testResourceMappings<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122915">Bug 122915</a>. DefaultScope.getNode not accessible in strict mode<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122982">Bug 122982</a>. [KeyBindings] errors: No warning when creating an invalid keybinding sequence<br>
-  </p>
-
-<p>Integration Build (January 4, 2006, 4:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121939">Bug 121939</a>. [Viewers] TreeSelection should subclass StructuredSelection<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120934">Bug 120934</a>. [WorkbenchParts] NPE in PresentablePart.removePropertyListener(<br>
-  </p>
-
-<p>Integration Build (December 20, 2005, 08:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102626">Bug 102626</a>. [Commands] registry: org.eclipse.ui.handlers Extension point is being read incorrectly<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112005">Bug 112005</a>. [Graphics] Icon for groups of commands<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115730">Bug 115730</a>. [KeyBindings] misc: WorkbenchKeyboard circumnavigates IExecutionListener.notHandled(...)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120154">Bug 120154</a>. [Commands] parameters: extension-point schema for org.eclipse.ui.commands requires commands to have exactly 1 commandParameter<br>
-  </p>
-
-<p>Integration Build (December 14, 2005, 12:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120074">Bug 120074</a>. [Graphics] Fast view target looks like fast view icon<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120441">Bug 120441</a>. [DnD] Cancelling the Drag places trim in the wrong place<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120710">Bug 120710</a>. [FastViews] SWT error when right-clicking in the fast view toolbar<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120735">Bug 120735</a>. [DnD] Disposing the TrimCommonUIHandle causes the 'capture' to fail<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120736">Bug 120736</a>. [Markers] NPE during: &quot;Fetching children of Problems&quot;.<br>
-  </p>
-
-<p>Integration Build (December 14, 2005, 12:10 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112958">Bug 112958</a>. [Perspectives] Access to perspective descriptor when creating initial layout<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118025">Bug 118025</a>. [Dialogs] PopupDialog should set a grid data to the control returned from createDialogArea<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119494">Bug 119494</a>. [Workbench] dangerous uses of &quot;new GC(Display)&quot;<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119686">Bug 119686</a>. [PopupDialog] - small info font should be managed by JFace<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120532">Bug 120532</a>. [Markers] SWTError in TaskView on shutdown<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120565">Bug 120565</a>. org.eclipse.ui.navigator.navigatorContent extension point contains chkpii errors<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120567">Bug 120567</a>. [CommonNavigator] Javadoc warnings in 3.2 M4 Test Candidate<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120656">Bug 120656</a>. [Dialogs] SWTExeption: Widget is disposed when resizing quick outline<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120695">Bug 120695</a>. Need to swap new project png wizard banner file out for M4<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120727">Bug 120727</a>. Info text area does not appear in PopupDialog<br>
-  </p>
-
-<p>Integration Build (December 12, 2005, 8:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109661">Bug 109661</a>. [Presentation] Improve customizable window trim<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118078">Bug 118078</a>.  [Commands] handlers: Debug keybindings not working<br>
-  </p>
-
-<p>Integration Build (December 12, 2005, 4:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109661">Bug 109661</a>. [Presentation] Improve customizable window trim<br>
-  </p>
-
-<p>Integration Build (December 12, 2005, 12:00 p.m.)</p>
-  <p>Changes to the [CommonNavigator] component.</p>
-
-<p>Integration Build (December 12, 2005, 12:10 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=59476">Bug 59476</a>. [ViewMgmt] [RCP] Should have an app-level preference for whether detached views are supported<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=89250">Bug 89250</a>. [Viewers] - API Review - LazySortedCollection review comments<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=89773">Bug 89773</a>. [Viewers] Search keeps showing selection while results still being added<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103299">Bug 103299</a>. [Markers] Can't copy multiple problems from the problems view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106199">Bug 106199</a>. [plan item] Improve task assistance in text fields<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107271">Bug 107271</a>. [Preferences] [RCP] FilteredPreferenceDialog should allow history and filtering to be turned off<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109074">Bug 109074</a>. [Progress] Widget is disposed Exception in ProgressMonitorDialog.updateForSetBlocked<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109144">Bug 109144</a>. [Import/Export] Use FilteredTree in wizard selection pages if possible<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109281">Bug 109281</a>. [Viewers] ContentViewer does not null out input on handleDisposed<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109321">Bug 109321</a>. [Preferences/Properties Dialogs] Using old version of disabled arrow icon<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109661">Bug 109661</a>. [Presentation] Improve customizable window trim<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110186">Bug 110186</a>. [IDE] Prompt when clearing executable attribute on folders<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112251">Bug 112251</a>. [Progress] CopyFilesAndFoldersOperation needs to remove it's dependency on the UI Thread<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112922">Bug 112922</a>. [Markers] Problems view refreshes on add and remove<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113661">Bug 113661</a>. [Decorators] [DynamicUI] Exception in DecoratorManager caused by incorrect processing of bundle events<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114302">Bug 114302</a>. [EditorMgmt] improve API doc EditorInput#getName should never return null<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116867">Bug 116867</a>. [WorkingSets] Renamed working set appears with old name<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118845">Bug 118845</a>. [Import/Export] wizard lists not filtered according to capabilities<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118934">Bug 118934</a>. Introduce dialog trays<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119076">Bug 119076</a>. [Markers] ArrayStoreException when multiselection in Problems view includes category<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119258">Bug 119258</a>. [Markers] Marker filters should support activities.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119340">Bug 119340</a>. [PopupDialog] - need constant for horizontal spacing<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119456">Bug 119456</a>. [Dialogs] Wrong class selected from Test Selection class chooser dialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119478">Bug 119478</a>. ui.win32 and ui.carbon fragments need version updates<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119506">Bug 119506</a>. [CommonNavigator] Navigator schemas should reference, not copy, schemas from core.expressions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119599">Bug 119599</a>. [Dialogs] Every PopupDialiog is leaked if PopupDialolg.HOVER_SHELLSTYLE or SWT.ON_TOP is set<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119615">Bug 119615</a>. [PropertiesDialog] Can no longer change read-only property<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119686">Bug 119686</a>. [PopupDialog] - small info font should be managed by JFace<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119971">Bug 119971</a>. [CommonNavigator] Reshape org.eclipse.ui.navigator.navigatorContent for actions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120101">Bug 120101</a>. [WorkingSets][Graphics] Aggregates should have an icon<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120117">Bug 120117</a>. [DataBinding] Need to support images in table cells<br>
-  </p>
-
-<p>Integration Build (November 29, 2005, 12:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118414">Bug 118414</a>. [WorkingSets] Deadlock on each startup caused by AbstractWorkingSetManager<br>
-  </p>
-
-<p>Integration Build (November 29, 2005, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=42643">Bug 42643</a>. [Editor Mgmt] Need extension to intercept editor opening<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=49497">Bug 49497</a>. [RCP] JFace dependency on org.eclipse.core.runtime enlarges standalone JFace applications<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=88577">Bug 88577</a>. [Viewers] Deferred viewers in JFace have a dependency on Job<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107839">Bug 107839</a>. [WorkbenchLauncher] Startup progress bar should announce loading, not loaded<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109661">Bug 109661</a>. [Presentation] Improve customizable window trim<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112000">Bug 112000</a>. [Viewers] TreeViewer SWT.VIRTUAL support.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112222">Bug 112222</a>. [WorkbenchParts] ISaveablePart2's DEFAULT constant is respected only if a single part is being closed<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112237">Bug 112237</a>. [Graphics] Exporting key preferences shows icon of different type of key<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113832">Bug 113832</a>. [WorkingSets] No way to disable window working sets.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114527">Bug 114527</a>. [DynamicUI] Race condition in Workbench leads to intermittent crashes (org.eclipse.ui.startup)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114813">Bug 114813</a>. [DynamicUI] Incorrect synchronization will lead to JUnit failure (org.eclipse.ui.tests.dynamicplugins.DynamicPluginsTestSuite)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114931">Bug 114931</a>. [CommonNavigator] Filtering by types of content shws all content types<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114940">Bug 114940</a>. [CommonNavigator] [Discussion] Navigator extensions only operate at one level<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114993">Bug 114993</a>. [CommonNavigator] Missing NLS message<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115123">Bug 115123</a>. [CommonNavigator] [API] Update extension point schema doc for navigatorContent<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115130">Bug 115130</a>. [CommonNavigator] Port the ActionExpression enablement classes to org.eclipse.core.expressions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115486">Bug 115486</a>. [CommonNavigator] [arch] Navigator viewers should be more configurable<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115785">Bug 115785</a>. Quick dialogs don't appear after having used the menu<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116460">Bug 116460</a>. [CommonNavigator] Code review comments<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116685">Bug 116685</a>. [CommonNavigator] ClassCastException trying to execute action<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116690">Bug 116690</a>. [CommonNavigator] View title is blank<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117043">Bug 117043</a>. [MPE] Allow MultiPageEditors to customize layout<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117065">Bug 117065</a>. [CommonNavigator] Should support better filtering of duplicate content<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117358">Bug 117358</a>. [IDE] CopyFilesAndFoldersOperation needs to remove the reference to java.io.File<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117360">Bug 117360</a>. [IDE] RefreshAction needs to remove reference to java.io.file<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117362">Bug 117362</a>. [IDE] Remove references to java.io.File in org.eclipse.ui.dialogs<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117363">Bug 117363</a>. PathVariableSelectionDialog has references to java.io.file<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117364">Bug 117364</a>. [IDE] org.eclipse.ui.internal.ide.dialogs has references to java.io.File<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117519">Bug 117519</a>. Provide clear() method on ListenerList<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117539">Bug 117539</a>. Intermittent failures in ImportExistingTest<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117543">Bug 117543</a>. [Dialogs] Make long PopupDialog titles readable<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117554">Bug 117554</a>. [WorkingSets] UI usage of getName() should be migrated to getLabel()<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117559">Bug 117559</a>. [WorkingSets] WorkingSetComparator logic is backwards<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117576">Bug 117576</a>. [WorkingSets] label changes dont cause event firings<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117591">Bug 117591</a>. [CommonNavigator] References to the AWT and Swing libraries should be removed<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117601">Bug 117601</a>. [Undo] - update org.eclipse.core.commands.operations to use new equinox common utils<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117707">Bug 117707</a>. Cannot launch UiTestSuite<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117816">Bug 117816</a>. Crash while running JFace test suite<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117899">Bug 117899</a>. [WorkingSets] document new empty-aggregate strategy<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118025">Bug 118025</a>. [Dialogs] PopupDialog should set a grid data to the control returned from createDialogArea<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118043">Bug 118043</a>. [Commands] parameters: Element 'commandParameter' is not legal as a child of element 'command'<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118057">Bug 118057</a>. [CommonNavigator] ICommonContentProvider should be API<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118081">Bug 118081</a>. [CommonNavigator] Failure in OpenTest.testNavigatorExtensionEnablement<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118112">Bug 118112</a>. [CommonNavigator] Add API to programmatically enable/disable extensions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118163">Bug 118163</a>. [Dialogs] - PopupDialog should define constants for zero margins<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118170">Bug 118170</a>. [CommonNavigator] [Resource] Support Open/Open With menu extensions<br>
-  </p>
-
-<p>Integration Build (November 22, 2005, 1:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117496">Bug 117496</a>. [Commands] handlers: Stack overflow in commands<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117526">Bug 117526</a>. [Contributions] [Commands] Javadoc warnings in N20051122-0010<br>
-  </p>
-  
-<p>Integration Build (November 22, 2005, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=23889">Bug 23889</a>. [Markers] Multi-select on Task doesn't allow quickfix<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=83992">Bug 83992</a>. [Markers] Error description column in Problems is empty<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=91899">Bug 91899</a>. [Markers] IMarker.setAttribute fails when attributeName = IMarker.LOCATION<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=96891">Bug 96891</a>. Strange editorActions extensions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108097">Bug 108097</a>. [Navigator] AIOOBE when cancelling paste action override question<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109248">Bug 109248</a>. [IDE][Dialogs] Overwrite File Dialog should display file attributes<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109661">Bug 109661</a>. [Presentation] Improve customizable window trim<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109702">Bug 109702</a>. [IDE] [Progress] startup workspace refresh blocks ui<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110387">Bug 110387</a>. [WorkbenchParts] EditorPart#isDirty() method called 5 times upon opening.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112000">Bug 112000</a>. [Viewers] TreeViewer SWT.VIRTUAL support.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112146">Bug 112146</a>. [Dialogs] Eclipse changes selection after user makes a selection.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112237">Bug 112237</a>. [Graphics] Exporting key preferences shows icon of different type of key<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113643">Bug 113643</a>. [Dialogs] InputDialog NPE in setErrorMessage(...) when OK Button is created in createButtonsForButtonBar(...)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113788">Bug 113788</a>. [Markers] Multi-QuickFix dialog needs a select/deselect all button<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113832">Bug 113832</a>. [WorkingSets] No way to disable window working sets.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114295">Bug 114295</a>. [CommonNavigator] Verify copyright notices<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114565">Bug 114565</a>. [Markers] Quick fix computation done in UI thread with no progress<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114648">Bug 114648</a>. export file system/archive wizard initally has error when no selection seeded<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114754">Bug 114754</a>. [Markers] QuickFix needs API to update resolutions<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114801">Bug 114801</a>. Updates to resource info property page<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115630">Bug 115630</a>. [Markers] New markerSupport features are not dynamic<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115694">Bug 115694</a>. [Import/Export] General node in new wizards should appear first<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115800">Bug 115800</a>. [import/export] Stack overflow during import zip<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116095">Bug 116095</a>. [Preferences] ScopedPreferenceStore causing memory leak and performance degradation<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116136">Bug 116136</a>. [Dialogs] ElementListSelectionDialog.setInitialSelections() does not work<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116230">Bug 116230</a>. Failures in Session Tests (N20051113-0010)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116673">Bug 116673</a>. [Undo] Workbench still running after NullPointerException in OperationHistoryActionHandler<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116685">Bug 116685</a>. [CommonNavigator] ClassCastException trying to execute action<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116770">Bug 116770</a>. [Viewers] Memory leak in TreeViewerTest, or TreeViewer, or Tree<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116911">Bug 116911</a>. [Markers] Unused NLS messages reported in log<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117065">Bug 117065</a>. [CommonNavigator] Should support better filtering of duplicate content<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117079">Bug 117079</a>. [KeyBindings] registry: BindingPersistance should clean up its preference store listener<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117087">Bug 117087</a>. [Perspectives] PerspectiveRegistry leaking a preference store listener<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117314">Bug 117314</a>. [Commands] handlers: Failure in testSelectAllHandlerSendsSelectionEvent<br>
-  </p>
-
-<p>Integration Build (November 15, 2005, 8:00 a.m.)</p>
-  <p>New</p>
-  <p>Version numbers have been changed to include the qualifier.  This should
-  mean that every build from now on will have a unique version for our 
-  plug-ins.  The version number for all plug-ins for this release will be
-  3.2.0.qualifier.</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=69076">Bug 69076</a>. [Viewers] Bugs in jface ListViewer &quot;reveal&quot; method<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=96704">Bug 96704</a>. [Import/Export] Import doesn't import empty directories<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103501">Bug 103501</a>. Import and Export menu options should be merged.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108033">Bug 108033</a>. [WorkbenchParts] regression: View Tab Orders lost after restart<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109661">Bug 109661</a>. [Presentation] Improve customizable window trim<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113576">Bug 113576</a>. [Dialogs] PopupDialog's separator is too thin<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114591">Bug 114591</a>. [Import/Export] &quot;Copy projects into workspace&quot; remains checked after switching from archive to directory<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114658">Bug 114658</a>. [Import/Export] Import Existing Projects into Workspace - misleading wizard description<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114760">Bug 114760</a>. [Markers] Heirarchy in problems view should not be based on sort order<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115123">Bug 115123</a>. [CommonNavigator] Update extension point schema doc for navigatorContent<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115205">Bug 115205</a>. [Dialogs] Show View windows contents not resized correctly<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115218">Bug 115218</a>. [CommonNavigator] Bring back the memory mechanism removed during the port to WTP<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115283">Bug 115283</a>. [MPE] NPE in MultiPageEditorPart#pageChange(int)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115399">Bug 115399</a>. System.out stuff in MultiEditorTest<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115557">Bug 115557</a>. [WorkingSets] Select all / Deselect all for 'Select working set' dialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115575">Bug 115575</a>. [JFace] Window documentation referring to nonexistent method<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115600">Bug 115600</a>. [CommonNav] Navigator fills .log with missing NLS messages<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115672">Bug 115672</a>. [Import/Export] Spaces in a tar file checksum confuse the tar importer<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115681">Bug 115681</a>. [Viewers] NPE in show view filter<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115730">Bug 115730</a>. [KeyBindings] misc: WorkbenchKeyboard circumnavigates IExecutionListener.notHandled(...)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115731">Bug 115731</a>. WorkingCopyPreferences.removeNode is broken<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115761">Bug 115761</a>. [Undo] NPE in OperationHistoryActionHandler<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115800">Bug 115800</a>. [import/export] Stack overflow during import zip<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115891">Bug 115891</a>. [WorkingSets] Selection dialog should use radio buttons, not a combo<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115898">Bug 115898</a>. [CommonNavigator] component.xml required<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116061">Bug 116061</a>. General &gt; Appearance pref page. Restore Defaults does not change &quot;Current Theme&quot; combo<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116105">Bug 116105</a>. Bug in List.java on the Mac regarding showSelection<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116234">Bug 116234</a>. Failure in testImportSingleDirectoryWithCopyDeleteProjectKeepContents<br>
-  </p>
-
-<p>Integration Build (November 08, 2005, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=19835">Bug 19835</a>. [MPE] MultiPageEditorPart.removePage() does not dispose controls<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=62380">Bug 62380</a>. [FastViews] View menu keyboard shortcut not working in fast views<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=72297">Bug 72297</a>. [DnD] ViewerDropAdapter impossible to set DND.FEEDBACK_NONE<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=72498">Bug 72498</a>. [DetachedView] Detached windows have no minimum size<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=75422">Bug 75422</a>. [Presentations] Switching presentation to R21 switches immediately, but only partially<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=80644">Bug 80644</a>. [KeyBindings] misc: Wrong shortcut displayed in menu for copy using Emacs<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=80833">Bug 80833</a>. [Import/Export] Import exisiting should pre-check for project already in workspace<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=86999">Bug 86999</a>. [KeyBindings] misc: Ctrl+Insert shown as primary binding<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=96704">Bug 96704</a>. [Import/Export] Import doesn't import empty directories<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=100916">Bug 100916</a>. [Markers] MarkerImageProviderTest is using a missing image<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108016">Bug 108016</a>. [Markers] Need to be able to categorize marker types<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109544">Bug 109544</a>. [Themes] Make org.eclipse.ui.internal.themes.ColorUtils public API<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109977">Bug 109977</a>. [Import/Export] wizard: Order of group nodes<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111839">Bug 111839</a>. [ActivityMgmt] e.printStackTrace() in ActivityCategoryPreferencePage<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114488">Bug 114488</a>. [WorkingSets] select working set dialog should be resizable<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114514">Bug 114514</a>. [WorkingSets] Need API to detect whether a working set provide an updater or not<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114615">Bug 114615</a>. [Markers] No feedback for 'Completed' tasks<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114637">Bug 114637</a>. [Preferences] PlatformUI.getPreferenceStore() != WorkbenchPlugin.getPreferenceStore()<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114658">Bug 114658</a>. [Import/Export] Import Existing Projects into Workspace - misleading wizard description<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114665">Bug 114665</a>. [Import/Export] - Import existing projects into workspace - didn't copy files<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114784">Bug 114784</a>. [Markers][WorkingSets] Strange working set name &quot;Aggregate for window 1130948898218&quot;<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114819">Bug 114819</a>. [Progress] Groups show up twice in the progress view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114899">Bug 114899</a>. [KeyBindings] misc: Shift+Ctrl+C does not work unless explicitly redefined<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114962">Bug 114962</a>. [Decorators] Remove DecoratorUpdateListener class from IDE plug-in<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115304">Bug 115304</a>. [Progress] Color and Cursor leaks in ProgressInfoItem<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=1130948898218">Bug 1130948898218</a>. Invalid Bug ID<br>
-  </p>
-
-<p>Integration Build (November 2, 2005, 4:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114240">Bug 114240</a>. [Themes] New Dialog fonts don't take<br>
-  </p>
-
-<p>Integration Build (November 02, 2005, 12:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114742">Bug 114742</a>. Please disable Multi Quick fix support in the problems view for M3<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114773">Bug 114773</a>. [Markers] Redundant information in the Problems view when Flat<br>
-  </p>
-
-<p>Integration Build (November 02, 2005, 12:10 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114541">Bug 114541</a>. [Markers] ClassCastException selecting element in problems tree<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114542">Bug 114542</a>. [Markers] Possible to get empty path nodes in problems view hierarcahl mode<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114550">Bug 114550</a>. IndexOutOfBoundsException in Problems Hierarchal Mode<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114598">Bug 114598</a>. ClassCastException when menu popped up on Pending.<br>
-  </p>
-  
-<p>Integration Build (October 31, 2005, 8:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=77345">Bug 77345</a>. [KeyBindings] assist: Look of Key Assist dialog is not consistent with other info dialogs<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114390">Bug 114390</a>. [Markers] Show In menu item enabled for categories<br>
-  </p>
-
-<p>Integration Build (August 25, 2005, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=70597">Bug 70597</a>. [DnD] Drag and Drop PluginTransferData confusion<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=71600">Bug 71600</a>. [DetachedView] Cannot get Focus on main window title/menus after dialog box closes<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=72374">Bug 72374</a>. [Dialogs] Provide a generic info pop dialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=86307">Bug 86307</a>. [WorkbenchParts] IWorkbenchPage.openEditor() called with the activate==false, unmaximizes the current view.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=96491">Bug 96491</a>. [Presentations] Floating toolbar buttons over maximized view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102081">Bug 102081</a>. Abandon the combo box of preferenceDialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102893">Bug 102893</a>. [WorkingSets] Nested WorkingSets<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105351">Bug 105351</a>. [Presentations] Exception AbstractTabFolder.getItem<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105874">Bug 105874</a>. [DnD] [RCP] Unable to perform DROP_LINK operations in the editor area<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106346">Bug 106346</a>. Move ResourceMapping back to API package<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108162">Bug 108162</a>. [Progress] [IDE] Deadlock using MoveFilesAndFoldersOperation from a refactoring participant<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109174">Bug 109174</a>. [WorkingSets] compatibility working set to bridge new page-level functionality<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111054">Bug 111054</a>. [Markers] Filtering in problems view should consider resource mappings<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111425">Bug 111425</a>. [Markers] Problems View needs to support a category attribute for markers<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112922">Bug 112922</a>. Problems view refreshes on add and remove<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112941">Bug 112941</a>. [Markers] Need a hierarchal mode for the problems view<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113085">Bug 113085</a>. [Perspectives] perspectiveExtension: required attribute &quot;relative&quot;?<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113231">Bug 113231</a>. [Markers] Problem view does not remove old elements when refreshed<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113255">Bug 113255</a>. Double click should expand import/export trees<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113276">Bug 113276</a>. ModelProvider patch to support logical models<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113582">Bug 113582</a>. Deadlock updating marker list during builds.<br>
-  </p>
-
-<p>Integration Build (October 18, 2005, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=11428">Bug 11428</a>. Wildcard search does not work<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=11983">Bug 11983</a>. Run time workbench wizard has title cut off for large fonts.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=83711">Bug 83711</a>. [JFace] NPE in DeviceResourceManager.allocate()<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104047">Bug 104047</a>. [Dialogs] Incorrect Output from DialogSettings.save()<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106346">Bug 106346</a>. Move ResourceMapping back to API package<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110076">Bug 110076</a>. [Undo] Undo/RedoActionHandler nits<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111054">Bug 111054</a>. [Markers] Filtering in problems view should consider resource mappings<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111425">Bug 111425</a>. [Markers] Problems View needs to support a category attribute for markers<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111429">Bug 111429</a>. [Markers] Multi-select quickfix does not batch confirmation and stops on first failure<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111571">Bug 111571</a>. [Markers] Applying multiple quick fixes should allow single application<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111757">Bug 111757</a>. Fix compile errors in MANIFEST.MF<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112106">Bug 112106</a>. [KeyBindings] Changed shortcut keys don't take effect<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112136">Bug 112136</a>. ImportTestSource directory left in home directory after running tests<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112240">Bug 112240</a>. [Viewers] TableLayout should also support trees.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112247">Bug 112247</a>. [Preferences] [RCP] Should remove unused prefs for showing action bars<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112490">Bug 112490</a>. Patch to fix the mess I made<br>
-  </p>
-
-<p>Integration Build (October 04, 2005, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=2389">Bug 2389</a>. [MPE] Take out workaround in MultiPageEditorPart.pageChange(int) (1GEV94I)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=19835">Bug 19835</a>. [MPE] MultiPageEditorPart.removePage() does not dispose controls<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=20831">Bug 20831</a>. [MPE] MultiPageEditorPart.setActivePage() doesn't send pageChange()<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=23889">Bug 23889</a>. [Markers] Multi-select on Task doesn't allow quickfix<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=38642">Bug 38642</a>. [MPE] MultiEditor does not signal inner editors closing events<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=96284">Bug 96284</a>. [Properties] Clicking OK on Properties page of plugin.xml gives unexpected &quot;Conflict in Encoding&quot;<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=99858">Bug 99858</a>. [IDE] Error upon deleting a project.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=100693">Bug 100693</a>. [Import/Export] junit tests for WizardProjectsImportPage<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107377">Bug 107377</a>. [GlobalActions] NPE deleting a file<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107978">Bug 107978</a>. [Markers] New filter is not selected in problems filters dialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108314">Bug 108314</a>. [Contributions] PopupMenuExtender does not update list of static actions when new menu ids are added<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108556">Bug 108556</a>. [Progress} ProgressView: width of entries no longer fixed, results in hor. scrollbars and lots of flicker<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108705">Bug 108705</a>. [Contributions] errors: ObjectActionContributor should safeguard against misbehaving plugins<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108709">Bug 108709</a>. [Contributions] Every single Java editor is leaked<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109052">Bug 109052</a>. Exposure of workbench part controls to clients<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109329">Bug 109329</a>. [Progress] Tooltip in progress dialog is shortened<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109474">Bug 109474</a>. [EditorMgmt] Multiple Editors closing at once<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109846">Bug 109846</a>. [KeyBindings] Emacs C-x C-f binding<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110331">Bug 110331</a>. add tests for import/export<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110793">Bug 110793</a>. Need test suites for declarative filters<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111057">Bug 111057</a>. [Markers] Show In Support needs to be pluggable<br>
-  </p>
-
-<p>Integration Build (September 27, 2005, 12:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110354">Bug 110354</a>. [WorkbenchParts] NPE dragging view from fast view bar.<br>
-  </p>
-
-<p>Integration Build (September 27, 2005, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107121">Bug 107121</a>. [EditorMgmt] not responding when opening a folder with a lot of files<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108015">Bug 108015</a>. [Markers] Filters need to be created, enabled and disabled declaratively<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109639">Bug 109639</a>. [KeyBindings] keybinding service is deactivated but not reactivated when unregister action<br>
-  </p>
-
-<p>Integration Build (September 22, 2005, 12:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110243">Bug 110243</a>. heap monitor causes errors during tests<br>
-  </p>
-
-<p>Integration Build (September 21, 2005, 4:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109011">Bug 109011</a>. [KeyBindings] AIOOBE on startup<br>
-  </p>
-
-<p>Integration Build (August 30, 2005, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76092">Bug 76092</a>. [Themes] Fonts preference page shows always &quot;defaults to ... font&quot;<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=96600">Bug 96600</a>. [DynamicUI] [Commands] [Contexts] [KeyBindings] Commands architecture isn't dynamic<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=98621">Bug 98621</a>. [refactoring] [rename] Rename Type hangs<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102485">Bug 102485</a>. [Import/Export] Export to filesystem loses current selection in Package Explorer<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106959">Bug 106959</a>. [Contributions] missing mnemonics in the main menu bar<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107854">Bug 107854</a>. [Contributions] errors: Context menu missing<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107977">Bug 107977</a>. MutliEditorTests are failing on N20050825<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108012">Bug 108012</a>. [Markers] Multi filters do not update when filter is disabled<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108013">Bug 108013</a>. [Markers] Filters need to be enabled faster than opening the dialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108017">Bug 108017</a>. [Markers] Disabling a marker type disables the whole filter<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108143">Bug 108143</a>. [Import/Export] error message does not go away when resources are selected for import<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108144">Bug 108144</a>. [Undo] - action handlers should refer adapter requests to their part<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=20050825">Bug 20050825</a>. Invalid Bug ID<br>
-  </p>
-
-<p>Integration Build (August 23, 2005, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=64874">Bug 64874</a>. [Themes] [Preferences] Colors and Fonts preference page: Doubleclick should edit<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=66526">Bug 66526</a>. [Dialogs] Review the design of MessageDialogWithToggle.createButtonsForButtonBar<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67375">Bug 67375</a>. [Themes] Description area in the &quot;colors and font preferences&quot; is not big enough<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=68787">Bug 68787</a>. [Markers] Messages need to be converted to the new format<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=70321">Bug 70321</a>. [Preferences] TVT 3.0: Project reference properties page clipped in Italian language pack<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76978">Bug 76978</a>. [ErrorHandling] WorkbenchPlugin logs to System.err<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=78777">Bug 78777</a>. [DynamicUI] Uncategorized views don't show up when added<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=82502">Bug 82502</a>. [Markers] tasklist entries not showing up consistently<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=82743">Bug 82743</a>. [Markers] improved problem filter needed (OR clauses)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=90646">Bug 90646</a>. [Viewers] SWTException from DeferredContentProvider<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=97308">Bug 97308</a>. [Preferences] &quot;New text file encoding / line delimiter&quot; preferences should be on General &gt; Workspace<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=98800">Bug 98800</a>. [Workbench] Ant buildfile removed from fast view Ant View after restart<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=98943">Bug 98943</a>. [Doc] [WorkingSets] Nitpicking extension point doc<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=101180">Bug 101180</a>. [Import/Export] Import Existing Project into Workspace default widget is back button , should be text field<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=101683">Bug 101683</a>. [WorkbenchParts] Views opened by context enablement are covered up by buttons from Breakpoints View<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102102">Bug 102102</a>. [Import/Export] build running after each imported project<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105649">Bug 105649</a>. [Undo] - NPE in ObjectUndoContext#getLabel() if object is null<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106532">Bug 106532</a>. [Import/Export] preference page has extra border<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106890">Bug 106890</a>. [Import/Export] Import wizard may display unexpected second page if you just press Next<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107121">Bug 107121</a>. [EditorMgmt] not responding when opening a folder with a lot of files<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107369">Bug 107369</a>. [Tests] RCP test suite hangs on GTK<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107376">Bug 107376</a>. VirtualTableViewerTest needs to force item creation<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107471">Bug 107471</a>. [Progress] Reusing indeterminate progress makes for strange selection<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107660">Bug 107660</a>. [Themes] Busy cursor on Font Editing doesn't go away<br>
-  </p>
-
-
-<p>Integration Build (August 10, 2005, 12:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=84881">Bug 84881</a>. [WorkbenchLauncher] Splash screen receives focus after task switch (instead of workspace launcher dialog) [revert]<br>
-  </p>
-
-<p>Integration Build (August 10, 2005, 12:10 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=84881">Bug 84881</a>. [WorkbenchLauncher] Splash screen receives focus after task switch (instead of workspace launcher dialog)<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=85608">Bug 85608</a>. [ViewMgmt] [EditorMgmt] Create option to disable views that open automatically<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104987">Bug 104987</a>. view contents missing when switching perspectives<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105949">Bug 105949</a>. [ActionSets] Problem with ActionSets<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106360">Bug 106360</a>. NPE when defining a decorator with no enablement<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106363">Bug 106363</a>. [Decorators] Decorator schema inconsistent with extension point<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106388">Bug 106388</a>. Directory dialog is unusably slow<br>
-  </p>
-
-<p>Integration Build (August 08, 2005, 12:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102081">Bug 102081</a>. Abandon the combo box of preferenceDialog<br/>
-  </p>
-
-<p>Integration Build (August 08, 2005, 12:10 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=7022">Bug 7022</a>. [Workbench] Splash screen with progress bar<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=17826">Bug 17826</a>. [Wizards] New folder wizard is very large if you are creating the folder in a container with a very long path<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=29398">Bug 29398</a>. [MPE] Allow bookmarks and tasks in plugin.xml source<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=66666">Bug 66666</a>. [DetachedView] Cannot copy from a detached view if a selection is made in the main window<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76496">Bug 76496</a>. [Dialogs] &quot;Open Resource&quot; folder sorting gets reversed<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=84824">Bug 84824</a>. [Preferences] Workbench Preference Dialog only saves Workbench preference store<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=85608">Bug 85608</a>. [ViewMgmt] [EditorMgmt] Create option to disable views that open automatically<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=86159">Bug 86159</a>. [Decorators] Make lightweight decorators work for ResourceMapping<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=90355">Bug 90355</a>. [Contributions] [Coolbars] Investigate the performance of subactionbars<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=93998">Bug 93998</a>. [Editor Mgmt] [MPE] MultiPageEditorSite.registerContextMenu methods are inconsistent in whether they delegate<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=94547">Bug 94547</a>. [Decorators] [Navigator] (leak) Dangling references to ResourceNavigator<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=95815">Bug 95815</a>. [Progress] Canceling a job re-enters JobManager.cancel<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=97882">Bug 97882</a>. [Viewers] Virtual Table Viewer test's Reset Input does not restore items at end<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=99858">Bug 99858</a>. [IDE] Error upon deleting a project.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=99864">Bug 99864</a>. [Viewers] NPE in DeferredTreeContentManager$1.isParent<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=101065">Bug 101065</a>. [Markers] Marker image lookup not nl enabled<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102081">Bug 102081</a>. Abandon the combo box of preferenceDialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105576">Bug 105576</a>. TVT 3.1 - TCT 467 - Disable All and Enable All strings not externalized for translation<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105665">Bug 105665</a>. [Dialogs] &quot;Open resource&quot; dialog doesnt remember it position and size<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105731">Bug 105731</a>. TVT 3.1 - TCT 528 - Duplicated Mneumonic in Problem -&gt; Filters<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105776">Bug 105776</a>. [Progress] Clients of ProgressMonitorFocusJobDialog.runAsync can can cause widget disposed error<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105809">Bug 105809</a>. Mnemonics are programmatically changed, should not be<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105816">Bug 105816</a>. Extraneous NLS tag incorrectly found in comments<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105837">Bug 105837</a>. [Markers] Mnemonic conflicts in Marker views<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105913">Bug 105913</a>. Deprecations in ReadOnlyStateChecker<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105936">Bug 105936</a>. [Contributions] interactions: No submenu for &quot;Run As&quot;<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106157">Bug 106157</a>. [Progress] [Dialogs] Can't close error dialog<br>
-  </p>
-
-<p>Integration Build (August 02, 2005, 8:00 a.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=61950">Bug 61950</a>. [Markers] Images being created twice potentially<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=101215">Bug 101215</a>. [Undo] Undo affecting outside files should allow &quot;Cancel action&quot;<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103501">Bug 103501</a>. Import and Export menu options should be merged.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104558">Bug 104558</a>. [Workbench] [RCP] Default values for WorkbenchWindow.getPerspectiveBarVisible/CoolBarVisible do not match the values provided by the configurer<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104987">Bug 104987</a>. view contents missing when switching perspectives<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105222">Bug 105222</a>. [BIDI] need to nl %Views.ResourceNavigator and Views - %Views.ContentOutline<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105503">Bug 105503</a>. [ViewMgmt] Outline view loses toolbars on restart<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105648">Bug 105648</a>. [Undo] - ObjectUndoContext should match if objects are equal<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105649">Bug 105649</a>. [Undo] - NPE in ObjectUndoContext#getLabel() if object is null<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105697">Bug 105697</a>. [Undo] - OperationHistoryEvent - cannot distinguish between canceled event or failed event<br>
-  </p>
-
-<p>Integration Build (July 26, 2005, 12:00 p.m.)</p>
-  <p>Problem reports fixed</p>
-  <p>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=50323">Bug 50323</a>. [Workbench] Add a -showlabel &quot;Workspace Label&quot; startup option<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=66616">Bug 66616</a>. [PropertiesView] ComboBoxPropertyDescriptor doesn't work in PropertySheetView<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=69892">Bug 69892</a>. [Tests] Investigate UI test suites on Mac OS X<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=71946">Bug 71946</a>. 4 detached windows tests fail on Mac OS 10.3.3<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76714">Bug 76714</a>. [Dialogs] ContainerSelectDialog: Double clicking node in tree causes AssertionException<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=88791">Bug 88791</a>. [Wizards] TVT3.1 #93 - Variables button is truncated in New File advanced options in RUS<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=90353">Bug 90353</a>. [PresentationAPI] Cache widgets for recently opened perspectives<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=90355">Bug 90355</a>. [JFace] [Coolbars] Investigate the performance of subactionbars<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=92286">Bug 92286</a>. [WorkbenchParts] Request new API for EditorPart<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=93674">Bug 93674</a>. [Dialogs] ProgressMonitorDialog not cancellable when fork is set to false<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=96129">Bug 96129</a>. [MPE] (regression) MultiEditor.getInnerEditors() returns null.<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=100156">Bug 100156</a>. [IDE] RenameResourceAction should use IAdaptable for IResource lookuop<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=100325">Bug 100325</a>. [CellEditors] Table cell editor does not get deactivated on lost focus<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=100889">Bug 100889</a>. [Undo] - AbstractOperation toString() appends bogus comma<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=101346">Bug 101346</a>. [FastViews][WorkbenchParts] Problems with views drawing when they shouldn't<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=101434">Bug 101434</a>. [Contexts] performance: Slow cursor navigation in Text fields<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=101584">Bug 101584</a>. [Examples] - Build problem with new undo example<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=101950">Bug 101950</a>. About menu item in PDE-generated product says &quot;About Eclipse Platform&quot;<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102033">Bug 102033</a>. [Performance] TableViewerTests too fast on windows<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102081">Bug 102081</a>. Abandon the combo box of preferenceDialog<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102127">Bug 102127</a>. [DetachedViews] attaching an editor to detached view cause ClassCastException<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102439">Bug 102439</a>. [PropertiesView] PropertySheetEntry should format error message when calling setErrorText<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102911">Bug 102911</a>. [KeyBindings] assist: Not correctly sized when window is narrow or short<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103379">Bug 103379</a>. [MPE] [EditorMgmt] An editor instance is being leaked each time an editor is open and closed<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104280">Bug 104280</a>. Support the 'toolbar' button on OS X<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104657">Bug 104657</a>. [Undo] NPE in OperationHistoryActionHandler<br>
-<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104991">Bug 104991</a>. [WorkbenchParts] Cannot reopen closed views<br>
-  </p>
-
-</body>
-</html>
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/backward_nav.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/backward_nav.gif
deleted file mode 100644
index 2972ff5..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/backward_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/close_view.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/close_view.gif
deleted file mode 100644
index 1aca259..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/close_view.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/collapseall.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/collapseall.gif
deleted file mode 100644
index 7dc0de5..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/collapseall.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/forward_nav.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/forward_nav.gif
deleted file mode 100644
index 319fe8d..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/forward_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/home_nav.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/home_nav.gif
deleted file mode 100644
index 819e85b..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/home_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/linkto_help.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/linkto_help.gif
deleted file mode 100644
index 267c040..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/linkto_help.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/min_view.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/min_view.gif
deleted file mode 100644
index 7402dc9..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/min_view.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/pin_view.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/pin_view.gif
deleted file mode 100644
index 84e330d..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/pin_view.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/progress_rem.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/progress_rem.gif
deleted file mode 100644
index 559e462..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/progress_rem.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/progress_remall.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/progress_remall.gif
deleted file mode 100644
index ecd1be5..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/progress_remall.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/progress_stop.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/progress_stop.gif
deleted file mode 100644
index 4f3dcba..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/progress_stop.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/refresh_nav.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/refresh_nav.gif
deleted file mode 100644
index c5c70e1..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/refresh_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/step_current.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/step_current.gif
deleted file mode 100644
index 319fe8d..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/step_current.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/step_done.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/step_done.gif
deleted file mode 100644
index 0e83deb..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/step_done.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/synced.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/synced.gif
deleted file mode 100644
index 4f6e43a..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/synced.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/trash.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/trash.gif
deleted file mode 100644
index 10e35b1..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/trash.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/up_nav.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/up_nav.gif
deleted file mode 100644
index d4ce22b..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/up_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dlcl16/view_menu.gif b/bundles/org.eclipse.ui/icons/full/dlcl16/view_menu.gif
deleted file mode 100644
index a492838..0000000
--- a/bundles/org.eclipse.ui/icons/full/dlcl16/view_menu.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/clear_co.gif b/bundles/org.eclipse.ui/icons/full/dtool16/clear_co.gif
deleted file mode 100644
index 7f32480..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/clear_co.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/copy_edit.gif b/bundles/org.eclipse.ui/icons/full/dtool16/copy_edit.gif
deleted file mode 100644
index 98626a8..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/copy_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/cut_edit.gif b/bundles/org.eclipse.ui/icons/full/dtool16/cut_edit.gif
deleted file mode 100644
index bd43144..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/cut_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/delete_edit.gif b/bundles/org.eclipse.ui/icons/full/dtool16/delete_edit.gif
deleted file mode 100644
index 9e14298..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/delete_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/export_wiz.gif b/bundles/org.eclipse.ui/icons/full/dtool16/export_wiz.gif
deleted file mode 100644
index 3f89cd9..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/export_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/help_contents.gif b/bundles/org.eclipse.ui/icons/full/dtool16/help_contents.gif
deleted file mode 100644
index 74bf617..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/help_contents.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/import_wiz.gif b/bundles/org.eclipse.ui/icons/full/dtool16/import_wiz.gif
deleted file mode 100644
index cd44741..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/import_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/new_fastview.gif b/bundles/org.eclipse.ui/icons/full/dtool16/new_fastview.gif
deleted file mode 100644
index c1f714d..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/new_fastview.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/new_wiz.gif b/bundles/org.eclipse.ui/icons/full/dtool16/new_wiz.gif
deleted file mode 100644
index f656481..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/new_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/paste_edit.gif b/bundles/org.eclipse.ui/icons/full/dtool16/paste_edit.gif
deleted file mode 100644
index 1c7668d..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/paste_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/pin_editor.gif b/bundles/org.eclipse.ui/icons/full/dtool16/pin_editor.gif
deleted file mode 100644
index eac7c8e..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/pin_editor.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/print_edit.gif b/bundles/org.eclipse.ui/icons/full/dtool16/print_edit.gif
deleted file mode 100644
index 4d2722f..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/print_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/redo_edit.gif b/bundles/org.eclipse.ui/icons/full/dtool16/redo_edit.gif
deleted file mode 100644
index 04e8840..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/redo_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/save_edit.gif b/bundles/org.eclipse.ui/icons/full/dtool16/save_edit.gif
deleted file mode 100644
index ad505a9..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/save_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/saveall_edit.gif b/bundles/org.eclipse.ui/icons/full/dtool16/saveall_edit.gif
deleted file mode 100644
index ee1f41d..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/saveall_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/saveas_edit.gif b/bundles/org.eclipse.ui/icons/full/dtool16/saveas_edit.gif
deleted file mode 100644
index df83a54..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/saveas_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/show_support.gif b/bundles/org.eclipse.ui/icons/full/dtool16/show_support.gif
deleted file mode 100644
index 54525a7..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/show_support.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/dtool16/undo_edit.gif b/bundles/org.eclipse.ui/icons/full/dtool16/undo_edit.gif
deleted file mode 100644
index c081984..0000000
--- a/bundles/org.eclipse.ui/icons/full/dtool16/undo_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/backward_nav.gif b/bundles/org.eclipse.ui/icons/full/elcl16/backward_nav.gif
deleted file mode 100644
index 4fb4150..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/backward_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/button_menu.gif b/bundles/org.eclipse.ui/icons/full/elcl16/button_menu.gif
deleted file mode 100644
index ab2797a..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/button_menu.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/close_view.gif b/bundles/org.eclipse.ui/icons/full/elcl16/close_view.gif
deleted file mode 100644
index 1aca259..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/close_view.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/collapseall.gif b/bundles/org.eclipse.ui/icons/full/elcl16/collapseall.gif
deleted file mode 100644
index a2d80a9..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/collapseall.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/forward_nav.gif b/bundles/org.eclipse.ui/icons/full/elcl16/forward_nav.gif
deleted file mode 100644
index e2f8c3e..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/forward_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/home_nav.gif b/bundles/org.eclipse.ui/icons/full/elcl16/home_nav.gif
deleted file mode 100644
index 4472e8c..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/home_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/linkto_help.gif b/bundles/org.eclipse.ui/icons/full/elcl16/linkto_help.gif
deleted file mode 100644
index 86550fe..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/linkto_help.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/min_view.gif b/bundles/org.eclipse.ui/icons/full/elcl16/min_view.gif
deleted file mode 100644
index 7402dc9..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/min_view.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/pin_view.gif b/bundles/org.eclipse.ui/icons/full/elcl16/pin_view.gif
deleted file mode 100644
index 381c4a9..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/pin_view.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/progress_rem.gif b/bundles/org.eclipse.ui/icons/full/elcl16/progress_rem.gif
deleted file mode 100644
index 2cd9c54..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/progress_rem.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/progress_remall.gif b/bundles/org.eclipse.ui/icons/full/elcl16/progress_remall.gif
deleted file mode 100644
index 28a3785..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/progress_remall.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/progress_stop.gif b/bundles/org.eclipse.ui/icons/full/elcl16/progress_stop.gif
deleted file mode 100644
index dc47edf..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/progress_stop.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/refresh_nav.gif b/bundles/org.eclipse.ui/icons/full/elcl16/refresh_nav.gif
deleted file mode 100644
index 049cac6..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/refresh_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/step_current.gif b/bundles/org.eclipse.ui/icons/full/elcl16/step_current.gif
deleted file mode 100644
index e3a7cc7..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/step_current.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/step_done.gif b/bundles/org.eclipse.ui/icons/full/elcl16/step_done.gif
deleted file mode 100644
index 9cacb96..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/step_done.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/synced.gif b/bundles/org.eclipse.ui/icons/full/elcl16/synced.gif
deleted file mode 100644
index 870934b..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/synced.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/thin_close_view.gif b/bundles/org.eclipse.ui/icons/full/elcl16/thin_close_view.gif
deleted file mode 100644
index 44b6151..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/thin_close_view.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/thin_hide_toolbar.GIF b/bundles/org.eclipse.ui/icons/full/elcl16/thin_hide_toolbar.GIF
deleted file mode 100644
index 5858e4a..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/thin_hide_toolbar.GIF
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/thin_max_view.gif b/bundles/org.eclipse.ui/icons/full/elcl16/thin_max_view.gif
deleted file mode 100644
index 94ed448..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/thin_max_view.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/thin_min_view.gif b/bundles/org.eclipse.ui/icons/full/elcl16/thin_min_view.gif
deleted file mode 100644
index bd2ed2d..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/thin_min_view.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/thin_restore_view.GIF b/bundles/org.eclipse.ui/icons/full/elcl16/thin_restore_view.GIF
deleted file mode 100644
index 942d60c..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/thin_restore_view.GIF
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/thin_show_toolbar.GIF b/bundles/org.eclipse.ui/icons/full/elcl16/thin_show_toolbar.GIF
deleted file mode 100644
index eda10ab..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/thin_show_toolbar.GIF
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/thin_view_menu.GIF b/bundles/org.eclipse.ui/icons/full/elcl16/thin_view_menu.GIF
deleted file mode 100644
index 21ec7f1..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/thin_view_menu.GIF
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/trash.gif b/bundles/org.eclipse.ui/icons/full/elcl16/trash.gif
deleted file mode 100644
index bf961b3..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/trash.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/up_nav.gif b/bundles/org.eclipse.ui/icons/full/elcl16/up_nav.gif
deleted file mode 100644
index 884952f..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/up_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/elcl16/view_menu.gif b/bundles/org.eclipse.ui/icons/full/elcl16/view_menu.gif
deleted file mode 100644
index a492838..0000000
--- a/bundles/org.eclipse.ui/icons/full/elcl16/view_menu.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/clear_co.gif b/bundles/org.eclipse.ui/icons/full/etool16/clear_co.gif
deleted file mode 100644
index 2d3935a..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/clear_co.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/copy_edit.gif b/bundles/org.eclipse.ui/icons/full/etool16/copy_edit.gif
deleted file mode 100644
index 71d7c95..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/copy_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/cut_edit.gif b/bundles/org.eclipse.ui/icons/full/etool16/cut_edit.gif
deleted file mode 100644
index d044e59..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/cut_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/delete_edit.gif b/bundles/org.eclipse.ui/icons/full/etool16/delete_edit.gif
deleted file mode 100644
index b6922ac..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/delete_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/editor_area.gif b/bundles/org.eclipse.ui/icons/full/etool16/editor_area.gif
deleted file mode 100644
index 4b6b768..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/editor_area.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/export_wiz.gif b/bundles/org.eclipse.ui/icons/full/etool16/export_wiz.gif
deleted file mode 100644
index 5a0837d..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/export_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/fastview_restore.gif b/bundles/org.eclipse.ui/icons/full/etool16/fastview_restore.gif
deleted file mode 100644
index e0010df..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/fastview_restore.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/help_contents.gif b/bundles/org.eclipse.ui/icons/full/etool16/help_contents.gif
deleted file mode 100644
index 9d70301..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/help_contents.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/help_search.gif b/bundles/org.eclipse.ui/icons/full/etool16/help_search.gif
deleted file mode 100644
index f0f5d83..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/help_search.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/import_wiz.gif b/bundles/org.eclipse.ui/icons/full/etool16/import_wiz.gif
deleted file mode 100644
index d38085a..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/import_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/new_fastview.gif b/bundles/org.eclipse.ui/icons/full/etool16/new_fastview.gif
deleted file mode 100644
index 0f282ca..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/new_fastview.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/new_wiz.gif b/bundles/org.eclipse.ui/icons/full/etool16/new_wiz.gif
deleted file mode 100644
index 7aea894..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/new_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/paste_edit.gif b/bundles/org.eclipse.ui/icons/full/etool16/paste_edit.gif
deleted file mode 100644
index 39dd4d9..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/paste_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/pin_editor.gif b/bundles/org.eclipse.ui/icons/full/etool16/pin_editor.gif
deleted file mode 100644
index dfc1dab..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/pin_editor.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/print_edit.gif b/bundles/org.eclipse.ui/icons/full/etool16/print_edit.gif
deleted file mode 100644
index 04cb84b..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/print_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/redo_edit.gif b/bundles/org.eclipse.ui/icons/full/etool16/redo_edit.gif
deleted file mode 100644
index c84e5b1..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/redo_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/save_edit.gif b/bundles/org.eclipse.ui/icons/full/etool16/save_edit.gif
deleted file mode 100644
index 499dd0c..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/save_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/saveall_edit.gif b/bundles/org.eclipse.ui/icons/full/etool16/saveall_edit.gif
deleted file mode 100644
index ef0eab5..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/saveall_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/saveas_edit.gif b/bundles/org.eclipse.ui/icons/full/etool16/saveas_edit.gif
deleted file mode 100644
index 466bfb1..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/saveas_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/etool16/undo_edit.gif b/bundles/org.eclipse.ui/icons/full/etool16/undo_edit.gif
deleted file mode 100644
index eae118a..0000000
--- a/bundles/org.eclipse.ui/icons/full/etool16/undo_edit.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/eview16/bkmrk_nav.gif b/bundles/org.eclipse.ui/icons/full/eview16/bkmrk_nav.gif
deleted file mode 100644
index 8eefad3..0000000
--- a/bundles/org.eclipse.ui/icons/full/eview16/bkmrk_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/eview16/default_persp.gif b/bundles/org.eclipse.ui/icons/full/eview16/default_persp.gif
deleted file mode 100644
index 6ff3783..0000000
--- a/bundles/org.eclipse.ui/icons/full/eview16/default_persp.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/eview16/defaultview_misc.gif b/bundles/org.eclipse.ui/icons/full/eview16/defaultview_misc.gif
deleted file mode 100644
index 55ca8f3..0000000
--- a/bundles/org.eclipse.ui/icons/full/eview16/defaultview_misc.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/eview16/filenav_nav.gif b/bundles/org.eclipse.ui/icons/full/eview16/filenav_nav.gif
deleted file mode 100644
index 4b98a62..0000000
--- a/bundles/org.eclipse.ui/icons/full/eview16/filenav_nav.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/eview16/new_persp.gif b/bundles/org.eclipse.ui/icons/full/eview16/new_persp.gif
deleted file mode 100644
index a47d473..0000000
--- a/bundles/org.eclipse.ui/icons/full/eview16/new_persp.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/eview16/outline_co.gif b/bundles/org.eclipse.ui/icons/full/eview16/outline_co.gif
deleted file mode 100644
index 0dc862c..0000000
--- a/bundles/org.eclipse.ui/icons/full/eview16/outline_co.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/eview16/problems_view.gif b/bundles/org.eclipse.ui/icons/full/eview16/problems_view.gif
deleted file mode 100644
index 807b28a..0000000
--- a/bundles/org.eclipse.ui/icons/full/eview16/problems_view.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/eview16/prop_ps.gif b/bundles/org.eclipse.ui/icons/full/eview16/prop_ps.gif
deleted file mode 100644
index d11c996..0000000
--- a/bundles/org.eclipse.ui/icons/full/eview16/prop_ps.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/eview16/tasks_tsk.gif b/bundles/org.eclipse.ui/icons/full/eview16/tasks_tsk.gif
deleted file mode 100644
index d3d10f5..0000000
--- a/bundles/org.eclipse.ui/icons/full/eview16/tasks_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/activity.gif b/bundles/org.eclipse.ui/icons/full/obj16/activity.gif
deleted file mode 100644
index 7c3356c..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/activity.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/activity_category.gif b/bundles/org.eclipse.ui/icons/full/obj16/activity_category.gif
deleted file mode 100644
index 15c223e..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/activity_category.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/add_obj.gif b/bundles/org.eclipse.ui/icons/full/obj16/add_obj.gif
deleted file mode 100644
index 252d7eb..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/add_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/blank.gif b/bundles/org.eclipse.ui/icons/full/obj16/blank.gif
deleted file mode 100644
index 0a64b75..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/blank.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/change_obj.gif b/bundles/org.eclipse.ui/icons/full/obj16/change_obj.gif
deleted file mode 100644
index ce8bdb9..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/change_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/delete_obj.gif b/bundles/org.eclipse.ui/icons/full/obj16/delete_obj.gif
deleted file mode 100644
index b6922ac..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/delete_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/elements_obj.gif b/bundles/org.eclipse.ui/icons/full/obj16/elements_obj.gif
deleted file mode 100644
index 33be7d8..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/elements_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/error_tsk.gif b/bundles/org.eclipse.ui/icons/full/obj16/error_tsk.gif
deleted file mode 100644
index 9b048d6..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/error_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/file_obj.gif b/bundles/org.eclipse.ui/icons/full/obj16/file_obj.gif
deleted file mode 100644
index 7ccc6a7..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/file_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/fldr_obj.gif b/bundles/org.eclipse.ui/icons/full/obj16/fldr_obj.gif
deleted file mode 100644
index 51e703b..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/fldr_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/font.gif b/bundles/org.eclipse.ui/icons/full/obj16/font.gif
deleted file mode 100644
index 6538949..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/font.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/generic_element.gif b/bundles/org.eclipse.ui/icons/full/obj16/generic_element.gif
deleted file mode 100644
index bf043f9..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/generic_element.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/generic_elements.gif b/bundles/org.eclipse.ui/icons/full/obj16/generic_elements.gif
deleted file mode 100644
index 31c40ea..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/generic_elements.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/info_tsk.gif b/bundles/org.eclipse.ui/icons/full/obj16/info_tsk.gif
deleted file mode 100644
index 2da001e..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/info_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/keygroups_obj.gif b/bundles/org.eclipse.ui/icons/full/obj16/keygroups_obj.gif
deleted file mode 100644
index fbc00a9..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/keygroups_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/layout_co.gif b/bundles/org.eclipse.ui/icons/full/obj16/layout_co.gif
deleted file mode 100644
index c98cdd4..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/layout_co.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/menu.gif b/bundles/org.eclipse.ui/icons/full/obj16/menu.gif
deleted file mode 100644
index c46ec73..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/menu.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/separator.gif b/bundles/org.eclipse.ui/icons/full/obj16/separator.gif
deleted file mode 100644
index b6508c0..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/separator.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/signed_no_tbl.gif b/bundles/org.eclipse.ui/icons/full/obj16/signed_no_tbl.gif
deleted file mode 100644
index c9b1ba9..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/signed_no_tbl.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/signed_unkn_tbl.gif b/bundles/org.eclipse.ui/icons/full/obj16/signed_unkn_tbl.gif
deleted file mode 100644
index 4a91897..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/signed_unkn_tbl.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/signed_yes_tbl.gif b/bundles/org.eclipse.ui/icons/full/obj16/signed_yes_tbl.gif
deleted file mode 100644
index 3a174cc..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/signed_yes_tbl.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/submenu.gif b/bundles/org.eclipse.ui/icons/full/obj16/submenu.gif
deleted file mode 100644
index 2228dc8..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/submenu.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/theme_category.gif b/bundles/org.eclipse.ui/icons/full/obj16/theme_category.gif
deleted file mode 100644
index 68079f9..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/theme_category.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/toolbar.gif b/bundles/org.eclipse.ui/icons/full/obj16/toolbar.gif
deleted file mode 100644
index d8735b8..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/toolbar.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/warn_tsk.gif b/bundles/org.eclipse.ui/icons/full/obj16/warn_tsk.gif
deleted file mode 100644
index 14009e9..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/warn_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/obj16/workingsets.gif b/bundles/org.eclipse.ui/icons/full/obj16/workingsets.gif
deleted file mode 100644
index fa8c9f7..0000000
--- a/bundles/org.eclipse.ui/icons/full/obj16/workingsets.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/ovr16/lock_ovr.gif b/bundles/org.eclipse.ui/icons/full/ovr16/lock_ovr.gif
deleted file mode 100644
index 70edbb4..0000000
--- a/bundles/org.eclipse.ui/icons/full/ovr16/lock_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/ovr16/pinned_ovr.gif b/bundles/org.eclipse.ui/icons/full/ovr16/pinned_ovr.gif
deleted file mode 100644
index 2f3b201..0000000
--- a/bundles/org.eclipse.ui/icons/full/ovr16/pinned_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/bottom_mask.bmp b/bundles/org.eclipse.ui/icons/full/pointer/bottom_mask.bmp
deleted file mode 100644
index 22eb40d..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/bottom_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/bottom_source.bmp b/bundles/org.eclipse.ui/icons/full/pointer/bottom_source.bmp
deleted file mode 100644
index 4d243c6..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/bottom_source.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/invalid_mask.bmp b/bundles/org.eclipse.ui/icons/full/pointer/invalid_mask.bmp
deleted file mode 100644
index 22eb40d..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/invalid_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/invalid_source.bmp b/bundles/org.eclipse.ui/icons/full/pointer/invalid_source.bmp
deleted file mode 100644
index b53df6f..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/invalid_source.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/left_mask.bmp b/bundles/org.eclipse.ui/icons/full/pointer/left_mask.bmp
deleted file mode 100644
index 22eb40d..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/left_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/left_source.bmp b/bundles/org.eclipse.ui/icons/full/pointer/left_source.bmp
deleted file mode 100644
index 48d3098..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/left_source.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/offscreen_mask.bmp b/bundles/org.eclipse.ui/icons/full/pointer/offscreen_mask.bmp
deleted file mode 100644
index 8fa7b96..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/offscreen_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/offscreen_source.bmp b/bundles/org.eclipse.ui/icons/full/pointer/offscreen_source.bmp
deleted file mode 100644
index 85de577..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/offscreen_source.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/right_mask.bmp b/bundles/org.eclipse.ui/icons/full/pointer/right_mask.bmp
deleted file mode 100644
index 22eb40d..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/right_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/right_source.bmp b/bundles/org.eclipse.ui/icons/full/pointer/right_source.bmp
deleted file mode 100644
index 8bc50f4..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/right_source.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/stack_mask.bmp b/bundles/org.eclipse.ui/icons/full/pointer/stack_mask.bmp
deleted file mode 100644
index 5bad51c..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/stack_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/stack_source.bmp b/bundles/org.eclipse.ui/icons/full/pointer/stack_source.bmp
deleted file mode 100644
index 7a8fc84..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/stack_source.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/tofastview_mask.bmp b/bundles/org.eclipse.ui/icons/full/pointer/tofastview_mask.bmp
deleted file mode 100644
index 22eb40d..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/tofastview_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/tofastview_source.bmp b/bundles/org.eclipse.ui/icons/full/pointer/tofastview_source.bmp
deleted file mode 100644
index d461156..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/tofastview_source.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/top_mask.bmp b/bundles/org.eclipse.ui/icons/full/pointer/top_mask.bmp
deleted file mode 100644
index 22eb40d..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/top_mask.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/pointer/top_source.bmp b/bundles/org.eclipse.ui/icons/full/pointer/top_source.bmp
deleted file mode 100644
index 5255241..0000000
--- a/bundles/org.eclipse.ui/icons/full/pointer/top_source.bmp
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/progress/errorstate.gif b/bundles/org.eclipse.ui/icons/full/progress/errorstate.gif
deleted file mode 100644
index a3b621b..0000000
--- a/bundles/org.eclipse.ui/icons/full/progress/errorstate.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/progress/lockedstate.gif b/bundles/org.eclipse.ui/icons/full/progress/lockedstate.gif
deleted file mode 100644
index e637951..0000000
--- a/bundles/org.eclipse.ui/icons/full/progress/lockedstate.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/progress/progress_error.gif b/bundles/org.eclipse.ui/icons/full/progress/progress_error.gif
deleted file mode 100644
index 553252c..0000000
--- a/bundles/org.eclipse.ui/icons/full/progress/progress_error.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/progress/progress_none.gif b/bundles/org.eclipse.ui/icons/full/progress/progress_none.gif
deleted file mode 100644
index 4aa54a6..0000000
--- a/bundles/org.eclipse.ui/icons/full/progress/progress_none.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/progress/progress_ok.gif b/bundles/org.eclipse.ui/icons/full/progress/progress_ok.gif
deleted file mode 100644
index 0fc45ba..0000000
--- a/bundles/org.eclipse.ui/icons/full/progress/progress_ok.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/progress/progress_task.gif b/bundles/org.eclipse.ui/icons/full/progress/progress_task.gif
deleted file mode 100644
index 09d5848..0000000
--- a/bundles/org.eclipse.ui/icons/full/progress/progress_task.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/progress/pview.gif b/bundles/org.eclipse.ui/icons/full/progress/pview.gif
deleted file mode 100644
index 4aa54a6..0000000
--- a/bundles/org.eclipse.ui/icons/full/progress/pview.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/progress/sleeping.gif b/bundles/org.eclipse.ui/icons/full/progress/sleeping.gif
deleted file mode 100644
index 1683fca..0000000
--- a/bundles/org.eclipse.ui/icons/full/progress/sleeping.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/progress/waiting.gif b/bundles/org.eclipse.ui/icons/full/progress/waiting.gif
deleted file mode 100644
index 0930dac..0000000
--- a/bundles/org.eclipse.ui/icons/full/progress/waiting.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/wizban/export_wiz.png b/bundles/org.eclipse.ui/icons/full/wizban/export_wiz.png
deleted file mode 100644
index aa787ef..0000000
--- a/bundles/org.eclipse.ui/icons/full/wizban/export_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/wizban/exportdir_wiz.png b/bundles/org.eclipse.ui/icons/full/wizban/exportdir_wiz.png
deleted file mode 100644
index dabdfa3..0000000
--- a/bundles/org.eclipse.ui/icons/full/wizban/exportdir_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/wizban/exportpref_wiz.png b/bundles/org.eclipse.ui/icons/full/wizban/exportpref_wiz.png
deleted file mode 100644
index ef3c3d4..0000000
--- a/bundles/org.eclipse.ui/icons/full/wizban/exportpref_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/wizban/import_wiz.png b/bundles/org.eclipse.ui/icons/full/wizban/import_wiz.png
deleted file mode 100644
index 732631c..0000000
--- a/bundles/org.eclipse.ui/icons/full/wizban/import_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/wizban/importdir_wiz.png b/bundles/org.eclipse.ui/icons/full/wizban/importdir_wiz.png
deleted file mode 100644
index dce21ed..0000000
--- a/bundles/org.eclipse.ui/icons/full/wizban/importdir_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/wizban/importpref_wiz.png b/bundles/org.eclipse.ui/icons/full/wizban/importpref_wiz.png
deleted file mode 100644
index 71c36e1..0000000
--- a/bundles/org.eclipse.ui/icons/full/wizban/importpref_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/wizban/new_wiz.png b/bundles/org.eclipse.ui/icons/full/wizban/new_wiz.png
deleted file mode 100644
index 6b410e2..0000000
--- a/bundles/org.eclipse.ui/icons/full/wizban/new_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/icons/full/wizban/workset_wiz.png b/bundles/org.eclipse.ui/icons/full/wizban/workset_wiz.png
deleted file mode 100644
index b720214..0000000
--- a/bundles/org.eclipse.ui/icons/full/wizban/workset_wiz.png
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.ui/plugin.properties b/bundles/org.eclipse.ui/plugin.properties
deleted file mode 100644
index b7f143d..0000000
--- a/bundles/org.eclipse.ui/plugin.properties
+++ /dev/null
@@ -1,333 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2008 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Plugin.name = Eclipse UI
-Plugin.providerName = Eclipse.org
-
-ExtPoint.acceleratorConfigurations = Accelerator Configurations
-ExtPoint.acceleratorScopes = Accelerator Scopes
-ExtPoint.acceleratorSets = Accelerator Sets
-ExtPoint.actionDefinitions = Action Definitions
-ExtPoint.activities = Activities
-ExtPoint.activitySupport = Activity Support
-ExtPoint.actionSets = Action Sets
-ExtPoint.actionSetPartAssociations = Action Set Part Associations
-ExtPoint.bindings = Bindings
-ExtPoint.commands = Commands
-ExtPoint.commandImages = Command Images
-ExtPoint.contexts = Contexts
-ExtPoint.decorators = Decorators
-ExtPoint.dropActions = Drop Actions
-ExtPoint.editorActions = Editor Menus and Actions
-ExtPoint.editors = Editors
-ExtPoint.elementFactories = Element Factories
-ExtPoint.encodings = Encodings
-ExtPoint.exportWizards = Export Wizards
-ExtPoint.fontDefinitions = Font Definitions
-ExtPoint.helpSupport = Help UI
-ExtPoint.handlers = Handlers
-ExtPoint.importWizards = Import Wizards
-ExtPoint.intro = Introduction Extensions
-ExtPoint.keywords = Keywords
-ExtPoint.menus = Menus
-ExtPoint.newWizards = Resource Creation Wizards
-ExtPoint.perspectiveExtensions = Perspective Extensions
-ExtPoint.perspectives = Perspectives
-ExtPoint.popupMenus = Popup Menus
-ExtPoint.preferencePages = Preference Pages
-ExtPoint.preferenceTransfer = Preference Transfer
-ExtPoint.themes = Themes
-ExtPoint.presentationFactories = Presentation Factories
-ExtPoint.propertyPages = Property Pages
-ExtPoint.startup = Startup
-ExtPoint.splashHandlers = Splash Handlers
-ExtPoint.services = Services
-ExtPoint.systemSummarySections = System Summary Sections
-ExtPoint.viewActions = View Menus and Actions
-ExtPoint.views = Views
-ExtPoint.workingSets = Working set dialogs
-ExtPoint.browserSupport = Browser Support
-ExtPoint.statusHandlers = Status Handlers
-ExtPoint.installationPages = Installation Pages
-ExtPoint.tweaklets = Tweaklets (internal/experimental)
-
-Views.Category.Basic = General
-Views.IntroAdapter = Welcome
-
-FontsPreference.BannerFontLabel = Banner Font
-FontsPreference.DialogFontLabel = Dialog Font
-FontsPreference.HeaderFontLabel = Header Font
-FontsPreference.TextFontLabel = Text Font
-FontsPreference.TitleFont = Part title font
-FontsPreference.ViewMessageFont = View message font
-FontsPreference.BannerFontDescription = The banner font is used in wizard banners.
-FontsPreference.DialogFontDescription  = The dialog font is the font for widgets in dialogs.
-FontsPreference.HeaderFontDescription  = The header font is used for section headers in composite text pages.
-FontsPreference.TextFontDescription  = The text font is used by text editors.
-FontsPreference.TitleFontDescription  = The font that is used for view and editor titles.  Please note that it is recommended that this font not be bold or italic because the workbench will use bold and italic versions of this font to display progress.
-FontsPreference.ViewMessageFontDescription = The font that is used for messages in the view title bar (if present).
-Presentation.misc=Basic
-Presentation.misc.desc=Basic colors and fonts used throughout workbench dialogs and editors.
-Presentation.default=View and Editor Folders
-Presentation.default.desc=Colors and fonts used by the default Eclipse presentation.
-Presentation.default.name=Default
-Presentation.30.name=Classic Presentation
-
-SystemSummary.sectionTitle.platform=Platform Details
-
-category.file.name=File
-category.file.description=
-category.edit.name=Edit
-category.edit.description=
-category.navigate.name=Navigate
-category.navigate.description=
-category.perspective.name=Perspectives
-category.perspective.description=Commands for opening perspectives
-category.window.name=Window
-category.window.description=
-category.help.name=Help
-category.help.description=
-category.view.name=Views
-category.view.description=Commands for opening views
-
-command.aboutAction.description = Open the about dialog
-command.aboutAction.name = About
-command.installationDialog.description = Open the installation dialog
-command.installationDialog.name = Installation Information
-command.activateEditor.description = Activate the editor
-command.activateEditor.name = Activate Editor
-command.addBookmark.description = Add a bookmark
-command.addBookmark.name = Add Bookmark
-command.back.description = Navigate back
-command.back.name = Back
-command.backwardHistory.description = Move backward in the editor navigation history
-command.backwardHistory.name = Backward History
-command.close.description = Close the active editor
-command.close.name = Close
-command.closePart.description = Close the active workbench part
-command.closePart.name = Close Part
-command.closeAll.description = Close all editors
-command.closeAll.name = Close All
-command.closeOthers.description = Close all editors except the one that is active
-command.closeOthers.name = Close Others
-command.closeAllPerspectives.description = Close all open perspectives
-command.closeAllPerspectives.name = Close All Perspectives
-command.closePerspective.description = Close the current perspective
-command.closePerspective.name = Close Perspective
-command.closePerspective.perspectiveId.name = Perspective Id
-command.contentAssistContextInformation.description= Show Context Information
-command.contentAssistContextInformation.name= Context Information
-command.contentAssistProposals.description= Content Assist
-command.contentAssistProposals.name= Content Assist
-command.copy.description = Copy the selection to the clipboard
-command.copy.name = Copy
-command.customizePerspective.description = Customize the current perspective
-command.customizePerspective.name = Customize Perspective
-command.cut.description = Cut the selection to the clipboard
-command.cut.name = Cut
-command.delete.description = Delete the selection
-command.delete.name = Delete
-command.displayHelp.description= Display a Help topic
-command.displayHelp.hrefParameter= Help topic href
-command.displayHelp.name= Display Help
-command.exit.description = Exit the application
-command.exit.name = Exit
-command.export.description = Export
-command.export.exportWizardIdParameter.name = Export Wizard
-command.export.name = Export
-command.findReplace.description = Find and replace text
-command.findReplace.name = Find and Replace
-command.forward.description = Navigate forward
-command.forward.name = Forward
-command.forwardHistory.description = Move forward in the editor navigation history
-command.forwardHistory.name = Forward History
-command.goInto.description = Navigate into the selected item
-command.goInto.name = Go Into
-command.helpContents.description = Open the help contents
-command.helpContents.name = Help Contents
-command.helpSearch.description = Open the help search
-command.helpSearch.name = Help Search
-command.dynamicHelp.description = Open the dynamic help
-command.dynamicHelp.name = Dynamic Help
-command.hideShowEditors.description = Hide all editors
-command.hideShowEditors.name = Hide Editors
-command.import.description = Import
-command.import.importWizardIdParameter.name = Import Wizard
-command.import.name = Import
-command.lockToolBar.description = Lock the Toolbars
-command.lockToolBar.name = Lock the Toolbars
-command.linkWithEditor.description = Toggles linking of a view's selection with the active editor's selection
-command.linkWithEditor.name = Toggle Link with Editor 
-command.maximizePart.name = Maximize Active View or Editor
-command.maximizePart.description = Toggles maximize/restore state of active view or editor
-command.minimizePart.name = Minimize Active View or Editor
-command.minimizePart.description = Minimizes the active view or editor
-command.move.description = Move the selected item
-command.move.name = Move...
-command.newEditor.description = Open another editor on the active editor's input
-command.newEditor.name = New Editor
-command.newWindow.description = Open another window
-command.newWindow.name = New Window
-command.newWizard.newWizardIdParameter.name = New Wizard
-command.newWizard.description = Open the New item wizard
-command.newWizard.name = New
-command.next.description = Navigate to the next item
-command.next.name = Next
-command.nextEditor.description = Switch to the next editor
-command.nextEditor.name = Next Editor
-command.nextPage.name = Next Page
-command.nextPage.description = Switch to the next page
-command.nextPerspective.description = Switch to the next perspective
-command.nextPerspective.name = Next Perspective
-command.nextView.description = Switch to the next view
-command.nextView.name = Next View
-command.openEditorDropDown.description = Open the editor drop down list
-command.openEditorDropDown.name = Quick Switch Editor
-command.paste.description = Paste from the clipboard
-command.paste.name = Paste
-command.pinEditor.description = Pin the current editor
-command.pinEditor.name = Pin Editor
-command.preferences.description = Open the preferences dialog
-command.preferences.name = Preferences
-command.preferences.preferencePageIdParameter = Preference Page
-command.previous.description = Navigate to the previous item
-command.previous.name = Previous
-command.previousEditor.description = Switch to the previous editor
-command.previousEditor.name = Previous Editor
-command.previousPage.name = Previous Page
-command.previousPage.description = Switch to the previous page
-command.previousPerspective.description = Switch to the previous perspective
-command.previousPerspective.name = Previous Perspective
-command.previousView.description = Switch to the previous view
-command.previousView.name = Previous View
-command.print.description = Print
-command.print.name = Print
-command.properties.description = Display the properties of the selected item
-command.properties.name = Properties
-command.quickAccess.description = Quickly access UI elements
-command.quickAccess.name = Quick Access
-command.quickStart.description = Show help for beginning users
-command.quickStart.name = Welcome
-command.redo.description = Redo the last operation
-command.redo.name = Redo
-command.refresh.description = Refresh the selected items
-command.refresh.name = Refresh
-command.rename.description = Rename the selected item
-command.rename.name = Rename
-command.resetPerspective.description = Reset the current perspective to its default state
-command.resetPerspective.name = Reset Perspective
-command.restartWorkbench.name = Restart
-command.restartWorkbench.description = Restart the workbench
-command.revert.description = Revert to the last saved state
-command.revert.name = Revert
-command.save.description = Save the current contents
-command.save.name = Save
-command.saveAll.description = Save all current contents
-command.saveAll.name = Save All
-command.saveAs.description = Save the current contents to another location
-command.saveAs.name = Save As
-command.savePerspective.description = Save the current perspective
-command.savePerspective.name = Save Perspective As
-command.selectAll.description = Select all
-command.selectAll.name = Select All
-command.showKeyAssist.description = Show the key assist dialog
-command.showKeyAssist.name = Show Key Assist
-command.showPerspective.name = Show Perspective
-command.showPerspective.description = Show a particular perspective
-command.showPerspective.perspectiveIdParameter = Parameter
-command.showPerspective.newWindowParameter = In New Window
-command.showSystemMenu.description = Show the system menu
-command.showSystemMenu.name = Show System Menu
-command.showViewMenu.description = Show the view menu
-command.showViewMenu.name = Show View Menu
-command.showView.name = Show View
-command.showView.description = Shows a particular view
-command.showView.viewIdParameter = View
-command.showView.makeFastParameter = As FastView
-command.switchToEditor.description = Switch to an editor
-command.switchToEditor.name = Switch to Editor
-command.tipsAndTricks.description = Open the tips and tricks help page
-command.tipsAndTricks.name = Tips and Tricks
-command.undo.description = Undo the last operation
-command.undo.name = Undo
-command.up.description = Navigate up one level
-command.up.name = Up
-command.toggleCoolbar.name = Toggle Toolbar Visibility
-command.toggleCoolbar.description = Toggles the visibility of the window toolbar
-
-context.editingText.description = Editing Text Context
-context.editingText.name = Editing Text
-context.dialogAndWindow.name = In Dialogs and Windows
-context.dialogAndWindow.description = Either a dialog or a window is open
-context.dialog.name = In Dialogs
-context.dialog.description = A dialog is open
-context.window.name = In Windows
-context.window.description = A window is open
-context.actionSet.name = Action Set
-context.actionSet.description = Parent context for action sets
-
-keyConfiguration.default.description = Default Key Configuration
-keyConfiguration.default.name = Default
-keyConfiguration.emacs.description = Emacs Key Configuration
-keyConfiguration.emacs.name = Emacs
-
-Color.activeTabText=Active part foreground
-Color.activeTabTextDesc=The color used for active view and editor title text.
-Color.activeNofocusTabText=Active (non-focus) part foreground
-Color.activeNofocusTabTextDesc=The color used for active (but without focus) view and editor title text.
-Color.inactiveTabText=Inactive part foreground
-Color.inactiveTabTextDesc=The color used for inactive view and editor title text.
-
-Color.activeTabBGStart=Active part background begin
-Color.activeTabBGEnd=Active part background end
-Color.activeTabBGStartDesc=The first color used for active view and editor title gradients.
-Color.activeTabBGEndDesc=The second color used for active view and editor title gradients.
-Color.activeNofocusTabBGStart=Active (non-focus) part background begin
-Color.activeNofocusTabBGEnd=Active (non-focus) part background end
-Color.activeNofocusTabBGStartDesc=The first color used for active (but without focus) view and editor title gradients.
-Color.activeNofocusTabBGEndDesc=The second color used for active (but without focus) view and editor title gradients.
-Color.inactiveTabBGStart=Inactive part background begin
-Color.inactiveTabBGEnd=Inactive part background end
-Color.inactiveTabBGStartDesc=The first color used for inactive view and editor title gradients.  This color is also used for active editors that do not have focus.
-Color.inactiveTabBGEndDesc=The second color used for inactive view and editor title gradients.  This color is also used for the view menu background.
-
-Color.errorText=Error text color
-Color.errorTextDesc=Color used to show error messages.
-Color.hyperlinkText=Hyperlink text color
-Color.hyperlinkTextDesc=Color used to show links.
-Color.activeHyperlinkText=Active hyperlink text color
-Color.activeHyperlinkTextDesc=Color used to show active links.
-Color.qualifierText=Qualifier information color
-Color.qualifierTextDesc=The color used to render qualifier information in views where colored labels are supported.  In the string 'Foo.txt - myproject/bar' the qualifier is '- myproject/bar'.
-Color.decorationsText=Decoration color
-Color.decorationsTextDesc=The color used to render decoration information in views where colored labels are supported.  In the string 'Foo.txt [1.16]' the decoration is '[1.16]'.
-Color.counterText=Counter color
-Color.counterTextDesc=The color used to render counter information in views where colored labels are supported.  In the string 'Foo.txt (2 matches)' the counter information is '(2 matches)'.
-Color.contentAssistForeground=Content Assist foreground color
-Color.contentAssistForegroundDesc=The color used for text in a content assist popup.
-Color.contentAssistBackground=Content Assist background color
-Color.contentAssistBackgroundDesc=The color used for the background of a content assist popup.
-
-ThemeName.SystemDefault = Reduced Palette
-HighContrast.ThemeDescription = A theme that takes all of its values from the system settings.
-
-ThemeName.R30 = Classic Theme
-
-SettingsTransfer.WorkbenchLayout = Workbench Layout
-SettingsTransfer.WorkingSets = Working Sets
-
-PropertyPage.workingSets.name = Working Set Contents
-
-command.collapseAll.description = Collapse the current tree
-command.collapseAll.name = Collapse All
-command.quickMenu.name = Open Quick Menu
-command.quickMenu.uri.name = Location URI
-command.showIn.name = Show In
-command.showIn.targetId.name = Show In Target Id
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui/plugin.xml b/bundles/org.eclipse.ui/plugin.xml
deleted file mode 100644
index e552fd0..0000000
--- a/bundles/org.eclipse.ui/plugin.xml
+++ /dev/null
@@ -1,2197 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   
-    
-<!-- Workbench extension points -->
-   <extension-point id="acceleratorConfigurations" name="%ExtPoint.acceleratorConfigurations" schema="schema/acceleratorConfigurations.exsd"/>
-   <extension-point id="acceleratorScopes" name="%ExtPoint.acceleratorScopes" schema="schema/acceleratorScopes.exsd"/>
-   <extension-point id="acceleratorSets" name="%ExtPoint.acceleratorSets" schema="schema/acceleratorSets.exsd"/>
-   <extension-point id="actionDefinitions" name="%ExtPoint.actionDefinitions" schema="schema/actionDefinitions.exsd"/>
-   <extension-point id="activities" name="%ExtPoint.activities" schema="schema/activities.exsd"/>
-   <extension-point id="activitySupport" name="%ExtPoint.activitySupport" schema="schema/activitySupport.exsd"/>
-   <extension-point id="actionSetPartAssociations" name="%ExtPoint.actionSetPartAssociations" schema="schema/actionSetPartAssociations.exsd"/>
-   <extension-point id="actionSets" name="%ExtPoint.actionSets" schema="schema/actionSets.exsd"/>
-   <extension-point id="bindings" name="%ExtPoint.bindings" schema="schema/bindings.exsd"/>
-   <extension-point id="commands" name="%ExtPoint.commands" schema="schema/commands.exsd"/>
-   <extension-point id="commandImages" name="%ExtPoint.commandImages" schema="schema/commandImages.exsd"/>
-   <extension-point id="contexts" name="%ExtPoint.contexts" schema="schema/contexts.exsd"/>
-   <extension-point id="handlers" name="%ExtPoint.handlers" schema="schema/handlers.exsd"/>
-   <extension-point id="decorators" name="%ExtPoint.decorators" schema="schema/decorators.exsd"/>
-   <extension-point id="dropActions" name="%ExtPoint.dropActions" schema="schema/dropActions.exsd"/>
-   <extension-point id="editorActions" name="%ExtPoint.editorActions" schema="schema/editorActions.exsd"/>
-   <extension-point id="editors" name="%ExtPoint.editors" schema="schema/editors.exsd"/>
-   <extension-point id="elementFactories" name="%ExtPoint.elementFactories" schema="schema/elementFactories.exsd"/>
-   <extension-point id="encodings" name="%ExtPoint.encodings" schema="schema/encodings.exsd"/>
-   <extension-point id="exportWizards" name="%ExtPoint.exportWizards" schema="schema/exportWizards.exsd"/>
-   <extension-point id="fontDefinitions" name="%ExtPoint.fontDefinitions" schema="schema/fontDefinitions.exsd"/>
-   <extension-point id="helpSupport" name="%ExtPoint.helpSupport" schema="schema/helpSupport.exsd"/>
-   <extension-point id="importWizards" name="%ExtPoint.importWizards" schema="schema/importWizards.exsd"/>
-   <extension-point id="intro" name="%ExtPoint.intro" schema="schema/intro.exsd"/>
-   <extension-point id="keywords" name="%ExtPoint.keywords" schema="schema/keywords.exsd"/>
-   <extension-point id="menus" name="%ExtPoint.menus" schema="schema/menus.exsd"/>
-   <extension-point id="newWizards" name="%ExtPoint.newWizards" schema="schema/newWizards.exsd"/>
-   <extension-point id="perspectiveExtensions" name="%ExtPoint.perspectiveExtensions" schema="schema/perspectiveExtensions.exsd"/>
-   <extension-point id="perspectives" name="%ExtPoint.perspectives" schema="schema/perspectives.exsd"/>
-   <extension-point id="popupMenus" name="%ExtPoint.popupMenus" schema="schema/popupMenus.exsd"/>
-   <extension-point id="preferencePages" name="%ExtPoint.preferencePages" schema="schema/preferencePages.exsd"/>
-   <extension-point id="preferenceTransfer" name="%ExtPoint.preferenceTransfer" schema="schema/preferenceTransfer.exsd"/>
-   <extension-point id="presentationFactories" name="%ExtPoint.presentationFactories" schema="schema/presentationFactories.exsd"/>
-   <extension-point id="propertyPages" name="%ExtPoint.propertyPages" schema="schema/propertyPages.exsd"/>
-   <extension-point id="services" name="%ExtPoint.services" schema="schema/services.exsd"/>
-   <extension-point id="splashHandlers" name="%ExtPoint.splashHandlers" schema="schema/splashHandlers.exsd"/>
-   <extension-point id="startup" name="%ExtPoint.startup" schema="schema/startup.exsd"/>
-   <extension-point id="statusHandlers" name="%ExtPoint.statusHandlers" schema="schema/statusHandlers.exsd"/>
-   <extension-point id="systemSummarySections" name="%ExtPoint.systemSummarySections" schema="schema/systemSummarySections.exsd"/>
-   <extension-point id="themes" name="%ExtPoint.themes" schema="schema/themes.exsd"/>
-   <extension-point id="viewActions" name="%ExtPoint.viewActions" schema="schema/viewActions.exsd"/>
-   <extension-point id="views" name="%ExtPoint.views" schema="schema/views.exsd"/>
-   <extension-point id="workingSets" name="%ExtPoint.workingSets" schema="schema/workingSets.exsd"/>
-   <extension-point id="browserSupport" name="%ExtPoint.browserSupport" schema="schema/browserSupport.exsd"/>
-   <extension-point id="internalTweaklets" name="%ExtPoint.tweaklets" schema="schema/internalTweaklets.exsd"/>
-   <extension-point id="installationPages" name="%ExtPoint.installationPages" schema="schema/installationPages.exsd"/>
-   
-   <extension
-         point="org.eclipse.ui.contexts">
-      <context
-            name="%context.editingText.name"
-            description="%context.editingText.description"
-            id="org.eclipse.ui.textEditorScope"
-            parentId="org.eclipse.ui.contexts.window">
-      </context>
-<!-- This is the root context.  Basically, all key bindings should have
-           this context as their parent.  Key bindings in this context will
-           apply to both windows and dialogs.
-        -->
-      <context
-            name="%context.dialogAndWindow.name"
-            description="%context.dialogAndWindow.description"
-            id="org.eclipse.ui.contexts.dialogAndWindow">
-      </context>
-<!-- This is the root context for key bindings that should apply in
-           windows (e.g., IWorkbenchWindow).  Key bindings in this context
-           will only apply to windows (not dialogs).
-        -->
-      <context
-            name="%context.window.name"
-            description="%context.window.description"
-            id="org.eclipse.ui.contexts.window"
-            parentId="org.eclipse.ui.contexts.dialogAndWindow">
-      </context>
-<!-- This is the root context for key bindings that should apply in
-           dialogs (e.g., shells without parents).  Key bindings in this
-           context will only apply to dialogs (not windows).
-        -->
-      <context
-            name="%context.dialog.name"
-            description="%context.dialog.description"
-            id="org.eclipse.ui.contexts.dialog"
-            parentId="org.eclipse.ui.contexts.dialogAndWindow">
-      </context>
-      <context
-            description="%context.actionSet.description"
-            id="org.eclipse.ui.contexts.actionSet"
-            name="%context.actionSet.name">
-      </context>
-   </extension>
-   
-   <extension point="org.eclipse.ui.bindings">
-      <key
-            commandId="org.eclipse.ui.newWizard"
-            sequence="M1+N"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.file.close"
-            sequence="M1+W"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.file.close"
-            sequence="M1+F4"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.file.closeAll"
-            sequence="M1+M2+W"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.file.closeAll"
-            sequence="M1+M2+F4"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.file.save"
-            sequence="M1+S"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.file.saveAll"
-            sequence="M1+M2+S"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.rename"
-            sequence="F2"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.file.print"
-            sequence="M1+P"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.file.properties"
-            sequence="M3+CR"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.file.refresh"
-            sequence="F5"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.undo"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="M1+Z"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.redo"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="M1+Y"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.cut"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="M1+X"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.copy"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="M1+C"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.paste"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="M1+V"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.selectAll"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="M1+A"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.delete"
-            sequence="DEL"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.findReplace"
-            sequence="M1+F"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.navigate.next"
-            sequence="M1+."
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.navigate.previous"
-            sequence="M1+,"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.navigate.backwardHistory"
-            sequence="M3+ARROW_LEFT"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            sequence="M3+ARROW_LEFT"
-            commandId=""
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            commandId="org.eclipse.ui.navigate.backwardHistory"
-            sequence="COMMAND+["
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            commandId="org.eclipse.ui.navigate.backwardHistory"
-            sequence="COMMAND+ALT+ARROW_LEFT"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.navigate.forwardHistory"
-            sequence="M3+ARROW_RIGHT"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            sequence="M3+ARROW_RIGHT"
-            commandId=""
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            commandId="org.eclipse.ui.navigate.forwardHistory"
-            sequence="COMMAND+]"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            commandId="org.eclipse.ui.navigate.forwardHistory"
-            sequence="COMMAND+ALT+ARROW_RIGHT"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.window.openEditorDropDown"
-            sequence="M1+E"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.window.switchToEditor"
-            sequence="M1+M2+E"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.window.showSystemMenu"
-            sequence="M3+-"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            sequence="M3+-"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.window.showSystemMenu"
-            platform="carbon"
-            sequence="M1+M2+F10"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.window.showViewMenu"
-            sequence="M1+F10"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.window.activateEditor"
-            sequence="F12"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <!-- F12 is the Dashboard on carbon -->
-      <key
-            platform="carbon"
-            sequence="F12"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.window.activateEditor"
-            platform="carbon"
-            sequence="M1+F12"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.window.maximizePart"
-            sequence="M1+M"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.window.nextEditor"
-            sequence="M1+F6"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.window.previousEditor"
-            sequence="M1+M2+F6"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.window.nextView"
-            sequence="M1+F7"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.window.previousView"
-            sequence="M1+M2+F7"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.window.nextPerspective"
-            sequence="M1+F8"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.window.previousPerspective"
-            sequence="M1+M2+F8"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            sequence="M1+F4"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            sequence="M1+M2+F4"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            sequence="M1+,"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.navigate.previous"
-            platform="carbon"
-            sequence="M1+M2+."
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.cut"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="M2+DEL"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            commandId=""
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="M2+DEL"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.copy"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="M1+INSERT"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            commandId=""
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="M1+INSERT"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.paste"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="M2+INSERT"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-      <key
-            platform="carbon"
-            commandId=""
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="M2+INSERT"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
-
-	  <key
-	        commandId="org.eclipse.ui.edit.text.contentAssist.proposals"
-	        contextId="org.eclipse.ui.contexts.dialogAndWindow"
-			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-	        sequence="CTRL+SPACE"/>	<!-- Command+SPACE+* is reserved on carbon, hardcode to CTRL -->
-
-	  <key
-	        commandId="org.eclipse.ui.edit.text.contentAssist.contextInformation"
-	        contextId="org.eclipse.ui.contexts.dialogAndWindow"
-			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-	        sequence="CTRL+M2+SPACE"/>	<!-- Command+SPACE+* is reserved on carbon, hardcode to CTRL -->
-
-      <!-- Special content assist key bindings for the Chinese language to prevent conflict with IME -->
-      <key
-            locale="zh"
-   	        contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+SPACE"/>
-      <key
-            locale="zh"
-            commandId="org.eclipse.ui.edit.text.contentAssist.proposals"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M3+/"/>
-      <key
-            locale="zh"
-   	        contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+M2+SPACE"/>
-      <key
-            locale="zh"
-            commandId="org.eclipse.ui.edit.text.contentAssist.contextInformation"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M3+?"/>
-      <key
-            locale="zh"
-            commandId="org.eclipse.ui.edit.text.contentAssist.contextInformation"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M2+M3+?"/>
-
-      <!-- Content assist key binding for the Japanese language to prevent conflict with IME on GTK -->
-      <key
-            locale="ja"
-            platform="gtk"
-   	        contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+SPACE"/>
-      <key
-            locale="ja"
-            platform="gtk"
-            commandId="org.eclipse.ui.edit.text.contentAssist.proposals"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M3+/"/>
-      <key
-            locale="ja"
-            platform="gtk"
-   	        contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+M2+SPACE"/>
-      <key
-            locale="ja"
-            platform="gtk"
-            commandId="org.eclipse.ui.edit.text.contentAssist.contextInformation"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M3+?"/>
-      <key
-            locale="ja"
-            platform="gtk"
-            commandId="org.eclipse.ui.edit.text.contentAssist.contextInformation"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M2+M3+?"/>
-
-      <!-- Content assist key binding for the Korean language to prevent conflict with IME on GTK -->
-      <key
-            locale="ko"
-            platform="gtk"
-   	        contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+SPACE"/>
-      <key
-            locale="ko"
-            platform="gtk"
-            commandId="org.eclipse.ui.edit.text.contentAssist.proposals"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M3+/"/>
-      <key
-            locale="ko"
-            platform="gtk"
-   	        contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+M2+SPACE"/>
-      <key
-            locale="ko"
-            platform="gtk"
-            commandId="org.eclipse.ui.edit.text.contentAssist.contextInformation"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M3+?"/>
-      <key
-            locale="ko"
-            platform="gtk"
-            commandId="org.eclipse.ui.edit.text.contentAssist.contextInformation"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M2+M3+?"/>
-            
-      <!-- Content assist key binding for the Japanese language to prevent conflict with IME on Motif -->
-      <key
-            locale="ja"
-            platform="motif"
-   	        contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+SPACE"/>
-      <key
-            locale="ja"
-            platform="motif"
-            commandId="org.eclipse.ui.edit.text.contentAssist.proposals"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M3+/"/>
-      <key
-            locale="ja"
-            platform="motif"
-   	        contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+M2+SPACE"/>
-      <key
-            locale="ja"
-            platform="motif"
-            commandId="org.eclipse.ui.edit.text.contentAssist.contextInformation"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M3+?"/>
-      <key
-            locale="ja"
-            platform="motif"
-            commandId="org.eclipse.ui.edit.text.contentAssist.contextInformation"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M2+M3+?"/>
-
-      <!-- Content assist key binding for the Korean language to prevent conflict with IME on Motif -->
-      <key
-            locale="ko"
-            platform="motif"
-   	        contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+SPACE"/>
-      <key
-            locale="ko"
-            platform="motif"
-            commandId="org.eclipse.ui.edit.text.contentAssist.proposals"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M3+/"/>
-      <key
-            locale="ko"
-            platform="motif"
-   	        contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+M2+SPACE"/>
-      <key
-            locale="ko"
-            platform="motif"
-            commandId="org.eclipse.ui.edit.text.contentAssist.contextInformation"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M3+?"/>
-      <key
-            locale="ko"
-            platform="motif"
-            commandId="org.eclipse.ui.edit.text.contentAssist.contextInformation"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M2+M3+?"/>
-      
-      <key
-            commandId="org.eclipse.ui.file.close"
-            sequence="CTRL+X K"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.file.closeAll"
-            sequence="CTRL+X CTRL+C"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.file.save"
-            sequence="CTRL+X CTRL+S"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.file.saveAll"
-            sequence="CTRL+X S"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.file.print"
-            sequence="M3+F9"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.file.print"
-            sequence="ESC F9"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.undo"
-            sequence="F9"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.undo"
-            sequence="CTRL+X U"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.undo"
-            sequence="CTRL+M2+-"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.redo"
-            sequence="F10"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.redo"
-            sequence="CTRL+X R"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.redo"
-            sequence="CTRL+M2++"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.cut"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="CTRL+W"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.copy"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="M3+W"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.copy"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="ESC W"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.paste"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="CTRL+Y"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.selectAll"
-            contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="CTRL+X H"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.findReplace"
-            sequence="M3+R"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.findReplace"
-            sequence="ESC R"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.edit.text.contentAssist.proposals"
-	        contextId="org.eclipse.ui.contexts.dialogAndWindow"
-            sequence="ALT+/"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration"/>
-      <key
-            commandId="org.eclipse.ui.edit.text.contentAssist.contextInformation"
-            sequence="ALT+?"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration"/>
-      <key
-            commandId="org.eclipse.ui.edit.text.contentAssist.contextInformation"
-            sequence="ALT+SHIFT+?"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration"/>
-      <key
-            commandId="org.eclipse.ui.window.openEditorDropDown"
-            sequence="CTRL+X B"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <key
-            commandId="org.eclipse.ui.window.switchToEditor"
-            sequence="CTRL+X CTRL+B"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration" />
-      <scheme
-            name="%keyConfiguration.default.name"
-            description="%keyConfiguration.default.description"
-            id="org.eclipse.ui.defaultAcceleratorConfiguration">
-      </scheme>
-      <scheme
-            name="%keyConfiguration.emacs.name"
-            description="%keyConfiguration.emacs.description"
-            parentId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            id="org.eclipse.ui.emacsAcceleratorConfiguration">
-      </scheme>
-      <key
-            commandId="org.eclipse.ui.navigate.collapseAll"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M1+M2+NUMPAD_DIVIDE">
-      </key>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.commands">
-      <category
-            name="%category.file.name"
-            description="%category.file.description"
-            id="org.eclipse.ui.category.file" />
-      <category
-            name="%category.edit.name"
-            description="%category.edit.description"
-            id="org.eclipse.ui.category.edit" />
-      <category
-            name="%category.navigate.name"
-            description="%category.navigate.description"
-            id="org.eclipse.ui.category.navigate" />
-      <category
-            name="%category.window.name"
-            description="%category.window.description"
-            id="org.eclipse.ui.category.window" />
-      <category
-            name="%category.help.name"
-            description="%category.help.description"
-            id="org.eclipse.ui.category.help" />
-      <category
-            name="%category.view.name"
-            description="%category.view.description"
-            id="org.eclipse.ui.category.views">
-      </category>
-      <command
-            name="%command.helpContents.name"
-            description="%command.helpContents.description"
-            categoryId="org.eclipse.ui.category.help"
-            id="org.eclipse.ui.help.helpContents" />
-      <command
-            name="%command.helpSearch.name"
-            description="%command.helpSearch.description"
-            categoryId="org.eclipse.ui.category.help"
-            id="org.eclipse.ui.help.helpSearch" />
-      <command
-            name="%command.dynamicHelp.name"
-            description="%command.dynamicHelp.description"
-            categoryId="org.eclipse.ui.category.help"
-            id="org.eclipse.ui.help.dynamicHelp" />
-      <command
-            name="%command.quickStart.name"
-            description="%command.quickStart.description"
-            categoryId="org.eclipse.ui.category.help"
-            id="org.eclipse.ui.help.quickStartAction" />
-      <command
-            name="%command.tipsAndTricks.name"
-            description="%command.tipsAndTricks.description"
-            categoryId="org.eclipse.ui.category.help"
-            id="org.eclipse.ui.help.tipsAndTricksAction" />
-      <command
-            categoryId="org.eclipse.ui.category.help"
-            defaultHandler="org.eclipse.ui.internal.about.AboutHandler"
-            description="%command.aboutAction.description"
-            helpContextId="org.eclipse.ui.about_action_context"
-            id="org.eclipse.ui.help.aboutAction"
-            name="%command.aboutAction.name"/>
-      <command
-            categoryId="org.eclipse.ui.category.help"
-            defaultHandler="org.eclipse.ui.internal.about.InstallationHandler"
-            description="%command.installationDialog.description"
-            helpContextId="org.eclipse.ui.about_action_context"
-            id="org.eclipse.ui.help.installationDialog"
-            name="%command.installationDialog.name"/>            
-      <command
-            categoryId="org.eclipse.ui.category.file"
-            defaultHandler="org.eclipse.ui.internal.handlers.WizardHandler$New"
-            description="%command.newWizard.description"
-            id="org.eclipse.ui.newWizard"
-            name="%command.newWizard.name">
-         <commandParameter
-               id="newWizardId"
-               name="%command.newWizard.newWizardIdParameter.name"
-               optional="true"
-               values="org.eclipse.ui.internal.registry.WizardParameterValues$New"/>
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.file"
-            description="%command.close.description"
-            id="org.eclipse.ui.file.close"
-            name="%command.close.name"/>
-      <command
-            categoryId="org.eclipse.ui.category.file"
-            description="%command.closeAll.description"
-            id="org.eclipse.ui.file.closeAll"
-            name="%command.closeAll.name"/>
-      <command
-            categoryId="org.eclipse.ui.category.file"
-            defaultHandler="org.eclipse.ui.internal.handlers.WizardHandler$Import"
-            description="%command.import.description"
-            id="org.eclipse.ui.file.import"
-            name="%command.import.name">
-         <commandParameter
-               id="importWizardId"
-               name="%command.import.importWizardIdParameter.name"
-               optional="true"
-               values="org.eclipse.ui.internal.registry.WizardParameterValues$Import"/>
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.file"
-            defaultHandler="org.eclipse.ui.internal.handlers.WizardHandler$Export"
-            description="%command.export.description"
-            id="org.eclipse.ui.file.export"
-            name="%command.export.name">
-         <commandParameter
-               id="exportWizardId"
-               name="%command.export.exportWizardIdParameter.name"
-               optional="true"
-               values="org.eclipse.ui.internal.registry.WizardParameterValues$Export"/>
-      </command>
-      <command
-            name="%command.save.name"
-            description="%command.save.description"
-            categoryId="org.eclipse.ui.category.file"
-            id="org.eclipse.ui.file.save" />
-      <command
-            name="%command.saveAs.name"
-            description="%command.saveAs.description"
-            categoryId="org.eclipse.ui.category.file"
-            id="org.eclipse.ui.file.saveAs" />
-      <command
-            name="%command.saveAll.name"
-            description="%command.saveAll.description"
-            categoryId="org.eclipse.ui.category.file"
-            id="org.eclipse.ui.file.saveAll" />
-      <command
-            name="%command.print.name"
-            description="%command.print.description"
-            categoryId="org.eclipse.ui.category.file"
-            id="org.eclipse.ui.file.print" />
-      <command
-            name="%command.revert.name"
-            description="%command.revert.description"
-            categoryId="org.eclipse.ui.category.file"
-            id="org.eclipse.ui.file.revert" />
-       <command
-            name="%command.restartWorkbench.name"
-            description="%command.restartWorkbench.description"
-            defaultHandler="org.eclipse.ui.internal.handlers.RestartWorkbenchHandler"
-            categoryId="org.eclipse.ui.category.file"
-            id="org.eclipse.ui.file.restartWorkbench" />
-      <command
-            name="%command.refresh.name"
-            description="%command.refresh.description"
-            categoryId="org.eclipse.ui.category.file"
-            id="org.eclipse.ui.file.refresh" />
-      <command
-            categoryId="org.eclipse.ui.category.file"
-            defaultHandler="org.eclipse.ui.internal.handlers.PropertyDialogHandler"
-            description="%command.properties.description"
-            id="org.eclipse.ui.file.properties"
-            name="%command.properties.name"/>
-      <command
-            categoryId="org.eclipse.ui.category.file"
-            defaultHandler="org.eclipse.ui.internal.handlers.QuitHandler"
-            description="%command.exit.description"
-            id="org.eclipse.ui.file.exit"
-            name="%command.exit.name"/>
-      <command
-            name="%command.undo.name"
-            description="%command.undo.description"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.ui.edit.undo" />
-      <command
-            name="%command.redo.name"
-            description="%command.redo.description"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.ui.edit.redo" />
-      <command
-            name="%command.cut.name"
-            description="%command.cut.description"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.ui.edit.cut"
-            defaultHandler="org.eclipse.ui.internal.handlers.WidgetMethodHandler:cut" />
-      <command
-            name="%command.copy.name"
-            description="%command.copy.description"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.ui.edit.copy"
-            defaultHandler="org.eclipse.ui.internal.handlers.WidgetMethodHandler:copy" />
-      <command
-            name="%command.paste.name"
-            description="%command.paste.description"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.ui.edit.paste"
-            defaultHandler="org.eclipse.ui.internal.handlers.WidgetMethodHandler:paste" />
-      <command
-            name="%command.delete.name"
-            description="%command.delete.description"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.ui.edit.delete" />
-      <command
-            name="%command.contentAssistProposals.name"
-            description="%command.contentAssistProposals.description"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.ui.edit.text.contentAssist.proposals">
-      </command>
-      <command
-            name="%command.contentAssistContextInformation.name"
-            description="%command.contentAssistContextInformation.description"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.ui.edit.text.contentAssist.contextInformation">
-      </command>
-      <command
-            name="%command.move.name"
-            description="%command.move.description"
-            categoryId="org.eclipse.ui.category.file"
-            id="org.eclipse.ui.edit.move" />
-      <command
-            name="%command.rename.name"
-            description="%command.rename.description"
-            categoryId="org.eclipse.ui.category.file"
-            id="org.eclipse.ui.edit.rename" />
-      <command
-            name="%command.selectAll.name"
-            description="%command.selectAll.description"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.ui.edit.selectAll"
-            defaultHandler="org.eclipse.ui.internal.handlers.SelectAllHandler" />
-      <command
-            name="%command.findReplace.name"
-            description="%command.findReplace.description"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.ui.edit.findReplace" />
-      <command
-            name="%command.addBookmark.name"
-            description="%command.addBookmark.description"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.ui.edit.addBookmark" />
-      <command
-            name="%command.goInto.name"
-            description="%command.goInto.description"
-            categoryId="org.eclipse.ui.category.navigate"
-            id="org.eclipse.ui.navigate.goInto" />
-      <command
-            name="%command.back.name"
-            description="%command.back.description"
-            categoryId="org.eclipse.ui.category.navigate"
-            id="org.eclipse.ui.navigate.back" />
-      <command
-            name="%command.forward.name"
-            description="%command.forward.description"
-            categoryId="org.eclipse.ui.category.navigate"
-            id="org.eclipse.ui.navigate.forward" />
-      <command
-            name="%command.up.name"
-            description="%command.up.description"
-            categoryId="org.eclipse.ui.category.navigate"
-            id="org.eclipse.ui.navigate.up" />
-      <command
-            name="%command.next.name"
-            description="%command.next.description"
-            categoryId="org.eclipse.ui.category.navigate"
-            id="org.eclipse.ui.navigate.next" />
-      <command
-            name="%command.backwardHistory.name"
-            description="%command.backwardHistory.description"
-            categoryId="org.eclipse.ui.category.navigate"
-            id="org.eclipse.ui.navigate.backwardHistory" />
-      <command
-            name="%command.forwardHistory.name"
-            description="%command.forwardHistory.description"
-            categoryId="org.eclipse.ui.category.navigate"
-            id="org.eclipse.ui.navigate.forwardHistory" />
-      <command
-            name="%command.previous.name"
-            description="%command.previous.description"
-            categoryId="org.eclipse.ui.category.navigate"
-            id="org.eclipse.ui.navigate.previous" />
-      <command
-            name="%command.linkWithEditor.name"
-            description="%command.linkWithEditor.description"
-            categoryId="org.eclipse.ui.category.navigate"
-            id="org.eclipse.ui.navigate.linkWithEditor" />
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            defaultHandler="org.eclipse.ui.internal.handlers.OpenInNewWindowHandler"
-            description="%command.newWindow.description"
-            id="org.eclipse.ui.window.newWindow"
-            name="%command.newWindow.name"/>
-      <command
-            name="%command.newEditor.name"
-            description="%command.newEditor.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.newEditor" />
-      <command
-            name="%command.openEditorDropDown.name"
-            description="%command.openEditorDropDown.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.openEditorDropDown" />
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            defaultHandler="org.eclipse.ui.internal.quickaccess.QuickAccessHandler"
-            description="%command.quickAccess.description"
-            id="org.eclipse.ui.window.quickAccess"
-            name="%command.quickAccess.name"/>
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            defaultHandler="org.eclipse.ui.internal.WorkbenchEditorsHandler"
-            description="%command.switchToEditor.description"
-            id="org.eclipse.ui.window.switchToEditor"
-            name="%command.switchToEditor.name"/>
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            description="%command.showSystemMenu.description"
-            id="org.eclipse.ui.window.showSystemMenu"
-            name="%command.showSystemMenu.name"/>
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            description="%command.showViewMenu.description"
-            id="org.eclipse.ui.window.showViewMenu"
-            name="%command.showViewMenu.name"/>
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            description="%command.activateEditor.description"
-            id="org.eclipse.ui.window.activateEditor"
-            name="%command.activateEditor.name"/>
-      <command
-            name="%command.maximizePart.name"
-            description="%command.maximizePart.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.maximizePart" />
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            defaultHandler="org.eclipse.ui.internal.handlers.MinimizePartHandler"
-            description="%command.minimizePart.description"
-            id="org.eclipse.ui.window.minimizePart"
-            name="%command.minimizePart.name"/>
-      <command
-            name="%command.nextEditor.name"
-            description="%command.nextEditor.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.nextEditor" />
-      <command
-            name="%command.previousEditor.name"
-            description="%command.previousEditor.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.previousEditor" />
-      <command
-            name="%command.nextView.name"
-            description="%command.nextView.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.nextView" />
-      <command
-            name="%command.previousView.name"
-            description="%command.previousView.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.previousView" />
-      <command
-            name="%command.nextPerspective.name"
-            description="%command.nextPerspective.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.nextPerspective" />
-      <command
-            name="%command.previousPerspective.name"
-            description="%command.previousPerspective.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.previousPerspective" />
-      <command
-            name="%command.closeAllPerspectives.name"
-            description="%command.closeAllPerspectives.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.closeAllPerspectives" />
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            description="%command.closePerspective.description"
-            id="org.eclipse.ui.window.closePerspective"
-            name="%command.closePerspective.name">
-         <commandParameter
-               id="org.eclipse.ui.window.closePerspective.perspectiveId"
-               name="%command.closePerspective.perspectiveId.name"
-               optional="true"
-               values="org.eclipse.ui.internal.registry.PerspectiveParameterValues">
-         </commandParameter>
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            defaultHandler="org.eclipse.ui.internal.handlers.ClosePartHandler"
-            description="%command.closePart.description"
-            id="org.eclipse.ui.file.closePart"
-            name="%command.closePart.name"/>
-      <command
-            name="%command.customizePerspective.name"
-            description="%command.customizePerspective.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.customizePerspective" />
-      <command
-            name="%command.hideShowEditors.name"
-            description="%command.hideShowEditors.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.hideShowEditors" />
-      <command
-            name="%command.lockToolBar.name"
-            description="%command.lockToolBar.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.lockToolBar" />
-      <command
-            name="%command.pinEditor.name"
-            description="%command.pinEditor.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.pinEditor" />
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            defaultHandler="org.eclipse.ui.internal.handlers.ShowPreferencePageHandler"
-            description="%command.preferences.description"
-            id="org.eclipse.ui.window.preferences"
-            name="%command.preferences.name">
-         <commandParameter
-               id="preferencePageId"
-               name="%command.preferences.preferencePageIdParameter"
-               optional="true"
-               values="org.eclipse.ui.internal.registry.PreferencePageParameterValues"/>
-      </command>
-      <command
-            name="%command.resetPerspective.name"
-            description="%command.resetPerspective.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.resetPerspective" />
-      <command
-            name="%command.savePerspective.name"
-            description="%command.savePerspective.description"
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.window.savePerspective" />
-      <command
-      		name="%command.showKeyAssist.name"
-      		description="%command.showKeyAssist.description"
-      		categoryId="org.eclipse.ui.category.window"
-      		id="org.eclipse.ui.window.showKeyAssist"
-      		defaultHandler="org.eclipse.ui.internal.handlers.ShowKeyAssistHandler" />
-      <command
-      		name="%command.showView.name"
-      		description="%command.showView.description"
-      		categoryId="org.eclipse.ui.category.views"
-      		id="org.eclipse.ui.views.showView"
-      		defaultHandler="org.eclipse.ui.handlers.ShowViewHandler">
-      		<commandParameter
-      			id="org.eclipse.ui.views.showView.viewId"
-      			name="%command.showView.viewIdParameter"
-      			values="org.eclipse.ui.internal.registry.ViewParameterValues" />
-        <commandParameter
-              id="org.eclipse.ui.views.showView.makeFast"
-              name="%command.showView.makeFastParameter"
-              optional="true">
-        </commandParameter>
-      </command>
-      <command
-            defaultHandler="org.eclipse.ui.internal.handlers.DisplayHelpHandler"
-            description="%command.displayHelp.description"
-            id="org.eclipse.ui.help.displayHelp"
-            name="%command.displayHelp.name"
-            categoryId="org.eclipse.ui.category.help">
-         <commandParameter
-               id="href"
-               name="%command.displayHelp.hrefParameter"
-               optional="true"/>
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.file"
-            description="%command.closeOthers.description"
-            id="org.eclipse.ui.file.closeOthers"
-            name="%command.closeOthers.name"/>
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            description="%command.toggleCoolbar.description"
-            id="org.eclipse.ui.ToggleCoolbarAction"
-            name="%command.toggleCoolbar.name"/>
-      <command
-            categoryId="org.eclipse.ui.category.perspectives"
-            defaultHandler="org.eclipse.ui.handlers.ShowPerspectiveHandler"
-            description="%command.showPerspective.description"
-            id="org.eclipse.ui.perspectives.showPerspective"
-            name="%command.showPerspective.name">
-         <commandParameter
-               id="org.eclipse.ui.perspectives.showPerspective.perspectiveId"
-               name="%command.showPerspective.perspectiveIdParameter"
-               values="org.eclipse.ui.internal.registry.PerspectiveParameterValues">
-         </commandParameter>
-         <commandParameter
-               id="org.eclipse.ui.perspectives.showPerspective.newWindow"
-               name="%command.showPerspective.newWindowParameter"
-               optional="true">
-         </commandParameter>
-      </command>
-      <command
-            description="%command.nextPage.description"
-            id="org.eclipse.ui.part.nextPage"
-            categoryId="org.eclipse.ui.category.navigate"
-            name="%command.nextPage.name">
-      </command>
-      <command
-            description="%command.previousPage.description"
-            id="org.eclipse.ui.part.previousPage"
-            categoryId="org.eclipse.ui.category.navigate"
-            name="%command.previousPage.name">
-      </command>
-      <category
-            description="%category.perspective.description"
-            id="org.eclipse.ui.category.perspectives"
-            name="%category.perspective.name">
-      </category>
-      <command
-            categoryId="org.eclipse.ui.category.navigate"
-            description="%command.collapseAll.description"
-            id="org.eclipse.ui.navigate.collapseAll"
-            name="%command.collapseAll.name">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.navigate"
-            defaultHandler="org.eclipse.ui.internal.ShowInHandler"
-            id="org.eclipse.ui.navigate.showIn"
-            name="%command.showIn.name">
-         <commandParameter
-               id="org.eclipse.ui.navigate.showIn.targetId"
-               name="%command.showIn.targetId.name"
-               optional="false"
-               values="org.eclipse.ui.internal.registry.ViewParameterValues">
-         </commandParameter>
-      </command>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.commandImages">
-      <image
-            commandId="org.eclipse.ui.edit.copy"
-            disabledIcon="$nl$/icons/full/dtool16/copy_edit.gif"
-            icon="$nl$/icons/full/etool16/copy_edit.gif"/>
-      <image
-            commandId="org.eclipse.ui.edit.cut"
-            disabledIcon="$nl$/icons/full/dtool16/cut_edit.gif"
-            icon="$nl$/icons/full/etool16/cut_edit.gif"/>
-      <image
-            commandId="org.eclipse.ui.edit.delete"
-            disabledIcon="$nl$/icons/full/dtool16/delete_edit.gif"
-            icon="$nl$/icons/full/etool16/delete_edit.gif"/>
-      <image
-            commandId="org.eclipse.ui.edit.paste"
-            disabledIcon="$nl$/icons/full/dtool16/paste_edit.gif"
-            icon="$nl$/icons/full/etool16/paste_edit.gif"/>
-      <image
-            commandId="org.eclipse.ui.file.print"
-            disabledIcon="$nl$/icons/full/dtool16/print_edit.gif"
-            icon="$nl$/icons/full/etool16/print_edit.gif"/>
-      <image
-            commandId="org.eclipse.ui.edit.undo"
-            disabledIcon="$nl$/icons/full/dtool16/undo_edit.gif"
-            icon="$nl$/icons/full/etool16/undo_edit.gif"/>
-      <image
-            commandId="org.eclipse.ui.edit.redo"
-            disabledIcon="$nl$/icons/full/dtool16/redo_edit.gif"
-            icon="$nl$/icons/full/etool16/redo_edit.gif"/>
-      <image
-            commandId="org.eclipse.ui.file.save"
-            disabledIcon="$nl$/icons/full/dtool16/save_edit.gif"
-            icon="$nl$/icons/full/etool16/save_edit.gif"/>
-      <image
-            commandId="org.eclipse.ui.file.saveAll"
-            disabledIcon="$nl$/icons/full/dtool16/saveall_edit.gif"
-            icon="$nl$/icons/full/etool16/saveall_edit.gif"/>
-      <image
-            commandId="org.eclipse.ui.file.saveAs"
-            disabledIcon="$nl$/icons/full/dtool16/saveas_edit.gif"
-            icon="$nl$/icons/full/etool16/saveas_edit.gif"/>
-      <image
-            commandId="org.eclipse.ui.file.refresh"
-            disabledIcon="$nl$/icons/full/dlcl16/refresh_nav.gif"
-            icon="$nl$/icons/full/elcl16/refresh_nav.gif"/>
-      <image
-            commandId="org.eclipse.ui.file.export"
-            disabledIcon="$nl$/icons/full/dtool16/export_wiz.gif"
-            icon="$nl$/icons/full/etool16/export_wiz.gif">
-      </image>
-      <image
-            commandId="org.eclipse.ui.file.import"
-            disabledIcon="$nl$/icons/full/dtool16/import_wiz.gif"
-            icon="$nl$/icons/full/etool16/import_wiz.gif">
-      </image>
-      <image
-            commandId="org.eclipse.ui.navigate.collapseAll"
-            disabledIcon="$nl$/icons/full/dlcl16/collapseall.gif"
-            icon="$nl$/icons/full/elcl16/collapseall.gif">
-      </image>
-      <image
-            commandId="org.eclipse.ui.newWizard"
-            disabledIcon="$nl$/icons/full/dtool16/new_wiz.gif"
-            icon="$nl$/icons/full/etool16/new_wiz.gif">
-      </image>
-      <image
-            commandId="org.eclipse.ui.perspectives.showPerspective"
-            icon="$nl$/icons/full/eview16/new_persp.gif">
-      </image>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            name="%Views.Category.Basic"
-            id="org.eclipse.ui">
-      </category>
-      <view
-            class="org.eclipse.ui.internal.ViewIntroAdapterPart"
-            category="org.eclipse.ui"
-            name="%Views.IntroAdapter"
-            id="org.eclipse.ui.internal.introview">
-      </view>
-      <stickyView
-      		location="RIGHT"
-            id="org.eclipse.ui.internal.introview">
-      </stickyView>
-   </extension>
-   <extension
-         point="org.eclipse.ui.elementFactories">
-      <factory
-            class="org.eclipse.ui.internal.WorkingSetFactory"
-            id="org.eclipse.ui.internal.WorkingSetFactory">
-      </factory>
-   </extension>
-   <extension
-         point="org.eclipse.ui.themes">
-<!-- do not add to this category!  This is bound to the default presentation and will disappear if another presentation is used. -->
-      <themeElementCategory
-            label="%Presentation.default"
-            class="org.eclipse.ui.internal.themes.WorkbenchPreview"
-            id="org.eclipse.ui.presentation.default">
-         <description>
-            %Presentation.default.desc
-         </description>
-      </themeElementCategory>
-      <themeElementCategory
-            label="%Presentation.misc"
-            id="org.eclipse.ui.workbenchMisc">
-         <description>
-            %Presentation.misc.desc
-         </description>
-      </themeElementCategory>
-      <categoryPresentationBinding
-            categoryId="org.eclipse.ui.presentation.default"
-            presentationId="org.eclipse.ui.presentations.default">
-      </categoryPresentationBinding>
-      <categoryPresentationBinding
-            categoryId="org.eclipse.ui.presentation.default"
-            presentationId="org.eclipse.ui.presentations.r30">
-      </categoryPresentationBinding>
-      <fontDefinition
-            label="%FontsPreference.BannerFontLabel"
-            categoryId="org.eclipse.ui.workbenchMisc"
-            id="org.eclipse.jface.bannerfont">
-         <description>
-            %FontsPreference.BannerFontDescription
-         </description>
-      </fontDefinition>
-      <fontDefinition
-            label="%FontsPreference.DialogFontLabel"
-            categoryId="org.eclipse.ui.workbenchMisc"
-            id="org.eclipse.jface.dialogfont">
-         <description>
-            %FontsPreference.DialogFontDescription
-         </description>
-      </fontDefinition>
-      <fontDefinition
-            label="%FontsPreference.HeaderFontLabel"
-            categoryId="org.eclipse.ui.workbenchMisc"
-            id="org.eclipse.jface.headerfont">
-         <description>
-            %FontsPreference.HeaderFontDescription
-         </description>
-      </fontDefinition>
-      <fontDefinition
-            label="%FontsPreference.TextFontLabel"
-            categoryId="org.eclipse.ui.workbenchMisc"
-            id="org.eclipse.jface.textfont">
-         <description>
-            %FontsPreference.TextFontDescription
-         </description>
-      </fontDefinition>
-      <fontDefinition
-            label="%FontsPreference.TitleFont"
-            categoryId="org.eclipse.ui.presentation.default"
-            id="org.eclipse.ui.workbench.TAB_TEXT_FONT">
-         <description>
-            %FontsPreference.TitleFontDescription
-         </description>
-      </fontDefinition>
-      <fontDefinition
-            label="%FontsPreference.ViewMessageFont"
-            categoryId="org.eclipse.ui.presentation.default"
-            id="org.eclipse.ui.workbench.VIEW_MESSAGE_TEXT_FONT">
-         <description>
-            %FontsPreference.ViewMessageFontDescription
-         </description>
-      </fontDefinition>
-      <colorDefinition
-            label="%Color.errorText"
-            value="COLOR_RED"
-            categoryId="org.eclipse.ui.workbenchMisc"
-            id="ERROR_COLOR">
-         <description>
-            %Color.errorTextDesc
-         </description>
-      </colorDefinition>
-      <colorDefinition
-            label="%Color.hyperlinkText"
-            categoryId="org.eclipse.ui.workbenchMisc"
-            value="COLOR_DARK_BLUE"
-            id="HYPERLINK_COLOR">
-         <description>
-            %Color.hyperlinkTextDesc
-         </description>
-      </colorDefinition>
-      <colorDefinition
-            label="%Color.activeHyperlinkText"
-            categoryId="org.eclipse.ui.workbenchMisc"
-            value="COLOR_BLUE"
-            id="ACTIVE_HYPERLINK_COLOR">
-         <description>
-            %Color.activeHyperlinkTextDesc
-         </description>
-      </colorDefinition>
-         
-     <colorDefinition
-            label="%Color.qualifierText"
-            categoryId="org.eclipse.ui.workbenchMisc"
-            value="COLOR_DARK_GRAY"
-            id="QUALIFIER_COLOR">
-         <description>
-            %Color.qualifierTextDesc
-         </description>
-      </colorDefinition>
-      <colorDefinition
-            label="%Color.decorationsText"
-            categoryId="org.eclipse.ui.workbenchMisc"
-            value="149,125,71"
-            id="DECORATIONS_COLOR">
-         <description>
-            %Color.decorationsTextDesc
-         </description>
-      </colorDefinition>      
-      <colorDefinition
-            label="%Color.counterText"
-            categoryId="org.eclipse.ui.workbenchMisc"
-            value="0,127,174"
-            id="COUNTER_COLOR">
-         <description>
-            %Color.counterTextDesc
-         </description>
-      </colorDefinition>
-      <colorDefinition
-            label="%Color.contentAssistBackground"
-            categoryId="org.eclipse.ui.workbenchMisc"
-            value="COLOR_LIST_BACKGROUND"
-            id="CONTENT_ASSIST_BACKGROUND_COLOR">
-         <description>
-            %Color.contentAssistBackgroundDesc
-         </description>
-      </colorDefinition>
-      <colorDefinition
-            label="%Color.contentAssistForeground"
-            categoryId="org.eclipse.ui.workbenchMisc"
-            value="COLOR_LIST_FOREGROUND"
-            id="CONTENT_ASSIST_FOREGROUND_COLOR">
-         <description>
-            %Color.contentAssistForegroundDesc
-         </description>
-      </colorDefinition>
-      
-      <data
-      	name="org.eclipse.ui.workbench.ACTIVE_TAB_HIGHLIGHT" value="true">
-      </data>
-<!-- Active Tab Colors -->
-      <colorDefinition
-            label="%Color.activeTabText"
-            categoryId="org.eclipse.ui.presentation.default"
-            id="org.eclipse.ui.workbench.ACTIVE_TAB_TEXT_COLOR">
-         <description>
-            %Color.activeTabTextDesc
-         </description>
-         <colorValue
-               ws="motif"
-               value="COLOR_TITLE_INACTIVE_FOREGROUND">
-         </colorValue>
-         <colorFactory
-               class="org.eclipse.ui.internal.themes.LightColorFactory"
-               plugin="org.eclipse.ui">
-          <parameter
-                  name="base" value="COLOR_TITLE_FOREGROUND">
-          </parameter>
-          <parameter
-                  name="definitionId" value="org.eclipse.ui.workbench.ACTIVE_TAB_TEXT_COLOR">
-          </parameter>
-         </colorFactory>
-      </colorDefinition>
-      <colorDefinition
-            categoryId="org.eclipse.ui.presentation.default"
-            id="org.eclipse.ui.workbench.ACTIVE_TAB_BG_END"
-            label="%Color.activeTabBGEnd">
-         <description>
-            %Color.activeTabBGEndDesc
-         </description>
-         <colorValue
-               ws="motif"
-               value="COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT">
-         </colorValue>
-         <colorFactory
-               class="org.eclipse.ui.internal.themes.LightColorFactory"
-               plugin="org.eclipse.ui">
-          <parameter
-                  name="base" value="COLOR_TITLE_BACKGROUND">
-          </parameter>
-          <parameter
-                  name="definitionId" value="org.eclipse.ui.workbench.ACTIVE_TAB_BG_END">
-          </parameter>
-         </colorFactory>
-      </colorDefinition>
-      <colorDefinition
-            label="%Color.activeTabBGStart"
-            categoryId="org.eclipse.ui.presentation.default"
-            id="org.eclipse.ui.workbench.ACTIVE_TAB_BG_START">
-         <description>
-            %Color.activeTabBGStartDesc
-         </description>
-         <colorValue
-               ws="motif"
-               value="COLOR_TITLE_INACTIVE_BACKGROUND">
-         </colorValue>
-         <colorFactory
-               class="org.eclipse.ui.internal.themes.LightColorFactory"
-               plugin="org.eclipse.ui">
-          <parameter
-                  name="base" value="COLOR_TITLE_BACKGROUND">
-          </parameter>
-          <parameter
-                  name="definitionId" value="org.eclipse.ui.workbench.ACTIVE_TAB_BG_START">
-          </parameter>
-         </colorFactory>
-      </colorDefinition>
-<!-- Active (Nofocus) Tab Colors -->
-      <colorDefinition
-            label="%Color.activeNofocusTabText"
-            categoryId="org.eclipse.ui.presentation.default"
-            value="COLOR_TITLE_INACTIVE_FOREGROUND"
-            id="org.eclipse.ui.workbench.ACTIVE_NOFOCUS_TAB_TEXT_COLOR">
-         <description>
-            %Color.activeNofocusTabTextDesc
-         </description>
-      </colorDefinition>
-      <colorDefinition
-            label="%Color.activeNofocusTabBGEnd"
-            categoryId="org.eclipse.ui.presentation.default"
-            value="COLOR_TITLE_INACTIVE_BACKGROUND"
-            id="org.eclipse.ui.workbench.ACTIVE_NOFOCUS_TAB_BG_END">
-         <description>
-            %Color.activeNofocusTabBGEndDesc
-         </description>
-      </colorDefinition>
-      <colorDefinition
-            label="%Color.activeNofocusTabBGStart"
-            categoryId="org.eclipse.ui.presentation.default"
-            id="org.eclipse.ui.workbench.ACTIVE_NOFOCUS_TAB_BG_START">
-         <description>
-            %Color.activeNofocusTabBGStartDesc
-         </description>
-         <colorFactory
-               class="org.eclipse.ui.internal.themes.LightColorFactory"
-               plugin="org.eclipse.ui">
-          <parameter
-                  name="base" value="COLOR_TITLE_INACTIVE_BACKGROUND">
-          </parameter>
-          <parameter
-                  name="definitionId" value="org.eclipse.ui.workbench.ACTIVE_NOFOCUS_TAB_BG_START">
-          </parameter>
-         </colorFactory>      </colorDefinition>      
-<!-- Inactive Tab Colors -->
-      <colorDefinition
-            label="%Color.inactiveTabText"
-            categoryId="org.eclipse.ui.presentation.default"
-            value="COLOR_WIDGET_FOREGROUND"
-            id="org.eclipse.ui.workbench.INACTIVE_TAB_TEXT_COLOR">
-         <description>
-            %Color.inactiveTabTextDesc
-         </description>
-      </colorDefinition>
-      <colorDefinition
-            label="%Color.inactiveTabBGStart"
-            categoryId="org.eclipse.ui.presentation.default"
-            id="org.eclipse.ui.workbench.INACTIVE_TAB_BG_START">
-         <colorFactory
-               plugin="org.eclipse.ui"
-               class="org.eclipse.ui.internal.themes.RGBContrastFactory">
-            <parameter
-                  name="foreground"
-                  value="COLOR_WIDGET_FOREGROUND">
-            </parameter>
-            <parameter
-                  name="background1"
-                  value="COLOR_WHITE">
-            </parameter>
-            <parameter
-                  name="background2"
-                  value="COLOR_WIDGET_BACKGROUND">
-            </parameter>
-         </colorFactory>
-         <description>
-            %Color.inactiveTabBGStartDesc
-         </description>
-      </colorDefinition>
-      <colorDefinition
-            label="%Color.inactiveTabBGEnd"
-            value="COLOR_WIDGET_BACKGROUND"
-            categoryId="org.eclipse.ui.presentation.default"
-            id="org.eclipse.ui.workbench.INACTIVE_TAB_BG_END">
-         <description>
-            %Color.inactiveTabBGEndDesc
-         </description>
-      </colorDefinition>
-<!-- percentage value for the active tab gradient -->
-      <data
-            name="org.eclipse.ui.workbench.ACTIVE_TAB_PERCENT"
-            value="75">
-      </data>
-<!-- percentage value for the active (nofocus) tab gradient -->
-      <data
-            name="org.eclipse.ui.workbench.ACTIVE_NOFOCUS_TAB_PERCENT"
-            value="100">
-      </data>      
-<!-- percentage value for the inactive tab gradient -->
-      <data
-            name="org.eclipse.ui.workbench.INACTIVE_TAB_PERCENT"
-            value="100">
-      </data>
-<!-- whether the active gradient is vertical -->
-      <data
-            name="org.eclipse.ui.workbench.ACTIVE_TAB_VERTICAL"
-            value="true">
-      </data>
-<!-- whether the active (nofocus) gradient is vertical -->
-      <data
-            name="org.eclipse.ui.workbench.ACTIVE_NOFOCUS_TAB_VERTICAL"
-            value="true">
-      </data>      
-<!-- whether the inactive gradient is vertical -->
-      <data
-            name="org.eclipse.ui.workbench.INACTIVE_TAB_VERTICAL"
-            value="true">
-      </data>
-      
-      <theme
-            id="org.eclipse.ui.ide.systemDefault"
-            name="%ThemeName.SystemDefault">
-         <description>%HighContrast.ThemeDescription</description>
-         <fontOverride
-               id="org.eclipse.jface.bannerfont"
-               />
-         <fontOverride
-               id="org.eclipse.jface.headerfont"
-               />
-         <fontOverride
-               id="org.eclipse.jface.textfont"
-               />
-         <colorOverride
-               id="ERROR_COLOR"
-               value="COLOR_LIST_FOREGROUND"/>
-         <colorOverride
-               id="HYPERLINK_COLOR"
-               value="COLOR_LIST_FOREGROUND"/>
-         <colorOverride
-               id="ACTIVE_HYPERLINK_COLOR"
-               value="COLOR_LIST_FOREGROUND"/>
-         <colorOverride
-               id="QUALIFIER_COLOR"
-               value="COLOR_LIST_FOREGROUND"/>
-		 <colorOverride
-               id="DECORATIONS_COLOR"
-               value="COLOR_LIST_FOREGROUND"/>
-         <colorOverride
-               id="COUNTER_COLOR"
-               value="COLOR_LIST_FOREGROUND"/>               
-<!-- Override color factory for active tab colors, set to defaults based on title -->               
-		<colorOverride
-				id="org.eclipse.ui.workbench.ACTIVE_TAB_TEXT_COLOR"
-				value="COLOR_TITLE_FOREGROUND"/>
-		<colorOverride
-				id="org.eclipse.ui.workbench.ACTIVE_TAB_BG_END"
-				value="COLOR_TITLE_BACKGROUND"/>
-		<colorOverride
-				id="org.eclipse.ui.workbench.ACTIVE_TAB_BG_START"
-				value="COLOR_TITLE_BACKGROUND"/>
-		 <data
-      		name="org.eclipse.ui.workbench.ACTIVE_TAB_HIGHLIGHT" value="false">
-		 </data>
-      </theme>
-      <theme
-            id="org.eclipse.ui.r30"
-            name="%ThemeName.R30">
-             <colorOverride
-               id="org.eclipse.ui.workbench.ACTIVE_TAB_BG_START"
-               value="COLOR_TITLE_BACKGROUND">
-         </colorOverride>
-         <colorOverride
-               id="org.eclipse.ui.workbench.ACTIVE_TAB_BG_END">
-            <colorFactory
-                  class="org.eclipse.ui.themes.RGBBlendColorFactory"
-                  plugin="org.eclipse.ui">
-               <parameter
-                     name="color1"
-                     value="COLOR_TITLE_BACKGROUND_GRADIENT">
-               </parameter>
-               <parameter
-                     name="color2"
-                     value="COLOR_TITLE_BACKGROUND_GRADIENT">
-               </parameter>
-            </colorFactory>
-         </colorOverride>
-         <data
-               name="org.eclipse.ui.workbench.ACTIVE_TAB_PERCENT"
-               value="100">
-         </data>
-         <colorOverride
-               id="org.eclipse.ui.workbench.ACTIVE_TAB_TEXT_COLOR"
-               value="COLOR_TITLE_FOREGROUND">
-         </colorOverride>
-		 <data
-      		name="org.eclipse.ui.workbench.ACTIVE_TAB_HIGHLIGHT" value="false">
-		 </data>
-      </theme>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.eclipse.ui.internal.UIPreferenceInitializer">
-      </initializer>
-   </extension>
-   <extension
-         point="org.eclipse.ui.systemSummarySections">
-      <section
-            sectionTitle="%SystemSummary.sectionTitle.platform"
-            class="org.eclipse.ui.internal.about.ConfigurationLogDefaultSection"
-            id="10.DefaultSection">
-      </section>
-   </extension>
-   <extension
-         point="org.eclipse.ui.presentationFactories">
-      <factory
-            name="%Presentation.default.name"
-            class="org.eclipse.ui.presentations.WorkbenchPresentationFactory"
-            id="org.eclipse.ui.presentations.default">
-      </factory>
-      <factory
-            class="org.eclipse.ui.internal.presentations.classic.WorkbenchPresentationFactoryClassic"
-            id="org.eclipse.ui.presentations.r30"
-            name="%Presentation.30.name">
-      </factory>
-   </extension>
-   <extension
-         point="org.eclipse.ui.encodings">
-      <encoding name="ISO-8859-1"/>
-      <encoding name="UTF-8"/>
-      <encoding name="UTF-16"/>
-      <encoding name="UTF-16BE"/>
-      <encoding name="UTF-16LE"/>
-      <encoding name="US-ASCII"/>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.activitySupport">
-      <triggerPoint id="org.eclipse.ui.newWizards">
-         <hint
-               id="interactive"
-               value="true"/>
-      </triggerPoint>
-      <triggerPoint id="org.eclipse.ui.openPerspectiveDialog">
-         <hint
-               id="interactive"
-               value="true"/>
-      </triggerPoint>
-      <triggerPoint id="org.eclipse.ui.importWizards">
-         <hint
-               id="interactive"
-               value="true"/>
-      </triggerPoint>
-      <triggerPoint id="org.eclipse.ui.exportWizards">
-         <hint
-               id="interactive"
-               value="true"/>
-      </triggerPoint>
-      <triggerPoint
-            id="org.eclipse.ui.workbenchModel">
-         <hint
-               id="pre_UI"
-               value="true">
-         </hint>
-      </triggerPoint>    
-   </extension>
- 
-
-   <extension
-         point="org.eclipse.ui.preferenceTransfer">
-      <settingsTransfer
-            class="org.eclipse.ui.internal.WorkbenchLayoutSettingsTransfer"
-            helpContext="org.eclipse.ui.switch_workspace_dialog_context"
-            id="org.eclipse.ui.workbenchTransfer"
-            name="%SettingsTransfer.WorkbenchLayout">
-      </settingsTransfer>
-      <settingsTransfer
-            class="org.eclipse.ui.internal.preferences.WorkingSetSettingsTransfer"
-            helpContext="org.eclipse.ui.switch_workspace_dialog_context"
-            id="org.eclipse.ui.workingSets"
-            name="%SettingsTransfer.WorkingSets">
-      </settingsTransfer>
-   </extension>
-   
-   <extension
-           point="org.eclipse.core.expressions.propertyTesters">
-        <propertyTester
-              class="org.eclipse.ui.internal.activities.ActivityPropertyTester"
-              id="org.eclipse.ui.activityPropertyTester"
-              namespace="org.eclipse.ui"
-              properties="isActivityEnabled,isCategoryEnabled"
-              type="org.eclipse.ui.IWorkbench">
-        </propertyTester>
-        <propertyTester
-              class="org.eclipse.ui.internal.OpenPerspectivePropertyTester"
-              id="org.eclipse.ui.openPerspectivePropertyTester"
-              namespace="org.eclipse.ui.workbenchWindow"
-              properties="isPerspectiveOpen"
-              type="org.eclipse.ui.IWorkbenchWindow">
-        </propertyTester>
-     </extension>
-   <extension
-         point="org.eclipse.ui.handlers">
-      <handler
-            class="org.eclipse.ui.internal.ActivateEditorHandler"
-            commandId="org.eclipse.ui.window.activateEditor">
-         <enabledWhen>
-            <with
-                  variable="activeWorkbenchWindow">
-               <instanceof
-                     value="org.eclipse.ui.IWorkbenchWindow">
-               </instanceof>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.ShowPartPaneMenuHandler"
-            commandId="org.eclipse.ui.window.showSystemMenu">
-         <enabledWhen>
-            <with
-                  variable="activePart">
-               <instanceof
-                     value="org.eclipse.ui.IWorkbenchPart">
-               </instanceof>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.ShowViewMenuHandler"
-            commandId="org.eclipse.ui.window.showViewMenu">
-         <enabledWhen>
-            <with
-                  variable="activePart">
-               <instanceof
-                     value="org.eclipse.ui.IViewPart">
-               </instanceof>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.CloseEditorHandler"
-            commandId="org.eclipse.ui.file.close">
-         <enabledWhen>
-            <with
-                  variable="activeEditor">
-               <instanceof
-                     value="org.eclipse.ui.IEditorPart">
-               </instanceof>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.CloseAllHandler"
-            commandId="org.eclipse.ui.file.closeAll">
-         <enabledWhen>
-            <with
-                  variable="activeEditor">
-               <instanceof
-                     value="org.eclipse.ui.IEditorPart">
-               </instanceof>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.CloseOthersHandler"
-            commandId="org.eclipse.ui.file.closeOthers">
-         <enabledWhen>
-            <with
-                  variable="activeWorkbenchWindow">
-               <instanceof
-                     value="org.eclipse.ui.IWorkbenchWindow">
-               </instanceof>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-      		class="org.eclipse.ui.internal.handlers.ToggleCoolbarHandler"
-      		commandId="org.eclipse.ui.ToggleCoolbarAction">
-      	 <enabledWhen>
-            <with
-                  variable="activeWorkbenchWindow">
-               <instanceof
-                     value="org.eclipse.ui.IWorkbenchWindow">
-               </instanceof>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.CycleEditorHandler:true"
-            commandId="org.eclipse.ui.window.nextEditor">
-         <enabledWhen>
-            <with
-                  variable="activeEditor">
-               <instanceof
-                     value="org.eclipse.ui.IEditorPart">
-               </instanceof>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.CycleEditorHandler:false"
-            commandId="org.eclipse.ui.window.previousEditor">
-         <enabledWhen>
-            <with
-                  variable="activeEditor">
-               <instanceof
-                     value="org.eclipse.ui.IEditorPart">
-               </instanceof>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.CycleViewHandler:true"
-            commandId="org.eclipse.ui.window.nextView">
-         <enabledWhen>
-            <with
-                  variable="activePart">
-               <instanceof
-                     value="org.eclipse.ui.IWorkbenchPart">
-               </instanceof>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.CycleViewHandler:false"
-            commandId="org.eclipse.ui.window.previousView">
-         <enabledWhen>
-            <with
-                  variable="activePart">
-               <instanceof
-                     value="org.eclipse.ui.IWorkbenchPart">
-               </instanceof>
-            </with>
-         </enabledWhen>
-      </handler>      
-      <handler
-            class="org.eclipse.ui.internal.CyclePerspectiveHandler:true"
-            commandId="org.eclipse.ui.window.nextPerspective">
-         <enabledWhen>
-            <with
-                  variable="activeWorkbenchWindow">
-               <test
-                     property="org.eclipse.ui.workbenchWindow.isPerspectiveOpen">
-               </test>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.CyclePerspectiveHandler:false"
-            commandId="org.eclipse.ui.window.previousPerspective">
-         <enabledWhen>
-            <with
-                  variable="activeWorkbenchWindow">
-               <test
-                     property="org.eclipse.ui.workbenchWindow.isPerspectiveOpen">
-               </test>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.handlers.CloseAllPerspectivesHandler"
-            commandId="org.eclipse.ui.window.closeAllPerspectives">
-         <enabledWhen>
-            <or>
-               <with
-                     variable="activeWorkbenchWindow">
-                  <test
-                        property="org.eclipse.ui.workbenchWindow.isPerspectiveOpen">
-                  </test>
-               </with>
-               <!-- this is a workaround to evaluate the expression -->
-               <with
-                     variable="activePart">
-                  <instanceof
-                        value="org.eclipse.ui.IWorkbenchPart">
-                  </instanceof>
-               </with>
-            </or>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.handlers.EditActionSetsHandler"
-            commandId="org.eclipse.ui.window.customizePerspective">
-         <enabledWhen>
-            <or>
-               <with
-                     variable="activePart">
-                  <instanceof
-                        value="org.eclipse.ui.IWorkbenchPart">
-                  </instanceof>
-               </with>
-               <with
-                     variable="activeWorkbenchWindow">
-                  <test
-                        property="org.eclipse.ui.workbenchWindow.isPerspectiveOpen">
-                  </test>
-               </with>
-            </or>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.handlers.ClosePerspectiveHandler"
-            commandId="org.eclipse.ui.window.closePerspective">
-         <enabledWhen>
-            <or>
-               <with
-                     variable="activeWorkbenchWindow">
-                  <test
-                        property="org.eclipse.ui.workbenchWindow.isPerspectiveOpen">
-                  </test>
-               </with>
-               <!-- this is a workaround to evaluate the expression -->
-               <with
-                     variable="activePart">
-                  <instanceof
-                        value="org.eclipse.ui.IWorkbenchPart">
-                  </instanceof>
-               </with>
-            </or>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.WorkbookEditorsHandler"
-            commandId="org.eclipse.ui.window.openEditorDropDown">
-         <enabledWhen>
-            <with
-                  variable="activeEditor">
-               <instanceof
-                     value="org.eclipse.ui.IEditorPart">
-               </instanceof>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.handlers.NewEditorHandler"
-            commandId="org.eclipse.ui.window.newEditor">
-         <enabledWhen>
-            <with
-                  variable="activeEditor">
-               <instanceof
-                     value="org.eclipse.ui.IEditorPart">
-               </instanceof>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.internal.handlers.MaximizePartHandler"
-            commandId="org.eclipse.ui.window.maximizePart">
-         <enabledWhen>
-            <with
-                  variable="activePart">
-               <instanceof
-                     value="org.eclipse.ui.IWorkbenchPart">
-               </instanceof>
-            </with>
-         </enabledWhen>
-      </handler>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.adapters">
-      <factory
-            adaptableType="org.eclipse.jface.viewers.ISelection"
-            class="org.eclipse.ui.internal.SelectionAdapterFactory">
-         <adapter
-               type="org.eclipse.core.expressions.IIterable">
-         </adapter>
-         <adapter
-               type="org.eclipse.core.expressions.ICountable">
-         </adapter>
-      </factory>
-   </extension>
-   <extension
-         point="org.eclipse.ui.propertyPages">
-      <page
-            class="org.eclipse.ui.internal.preferences.WorkingSetPropertyPage"
-            id="org.eclipse.ui.workingSetsPropertyPage"
-            name="%PropertyPage.workingSets.name">
-         <enabledWhen>
-            <adapt
-                  type="org.eclipse.ui.IWorkingSet">
-            </adapt>
-         </enabledWhen>
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.ui.services">
-      <serviceFactory
-            factoryClass="org.eclipse.ui.internal.WorkbenchSupportFactory">
-         <service
-               serviceClass="org.eclipse.ui.progress.IProgressService">
-         </service>
-         <service
-               serviceClass="org.eclipse.ui.progress.IWorkbenchSiteProgressService">
-         </service>
-         <service
-               serviceClass="org.eclipse.ui.IPartService">
-         </service>
-         <service
-               serviceClass="org.eclipse.ui.IPageService">
-         </service>
-         <service
-               serviceClass="org.eclipse.ui.ISelectionService">
-         </service>
-      </serviceFactory>
-      <serviceFactory
-            factoryClass="org.eclipse.ui.internal.handlers.HandlerServiceFactory">
-         <service
-               serviceClass="org.eclipse.ui.handlers.IHandlerService">
-         </service>
-      </serviceFactory>
-      <serviceFactory
-            factoryClass="org.eclipse.ui.internal.services.EvaluationServiceFactory">
-         <service
-               serviceClass="org.eclipse.ui.services.IEvaluationService"></service>
-      </serviceFactory>
-      <serviceFactory
-            factoryClass="org.eclipse.ui.internal.contexts.ContextServiceFactory">
-         <service
-               serviceClass="org.eclipse.ui.contexts.IContextService">
-         </service>
-      </serviceFactory>
-      <serviceFactory
-            factoryClass="org.eclipse.ui.internal.commands.CommandServiceFactory">
-         <service
-               serviceClass="org.eclipse.ui.commands.ICommandService">
-         </service>
-      </serviceFactory>
-      <serviceFactory
-            factoryClass="org.eclipse.ui.internal.menus.MenuServiceFactory">
-         <service
-               serviceClass="org.eclipse.ui.menus.IMenuService">
-         </service>
-      </serviceFactory>
-      <sourceProvider
-            provider="org.eclipse.ui.internal.services.CurrentSelectionSourceProvider">
-         <variable
-               name="selection"
-               priorityLevel="workbench">
-         </variable>
-      </sourceProvider>
-      <sourceProvider
-            provider="org.eclipse.ui.internal.services.ActiveShellSourceProvider">
-         <variable
-               name="activeShell"
-               priorityLevel="workbench">
-         </variable>
-         <variable
-               name="activeWorkbenchWindow"
-               priorityLevel="workbench">
-         </variable>
-         <variable
-               name="activeWorkbenchWindowShell"
-               priorityLevel="workbench">
-         </variable>
-         <variable
-               name="activeWorkbenchWindow.isCoolbarVisible"
-               priorityLevel="workbench">
-         </variable>
-         <variable
-               name="activeWorkbenchWindow.isPerspectiveBarVisible"
-               priorityLevel="workbench">
-         </variable>
-         <variable
-               name="activeWorkbenchWindow.activePerspective"
-               priorityLevel="workbench">
-         </variable>
-      </sourceProvider>
-      <sourceProvider
-            provider="org.eclipse.ui.internal.services.ActivePartSourceProvider">
-         <variable
-               name="activeEditor"
-               priorityLevel="workbench">
-         </variable>
-         <variable
-               name="activeEditorId"
-               priorityLevel="workbench">
-         </variable>
-         <variable
-               name="activePart"
-               priorityLevel="workbench">
-         </variable>
-         <variable
-               name="activePartId"
-               priorityLevel="workbench">
-         </variable>
-         <variable
-               name="activeSite"
-               priorityLevel="workbench">
-         </variable>
-      </sourceProvider>
-      <sourceProvider
-            provider="org.eclipse.ui.internal.services.ActionSetSourceProvider">
-         <variable
-               name="activeActionSets"
-               priorityLevel="workbench">
-         </variable>
-      </sourceProvider>
-      <sourceProvider
-            provider="org.eclipse.ui.internal.menus.FocusControlSourceProvider">
-         <variable
-               name="activeFocusControl"
-               priorityLevel="workbench">
-         </variable>
-         <variable
-               name="activeFocusControlId"
-               priorityLevel="workbench">
-         </variable>
-      </sourceProvider>
-      <sourceProvider
-            provider="org.eclipse.ui.internal.services.MenuSourceProvider">
-         <variable
-               name="activeMenuEditorInput"
-               priorityLevel="workbench">
-         </variable>
-         <variable
-               name="activeMenuSelection"
-               priorityLevel="workbench">
-         </variable>
-         <variable
-               name="activeMenu"
-               priorityLevel="workbench">
-         </variable>
-      </sourceProvider>
-      <sourceProvider
-            provider="org.eclipse.ui.internal.contexts.ActiveContextSourceProvider">
-         <variable
-               name="activeContexts"
-               priorityLevel="workbench">
-         </variable>
-      </sourceProvider>
-   </extension>
-</plugin>
diff --git a/bundles/org.eclipse.ui/schema/acceleratorConfigurations.exsd b/bundles/org.eclipse.ui/schema/acceleratorConfigurations.exsd
deleted file mode 100644
index 74dfe4b..0000000
--- a/bundles/org.eclipse.ui/schema/acceleratorConfigurations.exsd
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="acceleratorConfigurations" name="Accelerator Configurations"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;
-&lt;b&gt;WARNING: This extension point is DEPRECATED.&lt;/b&gt;&lt;br&gt;
-Do not use this extension point, it will be removed in future versions of this product.
-Instead, use the extension point &lt;a href=&quot;org_eclipse_ui_commands.html&quot;&gt;org.eclipse.ui.commands&lt;/a&gt;
-&lt;/p&gt;
-This extension point is used to register accelerator configuration extensions. Accelerator configurations are configurations to which accelerator sets may be registered. The workbench allows the user to select an accelerator configuration from the Workbench preference page. Only one accelerator configuration may be active at a time. 
-&lt;p&gt;
-An accelerator configuration represents a general style or theme of accelerators for Workbench actions. For example, the Workbench provides the &quot;Emacs&quot; accelerator configuration. When the &quot;Emacs&quot; accelerator configuration is active, accelerators belonging to accelerator sets registered to the &quot;Emacs&quot; configuration are active. These accelerators are defined to mimic the accelerators in Emacs (a popular text editor amongst developers). 
-&lt;p&gt;
-An accelerator set registers with an accelerator configuration by listing the configuration&apos;s id as the value of its &quot;configurationId&quot; attribute (see the Accelerator Sets extension point). Many accelerator sets can be registered to the same accelerator configuration. 
-&lt;p&gt;
-Note the accelerator configuration name presented to the user is the same as the value of the attribute &quot;name&quot; of the extension element of org.eclipse.ui.acceleratorConfigurations extension point.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element deprecated="true"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="acceleratorConfiguration" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="acceleratorConfiguration">
-      <annotation>
-         <appInfo>
-            <meta.element deprecated="true"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that can be used to identify this accelerator configuration.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name of the accelerator configuration to be presented to the user.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a short description of the accelerator configuration.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         Release 2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         Following is an example of an accelerator configuration extension: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.acceleratorConfigurations&quot;&gt; 
-      &lt;acceleratorConfiguration 
-        id=&quot;org.eclipse.ui.viAcceleratorConfiguration&quot; 
-        name=&quot;VI&quot; 
-        description=&quot;VI style accelerator configuration&quot;&gt; 
-      &lt;/acceleratorConfiguration&gt; 
-      &lt;acceleratorConfiguration 
-        id=&quot;org.eclipse.ui.jonDoeAcceleratorConfiguration&quot; 
-        name=&quot;Jon Doe&quot; 
-        description=&quot;Personal accelerator configuration for Jon Doe&quot;&gt; 
-      &lt;/acceleratorConfiguration&gt; 
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The workbench provides the Default and Emacs accelerator configurations.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2002, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/acceleratorScopes.exsd b/bundles/org.eclipse.ui/schema/acceleratorScopes.exsd
deleted file mode 100644
index 1a6e6a7..0000000
--- a/bundles/org.eclipse.ui/schema/acceleratorScopes.exsd
+++ /dev/null
@@ -1,167 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="acceleratorScopes" name="Accelerator Scopes"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;
-&lt;b&gt;WARNING: This extension point is DEPRECATED.&lt;/b&gt;&lt;br&gt;
-Do not use this extension point, it will be removed in future versions of this product.
-Instead, use the extension point &lt;a href=&quot;org_eclipse_ui_commands.html&quot;&gt;org.eclipse.ui.commands&lt;/a&gt;
-&lt;/p&gt;
-This extension point is used to register accelerator scope extensions. Accelerator scopes are scopes for which accelerator sets may be applicable. For example, if an accelerator set is applicable for the scope entitled &quot;Text Editor Scope&quot;, the accelerators of that accelerator set will only operate if the &quot;Text Editor Scope&quot; or one of its children is active (in other words, if the active part is a participating text editor). 
-&lt;p&gt;
-An accelerator set declares what scope it is applicable for by listing the scope&apos;s id as the value of its &quot;scopeId&quot; attribute (see the Accelerator Sets extension point). Many accelerator sets can be applicable for the same accelerator scope.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element deprecated="true"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="acceleratorScope" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="acceleratorScope">
-      <annotation>
-         <appInfo>
-            <meta.element deprecated="true"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that can be used to identify this accelerator scope.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name of the accelerator scope.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a short description of the accelerator scope.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="parentScope" type="string">
-            <annotation>
-               <documentation>
-                  an optional attribute which represents a scope which is active whenever this scope is active. For most scopes, org.eclipse.ui.globalScope will be the parent scope
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         Release 2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         Following is an example of an accelerator scope extension: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.acceleratorScopes&quot;&gt; 
-      &lt;acceleratorScope 
-        id=&quot;org.eclipse.ui.globalScope&quot; 
-        name=&quot;Global&quot; 
-        description=&quot;Action accelerator key applicable to all views and editors unless explicitly overridden.&quot;&gt; 
-      &lt;/acceleratorScope&gt; 
-      &lt;acceleratorScope 
-        id=&quot;org.eclipse.ui.javaEditorScope&quot; 
-        name=&quot;Java Editor&quot; 
-        description=&quot;Action accelerator key applicable only when java editor active.&quot; 
-        parentScope=&quot;org.eclipse.ui.globalScope&quot;&gt; 
-      &lt;/acceleratorScope&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The method public IKeyBindingService getKeyBindingService() was added to IEditorSite.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The workbench provides the Global accelerator scope and the Text Editor accelerator scope.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2002, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/acceleratorSets.exsd b/bundles/org.eclipse.ui/schema/acceleratorSets.exsd
deleted file mode 100644
index 50bb681..0000000
--- a/bundles/org.eclipse.ui/schema/acceleratorSets.exsd
+++ /dev/null
@@ -1,206 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="acceleratorSets" name="Accelerator Sets"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;
-&lt;b&gt;WARNING: This extension point is DEPRECATED.&lt;/b&gt;&lt;br&gt;
-Do not use this extension point, it will be removed in future versions of this product.
-Instead, use the extension point &lt;a href=&quot;org_eclipse_ui_commands.html&quot;&gt;org.eclipse.ui.commands&lt;/a&gt;
-&lt;/p&gt;
-This extension point is used to register accelerator set extensions. Accelerator sets are just what the name implies, sets of accelerators. An accelerator is an association between one or more sequences of accelerator keys and a workbench action. An accelerator key sequence may be of length one or greater. 
-&lt;p&gt;
-An accelerator set is registered with an accelerator configuration (see the Accelerator Configuration extension point) and is applicable for an accelerator scope (see the Accelerator Scope extension point).
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element deprecated="true"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="acceleratorSet" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="acceleratorSet">
-      <annotation>
-         <appInfo>
-            <meta.element deprecated="true"/>
-         </appInfo>
-         <documentation>
-            @deprecated Please use the &quot;org.eclipse.ui.bindings&quot; extension point instead.  Use the &lt;code&gt;key&lt;/code&gt; element.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="accelerator" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="configurationId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that identifies the accelerator configuration to which this accelerator set is registered.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="scopeId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that identifies the accelerator scope for which this accelerator set is applicable.
-@deprecated When migrating to the new bindings extension point, it is recommended that you change any occurrences of &quot;org.eclipse.ui.globalScope&quot; to &quot;org.eclipse.ui.contexts.window&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="accelerator">
-      <annotation>
-         <appInfo>
-            <meta.element deprecated="true"/>
-         </appInfo>
-         <documentation>
-            @deprecated Please use the &quot;org.eclipse.ui.bindings&quot; extension point instead.  Use the &lt;code&gt;key&lt;/code&gt; element.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  the unique identifier of the action definition of the action associated with this accelerator. If the id is not specified this accelerator deletes any  mappings with the same key. This is used to delete a key binding for a specific Locale.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="key" type="string" use="required">
-            <annotation>
-               <documentation>
-                  an attribute representing the sequence(s) of accelerator keys used to perform the action associated with this accelerator. Sequences are separated by &apos;||&apos;, and individual keys in a sequence are separated by a space. A key may be modified by the CTRL, ALT, or SHIFT keys. Depending on keyboard layout, some keys (&apos;?&apos; for example) may need the SHIFT to be accessed but the accelerator should be specified without the SHIFT so it will be independent of keyboard layout. E.g. if CTRL+? is specified as an accelerator, the user may have to press CTRL+SHIFT+? depending on the keyboard layout.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="locale" type="string">
-            <annotation>
-               <documentation>
-                  an optional attribute which specifies a locale for which the accelerator is applicable. If this attribute is not specified, the accelerator is applicable for all locales.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="platform" type="string">
-            <annotation>
-               <documentation>
-                  an optional attribute which specifies a platform on which the accelerator is applicable. If this attribute is not specified, the accelerator is applicable on all platforms.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         Release 2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         Following is an example of an accelerator set extension: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.acceleratorSets&quot;&gt; 
-      &lt;acceleratorSet 
-        configurationId=&quot;org.eclipse.ui.exampleAcceleratorConfiguration&quot; 
-        scopeId=&quot;org.eclipse.ui.globalScope&quot;&gt; 
-          &lt;accelerator 
-              id=&quot;org.eclipse.ui.ExampleActionA&quot; 
-              key=&quot;CTRL+R CTRL+A&quot;&gt; 
-          &lt;/accelerator&gt; 
-          &lt;accelerator 
-              id=&quot;org.eclipse.ui.ExampleActionB&quot; 
-              key=&quot;CTRL+R CTRL+B&quot;&gt; 
-          &lt;/accelerator&gt; 
-          &lt;accelerator 
-              id=&quot;org.eclipse.ui.ExampleActionC&quot; 
-              key=&quot;CTRL+R CTRL+C || CTRL+SHIFT+DELETE&quot;&gt; 
-          &lt;/accelerator&gt; 
-      &lt;/acceleratorSet&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         More than one accelerator may be specified for the same action in the accelerator set but only one will be used. 
-&lt;p&gt;
-If the locale and/or the platform is specified, the accelerator that better matches the current locale and platform will be used. The current locale is determined by the API Locale.getDefault() and the platform by the API SWT.getPlatform(). If the platform and/or the locale is specified and it does not match the current locale and/or platform, the accelerator is discarded. If accelerator A defines only the locale and B defines only the platform, B is used. If accelerator A defines &quot;ja&quot; as its locale and B defines &quot;ja_JP&quot;, B is used in case the current locale is &quot;ja_JP&quot;. 
-&lt;p&gt;
-If two accelerators are defined in accelerators sets in different plugins, the chosen accelerator will depend on the plugins. If plugin A depends on B, the accelerators defined in B is used. If A and B don&apos;t depend on each other, they will be alphabetically sorted by the plugin id. 
-&lt;p&gt;
-If two accelerators are defined in different scopes, the accelerator defined in the current scope will be used. If an accelerator is not defined in the current scope or one of its parents it is discarded. If an accelerator is defined in a parent and child scope, the one in the child is used.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The workbench provides accelerator sets for the Default and Emacs accelerator configurations.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2002, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/actionDefinitions.exsd b/bundles/org.eclipse.ui/schema/actionDefinitions.exsd
deleted file mode 100644
index 6c42025..0000000
--- a/bundles/org.eclipse.ui/schema/actionDefinitions.exsd
+++ /dev/null
@@ -1,164 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="actionDefinitions" name="Action Definitions"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;
-&lt;b&gt;WARNING: This extension point is DEPRECATED.&lt;/b&gt;&lt;br&gt;
-Do not use this extension point, it will be removed in future versions of this product.
-Instead, use the extension point &lt;a href=&quot;org_eclipse_ui_commands.html&quot;&gt;org.eclipse.ui.commands&lt;/a&gt;
-&lt;/p&gt;
-This extension point is used to register action definitions. Accelerators (see the Accelerator Sets extension point) use action definitions to reference actions. An action associates itself with a given accelerator by registering with that accelerator&apos;s associated action definition. An action registers itself with an action definition by calling the setActionDefinitionId(String id) method and supplying the action definition&apos;s id as an argument.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element deprecated="true"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="actionDefinition" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="actionDefinition">
-      <annotation>
-         <appInfo>
-            <meta.element deprecated="true"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that can be used to identify this action.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  the name of the action as displayed to the user.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  a short description of the action to display to the user.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         Release 2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         Following is an example of an action definition extension: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.actionDefinitions&quot;&gt; 
-      &lt;actionDefinition 
-        id=&quot;org.eclipse.ui.file.save&quot;&gt; 
-      &lt;/actionDefinition&gt; 
-      &lt;actionDefinition 
-        id=&quot;org.eclipse.ui.file.saveAll&quot;&gt; 
-      &lt;/actionDefinition&gt; 
-      &lt;actionDefinition 
-        id=&quot;org.eclipse.ui.file.close&quot;&gt; 
-      &lt;/actionDefinition&gt; 
-      &lt;actionDefinition 
-        id=&quot;org.eclipse.ui.file.closeAll&quot;&gt; 
-      &lt;/actionDefinition&gt; 
-      &lt;actionDefinition 
-        id=&quot;org.eclipse.ui.file.print&quot;&gt; 
-      &lt;/actionDefinition&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The methods public void setActionDefinitionId(String id) and public String getActionDefinitionId() have been added to IAction. 
-&lt;p&gt;
-&lt;B&gt;&lt;font color=&quot;#FF0000&quot;&gt;NOTE&lt;/font&gt; -&lt;/b&gt; other attributes may be added in the future, as needed.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The workbench provides many action definitions.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2002, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/actionSetPartAssociations.exsd b/bundles/org.eclipse.ui/schema/actionSetPartAssociations.exsd
deleted file mode 100644
index 9d695f9..0000000
--- a/bundles/org.eclipse.ui/schema/actionSetPartAssociations.exsd
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="actionSetPartAssociations" name="Action Set Part Associations"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to define an action set which should be added to a perspective when a part (view or editor) is opened in the perspective.
-In the case of an editor, the action set will remain visible while the editor is the current editor.
-In the case of a view, the action set will be visible when the view is the active part.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="actionSetPartAssociation" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="actionSetPartAssociation">
-      <complexType>
-         <sequence>
-            <element ref="part" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="targetID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of the action set (as specified in the
-registry) which is to be associated with particular workbench
-views and/or editors.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.actionSets/actionSet/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="part">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of the part (view or editor) to be associated with the action set.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of an action set part association (note the subelement and the way attributes are used):
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.ui.actionSetPartAssociations&quot;&gt;
-  &lt;actionSetPartAssociation targetID=&quot;org.eclipse.jdt.ui.refactoring.actionSet&quot;&gt;
-   &lt;part id=&quot;org.eclipse.jdt.ui.PackageExplorer&quot;/&gt;
-   &lt;part id=&quot;org.eclipse.jdt.ui.CompilationUnitError&quot;/&gt;
-  &lt;/actionSetPartAssociation&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-In the example above, a view or editor are associated with the refactoring action set.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The user may override these associations using the customize perspective dialog.  Regardless of these associations,
-action sets which the user turns off will never appear and action sets which the user turns on will always be visible.
-      </documentation>
-   </annotation>
-
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/actionSets.exsd b/bundles/org.eclipse.ui/schema/actionSets.exsd
deleted file mode 100644
index ecce346..0000000
--- a/bundles/org.eclipse.ui/schema/actionSets.exsd
+++ /dev/null
@@ -1,603 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="actionSets" name="Action Sets"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-This extension point is used to add menus, menu items 
-and toolbar buttons to the common areas in the Workbench
-window. These contributions are collectively known 
-as an &lt;i&gt;action set&lt;/i&gt; and appear within the 
-Workbench window by the user customizing a perspective.
-&lt;/p&gt;
-&lt;p&gt;
-You can now use &lt;a href=&quot;org_eclipse_ui_menus.html&quot;&gt;org.eclipse.ui.menus&lt;/a&gt; to place commands in menus and toolbars as well.
-&lt;/p&gt;
-&lt;p&gt;
-There is an implementation limitation which currently affects action sets.  It is important to define the entire menu structure that is to be referenced within the action set.  So, for example, if another action set defines a menu called &quot;example&quot;, it is not possible to rely on &quot;example&quot; existing.  It is necessary to redefine the &quot;example&quot; menu in every action set that wishes to use it.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="commonAction.exsd"/>
-
-   <include schemaLocation="commonExpression.exsd"/>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="actionSet" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="actionSet">
-      <annotation>
-         <documentation>
-            This element is used to define a group of actions and/or menus.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="menu" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="action" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier for this action set.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name used by the Workbench to represent this action set to the user.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="visible" type="boolean">
-            <annotation>
-               <documentation>
-                  an optional attribute indicating whether the action set is initially visible when a perspective is open. This option is only honoured when the user opens a perspective which has not been customized. The user can override this option from the &quot;Customize Perspective Dialog&quot;. This attribute should be used with great care so as not to overwhelm the user with too many actions.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  a translatable description used by the Workbench to represent this action set to the user.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="action">
-      <annotation>
-         <documentation>
-            This element defines an action that the user can invoke in the UI.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <choice>
-               <element ref="selection" minOccurs="0" maxOccurs="unbounded"/>
-               <element ref="enablement" minOccurs="0" maxOccurs="1"/>
-            </choice>
-            <element ref="class" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier used as a reference for this action.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name used either as the menu item text or toolbar button label. The name can include mnenomic information.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="accelerator" type="string">
-            <annotation>
-               <documentation>
-                  Use the &lt;samp&gt;definitionId&lt;/samp&gt; attribute instead.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="definitionId" type="string">
-            <annotation>
-               <documentation>
-                  Specifies the command that this action will handle. By specifying and action, the key binding service can assign a key sequence to this action. See the extension point &lt;a href=&quot;org_eclipse_ui_commands.html&quot;&gt;org.eclipse.ui.commands&lt;/a&gt; for more information.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.commands/command/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="menubarPath" type="string">
-            <annotation>
-               <documentation>
-                  a slash-delimited path (&apos;/&apos;) used to specify the location of this action in the menu bar.
-Each token in the path, except the last one, must represent a valid identifier of an existing menu in the hierarchy. The last token represents the named group into which this action will be added. If the path is omitted, this action will not appear in the menu bar.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="toolbarPath" type="string">
-            <annotation>
-               <documentation>
-                  a slash-delimited path (&apos;/&apos;) that is used to specify the location of this action in the toolbar. The first token represents the toolbar identifier (with &quot;Normal&quot; being the default toolbar), while the second token is the named group within the toolbar that this action will be added to. If the group does not exist in the toolbar, it will be created.
-If toolbarPath is omitted, the action will not appear in the toolbar.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon used to visually represent the action in its context.
-If omitted and the action appears in the toolbar, the Workbench will use a placeholder icon. The path is relative to the location of the plugin.xml file of the contributing plug-in. The icon will appear in toolbars but not in menus. Enabled actions will be represented in menus by the hoverIcon.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="disabledIcon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon used to visually represent the action in its context when the action is disabled. If omitted, the normal icon will simply appear greyed out. The path is relative to the location of the plugin.xml file of the contributing plug-in. The disabled icon will appear in toolbars but not in menus. Icons for disabled actions in menus will be supplied by the OS.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="hoverIcon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon used to visually represent the action in its context when the mouse pointer is over the action. If omitted, the normal icon will be used. The path is relative to the location of the plugin.xml file of the contributing plug-in.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="tooltip" type="string">
-            <annotation>
-               <documentation>
-                  a translatable text representing the action&apos;s tool tip. Only used if the action appears in the toolbar.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="helpContextId" type="string">
-            <annotation>
-               <documentation>
-                  a unique identifier indicating the help context for this action. If the action appears as a menu item, then pressing F1 while the menu item is highlighted will display help.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="style" use="default" value="push">
-            <annotation>
-               <documentation>
-                  an attribute to define the user interface style type for the action. If omitted, then it is &lt;samp&gt;push&lt;/samp&gt; by default. The attribute value will be one of the following:
-    &lt;table border=&quot;0&quot; width=&quot;80%&quot;&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;push&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a regular menu item or tool item.&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;radio&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a radio style menu item or tool item. Actions with the radio style within the same menu or toolbar group behave as a radio set. The initial value is specified by the &lt;samp&gt;state&lt;/samp&gt; attribute.&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;toggle&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a checked style menu item or as a toggle tool item. The initial value is specified by the &lt;samp&gt;state&lt;/samp&gt; attribute.&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;pulldown&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a cascading style menu item or as a drop down menu beside the tool item.&lt;/td&gt;
-      &lt;/tr&gt;
-    &lt;/table&gt;
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="push">
-                  </enumeration>
-                  <enumeration value="radio">
-                  </enumeration>
-                  <enumeration value="toggle">
-                  </enumeration>
-                  <enumeration value="pulldown">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="state" type="boolean">
-            <annotation>
-               <documentation>
-                  an optional attribute indicating the initial state (either &lt;samp&gt;true&lt;/samp&gt; or &lt;samp&gt;false&lt;/samp&gt;). Used only when the &lt;samp&gt;style&lt;/samp&gt; attribute has the value &lt;samp&gt;radio&lt;/samp&gt; or &lt;samp&gt;toggle&lt;/samp&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="pulldown" type="boolean">
-            <annotation>
-               <documentation>
-                  Use the &lt;samp&gt;style&lt;/samp&gt; attribute with the value &lt;samp&gt;pulldown&lt;/samp&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  a fully qualified name of a class which implements &lt;samp&gt;org.eclipse.ui.IWorkbenchWindowActionDelegate&lt;/samp&gt; or &lt;samp&gt;org.eclipse.ui.IWorkbenchWindowPulldownDelegate&lt;/samp&gt;. The latter should be implemented in cases where the &lt;samp&gt;style&lt;/samp&gt; attribute has the value &lt;samp&gt;pulldown&lt;/samp&gt;. This class is the handler responsible for performing the action. If the &lt;samp&gt;retarget&lt;/samp&gt; attribute is true, this attribute is ignored and should not be supplied.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.IWorkbenchWindowActionDelegate"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="retarget" type="boolean">
-            <annotation>
-               <documentation>
-                  an optional attribute to retarget this action. When true, view and editor parts may supply a handler for this action using the standard mechanism for setting a global action handler on their site using this action&apos;s identifier. If this attribute is true, the &lt;samp&gt;class&lt;/samp&gt; attribute should not be supplied.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="allowLabelUpdate" type="boolean">
-            <annotation>
-               <documentation>
-                  optional attribute indicating whether the retarget action allows the handler to override it&apos;s label and tooltip. Only applies if &lt;samp&gt;retarget&lt;/samp&gt; attribute is true.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="enablesFor" type="string">
-            <annotation>
-               <documentation>
-                  a value indicating the selection count which must be met to enable the action. If specified and the condition is not met, the action is disabled. If omitted, the action enablement state is not affected. The following attribute formats are supported: 
-    &lt;table border=&quot;0&quot; width=&quot;80%&quot;&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;!&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 0 items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;?&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 0 or 1 items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;+&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 1 or more items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;multiple, 2+&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 2 or more items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;n&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- a precise number of items selected.a precise number of items selected.&amp;nbsp;
-          For example: enablesFor=&amp;quot; 4&amp;quot; enables the action only when 4
-          items are selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;*&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- any number of items selected&lt;/td&gt;
-      &lt;/tr&gt;
-    &lt;/table&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="mode">
-            <annotation>
-               <documentation>
-                  For actions appearing in a toolbar, &lt;code&gt;FORCE_TEXT&lt;/code&gt; will show text even if there is an icon.  See ActionContribuitonItem.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="FORCE_TEXT">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="parameter">
-      <annotation>
-         <documentation>
-            A parameter element to be used within an IExecutableExtension element.  This will be passed as initialization data to the instantiated class.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the parameter name
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the parameter value
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="class">
-      <annotation>
-         <documentation>
-            The element version of the &lt;code&gt;class&lt;/code&gt; attribute.  This is used when the class implements &lt;code&gt;org.eclipse.core.runtime.IExecutableExtension&lt;/code&gt; and there is parameterized data that you wish used in its initialization.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  A class that implements &lt;code&gt;org.eclipse.ui.IWorkbenchWindowActionDelegate&lt;/code&gt;.  It may also implement &lt;code&gt;org.eclipse.core.runtime.IExecutableExtension&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of an action set (note 
-the sub-elements and the way attributes are used): 
-
-&lt;p&gt;
-&lt;pre&gt;
-    &lt;extension point = &quot;org.eclipse.ui.actionSets&quot;&gt; 
-        &lt;actionSet
-            id=&quot;com.xyz.actionSet&quot; 
-            label=&quot;My Actions&quot;&gt; 
-            &lt;menu
-               id=&quot;com.xyz.xyzMenu&quot; 
-               label=&quot;XYZ Menu&quot;
-               path=&quot;additions&quot;&gt; 
-               &lt;separator name=&quot;group1&quot;/&gt;
-               &lt;separator name=&quot;option1&quot;/&gt;
-            &lt;/menu&gt;
-            
-            &lt;action
-               id=&quot;com.xyz.runXYZ&quot; 
-               label=&quot;&amp;amp;Run XYZ Tool&quot;
-               style=&quot;toggle&quot;
-               state=&quot;false&quot;
-               menubarPath=&quot;com.xyz.xyzMenu/group1&quot; 
-               icon=&quot;icons/runXYZ.gif&quot; 
-               tooltip=&quot;Run XYZ Tool&quot; 
-               helpContextId=&quot;com.xyz.run_action_context&quot; 
-               class=&quot;com.xyz.actions.RunXYZ&quot; 
-               enablesFor=&quot;1&quot;&gt; 
-               &lt;selection class=&quot;org.eclipse.core.resources.IFile&quot; name=&quot;*.java&quot;/&gt; 
-            &lt;/action&gt;
-            &lt;action 
-               id=&quot;com.xyz.runABC&quot;
-               label=&quot;&amp;amp;Run ABC Tool&quot;
-               style=&quot;push&quot;
-               menubarPath=&quot;com.xyz.xyzMenu/group1&quot;
-               toolbarPath=&quot;Normal/XYZ&quot;
-               icon=&quot;icons/runABC.gif&quot;
-               tooltip=&quot;Run ABC Tool&quot;
-               helpContextId=&quot;com.xyz.run_abc_action_context&quot;
-               retarget=&quot;true&quot;
-               allowLabelUpdate=&quot;true&quot;&gt;
-               &lt;enablement&gt;
-                  &lt;and&gt;
-                     &lt;objectClass name=&quot;org.eclipse.core.resources.IFile&quot;/&gt;
-                     &lt;not&gt;
-                        &lt;objectState name=&quot;extension&quot; value=&quot;java&quot;/&gt;
-                     &lt;/not&gt;
-                  &lt;/and&gt;
-               &lt;/enablement&gt;
-            &lt;/action&gt;             
-
-            &lt;action 
-               id=&quot;com.xyz.runDEF&quot;
-               label=&quot;&amp;amp;Run DEF Tool&quot;
-               style=&quot;radio&quot;
-               state=&quot;true&quot;
-               menubarPath=&quot;com.xyz.xyzMenu/option1&quot;
-               icon=&quot;icons/runDEF.gif&quot;
-               tooltip=&quot;Run DEF Tool&quot;
-               class=&quot;com.xyz.actions.RunDEF&quot; 
-               helpContextId=&quot;com.xyz.run_def_action_context&quot;&gt;
-            &lt;/action&gt;             
-            &lt;action 
-               id=&quot;com.xyz.runGHI&quot;
-               label=&quot;&amp;amp;Run GHI Tool&quot;
-               style=&quot;radio&quot;
-               state=&quot;false&quot;
-               menubarPath=&quot;com.xyz.xyzMenu/option1&quot;
-               icon=&quot;icons/runGHI.gif&quot;
-               tooltip=&quot;Run GHI Tool&quot;
-               class=&quot;com.xyz.actions.RunGHI&quot; 
-               helpContextId=&quot;com.xyz.run_ghi_action_context&quot;&gt;
-            &lt;/action&gt;             
-            &lt;action 
-               id=&quot;com.xyz.runJKL&quot;
-               label=&quot;&amp;amp;Run JKL Tool&quot;
-               style=&quot;radio&quot;
-               state=&quot;false&quot;
-               menubarPath=&quot;com.xyz.xyzMenu/option1&quot;
-               icon=&quot;icons/runJKL.gif&quot;
-               tooltip=&quot;Run JKL Tool&quot;
-               class=&quot;com.xyz.actions.RunJKL&quot; 
-               helpContextId=&quot;com.xyz.run_jkl_action_context&quot;&gt;
-            &lt;/action&gt;             
-        &lt;/actionSet&gt; 
-    &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-In the example above, the specified action set, named &quot;My Actions&quot;, is not initially visible within each perspective because the &lt;samp&gt;visible&lt;/samp&gt; attribute is not specified.
-&lt;/p&gt;
-&lt;p&gt;
-The XYZ action will appear as a check box menu item, initially not checked. It is enabled only if the selection count is 1 and if the selection contains a Java file resource.
-&lt;/p&gt;
-&lt;p&gt;
-The ABC action will appear both in the menu and on the toolbar. It is enabled only if the selection does not contain any Java file resources. Note also this is a label retarget action therefore it does not supply a &lt;samp&gt;class&lt;/samp&gt; attribute.
-&lt;/p&gt;
-&lt;p&gt;
-The actions DEF, GHI, and JKL appear as radio button menu items. They are enabled all the time, independent of the current selection state.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The value of the class attribute must be the fully qualified name of a class that implements &lt;samp&gt;org.eclipse.ui.IWorkbenchWindowActionDelegate&lt;/samp&gt; or &lt;samp&gt;org.eclipse.ui.IWorkbenchWindowPulldownDelegate&lt;/samp&gt;. The latter should be implemented in cases where the &lt;samp&gt;style&lt;/samp&gt; attribute has the value &lt;samp&gt;pulldown&lt;/samp&gt;. This class is the handler responsible for performing the action. If the &lt;samp&gt;retarget&lt;/samp&gt; attribute is true, this attribute is ignored and should not be supplied. This class is loaded as late as possible to avoid loading the entire plug-in before it is really needed.
-&lt;p&gt;
-The enablement criteria for an action extension is initially defined by &lt;samp&gt;enablesFor&lt;/samp&gt;, and also either &lt;samp&gt;selection&lt;/samp&gt; or &lt;samp&gt;enablement&lt;/samp&gt;. However, once the action delegate has been instantiated, it may control the action enable state directly within its &lt;samp&gt;selectionChanged&lt;/samp&gt; method.
-&lt;p&gt;
-It is important to note that the workbench does not generate menus on a plug-in&apos;s behalf. Menu paths must reference menus that already exist.
-&lt;p&gt;
-Action and menu labels may contain special characters that encode mnemonics using the following rules:
-&lt;ol&gt;
-&lt;li&gt;
-Mnemonics are specified using the ampersand (&apos;&amp;amp;&apos;) character in front of a selected character in the translated text. Since ampersand is not allowed in XML strings, use &lt;samp&gt;&amp;amp;amp;&lt;/samp&gt; character entity.&lt;/li&gt;
-&lt;/ol&gt;
-If two or more actions are contributed to a menu or toolbar by a single extension the actions will appear in the reverse order of how they are listed in the plugin.xml file. This behavior is admittedly unintuitive.  However, it was discovered after the Eclipse Platform API was frozen. Changing the behavior now would break every plug-in which relies upon the existing behavior.
-&lt;p&gt;
-The &lt;samp&gt;selection&lt;/samp&gt; and &lt;samp&gt;enablement&lt;/samp&gt; elements are mutually exclusive. The &lt;samp&gt;enablement&lt;/samp&gt; element can replace the &lt;samp&gt;selection&lt;/samp&gt; element using the sub-elements &lt;samp&gt;objectClass&lt;/samp&gt; and &lt;samp&gt;objectState&lt;/samp&gt;. For example, the following:
-&lt;pre&gt;
- &lt;selection
-  class=&quot;org.eclipse.core.resources.IFile&quot;
-  name=&quot;*.java&quot;&gt;
- &lt;/selection&gt;
-&lt;/pre&gt;
-can be expressed using:
-&lt;pre&gt;
- &lt;enablement&gt;
-  &lt;and&gt;
-   &lt;objectClass name=&quot;org.eclipse.core.resources.IFile&quot;/&gt;
-   &lt;objectState name=&quot;extension&quot; value=&quot;java&quot;/&gt;
-  &lt;/and&gt;
- &lt;/enablement&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         Plug-ins may use this extension point to add new top level menus. Plug-ins can also define named groups which allow other plug-ins to contribute their actions into them. 
-&lt;p&gt;
-Top level menus are created by using the following values
-for the path attribute: 
-&lt;ul&gt;
-&lt;li&gt;additions - represents a group immediately to the left of the &lt;samp&gt;Window&lt;/samp&gt; menu. 
-&lt;/ul&gt;
-Omitting the path attribute will result in adding the new menu into the additions menu bar group. 
-&lt;/p&gt;
-&lt;p&gt;
-The default groups in a workbench window are defined in the
-&lt;samp&gt;IWorkbenchActionConstants&lt;/samp&gt; interface. These
-constants can be used in code for dynamic contribution.
-The values can also be copied into an XML file for fine
-grained integration with the existing workbench menus
-and toolbar. 
-&lt;/p&gt;
-&lt;p&gt;
-Various menu and toolbar items within the workbench 
-window are defined algorithmically.  In these cases 
-a separate mechanism must be used to extend the 
-window. For example, adding a new workbench view 
-results in a new menu item appearing in the
-Perspective menu. Import, Export, and New Wizards 
-extensions are also added automatically to the window.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2000, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/activities.exsd b/bundles/org.eclipse.ui/schema/activities.exsd
deleted file mode 100644
index be1a72d..0000000
--- a/bundles/org.eclipse.ui/schema/activities.exsd
+++ /dev/null
@@ -1,368 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="activities" name="Activities"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-The &lt;code&gt;org.eclipse.ui.activities&lt;/code&gt; extension point is used to declare activities and associated elements.  Activities are used by the platform to filter certain plugin contributions from the users view until such a time that they express interest in them.  This allows Eclipse to grow dynamically based on the usage pattern of a user.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>
-
-   <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="activity"/>
-            <element ref="activityRequirementBinding"/>
-            <element ref="activityPatternBinding"/>
-            <element ref="category"/>
-            <element ref="categoryActivityBinding"/>
-            <element ref="defaultEnablement"/>
-         </sequence>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="activity">
-      <annotation>
-         <documentation>
-            This element is used to define activities. If more than one of these elements exist with the same &lt;code&gt;id&lt;/code&gt; attribute, only the last declared element (in order of reading the registry) is considered valid.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="enabledWhen" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  a translatable short description of this activity for display in the UI
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of this activity
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the translatable name of this activity for display in the UI
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="activityRequirementBinding">
-      <annotation>
-         <documentation>
-            This element allows one to bind activities to activities. The relationship is such that if the activityId is ever enabled then the requiredActivityId is enabled as well.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="requiredActivityId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of required activity to bind
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.activities/activity/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="activityId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of the activity to bind
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.activities/activity/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="activityPatternBinding">
-      <annotation>
-         <documentation>
-            This element allows one to bind activities to patterns.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="activityId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of the activity to bind
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.activities/activity/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="pattern" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the pattern to be bound. Patterns are regular expressions which match unique identifiers.  Please see the Java documentation for &lt;code&gt;java.util.regex.Pattern&lt;/code&gt; for further details.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="isEqualityPattern" type="boolean">
-            <annotation>
-               <documentation>
-                  if the pattern should be considered &quot;as is&quot;.  This is an optional attribute and if ommited the value is false  If this is false the pattern string will be compiled into a regular expression when determining whether or not a given identifier matches the pattern.  If this is true, a direct equality comparison is performed instead.  
-
-Since 3.4
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="category">
-      <annotation>
-         <documentation>
-            This element is used to define categories. If more than one of these elements exist with the same &lt;code&gt;id&lt;/code&gt; attribute, only the last declared element (in order of reading the registry) is considered valid.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  a translatable short description of this category for display in the UI
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of this category
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the translatable name of this category for display in the UI
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="categoryActivityBinding">
-      <annotation>
-         <documentation>
-            This element allows one to bind categories to activities.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="activityId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of the activity to bind
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.activities/activity/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="categoryId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of the category to bind
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.activities/category/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="defaultEnablement">
-      <annotation>
-         <documentation>
-            This element allows one to specify that a given activity should be enabled by default.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of the activity
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.activities/activity/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="enabledWhen">
-      <annotation>
-         <documentation>
-            &lt;p&gt;Contains a core expression used by the workbench handler proxy to determine when this handler is enabled without loading it.&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice>
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-            <element ref="reference"/>
-         </choice>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-3.0
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of several activity and category definitions as well as associated bindings.
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.ui.activities&quot;&gt;
-  &lt;activity id=&quot;com.xyz.Activity&quot;
-      description=&quot;Filters contributions from com.xyz&quot;
-   name=&quot;My Activity&quot; /&gt;
-
-  &lt;activity id=&quot;com.xyz.OtherActivity&quot;
-      description=&quot;Filters other contributions from com.xyz&quot;
-   name=&quot;My Other Activity&quot; /&gt;
-  &lt;!-- other activity requires activity --&gt;  
-  &lt;activityRequirementBinding activityId=&quot;com.xyz.OtherActivity&quot;
-   requiredActivityId=&quot;com.xyz.Activity&quot; /&gt;
-  &lt;category id=&quot;com.xyz.Category&quot;
-   description=&quot;com.xyz Activities&quot;
-   name=&quot;My Category&quot; /&gt;
-   
-     &lt;!-- put the activity in the category --&gt;
-  &lt;categoryActivityBinding activityId=&quot;com.xyz.Activity&quot;
-   categoryId=&quot;com.xyz.Category&quot; /&gt;
-   
-     &lt;!-- bind all contributions from plugin com.xyz --&gt;
-  &lt;activityPatternBinding id=&quot;com.xyz.Activity&quot;
-   pattern=&quot;com\.xyz/.*&quot; /&gt;
-  
-  &lt;!-- bind my.contribution from plugin com.xyz.other --&gt;
-  &lt;activityPatternBinding id=&quot;com.xyz.OtherActivity&quot;
-   pattern=&quot;com\.xyz\.other/my.contribution&quot; /&gt;
-   
-  &lt;!-- the same, but not with a regular expression, since the pattern
-          should match the id exactly anyway --&gt;
-  &lt;activityPatternBinding id=&quot;com.xyz.OtherActivity&quot;
-   isEqualityPattern=&quot;true&quot;
-   pattern=&quot;com.xyz.other/my.contribution&quot; /&gt;
-   
-  &lt;!-- our activity should be enabled by default --&gt;
-  &lt;defaultEnablement id=&quot;com.xyz.Activity&quot; /&gt;  
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-There is currently no public API for declaring activities or associated elements other than this extension point.  The state of activities in the workbench is accessible via &lt;code&gt;org.eclipse.ui.IWorkbench.getActivitySupport()&lt;/code&gt;.  From here you may query and update the set of currently enabled activities.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         There are no &quot;default activities&quot; provided by the workbench.  Activities are intended to be defined at the product level, such as the Eclipse SDK, so as to tightly integrate all of the (known) components that product contains.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2000, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/activitySupport.exsd b/bundles/org.eclipse.ui/schema/activitySupport.exsd
deleted file mode 100644
index 40c8013..0000000
--- a/bundles/org.eclipse.ui/schema/activitySupport.exsd
+++ /dev/null
@@ -1,302 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="activitySupport" name="Activity Support"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;This extension point is used to register various support extensions relating to the activities infrastucture.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <choice minOccurs="0" maxOccurs="unbounded">
-            <element ref="triggerPoint"/>
-            <element ref="triggerPointAdvisor"/>
-            <element ref="triggerPointAdvisorProductBinding"/>
-            <element ref="categoryImageBinding"/>
-            <element ref="activityImageBinding"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="triggerPoint">
-      <annotation>
-         <documentation>
-            Specifies a trigger point.  A trigger point is an identifer that is used by the activity engine to determine whether or not an action should cause the enablement of activities.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="hint" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier for this trigger point
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="hint">
-      <annotation>
-         <documentation>
-            &lt;p&gt;A hint represents some data that may be used by the eclipse infrastructure to determine the behaviour of the activity support relating to the hosting trigger point.&lt;/p&gt;
-&lt;p&gt;The following hints are &quot;well known&quot; and it is expected that trigger point advisors acknowledge them:
-&lt;dl&gt;
-&lt;dt&gt;interactive&lt;/dt&gt;&lt;dd&gt;Whether this trigger point is hint in an &quot;interactive&quot; way.  Ie: it is the explicit result of an action undertaken by the user such as activating a wizard in the wizard dialog.  Accepted values are &lt;code&gt;true&lt;/code&gt; and &lt;code&gt;false&lt;/code&gt;&lt;/dd&gt;
-&lt;/dl&gt;
-&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier for this hint
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the value of this hint
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="triggerPointAdvisor">
-      <annotation>
-         <documentation>
-            A trigger point advisor is a policy mechanism that is consulted whenever the system undertakes an action that has disabled activities associated with it.  It is the advisors responsibility to answer whether an action should proceed, and if it can, what activities to enable.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier for this trigger point advisor
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified name of the class implementing the &lt;code&gt;org.eclipse.ui.activities.ITriggerPointAdvisor&lt;/code&gt; interface.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.activities.ITriggerPointAdvisor"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="triggerPointAdvisorProductBinding">
-      <annotation>
-         <documentation>
-            Specifies a binding between a product and an advisor.  These bindings determine which advisor is appropriate for the current product (as defined by &lt;code&gt;org.eclipse.core.runtime.Platform.getProduct()&lt;/code&gt;).
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="productId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  unique id of a product
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="triggerPointAdvisorId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  unique id of a trigger point advisor
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.activitySupport/triggerPointAdvisor/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="categoryImageBinding">
-      <annotation>
-         <documentation>
-            This element allows binding of icons to categories  These icons may be used by user interface components that wish to visualize categories in some way.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the id of the category to bind an icon to
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.activities/category/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the icon that will be used for this category
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="activityImageBinding">
-      <annotation>
-         <documentation>
-            This element allows binding of icons to activities.  These icons may be used by user interface components that wish to visualize activities in some way.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the id of the activity to bind an icon to
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.activities/activity/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the icon that will be used for this activity
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of a non-interactive trigger point:
-&lt;p&gt;
-&lt;pre&gt;
-  &lt;extension point=&quot;org.eclipse.ui.activitySupport&quot;&gt;
-     &lt;triggerPoint
-        id=&quot;com.example.xyz.myTriggerPoint&quot;&gt;
-        &lt;hint id=&quot;interactive&quot; 
-              value=&quot;false&quot; /&gt;
-     &lt;/triggerPoint&gt;
-  &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-The following is an example of a trigger point advisor bound to a particular product:
-&lt;p&gt;
-&lt;pre&gt;
-  &lt;extension point=&quot;org.eclipse.ui.activitySupport&quot;&gt;
-     &lt;triggerPointAdvisor
-        id=&quot;com.example.xyz.myTriggerPointAdvisor&quot; 
-        class=&quot;com.example.xyz.AdvisorImpl&quot;/&gt;
-     &lt;triggerPointAdvisorProductBinding 
-      productId=&quot;myProduct&quot;
-      triggerPointAdvisorId=&quot;com.example.xyz.myTriggerPointAdvisor&quot; /&gt;
-  &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-
-The following is an example of binding images to activities and categories:
-&lt;p&gt;
-&lt;pre&gt;
-  &lt;extension point=&quot;org.eclipse.ui.activitySupport&quot;&gt;
-    &lt;activityImageBinding
-       id=&quot;some.activity.id&quot;
-       icon=&quot;icons/someIcon.gif&quot;/&gt;    
-    &lt;categoryImageBinding
-       id=&quot;some.category.id&quot;
-       icon=&quot;icons/someIcon.gif&quot;/&gt;
-  &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The value of the &lt;code&gt;class&lt;/code&gt; attribute of the triggerPointAdvisor tag must be the fully qualified name of a class that implements the &lt;code&gt;org.eclipse.ui.activities.ITriggerPointAdvisor&lt;/code&gt;.
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         The workbench implementation (&lt;code&gt;org.eclipse.ui.activities.WorkbenchTriggerPointAdvisor&lt;/code&gt;) is available for clients to subclass and reuse.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/bindings.exsd b/bundles/org.eclipse.ui/schema/bindings.exsd
deleted file mode 100644
index 7a73a99..0000000
--- a/bundles/org.eclipse.ui/schema/bindings.exsd
+++ /dev/null
@@ -1,297 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="bindings" name="Bindings"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-The &lt;code&gt;org.eclipse.ui.bindings&lt;/code&gt; extension point is used to declare bindings and schemes.  Schemes are sets of one or more bindings.  A binding is a mapping between a certain group of conditions, some user input and a triggered command.
-&lt;/p&gt;
-&lt;p&gt;
-All bindings require a trigger of some kind, a context in which they are active and scheme in which they exist.  If you&apos;re not sure which context to chose, then just leave it blank.  It will default to &lt;code&gt;&quot;org.eclipse.ui.contexts.window&quot;&lt;/code&gt; context.  This context means that the binding will apply in any Eclipse main window.  When the context becomes active, the binding will become active as well.  Bindings from child contexts will override bindings from parent contexts.  For more information about contexts, please see the &lt;code&gt;org.eclipse.ui.contexts&lt;/code&gt; extension point.
-&lt;/p&gt;
-&lt;p&gt;
-If a binding does not define a command identifier, then it is a deletion marker.  This means that if all the conditions are met, it will cancel any bindings with the same trigger in the same context.  This mechanism can be used, for example, to change a binding on a particular platform.
-&lt;/p&gt;
-&lt;p&gt;
-One type of binding is a &lt;code&gt;key&lt;/code&gt; binding (i.e., a keyboard shortcut).  For example, binding &lt;code&gt;Ctrl+C&lt;/code&gt; to &lt;code&gt;Copy&lt;/code&gt; is considered a &lt;code&gt;key&lt;/code&gt; binding.  The trigger for a key binding is a sequence of key strokes.
-&lt;/p&gt;
-&lt;p&gt;
-A scheme is a group of these bindings into a set that the end user can select.  For example, a user might want to use the default scheme, but they might also want an Emacs-style scheme or a Brief-style scheme.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="scheme" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="key" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="scheme">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name"/>
-         </appinfo>
-         <documentation>
-            &lt;p&gt;
-A scheme is a grouping of bindings that an end user can chose to use.
-&lt;/p&gt;
-&lt;p&gt;
-It is possible for schemes to inherit bindings from a parent scheme.  This is intended to make it easier for plug-in developers to create customized binding sets.  An active binding defined in a child scheme will always override an active binding in a parent scheme, if they have the same trigger.  This technique is used to provide the Emacs scheme in the workbench.
-&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique identifier for this scheme.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name for this scheme, as it should be displayed to an end-user.  This value should be translated.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  The description for this scheme, as it would be displayed to an end user.  This value should be translated.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="parentId" type="string">
-            <annotation>
-               <documentation>
-                  The identifier for the parent of this scheme.  If there is no parent, then do not specify this attribute.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.bindings/scheme/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="key">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="commandId"/>
-         </appinfo>
-         <documentation>
-            &lt;p&gt;A binding between some keyboard input and the triggering of a command.&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice>
-            <element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
-         </choice>
-         <attribute name="sequence" type="string" use="required">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;
-The key sequence for this binding.  This key sequence should consist of one or more key strokes.  Key strokes are separated by spaces.  Key strokes consist of one or more keys held down at the same time.  This should be zero or more modifier keys, and one other key.  The keys are separated by the &lt;code&gt;+&lt;/code&gt; character.
-&lt;/p&gt;
-&lt;p&gt;
-The recognized modifiers keys are &lt;code&gt;M1&lt;/code&gt;, &lt;code&gt;M2&lt;/code&gt;, &lt;code&gt;M3&lt;/code&gt;, &lt;code&gt;M4&lt;/code&gt;, &lt;code&gt;ALT&lt;/code&gt;, &lt;code&gt;COMMAND&lt;/code&gt;, &lt;code&gt;CTRL&lt;/code&gt;, and &lt;code&gt;SHIFT&lt;/code&gt;.  The &quot;M&quot; modifier keys are a platform-independent way of representing keys, and these are generally preferred.  &lt;code&gt;M1&lt;/code&gt; is the &lt;code&gt;COMMAND&lt;/code&gt; key on MacOS X, and the &lt;code&gt;CTRL&lt;/code&gt; key on most other platforms.  &lt;code&gt;M2&lt;/code&gt; is the &lt;code&gt;SHIFT&lt;/code&gt; key.  &lt;code&gt;M3&lt;/code&gt; is the &lt;code&gt;Option&lt;/code&gt; key on MacOS X, and the &lt;code&gt;ALT&lt;/code&gt; key on most other platforms.  &lt;code&gt;M4&lt;/code&gt; is the &lt;code&gt;CTRL&lt;/code&gt; key on MacOS X, and is undefined on other platforms.
-Since &lt;code&gt;M2+M3+&amp;lt;Letter&amp;gt;&lt;/code&gt; (&lt;code&gt;Alt+Shift+&amp;lt;Letter&amp;gt;&lt;/code&gt;) is reserved on MacOS X for writing special characters, such bindings are commonly undefined for &lt;code&gt;platform=&quot;carbon&quot;&lt;/code&gt; and redefined as &lt;code&gt;M1+M3+&amp;lt;Letter&amp;gt;&lt;/code&gt;.
-&lt;/p&gt;
-&lt;p&gt;
-The actual key is generally specified simply as the ASCII character, in uppercase.  So, for example &lt;code&gt;F&lt;/code&gt; or &lt;code&gt;,&lt;/code&gt; are examples of such keys.  However, there are some special keys; keys that have no printable ASCII representation.  The following is a list of the current special keys: &lt;code&gt;ARROW_DOWN&lt;/code&gt;, &lt;code&gt;ARROW_LEFT&lt;/code&gt;, &lt;code&gt;ARROW_RIGHT&lt;/code&gt;, &lt;code&gt;ARROW_UP&lt;/code&gt;, &lt;code&gt;BREAK&lt;/code&gt;, &lt;code&gt;BS&lt;/code&gt;, &lt;code&gt;CAPS_LOCK&lt;/code&gt;, &lt;code&gt;CR&lt;/code&gt;, &lt;code&gt;DEL&lt;/code&gt;, &lt;code&gt;END&lt;/code&gt;, &lt;code&gt;ESC&lt;/code&gt;, &lt;code&gt;F1&lt;/code&gt;, &lt;code&gt;F2&lt;/code&gt;, &lt;code&gt;F3&lt;/code&gt;, &lt;code&gt;F4&lt;/code&gt;, &lt;code&gt;F5&lt;/code&gt;, &lt;code&gt;F6&lt;/code&gt;, &lt;code&gt;F7&lt;/code&gt;, &lt;code&gt;F8&lt;/code&gt;, &lt;code&gt;F9&lt;/code&gt;, &lt;code&gt;F10&lt;/code&gt;, &lt;code&gt;F11&lt;/code&gt;, &lt;code&gt;F12&lt;/code&gt;, &lt;code&gt;F13&lt;/code&gt;, &lt;code&gt;F14&lt;/code&gt;, &lt;code&gt;F15&lt;/code&gt;, &lt;code&gt;FF&lt;/code&gt;, &lt;code&gt;HOME&lt;/code&gt;, &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;LF&lt;/code&gt;, &lt;code&gt;NUL&lt;/code&gt;, &lt;code&gt;NUM_LOCK&lt;/code&gt;, &lt;code&gt;NUMPAD_0&lt;/code&gt;, &lt;code&gt;NUMPAD_1&lt;/code&gt;, &lt;code&gt;NUMPAD_2&lt;/code&gt;, &lt;code&gt;NUMPAD_3&lt;/code&gt;, &lt;code&gt;NUMPAD_4&lt;/code&gt;, &lt;code&gt;NUMPAD_5&lt;/code&gt;, &lt;code&gt;NUMPAD_6&lt;/code&gt;, &lt;code&gt;NUMPAD_7&lt;/code&gt;, &lt;code&gt;NUMPAD_8&lt;/code&gt;, &lt;code&gt;NUMPAD_9&lt;/code&gt;, &lt;code&gt;NUMPAD_ADD&lt;/code&gt;, &lt;code&gt;NUMPAD_DECIMAL&lt;/code&gt;, &lt;code&gt;NUMPAD_DIVIDE&lt;/code&gt;, &lt;code&gt;NUMPAD_ENTER&lt;/code&gt;, &lt;code&gt;NUMPAD_EQUAL&lt;/code&gt;, &lt;code&gt;NUMPAD_MULTIPLY&lt;/code&gt;, &lt;code&gt;NUMPAD_SUBTRACT&lt;/code&gt;, &lt;code&gt;PAGE_UP&lt;/code&gt;, &lt;code&gt;PAGE_DOWN&lt;/code&gt;, &lt;code&gt;PAUSE&lt;/code&gt;, &lt;code&gt;PRINT_SCREEN&lt;/code&gt;, &lt;code&gt;SCROLL_LOCK&lt;/code&gt;, &lt;code&gt;SPACE&lt;/code&gt;, &lt;code&gt;TAB&lt;/code&gt; and &lt;code&gt;VT&lt;/code&gt;.
-&lt;/p&gt;
-&lt;p&gt;
-We also understand some alternative names for some common special keys.  For example, we accept both &lt;code&gt;ESC&lt;/code&gt; and &lt;code&gt;ESCAPE&lt;/code&gt;, and &lt;code&gt;CR&lt;/code&gt;, &lt;code&gt;ENTER&lt;/code&gt; and &lt;code&gt;RETURN&lt;/code&gt; are all the same.
-&lt;/p&gt;
-&lt;p&gt;
-It is also strongly recommended that you keep the key sequences short.  One or two is the most you should need.  Use contexts to give key sequences different meanings in different parts of your application.  At the very most, you should not use any key sequence that contains more than four key strokes.
-&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="schemeId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The identifier of the scheme in which this key binding is active.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.bindings/scheme/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="contextId" type="string" use="default" value="org.eclipse.ui.contexts.window">
-            <annotation>
-               <documentation>
-                  The identifier of the context in which this key binding is active.  Please see the &lt;code&gt;org.eclipse.ui.contexts&lt;/code&gt; extension point.  If this is not specified, then it defaults to &lt;code&gt;org.eclipse.ui.contexts.window&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.contexts/context/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="commandId" type="string">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;
-The identifier of the command which should be executed when this binding is triggered.
-&lt;/p&gt;
-&lt;p&gt;
-If no command identifier is specified, this is a deletion marker.  This means that any binding in the same context with the same sequence, platform and locale will become inactive when this binding becomes active.  If the platform or locale on a deletion is not specified, then it matches any platform or locale.
-&lt;/p&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.commands/command/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="platform" type="string">
-            <annotation>
-               <documentation>
-                  The platform on which this binding applies.  The platform should be specified in the same way as the string from &lt;code&gt;SWT.getPlatform()&lt;/code&gt;.  For example, the following strings are considered valid: &lt;code&gt;win32&lt;/code&gt;, &lt;code&gt;gtk&lt;/code&gt;, &lt;code&gt;motif&lt;/code&gt;, &lt;code&gt;carbon&lt;/code&gt; and &lt;code&gt;photon&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="locale" type="string">
-            <annotation>
-               <documentation>
-                  The locale on which this bindings applies.  This is useful for changing bindings that conflict with locale-specific input method editors (IMEs).  The locale is specified in the same way as &lt;code&gt;Locale.toString()&lt;/code&gt;.  For example, &lt;code&gt;&quot;en&quot;&lt;/code&gt; or &lt;code&gt;&quot;en_CA&quot;&lt;/code&gt; are both understood.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="parameter">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="id"/>
-         </appinfo>
-         <documentation>
-            A parameter name and value that should be passed to the command when it is executed.  This allows for the command to be qualified in some way.  For example, a &quot;Show View&quot; command might accept the view id as a parameter.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  The parameter name as understood by the command.  This is not a translatable name, but the key to name-value map.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.commands/command/commandParameter/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string">
-            <annotation>
-               <documentation>
-                  The value for the parameter.  This value is a free-form string, but it should be parseable by the command.  Consult the command to see what format it expects these values to take.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         &lt;pre&gt;
-&lt;extension
- point=&quot;org.eclipse.ui.bindings&quot;&gt;
- &lt;key
-  sequence=&quot;M2+F5&quot;
-  commandId=&quot;example.commandId&quot;
-  schemeId=&quot;org.eclipse.ui.defaultAcceleratorConfiguration&quot;
-  contextId=&quot;org.eclipse.ui.contexts.dialog&quot; /&gt;
- &lt;key
-  sequence=&quot;M2+F7&quot;
-  commandId=&quot;other.commandId&quot;
-  schemeId=&quot;default.id&quot;
-  contextId=&quot;org.eclipse.ui.contexts.dialog&quot; /&gt;
- &lt;scheme
-  name=&quot;Default&quot;
-  description=&quot;Default shortcuts for Eclipse&quot;
-  id=&quot;default.id&quot; /&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-There is no public API for defining bindings.  To try to achieve stability for the user, bindings are only defined through the extension points.  If you are an RCP application, you should be able to override this behaviour in the &lt;code&gt;WorkbenchAdvisor&lt;/code&gt;.
-&lt;/p&gt;
-&lt;p&gt;
-For bindings to work, you must have defined a &lt;a href=&quot;org_eclipse_ui_commands.html&quot;&gt;command&lt;/a&gt;.  For the binding to work, the command must have an active &lt;a href=&quot;org_eclipse_ui_handlers.html&quot;&gt;handler&lt;/a&gt;.  Handlers can be registered programmatically; please see the &lt;a href=&quot;org_eclipse_ui_handlers.html&quot;&gt;org.eclipse.ui.handlers&lt;/a&gt; extension point.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2005,2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/browserSupport.exsd b/bundles/org.eclipse.ui/schema/browserSupport.exsd
deleted file mode 100644
index d2a940d..0000000
--- a/bundles/org.eclipse.ui/schema/browserSupport.exsd
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="browserSupport" name="Browser Support"/>
-      </appInfo>
-      <documentation>
-         This extension point is used to contribute workbench browser support. The support is responsible for opening URLs for all the Eclipse plug-ins. Workbench provides a very rudimentary implementation with a more complete implementation available as an optional RCP plug-in.
-&lt;p&gt;
-Contributions that are meant to be shipped with the product as the standard support should be marked as &lt;code&gt;default&lt;/code&gt;. This way, it is possible to override the support with another contribution that is not marked as &lt;code&gt;default&lt;/code&gt;. Note however that only one support can be active at any point in time. In case of multiple default and/or non-default contributions, the result is non-deterministic.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="support" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A fully qualified identifier of the target extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  An optional identifier of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  An optional name of the extension instance.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="support">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class providing the browser support for the workbench. This class should extend &lt;code&gt;org.eclipse.ui.browser.AbstractWorkbenchBrowserSupport&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.browser.AbstractWorkbenchBrowserSupport"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="default" type="boolean" use="default" value="false">
-            <annotation>
-               <documentation>
-                  indicates whether this support is the default. Browser support should be marked as default if it is normally shipped with the product as the standard browser support. Browser supports that need to override the default support should have this flag set to &lt;code&gt;false&lt;/code&gt;. When workbench encounters two extensions, it will pick a non-default over a default one.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a browser support contribution:
-
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.browserSupport&quot;&gt;
-      &lt;support
-          default=&quot;true&quot;
-          class=&quot;com.example.xyz.MyBrowserSupport&quot;&gt;
-      &lt;/support&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The contributors are expected to provide a class that extends &lt;code&gt;org.eclipse.ui.browser.AbstractWorkbenchBrowserSupport&lt;/code&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The workbench provides a simple implementation of the browser support that is used when no contributions are found in the registry.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/commandImages.exsd b/bundles/org.eclipse.ui/schema/commandImages.exsd
deleted file mode 100644
index 58e46a7..0000000
--- a/bundles/org.eclipse.ui/schema/commandImages.exsd
+++ /dev/null
@@ -1,169 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="commandImages" name="Command Images"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-The images extension point provides a way of linking different types of images and icons to a particular command.  These images can be used, as appropriate, wherever the command appears in the user interface.  To accommodate some boundary cases (e.g., tool bar drop-down items), it is possible to group the images for a particular commands into &quot;styles&quot;.  These styles can then be specifically requested when a command is to be displayed.
-&lt;/p&gt;
-&lt;p&gt;
-Commands placed in menus using the &lt;a href=&quot;org_eclipse_ui_menus.html&quot;&gt;org.eclipse.ui.menus&lt;/a&gt; extension point will use the default image if available, and commands placed in a toolbar will use the &lt;code&gt;toolbar&lt;/code&gt; style images if available, followed by the default images.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="image" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="image">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="commandId"/>
-         </appinfo>
-         <documentation>
-            The images to associate with a particular command.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="commandId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The identifier of the command with which the images should be associated.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.commands/command/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The path to the icon which should be used in the default case.  This will appear when the icon is enabled and mouse is not hovering over it.  It will also be used in any situation where such a more specific icon is not available.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="disabledIcon" type="string">
-            <annotation>
-               <documentation>
-                  The icon to display when the command is disabled.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="hoverIcon" type="string">
-            <annotation>
-               <documentation>
-                  The icon to display when the user is hovering over the command.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="style" type="string">
-            <annotation>
-               <documentation>
-                  The particular scenario in which this block of icons apply.  For example, it may be desirable to have different icons when the command is displayed as a toolbar drop-down item. Currently the org.eclipse.ui.menus extension will use the default style (no style) for menu icons and the &lt;code&gt;toolbar&lt;/code&gt; style for toolbar contributions.  If no &lt;code&gt;toolbar&lt;/code&gt; entry is available for that command, it uses the default style.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.2
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         &lt;pre&gt;
-&lt;extension
- point=&quot;org.eclipse.ui.commandImages&quot;&gt;
- &lt;image
-  commandId=&quot;org.eclipse.example.ProfileLast&quot;
-  hoverIcon=&quot;icons/full/etool16/profile.gif&quot;
-  disabledIcon=&quot;icons/full/dtool16/profile.gif&quot;
-  icon=&quot;icons/full/etool16/profile.gif&quot; /&gt;
- &lt;image
-  commandId=&quot;org.eclipse.example.ProfileLast&quot;
-  hoverIcon=&quot;icons/full/etool16/history.gif&quot;
-  disabledIcon=&quot;icons/full/dtool16/history.gif&quot;
-  icon=&quot;icons/full/etool16/history.gif&quot;
-  style=&quot;toolbar&quot; /&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-Within the workbench, it is possible to get images for commands using the &lt;code&gt;org.eclipse.ui.commands.ICommandImageService&lt;/code&gt; interface.  This interface can be retrieved from supporting workbench objects, such as &lt;code&gt;IWorkbench&lt;/code&gt; itself, the &lt;code&gt;IWorkbenchWindow&lt;/code&gt;, or the &lt;code&gt;IWorkbenchPartSite&lt;/code&gt;.  To retrieve the service, you would make a call like &lt;code&gt;workbench.getService(ICommandImageService.class)&lt;/code&gt;.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2005,2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/commands.exsd b/bundles/org.eclipse.ui/schema/commands.exsd
deleted file mode 100644
index 95b32c5..0000000
--- a/bundles/org.eclipse.ui/schema/commands.exsd
+++ /dev/null
@@ -1,864 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="commands" name="Commands"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-The &lt;code&gt;org.eclipse.ui.commands&lt;/code&gt; extension point is used to declare commands and command categories, using the &lt;code&gt;command&lt;/code&gt; and &lt;code&gt;category&lt;/code&gt; elements. A command is an abstract representation of some semantic behaviour, but not it&apos;s actual implementation.  This allows different developers to contribute specific behaviour for their individual parts.  For example, there might be a &quot;paste&quot; command with one implementation in an editor and a different implementation in an explorer widget.  These implementations are called handlers.  Commands can also be viewed as declarative function pointers, or signal handlers.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="category" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="command" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="commandParameterType" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="keyBinding" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="keyConfiguration" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="context" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="scope" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="activeKeyConfiguration" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  An optional identifier of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  An optional name of the extension instance.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A fully qualified identifier of the target extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="command">
-      <annotation>
-         <documentation>
-            &lt;p&gt;
-This element is used to define commands. A command represents an request from the user that can be handled by an action, and should be semantically unique among other commands. Do not define a command if there is already one defined with the same meaning. If more than one of these elements exist with the same &lt;code&gt;id&lt;/code&gt; attribute, only the last declared element (in order of reading the plugin registry) is considered valid. See the extension points &lt;a href=&quot;org_eclipse_ui_actionSets.html&quot;&gt;org.eclipse.ui.actionSets&lt;/a&gt; and &lt;a href=&quot;org_eclipse_ui_editorActions.html&quot;&gt;org.eclipse.ui.editorActions&lt;/a&gt; to understand how actions are connected to commands.
-&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="defaultHandler" minOccurs="0" maxOccurs="1"/>
-            <element ref="state" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="commandParameter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="category" type="string">
-            <annotation>
-               <documentation>
-                  Please use &lt;code&gt;categoryId&lt;/code&gt; instead.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A translatable short description of this command for display in the UI.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique identifier of this command.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The translatable name of this command for display in the UI. Commands are typically named in the form of an imperative verb.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="categoryId" type="string">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;
-The unique id of the category for this command. If this command does not specify a category it will be placed in an global &quot;Uncategorized&quot; category.
-&lt;/p&gt;
-&lt;p&gt;&lt;em&gt;Since: 3.0&lt;/em&gt;&lt;/p&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.commands/category/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="defaultHandler" type="string">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;
-The default handler for this command (see the &lt;a href=&quot;org_eclipse_ui_handlers.html&quot;&gt;org.eclipse.ui.handlers&lt;/a&gt; extension point).  If no other handler is active, this handler will be active.  This handler will conflict with other handler definitions that specify no &lt;code&gt;activeWhen&lt;/code&gt; conditions.  If you are creating an &lt;code&gt;IExecutableExtension&lt;/code&gt;, you can use the &lt;code&gt;defaultHandler&lt;/code&gt; element instead.
-&lt;/p&gt;
-&lt;p&gt;&lt;em&gt;Since: 3.1&lt;/em&gt;&lt;/p&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.commands.IHandler"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="returnTypeId" type="string">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;
-The id of a &lt;code&gt;commandParameterType&lt;/code&gt; indicating the type of value returned by this command.  Specifying a &lt;code&gt;returnTypeId&lt;/code&gt; allows clients executing the command to associate the value returned with a Java type and to convert the value to a String form that may be stored and/or passed to another command that accepts parameters of the same type.
-&lt;/p&gt;
-&lt;p&gt;&lt;em&gt;Since: 3.2&lt;/em&gt;&lt;/p&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.commands/commandParameterType/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="helpContextId" type="string">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;
-The identifier of the help context that relates to this command in general.  Handlers can override this context identifier to provide help that is more specific to their particular behaviours.
-&lt;/p&gt;
-&lt;p&gt;&lt;em&gt;Since: 3.2&lt;/em&gt;&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="category">
-      <annotation>
-         <documentation>
-            &lt;p&gt;
-In the UI, commands are often organized by category to make them more manageable. This element is used to define these categories. Commands can add themselves to at most one category. If more than one of these elements exist with the same &lt;code&gt;id&lt;/code&gt; attribute, only the last declared element (in order of reading the plugin registry) is considered valid.
-&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A translatable short description of this category for display in the UI.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique identifier of this category.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The translatable name of this category for display in the UI.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="commandParameter">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="id"/>
-         </appinfo>
-         <documentation>
-            &lt;p&gt;
-Defines a parameter that a command should understand.  A parameter is a way to provide more information to a handler at execution time.  For example, a &quot;show view&quot; command might take a view as a parameter.  Handlers should be able to understand these parameters, so they should be treated like API.
-&lt;/p&gt;
-&lt;p&gt;&lt;em&gt;Since: 3.1&lt;/em&gt;&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="values" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique identifier for this parameter.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name for the parameter.  This is the name as it will be displayed to an end-user.  As such, it should be translatable.  The name should be short -- preferrably one word.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="values" type="string">
-            <annotation>
-               <documentation>
-                  The class providing a list of parameter values for the user to select.  This class should implement &lt;code&gt;org.eclipse.core.commands.IParameterValues&lt;/code&gt;.  If this class is not specified, you must specify the more verbose &lt;code&gt;values&lt;/code&gt; element.  Please see &lt;code&gt;org.eclipse.core.runtime.IExecutableExtension&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.commands.IParameterValues"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="typeId" type="string">
-            <annotation>
-               <documentation>
-                  The id of a commandParameterType for this commandParameter.  Specifying a typeId allows handlers of a command to convert string parameter values to objects in a consistent way and it allows potential callers of a command to look for commands that take objects of various types for their parameters.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.commands/commandParameterType/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="optional" type="boolean" use="default" value="true">
-            <annotation>
-               <documentation>
-                  Whether this parameter is optional.  If a parameter is optional, the handler should be able to handle the absence of the parameter.  By default, all parameters are optional.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="commandParameterType">
-      <annotation>
-         <documentation>
-            &lt;p&gt;
-Defines the object type of a commandParameter and may specify an &lt;code&gt;org.eclipse.core.commands.AbstractParameterValueConverter&lt;/code&gt; subclass to convert between string parameter values and objects.
-&lt;/p&gt;
-&lt;p&gt;&lt;em&gt;Since: 3.2&lt;/em&gt;&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique identifier for this commandParameterType.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="type" type="string">
-            <annotation>
-               <documentation>
-                  The fully qualified name of a Java class or interface to use as the type of this command parameter.  This attribute is optional, however if omitted, &lt;code&gt;java.lang.Object&lt;/code&gt; will be used as the parameter type.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="converter" type="string">
-            <annotation>
-               <documentation>
-                  The class for converting between objects and string representations of objects for command parameter values.  This class should extend &lt;code&gt;org.eclipse.core.commands.AbstractParameterValueConverter&lt;/code&gt;. The converter should produce and consume objects of the type indicated in the &lt;code&gt;type&lt;/code&gt; attribute. If this class is not specified, this facility to convert between string and object values for this parameter type will not be available (the &lt;code&gt;getValueConverter()&lt;/code&gt; on class &lt;code&gt;ParameterType&lt;/code&gt; will return &lt;code&gt;null&lt;/code&gt;).
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.commands.AbstractParameterValueConverter"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="values">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="class"/>
-         </appinfo>
-         <documentation>
-            &lt;p&gt;
-The more verbose version of the &lt;code&gt;values&lt;/code&gt; attribute on the &lt;code&gt;commandParameter&lt;/code&gt;.
-&lt;/p&gt;
-&lt;p&gt;&lt;em&gt;Since: 3.1&lt;/em&gt;&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice>
-            <element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
-         </choice>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class providing a list of parameter values for the user to select.  This class should implement &lt;code&gt;org.eclipse.core.commands.IParameterValues&lt;/code&gt;.  If this class is not specified, you must specify the more verbose &lt;code&gt;values&lt;/code&gt; element.  Please see &lt;code&gt;org.eclipse.core.runtime.IExecutableExtension&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.commands.IParameterValues"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="parameter">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name"/>
-         </appinfo>
-         <documentation>
-            &lt;p&gt;
-A possible value for a parameter.
-&lt;/p&gt;
-&lt;p&gt;&lt;em&gt;Since: 3.1&lt;/em&gt;&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the parameter to pass to the &lt;code&gt;IExecutableExtension&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The value of the parameter to pass to the &lt;code&gt;IExecutableExtension&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="defaultHandler">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="class"/>
-         </appinfo>
-         <documentation>
-            &lt;p&gt;
-The default handler for this command.  If no other handler is active, this handler will be active.  This handler will conflict with other handler definitions that specify no &lt;code&gt;activeWhen&lt;/code&gt; conditions.  If you are not creating an &lt;code&gt;IExecutableExtension&lt;/code&gt;, you can use the &lt;code&gt;defaultHandler&lt;/code&gt; attribute instead.
-&lt;/p&gt;
-&lt;p&gt;&lt;em&gt;Since: 3.1&lt;/em&gt;&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="parameter"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class which implements &lt;code&gt;org.eclipse.core.commands.IHandler&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.commands.IHandler"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="state">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="class"/>
-         </appinfo>
-         <documentation>
-            &lt;p&gt;
-State information shared between all handlers, and potentially persisted between sessions.The state is simply a class that is loaded to look after the state.  See the API Information for more details.  This is not used for UI attributes like a menu contribution check box state or label.
-&lt;/p&gt;
-&lt;p&gt;&lt;em&gt;Since: 3.2&lt;/em&gt;&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="class" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  The class that can be loaded to store the state of this command.  State is shared amongst handlers, and can be persisted between sessions.  This class must implement &lt;code&gt;org.eclipse.core.commands.State&lt;/code&gt;.  Please see API Information.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;
-A unique identifier for this state.  This is used for persisting the state between sessions (if the state is an instance of &lt;code&gt;org.eclipse.jface.commands.PersistentState&lt;/code&gt;).  Certain common identifiers (see &lt;code&gt;org.eclipse.jface.menus.IMenuStateIds&lt;/code&gt;) are understood when the command is being rendered in the menus or tool bars.  The identifier only needs to be unique within the command defining the state.
-&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="class">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="class"/>
-         </appinfo>
-         <documentation>
-            &lt;p&gt;
-The class that can be loaded to store the state of this command.  This element is used if you wish to pass multiple parameters to an &lt;code&gt;org.eclipse.core.runtime.IExecutableExtension&lt;/code&gt;.
-&lt;/p&gt;
-&lt;p&gt;&lt;em&gt;Since: 3.2&lt;/em&gt;&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class that can be loaded to store the state of this command.  State is shared amongst handlers, and can be persisted between sessions.  This class must implement &lt;code&gt;org.eclipse.core.commands.State&lt;/code&gt;.  Please see API Information.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="keyConfiguration">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-         <documentation>
-            This element is used to define key configurations. If more than one of these elements exist with the same &lt;code&gt;id&lt;/code&gt; attribute, only the last declared element (in order of reading the plugin registry) is considered valid.  Please use the &quot;org.eclipse.ui.bindings&quot; extension point instead.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A translatable short description of this key configuration for display in the UI.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true" deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique identifier of this key configuration.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The translatable name of this key configuration for display in the UI. If this key configuration has a parent, it is not necessary to add &quot;(extends ...)&quot; to the name. This will be automatically added by the UI where necessary.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true" deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="parent" type="string">
-            <annotation>
-               <documentation>
-                  The unique id of the parent key configuration. If this key configuration has a parent, it will borrow all key bindings from its parent, in addition to the key bindings defined in its own key configuration.
-@deprecated Please use parentId instead.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="parentId" type="string">
-            <annotation>
-               <documentation>
-                  The unique id of the parent key configuration. If this key configuration has a parent, it will borrow all key bindings from its parent, in addition to the key bindings defined in its own key configuration.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="context">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-         <documentation>
-            This element is used to define contexts. If more than one of these elements exist with the same &lt;code&gt;id&lt;/code&gt; attribute, only the last declared element (in order of reading the plugin registry) is considered valid.  Please use the &lt;a href=&quot;org_eclipse_ui_contexts.html&quot;&gt;org.eclipse.ui.contexts&lt;/a&gt; extension point instead.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A translatable short description of this context for display in the UI.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true" deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique identifier of this context.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The translatable name of this context for display in the UI. If this context has a parent, it is not necessary to add &quot;(extends parent)&quot; to the name. This will be automatically added by the UI where necessary.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true" deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="parent" type="string">
-            <annotation>
-               <documentation>
-                  The unique id of the parent context. If this context has a parent, it will borrow all key bindings from its parent, in addition to the key bindings defined in its own context.
-@deprecated Please use &quot;parentId&quot; instead.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="parentId" type="string">
-            <annotation>
-               <documentation>
-                  The unique id of the parent context. If this context has a parent, it will borrow all key bindings from its parent, in addition to the key bindings defined in its own context.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="scope">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="id" deprecated="true"/>
-         </appinfo>
-         <documentation>
-            This element is used to define scopes. If more than one of these elements exist with the same &lt;code&gt;id&lt;/code&gt; attribute, only the last declared element (in order of reading the plugin registry) is considered valid.
-@deprecated Please use the &quot;org.eclipse.ui.contexts&quot; extension point instead.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A translatable short description of this scope for display in the UI.
-
-@deprecated Please use the &quot;org.eclipse.ui.contexts&quot; extension point instead.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true" deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique identifier of this scope.
-
-@deprecated Please use the &quot;org.eclipse.ui.contexts&quot; extension point instead.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The translatable name of this scope for display in the UI. If this scope has a parent, it is not necessary to add &quot;(extends parent)&quot; to the name. This will be automatically added by the UI where necessary.
-
-@deprecated Please use the &quot;org.eclipse.ui.contexts&quot; extension point instead.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true" deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="parent" type="string">
-            <annotation>
-               <documentation>
-                  The unique id of the parent scope. If this scope has a parent, it will borrow all key bindings from its parent, in addition to the key bindings defined in its own scope.
-
-@deprecated Please use the &quot;org.eclipse.ui.contexts&quot; extension point instead.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="activeKeyConfiguration">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-         <documentation>
-            &lt;p&gt;
-This element is used to define the initial active key configuration for Eclipse. If more than one of these elements exist, only the last declared element (in order of reading the plugin registry) is considered valid.
-&lt;/p&gt;
-&lt;p&gt;
-This element has been replaced with a preference.  If your application needs to change the default key configuration, then specify the following in your &lt;code&gt;plugin_customization.ini&lt;/code&gt; file: &lt;code&gt;org.eclipse.ui/KEY_CONFIGURATION_ID=your.default.key.configuration.id&lt;/code&gt;.
-&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="value" type="string">
-            <annotation>
-               <documentation>
-                  The unique id (&lt;code&gt;id&lt;/code&gt; attribute) of the keyConfiguration element one wishes to be initially active.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="keyConfigurationId" type="string">
-            <annotation>
-               <documentation>
-                  The unique id (&lt;code&gt;id&lt;/code&gt; attribute) of the keyConfiguration element one wishes to be initially active.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="keyBinding">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-         <documentation>
-            This element allows one to assign key sequences to commands.  Please use the &lt;code&gt;key&lt;/code&gt; element in the &quot;org.eclipse.ui.bindings&quot; extension point instead.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="configuration" type="string">
-            <annotation>
-               <documentation>
-                  The unique id of the key configuration of this key binding.
-@deprecated Please use keyConfigurationId instead.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="command" type="string">
-            <annotation>
-               <documentation>
-                  The unique identifier of the command to which the key sequence specified by this key binding is assigned. If the value of this attribute is an empty string, the key sequence is assigned to an internal &apos;no operation&apos; command. This is useful for &apos;undefining&apos; key bindings in specific key configurations and contexts which may have been borrowed from their parents.
-@deprecated Please use &quot;commandId&quot; instead.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="locale" type="string">
-            <annotation>
-               <documentation>
-                  An optional attribute indicating that this key binding is only defined for the specified locale. Locales are specified according to the format declared in &lt;code&gt;java.util.Locale&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="platform" type="string">
-            <annotation>
-               <documentation>
-                  An optional attribute indicating that this key binding is only defined for the specified platform. The possible values of the &lt;code&gt;platform&lt;/code&gt; attribute are the set of the possible values returned by &lt;code&gt;org.eclipse.swt.SWT.getPlatform()&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="contextId" type="string">
-            <annotation>
-               <documentation>
-                  The unique id of the context of this key binding.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="string" type="string">
-            <annotation>
-               <documentation>
-                  The key sequence to assign to the command. Key sequences consist of one or more key strokes, where a key stroke consists of a key on the keyboard, optionally pressed in combination with one or more of the following modifiers: Ctrl, Alt, Shift, and Command. Key strokes are separated by spaces, and modifiers are separated by &apos;+&apos; characters.
-@deprecated Please use &quot;keySequence&quot; instead.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="scope" type="string">
-            <annotation>
-               <documentation>
-                  The unique id of the context of this key binding.
-@deprecated Please use &quot;contextId&quot; instead.  The old default scope, &quot;org.eclipse.ui.globalScope&quot;, has been changed to &quot;org.eclipse.ui.contexts.window&quot;.  The old name is still supported, but it is deprecated.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="keyConfigurationId" type="string">
-            <annotation>
-               <documentation>
-                  The unique id of the key configuration of this key binding.
-@deprecated Please use the &lt;code&gt;schemeId&lt;/code&gt; attribute on the &lt;code&gt;key&lt;/code&gt; element in the new &quot;org.eclipse.ui.bindings&quot; extension point.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="commandId" type="string">
-            <annotation>
-               <documentation>
-                  The unique identifier of the command to which the key sequence specified by this key binding is assigned. If the value of this attribute is an empty string, the key sequence is assigned to an internal &apos;no operation&apos; command. This is useful for &apos;undefining&apos; key bindings in specific key configurations and contexts which may have been borrowed from their parents.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="keySequence" type="string">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;The key sequence to assign to the command. Key sequences consist of one or more key strokes, where a key stroke consists of a key on the keyboard, optionally pressed in combination with one or more of the following modifiers: Ctrl, Alt, Shift, and Command. Key strokes are separated by spaces, and modifiers are separated by &apos;+&apos; characters.&lt;/p&gt;
-&lt;p&gt;The modifier keys can also be expressed in a platform-independent way.  On MacOS X, for example, &quot;Command&quot; is almost always used in place of &quot;Ctrl&quot;.  So, we provide &quot;M1&quot; which will map to either &quot;Ctrl&quot; or &quot;Command&quot;, as appropriate.  Similarly, &quot;M2&quot; is &quot;Shift&quot;; &quot;M3&quot; is &quot;Alt&quot;; and &quot;M4&quot; is &quot;Ctrl&quot; (MacOS X).  If more platforms are added, then you can count on these aliases being mapped to good platform defaults.&lt;/p&gt;
-&lt;p&gt;The syntax for this string is defined in &lt;code&gt;org.eclipse.ui.internal.keys&lt;/code&gt;.  Briefly, the string is case insensitive -- though all capitals is preferred stylistically.  If the key is a letter, then simply append the letter.  If the key is a special key (i.e., non-ASCII), then use one of the following: ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT, ARROW_UP, BREAK, CAPS_LOCK, END, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, HOME, INSERT, NUM_LOCK, NUMPAD_0, NUMPAD_1, NUMPAD_2, NUMPAD_3, NUMPAD_4, NUMPAD_5, NUMPAD_6, NUMPAD_7, NUMPAD_8, NUMPAD_9, NUMPAD_ADD, NUMPAD_DECIMAL, NUMPAD_DIVIDE, NUMPAD_ENTER, NUMPAD_EQUAL, NUMPAD_MULTIPLY, NUMPAD_SUBTRACT, PAGE_UP, PAGE_DOWN, PAUSE, PRINT_SCREEN, or SCROLL_LOCK.  If the key is a non-printable ASCII key, then use one of the following: BS, CR, DEL, ESC, FF, LF, NUL, SPACE, TAB, or VT.  Note that the main keyboard enter/return key is CR.&lt;/p&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-2.1
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-The &lt;code&gt;plugin.xml&lt;/code&gt; file in the &lt;code&gt;org.eclipse.ui&lt;/code&gt; plugin makes extensive use of the &lt;code&gt;org.eclipse.ui.commands&lt;/code&gt; extension point.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-Handlers can be registered with commands using the &lt;code&gt;org.eclipse.ui.handlers.IHandlerService&lt;/code&gt;.  This can be retrieved from various workbench components (e.g., workbench, workbench window, part site, etc.) by calling &lt;code&gt;getService(IHandlerService.class)&lt;/code&gt;.
-&lt;/p&gt;
-&lt;p&gt;
-In general, it is preferrably to declare all commands statically (in &lt;code&gt;plugin.xml&lt;/code&gt;).  This is so that users can attach key bindings to the commands.  However, it is possible to declare commands at run-time.  To do this, retrieve the &lt;code&gt;org.eclipse.ui.commands.ICommandService&lt;/code&gt; from a workbench component, call &lt;code&gt;getCommand(yourCommandID)&lt;/code&gt; and then call &lt;code&gt;Command.define(...)&lt;/code&gt;.
-Commands defined programmatically must be cleaned up by the plugin if it is unloaded.
-&lt;/p&gt;
-&lt;p&gt;
-There are a few default implementations of handler states that may be useful to users of this extension point:
-&lt;/p&gt;
-&lt;ul&gt;
-&lt;li&gt;org.eclipse.jface.commands.TextState&lt;/li&gt;
-&lt;li&gt;org.eclipse.jface.commands.RadioState&lt;/li&gt;
-&lt;li&gt;org.eclipse.jface.commands.ToggleState&lt;/li&gt;
-&lt;li&gt;org.eclipse.ui.handlers.RegistryRadioState&lt;/li&gt;
-&lt;li&gt;org.eclipse.ui.handlers.RegistryToggleState&lt;/li&gt;
-&lt;/ul&gt;
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2000, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/commonAction.exsd b/bundles/org.eclipse.ui/schema/commonAction.exsd
deleted file mode 100644
index 425a098..0000000
--- a/bundles/org.eclipse.ui/schema/commonAction.exsd
+++ /dev/null
@@ -1,152 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="commonAction" name="Common Action"/>
-      </appinfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <element name="menu">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="label"/>
-         </appinfo>
-         <documentation>
-            This element is used to defined a new menu.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="separator" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="groupMarker" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier that can be used to reference this menu.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name used by the Workbench for this new menu. The name should include mnemonic information.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="path" type="string">
-            <annotation>
-               <documentation>
-                  the location of the new menu starting from the root of the menu. Each token in the path must refer to an existing menu, except the last token which should represent a named group in the last menu in the path. If omitted, the new menu will be added to the &lt;samp&gt;additions&lt;/samp&gt; named group of the menu.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon used to visually represent the menu in its context.
-The path is relative to the location of the plugin.xml file of the contributing plug-in.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="separator">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name"/>
-         </appinfo>
-         <documentation>
-            This element is used to create a menu separator in the new menu.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the menu separator. This name can later be referenced as the last token in a menu path. Therefore, a separator also serves as named group into which actions and menus can be added.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="groupMarker">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name"/>
-         </appinfo>
-         <documentation>
-            This element is used to create a named group in the new menu. It has no visual representation in the new menu, unlike the &lt;samp&gt;separator&lt;/samp&gt; element.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the group marker. This name can later be referenced as the last token in the menu path. It serves as named group into which actions and menus can be added.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="selection">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="class"/>
-         </appinfo>
-         <documentation>
-            This element is used to help determine the action enablement based on the current selection. Ignored if the &lt;samp&gt;enablement&lt;/samp&gt; element is specified.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified name of the class or interface that each object in the selection must implement in order to enable the action.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="java.lang.Object"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional wild card filter for the name that can be applied to all objects in the selection. If specified and the match fails, the action will be disabled.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2000, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/commonExpression.exsd b/bundles/org.eclipse.ui/schema/commonExpression.exsd
deleted file mode 100644
index 7ef94ff..0000000
--- a/bundles/org.eclipse.ui/schema/commonExpression.exsd
+++ /dev/null
@@ -1,274 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="commonExpression" name="Common Expressions"/>
-      </appInfo>
-      <documentation>
-         An action&apos;s enablement and/or visibility can be defined using the elements &lt;samp&gt;enablement&lt;/samp&gt; and &lt;samp&gt;visibility&lt;/samp&gt; respectively. These two elements contain a boolean expression that is evaluated to determine the enablement and/or visibility.
-&lt;p&gt;
-The syntax is the same for the &lt;samp&gt;enablement&lt;/samp&gt; and &lt;samp&gt;visibility&lt;/samp&gt; elements. Both contain only one boolean expression sub-element. In the simplest case, this will be an &lt;samp&gt;objectClass&lt;/samp&gt;, &lt;samp&gt;objectState&lt;/samp&gt;, &lt;samp&gt;pluginState&lt;/samp&gt;, or &lt;samp&gt;systemProperty&lt;/samp&gt; element. In the more complex case, the &lt;samp&gt;and&lt;/samp&gt;, &lt;samp&gt;or&lt;/samp&gt;, and &lt;samp&gt;not&lt;/samp&gt; elements can be combined to form a boolean expression. Both the &lt;samp&gt;and&lt;/samp&gt;, and &lt;samp&gt;or&lt;/samp&gt; elements must contain 2 sub-elements. The &lt;samp&gt;not&lt;/samp&gt; element must contain only 1 sub-element.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="enablement">
-      <annotation>
-         <documentation>
-            This element is used to define the enablement for the extension.
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="not"/>
-            <element ref="objectClass"/>
-            <element ref="objectState"/>
-            <element ref="pluginState"/>
-            <element ref="systemProperty"/>
-         </choice>
-      </complexType>
-   </element>
-
-   <element name="visibility">
-      <annotation>
-         <documentation>
-            This element is used to define the visibility for the extension.
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="not"/>
-            <element ref="objectClass"/>
-            <element ref="objectState"/>
-            <element ref="pluginState"/>
-            <element ref="systemProperty"/>
-         </choice>
-      </complexType>
-   </element>
-
-   <element name="and">
-      <annotation>
-         <documentation>
-            This element represent a boolean AND operation on the result of evaluating its two sub-element expressions.
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice minOccurs="2" maxOccurs="unbounded">
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="not"/>
-            <element ref="objectClass"/>
-            <element ref="objectState"/>
-            <element ref="pluginState"/>
-            <element ref="systemProperty"/>
-         </choice>
-      </complexType>
-   </element>
-
-   <element name="or">
-      <annotation>
-         <documentation>
-            This element represent a boolean OR operation on the result of evaluating its two sub-element expressions.
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice minOccurs="2" maxOccurs="unbounded">
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="not"/>
-            <element ref="objectClass"/>
-            <element ref="objectState"/>
-            <element ref="pluginState"/>
-            <element ref="systemProperty"/>
-         </choice>
-      </complexType>
-   </element>
-
-   <element name="not">
-      <annotation>
-         <documentation>
-            This element represent a boolean NOT operation on the result of evaluating its sub-element expressions.
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="not"/>
-            <element ref="objectClass"/>
-            <element ref="objectState"/>
-            <element ref="pluginState"/>
-            <element ref="systemProperty"/>
-         </choice>
-      </complexType>
-   </element>
-
-   <element name="objectClass">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="name"/>
-         </appInfo>
-         <documentation>
-            This element is used to evaluate the class or interface of each object in the current selection. If each object in the selection implements the specified class or interface, the expression is evaluated as true.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified name of a class or interface.  The expression is evaluated as true only if all objects within the selection implement this class or interface.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="java.lang.Object"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="objectState">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="name"/>
-         </appInfo>
-         <documentation>
-            This element is used to evaluate the attribute state of each object in the current selection. If each object in the selection has the specified attribute state, the expression is evaluated as true. To evaluate this type of expression, each object in the selection must implement, or adapt to, &lt;samp&gt;org.eclipse.ui.IActionFilter&lt;/samp&gt; interface.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of an object&apos;s attribute. Acceptable names reflect the object type, and should be publicly declared by the plug-in where the object type is declared.
-
-@see IResourceActionFilter for a list of the supported constants
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the required value of the object&apos;s attribute. The acceptable values for the object&apos;s attribute should be publicly declared.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="pluginState">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="id"/>
-         </appInfo>
-         <documentation>
-            This element is used to evaluate the state of a plug-in. The state of the plug-in may be one of the following: &lt;samp&gt;installed&lt;/samp&gt; (equivalent to the OSGi concept of &quot;resolved&quot;) or &lt;samp&gt;activated&lt;/samp&gt; (equivalent to the OSGi concept of &quot;active&quot;).
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the identifier of a plug-in which may or may not exist in the plug-in registry.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" use="default" value="installed">
-            <annotation>
-               <documentation>
-                  the required state of the plug-in. The state of the plug-in may be one of the following: &lt;samp&gt;installed&lt;/samp&gt; (equivalent to the OSGi concept of &quot;resolved&quot;) or &lt;samp&gt;activated&lt;/samp&gt; (equivalent to the OSGi concept of &quot;active&quot;).
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="installed">
-                  </enumeration>
-                  <enumeration value="activated">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="systemProperty">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="name"/>
-         </appInfo>
-         <documentation>
-            This element is used to evaluate the state of some system property.  The property value is retrieved from the &lt;samp&gt;java.lang.System&lt;/samp&gt;.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the system property.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the required value of the system property.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         Release 2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2002, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/contexts.exsd b/bundles/org.eclipse.ui/schema/contexts.exsd
deleted file mode 100644
index a87480d..0000000
--- a/bundles/org.eclipse.ui/schema/contexts.exsd
+++ /dev/null
@@ -1,143 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="contexts" name="Contexts"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-The &lt;code&gt;org.eclipse.ui.contexts&lt;/code&gt; extension point is used to declare contexts and associated elements.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="context" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  An optional identifier of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  An optional name of the extension instance.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A fully qualified identifier of the target extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="context">
-      <annotation>
-         <documentation>
-            This element is used to define contexts. If more than one of these elements exist with the same &lt;code&gt;id&lt;/code&gt; attribute, only the last declared element (in order of reading the registry) is considered valid.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A translatable short description of this context for display in the UI.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique identifier of this context.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The translatable name of this context for display in the UI.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="parentId" type="string">
-            <annotation>
-               <documentation>
-                  The unique identifier of the parent of this context.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.contexts/context/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-3.0
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-The &lt;code&gt;plugin.xml&lt;/code&gt; file in the &lt;code&gt;org.eclipse.ui&lt;/code&gt; plugin makes use of the &lt;code&gt;org.eclipse.ui.contexts&lt;/code&gt; extension point.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-In general, it is preferrably to declare all contexts statically (in &lt;code&gt;plugin.xml&lt;/code&gt;).  This is so that users can use them in key bindings.  However, it is possible to declare contexts at run-time.  To do this, retrieve the &lt;code&gt;org.eclipse.ui.commands.IContextService&lt;/code&gt; from a workbench component, call &lt;code&gt;getContext(contextId)&lt;/code&gt; and then call &lt;code&gt;Context#define(...)&lt;/code&gt;.
-Contexts defined programmatically must be cleaned up by the plugin if it is unloaded.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2000, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/decorators.exsd b/bundles/org.eclipse.ui/schema/decorators.exsd
deleted file mode 100644
index 859050b..0000000
--- a/bundles/org.eclipse.ui/schema/decorators.exsd
+++ /dev/null
@@ -1,285 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="decorators" name="Decorators"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to add decorators to views that subscribe to a decorator manager. As of 2.1 there is the concept of a lightweight decorator that will handle the image management for the decorator. It is also possible to declare a lightweight decorator that simply overlays an icon when enabled that requires no implementation from the plug-in.
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="commonExpression.exsd"/>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="decorator" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="decorator">
-      <complexType>
-         <sequence>
-            <element ref="description" minOccurs="0" maxOccurs="1"/>
-            <element ref="enablement" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this decorator.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name that will be used in the workbench window menu to represent this decorator.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  a fully qualified name of a class which implements &lt;samp&gt;org.eclipse.jface.viewers.ILabelDecorator&lt;/samp&gt;
-if &lt;b&gt;&lt;i&gt; lightweight&lt;/i&gt;&lt;/b&gt; is false or  &lt;samp&gt;org.eclipse.jface.viewers.ILightweightLabelDecorator&lt;/samp&gt; if lightweight is true. The default value is false. If there is no &lt;b&gt;&lt;i&gt;class&lt;/i&gt;&lt;/b&gt; element it is assumed to be lightweight.
-
-In the case where there is no decorator class this is said to be declarative. Declarative decorators with an enablement based on session properties, persistant properties or project description values (such as natures) will need to be updated explicitly when these values change using &lt;code&gt;IDecoratorManager#update()&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jface.viewers.ILabelDecorator"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="objectClass" type="string">
-            <annotation>
-               <documentation>
-                  a fully qualified name of a class which this decorator will be applied to. Deprecated in 2.1. Make this value part of the enablement.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="java.lang.Object" deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="adaptable" type="boolean">
-            <annotation>
-               <documentation>
-                  a flag that indicates if types that can adapt to objects other than thier objectClass should use this object contribution.
-For non-lightweight decorators, this flag only has an effect if objectClass adapts to IResource.  For lightweight decorators, adaptability to any objectClass is supported as long as adaptability is defined through the adapter manager (see the class org.eclipse.runtime.IAdapterManager). Default value is false.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="state" type="boolean">
-            <annotation>
-               <documentation>
-                  a flag that indicates if the decorator is on by default.  Default value is false.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="lightweight">
-            <annotation>
-               <documentation>
-                  The lightweight flag indicates that the decorator is either
-declarative or implements 
-&lt;samp&gt;org.eclipse.jface.viewers.ILightweightLabelDecorator&lt;/samp&gt;.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="true">
-                  </enumeration>
-                  <enumeration value="false">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  if the decorator is &lt;b&gt;&lt;i&gt;lightweight&lt;/i&gt;&lt;/b&gt; and the &lt;b&gt;&lt;i&gt;class&lt;/i&gt;&lt;/b&gt; is not specified this is the path to the overlay image to apply
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="location">
-            <annotation>
-               <documentation>
-                  if the decorator is &lt;b&gt;&lt;i&gt;lightweight&lt;/i&gt;&lt;/b&gt; this is the location to apply the decorator to. Defaults to BOTTOM_RIGHT. A new possible value REPLACE was added in 3.4.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="TOP_LEFT">
-                  </enumeration>
-                  <enumeration value="TOP_RIGHT">
-                  </enumeration>
-                  <enumeration value="BOTTOM_LEFT">
-                  </enumeration>
-                  <enumeration value="BOTTOM_RIGHT">
-                  </enumeration>
-                  <enumeration value="UNDERLAY">
-                  </enumeration>
-                  <enumeration value="REPLACE">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="description" type="string">
-      <annotation>
-         <appInfo>
-            <meta.element translatable="true"/>
-         </appInfo>
-         <documentation>
-            an optional subelement whose body should contain text providing a short description of the decorator. This will be shown in the Decorators preference page so it is recommended that this is included. Default value is an empty String.
-         </documentation>
-      </annotation>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         Release 2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following are example of decorators:
-&lt;p&gt;
-A full decorator. The plug-in developer must handle their own image support.
-&lt;/p&gt;
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.ui.decorators&quot;&gt; 
-        &lt;decorator
-            id=&quot;com.xyz.decorator&quot; 
-            label=&quot;XYZ Decorator&quot; 
-            state=&quot;true&quot; 
-            class=&quot;com.xyz.DecoratorContributor&quot;&gt;
-            &lt;enablement&gt;
-                &lt;objectClass name=&quot;org.eclipse.core.resources.IResource&quot;/&gt; 
-            &lt;/enablement&gt;
-        &lt;/decorator&gt;
-    &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-
-&lt;p&gt;
-A lightweight decorator. There is a concrete class but as it is an
-ILightweightLabelDecorator it only needs to supply text and an ImageDescriptor and therefore needs no resource handling.
-&lt;/p&gt;
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.ui.decorators&quot;&gt; 
-        &lt;decorator
-            id=&quot;com.xyz.lightweight.decorator&quot; 
-            label=&quot;XYZ Lightweight Decorator&quot;                 
-            state=&quot;false&quot; 
-            class=&quot;com.xyz.LightweightDecoratorContributor&quot; 
-            lightweight=&quot;true&quot; &gt;
-            &lt;enablement&gt;
-                &lt;objectClass name=&quot;org.eclipse.core.resources.IResource&quot;/&gt; 
-            &lt;/enablement&gt;
-        &lt;/decorator&gt;
-    &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;A declarative lightweight decorator. There is no concrete class so it
-supplies an icon and a quadrant to apply that icon.
-&lt;/p&gt;
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.ui.decorators&quot;&gt; 
-        &lt;decorator
-            id=&quot;com.xyz.lightweight.declarative.decorator&quot; 
-            label=&quot;XYZ Lightweight Declarative Decorator&quot; 
-            state=&quot;false&quot; 
-            lightweight=&quot;true&quot; 
-            icon=&quot;icons/full/declarative.gif&quot; 
-            location=&quot;TOP_LEFT&quot;&gt; 
-            &lt;enablement&gt;
-                &lt;objectClass name=&quot;org.eclipse.core.resources.IResource&quot;/&gt; 
-            &lt;/enablement&gt;
-        &lt;/decorator&gt;
-    &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The value of the &lt;samp&gt;class&lt;/samp&gt; attribute must be the fully qualified name of a class that implements  &lt;samp&gt;org.eclipse.jface.viewers.ILabelDecorator&lt;/samp&gt; (if lightweight is false) or &lt;samp&gt;org.eclipse.jface.viewers.ILightweightLabelDecorator&lt;/samp&gt;.  This class is loaded as late as possible to avoid loading the entire plug-in before it is really needed. Declarative decorators do not entail any plug-in activation and should be used whenever possible. Non-lightweight decorators will eventually be deprecated.
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         Plug-ins may use this extension point to add new decorators to be applied to views that use the decorator manager as their label decorator.
-To use the decorator manager, use the result of IViewPart.getDecoratorManager() as the decorator for an instance of DecoratingLabelProvider.
-This is currently in use by the Resource Navigator.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/dropActions.exsd b/bundles/org.eclipse.ui/schema/dropActions.exsd
deleted file mode 100644
index b6d589d..0000000
--- a/bundles/org.eclipse.ui/schema/dropActions.exsd
+++ /dev/null
@@ -1,167 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="dropActions" name="Drop Actions"/>
-      </appInfo>
-      <documentation>
-         This extension point is used to add drop behaviour to 
-views defined by other plugins. 
-&lt;p&gt;
-Due to the UI layering imposed by the plugin 
-mechanism, views are often not aware of the content 
-and nature of other views. This can make drag and 
-drop operations between plugins difficult. 
-For example, one may wish to provide Java 
-refactoring support whereby the user drags a 
-method from the Java editor&apos;s content outliner 
-into another java file in the resource navigator. 
-Since the resource navigator doesn&apos;t know anything 
-about Java content, it doesn&apos;t know how to behave 
-when java methods are dropped onto it.  
-Similarly, an ISV may want to drop some of 
-their content into one of the Java viewers. 
-&lt;p&gt;
-The &lt;samp&gt;org.eclipse.ui.dropActions&lt;/samp&gt; extension point is 
-provided by the Platform to address these situations. 
-This mechanism delegates the drop behaviour back to 
-the originator of the drag operation. 
-This behaviour is contained in an action that 
-must implement 
-&lt;samp&gt;org.eclipse.ui.part.IDropActionDelegate&lt;/samp&gt;.  
-The viewer that is the source of the drag 
-operation must support 
-&lt;samp&gt;the org.eclipse.ui.part.PluginTransfer&lt;/samp&gt;
-transfer type, and place a 
-&lt;samp&gt;PluginTransferData&lt;/samp&gt; object in the drag event.
-See org.eclipse.jface.viewers.StructuredViewer#addDragSupport 
-to learn how to add drag support to a viewer.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="action" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="action">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier that can be used to reference this action
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the fully qualified class that implements 
-&lt;samp&gt;org.eclipse.ui.part.IDropActionDelegate&lt;/samp&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.part.IDropActionDelegate"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a drop action extension: 
-&lt;p&gt;
-&lt;pre&gt;
-    &lt;extension point=&quot;org.eclipse.ui.dropActions&quot;&gt; 
-        &lt;action 
-            id=&quot;my_drop_action&quot; 
-            class=&quot;com.xyz.eclipse.TestDropAction&quot;&gt; 
-        &lt;/action&gt; 
-    &lt;/extension&gt;  
-&lt;/pre&gt;
-&lt;/p&gt;
-Here is an example of a drag listener that makes use of the drop
-action defined above.
-&lt;p&gt;
-&lt;pre&gt; 
-class MyDragListener extends DragSourceAdapter { 
-    public void dragSetData(DragSourceEvent event) { 
-        if (PluginTransfer.getInstance().isSupportedType(event.dataType)) { 
-            byte[] dataToSend = ...//enter the data to be sent. 
-            event.data = new PluginTransferData( 
-                &quot;my_drop_action&quot;, dataToSend); 
-        } 
-    } 
-} 
-&lt;/pre&gt;
-&lt;/p&gt;
-For a more complete example, see the Platform 
-readme example.  In that example, a drop action is 
-defined in ReadmeDropActionDelegate, and it is used 
-by ReadmeContentOutlineDragListener.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The value of the class attribute must be a fully qualified name of a Java class that implements &lt;samp&gt;org.eclipse.ui.part.IDropActionDelegate&lt;/samp&gt;. This class is loaded as late as possible to avoid loading the entire plug-in before it is really needed
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The workbench does not provide an implementation for this extension point. Plug-ins can contribute to this extension point to add drop behavior to views defined by other plugins.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2002, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/editorActions.exsd b/bundles/org.eclipse.ui/schema/editorActions.exsd
deleted file mode 100644
index 494b2e8..0000000
--- a/bundles/org.eclipse.ui/schema/editorActions.exsd
+++ /dev/null
@@ -1,559 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="editorActions" name="Editor Menus, Toolbars and Actions"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to add actions to the menu 
-and toolbar for editors registered by other plug-ins.
-&lt;p&gt;
-You can now use &lt;a href=&quot;org_eclipse_ui_menus.html&quot;&gt;org.eclipse.ui.menus&lt;/a&gt; to place commands in menus and toolbars as well.
-&lt;/p&gt;
-&lt;p&gt;
-The initial contribution set for an editor is defined 
-by another extension point (org.eclipse.ui.editors). 
-One set of actions is created and shared by all 
-instances of the same editor type.  When invoked, 
-these action act upon the active editor.  This 
-extension point follows the same pattern.  Each 
-action extension is created and shared by all 
-instances of the same editor type.  The action 
-class is required to implement 
-&lt;samp&gt;org.eclipse.ui.IEditorActionDelegate&lt;/samp&gt;.  
-The active editor is passed to the delegate by invoking 
-&lt;samp&gt;IEditorActionDelegate.setActiveEditor&lt;/samp&gt;.
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="commonAction.exsd"/>
-
-   <include schemaLocation="commonExpression.exsd"/>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="editorContribution" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="editorContribution">
-      <annotation>
-         <documentation>
-            This element is used to define a group of editor actions and/or menus.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="menu" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="action" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier used to reference this contribution.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="targetID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier of a registered editor that is the target of this contribution.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.editors/editor/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="action">
-      <annotation>
-         <documentation>
-            This element defines an action that the user can invoke in the UI.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <choice>
-               <element ref="selection" minOccurs="0" maxOccurs="unbounded"/>
-               <element ref="enablement" minOccurs="0" maxOccurs="1"/>
-            </choice>
-            <element ref="class" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier used as a reference for this action.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name used either as the menu item text or toolbar button label.  The name can include mnenomic information. This label should either be non-empty or a definitionId should be provided.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="accelerator" type="string">
-            <annotation>
-               <documentation>
-                  &lt;b&gt;&lt;font color=&quot;#FF0000&quot;&gt;Deprecated:&lt;/font&gt;&lt;/b&gt; Use the &lt;samp&gt;definitionId&lt;/samp&gt; attribute instead.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="definitionId" type="string">
-            <annotation>
-               <documentation>
-                  Specifies the command that this action will handle. By specifying and action, the key binding service can assign a key sequence to this action. See the extension point &lt;a href=&quot;org_eclipse_ui_commands.html&quot;&gt;org.eclipse.ui.commands&lt;/a&gt; for more information.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.commands/command/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="menubarPath" type="string">
-            <annotation>
-               <documentation>
-                  a slash-delimited path (&apos;/&apos;) used to specify the location of this action in the menu bar.
-Each token in the path, except the last one, must represent a valid identifier of an existing menu in the hierarchy. The last token represents the named group into which this action will be added. If the path is omitted, this action will not appear in the menu bar.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="toolbarPath" type="string">
-            <annotation>
-               <documentation>
-                  a slash-delimited path (&apos;/&apos;) that is used to specify the location of this action in the toolbar. The first token represents the toolbar identifier (with &quot;Normal&quot; being the default toolbar), while the second token is the named group within the toolbar that this action will be added to. If the group does not exist in the toolbar, it will be created.
-If toolbarPath is omitted, the action will not appear in the toolbar.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon used to visually represent the action in its context.
-If omitted and the action appears in the toolbar, the Workbench will use a placeholder icon. The path is relative to the location of the plugin.xml file of the contributing plug-in. The icon will appear in toolbars but not in menus. Enabled actions will be represented in menus by the hoverIcon.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="disabledIcon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon used to visually represent the action in its context when the action is disabled. If omitted, the normal icon will simply appear greyed out. The path is relative to the location of the plugin.xml file of the contributing plug-in. The disabled icon will appear in toolbars but not in menus. Icons for disabled actions in menus will be supplied by the OS.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="hoverIcon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon used to visually represent the action in its context when the mouse pointer is over the action. If omitted, the normal icon will be used. The path is relative to the location of the plugin.xml file of the contributing plug-in.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="tooltip" type="string">
-            <annotation>
-               <documentation>
-                  a translatable text representing the action&apos;s tool tip. Only used if the action appears in the toolbar.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="helpContextId" type="string">
-            <annotation>
-               <documentation>
-                  a unique identifier indicating the help context for this action. If the action appears as a menu item, then pressing F1 while the menu item is highlighted will display help.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="style" use="default" value="push">
-            <annotation>
-               <documentation>
-                  an optional attribute to define the user interface style type for the action. If defined, the attribute value will be one of the following:
-    &lt;table border=&quot;0&quot; width=&quot;80%&quot;&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;push&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a regular menu item or tool item.&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;radio&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a radio style menu item or tool item. Actions with the radio style within the same menu or toolbar group behave as a radio set. The initial value is specified by the &lt;samp&gt;state&lt;/samp&gt; attribute.&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;toggle&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a checked style menu item or as a toggle tool item. The initial value is specified by the &lt;samp&gt;state&lt;/samp&gt; attribute.&lt;/td&gt;
-      &lt;/tr&gt;
-    &lt;/table&gt;
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="push">
-                  </enumeration>
-                  <enumeration value="radio">
-                  </enumeration>
-                  <enumeration value="toggle">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="state" type="boolean">
-            <annotation>
-               <documentation>
-                  an optional attribute indicating the initial state (either &lt;samp&gt;true&lt;/samp&gt; or &lt;samp&gt;false&lt;/samp&gt;), used when the &lt;samp&gt;style&lt;/samp&gt; attribute has the value &lt;samp&gt;radio&lt;/samp&gt; or &lt;samp&gt;toggle&lt;/samp&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the fully qualified class that implements &lt;samp&gt;org.eclipse.ui.IEditorActionDelegate&lt;/samp&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.IEditorActionDelegate"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="enablesFor" type="string">
-            <annotation>
-               <documentation>
-                  a value indicating the selection count which must be met to enable the action.
-If this attribute is specified and the condition is met, the action is enabled.
-If the condition is not met, the action is disabled.
-If no attribute is specified, the action is enabled for any number of items selected.
-The following attribute formats are supported: 
-    &lt;table border=&quot;0&quot; width=&quot;80%&quot;&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;!&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 0 items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;?&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 0 or 1 items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;+&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 1 or more items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;multiple, 2+&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 2 or more items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;n&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- a precise number of items selected.a precise number of items selected.&amp;nbsp;
-          For example: enablesFor=&amp;quot; 4&amp;quot; enables the action only when 4
-          items are selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;*&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- any number of items selected&lt;/td&gt;
-      &lt;/tr&gt;
-    &lt;/table&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="actionID" type="string">
-            <annotation>
-               <documentation>
-                  Internal tag for use by the text editors. Should not be used by plug-in developers.  The following IDs have special meaning for the text editor framework:
-&lt;ul&gt;
-&lt;li&gt;&quot;RulerClick&quot;: the contributed action which is invoked upon single-click in the (left) vertical ruler&lt;/li&gt;
-&lt;li&gt;&quot;RulerDoubleClick&quot;: the contributed action which is invoked upon single-click in the (left) vertical ruler&lt;/li&gt;
-&lt;/ul&gt;
-&lt;p&gt;
-If multiple extensions contribute ruler actions to the same text editor, the extension whose plug-in is at the top of the prerequisite tree wins. If there are multiple such plug-ins, the first wins.
-&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="mode">
-            <annotation>
-               <documentation>
-                  For actions appearing in a toolbar, &lt;code&gt;FORCE_TEXT&lt;/code&gt; will show text even if there is an icon.  See ActionContribuitonItem.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="FORCE_TEXT">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="parameter">
-      <annotation>
-         <documentation>
-            A parameter element to be used within an IExecutableExtension element.  This will be passed as initialization data to the instantiated class.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the parameter name
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the parameter value
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="class">
-      <annotation>
-         <documentation>
-            The element version of the &lt;code&gt;class&lt;/code&gt; attribute.  This is used when the class implements &lt;code&gt;org.eclipse.core.runtime.IExecutableExtension&lt;/code&gt; and there is parameterized data that you wish used in its initialization.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  A class that implements &lt;code&gt;org.eclipse.ui.IEditorActionDelegate&lt;/code&gt;.  It may also implement &lt;code&gt;org.eclipse.core.runtime.IExecutableExtension&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of an editor action extension: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.editorActions&quot;&gt; 
-      &lt;editorContribution 
-         id=&quot;com.xyz.xyzContribution&quot; 
-         targetID=&quot;com.ibm.XMLEditor&quot;&gt; 
-         &lt;menu
-            id=&quot;XYZ&quot;
-            label=&quot;&amp;amp;XYZ Menu&quot;&gt; 
-            &lt;separator name=&quot;group1&quot;/&gt; 
-         &lt;/menu&gt; 
-         &lt;action 
-            id=&quot;com.xyz.runXYZ&quot; 
-            label=&quot;&amp;amp;Run XYZ Tool&quot; 
-            menubarPath=&quot;XYZ/group1&quot; 
-            toolbarPath=&quot;Normal/additions&quot;
-            style=&quot;toggle&quot;
-            state=&quot;true&quot; 
-            icon=&quot;icons/runXYZ.gif&quot; 
-            tooltip=&quot;Run XYZ Tool&quot; 
-            helpContextId=&quot;com.xyz.run_action_context&quot; 
-            class=&quot;com.xyz.actions.RunXYZ&quot;&gt; 
-            &lt;selection class=&quot;org.eclipse.core.resources.IFile&quot; name=&quot;*.java&quot;/&gt; 
-         &lt;/action&gt; 
-      &lt;/editorContribution&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-In the example above, the specified action will appear as a check box item in the new top-level menu named &quot;XYZ Menu&quot;, and as a toggle button in the toolbar. The action is enabled if the selection contains only Java file resources.
-&lt;p&gt;
-The following is an other example of an editor action extension: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.editorActions&quot;&gt; 
-      &lt;editorContribution 
-         id=&quot;com.xyz.xyz2Contribution&quot; 
-         targetID=&quot;com.ibm.XMLEditor&quot;&gt; 
-         &lt;menu 
-            id=&quot;XYZ2&quot; 
-            label=&quot;&amp;amp;XYZ2 Menu&quot; 
-            path=&quot;edit/additions&quot;&gt; 
-            &lt;separator name=&quot;group1&quot;/&gt; 
-         &lt;/menu&gt; 
-         &lt;action 
-            id=&quot;com.xyz.runXYZ2&quot; 
-            label=&quot;&amp;amp;Run XYZ2 Tool&quot; 
-            menubarPath=&quot;edit/XYZ2/group1&quot;
-            style=&quot;push&quot;
-            icon=&quot;icons/runXYZ2.gif&quot; 
-            tooltip=&quot;Run XYZ2 Tool&quot; 
-            helpContextId=&quot;com.xyz.run_action_context2&quot; 
-            class=&quot;com.xyz.actions.RunXYZ2&quot;&gt; 
-            &lt;enablement&gt;
-               &lt;and&gt;
-                  &lt;objectClass name=&quot;org.eclipse.core.resources.IFile&quot;/&gt;
-                  &lt;not&gt;
-                     &lt;objectState name=&quot;extension&quot; value=&quot;java&quot;/&gt;
-                  &lt;/not&gt;
-               &lt;/and&gt;
-            &lt;/enablement&gt;
-         &lt;/action&gt; 
-      &lt;/editorContribution&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-In the example above, the specified action will appear as a menu item in the sub-menu named &quot;XYZ2 Menu&quot; in the top level &quot;Edit&quot; menu. The action is enabled if the selection contains no Java file resources.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The value of the class attribute must be a fully qualified
-name of a Java class that implements 
-&lt;samp&gt;org.eclipse.ui.IEditorActionDelegate&lt;/samp&gt;. 
-This class is loaded as late as possible to 
-avoid loading the entire plug-in before it is really 
-needed. The method &lt;samp&gt;setActiveEditor&lt;/samp&gt; will be 
-called each time an editor of the specified type is 
-activated. Only one set of actions and menus will be 
-created for all instances of the specified editor 
-type, regardless of the number of editor instances 
-currently opened in the Workbench. 
-&lt;p&gt;
-This extension point can be used to contribute actions 
-into menus previously created by the target editor. 
-In addition, menus and actions can be contributed to 
-the Workbench window.  The identifiers for actions and 
-major groups within the Workbench window are defined in 
-&lt;samp&gt;org.eclipse.ui.IWorkbenchActionConstants&lt;/samp&gt;.  
-These should be used as a reference point for 
-the addition of new actions.  Top level menus are 
-created by using the following values for the 
-path attribute: 
-&lt;ul&gt;
-&lt;li&gt;
-additions - represents a named group immediately to the left of the &lt;samp&gt;Window&lt;/samp&gt; menu. 
-&lt;/li&gt;
-&lt;/ul&gt;
-Omitting the path attribute will result in adding the new menu into the additions menu bar group.
-&lt;p&gt;
-Actions and menus added into these paths will only 
-be shown while the associated editor is active. When 
-the editor is closed, menus and actions will be removed.
-&lt;p&gt;
-The enablement criteria for an action extension is initially defined by &lt;samp&gt;enablesFor&lt;/samp&gt;, and also either &lt;samp&gt;selection&lt;/samp&gt; or &lt;samp&gt;enablement&lt;/samp&gt;. However, once the action delegate has been instantiated, it may control the action enable state directly within its &lt;samp&gt;selectionChanged&lt;/samp&gt; method.
-&lt;p&gt;
-Action and menu labels may contain special characters that encode mnemonics using the following rules:
-&lt;ol&gt;
-&lt;li&gt;
-Mnemonics are specified using the ampersand (&apos;&amp;amp;&apos;) character in front
-of a selected character in the translated text. Since ampersand is not
-allowed in XML strings, use &lt;samp&gt;&amp;amp;amp;&lt;/samp&gt; character entity.&lt;/li&gt;
-&lt;/ol&gt;
-If two or more actions are contributed to a menu or toolbar by a single
-extension the actions will appear in the reverse order of how they are
-listed in the plugin.xml file. This behavior is admittedly unintuitive. 
-However, it was discovered after the Eclipse Platform API was frozen. 
-Changing the behavior now would break every plug-in which relies upon the
-existing behavior.
-&lt;p&gt;
-The &lt;samp&gt;selection&lt;/samp&gt; and &lt;samp&gt;enablement&lt;/samp&gt; elements are mutually exclusive. The &lt;samp&gt;enablement&lt;/samp&gt; element can replace the &lt;samp&gt;selection&lt;/samp&gt; element using the sub-elements &lt;samp&gt;objectClass&lt;/samp&gt; and &lt;samp&gt;objectState&lt;/samp&gt;. For example, the following:
-&lt;pre&gt;
- &lt;selection
-  class=&quot;org.eclipse.core.resources.IFile&quot;
-  name=&quot;*.java&quot;&gt;
- &lt;/selection&gt;
-&lt;/pre&gt;
-can be expressed using:
-&lt;pre&gt;
- &lt;enablement&gt;
-  &lt;and&gt;
-   &lt;objectClass name=&quot;org.eclipse.core.resources.IFile&quot;/&gt;
-   &lt;objectState name=&quot;extension&quot; value=&quot;java&quot;/&gt;
-  &lt;/and&gt;
- &lt;/enablement&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         The Workbench provides a built-in &quot;Default Text Editor&quot;. Plug-ins can contribute into this default editor or editors provided by other plug-ins.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2000, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/editors.exsd b/bundles/org.eclipse.ui/schema/editors.exsd
deleted file mode 100644
index b09ccdf..0000000
--- a/bundles/org.eclipse.ui/schema/editors.exsd
+++ /dev/null
@@ -1,344 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="editors" name="Internal and External Editors"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to add new editors to the 
-workbench.  A editor is a visual component within a 
-workbench page. It is typically used to edit or browse 
-a document or input object.  To open an editor, the user 
-will typically invoke &quot;Open&quot; on an &lt;samp&gt;IFile&lt;/samp&gt;.  
-When this action is performed the workbench registry 
-is consulted to determine an appropriate editor for 
-the file type and then a new instance of the editor 
-type is created.  The actual result depends on the 
-type of the editor.  The workbench provides support 
-for the creation of internal editors, which are tightly 
-integrated into the workbench, and external editors, 
-which are launched in a separate frame window.  
-There are also various level of integration between 
-these extremes. 
-&lt;p&gt;
-In the case of an internal editor tight integration can 
-be achieved between the workbench window and the editor 
-part.  The workbench menu and toolbar are pre-loaded 
-with a number of common actions, such as cut, copy, and 
-paste.  The active part, view or editor, is expected to 
-provide the implementation for these actions. An internal 
-editor may also define new actions which appear in the 
-workbench window.  These actions only appear when the 
-editor is active. 
-&lt;p&gt;
-The integration between the workbench and external
-editors is more tenuous.  In this case the workbench 
-may launch an editor but after has no way of determining
-the state of the external editor or collaborating 
-with it by any means except through the file system.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="editor" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="editor">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name" icon="icon"/>
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="contentTypeBinding" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this editor
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name that will be used in the UI for this editor
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  A relative name of the icon that will be used for all resources that match the specified extensions. Editors should provide an icon to make it easy for users to distinguish between different editor types. If you specify a command rather than a class, an icon is not needed. In that case, the workbench 
-will use the icon provided by the operating system.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="extensions" type="string">
-            <annotation>
-               <documentation>
-                  an optional field containing the list of file types understood by the editor.  This is a string containing comma separate file extensions.  For instance, an editor which understands hypertext documents may register for &quot;htm, html&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  the name of a class that implements &lt;samp&gt;org.eclipse.ui.IEditorPart&lt;/samp&gt;. The attributes &lt;samp&gt;class&lt;/samp&gt;, &lt;samp&gt;command&lt;/samp&gt;, and &lt;samp&gt;launcher&lt;/samp&gt; are mutually exclusive. If this attribute is defined then &lt;samp&gt;contributorClass&lt;/samp&gt; should also be defined.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.part.EditorPart"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="command" type="string">
-            <annotation>
-               <documentation>
-                  a command to run in order to launch an external editor. The executable command must be located on the system path or in the plug-in&apos;s directory. The attributes &lt;samp&gt;class&lt;/samp&gt;, &lt;samp&gt;command&lt;/samp&gt;, and &lt;samp&gt;launcher&lt;/samp&gt; are mutually exclusive.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="launcher" type="string">
-            <annotation>
-               <documentation>
-                  the name of a class which that implements &lt;samp&gt;org.eclipse.ui.IEditorLauncher&lt;/samp&gt;. 
-A launcher will open an external editor. The attributes &lt;samp&gt;class&lt;/samp&gt;, &lt;samp&gt;command&lt;/samp&gt;, and &lt;samp&gt;launcher&lt;/samp&gt; are mutually exclusive.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.IEditorLauncher"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="contributorClass" type="string">
-            <annotation>
-               <documentation>
-                  the name of a class that implements &lt;samp&gt;org.eclipse.ui.IEditorActionBarContributor&lt;/samp&gt;. This attribute should only be defined if the &lt;samp&gt;class&lt;/samp&gt; attribute is defined. This class is used to add new actions to the workbench menu and tool bar which reflect the features of the editor type.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.part.EditorActionBarContributor"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="default" type="boolean" use="default" value="false">
-            <annotation>
-               <documentation>
-                  if true, this editor will be used as the default editor for the
-type. This is only relevant in a case where more than one editor
-is registered for the same type. If an editor is not the default
-for the type, it can still be launched using &quot;Open with...&quot;
-submenu for the selected resource.
-&lt;p&gt;
-Please note that this attribute is only honored for filename and extension associations at this time.  It will not be honored for content type bindings.  Content type-based resolution will occur on a first come, first serve basis and is not explicitly specified.&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="filenames" type="string">
-            <annotation>
-               <documentation>
-                  an optional field containing the list of file names 
-understood by the editor.  This is a string 
-containing comma separate file names.  For instance, 
-an editor which understands specific hypertext 
-documents may register for &quot;ejb.htm, ejb.html&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="symbolicFontName" type="string">
-            <annotation>
-               <documentation>
-                  the symbolic name of a font. The symbolic font name must be the id of a defined font (see org.eclipse.ui.fontDefinitions). If this attribute is missing or invalid then the font name is the value of &quot;org.eclipse.jface.textfont&quot; in the editor&apos;s preferences store. If there is no preference store or the key is not defined then the JFace text font will be used. The editor implementation decides if it uses this symbolic font name to set the font.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="matchingStrategy" type="string">
-            <annotation>
-               <documentation>
-                  the name of a class that implements &lt;samp&gt;org.eclipse.ui.IEditorMatchingStrategy&lt;/samp&gt;. This attribute should only be defined if the &lt;samp&gt;class&lt;/samp&gt; attribute is defined. This allows the editor extension to provide its own algorithm for matching the input of one of its editors to a given editor input.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.IEditorMatchingStrategy"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="contentTypeBinding">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="contentTypeId"/>
-         </appinfo>
-         <documentation>
-            Advertises that the containing editor understands the given content type and is suitable for editing files of that type.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="contentTypeId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The content type identifier. This is an ID defined by the &apos;org.eclipse.core.contenttype.contentTypes&apos; extension point.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.core.contenttype.contentTypes/content-type/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example 
-of an internal editor extension definition: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.editors&quot;&gt; 
-      &lt;editor 
-         id=&quot;com.xyz.XMLEditor&quot; 
-         name=&quot;Fancy XYZ XML editor&quot; 
-         icon=&quot;./icons/XMLEditor.gif&quot; 
-         extensions=&quot;xml&quot; 
-         class=&quot;com.xyz.XMLEditor&quot; 
-         contributorClass=&quot;com.xyz.XMLEditorContributor&quot; 
-         symbolicFontName=&quot;org.eclipse.jface.textfont&quot;
-         default=&quot;false&quot;&gt; 
-      &lt;/editor&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         If the command attribute is used, it will be treated 
-as an external program command line that will be executed
- in a platform-dependent manner. 
-&lt;p&gt;
-If the launcher attribute is used the editor will also 
-be treated as an external program.  In this case the 
-specified class must implement 
-&lt;samp&gt;org.eclipse.ui.IEditorLauncher&lt;/samp&gt;. 
-The launcher will be instantiated and then 
-&lt;samp&gt;open(IPath path)&lt;/samp&gt; will be invoked to 
-launch the editor on the provided local file system path. 
-&lt;p&gt;
-If the class attribute is used, the workbench will 
-assume that it is an internal editor and the specified 
-class must implement &lt;samp&gt;org.eclipse.ui.IEditorPart&lt;/samp&gt;.
-It is common practice to 
-&lt;samp&gt;subclass org.eclipse.ui.EditorPart&lt;/samp&gt; when 
-defining a new editor type.  It is also necessary to 
-define a &lt;samp&gt;contributorClass&lt;/samp&gt; attribute.  
-The specified class must implement 
-&lt;samp&gt;org.eclipse.ui.IEditorActionBarContributor&lt;/samp&gt;, 
-and is used to add new actions to the workbench 
-menu and tool bar which reflect the features of the 
-editor type. 
-&lt;p&gt;
-Within the workbench there may be more than one open 
-editor of a particular type.  For instance, there may 
-be one or more open Java Editors.  To avoid the creation
-of duplicate actions and action images the editor 
-concept has been split into two.  An 
-&lt;samp&gt;IEditorActionBarContributor&lt;/samp&gt; is responsible
-for the creation of actions.  The editor is responsible 
-for action implementation.  Furthermore, the contributor 
-is shared by each open editor.  As a result of this 
-design there is only one set of actions for one or 
-more open editors. 
-&lt;p&gt;
-The contributor will add new actions to the workbench 
-menu and toolbar which reflect the editor type.  These 
-actions are shared and, when invoked, act upon the 
-active editor.  The active editor is passed to the 
-contributor by invoking 
-&lt;samp&gt;IEditorActionBarContributor.setActiveEditor&lt;/samp&gt;.  
-The identifiers for actions and major groups within 
-the workbench window are defined in 
-&lt;samp&gt;org.eclipse.ui.IWorkbenchActionConstants&lt;/samp&gt;.  
-These should be used as a reference point for the 
-addition of new actions.   Top level menus are created 
-by using the following values for the path attribute: 
-&lt;ul&gt;
-&lt;li&gt;
-additions - represents a group to the left of the Window menu. 
-&lt;/li&gt;
-&lt;/ul&gt;
-Actions and menus added into these paths will only be 
-shown while the associated editor is active. When the 
-editor is closed, menus and actions will be removed.
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         The workbench provides a &quot;Default Text Editor&quot;. The end user product may contain other editors as part of the shipping bundle. In that case, editors will be registered as extensions using the syntax described above.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/elementFactories.exsd b/bundles/org.eclipse.ui/schema/elementFactories.exsd
deleted file mode 100644
index 78198d8..0000000
--- a/bundles/org.eclipse.ui/schema/elementFactories.exsd
+++ /dev/null
@@ -1,167 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="elementFactories" name="Element Factories"/>
-      </appInfo>
-      <documentation>
-         This extension point is used to add element factories 
-to the workbench.  An element factory is used to 
-recreate &lt;samp&gt;IAdaptable&lt;/samp&gt; objects which are 
-persisted during workbench shutdown. 
-&lt;p&gt;
-As an example, the element factory is used to 
-persist editor input.  The input for an 
-editor must implement 
-&lt;samp&gt;org.eclipse.ui.EditorInput&lt;/samp&gt;.  
-The life cycle of an &lt;samp&gt;IEditorInput&lt;/samp&gt; within 
-an editor has a number of phases. 
-&lt;ol&gt;
-&lt;li&gt;
-The initial input for an editor is passed in during 
-editor creation. 
-&lt;/li&gt;
-&lt;li&gt;
-On shutdown the workbench state is captured.  
-In this process the workbench will create a memento 
-for each open editor and its input.  The input is 
-saved as a two part memento containing a factory ID 
-and any primitive data required to recreate the 
-element on startup.  For more information see 
-the documentation on 
-&lt;samp&gt;org.eclipse.ui.IPersistableElement&lt;/samp&gt;. 
-&lt;/li&gt;
-&lt;li&gt;
-On startup the workbench state is read and the 
-editors from the previous session are recreated.  
-In this process the workbench will recreate the input 
-element for each open editor.  To do this it will 
-map the original factory ID for the input element 
-to a concrete factory class defined in the registry.  
-If a mapping exists, and the factory class is valid, 
-an instance of the factory class is created.  Then 
-the workbench asks the factory to recreate the original 
-element from the remaining primitive data within the 
-memento.  The resulting &lt;samp&gt;IAdaptable&lt;/samp&gt; is cast
-to an &lt;samp&gt;IEditorInput&lt;/samp&gt; and passed to the 
-new editor. 
-&lt;/li&gt;
-&lt;/ol&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="factory" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="factory">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this factory.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified name of a class that implements 
-&lt;samp&gt;org.eclipse.ui.IElementFactory&lt;/samp&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.IElementFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of an element factory extension: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension 
-        point = &quot;org.eclipse.ui.elementFactories&quot;&gt; 
-        &lt;factory 
-           id =&quot;com.xyz.ElementFactory&quot; 
-           class=&quot;com.xyz.ElementFactory&quot;&gt; 
-        &lt;/factory&gt; 
-    &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The value of the &lt;samp&gt;class&lt;/samp&gt; attribute must 
-be a fully qualified name of a class that implements 
-&lt;samp&gt;org.eclipse.ui.IElementFactory&lt;/samp&gt;. An instance 
-of this class must create an &lt;samp&gt;IAdaptable&lt;/samp&gt; 
-object from a workbench memento.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The workbench provides an &lt;samp&gt;IResource&lt;/samp&gt; factory.  
-Additional factories should be added to recreate other 
-&lt;samp&gt;IAdaptable&lt;/samp&gt; types commonly found in other 
-object models, such as the Java Model.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2002, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/encodings.exsd b/bundles/org.eclipse.ui/schema/encodings.exsd
deleted file mode 100644
index 093aaf4..0000000
--- a/bundles/org.eclipse.ui/schema/encodings.exsd
+++ /dev/null
@@ -1,125 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="encodings" name="Encodings"/>
-      </appInfo>
-      <documentation>
-         A list of encodings that will be made available to the user for selection of file encodings. This list corresponds to the values of Charset#getName() for a series of Charsets. Those that are specified but not avaiable will be indicated as such in the workbench and will not be selectable by the user.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <documentation>
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="encoding" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="encoding">
-      <annotation>
-         <documentation>
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the charset. If this value is sent to Charset#getName(String) the corresponding Charset would be returned.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of an encodings extension:
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension 
-       point=&quot;org.eclipse.ui.encodings&quot;&gt;
-      &lt;encoding name=&quot;ISO-8859-1&quot;/&gt;
-      &lt;encoding name=&quot;UTF-8&quot;/&gt;
-      &lt;encoding name=&quot;US-ASCII&quot;/&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Use method &lt;code&gt;org.eclipse.ui.WorkbenchEncoding.getDefinedEncodings&lt;/code&gt; to retrieve the encodings defined by this extension point.
-Use method &lt;code&gt;org.eclipse.ui.WorkbenchEncoding.getWorkbenchDefaultEncoding&lt;/code&gt; to retrieve the default encoding from the virtual machine.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The workbench provides some commonly used encodings.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2004,2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/exportWizards.exsd b/bundles/org.eclipse.ui/schema/exportWizards.exsd
deleted file mode 100644
index 233fc5d..0000000
--- a/bundles/org.eclipse.ui/schema/exportWizards.exsd
+++ /dev/null
@@ -1,258 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="exportWizards" name="Export Wizards"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to register export wizard extensions. Export wizards appear as choices within the &quot;Export Dialog&quot;, and are used to export resources from the workbench. 
-&lt;p&gt;
-Wizards may optionally specify a description subelement whose body should contain short text about the wizard.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <choice minOccurs="0" maxOccurs="unbounded">
-            <element ref="category"/>
-            <element ref="wizard"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="category">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name"/>
-         </appinfo>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that can be used to identify this category
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name of the category that will be used in the dialog box
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="parentCategory" type="string">
-            <annotation>
-               <documentation>
-                  a path to another category if this category should be added as a child
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.exportWizards/category/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizard">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name" icon="icon"/>
-         </appinfo>
-         <documentation>
-            an element that will be used to create export wizard
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="description" minOccurs="0" maxOccurs="1"/>
-            <element ref="selection" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this wizard
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name that will be used in the dialog box to represent this wizard
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="category" type="string">
-            <annotation>
-               <documentation>
-                  a slash-delimited path (&apos;/&apos;) of category IDs. Each token in the
-path must represent a valid category ID previously defined
-by this or some other plug-in. If omitted, the wizard will be
-added to the &quot;Other&quot; category.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified name of the class that implements &lt;tt&gt;org.eclipse.ui.IExportWizard&lt;/tt&gt;
-interface
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jface.wizard.Wizard:org.eclipse.ui.IExportWizard"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a relative name of the icon that will be used 
-alongside the wizard name in the export engine listing.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="description" type="string">
-      <annotation>
-         <appinfo>
-            <meta.element translatable="true"/>
-         </appinfo>
-         <documentation>
-            an optional subelement whose body should represent a short description
-of the export engine functionality.
-         </documentation>
-      </annotation>
-   </element>
-
-   <element name="selection">
-      <annotation>
-         <documentation>
-            an optional element that restricts the types and names of objects that can be selected 
-when the wizard is invoked.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name filter.  Each object in the workbench selection must match the name filter to be passed to the wizard.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified class name.  If each object in the workbench selection implements this interface the selection will be passed to the wizard.  Otherwise, an empty selection is passed.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of an export extension definition:
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension 
-       point=&quot;org.eclipse.ui.exportWizards&quot;&gt; 
-      &lt;wizard 
-         id=&quot;com.xyz.ExportWizard1&quot; 
-         name=&quot;XYZ Web Exporter&quot; 
-         class=&quot;com.xyz.exports.ExportWizard1&quot; 
-         icon=&quot;./icons/import1.gif&quot;&gt; 
-         &lt;description&gt; 
-            A simple engine that exports Web project 
-         &lt;/description&gt; 
-         &lt;selection class=&quot;org.eclipse.core.resources.IProject&quot;/&gt; 
-      &lt;/wizard&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The value of the &lt;samp&gt;class&lt;/samp&gt; attribute 
-must be a name of the class that implements 
-&lt;samp&gt;org.eclipse.ui.IExportWizard&lt;/samp&gt;.
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         The workbench comes preloaded with basic export engines 
-for files and directories.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/fontDefinitions.exsd b/bundles/org.eclipse.ui/schema/fontDefinitions.exsd
deleted file mode 100644
index e62c8e4..0000000
--- a/bundles/org.eclipse.ui/schema/fontDefinitions.exsd
+++ /dev/null
@@ -1,193 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="fontDefinitions" name="Font Definitions"/>
-      </appInfo>
-      <documentation>
-         This extension point is used to register fonts with the JFace FontRegistry and with the workbench preference store for use by the Fonts preference page.
-
-This extension point has been deprecated in 3.0.  You should now add fontDefinition elements to org.eclipse.ui.themes.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="fontDefinition" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="fontDefinition">
-      <complexType>
-         <sequence>
-            <element ref="description" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that can be used to identify this font definition.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name of the font to be presented to the user.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;the font value.  This is in the form: &lt;code&gt;fontname-style-height&lt;/code&gt; where &lt;code&gt;fontname&lt;/code&gt; is the name of a font, &lt;code&gt;style&lt;/code&gt; is a font style (one of &lt;code&gt;&quot;regular&quot;&lt;/code&gt;, &lt;code&gt;&quot;bold&quot;&lt;/code&gt;, &lt;code&gt;&quot;italic&quot;&lt;/code&gt;, or &lt;code&gt;&quot;bold italic&quot;&lt;/code&gt;) and &lt;code&gt;height&lt;/code&gt; is an integer representing the font height.&lt;/p&gt;
-&lt;p&gt;Example: &lt;code&gt;Times New Roman-bold-36&lt;/code&gt;.&lt;/p&gt;  
-&lt;p&gt;
-Only one (or neither) of value or defaultsTo may be used.
-&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="categoryId" type="string">
-            <annotation>
-               <documentation>
-                  the optional id of the presentation category this font belongs to.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="defaultsTo" type="string">
-            <annotation>
-               <documentation>
-                  the id of another font definition that is the default setting for the receiver. When there is no preference for this font the font registry will have the value of defaultsTo set for it in the registry.
-&lt;p&gt;
-Only one or neither of value or defaultsTo may be used.
-&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="description">
-      <annotation>
-         <appInfo>
-            <meta.element translatable="true"/>
-         </appInfo>
-         <documentation>
-            a short description of the fonts usage
-         </documentation>
-      </annotation>
-      <complexType>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         Release 2.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         Following is an example of an a font definition extension:
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.fontDefinition&quot;&gt; 
-      &lt;fontDefinition 
-         id=&quot;org.eclipse.examples.textFont&quot; 
-         label=&quot;Text&quot;&gt; 
-         &lt;description&gt;
-            The text font
-         &lt;/description&gt;
-      &lt;/fontDefinition&gt; 
-
-      &lt;fontDefinition 
-        id=&quot;org.eclipse.examples.userFont&quot; 
-        label=&quot;User&quot;
-        defaultsTo=&quot;org.eclipse.jface.textFont&quot;&gt; 
-        &lt;description&gt;
-           The user font
-        &lt;/description&gt;
-      &lt;/fontDefinition&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The defaultsTo tag is used as a directive by
-the Workbench to set the value of the font definition to the value of defaultsTo
-whenever the defaultsTo fontDefinition is updated. This only occurs if the
-fontDefinition is at its default value - once it is set by the user this updates
-will not occur. The workbench provides 4 fonts: 
-&lt;P&gt;&lt;b&gt;org.eclipse.jface.bannerfont&lt;/b&gt;. The banner font is used in wizard banners.&lt;br&gt;
-&lt;b&gt;org.eclipse.jface.dialogfont&lt;/b&gt;. The dialog font is the font for widgets in dialogs.&lt;br&gt;
-&lt;b&gt;org.eclipse.jface.headerfont&lt;/b&gt;. The header font is used for section headers in composite text pages.&lt;br&gt;
-&lt;b&gt;org.eclipse.jface.textfont&lt;/b&gt;. The text font is used by text editors.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The workbench provides the font
-definitions for the text, dialog, banner and header fonts.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2002, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/handlers.exsd b/bundles/org.eclipse.ui/schema/handlers.exsd
deleted file mode 100644
index edcd978..0000000
--- a/bundles/org.eclipse.ui/schema/handlers.exsd
+++ /dev/null
@@ -1,305 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="handlers" name="Handlers"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-The handlers extension point is an elaboration of the experimental &lt;code&gt;handlerSubmission&lt;/code&gt; element defined in Eclipse 3.0.  A handler is the behaviour of a command at a particular point in time.  A command can have zero or more handlers associated with it.  At any one point in time, however, a command will either have no active handler or one active handler.  The active handler is the one which is currently responsible for carrying out the behaviour of the command.  This is very similar to the concept of an action handler and a retargettable action.
-&lt;/p&gt;
-&lt;p&gt;
-The handlers extension point allows a plug-in developer to specify a handler that should become active and/or enabled under certain conditions.  If a handler is inactive, then no command will delegate its behaviour to the handler.  If a handler is disabled, then the handler will not be asked to execute; execution of the handler is blocked.  The conditions are defined using the expression language facility added during 3.0.  They are expressed using &lt;code&gt;activeWhen&lt;/code&gt; and &lt;code&gt;enabledWhen&lt;/code&gt; clauses.
-&lt;/p&gt;
-&lt;p&gt;
-The workbench provides some variables that these expressions can rely on.  Variables that are valid in activeWhen and enabledWhen expressions can be found in &lt;code&gt;org.eclipse.ui.ISources&lt;/code&gt;.  The types of the variables are determined by the &lt;code&gt;org.eclipse.ui.ISourceProvider&lt;/code&gt; that provides them.
-&lt;/p&gt;
-&lt;p&gt;
-A handler that specifies no conditions is a default handler.  A default handler is only active if no other handler has all of its conditions satisfied.  If two handlers still have conditions that are satisfied, then the conditions are compared.  The idea is to select a handler whose condition is more specific or more local.  To do this, the variables referred to by the condition are looked at.  The condition that refers to the most specific variable &quot;wins&quot;.  The order of specificity (from least specific to most specific) is suggested in &lt;code&gt;org.eclipse.ui.ISources&lt;/code&gt;.
-&lt;/p&gt;
-&lt;p&gt;
-If this still doesn&apos;t resolve the conflict, then no handler is active.  If a particular tracing option is turned on, then this leads to a message in the log.  A conflict can also occur if there are two default handlers.  It is the responsibility of the plug-in developers and integration testers to ensure that this does not happen.
-&lt;/p&gt;
-&lt;p&gt;
-These conditions are used to avoid unnecessary plug-in loading.  These handler definitions are wrapped in a proxy.  For a proxy to load its underlying handler, two things must happen: the conditions for the proxy must be met so that it becomes active, and the command must be asked to do something which it must delegate (e.g., execute(), isEnabled()).
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="handler" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="handler">
-      <annotation>
-         <documentation>
-            &lt;p&gt;Associated a command with a handler implementation.&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="activeWhen" minOccurs="0" maxOccurs="1"/>
-            <element ref="class" minOccurs="0" maxOccurs="1"/>
-            <element ref="enabledWhen" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="commandId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;The id of the command to associate with this handler implementation.&lt;/p&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.commands/command/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;The handler class that imlements &lt;code&gt;org.eclipse.core.commands.IHandler&lt;/code&gt; or extends &lt;code&gt;org.eclipse.core.commands.AbstractHandler&lt;/code&gt;.&lt;/p&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.commands.IHandler"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="helpContextId" type="string">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;
-The identifier of the help context that relates to this specific handler.  While a command can provide a general description of a command&apos;s behaviour, it is sometimes appropriate for a handler to provide help more specific to their implementation.
-&lt;/p&gt;
-&lt;p&gt;&lt;em&gt;Since: 3.2&lt;/em&gt;&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="activeWhen">
-      <annotation>
-         <documentation>
-            &lt;p&gt;Contains a core expression used by the &lt;code&gt;IHandlerService&lt;/code&gt; to determine when this handler is active.&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice>
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-            <element ref="reference"/>
-         </choice>
-      </complexType>
-   </element>
-
-   <element name="enabledWhen">
-      <annotation>
-         <documentation>
-            &lt;p&gt;Contains a core expression used by the workbench handler proxy to determine when this handler is enabled without loading it.&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice>
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-            <element ref="reference"/>
-         </choice>
-      </complexType>
-   </element>
-
-   <element name="class">
-      <annotation>
-         <documentation>
-            &lt;p&gt;Used when creating an &lt;code&gt;IExecutableExtension&lt;/code&gt; with a named parameter, or more than one.&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;The handler class that imlements &lt;code&gt;org.eclipse.core.commands.IHandler&lt;/code&gt; or extends &lt;code&gt;org.eclipse.core.commands.AbstractHandler&lt;/code&gt;.&lt;/p&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.core.commands.IHandler"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="parameter">
-      <annotation>
-         <documentation>
-            &lt;p&gt;A parameter for an &lt;code&gt;IExecutableExtension&lt;/code&gt;.&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;The parameter name.&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;The parameter value.&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-Variables that are valid in activeWhen and enabledWhen expressions can be found in &lt;code&gt;org.eclipse.ui.ISources&lt;/code&gt;.  The types of the variables are determined by the &lt;code&gt;org.eclipse.ui.ISourceProvider&lt;/code&gt; that provides them.
-&lt;/p&gt;
-&lt;pre&gt;
-&lt;extension
- point=&quot;org.eclipse.ui.handlers&quot;&gt;
- &lt;handler
-  commandId=&quot;commandId&quot;
-  class=&quot;org.eclipse.compare.Command&quot;&gt;
-  &lt;activeWhen&gt;
-   &lt;with variable=&quot;selection&quot;&gt;
-    &lt;count value=&quot;1&quot; /&gt;
-    &lt;iterate operator=&quot;and&quot;&gt;
-     &lt;adapt type=&quot;org.eclipse.core.resources.IResource&quot; /&gt;
-    &lt;/iterate&gt;
-   &lt;/with&gt;
-  &lt;/activeWhen&gt;
- &lt;/handler&gt;
- &lt;handler
-  commandId=&quot;other.commandId&quot;
-  class=&quot;org.eclipse.ui.TalkToMe&quot;&gt;
-  &lt;activeWhen&gt;
-   &lt;with variable=&quot;activePartId&quot;&gt;
-    &lt;equals value=&quot;org.eclipse.ui.views.SampleView&quot;/&gt;
-   &lt;/with&gt;
-  &lt;/activeWhen&gt;
- &lt;/handler&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-&lt;p&gt;
-To further avoid plug-in loading, it is possible to specify when the handler is enabled.  If the proxy has not yet loaded the handler, then only the expressions syntax is used to decide if the handler is enabled.  If the proxy has loaded the handler, then the expressions syntax is consulted first.  If the expressions syntax evaluates to true, then the handler is asked if it is enabled.  (This is a short-circuit Boolean &quot;and&quot; operation between the expressions syntax and the handler&apos;s enabled state.)
-&lt;/p&gt;
-&lt;pre&gt;
-&lt;extension
- point=&quot;org.eclipse.ui.handlers&quot;&gt;
- &lt;handler
-  commandId=&quot;commandId&quot;
-  class=&quot;org.eclipse.Handler&quot;&gt;
-  &lt;enabledWhen&gt;
-   &lt;with variable=&quot;activeContexts&quot;&gt;
-     &lt;iterator operator=&quot;or&quot;&gt;
-       &lt;equals value=&quot;org.eclipse.ui.contexts.window&quot;/&gt;
-     &lt;/iterator&gt;
-   &lt;/with&gt;
-  &lt;/enabledWhen&gt;
- &lt;/handler&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-All handlers implement &lt;code&gt;org.eclipse.core.commands.IHandler&lt;/code&gt;, and can use &lt;code&gt;org.eclipse.core.commands.AbstractHandler&lt;/code&gt; as a base class.  Within the workbench, it is possible to activate and deactivate handlers using the &lt;code&gt;org.eclipse.ui.handlers.IHandlerService&lt;/code&gt; interface.  This interface can be retrieved from supporting workbench objects, such as &lt;code&gt;IWorkbench&lt;/code&gt; itself, a workbench window, or a part site.  To retrieve the service, you would make a call like &lt;code&gt;IWorkbench.getService(IHandlerService.class)&lt;/code&gt;.
-&lt;/p&gt;
-&lt;p&gt;
-It is also possible to activate and deactive handlers using legacy code in the workbench.  This can be done through the legacy mechanism shown below.  This mechanism is useful to clients who are using actions to contribute to menus or toolbars.  This is deprecated and not recommended.
-&lt;/p&gt;
-&lt;pre&gt;
- IWorkbenchPartSite mySite;
- IAction myAction;
- 
- myAction.setActionDefinitionId(commandId);
- IKeyBindingService service = mySite.getKeyBindingService();
- service.registerAction(myAction);
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2005, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/helpSupport.exsd b/bundles/org.eclipse.ui/schema/helpSupport.exsd
deleted file mode 100644
index ea1ca2e..0000000
--- a/bundles/org.eclipse.ui/schema/helpSupport.exsd
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="helpSupport" name="HelpSupport"/>
-      </appInfo>
-      <documentation>
-         This extension point is for contributing the help system UI. The platform should be configured with no more than one help system UI.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="config" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="config">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the implementation class for displaying online and context-sensitive
-help.  This class must implement the &lt;samp&gt;org.eclipse.ui.help.AbstractHelpUI&lt;/samp&gt;
-interface.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.help.AbstractHelpUI"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.0 (originally named org.eclipse.help.support)
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is a sample usage of the help support extension point:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.ui.helpSupport&quot;&gt;
-  &lt;config class=&quot;com.example.XYZHelpUI&quot;/&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The supplied class must implement a subclass of &lt;samp&gt;org.eclipse.ui.help.AbstractHelpUI&lt;/samp&gt;. 
-Implementation of the abstract methods in that class
-determine what happens when a user asks for online help or context-sensitive help. The implementation should access contributed help information using org.eclipse.help.HelpSystem.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The &lt;samp&gt;org.eclipse.help.ui&lt;/samp&gt; plug-in contains an implementation of the help system UI.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2000, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/importWizards.exsd b/bundles/org.eclipse.ui/schema/importWizards.exsd
deleted file mode 100644
index 3c51fb3..0000000
--- a/bundles/org.eclipse.ui/schema/importWizards.exsd
+++ /dev/null
@@ -1,252 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="importWizards" name="Import Wizards"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to register import wizard extensions. Import wizards appear as choices within the &quot;Import Dialog&quot; and are used to import resources into the workbench. 
-&lt;p&gt;
-Wizards may optionally specify a description subelement whose body should contain short text about the wizard.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <choice minOccurs="0" maxOccurs="unbounded">
-            <element ref="category"/>
-            <element ref="wizard"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="category">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name"/>
-         </appinfo>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that can be used to identify this category
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name of the category that will be used in the dialog box
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="parentCategory" type="string">
-            <annotation>
-               <documentation>
-                  a path to another category if this category should be added as a child
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.importWizards/category/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizard">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name" icon="icon"/>
-         </appinfo>
-         <documentation>
-            an element that will be used to create import wizard
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="description" minOccurs="0" maxOccurs="1"/>
-            <element ref="selection" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this wizard
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name that will be used in the dialog box to represent this wizard
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="category" type="string">
-            <annotation>
-               <documentation>
-                  a slash-delimited path (&apos;/&apos;) of category IDs. Each token in the
-path must represent a valid category ID previously defined
-by this or some other plug-in. If omitted, the wizard will be
-added to the &quot;Other&quot; category.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified name of the class that implements &lt;samp&gt;org.eclipse.ui.IImportWizard&lt;/samp&gt; interface
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jface.wizard.Wizard:org.eclipse.ui.IImportWizard"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a relative name of the icon that will be used alongside the wizard name in the import engine listing.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="description" type="string">
-      <annotation>
-         <appinfo>
-            <meta.element translatable="true"/>
-         </appinfo>
-         <documentation>
-            an optional subelement whose body should represent a short description of the import engine functionality.
-         </documentation>
-      </annotation>
-   </element>
-
-   <element name="selection">
-      <annotation>
-         <documentation>
-            an optional element that restricts the types and names of objects that can be selected when the wizard is invoked.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name filter.  Each object in the workbench selection must match the name filter to be passed to the wizard.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  fully qualified class name.  If each object in the workbench selection implements this interface the selection will be passed to the wizard.  Otherwise, an empty selection is passed.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of an import extension definition: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension 
-       point=&quot;org.eclipse.ui.importWizards&quot;&gt; 
-      &lt;wizard 
-         id=&quot;com.xyz.ImportWizard1&quot; 
-         name=&quot;XYZ Web Scraper&quot; 
-         class=&quot;com.xyz.imports.ImportWizard1&quot; 
-         icon=&quot;./icons/import1.gif&quot;&gt; 
-         &lt;description&gt; 
-            A simple engine that searches the Web and imports files 
-         &lt;/description&gt; 
-         &lt;selection class=&quot;org.eclipse.core.resources.IResource&quot;/&gt; 
-      &lt;/wizard&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The value of the &lt;samp&gt;class&lt;/samp&gt; attribute must represent a name of the class that implements 
- &lt;samp&gt;org.eclipse.ui.IImportWizard&lt;/samp&gt;.
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         The workbench comes preloaded with the basic import engines for files and directories.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/installationPages.exsd b/bundles/org.eclipse.ui/schema/installationPages.exsd
deleted file mode 100644
index 41ffd63..0000000
--- a/bundles/org.eclipse.ui/schema/installationPages.exsd
+++ /dev/null
@@ -1,119 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="installationPages" name="Installation Dialog Pages"/>
-      </appinfo>
-      <documentation>
-         This is an experimental extension point for an extensible about dialog.  It is not ready for production and is included at this time only for evaluation by downstream clients.  Use at your own risk.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="page" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="page">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.branding.InstallationPage:"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/internalTweaklets.exsd b/bundles/org.eclipse.ui/schema/internalTweaklets.exsd
deleted file mode 100644
index 9439584..0000000
--- a/bundles/org.eclipse.ui/schema/internalTweaklets.exsd
+++ /dev/null
@@ -1,172 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="internalTweaklets" name="%ExtPoint.tweaklets"/>
-      </appInfo>
-      <documentation>
-         This internal extension point is not considered API.  It is used to define tweaklets.  A tweaklet is anything that can be used to tweak the look and feel of the Workbench.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <choice minOccurs="0" maxOccurs="unbounded">
-            <element ref="tweaklet"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tweaklet">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="name" icon="icon"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this tweaklet
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name that will be used in the UI for this tweaklet
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  a translatable short description of this tweaklet, to be used in the UI
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="definition" type="string">
-            <annotation>
-               <documentation>
-                  an identifier of the tweaklet definition in the workbench, typically a fully qualified type name
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="implementation" type="string">
-            <annotation>
-               <documentation>
-                  an identifier of the tweaklet implementation provided by the extender, typically a fully qualified class name
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a relative name of the icon that will 
-be associated with the tweaklet.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.3
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example tweaklet: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.internalTweaklets&quot;&gt; 
-      &lt;tweaklet 
-         id=&quot;org.eclipse.ui.internal.tweaklets.ConcreteXYZTweaklet&quot; 
-         name=&quot;XYZ Tweaklet&quot; 
-         description=&quot;Short description of the tweak&quot; 
-         definition=&quot;org.eclipse.ui.internal.tweaklets.AbstractXYZTweaklet&quot; 
-         implementation=&quot;org.eclipse.ui.internal.tweaklets.ConcreteXYZTweaklet&quot; 
-         icon=&quot;icons/XYZ.gif&quot;/&gt;
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Typically, although not required, the value of the &lt;samp&gt;definition&lt;/samp&gt; attribute is the
-fully qualified name of an abstract class or an interface defined by the
-workbench, and the value of the &lt;samp&gt;implementation&lt;/samp&gt; attribute is the
-fully qualified name of a non-abstract class provided by the extending plug-in.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         Tweaklet implementations can be found in the Eclipse Platform incubator.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/intro.exsd b/bundles/org.eclipse.ui/schema/intro.exsd
deleted file mode 100644
index 29ffa19..0000000
--- a/bundles/org.eclipse.ui/schema/intro.exsd
+++ /dev/null
@@ -1,204 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="intro" name="Intro Part"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;This extension point is used to register implementations of special workbench parts, called intro parts, that are responsible for introducing a product to new users. An intro part is typically shown the first time a product is started up. Rules for associating an intro part implementation with particular products are also contributed via this extension point.
-&lt;/p&gt;
-The life cycle is as follows:
-&lt;ul&gt;
-&lt;li&gt;The intro area is created on workbench start up. As with editor and view areas, this area is managed by an intro site (implementing &lt;code&gt;org.eclipse.ui.intro.IIntroSite&lt;/code&gt;).&lt;/li&gt;
-&lt;li&gt;The id of the current product (Platform.getProduct()) is used to choose the relevant intro part implementation.
-&lt;/li&gt;
-&lt;li&gt;The intro part class (implementing &lt;code&gt;org.eclipse.ui.intro.IIntroPart&lt;/code&gt;) is created and initialized with the intro site.
-&lt;/li&gt;
-&lt;li&gt;While the intro part is showing to the user, it can transition back and forth between full and standby mode (either programmatically or explicitly by the user).
-&lt;/li&gt;
-&lt;li&gt;Eventually the intro part is closed (either programmatically or explicitly by the user). The current perspective takes over the entire workbench window area.
-&lt;/li&gt;
-&lt;/ul&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="intro" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="introProductBinding" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="intro">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="id" icon="icon"/>
-         </appInfo>
-         <documentation>
-            Specifies an introduction. An introduction is a product-specific presentation shown to first-time users on product start up.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier for this introduction
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a plug-in-relative file name of the icon that will be associated with this introduction
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified name of the class implementing the &lt;code&gt;org.eclipse.ui.intro.IIntroPart&lt;/code&gt; interface.  A common practice 
-is to subclass &lt;samp&gt;org.eclipse.ui.part.intro.IntroPart&lt;/samp&gt; 
-in order to inherit the default functionality.  This class implements the introduction.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.intro.IIntroPart"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="contentDetector" type="string">
-            <annotation>
-               <documentation>
-                  a fully qualified name of a class extending &lt;code&gt;org.eclipse.ui.intro.IntroContentDetector&lt;/code&gt;.  This optional class is used to detect newly added introduction content.  If new content is available, the view showing the introduction will be opened again.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.intro.IntroContentDetector"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string">
-            <annotation>
-               <documentation>
-                  an string label for this introduction that will be used in the construction of the open action as well as the part label
-Since 3.2
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="introProductBinding">
-      <annotation>
-         <documentation>
-            Specifies a binding between a product and an introduction. These bindings determine which introduction is appropriate for the current product (as defined by &lt;code&gt;org.eclipse.core.runtime.Platform.getProduct()&lt;/code&gt;).
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="productId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  unique id of a product
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="introId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  unique id of an introduction
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of an intro part extension that contributes an particular introduction and associates it with a particular product:
-&lt;p&gt;
-&lt;pre&gt;
-  &lt;extension point=&quot;org.eclipse.ui.intro&quot;&gt;
-     &lt;intro
-        id=&quot;com.example.xyz.intro.custom&quot;
-        class=&quot;com.example.xyz.intro.IntroPart&quot;/&gt;
-     &lt;introProductBinding
-        productId=&quot;com.example.xyz.Product&quot;
-        introId=&quot;com.example.xyz.intro.custom&quot;/&gt;
-  &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The value of the &lt;code&gt;class&lt;/code&gt; attribute must be the fully qualified name of a class that implements the&lt;code&gt;org.eclipse.ui.intro.IIntroPart&lt;/code&gt; interface by subclassing &lt;code&gt;org.eclipse.ui.part.intro.IntroPart&lt;/code&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         There are no default implementations of the initial user experience. Each Eclipse-based product is responsible for providing one that is closely matched to its branding and function.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2004, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/keywords.exsd b/bundles/org.eclipse.ui/schema/keywords.exsd
deleted file mode 100644
index f1dde3a..0000000
--- a/bundles/org.eclipse.ui/schema/keywords.exsd
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="keywords" name="Keywords"/>
-      </appInfo>
-      <documentation>
-         The keywords extension point defines keywords and a unique id for reference by other schemas.
-
-See propertyPages and preferencePages.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <documentation>
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice>
-            <element ref="keyword" minOccurs="0" maxOccurs="unbounded"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="keyword">
-      <annotation>
-         <documentation>
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id is the unique id used to reference the keyword.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The human readable label of the keyword
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a keyword extension:
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-     point=&quot;org.eclipse.ui.keywords&quot;&gt;
-    &lt;keyword
-            label=&quot;presentation tab themes&quot;
-            id=&quot;com.xyz.AppearanceKeywords&quot;/&gt;
-   &lt;/extension&gt;    
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         There currently is no public API for retrieving or creating keywords other than this extension point.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         Keywords are used only with preference and property pages.  See the &lt;samp&gt;keywordReference&lt;/samp&gt; element of the org.eclipse.ui.propertyPages and org.eclipse.ui.preferencePages extension points.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005,2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/menus.exsd b/bundles/org.eclipse.ui/schema/menus.exsd
deleted file mode 100644
index e5b2f2f..0000000
--- a/bundles/org.eclipse.ui/schema/menus.exsd
+++ /dev/null
@@ -1,962 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="menus" name="Menus"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-This extension point allows the plug-in developer to add (contribute) a variety of custom additions to the eclipse framework:
-&lt;ul&gt;
-  &lt;li&gt;Main Menu&lt;/li&gt;
-  &lt;li&gt;Main Toolbars&lt;/li&gt;
-  &lt;li&gt;View Menus/Toolbars:
-  &lt;ul&gt;
-    &lt;li&gt;View Dropdown Menu&lt;/li&gt;
-    &lt;li&gt;View Toolbar&lt;/li&gt;
-    &lt;li&gt;Context Menu(s)&lt;/li&gt;
-  &lt;/ul&gt;
-  &lt;/li&gt;
-  &lt;li&gt;Trim&lt;/li&gt;
-&lt;/ul&gt;
-&lt;/p&gt;
-&lt;p&gt;
-It provides a common implementation for and acts as a replacement of the following (legacy) eclipse extension points:
-&lt;ul&gt;
-&lt;li&gt;org.eclipse.ui.ActionSets&lt;/li&gt;
-&lt;li&gt;org.eclipse.ui.EditorActions&lt;/li&gt;
-&lt;li&gt;org.eclipse.ui.popupMenus (including &apos;objectContributions&apos;)&lt;/li&gt;
-&lt;li&gt;org.eclipse.ui.viewActions&lt;/li&gt;
-&lt;/ul&gt;
-&lt;/p&gt;
-&lt;p&gt;
-The general strategy for this mechanism is to separate the &apos;location&apos; where the contributions should be inserted from the visibility and enablement state of the element. Each contribution first defines its insertion location through a Menu &apos;URI&apos;, a string (loosely) formatted according to the jave.net.URI format:
-&lt;/p&gt;&lt;p&gt;
-&lt;b&gt;&quot;[Scheme]:[ID]?[ArgList]&quot;&lt;/b&gt;
-&lt;ul&gt;
-&lt;li&gt;&lt;b&gt;Scheme&lt;/b&gt; - The &apos;type&apos; of the UI component into which the contributions will be added. It may be either &quot;menu&quot;, &quot;popup&quot; or &quot;toolbar&quot;. While &apos;popup&apos; is indeed a form of menu it is provided to allow a distinction between a view&apos;s &apos;chevron&apos; menu (for which we use the &quot;menu&quot; scheme) and its default context menu which, by convention, should be registered using the &quot;popup&quot; scheme.&lt;/li&gt;
-&lt;li&gt;&lt;b&gt;ID&lt;/b&gt; - This is the id of menu or toolbar into which the contributions should be added. By convention views should use their view id as the id of the root of their chevron and default popup menu. Note that there is no explicit distinction between contributions supporting editors and &apos;normal&apos; contributions into the Menu Menu or Toolbar; both global contributions and editor contributions would use the &quot;org.eclipse.ui.main.menu&quot; id or &quot;org.eclipse.ui.main.toolbar&quot;. A special id used with popup:, &quot;org.eclipse.ui.popup.any&quot;, is reserved to handle contributions which are candidates to appear on any (top level) context menu. Note that these contributions are expected to implement a &apos;visibleWhen&apos; expression sufficient to limit their visibility to appropriate menus&lt;/li&gt;
-&lt;li&gt;&lt;b&gt;Query&lt;/b&gt; - This field allows fine-grained definition of the specific location &lt;i&gt;within&lt;/i&gt; a given menu. It has the form &quot;[placement]=[id]&quot; where placement is one of &quot;before&quot; or &quot;after&quot; and the id is expected to be the id of some IContributionItem in the menu.&lt;/li&gt;
-&lt;/ul&gt; 
-&lt;p&gt;
-This will define the location at which the contributions will appear in the eclipse UI. Once the insertion point has been defined the rest of the contributions describe the UI elements that will be added at that location. Each element supports a &apos;visibleWhen&apos; expression that determines at run time whether a particular item should appear in the menu based on the system&apos;s current state (selection, active view/editor, context...).  See &lt;code&gt;org.eclipse.ui.ISources&lt;/code&gt; for a list of currently
-supported variables.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="group" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="widget" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="menuContribution" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  org.eclipse.ui.menus
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  An optional identifier of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  An optional name of the extension instance.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="group">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-         <documentation>
-            &lt;p&gt;
-A logical group.  It can either be visible (e.g., separators are drawn before and after, as appropriate) or invisible.  By default, logical groups are visible.
-&lt;/p&gt;
-&lt;p&gt;
-A group can contain menus, items and other groups.
-&lt;/p&gt;
-&lt;p&gt;
-This element is deprecated. Groups are now expressed as id&apos;d &apos;separator&apos; elements. The menu insertion URI can be used to define an insertion point either &apos;before&apos; or &apos;after&apos; &lt;b&gt;any&lt;/b&gt; id&apos;d element and placing it after the separator is the same as contributing it to the group. &lt;/p&gt;
-&lt;p&gt;
-See the documentation for the &apos;locationURI&apos; attribute of &apos;menuAddition&apos; for more details on how to define insertion points and how they relate to the menu structure.
-&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="location" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A unique identifier for this group.  It is recommended that the identifier be prefixed by the plug-in name, to guarantee uniqueness.  For example, a group contributed by &lt;code&gt;org.eclipse.ui&lt;/code&gt; might be called &lt;code&gt;org.eclipse.ui.group1&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="separatorsVisible" type="boolean" use="default" value="true">
-            <annotation>
-               <documentation>
-                  Whether separators should be drawn around the group.  The workbench will take care of deciding whether a separator needs to be drawn at the top or bottom -- accounting for the top and bottom of the menu and duplicate separators.  By default, separators are visible.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="widget">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-         <documentation>
-            A menu or trim element that is given direct access to the widgets.  For example, this can be used to render a combo box.  &lt;b&gt;NOTE:&lt;/b&gt; If a widget element becomes visible in the user interface, this will lead to plug-in loading.  &lt;strong&gt;Use this element with caution, as it can cause performance problems.&lt;/strong&gt;
-            When used as trim the widget will only cause the plug-in to load when it becomes visible in the UI.
-&lt;p&gt;
-&lt;b&gt;NOTE:&lt;/b&gt; This element is deprecated. Clients should contribute a Toolbar to one of the trim areas and place a control contribution inside it. See the Trim Contribution example for details.
-&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="location" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="class" minOccurs="0" maxOccurs="1"/>
-            <element ref="visibleWhen" minOccurs="0" maxOccurs="1"/>
-            <element ref="layout" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A unique identifier for this widget.  It is recommended that the identifier be prefixed by the plug-in name, to guarantee uniqueness.  For example, a widget contributed by &lt;code&gt;org.eclipse.ui&lt;/code&gt; might be called &lt;code&gt;org.eclipse.ui.widget1&lt;/code&gt;.
-&lt;p&gt;
-If defined then it can be  used as a reference in the Query part of the location defining whether the additions are to go before or after this element (or at the end of the logical group containing this element using the &apos;endof&apos; value).
-&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  This class is loaded to fill the appropriate spot in the menu or trim when it shows.  While, strictly speaking, this class must implement &lt;code&gt;IWorkbenchWidget&lt;/code&gt; you should use the default implementation; &lt;code&gt;AbstractWorkbenchTrimWidget&lt;/code&gt; as the base from which to derive your widget implementation. This implementation handles the &apos;init&apos; method and caches the result for use through its &lt;code&gt;getWorkbenchWindow&lt;/code&gt; method.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.menus.IWorkbenchWidget"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="layout">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-         <documentation>
-            This element can be used to specify various layout options for elements added into  &lt;code&gt;trim&lt;/code&gt; locations.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="fillMajor" type="boolean">
-            <annotation>
-               <documentation>
-                  The widget will stretch to use up any additional space available along its &lt;b&gt;major&lt;/b&gt; dimension in the group&apos;s area (i.e. it will use the extra horizontal space for horizontally oriented trim areas). Default is &lt;code&gt;false&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="fillMinor" type="boolean">
-            <annotation>
-               <documentation>
-                  The widget will stretch to use up any additional space available along its &lt;b&gt;minor&lt;/b&gt; dimension in the group&apos;s area (i.e. it will use the extra vertical space for horizontally oriented trim areas). Default is &lt;code&gt;false&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="location">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-         <documentation>
-            A location in which a &lt;code&gt;menu&lt;/code&gt;, &lt;code&gt;group&lt;/code&gt;, &lt;code&gt;item&lt;/code&gt; or &lt;code&gt;widget&lt;/code&gt; can appear.  This element is used to control location-specific information.
-&lt;p&gt;
-This element is deprecated. Users of this extension point should now define the location at which their contributions should appear using the &apos;locationURI&apos; specification.
-&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="order" minOccurs="0" maxOccurs="1"/>
-            <choice>
-               <element ref="bar"/>
-               <element ref="part"/>
-               <element ref="popup"/>
-            </choice>
-         </sequence>
-         <attribute name="mnemonic" type="string">
-            <annotation>
-               <documentation>
-                  The mnemonic that should be associated with this element in the given location.  A mnemonic should be a single character.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true" deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="imageStyle" type="string">
-            <annotation>
-               <documentation>
-                  The image style to associate with this location.  It is possible for commands to have different styles of images associated with them.  For example, a different icon could be selected for the tool bar and for the menu.  This is especially important for developers using drop-down tool items in the tool bar, as they may wish to display an icon more appropriate for the drop-down.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="bar">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-         <documentation>
-            A leaf element within a location.  This can be the menu bar or the trim area.  If unqualified, this indicates the top-level menu bar or trim.  If this is qualified with a &lt;code&gt;part&lt;/code&gt; element, then this indicates that part&apos;s menu or trim.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="type" use="required">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;
-&lt;b&gt;NOTE:&lt;/b&gt; This is not only deprecated but has no value in the current implementation (the only acceptable value is &apos;trim&apos; which is the default. You may safely remove this from any declarations.
-&lt;/p&gt;
-&lt;p&gt;
-What type of bar to contribute to.  This can be &lt;code&gt;menu&lt;/code&gt; or &lt;code&gt;trim&lt;/code&gt;.  If contributing to the menu, then the item will be parented to some widget structure.  In general, this means using widget elements does not make much sense, and an icon for an item&apos;s command is not strictly necessary.  The default value is &lt;code&gt;menu&lt;/code&gt;.
-&lt;/p&gt;
-&lt;p&gt;
-&lt;p&gt;If contributing to the &lt;code&gt;trim&lt;/code&gt;, then the bar will generally not require a command or an icon, it should be filled with a widget that displays the trim information.
-&lt;p&gt;
-Within the trim, the workbench defines five general groups which correspond to various positions around the window:
-&lt;ul&gt;
-&lt;li&gt;&lt;b&gt;command1&lt;/b&gt; - This represents the (horizontal) trim area that the main toolbars are placed into.&lt;/li&gt;
-&lt;li&gt;&lt;b&gt;command2&lt;/b&gt; - This represents the (horizontal) trim area that the Perspective Switcher is in by default.&lt;/li&gt;
-&lt;li&gt;&lt;b&gt;vertical1&lt;/b&gt; - This represents the (vertical) trim area that is on the left side when the text direction is Left-&gt;Right and on the right side for Right-&gt;Left text.&lt;/li&gt;
-&lt;li&gt;&lt;b&gt;vertical2&lt;/b&gt; - This represents the (vertical) trim area that is on the opposite side of the workbench from &lt;code&gt;vertical1&lt;/code&gt;.&lt;/li&gt;
-&lt;li&gt;&lt;b&gt;status&lt;/b&gt; - This represents the (horizontal) trim area along the bottom edge of the workbench.&lt;/li&gt;
-&lt;/ul&gt;
-By positioning the trim contribution within or with respect to these groups, the position is inferred by the workbench.
-&lt;/p&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="menu">
-                  </enumeration>
-                  <enumeration value="trim">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="path" type="string">
-            <annotation>
-               <documentation>
-                  This represents the id of a group that the widget is to be placed into.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="class">
-      <annotation>
-         <documentation>
-            A class element supporting the executable extension parsing syntax for both &lt;code&gt;widget&lt;/code&gt; and &lt;code&gt;dynamic&lt;/code&gt; elements.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class to load as an &lt;code&gt;IExecutableExtension&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="visibleWhen">
-      <annotation>
-         <documentation>
-            A core Expression that controls the visibility of the given element.
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice minOccurs="0" maxOccurs="1">
-            <element ref="not"/>
-            <element ref="or"/>
-            <element ref="and"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-            <element ref="reference"/>
-         </choice>
-         <attribute name="checkEnabled" type="boolean" use="default" value="false">
-            <annotation>
-               <documentation>
-                  If this attribute is set to &lt;code&gt;true&lt;/code&gt;, then there should be no sub-elements.  This just checks the enabled state of the command, and makes the corresponding element visible if the command is enabled.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="part">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-         <documentation>
-            &lt;p&gt;
-An element within a location.  This qualifies the location to refer to a particular workbench part.  This can be either a view or an editor.  The qualification can use either the class name of the part (including inheritance), or it can refer to the identifier for the view or editor.
-&lt;/p&gt;
-&lt;p&gt;
-Only one of &lt;code&gt;id&lt;/code&gt; and &lt;code&gt;class&lt;/code&gt; can be specified.
-&lt;/p&gt;
-&lt;p&gt;
-&lt;b&gt;NOTE:&lt;/b&gt; This element is deprecated. It had been used for a previous technique for adding trim elements. Instead, clients should contribute a Toolbar to one of the trim areas and place a control contribution inside it. See the Trim Contribution example for details.
-&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice>
-            <element ref="popup"/>
-            <element ref="bar"/>
-         </choice>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  The identifier of the view or editor.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  The class of the part.  This can be a superclass, interface or superinterface of the part, and it will still match.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="parameter">
-      <annotation>
-         <documentation>
-            A parameter to either an executable extension or a command -- depending on where it appears in the extension.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name is either the name of the parameter to pass to the executable extension, or the identifier of the parameter for the command.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.commands/command/commandParameter/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The value to pass for this parameter.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="order">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-         <documentation>
-            &lt;b&gt;NOTE:&lt;/b&gt; This element is deprecated in favor of using the &apos;locationURI&apos; to specify the location at which contributions should be placed.
-&lt;p&gt;
-Controls the position of a  widget within a particular group.
-&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="position" use="required">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;
-This attribute accepts the following values: &lt;code&gt;start&lt;/code&gt; (put the element at the beginning of the container); &lt;code&gt;end&lt;/code&gt; (put the element at the end of its container); &lt;code&gt;after&lt;/code&gt; (put the element after the sibling element whose id matches &lt;code&gt;ref&lt;/code&gt;); and, &lt;code&gt;before&lt;/code&gt; (put the element before the sibling element whose id matches &lt;code&gt;ref&lt;/code&gt;).  Relative ordering can be applied to any type of menu element.
-&lt;/p&gt;
-&lt;p&gt;
-In the event of conflicts, Eclipse will chose an arbitrary order.  The only guarantee is that, in the event of a conflict, the order will remain the same as long as the following holds:
-&lt;/p&gt;
-&lt;ul&gt;
-&lt;li&gt;The Eclipse version is the same.&lt;/li&gt;
-&lt;li&gt;The list of elements is the same (i.e., no dynamic elements, no plug-ins added or removed).&lt;/li&gt;
-&lt;/ul&gt;
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="start">
-                  </enumeration>
-                  <enumeration value="end">
-                  </enumeration>
-                  <enumeration value="before">
-                  </enumeration>
-                  <enumeration value="after">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="relativeTo" type="string">
-            <annotation>
-               <documentation>
-                  The identifier of the element to which this position is relative.  This value is required if the &lt;code&gt;position&lt;/code&gt; is &lt;code&gt;before&lt;/code&gt; or &lt;code&gt;after&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="popup">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-         <documentation>
-            Part of a location.  It indicates that the menu, group, item or widget should appear in the popup menu.
-&lt;p&gt;
-&lt;p&gt;
-&lt;b&gt;NOTE:&lt;/b&gt; This element is deprecated. It had been used for a previous technique for adding trim elements. Instead, clients should contribute a Toolbar to one of the trim areas and place a control contribution inside it. See the Trim Contribution example for details.
-&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  The identifier of the popup menu.  If none is specified, then it will appear in all popup menus.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="path" type="string">
-            <annotation>
-               <documentation>
-                  The path within the popup menu to place the element.  If not specified, then this is added to the &quot;additions&quot; group.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="menuContribution">
-      <annotation>
-         <documentation>
-            &lt;p&gt;Defines an ordered set of additions to the command UI structure. The defined elements will be added into the command UI structure at the location specified by the &lt;code&gt;locationURI&lt;/code&gt; element.
-&lt;/p&gt;&lt;p&gt;
-This should be the starting point for &lt;i&gt;all&lt;/i&gt; contributions into menus, toolbars or trim, wherever they occur in the UI.
-&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="menu" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="command" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="separator" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="dynamic" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="toolbar" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="control" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="locationURI" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A &lt;code&gt;URI&lt;/code&gt; specification that defines the insertion point at which the contained additions will be added.
-
-The format for the URI is comprised of three basic parts:
-
-Scheme: One of &quot;menu&quot;, &quot;popup&quot; or &quot;toolbar. Indicates the type of the manager used to handle the contributions
-Id: This is either the id of an existing menu, a view id or the id of the editor &apos;type&apos;
-Query: The query format is &amp;lt;placement&amp;gt;=&amp;lt;id&amp;gt; where:
- &amp;lt;placement&amp;gt; is either &quot;before&quot; or &quot;after&quot; and
- &amp;lt;id&amp;gt; is the id of an existing menu item
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="menu">
-      <annotation>
-         <documentation>
-            Defines a new menu contribution at the given insertion point.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="1">
-            <element ref="visibleWhen" minOccurs="0" maxOccurs="1"/>
-            <choice minOccurs="0" maxOccurs="unbounded">
-               <element ref="menu" minOccurs="0" maxOccurs="1"/>
-               <element ref="command" minOccurs="0" maxOccurs="1"/>
-               <element ref="separator" minOccurs="0" maxOccurs="1"/>
-               <element ref="dynamic" minOccurs="0" maxOccurs="1"/>
-            </choice>
-         </sequence>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The label to be displayed for this element when it is placed in either a menu or a toolbar. This value should be translatable.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  The &apos;id&apos; of this menu contribution. If defined then it can be extended through other &apos;menuAddition&apos; elements or the id can be used as a reference in the Query part of the location defining whether the additions are to go before or after this element.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="mnemonic" type="string">
-            <annotation>
-               <documentation>
-                  The character of the Label that should be given the mnemonic affordance. This is to allow the menu system to re-define the value during translation without having to understand the various platforms&apos; conventions for menu label definition (i.e. using the &apos;&amp;amp;&apos; character...).
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  A plugin relative path to the image to be used as the icon for this menu in either a menu or a toolbar.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="tooltip" type="string">
-            <annotation>
-               <documentation>
-                  The tooltip to be displayed for this element when it is placed in a toolbar. This value should be translatable.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="commandId" type="string">
-            <annotation>
-               <documentation>
-                  Th commandId is used to update the submenu text with a keyboard shortcut.  The command should have a handler that can launch a quickmenu version of this menu.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.commands/command/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="command">
-      <annotation>
-         <documentation>
-            Defines a new Command Contribution at the defined insertion point.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="visibleWhen" minOccurs="0" maxOccurs="1"/>
-            <element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="label" type="string">
-            <annotation>
-               <documentation>
-                  The label to be displayed for this element when it is placed in either a menu. This value should be translatable.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="commandId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  This is the id of the Command that is to be bound to this element. This is the hook into the Commands/Handlers/Key binding services that actually do the work should this item be selected. In many cases this command will have been defined in a previous extension declaration.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.commands/command/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  The &apos;id&apos; of this contribution. If defined then it can be  used as a reference in the Query part of the location defining whether the additions are to go before or after this element.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="mnemonic" type="string">
-            <annotation>
-               <documentation>
-                  The character of the Label that should be given the mnemonic affordance. This is to allow the menu system to re-define the value during translation without having to understand the various platforms&apos; conventions for menu label definition (i.e. using the &apos;&amp;amp;&apos; character...).
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon used to visually represent the action in its context.
-If omitted and the action appears in the toolbar, the Workbench will use a placeholder icon. The path is relative to the location of the plugin.xml file of the contributing plug-in.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="disabledIcon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon used to visually represent the action in its context when the action is disabled. If omitted, the normal icon will simply appear greyed out. The path is relative to the location of the plugin.xml file of the contributing plug-in. The disabled icon will appear in toolbars but not in menus. Icons for disabled actions in menus will be supplied by the OS.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="hoverIcon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon used to visually represent the action in its context when the mouse pointer is over the action. If omitted, the normal icon will be used. The path is relative to the location of the plugin.xml file of the contributing plug-in.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="tooltip" type="string">
-            <annotation>
-               <documentation>
-                  The tooltip to be displayed for this element when it is placed in a toolbar. This value should be translatable.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="helpContextId" type="string">
-            <annotation>
-               <documentation>
-                  a unique identifier indicating the help context for this action. If the action appears as a menu item, then pressing F1 while the menu item is highlighted will display help.  This overrides the help context id provided by the active handler or command.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="style" use="default" value="push">
-            <annotation>
-               <documentation>
-                  an attribute to define the user interface style type for the action. If omitted, then it is &lt;samp&gt;push&lt;/samp&gt; by default. The attribute value will be one of the following:
-    &lt;table border=&quot;0&quot; width=&quot;80%&quot;&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;push&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a regular menu item or tool item.&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;radio&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a radio style menu item or tool item. Actions with the radio style within the same menu or toolbar group behave as a radio set. The initial value is specified by the &lt;samp&gt;state&lt;/samp&gt; attribute.&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;toggle&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a checked style menu item or as a toggle tool item. The initial value is specified by the &lt;samp&gt;state&lt;/samp&gt; attribute.&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;pulldown&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- (ToolBar only) Creates a ToolItem with the &lt;code&gt;SWT.DROP_DOWN&lt;/code&gt; affordance. The URI of the menu is &quot;menu:&quot; + this item&apos;s ID.&lt;/td&gt;
-      &lt;/tr&gt;
-    &lt;/table&gt;
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="push">
-                  </enumeration>
-                  <enumeration value="radio">
-                  </enumeration>
-                  <enumeration value="toggle">
-                  </enumeration>
-                  <enumeration value="pulldown">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="mode">
-            <annotation>
-               <documentation>
-                  For commands appearing in a toolbar, &lt;code&gt;FORCE_TEXT&lt;/code&gt; will show text even if there is an icon.  See CommandContributionItem.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="FORCE_TEXT">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="separator">
-      <annotation>
-         <documentation>
-            Inserts a separator at the current insertion point.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The &apos;id&apos; of this contribution. If defined then it can be  used as a reference in the Query part of the location defining whether the additions are to go before or after this element (or at the end of the logical group containing this element using the &apos;endof&apos; value).
-&lt;p&gt;
-Separator contributions that have an id define the start of a logical group so the result of using the &apos;endof&apos; value for placement is to search forward in the current menu to locate the next id&apos;d separator and to place the inserted elements before that element. If no trailing separator is found then the items are placed at the end of the menu.
-&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="visible" type="boolean">
-            <annotation>
-               <documentation>
-                  Indicates whether or not the separator should be visible in the UI. &lt;code&gt;false&lt;/code&gt; by default.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="toolbar">
-      <annotation>
-         <documentation>
-            Contributes a new ToolBar at the current insertion point.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="1">
-            <element ref="visibleWhen" minOccurs="0" maxOccurs="1"/>
-            <choice minOccurs="0" maxOccurs="unbounded">
-               <element ref="command" minOccurs="0" maxOccurs="1"/>
-               <element ref="separator" minOccurs="0" maxOccurs="1"/>
-               <element ref="dynamic" minOccurs="0" maxOccurs="1"/>
-               <element ref="control" minOccurs="0" maxOccurs="1"/>
-            </choice>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The &apos;id&apos; of this toolbar contribution. If defined then it can be extended through other &apos;menuAddition&apos; elements or the id can be used as a reference in the Query part of the location defining whether the additions are to go before or after this element.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="control">
-      <annotation>
-         <documentation>
-            Used to contribute controls to ToolBars in the workbench. The &apos;class&apos; attribute must be a derivative of the
-WorkbenchWindowControlContribution base class.
-&lt;p&gt;
-&lt;b&gt;NOTE:&lt;/b&gt; Due to platform restrictions control contributions are only supported for toolbars; Attempts to contribute controls into a menu or popup will be treated as a NO-OP.
-&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="visibleWhen" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  The &apos;id&apos; of this menu contribution. If defined then it can be used as a reference in the Query part of the location defining whether the additions are to go before or after this element.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class which will be used to create the control that is to be hosted in a ToolBar. This must be a subclass of
-WorkbenchWindowControlContribution which provides information as to the control&apos;s location (i.e. which workbench window it&apos;s being hosted in and the side of the window that it is currently being displayed on.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.menus.WorkbenchWindowControlContribution"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="dynamic">
-      <annotation>
-         <documentation>
-            The element provides a mechanism that will call back into the defined class to provide an IContributionItem to be shown when the menu or toolbar is built. The defined class must be a derivative of the org.eclipse.jface.action.ContributionItem base class.  It can also use org.eclipse.ui.action.CompoundContributionItem and provide an implementation for the abstract &lt;code&gt;getContributionItems&lt;/code&gt; method to provide a dynamic menu item.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="class" minOccurs="0" maxOccurs="1"/>
-            <element ref="visibleWhen" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A unique identifier for this contribution.  It is recommended that the identifier be prefixed by the plug-in name, to guarantee uniqueness.  For example, a widget contributed by &lt;code&gt;org.eclipse.ui&lt;/code&gt; might be called &lt;code&gt;org.eclipse.ui.widget1&lt;/code&gt;.
-&lt;p&gt;
-If defined then it can be  used as a reference in the Query part of the location defining whether the additions are to go before or after this element (or at the end of the logical group containing this element using the &apos;endof&apos; value).
-&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  This class is expected to be a subclass of ContributionItem. The item may implement IWorkbenchContribution to be provided an IServiceLocator.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jface.action.ContributionItem"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.3
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-A basic extension looks like this.
-&lt;/p&gt;
-&lt;pre&gt;
-   &lt;extension
-         id=&quot;add.item&quot;
-         point=&quot;org.eclipse.ui.menus&quot;&gt;
-      &lt;menuContribution
-         locationURI=&quot;menu:someorg.somemenu.id?after=additions&quot;&gt;
-         &lt;command
-               commandId=&quot;someorg.someid.someCommand&quot;
-               icon=&quot;icons/anything.gif&quot;
-               id=&quot;someorg.someid.BasicCmdItem&quot;
-               label=&quot;Simple Item&quot;
-               mnemonic=&quot;S&quot;&gt;
-         &lt;/command&gt;
-      &lt;/menuContribution&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;p&gt;
-This is the simplest example; adding a command contribution after an existing menu&apos;s additions group.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-It is preferred that menu contributions be added in the &lt;code&gt;plugin.xml&lt;/code&gt;.  Plugins can
-programmatically add their own menu contributions using &lt;code&gt;org.eclipse.ui.menus.IMenuService&lt;/code&gt; and &lt;code&gt;org.eclipse.ui.menus.AbstractContributionFactory&lt;/code&gt;, but should be sure to remove them if the plugin is unloaded.  The &lt;code&gt;IMenuService&lt;/code&gt; can be retrieved through any of the &lt;code&gt;IServiceLocators&lt;/code&gt;, the workbench, the workbench window, or the part site.
-&lt;/p&gt;
-&lt;p&gt;
-See &lt;a href=&quot;org_eclipse_ui_commands.html&quot;&gt;org.eclipse.ui.commands&lt;/a&gt; to define a command and &lt;a href=&quot;org_eclipse_ui_handlers.html&quot;&gt;org.eclipse.ui.handlers&lt;/a&gt; to define an implementation for the command.
-&lt;/p&gt;
-&lt;p&gt;To register a context menu, use the &lt;code&gt;IWorkbenchPartSite.registerContextMenu&lt;/code&gt; methods.&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2005,2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/newWizards.exsd b/bundles/org.eclipse.ui/schema/newWizards.exsd
deleted file mode 100644
index 1344b4b..0000000
--- a/bundles/org.eclipse.ui/schema/newWizards.exsd
+++ /dev/null
@@ -1,341 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="newWizards" name="Creation Wizards"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to register resource creation wizard extensions. Creation wizards appear as choices within the &quot;New Dialog&quot;, and are typically used to create folders and files. 
-&lt;p&gt;
-In the &quot;New Dialog&quot;, wizards are organized into categories which usually reflect a particular problem domain.  For instance, a Java oriented plugin may define a category called &quot;Java&quot; which is appropriate for &quot;Class&quot; or &quot;Package&quot; creation wizards.  The categories defined by one plug-in can be referenced by other plug-ins using the category attribute. Uncategorized wizards, as well as wizards with invalid category paths, will end up in an &quot;Other&quot; category. 
-&lt;/p&gt;
-
-&lt;p&gt;
-Wizards may optionally specify a description subelement whose body should contain short text about the wizard.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <choice minOccurs="0" maxOccurs="unbounded">
-            <element ref="category"/>
-            <element ref="wizard"/>
-            <element ref="primaryWizard"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="category">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that can be used to identify this category
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name of the category that will be used in the dialog box
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="parentCategory" type="string">
-            <annotation>
-               <documentation>
-                  a path to another category if this category should be added as a child
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.newWizards/category/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizard">
-      <complexType>
-         <sequence>
-            <element ref="description" minOccurs="0" maxOccurs="1"/>
-            <element ref="selection" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that can be used to identify this wizard
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name of the wizard that will be used in the dialog box
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon that will be used together with the name to represent the wizard 
-as one of the choices in the creation dialog box.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="category" type="string">
-            <annotation>
-               <documentation>
-                  a slash-delimited path (&apos;/&apos;) of category IDs. Each token in the
-path must represent a valid category ID previously defined
-by this or some other plug-in. If omitted, the wizard will be
-added to the &quot;Other&quot; category.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified name of the Java class implementing &lt;samp&gt;org.eclipse.ui.INewWizard&lt;/samp&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jface.wizard.Wizard:org.eclipse.ui.INewWizard"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="project" type="boolean">
-            <annotation>
-               <documentation>
-                  an optional attribute indicating the wizard will create an IProject resource.
-Also causes the wizard to appear as a choice within the &quot;New Project Dialog&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="finalPerspective" type="string">
-            <annotation>
-               <documentation>
-                  an optional attribute which identifies a perspective to activate when IProject resource creation is finished.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.perspectives/perspective/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="preferredPerspectives" type="string">
-            <annotation>
-               <documentation>
-                  an optional attribute specifying a comma-separated list of perspective IDs.  If the current perspective is in this list, then no perspective activation occurs when IProject resource creation is finished.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="helpHref" type="string">
-            <annotation>
-               <documentation>
-                  a help url that can describe this wizard in detail.
-&lt;p&gt;
-Since 3.0
-&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="descriptionImage" type="string">
-            <annotation>
-               <documentation>
-                  a larger image that can help describe this wizard.
-&lt;p&gt;
-Since 3.0
-&lt;/p&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="canFinishEarly" type="boolean">
-            <annotation>
-               <documentation>
-                  whether the wizard is capable of finishing without ever showing pages to the user.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="hasPages" type="boolean">
-            <annotation>
-               <documentation>
-                  whether the wizard provides any pages.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="description" type="string">
-      <annotation>
-         <appinfo>
-            <meta.element translatable="true"/>
-         </appinfo>
-         <documentation>
-            an optional subelement whose body contains a short text describing what the wizard will do when started
-         </documentation>
-      </annotation>
-   </element>
-
-   <element name="selection">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified class name.  If each object in the workbench selection implements this interface the selection will be passed to the wizard.  Otherwise, an empty selection is passed
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name filter.  Each object in the workbench selection must match the name filter to be passed to the wizard
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="primaryWizard">
-      <annotation>
-         <documentation>
-            a means of declaring that a wizard is &quot;primary&quot; in the UI.  A primary wizard is emphasized in the new wizard dialog.  Please note that this element is not intended to be used by plug in developers!  This element exists so that product managers may emphasize a set of wizards for their products.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the id of a wizard that should be made primary.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.newWizards/wizard/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         Following is an example of creation wizard configuration: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.newWizards&quot;&gt; 
-      &lt;category 
-        id=&quot;com.xyz.XYZ&quot; 
-        name=&quot;XYZ Wizards&quot;&gt; 
-      &lt;/category&gt; 
-      &lt;category 
-        id=&quot;com.xyz.XYZ.Web&quot; 
-        name=&quot;Web Wizards&quot; 
-        parentCategory=&quot;com.xyz.XYZ&quot;&gt; 
-      &lt;/category&gt; 
-      &lt;wizard 
-          id=&quot;com.xyz.wizard1&quot; 
-          name=&quot;XYZ artifact&quot; 
-          category=&quot;com.xyz.XYZ/com.xyz.XYZ.Web&quot; 
-          icon=&quot;./icons/XYZwizard1.gif&quot; 
-          class=&quot;com.xyz.XYZWizard1&quot;&gt; 
-          &lt;description&gt; 
-              Create a simple XYZ artifact and set initial content 
-          &lt;/description&gt; 
-           &lt;selection class=&quot;org.eclipse.core.resources.IResource&quot;/&gt;          
-      &lt;/wizard&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The value of the class attribute must represent a class 
-that implements &lt;samp&gt;org.eclipse.ui.INewWizard&lt;/samp&gt;. 
-If the wizard is created from within the 
-New Wizard it will be inserted into the existing wizard.  
-If the wizard is launched as a shortcut 
-(from the File New menu or a toolbar button) it will 
-appear standalone as a separate dialog box.
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         The workbench comes with wizards for creating empty 
-resources of the following types: 
-project, folder and file. These wizards are registered 
-using the same mechanism as described above. 
-Additional wizards may also appear, subject to 
-particular platform installation.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/perspectiveExtensions.exsd b/bundles/org.eclipse.ui/schema/perspectiveExtensions.exsd
deleted file mode 100644
index 112ceef..0000000
--- a/bundles/org.eclipse.ui/schema/perspectiveExtensions.exsd
+++ /dev/null
@@ -1,339 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="perspectiveExtensions" name="Perspective Extensions"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to extend perspectives 
-registered by other plug-ins. A perspective defines 
-the initial contents of the window action bars 
-(menu and toolbar) and the initial set of views 
-and their layout within a workbench page.  
-Other plug-ins may contribute actions or views to 
-the perspective which appear when the perspective 
-is selected.  Optional additions by other plug-ins 
-are appended to the initial definition.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="perspectiveExtension" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="perspectiveExtension">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="targetID"/>
-         </appinfo>
-      </annotation>
-      <complexType>
-         <choice minOccurs="0" maxOccurs="unbounded">
-            <element ref="actionSet"/>
-            <element ref="viewShortcut"/>
-            <element ref="perspectiveShortcut"/>
-            <element ref="newWizardShortcut"/>
-            <element ref="view"/>
-            <element ref="showInPart"/>
-         </choice>
-         <attribute name="targetID" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of the perspective (as specified in the registry) into which the contribution is made. If the value is set to &quot;*&quot; the extension is applied to all perspectives.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.perspectives/perspective/@id"/>
-               </appinfo>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="*">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="actionSet">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of the action set which will be added to the perspective.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.actionSets/actionSet/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="viewShortcut">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of the view which will be added to the perspective&apos;s &quot;Show View&quot; submenu of the &quot;Window&quot; menu.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.views/view/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="perspectiveShortcut">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of the perspective which will be added to the perspective&apos;s &quot;Open Perspective&quot; submenu of the &quot;Window&quot; menu.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.perspectives/perspective/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="newWizardShortcut">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of the new wizard which will be added to the perspective&apos;s &quot;New&quot; submenu of the &quot;File&quot; menu.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.newWizards/wizard/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="showInPart">
-      <complexType>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  the unique identifier of the view which will be added to the perspective&apos;s &quot;Show In...&quot; prompter in the Navigate menu.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.views/view/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="view">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of the view which will be added to the perspective layout.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.views/view/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="relative" type="string">
-            <annotation>
-               <documentation>
-                  the unique identifier of a view which already exists in the perspective.  This will be used as a reference point for placement of the view.  The relationship between these two views is defined by &lt;samp&gt;relationship&lt;/samp&gt;.  Ignored if relationship is &quot;fast&quot;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.views/view/@id"/>
-               </appinfo>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="org.eclipse.ui.editorss">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="relationship" use="required">
-            <annotation>
-               <documentation>
-                  specifies the relationship between &lt;samp&gt;id&lt;/samp&gt; and
-&lt;samp&gt;relative&lt;/samp&gt;. 
-The following values are supported:
-&lt;ul&gt;
-&lt;b&gt;fast&lt;/b&gt; - the view extension will be created as a fast view.
-&lt;br&gt;&lt;b&gt;stack&lt;/b&gt; - the view extension will be stacked with the relative
-view in a folder.
-&lt;br&gt;&lt;b&gt;left, right, top, bottom&lt;/b&gt; - the view extension will be placed
-beside the relative view. In this case a &lt;samp&gt;ratio&lt;/samp&gt; must also
-be defined.&lt;/ul&gt;
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="stack">
-                  </enumeration>
-                  <enumeration value="left">
-                  </enumeration>
-                  <enumeration value="right">
-                  </enumeration>
-                  <enumeration value="top">
-                  </enumeration>
-                  <enumeration value="bottom">
-                  </enumeration>
-                  <enumeration value="fast">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="ratio" type="string">
-            <annotation>
-               <documentation>
-                  the percentage of area within the relative view which will be donated to the view extension. If the view extension is a fast view, the ratio is the percentage of the workbench the fast view will cover when active. This must be defined as a floating point value and lie between 0.05 and 0.95.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="visible" type="boolean">
-            <annotation>
-               <documentation>
-                  whether the view is initially visible when the perspective is opened.  This attribute should have a value of &quot;true&quot; or &quot;false&quot; if used.
-If this attribute is not used, the view will be initially visible by default.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="closeable" type="boolean">
-            <annotation>
-               <documentation>
-                  whether the view is closeable in the target perspective. This attribute should have a value of &quot;true&quot; or &quot;false&quot; if used.  If this attribute is not used, the view will be closeable, unless the perspective itself is marked as fixed.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="moveable" type="boolean">
-            <annotation>
-               <documentation>
-                  whether the view is moveable.  A non-moveable view cannot be moved either within the same folder, or moved between folders in the perspective.  This attribute should have a value of &quot;true&quot; or &quot;false&quot; if used.
-If this attribute is not used, the view will be moveable, unless the perspective itself is marked as fixed.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="standalone" type="boolean">
-            <annotation>
-               <documentation>
-                  whether the view is a standalone view.  A standalone view cannot be docked together with others in the same folder.  This attribute should have a value of &quot;true&quot; or &quot;false&quot; if used.  This attribute is ignored if the relationship attribute is &quot;fast&quot; or &quot;stacked&quot;.  If this attribute is not used, the view will be a regular view, not a standalone view (default is &quot;false&quot;).
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="showTitle" type="boolean">
-            <annotation>
-               <documentation>
-                  whether the view&apos;s title is shown.  This attribute should have a value of &quot;true&quot; or &quot;false&quot; if used.  This attribute only applies to standalone views.  If this attribute is not used, the view&apos;s title will be shown (default is &quot;true&quot;).
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="minimized" type="boolean" use="default" value="false">
-            <annotation>
-               <documentation>
-                  If the perspective extension will result in a new view stack being created (i.e. the &apos;relationship&apos; attribute is one of left, right, top or bottom) this field determines the new stack&apos;s initial display state.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of a perspective extension (note the subelements and the way attributes are used):
-&lt;p&gt;
-&lt;pre&gt;
-    &lt;extension point=&quot;org.eclipse.ui.perspectiveExtensions&quot;&gt; 
-        &lt;perspectiveExtension 
-            targetID=&quot;org.eclipse.ui.resourcePerspective&quot;&gt; 
-            &lt;actionSet id=&quot;org.eclipse.jdt.ui.JavaActionSet&quot;/&gt; 
-            &lt;viewShortcut id=&quot;org.eclipse.jdt.ui.PackageExplorer&quot;/&gt; 
-            &lt;newWizardShortcut id=&quot;org.eclipse.jdt.ui.wizards.NewProjectCreationWizard&quot;/&gt; 
-            &lt;perspectiveShortcut id=&quot;org.eclipse.jdt.ui.JavaPerspective&quot;/&gt; 
-            &lt;view id=&quot;org.eclipse.jdt.ui.PackageExplorer&quot; 
-                relative=&quot;org.eclipse.ui.views.ResourceNavigator&quot; 
-                relationship=&quot;stack&quot;/&gt; 
-            &lt;view id=&quot;org.eclipse.jdt.ui.TypeHierarchy&quot; 
-                relative=&quot;org.eclipse.ui.views.ResourceNavigator&quot; 
-                relationship=&quot;left&quot; 
-                ratio=&quot;0.50&quot;/&gt; 
-        &lt;/perspectiveExtension&gt; 
-    &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-In the example above, an action set, view shortcut, 
-new wizard shortcut, and perspective shortcut are 
-contributed to the initial contents of the 
-Resource Perspective.  In addition, the 
-Package Explorer view is stacked on the 
-Resource Navigator and the Type Hierarchy View is 
-added beside the Resource Navigator. 
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The items defined within the perspective extension are contributed to the initial contents of the target perspective.  Following this, the user may remove any contribution or add others to a perspective from within the workbench user interface.
-      </documentation>
-   </annotation>
-
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/perspectives.exsd b/bundles/org.eclipse.ui/schema/perspectives.exsd
deleted file mode 100644
index acbd91c..0000000
--- a/bundles/org.eclipse.ui/schema/perspectives.exsd
+++ /dev/null
@@ -1,180 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="perspective" name="Perspectives"/>
-      </appInfo>
-      <documentation>
-         This extension point is used to add perspective factories to the workbench.  A perspective factory is used to define the initial layout and visible action sets for a perspective.  The user can select a perspective by invoking the &quot;Open Perspective&quot; submenu of the &quot;Window&quot; menu.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="perspective" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="perspective">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="name" icon="icon"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="description" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this perspective.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name that will be used in the workbench window menu bar to represent this perspective.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified name of the class that implements 
-&lt;samp&gt;org.eclipse.ui.IPerspectiveFactory&lt;/samp&gt; interface.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.IPerspectiveFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a relative name of the icon that will be associated 
-with this perspective.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="fixed" type="boolean">
-            <annotation>
-               <documentation>
-                  indicates whether the layout of the perspective is fixed.  If true, then views created by the perspective factory are not closeable, and cannot be moved.  The default is false.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="description" type="string">
-      <annotation>
-         <appInfo>
-            <meta.element translatable="true"/>
-         </appInfo>
-         <documentation>
-            an optional subelement whose body should contain text providing a short description of the perspective.
-         </documentation>
-      </annotation>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a perspective extension: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension 
-        point=&quot;org.eclipse.ui.perspectives&quot;&gt; 
-        &lt;perspective 
-            id=&quot;org.eclipse.ui.resourcePerspective&quot; 
-            name=&quot;Resource&quot; 
-            class=&quot;org.eclipse.ui.internal.ResourcePerspective&quot; 
-            icon=&quot;icons/MyIcon.gif&quot;&gt; 
-        &lt;/perspective&gt; 
-    &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The value of the &lt;samp&gt;class&lt;/samp&gt; attribute must be the 
-fully qualified name of a class that implements 
-&lt;samp&gt;org.eclipse.ui.IPerspectiveFactory&lt;/samp&gt;. 
-The class must supply the initial layout for a 
-perspective when asked by the workbench.
-&lt;p&gt;
-The &lt;samp&gt;plugin_customization.ini&lt;/samp&gt; file is used to define the default perspective.  The &lt;i&gt;default perspective&lt;/i&gt; is the first perspective which appears when the product is launched after install.  It is also used when the user opens a page or window with no specified perspective.  The default perspective is defined as a property within the plugin_customization.ini, as shown below.  The user may also override this perspective from the workbench perspectives preference page. 
-&lt;pre&gt;
-    defaultPerspectiveId = org.eclipse.ui.resourcePerspective 
-&lt;/pre&gt;
-The perspectives which appear in the &quot;Open Perspective&quot; menu are shortcuts for perspective selection.  This set is defined by the active perspective itself, and extensions made through the perspectiveExtensions extension point.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The workbench provides a &quot;Resource Perspective&quot;.  
-Additional perspectives may be added by plug-ins. 
-They are selected using the &quot;Open Perspective&quot; submenu of the &quot;Window&quot; menu.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2002, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/popupMenus.exsd b/bundles/org.eclipse.ui/schema/popupMenus.exsd
deleted file mode 100644
index 004ffc79..0000000
--- a/bundles/org.eclipse.ui/schema/popupMenus.exsd
+++ /dev/null
@@ -1,637 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="popupMenus" name="Pop-up Menus"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to add new actions to context menus owned by other plug-ins.  Action contributions may be made against a specific object type (&lt;samp&gt;objectContribution&lt;/samp&gt;) or against a specific context menu of a view or editor part (&lt;samp&gt;viewerContribution&lt;/samp&gt;). When using &lt;samp&gt;objectContribution&lt;/samp&gt;, the contribution will appear in all view or editor part context menus where objects of the specified type are selected. In contrast, using &lt;samp&gt;viewerContribution&lt;/samp&gt;, the contribution will only appear in the specified view or editor part context menu, regardless of the selection.
-&lt;p&gt;
-You can now use &lt;a href=&quot;org_eclipse_ui_menus.html&quot;&gt;org.eclipse.ui.menus&lt;/a&gt; to place commands editor or view contexts menus as well.
-&lt;/p&gt;
-&lt;p&gt;
-When the selection is heterogeneous, the contribution will be applied if registered against a common type of the selection, if possible. If a direct match is not possible, matching against superclasses and superinterfaces will be attempted. 
-&lt;p&gt;
-Selection can be further constrained through the use of a name filter. If used, all the objects in the selection must match the filter in order to apply the contribution. 
-&lt;p&gt;
-Individual actions in an object contribution can use the attribute &lt;code&gt;enablesFor&lt;/code&gt; to specify if it should only apply for a single, multiple, or any other selection type. 
-&lt;p&gt;
-If these filtering mechanisms are inadequate an action contribution may use the &lt;samp&gt;filter&lt;/samp&gt; mechanism.  In this case the attributes of the target object are described in a series of name-value pairs.  The attributes which apply to the selection are type-specific and beyond the domain of the workbench itself, so the workbench will delegate filtering at this level to the actual selection.
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="commonAction.exsd"/>
-
-   <include schemaLocation="commonExpression.exsd"/>
-
-   <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="objectContribution" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="viewerContribution" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="objectContribution">
-      <annotation>
-         <documentation>
-            This element is used to define a group of actions and/or menus for any viewer context menus for which the objects of the specified type are selected.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="filter" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="visibility" minOccurs="0" maxOccurs="1"/>
-            <element ref="enablement" minOccurs="0" maxOccurs="1"/>
-            <element ref="menu" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="action" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier used to reference this contribution
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="objectClass" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified name of the class or interface that all objects in the 
-selection must subclass or implement.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="java.lang.object"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="nameFilter" type="string">
-            <annotation>
-               <documentation>
-                  an optional wild card filter for the name that can be applied to all objects in the selection. No contribution will take place if there is no match.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="adaptable" type="boolean" use="default" value="false">
-            <annotation>
-               <documentation>
-                  a flag that indicates if types that adapt to IResource should use this object contribution. This flag is used only if objectClass adapts to IResource.  Default value is false.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="viewerContribution">
-      <annotation>
-         <documentation>
-            This element is used to define a group of actions and/or menus for a specific view or editor part context menu.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="visibility" minOccurs="0" maxOccurs="1"/>
-            <element ref="menu" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="action" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier used to reference this contribution
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="targetID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the unique identifier of a context menu inside a view or editor part.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="action">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="label" icon="icon"/>
-         </appinfo>
-         <documentation>
-            This element defines an action that the user can invoke in the UI.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="selection" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="enablement" minOccurs="0" maxOccurs="1"/>
-            <element ref="class" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier used as a reference for this action.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name used as the menu item text. The name can include mnenomic information.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="definitionId" type="string">
-            <annotation>
-               <documentation>
-                  This specifies the command that this action is handling.  This is used to decide which key binding to display in the pop-up menu.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.commands/command/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="menubarPath" type="string">
-            <annotation>
-               <documentation>
-                  a slash-delimited path (&apos;/&apos;) used to specify the location of this action in the context menu. Each token in the path, except the last one, must represent a valid identifier of an existing menu in the hierarchy. The last token represents the named group into which this action will be added. If the path is omitted, this action will be added to the standard additions group defined by &lt;samp&gt;IWorkbenchActionConstants.MB_ADDITIONS&lt;/samp&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon used to visually represent the action in its context.
-The path is relative to the location of the plugin.xml file of the contributing plug-in.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="helpContextId" type="string">
-            <annotation>
-               <documentation>
-                  a unique identifier indicating the help context for this action. On some platforms, if the action appears as a menu item, then pressing the appropriate help key while the menu item is highlighted will display help. Not all platforms support this behaviour.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="style">
-            <annotation>
-               <documentation>
-                  an optional attribute to define the user interface style type for the action. If defined, the attribute value will be one of the following:
-    &lt;table border=&quot;0&quot; width=&quot;80%&quot;&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;push&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a regular menu item or tool item.&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;radio&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a radio style menu item or tool item. Actions with the radio style within the same menu or toolbar group behave as a radio set. The initial value is specified by the &lt;samp&gt;state&lt;/samp&gt; attribute.&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;toggle&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a checked style menu item or as a toggle tool item. The initial value is specified by the &lt;samp&gt;state&lt;/samp&gt; attribute.&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;pulldown&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a cascading style menu item.&lt;/td&gt;
-      &lt;/tr&gt;
-    &lt;/table&gt;
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="push">
-                  </enumeration>
-                  <enumeration value="radio">
-                  </enumeration>
-                  <enumeration value="toggle">
-                  </enumeration>
-                  <enumeration value="pulldown">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="state" type="boolean">
-            <annotation>
-               <documentation>
-                  an optional attribute indicating the initial state (either &lt;samp&gt;true&lt;/samp&gt; or &lt;samp&gt;false&lt;/samp&gt;), used when the &lt;samp&gt;style&lt;/samp&gt; attribute has the value &lt;samp&gt;radio&lt;/samp&gt; or &lt;samp&gt;toggle&lt;/samp&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a name of the fully qualified class that implements &lt;samp&gt;org.eclipse.ui.IObjectActionDelegate&lt;/samp&gt; (for object contributions), &lt;samp&gt;org.eclipse.ui.IViewActionDelegate&lt;/samp&gt; (for viewer contributions to a view part), or &lt;samp&gt;org.eclipse.ui.IEditorActionDelegate&lt;/samp&gt; (for viewer contributions to an editor part).  For backwards compatibility, &lt;samp&gt;org.eclipse.ui.IActionDelegate&lt;/samp&gt; may be implemented for object contributions.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="enablesFor" type="string">
-            <annotation>
-               <documentation>
-                  a value indicating the selection count which must be met to enable the action.
-If this attribute is specified and the condition is met, the action is enabled.
-If the condition is not met, the action is disabled.
-If no attribute is specified, the action is enabled for any number of items selected.
-The following attribute formats are supported: 
-    &lt;table border=&quot;0&quot; width=&quot;80%&quot;&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;!&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 0 items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;?&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 0 or 1 items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;+&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 1 or more items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;multiple, 2+&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 2 or more items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;n&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- a precise number of items selected.a precise number of items selected.&amp;nbsp;
-          For example: enablesFor=&amp;quot; 4&amp;quot; enables the action only when 4
-          items are selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;*&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- any number of items selected&lt;/td&gt;
-      &lt;/tr&gt;
-    &lt;/table&gt;
-&lt;p&gt;
-The enablement criteria for an action extension are initially defined 
-by &lt;samp&gt;enablesFor&lt;/samp&gt;, &lt;samp&gt;selection&lt;/samp&gt; and &lt;samp&gt;enablement&lt;/samp&gt;.  However, once the action
-delegate has been instantiated it may control the action enable state directly 
-within its &lt;samp&gt;selectionChanged&lt;/samp&gt; method.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="overrideActionId" type="string">
-            <annotation>
-               <documentation>
-                  an optional attribute that specifies the identifier of an action which this action overrides. The action represented by this identifier will not be contributed to the context menu. The action identifier must be from a prerequisite plug-in only. This attribute is only applicable to action elements of an object contribution.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.popupMenus/objectContribution/action/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="tooltip" type="string">
-            <annotation>
-               <documentation>
-                  a translatable text representing the action&apos;s tool tip. Only used if the action appears in the toolbar.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="filter">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name"/>
-         </appinfo>
-         <documentation>
-            This element is used to evaluate the attribute state of each object in the current selection. A match only if each object in the selection has the specified attribute state. Each object in the selection must implement, or adapt to, &lt;samp&gt;org.eclipse.ui.IActionFilter&lt;/samp&gt;.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of an object&apos;s attribute. Acceptable names reflect the object type, and should be publicly declared by the plug-in where the object type is declared.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the required value of the object&apos;s attribute. The acceptable values for the object&apos;s attribute should be publicly declared.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="parameter">
-      <annotation>
-         <documentation>
-            A parameter element to be used within an IExecutableExtension element.  This will be passed as initialization data to the instantiated class.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the parameter name
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the parameter value
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="class">
-      <annotation>
-         <documentation>
-            The element version of the &lt;code&gt;class&lt;/code&gt; attribute.  This is used when the class implements &lt;code&gt;org.eclipse.core.runtime.IExecutableExtension&lt;/code&gt; and there is parameterized data that you wish used in its initialization.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  A class that implements one of the interfaces listed for the class attribute.  It may also implement &lt;code&gt;org.eclipse.core.runtime.IExecutableExtension&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of a pop-up menu extension point: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.popupMenus&quot;&gt; 
-      &lt;objectContribution 
-         id=&quot;com.xyz.C1&quot; 
-         objectClass=&quot;org.eclipse.core.resources.IFile&quot; 
-         nameFilter=&quot;*.java&quot;&gt; 
-         &lt;menu
-            id=&quot;com.xyz.xyzMenu&quot; 
-            path=&quot;additions&quot; 
-            label=&quot;&amp;amp;XYZ Java Tools&quot;&gt; 
-            &lt;separator name=&quot;group1&quot;/&gt; 
-         &lt;/menu&gt; 
-         &lt;action
-            id=&quot;com.xyz.runXYZ&quot; 
-            label=&quot;&amp;amp;Run XYZ Tool&quot;
-            style=&quot;push&quot;
-            menubarPath=&quot;com.xyz.xyzMenu/group1&quot; 
-            icon=&quot;icons/runXYZ.gif&quot; 
-            helpContextId=&quot;com.xyz.run_action_context&quot; 
-            class=&quot;com.xyz.actions.XYZToolActionDelegate&quot; 
-            enablesFor=&quot;1&quot; /&gt; 
-      &lt;/objectContribution&gt; 
-      &lt;viewerContribution 
-         id=&quot;com.xyz.C2&quot; 
-         targetID=&quot;org.eclipse.ui.views.TaskList&quot;&gt; 
-         &lt;action
-            id=&quot;com.xyz.showXYZ&quot; 
-            label=&quot;&amp;amp;Show XYZ&quot;
-            style=&quot;toggle&quot;
-            state=&quot;true&quot;
-            menubarPath=&quot;additions&quot; 
-            icon=&quot;icons/showXYZ.gif&quot; 
-            helpContextId=&quot;com.xyz.show_action_context&quot; 
-            class=&quot;com.xyz.actions.XYZShowActionDelegate&quot; /&gt; 
-      &lt;/viewerContribution&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-In the example above, the specified object contribution action will only enable for a single selection (&lt;samp&gt;enablesFor&lt;/samp&gt; attribute). In addition, each object in the selection must implement the specified interface (&lt;samp&gt;IFile&lt;/samp&gt;) and must be a Java file. This action will be added into a submenu previously created. This contribution 
-will be effective in any view that has the required selection. 
-&lt;p&gt;
-In contrast, the viewer contribution above will only appear in the Tasks view context menu, and will not be affected by the selection in the view. 
-&lt;p&gt;
-The following is an example of the filter mechanism. In this case the action will only appear for IMarkers which are completed and have high priority. 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.popupMenus&quot;&gt; 
-      &lt;objectContribution 
-         id=&quot;com.xyz.C3&quot; 
-         objectClass=&quot;org.eclipse.core.resources.IMarker&quot;&gt; 
-         &lt;filter name=&quot;done&quot; value=&quot;true&quot;/&gt; 
-         &lt;filter name=&quot;priority&quot; value=&quot;2&quot;/&gt; 
-         &lt;action
-            id=&quot;com.xyz.runXYZ&quot; 
-            label=&quot;High Priority Completed Action Tool&quot; 
-            icon=&quot;icons/runXYZ.gif&quot; 
-            class=&quot;com.xyz.actions.MarkerActionDelegate&quot;&gt; 
-         &lt;/action&gt; 
-      &lt;/objectContribution&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-The following is an other example of using the visibility element: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.popupMenus&quot;&gt; 
-      &lt;viewerContribution 
-         id=&quot;com.xyz.C4&quot; 
-         targetID=&quot;org.eclipse.ui.views.TaskList&quot;&gt;
-         &lt;visibility&gt;
-            &lt;and&gt;
-               &lt;pluginState id=&quot;com.xyz&quot; value=&quot;activated&quot;/&gt;
-               &lt;systemProperty name=&quot;ADVANCED_MODE&quot; value=&quot;true&quot;/&gt;
-            &lt;/and&gt;
-         &lt;/visibility&gt;
-         &lt;action
-            id=&quot;com.xyz.showXYZ&quot; 
-            label=&quot;&amp;amp;Show XYZ&quot;
-            style=&quot;push&quot;
-            menubarPath=&quot;additions&quot; 
-            icon=&quot;icons/showXYZ.gif&quot; 
-            helpContextId=&quot;com.xyz.show_action_context&quot; 
-            class=&quot;com.xyz.actions.XYZShowActionDelegate&quot;&gt; 
-         &lt;/action&gt; 
-      &lt;/viewerContribution&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-In the example above, the specified action will appear as a menu item in the Task view context menu, but only if the &quot;com.xyz&quot; plug-in is active and the specified system property is set to true.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The value of the action attribute &lt;samp&gt;class&lt;/samp&gt;
-must be a fully qualified class name of a Java class 
-that implements &lt;samp&gt;org.eclipse.ui.IObjectActionDelegate&lt;/samp&gt;
-in the case of object contributions, 
-&lt;samp&gt;org.eclipse.ui.IViewActionDelegate&lt;/samp&gt;
-for contributions to context menus that belong to views, 
-or &lt;samp&gt;org.eclipse.ui.IEditorActionDelegate&lt;/samp&gt;
-for contributions to context menus that belong to editors.  
-In all cases, the implementing class is loaded as late 
-as possible to avoid loading the entire plug-in before 
-it is really needed. 
-&lt;p&gt;
-Note: For backwards compatibility, 
-&lt;samp&gt;org.eclipse.ui.IActionDelegate&lt;/samp&gt; may be 
-implemented for object contributions. 
-&lt;p&gt;
-Conext menu extension within a part is only possible 
-when the target part publishes a menu for extension.  
-This is strongly encouraged, as it improves the 
-extensibility of the product. To accomplish this 
-each part should publish any context menus which are 
-defined by calling 
-&lt;samp&gt;IWorkbenchPartSite.registerContextMenu&lt;/samp&gt;.  
-Once this has been done the workbench will 
-automatically insert any action extensions which exist. 
-&lt;p&gt;
-A menu id must be provided for each registered menu.  
-For consistency across parts the following strategy 
-should be adopted by all part implementors. 
-&lt;p&gt;
-&lt;ul&gt;
-&lt;li&gt;
-If the target part has only one context menu it 
-should be registered with id == part id.  This can be 
-done easily by calling 
-&lt;samp&gt;registerContextMenu(MenuManager, ISelectionProvider)&lt;/samp&gt;.  
-Extenders may use the part id itself as the targetID for 
-the action extension. &lt;/li&gt;
-&lt;li&gt;
-If the target part has more than one context menu a 
-unique id should be defined for each.  Prefix each id 
-with the part id and publish these id&apos;s within 
-the javadoc for the target part.  Register each 
-menu at runtime by calling 
-&lt;samp&gt;registerContextMenu(String, MenuManager, ISelectionProvider)&lt;/samp&gt;. 
-Extenders will use the unique menu id as the targetID 
-for the action extension. &lt;/li&gt;&lt;/ul&gt;
-&lt;p&gt;
-Any context menu which is registered with the workbench 
-also should contain a standard insertion point with id 
-&lt;samp&gt;IWorkbenchActionConstants.MB_ADDITIONS&lt;/samp&gt;.  
-Other plug-ins will use this value as a reference 
-point for insertion.  The insertion point may be 
-defined by adding a GroupMarker to the menu at an 
-appropriate location for insertion. 
-&lt;p&gt;
-An object in the workbench which is the selection 
-in a context menu may define an 
-&lt;samp&gt;org.eclipse.ui.IActionFilter&lt;/samp&gt;.  This is a 
-filtering strategy which can perform type specific 
-filtering.  The workbench will retrieve the filter 
-for the selection by testing to see if it implements 
-&lt;samp&gt;IActionFilter&lt;/samp&gt;.  If that fails, the 
-workbench will ask for a filter through the 
-&lt;samp&gt;IAdaptable&lt;/samp&gt; mechanism.
-&lt;p&gt;
-Action and menu labels may contain special characters that encode mnemonics which are specified using the ampersand (&apos;&amp;amp;&apos;) character in front of a selected character in the translated text. Since ampersand is not allowed in XML strings, use &lt;samp&gt;&amp;amp;amp;&lt;/samp&gt; character entity. 
-&lt;p&gt;
-If two or more actions are contributed to a menu by a single extension the actions will appear in the reverse order of how they are listed in the plugin.xml file. This behavior is admittedly unintuitive.  However, it was discovered after the  Eclipse Platform API was frozen.  Changing the behavior now would break every plug-in which relies upon the existing behavior.
-&lt;p&gt;
-The &lt;samp&gt;selection&lt;/samp&gt; and &lt;samp&gt;enablement&lt;/samp&gt; elements are mutually exclusive. The &lt;samp&gt;enablement&lt;/samp&gt; element can replace the &lt;samp&gt;selection&lt;/samp&gt; element using the sub-elements &lt;samp&gt;objectClass&lt;/samp&gt; and &lt;samp&gt;objectState&lt;/samp&gt;. For example, the following:
-&lt;pre&gt;
- &lt;selection
-  class=&quot;org.eclipse.core.resources.IFile&quot;
-  name=&quot;*.java&quot;&gt;
- &lt;/selection&gt;
-&lt;/pre&gt;
-can be expressed using:
-&lt;pre&gt;
- &lt;enablement&gt;
-  &lt;and&gt;
-   &lt;objectClass name=&quot;org.eclipse.core.resources.IFile&quot;/&gt;
-   &lt;objectState name=&quot;extension&quot; value=&quot;java&quot;/&gt;
-  &lt;/and&gt;
- &lt;/enablement&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         The workbench views have built-in context menus 
-that already come loaded with a number of actions. 
-Plug-ins can contribute to these menus. If a viewer 
-has reserved slots for these contributions and they 
-are made public, slot names can be used as paths. 
-Otherwise, actions and submenus will be added at 
-the end of the pop-up menu.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2000, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/preferencePages.exsd b/bundles/org.eclipse.ui/schema/preferencePages.exsd
deleted file mode 100644
index 0603381..0000000
--- a/bundles/org.eclipse.ui/schema/preferencePages.exsd
+++ /dev/null
@@ -1,195 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="preferencePages" name="Preference Pages"/>
-      </appinfo>
-      <documentation>
-         The workbench provides one common dialog box for preferences.
-The purpose of this extension point is to allow plug-ins to add
-pages to the preference dialog box. When preference dialog box
-is opened (initiated from the menu bar), pages contributed in
-this way will be added to the dialog box. 
-
-&lt;p&gt;
-The preference dialog
-box provides for hierarchical grouping of the pages. For this
-reason, a page can optionally specify a &lt;samp&gt;category&lt;/samp&gt; attribute.
-This
-attribute represents a path composed of parent page IDs separated
-by &apos;/&apos;. If this attribute is omitted or if any of the parent
-nodes in the path cannot be found, the page will be added at
-the root level.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="page" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="page">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name"/>
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="keywordReference" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this page.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name that will be used in the UI for this page.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a name of the fully qualified class that implements 
-&lt;samp&gt;org.eclipse.ui.IWorkbenchPreferencePage&lt;/samp&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jface.preference.PreferencePage:org.eclipse.ui.IWorkbenchPreferencePage"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="category" type="string">
-            <annotation>
-               <documentation>
-                  a path indicating the location of the page in the preference tree. The path may either be a parent node ID or a sequence
-     of IDs separated by &apos;/&apos;, representing the full path from the root node.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.preferencePages/page/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="keywordReference">
-      <annotation>
-         <documentation>
-            A reference by a preference page to a keyword. See the keywords extension point.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id of the keyword being referred to.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.keywords/keyword/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example for the preference extension point: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension 
-       point=&quot;org.eclipse.ui.preferencePages&quot;&gt; 
-      &lt;page 
-         id=&quot;com.xyz.prefpage1&quot; 
-         name=&quot;XYZ&quot; 
-         class=&quot;com.xyz.prefpages.PrefPage1&quot;&gt; 
-         &lt;keywordReference id=&quot;xyz.Keyword&quot;/&gt;
-      &lt;/page&gt; 
-      &lt;page 
-         id=&quot;com.xyz.prefpage2&quot; 
-         name=&quot;Keyboard Settings&quot; 
-         class=&quot;com.xyz.prefpages.PrefPage2&quot; 
-         category=&quot;com.xyz.prefpage1&quot;&gt; 
-      &lt;/page&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The value of the attribute class must represent a fully qualified name of the class that implements
-&lt;samp&gt;org.eclipse.ui.IWorkbenchPreferencePage&lt;/samp&gt;.
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         The workbench adds several pages for setting the preferences of the platform. Pages registered
-through this extension will be added after them according to their category information.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/preferenceTransfer.exsd b/bundles/org.eclipse.ui/schema/preferenceTransfer.exsd
deleted file mode 100644
index e58faa3..0000000
--- a/bundles/org.eclipse.ui/schema/preferenceTransfer.exsd
+++ /dev/null
@@ -1,318 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="preferenceTransfer" name="Preference Transfer"/>
-      </appInfo>
-      <documentation>
-         The workbench provides support for maintaining preferences.
-The purpose of this extension point is to allow plug-ins to add
-specific support for saving and loading of specific groups of preferences.
-Typically this is used for operations such as Import and Export.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="transfer" minOccurs="0" maxOccurs="unbounded"/>
-            <sequence>
-               <element ref="settingsTransfer" minOccurs="0" maxOccurs="unbounded"/>
-            </sequence>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="transfer">
-      <annotation>
-         <documentation>
-            A transfer is an element used for specifying a group of preferences that can be exported together.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="mapping" minOccurs="1" maxOccurs="unbounded"/>
-            <element ref="description" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this transfer
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name that will be used in UI when listing this item
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a relative name of the icon that will be used when displaying the transfer
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="description" type="string">
-      <annotation>
-         <appInfo>
-            <meta.element translatable="true"/>
-         </appInfo>
-         <documentation>
-            An optional subelement whose body should represent a short description
-of the transfer engine functionality.
-         </documentation>
-      </annotation>
-   </element>
-
-   <element name="mapping">
-      <annotation>
-         <documentation>
-            a subelement which represents a &lt;tt&gt;org.eclipse.core.runtime.preferences.IPreferenceFilter&lt;/tt&gt;.  It specifies 1 or more mappings from a scope &lt;tt&gt;org.eclipse.core.runtime.preferences.IScope&lt;/tt&gt; to 0 or more nodes. 0 or more keys are specified per node.  The rules for export and import behaviour for a filter can be found in the specifications in &lt;tt&gt;org.eclipse.core.runtime.preferences.IPreferenceFilter&lt;/tt&gt;.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="entry" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="scope" type="string" use="required">
-            <annotation>
-               <documentation>
-                  an attribute specifying the name of the scope to map the provided nodes and keys to.
-Generally the scopes defined in org.eclipse.core.runtime.preferences and org.eclipse.core.resources are used. They are 
-configuration (org.eclipse.core.runtime.preferences.ConfigurationScope.SCOPE)
-instance (org.eclipse.core.runtime.preferences.InstanceScope.SCOPE)
-default (org.eclipse.core.runtime.preferences.DefaultScope.SCOPE)
-default (org.eclipse.core.resources.ProjectScope.SCOPE)
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="entry">
-      <annotation>
-         <documentation>
-            a subelement specifing the nodes and keys that are to be transferred for a given scope
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="key" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="node" type="string">
-            <annotation>
-               <documentation>
-                  an attribute specifing the preference node within the given scope to be transferred. This preference node will correspond to the bundle id of the plug-in that defines the preference.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="key">
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  an attribute specifing a comma separated list of preference keys within the given node to be transferred, specifying the key attribute without specifying a matching node will result in a runtime error.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="settingsTransfer">
-      <annotation>
-         <documentation>
-            A settings transfer is the definition of a transfer of internal state from one workbench to another. Added in 3.3.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="description" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The human readable name of the transfer.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id of the transfer.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The subclass of &lt;code&gt;org.eclipse.ui.preferences.SettingsTransfer&lt;/code&gt; that specifies this transfer.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.preferences.SettingsTransfer"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="helpContext" type="string">
-            <annotation>
-               <documentation>
-                  The help context for the transfer. See IWorkbench#getHelpSystem().
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;
- Example that export all transfers, exports all nodes for specified scopes.
-&lt;/p&gt;
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.ui.preferenceTransfer&quot;&gt;
-       &lt;transfer
-            icon=&quot;XYZ.gif&quot;
-            name=&quot;Export All Transfer Test&quot;
-            id=&quot;org.eclipse.ui.tests.all&quot;&gt;
-            &lt;mapping scope=&quot;instance&quot;/&gt;
-      &lt;mapping scope=&quot;configuration&quot;/&gt;
-            &lt;mapping scope=&quot;project&quot;/&gt;
-   &lt;description&gt;
-             Export all tranfer, exports all nodes for specified scopes
-      &lt;/description&gt;
-    &lt;/transfer&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-   Bare Bones Transfer only provides required info and no more.  
-&lt;/p&gt;
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.ui.preferenceTransfer&quot;&gt;
-       &lt;transfer
-            name=&quot;Bare Bones Transfer Test&quot;
-            id=&quot;org.eclipse.ui.tests.all&quot;&gt;
-            &lt;mapping scope=&quot;instance&quot;/&gt;
-    &lt;/transfer&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-   Example that exports many combinations of keys and nodes 
-&lt;/p&gt;
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.ui.preferenceTransfer&quot;&gt;
-       &lt;transfer
-            icon=&quot;XYZ.gif&quot;
-            name=&quot;Export many preferences&quot;
-            id=&quot;org.eclipse.ui.tests.all&quot;&gt;
-            &lt;mapping scope=&quot;instance&quot;&gt;
-                &lt;entry node=&quot;org.eclipse.ui&quot;&gt;
-                   &lt;key name=&quot;showIntro,DOCK_PERSPECTIVE_BAR&quot;/&gt;
-                &lt;/entry&gt;
-                &lt;entry node=&quot;org.eclipse.ui.workbench&quot;&gt;
-                   &lt;key name=&quot;bogus,RUN_IN_BACKGROUND&quot;/&gt;
-                &lt;/entry&gt;   
-                &lt;entry node=&quot;org.eclipse.ui.ide&quot;/&gt;
-                &lt;entry node=&quot;org.eclipse.core.resources&quot;/&gt;
-            &lt;/mapping&gt;
-      &lt;mapping scope=&quot;configuration&quot;/&gt;
-      &lt;description&gt;
-              Export many combinations of keys and nodes
-        &lt;/description&gt;
-    &lt;/transfer&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/presentationFactories.exsd b/bundles/org.eclipse.ui/schema/presentationFactories.exsd
deleted file mode 100644
index e8f27ff..0000000
--- a/bundles/org.eclipse.ui/schema/presentationFactories.exsd
+++ /dev/null
@@ -1,134 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.workbench">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui.workbench" id="presentationFactories" name="Presentation Factories"/>
-      </appInfo>
-      <documentation>
-         This extension point is used to add presentation factories to the workbench.
-         A presentation factory defines the overall look and feel of the workbench,
-         including how views and editors are presented.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="factory" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="factory">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Specify the fully qualified class to be used for the presentation factory.  The specified value must be a subclass of &lt;code&gt;org.eclipse.ui.presentations.AbstractPresentationFactory&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.presentations.AbstractPresentationFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this presentation factory
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name that can be used to show this presentation factory in the UI
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a presentationFactory extension:
-&lt;pre&gt;
-  &lt;extension point=&quot;org.eclipse.ui.presentationFactories&quot;&gt;
-     &lt;factory
-        class=&quot;org.eclipse.ui.workbench.ExampleWorkbenchPresentationFactory&quot;/&gt;
-  &lt;/extension&gt;
-  &lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The class specified in the factory element must be a concrete subclass of &lt;code&gt;org.eclipse.ui.presentations.AbstractPresentationFactory&lt;/code&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         If a presentation factory is not specified or is missing then the implementation in &lt;code&gt;org.eclipse.ui.presentations.WorkbenchPresentationFactory&lt;/code&gt; will be used.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2004, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/propertyPages.exsd b/bundles/org.eclipse.ui/schema/propertyPages.exsd
deleted file mode 100644
index 4af14d3..0000000
--- a/bundles/org.eclipse.ui/schema/propertyPages.exsd
+++ /dev/null
@@ -1,295 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="propertyPages" name="Property Pages"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to add additional property page for objects of a given type.  Once defined, these property pages will appear in the Properties Dialog for objects of that type. 
-&lt;p&gt;
-A property page is a user friendly way to interact with the properties of an object.  Unlike the Properties view, which restricts the space available for editing an object property, a property page may benefit from the freedom to define larger, more complex controls with labels, icons, etc.  Properties which logically go together may also be clustered in a page, rather than scattered in the property sheet. However, in most applications it will be appropriate to expose some properties of an object via the property sheet and some via the property pages. 
-&lt;/p&gt;
-
-&lt;p&gt;
-Property pages are shown in a dialog box that is normally visible when the &quot;Properties&quot; menu item is selected on a pop-up menu for an object. In addition to the object class, the name filter can optionally be supplied to register property pages only for specific object types. 
-&lt;/p&gt;
-
-&lt;p&gt;
-If these filtering mechanisms are inadequate a property page may use the filter mechanism.  In this case the attributes of the target object are described in a series of key value pairs.  The attributes which apply to the selection are type specific and beyond the domain of the workbench itself, so the workbench will delegate filtering at this level to the actual selection.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="page" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="page">
-      <annotation>
-         <documentation>
-            The page is the specification of the implementation and appearance of the page.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="filter" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="keywordReference" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="enabledWhen" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this page
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name that will be used in the UI for this page
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path to an icon that will be used in the UI in addition to the page name
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="objectClass" type="string">
-            <annotation>
-               <documentation>
-                  a fully qualified name of the class for which the page is registered. This class does not need to implement &lt;tt&gt;IAdaptable&lt;/tt&gt;. Objects that are not an instance of &lt;tt&gt;IAdaptable&lt;/tt&gt; will be wrappered in an &lt;tt&gt;IAdaptable&lt;/tt&gt; before being sent to the property page&apos;s instance (an &lt;tt&gt;org.eclipse.ui.IWorkbenchPropertyPage&lt;/tt&gt;).
-
-&lt;p&gt;Deprecated in Eclipse 3.3. Use the instanceOf or adapt element of the enabledWhen element instead.  If duplicate page definitions were previously used to register the page for multiple objectClass types, these should be combined into one page definition using multiple instanceOf elements combined inside an or element&lt;/p&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified name of the class that implements &lt;tt&gt;org.eclipse.ui.IWorkbenchPropertyPage&lt;/tt&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.dialogs.PropertyPage:org.eclipse.ui.IWorkbenchPropertyPage"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="nameFilter" type="string">
-            <annotation>
-               <documentation>
-                  an optional attribute that allows registration conditional on
-wild card match applied to the target object name.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="adaptable" type="boolean">
-            <annotation>
-               <documentation>
-                  a flag that indicates if types that adapt to IResource should use this property page.
-This flag is used if objectClass adapts to IResource.  Default value is false.
-
-&lt;p&gt;Deprecated in Eclipse 3.3. Use adapt sub element of the enabledWhen element instead&lt;/p&gt;
-
-&lt;strong&gt;NOTE:&lt;/strong&gt; The adaptable attribute will attempt adapt an object to &lt;code&gt;org.eclipse.core.resources.IResource&lt;/code&gt; before referencing the types registered in &lt;code&gt;Platform#getAdaptorManager&lt;/code&gt;. The enabledWhen element has no special case tests for &lt;code&gt;org.eclipse.core.resources.IResource&lt;/code&gt; and uses &lt;code&gt;Platform#getAdaptorManager&lt;/code&gt; to look up adaptable types. These can be registered using the &lt;code&gt;org.eclipse.core.runtime.adaptors&lt;/code&gt; extension point.
-               </documentation>
-               <appinfo>
-                  <meta.attribute deprecated="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="category" type="string">
-            <annotation>
-               <documentation>
-                  A path indicating the location of the page in the properties tree. The path may either be a parent node ID or a sequence of IDs separated by &apos;/&apos;, representing the full path from the root node.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.propertyPages/page/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="filter">
-      <annotation>
-         <documentation>
-            This element is used to evaluate the attribute state of each object in the current selection. A match only if each object in the selection has the specified attribute state. Each object in the selection must implement, or adapt to, &lt;samp&gt;org.eclipse.ui.IActionFilter&lt;/samp&gt;.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of an object attribute.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the value of an object attribute.  In combination with
-the name attribute, the name value pair is used to 
-define the target object for a property page.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="keywordReference">
-      <annotation>
-         <documentation>
-            A reference by a property page to a keyword. See the keywords extension point.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  The id of the keyword being referred to.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.keywords/keyword/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="enabledWhen">
-      <annotation>
-         <documentation>
-            The enabled when element specifies the conditions under which this property page will be added to the properties dialog.
-         </documentation>
-      </annotation>
-      <complexType>
-         <choice>
-            <element ref="not"/>
-            <element ref="and"/>
-            <element ref="or"/>
-            <element ref="instanceof"/>
-            <element ref="test"/>
-            <element ref="systemTest"/>
-            <element ref="equals"/>
-            <element ref="count"/>
-            <element ref="with"/>
-            <element ref="resolve"/>
-            <element ref="adapt"/>
-            <element ref="iterate"/>
-            <element ref="reference"/>
-         </choice>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of the property page definition: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.propertyPages&quot;&gt; 
-        &lt;page 
-            id=&quot;com.xyz.projectPage&quot; 
-            name=&quot;XYZ Java Properties&quot; 
-            class=&quot;com.xyz.ppages.JavaPropertyPage&quot; 
-            nameFilter=&quot;*.java&quot;&gt; 
-            &lt;enabledWhen&gt;
-             &lt;instanceof
-                  value=&quot;org.eclipse.core.resources.IFile&quot;&gt;
-             &lt;/instanceof&gt;
-          &lt;/enabledWhen&gt;
-            &lt;filter name=&quot;readOnly&quot; value=&quot;true&quot;/&gt; 
-        &lt;/page&gt; 
-    &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The attribute &lt;samp&gt;class&lt;/samp&gt; must specify a fully qualified name 
-of the class that implements 
-&lt;samp&gt;org.eclipse.ui.IWorkbenchPropertyPage&lt;/samp&gt;.
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         Some objects provided by the workbench may have 
-property pages registered. Plug-ins are allowed 
-to add more property pages for these objects. 
-Property pages are not limited to workbench 
-resources: all objects showing up in the workbench 
-(even domain specific objects created by the plug-ins) 
-may have property pages and other plug-ins are 
-allowed to register property pages for them.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/services.exsd b/bundles/org.eclipse.ui/schema/services.exsd
deleted file mode 100644
index b30b567..0000000
--- a/bundles/org.eclipse.ui/schema/services.exsd
+++ /dev/null
@@ -1,234 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="services" name="Services"/>
-      </appinfo>
-      <documentation>
-         Define service factories so that services can be contributed declaratively and will be available through &lt;code&gt;IServiceLocator#getService(Class)&lt;/code&gt;.  The implementation of &lt;code&gt;AbstractServiceFactory&lt;/code&gt; must be able to return a global service and multiple child services (if applicable).
-&lt;p&gt;
-Services must follow a general contract:
-&lt;ul&gt;
-&lt;li&gt;The top level service has no parent.&lt;/li&gt;
-&lt;li&gt;The child service may use the supplied parent, which can be cast to the service interface.&lt;/li&gt;
-&lt;li&gt;Any other services needed for initialization should be retrieved from the &lt;code&gt;IServiceLocator&lt;/code&gt;.&lt;/li&gt;
-&lt;li&gt;If the service needs to clean up any state (like listeners) it should implement &lt;code&gt;IDisposable&lt;/code&gt;.&lt;/li&gt;
-&lt;li&gt;Services should clearly specify when they perform cleanup for clients, such as removing listeners automatically on disposal.&lt;/li&gt;
-&lt;/ul&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <documentation>
-            Contribute services to the workbench.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="1" maxOccurs="unbounded">
-            <element ref="serviceFactory" minOccurs="0" maxOccurs="1"/>
-            <element ref="sourceProvider" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="serviceFactory">
-      <annotation>
-         <documentation>
-            Match a service interface to a factory that can supply a hierachical implementation of that service.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="service" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="factoryClass" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The factory that extends &lt;code&gt;AbstractServiceFactory&lt;/code&gt; and can create the implementation for the serviceClass.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.services.AbstractServiceFactory:"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="service">
-      <annotation>
-         <documentation>
-            A service this factory can provide.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="serviceClass" type="string">
-            <annotation>
-               <documentation>
-                  The interface that represents a service contract.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="sourceProvider">
-      <annotation>
-         <documentation>
-            A Source Provider supplies source variables to the IEvaluationService.  It can also notify the IEvaluationService when one or more of the variables change.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="variable" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="provider" type="string" use="required">
-            <annotation>
-               <documentation>
-                  This class must provide variables and call the appropriate fireSourceChanged(*) method when any of the variables change.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.AbstractSourceProvider:"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="variable">
-      <annotation>
-         <documentation>
-            A source variable from this provider.  A source provider must declare all variables that it provides.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of a contributed source variable.  It is a good practice to prepend the plugin id to the variable name to avoid collisions with other source providers.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="priorityLevel" use="required">
-            <annotation>
-               <documentation>
-                  For conflict resolution used by services like the IHandlerService.  The source must select a priority for all contributed variables.  &lt;b&gt;workbench&lt;/b&gt; is the global default priority.  See &lt;code&gt;ISources&lt;/code&gt; for relative priority information.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="workbench">
-                  </enumeration>
-                  <enumeration value="activeContexts">
-                  </enumeration>
-                  <enumeration value="activeShell">
-                  </enumeration>
-                  <enumeration value="activeWorkbenchWindow">
-                  </enumeration>
-                  <enumeration value="activeEditorId">
-                  </enumeration>
-                  <enumeration value="activePartId">
-                  </enumeration>
-                  <enumeration value="activeSite">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.4
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-Here is a basic definition:
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.ui.services&quot;&gt;
-      &lt;serviceFactory
-            factoryClass=&quot;org.eclipse.ui.tests.services.LevelServiceFactory&quot;&gt;
-         &lt;service
-               serviceClass=&quot;org.eclipse.ui.tests.services.ILevelService&quot;&gt;
-         &lt;/service&gt;
-      &lt;/serviceFactory&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;&lt;/p&gt;
-&lt;p&gt;
-The &lt;code&gt;LevelServiceFactory&lt;/code&gt; can return an &lt;code&gt;ILevelService&lt;/code&gt; when it is requested from the &lt;code&gt;IServiceLocator&lt;/code&gt;:
-&lt;pre&gt;
-   ILevelService s = (ILevelService) getSite().getService(ILevelService.class);
-   System.out.println(s.getLevel());
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-In this test example, the factory would instantiate three &lt;code&gt;ILevelService&lt;/code&gt; implementations during the first call to &lt;code&gt;getSite().getService(*)&lt;/code&gt;.  The global one in the workbench, one for the workbench window, and one for the site.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-Please see &lt;code&gt;org.eclipse.ui.services.AbstractServiceFactory&lt;/code&gt;, &lt;code&gt;org.eclipse.ui.services.IDisposable&lt;/code&gt;, and &lt;code&gt;org.eclipse.ui.services.IServiceWithSources&lt;/code&gt; for more information.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/splashHandlers.exsd b/bundles/org.eclipse.ui/schema/splashHandlers.exsd
deleted file mode 100644
index 997923c..0000000
--- a/bundles/org.eclipse.ui/schema/splashHandlers.exsd
+++ /dev/null
@@ -1,164 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="splashHandlers" name="Splash Handlers"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;This extension point allows for the contribution of splash handlers.  These splash handlers may contribute custom behavior to the splash screen that appears during the start-up procedure that may include (but is not limited to) custom graphics and animation, custom progress reporting, and interactive behaviors.&lt;/p&gt;  
-&lt;p&gt;It is possible to have only one splash handler active at a given time and the decision of which handler to choose from comes down to a product binding.  As such, when defining a splash handler you must create two elements in your extension:  the definition of the splash handler (represented by a &lt;code&gt;splashHandler&lt;/code&gt; element) and a product binding (represented by a &lt;code&gt;splashHandlerProductBinding&lt;/code&gt; element).&lt;/p&gt;
-&lt;p&gt;The splash life cycle is as follows:
-&lt;ul&gt;
-&lt;li&gt;Eclipse process is launched&lt;/li&gt;
-&lt;li&gt;Eclipse launches a native executable that creates the initial splash window (including bitmap)&lt;/li&gt;
-&lt;li&gt;OSGi starts&lt;/li&gt;
-&lt;li&gt;Workbench starts&lt;/li&gt;
-&lt;li&gt;Workbench finds the splash handler suitable for this product and creates it&lt;/li&gt;
-&lt;li&gt;init(Shell) is called on the handler&lt;/li&gt;
-&lt;li&gt;Workbench initializes and spins the event loop at regular intervals&lt;/li&gt;
-&lt;li&gt;Workbench advertises the completion of startup and the dispose() method is invoked on the handler&lt;/li&gt;
-&lt;/ul&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="splashHandler" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="splashHandlerProductBinding" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="splashHandler">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this splash handler.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a class that extends &lt;code&gt;org.eclipse.ui.splash.AbstractSplashHandler&lt;/code&gt; or &lt;code&gt;org.eclipse.ui.splash.BasicSplashHandler&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.splash.AbstractSplashHandler"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="splashHandlerProductBinding">
-      <complexType>
-         <attribute name="splashId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  unique id of a splash handler
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="productId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  unique id of a product
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         Since 3.3
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of this extension point:
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension
-         point=&quot;org.eclipse.ui.splashHandlers&quot;&gt;
-      &lt;splashHandler
-            class=&quot;com.xyz.splash.Handler&quot;
-            id=&quot;com.xyz.splash&quot;&gt;
-      &lt;/splashHandler&gt;
-      &lt;splashHandlerProductBinding
-            productId=&quot;com.xyz.product&quot;
-            splashId=&quot;com.xyz.splash&quot;&gt;
-      &lt;/splashHandlerProductBinding&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The value of the &lt;samp&gt;class&lt;/samp&gt; attribute must be a fully qualified name of the class that extends  &lt;samp&gt;org.eclipse.ui.splash.AbstractSplashHandler&lt;/samp&gt;.  It is common practice to subclass &lt;samp&gt;org.eclipse.ui.splash.BasicSplashHandler&lt;/samp&gt; if the standard progress reporting is desired.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         In the absence of a product-bound handler described by an extension of this type the default Eclipse splash is used.  This splash is driven by product constants defined in &lt;samp&gt;org.eclipse.ui.branding.IProductConstants&lt;/samp&gt; and will display a progress bar and message area at specified locations in specified colors.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/startup.exsd b/bundles/org.eclipse.ui/schema/startup.exsd
deleted file mode 100644
index 9d3a535..0000000
--- a/bundles/org.eclipse.ui/schema/startup.exsd
+++ /dev/null
@@ -1,123 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="startup" name="Startup"/>
-      </appInfo>
-      <documentation>
-         This extension point is used to register plugins that want to be activated on startup. The class given as the attribute on the startup element must implement the interface &lt;samp&gt;org.eclipse.ui.IStartup&lt;/samp&gt;. Once the workbench is started, the method earlyStartup() will be called from a separate thread.
-
-If the startup element has a class attribute, the class will be instantiated and earlyStartup() will be called on the result.  Otherwise, this method will be called on the plug-in class.  Do not specify the plug-in class as the value of the class attribute, or it will be instantiated twice (once by regular plug-in activation, and once by this mechanism).
-
-If the extension does not provide a class as an attribute on the startup element, the plug-in&apos;s activator (plug-in class) must implement &lt;samp&gt;org.eclipse.ui.IStartup&lt;/samp&gt;. Note that this form is deprecated and should no longer be used. Its functioning relies on the availability of the org.eclipse.core.runtime.compatibility plug-in and the org.eclipse.core.runtime.compatibility.registry fragment.
-
-Plugins that provide an extension to this extension point are listed in the workbench preferences and the user may disable any plugin from early startup.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="startup" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="startup">
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  a fully qualified name of the class that implements 
-&lt;samp&gt;org.eclipse.ui.IStartup&lt;/samp&gt;.
-If not specified, the plug-in class is used.   Do not specify the plug-in class as an explicit value, or it will be instantiated twice (once by regular plug-in activation, and once by this mechanism).
-Since release 3.0.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.IStartup"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         Release 2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         Following is an example of a startup extension: 
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.startup&quot;&gt;
-     &lt;startup class=&quot;org.eclipse.example.StartupClass&quot;/&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         See interface &lt;samp&gt;org.eclipse.ui.IStartup&lt;/samp&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2002, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/statusHandlers.exsd b/bundles/org.eclipse.ui/schema/statusHandlers.exsd
deleted file mode 100644
index d8667e6..0000000
--- a/bundles/org.eclipse.ui/schema/statusHandlers.exsd
+++ /dev/null
@@ -1,272 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="statusHandlers" name="Status handlers"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-This extension point is used to register implementations of status handlers in the workbench. A handler can be associated with a product and this association is also contributed via this extension point.
-&lt;/p&gt;
-
-&lt;p&gt;
-Status handlers are part of the status handling facility. The facility is responsible for handling errors and other important issues in Eclipse based applications. The handlers are responsible for presenting this errors by logging or showing error dialogs.
-&lt;/p&gt;
-
-&lt;p&gt;
-If there is no status handler associated with a product, the status handling facility uses the application handler defined in a workbench advisor.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="statusHandler" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="statusHandlerProductBinding" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="statusHandler">
-      <annotation>
-         <documentation>
-            This element is used to define a status handler.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;
-A unique identifier for this error handler. The id is used for setting default 
-error handler in a product. 
-If an error handler is to be the default one its id has to be set
-in a product preference file in org.eclipse.ui/ERROR_HANDLER_ID property. 
-The name of the preference file is set in product extension 
-&quot;preferenceCustomization&quot; property.
-&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;
-A fully qualified name of a class which extends &lt;code&gt;org.eclipse.ui.statushandlers.AbstractStatusHandler&lt;/code&gt;.
-&lt;/p&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.statushandlers.AbstractStatusHandler"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="parameter">
-      <annotation>
-         <appinfo>
-            <meta.element labelAttribute="name"/>
-         </appinfo>
-         <documentation>
-            &lt;p&gt;
-This element defines parameters for instances of specified status handler class.
-Instances of specified status handler class should understand this parameter. 
-&lt;/p&gt;
-&lt;p&gt;
-Handling policies can use handler parameters. For example default policy 
-use handlers &quot;prefix&quot; parameter. The default policy looks for the most specific 
-handler for given status checking status pluginId against these prefixes.
-&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of a parameter.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The value of a parameter.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="statusHandlerProductBinding">
-      <annotation>
-         <documentation>
-            &lt;p&gt;
-Specifies a binding between a product and a status handler. 
-These bindings determine which handler is appropriate for the current product (as defined by &lt;code&gt;org.eclipse.core.runtime.Platform.getProduct()&lt;/code&gt;).
-&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="productId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id of a product.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="handlerId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The unique id of a status handler.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.3
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-The following is an example of the definition for handler with prefix parameter.
-&lt;/p&gt;
-&lt;p&gt;
-&lt;pre&gt;
-&lt;extension
- point=&quot;org.eclipse.ui.statusHandlers&quot;&gt;
- &lt;statusHandler
- class=&quot;org.eclipse.ui.statushanders.SampleStatusHandler&quot;
- id=&quot;sampleStatusHandler&quot;&gt;
-  &lt;parameter
-  name=&quot;prefix&quot;
-  value=&quot;org.eclipse.ui.ide&quot;&gt;
-  &lt;/parameter&gt;
- &lt;/statusHandler&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-The following is an example of the definition for default (product) handler. The handler defined in the example will be default for product with id &quot;productId&quot;.
-&lt;/p&gt;
-&lt;p&gt;
-&lt;pre&gt;
-&lt;extension
- point=&quot;org.eclipse.ui.statusHandlers&quot;&gt;
- &lt;statusHandler
- class=&quot;org.eclipse.ui.statushandlers.SampleStatusHandler&quot;
- id=&quot;sampleStatusHandler&quot;&gt;
- &lt;/statusHandler&gt;
- &lt;statusHandlerProductBinding
- handlerId=&quot;sampleStatusHandler&quot;
- productId=&quot;productId&quot;&gt;
- &lt;/statusHandlerProductBinding&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-Of course we can define only the binding (for instance in a product plugin).
-The handler can be defined in other plugin.
-&lt;/p&gt;
-&lt;p&gt;
-&lt;pre&gt;
-&lt;extension
- point=&quot;org.eclipse.ui.statusHandlers&quot;&gt;
- &lt;statusHandlerProductBinding
- handlerId=&quot;sampleStatusHandler&quot;
- productId=&quot;productId&quot;&gt;
- &lt;/statusHandlerProductBinding&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         &lt;/p&gt;
-The value of the &lt;code&gt;class&lt;/code&gt; attribute in &lt;code&gt;statusHandler&lt;/code&gt; element must be the fully qualified name of a class that extends &lt;code&gt;org.eclipse.ui.statushandlers.AbstractStatusHandler&lt;/code&gt;.
-&lt;/p&gt;
-&lt;p&gt;
-The &lt;code&gt;parameter&lt;/code&gt; elements in &lt;code&gt;statusHandler&lt;/code&gt; element adds parameters which can be used during handling in the status handler defined in &lt;code&gt;class&lt;/code&gt; attribute.
-&lt;/p&gt;
-&lt;p&gt;
-The value of the &lt;code&gt;productId&lt;/code&gt; attribute in &lt;code&gt;statusHandlerProductBinding&lt;/code&gt; is full name of the product to which the handler with id defined in &lt;code&gt;handlerId&lt;/code&gt; attribute in &lt;code&gt;statusHandlerProductBinding&lt;/code&gt; will be associated.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;
-The platform supplies basic implementation of &lt;code&gt;org.eclipse.ui.statushandlers.AbstractStatusHandler&lt;/code&gt;.
-It is &lt;code&gt;org.eclipse.ui.statushandlers.WorkbenchErrorHandler&lt;/code&gt; which is the default workbench status handler.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2006, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/systemSummarySections.exsd b/bundles/org.eclipse.ui/schema/systemSummarySections.exsd
deleted file mode 100644
index 083dee5..0000000
--- a/bundles/org.eclipse.ui/schema/systemSummarySections.exsd
+++ /dev/null
@@ -1,142 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="systemSummarySections" name="System Summary Sections"/>
-      </appInfo>
-      <documentation>
-         The Eclipse UI provides an AboutDialog that can be branded and reused by client product plugins.  This dialog includes a SystemSummary dialog that contains configuration details.  By extending the org.eclipse.ui.systemSummarySections extension point clients are able to put their own information into the log.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="section" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="section">
-      <complexType>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional, unique name that will be used to identify this system summary section
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="sectionTitle" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name that will be displayed as the title of this section in the system summary
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The fully qualified name of a class the implements 
-&lt;code&gt;org.eclipse.ui.about.ISystemSummarySection&lt;/code&gt;.  The class must provide a default constructor.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         3.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         Following is an example of a systemSummarySections extension: 
-&lt;pre&gt;
-&lt;extension
- point=&quot;org.eclipse.ui.systemSummarySections&quot;&gt;
- &lt;section
-  id=&quot;RCPBrowser.CookieDetails&quot;
-  sectionTitle=&quot;Browser Cookies&quot;
-  class=&quot;org.eclipse.ui.examples.rcp.browser.CookieConfigDetails&quot;/&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The class specified in the section element must be a concrete subclass of &lt;code&gt;org.eclipse.ui.about.ISystemSummarySection&lt;/code&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The Workbench uses this extension point to provide the following sections in the system summary dialog:
-&lt;ul&gt;
-&lt;li&gt;System properties: The properties returned by java.lang.System.getProperties().&lt;/li&gt;
-&lt;li&gt;Features: The installed features.&lt;/li&gt;
-&lt;li&gt;Plug-in Registry: The installed plug-ins and their status.&lt;/li&gt;
-&lt;li&gt;User Preferences: The preferences that have been modified from their default values.&lt;/li&gt;
-&lt;/ul&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2004, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/themes.exsd b/bundles/org.eclipse.ui/schema/themes.exsd
deleted file mode 100644
index ce88415..0000000
--- a/bundles/org.eclipse.ui/schema/themes.exsd
+++ /dev/null
@@ -1,698 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="themes" name="Themes"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to customize the appearance of the UI.  It allows definition of color and font entities as well as theme entities.  Themes allow applications to selectively override default color and font specifications for particular uses.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="theme" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="colorDefinition" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="fontDefinition" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="themeElementCategory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="data" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="categoryPresentationBinding" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="theme">
-      <annotation>
-         <documentation>
-            A collection of font, color and data overrides.  Such a collection may be used to alter the appearance of the workbench.  Many theme elements may exist with the same id.  This allows component authors to contribute to existing themes.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="colorOverride" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="fontOverride" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="description" minOccurs="0" maxOccurs="1"/>
-            <element ref="data" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this theme
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  a translatable name of the theme to be presented to the user.  At least one theme definition with any given id should contain this attribute.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="themeElementCategory">
-      <annotation>
-         <documentation>
-            A logical grouping of theme element definitions.  This category may include colors and fonts.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="description" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the id for this category
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="parentId" type="string">
-            <annotation>
-               <documentation>
-                  the id of the parent category, if any.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.themes/themeElementCategory/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  a class that implements &lt;code&gt;org.eclipse.ui.themes.IThemePreview&lt;/code&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.IPresentationPreview"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string">
-            <annotation>
-               <documentation>
-                  a translatable name of the theme element category to be presented to the user
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="colorDefinition">
-      <annotation>
-         <documentation>
-            A symbolic color definition.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="colorFactory" minOccurs="0" maxOccurs="1"/>
-            <element ref="colorValue" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="description" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique id that can be used to identify this color definition.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name of the color to be presented to the user.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="defaultsTo" type="string">
-            <annotation>
-               <documentation>
-                  the id of another color definition that is the default setting for the receiver. When there is no preference for this color the color registry will have the value of defaultsTo set for it in the registry.
-
-Only one of &lt;code&gt;defaultsTo&lt;/code&gt;, &lt;code&gt;value&lt;/code&gt; or &lt;code&gt;colorFactory&lt;/code&gt; may be defined.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string">
-            <annotation>
-               <documentation>
-                  The default value of this color.  The value may be specified in the following ways:
-&lt;ul&gt;
-&lt;li&gt;a String containing comma separated integers in the form red,green,blue 
-&lt;li&gt;a String that maps to an SWT color constant (ie:  COLOR_RED).
-&lt;/ul&gt;
-Only one of &lt;code&gt;defaultsTo&lt;/code&gt;, &lt;code&gt;value&lt;/code&gt; or &lt;code&gt;colorFactory&lt;/code&gt; may be defined.  If &lt;code&gt;value&lt;/code&gt; is specified, additional value definitions may be specified on a per platform/windowing system basis via the &lt;code&gt;colorValue&lt;/code&gt; element.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="categoryId" type="string">
-            <annotation>
-               <documentation>
-                  the optional id of the &lt;code&gt;themeElementCategory&lt;/code&gt; this color belongs to.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.themes/themeElementCategory/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="colorFactory" type="string">
-            <annotation>
-               <documentation>
-                  a class that implements &lt;code&gt;org.eclipse.ui.themes.IColorFactory&lt;/code&gt;.  This may be used instead of &lt;code&gt;value&lt;/code&gt; to specify the default value of the color.  Please be advised that this should be used with caution - usage of this attribute will cause plugin activation on workbench startup.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.themes.IColorFactory"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="isEditable" type="boolean">
-            <annotation>
-               <documentation>
-                  whether the user should be allowed to edit this color in the preference page.  If this is &lt;code&gt;false&lt;/code&gt; then the contribution is not shown to the user.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="fontDefinition">
-      <annotation>
-         <documentation>
-            A symbolic font definition.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="fontValue" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="description" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that can be used to identify this font definition.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name of the font to be presented to the user.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;the font value.  This is in the form: &lt;code&gt;fontname-style-height&lt;/code&gt; where &lt;code&gt;fontname&lt;/code&gt; is the name of a font, &lt;code&gt;style&lt;/code&gt; is a font style (one of &lt;code&gt;&quot;regular&quot;&lt;/code&gt;, &lt;code&gt;&quot;bold&quot;&lt;/code&gt;, &lt;code&gt;&quot;italic&quot;&lt;/code&gt;, or &lt;code&gt;&quot;bold italic&quot;&lt;/code&gt;) and &lt;code&gt;height&lt;/code&gt; is an integer representing the font height.&lt;/p&gt;
-&lt;p&gt;Example: &lt;code&gt;Times New Roman-bold-36&lt;/code&gt;.&lt;/p&gt;  
-&lt;p&gt;Only one (or neither) of &lt;code&gt;value&lt;/code&gt; or &lt;code&gt;defaultsTo&lt;/code&gt; may be used.&lt;/p&gt;  If &lt;code&gt;value&lt;/code&gt; is specified, additional value definitions may be specified on a per platform/windowing system basis via the &lt;code&gt;fontValue&lt;/code&gt; element.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="categoryId" type="string">
-            <annotation>
-               <documentation>
-                  the optional id of the &lt;code&gt;themeElementCategory&lt;/code&gt; this font belongs to.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.themes/themeElementCategory/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="defaultsTo" type="string">
-            <annotation>
-               <documentation>
-                  the id of another font definition that is the default setting for the receiver. When there is no preference for this font the font registry will have the value of defaultsTo set for it in the registry.
-&lt;p&gt;
-Only one (or neither) of &lt;code&gt;value&lt;/code&gt; or &lt;code&gt;defaultsTo&lt;/code&gt; may be used.
-&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="isEditable" type="boolean">
-            <annotation>
-               <documentation>
-                  whether the user should be allowed to edit this color in the preference page.  If this is &lt;code&gt;false&lt;/code&gt; then the contribution is not shown to the user.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="colorOverride">
-      <annotation>
-         <documentation>
-            Allows overriding of colors defined in &lt;code&gt;colorDefinition&lt;/code&gt; elements.  These colors will be applied when the theme is in use. The colors that are defined by workbench are:
-
-&lt;ul&gt;
-&lt;li&gt;org.eclipse.jface.preference.JFacePreference.ERROR_COLOR
-&lt;li&gt;org.eclipse.jface.preference.JFacePreference.HYPERLINK_COLOR
-&lt;li&gt;org.eclipse.jface.preference.JFacePreference.ACTIVE_HYPERLINK_COLOR
-&lt;/ul&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="colorFactory" minOccurs="0" maxOccurs="1"/>
-            <element ref="colorValue" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique id that can be used to identify this color definition override.  This should match an existing font identifier.  Strictly speaking, you may override colors that do not exist in the base theme although this practice is not recommended.  In effect, such overrides will have behavior similar to &lt;code&gt;colorDefinition&lt;/code&gt;s that have &lt;code&gt;isEditable&lt;/code&gt; set to &lt;code&gt;false&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.themes/colorDefinition/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string">
-            <annotation>
-               <documentation>
-                  the overriding value of this color.  The value may be specified in the following ways:
-&lt;ul&gt;
-&lt;li&gt;a String containing comma separated integers in the form red,green,blue 
-&lt;li&gt;a String that maps to an SWT color constant (ie:  COLOR_RED).
-&lt;/ul&gt;
-Only one of &lt;code&gt;value&lt;/code&gt; or &lt;code&gt;colorFactory&lt;/code&gt; may be defined.
-Unlike a &lt;code&gt;colorDefinition&lt;/code&gt;, you may not supply a &lt;code&gt;defaultsTo&lt;/code&gt; for an override.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="colorFactory" type="string">
-            <annotation>
-               <documentation>
-                  a class that implements &lt;code&gt;org.eclipse.ui.themes.IColorFactory&lt;/code&gt;.  This may be used instead of &lt;code&gt;value&lt;/code&gt; to specify the default value of the color.  Please be advised that this should be used with caution - usage of this attribute will cause plugin activation on workbench startup.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="fontOverride">
-      <annotation>
-         <documentation>
-            Allows overriding of fonts defined in &lt;code&gt;fontDefinition&lt;/code&gt; elements.  These fonts will be applied when the theme is in use. The fonts that are defined by workbench are:
-
-&lt;ul&gt;
-&lt;li&gt;org.eclipse.jface.resource.JFaceResources.BANNER_FONT
-&lt;li&gt;org.eclipse.jface.resource.JFaceResources.DIALOG_FONT
-&lt;li&gt;org.eclipse.jface.resource.JFaceResources.HEADER_FONT
-&lt;li&gt;org.eclipse.jface.resource.JFaceResources.TEXT_FONT
-&lt;/ul&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="fontValue" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique id that can be used to identify this font definition override.  This should match an existing font identifier.  Strictly speaking, you may override fonts that do not exist in the base theme although this practice is not recommended.  In effect, such overrides will have behavior similar to &lt;code&gt;fontDefinition&lt;/code&gt;s that have &lt;code&gt;isEditable&lt;/code&gt; set to &lt;code&gt;false&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.themes/fontDefinition/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;the overriding value of this font.  This is in the form: &lt;code&gt;fontname-style-height&lt;/code&gt; where &lt;code&gt;fontname&lt;/code&gt; is the name of a font, &lt;code&gt;style&lt;/code&gt; is a font style (one of &lt;code&gt;&quot;regular&quot;&lt;/code&gt;, &lt;code&gt;&quot;bold&quot;&lt;/code&gt;, &lt;code&gt;&quot;italic&quot;&lt;/code&gt;, or &lt;code&gt;&quot;bold italic&quot;&lt;/code&gt;) and &lt;code&gt;height&lt;/code&gt; is an integer representing the font height.&lt;/p&gt;
-&lt;p&gt;Example: &lt;code&gt;Times New Roman-bold-36&lt;/code&gt;.&lt;/p&gt;
-&lt;p&gt;&lt;code&gt;value&lt;/code&gt; must be defined for a font override.
-Unlike a &lt;code&gt;fontDefinition&lt;/code&gt;, you may not supply a &lt;code&gt;defaultsTo&lt;/code&gt; for a &lt;code&gt;fontOverride&lt;/code&gt;.&lt;/p&gt;
-
-&lt;p&gt;If this value is not specified the default font will be used&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="description" type="string">
-      <annotation>
-         <appInfo>
-            <meta.element translatable="true"/>
-         </appInfo>
-         <documentation>
-            A short description of the elements usage.
-         </documentation>
-      </annotation>
-   </element>
-
-   <element name="colorFactory">
-      <annotation>
-         <documentation>
-            The element version of the &lt;code&gt;colorFactory&lt;/code&gt; attribute.  This is used when the colorFactory implements &lt;code&gt;org.eclipse.core.runtime.IExecutableExtension&lt;/code&gt; and there is parameterized data that you wish used in its initialization.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a class that implements &lt;code&gt;org.eclipse.ui.themes.IColorFactory&lt;/code&gt;.  It may also implement &lt;code&gt;org.eclipse.core.runtime.IExecutableExtension&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.themes.IColorFactory"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="plugin" type="string">
-            <annotation>
-               <documentation>
-                  the identifier of the plugin that contains the class
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="parameter">
-      <annotation>
-         <documentation>
-            A parameter element to be used within the colorFactory element.  This will be passed as initialization data to the colorFactory class.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the parameter name
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the parameter value
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="data">
-      <annotation>
-         <documentation>
-            &lt;p&gt;An element that allows arbitrary data to be associated with a theme or the default theme.  This data may be gradient directions or percentages, labels, author information, etc.&lt;/p&gt;
-&lt;p&gt;This element has behavior similar to definitions and overrides.  If a key is present in both the default theme and an identified theme, then the identified themes value will be used when that theme is accessed.  If the identified theme does not supply a value then the default is used.&lt;/p&gt;
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the data name,
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the data value
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="colorValue">
-      <annotation>
-         <documentation>
-            This element allows specification of a color value on a per-platform basis.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="colorFactory" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="os" type="string">
-            <annotation>
-               <documentation>
-                  an optional os string to enable choosing of color based on current OS. eg: win32,linux
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="ws" type="string">
-            <annotation>
-               <documentation>
-                  an optional os string to enable choosing of color based on current WS. eg: win32,gtk
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string">
-            <annotation>
-               <documentation>
-                  The default value of this color.  The value may be specified in the following ways:
-&lt;ul&gt;
-&lt;li&gt;a String containing comma separated integers in the form red,green,blue 
-&lt;li&gt;a String that maps to an SWT color constant (ie:  COLOR_RED).
-&lt;/ul&gt;
-Only one of &lt;code&gt;value&lt;/code&gt; or &lt;code&gt;colorFactory&lt;/code&gt; may be defined.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="colorFactory" type="string">
-            <annotation>
-               <documentation>
-                  a class that implements &lt;code&gt;org.eclipse.ui.themes.IColorFactory&lt;/code&gt;.  This may be used instead of &lt;code&gt;value&lt;/code&gt; to specify the value of the color.  Please be advised that this should be used with caution - usage of this attribute will cause plugin activation on workbench startup.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.themes.IColorFactory"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="fontValue">
-      <annotation>
-         <documentation>
-            This element allows specification of a font value on a per-platform basis.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="os" type="string">
-            <annotation>
-               <documentation>
-                  an optional os string to enable choosing of font based on current OS. eg: win32,linux
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="ws" type="string">
-            <annotation>
-               <documentation>
-                  an optional os string to enable choosing of font based on current WS. eg: win32,gtk
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  &lt;p&gt;the font value.  This is in the form: &lt;code&gt;fontname-style-height&lt;/code&gt; where &lt;code&gt;fontname&lt;/code&gt; is the name of a font, &lt;code&gt;style&lt;/code&gt; is a font style (one of &lt;code&gt;&quot;regular&quot;&lt;/code&gt;, &lt;code&gt;&quot;bold&quot;&lt;/code&gt;, &lt;code&gt;&quot;italic&quot;&lt;/code&gt;, or &lt;code&gt;&quot;bold italic&quot;&lt;/code&gt;) and &lt;code&gt;height&lt;/code&gt; is an integer representing the font height.&lt;/p&gt;
-&lt;p&gt;Example: &lt;code&gt;Times New Roman-bold-36&lt;/code&gt;.&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="categoryPresentationBinding">
-      <annotation>
-         <documentation>
-            This element allows a category to be bound to a specific presentation as described by the &lt;code&gt;org.eclipse.ui.presentationFactory&lt;/code&gt; extension point.  If a category has any presentation bindings then it (and it&apos;s children) is only configurable by the user if it is bound to the active presentation.  This is useful for removing unused items from user consideration.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="categoryId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the id of the category to bind
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.themes/themeElementCategory/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="presentationId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the id of the presentation to bind to
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.presentationFactories/factory/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of several color and font definitions as well as a theme that overrides them.
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.themes&quot;&gt;
-      &lt;themeElementCategory
-       id=&quot;com.xyz.ThemeCategory&quot;
-       class=&quot;com.xyz.XYZPreview&quot;
-       label=&quot;XYZ Elements&quot;/&gt;
-      &lt;colorDefinition 
-        id=&quot;com.xyz.Forground&quot;
-        categoryId=&quot;com.xyz.ThemeCategory&quot;
-        label=&quot;XYZ Foreground Color&quot;
-        value=&quot;COLOR_BLACK&quot;&gt;
-         &lt;!-- white should be used on GTK --&gt;
-         &lt;colorValue
-          value=&quot;COLOR_WHITE&quot;
-          os=&quot;linux&quot;
-          ws=&quot;gtk&quot;/&gt;
-        &lt;description&gt;
-        This color is used for the foreground color of the XYZ plugin editor.
-        &lt;/description&gt;
-      &lt;/colorDefinition&gt;
-      &lt;colorDefinition 
-        id=&quot;com.xyz.Background&quot;
-        categoryId=&quot;com.xyz.ThemeCategory&quot;        
-        label=&quot;XYZ Background Color&quot;&gt;
-        &lt;colorFactory
-         class=&quot;org.eclipse.ui.themes.RGBBlendColorFactory&quot;
-         plugin=&quot;org.eclipse.ui&quot;&gt;
-         &lt;parameter
-          name=&quot;color1&quot;
-          value=&quot;COLOR_WHITE&quot;/&gt;
-         &lt;parameter
-          name=&quot;color2&quot;
-          value=&quot;COLOR_BLUE&quot;/&gt;         
-        &lt;/colorFactory&gt;
-        &lt;!-- black should be used on GTK --&gt;
-        &lt;colorValue
-         value=&quot;COLOR_BLACK&quot;
-         os=&quot;linux&quot;
-         ws=&quot;gtk&quot;/&gt;
-        &lt;description&gt;
-        This color is used for the background color of the XYZ plugin editor.
-        &lt;/description&gt;
-      &lt;/colorDefinition&gt;      
-      &lt;fontDefinition
-        id=&quot;com.xyz.TextFont&quot;
-        categoryId=&quot;com.xyz.ThemeCategory&quot;        
-        label=&quot;XYZ Editor Font&quot;
-        defaultsTo=&quot;org.eclipse.jface.textfont&quot;&gt;
-        &lt;description&gt;
-        This font is used by the XYY plugin editor.
-        &lt;/description&gt;
-      &lt;/fontDefinition&gt;
-      &lt;data
-       name=&quot;com.xyz.EditorMarginWidth&quot;
-       value=&quot;5&quot;/&gt;      
-      &lt;theme
-        id=&quot;com.xyz.HarshTheme&quot;
-        label=&quot;Harsh Colors for XYZ&quot;&gt;
-        &lt;colorOverride
-         id=&quot;com.xyz.Forground&quot;
-         value=&quot;COLOR_CYAN&quot;/&gt;
-        &lt;colorOverride
-         id=&quot;com.xyz.Background&quot;
-         value=&quot;COLOR_MAGENTA&quot;/&gt;
-      &lt;data
-           name=&quot;com.xyz.EditorMarginWidth&quot;
-           value=&quot;1&quot;/&gt;      
-      &lt;/theme&gt;        
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The &lt;code&gt;org.eclipse.ui.IWorkbench.getThemeManager()&lt;/code&gt; provides an instance of &lt;code&gt;org.eclipse.ui.themes.IThemeManager&lt;/code&gt; that may be used to obtain a named theme (by id, including the default theme which has an id of &lt;code&gt;IThemeManager.DEFAULT_THEME&lt;/code&gt;) or the current theme.  From an &lt;code&gt;org.eclipse.ui.themes.ITheme&lt;/code&gt; you may obtain a &lt;code&gt;org.eclipse.jface.resources.ColorRegistry&lt;/code&gt;, an &lt;code&gt;org.eclipse.jface.resources.FontRegistry&lt;/code&gt; and the arbitrary data associated with a theme.
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         The workbench provides the font definitions for the text, dialog, banner, header and part title fonts.  it also supplies color definitions for the hyperlink, active hyperlink, error, active part (background gradient parts and foreground) and the inactive part (background gradient parts and foreground).  The workbench also provides data constants for the title gradient percentages (active and inactive) and the gradient directions (active and inactive).  The workbench does not provide any named themes.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2003, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/viewActions.exsd b/bundles/org.eclipse.ui/schema/viewActions.exsd
deleted file mode 100644
index 64dc294..0000000
--- a/bundles/org.eclipse.ui/schema/viewActions.exsd
+++ /dev/null
@@ -1,505 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="viewActions" name="View Menus,Toolbars and Actions"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;This extension point is used to add actions to the pulldown menu and toolbar for views registered by other plug-ins. Each view has a local pulldown menu normally activated 
-by clicking on the top right triangle button. Other plug-ins can contribute submenus and actions to this menu. Plug-ins may also contribute actions to a view toolbar. View owners are first given a chance to populate these areas. Optional additions by other plug-ins are appended.&lt;/p&gt;
-&lt;p&gt;
-You can now use &lt;a href=&quot;org_eclipse_ui_menus.html&quot;&gt;org.eclipse.ui.menus&lt;/a&gt; to place commands in menus and toolbars as well.
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <include schemaLocation="commonAction.exsd"/>
-
-   <include schemaLocation="commonExpression.exsd"/>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="viewContribution" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="viewContribution">
-      <annotation>
-         <documentation>
-            This element is used to define a group of view actions and/or menus.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="menu" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="action" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier used to reference this contribution.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="targetID" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier of a registered view that is the target of this contribution.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.views/view/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="action">
-      <annotation>
-         <documentation>
-            This element defines an action that the user can invoke in the UI.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <choice>
-               <element ref="selection" minOccurs="0" maxOccurs="unbounded"/>
-               <element ref="enablement" minOccurs="0" maxOccurs="1"/>
-            </choice>
-            <element ref="class" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique identifier used as a reference for this action.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="label" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name used either as the menu item text or toolbar button label. The name can include mnenomic information.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="definitionId" type="string">
-            <annotation>
-               <documentation>
-                  Specifies the command that this action will handle. By specifying and action, the key binding service can assign a key sequence to this action. See the extension point &lt;a href=&quot;org_eclipse_ui_commands.html&quot;&gt;org.eclipse.ui.commands&lt;/a&gt; for more information.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.commands/command/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="menubarPath" type="string">
-            <annotation>
-               <documentation>
-                  a slash-delimited path (&apos;/&apos;) used to specify the location of this action in the pulldown menu. Each token in the path, except the last one, must represent a valid identifier of an existing menu in the hierarchy. The last token represents the named group into which this action will be added. If the path is omitted, this action will not appear in the pulldown menu.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="toolbarPath" type="string">
-            <annotation>
-               <documentation>
-                  a named group within the local toolbar of the target view. If the group does not exist, it will be created. If omitted, the action will not appear in the local toolbar.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon used to visually represent the action in its context.
-If omitted and the action appears in the toolbar, the Workbench will use a placeholder icon. The path is relative to the location of the plugin.xml file of the contributing plug-in. The icon will appear in the toolbar but not in the pulldown menu.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="disabledIcon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon used to visually represent the action in its context when the action is disabled. If omitted, the normal icon will simply appear greyed out. The path is relative to the location of the plugin.xml file of the contributing plug-in. The disabled icon will appear in the toolbar but not in the pulldown menu.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="hoverIcon" type="string">
-            <annotation>
-               <documentation>
-                  a relative path of an icon used to visually represent the action in its context when the mouse pointer is over the action. If omitted, the normal icon will be used. The path is relative to the location of the plugin.xml file of the contributing plug-in.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="tooltip" type="string">
-            <annotation>
-               <documentation>
-                  a translatable text representing the action&apos;s tool tip. Only used if the action appears in the toolbar.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="helpContextId" type="string">
-            <annotation>
-               <documentation>
-                  a unique identifier indicating the help context for this action. On some platforms, if the action appears as a menu item, then pressing the appropriate help key while the menu item is highlighted will display help. Not all platforms support this behaviour.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="style" use="default" value="push">
-            <annotation>
-               <documentation>
-                  an optional attribute to define the user interface style type for the action. If defined, the attribute value will be one of the following:
-    &lt;table border=&quot;0&quot; width=&quot;80%&quot;&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;push&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a regular menu item or tool item.&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;radio&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a radio style menu item or tool item. Actions with the radio style within the same menu or toolbar group behave as a radio set. The initial value is specified by the &lt;samp&gt;state&lt;/samp&gt; attribute.&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;toggle&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a checked style menu item or as a toggle tool item. The initial value is specified by the &lt;samp&gt;state&lt;/samp&gt; attribute.&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;pulldown&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- as a pulldown tool item. The initial value is specified by the &lt;samp&gt;state&lt;/samp&gt; attribute.&lt;/td&gt;
-      &lt;/tr&gt;    &lt;/table&gt;
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="push">
-                  </enumeration>
-                  <enumeration value="radio">
-                  </enumeration>
-                  <enumeration value="toggle">
-                  </enumeration>
-                  <enumeration value="pulldown">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="state" type="boolean">
-            <annotation>
-               <documentation>
-                  an optional attribute indicating the initial state (either &lt;samp&gt;true&lt;/samp&gt; or &lt;samp&gt;false&lt;/samp&gt;), used when the &lt;samp&gt;style&lt;/samp&gt; attribute has the value &lt;samp&gt;radio&lt;/samp&gt; or &lt;samp&gt;toggle&lt;/samp&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  name of the fully qualified class that implements &lt;samp&gt;org.eclipse.ui.IViewActionDelegate&lt;/samp&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.IViewActionDelegate"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="enablesFor" type="string">
-            <annotation>
-               <documentation>
-                  a value indicating the selection count which must be met to enable the action.
-If this attribute is specified and the condition is met, the action is enabled.
-If the condition is not met, the action is disabled.
-If no attribute is specified, the action is enabled for any number of items selected.
-The following attribute formats are supported: 
-    &lt;table border=&quot;0&quot; width=&quot;80%&quot;&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;!&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 0 items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;?&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 0 or 1 items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;+&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 1 or more items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;multiple, 2+&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- 2 or more items selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;n&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- a precise number of items selected.a precise number of items selected.&amp;nbsp;
-          For example: enablesFor=&amp;quot; 4&amp;quot; enables the action only when 4
-          items are selected&lt;/td&gt;
-      &lt;/tr&gt;
-      &lt;tr&gt;
- &lt;td valign=&quot;top&quot; width=&quot;25&quot;&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot; nowrap&gt;&lt;b&gt;*&lt;/b&gt;&lt;/td&gt;
-        &lt;td valign=&quot;top&quot;&gt;- any number of items selected&lt;/td&gt;
-      &lt;/tr&gt;
-    &lt;/table&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="mode">
-            <annotation>
-               <documentation>
-                  For actions appearing in a toolbar, &lt;code&gt;FORCE_TEXT&lt;/code&gt; will show text even if there is an icon.  See ActionContribuitonItem.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="FORCE_TEXT">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="parameter">
-      <annotation>
-         <documentation>
-            A parameter element to be used within an IExecutableExtension element.  This will be passed as initialization data to the instantiated class.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the parameter name
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="value" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the parameter value
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="class">
-      <annotation>
-         <documentation>
-            The element version of the &lt;code&gt;class&lt;/code&gt; attribute.  This is used when the class implements &lt;code&gt;org.eclipse.core.runtime.IExecutableExtension&lt;/code&gt; and there is parameterized data that you wish used in its initialization.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  A class that implements &lt;code&gt;org.eclipse.ui.IViewActionDelegate&lt;/code&gt;.  It may also implement &lt;code&gt;org.eclipse.core.runtime.IExecutableExtension&lt;/code&gt;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of a view action extension:
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.viewActions&quot;&gt; 
-      &lt;viewContribution 
-         id=&quot;com.xyz.xyzViewC1&quot; 
-         targetID=&quot;org.eclipse.ui.views.navigator.ResourceNavigator&quot;&gt; 
-         &lt;menu
-            id=&quot;com.xyz.xyzMenu&quot; 
-            label=&quot;XYZ Menu&quot; 
-            path=&quot;additions&quot;&gt; 
-            &lt;separator name=&quot;group1&quot;/&gt; 
-         &lt;/menu&gt; 
-         &lt;action
-            id=&quot;com.xyz.runXYZ&quot; 
-            label=&quot;&amp;amp;Run XYZ Tool&quot; 
-            menubarPath=&quot;com.xyz.xyzMenu/group1&quot; 
-            toolbarPath=&quot;Normal/additions&quot;
-            style=&quot;toggle&quot;
-            state=&quot;true&quot; 
-            icon=&quot;icons/runXYZ.gif&quot; 
-            tooltip=&quot;Run XYZ Tool&quot; 
-            helpContextId=&quot;com.xyz.run_action_context&quot; 
-            class=&quot;com.xyz.actions.RunXYZ&quot;&gt; 
-            &lt;selection class=&quot;org.eclipse.core.resources.IFile&quot; name=&quot;*.java&quot;/&gt; 
-         &lt;/action&gt; 
-     &lt;/viewContribution&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-In the example above, the specified action will only enable for a single selection (&lt;samp&gt;enablesFor&lt;/samp&gt; attribute). In addition, the object in the selection must be a Java file resource.
-&lt;/p&gt;
-&lt;p&gt;
-The following is an other example of a view action extension: 
-&lt;/p&gt;
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.viewActions&quot;&gt; 
-      &lt;viewContribution 
-         id=&quot;com.xyz.xyzViewC1&quot; 
-         targetID=&quot;org.eclipse.ui.views.navigator.ResourceNavigator&quot;&gt; 
-         &lt;menu
-            id=&quot;com.xyz.xyzMenu&quot; 
-            label=&quot;XYZ Menu&quot; 
-            path=&quot;additions&quot;&gt; 
-            &lt;separator name=&quot;group1&quot;/&gt; 
-         &lt;/menu&gt; 
-         &lt;action 
-            id=&quot;com.xyz.runXYZ2&quot; 
-            label=&quot;&amp;amp;Run XYZ2 Tool&quot; 
-            menubarPath=&quot;com.xyz.xyzMenu/group1&quot;
-            style=&quot;push&quot;
-            icon=&quot;icons/runXYZ2.gif&quot; 
-            tooltip=&quot;Run XYZ2 Tool&quot; 
-            helpContextId=&quot;com.xyz.run_action_context2&quot; 
-            class=&quot;com.xyz.actions.RunXYZ2&quot;&gt; 
-            &lt;enablement&gt;
-               &lt;and&gt;
-                  &lt;objectClass name=&quot;org.eclipse.core.resources.IFile&quot;/&gt;
-                  &lt;not&gt;
-                     &lt;objectState name=&quot;extension&quot; value=&quot;java&quot;/&gt;
-                  &lt;/not&gt;
-               &lt;/and&gt;
-            &lt;/enablement&gt;
-         &lt;/action&gt; 
-      &lt;/viewContribution&gt; 
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-&lt;p&gt;
-In the example above, the specified action will appear as a menu item. The action is enabled if the selection contains no Java file resources.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The value of the &lt;samp&gt;class&lt;/samp&gt; attribute must be a fully qualified name of a Java class that implements &lt;samp&gt;org.eclipse.ui.IViewActionDelegate&lt;/samp&gt;. This class is loaded as late as possible to avoid loading the entire plug-in before it is really needed.
-&lt;p&gt;
-The interface &lt;samp&gt;org.eclipse.ui.IViewActionDelegate&lt;/samp&gt; extends &lt;samp&gt;org.eclipse.ui.IActionDelegate&lt;/samp&gt; and adds an additional method that allows the 
-delegate to initialize with the view instance it is contributing into.
-&lt;/p&gt;
-&lt;p&gt;
-This extension point can be used to contribute actions into menus previously created by the target view. Omitting the menu path attribute will result in adding the new menu or action at the end of the pulldown menu.
-&lt;/p&gt;
-&lt;p&gt;
-The enablement criteria for an action extension is initially defined by &lt;samp&gt;enablesFor&lt;/samp&gt;, and also either &lt;samp&gt;selection&lt;/samp&gt; or &lt;samp&gt;enablement&lt;/samp&gt;. However, once the action delegate has been instantiated, it may control the action enable state directly within its &lt;samp&gt;selectionChanged&lt;/samp&gt; method.
-&lt;/p&gt;
-&lt;p&gt;
-Action and menu labels may contain special characters that encode mnemonics using the following rules:
-&lt;ol&gt;
-&lt;li&gt;
-Mnemonics are specified using the ampersand (&apos;&amp;amp;&apos;) character in front
-of a selected character in the translated text. Since ampersand is not
-allowed in XML strings, use &lt;samp&gt;&amp;amp;amp;&lt;/samp&gt; character entity.&lt;/li&gt;
-&lt;/ol&gt;
-If two or more actions are contributed to a menu or toolbar by a single extension the actions will appear in the reverse order of how they are listed in the plugin.xml file. This behavior is admittedly unintuitive.  However, it was discovered after the  Eclipse Platform API was frozen.  Changing the behavior now would break every plug-in which relies upon the existing behavior.
-&lt;p&gt;
-The &lt;samp&gt;selection&lt;/samp&gt; and &lt;samp&gt;enablement&lt;/samp&gt; elements are mutually exclusive. The &lt;samp&gt;enablement&lt;/samp&gt; element can replace the &lt;samp&gt;selection&lt;/samp&gt; element using the sub-elements &lt;samp&gt;objectClass&lt;/samp&gt; and &lt;samp&gt;objectState&lt;/samp&gt;. For example, the following:
-&lt;pre&gt;
- &lt;selection
-  class=&quot;org.eclipse.core.resources.IFile&quot;
-  name=&quot;*.java&quot;&gt;
- &lt;/selection&gt;
-&lt;/pre&gt;
-can be expressed using:
-&lt;pre&gt;
- &lt;enablement&gt;
-  &lt;and&gt;
-   &lt;objectClass name=&quot;org.eclipse.core.resources.IFile&quot;/&gt;
-   &lt;objectState name=&quot;extension&quot; value=&quot;java&quot;/&gt;
-  &lt;/and&gt;
- &lt;/enablement&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         Each view normally comes with a number of standard items on the pulldown menu and local toolbar. Additions from other plug-ins will be appended to the standard complement.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/views.exsd b/bundles/org.eclipse.ui/schema/views.exsd
deleted file mode 100644
index 67abc79..0000000
--- a/bundles/org.eclipse.ui/schema/views.exsd
+++ /dev/null
@@ -1,311 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.ui" id="views" name="Views"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to define additional views 
-for the workbench.  A view is a visual component 
-within a workbench page.  It is typically used to 
-navigate a hierarchy of information (like the workspace), 
-open an editor,  or display properties for 
-the active editor.  The user can make a view 
-visible from the Window &gt; Show View menu or close it from the 
-view local title bar. 
-&lt;p&gt;
-In order to reduce the visual clutter in the Show View Dialog, views should be grouped using categories.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <choice minOccurs="0" maxOccurs="unbounded">
-            <element ref="category"/>
-            <element ref="view"/>
-            <element ref="stickyView"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="category">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this category
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name that will be used in the UI for this category
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="parentCategory" type="string">
-            <annotation>
-               <documentation>
-                  an optional path composed of category IDs separated by &apos;/&apos;. This
-allows the creation of a hierarchy of categories.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.views/category/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="view">
-      <complexType>
-         <sequence>
-            <element ref="description" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that will be used to identify this view
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a translatable name that will be used in the UI for this view
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="category" type="string">
-            <annotation>
-               <documentation>
-                  an optional attribute that is composed of the category IDs separated
-by &apos;/&apos;. Each referenced category must be declared in a corresponding category element.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.views/category/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified name of the class that implements 
-&lt;samp&gt;org.eclipse.ui.IViewPart&lt;/samp&gt;. A common practice 
-is to subclass &lt;samp&gt;org.eclipse.ui.part.ViewPart&lt;/samp&gt; 
-in order to inherit the default functionality.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.part.ViewPart"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  a relative name of the icon that will 
-be associated with the view.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="fastViewWidthRatio" type="string">
-            <annotation>
-               <documentation>
-                  the percentage of the width of the workbench that the view will take up as an active fast view.
-This must be defined as a floating point value and lie between 0.05 and 0.95.
-If no value is supplied, a default ratio will be used.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="allowMultiple" type="boolean">
-            <annotation>
-               <documentation>
-                  flag indicating whether this view allows multiple instances to be created using IWorkbenchPage.showView(String id, String secondaryId).  The default is false.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="restorable" type="boolean" use="default" value="true">
-            <annotation>
-               <documentation>
-                  flag indicating whether this view allows to be restored upon workbench restart. If set to false, the view will not be open after a workbench restart. The default is true.
-&lt;p&gt;
-Since: 3.4
-&lt;/p&gt;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="description" type="string">
-      <annotation>
-         <appInfo>
-            <meta.element translatable="true"/>
-         </appInfo>
-         <documentation>
-            an optional subelement whose body should contain text providing a short description of the view.
-         </documentation>
-      </annotation>
-   </element>
-
-   <element name="stickyView">
-      <annotation>
-         <documentation>
-            A sticky view is a view that will appear by default across all perspectives in a window once it is opened.  Its initial placement is governemed by the location attribute, but nothing prevents it from being moved or closed by the user.  Use of this element will only cause a placeholder for the view to be created, it will not show the view.  Please note that usage of this element should be done with great care and should only be applied to views that truely have a need to live across perspectives.
-
-Since 3.0
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the id of the view to be made sticky.
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier" basedOn="org.eclipse.ui.views/view/@id"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="location">
-            <annotation>
-               <documentation>
-                  optional attribute that specifies the location of the sticky view relative to the editor area.  If absent, the view will be docked to the right of the editor area.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="RIGHT">
-                  </enumeration>
-                  <enumeration value="LEFT">
-                  </enumeration>
-                  <enumeration value="TOP">
-                  </enumeration>
-                  <enumeration value="BOTTOM">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="closeable" type="boolean">
-            <annotation>
-               <documentation>
-                  optional attribute that specifies wether the view should be closeable.  If absent it will be closeable.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="moveable" type="boolean">
-            <annotation>
-               <documentation>
-                  optional attribute that specifies wether the view should be moveable.  If absent it will be moveable.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of the extension point: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.views&quot;&gt; 
-      &lt;category 
-         id=&quot;com.xyz.views.XYZviews&quot; 
-         name=&quot;XYZ&quot;/&gt; 
-      &lt;view 
-         id=&quot;com.xyz.views.XYZView&quot; 
-         name=&quot;XYZ View&quot; 
-         category=&quot;com.xyz.views.XYZviews&quot; 
-         class=&quot;com.xyz.views.XYZView&quot; 
-         icon=&quot;icons/XYZ.gif&quot;/&gt;
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-The following is an example of a sticky view declaration:
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.ui.views&quot;&gt; 
-      &lt;stickyView
-         id=&quot;com.xyz.views.XYZView&quot; /&gt;
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         The value of the &lt;samp&gt;class&lt;/samp&gt; attribute must be a 
-fully qualified name of the class that implements 
-&lt;samp&gt;org.eclipse.ui.IViewPart&lt;/samp&gt;.  It is common 
-practice to subclass &lt;samp&gt;org.eclipse.ui.part.ViewPart&lt;/samp&gt;
- when developing a new view.
-      </documentation>
-   </annotation>
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         The Eclipse Platform provides a number of standard views including Navigator, Properties, Outline and Tasks. From the user point of view, these views are no different from any other view provided by the plug-ins. All the views can be shown from the &quot;Show View&quot; submenu of the &quot;Window&quot; menu. The position of a view is persistent: it is saved when the view is closed and restored when the view is reopened in a single session.  The position is also persisted between workbench sessions.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2002, 2005 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/schema/workingSets.exsd b/bundles/org.eclipse.ui/schema/workingSets.exsd
deleted file mode 100644
index 457520d..0000000
--- a/bundles/org.eclipse.ui/schema/workingSets.exsd
+++ /dev/null
@@ -1,192 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui" id="workingSets" name="Working Sets"/>
-      </appInfo>
-      <documentation>
-         This extension point is used to define a working set wizard page. Working sets contain a number of elements of type IAdaptable and can be used to group elements for presentation to the user or for operations on a set of elements. A working set wizard page is used to create and edit working sets that contain elements of a specific type.  An updater class is capable of monitoring for changes in resources contained within working sets and an element adapter class is able to transform resources prior to inclusion in the working set.
-&lt;p&gt;
-To select a working set the user is presented with a list of working sets that exist in the workbench. From that list a working set can be selected and edited using one of the wizard pages defined using this extension point. An existing working set is always edited with the wizard page that was used to create it or with the default resource based working set page if the original page is not available.
-&lt;p&gt;
-A new working set can be defined by the user from the same working set selection dialog. When a new working set is defined, the plugin provided wizard page is preceded by a page listing all available working set types. This list is made up of the name attribute values of each working set extension. 
-&lt;p&gt;
-Views provide a user interface to open the working set selection dialog and must store the selected working set.
-&lt;p&gt;
-The resource navigator uses a working set to filter elements from the navigator view. Only parents and children of working set elements are shown in the view, in addition to the working set elements themselves.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="workingSet" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  an optional identifier of the extension instance
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="workingSet">
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a unique name that can be used to identify this working set dialog.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the element type that will be displayed and edited by the working set page. This should be a descriptive name like &quot;Resource&quot; or &quot;Java Element&quot;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  a brief description of this working set type.  This should likely include the general kinds of elements that can be added to the set.
-Added in 3.4.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  the relative path of an image that will be displayed in the working set type list on the first page of the working set creation wizard as well as in the working set selection dialog.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="pageClass" type="string">
-            <annotation>
-               <documentation>
-                  the fully qualified name of a Java class implementing &lt;samp&gt;org.eclipse.ui.dialogs.IWorkingSetPage&lt;/samp&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jface.wizard.WizardPage:org.eclipse.ui.dialogs.IWorkingSetPage"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="updaterClass" type="string">
-            <annotation>
-               <documentation>
-                  the fully qualified name of a Java class implementing &lt;samp&gt;org.eclipse.ui.IWorkingSetUpdater&lt;/samp&gt;.  Use of this attribute will not cause eager plug-in activation.  This class will only be instantiated when the declaring bundle is otherwise activated.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.IWorkingSetUpdater"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="elementAdapterClass" type="string">
-            <annotation>
-               <documentation>
-                  the fully qualified name of a Java class implementing &lt;samp&gt;org.eclipse.ui.IWorkingSetElementAdapter&lt;/samp&gt;.  Use of this attribute will not cause eager plug-in activation.  This class will only be instantiated when the declaring bundle is otherwise activated. Added in 3.3.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.ui.IWorkingSetElementAdapter"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         Release 2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         Following is an example of how the resource working set dialog extension is defined to display and edit generic IResource elements.  Additionally, it supplies an updaterClass that can handle removal and addition of resources on the fly as well as an elementAdapterClass that is capable of adapting objects to IResources. 
-&lt;p&gt;
-&lt;pre&gt;
-    &lt;extension point=&quot;org.eclipse.ui.workingSets&quot;&gt;
-        &lt;workingSet
-            id=&quot;org.eclipse.ui.resourceWorkingSetPage&quot;
-            name=&quot;Resource&quot;
-            description=&quot;Contains basic resources (files, folders, and projects)&quot;
-            icon=&quot;icons/resworkset.gif&quot;
-            pageClass=&quot;org.eclipse.ui.internal.dialogs.ResourceWorkingSetPage&quot;
-            updaterClass=&quot;org.eclipse.ui.internal.workingsets.ResourceWorkingSetUpdater&quot;
-            elementAdapterClass=&quot;org.eclipse.ui.internal.workingsets.ResourceWorkingSetElementAdapter&quot;&gt;
-        &lt;/workingSet&gt;
-    &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         The value of the pageClass attribute must represent a class that implements the &lt;samp&gt;org.eclipse.ui.dialogs.IWorkingSetPage&lt;/samp&gt; interface.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         The workbench provides a working set wizard page for creating and editing resource based working sets.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2002, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.ui/scripts/exportplugin.xml b/bundles/org.eclipse.ui/scripts/exportplugin.xml
deleted file mode 100644
index a6ac6d3..0000000
--- a/bundles/org.eclipse.ui/scripts/exportplugin.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<!-- build script to create a plugin from org.eclipse.ui -->
-<project name="Export Eclipse UI" default="exportAll" basedir="..">
-	<target name="init">
-		<tstamp/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="plugin"  value="org.eclipse.ui" />
-		<property name="qualifier" value="zzz${DSTAMP}-${TSTAMP}" />
-		
-		<!-- define property ${plugin_version} by reading version from MANIFEST.MF: -->
-		<tempfile property="plugin_version_file" suffix=".plugin_version.tmp" destdir="${destdir}"/>
-		<copy file="META-INF/MANIFEST.MF" tofile="${plugin_version_file}"/>
-		<replaceregexp file="${plugin_version_file}" match=".*Bundle-Version: ((\d)+\.(\d)+\.(\d)+\.)qualifier.*" replace="plugin_version=_\1${qualifier}" flags="s" />
-		<property file="${plugin_version_file}"/>
-		<delete file="${plugin_version_file}" />
-		
-		<property name="dest"  value="${destdir}/${plugin}${plugin_version}" />
-		<property name="destjar"  value="${destdir}/${plugin}${plugin_version}.jar" />
-	</target>
-
-	<target name="build" depends="init">
-    	<eclipse.incrementalBuild project="${plugin}" kind="incr"/>
-	</target>
-
-	<target name="export" depends="build">
-		<mkdir dir="${destdir}" />
-		<delete file="${destjar}" />
-		<delete dir="${dest}" />
-		<mkdir dir="${dest}" />
-		
-		<copy todir="${dest}/META-INF">
-			<fileset dir="META-INF" />
-		</copy>		
-		
-		<replaceregexp file="${dest}/META-INF/MANIFEST.MF" match="Bundle-Version: ((\d)+\.(\d)+\.(\d)+\.)qualifier" replace="Bundle-Version: \1${qualifier}" byline="true" />
-		
-		<zip zipfile="${destjar}">
-			<fileset dir=".">
-			  <include name="plugin.xml" />
-			  <include name="plugin.properties" />
-			  <include name="icons/**" />
-			  <include name=".options" />
-			  <include name="schema/**" />
-			  <include name="src/**" />
-			</fileset>
-			<fileset dir="bin" />
-			<fileset dir="${dest}">
-			  <include name="META-INF/**" />
-			</fileset>
-		</zip>
-		
-		<delete dir="${dest}" />
-		
-	</target>
-
-	<target name="exportAll">
-		<antcall target="export"/>
-		<ant antfile="scripts/exportplugin.xml" dir="../org.eclipse.text" target="export"/>
-		<ant antfile="scripts/exportplugin.xml" dir="../org.eclipse.jface" target="export"/>
-		<ant antfile="scripts/exportplugin.xml" dir="../org.eclipse.jface.text" target="export"/>
-		<ant antfile="scripts/exportplugin.xml" dir="../org.eclipse.ui.views" target="export"/>
-		<ant antfile="scripts/exportplugin.xml" dir="../org.eclipse.ui.editors" target="export"/>
-		<ant antfile="scripts/exportplugin.xml" dir="../org.eclipse.ui.workbench" target="export"/>
-		<ant antfile="scripts/exportplugin.xml" dir="../org.eclipse.ui.workbench.texteditor" target="export"/>
-	</target>
-
-</project>
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui/src/org/eclipse/ui/internal/UIPlugin.java b/bundles/org.eclipse.ui/src/org/eclipse/ui/internal/UIPlugin.java
deleted file mode 100644
index 5153822..0000000
--- a/bundles/org.eclipse.ui/src/org/eclipse/ui/internal/UIPlugin.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.ui.internal.util.PrefUtil;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The plug-in class for the org.eclipse.ui plug-in.
- * This class is internal to the workbench and should not be
- * referenced by clients.
- */
-public final class UIPlugin extends AbstractUIPlugin {
-
-    private static UIPlugin inst;
-
-    /**
-     * Creates an instance of the UIPlugin.
-     * 
-     * @since 3.0
-     */
-    public UIPlugin() {
-        super();
-        inst = this;
-    }
-
-    /**
-     * Returns the image registry for this plugin.
-     *
-     * Where are the images?  The images (typically gifs) are found in the 
-     * same plugins directory.
-     *
-     * @see ImageRegistry
-     *
-     * Note: The workbench uses the standard JFace ImageRegistry to track its images. In addition 
-     * the class WorkbenchGraphicResources provides convenience access to the graphics resources 
-     * and fast field access for some of the commonly used graphical images.
-     */
-    protected ImageRegistry createImageRegistry() {
-        /* Just to be sure that we don't access this
-         * plug-ins image registry.
-         */
-        Assert.isLegal(false);
-        return null;
-    }
-
-    public ImageRegistry getImageRegistry() {
-        /* Just to be sure that we don't access this
-         * plug-ins image registry.
-         */
-        Assert.isLegal(false);
-        return null;
-    }
-
-    /**
-     * Returns the default instance of the receiver. This represents the runtime plugin.
-     *
-     * @return UIPlugin the singleton instance of the receiver.
-     * @see AbstractUIPlugin for the typical implementation pattern for plugin classes.
-     */
-    public static UIPlugin getDefault() {
-        return inst;
-    }
-
- 
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-     */
-    public void start(BundleContext context) throws Exception {
-        super.start(context);
-
-        // set a callback allowing the workbench plugin to obtain
-        // and save the UI plugin's preference store
-        PrefUtil.setUICallback(new PrefUtil.ICallback() {
-            public IPreferenceStore getPreferenceStore() {
-                return UIPlugin.this.getPreferenceStore();
-            }
-
-            public void savePreferences() {
-                UIPlugin.this.savePluginPreferences();
-            }
-        });
-    }
-}
diff --git a/bundles/org.eclipse.ui/src/org/eclipse/ui/internal/UIPreferenceInitializer.java b/bundles/org.eclipse.ui/src/org/eclipse/ui/internal/UIPreferenceInitializer.java
deleted file mode 100644
index 693e7fe..0000000
--- a/bundles/org.eclipse.ui/src/org/eclipse/ui/internal/UIPreferenceInitializer.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Kiryl Kazakevich, Intel - bug 88359
- *     Tonny Madsen, RCP Company - bug 201055
- *******************************************************************************/
-package org.eclipse.ui.internal;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.NodeChangeEvent;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.SWT;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.keys.IBindingService;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * Implementation of the UI plugin's preference extension's customization
- * element. This is needed in order to force the UI plugin's preferences to be
- * initialized properly when running without
- * org.eclipse.core.runtime.compatibility. For more details, see bug 58975 - New
- * preference mechanism does not properly initialize defaults.
- * 
- * @since 3.0
- */
-public class UIPreferenceInitializer extends AbstractPreferenceInitializer {
-
-	public void initializeDefaultPreferences() {
-
-		
-		IScopeContext context = new DefaultScope();
-		IEclipsePreferences node = context.getNode(UIPlugin.getDefault()
-				.getBundle().getSymbolicName());
-		node.put(IWorkbenchPreferenceConstants.OPEN_NEW_PERSPECTIVE,
-				IWorkbenchPreferenceConstants.OPEN_PERSPECTIVE_REPLACE);
-
-		// Deprecated but kept for backwards compatibility
-		node.put(IWorkbenchPreferenceConstants.PROJECT_OPEN_NEW_PERSPECTIVE,
-				IWorkbenchPreferenceConstants.OPEN_PERSPECTIVE_REPLACE);
-		node.put(IWorkbenchPreferenceConstants.SHIFT_OPEN_NEW_PERSPECTIVE,
-				IWorkbenchPreferenceConstants.OPEN_PERSPECTIVE_REPLACE);
-		node.put(IWorkbenchPreferenceConstants.ALTERNATE_OPEN_NEW_PERSPECTIVE,
-				IWorkbenchPreferenceConstants.OPEN_PERSPECTIVE_REPLACE);
-
-		// Although there is no longer any item on the preference pages
-		// for setting the linking preference, since it is now a per-part
-		// setting, it remains as a preference to allow product overrides of the
-		// initial state of linking in the Navigator. By default, linking is
-		// off.
-		node.putBoolean(IWorkbenchPreferenceConstants.LINK_NAVIGATOR_TO_EDITOR,
-				false);
-
-		// Appearance / Presentation preferences
-		node.put(IWorkbenchPreferenceConstants.PRESENTATION_FACTORY_ID,
-				IWorkbenchConstants.DEFAULT_PRESENTATION_ID);
-		node
-				.putBoolean(
-						IWorkbenchPreferenceConstants.SHOW_TRADITIONAL_STYLE_TABS,
-						true);
-		node.putBoolean(IWorkbenchPreferenceConstants.ENABLE_ANIMATIONS, true);
-		node.putBoolean(IWorkbenchPreferenceConstants.USE_COLORED_LABELS, true);
-		node.put(IWorkbenchPreferenceConstants.DOCK_PERSPECTIVE_BAR,
-				IWorkbenchPreferenceConstants.TOP_LEFT);
-		node.putBoolean(
-				IWorkbenchPreferenceConstants.SHOW_TEXT_ON_PERSPECTIVE_BAR,
-				true);
-		node.putBoolean(
-				IWorkbenchPreferenceConstants.SHOW_OTHER_IN_PERSPECTIVE_MENU,
-				true);
-		node.putBoolean(
-				IWorkbenchPreferenceConstants.SHOW_OPEN_ON_PERSPECTIVE_BAR,
-				true);
-
-		// the fast view bar should be on the bottom of a fresh workspace
-		node.put(IWorkbenchPreferenceConstants.INITIAL_FAST_VIEW_BAR_LOCATION,
-				IWorkbenchPreferenceConstants.BOTTOM);
-
-		// default to showing intro on startup
-		node.putBoolean(IWorkbenchPreferenceConstants.SHOW_INTRO, true);
-
-		// Default to the standard key configuration.
-		node.put(IWorkbenchPreferenceConstants.KEY_CONFIGURATION_ID,
-				IBindingService.DEFAULT_DEFAULT_ACTIVE_SCHEME_ID);
-
-		// Preference for showing system jobs in the jobs view
-		node.putBoolean(IWorkbenchPreferenceConstants.SHOW_SYSTEM_JOBS, false);
-
-		// The default minimum character width for editor tabs is undefined
-		// (i.e., -1)
-		node
-				.putInt(
-						IWorkbenchPreferenceConstants.EDITOR_MINIMUM_CHARACTERS,
-						-1);
-
-		// The default minimum character width for view tabs is 1
-		node.putInt(IWorkbenchPreferenceConstants.VIEW_MINIMUM_CHARACTERS, 1);
-
-		// Default for closing editors on exit.
-		node.putBoolean(IWorkbenchPreferenceConstants.CLOSE_EDITORS_ON_EXIT,
-				false);
-
-		// Default for using window working sets
-		node
-				.putBoolean(
-						IWorkbenchPreferenceConstants.USE_WINDOW_WORKING_SET_BY_DEFAULT,
-						false);
-
-		// Default for showing filter text widget that determines what is shown
-		// in a FilteredTree
-		node
-				.putBoolean(IWorkbenchPreferenceConstants.SHOW_FILTERED_TEXTS,
-						true);
-
-		// Default for enabling detached views
-		node.putBoolean(IWorkbenchPreferenceConstants.ENABLE_DETACHED_VIEWS,
-				true);
-
-		// Default for prompting for save when saveables are still held on to by
-		// other parts
-		node.putBoolean(
-				IWorkbenchPreferenceConstants.PROMPT_WHEN_SAVEABLE_STILL_OPEN,
-				true);
-
-		// Default the min/max behaviour to the old (3.2) style
-		node.putBoolean(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, true);
-
-		// By default the Fast View Bar allows to select a new fast view from
-		// the view list
-		node.putBoolean(IWorkbenchPreferenceConstants.DISABLE_NEW_FAST_VIEW,
-				false);
-
-		// Default the sticky view close behaviour to the new style
-		node.putBoolean(
-				IWorkbenchPreferenceConstants.ENABLE_32_STICKY_CLOSE_BEHAVIOR,
-				false);
-
-		node.putInt(IWorkbenchPreferenceConstants.VIEW_TAB_POSITION, SWT.TOP);
-		node.putInt(IWorkbenchPreferenceConstants.EDITOR_TAB_POSITION, SWT.TOP);
-		node.putBoolean(
-				IWorkbenchPreferenceConstants.SHOW_MULTIPLE_EDITOR_TABS, true);
-
-		migrateInternalPreferences();
-
-		IEclipsePreferences rootNode = (IEclipsePreferences) Platform
-				.getPreferencesService().getRootNode()
-				.node(InstanceScope.SCOPE);
-
-		final String uiName = UIPlugin.getDefault().getBundle()
-				.getSymbolicName();
-		try {
-			if (rootNode.nodeExists(uiName)) {
-				((IEclipsePreferences) rootNode.node(uiName))
-						.addPreferenceChangeListener(PlatformUIPreferenceListener
-								.getSingleton());
-			}
-		} catch (BackingStoreException e) {
-			IStatus status = new Status(IStatus.ERROR, UIPlugin.getDefault()
-					.getBundle().getSymbolicName(), IStatus.ERROR, e
-					.getLocalizedMessage(), e);
-			UIPlugin.getDefault().getLog().log(status);
-		}
-
-		rootNode
-				.addNodeChangeListener(new IEclipsePreferences.INodeChangeListener() {
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see
-					 * org.eclipse.core.runtime.preferences.IEclipsePreferences
-					 * .INodeChangeListener
-					 * #added(org.eclipse.core.runtime.preferences
-					 * .IEclipsePreferences.NodeChangeEvent)
-					 */
-					public void added(NodeChangeEvent event) {
-						if (!event.getChild().name().equals(uiName)) {
-							return;
-						}
-						((IEclipsePreferences) event.getChild())
-								.addPreferenceChangeListener(PlatformUIPreferenceListener
-										.getSingleton());
-
-					}
-
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see
-					 * org.eclipse.core.runtime.preferences.IEclipsePreferences
-					 * .INodeChangeListener
-					 * #removed(org.eclipse.core.runtime.preferences
-					 * .IEclipsePreferences.NodeChangeEvent)
-					 */
-					public void removed(NodeChangeEvent event) {
-						// Nothing to do here
-
-					}
-
-				});
-	}
-
-	/**
-	 * Migrate any old internal preferences to the API store.
-	 */
-	private void migrateInternalPreferences() {
-
-		IPreferenceStore internalStore = WorkbenchPlugin.getDefault()
-				.getPreferenceStore();
-		IPreferenceStore apiStore = PlatformUI.getPreferenceStore();
-		// Is there a value there?
-		if (internalStore
-				.contains(IWorkbenchPreferenceConstants.VIEW_TAB_POSITION)) {
-			apiStore.setValue(IWorkbenchPreferenceConstants.VIEW_TAB_POSITION,
-					internalStore.getInt(IWorkbenchPreferenceConstants.VIEW_TAB_POSITION));
-			internalStore
-				.setToDefault(IWorkbenchPreferenceConstants.VIEW_TAB_POSITION);
-		}		
-
-		// Is there a value there?
-		if (internalStore
-				.contains(IWorkbenchPreferenceConstants.EDITOR_TAB_POSITION)) {
-				
-			apiStore.setValue(
-					IWorkbenchPreferenceConstants.EDITOR_TAB_POSITION,
-					internalStore.getInt(IWorkbenchPreferenceConstants.EDITOR_TAB_POSITION));
-			internalStore
-				.setToDefault(IWorkbenchPreferenceConstants.EDITOR_TAB_POSITION);
-		}
-
-		// As default is true we need to check if a value was set
-
-		if (internalStore
-				.contains(IWorkbenchPreferenceConstants.SHOW_MULTIPLE_EDITOR_TABS)) {
-			apiStore
-					.setValue(
-							IWorkbenchPreferenceConstants.SHOW_MULTIPLE_EDITOR_TABS,
-							internalStore
-							.getBoolean(IWorkbenchPreferenceConstants.SHOW_MULTIPLE_EDITOR_TABS));
-			internalStore
-					.setToDefault(IWorkbenchPreferenceConstants.SHOW_MULTIPLE_EDITOR_TABS);
-		}
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/.classpath b/examples/org.eclipse.jface.examples.databinding/.classpath
deleted file mode 100644
index ce73933..0000000
--- a/examples/org.eclipse.jface.examples.databinding/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/examples/org.eclipse.jface.examples.databinding/.cvsignore b/examples/org.eclipse.jface.examples.databinding/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/examples/org.eclipse.jface.examples.databinding/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/examples/org.eclipse.jface.examples.databinding/.project b/examples/org.eclipse.jface.examples.databinding/.project
deleted file mode 100644
index 0ccc228..0000000
--- a/examples/org.eclipse.jface.examples.databinding/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jface.examples.databinding</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.jem.workbench.JavaEMFNature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.jem.beaninfo.BeanInfoNature</nature>
-	</natures>
-</projectDescription>
diff --git a/examples/org.eclipse.jface.examples.databinding/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.jface.examples.databinding/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 26cba41..0000000
--- a/examples/org.eclipse.jface.examples.databinding/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,357 +0,0 @@
-#Wed Apr 02 12:20:32 GMT-07:00 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=ignore
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=80
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=tab
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/examples/org.eclipse.jface.examples.databinding/.settings/org.eclipse.jdt.ui.prefs b/examples/org.eclipse.jface.examples.databinding/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 8079ff0..0000000
--- a/examples/org.eclipse.jface.examples.databinding/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,116 +0,0 @@
-#Mon Dec 03 13:55:50 EST 2007
-cleanup.add_default_serial_version_id=true
-cleanup.add_generated_serial_version_id=false
-cleanup.add_missing_annotations=true
-cleanup.add_missing_deprecated_annotations=true
-cleanup.add_missing_methods=false
-cleanup.add_missing_nls_tags=false
-cleanup.add_missing_override_annotations=true
-cleanup.add_serial_version_id=false
-cleanup.always_use_blocks=true
-cleanup.always_use_parentheses_in_expressions=false
-cleanup.always_use_this_for_non_static_field_access=false
-cleanup.always_use_this_for_non_static_method_access=false
-cleanup.convert_to_enhanced_for_loop=false
-cleanup.correct_indentation=false
-cleanup.format_source_code=false
-cleanup.format_source_code_changes_only=false
-cleanup.make_local_variable_final=true
-cleanup.make_parameters_final=false
-cleanup.make_private_fields_final=true
-cleanup.make_variable_declarations_final=false
-cleanup.never_use_blocks=false
-cleanup.never_use_parentheses_in_expressions=true
-cleanup.organize_imports=false
-cleanup.qualify_static_field_accesses_with_declaring_class=false
-cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-cleanup.qualify_static_member_accesses_with_declaring_class=true
-cleanup.qualify_static_method_accesses_with_declaring_class=false
-cleanup.remove_private_constructors=true
-cleanup.remove_trailing_whitespaces=false
-cleanup.remove_trailing_whitespaces_all=true
-cleanup.remove_trailing_whitespaces_ignore_empty=false
-cleanup.remove_unnecessary_casts=true
-cleanup.remove_unnecessary_nls_tags=true
-cleanup.remove_unused_imports=true
-cleanup.remove_unused_local_variables=false
-cleanup.remove_unused_private_fields=true
-cleanup.remove_unused_private_members=false
-cleanup.remove_unused_private_methods=true
-cleanup.remove_unused_private_types=true
-cleanup.sort_members=false
-cleanup.sort_members_all=false
-cleanup.use_blocks=false
-cleanup.use_blocks_only_for_return_and_throw=false
-cleanup.use_parentheses_in_expressions=false
-cleanup.use_this_for_non_static_field_access=false
-cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-cleanup.use_this_for_non_static_method_access=false
-cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-cleanup_profile=org.eclipse.jdt.ui.default.eclipse_clean_up_profile
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=false
-formatter_profile=org.eclipse.jdt.ui.default.eclipse_profile
-formatter_settings_version=11
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.ignorelowercasenames=true
-org.eclipse.jdt.ui.importorder=java;javax;org;com;
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.ondemandthreshold=99
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.staticondemandthreshold=99
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} The ${bare_field_name} to set.\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n ******************************************************************************/\r\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @since 3.2\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template></templates>
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.format_source_code=false
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=false
-sp_cleanup.organize_imports=true
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=false
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/examples/org.eclipse.jface.examples.databinding/.settings/org.eclipse.pde.prefs b/examples/org.eclipse.jface.examples.databinding/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 122c936..0000000
--- a/examples/org.eclipse.jface.examples.databinding/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,18 +0,0 @@
-#Mon Dec 03 13:55:50 EST 2007
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=0
-compilers.p.illegal-att-value=0
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=2
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/examples/org.eclipse.jface.examples.databinding/META-INF/MANIFEST.MF b/examples/org.eclipse.jface.examples.databinding/META-INF/MANIFEST.MF
deleted file mode 100644
index add7803..0000000
--- a/examples/org.eclipse.jface.examples.databinding/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jface.examples.databinding
-Bundle-Version: 1.0.100.qualifier
-Bundle-ClassPath: .
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.jface,
- org.eclipse.core.databinding,
- org.eclipse.core.runtime,
- org.eclipse.core.databinding.beans,
- org.eclipse.jface.databinding
-Export-Package: org.eclipse.jface.examples.databinding;x-internal:=false,
- org.eclipse.jface.examples.databinding.mask;x-internal:=false,
- org.eclipse.jface.examples.databinding.mask.internal;x-internal:=true,
- org.eclipse.jface.examples.databinding.model;x-internal:=false,
- org.eclipse.jface.examples.databinding.radioGroup;x-internal:=false
-Import-Package: com.ibm.icu.text
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/examples/org.eclipse.jface.examples.databinding/about.html b/examples/org.eclipse.jface.examples.databinding/about.html
deleted file mode 100644
index 4602330..0000000
--- a/examples/org.eclipse.jface.examples.databinding/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.jface.examples.databinding/build.properties b/examples/org.eclipse.jface.examples.databinding/build.properties
deleted file mode 100644
index 72c23de..0000000
--- a/examples/org.eclipse.jface.examples.databinding/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = .,\
-               META-INF/,\
-               plugin.properties,\
-               about.html
-output.databindingexamples.jar = bin/
-src.includes = about.html
-source.. = src/
diff --git a/examples/org.eclipse.jface.examples.databinding/plugin.properties b/examples/org.eclipse.jface.examples.databinding/plugin.properties
deleted file mode 100644
index 759e715..0000000
--- a/examples/org.eclipse.jface.examples.databinding/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName = JFace Data Binding Examples
-providerName = Eclipse.org
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/ModelObject.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/ModelObject.java
deleted file mode 100644
index 3e2acf3..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/ModelObject.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-public class ModelObject {
-	private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(
-			this);
-	private String id;
-
-	public void addPropertyChangeListener(PropertyChangeListener listener) {
-		propertyChangeSupport.addPropertyChangeListener(listener);
-	}
-
-	public void addPropertyChangeListener(String propertyName,
-			PropertyChangeListener listener) {
-		propertyChangeSupport.addPropertyChangeListener(propertyName, listener);
-	}
-
-	public void removePropertyChangeListener(PropertyChangeListener listener) {
-		propertyChangeSupport.removePropertyChangeListener(listener);
-	}
-
-	public void removePropertyChangeListener(String propertyName,
-			PropertyChangeListener listener) {
-		propertyChangeSupport.removePropertyChangeListener(propertyName,
-				listener);
-	}
-
-	protected void firePropertyChange(String propertyName, Object oldValue,
-			Object newValue) {
-		propertyChangeSupport.firePropertyChange(propertyName, oldValue,
-				newValue);
-	}
-	
-	protected void firePropertyChange(String propertyName, int oldValue,
-			int newValue) {
-		propertyChangeSupport.firePropertyChange(propertyName, oldValue,
-				newValue);
-	}
-	
-	protected void firePropertyChange(String propertyName, boolean oldValue,
-			boolean newValue) {
-		propertyChangeSupport.firePropertyChange(propertyName, oldValue,
-				newValue);
-	}
-
-	public void setId(String string) {
-		Object oldValue = id;
-		id = string;
-		firePropertyChange("id", oldValue, id);
-	}
-
-	protected Object[] append(Object[] array, Object object) {
-		List newList = new ArrayList(Arrays.asList(array));
-		newList.add(object);
-		return newList.toArray((Object[]) Array.newInstance(array.getClass()
-				.getComponentType(), newList.size()));
-	}
-
-	protected Object[] remove(Object[] array, Object object) {
-		List newList = new ArrayList(Arrays.asList(array));
-		newList.remove(object);
-		return newList.toArray((Object[]) Array.newInstance(array.getClass()
-				.getComponentType(), newList.size()));
-	}
-	
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/AsynchronousTestSet.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/AsynchronousTestSet.java
deleted file mode 100644
index 9669115..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/AsynchronousTestSet.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.contentprovider.test;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Random;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.set.ObservableSet;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Test set that simulates asynchronously computed elements. The elements of the
- * set are randomly generated Integers. Whenever the "recompute" method is
- * called, the set will spin off a job that sleeps for a period of time and then
- * randomly adds and removes elements from the set.
- * 
- * <p>
- * This simulates a set that wraps a database query or network communication.
- * These would follow the same pattern (report the set as "stale", perform some
- * slow operation, then make changes to the set).
- * </p>
- * 
- * @since 1.0
- */
-public class AsynchronousTestSet extends ObservableSet {
-
-	private static Random randomNumberGenerator = new Random();
-
-	private Display display;
-
-	private boolean stale = false;
-
-	/**
-	 * Average number of elements to add or remove
-	 */
-	private static final int AVERAGE_DELTA = 4;
-
-	/**
-	 * Average "computation" time -- time taken to do the simulated work (ms)
-	 */
-	private static final int AVERAGE_BUSY_TIME = 1000;
-
-	/**
-	 * List of all undisposed AsynchronousTestSet instances. Used for the
-	 * recomputeAll method.
-	 */
-	private static List allSets = new ArrayList();
-
-	public AsynchronousTestSet() {
-		super(new HashSet(), Object.class);
-		display = Display.getCurrent();
-		if (display == null) {
-			throw new IllegalStateException(
-					"This object can only be created in the UI thread"); //$NON-NLS-1$
-		}
-		recompute();
-	}
-
-	protected void firstListenerAdded() {
-		super.firstListenerAdded();
-		allSets.add(this);
-	}
-
-	protected void lastListenerRemoved() {
-		allSets.remove(this);
-		super.lastListenerRemoved();
-	}
-
-	public static void recomputeAll() {
-		for (Iterator iter = allSets.iterator(); iter.hasNext();) {
-			AsynchronousTestSet next = (AsynchronousTestSet) iter.next();
-
-			next.recompute();
-		}
-	}
-
-	public void remove(Collection toRemove) {
-		HashSet removed = new HashSet();
-		removed.addAll(toRemove);
-		removed.retainAll(wrappedSet);
-
-		wrappedSet.removeAll(removed);
-		fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removed));
-	}
-
-	public boolean isStale() {
-		return stale;
-	}
-
-	public void recompute() {
-		if (!isStale()) {
-			setStale(true);
-			final int sleepTime = (int) (randomNumberGenerator.nextDouble() * (AVERAGE_BUSY_TIME * 2));
-			Thread newThread = new Thread(new Runnable() {
-				public void run() {
-
-					// Simulate work by sleeping
-					try {
-						Thread.sleep(sleepTime);
-					} catch (InterruptedException e) {
-					}
-
-					// Add and remove some elements -- important: fire all
-					// events in the UI thread
-					display.asyncExec(new Runnable() {
-						public void run() {
-							final HashSet toAdd = new HashSet();
-							final HashSet toRemove = new HashSet();
-
-							// Compute elements to add and remove (basically
-							// just fills the toAdd
-							// and toRemove sets with random elements)
-							int delta = (randomNumberGenerator
-									.nextInt(AVERAGE_DELTA * 4) - AVERAGE_DELTA * 2);
-							int extraAdds = randomNumberGenerator
-									.nextInt(AVERAGE_DELTA);
-							int addCount = delta + extraAdds;
-							int removeCount = -delta + extraAdds;
-
-							if (addCount > 0) {
-								for (int i = 0; i < addCount; i++) {
-									toAdd.add(new Integer(randomNumberGenerator
-											.nextInt(20)));
-								}
-							}
-
-							if (removeCount > 0) {
-								Iterator oldElements = wrappedSet.iterator();
-								for (int i = 0; i < removeCount
-										&& oldElements.hasNext(); i++) {
-									toRemove.add(oldElements.next());
-								}
-							}
-
-							toAdd.removeAll(wrappedSet);
-							wrappedSet.addAll(toAdd);
-							wrappedSet.removeAll(toRemove);
-
-							setStale(false);
-							fireSetChange(Diffs.createSetDiff(toAdd, toRemove));
-						}
-					});
-				}
-			});
-
-			newThread.start();
-		}
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/LabelProviderTest.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/LabelProviderTest.java
deleted file mode 100644
index 736f7b5..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/LabelProviderTest.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.contentprovider.test;
-
-import java.util.Collections;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ListeningLabelProvider;
-import org.eclipse.jface.databinding.viewers.ObservableSetContentProvider;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.layout.LayoutConstants;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.ViewerLabel;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Tests UpdatableTreeContentProvider and DirtyIndicationLabelProvider. Creates
- * a tree containing three randomly-generated sets of integers, and one node
- * that contains the union of the other sets.
- * 
- * @since 1.0
- */
-public class LabelProviderTest {
-
-	private Shell shell;
-
-	private ListViewer list;
-
-	private WritableSet setOfRenamables;
-
-	private Button addButton;
-
-	private Button removeButton;
-
-	private Button renameButton;
-
-	private SelectionListener buttonSelectionListener = new SelectionAdapter() {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-		 */
-		public void widgetSelected(SelectionEvent e) {
-			Button pressed = (Button) e.widget;
-			if (pressed == addButton) {
-				setOfRenamables.add(new RenamableItem());
-			} else if (pressed == removeButton) {
-				setOfRenamables.remove(getCurrentSelection());
-			} else if (pressed == renameButton) {
-				rename(getCurrentSelection());
-			}
-
-			super.widgetSelected(e);
-		}
-	};
-
-	private IObservableValue selectedRenamable;
-
-	/**
-	 * 
-	 */
-	public LabelProviderTest() {
-
-		// Create shell
-		shell = new Shell(Display.getCurrent());
-		{ // Initialize shell
-			setOfRenamables = new WritableSet();
-
-			list = new ListViewer(shell);
-			ObservableSetContentProvider contentProvider = new ObservableSetContentProvider();
-			list.setContentProvider(contentProvider);
-			list.setLabelProvider(new ListeningLabelProvider(contentProvider
-					.getKnownElements()) {
-				RenamableItem.Listener listener = new RenamableItem.Listener() {
-					public void handleChanged(RenamableItem item) {
-						fireChangeEvent(Collections.singleton(item));
-					}
-				};
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jface.databinding.viewers.ViewerLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel,
-				 *      java.lang.Object)
-				 */
-				public void updateLabel(ViewerLabel label, Object element) {
-					if (element instanceof RenamableItem) {
-						RenamableItem item = (RenamableItem) element;
-
-						label.setText(item.getName());
-					}
-				}
-
-				protected void addListenerTo(Object next) {
-					RenamableItem item = (RenamableItem) next;
-
-					item.addListener(listener);
-				}
-
-				protected void removeListenerFrom(Object next) {
-					RenamableItem item = (RenamableItem) next;
-
-					item.removeListener(listener);
-				}
-			});
-			list.setInput(setOfRenamables);
-
-			selectedRenamable = ViewersObservables.observeSingleSelection(list);
-
-			Composite buttonBar = new Composite(shell, SWT.NONE);
-			{ // Initialize buttonBar
-				addButton = new Button(buttonBar, SWT.PUSH);
-				addButton.setText("Add"); //$NON-NLS-1$
-				addButton.addSelectionListener(buttonSelectionListener);
-				removeButton = new Button(buttonBar, SWT.PUSH);
-				removeButton.addSelectionListener(buttonSelectionListener);
-				removeButton.setText("Remove"); //$NON-NLS-1$
-				renameButton = new Button(buttonBar, SWT.PUSH);
-				renameButton.addSelectionListener(buttonSelectionListener);
-				renameButton.setText("Rename"); //$NON-NLS-1$
-
-				selectedRenamable
-						.addValueChangeListener(new IValueChangeListener() {
-							public void handleValueChange(ValueChangeEvent event) {
-								boolean shouldEnable = selectedRenamable
-										.getValue() != null;
-								removeButton.setEnabled(shouldEnable);
-								renameButton.setEnabled(shouldEnable);
-							}
-						});
-				removeButton.setEnabled(false);
-				renameButton.setEnabled(false);
-
-				GridLayoutFactory.fillDefaults().generateLayout(buttonBar);
-			}
-
-		}
-		GridLayoutFactory.fillDefaults().numColumns(2).margins(
-				LayoutConstants.getMargins()).generateLayout(shell);
-	}
-
-	/**
-	 * @param currentSelection
-	 */
-	protected void rename(final RenamableItem currentSelection) {
-		InputDialog inputDialog = new InputDialog(
-				shell,
-				"Edit name", "Enter the new item name", currentSelection.getName(), null); //$NON-NLS-1$ //$NON-NLS-2$
-		if (Window.OK == inputDialog.open()) {
-			currentSelection.setName(inputDialog.getValue());
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	protected RenamableItem getCurrentSelection() {
-		return (RenamableItem) selectedRenamable.getValue();
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		final Display display = Display.getDefault();
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-
-			public void run() {
-				LabelProviderTest test = new LabelProviderTest();
-				Shell s = test.getShell();
-				s.pack();
-				s.setVisible(true);
-
-				while (!s.isDisposed()) {
-					if (!display.readAndDispatch())
-						display.sleep();
-				}
-			}
-		});
-		display.dispose();
-	}
-
-	private Shell getShell() {
-		return shell;
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/LabelProviderTest2.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/LabelProviderTest2.java
deleted file mode 100644
index 3089982..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/LabelProviderTest2.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.contentprovider.test;
-
-import java.util.Collections;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ListeningLabelProvider;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.layout.LayoutConstants;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.ViewerLabel;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Tests UpdatableTreeContentProvider and DirtyIndicationLabelProvider. Creates
- * a tree containing three randomly-generated sets of integers, and one node
- * that contains the union of the other sets.
- * 
- * @since 1.0
- */
-public class LabelProviderTest2 {
-
-	private Shell shell;
-
-	private ListViewer list;
-
-	private WritableList listOfRenamables;
-
-	private Button addButton;
-
-	private Button removeButton;
-
-	private Button renameButton;
-
-	private SelectionListener buttonSelectionListener = new SelectionAdapter() {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-		 */
-		public void widgetSelected(SelectionEvent e) {
-			Button pressed = (Button) e.widget;
-			if (pressed == addButton) {
-				listOfRenamables.add(new RenamableItem());
-			} else if (pressed == removeButton) {
-				listOfRenamables.remove(getCurrentSelection());
-			} else if (pressed == renameButton) {
-				rename(getCurrentSelection());
-			}
-
-			super.widgetSelected(e);
-		}
-	};
-
-	private IObservableValue selectedRenamable;
-
-	/**
-	 * 
-	 */
-	public LabelProviderTest2() {
-
-		// Create shell
-		shell = new Shell(Display.getCurrent());
-		{ // Initialize shell
-			listOfRenamables = new WritableList();
-
-			list = new ListViewer(shell);
-			ObservableListContentProvider contentProvider = new ObservableListContentProvider();
-			list.setContentProvider(contentProvider);
-			list.setLabelProvider(new ListeningLabelProvider(contentProvider
-					.getKnownElements()) {
-				RenamableItem.Listener listener = new RenamableItem.Listener() {
-					public void handleChanged(RenamableItem item) {
-						fireChangeEvent(Collections.singleton(item));
-					}
-				};
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jface.databinding.viewers.ViewerLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel,
-				 *      java.lang.Object)
-				 */
-				public void updateLabel(ViewerLabel label, Object element) {
-					if (element instanceof RenamableItem) {
-						RenamableItem item = (RenamableItem) element;
-
-						label.setText(item.getName());
-					}
-				}
-
-				protected void addListenerTo(Object next) {
-					RenamableItem item = (RenamableItem) next;
-
-					item.addListener(listener);
-				}
-
-				protected void removeListenerFrom(Object next) {
-					RenamableItem item = (RenamableItem) next;
-
-					item.removeListener(listener);
-				}
-			});
-			list.setInput(listOfRenamables);
-
-			selectedRenamable = ViewersObservables.observeSingleSelection(list);
-
-			Composite buttonBar = new Composite(shell, SWT.NONE);
-			{ // Initialize buttonBar
-				addButton = new Button(buttonBar, SWT.PUSH);
-				addButton.setText("Add"); //$NON-NLS-1$
-				addButton.addSelectionListener(buttonSelectionListener);
-				removeButton = new Button(buttonBar, SWT.PUSH);
-				removeButton.addSelectionListener(buttonSelectionListener);
-				removeButton.setText("Remove"); //$NON-NLS-1$
-				renameButton = new Button(buttonBar, SWT.PUSH);
-				renameButton.addSelectionListener(buttonSelectionListener);
-				renameButton.setText("Rename"); //$NON-NLS-1$
-
-				selectedRenamable
-						.addValueChangeListener(new IValueChangeListener() {
-							public void handleValueChange(ValueChangeEvent event) {
-								boolean shouldEnable = selectedRenamable
-										.getValue() != null;
-								removeButton.setEnabled(shouldEnable);
-								renameButton.setEnabled(shouldEnable);
-							}
-						});
-				removeButton.setEnabled(false);
-				renameButton.setEnabled(false);
-
-				GridLayoutFactory.fillDefaults().generateLayout(buttonBar);
-			}
-
-		}
-		GridLayoutFactory.fillDefaults().numColumns(2).margins(
-				LayoutConstants.getMargins()).generateLayout(shell);
-	}
-
-	/**
-	 * @param currentSelection
-	 */
-	protected void rename(final RenamableItem currentSelection) {
-		InputDialog inputDialog = new InputDialog(
-				shell,
-				"Edit name", "Enter the new item name", currentSelection.getName(), null); //$NON-NLS-1$ //$NON-NLS-2$
-		if (Window.OK == inputDialog.open()) {
-			currentSelection.setName(inputDialog.getValue());
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	protected RenamableItem getCurrentSelection() {
-		return (RenamableItem) selectedRenamable.getValue();
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		final Display display = Display.getDefault();
-        Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				LabelProviderTest2 test = new LabelProviderTest2();
-				Shell s = test.getShell();
-				s.pack();
-				s.setVisible(true);
-				
-				while (!s.isDisposed()) {
-					if (!display.readAndDispatch())
-						display.sleep();
-				}
-			}
-		});
-		display.dispose();
-	}
-
-	private Shell getShell() {
-		return shell;
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/RenamableItem.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/RenamableItem.java
deleted file mode 100644
index 970b061..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/RenamableItem.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.contentprovider.test;
-
-import java.util.ArrayList;
-
-/**
- * @since 1.0
- *
- */
-public class RenamableItem {
-	
-	public static interface Listener {
-		public void handleChanged(RenamableItem item);
-	}
-	
-	private String name;
-	private ArrayList listeners = new ArrayList();
-
-	public RenamableItem() {
-		name = "RenamableItem"; //$NON-NLS-1$
-	}
-	
-	public void addListener(Listener listener) {
-		listeners.add(listener);
-	}
-	
-	public void removeListener(Listener toRemove) {
-		listeners.remove(toRemove);
-	}
-	
-	public void setName(String newName) {
-		this.name = newName;
-		
-		Listener[] l = (Listener[]) listeners.toArray(new Listener[listeners.size()]);
-		for (int i = 0; i < l.length; i++) {
-			l[i].handleChanged(this);
-		}
-	}
-	
-	public String getName() {
-		return name;
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/SimpleNode.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/SimpleNode.java
deleted file mode 100644
index 7d34d94..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/SimpleNode.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.contentprovider.test;
-
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-
-
-/**
- * This object will be given randomly-generated children
- *  
- * @since 1.0
- */
-public class SimpleNode {
-	private String nodeName;
-	private IObservableSet children;
-
-	public SimpleNode(String nodeName, IObservableSet children) {
-		super();
-		this.nodeName = nodeName;
-		this.children = children;
-	}
-
-	public String getNodeName() {
-		return nodeName;
-	}
-
-	public IObservableSet getChildren() {
-		return children;
-	}
-	
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/SomeMathFunction.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/SomeMathFunction.java
deleted file mode 100644
index 88ec454..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/SomeMathFunction.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.contentprovider.test;
-
-import java.util.Collections;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.map.ComputedObservableMap;
-import org.eclipse.core.databinding.observable.map.MapDiff;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-
-/**
- * Simple function that performs one of three operations on Doubles:
- * <ul>
- * <li>Multiply by two</li>
- * <li>Round to nearest integer</li>
- * <li>Do nothing</li>
- * </ul>
- * 
- * @since 1.0
- */
-public class SomeMathFunction extends ComputedObservableMap {
-
-	/**
-	 * 
-	 */
-	public static final int OP_IDENTITY = 0;
-
-	/**
-	 * 
-	 */
-	public static final int OP_MULTIPLY = 1;
-
-	/**
-	 * 
-	 */
-	public static final int OP_ROUND = 2;
-
-	private int op = OP_ROUND;
-
-	/**
-	 * @param domain
-	 */
-	public SomeMathFunction(IObservableSet domain) {
-		super(domain);
-		init();
-	}
-
-	/**
-	 * @param operation
-	 */
-	public void setOperation(final int operation) {
-		final int oldOp = this.op;
-		this.op = operation;
-
-		// Fire a change event. Changing the operation is going to affect every
-		// answer returned by
-		// this function, so include every element in the function domain in the
-		// event.
-		// If this was a change that would only affect a subset of elements, we
-		// would include
-		// the subset of affected elements rather than using
-		// domain.toCollection()
-		fireMapChange(new MapDiff() {
-
-			public Set getAddedKeys() {
-				return Collections.EMPTY_SET;
-			}
-
-			public Set getChangedKeys() {
-				return keySet();
-			}
-
-			public Object getNewValue(Object key) {
-				return doComputeResult(key, operation);
-			}
-
-			public Object getOldValue(Object key) {
-				return doComputeResult(key, oldOp);
-			}
-
-			public Set getRemovedKeys() {
-				return Collections.EMPTY_SET;
-			}
-		});
-	}
-
-	private Object doComputeResult(Object element, int op) {
-		switch (op) {
-		case OP_IDENTITY:
-			return element;
-		case OP_MULTIPLY:
-			return new Double((((Double) element).doubleValue() * 2.0));
-		case OP_ROUND:
-			return new Double(Math.floor((((Double) element).doubleValue())));
-		}
-		return element;
-	}
-
-	protected Object doGet(Object key) {
-		return doComputeResult(key, this.op);
-	}
-
-	protected Object doPut(Object key, Object value) {
-		throw new UnsupportedOperationException();
-	}
-
-	protected void hookListener(Object addedKey) {
-		// ignore, no need to listen to immutable Double objects
-	}
-
-	protected void unhookListener(Object removedKey) {
-		// ignore, no need to listen to immutable Double objects
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/StructuredContentProviderTest.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/StructuredContentProviderTest.java
deleted file mode 100644
index 20efc8e..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/StructuredContentProviderTest.java
+++ /dev/null
@@ -1,396 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.contentprovider.test;
-
-import java.util.Iterator;
-import java.util.Random;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.MappedSet;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.core.databinding.observable.value.ComputedValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableSetContentProvider;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.internal.databinding.provisional.swt.ControlUpdater;
-import org.eclipse.jface.internal.databinding.provisional.viewers.ViewerLabelProvider;
-import org.eclipse.jface.viewers.ListViewer;
-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.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Tests UpdatableSetContentProvider, ComputableValue, ControlUpdator,
- * UpdatableFunction, and ConvertingSet.
- * 
- * <p>
- * This test displays a dialog with user-editable list of Doubles. It allows the
- * user to select a math function to apply to the set, and displays the result
- * in a new list. A line of text along the bottom of the dialog displays the sum
- * of the elements from the transformed set. Although this dialog is rather
- * silly, it is a good example of a dialog where a lot of things can change from
- * many directions.
- * </p>
- * 
- * <p>
- * An UpdatableSetContentProvider is used to supply the contents each
- * ListViewer. ControlUpdators
- * 
- * </p>
- * 
- * @since 1.0
- */
-public class StructuredContentProviderTest {
-
-	private static Realm realm;
-
-	/**
-	 * Top-level shell for the dialog
-	 */
-	private Shell shell;
-
-	/**
-	 * Random number stream. Used for the "add" button.
-	 */
-	protected Random random = new Random();
-
-	// Data model ////////////////////////////////////////////////////////
-
-	/**
-	 * inputSet stores a set of Doubles. The user is allowed to add and remove
-	 * Doubles from this set.
-	 */
-	private WritableSet inputSet;
-
-	/**
-	 * currentFunction is an Integer, set to one of the SomeMathFunction.OP_*
-	 * constants. It identifies which function will be applied to inputSet.
-	 */
-	private WritableValue currentFunction;
-
-	/**
-	 * mathFunction is the transformation. It can multiply by 2, round down to
-	 * the nearest integer, or do nothing (identity)
-	 */
-	private SomeMathFunction mathFunction;
-
-	/**
-	 * Set of Doubles. Holds the result of applying mathFunction to the
-	 * inputSet.
-	 */
-	private MappedSet outputSet;
-
-	/**
-	 * A Double. Stores the sum of the Doubles in outputSet
-	 */
-	private IObservableValue sumOfOutputSet;
-
-	/**
-	 * Creates the test dialog as a top-level shell.
-	 */
-	public StructuredContentProviderTest() {
-
-		// Initialize the data model
-		createDataModel();
-
-		shell = new Shell(Display.getCurrent(), SWT.SHELL_TRIM);
-		{ // Initialize shell
-			final Label someDoubles = new Label(shell, SWT.NONE);
-			someDoubles.setText("A list of random Doubles"); //$NON-NLS-1$
-			someDoubles.setLayoutData(new GridData(
-					GridData.HORIZONTAL_ALIGN_FILL
-							| GridData.VERTICAL_ALIGN_FILL));
-
-			Control addRemoveComposite = createInputControl(shell, inputSet);
-
-			GridData addRemoveData = new GridData(GridData.FILL_BOTH);
-			addRemoveData.minimumHeight = 1;
-			addRemoveData.minimumWidth = 1;
-
-			addRemoveComposite.setLayoutData(addRemoveData);
-
-			Group operation = new Group(shell, SWT.NONE);
-			{ // Initialize operation group
-				operation.setText("Select transformation"); //$NON-NLS-1$
-
-				createRadioButton(operation, currentFunction, "f(x) = x", //$NON-NLS-1$
-						new Integer(SomeMathFunction.OP_IDENTITY));
-				createRadioButton(operation, currentFunction, "f(x) = 2 * x", //$NON-NLS-1$
-						new Integer(SomeMathFunction.OP_MULTIPLY));
-				createRadioButton(operation, currentFunction,
-						"f(x) = floor(x)", new Integer( //$NON-NLS-1$
-								SomeMathFunction.OP_ROUND));
-
-				GridLayout layout = new GridLayout();
-				layout.numColumns = 1;
-				operation.setLayout(layout);
-			}
-			operation.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
-					| GridData.VERTICAL_ALIGN_FILL));
-
-			Control outputControl = createOutputComposite(shell);
-			GridData outputData = new GridData(GridData.FILL_BOTH);
-			outputData.minimumHeight = 1;
-			outputData.minimumWidth = 1;
-			outputData.widthHint = 300;
-			outputData.heightHint = 150;
-
-			outputControl.setLayoutData(outputData);
-
-			final Label sumLabel = new Label(shell, SWT.NONE);
-			new ControlUpdater(sumLabel) {
-				protected void updateControl() {
-					double sum = ((Double) sumOfOutputSet.getValue())
-							.doubleValue();
-					int size = outputSet.size();
-
-					sumLabel.setText("The sum of the above " + size //$NON-NLS-1$
-							+ " doubles is " + sum); //$NON-NLS-1$
-				}
-			};
-			sumLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
-					| GridData.VERTICAL_ALIGN_FILL));
-
-			GridLayout layout = new GridLayout();
-			layout.numColumns = 1;
-			shell.setLayout(layout);
-		}
-
-	}
-
-	/**
-	 * Create the updatables for this dialog
-	 */
-	private void createDataModel() {
-		// Initialize data model. We will create a user-editable set of Doubles.
-		// The user can run
-		// a transformation on this set and view the result in a list viewer.
-
-		// inputSet will be a writable set of doubles. The user will add and
-		// remove entries from this set
-		// through the UI.
-		inputSet = new WritableSet(realm);
-
-		// currentFunction holds the ID currently selected function to apply to
-		// elements in the inputSet.
-		// We will allow the user to change the current function through a set
-		// of radio buttons
-		currentFunction = new WritableValue(realm, new Integer(
-				SomeMathFunction.OP_MULTIPLY), null);
-
-		// mathFunction implements the selected function
-		mathFunction = new SomeMathFunction(inputSet);
-		currentFunction.addValueChangeListener(new IValueChangeListener() {
-			public void handleValueChange(ValueChangeEvent event) {
-				mathFunction
-						.setOperation(((Integer) currentFunction.getValue())
-								.intValue());
-			}
-		});
-		mathFunction.setOperation(((Integer) currentFunction.getValue())
-				.intValue());
-
-		// outputSet holds the result. It displays the result of applying the
-		// currently-selected
-		// function on all the elements in the input set.
-		outputSet = new MappedSet(inputSet, mathFunction);
-
-		// sumOfOutputSet stores the current sum of the the Doubles in the
-		// output set
-		sumOfOutputSet = new ComputedValue(realm) {
-			protected Object calculate() {
-				double sum = 0.0;
-				for (Iterator iter = outputSet.iterator(); iter.hasNext();) {
-					Double next = (Double) iter.next();
-
-					sum += next.doubleValue();
-				}
-				return new Double(sum);
-			}
-		};
-	}
-
-	/**
-	 * Creates a radio button in the given parent composite. When selected, the
-	 * button will change the given SettableValue to the given value.
-	 * 
-	 * @param parent
-	 *            parent composite
-	 * @param model
-	 *            SettableValue that will hold the value of the
-	 *            currently-selected radio button
-	 * @param string
-	 *            text to appear in the radio button
-	 * @param value
-	 *            value of this radio button (SettableValue will hold this value
-	 *            when the radio button is selected)
-	 */
-	private void createRadioButton(Composite parent, final WritableValue model,
-			String string, final Object value) {
-		final Button button = new Button(parent, SWT.RADIO);
-		button.setText(string);
-		button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				model.setValue(value);
-				super.widgetSelected(e);
-			}
-		});
-		new ControlUpdater(button) {
-			protected void updateControl() {
-				button.setSelection(model.getValue().equals(value));
-			}
-		};
-		button.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.VERTICAL_ALIGN_FILL));
-	}
-
-	private Control createOutputComposite(Composite parent) {
-		ListViewer listOfInts = new ListViewer(parent, SWT.BORDER
-				| SWT.V_SCROLL | SWT.H_SCROLL);
-
-		listOfInts.setContentProvider(new ObservableSetContentProvider());
-		listOfInts.setLabelProvider(new ViewerLabelProvider());
-		listOfInts.setInput(outputSet);
-		return listOfInts.getControl();
-	}
-
-	/**
-	 * Creates and returns a control that will allow the user to add and remove
-	 * Doubles from the given input set.
-	 * 
-	 * @param parent
-	 *            parent control
-	 * @param inputSet
-	 *            input set
-	 * @return a newly created SWT control that displays Doubles from the input
-	 *         set and allows the user to add and remove entries
-	 */
-	private Control createInputControl(Composite parent,
-			final WritableSet inputSet) {
-		Composite addRemoveComposite = new Composite(parent, SWT.NONE);
-		{ // Initialize addRemoveComposite
-			ListViewer listOfInts = new ListViewer(addRemoveComposite,
-					SWT.BORDER);
-
-			listOfInts.setContentProvider(new ObservableSetContentProvider());
-			listOfInts.setLabelProvider(new ViewerLabelProvider());
-			listOfInts.setInput(inputSet);
-
-			final IObservableValue selectedInt = ViewersObservables.observeSingleSelection(listOfInts);
-
-			GridData listData = new GridData(GridData.FILL_BOTH);
-			listData.minimumHeight = 1;
-			listData.minimumWidth = 1;
-			listData.widthHint = 150;
-			listData.heightHint = 150;
-			listOfInts.getControl().setLayoutData(listData);
-
-			Composite buttonBar = new Composite(addRemoveComposite, SWT.NONE);
-			{ // Initialize button bar
-
-				Button add = new Button(buttonBar, SWT.PUSH);
-				add.setText("Add"); //$NON-NLS-1$
-				add.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						inputSet.add(new Double(random.nextDouble() * 100.0));
-						super.widgetSelected(e);
-					}
-				});
-				add.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
-						| GridData.VERTICAL_ALIGN_FILL));
-
-				final Button remove = new Button(buttonBar, SWT.PUSH);
-				remove.setText("Remove"); //$NON-NLS-1$
-				// Enable the Remove button if and only if there is currently an
-				// element selected.
-				new ControlUpdater(remove) {
-					protected void updateControl() {
-						// This block demonstrates auto-listening.
-						// When updateControl is running, the framework
-						// remembers each
-						// updatable that gets touched. Since we're calling
-						// selectedInt.getValue()
-						// here, this updator will be flagged as dependant on
-						// selectedInt. This
-						// means that whenever selectedInt changes, this block
-						// of code will re-run
-						// itself.
-
-						// The result is that the remove button will recompute
-						// its enablement
-						// whenever the selection in the listbox changes, and it
-						// was not necessary
-						// to attach any listeners.
-						remove.setEnabled(selectedInt.getValue() != null);
-					}
-				};
-
-				remove.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						inputSet.remove(selectedInt.getValue());
-						super.widgetSelected(e);
-					}
-				});
-				remove.setLayoutData(new GridData(
-						GridData.HORIZONTAL_ALIGN_FILL
-								| GridData.VERTICAL_ALIGN_FILL));
-
-				GridLayout buttonLayout = new GridLayout();
-				buttonLayout.numColumns = 1;
-				buttonBar.setLayout(buttonLayout);
-
-			} // End button bar
-			buttonBar.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
-					| GridData.VERTICAL_ALIGN_BEGINNING));
-
-			GridLayout addRemoveLayout = new GridLayout();
-			addRemoveLayout.numColumns = 2;
-			addRemoveComposite.setLayout(addRemoveLayout);
-		}
-		return addRemoveComposite;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = Display.getDefault();
-		realm = SWTObservables.getRealm(display);
-		StructuredContentProviderTest test = new StructuredContentProviderTest();
-		Shell s = test.getShell();
-		s.pack();
-		s.setVisible(true);
-
-		while (!s.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-		display.dispose();
-	}
-
-	private Shell getShell() {
-		return shell;
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/TreeContentProviderTest.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/TreeContentProviderTest.java
deleted file mode 100644
index 8019357..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/contentprovider/test/TreeContentProviderTest.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.contentprovider.test;
-
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.UnionSet;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.core.internal.databinding.observable.tree.IUnorderedTreeProvider;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.provisional.viewers.UnorderedTreeContentProvider;
-import org.eclipse.jface.internal.databinding.provisional.viewers.ViewerLabelProvider;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.layout.LayoutConstants;
-import org.eclipse.jface.viewers.IViewerLabelProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerLabel;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Tests UpdatableTreeContentProvider and DirtyIndicationLabelProvider. Creates
- * a tree containing three randomly-generated sets of integers, and one node
- * that contains the union of the other sets.
- * 
- * @since 3.2
- */
-public class TreeContentProviderTest {
-
-	private Shell shell;
-	private TreeViewer tree;
-
-	// Three randomly-generated sets of doubles
-	private AsynchronousTestSet set1;
-	private AsynchronousTestSet set2;
-	private AsynchronousTestSet set3;
-
-	// The union of the above three sets
-	private UnionSet union;
-	private Button randomize;
-
-	public TreeContentProviderTest() {
-
-		// Create the data model
-		set1 = new AsynchronousTestSet();
-		set2 = new AsynchronousTestSet();
-		set3 = new AsynchronousTestSet();
-
-		// A union of the above sets
-		union = new UnionSet(new IObservableSet[] { set1, set2, set3 });
-
-		// Create shell
-		shell = new Shell(Display.getCurrent());
-
-		createTree();
-
-		Composite buttonBar = new Composite(shell, SWT.NONE);
-		{
-			buttonBar.setLayout(new FillLayout(SWT.HORIZONTAL));
-			randomize = new Button(buttonBar, SWT.PUSH);
-			randomize.setText("Randomize");
-			randomize.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					AsynchronousTestSet.recomputeAll();
-					super.widgetSelected(e);
-				}
-			});
-
-			GridLayoutFactory.fillDefaults().generateLayout(buttonBar);
-		}
-
-		GridLayoutFactory.fillDefaults().margins(LayoutConstants.getMargins())
-				.generateLayout(shell);
-
-		shell.addDisposeListener(new DisposeListener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
-			 */
-			public void widgetDisposed(DisposeEvent e) {
-				dispose();
-			}
-		});
-	}
-
-	/**
-	 * 
-	 */
-	protected void dispose() {
-		set1.dispose();
-		set2.dispose();
-		set3.dispose();
-		union.dispose();
-	}
-
-	private void createTree() {
-		// Create the tree provider. This provides the structure of the tree.
-		// This tree will
-		// have an instance of RootNode as the root (which is really a
-		// placeholder), several
-		// SimpleNodes as top-level nodes, and sets of randomly generated
-		// Doubles below each
-		// SimpleNode.
-		IUnorderedTreeProvider treeProvider = new IUnorderedTreeProvider() {
-			public IObservableSet createChildSet(Object element) {
-				// If the parent is the root node, return the union of some
-				// randomly-generated
-				// nodes and some hardcoded nodes
-				if (element == tree.getInput()) {
-					// Set of hardcoded nodes
-					WritableSet topElements = new WritableSet();
-					topElements.add(new SimpleNode("Random Set 1", set1));
-					topElements.add(new SimpleNode("Random Set 2", set2));
-					topElements.add(new SimpleNode("Random Set 3", set3));
-					topElements.add(new SimpleNode("Union of the other sets",
-							union));
-					return topElements;
-				}
-
-				// If the parent is a RandomChildrenNode, return a
-				// randomly-generated
-				// set of Doubles for its children
-				if (element instanceof SimpleNode) {
-					// We return a new DelegatingObservableSet in order to
-					// prevent the
-					// original from being disposed.
-					return Observables
-							.proxyObservableSet(((SimpleNode) element)
-									.getChildren());
-				}
-
-				// Otherwise the node is a Double, which will have no children
-				return null;
-			}
-
-			public Realm getRealm() {
-				// TODO Auto-generated method stub
-				return null;
-			}
-		};
-
-		// Label provider for the tree
-		IViewerLabelProvider labelProvider = new ViewerLabelProvider() {
-			public void updateLabel(ViewerLabel label, Object element) {
-				if (element instanceof SimpleNode) {
-					SimpleNode node = (SimpleNode) element;
-
-					label.setText(node.getNodeName());
-				}
-
-				if (element instanceof Integer) {
-					Integer node = (Integer) element;
-
-					label.setText("Integer " + node);
-				}
-			}
-		};
-
-		// Create tree viewer
-		tree = new TreeViewer(shell, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-
-		// UpdatableTreeContentProvider converts an ITreeProvider into a
-		// standard JFace content provider
-		UnorderedTreeContentProvider contentProvider = new UnorderedTreeContentProvider(
-				treeProvider, "pending...", false);
-
-		tree.setContentProvider(contentProvider);
-		tree.setLabelProvider(labelProvider);
-
-		// For the ITreeProvider above, it doesn't matter what we select as the
-		// input.
-		tree.setInput(new Object());
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		final Display display = Display.getDefault();
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				TreeContentProviderTest test = new TreeContentProviderTest();
-				Shell s = test.getShell();
-				s.pack();
-				s.setVisible(true);
-
-				while (!s.isDisposed()) {
-					if (!display.readAndDispatch())
-						display.sleep();
-				}
-			}
-		});
-		display.dispose();
-	}
-
-	private Shell getShell() {
-		return shell;
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/ducks/DuckType.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/ducks/DuckType.java
deleted file mode 100644
index 031ac20..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/ducks/DuckType.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2005 db4objects Inc.  http://www.db4o.com
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     db4objects - Initial API and implementation
- */
-package org.eclipse.jface.examples.databinding.ducks;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-
-/**
- * DuckType. Implements Duck Typing for Java.  ("If it walks like a duck, 
- * quacks like a duck, it...").  Essentially allows programs to treat
- * objects from separate hierarchies as if they were designed with common
- * interfaces as long as they adhere to common naming conventions.
- * <p>
- * This version is the strict DuckType.  All methods present in
- * interfaceToImplement must be present on the target object.
- *
- * @author djo
- */
-public class DuckType implements InvocationHandler {
-   
-   /**
-    * Interface DuckType#Wrapper.  An interface for DuckType proxies that
-    * allows clients to access the proxied value.  The value returned by
-    * calling DuckType#implement always implements this interface.
-    */
-   public static interface Wrapper {
-      /**
-       * Method duckType_GetWrappedValue.  Returns the proxied value.
-       * 
-       * @return The proxied value.
-       */
-      public Object duckType_GetWrappedValue();
-   }
-   
-	/**
-     * Causes object to implement the interfaceToImplement and returns
-     * an instance of the object implementing interfaceToImplement even
-     * if interfaceToImplement was not declared in object.getClass()'s 
-     * implements declaration.<p>
-     * 
-     * This works as long as all methods declared in interfaceToImplement
-     * are present on object.
-     * 
-	 * @param interfaceToImplement The Java class of the interface to implement
-	 * @param object The object to force to implement interfaceToImplement
-	 * @return object, but now implementing interfaceToImplement
-	 */
-	public static Object implement(Class interfaceToImplement, Object object) {
-		return Proxy.newProxyInstance(interfaceToImplement.getClassLoader(), 
-				new Class[] {interfaceToImplement, Wrapper.class}, new DuckType(object));
-	}
-    
-    /**
-     * Indicates if object is a (DuckType) instace of intrface.  That is,
-     * is every method in intrface present on object.
-     * 
-     * @param intrface The interface to implement
-     * @param object The object to test
-     * @return true if every method in intrface is present on object.  false otherwise
-     */
-    public static boolean instanceOf(Class intrface, Object object) {
-        final Method[] methods = intrface.getMethods();
-        Class candclass=object.getClass();
-        for (int methodidx = 0; methodidx < methods.length; methodidx++) {
-            Method method=methods[methodidx];
-            try {
-                candclass.getMethod(method.getName(), method.getParameterTypes());
-            } catch (NoSuchMethodException e) {
-                return false;
-            }
-        }
-        return true;
-    }
-	
-	protected DuckType(Object object) {
-		this.object = object;
-		this.objectClass = object.getClass();
-	}
-
-	protected Object object;
-	protected Class objectClass;
-	
-	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-      if (method.getName().equals("equals") && args != null && args.length == 1) {
-         return new Boolean(equals(args[0]));
-      }
-      if (method.getName().equals("hashCode") && args == null) {
-         return new Integer(hashCode());
-      }
-      if (method.getName().equals("duckType_GetWrappedValue") && args == null) {
-         return object;
-      }
-		Method realMethod = objectClass.getMethod(method.getName(), method.getParameterTypes());
-      if (!realMethod.isAccessible()) {
-         realMethod.setAccessible(true);
-      }
-		return realMethod.invoke(object, args);
-	}
-   
-   public boolean equals(Object obj) {
-      if (obj instanceof Wrapper) {
-         Wrapper proxy = (Wrapper) obj;
-         Object wrappedValue = proxy.duckType_GetWrappedValue();
-         return wrappedValue.equals(object);
-      }
-      return obj == this || super.equals(obj) || object.equals(obj);
-   }
-   
-   public int hashCode() {
-      return object.hashCode();
-   }
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/ducks/ReflectedMethod.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/ducks/ReflectedMethod.java
deleted file mode 100644
index c3b78ea..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/ducks/ReflectedMethod.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2005 db4objects Inc.  http://www.db4o.com
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     db4objects - Initial API and implementation
- */
-package org.eclipse.jface.examples.databinding.ducks;
-
-import java.lang.reflect.Method;
-
-/**
- * ReflectedMethod.  Encapsulates a method that may or may not exist on 
- * some receiver.  Invocation policy is that if the method can be invoked,
- * it is.  On failure, returns null.
- *
- * @author djo
- */
-public class ReflectedMethod {
-    
-    private Object subject;
-    private Method method;
-    
-    /**
-     * Constructor ReflectedMethod.  Create a ReflectedMethod object.
-     * 
-     * @param subject The object on which the method lives.
-     * @param methodName The name of the method.
-     * @param paramTypes The method's parameter types.
-     */
-    public ReflectedMethod(Object subject, String methodName, Class[] paramTypes) {
-        this.subject = subject;
-        method = null;
-        try {
-        	method = subject.getClass().getMethod(methodName, paramTypes);
-        } catch (Exception e) {
-        	System.out.println(e);
-        }
-    }
-    
-    /**
-     * Method exists.  Returns true if the underlying method exists, false
-     * otherwise.
-     * 
-     * @return true if the underlying method exists, false otherwise.
-     */
-    public boolean exists() {
-        return method != null;
-    }
-    
-    /**
-     * Method invoke.  If possible, invoke the encapsulated method with the
-     * specified parameters.
-     * 
-     * @param params An Object[] containing the parameters to pass.
-     * @return any return value or null if there was no return value or an
-     * error occured.
-     */
-    public Object invoke(Object[] params) {
-        if (method == null)
-            return null;
-        try {
-        	if (!method.isAccessible()) {
-        		method.setAccessible(true);
-        	}
-        	return method.invoke(subject, params);
-        } catch (Exception e) {
-            return null;
-        }
-    }
-
-	/**
-	 * Method getType.  Returns the return type of the method.
-	 * 
-	 * @return The return type or null if none.
-	 */
-	public Class getType() {
-		return method.getReturnType();
-	}
-}
-
-
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/ducks/ReflectedProperty.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/ducks/ReflectedProperty.java
deleted file mode 100644
index 3ec9a58..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/ducks/ReflectedProperty.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     The Pampered Chef - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.ducks;
-
-/**
- * Encapsulates a single JavaBeans-style property
- * 
- * @since 3.3
- */
-public class ReflectedProperty {
-	private String propertyName;
-	private ReflectedMethod getter;
-	private ReflectedMethod setter;
-
-	/**
-	 * Construct a ReflectedProperty on some object, given the property name.
-	 * 
-	 * @param object The object
-	 * @param propertyName The property name
-	 */
-	public ReflectedProperty(Object object, String propertyName) {
-		this.propertyName = propertyName;
-		getter = new ReflectedMethod(object, makeGetterName(propertyName), new Class[] {});
-		if (!getter.exists()) {
-			getter = new ReflectedMethod(object, makeBooleanGetterName(propertyName), new Class[] {});
-			if (!getter.exists()) {
-				throw new IllegalArgumentException("Cannot find getter for " + propertyName);
-			}
-		}
-		setter = new ReflectedMethod(object, makeSetterName(propertyName), new Class[] {getter.getType()});
-	}
-	
-	private String makeBooleanGetterName(String propertyName) {
-		return "is" + capitalize(propertyName);
-	}
-
-	private String makeSetterName(String propertyName) {
-		return "set" + capitalize(propertyName);
-	}
-
-	private String makeGetterName(String propertyName) {
-		return "get" + capitalize(propertyName);
-	}
-
-	private String capitalize(String string) {
-		return string.substring(0, 1).toUpperCase() + string.substring(1);
-	}
-
-	/**
-	 * Return the property's type.  This is the same as the type returned by
-	 * the getter.
-	 * 
-	 * @return The property's data type.
-	 */
-	public Class getType() {
-		return getter.getType();
-	}
-	
-	/**
-	 * Return the property's value.
-	 * 
-	 * @return The value in the property.
-	 */
-	public Object get() {
-		return getter.invoke(new Object[] {});
-	}
-	
-	/**
-	 * Set the property's value.  If the property is read-only, the request
-	 * is ignored.
-	 * 
-	 * @param newValue The value to set.
-	 */
-	public void set(Object newValue) {
-		setter.invoke(new Object[] {newValue});
-	}
-	
-	/**
-	 * Returns if the property is read-only.
-	 * 
-	 * @return false if the property has a setter; true otherwise.
-	 */
-	public boolean isReadOnly() {
-		return !setter.exists();
-	}
-
-	/**
-	 * Returns the property's name.
-	 * 
-	 * @return The property name.
-	 */
-	public String getPropertyName() {
-		return propertyName;
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/ducks/RelaxedDuckType.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/ducks/RelaxedDuckType.java
deleted file mode 100644
index fa43397..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/ducks/RelaxedDuckType.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2005 db4objects Inc.  http://www.db4o.com
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     db4objects - Initial API and implementation
- */
-package org.eclipse.jface.examples.databinding.ducks;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.util.HashMap;
-
-/**
- * RelaxedDuckType. Implements Duck Typing for Java.  ("If it walks like a duck, 
- * quacks like a duck, it...").  Essentially allows programs to treat
- * objects from separate hierarchies as if they were designed with common
- * interfaces as long as they adhere to common naming conventions.
- * <p>
- * This version is the relaxed DuckType.  If a method in the interface is
- * not present on the underlying object, the proxy simply returns null.
- *
- * @author djo
- */
-public class RelaxedDuckType extends DuckType implements InvocationHandler {
-
-	public static Object implement(Class interfaceToImplement, Object object) {
-		return Proxy.newProxyInstance(interfaceToImplement.getClassLoader(), 
-				new Class[] {interfaceToImplement}, new RelaxedDuckType(object));
-	}
-    
-    public static boolean includes(Object object, String method, Class[] args) {
-        try {
-            object.getClass().getMethod(method, args);
-        } catch (NoSuchMethodException e) {
-            return false;
-        }
-        return true;
-    }
-    
-    private static final HashMap NULL_VALUES = new HashMap(); {
-        NULL_VALUES.put(Boolean.TYPE, Boolean.FALSE);
-        NULL_VALUES.put(Integer.TYPE, new Integer(0));
-        NULL_VALUES.put(Float.TYPE, new Float(0));
-        NULL_VALUES.put(Long.TYPE, new Long(0));
-        NULL_VALUES.put(Double.TYPE, new Double(0));
-        NULL_VALUES.put(Character.TYPE, new Character(' '));
-    }
-	
-	protected RelaxedDuckType(Object object) {
-		super(object);
-	}
-	
-	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-		try {
-			Method realMethod = objectClass.getMethod(method.getName(), method.getParameterTypes());
-            return realMethod.invoke(object, args);
-		} catch (NoSuchMethodException e) {
-			return NULL_VALUES.get(method.getReturnType());
-		} catch (Throwable t) {
-			throw t;
-		}
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/EditMask.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/EditMask.java
deleted file mode 100644
index 484922e..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/EditMask.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     The Pampered Chef - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.mask;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-
-import org.eclipse.jface.examples.databinding.mask.internal.EditMaskParser;
-import org.eclipse.jface.examples.databinding.mask.internal.SWTUtil;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.events.VerifyListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Ensures text widget has the format specified by the edit mask.  Edit masks
- * are currently defined as follows:
- * 
- * The following characters are reserved words that match specific kinds of 
- * characters:
- * 
- * # - digits 0-9
- * A - uppercase A-Z
- * a - upper or lowercase a-z, A-Z
- * n - alphanumeric 0-9, a-z, A-Z
- *
- * All other characters are literals.  The above characters may be turned into
- * literals by preceeding them with a backslash.  Use two backslashes to
- * denote a backslash.
- * 
- * Examples:
- * 
- * (###) ###-####  U.S. phone number 
- * ###-##-####     U.S. Social Security number
- * \\\###          A literal backslash followed by a literal pound symbol followed by two digits
- * 
- * Ideas for future expansion:
- * 
- * Quantifiers as postfix modifiers to a token.  ie:
- * 
- * #{1, 2}/#{1,2}/####   MM/DD/YYYY date format allowing 1 or 2 digit month or day
- * 
- * Literals may only be quantified as {0,1} which means that they only appear
- * if placeholders on both sides of the literal have data.  This will be used
- * along with:
- * 
- * Right-to-left support for numeric entry.  When digits are being entered and
- * a decimal point is present in the mask, digits to the left of the decimal
- * are entered right-to-left but digits to the right of the decimal left-to-right.
- * This might need to be a separate type of edit mask. (NumericMask, maybe?)
- * 
- * Example:
- * 
- * $#{0,3},{0,1}#{0,3}.#{0,2}  ie: $123,456.12 or $12.12 or $1,234.12 or $123.12
- *
- * 
- * Here's the basic idea of how the current implementation works (the actual 
- * implementation is slightly more abstracted and complicated than this):
- * 
- * We always let the verify event pass if the user typed a new character or selected/deleted anything.
- * During the verify event, we post an async runnable.
- * Inside that async runnable, we:
- *   - Remember the selection position
- *   - getText(), then
- *   - Strip out all literal characters from text
- *   - Truncate the resulting string to raw length of edit mask without literals
- *   - Insert literal characters back in the correct positions
- *   - setText() the resulting string
- *   - reset the selection to the correct location
- *   
- * @since 3.3
- */
-public class EditMask {
-	
-	public static final String FIELD_TEXT = "text";
-	public static final String FIELD_RAW_TEXT = "rawText";
-	public static final String FIELD_COMPLETE = "complete";
-	protected Text text;
-	protected EditMaskParser editMaskParser;
-	private boolean fireChangeOnKeystroke = true;
-	private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
-	
-	protected String oldValidRawText = "";
-	protected String oldValidText = ""; 
-	
-	/**
-	 * Creates an instance that wraps around a text widget and manages its<br>
-	 * formatting.
-	 * 
-	 * @param text
-	 * @param editMask
-	 */
-	public EditMask(Text text) {
-		this.text = text;
-	}
-	
-	/**
-	 * @return the underlying Text control used by EditMask
-	 */
-	public Text getControl() {
-		return this.text;
-	}
-	
-	/**
-	 * Set the edit mask string on the edit mask control.
-	 * 
-	 * @param editMask The edit mask string
-	 */
-	public void setMask(String editMask) {
-		editMaskParser = new EditMaskParser(editMask);
-		text.addVerifyListener(verifyListener);
-		text.addFocusListener(focusListener);
-		text.addDisposeListener(disposeListener);
-		updateTextField.run();
-		oldValidText = text.getText();
-		oldValidRawText = editMaskParser.getRawResult();
-	}
-
-    /**
-     * @param string Sets the text string in the receiver
-     */
-    public void setText(String string) {
-    	String oldValue = text.getText();
-    	if (editMaskParser != null) {
-			editMaskParser.setInput(string);
-			String formattedResult = editMaskParser.getFormattedResult();
-			text.setText(formattedResult);
-			firePropertyChange(FIELD_TEXT, oldValue, formattedResult);
-    	} else {
-    		text.setText(string);
-			firePropertyChange(FIELD_TEXT, oldValue, string);
-    	}
-		oldValidText = text.getText();
-		oldValidRawText = editMaskParser.getRawResult();
-	}
-
-	/**
-	 * @return the actual (formatted) text
-	 */
-	public String getText() {
-		if (editMaskParser != null) {
-			return editMaskParser.getFormattedResult();
-		}
-		return text.getText();
-	}
-	
-	/**
-	 * setRawText takes raw text as a parameter but formats it before
-	 * setting the text in the Text control.
-	 * 
-	 * @param string the raw (unformatted) text
-	 */
-	public void setRawText(String string)  {
-		if (string == null) {
-			string = "";
-		}
-		if (editMaskParser != null) {
-			String oldValue = editMaskParser.getRawResult();
-			editMaskParser.setInput(string);
-			text.setText(editMaskParser.getFormattedResult());
-			firePropertyChange(FIELD_RAW_TEXT, oldValue, string);
-		} else {
-	    	String oldValue = text.getText();
-    		text.setText(string);
-			firePropertyChange(FIELD_RAW_TEXT, oldValue, string);
-		}
-		oldValidText = text.getText();
-		oldValidRawText = editMaskParser.getRawResult();
-	}
-
-	/**
-	 * @return The input text with literals removed
-	 */
-	public String getRawText() {
-		if (editMaskParser != null) {
-			return editMaskParser.getRawResult();
-		}
-		return text.getText();
-	}
-	
-	/**
-	 * @return true if the field is complete according to the mask; false otherwise
-	 */
-	public boolean isComplete() {
-		if (editMaskParser == null) {
-			return true;
-		}
-		return editMaskParser.isComplete();
-	}
-	
-	/**
-	 * Returns the placeholder character.  The placeholder 
-	 * character must be a different character than any character that is 
-	 * allowed as input anywhere in the edit mask.  For example, if the edit
-	 * mask permits spaces to be used as input anywhere, the placeholder 
-	 * character must be something other than a space character.
-	 * <p>
-	 * The space character is the default placeholder character.
-	 * 
-	 * @return the placeholder character
-	 */
-	public char getPlaceholder() {
-		if (editMaskParser == null) {
-			throw new IllegalArgumentException("Have to set an edit mask first");
-		}
-		return editMaskParser.getPlaceholder();
-	}
-	
-	/**
-	 * Sets the placeholder character for the edit mask.  The placeholder 
-	 * character must be a different character than any character that is 
-	 * allowed as input anywhere in the edit mask.  For example, if the edit
-	 * mask permits spaces to be used as input anywhere, the placeholder 
-	 * character must be something other than a space character.
-	 * <p>
-	 * The space character is the default placeholder character.
-	 * 
-	 * @param placeholder The character to use as a placeholder
-	 */
-	public void setPlaceholder(char placeholder) {
-		if (editMaskParser == null) {
-			throw new IllegalArgumentException("Have to set an edit mask first");
-		}
-		editMaskParser.setPlaceholder(placeholder);
-		updateTextField.run();
-		oldValidText = text.getText();
-	}
-
-	/**
-	 * Indicates if change notifications will be fired after every keystroke
-	 * that affects the value of the rawText or only when the value is either
-	 * complete or empty.
-	 * 
-	 * @return true if every change (including changes from one invalid state to
-	 *         another) triggers a change event; false if only empty or valid
-	 *         values trigger a change event.  Defaults to false.
-	 */
-	public boolean isFireChangeOnKeystroke() {
-		return fireChangeOnKeystroke;
-	}
-
-	/**
-	 * Sets if change notifications will be fired after every keystroke that
-	 * affects the value of the rawText or only when the value is either
-	 * complete or empty.
-	 * 
-	 * @param fireChangeOnKeystroke
-	 *            true if every change (including changes from one invalid state
-	 *            to another) triggers a change event; false if only empty or
-	 *            valid values trigger a change event.  Defaults to false.
-	 */
-	public void setFireChangeOnKeystroke(boolean fireChangeOnKeystroke) {
-		this.fireChangeOnKeystroke = fireChangeOnKeystroke;
-	}
-
-	/**
-	 * JavaBeans boilerplate code...
-	 * 
-	 * @param listener
-	 */
-	public void addPropertyChangeListener(PropertyChangeListener listener) {
-		propertyChangeSupport.addPropertyChangeListener(listener);
-	}
-
-	/**
-	 * JavaBeans boilerplate code...
-	 * 
-	 * @param propertyName
-	 * @param listener
-	 */
-	public void addPropertyChangeListener(String propertyName,
-			PropertyChangeListener listener) {
-		propertyChangeSupport.addPropertyChangeListener(propertyName, listener);
-	}
-
-	/**
-	 * JavaBeans boilerplate code...
-	 * 
-	 * @param listener
-	 */
-	public void removePropertyChangeListener(PropertyChangeListener listener) {
-		propertyChangeSupport.removePropertyChangeListener(listener);
-	}
-
-	/**
-	 * JavaBeans boilerplate code...
-	 * 
-	 * @param propertyName
-	 * @param listener
-	 */
-	public void removePropertyChangeListener(String propertyName,
-			PropertyChangeListener listener) {
-		propertyChangeSupport.removePropertyChangeListener(propertyName,
-				listener);
-	}
-
-	private boolean isEitherValueNotNull(Object oldValue, Object newValue) {
-		return oldValue != null || newValue != null;
-	}
-
-	private void firePropertyChange(String propertyName, Object oldValue,
-			Object newValue) {
-		if (isEitherValueNotNull(oldValue, newValue)) {
-			propertyChangeSupport.firePropertyChange(propertyName,
-					oldValue, newValue);
-		}
-	}
-
-	protected boolean updating = false;
-
-	protected int oldSelection = 0;
-	protected int selection = 0;
-	protected String oldRawText = "";
-   protected boolean replacedSelectedText = false;
-	
-	private VerifyListener verifyListener = new VerifyListener() {
-		public void verifyText(VerifyEvent e) {
-         // If the edit mask is already full, don't let the user type
-         // any new characters
-         if (editMaskParser.isComplete() && // should eventually be .isFull() to account for optional characters
-               e.start == e.end && 
-               e.text.length() > 0) 
-         {
-            e.doit=false;
-            return;
-         }
-         
-			oldSelection = selection;
-			Point selectionRange = text.getSelection();
-         selection = selectionRange.x;
-         
-			if (!updating) {
-   			replacedSelectedText = false;
-   			if (selectionRange.y - selectionRange.x > 0 && e.text.length() > 0) {
-   			   replacedSelectedText = true;
-   			}
-            // If the machine is loaded down (ie: spyware, malware), we might
-            // get another keystroke before asyncExec can process, so we use 
-            // greedyExec instead.
-            SWTUtil.greedyExec(Display.getCurrent(), updateTextField);
-//				Display.getCurrent().asyncExec(updateTextField);
-         }
-		}
-	};
-
-	private Runnable updateTextField = new Runnable() {
-		public void run() {
-			updating = true;
-			try {
-				if (!text.isDisposed()) {
-					Boolean oldIsComplete = new Boolean(editMaskParser.isComplete());
-				
-					editMaskParser.setInput(text.getText());
-					text.setText(editMaskParser.getFormattedResult());
-					String newRawText = editMaskParser.getRawResult();
-				
-					updateSelectionPosition(newRawText);
-					firePropertyChangeEvents(oldIsComplete, newRawText);
-				}
-			} finally {
-				updating = false;
-			}
-		}
-
-		private void updateSelectionPosition(String newRawText) {
-
-         // Adjust the selection
-         if (isInsertingNewCharacter(newRawText) || replacedSelectedText) {
-            // Find the position after where the new character was actually inserted
-            int selectionDelta = 
-               editMaskParser.getNextInputPosition(oldSelection)
-               - oldSelection;
-            if (selectionDelta == 0) {
-               selectionDelta = editMaskParser.getNextInputPosition(selection)
-               - selection;
-            }
-            selection += selectionDelta;
-         }
-         
-			// Did we just type something that was accepted by the mask?
-			if (!newRawText.equals(oldRawText)) { // yep
-            
-            // If the user hits <end>, bounce them back to the end of their actual input
-				int firstIncompletePosition = editMaskParser.getFirstIncompleteInputPosition();
-				if (firstIncompletePosition > 0 && selection > firstIncompletePosition)
-					selection = firstIncompletePosition;
-				text.setSelection(new Point(selection, selection));
-            
-			} else { // nothing was accepted by the mask
-            
-				// Either we backspaced over a literal or we typed an illegal character
-				if (selection > oldSelection) { // typed an illegal character; backup
-					text.setSelection(new Point(selection-1, selection-1));
-				} else { // backspaced over a literal; don't interfere with selection position
-					text.setSelection(new Point(selection, selection));
-				}
-			}
-			oldRawText = newRawText;
-		}
-
-		private boolean isInsertingNewCharacter(String newRawText) {
-			return newRawText.length() > oldRawText.length();
-		}
-
-		private void firePropertyChangeEvents(Boolean oldIsComplete, String newRawText) {
-			Boolean newIsComplete = new Boolean(editMaskParser.isComplete());
-			if (!oldIsComplete.equals(newIsComplete)) {
-				firePropertyChange(FIELD_COMPLETE, oldIsComplete, newIsComplete);
-			}
-			if (!newRawText.equals(oldValidRawText)) {
-				if ( newIsComplete.booleanValue() || "".equals(newRawText) || fireChangeOnKeystroke) {
-					firePropertyChange(FIELD_RAW_TEXT, oldValidRawText, newRawText);
-					firePropertyChange(FIELD_TEXT, oldValidText, text.getText());
-					oldValidText = text.getText();
-					oldValidRawText = newRawText;
-				}
-			}
-		}
-	};
-	
-	private FocusListener focusListener = new FocusAdapter() {
-		public void focusGained(FocusEvent e) {
-			selection = editMaskParser.getFirstIncompleteInputPosition();
-			text.setSelection(selection, selection);
-		}
-	};
-	
-	private DisposeListener disposeListener = new DisposeListener() {
-		public void widgetDisposed(DisposeEvent e) {
-			text.removeVerifyListener(verifyListener);
-			text.removeFocusListener(focusListener);
-			text.removeDisposeListener(disposeListener);
-		}
-	};
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/EditMaskParseException.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/EditMaskParseException.java
deleted file mode 100644
index f2b6aec..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/EditMaskParseException.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     The Pampered Chef - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.mask;
-
-/**
- * Indicates a parse error while parsing an edit mask.
- * 
- * @since 3.3
- */
-public class EditMaskParseException extends RuntimeException {
-
-	private static final long serialVersionUID = 8142999683999681500L;
-
-	/**
-	 * Construct a MaskParseException
-	 */
-	public EditMaskParseException() {
-		super();
-	}
-
-	/**
-	 * @param message
-	 * @param cause
-	 */
-	public EditMaskParseException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-	/**
-	 * @param message
-	 */
-	public EditMaskParseException(String message) {
-		super(message);
-	}
-
-	/**
-	 * @param cause
-	 */
-	public EditMaskParseException(Throwable cause) {
-		super(cause);
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/EditMaskTest.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/EditMaskTest.java
deleted file mode 100644
index 49c9c1c..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/EditMaskTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.mask;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-public class EditMaskTest {
-
-   public static void main(String[] args) {
-      Display display = new Display();
-      Shell shell = new Shell(display);
-
-      Text text = new Text(shell, SWT.BORDER);
-      text.setText("XXXXXXXXXXXXX");// Put some X's in there to pad out the field's default size
-      
-      Text text2 = new Text(shell, SWT.BORDER);
-      text2.setText("630XXXXXXXXXX");
-      
-      shell.setLayout(new RowLayout(SWT.VERTICAL));
-      shell.setSize(800, 600);
-      
-      new EditMask(text).setMask("(###) ###-####");
-      new EditMask(text2).setMask("(###) ###-####");
-      
-      shell.open();
-      while (!shell.isDisposed()) {
-         if (!display.readAndDispatch()) {
-            display.sleep();
-         }
-      }
-   }
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/internal/EditMaskLexerAndToken.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/internal/EditMaskLexerAndToken.java
deleted file mode 100644
index d9c61b4..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/internal/EditMaskLexerAndToken.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     The Pampered Chef - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.mask.internal;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.examples.databinding.mask.EditMaskParseException;
-
-/**
- * Lexical analyzer and token for an input mask.  Since input masks have exactly
- * one token type, we use the same class to be the recognizer and the token 
- * itself.
- * 
- * @since 3.3
- */
-public class EditMaskLexerAndToken {
-
-	/*
-	 * First the literals that represent the types of characters
-	 */
-	private static ArrayList reservedWords = new ArrayList();{
-		reservedWords.add("#");
-		reservedWords.add("A");
-		reservedWords.add("a");
-		reservedWords.add("n");
-	}
-	
-	/*
-	 * ...and their corresponding regular expressions
-	 */
-	private static ArrayList inputRegexes = new ArrayList();{
-		inputRegexes.add("^[0-9]$");
-		inputRegexes.add("^[A-Z]$");
-		inputRegexes.add("^[a-zA-Z]$");
-		inputRegexes.add("^[0-9a-zA-Z]$");
-	}
-	
-	private String charRegex = null;	// A regex for matching input characters or null
-	private String literal = null;		// The literal character if charRegex is null
-	private boolean readOnly;
-	private String input = null;		// The user's input
-	
-	private boolean recognizeReservedWord(String inputMask, int position) {
-		String input = inputMask.substring(position, position+1);
-		for (int reservedWord = 0; reservedWord < reservedWords.size(); reservedWord++) {
-			if (input.equals(reservedWords.get(reservedWord))) {
-				charRegex = (String) inputRegexes.get(reservedWord);
-				literal = null;
-				input = null;
-				readOnly = false;
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean recognizeBackslashLiteral(String inputMask, int position) throws EditMaskParseException {
-		String input = inputMask.substring(position, position+1);
-		if (input.equals("\\")) {
-			try {
-				input = inputMask.substring(position+1, position+2);
-				charRegex = null;
-				this.input = input;
-				literal = input;
-				readOnly = true;
-				return true;
-			} catch (Throwable t) {
-				throw new EditMaskParseException("Found a \\ without a character after it: " + inputMask);
-			}
-		}
-		return false;
-	}
-
-	private boolean recognizeLiteral(String inputMask, int position) {
-		literal = inputMask.substring(position, position+1);
-		this.input = literal;
-		charRegex = null;
-		readOnly = true;
-		return true;
-	}
-
-	/**
-	 * Initializes itself based on characters in edit mask starting at position; 
-	 * returns number of chars consumed
-	 * 
-	 * @param inputMask The entire edit mask
-	 * @param position The position to begin parsing
-	 * @return The number of characters consumed
-	 * @throws EditMaskParseException If it encountered a syntax error during the parse
-	 */
-	public int initializeEditMask(String inputMask, int position) throws EditMaskParseException {
-		clear();
-		if (recognizeReservedWord(inputMask, position)) {
-			return 1;
-		}
-		if (recognizeBackslashLiteral(inputMask, position)) {
-			return 2;
-		}
-		if (!recognizeLiteral(inputMask, position)) {
-			throw new EditMaskParseException("Should never see this error in this implementation!");
-		}
-		readOnly = true;
-		return 1;
-	}
-
-	/**
-	 * ignores invalid input; stores valid input
-	 * @param inputCharacter 
-	 * @return 
-	 */
-	public boolean accept(String inputCharacter) {
-		if (readOnly) {
-			return false;
-		}
-		if (literal != null) {
-			return false;
-		}
-		if (!canAcceptMoreCharacters()) {
-			return false;
-		}
-		if (inputCharacter.matches(charRegex)) {
-			this.input = inputCharacter;
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @return Returns the characters it has accepted.  In the current implementation,
-	 * this is exactly one character.  Once quantifiers are implemented, this could
-	 * be many characters.  If no characters have been accepted, returns null.
-	 */
-	public String getInput() {
-		return input;
-	}
-	
-	/**
-	 * Clear any accepted input
-	 */
-	public void clear() {
-		if (!isReadOnly())
-			input = null;
-	}
-
-	/**
-	 * @return true if it's a literal; false if it's a placeholder
-	 */
-	public boolean isReadOnly() {
-		return readOnly;
-	}
-
-	/**
-	 * @return true if it is a literal or if it has accepted the minimum 
-	 * required number of characters
-	 */
-	public boolean isComplete() {
-		if (input != null) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @return A position may be complete and yet able to accept more characters if
-	 * the position includes optional characters via a quantifier of some type.
-	 * Not implemented right now.
-	 */
-	public boolean canAcceptMoreCharacters() {
-		return !isComplete();
-	}
-
-	/**
-	 * @return the minimum number of characters this RegexLexer must accept 
-	 * in order to be complete.  Because we don't yet support quantifiers, this
-	 * is currently always 1.
-	 */
-	public int getMinimumLength() {
-		return 1;
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/internal/EditMaskParser.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/internal/EditMaskParser.java
deleted file mode 100644
index fc87f9e..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/internal/EditMaskParser.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     The Pampered Chef - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.mask.internal;
-
-import java.util.LinkedList;
-
-import org.eclipse.jface.examples.databinding.mask.EditMaskParseException;
-
-/**
- * @since 3.3
- */
-public class EditMaskParser {
-	private EditMaskLexerAndToken[] expectedTokens;
-	private char placeholder = ' ';
-	
-	/**
-	 * @param editMask The complete edit mask 
-	 * @throws EditMaskParseException
-	 */
-	public EditMaskParser(String editMask) throws EditMaskParseException {
-		LinkedList tokens = new LinkedList();
-		int position = 0;
-		while (position < editMask.length()) {
-			EditMaskLexerAndToken token = new EditMaskLexerAndToken();
-			position += token.initializeEditMask(editMask, position);
-			tokens.add(token);
-		}
-		expectedTokens = (EditMaskLexerAndToken[]) tokens.toArray(new EditMaskLexerAndToken[tokens.size()]);
-	}
-	
-	/**
-	 * @param input the user input which may or may not be in valid format
-	 */
-	public void setInput(String input) {
-		for (int i = 0; i < expectedTokens.length; i++) {
-			expectedTokens[i].clear();
-		}
-		int tokenPosition = 0;
-		int inputPosition = 0;
-		while (inputPosition < input.length() && tokenPosition < expectedTokens.length) {
-			while (tokenPosition < expectedTokens.length &&
-					(expectedTokens[tokenPosition].isComplete() || 
-					 expectedTokens[tokenPosition].isReadOnly())) 
-			{
-				++tokenPosition;
-			}
-			if (tokenPosition < expectedTokens.length) {
-				while (inputPosition < input.length() && !expectedTokens[tokenPosition].isComplete()) {
-					String inputChar = input.substring(inputPosition, inputPosition+1);
-					expectedTokens[tokenPosition].accept(inputChar);
-					++inputPosition;
-				}
-			}
-		}
-	}
-	
-	/**
-	 * @return the formatted version of the user input
-	 */
-	public String getFormattedResult() {
-		StringBuffer result = new StringBuffer();
-		for (int i = 0; i < expectedTokens.length; i++) {
-			String outputChar = expectedTokens[i].getInput();
-			if (outputChar == null) {
-				outputChar = "" + placeholder;
-			}
-			result.append(outputChar);
-		}
-		return result.toString();
-	}
-	
-	/**
-	 * @return the user input with all literals removed
-	 */
-	public String getRawResult() {
-		StringBuffer result = new StringBuffer();
-		for (int i = 0; i < expectedTokens.length; i++) {
-			if (expectedTokens[i].isReadOnly()) {
-				continue;
-			}
-			String outputChar = expectedTokens[i].getInput();
-			if (outputChar == null) {
-				outputChar = "";
-			}
-			result.append(outputChar);
-		}
-		return result.toString();
-	}
-
-	/**
-	 * @return true if the current input is a valid input
-	 */
-	public boolean isComplete() {
-		for (int i = 0; i < expectedTokens.length; i++) {
-			if (!expectedTokens[i].isComplete()) {
-				return false;
-			}
-		}
-		return true;
-	}
-	
-	/**
-	 * @param startingAt The current index within the user input string
-	 * @return The first non-read-only index greater than or equal to startingAt
-	 */
-	public int getNextInputPosition(int startingAt) {
-		while (startingAt < expectedTokens.length-1 && expectedTokens[startingAt].isReadOnly()) {
-			++startingAt;
-		}
-		return startingAt;
-	}
-	
-	/**
-	 * @return the first input position whose token is not marked as complete.  Returns -1 if all are complete
-	 */
-	public int getFirstIncompleteInputPosition() {
-		for (int position = 0; position < expectedTokens.length; position++) {
-			if (!expectedTokens[position].isComplete()) {
-				return position;
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * @return Returns the placeholder.
-	 */
-	public char getPlaceholder() {
-		return placeholder;
-	}
-
-	/**
-	 * @param placeholder The placeholder to set.
-	 */
-	public void setPlaceholder(char placeholder) {
-		this.placeholder = placeholder;
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/internal/SWTUtil.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/internal/SWTUtil.java
deleted file mode 100644
index 8bd2b2a..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/internal/SWTUtil.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.mask.internal;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 1.0
- */
-public class SWTUtil {
-    /**
-     * Stores a work queue for each display
-     */
-    private static Map mapDisplayOntoWorkQueue = new HashMap();
-
-    private SWTUtil() {
-    }
-
-    /**
-     * Runs the given runnable on the given display as soon as possible. If
-     * possible, the runnable will be executed before the next widget is
-     * repainted, but this behavior is not guaranteed. Use this method to
-     * schedule work will affect the way one or more widgets are drawn.
-     * 
-     * <p>
-     * This is threadsafe.
-     * </p>
-     * 
-     * @param d
-     *            display
-     * @param r
-     *            runnable to execute in the UI thread.
-     */
-    public static void greedyExec(Display d, Runnable r) {
-        if (d.isDisposed()) {
-            return;
-        }
-
-        // if (Display.getCurrent() == d) {
-        // r.run();
-        // } else {
-        WorkQueue queue = getQueueFor(d);
-        queue.asyncExec(r);
-        // }
-    }
-
-    /**
-     * Runs the given runnable on the given display as soon as possible. Unlike
-     * greedyExec, this has no effect if the given runnable has already been
-     * scheduled for execution. Use this method to schedule work that will
-     * affect the way one or more wigdets are drawn, but that should only happen
-     * once.
-     * 
-     * <p>
-     * This is threadsafe.
-     * </p>
-     * 
-     * @param d
-     *            display
-     * @param r
-     *            runnable to execute in the UI thread. Has no effect if the
-     *            given runnable has already been scheduled but has not yet run.
-     */
-    public static void runOnce(Display d, Runnable r) {
-        if (d.isDisposed()) {
-            return;
-        }
-        WorkQueue queue = getQueueFor(d);
-        queue.runOnce(r);
-    }
-
-    /**
-     * Cancels a greedyExec or runOnce that was previously scheduled on the
-     * given display. Has no effect if the given runnable is not in the queue
-     * for the given display
-     * 
-     * @param d
-     *            target display
-     * @param r
-     *            runnable to execute
-     */
-    public static void cancelExec(Display d, Runnable r) {
-        if (d.isDisposed()) {
-            return;
-        }
-        WorkQueue queue = getQueueFor(d);
-        queue.cancelExec(r);
-    }
-
-    /**
-     * Returns the work queue for the given display. Creates a work queue if
-     * none exists yet.
-     * 
-     * @param d
-     *            display to return queue for
-     * @return a work queue (never null)
-     */
-    private static WorkQueue getQueueFor(final Display d) {
-        WorkQueue result;
-        synchronized (mapDisplayOntoWorkQueue) {
-            // Look for existing queue
-            result = (WorkQueue) mapDisplayOntoWorkQueue.get(d);
-
-            if (result == null) {
-                // If none, create new queue
-                result = new WorkQueue(d);
-                final WorkQueue q = result;
-                mapDisplayOntoWorkQueue.put(d, result);
-                d.asyncExec(new Runnable() {
-                    public void run() {
-                        d.disposeExec(new Runnable() {
-                            public void run() {
-                                synchronized (mapDisplayOntoWorkQueue) {
-                                    q.cancelAll();
-                                    mapDisplayOntoWorkQueue.remove(d);
-                                }
-                            }
-                        });
-                    }
-                });
-            }
-            return result;
-        }
-    }
-    
-    /**
-     * @param rgb1
-     * @param rgb2
-     * @param ratio
-     * @return the RGB object
-     */
-    public static RGB mix(RGB rgb1, RGB rgb2, double ratio) {
-        return new RGB(interp(rgb1.red, rgb2.red, ratio), 
-                interp(rgb1.green, rgb2.green, ratio),
-                interp(rgb1.blue, rgb2.blue, ratio));
-    }
-    
-    private static int interp(int i1, int i2, double ratio) {
-        int result = (int)(i1 * ratio + i2 * (1.0d - ratio));
-        if (result < 0) result = 0;
-        if (result > 255) result = 255;
-        return result;
-    }
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/internal/WorkQueue.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/internal/WorkQueue.java
deleted file mode 100644
index e5eeaea..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/mask/internal/WorkQueue.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jface.examples.databinding.mask.internal;
-
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Set;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * @since 3.2
- *
- */
-public class WorkQueue {
-	
-    private boolean updateScheduled = false;
-
-    private boolean paintListenerAttached = false;
-
-    private LinkedList pendingWork = new LinkedList();
-
-    private Display d;
-
-    private Set pendingWorkSet = new HashSet();
-
-    private Runnable updateJob = new Runnable() {
-        public void run() {
-            doUpdate();
-            updateScheduled = false;
-        }
-    };
-
-    private Listener paintListener = new Listener() {
-        public void handleEvent(Event event) {
-            paintListenerAttached = false;
-            d.removeFilter(SWT.Paint, this);
-            doUpdate();
-        }
-    };
-
-    /**
-     * @param targetDisplay
-     */
-    public WorkQueue(Display targetDisplay) {
-        d = targetDisplay;
-    }
-
-    private void doUpdate() {
-        for (;;) {
-            Runnable next;
-            synchronized (pendingWork) {
-                if (pendingWork.isEmpty()) {
-                    break;
-                }
-                next = (Runnable) pendingWork.removeFirst();
-                pendingWorkSet.remove(next);
-            }
-
-            next.run();
-        }
-        
-    }
-
-    /**
-     * Schedules some work to happen in the UI thread as soon as possible. If
-     * possible, the work will happen before the next control redraws. The given
-     * runnable will only be run once. Has no effect if this runnable has
-     * already been queued for execution.
-     * 
-     * @param work
-     *            runnable to execute
-     */
-    public void runOnce(Runnable work) {
-        synchronized (pendingWork) {
-            if (pendingWorkSet.contains(work)) {
-                return;
-            }
-
-            pendingWorkSet.add(work);
-
-            asyncExec(work);
-        }
-    }
-
-    /**
-     * Schedules some work to happen in the UI thread as soon as possible. If
-     * possible, the work will happen before the next control redraws. Unlike
-     * runOnce, calling asyncExec twice with the same runnable will cause that
-     * runnable to run twice.
-     * 
-     * @param work
-     *            runnable to execute
-     */
-    public void asyncExec(Runnable work) {
-        synchronized (pendingWork) {
-            pendingWork.add(work);
-            if (!updateScheduled) {
-                updateScheduled = true;
-                d.asyncExec(updateJob);
-            }
-
-            // If we're in the UI thread, add an event filter to ensure
-            // the work happens ASAP
-            if (Display.getCurrent() == d) {
-                if (!paintListenerAttached) {
-                    paintListenerAttached = true;
-                    d.addFilter(SWT.Paint, paintListener);
-                }
-            }
-        }
-    }
-
-    /**
-     * Cancels a previously-scheduled runnable. Has no effect if the given
-     * runnable was not previously scheduled or has already executed.
-     * 
-     * @param toCancel
-     *            runnable to cancel
-     */
-    public void cancelExec(Runnable toCancel) {
-        synchronized (pendingWork) {
-            pendingWork.remove(toCancel);
-            pendingWorkSet.remove(toCancel);
-        }
-    }
-
-    /**
-     * Cancels all pending work.
-     */
-    public void cancelAll() {
-        synchronized (pendingWork) {
-            pendingWork.clear();
-            pendingWorkSet.clear();
-        }
-    }
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Account.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Account.java
deleted file mode 100644
index 7509d64..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Account.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.model;
-
-import java.util.Date;
-
-import org.eclipse.jface.examples.databinding.ModelObject;
-
-public class Account extends ModelObject {
-
-	private String country;
-	private String firstName;
-	private String lastName;
-	private String state;
-	private String phone;	
-	private Date expiryDate;
-
-	public void setFirstName(String string) {
-		String oldValue = firstName;
-		firstName = string;
-		firePropertyChange("firstName", oldValue, string);		
-	}
-
-	public void setLastName(String string) {
-		String oldValue = lastName;
-		lastName = string;
-		firePropertyChange("lastName", oldValue, string);				
-	}
-
-	public void setState(String string) {
-		String oldValue = state;
-		state = string;
-		firePropertyChange("state", oldValue, string);		
-	}
-
-	public void setPhone(String string) {
-		String oldValue = phone;
-		phone = string;
-		firePropertyChange("phone", oldValue, phone);		
-	}
-
-	public void setCountry(String string) {
-		Object oldValue = country;
-		country = string;
-		firePropertyChange("country", oldValue, string);
-	}
-
-	public String getCountry() {
-		return country;
-	}
-
-	public String getFirstName() {
-		return firstName;
-	}
-
-	public String getLastName() {
-		return lastName;
-	}
-
-	public String getState() {
-		return state;
-	}
-
-	public String getPhone() {
-		return phone;
-	}
-
-	public Date getExpiryDate() {
-		return expiryDate;
-	}
-
-	public void setExpiryDate(Date expiryDate) {
-		firePropertyChange("expiryDate", this.expiryDate,
-				this.expiryDate = expiryDate);
-	}
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Adventure.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Adventure.java
deleted file mode 100644
index d78eed0..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Adventure.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.model;
-
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.examples.databinding.ModelObject;
-
-public class Adventure extends ModelObject {
-
-	private boolean petsAllowed;
-
-	private double price;
-
-	private Lodging defaultLodging;
-
-	private String name;
-
-	private String description;
-
-	private String location;
-	
-	private int maxNumberOfPeople;
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String string) {
-		Object oldValue = name;
-		name = string;
-		firePropertyChange("name", oldValue, name);
-	}
-	
-	public int getMaxNumberOfPeople(){
-		return maxNumberOfPeople;
-	}
-	
-	public void setMaxNumberOfPeople(int anInt) {
-		int oldValue = maxNumberOfPeople;
-		maxNumberOfPeople = anInt;
-		firePropertyChange("maxNumberOfPeople", oldValue, maxNumberOfPeople);
-	}
-	
-	public IValidator getMaxNumberOfPeopleDomainValidator() {
-		return new IValidator() {
-			public IStatus validate(Object value) {
-				int intValue = ((Integer)value).intValue();
-				if (intValue < 1 || intValue > 20) {
-					return ValidationStatus
-							.error("Max number of people must be between 1 and 20 inclusive");
-				}
-				return null;
-			}
-		};
-	}
-
-	public Lodging getDefaultLodging() {
-		return defaultLodging;
-	}
-
-	public void setDefaultLodging(Lodging lodging) {
-		Object oldValue = defaultLodging;
-		defaultLodging = lodging;
-		firePropertyChange("defaultLodging", oldValue, defaultLodging);
-	}
-
-	public void setPrice(double d) {
-		double oldValue = price;
-		price = d;
-		firePropertyChange("price", new Double(oldValue), new Double(price));
-	}
-
-	public double getPrice() {
-		return price;
-	}
-
-	public void setPetsAllowed(boolean b) {
-		boolean oldValue = petsAllowed;
-		petsAllowed = b;
-		firePropertyChange("petsAllowed", new Boolean(oldValue), new Boolean(
-				petsAllowed));
-	}
-
-	public boolean isPetsAllowed() {
-		return petsAllowed;
-	}
-
-	public void setDescription(String string) {
-		Object oldValue = description;
-		description = string;
-		firePropertyChange("description", oldValue, description);
-	}
-
-	public void setLocation(String string) {
-		Object oldValue = location;
-		location = string;
-		firePropertyChange("location", oldValue, location);
-	}
-
-	public String getDescription() {
-		return description;
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/AdventureFactory.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/AdventureFactory.java
deleted file mode 100644
index 2b95e13..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/AdventureFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.model;
-
-public class AdventureFactory {
-
-	public Catalog createCatalog() {
-		return new Catalog();
-	}
-
-	public Category createCategory() {
-		return new Category();
-	}
-
-	public Adventure createAdventure() {
-		return new Adventure();
-	}
-
-	public Lodging createLodging() {
-		return new Lodging();
-	}
-
-	public Transportation createTransportation() {
-		return new Transportation();
-	}
-
-	public Account createAccount() {
-		return new Account();
-	}
-
-	public Cart createCart() {
-		return new Cart();
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/AggregateObservableValue.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/AggregateObservableValue.java
deleted file mode 100644
index 83086b4..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/AggregateObservableValue.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.model;
-
-import java.util.StringTokenizer;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-
-/**
- * @since 3.2
- *
- */
-public class AggregateObservableValue extends AbstractObservableValue {
-
-	private IObservableValue[] observableValues;
-
-	private String delimiter;
-
-	private boolean updating = false;
-
-	private String currentValue;
-
-	private IValueChangeListener listener = new IValueChangeListener() {
-		public void handleValueChange(ValueChangeEvent event) {
-			if (!updating) {
-				fireValueChange(Diffs.createValueDiff(currentValue,
-						doGetValue()));
-			}
-		}
-	};
-
-	/**
-	 * @param observableValues
-	 * @param delimiter
-	 */
-	public AggregateObservableValue(IObservableValue[] observableValues,
-			String delimiter) {
-		this.observableValues = observableValues;
-		this.delimiter = delimiter;
-		for (int i = 0; i < observableValues.length; i++) {
-			observableValues[i].addValueChangeListener(listener);
-		}
-		doGetValue();
-	}
-
-	public void doSetValue(Object value) {
-		Object oldValue = doGetValue();
-		StringTokenizer tokenizer = new StringTokenizer((String) value,
-				delimiter);
-		try {
-			updating = true;
-			for (int i = 0; i < observableValues.length; i++) {
-				if (tokenizer.hasMoreElements()) {
-					observableValues[i].setValue(tokenizer.nextElement());
-				} else {
-					observableValues[i].setValue(null);
-				}
-			}
-		} finally {
-			updating = false;
-		}
-		doGetValue();
-		fireValueChange(Diffs.createValueDiff(oldValue, value));
-	}
-
-	public Object doGetValue() {
-		StringBuffer result = new StringBuffer();
-		for (int i = 0; i < observableValues.length; i++) {
-			if (i > 0 & i < observableValues.length) {
-				result.append(delimiter);
-			}
-			result.append(observableValues[i].getValue());
-		}
-		currentValue = result.toString();
-		return currentValue;
-	}
-
-	public Object getValueType() {
-		return String.class;
-	}
-
-	public synchronized void dispose() {
-		for (int i = 0; i < observableValues.length; i++) {
-			observableValues[i].removeValueChangeListener(listener);
-		}
-		super.dispose();
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Cart.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Cart.java
deleted file mode 100644
index b82f45e..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Cart.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.model;
-
-public class Cart {
-
-	public void setAdventureDays(int i) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public int getLodgingDays() {
-		// TODO Auto-generated method stub
-		return 0;
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Catalog.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Catalog.java
deleted file mode 100644
index edbae49..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Catalog.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.examples.databinding.ModelObject;
-
-public class Catalog extends ModelObject {
-
-	private Category[] categories = new Category[0];
-
-	private Lodging[] lodgings = new Lodging[0];
-
-	private Transportation[] transportations = new Transportation[0];
-
-	private Account[] accounts = new Account[0];
-	
-	private List signons = new ArrayList();
-	
-	public List getSignons(){
-		return signons;
-	}
-	
-	public void addSignon(Signon aSignon){
-		signons.add(aSignon);
-		firePropertyChange("signons",null,null);
-	}
-	
-	public void removeSignon(Signon aSignon){
-		signons.remove(aSignon);
-		firePropertyChange("signons",null,null);
-	}	
-
-	public Category[] getCategories() {
-		return categories;
-	}
-
-	public void addCategory(Category category) {
-		categories = (Category[]) append(categories, category);
-		firePropertyChange("categories", null, null);
-	}
-
-	public void addLodging(Lodging lodging) {
-		lodgings = (Lodging[]) append(lodgings, lodging);
-		firePropertyChange("lodgings", null, null);
-	}
-
-	public void addTransportation(Transportation transportation) {
-		transportations = (Transportation[]) append(transportations, transportation);
-		firePropertyChange("transportations", null, null);
-	}
-
-	public void addAccount(Account account) {
-		accounts = (Account[]) append(accounts, account);
-		firePropertyChange("accounts", null, null);
-	}
-
-	public Lodging[] getLodgings() {
-		return lodgings;
-	}
-
-	public void removeLodging(Lodging lodging) {
-		lodgings = (Lodging[]) remove(lodgings, lodging);
-		firePropertyChange("lodgings", null, null);
-	}
-	
-	public void removeAccount(Account anAccount) {
-		accounts = (Account[]) remove(accounts, anAccount);
-		firePropertyChange("accounts", null, null);
-	}	
-
-	public Account[] getAccounts() {
-		return accounts;
-	}
-	
-	public Transportation[] getTransporations(){
-		return transportations;
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Category.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Category.java
deleted file mode 100644
index 778a31c..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Category.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.model;
-
-import org.eclipse.jface.examples.databinding.ModelObject;
-
-public class Category extends ModelObject {
-
-	private String name;
-
-	private Adventure[] adventures = new Adventure[0];
-
-	public void setName(String string) {
-		Object oldValue = name;
-		name = string;
-		firePropertyChange("name", oldValue, name);
-	}
-
-	public void addAdventure(Adventure adventure) {
-		adventures = (Adventure[]) append(adventures, adventure);
-		firePropertyChange("adventures", null, null);
-	}
-
-	public Adventure[] getAdventures() {
-		return adventures;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Lodging.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Lodging.java
deleted file mode 100644
index 0b9d081..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Lodging.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.model;
-
-import org.eclipse.jface.examples.databinding.ModelObject;
-
-public class Lodging extends ModelObject {
-
-	private String name;
-	private String description;
-
-	public String getDescription() {
-		return description;
-	}
-
-	public void setDescription(String string) {
-		Object oldValue = description;
-		description = string;
-		firePropertyChange("description",oldValue,description);
-	}
-
-	public void setName(String string) {
-		Object oldValue = name;
-		name = string;
-		firePropertyChange("name",oldValue,name);
-	}
-	
-	public String getName() {
-		return name;
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/PriceModelObject.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/PriceModelObject.java
deleted file mode 100644
index 35e3f5e..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/PriceModelObject.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.model;
-
-import org.eclipse.jface.examples.databinding.ModelObject;
-
-
-public class PriceModelObject extends ModelObject {
-	
-	private double price;
-	
-	public double getDouble(){
-		return price;
-	}
-	public void setPrice(double aPrice){
-		int oldDollars = getDollars();
-		int oldCents = getCents();
-		double oldValue = price;
-		price = aPrice;
-		firePropertyChange("dollars",oldDollars,getDollars());
-		firePropertyChange("cents",oldCents,getCents());
-		firePropertyChange("price",new Double(oldValue), new Double(price));
-	}
-	
-	public double getPrice(){
-		return price;
-	}
-
-	public int getCents(){
-		return (int) (100*price - 100*Math.floor(price));
-	}
-	
-	public void setCents(int cents){
-		double oldPrice = getPrice();
-		int oldCents = getCents();
-		price = getDollars() + cents *.01;
-		firePropertyChange("cents",oldCents,getCents());
-		firePropertyChange("price", new Double(oldPrice), new Double(price));
-	}
-	
-	public int getDollars(){
-		return new Double(price).intValue();
-	}
-	
-	public void setDollars(int dollars){
-		double oldPrice = getPrice();
-		int oldDollars = getDollars();
-		price = dollars + getCents() *.01;
-		firePropertyChange("dollars",oldDollars,getDollars());
-		firePropertyChange("price", new Double(oldPrice), new Double(price));
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/SampleData.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/SampleData.java
deleted file mode 100644
index f30a159..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/SampleData.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.model;
-
-
-public class SampleData {
-
-	public static Category WINTER_CATEGORY;
-
-	public static Category SUMMER_CATEGORY;
-
-	public static Adventure BEACH_HOLIDAY;
-
-	public static Adventure RAFTING_HOLIDAY;
-
-	public static Adventure WINTER_HOLIDAY;
-
-	public static Adventure ICE_FISHING;
-
-	public static Lodging FIVE_STAR_HOTEL;
-
-	public static Lodging YOUTH_HOSTEL;
-
-	public static Lodging CAMP_GROUND;
-
-	public static Catalog CATALOG_2005;
-
-	public static Transportation GREYHOUND_BUS;
-
-	public static Transportation EXECUTIVE_JET;
-
-	public static Account PRESIDENT;
-
-	public static Account DENTIST;
-
-	public static Account SANTA_CLAUS;
-
-	public static Cart CART;
-
-	public static AdventureFactory FACTORY;
-
-	// public static ITree CATALOG_TREE;
-	//	
-	// public static ITree CATEGORY_TREE;
-
-	public static Signon SIGNON_ADMINISTRATOR;
-
-	public static Signon SIGNON_JOEBLOGGS;
-
-	static {
-		initializeData();
-	}
-
-	public static void initializeData() {
-
-		FACTORY = new AdventureFactory();
-
-		CATALOG_2005 = FACTORY.createCatalog();
-
-		// Categories
-		WINTER_CATEGORY = FACTORY.createCategory();
-		WINTER_CATEGORY.setName("Freeze Adventures");
-		WINTER_CATEGORY.setId("100");
-		CATALOG_2005.addCategory(WINTER_CATEGORY);
-
-		SUMMER_CATEGORY = FACTORY.createCategory();
-		SUMMER_CATEGORY.setName("Hot Adventures");
-		SUMMER_CATEGORY.setId("200");
-		CATALOG_2005.addCategory(SUMMER_CATEGORY);
-
-		// Adventures
-		WINTER_HOLIDAY = FACTORY.createAdventure();
-		WINTER_HOLIDAY.setDescription("Winter holiday in France");
-		WINTER_HOLIDAY.setName("Ski Alps");
-		WINTER_HOLIDAY.setLocation("Chamonix");
-		WINTER_HOLIDAY.setPrice(4000.52d);
-		WINTER_HOLIDAY.setId("150");
-		WINTER_HOLIDAY.setMaxNumberOfPeople(3);
-		WINTER_CATEGORY.addAdventure(WINTER_HOLIDAY);
-
-		ICE_FISHING = FACTORY.createAdventure();
-		ICE_FISHING.setDescription("Ice Fishing in Helsinki");
-		ICE_FISHING.setName("Ice Fishing");
-		ICE_FISHING.setLocation("Finland");
-		ICE_FISHING.setPrice(375.55d);
-		WINTER_CATEGORY.addAdventure(ICE_FISHING);
-
-		BEACH_HOLIDAY = FACTORY.createAdventure();
-		BEACH_HOLIDAY.setDescription("Beach holiday in Spain");
-		BEACH_HOLIDAY.setName("Playa");
-		BEACH_HOLIDAY.setLocation("Lloret de Mar");
-		BEACH_HOLIDAY.setPrice(2000.52d);
-		BEACH_HOLIDAY.setId("250");
-		SUMMER_CATEGORY.addAdventure(BEACH_HOLIDAY);
-
-		RAFTING_HOLIDAY = FACTORY.createAdventure();
-		RAFTING_HOLIDAY
-				.setDescription("White water rafting on the Ottawa river");
-		RAFTING_HOLIDAY.setName("Whitewater");
-		RAFTING_HOLIDAY.setLocation("Ottawa");
-		RAFTING_HOLIDAY.setPrice(8000.52d);
-		RAFTING_HOLIDAY.setId("270");
-		SUMMER_CATEGORY.addAdventure(RAFTING_HOLIDAY);
-
-		// Lodgings
-		FIVE_STAR_HOTEL = FACTORY.createLodging();
-		FIVE_STAR_HOTEL.setDescription("Deluxe palace");
-		FIVE_STAR_HOTEL.setName("Flashy");
-		YOUTH_HOSTEL = FACTORY.createLodging();
-		YOUTH_HOSTEL.setDescription("Youth Hostel");
-		YOUTH_HOSTEL.setName("Basic");
-		CAMP_GROUND = FACTORY.createLodging();
-		CAMP_GROUND.setDescription("Camp ground");
-		CAMP_GROUND.setName("WetAndCold");
-		CATALOG_2005.addLodging(FIVE_STAR_HOTEL);
-		CATALOG_2005.addLodging(YOUTH_HOSTEL);
-		CATALOG_2005.addLodging(CAMP_GROUND);
-		WINTER_HOLIDAY.setDefaultLodging(YOUTH_HOSTEL);
-
-		// Transporation
-		GREYHOUND_BUS = FACTORY.createTransportation();
-		GREYHOUND_BUS.setArrivalTime("14:30");
-		GREYHOUND_BUS.setPrice(25.50);
-		CATALOG_2005.addTransportation(GREYHOUND_BUS);
-		EXECUTIVE_JET = FACTORY.createTransportation();
-		EXECUTIVE_JET.setArrivalTime("11:10");
-		EXECUTIVE_JET.setPrice(1500.99);
-		CATALOG_2005.addTransportation(EXECUTIVE_JET);
-
-		// Accounts
-		PRESIDENT = FACTORY.createAccount();
-		PRESIDENT.setFirstName("George");
-		PRESIDENT.setLastName("Bush");
-		PRESIDENT.setState("TX");
-		PRESIDENT.setPhone("1112223333");
-		PRESIDENT.setCountry("U.S.A");
-		DENTIST = FACTORY.createAccount();
-		DENTIST.setFirstName("Tooth");
-		DENTIST.setLastName("Fairy");
-		DENTIST.setState("CA");
-		DENTIST.setPhone("4543219876");
-		DENTIST.setCountry("PainLand");
-		SANTA_CLAUS = FACTORY.createAccount();
-		SANTA_CLAUS.setFirstName("Chris");
-		SANTA_CLAUS.setLastName("Chringle");
-		SANTA_CLAUS.setState("WI");
-		SANTA_CLAUS.setPhone("8617429856");
-		SANTA_CLAUS.setCountry("NorthPole");
-		CATALOG_2005.addAccount(PRESIDENT);
-		CATALOG_2005.addAccount(DENTIST);
-		CATALOG_2005.addAccount(SANTA_CLAUS);
-
-		// Signons
-		SIGNON_ADMINISTRATOR = new Signon("Administrator", "Foo123Bar");
-		SIGNON_JOEBLOGGS = new Signon("JoeBloggs", "Harry5Potter");
-		CATALOG_2005.addSignon(SIGNON_ADMINISTRATOR);
-		CATALOG_2005.addSignon(SIGNON_JOEBLOGGS);
-
-		CART = FACTORY.createCart();
-
-		// initTrees();
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Signon.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Signon.java
deleted file mode 100644
index f6fae9f..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Signon.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.model;
-
-import org.eclipse.jface.examples.databinding.ModelObject;
-
-public class Signon extends ModelObject {
-	
-	String userId;
-	String password;
-	
-	public Signon(String aUserId, String aPassword) {
-		userId = aUserId;
-		password = aPassword;
-	}
-	public String getPassword() {
-		return password;
-	}
-	public void setPassword(String aPassword) {
-		String oldValue = password;
-		password = aPassword;
-		firePropertyChange("password",oldValue,password);
-	}
-	public String getUserId() {
-		return userId;
-	}
-	public void setUserId(String aUserId) {
-		String oldValue = userId;
-		userId = aUserId;
-		firePropertyChange("userId",oldValue,userId);
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/SimpleCart.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/SimpleCart.java
deleted file mode 100644
index 8fa45fa..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/SimpleCart.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.model;
-
-import org.eclipse.jface.examples.databinding.ModelObject;
-
-/**
- * @since 3.2
- *
- */
-public class SimpleCart extends ModelObject {
-
-	private int numItems;
-
-	public int getNumItems() {
-		return numItems;
-	}
-
-	public void setNumItems(int numItems) {
-		firePropertyChange("numItems", this.numItems, this.numItems = numItems);
-	}
-	
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/SimpleModel.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/SimpleModel.java
deleted file mode 100644
index cec1927..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/SimpleModel.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2005 David Orme <djo@coconut-palm-software.com>
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     David Orme     - Initial API and implementation
- */
-package org.eclipse.jface.examples.databinding.model;
-
-import java.util.LinkedList;
-
-
-public class SimpleModel {
-	public SimpleModel() {
-		// Add some sample data to our personList...
-		personList.add(new SimplePerson("John", "1234", "Wheaton", "IL"));
-		personList.add(new SimplePerson("Jane", "1234", "Glen Ellyn", "IL"));
-		personList.add(new SimplePerson("Frank", "1234", "Lombard", "IL"));
-		personList.add(new SimplePerson("Joe", "1234", "Elmhurst", "IL"));
-		personList.add(new SimplePerson("Chet", "1234", "Oak Lawn", "IL"));
-		personList.add(new SimplePerson("Wilbur", "1234", "Austin", "IL"));
-		personList.add(new SimplePerson("Elmo", "1234", "Chicago", "IL"));
-	}
-
-	// Now a PersonList property...
-	
-	LinkedList personList = new LinkedList();
-	
-	public LinkedList getPersonList() {
-		return personList;
-	}
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/SimpleOrder.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/SimpleOrder.java
deleted file mode 100644
index 7636a4c..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/SimpleOrder.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     The Pampered Chef - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.model;
-
-import java.util.Date;
-
-import org.eclipse.jface.examples.databinding.ModelObject;
-
-/**
- * @since 1.0
- *
- */
-public class SimpleOrder extends ModelObject {
-
-	private int orderNumber;
-	private Date date;
-
-	/**
-	 * @return Returns the date.
-	 */
-	public Date getDate() {
-		return date;
-	}
-
-	/**
-	 * @param date The date to set.
-	 */
-	public void setDate(Date date) {
-		this.date = date;
-	}
-
-	/**
-	 * @return Returns the orderNumber.
-	 */
-	public int getOrderNumber() {
-		return orderNumber;
-	}
-
-	/**
-	 * @param orderNumber The orderNumber to set.
-	 */
-	public void setOrderNumber(int orderNumber) {
-		this.orderNumber = orderNumber;
-	}
-
-	/**
-	 * @param i
-	 * @param date
-	 */
-	public SimpleOrder(int i, Date date) {
-		this.orderNumber = i;
-		this.date = date;
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/SimplePerson.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/SimplePerson.java
deleted file mode 100644
index 5bdddf5..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/SimplePerson.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2005 David Orme <djo@coconut-palm-software.com>
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     David Orme     - Initial API and implementation
- *     Brad Reynolds (bug 139407)
- */
-package org.eclipse.jface.examples.databinding.model;
-
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.jface.examples.databinding.ModelObject;
-
-public class SimplePerson extends ModelObject {
-	
-	private String name = "";
-	private String address = "";
-	private String city = "";
-	private String state = "";
-	private SimpleCart cart = new SimpleCart();
-	
-	private List orders = new LinkedList();
-	
-	public SimplePerson(String name, String address, String city, String state) {
-		this.name = name;
-		this.address = address;
-		this.city = city;
-		this.state = state;
-		
-		int numOrders = (int) (Math.random() * 5);
-		for (int i=0; i < numOrders; ++i) {
-			orders.add(new SimpleOrder(i, new Date()));
-		}
-	}
-	
-	public SimplePerson() {}
-
-	/**
-	 * @return Returns the address.
-	 */
-	public String getAddress() {
-		return address;
-	}
-
-	/**
-	 * @param address The address to set.
-	 */
-	public void setAddress(String address) {
-		String old = this.address;
-		this.address = address;
-		firePropertyChange("address", old, address);
-	}
-
-	/**
-	 * @return Returns the city.
-	 */
-	public String getCity() {
-		return city;
-	}
-
-	/**
-	 * @param city The city to set.
-	 */
-	public void setCity(String city) {
-		String old = this.city;
-		firePropertyChange("city", old, this.city = city);
-	}
-
-	/**
-	 * @return Returns the name.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * @param name The name to set.
-	 */
-	public void setName(String name) {
-		firePropertyChange("name", this.name, this.name = name);
-	}
-
-	/**
-	 * @return Returns the state.
-	 */
-	public String getState() {
-		return state;
-	}
-
-	/**
-	 * @param state The state to set.
-	 */
-	public void setState(String state) {
-		firePropertyChange("state", this.state, this.state = state); //$NON-NLS-1$
-	}
-	
-	/**
-	 * @return Returns the orders.
-	 */
-	public List getOrders() {
-		return orders;
-	}
-
-	public SimpleCart getCart() {
-		return cart;
-	}
-
-	public void setCart(SimpleCart cart) {
-		firePropertyChange("cart", this.cart, this.cart = cart); //$NON-NLS-1$
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Transportation.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Transportation.java
deleted file mode 100644
index 39fbc08..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/model/Transportation.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.model;
-
-import org.eclipse.jface.examples.databinding.ModelObject;
-
-public class Transportation extends ModelObject {
-
-	private String arrivalTime;
-	private double price;
-
-	public void setArrivalTime(String string) {
-		String oldValue = arrivalTime;
-		arrivalTime = string;
-		firePropertyChange("arrivaltime",oldValue,string);
-	}
-	
-	public String getArrivalTime(){
-		return arrivalTime;
-	}
-
-	public double getPrice() {
-		return price;
-	}
-
-	public void setPrice(double aPrice) {
-		double oldPrice = price;
-		price = aPrice;
-		firePropertyChange("price",new Double(oldPrice),new Double(price));
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/nestedselection/TestMasterDetail.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/nestedselection/TestMasterDetail.java
deleted file mode 100644
index 980c75a..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/nestedselection/TestMasterDetail.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.nestedselection;
-
-import org.eclipse.core.databinding.Binding;
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.UpdateValueStrategy;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.databinding.observable.IObserving;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.conversion.ObjectToStringConverter;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.examples.databinding.model.SimpleModel;
-import org.eclipse.jface.examples.databinding.model.SimpleOrder;
-import org.eclipse.jface.examples.databinding.model.SimplePerson;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @since 1.0
- * 
- */
-public class TestMasterDetail {
-	/**
-	 * @since 3.2
-	 * 
-	 */
-	private static final class CustomUpdateValueStrategy extends
-			UpdateValueStrategy {
-		protected IStatus doSet(IObservableValue observableValue, Object value) {
-			IStatus result = super.doSet(observableValue, value);
-			if (result.isOK()) {
-				Object changed = observableValue;
-				if (changed instanceof IObserving) {
-					changed = ((IObserving) changed).getObserved();
-				}
-				System.out.println("changed: " + changed);
-			}
-			return result;
-		}
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		new TestMasterDetail().run();
-	}
-
-	private Shell shell = null; // @jve:decl-index=0:visual-constraint="10,10"
-
-	private Table personsTable = null;
-
-	private Label label1 = null;
-
-	private Text name = null;
-
-	private Label label2 = null;
-
-	private Text address = null;
-
-	private Label label3 = null;
-
-	private Text city = null;
-
-	private Label label4 = null;
-
-	private Text state = null;
-
-	private Table ordersTable = null;
-
-	private Text validationStatus;
-
-	/**
-	 * This method initializes table
-	 * 
-	 */
-	private void createTable() {
-		GridData gridData = new org.eclipse.swt.layout.GridData();
-		gridData.grabExcessHorizontalSpace = true;
-		gridData.verticalAlignment = org.eclipse.swt.layout.GridData.FILL;
-		gridData.horizontalSpan = 2;
-		gridData.grabExcessVerticalSpace = true;
-		gridData.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
-		personsTable = new Table(shell, SWT.FULL_SELECTION);
-		personsTable.setHeaderVisible(true);
-		personsTable.setLayoutData(gridData);
-		personsTable.setLinesVisible(true);
-		TableColumn tableColumn = new TableColumn(personsTable, SWT.NONE);
-		tableColumn.setWidth(60);
-		tableColumn.setText("Name");
-		TableColumn tableColumn1 = new TableColumn(personsTable, SWT.NONE);
-		tableColumn1.setWidth(60);
-		tableColumn1.setText("State");
-	}
-
-	/**
-	 * This method initializes table1
-	 * 
-	 */
-	private void createTable1() {
-		GridData gridData5 = new org.eclipse.swt.layout.GridData();
-		gridData5.horizontalSpan = 2;
-		gridData5.verticalAlignment = org.eclipse.swt.layout.GridData.FILL;
-		gridData5.grabExcessHorizontalSpace = true;
-		gridData5.grabExcessVerticalSpace = true;
-		gridData5.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
-		ordersTable = new Table(shell, SWT.FULL_SELECTION);
-		ordersTable.setHeaderVisible(true);
-		ordersTable.setLayoutData(gridData5);
-		ordersTable.setLinesVisible(true);
-		TableColumn tableColumn2 = new TableColumn(ordersTable, SWT.NONE);
-		tableColumn2.setWidth(60);
-		tableColumn2.setText("Order No");
-		TableColumn tableColumn3 = new TableColumn(ordersTable, SWT.NONE);
-		tableColumn3.setWidth(60);
-		tableColumn3.setText("Date");
-	}
-
-	/**
-	 * This method initializes sShell
-	 */
-	private void createShell() {
-		GridData gridData5 = new org.eclipse.swt.layout.GridData();
-		gridData5.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
-		gridData5.verticalAlignment = org.eclipse.swt.layout.GridData.CENTER;
-		GridData gridData4 = new org.eclipse.swt.layout.GridData();
-		gridData4.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
-		gridData4.verticalAlignment = org.eclipse.swt.layout.GridData.CENTER;
-		GridData gridData3 = new org.eclipse.swt.layout.GridData();
-		gridData3.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
-		gridData3.verticalAlignment = org.eclipse.swt.layout.GridData.CENTER;
-		GridData gridData2 = new org.eclipse.swt.layout.GridData();
-		gridData2.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
-		gridData2.verticalAlignment = org.eclipse.swt.layout.GridData.CENTER;
-		GridData gridData1 = new org.eclipse.swt.layout.GridData();
-		gridData1.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
-		gridData1.verticalAlignment = org.eclipse.swt.layout.GridData.CENTER;
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 2;
-		shell = new Shell();
-		shell.setText("Shell");
-		createTable();
-		shell.setLayout(gridLayout);
-		shell.setSize(new org.eclipse.swt.graphics.Point(495, 357));
-		label1 = new Label(shell, SWT.NONE);
-		label1.setText("Name");
-		name = new Text(shell, SWT.BORDER);
-		name.setLayoutData(gridData1);
-		label2 = new Label(shell, SWT.NONE);
-		label2.setText("Address");
-		address = new Text(shell, SWT.BORDER);
-		address.setLayoutData(gridData2);
-		label3 = new Label(shell, SWT.NONE);
-		label3.setText("City");
-		city = new Text(shell, SWT.BORDER);
-		city.setLayoutData(gridData4);
-		label4 = new Label(shell, SWT.NONE);
-		label4.setText("State");
-		state = new Text(shell, SWT.BORDER);
-		state.setLayoutData(gridData3);
-		createTable1();
-		validationStatus = new Text(shell, SWT.READ_ONLY | SWT.BORDER);
-	}
-
-	private void run() {
-		final Display display = new Display();
-
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				createShell();
-				bind(shell);
-
-				shell.setSize(600, 600);
-				shell.open();
-				while (!shell.isDisposed()) {
-					if (!display.readAndDispatch())
-						display.sleep();
-				}
-			}
-		});
-		display.dispose();
-	}
-
-	SimpleModel model = new SimpleModel();
-
-	private void bind(Control parent) {
-		Realm realm = SWTObservables.getRealm(parent.getDisplay());
-
-		TableViewer peopleViewer = new TableViewer(personsTable);
-		ObservableListContentProvider peopleViewerContent = new ObservableListContentProvider();
-		peopleViewer.setContentProvider(peopleViewerContent);
-
-		IObservableMap[] attributeMaps = BeansObservables.observeMaps(
-				peopleViewerContent.getKnownElements(), SimplePerson.class,
-				new String[] { "name", "state" });
-		peopleViewer.setLabelProvider(new ObservableMapLabelProvider(
-				attributeMaps));
-
-		peopleViewer.setInput(new WritableList(realm, model.getPersonList(),
-				SimpleModel.class));
-
-		IObservableValue selectedPerson = ViewersObservables
-				.observeSingleSelection(peopleViewer);
-
-		DataBindingContext dbc = new DataBindingContext(realm) {
-			protected UpdateValueStrategy createTargetToModelUpdateValueStrategy(
-					IObservableValue fromValue, IObservableValue toValue) {
-				return new CustomUpdateValueStrategy();
-			}
-		};
-		IConverter upperCaseConverter = new IConverter() {
-			public Object convert(Object fromObject) {
-				return ((String) fromObject).toUpperCase();
-			}
-
-			public Object getFromType() {
-				return String.class;
-			}
-
-			public Object getToType() {
-				return String.class;
-			}
-		};
-		IValidator vowelValidator = new IValidator() {
-			public IStatus validate(Object value) {
-				String s = (String) value;
-				if (!s.matches("[aeiouAEIOU]*")) {
-					return ValidationStatus.error("only vowels allowed");
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		Binding b = dbc.bindValue(SWTObservables.observeText(name, SWT.Modify),
-				BeansObservables.observeDetailValue(realm, selectedPerson,
-						"name", String.class), new CustomUpdateValueStrategy()
-						.setConverter(upperCaseConverter).setAfterGetValidator(
-								vowelValidator), null);
-
-//		AggregateValidationStatus status = new AggregateValidationStatus(dbc
-//				.getBindings(), AggregateValidationStatus.MAX_SEVERITY);
-		dbc.bindValue(SWTObservables.observeText(validationStatus, SWT.NONE),
-				b.getValidationStatus(), null, new UpdateValueStrategy().setConverter(new ObjectToStringConverter()));
-		
-		dbc.bindValue(SWTObservables.observeText(address, SWT.Modify),
-				BeansObservables.observeDetailValue(realm, selectedPerson,
-						"address", String.class), null, null);
-
-		dbc.bindValue(SWTObservables.observeText(city, SWT.Modify),
-				BeansObservables.observeDetailValue(realm, selectedPerson,
-						"city", String.class), null, null);
-
-		dbc.bindValue(SWTObservables.observeText(state, SWT.Modify),
-				BeansObservables.observeDetailValue(realm, selectedPerson,
-						"state", String.class), null, null);
-
-		TableViewer ordersViewer = new TableViewer(ordersTable);
-		ObservableListContentProvider ordersViewerContent = new ObservableListContentProvider();
-		ordersViewer.setContentProvider(ordersViewerContent);
-		ordersViewer.setLabelProvider(new ObservableMapLabelProvider(
-				BeansObservables.observeMaps(ordersViewerContent
-						.getKnownElements(), SimpleOrder.class, new String[] {
-						"orderNumber", "date" })));
-
-		IObservableList orders = BeansObservables.observeDetailList(realm,
-				selectedPerson, "orders", SimpleOrder.class);
-		ordersViewer.setInput(orders);
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/radioGroup/RadioGroup.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/radioGroup/RadioGroup.java
deleted file mode 100644
index 02e8f5d..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/radioGroup/RadioGroup.java
+++ /dev/null
@@ -1,559 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.radioGroup;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.jface.examples.databinding.ducks.DuckType;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-
-/** 
- * This object decorates a bunch of SWT.RADIO buttons and provides saner 
- * selection semantics than you get by default with those radio buttons.
- * <p>
- * Its API is basically the same API as List, but with unnecessary methods
- * removed.
- */
-public class RadioGroup {
-   
-   private final IRadioButton[] buttons;
-   private final Object[] values;
-   IRadioButton oldSelection = null;
-   IRadioButton selectedButton = null;
-   IRadioButton potentialNewSelection = null;
-
-   /** (Non-API)
-    * Interface IRadioButton.  A duck interface that is used internally by RadioGroup
-    * and by RadioGroup's unit tests.
-    */
-   public static interface IRadioButton {
-      void setData(String string, Object object);
-      void addSelectionListener(SelectionListener selectionListener);
-      void setSelection(boolean b);
-      boolean getSelection();
-      boolean isFocusControl();
-      String getText();
-      void setText(String string);
-      void notifyListeners(int eventType, Event object);
-   }
-   
-   /**
-    * Constructs an instance of this widget given an array of Button objects to wrap.
-    * The Button objects must have been created with the SWT.RADIO style bit set,
-    * and they must all be in the same Composite.
-    * 
-    * @param radioButtons Object[] an array of radio buttons to wrap.
-    * @param values Object[] an array of objects corresponding to the value of each radio button.
-    */
-   public RadioGroup(Object[] radioButtons, Object[] values) {
-      IRadioButton[] buttons = new IRadioButton[radioButtons.length];
-      if (buttons.length < 1) {
-         throw new IllegalArgumentException("A RadioGroup must manage at least one Button");
-      }
-      for (int i = 0; i < buttons.length; i++) {
-         if (!DuckType.instanceOf(IRadioButton.class, radioButtons[i])) {
-            throw new IllegalArgumentException("A radio button was not passed");
-         }
-         buttons[i] = (IRadioButton) DuckType.implement(IRadioButton.class, radioButtons[i]);
-         buttons[i].setData(Integer.toString(i), new Integer(i));
-         buttons[i].addSelectionListener(selectionListener);
-      }
-      this.buttons = buttons;
-      this.values = values;
-   }
-   
-   /**
-    * Returns the object corresponding to the currently-selected radio button
-    * or null if no radio button is selected.
-    * 
-    * @return the object corresponding to the currently-selected radio button
-    * or null if no radio button is selected.
-    */
-   public Object getSelection() {
-      int selectionIndex = getSelectionIndex();
-      if (selectionIndex < 0)
-         return "";
-      return values[selectionIndex];
-   }
-   
-   /**
-    * Sets the selected radio button to the radio button whose model object
-    * equals() the object specified by newSelection.  If !newSelection.equals()
-    * any model object managed by this radio group, deselects all radio buttons.
-    * 
-    * @param newSelection A model object corresponding to one of the model
-    * objects associated with one of the radio buttons.
-    */
-   public void setSelection(Object newSelection) {
-      deselectAll();
-      for (int i = 0; i < values.length; i++) {
-         if (values[i].equals(newSelection)) {
-            setSelection(i);
-            return;
-         }
-      }
-   }
-   
-   private SelectionListener selectionListener = new SelectionListener() {
-      public void widgetDefaultSelected(SelectionEvent e) {
-         widgetSelected(e);
-      }
-      
-      public void widgetSelected(SelectionEvent e) {
-         potentialNewSelection = getButton(e);
-         if (! potentialNewSelection.getSelection()) {
-            return;
-         }
-         if (potentialNewSelection.equals(selectedButton)) {
-            return;
-         }
-         
-         if (fireWidgetChangeSelectionEvent(e)) {
-            oldSelection = selectedButton;
-            selectedButton = potentialNewSelection;
-            if (oldSelection == null) {
-               oldSelection = selectedButton;
-            }
-   
-            fireWidgetSelectedEvent(e);
-         }
-      }
-
-      private IRadioButton getButton(SelectionEvent e) {
-         // If the actual IRadioButton is a test fixture, then the test fixture can't
-         // set e.widget, so the button object will be in e.data instead and a dummy 
-         // Widget will be in e.widget.
-         if (e.data != null) {
-            return (IRadioButton) e.data;
-         }
-         return (IRadioButton) DuckType.implement(IRadioButton.class, e.widget);
-      }
-   };
-   
-   private List widgetChangeListeners = new LinkedList();
-   
-   protected boolean fireWidgetChangeSelectionEvent(SelectionEvent e) {
-      for (Iterator listenersIter = widgetChangeListeners.iterator(); listenersIter.hasNext();) {
-         VetoableSelectionListener listener = (VetoableSelectionListener) listenersIter.next();
-         listener.canWidgetChangeSelection(e);
-         if (!e.doit) {
-            rollbackSelection();
-            return false;
-         }
-      }
-      return true;
-   }
-
-   private void rollbackSelection() {
-      Display.getCurrent().asyncExec(new Runnable() {
-         public void run() {
-            potentialNewSelection.setSelection(false);
-            selectedButton.setSelection(true);
-//            selectedButton.notifyListeners(SWT.Selection, null);
-         }
-      });
-   }
-
-
-   /**
-    * Adds the listener to the collection of listeners who will
-    * be notified when the receiver's selection is about to change, by sending
-    * it one of the messages defined in the <code>VetoableSelectionListener</code>
-    * interface.
-    * <p>
-    * <code>widgetSelected</code> is called when the selection changes.
-    * <code>widgetDefaultSelected</code> is typically called when an item is double-clicked.
-    * </p>
-    *
-    * @param listener the listener which should be notified
-    *
-    * @exception IllegalArgumentException <ul>
-    *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-    * </ul>
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    *
-    * @see VetoableSelectionListener
-    * @see #removeVetoableSelectionListener
-    * @see SelectionEvent
-    */
-   public void addVetoableSelectionListener(VetoableSelectionListener listener) {
-      widgetChangeListeners.add(listener);
-   }
-
-   /**
-    * Removes the listener from the collection of listeners who will
-    * be notified when the receiver's selection is about to change.
-    *
-    * @param listener the listener which should no longer be notified
-    *
-    * @exception IllegalArgumentException <ul>
-    *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-    * </ul>
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    *
-    * @see VetoableSelectionListener
-    * @see #addVetoableSelectionListener
-    */
-   public void removeVetoableSelectionListener(VetoableSelectionListener listener) {
-      widgetChangeListeners.remove(listener);
-   }
-   
-
-   private List widgetSelectedListeners = new ArrayList();
-   
-   protected void fireWidgetSelectedEvent(SelectionEvent e) {
-      for (Iterator listenersIter = widgetSelectedListeners.iterator(); listenersIter.hasNext();) {
-         SelectionListener listener = (SelectionListener) listenersIter.next();
-         listener.widgetSelected(e);
-      }
-   }
-
-   protected void fireWidgetDefaultSelectedEvent(SelectionEvent e) {
-      fireWidgetSelectedEvent(e);
-   }
-   
-   /**
-    * Adds the listener to the collection of listeners who will
-    * be notified when the receiver's selection changes, by sending
-    * it one of the messages defined in the <code>SelectionListener</code>
-    * interface.
-    * <p>
-    * <code>widgetSelected</code> is called when the selection changes.
-    * <code>widgetDefaultSelected</code> is typically called when an item is double-clicked.
-    * </p>
-    *
-    * @param listener the listener which should be notified
-    *
-    * @exception IllegalArgumentException <ul>
-    *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-    * </ul>
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    *
-    * @see SelectionListener
-    * @see #removeSelectionListener
-    * @see SelectionEvent
-    */
-   public void addSelectionListener(SelectionListener listener) {
-      widgetSelectedListeners.add(listener);
-   }
-
-   /**
-    * Removes the listener from the collection of listeners who will
-    * be notified when the receiver's selection changes.
-    *
-    * @param listener the listener which should no longer be notified
-    *
-    * @exception IllegalArgumentException <ul>
-    *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-    * </ul>
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    *
-    * @see SelectionListener
-    * @see #addSelectionListener
-    */
-   public void removeSelectionListener(SelectionListener listener) {
-      widgetSelectedListeners.remove(listener);
-   }
-   
-   /**
-    * Deselects the item at the given zero-relative index in the receiver.
-    * If the item at the index was already deselected, it remains
-    * deselected. Indices that are out of range are ignored.
-    *
-    * @param index the index of the item to deselect
-    *
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    */
-   public void deselect (int index) {
-      if (index < 0 || index >= buttons.length)
-         return;
-      buttons[index].setSelection(false);
-   }
-   
-   /**
-    * Deselects all selected items in the receiver.
-    *
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    */
-   public void deselectAll () {
-      for (int i = 0; i < buttons.length; i++)
-         buttons[i].setSelection(false);
-   }   
-
-   /**
-    * Returns the zero-relative index of the item which currently
-    * has the focus in the receiver, or -1 if no item has focus.
-    *
-    * @return the index of the selected item
-    *
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    */
-   public int getFocusIndex () {
-      for (int i = 0; i < buttons.length; i++) {
-         if (buttons[i].isFocusControl()) {
-            return i;
-         }
-      }
-      return -1;
-   }
-
-   /**
-    * Returns the item at the given, zero-relative index in the
-    * receiver. Throws an exception if the index is out of range.
-    *
-    * @param index the index of the item to return
-    * @return the item at the given index
-    *
-    * @exception IllegalArgumentException <ul>
-    *    <li>ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list minus 1 (inclusive)</li>
-    * </ul>
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    * 
-    * FIXME: tck - this should be renamed to getItemText()
-    */
-   public String getItem (int index) {
-      if (index < 0 || index >= buttons.length)
-         SWT.error(SWT.ERROR_INVALID_RANGE, null, "getItem for a nonexistant item");
-      return buttons[index].getText();
-   }
-
-   /**
-    * Returns the number of items contained in the receiver.
-    *
-    * @return the number of items
-    *
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    */
-   public int getItemCount () {
-      return buttons.length;
-   }
-
-   /**
-    * Returns a (possibly empty) array of <code>String</code>s which
-    * are the items in the receiver. 
-    * <p>
-    * Note: This is not the actual structure used by the receiver
-    * to maintain its list of items, so modifying the array will
-    * not affect the receiver. 
-    * </p>
-    *
-    * @return the items in the receiver's list
-    *
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    */
-   public String [] getItems () {
-      List itemStrings = new ArrayList();
-      for (int i = 0; i < buttons.length; i++) {
-         itemStrings.add(buttons[i].getText());
-      }
-      return (String[]) itemStrings.toArray(new String[itemStrings.size()]);
-   }
-   
-   public Object[] getButtons() {
-      return buttons;
-   }
-
-   /**
-    * Returns the zero-relative index of the item which is currently
-    * selected in the receiver, or -1 if no item is selected.
-    *
-    * @return the index of the selected item or -1
-    *
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    */
-   public int getSelectionIndex () {
-      for (int i = 0; i < buttons.length; i++) {
-         if (buttons[i].getSelection() == true) {
-            return i;
-         }
-      }
-      return -1;
-   }
-
-  /**
-    * Gets the index of an item.
-    * <p>
-    * The list is searched starting at 0 until an
-    * item is found that is equal to the search item.
-    * If no item is found, -1 is returned.  Indexing
-    * is zero based.
-    *
-    * @param string the search item
-    * @return the index of the item
-    *
-    * @exception IllegalArgumentException <ul>
-    *    <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-    * </ul>
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    */
-   public int indexOf (String string) {
-      for (int i = 0; i < buttons.length; i++) {
-         if (buttons[i].getText().equals(string)) {
-            return i;
-         }
-      }
-      return -1;
-   }
-
-   /**
-    * Searches the receiver's list starting at the given, 
-    * zero-relative index until an item is found that is equal
-    * to the argument, and returns the index of that item. If
-    * no item is found or the starting index is out of range,
-    * returns -1.
-    *
-    * @param string the search item
-    * @param start the zero-relative index at which to start the search
-    * @return the index of the item
-    *
-    * @exception IllegalArgumentException <ul>
-    *    <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-    * </ul>
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    */
-   public int indexOf (String string, int start) {
-      for (int i = start; i < buttons.length; i++) {
-         if (buttons[i].getText().equals(string)) {
-            return i;
-         }
-      }
-      return -1;
-   }
-
-   /**
-    * Returns <code>true</code> if the item is selected,
-    * and <code>false</code> otherwise.  Indices out of
-    * range are ignored.
-    *
-    * @param index the index of the item
-    * @return the visibility state of the item at the index
-    *
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    */
-   public boolean isSelected (int index) {
-      return buttons[index].getSelection();
-   }
-
-   /**
-    * Selects the item at the given zero-relative index in the receiver's 
-    * list.  If the item at the index was already selected, it remains
-    * selected. Indices that are out of range are ignored.
-    *
-    * @param index the index of the item to select
-    *
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    */
-   public void select (int index) {
-      if (index < 0 || index >= buttons.length)
-         return;
-      buttons[index].setSelection(true);
-   }
-
-   /**
-    * Sets the text of the item in the receiver's list at the given
-    * zero-relative index to the string argument. This is equivalent
-    * to <code>remove</code>'ing the old item at the index, and then
-    * <code>add</code>'ing the new item at that index.
-    *
-    * @param index the index for the item
-    * @param string the new text for the item
-    *
-    * @exception IllegalArgumentException <ul>
-    *    <li>ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list minus 1 (inclusive)</li>
-    *    <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-    * </ul>
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    */
-   public void setItem (int index, String string) {
-      if (index < 0 || index >= buttons.length)
-         SWT.error(SWT.ERROR_INVALID_RANGE, null, "setItem for a nonexistant item");
-      buttons[index].setText(string);
-   }
-
-   /**
-    * Selects the item at the given zero-relative index in the receiver. 
-    * If the item at the index was already selected, it remains selected.
-    * The current selection is first cleared, then the new item is selected.
-    * Indices that are out of range are ignored.
-    *
-    * @param index the index of the item to select
-    *
-    * @exception SWTException <ul>
-    *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
-    *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
-    * </ul>
-    * @see List#deselectAll()
-    * @see List#select(int)
-    */
-   public void setSelection (int index) {
-      if (index < 0 || index > buttons.length - 1) {
-         return;
-      }
-      buttons[index].setSelection(true);
-   }
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/radioGroup/VetoableSelectionListener.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/radioGroup/VetoableSelectionListener.java
deleted file mode 100644
index 86f5d7b..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/radioGroup/VetoableSelectionListener.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.radioGroup;
-
-import org.eclipse.swt.events.SelectionEvent;
-
-/**
- * Interface VetoableSelectionListener.  An interface for SelectionListeners
- * that permit the new selection to be vetoed before widgetSelected or
- * widgetDefaultSelected is called.
- */
-public interface VetoableSelectionListener {
-   /**
-    * Method widgetCanChangeSelection.  Indicates that the selection is
-    * about to be changed.  Setting e.doit to false will prevent the 
-    * selection from changing.
-    * 
-    * @param e The SelectionEvent that is being processed.
-    */
-   public void canWidgetChangeSelection(SelectionEvent e);
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet000HelloWorld.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet000HelloWorld.java
deleted file mode 100644
index 604e113..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet000HelloWorld.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef, Inc. and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     The Pampered Chef, Inc. - initial API and implementation
- *     Brad Reynolds - bug 116920
- *     Benjamin Cabe - bug 252219
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.PojoObservables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Hello, databinding. Bind changes in a GUI to a Model object but don't worry
- * about propogating changes from the Model to the GUI.
- * <p>
- * Illustrates the basic Model-ViewModel-Binding-View architecture typically
- * used in data binding applications.
- */
-public class Snippet000HelloWorld {
-	public static void main(String[] args) {
-		Display display = new Display();
-		final ViewModel viewModel = new ViewModel();
-
-		Realm.runWithDefault(SWTObservables.getRealm(display),
-				new Runnable() {
-					public void run() {
-						final Shell shell = new View(viewModel).createShell();
-						// The SWT event loop
-						Display display = Display.getCurrent();
-						while (!shell.isDisposed()) {
-							if (!display.readAndDispatch()) {
-								display.sleep();
-							}
-						}
-					}
-				});
-		// Print the results
-		System.out.println("person.getName() = "
-				+ viewModel.getPerson().getName());
-	}
-
-	// The data model class. This is normally a persistent class of some sort.
-	// 
-	// In this example, we only push changes from the GUI to the model, so we
-	// don't worry about implementing JavaBeans bound properties. If we need
-	// our GUI to automatically reflect changes in the Person object, the
-	// Person object would need to implement the JavaBeans property change
-	// listener methods.
-	static class Person {
-		// A property...
-		String name = "HelloWorld";
-
-		public String getName() {
-			return name;
-		}
-
-		public void setName(String name) {
-			this.name = name;
-		}
-	}
-
-	// The View's model--the root of our Model graph for this particular GUI.
-	//
-	// Typically each View class has a corresponding ViewModel class.
-	// The ViewModel is responsible for getting the objects to edit from the
-	// DAO. Since this snippet doesn't have any persistent objects to
-	// retrieve, this ViewModel just instantiates a model object to edit.
-	static class ViewModel {
-		// The model to bind
-		private Person person = new Person();
-
-		public Person getPerson() {
-			return person;
-		}
-	}
-
-	// The GUI view
-	static class View {
-		private ViewModel viewModel;
-		private Text name;
-
-		public View(ViewModel viewModel) {
-			this.viewModel = viewModel;
-		}
-
-		public Shell createShell() {
-			// Build a UI
-			Display display = Display.getDefault();
-			Shell shell = new Shell(display);
-			shell.setLayout(new RowLayout(SWT.VERTICAL));
-			name = new Text(shell, SWT.BORDER);
-
-			// Bind it
-			DataBindingContext bindingContext = new DataBindingContext();
-			Person person = viewModel.getPerson();
-
-			bindingContext.bindValue(SWTObservables.observeText(name,
-					SWT.Modify), PojoObservables.observeValue(person, "name"),
-					null, null);
-
-			// Open and return the Shell
-			shell.pack();
-			shell.open();
-			return shell;
-		}
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet001NestedSelectionWithCombo.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet001NestedSelectionWithCombo.java
deleted file mode 100644
index c701255..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet001NestedSelectionWithCombo.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef, Inc. and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     The Pampered Chef, Inc. - initial API and implementation
- *     Brad Reynolds - bug 116920
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.util.ArrayList;
-import java.util.HashSet;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Demonstrates nested selection.<br>
- * At the first level, user may select a person.<br>
- * At the second level, user may select a city to associate with the selected<br>
- * person or edit the person's name.
- */
-public class Snippet001NestedSelectionWithCombo {
-	public static void main(String[] args) {
-		ViewModel viewModel = new ViewModel();
-		Shell shell = new View(viewModel).createShell();
-
-		// The SWT event loop
-		Display display = Display.getCurrent();
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch()) {
-				display.sleep();
-			}
-		}
-	}
-
-	// Minimal JavaBeans support
-	public static abstract class AbstractModelObject {
-		private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(
-				this);
-
-		public void addPropertyChangeListener(PropertyChangeListener listener) {
-			propertyChangeSupport.addPropertyChangeListener(listener);
-		}
-
-		public void addPropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			propertyChangeSupport.addPropertyChangeListener(propertyName,
-					listener);
-		}
-
-		public void removePropertyChangeListener(PropertyChangeListener listener) {
-			propertyChangeSupport.removePropertyChangeListener(listener);
-		}
-
-		public void removePropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			propertyChangeSupport.removePropertyChangeListener(propertyName,
-					listener);
-		}
-
-		protected void firePropertyChange(String propertyName, Object oldValue,
-				Object newValue) {
-			propertyChangeSupport.firePropertyChange(propertyName, oldValue,
-					newValue);
-		}
-	}
-
-	// The data model class. This is normally a persistent class of some sort.
-	// 
-	// This example implements full JavaBeans bound properties so that changes
-	// to instances of this class will automatically be propogated to the UI.
-	public static class Person extends AbstractModelObject {
-		// Constructor
-		public Person(String name, String city) {
-			this.name = name;
-			this.city = city;
-		}
-
-		// Some JavaBean bound properties...
-		String name;
-
-		String city;
-
-		public String getName() {
-			return name;
-		}
-
-		public void setName(String name) {
-			String oldValue = this.name;
-			this.name = name;
-			firePropertyChange("name", oldValue, name);
-		}
-
-		public String getCity() {
-			return city;
-		}
-
-		public void setCity(String city) {
-			String oldValue = this.city;
-			this.city = city;
-			firePropertyChange("city", oldValue, city);
-		}
-	}
-
-	// The View's model--the root of our GUI's Model graph
-	//
-	// Typically each View class has a corresponding ViewModel class.
-	// The ViewModel is responsible for getting the objects to edit from the
-	// DAO. Since this snippet doesn't have any persistent objects to
-	// retrieve, this ViewModel just instantiates some objects to edit.
-	// 
-	// This ViewModel also implements JavaBean bound properties.
-	static class ViewModel extends AbstractModelObject {
-		// The model to bind
-		private ArrayList people = new ArrayList();
-		{
-			people.add(new Person("Wile E. Coyote", "Tucson"));
-			people.add(new Person("Road Runner", "Lost Horse"));
-			people.add(new Person("Bugs Bunny", "Forrest"));
-		}
-
-		// Choice of cities for the Combo
-		private ArrayList cities = new ArrayList();
-		{
-			cities.add("Tucson");
-			cities.add("AcmeTown");
-			cities.add("Lost Horse");
-			cities.add("Forrest");
-			cities.add("Lost Mine");
-		}
-
-		public ArrayList getPeople() {
-			return people;
-		}
-
-		public ArrayList getCities() {
-			return cities;
-		}
-	}
-
-	// The GUI view
-	static class View {
-		private ViewModel viewModel;
-
-		public View(ViewModel viewModel) {
-			this.viewModel = viewModel;
-		}
-
-		public Shell createShell() {
-			// Build a UI
-			Shell shell = new Shell(Display.getCurrent());
-			Realm realm = SWTObservables.getRealm(shell.getDisplay());
-
-			List peopleList = new List(shell, SWT.BORDER);
-			Text name = new Text(shell, SWT.BORDER);
-			Combo city = new Combo(shell, SWT.BORDER | SWT.READ_ONLY);
-
-			ListViewer peopleListViewer = new ListViewer(peopleList);
-			IObservableMap attributeMap = BeansObservables.observeMap(
-					Observables.staticObservableSet(realm, new HashSet(
-							viewModel.getPeople())), Person.class, "name");
-			peopleListViewer.setLabelProvider(new ObservableMapLabelProvider(
-					attributeMap));
-			peopleListViewer.setContentProvider(new ArrayContentProvider());
-			peopleListViewer.setInput(viewModel.getPeople());
-
-			DataBindingContext dbc = new DataBindingContext(realm);
-			IObservableValue selectedPerson = ViewersObservables
-					.observeSingleSelection(peopleListViewer);
-			dbc.bindValue(SWTObservables.observeText(name, SWT.Modify),
-					BeansObservables.observeDetailValue(realm, selectedPerson,
-							"name", String.class), null, null);
-
-			ComboViewer cityViewer = new ComboViewer(city);
-			cityViewer.setContentProvider(new ArrayContentProvider());
-			cityViewer.setInput(viewModel.getCities());
-
-			IObservableValue citySelection = ViewersObservables
-					.observeSingleSelection(cityViewer);
-			dbc.bindValue(citySelection, BeansObservables.observeDetailValue(
-					realm, selectedPerson, "city", String.class), null, null);
-
-			GridLayoutFactory.swtDefaults().applyTo(shell);
-			// Open and return the Shell
-			shell.pack();
-			shell.open();
-			return shell;
-		}
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet002UpdateComboRetainSelection.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet002UpdateComboRetainSelection.java
deleted file mode 100644
index 09882e7..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet002UpdateComboRetainSelection.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef, Inc. and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     The Pampered Chef, Inc. - initial API and implementation
- *     Brad Reynolds - bug 116920
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Shows how to bind a Combo so that when update its items, the selection is
- * retained if at all possible.
- * 
- * @since 3.2
- */
-public class Snippet002UpdateComboRetainSelection {
-    public static void main(String[] args) {
-    	final Display display = new Display();
-    	Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-    		public void run() {
-    			ViewModel viewModel = new ViewModel();
-    			Shell shell = new View(viewModel).createShell();
-    			
-    			// The SWT event loop
-    			while (!shell.isDisposed()) {
-    				if (!display.readAndDispatch()) {
-    					display.sleep();
-    				}
-    			}
-    			
-    			// Print the results
-    			System.out.println(viewModel.getText());
-    		}
-    	});
-    	display.dispose();
-    }
-
-    // Minimal JavaBeans support
-    public static abstract class AbstractModelObject {
-        private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
-
-        public void addPropertyChangeListener(PropertyChangeListener listener) {
-            propertyChangeSupport.addPropertyChangeListener(listener);
-        }
-
-        public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
-            propertyChangeSupport.addPropertyChangeListener(propertyName, listener);
-        }
-
-        public void removePropertyChangeListener(PropertyChangeListener listener) {
-            propertyChangeSupport.removePropertyChangeListener(listener);
-        }
-
-        public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
-            propertyChangeSupport.removePropertyChangeListener(propertyName, listener);
-        }
-
-        protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
-            propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
-        }
-    }
-
-    // The View's model--the root of our Model graph for this particular GUI.
-    public static class ViewModel extends AbstractModelObject {
-        private String text = "beef";
-
-        private List choices = new ArrayList();
-        {
-            choices.add("pork");
-            choices.add("beef");
-            choices.add("poultry");
-            choices.add("vegatables");
-        }
-
-        public List getChoices() {
-            return choices;
-        }
-
-        public void setChoices(List choices) {
-            List old = this.choices;
-            this.choices = choices;
-            firePropertyChange("choices", old, choices);
-        }
-
-        public String getText() {
-            return text;
-        }
-
-        public void setText(String text) {
-            String oldValue = this.text;
-            this.text = text;
-            firePropertyChange("text", oldValue, text);
-        }
-    }
-
-    // The GUI view
-    static class View {
-        private ViewModel viewModel;
-        /**
-         * used to make a new choices array unique
-         */
-        static int count;
-
-        public View(ViewModel viewModel) {
-            this.viewModel = viewModel;
-        }
-
-        public Shell createShell() {
-            // Build a UI
-            Shell shell = new Shell(Display.getCurrent());
-            shell.setLayout(new RowLayout(SWT.VERTICAL));
-
-            Combo combo = new Combo(shell, SWT.BORDER | SWT.READ_ONLY);
-            Button reset = new Button(shell, SWT.NULL);
-            reset.setText("reset collection");
-            reset.addSelectionListener(new SelectionAdapter() {
-                public void widgetSelected(SelectionEvent e) {
-                    List newList = new ArrayList();
-                    newList.add("Chocolate");
-                    newList.add("Vanilla");
-                    newList.add("Mango Parfait");
-                    newList.add("beef");
-                    newList.add("Cheesecake");
-                    newList.add(Integer.toString(++count));
-                    viewModel.setChoices(newList);
-                }
-            });
-
-            // Print value out first
-            System.out.println(viewModel.getText());
-
-            DataBindingContext dbc = new DataBindingContext();
-            
-            IObservableList list = MasterDetailObservables.detailList(BeansObservables.observeValue(viewModel, "choices"),
-                    getListDetailFactory(),
-                    String.class);
-            dbc.bindList(SWTObservables.observeItems(combo), list, null, null); 
-            dbc.bindValue(SWTObservables.observeText(combo), BeansObservables.observeValue(viewModel, "text"), null, null);
-            
-            // Open and return the Shell
-            shell.pack();
-            shell.open();
-            return shell;
-        }
-    }
-
-    private static IObservableFactory getListDetailFactory() {
-        return new IObservableFactory() {
-            public IObservable createObservable(Object target) {
-                WritableList list = WritableList.withElementType(String.class);
-                list.addAll((Collection) target);
-                return list;
-            }
-        };
-    }
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet003UpdateComboBindUsingViewer.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet003UpdateComboBindUsingViewer.java
deleted file mode 100644
index dd61634..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet003UpdateComboBindUsingViewer.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef, Inc. and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     The Pampered Chef, Inc. - initial API and implementation
- *     Brad Reynolds - bug 116920
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Shows how to bind a Combo so that when update its items, the selection is
- * retained if at all possible.
- * 
- * @since 3.2
- */
-public class Snippet003UpdateComboBindUsingViewer {
-	public static void main(String[] args) {
-		final Display display = new Display();
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				ViewModel viewModel = new ViewModel();
-				Shell shell = new View(viewModel).createShell();
-
-				// The SWT event loop
-				while (!shell.isDisposed()) {
-					if (!display.readAndDispatch()) {
-						display.sleep();
-					}
-				}
-				// Print the results
-				System.out.println(viewModel.getText());
-			}
-		});
-		display.dispose();
-	}
-
-	// Minimal JavaBeans support
-	public static abstract class AbstractModelObject {
-		private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(
-				this);
-
-		public void addPropertyChangeListener(PropertyChangeListener listener) {
-			propertyChangeSupport.addPropertyChangeListener(listener);
-		}
-
-		public void addPropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			propertyChangeSupport.addPropertyChangeListener(propertyName,
-					listener);
-		}
-
-		public void removePropertyChangeListener(PropertyChangeListener listener) {
-			propertyChangeSupport.removePropertyChangeListener(listener);
-		}
-
-		public void removePropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			propertyChangeSupport.removePropertyChangeListener(propertyName,
-					listener);
-		}
-
-		protected void firePropertyChange(String propertyName, Object oldValue,
-				Object newValue) {
-			propertyChangeSupport.firePropertyChange(propertyName, oldValue,
-					newValue);
-		}
-	}
-
-	// The View's model--the root of our Model graph for this particular GUI.
-	public static class ViewModel extends AbstractModelObject {
-		private String text = "beef";
-
-		private List choices = new ArrayList();
-		{
-			choices.add("pork");
-			choices.add("beef");
-			choices.add("poultry");
-			choices.add("vegatables");
-		}
-
-		public List getChoices() {
-			return choices;
-		}
-
-		public void setChoices(List choices) {
-			this.choices = choices;
-			firePropertyChange("choices", null, null);
-		}
-
-		public String getText() {
-			return text;
-		}
-
-		public void setText(String text) {
-			String oldValue = this.text;
-			this.text = text;
-			firePropertyChange("text", oldValue, text);
-		}
-	}
-
-	// The GUI view
-	static class View {
-		private ViewModel viewModel;
-
-		public View(ViewModel viewModel) {
-			this.viewModel = viewModel;
-		}
-
-		public Shell createShell() {
-			// Build a UI
-			Shell shell = new Shell(Display.getCurrent());
-			shell.setLayout(new RowLayout(SWT.VERTICAL));
-
-			Combo combo = new Combo(shell, SWT.BORDER | SWT.READ_ONLY);
-			ComboViewer viewer = new ComboViewer(combo);
-			Button reset = new Button(shell, SWT.NULL);
-			reset.setText("reset collection");
-			reset.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					List newList = new ArrayList();
-					newList.add("Chocolate");
-					newList.add("Vanilla");
-					newList.add("Mango Parfait");
-					newList.add("beef");
-					newList.add("Cheesecake");
-					viewModel.setChoices(newList);
-				}
-			});
-
-			// Print value out first
-			System.out.println(viewModel.getText());
-
-			DataBindingContext dbc = new DataBindingContext();
-			IObservableList list = MasterDetailObservables.detailList(
-					BeansObservables.observeValue(viewModel, "choices"),
-					getListDetailFactory(), String.class);
-			viewer.setContentProvider(new ObservableListContentProvider());
-			viewer.setInput(list);
-
-			dbc.bindValue(ViewersObservables.observeSingleSelection(viewer),
-					BeansObservables.observeValue(viewModel, "text"), null, null);
-
-			// Open and return the Shell
-			shell.pack();
-			shell.open();
-			return shell;
-		}
-	}
-
-	private static IObservableFactory getListDetailFactory() {
-		return new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				WritableList list = WritableList.withElementType(String.class);
-				list.addAll((Collection) target);
-				return list;
-			}
-		};
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet004DataBindingContextErrorLabel.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet004DataBindingContextErrorLabel.java
deleted file mode 100644
index ac674aa..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet004DataBindingContextErrorLabel.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Brad Reynolds - bug 116920, 159768
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import org.eclipse.core.databinding.AggregateValidationStatus;
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.UpdateValueStrategy;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Snippet that displays how to bind the validation error of the
- * {@link DataBindingContext} to a label. http://www.eclipse.org
- * 
- * @since 3.2
- */
-public class Snippet004DataBindingContextErrorLabel {
-	public static void main(String[] args) {
-		final Display display = new Display();
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				Shell shell = new Shell(display);
-				shell.setText("Data Binding Snippet 004");
-				shell.setLayout(new GridLayout(2, false));
-
-				new Label(shell, SWT.NONE).setText("Enter '5' to be valid:");
-
-				Text text = new Text(shell, SWT.BORDER);
-				WritableValue value = WritableValue.withValueType(String.class);
-				new Label(shell, SWT.NONE).setText("Error:");
-
-				Label errorLabel = new Label(shell, SWT.BORDER);
-				errorLabel.setForeground(display.getSystemColor(SWT.COLOR_RED));
-				GridDataFactory.swtDefaults().hint(200, SWT.DEFAULT).applyTo(
-						errorLabel);
-
-				DataBindingContext dbc = new DataBindingContext();
-
-				// Bind the text to the value.
-				dbc.bindValue(
-						SWTObservables.observeText(text, SWT.Modify),
-						value,
-						new UpdateValueStrategy().setAfterConvertValidator(new FiveValidator()),
-						null);
-
-				// Bind the error label to the validation error on the dbc.
-				dbc.bindValue(SWTObservables.observeText(errorLabel),
-						new AggregateValidationStatus(dbc.getBindings(),
-								AggregateValidationStatus.MAX_SEVERITY), null,
-						null);
-
-				shell.pack();
-				shell.open();
-				while (!shell.isDisposed()) {
-					if (!display.readAndDispatch())
-						display.sleep();
-				}
-			}
-		});
-		display.dispose();
-	}
-
-	/**
-	 * Validator that returns validation errors for any value other than 5.
-	 * 
-	 * @since 3.2
-	 */
-	private static class FiveValidator implements IValidator {
-		public IStatus validate(Object value) {
-			return ("5".equals(value)) ? Status.OK_STATUS : ValidationStatus
-					.error("the value was '" + value + "', not '5'");
-		}
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet005MenuUpdater.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet005MenuUpdater.java
deleted file mode 100644
index f84b40c..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet005MenuUpdater.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.util.Date;
-import java.util.Iterator;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.provisional.swt.MenuUpdater;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- */
-public class Snippet005MenuUpdater {
-	public static void main(String[] args) {
-		final Display display = new Display();
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				Shell shell = new Shell(display);
-
-				final WritableList menuItemStrings = new WritableList();
-				display.asyncExec(new Runnable() {
-					public void run() {
-						System.out.println("adding item");
-						menuItemStrings.add(new Date().toString());
-						display.timerExec(5000, this);
-					}
-				});
-
-				Menu bar = new Menu(shell, SWT.BAR);
-				shell.setMenuBar(bar);
-				MenuItem fileItem = new MenuItem(bar, SWT.CASCADE);
-				fileItem.setText("&Test Menu");
-				final Menu submenu = new Menu(shell, SWT.DROP_DOWN);
-				fileItem.setMenu(submenu);
-				new MenuUpdater(submenu) {
-					protected void updateMenu() {
-						System.out.println("updating menu");
-						MenuItem[] items = submenu.getItems();
-						int itemIndex = 0;
-						for (Iterator it = menuItemStrings.iterator(); it
-								.hasNext();) {
-							MenuItem item;
-							if (itemIndex < items.length) {
-								item = items[itemIndex++];
-							} else {
-								item = new MenuItem(submenu, SWT.NONE);
-							}
-							String string = (String) it.next();
-							item.setText(string);
-						}
-						while (itemIndex < items.length) {
-							items[itemIndex++].dispose();
-						}
-					}
-				};
-
-				shell.open();
-
-				// The SWT event loop
-				while (!shell.isDisposed()) {
-					if (!display.readAndDispatch()) {
-						display.sleep();
-					}
-				}
-			}
-		});
-		display.dispose();
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet006Spreadsheet.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet006Spreadsheet.java
deleted file mode 100644
index 214b4f1..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet006Spreadsheet.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.text.NumberFormat;
-import java.text.ParseException;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.value.ComputedValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.provisional.swt.TableUpdater;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ControlEditor;
-import org.eclipse.swt.custom.TableCursor;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Display;
-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;
-
-/**
- * @since 1.1
- * 
- */
-public class Snippet006Spreadsheet {
-
-	private static final int COUNTER_UPDATE_DELAY = 1000;
-
-	private static final int NUM_COLUMNS = 6;
-
-	private static final int NUM_ROWS = 16;
-
-	/**
-	 * 0 for no output, 1 for some, 2 for more
-	 */
-	private static int DEBUG_LEVEL = 0;
-
-	/**
-	 * If true, there will be a automatic counter at B1.
-	 */
-	private static boolean FUNKY_COUNTER = false;
-
-	/**
-	 * // * If true, all formulas (except for row 1 and column A) will be the
-	 * sum of the values of their left and top neighbouring cells.
-	 */
-	private static boolean FUNKY_FORMULAS = true;
-
-	static WritableValue[][] cellFormulas = new WritableValue[NUM_ROWS][NUM_COLUMNS];
-
-	static ComputedValue[][] cellValues = new ComputedValue[NUM_ROWS][NUM_COLUMNS];
-
-	static class ComputedCellValue extends ComputedValue {
-		private final IObservableValue cellFormula;
-
-		private boolean calculating;
-
-		ComputedCellValue(IObservableValue cellFormula) {
-			this.cellFormula = cellFormula;
-		}
-
-		protected Object calculate() {
-			if (calculating) {
-				return "#cycle";
-			}
-			try {
-				calculating = true;
-				return evaluate(cellFormula.getValue());
-			} finally {
-				calculating = false;
-			}
-		}
-
-		private Object evaluate(Object value) {
-			if (DEBUG_LEVEL >= 2) {
-				System.out.println("evaluating " + this + " ...");
-			}
-			if (value == null) {
-				return "";
-			}
-			try {
-				String s = (String) value;
-				if (!s.startsWith("=")) {
-					return s;
-				}
-				String addition = s.substring(1);
-				int indexOfPlus = addition.indexOf('+');
-				String operand1 = addition.substring(0, indexOfPlus);
-				double value1 = eval(operand1);
-				String operand2 = addition.substring(indexOfPlus + 1);
-				double value2 = eval(operand2);
-				return NumberFormat.getNumberInstance().format(value1 + value2);
-			} catch (Exception ex) {
-				return ex.getMessage();
-			}
-		}
-
-		/**
-		 * @param s
-		 * @return
-		 * @throws ParseException
-		 */
-		private double eval(String s) throws ParseException {
-			if (s.length() == 0) {
-				return 0;
-			}
-			char character = s.charAt(0);
-			if (Character.isLetter(character)) {
-				character = Character.toLowerCase(character);
-				// reference to other cell
-				int columnIndex = character - 'a';
-				int rowIndex = 0;
-				rowIndex = NumberFormat.getNumberInstance().parse(
-						s.substring(1)).intValue() - 1;
-				String value = (String) cellValues[rowIndex][columnIndex]
-						.getValue();
-				return value.length() == 0 ? 0 : NumberFormat
-						.getNumberInstance().parse(value).doubleValue();
-			}
-			return NumberFormat.getNumberInstance().parse(s).doubleValue();
-		}
-	}
-
-	protected static int counter;
-
-	public static void main(String[] args) {
-
-		final Display display = new Display();
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				Shell shell = new Shell(display);
-				shell.setText("Data Binding Snippet 006");
-
-				final Table table = new Table(shell, SWT.BORDER | SWT.MULTI
-						| SWT.FULL_SELECTION | SWT.VIRTUAL);
-				table.setLinesVisible(true);
-				table.setHeaderVisible(true);
-
-				for (int i = 0; i < NUM_COLUMNS; i++) {
-					TableColumn tableColumn = new TableColumn(table, SWT.NONE);
-					tableColumn.setText(Character.toString((char) ('A' + i)));
-					tableColumn.setWidth(60);
-				}
-				WritableList list = new WritableList();
-				for (int i = 0; i < NUM_ROWS; i++) {
-					list.add(new Object());
-					for (int j = 0; j < NUM_COLUMNS; j++) {
-						cellFormulas[i][j] = new WritableValue();
-						cellValues[i][j] = new ComputedCellValue(
-								cellFormulas[i][j]);
-						if (!FUNKY_FORMULAS || i == 0 || j == 0) {
-							cellFormulas[i][j].setValue("");
-						} else {
-							cellFormulas[i][j].setValue("="
-									+ cellReference(i - 1, j) + "+"
-									+ cellReference(i, j - 1));
-						}
-					}
-				}
-
-				new TableUpdater(table, list) {
-					protected void updateItem(int rowIndex, TableItem item, Object element) {
-						if (DEBUG_LEVEL >= 1) {
-							System.out.println("updating row " + rowIndex);
-						}
-						for (int j = 0; j < NUM_COLUMNS; j++) {
-							item.setText(j, (String) cellValues[rowIndex][j]
-									.getValue());
-						}
-					}
-				};
-
-				if (FUNKY_COUNTER) {
-					// counter in A1
-					display.asyncExec(new Runnable() {
-						public void run() {
-							cellFormulas[0][1].setValue("" + counter++);
-							display.timerExec(COUNTER_UPDATE_DELAY, this);
-						}
-					});
-				}
-
-				// create a TableCursor to navigate around the table
-				final TableCursor cursor = new TableCursor(table, SWT.NONE);
-				// create an editor to edit the cell when the user hits "ENTER"
-				// while over a cell in the table
-				final ControlEditor editor = new ControlEditor(cursor);
-				editor.grabHorizontal = true;
-				editor.grabVertical = true;
-
-				cursor.addSelectionListener(new SelectionAdapter() {
-					// when the TableEditor is over a cell, select the
-					// corresponding row
-					// in
-					// the table
-					public void widgetSelected(SelectionEvent e) {
-						table.setSelection(new TableItem[] { cursor.getRow() });
-					}
-
-					// when the user hits "ENTER" in the TableCursor, pop up a
-					// text
-					// editor so that
-					// they can change the text of the cell
-					public void widgetDefaultSelected(SelectionEvent e) {
-						final Text text = new Text(cursor, SWT.NONE);
-						TableItem row = cursor.getRow();
-						int rowIndex = table.indexOf(row);
-						int columnIndex = cursor.getColumn();
-						text
-								.setText((String) cellFormulas[rowIndex][columnIndex]
-										.getValue());
-						text.addKeyListener(new KeyAdapter() {
-							public void keyPressed(KeyEvent e) {
-								// close the text editor and copy the data over
-								// when the user hits "ENTER"
-								if (e.character == SWT.CR) {
-									TableItem row = cursor.getRow();
-									int rowIndex = table.indexOf(row);
-									int columnIndex = cursor.getColumn();
-									cellFormulas[rowIndex][columnIndex]
-											.setValue(text.getText());
-									text.dispose();
-								}
-								// close the text editor when the user hits
-								// "ESC"
-								if (e.character == SWT.ESC) {
-									text.dispose();
-								}
-							}
-						});
-						editor.setEditor(text);
-						text.setFocus();
-					}
-				});
-				// Hide the TableCursor when the user hits the "MOD1" or "MOD2"
-				// key.
-				// This alows the user to select multiple items in the table.
-				cursor.addKeyListener(new KeyAdapter() {
-					public void keyPressed(KeyEvent e) {
-						if (e.keyCode == SWT.MOD1 || e.keyCode == SWT.MOD2
-								|| (e.stateMask & SWT.MOD1) != 0
-								|| (e.stateMask & SWT.MOD2) != 0) {
-							cursor.setVisible(false);
-						}
-					}
-				});
-				// Show the TableCursor when the user releases the "MOD2" or
-				// "MOD1" key.
-				// This signals the end of the multiple selection task.
-				table.addKeyListener(new KeyAdapter() {
-					public void keyReleased(KeyEvent e) {
-						if (e.keyCode == SWT.MOD1
-								&& (e.stateMask & SWT.MOD2) != 0)
-							return;
-						if (e.keyCode == SWT.MOD2
-								&& (e.stateMask & SWT.MOD1) != 0)
-							return;
-						if (e.keyCode != SWT.MOD1
-								&& (e.stateMask & SWT.MOD1) != 0)
-							return;
-						if (e.keyCode != SWT.MOD2
-								&& (e.stateMask & SWT.MOD2) != 0)
-							return;
-
-						TableItem[] selection = table.getSelection();
-						TableItem row = (selection.length == 0) ? table
-								.getItem(table.getTopIndex()) : selection[0];
-						table.showItem(row);
-						cursor.setSelection(row, 0);
-						cursor.setVisible(true);
-						cursor.setFocus();
-					}
-				});
-
-				GridLayoutFactory.fillDefaults().generateLayout(shell);
-				shell.setSize(400, 300);
-				shell.open();
-
-				// The SWT event loop
-				while (!shell.isDisposed()) {
-					if (!display.readAndDispatch()) {
-						display.sleep();
-					}
-				}
-			}
-		});
-		display.dispose();
-	}
-
-	private static String cellReference(int rowIndex, int columnIndex) {
-		String cellReference = "" + ((char) ('A' + columnIndex))
-				+ (rowIndex + 1);
-		return cellReference;
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet007ColorLabelProvider.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet007ColorLabelProvider.java
deleted file mode 100644
index aac19d2..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet007ColorLabelProvider.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     IBM Corporation - see bug 137934
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ITableColorProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * An example showing how to create a {@link ILabelProvider label provider} that
- * to provide colors.
- * 
- * @since 3.2
- */
-public class Snippet007ColorLabelProvider {
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		final List persons = new ArrayList();
-		persons.add(new Person("Fiona Apple", Person.FEMALE));
-		persons.add(new Person("Elliot Smith", Person.MALE));
-		persons.add(new Person("Diana Krall", Person.FEMALE));
-		persons.add(new Person("David Gilmour", Person.MALE));
-
-		final Display display = new Display();
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				Shell shell = new Shell(display);
-				shell.setText("Gender Bender");
-				shell.setLayout(new GridLayout());
-
-				Table table = new Table(shell, SWT.SINGLE | SWT.H_SCROLL
-						| SWT.V_SCROLL | SWT.BORDER);
-				GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
-				table.setLayoutData(gridData);
-				table.setHeaderVisible(true);
-				table.setLinesVisible(true);
-				TableColumn column = new TableColumn(table, SWT.NONE);
-				column.setText("No");
-				column.setWidth(20);
-				column = new TableColumn(table, SWT.NONE);
-				column.setText("Name");
-				column.setWidth(100);
-				final TableViewer viewer = new TableViewer(table);
-
-				IObservableList observableList = Observables
-						.staticObservableList(persons);
-				ObservableListContentProvider contentProvider = new ObservableListContentProvider();
-
-				viewer.setContentProvider(contentProvider);
-
-				// this does not have to correspond to the columns in the table,
-				// we just list all attributes that affect the table content.
-				IObservableMap[] attributes = BeansObservables.observeMaps(
-						contentProvider.getKnownElements(), Person.class,
-						new String[] { "name", "gender" });
-
-				class ColorLabelProvider extends ObservableMapLabelProvider
-						implements ITableColorProvider {
-					Color male = display.getSystemColor(SWT.COLOR_BLUE);
-
-					Color female = new Color(display, 255, 192, 203);
-
-					ColorLabelProvider(IObservableMap[] attributes) {
-						super(attributes);
-					}
-
-					// to drive home the point that attributes does not have to
-					// match
-					// the columns
-					// in the table, we change the column text as follows:
-					public String getColumnText(Object element, int index) {
-						if (index == 0) {
-							return Integer
-									.toString(persons.indexOf(element) + 1);
-						}
-						return ((Person) element).getName();
-					}
-
-					public Color getBackground(Object element, int index) {
-						return null;
-					}
-
-					public Color getForeground(Object element, int index) {
-						if (index == 0)
-							return null;
-						Person person = (Person) element;
-						return (person.getGender() == Person.MALE) ? male
-								: female;
-					}
-
-					public void dispose() {
-						super.dispose();
-						female.dispose();
-					}
-				}
-				viewer.setLabelProvider(new ColorLabelProvider(attributes));
-
-				viewer.setInput(observableList);
-
-				table.getColumn(0).pack();
-
-				Button button = new Button(shell, SWT.PUSH);
-				button.setText("Toggle Gender");
-				button.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent arg0) {
-						StructuredSelection selection = (StructuredSelection) viewer
-								.getSelection();
-						if (selection != null && !selection.isEmpty()) {
-							Person person = (Person) selection
-									.getFirstElement();
-							person
-									.setGender((person.getGender() == Person.MALE) ? Person.FEMALE
-											: Person.MALE);
-						}
-					}
-				});
-
-				shell.setSize(300, 400);
-				shell.open();
-
-				while (!shell.isDisposed()) {
-					if (!display.readAndDispatch())
-						display.sleep();
-				}
-			}
-		});
-		display.dispose();
-	}
-
-	private static class Person {
-		static final int MALE = 0;
-
-		static final int FEMALE = 1;
-
-		private String name;
-
-		private int gender;
-
-		private PropertyChangeSupport changeSupport = new PropertyChangeSupport(
-				this);
-
-		Person(String name, int gender) {
-			this.name = name;
-			this.gender = gender;
-		}
-
-		/**
-		 * Returns the name. Method declared public to satisfy Java bean
-		 * conventions
-		 * 
-		 * @return the name
-		 */
-		public String getName() {
-			return name;
-		}
-
-		/**
-		 * @param listener
-		 */
-		public void addPropertyChangeListener(PropertyChangeListener listener) {
-			changeSupport.addPropertyChangeListener(listener);
-		}
-		
-		public void removePropertyChangeListener(PropertyChangeListener listener) {
-			changeSupport.removePropertyChangeListener(listener);
-		}
-
-		/**
-		 * Returns the gender. Method declared public to satisfy Java bean
-		 * conventions
-		 * 
-		 * @return the gender
-		 */
-		public int getGender() {
-			return gender;
-		}
-
-		void setGender(int gender) {
-			changeSupport.firePropertyChange("gender", this.gender,
-					this.gender = gender);
-		}
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet008ComputedValue.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet008ComputedValue.java
deleted file mode 100644
index 38433d9..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet008ComputedValue.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.UpdateValueStrategy;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.ComputedValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-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.Text;
-
-/**
- * Snippet that demostrates a simple use case using ComputedValue to format a
- * name as the user enters first and last name.
- * 
- * @since 3.2
- */
-public class Snippet008ComputedValue {
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		final Display display = new Display();
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				Shell shell = new Shell(display);
-				shell.setLayout(new FillLayout());
-
-				final UI ui = new UI(shell);
-				final Data data = new Data();
-
-				// Bind the UI to the Data.
-				DataBindingContext dbc = new DataBindingContext();
-				dbc.bindValue(SWTObservables.observeText(ui.firstName,
-						SWT.Modify), data.firstName, null, null);
-				dbc.bindValue(SWTObservables.observeText(ui.lastName,
-						SWT.Modify), data.lastName, null, null);
-
-				// Construct the formatted name observable.
-				FormattedName formattedName = new FormattedName(data.firstName,
-						data.lastName);
-
-				// Bind the formatted name Text to the formatted name
-				// observable.
-				dbc.bindValue(SWTObservables.observeText(ui.formattedName,
-						SWT.None), formattedName, new UpdateValueStrategy(false, UpdateValueStrategy.POLICY_NEVER), null);
-
-				shell.pack();
-				shell.open();
-				while (!shell.isDisposed()) {
-					if (!display.readAndDispatch())
-						display.sleep();
-				}
-			}
-		});
-		display.dispose();
-	}
-
-	/**
-	 * Creates the formatted name on change of the first or last name
-	 * observables.
-	 * <p>
-	 * The key to understanding ComputedValue is understanding that it knows of
-	 * the observables that are queried without being told. This is done with
-	 * {@link ObservableTracker} voodoo. When calculate() is invoked
-	 * <code>ObservableTracker</code> records the observables that are
-	 * queried. It then exposes those observables and <code>ComputedValue</code>
-	 * can listen to changes in those objects and react accordingly.
-	 * </p>
-	 * 
-	 * @since 3.2
-	 */
-	static class FormattedName extends ComputedValue {
-		private IObservableValue firstName;
-
-		private IObservableValue lastName;
-
-		FormattedName(IObservableValue firstName, IObservableValue lastName) {
-			this.firstName = firstName;
-			this.lastName = lastName;
-		}
-
-		protected Object calculate() {
-			String lastName = (String) this.lastName.getValue();
-			String firstName = (String) this.firstName.getValue();
-			lastName = (lastName != null && lastName.length() > 0) ? lastName
-					: "[Last Name]";
-			firstName = (firstName != null && firstName.length() > 0) ? firstName
-					: "[First Name]";
-
-			StringBuffer buffer = new StringBuffer();
-			buffer.append(lastName).append(", ").append(firstName);
-
-			return buffer.toString();
-		}
-	}
-
-	static class Data {
-		final WritableValue firstName;
-
-		final WritableValue lastName;
-
-		Data() {
-			firstName = new WritableValue("", String.class);
-			lastName = new WritableValue("", String.class);
-		}
-	}
-
-	/**
-	 * Composite that creates the UI.
-	 * 
-	 * @since 3.2
-	 */
-	static class UI extends Composite {
-		final Text firstName;
-
-		final Text lastName;
-
-		final Text formattedName;
-
-		UI(Composite parent) {
-			super(parent, SWT.NONE);
-
-			GridLayoutFactory.swtDefaults().numColumns(2).applyTo(this);
-
-			new Label(this, SWT.NONE).setText("First Name:");
-			new Label(this, SWT.NONE).setText("Last Name");
-
-			GridDataFactory gdf = GridDataFactory.swtDefaults().align(SWT.FILL,
-					SWT.FILL).grab(true, false);
-			firstName = new Text(this, SWT.BORDER);
-			gdf.applyTo(firstName);
-
-			lastName = new Text(this, SWT.BORDER);
-			gdf.applyTo(lastName);
-
-			gdf = GridDataFactory.swtDefaults().span(2, 1).grab(true, false)
-					.align(SWT.FILL, SWT.BEGINNING);
-			Label label = new Label(this, SWT.NONE);
-			label.setText("Formatted Name:");
-			gdf.applyTo(label);
-
-			formattedName = new Text(this, SWT.BORDER);
-			formattedName.setEditable(false);
-			gdf.applyTo(formattedName);
-		}
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet009TableViewer.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet009TableViewer.java
deleted file mode 100644
index a96d5ec..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet009TableViewer.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef, Inc. and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Coconut Palm Software, Inc. - Initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-
-/**
- * Demonstrates binding a TableViewer to a collection.
- */
-public class Snippet009TableViewer {
-	public static void main(String[] args) {
-		ViewModel viewModel = new ViewModel();
-		Shell shell = new View(viewModel).createShell();
-
-		// The SWT event loop
-		Display display = Display.getCurrent();
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch()) {
-				display.sleep();
-			}
-		}
-	}
-
-	// Minimal JavaBeans support
-	public static abstract class AbstractModelObject {
-		private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(
-				this);
-
-		public void addPropertyChangeListener(PropertyChangeListener listener) {
-			propertyChangeSupport.addPropertyChangeListener(listener);
-		}
-
-		public void addPropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			propertyChangeSupport.addPropertyChangeListener(propertyName,
-					listener);
-		}
-
-		public void removePropertyChangeListener(PropertyChangeListener listener) {
-			propertyChangeSupport.removePropertyChangeListener(listener);
-		}
-
-		public void removePropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			propertyChangeSupport.removePropertyChangeListener(propertyName,
-					listener);
-		}
-
-		protected void firePropertyChange(String propertyName, Object oldValue,
-				Object newValue) {
-			propertyChangeSupport.firePropertyChange(propertyName, oldValue,
-					newValue);
-		}
-	}
-
-	// The data model class. This is normally a persistent class of some sort.
-	static class Person extends AbstractModelObject {
-		// A property...
-		String name = "John Smith";
-
-		public Person(String name) {
-			this.name = name;
-		}
-
-		public String getName() {
-			return name;
-		}
-
-		public void setName(String name) {
-			String oldValue = this.name;
-			this.name = name;
-			firePropertyChange("name", oldValue, name);
-		}
-	}
-
-	// The View's model--the root of our Model graph for this particular GUI.
-	//
-	// Typically each View class has a corresponding ViewModel class.
-	// The ViewModel is responsible for getting the objects to edit from the
-	// data access tier. Since this snippet doesn't have any persistent objects 
-	// ro retrieve, this ViewModel just instantiates a model object to edit.
-	static class ViewModel {
-		// The model to bind
-		private List people = new LinkedList(); {
-			people.add(new Person("Steve Northover"));
-			people.add(new Person("Grant Gayed"));
-			people.add(new Person("Veronika Irvine"));
-			people.add(new Person("Mike Wilson"));
-			people.add(new Person("Christophe Cornu"));
-			people.add(new Person("Lynne Kues"));
-			people.add(new Person("Silenio Quarti"));
-		}
-
-		public List getPeople() {
-			return people;
-		}
-	}
-
-	// The GUI view
-	static class View {
-		private ViewModel viewModel;
-		private Table committers;
-
-		public View(ViewModel viewModel) {
-			this.viewModel = viewModel;
-		}
-
-		public Shell createShell() {
-			// Build a UI
-			Display display = Display.getDefault();
-			Shell shell = new Shell(display);
-			shell.setLayout(new FillLayout());
-			committers = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
-			committers.setLinesVisible(true);
-			
-			// Set up data binding. In an RCP application, the threading Realm
-			// will be set for you automatically by the Workbench. In an SWT
-			// application, you can do this once, wrpping your binding
-			// method call.
-			Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-				public void run() {
-					DataBindingContext bindingContext = new DataBindingContext();
-					bindGUI(bindingContext);
-				}
-			});
-
-			// Open and return the Shell
-			shell.setSize(100, 300);
-			shell.open();
-			return shell;
-		}
-
-		protected void bindGUI(DataBindingContext bindingContext) {
-			// Since we're using a JFace Viewer, we do first wrap our Table...
-			TableViewer peopleViewer = new TableViewer(committers);
-			
-			// Create a standard content provider
-			ObservableListContentProvider peopleViewerContentProvider = 
-				new ObservableListContentProvider();
-			peopleViewer.setContentProvider(peopleViewerContentProvider);
-			
-			// And a standard label provider that maps columns
-			IObservableMap[] attributeMaps = BeansObservables.observeMaps(
-					peopleViewerContentProvider.getKnownElements(), Person.class,
-					new String[] { "name" });
-			peopleViewer.setLabelProvider(new ObservableMapLabelProvider(attributeMaps));
-			
-			// Now set the Viewer's input
-			peopleViewer.setInput(new WritableList(viewModel.getPeople(), Person.class));
-		}
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet010MasterDetail.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet010MasterDetail.java
deleted file mode 100644
index b4cb426..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet010MasterDetail.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.UpdateValueStrategy;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Snippet that displays a simple master detail use case. A list of persons is
- * displayed in a list and upon selection the name of the selected person will
- * be displayed in a Text widget.
- */
-public class Snippet010MasterDetail {
-	public static void main(String[] args) {
-		final Display display = new Display();
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				Shell shell = new Shell(display);
-				shell.setLayout(new GridLayout());
-
-				Person[] persons = new Person[] { new Person("Me"),
-						new Person("Myself"), new Person("I") };
-
-				ListViewer viewer = new ListViewer(shell);
-				viewer.setContentProvider(new ArrayContentProvider());
-				viewer.setInput(persons);
-
-				Text name = new Text(shell, SWT.BORDER | SWT.READ_ONLY);
-
-				// 1. Observe changes in selection.
-				IObservableValue selection = ViewersObservables
-						.observeSingleSelection(viewer);
-
-				// 2. Observe the name property of the current selection.
-				IObservableValue detailObservable = BeansObservables
-						.observeDetailValue(Realm.getDefault(), selection,
-								"name", String.class);
-
-				// 3. Bind the Text widget to the name detail (selection's
-				// name).
-				new DataBindingContext().bindValue(SWTObservables.observeText(
-						name, SWT.None), detailObservable,
-						new UpdateValueStrategy(false,
-								UpdateValueStrategy.POLICY_NEVER), null);
-
-				shell.open();
-				while (!shell.isDisposed()) {
-					if (!display.readAndDispatch())
-						display.sleep();
-				}
-			}
-		});
-		display.dispose();
-	}
-
-	public static class Person {
-		private String name;
-		private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
-
-		Person(String name) {
-			this.name = name;
-		}
-
-		public void addPropertyChangeListener(PropertyChangeListener listener) {
-			changeSupport.addPropertyChangeListener(listener);
-		}
-		
-		public void removePropertyChangeListener(PropertyChangeListener listener) {
-			changeSupport.removePropertyChangeListener(listener);
-		}
-		
-		/**
-		 * @return Returns the name.
-		 */
-		public String getName() {
-			return name;
-		}
-
-		public String toString() {
-			return name;
-		}
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet011ValidateMultipleBindingsSnippet.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet011ValidateMultipleBindingsSnippet.java
deleted file mode 100644
index 59ae4c2..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet011ValidateMultipleBindingsSnippet.java
+++ /dev/null
@@ -1,129 +0,0 @@
- /*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.UpdateValueStrategy;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Snippet that validates values across multiple bindings on change of each
- * observable. If the values of the target observables are not equal the model
- * is not updated. When the values are equal they will be written to sysout.
- * 
- * @author Brad Reynolds
- */
-public class Snippet011ValidateMultipleBindingsSnippet {
-	public static void main(String[] args) {
-		Realm.runWithDefault(SWTObservables.getRealm(Display.getDefault()),
-				new Runnable() {
-					public void run() {
-						Snippet011ValidateMultipleBindingsSnippet.run();
-					}
-				});
-	}
-
-	private static void run() {
-		Shell shell = new Shell();
-
-		View view = new View(shell);
-		final Model model = new Model();
-
-		DataBindingContext dbc = new DataBindingContext();
-		dbc.bindValue(SWTObservables.observeText(view.text1, SWT.Modify),
-				model.value1, new UpdateValueStrategy()
-						.setAfterConvertValidator(new CrossFieldValidator(
-								model.value2)), null);
-		dbc.bindValue(SWTObservables.observeText(view.text2, SWT.Modify),
-				model.value2, new UpdateValueStrategy()
-						.setAfterConvertValidator(new CrossFieldValidator(
-								model.value1)), null);
-
-		// DEBUG - print to show value change
-		model.value1.addValueChangeListener(new IValueChangeListener() {
-			public void handleValueChange(ValueChangeEvent event) {
-				System.out.println("Value 1: " + model.value1.getValue());
-			}
-		});
-
-		// DEBUG - print to show value change
-		model.value2.addValueChangeListener(new IValueChangeListener() {
-			public void handleValueChange(ValueChangeEvent event) {
-				System.out.println("Value 2: " + model.value2.getValue());
-			}
-		});
-
-		shell.pack();
-		shell.open();
-		Display display = shell.getDisplay();
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-		display.dispose();
-	}
-
-	/**
-	 * @since 3.2
-	 * 
-	 */
-	private static final class CrossFieldValidator implements IValidator {
-		/**
-		 * 
-		 */
-		private final IObservableValue other;
-
-		/**
-		 * @param model
-		 */
-		private CrossFieldValidator(IObservableValue other) {
-			this.other = other;
-		}
-
-		public IStatus validate(Object value) {
-			if (!value.equals(other.getValue())) {
-				return ValidationStatus.ok();
-			}
-			return ValidationStatus.error("values cannot be the same");
-		}
-	}
-
-	static class Model {
-		WritableValue value1 = new WritableValue();
-		WritableValue value2 = new WritableValue();
-	}
-
-	static class View {
-		Text text1;
-		Text text2;
-
-		View(Composite composite) {
-			composite.setLayout(new GridLayout(2, true));
-			text1 = new Text(composite, SWT.BORDER);
-			text2 = new Text(composite, SWT.BORDER);
-		}
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet012CompositeUpdater.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet012CompositeUpdater.java
deleted file mode 100644
index af9fee0..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet012CompositeUpdater.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.util.Timer;
-import java.util.TimerTask;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.provisional.swt.CompositeUpdater;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.widgets.Button;
-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.Widget;
-
-/**
- * @since 3.2
- * 
- */
-public class Snippet012CompositeUpdater {
-
-	public static void main(String[] args) {
-		final Display display = new Display();
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				Shell shell = new Shell(display);
-
-				final WritableList list = new WritableList();
-
-				Button button = new Button(shell, SWT.PUSH);
-				button.setText("add");
-				button.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(
-							org.eclipse.swt.events.SelectionEvent e) {
-						list.add(0, new Counter());
-					}
-				});
-
-				final Composite composite = new Composite(shell, SWT.None);
-
-				new CompositeUpdater(composite, list) {
-					protected Widget createWidget(int index) {
-						Label label = new Label(composite, SWT.BORDER);
-						//requestLayout(label);
-						return label;
-					}
-
-					protected void updateWidget(Widget widget, Object element) {
-						((Label) widget).setText(((Counter) element).getValue()
-								+ "");
-						requestLayout((Label)widget);
-					}
-				};
-				GridLayoutFactory.fillDefaults().numColumns(10).generateLayout(composite);
-
-				GridDataFactory.fillDefaults().grab(true, true).applyTo(
-						composite);
-
-				GridLayoutFactory.fillDefaults().generateLayout(shell);
-				shell.pack();
-				shell.open();
-				while (!shell.isDisposed()) {
-					if (!display.readAndDispatch())
-						display.sleep();
-				}
-			}
-		});
-		display.dispose();
-	}
-
-	static Timer timer = new Timer(true);
-
-	static class Counter extends WritableValue {
-		Counter() {
-			super(new Integer(0), Integer.class);
-			scheduleIncrementTask();
-		}
-
-		private void scheduleIncrementTask() {
-			timer.schedule(new TimerTask() {
-				public void run() {
-					// we have to get onto the realm (UI thread) to perform the
-					// increment
-					getRealm().asyncExec(new Runnable() {
-						public void run() {
-							Integer currentVal = (Integer) getValue();
-							setValue(new Integer(currentVal.intValue() + 1));
-						}
-					});
-					scheduleIncrementTask();
-				}
-			}, 1000);
-		}
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet013TableViewerEditing.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet013TableViewerEditing.java
deleted file mode 100644
index b5cf3f4..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet013TableViewerEditing.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef, Inc. and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     The Pampered Chef, Inc. - initial API and implementation
- *     Tom Schindl - cell editing
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.databinding.viewers.ObservableValueEditingSupport;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-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.Table;
-
-/**
- * Demonstrates binding a TableViewer to a collection using the 3.3 Viewer APIs.
- */
-public class Snippet013TableViewerEditing {
-	public static void main(String[] args) {
-		final Display display = new Display();
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				ViewModel viewModel = new ViewModel();
-				Shell shell = new View(viewModel).createShell();
-
-				// The SWT event loop
-				while (!shell.isDisposed()) {
-					if (!display.readAndDispatch()) {
-						display.sleep();
-					}
-				}
-			}
-		});
-	}
-
-	// Minimal JavaBeans support
-	public static abstract class AbstractModelObject {
-		private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(
-				this);
-
-		public void addPropertyChangeListener(PropertyChangeListener listener) {
-			propertyChangeSupport.addPropertyChangeListener(listener);
-		}
-
-		public void addPropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			propertyChangeSupport.addPropertyChangeListener(propertyName,
-					listener);
-		}
-
-		public void removePropertyChangeListener(PropertyChangeListener listener) {
-			propertyChangeSupport.removePropertyChangeListener(listener);
-		}
-
-		public void removePropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			propertyChangeSupport.removePropertyChangeListener(propertyName,
-					listener);
-		}
-
-		protected void firePropertyChange(String propertyName, Object oldValue,
-				Object newValue) {
-			propertyChangeSupport.firePropertyChange(propertyName, oldValue,
-					newValue);
-		}
-	}
-
-	// The data model class. This is normally a persistent class of some sort.
-	static class Person extends AbstractModelObject {
-		// A property...
-		String name = "John Smith";
-
-		public Person(String name) {
-			this.name = name;
-		}
-
-		public String getName() {
-			return name;
-		}
-
-		public void setName(String name) {
-			String oldValue = this.name;
-			this.name = name;
-			firePropertyChange("name", oldValue, name);
-		}
-	}
-
-	// The View's model--the root of our Model graph for this particular GUI.
-	//
-	// Typically each View class has a corresponding ViewModel class.
-	// The ViewModel is responsible for getting the objects to edit from the
-	// data access tier. Since this snippet doesn't have any persistent objects
-	// ro retrieve, this ViewModel just instantiates a model object to edit.
-	static class ViewModel {
-		// The model to bind
-		private List people = new LinkedList();
-		{
-			people.add(new Person("Steve Northover"));
-			people.add(new Person("Grant Gayed"));
-			people.add(new Person("Veronika Irvine"));
-			people.add(new Person("Mike Wilson"));
-			people.add(new Person("Christophe Cornu"));
-			people.add(new Person("Lynne Kues"));
-			people.add(new Person("Silenio Quarti"));
-		}
-
-		public List getPeople() {
-			return people;
-		}
-	}
-
-	/**
-	 * Editing support that uses JFace Data Binding to control the editing
-	 * lifecycle. The standard EditingSupport get/setValue(...) lifecycle is not
-	 * used.
-	 * 
-	 * @since 3.3
-	 */
-	private static class InlineEditingSupport extends ObservableValueEditingSupport {
-		private CellEditor cellEditor;
-		
-		/**
-		 * @param viewer
-		 * @param dbc
-		 */
-		public InlineEditingSupport(ColumnViewer viewer,
-				DataBindingContext dbc) {
-			
-			super(viewer, dbc);
-			cellEditor = new TextCellEditor((Composite) viewer.getControl());
-		}
-		
-		protected CellEditor getCellEditor(Object element) {
-			return cellEditor;
-		}
-
-		protected IObservableValue doCreateCellEditorObservable(
-				CellEditor cellEditor) {
-			
-			return SWTObservables.observeText(cellEditor
-					.getControl(), SWT.Modify);
-		}
-
-		protected IObservableValue doCreateElementObservable(Object element,
-				ViewerCell cell) {
-			return BeansObservables.observeValue(element, "name");
-		}		
-	}
-
-	// The GUI view
-	static class View {
-		private ViewModel viewModel;
-		private Table committers;
-		private Label selectedCommitter;
-
-		public View(ViewModel viewModel) {
-			this.viewModel = viewModel;
-		}
-
-		public Shell createShell() {
-			// Build a UI
-			Display display = Display.getDefault();
-			Shell shell = new Shell(display);
-			shell.setLayout(new FillLayout(SWT.VERTICAL));
-			committers = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
-			committers.setLinesVisible(true);
-
-			selectedCommitter = new Label(shell, SWT.NONE);
-			// Set up data binding. In an RCP application, the threading
-			// Realm
-			// will be set for you automatically by the Workbench. In an SWT
-			// application, you can do this once, wrpping your binding
-			// method call.
-			DataBindingContext bindingContext = new DataBindingContext();
-			bindGUI(bindingContext);
-
-			// Open and return the Shell
-			shell.setSize(100, 300);
-			shell.open();
-			return shell;
-		}
-
-		protected void bindGUI(DataBindingContext bindingContext) {
-			// Since we're using a JFace Viewer, we do first wrap our Table...
-			TableViewer peopleViewer = new TableViewer(committers);
-			TableViewerColumn column = new TableViewerColumn(peopleViewer,
-					SWT.NONE);
-			column.setEditingSupport(new InlineEditingSupport(peopleViewer,
-					bindingContext));
-			column.getColumn().setWidth(100);
-
-			// Create a standard content provider
-			ObservableListContentProvider peopleViewerContentProvider = new ObservableListContentProvider();
-			peopleViewer.setContentProvider(peopleViewerContentProvider);
-
-			// And a standard label provider that maps columns
-			IObservableMap[] attributeMaps = BeansObservables.observeMaps(
-					peopleViewerContentProvider.getKnownElements(),
-					Person.class, new String[] { "name" });
-			peopleViewer.setLabelProvider(new ObservableMapLabelProvider(
-					attributeMaps));
-
-			// Now set the Viewer's input
-			peopleViewer.setInput(new WritableList(viewModel.getPeople(),
-					Person.class));
-
-			// bind selectedCommitter label to the name of the current selection
-			IObservableValue selection = ViewersObservables
-					.observeSingleSelection(peopleViewer);
-			bindingContext.bindValue(SWTObservables
-					.observeText(selectedCommitter), BeansObservables
-					.observeDetailValue(Realm.getDefault(), selection, "name",
-							String.class), null, null);
-		}
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet014WizardDialog.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet014WizardDialog.java
deleted file mode 100644
index 788a51d..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet014WizardDialog.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Boris Bokowski, IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.util.Date;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.UpdateValueStrategy;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.wizard.WizardPageSupport;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Creates and opens a wizard dialog with two simple wizard pages.
- */
-public class Snippet014WizardDialog {
-
-	static class FirstWizardPage extends WizardPage {
-		private final class SingleDigitValidator implements IValidator {
-			public IStatus validate(Object value) {
-				Integer i = (Integer) value;
-				if (i == null) {
-					return ValidationStatus
-							.info("Please enter a value.");
-				}
-				if (i.intValue() < 0 || i.intValue() > 9) {
-					return ValidationStatus
-							.error("Value must be between 0 and 9.");
-				}
-				return ValidationStatus.ok();
-			}
-		}
-
-		protected FirstWizardPage() {
-			super("First", "First Page", ImageDescriptor
-					.createFromImage(new Image(Display.getDefault(), 16, 16)));
-		}
-
-		public void createControl(Composite parent) {
-			DataBindingContext dbc = new DataBindingContext();
-			WizardPageSupport.create(this, dbc);
-			Composite composite = new Composite(parent, SWT.NONE);
-			Label label = new Label(composite, SWT.NONE);
-			label.setText("Enter a number between 0 and 9:");
-			Text text = new Text(composite, SWT.BORDER);
-			
-			dbc.bindValue(
-							SWTObservables.observeText(text, SWT.Modify),
-							((SampleWizard) getWizard()).getModel().intValue,
-							new UpdateValueStrategy().setAfterConvertValidator(new SingleDigitValidator()),
-							null);
-			
-			GridLayoutFactory.swtDefaults().numColumns(2).generateLayout(
-					composite);
-			setControl(composite);
-		}
-	}
-
-	static class SecondWizardPage extends WizardPage {
-		protected SecondWizardPage() {
-			super("Second", "Second Page", ImageDescriptor
-					.createFromImage(new Image(Display.getDefault(), 16, 16)));
-		}
-
-		public void createControl(Composite parent) {
-			DataBindingContext dbc = new DataBindingContext();
-			WizardPageSupport.create(this, dbc);
-			Composite composite = new Composite(parent, SWT.NONE);
-			Label label = new Label(composite, SWT.NONE);
-			label.setText("Enter a date:");
-			Text text = new Text(composite, SWT.BORDER);
-			
-			dbc.bindValue(
-							SWTObservables.observeText(text, SWT.Modify),
-							((SampleWizard) getWizard()).getModel().dateValue,
-							null,
-							null);
-
-			GridLayoutFactory.swtDefaults().numColumns(2).generateLayout(
-					composite);
-			setControl(composite);
-		}
-	}
-
-	static class SampleWizardModel {
-		IObservableValue intValue = new WritableValue(null, Integer.class);
-		IObservableValue dateValue = new WritableValue(null, Date.class);
-	}
-
-	static class SampleWizard extends Wizard {
-
-		private SampleWizardModel model = new SampleWizardModel();
-
-		public void addPages() {
-			addPage(new FirstWizardPage());
-			addPage(new SecondWizardPage());
-		}
-
-		public SampleWizardModel getModel() {
-			return model;
-		}
-		
-		public String getWindowTitle() {
-			return "Data Binding Snippet014";
-		}
-
-		public boolean performFinish() {
-			return true;
-		}
-
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		// note that the "runWithDefault" will be done for you if you are using
-		// the
-		// Workbench as opposed to just JFace/SWT.
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				IWizard wizard = new SampleWizard();
-				WizardDialog dialog = new WizardDialog(null, wizard);
-				dialog.open();
-				// The SWT event loop
-				Display display = Display.getCurrent();
-				while (dialog.getShell() != null
-						&& !dialog.getShell().isDisposed()) {
-					if (!display.readAndDispatch()) {
-						display.sleep();
-					}
-				}
-			}
-		});
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet015DelayTextModifyEvents.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet015DelayTextModifyEvents.java
deleted file mode 100644
index eb132cf..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet015DelayTextModifyEvents.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/************************************************************************************************************
- * Copyright (c) 2007 Matthew Hall and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.0 which
- * accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- * 		Matthew Hall - initial API and implementation (bug 180746)
- * 		Boris Bokowski, IBM - initial API and implementation
- ***********************************************************************************************************/
-package org.eclipse.jface.examples.databinding.snippets;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.swt.ISWTObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.provisional.swt.ControlUpdater;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.resource.FontDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.resource.LocalResourceManager;
-import org.eclipse.jface.resource.ResourceManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-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.Text;
-
-public class Snippet015DelayTextModifyEvents {
-
-	private static void createControls(Shell shell) {
-		final Label field1 = createLabel(shell, SWT.NONE, "Field 1 ");
-
-		Text text1 = new Text(shell, SWT.BORDER);
-		GridDataFactory.fillDefaults().grab(true, false).hint(200, SWT.DEFAULT)
-				.applyTo(text1);
-		createLabel(shell, SWT.NONE, "200ms delay");
-
-		final Label field2 = createLabel(shell, SWT.NONE, "Field 2 ");
-
-		Text text2 = new Text(shell, SWT.BORDER);
-		GridDataFactory.fillDefaults().grab(true, false).hint(200, SWT.DEFAULT)
-				.applyTo(text2);
-
-		createLabel(shell, SWT.NONE, "1000ms delay");
-
-		final ISWTObservableValue delayed1 = SWTObservables.observeDelayedValue(200,
-				SWTObservables.observeText(text1, SWT.Modify));
-		final ISWTObservableValue delayed2 = SWTObservables.observeDelayedValue(1000,
-				SWTObservables.observeText(text2, SWT.Modify));
-		
-		// (In a real application,you would want to dispose the resource manager
-		// when you are done with it)
-		ResourceManager resourceManager = new LocalResourceManager(JFaceResources.getResources());
-		final Font shellFont = shell.getFont();
-		final Font italicFont = resourceManager.createFont(FontDescriptor.createFrom(
-				shellFont).setStyle(SWT.ITALIC));
-		
-		final IObservableValue stale1 = Observables.observeStale(delayed1);
-		new ControlUpdater(field2) {
-			protected void updateControl() {
-				boolean stale = ((Boolean)stale1.getValue()).booleanValue();
-				field2.setFont(stale ? italicFont : shellFont);
-			}
-		};
-		
-		final IObservableValue stale2 = Observables.observeStale(delayed2);
-		new ControlUpdater(field1) {
-			protected void updateControl() {
-				boolean stale = ((Boolean)stale2.getValue()).booleanValue();
-				field1.setFont(stale ? italicFont : shellFont);
-			}
-		};
-		
-		String info = "Pending changes are applied immediately if the observed control loses focus";
-		GridDataFactory.fillDefaults().span(3, 1).applyTo(
-				createLabel(shell, SWT.WRAP, info));
-
-		DataBindingContext dbc = new DataBindingContext();
-
-		dbc.bindValue(delayed1, delayed2, null, null);
-	}
-
-	private static Label createLabel(Composite parent, int style, String text) {
-		Label label = new Label(parent, style);
-		label.setText(text);
-		return label;
-	}
-
-	public static void main(String[] args) {
-		final Display display = new Display();
-
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				Shell shell = new Shell();
-				shell.setLayout(new GridLayout(3, false));
-
-				createControls(shell);
-
-				shell.pack();
-				shell.open();
-				while (!shell.isDisposed())
-					if (!display.readAndDispatch())
-						display.sleep();
-			}
-
-		});
-
-		display.dispose();
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet016TableUpdater.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet016TableUpdater.java
deleted file mode 100644
index c0316fa..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet016TableUpdater.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.provisional.swt.TableUpdater;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * @since 3.2
- * 
- */
-public class Snippet016TableUpdater {
-	public static void main(String[] args) {
-		final Display display = new Display();
-
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				final Shell shell = createShell(display);
-				GridLayoutFactory.fillDefaults().generateLayout(shell);
-				shell.open();
-				// The SWT event loop
-				while (!shell.isDisposed()) {
-					if (!display.readAndDispatch()) {
-						display.sleep();
-					}
-				}
-			}
-		});
-	}
-
-	static class Stuff {
-		private WritableValue counter = new WritableValue(new Integer(1), Integer.class);
-
-		public Stuff(final Display display) {
-			display.timerExec(1000, new Runnable() {
-				public void run() {
-					counter.setValue(new Integer(1 + ((Integer) counter
-							.getValue()).intValue()));
-					display.timerExec(1000, this);
-				}
-			});
-		}
-		
-		public String toString() {
-			return counter.getValue().toString();
-		}
-	}
-
-	protected static Shell createShell(final Display display) {
-		Shell shell = new Shell();
-		Table t = new Table(shell, SWT.VIRTUAL);
-		final WritableList list = new WritableList();
-		new TableUpdater(t, list) {
-
-			protected void updateItem(int index, TableItem item, Object element) {
-				item.setText(element.toString());
-			}
-		};
-		display.timerExec(2000, new Runnable() {
-			public void run() {
-				list.add(new Stuff(display));
-				display.timerExec(2000, this);
-			}
-		});
-		return shell;
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet017TableViewerWithDerivedColumns.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet017TableViewerWithDerivedColumns.java
deleted file mode 100644
index 7ac98ae..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet017TableViewerWithDerivedColumns.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef, Inc. and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Coconut Palm Software, Inc. - Initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.map.CompositeMap;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Demonstrates binding a TableViewer to a collection.
- */
-public class Snippet017TableViewerWithDerivedColumns {
-	public static void main(String[] args) {
-		final Display display = new Display();
-
-		// Set up data binding. In an RCP application, the threading Realm
-		// will be set for you automatically by the Workbench. In an SWT
-		// application, you can do this once, wrapping your binding
-		// method call.
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				ViewModel viewModel = new ViewModel();
-				Shell shell = new View(viewModel).createShell();
-
-				// The SWT event loop
-				while (!shell.isDisposed()) {
-					if (!display.readAndDispatch()) {
-						display.sleep();
-					}
-				}
-			}
-		});
-	}
-
-	// Minimal JavaBeans support
-	public static abstract class AbstractModelObject {
-		private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(
-				this);
-
-		public void addPropertyChangeListener(PropertyChangeListener listener) {
-			propertyChangeSupport.addPropertyChangeListener(listener);
-		}
-
-		public void addPropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			propertyChangeSupport.addPropertyChangeListener(propertyName,
-					listener);
-		}
-
-		public void removePropertyChangeListener(PropertyChangeListener listener) {
-			propertyChangeSupport.removePropertyChangeListener(listener);
-		}
-
-		public void removePropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			propertyChangeSupport.removePropertyChangeListener(propertyName,
-					listener);
-		}
-
-		protected void firePropertyChange(String propertyName, Object oldValue,
-				Object newValue) {
-			propertyChangeSupport.firePropertyChange(propertyName, oldValue,
-					newValue);
-		}
-	}
-
-	private static Person UNKNOWN = new Person("unknown", null, null);
-
-	// The data model class. This is normally a persistent class of some sort.
-	static class Person extends AbstractModelObject {
-		// A property...
-		String name = "Donald Duck";
-		Person mother;
-		Person father;
-
-		public Person(String name, Person mother, Person father) {
-			this.name = name;
-			this.mother = mother;
-			this.father = father;
-		}
-
-		public String getName() {
-			return name;
-		}
-
-		public void setName(String name) {
-			String oldValue = this.name;
-			this.name = name;
-			firePropertyChange("name", oldValue, name);
-		}
-
-		public Person getMother() {
-			return mother;
-		}
-
-		public void setMother(Person mother) {
-			firePropertyChange("mother", this.mother, this.mother = mother);
-		}
-
-		public Person getFather() {
-			return father;
-		}
-
-		public void setFather(Person father) {
-			firePropertyChange("father", this.father, this.father = father);
-		}
-
-		public String toString() {
-			return name;
-		}
-	}
-
-	// The View's model--the root of our Model graph for this particular GUI.
-	//
-	// Typically each View class has a corresponding ViewModel class.
-	// The ViewModel is responsible for getting the objects to edit from the
-	// data access tier. Since this snippet doesn't have any persistent objects
-	// ro retrieve, this ViewModel just instantiates a model object to edit.
-	static class ViewModel {
-		// The model to bind
-		private IObservableList people = new WritableList();
-		{
-			Person fergus = new Person("Fergus McDuck", UNKNOWN, UNKNOWN);
-			Person downy = new Person("Downy O'Drake", UNKNOWN, UNKNOWN);
-			Person scrooge = new Person("Scrooge McDuck", downy, fergus);
-			Person hortense = new Person("Hortense McDuck", downy, fergus);
-			Person quackmore = new Person("Quackmore Duck", UNKNOWN, UNKNOWN);
-			Person della = new Person("Della Duck", hortense, quackmore);
-			Person donald = new Person("Donald Duck", hortense, quackmore);
-			donald.setFather(quackmore);
-			donald.setMother(hortense);
-			della.setFather(quackmore);
-			della.setMother(hortense);
-			hortense.setMother(downy);
-			hortense.setFather(fergus);
-			scrooge.setMother(downy);
-			scrooge.setFather(fergus);
-			people.add(UNKNOWN);
-			people.add(downy);
-			people.add(fergus);
-			people.add(scrooge);
-			people.add(quackmore);
-			people.add(hortense);
-			people.add(della);
-			people.add(donald);
-		}
-
-		public IObservableList getPeople() {
-			return people;
-		}
-	}
-
-	// The GUI view
-	static class View {
-		private ViewModel viewModel;
-		private Table duckFamily;
-		private Text nameText;
-		private Combo motherCombo;
-		private Combo fatherCombo;
-
-		public View(ViewModel viewModel) {
-			this.viewModel = viewModel;
-		}
-
-		public Shell createShell() {
-			// Build a UI
-			Display display = Display.getDefault();
-			Shell shell = new Shell(display);
-			duckFamily = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
-			duckFamily.setHeaderVisible(true);
-			GridDataFactory.defaultsFor(duckFamily).span(2, 1).applyTo(
-					duckFamily);
-			createColumn("Name");
-			createColumn("Mother");
-			createColumn("Father");
-			createColumn("Grandmother");
-			duckFamily.setLinesVisible(true);
-
-			new Label(shell, SWT.NONE).setText("Name:");
-			nameText = new Text(shell, SWT.BORDER);
-			GridDataFactory.defaultsFor(nameText).grab(true, false).applyTo(
-					nameText);
-
-			new Label(shell, SWT.NONE).setText("Mother:");
-			motherCombo = new Combo(shell, SWT.READ_ONLY);
-
-			new Label(shell, SWT.NONE).setText("Father:");
-			fatherCombo = new Combo(shell, SWT.READ_ONLY);
-
-			DataBindingContext bindingContext = new DataBindingContext();
-			bindGUI(bindingContext);
-
-			GridLayoutFactory.swtDefaults().numColumns(2).applyTo(shell);
-			// Open and return the Shell
-			shell.setSize(500, 300);
-			shell.open();
-			return shell;
-		}
-
-		private void createColumn(String string) {
-			final TableColumn column = new TableColumn(duckFamily, SWT.NONE);
-			column.setWidth(100);
-			column.setText(string);
-		}
-
-		protected void bindGUI(DataBindingContext bindingContext) {
-			// Since we're using a JFace Viewer, we do first wrap our Table...
-			TableViewer peopleViewer = new TableViewer(duckFamily);
-			peopleViewer.addFilter(new ViewerFilter() {
-				public boolean select(Viewer viewer, Object parentElement,
-						Object element) {
-					return element != UNKNOWN;
-				}
-			});
-
-			// Create a standard content provider
-			ObservableListContentProvider peopleViewerContentProvider = new ObservableListContentProvider();
-			peopleViewer.setContentProvider(peopleViewerContentProvider);
-
-			// And a standard label provider that maps columns
-			IObservableMap nameMap = BeansObservables.observeMap(
-					peopleViewerContentProvider.getKnownElements(),
-					Person.class, "name");
-			IObservableMap motherMap = BeansObservables.observeMap(
-					peopleViewerContentProvider.getKnownElements(),
-					Person.class, "mother");
-			IObservableMap fatherMap = BeansObservables.observeMap(
-					peopleViewerContentProvider.getKnownElements(),
-					Person.class, "father");
-			IObservableMap grandmotherMap = new CompositeMap(motherMap,
-					BeansObservables.setToMapFactory(Person.class, "mother"));
-			IObservableMap[] columnMaps = new IObservableMap[] {
-					nameMap,
-					new CompositeMap(motherMap, BeansObservables.setToMapFactory(
-							Person.class, "name")),
-					new CompositeMap(fatherMap, BeansObservables.setToMapFactory(
-							Person.class, "name")),
-					new CompositeMap(grandmotherMap, BeansObservables.setToMapFactory(
-							Person.class, "name")) };
-			peopleViewer.setLabelProvider(new ObservableMapLabelProvider(
-					columnMaps));
-
-			// Now set the Viewer's input
-			peopleViewer.setInput(viewModel.getPeople());
-
-			IObservableValue selection = ViewersObservables
-					.observeSingleSelection(peopleViewer);
-			bindingContext
-					.bindValue(
-							SWTObservables.observeText(nameText, SWT.Modify),
-							BeansObservables.observeDetailValue(Realm
-									.getDefault(), selection, "name",
-									String.class), null, null);
-
-			ComboViewer mothercomboViewer = new ComboViewer(motherCombo);
-			ObservableListContentProvider motherComboContentProvider = new ObservableListContentProvider();
-			mothercomboViewer.setContentProvider(motherComboContentProvider);
-			mothercomboViewer.setLabelProvider(new ObservableMapLabelProvider(
-					BeansObservables.observeMap(motherComboContentProvider
-							.getKnownElements(), Person.class, "name")));
-			mothercomboViewer.setInput(viewModel.getPeople());
-			bindingContext.bindValue(ViewersObservables
-					.observeSingleSelection(mothercomboViewer),
-					BeansObservables.observeDetailValue(Realm.getDefault(),
-							selection, "mother", Person.class), null, null);
-
-			ComboViewer fatherComboViewer = new ComboViewer(fatherCombo);
-			ObservableListContentProvider fatherComboContentProvider = new ObservableListContentProvider();
-			fatherComboViewer
-					.setContentProvider(fatherComboContentProvider);
-			fatherComboViewer.setLabelProvider(new ObservableMapLabelProvider(
-					BeansObservables.observeMap(fatherComboContentProvider
-							.getKnownElements(), Person.class, "name")));
-			fatherComboViewer.setInput(viewModel.getPeople());
-			bindingContext.bindValue(ViewersObservables
-					.observeSingleSelection(fatherComboViewer),
-					BeansObservables.observeDetailValue(Realm.getDefault(),
-							selection, "father", Person.class), null, null);
-		}
-	}
-
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet018CheckboxTableViewerCheckedSelection.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet018CheckboxTableViewerCheckedSelection.java
deleted file mode 100644
index afdde9bf..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet018CheckboxTableViewerCheckedSelection.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 124684)
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.value.ComputedValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.layout.TableColumnLayout;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-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.Text;
-
-/**
- * Snippet 018: Binding to the checked elements in a CheckboxTableViewer.
- */
-public class Snippet018CheckboxTableViewerCheckedSelection {
-	public static void main(String[] args) {
-		// The SWT event loop
-		final Display display = Display.getDefault();
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				ViewModel viewModel = createSampleModel();
-
-				Shell shell = new View(viewModel).createShell();
-				shell.open();
-				while (!shell.isDisposed())
-					if (!display.readAndDispatch())
-						display.sleep();
-			}
-		});
-		display.dispose();
-	}
-
-	private static ViewModel createSampleModel() {
-		ViewModel viewModel = new ViewModel();
-
-		Person stan = createPerson("Stan");
-		Person kyle = createPerson("Kyle");
-		Person eric = createPerson("Eric");
-		Person kenny = createPerson("Kenny");
-		Person wendy = createPerson("Wendy");
-		Person butters = createPerson("Butters");
-
-		setFriends(stan, new Person[] { kyle, eric, kenny, wendy });
-		setFriends(kyle, new Person[] { stan, eric, kenny });
-		setFriends(eric, new Person[] { eric });
-		setFriends(kenny, new Person[] { stan, kyle, eric });
-		setFriends(wendy, new Person[] { stan });
-		setFriends(butters, new Person[0]);
-
-		Person[] people = new Person[] { stan, kyle, eric, kenny, wendy,
-				butters };
-		viewModel.setPeople(Arrays.asList(people));
-		return viewModel;
-	}
-
-	private static Person createPerson(String name) {
-		Person person = new Person();
-		person.setName(name);
-		return person;
-	}
-
-	private static void setFriends(Person person, Person[] friends) {
-		person.setFriends(new HashSet(Arrays.asList(friends)));
-	}
-
-	// Minimal JavaBeans support
-	public static abstract class AbstractModelObject {
-		private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(
-				this);
-
-		public void addPropertyChangeListener(PropertyChangeListener listener) {
-			propertyChangeSupport.addPropertyChangeListener(listener);
-		}
-
-		public void addPropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			propertyChangeSupport.addPropertyChangeListener(propertyName,
-					listener);
-		}
-
-		public void removePropertyChangeListener(PropertyChangeListener listener) {
-			propertyChangeSupport.removePropertyChangeListener(listener);
-		}
-
-		public void removePropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			propertyChangeSupport.removePropertyChangeListener(propertyName,
-					listener);
-		}
-
-		protected void firePropertyChange(String propertyName, Object oldValue,
-				Object newValue) {
-			propertyChangeSupport.firePropertyChange(propertyName, oldValue,
-					newValue);
-		}
-	}
-
-	// The data model class.
-	static class Person extends AbstractModelObject {
-		private String name;
-		private Set friends = new HashSet();
-
-		public String getName() {
-			return name;
-		}
-
-		public void setName(String name) {
-			firePropertyChange("name", this.name, this.name = name);
-		}
-
-		public Set getFriends() {
-			return new HashSet(friends);
-		}
-
-		public void setFriends(Set friends) {
-			firePropertyChange("friends", this.friends,
-					this.friends = new HashSet(friends));
-		}
-
-		public String toString() {
-			return name;
-		}
-	}
-
-	// The View's model--the root of our Model graph for this particular GUI.
-	//
-	// Typically each View class has a corresponding ViewModel class.
-	//
-	// The ViewModel is responsible for getting the objects to edit from the
-	// data access tier. Since this snippet doesn't have any persistent objects
-	// to retrieve, this ViewModel just instantiates a model object to edit.
-	static class ViewModel extends AbstractModelObject {
-		private List people = new ArrayList();
-
-		public List getPeople() {
-			return new ArrayList(people);
-		}
-
-		public void setPeople(List people) {
-			firePropertyChange("people", this.people,
-					this.people = new ArrayList(people));
-		}
-	}
-
-	// The GUI view
-	static class View {
-		private ViewModel viewModel;
-
-		private Shell shell;
-
-		private Button addPersonButton;
-		private Button removePersonButton;
-		private TableViewer peopleViewer;
-		private Text personName;
-		private CheckboxTableViewer friendsViewer;
-
-		public View(ViewModel viewModel) {
-			this.viewModel = viewModel;
-		}
-
-		public Shell createShell() {
-			// Build a UI
-			final Display display = Display.getCurrent();
-			shell = new Shell(display);
-
-			createUI(shell);
-
-			// Bind UI
-			bindUI();
-
-			// Open and return the Shell
-			shell.setSize(shell.computeSize(400, SWT.DEFAULT));
-			shell.open();
-			return shell;
-		}
-
-		private void createUI(Shell shell) {
-			shell.setText("Binding checked elements in CheckboxTableViewer");
-			shell.setLayout(new GridLayout(2, false));
-
-			new Label(shell, SWT.NONE).setText("People");
-
-			Composite buttons = new Composite(shell, SWT.NONE);
-			GridDataFactory.swtDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(
-					buttons);
-			GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(true)
-					.applyTo(buttons);
-			addPersonButton = new Button(buttons, SWT.PUSH);
-			addPersonButton.setText("Add");
-			GridDataFactory.fillDefaults().applyTo(addPersonButton);
-			removePersonButton = new Button(buttons, SWT.PUSH);
-			removePersonButton.setText("Remove");
-			GridDataFactory.fillDefaults().applyTo(removePersonButton);
-
-			Composite peopleComposite = new Composite(shell, SWT.NONE);
-			GridDataFactory.fillDefaults().grab(true, true).span(2, 1).applyTo(
-					peopleComposite);
-			TableColumnLayout peopleColumnLayout = new TableColumnLayout();
-			peopleComposite.setLayout(peopleColumnLayout);
-
-			peopleViewer = new TableViewer(peopleComposite, SWT.SINGLE
-					| SWT.BORDER | SWT.FULL_SELECTION);
-
-			Table peopleTable = peopleViewer.getTable();
-			peopleTable.setHeaderVisible(true);
-			peopleTable.setLinesVisible(true);
-
-			TableColumn nameColumn = new TableColumn(peopleTable, SWT.NONE);
-			nameColumn.setText("Name");
-			peopleColumnLayout.setColumnData(nameColumn,
-					new ColumnWeightData(1));
-
-			TableColumn friendsColumn = new TableColumn(peopleTable, SWT.NONE);
-			friendsColumn.setText("Friends");
-			peopleColumnLayout.setColumnData(friendsColumn,
-					new ColumnWeightData(3));
-
-			new Label(shell, SWT.NONE).setText("Name");
-
-			personName = new Text(shell, SWT.BORDER);
-			GridDataFactory.fillDefaults().grab(true, false)
-					.applyTo(personName);
-
-			new Label(shell, SWT.NONE).setText("Friends");
-
-			Composite friendsComposite = new Composite(shell, SWT.NONE);
-			GridDataFactory.fillDefaults().grab(true, true).applyTo(
-					friendsComposite);
-			TableColumnLayout friendsColumnLayout = new TableColumnLayout();
-			friendsComposite.setLayout(friendsColumnLayout);
-
-			friendsViewer = CheckboxTableViewer.newCheckList(friendsComposite,
-					SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION);
-
-			Table friendsTable = friendsViewer.getTable();
-			friendsTable.setHeaderVisible(true);
-			friendsTable.setLinesVisible(true);
-			TableColumn friendNameColumn = new TableColumn(friendsTable,
-					SWT.NONE);
-			friendNameColumn.setText("Name");
-			friendsColumnLayout.setColumnData(friendNameColumn,
-					new ColumnWeightData(1));
-
-			GridDataFactory.fillDefaults().grab(true, true).applyTo(
-					friendsViewer.getTable());
-		}
-
-		private void bindUI() {
-			DataBindingContext dbc = new DataBindingContext();
-
-			final IObservableList people = BeansObservables.observeList(Realm
-					.getDefault(), viewModel, "people");
-
-			addPersonButton.addListener(SWT.Selection, new Listener() {
-				public void handleEvent(Event event) {
-					InputDialog dlg = new InputDialog(shell, "Add Person",
-							"Enter name:", "<Name>", new IInputValidator() {
-								public String isValid(String newText) {
-									if (newText == null
-											|| newText.length() == 0)
-										return "Name cannot be empty";
-									return null;
-								}
-							});
-					if (dlg.open() == Window.OK) {
-						Person person = new Person();
-						person.setName(dlg.getValue());
-						people.add(person);
-						peopleViewer.setSelection(new StructuredSelection(
-								person));
-					}
-				}
-			});
-
-			removePersonButton.addListener(SWT.Selection, new Listener() {
-				public void handleEvent(Event event) {
-					IStructuredSelection selected = (IStructuredSelection) peopleViewer
-							.getSelection();
-					if (selected.isEmpty())
-						return;
-					Person person = (Person) selected.getFirstElement();
-					if (MessageDialog.openConfirm(shell, "Remove person",
-							"Remove " + person.getName() + "?"))
-						people.remove(person);
-				}
-			});
-
-			ObservableListContentProvider peopleContentProvider = new ObservableListContentProvider();
-			peopleViewer.setContentProvider(peopleContentProvider);
-			peopleViewer.setLabelProvider(new ObservableMapLabelProvider(
-					BeansObservables.observeMaps(peopleContentProvider
-							.getKnownElements(), Person.class, new String[] {
-							"name", "friends" })));
-			peopleViewer.setInput(people);
-
-			final IObservableValue selectedPerson = ViewersObservables
-					.observeSingleSelection(peopleViewer);
-
-			IObservableValue personSelected = new ComputedValue(Boolean.TYPE) {
-				protected Object calculate() {
-					return Boolean.valueOf(selectedPerson.getValue() != null);
-				}
-			};
-			dbc.bindValue(SWTObservables.observeEnabled(removePersonButton),
-					personSelected, null, null);
-			dbc.bindValue(SWTObservables.observeEnabled(friendsViewer
-					.getTable()), personSelected, null, null);
-
-			dbc.bindValue(SWTObservables.observeText(personName, SWT.Modify),
-					BeansObservables.observeDetailValue(Realm.getDefault(),
-							selectedPerson, "name", String.class), null, null);
-
-			ObservableListContentProvider friendsContentProvider = new ObservableListContentProvider();
-			friendsViewer.setContentProvider(friendsContentProvider);
-			friendsViewer.setLabelProvider(new ObservableMapLabelProvider(
-					BeansObservables.observeMap(friendsContentProvider
-							.getKnownElements(), Person.class, "name")));
-			friendsViewer.setInput(people);
-
-			dbc.bindSet(ViewersObservables.observeCheckedElements(
-					friendsViewer, Person.class), BeansObservables
-					.observeDetailSet(Realm.getDefault(), selectedPerson,
-							"friends", Person.class), null, null);
-		}
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet019TreeViewerWithListFactory.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet019TreeViewerWithListFactory.java
deleted file mode 100644
index a356793..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet019TreeViewerWithListFactory.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.ComputedValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-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.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-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.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-public class Snippet019TreeViewerWithListFactory {
-
-	private Button pasteButton;
-	private Button copyButton;
-	private Shell shell;
-	private Button addChildBeanButton;
-	private Button removeBeanButton;
-	private TreeViewer beanViewer;
-	private Tree tree;
-	private Text beanText;
-	private DataBindingContext m_bindingContext;
-
-	private Bean input = createBean("input");
-	private IObservableValue clipboard;
-
-	/**
-	 * Launch the application
-	 * 
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = Display.getDefault();
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				try {
-					Snippet019TreeViewerWithListFactory window = new Snippet019TreeViewerWithListFactory();
-					window.open();
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-			}
-		});
-	}
-
-	/**
-	 * Open the window
-	 */
-	public void open() {
-		final Display display = Display.getDefault();
-		createContents();
-		shell.open();
-		shell.layout();
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-	}
-
-	/**
-	 * Create contents of the window
-	 */
-	protected void createContents() {
-		shell = new Shell();
-		final GridLayout gridLayout_1 = new GridLayout();
-		gridLayout_1.numColumns = 2;
-		shell.setLayout(gridLayout_1);
-		shell.setSize(535, 397);
-		shell.setText("SWT Application");
-
-		final Composite group = new Composite(shell, SWT.NONE);
-		final RowLayout rowLayout = new RowLayout();
-		rowLayout.marginTop = 0;
-		rowLayout.marginRight = 0;
-		rowLayout.marginLeft = 0;
-		rowLayout.marginBottom = 0;
-		rowLayout.pack = false;
-		group.setLayout(rowLayout);
-		group
-				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false,
-						2, 1));
-
-		final Button addRootButton = new Button(group, SWT.NONE);
-		addRootButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(final SelectionEvent e) {
-				List list = input.getList();
-				Bean root = createBean("root");
-				list.add(root);
-				input.setList(list);
-
-				beanViewer.setSelection(new StructuredSelection(root));
-				beanText.selectAll();
-				beanText.setFocus();
-			}
-		});
-		addRootButton.setText("Add Root");
-
-		addChildBeanButton = new Button(group, SWT.NONE);
-		addChildBeanButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(final SelectionEvent e) {
-				Bean parent = getSelectedBean();
-				List list = new ArrayList(parent.getList());
-				Bean child = createBean("child");
-				list.add(child);
-				parent.setList(list);
-
-				beanViewer.setSelection(new StructuredSelection(child));
-				beanText.selectAll();
-				beanText.setFocus();
-			}
-		});
-		addChildBeanButton.setText("Add Child");
-
-		removeBeanButton = new Button(group, SWT.NONE);
-		removeBeanButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(final SelectionEvent e) {
-				TreeItem selectedItem = beanViewer.getTree().getSelection()[0];
-				TreeItem parentItem = selectedItem.getParentItem();
-				Bean parent;
-				int index;
-				if (parentItem == null) {
-					parent = input;
-					index = beanViewer.getTree().indexOf(selectedItem);
-				} else {
-					parent = (Bean) parentItem.getData();
-					index = parentItem.indexOf(selectedItem);
-				}
-
-				List list = new ArrayList(parent.getList());
-				list.remove(index);
-				parent.setList(list);
-			}
-		});
-		removeBeanButton.setText("Remove");
-
-		copyButton = new Button(group, SWT.NONE);
-		copyButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(final SelectionEvent e) {
-				clipboard.setValue(getSelectedBean());
-			}
-		});
-		copyButton.setText("Copy");
-
-		pasteButton = new Button(group, SWT.NONE);
-		pasteButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(final SelectionEvent e) {
-				Bean copy = (Bean) clipboard.getValue();
-				if (copy == null)
-					return;
-				Bean parent = getSelectedBean();
-				if (parent == null)
-					parent = input;
-
-				List list = new ArrayList(parent.getList());
-				list.add(copy);
-				parent.setList(list);
-
-				beanViewer.setSelection(new StructuredSelection(copy));
-				beanText.selectAll();
-				beanText.setFocus();
-			}
-		});
-		pasteButton.setText("Paste");
-
-		final Button refreshButton = new Button(group, SWT.NONE);
-		refreshButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(final SelectionEvent e) {
-				beanViewer.refresh();
-			}
-		});
-		refreshButton.setText("Refresh");
-
-		beanViewer = new TreeViewer(shell, SWT.FULL_SELECTION | SWT.BORDER);
-		beanViewer.setUseHashlookup(true);
-		tree = beanViewer.getTree();
-		tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
-
-		final Label itemNameLabel = new Label(shell, SWT.NONE);
-		itemNameLabel.setText("Item Name");
-
-		beanText = new Text(shell, SWT.BORDER);
-		final GridData gd_beanValue = new GridData(SWT.FILL, SWT.CENTER, true,
-				false);
-		beanText.setLayoutData(gd_beanValue);
-		m_bindingContext = initDataBindings();
-		//
-		initExtraBindings(m_bindingContext);
-	}
-
-	private static Bean createBean(String name) {
-		return new Bean(name);
-	}
-
-	protected DataBindingContext initDataBindings() {
-		IObservableValue treeViewerSelectionObserveSelection = ViewersObservables
-				.observeSingleSelection(beanViewer);
-		IObservableValue textTextObserveWidget = SWTObservables.observeText(
-				beanText, SWT.Modify);
-		IObservableValue treeViewerValueObserveDetailValue = BeansObservables
-				.observeDetailValue(Realm.getDefault(),
-						treeViewerSelectionObserveSelection, "text",
-						java.lang.String.class);
-		//
-		//
-		DataBindingContext bindingContext = new DataBindingContext();
-		//
-		bindingContext.bindValue(textTextObserveWidget,
-				treeViewerValueObserveDetailValue, null, null);
-		//
-		return bindingContext;
-	}
-
-	private Bean getSelectedBean() {
-		IStructuredSelection selection = (IStructuredSelection) beanViewer
-				.getSelection();
-		if (selection.isEmpty())
-			return null;
-		return (Bean) selection.getFirstElement();
-	}
-
-	private void initExtraBindings(DataBindingContext dbc) {
-		final IObservableValue beanViewerSelection = ViewersObservables
-				.observeSingleSelection(beanViewer);
-		IObservableValue beanSelected = new ComputedValue(Boolean.TYPE) {
-			protected Object calculate() {
-				return Boolean.valueOf(beanViewerSelection.getValue() != null);
-			}
-		};
-		dbc.bindValue(SWTObservables.observeEnabled(addChildBeanButton),
-				beanSelected, null, null);
-		dbc.bindValue(SWTObservables.observeEnabled(removeBeanButton),
-				beanSelected, null, null);
-
-		clipboard = new WritableValue();
-		dbc.bindValue(SWTObservables.observeEnabled(copyButton), beanSelected,
-				null, null);
-		dbc.bindValue(SWTObservables.observeEnabled(pasteButton),
-				new ComputedValue(Boolean.TYPE) {
-					protected Object calculate() {
-						return Boolean.valueOf(clipboard.getValue() != null);
-					}
-				}, null, null);
-
-		ObservableListTreeContentProvider contentProvider = new ObservableListTreeContentProvider(
-				BeansObservables.listFactory(Realm.getDefault(), "list",
-						Bean.class), null);
-		beanViewer.setContentProvider(contentProvider);
-		beanViewer.setLabelProvider(new ObservableMapLabelProvider(
-				BeansObservables.observeMap(contentProvider.getKnownElements(),
-						Bean.class, "text")));
-		beanViewer.setInput(input);
-	}
-
-	static class Bean {
-		/* package */PropertyChangeSupport changeSupport = new PropertyChangeSupport(
-				this);
-		private String text;
-		private List list;
-
-		public Bean(String text) {
-			this.text = text;
-			list = new ArrayList();
-		}
-
-		public void addPropertyChangeListener(PropertyChangeListener listener) {
-			changeSupport.addPropertyChangeListener(listener);
-		}
-
-		public void removePropertyChangeListener(PropertyChangeListener listener) {
-			changeSupport.removePropertyChangeListener(listener);
-		}
-
-		public String getText() {
-			return text;
-		}
-
-		public void setText(String value) {
-			changeSupport.firePropertyChange("text", this.text,
-					this.text = value);
-		}
-
-		public List getList() {
-			if (list == null)
-				return null;
-			return new ArrayList(list);
-		}
-
-		public void setList(List list) {
-			if (list != null)
-				list = new ArrayList(list);
-			changeSupport.firePropertyChange("list", this.list,
-					this.list = list);
-		}
-
-		public boolean hasListeners(String propertyName) {
-			return changeSupport.hasListeners(propertyName);
-		}
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet020TreeViewerWithSetFactory.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet020TreeViewerWithSetFactory.java
deleted file mode 100644
index 979412c..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet020TreeViewerWithSetFactory.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.ComputedValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.databinding.viewers.ObservableSetTreeContentProvider;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-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.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-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.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-public class Snippet020TreeViewerWithSetFactory {
-
-	private Button pasteButton;
-	private Button copyButton;
-	private Shell shell;
-	private Button addChildBeanButton;
-	private Button removeBeanButton;
-	private TreeViewer beanViewer;
-	private Tree tree;
-	private Text beanText;
-	private DataBindingContext m_bindingContext;
-
-	private Bean input = createBean("input");
-	private IObservableValue clipboard;
-	static int counter = 0;
-
-	/**
-	 * Launch the application
-	 * 
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = Display.getDefault();
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				try {
-					Snippet020TreeViewerWithSetFactory window = new Snippet020TreeViewerWithSetFactory();
-					window.open();
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-			}
-		});
-	}
-
-	/**
-	 * Open the window
-	 */
-	public void open() {
-		final Display display = Display.getDefault();
-		createContents();
-		shell.open();
-		shell.layout();
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-	}
-
-	/**
-	 * Create contents of the window
-	 */
-	protected void createContents() {
-		shell = new Shell();
-		final GridLayout gridLayout_1 = new GridLayout();
-		gridLayout_1.numColumns = 2;
-		shell.setLayout(gridLayout_1);
-		shell.setSize(535, 397);
-		shell.setText("SWT Application");
-
-		final Composite group = new Composite(shell, SWT.NONE);
-		final RowLayout rowLayout = new RowLayout();
-		rowLayout.marginTop = 0;
-		rowLayout.marginRight = 0;
-		rowLayout.marginLeft = 0;
-		rowLayout.marginBottom = 0;
-		rowLayout.pack = false;
-		group.setLayout(rowLayout);
-		group
-				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false,
-						2, 1));
-
-		final Button addRootButton = new Button(group, SWT.NONE);
-		addRootButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(final SelectionEvent e) {
-				Set set = input.getSet();
-				Bean root = createBean("root");
-				set.add(root);
-				input.setSet(set);
-
-				beanViewer.setSelection(new StructuredSelection(root));
-				beanText.selectAll();
-				beanText.setFocus();
-			}
-		});
-		addRootButton.setText("Add Root");
-
-		addChildBeanButton = new Button(group, SWT.NONE);
-		addChildBeanButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(final SelectionEvent e) {
-				Bean parent = getSelectedBean();
-				Set set = new HashSet(parent.getSet());
-				Bean child = createBean("child" + (counter++));
-				set.add(child);
-				parent.setSet(set);
-
-//				beanViewer.setSelection(new StructuredSelection(parent));
-//				beanText.selectAll();
-//				beanText.setFocus();
-			}
-		});
-		addChildBeanButton.setText("Add Child");
-
-		removeBeanButton = new Button(group, SWT.NONE);
-		removeBeanButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(final SelectionEvent e) {
-				TreeItem selectedItem = beanViewer.getTree().getSelection()[0];
-				Bean bean = (Bean) selectedItem.getData();
-				TreeItem parentItem = selectedItem.getParentItem();
-				Bean parent;
-				if (parentItem == null)
-					parent = input;
-				else
-					parent = (Bean) parentItem.getData();
-				
-				Set set = new HashSet(parent.getSet());
-				set.remove(bean);
-				parent.setSet(set);
-			}
-		});
-		removeBeanButton.setText("Remove");
-
-		copyButton = new Button(group, SWT.NONE);
-		copyButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(final SelectionEvent e) {
-				clipboard.setValue(getSelectedBean());
-			}
-		});
-		copyButton.setText("Copy");
-
-		pasteButton = new Button(group, SWT.NONE);
-		pasteButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(final SelectionEvent e) {
-				Bean copy = (Bean) clipboard.getValue();
-				if (copy == null)
-					return;
-				Bean parent = getSelectedBean();
-				if (parent == null)
-					parent = input;
-
-				Set set = new HashSet(parent.getSet());
-				set.add(copy);
-				parent.setSet(set);
-
-				beanViewer.setSelection(new StructuredSelection(copy));
-				beanText.selectAll();
-				beanText.setFocus();
-			}
-		});
-		pasteButton.setText("Paste");
-
-		final Button refreshButton = new Button(group, SWT.NONE);
-		refreshButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(final SelectionEvent e) {
-				beanViewer.refresh();
-			}
-		});
-		refreshButton.setText("Refresh");
-
-		beanViewer = new TreeViewer(shell, SWT.FULL_SELECTION | SWT.BORDER);
-		beanViewer.setUseHashlookup(true);
-		beanViewer.setComparator(new ViewerComparator());
-		tree = beanViewer.getTree();
-		tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
-
-		final Label itemNameLabel = new Label(shell, SWT.NONE);
-		itemNameLabel.setText("Item Name");
-
-		beanText = new Text(shell, SWT.BORDER);
-		final GridData gd_beanValue = new GridData(SWT.FILL, SWT.CENTER, true,
-				false);
-		beanText.setLayoutData(gd_beanValue);
-		m_bindingContext = initDataBindings();
-		//
-		initExtraBindings(m_bindingContext);
-	}
-
-	private static Bean createBean(String name) {
-		return new Bean(name);
-	}
-
-	protected DataBindingContext initDataBindings() {
-		IObservableValue treeViewerSelectionObserveSelection = ViewersObservables
-				.observeSingleSelection(beanViewer);
-		IObservableValue textTextObserveWidget = SWTObservables.observeText(
-				beanText, SWT.Modify);
-		IObservableValue treeViewerValueObserveDetailValue = BeansObservables
-				.observeDetailValue(Realm.getDefault(),
-						treeViewerSelectionObserveSelection, "text",
-						java.lang.String.class);
-		//
-		//
-		DataBindingContext bindingContext = new DataBindingContext();
-		//
-		bindingContext.bindValue(textTextObserveWidget,
-				treeViewerValueObserveDetailValue, null, null);
-		//
-		return bindingContext;
-	}
-
-	private Bean getSelectedBean() {
-		IStructuredSelection selection = (IStructuredSelection) beanViewer
-				.getSelection();
-		if (selection.isEmpty())
-			return null;
-		return (Bean) selection.getFirstElement();
-	}
-
-	private void initExtraBindings(DataBindingContext dbc) {
-		final IObservableValue beanViewerSelection = ViewersObservables
-				.observeSingleSelection(beanViewer);
-		IObservableValue beanSelected = new ComputedValue(Boolean.TYPE) {
-			protected Object calculate() {
-				return Boolean.valueOf(beanViewerSelection.getValue() != null);
-			}
-		};
-		dbc.bindValue(SWTObservables.observeEnabled(addChildBeanButton),
-				beanSelected, null, null);
-		dbc.bindValue(SWTObservables.observeEnabled(removeBeanButton),
-				beanSelected, null, null);
-
-		clipboard = new WritableValue();
-		dbc.bindValue(SWTObservables.observeEnabled(copyButton),
-				beanSelected, null, null);
-		dbc.bindValue(SWTObservables.observeEnabled(pasteButton), new ComputedValue(Boolean.TYPE) {
-			protected Object calculate() {
-				return Boolean.valueOf(clipboard.getValue() != null);
-			}
-		}, null, null);
-
-		ObservableSetTreeContentProvider contentProvider = new ObservableSetTreeContentProvider(
-				BeansObservables.setFactory(Realm.getDefault(), "set",
-						Bean.class), null);
-		beanViewer.setContentProvider(contentProvider);
-		beanViewer.setLabelProvider(new ObservableMapLabelProvider(
-				BeansObservables.observeMap(contentProvider.getKnownElements(),
-						Bean.class, "text")));
-		beanViewer.setInput(input);
-	}
-
-	static class Bean {
-		/* package */PropertyChangeSupport changeSupport = new PropertyChangeSupport(
-				this);
-		private String text;
-		private Set set;
-
-		public Bean(String text) {
-			this.text = text;
-			set = new HashSet();
-		}
-
-		public void addPropertyChangeListener(PropertyChangeListener listener) {
-			changeSupport.addPropertyChangeListener(listener);
-		}
-
-		public void removePropertyChangeListener(PropertyChangeListener listener) {
-			changeSupport.removePropertyChangeListener(listener);
-		}
-
-		public String getText() {
-			return text;
-		}
-
-		public void setText(String value) {
-			changeSupport.firePropertyChange("text", this.text, this.text = value);
-		}
-
-		public Set getSet() {
-			if (set == null)
-				return null;
-			return new HashSet(set);
-		}
-
-		public void setSet(Set set) {
-			if (set != null)
-				set = new HashSet(set);
-			changeSupport.firePropertyChange("set", this.set, this.set = set);
-		}
-
-		public boolean hasListeners(String propertyName) {
-			return changeSupport.hasListeners(propertyName);
-		}
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet021MultiFieldValidation.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet021MultiFieldValidation.java
deleted file mode 100644
index cd86b04..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet021MultiFieldValidation.java
+++ /dev/null
@@ -1,357 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 218269)
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.databinding.validation.MultiValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.wizard.WizardPageSupport;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardDialog;
-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.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @since 3.2
- * 
- */
-public class Snippet021MultiFieldValidation extends WizardPage {
-
-	private List list_1;
-	private List list;
-	private Button addAddendButton;
-	private Button removeAddendButton;
-	private Text sumModelValue;
-	private Text field2ModelValue;
-	private Text field1ModelValue;
-	private Text sumTarget;
-	private Text field2Target;
-	private Text field1Target;
-	private ListViewer addendsTarget;
-	private ListViewer addendsModelValue;
-
-	/**
-	 * Create the wizard
-	 */
-	public Snippet021MultiFieldValidation() {
-		super("snippet021");
-		setTitle("Snippet 021 - Multi-field Validators");
-		setDescription("Enter values which satisfy the cross-field constraints");
-	}
-
-	/**
-	 * Create contents of the wizard
-	 * 
-	 * @param parent
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		final GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 2;
-		container.setLayout(gridLayout);
-		//
-		setControl(container);
-
-		final Group bothEvenOrGroup = new Group(container, SWT.NONE);
-		bothEvenOrGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false,
-				false));
-		bothEvenOrGroup.setText("Numbers must be both even or both odd");
-		final GridLayout gridLayout_1 = new GridLayout();
-		gridLayout_1.numColumns = 3;
-		bothEvenOrGroup.setLayout(gridLayout_1);
-		new Label(bothEvenOrGroup, SWT.NONE);
-
-		final Label targetLabel = new Label(bothEvenOrGroup, SWT.NONE);
-		targetLabel.setText("Target");
-
-		final Label modelLabel = new Label(bothEvenOrGroup, SWT.NONE);
-		modelLabel.setText("Model");
-
-		final Label field1Label = new Label(bothEvenOrGroup, SWT.NONE);
-		field1Label.setText("Field 1");
-
-		field1Target = new Text(bothEvenOrGroup, SWT.BORDER);
-		final GridData gd_field1Target = new GridData(SWT.FILL, SWT.CENTER,
-				true, false);
-		field1Target.setLayoutData(gd_field1Target);
-
-		field1ModelValue = new Text(bothEvenOrGroup, SWT.READ_ONLY | SWT.BORDER);
-		final GridData gd_field1ModelValue = new GridData(SWT.FILL, SWT.CENTER,
-				true, false);
-		field1ModelValue.setLayoutData(gd_field1ModelValue);
-
-		final Label field2Label = new Label(bothEvenOrGroup, SWT.NONE);
-		field2Label.setText("Field 2");
-
-		field2Target = new Text(bothEvenOrGroup, SWT.BORDER);
-		final GridData gd_field2Target = new GridData(SWT.FILL, SWT.CENTER,
-				true, false);
-		field2Target.setLayoutData(gd_field2Target);
-
-		field2ModelValue = new Text(bothEvenOrGroup, SWT.READ_ONLY | SWT.BORDER);
-		final GridData gd_field2ModelValue = new GridData(SWT.FILL, SWT.CENTER,
-				true, false);
-		field2ModelValue.setLayoutData(gd_field2ModelValue);
-
-		final Group sumOfAllGroup = new Group(container, SWT.NONE);
-		sumOfAllGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false,
-				true));
-		sumOfAllGroup.setText("Addends must add up to sum");
-		final GridLayout gridLayout_2 = new GridLayout();
-		gridLayout_2.numColumns = 3;
-		sumOfAllGroup.setLayout(gridLayout_2);
-		new Label(sumOfAllGroup, SWT.NONE);
-
-		final Label targetLabel_1 = new Label(sumOfAllGroup, SWT.NONE);
-		targetLabel_1.setText("Target");
-
-		final Label modelLabel_1 = new Label(sumOfAllGroup, SWT.NONE);
-		modelLabel_1.setText("Model");
-
-		final Label expectedSumLabel = new Label(sumOfAllGroup, SWT.NONE);
-		expectedSumLabel.setText("Sum");
-
-		sumTarget = new Text(sumOfAllGroup, SWT.BORDER);
-		final GridData gd_sumTarget = new GridData(SWT.FILL, SWT.CENTER, true,
-				false);
-		sumTarget.setLayoutData(gd_sumTarget);
-
-		sumModelValue = new Text(sumOfAllGroup, SWT.READ_ONLY | SWT.BORDER);
-		final GridData gd_sumModelValue = new GridData(SWT.FILL, SWT.CENTER,
-				true, false);
-		sumModelValue.setLayoutData(gd_sumModelValue);
-
-		final Label addendsLabel = new Label(sumOfAllGroup, SWT.NONE);
-		addendsLabel.setText("Addends");
-
-		addendsTarget = new ListViewer(sumOfAllGroup, SWT.V_SCROLL | SWT.BORDER);
-		list_1 = addendsTarget.getList();
-		list_1
-				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1,
-						2));
-
-		addendsModelValue = new ListViewer(sumOfAllGroup, SWT.V_SCROLL
-				| SWT.BORDER);
-		list = addendsModelValue.getList();
-		list.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 2));
-
-		final Composite composite = new Composite(sumOfAllGroup, SWT.NONE);
-		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-		final GridLayout gridLayout_3 = new GridLayout();
-		gridLayout_3.marginWidth = 0;
-		gridLayout_3.marginHeight = 0;
-		composite.setLayout(gridLayout_3);
-
-		addAddendButton = new Button(composite, SWT.NONE);
-		addAddendButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
-				false));
-		addAddendButton.setText("Add");
-
-		removeAddendButton = new Button(composite, SWT.NONE);
-		removeAddendButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,
-				false, false));
-		removeAddendButton.setText("Remove");
-
-		bindUI();
-	}
-
-	private void bindUI() {
-		DataBindingContext dbc = new DataBindingContext();
-
-		bindEvensAndOddsGroup(dbc);
-		bindSumAndAddendsGroup(dbc);
-
-		WizardPageSupport.create(this, dbc);
-	}
-
-	private void bindEvensAndOddsGroup(DataBindingContext dbc) {
-		IObservableValue targetField1 = SWTObservables.observeText(
-				field1Target, SWT.Modify);
-		final IObservableValue middleField1 = new WritableValue(null,
-				Integer.TYPE);
-		dbc.bindValue(targetField1, middleField1, null, null);
-
-		IObservableValue targetField2 = SWTObservables.observeText(
-				field2Target, SWT.Modify);
-		final IObservableValue middleField2 = new WritableValue(null,
-				Integer.TYPE);
-		dbc.bindValue(targetField2, middleField2, null, null);
-
-		MultiValidator validator = new MultiValidator() {
-			protected IStatus validate() {
-				Integer field1 = (Integer) middleField1.getValue();
-				Integer field2 = (Integer) middleField2.getValue();
-				if (Math.abs(field1.intValue()) % 2 != Math.abs(field2
-						.intValue()) % 2)
-					return ValidationStatus
-							.error("Fields 1 and 2 must be both even or both odd");
-				return null;
-			}
-		};
-		dbc.addValidationStatusProvider(validator);
-
-		IObservableValue modelField1 = new WritableValue(new Integer(1),
-				Integer.TYPE);
-		IObservableValue modelField2 = new WritableValue(new Integer(4),
-				Integer.TYPE);
-		dbc.bindValue(validator.observeValidatedValue(middleField1),
-				modelField1, null, null);
-		dbc.bindValue(validator.observeValidatedValue(middleField2),
-				modelField2, null, null);
-
-		dbc.bindValue(SWTObservables.observeText(field1ModelValue, SWT.Modify),
-				modelField1, null, null);
-		dbc.bindValue(SWTObservables.observeText(field2ModelValue, SWT.Modify),
-				modelField2, null, null);
-	}
-
-	private void bindSumAndAddendsGroup(DataBindingContext dbc) {
-		IObservableValue targetSum = SWTObservables.observeText(sumTarget,
-				SWT.Modify);
-		final IObservableValue middleSum = new WritableValue(null, Integer.TYPE);
-		dbc.bindValue(targetSum, middleSum, null, null);
-
-		final IObservableList targetAddends = new WritableList(new ArrayList(),
-				Integer.TYPE);
-		addendsTarget.setContentProvider(new ObservableListContentProvider());
-		addendsTarget.setInput(targetAddends);
-
-		addAddendButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(final SelectionEvent e) {
-				InputDialog dialog = new InputDialog(getShell(),
-						"Input addend", "Enter an integer addend", "0",
-						new IInputValidator() {
-							public String isValid(String newText) {
-								try {
-									Integer.valueOf(newText);
-									return null;
-								} catch (NumberFormatException e) {
-									return "Enter a number between "
-											+ Integer.MIN_VALUE + " and "
-											+ Integer.MAX_VALUE;
-								}
-							}
-						});
-				if (dialog.open() == Window.OK) {
-					targetAddends.add(Integer.valueOf(dialog.getValue()));
-				}
-			}
-		});
-
-		removeAddendButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) addendsTarget
-						.getSelection();
-				if (!selection.isEmpty())
-					targetAddends.remove(selection.getFirstElement());
-			}
-		});
-
-		IObservableValue modelSum = new WritableValue(new Integer(5),
-				Integer.TYPE);
-		dbc.bindValue(SWTObservables.observeText(sumModelValue, SWT.Modify),
-				modelSum, null, null);
-
-		IObservableList modelAddends = new WritableList(new ArrayList(),
-				Integer.TYPE);
-
-		MultiValidator validator = new MultiValidator() {
-			protected IStatus validate() {
-				Integer sum = (Integer) middleSum.getValue();
-				int actualSum = 0;
-				for (Iterator iterator = targetAddends.iterator(); iterator
-						.hasNext();) {
-					actualSum += ((Integer) iterator.next()).intValue();
-				}
-				if (sum.intValue() != actualSum)
-					return ValidationStatus.error("Sum of addends is "
-							+ actualSum + ", expecting " + sum);
-				return ValidationStatus.ok();
-			}
-		};
-		dbc.addValidationStatusProvider(validator);
-
-		addendsModelValue
-				.setContentProvider(new ObservableListContentProvider());
-		addendsModelValue.setInput(modelAddends);
-
-		dbc.bindValue(validator.observeValidatedValue(middleSum), modelSum,
-				null, null);
-		dbc.bindList(validator.observeValidatedList(targetAddends),
-				modelAddends, null, null);
-	}
-
-	static class MultiFieldValidationWizard extends Wizard {
-		public void addPages() {
-			addPage(new Snippet021MultiFieldValidation());
-		}
-
-		public String getWindowTitle() {
-			return "Snippet 021 - Multi-field Validation";
-		}
-
-		public boolean performFinish() {
-			return true;
-		}
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				IWizard wizard = new MultiFieldValidationWizard();
-				WizardDialog dialog = new WizardDialog(null, wizard);
-				dialog.open();
-
-				// The SWT event loop
-				Display display = Display.getCurrent();
-				while (dialog.getShell() != null
-						&& !dialog.getShell().isDisposed()) {
-					if (!display.readAndDispatch()) {
-						display.sleep();
-					}
-				}
-			}
-		});
-
-		display.dispose();
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet022ComputedListCombo.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet022ComputedListCombo.java
deleted file mode 100644
index 08f6325..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet022ComputedListCombo.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.ComputedList;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.swt.SWT;
-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.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.2
- * 
- */
-public class Snippet022ComputedListCombo {
-	private static WritableList model;
-
-	public static void main(String[] args) {
-		Display display = new Display();
-		final Shell shell = new Shell(display);
-		shell.setLayout(new GridLayout(1, false));
-
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				Snippet022ComputedListCombo snippet = new Snippet022ComputedListCombo();
-				snippet.createModel();
-				snippet.createControls(shell);
-			}
-		});
-
-		shell.pack();
-		shell.open();
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-		display.dispose();
-	}
-
-	/**
-	 * 
-	 */
-	protected void createModel() {
-		model = new WritableList();
-		model.add(new Thing("Alice", true, false));
-		model.add(new Thing("Beth", true, false));
-		model.add(new Thing("Cathy", true, false));
-		model.add(new Thing("Arthur", false, true));
-		model.add(new Thing("Bob", false, true));
-		model.add(new Thing("Curtis", false, true));
-		model.add(new Thing("Snail", true, true));
-		model.add(new Thing("Nail", false, false));
-	}
-
-	/**
-	 * @param shell
-	 */
-	protected void createControls(Shell shell) {
-		Composite composite = new Composite(shell, SWT.NONE);
-		Group group = new Group(composite, SWT.NONE);
-		group.setText("Filter");
-		Button male = new Button(group, SWT.CHECK);
-		male.setText("Male");
-		Button female = new Button(group, SWT.CHECK);
-		female.setText("Female");
-		final IObservableValue femaleObservable = SWTObservables
-				.observeSelection(female);
-		final IObservableValue maleObservable = SWTObservables
-				.observeSelection(male);
-		Combo combo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
-		GridDataFactory.defaultsFor(combo).align(SWT.BEGINNING, SWT.BEGINNING)
-				.applyTo(combo);
-		ComboViewer viewer = new ComboViewer(combo);
-		viewer.setContentProvider(new ObservableListContentProvider());
-		// We should really have an out-of-the box filtered list...
-		IObservableList filteredList = new ComputedList() {
-			protected List calculate() {
-				ArrayList result = new ArrayList();
-				for (Iterator it = model.iterator(); it.hasNext();) {
-					Thing thing = (Thing) it.next();
-					if (((Boolean) femaleObservable.getValue()).booleanValue()
-							&& !thing.female)
-						continue;
-					if (((Boolean) maleObservable.getValue()).booleanValue()
-							&& !thing.male)
-						continue;
-					result.add(thing);
-				}
-				return result;
-			}
-		};
-		viewer.setInput(filteredList);
-		GridLayoutFactory.swtDefaults().applyTo(group);
-		GridLayoutFactory.swtDefaults().applyTo(composite);
-	}
-
-	static class Thing {
-		String name;
-		boolean male;
-		boolean female;
-
-		public Thing(String name, boolean female, boolean male) {
-			this.name = name;
-			this.female = female;
-			this.male = male;
-		}
-
-		public String toString() {
-			return name;
-		}
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet023ConditionalVisibility.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet023ConditionalVisibility.java
deleted file mode 100644
index 3b3f77d..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet023ConditionalVisibility.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.databinding.swt.ISWTObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.provisional.swt.ControlUpdater;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StackLayout;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @since 3.2
- * 
- */
-public class Snippet023ConditionalVisibility {
-	public static void main(String[] args) {
-		Display display = new Display();
-		final Shell shell = new Shell(display);
-		shell.setLayout(new GridLayout(1, false));
-
-		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
-			public void run() {
-				new Snippet023ConditionalVisibility().createControls(shell);
-			}
-		});
-
-		shell.pack();
-		shell.open();
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-		display.dispose();
-	}
-
-	Text text;
-	Text toText;
-	Text fromText;
-
-	/**
-	 * @param shell
-	 */
-	private void createControls(Shell shell) {
-		Composite composite = new Composite(shell, SWT.NONE);
-		Group radioGroup = new Group(composite, SWT.NONE);
-		radioGroup.setText("Type");
-		Button textButton = new Button(radioGroup, SWT.RADIO);
-		textButton.setText("Text");
-		Button rangeButton = new Button(radioGroup, SWT.RADIO);
-		rangeButton.setText("Range");
-		GridLayoutFactory.swtDefaults().generateLayout(radioGroup);
-
-		final Composite oneOfTwo = new Composite(composite, SWT.NONE);
-		final StackLayout stackLayout = new StackLayout();
-		oneOfTwo.setLayout(stackLayout);
-
-		final Group rangeGroup = new Group(oneOfTwo, SWT.NONE);
-		rangeGroup.setText("Range");
-		Label fromLabel = new Label(rangeGroup, SWT.NONE);
-		fromLabel.setText("From:");
-		fromText = new Text(rangeGroup, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
-
-		Label toLabel = new Label(rangeGroup, SWT.NONE);
-		toLabel.setText("To:");
-		toText = new Text(rangeGroup, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
-		GridLayoutFactory.swtDefaults().numColumns(2)
-				.generateLayout(rangeGroup);
-
-		final Group textGroup = new Group(oneOfTwo, SWT.NONE);
-		textGroup.setText("Text");
-		Label label = new Label(textGroup, SWT.NONE);
-		label.setText("Text:");
-		text = new Text(textGroup, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
-		GridLayoutFactory.swtDefaults().numColumns(2).generateLayout(textGroup);
-
-		GridLayoutFactory.swtDefaults().numColumns(2).generateLayout(composite);
-
-		final ISWTObservableValue rangeSelected = SWTObservables
-				.observeSelection(rangeButton);
-		final ISWTObservableValue textSelected = SWTObservables
-				.observeSelection(textButton);
-
-		// Note that ControlUpdater is not API.
-		new ControlUpdater(oneOfTwo) {
-			protected void updateControl() {
-				if (((Boolean) rangeSelected.getValue()).booleanValue()) {
-					stackLayout.topControl = rangeGroup;
-					oneOfTwo.layout();
-				} else if (((Boolean) textSelected.getValue()).booleanValue()) {
-					stackLayout.topControl = textGroup;
-					oneOfTwo.layout();
-				}
-			}
-		};
-	}
-}
diff --git a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet0xffffffff.java b/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet0xffffffff.java
deleted file mode 100644
index 8b44163..0000000
--- a/examples/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet0xffffffff.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 The Pampered Chef, Inc. and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     The Pampered Chef, Inc. - initial API and implementation
- *     Brad Reynolds - bug 116920
- ******************************************************************************/
-
-package org.eclipse.jface.examples.databinding.snippets;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Snippet -1.
- * 
- * Hello, no databinding. Bind changes in a GUI to a Model object but don't
- * worry about propogating changes from the Model to the GUI -- using *manual*
- * code. (0xffffffff is -1 in 32-bit two's complement binary arithmatic)
- */
-public class Snippet0xffffffff {
-	public static void main(String[] args) {
-		ViewModel viewModel = new ViewModel();
-		Shell shell = new View(viewModel).createShell();
-
-		// The SWT event loop
-		Display display = Display.getCurrent();
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch()) {
-				display.sleep();
-			}
-		}
-
-		// Print the results
-		System.out.println("person.getName() = "
-				+ viewModel.getPerson().getName());
-	}
-
-	// Minimal JavaBeans support
-	public static abstract class AbstractModelObject {
-		private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(
-				this);
-
-		public void addPropertyChangeListener(PropertyChangeListener listener) {
-			propertyChangeSupport.addPropertyChangeListener(listener);
-		}
-
-		public void addPropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			propertyChangeSupport.addPropertyChangeListener(propertyName,
-					listener);
-		}
-
-		public void removePropertyChangeListener(PropertyChangeListener listener) {
-			propertyChangeSupport.removePropertyChangeListener(listener);
-		}
-
-		public void removePropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			propertyChangeSupport.removePropertyChangeListener(propertyName,
-					listener);
-		}
-
-		protected void firePropertyChange(String propertyName, Object oldValue,
-				Object newValue) {
-			propertyChangeSupport.firePropertyChange(propertyName, oldValue,
-					newValue);
-		}
-	}
-
-	// The data model class. This is normally a persistent class of some sort.
-	// 
-	// In this example, we only push changes from the GUI to the model, so we
-	// don't worry about implementing JavaBeans bound properties. If we need
-	// our GUI to automatically reflect changes in the Person object, the
-	// Person object would need to implement the JavaBeans property change
-	// listener methods.
-	static class Person extends AbstractModelObject {
-		// A property...
-		String name = "John Smith";
-
-		public String getName() {
-			return name;
-		}
-
-		public void setName(String name) {
-			this.name = name;
-		}
-
-	}
-
-	// The View's model--the root of our Model graph for this particular GUI.
-	//
-	// Typically each View class has a corresponding ViewModel class.
-	//
-	// The ViewModel is responsible for getting the objects to edit from the
-	// data access tier. Since this snippet doesn't have any persistent objects
-	// to
-	// retrieve, this ViewModel just instantiates a model object to edit.
-	static class ViewModel {
-		// The model to bind
-		private Person person = new Person();
-
-		public Person getPerson() {
-			return person;
-		}
-	}
-
-	// The GUI view
-	static class View {
-		private ViewModel viewModel;
-
-		public View(ViewModel viewModel) {
-			this.viewModel = viewModel;
-		}
-
-		public Shell createShell() {
-			// Build a UI
-			final Display display = Display.getCurrent();
-			Shell shell = new Shell(display);
-			shell.setLayout(new RowLayout(SWT.VERTICAL));
-
-			final Text name = new Text(shell, SWT.BORDER);
-			
-			// Bind it (manually)
-			name.setText(viewModel.getPerson().getName());
-			name.addModifyListener(new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					final String text = name.getText();
-					// validation
-					// conversion
-					viewModel.getPerson().setName(text);
-				}
-			});
-			viewModel.person.addPropertyChangeListener("name",
-					new PropertyChangeListener() {
-						public void propertyChange(PropertyChangeEvent evt) {
-							display.asyncExec(new Runnable() {
-								public void run() {
-									final String newName = viewModel.person.getName();
-									// conversion
-									name.setText(newName);
-								}
-							});
-						}
-					});
-
-			// Open and return the Shell
-			shell.pack();
-			shell.open();
-			return shell;
-		}
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/.classpath b/examples/org.eclipse.jface.snippets/.classpath
deleted file mode 100644
index e60736f..0000000
--- a/examples/org.eclipse.jface.snippets/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="Eclipse JFace Snippets"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/examples/org.eclipse.jface.snippets/.project b/examples/org.eclipse.jface.snippets/.project
deleted file mode 100644
index 5d39725..0000000
--- a/examples/org.eclipse.jface.snippets/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jface.snippets</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/examples/org.eclipse.jface.snippets/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.jface.snippets/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 6c26f15..0000000
--- a/examples/org.eclipse.jface.snippets/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,12 +0,0 @@
-#Mon Oct 16 20:55:38 GMT 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/Snippet012DialogWithImageButtons.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/Snippet012DialogWithImageButtons.java
deleted file mode 100644
index a36c31d..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/Snippet012DialogWithImageButtons.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.snippets.dialogs;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A snippet to demonstrate a dialog with image buttons.
- *
- */
-public class Snippet012DialogWithImageButtons {
-	private ImageRegistry registry;
-	
-	public Snippet012DialogWithImageButtons(final Shell shell) {
-		
-		Dialog dia = new Dialog(shell) {
-			private ImageDescriptor getImageDescriptor(String path) {
-				if( registry == null ) {
-					registry = new ImageRegistry(shell.getDisplay());
-				}
-				
-				ImageDescriptor desc = registry.getDescriptor(path);
-				if( desc == null ) {
-					desc = ImageDescriptor.createFromFile(Snippet012DialogWithImageButtons.class, path);
-					registry.put(path, desc);
-				}
-				
-				return desc;
-			}
-			
-			protected Button createButton(Composite parent, int id, String label, boolean defaultButton) {
-				Button b = super.createButton(parent, id, label, defaultButton);
-				if( id == IDialogConstants.OK_ID ) {
-					b.setImage(getImageDescriptor("filesave.png").createImage()); //$NON-NLS-1$
-					// reset the button layout
-					setButtonLayoutData(b);
-				} else {
-					b.setImage(getImageDescriptor("cancel.png").createImage()); //$NON-NLS-1$
-					// reset the button layout
-					setButtonLayoutData(b);
-					return b;
-				}
-				
-				return b;
-			}
-		};
-		dia.open();
-	}
-	
-	public static void main(String[] args) {
-		
-		Display display = new Display ();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		
-		shell.open ();
-		
-		new Snippet012DialogWithImageButtons(shell);
-		
-		while (!shell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-		
-		display.dispose ();
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/Snippet058VistaProgressBars.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/Snippet058VistaProgressBars.java
deleted file mode 100644
index e6eb0d6..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/Snippet058VistaProgressBars.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.snippets.dialogs;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IProgressMonitorWithBlocking;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.swt.widgets.Display;
-
-public class Snippet058VistaProgressBars {
-
-	/**
-	 * Open a progress monitor dialog and switch the blocking.
-	 * 
-	 * @param args
-	 */
-	public static void main(String[] args) {
-
-		Display display = new Display();
-
-		final ProgressMonitorDialog dialog = new ProgressMonitorDialog(null);
-
-		try {
-			dialog.run(true, true, new IRunnableWithProgress() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
-				 */
-				public void run(IProgressMonitor monitor)
-						throws InvocationTargetException, InterruptedException {
-
-					IProgressMonitorWithBlocking blocking = (IProgressMonitorWithBlocking) monitor;
-
-					blocking.beginTask("Vista Coolness", 100);
-					for (int i = 0; i < 10; i++) {
-						blocking.setBlocked(new Status(IStatus.WARNING,
-								"Blocked", "This is blocked on Vista"));
-						blocking.worked(5);
-						spin(dialog.getShell().getDisplay());
-						blocking.clearBlocked();
-						blocking.worked(5);
-						spin(dialog.getShell().getDisplay());
-						if (monitor.isCanceled())
-							return;
-					}
-					blocking.done();
-				}
-			});
-		} catch (InvocationTargetException e) {
-			e.printStackTrace();
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-
-		display.dispose();
-	}
-
-	private static void spin(final Display display) {
-		display.syncExec(new Runnable() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see java.lang.Runnable#run()
-			 */
-			public void run() {
-				long endTime = System.currentTimeMillis() + 1000;
-
-				while (System.currentTimeMillis() < endTime)
-					display.readAndDispatch();
-
-			}
-		});
-
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/Snippet059VistaProgressIndicator.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/Snippet059VistaProgressIndicator.java
deleted file mode 100644
index cfaa030..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/Snippet059VistaProgressIndicator.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.snippets.dialogs;
-
-import org.eclipse.jface.dialogs.ProgressIndicator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A snippet to demonstrate the progress indicator on Vista showing paused and
- * errors
- * 
- */
-public class Snippet059VistaProgressIndicator {
-
-	public static void main(String[] args) {
-
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new GridLayout());
-		shell.setSize(300, 100);
-
-		ProgressIndicator indicator = new ProgressIndicator(shell,
-				SWT.HORIZONTAL);
-		indicator.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
-		indicator.setBackground(shell.getDisplay().getSystemColor(
-				SWT.COLOR_CYAN));
-
-		shell.open();
-
-		indicator.beginTask(200);
-		indicator.showNormal();
-		indicator.worked(50);
-		spin(display);
-		indicator.showPaused();
-		indicator.worked(50);
-		spin(display);
-		indicator.showError();
-		indicator.worked(50);
-		spin(display);
-		
-		indicator.done();
-
-		display.dispose();
-
-	}
-
-	private static void spin(Display display) {
-		long endTime = System.currentTimeMillis() + 1000;
-		while(System.currentTimeMillis() < endTime)
-			display.readAndDispatch();
-		
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/Snippet060DialogWithURLImageButtons.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/Snippet060DialogWithURLImageButtons.java
deleted file mode 100644
index b4eb013..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/Snippet060DialogWithURLImageButtons.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.snippets.dialogs;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A snippet to demonstrate a dialog with image buttons.
- * 
- */
-public class Snippet060DialogWithURLImageButtons {
-	private ImageRegistry registry;
-
-	public Snippet060DialogWithURLImageButtons(final Shell shell) {
-
-		Dialog dia = new Dialog(shell) {
-			private ImageDescriptor getImageDescriptor(String path) {
-				if (registry == null) {
-					registry = new ImageRegistry(shell.getDisplay());
-				}
-
-				ImageDescriptor desc = registry.getDescriptor(path);
-				if (desc == null) {
-
-					desc = ImageDescriptor
-							.createFromURL(Snippet060DialogWithURLImageButtons.class
-									.getResource(path));
-					registry.put(path, desc);
-				}
-
-				return desc;
-			}
-
-			protected Button createButton(Composite parent, int id,
-					String label, boolean defaultButton) {
-				Button b = super.createButton(parent, id, label, defaultButton);
-				if (id == IDialogConstants.OK_ID) {
-
-					URL url;
-					try {
-						url = new URL(
-								"http://www.eclipse.org/home/images/enterprise.gif");
-						b.setImage(ImageDescriptor.createFromURL(url)
-								.createImage()); //$NON-NLS-1$
-					} catch (MalformedURLException e) {
-						e.printStackTrace();
-					}
-
-					// reset the button layout
-					setButtonLayoutData(b);
-				} else {
-					b.setImage(getImageDescriptor("cancel.png").createImage()); //$NON-NLS-1$
-					// reset the button layout
-					setButtonLayoutData(b);
-					return b;
-				}
-
-				return b;
-			}
-		};
-		dia.open();
-	}
-
-	public static void main(String[] args) {
-
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-
-		shell.open();
-
-		new Snippet060DialogWithURLImageButtons(shell);
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/cancel.png b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/cancel.png
deleted file mode 100644
index 1cabc6e..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/cancel.png
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/filesave.png b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/filesave.png
deleted file mode 100644
index 41b3f43..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/dialogs/filesave.png
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/layout/Snippet013GridLayoutFactory.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/layout/Snippet013GridLayoutFactory.java
deleted file mode 100644
index 1418107..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/layout/Snippet013GridLayoutFactory.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jface.snippets.layout;
-
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.layout.LayoutConstants;
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @since 3.3
- */
-public class Snippet013GridLayoutFactory {
-
-	public static Shell createShell1() {
-		Shell shell = new Shell(Display.getCurrent(), SWT.SHELL_TRIM);
-		{ // Populate the shell
-			Label text = new Label(shell, SWT.WRAP);
-			text
-					.setText("This is a layout test. This text should wrap in the test. You could call it a text test.");
-			GridDataFactory.generate(text, 2, 1);
-
-			List theList = new List(shell, SWT.H_SCROLL | SWT.V_SCROLL
-					| SWT.BORDER);
-
-			theList.add("Hello");
-			theList.add("World");
-			GridDataFactory.defaultsFor(theList).hint(300, 300)
-					.applyTo(theList);
-
-			Composite buttonBar = new Composite(shell, SWT.NONE);
-			{ // Populate buttonBar
-				Button add = new Button(buttonBar, SWT.PUSH);
-				add.setText("Add");
-				Button remove = new Button(buttonBar, SWT.PUSH);
-				remove.setText("Remove");
-			}
-			GridLayoutFactory.fillDefaults().generateLayout(buttonBar);
-		}
-		GridLayoutFactory.fillDefaults().numColumns(2).margins(
-				LayoutConstants.getMargins()).generateLayout(shell);
-
-		return shell;
-	}
-
-	public static Shell createShell3() {
-		Shell shell = new Shell(Display.getCurrent(), SWT.SHELL_TRIM);
-		{ // Populate the shell
-
-			Text text = new Text(shell, SWT.WRAP | SWT.BORDER);
-			text
-					.setText("This shell has asymmetric margins. The left, right, top, and bottom margins should be 0, 10, 40, and 80 pixels respectively");
-
-			Rectangle margins = Geometry.createDiffRectangle(0, 10, 40, 80);
-
-			GridLayoutFactory.fillDefaults().extendedMargins(margins)
-					.generateLayout(shell);
-
-		}
-
-		return shell;
-	}
-
-	public static Shell createShell2() {
-		Shell shell = new Shell(Display.getCurrent(), SWT.SHELL_TRIM);
-		{ // Populate the shell
-
-			Label text = new Label(shell, SWT.NONE);
-			text.setText("Name:");
-			new Text(shell, SWT.BORDER);
-
-			Label quest = new Label(shell, SWT.NONE);
-			quest.setText("Quest:");
-			CCombo combo = new CCombo(shell, SWT.BORDER);
-			combo.add("I seek the holy grail");
-			combo.add("What? I don't know that");
-			combo.add("All your base are belong to us");
-
-			Label colour = new Label(shell, SWT.NONE);
-			colour.setText("Color:");
-			new Text(shell, SWT.BORDER);
-
-			Composite buttonBar = new Composite(shell, SWT.NONE);
-			{ // Populate buttonBar
-				Button add = new Button(buttonBar, SWT.PUSH);
-				add.setText("Okay");
-				Button remove = new Button(buttonBar, SWT.PUSH);
-				remove.setText("Cancel");
-
-				GridLayoutFactory.fillDefaults().numColumns(2).generateLayout(
-						buttonBar);
-			}
-			GridDataFactory.fillDefaults().span(2, 1).align(SWT.RIGHT,
-					SWT.BOTTOM).applyTo(buttonBar);
-
-			GridLayoutFactory.fillDefaults().numColumns(2).margins(
-					LayoutConstants.getMargins()).generateLayout(shell);
-		}
-
-		return shell;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = createShell1();
-		shell.pack();
-		shell.open();
-
-		Shell shell2 = createShell2();
-		shell2.pack();
-		shell2.open();
-
-		Shell shell3 = createShell3();
-		shell3.pack();
-		shell3.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/layout/Snippet016TableLayout.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/layout/Snippet016TableLayout.java
deleted file mode 100755
index a03aa05..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/layout/Snippet016TableLayout.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.layout;
-
-
-import org.eclipse.jface.layout.TableColumnLayout;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * A simple TableViewer to demonstrate usage
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * @since 3.3M3
- */
-public class Snippet016TableLayout {
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	private class MyLabelProvider extends LabelProvider implements
-			ITableLabelProvider {
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return columnIndex + " - " + element;
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public Snippet016TableLayout(Composite comp) {
-		final TableViewer v = new TableViewer(new Table(comp, SWT.BORDER));
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.getTable().setHeaderVisible(true);
-
-		TableColumnLayout ad = new TableColumnLayout();
-		comp.setLayout(ad);
-		
-		TableColumn column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setText("Column 1");
-		column.setMoveable(true);
-		ad.setColumnData(column, new ColumnWeightData(90, 290));
-
-		column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setText("Column 2");
-		column.setMoveable(true);
-		ad.setColumnData(column, new ColumnWeightData(10, 200));
-
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-
-		for (int i = 0; i < 10; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		//shell.setSize(400, 150);
-		shell.setLayout(new FillLayout());
-		
-		new Snippet016TableLayout(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/layout/Snippet027TreeLayout.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/layout/Snippet027TreeLayout.java
deleted file mode 100644
index 3b0558d..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/layout/Snippet027TreeLayout.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.layout;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.layout.TableColumnLayout;
-import org.eclipse.jface.layout.TreeColumnLayout;
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ITableColorProvider;
-import org.eclipse.jface.viewers.ITableFontProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TreeColumn;
-
-/**
- * A simple TreeViewer to demonstrate usage
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet027TreeLayout {
-	private class MyContentProvider implements ITreeContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return ((MyModel) inputElement).child.toArray();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			return getElements(parentElement);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			if (element == null) {
-				return null;
-			}
-
-			return ((MyModel) element).parent;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-			return ((MyModel) element).child.size() > 0;
-		}
-
-	}
-
-	public class MyModel {
-		public MyModel parent;
-
-		public ArrayList child = new ArrayList();
-
-		public int counter;
-
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if (parent != null) {
-				rv = parent.toString() + ".";
-			}
-
-			rv += counter;
-
-			return rv;
-		}
-	}
-
-	public class MyLabelProvider extends LabelProvider implements
-			ITableLabelProvider, ITableFontProvider, ITableColorProvider {
-		FontRegistry registry = new FontRegistry();
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return "Column " + columnIndex + " => " + element.toString();
-		}
-
-		public Font getFont(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 0) {
-				return registry.getBold(Display.getCurrent().getSystemFont()
-						.getFontData()[0].getName());
-			}
-			return null;
-		}
-
-		public Color getBackground(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 0) {
-				return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
-			}
-			return null;
-		}
-
-		public Color getForeground(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 1) {
-				return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
-			}
-			return null;
-		}
-
-	}
-
-	public Snippet027TreeLayout(Shell shell) {
-		final TreeViewer v = new TreeViewer(shell);
-		v.getTree().setHeaderVisible(true);
-		v.getTree().setLinesVisible(true);
-		
-		TreeColumnLayout ad = new TreeColumnLayout();
-		shell.setLayout(ad);
-		
-		TreeColumn column = new TreeColumn(v.getTree(),SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 1");
-		ad.setColumnData(column, new ColumnWeightData(50, 100));
-		
-		column = new TreeColumn(v.getTree(),SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 2");
-		ad.setColumnData(column,new ColumnWeightData(50, 100));
-		
-
-		
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setInput(createModel());
-	}
-
-	private MyModel createModel() {
-
-		MyModel root = new MyModel(0, null);
-		root.counter = 0;
-
-		MyModel tmp;
-		for (int i = 1; i < 10; i++) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for (int j = 1; j < i; j++) {
-				tmp.child.add(new MyModel(j, tmp));
-			}
-		}
-
-		return root;
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet027TreeLayout(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/resources/Snippet057FileImageDescriptors.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/resources/Snippet057FileImageDescriptors.java
deleted file mode 100644
index 7446028..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/resources/Snippet057FileImageDescriptors.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.snippets.resources;
-
-import java.io.IOException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A snippet to demonstrate a dialog with image buttons.
- * 
- */
-public class Snippet057FileImageDescriptors {
-	private ImageRegistry registry;
-
-	public Snippet057FileImageDescriptors(final Shell shell) {
-
-		Dialog dia = new Dialog(shell) {
-			private ImageDescriptor getImageDescriptorFromClass(String path) {
-				if (registry == null) {
-					registry = new ImageRegistry(shell.getDisplay());
-				}
-
-				ImageDescriptor desc = registry.getDescriptor(path);
-				if (desc == null) {
-					desc = ImageDescriptor.createFromFile(
-							Snippet057FileImageDescriptors.class, path);
-					registry.put(path, desc);
-				}
-
-				return desc;
-			}
-
-			private ImageDescriptor getImageDescriptorFromFile(String path) {
-				if (registry == null) {
-					registry = new ImageRegistry(shell.getDisplay());
-				}
-
-				ImageDescriptor desc = registry.getDescriptor(path);
-				if (desc == null) {
-					URL classPath = Snippet057FileImageDescriptors.class
-							.getResource(path);
-					Class bogus = null;
-					desc = ImageDescriptor.createFromFile(bogus, classPath
-							.getFile());
-
-					registry.put(path, desc);
-				}
-
-				return desc;
-			}
-
-			protected Button createButton(Composite parent, int id,
-					String label, boolean defaultButton) {
-				Button b = super.createButton(parent, id, label, defaultButton);
-				if (id == IDialogConstants.OK_ID) {
-					b
-							.setImage(getImageDescriptorFromClass(
-									"filesave.png").createImage()); //$NON-NLS-1$
-					// reset the button layout
-					setButtonLayoutData(b);
-				} else {
-					b
-							.setImage(getImageDescriptorFromFile("cancel.png").createImage()); //$NON-NLS-1$
-					// reset the button layout
-					setButtonLayoutData(b);
-					return b;
-				}
-
-				return b;
-			}
-		};
-		dia.open();
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-
-		shell.open();
-
-		new Snippet057FileImageDescriptors(shell);
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/resources/cancel.png b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/resources/cancel.png
deleted file mode 100644
index 1cabc6e..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/resources/cancel.png
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/resources/filesave.png b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/resources/filesave.png
deleted file mode 100644
index 41b3f43..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/resources/filesave.png
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/AbstractCellCursor.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/AbstractCellCursor.java
deleted file mode 100644
index 343a626..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/AbstractCellCursor.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * @since 3.3
- *
- */
-public abstract class AbstractCellCursor extends Canvas {
-	private ViewerCell[] cells = new ViewerCell[0];
-	
-	private ColumnViewer viewer;
-	
-	private int activationTime = 0;
-	
-	private boolean inFocusRequest = false;
-	
-	/**
-	 * @param viewer
-	 * @param style
-	 */
-	public AbstractCellCursor(ColumnViewer viewer, int style) {
-		super((Composite) viewer.getControl(),style);
-		this.viewer = viewer;
-		
-		Listener l = new Listener() {
-
-			public void handleEvent(Event event) {
-				switch (event.type) {
-				case SWT.Paint:
-					paint(event);
-					break;
-				case SWT.KeyDown:
-					getParent().notifyListeners(SWT.KeyDown, event);
-					ArrayList list = new ArrayList();
-					for( int i = 0; i < cells.length; i++ ) {
-						list.add(cells[i].getElement());
-					}
-					AbstractCellCursor.this.viewer.setSelection(new StructuredSelection(list));
-					
-					break;
-				case SWT.MouseDown:
-					if( event.time < activationTime ) {
-						Event cEvent = copyEvent(event);
-						cEvent.type = SWT.MouseDoubleClick;
-						getParent().notifyListeners(SWT.MouseDoubleClick, cEvent);
-					} else {
-						getParent().notifyListeners(SWT.MouseDown, copyEvent(event));
-					}
-					break;
-				case SWT.MouseDoubleClick:
-					getParent().notifyListeners(SWT.MouseDoubleClick, copyEvent(event));
-					break;
-				case SWT.FocusIn:
-					if( isVisible() ) {
-						inFocusRequest = true;
-						if( ! inFocusRequest ) {
-							forceFocus();
-						}
-						inFocusRequest = false;
-					}
-				default:
-					break;
-				}
-			}
-		};
-		
-		addListener(SWT.Paint, l);
-		addListener(SWT.KeyDown, l);
-		addListener(SWT.MouseDown, l);
-		addListener(SWT.MouseDoubleClick, l);
-		getParent().addListener(SWT.FocusIn,l);
-	}
-	
-	/**
-	 * @param cell
-	 * @param eventTime 
-	 */
-	public void setSelection(ViewerCell cell, int eventTime) {
-		this.cells = new ViewerCell[] { cell };
-		setBounds(cell.getBounds());
-		forceFocus();
-		redraw();
-		activationTime = eventTime + getDisplay().getDoubleClickTime();
-	}
-	
-	/**
-	 * @return the cells who should be highlighted
-	 */
-	protected ViewerCell[] getSelectedCells() {
-		return cells;
-	}
-	
-	private Event copyEvent(Event event) {
-		Event cEvent = new Event();
-		cEvent.button = event.button;
-		cEvent.character = event.character;
-		cEvent.count = event.count;
-		cEvent.data = event.data;
-		cEvent.detail = event.detail;
-		cEvent.display = event.display;
-		cEvent.doit = event.doit;
-		cEvent.end = event.end;
-		cEvent.gc = event.gc;
-		cEvent.height = event.height;
-		cEvent.index = event.index;
-		cEvent.item = getSelectedCells()[0].getControl();
-		cEvent.keyCode = event.keyCode;
-		cEvent.start = event.start;
-		cEvent.stateMask = event.stateMask;
-		cEvent.text = event.text;
-		cEvent.time = event.time;
-		cEvent.type = event.type;
-		cEvent.widget = event.widget;
-		cEvent.width = event.width;
-		Point p = viewer.getControl().toControl(toDisplay(event.x, event.y));
-		cEvent.x = p.x;
-		cEvent.y = p.y;
-		
-		return cEvent;
-	}
-	
-	/**
-	 * @param event
-	 */
-	protected abstract void paint(Event event);
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/BooleanCellEditor.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/BooleanCellEditor.java
deleted file mode 100644
index 0e8be19..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/BooleanCellEditor.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.ColumnViewerEditorDeactivationEvent;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.viewers.ViewerRow;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * @since 3.4
- *
- */
-public class BooleanCellEditor extends CellEditor {
-	private Button button;
-	private ViewerRow row;
-	private int index;
-	private String restoredText;
-	private Image restoredImage;
-
-	/**
-	 * @param parent
-	 */
-	public BooleanCellEditor(Composite parent) {
-		super(parent);
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public BooleanCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	public LayoutData getLayoutData() {
-		LayoutData data = super.getLayoutData();
-		data.horizontalAlignment=SWT.CENTER;
-		data.grabHorizontal = false;
-		return data;
-	}
-
-	protected Control createControl(Composite parent) {
-		Font font = parent.getFont();
-		Color bg = parent.getBackground();
-
-		button = new Button(parent, getStyle() | SWT.CHECK);
-		button.setFont(font);
-		button.setBackground(bg);
-
-		button.addKeyListener(new KeyAdapter() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.swt.events.KeyAdapter#keyReleased(org.eclipse.swt.events.KeyEvent)
-			 */
-			public void keyReleased(KeyEvent e) {
-				if( e.character == SWT.ESC ) {
-					fireCancelEditor();
-				}
-			}
-
-		});
-
-		return button;
-	}
-
-	protected Object doGetValue() {
-		return new Boolean(button.getSelection());
-	}
-
-	protected void doSetValue(Object value) {
-		boolean selection = Boolean.TRUE.equals(value);
-		button.setSelection(selection);
-	}
-
-	protected void doSetFocus() {
-		if (button != null) {
-			button.setFocus();
-		}
-	}
-
-	protected void deactivate(ColumnViewerEditorDeactivationEvent event) {
-		super.deactivate(event);
-		if( event.eventType == ColumnViewerEditorDeactivationEvent.EDITOR_CANCELED ) {
-			row.setImage(index, restoredImage);
-			row.setText(index, restoredText);
-		}
-		row = null;
-		restoredImage = null;
-		restoredText = null;
-	}
-
-	public void activate(ColumnViewerEditorActivationEvent activationEvent) {
-		ViewerCell cell = (ViewerCell)activationEvent.getSource();
-		index = cell.getColumnIndex();
-		row = (ViewerRow) cell.getViewerRow().clone();
-		restoredImage = row.getImage(index);
-		restoredText = row.getText(index);
-		row.setImage(index, null);
-		row.setText(index, ""); //$NON-NLS-1$
-		super.activate(activationEvent);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.CellEditor#getDoubleClickTimeout()
-	 */
-	protected int getDoubleClickTimeout() {
-		return 0;
-	}
-
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/CursorCellHighlighter.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/CursorCellHighlighter.java
deleted file mode 100644
index 49395bf..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/CursorCellHighlighter.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationListener;
-import org.eclipse.jface.viewers.ColumnViewerEditorDeactivationEvent;
-import org.eclipse.jface.viewers.FocusCellHighlighter;
-import org.eclipse.jface.viewers.ViewerCell;
-
-
-
-/**
- * @since 3.3
- * 
- */
-public class CursorCellHighlighter extends FocusCellHighlighter {
-	private ColumnViewer viewer;
-
-	private AbstractCellCursor cursor;
-
-	/**
-	 * @param viewer
-	 * @param cursor
-	 */
-	public CursorCellHighlighter(ColumnViewer viewer,
-			AbstractCellCursor cursor) {
-		super(viewer);
-		this.viewer = viewer;
-		this.cursor = cursor;
-	}
-
-	protected void focusCellChanged(ViewerCell cell) {
-		super.focusCellChanged(cell);
-		if( ! viewer.isCellEditorActive() ) {
-			System.err.println("SHOW EDITOR"); //$NON-NLS-1$
-			cursor.setSelection(cell, 0); //TODO THE TIME
-			cursor.setVisible(true);
-		}
-	}
-	
-	protected void init() {
-		hookListener();
-	}
-
-	private void hookListener() {
-		ColumnViewerEditorActivationListener listener = new ColumnViewerEditorActivationListener() {
-
-			public void afterEditorActivated(
-					ColumnViewerEditorActivationEvent event) {
-				
-			}
-
-			public void afterEditorDeactivated(
-					ColumnViewerEditorDeactivationEvent event) {
-				cursor.setVisible(true);
-				cursor.setSelection(getFocusCell(), 0); //TODO THE TIME
-			}
-
-			public void beforeEditorActivated(
-					ColumnViewerEditorActivationEvent event) {
-				cursor.setVisible(false);
-			}
-
-			public void beforeEditorDeactivated(
-					ColumnViewerEditorDeactivationEvent event) {
-				
-			}
-		};
-		
-		viewer.getColumnViewerEditor().addEditorActivationListener(listener);
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/FocusBorderCellHighlighter.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/FocusBorderCellHighlighter.java
deleted file mode 100644
index 0725c4b..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/FocusBorderCellHighlighter.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.FocusCellHighlighter;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.viewers.ViewerRow;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-public class FocusBorderCellHighlighter extends FocusCellHighlighter {
-	private ViewerCell oldCell;
-
-	/**
-	 * @param viewer
-	 *            the viewer
-	 */
-	public FocusBorderCellHighlighter(ColumnViewer viewer) {
-		super(viewer);
-		hookListener(viewer);
-	}
-
-	private void markFocusedCell(Event event, ViewerCell cell) {
-		GC gc = event.gc;
-
-		Rectangle rect = event.getBounds();
-		gc.drawFocus(rect.x, rect.y, rect.width, rect.height);
-
-		event.detail &= ~SWT.SELECTED;
-	}
-
-	private void removeSelectionInformation(Event event, ViewerCell cell) {
-
-	}
-
-	private void hookListener(final ColumnViewer viewer) {
-
-		Listener listener = new Listener() {
-
-			public void handleEvent(Event event) {
-				if ((event.detail & SWT.SELECTED) > 0) {
-					ViewerCell focusCell = getFocusCell();
-					ViewerRow row = focusCell.getViewerRow();
-
-					Assert
-							.isNotNull(row,
-									"Internal structure invalid. Item without associated row is not possible."); //$NON-NLS-1$
-
-					ViewerCell cell = row.getCell(event.index);
-
-					if (focusCell == null || !cell.equals(focusCell)) {
-						removeSelectionInformation(event, cell);
-					} else {
-						markFocusedCell(event, cell);
-					}
-				}
-			}
-
-		};
-		viewer.getControl().addListener(SWT.EraseItem, listener);
-	}
-
-	/**
-	 * @param cell
-	 *            the cell which is colored
-	 * @return the color
-	 */
-	protected Color getSelectedCellBackgroundColor(ViewerCell cell) {
-		return null;
-	}
-
-	/**
-	 * @param cell
-	 *            the cell which is colored
-	 * @return the color
-	 */
-	protected Color getSelectedCellForegroundColor(ViewerCell cell) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.FocusCellHighlighter#focusCellChanged(org.eclipse.jface.viewers.ViewerCell)
-	 */
-	protected void focusCellChanged(ViewerCell cell) {
-		super.focusCellChanged(cell);
-
-		// Redraw new area
-		if (cell != null) {
-			Rectangle rect = cell.getBounds();
-			int x = cell.getColumnIndex() == 0 ? 0 : rect.x;
-			int width = cell.getColumnIndex() == 0 ? rect.x + rect.width
-					: rect.width;
-			cell.getControl().redraw(x, rect.y, width, rect.height, true);
-		}
-
-		if (oldCell != null) {
-			Rectangle rect = oldCell.getBounds();
-			int x = oldCell.getColumnIndex() == 0 ? 0 : rect.x;
-			int width = oldCell.getColumnIndex() == 0 ? rect.x + rect.width
-					: rect.width;
-			oldCell.getControl().redraw(x, rect.y, width, rect.height, true);
-		}
-
-		this.oldCell = cell;
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet001TableViewer.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet001TableViewer.java
deleted file mode 100644
index 017b19a..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet001TableViewer.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A simple TableViewer to demonstrate usage
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet001TableViewer {
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[])inputElement;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			
-		}
-		
-	}
-	
-	public class MyModel {
-		public int counter;
-		
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-		
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-	
-	public Snippet001TableViewer(Shell shell) {
-		final TableViewer v = new TableViewer(shell);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-	}
-	
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-		
-		for( int i = 0; i < 10; i++ ) {
-			elements[i] = new MyModel(i);
-		}
-		
-		return elements;
-	}
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display ();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet001TableViewer(shell);
-		shell.open ();
-		
-		while (!shell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-		
-		display.dispose ();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet002TreeViewer.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet002TreeViewer.java
deleted file mode 100644
index 68c6fcf..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet002TreeViewer.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A simple TreeViewer to demonstrate usage
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet002TreeViewer {
-	private class MyContentProvider implements ITreeContentProvider {
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return ((MyModel)inputElement).child.toArray();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			return getElements(parentElement);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			if( element == null) {
-				return null;
-			}
-			
-			return ((MyModel)element).parent;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-			return ((MyModel)element).child.size() > 0;
-		}
-		
-	}
-	
-	public class MyModel {
-		public MyModel parent;
-		public ArrayList child = new ArrayList();
-		public int counter;
-		
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-		
-		public String toString() {
-			String rv = "Item ";
-			if( parent != null ) {
-				rv = parent.toString() + ".";
-			}
-			
-			rv += counter;
-			
-			return rv;
-		}
-	}
-	
-	public Snippet002TreeViewer(Shell shell) {
-		final TreeViewer v = new TreeViewer(shell);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setInput(createModel());
-	}
-	
-	private MyModel createModel() {
-		
-		MyModel root = new MyModel(0,null);
-		root.counter = 0;
-		
-		MyModel tmp;
-		for( int i = 1; i < 10; i++ ) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for( int j = 1; j < i; j++ ) {
-				tmp.child.add(new MyModel(j,tmp));
-			}
-		}
-		
-		return root;
-	}
-	
-	public static void main(String[] args) {
-		Display display = new Display ();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet002TreeViewer(shell);
-		shell.open ();
-		
-		while (!shell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-		
-		display.dispose ();
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet003TableLabelProvider.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet003TableLabelProvider.java
deleted file mode 100644
index 4dbd122..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet003TableLabelProvider.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * Example usage of ITableLabelProvider using images and labels
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet003TableLabelProvider {
-	private static Image[] images;
-	
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[])inputElement;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			
-		}
-		
-	}
-	
-	public class MyModel {
-		public int counter;
-		
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-		
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-	
-	public class MyLabelProvider extends LabelProvider implements ITableLabelProvider {
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			if( columnIndex == 1 ) {
-				return images[((MyModel)element).counter%4];
-			}
-			
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return "Column " + columnIndex + " => " + element.toString();
-		}
-		
-	}
-	
-	private static Image createImage(Display display, int red, int green, int blue) {
-		Color color = new Color(display,red,green,blue);
-		Image image = new Image(display,10,10);
-		GC gc = new GC(image);
-		gc.setBackground(color);
-		gc.fillRectangle(0, 0, 10, 10);
-		gc.dispose();
-		
-		return image;
-	}
-	
-	public Snippet003TableLabelProvider(Shell shell) {
-		final TableViewer v = new TableViewer(shell,SWT.BORDER|SWT.FULL_SELECTION);
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		
-		TableColumn column = new TableColumn(v.getTable(),SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 1");
-		
-		column = new TableColumn(v.getTable(),SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 2");
-		
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-	}
-	
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-		
-		for( int i = 0; i < 10; i++ ) {
-			elements[i] = new MyModel(i);
-		}
-		
-		return elements;
-	}
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display ();
-		
-		images = new Image[4];
-		images[0] = createImage(display,0,0,255);
-		images[1] = createImage(display,0,255,255);
-		images[2] = createImage(display,0,255,0);
-		images[3] = createImage(display,255,0,255);
-		
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet003TableLabelProvider(shell);
-		shell.open ();
-		
-		while (!shell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-		
-		for( int i = 0; i < images.length; i++ ) {
-			images[i].dispose();
-		}
-		
-		display.dispose ();
-		
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet004HideSelection.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet004HideSelection.java
deleted file mode 100644
index cfd639b..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet004HideSelection.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Snippet that hides the selection when nothing is selected.
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet004HideSelection {
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[])inputElement;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			
-		}
-	}
-	
-	public class MyModel {
-		public int counter;
-		
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-		
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-	
-	public Snippet004HideSelection(Shell shell) {
-		final TableViewer v = new TableViewer(shell,SWT.BORDER|SWT.FULL_SELECTION);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().addMouseListener(new MouseAdapter() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.swt.events.MouseAdapter#mouseDown(org.eclipse.swt.events.MouseEvent)
-			 */
-			public void mouseDown(MouseEvent e) {
-				if( v.getTable().getItem(new Point(e.x,e.y)) == null ) {
-					v.setSelection(new StructuredSelection());
-				}
-			}
-			
-		});
-	}
-	
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-		
-		for( int i = 0; i < 10; i++ ) {
-			elements[i] = new MyModel(i);
-		}
-		
-		return elements;
-	}
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display ();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet004HideSelection(shell);
-		shell.open ();
-		
-		while (!shell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-		
-		display.dispose ();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet005TreeCustomMenu.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet005TreeCustomMenu.java
deleted file mode 100644
index 46fd640..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet005TreeCustomMenu.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.util.ArrayList;
-
-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.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Customized context menu based on TreeItem-Selection
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet005TreeCustomMenu {
-	private class MyContentProvider implements ITreeContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return ((MyModel) inputElement).child.toArray();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			return getElements(parentElement);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			if (element == null) {
-				return null;
-			}
-
-			return ((MyModel) element).parent;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-			return ((MyModel) element).child.size() > 0;
-		}
-
-	}
-
-	public class MyModel {
-		public MyModel parent;
-
-		public ArrayList child = new ArrayList();
-
-		public int counter;
-
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if (parent != null) {
-				rv = parent.toString() + ".";
-			}
-
-			rv += counter;
-
-			return rv;
-		}
-	}
-
-	public Snippet005TreeCustomMenu(Shell shell) {
-		final TreeViewer v = new TreeViewer(shell);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setInput(createModel());
-
-		final Action a = new Action("") {
-		};
-		final MenuManager mgr = new MenuManager();
-		mgr.setRemoveAllWhenShown(true);
-
-		mgr.addMenuListener(new IMenuListener() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.action.IMenuListener#menuAboutToShow(org.eclipse.jface.action.IMenuManager)
-			 */
-			public void menuAboutToShow(IMenuManager manager) {
-				IStructuredSelection selection = (IStructuredSelection) v
-						.getSelection();
-				if (!selection.isEmpty()) {
-					a.setText("Action for "
-							+ ((MyModel) selection.getFirstElement())
-									.toString());
-					mgr.add(a);
-				}
-			}
-		});
-		v.getControl().setMenu(mgr.createContextMenu(v.getControl()));
-	}
-
-	private MyModel createModel() {
-
-		MyModel root = new MyModel(0, null);
-		root.counter = 0;
-
-		MyModel tmp;
-		for (int i = 1; i < 10; i++) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for (int j = 1; j < i; j++) {
-				tmp.child.add(new MyModel(j, tmp));
-			}
-		}
-
-		return root;
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet005TreeCustomMenu(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet006TableMultiLineCells.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet006TableMultiLineCells.java
deleted file mode 100644
index 80c99f6..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet006TableMultiLineCells.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.OwnerDrawLabelProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Point;
-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.Event;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-
-public class Snippet006TableMultiLineCells {
-
-	public static void main(String[] args) {
-
-		Display display = new Display();
-		Shell shell = new Shell(display, SWT.CLOSE);
-		shell.setSize(400, 400);
-		shell.setLayout(new GridLayout());
-
-		Snippet006TableMultiLineCells example = new Snippet006TableMultiLineCells();
-		example.createPartControl(shell);
-
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-		display.dispose();
-	}
-
-	class LineEntry {
-
-		String line;
-
-		int columnWidth;
-
-		/**
-		 * Create a new instance of the receiver with name text constrained to a
-		 * column of width.
-		 * 
-		 * @param text
-		 * @param width
-		 */
-		LineEntry(String text, int width) {
-			line = text;
-			columnWidth = width;
-		}
-
-		/**
-		 * Get the height of the event.
-		 * 
-		 * @param index
-		 * @return int
-		 */
-		public int getHeight(Event event) {
-			event.gc.setLineWidth(columnWidth);
-			return event.gc.textExtent(line).y;
-
-		}
-
-		/**
-		 * Get the width of the event.
-		 * 
-		 * @param index
-		 * @return
-		 */
-		public int getWidth(Event event) {
-
-			return columnWidth;
-		}
-
-		/**
-		 * Get the font we are using.
-		 * 
-		 * @return Font
-		 */
-		protected Font getFont() {
-			return JFaceResources.getFont(JFaceResources.HEADER_FONT);
-		}
-
-		/**
-		 * @param event
-		 */
-		public void draw(Event event) {
-			event.gc.drawText(line, event.x, event.y);
-
-		}
-	}
-
-	private TableViewer viewer;
-
-	private LineEntry[] entries;
-
-	public Snippet006TableMultiLineCells() {
-		String[] lines = new String[] {
-				"This day is called the feast of Crispian:",
-				"He that outlives this day, \n and comes safe home,",
-				"Will stand a tip-toe when the day is named,",
-				"And rouse him at the name of Crispian.",
-				"He that shall live this day,\n and see old age,",
-				"Will yearly on the vigil feast his neighbours,",
-				"And say 'To-morrow is Saint Crispian:'",
-				"Then will he strip his sleeve and show his scars.",
-				"And say 'These wounds I had on Crispin's day.'",
-				"Old men forget:\n yet all shall be forgot,",
-				"But he'll remember with advantages",
-				"What feats he did that day:\n then shall our names.",
-				"Familiar in his mouth as household words",
-				"Harry the king, Bedford and Exeter,",
-				"Warwick and Talbot,\n Salisbury and Gloucester,",
-				"Be in their flowing cups freshly remember'd.",
-				"This story shall the good man teach his son;",
-				"And Crispin Crispian shall ne'er go by,",
-				"From this day to the ending of the world,",
-				"But we in it shall be remember'd;",
-				"We few,\n we happy few,\n we band of brothers;",
-				"For he to-day that sheds his blood with me",
-				"Shall be my brother;\n be he ne'er so vile,",
-				"This day shall gentle his condition:",
-				"And gentlemen in England now a-bed",
-				"Shall think themselves accursed they were not here,",
-				"And hold their manhoods cheap whiles any speaks",
-				"That fought with us upon Saint Crispin's day." };
-
-		entries = new LineEntry[lines.length];
-		for (int i = 0; i < lines.length; i++) {
-			entries[i] = new LineEntry(lines[i], 35);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		viewer = new TableViewer(parent, SWT.FULL_SELECTION);
-
-		viewer.setContentProvider(new IStructuredContentProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-			};
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				return entries;
-			};
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(org.eclipse.jface.viewers.Viewer viewer,
-					Object oldInput, Object newInput) {
-			}
-
-		});
-		createColumns();
-
-		viewer.setLabelProvider(new OwnerDrawLabelProvider() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#measure(org.eclipse.swt.widgets.Event, java.lang.Object)
-			 */
-			protected void measure(Event event, Object element) {
-				LineEntry line = (LineEntry) element;
-				Point size = event.gc.textExtent(line.line);
-				event.width = viewer.getTable().getColumn(event.index).getWidth();
-				int lines = size.x / event.width + 1;
-				event.height = size.y * lines;
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#paint(org.eclipse.swt.widgets.Event,
-			 *      java.lang.Object)
-			 */
-			protected void paint(Event event, Object element) {
-
-				LineEntry entry = (LineEntry) element;
-				event.gc.drawText(entry.line, event.x, event.y, true);
-			}
-		});
-		viewer.setInput(this);
-
-		GridData data = new GridData(GridData.GRAB_HORIZONTAL
-				| GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
-
-		viewer.getControl().setLayoutData(data);
-		OwnerDrawLabelProvider.setUpOwnerDraw(viewer);
-
-		viewer.setSelection(new StructuredSelection(entries[1]));
-	}
-
-	/**
-	 * Create the columns to be used in the tree.
-	 */
-	private void createColumns() {
-		TableLayout layout = new TableLayout();
-		viewer.getTable().setLayout(layout);
-		viewer.getTable().setHeaderVisible(true);
-		viewer.getTable().setLinesVisible(true);
-
-		TableColumn tc = new TableColumn(viewer.getTable(), SWT.NONE, 0);
-		layout.addColumnData(new ColumnPixelData(350));
-		tc.setText("Lines");
-
-	}
-
-	public void setFocus() {
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet007FullSelection.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet007FullSelection.java
deleted file mode 100644
index 4c0e623..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet007FullSelection.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-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.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * TableViewer: Hide full selection
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet007FullSelection {
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[])inputElement;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			
-		}
-		
-	}
-	
-	public class MyModel {
-		public int counter;
-		
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-		
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-	
-	public Snippet007FullSelection(Shell shell) {
-		final TableViewer v = new TableViewer(shell,SWT.BORDER|SWT.FULL_SELECTION);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setCellModifier(new ICellModifier() {
-
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return ((MyModel)element).counter + "";
-			}
-
-			public void modify(Object element, String property, Object value) {
-				TableItem item = (TableItem)element;
-				((MyModel)item.getData()).counter = Integer.parseInt(value.toString());
-				v.update(item.getData(), null);
-			}
-			
-		});
-		v.setColumnProperties(new String[] { "column1", "column2" });
-		v.setCellEditors(new CellEditor[] { new TextCellEditor(v.getTable()),new TextCellEditor(v.getTable()) });
-		
-		TableColumn column = new TableColumn(v.getTable(),SWT.NONE);
-		column.setWidth(100);
-		column.setText("Column 1");
-		
-		column = new TableColumn(v.getTable(),SWT.NONE);
-		column.setWidth(100);
-		column.setText("Column 2");
-		
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-		
-		v.getTable().addListener(SWT.EraseItem, new Listener() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-			 */
-			public void handleEvent(Event event) {
-				event.detail &= ~SWT.SELECTED;
-			}
-		});
-		
-	}
-	
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-		
-		for( int i = 0; i < 10; i++ ) {
-			elements[i] = new MyModel(i);
-		}
-		
-		return elements;
-	}
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display ();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet007FullSelection(shell);
-		shell.open ();
-		
-		while (!shell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-		
-		display.dispose ();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet008RevealElement.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet008RevealElement.java
deleted file mode 100644
index b275ed9..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet008RevealElement.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Scroll a Viewer 99th element
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet008RevealElement {
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[])inputElement;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			
-		}
-		
-	}
-	
-	public class MyModel {
-		public int counter;
-		
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-		
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-	
-	public Snippet008RevealElement(Shell shell) {
-		final TableViewer v = new TableViewer(shell);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.reveal(model[99]);
-	}
-	
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[100];
-		
-		for( int i = 0; i < 100; i++ ) {
-			elements[i] = new MyModel(i);
-		}
-		
-		return elements;
-	}
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display ();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet008RevealElement(shell);
-		shell.open ();
-		
-		while (!shell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-		
-		display.dispose ();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet009CellEditors.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet009CellEditors.java
deleted file mode 100644
index 46f6549..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet009CellEditors.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * Edit cell values in a table
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet009CellEditors {
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[])inputElement;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			
-		}
-		
-	}
-	
-	public class MyModel {
-		public int counter;
-		
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-		
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-	
-	public Snippet009CellEditors(Shell shell) {
-		final TableViewer v = new TableViewer(shell,SWT.BORDER|SWT.FULL_SELECTION);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setCellModifier(new ICellModifier() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
-			 */
-			public boolean canModify(Object element, String property) {
-				return ((MyModel)element).counter % 2 == 0;
-			}
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
-			 */
-			public Object getValue(Object element, String property) {
-				return ((MyModel)element).counter + "";
-			}
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
-			 */
-			public void modify(Object element, String property, Object value) {
-				TableItem item = (TableItem)element;
-				((MyModel)item.getData()).counter = Integer.parseInt(value.toString());
-				v.update(item.getData(), null);
-			}
-			
-		});
-		v.setColumnProperties(new String[] { "column1" });
-		v.setCellEditors(new CellEditor[] { new TextCellEditor(v.getTable()) });
-		
-		
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-	}
-	
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-		
-		for( int i = 0; i < 10; i++ ) {
-			elements[i] = new MyModel(i);
-		}
-		
-		return elements;
-	}
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display ();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet009CellEditors(shell);
-		shell.open ();
-		
-		while (!shell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-		
-		display.dispose ();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet010OwnerDraw.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet010OwnerDraw.java
deleted file mode 100644
index 05db09f..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet010OwnerDraw.java
+++ /dev/null
@@ -1,425 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     oliver.schaefer@mbtech-services.com - Fix for Bug 225051 [Snippets] Snippet010OwnerDraw - Wrong german flag
- *******************************************************************************/
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.OwnerDrawLabelProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.graphics.TextLayout;
-import org.eclipse.swt.graphics.TextStyle;
-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.Event;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-
-public class Snippet010OwnerDraw {
-
-	public static void main(String[] args) {
-
-		Display display = new Display();
-		Shell shell = new Shell(display, SWT.CLOSE);
-		shell.setSize(400, 400);
-		shell.setLayout(new GridLayout());
-
-		Snippet010OwnerDraw example = new Snippet010OwnerDraw();
-		example.createPartControl(shell);
-
-		shell.open();
-
-		while (!shell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-		display.dispose();
-	}
-
-	private static int COLUMN_COUNT = 3;
-
-	class CountryEntry {
-
-		String name;
-
-		String cupYear;
-
-		private String baseName;
-
-		/**
-		 * Create a new instance of the receiver.
-		 * 
-		 * @param countryName
-		 * @param worldCupYear
-		 */
-		CountryEntry(String countryName, String englishName, String worldCupYear) {
-			name = countryName;
-			cupYear = worldCupYear;
-			baseName = englishName;
-		}
-
-		/**
-		 * @param index
-		 * @return
-		 */
-		public int getHeight(Event event) {
-			switch (event.index) {
-			case 0:
-				return event.gc.textExtent(name).y;
-			case 1:
-				return 50;
-			case 2:
-				return event.gc.textExtent(cupYear).y;
-			default:
-				return 10;
-			}
-		}
-
-		/**
-		 * @param index
-		 * @return
-		 */
-		public int getWidth(Event event) {
-
-			switch (event.index) {
-			case 0:
-				return event.gc.textExtent(getDisplayString().toString()).x + 4;
-
-			case 1:
-				return 200;
-
-			case 2:
-				return event.gc.textExtent(cupYear).x + 5;
-
-			default:
-				return 10;
-			}
-		}
-
-		/**
-		 * Draw the flag in bounds.
-		 * 
-		 * @param event
-		 */
-		protected void drawFlag(Event event) {
-			event.gc.setBackground(viewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_BLUE));
-
-			Rectangle bounds = event.getBounds();
-			bounds.width += 100;
-			event.gc.fillRectangle(bounds);
-		}
-
-		/**
-		 * Draw the cup year
-		 * 
-		 * @param event
-		 */
-		private void drawCupYear(Event event) {
-			event.gc.drawText(cupYear, event.x, event.y);
-
-		}
-
-		/**
-		 * Draw the name of the receiver.
-		 * 
-		 * @param event
-		 */
-		protected void drawName(Event event) {
-
-			StringBuffer buffer = getDisplayString();
-
-			Display display = viewer.getControl().getDisplay();
-			TextLayout layout = new TextLayout(display);
-			layout.setText(buffer.toString());
-
-			TextStyle plain = new TextStyle(JFaceResources
-					.getFont(JFaceResources.DEFAULT_FONT), display
-					.getSystemColor(SWT.COLOR_LIST_FOREGROUND), display
-					.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-
-			TextStyle italic = new TextStyle(JFaceResources.getFontRegistry()
-					.getItalic(JFaceResources.DEFAULT_FONT), display
-					.getSystemColor(SWT.COLOR_BLUE), display
-					.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-
-			layout.setStyle(plain, 0, name.length() - 1);
-			layout.setStyle(italic, name.length(), buffer.length() - 1);
-
-			layout.draw(event.gc, event.x, event.y);
-
-		}
-
-		/**
-		 * @return
-		 */
-		private StringBuffer getDisplayString() {
-			StringBuffer buffer = new StringBuffer();
-			buffer.append(name);
-			buffer.append(" (");
-			buffer.append(baseName);
-			buffer.append(")");
-			return buffer;
-		}
-
-		/**
-		 * @param event
-		 */
-		public void draw(Event event) {
-
-			switch (event.index) {
-			case 0:
-				drawName(event);
-				break;
-			case 1:
-				drawFlag(event);
-				break;
-			case 2:
-				drawCupYear(event);
-				break;
-
-			default:
-				break;
-			}
-
-		}
-	}
-
-	private class GermanyEntry extends CountryEntry {
-
-		GermanyEntry() {
-			super("Deutschland", "Germany", "1954 1974 1990");
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(org.eclipse.swt.widgets.Event)
-		 */
-		protected void drawFlag(Event event) {
-
-			Rectangle bounds = event.getBounds();
-			bounds.width += 100;
-			int stripeHeight = bounds.height / 3;
-			Rectangle stripe = new Rectangle(bounds.x, bounds.y, bounds.width,
-					stripeHeight);
-
-			event.gc.setBackground(viewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_BLACK));
-			event.gc.fillRectangle(stripe);
-
-			stripe.y += stripeHeight;
-
-			event.gc.setBackground(viewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_RED));
-			event.gc.fillRectangle(stripe);
-
-			stripe.y += stripeHeight;
-
-			event.gc.setBackground(viewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_YELLOW));
-			event.gc.fillRectangle(stripe);
-
-		}
-
-	}
-
-	private class AustriaEntry extends CountryEntry {
-
-		AustriaEntry() {
-			super("\u00D6sterreich", "Austria", "TBD");
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(org.eclipse.swt.widgets.Event)
-		 */
-		protected void drawFlag(Event event) {
-
-			Rectangle bounds = event.getBounds();
-			bounds.width += 100;
-			int stripeHeight = bounds.height / 3;
-			Rectangle stripe = new Rectangle(bounds.x, bounds.y, bounds.width,
-					stripeHeight);
-
-			event.gc.setBackground(viewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_RED));
-			event.gc.fillRectangle(stripe);
-
-			stripe.y += stripeHeight;
-
-			event.gc.setBackground(viewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_WHITE));
-			event.gc.fillRectangle(stripe);
-
-			stripe.y += stripeHeight;
-
-			event.gc.setBackground(viewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_RED));
-			event.gc.fillRectangle(stripe);
-
-		}
-	}
-
-	private class EnglandEntry extends CountryEntry {
-		EnglandEntry() {
-			super("Blighty", "England", "1966");
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(org.eclipse.swt.widgets.Event)
-		 */
-		protected void drawFlag(Event event) {
-
-			Rectangle bounds = event.getBounds();
-			bounds.width += 100;
-
-			event.gc.setBackground(viewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_RED));
-			event.gc.fillRectangle(new Rectangle(bounds.width / 2 + bounds.x
-					- 5, bounds.y, 10, bounds.height));
-			event.gc.fillRectangle(new Rectangle(bounds.x, bounds.height / 2
-					+ bounds.y - 5, bounds.width, 10));
-
-		}
-	}
-
-	private TableViewer viewer;
-
-	private CountryEntry[] entries;
-
-	public Snippet010OwnerDraw() {
-		entries = new CountryEntry[3];
-		entries[0] = new AustriaEntry();
-		entries[1] = new GermanyEntry();
-		entries[2] = new EnglandEntry();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		viewer = new TableViewer(parent, SWT.FULL_SELECTION);
-
-		viewer.setContentProvider(new IStructuredContentProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-			};
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				return entries;
-			};
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(org.eclipse.jface.viewers.Viewer viewer,
-					Object oldInput, Object newInput) {
-			}
-
-		});
-		createColumns();
-
-		viewer.setLabelProvider(new OwnerDrawLabelProvider() {
-	
-
-			protected void measure(Event event, Object element) {
-				CountryEntry country = (CountryEntry) element;
-
-				event.setBounds(new Rectangle(event.x, event.y, country.getWidth(event),
-						country.getHeight(event)));
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#paint(org.eclipse.swt.widgets.Event,
-			 *      java.lang.Object)
-			 */
-			protected void paint(Event event, Object element) {
-				CountryEntry entry = (CountryEntry) element;
-				entry.draw(event);
-
-			}
-		});
-		
-		OwnerDrawLabelProvider.setUpOwnerDraw(viewer);
-		viewer.setInput(this);
-		GridData data = new GridData(GridData.GRAB_HORIZONTAL
-				| GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
-
-		viewer.getControl().setLayoutData(data);
-
-		viewer.setSelection(new StructuredSelection(entries[1]));
-	}
-
-	/**
-	 * Create the columns to be used in the tree.
-	 */
-	private void createColumns() {
-		TableLayout layout = new TableLayout();
-		viewer.getTable().setLayout(layout);
-		viewer.getTable().setHeaderVisible(true);
-		viewer.getTable().setLinesVisible(true);
-
-		for (int i = 0; i < COLUMN_COUNT; i++) {
-			TableColumn tc = new TableColumn(viewer.getTable(), SWT.NONE, i);
-			layout.addColumnData(new ColumnPixelData(100));
-			tc.setText(getTitleFor(i));
-		}
-		;
-	}
-
-	/**
-	 * @param i
-	 * @return
-	 */
-	private String getTitleFor(int i) {
-		switch (i) {
-		case 0:
-			return "Name";
-		case 1:
-			return "Flag";
-		case 2:
-			return "World Cup Year";
-		}
-		return "Unknown";
-	}
-
-	public void setFocus() {
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet011CustomTooltips.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet011CustomTooltips.java
deleted file mode 100644
index c66dfd9..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet011CustomTooltips.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *     IBM - Improvement for Bug 159625 [Snippets] Update Snippet011CustomTooltips to reflect new API
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.CellLabelProvider;
-import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.window.ToolTip;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Explore New API: JFace custom tooltips drawing.
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * @since 3.3
- */
-public class Snippet011CustomTooltips {
-	private static class MyContentProvider implements
-			IStructuredContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return new String[] { "one", "two", "three", "four", "five", "six",
-					"seven", "eight", "nine", "ten" };
-		}
-
-		public void dispose() {
-
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		final Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-
-		TableViewer v = new TableViewer(shell, SWT.FULL_SELECTION);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-		v.setContentProvider(new MyContentProvider());
-		ColumnViewerToolTipSupport.enableFor(v,ToolTip.NO_RECREATE);
-		
-		CellLabelProvider labelProvider = new CellLabelProvider() {
-
-			public String getToolTipText(Object element) {
-				return "Tooltip (" + element + ")";
-			}
-
-			public Point getToolTipShift(Object object) {
-				return new Point(5, 5);
-			}
-
-			public int getToolTipDisplayDelayTime(Object object) {
-				return 2000;
-			}
-
-			public int getToolTipTimeDisplayed(Object object) {
-				return 5000;
-			}
-
-			public void update(ViewerCell cell) {
-				cell.setText(cell.getElement().toString());
-
-			}
-		};
-
-		TableViewerColumn column = new TableViewerColumn(v, SWT.NONE);
-		column.setLabelProvider(labelProvider);
-		column.getColumn().setText("Column 1");
-		column.getColumn().setWidth(100);
-
-		v.setInput("");
-
-		shell.setSize(200, 200);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch()) {
-				display.sleep();
-			}
-		}
-
-		display.dispose();
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet013TableViewerNoMandatoryLabelProvider.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet013TableViewerNoMandatoryLabelProvider.java
deleted file mode 100644
index 1de89ef..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet013TableViewerNoMandatoryLabelProvider.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableColorProvider;
-import org.eclipse.jface.viewers.ITableFontProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * Example usage of none mandatory interfaces of ITableFontProvider and
- * ITableColorProvider
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet013TableViewerNoMandatoryLabelProvider {
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public class MyLabelProvider extends LabelProvider implements
-			ITableLabelProvider, ITableFontProvider, ITableColorProvider {
-		FontRegistry registry = new FontRegistry();
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return "Column " + columnIndex + " => " + element.toString();
-		}
-
-		public Font getFont(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 0) {
-				return registry.getBold(Display.getCurrent().getSystemFont()
-						.getFontData()[0].getName());
-			}
-			return null;
-		}
-
-		public Color getBackground(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 0) {
-				return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
-			}
-			return null;
-		}
-
-		public Color getForeground(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 1) {
-				return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
-			}
-			return null;
-		}
-
-	}
-
-	public Snippet013TableViewerNoMandatoryLabelProvider(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-
-		TableColumn column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 1");
-
-		column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 2");
-
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-
-		for (int i = 0; i < 10; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet013TableViewerNoMandatoryLabelProvider(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet014TreeViewerNoMandatoryLabelProvider.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet014TreeViewerNoMandatoryLabelProvider.java
deleted file mode 100644
index e3c8aae..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet014TreeViewerNoMandatoryLabelProvider.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.viewers.ITableColorProvider;
-import org.eclipse.jface.viewers.ITableFontProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TreeColumn;
-
-/**
- * A simple TreeViewer to demonstrate usage
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet014TreeViewerNoMandatoryLabelProvider {
-	private class MyContentProvider implements ITreeContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return ((MyModel) inputElement).child.toArray();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			return getElements(parentElement);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			if (element == null) {
-				return null;
-			}
-
-			return ((MyModel) element).parent;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-			return ((MyModel) element).child.size() > 0;
-		}
-
-	}
-
-	public class MyModel {
-		public MyModel parent;
-
-		public ArrayList child = new ArrayList();
-
-		public int counter;
-
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if (parent != null) {
-				rv = parent.toString() + ".";
-			}
-
-			rv += counter;
-
-			return rv;
-		}
-	}
-
-	public class MyLabelProvider extends LabelProvider implements
-			ITableLabelProvider, ITableFontProvider, ITableColorProvider {
-		FontRegistry registry = new FontRegistry();
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return "Column " + columnIndex + " => " + element.toString();
-		}
-
-		public Font getFont(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 0) {
-				return registry.getBold(Display.getCurrent().getSystemFont()
-						.getFontData()[0].getName());
-			}
-			return null;
-		}
-
-		public Color getBackground(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 0) {
-				return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
-			}
-			return null;
-		}
-
-		public Color getForeground(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 1) {
-				return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
-			}
-			return null;
-		}
-
-	}
-
-	public Snippet014TreeViewerNoMandatoryLabelProvider(Shell shell) {
-		final TreeViewer v = new TreeViewer(shell);
-		
-		TreeColumn column = new TreeColumn(v.getTree(),SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 1");
-		
-		column = new TreeColumn(v.getTree(),SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 2");
-		
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setInput(createModel());
-	}
-
-	private MyModel createModel() {
-
-		MyModel root = new MyModel(0, null);
-		root.counter = 0;
-
-		MyModel tmp;
-		for (int i = 1; i < 10; i++) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for (int j = 1; j < i; j++) {
-				tmp.child.add(new MyModel(j, tmp));
-			}
-		}
-
-		return root;
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet014TreeViewerNoMandatoryLabelProvider(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet015CustomTooltipsForTree.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet015CustomTooltipsForTree.java
deleted file mode 100644
index 86312d4..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet015CustomTooltipsForTree.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.viewers.CellLabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Explore New API: JFace custom tooltips drawing.
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * @since 3.3M2
- */
-public class Snippet015CustomTooltipsForTree {
-	private static class MyContentProvider implements ITreeContentProvider {
-
-		private static final String ROOT = "Root";
-
-		public Object[] getElements(Object inputElement) {
-			return new Object[]{ROOT};
-		}
-
-		public void dispose() {
-			
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			
-			
-		}
-
-		public Object[] getChildren(Object parentElement) {
-			if(parentElement.equals(ROOT))
-				return new String[] { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" };
-			return new Object[0];
-		}
-
-		public Object getParent(Object element) {
-			return null;
-		}
-
-		public boolean hasChildren(Object element) {
-			return element.equals(ROOT);
-		}
-	}
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		final Display display = new Display ();
-		Shell shell = new Shell (display);
-	    shell.setLayout(new FillLayout());
-	    
-	    TreeViewer v = new TreeViewer(shell,SWT.FULL_SELECTION);
-	    v.getTree().setLinesVisible(true);
-	    v.getTree().setHeaderVisible(true);
-	    ColumnViewerToolTipSupport.enableFor(v);
-	    
-	    v.setContentProvider(new MyContentProvider());
-	    
-	    CellLabelProvider labelProvider = new CellLabelProvider() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.ViewerLabelProvider#getTooltipText(java.lang.Object)
-			 */
-			public String getToolTipText(Object element) {
-				return "Tooltip (" + element + ")";
-			}
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.ViewerLabelProvider#getTooltipShift(java.lang.Object)
-			 */
-			public Point getToolTipShift(Object object) {
-				return new Point(5,5);
-			}
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.ViewerLabelProvider#getTooltipDisplayDelayTime(java.lang.Object)
-			 */
-			public int getToolTipDisplayDelayTime(Object object) {
-				return 2000;
-			}
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.ViewerLabelProvider#getTooltipTimeDisplayed(java.lang.Object)
-			 */
-			public int getToolTipTimeDisplayed(Object object) {
-				return 5000;
-			}
-			
-			public void update(ViewerCell cell) {
-				cell.setText(cell.getElement().toString());
-				
-			}
-	    };
-	    
-	    
-	    v.setLabelProvider(labelProvider);
-	    v.setInput("");
-	    
-	    shell.setSize(200,200);
-	    shell.open ();
-	    
-	    while (!shell.isDisposed()) {
-	        if (!display.readAndDispatch ()) {
-	        	display.sleep ();
-	        }
-	    }
-	    
-	    display.dispose ();
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet017TableViewerHideShowColumns.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet017TableViewerHideShowColumns.java
deleted file mode 100644
index 12080b2..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet017TableViewerHideShowColumns.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * Example usage of none mandatory interfaces of ITableFontProvider and
- * ITableColorProvider
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * @since 3.2
- */
-public class Snippet017TableViewerHideShowColumns {
-	private class ShrinkThread extends Thread {
-		private int width = 0;
-		private TableColumn column;
-		
-		public ShrinkThread(int width, TableColumn column) {
-			super();
-			this.width = width;
-			this.column = column;
-		}
-		
-		public void run() {
-			column.getDisplay().syncExec(new Runnable() {
-
-				public void run() {
-					column.setData("restoredWidth", new Integer(width));
-				}
-			});
-			
-			for( int i = width; i >= 0; i-- ) {
-				final int index = i;
-				column.getDisplay().syncExec(new Runnable() {
-
-					public void run() {
-						column.setWidth(index);
-					}
-					
-				});
-			}
-		}
-	};
-	
-	private class ExpandThread extends Thread {
-		private int width = 0;
-		private TableColumn column;
-		
-		public ExpandThread(int width, TableColumn column) {
-			super();
-			this.width = width;
-			this.column = column;
-		}
-		
-		public void run() {
-			for( int i = 0; i <= width; i++ ) {
-				final int index = i;
-				column.getDisplay().syncExec(new Runnable() {
-
-					public void run() {
-						column.setWidth(index);
-					}
-					
-				});
-			}
-		}
-	}
-	
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public class MyLabelProvider extends LabelProvider implements
-			ITableLabelProvider {
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return "Column " + columnIndex + " => " + element.toString();
-		}
-	}
-
-	public Snippet017TableViewerHideShowColumns(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-
-		TableColumn column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 1");
-
-		column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 2");
-		
-		column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 3");
-
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-		addMenu(v);
-	}
-
-	private void addMenu(TableViewer v) {
-		final MenuManager mgr = new MenuManager();
-		Action action;
-		
-		for( int i = 0; i < v.getTable().getColumnCount(); i++ ) {
-			final TableColumn column = v.getTable().getColumn(i);
-			
-			action = new Action(v.getTable().getColumn(i).getText(),SWT.CHECK) {
-				public void runWithEvent(Event event) {
-					if( ! isChecked() ) {
-						ShrinkThread t = new ShrinkThread(column.getWidth(),column);
-						t.run();
-					} else {
-						ExpandThread t = new ExpandThread(((Integer)column.getData("restoredWidth")).intValue(),column);
-						t.run();
-					}
-				}
-				
-			};
-			action.setChecked(true);
-			mgr.add(action);
-		}
-		
-		v.getControl().setMenu(mgr.createContextMenu(v.getControl()));
-	}
-	
-	
-	
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-
-		for (int i = 0; i < 10; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet017TableViewerHideShowColumns(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet018TableViewerAddRemoveColumnsWithEditing.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet018TableViewerAddRemoveColumnsWithEditing.java
deleted file mode 100644
index 5c90d00..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet018TableViewerAddRemoveColumnsWithEditing.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-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.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * Example of adding and removing columns in conjunction with JFace-Viewers
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * @since 3.2
- */
-public class Snippet018TableViewerAddRemoveColumnsWithEditing {
-
-	public class Person {
-		public String givenname;
-
-		public String surname;
-
-		public String email;
-
-		public Person(String givenname, String surname, String email) {
-			this.givenname = givenname;
-			this.surname = surname;
-			this.email = email;
-		}
-
-		public String getValue(String name) {
-			Field field;
-			try {
-				field = getClass().getDeclaredField(name);
-				return (String) field.get(this);
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-
-			return "ERROR";
-		}
-
-		public void setValue(String name, String value) {
-			Field field;
-			try {
-				field = getClass().getDeclaredField(name);
-				field.set(this, value);
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-		}
-	}
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return (Person[]) inputElement;
-		}
-
-		public void dispose() {
-
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class MyLabelProvider extends LabelProvider implements
-			ITableLabelProvider {
-		private TableViewer viewer;
-
-		public MyLabelProvider(TableViewer viewer) {
-			this.viewer = viewer;
-		}
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return ((Person) element)
-					.getValue(viewer.getColumnProperties()[columnIndex]
-							.toString());
-		}
-	}
-
-	public class MyCellModifier implements ICellModifier {
-		private TableViewer viewer;
-
-		public MyCellModifier(TableViewer viewer) {
-			this.viewer = viewer;
-		}
-
-		public boolean canModify(Object element, String property) {
-			return true;
-		}
-
-		public Object getValue(Object element, String property) {
-			return ((Person) element).getValue(property);
-		}
-
-		public void modify(Object element, String property, Object value) {
-			((Person) ((Item) element).getData()).setValue(property, value
-					.toString());
-			viewer.update(((Item) element).getData(), null);
-		}
-
-	}
-
-	private int activeColumn = -1;
-
-	public Snippet018TableViewerAddRemoveColumnsWithEditing(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		v.setLabelProvider(new MyLabelProvider(v));
-		v.setContentProvider(new MyContentProvider());
-		v.setCellEditors(new CellEditor[] { new TextCellEditor(v.getTable()),
-				new TextCellEditor(v.getTable()),
-				new TextCellEditor(v.getTable()) });
-		v.setCellModifier(new MyCellModifier(v));
-
-		v.setColumnProperties(new String[] { "givenname", "surname" });
-
-		TableColumn column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setText("Givenname");
-
-		column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setText("Surname");
-
-		Person[] model = createModel();
-
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-
-		addMenu(v);
-		triggerColumnSelectedColumn(v);
-	}
-
-	private void triggerColumnSelectedColumn(final TableViewer v) {
-		v.getTable().addMouseListener(new MouseAdapter() {
-
-			public void mouseDown(MouseEvent e) {
-				int x = 0;
-				for (int i = 0; i < v.getTable().getColumnCount(); i++) {
-					x += v.getTable().getColumn(i).getWidth();
-					if (e.x <= x) {
-						activeColumn = i;
-						break;
-					}
-				}
-			}
-
-		});
-	}
-
-	private void addMenu(final TableViewer v) {
-		final MenuManager mgr = new MenuManager();
-
-		final Action insertEmailBefore = new Action("Insert E-Mail before") {
-			public void run() {
-				addEmailColumn(v, activeColumn);
-			}
-		};
-
-		final Action insertEmailAfter = new Action("Insert E-Mail after") {
-			public void run() {
-				addEmailColumn(v, activeColumn + 1);
-			}
-		};
-
-		final Action removeEmail = new Action("Remove E-Mail") {
-			public void run() {
-				removeEmailColumn(v);
-			}
-		};
-
-		mgr.setRemoveAllWhenShown(true);
-		mgr.addMenuListener(new IMenuListener() {
-
-			public void menuAboutToShow(IMenuManager manager) {
-				if (v.getTable().getColumnCount() == 2) {
-					manager.add(insertEmailBefore);
-					manager.add(insertEmailAfter);
-				} else {
-					manager.add(removeEmail);
-				}
-			}
-
-		});
-
-		v.getControl().setMenu(mgr.createContextMenu(v.getControl()));
-	}
-
-	private void removeEmailColumn(TableViewer v) {
-		int emailIndex = -1;
-		for (int i = 0; i < v.getColumnProperties().length; i++) {
-			if (v.getColumnProperties()[i].toString().equals("email")) {
-				emailIndex = i;
-				break;
-			}
-		}
-
-		ArrayList list = new ArrayList(Arrays.asList(v.getCellEditors()));
-		list.remove(emailIndex);
-		CellEditor[] editors = new CellEditor[list.size()];
-		list.toArray(editors);
-		v.setCellEditors(editors);
-
-		list = new ArrayList(Arrays.asList(v.getColumnProperties()));
-		list.remove(emailIndex);
-		String[] columnProperties = new String[list.size()];
-		list.toArray(columnProperties);
-		v.setColumnProperties(columnProperties);
-
-		v.getTable().getColumn(emailIndex).dispose();
-
-		v.refresh();
-	}
-
-	private void addEmailColumn(TableViewer v, int columnIndex) {
-		ArrayList list = new ArrayList(Arrays.asList(v.getCellEditors()));
-		list.add(columnIndex, new TextCellEditor(v.getTable()));
-		CellEditor[] editors = new CellEditor[list.size()];
-		list.toArray(editors);
-		v.setCellEditors(editors);
-
-		list = new ArrayList(Arrays.asList(v.getColumnProperties()));
-		list.add(columnIndex, "email");
-		String[] columnProperties = new String[list.size()];
-		list.toArray(columnProperties);
-		v.setColumnProperties(columnProperties);
-
-		// 1. Add new column
-		TableColumn column = new TableColumn(v.getTable(), SWT.NONE,
-				columnIndex);
-		column.setText("E-Mail");
-
-		// 2. Update the viewer
-		v.refresh();
-
-		// 3. Make the colum visible
-		column.setWidth(200);
-	}
-
-	private Person[] createModel() {
-		Person[] persons = new Person[3];
-		persons[0] = new Person("Tom", "Schindl", "tom.schindl@bestsolution.at");
-		persons[1] = new Person("Boris", "Bokowski",
-				"boris_bokowski@ca.ibm.com");
-		persons[2] = new Person("Tod", "Creasey", "tod_creasey@ca.ibm.com");
-
-		return persons;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet018TableViewerAddRemoveColumnsWithEditing(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet019TableViewerAddRemoveColumnsWithEditingNewAPI.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet019TableViewerAddRemoveColumnsWithEditingNewAPI.java
deleted file mode 100644
index 670e8a6..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet019TableViewerAddRemoveColumnsWithEditingNewAPI.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-
-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.internal.ConfigureColumnsDialog;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.SameShellProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Explore the new API added in 3.3 and see how easily you can create reusable
- * components
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * @since 3.2
- */
-public class Snippet019TableViewerAddRemoveColumnsWithEditingNewAPI {
-
-	public class Person {
-		public String givenname;
-
-		public String surname;
-
-		public String email;
-
-		public Person(String givenname, String surname, String email) {
-			this.givenname = givenname;
-			this.surname = surname;
-			this.email = email;
-		}
-	}
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return (Person[]) inputElement;
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	
-
-	private class GivenNameLabelProvider extends ColumnLabelProvider {
-		public String getText(Object element) {
-			return ((Person) element).givenname;
-		}
-	}
-	
-	private class GivenNameEditing extends EditingSupport {
-		private TextCellEditor cellEditor;
-		
-		public GivenNameEditing(TableViewer viewer) {
-			super(viewer);
-			cellEditor = new TextCellEditor(viewer.getTable());
-		}
-		
-		protected boolean canEdit(Object element) {
-			return true;
-		}
-		
-		protected CellEditor getCellEditor(Object element) {
-			return cellEditor;
-		}
-
-		protected Object getValue(Object element) {
-			return ((Person) element).givenname;
-		}
-
-		protected void setValue(Object element, Object value) {
-			((Person) element).givenname = value.toString();
-			getViewer().update(element, null);
-		}
-	}
-	
-	private class SurNameLabelProvider extends ColumnLabelProvider {
-		public String getText(Object element) {
-			return ((Person) element).surname;
-		}
-	}
-	
-	private class SurNameEditing extends EditingSupport {
-		private TextCellEditor cellEditor;
-		
-		public SurNameEditing( TableViewer viewer ) {
-			super(viewer);
-			cellEditor = new TextCellEditor(viewer.getTable());
-		}
-		
-		protected boolean canEdit(Object element) {
-			return true;
-		}
-		
-		protected CellEditor getCellEditor(Object element) {
-			return cellEditor;
-		}
-
-		protected Object getValue(Object element) {
-			return ((Person) element).surname;
-		}
-
-		protected void setValue(Object element, Object value) {
-			((Person) element).surname = value.toString();
-			getViewer().update(element, null);
-		}
-	}
-	
-	private class EmailLabelProvider extends ColumnLabelProvider {
-		public String getText(Object element) {
-			return ((Person) element).email;
-		}
-	}
-	
-	private class EmailEditing extends EditingSupport {
-		private TextCellEditor cellEditor;
-		
-		public EmailEditing( TableViewer viewer ) {
-			super(viewer);
-			cellEditor = new TextCellEditor(viewer.getTable());
-		}
-		
-		protected boolean canEdit(Object element) {
-			return true;
-		}
-		
-		protected CellEditor getCellEditor(Object element) {
-			return cellEditor;
-		}
-
-		protected Object getValue(Object element) {
-			return ((Person) element).email;
-		}
-
-		protected void setValue(Object element, Object value) {
-			((Person) element).email = value.toString();
-			getViewer().update(element, null);
-		}
-	}
-	
-	private int activeColumn = -1;
-	
-	private TableViewerColumn column;
-	
-	public Snippet019TableViewerAddRemoveColumnsWithEditingNewAPI(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-
-		TableViewerColumn column = new TableViewerColumn(v,SWT.NONE);
-		column.setLabelProvider(new GivenNameLabelProvider());
-		column.setEditingSupport(new GivenNameEditing(v));
-		
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Givenname");
-		column.getColumn().setMoveable(true);
-
-		column = new TableViewerColumn(v,SWT.NONE);
-		column.setLabelProvider(new SurNameLabelProvider());
-		column.setEditingSupport(new SurNameEditing(v));
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Surname");
-		column.getColumn().setMoveable(true);
-
-		Person[] model = createModel();
-
-		v.setContentProvider(new MyContentProvider());
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-
-		addMenu(v);
-		triggerColumnSelectedColumn(v);
-	}
-
-	private void triggerColumnSelectedColumn(final TableViewer v) {
-		v.getTable().addMouseListener(new MouseAdapter() {
-
-			public void mouseDown(MouseEvent e) {
-				int x = 0;
-				for (int i = 0; i < v.getTable().getColumnCount(); i++) {
-					x += v.getTable().getColumn(i).getWidth();
-					if (e.x <= x) {
-						activeColumn = i;
-						break;
-					}
-				}
-			}
-
-		});
-	}
-
-	private void removeEmailColumn(TableViewer v) {
-		column.getColumn().dispose();
-		v.refresh();
-	}
-
-	private void addEmailColumn(TableViewer v, int columnIndex) {
-		column = new TableViewerColumn(v, SWT.NONE, columnIndex);
-		column.setLabelProvider(new EmailLabelProvider());
-		column.setEditingSupport(new EmailEditing(v));
-		column.getColumn().setText("E-Mail");
-		column.getColumn().setResizable(false);
-
-		v.refresh();
-
-		column.getColumn().setWidth(200);
-
-	}
-
-	private void addMenu(final TableViewer v) {
-		final MenuManager mgr = new MenuManager();
-
-		final Action insertEmailBefore = new Action("Insert E-Mail before") {
-			public void run() {
-				addEmailColumn(v, activeColumn);
-			}
-		};
-
-		final Action insertEmailAfter = new Action("Insert E-Mail after") {
-			public void run() {
-				addEmailColumn(v, activeColumn + 1);
-			}
-		};
-
-		final Action removeEmail = new Action("Remove E-Mail") {
-			public void run() {
-				removeEmailColumn(v);
-			}
-		};
-
-		final Action configureColumns = new Action("Configure Columns...") {
-			public void run() {
-				// Note: the following is not API!
-				new ConfigureColumnsDialog(new SameShellProvider(v.getControl()), v.getTable()).open();
-			}
-		};
-		
-		mgr.setRemoveAllWhenShown(true);
-		mgr.addMenuListener(new IMenuListener() {
-
-			public void menuAboutToShow(IMenuManager manager) {
-				if (v.getTable().getColumnCount() == 2) {
-					manager.add(insertEmailBefore);
-					manager.add(insertEmailAfter);
-				} else {
-					manager.add(removeEmail);
-				}
-				manager.add(configureColumns);
-			}
-
-		});
-
-		v.getControl().setMenu(mgr.createContextMenu(v.getControl()));
-	}
-
-	private Person[] createModel() {
-		Person[] persons = new Person[3];
-		persons[0] = new Person("Tom", "Schindl", "tom.schindl@bestsolution.at");
-		persons[1] = new Person("Boris", "Bokowski",
-				"boris_bokowski@ca.ibm.com");
-		persons[2] = new Person("Tod", "Creasey", "tod_creasey@ca.ibm.com");
-
-		return persons;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet019TableViewerAddRemoveColumnsWithEditingNewAPI(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet021CellEditorsOnDoubleClick.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet021CellEditorsOnDoubleClick.java
deleted file mode 100644
index 66ee74a..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet021CellEditorsOnDoubleClick.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *     Dinko Ivanov - bug 164365
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-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;
-
-/**
- * Editor Activation on DoubleClick instead of single.
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet021CellEditorsOnDoubleClick {
-	private class MyCellModifier implements ICellModifier {
-		
-		private TableViewer viewer;
-		
-		private boolean enabled;
-		
-		public void setEnabled(boolean enabled) {
-			this.enabled = enabled;
-		}
-
-
-		public void setViewer(TableViewer viewer) {
-			this.viewer = viewer;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object,
-		 *      java.lang.String)
-		 */
-		public boolean canModify(Object element, String property) {
-			return enabled && ((MyModel) element).counter % 2 == 0;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object,
-		 *      java.lang.String)
-		 */
-		public Object getValue(Object element, String property) {
-			return ((MyModel) element).counter + "";
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object,
-		 *      java.lang.String, java.lang.Object)
-		 */
-		public void modify(Object element, String property, Object value) {
-			TableItem item = (TableItem) element;
-			((MyModel) item.getData()).counter = Integer.parseInt(value
-					.toString());
-			viewer.update(item.getData(), null);
-		}
-	}
-	
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public Snippet021CellEditorsOnDoubleClick(Shell shell) {
-		final Table table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
-		final MyCellModifier modifier = new MyCellModifier();
-		
-		table.addListener(SWT.MouseDown, new Listener() {
-
-			public void handleEvent(Event event) {
-				modifier.setEnabled(false);
-			}
-
-		});
-
-		final TableViewer v = new TableViewer(table);
-
-		table.addListener(SWT.MouseDoubleClick, new Listener() {
-
-			public void handleEvent(Event event) {
-				modifier.setEnabled(true);
-				TableItem[] selection = table.getSelection();
-
-				if (selection.length != 1) {
-					return;
-				}
-
-				TableItem item = table.getSelection()[0];
-
-				for (int i = 0; i < table.getColumnCount(); i++) {
-					if (item.getBounds(i).contains(event.x, event.y)) {
-						v.editElement(item.getData(), i);
-						modifier.setEnabled(false);
-						break;
-					}
-				}
-			}
-
-		});
-
-		modifier.setViewer(v);
-		
-		TableColumn column = new TableColumn(table, SWT.NONE);
-		column.setWidth(200);
-
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setCellModifier(modifier);
-		v.setColumnProperties(new String[] { "column1" });
-		v.setCellEditors(new CellEditor[] { new TextCellEditor(v.getTable()) });
-
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-
-		for (int i = 0; i < 10; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet021CellEditorsOnDoubleClick(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet022TableViewerRefreshNoScroll.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet022TableViewerRefreshNoScroll.java
deleted file mode 100644
index 744f526..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet022TableViewerRefreshNoScroll.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-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.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * A simple TableViewer to demonstrating how viewers could be refresh and
- * scrolling avoided in 3.2. In 3.3 implementors should consider using the
- * {@link StructuredViewer#refresh(boolean, boolean)} instead.
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet022TableViewerRefreshNoScroll {
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			ArrayList list = (ArrayList) inputElement;
-			list.add(new MyModel(list.size()));
-			return list.toArray();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public Snippet022TableViewerRefreshNoScroll(Shell shell) {
-		shell.setLayout(new GridLayout(2, false));
-		final TableViewer v = new TableViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-
-		TableColumn column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setInput(createModel(100));
-		v.getTable().setLinesVisible(true);
-		v.getTable().setLayoutData(
-				new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
-
-		Button b = new Button(shell, SWT.PUSH);
-		b.setText("Refresh with Scrolling");
-		b.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				v.refresh();
-			}
-
-		});
-
-		b = new Button(shell, SWT.PUSH);
-		b.setText("Refresh with NO-Scrolling");
-		b.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				v.getTable().setTopIndex(0);
-				IStructuredSelection selection = (IStructuredSelection) v
-						.getSelection();
-				v.getTable().deselectAll();
-				v.refresh();
-				if (!selection.isEmpty()) {
-					int[] indices = new int[selection.size()];
-
-					Iterator it = selection.iterator();
-					TableItem[] items = v.getTable().getItems();
-					Object modelElement;
-
-					int counter = 0;
-					while (it.hasNext()) {
-						modelElement = it.next();
-						for (int i = 0; i < items.length; i++) {
-							if (items[i].getData() == modelElement) {
-								indices[counter++] = i;
-							}
-						}
-					}
-
-					if (counter < indices.length) {
-						System.arraycopy(items, 0, indices = new int[counter],
-								0, counter);
-					}
-
-					v.getTable().select(indices);
-				}
-			}
-
-		});
-	}
-
-	private ArrayList createModel(int size) {
-		ArrayList elements = new ArrayList();
-
-		for (int i = 0; i < size; i++) {
-			elements.add(new MyModel(i));
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		new Snippet022TableViewerRefreshNoScroll(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet024TableViewerExploreNewAPI.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet024TableViewerExploreNewAPI.java
deleted file mode 100644
index c6f1a46..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet024TableViewerExploreNewAPI.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Example usage of ITableLabelProvider using images and labels
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet024TableViewerExploreNewAPI {
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return (Person[]) inputElement;
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-	}
-
-	public class Person {
-		public String givenname;
-		public String surname;
-		public String email;
-
-		public Person(String givenname, String surname, String email) {
-			this.givenname = givenname;
-			this.surname = surname;
-			this.email = email;
-		}
-
-	}
-
-	protected abstract class AbstractEditingSupport extends EditingSupport {
-		private TextCellEditor editor;
-
-		public AbstractEditingSupport(TableViewer viewer) {
-			super(viewer);
-			this.editor = new TextCellEditor(viewer.getTable());
-		}
-
-		protected boolean canEdit(Object element) {
-			return true;
-		}
-
-		protected CellEditor getCellEditor(Object element) {
-			return editor;
-		}
-
-		protected void setValue(Object element, Object value) {
-			doSetValue(element, value);
-			getViewer().update(element, null);
-		}
-
-		protected abstract void doSetValue(Object element, Object value);
-	}
-
-	public Snippet024TableViewerExploreNewAPI(Shell shell) {
-		TableViewer v = new TableViewer(shell, SWT.BORDER | SWT.FULL_SELECTION);
-		v.setContentProvider(new MyContentProvider());
-
-		TableViewerColumn column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Givenname");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).givenname;
-			}
-		});
-
-		column.setEditingSupport(new AbstractEditingSupport(v) {
-
-			protected Object getValue(Object element) {
-				return ((Person) element).givenname;
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				((Person) element).givenname = value.toString();
-			}
-
-		});
-
-		column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Surname");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).surname;
-			}
-
-		});
-
-		column.setEditingSupport(new AbstractEditingSupport(v) {
-
-			protected Object getValue(Object element) {
-				return ((Person) element).surname;
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				((Person) element).surname = value.toString();
-			}
-
-		});
-
-		column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("E-Mail");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).email;
-			}
-
-		});
-
-		column.setEditingSupport(new AbstractEditingSupport(v) {
-
-			protected Object getValue(Object element) {
-				return ((Person) element).email;
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				((Person) element).email = value.toString();
-			}
-
-		});
-
-		Person[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-	}
-
-	private Person[] createModel() {
-		Person[] elements = new Person[4];
-		elements[0] = new Person("Tom", "Schindl",
-				"tom.schindl@bestsolution.at");
-		elements[1] = new Person("Boris", "Bokowski",
-				"Boris_Bokowski@ca.ibm.com");
-		elements[2] = new Person("Tod", "Creasey", "Tod_Creasey@ca.ibm.com");
-		elements[3] = new Person("Wayne", "Beaton", "wayne@eclipse.org");
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet024TableViewerExploreNewAPI(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet025TabEditing.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet025TabEditing.java
deleted file mode 100644
index 3dc21a8..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet025TabEditing.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewerEditor;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * Edit cell values in a table
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet025TabEditing {
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[])inputElement;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			
-		}
-		
-	}
-	
-	public class MyModel {
-		public int counter;
-		
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-		
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-	
-	public Snippet025TabEditing(Shell shell) {
-		final TableViewer v = new TableViewer(shell,SWT.BORDER|SWT.FULL_SELECTION);
-		TableColumn tc = new TableColumn(v.getTable(),SWT.NONE);
-		tc.setWidth(100);
-		tc.setText("Column 1");
-		
-		tc = new TableColumn(v.getTable(),SWT.NONE);
-		tc.setWidth(200);
-		tc.setText("Column 2");
-		
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setCellModifier(new ICellModifier() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
-			 */
-			public boolean canModify(Object element, String property) {
-				return ((MyModel)element).counter % 2 == 0;
-			}
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
-			 */
-			public Object getValue(Object element, String property) {
-				return ((MyModel)element).counter + "";
-			}
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
-			 */
-			public void modify(Object element, String property, Object value) {
-				TableItem item = (TableItem)element;
-				((MyModel)item.getData()).counter = Integer.parseInt(value.toString());
-				v.update(item.getData(), null);
-			}
-			
-		});
-		
-		v.setColumnProperties(new String[] { "column1", "column2" });
-		v.setCellEditors(new CellEditor[] { new TextCellEditor(v.getTable()), new TextCellEditor(v.getTable()) });
-		TableViewerEditor.create(v,new ColumnViewerEditorActivationStrategy(v),ColumnViewerEditor.TABBING_HORIZONTAL|ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR|ColumnViewerEditor.TABBING_VERTICAL);
-		
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-	}
-	
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-		
-		for( int i = 0; i < 10; i++ ) {
-			elements[i] = new MyModel(i);
-		}
-		
-		return elements;
-	}
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display ();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet025TabEditing(shell);
-		shell.open ();
-		
-		while (!shell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-		
-		display.dispose ();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet026TreeViewerTabEditing.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet026TreeViewerTabEditing.java
deleted file mode 100644
index 4f2900e..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet026TreeViewerTabEditing.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeViewerFocusCellManager;
-import org.eclipse.jface.viewers.TreeViewerEditor;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.TreeViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A simple TreeViewer to demonstrate usage
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet026TreeViewerTabEditing {
-	public Snippet026TreeViewerTabEditing(final Shell shell) {
-		Button b = new Button(shell,SWT.PUSH);
-		b.setText("Remove column");
-		final TreeViewer v = new TreeViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		v.getTree().setLinesVisible(true);
-		v.getTree().setHeaderVisible(true);
-		b.addSelectionListener(new SelectionListener() {
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				v.getTree().getColumn(1).dispose();
-			}
-			
-		});
-				 
-		TreeViewerFocusCellManager focusCellManager = new TreeViewerFocusCellManager(v,new FocusCellOwnerDrawHighlighter(v));
-		ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(v) {
-			protected boolean isEditorActivationEvent(
-					ColumnViewerEditorActivationEvent event) {
-				return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
-						|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
-						|| (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR)
-						|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
-			}
-		};
-		
-		TreeViewerEditor.create(v, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL
-				| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
-				| ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
-		
-		final TextCellEditor textCellEditor = new TextCellEditor(v.getTree());
-
-		TreeViewerColumn column = new TreeViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setMoveable(true);
-		column.getColumn().setText("Column 1");
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return "Column 1 => " + element.toString();
-			}
-
-		});
-		column.setEditingSupport(new EditingSupport(v) {
-			protected boolean canEdit(Object element) {
-				return false;
-			}
-
-			protected CellEditor getCellEditor(Object element) {
-				return textCellEditor;
-			}
-
-			protected Object getValue(Object element) {
-				return ((MyModel) element).counter + "";
-			}
-
-			protected void setValue(Object element, Object value) {
-				((MyModel) element).counter = Integer
-						.parseInt(value.toString());
-				v.update(element, null);
-			}
-		});
-
-		column = new TreeViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setMoveable(true);
-		column.getColumn().setText("Column 2");
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return "Column 2 => " + element.toString();
-			}
-
-		});
-		column.setEditingSupport(new EditingSupport(v) {
-			protected boolean canEdit(Object element) {
-				return true;
-			}
-
-			protected CellEditor getCellEditor(Object element) {
-				return textCellEditor;
-			}
-
-			protected Object getValue(Object element) {
-				return ((MyModel) element).counter + "";
-			}
-
-			protected void setValue(Object element, Object value) {
-				((MyModel) element).counter = Integer
-						.parseInt(value.toString());
-				v.update(element, null);
-			}
-		});
-		
-		column = new TreeViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setMoveable(true);
-		column.getColumn().setText("Column 3");
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return "Column 3 => " + element.toString();
-			}
-
-		});
-		column.setEditingSupport(new EditingSupport(v) {
-			protected boolean canEdit(Object element) {
-				return true;
-			}
-
-			protected CellEditor getCellEditor(Object element) {
-				return textCellEditor;
-			}
-
-			protected Object getValue(Object element) {
-				return ((MyModel) element).counter + "";
-			}
-
-			protected void setValue(Object element, Object value) {
-				((MyModel) element).counter = Integer
-						.parseInt(value.toString());
-				v.update(element, null);
-			}
-		});
-		
-		v.setContentProvider(new MyContentProvider());
-
-		v.setInput(createModel());
-	}
-
-	private MyModel createModel() {
-
-		MyModel root = new MyModel(0, null);
-		root.counter = 0;
-
-		MyModel tmp;
-		MyModel subItem;
-		for (int i = 1; i < 10; i++) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for (int j = 1; j < i; j++) {
-				subItem = new MyModel(j, tmp);
-				subItem.child.add(new MyModel(j * 100, subItem));
-				tmp.child.add(subItem);
-			}
-		}
-
-		return root;
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet026TreeViewerTabEditing(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-
-	private class MyContentProvider implements ITreeContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return ((MyModel) inputElement).child.toArray();
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-		public Object[] getChildren(Object parentElement) {
-			return getElements(parentElement);
-		}
-
-		public Object getParent(Object element) {
-			if (element == null) {
-				return null;
-			}
-			return ((MyModel) element).parent;
-		}
-
-		public boolean hasChildren(Object element) {
-			return ((MyModel) element).child.size() > 0;
-		}
-
-	}
-
-	public class MyModel {
-		public MyModel parent;
-
-		public ArrayList child = new ArrayList();
-
-		public int counter;
-
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if (parent != null) {
-				rv = parent.toString() + ".";
-			}
-
-			rv += counter;
-
-			return rv;
-		}
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet027ComboBoxCellEditors.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet027ComboBoxCellEditors.java
deleted file mode 100644
index ba3204b..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet027ComboBoxCellEditors.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *     Dinko Ivanov - bug 164365
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * This snippet represents usage of the ComboBoxCell-Editor
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet027ComboBoxCellEditors {
-	private class MyCellModifier implements ICellModifier {
-
-		private TableViewer viewer;
-
-		public MyCellModifier(TableViewer viewer) {
-			this.viewer = viewer;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object,
-		 *      java.lang.String)
-		 */
-		public boolean canModify(Object element, String property) {
-			return true;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object,
-		 *      java.lang.String)
-		 */
-		public Object getValue(Object element, String property) {
-			// We need to calculate back to the index
-			return new Integer(((MyModel) element).counter / 10);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object,
-		 *      java.lang.String, java.lang.Object)
-		 */
-		public void modify(Object element, String property, Object value) {
-			TableItem item = (TableItem) element;
-			// We get the index and need to calculate the real value
-			((MyModel) item.getData()).counter = ((Integer) value).intValue() * 10;
-			viewer.update(item.getData(), null);
-		}
-	}
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public Snippet027ComboBoxCellEditors(Shell shell) {
-		final Table table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
-		final TableViewer v = new TableViewer(table);
-		final MyCellModifier modifier = new MyCellModifier(v);
-
-		TableColumn column = new TableColumn(table, SWT.NONE);
-		column.setWidth(200);
-
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setCellModifier(modifier);
-		v.setColumnProperties(new String[] { "column1" });
-		v.setCellEditors(new CellEditor[] { new ComboBoxCellEditor(
-				v.getTable(), new String[] { "Zero", "Ten", "Twenty", "Thirty",
-						"Fourty", "Fifty", "Sixty", "Seventy", "Eighty",
-						"Ninety" }) });
-
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-
-		for (int i = 0; i < 10; i++) {
-			elements[i] = new MyModel(i * 10);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet027ComboBoxCellEditors(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet029VirtualTableViewer.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet029VirtualTableViewer.java
deleted file mode 100644
index e3ece9c..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet029VirtualTableViewer.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A simple TableViewer to demonstrate the usage of a standard content provider
- * with a virtual table
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet029VirtualTableViewer {
-	private class MyContentProvider implements IStructuredContentProvider {
-		private MyModel[] elements;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return elements;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			this.elements = (MyModel[]) newInput;
-		}
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public Snippet029VirtualTableViewer(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.VIRTUAL);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setUseHashlookup(true);
-		MyModel[] model = createModel();
-		v.setInput(model);
-
-		v.getTable().setLinesVisible(true);
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10000];
-
-		for (int i = 0; i < 10000; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet029VirtualTableViewer(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet030VirtualLazyTableViewer.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet030VirtualLazyTableViewer.java
deleted file mode 100644
index 89f0443..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet030VirtualLazyTableViewer.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.ILazyContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A simple TableViewer to demonstrate usage of an ILazyContentProvider. You can
- * compare this snippet to the Snippet029VirtualTableViewer to see the small but
- * needed difference.
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet030VirtualLazyTableViewer {
-	private class MyContentProvider implements ILazyContentProvider {
-		private TableViewer viewer;
-		private MyModel[] elements;
-
-		public MyContentProvider(TableViewer viewer) {
-			this.viewer = viewer;
-		}
-
-		public void dispose() {
-
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			this.elements = (MyModel[]) newInput;
-		}
-
-		public void updateElement(int index) {
-			viewer.replace(elements[index], index);
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public Snippet030VirtualLazyTableViewer(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.VIRTUAL);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider(v));
-		v.setUseHashlookup(true);
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.setItemCount(model.length); // This is the difference when using a
-		// ILazyContentProvider
-
-		v.getTable().setLinesVisible(true);
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10000];
-
-		for (int i = 0; i < 10000; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet030VirtualLazyTableViewer(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet031TableViewerCustomTooltipsMultiSelection.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet031TableViewerCustomTooltipsMultiSelection.java
deleted file mode 100644
index 116b133..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet031TableViewerCustomTooltipsMultiSelection.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Adam Neal and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Adam Neal - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-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;
-
-/**
- * A simple TableViewer to demonstrate how custom tooltips could be created easily while preserving 
- * the multiple selection.
- * 
- * This is a modified example taken from Tom Schindl's Snippet023TreeViewerCustomTooltips.java
- * 
- * This code is for users pre 3.3 others could use newly added tooltip support in {@link CellLabelProvider}
-
- * @author Adam Neal <Adam_Neal@ca.ibm.com>
- * 
- */
-public class Snippet031TableViewerCustomTooltipsMultiSelection {
-	public class MyLableProvider implements ITableLabelProvider {
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			if (element instanceof MyModel) {
-				switch (columnIndex) {
-					case 0: return ((MyModel)element).col1;
-					case 1: return ((MyModel)element).col2;
-				}
-			}
-			return "";
-		}
-
-		public void addListener(ILabelProviderListener listener) {
-			/* Ignore */
-		}
-
-		public void dispose() {
-			/* Ignore */
-		}
-
-		public boolean isLabelProperty(Object element, String property) {
-			return false;
-		}
-
-		public void removeListener(ILabelProviderListener listener) {
-			/* Ignore */
-		}
-		
-	}
-	
-	public class MyModel {
-		public String col1, col2;
-
-		public MyModel(String c1, String c2) {
-			col1 = c1;
-			col2 = c2;
-		}
-		
-		public String toString() {
-			return col1 + col2;
-		}
-
-	}
-
-	public Snippet031TableViewerCustomTooltipsMultiSelection(Shell shell) {
-		final Table table = new Table(shell, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
-		table.setHeaderVisible(true);
-        table.setLinesVisible(true);
-        
-		final TableViewer v = new TableViewer(table);
-		TableColumn tableColumn1 = new TableColumn(table, SWT.NONE);
-		TableColumn tableColumn2 = new TableColumn(table, SWT.NONE);
-		
-		String column1 = "Column 1", column2 = "Column 2";
-		/* Setup the table  columns */
-        tableColumn1.setText(column1);
-        tableColumn2.setText(column2);
-        tableColumn1.pack();
-        tableColumn2.pack();
-        
-        v.setColumnProperties(new String[] { column1, column2 });
-		v.setLabelProvider(new MyLableProvider());
-		v.setContentProvider(new ArrayContentProvider());
-		v.setInput(createModel());
-		
-		/**
-	     * The listener that gets added to the table.  This listener is responsible for creating the tooltips
-	     * when hovering over a cell item. This listener will listen for the following events:
-	     *  <li>SWT.KeyDown		- to remove the tooltip</li>
-	     *  <li>SWT.Dispose		- to remove the tooltip</li>
-	     *  <li>SWT.MouseMove	- to remove the tooltip</li>
-	     *  <li>SWT.MouseHover	- to set the tooltip</li>
-	     */
-	    Listener tableListener = new Listener () {
-	    	Shell tooltip = null;
-	    	Label label = null;
-	    	
-	    	/*
-	    	 * (non-Javadoc)
-	    	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	    	 */
-	    	public void handleEvent (Event event) {
-			   switch (event.type) {
-				   	case SWT.KeyDown:
-				   	case SWT.Dispose:
-				   	case SWT.MouseMove: {
-				   		if (tooltip == null) break;
-				   		tooltip.dispose ();
-				   		tooltip = null;
-				   		label = null;
-				   		break;
-				   	}
-				   	case SWT.MouseHover: {
-				   		Point coords = new Point(event.x, event.y);
-						TableItem item = table.getItem(coords);
-				   		if (item != null) {
-				   			int columnCount = table.getColumnCount();
-							for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {
-				   				if (item.getBounds(columnIndex).contains(coords)) {
-				   					/* Dispose of the old tooltip (if one exists */
-				   					if (tooltip != null  && !tooltip.isDisposed ()) tooltip.dispose ();
-				   					
-				   					/* Create a new Tooltip */
-				   					tooltip = new Shell (table.getShell(), SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
-				   					tooltip.setBackground (table.getDisplay().getSystemColor (SWT.COLOR_INFO_BACKGROUND));
-				   					FillLayout layout = new FillLayout ();
-				   					layout.marginWidth = 2;
-				   					tooltip.setLayout (layout);
-				   					label = new Label (tooltip, SWT.NONE);
-				   					label.setForeground (table.getDisplay().getSystemColor (SWT.COLOR_INFO_FOREGROUND));
-				   					label.setBackground (table.getDisplay().getSystemColor (SWT.COLOR_INFO_BACKGROUND));
-				   					
-				   					/* Store the TableItem with the label so we can pass the mouse event later */
-				   					label.setData ("_TableItem_", item);
-				   					
-				   					/* Set the tooltip text */
-			   						label.setText("Tooltip: " + item.getData() + " : " + columnIndex);
-			   						
-			   						/* Setup Listeners to remove the tooltip and transfer the received mouse events */
-				   					label.addListener (SWT.MouseExit, tooltipLabelListener);
-				   					label.addListener (SWT.MouseDown, tooltipLabelListener);
-				   					
-				   					/* Set the size and position of the tooltip */
-				   					Point size = tooltip.computeSize (SWT.DEFAULT, SWT.DEFAULT);
-				   					Rectangle rect = item.getBounds (columnIndex);
-				   					Point pt = table.toDisplay (rect.x, rect.y);
-				   					tooltip.setBounds (pt.x, pt.y, size.x, size.y);
-				   					
-				   					/* Show it */
-				   					tooltip.setVisible (true);
-				   					break;
-				   				}
-				   			}
-				   		}
-				   	}
-			   }
-	    	}
-		};
-		
-		table.addListener (SWT.Dispose, tableListener);
-		table.addListener (SWT.KeyDown, tableListener);
-		table.addListener (SWT.MouseMove, tableListener);
-		table.addListener (SWT.MouseHover, tableListener);
-	}
-	
-	   /**
-	    * This listener is added to the tooltip so that it can either dispose itself if the mouse
-	    * exits the tooltip or so it can pass the selection event through to the table.
-	    */
-	    final TooltipLabelListener tooltipLabelListener = new TooltipLabelListener();
-	    final class TooltipLabelListener implements Listener {
-	        private boolean isCTRLDown(Event e) {
-	        	return (e.stateMask & SWT.CTRL) != 0;
-	        }
-		   /*
-		    * (non-Javadoc)
-		    * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-		    */
-		   public void handleEvent (Event event) {
-			   Label label = (Label)event.widget;
-			   Shell shell = label.getShell ();
-			   switch (event.type) {
-				   	case SWT.MouseDown:	/* Handle a user Click */
-				   		/* Extract our Data */
-				   		Event e = new Event ();
-				   		e.item = (TableItem) label.getData ("_TableItem_");
-				   		Table table = ((TableItem) e.item).getParent();
-				   		
-				   		/* Construct the new Selection[] to show */
-				   		TableItem [] newSelection = null;
-				   		if (isCTRLDown(event)) {
-				   			/* We have 2 scenario's.  
-				   			 * 	1) We are selecting an already selected element - so remove it from the selected indices
-				   			 *  2) We are selecting a non-selected element - so add it to the selected indices
-				   			 */
-				   			TableItem[] sel = table.getSelection();
-				   			for (int i = 0; i < sel.length; ++i) {
-				   				if (e.item.equals(sel[i])) {
-				   					// We are de-selecting this element
-				   					newSelection = new TableItem[sel.length - 1];
-				   					System.arraycopy(sel, 0, newSelection, 0, i);
-				   					System.arraycopy(sel, i+1, newSelection, i, sel.length - i - 1);
-				   					break;
-				   				}
-		   					}
-				   			
-				   			/*
-				   			 * If we haven't created the newSelection[] yet, than we are adding the newly selected element
-				   			 * into the list of selected indicies
-				   			 */
-				   			if (newSelection == null) {
-				   				newSelection = new TableItem[sel.length + 1];
-				   				System.arraycopy(sel, 0, newSelection, 0, sel.length);
-				   				newSelection[sel.length] = (TableItem) e.item;
-				   			}
-				   			
-				   		} else {
-				   			/* CTRL is not down, so we simply select the single element */
-				   			newSelection = new TableItem[] { (TableItem) e.item };
-				   		}
-				   		/* Set the new selection of the table and notify the listeners */
-				   		table.setSelection (newSelection);
-				   		table.notifyListeners (SWT.Selection, e);
-				   		
-				   		/* Remove the Tooltip */
-				   		shell.dispose ();
-				   		table.setFocus();
-				   		break;
-				   	case SWT.MouseExit:
-				   		shell.dispose ();
-				   		break;
-			   }
-	    }};
-	    	
-	    
-		
-	private List createModel() {
-		ArrayList list = new ArrayList();
-		list.add(new MyModel("A", "B"));
-		list.add(new MyModel("C", "D"));
-		list.add(new MyModel("E", "F"));
-		return list;
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet031TableViewerCustomTooltipsMultiSelection(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet032TableTreeViewer.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet032TableTreeViewer.java
deleted file mode 100644
index ae135ac..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet032TableTreeViewer.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.ITableColorProvider;
-import org.eclipse.jface.viewers.ITableFontProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableTreeViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * A simple TreeViewer to demonstrate usage
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet032TableTreeViewer {
-	private class MyContentProvider implements ITreeContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return ((MyModel) inputElement).child.toArray();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			return getElements(parentElement);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			if (element == null) {
-				return null;
-			}
-
-			return ((MyModel) element).parent;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-			return ((MyModel) element).child.size() > 0;
-		}
-
-	}
-
-	public class MyModel {
-		public MyModel parent;
-
-		public ArrayList child = new ArrayList();
-
-		public int counter;
-
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if (parent != null) {
-				rv = parent.toString() + ".";
-			}
-
-			rv += counter;
-
-			return rv;
-		}
-	}
-
-	public class MyLabelProvider extends LabelProvider implements
-			ITableLabelProvider, ITableFontProvider, ITableColorProvider {
-		FontRegistry registry = new FontRegistry();
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return "Column " + columnIndex + " => " + element.toString();
-		}
-
-		public Font getFont(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 0) {
-				return registry.getBold(Display.getCurrent().getSystemFont()
-						.getFontData()[0].getName());
-			}
-			return null;
-		}
-
-		public Color getBackground(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 0) {
-				return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
-			}
-			return null;
-		}
-
-		public Color getForeground(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 1) {
-				return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
-			}
-			return null;
-		}
-
-	}
-	
-	private class MyModifier implements ICellModifier {
-		private TableTreeViewer v;
-		
-		public MyModifier(TableTreeViewer v) {
-			this.v = v;
-		}
-		
-		public boolean canModify(Object element, String property) {
-			return true;
-		}
-
-		public Object getValue(Object element, String property) {
-			return ((MyModel)element).counter + "";
-		}
-
-		public void modify(Object element, String property, Object value) {
-			((MyModel)((Item)element).getData()).counter = Integer.parseInt(value.toString());
-			v.update(((Item)element).getData(), null);
-		}
-		
-	}
-
-	public Snippet032TableTreeViewer(Shell shell) {
-		final TableTreeViewer v = new TableTreeViewer(shell, SWT.FULL_SELECTION);
-		
-		TableColumn column = new TableColumn(v.getTableTree().getTable(),SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 1");
-		
-		column = new TableColumn(v.getTableTree().getTable(),SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 2");
-		
-		v.getTableTree().getTable().setHeaderVisible(true);
-		v.getTableTree().getTable().setLinesVisible(true);
-		
-		v.setCellEditors(new CellEditor[] { new TextCellEditor(v.getTableTree().getTable()), new TextCellEditor(v.getTableTree().getTable()) });
-		v.setColumnProperties(new String[] { "column1", "column2" });
-		v.setCellModifier(new MyModifier(v));
-		
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setInput(createModel());
-	}
-
-	private MyModel createModel() {
-
-		MyModel root = new MyModel(0, null);
-		root.counter = 0;
-
-		MyModel tmp;
-		for (int i = 1; i < 10; i++) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for (int j = 1; j < i; j++) {
-				tmp.child.add(new MyModel(j, tmp));
-			}
-		}
-
-		return root;
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet032TableTreeViewer(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet033CellEditorPerRowPre33.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet033CellEditorPerRowPre33.java
deleted file mode 100644
index 7589284..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet033CellEditorPerRowPre33.java
+++ /dev/null
@@ -1,344 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CheckboxCellEditor;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.ICellEditorListener;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * Snippet to present editor different CellEditors within one column in 3.2
- * for 3.3 and above please use the new EditingSupport class
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet033CellEditorPerRowPre33 {
-	private class MyCellModifier implements ICellModifier {
-		
-		private TableViewer viewer;
-		
-		private boolean enabled = true;
-
-		public void setViewer(TableViewer viewer) {
-			this.viewer = viewer;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object,
-		 *      java.lang.String)
-		 */
-		public boolean canModify(Object element, String property) {
-			return true;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object,
-		 *      java.lang.String)
-		 */
-		public Object getValue(Object element, String property) {
-			if( element instanceof MyModel3 ) {
-				return new Boolean(((MyModel3)element).checked);
-			} else if( element instanceof MyModel2 ) {
-				return new Integer(((MyModel) element).counter);
-			} else {
-				return ((MyModel) element).counter + "";
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object,
-		 *      java.lang.String, java.lang.Object)
-		 */
-		public void modify(Object element, String property, Object value) {
-			TableItem item = (TableItem) element;
-			
-			if( item.getData() instanceof MyModel3 ) {
-				((MyModel3) item.getData()).checked=((Boolean)value).booleanValue();
-			} else {
-				((MyModel) item.getData()).counter = Integer.parseInt(value
-						.toString());
-			}
-			
-			viewer.update(item.getData(), null);
-		}
-	}
-	
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public class MyModel2 extends MyModel {
-
-		public MyModel2(int counter) {
-			super(counter);
-		}
-
-		public String toString() {
-			return "Special Item " + this.counter;
-		}
-	}
-	
-	public class MyModel3 extends MyModel {
-		public boolean checked;
-		
-		public MyModel3(int counter) {
-			super(counter);
-		}
-
-		public String toString() {
-			return "Special Item " + this.counter;
-		}
-	}
-	
-	
-	public class DelegatingEditor extends CellEditor {
-		
-		private StructuredViewer viewer;
-		
-		private CellEditor delegatingTextEditor;
-		
-		private CellEditor delegatingDropDownEditor;
-		
-		private CellEditor activeEditor;
-		
-		private CellEditor delegatingCheckBoxEditor;
-		
-		private class DelegatingListener implements ICellEditorListener {
-
-			public void applyEditorValue() {
-				fireApplyEditorValue();
-			}
-
-			public void cancelEditor() {
-				fireCancelEditor();
-			}
-
-			public void editorValueChanged(boolean oldValidState,
-					boolean newValidState) {
-				fireEditorValueChanged(oldValidState, newValidState);
-			}
-			
-		}
-		
-		public DelegatingEditor(StructuredViewer viewer, Composite parent) {
-			super(parent);
-			this.viewer = viewer;
-			DelegatingListener l = new DelegatingListener();
-			this.delegatingTextEditor = new TextCellEditor(parent);
-			this.delegatingTextEditor.addListener(l);
-			
-			String[] elements = new String[10];
-			
-			for (int i = 0; i < 10; i++) {
-				elements[i] = i+"";
-			}
-			
-			this.delegatingDropDownEditor = new ComboBoxCellEditor(parent,elements);
-			this.delegatingDropDownEditor.addListener(l);
-			
-			this.delegatingCheckBoxEditor = new CheckboxCellEditor(parent);
-			this.delegatingCheckBoxEditor.addListener(l);
-		}
-		
-		protected Control createControl(Composite parent) {
-			return null;
-		}
-
-		protected Object doGetValue() {
-			return activeEditor.getValue();
-		}
-
-		protected void doSetFocus() {
-			activeEditor.setFocus();
-		}
-
-		public void activate() {
-			if( activeEditor != null ) {
-				activeEditor.activate();
-			}
-		}
-
-		protected void doSetValue(Object value) {
-			
-			if( ((IStructuredSelection)this.viewer.getSelection()).getFirstElement() instanceof MyModel3 ) {
-				activeEditor = delegatingCheckBoxEditor;
-			} else if( ((IStructuredSelection)this.viewer.getSelection()).getFirstElement() instanceof MyModel2 ) {
-				activeEditor = delegatingDropDownEditor;
-			} else {
-				activeEditor = delegatingTextEditor;
-			}
-			
-			activeEditor.setValue(value);
-		}
-		
-		public void deactivate() {
-			if( activeEditor != null ) {
-				Control control = activeEditor.getControl();
-				if (control != null && !control.isDisposed()) {
-					control.setVisible(false);
-				}
-			}
-		}
-		
-		public void dispose() {
-			
-		}
-		
-		public Control getControl() {
-			return activeEditor.getControl();
-		}
-	}
-	
-	public Snippet033CellEditorPerRowPre33(Shell shell) {
-		final Table table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
-		final MyCellModifier modifier = new MyCellModifier();
-		
-		final TableViewer v = new TableViewer(table);
-		modifier.setViewer(v);
-		
-		TableColumn column = new TableColumn(table, SWT.NONE);
-		column.setWidth(200);
-
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setCellModifier(modifier);
-		v.setColumnProperties(new String[] { "column1" });
-		v.setCellEditors(new CellEditor[] { new DelegatingEditor(v,v.getTable()) });
-
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-	}
-
-	private class MyLabelProvider extends LabelProvider {
-		public Image getImage(Object element) {
-			if( element instanceof MyModel3 ) {
-				if( ((MyModel3)element).checked ) {
-					return JFaceResources.getImage("IMG_1");
-				} else {
-					return JFaceResources.getImage("IMG_2");
-				}
-				
-			}
-			return super.getImage(element);
-		}
-		
-	}
-	
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[30];
-
-		for (int i = 0; i < 10; i++) {
-			elements[i] = new MyModel3(i);
-		}
-		
-		for (int i = 0; i < 10; i++) {
-			elements[i+10] = new MyModel(i);
-		}
-
-		for (int i = 0; i < 10; i++) {
-			elements[i+20] = new MyModel2(i);
-		}
-		
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-		JFaceResources.getImageRegistry().put("IMG_1", ImageDescriptor.createFromURL(Snippet033CellEditorPerRowPre33.class.getClassLoader().getResource("org/eclipse/jface/snippets/dialogs/cancel.png")));
-		JFaceResources.getImageRegistry().put("IMG_2", ImageDescriptor.createFromURL(Snippet033CellEditorPerRowPre33.class.getClassLoader().getResource("org/eclipse/jface/snippets/dialogs/filesave.png")));
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet033CellEditorPerRowPre33(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet034CellEditorPerRowNewAPI.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet034CellEditorPerRowNewAPI.java
deleted file mode 100644
index 4dfacf2..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet034CellEditorPerRowNewAPI.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl<tom.schindl@bestsolution.at> - initial API and implementation
- *     Wayne Beaton - bug 185540
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-
-/**
- * Snippet to present editor different CellEditors within one column in 3.2
- * for 3.3 and above please use the new EditingSupport class
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet034CellEditorPerRowNewAPI {
-	private class MyEditingSupport extends EditingSupport {
-		private CellEditor textEditor;
-		
-		private CellEditor dropDownEditor;
-		
-		public MyEditingSupport(TableViewer viewer) {
-			super(viewer);
-			textEditor = new TextCellEditor(viewer.getTable());
-			
-			String[] elements = new String[10];
-			
-			for (int i = 0; i < 10; i++) {
-				elements[i] = i+"";
-			}
-			
-			dropDownEditor = new ComboBoxCellEditor(viewer.getTable(),elements);
-		}
-
-		protected boolean canEdit(Object element) {
-			return ((MyModel) element).counter % 2 == 0;
-		}
-
-		protected CellEditor getCellEditor(Object element) {
-			if( element instanceof MyModel2 ) {
-				return dropDownEditor;
-			} else {
-				return textEditor;
-			}
-		}
-
-		protected Object getValue(Object element) {
-			if( element instanceof MyModel2 ) {
-				return new Integer(((MyModel) element).counter);
-			} else {
-				return ((MyModel) element).counter + "";
-			}
-		}
-
-		protected void setValue(Object element, Object value) {
-			((MyModel)element).counter = Integer.parseInt(value.toString());
-			getViewer().update(element, null);
-		}
-		
-	}
-	
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public class MyModel2 extends MyModel {
-
-		public MyModel2(int counter) {
-			super(counter);
-		}
-
-		public String toString() {
-			return "Special Item " + this.counter;
-		}
-	}
-	
-	public Snippet034CellEditorPerRowNewAPI(Shell shell) {
-		final Table table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
-		
-		final TableViewer v = new TableViewer(table);
-		v.getTable().setLinesVisible(true);
-		
-		TableViewerColumn column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return element.toString();
-			}
-			
-		});
-		
-		column.setEditingSupport(new MyEditingSupport(v));
-		
-		v.setContentProvider(new MyContentProvider());
-		
-		MyModel[] model = createModel();
-		v.setInput(model);
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[20];
-
-		for (int i = 0; i < 10; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		for (int i = 0; i < 10; i++) {
-			elements[i+10] = new MyModel2(i);
-		}
-		
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet034CellEditorPerRowNewAPI(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet035TableCursorCellHighlighter.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet035TableCursorCellHighlighter.java
deleted file mode 100644
index 8500604..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet035TableCursorCellHighlighter.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableColorProvider;
-import org.eclipse.jface.viewers.ITableFontProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerEditor;
-import org.eclipse.jface.viewers.TableViewerFocusCellManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * Example usage of none mandatory interfaces of ITableFontProvider and
- * ITableColorProvider
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet035TableCursorCellHighlighter {
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public static boolean flag = true;
-	
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public class MyLabelProvider extends LabelProvider implements
-			ITableLabelProvider, ITableFontProvider, ITableColorProvider {
-		FontRegistry registry = new FontRegistry();
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return "Column " + columnIndex + " => " + element.toString();
-		}
-
-		public Font getFont(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 0) {
-				return registry.getBold(Display.getCurrent().getSystemFont()
-						.getFontData()[0].getName());
-			}
-			return null;
-		}
-
-		public Color getBackground(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 0) {
-				return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
-			}
-			return null;
-		}
-
-		public Color getForeground(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 1) {
-				return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
-			}
-			return null;
-		}
-
-	}
-
-	public Snippet035TableCursorCellHighlighter(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER|SWT.HIDE_SELECTION|SWT.FULL_SELECTION);
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-
-		v.setCellEditors(new CellEditor[] { new TextCellEditor(v.getTable()), new TextCellEditor(v.getTable()) });
-		v.setCellModifier(new ICellModifier() {
-
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return "Column " + property + " => " + element.toString();
-			}
-
-			public void modify(Object element, String property, Object value) {
-				
-			}
-			
-		});
-		
-		v.setColumnProperties(new String[] {"1","2"});
-		
-		TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(v,new CursorCellHighlighter(v,new TableCursor(v)));
-		ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(v) {
-			protected boolean isEditorActivationEvent(
-					ColumnViewerEditorActivationEvent event) {
-				return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
-						|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
-						|| (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR)
-						|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
-			}
-		};
-		
-		TableViewerEditor.create(v, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL
-				| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
-				| ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
-
-		
-		TableColumn column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 1");
-
-		column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 2");
-
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-
-		for (int i = 0; i < 10; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet035TableCursorCellHighlighter(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet036FocusBorderCellHighlighter.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet036FocusBorderCellHighlighter.java
deleted file mode 100644
index 043cb28..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet036FocusBorderCellHighlighter.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableColorProvider;
-import org.eclipse.jface.viewers.ITableFontProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerEditor;
-import org.eclipse.jface.viewers.TableViewerFocusCellManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * Example of a different focus cell rendering with a simply focus border
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet036FocusBorderCellHighlighter {
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public static boolean flag = true;
-	
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public class MyLabelProvider extends LabelProvider implements
-			ITableLabelProvider, ITableFontProvider, ITableColorProvider {
-		FontRegistry registry = new FontRegistry();
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return "Column " + columnIndex + " => " + element.toString();
-		}
-
-		public Font getFont(Object element, int columnIndex) {
-			return null;
-		}
-
-		public Color getBackground(Object element, int columnIndex) {
-			return null;
-		}
-
-		public Color getForeground(Object element, int columnIndex) {
-			return null;
-		}
-
-	}
-
-	public Snippet036FocusBorderCellHighlighter(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER|SWT.FULL_SELECTION);
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-
-		v.setCellEditors(new CellEditor[] { new TextCellEditor(v.getTable()), new TextCellEditor(v.getTable()), new TextCellEditor(v.getTable()) });
-		v.setCellModifier(new ICellModifier() {
-
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return "Column " + property + " => " + element.toString();
-			}
-
-			public void modify(Object element, String property, Object value) {
-				
-			}
-			
-		});
-		
-		v.setColumnProperties(new String[] {"1","2","3"});
-		
-		TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(v,new FocusBorderCellHighlighter(v));
-		ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(v) {
-			protected boolean isEditorActivationEvent(
-					ColumnViewerEditorActivationEvent event) {
-				return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
-						|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
-						|| (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR)
-						|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
-			}
-		};
-		
-		TableViewerEditor.create(v, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL
-				| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
-				| ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
-
-		
-		TableColumn column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setMoveable(true);
-		column.setText("Column 1");
-
-		column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setMoveable(true);
-		column.setText("Column 2");
-
-		column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setMoveable(true);
-		column.setText("Column 3");
-
-		
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-
-		for (int i = 0; i < 10; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet036FocusBorderCellHighlighter(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet037FancyCustomTooltips.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet037FancyCustomTooltips.java
deleted file mode 100644
index fffecdd..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet037FancyCustomTooltips.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *     IBM - Improvement for Bug 159625 [Snippets] Update Snippet011CustomTooltips to reflect new API
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.CellLabelProvider;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.window.ToolTip;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FillLayout;
-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.Event;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Explore New API: JFace custom tooltips drawing.
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * @since 3.3
- */
-public class Snippet037FancyCustomTooltips {
-	private static class MyContentProvider implements
-			IStructuredContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return new String[] { "one", "two", "three", "four", "five", "six",
-					"seven", "eight", "nine", "ten" };
-		}
-
-		public void dispose() {
-
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-	}
-
-	private static class FancyToolTipSupport extends ColumnViewerToolTipSupport {
-
-		protected FancyToolTipSupport(ColumnViewer viewer, int style,
-				boolean manualActivation) {
-			super(viewer, style, manualActivation);
-		}
-		
-		
-		protected Composite createToolTipContentArea(Event event,
-				Composite parent) {
-			Composite comp = new Composite(parent,SWT.NONE);
-			GridLayout l = new GridLayout(1,false);
-			l.horizontalSpacing=0;
-			l.marginWidth=0;
-			l.marginHeight=0;
-			l.verticalSpacing=0;
-			
-			comp.setLayout(l);
-			Browser browser = new Browser(comp,SWT.BORDER);
-			browser.setText(getText(event));
-			browser.setLayoutData(new GridData(200,150));
-			
-			
-			return comp;
-		}
-
-		public boolean isHideOnMouseDown() {
-			return false;
-		}
-
-
-		public static final void enableFor(ColumnViewer viewer, int style) {
-			new FancyToolTipSupport(viewer,style,false);
-		}
-	}
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		final Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-
-		TableViewer v = new TableViewer(shell, SWT.FULL_SELECTION);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-		v.setContentProvider(new MyContentProvider());
-		FancyToolTipSupport.enableFor(v,ToolTip.NO_RECREATE);
-		
-		CellLabelProvider labelProvider = new CellLabelProvider() {
-
-			public String getToolTipText(Object element) {
-				return "<html><body>Tooltip (" + element + ")<br /><a href='http://www.bestsolution.at' target='_NEW'>www.bestsolution.at</a></body></html>";
-			}
-
-			public Point getToolTipShift(Object object) {
-				return new Point(5, 5);
-			}
-
-			public int getToolTipDisplayDelayTime(Object object) {
-				return 2000;
-			}
-
-			public int getToolTipTimeDisplayed(Object object) {
-				return 5000;
-			}
-
-			public void update(ViewerCell cell) {
-				cell.setText(cell.getElement().toString());
-			}
-		};
-
-		TableViewerColumn column = new TableViewerColumn(v, SWT.NONE);
-		column.setLabelProvider(labelProvider);
-		column.getColumn().setText("Column 1");
-		column.getColumn().setWidth(100);
-
-		v.setInput("");
-
-		shell.setSize(200, 200);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch()) {
-				display.sleep();
-			}
-		}
-
-		display.dispose();
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet038TreeViewerInlinelEditingOldAPI.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet038TreeViewerInlinelEditingOldAPI.java
deleted file mode 100644
index 3c9b518..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet038TreeViewerInlinelEditingOldAPI.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- * A simple TreeViewer to demonstrate usage of inline editing
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet038TreeViewerInlinelEditingOldAPI {
-	private class MyContentProvider implements ITreeContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return ((MyModel) inputElement).child.toArray();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			return getElements(parentElement);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			if (element == null) {
-				return null;
-			}
-
-			return ((MyModel) element).parent;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-			return ((MyModel) element).child.size() > 0;
-		}
-
-	}
-
-	public class MyModel {
-		public MyModel parent;
-
-		public ArrayList child = new ArrayList();
-
-		public int counter;
-
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if (parent != null) {
-				rv = parent.toString() + ".";
-			}
-
-			rv += counter;
-
-			return rv;
-		}
-	}
-
-	public class MyLabelProvider extends LabelProvider implements
-			ITableLabelProvider {
-		FontRegistry registry = new FontRegistry();
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return "Column " + columnIndex + " => " + element.toString();
-		}
-	}
-
-	public Snippet038TreeViewerInlinelEditingOldAPI(Shell shell) {
-		final TreeViewer v = new TreeViewer(shell,SWT.FULL_SELECTION);
-		
-		TreeColumn column = new TreeColumn(v.getTree(),SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 1");
-		
-		column = new TreeColumn(v.getTree(),SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 2");
-		
-		v.setCellEditors(new CellEditor[]{new TextCellEditor(v.getTree()), new TextCellEditor(v.getTree())});
-		v.setColumnProperties(new String[]{"col1","col2"});
-		v.setCellModifier(new ICellModifier() {
-
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return ((MyModel)element).counter+"";
-			}
-
-			public void modify(Object element, String property, Object value) {
-				((MyModel)((TreeItem)element).getData()).counter = Integer.parseInt(value.toString());
-				v.update(((TreeItem)element).getData(), null);
-			}
-			
-		});
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setInput(createModel());
-	}
-
-	private MyModel createModel() {
-
-		MyModel root = new MyModel(0, null);
-		root.counter = 0;
-
-		MyModel tmp;
-		for (int i = 1; i < 10; i++) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for (int j = 1; j < i; j++) {
-				tmp.child.add(new MyModel(j, tmp));
-			}
-		}
-
-		return root;
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet038TreeViewerInlinelEditingOldAPI(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet039ListViewer.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet039ListViewer.java
deleted file mode 100644
index 6dd8f73..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet039ListViewer.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Demonstrate a simple ListViewer
- */
-public class Snippet039ListViewer {
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[])inputElement;
-		}
-
-		public void dispose() {
-			
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			
-		}
-		
-	}
-	
-	public class MyModel {
-		public int counter;
-		
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-		
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-	
-	public Snippet039ListViewer(Shell shell) {
-		final ListViewer v = new ListViewer(shell,SWT.H_SCROLL|SWT.V_SCROLL);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		MyModel[] model = createModel();
-		v.setInput(model);	
-	}
-	
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-		
-		for( int i = 0; i < 10; i++ ) {
-			elements[i] = new MyModel(i);
-		}
-		
-		return elements;
-	}
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display ();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet039ListViewer(shell);
-		shell.open ();
-		
-		while (!shell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-		
-		display.dispose ();
-
-	}
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet040TableViewerSorting.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet040TableViewerSorting.java
deleted file mode 100644
index 0aaf14b..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet040TableViewerSorting.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Example usage of ViewerComparator in tables to allow sorting
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet040TableViewerSorting {
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return (Person[]) inputElement;
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-	}
-
-	public class Person {
-		public String givenname;
-		public String surname;
-		public String email;
-
-		public Person(String givenname, String surname, String email) {
-			this.givenname = givenname;
-			this.surname = surname;
-			this.email = email;
-		}
-
-	}
-
-	protected abstract class AbstractEditingSupport extends EditingSupport {
-		private TextCellEditor editor;
-
-		public AbstractEditingSupport(TableViewer viewer) {
-			super(viewer);
-			this.editor = new TextCellEditor(viewer.getTable());
-		}
-
-		protected boolean canEdit(Object element) {
-			return true;
-		}
-
-		protected CellEditor getCellEditor(Object element) {
-			return editor;
-		}
-
-		protected void setValue(Object element, Object value) {
-			doSetValue(element, value);
-			getViewer().update(element, null);
-		}
-
-		protected abstract void doSetValue(Object element, Object value);
-	}
-
-	public Snippet040TableViewerSorting(Shell shell) {
-		TableViewer v = new TableViewer(shell, SWT.BORDER | SWT.FULL_SELECTION);
-		v.setContentProvider(new MyContentProvider());
-
-		TableViewerColumn column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Givenname");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).givenname;
-			}
-		});
-
-		column.setEditingSupport(new AbstractEditingSupport(v) {
-
-			protected Object getValue(Object element) {
-				return ((Person) element).givenname;
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				((Person) element).givenname = value.toString();
-			}
-
-		});
-		
-		ColumnViewerSorter cSorter = new ColumnViewerSorter(v,column) {
-
-			protected int doCompare(Viewer viewer, Object e1, Object e2) {
-				Person p1 = (Person) e1;
-				Person p2 = (Person) e2;
-				return p1.givenname.compareToIgnoreCase(p2.givenname);
-			}
-			
-		};
-
-		column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Surname");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).surname;
-			}
-
-		});
-
-		column.setEditingSupport(new AbstractEditingSupport(v) {
-
-			protected Object getValue(Object element) {
-				return ((Person) element).surname;
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				((Person) element).surname = value.toString();
-			}
-
-		});
-		
-		new ColumnViewerSorter(v,column) {
-
-			protected int doCompare(Viewer viewer, Object e1, Object e2) {
-				Person p1 = (Person) e1;
-				Person p2 = (Person) e2;
-				return p1.surname.compareToIgnoreCase(p2.surname);
-			}
-			
-		};
-
-		column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("E-Mail");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).email;
-			}
-
-		});
-
-		column.setEditingSupport(new AbstractEditingSupport(v) {
-
-			protected Object getValue(Object element) {
-				return ((Person) element).email;
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				((Person) element).email = value.toString();
-			}
-
-		});
-		
-		new ColumnViewerSorter(v,column) {
-
-			protected int doCompare(Viewer viewer, Object e1, Object e2) {
-				Person p1 = (Person) e1;
-				Person p2 = (Person) e2;
-				return p1.email.compareToIgnoreCase(p2.email);
-			}
-			
-		};
-
-		Person[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-		cSorter.setSorter(cSorter, ColumnViewerSorter.ASC);
-	}
-
-	private Person[] createModel() {
-		Person[] elements = new Person[4];
-		elements[0] = new Person("Tom", "Schindl",
-				"tom.schindl@bestsolution.at");
-		elements[1] = new Person("Boris", "Bokowski",
-				"Boris_Bokowski@ca.ibm.com");
-		elements[2] = new Person("Tod", "Creasey", "Tod_Creasey@ca.ibm.com");
-		elements[3] = new Person("Wayne", "Beaton", "wayne@eclipse.org");
-
-		return elements;
-	}
-
-	private static abstract class ColumnViewerSorter extends ViewerComparator {
-		public static final int ASC = 1;
-		
-		public static final int NONE = 0;
-		
-		public static final int DESC = -1;
-		
-		private int direction = 0;
-		
-		private TableViewerColumn column;
-		
-		private ColumnViewer viewer;
-		
-		public ColumnViewerSorter(ColumnViewer viewer, TableViewerColumn column) {
-			this.column = column;
-			this.viewer = viewer;
-			this.column.getColumn().addSelectionListener(new SelectionAdapter() {
-
-				public void widgetSelected(SelectionEvent e) {
-					if( ColumnViewerSorter.this.viewer.getComparator() != null ) {
-						if( ColumnViewerSorter.this.viewer.getComparator() == ColumnViewerSorter.this ) {
-							int tdirection = ColumnViewerSorter.this.direction;
-							
-							if( tdirection == ASC ) {
-								setSorter(ColumnViewerSorter.this, DESC);
-							} else if( tdirection == DESC ) {
-								setSorter(ColumnViewerSorter.this, NONE);
-							}
-						} else {
-							setSorter(ColumnViewerSorter.this, ASC);
-						}
-					} else {
-						setSorter(ColumnViewerSorter.this, ASC);
-					}
-				}
-			});
-		}
-		
-		public void setSorter(ColumnViewerSorter sorter, int direction) {
-			if( direction == NONE ) {
-				column.getColumn().getParent().setSortColumn(null);
-				column.getColumn().getParent().setSortDirection(SWT.NONE);
-				viewer.setComparator(null);
-			} else {
-				column.getColumn().getParent().setSortColumn(column.getColumn());
-				sorter.direction = direction;
-				
-				if( direction == ASC ) {
-					column.getColumn().getParent().setSortDirection(SWT.DOWN);
-				} else {
-					column.getColumn().getParent().setSortDirection(SWT.UP);
-				}
-				
-				if( viewer.getComparator() == sorter ) {
-					viewer.refresh();
-				} else {
-					viewer.setComparator(sorter);
-				}
-				
-			}
-		}
-
-		public int compare(Viewer viewer, Object e1, Object e2) {
-			return direction * doCompare(viewer, e1, e2);
-		}
-		
-		protected abstract int doCompare(Viewer viewer, Object e1, Object e2);
-	}
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet040TableViewerSorting(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet041TableViewerAlternatingColors.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet041TableViewerAlternatingColors.java
deleted file mode 100644
index a6337e4..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet041TableViewerAlternatingColors.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * Demonstrate alternating row colors using new Jace 3.3 API 
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet041TableViewerAlternatingColors {
-
-	private class MyContentProvider implements IStructuredContentProvider {
-		
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	private class OptimizedIndexSearcher {
-		private int lastIndex = 0;
-		
-		public boolean isEven(TableItem item) {
-			TableItem[] items = item.getParent().getItems();
-			
-			// 1. Search the next ten items
-			for( int i = lastIndex; i < items.length && lastIndex + 10 > i; i++ ) {
-				if( items[i] == item ) {
-					lastIndex = i;
-					return lastIndex % 2 == 0;
-				}
-			}
-			
-			// 2. Search the previous ten items
-			for( int i = lastIndex; i < items.length && lastIndex - 10 > i; i-- ) {
-				if( items[i] == item ) {
-					lastIndex = i;
-					return lastIndex % 2 == 0;
-				}
-			}
-			
-			// 3. Start from the beginning
-			for( int i = 0; i < items.length; i++ ) {
-				if( items[i] == item ) {
-					lastIndex = i;
-					return lastIndex % 2 == 0;
-				}
-			}
-		
-			return false;
-		}
-	}
-	
-	public Snippet041TableViewerAlternatingColors(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION|SWT.VIRTUAL);
-		v.setContentProvider(new MyContentProvider());
-
-		final OptimizedIndexSearcher searcher = new OptimizedIndexSearcher();
-		
-		TableViewerColumn column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Column 1");
-		column.setLabelProvider(new ColumnLabelProvider() {
-			boolean even = true;
-			
-			public Color getBackground(Object element) {
-				if( even ) {
-					return null;
-				} else {
-					return v.getTable().getDisplay().getSystemColor(SWT.COLOR_GRAY);
-				}
-			}
-			
-			public void update(ViewerCell cell) {
-				even = searcher.isEven((TableItem)cell.getItem());
-				super.update(cell);
-			}
-		});
-
-		column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Column 2");
-		column.setLabelProvider(new ColumnLabelProvider() {
-			boolean even = true;
-
-			public Color getBackground(Object element) {
-				if( even ) {
-					return null;
-				} else {
-					return v.getTable().getDisplay().getSystemColor(SWT.COLOR_GRAY);
-				}
-			}
-			
-			public void update(ViewerCell cell) {
-				even = searcher.isEven((TableItem)cell.getItem());
-				super.update(cell);
-			}
-			
-		});
-
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-		
-		final ViewerFilter filter = new ViewerFilter() {
-
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return ((MyModel)element).counter % 2 == 0;
-			}
-			
-		};
-		
-		Button b = new Button(shell,SWT.PUSH);
-		b.addSelectionListener(new SelectionAdapter() {
-			boolean b = true;
-			
-			public void widgetSelected(SelectionEvent e) {
-				if( b ) {
-					v.setFilters(new ViewerFilter[] {filter});
-					b = false;
-				} else {
-					v.setFilters(new ViewerFilter[0]);
-					b = true;
-				}
-			}
-			
-		});
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[100000];
-
-		for (int i = 0; i < 100000; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet041TableViewerAlternatingColors(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet042ToolTipSupportFor32API.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet042ToolTipSupportFor32API.java
deleted file mode 100644
index 6e84840..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet042ToolTipSupportFor32API.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.DefaultToolTip;
-import org.eclipse.jface.window.ToolTip;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * Example usage of ToolTips with the OLD viewer API but similar to
- * {@link ColumnViewerToolTipSupport}
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet042ToolTipSupportFor32API {
-	private static Image[] images;
-
-	private static class Cell {
-		private Item item;
-		private int index;
-
-		public Cell(Item item, int index) {
-			this.item = item;
-			this.index = index;
-		}
-
-		public Object getData() {
-			return item.getData();
-		}
-
-		public int hashCode() {
-			final int prime = 31;
-			int result = 1;
-			result = prime * result + index;
-			result = prime * result + ((item == null) ? 0 : item.hashCode());
-			return result;
-		}
-
-		public boolean equals(Object obj) {
-			if (this == obj)
-				return true;
-			if (obj == null)
-				return false;
-			if (getClass() != obj.getClass())
-				return false;
-			final Cell other = (Cell) obj;
-			if (index != other.index)
-				return false;
-			if (item == null) {
-				if (other.item != null)
-					return false;
-			} else if (!item.equals(other.item))
-				return false;
-			return true;
-		}
-
-	}
-
-	private static class ToolTipSupport extends DefaultToolTip {
-		private Cell cell;
-		private ColumnViewer viewer;
-
-		protected ToolTipSupport(ColumnViewer viewer, int style,
-				boolean manualActivation) {
-			super(viewer.getControl(), style, manualActivation);
-			this.viewer = viewer;
-		}
-
-		protected Object getToolTipArea(Event event) {
-			Table table = (Table) event.widget;
-			int columns = table.getColumnCount();
-			Point point = new Point(event.x, event.y);
-			TableItem item = table.getItem(point);
-
-			if (item != null) {
-				for (int i = 0; i < columns; i++) {
-					if (item.getBounds(i).contains(point)) {
-						this.cell = new Cell(item, i);
-						return cell;
-					}
-				}
-			}
-
-			return null;
-		}
-
-		protected Composite createToolTipContentArea(Event event,
-				Composite parent) {
-			Composite comp = new Composite(parent, SWT.NONE);
-			comp.setLayout(new FillLayout());
-			Button b = new Button(comp, SWT.PUSH);
-			b.setText(((ITableLabelProvider) viewer.getLabelProvider())
-					.getColumnText(cell.getData(), cell.index));
-			b.setImage(((ITableLabelProvider) viewer.getLabelProvider())
-					.getColumnImage(cell.getData(), cell.index));
-
-			return comp;
-		}
-
-		public static void enableFor(ColumnViewer viewer) {
-			new ToolTipSupport(viewer, ToolTip.NO_RECREATE, false);
-		}
-	}
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public class MyLabelProvider extends LabelProvider implements
-			ITableLabelProvider {
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			if (columnIndex == 1) {
-				return images[((MyModel) element).counter % 4];
-			}
-
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return "Column " + columnIndex + " => " + element.toString();
-		}
-
-	}
-
-	private static Image createImage(Display display, int red, int green,
-			int blue) {
-		Color color = new Color(display, red, green, blue);
-		Image image = new Image(display, 10, 10);
-		GC gc = new GC(image);
-		gc.setBackground(color);
-		gc.fillRectangle(0, 0, 10, 10);
-		gc.dispose();
-
-		return image;
-	}
-
-	public Snippet042ToolTipSupportFor32API(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-
-		TableColumn column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 1");
-
-		column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 2");
-
-		MyModel[] model = createModel();
-		v.setInput(model);
-		ToolTipSupport.enableFor(v);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-
-		for (int i = 0; i < 10; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		images = new Image[4];
-		images[0] = createImage(display, 0, 0, 255);
-		images[1] = createImage(display, 0, 255, 255);
-		images[2] = createImage(display, 0, 255, 0);
-		images[3] = createImage(display, 255, 0, 255);
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet042ToolTipSupportFor32API(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		for (int i = 0; i < images.length; i++) {
-			images[i].dispose();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet043NoColumnTreeViewerKeyboardEditing.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet043NoColumnTreeViewerKeyboardEditing.java
deleted file mode 100644
index 2f4bc5c..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet043NoColumnTreeViewerKeyboardEditing.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeViewerFocusCellManager;
-import org.eclipse.jface.viewers.TreeViewerEditor;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Demonstrates how to use keyboard-editing support in a TreeViewer with no column
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet043NoColumnTreeViewerKeyboardEditing {
-	public Snippet043NoColumnTreeViewerKeyboardEditing(final Shell shell) {
-		Button b = new Button(shell, SWT.PUSH);
-		b.setText("BBB");
-		final TreeViewer v = new TreeViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		b.addSelectionListener(new SelectionListener() {
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				MyModel root = (MyModel) v.getInput();
-				TreePath path = new TreePath(new Object[] { root,
-						root.child.get(1),
-						((MyModel) root.child.get(1)).child.get(0) });
-				v.editElement(path, 0);
-			}
-
-		});
-
-		v.setCellEditors(new CellEditor[] { new TextCellEditor(v.getTree()) });
-		v.setColumnProperties(new String[] { "col1" });
-		v.setCellModifier(new ICellModifier() {
-
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return ((MyModel) element).counter + "";
-			}
-
-			public void modify(Object element, String property, Object value) {
-				element = ((Item) element).getData();
-				((MyModel) element).counter = Integer
-						.parseInt(value.toString());
-				v.update(element, null);
-			}
-
-		});
-
-		TreeViewerFocusCellManager focusCellManager = new TreeViewerFocusCellManager(
-				v, new FocusCellOwnerDrawHighlighter(v));
-		ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(
-				v) {
-			protected boolean isEditorActivationEvent(
-					ColumnViewerEditorActivationEvent event) {
-				return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
-						|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
-						|| (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR)
-						|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
-			}
-		};
-
-		TreeViewerEditor.create(v, focusCellManager, actSupport,
-				ColumnViewerEditor.TABBING_HORIZONTAL
-						| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
-						| ColumnViewerEditor.TABBING_VERTICAL
-						| ColumnViewerEditor.KEYBOARD_ACTIVATION);
-
-		v.setContentProvider(new MyContentProvider());
-
-		v.setInput(createModel());
-	}
-
-	private MyModel createModel() {
-
-		MyModel root = new MyModel(0, null);
-		root.counter = 0;
-
-		MyModel tmp;
-		MyModel subItem;
-		for (int i = 1; i < 10; i++) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for (int j = 1; j < i; j++) {
-				subItem = new MyModel(j, tmp);
-				subItem.child.add(new MyModel(j * 100, subItem));
-				tmp.child.add(subItem);
-			}
-		}
-
-		return root;
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet043NoColumnTreeViewerKeyboardEditing(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-
-	private class MyContentProvider implements ITreeContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return ((MyModel) inputElement).child.toArray();
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-		public Object[] getChildren(Object parentElement) {
-			return getElements(parentElement);
-		}
-
-		public Object getParent(Object element) {
-			if (element == null) {
-				return null;
-			}
-			return ((MyModel) element).parent;
-		}
-
-		public boolean hasChildren(Object element) {
-			return ((MyModel) element).child.size() > 0;
-		}
-
-	}
-
-	public class MyModel {
-		public MyModel parent;
-
-		public ArrayList child = new ArrayList();
-
-		public int counter;
-
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if (parent != null) {
-				rv = parent.toString() + ".";
-			}
-
-			rv += counter;
-
-			return rv;
-		}
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet044NoColumnTableViewerKeyboardEditing.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet044NoColumnTableViewerKeyboardEditing.java
deleted file mode 100644
index 8ee4d93..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet044NoColumnTableViewerKeyboardEditing.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableColorProvider;
-import org.eclipse.jface.viewers.ITableFontProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerEditor;
-import org.eclipse.jface.viewers.TableViewerFocusCellManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Demonstrates how to use keyboard-editing support in a TableViewer with no column
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet044NoColumnTableViewerKeyboardEditing {
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public static boolean flag = true;
-	
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public class MyLabelProvider extends LabelProvider implements
-			ITableLabelProvider, ITableFontProvider, ITableColorProvider {
-		FontRegistry registry = new FontRegistry();
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return "Column " + columnIndex + " => " + element.toString();
-		}
-
-		public Font getFont(Object element, int columnIndex) {
-			return null;
-		}
-
-		public Color getBackground(Object element, int columnIndex) {
-			return null;
-		}
-
-		public Color getForeground(Object element, int columnIndex) {
-			return null;
-		}
-
-	}
-
-	public Snippet044NoColumnTableViewerKeyboardEditing(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER|SWT.FULL_SELECTION);
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-
-		v.setCellEditors(new CellEditor[] { new TextCellEditor(v.getTable()) });
-		v.setCellModifier(new ICellModifier() {
-
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return "Column " + property + " => " + element.toString();
-			}
-
-			public void modify(Object element, String property, Object value) {
-				
-			}
-			
-		});
-		
-		v.setColumnProperties(new String[] {"1"});
-		
-		TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(v,new FocusBorderCellHighlighter(v));
-		ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(v) {
-			protected boolean isEditorActivationEvent(
-					ColumnViewerEditorActivationEvent event) {
-				return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
-						|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
-						|| (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR)
-						|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
-			}
-		};
-		
-		TableViewerEditor.create(v, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL
-				| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
-				| ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
-
-
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-
-		for (int i = 0; i < 10; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet044NoColumnTableViewerKeyboardEditing(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet045TableViewerFillFromBackgroundThread.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet045TableViewerFillFromBackgroundThread.java
deleted file mode 100644
index c99ac34..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet045TableViewerFillFromBackgroundThread.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Timer;
-import java.util.TimerTask;
-
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableColorProvider;
-import org.eclipse.jface.viewers.ITableFontProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * Example how to fill a {@link TableViewer} from the background without
- * blocking the UI
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet045TableViewerFillFromBackgroundThread {
-	private static int COUNTER = 0;
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return ((List) inputElement).toArray();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public class MyLabelProvider extends LabelProvider implements
-			ITableLabelProvider, ITableFontProvider, ITableColorProvider {
-		FontRegistry registry = new FontRegistry();
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return "Column " + columnIndex + " => " + element.toString();
-		}
-
-		public Font getFont(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 0) {
-				return registry.getBold(Display.getCurrent().getSystemFont()
-						.getFontData()[0].getName());
-			}
-			return null;
-		}
-
-		public Color getBackground(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 0) {
-				return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
-			}
-			return null;
-		}
-
-		public Color getForeground(Object element, int columnIndex) {
-			if (((MyModel) element).counter % 2 == 1) {
-				return Display.getCurrent().getSystemColor(SWT.COLOR_RED);
-			}
-			return null;
-		}
-
-	}
-
-	public Snippet045TableViewerFillFromBackgroundThread(final Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-
-		TableColumn column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 1");
-
-		column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 2");
-
-		final ArrayList model = new ArrayList();
-		v.setInput(model);
-		v.setComparator(new ViewerComparator() {
-			public int compare(Viewer viewer, Object e1, Object e2) {
-				MyModel m1 = (MyModel) e1;
-				MyModel m2 = (MyModel) e2;
-				return m2.counter - m1.counter;
-			}
-
-		});
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-
-		TimerTask task = new TimerTask() {
-
-			public void run() {
-				shell.getDisplay().syncExec(new Runnable() {
-
-					public void run() {
-						MyModel el = new MyModel(++COUNTER);
-						v.add(el);
-						model.add(el);
-					}
-				});
-			}
-		};
-
-		Timer timer = new Timer(true);
-		timer.scheduleAtFixedRate(task, 1000, 1000);
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet045TableViewerFillFromBackgroundThread(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet046UpdateViewerFromBackgroundThread.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet046UpdateViewerFromBackgroundThread.java
deleted file mode 100644
index e8c7028..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet046UpdateViewerFromBackgroundThread.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * Example how to update a viewer from a long running task
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet046UpdateViewerFromBackgroundThread {
-	private static Image[] images;
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[])inputElement;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-		public boolean finished;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public class MyLabelProvider extends LabelProvider implements ITableLabelProvider {
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			if( columnIndex == 0 ) {
-				return images[((MyModel)element).finished?0:1];
-			}
-
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return "Column " + columnIndex + " => " + element.toString();
-		}
-
-	}
-
-	private static Image createImage(Display display, int red, int green, int blue) {
-		Color color = new Color(display,red,green,blue);
-		Image image = new Image(display,10,10);
-		GC gc = new GC(image);
-		gc.setBackground(color);
-		gc.fillRectangle(0, 0, 10, 10);
-		gc.dispose();
-
-		return image;
-	}
-
-	public Snippet046UpdateViewerFromBackgroundThread(Shell shell) {
-		final TableViewer v = new TableViewer(shell,SWT.BORDER|SWT.FULL_SELECTION);
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-
-		TableColumn column = new TableColumn(v.getTable(),SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 1");
-
-		column = new TableColumn(v.getTable(),SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 2");
-
-		final MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-
-		Button b = new Button(shell,SWT.PUSH);
-		b.setText("Start Long Task");
-		b.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				final Thread t = new Thread() {
-
-					public void run() {
-						for( int i = 0; i < model.length; i++ ) {
-							if( v.getTable().isDisposed()) {
-								return;
-							}
-							final int j = i;
-							v.getTable().getDisplay().asyncExec(new Runnable() {
-
-								public void run() {
-									model[j].finished = true;
-									v.update(model[j], null);
-								}
-
-							});
-							try {
-								Thread.sleep(1000);
-							} catch (InterruptedException e) {
-								e.printStackTrace();
-							}
-						}
-					}
-				};
-				t.start();
-			}
-		});
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-
-		for( int i = 0; i < 10; i++ ) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display ();
-
-		images = new Image[2];
-		images[0] = createImage(display,0,255,0);
-		images[1] = createImage(display,255,0,0);
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet046UpdateViewerFromBackgroundThread(shell);
-		shell.open ();
-
-		while (!shell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-
-		for( int i = 0; i < images.length; i++ ) {
-			images[i].dispose();
-		}
-
-		display.dispose ();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet047VirtualLazyTreeViewer.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet047VirtualLazyTreeViewer.java
deleted file mode 100644
index 77a44c9..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet047VirtualLazyTreeViewer.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.ILazyTreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A simple TreeViewer to demonstrate usage of an ILazyContentProvider.
- * 
- */
-public class Snippet047VirtualLazyTreeViewer {
-	private class MyContentProvider implements ILazyTreeContentProvider {
-		private TreeViewer viewer;
-		private IntermediateNode[] elements;
-
-		public MyContentProvider(TreeViewer viewer) {
-			this.viewer = viewer;
-		}
-
-		public void dispose() {
-
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			this.elements = (IntermediateNode[]) newInput;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ILazyTreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			if (element instanceof LeafNode)
-				return ((LeafNode) element).parent;
-			return elements;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ILazyTreeContentProvider#updateChildCount(java.lang.Object,
-		 *      int)
-		 */
-		public void updateChildCount(Object element, int currentChildCount) {
-			
-			int length = 0;
-			if (element instanceof IntermediateNode) {
-				IntermediateNode node = (IntermediateNode) element;
-				length =  node.children.length;
-			} 
-			if(element == elements)
-				length = elements.length;
-			viewer.setChildCount(element, length);
-			
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ILazyTreeContentProvider#updateElement(java.lang.Object,
-		 *      int)
-		 */
-		public void updateElement(Object parent, int index) {
-			
-			Object element;
-			if (parent instanceof IntermediateNode) 
-				element = ((IntermediateNode) parent).children[index];
-			
-			else
-				element =  elements[index];
-			viewer.replace(parent, index, element);
-			updateChildCount(element, -1);
-			
-		}
-
-	}
-
-	public class LeafNode {
-		public int counter;
-		public IntermediateNode parent;
-
-		public LeafNode(int counter, IntermediateNode parent) {
-			this.counter = counter;
-			this.parent = parent;
-		}
-
-		public String toString() {
-			return "Leaf " + this.counter;
-		}
-	}
-
-	public class IntermediateNode {
-		public int counter;
-		public LeafNode[] children = new LeafNode[0];
-
-		public IntermediateNode(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Node " + this.counter;
-		}
-
-		public void generateChildren(int i) {
-			children = new LeafNode[i];
-			for (int j = 0; j < i; j++) {
-				children[j] = new LeafNode(j, this);
-			}
-
-		}
-	}
-
-	public Snippet047VirtualLazyTreeViewer(Shell shell) {
-		final TreeViewer v = new TreeViewer(shell, SWT.VIRTUAL | SWT.BORDER);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider(v));
-		v.setUseHashlookup(true);
-		IntermediateNode[] model = createModel();
-		v.setInput(model);
-		v.getTree().setItemCount(model.length);
-
-	}
-
-	private IntermediateNode[] createModel() {
-		IntermediateNode[] elements = new IntermediateNode[10];
-
-		for (int i = 0; i < 10; i++) {
-			elements[i] = new IntermediateNode(i);
-			elements[i].generateChildren(1000);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet047VirtualLazyTreeViewer(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet048TreeViewerTabWithCheckboxFor3_3.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet048TreeViewerTabWithCheckboxFor3_3.java
deleted file mode 100644
index b6081df..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet048TreeViewerTabWithCheckboxFor3_3.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CheckboxCellEditor;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.TreeViewerEditor;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.TreeViewerColumn;
-import org.eclipse.jface.viewers.TreeViewerFocusCellManager;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.viewers.ViewerRow;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Demonstrate how to work-around 3.3.1 limitation when it comes to TAB-Traversal and
- * checkbox editors. 3.4 will hopefully provide provide an out-of-the-box fix see bug 198502
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet048TreeViewerTabWithCheckboxFor3_3 {
-	public Snippet048TreeViewerTabWithCheckboxFor3_3(final Shell shell) {
-		final TreeViewer v = new TreeViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		v.getTree().setLinesVisible(true);
-		v.getTree().setHeaderVisible(true);
-
-		final TreeViewerFocusCellManager mgr = new TreeViewerFocusCellManager(v,new FocusCellOwnerDrawHighlighter(v));
-		ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(v) {
-			protected boolean isEditorActivationEvent(
-					ColumnViewerEditorActivationEvent event) {
-				return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
-						|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
-						|| (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && ( event.keyCode == SWT.CR || event.character == ' ' ))
-						|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
-			}
-		};
-
-		TreeViewerEditor.create(v, mgr, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL
-				| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
-				| ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
-
-		final TextCellEditor textCellEditor = new TextCellEditor(v.getTree());
-		final CheckboxCellEditor checkboxCellEditor = new CheckboxCellEditor(v.getTree());
-
-		TreeViewerColumn column = new TreeViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setMoveable(true);
-		column.getColumn().setText("Column 1");
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return "Column 1 => " + element.toString();
-			}
-
-		});
-		column.setEditingSupport(new EditingSupport(v) {
-			protected boolean canEdit(Object element) {
-				return false;
-			}
-
-			protected CellEditor getCellEditor(Object element) {
-				return textCellEditor;
-			}
-
-			protected Object getValue(Object element) {
-				return ((MyModel) element).counter + "";
-			}
-
-			protected void setValue(Object element, Object value) {
-				((MyModel) element).counter = Integer
-						.parseInt(value.toString());
-				v.update(element, null);
-			}
-		});
-
-		column = new TreeViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setMoveable(true);
-		column.getColumn().setText("Column 2");
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return "Column 2 => " + element.toString();
-			}
-
-		});
-		column.setEditingSupport(new EditingSupport(v) {
-			protected boolean canEdit(Object element) {
-				return true;
-			}
-
-			protected CellEditor getCellEditor(Object element) {
-				return textCellEditor;
-			}
-
-			protected Object getValue(Object element) {
-				return ((MyModel) element).counter + "";
-			}
-
-			protected void setValue(Object element, Object value) {
-				((MyModel) element).counter = Integer
-				.parseInt(value.toString());
-				v.update(element, null);
-			}
-		});
-
-		column = new TreeViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setMoveable(true);
-		column.getColumn().setText("Column 3");
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((MyModel)element).bool + "";
-			}
-
-		});
-		column.setEditingSupport(new EditingSupport(v) {
-			protected boolean canEdit(Object element) {
-				return true;
-			}
-
-			protected CellEditor getCellEditor(Object element) {
-				return checkboxCellEditor;
-			}
-
-			protected Object getValue(Object element) {
-				return new Boolean(((MyModel) element).bool);
-			}
-
-			protected void setValue(Object element, Object value) {
-				((MyModel) element).bool = ((Boolean)value).booleanValue();
-				v.update(element, null);
-			}
-		});
-
-		v.setContentProvider(new MyContentProvider());
-		v.setInput(createModel());
-		v.getControl().addTraverseListener(new TraverseListener() {
-
-			public void keyTraversed(TraverseEvent e) {
-				if( (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) && mgr.getFocusCell().getColumnIndex() == 2 ) {
-					ColumnViewerEditor editor = v.getColumnViewerEditor();
-					ViewerCell cell = mgr.getFocusCell();
-
-					try {
-						Method m = ColumnViewerEditor.class.getDeclaredMethod("processTraverseEvent", new Class[] {int.class,ViewerRow.class,TraverseEvent.class});
-						m.setAccessible(true);
-						m.invoke(editor, new Object[] { new Integer(cell.getColumnIndex()), cell.getViewerRow(), e });
-					} catch (SecurityException e1) {
-						// TODO Auto-generated catch block
-						e1.printStackTrace();
-					} catch (NoSuchMethodException e1) {
-						// TODO Auto-generated catch block
-						e1.printStackTrace();
-					} catch (IllegalArgumentException e1) {
-						// TODO Auto-generated catch block
-						e1.printStackTrace();
-					} catch (IllegalAccessException e1) {
-						// TODO Auto-generated catch block
-						e1.printStackTrace();
-					} catch (InvocationTargetException e1) {
-						// TODO Auto-generated catch block
-						e1.printStackTrace();
-					}
-				}
-			}
-
-		});
-	}
-
-	private MyModel createModel() {
-
-		MyModel root = new MyModel(0, null);
-		root.counter = 0;
-
-		MyModel tmp;
-		MyModel subItem;
-		for (int i = 1; i < 10; i++) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for (int j = 1; j < i; j++) {
-				subItem = new MyModel(j, tmp);
-				subItem.child.add(new MyModel(j * 100, subItem));
-				tmp.child.add(subItem);
-			}
-		}
-
-		return root;
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet048TreeViewerTabWithCheckboxFor3_3(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-
-	private class MyContentProvider implements ITreeContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return ((MyModel) inputElement).child.toArray();
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-		public Object[] getChildren(Object parentElement) {
-			return getElements(parentElement);
-		}
-
-		public Object getParent(Object element) {
-			if (element == null) {
-				return null;
-			}
-			return ((MyModel) element).parent;
-		}
-
-		public boolean hasChildren(Object element) {
-			return ((MyModel) element).child.size() > 0;
-		}
-
-	}
-
-	public class MyModel {
-		public MyModel parent;
-
-		public ArrayList child = new ArrayList();
-
-		public int counter;
-
-		public boolean bool;
-
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if (parent != null) {
-				rv = parent.toString() + ".";
-			}
-
-			rv += counter;
-
-			return rv;
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet049StyledCellLabelProvider.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet049StyledCellLabelProvider.java
deleted file mode 100644
index 5c76c9f..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet049StyledCellLabelProvider.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Michael Krkoska - initial API and implementation (bug 188333)
- *******************************************************************************/
-package org.eclipse.jface.snippets.viewers;
-
-import java.io.File;
-import java.text.MessageFormat;
-
-import org.eclipse.jface.preference.JFacePreferences;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StyledCellLabelProvider;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.viewers.StyledString.Styler;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.TextStyle;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Using a {@link StyledCellLabelProvider} on table viewer.
- */
-
-public class Snippet049StyledCellLabelProvider {
-	
-	
-	private static final int SHELL_WIDTH= 400;
-	private static final Display DISPLAY= Display.getDefault();
-
-
-	public static void main(String[] args) {
-
-		JFaceResources.getColorRegistry().put(JFacePreferences.COUNTER_COLOR, new RGB(0,127,174));
-		
-		Shell shell= new Shell(DISPLAY, SWT.CLOSE | SWT.RESIZE);
-		shell.setSize(SHELL_WIDTH, 400);
-		shell.setLayout(new GridLayout(1, false));
-
-		Snippet049StyledCellLabelProvider example= new Snippet049StyledCellLabelProvider();
-		Control composite= example.createPartControl(shell);
-		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-		
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!DISPLAY.readAndDispatch()) {
-				DISPLAY.sleep();
-			}
-		}
-		DISPLAY.dispose();
-	}
-
-	public Snippet049StyledCellLabelProvider() {
-	}
-
-	public Composite createPartControl(Composite parent) {
-		Composite composite= new Composite(parent, SWT.NONE);
-
-		composite.setLayout(new GridLayout(1, true));
-
-		Label label= new Label(composite, SWT.NONE);
-		label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
-		label.setText("Viewer with a StyledCellLabelProvider:"); //$NON-NLS-1$
-		
-		final TableViewer tableViewer= new TableViewer(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-
-		// Multi-font support only works in JFace 3.5 and above (specifically, 3.5 M4 and above).
-		// With JFace 3.4, the font information (bold in this example) will be ignored.
-		FontData[] boldFontData= getModifiedFontData(tableViewer.getTable().getFont().getFontData(), SWT.BOLD);
-
-		Font boldFont = new Font(Display.getCurrent(), boldFontData);
-		ExampleLabelProvider labelProvider= new ExampleLabelProvider(boldFont);
-		FileSystemContentProvider contentProvider= new FileSystemContentProvider();
-		
-		tableViewer.setContentProvider(contentProvider);
-		tableViewer.setLabelProvider(labelProvider);
-
-		GridData data= new GridData(GridData.FILL, GridData.FILL, true, true);
-		tableViewer.getControl().setLayoutData(data);
-		tableViewer.setInput(new Object());
-
-		return composite;
-	}
-	
-	private static FontData[] getModifiedFontData(FontData[] originalData, int additionalStyle) {
-		FontData[] styleData = new FontData[originalData.length];
-		for (int i = 0; i < styleData.length; i++) {
-			FontData base = originalData[i];
-			styleData[i] = new FontData(base.getName(), base.getHeight(), base.getStyle() | additionalStyle);
-		}
-       	return styleData;
-    }
-	
-	private static class ExampleLabelProvider extends StyledCellLabelProvider {
-
-		private static int IMAGE_SIZE= 16;
-		private static final Image IMAGE1= new Image(DISPLAY, DISPLAY.getSystemImage(SWT.ICON_WARNING).getImageData().scaledTo(IMAGE_SIZE, IMAGE_SIZE));
-		private static final Image IMAGE2= new Image(DISPLAY, DISPLAY.getSystemImage(SWT.ICON_ERROR).getImageData().scaledTo(IMAGE_SIZE, IMAGE_SIZE));
-
-		private final Styler fBoldStyler; 
-		
-		public ExampleLabelProvider(final Font boldFont) {
-			fBoldStyler= new Styler() {
-				public void applyStyles(TextStyle textStyle) {
-					textStyle.font= boldFont;
-				}
-			};
-		}
-		
-		public void update(ViewerCell cell) {
-			Object element= cell.getElement();
-			
-			if (element instanceof File) {
-				File file= (File) element;
-				
-				// Multi-font support only works in JFace 3.5 and above (specifically, 3.5 M4 and above).
-				// With JFace 3.4, the font information (bold in this example) will be ignored.
-				Styler style= file.isDirectory() ? fBoldStyler: null;
-				StyledString styledString= new StyledString(file.getName(), style);
-				String decoration = MessageFormat.format(" ({0} bytes)", new Object[] { new Long(file.length()) }); //$NON-NLS-1$
-				styledString.append(decoration, StyledString.COUNTER_STYLER);
-				
-				cell.setText(styledString.toString());
-				cell.setStyleRanges(styledString.getStyleRanges());
-				
-				if (file.isDirectory()) {
-					cell.setImage(IMAGE1);
-				} else {
-					cell.setImage(IMAGE2);
-				}
-			} else {
-				cell.setText("Unknown element"); //$NON-NLS-1$
-			}
-
-			super.update(cell);
-		}
-		
-		protected void measure(Event event, Object element) {
-			super.measure(event, element);
-		}
-	}
-
-	private static class FileSystemContentProvider implements IStructuredContentProvider {
-
-		public Object[] getElements(Object element) {
-			File[] roots = File.listRoots();
-			for (int i = 0; i < roots.length; i++) {
-				File[] list = roots[i].listFiles();
-				if (list != null && list.length > 0) {
-					return list;
-				}
-			}
-			return roots;
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet050DelegatingStyledCellLabelProvider.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet050DelegatingStyledCellLabelProvider.java
deleted file mode 100644
index bd5f4b5..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet050DelegatingStyledCellLabelProvider.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Michael Krkoska - initial API and implementation (bug 188333)
- *******************************************************************************/
-package org.eclipse.jface.snippets.viewers;
-
-import java.io.File;
-import java.text.DateFormat;
-import java.text.MessageFormat;
-import java.util.Date;
-
-import org.eclipse.jface.preference.JFacePreferences;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-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.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-
-/**
- * Using a {@link DelegatingStyledCellLabelProvider} on tree viewer with multiple columns. Compare the result with a native tree viewer.
- */
-public class Snippet050DelegatingStyledCellLabelProvider {
-	
-	
-	private static final int SHELL_WIDTH= 640;
-	private static final Display DISPLAY= Display.getDefault();
-
-
-	public static void main(String[] args) {
-		
-		JFaceResources.getColorRegistry().put(JFacePreferences.COUNTER_COLOR, new RGB(0,127,174));
-		
-		
-
-		Shell shell= new Shell(DISPLAY, SWT.CLOSE | SWT.RESIZE);
-		shell.setSize(SHELL_WIDTH, 300);
-		shell.setLayout(new GridLayout(1, false));
-
-		Snippet050DelegatingStyledCellLabelProvider example= new Snippet050DelegatingStyledCellLabelProvider();
-		example.createPartControl(shell);
-
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!DISPLAY.readAndDispatch()) {
-				DISPLAY.sleep();
-			}
-		}
-		DISPLAY.dispose();
-	}
-
-	public Snippet050DelegatingStyledCellLabelProvider() {
-	}
-
-	public void createPartControl(Composite parent) {
-		Composite composite= new Composite(parent, SWT.NONE);
-		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		composite.setLayout(new GridLayout(2, true));
-		
-		final DelegatingStyledCellLabelProvider styledCellLP1= new DelegatingStyledCellLabelProvider(new NameAndSizeLabelProvider());
-		final DelegatingStyledCellLabelProvider styledCellLP2= new DelegatingStyledCellLabelProvider(new ModifiedDateLabelProvider());
-		final ColumnViewer ownerDrawViewer= createViewer("Owner draw viewer:", composite, styledCellLP1, styledCellLP2); //$NON-NLS-1$
-
-		CellLabelProvider normalLP1= new NameAndSizeLabelProvider();
-		CellLabelProvider normalLP2= new ModifiedDateLabelProvider();
-		final ColumnViewer normalViewer= createViewer("Normal viewer:", composite, normalLP1, normalLP2); //$NON-NLS-1$
-
-		Composite buttons= new Composite(parent, SWT.NONE);
-		buttons.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		buttons.setLayout(new GridLayout(3, false));
-		
-		
-		Button button1= new Button(buttons, SWT.PUSH);
-		button1.setText("Refresh Viewers"); //$NON-NLS-1$
-		button1.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				ownerDrawViewer.refresh();
-				normalViewer.refresh();
-			}
-		});
-		
-		final Button button2= new Button(buttons, SWT.CHECK);
-		button2.setText("Owner draw on column 1"); //$NON-NLS-1$
-		button2.setSelection(true);
-		button2.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				boolean newState= button2.getSelection();
-				styledCellLP1.setOwnerDrawEnabled(newState);
-				ownerDrawViewer.refresh();
-			}
-		});
-		
-		final Button button3= new Button(buttons, SWT.CHECK);
-		button3.setText("Owner draw on column 2"); //$NON-NLS-1$
-		button3.setSelection(true);
-		button3.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				boolean newState= button3.getSelection();
-				styledCellLP2.setOwnerDrawEnabled(newState);
-				ownerDrawViewer.refresh();
-			}
-		});
-	}
-	
-	private static class FileSystemRoot {
-		public File[] getRoots() {
-			return File.listRoots();
-		}
-	}
-
-	private ColumnViewer createViewer(String description, Composite parent, CellLabelProvider labelProvider1, CellLabelProvider labelProvider2) {
-
-		Composite composite= new Composite(parent, SWT.NONE);
-		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-		composite.setLayout(new GridLayout(1, true));
-
-		Label label= new Label(composite, SWT.NONE);
-		label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
-		label.setText(description);
-
-		TreeViewer treeViewer= new TreeViewer(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		treeViewer.getTree().setHeaderVisible(true);
-		treeViewer.setContentProvider(new FileSystemContentProvider());
-		
-		TreeViewerColumn tvc1 = new TreeViewerColumn(treeViewer, SWT.NONE);
-		tvc1.getColumn().setText("Name"); //$NON-NLS-1$
-		tvc1.getColumn().setWidth(200);
-		tvc1.setLabelProvider(labelProvider1);
-
-		TreeViewerColumn tvc2 = new TreeViewerColumn(treeViewer, SWT.NONE);
-		tvc2.getColumn().setText("Date Modified"); //$NON-NLS-1$
-		tvc2.getColumn().setWidth(200);
-		tvc2.setLabelProvider(labelProvider2);
-		
-		GridData data= new GridData(GridData.FILL, GridData.FILL, true, true);
-		treeViewer.getControl().setLayoutData(data);
-
-		treeViewer.setInput(new FileSystemRoot());
-
-		return treeViewer;
-	}
-
-	/**
-	 * A simple label provider
-	 */
-	private static class NameAndSizeLabelProvider extends ColumnLabelProvider implements IStyledLabelProvider {
-		
-		private static int IMAGE_SIZE= 16;
-		private static final Image IMAGE1= new Image(DISPLAY, DISPLAY.getSystemImage(SWT.ICON_WARNING).getImageData().scaledTo(IMAGE_SIZE, IMAGE_SIZE));
-		private static final Image IMAGE2= new Image(DISPLAY, DISPLAY.getSystemImage(SWT.ICON_ERROR).getImageData().scaledTo(IMAGE_SIZE, IMAGE_SIZE));
-
-		public Image getImage(Object element) {
-			if (element instanceof File) {
-				File file= (File) element;
-				if (file.isDirectory()) {
-					return IMAGE1;
-				} else {
-					return IMAGE2;
-				}
-			}
-			return null;
-		}
-
-		public String getText(Object element) {
-			return getStyledText(element).toString();
-		}
-
-		public StyledString getStyledText(Object element) {
-			StyledString styledString= new StyledString();
-			if (element instanceof File) {
-				File file= (File) element;
-				if (file.getName().length() == 0) {
-					styledString.append(file.getAbsolutePath());
-				} else {
-					styledString.append(file.getName());
-				}
-				if (file.isFile()) {
-					String decoration= MessageFormat.format(" ({0} bytes)", new Object[] { new Long(file.length()) }); //$NON-NLS-1$
-					styledString.append(decoration, StyledString.COUNTER_STYLER);
-				}
-			}	
-			return styledString;
-		}
-	}
-	
-	private static class ModifiedDateLabelProvider extends ColumnLabelProvider implements IStyledLabelProvider {
-		public String getText(Object element) {
-			return getStyledText(element).toString();
-		}
-		
-		public StyledString getStyledText(Object element) {
-			StyledString styledString= new StyledString();
-			if (element instanceof File) {
-				File file= (File) element;
-				
-				String date= DateFormat.getDateInstance().format(new Date(file.lastModified()));
-				styledString.append(date);
-				
-				styledString.append(' ');
-				
-				String time = DateFormat.getTimeInstance(3).format(new Date(file.lastModified()));
-				styledString.append(time, StyledString.COUNTER_STYLER);
-			}
-			return styledString;
-		}
-	}
-	
-	private static class FileSystemContentProvider implements ITreeContentProvider {
-
-		public Object[] getChildren(Object element) {
-			if (element instanceof File) {
-				File file= (File) element;
-				if (file.isDirectory()) {
-					File[] listFiles= file.listFiles();
-					if (listFiles != null) {
-						return listFiles;
-					}
-				}
-			} else if (element instanceof FileSystemRoot) {
-				return ((FileSystemRoot) element).getRoots();
-			}
-			return new Object[0];
-		}
-
-		public Object getParent(Object element) {
-			if (element instanceof File) {
-				File file= (File) element;
-				return file.getParentFile();
-			}
-			return null;
-		}
-
-		public boolean hasChildren(Object element) {
-			return getChildren(element).length > 0;
-		}
-
-		public Object[] getElements(Object inputElement) {
-			return getChildren(inputElement);
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet051TableCenteredImage.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet051TableCenteredImage.java
deleted file mode 100644
index 2feeaf0..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet051TableCenteredImage.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.OwnerDrawLabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * Example showing how to center an image using an owner draw label provider
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet051TableCenteredImage {
-	private static Image[] images;
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	private abstract class CenterImageLabelProvider extends
-			OwnerDrawLabelProvider {
-
-		protected void measure(Event event, Object element) {
-		}
-
-		protected void paint(Event event, Object element) {
-
-			Image img = getImage(element);
-
-			if (img != null) {
-				Rectangle bounds = ((TableItem) event.item)
-						.getBounds(event.index);
-				Rectangle imgBounds = img.getBounds();
-				bounds.width /= 2;
-				bounds.width -= imgBounds.width / 2;
-				bounds.height /= 2;
-				bounds.height -= imgBounds.height / 2;
-
-				int x = bounds.width > 0 ? bounds.x + bounds.width : bounds.x;
-				int y = bounds.height > 0 ? bounds.y + bounds.height : bounds.y;
-
-				event.gc.drawImage(img, x, y);
-			}
-		}
-
-		protected abstract Image getImage(Object element);
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	private static Image createImage(Display display, int red, int green,
-			int blue) {
-		Color color = new Color(display, red, green, blue);
-		Image image = new Image(display, 10, 10);
-		GC gc = new GC(image);
-		gc.setBackground(color);
-		gc.fillRectangle(0, 0, 10, 10);
-		gc.dispose();
-
-		return image;
-	}
-
-	public Snippet051TableCenteredImage(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		v.setContentProvider(new MyContentProvider());
-
-		TableViewerColumn column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Column 1");
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return "Column 1 => " + element.toString();
-			}
-		});
-
-		column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Column 2");
-		column.setLabelProvider(new CenterImageLabelProvider() {
-
-			protected Image getImage(Object element) {
-				return images[((MyModel) element).counter % 4];
-			}
-
-		});
-
-		// OwnerDrawLabelProvider.setUpOwnerDraw(v);
-
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-
-		for (int i = 0; i < 10; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		images = new Image[4];
-		images[0] = createImage(display, 0, 0, 255);
-		images[1] = createImage(display, 0, 255, 255);
-		images[2] = createImage(display, 0, 255, 0);
-		images[3] = createImage(display, 255, 0, 255);
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet051TableCenteredImage(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		for (int i = 0; i < images.length; i++) {
-			images[i].dispose();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet052DouleClickCellEditor.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet052DouleClickCellEditor.java
deleted file mode 100644
index df34ada..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet052DouleClickCellEditor.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TableViewerEditor;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Shows how to setup a Viewer to start cell editing on double click
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet052DouleClickCellEditor {
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public static boolean flag = true;
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public Snippet052DouleClickCellEditor(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		v.setContentProvider(new MyContentProvider());
-		v.setCellEditors(new CellEditor[] { new TextCellEditor(v.getTable()),
-				new TextCellEditor(v.getTable()),
-				new TextCellEditor(v.getTable()) });
-		v.setCellModifier(new ICellModifier() {
-
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return "Column " + property + " => " + element.toString();
-			}
-
-			public void modify(Object element, String property, Object value) {
-
-			}
-
-		});
-
-		v.setColumnProperties(new String[] { "1", "2", "3" });
-
-		ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(
-				v) {
-			protected boolean isEditorActivationEvent(
-					ColumnViewerEditorActivationEvent event) {
-				return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
-						|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
-						|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
-			}
-		};
-
-		TableViewerEditor.create(v, actSupport,
-				ColumnViewerEditor.TABBING_HORIZONTAL
-						| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
-						| ColumnViewerEditor.TABBING_VERTICAL
-						| ColumnViewerEditor.KEYBOARD_ACTIVATION);
-
-		TableViewerColumn column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setMoveable(true);
-		column.getColumn().setText("Column 1");
-		column.setLabelProvider(new ColumnLabelProvider());
-
-		column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setMoveable(true);
-		column.getColumn().setText("Column 2");
-		column.setLabelProvider(new ColumnLabelProvider());
-
-		column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setMoveable(true);
-		column.getColumn().setText("Column 3");
-		column.setLabelProvider(new ColumnLabelProvider());
-
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-
-		for (int i = 0; i < 10; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet052DouleClickCellEditor(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet053StartEditorWithContextMenu.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet053StartEditorWithContextMenu.java
deleted file mode 100644
index bb550aa..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet053StartEditorWithContextMenu.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Marcel and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Marcel <emmpeegee@gmail.com> - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.snippets.viewers;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.TreeViewerEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- *
- */
-public class Snippet053StartEditorWithContextMenu implements SelectionListener {
-
-	private TreeViewer viewer;
-
-	private class MyContentProvider implements ITreeContentProvider {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return ((MyModel)inputElement).child.toArray();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			return getElements(parentElement);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			if( element == null) {
-				return null;
-			}
-
-			return ((MyModel)element).parent;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-			return ((MyModel)element).child.size() > 0;
-		}
-
-	}
-
-	public class MyModel {
-		public MyModel parent;
-		public ArrayList child = new ArrayList();
-		public int counter;
-
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if( parent != null ) {
-				rv = parent.toString() + ".";
-			}
-
-			rv += counter;
-
-			return rv;
-		}
-	}
-
-	public Snippet053StartEditorWithContextMenu(Shell shell) {
-		viewer = new TreeViewer(shell, SWT.BORDER);
-		viewer.setContentProvider(new MyContentProvider());
-		viewer.setCellEditors(new CellEditor[] {new TextCellEditor(viewer.getTree())});
-		viewer.setColumnProperties(new String[] { "name" });
-		viewer.setCellModifier(new ICellModifier() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
-			 */
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
-			 */
-			public Object getValue(Object element, String property) {
-				return ((MyModel)element).counter + "";
-			}
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
-			 */
-			public void modify(Object element, String property, Object value) {
-				TreeItem item = (TreeItem)element;
-				((MyModel)item.getData()).counter = Integer.parseInt(value.toString());
-				viewer.update(item.getData(), null);
-			}
-
-		});
-
-		TreeViewerEditor.create(viewer, new ColumnViewerEditorActivationStrategy(viewer) {
-			protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
-				return event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
-			}
-		}, ColumnViewerEditor.DEFAULT);
-
-		Menu menu = new Menu(viewer.getControl());
-		MenuItem renameItem = new MenuItem(menu, SWT.PUSH);
-		renameItem.addSelectionListener(this);
-		renameItem.setText("Rename");
-		viewer.getTree().setMenu(menu);
-
-		viewer.setInput(createModel());
-	}
-
-	public void widgetDefaultSelected(SelectionEvent e) {
-	}
-
-	public void widgetSelected(SelectionEvent e) {
-		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
-		if (selection != null) {
-			viewer.editElement(selection.getFirstElement(), 0);
-		}
-	}
-
-	private MyModel createModel() {
-
-		MyModel root = new MyModel(0,null);
-		root.counter = 0;
-
-		MyModel tmp;
-		for( int i = 1; i < 10; i++ ) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for( int j = 1; j < i; j++ ) {
-				tmp.child.add(new MyModel(j,tmp));
-			}
-		}
-
-		return root;
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display ();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet053StartEditorWithContextMenu(shell);
-		shell.open ();
-
-		while (!shell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-
-		display.dispose ();
-	}
-}
-
-
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet054NativeControlsInViewers.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet054NativeControlsInViewers.java
deleted file mode 100644
index dae39a6..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet054NativeControlsInViewers.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.CellLabelProvider;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TableEditor;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * Example how to place native controls into a viewer with the new JFace-API
- * because has the potential to eat up all your handles you should think about
- * alternate approaches e.g. takeing a screenshot of the control
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet054NativeControlsInViewers {
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public Snippet054NativeControlsInViewers(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		v.setContentProvider(new MyContentProvider());
-		v.getTable().setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true,2,1));
-
-		TableViewerColumn column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Column 1");
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return element.toString();
-			}
-
-		});
-
-		column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Column 2");
-		column.setLabelProvider(new CellLabelProvider() {
-
-			public void update(ViewerCell cell) {
-				final TableItem item = (TableItem) cell.getItem();
-				DisposeListener listener = new DisposeListener() {
-
-					public void widgetDisposed(DisposeEvent e) {
-						if( item.getData("EDITOR") != null ) {
-							TableEditor editor = (TableEditor) item.getData("EDITOR");
-							editor.getEditor().dispose();
-							editor.dispose();
-						}
-					}
-
-				};
-
-				if (item.getData("EDITOR") != null) {
-					TableEditor editor = (TableEditor) item.getData("EDITOR");
-					editor.getEditor().dispose();
-					editor.dispose();
-				}
-
-				if( item.getData("DISPOSELISTNER") != null ) {
-					item.removeDisposeListener((DisposeListener) item.getData("DISPOSELISTNER"));
-				}
-
-				TableEditor editor = new TableEditor(item.getParent());
-				item.setData("EDITOR", editor);
-				Composite comp = new Composite(item.getParent(), SWT.NONE);
-				comp.setBackground(item.getParent().getBackground());
-				comp.setBackgroundMode(SWT.INHERIT_DEFAULT);
-				RowLayout l = new RowLayout();
-				l.marginHeight = 0;
-				l.marginWidth = 0;
-				l.marginTop = 0;
-				l.marginBottom = 0;
-				comp.setLayout(l);
-				Button rad = new Button(comp, SWT.RADIO);
-				Button rad1 = new Button(comp, SWT.RADIO);
-				Button rad2 = new Button(comp, SWT.RADIO);
-
-				editor.grabHorizontal = true;
-				editor.setEditor(comp, item, 1);
-
-				item.addDisposeListener(listener);
-				item.setData("DISPOSELISTNER",listener);
-			}
-
-		});
-
-		MyModel[] model = createModel(10);
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-
-		Button b = new Button(shell,SWT.PUSH);
-		b.setText("Modify input");
-		b.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		b.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				v.setInput(createModel((int)(Math.random() * 10)));
-			}
-
-		});
-
-		b = new Button(shell,SWT.PUSH);
-		b.setText("Refresh");
-		b.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		b.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				v.refresh();
-			}
-
-		});
-	}
-
-	private MyModel[] createModel(int amount) {
-		MyModel[] elements = new MyModel[amount];
-
-		for (int i = 0; i < amount; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new GridLayout(2,true));
-		new Snippet054NativeControlsInViewers(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet055HideShowColumn.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet055HideShowColumn.java
deleted file mode 100644
index a2b0cd2..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet055HideShowColumn.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeViewerFocusCellManager;
-import org.eclipse.jface.viewers.TreeViewerEditor;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.TreeViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-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.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A simple TreeViewer to demonstrate usage
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet055HideShowColumn {
-	public Snippet055HideShowColumn(final Shell shell) {
-		final TreeViewer v = new TreeViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		v.getTree().setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true,2,1));
-		v.getTree().setLinesVisible(true);
-		v.getTree().setHeaderVisible(true);
-
-		TreeViewerFocusCellManager focusCellManager = new TreeViewerFocusCellManager(
-				v, new FocusCellOwnerDrawHighlighter(v));
-		ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(
-				v) {
-			protected boolean isEditorActivationEvent(
-					ColumnViewerEditorActivationEvent event) {
-				return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
-						|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
-						|| (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR)
-						|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
-			}
-		};
-
-		TreeViewerEditor.create(v, focusCellManager, actSupport,
-				ColumnViewerEditor.TABBING_HORIZONTAL
-						| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
-						| ColumnViewerEditor.TABBING_VERTICAL
-						| ColumnViewerEditor.KEYBOARD_ACTIVATION);
-
-		final TextCellEditor textCellEditor = new TextCellEditor(v.getTree());
-
-		TreeViewerColumn column_1 = new TreeViewerColumn(v, SWT.NONE);
-		column_1.getColumn().setWidth(200);
-		column_1.getColumn().setMoveable(true);
-		column_1.getColumn().setText("Column 1");
-		column_1.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return "Column 1 => " + element.toString();
-			}
-
-		});
-		column_1.setEditingSupport(new EditingSupport(v) {
-			protected boolean canEdit(Object element) {
-				return true;
-			}
-
-			protected CellEditor getCellEditor(Object element) {
-				return textCellEditor;
-			}
-
-			protected Object getValue(Object element) {
-				return ((MyModel) element).counter + "";
-			}
-
-			protected void setValue(Object element, Object value) {
-				((MyModel) element).counter = Integer
-						.parseInt(value.toString());
-				v.update(element, null);
-			}
-		});
-
-		final TreeViewerColumn column_2 = new TreeViewerColumn(v, SWT.NONE);
-		column_2.getColumn().setWidth(200);
-		column_2.getColumn().setMoveable(true);
-		column_2.getColumn().setText("Column 2");
-		column_2.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return "Column 2 => " + element.toString();
-			}
-
-		});
-		column_2.setEditingSupport(new EditingSupport(v) {
-			protected boolean canEdit(Object element) {
-				return true;
-			}
-
-			protected CellEditor getCellEditor(Object element) {
-				return textCellEditor;
-			}
-
-			protected Object getValue(Object element) {
-				return ((MyModel) element).counter + "";
-			}
-
-			protected void setValue(Object element, Object value) {
-				((MyModel) element).counter = Integer
-						.parseInt(value.toString());
-				v.update(element, null);
-			}
-		});
-
-		TreeViewerColumn column_3 = new TreeViewerColumn(v, SWT.NONE);
-		column_3.getColumn().setWidth(200);
-		column_3.getColumn().setMoveable(true);
-		column_3.getColumn().setText("Column 3");
-		column_3.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return "Column 3 => " + element.toString();
-			}
-
-		});
-		column_3.setEditingSupport(new EditingSupport(v) {
-			protected boolean canEdit(Object element) {
-				return true;
-			}
-
-			protected CellEditor getCellEditor(Object element) {
-				return textCellEditor;
-			}
-
-			protected Object getValue(Object element) {
-				return ((MyModel) element).counter + "";
-			}
-
-			protected void setValue(Object element, Object value) {
-				((MyModel) element).counter = Integer
-						.parseInt(value.toString());
-				v.update(element, null);
-			}
-		});
-
-		v.setContentProvider(new MyContentProvider());
-
-		v.setInput(createModel());
-
-		Button b = new Button(shell, SWT.PUSH);
-		b.setText("Edit-Element");
-		b.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		b.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				MyModel root = (MyModel) v.getInput();
-				TreePath path = new TreePath(new Object[] { root,
-						root.child.get(1),
-						((MyModel) root.child.get(1)).child.get(0) });
-				v.editElement(path, 0);
-			}
-
-		});
-
-		b = new Button(shell, SWT.PUSH);
-		b.setText("Hide/Show 2nd Column");
-		b.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		b.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				column_2.getColumn().setWidth(0);
-			}
-		});
-	}
-
-	private MyModel createModel() {
-
-		MyModel root = new MyModel(0, null);
-		root.counter = 0;
-
-		MyModel tmp;
-		MyModel subItem;
-		for (int i = 1; i < 10; i++) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for (int j = 1; j < i; j++) {
-				subItem = new MyModel(j, tmp);
-				subItem.child.add(new MyModel(j * 100, subItem));
-				tmp.child.add(subItem);
-			}
-		}
-
-		return root;
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new GridLayout(2,true));
-		new Snippet055HideShowColumn(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-
-	private class MyContentProvider implements ITreeContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return ((MyModel) inputElement).child.toArray();
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-		public Object[] getChildren(Object parentElement) {
-			return getElements(parentElement);
-		}
-
-		public Object getParent(Object element) {
-			if (element == null) {
-				return null;
-			}
-			return ((MyModel) element).parent;
-		}
-
-		public boolean hasChildren(Object element) {
-			return ((MyModel) element).child.size() > 0;
-		}
-
-	}
-
-	public class MyModel {
-		public MyModel parent;
-
-		public ArrayList child = new ArrayList();
-
-		public int counter;
-
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if (parent != null) {
-				rv = parent.toString() + ".";
-			}
-
-			rv += counter;
-
-			return rv;
-		}
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet056BooleanCellEditor.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet056BooleanCellEditor.java
deleted file mode 100644
index 2d0c08e..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet056BooleanCellEditor.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.TreeViewerFocusCellManager;
-import org.eclipse.jface.viewers.TreeViewerEditor;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.TreeViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A simple TreeViewer to demonstrate usage
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet056BooleanCellEditor {
-	public Snippet056BooleanCellEditor(final Shell shell) {
-		final TreeViewer v = new TreeViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		v.getTree().setLinesVisible(true);
-		v.getTree().setHeaderVisible(true);
-
-		FocusCellOwnerDrawHighlighter h = new FocusCellOwnerDrawHighlighter(v) {
-
-			protected Color getSelectedCellBackgroundColorNoFocus(
-					ViewerCell cell) {
-				return shell.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
-			}
-
-			protected Color getSelectedCellForegroundColorNoFocus(
-					ViewerCell cell) {
-				return shell.getDisplay().getSystemColor(SWT.COLOR_WIDGET_FOREGROUND);
-			}
-		};
-
-		TreeViewerFocusCellManager focusCellManager = new TreeViewerFocusCellManager(v,h);
-		ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(v);
-
-		TreeViewerEditor.create(v, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL
-				| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
-				| ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
-
-		final TextCellEditor textCellEditor = new TextCellEditor(v.getTree());
-		final BooleanCellEditor booleanCellEditor = new BooleanCellEditor(v.getTree());
-
-		TreeViewerColumn column = new TreeViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setMoveable(true);
-		column.getColumn().setText("Column 1");
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return "Column 1 => " + element.toString();
-			}
-
-		});
-		column.setEditingSupport(new EditingSupport(v) {
-			protected boolean canEdit(Object element) {
-				return true;
-			}
-
-			protected CellEditor getCellEditor(Object element) {
-				return textCellEditor;
-			}
-
-			protected Object getValue(Object element) {
-				return ((MyModel) element).counter + "";
-			}
-
-			protected void setValue(Object element, Object value) {
-				((MyModel) element).counter = Integer
-						.parseInt(value.toString());
-				v.update(element, null);
-			}
-		});
-
-		column = new TreeViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setMoveable(true);
-		column.getColumn().setText("Column 2");
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((MyModel) element).flag+"";
-			}
-
-		});
-		column.setEditingSupport(new EditingSupport(v) {
-			protected boolean canEdit(Object element) {
-				return true;
-			}
-
-			protected CellEditor getCellEditor(Object element) {
-				return booleanCellEditor;
-			}
-
-			protected Object getValue(Object element) {
-				return new Boolean(((MyModel) element).flag);
-			}
-
-			protected void setValue(Object element, Object value) {
-				((MyModel) element).flag = ((Boolean)value).booleanValue();
-				v.update(element, null);
-			}
-		});
-
-		column = new TreeViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setMoveable(true);
-		column.getColumn().setText("Column 3");
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return "Column 3 => " + element.toString();
-			}
-
-		});
-		column.setEditingSupport(new EditingSupport(v) {
-			protected boolean canEdit(Object element) {
-				return true;
-			}
-
-			protected CellEditor getCellEditor(Object element) {
-				return textCellEditor;
-			}
-
-			protected Object getValue(Object element) {
-				return ((MyModel) element).counter + "";
-			}
-
-			protected void setValue(Object element, Object value) {
-				((MyModel) element).counter = Integer
-						.parseInt(value.toString());
-				v.update(element, null);
-			}
-		});
-
-		v.setContentProvider(new MyContentProvider());
-
-		v.setInput(createModel());
-	}
-
-	private MyModel createModel() {
-
-		MyModel root = new MyModel(0, null);
-		root.counter = 0;
-
-		MyModel tmp;
-		MyModel subItem;
-		for (int i = 1; i < 10; i++) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for (int j = 1; j < i; j++) {
-				subItem = new MyModel(j, tmp);
-				subItem.child.add(new MyModel(j * 100, subItem));
-				tmp.child.add(subItem);
-			}
-		}
-
-		return root;
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet056BooleanCellEditor(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-
-	private class MyContentProvider implements ITreeContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return ((MyModel) inputElement).child.toArray();
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-		public Object[] getChildren(Object parentElement) {
-			return getElements(parentElement);
-		}
-
-		public Object getParent(Object element) {
-			if (element == null) {
-				return null;
-			}
-			return ((MyModel) element).parent;
-		}
-
-		public boolean hasChildren(Object element) {
-			return ((MyModel) element).child.size() > 0;
-		}
-
-	}
-
-	public class MyModel {
-		public MyModel parent;
-
-		public ArrayList child = new ArrayList();
-
-		public int counter;
-
-		public boolean flag;
-
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-			this.flag = counter % 2 == 0;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if (parent != null) {
-				rv = parent.toString() + ".";
-			}
-
-			rv += counter;
-
-			return rv;
-		}
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet057TableViewerSkipHiddenCells.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet057TableViewerSkipHiddenCells.java
deleted file mode 100644
index d5a3e29..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet057TableViewerSkipHiddenCells.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TableViewerEditor;
-import org.eclipse.jface.viewers.TableViewerFocusCellManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Example of showing how easy cell-navigation with hidden cells is in 3.4
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- */
-public class Snippet057TableViewerSkipHiddenCells {
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return (Person[]) inputElement;
-		}
-
-		public void dispose() {
-
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class Person {
-		public String givenname;
-		public String surname;
-		public String email;
-
-		public Person(String givenname, String surname, String email) {
-			this.givenname = givenname;
-			this.surname = surname;
-			this.email = email;
-		}
-
-	}
-
-	protected abstract class AbstractEditingSupport extends EditingSupport {
-
-		private TextCellEditor editor;
-
-		public AbstractEditingSupport(TableViewer viewer) {
-			super(viewer);
-			editor = new TextCellEditor(viewer.getTable());
-		}
-
-		protected boolean canEdit(Object element) {
-			return true;
-		}
-
-		protected CellEditor getCellEditor(Object element) {
-			return editor;
-		}
-
-		protected void setValue(Object element, Object value) {
-			this.doSetValue(element, value);
-			this.getViewer().update(element, null);
-		}
-
-		protected abstract void doSetValue(Object element, Object value);
-
-	}
-
-	public Snippet057TableViewerSkipHiddenCells(Shell shell) {
-
-		final TableViewer tableviewer = new TableViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		tableviewer.setContentProvider(new MyContentProvider());
-		MenuManager mgr = new MenuManager();
-		mgr.add(new Action("toggle surname visibility") {
-
-			public void run() {
-				if( tableviewer.getTable().getColumn(1).getWidth() == 0) {
-					tableviewer.getTable().getColumn(1).setWidth(200);
-				} else {
-					tableviewer.getTable().getColumn(1).setWidth(0);	
-				}
-				
-			}
-			
-		});
-		tableviewer.getControl().setMenu(mgr.createContextMenu(tableviewer.getControl())); 
-
-		// Column 1
-		TableViewerColumn column = new TableViewerColumn(tableviewer, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Givenname");
-		column.getColumn().setMoveable(false);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).givenname;
-			}
-
-		});
-
-		column.setEditingSupport(new AbstractEditingSupport(tableviewer) {
-
-			protected Object getValue(Object element) {
-				return ((Person) element).givenname;
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				((Person) element).givenname = value.toString();
-			}
-
-		});
-
-		// Column 2 is zero-width hidden
-		column = new TableViewerColumn(tableviewer, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Surname");
-		column.getColumn().setMoveable(false);
-		column.getColumn().setResizable(false);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).surname;
-			}
-
-		});
-
-		column.setEditingSupport(new AbstractEditingSupport(tableviewer) {
-
-			protected Object getValue(Object element) {
-				return ((Person) element).surname;
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				((Person) element).surname = value.toString();
-			}
-
-		});
-
-		// column 3
-		column = new TableViewerColumn(tableviewer, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("E-Mail");
-		column.getColumn().setMoveable(false);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).email;
-			}
-
-		});
-
-		column.setEditingSupport(new AbstractEditingSupport(tableviewer) {
-
-			protected Object getValue(Object element) {
-				return ((Person) element).email;
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				((Person) element).email = value.toString();
-			}
-
-		});
-
-		Person[] model = this.createModel();
-		tableviewer.setInput(model);
-		tableviewer.getTable().setLinesVisible(true);
-		tableviewer.getTable().setHeaderVisible(true);
-
-		TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(
-				tableviewer, new FocusCellOwnerDrawHighlighter(tableviewer));
-
-		ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(
-				tableviewer) {
-
-			protected boolean isEditorActivationEvent(
-
-			ColumnViewerEditorActivationEvent event) {
-
-				return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
-						|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
-						|| event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED
-						&& event.keyCode == SWT.CR
-						|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
-
-			}
-
-		};
-
-		TableViewerEditor.create(tableviewer, focusCellManager, actSupport,
-				ColumnViewerEditor.TABBING_HORIZONTAL
-						| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
-						| ColumnViewerEditor.TABBING_VERTICAL
-						| ColumnViewerEditor.KEYBOARD_ACTIVATION);
-
-	}
-
-	private Person[] createModel() {
-		Person[] elements = new Person[4];
-		elements[0] = new Person("Tom", "Schindl",
-				"tom.schindl@bestsolution.at");
-		elements[1] = new Person("Boris", "Bokowski",
-				"Boris_Bokowski@ca.ibm.com");
-		elements[2] = new Person("Tod", "Creasey", "Tod_Creasey@ca.ibm.com");
-		elements[3] = new Person("Wayne", "Beaton", "wayne@eclipse.org");
-
-		return elements;
-
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet057TableViewerSkipHiddenCells(shell);
-		shell.open();
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch()) {
-				display.sleep();
-			}
-		}
-
-		display.dispose();
-
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet058CellNavigationIn34.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet058CellNavigationIn34.java
deleted file mode 100644
index 4dfa36f..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet058CellNavigationIn34.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *     Niels Lippke - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CellNavigationStrategy;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationListener;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.ColumnViewerEditorDeactivationEvent;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TableViewerEditor;
-import org.eclipse.jface.viewers.TableViewerFocusCellManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Example for full feature cell navigation until bug 230955 is fixed
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>, Niels Lippke <niels.lippke@airpas.com>
- * 
- */
-public class Snippet058CellNavigationIn34 {
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return (Person[]) inputElement;
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-	}
-
-	public class Person {
-		public String givenname;
-		public String surname;
-		public String email;
-		public String gender;
-
-		public Person(String givenname, String surname, String email, String gender) {
-			this.givenname = givenname;
-			this.surname = surname;
-			this.email = email;
-			this.gender = gender;
-		}
-
-	}
-
-	protected abstract class AbstractEditingSupport extends EditingSupport {
-		private CellEditor editor;
-
-		public AbstractEditingSupport(TableViewer viewer) {
-			super(viewer);
-			this.editor = new TextCellEditor(viewer.getTable());
-		}
-		
-		public AbstractEditingSupport(TableViewer viewer, CellEditor editor) {
-			super(viewer);
-			this.editor = editor;
-		}
-
-		protected boolean canEdit(Object element) {
-			return true;
-		}
-
-		protected CellEditor getCellEditor(Object element) {
-			return editor;
-		}
-
-		protected void setValue(Object element, Object value) {
-			doSetValue(element, value);
-			getViewer().update(element, null);
-		}
-
-		protected abstract void doSetValue(Object element, Object value);
-	}
-
-	public Snippet058CellNavigationIn34(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER | SWT.FULL_SELECTION);
-		v.setContentProvider(new MyContentProvider());
-
-		TableViewerColumn column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Givenname");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).givenname;
-			}
-		});
-
-		column.setEditingSupport(new AbstractEditingSupport(v) {
-
-			protected Object getValue(Object element) {
-				return ((Person) element).givenname;
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				((Person) element).givenname = value.toString();
-			}
-
-		});
-
-		column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Surname");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).surname;
-			}
-
-		});
-
-		column.setEditingSupport(new AbstractEditingSupport(v) {
-
-			protected Object getValue(Object element) {
-				return ((Person) element).surname;
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				((Person) element).surname = value.toString();
-			}
-
-		});
-
-		column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("E-Mail");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).email;
-			}
-
-		});
-
-		
-		column.setEditingSupport(new AbstractEditingSupport(v) {
-
-			protected Object getValue(Object element) {				
-				return ((Person) element).email;	
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				((Person) element).email = value.toString();
-			}
-
-		});
-
-
-		column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Gender");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).gender;
-			}
-
-		});
-		
-		ComboBoxCellEditor editor = new ComboBoxCellEditor(((TableViewer) v).getTable(), new String[] {"M","F"});
-		editor.setActivationStyle(ComboBoxCellEditor.DROP_DOWN_ON_TRAVERSE_ACTIVATION | 
-				ComboBoxCellEditor.DROP_DOWN_ON_PROGRAMMATIC_ACTIVATION |
-				ComboBoxCellEditor.DROP_DOWN_ON_MOUSE_ACTIVATION |
-				ComboBoxCellEditor.DROP_DOWN_ON_KEY_ACTIVATION);
-		
-		column.setEditingSupport(new AbstractEditingSupport(v, editor) {
-
-			protected Object getValue(Object element) {
-				if (((Person) element).gender.equals("M"))
-					return new Integer(0);
-				return new Integer(1);
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				if (((Integer) value).intValue() == 0) {
-					((Person) element).gender = "M";
-				} else {
-					((Person) element).gender = "F";
-				}
-			}
-
-		});
-		
-		CellNavigationStrategy naviStrat = new CellNavigationStrategy() {
-
-			public ViewerCell findSelectedCell(ColumnViewer viewer,
-					ViewerCell currentSelectedCell, Event event) {
-				ViewerCell cell = super.findSelectedCell(viewer, currentSelectedCell, event);
-				
-				if( cell != null ) {
-					v.getTable().showColumn(v.getTable().getColumn(cell.getColumnIndex()));
-				}
-				
-				return cell;
-			}
-			
-		};
-		
-		TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(v,new FocusCellOwnerDrawHighlighter(v),naviStrat);
-		
-		ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(v) {
-			protected boolean isEditorActivationEvent(
-					ColumnViewerEditorActivationEvent event) {
-				return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
-						|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
-						|| (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR)
-						|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
-			}
-		};
-		
-		TableViewerEditor.create(v, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL
-				| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
-				| ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
-		
-		v.getColumnViewerEditor().addEditorActivationListener(new ColumnViewerEditorActivationListener() {
-
-			public void afterEditorActivated(
-					ColumnViewerEditorActivationEvent event) {
-				
-			}
-
-			public void afterEditorDeactivated(
-					ColumnViewerEditorDeactivationEvent event) {
-				
-			}
-
-			public void beforeEditorActivated(
-					ColumnViewerEditorActivationEvent event) {
-				ViewerCell cell = (ViewerCell) event.getSource();
-				v.getTable().showColumn(v.getTable().getColumn(cell.getColumnIndex()));
-			}
-
-			public void beforeEditorDeactivated(
-					ColumnViewerEditorDeactivationEvent event) {
-				
-			}
-			
-		});
-		
-		Person[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-	}
-
-	private Person[] createModel() {
-		Person[] elements = new Person[4];
-		elements[0] = new Person("Tom", "Schindl",
-				"tom.schindl@bestsolution.at", "M");
-		elements[1] = new Person("Boris", "Bokowski",
-				"Boris_Bokowski@ca.ibm.com","M");
-		elements[2] = new Person("Tod", "Creasey", "Tod_Creasey@ca.ibm.com","M");
-		elements[3] = new Person("Wayne", "Beaton", "wayne@eclipse.org","M");
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet058CellNavigationIn34(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet059CellNavigationIn33.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet059CellNavigationIn33.java
deleted file mode 100644
index 53c5da1..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet059CellNavigationIn33.java
+++ /dev/null
@@ -1,865 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.viewers;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.List;
-
-import org.eclipse.jface.viewers.AbstractTableViewer;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CellNavigationStrategy;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationListener;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.ColumnViewerEditorDeactivationEvent;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TableViewerFocusCellManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.viewers.ViewerColumn;
-import org.eclipse.jface.viewers.ViewerRow;
-import org.eclipse.jface.viewers.CellEditor.LayoutData;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TableEditor;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * Example for full feature cell navigation in 3.3. This snippet uses internal
- * API by reflection so its not guaranteed to work for ever. The problem of
- * invisible cells is fixed in 3.4. The problem with horizontal scrolling is
- * going to be fixed in 3.5.
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- *
- */
-public class Snippet059CellNavigationIn33 {
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return (Person[]) inputElement;
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-	}
-
-	public class Person {
-		public String givenname;
-		public String surname;
-		public String email;
-		public String gender;
-
-		public Person(String givenname, String surname, String email,
-				String gender) {
-			this.givenname = givenname;
-			this.surname = surname;
-			this.email = email;
-			this.gender = gender;
-		}
-
-	}
-
-	protected abstract class AbstractEditingSupport extends EditingSupport {
-		private CellEditor editor;
-
-		public AbstractEditingSupport(TableViewer viewer) {
-			super(viewer);
-			this.editor = new TextCellEditor(viewer.getTable());
-		}
-
-		public AbstractEditingSupport(TableViewer viewer, CellEditor editor) {
-			super(viewer);
-			this.editor = editor;
-		}
-
-		protected boolean canEdit(Object element) {
-			return true;
-		}
-
-		protected CellEditor getCellEditor(Object element) {
-			return editor;
-		}
-
-		protected void setValue(Object element, Object value) {
-			doSetValue(element, value);
-			getViewer().update(element, null);
-		}
-
-		protected abstract void doSetValue(Object element, Object value);
-	}
-
-	public Snippet059CellNavigationIn33(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		v.setContentProvider(new MyContentProvider());
-
-		TableViewerColumn column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Givenname");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).givenname;
-			}
-		});
-
-		column.setEditingSupport(new AbstractEditingSupport(v) {
-
-			protected Object getValue(Object element) {
-				return ((Person) element).givenname;
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				((Person) element).givenname = value.toString();
-			}
-
-		});
-
-		final TableViewerColumn columnA = new TableViewerColumn(v, SWT.NONE);
-		columnA.getColumn().setWidth(200);
-		columnA.getColumn().setText("Surname");
-		columnA.getColumn().setMoveable(true);
-		columnA.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).surname;
-			}
-
-		});
-
-		columnA.setEditingSupport(new AbstractEditingSupport(v) {
-
-			protected Object getValue(Object element) {
-				return ((Person) element).surname;
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				((Person) element).surname = value.toString();
-			}
-
-		});
-
-		column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("E-Mail");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).email;
-			}
-
-		});
-
-		column.setEditingSupport(new AbstractEditingSupport(v) {
-
-			protected Object getValue(Object element) {
-				return ((Person) element).email;
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				((Person) element).email = value.toString();
-			}
-
-		});
-
-		column = new TableViewerColumn(v, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Gender");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			public String getText(Object element) {
-				return ((Person) element).gender;
-			}
-
-		});
-
-		ComboBoxCellEditor editor = new ComboBoxCellEditor(((TableViewer) v)
-				.getTable(), new String[] { "M", "F" });
-		column.setEditingSupport(new AbstractEditingSupport(v, editor) {
-
-			protected Object getValue(Object element) {
-				if (((Person) element).gender.equals("M"))
-					return new Integer(0);
-				return new Integer(1);
-			}
-
-			protected void doSetValue(Object element, Object value) {
-				if (((Integer) value).intValue() == 0) {
-					((Person) element).gender = "M";
-				} else {
-					((Person) element).gender = "F";
-				}
-			}
-
-		});
-
-		CellNavigationStrategy naviStrat = new CellNavigationStrategy() {
-
-			private ViewerCell internalFindSelectedCell(ColumnViewer viewer,
-					ViewerCell currentSelectedCell, Event event) {
-				switch (event.keyCode) {
-				case SWT.ARROW_UP:
-					if (currentSelectedCell != null) {
-						return getNeighbor(currentSelectedCell,
-								ViewerCell.ABOVE, false);
-					}
-					break;
-				case SWT.ARROW_DOWN:
-					if (currentSelectedCell != null) {
-						return getNeighbor(currentSelectedCell,
-								ViewerCell.BELOW, false);
-					}
-					break;
-				case SWT.ARROW_LEFT:
-					if (currentSelectedCell != null) {
-						return getNeighbor(currentSelectedCell,
-								ViewerCell.LEFT, true);
-					}
-					break;
-				case SWT.ARROW_RIGHT:
-					if (currentSelectedCell != null) {
-						return getNeighbor(currentSelectedCell,
-								ViewerCell.RIGHT, true);
-					}
-					break;
-				}
-
-				return null;
-			}
-
-			public ViewerCell findSelectedCell(ColumnViewer viewer,
-					ViewerCell currentSelectedCell, Event event) {
-				ViewerCell cell = internalFindSelectedCell(viewer,
-						currentSelectedCell, event);
-
-				if (cell != null) {
-					TableColumn t = v.getTable().getColumn(
-							cell.getColumnIndex());
-					v.getTable().showColumn(t);
-				}
-
-				return cell;
-			}
-
-		};
-
-		TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(
-				v, new FocusCellOwnerDrawHighlighter(v));
-		try {
-			Field f = focusCellManager.getClass().getSuperclass()
-					.getDeclaredField("navigationStrategy");
-			f.setAccessible(true);
-			f.set(focusCellManager, naviStrat);
-		} catch (SecurityException e) {
-			e.printStackTrace();
-		} catch (NoSuchFieldException e) {
-			e.printStackTrace();
-		} catch (IllegalArgumentException e) {
-			e.printStackTrace();
-		} catch (IllegalAccessException e) {
-			e.printStackTrace();
-		}
-
-		ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(
-				v) {
-			protected boolean isEditorActivationEvent(
-					ColumnViewerEditorActivationEvent event) {
-				return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
-						|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
-						|| (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR)
-						|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
-			}
-		};
-
-		TableViewerEditor.create(v, focusCellManager, actSupport,
-				ColumnViewerEditor.TABBING_HORIZONTAL
-						| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
-						| ColumnViewerEditor.TABBING_VERTICAL
-						| ColumnViewerEditor.KEYBOARD_ACTIVATION);
-
-		v.getColumnViewerEditor().addEditorActivationListener(
-				new ColumnViewerEditorActivationListener() {
-
-					public void afterEditorActivated(
-							ColumnViewerEditorActivationEvent event) {
-
-					}
-
-					public void afterEditorDeactivated(
-							ColumnViewerEditorDeactivationEvent event) {
-
-					}
-
-					public void beforeEditorActivated(
-							ColumnViewerEditorActivationEvent event) {
-						ViewerCell cell = (ViewerCell) event.getSource();
-						v.getTable().showColumn(
-								v.getTable().getColumn(cell.getColumnIndex()));
-					}
-
-					public void beforeEditorDeactivated(
-							ColumnViewerEditorDeactivationEvent event) {
-
-					}
-
-				});
-
-		v.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
-		final Button b = new Button(shell, SWT.PUSH);
-		b.setText("Hide");
-		b.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				if (columnA.getColumn().getWidth() == 0) {
-					b.setText("Hide");
-					columnA.getColumn().setWidth(200);
-				} else {
-					b.setText("Show");
-					columnA.getColumn().setWidth(0);
-				}
-			}
-		});
-
-		Person[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-	}
-
-	private Person[] createModel() {
-		Person[] elements = new Person[4];
-		elements[0] = new Person("Tom", "Schindl",
-				"tom.schindl@bestsolution.at", "M");
-		elements[1] = new Person("Boris", "Bokowski",
-				"Boris_Bokowski@ca.ibm.com", "M");
-		elements[2] = new Person("Tod", "Creasey", "Tod_Creasey@ca.ibm.com",
-				"M");
-		elements[3] = new Person("Wayne", "Beaton", "wayne@eclipse.org", "M");
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new GridLayout());
-		new Snippet059CellNavigationIn33(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-
-	}
-
-	public static class TableViewerEditor extends ColumnViewerEditor {
-		/**
-		 * This viewer's table editor.
-		 */
-		private TableEditor tableEditor;
-
-		private TableViewerFocusCellManager focusCellManager;
-
-		private int feature;
-
-		/**
-		 * @param viewer
-		 *            the viewer the editor is attached to
-		 * @param focusCellManager
-		 *            the cell focus manager if one used or <code>null</code>
-		 * @param editorActivationStrategy
-		 *            the strategy used to decide about the editor activation
-		 * @param feature
-		 *            the feature mask
-		 */
-		TableViewerEditor(TableViewer viewer,
-				TableViewerFocusCellManager focusCellManager,
-				ColumnViewerEditorActivationStrategy editorActivationStrategy,
-				int feature) {
-			super(viewer, editorActivationStrategy, feature);
-			this.feature = feature;
-			tableEditor = new TableEditor(viewer.getTable());
-			this.focusCellManager = focusCellManager;
-		}
-
-		/**
-		 * Create a customized editor with focusable cells
-		 *
-		 * @param viewer
-		 *            the viewer the editor is created for
-		 * @param focusCellManager
-		 *            the cell focus manager if one needed else
-		 *            <code>null</code>
-		 * @param editorActivationStrategy
-		 *            activation strategy to control if an editor activated
-		 * @param feature
-		 *            bit mask controlling the editor
-		 *            <ul>
-		 *            <li>{@link ColumnViewerEditor#DEFAULT}</li>
-		 *            <li>{@link ColumnViewerEditor#TABBING_CYCLE_IN_ROW}</li>
-		 *            <li>{@link ColumnViewerEditor#TABBING_HORIZONTAL}</li>
-		 *            <li>{@link ColumnViewerEditor#TABBING_MOVE_TO_ROW_NEIGHBOR}</li>
-		 *            <li>{@link ColumnViewerEditor#TABBING_VERTICAL}</li>
-		 *            </ul>
-		 * @see #create(TableViewer, ColumnViewerEditorActivationStrategy, int)
-		 */
-		public static void create(TableViewer viewer,
-				TableViewerFocusCellManager focusCellManager,
-				ColumnViewerEditorActivationStrategy editorActivationStrategy,
-				int feature) {
-			TableViewerEditor editor = new TableViewerEditor(viewer,
-					focusCellManager, editorActivationStrategy, feature);
-			viewer.setColumnViewerEditor(editor);
-			if (focusCellManager != null) {
-				try {
-					Method m = focusCellManager.getClass().getSuperclass()
-							.getDeclaredMethod("init", null);
-					m.setAccessible(true);
-					m.invoke(focusCellManager, null);
-				} catch (SecurityException e) {
-					e.printStackTrace();
-				} catch (IllegalArgumentException e) {
-					e.printStackTrace();
-				} catch (IllegalAccessException e) {
-					e.printStackTrace();
-				} catch (NoSuchMethodException e) {
-					e.printStackTrace();
-				} catch (InvocationTargetException e) {
-					e.printStackTrace();
-				}
-				// focusCellManager.init();
-			}
-		}
-
-		/**
-		 * Create a customized editor whose activation process is customized
-		 *
-		 * @param viewer
-		 *            the viewer the editor is created for
-		 * @param editorActivationStrategy
-		 *            activation strategy to control if an editor activated
-		 * @param feature
-		 *            bit mask controlling the editor
-		 *            <ul>
-		 *            <li>{@link ColumnViewerEditor#DEFAULT}</li>
-		 *            <li>{@link ColumnViewerEditor#TABBING_CYCLE_IN_ROW}</li>
-		 *            <li>{@link ColumnViewerEditor#TABBING_HORIZONTAL}</li>
-		 *            <li>{@link ColumnViewerEditor#TABBING_MOVE_TO_ROW_NEIGHBOR}</li>
-		 *            <li>{@link ColumnViewerEditor#TABBING_VERTICAL}</li>
-		 *            </ul>
-		 */
-		public static void create(TableViewer viewer,
-				ColumnViewerEditorActivationStrategy editorActivationStrategy,
-				int feature) {
-			create(viewer, null, editorActivationStrategy, feature);
-		}
-
-		protected void setEditor(Control w, Item item, int columnNumber) {
-			tableEditor.setEditor(w, (TableItem) item, columnNumber);
-		}
-
-		protected void setLayoutData(LayoutData layoutData) {
-			tableEditor.grabHorizontal = layoutData.grabHorizontal;
-			tableEditor.horizontalAlignment = layoutData.horizontalAlignment;
-			tableEditor.minimumWidth = layoutData.minimumWidth;
-		}
-
-		public ViewerCell getFocusCell() {
-			if (focusCellManager != null) {
-				return focusCellManager.getFocusCell();
-			}
-
-			return super.getFocusCell();
-		}
-
-		protected void updateFocusCell(ViewerCell focusCell,
-				ColumnViewerEditorActivationEvent event) {
-			// Update the focus cell when we activated the editor with these 2
-			// events
-			if (event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC
-					|| event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL) {
-
-				if (focusCellManager != null) {
-					try {
-						Method m = AbstractTableViewer.class.getDeclaredMethod(
-								"getSelectionFromWidget", null);
-						m.setAccessible(true);
-						List l = (List) m.invoke(getViewer(), null);
-
-						if (focusCellManager != null) {
-							m = focusCellManager.getClass().getSuperclass()
-									.getDeclaredMethod("setFocusCell",
-											new Class[] { ViewerCell.class });
-							m.setAccessible(true);
-							m.invoke(focusCellManager,
-									new Object[] { focusCell });
-						}
-
-						if (!l.contains(focusCell.getElement())) {
-							getViewer().setSelection(
-									new StructuredSelection(focusCell
-											.getElement()));
-						}
-
-					} catch (SecurityException e) {
-						e.printStackTrace();
-					} catch (IllegalArgumentException e) {
-						e.printStackTrace();
-					} catch (IllegalAccessException e) {
-						e.printStackTrace();
-					} catch (NoSuchMethodException e) {
-						e.printStackTrace();
-					} catch (InvocationTargetException e) {
-						e.printStackTrace();
-					}
-
-				}
-			}
-		}
-
-		protected void processTraverseEvent(int columnIndex, ViewerRow row,
-				TraverseEvent event) {
-			ViewerCell cell2edit = null;
-
-			if (event.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
-				event.doit = false;
-
-				if ((event.stateMask & SWT.CTRL) == SWT.CTRL
-						&& (feature & TABBING_VERTICAL) == TABBING_VERTICAL) {
-					cell2edit = searchCellAboveBelow(row, getViewer(), columnIndex, true);
-				} else if ((feature & TABBING_HORIZONTAL) == TABBING_HORIZONTAL) {
-					cell2edit = searchPreviousCell(row, row.getCell(columnIndex),
-							row.getCell(columnIndex), getViewer());
-				}
-			} else if (event.detail == SWT.TRAVERSE_TAB_NEXT) {
-				event.doit = false;
-
-				if ((event.stateMask & SWT.CTRL) == SWT.CTRL
-						&& (feature & TABBING_VERTICAL) == TABBING_VERTICAL) {
-					cell2edit = searchCellAboveBelow(row, getViewer(), columnIndex,
-							false);
-				} else if ((feature & TABBING_HORIZONTAL) == TABBING_HORIZONTAL) {
-					cell2edit = searchNextCell(row, row.getCell(columnIndex), row
-							.getCell(columnIndex), getViewer());
-				}
-			}
-
-			System.err.println("NEXT CELL: " + cell2edit);
-
-			if (cell2edit != null) {
-				getViewer().getControl().setRedraw(false);
-				ColumnViewerEditorActivationEvent acEvent = new ColumnViewerEditorActivationEvent(
-						cell2edit, event);
-
-				try {
-					Method m = ColumnViewer.class.getDeclaredMethod("triggerEditorActivationEvent", new Class[] { ColumnViewerEditorActivationEvent.class });
-					m.setAccessible(true);
-					m.invoke(getViewer(), new Object[] {acEvent});
-				} catch (SecurityException e) {
-					e.printStackTrace();
-				} catch (NoSuchMethodException e) {
-					e.printStackTrace();
-				} catch (IllegalArgumentException e) {
-					e.printStackTrace();
-				} catch (IllegalAccessException e) {
-					e.printStackTrace();
-				} catch (InvocationTargetException e) {
-					e.printStackTrace();
-				}
-
-				getViewer().getControl().setRedraw(true);
-			}
-		}
-
-		private ViewerCell searchCellAboveBelow(ViewerRow row, ColumnViewer viewer,
-				int columnIndex, boolean above) {
-			ViewerCell rv = null;
-
-			ViewerRow newRow = null;
-
-			if (above) {
-				newRow = row.getNeighbor(ViewerRow.ABOVE, false);
-			} else {
-				newRow = row.getNeighbor(ViewerRow.BELOW, false);
-			}
-
-			try {
-			if (newRow != null) {
-				Method m = ColumnViewer.class.getDeclaredMethod("getViewerColumn", new Class[] { int.class });
-				m.setAccessible(true);
-				ViewerColumn column = (ViewerColumn) m.invoke(viewer, new Object[] { new Integer(columnIndex) });
-				m = ViewerColumn.class.getDeclaredMethod("getEditingSupport", null);
-				m.setAccessible(true);
-
-				EditingSupport es = (EditingSupport) m.invoke(column, null);
-
-				if (column != null
-						&& es != null) {
-					m = EditingSupport.class.getDeclaredMethod("canEdit", new Class[] { Object.class });
-					m.setAccessible(true);
-					Boolean b = (Boolean) m.invoke(es, new Object[] {newRow.getItem().getData()});
-					if( b.booleanValue() ) {
-						rv = newRow.getCell(columnIndex);
-					}
-
-				} else {
-					rv = searchCellAboveBelow(newRow, viewer, columnIndex, above);
-				}
-			}
-			} catch( Exception e ) {
-				e.printStackTrace();
-			}
-
-			return rv;
-		}
-
-		private ViewerCell searchPreviousCell(ViewerRow row,
-				ViewerCell currentCell, ViewerCell originalCell, ColumnViewer viewer) {
-			ViewerCell rv = null;
-			ViewerCell previousCell;
-
-			if (currentCell != null) {
-				previousCell = getNeighbor(currentCell,ViewerCell.LEFT, true);
-			} else {
-				if (row.getColumnCount() != 0) {
-					previousCell = row.getCell(getCreationIndex(row,row
-							.getColumnCount() - 1));
-				} else {
-					previousCell = row.getCell(0);
-				}
-
-			}
-
-			// No endless loop
-			if (originalCell.equals(previousCell)) {
-				return null;
-			}
-
-			if (previousCell != null) {
-				if (isCellEditable(viewer, previousCell)) {
-					rv = previousCell;
-				} else {
-					rv = searchPreviousCell(row, previousCell, originalCell, viewer);
-				}
-			} else {
-				if ((feature & TABBING_CYCLE_IN_ROW) == TABBING_CYCLE_IN_ROW) {
-					rv = searchPreviousCell(row, null, originalCell, viewer);
-				} else if ((feature & TABBING_MOVE_TO_ROW_NEIGHBOR) == TABBING_MOVE_TO_ROW_NEIGHBOR) {
-					ViewerRow rowAbove = row.getNeighbor(ViewerRow.ABOVE, false);
-					if (rowAbove != null) {
-						rv = searchPreviousCell(rowAbove, null, originalCell,
-								viewer);
-					}
-				}
-			}
-
-			return rv;
-		}
-
-		private ViewerCell searchNextCell(ViewerRow row, ViewerCell currentCell,
-				ViewerCell originalCell, ColumnViewer viewer) {
-			ViewerCell rv = null;
-
-			ViewerCell nextCell;
-
-			if (currentCell != null) {
-				nextCell = getNeighbor(currentCell,ViewerCell.RIGHT, true);
-			} else {
-				nextCell = row.getCell(getCreationIndex(row,0));
-			}
-
-			// No endless loop
-			if (originalCell.equals(nextCell)) {
-				return null;
-			}
-
-			if (nextCell != null) {
-				if (isCellEditable(viewer, nextCell)) {
-					rv = nextCell;
-				} else {
-					rv = searchNextCell(row, nextCell, originalCell, viewer);
-				}
-			} else {
-				if ((feature & TABBING_CYCLE_IN_ROW) == TABBING_CYCLE_IN_ROW) {
-					rv = searchNextCell(row, null, originalCell, viewer);
-				} else if ((feature & TABBING_MOVE_TO_ROW_NEIGHBOR) == TABBING_MOVE_TO_ROW_NEIGHBOR) {
-					ViewerRow rowBelow = row.getNeighbor(ViewerRow.BELOW, false);
-					if (rowBelow != null) {
-						rv = searchNextCell(rowBelow, null, originalCell, viewer);
-					}
-				}
-			}
-
-			return rv;
-		}
-
-		private boolean isCellEditable(ColumnViewer viewer, ViewerCell cell) {
-			try {
-				Method m = ColumnViewer.class.getDeclaredMethod("getViewerColumn", new Class[] { int.class });
-				m.setAccessible(true);
-				ViewerColumn column = (ViewerColumn) m.invoke(viewer, new Object[] { new Integer(cell.getColumnIndex()) });
-				m = ViewerColumn.class.getDeclaredMethod("getEditingSupport", null);
-				m.setAccessible(true);
-
-				EditingSupport es = (EditingSupport) m.invoke(column, null);
-
-				if( column != null && es != null ) {
-					m = EditingSupport.class.getDeclaredMethod("canEdit", new Class[] { Object.class });
-					m.setAccessible(true);
-//					return true;
-					Boolean b = (Boolean) m.invoke(es, new Object[] {cell.getElement()});
-					return b.booleanValue();
-				}
-			} catch(Exception e) {
-				e.printStackTrace();
-			}
-			return false;
-		}
-	}
-
-
-
-	// Reimplementation of ViewerCell-Methods
-	private static int getVisualIndex(ViewerRow row, int creationIndex) {
-		TableItem item = (TableItem) row.getItem();
-		int[] order = item.getParent().getColumnOrder();
-
-		for (int i = 0; i < order.length; i++) {
-			if (order[i] == creationIndex) {
-				return i;
-			}
-		}
-		return creationIndex;
-	}
-
-	private static int getCreationIndex(ViewerRow row, int visualIndex) {
-		TableItem item = (TableItem) row.getItem();
-		if (item != null && !item.isDisposed() /*
-												 * && hasColumns() &&
-												 * isValidOrderIndex(visualIndex)
-												 */) {
-			return item.getParent().getColumnOrder()[visualIndex];
-		}
-		return visualIndex;
-	}
-
-	private static ViewerCell getCellAtVisualIndex(ViewerRow row,
-			int visualIndex) {
-		return getCell(row, getCreationIndex(row, visualIndex));
-	}
-
-	private static boolean isVisible(ViewerCell cell) {
-		return getWidth(cell) > 0;
-	}
-
-	private static int getWidth(ViewerCell cell) {
-		TableItem item = (TableItem) cell.getViewerRow().getItem();
-		return item.getParent().getColumn(cell.getColumnIndex())
-				.getWidth();
-	}
-
-	private static ViewerCell getCell(ViewerRow row, int index) {
-		return row.getCell(index);
-	}
-
-	private static ViewerCell getNeighbor(ViewerCell currentCell,
-			int directionMask, boolean sameLevel) {
-		ViewerRow row;
-
-		if ((directionMask & ViewerCell.ABOVE) == ViewerCell.ABOVE) {
-			row = currentCell.getViewerRow().getNeighbor(
-					ViewerRow.ABOVE, sameLevel);
-		} else if ((directionMask & ViewerCell.BELOW) == ViewerCell.BELOW) {
-			row = currentCell.getViewerRow().getNeighbor(
-					ViewerRow.BELOW, sameLevel);
-		} else {
-			row = currentCell.getViewerRow();
-		}
-
-		if (row != null) {
-			int columnIndex;
-			columnIndex = getVisualIndex(row, currentCell
-					.getColumnIndex());
-
-			int modifier = 0;
-
-			if ((directionMask & ViewerCell.LEFT) == ViewerCell.LEFT) {
-				modifier = -1;
-			} else if ((directionMask & ViewerCell.RIGHT) == ViewerCell.RIGHT) {
-				modifier = 1;
-			}
-
-			columnIndex += modifier;
-
-			if (columnIndex >= 0 && columnIndex < row.getColumnCount()) {
-				ViewerCell cell = getCellAtVisualIndex(row, columnIndex);
-				if (cell != null) {
-					while (cell != null
-							&& columnIndex < row.getColumnCount() - 1
-							&& columnIndex > 0) {
-						if (isVisible(cell)) {
-							break;
-						}
-
-						columnIndex += modifier;
-						cell = getCellAtVisualIndex(row, columnIndex);
-						if (cell == null) {
-							break;
-						}
-					}
-				}
-
-				return cell;
-			}
-		}
-		return null;
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet060TextCellEditorWithContentProposal.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet060TextCellEditorWithContentProposal.java
deleted file mode 100644
index 365939f..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/Snippet060TextCellEditorWithContentProposal.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Software Competence Center Hagenberg (SCCH) GmbH
- * Copyright (c) 2008 Mario Winterer
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.bindings.keys.IKeyLookup;
-import org.eclipse.jface.bindings.keys.KeyLookupFactory;
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.jface.fieldassist.ContentProposalAdapter;
-import org.eclipse.jface.fieldassist.IContentProposalListener2;
-import org.eclipse.jface.fieldassist.IContentProposalProvider;
-import org.eclipse.jface.fieldassist.SimpleContentProposalProvider;
-import org.eclipse.jface.fieldassist.TextContentAdapter;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.FocusCellHighlighter;
-import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TableViewerEditor;
-import org.eclipse.jface.viewers.TableViewerFocusCellManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-
-/**
- * Shows how to attach content assist to a text cell editor.
- * 
- * @author Mario Winterer
- */
-public class Snippet060TextCellEditorWithContentProposal {
-	private static class Color {
-		public String name;
-
-		public Color(String name) {
-			this.name = name;
-		}
-
-		public String toString() {
-			return name;
-		}
-	}
-
-	public static class TextCellEditorWithContentProposal extends TextCellEditor {
-
-		private ContentProposalAdapter contentProposalAdapter;
-		private boolean popupOpen = false; // true, iff popup is currently open
-
-		public TextCellEditorWithContentProposal(Composite parent, IContentProposalProvider contentProposalProvider,
-				KeyStroke keyStroke, char[] autoActivationCharacters) {
-			super(parent);
-
-			enableContentProposal(contentProposalProvider, keyStroke, autoActivationCharacters);
-		}
-
-		private void enableContentProposal(IContentProposalProvider contentProposalProvider, KeyStroke keyStroke,
-				char[] autoActivationCharacters) {
-			contentProposalAdapter = new ContentProposalAdapter(text, new TextContentAdapter(),
-					contentProposalProvider, keyStroke, autoActivationCharacters);
-
-			// Listen for popup open/close events to be able to handle focus events correctly
-			contentProposalAdapter.addContentProposalListener(new IContentProposalListener2() {
-
-				public void proposalPopupClosed(ContentProposalAdapter adapter) {
-					popupOpen = false;
-				}
-
-				public void proposalPopupOpened(ContentProposalAdapter adapter) {
-					popupOpen = true;
-				}
-			});
-		}
-
-		/**
-		 * Return the {@link ContentProposalAdapter} of this cell editor.
-		 * 
-		 * @return the {@link ContentProposalAdapter}
-		 */
-		public ContentProposalAdapter getContentProposalAdapter() {
-			return contentProposalAdapter;
-		}
-
-		protected void focusLost() {
-			if (!popupOpen) {
-				// Focus lost deactivates the cell editor.
-				// This must not happen if focus lost was caused by activating
-				// the completion proposal popup.
-				super.focusLost();
-			}
-		}
-
-		protected boolean dependsOnExternalFocusListener() {
-			// Always return false;
-			// Otherwise, the ColumnViewerEditor will install an additional focus listener
-			// that cancels cell editing on focus lost, even if focus gets lost due to
-			// activation of the completion proposal popup. See also bug 58777.
-			return false;
-		}
-	}
-
-	private static class ColorNameEditingSupport extends EditingSupport {
-		private TextCellEditorWithContentProposal cellEditor;
-
-		public ColorNameEditingSupport(TableViewer viewer) {
-			super(viewer);
-
-			IContentProposalProvider contentProposalProvider = new SimpleContentProposalProvider(new String[] { "red",
-					"green", "blue" });
-			cellEditor = new TextCellEditorWithContentProposal(viewer.getTable(), contentProposalProvider, null, null);
-		}
-
-		protected boolean canEdit(Object element) {
-			return (element instanceof Color);
-		}
-
-		protected CellEditor getCellEditor(Object element) {
-			return cellEditor;
-		}
-
-		protected Object getValue(Object element) {
-			return ((Color) element).name;
-		}
-
-		protected void setValue(Object element, Object value) {
-			((Color) element).name = value.toString();
-			getViewer().update(element, null);
-		}
-
-	}
-
-	public Snippet060TextCellEditorWithContentProposal(Shell shell) {
-		final TableViewer viewer = new TableViewer(shell, SWT.BORDER | SWT.FULL_SELECTION);
-		final Table table = viewer.getTable();
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-
-		final TableViewerColumn colorColumn = new TableViewerColumn(viewer, SWT.LEFT);
-		colorColumn.getColumn().setText("Color name");
-		colorColumn.getColumn().setWidth(200);
-		colorColumn.setLabelProvider(new ColumnLabelProvider());
-		colorColumn.setEditingSupport(new ColorNameEditingSupport(viewer));
-
-		viewer.setContentProvider(new ArrayContentProvider());
-
-		ColumnViewerEditorActivationStrategy activationSupport = new ColumnViewerEditorActivationStrategy(viewer) {
-			protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
-				return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
-						|| event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
-						|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC
-						|| (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == KeyLookupFactory
-								.getDefault().formalKeyLookup(IKeyLookup.ENTER_NAME));
-			}
-		};
-		activationSupport.setEnableEditorActivationWithKeyboard(true);
-
-		/*
-		 * Without focus highlighter, keyboard events will not be delivered to
-		 * ColumnViewerEditorActivationStragety#isEditorActivationEvent(...) (see above)
-		 */
-		FocusCellHighlighter focusCellHighlighter = new FocusCellOwnerDrawHighlighter(viewer);
-		TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(viewer, focusCellHighlighter);
-
-		TableViewerEditor.create(viewer, focusCellManager, activationSupport, ColumnViewerEditor.TABBING_VERTICAL
-				| ColumnViewerEditor.KEYBOARD_ACTIVATION);
-
-		viewer.setInput(createModel());
-	}
-
-	private Color[] createModel() {
-		return new Color[] { new Color("red"), new Color("green") };
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet060TextCellEditorWithContentProposal(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/TableCursor.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/TableCursor.java
deleted file mode 100644
index c56b26a..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/viewers/TableCursor.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.snippets.viewers;
-
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.AbstractTableViewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Table;
-
-
-public class TableCursor extends AbstractCellCursor {
-	
-	public TableCursor(AbstractTableViewer viewer) {
-		super(viewer,SWT.NONE);
-	}
-	
-	protected void paint(Event event) {
-		if (getSelectedCells().length == 1 && getSelectedCells()[0] == null) return;
-		ViewerCell cell = getSelectedCells()[0];
-		
-		GC gc = event.gc;
-		Display display = getDisplay();
-		gc.setBackground(getBackground());
-		gc.setForeground(getForeground());
-		gc.fillRectangle(event.x, event.y, event.width, event.height);
-		int x = 0;
-		Point size = getSize();
-		Image image = cell.getImage();
-		if (image != null) {
-			Rectangle imageSize = image.getBounds();
-			int imageY = (size.y - imageSize.height) / 2;
-			gc.drawImage(image, x, imageY);
-			x += imageSize.width;
-		}
-		String text = cell.getText();
-		if (text != "") { //$NON-NLS-1$
-			Rectangle bounds = cell.getBounds();
-			Point extent = gc.stringExtent(text);
-			// Temporary code - need a better way to determine table trim
-			if (Util.isWin32()) {
-				if (((Table)getParent()).getColumnCount() == 0 || cell.getColumnIndex() == 0) {
-					x += 2; 
-				} else {
-					int alignmnent = ((Table)getParent()).getColumn(cell.getColumnIndex()).getAlignment();
-					switch (alignmnent) {
-						case SWT.LEFT:
-							x += 6;
-							break;
-						case SWT.RIGHT:
-							x = bounds.width - extent.x - 6;
-							break;
-						case SWT.CENTER:
-							x += (bounds.width - x - extent.x) / 2;
-							break;
-					}
-				}
-			}  else {
-				if (((Table)getParent()).getColumnCount() == 0) {
-					x += 5; 
-				} else {
-					int alignmnent = ((Table)getParent()).getColumn(cell.getColumnIndex()).getAlignment();
-					switch (alignmnent) {
-						case SWT.LEFT:
-							x += 5;
-							break;
-						case SWT.RIGHT:
-							x = bounds.width- extent.x - 2;
-							break;
-						case SWT.CENTER:
-							x += (bounds.width - x - extent.x) / 2 + 2;
-							break;
-					}
-				}
-			}
-			int textY = (size.y - extent.y) / 2;
-			gc.drawString(text, x, textY);
-		}
-		if (isFocusControl()) {
-			gc.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
-			gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
-			gc.drawFocus(0, 0, size.x, size.y);
-		}
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/window/Snippet020CustomizedControlTooltips.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/window/Snippet020CustomizedControlTooltips.java
deleted file mode 100644
index 6cb2caa..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/window/Snippet020CustomizedControlTooltips.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.window;
-
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.jface.window.DefaultToolTip;
-import org.eclipse.jface.window.ToolTip;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Demonstrate usage of custom toolstips for controls
- * 
- * @author Tom Schindl
- * 
- */
-public class Snippet020CustomizedControlTooltips {
-	protected class MyToolTip extends ToolTip {
-		
-		private Shell parentShell;
-		
-		private String headerText = "ToolTip-Header";
-		
-		public static final String HEADER_BG_COLOR = Policy.JFACE + ".TOOLTIP_HEAD_BG_COLOR";
-		
-		public static final String HEADER_FG_COLOR = Policy.JFACE + ".TOOLTIP_HEAD_FG_COLOR";
-		
-		public static final String HEADER_FONT = Policy.JFACE + ".TOOLTIP_HEAD_FONT";
-		
-		public static final String HEADER_CLOSE_ICON = Policy.JFACE + ".TOOLTIP_CLOSE_ICON";
-		public static final String HEADER_HELP_ICON = Policy.JFACE + ".TOOLTIP_HELP_ICON";
-		
-		public MyToolTip(Control control) {
-			super(control);
-			this.parentShell = control.getShell();
-		}
-
-		protected Composite createToolTipContentArea(Event event,
-				Composite parent) {
-			Composite comp = new Composite(parent,SWT.NONE);
-			
-			GridLayout gl = new GridLayout(1,false);
-			gl.marginBottom=0;
-			gl.marginTop=0;
-			gl.marginHeight=0;
-			gl.marginWidth=0;
-			gl.marginLeft=0;
-			gl.marginRight=0;
-			gl.verticalSpacing=1;
-			comp.setLayout(gl);
-			
-			Composite topArea = new Composite(comp,SWT.NONE);
-			GridData data = new GridData(SWT.FILL,SWT.FILL,true,false);
-			data.widthHint=200;
-			topArea.setLayoutData(data);
-			topArea.setBackground(JFaceResources.getColorRegistry().get(HEADER_BG_COLOR));
-			
-			gl = new GridLayout(2,false);
-			gl.marginBottom=2;
-			gl.marginTop=2;
-			gl.marginHeight=0;
-			gl.marginWidth=0;
-			gl.marginLeft=5;
-			gl.marginRight=2;
-			
-			topArea.setLayout(gl);
-			
-			Label l = new Label(topArea,SWT.NONE);
-			l.setText(headerText);
-			l.setBackground(JFaceResources.getColorRegistry().get(HEADER_BG_COLOR));
-			l.setFont(JFaceResources.getFontRegistry().get(HEADER_FONT));
-			l.setForeground(JFaceResources.getColorRegistry().get(HEADER_FG_COLOR));
-			l.setLayoutData(new GridData(GridData.FILL_BOTH));
-			
-			Composite iconComp = new Composite(topArea,SWT.NONE);
-			iconComp.setLayoutData(new GridData());
-			iconComp.setLayout(new GridLayout(2,false));
-			iconComp.setBackground(JFaceResources.getColorRegistry().get(HEADER_BG_COLOR));
-			
-			gl = new GridLayout(2,false);
-			gl.marginBottom=0;
-			gl.marginTop=0;
-			gl.marginHeight=0;
-			gl.marginWidth=0;
-			gl.marginLeft=0;
-			gl.marginRight=0;
-			iconComp.setLayout(gl);
-			
-			Label helpIcon = new Label(iconComp,SWT.NONE);
-			helpIcon.setBackground(JFaceResources.getColorRegistry().get(HEADER_BG_COLOR));
-			helpIcon.setImage(JFaceResources.getImage(HEADER_HELP_ICON));
-			helpIcon.addMouseListener(new MouseAdapter() {
-
-				public void mouseDown(MouseEvent e) {
-					hide();
-					openHelp();
-				}
-			});
-			
-			
-			Label closeIcon = new Label(iconComp,SWT.NONE);
-			closeIcon.setBackground(JFaceResources.getColorRegistry().get(HEADER_BG_COLOR));
-			closeIcon.setImage(JFaceResources.getImage(HEADER_CLOSE_ICON));
-			closeIcon.addMouseListener(new MouseAdapter() {
-
-				public void mouseDown(MouseEvent e) {
-					parentShell.setFocus();
-					hide();
-				}
-			});
-			
-			createContentArea(comp).setLayoutData(new GridData(GridData.FILL_BOTH));
-			
-			return comp;
-		}
-		
-		protected Composite createContentArea(Composite parent) {
-			return new Composite(parent,SWT.NONE);
-		}
-		
-		protected void openHelp() {
-			parentShell.setFocus();
-		}
-	}
-
-	public Snippet020CustomizedControlTooltips(final Shell parent) {
-		JFaceResources.getColorRegistry().put(MyToolTip.HEADER_BG_COLOR, new RGB(255,255,255));
-		JFaceResources.getFontRegistry().put(MyToolTip.HEADER_FONT, JFaceResources.getFontRegistry().getBold(JFaceResources.getDefaultFont().getFontData()[0].getName()).getFontData());
-
-		
-		JFaceResources.getImageRegistry().put(MyToolTip.HEADER_CLOSE_ICON,ImageDescriptor.createFromFile(Snippet020CustomizedControlTooltips.class, "showerr_tsk.gif"));
-		JFaceResources.getImageRegistry().put(MyToolTip.HEADER_HELP_ICON,ImageDescriptor.createFromFile(Snippet020CustomizedControlTooltips.class, "linkto_help.gif"));
-		
-		Text text = new Text(parent,SWT.BORDER);
-		text.setText("Hello World");
-
-		MyToolTip myTooltipLabel = new MyToolTip(text) {
-
-			protected Composite createContentArea(Composite parent) {
-				Composite comp = super.createContentArea(parent);
-				comp.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-				FillLayout layout = new FillLayout();
-				layout.marginWidth=5;
-				comp.setLayout(layout);
-				Link l = new Link(comp,SWT.NONE);
-				l.setText("This a custom tooltip you can: \n- pop up any control you want\n- define delays\n - ... \nGo and get Eclipse M4 from <a>http://www.eclipse.org</a>");
-				l.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-				l.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						openURL();
-					}
-				});
-				return comp;
-			}
-			
-			protected void openURL() {
-				MessageBox box = new MessageBox(parent,SWT.ICON_INFORMATION);
-				box.setText("Eclipse.org");
-				box.setMessage("Here is where we'd open the URL.");
-				box.open();
-			}
-
-			protected void openHelp() {
-				MessageBox box = new MessageBox(parent,SWT.ICON_INFORMATION);
-				box.setText("Info");
-				box.setMessage("Here is where we'd show some information.");
-				box.open();
-			}
-			
-		};
-		myTooltipLabel.setShift(new Point(-5, -5));
-		myTooltipLabel.setHideOnMouseDown(false);
-		myTooltipLabel.activate();
-
-		text = new Text(parent,SWT.BORDER);
-		text.setText("Hello World");
-		DefaultToolTip toolTip = new DefaultToolTip(text);
-		toolTip.setText("Hello World\nHello World");
-		toolTip.setBackgroundColor(parent.getDisplay().getSystemColor(SWT.COLOR_RED));
-		
-		Button b = new Button(parent,SWT.PUSH);
-		b.setText("Popup on press");
-		
-		final DefaultToolTip toolTipDelayed = new DefaultToolTip(b,ToolTip.RECREATE,true);
-		toolTipDelayed.setText("Hello World\nHello World");
-		toolTipDelayed.setBackgroundColor(parent.getDisplay().getSystemColor(SWT.COLOR_RED));
-		toolTipDelayed.setHideDelay(2000);
-		
-		b.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				toolTipDelayed.show(new Point(0,0));
-			}
-		});
-		
-		
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new RowLayout());
-		new Snippet020CustomizedControlTooltips(shell);
-
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/window/Snippet023TreeViewerCustomTooltips.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/window/Snippet023TreeViewerCustomTooltips.java
deleted file mode 100755
index ceeab83..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/window/Snippet023TreeViewerCustomTooltips.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.window;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.CellLabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-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.TreeItem;
-
-/**
- * A simple TreeViewer to demonstrate how custom tooltips could be created
- * easily. This is an extended version from
- * http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet125.java
- * 
- * This code is for users pre 3.3 others could use newly added tooltip support in
- * {@link CellLabelProvider}
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet023TreeViewerCustomTooltips {
-	private class MyContentProvider implements ITreeContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return ((MyModel) inputElement).child.toArray();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			return getElements(parentElement);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			if (element == null) {
-				return null;
-			}
-
-			return ((MyModel) element).parent;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-			return ((MyModel) element).child.size() > 0;
-		}
-
-	}
-
-	public class MyModel {
-		public MyModel parent;
-
-		public ArrayList child = new ArrayList();
-
-		public int counter;
-
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if (parent != null) {
-				rv = parent.toString() + ".";
-			}
-
-			rv += counter;
-
-			return rv;
-		}
-	}
-
-	public Snippet023TreeViewerCustomTooltips(Shell shell) {
-		final TreeViewer v = new TreeViewer(shell);
-		v.setLabelProvider(new LabelProvider());
-		v.setContentProvider(new MyContentProvider());
-		v.setInput(createModel());
-		v.getTree().setToolTipText("");
-
-		final Listener labelListener = new Listener () {
-			public void handleEvent (Event event) {
-				Label label = (Label)event.widget;
-				Shell shell = label.getShell ();
-				switch (event.type) {
-					case SWT.MouseDown:
-						Event e = new Event ();
-						e.item = (TreeItem) label.getData ("_TABLEITEM");
-						// Assuming table is single select, set the selection as if
-						// the mouse down event went through to the table
-						v.getTree().setSelection (new TreeItem [] {(TreeItem) e.item});
-						v.getTree().notifyListeners (SWT.Selection, e);
-						shell.dispose ();
-						v.getTree().setFocus();
-						break;
-					case SWT.MouseExit:
-						shell.dispose ();
-						break;
-				}
-			}
-		};
-		
-		Listener treeListener = new Listener () {
-			Shell tip = null;
-			Label label = null;
-			public void handleEvent (Event event) {
-				switch (event.type) {
-					case SWT.Dispose:
-					case SWT.KeyDown:
-					case SWT.MouseMove: {
-						if (tip == null) break;
-						tip.dispose ();
-						tip = null;
-						label = null;
-						break;
-					}
-					case SWT.MouseHover: {
-						Point coords = new Point(event.x, event.y);
-						TreeItem item = v.getTree().getItem(coords);
-						if (item != null) {
-							int columns = v.getTree().getColumnCount();
-
-							for (int i = 0; i < columns || i == 0; i++) {
-								if (item.getBounds(i).contains(coords)) {
-									if (tip != null  && !tip.isDisposed ()) tip.dispose ();
-									tip = new Shell (v.getTree().getShell(), SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
-									tip.setBackground (v.getTree().getDisplay().getSystemColor (SWT.COLOR_INFO_BACKGROUND));
-									FillLayout layout = new FillLayout ();
-									layout.marginWidth = 2;
-									tip.setLayout (layout);
-									label = new Label (tip, SWT.NONE);
-									label.setForeground (v.getTree().getDisplay().getSystemColor (SWT.COLOR_INFO_FOREGROUND));
-									label.setBackground (v.getTree().getDisplay().getSystemColor (SWT.COLOR_INFO_BACKGROUND));
-									label.setData ("_TABLEITEM", item);
-									label.setText ("Tooltip: " + item.getData()+ " => Column: " + i);
-									label.addListener (SWT.MouseExit, labelListener);
-									label.addListener (SWT.MouseDown, labelListener);
-									Point size = tip.computeSize (SWT.DEFAULT, SWT.DEFAULT);
-									Rectangle rect = item.getBounds (i);
-									Point pt = v.getTree().toDisplay (rect.x, rect.y);
-									tip.setBounds (pt.x, pt.y, size.x, size.y);
-									tip.setVisible (true);
-									break;
-								}
-							}
-						}
-					}
-				}
-			}
-		};
-		v.getTree().addListener (SWT.Dispose, treeListener);
-		v.getTree().addListener (SWT.KeyDown, treeListener);
-		v.getTree().addListener (SWT.MouseMove, treeListener);
-		v.getTree().addListener (SWT.MouseHover, treeListener);
-	}
-
-	private MyModel createModel() {
-
-		MyModel root = new MyModel(0, null);
-		root.counter = 0;
-
-		MyModel tmp;
-		for (int i = 1; i < 10; i++) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for (int j = 1; j < i; j++) {
-				tmp.child.add(new MyModel(j, tmp));
-			}
-		}
-
-		return root;
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet023TreeViewerCustomTooltips(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/window/Snippet031TableStaticTooltip.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/window/Snippet031TableStaticTooltip.java
deleted file mode 100644
index 88e2b9c..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/window/Snippet031TableStaticTooltip.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Tom Schindl and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tom Schindl - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.snippets.window;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.DefaultToolTip;
-import org.eclipse.jface.window.ToolTip;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * Example how one can create a tooltip which is not recreated for every table
- * cell
- * 
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * 
- */
-public class Snippet031TableStaticTooltip {
-	private static Image[] images;
-
-	private class MyContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return (MyModel[]) inputElement;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	public class MyModel {
-		public int counter;
-
-		public MyModel(int counter) {
-			this.counter = counter;
-		}
-
-		public String toString() {
-			return "Item " + this.counter;
-		}
-	}
-
-	public class MyLabelProvider extends LabelProvider implements
-			ITableLabelProvider {
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			if (columnIndex == 1) {
-				return images[((MyModel) element).counter % 4];
-			}
-
-			return null;
-		}
-
-		public String getColumnText(Object element, int columnIndex) {
-			return "Column " + columnIndex + " => " + element.toString();
-		}
-
-	}
-
-	private static Image createImage(Display display, int red, int green,
-			int blue) {
-		Color color = new Color(display, red, green, blue);
-		Image image = new Image(display, 10, 10);
-		GC gc = new GC(image);
-		gc.setBackground(color);
-		gc.fillRectangle(0, 0, 10, 10);
-		gc.dispose();
-
-		return image;
-	}
-
-	public Snippet031TableStaticTooltip(Shell shell) {
-		final TableViewer v = new TableViewer(shell, SWT.BORDER
-				| SWT.FULL_SELECTION);
-		v.setLabelProvider(new MyLabelProvider());
-		v.setContentProvider(new MyContentProvider());
-
-		TableColumn column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 1");
-
-		column = new TableColumn(v.getTable(), SWT.NONE);
-		column.setWidth(200);
-		column.setText("Column 2");
-
-		MyModel[] model = createModel();
-		v.setInput(model);
-		v.getTable().setLinesVisible(true);
-		v.getTable().setHeaderVisible(true);
-
-		DefaultToolTip toolTip = new DefaultToolTip(v.getControl(),
-				ToolTip.NO_RECREATE, false);
-		toolTip.setText("Hello World\nHello World");
-		toolTip.setBackgroundColor(v.getTable().getDisplay().getSystemColor(
-				SWT.COLOR_RED));
-		toolTip.setShift(new Point(10, 5));
-	}
-
-	private MyModel[] createModel() {
-		MyModel[] elements = new MyModel[10];
-
-		for (int i = 0; i < 10; i++) {
-			elements[i] = new MyModel(i);
-		}
-
-		return elements;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		images = new Image[4];
-		images[0] = createImage(display, 0, 0, 255);
-		images[1] = createImage(display, 0, 255, 255);
-		images[2] = createImage(display, 0, 255, 0);
-		images[3] = createImage(display, 255, 0, 255);
-
-		Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-		new Snippet031TableStaticTooltip(shell);
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		for (int i = 0; i < images.length; i++) {
-			images[i].dispose();
-		}
-
-		display.dispose();
-
-	}
-
-}
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/window/linkto_help.gif b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/window/linkto_help.gif
deleted file mode 100644
index 86550fe..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/window/linkto_help.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/window/showerr_tsk.gif b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/window/showerr_tsk.gif
deleted file mode 100644
index 2ff6678..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/window/showerr_tsk.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/wizard/Snippet047WizardWithLongRunningOperation.java b/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/wizard/Snippet047WizardWithLongRunningOperation.java
deleted file mode 100644
index 20b649c..0000000
--- a/examples/org.eclipse.jface.snippets/Eclipse JFace Snippets/org/eclipse/jface/snippets/wizard/Snippet047WizardWithLongRunningOperation.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.snippets.wizard;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardDialog;
-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.FillLayout;
-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.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.ProgressBar;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Example how to load data from a background thread into a TableViewer
- *
- * @author Tom Schindl <tom.schindl@bestsolution.at>
- * @since 1.0
- */
-public class Snippet047WizardWithLongRunningOperation {
-
-	private static class MyWizard extends Wizard {
-
-		private int loadingType;
-
-		public MyWizard(int loadingType) {
-			this.loadingType = loadingType;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.wizard.Wizard#addPages()
-		 */
-		public void addPages() {
-			addPage(new MyWizardPage("Standard Page"));
-			addPage(new MyWizardPageThread("Thread Page", loadingType));
-		}
-
-		public boolean performFinish() {
-			return true;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.jface.wizard.Wizard#canFinish()
-		 */
-		public boolean canFinish() {
-			IWizardPage[] pages = getPages();
-			for (int i = 0; i < pages.length; i++) {
-				if (!pages[i].isPageComplete()) {
-					return false;
-				}
-			}
-
-			return true;
-		}
-
-	};
-
-	private static class MyWizardPage extends WizardPage {
-
-		protected MyWizardPage(String pageName) {
-			super(pageName);
-			setTitle(pageName);
-		}
-
-		public void createControl(Composite parent) {
-			Composite comp = new Composite(parent, SWT.NONE);
-			setControl(comp);
-		}
-	}
-
-	private static class MyWizardPageThread extends WizardPage {
-		private int loadingType;
-		private boolean loading = true;
-		private TableViewer v;
-
-		protected MyWizardPageThread(String pageName, int loadingType) {
-			super(pageName);
-			this.loadingType = loadingType;
-			setTitle(pageName);
-		}
-
-		public void createControl(final Composite parent) {
-			final Composite comp = new Composite(parent, SWT.NONE);
-			comp.setLayout(new GridLayout(1, false));
-
-			v = new TableViewer(comp, SWT.FULL_SELECTION);
-			v.setContentProvider(new ArrayContentProvider());
-			v.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
-			v.addSelectionChangedListener(new ISelectionChangedListener() {
-
-				public void selectionChanged(SelectionChangedEvent event) {
-					getWizard().getContainer().updateButtons();
-				}
-
-			});
-
-			final Composite barContainer = new Composite(comp, SWT.NONE);
-			barContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			barContainer.setLayout(new GridLayout(2, false));
-
-			Label l = new Label(barContainer, SWT.NONE);
-			l.setText("Loading Data");
-
-			final ProgressBar bar = new ProgressBar(barContainer,
-					(loadingType == 1) ? SWT.INDETERMINATE : SWT.NONE);
-			bar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-			if (loadingType == 2) {
-				bar.setMaximum(10);
-			}
-
-			setControl(comp);
-
-			Thread t = new Thread() {
-
-				public void run() {
-					if (loadingType == 1) {
-						try {
-							Thread.sleep(10000);
-							final ArrayList ms = new ArrayList();
-							for (int i = 0; i < 10; i++) {
-								ms.add(new MyModel(i));
-							}
-
-							if (v.getTable().isDisposed()) {
-								return;
-							}
-
-							parent.getDisplay().asyncExec(new Runnable() {
-
-								public void run() {
-									v.setInput(ms);
-									((GridData) barContainer.getLayoutData()).exclude = true;
-									comp.layout(true);
-								}
-
-							});
-						} catch (InterruptedException e) {
-							// TODO Auto-generated catch block
-							e.printStackTrace();
-						}
-					} else {
-						final ArrayList ms = new ArrayList();
-						parent.getDisplay().syncExec(new Runnable() {
-
-							public void run() {
-								v.setInput(ms);
-							}
-
-						});
-
-						for (int i = 0; i < 10; i++) {
-							final int j = i;
-							if (v.getTable().isDisposed()) {
-								return;
-							}
-							parent.getDisplay().asyncExec(new Runnable() {
-
-								public void run() {
-									MyModel tmp = new MyModel(j);
-									v.add(tmp);
-									ms.add(tmp);
-									bar.setSelection(j + 1);
-								}
-							});
-
-							try {
-								Thread.sleep(1000);
-							} catch (InterruptedException e) {
-								// TODO Auto-generated catch block
-								e.printStackTrace();
-							}
-						}
-
-						parent.getDisplay().asyncExec(new Runnable() {
-
-							public void run() {
-								((GridData) barContainer.getLayoutData()).exclude = true;
-								comp.layout(true);
-							}
-
-						});
-					}
-
-					parent.getDisplay().syncExec(new Runnable() {
-
-						public void run() {
-							loading = false;
-							getWizard().getContainer().updateButtons();
-						}
-
-					});
-				}
-
-			};
-
-			t.start();
-		}
-
-		public boolean isPageComplete() {
-			return !loading && !v.getSelection().isEmpty();
-		}
-
-	}
-
-	private static class MyModel {
-		private int index;
-
-		public MyModel(int index) {
-			this.index = index;
-		}
-
-		public String toString() {
-			return "Item-" + index;
-		}
-	}
-
-	public static void main(String[] args) {
-		Display display = new Display();
-
-		final Shell shell = new Shell(display);
-		shell.setLayout(new FillLayout());
-
-		Button b = new Button(shell, SWT.PUSH);
-		b.setText("Load in one Chunk");
-		b.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				WizardDialog dialog = new WizardDialog(shell, new MyWizard(1));
-				dialog.open();
-			}
-
-		});
-
-		b = new Button(shell, SWT.PUSH);
-		b.setText("Load Item by Item");
-		b.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				WizardDialog dialog = new WizardDialog(shell, new MyWizard(2));
-				dialog.open();
-			}
-
-		});
-
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch())
-				display.sleep();
-		}
-
-		display.dispose();
-	}
-}
diff --git a/examples/org.eclipse.jface.snippets/META-INF/MANIFEST.MF b/examples/org.eclipse.jface.snippets/META-INF/MANIFEST.MF
deleted file mode 100644
index 6f9a9e3..0000000
--- a/examples/org.eclipse.jface.snippets/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,13 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: JFace Snippets Plug-in
-Bundle-SymbolicName: org.eclipse.jface.snippets
-Bundle-Version: 3.3.0.qualifier
-Bundle-Vendor: Eclipse.org
-Require-Bundle: org.eclipse.jface,
- org.eclipse.jface.databinding,
- org.eclipse.core.runtime
-Export-Package: org.eclipse.jface.snippets.dialogs,
- org.eclipse.jface.snippets.layout,
- org.eclipse.jface.snippets.viewers,
- org.eclipse.jface.snippets.window
diff --git a/examples/org.eclipse.jface.snippets/build.properties b/examples/org.eclipse.jface.snippets/build.properties
deleted file mode 100644
index c907c60..0000000
--- a/examples/org.eclipse.jface.snippets/build.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = Eclipse JFace Snippets/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/examples/org.eclipse.ui.examples.contributions/.classpath b/examples/org.eclipse.ui.examples.contributions/.classpath
deleted file mode 100644
index ce73933..0000000
--- a/examples/org.eclipse.ui.examples.contributions/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/examples/org.eclipse.ui.examples.contributions/.project b/examples/org.eclipse.ui.examples.contributions/.project
deleted file mode 100644
index 1f60479..0000000
--- a/examples/org.eclipse.ui.examples.contributions/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.examples.contributions</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/examples/org.eclipse.ui.examples.contributions/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.ui.examples.contributions/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index a49b5f1..0000000
--- a/examples/org.eclipse.ui.examples.contributions/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,59 +0,0 @@
-#Mon Nov 27 18:05:52 GMT 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/examples/org.eclipse.ui.examples.contributions/.settings/org.eclipse.jdt.ui.prefs b/examples/org.eclipse.ui.examples.contributions/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 455940f..0000000
--- a/examples/org.eclipse.ui.examples.contributions/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Sun Mar 09 10:51:28 EDT 2008
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} The ${bare_field_name} to set.\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n ******************************************************************************/\r\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @since 3.4\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template></templates>
diff --git a/examples/org.eclipse.ui.examples.contributions/.settings/org.eclipse.pde.prefs b/examples/org.eclipse.ui.examples.contributions/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index d8e8469..0000000
--- a/examples/org.eclipse.ui.examples.contributions/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Nov 16 14:12:29 EST 2004
-compilers.p.unused-element-or-attribute=1
-compilers.p.unresolved-ex-points=0
-compilers.p.deprecated=0
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unknown-class=1
-compilers.p.unknown-attribute=0
-compilers.p.no-required-att=0
-eclipse.preferences.version=1
-compilers.p.unresolved-import=0
-compilers.p.not-externalized-att=0
-compilers.p.illegal-att-value=0
-compilers.use-project=true
diff --git a/examples/org.eclipse.ui.examples.contributions/META-INF/MANIFEST.MF b/examples/org.eclipse.ui.examples.contributions/META-INF/MANIFEST.MF
deleted file mode 100644
index 4be57e1..0000000
--- a/examples/org.eclipse.ui.examples.contributions/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,13 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %contributions.Activator.name
-Bundle-SymbolicName: org.eclipse.ui.examples.contributions; singleton:=true
-Bundle-Version: 3.3.0.qualifier
-Bundle-Activator: org.eclipse.ui.examples.contributions.Activator
-Require-Bundle: org.eclipse.ui;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.core.runtime,
- org.eclipse.core.expressions;bundle-version="[3.3.0,4.0.0)"
-Bundle-Vendor: %contributions.Activator.providerName
-Bundle-Localization: plugin
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
diff --git a/examples/org.eclipse.ui.examples.contributions/about.html b/examples/org.eclipse.ui.examples.contributions/about.html
deleted file mode 100755
index 4602330..0000000
--- a/examples/org.eclipse.ui.examples.contributions/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.contributions/build.properties b/examples/org.eclipse.ui.examples.contributions/build.properties
deleted file mode 100644
index 7b97eb1..0000000
--- a/examples/org.eclipse.ui.examples.contributions/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .,\
-               icons/,\
-               about.html,\
-               plugin.properties
-src.includes = about.html
diff --git a/examples/org.eclipse.ui.examples.contributions/icons/change_obj.gif b/examples/org.eclipse.ui.examples.contributions/icons/change_obj.gif
deleted file mode 100755
index ce8bdb9..0000000
--- a/examples/org.eclipse.ui.examples.contributions/icons/change_obj.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.contributions/icons/editor.gif b/examples/org.eclipse.ui.examples.contributions/icons/editor.gif
deleted file mode 100755
index c48d9a9..0000000
--- a/examples/org.eclipse.ui.examples.contributions/icons/editor.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.contributions/icons/new_wiz.gif b/examples/org.eclipse.ui.examples.contributions/icons/new_wiz.gif
deleted file mode 100644
index 7aea894..0000000
--- a/examples/org.eclipse.ui.examples.contributions/icons/new_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.contributions/icons/perspective.gif b/examples/org.eclipse.ui.examples.contributions/icons/perspective.gif
deleted file mode 100644
index 008fd7a..0000000
--- a/examples/org.eclipse.ui.examples.contributions/icons/perspective.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.contributions/icons/sample.gif b/examples/org.eclipse.ui.examples.contributions/icons/sample.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/examples/org.eclipse.ui.examples.contributions/icons/sample.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.contributions/icons/sample2.gif b/examples/org.eclipse.ui.examples.contributions/icons/sample2.gif
deleted file mode 100644
index 252d7eb..0000000
--- a/examples/org.eclipse.ui.examples.contributions/icons/sample2.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.contributions/info.product b/examples/org.eclipse.ui.examples.contributions/info.product
deleted file mode 100644
index 1d3d278..0000000
--- a/examples/org.eclipse.ui.examples.contributions/info.product
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?pde version="3.1"?>
-
-<product name="%info.product.name" id="org.eclipse.ui.examples.contributions.product" application="org.eclipse.ui.examples.contributions.application" useFeatures="false">
-
-   <aboutInfo>
-      <image path="product_lg.gif"/>
-      <text>
-         RCP Info product modified from the RCP Mail template
-      </text>
-   </aboutInfo>
-
-   <configIni use="default"/>
-
-   <launcherArgs>
-      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts</vmArgsMac>
-   </launcherArgs>
-
-   <windowImages i16="icons/sample2.gif"/>
-
-
-   <launcher>
-      <solaris/>
-      <win useIco="false">
-         <bmp/>
-      </win>
-   </launcher>
-
-
-   <vm>
-   </vm>
-
-   <plugins>
-      <plugin id="com.ibm.icu"/>
-      <plugin id="org.eclipse.core.commands"/>
-      <plugin id="org.eclipse.core.contenttype"/>
-      <plugin id="org.eclipse.core.databinding"/>
-      <plugin id="org.eclipse.core.expressions"/>
-      <plugin id="org.eclipse.core.jobs"/>
-      <plugin id="org.eclipse.core.runtime"/>
-      <plugin id="org.eclipse.core.runtime.compatibility.registry" fragment="true"/>
-      <plugin id="org.eclipse.equinox.app"/>
-      <plugin id="org.eclipse.equinox.common"/>
-      <plugin id="org.eclipse.equinox.preferences"/>
-      <plugin id="org.eclipse.equinox.registry"/>
-      <plugin id="org.eclipse.help"/>
-      <plugin id="org.eclipse.jface"/>
-      <plugin id="org.eclipse.jface.databinding"/>
-      <plugin id="org.eclipse.osgi"/>
-      <plugin id="org.eclipse.swt"/>
-      <plugin id="org.eclipse.swt.win32.win32.x86" fragment="true"/>
-      <plugin id="org.eclipse.ui"/>
-      <plugin id="org.eclipse.ui.examples.contributions"/>
-      <plugin id="org.eclipse.ui.workbench"/>
-   </plugins>
-
-</product>
diff --git a/examples/org.eclipse.ui.examples.contributions/plugin.properties b/examples/org.eclipse.ui.examples.contributions/plugin.properties
deleted file mode 100644
index 7131be8..0000000
--- a/examples/org.eclipse.ui.examples.contributions/plugin.properties
+++ /dev/null
@@ -1,74 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-contributions.Activator.name =  Command Contribution Examples
-contributions.Activator.providerName = Eclipse.org
-
-contributions.commands.category.name = Info Category
-contributions.commands.category.desc = Group info example contributions
-contributions.commands.globalCommand.name = Global Command
-contributions.globalActionSet.label = Global Action Set
-contributions.menus.globalMenu.label = Global Menu
-contributions.menus.globalMenu.mnemonic = M
-contributions.menus.globalCommand.mnemonic = G
-contributions.toolbars.globalCommand.tooltip = Say hello to the world
-
-contributions.viewCategory.name = View Contributions
-contributions.view.name = Info View
-contributions.view.count.name = Count Entries
-contributions.view.count.desc = Count the entries in the active view
-contributions.view.count.mnemonic = o
-contributions.view.swap.name = Swap Entries
-contributions.view.swap.tooltip = Swap the two selected entries
-contributions.view.refresh.mnemonic = R
-contributions.view.edit.name = Edit
-contributions.view.edit.mnemonic = E
-contributions.view.context.name = Info View Context
-
-contributions.editor.name = Info Editor
-contributions.editor.about.name = About Info Editor 
-contributions.editor.reset.name = Reset
-contributions.editor.reset.mnemonic = R
-contributions.editor.menu.label = Info
-contributions.editor.menu.mnemonic = I
-contributions.editor.delta.name = Show Delta
-contributions.editor.delta.tooltip = Show which fields have changed from the model
-
-
-CmdLabel=Test Trim Cmd
-Trim.item=Trim Item
-TrimItem.toolTip=TrimItem ToolTip
-Trim2.item=Trim Item 2
-TrimItem2.toolTip=TrimItem 2 ToolTip
-
-application.name = Contribution Application
-info.perspective.name = Info Perspective
-info.product.name = RCP Info Product
-menu.file.label = File
-menu.file.mnemonic = F
-menu.window.label = Window
-menu.window.mnemonic = W
-menu.help.label = Help
-menu.help.mnemonic = H
-person.category.name = Person
-person.wizard.name = Person
-scheme.info.name = Info Scheme
-command.new.tooltip = New Person
-command.exit.mnemonic = x
-command.newWindow.mnemonic = N
-command.aboutAction.mnemonic = A
-command.refresh.mnemonic = f
-command.activate.name = Activate Editor
-commandParameter.activate.index.name = Person index
-command.adminRights.name = Has Admin Rights
-command.adminRights.mnemonic = H
-command.login.name = Login
-command.login.mnemonic = L
-command.aboutXml.label = About XML
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.contributions/plugin.xml b/examples/org.eclipse.ui.examples.contributions/plugin.xml
deleted file mode 100644
index 96fe1f8..0000000
--- a/examples/org.eclipse.ui.examples.contributions/plugin.xml
+++ /dev/null
@@ -1,739 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-
-   <!-- A command with a default handler, effectively global but it can -->
-   <!-- be overriden by part contributions -->
-   <extension
-         point="org.eclipse.ui.commands">
-      <category
-            name="%contributions.commands.category.name"
-            description="%contributions.commands.category.desc"
-            id="org.eclipse.ui.examples.contributions.commands.category">
-      </category>
-      <command
-            categoryId="org.eclipse.ui.examples.contributions.commands.category"
-            defaultHandler="org.eclipse.ui.examples.contributions.handlers.GlobalMenuHandler"
-            id="org.eclipse.ui.examples.contributions.commands.globalCommand"
-            name="%contributions.commands.globalCommand.name">
-      </command>
-   </extension>
-   
-   <!-- Binding CTRL+6 to the global command -->
-   <extension
-         point="org.eclipse.ui.bindings">
-      <scheme
-            id="org.eclipse.ui.examples.contributions.scheme"
-            name="%scheme.info.name">
-      </scheme>
-      <key
-            commandId="org.eclipse.ui.examples.contributions.commands.globalCommand"
-            contextId="org.eclipse.ui.contexts.window"
-            sequence="M1+6"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
-      </key>
-      <key
-            commandId="org.eclipse.ui.file.exit"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.examples.contributions.scheme"
-            sequence="CTRL+Q">
-      </key>
-      <key
-            commandId="org.eclipse.ui.window.newWindow"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.examples.contributions.scheme"
-            sequence="CTRL+N">
-      </key>
-      <key
-            commandId="org.eclipse.ui.file.save"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.examples.contributions.scheme"
-            sequence="CTRL+S">
-      </key>
-      <key
-            commandId="org.eclipse.ui.file.saveAll"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.examples.contributions.scheme"
-            sequence="CTRL+SHIFT+S">
-      </key>
-      <key
-            commandId="org.eclipse.ui.file.close"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.examples.contributions.scheme"
-            sequence="CTRL+W">
-      </key>
-      <key
-            commandId="org.eclipse.ui.file.closeAll"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.examples.contributions.scheme"
-            sequence="CTRL+SHIFT+W">
-      </key>
-      <key
-            commandId="org.eclipse.ui.window.showViewMenu"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.examples.contributions.scheme"
-            sequence="CTRL+F10">
-      </key>
-      <key
-            commandId="org.eclipse.ui.file.refresh"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.examples.contributions.scheme"
-            sequence="F5">
-      </key>
-   </extension>
-   
-   <!-- placing the global command in the main menu and main toolbar with a -->
-   <!-- condition.  You can do it without a condition but that's extremely  -->
-   <!-- uncommon. You can treat an actionSet like a context within the --> 
-   <!-- condition. -->
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            id="org.eclipse.ui.examples.contributions.globalActionSet"
-            label="%contributions.globalActionSet.label"
-            visible="false">
-      </actionSet>
-   </extension>
-   
-   <!-- You can reuse expressions for conditions by defining them once -->
-   <extension
-         point="org.eclipse.core.expressions.definitions">
-      <definition
-            id="org.eclipse.ui.examples.contributions.inGlobalActionSet">
-         <with
-               variable="activeContexts">
-            <iterate
-                  operator="or">
-               <equals
-                     value="org.eclipse.ui.examples.contributions.globalActionSet">
-               </equals>
-            </iterate>
-         </with>
-      </definition>
-      <definition
-            id="org.eclipse.ui.examples.contributions.view.inView">
-         <with
-               variable="activePartId">
-            <equals
-                  value="org.eclipse.ui.examples.contributions.view">
-            </equals>
-         </with>
-      </definition>
-      <definition
-            id="org.eclipse.ui.examples.contributions.view.activeEditor">
-         <with
-               variable="activeEditorId">
-            <equals
-                  value="org.eclipse.ui.examples.contributions.editor">
-            </equals>
-         </with>
-      </definition>
-   </extension>
-   
-   <!-- menus are defined hierarchically from a root, and separate from -->
-   <!-- toolbars. -->
-   <extension
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.main.menu?after=additions">
-         <menu
-               label="%contributions.menus.globalMenu.label"
-               mnemonic="%contributions.menus.globalMenu.label"
-               id="org.eclipse.ui.examples.contributions.menus.globalMenu">
-            <command
-                  commandId="org.eclipse.ui.examples.contributions.commands.globalCommand"
-                  mnemonic="%contributions.menus.globalCommand.mnemonic"
-                  id="org.eclipse.ui.examples.contributions.menus.globalCommand">
-               <visibleWhen>
-                  <reference
-                        definitionId="org.eclipse.ui.examples.contributions.inGlobalActionSet">
-                  </reference>
-               </visibleWhen>
-            </command>
-            <separator
-                  name="additions"
-                  visible="false">
-            </separator>
-         </menu>
-      </menuContribution>
-      <menuContribution
-            locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">
-         <toolbar
-               id="org.eclipse.ui.examples.contributions.toolbars.sampleToolbar">
-            <command
-                  commandId="org.eclipse.ui.examples.contributions.commands.globalCommand"
-                  icon="icons/sample.gif"
-                  tooltip="%contributions.toolbars.globalCommand.tooltip"
-                  id="org.eclipse.ui.examples.contributions.toolbars.globalCommand">
-               <visibleWhen>
-                  <reference
-                        definitionId="org.eclipse.ui.examples.contributions.inGlobalActionSet">
-                  </reference>
-               </visibleWhen>
-            </command>
-            <separator
-                  name="additions"
-                  visible="false">
-            </separator>
-         </toolbar>
-      </menuContribution>
-   </extension>
-   
-   <!-- Create a view and some view commands -->
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            id="org.eclipse.ui.examples.contributions.viewCategory"
-            name="%contributions.viewCategory.name">
-      </category>
-      <view
-            category="org.eclipse.ui.examples.contributions.viewCategory"
-            class="org.eclipse.ui.examples.contributions.view.InfoView"
-            id="org.eclipse.ui.examples.contributions.view"
-            name="%contributions.view.name">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            categoryId="org.eclipse.ui.examples.contributions.commands.category"
-            id="org.eclipse.ui.examples.contributions.view.count"
-            description="%contributions.view.count.desc"
-            name="%contributions.view.count.name">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.examples.contributions.commands.category"
-            id="org.eclipse.ui.examples.contributions.view.swap"
-            name="%contributions.view.swap.name">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.examples.contributions.commands.category"
-            id="org.eclipse.ui.examples.contributions.view.edit"
-            name="%contributions.view.edit.name">
-      </command>
-      <command
-            id="org.eclipse.ui.examples.contributions.editor.infoAbout"
-            categoryId="org.eclipse.ui.examples.contributions.commands.category"
-            name="%contributions.editor.about.name">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.examples.contributions.commands.category"
-            id="org.eclipse.ui.examples.contributions.view.adminRights"
-            name="%command.adminRights.name">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.examples.contributions.commands.category"
-            defaultHandler="org.eclipse.ui.examples.contributions.view.LoginHandler"
-            id="org.eclipse.ui.examples.contributions.view.login"
-            name="%command.login.name">
-      </command>
-   </extension>
-   <extension
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.examples.contributions.view?after=additions">
-         <command
-               commandId="org.eclipse.ui.examples.contributions.view.count"
-               mnemonic="%contributions.view.count.mnemonic">
-         </command>
-         <command
-               commandId="org.eclipse.ui.examples.contributions.view.edit"
-               mnemonic="%contributions.view.edit.mnemonic">
-         </command>
-         <command
-               commandId="org.eclipse.ui.file.refresh"
-               mnemonic="%contributions.view.refresh.mnemonic">
-         </command>
-      </menuContribution>
-      <menuContribution
-            locationURI="toolbar:org.eclipse.ui.examples.contributions.view?after=additions">
-         <command
-               commandId="org.eclipse.ui.newWizard"
-               icon="icons/new_wiz.gif"
-               style="push"
-               tooltip="%command.new.tooltip">
-            <parameter
-                  name="newWizardId"
-                  value="org.eclipse.ui.examples.contributions.wizard.newPerson">
-            </parameter>
-         </command>
-         <command
-               commandId="org.eclipse.ui.examples.contributions.view.swap"
-               label="%contributions.view.swap.name"
-               tooltip="%contributions.view.swap.tooltip">
-         </command>
-      </menuContribution>
-      <menuContribution
-            locationURI="popup:org.eclipse.ui.examples.contributions.view?after=additions">
-         <command
-               commandId="org.eclipse.ui.file.refresh"
-               mnemonic="%contributions.view.refresh.mnemonic">
-         </command>
-         <command
-               commandId="org.eclipse.ui.examples.contributions.view.login"
-               mnemonic="%command.login.mnemonic"
-               style="push">
-         </command>
-         <command
-               commandId="org.eclipse.ui.examples.contributions.view.adminRights"
-               mnemonic="%command.adminRights.mnemonic"
-               style="toggle">
-            <visibleWhen
-                  checkEnabled="true">
-            </visibleWhen>
-         </command>
-      </menuContribution>
-      <menuContribution
-            locationURI="popup:org.eclipse.ui.popup.any?after=additions">
-         <command
-               commandId="org.eclipse.ui.examples.contributions.view.edit"
-               mnemonic="%contributions.view.edit.mnemonic">
-            <visibleWhen>
-               <with
-                     variable="activeMenuSelection">
-                  <iterate>
-                     <adapt
-                           type="org.eclipse.ui.examples.contributions.model.Person">
-                     </adapt>
-                  </iterate>
-               </with>
-            </visibleWhen>
-         </command>
-      </menuContribution>
-      <menuContribution
-            locationURI="menu:help?after=additions">
-         <command
-               commandId="org.eclipse.ui.examples.contributions.editor.infoAbout"
-               style="push">
-            <visibleWhen
-                  checkEnabled="true">
-            </visibleWhen>
-         </command>
-      </menuContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.handlers">
-      <handler
-            class="org.eclipse.ui.examples.contributions.view.RefreshInfoHandler"
-            commandId="org.eclipse.ui.file.refresh">
-         <activeWhen>
-            <reference
-                  definitionId="org.eclipse.ui.examples.contributions.view.inView">
-            </reference>
-         </activeWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.examples.contributions.view.SwapInfoHandler"
-            commandId="org.eclipse.ui.examples.contributions.view.swap">
-         <activeWhen>
-            <reference
-                  definitionId="org.eclipse.ui.examples.contributions.view.inView">
-            </reference>
-         </activeWhen>
-         <enabledWhen>
-            <with
-                  variable="selection">
-               <count
-                     value="2">
-               </count>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.examples.contributions.view.EditInfoHandler"
-            commandId="org.eclipse.ui.examples.contributions.view.edit">
-         <activeWhen>
-            <reference
-                  definitionId="org.eclipse.ui.examples.contributions.view.inView">
-            </reference>
-         </activeWhen>
-         <enabledWhen>
-            <with
-                  variable="selection">
-               <count
-                     value="1">
-               </count>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.examples.contributions.handlers.InfoAboutHandler"
-            commandId="org.eclipse.ui.examples.contributions.editor.infoAbout">
-         <enabledWhen>
-            <with
-                  variable="activePart">
-               <instanceof
-                     value="org.eclipse.ui.examples.contributions.view.InfoView">
-               </instanceof>
-            </with>
-         </enabledWhen>
-      </handler>
-      <handler
-            class="org.eclipse.ui.examples.contributions.view.AdminHandler"
-            commandId="org.eclipse.ui.examples.contributions.view.adminRights">
-         <enabledWhen>
-            <and>
-               <count
-                     value="1">
-               </count>
-               <iterate>
-                  <instanceof
-                        value="org.eclipse.ui.examples.contributions.model.Person">
-                  </instanceof>
-               </iterate>
-               <with
-                     variable="org.eclipse.ui.examples.contributions.user">
-                  <test
-                        property="org.eclipse.ui.examples.contributions.user.isAdmin"
-                        value="true">
-                  </test>
-               </with>
-            </and>
-         </enabledWhen>
-      </handler>
-   </extension>
-   <extension
-         point="org.eclipse.ui.contexts">
-      <context
-            id="org.eclipse.ui.examples.contributions.view.context"
-            name="%contributions.view.context.name"
-            parentId="org.eclipse.ui.contexts.window">
-      </context>
-   </extension>
-   <extension
-         point="org.eclipse.ui.bindings">
-      <key
-            commandId="org.eclipse.ui.examples.contributions.view.edit"
-            contextId="org.eclipse.ui.examples.contributions.view.context"
-            sequence="M1+O"
-            schemeId="org.eclipse.ui.examples.contributions.scheme">
-      </key>
-      <key
-            commandId="org.eclipse.ui.newWizard"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.examples.contributions.scheme"
-            sequence="CTRL+SHIFT+P">
-            <parameter
-                  id="newWizardId"
-                  value="org.eclipse.ui.examples.contributions.wizard.newPerson">
-            </parameter>
-      </key>
-   </extension>
-   
-   <!-- Add an editor for the Person model and some commands -->
-   <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            class="org.eclipse.ui.examples.contributions.editor.InfoEditor"
-            icon="icons/editor.gif"
-            id="org.eclipse.ui.examples.contributions.editor"
-            name="%contributions.editor.name">
-      </editor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            categoryId="org.eclipse.ui.examples.contributions.commands.category"
-            id="org.eclipse.ui.examples.contributions.editor.reset"
-            name="%contributions.editor.reset.name">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.examples.contributions.commands.category"
-            id="org.eclipse.ui.examples.contributions.editor.delta"
-            name="%contributions.editor.delta.name">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.examples.contributions.commands.category"
-            defaultHandler="org.eclipse.ui.examples.contributions.editor.ActivateEditorHandler"
-            id="org.eclipse.ui.examples.contributions.editor.activate"
-            name="%command.activate.name">
-         <commandParameter
-               id="org.eclipse.ui.examples.contributions.editor.activate.index"
-               name="%commandParameter.activate.index.name"
-               optional="false"
-               typeId="org.eclipse.ui.examples.contributions.IntegerType">
-         </commandParameter>
-      </command>
-      <commandParameterType
-            converter="org.eclipse.ui.examples.contributions.editor.IntegerTypeConverter"
-            id="org.eclipse.ui.examples.contributions.IntegerType"
-            type="java.lang.Integer">
-      </commandParameterType>
-   </extension>
-   <extension
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.main.menu?after=additions">
-         <menu
-               id="org.eclipse.ui.examples.contributions.editor.menu"
-               label="%contributions.editor.menu.label"
-               mnemonic="%contributions.editor.menu.mnemonic">
-            <command
-                  commandId="org.eclipse.ui.examples.contributions.editor.reset"
-                  mnemonic="%contributions.editor.reset.mnemonic">
-               <visibleWhen>
-                  <reference
-                        definitionId="org.eclipse.ui.examples.contributions.view.activeEditor">
-                  </reference>
-               </visibleWhen>
-            </command>
-         </menu>
-      </menuContribution>
-      <menuContribution
-            locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">
-         <toolbar
-               id="org.eclipse.ui.examples.contributions.editor.toolbar">
-            <command
-                  commandId="org.eclipse.ui.examples.contributions.editor.delta"
-                  icon="icons/change_obj.gif"
-                  tooltip="%contributions.editor.delta.tooltip">
-               <visibleWhen>
-                  <reference
-                        definitionId="org.eclipse.ui.examples.contributions.view.activeEditor">
-                  </reference>
-               </visibleWhen>
-            </command>
-         </toolbar>
-      </menuContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.handlers">
-      <handler
-            class="org.eclipse.ui.examples.contributions.editor.DeltaInfoHandler"
-            commandId="org.eclipse.ui.examples.contributions.editor.delta">
-         <activeWhen>
-            <reference
-                  definitionId="org.eclipse.ui.examples.contributions.view.activeEditor">
-            </reference>
-         </activeWhen>
-      </handler>
-   </extension>
-   
-   <!-- adding a control and commands to the trim -->
-   <extension
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            locationURI="toolbar:org.eclipse.ui.trim.status">
-         <toolbar
-               id="org.eclipse.ui.examples.contributions.verticalTrim">
-            <command
-                  commandId="org.eclipse.ui.examples.contributions.item2"
-                  icon="icons/editor.gif"
-                  id="contributions.trimItem"
-                  label="%Trim.item"
-                  tooltip="%TrimItem.toolTip">
-            </command>
-            <control
-                  class="org.eclipse.ui.examples.contributions.ExampleControlContribution"
-                  id="contributions.controlContrib1">
-            </control>
-            <command
-                  commandId="org.eclipse.ui.examples.contributions.item2"
-                  icon="icons/editor.gif"
-                  id="contributions.trimItem2"
-                  label="%Trim2.item"
-                  tooltip="%TrimItem2.toolTip">
-            </command>
-         </toolbar>
-      </menuContribution>
-      <!-- this is an example of an object contribution -->
-      <menuContribution
-            locationURI="popup:org.eclipse.jdt.ui.PackageExplorer">
-         <command
-               commandId="org.eclipse.ui.help.aboutAction"
-               label="%command.aboutXml.label"
-               style="push">
-            <visibleWhen
-                  checkEnabled="false">
-               <with
-                     variable="activeMenuSelection">
-                  <count
-                        value="1">
-                  </count>
-                  <iterate>
-                     <!-- I know it can't find this, just ignore it -->
-                     <adapt
-                           type="org.eclipse.core.resources.IFile">
-                        <test
-                              property="org.eclipse.core.resources.name"
-                              value="*.xml">
-                        </test>
-                        <test
-                              property="org.eclipse.core.resources.contentTypeId"
-                              value="org.eclipse.ant.core.antBuildFile">
-                        </test>
-                     </adapt>
-                  </iterate>
-               </with>
-            </visibleWhen>
-         </command>
-      </menuContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            id="org.eclipse.ui.examples.contributions.item2"
-            name="%CmdLabel">
-      </command>
-   </extension>
-   <extension
-         id="application"
-         name="%application.name"
-         point="org.eclipse.core.runtime.applications">
-      <application
-            cardinality="singleton-global"
-            thread="main"
-            visible="true">
-         <run
-               class="org.eclipse.ui.examples.contributions.rcp.ContributionApplication">
-         </run>
-      </application>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            class="org.eclipse.ui.examples.contributions.rcp.Perspective"
-            fixed="true"
-            icon="icons/perspective.gif"
-            id="org.eclipse.ui.examples.contributions.perspective"
-            name="%info.perspective.name">
-      </perspective>
-   </extension>
-   <extension
-         id="product"
-         point="org.eclipse.core.runtime.products">
-      <product
-            application="org.eclipse.ui.examples.contributions.application"
-            name="%info.product.name">
-         <property
-               name="windowImages"
-               value="icons/sample2.gif">
-         </property>
-         <property
-               name="aboutText"
-               value="RCP Info product modified from the RCP Mail template">
-         </property>
-         <property
-               name="aboutImage"
-               value="product_lg.gif">
-         </property>
-         <property
-               name="appName"
-               value="%info.product.name">
-         </property>
-      </product>
-   </extension>
-   <extension
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.main.menu">
-         <menu
-               id="file"
-               label="%menu.file.label"
-               mnemonic="%menu.file.mnemonic">
-            <command
-                  commandId="org.eclipse.ui.file.refresh"
-                  mnemonic="%command.refresh.mnemonic"
-                  style="push">
-            </command>
-            <separator
-                  name="sep1"
-                  visible="true">
-            </separator>
-            <command
-                  commandId="org.eclipse.ui.file.exit"
-                  mnemonic="%command.exit.mnemonic"
-                  style="push">
-            </command>
-         </menu>
-         <separator
-               name="additions"
-               visible="false">
-         </separator>
-         <menu
-               id="window"
-               label="%menu.window.label"
-               mnemonic="%menu.window.mnemonic">
-            <command
-                  commandId="org.eclipse.ui.window.newWindow"
-                  mnemonic="%command.newWindow.mnemonic"
-                  style="push">
-            </command>
-            <separator
-                  name="sep1"
-                  visible="true">
-            </separator>
-            <dynamic
-                  class="org.eclipse.ui.examples.contributions.editor.DynamicEditorList"
-                  id="org.eclipse.ui.tutorials.commands.dynamicEditorList">
-            </dynamic>
-         </menu>
-         <menu
-               id="help"
-               label="%menu.help.label"
-               mnemonic="%menu.help.mnemonic">
-            <command
-                  commandId="org.eclipse.ui.help.aboutAction"
-                  mnemonic="%command.aboutAction.mnemonic"
-                  style="push">
-            </command>
-         </menu>
-      </menuContribution>
-      <menuContribution
-            locationURI="toolbar:org.eclipse.ui.main.toolbar">
-         <toolbar
-               id="org.eclipse.ui.examples.contributions.group.file">
-            <command
-                  commandId="org.eclipse.ui.file.save"
-                  style="push">
-            </command>
-            <command
-                  commandId="org.eclipse.ui.file.saveAll"
-                  style="push">
-            </command>
-         </toolbar>
-         <separator
-               name="additions"
-               visible="false">
-         </separator>
-      </menuContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.services">
-      <serviceFactory
-            factoryClass="org.eclipse.ui.examples.contributions.model.PersonServiceFactory">
-         <service
-               serviceClass="org.eclipse.ui.examples.contributions.model.IPersonService"/>
-      </serviceFactory>
-      <sourceProvider
-            provider="org.eclipse.ui.examples.contributions.model.UserSourceProvider">
-         <variable
-               name="org.eclipse.ui.examples.contributions.user"
-               priorityLevel="activeSite">
-         </variable>
-      </sourceProvider>
-   </extension>
-   <extension
-         point="org.eclipse.ui.newWizards">
-      <category
-            id="org.eclipse.ui.examples.contributions.wizardCategory"
-            name="%person.category.name">
-      </category>
-      <wizard
-            category="org.eclipse.ui.examples.contributions.wizardCategory"
-            class="org.eclipse.ui.examples.contributions.model.PersonWizard"
-            id="org.eclipse.ui.examples.contributions.wizard.newPerson"
-            name="%person.wizard.name">
-      </wizard>
-   </extension>
-   <extension
-         point="org.eclipse.core.expressions.propertyTesters">
-      <propertyTester
-            class="org.eclipse.ui.examples.contributions.model.UserPropertyTester"
-            id="org.eclipse.ui.examples.contributions.user.propertyTester"
-            namespace="org.eclipse.ui.examples.contributions.user"
-            properties="isAdmin,id"
-            type="org.eclipse.ui.examples.contributions.model.Person">
-      </propertyTester>
-   </extension>
-</plugin>
diff --git a/examples/org.eclipse.ui.examples.contributions/plugin_customization.ini b/examples/org.eclipse.ui.examples.contributions/plugin_customization.ini
deleted file mode 100644
index 589ade4..0000000
--- a/examples/org.eclipse.ui.examples.contributions/plugin_customization.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-org.eclipse.ui/KEY_CONFIGURATION_ID=org.eclipse.ui.examples.contributions.scheme
-org.eclipse.ui/SHOW_PROGRESS_ON_STARTUP = false
diff --git a/examples/org.eclipse.ui.examples.contributions/product_lg.gif b/examples/org.eclipse.ui.examples.contributions/product_lg.gif
deleted file mode 100644
index bd95e28..0000000
--- a/examples/org.eclipse.ui.examples.contributions/product_lg.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.contributions/splash.bmp b/examples/org.eclipse.ui.examples.contributions/splash.bmp
deleted file mode 100644
index d7d2e30..0000000
--- a/examples/org.eclipse.ui.examples.contributions/splash.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/Activator.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/Activator.java
deleted file mode 100644
index 308d069..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/Activator.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle.
- * 
- * @since 3.3
- */
-public class Activator extends AbstractUIPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.ui.examples.contributions"; //$NON-NLS-1$
-
-	// The shared instance
-	private static Activator plugin;
-
-	/**
-	 * The constructor
-	 */
-	public Activator() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-		DEBUG_COMMANDS = getDebugOption("/trace/commands"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 * 
-	 * @return the shared instance
-	 */
-	public static Activator getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given plug-in
-	 * relative path
-	 * 
-	 * @param path
-	 *            the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return imageDescriptorFromPlugin(PLUGIN_ID, path);
-	}
-	
-	/**
-	 * Piggy back of off org.eclipse.ui/trace/commands
-	 */
-	public static boolean DEBUG_COMMANDS = false;
-	
-	private static boolean getDebugOption(String option) {
-        return "true".equalsIgnoreCase(Platform.getDebugOption(PlatformUI.PLUGIN_ID + option)); //$NON-NLS-1$
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/ContributionMessages.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/ContributionMessages.java
deleted file mode 100644
index def585d..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/ContributionMessages.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Externalized messages for the code in this plugin.
- * 
- * @since 3.3
- */
-public class ContributionMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.ui.examples.contributions.messages";//$NON-NLS-1$
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, ContributionMessages.class);
-	}
-	public static String DeltaInfoHandler_found;
-	public static String DeltaInfoHandler_notFound;
-	public static String DeltaInfoHandler_shellTitle;
-	public static String DynamicEditorList_label;
-	public static String EditInfoHandler_failed_to_open;
-	public static String InfoEditor_givenname;
-	public static String InfoEditor_surname;
-	public static String InfoView_about_msg;
-	public static String InfoView_countElements;
-	public static String PersonWizardPage_descriptoin;
-	public static String PersonWizardPage_error_alreadyExists;
-	public static String PersonWizardPage_error_missingGivenname;
-	public static String PersonWizardPage_error_missingSurname;
-	public static String PersonWizardPage_id_label;
-	public static String PersonWizardPage_title;
-	public static String SampleHandler_hello_msg;
-	public static String SampleHandler_plugin_name;
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/ExampleControlContribution.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/ExampleControlContribution.java
deleted file mode 100644
index 4516fe3..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/ExampleControlContribution.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.contributions;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.menus.WorkbenchWindowControlContribution;
-
-/**
- * Moved from org.eclipse.ui.examples.readmetool
- * 
- * @since 3.3
- */
-public class ExampleControlContribution extends
-		WorkbenchWindowControlContribution {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.ControlContribution#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createControl(Composite parent) {
-		// Create a composite to place the label in
-		Composite comp = new Composite(parent, SWT.NONE);
-
-		// Give some room around the control
-		FillLayout layout = new FillLayout();
-		layout.marginHeight = 2;
-		layout.marginWidth = 2;
-		comp.setLayout(layout);
-
-		// Create a label for the trim.
-		Label ccCtrl = new Label(comp, SWT.BORDER | SWT.CENTER);
-		ccCtrl.setBackground(parent.getDisplay().getSystemColor(
-				SWT.COLOR_DARK_BLUE));
-		ccCtrl.setForeground(parent.getDisplay()
-				.getSystemColor(SWT.COLOR_WHITE));
-		ccCtrl.setText(" Ctrl Contrib (" + getSideName(getCurSide()) + ")"); //$NON-NLS-1$ //$NON-NLS-2$
-		ccCtrl.setToolTipText("Ctrl Contrib Tooltip"); //$NON-NLS-1$
-
-		return comp;
-	}
-
-	private String getSideName(int side) {
-		if (side == SWT.TOP)
-			return "Top"; //$NON-NLS-1$
-		if (side == SWT.BOTTOM)
-			return "Bottom"; //$NON-NLS-1$
-		if (side == SWT.LEFT)
-			return "Left"; //$NON-NLS-1$
-		if (side == SWT.RIGHT)
-			return "Right"; //$NON-NLS-1$
-
-		return "Unknown Side"; //$NON-NLS-1$
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/editor/ActivateEditorHandler.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/editor/ActivateEditorHandler.java
deleted file mode 100644
index 94f8281..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/editor/ActivateEditorHandler.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.editor;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.examples.contributions.model.PersonInput;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-/**
- * Activate an already open editor (although technically this would open a new
- * one as well)
- * 
- * @since 3.4
- */
-public class ActivateEditorHandler extends AbstractHandler {
-	public static final String ID = "org.eclipse.ui.examples.contributions.editor.activate"; //$NON-NLS-1$
-	public static final String PARM_EDITOR = "org.eclipse.ui.examples.contributions.editor.activate.index"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		IWorkbenchWindow window = HandlerUtil
-				.getActiveWorkbenchWindowChecked(event);
-		Object index = event.getObjectParameterForExecution(PARM_EDITOR);
-		if (!(index instanceof Integer)) {
-			throw new ExecutionException("Invalid index: " + index); //$NON-NLS-1$
-		}
-		PersonInput input = new PersonInput(((Integer) index).intValue());
-		try {
-			window.getActivePage().openEditor(input, InfoEditor.ID, true);
-		} catch (PartInitException e) {
-			throw new ExecutionException("Failed to activate editor", e); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/editor/DeltaInfoHandler.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/editor/DeltaInfoHandler.java
deleted file mode 100644
index fd5a651..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/editor/DeltaInfoHandler.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.editor;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ui.examples.contributions.ContributionMessages;
-import org.eclipse.ui.examples.contributions.model.IPersonService;
-import org.eclipse.ui.examples.contributions.model.Person;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-/**
- * Show if there is any delta from the model for the active editor.
- * 
- * @since 3.3
- */
-public class DeltaInfoHandler extends AbstractHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		InfoEditor editor = (InfoEditor) HandlerUtil
-				.getActiveEditorChecked(event);
-		Person local = editor.getCurrentPerson();
-
-		IPersonService service = (IPersonService) editor.getSite().getService(
-				IPersonService.class);
-		Person model = service.getPerson(local.getId());
-
-		boolean delta = false;
-		StringBuffer buf = new StringBuffer();
-		buf.append(ContributionMessages.InfoEditor_surname);
-		if (!model.getSurname().equals(local.getSurname())) {
-			delta = true;
-			buf.append(' ');
-			buf.append(model.getSurname());
-			buf.append(", "); //$NON-NLS-1$
-			buf.append(local.getSurname());
-		}
-		buf.append(" - "); //$NON-NLS-1$
-		buf.append(ContributionMessages.InfoEditor_givenname);
-		if (!model.getGivenname().equals(local.getGivenname())) {
-			delta = true;
-			buf.append(' ');
-			buf.append(model.getGivenname());
-			buf.append(", "); //$NON-NLS-1$
-			buf.append(local.getGivenname());
-		}
-		buf.append(" - "); //$NON-NLS-1$
-		if (delta) {
-			buf.append(ContributionMessages.DeltaInfoHandler_found);
-		} else {
-			buf.append(ContributionMessages.DeltaInfoHandler_notFound);
-		}
-		MessageDialog.openInformation(editor.getSite().getShell(),
-				ContributionMessages.DeltaInfoHandler_shellTitle, buf
-						.toString());
-		return null;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/editor/DynamicEditorList.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/editor/DynamicEditorList.java
deleted file mode 100644
index fd680da..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/editor/DynamicEditorList.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.editor;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.CompoundContributionItem;
-import org.eclipse.ui.examples.contributions.ContributionMessages;
-import org.eclipse.ui.examples.contributions.model.PersonInput;
-import org.eclipse.ui.menus.CommandContributionItem;
-import org.eclipse.ui.menus.CommandContributionItemParameter;
-
-/**
- * Provide a dynamic list of open editors to activate.
- * 
- * @since 3.4
- */
-public class DynamicEditorList extends CompoundContributionItem {
-	private static final IContributionItem[] EMPTY = new IContributionItem[0];
-
-	private static class NobodyHereContribution extends ContributionItem {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Menu,
-		 *      int)
-		 */
-		public void fill(Menu menu, int index) {
-			MenuItem item = new MenuItem(menu, SWT.NONE, index);
-			item.setText(ContributionMessages.DynamicEditorList_label);
-			item.setEnabled(false);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
-	 */
-	protected IContributionItem[] getContributionItems() {
-		// maybe we can find a better way for contributed IContributionItems
-		IWorkbenchWindow window = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (window == null) {
-			return EMPTY;
-		}
-
-		IWorkbenchPage page = window.getActivePage();
-		if (page == null) {
-			return EMPTY;
-		}
-		IEditorReference[] editors = page.getEditorReferences();
-		ArrayList menuList = new ArrayList();
-
-		int editorNum = 1;
-		for (int i = 0; i < editors.length && editorNum < 10; i++) {
-			try {
-				if (editors[i].getId().equals(InfoEditor.ID)) {
-					menuList.add(createItem(editorNum++, editors[i]));
-				}
-			} catch (PartInitException e) {
-			}
-
-		}
-		if (menuList.isEmpty()) {
-			menuList.add(new NobodyHereContribution());
-		}
-		return (IContributionItem[]) menuList
-				.toArray(new IContributionItem[menuList.size()]);
-	}
-
-	private IContributionItem createItem(int i, IEditorReference ref)
-			throws PartInitException {
-		CommandContributionItemParameter p = new CommandContributionItemParameter(
-				PlatformUI.getWorkbench(), null, ActivateEditorHandler.ID,
-				CommandContributionItem.STYLE_PUSH);
-		p.parameters = new HashMap();
-		PersonInput editorInput = (PersonInput) ref.getEditorInput();
-		p.parameters.put(ActivateEditorHandler.PARM_EDITOR, new Integer(
-				editorInput.getIndex()));
-		String menuNum = Integer.toString(i);
-		p.label = menuNum + " " + ref.getTitle(); //$NON-NLS-1$
-		p.mnemonic = menuNum;
-		return new CommandContributionItem(p);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/editor/InfoEditor.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/editor/InfoEditor.java
deleted file mode 100644
index 167fa2f..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/editor/InfoEditor.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.editor;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.IHandler;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-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.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.ISaveablePart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.examples.contributions.ContributionMessages;
-import org.eclipse.ui.examples.contributions.model.IPersonService;
-import org.eclipse.ui.examples.contributions.model.Person;
-import org.eclipse.ui.examples.contributions.model.PersonInput;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.part.EditorPart;
-
-/**
- * Edit a person.
- * 
- * @since 3.3
- */
-public class InfoEditor extends EditorPart {
-	public static final String ID = "org.eclipse.ui.examples.contributions.editor"; //$NON-NLS-1$
-	private static final String EDITOR_RESET_ID = "org.eclipse.ui.examples.contributions.editor.reset"; //$NON-NLS-1$
-
-	private Person person;
-	private Text surnameText;
-	private Text givennameText;
-	private boolean dirty = false;
-	private IHandler resetHandler;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		monitor.beginTask(getPartName(), 3);
-		person.setSurname(surnameText.getText());
-		monitor.worked(1);
-		person.setGivenname(givennameText.getText());
-		monitor.worked(1);
-		IPersonService service = (IPersonService) getSite().getService(
-				IPersonService.class);
-		service.updatePerson(person);
-		monitor.worked(1);
-		monitor.done();
-		setDirty(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
-	 */
-	public void doSaveAs() {
-		// nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite,
-	 *      org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		setSite(site);
-		setInput(input);
-		if (!(input instanceof PersonInput)) {
-			throw new PartInitException("Not a person"); //$NON-NLS-1$
-		}
-		PersonInput pinput = (PersonInput) input;
-		IPersonService service = (IPersonService) getSite().getService(
-				IPersonService.class);
-		person = service.getPerson(pinput.getIndex());
-		if (person == null) {
-			throw new PartInitException("person does not exist"); //$NON-NLS-1$
-		}
-		setPartName("Person - " + pinput.getIndex()); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#isDirty()
-	 */
-	public boolean isDirty() {
-		return dirty;
-	}
-
-	private void setDirty(boolean d) {
-		dirty = d;
-		firePropertyChange(ISaveablePart.PROP_DIRTY);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		KeyListener keyListener = new KeyListener() {
-			public void keyPressed(KeyEvent e) {
-				if ((e.keyCode & SWT.MODIFIER_MASK) == 0) {
-					setDirty(true);
-				}
-			}
-
-			public void keyReleased(KeyEvent e) {
-				// nothing
-			}
-		};
-
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout gridLayout = new GridLayout(2, false);
-		composite.setLayout(gridLayout);
-
-		Label l = new Label(composite, SWT.RIGHT);
-		l.setText(ContributionMessages.InfoEditor_surname);
-		l.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
-		surnameText = new Text(composite, SWT.SINGLE);
-		GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
-		surnameText.setLayoutData(gridData);
-		surnameText.addKeyListener(keyListener);
-
-		l = new Label(composite, SWT.RIGHT);
-		l.setText(ContributionMessages.InfoEditor_givenname);
-		l.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
-		givennameText = new Text(composite, SWT.SINGLE);
-		gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
-		givennameText.setLayoutData(gridData);
-		givennameText.addKeyListener(keyListener);
-
-		updateText();
-
-		createHandlers();
-	}
-
-	/**
-	 * Set our text field to the person text.
-	 */
-	private void updateText() {
-		surnameText.setText(person.getSurname());
-		givennameText.setText(person.getGivenname());
-	}
-
-	/**
-	 * Instantiate any handlers specific to this view and activate them.
-	 */
-	private void createHandlers() {
-		IHandlerService handlerService = (IHandlerService) getSite()
-				.getService(IHandlerService.class);
-		resetHandler = new AbstractHandler() {
-			public Object execute(ExecutionEvent event) {
-				updateText();
-				setDirty(false);
-				return null;
-			}
-		};
-		handlerService.activateHandler(EDITOR_RESET_ID, resetHandler);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		surnameText.setFocus();
-	}
-
-	public Person getCurrentPerson() {
-		person.setSurname(surnameText.getText());
-		person.setGivenname(givennameText.getText());
-		return person;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/editor/IntegerTypeConverter.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/editor/IntegerTypeConverter.java
deleted file mode 100644
index c376fdc..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/editor/IntegerTypeConverter.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.editor;
-
-import org.eclipse.core.commands.AbstractParameterValueConverter;
-import org.eclipse.core.commands.ParameterValueConversionException;
-
-/**
- * Convert between Integer and String for a command parameter type.
- * 
- * @since 3.4
- */
-public class IntegerTypeConverter extends AbstractParameterValueConverter {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.AbstractParameterValueConverter#convertToObject(java.lang.String)
-	 */
-	public Object convertToObject(String parameterValue)
-			throws ParameterValueConversionException {
-		try {
-			return Integer.decode(parameterValue);
-		} catch (NumberFormatException e) {
-			throw new ParameterValueConversionException("Failed to decode", e); //$NON-NLS-1$
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.AbstractParameterValueConverter#convertToString(java.lang.Object)
-	 */
-	public String convertToString(Object parameterValue)
-			throws ParameterValueConversionException {
-		if (!(parameterValue instanceof Integer)) {
-			throw new ParameterValueConversionException("Failed to convert"); //$NON-NLS-1$
-		}
-		return parameterValue.toString();
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/handlers/GlobalMenuHandler.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/handlers/GlobalMenuHandler.java
deleted file mode 100644
index fb53ae6..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/handlers/GlobalMenuHandler.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.handlers;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.examples.contributions.ContributionMessages;
-import org.eclipse.ui.handlers.HandlerUtil;
-import org.eclipse.jface.dialogs.MessageDialog;
-
-/**
- * Our sample handler extends AbstractHandler, an IHandler base class.
- * 
- * @see org.eclipse.core.commands.IHandler
- * @see org.eclipse.core.commands.AbstractHandler
- * @since 3.3
- */
-public class GlobalMenuHandler extends AbstractHandler {
-	/**
-	 * The constructor.
-	 */
-	public GlobalMenuHandler() {
-	}
-
-	/**
-	 * the command has been executed, so extract extract the needed information
-	 * from the application context.
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		IWorkbenchWindow window = HandlerUtil
-				.getActiveWorkbenchWindowChecked(event);
-		MessageDialog.openInformation(window.getShell(),
-				ContributionMessages.SampleHandler_plugin_name,
-				ContributionMessages.SampleHandler_hello_msg);
-		return null;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/handlers/InfoAboutHandler.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/handlers/InfoAboutHandler.java
deleted file mode 100644
index ca4992d..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/handlers/InfoAboutHandler.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.handlers;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.examples.contributions.ContributionMessages;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-/**
- * Opens a blank dialog with the InfoView title. The handler should only be
- * active when the activePart is an InfoView part.
- * <p>
- * This is used for the menu contribution example.
- * </p>
- * 
- * @since 3.4
- *
- */
-public class InfoAboutHandler extends AbstractHandler {
-
-	/**
-	 * A blank dialog. This is activated by the About InfoView menu
-	 * contribution. The handler is active when the InfoView part is active.
-	 * 
-	 * @since 3.4
-	 * 
-	 */
-	private final class InfoAboutDialog extends Dialog {
-		private InfoAboutDialog(Shell parentShell) {
-			super(parentShell);
-		}
-
-		protected void configureShell(Shell newShell) {
-			super.configureShell(newShell);
-			newShell.setText(ContributionMessages.InfoView_about_msg);
-		}
-	}
-
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		IWorkbenchWindow window = HandlerUtil
-				.getActiveWorkbenchWindowChecked(event);
-		Dialog dialog = new InfoAboutDialog(window.getShell());
-		dialog.open();
-		return null;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/messages.properties b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/messages.properties
deleted file mode 100644
index d3336d5..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/messages.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-SampleHandler_plugin_name=Command Contribution Examples
-SampleHandler_hello_msg=Hello, Eclipse world
-InfoView_countElements=There are {0} model elements
-InfoView_about_msg=About InfoView
-EditInfoHandler_failed_to_open=Failed to open model editor
-InfoEditor_surname=Surname:
-InfoEditor_givenname=Given name:
-DeltaInfoHandler_found=Delta found\!
-DeltaInfoHandler_notFound=No delta found\!
-DeltaInfoHandler_shellTitle=Delta
-DynamicEditorList_label=Nobody here
-PersonWizardPage_descriptoin=Create a new Person
-PersonWizardPage_error_alreadyExists=Person ''{0}'' already exists
-PersonWizardPage_error_missingGivenname=Must supply a given name
-PersonWizardPage_error_missingSurname=Must supply a surname
-PersonWizardPage_id_label=Employee ID
-PersonWizardPage_title=New Person
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/IPersonService.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/IPersonService.java
deleted file mode 100644
index d819dc1..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/IPersonService.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.model;
-
-import java.util.Collection;
-
-import org.eclipse.jface.util.IPropertyChangeListener;
-
-/**
- * An example service to manage People.
- * 
- * @since 3.4
- */
-public interface IPersonService {
-	/**
-	 * Fired when a new person is created.
-	 */
-	public static final String PROP_ADD = "add"; //$NON-NLS-1$
-
-	/**
-	 * Fired when a Person is updated by the service.
-	 */
-	public static final String PROP_CHANGE = "change"; //$NON-NLS-1$
-
-	/**
-	 * The collection of people.
-	 * 
-	 * @return an unmodifiable Collection. For looking, not touching. Will not
-	 *         be <code>null</code>.
-	 */
-	public Collection getPeople();
-
-	/**
-	 * Return the person identified by <code>id</code>.
-	 * 
-	 * @param id
-	 *            a valid ID
-	 * @return a copy of the person, or <code>null</code> if not found.
-	 */
-	public Person getPerson(int id);
-
-	/**
-	 * Update the person in this service. If this person does not exist in the
-	 * service it does nothing.
-	 * 
-	 * @param person
-	 *            the person to update. Must not be <code>null</code>.
-	 */
-	public void updatePerson(Person person);
-
-	/**
-	 * Create a person object for this id. Does nothing if a person already
-	 * exists for this id. The returned person has default values for most
-	 * attributes, and the person's ID is set to <code>id</code>.
-	 * 
-	 * @param id
-	 *            the id for the person.
-	 * @return a copy of the person, or <code>null</code> if a person already
-	 *         exists.
-	 */
-	public Person createPerson(int id);
-
-	/**
-	 * Listen for changes to people managed by this service.
-	 * <p>
-	 * Note: this services cleans up listeners when it is disposed.
-	 * </p>
-	 * 
-	 * @param listener
-	 *            the property change listener. Has no effect if an identical
-	 *            listener is already registered. Must not be <code>null</code>
-	 * @see #PROP_ADD
-	 * @see #PROP_CHANGE
-	 * @see IPersonService#removePersonChangeListener(IPropertyChangeListener)
-	 */
-	public void addPersonChangeListener(IPropertyChangeListener listener);
-
-	/**
-	 * Remove the change listener.
-	 * 
-	 * @param listener
-	 *            the property change listener. Has no effect if it is not
-	 *            already registered. Must not be <code>null</code>.
-	 */
-	public void removePersonChangeListener(IPropertyChangeListener listener);
-
-	/**
-	 * Log this person into the system. This is in effect until anoteher person
-	 * is logged in.
-	 * 
-	 * @param person
-	 *            the person to log in. May be <code>null</code>.
-	 */
-	public void login(Person person);
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/Person.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/Person.java
deleted file mode 100644
index 30beef7..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/Person.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.model;
-
-/**
- * A simple model object that is mutable.
- * 
- * @since 3.3
- */
-public class Person {
-
-	private int id;
-	private String surname;
-	private String givenname;
-	private boolean admin = false;
-
-
-	Person(int id, String sn, String gn) {
-		surname = sn;
-		givenname = gn;
-		this.id = id;
-	}
-
-	public String getSurname() {
-		return surname;
-	}
-
-	public void setSurname(String surname) {
-		this.surname = surname;
-	}
-
-	public int getId() {
-		return id;
-	}
-
-	public String getGivenname() {
-		return givenname;
-	}
-
-	public void setGivenname(String givenname) {
-		this.givenname = givenname;
-	}
-	
-	public boolean hasAdminRights() {
-		return admin;
-	}
-	
-	public void setAdminRights(boolean admin) {
-		this.admin = admin;
-	}
-
-	public String toString() {
-		StringBuffer buf = new StringBuffer(surname);
-		buf.append(", "); //$NON-NLS-1$
-		buf.append(givenname);
-		buf.append(" ("); //$NON-NLS-1$
-		buf.append(id);
-		if (admin) {
-			buf.append("-adm"); //$NON-NLS-1$
-		}
-		buf.append(")"); //$NON-NLS-1$
-		return buf.toString();
-	}
-
-	protected Person copy() {
-		return new Person(id, surname, givenname);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return id;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object o) {
-		if (o instanceof Person) {
-			Person p = (Person) o;
-			return p.givenname == givenname && p.id == id
-					&& p.surname == surname;
-		}
-		return false;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonInput.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonInput.java
deleted file mode 100644
index 75ec98a..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonInput.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.model;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IPersistableElement;
-
-/**
- * The editor input for looking up a person.
- * 
- * @since 3.3
- */
-public class PersonInput implements IEditorInput {
-	private int index;
-
-	public PersonInput(int i) {
-		index = i;
-	}
-
-	public int getIndex() {
-		return index;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IEditorInput#exists()
-	 */
-	public boolean exists() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IEditorInput#getName()
-	 */
-	public String getName() {
-		return "" + index; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IEditorInput#getPersistable()
-	 */
-	public IPersistableElement getPersistable() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IEditorInput#getToolTipText()
-	 */
-	public String getToolTipText() {
-		return getName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return index;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object o) {
-		if (o instanceof PersonInput) {
-			return index == ((PersonInput)o).index; 
-		}
-		return false;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonService.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonService.java
deleted file mode 100644
index fa451a2..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonService.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.model;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.services.IDisposable;
-import org.eclipse.ui.services.IServiceLocator;
-import org.eclipse.ui.services.ISourceProviderService;
-
-/**
- * Example implementation of the person service.
- * 
- * @since 3.4
- */
-public class PersonService implements IPersonService, IDisposable {
-
-	private static final int ME = 1114;
-	private Map people = new TreeMap();
-	private IServiceLocator serviceLocator;
-	private ListenerList listeners = new ListenerList(ListenerList.IDENTITY);
-
-	public PersonService(IServiceLocator locator) {
-		serviceLocator = locator;
-		serviceLocator.hasService(IHandlerService.class);
-		fillModel();
-	}
-
-	private static final String[] datafill = {
-			"Webster", "Paul", "Doe", "John", "Doe", "Jane", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-			"Public", "John", "Public", "Jane" }; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
-
-	private void fillModel() {
-		int i = ME;
-		for (int j = 0; j < datafill.length; j += 2) {
-			Integer iid = new Integer(i++);
-			Person p = new Person(iid.intValue(), datafill[j], datafill[j + 1]);
-			if (p.getId() == ME) {
-				p.setAdminRights(true);
-			}
-			people.put(iid, p);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.examples.contributions.model.IPersonService#addPersonChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
-	public void addPersonChangeListener(IPropertyChangeListener listener) {
-		listeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.examples.contributions.model.IPersonService#getPeople()
-	 */
-	public Collection getPeople() {
-		return Collections.unmodifiableCollection(people.values());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.examples.contributions.model.IPersonService#getPerson(int)
-	 */
-	public Person getPerson(int id) {
-		Person p = (Person) people.get(new Integer(id));
-		if (p == null) {
-			return null;
-		}
-		return p.copy();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.examples.contributions.model.IPersonService#removePersonChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
-	public void removePersonChangeListener(IPropertyChangeListener listener) {
-		listeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.examples.contributions.model.IPersonService#updatePerson(org.eclipse.ui.examples.contributions.model.Person)
-	 */
-	public void updatePerson(Person person) {
-		Assert.isNotNull(person);
-		Person p = (Person) people.get(new Integer(person.getId()));
-		if (p == null) {
-			Assert.isNotNull(p, "Must update a real person"); //$NON-NLS-1$
-		}
-		if (person.equals(p)) {
-			return;
-		}
-		Person oldVal = p.copy();
-		p.setGivenname(person.getGivenname());
-		p.setSurname(person.getSurname());
-		firePersonChange(PROP_CHANGE, oldVal, person);
-	}
-
-	/**
-	 * @param oldVal
-	 * @param person
-	 */
-	private void firePersonChange(String property, Person oldVal, Person person) {
-		if (listeners.isEmpty()) {
-			return;
-		}
-		PropertyChangeEvent event = new PropertyChangeEvent(this, property,
-				oldVal, person);
-		Object[] array = listeners.getListeners();
-		for (int i = 0; i < array.length; i++) {
-			((IPropertyChangeListener) array[i]).propertyChange(event);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.examples.contributions.model.IPersonService#createPerson(int)
-	 */
-	public Person createPerson(int id) {
-		Integer iid = new Integer(id);
-		if (people.containsKey(iid)) {
-			return null;
-		}
-		Person person = new Person(id, "surname", "givenname"); //$NON-NLS-1$//$NON-NLS-2$
-		people.put(iid, person);
-		firePersonChange(PROP_ADD, null, person);
-		return person;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.services.IDisposable#dispose()
-	 */
-	public void dispose() {
-		// we'd save stuff here, maybe, if we cared
-		listeners.clear();
-		serviceLocator = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.examples.contributions.model.IPersonService#login(org.eclipse.ui.examples.contributions.model.Person)
-	 */
-	public void login(Person person) {
-		ISourceProviderService sources = (ISourceProviderService) serviceLocator
-				.getService(ISourceProviderService.class);
-		// should do some more checks
-		UserSourceProvider userProvider = (UserSourceProvider) sources
-				.getSourceProvider(UserSourceProvider.USER);
-		userProvider.login(person);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonServiceFactory.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonServiceFactory.java
deleted file mode 100644
index f079c73..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonServiceFactory.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.model;
-
-import org.eclipse.ui.services.AbstractServiceFactory;
-import org.eclipse.ui.services.IServiceLocator;
-
-/**
- * Supply the person service to the IServiceLocator framework.
- * 
- * @since 3.4
- */
-public class PersonServiceFactory extends AbstractServiceFactory {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.services.AbstractServiceFactory#create(java.lang.Class,
-	 *      org.eclipse.ui.services.IServiceLocator,
-	 *      org.eclipse.ui.services.IServiceLocator)
-	 */
-	public Object create(Class serviceInterface, IServiceLocator parentLocator,
-			IServiceLocator locator) {
-		if (!IPersonService.class.equals(serviceInterface)) {
-			return null;
-		}
-		Object parentService = parentLocator.getService(IPersonService.class);
-		if (parentService == null) {
-			// the global level person service implementation
-			return new PersonService(locator);
-		}
-		return new PersonServiceSlave(locator, (IPersonService) parentService);
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonServiceSlave.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonServiceSlave.java
deleted file mode 100644
index 3bb67b6..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonServiceSlave.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.model;
-
-import java.util.Collection;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.services.IDisposable;
-import org.eclipse.ui.services.IServiceLocator;
-
-/**
- * Example implementation that cleans up listeners when the IServiceLocator
- * (site, window, etc) is disposed. It delegates to its parent for the actual
- * behaviour.
- * 
- * @since 3.4
- */
-public class PersonServiceSlave implements IPersonService, IDisposable {
-
-	private IServiceLocator serviceLocator;
-	private IPersonService parentService;
-	private ListenerList localListeners = new ListenerList(
-			ListenerList.IDENTITY);
-
-	public PersonServiceSlave(IServiceLocator locator, IPersonService parent) {
-		serviceLocator = locator;
-		parentService = parent;
-		serviceLocator.hasService(IHandlerService.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.examples.contributions.model.IPersonService#addPersonChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
-	public void addPersonChangeListener(IPropertyChangeListener listener) {
-		localListeners.add(listener);
-		parentService.addPersonChangeListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.examples.contributions.model.IPersonService#getPeople()
-	 */
-	public Collection getPeople() {
-		return parentService.getPeople();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.examples.contributions.model.IPersonService#getPerson(int)
-	 */
-	public Person getPerson(int id) {
-		return parentService.getPerson(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.examples.contributions.model.IPersonService#removePersonChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
-	public void removePersonChangeListener(IPropertyChangeListener listener) {
-		localListeners.remove(listener);
-		parentService.removePersonChangeListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.examples.contributions.model.IPersonService#updatePerson(org.eclipse.ui.examples.contributions.model.Person)
-	 */
-	public void updatePerson(Person person) {
-		parentService.updatePerson(person);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.examples.contributions.model.IPersonService#createPerson(int)
-	 */
-	public Person createPerson(int id) {
-		return parentService.createPerson(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.services.IDisposable#dispose()
-	 */
-	public void dispose() {
-		Object[] array = localListeners.getListeners();
-		localListeners.clear();
-		for (int i = 0; i < array.length; i++) {
-			parentService
-					.removePersonChangeListener((IPropertyChangeListener) array[i]);
-		}
-		serviceLocator = null;
-		parentService = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.examples.contributions.model.IPersonService#login(org.eclipse.ui.examples.contributions.model.Person)
-	 */
-	public void login(Person person) {
-		parentService.login(person);
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonWizard.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonWizard.java
deleted file mode 100644
index 8c2089f..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonWizard.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.model;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * Use the service to create a person.
- * 
- * @since 3.4
- */
-public class PersonWizard extends Wizard implements INewWizard {
-	private PersonWizardPage mainPage;
-	private IWorkbench workbench;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		mainPage = new PersonWizardPage(workbench);
-		addPage(mainPage);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() {
-		return mainPage.finish();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
-	 *      org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		this.workbench = workbench;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonWizardPage.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonWizardPage.java
deleted file mode 100644
index 6454053..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/PersonWizardPage.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.model;
-
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.osgi.util.NLS;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.examples.contributions.ContributionMessages;
-import org.eclipse.ui.services.IServiceLocator;
-
-/**
- * Create a Person, fill in the correct fields.
- * 
- * @since 3.4
- */
-public class PersonWizardPage extends WizardPage implements Listener {
-
-	private IServiceLocator locator;
-	private Text surnameText;
-	private Text givennameText;
-	private Text idText;
-
-	/**
-	 * @param pageName
-	 */
-	public PersonWizardPage(IServiceLocator locator) {
-		super("personWizardPage"); //$NON-NLS-1$
-		this.locator = locator;
-		setTitle(ContributionMessages.PersonWizardPage_title);
-		setDescription(ContributionMessages.PersonWizardPage_descriptoin);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-		// top level group
-		Composite topLevel = new Composite(parent, SWT.NONE);
-		GridLayout gridLayout = new GridLayout(2, false);
-		topLevel.setLayout(gridLayout);
-
-		Label l = new Label(topLevel, SWT.RIGHT);
-		l.setText(ContributionMessages.PersonWizardPage_id_label);
-		l.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
-		idText = new Text(topLevel, SWT.SINGLE);
-		GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
-		idText.setLayoutData(gridData);
-		idText.addListener(SWT.FocusOut, this);
-		idText.addListener(SWT.KeyUp, this);
-
-		l = new Label(topLevel, SWT.RIGHT);
-		l.setText(ContributionMessages.InfoEditor_surname);
-		l.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
-		surnameText = new Text(topLevel, SWT.SINGLE);
-		gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
-		surnameText.setLayoutData(gridData);
-		surnameText.addListener(SWT.FocusOut, this);
-		surnameText.addListener(SWT.KeyUp, this);
-
-		l = new Label(topLevel, SWT.RIGHT);
-		l.setText(ContributionMessages.InfoEditor_givenname);
-		l.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
-		givennameText = new Text(topLevel, SWT.SINGLE);
-		gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
-		givennameText.setLayoutData(gridData);
-		givennameText.addListener(SWT.FocusOut, this);
-		givennameText.addListener(SWT.KeyUp, this);
-
-		setControl(topLevel);
-		setPageComplete(validatePage());
-		setErrorMessage(null);
-		setMessage(null);
-	}
-
-	private boolean validatePage() {
-		if (getId() == 0) {
-			return false;
-		}
-		IPersonService service = (IPersonService) locator
-				.getService(IPersonService.class);
-		if (service.getPerson(getId()) != null) {
-			setErrorMessage(NLS.bind(
-					ContributionMessages.PersonWizardPage_error_alreadyExists,
-					new Integer(getId())));
-			return false;
-		}
-		if (getSurname() == null || getSurname().length() == 0) {
-			setErrorMessage(ContributionMessages.PersonWizardPage_error_missingSurname);
-			return false;
-		}
-		if (getGivenname() == null || getGivenname().length() == 0) {
-			setErrorMessage(ContributionMessages.PersonWizardPage_error_missingGivenname);
-			return false;
-		}
-		setErrorMessage(null);
-		return true;
-	}
-
-	int getId() {
-		try {
-			return Integer.parseInt(idText.getText());
-		} catch (NumberFormatException e) {
-		}
-		return 0;
-	}
-
-	String getGivenname() {
-		return givennameText.getText();
-	}
-
-	String getSurname() {
-		return surnameText.getText();
-	}
-
-	boolean finish() {
-		IPersonService service = (IPersonService) locator
-				.getService(IPersonService.class);
-		Person person = service.createPerson(getId());
-		if (person == null) {
-			return false;
-		}
-		person.setGivenname(getGivenname());
-		person.setSurname(getSurname());
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void handleEvent(Event event) {
-		// this plus validatePage() are blunt force validation.
-		setPageComplete(validatePage());
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/UserPropertyTester.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/UserPropertyTester.java
deleted file mode 100644
index d1fcec5..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/UserPropertyTester.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.model;
-
-import org.eclipse.core.expressions.PropertyTester;
-
-/**
- * Test properties of a Person object provided as a variable.
- * 
- * @since 3.4
- */
-public class UserPropertyTester extends PropertyTester {
-	private final static String IS_ADMIN = "isAdmin"; //$NON-NLS-1$
-	private final static String ID = "id"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object,
-	 *      java.lang.String, java.lang.Object[], java.lang.Object)
-	 */
-	public boolean test(Object receiver, String property, Object[] args,
-			Object expectedValue) {
-		if (!(receiver instanceof Person)) {
-			return false;
-		}
-		Person person = (Person) receiver;
-		if (property.equals(IS_ADMIN) && expectedValue instanceof Boolean) {
-			boolean value = ((Boolean) expectedValue).booleanValue();
-			return person.hasAdminRights() == value;
-		}
-		if (property.equals(ID) && expectedValue instanceof Integer) {
-			int value = ((Integer) expectedValue).intValue();
-			return person.getId() == value;
-		}
-		return false;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/UserSourceProvider.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/UserSourceProvider.java
deleted file mode 100644
index 7e61eba..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/model/UserSourceProvider.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.model;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.ui.AbstractSourceProvider;
-import org.eclipse.ui.ISources;
-
-/**
- * An example of provide a Person as a variable to the evaluation service.
- * 
- * @since 3.4
- */
-public class UserSourceProvider extends AbstractSourceProvider {
-	public static final String USER = "org.eclipse.ui.examples.contributions.user"; //$NON-NLS-1$
-	private static final String[] PROVIDED_SOURCE_NAMES = new String[] { USER };
-	private static final Object GUEST = new Object();
-
-	private Person user = null;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISourceProvider#dispose()
-	 */
-	public void dispose() {
-		user = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISourceProvider#getCurrentState()
-	 */
-	public Map getCurrentState() {
-		Map m = new HashMap();
-		m.put(USER, getCurrentUser());
-		return m;
-	}
-
-	private Object getCurrentUser() {
-		return user == null ? GUEST : user;
-	}
-
-	public void login(Person person) {
-		user = person;
-		// I'm not sure whether this has to be accurate, so use the matching
-		// declaration priority <<1 for now
-		fireSourceChanged(ISources.ACTIVE_SITE << 1, USER, getCurrentUser());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISourceProvider#getProvidedSourceNames()
-	 */
-	public String[] getProvidedSourceNames() {
-		return PROVIDED_SOURCE_NAMES;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/rcp/ApplicationActionBarAdvisor.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/rcp/ApplicationActionBarAdvisor.java
deleted file mode 100644
index ff5604a..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/rcp/ApplicationActionBarAdvisor.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.eclipse.ui.examples.contributions.rcp;
-
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-
-/**
- * The action bar advisor must still be used sometimes to register workbench
- * actions that have not been converted into handlers.
- */
-public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
-
-	private IWorkbenchAction openWindow;
-	private IWorkbenchAction save;
-	private IWorkbenchAction saveAll;
-
-	public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
-		super(configurer);
-	}
-
-	protected void makeActions(final IWorkbenchWindow window) {
-		// register any actions that need to be there as
-		// default handlers for commands.
-
-		openWindow = ActionFactory.OPEN_NEW_WINDOW.create(window);
-		register(openWindow);
-
-		save = ActionFactory.SAVE.create(window);
-		register(save);
-
-		saveAll = ActionFactory.SAVE_ALL.create(window);
-		register(saveAll);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.ActionBarAdvisor#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		openWindow = null;
-		save = null;
-		saveAll = null;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/rcp/ApplicationWorkbenchAdvisor.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/rcp/ApplicationWorkbenchAdvisor.java
deleted file mode 100644
index 302f96b..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/rcp/ApplicationWorkbenchAdvisor.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.eclipse.ui.examples.contributions.rcp;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.IExecutionListenerWithChecks;
-import org.eclipse.core.commands.NotEnabledException;
-import org.eclipse.core.commands.NotHandledException;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.examples.contributions.Activator;
-
-/**
- * This workbench advisor creates the window advisor, and specifies the
- * perspective id for the initial window.
- */
-public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
-
-	private static final String PERSPECTIVE_ID = "org.eclipse.ui.examples.contributions.perspective"; //$NON-NLS-1$
-
-	public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
-			IWorkbenchWindowConfigurer configurer) {
-		return new ApplicationWorkbenchWindowAdvisor(configurer);
-	}
-
-	public String getInitialWindowPerspectiveId() {
-		return PERSPECTIVE_ID;
-	}
-
-	public void postStartup() {
-		if (!Activator.DEBUG_COMMANDS) {
-			return;
-		}
-		ICommandService service = (ICommandService) getWorkbenchConfigurer()
-				.getWorkbench().getService(ICommandService.class);
-		service.addExecutionListener(new IExecutionListenerWithChecks() {
-
-			public void notHandled(String commandId,
-					NotHandledException exception) {
-				System.out.println("commandId = " + commandId //$NON-NLS-1$
-						+ " : not handled"); //$NON-NLS-1$
-			}
-
-			public void postExecuteFailure(String commandId,
-					ExecutionException exception) {
-				System.out.println("commandId = " + commandId + " : failed"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			public void postExecuteSuccess(String commandId, Object returnValue) {
-				System.out.println("commandId = " + commandId + " : success " //$NON-NLS-1$ //$NON-NLS-2$
-						+ returnValue);
-			}
-
-			public void preExecute(String commandId, ExecutionEvent event) {
-				System.out.println("commandId = " + commandId + " : parms " //$NON-NLS-1$ //$NON-NLS-2$
-						+ event.getParameters().keySet());
-			}
-
-			public void notDefined(String commandId,
-					NotDefinedException exception) {
-				System.out.println("commandId = " + commandId //$NON-NLS-1$
-						+ " : not defined"); //$NON-NLS-1$
-			}
-
-			public void notEnabled(String commandId,
-					NotEnabledException exception) {
-				System.out.println("commandId = " + commandId //$NON-NLS-1$
-						+ " : not enabled"); //$NON-NLS-1$
-			}
-		});
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/rcp/ApplicationWorkbenchWindowAdvisor.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/rcp/ApplicationWorkbenchWindowAdvisor.java
deleted file mode 100644
index 3065901..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/rcp/ApplicationWorkbenchWindowAdvisor.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.eclipse.ui.examples.contributions.rcp;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-
-/**
- * Some initial workbench window configuration.
- * 
- * @since 3.4
- */
-public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
-
-    public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-        super(configurer);
-    }
-
-    public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
-        return new ApplicationActionBarAdvisor(configurer);
-    }
-    
-    public void preWindowOpen() {
-        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-        configurer.setInitialSize(new Point(800, 300));
-        configurer.setShowCoolBar(true);
-        configurer.setShowStatusLine(false);
-    }
-    
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/rcp/ContributionApplication.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/rcp/ContributionApplication.java
deleted file mode 100644
index f7a244b..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/rcp/ContributionApplication.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.rcp;
-
-import org.eclipse.equinox.app.IApplication;
-import org.eclipse.equinox.app.IApplicationContext;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @since 3.4
- *
- */
-public class ContributionApplication implements IApplication {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)
-	 */
-	public Object start(IApplicationContext context) {
-		Display display = PlatformUI.createDisplay();
-		try {
-			int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());
-			if (returnCode == PlatformUI.RETURN_RESTART) {
-				return IApplication.EXIT_RESTART;
-			}
-			return IApplication.EXIT_OK;
-		} finally {
-			display.dispose();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.equinox.app.IApplication#stop()
-	 */
-	public void stop() {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		if (workbench == null)
-			return;
-		final Display display = workbench.getDisplay();
-		display.syncExec(new Runnable() {
-			public void run() {
-				if (!display.isDisposed())
-					workbench.close();
-			}
-		});
-	}
-
-
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/rcp/Perspective.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/rcp/Perspective.java
deleted file mode 100644
index 1355b77..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/rcp/Perspective.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.eclipse.ui.examples.contributions.rcp;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-import org.eclipse.ui.examples.contributions.view.InfoView;
-
-public class Perspective implements IPerspectiveFactory {
-
-	public void createInitialLayout(IPageLayout layout) {
-		String editorArea = layout.getEditorArea();
-		layout.setEditorAreaVisible(true);
-		
-		layout.addStandaloneView(InfoView.ID,  true, IPageLayout.LEFT, 0.25f, editorArea);
-		
-		layout.getViewLayout(InfoView.ID).setCloseable(false);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/AdminHandler.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/AdminHandler.java
deleted file mode 100644
index c49072a..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/AdminHandler.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.view;
-
-import java.util.Map;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.ISources;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.commands.IElementUpdater;
-import org.eclipse.ui.examples.contributions.model.IPersonService;
-import org.eclipse.ui.examples.contributions.model.Person;
-import org.eclipse.ui.handlers.HandlerUtil;
-import org.eclipse.ui.menus.UIElement;
-import org.eclipse.ui.services.IEvaluationService;
-
-/**
- * Allow the admin rights to be updated.
- * 
- * @since 3.4
- */
-public class AdminHandler extends AbstractHandler implements IElementUpdater {
-	private static final String ID = "org.eclipse.ui.examples.contributions.view.adminRights"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.commands.IElementUpdater#updateElement(org.eclipse.ui.menus.UIElement,
-	 *      java.util.Map)
-	 */
-	public void updateElement(UIElement element, Map parameters) {
-		IEvaluationService service = (IEvaluationService) PlatformUI
-				.getWorkbench().getService(IEvaluationService.class);
-		if (service == null) {
-			return;
-		}
-		ISelection sel = (ISelection) service.getCurrentState().getVariable(
-				ISources.ACTIVE_MENU_SELECTION_NAME);
-		if (!(sel instanceof IStructuredSelection)) {
-			return;
-		}
-		IStructuredSelection ssel = (IStructuredSelection) sel;
-		if (ssel.isEmpty()) {
-			return;
-		}
-		Object o = ssel.getFirstElement();
-		if (!(o instanceof Person)) {
-			return;
-		}
-		element.setChecked(((Person) o).hasAdminRights());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) {
-		ISelection sel = HandlerUtil.getActiveMenuSelection(event);
-		if (!(sel instanceof IStructuredSelection)) {
-			return null;
-		}
-		IStructuredSelection ssel = (IStructuredSelection) sel;
-		if (ssel.isEmpty()) {
-			return null;
-		}
-		Object o = ssel.getFirstElement();
-		if (!(o instanceof Person)) {
-			return null;
-		}
-		Person p = (Person) o;
-		p.setAdminRights(!p.hasAdminRights());
-		IPersonService service = (IPersonService) PlatformUI.getWorkbench()
-				.getService(IPersonService.class);
-		service.updatePerson(p);
-		ICommandService commands = (ICommandService) PlatformUI.getWorkbench()
-				.getService(ICommandService.class);
-		commands.refreshElements(ID, null);
-		return null;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/EditInfoHandler.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/EditInfoHandler.java
deleted file mode 100644
index f1c55b7..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/EditInfoHandler.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.view;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.examples.contributions.ContributionMessages;
-import org.eclipse.ui.examples.contributions.model.Person;
-import org.eclipse.ui.examples.contributions.model.PersonInput;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-/**
- * open an element for editing.
- * 
- * @since 3.3
- */
-public class EditInfoHandler extends AbstractHandler {
-	
-	public static final String ID = "org.eclipse.ui.examples.contributions.view.edit"; //$NON-NLS-1$
-
-	private static final String EDITOR_ID = "org.eclipse.ui.examples.contributions.editor"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
-		if (window == null) {
-			return null;
-		}
-		// this is written to check a context menu selection, and if not take
-		// the standard application context selection.
-		ISelection sel = HandlerUtil.getActiveMenuSelection(event);
-		if (sel == null) {
-			sel = HandlerUtil.getCurrentSelection(event);
-		}
-		if (sel instanceof IStructuredSelection && !sel.isEmpty()) {
-			IStructuredSelection selection = (IStructuredSelection) sel;
-			Person person = (Person) selection.getFirstElement();
-			PersonInput input = new PersonInput(person.getId());
-			try {
-				window.getActivePage().openEditor(input, EDITOR_ID);
-			} catch (PartInitException e) {
-				throw new ExecutionException(
-						ContributionMessages.EditInfoHandler_failed_to_open, e);
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/InfoView.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/InfoView.java
deleted file mode 100644
index fc7732d..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/InfoView.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.view;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.IHandler;
-import org.eclipse.core.commands.NotEnabledException;
-import org.eclipse.core.commands.NotHandledException;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.examples.contributions.ContributionMessages;
-import org.eclipse.ui.examples.contributions.model.IPersonService;
-import org.eclipse.ui.examples.contributions.model.Person;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * Our example view.
- * 
- * @since 3.3
- */
-public class InfoView extends ViewPart {
-	public static final String ID = "org.eclipse.ui.examples.contributions.view"; //$NON-NLS-1$
-
-	private static final String VIEW_COUNT_ID = "org.eclipse.ui.examples.contributions.view.count"; //$NON-NLS-1$
-	private static final String VIEW_CONTEXT_ID = "org.eclipse.ui.examples.contributions.view.context"; //$NON-NLS-1$
-	private ListViewer viewer;
-	private IHandler countHandler;
-	private ArrayList viewerInput;
-
-	private IPropertyChangeListener personListener = new IPropertyChangeListener() {
-		public void propertyChange(PropertyChangeEvent event) {
-			if (IPersonService.PROP_CHANGE.equals(event.getProperty())) {
-				refresh();
-			} else if (IPersonService.PROP_ADD.equals(event.getProperty())) {
-				viewerInput.add(event.getNewValue());
-				viewer.add(event.getNewValue());
-			}
-		}
-	};
-
-	private static class ContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			// nothing to do here
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			if (inputElement instanceof List) {
-				return ((List) inputElement).toArray();
-			}
-			return null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		viewer = new ListViewer(parent);
-		viewer.setContentProvider(new ContentProvider());
-		viewer.setLabelProvider(new LabelProvider());
-		viewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				editSelection();
-			}
-		});
-		IPersonService service = (IPersonService) getSite().getService(
-				IPersonService.class);
-		viewerInput = new ArrayList(service.getPeople());
-		service.addPersonChangeListener(personListener);
-		viewer.setInput(viewerInput);
-		getSite().setSelectionProvider(viewer);
-
-		MenuManager contextMenu = new MenuManager();
-		contextMenu.setRemoveAllWhenShown(true);
-
-		getSite().registerContextMenu(contextMenu, viewer);
-		Control control = viewer.getControl();
-		Menu menu = contextMenu.createContextMenu(control);
-		control.setMenu(menu);
-
-		activateContext();
-		createHandlers();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		viewer.getControl().setFocus();
-	}
-
-	/**
-	 * Activate a context that this view uses. It will be tied to this view
-	 * activation events and will be removed when the view is disposed.
-	 */
-	private void activateContext() {
-		IContextService contextService = (IContextService) getSite()
-				.getService(IContextService.class);
-		// this will get cleaned up automatically when the site
-		// is disposed
-		contextService.activateContext(VIEW_CONTEXT_ID);
-	}
-
-	/**
-	 * Instantiate any handlers specific to this view and activate them.
-	 */
-	private void createHandlers() {
-		IHandlerService handlerService = (IHandlerService) getSite()
-				.getService(IHandlerService.class);
-		countHandler = new AbstractHandler() {
-			public Object execute(ExecutionEvent event) {
-				List elements = (List) viewer.getInput();
-				MessageDialog.openInformation(getSite().getShell(),
-						ContributionMessages.SampleHandler_plugin_name,
-						NLS.bind(ContributionMessages.InfoView_countElements,
-								new Integer(elements.size())));
-				return null;
-			}
-		};
-		handlerService.activateHandler(VIEW_COUNT_ID, countHandler);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		if (countHandler != null) {
-			// we must dispose our handlers, although in this case it will
-			// be a no-op
-			countHandler.dispose();
-			countHandler = null;
-		}
-		super.dispose();
-	}
-
-	/**
-	 * Swap the 2 given elements from the model.
-	 * 
-	 * @param p1
-	 * @param p2
-	 */
-	public void swap(Person p1, Person p2) {
-		List elements = viewerInput;
-		int i1 = elements.indexOf(p1);
-		int i2 = elements.indexOf(p2);
-		Collections.swap(elements, i1, i2);
-		viewer.refresh();
-	}
-
-	/**
-	 * Refresh the viewer from the model.
-	 */
-	public void refresh() {
-		viewer.refresh();
-	}
-
-	private void editSelection() {
-		IHandlerService handlerService = (IHandlerService) getSite()
-				.getService(IHandlerService.class);
-		try {
-			handlerService.executeCommand(EditInfoHandler.ID, null);
-		} catch (ExecutionException e) {
-			// perhaps some logging here
-		} catch (NotDefinedException e) {
-		} catch (NotEnabledException e) {
-		} catch (NotHandledException e) {
-		}
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/LoginHandler.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/LoginHandler.java
deleted file mode 100644
index 40d5d6f..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/LoginHandler.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.view;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.examples.contributions.model.IPersonService;
-import org.eclipse.ui.examples.contributions.model.Person;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-/**
- * Allow login as the selected user. If you are doing this for real, I would
- * suggest checking their credentials!
- * 
- * @since 3.4
- */
-public class LoginHandler extends AbstractHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		IWorkbenchPart part = HandlerUtil.getActivePartChecked(event);
-		ISelection sel = HandlerUtil.getActiveMenuSelection(event);
-		if (sel == null) {
-			sel = HandlerUtil.getCurrentSelection(event);
-		}
-		if (sel instanceof IStructuredSelection && !sel.isEmpty()) {
-			IStructuredSelection selection = (IStructuredSelection) sel;
-			Person person = (Person) selection.getFirstElement();
-			IPersonService service = (IPersonService) part.getSite()
-					.getService(IPersonService.class);
-			service.login(person);
-		}
-		return null;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/RefreshInfoHandler.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/RefreshInfoHandler.java
deleted file mode 100644
index a35ea14..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/RefreshInfoHandler.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.view;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-/**
- * Request the view refresh from the model.
- * 
- * @since 3.3
- */
-public class RefreshInfoHandler extends AbstractHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		InfoView view = (InfoView) HandlerUtil.getActivePartChecked(event);
-		view.refresh();
-		return null;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/SwapInfoHandler.java b/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/SwapInfoHandler.java
deleted file mode 100644
index 08f41d0..0000000
--- a/examples/org.eclipse.ui.examples.contributions/src/org/eclipse/ui/examples/contributions/view/SwapInfoHandler.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.contributions.view;
-
-import java.util.Iterator;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.examples.contributions.model.Person;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-/**
- * Swap 2 elements around in the the view.
- * 
- * @since 3.3
- */
-public class SwapInfoHandler extends AbstractHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		InfoView view = (InfoView) HandlerUtil.getActivePartChecked(event);
-		ISelection sel = HandlerUtil.getCurrentSelection(event);
-		if (sel instanceof IStructuredSelection) {
-			IStructuredSelection selection = (IStructuredSelection) sel;
-			if (selection.size() != 2) {
-				return null;
-			}
-			Iterator i = selection.iterator();
-			Person p1 = (Person) i.next();
-			Person p2 = (Person) i.next();
-			view.swap(p1, p2);
-		}
-		return null;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.fieldassist/.classpath b/examples/org.eclipse.ui.examples.fieldassist/.classpath
deleted file mode 100644
index 203998a..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="Eclipse UI Examples Field Assist"/>
-	<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/examples/org.eclipse.ui.examples.fieldassist/.cvsignore b/examples/org.eclipse.ui.examples.fieldassist/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/examples/org.eclipse.ui.examples.fieldassist/.project b/examples/org.eclipse.ui.examples.fieldassist/.project
deleted file mode 100644
index 440e70b..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.examples.fieldassist</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/examples/org.eclipse.ui.examples.fieldassist/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.ui.examples.fieldassist/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 8630599..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,70 +0,0 @@
-#Mon Jan 15 21:19:47 EST 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.4
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.4
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/examples/org.eclipse.ui.examples.fieldassist/.settings/org.eclipse.jdt.ui.prefs b/examples/org.eclipse.ui.examples.fieldassist/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 0cb7d76..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Tue Oct 18 15:15:38 EDT 2005
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.2\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template></templates>
diff --git a/examples/org.eclipse.ui.examples.fieldassist/.settings/org.eclipse.pde.prefs b/examples/org.eclipse.ui.examples.fieldassist/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index a26a239..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Oct 18 16:45:19 EDT 2005
-compilers.p.deprecated=0
-compilers.p.illegal-att-value=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=1
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/FieldAssistPlugin.java b/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/FieldAssistPlugin.java
deleted file mode 100644
index d6f0772..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/FieldAssistPlugin.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.fieldassist;
-
-import org.eclipse.ui.plugin.*;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class FieldAssistPlugin extends AbstractUIPlugin {
-
-	//The shared instance.
-	private static FieldAssistPlugin plugin;
-	
-	// Our own content assist decorator (which adds the key binding)
-	static String DEC_CONTENTASSIST = "org.eclipse.ui.examples.fieldassist.contentAssistDecoration";
-	
-	/**
-	 * The constructor.
-	 */
-	public FieldAssistPlugin() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 * 
-	 * @return the shared plugin instance
-	 */
-	public static FieldAssistPlugin getDefault() {
-		return plugin;
-	}
-}
-
diff --git a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/FieldAssistTestDialog.java b/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/FieldAssistTestDialog.java
deleted file mode 100644
index f5ba033..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/FieldAssistTestDialog.java
+++ /dev/null
@@ -1,855 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - bug 132479 - [FieldAssist] Field assist example improvements
- *******************************************************************************/
-package org.eclipse.ui.examples.fieldassist;
-
-import java.text.MessageFormat;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.jface.bindings.keys.ParseException;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.StatusDialog;
-import org.eclipse.jface.fieldassist.AutoCompleteField;
-import org.eclipse.jface.fieldassist.ComboContentAdapter;
-import org.eclipse.jface.fieldassist.ContentProposalAdapter;
-import org.eclipse.jface.fieldassist.ControlDecoration;
-import org.eclipse.jface.fieldassist.FieldDecoration;
-import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
-import org.eclipse.jface.fieldassist.IContentProposal;
-import org.eclipse.jface.fieldassist.IContentProposalProvider;
-import org.eclipse.jface.fieldassist.IControlContentAdapter;
-import org.eclipse.jface.fieldassist.TextContentAdapter;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MenuDetectEvent;
-import org.eclipse.swt.events.MenuDetectListener;
-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.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-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.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Spinner;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.examples.fieldassist.preferences.PreferenceConstants;
-
-/**
- * Example dialog that shows different field assist capabilities.
- */
-public class FieldAssistTestDialog extends StatusDialog {
-
-	class SpinnerContentAdapter implements IControlContentAdapter {
-		// We are only implementing this for our internal use, not for
-		// content assist, so many of the methods are ignored.
-		public String getControlContents(Control control) {
-			return new Integer(((Spinner) control).getSelection()).toString();
-		}
-
-		public void setControlContents(Control control, String text,
-				int cursorPosition) {
-			// ignore
-		}
-
-		public void insertControlContents(Control control, String text,
-				int cursorPosition) {
-			// ignore
-		}
-
-		public int getCursorPosition(Control control) {
-			// ignore
-			return 0;
-		}
-
-		public Rectangle getInsertionBounds(Control control) {
-			return control.getBounds();
-		}
-
-		public void setCursorPosition(Control control, int index) {
-			// ignore
-		}
-	}
-
-	abstract class SmartField {
-		ControlDecoration controlDecoration;
-
-		Control control;
-
-		IControlContentAdapter contentAdapter;
-
-		FieldDecoration errorDecoration, warningDecoration;
-
-		SmartField(ControlDecoration dec, Control control,
-				IControlContentAdapter adapter) {
-			this.controlDecoration = dec;
-			this.contentAdapter = adapter;
-			this.control = control;
-		}
-
-		boolean isRequiredField() {
-			return true;
-		}
-
-		boolean hasQuickFix() {
-			return false;
-		}
-
-		void quickFix() {
-			// do nothing
-		}
-
-		boolean hasContentAssist() {
-			return false;
-		}
-
-		void dispose() {
-			// do nothing
-		}
-
-		FieldDecoration getErrorDecoration() {
-			if (errorDecoration == null) {
-				FieldDecoration standardError;
-				if (hasQuickFix()) {
-					standardError = FieldDecorationRegistry.getDefault()
-							.getFieldDecoration(
-									FieldDecorationRegistry.DEC_ERROR_QUICKFIX);
-				} else {
-					standardError = FieldDecorationRegistry.getDefault()
-							.getFieldDecoration(
-									FieldDecorationRegistry.DEC_ERROR);
-				}
-				if (getErrorMessage() == null) {
-					errorDecoration = standardError;
-				} else {
-					errorDecoration = new FieldDecoration(standardError
-							.getImage(), getErrorMessage());
-				}
-			}
-			return errorDecoration;
-
-		}
-
-		FieldDecoration getWarningDecoration() {
-			if (warningDecoration == null) {
-				FieldDecoration standardWarning = FieldDecorationRegistry
-						.getDefault().getFieldDecoration(
-								FieldDecorationRegistry.DEC_WARNING);
-				if (getWarningMessage() == null) {
-					warningDecoration = standardWarning;
-				} else {
-					warningDecoration = new FieldDecoration(standardWarning
-							.getImage(), getWarningMessage());
-				}
-			}
-			return warningDecoration;
-		}
-
-		String getContents() {
-			return contentAdapter.getControlContents(control);
-		}
-
-		void setContents(String contents) {
-			contentAdapter.setControlContents(control, contents, contents
-					.length());
-		}
-
-		abstract boolean isValid();
-
-		abstract boolean isWarning();
-
-		String getErrorMessage() {
-			return null;
-		}
-
-		String getWarningMessage() {
-			return null;
-		}
-
-	}
-
-	class UserField extends SmartField {
-		Menu quickFixMenu;
-
-		UserField(ControlDecoration dec, Control control,
-				IControlContentAdapter adapter) {
-			super(dec, control, adapter);
-		}
-
-		boolean isValid() {
-			String contents = getContents();
-			for (int i = 0; i < contents.length(); i++) {
-				if (!Character.isLetter(contents.charAt(i))) {
-					return false;
-				}
-			}
-			return true;
-		}
-
-		String getErrorMessage() {
-			return TaskAssistExampleMessages.ExampleDialog_UserError;
-		}
-
-		boolean isWarning() {
-			return getContents().equals(
-					TaskAssistExampleMessages.ExampleDialog_WarningName);
-		}
-
-		String getWarningMessage() {
-			return TaskAssistExampleMessages.ExampleDialog_UserWarning;
-		}
-
-		boolean hasContentAssist() {
-			return true;
-		}
-
-		boolean hasQuickFix() {
-			return true;
-		}
-
-		void quickFix() {
-			String contents = getContents();
-			StringBuffer lettersOnly = new StringBuffer();
-			int length = contents.length();
-			for (int i = 0; i < length;) {
-				char ch = contents.charAt(i++);
-				if (Character.isLetter(ch)) {
-					lettersOnly.append(ch);
-				}
-			}
-			setContents(lettersOnly.toString());
-		}
-
-		void dispose() {
-			if (quickFixMenu != null) {
-				quickFixMenu.dispose();
-				quickFixMenu = null;
-			}
-		}
-	}
-
-	class AgeField extends SmartField {
-
-		AgeField(ControlDecoration dec, Control control,
-				IControlContentAdapter adapter) {
-			super(dec, control, adapter);
-		}
-
-		boolean isValid() {
-			// We seed the spinner with valid values always.
-			return true;
-		}
-
-		boolean isWarning() {
-			Spinner spinner = (Spinner) control;
-			return spinner.getSelection() > 65;
-		}
-
-		String getWarningMessage() {
-			return TaskAssistExampleMessages.ExampleDialog_AgeWarning;
-		}
-	}
-
-	String[] validUsers = { "tom", "dick", "harry", "ferdinand", "tim", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-			"teresa", "tori", "daniela", "aaron", "kevin", "tod", "mike", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
-			"kim", "eric", "paul", "todd" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-
-	String triggerKey;
-
-	String username;
-
-	boolean showErrorDecoration, showErrorMessage, showWarningDecoration,
-			showRequiredFieldDecoration, showRequiredFieldLabelIndicator,
-			showSecondaryPopup, showContentAssist;
-
-	int marginWidth;
-
-	UserField textField, comboField;
-
-	/**
-	 * Open the example dialog.
-	 * 
-	 * @param parent
-	 *            the parent shell
-	 * @param username
-	 *            the default username
-	 */
-	public FieldAssistTestDialog(Shell parent, String username) {
-		super(parent);
-		setTitle(TaskAssistExampleMessages.ExampleDialog_Title);
-		this.username = username;
-		getPreferenceValues();
-	}
-
-	protected Control createDialogArea(Composite parent) {
-
-		Composite outer = (Composite) super.createDialogArea(parent);
-
-		initializeDialogUnits(outer);
-		createSecurityGroup(outer);
-
-		// Create a simple field to show how field assist can be used for
-		// autocomplete.
-		Group autoComplete = new Group(outer, SWT.NONE);
-		autoComplete.setLayoutData(new GridData(GridData.FILL_BOTH));
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
-		layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-		layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
-		layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		autoComplete.setLayout(layout);
-		autoComplete
-				.setText(TaskAssistExampleMessages.ExampleDialog_AutoCompleteGroup);
-
-		Label label = new Label(autoComplete, SWT.LEFT);
-		label.setText(TaskAssistExampleMessages.ExampleDialog_UserName);
-
-		// Create an auto-complete field representing a user name
-		Text text = new Text(autoComplete, SWT.BORDER);
-		text.setLayoutData(getFieldGridData());
-		new AutoCompleteField(text, new TextContentAdapter(), validUsers);
-
-		// Another one to test combos
-		label = new Label(autoComplete, SWT.LEFT);
-		label.setText(TaskAssistExampleMessages.ExampleDialog_ComboUserName);
-
-		Combo combo = new Combo(autoComplete, SWT.BORDER | SWT.DROP_DOWN);
-		combo.setText(username);
-		combo.setItems(validUsers);
-		combo.setLayoutData(getFieldGridData());
-		new AutoCompleteField(combo, new ComboContentAdapter(), validUsers);
-
-		Dialog.applyDialogFont(outer);
-
-		return outer;
-	}
-
-	private void getPreferenceValues() {
-		IPreferenceStore store = FieldAssistPlugin.getDefault()
-				.getPreferenceStore();
-		showErrorMessage = store
-				.getBoolean(PreferenceConstants.PREF_SHOWERRORMESSAGE);
-		showErrorDecoration = store
-				.getBoolean(PreferenceConstants.PREF_SHOWERRORDECORATION);
-		showWarningDecoration = store
-				.getBoolean(PreferenceConstants.PREF_SHOWWARNINGDECORATION);
-		showRequiredFieldDecoration = store
-				.getBoolean(PreferenceConstants.PREF_SHOWREQUIREDFIELDDECORATION);
-		showRequiredFieldLabelIndicator = store
-				.getBoolean(PreferenceConstants.PREF_SHOWREQUIREDFIELDLABELINDICATOR);
-		showSecondaryPopup = store
-				.getBoolean(PreferenceConstants.PREF_SHOWSECONDARYPOPUP);
-		showContentAssist = store
-				.getBoolean(PreferenceConstants.PREF_SHOWCONTENTPROPOSALCUE);
-		triggerKey = store.getString(PreferenceConstants.PREF_CONTENTASSISTKEY);
-		marginWidth = store
-				.getInt(PreferenceConstants.PREF_DECORATOR_MARGINWIDTH);
-	}
-
-	FieldDecoration getCueDecoration() {
-		// We use our own decoration which is based on the JFace version.
-		FieldDecorationRegistry registry = FieldDecorationRegistry.getDefault();
-		FieldDecoration dec = registry
-				.getFieldDecoration(FieldAssistPlugin.DEC_CONTENTASSIST);
-		if (dec == null) {
-			// Get the standard one. We use its image and our own customized
-			// text.
-			FieldDecoration standardDecoration = registry
-					.getFieldDecoration(FieldDecorationRegistry.DEC_CONTENT_PROPOSAL);
-			registry.registerFieldDecoration(
-					FieldAssistPlugin.DEC_CONTENTASSIST, NLS.bind(
-							TaskAssistExampleMessages.Decorator_ContentAssist,
-							triggerKey), standardDecoration.getImage());
-			dec = registry
-					.getFieldDecoration(FieldAssistPlugin.DEC_CONTENTASSIST);
-		}
-		return dec;
-	}
-
-	FieldDecoration getWarningDecoration() {
-		return FieldDecorationRegistry.getDefault().getFieldDecoration(
-				FieldDecorationRegistry.DEC_WARNING);
-	}
-
-	void handleModify(SmartField smartField) {
-		// Error indicator supercedes all others
-		if (!smartField.isValid()) {
-			showError(smartField);
-		} else {
-			hideError(smartField);
-			if (smartField.isWarning()) {
-				showWarning(smartField);
-			} else {
-				hideWarning(smartField);
-				if (showContentAssist && smartField.hasContentAssist()) {
-					showContentAssistDecoration(smartField, true);
-				} else {
-					showContentAssistDecoration(smartField, false);
-					showRequiredFieldDecoration(smartField,
-							showRequiredFieldDecoration);
-				}
-			}
-		}
-	}
-
-	GridData getFieldGridData() {
-		int margin = FieldDecorationRegistry.getDefault()
-				.getMaximumDecorationWidth();
-		GridData data = new GridData();
-		data.horizontalAlignment = SWT.FILL;
-		data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH + margin;
-		data.horizontalIndent = margin;
-		data.grabExcessHorizontalSpace = true;
-		return data;
-
-	}
-	
-	GridData getMultiLineTextFieldGridData() {
-		int margin = FieldDecorationRegistry.getDefault()
-				.getMaximumDecorationWidth();
-		GridData data = new GridData();
-		data.horizontalAlignment = SWT.FILL;
-		data.verticalAlignment = SWT.FILL;
-		data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH + margin;
-		data.heightHint = JFaceResources.getDialogFont().getFontData()[0].getHeight()*5;
-		data.horizontalIndent = margin;
-		data.grabExcessHorizontalSpace = true;
-		data.grabExcessVerticalSpace = true;
-		return data;
-
-	}
-
-	void showError(SmartField smartField) {
-		FieldDecoration dec = smartField.getErrorDecoration();
-		if (showErrorMessage) {
-			updateStatus(new Status(IStatus.ERROR,
-					"org.eclipse.examples.contentassist", 0, dec //$NON-NLS-1$
-							.getDescription(), null));
-		}
-		if (showErrorDecoration) {
-			showErrorDecoration(smartField, true);
-		}
-	}
-
-	void hideError(SmartField smartField) {
-		if (showErrorMessage) {
-			this.updateStatus(Status.OK_STATUS);
-		}
-		if (showErrorDecoration) {
-			showErrorDecoration(smartField, false);
-		}
-	}
-
-	void showWarning(SmartField smartField) {
-		if (showWarningDecoration) {
-			showWarningDecoration(smartField, true);
-		}
-	}
-
-	void hideWarning(SmartField smartField) {
-		if (showWarningDecoration) {
-			showWarningDecoration(smartField, false);
-		}
-	}
-
-	void installContentProposalAdapter(Control control,
-			IControlContentAdapter contentAdapter) {
-		IPreferenceStore store = FieldAssistPlugin.getDefault()
-				.getPreferenceStore();
-		boolean propagate = store
-				.getBoolean(PreferenceConstants.PREF_CONTENTASSISTKEY_PROPAGATE);
-		KeyStroke keyStroke;
-		char[] autoActivationCharacters = null;
-		int autoActivationDelay = store
-				.getInt(PreferenceConstants.PREF_CONTENTASSISTDELAY);
-
-		if (triggerKey.equals(PreferenceConstants.PREF_CONTENTASSISTKEYAUTO)) {
-			// null means automatically assist when character typed
-			keyStroke = null;
-		} else if (triggerKey
-				.equals(PreferenceConstants.PREF_CONTENTASSISTKEYAUTOSUBSET)) {
-			keyStroke = null;
-			autoActivationCharacters = new char[] { 't', 'd' };
-		} else {
-			try {
-				keyStroke = KeyStroke.getInstance(triggerKey);
-			} catch (ParseException e) {
-				keyStroke = KeyStroke.getInstance(SWT.F10);
-			}
-		}
-
-		ContentProposalAdapter adapter = new ContentProposalAdapter(control,
-				contentAdapter, getContentProposalProvider(), keyStroke,
-				autoActivationCharacters) {
-			public void closeProposalPopup() {
-				closeProposalPopup();
-			}
-		};
-		adapter.setAutoActivationDelay(autoActivationDelay);
-		adapter.setPropagateKeys(propagate);
-		adapter.setFilterStyle(getContentAssistFilterStyle());
-		adapter.setProposalAcceptanceStyle(getContentAssistAcceptance());
-	}
-
-	private IContentProposalProvider getContentProposalProvider() {
-		return new IContentProposalProvider() {
-			public IContentProposal[] getProposals(String contents, int position) {
-				IContentProposal[] proposals = new IContentProposal[validUsers.length];
-				for (int i = 0; i < validUsers.length; i++) {
-					final String user = validUsers[i];
-					proposals[i] = new IContentProposal() {
-						public String getContent() {
-							return user;
-						}
-
-						public String getLabel() {
-							return user;
-						}
-
-						public String getDescription() {
-							if (showSecondaryPopup && !user.equals("tori"))  //$NON-NLS-1$
-								return MessageFormat
-										.format(
-												TaskAssistExampleMessages.ExampleDialog_ProposalDescription,
-												new String[] { user });
-							return null;
-						}
-
-						public int getCursorPosition() {
-							return user.length();
-						}
-					};
-				}
-				return proposals;
-			}
-		};
-	}
-
-	private int getContentAssistAcceptance() {
-		IPreferenceStore store = FieldAssistPlugin.getDefault()
-				.getPreferenceStore();
-		String acceptanceStyle = store
-				.getString(PreferenceConstants.PREF_CONTENTASSISTRESULT);
-		if (acceptanceStyle
-				.equals(PreferenceConstants.PREF_CONTENTASSISTRESULT_INSERT))
-			return ContentProposalAdapter.PROPOSAL_INSERT;
-		if (acceptanceStyle
-				.equals(PreferenceConstants.PREF_CONTENTASSISTRESULT_REPLACE))
-			return ContentProposalAdapter.PROPOSAL_REPLACE;
-		return ContentProposalAdapter.PROPOSAL_IGNORE;
-	}
-
-	private int getContentAssistFilterStyle() {
-		IPreferenceStore store = FieldAssistPlugin.getDefault()
-				.getPreferenceStore();
-		String acceptanceStyle = store
-				.getString(PreferenceConstants.PREF_CONTENTASSISTFILTER);
-		if (acceptanceStyle
-				.equals(PreferenceConstants.PREF_CONTENTASSISTFILTER_CHAR))
-			return ContentProposalAdapter.FILTER_CHARACTER;
-		if (acceptanceStyle
-				.equals(PreferenceConstants.PREF_CONTENTASSISTFILTER_CUMULATIVE))
-			return ContentProposalAdapter.FILTER_CUMULATIVE;
-		return ContentProposalAdapter.FILTER_NONE;
-	}
-
-	void addRequiredFieldIndicator(Label label) {
-		String text = label.getText();
-		// This concatenation could be done by a field assist helper.
-		text = text.concat("*"); //$NON-NLS-1$
-		label.setText(text);
-	}
-
-	FieldDecoration getRequiredFieldDecoration() {
-		return FieldDecorationRegistry.getDefault().getFieldDecoration(
-				FieldDecorationRegistry.DEC_REQUIRED);
-	}
-
-	int getDecorationLocationBits() {
-		IPreferenceStore store = FieldAssistPlugin.getDefault()
-				.getPreferenceStore();
-		int bits = 0;
-		String vert = store
-				.getString(PreferenceConstants.PREF_DECORATOR_VERTICALLOCATION);
-		if (vert
-				.equals(PreferenceConstants.PREF_DECORATOR_VERTICALLOCATION_BOTTOM)) {
-			bits = SWT.BOTTOM;
-		} else if (vert
-				.equals(PreferenceConstants.PREF_DECORATOR_VERTICALLOCATION_CENTER)) {
-			bits = SWT.CENTER;
-		} else {
-			bits = SWT.TOP;
-		}
-
-		String horz = store
-				.getString(PreferenceConstants.PREF_DECORATOR_HORIZONTALLOCATION);
-		if (horz
-				.equals(PreferenceConstants.PREF_DECORATOR_HORIZONTALLOCATION_RIGHT)) {
-			bits |= SWT.RIGHT;
-		} else {
-			bits |= SWT.LEFT;
-		}
-		return bits;
-	}
-
-	void createSecurityGroup(Composite parent) {
-
-		Group main = new Group(parent, SWT.NONE);
-		main.setLayoutData(new GridData(GridData.FILL_BOTH));
-		main.setText(TaskAssistExampleMessages.ExampleDialog_SecurityGroup);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
-		layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-		layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
-		layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		main.setLayout(layout);
-
-		Label label = new Label(main, SWT.LEFT);
-		label.setText(TaskAssistExampleMessages.ExampleDialog_UserName);
-
-		// Create a field representing a user name
-		Text text = new Text(main, SWT.BORDER);
-		ControlDecoration dec = new ControlDecoration(text,
-				getDecorationLocationBits());
-		dec.setMarginWidth(marginWidth);
-		dec.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent event) {
-				MessageDialog
-						.openInformation(
-								getShell(),
-								TaskAssistExampleMessages.ExampleDialog_SelectionTitle,
-								TaskAssistExampleMessages.ExampleDialog_SelectionMessage);
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				// Nothing on default select
-			}
-		});
-
-		textField = new UserField(dec, text, new TextContentAdapter());
-		dec.addMenuDetectListener(new MenuDetectListener() {
-			public void menuDetected(MenuDetectEvent event) {
-				// no quick fix if we aren't in error state.
-				if (textField.isValid()) {
-					return;
-				}
-				if (textField.quickFixMenu == null) {
-					textField.quickFixMenu = createQuickFixMenu(textField);
-				}
-				textField.quickFixMenu.setLocation(event.x, event.y);
-				textField.quickFixMenu.setVisible(true);
-			}
-		});
-		if (showRequiredFieldLabelIndicator && textField.isRequiredField()) {
-			addRequiredFieldIndicator(label);
-		}
-		text.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent event) {
-				handleModify(textField);
-			}
-		});
-
-		text.setText(username);
-		installContentProposalAdapter(text, new TextContentAdapter());
-		text.setLayoutData(getFieldGridData());
-
-		label = new Label(main, SWT.LEFT);
-		label.setText(TaskAssistExampleMessages.ExampleDialog_ComboUserName);
-
-		// Create a combo field representing a user name
-		Combo combo = new Combo(main, SWT.BORDER | SWT.DROP_DOWN);
-		dec = new ControlDecoration(combo, getDecorationLocationBits());
-		dec.setMarginWidth(marginWidth);
-		comboField = new UserField(dec, combo, new ComboContentAdapter());
-
-		dec.addMenuDetectListener(new MenuDetectListener() {
-			public void menuDetected(MenuDetectEvent event) {
-				// no quick fix if we aren't in error state.
-				if (comboField.isValid()) {
-					return;
-				}
-				if (comboField.quickFixMenu == null) {
-					comboField.quickFixMenu = createQuickFixMenu(comboField);
-				}
-				comboField.quickFixMenu.setLocation(event.x, event.y);
-				comboField.quickFixMenu.setVisible(true);
-			}
-		});
-		dec.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent event) {
-				MessageDialog
-						.openInformation(
-								getShell(),
-								TaskAssistExampleMessages.ExampleDialog_DefaultSelectionTitle,
-								TaskAssistExampleMessages.ExampleDialog_DefaultSelectionMessage);
-			}
-
-			public void widgetSelected(SelectionEvent e) {
-				// Do nothing on selection
-			}
-		});
-
-		if (showRequiredFieldLabelIndicator) {
-			addRequiredFieldIndicator(label);
-		}
-		combo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent event) {
-				handleModify(comboField);
-			}
-		});
-
-		combo.setText(username);
-		combo.setItems(validUsers);
-		combo.setLayoutData(getFieldGridData());
-		installContentProposalAdapter(combo, new ComboContentAdapter());
-
-		// Create a spinner representing a user age
-		label = new Label(main, SWT.LEFT);
-		label.setText(TaskAssistExampleMessages.ExampleDialog_Age);
-
-		Spinner spinner = new Spinner(main, SWT.BORDER);
-		dec = new ControlDecoration(spinner, getDecorationLocationBits());
-		dec.setMarginWidth(marginWidth);
-
-		if (showRequiredFieldLabelIndicator) {
-			addRequiredFieldIndicator(label);
-		}
-		final SmartField spinnerField = new AgeField(dec, spinner,
-				new SpinnerContentAdapter());
-		spinner.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent event) {
-				handleModify(spinnerField);
-			}
-		});
-		spinner.setSelection(40);
-		spinner.setLayoutData(getFieldGridData());
-
-		// This field has no decorator
-		label = new Label(main, SWT.LEFT);
-		label.setText(TaskAssistExampleMessages.ExampleDialog_Password);
-		text = new Text(main, SWT.BORDER | SWT.PASSWORD);
-		text.setText("******"); //$NON-NLS-1$
-		text.setLayoutData(getFieldGridData());
-		if (showRequiredFieldLabelIndicator) {
-			addRequiredFieldIndicator(label);
-		}
-		
-		// This tests multi-line text popup placement
-		label = new Label(main, SWT.LEFT);
-		label.setText(TaskAssistExampleMessages.FieldAssistTestDialog_Comments);
-		text = new Text(main, SWT.BORDER | SWT.MULTI | SWT.WRAP);
-		text.setText(TaskAssistExampleMessages.FieldAssistTestDialog_CommentsDefaultContent); 
-		text.setLayoutData(getMultiLineTextFieldGridData());
-		if (showRequiredFieldLabelIndicator) {
-			addRequiredFieldIndicator(label);
-		}
-		installContentProposalAdapter(text, new TextContentAdapter());
-
-	}
-
-	Menu createQuickFixMenu(final SmartField field) {
-		Menu newMenu = new Menu(field.control);
-		MenuItem item = new MenuItem(newMenu, SWT.PUSH);
-		item
-				.setText(TaskAssistExampleMessages.ExampleDialog_DecorationMenuItem);
-		item.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent event) {
-				field.quickFix();
-			}
-
-			public void widgetDefaultSelected(SelectionEvent event) {
-
-			}
-		});
-		return newMenu;
-	}
-
-	void showErrorDecoration(SmartField smartField, boolean show) {
-		FieldDecoration dec = smartField.getErrorDecoration();
-		ControlDecoration cd = smartField.controlDecoration;
-		if (show) {
-			cd.setImage(dec.getImage());
-			cd.setDescriptionText(dec.getDescription());
-			cd.setShowOnlyOnFocus(false);
-			cd.show();
-		} else {
-			cd.hide();
-		}
-	}
-
-	void showWarningDecoration(SmartField smartField, boolean show) {
-		FieldDecoration dec = smartField.getWarningDecoration();
-		ControlDecoration cd = smartField.controlDecoration;
-		if (show) {
-			cd.setImage(dec.getImage());
-			cd.setDescriptionText(dec.getDescription());
-			cd.setShowOnlyOnFocus(false);
-			cd.show();
-		} else {
-			cd.hide();
-		}
-	}
-
-	void showRequiredFieldDecoration(SmartField smartField, boolean show) {
-		FieldDecoration dec = getRequiredFieldDecoration();
-		ControlDecoration cd = smartField.controlDecoration;
-		if (show) {
-			cd.setImage(dec.getImage());
-			cd.setDescriptionText(dec.getDescription());
-			cd.setShowOnlyOnFocus(false);
-			cd.show();
-		} else {
-			cd.hide();
-		}
-	}
-
-	void showContentAssistDecoration(SmartField smartField, boolean show) {
-		FieldDecoration dec = getCueDecoration();
-		ControlDecoration cd = smartField.controlDecoration;
-		if (show) {
-			cd.setImage(dec.getImage());
-			cd.setDescriptionText(dec.getDescription());
-			cd.setShowOnlyOnFocus(true);
-			cd.show();
-		} else {
-			cd.hide();
-		}
-	}
-
-	public boolean close() {
-		textField.dispose();
-		comboField.dispose();
-		return super.close();
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#isResizable()
-	 */
-	protected boolean isResizable() {
-		return true;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/TaskAssistExampleMessages.java b/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/TaskAssistExampleMessages.java
deleted file mode 100644
index 55c47d2..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/TaskAssistExampleMessages.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.fieldassist;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Message class for the undo example.
- * 
- */
-public class TaskAssistExampleMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ui.examples.fieldassist.messages";//$NON-NLS-1$
-
-	public static String Preferences_ContentAssistKey;
-	public static String Preferences_ContentAssistKeyPropagate;
-	public static String Preferences_ContentAssistResult;
-	public static String Preferences_ContentAssistResultReplace;
-	public static String Preferences_ContentAssistResultInsert;
-	public static String Preferences_ContentAssistResultNone;
-	public static String Preferences_ContentAssistFilter;
-	public static String Preferences_ContentAssistFilterCumulative;
-	public static String Preferences_ContentAssistFilterCharacter;
-	public static String Preferences_ContentAssistFilterNone;
-	public static String Preferences_ShowSecondaryPopup;
-	public static String Preferences_ContentAssistDelay;
-	public static String Preferences_ErrorIndicator;
-	public static String Preferences_ShowErrorMessage;
-	public static String Preferences_ShowErrorDecorator;
-	public static String Preferences_ShowWarningDecorator;
-	public static String Preferences_ShowProposalCue;
-	public static String Preferences_RequiredFieldIndicator;
-	public static String Preferences_ShowRequiredFieldDecorator;
-	public static String Preferences_ShowRequiredFieldLabelIndicator;
-	public static String Preferences_Description;
-	public static String Preferences_ContentAssistDescription;
-	public static String Preferences_DecoratorDetails;
-	public static String Preferences_DecoratorImpl;
-	public static String Preferences_DecoratorVert;
-	public static String Preferences_DecoratorTop;
-	public static String Preferences_DecoratorCenter;
-	public static String Preferences_DecoratorBottom;
-	public static String Preferences_DecoratorHorz;
-	public static String Preferences_DecoratorLeft;
-	public static String Preferences_DecoratorRight;
-	public static String Preferences_DecoratorMargin;
-	public static String Decorator_Warning;
-	public static String Decorator_Error;
-	public static String Decorator_ContentAssist;
-
-	public static String ExampleDialog_UserError;
-	public static String ExampleDialog_WarningName;
-	public static String ExampleDialog_UserWarning;
-	public static String ExampleDialog_AgeWarning;
-	public static String ExampleDialog_Title;
-	public static String ExampleDialog_SecurityGroup;
-	public static String ExampleDialog_AutoCompleteGroup;
-	public static String ExampleDialog_UserName;
-	public static String ExampleDialog_ComboUserName;
-	public static String ExampleDialog_Age;
-	public static String ExampleDialog_Password;
-	public static String ExampleDialog_ProposalDescription;
-	public static String ExampleDialog_DefaultSelectionTitle;
-	public static String ExampleDialog_DefaultSelectionMessage;
-	public static String ExampleDialog_SelectionTitle;
-	public static String ExampleDialog_SelectionMessage;
-
-	public static String FieldAssistTestDialog_Comments;
-
-	public static String FieldAssistTestDialog_CommentsDefaultContent;
-	public static String ExampleDialog_DecorationMenuItem;
-
-	static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, TaskAssistExampleMessages.class);
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/actions/TestDialogAction.java b/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/actions/TestDialogAction.java
deleted file mode 100644
index f07fc86..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/actions/TestDialogAction.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.fieldassist.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.examples.fieldassist.FieldAssistTestDialog;
-
-/**
- * Our sample action implements workbench action delegate. The action proxy will
- * be created by the workbench and shown in the UI. When the user tries to use
- * the action, this delegate will be created and execution will be delegated to
- * it.
- * 
- * @see IWorkbenchWindowActionDelegate
- */
-public class TestDialogAction implements IWorkbenchWindowActionDelegate {
-	private IWorkbenchWindow window;
-
-	/**
-	 * The constructor.
-	 */
-	public TestDialogAction() {
-	}
-
-	/**
-	 * The action has been activated. The argument of the method represents the
-	 * 'real' action sitting in the workbench UI.
-	 * 
-	 * @see IWorkbenchWindowActionDelegate#run
-	 */
-	public void run(IAction action) {
-		new FieldAssistTestDialog(window.getShell(), "tom").open();
-	}
-
-	/**
-	 * Selection in the workbench has been changed. We can change the state of
-	 * the 'real' action here if we want, but this can only happen after the
-	 * delegate has been created.
-	 * 
-	 * @see IWorkbenchWindowActionDelegate#selectionChanged
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-	}
-
-	/**
-	 * We can use this method to dispose of any system resources we previously
-	 * allocated.
-	 * 
-	 * @see IWorkbenchWindowActionDelegate#dispose
-	 */
-	public void dispose() {
-	}
-
-	/**
-	 * We will cache window object in order to be able to provide parent shell
-	 * for the dialog.
-	 * 
-	 * @see IWorkbenchWindowActionDelegate#init
-	 */
-	public void init(IWorkbenchWindow window) {
-		this.window = window;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/messages.properties b/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/messages.properties
deleted file mode 100644
index 5dece35..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/messages.properties
+++ /dev/null
@@ -1,67 +0,0 @@
-###############################################################################
-# Copyright (c) 2006, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-#     Sebastian Davids <sdavids@gmx.de> - bug 132479 - [FieldAssist] Field assist example improvements
-###############################################################################
-
-########### Preferences ###########################
-Preferences_RequiredFieldIndicator = Showing Required Fields:
-Preferences_ShowRequiredFieldLabelIndicator = Show required field indicator in field's label
-Preferences_ShowRequiredFieldDecorator = Decorate required fields
-Preferences_ContentAssistKey = Content Assist Key:
-Preferences_ContentAssistKeyPropagate = Propagate keystrokes to control when popup is active
-Preferences_ShowProposalCue = Decorate fields that have content assist
-Preferences_ShowSecondaryPopup = Show a secondary popup further describing the proposal
-Preferences_ContentAssistDelay = Delay (in milliseconds) when content assist is auto-activated:
-Preferences_ErrorIndicator = Showing Errors:
-Preferences_ShowErrorMessage = Show errors in status area of dialog
-Preferences_ShowErrorDecorator = Decorate fields that have errors
-Preferences_ShowWarningDecorator = Decorate fields that have warnings
-Preferences_Description = This page controls the decorations used in the example dialog.
-Preferences_DecoratorDetails = Other Decorators:
-Preferences_DecoratorImpl = Decorator implementation class:
-Preferences_DecoratorVert = Vertical location:
-Preferences_DecoratorTop = SWT.TOP
-Preferences_DecoratorCenter = SWT.CENTER
-Preferences_DecoratorBottom = SWT.BOTTOM
-Preferences_DecoratorHorz = Horizontal location:
-Preferences_DecoratorLeft = SWT.LEFT
-Preferences_DecoratorRight = SWT.RIGHT
-Preferences_DecoratorMargin = Margin width:
-Preferences_ContentAssistDescription = This page controls the behavior of the content assist.
-Preferences_ContentAssistResult = When a content proposal is chosen:
-Preferences_ContentAssistResultReplace = Replace field content
-Preferences_ContentAssistResultInsert = Insert into field content
-Preferences_ContentAssistResultNone = Custom behavior (none)
-Preferences_ContentAssistFilter = When typing while popup is open:
-Preferences_ContentAssistFilterCumulative = Filter popup content with cumulative typing (deprecated)
-Preferences_ContentAssistFilterCharacter = Filter popup according to last character typed
-Preferences_ContentAssistFilterNone = No filtering
-Decorator_Warning = User name bob is too casual
-Decorator_Error = User name can only contain letters
-Decorator_ContentAssist = Content assist available for this field, press {0}
-ExampleDialog_UserError=User name must only contain letters.  Use QuickFix Menu.
-ExampleDialog_WarningName=bob
-ExampleDialog_UserWarning=Bob is entirely too casual a name.
-ExampleDialog_AgeWarning=May be eligible for senior citizen user status
-ExampleDialog_Title=Field Assist Example
-ExampleDialog_SecurityGroup=&Security info
-ExampleDialog_AutoCompleteGroup=&Autocomplete examples
-ExampleDialog_UserName=&User name:
-ExampleDialog_ComboUserName=&Combo user name:
-ExampleDialog_Age=&Age:
-ExampleDialog_Password=&Password:
-ExampleDialog_ProposalDescription={0} is a wonderful choice and you should seriously consider it.
-ExampleDialog_DefaultSelectionTitle=Default Selection
-ExampleDialog_DefaultSelectionMessage=The decoration was double clicked.
-ExampleDialog_SelectionTitle=Selection
-ExampleDialog_SelectionMessage=The decoration was selected.
-FieldAssistTestDialog_Comments=Comments:
-FieldAssistTestDialog_CommentsDefaultContent=This field is here simply to demonstrate multi-line text and popup placement.  Try invoking content proposals in autoactivate and regular mode (insert and replace) and make sure the popup comes up where you think it should.
-ExampleDialog_DecorationMenuItem=Remove illegal characters
diff --git a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/preferences/ContentAssistPreferencePage.java b/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/preferences/ContentAssistPreferencePage.java
deleted file mode 100644
index f7b9b89..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/preferences/ContentAssistPreferencePage.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.fieldassist.preferences;
-
-import org.eclipse.jface.preference.*;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.examples.fieldassist.FieldAssistPlugin;
-import org.eclipse.ui.examples.fieldassist.TaskAssistExampleMessages;
-
-/**
- * This class represents a preference page that is contributed to the
- * Preferences dialog. By subclassing <samp>FieldEditorPreferencePage</samp>,
- * we can use the field support built into JFace that allows us to create a page
- * that is small and knows how to save, restore and apply itself.
- * <p>
- * This page is used to modify preferences only. They are stored in the
- * preference store that belongs to the main plug-in class. That way,
- * preferences can be accessed directly via the preference store.
- */
-
-public class ContentAssistPreferencePage extends FieldEditorPreferencePage
-		implements IWorkbenchPreferencePage {
-
-	/**
-	 *  Create a ContentAssistPreferencePage
-	 */
-	public ContentAssistPreferencePage() {
-		super(GRID);
-		setPreferenceStore(FieldAssistPlugin.getDefault().getPreferenceStore());
-		setDescription(TaskAssistExampleMessages.Preferences_ContentAssistDescription);
-	}
-
-	/**
-	 * Creates the field editors. Field editors are abstractions of the common
-	 * GUI blocks needed to manipulate various types of preferences. Each field
-	 * editor knows how to save and
-	 */
-	public void createFieldEditors() {
-		addField(new RadioGroupFieldEditor(
-				PreferenceConstants.PREF_CONTENTASSISTKEY,
-				TaskAssistExampleMessages.Preferences_ContentAssistKey,
-				1,
-				new String[][] {
-						{ PreferenceConstants.PREF_CONTENTASSISTKEY1,
-								PreferenceConstants.PREF_CONTENTASSISTKEY1 },
-						{ PreferenceConstants.PREF_CONTENTASSISTKEY2,
-								PreferenceConstants.PREF_CONTENTASSISTKEY2 },
-						{ PreferenceConstants.PREF_CONTENTASSISTKEYAUTO,
-								PreferenceConstants.PREF_CONTENTASSISTKEYAUTO },
-						{ PreferenceConstants.PREF_CONTENTASSISTKEYAUTOSUBSET,
-								PreferenceConstants.PREF_CONTENTASSISTKEYAUTOSUBSET }, },
-				getFieldEditorParent()));
-		
-		IntegerFieldEditor editor = new IntegerFieldEditor(
-				PreferenceConstants.PREF_CONTENTASSISTDELAY,
-				TaskAssistExampleMessages.Preferences_ContentAssistDelay,
-				getFieldEditorParent());
-		editor.setValidRange(0, 10000);
-		addField(editor);
-
-		addField(new BooleanFieldEditor(
-				PreferenceConstants.PREF_CONTENTASSISTKEY_PROPAGATE,
-				TaskAssistExampleMessages.Preferences_ContentAssistKeyPropagate,
-				getFieldEditorParent()));
-
-		addField(new BooleanFieldEditor(
-				PreferenceConstants.PREF_SHOWSECONDARYPOPUP,
-				TaskAssistExampleMessages.Preferences_ShowSecondaryPopup,
-				getFieldEditorParent()));
-
-		addField(new RadioGroupFieldEditor(
-				PreferenceConstants.PREF_CONTENTASSISTRESULT,
-				TaskAssistExampleMessages.Preferences_ContentAssistResult,
-				1,
-				new String[][] {
-						{
-								TaskAssistExampleMessages.Preferences_ContentAssistResultReplace,
-								PreferenceConstants.PREF_CONTENTASSISTRESULT_REPLACE },
-						{
-								TaskAssistExampleMessages.Preferences_ContentAssistResultInsert,
-								PreferenceConstants.PREF_CONTENTASSISTRESULT_INSERT },
-						{
-								TaskAssistExampleMessages.Preferences_ContentAssistResultNone,
-								PreferenceConstants.PREF_CONTENTASSISTRESULT_NONE } },
-				getFieldEditorParent()));
-		
-		addField(new RadioGroupFieldEditor(
-				PreferenceConstants.PREF_CONTENTASSISTFILTER,
-				TaskAssistExampleMessages.Preferences_ContentAssistFilter,
-				1,
-				new String[][] {
-						{
-								TaskAssistExampleMessages.Preferences_ContentAssistFilterCharacter,
-								PreferenceConstants.PREF_CONTENTASSISTFILTER_CHAR },
-						{
-								TaskAssistExampleMessages.Preferences_ContentAssistFilterCumulative,
-								PreferenceConstants.PREF_CONTENTASSISTFILTER_CUMULATIVE },
-						{
-								TaskAssistExampleMessages.Preferences_ContentAssistFilterNone,
-								PreferenceConstants.PREF_CONTENTASSISTFILTER_NONE } },
-				getFieldEditorParent()));
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-	}
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/preferences/FieldAssistPreferencePage.java b/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/preferences/FieldAssistPreferencePage.java
deleted file mode 100644
index 4d4071e..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/preferences/FieldAssistPreferencePage.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - bug 132479 - [FieldAssist] Field assist example improvements
- *******************************************************************************/
-package org.eclipse.ui.examples.fieldassist.preferences;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.preference.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.examples.fieldassist.FieldAssistPlugin;
-import org.eclipse.ui.examples.fieldassist.TaskAssistExampleMessages;
-
-/**
- * This class represents a preference page that is contributed to the
- * Preferences dialog. By subclassing <samp>FieldEditorPreferencePage</samp>,
- * we can use the field support built into JFace that allows us to create a page
- * that is small and knows how to save, restore and apply itself.
- * <p>
- * This page is used to modify preferences only. They are stored in the
- * preference store that belongs to the main plug-in class. That way,
- * preferences can be accessed directly via the preference store.
- */
-
-public class FieldAssistPreferencePage extends FieldEditorPreferencePage
-		implements IWorkbenchPreferencePage {
-
-	/**
-	 * Create the FieldAssistPreferencePage
-	 */
-	public FieldAssistPreferencePage() {
-		super(GRID);
-		setPreferenceStore(FieldAssistPlugin.getDefault().getPreferenceStore());
-		setDescription(TaskAssistExampleMessages.Preferences_Description);
-	}
-
-	/**
-	 * Creates the field editors. Field editors are abstractions of the common
-	 * GUI blocks needed to manipulate various types of preferences. Each field
-	 * editor knows how to save and
-	 */
-	public void createFieldEditors() {
-		addField(new RadioGroupFieldEditor(
-				PreferenceConstants.PREF_DECORATOR_VERTICALLOCATION,
-				TaskAssistExampleMessages.Preferences_DecoratorVert,
-				1,
-				new String[][] {
-						{
-								TaskAssistExampleMessages.Preferences_DecoratorTop,
-								PreferenceConstants.PREF_DECORATOR_VERTICALLOCATION_TOP },
-						{
-								TaskAssistExampleMessages.Preferences_DecoratorCenter,
-								PreferenceConstants.PREF_DECORATOR_VERTICALLOCATION_CENTER },
-						{
-								TaskAssistExampleMessages.Preferences_DecoratorBottom,
-								PreferenceConstants.PREF_DECORATOR_VERTICALLOCATION_BOTTOM } },
-				getFieldEditorParent()));
-
-		addField(new RadioGroupFieldEditor(
-				PreferenceConstants.PREF_DECORATOR_HORIZONTALLOCATION,
-				TaskAssistExampleMessages.Preferences_DecoratorHorz,
-				1,
-				new String[][] {
-						{
-								TaskAssistExampleMessages.Preferences_DecoratorLeft,
-								PreferenceConstants.PREF_DECORATOR_HORIZONTALLOCATION_LEFT },
-						{
-								TaskAssistExampleMessages.Preferences_DecoratorRight,
-								PreferenceConstants.PREF_DECORATOR_HORIZONTALLOCATION_RIGHT } },
-				getFieldEditorParent()));
-
-		IntegerFieldEditor editor = new IntegerFieldEditor(
-				PreferenceConstants.PREF_DECORATOR_MARGINWIDTH,
-				TaskAssistExampleMessages.Preferences_DecoratorMargin,
-				getFieldEditorParent());
-		editor.setValidRange(0, 10);
-		addField(editor);
-
-		Label label = new Label(getFieldEditorParent(), SWT.WRAP);
-		label.setText(TaskAssistExampleMessages.Preferences_ErrorIndicator);
-		addField(new BooleanFieldEditor(
-				PreferenceConstants.PREF_SHOWERRORMESSAGE,
-				TaskAssistExampleMessages.Preferences_ShowErrorMessage,
-				getFieldEditorParent()));
-
-		addField(new BooleanFieldEditor(
-				PreferenceConstants.PREF_SHOWERRORDECORATION,
-				TaskAssistExampleMessages.Preferences_ShowErrorDecorator,
-				getFieldEditorParent()));
-
-		label = new Label(getFieldEditorParent(), SWT.WRAP);
-		label
-				.setText(TaskAssistExampleMessages.Preferences_RequiredFieldIndicator);
-		addField(new BooleanFieldEditor(
-				PreferenceConstants.PREF_SHOWREQUIREDFIELDLABELINDICATOR,
-				TaskAssistExampleMessages.Preferences_ShowRequiredFieldLabelIndicator,
-				getFieldEditorParent()));
-
-		addField(new BooleanFieldEditor(
-				PreferenceConstants.PREF_SHOWREQUIREDFIELDDECORATION,
-				TaskAssistExampleMessages.Preferences_ShowRequiredFieldDecorator,
-				getFieldEditorParent()));
-
-		label = new Label(getFieldEditorParent(), SWT.WRAP);
-		label.setText(TaskAssistExampleMessages.Preferences_DecoratorDetails);
-		addField(new BooleanFieldEditor(
-				PreferenceConstants.PREF_SHOWWARNINGDECORATION,
-				TaskAssistExampleMessages.Preferences_ShowWarningDecorator,
-				getFieldEditorParent()));
-		addField(new BooleanFieldEditor(
-				PreferenceConstants.PREF_SHOWCONTENTPROPOSALCUE,
-				TaskAssistExampleMessages.Preferences_ShowProposalCue,
-				getFieldEditorParent()));
-
-		Dialog.applyDialogFont(getFieldEditorParent());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/preferences/PreferenceConstants.java b/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/preferences/PreferenceConstants.java
deleted file mode 100644
index 4d7bf21..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/preferences/PreferenceConstants.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Sebastian Davids <sdavids@gmx.de> - bug 132479 - [FieldAssist] Field assist example improvements
- *******************************************************************************/
-package org.eclipse.ui.examples.fieldassist.preferences;
-
-/**
- * Constant definitions for plug-in preferences
- */
-public class PreferenceConstants {	
-	public static final String PREF_DECORATOR_VERTICALLOCATION = "prefDecoratorVerticalLocation";
-	public static final String PREF_DECORATOR_VERTICALLOCATION_TOP = "prefDecoratorVerticalTop";
-	public static final String PREF_DECORATOR_VERTICALLOCATION_CENTER = "prefDecoratorVerticalCenter";
-	public static final String PREF_DECORATOR_VERTICALLOCATION_BOTTOM = "prefDecoratorVerticalBottom";
-	public static final String PREF_DECORATOR_HORIZONTALLOCATION = "prefDecoratorHorizontalLocation";
-	public static final String PREF_DECORATOR_HORIZONTALLOCATION_LEFT = "prefDecoratorHorizontalLeft";
-	public static final String PREF_DECORATOR_HORIZONTALLOCATION_RIGHT = "prefDecoratorHorizontalRight";
-	
-	public static final String PREF_DECORATOR_MARGINWIDTH = "prefDecoratorMarginWidth";
-
-	public static final String PREF_SHOWERRORDECORATION = "prefShowErrorDecoration";
-	public static final String PREF_SHOWERRORMESSAGE = "prefShowErrorMessage";
-	
-	public static final String PREF_SHOWWARNINGDECORATION = "prefShowWarningDecoration";
-	
-	public static final String PREF_SHOWREQUIREDFIELDDECORATION = "prefShowRequiredFieldDecoration";
-	public static final String PREF_SHOWREQUIREDFIELDLABELINDICATOR = "prefShowRequiredFieldLabelIndicator";	
-	
-	public static final String PREF_SHOWCONTENTPROPOSALCUE = "prefShowContentProposalCue";	
-
-	public static final String PREF_SHOWSECONDARYPOPUP = "prefShowSecondaryPopup";
-	public static final String PREF_CONTENTASSISTKEY_PROPAGATE = "prefContentAssistKeyPropagate";
-	public static final String PREF_CONTENTASSISTDELAY = "prefContentAssistDelay";
-
-	public static final String PREF_CONTENTASSISTKEY = "prefContentAssistKey";
-	public static final String PREF_CONTENTASSISTKEY1 = "Ctrl+Space";
-	public static final String PREF_CONTENTASSISTKEY2 = "*";
-	public static final String PREF_CONTENTASSISTKEYAUTO = "Alphanumeric key (on auto-activate delay)";
-	public static final String PREF_CONTENTASSISTKEYAUTOSUBSET = "t, d (on auto-activate delay)";
-	
-	public static final String PREF_CONTENTASSISTRESULT = "prefContentResult";
-	public static final String PREF_CONTENTASSISTRESULT_REPLACE = "replace";
-	public static final String PREF_CONTENTASSISTRESULT_INSERT = "insert";
-	public static final String PREF_CONTENTASSISTRESULT_NONE = "none";
-	
-	public static final String PREF_CONTENTASSISTFILTER = "prefContentAssistFilter";
-	public static final String PREF_CONTENTASSISTFILTER_CUMULATIVE = "cumulative filter";
-	public static final String PREF_CONTENTASSISTFILTER_CHAR = "character filter";
-	public static final String PREF_CONTENTASSISTFILTER_NONE = "none";
-}
diff --git a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/preferences/PreferenceInitializer.java b/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/preferences/PreferenceInitializer.java
deleted file mode 100644
index e4c3c13..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/Eclipse UI Examples Field Assist/org/eclipse/ui/examples/fieldassist/preferences/PreferenceInitializer.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.fieldassist.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import org.eclipse.ui.examples.fieldassist.FieldAssistPlugin;
-
-/**
- * Class used to initialize default preference values.
- */
-public class PreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-		IPreferenceStore store = FieldAssistPlugin.getDefault()
-				.getPreferenceStore();
-		store.setDefault(PreferenceConstants.PREF_SHOWERRORDECORATION, true);
-		store.setDefault(PreferenceConstants.PREF_SHOWERRORMESSAGE, true);
-		store.setDefault(PreferenceConstants.PREF_SHOWWARNINGDECORATION, true);
-		store.setDefault(PreferenceConstants.PREF_SHOWREQUIREDFIELDDECORATION,
-				false);
-		store.setDefault(
-				PreferenceConstants.PREF_SHOWREQUIREDFIELDLABELINDICATOR, true);
-		store.setDefault(PreferenceConstants.PREF_SHOWCONTENTPROPOSALCUE, true);
-		store.setDefault(PreferenceConstants.PREF_DECORATOR_HORIZONTALLOCATION,
-				PreferenceConstants.PREF_DECORATOR_HORIZONTALLOCATION_LEFT);
-		store.setDefault(PreferenceConstants.PREF_DECORATOR_VERTICALLOCATION,
-				PreferenceConstants.PREF_DECORATOR_VERTICALLOCATION_CENTER);
-		store.setDefault(PreferenceConstants.PREF_DECORATOR_MARGINWIDTH, 0);
-		store.setDefault(PreferenceConstants.PREF_CONTENTASSISTKEY,
-				PreferenceConstants.PREF_CONTENTASSISTKEY1);
-		store.setDefault(PreferenceConstants.PREF_CONTENTASSISTKEY_PROPAGATE,
-				false);
-		store.setDefault(PreferenceConstants.PREF_SHOWSECONDARYPOPUP, true);
-		store.setDefault(PreferenceConstants.PREF_CONTENTASSISTDELAY, 1000);
-		store.setDefault(PreferenceConstants.PREF_CONTENTASSISTRESULT,
-				PreferenceConstants.PREF_CONTENTASSISTRESULT_REPLACE);
-		store.setDefault(PreferenceConstants.PREF_CONTENTASSISTFILTER,
-				PreferenceConstants.PREF_CONTENTASSISTFILTER_CHAR);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.fieldassist/META-INF/MANIFEST.MF b/examples/org.eclipse.ui.examples.fieldassist/META-INF/MANIFEST.MF
deleted file mode 100644
index de8dca4..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,10 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui.examples.fieldassist; singleton:=true
-Bundle-Version: 1.1.0
-Bundle-Activator: org.eclipse.ui.examples.fieldassist.FieldAssistPlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime
-Bundle-ActivationPolicy: lazy
diff --git a/examples/org.eclipse.ui.examples.fieldassist/about.html b/examples/org.eclipse.ui.examples.fieldassist/about.html
deleted file mode 100644
index 4602330..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.fieldassist/build.properties b/examples/org.eclipse.ui.examples.fieldassist/build.properties
deleted file mode 100644
index 0cf35a9..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = Eclipse UI Examples Field Assist/
-
-bin.includes = doc-html/,\
-               icons/,\
-               about.html,\
-               plugin.properties,\
-               plugin.xml,\
-               .,\
-               META-INF/
-
-src.includes = about.html
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.fieldassist/doc-html/hglegal.htm b/examples/org.eclipse.ui.examples.fieldassist/doc-html/hglegal.htm
deleted file mode 100644
index a41081e..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/doc-html/hglegal.htm
+++ /dev/null
@@ -1,15 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
-   <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/examples/org.eclipse.ui.examples.fieldassist/doc-html/ui_fieldassist_ex.html b/examples/org.eclipse.ui.examples.fieldassist/doc-html/ui_fieldassist_ex.html
deleted file mode 100644
index d437456..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/doc-html/ui_fieldassist_ex.html
+++ /dev/null
@@ -1,106 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0//en">
-<html>
-<head>
-<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2006. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>Workbench - Field Assist Example</title>
-</head>
-<body>
-
-<h2>
-<b>Example - Field Assist</b></h2>
-
-<h3>
-Introduction</h3>
-The Field Assist example shows how to use the support provided in <code>org.eclipse.jface.fieldassist</code>
-to provide task assistance in text fields.  An example dialog shows how to set up field decorations
-to indicate required fields, fields with errors and warnings, and fields that supply content assist or quick
-fix.  The 
-example also includes a preference page that 
-allows you to configure the decorations and the content assist support.
-<h3>
-Running the example</h3>
-When the plug-in is installed, you should see a FieldAssist action
-on the action bar.  Choose the menu item "Open Field Assist Dialog..."
-This will launch the field assist dialog.  The dialog can be configured
-using the example preferences.  
-<h4>
-Setting Field Assist Preferences</h4>
-<p>
-Two preference pages are provided for setting up the way the dialog
-behaves.  The <b>Field Assist Example Preferences</b> page allows you
-to configure how the dialog annotates fields with errors and warnings,
-required fields, and content assist.  A combination of decorations 
-can be used to annotate the fields.  This preference
-page is intended to show what is possible when configuring decorations.
-It is geared more toward the programmer trying out field assist, and
-is not intended to be an example of a good preference page for letting
-end users control the annotations.
-</p>
-<p>The <b>Content Assist
-Preferences</b> page allows you to configure how the content assist is 
-installed on the dialog text field.  Most of the options provided in the
-field assist API (ContentProposalAdapter) are configurable on this page.
-Note that it is possible to configure the content assist for an undesirable
-user experience.  For example, setting content assist to auto-activate on all
-characters using a long delay is not desirable.  It can be confusing
-to use cumulative proposal filtering when the filter keys are not propagated
-back to the control.  The purpose of exposing the API in the preference page is
-to allow the field assist programmer to try all possible combinations.
-It is not expected that any of these preferences would ever be exposed to
-an end user, but rather that the developer chooses the best combination of
-these values to provide a certain style of content assist.
-</p>
-<h4>Using the dialog</h4>
-<p>
-The example dialog shows several different ways to configure
-decorations and content proposal behavior in the first
-dialog group (Security group):
-<ul>
-<li> The <b>User name</b> field is configured as a required field with content
-assist.  This field is considered in error when a non-alphabetic character
-is typed in the field.  A quick fix menu is installed on the error decoration
-that allows the user to strip non-alphabetic characters.  The field is
-considered in a warning mode when the name "bob"
-is typed in the field.  This field also installs a default select (double-click) listener on
-the decoration to demonstrate the decoration listener interface.</li>
-<li>The <b>Combo user name</b> field is configured similarly, but uses a combo box 
-instead of a text field, and installs a selection (single click) listener on
-the decoration rather than a default select listener.</li>
-<li>The <b>Age</b> field demonstrates the use of a Spinner widget with decorations.
-It is configured as a required field, but does not provide an error state.  It
-is considered in a warning mode when an age greater than 65 is set.</li>
-<li>The <b>Password</b> field does not use any decorations or content assist.
-It is merely provided to demonstrate that non-decorated fields can be easily aligned
-with decorated fields.</li>
-</ul>
-</p>
-<p>
-The second dialog group shows how to use the AutoCompleteField to
-get automatic field completion without using a content assist key or
-decorator.
-</p>
-<h4>Example source code</h4>
-<p>
-The example dialog is not very complex, but is intended to demonstrate how to
-program field assist.  Some notes about the source code follow:
-<ul>
-<li>When using ControlDecoration, the layout code must ensure that there is
-enough margin space around the decoration to render the decoration.
-<li>The example plug-in registers standard field decorators for indicating
-the availability of content assist, marking a field as required, or marking
-a field that has an error with quick fix or warning.  In cases where a standard decorator
-description is used in all fields, the actual decorations from the registry are
-used.  In cases where the field provides a unique description of an error or warning, 
-a unique decoration containing the text is managed by the field. </li>
-<li>SmartField and its subclasses are used to provide field-specific 
-validation, error and warning messages, content retrieval, and optional quick fix for
-the different fields in the dialog.  We expect that applications provide
-similar frameworks (such as data binding) to achieve this goal.  SmartField
-is intended to show a simple technique for validating different fields inside
-a dialog.  It is not considered a robust example of a semantic field definition
-framework.</li>
-</ul>
-</p>
-</body>
-</html>
diff --git a/examples/org.eclipse.ui.examples.fieldassist/icons/sample.gif b/examples/org.eclipse.ui.examples.fieldassist/icons/sample.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/icons/sample.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.fieldassist/plugin.properties b/examples/org.eclipse.ui.examples.fieldassist/plugin.properties
deleted file mode 100644
index dad4c04..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/plugin.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Plugin.name = Field Assist Example
-Plugin.providerName = Eclipse.org
-MainPreferences.Name = Field Assist Example Preferences
-ContentAssistPreferences.Name = Content Assist Preferences
-Actions.ActionSetName = Field Assist Example Action Set
-Actions.ExampleMenu = Fiel&d Assist 
-Actions.TestDialogName = &Field Assist Test Dialog...
-Actions.TestDialogTooltip = Open a dialog that tests the field assist API
diff --git a/examples/org.eclipse.ui.examples.fieldassist/plugin.xml b/examples/org.eclipse.ui.examples.fieldassist/plugin.xml
deleted file mode 100644
index 1e0aa76..0000000
--- a/examples/org.eclipse.ui.examples.fieldassist/plugin.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            label="%Actions.ActionSetName"
-            visible="true"
-            id="org.eclipse.ui.examples.fieldassist.actionSet">
-         <menu
-               label="%Actions.ExampleMenu"
-               id="exampleMenu">
-            <separator
-                  name="exampleGroup">
-            </separator>
-         </menu>
-         <action
-               label="%Actions.TestDialogName"
-               icon="icons/sample.gif"
-               class="org.eclipse.ui.examples.fieldassist.actions.TestDialogAction"
-               tooltip="%Actions.TestDialogTooltip"
-               menubarPath="exampleMenu/exampleGroup"
-               toolbarPath="exampleGroup"
-               id="org.eclipse.ui.examples.fieldassist.actions.ExampleAction">
-         </action>
-      </actionSet>
-   </extension>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            name="%MainPreferences.Name"
-            class="org.eclipse.ui.examples.fieldassist.preferences.FieldAssistPreferencePage"
-            id="org.eclipse.ui.examples.fieldassist.preferences.FieldAssistPreferencePage">
-      </page>
-     <page
-            name="%ContentAssistPreferences.Name"
-            class="org.eclipse.ui.examples.fieldassist.preferences.ContentAssistPreferencePage"
-            category="org.eclipse.ui.examples.fieldassist.preferences.FieldAssistPreferencePage"
-            id="org.eclipse.ui.examples.fieldassist.preferences.ContentAssistPreferencePage">
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.eclipse.ui.examples.fieldassist.preferences.PreferenceInitializer">
-      </initializer>
-   </extension>
-
-</plugin>
diff --git a/examples/org.eclipse.ui.examples.job/.classpath b/examples/org.eclipse.ui.examples.job/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/examples/org.eclipse.ui.examples.job/.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/examples/org.eclipse.ui.examples.job/.cvsignore b/examples/org.eclipse.ui.examples.job/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/examples/org.eclipse.ui.examples.job/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/examples/org.eclipse.ui.examples.job/.project b/examples/org.eclipse.ui.examples.job/.project
deleted file mode 100644
index bf9091f..0000000
--- a/examples/org.eclipse.ui.examples.job/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.examples.job</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/examples/org.eclipse.ui.examples.job/META-INF/MANIFEST.MF b/examples/org.eclipse.ui.examples.job/META-INF/MANIFEST.MF
deleted file mode 100644
index 108ff21..0000000
--- a/examples/org.eclipse.ui.examples.job/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Progress Examples Plug-in
-Bundle-SymbolicName: org.eclipse.ui.examples.job; singleton:=true
-Bundle-Version: 3.0.0
-Bundle-ClassPath: ProgressExamples.jar
-Bundle-Activator: org.eclipse.ui.examples.jobs.ProgressExamplesPlugin
-Bundle-Vendor: Eclipse.org
-Bundle-Localization: plugin
-Export-Package: org.eclipse.ui.examples.jobs,
- org.eclipse.ui.examples.jobs.actions,
- org.eclipse.ui.examples.jobs.views
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.ui.ide,
- org.eclipse.jface.text,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.ui.editors
-Eclipse-AutoStart: true
diff --git a/examples/org.eclipse.ui.examples.job/README.TXT b/examples/org.eclipse.ui.examples.job/README.TXT
deleted file mode 100644
index b835369..0000000
--- a/examples/org.eclipse.ui.examples.job/README.TXT
+++ /dev/null
@@ -1,38 +0,0 @@
-This examples plug-in demonstrates the following features:
-
-1. deferred tree/table population
-    - serialized children fetch jobs or concurrent
-    - batching updates to the collector
-    - (optional) different ways of showing progress replacing current pending node (e.g. changing parent's label / image)
-    
-2. progress view
-    - cancellation
-    - showing progress, sub tasks
-    - showing errors
-    - progress groups
-    - appearing/disapearing as floating window
-    - system jobs aren't shown
-    
-3. requestInUI
-    - post a request
-    - post a request then cancel before user has launched it
-    - post a request, cancel, and replace with another
-    - post a request and allow the user to cancel without running the request
-    
-4. blocked foreground operation
-    - run a background job that locks the workspace
-    - run a foreground job that requires workspace (expect blocked dialog with progress view embeded)
-    - open an editor and type then save (progress dialog should show blocked)
-    
-5. workbench part support for progress
-    - run a job in the context of a view/editor
-    - get busy cursor plus animating something
-    - view or editor adding their own custom behavior when job is run
-    
-6. Creating progress groups
-    - that are run serialized
-    - that are run concurrently
-    - cancel one sub job
-    - parent is updated correctly
-    
-7. running action via busyCursorWhile
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.job/about.html b/examples/org.eclipse.ui.examples.job/about.html
deleted file mode 100644
index 4602330..0000000
--- a/examples/org.eclipse.ui.examples.job/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.job/build.properties b/examples/org.eclipse.ui.examples.job/build.properties
deleted file mode 100644
index 384a829..0000000
--- a/examples/org.eclipse.ui.examples.job/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.ProgressExamples.jar = src/
-bin.includes = plugin.xml,\
-               icons/,\
-               *.jar,\
-               ProgressExamples.jar,\
-               META-INF/
diff --git a/examples/org.eclipse.ui.examples.job/doc/Responsive UIs.ppt b/examples/org.eclipse.ui.examples.job/doc/Responsive UIs.ppt
deleted file mode 100644
index 6d52538..0000000
--- a/examples/org.eclipse.ui.examples.job/doc/Responsive UIs.ppt
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.job/doc/eclipse-con-talk_2.doc b/examples/org.eclipse.ui.examples.job/doc/eclipse-con-talk_2.doc
deleted file mode 100644
index 235f922..0000000
--- a/examples/org.eclipse.ui.examples.job/doc/eclipse-con-talk_2.doc
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.job/doc/responsive_ui.html b/examples/org.eclipse.ui.examples.job/doc/responsive_ui.html
deleted file mode 100644
index d1060f4..0000000
--- a/examples/org.eclipse.ui.examples.job/doc/responsive_ui.html
+++ /dev/null
@@ -1,321 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-  <title></title>
-</head>
- <body>
- 
-<h1>Towards a more responsive Eclipse UI</h1>
- 
-<font size="-1">Last modified: June 2, 2003</font> 
-<p>Eclipse is well known as a powerful integrated development environment,
-but it is perceived by users as sometimes being unwieldy or unresponsive
-to work with. The goal of this work is to uncover the underlying causes of
-the unresponsiveness and provide Eclipse developers with the tools they need
-to focus on making their code responsive.  </p>
- 
-<p>To begin with, it is important to note that, responsiveness is not the
-same as performance, and to some extent they are contradictory:</p>
- 
-<p>The <i>performance</i> of an application is a measure of how much work
-it can do in a given length of time. For example, the Eclipse Platform can
-operate on thousands of files per minute on a typical desktop system. One
-way to achieve high performance is to ensure that all available resources 
-are dedicated to each task until it is complete. Since most modern window
-systems require applications to regularly call system code to keep their
-user interfaces active, dedicating all processing resources to a non-user-interface
-task will cause the user interface to become unresponsive.</p>
- 
-<p>The <i>responsiveness</i> of an application is a measure of how often
-its user interface is in a state where the user can interact with it, how
-often those interactions can trigger new tasks being initiated, and how often
-the information the user interface is displaying accurately reflects the state
-of the system it is modeling. Implementing a responsive system will require
-the system resources to be split across multiple concurrent tasks, so although
-the user will typically be more productive, the time it takes the system
-to complete a particular task will be longer (i.e. Its performance on <u>that
-task</u> will be lower).</p>
- 
-<p>In order to increase the responsiveness of the Eclipse Platform we will
-be looking at the following two areas:</p>
- 
-<ol>
- 	<li>
-    <p>all of the user interface "features" of the 	Eclipse Platform will
-be investigated to remove any inherent 	limitations which prevent them from
-being used in a responsive 	fashion. We have not begun work on this aspect
-of the problem, so it 	is difficult to provide any definitive examples. However,
-some 	likely candidates for investigation, at least, would be:</p>
- </li>
-</ol>
-<ul>
- 	<li>
-    <p>the startup sequence, since the time between when the user 	starts
-the application and when they can start working is very 	important to their
-perception of its responsiveness.</p>
- 	</li>
-  <li>
-    <p>SWT widgets like the Table, Tree, and List whose API make it 	difficult
-to code in an "on demand" style where the 	contents are requested by the
-widget when they are required for 	display, rather than up front by the application.</p>
- 	</li>
-  <li>
-    <p>the Java text editor, which takes significantly longer to get 	to
-the point where the contents can be edited than the simple text 	editor.</p>
- </li>
-</ul>
- 
-<ol start="2">
- 	<li>
-    <p>certain operations like builds and searches which currently 	run synchronously
-and block the user (at the UI) from doing other 	work until they are completed
-will be modified to run asynchronously 	in the background. Implementing this
-requires an improved 	concurrency architecture. The remainder of this document
-describes 	the work which has been done so far in that area.</p>
- </li>
-</ol>
- 
-<h2>Overview of current problems</h2>
- 
-<ul>
- <li> Use of modal progress dialogs is pervasive in the UI, preventing the
-user from doing any other work (or even browsing) while long running tasks
-are processing. </li>
- <li> Very long running operations only update the UI once at the very end.
-For example, when searching, no search results are available for viewing
-until the entire search is complete.  When importing or checking out large
-projects, the project doesn't appear in the UI until every file in the project
-has been created. </li>
- <li> Many components have their own mechanism for managing background activity.
- Examples include: search indexing, UI decoration, Java editor reconciling,
-and workspace snapshot. Each component should not have to roll their own
-concurrency architecture for off-loading work into background threads. </li>
- <li>The current workspace lock is heavy handed.  There is a single write
-lock for the entire  workspace, and it is generally acquired for significant
-periods of time.  This can block other processes for several minutes.  When
-the lock is acquired, no other threads can modify the workspace in any way. 
-  </li>
- <li> The workspace locking mechanism is currently tied to the mechanism
-for batching workspace changes.  We widely advertise that compound workspace
-changes should be done within an IWorkspaceRunnable.  The workspace is always
-locked for the duration of the IWorkspaceRunnable even if it is not making
-changes to the workspace. </li>
- <li> Various plugins have their own locking mechanisms.  Since plugins don't
-always know about each other, these locks can conflict in unforeseeable ways,
-making Eclipse prone to deadlock. </li>
- 
-  <p> </p>
-</ul>
-  
-<h2>Proposed solutions</h2>
- 
-<h3>Job scheduling mechanism</h3>
- 
-<p> Platform core (runtime plugin) will introduce a new job manager API for
-background work.  This API will allow clients to: </p>
-<ul>
- <li> Schedule <i>Job</i> instances, units of runnable background activity.
-Jobs can be scheduled either for immediate execution, or execution after
-some specified delay.  The platform will maintain a queue for waiting jobs,
-and will manage a pool of worker threads for running the jobs. </li>
- <li> Specify job scheduling priority, as well as explicit dependencies between
-jobs (Job A must run after Job B but before Job C, etc). </li>
- <li> Specify job scheduling rules, which will allow implicit constraints
-to be created between jobs that don't know about each other.  For example,
-a Job can say: "While I'm running, I require exclusive access to resource
-X.  Don't run me until it's safe to do so, and don't run any other jobs that
-might conflict with me until I'm done".  The constraint system will be generic
-at the level of the job scheduling API, but other plugins can introduce standard
-constraints that apply to their components. </li>
- <li> Query, cancel and change priority of jobs that are waiting to run.  This
-allows clients to cancel jobs that have become irrelevant before they had
-a chance to run. (Example: cancel pending indexing or decoration jobs on
-a project when the project is deleted). </li>
- <li> Group jobs into families, and query, cancel, and manage entire job
-families as a unit. </li>
- <li> Register for notification when jobs are scheduled, started, finished,
-canceled, etc.  Clients can register for notification on a single job, or
-on all jobs. </li>
- <li> Provide a mechanism to allow jobs to carry their work over to another
- thread and finish asynchronously.  This is needed to allow jobs to asyncExec
- into the UI, but maintain scheduling rules and avoid notifiying listeners until
- the async block has returned.
- </li>
- <li> Add listeners to be hooked to the progress monitor callbacks of the
-running jobs.  This allows the UI to report progress on jobs that would otherwise
-have no way of connecting with the UI (such as indexing or snapshot jobs). 
-  </li>
- 
-</ul>
- 
-<p> This scheduling mechanism will replace most (if not all) existing background
-thread mechanisms in the SDK.  This includes: editor reconcilers, UI decoration, 
-search and Java indexing, workspace snapshot, and various threads used in the launch/debug
-framework: JDI thread for communicating with the VM, threads for monitoring
-input and output streams, debug view update thread, and the thread waiting
- for VM termination. </p>
- 
-<p> Also, the scheduling facility will make it easier for more components
-to off-load work into background threads, in order to free up the UI thread
-for responding to the user.  This includes all jobs that currently run in
-the context of a modal progress indicator, but also other processing work
-that currently executes in the UI.  Examples of activity that can be offloaded
-into jobs: decorating editors (marker ruler, overview ruler), type hierarchy
-computation, structure compare in compare editors, auto-refresh with file
-system, etc.  </p>
-   
-<h3>New UI look and feel for long running activity</h3>
- 
-<p> Long running operations will generally be run without a modal progress indicator 
-  by scheduling them with the core job manager API.   Most jobs currently using a
-  modal progress dialog will switch to this new non-modal way of running.
-  The platform UI will provide a view from which users can see the list of waiting and 
-  running background jobs, along with their current progress. This is a view rather than 
-  a dialog so the user can continue to manipulate the UI while background jobs are 
-  running. This view will likely take the form of a tree so that expanding a job will
-  give more detailed progress information.  The UI will also provide some ubiquitous 
-  feedback device (much like the page loading indicator in popular web browsers or the 
-  Macintosh user interface), that will indicate when background activity is happening. 
- </p>
-<p>Users will be able to cancel any background activity from the progress view. 
-  Users will also be able to pause, resume, or fast forward (increase priority 
-  of) any waiting job. Since we can never know which of several background jobs 
-  the user is most anxious to complete, this puts some power in the user's hands 
-  to influence the order of execution of waiting background jobs.</p>
-
-<p>
-  The platform UI will introduce a special job called a UI job, which is simply a job that 
-  needs to be run in the UI Thread. We define this type of job as a convenience for those 
-  who do not want to keep looking for a Display to asyncExec in.  Casting UI work
-  as jobs will allow the framework to control scheduling based on priority and user 
-  defined scheduling rules.  Note that although UI jobs should generally be brief
-  in duration, they may require locks and thus the framework must have a strategy
-  for avoiding deadlock when the UI thread is waiting for a lock.
- 
-<h3>Minimize use of long term workspace locks</h3>
- 
-<p> We will actively discourage clients from acquiring the workspace lock
-for indefinite periods of time.  <code>IWorkspaceRunnable</code> is the current
-mechanism that allows clients to lock the workspace for the duration of a
-runnable.  This API will be deprecated.   Clients that require exclusive
-access to portions of the workspace should  schedule background jobs with
-appropriate scheduling rules.  Scheduling rules can  specify smaller portions
-of the workspace, allowing clients to "lock" only the resources  they need.
-Longer running workspace API methods will be broken up as much as  possible
-to avoid locking the workspace for extended periods.  Clients that do not 
-run as jobs, or that run as jobs without the appropriate scheduling rules,
-will have to be tolerant of concurrent modifications to the workspace. </p>
-  
-<h3>New resource change notification and autobuild strategy</h3>
- 
-<p> The current mechanism for batching resource changes and auto-building
-is based on the <code>IWorkspaceRunnable</code> API.  This approach has two
-problems: </p>
-<ol>
- <li> Clients sometimes forget to use it, which results in severe performance
-problems because notifications and auto-builds happen more often than necessary. 
-  </li>
- <li> This can become too coarse-grained for long running operations.  If
-the user begins an operation that will take several minutes, it would be
-nice to perform some incremental updates (notifications) while the operation
-is still running. </li>
- 
-</ol>
- 
-<p></p>
- 
-<p> The resources plugin will adopt new heuristics for when builds and notifications 
-should happen.  These heuristics will likely require some fine-tuning and
-may need to be customizable, but generally: </p>
-<ul>
- <li>Resource change notifications will always start within a bounded  period
-after the workspace has changed (such as five seconds). This will ensure notifications
-occur periodically during long operations. </li>
- <li> Notification will begin immediately if there have been no workspace
-changing jobs in the job queue for a short period (such as 500 milliseconds).
- This ensures timely  user feedback when background activity has stopped.
- There will be a lower bound on the frequency of notifications to prevent
-listeners from hogging the CPU. </li>
- <li>There will be API for forcing an immediate notification if clients know
-it is either necessary or desirable for a notification to occur.  (actually,
-this mechanism  has existed since Eclipse 1.0 in the method <code>IWorkspace.checkpoint</code>). 
-UI actions will use this for indicating when a user action has completed.
- Other clients that absolutely depend on the results of notifications can
-also use this mechanism  (for example clients that depend on the java model
-being up to date). </li>
- <li> Autobuilds will begin (if needed) when the work queue has been idle
-for a sufficient period of time (such as 1 second).  If a background job
-that requires write access to the workspace is scheduled before autobuild
-completes, then auto-build will be canceled automatically.  Existing builders
-will need to improve their cancelation behaviour so that a minimal amount
-of work is lost. </li>
- <li> There will still be a mechanism to allow users or API clients to force
-a build to occur, and these explicit builds will not be canceled automatically
-by conflicting background activity. </li>
- <li> Both builders and listeners could adapt automatically if they start
-interfering with ongoing work by increasing their wait period. This would
-allow builders and listeners to adapt to changes in activity levels. </li>
- 
-</ul>
- 
-<p></p>
- 
-<p> Unless explicitly requested, builds and resource change listeners will
-always be run  asynchronously in a different thread from the one that initiated
-the change.  This will improve the responsiveness of workspace changing operations
-that are initiated from the UI thread. </p>
- 
-<h3>Centralized locking mechanism</h3>
- 
-<p> Platform core (runtime plugin) will introduce a smart locking facility.
- Clients that  require exclusive access to a code region should use these
-locks as a replacement for  Java object monitors in code that may interact
-with other locks.  This will allow the platform to detect and break potential
-deadlocks.  Note that these locks are orthogonal to the job scheduling rules
-described earlier.  Job scheduling rules typically ensure that only non conflicting
-jobs are running, but cannot guarantee protection from malicious or incorrect
-code. </p>
-  These locks will have the following features: 
-<ul>
- <li>They will be reentrant.  A single thread can acquire a given lock more
-than once, and it will only be released when the number of acquires equals
-the number of releases. </li>
- <li>They will automatically manage interaction with the SWT synchronizer
-to avoid  deadlocking in the face of a syncExec.  I.e., if the UI thread
-tries to acquire a lock, and another thread holding that lock tries to perform
-a syncExec, the UI thread will service the syncExec work and then continue
-to wait for the lock. </li>
- <li>They will avoid deadlocking with each other.  I.e., if thread A acquires
-lock 1, then waits on lock 2, while thread B acquires lock 2 and waits on
-lock 1, deadlock would normally ensue.  The platform locking facility will
-employ a release and wait protocol to ensure that threads waiting for locks
-do not block other threads. </li>
- 
-</ul>
-   
-<h2>Milestone targets</h2>
- 
-<ul>
- <li> M1: Core runtime job manager API defined and implemented.  UI API defined
-with reference implementation.  Prototype UI implementation of progress view
-and progress animation. All components should begin looking into thread safety
-issues with their API. </li>
- <li>M2: In a branch, a significant subset of the Eclipse platform converted
-to use the new mechanisms. Ongoing work in all components to become thread 
-safe and to port existing components to job manager API (reconciler, indexer,
-decorator, debug events). </li>
- <li> M3: all platform work moved from branch to HEAD at beginning of M3
-cycle.  Goal for end of M3 is some level of stability across entire SDK
-in new concurrent world.  All  component API must be thread safe. </li>
- 
-</ul>
-<p>
- This schedule is aggressive but the intent is to wrap up platform work by
-end of M3.  This allows plenty of time to shake out threading bugs and allow
-other components to stabilize by M4. 
-</p>
-
-(Plan item bug reference: <a
- href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36957">36957</a>)<br>
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.job/doc/usecases.txt b/examples/org.eclipse.ui.examples.job/doc/usecases.txt
deleted file mode 100644
index f90c3ef..0000000
--- a/examples/org.eclipse.ui.examples.job/doc/usecases.txt
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-Basic concurrency use cases.  Some are overlapping, but each requires
-a different level of concurrency support.  Roughly ordered by perceived
-implementation difficulty.  1. and 2. are currently support in Eclipse 2.1,
-but we need to keep them in mind with any new story.
-
-1. Allow decoration tasks to continue in background without affecting
-   UI responsiveness or ability to modify resources.
-   
-   Examples:
-     a) User performs a CVS update.  While CVS is computing and updating 
-        new decorations in various views, the user wants to continue viewing
-        and modifying resources.  Duplicate decoration work should be detected
-        and avoided (don't decorate the same resource twice if possible).
-     b) User is typing in an editor.  Computation of effects such as
-        "red sea", and bracket matching should happen in the background
-        without affecting responsiveness.
-
-2. Very long running operations that do not modify resources, but must
-   be stoppable, and joinable.
-   
-   Examples:
-     a) User imports a JAR file.  This triggers an indexing job in the background.
-        User can continue to view and modify resources while indexing happens.
-        If the user deletes the JAR, or modifies it, duplicate or superfluous
-        background jobs should be canceled automatically.
-     b) User imports a JAR file.  This triggers an indexing job in the background.
-        User then requests a type hierarchy.  Priority of any index jobs
-        required by the type hierarchy should be bumped up and completed
-        immediately.
-
-3. Allow browsing during long operation
-
-  Example:
-    The user has started some long running background task (checkout,
-    import, build, etc).  They want a live UI so they can browse resources
-    (get children, get contents, dirty editors) while they wait for the long 
-    operation to finish.
-    
-  Deluxe:
-    The background task can complete in chunks, allowing the user to browse
-    and modify resources that were involved in the operation.  I.e., they
-    can edit imported resources before the import has completed.
-
-4. Allow edit during long running read-only operations
-  
-  Example:
-    The user starts a search.  Since searches don't modify resources,
-    the user may want to modify (add, delete, change) resources while
-    the search is happening.  This may or may not affect the search
-    results.
-
-5. Concurrent edit.
-
-  Examples:
-    a) The user does a CVS update on project A while project B is being deleted.
-    b) The user does a CVS update on project A while that same project is
-    being compiled, deleted, etc.  This is the extreme concurrency example.  
-
-    
-6. Allow preemption and restart on long-running operation.
-
-  Examples:
-  	a) The Mcq example.  User hits save on a file, and build starts.  User
-  	   realizes that there is an error, and they modify and save again.
-  	   They want to cancel the currently running build and start a new one.
-  	b) User selects a revision in the CVS repositories view, and hits
-  	   checkout.  While checkout is running, user realizes they chose
-  	   the wrong version, and they want to checkout a different one instead.
-  	   They want to cancel the current checkout and pre-empt with another.
-  	   
diff --git a/examples/org.eclipse.ui.examples.job/doc/workspace-lock.html b/examples/org.eclipse.ui.examples.job/doc/workspace-lock.html
deleted file mode 100644
index 83f19f3..0000000
--- a/examples/org.eclipse.ui.examples.job/doc/workspace-lock.html
+++ /dev/null
@@ -1,232 +0,0 @@
-<html>
-<head>
-</head>
-<body>
-<h1>Workspace lock granularity</h1>
-<h2>The problem</h2>
-<ul>
-<li>The current workspace lock is heavy handed.  There is a single write lock for the entire 
-workspace, and it is generally acquired for significant periods of time.  This can block
-other processes for several minutes.  When the lock is acquired, no other threads
-can write to the workspace in any way. The write lock does not interfere with workspace
-readers, which are always allowed to proceed.
-</li>
-<p>
-<li>
-Processes often don't know in advance whether writes are necessary, so often the 
-lock is acquired for long periods even when no writing occurs (for example on searches).
-</li>
-<p>
-<li>
-The workspace locking mechanism is currently tied to the mechanism for batching
-workspace changes.  We widely advertise that compound workspace changes should
-be done within an IWorkspaceRunnable.  The workspace is always locked for the
-duration of the IWorkspaceRunnable even if it is not making changes to the workspace.
-</li>
-<p>
-<li>
-In the absence of other sync mechanisms, other clients use the workspace lock
-for working with operations that don't necessarily even operate on resources.
-</li>
-<p>
-<li>
-To avoid deadlock, many clients acquire the workspace lock "just in case", before
-acquiring their own private lock mechanism.
-</li>
-<p>
-<li>
-Although this problem is most evident with the workspace lock, there are other
-heavy-handed locks in Eclipse with which the same issues appear (the CVS lock is
-another example).
-</li>
-</ul>
-
-<h2>Proposed Solution</h2>
-<p>
-The current workspace lock is very coarse-grained both in how long the lock is held,
-and the scope of the resources that are locked by it.  To achieve better concurrency
-in the workspace, we need to attack the lock's physical granularity, its temporal
-granularity, or some combination of the two.
-</p>
-<p>
-We can improve the lock's temporal granularity by removing any public, general way 
-of locking for an arbitrary period of time. I.e., we make the simple change of not 
-acquiring the lock for IWorkspaceRunnables. (or even better, deprecate IWorkspaceRunnable entirely).
-</p>
-<p>
-Internally, the workspace would continue to use a single lock in critical regions to ensure
-the integrity of individual API calls.  However, a systematic effort would be made to
-break down the duration of locking within those calls, where possible.  For example,
-a best-effort copy method does not need to lock the workspace for its entire duration,
-but only for each unit of work where a new resource is created at the destination.
-</p>
-<p>
-The underlying design rule is to prevent an atomic operation from locking
-the workspace for a long period of time.  Without the presence of long term locks, 
-long running concurrent operations will interleave their access to the workspace, 
-enabling several workspace-modifying operations to run at the same time.
-</p>
-<p>
-This solution is optimistic. It assumes that concurrent writes to the same set 
-of resources in a conflicting manner are relatively rare. One could in fact go further, and
-say that if concurrent operations are modifying the same resources at the same time,
-then it is either a user or programming error, and the concurrent tasks should just fail.
-Serves them right for trying to do contradictory things on the same set of resources.
-</p>
-<p>
-However, this philosophy is not acceptable without a very strong visual indication
-to the user of what is happening and when it will be finished.  I.e., if we had a progress
-dialog saying, "Resource X is being modified, and I will let you know when I'm done",
-then it might be acceptable to blame the user if they start a conflicting task before
-it finishes.  Some of the drawbacks of this approach are:
-<ol style="a">
-<li>The dialog is a distraction to the user in the cases where the user
-doesn't care when the task ends and is not waiting for its result</li>
-<li>This interaction style puts the onus on the user to avoid making mistakes.  </li>
-<li>In many cases the user doesn't know what resources are modified by a given 
-operation. I.e., it is unrealistic to assume that users can compute the intersection
-between the set of resources that all current background threads may modify
-and the set of resources that might be modified by another task they are thinking
-of starting.</li>
-<li>The penalty to the user for making a mistake can be severe.  For example,
-if the user starts a CVS commit operation, and then, thinking the commit is about done,
-decides to delete the project, they will be unhappy if the deletion started before
-the commit finished.</li>
-</ol>
-<p>
-So, how do we schedule concurrent jobs in a way that prevents conflicts without
-employing a single long term lock? We can introduce a scheme where
-jobs can specify in advance whether they need exclusive access to a resource.
-That is, each job can optionally supply a <i>scheduling rule</i> that is used by
-the job scheduler when making decisions about which jobs to run.  The API for these 
-rules would look something like this:
-<pre>
-public interface ISchedulingRule {
-	public boolean isConflicting(ISchedulingRule);
-}
-</pre>
-<p>
-While these rules would remain generic at the job scheduling level, the workspace
-can introduce some standard rules.  For example, a rule could request an array
-of resources, or the entire workspace.  In this way, finer-grained portions of the workspace
-can be effectively locked by a job.
-</p>
-<p>
-The contract on these rules would be as follows: the job scheduling mechanism 
-guarantees that a job won't be started if there is a job currently running that conflicts
-with its scheduling rule.  This scheduling rule would be orthogonal to any locking 
-mechanism, thus avoiding some of the problems discussed earlier with regard
-to pre-specification of locks. We still need to revisit our previous objections to
-pre-specified locks to see how they apply to scheduling rules:
-<ul>
-<li>Scheduling performance. The scheduling rules need to be resolved every time
-a job is to be run.  It is true that this will still impose an overhead on scheduling.
-Most of the time, however, there will be few or no jobs running so very little rule
-analysis is needed.  As the number of concurrent operations grows, the cost will
-increase.  However, this has the nice property that it is fast most of the time, and 
-only starts to slow down in the uncommon case where the system is already very busy anyway.
-</li>
-<li>How to know what rules to use?  In some cases it is hard to predict what resources
-will be changed by a given unit of work.  When third party API is called, there is often
-no contract saying what will be touched.  This is still an issue.  In the worst case,
-clients will err on the side of caution and specify that the entire workspace is needed.
-We will need to educate users to specify rules carefully, and if necessary to break
-jobs up into separate units with different rules.  We will introduce a way of creating
-composite jobs that will be run in a specific order, but each job can have its
-own scheduling rules.
-</li>
-<li>How to enforce that rules are followed?  The proposal is that we don't enforce
-anything.  That is, a job can request arbitrary locks regardless of what rules were
-stated.  To avoid deadlock, lock ordering with release and wait (described earlier)
-will be used.  The theory is that if jobs are well behaved and specify their rules
-correctly, deadlock will be rare, so release and wait will rarely be necessary.  To put
-it another way, the penalty for not specifying your rules correctly is that you might
-have some locks taken away from you when you don't expect it.  This is a much
-more palatable failure mode than throwing an exception, for example.
-</li>
-<li>Pre-allocation can be wasteful if resources are only actually needed for a short
-period of time.  This is still a potential problem with scheduling rules.  Job writers
-will have to take this into consideration when designing jobs and their rules.  If a 
-job only needs access to a resource briefly at the end of a long operation, it can
-be coded as two jobs with different rules.  This is an area where scheduling rules
-introduce a new complication that clients need to be aware of.
-</li>
-</ul>
-<p>
-Scheduling rules may not be necessary at all in cases where contention is not likely,
-or where the job is written in such a way that concurrent changes are tolerated.
-if clients are confident that no contention is likely, they don't need to specify any
-rules.  A good example for this is search.  Search may create search result markers
-on arbitrary resources.  However, search could be implemented to not have
-any scheduling rules, and it could be tolerant of concurrent changes and deletion.
-Since it only creates search markers, it doesn't care if those markers are changed
-or deleted after they are created.  Thus it is possible that search can be implemented without
-using any scheduling rules at all, even though it may potentially make modifications
-to an arbitrary set of resources.  Another example of this is CVS metadata files.  Since
-the CVS client is the only one that ever views or modifies the CVS metadata files,
-it may not need to create a scheduling rule for them.
-</p>
-<p>
-Finally, when there is contention between jobs, we need a
-mechanism for giving more value to jobs initiated by users versus background jobs 
-that the user is not waiting on results for.  Each job belongs to a priority class that
-can be used to manage this interaction.  User initiated jobs belong to the INTERACTIVE
-priority class. To avoid blocking interactive jobs for unacceptable periods of time, we
-can employ various policies to ensure the job gets run, such as:
-<ul>
-<li>Only start non-interactive jobs when NO interactive jobs are running</li>
-<li>If an interactive job is waiting to be run, and its rule conflicts with a currently
-running non-interactive job, the non-interactive job may be canceled to let the interactive
-job proceed.</li>
-<li>If an interactive job is waiting on a lock held by a non-interactive job, 
-the non-interactive job may be canceled to let the interactive job proceed.</li>
-</ul>
-
-<h3>Locking issues</h3>
-<h4>Is the UI thread allowed to acquire locks?</h4>
-<b>Reasons for "No":</b><br>
-<p>
-Clearly there is a deadlock risk due to the interaction with syncExec.
-We can handle this risk in the same way that we handle it in Eclipse 2.1.  By ensuring
-the core locking mechanism and the SWT synchronizer are aware of each other, we
-can avoid potential deadlocks by servicing syncExecs in the UI thread in the case
-where the UI thread is waiting on an acquired lock.  
-</p>
-<p>
-Not allowing locks in the UI thread would also help improve UI responsiveness.  
-If the UI thread is waiting on a lock, it cannot be processing the event queue, and thus
-the UI will fail to paint.
-</p>
-<p>
-If we don't allow locks in the UI thread, then we can easily add the extra restriction
-that locks must be acquired from within the context of currently running jobs.  This
-would give us a story for cleaning up misbehaving locks.  I.e., if someone acquires
-a lock but fails to release it, we can release it automatically when the job completes.
-</p>
-<b>Reasons for "Yes":</b><br>
-<p>
-The main drawback is that this would be unweildy to program with.  Some operations
-that acquire locks may actually be very fast.  Forcing the UI to fork a 
-job every time a lock is needed may be overkill in many cases.  If third party code is 
-called from the UI, the caller may not know if locks will be acquired deep down in the 
-call stack.  To be defensive, the UI would have to fork jobs whenever third party
-code is called.
-</p>
-<p>
-Another problem is how this rule would be enforced.  Throwing an exception when
-the UI thread attempts to acquire a lock would result in unacceptable runtime errors.
-</p>
-<h4>Do we expose locks?</h4>
-<p>
-Do we allow third party clients to directly acquire, for example, the workspace lock?
-The answer to this question must be "No", if we don't have the restriction that jobs
-be acquired within running jobs.  Otherwise, we would have no way of cleaning up
-locks that clients acquire but fail to release.  Is this acceptable?  Do we know of 
-any cases where clients will need to acquire the workspace lock, given that we have
-a system of rules to prevent conflicting jobs from running concurrently?
-</p>
-
-
-
-</body>	
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.job/icons/job_view.gif b/examples/org.eclipse.ui.examples.job/icons/job_view.gif
deleted file mode 100644
index 81fb7b4..0000000
--- a/examples/org.eclipse.ui.examples.job/icons/job_view.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.job/icons/sample.gif b/examples/org.eclipse.ui.examples.job/icons/sample.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/examples/org.eclipse.ui.examples.job/icons/sample.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.job/icons/suspend.gif b/examples/org.eclipse.ui.examples.job/icons/suspend.gif
deleted file mode 100644
index 0d71e42..0000000
--- a/examples/org.eclipse.ui.examples.job/icons/suspend.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.job/icons/tree_view.gif b/examples/org.eclipse.ui.examples.job/icons/tree_view.gif
deleted file mode 100644
index ce8bdb9..0000000
--- a/examples/org.eclipse.ui.examples.job/icons/tree_view.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.job/plugin.xml b/examples/org.eclipse.ui.examples.job/plugin.xml
deleted file mode 100644
index 31339d4..0000000
--- a/examples/org.eclipse.ui.examples.job/plugin.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-     <extension
-         point="org.eclipse.ui.views">
-      <category
-            name="Progress Examples"
-            id="ProgressExamples">
-      </category>
-      <view
-            name="Lazy Trees"
-            icon="icons/tree_view.gif"
-            category="ProgressExamples"
-            class="org.eclipse.ui.examples.jobs.views.LazyTreeView"
-            id="org.eclipse.ui.examples.jobs.views.LazyTreeView">
-      </view>
-      <view
-            name="Job Factory"
-            icon="icons/job_view.gif"
-            category="ProgressExamples"
-            class="org.eclipse.ui.examples.jobs.views.JobsView"
-            id="org.eclipse.ui.examples.jobs.views.JobsView">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectiveExtensions">
-      <perspectiveExtension
-            targetID="org.eclipse.ui.resourcePerspective">
-         <view
-               ratio="0.5"
-               relative="org.eclipse.ui.views.TaskList"
-               id="org.eclipse.ui.examples.jobs.views.LazyTreeView"
-               relationship="right">
-         </view>
-         <view
-               ratio="0.5"
-               relative="org.eclipse.ui.views.TaskList"
-               id="org.eclipse.ui.examples.jobs.views.JobsView"
-               relationship="right">
-         </view>
-      </perspectiveExtension>
-   </extension>
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            label="Job Example Actions"
-            visible="true"
-            id="ProgressExamples.actionSet">
-         <menu
-               label="&amp;Job"
-               id="sampleMenu">
-            <separator
-                  name="sampleGroup">
-            </separator>
-         </menu>
-         <action
-               label="&amp;Suspend Job Manager"
-               icon="icons/suspend.gif"
-               style="toggle"
-               class="org.eclipse.ui.examples.jobs.actions.SuspendJobManagerAction"
-               tooltip="Suspend the job manager"
-               menubarPath="sampleMenu/sampleGroup"
-               toolbarPath="sampleGroup"
-               id="org.eclipse.ui.examples.jobs.actions.SuspendJobManagerAction">
-         </action>
-         <action
-               label="&amp;Dump Job Information"
-               icon="icons/sample.gif"
-               class="org.eclipse.ui.examples.jobs.actions.DebugJobManagerAction"
-               tooltip="Dump job information"
-               menubarPath="sampleMenu/sampleGroup"
-               id="org.eclipse.ui.examples.jobs.actions.SuspendJobManagerAction">
-         </action>
-      </actionSet>
-   </extension>
-
-</plugin>
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/BusyShowWhileDialog.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/BusyShowWhileDialog.java
deleted file mode 100644
index d6ef321..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/BusyShowWhileDialog.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.eclipse.ui.examples.jobs;
-import java.lang.reflect.InvocationTargetException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.IconAndMessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.progress.ProgressManager;
-/**
- *BusyShowWhileDialog is a test of busyShowWhile in a modal dialog.
- */
-public class BusyShowWhileDialog extends IconAndMessageDialog {
-	/**
-	 * @param parentShell
-	 * @todo Generated comment
-	 */
-	public BusyShowWhileDialog(Shell parentShell) {
-		super(parentShell);
-		message = "Busy While Test"; //$NON-NLS-1$
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IconAndMessageDialog#getImage()
-	 */
-	protected Image getImage() {
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		super.createButtonsForButtonBar(parent);
-		Button detailsButton = createButton(parent, 4, "Start busy show while", false); //$NON-NLS-1$
-		detailsButton.addSelectionListener(new SelectionListener() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				try {
-					ProgressManager.getInstance().busyCursorWhile(new IRunnableWithProgress() {
-						/* (non-Javadoc)
-						 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
-						 */
-						public void run(IProgressMonitor monitor) throws InvocationTargetException,
-								InterruptedException {
-							long time = System.currentTimeMillis();
-							long delay = PlatformUI.getWorkbench().getProgressService().getLongOperationTime();
-							long end = time + delay + delay;
-							while (end > System.currentTimeMillis()) {
-								final Shell myShell = BusyShowWhileDialog.this.getShell();
-								myShell.getDisplay().asyncExec(new Runnable() {
-									/* (non-Javadoc)
-									 * @see java.lang.Runnable#run()
-									 */
-									public void run() {
-										if(myShell.isDisposed())
-											return;
-										myShell.getDisplay().sleep();
-										myShell.setText(String.valueOf(System.currentTimeMillis()));
-									}
-								});
-							}
-						}
-					});
-				} catch (InvocationTargetException error) {
-					error.printStackTrace();
-				} catch (InterruptedException error) {
-					//ignore - in this context it means cancelation
-				}
-			}
-			/* (non-Javadoc)
-			 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetDefaultSelected(SelectionEvent e) {
-				//do nothing
-			}
-		});
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/ProgressExamplesPlugin.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/ProgressExamplesPlugin.java
deleted file mode 100644
index 0533c2f..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/ProgressExamplesPlugin.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.eclipse.ui.examples.jobs;
-
-import org.eclipse.core.runtime.*;
-import org.eclipse.ui.examples.jobs.views.ProgressExampleAdapterFactory;
-import org.eclipse.ui.examples.jobs.views.SlowElement;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class ProgressExamplesPlugin extends AbstractUIPlugin {
-	//The shared instance.
-	private static ProgressExamplesPlugin plugin;
-	public static String ID = "org.eclipse.ui.examples.job";
-	
-	/**
-	 * The constructor.
-	 */
-	public ProgressExamplesPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static ProgressExamplesPlugin getDefault() {
-		return plugin;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		IAdapterManager m = Platform.getAdapterManager();
-		IAdapterFactory f = new ProgressExampleAdapterFactory();
-		m.registerAdapters(f, SlowElement.class);
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/TestJob.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/TestJob.java
deleted file mode 100644
index 6e500e1..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/TestJob.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.jobs;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.ui.progress.IProgressConstants;
-
-/**
- * Base class for a simple test job with configurable parameters
- */
-public class TestJob extends Job {
-	/**
-	 * A family identifier for all test jobs
-	 */
-	public static final Object FAMILY_TEST_JOB = new Object();
-	/**
-	 * Total duration that the test job should sleep, in milliseconds.
-	 */
-	private long duration;
-	/**
-	 * Whether the test job should fail.
-	 */
-	private boolean failure;
-	/**
-	 * Whether the job should report unknown progress.
-	 */
-	private boolean unknown;
-	private boolean reschedule;
-	private long rescheduleWait;
-
-	/**
-	 * Creates a new test job
-	 * 
-	 * @param duration
-	 *            Total time that the test job should sleep, in milliseconds.
-	 * @param lock
-	 *            Whether the job should use a workspace scheduling rule
-	 * @param failure
-	 *            Whether the job should fail
-	 * @param indeterminate
-	 *            Whether the job should report indeterminate progress
-	 * @param rescheduleWait
-	 * @param reschedule
-	 */
-	public TestJob(long duration, boolean lock, boolean failure,
-			boolean indeterminate, boolean reschedule, long rescheduleWait) {
-		super("Test job"); //$NON-NLS-1$
-		this.duration = duration;
-		this.failure = failure;
-		this.unknown = indeterminate;
-		this.reschedule = reschedule;
-		this.rescheduleWait = rescheduleWait;
-		setProperty(IProgressConstants.ICON_PROPERTY, ProgressExamplesPlugin
-				.imageDescriptorFromPlugin(ProgressExamplesPlugin.ID,
-						"icons/sample.gif"));
-		if (lock)
-			setRule(ResourcesPlugin.getWorkspace().getRoot());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.internal.jobs.InternalJob#belongsTo(java.lang.Object)
-	 */
-	public boolean belongsTo(Object family) {
-		if (family instanceof TestJob) {
-			return true;
-		}
-		return family == FAMILY_TEST_JOB;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.internal.jobs.InternalJob#run(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus run(IProgressMonitor monitor) {
-		if (failure) {
-			MultiStatus result = new MultiStatus(
-					"org.eclipse.ui.examples.jobs", 1, "This is the MultiStatus message", new RuntimeException("This is the MultiStatus exception")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			result
-					.add(new Status(
-							IStatus.ERROR,
-							"org.eclipse.ui.examples.jobs", 1, "This is the child status message", new RuntimeException("This is the child exception"))); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			return result;
-		}
-		final long sleep = 10;
-		int ticks = (int) (duration / sleep);
-		if (this.unknown)
-			monitor.beginTask(toString(), IProgressMonitor.UNKNOWN);
-		else
-			monitor.beginTask(toString(), ticks);
-		try {
-			for (int i = 0; i < ticks; i++) {
-				if (monitor.isCanceled())
-					return Status.CANCEL_STATUS;
-				monitor.subTask("Processing tick #" + i); //$NON-NLS-1$
-				try {
-					Thread.sleep(sleep);
-				} catch (InterruptedException e) {
-					return Status.CANCEL_STATUS;
-				}
-				monitor.worked(1);
-			}
-		} finally {
-			if (reschedule)
-				schedule(rescheduleWait);
-			monitor.done();
-		}
-		return Status.OK_STATUS;
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/TestJobRule.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/TestJobRule.java
deleted file mode 100644
index d8759f0..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/TestJobRule.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.eclipse.ui.examples.jobs;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-
-/**
- * TestJobRule is a scheduling rules that makes all jobs sequential.
- *
- */
-public class TestJobRule implements ISchedulingRule {
-	private int jobOrder;
-
-	public TestJobRule(int order) {
-		jobOrder = order;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.ISchedulingRule#contains(org.eclipse.core.runtime.jobs.ISchedulingRule)
-	 */
-	public boolean contains(ISchedulingRule rule) {
-		if (rule instanceof IResource || rule instanceof TestJobRule)
-			return true;
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.jobs.ISchedulingRule#isConflicting(org.eclipse.core.runtime.jobs.ISchedulingRule)
-	 */
-	public boolean isConflicting(ISchedulingRule rule) {
-		if (!(rule instanceof TestJobRule))
-			return false;
-		return ((TestJobRule) rule).getJobOrder() >= jobOrder;
-	}
-
-	/**
-	 * Return the order of this rule.
-	 * @return
-	 */
-	public int getJobOrder() {
-		return jobOrder;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/UITestJob.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/UITestJob.java
deleted file mode 100644
index c38aa63..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/UITestJob.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.jobs;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.*;
-import org.eclipse.ui.progress.UIJob;
-/**
- * Base class for a simple test UI job with configurable parameters
- */
-public class UITestJob extends UIJob {
-	private long duration;
-	private boolean failure;
-	private boolean unknown;
-	public UITestJob(long duration, boolean lock, boolean failure, boolean indeterminate) {
-		super("Test job"); //$NON-NLS-1$
-		this.duration = duration;
-		this.failure = failure;
-		this.unknown = indeterminate;
-		
-		if (lock)
-			setRule(ResourcesPlugin.getWorkspace().getRoot());
-	}
-	public IStatus runInUIThread(IProgressMonitor monitor) {
-		if (failure)
-			throw new RuntimeException();
-		final long sleep = 10;
-		int ticks = (int) (duration / sleep);
-		if(unknown)
-			monitor.beginTask(toString(), IProgressMonitor.UNKNOWN);
-		else
-			monitor.beginTask(toString(), ticks);
-		try {
-			for (int i = 0; i < ticks; i++) {
-				if (monitor.isCanceled())
-					return Status.CANCEL_STATUS;
-				monitor.subTask("Processing tick #" + i); //$NON-NLS-1$
-				try {
-					Thread.sleep(sleep);
-				} catch (InterruptedException e) {
-					return Status.CANCEL_STATUS;
-				}
-				monitor.worked(1);
-			}
-		} finally {
-			monitor.done();
-		}
-		return Status.OK_STATUS;
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/actions/CreateJobsAction.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/actions/CreateJobsAction.java
deleted file mode 100644
index b9c406f..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/actions/CreateJobsAction.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.jobs.actions;
-
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.examples.jobs.TestJob;
-
-/**
- * Test action that creates a number of fake jobs, and then waits until they complete.
- */
-public class CreateJobsAction implements IWorkbenchWindowActionDelegate {
-	static final long DELAY = 100;
-
-	private IWorkbenchWindow window;
-
-	private long askForDuration() {
-		InputDialog dialog = new InputDialog(window.getShell(), "How long?", "Enter the number of milliseconds per job", "1000", new IInputValidator() { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					public String isValid(String newText) {
-						try {
-							Long.parseLong(newText);
-						} catch (NumberFormatException e) {
-							return "Not a number"; //$NON-NLS-1$
-						}
-						return null;
-					}
-				});
-		if (dialog.open() == Window.CANCEL)
-			throw new OperationCanceledException();
-		return Long.parseLong(dialog.getValue());
-	}
-
-	private boolean askForExclusive() {
-		MessageDialog dialog = new MessageDialog(window.getShell(), "Likes to be left alone?", //$NON-NLS-1$
-				null, "Press yes if the jobs should be run one at a time, and no otherwise", //$NON-NLS-1$
-				MessageDialog.QUESTION, new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL}, 1 // no is the default
-		);
-		return dialog.open() == 0;
-	}
-
-	private boolean askForFailure() {
-		MessageDialog dialog = new MessageDialog(window.getShell(), "Born to fail?", //$NON-NLS-1$
-				null, "Should the jobs return an error status?", //$NON-NLS-1$
-				MessageDialog.QUESTION, new String[] {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL}, 1 // no is the default
-		);
-		return dialog.open() == 0;
-	}
-
-	private int askForJobCount() {
-		InputDialog dialog = new InputDialog(window.getShell(), "How much work?", "Enter the number of jobs to run", "100", new IInputValidator() { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					public String isValid(String newText) {
-						try {
-							Integer.parseInt(newText);
-						} catch (NumberFormatException e) {
-							return "Not a number"; //$NON-NLS-1$
-						}
-						return null;
-					}
-				});
-		if (dialog.open() == Window.CANCEL)
-			throw new OperationCanceledException();
-		return Integer.parseInt(dialog.getValue());
-	}
-
-	public void dispose() {
-		//do nothing
-	}
-
-	public void init(IWorkbenchWindow window) {
-		this.window = window;
-	}
-
-	public void run(IAction action) {
-		int jobCount = askForJobCount();
-		long duration = askForDuration();
-		boolean exclusive = askForExclusive();
-		boolean failure = askForFailure();
-		for (int i = 0; i < jobCount; i++) {
-			new TestJob(duration, exclusive, failure, false, false, 0).schedule(DELAY);
-		}
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		//do nothing
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/actions/DebugJobManagerAction.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/actions/DebugJobManagerAction.java
deleted file mode 100644
index 0272248..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/actions/DebugJobManagerAction.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.jobs.actions;
-
-import org.eclipse.core.internal.jobs.JobManager;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-/**
- * This class is not really sample code.  This action is used to gather debugging
- * information about the internal state of the background job scheduling 
- * mechanism.
- */
-public class DebugJobManagerAction implements IWorkbenchWindowActionDelegate {
-	public DebugJobManagerAction() {
-		super();
-	}
-	public void dispose() {
-		//
-	}
-
-	public void init(IWorkbenchWindow window) {
-		//
-	}
-
-	public void run(IAction action) {
-		System.out.println("**** BEGIN DUMP JOB MANAGER INFORMATION ****"); //$NON-NLS-1$
-		Job[] jobs = Platform.getJobManager().find(null);
-		for (int i = 0; i < jobs.length; i++) {
-			System.out.println("" + jobs[i].getClass().getName() + " state: " + JobManager.printState(jobs[i].getState())); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		System.out.println("**** END DUMP JOB MANAGER INFORMATION ****"); //$NON-NLS-1$
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		//
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/actions/ForegroundAction.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/actions/ForegroundAction.java
deleted file mode 100644
index 7d36c26..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/actions/ForegroundAction.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.eclipse.ui.examples.jobs.actions;
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-public class ForegroundAction implements IWorkbenchWindowActionDelegate {
-	public void run(IAction action) {
-		try {
-			ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
-				public void run(IProgressMonitor monitor) {
-					//no-op
-				}
-			}, null);
-		} catch (OperationCanceledException e) {
-			e.printStackTrace();
-		} catch (CoreException e) {
-			e.printStackTrace();
-		}
-	}
-	public void selectionChanged(IAction action, ISelection selection) {
-		//do nothing
-	}
-	public void dispose() {
-		//do nothing
-	}
-	public void init(IWorkbenchWindow window) {
-		//do nothing
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/actions/JobAction.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/actions/JobAction.java
deleted file mode 100644
index f0b9ac4..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/actions/JobAction.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.eclipse.ui.examples.jobs.actions;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.WorkspaceJob;
-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.runtime.jobs.Job;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-/**
- * Our sample action implements workbench action delegate.
- * The action proxy will be created by the workbench and
- * shown in the UI. When the user tries to use the action,
- * this delegate will be created and execution will be 
- * delegated to it.
- * @see IWorkbenchWindowActionDelegate
- */
-public class JobAction implements IWorkbenchWindowActionDelegate {
-	public void run(IAction action) {
-		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		Job job = new WorkspaceJob("Background job") { //$NON-NLS-1$
-			public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
-				monitor.beginTask("Doing something in background", 100); //$NON-NLS-1$
-				for (int i = 0; i < 100; i++) {
-					try {
-						Thread.sleep(100);
-					} catch (InterruptedException e) {
-						return Status.CANCEL_STATUS;
-					}
-					monitor.worked(1);
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		job.setRule(workspace.getRoot());
-		job.schedule();
-	}
-	public void selectionChanged(IAction action, ISelection selection) {
-		//do nothing
-	}
-	public void dispose() {
-		//do nothing
-	}
-	public void init(IWorkbenchWindow window) {
-		//do nothing
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/actions/SuspendJobManagerAction.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/actions/SuspendJobManagerAction.java
deleted file mode 100644
index bab1674..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/actions/SuspendJobManagerAction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.eclipse.ui.examples.jobs.actions;
-
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-/**
- * Toggles the suspend/resume state of the job manager.
- */
-public class SuspendJobManagerAction implements IWorkbenchWindowActionDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		try {
-			if (action.isChecked())
-				Platform.getJobManager().suspend();
-			else
-				Platform.getJobManager().resume();
-		} catch (OperationCanceledException e) {
-			//thrown if the user cancels the attempt to suspend
-			e.printStackTrace();
-		}
-	}
-	/* (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) {
-		//do nothing
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-		//do nothing
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		//do nothing
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/DeferredContentProvider.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/DeferredContentProvider.java
deleted file mode 100644
index cd45227..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/DeferredContentProvider.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.jobs.views;
-
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.model.BaseWorkbenchContentProvider;
-import org.eclipse.ui.progress.DeferredTreeContentManager;
-
-public class DeferredContentProvider extends BaseWorkbenchContentProvider {
-
-	private DeferredTreeContentManager manager;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		if (viewer instanceof AbstractTreeViewer) {
-			manager = new DeferredTreeContentManager(this, (AbstractTreeViewer) viewer);
-		}
-		super.inputChanged(viewer, oldInput, newInput);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object element) {
-		// the + box will always appear, but then disappear
-		// if not needed after you first click on it.
-		if (manager != null) {
-			if (manager.isDeferredAdapter(element))
-				return manager.mayHaveChildren(element);
-		}
-
-		return super.hasChildren(element);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.WorkbenchContentProvider#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(Object element) {
-		if (manager != null) {
-			Object[] children = manager.getChildren(element);
-			if(children != null) {
-				return children;
-			}
-		}
-		return super.getChildren(element);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/JobsView.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/JobsView.java
deleted file mode 100644
index f484f67..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/JobsView.java
+++ /dev/null
@@ -1,649 +0,0 @@
-package org.eclipse.ui.examples.jobs.views;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-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.*;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.examples.jobs.TestJob;
-import org.eclipse.ui.examples.jobs.TestJobRule;
-import org.eclipse.ui.examples.jobs.UITestJob;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.progress.IProgressConstants;
-import org.eclipse.ui.progress.IProgressService;
-
-/**
- * A view that allows a user to create jobs of various types, and interact with
- * and test other job-related APIs.
- */
-public class JobsView extends ViewPart {
-	private Combo durationField;
-	private Button lockField, failureField, threadField, systemField,
-			userField, groupField, rescheduleField, keepField, keepOneField,
-			unknownField, gotoActionField;
-	private Text quantityField, delayField, rescheduleDelay;
-	private Button schedulingRuleField;
-	private Button noPromptField;
-
-	protected void busyCursorWhile() {
-		try {
-			final long duration = getDuration();
-			final boolean shouldLock = lockField.getSelection();
-			PlatformUI.getWorkbench().getProgressService().busyCursorWhile(
-					new IRunnableWithProgress() {
-						public void run(IProgressMonitor monitor) {
-							if (shouldLock)
-								doRunInWorkspace(duration, monitor);
-							else
-								doRun(duration, monitor);
-						}
-
-					});
-		} catch (InvocationTargetException e) {
-			e.printStackTrace();
-		} catch (InterruptedException e) {
-			// ignore - interrupt means cancel in this context
-		}
-	}
-
-	protected void createJobs() {
-		int jobCount = Integer.parseInt(quantityField.getText());
-		boolean ui = threadField.getSelection();
-		long duration = getDuration();
-		boolean lock = lockField.getSelection();
-		boolean failure = failureField.getSelection();
-		boolean noPrompt = noPromptField.getSelection();
-		boolean system = systemField.getSelection();
-		boolean useGroup = groupField.getSelection();
-		boolean unknown = unknownField.getSelection();
-		boolean user = userField.getSelection();
-		boolean reschedule = rescheduleField.getSelection();
-		final long rescheduleWait = Long.parseLong(rescheduleDelay.getText());
-		boolean keep = keepField.getSelection();
-		boolean keepOne = keepOneField.getSelection();
-		boolean gotoAction = gotoActionField.getSelection();
-		boolean schedulingRule = schedulingRuleField.getSelection();
-
-		int groupIncrement = IProgressMonitor.UNKNOWN;
-		IProgressMonitor group = new NullProgressMonitor();
-		int total = IProgressMonitor.UNKNOWN;
-
-		if (jobCount > 1) {
-			total = 100;
-			groupIncrement = 100 / jobCount;
-		}
-
-		if (useGroup) {
-			group = Platform.getJobManager().createProgressGroup();
-			group.beginTask("Group", total); //$NON-NLS-1$
-		}
-
-		long delay = Integer.parseInt(delayField.getText());
-		for (int i = 0; i < jobCount; i++) {
-			Job result;
-			if (ui)
-				result = new UITestJob(duration, lock, failure, unknown);
-			else
-				result = new TestJob(duration, lock, failure, unknown,
-						reschedule, rescheduleWait);
-
-			result.setProperty(IProgressConstants.KEEP_PROPERTY, Boolean
-					.valueOf(keep));
-			result.setProperty(IProgressConstants.KEEPONE_PROPERTY, Boolean
-					.valueOf(keepOne));
-			result.setProperty(
-					IProgressConstants.NO_IMMEDIATE_ERROR_PROMPT_PROPERTY,
-					Boolean.valueOf(noPrompt));
-			if (gotoAction)
-				result.setProperty(IProgressConstants.ACTION_PROPERTY,
-						new Action("Pop up a dialog") { //$NON-NLS-1$
-							public void run() {
-								MessageDialog
-										.openInformation(
-												getSite().getShell(),
-												"Goto Action", "The job can have an action associated with it"); //$NON-NLS-1$ //$NON-NLS-2$
-							}
-						});
-
-			result.setProgressGroup(group, groupIncrement);
-			result.setSystem(system);
-			result.setUser(user);
-
-			if (schedulingRule)
-				result.setRule(new TestJobRule(i));
-			result.schedule(delay);
-		}
-	}
-
-	/**
-	 * @see ViewPart#createPartControl(Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		Composite body = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.makeColumnsEqualWidth = false;
-		body.setLayout(layout);
-
-		createEntryFieldGroup(body);
-		createPushButtonGroup(body);
-		createCheckboxGroup(body);
-	}
-
-	/**
-	 * Create all push button parts for the jobs view.
-	 * 
-	 * @param parent
-	 */
-	private void createPushButtonGroup(Composite parent) {
-		Composite group = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 1;
-		group.setLayout(layout);
-		group.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		// create jobs
-		Button create = new Button(group, SWT.PUSH);
-		create.setText("Create jobs"); //$NON-NLS-1$
-		create
-				.setToolTipText("Creates and schedules jobs according to above parameters"); //$NON-NLS-1$
-		create.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		create.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				createJobs();
-			}
-		});
-
-		// touch workspace
-		Button touch = new Button(group, SWT.PUSH);
-		touch.setText("Touch workspace"); //$NON-NLS-1$
-		touch.setToolTipText("Modifies the workspace in the UI thread"); //$NON-NLS-1$
-		touch.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		touch.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				touchWorkspace();
-			}
-		});
-		// busy cursor while
-		Button busyWhile = new Button(group, SWT.PUSH);
-		busyWhile.setText("busyCursorWhile"); //$NON-NLS-1$
-		busyWhile.setToolTipText("Uses IProgressService.busyCursorWhile"); //$NON-NLS-1$
-		busyWhile.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		busyWhile.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				busyCursorWhile();
-			}
-		});
-		// progress monitor dialog with fork=false
-		Button noFork = new Button(group, SWT.PUSH);
-		noFork.setText("runInUI"); //$NON-NLS-1$
-		noFork.setToolTipText("Uses IProgressService.runInUI"); //$NON-NLS-1$
-		noFork.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		noFork.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				progressNoFork();
-			}
-		});
-
-		// progress monitor dialog with fork=false
-		Button exception = new Button(group, SWT.PUSH);
-		exception.setText("Runtime Exception"); //$NON-NLS-1$
-		exception.setToolTipText("NullPointerException when running"); //$NON-NLS-1$
-		exception.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		exception.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				jobWithRuntimeException();
-			}
-		});
-
-		// join the running test jobs
-		Button join = new Button(group, SWT.PUSH);
-		join.setText("Join Test Jobs"); //$NON-NLS-1$
-		join.setToolTipText("IJobManager.join() on test jobs"); //$NON-NLS-1$
-		join.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		join.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				joinTestJobs();
-			}
-		});
-
-		// join the running test jobs
-		Button window = new Button(group, SWT.PUSH);
-		window.setText("Runnable in Window"); //$NON-NLS-1$
-		window
-				.setToolTipText("Using a runnable context in the workbench window"); //$NON-NLS-1$
-		window.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		window.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				runnableInWindow();
-			}
-		});
-
-		// join the running test jobs
-		Button sleep = new Button(group, SWT.PUSH);
-		sleep.setText("Sleep"); //$NON-NLS-1$
-		sleep.setToolTipText("Calls sleep() on all TestJobs"); //$NON-NLS-1$
-		sleep.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		sleep.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				doSleep();
-			}
-		});
-
-		// join the running test jobs
-		Button wake = new Button(group, SWT.PUSH);
-		wake.setText("WakeUp"); //$NON-NLS-1$
-		wake.setToolTipText("Calls wakeUp() on all TestJobs"); //$NON-NLS-1$
-		wake.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		wake.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				doWakeUp();
-			}
-		});
-
-		// show in dialog
-		Button showInDialog = new Button(group, SWT.PUSH);
-		showInDialog.setText("showInDialog"); //$NON-NLS-1$
-		showInDialog.setToolTipText("Uses IProgressService.showInDialog"); //$NON-NLS-1$
-		showInDialog.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		showInDialog.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				showInDialog();
-			}
-		});
-
-	}
-
-	/**
-	 * Test the showInDialog API
-	 * 
-	 */
-	protected void showInDialog() {
-
-		Job showJob = new Job("Show In Dialog") {//$NON-NLS-1$
-			protected IStatus run(IProgressMonitor monitor) {
-				monitor.beginTask("Run in dialog", 100);//$NON-NLS-1$
-
-				for (int i = 0; i < 100; i++) {
-					if (monitor.isCanceled())
-						return Status.CANCEL_STATUS;
-					try {
-						Thread.sleep(100);
-					} catch (InterruptedException e) {
-						return Status.CANCEL_STATUS;
-					}
-					monitor.worked(1);
-
-				}
-				return Status.OK_STATUS;
-
-			}
-		};
-		showJob.schedule();
-		PlatformUI.getWorkbench().getProgressService().showInDialog(
-				getSite().getShell(), showJob);
-
-	}
-
-	/**
-	 * Wakes up all sleeping test jobs.
-	 */
-	protected void doWakeUp() {
-		Platform.getJobManager().wakeUp(TestJob.FAMILY_TEST_JOB);
-	}
-
-	/**
-	 * Puts to sleep all waiting test jobs.
-	 */
-	protected void doSleep() {
-		Platform.getJobManager().sleep(TestJob.FAMILY_TEST_JOB);
-	}
-
-	/**
-	 * @param body
-	 */
-	private void createEntryFieldGroup(Composite body) {
-		// duration
-		Label label = new Label(body, SWT.NONE);
-		label.setText("Duration:"); //$NON-NLS-1$
-		durationField = new Combo(body, SWT.DROP_DOWN | SWT.READ_ONLY);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-		durationField.setLayoutData(data);
-		durationField.add("0"); //$NON-NLS-1$
-		durationField.add("1 millisecond"); //$NON-NLS-1$
-		durationField.add("1 second"); //$NON-NLS-1$
-		durationField.add("10 seconds"); //$NON-NLS-1$
-		durationField.add("1 minute"); //$NON-NLS-1$
-		durationField.add("10 minutes"); //$NON-NLS-1$
-		durationField.select(4);
-
-		// delay
-		label = new Label(body, SWT.NONE);
-		label.setText("Start delay (ms):"); //$NON-NLS-1$
-		delayField = new Text(body, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-		delayField.setLayoutData(data);
-		delayField.setText("0"); //$NON-NLS-1$
-
-		// quantity
-		label = new Label(body, SWT.NONE);
-		label.setText("Quantity:"); //$NON-NLS-1$
-		quantityField = new Text(body, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-		quantityField.setLayoutData(data);
-		quantityField.setText("1"); //$NON-NLS-1$
-
-		// reschedule delay
-		label = new Label(body, SWT.NONE);
-		label.setText("Reschedule Delay (ms):"); //$NON-NLS-1$
-		rescheduleDelay = new Text(body, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-		rescheduleDelay.setLayoutData(data);
-		rescheduleDelay.setText("1000"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Creates all of the checkbox buttons.
-	 */
-	private void createCheckboxGroup(Composite parent) {
-		Composite group = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 1;
-		group.setLayout(layout);
-		group.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		// lock
-		lockField = new Button(group, SWT.CHECK);
-		lockField.setText("Lock the workspace"); //$NON-NLS-1$
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		lockField.setLayoutData(data);
-
-		// system
-		systemField = new Button(group, SWT.CHECK);
-		systemField.setText("System job"); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		systemField.setLayoutData(data);
-
-		// thread
-		threadField = new Button(group, SWT.CHECK);
-		threadField.setText("Run in UI thread"); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		threadField.setLayoutData(data);
-
-		// groups
-		groupField = new Button(group, SWT.CHECK);
-		groupField.setText("Run in Group"); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		groupField.setLayoutData(data);
-
-		// reschedule
-		rescheduleField = new Button(group, SWT.CHECK);
-		rescheduleField.setText("Reschedule"); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		rescheduleField.setLayoutData(data);
-
-		// keep
-		keepField = new Button(group, SWT.CHECK);
-		keepField.setText("Keep"); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		keepField.setLayoutData(data);
-
-		// keep one
-		keepOneField = new Button(group, SWT.CHECK);
-		keepOneField.setText("KeepOne"); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		keepOneField.setLayoutData(data);
-
-		// IProgressMonitor.UNKNOWN
-		unknownField = new Button(group, SWT.CHECK);
-		unknownField.setText("Indeterminate Progress"); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		unknownField.setLayoutData(data);
-
-		// whether the job is a user job
-		userField = new Button(group, SWT.CHECK);
-		userField.setText("User job"); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		userField.setLayoutData(data);
-
-		// whether the job has a goto action
-		gotoActionField = new Button(group, SWT.CHECK);
-		gotoActionField.setText("Goto action"); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		gotoActionField.setLayoutData(data);
-
-		// whether the job should use a scheduling rule
-		schedulingRuleField = new Button(group, SWT.CHECK);
-		schedulingRuleField.setText("Schedule sequentially"); //$NON-NLS-1$
-		schedulingRuleField
-				.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		// failure
-		failureField = new Button(group, SWT.CHECK);
-		failureField.setText("Fail"); //$NON-NLS-1$
-		failureField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		// failure
-		noPromptField = new Button(group, SWT.CHECK);
-		noPromptField.setText("No Prompt"); //$NON-NLS-1$
-		noPromptField
-				.setToolTipText("Set the IProgressConstants.NO_IMMEDIATE_ERROR_PROMPT_PROPERTY to true");
-		noPromptField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-	}
-
-	protected void doRun(long duration, IProgressMonitor monitor) {
-		final long sleep = 10;
-		int ticks = (int) (duration / sleep);
-		monitor.beginTask(
-				"Spinning inside IProgressService.busyCursorWhile", ticks); //$NON-NLS-1$
-		monitor.setTaskName("Spinning inside IProgressService.busyCursorWhile"); //$NON-NLS-1$
-		for (int i = 0; i < ticks; i++) {
-			monitor.subTask("Processing tick #" + i); //$NON-NLS-1$
-			if (monitor.isCanceled())
-				return;
-			try {
-				Thread.sleep(sleep);
-			} catch (InterruptedException e) {
-				// ignore
-			}
-			monitor.worked(1);
-		}
-	}
-
-	protected void doRunInWorkspace(final long duration,
-			IProgressMonitor monitor) {
-		try {
-			ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
-				public void run(IProgressMonitor monitor) throws CoreException {
-					doRun(duration, monitor);
-				}
-			}, monitor);
-		} catch (CoreException e) {
-			e.printStackTrace();
-		}
-	}
-
-	protected long getDuration() {
-		switch (durationField.getSelectionIndex()) {
-		case 0:
-			return 0;
-		case 1:
-			return 1;
-		case 2:
-			return 1000;
-		case 3:
-			return 10000;
-		case 4:
-			return 60000;
-		case 5:
-		default:
-			return 600000;
-		}
-	}
-
-	protected void jobWithRuntimeException() {
-		Job runtimeExceptionJob = new Job("Job with Runtime exception") { //$NON-NLS-1$
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-			 */
-			protected IStatus run(IProgressMonitor monitor) {
-				throw new NullPointerException();
-			}
-		};
-		runtimeExceptionJob.schedule();
-	}
-
-	/**
-	 * Example usage of the IJobManager.join method.
-	 */
-	protected void joinTestJobs() {
-		try {
-			// note that when a null progress monitor is used when in the UI
-			// thread, the workbench will create a default progress monitor
-			// that reports progress in a modal dialog with details area
-			PlatformUI.getWorkbench().getProgressService().busyCursorWhile(
-					new IRunnableWithProgress() {
-						public void run(IProgressMonitor monitor)
-								throws InterruptedException {
-							Job.getJobManager().join(TestJob.FAMILY_TEST_JOB,
-									monitor);
-						}
-					});
-		} catch (InterruptedException e) {
-			// thrown if the user interrupts the join by canceling the progress
-			// monitor
-			// A UI component should swallow the exception and finish the action
-			// or operation. A lower level component should just propagate the
-			// exception
-			e.printStackTrace();
-		} catch (InvocationTargetException e) {
-			// Thrown when the operation running within busyCursorWhile throws
-			// an
-			// exception. This should either be propagated or displayed to the
-			// user
-			e.printStackTrace();
-		}
-	}
-
-	protected void progressNoFork() {
-		try {
-			final long duration = getDuration();
-			final boolean shouldLock = lockField.getSelection();
-			IProgressService progressService = PlatformUI.getWorkbench()
-					.getProgressService();
-			progressService.runInUI(progressService,
-					new IRunnableWithProgress() {
-						public void run(IProgressMonitor monitor)
-								throws InterruptedException {
-							if (shouldLock)
-								doRunInWorkspace(duration, monitor);
-							else
-								doRun(duration, monitor);
-						}
-					}, ResourcesPlugin.getWorkspace().getRoot());
-		} catch (InvocationTargetException e) {
-			e.printStackTrace();
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @see ViewPart#setFocus()
-	 */
-	public void setFocus() {
-		if (durationField != null && !durationField.isDisposed())
-			durationField.setFocus();
-	}
-
-	protected void touchWorkspace() {
-		// create an asyncExec to touch the workspace the specific number of
-		// times
-		int jobCount = Integer.parseInt(quantityField.getText());
-		for (int i = 0; i < jobCount; i++) {
-			getSite().getShell().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					try {
-						ResourcesPlugin.getWorkspace().run(
-								new IWorkspaceRunnable() {
-									public void run(IProgressMonitor monitor) {
-										// no-op
-									}
-								}, null);
-					} catch (OperationCanceledException e) {
-						// ignore
-					} catch (CoreException e) {
-						e.printStackTrace();
-					}
-				}
-			});
-		}
-	}
-
-	/**
-	 * Run a workspace runnable in the application window.
-	 * 
-	 */
-
-	public void runnableInWindow() {
-
-		final long time = getDuration();
-		final long sleep = 10;
-		IRunnableWithProgress runnableTest = new WorkspaceModifyOperation() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.actions.WorkspaceModifyOperation#execute(org.eclipse.core.runtime.IProgressMonitor)
-			 */
-			protected void execute(IProgressMonitor monitor)
-					throws CoreException, InvocationTargetException,
-					InterruptedException {
-				int ticks = (int) (time / sleep);
-				monitor.beginTask(
-						"Spinning inside ApplicationWindow.run()", ticks); //$NON-NLS-1$
-				monitor.setTaskName("Spinning inside ApplicationWindow.run()"); //$NON-NLS-1$
-				for (int i = 0; i < ticks; i++) {
-					monitor.subTask("Processing tick #" + i); //$NON-NLS-1$
-					if (monitor.isCanceled())
-						return;
-					try {
-						Thread.sleep(sleep);
-					} catch (InterruptedException e) {
-						// ignore
-					}
-					monitor.worked(1);
-				}
-			}
-
-		};
-		try {
-			PlatformUI.getWorkbench().getActiveWorkbenchWindow().run(true,
-					true, runnableTest);
-
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/LazyTreeView.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/LazyTreeView.java
deleted file mode 100644
index 43f74b8..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/LazyTreeView.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.eclipse.ui.examples.jobs.views;
-import org.eclipse.jface.viewers.TreeViewer;
-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.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.part.ViewPart;
-/**
- * This sample class demonstrates how to plug-in a new workbench view. The view
- * shows data obtained from the model. The sample creates a dummy model on the
- * fly, but a real implementation would connect to the model available either
- * in this or another plug-in (e.g. the workspace). The view is connected to
- * the model using a content provider.
- * <p>
- * The view uses a label provider to define how model objects should be
- * presented in the view. Each view can present the same model objects using
- * different labels and icons, if needed. Alternatively, a single label
- * provider can be shared between views in order to ensure that objects of the
- * same type are presented in the same way everywhere.
- * <p>
- */
-public class LazyTreeView extends ViewPart {
-	protected TreeViewer viewer;
-	protected Button serializeButton, batchButton;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite top) {
-		Composite parent = new Composite(top, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		parent.setLayout(layout);
-		GridData data = new GridData(GridData.FILL_BOTH);
-		data.grabExcessHorizontalSpace = true;
-		data.grabExcessVerticalSpace = true;
-		parent.setLayoutData(data);
-//		parent.setBackground(WorkbenchColors.getSystemColor(SWT.COLOR_WHITE));
-		serializeButton = new Button(parent, SWT.CHECK | SWT.FLAT);
-		serializeButton.setText("Serialize fetch jobs"); //$NON-NLS-1$
-//		serializeButton.setBackground(WorkbenchColors.getSystemColor(SWT.COLOR_WHITE));
-		serializeButton.setSelection(SlowElementAdapter.isSerializeFetching());
-		serializeButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				SlowElementAdapter.setSerializeFetching(serializeButton.getSelection());
-			}
-		});
-		serializeButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		batchButton = new Button(parent, SWT.CHECK | SWT.FLAT);
-		batchButton.setText("Batch returned children"); //$NON-NLS-1$
-//		batchButton.setBackground(WorkbenchColors.getSystemColor(SWT.COLOR_WHITE));
-		serializeButton.setSelection(SlowElementAdapter.isBatchFetchedChildren());
-		batchButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				SlowElementAdapter.setBatchFetchedChildren(batchButton.getSelection());
-			}
-		});
-		batchButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		viewer.setContentProvider(new DeferredContentProvider());
-		viewer.setLabelProvider(new WorkbenchLabelProvider());
-		viewer.setInput(new SlowElement("root")); //$NON-NLS-1$
-		viewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
-	}
-	/**
-	 * Passing the focus request to the viewer's control.
-	 */
-	public void setFocus() {
-		viewer.getControl().setFocus();
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/ProgressExampleAdapterFactory.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/ProgressExampleAdapterFactory.java
deleted file mode 100644
index 4ee8a54..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/ProgressExampleAdapterFactory.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.jobs.views;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.ui.progress.IDeferredWorkbenchAdapter;
-
-public class ProgressExampleAdapterFactory implements IAdapterFactory {
-	private SlowElementAdapter slowElementAdapter = new SlowElementAdapter();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
-	 */
-	public Object getAdapter(Object object, Class type) {
-		if(object instanceof SlowElement) {
-			if(type == SlowElement.class || type == IDeferredWorkbenchAdapter.class || type == IWorkbenchAdapter.class)
-				return slowElementAdapter;
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return new Class[] {
-				SlowElement.class, IDeferredWorkbenchAdapter.class, IWorkbenchAdapter.class
-				};
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/SlowElement.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/SlowElement.java
deleted file mode 100644
index e2f2d3a..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/SlowElement.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.jobs.views;
-
-import java.util.*;
-
-import org.eclipse.core.runtime.PlatformObject;
-
-public class SlowElement extends PlatformObject {
-	private String name;
-	private SlowElement parent;
-
-	SlowElement(String name) {
-		this(null, name, null);	
-	}
-	
-	SlowElement(String name, SlowElement[] children) {
-		this(null, name, children);	
-	}
-	
-	SlowElement(SlowElement parent, String name, SlowElement[] children) {
-		this.name = name;
-		this.parent = parent;
-	}
-	
-	public String getName() {
-		return name;
-	}
-	
-	public SlowElement getParent() {
-		return parent;
-	}
-	
-	public SlowElement[] getChildren() {
-		Random r = new Random();
-		int random = r.nextInt(15);
-		List children = new ArrayList();
-		for(int i = 0; i < random; i++) {
-			children.add(new SlowElement("child" + i)); //$NON-NLS-1$
-		}
-		return (SlowElement[]) children.toArray(new SlowElement[children.size()]);
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/SlowElementAdapter.java b/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/SlowElementAdapter.java
deleted file mode 100644
index 9b589cb..0000000
--- a/examples/org.eclipse.ui.examples.job/src/org/eclipse/ui/examples/jobs/views/SlowElementAdapter.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.jobs.views;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.progress.IDeferredWorkbenchAdapter;
-import org.eclipse.ui.progress.IElementCollector;
-
-public class SlowElementAdapter implements IDeferredWorkbenchAdapter {
-
-	private static boolean serializeFetching = false;
-	private static boolean batchFetchedChildren = false;
-
-	final ISchedulingRule mutexRule = new ISchedulingRule() {
-		public boolean isConflicting(ISchedulingRule rule) {
-			return rule == mutexRule;
-		}
-		public boolean contains(ISchedulingRule rule) {
-			return rule == mutexRule;
-		}
-	};
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.progress.IDeferredWorkbenchAdapter#fetchDeferredChildren(java.lang.Object,
-	 *           org.eclipse.jface.progress.IElementCollector,
-	 *           org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void fetchDeferredChildren(Object object, IElementCollector collector, IProgressMonitor monitor) {
-		if (object instanceof SlowElement) {
-			Object[] children = ((SlowElement) object).getChildren();
-			if (isBatchFetchedChildren()) {
-				sleep(4000);
-				collector.add(children, monitor);
-			} else {
-				for (int i = 0; i < children.length; i++) {
-					if (monitor.isCanceled()) {
-						return;
-					}
-					collector.add(children[i], monitor);
-					sleep(4000);
-				}
-			}
-		}
-	}
-
-	private void sleep(long mills) {
-		try {
-			Thread.sleep(1000);
-		} catch (InterruptedException e) {
-			//ignore
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.progress.IDeferredWorkbenchAdapter#isContainer()
-	 */
-	public boolean isContainer() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.progress.IDeferredWorkbenchAdapter#getRule(java.lang.Object)
-	 */
-	public ISchedulingRule getRule(final Object object) {
-		if (isSerializeFetching())
-			return mutexRule;
-		// Allow several SlowElement parents to fetch children concurrently
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(Object object) {
-		if (object instanceof SlowElement) {
-			return ((SlowElement) object).getChildren();
-		}
-		return new Object[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
-	 */
-	public ImageDescriptor getImageDescriptor(Object object) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
-	 */
-	public String getLabel(Object o) {
-		if (o instanceof SlowElement) {
-			return ((SlowElement) o).getName();
-		}
-		return "unknown"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object o) {
-		if (o instanceof SlowElement) {
-			return ((SlowElement) o).getParent();
-		}
-		return null;
-	}
-
-	/**
-	 * @return Returns the batchFetchedChildren.
-	 */
-	public static boolean isBatchFetchedChildren() {
-		return batchFetchedChildren;
-	}
-
-	/**
-	 * @param batchFetchedChildren
-	 *                   The batchFetchedChildren to set.
-	 */
-	public static void setBatchFetchedChildren(boolean batchFetchedChildren) {
-		SlowElementAdapter.batchFetchedChildren = batchFetchedChildren;
-	}
-
-	/**
-	 * @return Returns the serializeFetching.
-	 */
-	public static boolean isSerializeFetching() {
-		return serializeFetching;
-	}
-
-	/**
-	 * @param serializeFetching
-	 *                   The serializeFetching to set.
-	 */
-	public static void setSerializeFetching(boolean serializeFetching) {
-		SlowElementAdapter.serializeFetching = serializeFetching;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.multipageeditor/.classpath b/examples/org.eclipse.ui.examples.multipageeditor/.classpath
deleted file mode 100644
index d6156ef..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="Eclipse UI Examples MultiPageEditor"/>
-	<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/examples/org.eclipse.ui.examples.multipageeditor/.cvsignore b/examples/org.eclipse.ui.examples.multipageeditor/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.multipageeditor/.project b/examples/org.eclipse.ui.examples.multipageeditor/.project
deleted file mode 100644
index 741355f..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/.project
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.examples.multipageeditor</name>
-	<comment></comment>
-	<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/examples/org.eclipse.ui.examples.multipageeditor/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.ui.examples.multipageeditor/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 9fa9102..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,78 +0,0 @@
-#Mon Jan 15 21:15:54 EST 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/examples/org.eclipse.ui.examples.multipageeditor/.settings/org.eclipse.jdt.ui.prefs b/examples/org.eclipse.ui.examples.multipageeditor/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 14ac2d9..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Mon Feb 06 11:16:57 EST 2006
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.2\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template></templates>
diff --git a/examples/org.eclipse.ui.examples.multipageeditor/.settings/org.eclipse.pde.prefs b/examples/org.eclipse.ui.examples.multipageeditor/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index ceb6314..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Jan 10 16:53:58 EST 2006
-compilers.p.deprecated=1
-compilers.p.illegal-att-value=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/examples/org.eclipse.ui.examples.multipageeditor/Eclipse UI Examples MultiPageEditor/org/eclipse/ui/examples/multipageeditor/MessageUtil.java b/examples/org.eclipse.ui.examples.multipageeditor/Eclipse UI Examples MultiPageEditor/org/eclipse/ui/examples/multipageeditor/MessageUtil.java
deleted file mode 100644
index bff85f7..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/Eclipse UI Examples MultiPageEditor/org/eclipse/ui/examples/multipageeditor/MessageUtil.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.multipageeditor;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Utility class which helps with managing messages.
- */
-/* package */class MessageUtil {
-
-    private static final String RESOURCE_BUNDLE = "org.eclipse.ui.examples.multipageeditor.messages";//$NON-NLS-1$
-
-    private static ResourceBundle fgResourceBundle = ResourceBundle
-            .getBundle(RESOURCE_BUNDLE);
-
-    private MessageUtil() {
-        // prevent instantiation of class
-    }
-
-    /**
-     * Returns the formatted message for the given key in
-     * the resource bundle. 
-     *
-     * @param key the resource name
-     * @param args the message arguments
-     * @return the string
-     */
-    public static String format(String key, Object[] args) {
-        return MessageFormat.format(getString(key), args);
-    }
-
-    /**
-     * Returns the resource object with the given key in
-     * the resource bundle. If there isn't any value under
-     * the given key, the key is returned, surrounded by '!'s.
-     *
-     * @param key the resource name
-     * @return the string
-     */
-    public static String getString(String key) {
-        try {
-            return fgResourceBundle.getString(key);
-        } catch (MissingResourceException e) {
-            return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$
-        }
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.multipageeditor/Eclipse UI Examples MultiPageEditor/org/eclipse/ui/examples/multipageeditor/MultiPageContributor.java b/examples/org.eclipse.ui.examples.multipageeditor/Eclipse UI Examples MultiPageEditor/org/eclipse/ui/examples/multipageeditor/MultiPageContributor.java
deleted file mode 100644
index 1da18a2..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/Eclipse UI Examples MultiPageEditor/org/eclipse/ui/examples/multipageeditor/MultiPageContributor.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.multipageeditor;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.ide.IDEActionFactory;
-import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-/**
- * Manages the installation/deinstallation of global actions for multi-page editors.
- * Responsible for the redirection of global actions to the active editor.
- * Multi-page contributor replaces the contributors for the individual editors in the multi-page editor.
- */
-public class MultiPageContributor extends MultiPageEditorActionBarContributor {
-    private IEditorPart activeEditorPart;
-
-    /**
-     * Creates a multi-page contributor.
-     */
-    public MultiPageContributor() {
-        super();
-    }
-
-    /**
-     * Returns the action registed with the given text editor.
-     * @return IAction or null if editor is null.
-     */
-    protected IAction getAction(ITextEditor editor, String actionID) {
-        return (editor == null ? null : editor.getAction(actionID));
-    }
-
-    /* (non-JavaDoc)
-     * Method declared in MultiPageEditorActionBarContributor.
-     */
-    public void setActivePage(IEditorPart part) {
-        if (activeEditorPart == part)
-            return;
-
-        activeEditorPart = part;
-
-        IActionBars actionBars = getActionBars();
-        if (actionBars != null) {
-
-            ITextEditor editor = (part instanceof ITextEditor) ? (ITextEditor) part
-                    : null;
-
-            actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-                    getAction(editor, ActionFactory.DELETE.getId()));
-            actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
-                    getAction(editor, ActionFactory.UNDO.getId()));
-            actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
-                    getAction(editor, ActionFactory.REDO.getId()));
-            actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(),
-                    getAction(editor, ActionFactory.CUT.getId()));
-            actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-                    getAction(editor, ActionFactory.COPY.getId()));
-            actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-                    getAction(editor, ActionFactory.PASTE.getId()));
-            actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
-                    getAction(editor, ActionFactory.SELECT_ALL.getId()));
-            actionBars.setGlobalActionHandler(ActionFactory.FIND.getId(),
-                    getAction(editor, ActionFactory.FIND.getId()));
-            actionBars.setGlobalActionHandler(
-                    IDEActionFactory.BOOKMARK.getId(), getAction(editor,
-                            IDEActionFactory.BOOKMARK.getId()));
-            actionBars.setGlobalActionHandler(
-                    IDEActionFactory.ADD_TASK.getId(), getAction(editor,
-                            IDEActionFactory.ADD_TASK.getId()));
-            actionBars.updateActionBars();
-        }
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.multipageeditor/Eclipse UI Examples MultiPageEditor/org/eclipse/ui/examples/multipageeditor/MultiPageEditorExample.java b/examples/org.eclipse.ui.examples.multipageeditor/Eclipse UI Examples MultiPageEditor/org/eclipse/ui/examples/multipageeditor/MultiPageEditorExample.java
deleted file mode 100644
index ad83804..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/Eclipse UI Examples MultiPageEditor/org/eclipse/ui/examples/multipageeditor/MultiPageEditorExample.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.multipageeditor;
-
-import java.io.StringWriter;
-import java.text.Collator;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.layout.FillLayout;
-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.FontDialog;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.editors.text.TextEditor;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.part.MultiPageEditorPart;
-
-/**
- * An example showing how to create a multi-page editor.
- * This example has 3 pages:
- * <ul>
- * <li>page 0 contains a nested text editor.
- * <li>page 1 allows you to change the font used in page 2
- * <li>page 2 shows the words in page 0 in sorted order
- * </ul>
- */
-public class MultiPageEditorExample extends MultiPageEditorPart implements
-        IGotoMarker {
-
-    /** The text editor used in page 0. */
-    private TextEditor editor;
-
-    /** The index of the page containing the text editor */
-    private int editorIndex = 0;
-
-    /** The font chosen in page 1. */
-    private Font font;
-
-    /** The text widget used in page 2. */
-    private StyledText text;
-
-    /**
-     * Creates a multi-page editor example.
-     */
-    public MultiPageEditorExample() {
-        super();
-    }
-
-    /**
-     * Creates page 0 of the multi-page editor,
-     * which contains a text editor.
-     */
-    void createPage0() {
-        try {
-            editor = new TextEditor();
-            editorIndex = addPage(editor, getEditorInput());
-            setPageText(editorIndex, MessageUtil.getString("Source")); //$NON-NLS-1$
-        } catch (PartInitException e) {
-            ErrorDialog
-                    .openError(
-                            getSite().getShell(),
-                            MessageUtil.getString("ErrorCreatingNestedEditor"), null, e.getStatus()); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Creates page 1 of the multi-page editor,
-     * which allows you to change the font used in page 2.
-     */
-    void createPage1() {
-
-        Composite composite = new Composite(getContainer(), SWT.NONE);
-        GridLayout layout = new GridLayout();
-        composite.setLayout(layout);
-        layout.numColumns = 2;
-
-        Button fontButton = new Button(composite, SWT.NONE);
-        GridData gd = new GridData(GridData.BEGINNING);
-        gd.horizontalSpan = 2;
-        fontButton.setLayoutData(gd);
-        fontButton.setText(MessageUtil.getString("ChangeFont")); //$NON-NLS-1$
-
-        fontButton.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent event) {
-                setFont();
-            }
-        });
-
-        int index = addPage(composite);
-        setPageText(index, MessageUtil.getString("Properties")); //$NON-NLS-1$
-    }
-
-    /**
-     * Creates page 2 of the multi-page editor,
-     * which shows the sorted text.
-     */
-    void createPage2() {
-        Composite composite = new Composite(getContainer(), SWT.NONE);
-        FillLayout layout = new FillLayout();
-        composite.setLayout(layout);
-        text = new StyledText(composite, SWT.H_SCROLL | SWT.V_SCROLL);
-        text.setEditable(false);
-
-        int index = addPage(composite);
-        setPageText(index, MessageUtil.getString("Preview")); //$NON-NLS-1$
-    }
-
-    /**
-     * Creates the pages of the multi-page editor.
-     */
-    protected void createPages() {
-        createPage0();
-        createPage1();
-        createPage2();
-    }
-
-    /**
-     * Saves the multi-page editor's document.
-     */
-    public void doSave(IProgressMonitor monitor) {
-        getEditor(0).doSave(monitor);
-    }
-
-    /**
-     * Saves the multi-page editor's document as another file.
-     * Also updates the text for page 0's tab, and updates this multi-page editor's input
-     * to correspond to the nested editor's.
-     */
-    public void doSaveAs() {
-        IEditorPart editor = getEditor(0);
-        editor.doSaveAs();
-        setPageText(0, editor.getTitle());
-        setInput(editor.getEditorInput());
-    }
-
-    /**
-     * The <code>MultiPageEditorExample</code> implementation of this method
-     * checks that the input is an instance of <code>IFileEditorInput</code>.
-     */
-    public void init(IEditorSite site, IEditorInput editorInput)
-            throws PartInitException {
-        if (!(editorInput instanceof IFileEditorInput))
-            throw new PartInitException(MessageUtil.getString("InvalidInput")); //$NON-NLS-1$
-        super.init(site, editorInput);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IEditorPart.
-     */
-    public boolean isSaveAsAllowed() {
-        return true;
-    }
-
-    /**
-     * Calculates the contents of page 2 when the it is activated.
-     */
-    protected void pageChange(int newPageIndex) {
-        super.pageChange(newPageIndex);
-        if (newPageIndex == 2) {
-            sortWords();
-        }
-    }
-
-    /**
-     * Sets the font related data to be applied to the text in page 2.
-     */
-    void setFont() {
-        FontDialog fontDialog = new FontDialog(getSite().getShell());
-        fontDialog.setFontList(text.getFont().getFontData());
-        FontData fontData = fontDialog.open();
-        if (fontData != null) {
-            if (font != null)
-                font.dispose();
-            font = new Font(text.getDisplay(), fontData);
-            text.setFont(font);
-        }
-    }
-
-    /**
-     * Sorts the words in page 0, and shows them in page 2.
-     */
-    void sortWords() {
-
-        String editorText = editor.getDocumentProvider().getDocument(
-                editor.getEditorInput()).get();
-
-        StringTokenizer tokenizer = new StringTokenizer(editorText,
-                " \t\n\r\f!@#$%^&*()-_=+`~[]{};:'\",.<>/?|\\"); //$NON-NLS-1$
-        ArrayList editorWords = new ArrayList();
-        while (tokenizer.hasMoreTokens()) {
-            editorWords.add(tokenizer.nextToken());
-        }
-
-        Collections.sort(editorWords, Collator.getInstance());
-        StringWriter displayText = new StringWriter();
-        for (int i = 0; i < editorWords.size(); i++) {
-            displayText.write(((String) editorWords.get(i)));
-            displayText.write("\n"); //$NON-NLS-1$
-        }
-        text.setText(displayText.toString());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.ide.IGotoMarker
-     */
-    public void gotoMarker(IMarker marker) {
-        setActivePage(editorIndex);
-        IDE.gotoMarker(editor, marker);
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.multipageeditor/Eclipse UI Examples MultiPageEditor/org/eclipse/ui/examples/multipageeditor/messages.properties b/examples/org.eclipse.ui.examples.multipageeditor/Eclipse UI Examples MultiPageEditor/org/eclipse/ui/examples/multipageeditor/messages.properties
deleted file mode 100644
index 2e5a083..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/Eclipse UI Examples MultiPageEditor/org/eclipse/ui/examples/multipageeditor/messages.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-ErrorCreatingNestedEditor=Error creating nested text editor
-ChangeFont=Change Font...
-InvalidInput=Invalid Input: Must be IFileEditorInput
-Preview=Preview
-Properties=Properties
-Source=Source
diff --git a/examples/org.eclipse.ui.examples.multipageeditor/META-INF/MANIFEST.MF b/examples/org.eclipse.ui.examples.multipageeditor/META-INF/MANIFEST.MF
deleted file mode 100644
index 12aa946..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui.examples.multipageeditor; singleton:=true
-Bundle-Version: 3.2.100.qualifier
-Bundle-ClassPath: multipageeditor.jar
-Bundle-Activator: org.eclipse.core.internal.compatibility.PluginActivator
-Bundle-Vendor: %Plugin.providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.ui.examples.multipageeditor
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.resources,
- org.eclipse.core.runtime.compatibility,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.ui.editors,
- org.eclipse.ui.ide,
- org.eclipse.jface.text,
- org.eclipse.text
-Eclipse-LazyStart: true
diff --git a/examples/org.eclipse.ui.examples.multipageeditor/about.html b/examples/org.eclipse.ui.examples.multipageeditor/about.html
deleted file mode 100644
index 4602330..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.multipageeditor/build.properties b/examples/org.eclipse.ui.examples.multipageeditor/build.properties
deleted file mode 100644
index 9e02f46..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.multipageeditor.jar = Eclipse UI Examples MultiPageEditor/
-
-bin.includes = doc-html/,\
-               icons/,\
-               about.html,\
-               plugin.properties,\
-               plugin.xml,\
-               *.jar,\
-               META-INF/
-
-src.includes = about.html
diff --git a/examples/org.eclipse.ui.examples.multipageeditor/doc-html/hglegal.htm b/examples/org.eclipse.ui.examples.multipageeditor/doc-html/hglegal.htm
deleted file mode 100644
index a41081e..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/doc-html/hglegal.htm
+++ /dev/null
@@ -1,15 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
-   <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/examples/org.eclipse.ui.examples.multipageeditor/doc-html/ui_multipageeditor_ex.html b/examples/org.eclipse.ui.examples.multipageeditor/doc-html/ui_multipageeditor_ex.html
deleted file mode 100644
index 7dad38e..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/doc-html/ui_multipageeditor_ex.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>Desktop - Multi-page Editor Example</title>
-</head>
-<body>
-
-<h2>
-<b>Example - Multi-page Editor</b></h2>
-
-<h3>
-Introduction</h3>
-The&nbsp; Multi Page Editor Example adds an editor for files with the .mpe
-extension. It shows how to create an editor that uses multiple pages by
-defining both an editor and a page contributor that can add entries to
-an action bar.
-<h3>
-Running the example</h3>
-To start using the Multi-page Editor Example, create a new file with .mpe
-extension.&nbsp; Select the file, bring up the popup menu, select the Open
-With menu and from the sub-menu select the Multi Page Editor Example menu
-item. You can then select the different editors by selecting the different
-tabs.
-<h4>
-<b>Creating a new mpe file</b></h4>
-Create a new file with file extension .mpe.&nbsp; From the File menu, select
-New and then select Other... from the sub-menu.&nbsp; Click on Simple in
-the wizard, then select
-<br>File in the list on the left.&nbsp; Click on Next to supply the file
-name (make sure the extension is .mpe) and the folder in which the file
-should be contained.
-<br>&nbsp;
-<h3>
-Details</h3>
-The&nbsp; Multi Page Editor Example demonstrates how to create an multi
-page editor with a custom page contributor.
-<p>The Multi Page Editor Example is constructed with two extensions - a
-document contributor (MultiPageContributor) and an editor (MultiPageEditor).
-The document contributor is a subclass of <tt>org.eclipse.ui.part.MultiPageEditorActionBarContributor</tt>
-and defines the actions that are added to an editor when the <tt>setActivePage</tt>
-method is called. The editor is an <tt>org.eclipse.ui.part.MultiPageEditorPart</tt>
-that creates 3 pages whose activation is handled by the <tt>pageChange</tt>
-method that in turn sends <tt>setActivePage</tt>
-to the contributor. These two classes do not refer to each other directly
-- the contributor for the editor is set using the contributorClass tag
-in the plugin.xml
-
-</body>
-</html>
diff --git a/examples/org.eclipse.ui.examples.multipageeditor/icons/copy.gif b/examples/org.eclipse.ui.examples.multipageeditor/icons/copy.gif
deleted file mode 100644
index f962255..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/icons/copy.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.multipageeditor/plugin.properties b/examples/org.eclipse.ui.examples.multipageeditor/plugin.properties
deleted file mode 100644
index 19e2475..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Plugin.name = Multi-Page Editor Example
-Plugin.providerName = Eclipse.org
-Editors.MultiPageEditorExample = Multi-Page Editor Example
diff --git a/examples/org.eclipse.ui.examples.multipageeditor/plugin.xml b/examples/org.eclipse.ui.examples.multipageeditor/plugin.xml
deleted file mode 100644
index 377e097..0000000
--- a/examples/org.eclipse.ui.examples.multipageeditor/plugin.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-     <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            name="%Editors.MultiPageEditorExample"
-            icon="icons/copy.gif"
-            extensions="mpe"
-            contributorClass="org.eclipse.ui.examples.multipageeditor.MultiPageContributor"
-            class="org.eclipse.ui.examples.multipageeditor.MultiPageEditorExample"
-            id="org.eclipse.ui.examples.multipageeditor.MultiPageEditorExample">
-      </editor>
-   </extension>
-
-</plugin>
diff --git a/examples/org.eclipse.ui.examples.navigator/.classpath b/examples/org.eclipse.ui.examples.navigator/.classpath
deleted file mode 100644
index 7398f97..0000000
--- a/examples/org.eclipse.ui.examples.navigator/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry path="src" kind="src"/>
-	<classpathentry path="org.eclipse.jdt.launching.JRE_CONTAINER" kind="con"/>
-	<classpathentry path="org.eclipse.pde.core.requiredPlugins" kind="con"/>
-	<classpathentry path="bin" kind="output"/>
-</classpath>
diff --git a/examples/org.eclipse.ui.examples.navigator/.project b/examples/org.eclipse.ui.examples.navigator/.project
deleted file mode 100644
index cbc0eeb..0000000
--- a/examples/org.eclipse.ui.examples.navigator/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.examples.navigator</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/examples/org.eclipse.ui.examples.navigator/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.ui.examples.navigator/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index da48a0d..0000000
--- a/examples/org.eclipse.ui.examples.navigator/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,70 +0,0 @@
-#Thu Oct 20 14:37:10 EDT 2005
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.4
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.4
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/examples/org.eclipse.ui.examples.navigator/.settings/org.eclipse.jdt.ui.prefs b/examples/org.eclipse.ui.examples.navigator/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index d2f2d8a..0000000
--- a/examples/org.eclipse.ui.examples.navigator/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Thu Oct 20 14:37:10 EDT 2005
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.2\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/examples/org.eclipse.ui.examples.navigator/.settings/org.eclipse.pde.prefs b/examples/org.eclipse.ui.examples.navigator/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index a052cf0..0000000
--- a/examples/org.eclipse.ui.examples.navigator/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,16 +0,0 @@
-#Sat May 20 14:51:55 EDT 2006
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=0
-compilers.p.illegal-att-value=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/examples/org.eclipse.ui.examples.navigator/META-INF/MANIFEST.MF b/examples/org.eclipse.ui.examples.navigator/META-INF/MANIFEST.MF
deleted file mode 100644
index f75010d..0000000
--- a/examples/org.eclipse.ui.examples.navigator/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,16 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Navigator_Examples
-Bundle-SymbolicName: org.eclipse.ui.examples.navigator;singleton:=true
-Bundle-Version: 3.3.0.qualifier
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.ui.navigator,
- org.eclipse.ui.views,
- org.eclipse.ui,
- org.eclipse.ui.ide,
- org.eclipse.ui.workbench,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.jface.text
-Bundle-Activator: org.eclipse.ui.internal.examples.navigator.Activator
diff --git a/examples/org.eclipse.ui.examples.navigator/about.html b/examples/org.eclipse.ui.examples.navigator/about.html
deleted file mode 100644
index 4602330..0000000
--- a/examples/org.eclipse.ui.examples.navigator/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.navigator/build.properties b/examples/org.eclipse.ui.examples.navigator/build.properties
deleted file mode 100644
index edb0f5e..0000000
--- a/examples/org.eclipse.ui.examples.navigator/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               plugin.properties
-src.includes = about.html
-jars.compile.order = .
-source.. = src/
-output.. = bin/
diff --git a/examples/org.eclipse.ui.examples.navigator/icons/delete_obj.gif b/examples/org.eclipse.ui.examples.navigator/icons/delete_obj.gif
deleted file mode 100644
index b6922ac..0000000
--- a/examples/org.eclipse.ui.examples.navigator/icons/delete_obj.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.navigator/icons/filenav_nav.gif b/examples/org.eclipse.ui.examples.navigator/icons/filenav_nav.gif
deleted file mode 100644
index 4b98a62..0000000
--- a/examples/org.eclipse.ui.examples.navigator/icons/filenav_nav.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.navigator/icons/prop_ps.gif b/examples/org.eclipse.ui.examples.navigator/icons/prop_ps.gif
deleted file mode 100644
index d11c996..0000000
--- a/examples/org.eclipse.ui.examples.navigator/icons/prop_ps.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.navigator/plugin.properties b/examples/org.eclipse.ui.examples.navigator/plugin.properties
deleted file mode 100644
index c9cee89..0000000
--- a/examples/org.eclipse.ui.examples.navigator/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-Navigator_Examples=Common Navigator Examples
-Common_Navigator_Example=Common Navigator Example 
diff --git a/examples/org.eclipse.ui.examples.navigator/plugin.xml b/examples/org.eclipse.ui.examples.navigator/plugin.xml
deleted file mode 100644
index 37b290e..0000000
--- a/examples/org.eclipse.ui.examples.navigator/plugin.xml
+++ /dev/null
@@ -1,174 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <!-- Phase 1 -->
-   <!-- Declare the view part to hold the default implementation --> 
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            id="org.eclipse.ui.examples.navigator.category"
-            name="Common Navigator Examples"/>
-      <view
-            allowMultiple="false"
-            class="org.eclipse.ui.navigator.CommonNavigator"
-            icon="icons/filenav_nav.gif"
-            id="org.eclipse.ui.examples.navigator.view"
-            name="Example View"/>
-   </extension>
-   
-   <!-- Declare the viewer configuration, and the default content/action bindings -->
-   <extension
-         point="org.eclipse.ui.navigator.viewer">
-      <viewer viewerId="org.eclipse.ui.examples.navigator.view">
-         <popupMenu
-                allowsPlatformContributions="true"
-                id="org.eclipse.ui.examples.navigator.view#PopupMenu">  
-             <insertionPoint name="group.new"/>
-             <insertionPoint
-                   name="group.open"
-                   separator="true"/>
-             <insertionPoint name="group.openWith"/>   
-             <insertionPoint name="group.edit"
-                   separator="true"/>   
-             <insertionPoint name="group.reorganize" />         
-             <insertionPoint
-                   name="group.port"
-                   separator="true"/>     
-             <insertionPoint
-                   name="group.build"
-                   separator="true"/> 
-             <insertionPoint
-                   name="group.generate"
-                   separator="true"/> 
-             <insertionPoint
-                   name="group.search"
-                   separator="true"/>              
-             <insertionPoint
-                   name="additions"
-                   separator="true"/>              
-             <insertionPoint
-                   name="group.properties"
-                   separator="true"/>             
-          </popupMenu>
-      </viewer>
-      <viewerContentBinding viewerId="org.eclipse.ui.examples.navigator.view">
-         <includes>
-            <contentExtension pattern="org.eclipse.ui.navigator.resourceContent"/>
-            <contentExtension pattern="org.eclipse.ui.navigator.resources.filters.*"/> 
-            <contentExtension pattern="org.eclipse.ui.examples.navigator.filters.*"/> 
-         </includes>
-      </viewerContentBinding>
-      <viewerActionBinding viewerId="org.eclipse.ui.examples.navigator.view">
-         <includes>
-            <actionExtension pattern="org.eclipse.ui.navigator.resources.*"/>
-         </includes>
-      </viewerActionBinding>
-   </extension>
-   
-   <!-- Declare a simple filter example that uses core expressions -->
-   <extension
-         point="org.eclipse.ui.navigator.navigatorContent">
-      <commonFilter
-            id="org.eclipse.ui.examples.navigator.filters.hideNonJavaProjects"
-            name="Hide non-Java Projects">
-         <filterExpression>
-            <not>
-               <adapt type="org.eclipse.core.resources.IProject">
-                  <test
-                        property="org.eclipse.core.resources.projectNature"
-                        value="org.eclipse.jdt.core.javanature"/>
-               </adapt>
-            </not>
-         </filterExpression>
-      </commonFilter>
-   </extension>
-  
-  <!-- Phase 2 -->
-  <!-- Declare a content extension that renders the contents of a properties file -->
-  <extension
-         point="org.eclipse.ui.navigator.navigatorContent">
-         
-      <navigatorContent 
-            id="org.eclipse.ui.examples.navigator.propertiesContent" 
-            name="Properties File Contents"
-            contentProvider="org.eclipse.ui.examples.navigator.PropertiesContentProvider"
-            labelProvider="org.eclipse.ui.examples.navigator.PropertiesLabelProvider" 
-            activeByDefault="true"
-            icon="icons/prop_ps.gif"
-            priority="normal" >
-         <triggerPoints>
-         	<or>
-	            <and>
-	               <instanceof value="org.eclipse.core.resources.IResource"/>
-	               <test
-	                     forcePluginActivation="true"
-	                     property="org.eclipse.core.resources.extension"
-	                     value="properties"/>
-	            </and>
-				<instanceof value="org.eclipse.ui.examples.navigator.PropertiesTreeData"/>
-			</or>
-         </triggerPoints>
-         <possibleChildren>
-            <or>
-               <instanceof value="org.eclipse.ui.examples.navigator.PropertiesTreeData"/> 
-            </or>
-         </possibleChildren>
-         <actionProvider
-               class="org.eclipse.ui.examples.navigator.actions.PropertyActionProvider"
-               id="org.eclipse.ui.examples.navigator.properties.actions.OpenProvider"/>
-      </navigatorContent>
-   </extension>
-   
-   <!-- Bind the Properties content extension to the viewer -->
-   <extension
-         point="org.eclipse.ui.navigator.viewer">
-      <viewerContentBinding viewerId="org.eclipse.ui.examples.navigator.view">
-         <includes>
-            <contentExtension pattern="org.eclipse.ui.examples.navigator.propertiesContent"/>
-         </includes>
-      </viewerContentBinding>
-   </extension>
-   
-   <!-- Contribute an Object Contribution to delete individual properties in the view -->
-   <extension
-         point="org.eclipse.ui.popupMenus">
-      <objectContribution
-            adaptable="false"
-            id="org.eclipse.ui.examples.navigator.actions.propertiesResource"
-            objectClass="org.eclipse.ui.examples.navigator.PropertiesTreeData">
-         <action
-               class="org.eclipse.ui.examples.navigator.actions.DeletePropertyAction"
-               enablesFor="1"
-               helpContextId="org.eclipse.ui.edit.delete"
-               icon="icons/delete_obj.gif"
-               id="org.eclipse.ui.examples.navigator.actions.deleteProperty"
-               label="Delete Property"
-               menubarPath="group.edit"
-               tooltip="Delete a specific property"/>
-      </objectContribution> 
-   </extension>
-   
-   <!-- 
-   	Bind the Action Provider independently 
-   <extension
-         point="org.eclipse.ui.navigator.navigatorContent">         
-     <actionProvider
-           class="org.eclipse.ui.examples.navigator.actions.PropertyActionProvider"
-           id="org.eclipse.ui.examples.navigator.properties.actions.OpenProvider"/> 
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.navigator.viewer">
-      <viewerActionBinding viewerId="org.eclipse.ui.examples.navigator.view">
-         <includes>
-            <actionExtension 
-            	pattern="org.eclipse.ui.examples.navigator.properties.actions.*"/>
-         </includes>
-      </viewerActionBinding>
-   </extension> 
-   
-   -->
-  
-  
-</plugin>
diff --git a/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/PropertiesContentProvider.java b/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/PropertiesContentProvider.java
deleted file mode 100644
index 8e9ebab..0000000
--- a/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/PropertiesContentProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation.
- * Licensed Material - Property of IBM. All rights reserved.
- * US Government Users Restricted Rights - Use, duplication or disclosure
- * restricted by GSA ADP Schedule Contract with IBM Corp.
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.navigator;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-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.ResourcesPlugin;
-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.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * Provides the properties contained in a *.properties file as children of that
- * file in a Common Navigator.  
- * @since 3.2 
- */
-public class PropertiesContentProvider implements ITreeContentProvider,
-		IResourceChangeListener, IResourceDeltaVisitor {
-  
-	private static final Object[] NO_CHILDREN = new Object[0];
-
-	private static final Object PROPERTIES_EXT = "properties"; //$NON-NLS-1$
-
-	private final Map/*<IFile, PropertiesTreeData[]>*/ cachedModelMap = new HashMap();
-
-	private StructuredViewer viewer;
-	
-	/**
-	 * Create the PropertiesContentProvider instance.
-	 * 
-	 * Adds the content provider as a resource change listener to track changes on disk.
-	 *
-	 */
-	public PropertiesContentProvider() {
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
-	}
-
-	/**
-	 * Return the model elements for a *.properties IFile or
-	 * NO_CHILDREN for otherwise.
-	 */
-	public Object[] getChildren(Object parentElement) {  
-		Object[] children = null;
-		if (parentElement instanceof PropertiesTreeData) { 
-			children = NO_CHILDREN;
-		} else if(parentElement instanceof IFile) {
-			/* possible model file */
-			IFile modelFile = (IFile) parentElement;
-			if(PROPERTIES_EXT.equals(modelFile.getFileExtension())) {				
-				children = (PropertiesTreeData[]) cachedModelMap.get(modelFile);
-				if(children == null && updateModel(modelFile) != null) {
-					children = (PropertiesTreeData[]) cachedModelMap.get(modelFile);
-				}
-			}
-		}   
-		return children != null ? children : NO_CHILDREN;
-	}  
-
-	/**
-	 * Load the model from the given file, if possible.  
-	 * @param modelFile The IFile which contains the persisted model 
-	 */ 
-	private synchronized Properties updateModel(IFile modelFile) { 
-		
-		if(PROPERTIES_EXT.equals(modelFile.getFileExtension()) ) {
-			Properties model = new Properties();
-			if (modelFile.exists()) {
-				try {
-					model.load(modelFile.getContents()); 
-					
-					String propertyName; 
-					List properties = new ArrayList();
-					for(Enumeration names = model.propertyNames(); names.hasMoreElements(); ) {
-						propertyName = (String) names.nextElement();
-						properties.add(new PropertiesTreeData(propertyName,  model.getProperty(propertyName), modelFile));
-					}
-					PropertiesTreeData[] propertiesTreeData = (PropertiesTreeData[])
-						properties.toArray(new PropertiesTreeData[properties.size()]);
-					
-					cachedModelMap.put(modelFile, propertiesTreeData);
-					return model; 
-				} catch (IOException e) {
-				} catch (CoreException e) {
-				}
-			} else {
-				cachedModelMap.remove(modelFile);
-			}
-		}
-		return null; 
-	}
-
-	public Object getParent(Object element) {
-		if (element instanceof PropertiesTreeData) {
-			PropertiesTreeData data = (PropertiesTreeData) element;
-			return data.getFile();
-		} 
-		return null;
-	}
-
-	public boolean hasChildren(Object element) {		
-		if (element instanceof PropertiesTreeData) {
-			return false;		
-		} else if(element instanceof IFile) {
-			return PROPERTIES_EXT.equals(((IFile) element).getFileExtension());
-		}
-		return false;
-	}
-
-	public Object[] getElements(Object inputElement) {
-		return getChildren(inputElement);
-	}
-
-	public void dispose() {
-		cachedModelMap.clear();
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); 
-	}
-
-	public void inputChanged(Viewer aViewer, Object oldInput, Object newInput) {
-		if (oldInput != null && !oldInput.equals(newInput))
-			cachedModelMap.clear();
-		viewer = (StructuredViewer) aViewer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-
-		IResourceDelta delta = event.getDelta();
-		try {
-			delta.accept(this);
-		} catch (CoreException e) { 
-			e.printStackTrace();
-		} 
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-	 */
-	public boolean visit(IResourceDelta delta) {
-
-		IResource source = delta.getResource();
-		switch (source.getType()) {
-		case IResource.ROOT:
-		case IResource.PROJECT:
-		case IResource.FOLDER:
-			return true;
-		case IResource.FILE:
-			final IFile file = (IFile) source;
-			if (PROPERTIES_EXT.equals(file.getFileExtension())) {
-				updateModel(file);
-				new UIJob("Update Properties Model in CommonViewer") {  //$NON-NLS-1$
-					public IStatus runInUIThread(IProgressMonitor monitor) {
-						if (viewer != null && !viewer.getControl().isDisposed())
-							viewer.refresh(file);
-						return Status.OK_STATUS;						
-					}
-				}.schedule();
-			}
-			return false;
-		}
-		return false;
-	} 
-}
diff --git a/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/PropertiesLabelProvider.java b/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/PropertiesLabelProvider.java
deleted file mode 100644
index 2ce582f..0000000
--- a/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/PropertiesLabelProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation.
- * Licensed Material - Property of IBM. All rights reserved.
- * US Government Users Restricted Rights - Use, duplication or disclosure
- * restricted by GSA ADP Schedule Contract with IBM Corp.
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.navigator;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.navigator.IDescriptionProvider;
-
-/**
- * Provides a label and icon for objects of type {@link PropertiesTreeData}. 
- * @since 3.2 
- */
-public class PropertiesLabelProvider extends LabelProvider implements
-		ILabelProvider, IDescriptionProvider {
-  
-
-	public Image getImage(Object element) {
-		if (element instanceof PropertiesTreeData)
-			return PlatformUI.getWorkbench().getSharedImages().getImage(
-					ISharedImages.IMG_OBJS_INFO_TSK); 
-		return null;
-	}
-
-	public String getText(Object element) {
-		if (element instanceof PropertiesTreeData) {
-			PropertiesTreeData data = (PropertiesTreeData) element;
-			return data.getName() + "= " + data.getValue(); //$NON-NLS-1$
-		}  
-		return null;
-	}
-
-	public String getDescription(Object anElement) {
-		if (anElement instanceof PropertiesTreeData) {
-			PropertiesTreeData data = (PropertiesTreeData) anElement;
-			return "Property: " + data.getName(); //$NON-NLS-1$
-		}
-		return null;
-	}
-  
-}
diff --git a/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/PropertiesTreeData.java b/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/PropertiesTreeData.java
deleted file mode 100644
index 60dc4dc..0000000
--- a/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/PropertiesTreeData.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation.
- * Licensed Material - Property of IBM. All rights reserved.
- * US Government Users Restricted Rights - Use, duplication or disclosure
- * restricted by GSA ADP Schedule Contract with IBM Corp.
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.navigator;
-
-import org.eclipse.core.resources.IFile;
-
-/**
- * Provides a simple model of a name=value pair from a *.properties file.
- * 
- * @since 3.2
- */
-public class PropertiesTreeData { 
-
-	private IFile container; 
-	private String name;  
-	private String value;
-
-	/**
-	 * Create a property with the given name and value contained by the given file. 
-	 *  
-	 * @param aName The name of the property.
-	 * @param aValue The value of the property.
-	 * @param aFile The file that defines this property.
-	 */
-	public PropertiesTreeData(String aName, String aValue, IFile aFile) { 
-		name = aName;
-		value = aValue;
-		container = aFile; 
-	} 
- 
-	/**
-	 * The name of this property.
-	 * @return The name of this property.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Return the value of the property in the file.  
-	 * @return The value of the property in the file.
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * The IFile that defines this property.  
-	 * @return The IFile that defines this property.
-	 */
-	public IFile getFile() { 
-		return container;
-	}
-
-	public int hashCode() {
-		return name.hashCode();
-	}
-
-	public boolean equals(Object obj) {
-		return obj instanceof PropertiesTreeData
-				&& ((PropertiesTreeData) obj).getName().equals(name);
-	} 
-
-	public String toString() {
-		StringBuffer toString = 
-				new StringBuffer(getName()).append(":").append(getValue()); //$NON-NLS-1$
-		return toString.toString();
-	}
-
-
-}
diff --git a/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/actions/DeletePropertyAction.java b/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/actions/DeletePropertyAction.java
deleted file mode 100644
index a2cf6b5..0000000
--- a/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/actions/DeletePropertyAction.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.navigator.actions;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Properties;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-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.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionDelegate;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.examples.navigator.PropertiesTreeData;
-import org.eclipse.ui.internal.examples.navigator.Activator;
-
-/**
- * A sample action that can delete a PropertiesTreeData item from a property file. 
- * 
- * @since 3.2
- */
-public class DeletePropertyAction extends ActionDelegate {
-	
-	private IStructuredSelection selection = StructuredSelection.EMPTY;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.ActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection sel) {
-		if(sel instanceof IStructuredSelection)
-			selection = (IStructuredSelection) sel;
-		else 
-			selection = StructuredSelection.EMPTY;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.ActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		  
-		WorkspaceModifyOperation deletePropertyOperation = new WorkspaceModifyOperation() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.ui.actions.WorkspaceModifyOperation#execute(org.eclipse.core.runtime.IProgressMonitor)
-			 */
-			protected void execute(IProgressMonitor monitor) throws CoreException {
-				// In production code, you should always externalize strings, but this is an example.
-				monitor.beginTask("Deleting property from selection", 5); //$NON-NLS-1$ 
-				try {
-					if(selection.size() == 1) {
-						
-						 Object firstElement = selection.getFirstElement();
-						 if(firstElement instanceof PropertiesTreeData) {
-							 PropertiesTreeData data = (PropertiesTreeData) firstElement;
-							 
-							 IFile propertiesFile = data.getFile();
-							 monitor.worked(1);
-							 
-							 if(propertiesFile != null && propertiesFile.isAccessible()) {
-								 
-								 try {
-									// load the model 
-									 Properties properties = new Properties();
-									 properties.load(propertiesFile.getContents());
-									 monitor.worked(1);  
-									 
-									 // delete the property 
-									 properties.remove(data.getName());
-									 monitor.worked(1);
-									 
-									 // persist the model to a temporary storage medium (byte[])
-									 ByteArrayOutputStream output = new ByteArrayOutputStream();
-									 properties.store(output, null);
-									 monitor.worked(1);
-									 
-									 // set the contents of the properties file 
-									 propertiesFile.setContents(
-											 			new ByteArrayInputStream(output.toByteArray()), 
-											 					IResource.FORCE | IResource.KEEP_HISTORY, monitor);
-									 monitor.worked(1);
-								} catch (IOException e) {
-									 // handle error gracefully 
-									Activator.logError(0, "Could not delete property!", e); //$NON-NLS-1$
-									MessageDialog.openError(Display.getDefault().getActiveShell(), 
-							 				"Error Deleting Property",  //$NON-NLS-1$
-							 				"Could not delete property!");   //$NON-NLS-1$
-								}
-									 
-							 } else // shouldn't happen, but handle error condition 
-								 MessageDialog.openError(Display.getDefault().getActiveShell(), 
-										 				"Error Deleting Property",  //$NON-NLS-1$
-										 				"The properties file was not accessible!");   //$NON-NLS-1$
-							 
-						 } else // shouldn't happen, but handle error condition 
-							 MessageDialog.openError(Display.getDefault().getActiveShell(), 
-						 				"Error Deleting Property",  //$NON-NLS-1$
-						 				"The element that was selected was not of the right type.");   //$NON-NLS-1$
-					 } else // shouldn't happen, but handle error condition 
-						 MessageDialog.openError(Display.getDefault().getActiveShell(), 
-					 				"Error Deleting Property",  //$NON-NLS-1$
-					 				"An invalid number of properties were selected.");   //$NON-NLS-1$
-				} finally {
-					monitor.done();
-				}
-			}
-		};		
-		try {
-			PlatformUI.getWorkbench().getProgressService().run(true, false, deletePropertyOperation);
-		} catch (InvocationTargetException e) { 
-			// handle error gracefully			
-			Activator.logError(0, "Could not delete property!", e); //$NON-NLS-1$
-			MessageDialog.openError(Display.getDefault().getActiveShell(), 
-	 				"Error Deleting Property",  //$NON-NLS-1$
-	 				"Could not delete property!");   //$NON-NLS-1$
-		} catch (InterruptedException e) {
-			 // handle error gracefully
-			Activator.logError(0, "Could not delete property!", e); //$NON-NLS-1$
-			MessageDialog.openError(Display.getDefault().getActiveShell(), 
-	 				"Error Deleting Property",  //$NON-NLS-1$
-	 				"Could not delete property!");   //$NON-NLS-1$
-		}
-		 
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/actions/OpenPropertyAction.java b/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/actions/OpenPropertyAction.java
deleted file mode 100644
index 35a8d2d..0000000
--- a/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/actions/OpenPropertyAction.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.navigator.actions;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.FindReplaceDocumentAdapter;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.examples.navigator.PropertiesTreeData;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.examples.navigator.Activator;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-/**
- * @since 3.2
- *
- */
-public class OpenPropertyAction extends Action {
-	
-	private IWorkbenchPage page;
-	private PropertiesTreeData data;
-	private ISelectionProvider provider; 
-
-
-	/**
-	 * Construct the OpenPropertyAction with the given page. 
-	 * @param p The page to use as context to open the editor.
-	 * @param selectionProvider The selection provider 
-	 */
-	public OpenPropertyAction(IWorkbenchPage p, ISelectionProvider selectionProvider) {
-		setText("Open Property"); //$NON-NLS-1$
-		page = p;
-		provider = selectionProvider;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#isEnabled()
-	 */
-	public boolean isEnabled() {
-		ISelection selection = provider.getSelection();
-		if(!selection.isEmpty()) {
-			IStructuredSelection sSelection = (IStructuredSelection) selection;
-			if(sSelection.size() == 1 && 
-			   sSelection.getFirstElement() instanceof PropertiesTreeData) 
-			{
-				data = ((PropertiesTreeData)sSelection.getFirstElement()); 				
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() { 
-		/* In production code, you should always externalize strings, 
-		 * 	but this is an example. */
-		try {
-			if(isEnabled()) {
-				IFile propertiesFile = data.getFile();
-				IEditorPart editor = IDE.openEditor(page, propertiesFile); 
-				
-				if (editor instanceof ITextEditor) {
-					ITextEditor textEditor = (ITextEditor) editor;
-					
-					IDocumentProvider documentProvider = 
-						textEditor.getDocumentProvider();
-					IDocument document = 
-						documentProvider.getDocument(editor.getEditorInput());
-					
-					FindReplaceDocumentAdapter searchAdapter = 
-						new FindReplaceDocumentAdapter(document);
-					
-					try {
-						String searchText = data.getName()+"="; //$NON-NLS-1$ 
-						IRegion region = searchAdapter.find(0, 
-															searchText, 
-															true /* forwardSearch */, 
-															true /* caseSensitive */, 
-															false /* wholeWord */, 
-															false /* regExSearch */); 
-						
-						((ITextEditor)editor).selectAndReveal(region.getOffset(), region.getLength());
-						
-					} catch (BadLocationException e) {
-						Activator.logError(0, "Could not open property!", e); //$NON-NLS-1$
-						MessageDialog.openError(Display.getDefault().getActiveShell(), 
-				 				"Error Opening Property",  //$NON-NLS-1$
-				 				"Could not open property!");   //$NON-NLS-1$
-					}
-					return;
-				}
-			} 
-		} catch (PartInitException e) { 
-			Activator.logError(0, "Could not open property!", e); //$NON-NLS-1$
-			MessageDialog.openError(Display.getDefault().getActiveShell(), 
-	 				"Error Opening Property",  //$NON-NLS-1$
-	 				"Could not open property!");   //$NON-NLS-1$
-		}
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/actions/PropertyActionProvider.java b/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/actions/PropertyActionProvider.java
deleted file mode 100644
index 7b77d54..0000000
--- a/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/examples/navigator/actions/PropertyActionProvider.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.examples.navigator.actions;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionConstants;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-import org.eclipse.ui.navigator.ICommonMenuConstants;
-import org.eclipse.ui.navigator.ICommonViewerSite;
-import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
-
-/**
- * @since 3.2
- *
- */
-public class PropertyActionProvider extends CommonActionProvider {
-	
-	private OpenPropertyAction openAction;
-
-	/**
-	 * Construct Property Action provider.
-	 */
-	public PropertyActionProvider() { 		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.CommonActionProvider#init(org.eclipse.ui.navigator.ICommonActionExtensionSite)
-	 */
-	public void init(ICommonActionExtensionSite aSite) {
-	
-		ICommonViewerSite viewSite = aSite.getViewSite();
-		if(viewSite instanceof ICommonViewerWorkbenchSite) {
-			ICommonViewerWorkbenchSite workbenchSite = 
-				(ICommonViewerWorkbenchSite) viewSite;
-			openAction = 
-				new OpenPropertyAction(workbenchSite.getPage(), 
-										workbenchSite.getSelectionProvider());
-		}
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.ActionGroup#fillActionBars(org.eclipse.ui.IActionBars)
-	 */
-	public void fillActionBars(IActionBars actionBars) { 
-		/* Set up the property open action when enabled. */
-		if(openAction.isEnabled())
-			actionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, openAction);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		if(openAction.isEnabled())
-			menu.appendToGroup(ICommonMenuConstants.GROUP_OPEN, openAction);		
-	}
-	
-	
-}
diff --git a/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/internal/examples/navigator/Activator.java b/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/internal/examples/navigator/Activator.java
deleted file mode 100644
index 02cd914..0000000
--- a/examples/org.eclipse.ui.examples.navigator/src/org/eclipse/ui/internal/examples/navigator/Activator.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.internal.examples.navigator;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class Activator extends AbstractUIPlugin {
-
-	/** The plug-in ID */
-	public static final String PLUGIN_ID = "org.eclipse.ui.examples.navigator"; //$NON-NLS-1$
-	  
-	// The shared instance
-	private static Activator plugin;  
-	/**
-	 * The constructor
-	 */
-	public Activator() {
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context); 
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);  
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static Activator getDefault() {
-		return plugin;
-	} 
-
-	/**
-	 * Record an error against this plugin's log. 
-	 * 
-	 * @param aCode
-	 * @param aMessage
-	 * @param anException
-	 */
-	public static void logError(int aCode, String aMessage,
-			Throwable anException) {
-		getDefault().getLog().log(
-				createErrorStatus(aCode, aMessage, anException));
-	}
-
-	/**
-	 * 
-	 * Record a message against this plugin's log. 
-	 * 
-	 * @param severity
-	 * @param aCode
-	 * @param aMessage
-	 * @param exception
-	 */
-	public static void log(int severity, int aCode, String aMessage,
-			Throwable exception) {
-		log(createStatus(severity, aCode, aMessage, exception));
-	}
-
-	/**
-	 * 
-	 * Record a status against this plugin's log. 
-	 * 
-	 * @param aStatus
-	 */
-	public static void log(IStatus aStatus) {
-		getDefault().getLog().log(aStatus);
-	}
-
-	/**
-	 * Create a status associated with this plugin.
-	 *  
-	 * @param severity
-	 * @param aCode
-	 * @param aMessage
-	 * @param exception
-	 * @return A status configured with this plugin's id and the given parameters.
-	 */
-	public static IStatus createStatus(int severity, int aCode,
-			String aMessage, Throwable exception) {
-		return new Status(severity, PLUGIN_ID, aCode,
-				aMessage != null ? aMessage : "No message.", exception); //$NON-NLS-1$
-	}
-
-	/**
-	 * 
-	 * @param aCode
-	 * @param aMessage
-	 * @param exception
-	 * @return A status configured with this plugin's id and the given parameters.
-	 */
-	public static IStatus createErrorStatus(int aCode, String aMessage,
-			Throwable exception) {
-		return createStatus(IStatus.ERROR, aCode, aMessage, exception);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/.classpath b/examples/org.eclipse.ui.examples.presentation/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/examples/org.eclipse.ui.examples.presentation/.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/examples/org.eclipse.ui.examples.presentation/.cvsignore b/examples/org.eclipse.ui.examples.presentation/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/examples/org.eclipse.ui.examples.presentation/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/examples/org.eclipse.ui.examples.presentation/.project b/examples/org.eclipse.ui.examples.presentation/.project
deleted file mode 100644
index caf64e4..0000000
--- a/examples/org.eclipse.ui.examples.presentation/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.examples.presentation</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/examples/org.eclipse.ui.examples.presentation/BareBonesPresentation.ini b/examples/org.eclipse.ui.examples.presentation/BareBonesPresentation.ini
deleted file mode 100644
index 6cb8033..0000000
--- a/examples/org.eclipse.ui.examples.presentation/BareBonesPresentation.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-# use the Bare-bones presentation style
-org.eclipse.ui/presentationFactoryId=org.eclipse.ui.examples.presentation.barebones
diff --git a/examples/org.eclipse.ui.examples.presentation/WrappedTabsPresentation.ini b/examples/org.eclipse.ui.examples.presentation/WrappedTabsPresentation.ini
deleted file mode 100644
index 30e3cb0..0000000
--- a/examples/org.eclipse.ui.examples.presentation/WrappedTabsPresentation.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-# use the Wrapped-Tabs presentation style
-org.eclipse.ui/presentationFactoryId=org.eclipse.ui.examples.presentation.wrappedtabs
diff --git a/examples/org.eclipse.ui.examples.presentation/about.html b/examples/org.eclipse.ui.examples.presentation/about.html
deleted file mode 100644
index 4602330..0000000
--- a/examples/org.eclipse.ui.examples.presentation/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.presentation/build.properties b/examples/org.eclipse.ui.examples.presentation/build.properties
deleted file mode 100644
index 31f3e08..0000000
--- a/examples/org.eclipse.ui.examples.presentation/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-source.presentation.jar = src/
-output.presentation.jar = bin/
-bin.includes = plugin.xml,\
-               presentation.jar,\
-               icons/
-src.includes = icons/,\
-               src/,\
-               doc/,\
-               plugin.xml
diff --git a/examples/org.eclipse.ui.examples.presentation/eclipsecon2005-presentationsAPI.ppt b/examples/org.eclipse.ui.examples.presentation/eclipsecon2005-presentationsAPI.ppt
deleted file mode 100644
index 6add476..0000000
--- a/examples/org.eclipse.ui.examples.presentation/eclipsecon2005-presentationsAPI.ppt
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.presentation/icons/close_view.gif b/examples/org.eclipse.ui.examples.presentation/icons/close_view.gif
deleted file mode 100644
index 44b6151..0000000
--- a/examples/org.eclipse.ui.examples.presentation/icons/close_view.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.presentation/icons/hide_toolbar.GIF b/examples/org.eclipse.ui.examples.presentation/icons/hide_toolbar.GIF
deleted file mode 100644
index 5858e4a..0000000
--- a/examples/org.eclipse.ui.examples.presentation/icons/hide_toolbar.GIF
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.presentation/icons/max_view.gif b/examples/org.eclipse.ui.examples.presentation/icons/max_view.gif
deleted file mode 100644
index 94ed448..0000000
--- a/examples/org.eclipse.ui.examples.presentation/icons/max_view.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.presentation/icons/min_view.gif b/examples/org.eclipse.ui.examples.presentation/icons/min_view.gif
deleted file mode 100644
index bd2ed2d..0000000
--- a/examples/org.eclipse.ui.examples.presentation/icons/min_view.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.presentation/icons/restore_view.GIF b/examples/org.eclipse.ui.examples.presentation/icons/restore_view.GIF
deleted file mode 100644
index 942d60c..0000000
--- a/examples/org.eclipse.ui.examples.presentation/icons/restore_view.GIF
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.presentation/icons/show_toolbar.GIF b/examples/org.eclipse.ui.examples.presentation/icons/show_toolbar.GIF
deleted file mode 100644
index eda10ab..0000000
--- a/examples/org.eclipse.ui.examples.presentation/icons/show_toolbar.GIF
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.presentation/icons/view_menu.GIF b/examples/org.eclipse.ui.examples.presentation/icons/view_menu.GIF
deleted file mode 100644
index 21ec7f1..0000000
--- a/examples/org.eclipse.ui.examples.presentation/icons/view_menu.GIF
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.presentation/plugin.xml b/examples/org.eclipse.ui.examples.presentation/plugin.xml
deleted file mode 100644
index 18da18c..0000000
--- a/examples/org.eclipse.ui.examples.presentation/plugin.xml
+++ /dev/null
@@ -1,123 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<!-- =================================================================================== -->
-<!-- Presentation Example Manifest						 					                                 -->
-<!-- =================================================================================== -->
-<plugin
-   id="org.eclipse.ui.examples.presentation"
-   name="Presentation Example"
-   version="1.0.7"
-   provider-name="Eclipse.org"
-   class="org.eclipse.ui.examples.presentation.PresentationPlugin">
-
-<!-- =================================================================================== -->
-<!-- Libraries					 					                                 -->
-<!-- =================================================================================== -->
-
-   <runtime>
-      <library name="presentation.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-
-<!-- =================================================================================== -->
-<!-- Imports						 					                                 -->
-<!-- =================================================================================== -->
-  
-<requires>
-  <import plugin="org.eclipse.ui"/>
-  <import plugin="org.eclipse.core.runtime"/>
-</requires>
-
-<!-- =================================================================================== -->
-<!-- Presentation Extensions						 					                                 -->
-<!-- =================================================================================== -->
-
-   <extension
-         point="org.eclipse.ui.presentationFactories">
-      <factory
-            class="org.eclipse.ui.examples.presentation.barebones.BareBonesPresentationFactory"
-            name="Bare-bones presentation"
-            id="org.eclipse.ui.examples.presentation.barebones"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.presentationFactories">
-      <factory
-            class="org.eclipse.ui.examples.presentation.wrappedtabs.WrappedTabsPresentationFactory"
-            name="Wrapped tabs presentation"
-            id="org.eclipse.ui.examples.presentation.wrappedtabs"/>
-   </extension>
-      <extension
-         point="org.eclipse.ui.presentationFactories">
-      <factory
-            class="org.eclipse.ui.internal.presentations.defaultpresentation.NativePresentationFactory"
-            name="Native Tabs"
-            id="org.eclipse.ui.internal.presentations.defaultpresentation.NativePresentationFactory"/>
-      <factory
-            class="org.eclipse.ui.examples.presentation.baretittle.BareTitlePresentationFactory"
-            id="org.eclipse.ui.examples.presentation.factory1"
-            name="Simple Title"/>
-      <factory
-            class="org.eclipse.ui.examples.presentation.sidewinder.SideWinderPresentationFactory"
-            id="org.eclipse.ui.examples.presentation.factory2"
-            name="Side Winder"/>
-   </extension>
-
-<!-- =================================================================================== -->
-<!-- Themes						 					                                 -->
-<!-- =================================================================================== -->
-
-<extension point="org.eclipse.ui.themes">
-	<themeElementCategory
-    	id="org.eclipse.ui.examples.presentation.wrappedtabstheme"
-       	label="WrappedTabs Presentation"/>
-    <categoryPresentationBinding
-            categoryId="org.eclipse.ui.examples.presentation.wrappedtabstheme"
-            presentationId="org.eclipse.ui.examples.presentation.wrappedtabs">
-      </categoryPresentationBinding>
-	<colorDefinition 
-        id="org.eclipse.ui.examples.presentation.wrappedtabstheme.foreground_focus"
-        categoryId="org.eclipse.ui.examples.presentation.wrappedtabstheme"
-        label="Border Color (Focus)"
-        value="COLOR_WIDGET_BORDER">
-        <description>
-        This color is used for the forground color of the stack border when it has focus.
-        </description>
-      </colorDefinition>
-      <colorDefinition 
-        id="org.eclipse.ui.examples.presentation.wrappedtabstheme.foreground_nofocus"
-        categoryId="org.eclipse.ui.examples.presentation.wrappedtabstheme"
-        label="Border Color (No-Focus)"
-        value="COLOR_WIDGET_NORMAL_SHADOW">
-        <description>
-        This color is used for the forground color of the stack border when it doesn't have focus.
-        </description>
-      </colorDefinition>  
-      <fontDefinition
-        id="org.eclipse.ui.examples.presentation.wrappedtabstheme.font"
-        categoryId="org.eclipse.ui.examples.presentation.wrappedtabstheme"        
-        label="Tab Font"
-        defaultsTo="org.eclipse.jface.textfont">
-        <description>
-        This font is used to display the part selection tabs.
-        </description>
-      </fontDefinition>  
-      <data
-       name="org.eclipse.ui.examples.presentation.wrappedtabstheme.bordersize"
-       value="1"/>
-       
-       <theme
-        id="org.eclipse.ui.examples.presentation.wrappedtabstheme.harsh"
-        name="Harsh Wrapped Tabs Theme">
-        <colorOverride
-         id="org.eclipse.ui.examples.presentation.wrappedtabstheme.foreground_focus"
-         value="COLOR_CYAN"/>
-        <colorOverride
-         id="org.eclipse.ui.examples.presentation.wrappedtabstheme.foreground_nofocus"
-         value="COLOR_MAGENTA"/>
-      <data
-           name="org.eclipse.ui.examples.presentation.wrappedtabstheme.bordersize"
-           value="5"/>      
-      </theme> 
-</extension> 
-</plugin>
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/PresentationExamplesPlugin.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/PresentationExamplesPlugin.java
deleted file mode 100644
index 0e21c87..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/PresentationExamplesPlugin.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.eclipse.ui.examples.presentation;
-
-import org.eclipse.ui.plugin.*;
-import org.osgi.framework.BundleContext;
-import java.util.*;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class PresentationExamplesPlugin extends AbstractUIPlugin {
-	//The shared instance.
-	private static PresentationExamplesPlugin plugin;
-	//Resource bundle.
-	private ResourceBundle resourceBundle;
-	
-	/**
-	 * The constructor.
-	 */
-	public PresentationExamplesPlugin() {
-		super();
-		plugin = this;
-		try {
-			resourceBundle = ResourceBundle.getBundle("org.eclipse.ui.examples.presentation.PresentationExamplesPluginResources");
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static PresentationExamplesPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle,
-	 * or 'key' if not found.
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = PresentationExamplesPlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/PresentationImages.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/PresentationImages.java
deleted file mode 100644
index 3f929c8..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/PresentationImages.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-
-
-/**
- * @since 3.0
- */
-public class PresentationImages {	
-	public static final String CLOSE_VIEW = "close_view.gif";
-	public static final String MIN_VIEW = "min_view.gif";
-	public static final String MAX_VIEW = "max_view.gif";
-	public static final String RESTORE_VIEW = "restore_view.gif";
-	public static final String VIEW_MENU = "view_menu.gif";
-	public static final String SHOW_TOOLBAR = "show_toolbar.gif";
-	public static final String HIDE_TOOLBAR = "hide_toolbar.gif";
-	
-	private PresentationImages() {
-	}
-	
-	public static Image getImage(String imageName) {
-		return PresentationPlugin.getDefault().getImage(imageName);
-	}
-	
-	public static ImageDescriptor getImageDescriptor(String imageName) {
-		return PresentationPlugin.getDefault().getImageDescriptor(imageName);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/PresentationPlugin.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/PresentationPlugin.java
deleted file mode 100644
index c11e638..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/PresentationPlugin.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package org.eclipse.ui.examples.presentation;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class PresentationPlugin extends AbstractUIPlugin {
-	//The shared instance.
-	private static PresentationPlugin plugin;
-	//Resource bundle.
-	private ResourceBundle resourceBundle;
-	
-	/**
-	 * The constructor.
-	 */
-	public PresentationPlugin() {
-		super();
-		plugin = this;
-		try {
-			resourceBundle = ResourceBundle.getBundle("org.eclipse.ui.examples.presentation.PresentationPluginResources"); //$NON-NLS-1$
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-	}
-	
-	/**
-	 * Returns the given image. The image will be managed by the plugin's
-	 * image registry.
-	 * 
-	 * @param imageName a pathname relative to the icons directory of
-	 * this project.
-	 */
-	public Image getImage(String imageName) {
-		ImageRegistry reg = getImageRegistry();
-		
-		Image result = reg.get(imageName);
-		
-		if (result != null) {
-			return result;
-		}
-		
-		result = getImageDescriptor(imageName).createImage();
-		
-		reg.put(imageName, result);
-		
-		return result;
-	}
-
-	/**
-	 * Returns the given image descriptor. The caller will be responsible
-	 * for deallocating the image if it creates the image from the descriptor
-	 * 
-	 * @param imageName is a pathname relative to the icons directory 
-	 * within this project.
-	 */
-	public ImageDescriptor getImageDescriptor(String imageName) {		
-		ImageDescriptor desc;
-		try {
-			desc =
-				ImageDescriptor.createFromURL(
-					new URL(
-							plugin.getBundle().getEntry("/"), //$NON-NLS-1$
-							"icons/" + imageName)); //$NON-NLS-1$
-		} catch (MalformedURLException e) {
-			desc = ImageDescriptor.getMissingImageDescriptor();
-		}
-					
-		return desc;
-	}
-	
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static PresentationPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle,
-	 * or 'key' if not found.
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = PresentationPlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/barebones/BareBonesPartPresentation.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/barebones/BareBonesPartPresentation.java
deleted file mode 100644
index 0272339..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/barebones/BareBonesPartPresentation.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.barebones;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-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.ui.presentations.IPresentablePart;
-import org.eclipse.ui.presentations.IStackPresentationSite;
-import org.eclipse.ui.presentations.StackDropResult;
-import org.eclipse.ui.presentations.StackPresentation;
-
-/**
- * Bare-bones stack presentation. The currently selected part fills the entire
- * presentation area, and all other parts are invisible. Does not provide a 
- * system menu, pane menu, trim, drag/drop, toolbars, or any way to switch 
- * parts.
- */
-public class BareBonesPartPresentation extends StackPresentation {
-
-/**
- * Main widget for the presentation
- */
-private Composite presentationControl;
-
-/**
- * Currently selected part
- */
-private IPresentablePart current;
-
-/**
- * Creates a new bare-bones part presentation, given the parent composite and 
- * an IStackPresentationSite interface that will be used to communicate with 
- * the workbench.
- * 
- * @param stackSite interface to the workbench
- */
-public BareBonesPartPresentation(Composite parent, 
-		IStackPresentationSite stackSite) {
-	super(stackSite);		
-	
-	// Create a top-level control for the presentation.
-	presentationControl = new Composite(parent, SWT.NONE);
-	
-	// Add a dispose listener. This will call the presentationDisposed()
-	// method when the widget is destroyed.
-	presentationControl.addDisposeListener(new DisposeListener() {
-		public void widgetDisposed(DisposeEvent e) {
-			presentationDisposed();
-		}
-	});
-}
-
-public void dispose() {
-	// Dispose the main presentation widget. This will cause 
-	// presentationDisposed to be called, which will do the real cleanup.
-	presentationControl.dispose();
-}
-
-/**
- * Perform any cleanup. This method should remove any listeners that were
- * attached to other objects. This gets called when the presentation
- * widget is disposed. This is safer than cleaning up in the dispose() 
- * method, since this code will run even if some unusual circumstance 
- * destroys the Shell without first calling dispose().
- */
-protected void presentationDisposed() {
-	// Remove any listeners that were attached to any IPresentableParts or
-	// global Eclipse resources. This is necessary in order to prevent
-	// memory leaks. Currently, there is nothing to do.
-}
-
-public void setBounds(Rectangle bounds) {
-	// Set the bounds of the presentation widget
-	presentationControl.setBounds(bounds);
-	
-	// Update the bounds of the currently visible part
-	updatePartBounds();
-}
-
-private void updatePartBounds() {
-	if (current != null) {
-		current.setBounds(presentationControl.getBounds());
-	}
-}
-
-public Point computeMinimumSize() {
-	return new Point(16,16);
-}
-
-public void setVisible(boolean isVisible) {
-	
-	// Make the presentation widget visible
-	presentationControl.setVisible(isVisible);
-	
-	// Make the currently visible part visible
-	if (current != null) {
-		current.setVisible(isVisible);
-	}
-
-	if (isVisible) {
-		// Restore the bounds of the currently visible part. 
-		// IPartPresentations can be used by multiple StackPresentations,
-		// although only one such presentation is ever visible at a time.
-		// It is possible that some other presentation has changed the
-		// bounds of the part since it was last visible, so we need to
-		// update the part's bounds when the presentation becomes visible.
-		updatePartBounds();
-	}
-}
-
-public void selectPart(IPresentablePart toSelect) {
-	// Ignore redundant selections
-	if (toSelect == current) {
-		return;
-	}
-	
-	// If there was an existing part selected, make it invisible
-	if (current != null) {
-		current.setVisible(false);
-	}
-	
-	// Select the new part
-	current = toSelect;
-	
-	// Ordering is important here. We need to make the part
-	// visible before updating its bounds, or the call to setBounds
-	// may be ignored.
-	
-	if (current != null) {
-		// Make the newly selected part visible
-		current.setVisible(true);
-	}
-	
-	// Update the bounds of the newly selected part
-	updatePartBounds();
-}
-
-public Control[] getTabList(IPresentablePart part) {
-	return new Control[] {part.getControl()};
-}
-
-public Control getControl() {
-	return presentationControl;
-}
-
-// Methods that don't do anything yet
-public void setActive(int newState) {}
-public void setState(int state) {}
-public void addPart(IPresentablePart newPart, Object cookie) {}
-public void removePart(IPresentablePart oldPart) {}
-public StackDropResult dragOver(Control currentControl, Point location) {return null;}
-public void showSystemMenu() {}
-public void showPaneMenu() {}
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/barebones/BareBonesPresentationFactory.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/barebones/BareBonesPresentationFactory.java
deleted file mode 100644
index 10455e3..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/barebones/BareBonesPresentationFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.barebones;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.presentations.AbstractPresentationFactory;
-import org.eclipse.ui.presentations.IStackPresentationSite;
-import org.eclipse.ui.presentations.StackPresentation;
-
-/**
- * Presentation factory for the bare-bones presentation
- */
-public class BareBonesPresentationFactory extends AbstractPresentationFactory {
-
-	public StackPresentation createEditorPresentation(Composite parent,
-			IStackPresentationSite site) {
-		return new BareBonesPartPresentation(parent, site);
-	}
-
-	public StackPresentation createViewPresentation(Composite parent,
-			IStackPresentationSite site) {
-		return new BareBonesPartPresentation(parent, site);
-	}
-	
-	public StackPresentation createStandaloneViewPresentation(Composite parent,
-			IStackPresentationSite site, boolean showTitle) {
-		return new BareBonesPartPresentation(parent, site);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/baretittle/BareTitlePresentationFactory.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/baretittle/BareTitlePresentationFactory.java
deleted file mode 100644
index 4c26dfe..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/baretittle/BareTitlePresentationFactory.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.baretittle;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.presentations.*;
-
-/**
- * @since 3.0
- */
-public class BareTitlePresentationFactory extends AbstractPresentationFactory {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.presentations.AbstractPresentationFactory#createEditorPresentation(org.eclipse.swt.widgets.Composite, org.eclipse.ui.presentations.IStackPresentationSite)
-	 */
-	public StackPresentation createEditorPresentation(Composite parent,
-			IStackPresentationSite site) {
-		return new WorkbenchPresentationFactory().createEditorPresentation(parent, site);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.presentations.AbstractPresentationFactory#createViewPresentation(org.eclipse.swt.widgets.Composite, org.eclipse.ui.presentations.IStackPresentationSite)
-	 */
-	public StackPresentation createViewPresentation(Composite parent,
-			IStackPresentationSite site) {
-		return new BareTitleStackPresentation(parent, site);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.presentations.AbstractPresentationFactory#createStandaloneViewPresentation(org.eclipse.swt.widgets.Composite, org.eclipse.ui.presentations.IStackPresentationSite, boolean)
-	 */
-	public StackPresentation createStandaloneViewPresentation(Composite parent,
-			IStackPresentationSite site, boolean showTitle) {
-		return new BareTitleStackPresentation(parent, site);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/baretittle/BareTitleStackPresentation.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/baretittle/BareTitleStackPresentation.java
deleted file mode 100644
index a18a0d9..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/baretittle/BareTitleStackPresentation.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.baretittle;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.presentations.*;
-
-public class BareTitleStackPresentation extends StackPresentation {
-
-	private static final String PART_DATA = "part";
-	
-	private static final int TITLE_HEIGHT = 22;
-	
-	private boolean activeFocus = false;
-	
-	/**
-	 * Main widget for the presentation
-	 */
-	private Composite presentationControl;
-	private Composite titleArea;
-	private Composite contentArea;
-	
-	/**
-	 * Currently selected part
-	 */
-	private IPresentablePart current;
-		
-	/**
-	 * close button
-	 */
-	private ToolItem close;
-	
-	/**
-	 * View menu button
-	 */
-	private ToolItem viewMenu;
-	
-	/**
-	 * Minimize button
-	 */
-	private ToolItem minView;
-	
-	private MouseListener mouseListener = new MouseAdapter() {		
-		// If we single-click on an empty space on the toolbar, move focus to the
-		// active control
-		public void mouseDown(MouseEvent e) {
-			if (current != null) {
-				current.setFocus();
-			}
-		}
-	};
-		
-	/** 
-	 * Drag listener for regions outside the toolbar
-	 */
-	Listener dragListener = new Listener() {
-		public void handleEvent(Event event) {
-			Point loc = new Point(event.x, event.y);
-			Control ctrl = (Control)event.widget;
-			
-			getSite().dragStart(ctrl.toDisplay(loc), false);
-		}
-	};
-	
-	public BareTitleStackPresentation(Composite parent, IStackPresentationSite stackSite) {
-		super(stackSite);
-		
-		// Create a top-level control for the presentation.
-		presentationControl = new Composite(parent, SWT.NONE);
-		titleArea = new Composite(presentationControl, SWT.NONE);
-		contentArea = new Composite(presentationControl, SWT.NONE);
-		titleArea.addMouseListener(mouseListener);
-		PresentationUtil.addDragListener(titleArea, dragListener);
-		
-		// Add a dispose listener. This will call the presentationDisposed()
-		// method when the widget is destroyed.
-		presentationControl.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				presentationDisposed();
-			}
-		});
-
-		presentationControl.addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				Rectangle clientArea = presentationControl.getClientArea();			
-				e.gc.setLineWidth(1);				
-				e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_DARK_GRAY));
-				e.gc.drawRectangle(clientArea.x, clientArea.y, clientArea.width-1, clientArea.height-1);
-				Rectangle contentAreaBounds = contentArea.getBounds();
-				int ypos = contentAreaBounds.y - 1;				
-				e.gc.drawLine(clientArea.x, ypos, clientArea.x + clientArea.width - 1, ypos);
-			}			
-		});
-		
-		titleArea.addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				Rectangle titleRect = titleArea.getClientArea();
-				GC gc = e.gc;
-				e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_GRAY));
-				if(activeFocus)
-					e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_BLUE));
-				else 
-					e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_WHITE));
-				e.gc.fillGradientRectangle(titleRect.x, titleRect.y, titleRect.x + titleRect.width, titleRect.y + titleRect.height, true);
-				
-				if(current != null) {
-				int textWidth = titleRect.width - 1;
-				if (textWidth > 0) {
-					Font gcFont = gc.getFont();
-					gc.setFont(presentationControl.getFont());
-					String text = current.getTitle();
-					
-					Point extent = gc.textExtent(text, SWT.DRAW_TRANSPARENT | SWT.DRAW_MNEMONIC);	
-					int textY = titleRect.y + (titleRect.height - extent.y) / 2;
-					
-					if(activeFocus)					
-						gc.setForeground(e.display.getSystemColor(SWT.COLOR_WHITE));
-					else 
-						gc.setForeground(e.display.getSystemColor(SWT.COLOR_BLACK));
-					gc.setFont(JFaceResources.getBannerFont());
-					gc.drawText(text, titleRect.x + 3, textY, SWT.DRAW_TRANSPARENT | SWT.DRAW_MNEMONIC);					
-				}				
-			}
-			}
-		});
-		layout();
-	}
-
-	protected void presentationDisposed() {
-	    // Remove any listeners that were attached to any
-		// global Eclipse resources. This is necessary in order to prevent
-		// memory leaks.
-	}
-	
-	protected int getBorderWidth() {
-		return 1;
-	}
-	
-	public void layout() {
-		// Determine the inner bounds of the presentation
-		Rectangle presentationClientArea = presentationControl.getClientArea();
-		presentationClientArea.x += getBorderWidth();
-		presentationClientArea.width -= getBorderWidth() * 2;
-		presentationClientArea.y += getBorderWidth();
-		presentationClientArea.height -= getBorderWidth() * 2;
-		titleArea.setBounds(presentationClientArea.x, presentationClientArea.y, presentationClientArea.width, presentationClientArea.y + TITLE_HEIGHT);
-		int yy = TITLE_HEIGHT  + 2;
-		contentArea.setBounds(presentationClientArea.x, presentationClientArea.y + yy, presentationClientArea.width, presentationClientArea.height - yy);
-		
-		titleArea.setBackground(titleArea.getDisplay().getSystemColor(SWT.COLOR_DARK_GREEN));
-		contentArea.setBackground(titleArea.getDisplay().getSystemColor(SWT.COLOR_DARK_RED));
-		
-		// Position the view's widgets
-		if (current != null) {
-			Rectangle clientRectangle = contentArea.getBounds();
-			Point clientAreaStart = presentationControl.getParent().toControl(
-					presentationControl.toDisplay(clientRectangle.x, clientRectangle.y));
-			// current isn't parented by this widget hierarchy, the coordinates must be
-			// relative to the workbench window. The workbench window parents every
-			// part.
-			current.setBounds(new Rectangle(clientAreaStart.x, 
-					clientAreaStart.y,
-					clientRectangle.width, 
-					clientRectangle.height));
-		}
-		
-	}
-	
-	public void setBounds(Rectangle bounds) {
-		presentationControl.setBounds(bounds);
-		layout();
-	}
-
-	public void dispose() {
-	}
-
-	public void setActive(int newState) {
-		activeFocus = (newState == AS_ACTIVE_FOCUS);
-		titleArea.redraw();
-	}
-
-	public void setVisible(boolean isVisible) {
-	}
-
-	public void setState(int state) {
-	}
-
-	public Control getControl() {
-		return presentationControl;
-	}
-
-	public void addPart(IPresentablePart newPart, Object cookie) {
-		newPart.setBounds(contentArea.getBounds());
-		this.current = newPart;
-		layout();
-	}
-
-	public void removePart(IPresentablePart oldPart) {
-	}
-
-	public void selectPart(IPresentablePart toSelect) {
-	}
-
-	public StackDropResult dragOver(Control currentControl, Point location) {
-		return null;
-	}
-
-	public void showSystemMenu() {
-	}
-
-	public void showPaneMenu() {
-	}
-
-	public Control[] getTabList(IPresentablePart part) {
-		if(current != null) {
-			return new Control[] {current.getControl()};
-		} else {
-			return new Control[0];
-		}
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/sidewinder/ClosePartContributionItem.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/sidewinder/ClosePartContributionItem.java
deleted file mode 100644
index 9196b36..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/sidewinder/ClosePartContributionItem.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.sidewinder;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.presentations.IPresentablePart;
-
-public class ClosePartContributionItem extends ContributionItem {
-	private SideWinderItemViewPresentation presentation; 
-	
-	private SelectionAdapter selectionListener = new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			presentation.close(new IPresentablePart[] {presentation.getCurrent()});
-		}
-	};
-	
-	public ClosePartContributionItem(SideWinderItemViewPresentation presentation) {
-		this.presentation = presentation;
-	}
-
-    public void dispose() {
-    	super.dispose();
-        presentation = null;
-        selectionListener = null;
-    }
-    
-    public void fill(Menu menu, int index) {
-		MenuItem item = new MenuItem(menu, SWT.NONE, index);
-		item.setText("Close");
-		item.addSelectionListener(selectionListener);
-		
-		IPresentablePart current = presentation.getCurrent();
-		item.setEnabled(current != null);
-    }
-    
-    public boolean isDynamic() {
-        return true;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/sidewinder/PartItem.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/sidewinder/PartItem.java
deleted file mode 100644
index c1cced7..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/sidewinder/PartItem.java
+++ /dev/null
@@ -1,226 +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.ui.examples.presentation.sidewinder;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.*;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.presentations.IPresentablePart;
-
-public class PartItem extends Canvas implements PaintListener {
-
-	private String text;
-	private Image image;
-	private boolean selected;
-	private boolean focus = false;
-	private IPresentablePart part;
-	
-	private static final int VERT_SPACING = 5;
-	private static final int HORIZ_SPACING = 3;
-	
-	int[] SIMPLE_TOP_LEFT_CORNER = new int[] {0,4, 4,0};
-	int[] SIMPLE_TOP_RIGHT_CORNER = new int[] {0,0, 0,0};
-	
-	//static final int[] SIMPLE_TOP_LEFT_CORNER = new int[] {0,2, 1,1, 2,0};
-	//static final int[] SIMPLE_TOP_RIGHT_CORNER = new int[] {-2,0, -1,1, 0,2};
-	
-	static final int[] SIMPLE_BOTTOM_LEFT_CORNER = new int[] {0,-2, 1,-1, 2,0};
-	static final int[] SIMPLE_BOTTOM_RIGHT_CORNER = new int[] {-2,0, -1,-1, 0,-2};
-	private boolean showImage;
-	private boolean showText;
-	
-	public PartItem(Composite parent, IPresentablePart part) {
-		super(parent, SWT.NONE);
-		addPaintListener(this);
-		this.part = part;
-	}
-
-	public void paintControl(PaintEvent e) {
-		Rectangle titleRect = getClientArea();
-		int x = titleRect.x + VERT_SPACING;
-		int y = titleRect.y + HORIZ_SPACING;
-		GC gc = e.gc;
-		setBackground(getParent().getBackground());
-		fill(gc, titleRect.x, titleRect.y, titleRect.width - 1, titleRect.height);
-		
-		Image image = getImage();
-		if (image != null && showImage) {
-			Rectangle imageBounds = image.getBounds();
-				int imageX = x;
-				int imageHeight = imageBounds.height;
-				int imageY = (titleRect.height - imageHeight) / 2;
-				int imageWidth = imageBounds.width * imageHeight / imageBounds.height;
-				gc.drawImage(image, 
-					         imageBounds.x, imageBounds.y, imageBounds.width, imageBounds.height,
-					         imageX, imageY, imageWidth, imageHeight);
-				x += imageWidth + VERT_SPACING;		
-		}
-		
-		int textWidth = titleRect.width - 1;
-		if (textWidth > 0 && text != null && showText) {
-			Font gcFont = gc.getFont();
-			gc.setFont(getFont());
-			Point extent = gc.textExtent(text, SWT.DRAW_TRANSPARENT | SWT.DRAW_MNEMONIC);	
-			int textY = titleRect.y + (titleRect.height - extent.y) / 2;
-			
-			if(selected)					
-				gc.setForeground(e.display.getSystemColor(SWT.COLOR_WHITE));
-			else 
-				gc.setForeground(e.display.getSystemColor(SWT.COLOR_BLACK));
-			gc.setFont(JFaceResources.getDefaultFont());
-			gc.drawText(text, x, textY, SWT.DRAW_TRANSPARENT | SWT.DRAW_MNEMONIC);	
-		}
-		
-	}	
-	
-	public Point computeSize(int wHint, int hHint) {
-		int width = VERT_SPACING; int height = HORIZ_SPACING;
-		GC gc = new GC(this);
-		if(image != null && showImage) {
-			Rectangle imageBounds = image.getBounds();			
-			height = imageBounds.height + HORIZ_SPACING;
-			width += imageBounds.width + VERT_SPACING;
-		}
-		
-		if(text != null && showText) {
-			Point extent = gc.textExtent(text, SWT.DRAW_TRANSPARENT | SWT.DRAW_MNEMONIC);
-			width += extent.x + VERT_SPACING;
-			height = Math.max(height, extent.y) + HORIZ_SPACING;
-		}
-		
-		if (wHint != SWT.DEFAULT) width = wHint;
-		if (hHint != SWT.DEFAULT) height = hHint;
-		gc.dispose();
-		return new Point(width, height);
-	}
-	
-	private void fill(GC gc, int x, int y, int width, int height) {
-		int[] left = SIMPLE_TOP_LEFT_CORNER;
-		int[] right = SIMPLE_TOP_RIGHT_CORNER;
-		int[] shape = new int[left.length + right.length + 4];
-		int index = 0;
-		shape[index++] = x;
-		shape[index++] = y + height + 1;
-		for (int i = 0; i < left.length / 2; i++) {
-			shape[index++] = x + left[2 * i];
-			shape[index++] = y + left[2 * i + 1];
-		}
-		for (int i = 0; i < right.length / 2; i++) {
-			shape[index++] = x + width + right[2 * i];
-			shape[index++] = y + right[2 * i + 1];
-		}
-		shape[index++] = x + width;
-		shape[index++] = y + height + 1;
-		
-		// Fill in background
-		Region clipping = new Region();
-		gc.getClipping(clipping);
-		Region region = new Region();
-		region.add(shape);
-		region.intersect(clipping);
-		gc.setClipping(region);
-		
-		gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_GRAY));
-		
-		Color fg = null;
-		if(part.isDirty())
-			fg = getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY);
-		else if(!selected)
-			fg = getDisplay().getSystemColor(SWT.COLOR_WHITE);
-		//else if(focus)
-			//fg = getDisplay().getSystemColor(SWT.COLOR_BLUE);
-		else 
-			fg = getDisplay().getSystemColor(SWT.COLOR_BLUE);
-		
-		gc.setForeground(fg);
-		
-		gc.fillGradientRectangle(x, y, x + width, y + height, true);
-		//gc.fillRectangle(x, y, x + width, y + height);
-		
-		
-		region.dispose();
-		clipping.dispose();
-		
-		gc.setClipping((Rectangle)null);
-		gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
-		gc.drawPolyline(shape);
-		
-		
-		// Fill in parent background for non-rectangular shape
-		Region r = new Region();
-		r.add(new Rectangle(x, y, width + 1, height + 1));
-		r.subtract(shape);
-		gc.setBackground(getParent().getBackground());
-		//fillRegion(gc, r);
-		r.dispose();
-	}
-	
-	static void fillRegion(GC gc, Region region) {
-		// NOTE: region passed in to this function will be modified
-		Region clipping = new Region();
-		gc.getClipping(clipping);
-		region.intersect(clipping);
-		gc.setClipping(region);
-		gc.fillRectangle(region.getBounds());
-		gc.setClipping(clipping);
-		clipping.dispose();
-	}
-	
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		return computeSize(wHint, hHint);
-	}
-	
-	public void setText(String text) {
-		this.text = text;
-		redraw();
-	}
-	
-	public String getText() {
-		return this.text;
-	}
-	
-	public void setImage(Image image) {
-		this.image = image;
-	}
-	
-	public Image getImage() {
-		return this.image;	
-	}
-	
-	public void setSelected(boolean selected) {
-		this.selected = selected;
-		redraw();
-	}
-	
-	public boolean getSelected() {
-		return this.selected;
-	}
-	
-	public boolean isFocus() {
-		return focus;
-	}
-	
-	public void setFocus(boolean focus) {
-		this.focus = focus;
-	}
-
-	public void setShowImage(boolean showImage) {
-		this.showImage = showImage;
-	}
-
-	public void setShowText(boolean showText) {
-		this.showText = showText;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/sidewinder/SideWinderItemViewPresentation.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/sidewinder/SideWinderItemViewPresentation.java
deleted file mode 100644
index 78a02d5..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/sidewinder/SideWinderItemViewPresentation.java
+++ /dev/null
@@ -1,650 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.sidewinder;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ViewForm;
-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.MouseListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.examples.presentation.wrappedtabs.ProxyControl;
-import org.eclipse.ui.presentations.IPartMenu;
-import org.eclipse.ui.presentations.IPresentablePart;
-import org.eclipse.ui.presentations.IStackPresentationSite;
-import org.eclipse.ui.presentations.PresentationUtil;
-import org.eclipse.ui.presentations.StackDropResult;
-import org.eclipse.ui.presentations.StackPresentation;
-
-public class SideWinderItemViewPresentation extends StackPresentation {
-
-	private static final String PART_DATA = "part";
-	
-	private static final int TITLE_HEIGHT = 22;
-	
-	private boolean activeFocus = false;
-	
-	/**
-	 * Main widget for the presentation
-	 */
-	private Composite presentationControl;
-	private Composite titleArea;
-	private Composite clientArea;
-	private Composite statusLineArea;
-	private ViewForm contentArea;
-	private ProxyControl toolbarProxy;
-	
-	/**
-	 * Currently selected part
-	 */
-	private IPresentablePart current;
-		
-	/**
-	 * close button
-	 */
-	private ToolItem close;
-	
-	/**
-	 * View menu button
-	 */
-	private ToolItem viewMenu;
-	
-	/**
-	 * Minimize button
-	 */
-	private ToolItem minView;
-	
-	
-	private int style = SWT.VERTICAL | SWT.LEFT;
-	
-	private boolean titleAreaHiden = false;
-	
-	/**
-	 * This listener responds to selection events in all tool items.
-	 */
-	private MouseListener mouseListener = new MouseAdapter() {		
-		// If we single-click on an empty space on the toolbar, move focus to the
-		// active control
-		public void mouseDown(MouseEvent e) {
-			PartItem toolItem = (PartItem) e.widget;
-			IPresentablePart item = getPartForTab(toolItem);
-			if (item != null) {
-				// Clicking on the active tab should give focus to the current
-				// part
-				if (item == current) {
-					item.setFocus();
-				}
-				getSite().selectPart(item);
-				selectPart(item);
-				Point toDisplay = toolItem.toDisplay(new Point(e.x, e.y));
-				if (e.button == 3) {
-					showSystemMenu(toDisplay);
-				} else {
-					Image image = toolItem.getImage();
-					if (image != null) {
-						if (image.getBounds().contains(e.x, e.y)) {
-							showPaneMenu(toDisplay);
-						}
-					}
-				}
-			}
-		}
-	};
-	
-	/**
-	 * Listener attached to all child parts. It responds to changes in part properties
-	 */
-	private IPropertyListener childPropertyChangeListener = new IPropertyListener() {
-		public void propertyChanged(Object source, int property) {			
-			if (source instanceof IPresentablePart) {
-				IPresentablePart part = (IPresentablePart) source;				
-				updatePartItem(getPartItem(part), part);
-			}
-		}	
-	};
-	
-	/**
-	 * Listener attached to all tool items. It removes listeners from the associated
-	 * part when the tool item is destroyed. This is required to prevent memory leaks.
-	 */
-	private DisposeListener tabDisposeListener = new DisposeListener() {
-		public void widgetDisposed(DisposeEvent e) {
-			if (e.widget instanceof ToolItem) {
-				PartItem item = (PartItem)e.widget;
-				
-				IPresentablePart part = getPartForTab(item);
-				
-				part.removePropertyListener(childPropertyChangeListener);
-			}
-		}
-	};
-		
-	/** 
-	 * Drag listener for regions outside the toolbar
-	 */
-	Listener dragListener = new Listener() {
-		public void handleEvent(Event event) {
-			Point loc = new Point(event.x, event.y);
-			Control ctrl = (Control)event.widget;
-			
-			getSite().dragStart(ctrl.toDisplay(loc), false);
-		}
-	};
-	
-	private Listener menuListener = new Listener() {
-		public void handleEvent(Event event) {
-			Point globalPos = new Point(event.x, event.y);
-					showSystemMenu(globalPos);
-					return;
-		}
-	};
-
-	private boolean showText;
-
-	private boolean showImage;
-	
-	private MenuManager systemMenuManager= new MenuManager();
-
-	private Listener hideTitleListener = new Listener() {
-
-		public void handleEvent(Event event) {
-			if (!titleAreaHiden) {
-				titleAreaHiden = true;
-				layout();
-			}
-		}
-	};
-	private Listener showTitleListener = new Listener() {
-
-		public void handleEvent(Event event) {
-			if (titleAreaHiden) {
-				titleAreaHiden = false;
-				layout();
-			}
-		}
-	};
-	
-	public SideWinderItemViewPresentation(Composite parent, IStackPresentationSite stackSite, boolean showText, boolean showImage, int style) {
-		super(stackSite);
-		this.showText = showText;
-		this.showImage = showImage;
-		this.style = style;
-		
-		// Create a top-level control for the presentation.
-		presentationControl = new Composite(parent, SWT.NONE);
-		titleArea = new Composite(presentationControl, SWT.NONE);
-		
-		//statusLineArea = new Composite(titleArea, SWT.NONE);
-		//HeapStatusContributionItem item = new HeapStatusContributionItem(PlatformUI.getPreferenceStore());
-		//item.fill(statusLineArea);
-		
-		contentArea = new ViewForm(presentationControl, SWT.NONE);
-		clientArea = new Composite(contentArea, SWT.NONE);
-		clientArea.setVisible(false);
-		
-		contentArea.setContent(clientArea);
-		toolbarProxy = new ProxyControl(contentArea);
-
-		PresentationUtil.addDragListener(titleArea, dragListener);
-		titleArea.addListener(SWT.MenuDetect, menuListener);
-		//titleArea.addListener(SWT.MouseEnter, showTitleListener);
-		//titleArea.addListener(SWT.MouseExit, hideTitleListener);
-		
-		RowLayout rowLayout = new RowLayout ();
-		rowLayout.marginLeft = 0;
-		rowLayout.marginRight = 0;
-		rowLayout.marginTop = 0;
-		rowLayout.marginBottom = 0;
-		rowLayout.type = style;
-		//rowLayout.justify = true;
-		if((style & SWT.VERTICAL) != 0) {
-			rowLayout.fill = true;
-		}
-		rowLayout.spacing = 0;
-		titleArea.setLayout (rowLayout);
-		
-		// Add a dispose listener. This will call the presentationDisposed()
-		// method when the widget is destroyed.
-		presentationControl.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				presentationDisposed();
-			}
-		});
-
-		presentationControl.addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				int borderWidth = getBorderWidth();
-				Rectangle clientArea = presentationControl.getClientArea();			
-				e.gc.setLineWidth(borderWidth);			
-				if(activeFocus)
-					e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_BLUE));
-				else 
-					e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_DARK_GRAY));
-				e.gc.drawRectangle(clientArea.x, clientArea.y, clientArea.width, clientArea.height);
-				Rectangle contentAreaBounds = contentArea.getBounds();
-				int ypos = contentAreaBounds.y - 1;				
-				//e.gc.drawLine(clientArea.x, ypos, clientArea.x + clientArea.width, ypos);
-			}			
-		});			
-		createSystemMenu();
-		update();
-	}
-
-	public IPresentablePart getCurrent() {
-		return current;
-	}
-	
-	protected void presentationDisposed() {
-	    // Remove any listeners that were attached to any
-		// global Eclipse resources. This is necessary in order to prevent
-		// memory leaks.
-	}
-	
-	protected int getBorderWidth() {
-		return 2;
-	}
-	
-	public void showSystemMenu(Point displayPos) {
-		Menu aMenu = systemMenuManager.createContextMenu(titleArea);
-		systemMenuManager.update(true);
-		aMenu.setLocation(displayPos.x, displayPos.y);
-		aMenu.setVisible(true);		
-	}
-	
-	private final void createSystemMenu() {
-		getSite().addSystemActions(systemMenuManager);
-		// This example presentation includes the part list at the end of the system menu
-		systemMenuManager.add(new Separator());
-		systemMenuManager.add(new ClosePartContributionItem(this));
-		systemMenuManager.add(new Separator());
-		
-		
-		Action topAction = new Action("Top", IAction.AS_RADIO_BUTTON) {
-			public void run() {
-				SideWinderItemViewPresentation.this.style = SWT.TOP;
-				setChecked((SideWinderItemViewPresentation.this.style & SWT.TOP) != 0);
-				update();
-			}			
-		};
-		topAction.setChecked((style & SWT.TOP) != 0);
-		systemMenuManager.add(topAction);	
-		
-		Action bottomAction = new Action("Bottom", IAction.AS_RADIO_BUTTON) {
-			public void run() {
-				SideWinderItemViewPresentation.this.style = SWT.BOTTOM;
-				setChecked((SideWinderItemViewPresentation.this.style & SWT.BOTTOM) != 0);
-				update();
-			}			
-		};
-		bottomAction.setChecked((style & SWT.BOTTOM) != 0);
-		systemMenuManager.add(bottomAction);	
-		
-		Action rightAction = new Action("Right", IAction.AS_RADIO_BUTTON) {
-			public void run() {
-				SideWinderItemViewPresentation.this.style = SWT.RIGHT;
-				setChecked((SideWinderItemViewPresentation.this.style & SWT.RIGHT) != 0);
-				update();
-			}			
-		};
-		rightAction.setChecked((style & SWT.RIGHT) != 0);
-		systemMenuManager.add(rightAction);	
-		
-		Action leftAction = new Action("Left", IAction.AS_RADIO_BUTTON) {
-			public void run() {
-				SideWinderItemViewPresentation.this.style = SWT.LEFT;
-				setChecked((SideWinderItemViewPresentation.this.style & SWT.LEFT) != 0);
-				update();
-			}			
-		};		
-		leftAction.setChecked((style & SWT.VERTICAL) != 0);	
-		systemMenuManager.add(leftAction);	
-		
-		systemMenuManager.add(new Separator());
-		Action textAction = new Action("Text", IAction.AS_CHECK_BOX) {
-			public void run() {
-				SideWinderItemViewPresentation.this.showText = isChecked();
-				setChecked(SideWinderItemViewPresentation.this.showText);
-				update();
-			}
-		};
-		textAction.setChecked(showText);
-		systemMenuManager.add(textAction);	
-		Action imageAction = new Action("Image", IAction.AS_CHECK_BOX) {
-			public void run() {
-				SideWinderItemViewPresentation.this.showImage = isChecked();
-				setChecked(isChecked());
-				update();
-			}
-		};
-		imageAction.setChecked(showImage);
-		systemMenuManager.add(imageAction);	
-	}
-	
-	protected void update() {
-		Control[] items = titleArea.getChildren();	
-		for (int idx = 0; idx < items.length; idx++) {
-			if(items[idx] instanceof PartItem) {
-			PartItem item = (PartItem)items[idx];	
-			item.setShowImage(showImage);
-			item.setShowText(showText);
-			item.setFocus(activeFocus);
-			}
-		}
-		int type = SWT.VERTICAL;
-		if ((style & SWT.TOP) != 0 || (style & SWT.BOTTOM) != 0) {
-			type = SWT.HORIZONTAL;
-		}		
-		RowLayout rowLayout = ((RowLayout)titleArea.getLayout());
-		rowLayout.type = type;
-		rowLayout.fill = type == SWT.VERTICAL;
-		
-		layout();
-		presentationControl.redraw();
-		//titleArea.redraw();
-		//titleArea.layout();
-		//contentArea.layout();
-	}
-
-	public void close(IPresentablePart[] parts) {
-		getSite().close(parts);
-	}
-	
-	public void layout() {
-		// Determine the inner bounds of the presentation
-		Rectangle presentationClientArea = presentationControl.getClientArea();
-		presentationClientArea.x += getBorderWidth();
-		presentationClientArea.width -= getBorderWidth() * 2;
-		presentationClientArea.y += getBorderWidth();
-		presentationClientArea.height -= getBorderWidth() * 2;
-		
-		if ((style & SWT.TOP) != 0 || (style & SWT.BOTTOM) != 0) {
-			Point p = titleArea.computeSize(presentationClientArea.width, SWT.DEFAULT);
-			int yy = 0;
-			int x = 0;
-			int y = 0;
-			if((style & SWT.TOP) != 0) {
-				x = presentationClientArea.x;
-				y = presentationClientArea.y;
-				yy = p.y + 1;
-			} else {
-				x = presentationClientArea.x;
-				y = presentationClientArea.height - p.y;
-				yy = presentationClientArea.y;
-			}
-			if(titleAreaHiden)
-				p.y = 3;
-			titleArea.setBounds(x, y, presentationClientArea.width, p.y);
-			contentArea.setBounds(presentationClientArea.x, yy, presentationClientArea.width, presentationClientArea.height - p.y);
-		} else {
-			Point p = titleArea.computeSize(SWT.DEFAULT, presentationClientArea.height);
-			int xx = 0;
-			int x = 0;
-			int y = 0;
-			if((style & SWT.RIGHT) != 0) {
-				x = presentationClientArea.width - p.x;
-				y = presentationClientArea.y;
-				xx = presentationClientArea.x;
-			} else {
-				x = presentationClientArea.x;
-				y = presentationClientArea.y;
-				xx = p.x +1;
-			}	
-			if(titleAreaHiden)
-				p.x = 3;
-			titleArea.setBounds(x, y, p.x, presentationClientArea.height);
-			contentArea.setBounds(xx, presentationClientArea.y, presentationClientArea.width - p.x, presentationClientArea.height);
-		}
-				
-		//Rectangle r = titleArea.getBounds();
-		//Point p = titleArea.computeSize(SWT.DEFAULT, r.height);
-		//statusLineArea.setBounds(r);
-		
-		titleArea.setBackground(titleArea.getDisplay().getSystemColor(SWT.COLOR_GRAY));
-				
-		// Position the view's widgets
-		if (current != null) {
-			Control toolbar = current.getToolBar();
-			if(toolbar != null) {
-				toolbarProxy.setTargetControl(current.getToolBar());
-				contentArea.setTopCenter(toolbarProxy.getControl());
-			} else { 
-				contentArea.setTopCenter(null);
-			}
-			contentArea.layout();
-			
-			Rectangle clientRectangle = clientArea.getBounds();
-			Point clientAreaStart = presentationControl.getParent().toControl(
-					contentArea.toDisplay(clientRectangle.x, clientRectangle.y));
-			// current isn't parented by this widget hierarchy, the coordinates must be
-			// relative to the workbench window. The workbench window parents every
-			// part.
-			current.setBounds(new Rectangle(clientAreaStart.x, 
-					clientAreaStart.y,
-					clientRectangle.width, 
-					clientRectangle.height));
-		}		
-	}
-	
-	public void setBounds(Rectangle bounds) {
-		presentationControl.setBounds(bounds);
-		layout();
-	}
-
-	public void dispose() {
-	}
-
-	public void setActive(int newState) {
-		activeFocus = (newState == AS_ACTIVE_FOCUS);
-		Control[] items = titleArea.getChildren();	
-		for (int idx = 0; idx < items.length; idx++) {
-			if(items[idx] instanceof PartItem) {
-			PartItem item = (PartItem)items[idx];	
-			item.setFocus(activeFocus);
-			}
-		}
-		presentationControl.redraw();
-	}
-
-	public void setVisible(boolean isVisible) {
-		presentationControl.setVisible(isVisible);
-		
-		// Make the currently visible part visible
-		if (current != null) {
-			current.setVisible(isVisible);			
-		}
-
-		if (isVisible) {
-			// Restore the bounds of the currently visible part. 
-			// IPartPresentations can be used by multiple StackPresentations,
-			// although only one such presentation is ever visible at a time.
-			// It is possible that some other presentation has changed the
-			// bounds of the part since it was last visible, so we need to
-			// update the part's bounds when the presentation becomes visible.
-			layout();
-		}
-	}
-
-	public void setState(int state) {
-	}
-
-	public Control getControl() {
-		return presentationControl;
-	}
-
-	public void addPart(IPresentablePart newPart, Object cookie) {
-		// Ignore the cookie for now, since we don't support drag-and-drop yet.
-		PartItem item = new PartItem(titleArea, newPart);
-		
-		// Attach the newPart pointer to the ToolItem. This is used for getPartForTab
-		// to determine which part is associated with the tool item
-		item.setData(PART_DATA, newPart);
-		
-		// Attach a property change listener to the part. This will update the ToolItem
-		// to reflect changes in the part.
-		newPart.addPropertyListener(childPropertyChangeListener);
-		
-		// Attach a dispose listener to the item. This removes the above property
-		// change listener from the part when the item is destroyed. This prevents
-		// memory leaks.
-		item.addDisposeListener(tabDisposeListener);
-		
-		// Listen to selection events in the new tool item
-		item.addMouseListener(mouseListener);
-		
-		PresentationUtil.addDragListener(item, new Listener() {
-			public void handleEvent(Event event) {
-				Point loc = new Point(event.x, event.y);
-				PartItem item = (PartItem)event.widget;
-				if (item != null) {
-				   // Move the current part
-				   IPresentablePart draggedItem = getPartForTab(item);
-				   draggedItem.setFocus();
-				getSite().dragStart(draggedItem, item.toDisplay(loc), false);
-				}
-			}
-		});
-
-		// Initialize the tab for this part
-		updatePartItem(item, newPart);
-			
-		newPart.setBounds(clientArea.getBounds());
-		titleArea.layout();
-		titleArea.redraw();
-		update();		
-	}
-	
-	protected void updatePartItem(PartItem item, IPresentablePart part) {
-		String tabName = part.getTitle();
-		if(item == null) return;
-		if (!tabName.equals(item.getText())) {
-			item.setText(tabName);
-		}
-		
-		if (!(part.getTitleToolTip().equals(item.getToolTipText()))) {
-			item.setToolTipText(part.getTitleToolTip());
-		}
-
-		item.setImage(part.getTitleImage());
-		item.setShowImage(showImage);
-		item.setShowText(showText);
-		titleArea.layout(true);
-		titleArea.redraw();
-		item.redraw();
-	}
-	
-	protected final PartItem getPartItem(IPresentablePart part) {
-		if (!titleArea.isDisposed()) {
-			Control[] items = titleArea.getChildren();
-			for (int idx = 0; idx < items.length; idx++) {
-				Control item = items[idx];
-				if (!item.isDisposed() && getPartForTab(item) == part) {
-					return (PartItem) item;
-				}
-			}
-		}
-		return null;
-	}
-	
-	protected final IPresentablePart getPartForTab(Control item) {
-		return (IPresentablePart)item.getData(PART_DATA);
-	}
-
-	public void removePart(IPresentablePart oldPart) {
-		PartItem item = getPartItem(oldPart);
-		if(item != null) {
-			item.dispose();
-			titleArea.layout();
-			titleArea.redraw();
-		}
-	}
-
-	public void selectPart(IPresentablePart toSelect) {
-		if (toSelect == current) {
-			return;
-		}
-		
-		if(current !=null) {
-			current.setVisible(false);
-		}
-		
-		// Select the new part
-		current = toSelect;
-		
-		// Ordering is important here. We need to make the part
-		// visible before updating its bounds, or the call to setBounds
-		// may be ignored.
-		
-		if (current != null) {
-			// Make the newly selected part visible
-			current.setVisible(true);
-			Control[] items = titleArea.getChildren();
-			for (int idx = 0; idx < items.length; idx++) {
-				if(items[idx] instanceof PartItem) {
-				PartItem item = (PartItem)items[idx];
-				item.setSelected(getPartForTab(item) == current);
-				}
-			}
-		}
-		// Update the bounds of the newly selected part
-		layout();
-	}
-
-	public StackDropResult dragOver(Control currentControl, Point location) {
-		return null;
-	}
-
-	public void showSystemMenu() {
-	}
-
-	public void showPaneMenu() {
-		
-	}
-	
-	public void showPaneMenu(Point location) {
-		if (current == null) {
-			return;
-		}
-		
-		IPartMenu menu = current.getMenu();
-		
-		if (menu == null) {
-			return;
-		}
-
-		menu.showMenu(location);
-	}
-
-	public Control[] getTabList(IPresentablePart part) {
-		if(current != null) {
-			return new Control[] {current.getControl()};
-		} else {
-			return new Control[0];
-		}
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/sidewinder/SideWinderPresentationFactory.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/sidewinder/SideWinderPresentationFactory.java
deleted file mode 100644
index c4ad6fd..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/sidewinder/SideWinderPresentationFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.sidewinder;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.presentations.*;
-
-/**
- * @since 3.0
- */
-public class SideWinderPresentationFactory extends AbstractPresentationFactory {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.presentations.AbstractPresentationFactory#createEditorPresentation(org.eclipse.swt.widgets.Composite, org.eclipse.ui.presentations.IStackPresentationSite)
-	 */
-	public StackPresentation createEditorPresentation(Composite parent,
-			IStackPresentationSite site) {
-		return new SideWinderItemViewPresentation(parent, site, true, true, SWT.HORIZONTAL | SWT.TOP);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.presentations.AbstractPresentationFactory#createViewPresentation(org.eclipse.swt.widgets.Composite, org.eclipse.ui.presentations.IStackPresentationSite)
-	 */
-	public StackPresentation createViewPresentation(Composite parent,
-			IStackPresentationSite site) {
-		return new SideWinderItemViewPresentation(parent, site,  false, true, SWT.HORIZONTAL | SWT.TOP);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.presentations.AbstractPresentationFactory#createStandaloneViewPresentation(org.eclipse.swt.widgets.Composite, org.eclipse.ui.presentations.IStackPresentationSite, boolean)
-	 */
-	public StackPresentation createStandaloneViewPresentation(Composite parent,
-			IStackPresentationSite site, boolean showTitle) {
-		return new SideWinderItemViewPresentation(parent, site, false, true, SWT.HORIZONTAL | SWT.TOP);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/ChangeStackStateContributionItem.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/ChangeStackStateContributionItem.java
deleted file mode 100644
index 7a9310b..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/ChangeStackStateContributionItem.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.wrappedtabs;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.presentations.IStackPresentationSite;
-
-/**
- * Contributions for supporting maximizing, minimizing, and restoring the state of
- * a stack presentation.
- * 
- * @since 3.0
- */
-public class ChangeStackStateContributionItem extends ContributionItem {
-
-	private IStackPresentationSite site;
-	
-	public ChangeStackStateContributionItem(IStackPresentationSite site) {
-		this.site = site;
-	}
-
-    public void dispose() {
-    	super.dispose();
-    }
-    
-    public void fill(Menu menu, int index) {
-		if(site.supportsState(IStackPresentationSite.STATE_MAXIMIZED) && site.getState() != IStackPresentationSite.STATE_MAXIMIZED) {
-			MenuItem item1 = new MenuItem(menu, SWT.PUSH, index);
-			item1.setText("&Maximize");
-			item1.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					site.setState(IStackPresentationSite.STATE_MAXIMIZED);
-				}
-			});
-		}
-		if(site.getState() != IStackPresentationSite.STATE_RESTORED)  {
-			MenuItem item = new MenuItem(menu, SWT.PUSH, index);
-			item.setText("&Restore");
-			item.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					site.setState(IStackPresentationSite.STATE_RESTORED);
-				}
-			});
-		}		
-    }
-    
-	public boolean isDynamic() {
-		return true;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/CloseAllContributionItem.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/CloseAllContributionItem.java
deleted file mode 100644
index bdbf993..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/CloseAllContributionItem.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.wrappedtabs;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-
-/**
- * @since 3.0
- */
-public class CloseAllContributionItem extends ContributionItem {
-	private WrappedTabsPartPresentation presentation; 
-	
-	private SelectionAdapter selectionListener = new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			presentation.close(presentation.getParts());
-		}
-	};
-	
-	public CloseAllContributionItem(WrappedTabsPartPresentation presentation) {
-		this.presentation = presentation;
-	}
-
-    public void dispose() {
-    	super.dispose();
-        presentation = null;
-        selectionListener = null;
-    }
-    
-    public void fill(Menu menu, int index) {
-    	if (presentation.getParts().length > 1) {
-			MenuItem item = new MenuItem(menu, SWT.NONE, index);
-			item.setText("Close all");
-			item.addSelectionListener(selectionListener);
-    	}
-    }
-    
-    public boolean isDynamic() {
-    	// Returning true here ensures that the fill(...) method will be called whenever
-    	// the context menu opens
-        return true;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/CloseContributionItem.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/CloseContributionItem.java
deleted file mode 100644
index 00fa19a..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/CloseContributionItem.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.wrappedtabs;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.presentations.IPresentablePart;
-
-/**
- * @since 3.0
- */
-public class CloseContributionItem extends ContributionItem {
-	private WrappedTabsPartPresentation presentation; 
-	
-	private SelectionAdapter selectionListener = new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			presentation.close(new IPresentablePart[] {presentation.getCurrent()});
-		}
-	};
-	
-	public CloseContributionItem(WrappedTabsPartPresentation presentation) {
-		this.presentation = presentation;
-	}
-
-    public void dispose() {
-    	super.dispose();
-        presentation = null;
-        selectionListener = null;
-    }
-    
-    public void fill(Menu menu, int index) {
-		MenuItem item = new MenuItem(menu, SWT.NONE, index);
-		item.setText("Close");
-		item.addSelectionListener(selectionListener);
-		
-		IPresentablePart current = presentation.getCurrent();
-		item.setEnabled(current != null);
-    }
-    
-    public boolean isDynamic() {
-        return true;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/CloseOthersContributionItem.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/CloseOthersContributionItem.java
deleted file mode 100644
index 3be37ea..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/CloseOthersContributionItem.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.wrappedtabs;
-
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.presentations.IPresentablePart;
-
-/**
- * @since 3.0
- */
-public class CloseOthersContributionItem extends ContributionItem {
-	private WrappedTabsPartPresentation presentation; 
-	
-	private SelectionAdapter selectionListener = new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			IPresentablePart current = presentation.getCurrent();
-			List parts = Arrays.asList(presentation.getParts());
-			List otherParts = new LinkedList();
-			otherParts.addAll(parts);
-			otherParts.remove(current);
-			presentation.close((IPresentablePart[]) otherParts.toArray(new IPresentablePart[otherParts.size()]));
-		}
-	};
-	
-	public CloseOthersContributionItem(WrappedTabsPartPresentation presentation) {
-		this.presentation = presentation;
-	}
-
-    public void dispose() {
-    	super.dispose();
-        presentation = null;
-        selectionListener = null;
-    }
-    
-    public void fill(Menu menu, int index) {
-    	if (presentation.getParts().length > 1) {
-			MenuItem item = new MenuItem(menu, SWT.NONE, index);
-			item.setText("Close others");
-			item.addSelectionListener(selectionListener);
-			
-			IPresentablePart current = presentation.getCurrent();
-			item.setEnabled(current != null);
-    	}
-    }
-    
-    public boolean isDynamic() {
-        return true;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/PartListContributionItem.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/PartListContributionItem.java
deleted file mode 100644
index 52ae5c5..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/PartListContributionItem.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.wrappedtabs;
-
-import java.util.Arrays;
-import java.util.Comparator;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.presentations.IPresentablePart;
-import org.eclipse.ui.presentations.IStackPresentationSite;
-
-/**
- * @since 3.0
- */
-public class PartListContributionItem extends ContributionItem {
-	private WrappedTabsPartPresentation presentation;
-	private IStackPresentationSite site;
-	
-	private static final String DATA_ITEM = "org.eclipse.ui.examples.presentation.wrappedtabs.PartListContributionItem.DATA_ITEM"; 
-	
-	private SelectionAdapter selectionListener = new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			MenuItem item = (MenuItem)e.widget;
-			
-			IPresentablePart part = (IPresentablePart)item.getData(DATA_ITEM);
-			
-			if (part != null) {
-				site.selectPart(part);
-			}
-		}
-	};
-	
-	public PartListContributionItem(WrappedTabsPartPresentation presentation, IStackPresentationSite site) {
-		this.presentation = presentation;
-		this.site = site;
-	}
-
-    public void dispose() {
-    	super.dispose();
-        presentation = null;
-        site = null;
-        selectionListener = null;
-    }
-    
-    public void fill(Menu menu, int index) {
-    	IPresentablePart[] parts = presentation.getParts();
-    	
-    	// Don't include a part list if there's only one part
-    	if (parts.length <= 1) {
-    		return;
-    	}
-    	
-    	new MenuItem(menu, SWT.SEPARATOR, index++);
-    	
-    	Arrays.sort(parts, new Comparator() {
-			public int compare(Object arg0, Object arg1) {
-				IPresentablePart part0 = (IPresentablePart)arg0;
-				IPresentablePart part1 = (IPresentablePart)arg1;
-				
-				return part0.getName().compareToIgnoreCase(part1.getName());
-			}
-    	});
-    	
-    	for (int i = 0; i < parts.length; i++) {
-			IPresentablePart part = parts[i];
-			
-			MenuItem item = new MenuItem(menu, SWT.NONE, index++);
-			item.setText(part.getName());
-			item.setImage(part.getTitleImage());
-			item.addSelectionListener(selectionListener);
-			item.setData(DATA_ITEM, part);
-		}
-    }
-    
-    public boolean isDynamic() {
-        return true;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/ProxyControl.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/ProxyControl.java
deleted file mode 100644
index b9fbf3f..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/ProxyControl.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.wrappedtabs;
-
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.swt.SWT;
-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.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.internal.dnd.DragUtil;
-import org.eclipse.ui.internal.dnd.SwtUtil;
-
-/**
- * A ProxyControl is an invisible control whose size and position are linked
- * with some target control. That is, when the dummy control is asked for its
- * preferred size it returns the preferred size of the target. Changing the
- * bounds of the dummy control also changes the bounds of the target. This allows 
- * any Composite to lay out a control that isn't one of its children.
- * 
- * <p>
- * For example, imagine you have a ViewForm and a ToolBar that share the same parent
- * and you want the ToolBar to be located in the upper-right corner of the ViewForm.
- * If the ToolBar were a child of the ViewForm, this could be done easily by calling
- * viewForm.setTopRight(toolBar). However, this is impossible since ViewForm.setTopRight
- * will only accept a child control. Instead, we create a ProxyControl as a child
- * of the viewForm, and set the toolbar as its target. The ViewForm will treat
- * the ProxyControl just like any other child, but it will actually be arranging the
- * ToolBar. 
- * </p>
- * <p>For example:
- * </p>
- * <code>
- *      // Create a ViewForm and a ToolBar that are siblings
- * 		ViewForm viewForm = new ViewForm(parent, SWT.NONE);
- * 		ToolBar toolBar = new ToolBar(parent, SWT.NONE);
- * 
- *      // Allow the ViewForm to control the position of the ToolBar by creating
- *      // a ProxyControl in the ViewForm that targets the ToolBar.
- * 		ProxyControl toolBarProxy = new ProxyControl(viewForm);
- * 		toolBarProxy.setTarget(toolBar);
- * 		viewForm.setTopRight(toolBarProxy.getControl());
- * </code>
- * 
- * <p>
- * This is intended to simplify management of view toolbars in the presentation API.
- * Presentation objects have no control over where the view toolbars are created in
- * the widget hierarchy, but they may wish to control the position of the view toolbars
- * using traditional SWT layouts and composites. 
- * </p>
- */
-public class ProxyControl {
-    
-    /**
-     * Invisible dummy control 
-     */
-	private Composite control;
-	
-	/**
-	 * Target control (possibly null)
-	 */
-	private Control target;
-	
-	/**
-	 * Most specific common ancestor between the target and the proxy controls
-	 */
-	private Control commonAncestor;
-	
-	/**
-	 * Visibility state of the proxy control the last time it had a non-null target.
-	 * Note: when the target is set to null, we force the proxy to become invisible
-	 * and use this variable to remember the initial state when we get a new non-null
-	 * target.
-	 */
-	private boolean visible = true;
-	
-	/**
-	 * Dispose listener. Breaks the link between the target and the proxy if either
-	 * control is disposed.
-	 */
-	private DisposeListener disposeListener = new DisposeListener() {
-		public void widgetDisposed(DisposeEvent e) {
-			if (e.widget == target || e.widget == control) {
-				setTargetControl(null);
-			}
-		}
-	};
-	
-	private Listener visibilityListener = new Listener() {
-
-        public void handleEvent(Event event) {
-            if (target != null) {
-                visible = control.getVisible();
-                target.setVisible(visible);
-            }
-        }
-	    
-	};
-	
-	/**
-	 * Movement listener. Updates the bounds of the target to match the 
-	 * bounds of the dummy control.
-	 */
-	private ControlListener controlListener = new ControlListener() {
-
-		public void controlMoved(ControlEvent e) {
-			ProxyControl.this.layout();
-		}
-
-		public void controlResized(ControlEvent e) {
-		    //if (e.widget == control) {
-		     //   ProxyControl.this.layout();
-		    //}
-		}
-		
-	};
-	
-	/**
-	 * Creates a new ProxyControl as a child of the given parent. This is an invisible dummy
-	 * control. If given a target, the ProxyControl will update the bounds of the target to
-	 * match the bounds of the dummy control.
-	 * 
-	 * @param parent parent composite
-	 */
-	public ProxyControl(Composite parent) {
-	    // Create the invisible dummy composite
-		control = new Composite(parent, SWT.NO_BACKGROUND);
-		control.setVisible(false);
-		
-		// Attach a layout to the dummy composite. This is used to make the preferred
-		// size of the dummy match the preferred size of the target.
-		control.setLayout(new Layout() {
-			protected void layout (Composite composite, boolean flushCache) {
-			    ProxyControl.this.layout();
-			    // does nothing. The bounds of the target are updated by the controlListener
-			}
-			
-			protected Point computeSize (Composite composite, int wHint, int hHint, boolean flushCache) {
-				if (target == null) {
-				    // Note: If we returned (0,0), SWT would ignore the result and use a default value.
-					return new Point(1,1);
-				}
-				
-				return target.computeSize(wHint, hHint);
-			}
-		});
-		
-		// Attach listeners to the dummy
-		control.addDisposeListener(disposeListener);
-		control.addListener(SWT.Show, visibilityListener);
-		control.addListener(SWT.Hide, visibilityListener);
-	}
-	
-	/**
-	 * Sets the control whose position will be managed by this proxy
-	 * 
-	 * @param target the control, or null if none
-	 */
-	public void setTargetControl(Control target) {
-		if (this.target != target) {
-
-		    if (this.target != null) {
-		        for (Control next = control; next != commonAncestor && next != null; next = next.getParent()) {
-		            next.removeControlListener(controlListener);
-		        }
-		        commonAncestor = null;
-		        
-			    // If we already had a target, detach the dispose listener 
-			    // (prevents memory leaks due to listeners)
-				if (!this.target.isDisposed()) {
-					this.target.removeDisposeListener(disposeListener);
-				}				
-		    }
-			
-			if (this.target == null && target != null) {
-			    // If we had previously forced the dummy control invisible, restore its visibility
-			    control.setVisible(visible);
-			}
-			
-			this.target = target;
-			
-			if (target != null) {
-			    commonAncestor = SwtUtil.findCommonAncestor(this.target, control);
-		        for (Control next = control; next != null && next != commonAncestor; next = next.getParent()) {
-		            next.addControlListener(controlListener);
-		        }
-			    
-			    // Make the new target's visiblity match the visibility of the dummy control
-			    target.setVisible(control.getVisible());
-				// Add a dispose listener. Ensures that the target is cleared
-				// if it is ever disposed.
-				target.addDisposeListener(disposeListener);
-			} else {
-			    control.setVisible(false);
-			}
-		}
-	}
-	
-	/**
-	 * Returns the target control (the control whose size is being managed)
-	 * 
-	 * @return the target control (or null)
-	 */
-	public Control getTargetControl() {
-		if (target == null) {
-			return null;
-		}
-		
-		return target;
-	}
-	
-	/**
-	 * Returns the proxy control
-	 * 
-	 * @return the proxy control (not null)
-	 */
-	public Control getControl() {
-		return control;
-	}
-	
-	public Control getTarget() {
-	    return target;
-	}
-	
-	/**
-	 * Moves the target control on top of the dummy control.
-	 */
-	public void layout() {
-		if (getTargetControl() == null) {
-			return;
-		}
-		
-		// Compute the unclipped bounds of the target in display coordinates
-		Rectangle displayBounds = Geometry.toDisplay(control.getParent(), control.getBounds());
-		
-		// Clip the bounds of the target so that it doesn't go outside the dummy control's parent
-		Rectangle clippingRegion = DragUtil.getDisplayBounds(control.getParent());
-		displayBounds = displayBounds.intersection(clippingRegion);
-		
-		// Compute the bounds of the target, in the local coordinate system of its parent
-		Rectangle targetBounds = Geometry.toControl(getTargetControl().getParent(), displayBounds);
-		
-		// Move the target
-		getTargetControl().setBounds(targetBounds);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/ShowToolbarContributionItem.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/ShowToolbarContributionItem.java
deleted file mode 100644
index 299de04..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/ShowToolbarContributionItem.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.wrappedtabs;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.presentations.IPresentablePart;
-
-/**
- * @since 3.0
- */
-public class ShowToolbarContributionItem extends ContributionItem {
-	private WrappedTabsPartPresentation presentation;
-	
-	private static final String DATA_ITEM = "org.eclipse.ui.examples.presentation.wrappedtabs.PartListContributionItem.DATA_ITEM"; 
-	
-	private SelectionAdapter selectionListener = new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			presentation.showToolbar(((MenuItem)e.widget).getSelection());
-		}
-	};
-	
-	public ShowToolbarContributionItem(WrappedTabsPartPresentation presentation) {
-		this.presentation = presentation;
-	}
-
-    public void dispose() {
-    	super.dispose();
-        presentation = null;
-        selectionListener = null;
-    }
-    
-    public void fill(Menu menu, int index) {
-		MenuItem item = new MenuItem(menu, SWT.CHECK, index);
-		item.setText("S&how toolbar");
-		item.addSelectionListener(selectionListener);
-		item.setSelection(presentation.isShowingToolbar());
-		
-		IPresentablePart current = presentation.getCurrent();
-		item.setEnabled(current != null && current.getToolBar() != null);
-    }
-    
-    public boolean isDynamic() {
-        return true;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/WrappedTabsPartPresentation.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/WrappedTabsPartPresentation.java
deleted file mode 100644
index 0790f20..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/WrappedTabsPartPresentation.java
+++ /dev/null
@@ -1,1116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.wrappedtabs;
-
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ViewForm;
-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.MouseListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.examples.presentation.PresentationImages;
-import org.eclipse.ui.presentations.IPartMenu;
-import org.eclipse.ui.presentations.IPresentablePart;
-import org.eclipse.ui.presentations.IPresentationSerializer;
-import org.eclipse.ui.presentations.IStackPresentationSite;
-import org.eclipse.ui.presentations.PresentationUtil;
-import org.eclipse.ui.presentations.StackDropResult;
-import org.eclipse.ui.presentations.StackPresentation;
-import org.eclipse.ui.themes.ITheme;
-
-/**
- * @since 3.0
- */
-public class WrappedTabsPartPresentation extends StackPresentation {
-
-	private static class DropLocation {
-		int insertionPosition = 0;
-		IPresentablePart part;
-		boolean before;
-	}
-	
-	private static final String PART_DATA = "part";
-	
-	private boolean activeFocus = false;
-	
-	/**
-	 * Main widget for the presentation
-	 */
-	private Composite presentationControl;
-	
-	/**
-	 * Currently selected part
-	 */
-	private IPresentablePart current;
-	
-	/**
-	 * ToolBar that will be used to select the active presentable part 
-	 */
-	private ToolBar toolBar;
-	
-	/**
-	 * ToolBar that will contain close, minimize, etc.
-	 */
-	private ToolBar upperRight;
-	
-	/**
-	 * close button
-	 */
-	private ToolItem close;
-	
-	/**
-	 * View menu button
-	 */
-	private ToolItem viewMenu;
-	
-	/**
-	 * Minimize button
-	 */
-	private ToolItem minView;
-
-	/**
-	 * Show/hide toolbar button
-	 */
-	private ToolItem showToolbar;
-	
-	private ToolBar titleIconToolbar;
-	
-	/**
-	 * Title icon
-	 */
-	private ToolItem titleIcon;
-	
-	private MenuManager systemMenuManager = new MenuManager();
-	private ViewForm contentArea;
-	
-	private Label contentDescription;
-	private Composite contentDescriptionWrapper;
-	
-	private Composite clientArea;
-	
-	private ProxyControl toolbarProxy;
-	
-	/**
-	 * Listener attached to all child parts. It responds to changes in part properties
-	 */
-	private IPropertyListener childPropertyChangeListener = new IPropertyListener() {
-		public void propertyChanged(Object source, int property) {
-			
-			if (source instanceof IPresentablePart) {
-				IPresentablePart part = (IPresentablePart) source;
-				
-				childPropertyChanged(part, property);
-			}
-		}	
-	};
-
-	/** 
-	 * Drag listener for regions outside the toolbar
-	 */
-	Listener dragListener = new Listener() {
-		public void handleEvent(Event event) {
-			Point loc = new Point(event.x, event.y);
-			Control ctrl = (Control)event.widget;
-			
-			getSite().dragStart(ctrl.toDisplay(loc), false);
-		}
-	};
-	
-	/**
-	 * Listener attached to all tool items. It removes listeners from the associated
-	 * part when the tool item is destroyed. This is required to prevent memory leaks.
-	 */
-	private DisposeListener tabDisposeListener = new DisposeListener() {
-		public void widgetDisposed(DisposeEvent e) {
-			if (e.widget instanceof ToolItem) {
-				ToolItem item = (ToolItem)e.widget;
-				
-				IPresentablePart part = getPartForTab(item);
-				
-				part.removePropertyListener(childPropertyChangeListener);
-			}
-		}
-	};
-	
-	/**
-	 * This listener responds to selection events in all tool items.
-	 */
-	SelectionAdapter tabItemSelectionAdapter = new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			ToolItem toolItem = (ToolItem) e.widget;
-			IPresentablePart item = getPartForTab(toolItem);
-			if (item != null) {
-				// Clicking on the active tab should give focus to the current part
-				if (item == current) {
-					item.setFocus();
-				}
-				getSite().selectPart(item);
-			}
-			toolItem.setSelection(true);
-		}
-	};
-	
-	/**
-	 * Listener to changes made to the current theme. The presentation will
-	 * redraw when the theme changes.
-	 */
-	private IPropertyChangeListener themeChangeListener = new IPropertyChangeListener() {	
-		public void propertyChange(PropertyChangeEvent event) {
-			if(! presentationControl.isDisposed()) {
-				toolBar.setFont(PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getFontRegistry().get(WrappedTabsThemeConstants.TAB_FONT));
-				layout();
-				presentationControl.redraw();
-			}
-		}
-	};
-	
-	private Listener menuListener = new Listener() {
-		/* (non-Javadoc)
-		 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-		 */
-		public void handleEvent(Event event) {
-			Point globalPos = new Point(event.x, event.y);
-			
-			if (event.widget == toolBar) {
-				Point localPos = toolBar.toControl(globalPos);
-				ToolItem item = toolBar.getItem(localPos);
-					
-				if (item != null) {
-					IPresentablePart part = getPartForTab(item);
-					getSite().selectPart(part);
-					showSystemMenu(globalPos);
-					return;
-				}
-			}
-            
-            IPresentablePart part = getCurrent();
-            if (part != null) {
-                showSystemMenu(globalPos);
-            }
-		}
-	};
-	
-	private MouseListener mouseListener = new MouseAdapter() {
-		
-		// If we single-click on an empty space on the toolbar, move focus to the
-		// active control
-		public void mouseDown(MouseEvent e) {
-			Point p = new Point(e.x, e.y);
-			
-			// Ignore double-clicks if we're currently over a toolbar item
-			if (isOverToolItem(e)) {
-				return;
-			}
-			
-			if (current != null) {
-				current.setFocus();
-			}
-		}
-		
-		public boolean isOverToolItem(MouseEvent e) {
-			Point p = new Point(e.x, e.y);
-			Control control = (Control)e.widget;
-			
-			if (control instanceof ToolBar) {
-				ToolItem item = ((ToolBar)control).getItem(p);
-				
-				if (item != null) {
-					return true;
-				}
-			} 
-			
-			return false;
-			
-		}
-		
-		// If we double-click on the toolbar, maximize the presentation
-		public void mouseDoubleClick(MouseEvent e) {
-			
-			// Ignore double-clicks if we're currently over a toolbar item
-			if (isOverToolItem(e) && e.widget == upperRight) {
-				return;
-			}
-			
-			if (getSite().getState() == IStackPresentationSite.STATE_MAXIMIZED) {
-				getSite().setState(IStackPresentationSite.STATE_RESTORED);
-			} else {
-				getSite().setState(IStackPresentationSite.STATE_MAXIMIZED);
-			}
-		}
-	};
-	
-	private boolean showIconOnTabs;
-	private static final int SPACING_WIDTH = 2;
-
-	private static final String SHOWING_TOOLBAR = "showing_toolbar";
-
-	private static final String TAG_PART = "part";
-	private static final String TAG_ID = "id";
-	private static final String TAG_TOOLBAR = "showing_toolbar";
-	
-	/**
-	 * Creates a new bare-bones part presentation, given the parent composite and 
-	 * an IStackPresentationSite interface that will be used to communicate with 
-	 * the workbench.
-	 * 
-	 * @param stackSite interface to the workbench
-	 */
-	public WrappedTabsPartPresentation(Composite parent, 
-			IStackPresentationSite stackSite, boolean showIconOnTabs) {
-		super(stackSite);		
-		
-		this.showIconOnTabs = showIconOnTabs;
-		
-		// Create a top-level control for the presentation.
-		presentationControl = new Composite(parent, SWT.NONE);
-		
-		// Add a dispose listener. This will call the presentationDisposed()
-		// method when the widget is destroyed.
-		presentationControl.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				presentationDisposed();
-			}
-		});
-		
-		upperRight = new ToolBar(presentationControl, SWT.RIGHT | SWT.FLAT);
-		//initPresentationWidget(upperRight);
-		
-		titleIconToolbar = new ToolBar(presentationControl, SWT.RIGHT | SWT.FLAT);
-		titleIcon = new ToolItem(titleIconToolbar, SWT.PUSH);
-        
-        titleIconToolbar.addListener(SWT.MouseDown, new Listener() {
-            public void handleEvent(Event event) {
-                showPaneMenu();
-            }
-        });
-		titleIconToolbar.addListener(SWT.MenuDetect, menuListener);
-		
-		titleIconToolbar.setVisible(!showIconOnTabs);
-		
-		toolBar = new ToolBar(presentationControl, SWT.WRAP | SWT.RIGHT | SWT.FLAT);
-		toolBar.addListener(SWT.MenuDetect, menuListener);
-		toolBar.addMouseListener(mouseListener);
-		toolBar.setFont(PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getFontRegistry().get(WrappedTabsThemeConstants.TAB_FONT));
-		
-		// Add drag listener to the toolbar
-		PresentationUtil.addDragListener(toolBar, new Listener() {
-			public void handleEvent(Event event) {
-				Point loc = new Point(event.x, event.y);
-				ToolItem item = toolBar.getItem(loc);
-				
-				if (item != null) {
-					// Move the current part
-					IPresentablePart draggedItem = getPartForTab(item);
-					draggedItem.setFocus();
-					getSite().dragStart(draggedItem, toolBar.toDisplay(loc), false);
-				} else {
-					// Move the stack
-					getSite().dragStart(toolBar.toDisplay(loc), false);
-				}
-			}
-			
-		});
-		
-		presentationControl.addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				Rectangle clientArea = presentationControl.getClientArea();			
-				e.gc.setLineWidth(getBorderWidth());
-				
-				e.gc.setForeground(getBorderColor());
-				e.gc.drawRectangle(clientArea.x, clientArea.y, clientArea.width-1, clientArea.height-1);
-				Rectangle contentAreaBounds = contentArea.getBounds();
-				int ypos = contentAreaBounds.y - 1;
-				e.gc.drawLine(clientArea.x, ypos, clientArea.x + clientArea.width - 1, ypos);
-			}
-			
-		});
-		initPresentationWidget(presentationControl);
-		
-		contentArea = new ViewForm(presentationControl, SWT.FLAT);
-		initPresentationWidget(contentArea);
-		contentDescriptionWrapper = new Composite(contentArea, SWT.NONE);
-		
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 4;
-		layout.marginHeight = 2;
-		contentDescriptionWrapper.setLayout(layout);
-		
-		GridData data = new GridData(GridData.FILL_BOTH);
-		data.verticalAlignment = GridData.VERTICAL_ALIGN_CENTER;
-		
-		contentDescription = new Label(contentDescriptionWrapper, SWT.NONE);
-		initPresentationWidget(contentDescription);
-		contentDescription.setLayoutData(data);
-
-		clientArea = new Composite(contentArea, SWT.NONE);
-		clientArea.setVisible(false);
-		
-		contentArea.setContent(clientArea);
-		toolbarProxy = new ProxyControl(contentArea);
-		
-		createButtonBar();
-		
-		createSystemMenu();
-		
-		PlatformUI.getWorkbench().getThemeManager().addPropertyChangeListener(themeChangeListener);
-	}
-	
-	private void initPresentationWidget(Control toInitialize) {
-		PresentationUtil.addDragListener(toInitialize, dragListener);
-		toInitialize.addListener(SWT.MenuDetect, menuListener);
-		toInitialize.addMouseListener(mouseListener);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.presentations.StackPresentation#restoreState(org.eclipse.ui.presentations.IPresentationSerializer, org.eclipse.ui.IMemento)
-	 */
-	public void restoreState(IPresentationSerializer serializer, IMemento savedState) {
-		IMemento[] parts = savedState.getChildren(TAG_PART);
-		
-		for (int idx = 0; idx < parts.length; idx++) {
-			String id = parts[idx].getString(TAG_ID);
-			
-			if (id != null) {
-				IPresentablePart part = serializer.getPart(id);
-				
-				if (part != null) {
-					addPart(part, null);
-					
-					Integer hasToolbar = parts[idx].getInteger(TAG_TOOLBAR);
-					showToolbar(part, hasToolbar != null && hasToolbar.intValue() != 0);
-				}
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.presentations.StackPresentation#saveState(org.eclipse.ui.presentations.IPresentationSerializer, org.eclipse.ui.IMemento)
-	 */
-	public void saveState(IPresentationSerializer context, IMemento memento) {
-		super.saveState(context, memento);
-		
-		IPresentablePart[] parts = getParts();
-		
-		for (int i = 0; i < parts.length; i++) {
-			IPresentablePart part = parts[i];
-
-			IMemento childMem = memento.createChild(TAG_PART);
-			childMem.putString(TAG_ID, context.getId(part));
-			childMem.putInteger(TAG_TOOLBAR, isShowingToolbar(part) ? 1 : 0);
-		}
-	}
-	
-	public IPresentablePart[] getParts() {
-		ToolItem[] items = toolBar.getItems();
-		IPresentablePart[] result = new IPresentablePart[items.length];
-		
-		for (int idx = 0; idx < items.length; idx++) {
-			ToolItem item = items[idx];
-			
-			IPresentablePart next = getPartForTab(item);
-			
-			result[idx] = next;
-		}
-		
-		return result;
-	}
-	
-	private final void createSystemMenu() {
-		getSite().addSystemActions(systemMenuManager);
-		systemMenuManager.add(new ChangeStackStateContributionItem(getSite()));
-		systemMenuManager.add(new ShowToolbarContributionItem(this));
-		// This example presentation includes the part list at the end of the system menu
-		systemMenuManager.add(new Separator());
-		systemMenuManager.add(new CloseContributionItem(this));
-		systemMenuManager.add(new CloseOthersContributionItem(this));
-		systemMenuManager.add(new CloseAllContributionItem(this));
-		systemMenuManager.add(new PartListContributionItem(this, getSite()));
-	}
-	
-	private void createButtonBar() {
-		viewMenu = new ToolItem(upperRight, SWT.PUSH);
-        upperRight.addListener(SWT.MouseDown, new Listener() {
-            public void handleEvent(Event event) {
-                Point p = new Point(event.x, event.y);
-                Rectangle r = viewMenu.getBounds();
-                
-                if (r.contains(p)) {
-                    showSystemMenu();
-                }
-            }
-        });
-		viewMenu.setImage(PresentationImages.getImage(PresentationImages.VIEW_MENU));
-	
-		showToolbar = new ToolItem(upperRight, SWT.PUSH);        
-        showToolbar.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                showToolbar(!isShowingToolbar());
-            }
-        });
-        	
-		if (getSite().supportsState(IStackPresentationSite.STATE_MINIMIZED)) {
-			minView = new ToolItem(upperRight, SWT.PUSH);
-			minView.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					if (current != null) {
-						if (getSite().getState() == IStackPresentationSite.STATE_MINIMIZED) {
-							getSite().setState(IStackPresentationSite.STATE_RESTORED);
-						} else {
-							getSite().setState(IStackPresentationSite.STATE_MINIMIZED);
-						}	
-					}
-				}				
-			});
-		}
-		
-		close = new ToolItem(upperRight, SWT.PUSH);
-		close.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (current != null) {
-					getSite().close(new IPresentablePart[] {current});
-				}
-			}
-			
-		});
-		close.setImage(PresentationImages.getImage(PresentationImages.CLOSE_VIEW));
-		
-		updateToolbarImages();
-	}
-	
-	private void updateToolbarImages() {
-		if (isShowingToolbar()) {
-			showToolbar.setImage(PresentationImages.getImage(PresentationImages.HIDE_TOOLBAR));
-		} else {
-			showToolbar.setImage(PresentationImages.getImage(PresentationImages.SHOW_TOOLBAR));
-		}
-
-		if (minView != null) {
-			String minImage = (getSite().getState() == IStackPresentationSite.STATE_MINIMIZED) ?
-					PresentationImages.RESTORE_VIEW : PresentationImages.MIN_VIEW;
-			minView.setImage(PresentationImages.getImage(minImage));
-		}
-		
-		upperRight.pack(true);
-		upperRight.redraw();
-	}
-	
-	public void refreshButtonBarEnablement() {
-		close.setEnabled(current != null && getSite().isCloseable(current));
-		titleIcon.setEnabled(current != null && current.getMenu() != null);
-		showToolbar.setEnabled(current != null && current.getToolBar() != null);
-	}
-
-	public void dispose() {
-		// Dispose the main presentation widget. This will cause 
-		// presentationDisposed to be called, which will do the real cleanup.
-		presentationControl.dispose();
-	}
-	
-	/**
-	 * Perform any cleanup. This method should remove any listeners that were
-	 * attached to other objects. This gets called when the presentation
-	 * widget is disposed. This is safer than cleaning up in the dispose() 
-	 * method, since this code will run even if some unusual circumstance 
-	 * destroys the Shell without first calling dispose().
-	 */
-	protected void presentationDisposed() {
-	    // Remove any listeners that were attached to any
-		// global Eclipse resources. This is necessary in order to prevent
-		// memory leaks.
-		PlatformUI.getWorkbench().getThemeManager().removePropertyChangeListener(themeChangeListener);
-	}
-
-	public void setBounds(Rectangle bounds) {
-		Rectangle newBounds = Geometry.copy(bounds);
-		
-		if (newBounds.width == 0) {
-			// Workaround a bug in the Eclipse 3.0 release: minimized presentations will be
-			// given a width of 0.
-			newBounds.width = presentationControl.getBounds().width;
-		}
-		
-		if (getSite().getState() == IStackPresentationSite.STATE_MINIMIZED) {
-			newBounds.height = computeMinimumSize().y;
-		}
-		
-		// Set the bounds of the presentation widge
-		presentationControl.setBounds(newBounds);
-		
-		// Update the bounds of the currently visible part
-		layout();
-	}
-	
-	/**
-	 * Lay out the presentation's widgets
-	 */
-	private void layout() {
-		
-		// Determine the inner bounds of the presentation
-		Rectangle presentationClientArea = presentationControl.getClientArea();
-		presentationClientArea.x += getBorderWidth();
-		presentationClientArea.width -= getBorderWidth() * 2;
-		presentationClientArea.y += getBorderWidth();
-		presentationClientArea.height -= getBorderWidth() * 2;
-		
-		// Position the upper-right toolbar
-		Point upperRightSize = upperRight.getSize();
-		int upperRightStartX = presentationClientArea.x + presentationClientArea.width - upperRightSize.x - SPACING_WIDTH;
-
-		Rectangle upperRightBounds = new Rectangle(upperRightStartX,
-				presentationClientArea.y + SPACING_WIDTH, upperRightSize.x, upperRightSize.y);
-		
-		upperRight.setBounds(upperRightBounds);
-		
-		int tabStart = presentationClientArea.x + SPACING_WIDTH + 1;
-		int verticalSpaceRequired = 0;
-		if (!showIconOnTabs) {
-			Point upperLeftSize;
-
-			upperLeftSize = titleIconToolbar.getSize();
-			Rectangle upperLeftBounds = new Rectangle(presentationClientArea.x + SPACING_WIDTH, 
-					presentationClientArea.y + SPACING_WIDTH,
-					upperLeftSize.x, upperLeftSize.y);
-			
-			titleIconToolbar.setBounds(upperLeftBounds);
-
-			tabStart = upperLeftBounds.x + upperLeftBounds.width + SPACING_WIDTH;
-			verticalSpaceRequired = upperLeftSize.y;
-		} 
-		
-		int availableTabWidth = upperRightStartX - tabStart - SPACING_WIDTH;
-		
-		Point toolbarSize = toolBar.computeSize(availableTabWidth, SWT.DEFAULT);
-		int minToolbarWidth = WrappedTabsUtil.getMaximumItemWidth(toolBar);
-				
-		toolBar.setBounds(tabStart,
-				presentationClientArea.y + SPACING_WIDTH, 
-				availableTabWidth, toolbarSize.y);
-		
-		verticalSpaceRequired = Math.max(verticalSpaceRequired, upperRightSize.y);
-		verticalSpaceRequired = Math.max(verticalSpaceRequired, toolbarSize.y);
-		
-		int verticalOffset = presentationClientArea.y + verticalSpaceRequired + getBorderWidth() + 2 * SPACING_WIDTH;
-		
-		contentArea.setBounds(presentationClientArea.x, verticalOffset, 
-				presentationClientArea.width, presentationClientArea.height - verticalOffset);
-		
-		if (isShowingToolbar()) {
-			contentArea.setTopLeft(contentDescriptionWrapper);
-			contentArea.setTopCenter(toolbarProxy.getControl());
-		} else {
-			contentArea.setTopLeft(null);
-			contentArea.setTopCenter(null);
-		}
-		
-		contentArea.layout();
-		
-		// Position the view's widgets
-		if (current != null) {
-			Rectangle clientRectangle = clientArea.getBounds();
-			Point clientAreaStart = presentationControl.getParent().toControl(
-					contentArea.toDisplay(clientRectangle.x, clientRectangle.y));
-			
-			current.setBounds(new Rectangle(clientAreaStart.x, 
-					clientAreaStart.y,
-					clientRectangle.width, 
-					clientRectangle.height));
-		}
-		
-	}
-
-	private int getBorderWidth() {
-		return PlatformUI.getWorkbench().getThemeManager().getCurrentTheme().getInt(WrappedTabsThemeConstants.BORDER_SIZE);
-	}
-
-	public Point computeMinimumSize() {
-		Point minSize = new Point(100, 16);
-		Point upperLeftSize = titleIconToolbar.getSize();
-		Point toolBarSize = toolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT, false);
-		
-		int BORDER_WIDTH = getBorderWidth();
-		Point result = new Point(minSize.x + upperLeftSize.x + 3 * SPACING_WIDTH + 2 * BORDER_WIDTH, 
-				Math.max(Math.max(upperLeftSize.y, minSize.y), toolBarSize.y) 
-				+ 2 * SPACING_WIDTH + 2 * BORDER_WIDTH);
-		
-		return result;
-	}
-
-	public void setVisible(boolean isVisible) {
-		
-		// Make the presentation widget visible
-		presentationControl.setVisible(isVisible);
-		
-		// Make the currently visible part visible
-		if (current != null) {
-			current.setVisible(isVisible);
-			if (current.getToolBar() != null) {
-				current.getToolBar().setVisible(isVisible && isShowingToolbar());
-			}
-		}
-
-		if (isVisible) {
-			// Restore the bounds of the currently visible part. 
-			// IPartPresentations can be used by multiple StackPresentations,
-			// although only one such presentation is ever visible at a time.
-			// It is possible that some other presentation has changed the
-			// bounds of the part since it was last visible, so we need to
-			// update the part's bounds when the presentation becomes visible.
-			layout();
-		}
-	}
-
-	private void clearSelection() {
-		// If there was an existing part selected, make it invisible
-		if (current != null) {
-			current.setVisible(false);
-		}
-
-		current = null;
-	}
-	
-	public void currentPartChanged() {
-		boolean layoutNeeded = false;
-		
-		if (titleIcon.getImage() != current.getTitleImage()) {
-			titleIcon.setImage(current.getTitleImage());
-			titleIcon.setDisabledImage(current.getTitleImage());
-			titleIconToolbar.pack(true);
-			titleIconToolbar.redraw();
-			
-			layoutNeeded = true;
-		}
-		
-		if (!contentDescription.getText().equals(current.getTitleStatus())) {
-			contentDescription.setText(current.getTitleStatus());
-			
-			layoutNeeded = true;
-		}
-			
-		if (current.getToolBar() != null) {
-			if (isShowingToolbar()) {
-				current.getToolBar().setVisible(true);
-				layoutNeeded = true;
-			} else {
-				current.getToolBar().setVisible(false);
-			}
-			
-			toolbarProxy.setTargetControl(current.getToolBar());
-		}
-		
-		if (layoutNeeded) {
-			layout();
-		}
-	}
-	
-	public void selectPart(IPresentablePart toSelect) {
-		// Ignore redundant selections
-		if (toSelect == current) {
-			return;
-		}
-		
-		clearSelection();
-		
-		// Select the new part
-		current = toSelect;
-		
-		// Ordering is important here. We need to make the part
-		// visible before updating its bounds, or the call to setBounds
-		// may be ignored.
-		
-		if (current != null) {
-			// Make the newly selected part visible
-			current.setVisible(true);
-			
-			ToolItem[] items = toolBar.getItems();
-			
-			for (int idx = 0; idx < items.length; idx++) {
-				ToolItem item = items[idx];
-				
-				item.setSelection(getPartForTab(item) == current);
-			}
-			
-			currentPartChanged();
-		}
-		
-		refreshButtonBarEnablement();
-		updateToolbarImages();
-		
-		// Update the bounds of the newly selected part
-		layout();
-	}
-
-	public Control[] getTabList(IPresentablePart part) {
-		return new Control[] {part.getControl()};
-	}
-
-	public Control getControl() {
-		return presentationControl;
-	}
-
-	private int indexOf(IPresentablePart part) {
-		ToolItem item = getTab(part);
-		
-		if (item == null) {
-			return -1;
-		}
-		
-		return toolBar.indexOf(item); 
-	}
-	
-	public void addPart(IPresentablePart newPart, Object cookie) {
-		if (getTab(newPart) != null) {
-			return;
-		}
-		
-		int position = toolBar.getItemCount();
-		
-		// If this part is being added due to a drag/drop operation,
-		// determine the correct insertion position
-		if (cookie instanceof DropLocation) {
-			DropLocation location = (DropLocation)cookie;
-			
-			position = indexOf(location.part);
-			
-			// If we can't find the tab, then fall back to the
-			// insertionPosition field
-			if (position == -1) {
-				position = location.insertionPosition;
-			} else {
-				if (!location.before) {
-					position++;
-				}
-			}
-		}
-		
-		// Ignore the cookie for now, since we don't support drag-and-drop yet.
-		ToolItem toolItem = new ToolItem(toolBar, SWT.RADIO, position);
-		
-		// Attach the newPart pointer to the ToolItem. This is used for getPartForTab
-		// to determine which part is associated with the tool item
-		toolItem.setData(PART_DATA, newPart);
-		
-		// Attach a property change listener to the part. This will update the ToolItem
-		// to reflect changes in the part.
-		newPart.addPropertyListener(childPropertyChangeListener);
-		
-		// Attach a dispose listener to the item. This removes the above property
-		// change listener from the part when the item is destroyed. This prevents
-		// memory leaks.
-		toolItem.addDisposeListener(tabDisposeListener);
-		
-		// Listen to selection events in the new tool item
-		toolItem.addSelectionListener(tabItemSelectionAdapter);
-		
-		// Initialize the tab for this part
-		initTab(toolItem, newPart);
-		
-		layout();
-		
-		toolBar.layout(true);
-		presentationControl.redraw();
-	}
-
-	protected void initTab(ToolItem item, IPresentablePart part) {
-		String tabName = getTabText(part);
-		
-		if (!tabName.equals(item.getText())) {
-			item.setText(tabName);
-		}
-		
-		if (!(part.getTitleToolTip().equals(item.getToolTipText()))) {
-			item.setToolTipText(part.getTitleToolTip());
-		}
-
-		if (showIconOnTabs && part.getTitleImage() != item.getImage()) {
-			item.setImage(part.getTitleImage());
-		}
-		
-	}
-	
-	/**
-	 * Returns the decorated tab text for the given part. By default, we attach 
-	 * a star to indicate dirty tabs.
-	 * 
-	 * @param part part whose text is being computed
-	 * @return the decorated tab text for the given part
-	 */
-	protected String getTabText(IPresentablePart part) {
-		String result = part.getName();
-		
-		if (part.isDirty()) {
-			result = "*" + result;
-		}
-		
-		return result;
-	}
-	
-	/**
-	 * Removes the given part from the stack.
-	 * 
-	 * @param oldPart the part to remove (not null)
-	 */
-	public void removePart(IPresentablePart oldPart) {
-		// If we're removing the currently selected part, clear the selection
-		if (oldPart == current) {
-			clearSelection();
-			refreshButtonBarEnablement();
-		}
-		
-		ToolItem item = getTab(oldPart);
-		
-		// Don't need to do anything if the part has already been removed
-		if (item == null) {
-			return;
-		}
-		
-		// Dispose the tab. The dispose listener on the item
-		// will handle all the cleanup.
-		item.dispose();
-		
-		layout();
-		
-		presentationControl.redraw();
-	}
-
-	/**
-	 * Called whenever a property changes for one of the parts in this
-	 * presentation. 
-	 * 
-	 * @param part
-	 * @param property
-	 */
-	protected void childPropertyChanged(IPresentablePart part, int property) {
-		ToolItem toolItem = getTab(part);
-		
-		// If there is no tab for this part, just ignore the property change
-		if (toolItem == null) {
-			return;
-		}
-		
-		initTab(toolItem, part);
-		
-		if (part == current) {
-			currentPartChanged();
-		}
-	}
-
-	/**
-	 * Returns the tab associated with the given part or null if none 
-	 * 
-	 * @param part the part to check for
-	 * @return the tab associated with the given part or null if none
-	 */
-	protected final ToolItem getTab(IPresentablePart part) {
-		ToolItem[] items = toolBar.getItems();
-		
-		for (int idx = 0; idx < items.length; idx++) {
-			ToolItem item = items[idx];
-			
-			if (getPartForTab(item) == part) {
-				return item;
-			}
-		}
-			
-		return null;
-	}
-	
-	/**
-	 * Returns the part associated with the given tab, or null if none.
-	 * 
-	 * @param item the tab to query
-	 * @return the part associated with the given tab or null if none
-	 */
-	protected final IPresentablePart getPartForTab(ToolItem item) {
-		return (IPresentablePart)item.getData(PART_DATA);
-	}
-	
-	public StackDropResult dragOver(Control currentControl, Point location) {		
-		Point localCoordinates = toolBar.toControl(location);
-		
-		// Ignore drag operations that aren't on top of the toolbar we're using
-		// for tabs.
-		if (toolBar.getClientArea().contains(localCoordinates)) {
-			DropLocation dropLocation = new DropLocation();
-			
-			ToolItem item = toolBar.getItem(localCoordinates);
-			
-			if (item == null) {
-				item = toolBar.getItem(toolBar.getItemCount() - 1);
-			}
-			
-			Rectangle itemBounds = item.getBounds();
-			dropLocation.before = (localCoordinates.x - itemBounds.x < itemBounds.width / 2);
-			dropLocation.part = getPartForTab(item);
-			// Also store the current index of the part we're dragging over. We will use
-			// the index if the part no longer exists at the time the drop occurs (ie:
-			// if we're dragging an item over itself)
-			dropLocation.insertionPosition = toolBar.indexOf(item);
-			
-			Point displayCoordinates = toolBar.toDisplay(itemBounds.x, itemBounds.y);
-			
-			Rectangle bounds = new Rectangle(displayCoordinates.x, displayCoordinates.y, 
-					4, itemBounds.height);
-			if (!dropLocation.before) {
-				bounds.x += itemBounds.width;
-			}
-			
-			return new StackDropResult(bounds, dropLocation);
-		}
-		
-		return null;
-	}
-	
-	public void setActive(int newState) {
-		activeFocus = (newState == AS_ACTIVE_FOCUS);
-		presentationControl.redraw();
-	}
-	
-	public void setState(int state) {
-		updateToolbarImages();
-	}
-	
-	public void showPaneMenu(Point location) {
-		if (current == null) {
-			return;
-		}
-		
-		IPartMenu menu = current.getMenu();
-		
-		if (menu == null) {
-			return;
-		}
-
-		menu.showMenu(location);
-	}
-	
-	public void showPaneMenu() {	
-		Rectangle bounds = titleIconToolbar.getBounds();
-		Point location = titleIconToolbar.getParent().toDisplay(bounds.x, bounds.y + bounds.height);
-		
-		showPaneMenu(location);
-	}
-	
-	public void showSystemMenu() {
-		Rectangle bounds = viewMenu.getBounds();
-		Point displayPos = viewMenu.getParent().toDisplay(bounds.x, bounds.y + bounds.height);
-    	
-		showSystemMenu(displayPos);
-	}
-	
-	public void showSystemMenu(Point displayPos) {
-		Menu aMenu = systemMenuManager.createContextMenu(presentationControl);
-		systemMenuManager.update(true);
-		aMenu.setLocation(displayPos.x, displayPos.y);
-		aMenu.setVisible(true);		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.presentations.StackPresentation#showPartList()
-	 */
-	public void showPartList() {
-		
-		// The part list opens when the user presses ctrl-e to open the list
-		// of editors. In this presentation, the part list is part of the system menu,
-		// so opening the part list is equivalent to opening the system menu.
-		showSystemMenu();
-	}
-
-	protected void showToolbar(IPresentablePart part, boolean shouldShow) {
-		
-		if (shouldShow != isShowingToolbar(part)) {
-			ToolItem tab = getTab(part);
-			tab.setData(SHOWING_TOOLBAR, shouldShow ? SHOWING_TOOLBAR : null);
-			
-			if (part == current) {
-				Control toolbar = part.getToolBar();
-				if (toolbar != null) {
-					toolbar.setVisible(shouldShow);
-				}
-				
-				layout();
-		
-				updateToolbarImages();
-				
-				if (getSite().getState() == IStackPresentationSite.STATE_MINIMIZED) {
-					getSite().setState(IStackPresentationSite.STATE_RESTORED);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * @param selection
-	 */
-	public void showToolbar(boolean selection) {
-		if (current != null) {
-			showToolbar(current, selection);
-		}
-	}
-	
-	public IPresentablePart getCurrent() {
-		return current;
-	}
-	
-	private boolean isShowingToolbar(IPresentablePart part) {
-		ToolItem tab = getTab(part);
-		return tab.getData(SHOWING_TOOLBAR) != null;
-	}
-	
-	public boolean isShowingToolbar() {
-		if (current == null) {
-			return false;
-		}
-		
-		return isShowingToolbar(current);		
-	}
-
-	/**
-	 * @param parts
-	 */
-	public void close(IPresentablePart[] parts) {
-		getSite().close(parts);
-	}
-	
-	private Color getBorderColor() {
-		ITheme current = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme();
-		if(activeFocus) {
-			return current.getColorRegistry().get(WrappedTabsThemeConstants.BORDER_COLOR_FOCUS);
-		} else {
-			return current.getColorRegistry().get(WrappedTabsThemeConstants.BORDER_COLOR_NOFOCUS);
-		}
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/WrappedTabsPresentationFactory.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/WrappedTabsPresentationFactory.java
deleted file mode 100644
index 7e20edc..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/WrappedTabsPresentationFactory.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.wrappedtabs;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.presentations.AbstractPresentationFactory;
-import org.eclipse.ui.presentations.IStackPresentationSite;
-import org.eclipse.ui.presentations.StackPresentation;
-
-/**
- * @since 3.0
- */
-public class WrappedTabsPresentationFactory extends AbstractPresentationFactory {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.presentations.AbstractPresentationFactory#createEditorPresentation(org.eclipse.swt.widgets.Composite, org.eclipse.ui.presentations.IStackPresentationSite)
-	 */
-	public StackPresentation createEditorPresentation(Composite parent,
-			IStackPresentationSite site) {
-		return new WrappedTabsPartPresentation(parent, site, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.presentations.AbstractPresentationFactory#createViewPresentation(org.eclipse.swt.widgets.Composite, org.eclipse.ui.presentations.IStackPresentationSite)
-	 */
-	public StackPresentation createViewPresentation(Composite parent,
-			IStackPresentationSite site) {
-		return new WrappedTabsPartPresentation(parent, site, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.presentations.AbstractPresentationFactory#createStandaloneViewPresentation(org.eclipse.swt.widgets.Composite, org.eclipse.ui.presentations.IStackPresentationSite, boolean)
-	 */
-	public StackPresentation createStandaloneViewPresentation(Composite parent,
-			IStackPresentationSite site, boolean showTitle) {
-		return new WrappedTabsPartPresentation(parent, site, false);
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/WrappedTabsThemeConstants.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/WrappedTabsThemeConstants.java
deleted file mode 100644
index 6aad8a0..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/WrappedTabsThemeConstants.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.presentation.wrappedtabs;
-
-/**
- * Theme presentation constants
- * 
- * @since 3.0
- */
-public class WrappedTabsThemeConstants {
-	public final static String ID = "org.eclipse.ui.examples.presentation.wrappedtabstheme"; //$NON-NLS-1$
-	
-	public final static String TAB_FONT = "org.eclipse.ui.examples.presentation.wrappedtabstheme.font"; //$NON-NLS-1$
-	public final static String BORDER_COLOR_FOCUS = "org.eclipse.ui.examples.presentation.wrappedtabstheme.foreground_focus"; //$NON-NLS-1$
-	public final static String BORDER_COLOR_NOFOCUS = "org.eclipse.ui.examples.presentation.wrappedtabstheme.foreground_nofocus"; //$NON-NLS-1$
-	public final static String BORDER_SIZE = "org.eclipse.ui.examples.presentation.wrappedtabstheme.bordersize"; //$NON-NLS-1$
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/WrappedTabsUtil.java b/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/WrappedTabsUtil.java
deleted file mode 100644
index 7d8db35..0000000
--- a/examples/org.eclipse.ui.examples.presentation/src/org/eclipse/ui/examples/presentation/wrappedtabs/WrappedTabsUtil.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.ui.examples.presentation.wrappedtabs;
-
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * @since 3.0
- */
-public class WrappedTabsUtil {
-	private WrappedTabsUtil() {
-		
-	}
-	
-	/**
-	 * Returns the width of the widest ToolItem in the given toolbar
-	 * 
-	 * @param toMeasure toolbar to measure
-	 * @return the width (pixels) of the widest ToolItem in the given toolbar
-	 */
-	public static int getMaximumItemWidth(ToolBar toMeasure) {
-		int maxWidth = 0;
-		ToolItem items[] = toMeasure.getItems();
-		
-		for (int i = 0; i < items.length; i++) {
-			ToolItem item = items[i];
-			
-			maxWidth = Math.max(maxWidth, item.getBounds().width);
-		}
-		
-		return maxWidth;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/.classpath b/examples/org.eclipse.ui.examples.propertysheet/.classpath
deleted file mode 100644
index ad14fb0..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="Eclipse UI Examples PropertySheet"/>
-	<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/examples/org.eclipse.ui.examples.propertysheet/.cvsignore b/examples/org.eclipse.ui.examples.propertysheet/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.propertysheet/.project b/examples/org.eclipse.ui.examples.propertysheet/.project
deleted file mode 100644
index 12f1ec2..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/.project
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.examples.propertysheet</name>
-	<comment></comment>
-	<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/examples/org.eclipse.ui.examples.propertysheet/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.ui.examples.propertysheet/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 36e5b57..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,78 +0,0 @@
-#Mon Jan 15 21:12:52 EST 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/examples/org.eclipse.ui.examples.propertysheet/.settings/org.eclipse.jdt.ui.prefs b/examples/org.eclipse.ui.examples.propertysheet/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 21abc82..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Mon Jan 15 17:29:04 EST 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.2\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template></templates>
diff --git a/examples/org.eclipse.ui.examples.propertysheet/.settings/org.eclipse.pde.prefs b/examples/org.eclipse.ui.examples.propertysheet/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 632cb55..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Jan 10 16:54:15 EST 2006
-compilers.p.deprecated=1
-compilers.p.illegal-att-value=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/Address.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/Address.java
deleted file mode 100644
index 02cf675..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/Address.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.propertysheet;
-
-import java.util.Vector;
-
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * Example IPropertySource who itself is NOT editable, but whose children are.
- * The values of the children determine the value of the address.
- */
-public class Address implements IPropertySource {
-
-    //properties
-    private String city;
-
-    private Integer province;
-
-    private String postalCode;
-
-    private StreetAddress street;
-
-    //Property unique keys
-    public static final String P_ID_STREET = "Address.Street"; //$NON-NLS-1$
-
-    public static final String P_ID_CITY = "Address.City"; //$NON-NLS-1$
-
-    public static final String P_ID_PROVINCE = "Address.Province"; //$NON-NLS-1$
-
-    public static final String P_ID_POSTALCODE = "Address.PostalCode"; //$NON-NLS-1$
-
-    //Property display keys
-    public static final String P_STREET = MessageUtil.getString("Street"); //$NON-NLS-1$
-
-    public static final String P_CITY = MessageUtil.getString("City"); //$NON-NLS-1$
-
-    public static final String P_PROVINCE = MessageUtil.getString("Province"); //$NON-NLS-1$
-
-    public static final String P_POSTALCODE = MessageUtil
-            .getString("PostalCode"); //$NON-NLS-1$
-
-    public static final String P_DESCRIPTORS = "properties"; //$NON-NLS-1$
-
-    //default values	
-    private static final StreetAddress STREET_DEFAULT = new StreetAddress();
-
-    private static final String CITY_DEFAULT = MessageUtil
-            .getString("unspecified_city"); //$NON-NLS-1$
-
-    private static final Integer PROVINCE_DEFAULT = new Integer(0);
-
-    private static final String POSTALCODE_DEFAULT = "A1B2C3"; //$NON-NLS-1$
-
-    //
-    static private class ProvinceLabelProvider extends LabelProvider {
-        public String getText(Object element) {
-            String[] provinceValues = new String[] {
-                    MessageUtil.getString("British_Columbia"), MessageUtil.getString("Alberta"), MessageUtil.getString("Saskatchewan"), MessageUtil.getString("Manitoba"), MessageUtil.getString("Ontario"), MessageUtil.getString("Quebec"), MessageUtil.getString("Newfoundland"), MessageUtil.getString("Prince_Edward_Island"), MessageUtil.getString("Nova_Scotia"), MessageUtil.getString("New_Brunswick"), MessageUtil.getString("Yukon"), MessageUtil.getString("North_West_Territories"), MessageUtil.getString("Nunavut") }; //$NON-NLS-13$ //$NON-NLS-12$ //$NON-NLS-11$ //$NON-NLS-10$ //$NON-NLS-9$ //$NON-NLS-8$ //$NON-NLS-7$ //$NON-NLS-6$ //$NON-NLS-5$ //$NON-NLS-4$ //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
-            return provinceValues[((Integer) element).intValue()];
-        }
-    }
-
-    //
-    private static Vector descriptors;
-
-    private static String[] provinceValues;
-    static {
-        descriptors = new Vector();
-        provinceValues = new String[] {
-                MessageUtil.getString("British_Columbia"), MessageUtil.getString("Alberta"), MessageUtil.getString("Saskatchewan"), MessageUtil.getString("Manitoba"), MessageUtil.getString("Ontario"), MessageUtil.getString("Quebec"), MessageUtil.getString("Newfoundland"), MessageUtil.getString("Prince_Edward_Island"), MessageUtil.getString("Nova_Scotia"), MessageUtil.getString("New_Brunswick"), MessageUtil.getString("Yukon"), MessageUtil.getString("North_West_Territories"), MessageUtil.getString("Nunavut") }; //$NON-NLS-13$ //$NON-NLS-12$ //$NON-NLS-11$ //$NON-NLS-10$ //$NON-NLS-9$ //$NON-NLS-8$ //$NON-NLS-7$ //$NON-NLS-6$ //$NON-NLS-5$ //$NON-NLS-4$ //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
-        descriptors.addElement(new PropertyDescriptor(P_ID_STREET, P_STREET));
-        descriptors.addElement(new TextPropertyDescriptor(P_ID_CITY, P_CITY));
-
-        //PostalCode
-        PropertyDescriptor propertyDescriptor = new TextPropertyDescriptor(
-                P_ID_POSTALCODE, P_POSTALCODE);
-        //add custom validator to propertyDescriptor limiting postalcode
-        //values to XYXYXY, where X is a letter and Y is a digit
-        propertyDescriptor.setValidator(new ICellEditorValidator() {
-            public String isValid(Object value) {
-                if (value == null)
-                    return MessageUtil.getString("postal_code_is_incomplete"); //$NON-NLS-1$
-
-                //
-                String testPostalCode = ((String) value).toUpperCase();
-                final int length = testPostalCode.length();
-                final char space = ' ';
-
-                //removes white space
-                StringBuffer postalCodeBuffer = new StringBuffer(6);
-                char current;
-                for (int i = 0; i < length; i++) {
-                    current = testPostalCode.charAt(i);
-                    if (current != space)
-                        postalCodeBuffer.append(current);
-                }
-                testPostalCode = postalCodeBuffer.toString();
-
-                //check for proper length
-                if (testPostalCode.length() != 6) {
-                    return MessageUtil.getString("postal_code_is_incomplete"); //$NON-NLS-1$
-                }
-
-                //check for proper format
-                if (testPostalCode.charAt(1) < '0'
-                        || testPostalCode.charAt(1) > '9'
-                        || testPostalCode.charAt(3) < '0'
-                        || testPostalCode.charAt(3) > '9'
-                        || testPostalCode.charAt(5) < '0'
-                        || testPostalCode.charAt(5) > '9'
-                        || testPostalCode.charAt(0) < 'A'
-                        || testPostalCode.charAt(0) > 'Z'
-                        || testPostalCode.charAt(2) < 'A'
-                        || testPostalCode.charAt(2) > 'Z'
-                        || testPostalCode.charAt(4) < 'A'
-                        || testPostalCode.charAt(4) > 'Z') {
-                    //fail
-                    return MessageUtil
-                            .format(
-                                    "_is_an_invalid_format_for_a_postal_code", new Object[] { testPostalCode }); //$NON-NLS-1$
-                }
-
-                //all pass
-                return null;
-            }
-        });
-        descriptors.addElement(propertyDescriptor);
-
-        //
-        ComboBoxPropertyDescriptor desc = new ComboBoxPropertyDescriptor(
-                P_ID_PROVINCE, P_PROVINCE, provinceValues);
-        desc.setLabelProvider(new ProvinceLabelProvider());
-        descriptors.addElement(desc);
-    }
-
-    /**
-     * Address Default Constructor
-     */
-    Address() {
-        super();
-    }
-
-    /**
-     * Creates a new address.
-     *
-     * @param street the street 
-     * @param city the city
-     * @param province the province
-     * @param postalCode has the form XYXYXY: where X is a letter and Y is a digit
-     * @exception IllegalArgumentException, if postalcode not in above form
-     */
-    public Address(StreetAddress street, String city, Integer province,
-            String postalCode) {
-        super();
-        setStreet(street);
-        setCity(city);
-        setPostalCode(postalCode);
-        setProvince(province);
-    }
-
-    /**
-     * Returns the city
-     */
-    private String getCity() {
-        if (city == null)
-            city = CITY_DEFAULT;
-        return city;
-    }
-
-    /* 
-     * Standard Accessor
-     */
-    private static Vector getDescriptors() {
-        return descriptors;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public Object getEditableValue() {
-        return this.toString();
-    }
-
-    /**
-     * Returns the postal code
-     */
-    private String getPostalCode() {
-        if (postalCode == null)
-            postalCode = POSTALCODE_DEFAULT;
-        return postalCode;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public IPropertyDescriptor[] getPropertyDescriptors() {
-        return (IPropertyDescriptor[]) getDescriptors().toArray(
-                new IPropertyDescriptor[getDescriptors().size()]);
-    }
-
-    /** 
-     * The <code>Address</code> implementation of this
-     * <code>IPropertySource</code> method returns the following properties
-     *
-     * 	1) P_CITY returns java.lang.String
-     * 	2) P_POSTALCODE returns java.lang.String
-     *  3) P_PROVINCE returns java.lang.String
-     *	4) P_STREET returns StreetAddress
-     */
-    public Object getPropertyValue(Object propKey) {
-        if (propKey.equals(P_ID_PROVINCE))
-            return getProvince();
-        if (propKey.equals(P_ID_STREET))
-            return getStreet();
-        if (propKey.equals(P_ID_CITY))
-            return getCity();
-        if (propKey.equals(P_ID_POSTALCODE))
-            return getPostalCode();
-        return null;
-    }
-
-    /**
-     * Returns the province
-     */
-    private Integer getProvince() {
-        if (province == null)
-            province = PROVINCE_DEFAULT;
-        return province;
-    }
-
-    /**
-     * Returns the street
-     */
-    public StreetAddress getStreet() {
-        if (street == null)
-            street = new StreetAddress();
-        return street;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public boolean isPropertySet(Object property) {
-        if (property.equals(P_ID_PROVINCE))
-            return getProvince() != PROVINCE_DEFAULT;
-        if (property.equals(P_ID_STREET))
-            return !STREET_DEFAULT.equals(getStreet());
-        if (property.equals(P_ID_CITY))
-            return getCity() != CITY_DEFAULT;
-        if (property.equals(P_ID_POSTALCODE))
-            return getPostalCode() != POSTALCODE_DEFAULT;
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public void resetPropertyValue(Object property) {
-        if (P_ID_POSTALCODE.equals(property)) {
-            setPostalCode(POSTALCODE_DEFAULT);
-            return;
-        }
-        if (P_ID_CITY.equals(property)) {
-            setCity(CITY_DEFAULT);
-            return;
-        }
-        if (P_ID_PROVINCE.equals(property)) {
-            setProvince(PROVINCE_DEFAULT);
-            return;
-        }
-        if (P_ID_STREET.equals(property)) {
-            setStreet(new StreetAddress());
-            return;
-        }
-    }
-
-    /**
-     * Sets the city
-     */
-    private void setCity(String newCity) {
-        city = newCity;
-    }
-
-    /**
-     * Sets the postal code
-     */
-    private void setPostalCode(String newPostalCode) {
-        //validation in ICellEditorValidator registered in PropertyDescriptor
-        this.postalCode = newPostalCode.toUpperCase();
-    }
-
-    /** 
-     * The <code>Address</code> implementation of this
-     * <code>IPropertySource</code> method 
-     * defines the following Setable properties
-     *
-     * 	1) P_CITY expects java.lang.String
-     * 	2) P_POSTALCODE expects java.lang.String
-     *  3) P_PROVINCE expects java.lang.String
-     * 
-     * <p>P_ID_STREET is not set here since it is referenced 
-     * and set directly in StreetAddress.
-     * According to IPropertySource, StreetAddress.getEditableValue
-     * should return a String which will be passed to this method  
-     * as the value. A new StreetAddress object should then be 
-     * created from the string. 
-     * An alternative would be to return the StreetAddress 
-     * directly in StreetAddress.getEditableValue and define a 
-     * cell editor for the StreetAddress property.
-     * This was ommitted for the sake of simplicity. 
-     */
-    public void setPropertyValue(Object name, Object value) {
-        if (P_ID_POSTALCODE.equals(name)) {
-            setPostalCode((String) value);
-            return;
-        }
-        if (P_ID_CITY.equals(name)) {
-            setCity((String) value);
-            return;
-        }
-        if (P_ID_PROVINCE.equals(name)) {
-            setProvince((Integer) value);
-            return;
-        }
-    }
-
-    /**
-     * Sets the province
-     */
-    private void setProvince(Integer newProvince) {
-        province = newProvince;
-    }
-
-    /**
-     * Sets the street
-     */
-    private void setStreet(StreetAddress newStreet) {
-        street = newStreet;
-    }
-
-    /**
-     * The value as displayed in the Property Sheet.
-     * @return java.lang.String
-     */
-    public String toString() {
-        StringBuffer outStringBuffer = new StringBuffer();
-        final String comma_space = ", "; //$NON-NLS-1$
-        final String space = " "; //$NON-NLS-1$
-        if (!getStreet().equals(STREET_DEFAULT)) {
-            outStringBuffer.append(getStreet());
-            outStringBuffer.append(comma_space);
-        }
-
-        outStringBuffer.append(getCity());
-        outStringBuffer.append(space);
-        outStringBuffer.append(provinceValues[getProvince().intValue()]);
-        outStringBuffer.append(comma_space);
-        outStringBuffer.append(getPostalCode());
-
-        return outStringBuffer.toString();
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/Birthday.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/Birthday.java
deleted file mode 100644
index f1b77ac..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/Birthday.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.propertysheet;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.Vector;
-
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * Example IPropertySource who itself is NOT editable, but whose children are.
- * The values of the children determine the value of the birthday.
- */
-public class Birthday implements IPropertySource {
-
-    //Properties
-    private Integer day, month, year;
-
-    //Property unique keys
-    public static final String P_ID_DAY = "Birthday.day"; //$NON-NLS-1$
-
-    public static final String P_ID_MONTH = "Birthday.month"; //$NON-NLS-1$
-
-    public static final String P_ID_YEAR = "Birthday.year"; //$NON-NLS-1$
-
-    //Property display keys
-    public static final String P_DAY = MessageUtil.getString("day"); //$NON-NLS-1$
-
-    public static final String P_MONTH = MessageUtil.getString("month"); //$NON-NLS-1$
-
-    public static final String P_YEAR = MessageUtil.getString("year"); //$NON-NLS-1$
-
-    //default values	
-    private static final Integer DAY_DEFAULT = new Integer(1);
-
-    private static final Integer MONTH_DEFAULT = new Integer(1);
-
-    private static final Integer YEAR_DEFAULT = new Integer(2000);
-
-    //static date formater
-    private static final DateFormat formatter = new SimpleDateFormat(
-            "EEEE, MMMM d, yyyy"); //$NON-NLS-1$
-
-    static private class DayLabelProvider extends LabelProvider {
-        public String getText(Object element) {
-            String[] dayValues = new String[] {
-                    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31" }; //$NON-NLS-31$ //$NON-NLS-30$ //$NON-NLS-29$ //$NON-NLS-28$ //$NON-NLS-27$ //$NON-NLS-26$ //$NON-NLS-25$ //$NON-NLS-24$ //$NON-NLS-23$ //$NON-NLS-22$ //$NON-NLS-21$ //$NON-NLS-20$ //$NON-NLS-19$ //$NON-NLS-18$ //$NON-NLS-17$ //$NON-NLS-16$ //$NON-NLS-15$ //$NON-NLS-14$ //$NON-NLS-13$ //$NON-NLS-12$ //$NON-NLS-11$ //$NON-NLS-10$ //$NON-NLS-9$ //$NON-NLS-8$ //$NON-NLS-7$ //$NON-NLS-6$ //$NON-NLS-5$ //$NON-NLS-4$ //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
-            return dayValues[((Integer) element).intValue()];
-        }
-    }
-
-    static private class MonthLabelProvider extends LabelProvider {
-        public String getText(Object element) {
-            String[] monthValues = new String[] {
-                    MessageUtil.getString("January"), MessageUtil.getString("February"), MessageUtil.getString("March"), MessageUtil.getString("April"), MessageUtil.getString("May"), MessageUtil.getString("June"), MessageUtil.getString("July"), MessageUtil.getString("August"), MessageUtil.getString("September"), MessageUtil.getString("October"), MessageUtil.getString("November"), MessageUtil.getString("December") }; //$NON-NLS-12$ //$NON-NLS-11$ //$NON-NLS-10$ //$NON-NLS-9$ //$NON-NLS-8$ //$NON-NLS-7$ //$NON-NLS-6$ //$NON-NLS-5$ //$NON-NLS-4$ //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
-            return monthValues[((Integer) element).intValue()];
-        }
-    }
-
-    //
-    private static Vector descriptors;
-    static {
-        descriptors = new Vector();
-
-        ///
-        String[] dayValues = new String[] {
-                "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31" }; //$NON-NLS-31$ //$NON-NLS-30$ //$NON-NLS-29$ //$NON-NLS-28$ //$NON-NLS-27$ //$NON-NLS-26$ //$NON-NLS-25$ //$NON-NLS-24$ //$NON-NLS-23$ //$NON-NLS-22$ //$NON-NLS-21$ //$NON-NLS-20$ //$NON-NLS-19$ //$NON-NLS-18$ //$NON-NLS-17$ //$NON-NLS-16$ //$NON-NLS-15$ //$NON-NLS-14$ //$NON-NLS-13$ //$NON-NLS-12$ //$NON-NLS-11$ //$NON-NLS-10$ //$NON-NLS-9$ //$NON-NLS-8$ //$NON-NLS-7$ //$NON-NLS-6$ //$NON-NLS-5$ //$NON-NLS-4$ //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
-        ComboBoxPropertyDescriptor days = new ComboBoxPropertyDescriptor(
-                P_ID_DAY, P_DAY, dayValues);
-        days.setLabelProvider(new DayLabelProvider());
-        descriptors.addElement(days);
-
-        ///
-        String[] monthValues = new String[] {
-                MessageUtil.getString("January"), MessageUtil.getString("February"), MessageUtil.getString("March"), MessageUtil.getString("April"), MessageUtil.getString("May"), MessageUtil.getString("June"), MessageUtil.getString("July"), MessageUtil.getString("August"), MessageUtil.getString("September"), MessageUtil.getString("October"), MessageUtil.getString("November"), MessageUtil.getString("December") }; //$NON-NLS-12$ //$NON-NLS-11$ //$NON-NLS-10$ //$NON-NLS-9$ //$NON-NLS-8$ //$NON-NLS-7$ //$NON-NLS-6$ //$NON-NLS-5$ //$NON-NLS-4$ //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
-        ComboBoxPropertyDescriptor months = new ComboBoxPropertyDescriptor(
-                P_ID_MONTH, P_MONTH, monthValues);
-        months.setLabelProvider(new MonthLabelProvider());
-        descriptors.addElement(months);
-
-        ///
-        descriptors.addElement(new TextPropertyDescriptor(P_ID_YEAR, P_YEAR));
-    }
-
-    /**
-     * Address Default Constructor
-     */
-    Birthday() {
-        super();
-    }
-
-    /**
-     * Convenience Address Constructor
-     */
-    public Birthday(int day, int month, int year) {
-        super();
-        setDay(new Integer(day));
-        setMonth(new Integer(month));
-        setYear(new Integer(year));
-    }
-
-    /**
-     * Returns the day
-     */
-    private Integer getDay() {
-        if (day == null)
-            day = DAY_DEFAULT;
-        return day;
-    }
-
-    /**
-     * Standard Accessor
-     */
-    private static Vector getDescriptors() {
-        return descriptors;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public Object getEditableValue() {
-        return this.toString();
-    }
-
-    /**
-     * Returns the month
-     */
-    private Integer getMonth() {
-        if (month == null)
-            month = MONTH_DEFAULT;
-        return month;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public IPropertyDescriptor[] getPropertyDescriptors() {
-        return (IPropertyDescriptor[]) getDescriptors().toArray(
-                new IPropertyDescriptor[getDescriptors().size()]);
-    }
-
-    /** 
-     * The <code>Birthday</code> implementation of this
-     * <code>IPropertySource</code> method returns the following properties
-     *
-     * 	1) P_DAY returns java.lang.Integer
-     * 	2) P_MONTH returns java.lang.Integer
-     *  3) P_YEAR returns java.lang.Integer
-     *	4) P_STREET returns java.lang.String
-     */
-    public Object getPropertyValue(Object propKey) {
-        if (propKey.equals(P_ID_DAY))
-            return new Integer(getDay().intValue() - 1);
-        if (propKey.equals(P_ID_MONTH))
-            return new Integer(getMonth().intValue() - 1);
-        if (propKey.equals(P_ID_YEAR))
-            return getYear().toString();
-        return null;
-    }
-
-    /**
-     * Returns the year
-     */
-    private Integer getYear() {
-        if (year == null)
-            year = YEAR_DEFAULT;
-        return year;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public boolean isPropertySet(Object property) {
-        if (P_ID_DAY.equals(property))
-            return getDay() != DAY_DEFAULT;
-        if (P_ID_MONTH.equals(property))
-            return getMonth() != MONTH_DEFAULT;
-        if (P_ID_YEAR.equals(property))
-            return getYear() != YEAR_DEFAULT;
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public void resetPropertyValue(Object property) {
-        if (P_ID_DAY.equals(property)) {
-            setDay(DAY_DEFAULT);
-            return;
-        }
-        if (P_ID_MONTH.equals(property)) {
-            setMonth(MONTH_DEFAULT);
-            return;
-        }
-        if (P_ID_YEAR.equals(property)) {
-            setYear(YEAR_DEFAULT);
-            return;
-        }
-    }
-
-    /**
-     * Sets the day
-     */
-    private void setDay(Integer newDay) {
-        day = newDay;
-    }
-
-    /**
-     * Sets the month
-     */
-    private void setMonth(Integer newMonth) {
-        month = newMonth;
-    }
-
-    /** 
-     * The <code>Birthday</code> implementation of this
-     * <code>IPropertySource</code> method 
-     * defines the following Setable properties
-     *
-     * 	1) P_DAY expects java.lang.Integer
-     * 	2) P_MONTH expects java.lang.Integer
-     *  3) P_YEAR expects java.lang.Integer
-     */
-    public void setPropertyValue(Object name, Object value) {
-        if (P_ID_DAY.equals(name)) {
-            setDay(new Integer(((Integer) value).intValue() + 1));
-            return;
-        }
-        if (P_ID_MONTH.equals(name)) {
-            setMonth(new Integer(((Integer) value).intValue() + 1));
-            return;
-        }
-        if (P_ID_YEAR.equals(name)) {
-            try {
-                setYear(new Integer((String) value));
-            } catch (NumberFormatException e) {
-                setYear(YEAR_DEFAULT);
-            }
-            return;
-        }
-    }
-
-    /**
-     * Sets the year
-     */
-    private void setYear(Integer newYear) {
-        year = newYear;
-    }
-
-    /**
-     * The value as displayed in the Property Sheet.
-     * @return java.lang.String
-     */
-    public String toString() {
-        Date bday = (new GregorianCalendar(getYear().intValue(), getMonth()
-                .intValue() - 1, getDay().intValue())).getTime();
-        return formatter.format(bday);
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/EmailAddress.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/EmailAddress.java
deleted file mode 100644
index 2320280..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/EmailAddress.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.propertysheet;
-
-import java.util.Vector;
-
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-
-/**
- * Example IPropertySource is editable and whose childern properties are itself not editable.
- * The values of "userid" and "mailserver" are parsed from setting "email"
- */
-public class EmailAddress implements IPropertySource {
-
-    //Property-Value
-    private String userid;
-
-    private String domain;
-
-    //Default Property-Value
-    private static final String USERID_DEFAULT = MessageUtil
-            .getString("unknownUser"); //$NON-NLS-1$
-
-    private static final String DOMAIN_DEFAULT = MessageUtil
-            .getString("unknownDomain"); //$NON-NLS-1$
-
-    //Property unique keys
-    public static final String P_ID_USERID = "EmailAddress.userid"; //$NON-NLS-1$
-
-    public static final String P_ID_DOMAIN = "EmailAddress.domain"; //$NON-NLS-1$
-
-    //Property display keys
-    public static final String P_USERID = MessageUtil.getString("userid"); //$NON-NLS-1$
-
-    public static final String P_DOMAIN = MessageUtil.getString("domain"); //$NON-NLS-1$
-
-    //Property-Descriptors
-    private static Vector descriptors;
-
-    static {
-        descriptors = new Vector(2, 2);
-        //non-editable child properties --> provide no editors
-        descriptors.addElement(new PropertyDescriptor(P_ID_USERID, P_USERID));
-        descriptors.addElement(new PropertyDescriptor(P_ID_DOMAIN, P_DOMAIN));
-    }
-
-    /**
-     * EmailAddress Default Constructor
-     */
-    public EmailAddress() {
-        super();
-    }
-
-    /**
-     * Convience EmailAddress constructor.
-     * Calls setEmailAddress() to parse emailAddress
-     * @param emailAddress java.lang.String, in the form userid@domain
-     * @throws java.lang.IllegalArgumentException, if does not subscribe to form
-     */
-    public EmailAddress(String emailAddress) throws IllegalArgumentException {
-        super();
-        setEmailAddress(emailAddress);
-
-    }
-
-    /**
-     * Returns the descriptors
-     */
-    private static Vector getDescriptors() {
-        return descriptors;
-    }
-
-    /**
-     * Returns the domain
-     */
-    private String getDomain() {
-        if (domain == null)
-            domain = DOMAIN_DEFAULT;
-        return domain;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public Object getEditableValue() {
-        return this.toString();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public IPropertyDescriptor[] getPropertyDescriptors() {
-        return (IPropertyDescriptor[]) getDescriptors().toArray(
-                new IPropertyDescriptor[getDescriptors().size()]);
-    }
-
-    /** 
-     * The <code>EmailAddress</code> implementation of this
-     * <code>IPropertySource</code> method returns the following properties
-     *
-     * 	1) P_USERID returns String, values before "@"
-     *	2) P_DOMAIN returns String, values after "@"
-     *
-     * Observe the available properties must always equal those listed
-     * in the property descriptors
-     */
-    public Object getPropertyValue(Object propKey) {
-        if (propKey.equals(P_ID_USERID))
-            return getUserid();
-        if (propKey.equals(P_ID_DOMAIN))
-            return getDomain();
-        return null;
-    }
-
-    /**
-     * Returns the userid
-     */
-    private String getUserid() {
-        if (userid == null)
-            userid = USERID_DEFAULT;
-        return userid;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public boolean isPropertySet(Object property) {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public void resetPropertyValue(Object property) {
-        return;
-    }
-
-    /**
-     * Sets the domain
-     */
-    private void setDomain(java.lang.String newDomain) {
-        domain = newDomain;
-    }
-
-    /**
-     * Parses emailAddress into domain and userid. Throws SetPropertyVetoException
-     * if emailAddress does not contain an userid and domain seperated by '@'.
-     *
-     * @param emailAddress the email address
-     * @throws IllegalArgumentException
-     */
-    private void setEmailAddress(String emailAddress)
-            throws IllegalArgumentException {
-        if (emailAddress == null)
-            throw new IllegalArgumentException(MessageUtil
-                    .getString("emailaddress_cannot_be_set_to_null")); //$NON-NLS-1$
-        int index = emailAddress.indexOf('@');
-        int length = emailAddress.length();
-        if (index > 0 && index < length) {
-            setUserid(emailAddress.substring(0, index));
-            setDomain(emailAddress.substring(index + 1));
-            return;
-        }
-        throw new IllegalArgumentException(
-                MessageUtil
-                        .getString("invalid_email_address_format_should_have_been_validated")); //$NON-NLS-1$
-    }
-
-    /** 
-     * The <code>Address</code> implementation of this
-     * <code>IPropertySource</code> method 
-     * defines the following Setable properties
-     *
-     *	1) P_USERID, expects String
-     *	2) P_DOMAIN, expects String
-     */
-    public void setPropertyValue(Object name, Object value) {
-        if (name.equals(P_ID_USERID)) {
-            setUserid((String) value);
-            return;
-        }
-        if (name.equals(P_ID_DOMAIN)) {
-            setDomain((String) value);
-            return;
-        }
-    }
-
-    /**
-     * Sets the userid
-     */
-    private void setUserid(String newUserid) {
-        userid = newUserid;
-    }
-
-    /**
-     * The value as displayed in the Property Sheet.
-     * @return java.lang.String
-     */
-    public String toString() {
-        StringBuffer strbuffer = new StringBuffer(getUserid());
-        strbuffer.append('@');
-        strbuffer.append(getDomain());
-        return strbuffer.toString();
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/EmailAddressValidator.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/EmailAddressValidator.java
deleted file mode 100644
index 8625f80..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/EmailAddressValidator.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.propertysheet;
-
-import org.eclipse.jface.viewers.ICellEditorValidator;
-
-/**
- * Validator for email addresses
- */
-public class EmailAddressValidator implements ICellEditorValidator {
-    /** 
-     * The <code>EmailAddressValidator</code> implementation of this
-     * <code>ICellEditorValidator</code> method 
-     * determines if the value is a valid email address.
-     * (check to see if it is non-null and contains an @)
-     */
-    public String isValid(Object value) {
-        if (value == null) {
-            return MessageUtil.getString("email_address_is_incomplete"); //$NON-NLS-1$
-        }
-        String emailAddress = (String) value;
-        int index = emailAddress.indexOf('@');
-        int length = emailAddress.length();
-        if (index > 0 && index < length) {
-            return null;
-        }
-        return MessageUtil
-                .getString("email_address_does_not_have_a_valid_format"); //$NON-NLS-1$
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/GroupElement.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/GroupElement.java
deleted file mode 100644
index 0fb7653..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/GroupElement.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.propertysheet;
-
-import java.util.Vector;
-
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * A Group Element
- */
-public class GroupElement extends OrganizationElement {
-    public static String P_USERS = "users"; //$NON-NLS-1$
-
-    public static String P_SUBGROUPS = "subgroups"; //$NON-NLS-1$
-
-    public static String P_CONTENTS = "contents"; //$NON-NLS-1$
-
-    private Vector subGroups;
-
-    private Vector users;
-
-    // must be synchronized to contain both the references of subGroups and users
-    private Vector contents;
-
-    /**
-     * Constructor.
-     * Creates a new GroupElement within the passed parent GroupElement,
-     * gives it the passed name property, sets Icon.
-     *
-     * @param name the name 
-     * @param parent the parent
-     */
-    public GroupElement(String name, GroupElement parent) {
-        super(name, parent);
-    }
-
-    /**
-     * Adds an OrganizationElement to this GroupElement.
-     *
-     * @param userGroup The Organization Element
-     */
-    public void add(OrganizationElement userGroup) {
-        if (userGroup.isUser() || userGroup.isGroup()) {
-            getContents().add(userGroup);
-        }
-        if (userGroup.isGroup()) {
-            getSubGroups().add(userGroup);
-            // synchronizes backpointer of userGroup: defensive
-            userGroup.setParent(this);
-        }
-        if (userGroup.isUser()) {
-            getUsers().add(userGroup);
-            // synchronizes backpointer of userGroup: defensive
-            userGroup.setParent(this);
-        }
-
-    }
-
-    /**
-     * Creates a new <code>GroupElement</code>
-     * nested in this <code>GroupElement<code>
-     *
-     * @param name the name of the sub group
-     */
-    public GroupElement createSubGroup(String name) {
-        GroupElement newGroup = new GroupElement(name, this);
-        add(newGroup);
-        return newGroup;
-    }
-
-    /**
-     * Creates a new <code>UserElement</code>
-     *
-     * @param the name of the user element
-     */
-    public UserElement createUser(String name) {
-        UserElement newUser = new UserElement(name, this);
-        add(newUser);
-        return newUser;
-    }
-
-    /**
-     * Deletes an OrganizationElement from this GroupElement.
-     *
-     * @param userGroup the Organization Element
-     */
-    public void delete(OrganizationElement userGroup) {
-        if (userGroup.isUser() || userGroup.isGroup()) {
-            getContents().remove(userGroup);
-        }
-        if (userGroup.isGroup()) {
-            getSubGroups().remove(userGroup);
-            // synchronizes backpointer of userGroup: defensive
-        }
-        if (userGroup.isUser()) {
-            getUsers().remove(userGroup);
-            // synchronizes backpointer of userGroup: defensive
-        }
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchAdapter
-     */
-    public Object[] getChildren(Object o) {
-        return getContents().toArray();
-    }
-
-    /**
-     * Returns the content
-     */
-    private Vector getContents() {
-        if (contents == null)
-            contents = new Vector();
-        return contents;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public Object getEditableValue() {
-        return this.toString();
-    }
-
-    /**
-     * Returns the error message
-     */
-    public String getErrorMessage() {
-        return null;
-    }
-
-    /**
-     * Returns the subgroups
-     */
-    private Vector getSubGroups() {
-        if (subGroups == null)
-            subGroups = new Vector();
-        return subGroups;
-    }
-
-    /**
-     * Returns the users
-     */
-    private Vector getUsers() {
-        if (users == null)
-            users = new Vector();
-        return users;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on OrganizationElement
-     */
-    public boolean isGroup() {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getForeground(java.lang.Object)
-     */
-    public RGB getForeground(Object element) {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getBackground(java.lang.Object)
-     */
-    public RGB getBackground(Object element) {
-        return null;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/IUserConstants.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/IUserConstants.java
deleted file mode 100644
index 6ee8086..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/IUserConstants.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.propertysheet;
-
-/**
- * This interface contains constants for use only within the
- * property sheet example.
- */
-public interface IUserConstants {
-    public static final String PLUGIN_ID = "org.eclipse.ui.examples.propertysheet"; //$NON-NLS-1$
-
-    public static final String PREFIX = PLUGIN_ID + "."; //$NON-NLS-1$
-
-    public static final String P_CONTENT_OUTLINE = PREFIX + "content_outline"; //$NON-NLS-1$
-
-    public static final String EXTENSION = "usr"; //$NON-NLS-1$
-
-    public static final String ATT_CLASS = "class"; //$NON-NLS-1$
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/MessageUtil.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/MessageUtil.java
deleted file mode 100644
index 41c020a..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/MessageUtil.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.propertysheet;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Utility class which helps with managing messages.
- */
-/* package */class MessageUtil {
-
-    private static final String RESOURCE_BUNDLE = "org.eclipse.ui.examples.propertysheet.messages";//$NON-NLS-1$
-
-    private static ResourceBundle fgResourceBundle = ResourceBundle
-            .getBundle(RESOURCE_BUNDLE);
-
-    private MessageUtil() {
-    }
-
-    /**
-     * Returns the formatted message for the given key in
-     * the resource bundle. 
-     *
-     * @param key the resource name
-     * @param args the message arguments
-     * @return the string
-     */
-    public static String format(String key, Object[] args) {
-        return MessageFormat.format(getString(key), args);
-    }
-
-    /**
-     * Returns the resource object with the given key in
-     * the resource bundle. If there isn't any value under
-     * the given key, the key is returned, surrounded by '!'s.
-     *
-     * @param key the resource name
-     * @return the string
-     */
-    public static String getString(String key) {
-        try {
-            return fgResourceBundle.getString(key);
-        } catch (MissingResourceException e) {
-            return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$
-        }
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/Name.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/Name.java
deleted file mode 100644
index a3e76ca..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/Name.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.examples.propertysheet;
-
-import java.util.Vector;
-
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * Example IPropertySource whose value as well as its children are editable.
- */
-public class Name implements IPropertySource {
-    private String firstName = ""; //$NON-NLS-1$
-
-    private String lastName = ""; //$NON-NLS-1$
-
-    private String initial = ""; //$NON-NLS-1$
-
-    // property unique keys
-    public static String P_ID_FIRSTNAME = "Name.FirstName"; //$NON-NLS-1$
-
-    public static String P_ID_LASTNAME = "Name.LastName"; //$NON-NLS-1$
-
-    public static String P_ID_MIDDLENAME = "Name.Middle"; //$NON-NLS-1$
-
-    // property display keys
-    public static String P_FIRSTNAME = MessageUtil.getString("FirstName"); //$NON-NLS-1$
-
-    public static String P_LASTNAME = MessageUtil.getString("LastName"); //$NON-NLS-1$
-
-    public static String P_MIDDLENAME = MessageUtil.getString("Middle"); //$NON-NLS-1$
-
-    // default values
-    //
-    private static final String FIRSTNAME_DEFAULT = null;
-
-    private static final String LASTNAME_DEFAULT = null;
-
-    private static final String MIDDLENAME_DEFAULT = null;
-
-    public static final String P_DESCRIPTORS = "properties"; //$NON-NLS-1$
-
-    static private Vector descriptors;
-    static {
-        descriptors = new Vector();
-        descriptors.addElement(new TextPropertyDescriptor(P_ID_FIRSTNAME,
-                P_FIRSTNAME));
-        descriptors.addElement(new TextPropertyDescriptor(P_ID_LASTNAME,
-                P_LASTNAME));
-        descriptors.addElement(new TextPropertyDescriptor(P_ID_MIDDLENAME,
-                P_MIDDLENAME));
-    }
-
-    /**
-     * Creates a new Name.
-     * @param name String in the form "firstname initial lastname"
-     */
-    public Name(String name) {
-        int index1, index2;
-        index1 = name.indexOf(' ');
-        if (index1 < 0)
-            index1 = name.length();
-        index2 = name.lastIndexOf(' ');
-        if (index2 > 0)
-            lastName = name.substring(index2 + 1);
-        firstName = name.substring(0, index1);
-        if (index1 < index2)
-            initial = name.substring(index1 + 1, index2);
-    }
-
-    /**
-     * Returns the descriptors
-     */
-    private static Vector getDescriptors() {
-        return descriptors;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public Object getEditableValue() {
-        return this.toString();
-    }
-
-    /**
-     * Returns the first name
-     */
-    private String getFirstName() {
-        return firstName;
-    }
-
-    /**
-     * Returns the initial
-     */
-    private String getInitial() {
-        return initial;
-    }
-
-    /**
-     * Returns the last name
-     */
-    private String getLastName() {
-        return lastName;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public IPropertyDescriptor[] getPropertyDescriptors() {
-        return (IPropertyDescriptor[]) getDescriptors().toArray(
-                new IPropertyDescriptor[getDescriptors().size()]);
-    }
-
-    /** 
-     * The <code>Name</code> implementation of this
-     * <code>IPropertySource</code> method returns the following properties
-     *
-     * 	1) P_FIRSTNAME returns String, firstname
-     * 	2) P_LASTNAME returns String, lastname
-     *  3) P_MIDDLENAME returns String, middle
-     */
-    public Object getPropertyValue(Object propKey) {
-        if (P_ID_FIRSTNAME.equals(propKey))
-            return getFirstName();
-        if (P_ID_LASTNAME.equals(propKey))
-            return getLastName();
-        if (P_ID_MIDDLENAME.equals(propKey))
-            return getInitial();
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public boolean isPropertySet(Object key) {
-        if (key.equals(P_ID_FIRSTNAME))
-            return getFirstName() != FIRSTNAME_DEFAULT;
-        if (key.equals(P_ID_LASTNAME))
-            return getLastName() != LASTNAME_DEFAULT;
-        if (key.equals(P_ID_MIDDLENAME))
-            return getInitial() != MIDDLENAME_DEFAULT;
-        return false;
-    }
-
-    /**
-     * Implemented as part of IPropertySource framework. Sets the specified property 
-     * to its default value.
-     * 
-     * @see 	IPropertySource#resetPropertyValue(Object)
-     * @param 	property 	The property to reset.
-     */
-    public void resetPropertyValue(Object property) {
-        if (P_ID_FIRSTNAME.equals(property)) {
-            setFirstName(FIRSTNAME_DEFAULT);
-            return;
-        }
-        if (P_ID_LASTNAME.equals(property)) {
-            setLastName(LASTNAME_DEFAULT);
-            return;
-        }
-        if (P_ID_MIDDLENAME.equals(property)) {
-            setInitial(MIDDLENAME_DEFAULT);
-            return;
-        }
-    }
-
-    /**
-     * Sets the first name
-     */
-    private void setFirstName(String newFirstName) {
-        firstName = newFirstName;
-    }
-
-    /**
-     * Sets the initial
-     */
-    private void setInitial(String newInitial) {
-        initial = newInitial;
-    }
-
-    /**
-     * Sets the last name
-     */
-    private void setLastName(String newLastName) {
-        lastName = newLastName;
-    }
-
-    /** 
-     * The <code>Name</code> implementation of this
-     * <code>IPropertySource</code> method 
-     * defines the following Setable properties
-     *
-     *	1) P_FIRST, expects String, sets the firstname of this OrganizationElement
-     *  2) P_MIDDLENAME, expects String, sets middlename of this OrganizationElement
-     *  3) P_LASTNAME, expects String, sets lastname of this OrganizationElement
-     */
-    public void setPropertyValue(Object propName, Object val) {
-        if (P_ID_FIRSTNAME.equals(propName)) {
-            setFirstName((String) val);
-            return;
-        }
-        if (P_ID_LASTNAME.equals(propName)) {
-            setLastName((String) val);
-            return;
-        }
-        if (P_ID_MIDDLENAME.equals(propName)) {
-            setInitial((String) val);
-            return;
-        }
-    }
-
-    /**
-     * The value as displayed in the Property Sheet. Will not print default values
-     * @return java.lang.String
-     */
-    public String toString() {
-        StringBuffer outStringBuffer = new StringBuffer();
-        if (getFirstName() != FIRSTNAME_DEFAULT) {
-            outStringBuffer.append(getFirstName());
-            outStringBuffer.append(" "); //$NON-NLS-1$
-        }
-        if (getInitial() != MIDDLENAME_DEFAULT) {
-            outStringBuffer.append(getInitial());
-            outStringBuffer.append(" "); //$NON-NLS-1$
-        }
-        if (getLastName() != LASTNAME_DEFAULT) {
-            outStringBuffer.append(getLastName());
-        }
-
-        return outStringBuffer.toString();
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/OrganizationElement.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/OrganizationElement.java
deleted file mode 100644
index d536e8d..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/OrganizationElement.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.propertysheet;
-
-import java.util.Vector;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * An Organization Element
- */
-public abstract class OrganizationElement implements IAdaptable,
-        IPropertySource, IWorkbenchAdapter {
-    //
-    private GroupElement parent;
-
-    private String name;
-
-    private ImageDescriptor imageDescriptor;
-
-    //
-    private static Vector descriptors;
-    static {
-        descriptors = new Vector();
-        PropertyDescriptor name = new TextPropertyDescriptor(
-                IBasicPropertyConstants.P_TEXT, MessageUtil.getString("name")); //$NON-NLS-1$
-        descriptors.addElement(name);
-    }
-
-    /**
-     * Constructor.
-     * Creates a new OrganizationElement within the passed parent GroupElement,
-     *
-     * @param name the name 
-     * @param parent the parent
-     */
-    OrganizationElement(String name, GroupElement parent) {
-        this.name = name;
-        this.parent = parent;
-    }
-
-    /**
-     * Deletes this OrganizationElement from its parentGroup
-     */
-    public void delete() {
-        parent.delete(this);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IAdaptable
-     */
-    public Object getAdapter(Class adapter) {
-        if (adapter == IPropertySource.class) {
-            return this;
-        }
-        if (adapter == IWorkbenchAdapter.class) {
-            return this;
-        }
-        return null;
-    }
-
-    /**
-     * Returns the descriptors
-     */
-    static Vector getDescriptors() {
-        return descriptors;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public Object getEditableValue() {
-        return this;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchAdapter
-     */
-    public ImageDescriptor getImageDescriptor(Object object) {
-        return imageDescriptor;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchAdapter
-     */
-    public String getLabel(Object o) {
-        return getName();
-    }
-
-    /**
-     * Returns the name
-     */
-    String getName() {
-        return name;
-    }
-
-    /**
-     * Returns the parent
-     */
-    public Object getParent(Object o) {
-        return parent;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public IPropertyDescriptor[] getPropertyDescriptors() {
-        return (IPropertyDescriptor[]) getDescriptors().toArray(
-                new IPropertyDescriptor[getDescriptors().size()]);
-    }
-
-    /** 
-     * The <code>OrganizationElement</code> implementation of this
-     * <code>IPropertySource</code> method returns the following properties
-     *
-     * 	1) P_NAME returns String, name of this element
-     *  this property key is defined in <code>IBasicPropertyConstants</code>
-     */
-    public Object getPropertyValue(Object propKey) {
-        if (propKey.equals(IBasicPropertyConstants.P_TEXT))
-            return getName();
-        return null;
-    }
-
-    /**
-     * Hook. Implemented by <code>GroupElement</code> for use instead of instanceof
-     * @return boolean
-     */
-    public boolean isGroup() {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public boolean isPropertySet(Object property) {
-        return false;
-    }
-
-    /**
-     * Hook. Implemented by <code>UserElement</code> for use instead of instanceof
-     * @return boolean
-     */
-    public boolean isUser() {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public void resetPropertyValue(Object property) {
-    }
-
-    /**
-     * Sets the image descriptor
-     */
-    void setImageDescriptor(ImageDescriptor desc) {
-        imageDescriptor = desc;
-    }
-
-    /**
-     * Sets the name
-     */
-    void setName(String newName) {
-        name = newName;
-    }
-
-    /**
-     * Sets this instance's parent back pointer.
-     */
-    void setParent(GroupElement newParent) {
-        parent = newParent;
-    }
-
-    /** 
-     * The <code>OrganizationElement</code> implementation of this
-     * <code>IPropertySource</code> method returns the following properties
-     * defines the following Setable properties
-     *
-     *	1) P_NAME, expects String, sets the name of this OrganizationElement
-     */
-    public void setPropertyValue(Object name, Object value) {
-        if (name.equals(IBasicPropertyConstants.P_TEXT)) {
-            setName((String) value);
-            return;
-        }
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/PopupMenuActionDelegate.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/PopupMenuActionDelegate.java
deleted file mode 100644
index 49b9773..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/PopupMenuActionDelegate.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.propertysheet;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Action delegate for handling popup menu actions.
- */
-public class PopupMenuActionDelegate implements IObjectActionDelegate {
-
-    private IWorkbenchPart part;
-
-    /** (non-Javadoc)
-     * Method declared on IDropActionDelegate
-     */
-    public void run(IAction action) {
-        MessageDialog.openInformation(this.part.getSite().getShell(),
-                MessageUtil.getString("Property_Sheet_Example"), //$NON-NLS-1$
-                MessageUtil.getString("Popup_Menu_Action_executed")); //$NON-NLS-1$
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IActionDelegate
-     */
-    public void selectionChanged(IAction action, ISelection selection) {
-        //Ignored for this example
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IObjectActionDelegate
-     */
-    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-        this.part = targetPart;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/PropertySheetContentOutlinePage.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/PropertySheetContentOutlinePage.java
deleted file mode 100644
index b90da25..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/PropertySheetContentOutlinePage.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.propertysheet;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-
-/**
- * Page for the content outliner
- */
-public class PropertySheetContentOutlinePage extends ContentOutlinePage {
-
-    private IAdaptable model;
-
-    /**
-     * Create a new instance of the reciver using adapatable
-     * as the model.
-     */
-    public PropertySheetContentOutlinePage(IAdaptable adaptable) {
-        this.model = adaptable;
-    }
-
-    /** 
-     * Creates the control and registers the popup menu for this page
-     * Menu id "org.eclipse.ui.examples.propertysheet.outline"
-     */
-    public void createControl(Composite parent) {
-        super.createControl(parent);
-        TreeViewer viewer = getTreeViewer();
-        viewer.setContentProvider(new WorkbenchContentProvider());
-        viewer.setLabelProvider(new WorkbenchLabelProvider());
-        viewer.setInput(this.model);
-        viewer.expandAll();
-
-        // Configure the context menu.
-        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
-        menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-        menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS
-                + "-end")); //$NON-NLS-1$
-
-        Menu menu = menuMgr.createContextMenu(viewer.getTree());
-        viewer.getTree().setMenu(menu);
-        // Be sure to register it so that other plug-ins can add actions.
-        getSite()
-                .registerContextMenu(
-                        "org.eclipse.ui.examples.propertysheet.outline", menuMgr, viewer); //$NON-NLS-1$
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/PropertySheetPlugin.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/PropertySheetPlugin.java
deleted file mode 100644
index df93199..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/PropertySheetPlugin.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Joe Bowbeer (jozart@blarg.net) - removed dependency on runtime compatibility layer (bug 74526)
- *******************************************************************************/
-package org.eclipse.ui.examples.propertysheet;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * This is the top-level class of the property sheet example.
- *
- * @see AbstractUIPlugin for additional information on UI plugins
- */
-public class PropertySheetPlugin extends AbstractUIPlugin {
-    // Default instance of the receiver
-    private static PropertySheetPlugin inst;
-
-    /**
-     * Create the PropertySheet plugin and cache its default instance
-     */
-    public PropertySheetPlugin() {
-        if (inst == null)
-            inst = this;
-    }
-
-    /**
-     * Returns the plugin singleton.
-     *
-     * @return the default PropertySheetPlugin instance
-     */
-    static public PropertySheetPlugin getDefault() {
-        return inst;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/StreetAddress.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/StreetAddress.java
deleted file mode 100644
index 8202b75..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/StreetAddress.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.propertysheet;
-
-import java.util.Vector;
-
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * PropertySource containing street information pertenant to Address
- */
-public class StreetAddress implements IPropertySource {
-
-    //properties
-    private Integer buildNo;
-
-    private String aptBox;
-
-    private String streetName;
-
-    //default property values
-    private static final Integer BUILD_NO_DEFAULT = new Integer(0);
-
-    private static final String APTBOX_DEFAULT = MessageUtil
-            .getString("unspecified"); //$NON-NLS-1$
-
-    private static final String STREETNAME_DEFAULT = MessageUtil
-            .getString("unspecified"); //$NON-NLS-1$
-
-    //property unique keys
-    public static final String P_ID_BUILD_NO = "Street.buildingNo"; //$NON-NLS-1$
-
-    public static final String P_ID_APTBOX = "Street.aptNo"; //$NON-NLS-1$
-
-    public static final String P_ID_STREET = "Street.street"; //$NON-NLS-1$
-
-    //property display keys
-    public static final String P_BUILD_NO = MessageUtil
-            .getString("building_number"); //$NON-NLS-1$
-
-    public static final String P_APTBOX = MessageUtil
-            .getString("apt.no_or_box.no"); //$NON-NLS-1$
-
-    public static final String P_STREET = MessageUtil.getString("street"); //$NON-NLS-1$
-
-    //
-    private static Vector descriptors;
-
-    static {
-        descriptors = new Vector();
-        descriptors.addElement(new TextPropertyDescriptor(P_ID_BUILD_NO,
-                P_BUILD_NO));
-        descriptors
-                .addElement(new TextPropertyDescriptor(P_ID_APTBOX, P_APTBOX));
-        descriptors
-                .addElement(new TextPropertyDescriptor(P_ID_STREET, P_STREET));
-    }
-
-    /**
-     * Street Default Constructor.
-     */
-    public StreetAddress() {
-        super();
-    }
-
-    /**
-     * Convenience Street constructor. AptBox set to default
-     */
-    public StreetAddress(int buildNo, String streetName) {
-        super();
-        setBuildNo(new Integer(buildNo));
-        setStreetName(streetName);
-    }
-
-    /**
-     * Convenience Street constructor.
-     */
-    public StreetAddress(int buildNo, String aptBox, String streetName) {
-        super();
-        setBuildNo(new Integer(buildNo));
-        setAptBox(aptBox);
-        setStreetName(streetName);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Object
-     */
-    public boolean equals(Object ob) {
-        return toString().equals(ob.toString());
-    }
-
-    /**
-     * the appartment number
-     */
-    private String getAptBox() {
-        if (aptBox == null)
-            aptBox = APTBOX_DEFAULT;
-        return aptBox;
-    }
-
-    /**
-     * Returns the building number
-     */
-    private Integer getBuildNo() {
-        if (buildNo == null)
-            buildNo = BUILD_NO_DEFAULT;
-        return buildNo;
-    }
-
-    /**
-     * Returns the descriptors
-     */
-    private static Vector getDescriptors() {
-        return descriptors;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public Object getEditableValue() {
-        return this.toString();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public IPropertyDescriptor[] getPropertyDescriptors() {
-        return (IPropertyDescriptor[]) getDescriptors().toArray(
-                new IPropertyDescriptor[getDescriptors().size()]);
-    }
-
-    /** 
-     * The <code>Name</code> implementation of this
-     * <code>IPropertySource</code> method returns the following properties
-     *
-     * 	1) P_BUILD_NO returns java.lang.Integer
-     * 	2) P_APTBOX returns java.lang.String
-     *	3) P_STREET returns java.lang.String
-     */
-    public Object getPropertyValue(Object propKey) {
-        if (propKey.equals(P_ID_BUILD_NO))
-            return getBuildNo().toString();
-        if (propKey.equals(P_ID_APTBOX))
-            return getAptBox();
-        if (propKey.equals(P_ID_STREET))
-            return getStreetName();
-        return null;
-    }
-
-    /**
-     * Returns the street name
-     */
-    private String getStreetName() {
-        if (streetName == null)
-            streetName = STREETNAME_DEFAULT;
-        return streetName;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Object
-     */
-    public int hashCode() {
-        return toString().hashCode();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public boolean isPropertySet(Object property) {
-        if (property.equals(P_ID_BUILD_NO))
-            return getBuildNo() != BUILD_NO_DEFAULT;
-        if (property.equals(P_ID_APTBOX))
-            return getAptBox() != APTBOX_DEFAULT;
-        if (property.equals(P_ID_STREET))
-            return getStreetName() != STREETNAME_DEFAULT;
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public void resetPropertyValue(Object property) {
-        if (property.equals(P_ID_BUILD_NO)) {
-            setBuildNo(BUILD_NO_DEFAULT);
-            return;
-        }
-        if (property.equals(P_ID_APTBOX)) {
-            setAptBox(APTBOX_DEFAULT);
-            return;
-        }
-        if (property.equals(P_ID_STREET)) {
-            setStreetName(STREETNAME_DEFAULT);
-            return;
-        }
-    }
-
-    /**
-     * Sets the appartment number
-     */
-    private void setAptBox(String newAptBox) {
-        aptBox = newAptBox;
-    }
-
-    /**
-     * Sets the building number
-     */
-    private void setBuildNo(Integer newBuildNo) {
-        buildNo = newBuildNo;
-    }
-
-    /** 
-     * The <code>Name</code> implementation of this
-     * <code>IPropertySource</code> method 
-     * defines the following Setable properties
-     *
-     * 	1) P_BUILD_NO expects java.lang.Integer
-     * 	2) P_APTBOX expects java.lang.String
-     *	3) P_STREET expects java.lang.String
-     */
-    public void setPropertyValue(Object name, Object value) {
-        if (name.equals(P_ID_BUILD_NO)) {
-            try {
-                setBuildNo(new Integer(Integer.parseInt((String) value)));
-            } catch (NumberFormatException e) {
-                setBuildNo(BUILD_NO_DEFAULT);
-            }
-            return;
-        }
-        if (name.equals(P_ID_APTBOX)) {
-            setAptBox((String) value);
-            return;
-        }
-        if (name.equals(P_ID_STREET)) {
-            setStreetName((String) value);
-            return;
-        }
-    }
-
-    /**
-     * Sets the street name
-     */
-    private void setStreetName(String newStreetName) {
-        streetName = newStreetName;
-    }
-
-    /**
-     * The value as displayed in the Property Sheet. Will not print default values
-     * @return java.lang.String
-     */
-    public String toString() {
-        StringBuffer outStringBuffer = new StringBuffer();
-        if (!getAptBox().equals(APTBOX_DEFAULT)) {
-            outStringBuffer.append(getAptBox());
-            outStringBuffer.append(", "); //$NON-NLS-1$
-        }
-        if (!getBuildNo().equals(BUILD_NO_DEFAULT)) {
-            outStringBuffer.append(getBuildNo());
-            outStringBuffer.append(" "); //$NON-NLS-1$
-        }
-        if (!getStreetName().equals(STREETNAME_DEFAULT)) {
-            outStringBuffer.append(getStreetName());
-        }
-        return outStringBuffer.toString();
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/UserEditor.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/UserEditor.java
deleted file mode 100644
index 9c726b4..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/UserEditor.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.propertysheet;
-
-import org.eclipse.jface.text.Document;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.editors.text.TextEditor;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheetPage;
-
-/**
- * This class implements the User editor.
- */
-public class UserEditor extends TextEditor {
-    private ContentOutlinePage userContentOutline;
-
-    /**
-     * UserEditor default Constructor
-     */
-    public UserEditor() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on WorkbenchPart
-     */
-    public void createPartControl(Composite parent) {
-        super.createPartControl(parent);
-        getSourceViewer().setDocument(
-                new Document(MessageUtil.getString("Editor_instructions"))); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IAdaptable
-     */
-    public Object getAdapter(Class adapter) {
-        if (adapter.equals(IContentOutlinePage.class)) {
-            return getContentOutline();
-        }
-        if (adapter.equals(IPropertySheetPage.class)) {
-            return getPropertySheet();
-        }
-        return super.getAdapter(adapter);
-    }
-
-    /**
-     * Returns the content outline.
-     */
-    protected ContentOutlinePage getContentOutline() {
-        if (userContentOutline == null) {
-            //Create a property outline page using the parsed result of passing in the document provider.
-            userContentOutline = new PropertySheetContentOutlinePage(
-                    new UserFileParser().parse(getDocumentProvider()));
-        }
-        return userContentOutline;
-    }
-
-    /**
-     * Returns the property sheet.
-     */
-    protected IPropertySheetPage getPropertySheet() {
-        return new PropertySheetPage();
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/UserElement.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/UserElement.java
deleted file mode 100644
index fa5cc4a..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/UserElement.java
+++ /dev/null
@@ -1,615 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.propertysheet;
-
-import java.util.Vector;
-
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.ui.views.properties.ColorPropertyDescriptor;
-import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySheetEntry;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * A User Element
- */
-public class UserElement extends OrganizationElement {
-
-    // Properties
-    private Name fullName;
-
-    private Address address;
-
-    private String phoneNumber;
-
-    private EmailAddress emailAddress;
-
-    private Boolean coop;
-
-    private Birthday birthday;
-
-    private Float salary;
-
-    private RGB hairColor;
-
-    private RGB eyeColor;
-
-    // Property default values
-    private Name fullName_Default;
-
-    private Address address_Default;
-
-    private String phoneNumber_Default = "555-1111"; //$NON-NLS-1$
-
-    private EmailAddress emailAddress_Default;
-
-    private Boolean coop_Default;
-
-    private Birthday birthday_Default;
-
-    private Float salary_Default;
-
-    private RGB hairColor_Default;
-
-    private RGB eyeColor_Default;
-
-    // Property unique keys
-    public static final String P_ID_PHONENUMBER = "User.phonenumber"; //$NON-NLS-1$
-
-    public static final String P_ID_ADDRESS = "User.address"; //$NON-NLS-1$
-
-    public static final String P_ID_FULLNAME = "User.fullname"; //$NON-NLS-1$
-
-    public static final String P_ID_EMAIL = "User.email"; //$NON-NLS-1$
-
-    public static final String P_ID_COOP = "User.coop student"; //$NON-NLS-1$
-
-    public static final String P_ID_BDAY = "User.birthday"; //$NON-NLS-1$
-
-    public static final String P_ID_SALARY = "User.salary"; //$NON-NLS-1$
-
-    public static final String P_ID_HAIRCOLOR = "User.haircolor"; //$NON-NLS-1$
-
-    public static final String P_ID_EYECOLOR = "User.eyecolor"; //$NON-NLS-1$
-
-    // Property display keys
-    public static final String P_PHONENUMBER = MessageUtil
-            .getString("phonenumber"); //$NON-NLS-1$
-
-    public static final String P_ADDRESS = MessageUtil.getString("address"); //$NON-NLS-1$
-
-    public static final String P_FULLNAME = MessageUtil.getString("fullname"); //$NON-NLS-1$
-
-    public static final String P_EMAIL = MessageUtil.getString("email"); //$NON-NLS-1$
-
-    public static final String P_COOP = MessageUtil.getString("coop_student"); //$NON-NLS-1$
-
-    public static final String P_BDAY = MessageUtil.getString("birthday"); //$NON-NLS-1$
-
-    public static final String P_SALARY = MessageUtil.getString("salary"); //$NON-NLS-1$
-
-    public static final String P_HAIRCOLOR = MessageUtil.getString("haircolor"); //$NON-NLS-1$
-
-    public static final String P_EYECOLOR = MessageUtil.getString("eyecolor"); //$NON-NLS-1$
-
-    // Help context ids
-    private static final String PHONE_NUMBER_CONTEXT = "org.eclipse.ui.examples.propertysheet.phone_number_context"; //$NON-NLS-1$
-
-    private static final String ADDRESS_CONTEXT = "org.eclipse.ui.examples.propertysheet.address_context"; //$NON-NLS-1$
-
-    private static final String FULL_NAME_CONTEXT = "org.eclipse.ui.examples.propertysheet.full_name_context"; //$NON-NLS-1$
-
-    private static final String EMAIL_CONTEXT = "org.eclipse.ui.examples.propertysheet.email_context"; //$NON-NLS-1$
-
-    private static final String COOP_CONTEXT = "org.eclipse.ui.examples.propertysheet.coop_context"; //$NON-NLS-1$
-
-    private static final String BIRTHDAY_CONTEXT = "org.eclipse.ui.examples.propertysheet.birthday_context"; //$NON-NLS-1$
-
-    private static final String SALARY_CONTEXT = "org.eclipse.ui.examples.propertysheet.salary_context"; //$NON-NLS-1$
-
-    private static final String HAIR_COLOR__CONTEXT = "org.eclipse.ui.examples.propertysheet.hair_color_context"; //$NON-NLS-1$
-
-    private static final String EYE_COLOR_CONTEXT = "org.eclipse.ui.examples.propertysheet.eye_color_context"; //$NON-NLS-1$
-
-    // Property Category
-    public static final String P_CONTACTINFO = MessageUtil.getString("contact"); //$NON-NLS-1$
-
-    public static final String P_PERSONELINFO = MessageUtil
-            .getString("personel"); //$NON-NLS-1$
-
-    public static final String P_PERSONALINFO = MessageUtil
-            .getString("personal"); //$NON-NLS-1$
-
-    // Property Values
-    public static final Integer P_VALUE_TRUE = new Integer(0);
-
-    public static final Integer P_VALUE_FALSE = new Integer(1);
-
-    public static final String P_VALUE_TRUE_LABEL = MessageUtil
-            .getString("true"); //$NON-NLS-1$
-
-    public static final String P_VALUE_FALSE_LABEL = MessageUtil
-            .getString("false"); //$NON-NLS-1$
-
-    static private class BooleanLabelProvider extends LabelProvider {
-        public String getText(Object element) {
-            String[] values = new String[] { P_VALUE_TRUE_LABEL,
-                    P_VALUE_FALSE_LABEL };
-            return values[((Integer) element).intValue()];
-        }
-    }
-
-    //
-    static private Vector descriptors;
-    static {
-        descriptors = new Vector();
-        PropertyDescriptor propertyDescriptor;
-
-        ///
-        propertyDescriptor = new TextPropertyDescriptor(P_ID_PHONENUMBER,
-                P_PHONENUMBER);
-        propertyDescriptor.setCategory(P_CONTACTINFO);
-        propertyDescriptor.setHelpContextIds(PHONE_NUMBER_CONTEXT);
-        descriptors.addElement(propertyDescriptor);
-
-        ///
-        propertyDescriptor = new PropertyDescriptor(P_ID_ADDRESS, P_ADDRESS);
-        propertyDescriptor.setCategory(P_CONTACTINFO);
-        propertyDescriptor.setHelpContextIds(ADDRESS_CONTEXT);
-        descriptors.addElement(propertyDescriptor);
-
-        ///
-        propertyDescriptor = new TextPropertyDescriptor(P_ID_EMAIL, P_EMAIL);
-        propertyDescriptor.setCategory(P_CONTACTINFO);
-        propertyDescriptor.setHelpContextIds(EMAIL_CONTEXT);
-        propertyDescriptor.setValidator(new EmailAddressValidator());
-        descriptors.addElement(propertyDescriptor);
-
-        ///
-        propertyDescriptor = new TextPropertyDescriptor(P_ID_FULLNAME,
-                P_FULLNAME);
-        propertyDescriptor.setCategory(P_PERSONELINFO);
-        propertyDescriptor.setHelpContextIds(FULL_NAME_CONTEXT);
-        descriptors.addElement(propertyDescriptor);
-
-        ///
-        propertyDescriptor = new PropertyDescriptor(P_ID_BDAY, P_BDAY);
-        propertyDescriptor.setCategory(P_PERSONELINFO);
-        propertyDescriptor.setHelpContextIds(BIRTHDAY_CONTEXT);
-        descriptors.addElement(propertyDescriptor);
-
-        ///
-        propertyDescriptor = new ComboBoxPropertyDescriptor(P_ID_COOP, P_COOP,
-                new String[] { P_VALUE_TRUE_LABEL, P_VALUE_FALSE_LABEL });
-        propertyDescriptor.setCategory(P_PERSONELINFO);
-        propertyDescriptor.setHelpContextIds(COOP_CONTEXT);
-        propertyDescriptor.setLabelProvider(new BooleanLabelProvider());
-        descriptors.addElement(propertyDescriptor);
-
-        ///
-        propertyDescriptor = new TextPropertyDescriptor(P_ID_SALARY, P_SALARY);
-        //add custom validator to propertyDescriptor limiting salary values to be
-        //greator than zero
-        propertyDescriptor.setHelpContextIds(new Object[] { SALARY_CONTEXT });
-        propertyDescriptor
-                .setFilterFlags(new String[] { IPropertySheetEntry.FILTER_ID_EXPERT });
-        propertyDescriptor.setValidator(new ICellEditorValidator() {
-            public String isValid(Object value) {
-                if (value == null)
-                    return MessageUtil.getString("salary_is_invalid"); //$NON-NLS-1$
-                //
-                Float trySalary;
-                try {
-                    trySalary = new Float(Float.parseFloat((String) value));
-                } catch (NumberFormatException e) {
-                    return MessageUtil.getString("salary_is_invalid"); //$NON-NLS-1$
-                }
-                if (trySalary.floatValue() < 0.0)
-                    return MessageUtil
-                            .getString("salary_must_be_greator_than_zero"); //$NON-NLS-1$
-                return null;
-            }
-        });
-        propertyDescriptor.setCategory(P_PERSONELINFO);
-        descriptors.addElement(propertyDescriptor);
-
-        /// HairColor
-        propertyDescriptor = new ColorPropertyDescriptor(P_ID_HAIRCOLOR,
-                P_HAIRCOLOR);
-        propertyDescriptor.setCategory(P_PERSONALINFO);
-        propertyDescriptor.setHelpContextIds(HAIR_COLOR__CONTEXT);
-        descriptors.addElement(propertyDescriptor);
-
-        /// EyeColor
-        propertyDescriptor = new ColorPropertyDescriptor(P_ID_EYECOLOR,
-                P_EYECOLOR);
-        propertyDescriptor.setCategory(P_PERSONALINFO);
-        propertyDescriptor.setHelpContextIds(EYE_COLOR_CONTEXT);
-        descriptors.addElement(propertyDescriptor);
-
-        //gets descriptors from parent, warning name-space collision may occur
-        Vector parentDescriptors = OrganizationElement.getDescriptors();
-        for (int i = 0; i < parentDescriptors.size(); i++) {
-            descriptors.addElement(parentDescriptors.elementAt(i));
-        }
-    }
-
-    /**
-     * Constructor. Default visibility only called from GroupElement.createSubGroup()
-     * Creates a new UserElement within the passed parent GroupElement,
-     * *
-     * @param name the name 
-     * @param parent the parent
-     */
-    UserElement(String name, GroupElement parent) {
-        super(name, parent);
-    }
-
-    /**
-     * Returns the address
-     */
-    private Address getAddress() {
-        if (address == null)
-            address = new Address();
-        return address;
-    }
-
-    /**
-     * Returns the birthday
-     */
-    private Birthday getBirthday() {
-        if (birthday == null)
-            birthday = new Birthday();
-        return birthday;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchAdapter
-     */
-    public Object[] getChildren(Object o) {
-        return new Object[0];
-    }
-
-    /**
-     * Returns the coop
-     */
-    private Boolean getCoop() {
-        if (coop == null)
-            coop = new Boolean(false);
-        return coop;
-    }
-
-    /**
-     * Returns the descriptors
-     */
-    static Vector getDescriptors() {
-        return descriptors;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public Object getEditableValue() {
-        return this.toString();
-    }
-
-    /**
-     * Returns the email address
-     */
-    EmailAddress getEmailAddress() {
-        if (emailAddress == null)
-            emailAddress = new EmailAddress();
-        return emailAddress;
-    }
-
-    /**
-     * Returns the eye color
-     */
-    private RGB getEyeColor() {
-        if (eyeColor == null)
-            eyeColor = new RGB(60, 60, 60);
-        return eyeColor;
-    }
-
-    /**
-     * Returns the full name
-     */
-    private Name getFullName() {
-        if (fullName == null)
-            fullName = new Name(getName());
-        return fullName;
-    }
-
-    /**
-     * Returns the hair color
-     */
-    private RGB getHairColor() {
-        if (hairColor == null)
-            hairColor = new RGB(255, 255, 255);
-        return hairColor;
-    }
-
-    /**
-     * Returns the phone number
-     */
-    private String getPhoneNumber() {
-        return phoneNumber;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public IPropertyDescriptor[] getPropertyDescriptors() {
-        return (IPropertyDescriptor[]) getDescriptors().toArray(
-                new IPropertyDescriptor[getDescriptors().size()]);
-    }
-
-    /** 
-     * The <code>Userment</code> implementation of this
-     * <code>IPropertySource</code> method returns the following properties
-     *
-     *	1) P_ADDRESS returns Address (IPropertySource), the address of this user
-     * 	2) P_FULLNAME returns Name (IPropertySource), the full name of this user
-     *  3) P_PHONENUMBER returns String, the phone number of this user
-     *  4) P_EMAIL returns EmailAddress (IPropertySource), the email address of this user
-     *  5) P_COOP returns Boolean, whether the individual is a coop student or not
-     *  6) P_BDAY returns Birthday
-     *  7) P_SALARY return java.lang.Float
-     *  8) P_HAIRCOLOR, expects RGB
-     *  9) P_EYECOLOR, expects RGB
-     */
-    public Object getPropertyValue(Object propKey) {
-        if (propKey.equals(P_ID_ADDRESS))
-            return getAddress();
-        if (propKey.equals(P_ID_FULLNAME))
-            return getFullName();
-        if (propKey.equals(P_ID_PHONENUMBER))
-            return getPhoneNumber();
-        if (propKey.equals(P_ID_EMAIL))
-            return getEmailAddress();
-        if (propKey.equals(P_ID_COOP))
-            return getCoop().equals(Boolean.TRUE) ? P_VALUE_TRUE
-                    : P_VALUE_FALSE;
-        if (propKey.equals(P_ID_BDAY))
-            return getBirthday();
-        if (propKey.equals(P_ID_SALARY))
-            return getSalary().toString();
-        if (propKey.equals(P_ID_HAIRCOLOR))
-            return getHairColor();
-        if (propKey.equals(P_ID_EYECOLOR))
-            return getEyeColor();
-        return super.getPropertyValue(propKey);
-    }
-
-    /**
-     * Returns the salary
-     */
-    private Float getSalary() {
-        if (salary == null)
-            salary = new Float(0);
-        return salary;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public boolean isPropertySet(Object property) {
-        if (property.equals(P_ID_ADDRESS))
-            return getAddress() != address_Default;
-        if (property.equals(P_ID_FULLNAME))
-            return getFullName() != fullName_Default;
-        if (property.equals(P_ID_PHONENUMBER))
-            return getPhoneNumber() != phoneNumber_Default;
-        if (property.equals(P_ID_EMAIL))
-            return getEmailAddress() != emailAddress_Default;
-        if (property.equals(P_ID_COOP))
-            return getCoop() != coop_Default;
-        if (property.equals(P_ID_BDAY))
-            return getBirthday() != birthday_Default;
-        if (property.equals(P_ID_SALARY))
-            return getSalary() != salary_Default;
-        if (property.equals(P_ID_HAIRCOLOR))
-            return getHairColor() != hairColor_Default;
-        if (property.equals(P_ID_EYECOLOR))
-            return getEyeColor() != eyeColor_Default;
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on OrganizationElement
-     */
-    public boolean isUser() {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public void resetPropertyValue(Object property) {
-        if (property.equals(P_ID_ADDRESS)) {
-            setAddress(address_Default);
-            return;
-        }
-        if (property.equals(P_ID_FULLNAME)) {
-            setFullName(fullName_Default);
-            return;
-        }
-        if (property.equals(P_ID_PHONENUMBER)) {
-            setPhoneNumber(phoneNumber_Default);
-            return;
-        }
-        if (property.equals(P_ID_EMAIL)) {
-            setEmailAddress(emailAddress_Default);
-            return;
-        }
-        if (property.equals(P_ID_COOP)) {
-            setCoop(coop_Default);
-        }
-        if (property.equals(P_ID_BDAY)) {
-            setBirthday(birthday_Default);
-            return;
-        }
-        if (property.equals(P_ID_SALARY)) {
-            setSalary(salary_Default);
-            return;
-        }
-        if (property.equals(P_ID_HAIRCOLOR)) {
-            setHairColor(hairColor_Default);
-            return;
-        }
-        if (property.equals(P_ID_EYECOLOR)) {
-            setEyeColor(eyeColor_Default);
-            return;
-        }
-        super.resetPropertyValue(property);
-    }
-
-    /**
-     * Sets the address
-     */
-    public void setAddress(Address newAddress) {
-        address = newAddress;
-    }
-
-    /**
-     * Sets the birthday
-     */
-    public void setBirthday(Birthday newBirthday) {
-        birthday = new Birthday();
-    }
-
-    /**
-     * Sets the coop
-     */
-    public void setCoop(Boolean newCoop) {
-        coop = newCoop;
-    }
-
-    /**
-     *Sets the email address
-     */
-    public void setEmailAddress(EmailAddress newEmailAddress) {
-        emailAddress = newEmailAddress;
-    }
-
-    /**
-     * Sets eye color
-     */
-    public void setEyeColor(RGB newEyeColor) {
-        eyeColor = newEyeColor;
-    }
-
-    /**
-     * Sets full name
-     */
-    public void setFullName(Name newFullName) {
-        fullName = newFullName;
-    }
-
-    /**
-     * Sets hair color
-     */
-    public void setHairColor(RGB newHairColor) {
-        hairColor = newHairColor;
-    }
-
-    /**
-     * Sets phone number
-     */
-    public void setPhoneNumber(String newPhoneNumber) {
-        phoneNumber = newPhoneNumber;
-    }
-
-    /** 
-     * The <code>OrganizationElement</code> implementation of this
-     * <code>IPropertySource</code> method 
-     * defines the following Setable properties
-     *
-     *	1) P_ADDRESS, expects Address
-     *	2) P_FULLNAME, expects Name
-     *	3) P_PHONENUMBER, expects String
-     *  4) P_EMAIL, expects EmailAddress.
-     *  5) P_BOOLEAN, expects Boolean, whether the individual is a coop student or not
-     *  6) P_BDAY, expects Birthday
-     *  7) P_SALARY, expects java.lang.Float
-     *  8) P_HAIRCOLOR, expects RGB
-     *  9) P_EYECOLOR, expects RGB
-     */
-    public void setPropertyValue(Object propKey, Object val) {
-        // need to convert from String to domain objects
-        if (propKey.equals(P_ID_ADDRESS)) {
-            //setAddress((Address)val);
-            return;
-        }
-        if (propKey.equals(P_ID_FULLNAME)) {
-            setFullName(new Name((String) val));
-            return;
-        }
-        if (propKey.equals(P_ID_PHONENUMBER)) {
-            setPhoneNumber((String) val);
-            return;
-        }
-        if (propKey.equals(P_ID_EMAIL)) {
-            setEmailAddress(new EmailAddress((String) val));
-            return;
-        }
-        if (propKey.equals(P_ID_COOP)) {
-            setCoop(((Integer) val).equals(P_VALUE_TRUE) ? Boolean.TRUE
-                    : Boolean.FALSE);
-        }
-        if (propKey.equals(P_ID_BDAY)) {
-            //setBirthday((Birthday)val);
-            return;
-        }
-        if (propKey.equals(P_ID_SALARY)) {
-            try {
-                setSalary(new Float(Float.parseFloat((String) val)));
-            } catch (NumberFormatException e) {
-                setSalary(salary_Default);
-            }
-            return;
-        }
-        if (propKey.equals(P_ID_HAIRCOLOR)) {
-            setHairColor((RGB) val);
-            return;
-        }
-        if (propKey.equals(P_ID_EYECOLOR)) {
-            setEyeColor((RGB) val);
-            return;
-        }
-        super.setPropertyValue(propKey, val);
-    }
-
-    /**
-     * Sets the salary
-     */
-    void setSalary(Float newSalary) {
-        salary = newSalary;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getForeground(java.lang.Object)
-     */
-    public RGB getForeground(Object element) {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getBackground(java.lang.Object)
-     */
-    public RGB getBackground(Object element) {
-        return null;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/UserFileParser.java b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/UserFileParser.java
deleted file mode 100644
index fc45ba6..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/UserFileParser.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.propertysheet;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-
-/**
- * This class is an example of the implementation of a simple parser.
- */
-public class UserFileParser {
-    /**
-     * Return the fabricated result for this example.
-     *
-     */
-    private static IAdaptable getFabricatedResult() {
-        // returns fabricated input. 
-        GroupElement root = new GroupElement(
-                MessageUtil.getString("Everybody"), null); //$NON-NLS-1$
-        GroupElement userGroup = root.createSubGroup(MessageUtil
-                .getString("Company_Inc")); //$NON-NLS-1$
-        GroupElement ottGroup = userGroup.createSubGroup(MessageUtil
-                .getString("Waterloo_Lab")); //$NON-NLS-1$
-        userGroup.createSubGroup(MessageUtil.getString("Toronto_Lab")); //$NON-NLS-1$
-        userGroup.createSubGroup(MessageUtil.getString("Hamilton_Lab")); //$NON-NLS-1$
-        userGroup.createSubGroup(MessageUtil.getString("London_Lab")); //$NON-NLS-1$
-        userGroup.createSubGroup(MessageUtil.getString("Grimsby_Lab")); //$NON-NLS-1$
-        GroupElement uiTeam = ottGroup.createSubGroup(MessageUtil
-                .getString("Team1")); //$NON-NLS-1$
-        //
-        UserElement user1 = uiTeam.createUser("richard"); //$NON-NLS-1$
-        user1.setFullName(new Name(MessageUtil.getString("Richard_Zokol"))); //$NON-NLS-1$
-        user1.setEmailAddress(new EmailAddress(MessageUtil
-                .getString("rzokol@company.com"))); //$NON-NLS-1$
-        user1.setPhoneNumber("x789"); //$NON-NLS-1$
-        user1
-                .setAddress(new Address(
-                        new StreetAddress(232, MessageUtil
-                                .getString("Champlain")), MessageUtil.getString("Hull"), new Integer(5), MessageUtil.getString("A1B2C3"))); //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
-        user1.setBirthday(new Birthday(18, 1, 1981));
-        user1.setCoop(new Boolean(true));
-        user1.setHairColor(new RGB(0, 0, 0));
-        user1.setEyeColor(new RGB(0, 0, 0));
-        //
-        UserElement user2 = uiTeam.createUser("george"); //$NON-NLS-1$
-        user2.setFullName(new Name(MessageUtil.getString("George_Knudson"))); //$NON-NLS-1$
-        user2.setEmailAddress(new EmailAddress(MessageUtil
-                .getString("gknudson@company.com"))); //$NON-NLS-1$
-        user2.setPhoneNumber("x678"); //$NON-NLS-1$
-        user2
-                .setAddress(new Address(
-                        new StreetAddress(),
-                        MessageUtil.getString("Toronto"), new Integer(4), MessageUtil.getString("A1B2C3"))); //$NON-NLS-2$ //$NON-NLS-1$
-        user2.setBirthday(new Birthday(7, 5, 1978));
-        user2.setCoop(new Boolean(true));
-        user2.setHairColor(new RGB(0, 0, 0));
-        user2.setEyeColor(new RGB(0, 0, 0));
-
-        //
-        UserElement user3 = uiTeam.createUser("arnold"); //$NON-NLS-1$
-        user3.setFullName(new Name(MessageUtil.getString("Arnold_Palmer"))); //$NON-NLS-1$
-        user3.setEmailAddress(new EmailAddress(MessageUtil
-                .getString("apalmer@company.com"))); //$NON-NLS-1$
-        user3.setPhoneNumber("x567"); //$NON-NLS-1$
-        user3
-                .setAddress(new Address(
-                        new StreetAddress(),
-                        MessageUtil.getString("Ottawa"), new Integer(4), MessageUtil.getString("A1B2C3"))); //$NON-NLS-2$ //$NON-NLS-1$
-        user3.setBirthday(new Birthday(11, 23, 1962));
-        user3.setHairColor(new RGB(0, 0, 0));
-        user3.setEyeColor(new RGB(0, 0, 0));
-
-        //
-        UserElement user4 = uiTeam.createUser("lee"); //$NON-NLS-1$
-        user4.setFullName(new Name(MessageUtil.getString("Lee_Trevino"))); //$NON-NLS-1$
-        user4.setEmailAddress(new EmailAddress(MessageUtil
-                .getString("ltrevino@company.com"))); //$NON-NLS-1$
-        user4.setPhoneNumber("x456"); //$NON-NLS-1$
-        user4
-                .setAddress(new Address(
-                        new StreetAddress(),
-                        MessageUtil.getString("Ottawa"), new Integer(4), MessageUtil.getString("A1B2C3"))); //$NON-NLS-2$ //$NON-NLS-1$
-        //
-        UserElement user5 = uiTeam.createUser("tiger"); //$NON-NLS-1$
-        user5.setFullName(new Name(MessageUtil.getString("Tiger_Woods"))); //$NON-NLS-1$
-        user5.setEmailAddress(new EmailAddress(MessageUtil
-                .getString("twoods@company.com"))); //$NON-NLS-1$
-        user5.setPhoneNumber("x345"); //$NON-NLS-1$
-        user5
-                .setAddress(new Address(
-                        new StreetAddress(),
-                        MessageUtil.getString("Ottawa"), new Integer(4), MessageUtil.getString("A1B2C3"))); //$NON-NLS-2$ //$NON-NLS-1$
-        //
-        UserElement user6 = uiTeam.createUser("jack"); //$NON-NLS-1$
-        user6.setFullName(new Name(MessageUtil.getString("Jack_Nicklaus"))); //$NON-NLS-1$
-        user6.setEmailAddress(new EmailAddress(MessageUtil
-                .getString("jnicklaus@company.com"))); //$NON-NLS-1$
-        user6.setPhoneNumber("x234 "); //$NON-NLS-1$
-        user6
-                .setAddress(new Address(
-                        new StreetAddress(),
-                        MessageUtil.getString("Ottawa"), new Integer(4), MessageUtil.getString("A1B2C3"))); //$NON-NLS-2$ //$NON-NLS-1$
-        //
-        UserElement greg = uiTeam.createUser("weslock"); //$NON-NLS-1$
-        greg.setFullName(new Name(MessageUtil.getString("Weslock"))); //$NON-NLS-1$
-        greg.setEmailAddress(new EmailAddress(MessageUtil
-                .getString("weslock@company.com"))); //$NON-NLS-1$
-        greg.setPhoneNumber("x123"); //$NON-NLS-1$
-        greg
-                .setAddress(new Address(
-                        new StreetAddress(),
-                        MessageUtil.getString("Ottawa"), new Integer(4), MessageUtil.getString("A1B2C3"))); //$NON-NLS-2$ //$NON-NLS-1$
-
-        return root;
-    }
-
-    /**
-     * Parse the input given by the argument. For this example we do no parsing and return
-     * a fabricated result.
-     *
-     */
-    public IAdaptable parse(IDocumentProvider documentProvider) {
-
-        return getFabricatedResult();
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/messages.properties b/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/messages.properties
deleted file mode 100644
index edf96bc..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/Eclipse UI Examples PropertySheet/org/eclipse/ui/examples/propertysheet/messages.properties
+++ /dev/null
@@ -1,108 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Alberta=Alberta
-British_Columbia=British Columbia
-City=City
-Manitoba=Manitoba
-New_Brunswick=New Brunswick
-Newfoundland=Newfoundland
-North_West_Territories=North West Territories
-Nova_Scotia=Nova Scotia
-Nunavut=Nunavut
-Ontario=Ontario
-PostalCode=PostalCode
-Prince_Edward_Island=Prince Edward Island
-Province=Province
-Quebec=Quebec
-Saskatchewan=Saskatchewan
-Street=Street
-Yukon=Yukon
-_is_an_invalid_format_for_a_postal_code={0} is an invalid format for a postal code
-postal_code_is_incomplete=postal code is incomplete
-unspecified_city=unspecified city
-April=April
-August=August
-December=December
-February=February
-January=January
-July=July
-June=June
-March=March
-May=May
-November=November
-October=October
-September=September
-day=day
-month=month
-year=year
-domain=domain
-emailaddress_cannot_be_set_to_null=emailaddress cannot be set to null
-invalid_email_address_format_should_have_been_validated=invalid email address format, should have been validated
-unknownDomain=unknownDomain
-unknownUser=unknownUser
-userid=userid
-email_address_does_not_have_a_valid_format=email address does not have a valid format
-email_address_is_incomplete=email address is incomplete
-FirstName=FirstName
-LastName=LastName
-Middle=Middle
-name=name
-apt.no_or_box.no=apt.no or box.no
-building_number=building number
-street=street
-unspecified=unspecified
-Editor_instructions=Click on the items in the content outline\nto see their properties
-address=address
-birthday=birthday
-contact=contact
-coop_student=coop student
-email=email
-eyecolor=eyecolor
-false=false
-fullname=fullname
-haircolor=haircolor
-personal=personal
-personel=personel
-phonenumber=phonenumber
-salary=salary
-salary_is_invalid=salary is invalid
-salary_must_be_greator_than_zero=salary must be greator than zero
-true=true
-A1B2C3=A1B2C3
-Arnold_Palmer=Arnold Palmer
-Champlain=Champlain
-Company_Inc=Company Inc.
-Everybody=Everybody
-George_Knudson=George Knudson
-Grimsby_Lab=Grimsby Lab
-Hamilton_Lab=Hamilton Lab
-Hull=Hull
-Jack_Nicklaus=Jack Nicklaus
-Lee_Trevino=Lee Trevino
-London_Lab=London Lab
-Ottawa=Ottawa
-Richard_Zokol=Richard Zokol
-Team1=Team1
-Tiger_Woods=Tiger Woods
-Toronto=Toronto
-Toronto_Lab=Toronto Lab
-Waterloo_Lab=Waterloo Lab
-Weslock=Weslock
-apalmer@company.com=apalmer@company.com
-gknudson@company.com=gknudson@company.com
-jnicklaus@company.com=jnicklaus@company.com
-ltrevino@company.com=ltrevino@company.com
-rzokol@company.com=rzokol@company.com
-twoods@company.com=twoods@company.com
-weslock@company.com=weslock@company.com
-Popup_Menu_Action_executed=Popup Menu Action executed
-Property_Sheet_Example=Property Sheet Example
-
diff --git a/examples/org.eclipse.ui.examples.propertysheet/HelpContexts.xml b/examples/org.eclipse.ui.examples.propertysheet/HelpContexts.xml
deleted file mode 100644
index 0a1ed0a..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/HelpContexts.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<contexts>
-
-   <context  id="phone_number_context" >
-      <description>Help for phone number</description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 1"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 2"/>
-   </context>
-   <context  id="address_context" >
-      <description>Help for address </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 1"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 2"/>
-   </context>
-   <context  id="full_name_context" >
-      <description>Help for full name </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 1"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 2"/>
-   </context>
-   <context  id="email_context" >
-      <description>Help for email address </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 1"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 2"/>
-   </context>
-   <context  id="coop_context" >
-      <description>Help for coop </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 1"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 2"/>
-   </context>
-   <context  id="birthday_context" >
-      <description>Help for birthday </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 1"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 2"/>
-   </context>
-   <context  id="salary_context" >
-      <description>Help for salary </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 1"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 2"/>
-   </context>
-   <context  id="hair_color_context" >
-      <description>Help for hair color </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 1"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 2"/>
-   </context>
-   <context  id="eye_color_context" >
-      <description>Help for eye color </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 1"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 2"/>
-   </context>
-
-</contexts>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.propertysheet/META-INF/MANIFEST.MF b/examples/org.eclipse.ui.examples.propertysheet/META-INF/MANIFEST.MF
deleted file mode 100644
index 518284f..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui.examples.propertysheet; singleton:=true
-Bundle-Version: 3.2.0.qualifier
-Bundle-ClassPath: propertysheet.jar
-Bundle-Activator: org.eclipse.ui.examples.propertysheet.PropertySheetPlugin
-Bundle-Vendor: %Plugin.providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.ui.views,
- org.eclipse.ui.ide,
- org.eclipse.jface.text,
- org.eclipse.text,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.ui.editors
-Eclipse-LazyStart: true
diff --git a/examples/org.eclipse.ui.examples.propertysheet/about.html b/examples/org.eclipse.ui.examples.propertysheet/about.html
deleted file mode 100644
index 4602330..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.propertysheet/build.properties b/examples/org.eclipse.ui.examples.propertysheet/build.properties
deleted file mode 100644
index fb15c08..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/build.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.propertysheet.jar = Eclipse UI Examples PropertySheet/
-
-bin.includes = doc-html/,\
-               icons/,\
-               about.html,\
-               doc.zip,\
-               HelpContexts.xml,\
-               plugin.properties,\
-               plugin.xml,\
-               *.jar,\
-               META-INF/
-
-src.includes = about.html
diff --git a/examples/org.eclipse.ui.examples.propertysheet/doc-html/hglegal.htm b/examples/org.eclipse.ui.examples.propertysheet/doc-html/hglegal.htm
deleted file mode 100644
index a41081e..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/doc-html/hglegal.htm
+++ /dev/null
@@ -1,15 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
-   <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/examples/org.eclipse.ui.examples.propertysheet/doc-html/ui_propertysheet_ex.html b/examples/org.eclipse.ui.examples.propertysheet/doc-html/ui_propertysheet_ex.html
deleted file mode 100644
index 54205b2..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/doc-html/ui_propertysheet_ex.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>Desktop - Property Sheet Example</title>
-</head>
-<body>
-
-<h2>
-<b>Example - Property Sheet</b></h2>
-
-<h3>
-Introduction</h3>
-The Property Sheet Example adds an editor for files with the .usr extension
-and also demonstrates how to add properties and outline views on a file.
-<br>&nbsp;
-<h3>
-Running the example</h3>
-To start using the Property Sheet Example, create a file with extension
-.usr.&nbsp;&nbsp; Open the file and the Outline and Properties views to
-see the example in action.&nbsp; Click on items in the Outline view and
-look in the Properties view for details of the selected item in the Outline
-view.&nbsp; The people items in the list show the most detail in the Properties
-view.
-<h4>
-<b>Creating a new usr file</b></h4>
-Create a new file with file extension .usr.&nbsp; From the File menu, select
-New and then select Other... from the sub-menu.&nbsp; Click on Simple in
-the wizard, then select
-<br>File in the list on the left.&nbsp; Click on Next to supply the file
-name (make sure the extension is .usr) and the folder in which the file
-should be contained.
-<br>&nbsp;
-<h3>
-Details</h3>
-The Property Sheet Example demonstrates how to provide properties to the
-Property Sheet View.
-<p>The tree viewer of the Content Outline View contains and presents OrganizationElements.
-When an element is selected in the Content Outline View the Workspace will
-invoke <tt>getAdapter</tt>
-on the selected OrganizationElement. If an adapter is requested for IPropertySource,
-the OrganizationElement returns itself as it impements IPropertySource
-The Property Sheet View then use the Organization Element as it source.
-<br>&nbsp;
-
-</body>
-</html>
diff --git a/examples/org.eclipse.ui.examples.propertysheet/doc.zip b/examples/org.eclipse.ui.examples.propertysheet/doc.zip
deleted file mode 100644
index 41e8aa9..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/doc.zip
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.propertysheet/icons/obj16/usereditor.gif b/examples/org.eclipse.ui.examples.propertysheet/icons/obj16/usereditor.gif
deleted file mode 100644
index 64d7907..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/icons/obj16/usereditor.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.propertysheet/plugin.properties b/examples/org.eclipse.ui.examples.propertysheet/plugin.properties
deleted file mode 100644
index 4842080..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/plugin.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Plugin.name = User File Editor
-Plugin.providerName = Eclipse.org
-Editors.UserEditor = User File Editor
-PopupMenus.action = Show Action
diff --git a/examples/org.eclipse.ui.examples.propertysheet/plugin.xml b/examples/org.eclipse.ui.examples.propertysheet/plugin.xml
deleted file mode 100644
index d834a9e..0000000
--- a/examples/org.eclipse.ui.examples.propertysheet/plugin.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-     <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            name="%Editors.UserEditor"
-            icon="icons/obj16/usereditor.gif"
-            extensions="usr"
-            class="org.eclipse.ui.examples.propertysheet.UserEditor"
-            id="org.eclipse.ui.examples.propertysheet.UserEditor">
-      </editor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.popupMenus">
-      <objectContribution
-            objectClass="org.eclipse.ui.examples.propertysheet.UserElement"
-            id="org.eclipse.ui.examples.propertysheet">
-         <action
-               label="%PopupMenus.action"
-               class="org.eclipse.ui.examples.propertysheet.PopupMenuActionDelegate"
-               menubarPath="additions"
-               enablesFor="1"
-               id="org.eclipse.ui.examples.propertysheet.action1">
-         </action>
-      </objectContribution>
-   </extension>
-   <extension
-         point="org.eclipse.help.contexts">
-      <contexts
-            file="HelpContexts.xml">
-      </contexts>
-   </extension>
-
-</plugin>
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/.classpath b/examples/org.eclipse.ui.examples.rcp.browser/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/.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/examples/org.eclipse.ui.examples.rcp.browser/.cvsignore b/examples/org.eclipse.ui.examples.rcp.browser/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/.project b/examples/org.eclipse.ui.examples.rcp.browser/.project
deleted file mode 100644
index 72f5949..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/.project
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.examples.rcp.browser</name>
-	<comment></comment>
-	<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/examples/org.eclipse.ui.examples.rcp.browser/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.ui.examples.rcp.browser/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index e9e4d26..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,70 +0,0 @@
-#Mon Jan 15 21:20:27 EST 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/.settings/org.eclipse.jdt.ui.prefs b/examples/org.eclipse.ui.examples.rcp.browser/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 19dd0a9..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Mon Feb 06 11:17:40 EST 2006
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.2\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template></templates>
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/Browser.product b/examples/org.eclipse.ui.examples.rcp.browser/Browser.product
deleted file mode 100644
index cf1dee7..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/Browser.product
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?pde version="3.1"?>
-
-<product name="%productName" id="org.eclipse.ui.examples.rcp.browser.product" application="org.eclipse.ui.examples.rcp.browser.app" useFeatures="false">
-
-   <aboutInfo>
-      <image path="icons/eclipse_lg.gif"/>
-      <text>
-         %aboutText
-      </text>
-   </aboutInfo>
-
-   <configIni use="default"/>
-
-   <launcherArgs>
-   </launcherArgs>
-
-   <windowImages small="icons/eclipse.gif" large="icons/eclipse32.gif"/>
-
-
-   <launcher name="browser">
-      <solaris/>
-      <win useIco="false">
-         <bmp/>
-      </win>
-   </launcher>
-
-   <plugins includeFragments="false">
-      <plugin id="org.eclipse.core.commands"/>
-      <plugin id="org.eclipse.core.expressions"/>
-      <plugin id="org.eclipse.core.runtime"/>
-      <plugin id="org.eclipse.help"/>
-      <plugin id="org.eclipse.jface"/>
-      <plugin id="org.eclipse.osgi"/>
-      <plugin id="org.eclipse.swt"/>
-      <plugin id="org.eclipse.swt.carbon.macosx.ppc"/>
-      <plugin id="org.eclipse.swt.gtk.linux.ia64"/>
-      <plugin id="org.eclipse.swt.gtk.linux.ppc"/>
-      <plugin id="org.eclipse.swt.gtk.linux.x86"/>
-      <plugin id="org.eclipse.swt.gtk.linux.x86_64"/>
-      <plugin id="org.eclipse.swt.gtk.solaris.sparc"/>
-      <plugin id="org.eclipse.swt.motif.aix.ppc"/>
-      <plugin id="org.eclipse.swt.motif.hpux.ia64_32"/>
-      <plugin id="org.eclipse.swt.motif.hpux.PA_RISC"/>
-      <plugin id="org.eclipse.swt.motif.linux.x86"/>
-      <plugin id="org.eclipse.swt.motif.solaris.sparc"/>
-      <plugin id="org.eclipse.swt.photon.qnx.x86"/>
-      <plugin id="org.eclipse.swt.win32.wce_ppc.arm"/>
-      <plugin id="org.eclipse.swt.win32.win32.x86"/>
-      <plugin id="org.eclipse.ui"/>
-      <plugin id="org.eclipse.ui.examples.rcp.browser"/>
-      <plugin id="org.eclipse.ui.workbench"/>
-   </plugins>
-
-</product>
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/META-INF/MANIFEST.MF b/examples/org.eclipse.ui.examples.rcp.browser/META-INF/MANIFEST.MF
deleted file mode 100644
index 7b8ee01..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ui.examples.rcp.browser; singleton:=true
-Bundle-Version: 3.3.0.qualifier
-Bundle-ClassPath: browser.jar
-Bundle-Activator: org.eclipse.ui.examples.rcp.browser.BrowserPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.ui
-Eclipse-LazyStart: true
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/about.html b/examples/org.eclipse.ui.examples.rcp.browser/about.html
deleted file mode 100644
index 4602330..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/build.properties b/examples/org.eclipse.ui.examples.rcp.browser/build.properties
deleted file mode 100644
index 17534b0..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               *.jar,\
-               about.html,\
-               readme.html,\
-               splash.bmp,\
-               META-INF/
-source.browser.jar = src/
-src.includes = about.html,\
-               readme.html
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/icons/alt16.gif b/examples/org.eclipse.ui.examples.rcp.browser/icons/alt16.gif
deleted file mode 100644
index 05626b1..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/icons/alt16.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/icons/alt32.gif b/examples/org.eclipse.ui.examples.rcp.browser/icons/alt32.gif
deleted file mode 100644
index b432f88..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/icons/alt32.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/icons/alt_about.gif b/examples/org.eclipse.ui.examples.rcp.browser/icons/alt_about.gif
deleted file mode 100644
index 20d9ad2..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/icons/alt_about.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/icons/eclipse.gif b/examples/org.eclipse.ui.examples.rcp.browser/icons/eclipse.gif
deleted file mode 100644
index 6ca37e0..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/icons/eclipse.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/icons/eclipse32.gif b/examples/org.eclipse.ui.examples.rcp.browser/icons/eclipse32.gif
deleted file mode 100644
index f71a8f6..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/icons/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/icons/eclipse_lg.gif b/examples/org.eclipse.ui.examples.rcp.browser/icons/eclipse_lg.gif
deleted file mode 100644
index 27c0838..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/icons/eclipse_lg.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/plugin.properties b/examples/org.eclipse.ui.examples.rcp.browser/plugin.properties
deleted file mode 100644
index 76d0a44..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/plugin.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2004, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName= Browser Example
-providerName= Eclipse.org
-
-productName= Browser Example
-appName= Browser Example App
-perspectives.browser.name= Browser Example
-views.category.name= Browser Example
-views.browser.name= Browser
-views.history.name= History
-
-swtAppName= BrowserExample
-aboutText= Browser Example \n\n\
-(c) Copyright Eclipse contributors and others 2003, 2004.  All rights reserved.\n\
-Visit http://www.eclipse.org/platform
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/plugin.xml b/examples/org.eclipse.ui.examples.rcp.browser/plugin.xml
deleted file mode 100644
index ae8d123..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/plugin.xml
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-     <extension
-         point="org.eclipse.core.runtime.applications"
-         id="app"
-         name="%appName">
-      <application>
-         <run
-            class="org.eclipse.ui.examples.rcp.browser.BrowserApp">
-         </run>
-      </application>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            id="org.eclipse.ui.examples.rcp.browser.browserPerspective"
-            name="%perspectives.browser.name"
-            class="org.eclipse.ui.examples.rcp.browser.BrowserPerspectiveFactory"
-			fixed="false"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            id="org.eclipse.ui.examples.rcp.browser"
-            name="%views.category.name"/>
-      <view
-            id="org.eclipse.ui.examples.rcp.browser.browserView"
-            name="%views.browser.name"
-            icon="icons/eclipse.gif"
-            class="org.eclipse.ui.examples.rcp.browser.BrowserView"
-            category="org.eclipse.ui.examples.rcp.browser"
-            allowMultiple="true"/>
-      <view
-            id="org.eclipse.ui.examples.rcp.browser.historyView"
-            name="%views.history.name"
-            icon="icons/eclipse.gif"
-            class="org.eclipse.ui.examples.rcp.browser.HistoryView"
-            category="org.eclipse.ui.examples.rcp.browser"/>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.products"
-         id="product">
-      <product
-            name="%productName"
-            application="org.eclipse.ui.examples.rcp.browser.app">
-         <property
-               name="appName"
-               value="%swtAppName"/>
-         <property
-               name="windowImages"
-               value="icons/eclipse.gif,icons/eclipse32.gif"/>
-         <property
-               name="aboutText"
-               value="%aboutText"/>
-         <property
-               name="aboutImage"
-               value="icons/eclipse_lg.gif"/>
-         <property
-               name="preferenceCustomization"
-               value="plugin_customization.ini"/>
-      </product>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commands">
-      <category
-            name="Browser"
-            id="org.eclipse.ui.examples.rcp.browser.commands.browserCategory"/>
-      <command
-            categoryId="org.eclipse.ui.examples.rcp.browser.commands.browserCategory"
-            name="Back"
-            id="org.eclipse.ui.examples.rcp.browser.commands.back"/>
-      <command
-            categoryId="org.eclipse.ui.examples.rcp.browser.commands.browserCategory"
-            name="Forward"
-            id="org.eclipse.ui.examples.rcp.browser.commands.forward"/>
-      <command
-            categoryId="org.eclipse.ui.examples.rcp.browser.commands.browserCategory"
-            name="Stop"
-            id="org.eclipse.ui.examples.rcp.browser.commands.stop"/>
-      <command
-            categoryId="org.eclipse.ui.examples.rcp.browser.commands.browserCategory"
-            name="Refresh"
-            id="org.eclipse.ui.examples.rcp.browser.commands.refresh"/>
-      <command
-            categoryId="org.eclipse.ui.examples.rcp.browser.commands.browserCategory"
-            name="New Tab"
-            id="org.eclipse.ui.examples.rcp.browser.commands.newTab"/>
-      <command
-            categoryId="org.eclipse.ui.examples.rcp.browser.commands.browserCategory"
-            name="History"
-            id="org.eclipse.ui.examples.rcp.browser.commands.history"/>
-      <command
-            categoryId="org.eclipse.ui.examples.rcp.browser.commands.browserCategory"
-            name="Easter Egg"
-            id="org.eclipse.ui.examples.rcp.browser.commands.easterEgg"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.bindings">
-      <scheme
-            name="Browser Keys"
-            id="org.eclipse.ui.examples.rcp.browser.keyConfiguration"/>
-      <key
-            commandId="org.eclipse.ui.examples.rcp.browser.commands.back"
-            sequence="M3+ARROW_LEFT"
-            schemeId="org.eclipse.ui.examples.rcp.browser.keyConfiguration"/>
-      <key
-            commandId="org.eclipse.ui.examples.rcp.browser.commands.forward"
-            sequence="M3+ARROW_RIGHT"
-            schemeId="org.eclipse.ui.examples.rcp.browser.keyConfiguration"/>
-      <key
-            commandId="org.eclipse.ui.examples.rcp.browser.commands.stop"
-            sequence="ESC"
-            schemeId="org.eclipse.ui.examples.rcp.browser.keyConfiguration"/>
-      <key
-            commandId="org.eclipse.ui.examples.rcp.browser.commands.refresh"
-            sequence="F5"
-            schemeId="org.eclipse.ui.examples.rcp.browser.keyConfiguration"/>
-      <key
-            commandId="org.eclipse.ui.examples.rcp.browser.commands.newTab"
-            sequence="M1+T"
-            schemeId="org.eclipse.ui.examples.rcp.browser.keyConfiguration"/>
-      <key
-            commandId="org.eclipse.ui.examples.rcp.browser.commands.history"
-            sequence="M1+H"
-            schemeId="org.eclipse.ui.examples.rcp.browser.keyConfiguration"/>
-      <key
-            commandId="org.eclipse.ui.examples.rcp.browser.commands.easterEgg"
-            sequence="M1+M2+E"
-            schemeId="org.eclipse.ui.examples.rcp.browser.keyConfiguration"/>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer class="org.eclipse.ui.examples.rcp.browser.BrowserPreferenceInitializer"/>
-   </extension>
-
-</plugin>
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/plugin_customization.ini b/examples/org.eclipse.ui.examples.rcp.browser/plugin_customization.ini
deleted file mode 100644
index e5ffb06..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/plugin_customization.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-org.eclipse.ui/DOCK_PERSPECTIVE_BAR=topRight
-org.eclipse.ui/KEY_CONFIGURATION_ID=org.eclipse.ui.examples.rcp.browser.keyConfiguration
-org.eclipse.ui/presentationFactoryId=org.eclipse.ui.examples.presentation.customtoolbar
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/readme.html b/examples/org.eclipse.ui.examples.rcp.browser/readme.html
deleted file mode 100644
index 1f21ad5..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/readme.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
-<title>Eclipse RCP Browser Example</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>Eclipse RCP Browser Example</h2>
- 
-<p>Last updated May 21, 2004</p>	
-
-<h3>Description</h3>
-<p>This is an example of a simple Eclipse Rich Client Platform (RCP) application.
-It is a bare bones web browser, using the SWT Browser control.
-</p>
-<p>
-The code is in package <code>org.eclipse.ui.examples.browser</code>, and consists
-of an application class (<code>BrowserApp</code>), a workbench advisor for 
-configuring the workbench (<code>BrowserAdvisor</code>), and a single perspective 
-(<code>BrowserPerspectiveFactory</code>) containing a single view (<code>BrowserView</code>).
-</p>
-<p>
-The application defines several built-in actions in the menu and toolbar that are
-typical for web browsers (Back, Forward, Stop, Refresh).  These are added in 
-<code>BrowserActionBuilder</code> when a new window is opened (see 
-<code>BrowserAdvisor.fillActionBars(...)</code>).  These actions are defined as 
-retargetable actions, for which the view registers handling actions.
-</p>
-<p>
-The view consists of an address bar (a <code>Label</code> and a <code>Text</code>
-control) and the <code>Browser</code> control.  To handle status and progress
-events, it simply passes on the relevant events from the <code>Browser</code> 
-control to the Workbench status line.
-
-<h3>Running the example</h3>
-To run the RCP Browser example from within the Eclipse SDK:
-<ol>
-<li>Load project org.eclipse.ui.examples.rcp.browser
-from the Eclipse repository into a self-hosting workspace.</li>
-<li>Create a new "Run-time workbench" launch configuration called "Browser Example".</li>
-<li>On the "Arguments" tab, select "Run a product" and choose select "org.eclipse.ui.examples.rcp.browser.product" from the drop-down.</li>
-<li>On the "Plug-ins" tab, configure it to include only the 
-  required plug-ins:
-  <ul>
-  <li>Press "Deselect All"</li>
-  <li>Check "org.eclipse.ui.examples.rcp.browser"</li>
-  <li>Press "Add Required Plug-ins"</li>
-  <li>Check "org.eclipse.update.configurator"</li>
-  </ul>
-</li>
-<li>Run or debug the launch config.</li>
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/splash.bmp b/examples/org.eclipse.ui.examples.rcp.browser/splash.bmp
deleted file mode 100644
index 6507770..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/splash.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserActionBarAdvisor.java b/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserActionBarAdvisor.java
deleted file mode 100644
index 60960dd..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserActionBarAdvisor.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.rcp.browser;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.ICoolBarManager;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.action.ToolBarContributionItem;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.RetargetAction;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-
-/**
- * Builds the actions and populates the menubar and toolbar when a new window
- * is opened.
- * This work is factored into a separate class to avoid cluttering 
- * <code>BrowserAdvisor</code>
- * <p>
- * This adds several actions to the menus and toolbar that are typical for 
- * web browsers (e.g. Back, Forward, Stop, Refresh).  These are defined as 
- * retargetable actions, for which the <code>BrowserView</code> registers 
- * handling actions.
- * 
- * @since 3.1
- */
-public class BrowserActionBarAdvisor extends ActionBarAdvisor {
-
-	private IAction newWindowAction, newTabAction, quitAction, historyAction, aboutAction;
-    private RetargetAction backAction, forwardAction, stopAction, refreshAction; 
-
-    public BrowserActionBarAdvisor(IActionBarConfigurer configurer) {
-        super(configurer);
-	}
-    
-	protected void makeActions(final IWorkbenchWindow window) {
-        ISharedImages images = window.getWorkbench().getSharedImages();
-		
-		newWindowAction = ActionFactory.OPEN_NEW_WINDOW.create(window);
-        newWindowAction.setText("&New Window");
-        register(newWindowAction);
-		
-		newTabAction = new Action("New &Tab") { //$NON-NLS-1$
-		    int counter = 0;
-		    { setId("newTab");
-              setActionDefinitionId(IBrowserConstants.COMMAND_PREFIX + "newTab"); } //$NON-NLS-1$
-            public void run() {
-                try {
-                    String secondaryId = Integer.toString(++counter);
-                    IWorkbenchPage page = window.getActivePage();
-                    if (page != null) {
-                        page.showView(IBrowserConstants.BROWSER_VIEW_ID, secondaryId, IWorkbenchPage.VIEW_ACTIVATE);
-                    }
-                } catch (PartInitException e) {
-                    e.printStackTrace();
-                }
-            }
-		};
-        register(newTabAction);
-		
-		quitAction = ActionFactory.QUIT.create(window);
-        register(quitAction);
-		
-        backAction = new RetargetAction("back", "&Back");
-        backAction.setActionDefinitionId(IBrowserConstants.COMMAND_PREFIX + "back"); //$NON-NLS-1$
-		backAction.setToolTipText("Back");
-		backAction.setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_BACK));
-		window.getPartService().addPartListener(backAction);
-        register(backAction);
-		
-        forwardAction = new RetargetAction("forward", "&Forward");
-        forwardAction.setActionDefinitionId(IBrowserConstants.COMMAND_PREFIX + "forward"); //$NON-NLS-1$
-		forwardAction.setToolTipText("Forward");
-		forwardAction.setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_FORWARD));
-		window.getPartService().addPartListener(forwardAction);
-		register(forwardAction);
-		
-		stopAction = new RetargetAction("stop", "Sto&p");
-        stopAction.setActionDefinitionId(IBrowserConstants.COMMAND_PREFIX + "stop"); //$NON-NLS-1$
-		stopAction.setToolTipText("Stop");
-		window.getPartService().addPartListener(stopAction);
-		register(stopAction);
-		
-		refreshAction = new RetargetAction("refresh", "&Refresh");
-        refreshAction.setActionDefinitionId(IBrowserConstants.COMMAND_PREFIX + "refresh"); //$NON-NLS-1$
-		refreshAction.setToolTipText("Refresh");
-		window.getPartService().addPartListener(refreshAction);
-		register(refreshAction);
-		
-		historyAction = new Action("History", IAction.AS_CHECK_BOX) { //$NON-NLS-1$
-		    { setId("history");
-              setActionDefinitionId(IBrowserConstants.COMMAND_PREFIX + "history"); } //$NON-NLS-1$
-		    public void run() {
-		        try {
-		            IWorkbenchPage page = window.getActivePage();
-		            if (page != null) {
-		                IViewPart historyView = page.findView(IBrowserConstants.HISTORY_VIEW_ID);
-		                if (historyView == null) {
-		                    page.showView(IBrowserConstants.HISTORY_VIEW_ID);
-		                    setChecked(true);
-		                }
-		                else {
-		                    page.hideView(historyView);
-		                    setChecked(false);
-		                }
-		            }
-                } catch (PartInitException e) {
-                    e.printStackTrace();
-                }
-		    }
-		};
-        register(historyAction);
-
-		aboutAction = ActionFactory.ABOUT.create(window);
-        register(aboutAction);
-	}
-
-	protected void fillMenuBar(IMenuManager menuBar) {
-		IMenuManager fileMenu = new MenuManager("&File", "file");  //$NON-NLS-2$
-		menuBar.add(fileMenu);
-        fileMenu.add(newWindowAction);
-        fileMenu.add(newTabAction);
-		fileMenu.add(new Separator());
-        fileMenu.add(quitAction);
-		
-		IMenuManager viewMenu = new MenuManager("&View", "view");  //$NON-NLS-2$
-		menuBar.add(viewMenu);
-        viewMenu.add(backAction);
-        viewMenu.add(forwardAction);
-        viewMenu.add(stopAction);
-        viewMenu.add(refreshAction);
-		viewMenu.add(new Separator("views")); //$NON-NLS-1$
-        viewMenu.add(historyAction);
-
-		IMenuManager helpMenu = new MenuManager("&Help", "help");  //$NON-NLS-2$
-		menuBar.add(helpMenu);
-        helpMenu.add(aboutAction);
-	}
-
-	protected void fillCoolBar(ICoolBarManager coolBar) {
-		IToolBarManager toolBar = new ToolBarManager(SWT.FLAT | SWT.RIGHT);
-		coolBar.add(new ToolBarContributionItem(toolBar, "standard")); //$NON-NLS-1$
-		
-		// For the Back and Forward actions, force their text to be shown on the toolbar,
-		// not just their image.  For the remaining actions, the ActionContributionItem
-		// is created implicitly with the default presentation mode.
-		ActionContributionItem backCI = new ActionContributionItem(backAction);
-		backCI.setMode(ActionContributionItem.MODE_FORCE_TEXT);
-		toolBar.add(backCI);
-		
-		ActionContributionItem forwardCI = new ActionContributionItem(forwardAction);
-		forwardCI.setMode(ActionContributionItem.MODE_FORCE_TEXT);
-		toolBar.add(forwardCI);
-
-		toolBar.add(stopAction);
-		toolBar.add(refreshAction);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserAdvisor.java b/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserAdvisor.java
deleted file mode 100644
index f214ba5..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserAdvisor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.rcp.browser;
-
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-
-/**
- * The workbench advisor for the browser example.
- * Configures the workbench as needed for the browser example, including
- * specifying the default perspective id.
- * Creates the workbench window advisor for configuring each new window 
- * as it is being opened.
- * 
- * @since 3.0
- */
-public class BrowserAdvisor extends WorkbenchAdvisor {
-
-	/**
-	 * Constructs a new <code>BrowserAdvisor</code>.
-	 */
-	public BrowserAdvisor() {
-		// do nothing
-	}
-	
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.application.WorkbenchAdvisor
-     */
-    public void initialize(IWorkbenchConfigurer configurer) {
-        super.initialize(configurer);
-//        configurer.setSaveAndRestore(true);
-    }
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor
-	 */
-	public String getInitialWindowPerspectiveId() {
-		return IBrowserConstants.BROWSER_PERSPECTIVE_ID;
-	}
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.application.WorkbenchAdvisor
-     */
-    public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
-            IWorkbenchWindowConfigurer configurer) {
-        return new BrowserWindowAdvisor(configurer);
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserApp.java b/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserApp.java
deleted file mode 100644
index 9f75650..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserApp.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.rcp.browser;
-
-import org.eclipse.equinox.app.IApplication;
-import org.eclipse.equinox.app.IApplicationContext;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The application class for the RCP Browser Example.
- * Creates and runs the Workbench, passing a <code>BrowserAdvisor</code>
- * as the workbench advisor.
- * 
- * @issue Couldn't run without initial perspective -- it failed with NPE 
- *   on WorkbenchWindow.openPage (called from Workbench.openFirstTimeWindow).  Advisor is currently required to override 
- *   getInitialWindowPerspectiveId.
- * 
- * @issue If shortcut bar is hidden, and last view in perspective is closed, there's no way to get it open again.
- * 
- * @since 3.0
- */
-public class BrowserApp implements IApplication {
-	
-	/**
-	 * Constructs a new <code>BrowserApp</code>.
-	 */
-	public BrowserApp() {
-		// do nothing
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)
-	 */
-	public Object start(IApplicationContext context) throws Exception {
-		Display display = PlatformUI.createDisplay();
-		try {
-			int code = PlatformUI.createAndRunWorkbench(display,
-					new BrowserAdvisor());
-			// exit the application with an appropriate return code
-			return code == PlatformUI.RETURN_RESTART
-					? EXIT_RESTART
-					: EXIT_OK;
-		} finally {
-			if (display != null)
-				display.dispose();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.equinox.app.IApplication#stop()
-	 */
-	public void stop() {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		if (workbench == null)
-			return;
-		final Display display = workbench.getDisplay();
-		display.syncExec(new Runnable() {
-			public void run() {
-				if (!display.isDisposed())
-					workbench.close();
-			}
-		});
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserPerspectiveFactory.java b/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserPerspectiveFactory.java
deleted file mode 100644
index 1a36c5e..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserPerspectiveFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.rcp.browser;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-import org.eclipse.ui.IViewLayout;
-
-/**
- * The perspective factory for the RCP Browser Example's perspective.
- * 
- * @since 3.0
- */
-public class BrowserPerspectiveFactory implements IPerspectiveFactory {
-
-	/**
-	 * Constructs a new <code>BrowserPerspectiveFactory</code>.
-	 */
-	public BrowserPerspectiveFactory() {
-		// do nothing
-	}
-
-	/**
-	 * Creates the initial layout of the Browser perspective.
-	 */
-	public void createInitialLayout(IPageLayout layout) {
-		layout.addView(IBrowserConstants.BROWSER_VIEW_ID, IPageLayout.RIGHT, .25f, IPageLayout.ID_EDITOR_AREA);
-		layout.addPlaceholder(IBrowserConstants.HISTORY_VIEW_ID, IPageLayout.LEFT, .3f, IPageLayout.ID_EDITOR_AREA); //$NON-NLS-1$
-		IViewLayout historyLayout = layout.getViewLayout(IBrowserConstants.HISTORY_VIEW_ID);
-		historyLayout.setCloseable(true);
-		layout.setEditorAreaVisible(false);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserPlugin.java b/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserPlugin.java
deleted file mode 100644
index dca29a8..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserPlugin.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.examples.rcp.browser;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * Plug-in class for the browser example.
- */
-public class BrowserPlugin extends AbstractUIPlugin {
-    private static BrowserPlugin DEFAULT;
-    
-    public BrowserPlugin() {
-        DEFAULT = this;
-    }
-
-    public static BrowserPlugin getDefault() {
-        return DEFAULT;
-    }
-
-    /**
-     * Logs the given throwable.
-     * 
-     * @param t the throwable to log
-     */
-    public void log(Throwable t) {
-        String msg = t.getMessage();
-        if (msg == null)
-            msg = t.toString();
-        IStatus status = new Status(IStatus.ERROR, getBundle().getSymbolicName(), 0, msg, t);
-        getLog().log(status);
-    }
-    
-    /**
-     * Returns a list of all views and editors in the given page,
-     * excluding any secondary views like the History view.
-     * 
-     * @param page the workbench page
-     * @return a list of all non-secondary parts in the page
-     */
-    public static List getNonSecondaryParts(IWorkbenchPage page) {
-        ArrayList list = new ArrayList();
-        list.addAll(Arrays.asList(page.getViewReferences()));
-        list.addAll(Arrays.asList(page.getEditorReferences()));
-        for (Iterator i = list.iterator(); i.hasNext();) {
-            IWorkbenchPartReference ref = (IWorkbenchPartReference) i.next();
-            if (ref instanceof ISecondaryPart) {
-                i.remove();
-            }
-        }
-        return list;
-    }
-    
-}
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserPreferenceInitializer.java b/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserPreferenceInitializer.java
deleted file mode 100644
index 243ed5e..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserPreferenceInitializer.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.rcp.browser;
-
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-
-/**
- * Preference initializer for the browser preferences.
- */
-public class BrowserPreferenceInitializer extends AbstractPreferenceInitializer {
-
-    public BrowserPreferenceInitializer() {
-        // do nothing
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-     */
-    public void initializeDefaultPreferences() {
-        Preferences prefs = BrowserPlugin.getDefault().getPluginPreferences();
-        prefs.setDefault(IBrowserConstants.PREF_HOME_PAGE, "http://eclipse.org");  //$NON-NLS-1$
-    }
-
-}
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserView.java b/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserView.java
deleted file mode 100644
index 4b65de7..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserView.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.examples.rcp.browser;
-
-import org.eclipse.core.commands.IHandler;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.commands.ActionHandler;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.browser.CloseWindowListener;
-import org.eclipse.swt.browser.LocationAdapter;
-import org.eclipse.swt.browser.LocationEvent;
-import org.eclipse.swt.browser.OpenWindowListener;
-import org.eclipse.swt.browser.ProgressAdapter;
-import org.eclipse.swt.browser.ProgressEvent;
-import org.eclipse.swt.browser.StatusTextEvent;
-import org.eclipse.swt.browser.StatusTextListener;
-import org.eclipse.swt.browser.TitleEvent;
-import org.eclipse.swt.browser.TitleListener;
-import org.eclipse.swt.browser.WindowEvent;
-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.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.part.ViewPart;
-
-
-/**
- * The Browser view.  This consists of a <code>Browser</code> control, and an
- * address bar consisting of a <code>Label</code> and a <code>Text</code> 
- * control.  This registers handling actions for the retargetable actions added 
- * by <code>BrowserActionBuilder</code> (Back, Forward, Stop, Refresh).  
- * This also hooks listeners on the Browser control for status and progress
- * messages, and redirects these to the status line.
- * 
- * @since 3.0
- */
-public class BrowserView extends ViewPart {
-	
-    /**
-	 * Debug flag.  When true, status and progress messages are sent to the
-	 * console in addition to the status line.
-	 */
-	private static final boolean DEBUG = false;
-	
-	private Browser browser;
-	private Text location;
-	private String initialUrl;
-	
-	private Action backAction = new Action("Back") {
-		public void run() {
-			browser.back();
-		}
-	};
-	
-	private Action forwardAction = new Action("Forward") {
-		public void run() {
-			browser.forward();
-		}
-	};
-
-	private Action stopAction = new Action("Stop") {
-		public void run() {
-			browser.stop();
-			// cancel any partial progress.
-			getViewSite().getActionBars().getStatusLineManager().getProgressMonitor().done();
-		}
-	};
-
-	private Action refreshAction = new Action("Refresh") {
-		public void run() {
-			browser.refresh();
-		}
-	};
-	
-	/**
-	 * The easter egg action.  
-	 * See the corresponding command and key binding in the plugin.xml,
-	 * and how it's registered in createBrowser.
-	 */
-	private Action easterEggAction = new Action() {
-	    { setActionDefinitionId(IBrowserConstants.COMMAND_PREFIX + "easterEgg"); } //$NON-NLS-1$
-	    public void run() {
-	        browser.execute("window.confirm('You found the easter egg!')");
-	    }
-	};
-	
-    /**
-     * Finds the first browser view in the given window.
-     * 
-     * @param window the window
-     * @return the first found browser view, or <code>null</code> if none found
-     */
-    private static BrowserView findBrowser(IWorkbenchWindow window) {
-        IWorkbenchPage page = window.getActivePage();
-        IViewPart view = page.findView(IBrowserConstants.BROWSER_VIEW_ID);
-        if (view != null) {
-            return (BrowserView) view;
-        }
-        IViewReference[] refs = page.getViewReferences();
-        for (int i = 0; i < refs.length; i++) {
-            if (IBrowserConstants.BROWSER_VIEW_ID.equals(refs[i].getId())) {
-                return (BrowserView) refs[i].getPart(true);
-            }
-        }
-        return null;
-    }
-    
-	/**
-	 * Constructs a new <code>BrowserView</code>.
-	 */
-	public BrowserView() {
-	    initialUrl = BrowserPlugin.getDefault().getPluginPreferences().getString(IBrowserConstants.PREF_HOME_PAGE);
-	}
-	
-    public void init(IViewSite site, IMemento memento) throws PartInitException {
-        super.init(site);
-        if (memento != null) {
-	        String u = memento.getString(IBrowserConstants.MEMENTO_URL);
-	        if (u != null) {
-	            initialUrl = u;
-	        }
-        }
-    }
-    
-    public void saveState(IMemento memento) {
-        memento.putString(IBrowserConstants.MEMENTO_URL, browser.getUrl());
-    }
-    
-	public void createPartControl(Composite parent) {
-		browser = createBrowser(parent, getViewSite().getActionBars());
-		browser.setUrl(initialUrl);
-	}
-
-	public void setFocus() {
-		if (browser != null && !browser.isDisposed()) {
-			browser.setFocus();
-		}
-	}
-	
-	private Browser createBrowser(Composite parent, final IActionBars actionBars) {
-		
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 2;
-		parent.setLayout(gridLayout);
-		
-		Label labelAddress = new Label(parent, SWT.NONE);
-		labelAddress.setText("A&ddress");
-		
-		location = new Text(parent, SWT.BORDER);
-		GridData data = new GridData();
-		data = new GridData();
-		data.horizontalAlignment = GridData.FILL;
-		data.grabExcessHorizontalSpace = true;
-		location.setLayoutData(data);
-
-		browser = new Browser(parent, SWT.NONE);
-		data = new GridData();
-		data.horizontalAlignment = GridData.FILL;
-		data.verticalAlignment = GridData.FILL;
-		data.horizontalSpan = 2;
-		data.grabExcessHorizontalSpace = true;
-		data.grabExcessVerticalSpace = true;
-		browser.setLayoutData(data);
-
-		browser.addProgressListener(new ProgressAdapter() {
-			IProgressMonitor monitor = actionBars.getStatusLineManager().getProgressMonitor();
-			boolean working = false;
-			int workedSoFar;
-			public void changed(ProgressEvent event) {
-				if (DEBUG) {
-					System.out.println("changed: " + event.current + "/" + event.total);
-				}
-				if (event.total == 0) return;
-				if (!working) {
-					if (event.current == event.total) return;
-					monitor.beginTask("", event.total); //$NON-NLS-1$
-					workedSoFar = 0;
-					working = true;
-				}
-				monitor.worked(event.current - workedSoFar);
-				workedSoFar = event.current;
-			}
-			public void completed(ProgressEvent event) {
-				if (DEBUG) {
-					System.out.println("completed: " + event.current + "/" + event.total);
-				}
-				monitor.done();
-				working = false;
-			}
-		});
-		browser.addStatusTextListener(new StatusTextListener() {
-			IStatusLineManager status = actionBars.getStatusLineManager(); 
-			public void changed(StatusTextEvent event) {
-				if (DEBUG) {
-					System.out.println("status: " + event.text);
-				}
-				status.setMessage(event.text);
-			}
-		});
-		browser.addLocationListener(new LocationAdapter() {
-			public void changed(LocationEvent event) {
-			    if (event.top)
-			        location.setText(event.location);
-			}
-		});
-		browser.addTitleListener(new TitleListener() {
-            public void changed(TitleEvent event) {
-                setPartName(event.title);
-            }
-        });
-        browser.addOpenWindowListener(new OpenWindowListener() {
-            public void open(WindowEvent event) {
-                BrowserView.this.openWindow(event);
-            }
-        });
-        // TODO: should handle VisibilityWindowListener.show and .hide events
-        browser.addCloseWindowListener(new CloseWindowListener() {
-            public void close(WindowEvent event) {
-                BrowserView.this.close();
-            }
-        });
-		location.addSelectionListener(new SelectionAdapter() {
-			public void widgetDefaultSelected(SelectionEvent e) {
-				browser.setUrl(location.getText());
-			}
-		});
-		
-		// Hook the navigation actons as handlers for the retargetable actions
-		// defined in BrowserActionBuilder.
-		actionBars.setGlobalActionHandler("back", backAction); //$NON-NLS-1$
-		actionBars.setGlobalActionHandler("forward", forwardAction); //$NON-NLS-1$
-		actionBars.setGlobalActionHandler("stop", stopAction); //$NON-NLS-1$
-		actionBars.setGlobalActionHandler("refresh", refreshAction); //$NON-NLS-1$
-		
-		// Register the easter egg action with the key binding service,
-		// allowing it to be invoked directly via keypress, 
-		// without requiring the action to be visible in the UI.
-		// Note that the address field needs to have focus for this to work, 
-		// or any control other than the browser widget, due to 
-		// <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=69919">bug 69919</a>.
-		IHandlerService hs = (IHandlerService) getSite().getService(
-				IHandlerService.class);
-		IHandler easterHandler = new ActionHandler(easterEggAction);
-		hs.activateHandler(easterEggAction.getActionDefinitionId(), easterHandler);
-		return browser;
-	}
-
-    /**
-     * Opens a new browser window.
-     * 
-     * @param event the open window event
-     */
-    private void openWindow(WindowEvent event) {
-        try {
-            IWorkbench workbench = getSite().getWorkbenchWindow().getWorkbench();
-            IWorkbenchWindow window = workbench.openWorkbenchWindow(IBrowserConstants.BROWSER_PERSPECTIVE_ID, null);
-            Shell shell = window.getShell();
-            if (event.location != null)
-                shell.setLocation(event.location);
-            if (event.size != null)
-                shell.setLocation(event.size);
-            BrowserView view = findBrowser(window);
-            Assert.isNotNull(view);
-            event.browser = view.browser;
-        } catch (WorkbenchException e) {
-            BrowserPlugin.getDefault().log(e);
-        }
-    }
-    
-    /**
-     * Closes this browser view.  Closes the window too if there
-     * are no non-secondary parts open.
-     */
-    private void close() {
-        IWorkbenchPage page = getSite().getPage();
-        IWorkbenchWindow window = page.getWorkbenchWindow();
-        page.hideView(this);
-        if (BrowserPlugin.getNonSecondaryParts(page).size() == 0) {
-            page.closePerspective(page.getPerspective(), true, true);
-        }
-        if (window.getActivePage() == null) {
-            window.close();
-        }
-    }
-
-}
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserWindowAdvisor.java b/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserWindowAdvisor.java
deleted file mode 100644
index f00c2be..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/BrowserWindowAdvisor.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.rcp.browser;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-
-/**
- * Configures the browser window using the given window configurer.
- * 
- * @since 3.1
- */
-public class BrowserWindowAdvisor extends WorkbenchWindowAdvisor {
-
-    /**
-     * Creates a new browser window advisor.
-     * 
-     * @param configurer the window configurer
-     */
-    public BrowserWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-        super(configurer);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.application.WorkbenchAdvisor
-     */
-    public void preWindowOpen() {
-        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-        configurer.setInitialSize(new Point(800, 600));
-        
-        // Default window title is the product name, so don't need to set it
-        // explicitly anymore.
-//      configurer.setTitle("Browser Example");
-        
-//      configurer.setShowFastViewBars(true);
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.application.WorkbenchWindowAdvisor#createActionBarAdvisor(org.eclipse.ui.application.IActionBarConfigurer)
-     */
-    public ActionBarAdvisor createActionBarAdvisor(
-            IActionBarConfigurer actionBarConfigurer) {
-        return new BrowserActionBarAdvisor(actionBarConfigurer);
-    }
-    
-//  Uncomment the code below for a custom window layout (add back the missing imports using Ctrl+Shift+O) 
-/*    
-      public void createWindowContents(Shell shell) {
-          IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-          Menu menuBar = configurer.createMenuBar();
-          shell.setMenuBar(menuBar);
-          
-          GridLayout shellLayout = new GridLayout();
-          shellLayout.marginWidth = 0;
-          shellLayout.marginHeight = 0;
-          shellLayout.verticalSpacing = 0;
-          shell.setLayout(shellLayout);
-    
-          if (!Util.isMac()) {
-              Label sep1 = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
-              sep1.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-          }
-          Control coolBar = configurer.createCoolBarControl(shell);
-          coolBar.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-    
-          Label sep2 = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
-          sep2.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-          
-          Control pageComposite = configurer.createPageComposite(shell);
-          pageComposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
-    
-          Label sep3 = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
-          sep3.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-          Control statusLine = configurer.createStatusLineControl(shell);
-          statusLine.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-          shell.layout(true);
-      }
-*/
-}
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/HistoryView.java b/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/HistoryView.java
deleted file mode 100644
index 6ac0d4e..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/HistoryView.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.examples.rcp.browser;
-
-import java.util.ArrayList;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.part.*;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.jface.action.*;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ui.*;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.SWT;
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * Mockup of a browser history view.
- * For now, it's just the sample view generated by PDE.
- */
-public class HistoryView extends ViewPart implements ISecondaryPart {
-	private TreeViewer viewer;
-	private DrillDownAdapter drillDownAdapter;
-	private Action action1;
-	private Action action2;
-	private Action doubleClickAction;
-
-	/*
-	 * The content provider class is responsible for
-	 * providing objects to the view. It can wrap
-	 * existing objects in adapters or simply return
-	 * objects as-is. These objects may be sensitive
-	 * to the current input of the view, or ignore
-	 * it and always show the same content 
-	 * (like Task List, for example).
-	 */
-	 
-	class TreeObject implements IAdaptable {
-		private String name;
-		private TreeParent parent;
-		
-		public TreeObject(String name) {
-			this.name = name;
-		}
-		public String getName() {
-			return name;
-		}
-		public void setParent(TreeParent parent) {
-			this.parent = parent;
-		}
-		public TreeParent getParent() {
-			return parent;
-		}
-		public String toString() {
-			return getName();
-		}
-		public Object getAdapter(Class key) {
-			return null;
-		}
-	}
-	
-	class TreeParent extends TreeObject {
-		private ArrayList children;
-		public TreeParent(String name) {
-			super(name);
-			children = new ArrayList();
-		}
-		public void addChild(TreeObject child) {
-			children.add(child);
-			child.setParent(this);
-		}
-		public void removeChild(TreeObject child) {
-			children.remove(child);
-			child.setParent(null);
-		}
-		public TreeObject [] getChildren() {
-			return (TreeObject [])children.toArray(new TreeObject[children.size()]);
-		}
-		public boolean hasChildren() {
-			return children.size()>0;
-		}
-	}
-
-	class ViewContentProvider implements IStructuredContentProvider, 
-										   ITreeContentProvider {
-		private TreeParent invisibleRoot;
-
-		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
-		}
-		public void dispose() {
-		}
-		public Object[] getElements(Object parent) {
-			if (parent.equals(getViewSite())) {
-				if (invisibleRoot==null) initialize();
-				return getChildren(invisibleRoot);
-			}
-			return getChildren(parent);
-		}
-		public Object getParent(Object child) {
-			if (child instanceof TreeObject) {
-				return ((TreeObject)child).getParent();
-			}
-			return null;
-		}
-		public Object [] getChildren(Object parent) {
-			if (parent instanceof TreeParent) {
-				return ((TreeParent)parent).getChildren();
-			}
-			return new Object[0];
-		}
-		public boolean hasChildren(Object parent) {
-			if (parent instanceof TreeParent)
-				return ((TreeParent)parent).hasChildren();
-			return false;
-		}
-/*
- * We will set up a dummy model to initialize tree heararchy.
- * In a real code, you will connect to a real model and
- * expose its hierarchy.
- */
-		private void initialize() {
-			TreeObject to1 = new TreeObject("Leaf 1");
-			TreeObject to2 = new TreeObject("Leaf 2");
-			TreeObject to3 = new TreeObject("Leaf 3");
-			TreeParent p1 = new TreeParent("Parent 1");
-			p1.addChild(to1);
-			p1.addChild(to2);
-			p1.addChild(to3);
-			
-			TreeObject to4 = new TreeObject("Leaf 4");
-			TreeParent p2 = new TreeParent("Parent 2");
-			p2.addChild(to4);
-			
-			TreeParent root = new TreeParent("Root");
-			root.addChild(p1);
-			root.addChild(p2);
-			
-			invisibleRoot = new TreeParent("");
-			invisibleRoot.addChild(root);
-		}
-	}
-	class ViewLabelProvider extends LabelProvider {
-
-		public String getText(Object obj) {
-			return obj.toString();
-		}
-		public Image getImage(Object obj) {
-			String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
-			if (obj instanceof TreeParent)
-			   imageKey = ISharedImages.IMG_OBJ_FOLDER;
-			return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
-		}
-	}
-
-	/**
-	 * The constructor.
-	 */
-	public HistoryView() {
-	}
-
-	/**
-	 * This is a callback that will allow us
-	 * to create the viewer and initialize it.
-	 */
-	public void createPartControl(Composite parent) {
-		viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		drillDownAdapter = new DrillDownAdapter(viewer);
-		viewer.setContentProvider(new ViewContentProvider());
-		viewer.setLabelProvider(new ViewLabelProvider());
-		viewer.setInput(getViewSite());
-		makeActions();
-		hookContextMenu();
-		hookDoubleClickAction();
-	}
-
-	private void hookContextMenu() {
-		MenuManager menuMgr = new MenuManager("#PopupMenu");
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				HistoryView.this.fillContextMenu(manager);
-			}
-		});
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(menuMgr, viewer);
-	}
-
-
-
-	private void fillContextMenu(IMenuManager manager) {
-		manager.add(action1);
-		manager.add(action2);
-		manager.add(new Separator());
-		drillDownAdapter.addNavigationActions(manager);
-		// Other plug-ins can contribute there actions here
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-	
-
-	private void makeActions() {
-		action1 = new Action() {
-			public void run() {
-				showMessage("Action 1 executed");
-			}
-		};
-		action1.setText("Action 1");
-		action1.setToolTipText("Action 1 tooltip");
-		action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
-			getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
-		
-		action2 = new Action() {
-			public void run() {
-				showMessage("Action 2 executed");
-			}
-		};
-		action2.setText("Action 2");
-		action2.setToolTipText("Action 2 tooltip");
-		action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
-				getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
-		doubleClickAction = new Action() {
-			public void run() {
-				ISelection selection = viewer.getSelection();
-				Object obj = ((IStructuredSelection)selection).getFirstElement();
-				showMessage("Double-click detected on "+obj.toString());
-			}
-		};
-	}
-
-	private void hookDoubleClickAction() {
-		viewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				doubleClickAction.run();
-			}
-		});
-	}
-	private void showMessage(String message) {
-		MessageDialog.openInformation(
-			viewer.getControl().getShell(),
-			"History",
-			message);
-	}
-
-	/**
-	 * Passing the focus request to the viewer's control.
-	 */
-	public void setFocus() {
-		viewer.getControl().setFocus();
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/IBrowserConstants.java b/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/IBrowserConstants.java
deleted file mode 100644
index d507f73..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/IBrowserConstants.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.examples.rcp.browser;
-
-/**
- * Interface defining constants for use in the browser example.
- */
-public interface IBrowserConstants {
-
-    /**
-     * ID of the RCP Browser Example plug-in.
-     */
-    public static final String PLUGIN_ID = "org.eclipse.ui.examples.rcp.browser"; //$NON-NLS-1$
-    
-    /**
-     * ID of the Browser perspective.
-     */
-    public static final String BROWSER_PERSPECTIVE_ID = PLUGIN_ID + ".browserPerspective"; //$NON-NLS-1$
-    
-    /**
-     * ID of the Browser view.
-     */
-    public static final String BROWSER_VIEW_ID = PLUGIN_ID + ".browserView"; //$NON-NLS-1$
-
-    /**
-     * ID of the History view.
-     */
-    public static final String HISTORY_VIEW_ID = PLUGIN_ID + ".historyView"; //$NON-NLS-1$
-
-    /**
-     * Common prefix for command ids.
-     */
-    public static final String COMMAND_PREFIX = PLUGIN_ID + ".commands."; //$NON-NLS-1$
-    
-    /**
-     * Preference key for the home page URL (property is String-valued).
-     */
-    public static final String PREF_HOME_PAGE = "homePage"; //$NON-NLS-1$
-
-    /**
-     * Memento attribute name for the browser URL (attribute is String-valued).
-     */
-    public static final String MEMENTO_URL = "url"; //$NON-NLS-1$
-    
-}
diff --git a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/ISecondaryPart.java b/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/ISecondaryPart.java
deleted file mode 100644
index 4e2c1bb..0000000
--- a/examples/org.eclipse.ui.examples.rcp.browser/src/org/eclipse/ui/examples/rcp/browser/ISecondaryPart.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.rcp.browser;
-
-/**
- * Marks a workbench part implementation as being a secondary part.
- * A secondary part is one that exists only to support the browser,
- * and should not be considered when determining whether to close
- * a window whose last browser has been closed.
- */
-public interface ISecondaryPart {
-    // marker interface only; no behaviour
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/.classpath b/examples/org.eclipse.ui.examples.readmetool/.classpath
deleted file mode 100644
index d0ff700..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="Eclipse UI Examples Readme Tool"/>
-	<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/examples/org.eclipse.ui.examples.readmetool/.cvsignore b/examples/org.eclipse.ui.examples.readmetool/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.readmetool/.project b/examples/org.eclipse.ui.examples.readmetool/.project
deleted file mode 100644
index 208a260..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/.project
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.examples.readmetool</name>
-	<comment></comment>
-	<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/examples/org.eclipse.ui.examples.readmetool/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.ui.examples.readmetool/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 6a0c68d..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,70 +0,0 @@
-#Mon Jan 15 21:12:33 EST 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/examples/org.eclipse.ui.examples.readmetool/.settings/org.eclipse.jdt.ui.prefs b/examples/org.eclipse.ui.examples.readmetool/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 595f8b1..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Wed May 30 11:19:45 EDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.3\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template></templates>
diff --git a/examples/org.eclipse.ui.examples.readmetool/.settings/org.eclipse.pde.prefs b/examples/org.eclipse.ui.examples.readmetool/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index e5fd2a4..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Jan 10 16:54:24 EST 2006
-compilers.p.deprecated=1
-compilers.p.illegal-att-value=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/AdaptableList.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/AdaptableList.java
deleted file mode 100644
index 7a57110..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/AdaptableList.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-/**
- * A list of adaptable objects.  This is a generic list that can
- * be used to display an arbitrary set of adaptable objects in the workbench.
- * Also implements the IWorkbenchAdapter interface for simple display
- * and navigation.
- */
-public class AdaptableList implements IWorkbenchAdapter, IAdaptable {
-    protected List children = new ArrayList();
-
-    /**
-     * Creates a new adaptable list with the given children.
-     */
-    public AdaptableList() {
-        // do nothing
-    }
-
-    /**
-     * Creates a new adaptable list with the given children.
-     */
-    public AdaptableList(IAdaptable[] newChildren) {
-        for (int i = 0; i < newChildren.length; i++) {
-            children.add(newChildren[i]);
-        }
-    }
-
-    /**
-     * Adds all the adaptable objects in the given enumeration to this list.
-     * Returns this list.
-     */
-    public AdaptableList add(Iterator iterator) {
-        while (iterator.hasNext()) {
-            add((IAdaptable) iterator.next());
-        }
-        return this;
-    }
-
-    /**
-     * Adds the given adaptable object to this list.
-     * Returns this list.
-     */
-    public AdaptableList add(IAdaptable adaptable) {
-        children.add(adaptable);
-        return this;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IAdaptable
-     */
-    public Object getAdapter(Class adapter) {
-        if (adapter == IWorkbenchAdapter.class)
-            return this;
-        return null;
-    }
-
-    /**
-     * Returns the elements in this list.
-     */
-    public Object[] getChildren() {
-        return children.toArray();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchAdapter
-     */
-    public Object[] getChildren(Object o) {
-        return children.toArray();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchAdapter
-     */
-    public ImageDescriptor getImageDescriptor(Object object) {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchAdapter
-     */
-    public String getLabel(Object object) {
-        return object == null ? "" : object.toString(); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchAdapter
-     */
-    public Object getParent(Object object) {
-        return null;
-    }
-
-    /**
-     * Removes the given adaptable object from this list.
-     */
-    public void remove(IAdaptable adaptable) {
-        children.remove(adaptable);
-    }
-
-    /**
-     * Returns the number of items in the list
-     */
-    public int size() {
-        return children.size();
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/AddReadmeMarkerAction.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/AddReadmeMarkerAction.java
deleted file mode 100644
index fa5f42d..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/AddReadmeMarkerAction.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Joe Bowbeer (jozart@blarg.net) - removed dependency on runtime compatibility layer (bug 74528)
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.ui.texteditor.MarkerUtilities;
-import org.osgi.framework.Bundle;
-
-/**
- * Action for creating a readme marker with a specfic id 
- * attribute value.
- */
-public class AddReadmeMarkerAction extends Action {
-    private ITextEditor textEditor;
-
-    private Object[][] customAttributes;
-
-    private String message;
-
-    private final static String MARKER_TYPE = "org.eclipse.ui.examples.readmetool.readmemarker"; //$NON-NLS-1$
-
-    /**
-     * Creates a new action for the given text editor.
-     *
-     * @param editor the text editor
-     * @param label the label for the action
-     * @param attributes the custom attributes for this marker
-     * @param message the message for the marker
-     */
-    public AddReadmeMarkerAction(ITextEditor editor, String label,
-            Object[][] attributes, String message) {
-        textEditor = editor;
-        setText(label);
-        this.customAttributes = attributes;
-        this.message = message;
-    }
-
-    /*
-     * @see IAction#run()
-     */
-    public void run() {
-        Map attributes = new HashMap(11);
-
-        ITextSelection selection = (ITextSelection) textEditor
-                .getSelectionProvider().getSelection();
-        if (!selection.isEmpty()) {
-
-            int start = selection.getOffset();
-            int length = selection.getLength();
-
-            if (length < 0) {
-                length = -length;
-                start -= length;
-            }
-
-            MarkerUtilities.setCharStart(attributes, start);
-            MarkerUtilities.setCharEnd(attributes, start + length);
-
-            // marker line numbers are 1-based
-            int line = selection.getStartLine();
-            MarkerUtilities.setLineNumber(attributes, line == -1 ? -1
-                    : line + 1);
-
-            // set custom attribute values
-            for (int i = 0; i < customAttributes.length; i++) {
-                attributes.put(customAttributes[i][0], customAttributes[i][1]);
-            }
-
-            MarkerUtilities.setMessage(attributes, message);
-        }
-
-        try {
-            MarkerUtilities
-                    .createMarker(getResource(), attributes, MARKER_TYPE);
-        } catch (CoreException x) {
-            Bundle bundle = ReadmePlugin.getDefault().getBundle();
-            Platform.getLog(bundle).log(x.getStatus());
-
-            Shell shell = textEditor.getSite().getShell();
-            String title = MessageUtil
-                    .getString("Add_readme_marker_error_title"); //$NON-NLS-1$
-            String msg = MessageUtil
-                    .getString("Add_readme_marker_error_message"); //$NON-NLS-1$
-
-            ErrorDialog.openError(shell, title, msg, x.getStatus());
-        }
-    }
-
-    /** 
-     * Returns the resource on which to create the marker, 
-     * or <code>null</code> if there is no applicable resource. This
-     * queries the editor's input using <code>getAdapter(IResource.class)</code>.
-     *
-     * @return the resource to which to attach the newly created marker
-     */
-    protected IResource getResource() {
-        IEditorInput input = textEditor.getEditorInput();
-        return (IResource) ((IAdaptable) input).getAdapter(IResource.class);
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/AddSentenceResolution.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/AddSentenceResolution.java
deleted file mode 100644
index 21f23b2..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/AddSentenceResolution.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * A resolution which inserts a sentence into the readme file 
- */
-public class AddSentenceResolution implements IMarkerResolution {
-    /* (non-Javadoc)
-     * Method declared on IMarkerResolution.
-     */
-    public String getLabel() {
-        return MessageUtil.getString("Add_Sentence"); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IMarkerResolution.
-     */
-    public void run(IMarker marker) {
-        // Se if there is an open editor on the file containing the marker
-        IWorkbenchWindow w = PlatformUI.getWorkbench()
-                .getActiveWorkbenchWindow();
-        if (w == null)
-            return;
-        IWorkbenchPage page = w.getActivePage();
-        if (page == null)
-            return;
-        IFileEditorInput input = new FileEditorInput((IFile) marker
-                .getResource());
-        IEditorPart editorPart = page.findEditor(input);
-
-        if (editorPart == null) {
-            // open an editor
-            try {
-                editorPart = IDE.openEditor(page, (IFile) marker.getResource(),
-                        true);
-            } catch (PartInitException e) {
-                MessageDialog.openError(w.getShell(), MessageUtil
-                        .getString("Resolution_Error"), //$NON-NLS-1$
-                        MessageUtil.getString("Unable_to_open_file_editor")); //$NON-NLS-1$
-            }
-        }
-        if (editorPart == null || !(editorPart instanceof ReadmeEditor))
-            return;
-        // insert the sentence
-        ReadmeEditor editor = (ReadmeEditor) editorPart;
-        IDocument doc = editor.getDocumentProvider().getDocument(
-                editor.getEditorInput());
-        String s = MessageUtil.getString("Simple_sentence"); //$NON-NLS-1$
-        try {
-            doc.replace(marker.getAttribute(IMarker.CHAR_START, -1), 0, s);
-        } catch (BadLocationException e) {
-            // ignore
-            return;
-        }
-        // delete the marker
-        try {
-            marker.delete();
-        } catch (CoreException e) {
-            e.printStackTrace();
-            // ignore
-        }
-
-    }
-
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/DefaultSectionsParser.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/DefaultSectionsParser.java
deleted file mode 100644
index dc224b7..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/DefaultSectionsParser.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Hashtable;
-import java.util.Vector;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * This class is a simple parser implementing the IReadmeFileParser
- * interface. It parses a Readme file into sections based on the
- * existence of numbered section tags in the input. A line beginning
- * with a number followed by a dot will be taken as a section indicator
- * (for example, 1., 2., or 12.). 
- * As well, a line beginning with a subsection-style series of numbers
- * will also be taken as a section indicator, and can be used to 
- * indicate subsections (for example, 1.1, or 1.1.12).
- */
-public class DefaultSectionsParser implements IReadmeFileParser {
-    /**
-     * Returns the mark element that is the logical parent
-     * of the given mark number.  Each dot in a mark number
-     * represents a parent-child separation.  For example,
-     * the parent of 1.2 is 1, the parent of 1.4.1 is 1.4.
-     * Returns null if there is no appropriate parent.
-     */
-    protected IAdaptable getParent(Hashtable toc, String number) {
-        int lastDot = number.lastIndexOf('.');
-        if (lastDot < 0)
-            return null;
-        String parentNumber = number.substring(0, lastDot);
-        return (IAdaptable) toc.get(parentNumber);
-    }
-
-    /**
-     * Returns a string containing the contents of the given
-     * file.  Returns an empty string if there were any errors
-     * reading the file.
-     */
-    protected String getText(IFile file) {
-        try {
-            InputStream in = file.getContents();
-            ByteArrayOutputStream out = new ByteArrayOutputStream();
-            byte[] buf = new byte[1024];
-            int read = in.read(buf);
-            while (read > 0) {
-                out.write(buf, 0, read);
-                read = in.read(buf);
-            }
-            return out.toString();
-        } catch (CoreException e) {
-            // do nothing
-        } catch (IOException e) {
-            // do nothing
-        }
-        return ""; //$NON-NLS-1$
-    }
-
-    /**
-     * Parses the input given by the argument.
-     *
-     * @param file  the element containing the input text
-     * @return an element collection representing the parsed input
-     */
-    public MarkElement[] parse(IFile file) {
-        Hashtable markTable = new Hashtable(40);
-        Vector topLevel = new Vector();
-        String s = getText(file);
-        int start = 0;
-        int end = -1;
-        int lineno = 0;
-        int lastlineno = 0;
-        MarkElement lastme = null;
-        int ix;
-
-        // parse content for headings
-        ix = s.indexOf('\n', start);
-        while (ix != -1) {
-            start = end + 1;
-            end = ix = s.indexOf('\n', start);
-            lineno++;
-            if (ix != -1) {
-                // skip blanks
-                while (s.charAt(start) == ' ' || s.charAt(start) == '\t') {
-                    start++;
-                }
-                if (Character.isDigit(s.charAt(start))) {
-                    if (lastme != null) {
-                        lastme.setNumberOfLines(lineno - lastlineno - 1);
-                    }
-                    lastlineno = lineno;
-                    String markName = parseHeading(s, start, end);
-
-                    //get the parent mark, if any.
-                    String markNumber = parseNumber(markName);
-                    IAdaptable parent = getParent(markTable, markNumber);
-                    if (parent == null)
-                        parent = file;
-
-                    MarkElement me = new MarkElement(parent, markName, start,
-                            end - start);
-                    lastme = me;
-
-                    markTable.put(markNumber, me);
-                    if (parent == file) {
-                        topLevel.add(me);
-                    }
-                }
-            }
-        }
-        if (lastme != null) {
-            // set the number of lines for the last section
-            lastme.setNumberOfLines(lineno - lastlineno - 1);
-        }
-        MarkElement[] results = new MarkElement[topLevel.size()];
-        topLevel.copyInto(results);
-        return results;
-    }
-
-    /**
-     * Creates a section name from the buffer and trims trailing
-     * space characters.
-     *
-     * @param buffer  the string from which to create the section name
-     * @param start  the start index
-     * @param end  the end index
-     * @return a section name
-     */
-    private String parseHeading(String buffer, int start, int end) {
-        while (Character.isWhitespace(buffer.charAt(end - 1)) && end > start) {
-            end--;
-        }
-        return buffer.substring(start, end);
-    }
-
-    /**
-     * Returns the number for this heading.  A heading consists
-     * of a number (an arbitrary string of numbers and dots), followed by
-     * arbitrary text.
-     */
-    protected String parseNumber(String heading) {
-        int start = 0;
-        int end = heading.length();
-        char c;
-        do {
-            c = heading.charAt(start++);
-        } while ((c == '.' || Character.isDigit(c)) && start < end);
-
-        //disregard trailing dots
-        while (heading.charAt(start - 1) == '.' && start > 0) {
-            start--;
-        }
-        return heading.substring(0, start);
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/DirtyStateContribution.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/DirtyStateContribution.java
deleted file mode 100644
index 50489ad..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/DirtyStateContribution.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.jface.action.ControlContribution;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IPropertyListener;
-
-/**
- * This class demonstrates the contribution of a custom control to the 
- * status line for the readme editor.  The control shows the
- * dirty status of the editor.
- */
-public class DirtyStateContribution extends ControlContribution implements
-        IPropertyListener {
-    private Composite composite;
-
-    private Label label;
-
-    private IEditorPart activeEditor;
-
-    /**
-     * Creates a new DirtyStateContribution.
-     */
-    protected DirtyStateContribution() {
-        super("DirtyState"); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ControlContribution
-     */
-    protected Control createControl(Composite parent) {
-        // If the composite is good just return it.
-        if (composite != null && !composite.isDisposed())
-            return composite;
-
-        // Create composite for border.
-        composite = new Composite(parent, SWT.BORDER);
-        composite.setData(this);
-
-        // Create label inside composite.	
-        label = new Label(composite, SWT.NONE);
-        label.setSize(80, 15);
-
-        updateState();
-        return composite;
-    }
-
-    /**
-     * Called when an editor is activated.
-     *
-     * @see ReadmeEditorActionBarContributor#setActiveEditor(IEditorPart)
-     */
-    public void editorChanged(IEditorPart part) {
-        if (activeEditor != null) {
-            activeEditor.removePropertyListener(this);
-        }
-        activeEditor = part;
-        if (activeEditor != null) {
-            activeEditor.addPropertyListener(this);
-        }
-        updateState();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertyListener
-     */
-    public void propertyChanged(Object source, int propID) {
-        if (source instanceof IEditorPart)
-            updateState();
-    }
-
-    /**
-     * Updates the state of the label.
-     */
-    private void updateState() {
-        if (label == null || label.isDisposed())
-            return;
-
-        boolean saveNeeded = false;
-        if (activeEditor != null)
-            saveNeeded = activeEditor.isDirty();
-        if (saveNeeded)
-            label.setText(MessageUtil.getString("Save_Needed")); //$NON-NLS-1$
-        else
-            label.setText(MessageUtil.getString("Clean")); //$NON-NLS-1$
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/EditorActionDelegate.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/EditorActionDelegate.java
deleted file mode 100644
index 09cbf35..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/EditorActionDelegate.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IEditorActionDelegate;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * This class is used to demonstrate editor action extensions.
- * An extension should be defined in the readme plugin.xml.
- */
-public class EditorActionDelegate implements IEditorActionDelegate {
-    private IEditorPart editor;
-
-    /**
-     * Creates a new EditorActionDelegate.
-     */
-    public EditorActionDelegate() {
-        // do nothing
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IActionDelegate
-     */
-    public void run(IAction action) {
-        MessageDialog.openInformation(editor.getSite().getShell(), MessageUtil
-                .getString("Readme_Editor"), //$NON-NLS-1$
-                MessageUtil.getString("Editor_Action_executed")); //$NON-NLS-1$
-    }
-
-    /** 
-     * The <code>EditorActionDelegate</code> implementation of this
-     * <code>IActionDelegate</code> method does nothing.
-     *
-     * Selection in the workbench has changed. Plugin provider
-     * can use it to change the availability of the action
-     * or to modify other presentation properties.
-     *
-     * <p>Action delegate cannot be notified about
-     * selection changes before it is loaded. For that reason,
-     * control of action's enable state should also be performed
-     * through simple XML rules defined for the extension
-     * point. These rules allow enable state control before
-     * the delegate has been loaded.</p>
-     */
-    public void selectionChanged(IAction action, ISelection selection) {
-        // do nothing
-    }
-
-    /** 
-     * The <code>EditorActionDelegate</code> implementation of this
-     * <code>IEditorActionDelegate</code> method remembers the active editor.
-     *
-     * The matching editor has been activated. Notification
-     * guarantees that only editors that match the type for which 
-     * this action has been registered will be tracked.
-     *
-     * @param action action proxy that represents this delegate in the workbench
-     * @param editor the matching editor that has been activated
-     */
-    public void setActiveEditor(IAction action, IEditorPart editor) {
-        this.editor = editor;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/IReadmeConstants.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/IReadmeConstants.java
deleted file mode 100644
index dda2fe7..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/IReadmeConstants.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-/**
- * This interface contains constants for use only within the
- * Readme example.
- */
-public interface IReadmeConstants {
-    public static final String PLUGIN_ID = "org.eclipse.ui.examples.readmetool"; //$NON-NLS-1$
-
-    public static final String PREFIX = PLUGIN_ID + "."; //$NON-NLS-1$
-
-    public static final String P_CONTENT_OUTLINE = PREFIX + "content_outline"; //$NON-NLS-1$
-
-    public static final String P_SECTIONS = PREFIX + "sections"; //$NON-NLS-1$
-
-    public static final String EXTENSION = "readme"; //$NON-NLS-1$
-
-    public static final String TAG_PARSER = "parser"; //$NON-NLS-1$
-
-    public static final String ATT_CLASS = "class"; //$NON-NLS-1$
-
-    public static final String PP_SECTION_PARSER = "sectionParser"; //$NON-NLS-1$
-
-    // Global actions
-    public static final String RETARGET2 = PREFIX + "retarget2"; //$NON-NLS-1$
-
-    public static final String LABELRETARGET3 = PREFIX + "labelretarget3"; //$NON-NLS-1$
-
-    public static final String ACTION_SET_RETARGET4 = "org_eclipse_ui_examples_readmetool_readmeRetargetAction"; //$NON-NLS-1$
-
-    public static final String ACTION_SET_LABELRETARGET5 = "org_eclipse_ui_examples_readmetool_readmeRelabelRetargetAction"; //$NON-NLS-1$
-
-    // Preference constants
-    public static final String PRE_CHECK1 = PREFIX + "check1"; //$NON-NLS-1$
-
-    public static final String PRE_CHECK2 = PREFIX + "check2"; //$NON-NLS-1$
-
-    public static final String PRE_CHECK3 = PREFIX + "check3"; //$NON-NLS-1$
-
-    public static final String PRE_RADIO_CHOICE = PREFIX + "radio_choice"; //$NON-NLS-1$
-
-    public static final String PRE_TEXT = PREFIX + "text"; //$NON-NLS-1$
-
-    // Help context ids
-    public static final String EDITOR_ACTION1_CONTEXT = PREFIX
-            + "editor_action1_context"; //$NON-NLS-1$
-
-    public static final String EDITOR_ACTION2_CONTEXT = PREFIX
-            + "editor_action2_context"; //$NON-NLS-1$
-
-    public static final String EDITOR_ACTION3_CONTEXT = PREFIX
-            + "editor_action3_context"; //$NON-NLS-1$
-
-    public static final String SECTIONS_VIEW_CONTEXT = PREFIX
-            + "sections_view_context"; //$NON-NLS-1$
-
-    public static final String PREFERENCE_PAGE_CONTEXT = PREFIX
-            + "preference_page_context"; //$NON-NLS-1$
-
-    public static final String PROPERTY_PAGE_CONTEXT = PREFIX
-            + "property_page_context"; //$NON-NLS-1$
-
-    public static final String PROPERTY_PAGE2_CONTEXT = PREFIX
-            + "property_page2_context"; //$NON-NLS-1$
-
-    public static final String EDITOR_CONTEXT = PREFIX + "editor_context"; //$NON-NLS-1$
-
-    public static final String SECTIONS_DIALOG_CONTEXT = PREFIX
-            + "sections_dialog_context"; //$NON-NLS-1$
-
-    public static final String CONTENT_OUTLINE_PAGE_CONTEXT = PREFIX
-            + "content_outline_page_context"; //$NON-NLS-1$
-
-    public static final String CREATION_WIZARD_PAGE_CONTEXT = PREFIX
-            + "creation_wizard_page_context"; //$NON-NLS-1$
-
-    // Marker attributes
-    public static final String MARKER_ATT_ID = PREFIX + "id"; //$NON-NLS-1$
-
-    public static final String MARKER_ATT_LEVEL = PREFIX + "level"; //$NON-NLS-1$
-
-    public static final String MARKER_ATT_DEPT = PREFIX + "department"; //$NON-NLS-1$
-
-    public static final String MARKER_ATT_CODE = PREFIX + "code"; //$NON-NLS-1$
-
-    public static final String MARKER_ATT_LANG = PREFIX + "language"; //$NON-NLS-1$
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/IReadmeFileParser.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/IReadmeFileParser.java
deleted file mode 100644
index ce00f30..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/IReadmeFileParser.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.core.resources.IFile;
-
-/**
- * This interface is used as API for the Readme parser extension 
- * point. The default implementation simply looks for lines
- * in the file that start with a number and assumes that they
- * represent sections. Tools are allowed to replace this 
- * algorithm by defining an extension and supplying an 
- * alternative that implements this interface.
- */
-public interface IReadmeFileParser {
-    /**
-     * Parses the contents of the provided file
-     * and generates a collection of sections.
-     */
-    public MarkElement[] parse(IFile readmeFile);
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/MarkElement.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/MarkElement.java
deleted file mode 100644
index 7a5d8d8..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/MarkElement.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import java.util.Vector;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.ui.views.properties.IPropertySource;
-
-/**
- * This class represents a marked location in the Readme
- * file text.  
- *
- * TIP: By implementing the <code>IWorkbenchAdapter</code> interface,
- * we can easily add objects of this type to viewers and parts in
- * the workbench.  When a viewer contains <code>IWorkbenchAdapter</code>,
- * the generic <code>WorkbenchContentProvider</code> and
- * <code>WorkbenchLabelProvider</code> can be used to provide
- * navigation and display for that viewer.
- */
-public class MarkElement implements IWorkbenchAdapter, IAdaptable {
-    private String headingName;
-
-    private IAdaptable parent;
-
-    private int offset;
-
-    private int numberOfLines;
-
-    private int length;
-
-    private Vector children;
-
-    /**
-     * Creates a new MarkElement and stores parent element and
-     * location in the text.
-     *
-     * @param parent  the parent of this element
-     * @param heading text corresponding to the heading
-     * @param offset  the offset into the Readme text
-     * @param length  the length of the element
-     */
-    public MarkElement(IAdaptable parent, String heading, int offset, int length) {
-        this.parent = parent;
-        if (parent instanceof MarkElement) {
-            ((MarkElement) parent).addChild(this);
-        }
-        this.headingName = heading;
-        this.offset = offset;
-        this.length = length;
-    }
-
-    /**
-     * Adds a child to this element
-     */
-    private void addChild(MarkElement child) {
-        if (children == null) {
-            children = new Vector();
-        }
-        children.add(child);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IAdaptable
-     */
-    public Object getAdapter(Class adapter) {
-        if (adapter == IWorkbenchAdapter.class)
-            return this;
-        if (adapter == IPropertySource.class)
-            return new MarkElementProperties(this);
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchAdapter
-     */
-    public Object[] getChildren(Object object) {
-        if (children != null) {
-            return children.toArray();
-        }
-        return new Object[0];
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchAdapter
-     */
-    public ImageDescriptor getImageDescriptor(Object object) {
-        IWorkbenchAdapter parentElement = (IWorkbenchAdapter) parent
-                .getAdapter(IWorkbenchAdapter.class);
-        if (parentElement != null) {
-            return parentElement.getImageDescriptor(object);
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchAdapter
-     */
-    public String getLabel(Object o) {
-        return headingName;
-    }
-
-    /**
-     * Returns the number of characters in this section.
-     */
-    public int getLength() {
-        return length;
-    }
-
-    /**
-     * Returns the number of lines in the element.
-     *
-     * @return the number of lines in the element
-     */
-    public int getNumberOfLines() {
-        return numberOfLines;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchAdapter
-     */
-    public Object getParent(Object o) {
-        return null;
-    }
-
-    /**
-     * Returns the offset of this section in the file.
-     */
-    public int getStart() {
-        return offset;
-    }
-
-    /**
-     * Sets the number of lines in the element
-     *
-     * @param newNumberOfLines  the number of lines in the element
-     */
-    public void setNumberOfLines(int newNumberOfLines) {
-        numberOfLines = newNumberOfLines;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/MarkElementProperties.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/MarkElementProperties.java
deleted file mode 100644
index 58379e5..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/MarkElementProperties.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-
-/**
- * This class encapsulates property sheet properties
- * for MarkElement.  This will display properties for
- * the MarkElement when selected in the readme editor's
- * content outline.
- */
-public class MarkElementProperties implements IPropertySource {
-    protected MarkElement element;
-
-    protected static final String PROPERTY_LINECOUNT = "lineno"; //$NON-NLS-1$
-
-    protected static final String PROPERTY_START = "start"; //$NON-NLS-1$
-
-    protected static final String PROPERTY_LENGTH = "length"; //$NON-NLS-1$
-
-    /**
-     * Creates a new MarkElementProperties.
-     *
-     * @param element  the element whose properties this instance represents
-     */
-    public MarkElementProperties(MarkElement element) {
-        super();
-        this.element = element;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public Object getEditableValue() {
-        return this;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public IPropertyDescriptor[] getPropertyDescriptors() {
-        // Create the property vector.
-        IPropertyDescriptor[] propertyDescriptors = new IPropertyDescriptor[3];
-
-        // Add each property supported.
-        PropertyDescriptor descriptor;
-
-        descriptor = new PropertyDescriptor(PROPERTY_LINECOUNT, MessageUtil
-                .getString("Line_count")); //$NON-NLS-1$
-        propertyDescriptors[0] = descriptor;
-        descriptor = new PropertyDescriptor(PROPERTY_START, MessageUtil
-                .getString("Title_start")); //$NON-NLS-1$
-        propertyDescriptors[1] = descriptor;
-        descriptor = new PropertyDescriptor(PROPERTY_LENGTH, MessageUtil
-                .getString("Title_length")); //$NON-NLS-1$
-        propertyDescriptors[2] = descriptor;
-
-        // Return it.
-        return propertyDescriptors;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public Object getPropertyValue(Object name) {
-        if (name.equals(PROPERTY_LINECOUNT))
-            return new Integer(element.getNumberOfLines());
-        if (name.equals(PROPERTY_START))
-            return new Integer(element.getStart());
-        if (name.equals(PROPERTY_LENGTH))
-            return new Integer(element.getLength());
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public boolean isPropertySet(Object property) {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public void resetPropertyValue(Object property) {
-        // do nothing
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPropertySource
-     */
-    public void setPropertyValue(Object name, Object value) {
-        // do nothing
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/MessageUtil.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/MessageUtil.java
deleted file mode 100644
index 44e2ce1..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/MessageUtil.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Utility class which helps with managing messages.
- */
-/* package */class MessageUtil {
-
-    private static final String RESOURCE_BUNDLE = "org.eclipse.ui.examples.readmetool.messages";//$NON-NLS-1$
-
-    private static ResourceBundle fgResourceBundle = ResourceBundle
-            .getBundle(RESOURCE_BUNDLE);
-
-    private MessageUtil() {
-        // prevent instantiation of class
-    }
-
-    /**
-     * Returns the formatted message for the given key in
-     * the resource bundle. 
-     *
-     * @param key the resource name
-     * @param args the message arguments
-     * @return the string
-     */
-    public static String format(String key, Object[] args) {
-        return MessageFormat.format(getString(key), args);
-    }
-
-    /**
-     * Returns the resource object with the given key in
-     * the resource bundle. If there isn't any value under
-     * the given key, the key is returned, surrounded by '!'s.
-     *
-     * @param key the resource name
-     * @return the string
-     */
-    public static String getString(String key) {
-        try {
-            return fgResourceBundle.getString(key);
-        } catch (MissingResourceException e) {
-            return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$
-        }
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/PopupMenuActionDelegate.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/PopupMenuActionDelegate.java
deleted file mode 100644
index 89b5cc3..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/PopupMenuActionDelegate.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Action delegate for handling popup menu actions on a readme file.
- */
-public class PopupMenuActionDelegate implements IObjectActionDelegate {
-
-    private IWorkbenchPart part;
-
-    /** (non-Javadoc)
-     * Method declared on IDropActionDelegate
-     */
-    public void run(IAction action) {
-        MessageDialog.openInformation(this.part.getSite().getShell(),
-                MessageUtil.getString("Readme_Example"), //$NON-NLS-1$
-                MessageUtil.getString("Popup_Menu_Action_executed")); //$NON-NLS-1$
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IActionDelegate
-     */
-    public void selectionChanged(IAction action, ISelection selection) {
-        //Ignored for this example
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IObjectActionDelegate
-     */
-    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-        this.part = targetPart;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeContentOutlineDragListener.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeContentOutlineDragListener.java
deleted file mode 100644
index ff4ab63..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeContentOutlineDragListener.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.dnd.DragSourceAdapter;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.ui.part.PluginTransfer;
-import org.eclipse.ui.part.PluginTransferData;
-
-/**
- * A drag listener for the readme editor's content outline page.
- * Allows dragging of content segments into views that support
- * the <code>TextTransfer</code> or <code>PluginTransfer</code> transfer types.
- */
-public class ReadmeContentOutlineDragListener extends DragSourceAdapter {
-    private ReadmeContentOutlinePage page;
-
-    /**
-     * Creates a new drag listener for the given page.
-     */
-    public ReadmeContentOutlineDragListener(ReadmeContentOutlinePage page) {
-        this.page = page;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on DragSourceListener
-     */
-    public void dragSetData(DragSourceEvent event) {
-        if (PluginTransfer.getInstance().isSupportedType(event.dataType)) {
-            byte[] segmentData = getSegmentText().getBytes();
-            event.data = new PluginTransferData(ReadmeDropActionDelegate.ID,
-                    segmentData);
-            return;
-        }
-        if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
-            event.data = getSegmentText();
-            return;
-        }
-    }
-
-    /**
-     * Returns the text of the currently selected readme segment.
-     */
-    private String getSegmentText() {
-        StringBuffer result = new StringBuffer();
-        ISelection selection = page.getSelection();
-        if (selection instanceof org.eclipse.jface.viewers.IStructuredSelection) {
-            Object[] selected = ((IStructuredSelection) selection).toArray();
-            result.append("\n"); //$NON-NLS-1$
-            for (int i = 0; i < selected.length; i++) {
-                if (selected[i] instanceof MarkElement) {
-                    result.append(((MarkElement) selected[i])
-                            .getLabel(selected[i]));
-                    result.append("\n"); //$NON-NLS-1$
-                }
-            }
-        }
-        return result.toString();
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeContentOutlinePage.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeContentOutlinePage.java
deleted file mode 100644
index e25ee80..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeContentOutlinePage.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.part.PluginTransfer;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-
-/**
- * Content outline page for the readme editor.
- */
-public class ReadmeContentOutlinePage extends ContentOutlinePage {
-    protected IFile input;
-
-    class OutlineAction extends Action {
-        private Shell shell;
-
-        public OutlineAction(String label) {
-            super(label);
-            getTreeViewer().addSelectionChangedListener(
-                    new ISelectionChangedListener() {
-                        public void selectionChanged(SelectionChangedEvent event) {
-                            setEnabled(!event.getSelection().isEmpty());
-                        }
-                    });
-        }
-
-        public void setShell(Shell shell) {
-            this.shell = shell;
-        }
-
-        public void run() {
-            MessageDialog.openInformation(shell, MessageUtil
-                    .getString("Readme_Outline"), //$NON-NLS-1$
-                    MessageUtil.getString("ReadmeOutlineActionExecuted")); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Creates a new ReadmeContentOutlinePage.
-     */
-    public ReadmeContentOutlinePage(IFile input) {
-        super();
-        this.input = input;
-    }
-
-    /**  
-     * Creates the control and registers the popup menu for this page
-     * Menu id "org.eclipse.ui.examples.readmetool.outline"
-     */
-    public void createControl(Composite parent) {
-        super.createControl(parent);
-
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
-                IReadmeConstants.CONTENT_OUTLINE_PAGE_CONTEXT);
-
-        TreeViewer viewer = getTreeViewer();
-        viewer.setContentProvider(new WorkbenchContentProvider());
-        viewer.setLabelProvider(new WorkbenchLabelProvider());
-        viewer.setInput(getContentOutline(input));
-        initDragAndDrop();
-
-        // Configure the context menu.
-        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
-        menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-        menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS
-                + "-end")); //$NON-NLS-1$
-
-        Menu menu = menuMgr.createContextMenu(viewer.getTree());
-        viewer.getTree().setMenu(menu);
-        // Be sure to register it so that other plug-ins can add actions.
-        getSite().registerContextMenu(
-                "org.eclipse.ui.examples.readmetool.outline", menuMgr, viewer); //$NON-NLS-1$
-
-        getSite().getActionBars().setGlobalActionHandler(
-                IReadmeConstants.RETARGET2,
-                new OutlineAction(MessageUtil.getString("Outline_Action2"))); //$NON-NLS-1$
-
-        OutlineAction action = new OutlineAction(MessageUtil
-                .getString("Outline_Action3")); //$NON-NLS-1$
-        action.setToolTipText(MessageUtil.getString("Readme_Outline_Action3")); //$NON-NLS-1$
-        getSite().getActionBars().setGlobalActionHandler(
-                IReadmeConstants.LABELRETARGET3, action);
-        action = new OutlineAction(MessageUtil.getString("Outline_Action4")); //$NON-NLS-1$
-        getSite().getActionBars().setGlobalActionHandler(
-                IReadmeConstants.ACTION_SET_RETARGET4, action);
-        action = new OutlineAction(MessageUtil.getString("Outline_Action5")); //$NON-NLS-1$
-        action.setToolTipText(MessageUtil.getString("Readme_Outline_Action5")); //$NON-NLS-1$
-        getSite().getActionBars().setGlobalActionHandler(
-                IReadmeConstants.ACTION_SET_LABELRETARGET5, action);
-    }
-
-    /**
-     * Gets the content outline for a given input element.
-     * Returns the outline (a list of MarkElements), or null
-     * if the outline could not be generated.
-     */
-    private IAdaptable getContentOutline(IAdaptable input) {
-        return ReadmeModelFactory.getInstance().getContentOutline(input);
-    }
-
-    /**
-     * Initializes drag and drop for this content outline page.
-     */
-    private void initDragAndDrop() {
-        int ops = DND.DROP_COPY | DND.DROP_MOVE;
-        Transfer[] transfers = new Transfer[] { TextTransfer.getInstance(),
-                PluginTransfer.getInstance() };
-        getTreeViewer().addDragSupport(ops, transfers,
-                new ReadmeContentOutlineDragListener(this));
-    }
-
-    /**
-     * Forces the page to update its contents.
-     *
-     * @see ReadmeEditor#doSave(IProgressMonitor)
-     */
-    public void update() {
-        getControl().setRedraw(false);
-        getTreeViewer().setInput(getContentOutline(input));
-        getTreeViewer().expandAll();
-        getControl().setRedraw(true);
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeCreationPage.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeCreationPage.java
deleted file mode 100644
index 71f7460..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeCreationPage.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.examples.readmetool;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-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.Event;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
-import org.eclipse.ui.ide.IDE;
-
-/**
- * This class is the only page of the Readme file resource creation wizard.  
- * It subclasses the standard file resource creation page class, 
- * and consequently inherits the file resource creation functionality.
- *
- * This page provides users with the choice of creating sample headings for
- * sections and subsections.  Additionally, the option is presented to open
- * the file immediately for editing after creation.
- */
-public class ReadmeCreationPage extends WizardNewFileCreationPage {
-    private IWorkbench workbench;
-
-    // widgets
-    private Button sectionCheckbox;
-
-    private Button subsectionCheckbox;
-
-    private Button openFileCheckbox;
-
-    // constants
-    private static int nameCounter = 1;
-
-    /**
-     * Creates the page for the readme creation wizard.
-     *
-     * @param workbench  the workbench on which the page should be created
-     * @param selection  the current selection
-     */
-    public ReadmeCreationPage(IWorkbench workbench,
-            IStructuredSelection selection) {
-        super("sampleCreateReadmePage1", selection); //$NON-NLS-1$
-        this.setTitle(MessageUtil.getString("Create_Readme_File")); //$NON-NLS-1$
-        this.setDescription(MessageUtil
-                .getString("Create_a_new_Readme_file_resource")); //$NON-NLS-1$
-        this.workbench = workbench;
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IDialogPage.
-     */
-    public void createControl(Composite parent) {
-        // inherit default container and name specification widgets
-        super.createControl(parent);
-        Composite composite = (Composite) getControl();
-
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(composite,
-				IReadmeConstants.CREATION_WIZARD_PAGE_CONTEXT);
-
-        this.setFileName("sample" + nameCounter + ".readme"); //$NON-NLS-1$ //$NON-NLS-2$
-
-        // sample section generation group
-        Group group = new Group(composite, SWT.NONE);
-        group.setLayout(new GridLayout());
-        group.setText(MessageUtil
-                .getString("Automatic_sample_section_generation")); //$NON-NLS-1$
-        group.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
-                | GridData.HORIZONTAL_ALIGN_FILL));
-
-        // sample section generation checkboxes
-        sectionCheckbox = new Button(group, SWT.CHECK);
-        sectionCheckbox.setText(MessageUtil
-                .getString("Generate_sample_section_titles")); //$NON-NLS-1$
-        sectionCheckbox.setSelection(true);
-        sectionCheckbox.addListener(SWT.Selection, this);
-
-        subsectionCheckbox = new Button(group, SWT.CHECK);
-        subsectionCheckbox.setText(MessageUtil
-                .getString("Generate_sample_subsection_titles")); //$NON-NLS-1$
-        subsectionCheckbox.setSelection(true);
-        subsectionCheckbox.addListener(SWT.Selection, this);
-
-        // open file for editing checkbox
-        openFileCheckbox = new Button(composite, SWT.CHECK);
-        openFileCheckbox.setText(MessageUtil
-                .getString("Open_file_for_editing_when_done")); //$NON-NLS-1$
-        openFileCheckbox.setSelection(true);
-
-        setPageComplete(validatePage());
-
-    }
-
-    /**
-     * Creates a new file resource as requested by the user. If everything
-     * is OK then answer true. If not, false will cause the dialog
-     * to stay open.
-     *
-     * @return whether creation was successful
-     * @see ReadmeCreationWizard#performFinish()
-     */
-    public boolean finish() {
-        // create the new file resource
-        IFile newFile = createNewFile();
-        if (newFile == null)
-            return false; // ie.- creation was unsuccessful
-
-        // Since the file resource was created fine, open it for editing
-        // if requested by the user
-        try {
-            if (openFileCheckbox.getSelection()) {
-                IWorkbenchWindow dwindow = workbench.getActiveWorkbenchWindow();
-                IWorkbenchPage page = dwindow.getActivePage();
-                if (page != null) {
-                    IDE.openEditor(page, newFile, true);
-                }
-            }
-        } catch (PartInitException e) {
-            e.printStackTrace();
-            return false;
-        }
-        nameCounter++;
-        return true;
-    }
-
-    /** 
-     * The <code>ReadmeCreationPage</code> implementation of this
-     * <code>WizardNewFileCreationPage</code> method 
-     * generates sample headings for sections and subsections in the
-     * newly-created Readme file according to the selections of self's
-     * checkbox widgets
-     */
-    protected InputStream getInitialContents() {
-        if (!sectionCheckbox.getSelection())
-            return null;
-
-        StringBuffer sb = new StringBuffer();
-        sb.append(MessageUtil.getString("SAMPLE_README_FILE")); //$NON-NLS-1$
-        sb.append(MessageUtil.getString("SECTION_1")); //$NON-NLS-1$
-        sb.append(MessageUtil.getString("SECTION_1_BODY_1")); //$NON-NLS-1$
-
-        if (subsectionCheckbox.getSelection()) {
-            sb.append(MessageUtil.getString("Subsection_1_1")); //$NON-NLS-1$
-            sb.append(MessageUtil.getString("Subsection_1_1_Body_1")); //$NON-NLS-1$
-        }
-
-        sb.append(MessageUtil.getString("SECTION_2")); //$NON-NLS-1$
-        sb.append(MessageUtil.getString("SECTION_2_BODY_1")); //$NON-NLS-1$
-        sb.append(MessageUtil.getString("SECTION_2_BODY_2")); //$NON-NLS-1$
-
-        if (subsectionCheckbox.getSelection()) {
-            sb.append(MessageUtil.getString("Subsection_2_1")); //$NON-NLS-1$
-            sb.append(MessageUtil.getString("Subsection_2_1_BODY_1")); //$NON-NLS-1$
-            sb.append(MessageUtil.getString("Subsection_2_2")); //$NON-NLS-1$
-            sb.append(MessageUtil.getString("Subsection_2_2_BODY_1")); //$NON-NLS-1$
-        }
-
-        return new ByteArrayInputStream(sb.toString().getBytes());
-    }
-
-    /** (non-Javadoc)
-     * Method declared on WizardNewFileCreationPage.
-     */
-    protected String getNewFileLabel() {
-        return MessageUtil.getString("Readme_file_name"); //$NON-NLS-1$
-    }
-
-    /** (non-Javadoc)
-     * Method declared on WizardNewFileCreationPage.
-     */
-    public void handleEvent(Event e) {
-        Widget source = e.widget;
-
-        if (source == sectionCheckbox) {
-            if (!sectionCheckbox.getSelection())
-                subsectionCheckbox.setSelection(false);
-            subsectionCheckbox.setEnabled(sectionCheckbox.getSelection());
-        }
-
-        super.handleEvent(e);
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeCreationWizard.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeCreationWizard.java
deleted file mode 100644
index 615d1dc..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeCreationWizard.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * This class implements the interface required by the workbench
- * for all 'New' wizards.  This wizard creates readme files.
- */
-public class ReadmeCreationWizard extends Wizard implements INewWizard {
-    private IStructuredSelection selection;
-
-    private IWorkbench workbench;
-
-    private ReadmeCreationPage mainPage;
-
-    /** (non-Javadoc)
-     * Method declared on Wizard.
-     */
-    public void addPages() {
-        mainPage = new ReadmeCreationPage(workbench, selection);
-        addPage(mainPage);
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IWorkbenchWizard
-     */
-    public void init(IWorkbench workbench, IStructuredSelection selection) {
-        this.workbench = workbench;
-        this.selection = selection;
-        setWindowTitle(MessageUtil.getString("New_Readme_File")); //$NON-NLS-1$
-        setDefaultPageImageDescriptor(ReadmeImages.README_WIZARD_BANNER);
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IWizard
-     */
-    public boolean performFinish() {
-        return mainPage.finish();
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeDropActionDelegate.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeDropActionDelegate.java
deleted file mode 100644
index e4b7cf4..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeDropActionDelegate.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import java.io.ByteArrayInputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.part.IDropActionDelegate;
-
-/**
- * Adapter for handling the dropping of readme segments into
- * another plugin.  In this case, we expect the segments
- * to be dropped onto <code>IFile</code> object, or an adapter 
- * that supports <code>IFile</code>.
- */
-public class ReadmeDropActionDelegate implements IDropActionDelegate {
-    public static final String ID = "org_eclipse_ui_examples_readmetool_drop_actions"; //$NON-NLS-1$
-
-    /** (non-Javadoc)
-     * Method declared on IDropActionDelegate
-     */
-    public boolean run(Object source, Object target) {
-        if (source instanceof byte[] && target instanceof IFile) {
-            IFile file = (IFile) target;
-            try {
-                file.appendContents(new ByteArrayInputStream((byte[]) source),
-                        false, true, null);
-            } catch (CoreException e) {
-                System.out
-                        .println(MessageUtil
-                                .getString("Exception_in_readme_drop_adapter") + e.getStatus().getMessage()); //$NON-NLS-1$
-                return false;
-            }
-            return true;
-        }
-        return false;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeEditor.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeEditor.java
deleted file mode 100644
index 58e08d5..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeEditor.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.DropTargetListener;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.dnd.IDragAndDropService;
-import org.eclipse.ui.editors.text.TextEditor;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-/**
- * This class implements the Readme editor.  Since the readme
- * editor is mostly just a text editor, there is very little
- * implemented in this actual class.  It can be regarded as
- * simply decorating the text editor with a content outline.
- */
-public class ReadmeEditor extends TextEditor {
-    protected ReadmeContentOutlinePage page;
-
-    /**
-     * Creates a new ReadmeEditor.
-     */
-    public ReadmeEditor() {
-        super();
-    }
-
-    /* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.StatusTextEditor#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-		
-		StyledText tw = getSourceViewer().getTextWidget();
-		
-		// Add a 'TextTransfer' drop target to the editor
-		int ops = DND.DROP_DEFAULT | DND.DROP_COPY;
-		Transfer[] transfers = { TextTransfer.getInstance() };
-		DropTargetListener editorListener = new DropTargetListener() {
-
-			public void dragEnter(DropTargetEvent event) {
-				event.detail = DND.DROP_COPY;
-			}
-
-			public void dragLeave(DropTargetEvent event) {
-			}
-
-			public void dragOperationChanged(DropTargetEvent event) {
-				event.detail = DND.DROP_COPY;
-			}
-
-			public void dragOver(DropTargetEvent event) {
-				event.feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_SELECT;
-			}
-
-			public void drop(DropTargetEvent event) {
-		        if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
-					String text = (String) event.data;
-					getSourceViewer().getTextWidget().insert(text);
-				} 
-			}
-
-			public void dropAccept(DropTargetEvent event) {
-			}
-			
-		};
-		
-		IDragAndDropService dtSvc = (IDragAndDropService) getSite().getService(IDragAndDropService.class);
-		dtSvc.addMergedDropTarget(tw, ops, transfers, editorListener);
-	}
-	
-    /** (non-Javadoc)
-     * Method declared on IEditorPart
-     */
-    public void doSave(IProgressMonitor monitor) {
-        super.doSave(monitor);
-        if (page != null)
-            page.update();
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IAdaptable
-     */
-    public Object getAdapter(Class key) {
-        if (key.equals(IContentOutlinePage.class)) {
-            IEditorInput input = getEditorInput();
-            if (input instanceof IFileEditorInput) {
-                page = new ReadmeContentOutlinePage(((IFileEditorInput) input)
-                        .getFile());
-                return page;
-            }
-        }
-        return super.getAdapter(key);
-    }
-
-    /** (non-Javadoc)
-     * Method declared on AbstractTextEditor
-     */
-    protected void editorContextMenuAboutToShow(IMenuManager parentMenu) {
-        super.editorContextMenuAboutToShow(parentMenu);
-        parentMenu.add(new Separator());
-        IMenuManager subMenu = new MenuManager(MessageUtil.getString("Add")); //$NON-NLS-1$
-        parentMenu.add(subMenu);
-        if (subMenu != null) {
-            // Add readme actions with various attributes
-            Object[][] att = new Object[][] { { IReadmeConstants.MARKER_ATT_ID,
-                    new Integer(1234) } };
-            subMenu
-                    .add(new AddReadmeMarkerAction(
-                            this,
-                            MessageUtil
-                                    .getString("Add_readme_marker_action_label") + "1", //$NON-NLS-1$ //$NON-NLS-2$
-                            att,
-                            MessageUtil
-                                    .getString("Readme_marker_message_example") + " id=1234")); //$NON-NLS-1$ //$NON-NLS-2$
-
-            att = new Object[][] { { IReadmeConstants.MARKER_ATT_LEVEL,
-                    new Integer(7) } };
-            subMenu
-                    .add(new AddReadmeMarkerAction(
-                            this,
-                            MessageUtil
-                                    .getString("Add_readme_marker_action_label") + "2", //$NON-NLS-1$ //$NON-NLS-2$
-                            att,
-                            MessageUtil
-                                    .getString("Readme_marker_message_example") + " level=7")); //$NON-NLS-1$ //$NON-NLS-2$
-
-            att = new Object[][] {
-                    { IReadmeConstants.MARKER_ATT_LEVEL, new Integer(7) },
-                    { IReadmeConstants.MARKER_ATT_DEPT, "infra" } }; //$NON-NLS-1$
-            subMenu
-                    .add(new AddReadmeMarkerAction(
-                            this,
-                            MessageUtil
-                                    .getString("Add_readme_marker_action_label") + "3", //$NON-NLS-1$ //$NON-NLS-2$
-                            att,
-                            MessageUtil
-                                    .getString("Readme_marker_message_example") + " level=7, department=infra")); //$NON-NLS-1$ //$NON-NLS-2$
-
-            att = new Object[][] { { IReadmeConstants.MARKER_ATT_CODE, "red" } }; //$NON-NLS-1$
-            subMenu
-                    .add(new AddReadmeMarkerAction(
-                            this,
-                            MessageUtil
-                                    .getString("Add_readme_marker_action_label") + "4", //$NON-NLS-1$ //$NON-NLS-2$
-                            att,
-                            MessageUtil
-                                    .getString("Readme_marker_message_example") + " code=red")); //$NON-NLS-1$ //$NON-NLS-2$
-
-            att = new Object[][] { { IReadmeConstants.MARKER_ATT_LANG,
-                    "english" } }; //$NON-NLS-1$
-            subMenu
-                    .add(new AddReadmeMarkerAction(
-                            this,
-                            MessageUtil
-                                    .getString("Add_readme_marker_action_label") + "5", //$NON-NLS-1$ //$NON-NLS-2$
-                            att,
-                            MessageUtil
-                                    .getString("Readme_marker_message_example") + " language=english")); //$NON-NLS-1$ //$NON-NLS-2$
-
-            att = new Object[][] {
-                    { IReadmeConstants.MARKER_ATT_ID, new Integer(1234) },
-                    { IReadmeConstants.MARKER_ATT_LEVEL, new Integer(7) },
-                    { IReadmeConstants.MARKER_ATT_DEPT, "infra" }, //$NON-NLS-1$
-                    { IReadmeConstants.MARKER_ATT_CODE, "red" }, //$NON-NLS-1$
-                    { IReadmeConstants.MARKER_ATT_LANG, "english" } }; //$NON-NLS-1$
-            subMenu
-                    .add(new AddReadmeMarkerAction(
-                            this,
-                            MessageUtil
-                                    .getString("Add_readme_marker_action_label") + "6", //$NON-NLS-1$ //$NON-NLS-2$
-                            att,
-                            MessageUtil
-                                    .getString("Readme_marker_message_example") + //$NON-NLS-1$
-                                    " id=1234, level=7, department=infra, code=red, language=english")); //$NON-NLS-1$
-
-            att = new Object[0][0];
-            subMenu
-                    .add(new AddReadmeMarkerAction(
-                            this,
-                            MessageUtil
-                                    .getString("Add_readme_marker_action_label") + "7", //$NON-NLS-1$ //$NON-NLS-2$
-                            att,
-                            MessageUtil
-                                    .getString("Readme_marker_message_example") + " No attributes specified")); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeEditorActionBarContributor.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeEditorActionBarContributor.java
deleted file mode 100644
index 58c466a..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeEditorActionBarContributor.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.examples.readmetool;
-
-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.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.LabelRetargetAction;
-import org.eclipse.ui.actions.RetargetAction;
-import org.eclipse.ui.texteditor.BasicTextEditorActionContributor;
-
-/**
- * This class demonstrates action contribution for the readme editor.
- * A number of menu, toolbar, and status line contributions are defined
- * in the workbench window.  These actions are shared among all 
- * readme editors, and are only visible when a readme editor is 
- * active.  Otherwise, they are invisible.
- */
-public class ReadmeEditorActionBarContributor extends
-        BasicTextEditorActionContributor {
-    private EditorAction action1;
-
-    private RetargetAction action2;
-
-    private LabelRetargetAction action3;
-
-    private EditorAction handler2;
-
-    private EditorAction handler3;
-
-    private EditorAction handler4;
-
-    private EditorAction handler5;
-
-    private DirtyStateContribution dirtyStateContribution;
-
-    class EditorAction extends Action {
-        private Shell shell;
-
-        private IEditorPart activeEditor;
-
-        public EditorAction(String label) {
-            super(label);
-        }
-
-        public void setShell(Shell shell) {
-            this.shell = shell;
-        }
-
-        public void run() {
-            String editorName = MessageUtil.getString("Empty_Editor_Name"); //$NON-NLS-1$
-            if (activeEditor != null)
-                editorName = activeEditor.getTitle();
-            MessageDialog
-                    .openInformation(
-                            shell,
-                            MessageUtil.getString("Readme_Editor"), //$NON-NLS-1$
-                            MessageUtil
-                                    .format(
-                                            "ReadmeEditorActionExecuted", new Object[] { getText(), editorName })); //$NON-NLS-1$
-        }
-
-        public void setActiveEditor(IEditorPart part) {
-            activeEditor = part;
-        }
-    }
-
-    /**
-     * Creates a new ReadmeEditorActionBarContributor.
-     */
-    public ReadmeEditorActionBarContributor() {
-        action1 = new EditorAction(MessageUtil.getString("Editor_Action1")); //$NON-NLS-1$
-        action1.setToolTipText(MessageUtil.getString("Readme_Editor_Action1")); //$NON-NLS-1$
-        action1
-                .setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_DISABLE);
-        action1.setImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_ENABLE);
-        action1.setHoverImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(action1, IReadmeConstants.EDITOR_ACTION1_CONTEXT);
-
-        action2 = new RetargetAction(IReadmeConstants.RETARGET2, MessageUtil
-                .getString("Editor_Action2")); //$NON-NLS-1$
-        action2.setToolTipText(MessageUtil.getString("Readme_Editor_Action2")); //$NON-NLS-1$
-        action2
-                .setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_DISABLE);
-        action2.setImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_ENABLE);
-        action2.setHoverImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE);
-
-        action3 = new LabelRetargetAction(IReadmeConstants.LABELRETARGET3,
-                MessageUtil.getString("Editor_Action3")); //$NON-NLS-1$
-        action3
-                .setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_DISABLE);
-        action3.setImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_ENABLE);
-        action3.setHoverImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE);
-
-        handler2 = new EditorAction(MessageUtil.getString("Editor_Action2")); //$NON-NLS-1$
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(action2, IReadmeConstants.EDITOR_ACTION2_CONTEXT);
-
-        handler3 = new EditorAction(MessageUtil.getString("Editor_Action3")); //$NON-NLS-1$
-        handler3.setToolTipText(MessageUtil.getString("Readme_Editor_Action3")); //$NON-NLS-1$
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(action3, IReadmeConstants.EDITOR_ACTION3_CONTEXT);
-
-        handler4 = new EditorAction(MessageUtil.getString("Editor_Action4")); //$NON-NLS-1$
-        handler5 = new EditorAction(MessageUtil.getString("Editor_Action5")); //$NON-NLS-1$
-        handler5.setToolTipText(MessageUtil.getString("Readme_Editor_Action5")); //$NON-NLS-1$
-
-        dirtyStateContribution = new DirtyStateContribution();
-    }
-
-    /** (non-Javadoc)
-     * Method declared on EditorActionBarContributor
-     */
-    public void contributeToMenu(IMenuManager menuManager) {
-        // Run super.
-        super.contributeToMenu(menuManager);
-
-        // Editor-specitic menu
-        MenuManager readmeMenu = new MenuManager(MessageUtil
-                .getString("Readme_Menu")); //$NON-NLS-1$
-        // It is important to append the menu to the
-        // group "additions". This group is created
-        // between "Project" and "Tools" menus
-        // for this purpose.
-        menuManager.insertAfter("additions", readmeMenu); //$NON-NLS-1$
-        readmeMenu.add(action1);
-        readmeMenu.add(action2);
-        readmeMenu.add(action3);
-    }
-
-    /** (non-Javadoc)
-     * Method declared on EditorActionBarContributor
-     */
-    public void contributeToStatusLine(IStatusLineManager statusLineManager) {
-        // Run super.
-        super.contributeToStatusLine(statusLineManager);
-        // Test status line.	
-        statusLineManager.setMessage(MessageUtil.getString("Editor_is_active")); //$NON-NLS-1$
-        statusLineManager.add(dirtyStateContribution);
-    }
-
-    /** (non-Javadoc)
-     * Method declared on EditorActionBarContributor
-     */
-    public void contributeToToolBar(IToolBarManager toolBarManager) {
-        // Run super.
-        super.contributeToToolBar(toolBarManager);
-
-        // Add toolbar stuff.
-        toolBarManager.add(new Separator("ReadmeEditor")); //$NON-NLS-1$
-        toolBarManager.add(action1);
-        toolBarManager.add(action2);
-        toolBarManager.add(action3);
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IEditorActionBarContributor
-     */
-    public void dispose() {
-        // Remove retarget actions as page listeners
-        getPage().removePartListener(action2);
-        getPage().removePartListener(action3);
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IEditorActionBarContributor
-     */
-    public void init(IActionBars bars, IWorkbenchPage page) {
-        super.init(bars, page);
-        bars.setGlobalActionHandler(IReadmeConstants.RETARGET2, handler2);
-        bars.setGlobalActionHandler(IReadmeConstants.LABELRETARGET3, handler3);
-        bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_RETARGET4,
-                handler4);
-        bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_LABELRETARGET5,
-                handler5);
-
-        // Hook retarget actions as page listeners
-        page.addPartListener(action2);
-        page.addPartListener(action3);
-        IWorkbenchPart activePart = page.getActivePart();
-        if (activePart != null) {
-            action2.partActivated(activePart);
-            action3.partActivated(activePart);
-        }
-    }
-
-    /** (non-Javadoc)
-     * Method declared on IEditorActionBarContributor
-     */
-    public void setActiveEditor(IEditorPart editor) {
-        // Run super.
-        super.setActiveEditor(editor);
-
-        // Target shared actions to new editor
-        action1.setActiveEditor(editor);
-        handler2.setActiveEditor(editor);
-        handler3.setActiveEditor(editor);
-        handler4.setActiveEditor(editor);
-        handler5.setActiveEditor(editor);
-        dirtyStateContribution.editorChanged(editor);
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeFilePropertyPage.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeFilePropertyPage.java
deleted file mode 100644
index fa02051..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeFilePropertyPage.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PropertyPage;
-
-/**
- * This page will be added to the property page dialog
- * when the "Properties..." popup menu item is selected
- * for Readme files. 
- */
-public class ReadmeFilePropertyPage extends PropertyPage {
-
-    /**
-     * Utility method that creates a new composite and
-     * sets up its layout data.
-     *
-     * @param parent  the parent of the composite
-     * @param numColumns  the number of columns in the new composite
-     * @return the newly-created composite
-     */
-    protected Composite createComposite(Composite parent, int numColumns) {
-        Composite composite = new Composite(parent, SWT.NULL);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = numColumns;
-        composite.setLayout(layout);
-        GridData data = new GridData();
-        data.verticalAlignment = GridData.FILL;
-        data.horizontalAlignment = GridData.FILL;
-        composite.setLayoutData(data);
-        return composite;
-    }
-
-    /** (non-Javadoc)
-     * Method declared on PreferencePage
-     */
-    public Control createContents(Composite parent) {
-
-        // ensure the page has no special buttons
-        noDefaultAndApplyButton();
-        Composite panel = createComposite(parent, 2);
-
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
-				IReadmeConstants.PROPERTY_PAGE_CONTEXT);
-
-        // layout the page
-
-        IResource resource = (IResource) getElement();
-        IStatus result = null;
-        if (resource.getType() == IResource.FILE) {
-            Label label = createLabel(panel, MessageUtil.getString("File_name")); //$NON-NLS-1$
-            label = createLabel(panel, resource.getName());
-            grabExcessSpace(label);
-
-            //
-            createLabel(panel, MessageUtil.getString("Path")); //$NON-NLS-1$
-            label = createLabel(panel, resource.getFullPath().setDevice(null)
-                    .toString());
-            grabExcessSpace(label);
-
-            //
-            createLabel(panel, MessageUtil.getString("Size")); //$NON-NLS-1$
-            InputStream contentStream = null;
-            try {
-                IFile file = (IFile) resource;
-                contentStream = file.getContents();
-                Reader in = new InputStreamReader(contentStream);
-                int chunkSize = contentStream.available();
-                StringBuffer buffer = new StringBuffer(chunkSize);
-                char[] readBuffer = new char[chunkSize];
-                int n = in.read(readBuffer);
-
-                while (n > 0) {
-                    buffer.append(readBuffer);
-                    n = in.read(readBuffer);
-                }
-
-                contentStream.close();
-                label = createLabel(panel, Integer.toString(buffer.length()));
-            } catch (CoreException e) {
-                result = e.getStatus();
-                String message = result.getMessage();
-                if (message == null)
-                    label = createLabel(panel, MessageUtil.getString("<Unknown>")); //$NON-NLS-1$
-                else
-                    label = createLabel(panel, message);
-            } catch (IOException e) {
-                label = createLabel(panel, MessageUtil.getString("<Unknown>")); //$NON-NLS-1$
-            } finally {
-                if (contentStream != null) {
-                    try {
-                        contentStream.close();
-                    } catch (IOException e) {
-                        // do nothing
-                    }
-                }
-            }
-            grabExcessSpace(label);
-            createLabel(panel, MessageUtil.getString("Number_of_sections")); //$NON-NLS-1$
-            // We will get the sections property and simply
-            // report number of elements found.
-            IAdaptable sections = getSections(resource);
-            if (sections instanceof AdaptableList) {
-                AdaptableList list = (AdaptableList) sections;
-                label = createLabel(panel, String.valueOf(list.size()));
-                grabExcessSpace(label);
-            }
-        }
-
-        //
-        Label label = createLabel(panel, MessageUtil
-                .getString("Additional_information")); //$NON-NLS-1$
-        grabExcessSpace(label);
-        GridData gd = (GridData) label.getLayoutData();
-        gd.horizontalSpan = 2;
-        return new Canvas(panel, 0);
-    }
-
-    /**
-     * Utility method that creates a new label and sets up its layout data.
-     *
-     * @param parent  the parent of the label
-     * @param text  the text of the label
-     * @return the newly-created label
-     */
-    protected Label createLabel(Composite parent, String text) {
-        Label label = new Label(parent, SWT.LEFT);
-        label.setText(text);
-        GridData data = new GridData();
-        data.horizontalAlignment = GridData.FILL;
-        label.setLayoutData(data);
-        return label;
-    }
-
-    /**
-     * Returns the readme sections for this resource, or null
-     * if not applicable (resource is not a readme file).
-     */
-    private AdaptableList getSections(IAdaptable adaptable) {
-        if (adaptable instanceof IFile)
-            return ReadmeModelFactory.getInstance().getSections(
-                    (IFile) adaptable);
-        return null;
-    }
-
-    /**
-     * Sets this control to grab any excess horizontal space
-     * left in the window.
-     *
-     * @param control  the control for which to grab excess space
-     */
-    private void grabExcessSpace(Control control) {
-        GridData gd = (GridData) control.getLayoutData();
-        if (gd != null) {
-            gd.grabExcessHorizontalSpace = true;
-        }
-    }
-
-    /** (non-Javadoc)
-     * Method declared on PreferencePage
-     */
-    public boolean performOk() {
-        // nothing to do - read-only page
-        return true;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeFilePropertyPage2.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeFilePropertyPage2.java
deleted file mode 100644
index dd2ee3a..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeFilePropertyPage2.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PropertyPage;
-
-/**
- * This page will be added to the property page dialog
- * when "Properties..." popup menu item is selected
- * for Readme files. 
- *
- * This page demonstrates conditional property pages which look
- * different depending on the state of the element. In this example,
- * the arbitrary condition chosen is whether the Readme file is
- * greater than 256 bytes in length. If it is smaller than 256 bytes
- * in length, this will be a placeholder page containing 
- * a simple message. If it is 256 bytes or larger, additional 
- * information will be provided. This information is determined at
- * runtime.
- *
- * This class may be reused to implement a conditional property page.
- * The getPageIndex() method tests the condition and returns the
- * index of the page to create. The createPage*() methods are called
- * upon to create the actual pages.
- */
-public class ReadmeFilePropertyPage2 extends PropertyPage {
-
-    /**
-     * Utility method that creates a new composite and
-     * sets up its layout data.
-     *
-     * @param parent  the parent of the composite
-     * @param numColumns  the number of columns in the new composite
-     * @return the newly-created composite
-     */
-    protected Composite createComposite(Composite parent, int numColumns) {
-        Composite composite = new Composite(parent, SWT.NULL);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = numColumns;
-        composite.setLayout(layout);
-        GridData data = new GridData();
-        data.verticalAlignment = GridData.FILL;
-        data.horizontalAlignment = GridData.FILL;
-        composite.setLayoutData(data);
-        return composite;
-    }
-
-    /** (non-Javadoc)
-     * Method declared on PreferencePage
-     */
-    public Control createContents(Composite parent) {
-        // ensure the page has no special buttons
-        noDefaultAndApplyButton();
-        Composite panel = createComposite(parent, 2);
-
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
-				IReadmeConstants.PROPERTY_PAGE2_CONTEXT);
-
-        // layout the page
-        int page = getPageIndex();
-        switch (page) {
-        case 1:
-            createPageOne(panel);
-            break;
-        case 2:
-            createPageTwo(panel);
-            break;
-        default:
-        }
-        return new Canvas(panel, 0);
-    }
-
-    /**
-     * Utility method that creates a new label and sets up
-     * its layout data.
-     *
-     * @param parent  the parent of the label
-     * @param text  the text of the label
-     * @return the newly-created label
-     */
-    protected Label createLabel(Composite parent, String text) {
-        Label label = new Label(parent, SWT.LEFT);
-        label.setText(text);
-        GridData data = new GridData();
-        data.horizontalAlignment = GridData.FILL;
-        label.setLayoutData(data);
-        return label;
-    }
-
-    /**
-     * Creates the first version of the page. This is a placeholder page which
-     * notified the user that the page is not available.
-     *
-     * @param panel  the panel in which to create the page
-     */
-    protected void createPageOne(Composite panel) {
-        Label l = createLabel(panel, MessageUtil
-                .getString("Additional_Readme_properties_not_available.")); //$NON-NLS-1$
-        GridData gd = (GridData) l.getLayoutData();
-        gd.horizontalSpan = 2;
-        gd.grabExcessHorizontalSpace = true;
-        l = createLabel(
-                panel,
-                MessageUtil
-                        .getString("This_illustrates_a_property_page_that_is_dynamically_determined")); //$NON-NLS-1$
-        gd = (GridData) l.getLayoutData();
-        gd.horizontalSpan = 2;
-        gd.grabExcessHorizontalSpace = true;
-        l = createLabel(
-                panel,
-                MessageUtil
-                        .getString("not_to_be_available_based_on_the_state_of_the_object.")); //$NON-NLS-1$
-        gd = (GridData) l.getLayoutData();
-        gd.horizontalSpan = 2;
-        gd.grabExcessHorizontalSpace = true;
-    }
-
-    /**
-     * Creates the second version of the page. This page might contain more information
-     * about the file or other information.
-     *
-     * @param panel  the panel in which to create the page
-     */
-    protected void createPageTwo(Composite panel) {
-        Label l = createLabel(
-                panel,
-                MessageUtil
-                        .getString("The_size_of_the_Readme_file_is_at_least_256_bytes.")); //$NON-NLS-1$
-        GridData gd = (GridData) l.getLayoutData();
-        gd.horizontalSpan = 2;
-        gd.grabExcessHorizontalSpace = true;
-        l = createLabel(
-                panel,
-                MessageUtil
-                        .getString("Had_it_been_less_than_256_bytes_this_page_would_be_a_placeholder_page.")); //$NON-NLS-1$
-        gd = (GridData) l.getLayoutData();
-        gd.horizontalSpan = 2;
-        gd.grabExcessHorizontalSpace = true;
-        l = createLabel(panel, MessageUtil.getString("Additional_information")); //$NON-NLS-1$
-        gd = (GridData) l.getLayoutData();
-        gd.horizontalSpan = 2;
-        gd.grabExcessHorizontalSpace = true;
-        l = createLabel(
-                panel,
-                MessageUtil
-                        .getString("This_illustrates_a_property_page_that_is_dynamically_determined")); //$NON-NLS-1$
-        gd = (GridData) l.getLayoutData();
-        gd.horizontalSpan = 2;
-        gd.grabExcessHorizontalSpace = true;
-        l = createLabel(panel, MessageUtil
-                .getString("to_be_available_based_on_the_state_of_the_object.")); //$NON-NLS-1$
-        gd = (GridData) l.getLayoutData();
-        gd.horizontalSpan = 2;
-        gd.grabExcessHorizontalSpace = true;
-    }
-
-    /**
-     * Returns which page to display. This implementation
-     * answers 1 if the size of the Readme file is less than 256 bytes
-     * and 2 otherwise.
-     *
-     * @return the index of the page to display
-     */
-    protected int getPageIndex() {
-        IResource resource = (IResource) getElement();
-
-        if (resource.getType() == IResource.FILE) {
-            InputStream contentStream = null;
-            int length = 0;
-            try {
-                IFile file = (IFile) resource;
-                contentStream = file.getContents();
-                Reader in = new InputStreamReader(contentStream);
-                int chunkSize = contentStream.available();
-                StringBuffer buffer = new StringBuffer(chunkSize);
-                char[] readBuffer = new char[chunkSize];
-                int n = in.read(readBuffer);
-
-                while (n > 0) {
-                    buffer.append(readBuffer);
-                    n = in.read(readBuffer);
-                }
-
-                contentStream.close();
-                length = buffer.length();
-            } catch (CoreException e) {
-                length = 0;
-            } catch (IOException e) {
-                // do nothing
-            } finally {
-                if (contentStream != null) {
-                    try {
-                        contentStream.close();
-                    } catch (IOException e) {
-                        // do nothing
-                    }
-                }
-            }
-
-            if (length < 256)
-                return 1;
-            return 2;
-        }
-
-        return 0;
-    }
-
-    /** (non-Javadoc)
-     * Method declared on PreferencePage
-     */
-    public boolean performOk() {
-        // nothing to do - read-only page
-        return true;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeImages.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeImages.java
deleted file mode 100644
index 8c1ce7a..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeImages.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Joe Bowbeer (jozart@blarg.net) - removed dependency on runtime compatibility layer (bug 74526)
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Convenience class for storing references to image descriptors
- * used by the readme tool.
- */
-public class ReadmeImages {
-    static final URL BASE_URL = ReadmePlugin.getDefault().getBundle().getEntry("/"); //$NON-NLS-1$
-
-    static final ImageDescriptor EDITOR_ACTION1_IMAGE;
-
-    static final ImageDescriptor EDITOR_ACTION2_IMAGE;
-
-    static final ImageDescriptor EDITOR_ACTION3_IMAGE;
-
-    static final ImageDescriptor EDITOR_ACTION1_IMAGE_DISABLE;
-
-    static final ImageDescriptor EDITOR_ACTION2_IMAGE_DISABLE;
-
-    static final ImageDescriptor EDITOR_ACTION3_IMAGE_DISABLE;
-
-    static final ImageDescriptor EDITOR_ACTION1_IMAGE_ENABLE;
-
-    static final ImageDescriptor EDITOR_ACTION2_IMAGE_ENABLE;
-
-    static final ImageDescriptor EDITOR_ACTION3_IMAGE_ENABLE;
-
-    static final ImageDescriptor README_WIZARD_BANNER;
-
-    static {
-        String iconPath = "icons/"; //$NON-NLS-1$
-
-        String prefix = iconPath + "ctool16/"; //$NON-NLS-1$
-        EDITOR_ACTION1_IMAGE = createImageDescriptor(prefix + "action1.gif"); //$NON-NLS-1$
-        EDITOR_ACTION2_IMAGE = createImageDescriptor(prefix + "action2.gif"); //$NON-NLS-1$
-        EDITOR_ACTION3_IMAGE = createImageDescriptor(prefix + "action3.gif"); //$NON-NLS-1$
-
-        prefix = iconPath + "dtool16/"; //$NON-NLS-1$
-        EDITOR_ACTION1_IMAGE_DISABLE = createImageDescriptor(prefix
-                + "action1.gif"); //$NON-NLS-1$
-        EDITOR_ACTION2_IMAGE_DISABLE = createImageDescriptor(prefix
-                + "action2.gif"); //$NON-NLS-1$
-        EDITOR_ACTION3_IMAGE_DISABLE = createImageDescriptor(prefix
-                + "action3.gif"); //$NON-NLS-1$
-
-        prefix = iconPath + "etool16/"; //$NON-NLS-1$
-        EDITOR_ACTION1_IMAGE_ENABLE = createImageDescriptor(prefix
-                + "action1.gif"); //$NON-NLS-1$
-        EDITOR_ACTION2_IMAGE_ENABLE = createImageDescriptor(prefix
-                + "action2.gif"); //$NON-NLS-1$
-        EDITOR_ACTION3_IMAGE_ENABLE = createImageDescriptor(prefix
-                + "action3.gif"); //$NON-NLS-1$
-
-        prefix = iconPath + "wizban/"; //$NON-NLS-1$
-        README_WIZARD_BANNER = createImageDescriptor(prefix
-                + "newreadme_wiz.gif"); //$NON-NLS-1$
-    }
-
-    /**
-     * Utility method to create an <code>ImageDescriptor</code>
-     * from a path to a file.
-     */
-    private static ImageDescriptor createImageDescriptor(String path) {
-        try {
-            URL url = new URL(BASE_URL, path);
-            return ImageDescriptor.createFromURL(url);
-        } catch (MalformedURLException e) {
-            // do nothing
-        }
-        return ImageDescriptor.getMissingImageDescriptor();
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeMarkerResolutionGenerator.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeMarkerResolutionGenerator.java
deleted file mode 100644
index 5bd3108..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeMarkerResolutionGenerator.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.IMarkerResolutionGenerator2;
-
-/**
- * Creates resolutions for readme markers.
- */
-public class ReadmeMarkerResolutionGenerator implements
-        IMarkerResolutionGenerator2 {
-
-    /* (non-Javadoc)
-     * Method declared on IMarkerResolutionGenerator.
-     */
-    public IMarkerResolution[] getResolutions(IMarker marker) {
-        return new IMarkerResolution[] { new AddSentenceResolution() };
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IMarkerResolutionGenerator2.
-     */
-    public boolean hasResolutions(IMarker marker) {
-        return true;
-    }
-
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeModelFactory.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeModelFactory.java
deleted file mode 100644
index 641735d..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeModelFactory.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Joe Bowbeer (jozart@blarg.net) - removed dependency on runtime compatibility layer (bug 74526)
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * Creates the sections used in the <code>ContentOutline</code>
- *
- * @see ReadmeContentOutlinePage#getContentOutline(IAdaptable)
- */
-public class ReadmeModelFactory {
-    private static ReadmeModelFactory instance = new ReadmeModelFactory();
-
-    private boolean registryLoaded = false;
-
-    IReadmeFileParser parser = null;
-
-    /**
-     * Creates a new ReadmeModelFactory.
-     */
-    private ReadmeModelFactory() {
-        // do nothing
-    }
-
-    /**
-     * Adds all mark elements to the list for the subtree rooted
-     * at the given mark element.
-     */
-    protected void addSections(AdaptableList list, MarkElement element) {
-        list.add(element);
-        Object[] children = element.getChildren(element);
-        for (int i = 0; i < children.length; ++i) {
-            addSections(list, (MarkElement) children[i]);
-        }
-    }
-
-    /**
-     * Returns the content outline for the given Readme file.
-     *
-     * @param adaptable  the element for which to return the content outline
-     * @return the content outline for the argument
-     */
-    public AdaptableList getContentOutline(IAdaptable adaptable) {
-        return new AdaptableList(getToc((IFile) adaptable));
-    }
-
-    /**
-     * Returns the singleton readme adapter.
-     */
-    public static ReadmeModelFactory getInstance() {
-        return instance;
-    }
-
-    /**
-     * Returns a list of all sections in this readme file.
-     *
-     * @param file  the file for which to return section heading and subheadings
-     * @return A list containing headings and subheadings
-     */
-    public AdaptableList getSections(IFile file) {
-        MarkElement[] topLevel = getToc(file);
-        AdaptableList list = new AdaptableList();
-        for (int i = 0; i < topLevel.length; i++) {
-            addSections(list, topLevel[i]);
-        }
-        return list;
-    }
-
-    /**
-     * Convenience method.  Looks for a readme file in the selection,
-     * and if one is found, returns the sections for it.  Returns null
-     * if there is no readme file in the selection.
-     */
-    public AdaptableList getSections(ISelection sel) {
-        // If sel is not a structured selection just return.
-        if (!(sel instanceof IStructuredSelection))
-            return null;
-        IStructuredSelection structured = (IStructuredSelection) sel;
-
-        //if the selection is a readme file, get its sections.
-        Object object = structured.getFirstElement();
-        if (object instanceof IFile) {
-            IFile file = (IFile) object;
-            String extension = file.getFileExtension();
-            if (extension != null
-                    && extension.equals(IReadmeConstants.EXTENSION)) {
-                return getSections(file);
-            }
-        }
-
-        //the selected object is not a readme file
-        return null;
-    }
-
-    /**
-     * Parses the contents of the Readme file by looking for lines 
-     * that start with a number.
-     *
-     * @param file  the file representing the Readme file
-     * @return an element collection representing the table of contents
-     */
-    private MarkElement[] getToc(IFile file) {
-        if (registryLoaded == false)
-            loadParser();
-        return parser.parse(file);
-    }
-
-    /**
-     * Loads the parser from the registry by searching for
-     * extensions that satisfy our published extension point.
-     * For the sake of simplicity, we will pick the last extension,
-     * allowing tools to override what is used. In a more
-     * elaborate tool, all the extensions would be processed.
-     */
-    private void loadParser() {
-        IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(
-                IReadmeConstants.PLUGIN_ID, IReadmeConstants.PP_SECTION_PARSER);
-        if (point != null) {
-            IExtension[] extensions = point.getExtensions();
-            for (int i = 0; i < extensions.length; i++) {
-                IExtension currentExtension = extensions[i];
-                // in a real application, we would collection
-                // the entire list and probably expose it
-                // as a drop-down list. For the sake
-                // of simplicity, we will pick the last extension only.
-                if (i == extensions.length - 1) {
-                    IConfigurationElement[] configElements = currentExtension
-                            .getConfigurationElements();
-                    for (int j = 0; j < configElements.length; j++) {
-                        IConfigurationElement config = configElements[i];
-                        if (config.getName()
-                                .equals(IReadmeConstants.TAG_PARSER)) {
-                            // process the first 'parser' element and stop
-                            processParserElement(config);
-                            break;
-                        }
-                    }
-                }
-            }
-        }
-        if (parser == null)
-            parser = new DefaultSectionsParser();
-        registryLoaded = true;
-    }
-
-    /**
-     * Tries to create the Readme file parser. If an error occurs during
-     * the creation of the parser, print an error and set the parser
-     * to null.
-     *
-     * @param element  the element to process
-     */
-    private void processParserElement(IConfigurationElement element) {
-        try {
-            parser = (IReadmeFileParser) element
-                    .createExecutableExtension(IReadmeConstants.ATT_CLASS);
-        } catch (CoreException e) {
-            // since this is an example just write to the console
-            System.out
-                    .println(MessageUtil
-                            .getString("Unable_to_create_file_parser") + e.getStatus().getMessage()); //$NON-NLS-1$
-            parser = null;
-        }
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmePlugin.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmePlugin.java
deleted file mode 100644
index 6c67f57..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmePlugin.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Joe Bowbeer (jozart@blarg.net) - removed dependency on runtime compatibility layer (bug 74528)
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * This is the top-level class of the Readme plugin tool.
- *
- * @see AbstractUIPlugin for additional information on UI plugins
- */
-public class ReadmePlugin extends AbstractUIPlugin {
-    
-    public static final String PLUGIN_ID = "org.eclipse.ui.examples.readmetool"; //$NON-NLS-1$
-    
-    /**
-     * Default instance of the receiver
-     */ 
-    private static ReadmePlugin inst;
-
-    /**
-     * Creates the Readme plugin and caches its default instance
-     */
-    public ReadmePlugin() {
-        if (inst == null)
-            inst = this;
-    }
-
-    /**
-     * Gets the plugin singleton.
-     *
-     * @return the default ReadmePlugin instance
-     */
-    static public ReadmePlugin getDefault() {
-        return inst;
-    }
-
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmePreferenceInitializer.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmePreferenceInitializer.java
deleted file mode 100644
index 6df33ad..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmePreferenceInitializer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Initializes the preferences for the readme plug-in.
- * 
- * @since 3.0
- */
-public class ReadmePreferenceInitializer extends AbstractPreferenceInitializer {
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-     */
-    public void initializeDefaultPreferences() {
-        // These settings will show up when the Readme preference page
-        // is shown for the first time.
-        IPreferenceStore store = ReadmePlugin.getDefault().getPreferenceStore();
-        store.setDefault(IReadmeConstants.PRE_CHECK1, true);
-        store.setDefault(IReadmeConstants.PRE_CHECK2, true);
-        store.setDefault(IReadmeConstants.PRE_CHECK3, false);
-        store.setDefault(IReadmeConstants.PRE_RADIO_CHOICE, 2);
-        store.setDefault(IReadmeConstants.PRE_TEXT, MessageUtil
-                .getString("Default_text")); //$NON-NLS-1$
-    }
-
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmePreferencePage.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmePreferencePage.java
deleted file mode 100644
index ba8d286..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmePreferencePage.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-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.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This class implements a sample preference page that is 
- * added to the preference dialog based on the registration.
- */
-public class ReadmePreferencePage extends PreferencePage implements
-        IWorkbenchPreferencePage, SelectionListener, ModifyListener {
-    private Button radioButton1;
-
-    private Button radioButton2;
-
-    private Button radioButton3;
-
-    private Button checkBox1;
-
-    private Button checkBox2;
-
-    private Button checkBox3;
-
-    private Text textField;
-
-    /**
-     * Creates an new checkbox instance and sets the default
-     * layout data.
-     *
-     * @param group  the composite in which to create the checkbox
-     * @param label  the string to set into the checkbox
-     * @return the new checkbox
-     */
-    private Button createCheckBox(Composite group, String label) {
-        Button button = new Button(group, SWT.CHECK | SWT.LEFT);
-        button.setText(label);
-        button.addSelectionListener(this);
-        GridData data = new GridData();
-        button.setLayoutData(data);
-        return button;
-    }
-
-    /**
-     * Creates composite control and sets the default layout data.
-     *
-     * @param parent  the parent of the new composite
-     * @param numColumns  the number of columns for the new composite
-     * @return the newly-created coposite
-     */
-    private Composite createComposite(Composite parent, int numColumns) {
-        Composite composite = new Composite(parent, SWT.NULL);
-
-        //GridLayout
-        GridLayout layout = new GridLayout();
-        layout.numColumns = numColumns;
-        composite.setLayout(layout);
-
-        //GridData
-        GridData data = new GridData();
-        data.verticalAlignment = GridData.FILL;
-        data.horizontalAlignment = GridData.FILL;
-        composite.setLayoutData(data);
-        return composite;
-    }
-
-    /** (non-Javadoc)
-     * Method declared on PreferencePage
-     */
-    protected Control createContents(Composite parent) {
-    	PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
-				IReadmeConstants.PREFERENCE_PAGE_CONTEXT);
-
-        //composite_textField << parent
-        Composite composite_textField = createComposite(parent, 2);
-        createLabel(composite_textField, MessageUtil.getString("Text_Field")); //$NON-NLS-1$
-        textField = createTextField(composite_textField);
-        createPushButton(composite_textField, MessageUtil.getString("Change")); //$NON-NLS-1$
-
-        //composite_tab << parent
-        Composite composite_tab = createComposite(parent, 2);
-        createLabel(composite_tab, MessageUtil
-                .getString("Radio_Button_Options")); //$NON-NLS-1$
-
-        //
-        tabForward(composite_tab);
-        //radio button composite << tab composite
-        Composite composite_radioButton = createComposite(composite_tab, 1);
-        radioButton1 = createRadioButton(composite_radioButton, MessageUtil
-                .getString("Radio_button_1")); //$NON-NLS-1$
-        radioButton2 = createRadioButton(composite_radioButton, MessageUtil
-                .getString("Radio_button_2")); //$NON-NLS-1$
-        radioButton3 = createRadioButton(composite_radioButton, MessageUtil
-                .getString("Radio_button_3")); //$NON-NLS-1$
-
-        //composite_tab2 << parent
-        Composite composite_tab2 = createComposite(parent, 2);
-        createLabel(composite_tab2, MessageUtil.getString("Check_Box_Options")); //$NON-NLS-1$
-
-        //
-        tabForward(composite_tab2);
-        //composite_checkBox << composite_tab2
-        Composite composite_checkBox = createComposite(composite_tab2, 1);
-        checkBox1 = createCheckBox(composite_checkBox, MessageUtil
-                .getString("Check_box_1")); //$NON-NLS-1$
-        checkBox2 = createCheckBox(composite_checkBox, MessageUtil
-                .getString("Check_box_2")); //$NON-NLS-1$
-        checkBox3 = createCheckBox(composite_checkBox, MessageUtil
-                .getString("Check_box_3")); //$NON-NLS-1$
-
-        initializeValues();
-
-        //font = null;
-        return new Composite(parent, SWT.NULL);
-    }
-
-    /**
-     * Utility method that creates a label instance
-     * and sets the default layout data.
-     *
-     * @param parent  the parent for the new label
-     * @param text  the text for the new label
-     * @return the new label
-     */
-    private Label createLabel(Composite parent, String text) {
-        Label label = new Label(parent, SWT.LEFT);
-        label.setText(text);
-        GridData data = new GridData();
-        data.horizontalSpan = 2;
-        data.horizontalAlignment = GridData.FILL;
-        label.setLayoutData(data);
-        return label;
-    }
-
-    /**
-     * Utility method that creates a push button instance
-     * and sets the default layout data.
-     *
-     * @param parent  the parent for the new button
-     * @param label  the label for the new button
-     * @return the newly-created button
-     */
-    private Button createPushButton(Composite parent, String label) {
-        Button button = new Button(parent, SWT.PUSH);
-        button.setText(label);
-        button.addSelectionListener(this);
-        GridData data = new GridData();
-        data.horizontalAlignment = GridData.FILL;
-        button.setLayoutData(data);
-        return button;
-    }
-
-    /**
-     * Utility method that creates a radio button instance
-     * and sets the default layout data.
-     *
-     * @param parent  the parent for the new button
-     * @param label  the label for the new button
-     * @return the newly-created button
-     */
-    private Button createRadioButton(Composite parent, String label) {
-        Button button = new Button(parent, SWT.RADIO | SWT.LEFT);
-        button.setText(label);
-        button.addSelectionListener(this);
-        GridData data = new GridData();
-        button.setLayoutData(data);
-        return button;
-    }
-
-    /**
-     * Create a text field specific for this application
-     *
-     * @param parent  the parent of the new text field
-     * @return the new text field
-     */
-    private Text createTextField(Composite parent) {
-        Text text = new Text(parent, SWT.SINGLE | SWT.BORDER);
-        text.addModifyListener(this);
-        GridData data = new GridData();
-        data.horizontalAlignment = GridData.FILL;
-        data.grabExcessHorizontalSpace = true;
-        data.verticalAlignment = GridData.CENTER;
-        data.grabExcessVerticalSpace = false;
-        text.setLayoutData(data);
-        return text;
-    }
-
-    /** 
-     * The <code>ReadmePreferencePage</code> implementation of this
-     * <code>PreferencePage</code> method 
-     * returns preference store that belongs to the our plugin.
-     * This is important because we want to store
-     * our preferences separately from the workbench.
-     */
-    protected IPreferenceStore doGetPreferenceStore() {
-        return ReadmePlugin.getDefault().getPreferenceStore();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchPreferencePage
-     */
-    public void init(IWorkbench workbench) {
-        // do nothing
-    }
-
-    /**
-     * Initializes states of the controls using default values
-     * in the preference store.
-     */
-    private void initializeDefaults() {
-        IPreferenceStore store = getPreferenceStore();
-        checkBox1.setSelection(store
-                .getDefaultBoolean(IReadmeConstants.PRE_CHECK1));
-        checkBox2.setSelection(store
-                .getDefaultBoolean(IReadmeConstants.PRE_CHECK2));
-        checkBox3.setSelection(store
-                .getDefaultBoolean(IReadmeConstants.PRE_CHECK3));
-
-        radioButton1.setSelection(false);
-        radioButton2.setSelection(false);
-        radioButton3.setSelection(false);
-        int choice = store.getDefaultInt(IReadmeConstants.PRE_RADIO_CHOICE);
-        switch (choice) {
-        case 1:
-            radioButton1.setSelection(true);
-            break;
-        case 2:
-            radioButton2.setSelection(true);
-            break;
-        case 3:
-            radioButton3.setSelection(true);
-            break;
-        }
-        textField.setText(store.getDefaultString(IReadmeConstants.PRE_TEXT));
-    }
-
-    /**
-     * Initializes states of the controls from the preference store.
-     */
-    private void initializeValues() {
-        IPreferenceStore store = getPreferenceStore();
-        checkBox1.setSelection(store.getBoolean(IReadmeConstants.PRE_CHECK1));
-        checkBox2.setSelection(store.getBoolean(IReadmeConstants.PRE_CHECK2));
-        checkBox3.setSelection(store.getBoolean(IReadmeConstants.PRE_CHECK3));
-
-        int choice = store.getInt(IReadmeConstants.PRE_RADIO_CHOICE);
-        switch (choice) {
-        case 1:
-            radioButton1.setSelection(true);
-            break;
-        case 2:
-            radioButton2.setSelection(true);
-            break;
-        case 3:
-            radioButton3.setSelection(true);
-            break;
-        }
-        textField.setText(store.getString(IReadmeConstants.PRE_TEXT));
-    }
-
-    /** (non-Javadoc)
-     * Method declared on ModifyListener
-     */
-    public void modifyText(ModifyEvent event) {
-        //Do nothing on a modification in this example
-    }
-
-    /* (non-Javadoc)
-     * Method declared on PreferencePage
-     */
-    protected void performDefaults() {
-        super.performDefaults();
-        initializeDefaults();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on PreferencePage
-     */
-    public boolean performOk() {
-        storeValues();
-        ReadmePlugin.getDefault().savePluginPreferences();
-        return true;
-    }
-
-    /**
-     * Stores the values of the controls back to the preference store.
-     */
-    private void storeValues() {
-        IPreferenceStore store = getPreferenceStore();
-        store.setValue(IReadmeConstants.PRE_CHECK1, checkBox1.getSelection());
-        store.setValue(IReadmeConstants.PRE_CHECK2, checkBox2.getSelection());
-        store.setValue(IReadmeConstants.PRE_CHECK3, checkBox3.getSelection());
-
-        int choice = 1;
-
-        if (radioButton2.getSelection())
-            choice = 2;
-        else if (radioButton3.getSelection())
-            choice = 3;
-
-        store.setValue(IReadmeConstants.PRE_RADIO_CHOICE, choice);
-        store.setValue(IReadmeConstants.PRE_TEXT, textField.getText());
-    }
-
-    /**
-     * Creates a tab of one horizontal spans.
-     *
-     * @param parent  the parent in which the tab should be created
-     */
-    private void tabForward(Composite parent) {
-        Label vfiller = new Label(parent, SWT.LEFT);
-        GridData gridData = new GridData();
-        gridData = new GridData();
-        gridData.horizontalAlignment = GridData.BEGINNING;
-        gridData.grabExcessHorizontalSpace = false;
-        gridData.verticalAlignment = GridData.CENTER;
-        gridData.grabExcessVerticalSpace = false;
-        vfiller.setLayoutData(gridData);
-    }
-
-    /** (non-Javadoc)
-     * Method declared on SelectionListener
-     */
-    public void widgetDefaultSelected(SelectionEvent event) {
-        //Handle a default selection. Do nothing in this example
-    }
-
-    /** (non-Javadoc)
-     * Method declared on SelectionListener
-     */
-    public void widgetSelected(SelectionEvent event) {
-        //Do nothing on selection in this example;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeSectionsView.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeSectionsView.java
deleted file mode 100644
index 249ee5a..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ReadmeSectionsView.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * This class demonstrates a simple view containing a single viewer.
- */
-public class ReadmeSectionsView extends ViewPart implements ISelectionListener {
-    ListViewer viewer;
-
-    /**
-     * Creates a new ReadmeSectionsView .
-     */
-    public ReadmeSectionsView() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchPart
-     */
-    public void createPartControl(Composite parent) {
-        viewer = new ListViewer(parent);
-
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(),
-				IReadmeConstants.SECTIONS_VIEW_CONTEXT);
-
-        // if the objects in the viewer implement IWorkbenchAdapter,
-        // these generic content and label providers can be used.
-        viewer.setContentProvider(new WorkbenchContentProvider());
-        viewer.setLabelProvider(new WorkbenchLabelProvider());
-
-        // add myself as a global selection listener
-        getSite().getPage().addSelectionListener(this);
-
-        // prime the selection
-        selectionChanged(null, getSite().getPage().getSelection());
-    }
-
-    /**
-     * The <code>ReadmeSectionView</code> implementation of this 
-     * <code>IWorkbenchPart</code> method runs super
-     * and removes itself from the global selection listener. 
-     */
-    public void dispose() {
-        super.dispose();
-        getSite().getPage().removeSelectionListener(this);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ISelectionListener
-     */
-    public void selectionChanged(IWorkbenchPart part, ISelection sel) {
-        //if the selection is a readme file, get its sections.
-        AdaptableList input = ReadmeModelFactory.getInstance().getSections(sel);
-        viewer.setInput(input);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchPart
-     */
-    public void setFocus() {
-        viewer.getControl().setFocus();
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/SectionsDialog.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/SectionsDialog.java
deleted file mode 100644
index 670bdb5..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/SectionsDialog.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ListViewer;
-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.List;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * This dialog is an example of a detached window launched
- * from an action in the workbench.
- */
-public class SectionsDialog extends Dialog {
-    protected IAdaptable input;
-
-    /**
-     * Creates a new SectionsDialog.
-     */
-    public SectionsDialog(Shell parentShell, IAdaptable input) {
-        super(parentShell);
-        this.input = input;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Window.
-     */
-    protected void configureShell(Shell newShell) {
-        super.configureShell(newShell);
-        newShell.setText(MessageUtil.getString("Readme_Sections")); //$NON-NLS-1$
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell,
-				IReadmeConstants.SECTIONS_DIALOG_CONTEXT);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Dialog
-     */
-    protected Control createDialogArea(Composite parent) {
-        Composite composite = (Composite) super.createDialogArea(parent);
-
-        List list = new List(composite, SWT.BORDER);
-        GridData data = new GridData(GridData.FILL_BOTH);
-        list.setLayoutData(data);
-        ListViewer viewer = new ListViewer(list);
-        viewer.setContentProvider(new WorkbenchContentProvider());
-        viewer.setLabelProvider(new WorkbenchLabelProvider());
-        viewer.setInput(input);
-
-        return composite;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ViewActionDelegate.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ViewActionDelegate.java
deleted file mode 100644
index a0ba8ad..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/ViewActionDelegate.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * This class is used to demonstrate view action extensions.
- * An extension should be defined in the readme plugin.xml.
- */
-public class ViewActionDelegate implements IViewActionDelegate {
-    public IViewPart view;
-
-    /**
-     * Creates a new ViewActionDelegate.
-     */
-    public ViewActionDelegate() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IViewActionDelegate
-     */
-    public void init(IViewPart view) {
-        this.view = view;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IActionDelegate
-     */
-    public void run(org.eclipse.jface.action.IAction action) {
-        MessageDialog.openInformation(view.getSite().getShell(), MessageUtil
-                .getString("Readme_Editor"), //$NON-NLS-1$
-                MessageUtil.getString("View_Action_executed")); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IActionDelegate
-     */
-    public void selectionChanged(org.eclipse.jface.action.IAction action,
-            org.eclipse.jface.viewers.ISelection selection) {
-        // do nothing
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/WindowActionDelegate.java b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/WindowActionDelegate.java
deleted file mode 100644
index 7438d70..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/WindowActionDelegate.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.readmetool;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-/**
- * This class shows how <code>IActionDelegate</code> implementations
- * should be used for global action registration for menu 
- * and tool bars. Action proxy object is created in the 
- * workbench based on presentation information in the plugin.xml
- * file. Delegate is not loaded until the first time the user
- * presses the button or selects the menu. Based on the action
- * availability, it is possible that the button will disable
- * instead of executing.
- */
-public class WindowActionDelegate implements IWorkbenchWindowActionDelegate {
-    private IWorkbenchWindow window;
-
-    private ISelection selection;
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchActionDelegate
-     */
-    public void dispose() {
-        // do nothing
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchActionDelegate
-     */
-    public void init(IWorkbenchWindow window) {
-        this.window = window;
-    }
-
-    /** 
-     * The <code>WindowActionDelegate</code> implementation of this
-     * <code>IActionDelegate</code> method 
-     * launches a stand-alone dialog that contains a list of sections for
-     * the selected readme file in the navigator.
-     */
-    public void run(IAction action) {
-        SectionsDialog dialog = new SectionsDialog(window.getShell(),
-                ReadmeModelFactory.getInstance().getSections(selection));
-        dialog.open();
-    }
-
-    /** 
-     * The <code>WindowActionDelegate</code> implementation of this
-     * <code>IActionDelegate</code> method 
-     * does nothing - we will let simple rules in the XML
-     * config file react to selections.
-     */
-    public void selectionChanged(IAction action, ISelection selection) {
-        this.selection = selection;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/messages.properties b/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/messages.properties
deleted file mode 100644
index fb11559..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/Eclipse UI Examples Readme Tool/org/eclipse/ui/examples/readmetool/messages.properties
+++ /dev/null
@@ -1,96 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Add=&Add
-Clean=Clean
-Save_Needed=Save Needed
-Editor_Action_executed=Editor Action executed
-Readme_Editor=Readme Editor
-Readme_Outline=Readme Outline
-Line_count=Line count
-Title_length=Title length
-Title_start=Title start
-Popup_Menu_Action_executed=Popup Menu Action executed
-Readme_Example=Readme Example
-Automatic_sample_section_generation=Automatic sample section generation
-Create_Readme_File=Create Readme File
-Create_a_new_Readme_file_resource=Create a new Readme file resource.
-Generate_sample_section_titles=&Generate sample section titles
-Generate_sample_subsection_titles=Generate sample subsection &titles
-Open_file_for_editing_when_done=&Open file for editing when done
-Readme_file_name=&Readme file name:
-SAMPLE_README_FILE=\n\n     SAMPLE README FILE\n\n
-SECTION_1=1. SECTION 1\n
-SECTION_1_BODY_1=This text is a placeholder for the section body.\n
-SECTION_2=2. SECTION 2\n
-SECTION_2_BODY_1=This text is a placeholder for the section body. It is\n
-SECTION_2_BODY_2=a bit longer in order to span two lines.\n
-Subsection_1_1=\ \ \ 1.1 Subsection\n
-Subsection_1_1_Body_1=\ \ \ This text is a placeholder for the subsection body\n
-Subsection_2_1=\ \ \ 2.1 Subsection\n
-Subsection_2_1_BODY_1=\ \ \ This text is a placeholder for the subsection body\n
-Subsection_2_2=\ \ \ 2.2 Subsection\n
-Subsection_2_2_BODY_1=\ \ \ This text is a placeholder for the subsection body\n
-New_Readme_File=New Readme File
-Exception_in_readme_drop_adapter=Exception in readme drop adapter: 
-Editor_Action1=Editor Action &1
-Editor_Action2=Editor Action &2
-Editor_Action3=Editor Action &3
-Editor_Action4=Editor Action &4
-Editor_Action5=Editor Action &5
-Outline_Action2=Outline Action &2
-Outline_Action3=Outline Action &3
-Outline_Action4=Outline Action &4
-Outline_Action5=Outline Action &5
-Editor_is_active=Editor is active
-Empty_Editor_Name=Empty
-Readme_Editor_Action1=Readme Editor Action 1
-Readme_Editor_Action2=Readme Retarget Editor Action 2
-Readme_Editor_Action3=Readme Label Retarget Editor Action 3
-Readme_Editor_Action5=Readme Label Retarget Editor Action 5
-Readme_Outline_Action3=Readme Label Retarget Outline Action 3
-Readme_Outline_Action5=Readme Label Retarget Outline Action 5
-Readme_Menu=&Readme
-ReadmeEditorActionExecuted=Readme Editor Action executed: {0} for: {1}
-ReadmeOutlineActionExecuted=Readme Outline Action executed
-<Unknown>=<Unknown>
-<file_contents_not_local>=<file contents not local>
-Additional_information=Additional information about the Readme file can go here.
-File_name=File name:
-Number_of_sections=Number of sections:
-Path=Path: 
-Size=Size: 
-Additional_Readme_properties_not_available.=Additional Readme properties not available.
-Had_it_been_less_than_256_bytes_this_page_would_be_a_placeholder_page.=Had it been less than 256 bytes, this page would be a placeholder page.
-The_size_of_the_Readme_file_is_at_least_256_bytes.=The size of the Readme file is at least 256 bytes.
-This_illustrates_a_property_page_that_is_dynamically_determined=This illustrates a property page that is dynamically determined
-not_to_be_available_based_on_the_state_of_the_object.=not to be available based on the state of the object.
-to_be_available_based_on_the_state_of_the_object.=to be available based on the state of the object.
-Unable_to_create_file_parser=Unable to create file parser.
-Default_text=Default text
-Change=Chan&ge
-Check_Box_Options=Check Box Options
-Check_box_1=&Check box 1
-Check_box_2=C&heck box 2
-Check_box_3=Check bo&x 3
-Radio_Button_Options=Radio Button Options
-Radio_button_1=&Radio button 1
-Radio_button_2=Rad&io button 2
-Radio_button_3=Radio b&utton 3
-Text_Field=&Text Field
-Readme_Sections=Readme Sections
-View_Action_executed=View Action executed
-Add_Sentence=Add Sentence
-Resolution_Error=Resolution Error
-Unable_to_open_file_editor=Unable to open file editor
-Simple_sentence=This is a simple sentence.\n
-Readme_marker_message_example=Readme marker example 
-Add_readme_marker_action_label=Readme Marker Example &
-View_Command_executed=View Command executed
diff --git a/examples/org.eclipse.ui.examples.readmetool/HelpContexts.xml b/examples/org.eclipse.ui.examples.readmetool/HelpContexts.xml
deleted file mode 100644
index bf2b580..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/HelpContexts.xml
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<contexts>
-
-   <context  id="open_browser_action_context" >
-      <description>Opens the readme browser </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 3 - Temporary"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 4 - Temporary"/>
-   </context>
-   <context  id="view_action_context" >
-      <description>Runs a readme view action <b>Help</b> </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 3 - Temporary"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 4 - Temporary"/>
-   </context>
-   <context  id="editor_action_context" >
-      <description>Runs a readme editor action <b>Help</b> </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 3 - Temporary"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 4 - Temporary"/>
-   </context>
-   <context  id="editor_action1_context" >
-      <description>Runs readme editor action 1 <b>Help</b> </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 3 - Temporary"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 4 - Temporary"/>
-   </context>
-   <context  id="editor_action2_context" >
-      <description>Runs readme editor action 2 <b>Help</b> </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 3 - Temporary"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 4 - Temporary"/>
-   </context>
-   <context  id="editor_action3_context" >
-      <description>Runs readme editor action 3 <b>Help</b> </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 3 - Temporary"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 4 - Temporary"/>
-   </context>
-
-   <context  id="sections_view_context" >
-      <description>Readme sections view <b>Help</b> </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 3 - Temporary"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 4 - Temporary"/>
-   </context>
-
-   <context  id="sections_dialog_context" >
-      <description>Readme sections dialog <b>Help</b> </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 3 - Temporary"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 4 - Temporary"/>
-   </context>
-
-   <context  id="preference_page_context" >
-      <description>Readme preference page <b>Help</b> </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 3 - Temporary"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 4 - Temporary"/>
-   </context>
-
-   <context  id="property_page_context" >
-      <description>Readme property page <b>Help</b> </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 3 - Temporary"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 4 - Temporary"/>
-   </context>
-   <context  id="property_page2_context" >
-      <description>Readme property page2 <b>Help</b> </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 3 - Temporary"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 4 - Temporary"/>
-   </context>
-
-   <context  id="editor_context" >
-      <description>Readme editor <b>Help</b> </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 3 - Temporary"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 4 - Temporary"/>
-   </context>
-
-   <context  id="content_outline_page_context" >
-      <description>Readme editor content outline <b>Help</b> </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 3 - Temporary"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 4 - Temporary"/>
-   </context>
-
-   <context  id="creation_wizard_page_context" >
-      <description>Readme file creation wizard <b>Help</b> </description>
-      <topic href="contexts/RelatedContext3.html"  label="Help Related Topic 3 - Temporary"/>
-      <topic href="contexts/RelatedContext4.html"  label="Help Related Topic 4 - Temporary"/>
-   </context>
-
-   <context  id="marker_example1_context" >
-      <description>Readme marker example 1 <b>Help</b> id = 1234 </description>
-   </context>
-   <context  id="marker_example2_context" >
-      <description>Readme marker example 2 <b>Help</b> level = 7 </description>
-   </context>
-   <context  id="marker_example3_context" >
-      <description>Readme marker example 3 <b>Help</b> level = 7, department = infra </description>
-   </context>
-   <context  id="marker_example4_context" >
-      <description>Readme marker example 4 <b>Help</b> code = red </description>
-   </context>
-   <context  id="marker_example5_context" >
-      <description>Readme marker example 5 <b>Help</b> language = english </description>
-   </context>
-   <context  id="marker_example6_context" >
-      <description>Readme marker example 6 <b>Help</b> id = 1234, level = 7, department = infra, code = red, language = english </description>
-   </context>
-   <context  id="marker_example7_context" >
-      <description>Readme marker example 7 <b>Help</b> No attributes specified </description>
-   </context>
-</contexts>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.readmetool/META-INF/MANIFEST.MF b/examples/org.eclipse.ui.examples.readmetool/META-INF/MANIFEST.MF
deleted file mode 100644
index 90fbb5f..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui.examples.readmetool; singleton:=true
-Bundle-Version: 3.3.0.qualifier
-Bundle-ClassPath: readmetool.jar
-Bundle-Activator: org.eclipse.ui.examples.readmetool.ReadmePlugin
-Bundle-Vendor: %Plugin.providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.ui.views,
- org.eclipse.ui.ide,
- org.eclipse.jface.text,
- org.eclipse.text,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.ui.editors
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.ui.examples.readmetool
diff --git a/examples/org.eclipse.ui.examples.readmetool/about.html b/examples/org.eclipse.ui.examples.readmetool/about.html
deleted file mode 100644
index 4602330..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.readmetool/build.properties b/examples/org.eclipse.ui.examples.readmetool/build.properties
deleted file mode 100644
index e23fed7..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/build.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.readmetool.jar = Eclipse UI Examples Readme Tool/
-
-bin.includes = doc/,\
-               doc-html/,\
-               icons/,\
-               about.html,\
-               doc.zip,\
-               HelpContexts.xml,\
-               plugin.properties,\
-               plugin.xml,\
-               *.jar,\
-               META-INF/
-
-src.includes = about.html
diff --git a/examples/org.eclipse.ui.examples.readmetool/doc-html/hglegal.htm b/examples/org.eclipse.ui.examples.readmetool/doc-html/hglegal.htm
deleted file mode 100644
index a41081e..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/doc-html/hglegal.htm
+++ /dev/null
@@ -1,15 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
-   <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/examples/org.eclipse.ui.examples.readmetool/doc-html/ui_readmetool_ex.html b/examples/org.eclipse.ui.examples.readmetool/doc-html/ui_readmetool_ex.html
deleted file mode 100644
index e624f8b..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/doc-html/ui_readmetool_ex.html
+++ /dev/null
@@ -1,166 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0//en">
-<html>
-<head>
-<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>Workbench - Readme Tool Example</title>
-</head>
-<body>
-
-<h2>
-<b>Example - Readme Tool</b></h2>
-
-<h3>
-Introduction</h3>
-The Readme editor shows how to define your own extension points for use
-by other plugins. It also shows how to create extensions for resource popup
-menu entries, new resource wizards, file editors on an extension (.readme),
-a custom view and property pages.
-<h3>
-Running the example</h3>
-To start using this example create a file with the .readme extension using
-the file creation wizard or create one using the example creation wizard.
-The additional&nbsp; view provided by this example can be seen by selecting
-Window > Show View > Other and expanding the Readme section. The
-view action can be seen by clicking on the readme icon on the Navigator
-View.
-<h4>
-Creating a new readme file</h4>
-Create a new file with file extension .readme.&nbsp; From the File menu,
-select New and then select Other... from the sub menu.&nbsp; Click on Simple
-in the wizard, then select File in the list on the left.&nbsp; Click on
-Next to supply the file name (make sure the extension is .readme) and the
-folder in which the file should be contained.
-<h4>
-Example creation wizards</h4>
-From the File menu, select New and from the sub menu select Example...&nbsp;
-Now select Example Creation Wizards. Select Readme File. Click Next. Select
-the folder in which you want the file to be created. Type the name of the
-file with a .readme extension. Click Finish.
-<h4>
-Readme view extension action</h4>
-In the Navigator View, select a file with extension .readme. If there isn't
-one create a file with that extension. On the local toolbar of the Navigator
-View, you will see a button whose hover help says Run Readme View Extension.&nbsp;
-Click on this button.&nbsp; A dialog will popup saying View Action executed.
-<h4>
-Popup menus</h4>
-In the Navigator View, select a file with extension .readme.&nbsp; If there
-isn't one create a file with that extension.&nbsp; Select the file to bring
-up the popup menu.&nbsp; Notice there is a menu item that says Show Readme
-Action in the popup menu.&nbsp; Choose this menu item to open a dialog
-that says Popup Menu Action Executed.
-<h4>
-Preference page</h4>
-From the Window menu, select Preferences.&nbsp; Click on the page called
-Readme Example.&nbsp; This shows an example of a preference page.
-<h4>
-Property page</h4>
-In the Navigator View, select a file with extension .readme.&nbsp; If there
-isn't one create a file with that extension.&nbsp; Select the file to bring
-up the popup menu, then select the Properties menu item.&nbsp; Click on
-the page called Readme Tool to see an example of a property page.
-<h4>
-Readme file editor</h4>
-The Readme File Editor is the default editor for files of type *.readme.&nbsp;
-Create a file with extension .readme and open the file by double clicking
-on it, or by bringing up the popup menu,&nbsp; selecting Open With, then
-selecting Readme File Editor from the sub menu.&nbsp; Notice the editor
-has an icon with a pencil.&nbsp; This is the editor that the readme tool
-uses by default for files of type *.readme.
-<h4>
-Readme Editor Actions</h4>
-This demonstrates an example of actions that are applicable only to a particular
-editor.&nbsp; When a readme file editor has focus, notice 4 additional
-tool bar buttons - Run Readme Editor Extension, Readme Editor Action 1,
-Readme Editor Action 2, Readme Editor Action 3.
-<p>A pull down menu named Readme appears when a readme file editor has
-focus.&nbsp; It contains the actions previously described: Readme Editor
-Action 1, Readme Editor Action 2, Readme Editor Action 3.
-<h4>
-Readme sections view</h4>
-To see this Readme Sections view, from the Window menu select Show
-View, then select Other... from the sub menu.&nbsp; Expand the Readme item
-and then select Readme Sections.&nbsp; This will show a list of the sections
-in the current *.readme file when a .readme file is selected in the Navigator
-View.&nbsp; You can also see the structure of a *.readme file in the Outline
-view.
-<p>A file with extension .readme can be broken down into sections when
-each section begins with a number.&nbsp; For example, if the following
-text were entered into the readme file editor, the readme tool would detect
-2 sections.&nbsp; To see how sections are detected in the readme tool,
-type some text in the readme file editor, save the file by either typing
-CTRL-S or selecting&nbsp; File->Save. Open the Readme Sections view and
-select the .readme file in the Navigator View.
-<p>Example text:
-<p>99.1 This is my first section
-<br>This is some text in my first section.
-<p>99.1.1 This is a sub section
-<br>This is some text in my sub-section.
-<h4>Drag and Drop</h4>
-<p>The Drag and Drop functionality can be seen by selecting a section in the
-Outline View and dragging the selection over top of a text file. The contents of
-the selection will be appended to the file.
-<h4>
-Help contribution</h4>
-The readme tool example also demonstrates how to use and implement context
-help on all of the extensions it supplies - a view, various actions and
-a wizard page.&nbsp; To get context help on an action, hover over the menu
-item, but do no select it, then hit the F1 key.&nbsp; You can also get
-context sensitive (F1) help on the Readme Sections view and the Example
-Creation Wizards page (in the New wizard).
-<br>&nbsp;
-<h3>
-Details</h3>
-The Readme Tool example declares one extension point and supplies a number
-of extensions.&nbsp; The extensions supplied are quite comprehensive in
-understanding how the Workbench functions, as it utilizes a number of the
-more interesting extension points declared by the workbench.&nbsp; Supplied
-extensions included in this example are views and view actions, preference
-pages, property pages, wizards, editors and editor actions, popup menus,
-action sets, help contributions, help contexts, and drop actions.
-<p>This example also supplies an extension point declared in the plug-in..
-The class IReadmeFileParser is required for any plug-in that uses the org.eclipse.ui.examples.readmetool.sectionParser
-extension that this example defines. The class DefaultSectionParser is
-an example implementation of IReadmeFileParser.
-<p>The class ReadmeEditor implements IEditorPart and is defined as an editor
-on files with the extension .readme in the plugin.xml using the org.eclipse.ui.editors
-extension point. The class ReadmeSectionsView implements IViewPart and
-is defined as a view using the org.eclipse.ui.views extension point. This
-extension point also defines a category for the view for use in view selection.
-<p>Two types of preference settings are defined in this example, workbench
-preferences and resource properties. The workbench preference is defined
-in class ReadmePreferencePage which implements IWorkbenchPreferencePage
-so that it will be added to the Window-&gt;Preferences dialog. The class
-is defined in the extension point org.eclipse.ui.preferencePages in the
-plugin.xml. The two resource properties pages are ReadmeFilePropertyPage
-and ReadmeFilePropertyPage2 both of which implement IWorkbenchPropertyPage.
-They are both defined to be invoked on the IFile type by the objectClass
-tag in the plugin.xml in the org.eclipse.ui.propertyPages extension point.
-<p>The class ReadmeCreationWizard implements INewWizard and is defined
-in the org.eclipse.ui.newWizards extension point in the plugin.xml. This
-extension point also defines the category that the wizard that is shown
-when the user selects File-&gt;New-&gt;Example....
-<p>Several action stubs are added to this example. The action set declares
-a menu labeled Readme File Editor<b> </b>to be included in the workbench
-window menu bar using the extension point org.eclipse.ui.actionSets. It
-also defines an action for the workbench toolbar and menu bar using the
-tags toolbarPath and menubarPath. It uses the class WindowActionDelegate
-which implements IWorkbenchWindowActionDelegate to implement the action.
-The action for the popup menu is defined as an objectContribution by the
-class PopupMenuActionDelegate in&nbsp; the extension point org.eclipse.ui.popupMenus.
-PopupMenuActionDelegate implements IObjectActionDelegate and uses the IWorkbenchPart
-provided to open a message dialog. The view action ViewActionDelegate is
-defined in the extension point org.eclipse.ui.viewActions and implements
-IViewActionDelegate. The View it appears in is defined by the tag targetID
-which in this example is org.eclipse.ui.views.ResourceNavigator. The editor
-action is defined by the class EditorActionDelegate which implements IEditorActionDelegate
-and is added using the org.eclipse.ui.editorActions extension point. The
-editor that it is applied to is defined by the tag targetID which in this
-example is defined on org.eclipse.ui.examples.readmetool.ReadmeEditor.<p>The
-class ReadmeDropActionDelegate implements IDropDelegate. IDropDelegates are
-informed every time there is a drop action performed in the workbench . The
-extension point for this action is org.eclipse.ui.dropActions.
-
-</body>
-</html>
diff --git a/examples/org.eclipse.ui.examples.readmetool/doc.zip b/examples/org.eclipse.ui.examples.readmetool/doc.zip
deleted file mode 100644
index 41e8aa9..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/doc.zip
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/doc/hglegal.htm b/examples/org.eclipse.ui.examples.readmetool/doc/hglegal.htm
deleted file mode 100644
index a41081e..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/doc/hglegal.htm
+++ /dev/null
@@ -1,15 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
-   <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/examples/org.eclipse.ui.examples.readmetool/doc/org_eclipse_ui_examples_readmetool.html b/examples/org.eclipse.ui.examples.readmetool/doc/org_eclipse_ui_examples_readmetool.html
deleted file mode 100644
index 986462a..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/doc/org_eclipse_ui_examples_readmetool.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0//en">
-<html>
-<head>
-<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>Readme Tool Extension Points</title>
-</head>
-<body link="#0000FF" vlink="#800080">
-
-<center>
-<h1>
-Readme Tool</h1></center>
-The Readme Tool is provided as an example for tool developers. It demonstrates
-the extension of various aspects of the workbench, both visually and functionally.
-As well, the Readme Tool provides extension points of its own.
-<p>
-<hr WIDTH="100%">
-<h1>
-Extension Points</h1>
-The following extension points can be used to extend the Readme Tool:
-<ul>
-<li>
-<a href="org_eclipse_ui_examples_readmetool_sectionParser.html">org.eclipse.ui.readmetool.sectionParser</a></li>
-</ul>
-
-</body>
-</html>
diff --git a/examples/org.eclipse.ui.examples.readmetool/doc/org_eclipse_ui_examples_readmetool_sectionParser.html b/examples/org.eclipse.ui.examples.readmetool/doc/org_eclipse_ui_examples_readmetool_sectionParser.html
deleted file mode 100644
index b197e80..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/doc/org_eclipse_ui_examples_readmetool_sectionParser.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0//en">
-<html>
-<head>
-<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>README Tool Extension Points</title>
-</head>
-<body link="#0000FF" vlink="#800080">
-
-<center>
-<h1>
-Section Parser</h1></center>
-<b><i>Identifier: </i></b>org.eclipse.ui.examples.readmetool.sectionParser
-<p><b><i>Description: </i></b>This extension point allows tools to provide
-a parser for Readme files which identifies the sections of the file.
-The sections determined by this parser will show up in the outliner when a
-Readme file is open in the editor. The sections will also appear in the 
-"Readme sections" view.
-<p>The default section parser provided with the Readme Tool is a simple parser
-which considers sections to be numbered at the beginning of a line. Top-level
-sections are signified by a number followed by a period, such as in the following
-regular expression: "[0-9]+\.". Examples are "1.", "0.", and "12345.".
-Subsections are signified by the regular expression: "([0-9]+\.)+[0-9]+". Examples
-of subsections are "1.1", "1.1.1.1", and "123.456.7890". Any level of subsection
-nesting may occur. Section and subsection markers must occur before any other
-non-whitespace characters on a line.
-<p><b><i>Configuration Markup:</i></b>
-<p><tt>&nbsp;&nbsp; &lt;!ATTLIST sectionParser</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name &nbsp;CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id &nbsp;&nbsp; CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class CDATA #REQUIRED</tt>
-<br><tt>&nbsp;&nbsp; ></tt>
-<ul>
-<li>
-<b>name</b> - a string describing this contribution.</li>
-
-<li>
-<b>id</b> - a unique identifier that can be used to reference this extension.</li>
-
-<li>
-<b>class</b> - a fully qualified name of the class which provides this extension.</li>
-</ul>
-
-<b><i>Examples:</i></b>
-<p>The following is an example of a sectionParser extension point:
-<p><tt>&nbsp;&nbsp;&lt;extension point="org.eclipse.ui.examples.readmetool.sectionParser"></tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;parser</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="Custom README Section Parser"</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id="com.xyz.CustomSectionParser"</tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="com.xyz.CustomSectionParser"></tt>
-<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/parser></tt>
-<br><tt>&nbsp;&nbsp;&lt;/extension></tt>
-<p>In the example above, the class com.xyz.CustomSectionParser will be used as
-the section parser for Readme files.
-<p><b><i>API Information: </i></b>Value of the action attribute <b>class</b>
-must be a fully qualified class name of a Java class that implements the interface
-org.eclipse.ui.examples.readmetool.IReadmeFileParser. This interface is loaded as 
-late as possible to avoid loading the entire tool before it is really needed.
-<p><b><i>Supplied Implementation: </i></b>As described above, the default section
-parser uses a simple grammar of sections identified by numbers followed by periods,
-and subsections identified by the pattern of a number followed by a period, repeated
-an arbitrary number of times, and ending with a number.
-
-</body>
-</html>
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/ctool16/action1.gif b/examples/org.eclipse.ui.examples.readmetool/icons/ctool16/action1.gif
deleted file mode 100644
index 91077ef..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/ctool16/action1.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/ctool16/action2.gif b/examples/org.eclipse.ui.examples.readmetool/icons/ctool16/action2.gif
deleted file mode 100644
index c2a3e17..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/ctool16/action2.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/ctool16/action3.gif b/examples/org.eclipse.ui.examples.readmetool/icons/ctool16/action3.gif
deleted file mode 100644
index 9c14f74..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/ctool16/action3.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/ctool16/openbrwsr.gif b/examples/org.eclipse.ui.examples.readmetool/icons/ctool16/openbrwsr.gif
deleted file mode 100644
index 6d40439..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/ctool16/openbrwsr.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/dtool16/action1.gif b/examples/org.eclipse.ui.examples.readmetool/icons/dtool16/action1.gif
deleted file mode 100644
index 0c50830..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/dtool16/action1.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/dtool16/action2.gif b/examples/org.eclipse.ui.examples.readmetool/icons/dtool16/action2.gif
deleted file mode 100644
index 3f978df..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/dtool16/action2.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/dtool16/action3.gif b/examples/org.eclipse.ui.examples.readmetool/icons/dtool16/action3.gif
deleted file mode 100644
index f9f1e95..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/dtool16/action3.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/dtool16/openbrwsr.gif b/examples/org.eclipse.ui.examples.readmetool/icons/dtool16/openbrwsr.gif
deleted file mode 100644
index 02a2df8..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/dtool16/openbrwsr.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/etool16/action1.gif b/examples/org.eclipse.ui.examples.readmetool/icons/etool16/action1.gif
deleted file mode 100644
index 55fb1a6..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/etool16/action1.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/etool16/action2.gif b/examples/org.eclipse.ui.examples.readmetool/icons/etool16/action2.gif
deleted file mode 100644
index f801d2e..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/etool16/action2.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/etool16/action3.gif b/examples/org.eclipse.ui.examples.readmetool/icons/etool16/action3.gif
deleted file mode 100644
index 5e199b1..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/etool16/action3.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/etool16/openbrwsr.gif b/examples/org.eclipse.ui.examples.readmetool/icons/etool16/openbrwsr.gif
deleted file mode 100644
index bdbe8ca..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/etool16/openbrwsr.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/obj16/editor.gif b/examples/org.eclipse.ui.examples.readmetool/icons/obj16/editor.gif
deleted file mode 100644
index c48d9a9..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/obj16/editor.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/obj16/newreadme_wiz.gif b/examples/org.eclipse.ui.examples.readmetool/icons/obj16/newreadme_wiz.gif
deleted file mode 100644
index 293826d..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/obj16/newreadme_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/obj16/usereditor.gif b/examples/org.eclipse.ui.examples.readmetool/icons/obj16/usereditor.gif
deleted file mode 100644
index 64d7907..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/obj16/usereditor.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/view16/sections.gif b/examples/org.eclipse.ui.examples.readmetool/icons/view16/sections.gif
deleted file mode 100644
index 008fd7a..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/view16/sections.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/icons/wizban/newreadme_wiz.gif b/examples/org.eclipse.ui.examples.readmetool/icons/wizban/newreadme_wiz.gif
deleted file mode 100644
index 3265aaf..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/icons/wizban/newreadme_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.readmetool/plugin.properties b/examples/org.eclipse.ui.examples.readmetool/plugin.properties
deleted file mode 100644
index 3d02a7c..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/plugin.properties
+++ /dev/null
@@ -1,48 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Plugin.name = Readme File Editing Tool
-Plugin.providerName = Eclipse.org
-ExtPoint.sectionParser = Section parser for Readme file editor
-SectionParser.name = Default section parser for Readme tool
-ActionSet.name = ReadMe Actions
-ActionSet.menu = Readme &File Editor
-ReadmeAction.label = &Open Readme Browser
-ReadmeAction.tooltip = Open Readme Browser
-ReadmeRetargetAction.label = &Open Readme Browser (Retarget)
-ReadmeRetargetAction.tooltip = Open Readme Browser (Retarget)
-ReadmeRelabelRetargetAction.label = &Open Readme Browser (Retarget - Label Update)
-ReadmeRelabelRetargetAction.tooltip = Open Readme Browser (Retarget - Label Update)
-NewWizard.category = Example Creation Wizards
-NewWizard.name = Readme File
-NewWizard.desc = An example of a wizard that creates sample Readme file
-Editors.ReadmeEditor = Readme File Editor
-Views.category = &Readme
-Views.ReadmeSections = Readme Sections
-PreferencePage.name = Readme Example
-PropertiesPage.filePage = Readme Tool
-PropertiesPage.filePage2 = More Readme Info
-PopupMenus.action = &Show Readme Action
-PopupMenu.ResourceNav.label = &Readme View Extension
-PopupMenu.ResourceNav.tooltip = Run Readme View Extension
-Editors.Action.label = &Readme Editor Extension
-Editors.Action.tooltip = Run Readme Editor Extension
-ReadmeMarker.name = Readme Marker
-CmdLabel=Test Trim Cmd
-Trim.item=Trim Item
-TrimItem.toolTip=TrimItem ToolTip
-Trim2.item=Trim Item 2
-TrimItem2.toolTip=TrimItem 2 ToolTip
-
-Readme.commands.category=Readme Commands
-Readme.viewCmd.name=View Message
-Readme.viewCmd.mnemonic=M
-Readme.viewCmd.tooltip = Run Readme View Command
-
diff --git a/examples/org.eclipse.ui.examples.readmetool/plugin.xml b/examples/org.eclipse.ui.examples.readmetool/plugin.xml
deleted file mode 100644
index 21c94a8..0000000
--- a/examples/org.eclipse.ui.examples.readmetool/plugin.xml
+++ /dev/null
@@ -1,385 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-    
-<!-- ================================================================== -->
-<!--         org.eclipse.ui.examples.readmetool.IReadmeFileParser       -->
-<!-- Extension Implementation: must implement                           -->
-<!--          the file's section and subsection structure               -->
-<!-- Purpose: Provide a custom parser for Readme files which determines -->
-<!-- Extension point: org.eclipse.ui.examples.readmetool.sectionParser  -->
-<!-- ================================================================== -->
-   <extension-point id="sectionParser" name="%ExtPoint.sectionParser"/>
-
-   <extension
-         point="org.eclipse.ui.examples.readmetool.sectionParser">
-      <parser
-            name="%SectionParser.name"
-            class="org.eclipse.ui.examples.readmetool.DefaultSectionsParser"
-            id="org.eclipse.ui.examples.readmetool.DefaultSectionsParser">
-      </parser>
-   </extension>
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            label="%ActionSet.name"
-            visible="false"
-            id="org_eclipse_ui_examples_readmetool_actionSet">
-         <menu
-               label="%ActionSet.menu"
-               path="window/additions"
-               id="org_eclipse_ui_examples_readmetool">
-            <separator
-                  name="slot1">
-            </separator>
-            <separator
-                  name="slot2">
-            </separator>
-            <separator
-                  name="slot3">
-            </separator>
-         </menu>
-         <action
-               id="org_eclipse_ui_examples_readmetool_readmeAction"
-               toolbarPath="readme"
-               class="org.eclipse.ui.examples.readmetool.WindowActionDelegate"
-               enablesFor="1"
-               icon="$nl$/icons/ctool16/openbrwsr.gif"
-               helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context"
-               label="%ReadmeAction.label"
-               menubarPath="window/org_eclipse_ui_examples_readmetool/slot1"
-               tooltip="%ReadmeAction.tooltip">
-            <selection
-                  name="*.readme"
-                  class="org.eclipse.core.resources.IFile">
-            </selection>
-         </action>
-         <action
-               label="%ReadmeRetargetAction.label"
-               icon="$nl$/icons/ctool16/openbrwsr.gif"
-               helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context"
-               tooltip="%ReadmeRetargetAction.tooltip"
-               retarget="true"
-               menubarPath="window/org_eclipse_ui_examples_readmetool/slot1"
-               toolbarPath="readme"
-               id="org_eclipse_ui_examples_readmetool_readmeRetargetAction">
-         </action>
-         <action
-               allowLabelUpdate="true"
-               id="org_eclipse_ui_examples_readmetool_readmeRelabelRetargetAction"
-               toolbarPath="readme"
-               icon="$nl$/icons/ctool16/openbrwsr.gif"
-               helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context"
-               label="%ReadmeRelabelRetargetAction.label"
-               menubarPath="window/org_eclipse_ui_examples_readmetool/slot1"
-               retarget="true"
-               tooltip="%ReadmeRelabelRetargetAction.tooltip">
-         </action>
-      </actionSet>
-   </extension>
-   <extension
-         point="org.eclipse.ui.newWizards">
-      <category
-            name="%NewWizard.category"
-            parentCategory="org.eclipse.ui.Examples"
-            id="org.eclipse.ui.examples.readmetool.new">
-      </category>
-      <wizard
-            name="%NewWizard.name"
-            icon="$nl$/icons/obj16/newreadme_wiz.gif"
-            category="org.eclipse.ui.Examples/org.eclipse.ui.examples.readmetool.new"
-            class="org.eclipse.ui.examples.readmetool.ReadmeCreationWizard"
-            id="org.eclipse.ui.examples.readmetool.wizards.new.file">
-         <description>
-            %NewWizard.desc
-         </description>
-         <selection
-               class="org.eclipse.core.resources.IResource">
-         </selection>
-      </wizard>
-   </extension>
-   <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            name="%Editors.ReadmeEditor"
-            icon="$nl$/icons/obj16/editor.gif"
-            extensions="readme"
-            contributorClass="org.eclipse.ui.examples.readmetool.ReadmeEditorActionBarContributor"
-            class="org.eclipse.ui.examples.readmetool.ReadmeEditor"
-            id="org.eclipse.ui.examples.readmetool.ReadmeEditor">
-      </editor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            name="%Views.category"
-            id="org.eclipse.ui.examples.readmetool">
-      </category>
-      <view
-            name="%Views.ReadmeSections"
-            icon="$nl$/icons/view16/sections.gif"
-            category="org.eclipse.ui.examples.readmetool"
-            class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView"
-            id="org.eclipse.ui.examples.readmetool.views.SectionsView">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            name="%PreferencePage.name"
-            class="org.eclipse.ui.examples.readmetool.ReadmePreferencePage"
-            id="org.eclipse.ui.examples.readmetool.Page1">
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.ui.propertyPages">
-      <page
-            name="%PropertiesPage.filePage"
-            nameFilter="*.readme"
-            class="org.eclipse.ui.examples.readmetool.ReadmeFilePropertyPage"
-            id="org.eclipse.ui.examples.readmetool.FilePage">
-         <enabledWhen>
-            <instanceof
-                  value="org.eclipse.core.resources.IFile">
-            </instanceof>
-         </enabledWhen>
-      </page>
-      <page
-            name="%PropertiesPage.filePage2"
-            nameFilter="*.readme"
-            class="org.eclipse.ui.examples.readmetool.ReadmeFilePropertyPage2"
-            id="org.eclipse.ui.examples.readmetool.FilePage2">
-         <enabledWhen>
-            <instanceof
-                  value="org.eclipse.core.resources.IFile">
-            </instanceof>
-         </enabledWhen>
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.ui.popupMenus">
-      <objectContribution
-            objectClass="org.eclipse.core.resources.IFile"
-            nameFilter="*.readme"
-            id="org.eclipse.ui.examples.readmetool">
-         <action
-               label="%PopupMenus.action"
-               icon="$nl$/icons/ctool16/openbrwsr.gif"
-               helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context"
-               class="org.eclipse.ui.examples.readmetool.PopupMenuActionDelegate"
-               menubarPath="additions"
-               enablesFor="1"
-               id="org.eclipse.ui.examples.readmetool.action1">
-         </action>
-      </objectContribution>
-      <viewerContribution
-            targetID="org.eclipse.ui.examples.readmetool.outline"
-            id="org.eclipse.ui.examples.readmetool2">
-         <action
-               label="%PopupMenus.action"
-               icon="$nl$/icons/ctool16/openbrwsr.gif"
-               helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context"
-               class="org.eclipse.ui.examples.readmetool.ViewActionDelegate"
-               menubarPath="additions"
-               id="org.eclipse.ui.examples.readmetool.action1">
-         </action>
-      </viewerContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.viewActions">
-      <viewContribution
-            targetID="org.eclipse.ui.navigator.ProjectExplorer"
-            id="org.eclipse.ui.examples.readmetool.vc1">
-         <action
-               id="org.eclipse.ui.examples.readmetool.va1"
-               toolbarPath="additions"
-               class="org.eclipse.ui.examples.readmetool.ViewActionDelegate"
-               enablesFor="1"
-               icon="$nl$/icons/obj16/editor.gif"
-               helpContextId="org.eclipse.ui.examples.readmetool.view_action_context"
-               label="%PopupMenu.ResourceNav.label"
-               menubarPath="additions"
-               tooltip="%PopupMenu.ResourceNav.tooltip">
-            <selection
-                  name="*.readme"
-                  class="org.eclipse.core.resources.IFile">
-            </selection>
-         </action>
-      </viewContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.editorActions">
-      <editorContribution
-            targetID="org.eclipse.ui.examples.readmetool.ReadmeEditor"
-            id="org.eclipse.ui.examples.readmetool.ec1">
-         <action
-               label="%Editors.Action.label"
-               icon="$nl$/icons/obj16/editor.gif"
-               tooltip="%Editors.Action.tooltip"
-               class="org.eclipse.ui.examples.readmetool.EditorActionDelegate"
-               toolbarPath="ReadmeEditor"
-               id="org.eclipse.ui.examples.readmetool.ea1">
-         </action>
-      </editorContribution>
-   </extension>
-   <extension
-         point="org.eclipse.help.contexts">
-      <contexts
-            file="HelpContexts.xml">
-      </contexts>
-   </extension>
-   <extension
-         point="org.eclipse.ui.dropActions">
-      <action
-            class="org.eclipse.ui.examples.readmetool.ReadmeDropActionDelegate"
-            id="org_eclipse_ui_examples_readmetool_drop_actions">
-      </action>
-   </extension>
-   <extension
-         id="readmemarker"
-         name="%ReadmeMarker.name"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.core.resources.taskmarker">
-      </super>
-      <super
-            type="org.eclipse.core.resources.textmarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-      <attribute
-            name="org.eclipse.ui.examples.readmetool.id">
-      </attribute>
-      <attribute
-            name="org.eclipse.ui.examples.readmetool.level">
-      </attribute>
-      <attribute
-            name="org.eclipse.ui.examples.readmetool.department">
-      </attribute>
-      <attribute
-            name="org.eclipse.ui.examples.readmetool.code">
-      </attribute>
-      <attribute
-            name="org.eclipse.ui.examples.readmetool.language">
-      </attribute>
-   </extension>
-   <extension
-         point="org.eclipse.ui.ide.markerHelp">
-      <markerHelp
-            markerType="org.eclipse.ui.examples.readmetool.readmemarker"
-            helpContextId="org.eclipse.ui.examples.readmetool.marker_example1_context">
-         <attribute
-               name="org.eclipse.ui.examples.readmetool.id"
-               value="1234">
-         </attribute>
-      </markerHelp>
-      <markerHelp
-            markerType="org.eclipse.ui.examples.readmetool.readmemarker"
-            helpContextId="org.eclipse.ui.examples.readmetool.marker_example2_context">
-         <attribute
-               name="org.eclipse.ui.examples.readmetool.level"
-               value="7">
-         </attribute>
-      </markerHelp>
-      <markerHelp
-            markerType="org.eclipse.ui.examples.readmetool.readmemarker"
-            helpContextId="org.eclipse.ui.examples.readmetool.marker_example3_context">
-         <attribute
-               name="org.eclipse.ui.examples.readmetool.level"
-               value="7">
-         </attribute>
-         <attribute
-               name="org.eclipse.ui.examples.readmetool.department"
-               value="infra">
-         </attribute>
-      </markerHelp>
-      <markerHelp
-            markerType="org.eclipse.ui.examples.readmetool.readmemarker"
-            helpContextId="org.eclipse.ui.examples.readmetool.marker_example4_context">
-         <attribute
-               name="org.eclipse.ui.examples.readmetool.code"
-               value="red">
-         </attribute>
-      </markerHelp>
-      <markerHelp
-            markerType="org.eclipse.ui.examples.readmetool.readmemarker"
-            helpContextId="org.eclipse.ui.examples.readmetool.marker_example5_context">
-         <attribute
-               name="org.eclipse.ui.examples.readmetool.language"
-               value="english">
-         </attribute>
-      </markerHelp>
-      <markerHelp
-            markerType="org.eclipse.ui.examples.readmetool.readmemarker"
-            helpContextId="org.eclipse.ui.examples.readmetool.marker_example6_context">
-         <attribute
-               name="org.eclipse.ui.examples.readmetool.id"
-               value="1234">
-         </attribute>
-         <attribute
-               name="org.eclipse.ui.examples.readmetool.level"
-               value="7">
-         </attribute>
-         <attribute
-               name="org.eclipse.ui.examples.readmetool.department"
-               value="infra">
-         </attribute>
-         <attribute
-               name="org.eclipse.ui.examples.readmetool.code"
-               value="red">
-         </attribute>
-         <attribute
-               name="org.eclipse.ui.examples.readmetool.language"
-               value="english">
-         </attribute>
-      </markerHelp>
-      <markerHelp
-            markerType="org.eclipse.ui.examples.readmetool.readmemarker"
-            helpContextId="org.eclipse.ui.examples.readmetool.marker_example7_context">
-      </markerHelp>
-   </extension>
-   <extension
-         point="org.eclipse.ui.ide.markerResolution">
-      <markerResolutionGenerator
-            markerType="org.eclipse.ui.examples.readmetool.readmemarker"
-            class="org.eclipse.ui.examples.readmetool.ReadmeMarkerResolutionGenerator">
-         <attribute
-               name="org.eclipse.ui.examples.readmetool.id"
-               value="1234">
-         </attribute>
-      </markerResolutionGenerator>
-      <markerResolutionGenerator
-            markerType="org.eclipse.ui.examples.readmetool.readmemarker"
-            class="org.eclipse.ui.examples.readmetool.ReadmeMarkerResolutionGenerator">
-         <attribute
-               name="org.eclipse.ui.examples.readmetool.level"
-               value="7">
-         </attribute>
-      </markerResolutionGenerator>
-      <markerResolutionGenerator
-            markerType="org.eclipse.ui.examples.readmetool.readmemarker"
-            class="org.eclipse.ui.examples.readmetool.ReadmeMarkerResolutionGenerator">
-         <attribute
-               name="org.eclipse.ui.examples.readmetool.code"
-               value="red">
-         </attribute>
-         <attribute
-               name="org.eclipse.ui.examples.readmetool.language"
-               value="english">
-         </attribute>
-      </markerResolutionGenerator>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer class="org.eclipse.ui.examples.readmetool.ReadmePreferenceInitializer"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.actionSetPartAssociations">
-      <actionSetPartAssociation targetID="org_eclipse_ui_examples_readmetool_actionSet">
-         <part id="org.eclipse.ui.examples.readmetool.ReadmeEditor"/>
-      </actionSetPartAssociation>
-   </extension>
-
-</plugin>
diff --git a/examples/org.eclipse.ui.examples.undo/.classpath b/examples/org.eclipse.ui.examples.undo/.classpath
deleted file mode 100644
index a3734f5..0000000
--- a/examples/org.eclipse.ui.examples.undo/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="Eclipse UI Examples Undo"/>
-	<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/examples/org.eclipse.ui.examples.undo/.cvsignore b/examples/org.eclipse.ui.examples.undo/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/examples/org.eclipse.ui.examples.undo/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/examples/org.eclipse.ui.examples.undo/.project b/examples/org.eclipse.ui.examples.undo/.project
deleted file mode 100644
index bfd3d88..0000000
--- a/examples/org.eclipse.ui.examples.undo/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.examples.undo</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/examples/org.eclipse.ui.examples.undo/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.ui.examples.undo/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index b325f3b..0000000
--- a/examples/org.eclipse.ui.examples.undo/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,70 +0,0 @@
-#Mon Jan 15 21:20:44 EST 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.4
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.4
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/examples/org.eclipse.ui.examples.undo/.settings/org.eclipse.jdt.ui.prefs b/examples/org.eclipse.ui.examples.undo/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 0cb7d76..0000000
--- a/examples/org.eclipse.ui.examples.undo/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Tue Oct 18 15:15:38 EDT 2005
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.2\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template></templates>
diff --git a/examples/org.eclipse.ui.examples.undo/.settings/org.eclipse.pde.prefs b/examples/org.eclipse.ui.examples.undo/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index a26a239..0000000
--- a/examples/org.eclipse.ui.examples.undo/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Oct 18 16:45:19 EDT 2005
-compilers.p.deprecated=0
-compilers.p.illegal-att-value=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=1
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/AddBoxOperation.java b/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/AddBoxOperation.java
deleted file mode 100644
index 549f659..0000000
--- a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/AddBoxOperation.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.undo;
-
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.swt.widgets.Canvas;
-
-/**
- * An operation that adds a box.
- */
-public class AddBoxOperation extends BoxOperation {
-
-	/**
-	 * Create a box
-	 * @param label
-	 * @param context
-	 * @param boxes
-	 * @param box
-	 * @param canvas
-	 */
-	public AddBoxOperation(String label, IUndoContext context, Boxes boxes, Box box, Canvas canvas) {
-		super(label, context, boxes, box, canvas);
-	}
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info) {
-		boxes.add(box);
-		canvas.redraw(box.x1, box.y1, box.x2, box.y2, false);
-		return Status.OK_STATUS;
-	}
-	
-	public boolean canUndo() {
-		return boxes.contains(box);
-	}
-	
-	public IStatus undo(IProgressMonitor monitor, IAdaptable info) {
-		boxes.remove(box);
-		canvas.redraw(box.x1, box.y1, box.x2, box.y2, false);
-		return Status.OK_STATUS;
-	}
-	
-	public boolean canRedo() {
-		return !boxes.contains(box);
-	}
-	public IStatus redo(IProgressMonitor monitor, IAdaptable info) {
-		return execute(monitor, info);
-	}
-
-
-
-}
diff --git a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/Box.java b/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/Box.java
deleted file mode 100644
index cff1a4d..0000000
--- a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/Box.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.undo;
-
-
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-
-/**
- * 2D Box that can move itself, hit-test, and draw.
- */
-public class Box  {
-	
-	/*
-	 * The location of the box.
-	 */
-	public int x1, y1, x2, y2;
-	
-	/*
-	 * Constructs a box, defined by any two diametrically 
-	 * opposing corners.
-	 */
-	public Box(int x1, int y1, int x2, int y2) {
-		super();
-		set(x1, y1, x2, y2);
-	}
-	
-	/*
-	 * Move the box to a new origin.
-	 */
-	public void move(Point origin) {
-		set(origin.x, origin.y, origin.x + getWidth(), origin.y + getHeight());
-	}
-	
-	/*
-	 * Draw the box with the specified gc.
-	 */
-	public void draw(GC gc) {
-		gc.drawRectangle(x1, y1, x2-x1, y2-y1);
-	}
-	
-	/*
-	 * Set the position of the box
-	 */
-	private void set(int x1, int y1, int x2, int y2) {
-		this.x1 = Math.min(x1, x2);
-		this.y1 = Math.min(y1, y2);
-		this.x2 = Math.max(x1, x2);
-		this.y2 = Math.max(y1, y2);
-	}
-	
-	/*
-	 * Return true if this box contains the point specified by
-	 * the x and y.
-	 */
-	public boolean contains(int x, int y) {
-		return x >= x1 && 
-			x <= x2 && 
-			y >= y1 && 
-			y <= y2;
-	}
-	
-	/*
-	 * Answer the width of the box
-	 */
-	public int getWidth() {
-		return x2 - x1;
-	}
-	
-	/*
-	 * Answer the height of the box
-	 */
-	public int getHeight() {
-		return y2 - y1;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/BoxOperation.java b/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/BoxOperation.java
deleted file mode 100644
index a0524eb..0000000
--- a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/BoxOperation.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.undo;
-
-import org.eclipse.core.commands.operations.AbstractOperation;
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Canvas;
-
-/**
- * An undoable operation that represents a change to a box.
- */
-public abstract class BoxOperation extends AbstractOperation {
-	
-	/*
-	 * The box involved in the operation
-	 */
-	Box box;
-	
-	/*
-	 * The group of boxes involved in the operation
-	 */
-	Boxes boxes;
-	
-	/*
-	 * The canvas to update or draw on during an operation
-	 */
-	Canvas canvas;
-
-	public BoxOperation(String label, IUndoContext undoContext, Boxes boxes, Box box, Canvas canvas) {
-		super (label);
-		addContext(undoContext);
-		this.boxes = boxes;
-		this.box = box;
-		this.canvas = canvas;
-	}
-	
-	/*
-	 * Show the specified prompt in an info dialog.
-	 */
-	void showMessage(String message) {
-		MessageDialog.openInformation(canvas.getShell(),
-				UndoExampleMessages.BoxView_Title, message);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/Boxes.java b/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/Boxes.java
deleted file mode 100644
index f299237..0000000
--- a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/Boxes.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.undo;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.swt.graphics.GC;
-
-/**
- * A collection of boxes
- */
-public class Boxes  {
-	
-	/*
-	 * The "model," a list of boxes
-	 */
-	private List boxes = new ArrayList();
-	
-	/*
-	 * Constructs a box collection
-	 */
-	public Boxes() {
-		super();
-	}
-	
-	/*
-	 * Add the specified box to the group of boxes.
-	 */
-	public void add(Box box) {
-		boxes.add(box);
-	}
-	
-	/*
-	 * Remove the specified box from the group of boxes.
-	 */
-	public void remove(Box box) {
-		boxes.remove(box);
-	}
-	
-	/*
-	 * Clear all the boxes from the list of boxes.
-	 */
-	public void clear() {
-		boxes = new ArrayList();
-	}
-	
-	/*
-	 * Return true if the group of boxes contains the specified box.
-	 */
-	public boolean contains(Box box) {
-		return boxes.contains(box);
-	}
-	
-	/*
-	 * Draw the boxes with the specified gc.
-	 */
-	public void draw(GC gc) {
-		for (int i = 0; i < boxes.size(); i++) {
-			((Box) boxes.get(i)).draw(gc);
-		}
-	}
-		
-	/*
-	 * Return the box containing the specified x and y, or null
-	 * if no box contains the point.
-	 */
-	public Box getBox(int x, int y) {
-		for (int i=0; i< boxes.size(); i++) {
-			Box box = (Box)boxes.get(i);
-			if (box.contains(x, y)) {
-				return box;
-			}
-		}
-		return null;
-	}
-	
-	/*
-	 * Return the list of boxes known by this group of boxes.
-	 */
-	public List getBoxes() {
-		return boxes;
-	}
-	
-	/*
-	 * Set the list of boxes known by this group of boxes.
-	 */
-	public void setBoxes(List boxes) {
-		this.boxes = boxes;
-	}
-	
-}
diff --git a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/ClearBoxesOperation.java b/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/ClearBoxesOperation.java
deleted file mode 100644
index bd4d84e..0000000
--- a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/ClearBoxesOperation.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.undo;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.swt.widgets.Canvas;
-
-/**
- * An operation that adds a box.
- */
-public class ClearBoxesOperation extends BoxOperation {
-
-	/*
-	 * The boxes that are saved after clearing
-	 */
-	private List savedBoxes = new ArrayList();
-	
-	public ClearBoxesOperation(String label, IUndoContext context, Boxes boxes, Canvas canvas) {
-		super(label, context, boxes, null, canvas);
-	}
-
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#execute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info){
-		savedBoxes = boxes.getBoxes();
-		boxes.clear();
-		canvas.redraw();
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#redo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus redo(IProgressMonitor monitor, IAdaptable info) {
-		return execute(monitor, info);
-	}
-
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#undo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus undo(IProgressMonitor monitor, IAdaptable info) {
-		boxes.setBoxes(savedBoxes);
-		canvas.redraw();
-		return Status.OK_STATUS;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/MoveBoxOperation.java b/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/MoveBoxOperation.java
deleted file mode 100644
index 714d380..0000000
--- a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/MoveBoxOperation.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.undo;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Canvas;
-
-/**
- * An operation that adds a box.
- */
-public class MoveBoxOperation extends BoxOperation {
-
-	/*
-	 * The point the box should move to/from.
-	 */
-	private Point origin;
-	private Point target;
-	
-	public MoveBoxOperation(String label, IUndoContext context, Box box, Canvas canvas, Point newOrigin) {
-		super(label, context, null, box, canvas);
-		origin = new Point(box.x1, box.y1);
-		target = new Point(newOrigin.x, newOrigin.y);
-	}
-
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#execute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		if (box==null) {
-			throw new ExecutionException("box ix null");
-		}
-		box.move(target);
-		canvas.redraw();
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#redo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus redo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		return execute(monitor, info);
-	}
-
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#undo(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus undo(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		if (box==null) {
-			throw new ExecutionException("box ix null");
-		}
-		box.move(origin);
-		canvas.redraw();
-		return Status.OK_STATUS;
-	}
-	
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.core.commands.operations.IUndoableOperation#getLabel()
-	 */
-	public String getLabel() {
-		final StringBuffer stringBuffer = new StringBuffer();
-		stringBuffer.append(super.getLabel());
-		stringBuffer.append("["); //$NON-NLS-1$
-		stringBuffer.append("("); //$NON-NLS-1$
-		stringBuffer.append(new Integer(origin.x).toString());
-		stringBuffer.append(", "); //$NON-NLS-1$
-		stringBuffer.append(new Integer(origin.y).toString());
-		stringBuffer.append(')');
-		stringBuffer.append(", "); //$NON-NLS-1$
-		stringBuffer.append("("); //$NON-NLS-1$
-		stringBuffer.append(new Integer(target.x).toString());
-		stringBuffer.append(", "); //$NON-NLS-1$
-		stringBuffer.append(new Integer(target.y).toString());
-		stringBuffer.append(')');
-		stringBuffer.append(']');
-		return stringBuffer.toString();
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/PromptingUserApprover.java b/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/PromptingUserApprover.java
deleted file mode 100644
index 4cd9023..0000000
--- a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/PromptingUserApprover.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.undo;
-
-import org.eclipse.core.commands.operations.IOperationApprover;
-import org.eclipse.core.commands.operations.IOperationHistory;
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.examples.undo.preferences.PreferenceConstants;
-
-/**
- * An operation approver that prompts the user to see whether an undo or redo
- * should continue. An example preference is checked to determine if prompting
- * should occur.
- */
-public final class PromptingUserApprover implements IOperationApprover {
-
-	private IUndoContext context;
-
-	/*
-	 * Create the operation approver.
-	 */
-	public PromptingUserApprover(IUndoContext context) {
-		super();
-		this.context = context;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationApprover#proceedRedoing(org.eclipse.core.commands.operations.IUndoableOperation,
-	 *      org.eclipse.core.commands.operations.IOperationHistory,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus proceedRedoing(IUndoableOperation operation,
-			IOperationHistory history, IAdaptable uiInfo) {
-
-		// return immediately if the operation is not relevant
-		if (!operation.hasContext(context))
-			return Status.OK_STATUS;
-
-		// allow the operation if we are not prompting
-		boolean prompt = UndoPlugin.getDefault().getPreferenceStore()
-				.getBoolean(PreferenceConstants.PREF_CONFIRMUNDO);
-		if (!prompt)
-			return Status.OK_STATUS;
-		return prompt(false, operation, uiInfo);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.operations.IOperationApprover#proceedUndoing(org.eclipse.core.commands.operations.IUndoableOperation,
-	 *      org.eclipse.core.commands.operations.IOperationHistory,
-	 *      org.eclipse.core.runtime.IAdaptable)
-	 */
-	public IStatus proceedUndoing(IUndoableOperation operation,
-			IOperationHistory history, IAdaptable uiInfo) {
-
-		// return immediately if the operation is not relevant
-		if (!operation.hasContext(context))
-			return Status.OK_STATUS;
-
-		// allow the operation if we are not prompting
-		boolean prompt = UndoPlugin.getDefault().getPreferenceStore()
-				.getBoolean(PreferenceConstants.PREF_CONFIRMUNDO);
-		if (!prompt)
-			return Status.OK_STATUS;
-		return prompt(true, operation, uiInfo);
-	}
-
-	/*
-	 * Prompt the user as to whether to continue the undo or redo, and return an
-	 * OK_STATUS if we should continue, or a CANCEL_STATUS if we should not.
-	 */
-	private IStatus prompt(boolean undoing, IUndoableOperation operation,
-			IAdaptable uiInfo) {
-		boolean createdShell = false;
-		Shell shell = getShell(uiInfo);
-		if (shell == null) {
-			if (shell == null) {
-				createdShell = true;
-				shell = new Shell();
-			}
-		}
-		String command = undoing ? UndoExampleMessages.BoxView_Undo
-				: UndoExampleMessages.BoxView_Redo;
-		String message = NLS.bind(UndoExampleMessages.BoxView_ConfirmUndo, command,
-				operation.getLabel());
-		MessageDialogWithToggle dialog = MessageDialogWithToggle
-				.openOkCancelConfirm(shell, UndoExampleMessages.BoxView_Title,
-						message, UndoExampleMessages.UndoPreferences_DoNotConfirm, false, null, null);
-		UndoPlugin.getDefault().getPreferenceStore().setValue(PreferenceConstants.PREF_CONFIRMUNDO, !dialog.getToggleState());
-
-		if (createdShell)
-			shell.dispose();
-		if (dialog.getReturnCode() == Window.OK)
-			return Status.OK_STATUS;
-		return Status.CANCEL_STATUS;
-	}
-
-	/*
-	 * Return the shell described by the supplied uiInfo, or null if no shell is
-	 * described.
-	 */
-	Shell getShell(IAdaptable uiInfo) {
-		if (uiInfo != null) {
-			Shell shell = (Shell) uiInfo.getAdapter(Shell.class);
-			if (shell != null)
-				return shell;
-		}
-		return null;
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/UndoExampleMessages.java b/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/UndoExampleMessages.java
deleted file mode 100644
index 678524a..0000000
--- a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/UndoExampleMessages.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2005 IBM Corporation and others. All rights reserved.   This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- * IBM - Initial API and implementation
- **********************************************************************/
-package org.eclipse.ui.examples.undo;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Message class for the undo example.
- *
- */
-public class UndoExampleMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ui.examples.undo.messages";//$NON-NLS-1$
-
-	public static String UndoPreferences_Description;
-	public static String UndoPreferences_HistoryLimit;
-	public static String UndoPreferences_ConfirmUndo;
-	public static String UndoPreferences_ShowDebug;
-	public static String UndoPreferences_DoNotConfirm;
-	
-	public static String UndoHistoryView_ContextFilterDialog;
-	public static String UndoHistoryView_ChooseContextMessage;
-	public static String UndoHistoryView_FilterText;
-	public static String UndoHistoryView_FilterToolTipText;
-	public static String UndoHistoryView_OperationInvalid;
-	public static String UndoHistoryView_OperationException;
-	public static String UndoHistoryView_UndoSelected;
-	public static String UndoHistoryView_UndoSelectedToolTipText;
-	public static String UndoHistoryView_RefreshList;
-	public static String UndoHistoryView_RefreshListToolTipText;
-	public static String UndoHistoryView_InfoDialogTitle;
-
-	public static String BoxView_Title;
-	public static String BoxView_ClearBoxes;
-	public static String BoxView_ClearBoxesToolTipText;
-	public static String BoxView_Move;
-	public static String BoxView_Add;
-	public static String BoxView_ConfirmUndo;
-	public static String BoxView_Undo;
-	public static String BoxView_Redo;
-	
-    static {
-		// load message values from bundle file
-		NLS.initializeMessages(BUNDLE_NAME, UndoExampleMessages.class);
-	}
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/UndoPlugin.java b/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/UndoPlugin.java
deleted file mode 100644
index 8180980..0000000
--- a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/UndoPlugin.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.undo;
-
-import org.eclipse.ui.plugin.*;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class UndoPlugin extends AbstractUIPlugin {
-
-	//The shared instance.
-	private static UndoPlugin plugin;
-	
-	/**
-	 * The constructor.
-	 */
-	public UndoPlugin() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static UndoPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path.
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ui.examples.undo2", path);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/messages.properties b/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/messages.properties
deleted file mode 100644
index 2c2dad1..0000000
--- a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/messages.properties
+++ /dev/null
@@ -1,41 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-########### Undo Preferences ###########################
-UndoPreferences_Description = Undo Example Preferences
-UndoPreferences_HistoryLimit = Undo history limit
-UndoPreferences_ConfirmUndo = Confirm all undo operations
-UndoPreferences_ShowDebug = Show debug labels in undo history view
-UndoPreferences_DoNotConfirm = Do not prompt for undo or redo again
-
-########### Undo History View ##########################
-UndoHistoryView_ContextFilterDialog = Context Filter Dialog
-UndoHistoryView_ChooseContextMessage = Choose the Context for the view
-UndoHistoryView_FilterText = Filter on...
-UndoHistoryView_FilterToolTipText = Set the undo context used to filter the operation history
-UndoHistoryView_UndoSelected = Undo selected
-UndoHistoryView_UndoSelectedToolTipText = Undo the selected operation
-UndoHistoryView_RefreshList = Refresh list
-UndoHistoryView_RefreshListToolTipText = Refresh and redraw the list
-UndoHistoryView_OperationInvalid = The selected operation cannot be undone in its current state
-UndoHistoryView_OperationException = An error occurred while trying to undo this operation
-UndoHistoryView_InfoDialogTitle = Undo History Example Information
-
-########### Box View ##########################
-BoxView_Title = Box View
-BoxView_ClearBoxes = Delete all boxes
-BoxView_ClearBoxesToolTipText = Delete all of the boxes from the view
-BoxView_Move = Move Box
-BoxView_Add = Add Box
-BoxView_ConfirmUndo = Are you sure you want to {0} "{1}"?
-BoxView_Undo = Undo
-BoxView_Redo = Redo
-
diff --git a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/preferences/PreferenceConstants.java b/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/preferences/PreferenceConstants.java
deleted file mode 100644
index 209f680..0000000
--- a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/preferences/PreferenceConstants.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.undo.preferences;
-
-/**
- * Constant definitions for plug-in preferences
- */
-public class PreferenceConstants {
-
-	public static final String PREF_UNDOLIMIT = "prefUndoLimit";
-	public static final String PREF_SHOWDEBUG = "prefShowDebug";
-	public static final String PREF_CONFIRMUNDO = "prefConfirmUndo";
-	
-}
diff --git a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/preferences/PreferenceInitializer.java b/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/preferences/PreferenceInitializer.java
deleted file mode 100644
index b706daf..0000000
--- a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/preferences/PreferenceInitializer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.undo.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import org.eclipse.ui.examples.undo.UndoPlugin;
-
-/**
- * Class used to initialize default preference values.
- */
-public class PreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-		IPreferenceStore store = UndoPlugin.getDefault()
-				.getPreferenceStore();
-		store.setDefault(PreferenceConstants.PREF_CONFIRMUNDO, true);
-		store.setDefault(PreferenceConstants.PREF_UNDOLIMIT,
-				25);
-		store.setDefault(PreferenceConstants.PREF_SHOWDEBUG, false);
-		
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/preferences/UndoPreferencePage.java b/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/preferences/UndoPreferencePage.java
deleted file mode 100644
index df35f35..0000000
--- a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/preferences/UndoPreferencePage.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.undo.preferences;
-
-import org.eclipse.jface.preference.*;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.examples.undo.UndoExampleMessages;
-import org.eclipse.ui.examples.undo.UndoPlugin;
-
-/**
- * This class is used to define preferences that control how
- * undo occurs.  It demonstrates the use of preferences to configure
- * the operation history in different ways.
- */
-
-public class UndoPreferencePage
-	extends FieldEditorPreferencePage
-	implements IWorkbenchPreferencePage {
-
-	public UndoPreferencePage() {
-		super(GRID);
-		setPreferenceStore(UndoPlugin.getDefault().getPreferenceStore());
-		setDescription(UndoExampleMessages.UndoPreferences_Description);
-	}
-	
-	/**
-	 * Creates the field editors. 
-	 */
-	public void createFieldEditors() {
-		
-		addField(
-				new IntegerFieldEditor(
-					PreferenceConstants.PREF_UNDOLIMIT,
-					UndoExampleMessages.UndoPreferences_HistoryLimit,
-					getFieldEditorParent()));
-
-		addField(
-				new BooleanFieldEditor(
-					PreferenceConstants.PREF_SHOWDEBUG,
-					UndoExampleMessages.UndoPreferences_ShowDebug,
-					getFieldEditorParent()));
-
-		addField(
-			new BooleanFieldEditor(
-				PreferenceConstants.PREF_CONFIRMUNDO,
-				UndoExampleMessages.UndoPreferences_ConfirmUndo,
-				getFieldEditorParent()));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-	}
-	
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/views/BoxView.java b/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/views/BoxView.java
deleted file mode 100644
index 761bc9a..0000000
--- a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/views/BoxView.java
+++ /dev/null
@@ -1,462 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.undo.views;
-
-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.MouseMoveListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.examples.undo.AddBoxOperation;
-import org.eclipse.ui.examples.undo.Box;
-import org.eclipse.ui.examples.undo.Boxes;
-import org.eclipse.ui.examples.undo.ClearBoxesOperation;
-import org.eclipse.ui.examples.undo.MoveBoxOperation;
-import org.eclipse.ui.examples.undo.PromptingUserApprover;
-import org.eclipse.ui.examples.undo.UndoExampleMessages;
-import org.eclipse.ui.examples.undo.UndoPlugin;
-import org.eclipse.ui.examples.undo.preferences.PreferenceConstants;
-import org.eclipse.ui.operations.RedoActionHandler;
-import org.eclipse.ui.operations.UndoActionHandler;
-import org.eclipse.ui.part.ViewPart;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IOperationApprover;
-import org.eclipse.core.commands.operations.IOperationHistory;
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.commands.operations.ObjectUndoContext;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.SWT;
-
-public class BoxView extends ViewPart {
-	/*
-	 * The canvas to paint the boxes on.
-	 */
-	private Canvas paintCanvas;
-
-	/*
-	 * The gc used for drawing the rubber band.
-	 */
-	private GC gc;
-
-	/*
-	 * The model, a group of boxes
-	 */
-	private Boxes boxes = new Boxes();
-
-	/*
-	 * Undo and redo actions
-	 */
-	private UndoActionHandler undoAction;
-
-	private RedoActionHandler redoAction;
-
-	private IAction clearBoxesAction;
-
-	/*
-	 * Private undo context for box operations
-	 */
-	private IUndoContext undoContext;
-
-	/*
-	 * Operation approver for approving undo and redo
-	 */
-	private IOperationApprover operationApprover;
-
-	/*
-	 * Property change listener for the undo limit preference.
-	 */
-	private IPropertyChangeListener propertyChangeListener;
-
-	/*
-	 * True if a click-drag is in progress
-	 */
-	private boolean dragInProgress = false;
-
-	/*
-	 * True if a click-move is in progress
-	 */
-	private boolean moveInProgress = false;
-
-	/*
-	 * The box that is being moved.
-	 */
-	private Box movingBox;
-
-	/*
-	 * The diff between a moving box and the track position.
-	 */
-	int diffX, diffY;
-
-	/*
-	 * The position of the first click in a click-drag
-	 */
-	private Point anchorPosition = new Point(-1, -1);
-
-	/*
-	 * A temporary point in a drag or move operation
-	 */
-	private Point tempPosition = new Point(-1, -1);
-
-	/*
-	 * The rubber band position (the last recorded temp position)
-	 */
-	private Point rubberbandPosition = new Point(-1, -1);
-
-	/*
-	 * Construct a BoxView.
-	 */
-	public BoxView() {
-		super();
-		initializeOperationHistory();
-	}
-
-	/*
-	 * Create the canvas on which boxes are drawn and hook up all actions and
-	 * listeners.
-	 */
-	public void createPartControl(Composite parent) {
-		paintCanvas = new Canvas(parent, SWT.BORDER | SWT.V_SCROLL
-				| SWT.H_SCROLL | SWT.NO_REDRAW_RESIZE);
-
-		// set up a GC for drawing the tracking rectangle
-		gc = new GC(paintCanvas);
-		gc.setForeground(paintCanvas.getForeground());
-		gc.setLineStyle(SWT.LINE_SOLID);
-
-		// add listeners
-		addListeners();
-
-		// create actions and hook them up to the menus and toolbar
-		makeActions();
-		hookContextMenu();
-		createGlobalActionHandlers();
-		contributeToActionBars();
-	}
-
-	/*
-	 * Add listeners to the canvas.
-	 */
-	private void addListeners() {
-		paintCanvas.addMouseListener(new MouseAdapter() {
-			public void mouseDown(MouseEvent event) {
-				if (event.button != 1)
-					return;
-				if (dragInProgress || moveInProgress)
-					return; // spurious event
-
-				tempPosition.x = event.x;
-				tempPosition.y = event.y;
-				Box box = boxes.getBox(event.x, event.y);
-				if (box != null) {
-					moveInProgress = true;
-					movingBox = box;
-					anchorPosition.x = box.x1;
-					anchorPosition.y = box.y1;
-					diffX = event.x - box.x1;
-					diffY = event.y - box.y1;
-				} else {
-					dragInProgress = true;
-					anchorPosition.x = event.x;
-					anchorPosition.y = event.y;
-				}
-			}
-
-			public void mouseUp(MouseEvent event) {
-				if (event.button != 1) {
-					resetDrag(true); // abort if right or middle mouse button
-					// pressed
-					return;
-				}
-				if (anchorPosition.x == -1)
-					return; // spurious event
-
-				if (dragInProgress) {
-					Box box = new Box(anchorPosition.x, anchorPosition.y,
-							tempPosition.x, tempPosition.y);
-					if (box.getWidth() > 0 && box.getHeight() > 0) {
-						try {
-							getOperationHistory().execute(
-									new AddBoxOperation(
-											UndoExampleMessages.BoxView_Add,
-											undoContext, boxes, box, paintCanvas),
-									null, null);
-						} catch (ExecutionException e) {
-						}
-						dragInProgress = false;
-					}
-				} else if (moveInProgress) {
-					try {
-						getOperationHistory().execute(
-								new MoveBoxOperation(
-										UndoExampleMessages.BoxView_Move,
-										undoContext, movingBox, paintCanvas,
-										anchorPosition), null, null);
-					} catch (ExecutionException e) {
-					}
-					moveInProgress = false;
-					movingBox = null;
-				}
-				resetDrag(false);
-
-				// redraw everything to clean up the tracking rectangle
-				paintCanvas.redraw();
-			}
-
-			public void mouseDoubleClick(MouseEvent event) {
-			}
-		});
-		paintCanvas.addMouseMoveListener(new MouseMoveListener() {
-			public void mouseMove(MouseEvent event) {
-				if (dragInProgress) {
-					clearRubberBandSelection();
-					tempPosition.x = event.x;
-					tempPosition.y = event.y;
-					addRubberBandSelection();
-				} else if (moveInProgress) {
-					clearRubberBandSelection();
-					anchorPosition.x = event.x - diffX;
-					anchorPosition.y = event.y - diffY;
-					tempPosition.x = anchorPosition.x + movingBox.getWidth();
-					tempPosition.y = anchorPosition.y + movingBox.getHeight();
-					addRubberBandSelection();
-				}
-			}
-		});
-		paintCanvas.addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent event) {
-				event.gc.setForeground(paintCanvas.getForeground());
-				boxes.draw(event.gc);
-			}
-		});
-
-		paintCanvas.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent event) {
-				// dispose the gc
-				gc.dispose();
-				// dispose listeners
-				removeListeners();
-			}
-		});
-
-		// listen for a change in the undo limit
-		propertyChangeListener = new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				if (event.getProperty() == PreferenceConstants.PREF_UNDOLIMIT) {
-					int limit = UndoPlugin.getDefault().getPreferenceStore()
-							.getInt(PreferenceConstants.PREF_UNDOLIMIT);
-					getOperationHistory().setLimit(undoContext, limit);
-				}
-			}
-		};
-		UndoPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(
-				propertyChangeListener);
-
-	}
-
-	/*
-	 * Remove listeners that were registered. Since the control is being
-	 * disposed, we are only removing non-control listeners.
-	 */
-	private void removeListeners() {
-		UndoPlugin.getDefault().getPreferenceStore()
-				.removePropertyChangeListener(propertyChangeListener);
-		getOperationHistory().removeOperationApprover(operationApprover);
-	}
-
-	/*
-	 * Hook a listener on the menu showing so we can fill the context menu with
-	 * our actions.
-	 */
-	private void hookContextMenu() {
-		MenuManager menuMgr = new MenuManager("#PopupMenu");
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				BoxView.this.fillContextMenu(manager);
-			}
-		});
-		Menu menu = menuMgr.createContextMenu(paintCanvas);
-		paintCanvas.setMenu(menu);
-	}
-
-	/*
-	 * Add our actions to the action bars.
-	 */
-	private void contributeToActionBars() {
-		IActionBars bars = getViewSite().getActionBars();
-		fillLocalPullDown(bars.getMenuManager());
-		fillLocalToolBar(bars.getToolBarManager());
-	}
-
-	/*
-	 * Add our undo and redo actions to the local pulldown.
-	 */
-	private void fillLocalPullDown(IMenuManager manager) {
-		manager.add(undoAction);
-		manager.add(redoAction);
-		manager.add(new Separator());
-		manager.add(clearBoxesAction);
-	}
-
-	/*
-	 * Add our undo and redo actions to the context menu.
-	 */
-	private void fillContextMenu(IMenuManager manager) {
-		manager.add(undoAction);
-		manager.add(redoAction);
-		manager.add(new Separator());
-		manager.add(clearBoxesAction);
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	/*
-	 * Add actions to the local toolbar.
-	 */
-	private void fillLocalToolBar(IToolBarManager manager) {
-		manager.add(clearBoxesAction);
-	}
-
-	/*
-	 * Make any local actions used in the view.
-	 */
-	private void makeActions() {
-		clearBoxesAction = new Action() {
-			public void run() {
-				try {
-					getOperationHistory().execute(
-							new ClearBoxesOperation(
-									UndoExampleMessages.BoxView_ClearBoxes,
-									undoContext, boxes, paintCanvas), null,
-							null);
-				} catch (ExecutionException e) {
-				}
-			}
-		};
-		clearBoxesAction.setText(UndoExampleMessages.BoxView_ClearBoxes);
-		clearBoxesAction
-				.setToolTipText(UndoExampleMessages.BoxView_ClearBoxesToolTipText);
-		clearBoxesAction.setImageDescriptor(PlatformUI.getWorkbench()
-				.getSharedImages().getImageDescriptor(
-						ISharedImages.IMG_TOOL_DELETE));
-	}
-
-	/*
-	 * Create the global undo and redo action handlers.
-	 */
-	private void createGlobalActionHandlers() {
-		// set up action handlers that operate on the current context
-		undoAction = new UndoActionHandler(this.getSite(), undoContext);
-		redoAction = new RedoActionHandler(this.getSite(), undoContext);
-		IActionBars actionBars = getViewSite().getActionBars();
-		actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
-				undoAction);
-		actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
-				redoAction);
-	}
-
-	/*
-	 * Set focus to the canvas.
-	 */
-	public void setFocus() {
-		paintCanvas.setFocus();
-	}
-
-	/*
-	 * Reset the drag operation.
-	 */
-	private void resetDrag(boolean clearRubberband) {
-		if (clearRubberband) {
-			clearRubberBandSelection();
-		}
-		dragInProgress = false;
-		moveInProgress = false;
-		movingBox = null;
-		anchorPosition.x = anchorPosition.y = tempPosition.x = tempPosition.y = rubberbandPosition.x = rubberbandPosition.y = -1;
-	}
-
-	/*
-	 * Clear the existing rubber band selection.
-	 */
-	private void clearRubberBandSelection() {
-		gc.setForeground(paintCanvas.getBackground());
-		gc.drawRectangle(anchorPosition.x, anchorPosition.y,
-				rubberbandPosition.x - anchorPosition.x, rubberbandPosition.y
-						- anchorPosition.y);
-		paintCanvas.redraw(anchorPosition.x, anchorPosition.y,
-				rubberbandPosition.x - anchorPosition.x, rubberbandPosition.y
-						- anchorPosition.y, false);
-		paintCanvas.update();
-		rubberbandPosition = new Point(-1, -1);
-		gc.setForeground(paintCanvas.getForeground());
-	}
-
-	/*
-	 * Show a rubber band selection.
-	 */
-	private void addRubberBandSelection() {
-		rubberbandPosition = tempPosition;
-		gc.drawRectangle(anchorPosition.x, anchorPosition.y,
-				rubberbandPosition.x - anchorPosition.x, rubberbandPosition.y
-						- anchorPosition.y);
-	}
-
-	/*
-	 * Initialize the workbench operation history for our undo context.
-	 */
-	private void initializeOperationHistory() {
-		// create a unique undo context to 
-		// represent this view's undo history
-		undoContext = new ObjectUndoContext(this);
-
-		// set the undo limit for this context based on the preference
-		int limit = UndoPlugin.getDefault().getPreferenceStore().getInt(
-				PreferenceConstants.PREF_UNDOLIMIT);
-		getOperationHistory().setLimit(undoContext, limit);
-
-		// Install an operation approver for this undo context that prompts
-		// according to a user preference.
-		operationApprover = new PromptingUserApprover(undoContext);
-		getOperationHistory().addOperationApprover(operationApprover);
-	}
-
-	/*
-	 * Get the operation history from the workbench.
-	 */
-	private IOperationHistory getOperationHistory() {
-		return PlatformUI.getWorkbench().getOperationSupport()
-				.getOperationHistory();
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/views/UndoHistoryView.java b/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/views/UndoHistoryView.java
deleted file mode 100644
index a952dac..0000000
--- a/examples/org.eclipse.ui.examples.undo/Eclipse UI Examples Undo/org/eclipse/ui/examples/undo/views/UndoHistoryView.java
+++ /dev/null
@@ -1,415 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.undo.views;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-import org.eclipse.ui.examples.undo.UndoExampleMessages;
-import org.eclipse.ui.examples.undo.UndoPlugin;
-import org.eclipse.ui.examples.undo.preferences.PreferenceConstants;
-import org.eclipse.ui.operations.RedoActionHandler;
-import org.eclipse.ui.operations.UndoActionHandler;
-import org.eclipse.ui.part.*;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.commands.operations.OperationHistoryFactory;
-import org.eclipse.core.commands.operations.IOperationHistory;
-import org.eclipse.core.commands.operations.IOperationHistoryListener;
-import org.eclipse.core.commands.operations.OperationHistoryEvent;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.jface.action.*;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ui.*;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.SWT;
-
-/**
- * This view shows what operations are being added to the operations history for
- * undo. The view can be filtered by any operation context. A null operation
- * context indicates that the view should not be filtered.
- * 
- * <p>
- * Selecting undo or redo from the context menu or the edit menu will perform a
- * linear undo in the current context of the view. Selecting "Undo selected"
- * allows experimentation with direct undo. Operations that are undoable may be
- * undone independently of their order in the history.
- */
-
-public class UndoHistoryView extends ViewPart implements
-		ISelectionChangedListener {
-	private TableViewer viewer;
-
-	private Action filterAction;
-
-	private Action doubleClickAction;
-
-	private Action selectiveUndoAction;
-
-	private Action refreshListAction;
-
-	private IOperationHistory history = OperationHistoryFactory
-			.getOperationHistory();
-
-	private IUndoContext fContext = IOperationHistory.GLOBAL_UNDO_CONTEXT;
-
-	private UndoActionHandler undoAction;
-
-	private RedoActionHandler redoAction;
-	
-	private boolean showDebug = UndoPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.PREF_SHOWDEBUG);
-	private IPropertyChangeListener propertyChangeListener;
-
-	/*
-	 * The content provider shows the operations in the undo portion of the
-	 * operation history.  The histor is filtered by the currently selected
-	 * undo context.
-	 */
-
-	class ViewContentProvider implements IStructuredContentProvider,
-			IOperationHistoryListener {
-
-		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
-			// we never change inputs, so we just use this as a place to add our
-			// listener.
-			history.addOperationHistoryListener(this);
-		}
-
-		public void dispose() {
-			history.removeOperationHistoryListener(this);
-		}
-
-		public Object[] getElements(Object input) {
-			// show the items in the operations history.
-			return history.getUndoHistory(fContext);
-		}
-
-		public void historyNotification(OperationHistoryEvent event) {
-			if (viewer.getTable().isDisposed())
-				return;
-			Display display = viewer.getTable().getDisplay();
-			switch (event.getEventType()) {
-			case OperationHistoryEvent.OPERATION_ADDED:
-			case OperationHistoryEvent.OPERATION_REMOVED:
-			case OperationHistoryEvent.UNDONE:
-			case OperationHistoryEvent.REDONE:
-				if (event.getOperation().hasContext(fContext)
-						&& display != null) {
-					display.syncExec(new Runnable() {
-						public void run() {
-							// refresh all labels in case any operation has
-							// changed dynamically
-							// without notifying the operation history.
-							if (!viewer.getTable().isDisposed())
-								viewer.refresh(true);
-						}
-					});
-				}
-				break;
-			}
-		}
-	}
-
-	/*
-	 * A simple label provider that uses a preference to determine
-	 * whether the simple label or the debugging label (toString()) 
-	 * for an operation is shown.
-	 */
-	class ViewLabelProvider extends LabelProvider implements
-			ITableLabelProvider {
-		public String getColumnText(Object obj, int index) {
-			return getText(obj);
-		}
-
-		public Image getColumnImage(Object obj, int index) {
-			return getImage(obj);
-		}
-
-		public String getText(Object obj) {
-			if (!showDebug && obj instanceof IUndoableOperation)
-				return ((IUndoableOperation)obj).getLabel();
-			return obj.toString();
-		}
-	}
-
-	/*
-	 * Create a table viewer to show the list of operations.
-	 */
-	public void createPartControl(Composite parent) {
-		viewer = new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL
-				| SWT.V_SCROLL);
-		viewer.setContentProvider(new ViewContentProvider());
-		viewer.setLabelProvider(new ViewLabelProvider());
-		viewer.setInput(getViewSite());
-		makeActions();
-		hookContextMenu();
-		hookDoubleClickAction();
-		addListeners();
-		createGlobalActionHandlers();
-	}
-	
-	/*
-	 * Add any listeners needed by this view.
-	 */
-	private void addListeners() {
-		propertyChangeListener = new IPropertyChangeListener(){
-			public void propertyChange(PropertyChangeEvent event) {
-				if (event.getProperty() == PreferenceConstants.PREF_SHOWDEBUG) {
-					showDebug = UndoPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.PREF_SHOWDEBUG);
-					viewer.refresh();
-				}
-			}
-		};
-		UndoPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(propertyChangeListener);
-		viewer.getControl().addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent event) {
-				removeListeners();
-			}
-		});
-	}
-	
-	/*
-	 * Remove listeners that were added to this view.
-	 */
-	private void removeListeners() {
-		UndoPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(propertyChangeListener);	
-	}
-
-
-	/*
-	 * Create global action handlers to control undo and redo. We use the action
-	 * handlers rather than the UndoRedoActionGroup because this view
-	 * dynamically sets the undo context of the handlers. Most views that simply
-	 * desire an undo and redo menu action for their undo context can use
-	 * UndoRedoActionGroup.
-	 */
-	private void createGlobalActionHandlers() {
-		// set up action handlers that operate on the current context
-		undoAction = new UndoActionHandler(this.getSite(), fContext);
-		redoAction = new RedoActionHandler(this.getSite(), fContext);
-		IActionBars actionBars = getViewSite().getActionBars();
-		actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
-				undoAction);
-		actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
-				redoAction);
-	}
-
-	/*
-	 * Put up a dialog that shows all of the available undo contexts and allow
-	 * the user to select one.
-	 */
-	private IUndoContext selectContext() {
-		// This would be better implemented as a view filter, but for now, we 
-		// will use a dialog that collects the available undo contexts.
-		List input = new ArrayList();
-		IUndoableOperation[] operations = history
-				.getUndoHistory(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		for (int i = 0; i < operations.length; i++) {
-			IUndoContext[] contexts = operations[i].getContexts();
-			for (int j = 0; j < contexts.length; j++) {
-				if (!input.contains(contexts[j])) {
-					input.add(contexts[j]);
-				}
-			}
-		}
-		input.add(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-
-		ILabelProvider labelProvider = new LabelProvider() {
-			public String getText(Object element) {
-				return ((IUndoContext) element).getLabel();
-			}
-		};
-
-		ElementListSelectionDialog dialog = new ElementListSelectionDialog(
-				getSite().getShell(), labelProvider);
-		dialog.setMultipleSelection(false);
-		dialog.setTitle(UndoExampleMessages.UndoHistoryView_ContextFilterDialog); 
-		dialog.setMessage(UndoExampleMessages.UndoHistoryView_ChooseContextMessage); 
-		dialog.setElements(input.toArray());
-		dialog.setInitialSelections(new Object[] { fContext });
-		if (dialog.open() == Window.OK) {
-			Object[] contexts = dialog.getResult();
-			if (contexts[0] instanceof IUndoContext)
-				return (IUndoContext) contexts[0];
-			return null;
-		}
-		return null;
-	}
-
-	/*
-	 * Reset the undo context on which the history is filtered.
-	 */
-	public void setContext(IUndoContext context) {
-		fContext = context;
-		// setting the context into the actions updates the menu labels, etc.
-		redoAction.setContext(context);
-		undoAction.setContext(context);
-		// need to refresh the viewer
-		viewer.refresh(false);
-	}
-
-	/*
-	 * Hook the context menu for the view
-	 */
-	private void hookContextMenu() {
-		MenuManager menuMgr = new MenuManager("#PopupMenu");
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				UndoHistoryView.this.fillContextMenu(manager);
-			}
-		});
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(menuMgr, viewer);
-	}
-
-	/*
-	 * Fill the context menu for the view.
-	 */
-	private void fillContextMenu(IMenuManager manager) {
-		// First add the global undo/redo actions
-		undoAction.update();
-		redoAction.update();
-		manager.add(undoAction);
-		manager.add(redoAction);
-		manager.add(new Separator());
-		
-		// Now add our specialized actions
-		manager.add(selectiveUndoAction);
-		manager.add(filterAction);
-		manager.add(refreshListAction);
-
-		ISelection selection = viewer.getSelection();
-		if (!selection.isEmpty()) {
-			IUndoableOperation operation = (IUndoableOperation) ((IStructuredSelection) selection)
-					.getFirstElement();
-			selectiveUndoAction.setEnabled(operation.canUndo());
-		} else {
-			selectiveUndoAction.setEnabled(false);
-		}
-
-		// Other plug-ins can contribute actions here
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	/*
-	 * Create the actions for the view.
-	 */
-	private void makeActions() {
-		filterAction = new Action() {
-			public void run() {
-				IUndoContext context = selectContext();
-				if (fContext != context && context != null) {
-					setContext(context);
-				}
-			}
-		};
-		filterAction.setText(UndoExampleMessages.UndoHistoryView_FilterText);
-		filterAction.setToolTipText(UndoExampleMessages.UndoHistoryView_FilterToolTipText);
-		filterAction.setImageDescriptor(PlatformUI.getWorkbench()
-				.getSharedImages().getImageDescriptor(
-						ISharedImages.IMG_OBJS_INFO_TSK));
-
-		selectiveUndoAction = new Action() {
-			public void run() {
-				ISelection selection = viewer.getSelection();
-				IUndoableOperation operation = (IUndoableOperation) ((IStructuredSelection) selection)
-						.getFirstElement();
-				if (operation.canUndo()) {
-					try {
-						history.undoOperation(operation, null, undoAction);
-					} catch (ExecutionException e) {
-						showMessage(UndoExampleMessages.UndoHistoryView_OperationException);
-					}
-				} else {
-					showMessage(UndoExampleMessages.UndoHistoryView_OperationInvalid);
-				}
-			}
-		};
-		selectiveUndoAction.setText(UndoExampleMessages.UndoHistoryView_UndoSelected);
-		selectiveUndoAction.setToolTipText(UndoExampleMessages.UndoHistoryView_UndoSelectedToolTipText);
-		selectiveUndoAction.setImageDescriptor(PlatformUI.getWorkbench()
-				.getSharedImages().getImageDescriptor(
-						ISharedImages.IMG_TOOL_UNDO));
-
-		refreshListAction = new Action() {
-			public void run() {
-				if (!viewer.getTable().isDisposed())
-					viewer.refresh(true);
-			}
-		};
-		refreshListAction.setText(UndoExampleMessages.UndoHistoryView_RefreshList);
-		refreshListAction.setToolTipText(UndoExampleMessages.UndoHistoryView_RefreshListToolTipText);
-
-		doubleClickAction = new Action() {
-			public void run() {
-				ISelection selection = viewer.getSelection();
-				IUndoableOperation operation = (IUndoableOperation) ((IStructuredSelection) selection)
-						.getFirstElement();
-				StringBuffer buf = new StringBuffer(operation.getLabel());
-				buf.append("\n");
-				buf.append("Enabled=");	//$NON-NLS-1$
-				buf.append(new Boolean(operation.canUndo()).toString());
-				buf.append("\n");
-				buf.append(operation.getClass().toString());
-				showMessage(buf.toString());
-
-			}
-		};
-	}
-
-	/*
-	 * Register a double click action with the double click event.
-	 */
-	private void hookDoubleClickAction() {
-		viewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				doubleClickAction.run();
-			}
-		});
-	}
-
-	/*
-	 * Show an info message
-	 */
-	private void showMessage(String message) {
-		MessageDialog.openInformation(viewer.getControl().getShell(),
-				UndoExampleMessages.UndoHistoryView_InfoDialogTitle, message);
-	}
-
-	/*
-	 * The selection has changed.
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		ISelection selection = viewer.getSelection();
-		boolean enabled = !selection.isEmpty();
-		selectiveUndoAction.setEnabled(enabled);
-	}
-
-	/*
-	 * Pass the focus request to the viewer's control.
-	 */
-	public void setFocus() {
-		viewer.getControl().setFocus();
-
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.undo/META-INF/MANIFEST.MF b/examples/org.eclipse.ui.examples.undo/META-INF/MANIFEST.MF
deleted file mode 100644
index cf582ab..0000000
--- a/examples/org.eclipse.ui.examples.undo/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui.examples.undo; singleton:=true
-Bundle-Version: 3.2.100.qualifier
-Bundle-Activator: org.eclipse.ui.examples.undo.UndoPlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.jface.text
-Bundle-Vendor: %Plugin.providerName
-Bundle-ActivationPolicy: lazy
diff --git a/examples/org.eclipse.ui.examples.undo/about.html b/examples/org.eclipse.ui.examples.undo/about.html
deleted file mode 100644
index 4602330..0000000
--- a/examples/org.eclipse.ui.examples.undo/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.undo/build.properties b/examples/org.eclipse.ui.examples.undo/build.properties
deleted file mode 100644
index dae444f..0000000
--- a/examples/org.eclipse.ui.examples.undo/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = Eclipse UI Examples Undo/
-
-bin.includes = doc-html/,\
-               icons/,\
-               about.html,\
-               plugin.properties,\
-               plugin.xml,\
-               .,\
-               META-INF/
-
-src.includes = about.html
diff --git a/examples/org.eclipse.ui.examples.undo/doc-html/ui_undo_ex.html b/examples/org.eclipse.ui.examples.undo/doc-html/ui_undo_ex.html
deleted file mode 100644
index f24f028..0000000
--- a/examples/org.eclipse.ui.examples.undo/doc-html/ui_undo_ex.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <title>Undo Example</title>
-</head>
-<body>
-
-<h2>
-<b>Example - Undo</b></h2>
-
-<h3>Introduction</h3>
-<p>
-The Undo Example adds two views to the workbench.  The <b>Box View</b> is a rudimentary
-view that allows the user to create boxes by clicking into empty space and dragging the mouse
-to form a box.  Boxes can be moved by selecting a box and dragging it around.  The user
-may undo and redo any operations performed in the box view.  The <b>Undo History
-View</b> shows the undo history maintained by the workbench operations history.
-</p>
-<h3>Features demonstrated in the example</h3>
-<ul>
-<li>Creating an <tt>IUndoableOperation</tt> inside an action (Delete all boxes) to perform the action's
-work .</li>
-<li>Creating an <tt>IUndoableOperation</tt> based on an operation implied by a gesture (Adding
-and moving boxes).</li>
-<li>Using a local <tt>IUndoContext</tt> to keep undo operations local to a particular view.</li>
-<li>Using the platform undo and redo action handlers to provide undo and redo in a view.</li>
-<li>Providing a user preference for setting the undo limit for a particular undo context.</li>
-<li>Using an <tt>IOperationApprover</tt> to install additional policy (Prompt before undo) in
-the operation history.</li>
-<li>Using <tt>IOperationHistory</tt> protocol to show undo history for different
-undo contexts (Undo History View).</li>
-</ul>
-<h3>Features not demonstrated</h3>
-<ul>
-<li>Since the example is focused on simple undo, the BoxView code is kept
-to a minimum.  Therefore, it does not provide the expected graphical editor features such as
-selection, resize and selection handles, color and line style attributes, etc.  For the same
-reason, advanced features in the undo framework are not shown.</li>
-<li>There is no example of assigning multiple undo contexts in order to share operations between
-views or editors.</li>
-<li>There is no example of using composite undo operations.</li>
-</ul>
-<h3>Running the example</h3>
-<p>
-From Eclipse's <strong>Window</strong> menu select <strong>Show View</strong> &gt; <strong>Other...</strong>.  
-In the <strong>Show View</strong> dialog, expand <strong>Undo Examples</strong> and select
-the view named <strong>Box View</strong>. The box view will appear.
-</p>
-<p>
-Likewise, from the <strong>Window</strong> menu select <strong>Show View</strong> &gt; <strong>Other...</strong>.  
-In the <strong>Show View</strong> dialog, expand <strong>Undo Examples</strong> and select
-the view named <strong>Undo History View</strong>. A view containing the undo history will appear.
-This view can be used alongside the Box View to watch the undo history as boxes are added or moved.  It
-can also be used independently of the Box View to follow the undo history for any view or editor that
-uses the workbench operations history to track undoable operations.
-</p>
-<h3>Details</h3>
-<h4>Box View</h4>
-<p>Click in the box view and drag the mouse to create a box that follows the mouse.  Clicking inside an
-existing box and dragging the mouse will move the box to a new location.  Note the operations that appear
-in the <strong>Undo</strong> and <strong>Redo</strong> menus as boxes are added and moved.  The box view
-can be cleared by selecting <strong>Delete all boxes</strong> from the context menu or the view's local
-menu and toolbar.  This operation can also be undone.
-</p>
-<h4>Undo History View</h4>
-<p>The Undo History View shows the operations available for undo in all undo contexts.  To view the history
-in a particular undo context, select <strong>Filter on...</strong> from the view's context menu.
-This will filter the undo history on a particular undo context.  The view can be used to view the undo history
-for the Box View, for SDK text editors, and for undoable operations that affect the workspace, such as
-refactoring operations.  Undo and redo can be performed from the Undo History View's menus.  <b>Undo selected</b>
-will attempt to undo the selected operation in the undo history, regardless of its position in the operation history.
-Depending on the operation in question, this may or may not be allowed.  For example, the Box View allows all add and
-move operations to be undone or redone even if they aren't the most recently performed operation.  Text editors
-will prompt if an attempt is made to undo a typing operation that is not the most recent.
-</p>
-<h4>Example Preferences</h4>
-<p>Preferences are provided that affect the operation of both views.  
-From Eclipse's <strong>Window</strong> menu select <strong>Preferences</strong> &gt; <strong>Undo Preferences</strong>.  
-<ul>
-<li><strong>Undo history limit</strong> controls how many undoable operations are kept in the history for the Box View.</li>
-<li><strong>Show debug labels in undo history view</strong> controls whether the simple label shown in the undo menu is
-used for displaying operations, or a debug label that includes information such as the assigned undo context(s).</li>
-<li><strong>Confirm all undo operations</strong> controls whether prompting occurs before undoing or redoing an operation.
-This preference is used by the operation approver installed by the example.</li>
-</ul>
-</p>
-</body>
-</html>
diff --git a/examples/org.eclipse.ui.examples.undo/icons/sample.gif b/examples/org.eclipse.ui.examples.undo/icons/sample.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/examples/org.eclipse.ui.examples.undo/icons/sample.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.undo/plugin.properties b/examples/org.eclipse.ui.examples.undo/plugin.properties
deleted file mode 100644
index 651f78e..0000000
--- a/examples/org.eclipse.ui.examples.undo/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Plugin.name = Undo Example
-Plugin.providerName = Eclipse.org
-Views.historyView = Undo History View
-Views.boxView = Box View
-Views.Category = Undo Examples
-Preferences.Undo = Undo Preferences
diff --git a/examples/org.eclipse.ui.examples.undo/plugin.xml b/examples/org.eclipse.ui.examples.undo/plugin.xml
deleted file mode 100644
index 37f1aa5..0000000
--- a/examples/org.eclipse.ui.examples.undo/plugin.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            name="%Preferences.Undo"
-            class="org.eclipse.ui.examples.undo.preferences.UndoPreferencePage"
-            id="org.eclipse.ui.examples.undo.preferences.UndoPreferencePage">
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.eclipse.ui.examples.undo.preferences.PreferenceInitializer">
-      </initializer>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            name="%Views.Category"
-            id="org.eclipse.ui.examples.undo">
-      </category>
-      <view
-            name="%Views.boxView"
-            icon="icons/sample.gif"
-            category="org.eclipse.ui.examples.undo"
-            class="org.eclipse.ui.examples.undo.views.BoxView"
-            id="org.eclipse.ui.examples.undo.views.BoxView">
-      </view>
-   </extension>
-   
-         <extension
-         point="org.eclipse.ui.views">
-      <category
-            name="%Views.Category"
-            id="org.eclipse.ui.examples.undo"/>
-      <view
-            class="org.eclipse.ui.examples.undo.views.UndoHistoryView"
-            icon="icons/sample.gif"
-            category="org.eclipse.ui.examples.undo"
-            name="%Views.historyView"
-            id="org.eclipse.ui.examples.undo.views.UndoHistoryView"/>
-   </extension>
-   
-
-</plugin>
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.classpath b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.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/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.cvsignore b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.project b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.project
deleted file mode 100644
index 7626b41..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.examples.views.properties.tabbed.article</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 682f531..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,70 +0,0 @@
-#Mon Feb 06 11:18:08 EST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.settings/org.eclipse.jdt.ui.prefs b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index cbc1d39..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Mon Feb 06 11:18:08 EST 2006
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.2\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template></templates>
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.settings/org.eclipse.pde.prefs b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index e5fd2a4..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Tue Jan 10 16:54:24 EST 2006
-compilers.p.deprecated=1
-compilers.p.illegal-att-value=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/META-INF/MANIFEST.MF b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/META-INF/MANIFEST.MF
deleted file mode 100644
index 3de362e..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui.examples.views.properties.tabbed.article; singleton:=true
-Bundle-Version: 3.2.1.qualifier
-Bundle-Activator: org.eclipse.ui.examples.views.properties.tabbed.article.Activator
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.ui.views.properties.tabbed
-Eclipse-LazyStart: true
-Bundle-Vendor: %Plugin.providerName
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/about.html b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/about.html
deleted file mode 100644
index 4602330..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/build.properties b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/build.properties
deleted file mode 100644
index 2288d96..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .,\
-               icons/,\
-               plugin.properties,\
-               about.html
-src.includes = about.html
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/icons/sample.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/icons/sample.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/icons/sample.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/plugin.properties b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/plugin.properties
deleted file mode 100644
index 233f91f..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/plugin.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Plugin.name = Tabbed Properties View Article Example
-Plugin.providerName = Eclipse.org
-
-Views.category.name = Tabbed Properties View
-Views.example.name = Tabbed Properties Example View
-
-propertyTabs.Advanced.label = Advanced
-propertyTabs.Button.label = Button
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/plugin.xml b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/plugin.xml
deleted file mode 100644
index 4e77ea3..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/plugin.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<plugin>
-
-     <extension
-         point="org.eclipse.ui.views">
-      <category
-            name="%Views.category.name"
-            id="org.eclipse.ui.views.properties.tabbed">
-      </category>
-      <view
-            name="%Views.example.name"
-            category="org.eclipse.ui.views.properties.tabbed"
-            icon="icons/sample.gif"
-            class="org.eclipse.ui.examples.views.properties.tabbed.article.views.SampleView"
-            id="org.eclipse.ui.examples.views.properties.tabbed.article.views.SampleView">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-      <propertyContributor contributorId="org.eclipse.ui.examples.views.properties.tabbed.article.views.SampleView">
-         <propertyCategory category="sample"/>
-      </propertyContributor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
-      <propertyTabs contributorId="org.eclipse.ui.examples.views.properties.tabbed.article.views.SampleView">
-         <propertyTab
-               category="sample"
-               id="ButtonTab"
-               label="%propertyTabs.Button.label"/>
-         <propertyTab
-               afterTab="ButtonTab"
-               category="sample"
-               id="AdvancedTab"
-               label="%propertyTabs.Advanced.label"/>
-      </propertyTabs>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertySections">
-      <propertySections contributorId="org.eclipse.ui.examples.views.properties.tabbed.article.views.SampleView">
-         <propertySection
-               class="org.eclipse.ui.examples.views.properties.tabbed.article.views.LabelSection"
-               id="LabelSection"
-               tab="ButtonTab">
-            <input type="org.eclipse.ui.examples.views.properties.tabbed.article.views.ButtonElement"/>
-         </propertySection>
-         <propertySection
-               afterSection="LabelSection"
-               class="org.eclipse.ui.examples.views.properties.tabbed.article.views.SizeSection"
-               id="SizeSection"
-               tab="ButtonTab">
-            <input type="org.eclipse.ui.examples.views.properties.tabbed.article.views.ButtonElement"/>
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.views.properties.tabbed.AdvancedPropertySection"
-               id="AdvancedSection"
-               tab="AdvancedTab">
-            <input type="org.eclipse.ui.examples.views.properties.tabbed.article.views.ButtonElement"/>
-         </propertySection>
-         <propertySection
-               afterSection="SizeSection"
-               class="org.eclipse.ui.examples.views.properties.tabbed.article.views.FontSection"
-               id="FontSection"
-               tab="ButtonTab">
-            <input type="org.eclipse.ui.examples.views.properties.tabbed.article.views.ButtonElement"/>
-         </propertySection>
-      </propertySections>
-   </extension>
-
-</plugin>
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/Activator.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/Activator.java
deleted file mode 100644
index b30f7ae..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/Activator.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.article;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * Activator for this plug-in.
- * 
- * @author Anthony Hunter
- */
-public class Activator
-    extends AbstractUIPlugin {
-
-    // The shared instance.
-    private static Activator plugin;
-
-    /**
-     * The constructor.
-     */
-    public Activator() {
-        plugin = this;
-    }
-
-    /**
-     * This method is called upon plug-in activation
-     */
-    public void start(BundleContext context)
-        throws Exception {
-        super.start(context);
-    }
-
-    /**
-     * This method is called when the plug-in is stopped
-     */
-    public void stop(BundleContext context)
-        throws Exception {
-        super.stop(context);
-        plugin = null;
-    }
-
-    /**
-     * Returns the shared instance.
-     * 
-     * @return the shared instance.
-     */
-    public static Activator getDefault() {
-        return plugin;
-    }
-
-    /**
-     * Returns an image descriptor for the image file at the given plug-in
-     * relative path.
-     * 
-     * @param path
-     *            the path
-     * @return the image descriptor
-     */
-    public static ImageDescriptor getImageDescriptor(String path) {
-        return AbstractUIPlugin.imageDescriptorFromPlugin(
-            "org.eclipse.ui.examples.views.properties.tabbed.article", path);//$NON-NLS-1$
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/ButtonElement.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/ButtonElement.java
deleted file mode 100644
index cb9159e..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/ButtonElement.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.article.views;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.ui.views.properties.IPropertySource;
-
-/**
- * This class represents a Button Element in the Sample View
- * 
- * TIP: By implementing the <code>IWorkbenchAdapter</code> interface, we can
- * easily add objects of this type to viewers and parts in the workbench. When a
- * viewer contains <code>IWorkbenchAdapter</code>, the generic
- * <code>WorkbenchContentProvider</code> and
- * <code>WorkbenchLabelProvider</code> can be used to provide navigation and
- * display for that viewer.
- */
-public class ButtonElement
-    implements IWorkbenchAdapter, IAdaptable {
-
-    private String headingName;
-
-    private Button ctl;
-
-    /**
-     * Creates a new ButtonElement.
-     * 
-     * @param initBtn
-     *            the control of this element
-     * @param heading
-     *            text corresponding to the heading
-     */
-    public ButtonElement(Button initBtn, String heading) {
-        this.headingName = heading;
-        this.ctl = initBtn;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IAdaptable
-     */
-    public Object getAdapter(Class adapter) {
-        if (adapter == IWorkbenchAdapter.class)
-            return this;
-        if (adapter == IPropertySource.class)
-            return new ButtonElementProperties(this);
-        return null;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWorkbenchAdapter
-     */
-    public ImageDescriptor getImageDescriptor(Object object) {
-        return null;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWorkbenchAdapter
-     */
-    public String getLabel(Object o) {
-        return headingName;
-    }
-
-    /*
-     * (non-Javadoc) Method declared on IWorkbenchAdapter
-     */
-    public Object getParent(Object o) {
-        return null;
-    }
-
-    /**
-     * Retrieve the control for this element.
-     * 
-     * @return the control for this element.
-     */
-    public Button getControl() {
-        return ctl;
-    }
-
-    /**
-     * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(Object)
-     */
-    public Object[] getChildren(Object o) {
-        return null;
-    }
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/ButtonElementProperties.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/ButtonElementProperties.java
deleted file mode 100644
index 7114d84..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/ButtonElementProperties.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.article.views;
-
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * The property source provider for a button element.
- * 
- * @author Anthony Hunter
- */
-public class ButtonElementProperties
-    implements IPropertySource {
-
-    final protected ButtonElement element;
-
-    protected static final String PROPERTY_FONT = "font"; //$NON-NLS-1$
-
-    protected static final String PROPERTY_SIZE = "size"; //$NON-NLS-1$
-
-    protected static final String PROPERTY_TEXT = "text"; //$NON-NLS-1$
-
-    private final Object PropertiesTable[][] = {
-        {PROPERTY_FONT, new FontPropertyDescriptor(PROPERTY_FONT, "Font")},//$NON-NLS-1$
-        {PROPERTY_SIZE, new PropertyDescriptor(PROPERTY_SIZE, "Size")},//$NON-NLS-1$
-        {PROPERTY_TEXT, new TextPropertyDescriptor(PROPERTY_TEXT, "Text")}, //$NON-NLS-1$
-    };
-
-    String strFont = "";//$NON-NLS-1$
-
-    Point ptSize = null;
-
-    String strText = "";//$NON-NLS-1$
-
-    protected void firePropertyChanged(String propName, Object value) {
-        Button ctl = element.getControl();
-
-        if (ctl == null) {
-            // the GUIView is probably hidden in this case
-            return;
-        }
-
-        if (propName.equals(PROPERTY_FONT)) {
-            /**
-             * Font oldfont = ctl.getFont(); if (oldfont != null) {
-             * oldfont.dispose(); }
-             */
-            ctl
-                .setFont(new Font(ctl.getDisplay(),
-                    new FontData((String) value)));
-            return;
-        }
-        if (propName.equals(PROPERTY_TEXT)) {
-            ctl.setText((String) value);
-            return;
-        }
-
-    }
-
-    protected void initProperties() {
-        Button ctl = element.getControl();
-
-        if (ctl == null) {
-            // the GUIView is probably hidden in this case
-            return;
-        }
-
-        strText = ctl.getText();
-        /**
-         * Font font = ctl.getFont(); if (font != null) { strFont =
-         * font.getFontData().toString(); }
-         */
-        ptSize = ctl.getSize();
-    }
-
-    /**
-     * Creates a new ButtonElementProperties.
-     * 
-     * @param element
-     *            the element whose properties this instance represents
-     */
-    public ButtonElementProperties(ButtonElement element) {
-        super();
-        this.element = element;
-        initProperties();
-    }
-
-    /**
-     * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
-     */
-    public Object getEditableValue() {
-        return this;
-    }
-
-    /**
-     * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
-     */
-    public IPropertyDescriptor[] getPropertyDescriptors() {
-        // Create the property vector.
-        IPropertyDescriptor[] propertyDescriptors = new IPropertyDescriptor[PropertiesTable.length];
-
-        for (int i = 0; i < PropertiesTable.length; i++) {
-            // Add each property supported.
-
-            PropertyDescriptor descriptor;
-
-            descriptor = (PropertyDescriptor) PropertiesTable[i][1];
-            propertyDescriptors[i] = descriptor;
-            descriptor.setCategory("Basic");//$NON-NLS-1$
-        }
-
-        // Return it.
-        return propertyDescriptors;
-
-    }
-
-    /**
-     * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(Object)
-     */
-    public Object getPropertyValue(Object name) {
-        if (name.equals(PROPERTY_FONT))
-            return strFont;
-        if (name.equals(PROPERTY_SIZE))
-            return new SizePropertySource(element, ptSize);
-        if (name.equals(PROPERTY_TEXT))
-            return strText;
-
-        return null;
-    }
-
-    /**
-     * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(Object)
-     */
-    public boolean isPropertySet(Object id) {
-        return false;
-    }
-
-    /**
-     * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(Object)
-     */
-    public void resetPropertyValue(Object id) {
-        //
-    }
-
-    /**
-     * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(Object,
-     *      Object)
-     */
-    public void setPropertyValue(Object name, Object value) {
-        firePropertyChanged((String) name, value);
-
-        if (name.equals(PROPERTY_FONT)) {
-            strFont = (String) value;
-            return;
-        }
-        if (name.equals(PROPERTY_TEXT)) {
-            strText = (String) value;
-            return;
-        }
-        if (name.equals(PROPERTY_SIZE)) {
-            SizePropertySource sizeProp = (SizePropertySource) value;
-            ptSize = sizeProp.getValue();
-        }
-
-    }
-
-    /**
-     * Returns the mocha element.
-     * 
-     * @return MochaElement
-     */
-    public ButtonElement getButtonElement() {
-        return element;
-    }
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/CheckBoxPropertyDescriptor.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/CheckBoxPropertyDescriptor.java
deleted file mode 100644
index 31bb51f..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/CheckBoxPropertyDescriptor.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.article.views;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CheckboxCellEditor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-
-/**
- * A checkbox property descriptor.
- * 
- * @author Anthony Hunter
- */
-public class CheckBoxPropertyDescriptor
-    extends PropertyDescriptor {
-
-    /**
-     * Constructs a new property descriptor with the given id and display name.
-     * 
-     * @param id
-     *            the id for the descriptor.
-     * @param displayName
-     *            the display name for the descriptor.
-     */
-    public CheckBoxPropertyDescriptor(Object id, String displayName) {
-        super(id, displayName);
-    }
-
-    public CellEditor createPropertyEditor(Composite parent) {
-        CellEditor editor = new CheckboxCellEditor(parent);
-        if (getValidator() != null)
-            editor.setValidator(getValidator());
-        return editor;
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/FontDialogCellEditor.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/FontDialogCellEditor.java
deleted file mode 100644
index e29d6a2..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/FontDialogCellEditor.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.article.views;
-
-import org.eclipse.jface.viewers.DialogCellEditor;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.FontDialog;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * a new Font dialog cell editor.
- * 
- * @author Anthony Hunter
- */
-public class FontDialogCellEditor
-    extends DialogCellEditor {
-
-    /**
-     * Creates a new Font dialog cell editor parented under the given control.
-     * The cell editor value is <code>null</code> initially, and has no
-     * validator.
-     * 
-     * @param parent
-     *            the parent control
-     */
-    protected FontDialogCellEditor(Composite parent) {
-        super(parent);
-    }
-
-    /**
-     * @see org.eclipse.jface.viewers.DialogCellEditor#openDialogBox(Control)
-     */
-    protected Object openDialogBox(Control cellEditorWindow) {
-        FontDialog ftDialog = new FontDialog(PlatformUI.getWorkbench()
-            .getActiveWorkbenchWindow().getShell());
-
-        String value = (String) getValue();
-
-        if ((value != null) && (value.length() > 0)) {
-            ftDialog.setFontList(new FontData[] {new FontData(value)});
-        }
-        FontData fData = ftDialog.open();
-
-        if (fData != null) {
-            value = fData.toString();
-        }
-        return value;
-    }
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/FontPropertyDescriptor.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/FontPropertyDescriptor.java
deleted file mode 100644
index e67d03d..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/FontPropertyDescriptor.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.article.views;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-
-/**
- * A font property descriptor.
- * 
- * @author Anthony Hunter
- */
-public class FontPropertyDescriptor
-    extends PropertyDescriptor {
-
-    /**
-     * Creates an property descriptor with the given id and display name.
-     * 
-     * @param id
-     *            the id of the property
-     * @param displayName
-     *            the name to display for the property
-     */
-    public FontPropertyDescriptor(Object id, String displayName) {
-        super(id, displayName);
-    }
-
-    /**
-     * @see org.eclipse.ui.views.properties.IPropertyDescriptor#createPropertyEditor(Composite)
-     */
-    public CellEditor createPropertyEditor(Composite parent) {
-        CellEditor editor = new FontDialogCellEditor(parent);
-        if (getValidator() != null)
-            editor.setValidator(getValidator());
-        return editor;
-    }
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/FontSection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/FontSection.java
deleted file mode 100644
index 37d12ef..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/FontSection.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.article.views;
-
-import org.eclipse.jface.resource.StringConverter;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FontDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * The font section on the button tab.
- * 
- * @author Anthony Hunter
- */
-public class FontSection
-    extends AbstractPropertySection {
-
-    Text fontText;
-
-    private ButtonElement buttonElement;
-
-    public void setInput(IWorkbenchPart part, ISelection selection) {
-        super.setInput(part, selection);
-        Assert.isTrue(selection instanceof IStructuredSelection);
-        Object input = ((IStructuredSelection) selection).getFirstElement();
-        Assert.isTrue(input instanceof ButtonElement);
-        this.buttonElement = (ButtonElement) input;
-    }
-
-    /**
-     * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite,
-     *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-     */
-    public void createControls(Composite parent,
-            TabbedPropertySheetPage tabbedPropertySheetPage) {
-        super.createControls(parent, tabbedPropertySheetPage);
-        Composite composite = getWidgetFactory()
-            .createFlatFormComposite(parent);
-        FormData data;
-
-        Shell shell = new Shell();
-        GC gc = new GC(shell);
-        gc.setFont(shell.getFont());
-        Point point = gc.textExtent("");//$NON-NLS-1$
-        int buttonHeight = point.y + 5;
-        gc.dispose();
-        shell.dispose();
-
-        CLabel fontLabel = getWidgetFactory().createCLabel(composite, "Font:"); //$NON-NLS-1$
-        fontText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
-        fontText.setEditable(false);
-        Button fontButton = getWidgetFactory().createButton(composite,
-            "Change...", SWT.PUSH); //$NON-NLS-1$
-        fontButton.addSelectionListener(new SelectionAdapter() {
-
-            public void widgetSelected(SelectionEvent event) {
-                FontDialog ftDialog = new FontDialog(PlatformUI.getWorkbench()
-                    .getActiveWorkbenchWindow().getShell());
-
-                FontData fontdata = buttonElement.getControl().getFont()
-                    .getFontData()[0];
-                String value = fontdata.toString();
-
-                if ((value != null) && (value.length() > 0)) {
-                    ftDialog.setFontList(new FontData[] {new FontData(value)});
-                }
-                FontData fData = ftDialog.open();
-
-                if (fData != null) {
-                    value = fData.toString();
-
-                    ButtonElementProperties properties = (ButtonElementProperties) buttonElement
-                        .getAdapter(IPropertySource.class);
-                    properties.setPropertyValue(
-                        ButtonElementProperties.PROPERTY_FONT, value);
-                    fontText.setText(StringConverter.asString(fData));
-                }
-            }
-        });
-
-        data = new FormData();
-        data.left = new FormAttachment(0, 0);
-        data.right = new FormAttachment(fontText,
-            -ITabbedPropertyConstants.HSPACE);
-        data.top = new FormAttachment(0, 0);
-        fontLabel.setLayoutData(data);
-
-        data = new FormData();
-        data.left = new FormAttachment(0, STANDARD_LABEL_WIDTH);
-        data.right = new FormAttachment(fontButton,
-            -ITabbedPropertyConstants.HSPACE);
-        data.top = new FormAttachment(0, 0);
-        fontText.setLayoutData(data);
-
-        data = new FormData();
-        data.right = new FormAttachment(100, 0);
-        data.top = new FormAttachment(0, 0);
-        data.height = buttonHeight;
-        fontButton.setLayoutData(data);
-    }
-
-    /*
-     * @see org.eclipse.ui.views.properties.tabbed.view.ITabbedPropertySection#refresh()
-     */
-    public void refresh() {
-        FontData fontdata = buttonElement.getControl().getFont().getFontData()[0];
-        fontText.setText(StringConverter.asString(fontdata));
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/LabelSection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/LabelSection.java
deleted file mode 100644
index 2fec15f..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/LabelSection.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.article.views;
-
-import org.eclipse.jface.util.Assert;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * The Label section on the Button tab.
- * 
- * @author Anthony Hunter
- */
-public class LabelSection
-    extends AbstractPropertySection {
-
-    private Text labelText;
-
-    private ButtonElement buttonElement;
-
-    private ModifyListener listener = new ModifyListener() {
-
-        public void modifyText(ModifyEvent arg0) {
-            ButtonElementProperties properties = (ButtonElementProperties) buttonElement
-                .getAdapter(IPropertySource.class);
-            properties.setPropertyValue(ButtonElementProperties.PROPERTY_TEXT,
-                labelText.getText());
-        }
-    };
-
-    public void setInput(IWorkbenchPart part, ISelection selection) {
-        super.setInput(part, selection);
-        Assert.isTrue(selection instanceof IStructuredSelection);
-        Object input = ((IStructuredSelection) selection).getFirstElement();
-        Assert.isTrue(input instanceof ButtonElement);
-        this.buttonElement = (ButtonElement) input;
-    }
-
-    public void createControls(Composite parent,
-            TabbedPropertySheetPage aTabbedPropertySheetPage) {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        Composite composite = getWidgetFactory()
-            .createFlatFormComposite(parent);
-        FormData data;
-
-        labelText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
-        data = new FormData();
-        data.left = new FormAttachment(0, STANDARD_LABEL_WIDTH);
-        data.right = new FormAttachment(100, 0);
-        data.top = new FormAttachment(0, ITabbedPropertyConstants.VSPACE);
-        labelText.setLayoutData(data);
-        labelText.addModifyListener(listener);
-
-        CLabel labelLabel = getWidgetFactory()
-            .createCLabel(composite, "Label:"); //$NON-NLS-1$
-        data = new FormData();
-        data.left = new FormAttachment(0, 0);
-        data.right = new FormAttachment(labelText,
-            -ITabbedPropertyConstants.HSPACE);
-        data.top = new FormAttachment(labelText, 0, SWT.CENTER);
-        labelLabel.setLayoutData(data);
-    }
-
-    public void refresh() {
-        labelText.removeModifyListener(listener);
-        ButtonElementProperties properties = (ButtonElementProperties) buttonElement
-            .getAdapter(IPropertySource.class);
-        labelText.setText(properties.strText);
-        labelText.addModifyListener(listener);
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/SampleView.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/SampleView.java
deleted file mode 100644
index 12afc00..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/SampleView.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.article.views;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * Sample view for the example.
- * 
- * @author Anthony Hunter
- *
- */
-public class SampleView
-    extends ViewPart
-    implements ITabbedPropertySheetPageContributor {
-
-    private ListViewer viewer;
-
-    private Group grp1;
-
-    /**
-     * The constructor.
-     */
-    public SampleView() {
-        //
-    }
-
-    /**
-     * This is a callback that will allow us to create the viewer and initialize
-     * it.
-     */
-    public void createPartControl(Composite parent) {
-        // create all the GUI controls
-        // create two groups
-        viewer = new ListViewer(parent, SWT.SINGLE);
-
-        grp1 = new Group(parent, SWT.NONE);
-        grp1.setText("Preview");//$NON-NLS-1$
-        RowLayout rowLayout = new RowLayout();
-        grp1.setLayout(rowLayout);
-
-        Button btn = new Button(grp1, SWT.PUSH);
-        btn.setText("Hello");//$NON-NLS-1$
-
-        // fill in the element
-        ArrayList ctlList = new ArrayList();
-        ButtonElement btnEl = new ButtonElement(btn, "Button");//$NON-NLS-1$
-        ctlList.add(btnEl);
-
-        viewer.setContentProvider(new ArrayContentProvider());
-        viewer.setLabelProvider(new WorkbenchLabelProvider());
-        viewer.setInput(ctlList);
-        getSite().setSelectionProvider(viewer);
-
-    }
-
-    /**
-     * Passing the focus request to the viewer's control.
-     */
-    public void setFocus() {
-        viewer.getControl().setFocus();
-    }
-
-    /**
-     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class)
-     */
-    public Object getAdapter(Class adapter) {
-        if (adapter == IPropertySheetPage.class)
-            return new TabbedPropertySheetPage(this);
-        return super.getAdapter(adapter);
-    }
-
-    /**
-     * @see org.eclipse.ui.IWorkbenchPart#dispose()
-     */
-    public void dispose() {
-        super.dispose();
-    }
-
-    public String getContributorId() {
-        return getSite().getId();
-    }
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/SizePropertySource.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/SizePropertySource.java
deleted file mode 100644
index b206193..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/SizePropertySource.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.article.views;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * Property source for the size properties.
- * 
- * @author Anthony Hunter
- */
-public class SizePropertySource
-    implements IPropertySource {
-
-    protected ButtonElement element;
-
-    /**
-     * The width.
-     */
-    public static String ID_WIDTH = "Width"; //$NON-NLS-1$
-
-    /**
-     * The height.
-     */
-    public static String ID_HEIGHT = "Height"; //$NON-NLS-1$
-
-    protected static IPropertyDescriptor[] descriptors;
-
-    static {
-        descriptors = new IPropertyDescriptor[] {
-            new TextPropertyDescriptor(ID_WIDTH, "width"),//$NON-NLS-1$
-            new TextPropertyDescriptor(ID_HEIGHT, "height")//$NON-NLS-1$
-        };
-    }
-
-    protected Point point = null;
-
-    /**
-     * The constructor for SizePropertySource.
-     * 
-     * @param m_element
-     *            the button element.
-     * @param point
-     *            the size of the button element.
-     */
-    public SizePropertySource(ButtonElement m_element, Point point) {
-        this.point = new Point(point.x, point.y);
-        element = m_element;
-    }
-
-    /**
-     * Fire a property change event.
-     * 
-     * @param propName
-     *            the name of the property change.
-     */
-    protected void firePropertyChanged() {
-        Control ctl = element.getControl();
-
-        if (ctl == null) {
-            // the GUIView is probably hidden in this case
-            return;
-        }
-        ctl.setSize(point);
-    }
-
-    public Object getEditableValue() {
-        return this;
-    }
-
-    public IPropertyDescriptor[] getPropertyDescriptors() {
-        return descriptors;
-    }
-
-    public Object getPropertyValue(Object propName) {
-        if (ID_WIDTH.equals(propName)) {
-            return new String(new Integer(point.x).toString());
-        }
-        if (ID_HEIGHT.equals(propName)) {
-            return new String(new Integer(point.y).toString());
-        }
-        return null;
-    }
-
-    /**
-     * Retrieve the value of the size property.
-     * 
-     * @return the value of the size property.
-     */
-    public Point getValue() {
-        return new Point(point.x, point.y);
-    }
-
-    /**
-     * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(Object)
-     */
-    public boolean isPropertySet(Object propName) {
-        if (ID_WIDTH.equals(propName) || ID_HEIGHT.equals(propName))
-            return true;
-        return false;
-    }
-
-    public void resetPropertyValue(Object propName) {
-        //
-    }
-
-    public void setPropertyValue(Object propName, Object value) {
-        int newInt;
-        try {
-            newInt = Integer.parseInt((String) value);
-        } catch (NumberFormatException e) {
-            newInt = -1;
-        }
-
-        if (newInt > 0) {
-            if (ID_WIDTH.equals(propName)) {
-                point.x = newInt;
-            } else if (ID_HEIGHT.equals(propName)) {
-                point.y = newInt;
-            }
-        }
-        firePropertyChanged();
-    }
-
-    public String toString() {
-        return point.toString();
-    }
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/SizeSection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/SizeSection.java
deleted file mode 100644
index c938e7d..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.article/src/org/eclipse/ui/examples/views/properties/tabbed/article/views/SizeSection.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.article.views;
-
-import org.eclipse.jface.util.Assert;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * The size section on the button tab.
- * 
- * @author Anthony Hunter
- */
-public class SizeSection
-    extends AbstractPropertySection {
-
-    private Text widthText;
-
-    private Text heightText;
-
-    private ButtonElement buttonElement;
-
-    private ModifyListener listener = new ModifyListener() {
-
-        public void modifyText(ModifyEvent arg0) {
-            ButtonElementProperties properties = (ButtonElementProperties) buttonElement
-                .getAdapter(IPropertySource.class);
-            SizePropertySource sizePropertySource = (SizePropertySource) properties
-                .getPropertyValue(ButtonElementProperties.PROPERTY_SIZE);
-            sizePropertySource.setPropertyValue(SizePropertySource.ID_HEIGHT,
-                heightText.getText());
-            sizePropertySource.setPropertyValue(SizePropertySource.ID_WIDTH,
-                widthText.getText());
-        }
-    };
-
-    public void setInput(IWorkbenchPart part, ISelection selection) {
-        super.setInput(part, selection);
-        Assert.isTrue(selection instanceof IStructuredSelection);
-        Object input = ((IStructuredSelection) selection).getFirstElement();
-        Assert.isTrue(input instanceof ButtonElement);
-        this.buttonElement = (ButtonElement) input;
-    }
-
-    /**
-     * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite,
-     *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-     */
-    public void createControls(Composite parent,
-            TabbedPropertySheetPage tabbedPropertySheetPage) {
-        super.createControls(parent, tabbedPropertySheetPage);
-        Composite composite = getWidgetFactory()
-            .createFlatFormComposite(parent);
-        FormData data;
-
-        CLabel widthLabel = getWidgetFactory()
-            .createCLabel(composite, "Width:"); //$NON-NLS-1$
-        widthText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
-        CLabel heightLabel = getWidgetFactory().createCLabel(composite,
-            "Height:"); //$NON-NLS-1$
-        heightText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
-
-        data = new FormData();
-        data.left = new FormAttachment(0, 0);
-        data.right = new FormAttachment(widthText,
-            -ITabbedPropertyConstants.HSPACE);
-        data.top = new FormAttachment(0, 0);
-        widthLabel.setLayoutData(data);
-
-        data = new FormData();
-        data.left = new FormAttachment(0, STANDARD_LABEL_WIDTH);
-        data.right = new FormAttachment(heightLabel,
-            -ITabbedPropertyConstants.HSPACE);
-        data.top = new FormAttachment(0, 0);
-        widthText.setLayoutData(data);
-
-        data = new FormData();
-        data.left = new FormAttachment(50, 0);
-        // data.right = new FormAttachment(heightText,
-        // -ITabbedPropertyConstants.HSPACE);
-        data.top = new FormAttachment(0, 0);
-        heightLabel.setLayoutData(data);
-
-        data = new FormData();
-        data.left = new FormAttachment(heightLabel,
-            ITabbedPropertyConstants.HSPACE);
-        data.right = new FormAttachment(100, 0);
-        data.top = new FormAttachment(0, 0);
-        heightText.setLayoutData(data);
-
-        heightText.addModifyListener(listener);
-        widthText.addModifyListener(listener);
-    }
-
-    /*
-     * @see org.eclipse.ui.views.properties.tabbed.view.ITabbedPropertySection#refresh()
-     */
-    public void refresh() {
-        heightText.removeModifyListener(listener);
-        widthText.removeModifyListener(listener);
-        ButtonElementProperties properties = (ButtonElementProperties) buttonElement
-            .getAdapter(IPropertySource.class);
-        widthText.setText(Integer.toString(properties.ptSize.x));
-        heightText.setText(Integer.toString(properties.ptSize.y));
-        heightText.addModifyListener(listener);
-        widthText.addModifyListener(listener);
-    }
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.classpath b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.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/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.cvsignore b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.project b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.project
deleted file mode 100644
index 2a990e3..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.examples.views.properties.tabbed.hockeyleague</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/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index d192053..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,78 +0,0 @@
-#Mon Feb 06 11:18:18 EST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.settings/org.eclipse.jdt.ui.prefs b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 4ba0331..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Tue Jan 31 19:05:26 EST 2006
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} The ${bare_field_name} to set.\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n ******************************************************************************/\r\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @since 3.2\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template></templates>
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.settings/org.eclipse.pde.prefs b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index b5e946b..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,15 +0,0 @@
-#Tue Jan 31 19:06:32 EST 2006
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.illegal-att-value=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=1
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/META-INF/MANIFEST.MF b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/META-INF/MANIFEST.MF
deleted file mode 100644
index d130c83..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,23 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ui.examples.views.properties.tabbed.hockeyleague; singleton:=true
-Bundle-Version: 3.2.0.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePlugin$Implementation
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.ui.examples.views.properties.tabbed.hockeyleague,
- org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl,
- org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.provider,
- org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.util
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.core.resources;visibility:=reexport,
- org.eclipse.emf.ecore;visibility:=reexport,
- org.eclipse.emf.edit;visibility:=reexport,
- org.eclipse.emf.ecore.xmi;visibility:=reexport,
- org.eclipse.ui.ide;visibility:=reexport,
- org.eclipse.ui,
- org.eclipse.emf.edit.ui,
- org.eclipse.ui.views.properties.tabbed
-Eclipse-LazyStart: true
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/about.html b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/about.html
deleted file mode 100644
index 4602330..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/build.properties b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/build.properties
deleted file mode 100644
index c762af9..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/build.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-bin.includes = .,\
-               model/,\
-               META-INF/,\
-               plugin.xml,\
-               plugin.properties,\
-               about.html,\
-               icons/
-jars.compile.order = .
-source.. = src/
-output.. = bin/
-src.includes = about.html
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateDefence_playerStats_PlayerStats.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateDefence_playerStats_PlayerStats.gif
deleted file mode 100644
index e2dee68..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateDefence_playerStats_PlayerStats.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateForward_playerStats_PlayerStats.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateForward_playerStats_PlayerStats.gif
deleted file mode 100644
index e2dee68..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateForward_playerStats_PlayerStats.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateGoalie_goalieStats_GoalieStats.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateGoalie_goalieStats_GoalieStats.gif
deleted file mode 100644
index e2dee68..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateGoalie_goalieStats_GoalieStats.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateLeague_teams_Team.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateLeague_teams_Team.gif
deleted file mode 100644
index bff88cb..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateLeague_teams_Team.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateTeam_arena_Arena.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateTeam_arena_Arena.gif
deleted file mode 100644
index 6accb2c..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateTeam_arena_Arena.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateTeam_defencemen_Defence.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateTeam_defencemen_Defence.gif
deleted file mode 100644
index 464f798..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateTeam_defencemen_Defence.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateTeam_forwards_Forward.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateTeam_forwards_Forward.gif
deleted file mode 100644
index e0592df..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateTeam_forwards_Forward.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateTeam_goalies_Goalie.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateTeam_goalies_Goalie.gif
deleted file mode 100644
index 4cfbb15..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/ctool16/CreateTeam_goalies_Goalie.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Arena.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Arena.gif
deleted file mode 100644
index 6accb2c..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Arena.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Defence.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Defence.gif
deleted file mode 100644
index 464f798..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Defence.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Forward.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Forward.gif
deleted file mode 100644
index e0592df..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Forward.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Goalie.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Goalie.gif
deleted file mode 100644
index 4cfbb15..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Goalie.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/GoalieStats.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/GoalieStats.gif
deleted file mode 100644
index e2dee68..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/GoalieStats.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Height.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Height.gif
deleted file mode 100644
index aa8f0a7..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Height.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/HockeyleagueModelFile.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/HockeyleagueModelFile.gif
deleted file mode 100644
index 415a3b6..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/HockeyleagueModelFile.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/HockeyleagueObject.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/HockeyleagueObject.gif
deleted file mode 100644
index ed87474..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/HockeyleagueObject.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/League.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/League.gif
deleted file mode 100644
index b93bab8..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/League.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Player.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Player.gif
deleted file mode 100644
index fe89f46..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Player.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/PlayerStats.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/PlayerStats.gif
deleted file mode 100644
index e2dee68..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/PlayerStats.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Team.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Team.gif
deleted file mode 100644
index bff88cb..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Team.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Weight.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Weight.gif
deleted file mode 100644
index 5d660e7..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/obj16/Weight.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/wizban/NewHockeyleague.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/wizban/NewHockeyleague.gif
deleted file mode 100644
index acfcd36..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/full/wizban/NewHockeyleague.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/hockeyleague.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/hockeyleague.gif
deleted file mode 100644
index b93bab8..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/icons/hockeyleague.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/model/hockeyleague.ecore b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/model/hockeyleague.ecore
deleted file mode 100644
index cac12ba..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/model/hockeyleague.ecore
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague"
-    nsURI="http:///org/eclipse/ui/views/properties/tabbed/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore"
-    nsPrefix="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague">
-  <eClassifiers xsi:type="ecore:EClass" name="Arena" eSuperTypes="#//HockeyleagueObject">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="address" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="capacity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Defence" eSuperTypes="#//Player">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="position" eType="#//DefencePositionKind"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="playerStats" upperBound="-1"
-        eType="#//PlayerStats" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Forward" eSuperTypes="#//Player">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="position" eType="#//ForwardPositionKind"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="playerStats" upperBound="-1"
-        eType="#//PlayerStats" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Goalie" eSuperTypes="#//Player">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="goalieStats" upperBound="-1"
-        eType="#//GoalieStats" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GoalieStats">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="year" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="team" eType="#//Team"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="gamesPlayedIn" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minutesPlayedIn" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="goalsAgainstAverage" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFloat"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="wins" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="losses" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="ties" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="emptyNetGoals" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="shutouts" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="goalsAgainst" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="saves" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="penaltyMinutes" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="goals" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="assists" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="points" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="HockeyleagueObject" abstract="true">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="League" eSuperTypes="#//HockeyleagueObject">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="headoffice" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="teams" upperBound="-1"
-        eType="#//Team" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Player" abstract="true" eSuperTypes="#//HockeyleagueObject">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="birthplace" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="number" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="heightMesurement" eType="#//HeightKind"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="heightValue" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="weightMesurement" eType="#//WeightKind"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="weightValue" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="shot" eType="#//ShotKind"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="birthdate" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PlayerStats">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="year" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="team" eType="#//Team"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="gamesPlayedIn" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="goals" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="assists" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="points" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="plusMinus" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="penaltyMinutes" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="powerPlayGoals" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="shortHandedGoals" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="gameWinningGoals" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="shots" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="shotPercentage" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFloat"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Team" eSuperTypes="#//HockeyleagueObject">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="forwards" upperBound="-1"
-        eType="#//Forward" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defencemen" upperBound="-1"
-        eType="#//Defence" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="goalies" upperBound="-1"
-        eType="#//Goalie" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="arena" eType="#//Arena"
-        containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="DefencePositionKind">
-    <eLiterals name="left_defence"/>
-    <eLiterals name="right_defence" value="1"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="ForwardPositionKind">
-    <eLiterals name="left_wing"/>
-    <eLiterals name="right_wing" value="1"/>
-    <eLiterals name="center" value="2"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="HeightKind">
-    <eLiterals name="inches"/>
-    <eLiterals name="centimeters" value="1"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="ShotKind">
-    <eLiterals name="left"/>
-    <eLiterals name="right" value="1"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="WeightKind">
-    <eLiterals name="pounds"/>
-    <eLiterals name="kilograms" value="1"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/model/hockeyleague.genmodel b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/model/hockeyleague.genmodel
deleted file mode 100644
index 89d2557..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/model/hockeyleague.genmodel
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src"
-    modelPluginID="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague" modelName="Hockeyleague"
-    nonNLSMarkers="true" importerID="org.eclipse.emf.importer.ecore">
-  <genPackages prefix="Hockeyleague" disposableProviderFactory="true" ecorePackage="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#/">
-    <genEnums ecoreEnum="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//DefencePositionKind">
-      <genEnumLiterals ecoreEnumLiteral="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//DefencePositionKind/left_defence"/>
-      <genEnumLiterals ecoreEnumLiteral="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//DefencePositionKind/right_defence"/>
-    </genEnums>
-    <genEnums ecoreEnum="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//ForwardPositionKind">
-      <genEnumLiterals ecoreEnumLiteral="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//ForwardPositionKind/left_wing"/>
-      <genEnumLiterals ecoreEnumLiteral="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//ForwardPositionKind/right_wing"/>
-      <genEnumLiterals ecoreEnumLiteral="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//ForwardPositionKind/center"/>
-    </genEnums>
-    <genEnums ecoreEnum="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//HeightKind">
-      <genEnumLiterals ecoreEnumLiteral="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//HeightKind/inches"/>
-      <genEnumLiterals ecoreEnumLiteral="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//HeightKind/centimeters"/>
-    </genEnums>
-    <genEnums ecoreEnum="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//ShotKind">
-      <genEnumLiterals ecoreEnumLiteral="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//ShotKind/left"/>
-      <genEnumLiterals ecoreEnumLiteral="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//ShotKind/right"/>
-    </genEnums>
-    <genEnums ecoreEnum="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//WeightKind">
-      <genEnumLiterals ecoreEnumLiteral="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//WeightKind/pounds"/>
-      <genEnumLiterals ecoreEnumLiteral="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//WeightKind/kilograms"/>
-    </genEnums>
-    <genClasses ecoreClass="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Arena">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Arena/address"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Arena/capacity"/>
-    </genClasses>
-    <genClasses ecoreClass="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Defence">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Defence/position"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Defence/playerStats"/>
-    </genClasses>
-    <genClasses ecoreClass="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Forward">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Forward/position"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Forward/playerStats"/>
-    </genClasses>
-    <genClasses ecoreClass="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Goalie">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Goalie/goalieStats"/>
-    </genClasses>
-    <genClasses ecoreClass="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/year"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/team"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/gamesPlayedIn"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/minutesPlayedIn"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/goalsAgainstAverage"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/wins"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/losses"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/ties"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/emptyNetGoals"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/shutouts"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/goalsAgainst"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/saves"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/penaltyMinutes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/goals"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/assists"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//GoalieStats/points"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//HockeyleagueObject">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//HockeyleagueObject/name"/>
-    </genClasses>
-    <genClasses ecoreClass="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//League">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//League/headoffice"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//League/teams"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Player">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Player/birthplace"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Player/number"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Player/heightMesurement"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Player/heightValue"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Player/weightMesurement"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Player/weightValue"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Player/shot"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Player/birthdate"/>
-    </genClasses>
-    <genClasses ecoreClass="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//PlayerStats">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//PlayerStats/year"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//PlayerStats/team"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//PlayerStats/gamesPlayedIn"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//PlayerStats/goals"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//PlayerStats/assists"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//PlayerStats/points"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//PlayerStats/plusMinus"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//PlayerStats/penaltyMinutes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//PlayerStats/powerPlayGoals"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//PlayerStats/shortHandedGoals"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//PlayerStats/gameWinningGoals"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//PlayerStats/shots"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//PlayerStats/shotPercentage"/>
-    </genClasses>
-    <genClasses ecoreClass="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Team">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Team/forwards"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Team/defencemen"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Team/goalies"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore#//Team/arena"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/plugin.properties b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/plugin.properties
deleted file mode 100644
index 1c573a9..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/plugin.properties
+++ /dev/null
@@ -1,146 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-pluginName = Tabbed Properties View
-providerName = Eclipse.org
-
-_UI_CreateChild_text = {0}
-_UI_CreateChild_text2 = {1} {0}
-_UI_CreateChild_text3 = {1}
-_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
-_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
-_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.
-
-_UI_PropertyDescriptor_description = The {0} of the {1}
-
-_UI_Arena_type = Arena
-_UI_Defence_type = Defence
-_UI_Forward_type = Forward
-_UI_Goalie_type = Goalie
-_UI_GoalieStats_type = Goalie Stats
-_UI_HockeyleagueObject_type = Object
-_UI_League_type = League
-_UI_Player_type = Player
-_UI_PlayerStats_type = Player Stats
-_UI_Team_type = Team
-_UI_Unknown_type = Object
-
-_UI_Unknown_datatype= Value
-
-_UI_Arena_address_feature = Address
-_UI_Arena_capacity_feature = Capacity
-_UI_Defence_position_feature = Position
-_UI_Defence_playerStats_feature = Player Stats
-_UI_Forward_position_feature = Position
-_UI_Forward_playerStats_feature = Player Stats
-_UI_Goalie_goalieStats_feature = Goalie Stats
-_UI_GoalieStats_year_feature = Year
-_UI_GoalieStats_team_feature = Team
-_UI_GoalieStats_gamesPlayedIn_feature = Games Played In
-_UI_GoalieStats_minutesPlayedIn_feature = Minutes Played In
-_UI_GoalieStats_goalsAgainstAverage_feature = Goals Against Average
-_UI_GoalieStats_wins_feature = Wins
-_UI_GoalieStats_losses_feature = Losses
-_UI_GoalieStats_ties_feature = Ties
-_UI_GoalieStats_emptyNetGoals_feature = Empty Net Goals
-_UI_GoalieStats_shutouts_feature = Shutouts
-_UI_GoalieStats_goalsAgainst_feature = Goals Against
-_UI_GoalieStats_saves_feature = Saves
-_UI_GoalieStats_penaltyMinutes_feature = Penalty Minutes
-_UI_GoalieStats_goals_feature = Goals
-_UI_GoalieStats_assists_feature = Assists
-_UI_GoalieStats_points_feature = Points
-_UI_HockeyleagueObject_name_feature = Name
-_UI_League_headoffice_feature = Headoffice
-_UI_League_teams_feature = Teams
-_UI_Player_birthplace_feature = Birthplace
-_UI_Player_number_feature = Number
-_UI_Player_heightMesurement_feature = Height Mesurement
-_UI_Player_heightValue_feature = Height Value
-_UI_Player_weightMesurement_feature = Weight Mesurement
-_UI_Player_weightValue_feature = Weight Value
-_UI_Player_shot_feature = Shot
-_UI_Player_birthdate_feature = Birthdate
-_UI_PlayerStats_year_feature = Year
-_UI_PlayerStats_team_feature = Team
-_UI_PlayerStats_gamesPlayedIn_feature = Games Played In
-_UI_PlayerStats_goals_feature = Goals
-_UI_PlayerStats_assists_feature = Assists
-_UI_PlayerStats_points_feature = Points
-_UI_PlayerStats_plusMinus_feature = Plus Minus
-_UI_PlayerStats_penaltyMinutes_feature = Penalty Minutes
-_UI_PlayerStats_powerPlayGoals_feature = Power Play Goals
-_UI_PlayerStats_shortHandedGoals_feature = Short Handed Goals
-_UI_PlayerStats_gameWinningGoals_feature = Game Winning Goals
-_UI_PlayerStats_shots_feature = Shots
-_UI_PlayerStats_shotPercentage_feature = Shot Percentage
-_UI_Team_forwards_feature = Forwards
-_UI_Team_defencemen_feature = Defencemen
-_UI_Team_goalies_feature = Goalies
-_UI_Team_arena_feature = Arena
-_UI_Unknown_feature = Unspecified
-
-_UI_DefencePositionKind_left_defence_literal = left_defence
-_UI_DefencePositionKind_right_defence_literal = right_defence
-_UI_ForwardPositionKind_left_wing_literal = left_wing
-_UI_ForwardPositionKind_right_wing_literal = right_wing
-_UI_ForwardPositionKind_center_literal = center
-_UI_HeightKind_inches_literal = inches
-_UI_HeightKind_centimeters_literal = centimeters
-_UI_ShotKind_left_literal = left
-_UI_ShotKind_right_literal = right
-_UI_WeightKind_pounds_literal = pounds
-_UI_WeightKind_kilograms_literal = kilograms
-
-_UI_HockeyleagueEditor_menu = &Hockeyleague Editor
-
-_UI_CreateChild_menu_item = &New Child
-_UI_CreateSibling_menu_item = N&ew Sibling
-
-_UI_ShowPropertiesView_menu_item = Show &Properties View
-_UI_RefreshViewer_menu_item = &Refresh
-
-_UI_SelectionPage_label = Selection
-_UI_ParentPage_label = Parent
-_UI_ListPage_label = List
-_UI_TreePage_label = Tree
-_UI_TablePage_label = Table
-_UI_TreeWithColumnsPage_label = Tree with Columns
-_UI_ObjectColumn_label = Object
-_UI_SelfColumn_label = Self
-
-_UI_NoObjectSelected = Selected Nothing
-_UI_SingleObjectSelected = Selected Object: {0}
-_UI_MultiObjectSelected = Selected {0} Objects
-
-_UI_OpenEditorError_label = Open Editor
-
-_UI_Wizard_category = Example EMF Model Creation Wizards
-
-_UI_HockeyleagueModelWizard_label = Hockeyleague Model
-_UI_HockeyleagueModelWizard_description = Create a new Hockeyleague model
-
-_UI_HockeyleagueEditor_label = Hockeyleague Model Editor
-
-_UI_HockeyleagueEditorFilenameDefaultBase = My
-_UI_HockeyleagueEditorFilenameExtension = org.eclipse.ui.examples.views.properties.tabbed.hockeyleague
-
-_UI_Wizard_label = New
-
-_WARN_FilenameExtension = The file name must end in ".{0}"
-
-_UI_ModelObject = Model Object
-_UI_XMLEncoding = XML Encoding
-_UI_XMLEncodingChoices = UTF-8 ASCII UTF-16 UTF-16BE UTF-16LE ISO-8859-1
-_UI_Wizard_initial_object_description = Select a model object to create
-
-_UI_FileConflict_label = File Conflict
-_WARN_FileConflict = There are unsaved changes that conflict with changes made outside the editor.  Do you wish to discard this editor's changes?
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/plugin.xml b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/plugin.xml
deleted file mode 100644
index 224f19f..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/plugin.xml
+++ /dev/null
@@ -1,304 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-
-<plugin>
-
-  <extension point="org.eclipse.emf.ecore.generated_package">
-    <package 
-       uri = "http:///org/eclipse/ui/views/properties/tabbed/examples/hockeyleague.ecore" 
-       class = "org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage"
-       genModel = "model/hockeyleague.genmodel" /> 
-  </extension>
-
-  <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories">
-    <factory 
-       uri = "http:///org/eclipse/ui/views/properties/tabbed/examples/hockeyleague.ecore" 
-       class = "org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.provider.HockeyleagueItemProviderAdapterFactory" 
-       supportedTypes = 
-         "org.eclipse.emf.edit.provider.IEditingDomainItemProvider
-          org.eclipse.emf.edit.provider.IStructuredItemContentProvider
-          org.eclipse.emf.edit.provider.ITreeItemContentProvider
-          org.eclipse.emf.edit.provider.IItemLabelProvider
-          org.eclipse.emf.edit.provider.IItemPropertySource" />
-  </extension>
-
-   <extension
-         point="org.eclipse.ui.newWizards">
-      <category
-            name="Tabbed Properties View Examples"
-            parentCategory="org.eclipse.ui.Examples"
-            id="org.eclipse.ui.views.properties.tabbed">
-      </category>
-      <wizard
-            name="Tabbed Properties View Hockey League Example Project"
-            icon="icons/hockeyleague.gif"
-            category="org.eclipse.ui.Examples/org.eclipse.ui.views.properties.tabbed"
-            class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.wizards.NewHockeyleagueProjectWizard"
-            project="true"
-            id="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.wizards.NewHockeyleagueProjectWizard">
-         <description>
-            Create a new Tabbed Properties View Hockey League Example Project
-         </description>
-      </wizard>
-      <wizard
-            name="Tabbed Properties View Hockey League Example File"
-            icon="icons/hockeyleague.gif"
-            category="org.eclipse.ui.Examples/org.eclipse.ui.views.properties.tabbed"
-            class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.wizards.NewHockeyleagueFileWizard"
-            id="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.wizards.NewHockeyleagueFileWizard">
-         <description>
-            Create a new Tabbed Properties View Hockey League Example File
-         </description>
-         <selection
-               class="org.eclipse.core.resources.IResource">
-         </selection>
-      </wizard>
-   </extension>
-   <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            name="Hockey League Editor"
-            icon="icons/hockeyleague.gif"
-            extensions="hockeyleague"
-            contributorClass="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.editor.HockeyleagueActionBarContributor"
-            class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.editor.HockeyleagueEditor"
-            id="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.editor.HockeyleagueEditor">
-      </editor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-      <propertyContributor
-            labelProvider="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.HockeyleagueLabelProvider"
-            contributorId="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague">
-         <propertyCategory
-               category="default">
-         </propertyCategory>
-         <propertyCategory
-               category="advanced">
-         </propertyCategory>
-      </propertyContributor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
-      <propertyTabs
-            contributorId="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague">
-         <propertyTab
-               label="Advanced"
-               category="advanced"
-               id="hockeyleague.tab.Advanced">
-         </propertyTab>
-         <propertyTab
-               label="General"
-               category="default"
-               id="hockeyleague.tab.General">
-         </propertyTab>
-         <propertyTab
-               label="Born"
-               category="default"
-               afterTab="hockeyleague.tab.General"
-               id="hockeyleague.tab.Born">
-         </propertyTab>
-         <propertyTab
-               label="Measurements"
-               category="default"
-               afterTab="hockeyleague.tab.Born"
-               id="hockeyleague.tab.Measurements">
-         </propertyTab>
-         <propertyTab
-               label="Forwards"
-               category="default"
-               afterTab="hockeyleague.tab.Measurements"
-               id="hockeyleague.tab.Forwards">
-         </propertyTab>
-         <propertyTab
-               label="Defencemen"
-               category="default"
-               afterTab="hockeyleague.tab.Measurements"
-               id="hockeyleague.tab.Defencemen">
-         </propertyTab>
-         <propertyTab
-               label="Goalies"
-               category="default"
-               afterTab="hockeyleague.tab.Measurements"
-               id="hockeyleague.tab.Goalies">
-         </propertyTab>
-         <propertyTab
-               label="Statistics"
-               category="default"
-               afterTab="hockeyleague.tab.Measurements"
-               id="hockeyleague.tab.Statistics">
-         </propertyTab>
-         <propertyTab
-               label="Teams"
-               category="default"
-               afterTab="hockeyleague.tab.General"
-               id="hockeyleague.tab.Teams">
-         </propertyTab>
-      </propertyTabs>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertySections">
-      <propertySections
-            contributorId="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague">
-         <propertySection
-               tab="hockeyleague.tab.General"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.NamePropertySection"
-               id="hockeyleague.section.Name">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueObject">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.Advanced"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AdvancedPropertySection"
-               id="hockeyleague.section.Advanced">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueObject">
-            </input>
-            <input type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats"/>
-            <input type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats"/>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.General"
-               afterSection="hockeyleague.section.Name"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AddressPropertySection"
-               id="hockeyleague.section.Address">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.General"
-               afterSection="hockeyleague.section.Name"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.HeadOfficePropertySection"
-               id="hockeyleague.section.Headoffice">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.General"
-               afterSection="hockeyleague.section.Name"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.NumberPropertySection"
-               id="hockeyleague.section.Number">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.General"
-               afterSection="hockeyleague.section.Number"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.ShotPropertySection"
-               id="hockeyleague.section.Shot">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.General"
-               afterSection="hockeyleague.section.Address"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.CapacityPropertySection"
-               id="hockeyleague.section.Capacity">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.Born"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.BirthDatePropertySection"
-               id="hockeyleague.section.BirthDate">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.Born"
-               afterSection="hockeyleague.section.BirthDate"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.BirthPlacePropertySection"
-               id="hockeyleague.section.BirthPlace">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.Measurements"
-               afterSection="hockeyleague.section.Weight"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.HeightPropertySection"
-               id="hockeyleague.section.Height">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.Measurements"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.WeightPropertySection"
-               id="hockeyleague.section.Weight">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.Forwards"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.ForwardsPropertySection"
-               id="hockeyleague.section.Forwards">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.Goalies"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.GoaliesPropertySection"
-               id="hockeyleague.section.Goalies">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.Defencemen"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.DefencemenPropertySection"
-               id="hockeyleague.section.Defencemen">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.Teams"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.TeamsPropertySection"
-               id="hockeyleague.section.Teams">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.Statistics"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.PlayerStatsPropertySection"
-               id="hockeyleague.section.PlayerStats">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward">
-            </input>
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.General"
-               afterSection="hockeyleague.section.Shot"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.ForwardPositionPropertySection"
-               id="hockeyleague.section.ForwardPosition">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="hockeyleague.tab.General"
-               afterSection="hockeyleague.section.Shot"
-               class="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.DefencePositionPropertySection"
-               id="hockeyleague.section.DefencePosition">
-            <input
-                  type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence">
-            </input>
-         </propertySection>
-      </propertySections>
-   </extension>
-</plugin>
-
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Arena.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Arena.java
deleted file mode 100644
index 33db219..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Arena.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Arena</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena#getAddress <em>Address</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena#getCapacity <em>Capacity</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getArena()
- * @model
- * @generated
- */
-public interface Arena extends HockeyleagueObject {
-	/**
-	 * Returns the value of the '<em><b>Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Address</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Address</em>' attribute.
-	 * @see #setAddress(String)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getArena_Address()
-	 * @model
-	 * @generated
-	 */
-	String getAddress();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena#getAddress <em>Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Address</em>' attribute.
-	 * @see #getAddress()
-	 * @generated
-	 */
-	void setAddress(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Capacity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Capacity</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Capacity</em>' attribute.
-	 * @see #setCapacity(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getArena_Capacity()
-	 * @model
-	 * @generated
-	 */
-	int getCapacity();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena#getCapacity <em>Capacity</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Capacity</em>' attribute.
-	 * @see #getCapacity()
-	 * @generated
-	 */
-	void setCapacity(int value);
-
-} // Arena
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Defence.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Defence.java
deleted file mode 100644
index a15edb2..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Defence.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Defence</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence#getPosition <em>Position</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence#getPlayerStats <em>Player Stats</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getDefence()
- * @model
- * @generated
- */
-public interface Defence extends Player {
-	/**
-	 * Returns the value of the '<em><b>Position</b></em>' attribute.
-	 * The literals are from the enumeration {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.DefencePositionKind}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Position</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Position</em>' attribute.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.DefencePositionKind
-	 * @see #setPosition(DefencePositionKind)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getDefence_Position()
-	 * @model
-	 * @generated
-	 */
-	DefencePositionKind getPosition();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence#getPosition <em>Position</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Position</em>' attribute.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.DefencePositionKind
-	 * @see #getPosition()
-	 * @generated
-	 */
-	void setPosition(DefencePositionKind value);
-
-	/**
-	 * Returns the value of the '<em><b>Player Stats</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Player Stats</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Player Stats</em>' containment reference list.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getDefence_PlayerStats()
-	 * @model type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats" containment="true"
-	 * @generated
-	 */
-	EList getPlayerStats();
-
-} // Defence
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/DefencePositionKind.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/DefencePositionKind.java
deleted file mode 100644
index 0f68acd..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/DefencePositionKind.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Defence Position Kind</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getDefencePositionKind()
- * @model
- * @generated
- */
-public final class DefencePositionKind extends AbstractEnumerator {
-	/**
-	 * The '<em><b>Left defence</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Left defence</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #LEFT_DEFENCE_LITERAL
-	 * @model name="left_defence"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int LEFT_DEFENCE = 0;
-
-	/**
-	 * The '<em><b>Right defence</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Right defence</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #RIGHT_DEFENCE_LITERAL
-	 * @model name="right_defence"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int RIGHT_DEFENCE = 1;
-
-	/**
-	 * The '<em><b>Left defence</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LEFT_DEFENCE
-	 * @generated
-	 * @ordered
-	 */
-	public static final DefencePositionKind LEFT_DEFENCE_LITERAL = new DefencePositionKind(LEFT_DEFENCE, "left_defence", "left_defence"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Right defence</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #RIGHT_DEFENCE
-	 * @generated
-	 * @ordered
-	 */
-	public static final DefencePositionKind RIGHT_DEFENCE_LITERAL = new DefencePositionKind(RIGHT_DEFENCE, "right_defence", "right_defence"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * An array of all the '<em><b>Defence Position Kind</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final DefencePositionKind[] VALUES_ARRAY =
-		new DefencePositionKind[] {
-			LEFT_DEFENCE_LITERAL,
-			RIGHT_DEFENCE_LITERAL,
-		};
-
-	/**
-	 * A public read-only list of all the '<em><b>Defence Position Kind</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>Defence Position Kind</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static DefencePositionKind get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			DefencePositionKind result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Defence Position Kind</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static DefencePositionKind getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			DefencePositionKind result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Defence Position Kind</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static DefencePositionKind get(int value) {
-		switch (value) {
-			case LEFT_DEFENCE: return LEFT_DEFENCE_LITERAL;
-			case RIGHT_DEFENCE: return RIGHT_DEFENCE_LITERAL;
-		}
-		return null;	
-	}
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private DefencePositionKind(int value, String name, String literal) {
-		super(value, name, literal);
-	}
-
-} //DefencePositionKind
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Forward.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Forward.java
deleted file mode 100644
index 3ebed14..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Forward.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Forward</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward#getPosition <em>Position</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward#getPlayerStats <em>Player Stats</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getForward()
- * @model
- * @generated
- */
-public interface Forward extends Player {
-	/**
-	 * Returns the value of the '<em><b>Position</b></em>' attribute.
-	 * The literals are from the enumeration {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ForwardPositionKind}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Position</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Position</em>' attribute.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ForwardPositionKind
-	 * @see #setPosition(ForwardPositionKind)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getForward_Position()
-	 * @model
-	 * @generated
-	 */
-	ForwardPositionKind getPosition();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward#getPosition <em>Position</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Position</em>' attribute.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ForwardPositionKind
-	 * @see #getPosition()
-	 * @generated
-	 */
-	void setPosition(ForwardPositionKind value);
-
-	/**
-	 * Returns the value of the '<em><b>Player Stats</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Player Stats</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Player Stats</em>' containment reference list.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getForward_PlayerStats()
-	 * @model type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats" containment="true"
-	 * @generated
-	 */
-	EList getPlayerStats();
-
-} // Forward
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ForwardPositionKind.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ForwardPositionKind.java
deleted file mode 100644
index 9a4be03..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ForwardPositionKind.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Forward Position Kind</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getForwardPositionKind()
- * @model
- * @generated
- */
-public final class ForwardPositionKind extends AbstractEnumerator {
-	/**
-	 * The '<em><b>Left wing</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Left wing</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #LEFT_WING_LITERAL
-	 * @model name="left_wing"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int LEFT_WING = 0;
-
-	/**
-	 * The '<em><b>Right wing</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Right wing</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #RIGHT_WING_LITERAL
-	 * @model name="right_wing"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int RIGHT_WING = 1;
-
-	/**
-	 * The '<em><b>Center</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Center</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #CENTER_LITERAL
-	 * @model name="center"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int CENTER = 2;
-
-	/**
-	 * The '<em><b>Left wing</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LEFT_WING
-	 * @generated
-	 * @ordered
-	 */
-	public static final ForwardPositionKind LEFT_WING_LITERAL = new ForwardPositionKind(LEFT_WING, "left_wing", "left_wing"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Right wing</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #RIGHT_WING
-	 * @generated
-	 * @ordered
-	 */
-	public static final ForwardPositionKind RIGHT_WING_LITERAL = new ForwardPositionKind(RIGHT_WING, "right_wing", "right_wing"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Center</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #CENTER
-	 * @generated
-	 * @ordered
-	 */
-	public static final ForwardPositionKind CENTER_LITERAL = new ForwardPositionKind(CENTER, "center", "center"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * An array of all the '<em><b>Forward Position Kind</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final ForwardPositionKind[] VALUES_ARRAY =
-		new ForwardPositionKind[] {
-			LEFT_WING_LITERAL,
-			RIGHT_WING_LITERAL,
-			CENTER_LITERAL,
-		};
-
-	/**
-	 * A public read-only list of all the '<em><b>Forward Position Kind</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>Forward Position Kind</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static ForwardPositionKind get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			ForwardPositionKind result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Forward Position Kind</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static ForwardPositionKind getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			ForwardPositionKind result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Forward Position Kind</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static ForwardPositionKind get(int value) {
-		switch (value) {
-			case LEFT_WING: return LEFT_WING_LITERAL;
-			case RIGHT_WING: return RIGHT_WING_LITERAL;
-			case CENTER: return CENTER_LITERAL;
-		}
-		return null;	
-	}
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private ForwardPositionKind(int value, String name, String literal) {
-		super(value, name, literal);
-	}
-
-} //ForwardPositionKind
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Goalie.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Goalie.java
deleted file mode 100644
index 6e287c5..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Goalie.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Goalie</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie#getGoalieStats <em>Goalie Stats</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalie()
- * @model
- * @generated
- */
-public interface Goalie extends Player {
-	/**
-	 * Returns the value of the '<em><b>Goalie Stats</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Goalie Stats</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Goalie Stats</em>' containment reference list.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalie_GoalieStats()
-	 * @model type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats" containment="true"
-	 * @generated
-	 */
-	EList getGoalieStats();
-
-} // Goalie
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/GoalieStats.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/GoalieStats.java
deleted file mode 100644
index f2eed7a..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/GoalieStats.java
+++ /dev/null
@@ -1,463 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Goalie Stats</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getYear <em>Year</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getTeam <em>Team</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGamesPlayedIn <em>Games Played In</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getMinutesPlayedIn <em>Minutes Played In</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGoalsAgainstAverage <em>Goals Against Average</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getWins <em>Wins</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getLosses <em>Losses</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getTies <em>Ties</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getEmptyNetGoals <em>Empty Net Goals</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getShutouts <em>Shutouts</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGoalsAgainst <em>Goals Against</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getSaves <em>Saves</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getPenaltyMinutes <em>Penalty Minutes</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGoals <em>Goals</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getAssists <em>Assists</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getPoints <em>Points</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats()
- * @model
- * @generated
- */
-public interface GoalieStats extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Year</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Year</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Year</em>' attribute.
-	 * @see #setYear(String)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_Year()
-	 * @model
-	 * @generated
-	 */
-	String getYear();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getYear <em>Year</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Year</em>' attribute.
-	 * @see #getYear()
-	 * @generated
-	 */
-	void setYear(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Team</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Team</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Team</em>' reference.
-	 * @see #setTeam(Team)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_Team()
-	 * @model
-	 * @generated
-	 */
-	Team getTeam();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getTeam <em>Team</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Team</em>' reference.
-	 * @see #getTeam()
-	 * @generated
-	 */
-	void setTeam(Team value);
-
-	/**
-	 * Returns the value of the '<em><b>Games Played In</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Games Played In</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Games Played In</em>' attribute.
-	 * @see #setGamesPlayedIn(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_GamesPlayedIn()
-	 * @model
-	 * @generated
-	 */
-	int getGamesPlayedIn();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGamesPlayedIn <em>Games Played In</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Games Played In</em>' attribute.
-	 * @see #getGamesPlayedIn()
-	 * @generated
-	 */
-	void setGamesPlayedIn(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Minutes Played In</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Minutes Played In</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Minutes Played In</em>' attribute.
-	 * @see #setMinutesPlayedIn(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_MinutesPlayedIn()
-	 * @model
-	 * @generated
-	 */
-	int getMinutesPlayedIn();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getMinutesPlayedIn <em>Minutes Played In</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Minutes Played In</em>' attribute.
-	 * @see #getMinutesPlayedIn()
-	 * @generated
-	 */
-	void setMinutesPlayedIn(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Goals Against Average</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Goals Against Average</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Goals Against Average</em>' attribute.
-	 * @see #setGoalsAgainstAverage(float)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_GoalsAgainstAverage()
-	 * @model
-	 * @generated
-	 */
-	float getGoalsAgainstAverage();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGoalsAgainstAverage <em>Goals Against Average</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Goals Against Average</em>' attribute.
-	 * @see #getGoalsAgainstAverage()
-	 * @generated
-	 */
-	void setGoalsAgainstAverage(float value);
-
-	/**
-	 * Returns the value of the '<em><b>Wins</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Wins</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Wins</em>' attribute.
-	 * @see #setWins(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_Wins()
-	 * @model
-	 * @generated
-	 */
-	int getWins();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getWins <em>Wins</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Wins</em>' attribute.
-	 * @see #getWins()
-	 * @generated
-	 */
-	void setWins(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Losses</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Losses</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Losses</em>' attribute.
-	 * @see #setLosses(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_Losses()
-	 * @model
-	 * @generated
-	 */
-	int getLosses();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getLosses <em>Losses</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Losses</em>' attribute.
-	 * @see #getLosses()
-	 * @generated
-	 */
-	void setLosses(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Ties</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Ties</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Ties</em>' attribute.
-	 * @see #setTies(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_Ties()
-	 * @model
-	 * @generated
-	 */
-	int getTies();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getTies <em>Ties</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Ties</em>' attribute.
-	 * @see #getTies()
-	 * @generated
-	 */
-	void setTies(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Empty Net Goals</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Empty Net Goals</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Empty Net Goals</em>' attribute.
-	 * @see #setEmptyNetGoals(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_EmptyNetGoals()
-	 * @model
-	 * @generated
-	 */
-	int getEmptyNetGoals();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getEmptyNetGoals <em>Empty Net Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Empty Net Goals</em>' attribute.
-	 * @see #getEmptyNetGoals()
-	 * @generated
-	 */
-	void setEmptyNetGoals(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Shutouts</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Shutouts</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Shutouts</em>' attribute.
-	 * @see #setShutouts(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_Shutouts()
-	 * @model
-	 * @generated
-	 */
-	int getShutouts();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getShutouts <em>Shutouts</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Shutouts</em>' attribute.
-	 * @see #getShutouts()
-	 * @generated
-	 */
-	void setShutouts(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Goals Against</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Goals Against</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Goals Against</em>' attribute.
-	 * @see #setGoalsAgainst(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_GoalsAgainst()
-	 * @model
-	 * @generated
-	 */
-	int getGoalsAgainst();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGoalsAgainst <em>Goals Against</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Goals Against</em>' attribute.
-	 * @see #getGoalsAgainst()
-	 * @generated
-	 */
-	void setGoalsAgainst(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Saves</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Saves</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Saves</em>' attribute.
-	 * @see #setSaves(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_Saves()
-	 * @model
-	 * @generated
-	 */
-	int getSaves();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getSaves <em>Saves</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Saves</em>' attribute.
-	 * @see #getSaves()
-	 * @generated
-	 */
-	void setSaves(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Penalty Minutes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Penalty Minutes</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Penalty Minutes</em>' attribute.
-	 * @see #setPenaltyMinutes(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_PenaltyMinutes()
-	 * @model
-	 * @generated
-	 */
-	int getPenaltyMinutes();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getPenaltyMinutes <em>Penalty Minutes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Penalty Minutes</em>' attribute.
-	 * @see #getPenaltyMinutes()
-	 * @generated
-	 */
-	void setPenaltyMinutes(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Goals</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Goals</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Goals</em>' attribute.
-	 * @see #setGoals(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_Goals()
-	 * @model
-	 * @generated
-	 */
-	int getGoals();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGoals <em>Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Goals</em>' attribute.
-	 * @see #getGoals()
-	 * @generated
-	 */
-	void setGoals(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Assists</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Assists</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Assists</em>' attribute.
-	 * @see #setAssists(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_Assists()
-	 * @model
-	 * @generated
-	 */
-	int getAssists();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getAssists <em>Assists</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Assists</em>' attribute.
-	 * @see #getAssists()
-	 * @generated
-	 */
-	void setAssists(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Points</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Points</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Points</em>' attribute.
-	 * @see #setPoints(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getGoalieStats_Points()
-	 * @model
-	 * @generated
-	 */
-	int getPoints();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getPoints <em>Points</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Points</em>' attribute.
-	 * @see #getPoints()
-	 * @generated
-	 */
-	void setPoints(int value);
-
-} // GoalieStats
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/HeightKind.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/HeightKind.java
deleted file mode 100644
index 4f3341b..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/HeightKind.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Height Kind</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getHeightKind()
- * @model
- * @generated
- */
-public final class HeightKind extends AbstractEnumerator {
-	/**
-	 * The '<em><b>Inches</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Inches</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #INCHES_LITERAL
-	 * @model name="inches"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int INCHES = 0;
-
-	/**
-	 * The '<em><b>Centimeters</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Centimeters</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #CENTIMETERS_LITERAL
-	 * @model name="centimeters"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int CENTIMETERS = 1;
-
-	/**
-	 * The '<em><b>Inches</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #INCHES
-	 * @generated
-	 * @ordered
-	 */
-	public static final HeightKind INCHES_LITERAL = new HeightKind(INCHES, "inches", "inches"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Centimeters</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #CENTIMETERS
-	 * @generated
-	 * @ordered
-	 */
-	public static final HeightKind CENTIMETERS_LITERAL = new HeightKind(CENTIMETERS, "centimeters", "centimeters"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * An array of all the '<em><b>Height Kind</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final HeightKind[] VALUES_ARRAY =
-		new HeightKind[] {
-			INCHES_LITERAL,
-			CENTIMETERS_LITERAL,
-		};
-
-	/**
-	 * A public read-only list of all the '<em><b>Height Kind</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>Height Kind</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static HeightKind get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			HeightKind result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Height Kind</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static HeightKind getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			HeightKind result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Height Kind</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static HeightKind get(int value) {
-		switch (value) {
-			case INCHES: return INCHES_LITERAL;
-			case CENTIMETERS: return CENTIMETERS_LITERAL;
-		}
-		return null;	
-	}
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private HeightKind(int value, String name, String literal) {
-		super(value, name, literal);
-	}
-
-} //HeightKind
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/HockeyleagueFactory.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/HockeyleagueFactory.java
deleted file mode 100644
index d796d2b..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/HockeyleagueFactory.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage
- * @generated
- */
-public interface HockeyleagueFactory extends EFactory {
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	HockeyleagueFactory eINSTANCE = org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleagueFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>Arena</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Arena</em>'.
-	 * @generated
-	 */
-	Arena createArena();
-
-	/**
-	 * Returns a new object of class '<em>Defence</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Defence</em>'.
-	 * @generated
-	 */
-	Defence createDefence();
-
-	/**
-	 * Returns a new object of class '<em>Forward</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Forward</em>'.
-	 * @generated
-	 */
-	Forward createForward();
-
-	/**
-	 * Returns a new object of class '<em>Goalie</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Goalie</em>'.
-	 * @generated
-	 */
-	Goalie createGoalie();
-
-	/**
-	 * Returns a new object of class '<em>Goalie Stats</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Goalie Stats</em>'.
-	 * @generated
-	 */
-	GoalieStats createGoalieStats();
-
-	/**
-	 * Returns a new object of class '<em>League</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>League</em>'.
-	 * @generated
-	 */
-	League createLeague();
-
-	/**
-	 * Returns a new object of class '<em>Player Stats</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Player Stats</em>'.
-	 * @generated
-	 */
-	PlayerStats createPlayerStats();
-
-	/**
-	 * Returns a new object of class '<em>Team</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Team</em>'.
-	 * @generated
-	 */
-	Team createTeam();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	HockeyleaguePackage getHockeyleaguePackage();
-
-} //HockeyleagueFactory
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/HockeyleagueObject.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/HockeyleagueObject.java
deleted file mode 100644
index acb0766..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/HockeyleagueObject.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Object</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueObject#getName <em>Name</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getHockeyleagueObject()
- * @model abstract="true"
- * @generated
- */
-public interface HockeyleagueObject extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getHockeyleagueObject_Name()
-	 * @model
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueObject#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-} // HockeyleagueObject
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/HockeyleaguePackage.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/HockeyleaguePackage.java
deleted file mode 100644
index a2eb444..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/HockeyleaguePackage.java
+++ /dev/null
@@ -1,2339 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueFactory
- * @model kind="package"
- * @generated
- */
-public interface HockeyleaguePackage extends EPackage {
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "org.eclipse.ui.examples.views.properties.tabbed.hockeyleague"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http:///org/eclipse/ui/views/properties/tabbed/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "org.eclipse.ui.examples.views.properties.tabbed.hockeyleague"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	HockeyleaguePackage eINSTANCE = org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleagueObjectImpl <em>Object</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleagueObjectImpl
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getHockeyleagueObject()
-	 * @generated
-	 */
-	int HOCKEYLEAGUE_OBJECT = 5;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int HOCKEYLEAGUE_OBJECT__NAME = 0;
-
-	/**
-	 * The number of structural features of the '<em>Object</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int HOCKEYLEAGUE_OBJECT_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.ArenaImpl <em>Arena</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.ArenaImpl
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getArena()
-	 * @generated
-	 */
-	int ARENA = 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARENA__NAME = HOCKEYLEAGUE_OBJECT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARENA__ADDRESS = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Capacity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARENA__CAPACITY = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Arena</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARENA_FEATURE_COUNT = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerImpl <em>Player</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerImpl
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getPlayer()
-	 * @generated
-	 */
-	int PLAYER = 7;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER__NAME = HOCKEYLEAGUE_OBJECT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Birthplace</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER__BIRTHPLACE = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Number</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER__NUMBER = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Height Mesurement</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER__HEIGHT_MESUREMENT = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Height Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER__HEIGHT_VALUE = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Weight Mesurement</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER__WEIGHT_MESUREMENT = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Weight Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER__WEIGHT_VALUE = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Shot</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER__SHOT = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Birthdate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER__BIRTHDATE = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 7;
-
-	/**
-	 * The number of structural features of the '<em>Player</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER_FEATURE_COUNT = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 8;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.DefenceImpl <em>Defence</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.DefenceImpl
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getDefence()
-	 * @generated
-	 */
-	int DEFENCE = 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFENCE__NAME = PLAYER__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Birthplace</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFENCE__BIRTHPLACE = PLAYER__BIRTHPLACE;
-
-	/**
-	 * The feature id for the '<em><b>Number</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFENCE__NUMBER = PLAYER__NUMBER;
-
-	/**
-	 * The feature id for the '<em><b>Height Mesurement</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFENCE__HEIGHT_MESUREMENT = PLAYER__HEIGHT_MESUREMENT;
-
-	/**
-	 * The feature id for the '<em><b>Height Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFENCE__HEIGHT_VALUE = PLAYER__HEIGHT_VALUE;
-
-	/**
-	 * The feature id for the '<em><b>Weight Mesurement</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFENCE__WEIGHT_MESUREMENT = PLAYER__WEIGHT_MESUREMENT;
-
-	/**
-	 * The feature id for the '<em><b>Weight Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFENCE__WEIGHT_VALUE = PLAYER__WEIGHT_VALUE;
-
-	/**
-	 * The feature id for the '<em><b>Shot</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFENCE__SHOT = PLAYER__SHOT;
-
-	/**
-	 * The feature id for the '<em><b>Birthdate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFENCE__BIRTHDATE = PLAYER__BIRTHDATE;
-
-	/**
-	 * The feature id for the '<em><b>Position</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFENCE__POSITION = PLAYER_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Player Stats</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFENCE__PLAYER_STATS = PLAYER_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Defence</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFENCE_FEATURE_COUNT = PLAYER_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.ForwardImpl <em>Forward</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.ForwardImpl
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getForward()
-	 * @generated
-	 */
-	int FORWARD = 2;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FORWARD__NAME = PLAYER__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Birthplace</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FORWARD__BIRTHPLACE = PLAYER__BIRTHPLACE;
-
-	/**
-	 * The feature id for the '<em><b>Number</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FORWARD__NUMBER = PLAYER__NUMBER;
-
-	/**
-	 * The feature id for the '<em><b>Height Mesurement</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FORWARD__HEIGHT_MESUREMENT = PLAYER__HEIGHT_MESUREMENT;
-
-	/**
-	 * The feature id for the '<em><b>Height Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FORWARD__HEIGHT_VALUE = PLAYER__HEIGHT_VALUE;
-
-	/**
-	 * The feature id for the '<em><b>Weight Mesurement</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FORWARD__WEIGHT_MESUREMENT = PLAYER__WEIGHT_MESUREMENT;
-
-	/**
-	 * The feature id for the '<em><b>Weight Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FORWARD__WEIGHT_VALUE = PLAYER__WEIGHT_VALUE;
-
-	/**
-	 * The feature id for the '<em><b>Shot</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FORWARD__SHOT = PLAYER__SHOT;
-
-	/**
-	 * The feature id for the '<em><b>Birthdate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FORWARD__BIRTHDATE = PLAYER__BIRTHDATE;
-
-	/**
-	 * The feature id for the '<em><b>Position</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FORWARD__POSITION = PLAYER_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Player Stats</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FORWARD__PLAYER_STATS = PLAYER_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Forward</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FORWARD_FEATURE_COUNT = PLAYER_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieImpl <em>Goalie</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieImpl
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getGoalie()
-	 * @generated
-	 */
-	int GOALIE = 3;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE__NAME = PLAYER__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Birthplace</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE__BIRTHPLACE = PLAYER__BIRTHPLACE;
-
-	/**
-	 * The feature id for the '<em><b>Number</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE__NUMBER = PLAYER__NUMBER;
-
-	/**
-	 * The feature id for the '<em><b>Height Mesurement</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE__HEIGHT_MESUREMENT = PLAYER__HEIGHT_MESUREMENT;
-
-	/**
-	 * The feature id for the '<em><b>Height Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE__HEIGHT_VALUE = PLAYER__HEIGHT_VALUE;
-
-	/**
-	 * The feature id for the '<em><b>Weight Mesurement</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE__WEIGHT_MESUREMENT = PLAYER__WEIGHT_MESUREMENT;
-
-	/**
-	 * The feature id for the '<em><b>Weight Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE__WEIGHT_VALUE = PLAYER__WEIGHT_VALUE;
-
-	/**
-	 * The feature id for the '<em><b>Shot</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE__SHOT = PLAYER__SHOT;
-
-	/**
-	 * The feature id for the '<em><b>Birthdate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE__BIRTHDATE = PLAYER__BIRTHDATE;
-
-	/**
-	 * The feature id for the '<em><b>Goalie Stats</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE__GOALIE_STATS = PLAYER_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Goalie</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_FEATURE_COUNT = PLAYER_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl <em>Goalie Stats</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getGoalieStats()
-	 * @generated
-	 */
-	int GOALIE_STATS = 4;
-
-	/**
-	 * The feature id for the '<em><b>Year</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__YEAR = 0;
-
-	/**
-	 * The feature id for the '<em><b>Team</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__TEAM = 1;
-
-	/**
-	 * The feature id for the '<em><b>Games Played In</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__GAMES_PLAYED_IN = 2;
-
-	/**
-	 * The feature id for the '<em><b>Minutes Played In</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__MINUTES_PLAYED_IN = 3;
-
-	/**
-	 * The feature id for the '<em><b>Goals Against Average</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__GOALS_AGAINST_AVERAGE = 4;
-
-	/**
-	 * The feature id for the '<em><b>Wins</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__WINS = 5;
-
-	/**
-	 * The feature id for the '<em><b>Losses</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__LOSSES = 6;
-
-	/**
-	 * The feature id for the '<em><b>Ties</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__TIES = 7;
-
-	/**
-	 * The feature id for the '<em><b>Empty Net Goals</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__EMPTY_NET_GOALS = 8;
-
-	/**
-	 * The feature id for the '<em><b>Shutouts</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__SHUTOUTS = 9;
-
-	/**
-	 * The feature id for the '<em><b>Goals Against</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__GOALS_AGAINST = 10;
-
-	/**
-	 * The feature id for the '<em><b>Saves</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__SAVES = 11;
-
-	/**
-	 * The feature id for the '<em><b>Penalty Minutes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__PENALTY_MINUTES = 12;
-
-	/**
-	 * The feature id for the '<em><b>Goals</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__GOALS = 13;
-
-	/**
-	 * The feature id for the '<em><b>Assists</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__ASSISTS = 14;
-
-	/**
-	 * The feature id for the '<em><b>Points</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS__POINTS = 15;
-
-	/**
-	 * The number of structural features of the '<em>Goalie Stats</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GOALIE_STATS_FEATURE_COUNT = 16;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.LeagueImpl <em>League</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.LeagueImpl
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getLeague()
-	 * @generated
-	 */
-	int LEAGUE = 6;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAGUE__NAME = HOCKEYLEAGUE_OBJECT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Headoffice</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAGUE__HEADOFFICE = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Teams</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAGUE__TEAMS = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>League</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAGUE_FEATURE_COUNT = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl <em>Player Stats</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getPlayerStats()
-	 * @generated
-	 */
-	int PLAYER_STATS = 8;
-
-	/**
-	 * The feature id for the '<em><b>Year</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER_STATS__YEAR = 0;
-
-	/**
-	 * The feature id for the '<em><b>Team</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER_STATS__TEAM = 1;
-
-	/**
-	 * The feature id for the '<em><b>Games Played In</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER_STATS__GAMES_PLAYED_IN = 2;
-
-	/**
-	 * The feature id for the '<em><b>Goals</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER_STATS__GOALS = 3;
-
-	/**
-	 * The feature id for the '<em><b>Assists</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER_STATS__ASSISTS = 4;
-
-	/**
-	 * The feature id for the '<em><b>Points</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER_STATS__POINTS = 5;
-
-	/**
-	 * The feature id for the '<em><b>Plus Minus</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER_STATS__PLUS_MINUS = 6;
-
-	/**
-	 * The feature id for the '<em><b>Penalty Minutes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER_STATS__PENALTY_MINUTES = 7;
-
-	/**
-	 * The feature id for the '<em><b>Power Play Goals</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER_STATS__POWER_PLAY_GOALS = 8;
-
-	/**
-	 * The feature id for the '<em><b>Short Handed Goals</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER_STATS__SHORT_HANDED_GOALS = 9;
-
-	/**
-	 * The feature id for the '<em><b>Game Winning Goals</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER_STATS__GAME_WINNING_GOALS = 10;
-
-	/**
-	 * The feature id for the '<em><b>Shots</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER_STATS__SHOTS = 11;
-
-	/**
-	 * The feature id for the '<em><b>Shot Percentage</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER_STATS__SHOT_PERCENTAGE = 12;
-
-	/**
-	 * The number of structural features of the '<em>Player Stats</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLAYER_STATS_FEATURE_COUNT = 13;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.TeamImpl <em>Team</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.TeamImpl
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getTeam()
-	 * @generated
-	 */
-	int TEAM = 9;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM__NAME = HOCKEYLEAGUE_OBJECT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Forwards</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM__FORWARDS = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Defencemen</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM__DEFENCEMEN = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Goalies</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM__GOALIES = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Arena</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM__ARENA = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Team</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_FEATURE_COUNT = HOCKEYLEAGUE_OBJECT_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.DefencePositionKind <em>Defence Position Kind</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.DefencePositionKind
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getDefencePositionKind()
-	 * @generated
-	 */
-	int DEFENCE_POSITION_KIND = 10;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ForwardPositionKind <em>Forward Position Kind</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ForwardPositionKind
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getForwardPositionKind()
-	 * @generated
-	 */
-	int FORWARD_POSITION_KIND = 11;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HeightKind <em>Height Kind</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HeightKind
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getHeightKind()
-	 * @generated
-	 */
-	int HEIGHT_KIND = 12;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ShotKind <em>Shot Kind</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ShotKind
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getShotKind()
-	 * @generated
-	 */
-	int SHOT_KIND = 13;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.WeightKind <em>Weight Kind</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.WeightKind
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getWeightKind()
-	 * @generated
-	 */
-	int WEIGHT_KIND = 14;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena <em>Arena</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Arena</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena
-	 * @generated
-	 */
-	EClass getArena();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena#getAddress <em>Address</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Address</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena#getAddress()
-	 * @see #getArena()
-	 * @generated
-	 */
-	EAttribute getArena_Address();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena#getCapacity <em>Capacity</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Capacity</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena#getCapacity()
-	 * @see #getArena()
-	 * @generated
-	 */
-	EAttribute getArena_Capacity();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence <em>Defence</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Defence</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence
-	 * @generated
-	 */
-	EClass getDefence();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence#getPosition <em>Position</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Position</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence#getPosition()
-	 * @see #getDefence()
-	 * @generated
-	 */
-	EAttribute getDefence_Position();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence#getPlayerStats <em>Player Stats</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Player Stats</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence#getPlayerStats()
-	 * @see #getDefence()
-	 * @generated
-	 */
-	EReference getDefence_PlayerStats();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward <em>Forward</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Forward</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward
-	 * @generated
-	 */
-	EClass getForward();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward#getPosition <em>Position</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Position</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward#getPosition()
-	 * @see #getForward()
-	 * @generated
-	 */
-	EAttribute getForward_Position();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward#getPlayerStats <em>Player Stats</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Player Stats</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward#getPlayerStats()
-	 * @see #getForward()
-	 * @generated
-	 */
-	EReference getForward_PlayerStats();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie <em>Goalie</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Goalie</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie
-	 * @generated
-	 */
-	EClass getGoalie();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie#getGoalieStats <em>Goalie Stats</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Goalie Stats</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie#getGoalieStats()
-	 * @see #getGoalie()
-	 * @generated
-	 */
-	EReference getGoalie_GoalieStats();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats <em>Goalie Stats</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Goalie Stats</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats
-	 * @generated
-	 */
-	EClass getGoalieStats();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getYear <em>Year</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Year</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getYear()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EAttribute getGoalieStats_Year();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getTeam <em>Team</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Team</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getTeam()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EReference getGoalieStats_Team();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGamesPlayedIn <em>Games Played In</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Games Played In</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGamesPlayedIn()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EAttribute getGoalieStats_GamesPlayedIn();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getMinutesPlayedIn <em>Minutes Played In</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Minutes Played In</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getMinutesPlayedIn()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EAttribute getGoalieStats_MinutesPlayedIn();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGoalsAgainstAverage <em>Goals Against Average</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Goals Against Average</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGoalsAgainstAverage()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EAttribute getGoalieStats_GoalsAgainstAverage();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getWins <em>Wins</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Wins</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getWins()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EAttribute getGoalieStats_Wins();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getLosses <em>Losses</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Losses</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getLosses()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EAttribute getGoalieStats_Losses();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getTies <em>Ties</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Ties</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getTies()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EAttribute getGoalieStats_Ties();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getEmptyNetGoals <em>Empty Net Goals</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Empty Net Goals</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getEmptyNetGoals()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EAttribute getGoalieStats_EmptyNetGoals();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getShutouts <em>Shutouts</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Shutouts</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getShutouts()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EAttribute getGoalieStats_Shutouts();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGoalsAgainst <em>Goals Against</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Goals Against</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGoalsAgainst()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EAttribute getGoalieStats_GoalsAgainst();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getSaves <em>Saves</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Saves</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getSaves()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EAttribute getGoalieStats_Saves();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getPenaltyMinutes <em>Penalty Minutes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Penalty Minutes</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getPenaltyMinutes()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EAttribute getGoalieStats_PenaltyMinutes();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGoals <em>Goals</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Goals</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getGoals()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EAttribute getGoalieStats_Goals();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getAssists <em>Assists</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Assists</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getAssists()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EAttribute getGoalieStats_Assists();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getPoints <em>Points</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Points</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats#getPoints()
-	 * @see #getGoalieStats()
-	 * @generated
-	 */
-	EAttribute getGoalieStats_Points();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueObject <em>Object</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Object</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueObject
-	 * @generated
-	 */
-	EClass getHockeyleagueObject();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueObject#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueObject#getName()
-	 * @see #getHockeyleagueObject()
-	 * @generated
-	 */
-	EAttribute getHockeyleagueObject_Name();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League <em>League</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>League</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League
-	 * @generated
-	 */
-	EClass getLeague();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League#getHeadoffice <em>Headoffice</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Headoffice</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League#getHeadoffice()
-	 * @see #getLeague()
-	 * @generated
-	 */
-	EAttribute getLeague_Headoffice();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League#getTeams <em>Teams</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Teams</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League#getTeams()
-	 * @see #getLeague()
-	 * @generated
-	 */
-	EReference getLeague_Teams();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player <em>Player</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Player</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player
-	 * @generated
-	 */
-	EClass getPlayer();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getBirthplace <em>Birthplace</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Birthplace</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getBirthplace()
-	 * @see #getPlayer()
-	 * @generated
-	 */
-	EAttribute getPlayer_Birthplace();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getNumber <em>Number</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Number</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getNumber()
-	 * @see #getPlayer()
-	 * @generated
-	 */
-	EAttribute getPlayer_Number();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getHeightMesurement <em>Height Mesurement</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Height Mesurement</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getHeightMesurement()
-	 * @see #getPlayer()
-	 * @generated
-	 */
-	EAttribute getPlayer_HeightMesurement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getHeightValue <em>Height Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Height Value</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getHeightValue()
-	 * @see #getPlayer()
-	 * @generated
-	 */
-	EAttribute getPlayer_HeightValue();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getWeightMesurement <em>Weight Mesurement</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Weight Mesurement</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getWeightMesurement()
-	 * @see #getPlayer()
-	 * @generated
-	 */
-	EAttribute getPlayer_WeightMesurement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getWeightValue <em>Weight Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Weight Value</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getWeightValue()
-	 * @see #getPlayer()
-	 * @generated
-	 */
-	EAttribute getPlayer_WeightValue();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getShot <em>Shot</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Shot</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getShot()
-	 * @see #getPlayer()
-	 * @generated
-	 */
-	EAttribute getPlayer_Shot();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getBirthdate <em>Birthdate</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Birthdate</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getBirthdate()
-	 * @see #getPlayer()
-	 * @generated
-	 */
-	EAttribute getPlayer_Birthdate();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats <em>Player Stats</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Player Stats</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats
-	 * @generated
-	 */
-	EClass getPlayerStats();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getYear <em>Year</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Year</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getYear()
-	 * @see #getPlayerStats()
-	 * @generated
-	 */
-	EAttribute getPlayerStats_Year();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getTeam <em>Team</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Team</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getTeam()
-	 * @see #getPlayerStats()
-	 * @generated
-	 */
-	EReference getPlayerStats_Team();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getGamesPlayedIn <em>Games Played In</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Games Played In</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getGamesPlayedIn()
-	 * @see #getPlayerStats()
-	 * @generated
-	 */
-	EAttribute getPlayerStats_GamesPlayedIn();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getGoals <em>Goals</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Goals</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getGoals()
-	 * @see #getPlayerStats()
-	 * @generated
-	 */
-	EAttribute getPlayerStats_Goals();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getAssists <em>Assists</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Assists</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getAssists()
-	 * @see #getPlayerStats()
-	 * @generated
-	 */
-	EAttribute getPlayerStats_Assists();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPoints <em>Points</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Points</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPoints()
-	 * @see #getPlayerStats()
-	 * @generated
-	 */
-	EAttribute getPlayerStats_Points();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPlusMinus <em>Plus Minus</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Plus Minus</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPlusMinus()
-	 * @see #getPlayerStats()
-	 * @generated
-	 */
-	EAttribute getPlayerStats_PlusMinus();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPenaltyMinutes <em>Penalty Minutes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Penalty Minutes</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPenaltyMinutes()
-	 * @see #getPlayerStats()
-	 * @generated
-	 */
-	EAttribute getPlayerStats_PenaltyMinutes();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPowerPlayGoals <em>Power Play Goals</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Power Play Goals</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPowerPlayGoals()
-	 * @see #getPlayerStats()
-	 * @generated
-	 */
-	EAttribute getPlayerStats_PowerPlayGoals();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getShortHandedGoals <em>Short Handed Goals</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Short Handed Goals</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getShortHandedGoals()
-	 * @see #getPlayerStats()
-	 * @generated
-	 */
-	EAttribute getPlayerStats_ShortHandedGoals();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getGameWinningGoals <em>Game Winning Goals</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Game Winning Goals</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getGameWinningGoals()
-	 * @see #getPlayerStats()
-	 * @generated
-	 */
-	EAttribute getPlayerStats_GameWinningGoals();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getShots <em>Shots</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Shots</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getShots()
-	 * @see #getPlayerStats()
-	 * @generated
-	 */
-	EAttribute getPlayerStats_Shots();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getShotPercentage <em>Shot Percentage</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Shot Percentage</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getShotPercentage()
-	 * @see #getPlayerStats()
-	 * @generated
-	 */
-	EAttribute getPlayerStats_ShotPercentage();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team <em>Team</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Team</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team
-	 * @generated
-	 */
-	EClass getTeam();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team#getForwards <em>Forwards</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Forwards</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team#getForwards()
-	 * @see #getTeam()
-	 * @generated
-	 */
-	EReference getTeam_Forwards();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team#getDefencemen <em>Defencemen</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Defencemen</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team#getDefencemen()
-	 * @see #getTeam()
-	 * @generated
-	 */
-	EReference getTeam_Defencemen();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team#getGoalies <em>Goalies</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Goalies</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team#getGoalies()
-	 * @see #getTeam()
-	 * @generated
-	 */
-	EReference getTeam_Goalies();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team#getArena <em>Arena</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Arena</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team#getArena()
-	 * @see #getTeam()
-	 * @generated
-	 */
-	EReference getTeam_Arena();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.DefencePositionKind <em>Defence Position Kind</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>Defence Position Kind</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.DefencePositionKind
-	 * @generated
-	 */
-	EEnum getDefencePositionKind();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ForwardPositionKind <em>Forward Position Kind</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>Forward Position Kind</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ForwardPositionKind
-	 * @generated
-	 */
-	EEnum getForwardPositionKind();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HeightKind <em>Height Kind</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>Height Kind</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HeightKind
-	 * @generated
-	 */
-	EEnum getHeightKind();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ShotKind <em>Shot Kind</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>Shot Kind</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ShotKind
-	 * @generated
-	 */
-	EEnum getShotKind();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.WeightKind <em>Weight Kind</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>Weight Kind</em>'.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.WeightKind
-	 * @generated
-	 */
-	EEnum getWeightKind();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	HockeyleagueFactory getHockeyleagueFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.ArenaImpl <em>Arena</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.ArenaImpl
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getArena()
-		 * @generated
-		 */
-		EClass ARENA = eINSTANCE.getArena();
-
-		/**
-		 * The meta object literal for the '<em><b>Address</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ARENA__ADDRESS = eINSTANCE.getArena_Address();
-
-		/**
-		 * The meta object literal for the '<em><b>Capacity</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ARENA__CAPACITY = eINSTANCE.getArena_Capacity();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.DefenceImpl <em>Defence</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.DefenceImpl
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getDefence()
-		 * @generated
-		 */
-		EClass DEFENCE = eINSTANCE.getDefence();
-
-		/**
-		 * The meta object literal for the '<em><b>Position</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DEFENCE__POSITION = eINSTANCE.getDefence_Position();
-
-		/**
-		 * The meta object literal for the '<em><b>Player Stats</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DEFENCE__PLAYER_STATS = eINSTANCE.getDefence_PlayerStats();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.ForwardImpl <em>Forward</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.ForwardImpl
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getForward()
-		 * @generated
-		 */
-		EClass FORWARD = eINSTANCE.getForward();
-
-		/**
-		 * The meta object literal for the '<em><b>Position</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute FORWARD__POSITION = eINSTANCE.getForward_Position();
-
-		/**
-		 * The meta object literal for the '<em><b>Player Stats</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FORWARD__PLAYER_STATS = eINSTANCE.getForward_PlayerStats();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieImpl <em>Goalie</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieImpl
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getGoalie()
-		 * @generated
-		 */
-		EClass GOALIE = eINSTANCE.getGoalie();
-
-		/**
-		 * The meta object literal for the '<em><b>Goalie Stats</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference GOALIE__GOALIE_STATS = eINSTANCE.getGoalie_GoalieStats();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl <em>Goalie Stats</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getGoalieStats()
-		 * @generated
-		 */
-		EClass GOALIE_STATS = eINSTANCE.getGoalieStats();
-
-		/**
-		 * The meta object literal for the '<em><b>Year</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GOALIE_STATS__YEAR = eINSTANCE.getGoalieStats_Year();
-
-		/**
-		 * The meta object literal for the '<em><b>Team</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference GOALIE_STATS__TEAM = eINSTANCE.getGoalieStats_Team();
-
-		/**
-		 * The meta object literal for the '<em><b>Games Played In</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GOALIE_STATS__GAMES_PLAYED_IN = eINSTANCE.getGoalieStats_GamesPlayedIn();
-
-		/**
-		 * The meta object literal for the '<em><b>Minutes Played In</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GOALIE_STATS__MINUTES_PLAYED_IN = eINSTANCE.getGoalieStats_MinutesPlayedIn();
-
-		/**
-		 * The meta object literal for the '<em><b>Goals Against Average</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GOALIE_STATS__GOALS_AGAINST_AVERAGE = eINSTANCE.getGoalieStats_GoalsAgainstAverage();
-
-		/**
-		 * The meta object literal for the '<em><b>Wins</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GOALIE_STATS__WINS = eINSTANCE.getGoalieStats_Wins();
-
-		/**
-		 * The meta object literal for the '<em><b>Losses</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GOALIE_STATS__LOSSES = eINSTANCE.getGoalieStats_Losses();
-
-		/**
-		 * The meta object literal for the '<em><b>Ties</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GOALIE_STATS__TIES = eINSTANCE.getGoalieStats_Ties();
-
-		/**
-		 * The meta object literal for the '<em><b>Empty Net Goals</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GOALIE_STATS__EMPTY_NET_GOALS = eINSTANCE.getGoalieStats_EmptyNetGoals();
-
-		/**
-		 * The meta object literal for the '<em><b>Shutouts</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GOALIE_STATS__SHUTOUTS = eINSTANCE.getGoalieStats_Shutouts();
-
-		/**
-		 * The meta object literal for the '<em><b>Goals Against</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GOALIE_STATS__GOALS_AGAINST = eINSTANCE.getGoalieStats_GoalsAgainst();
-
-		/**
-		 * The meta object literal for the '<em><b>Saves</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GOALIE_STATS__SAVES = eINSTANCE.getGoalieStats_Saves();
-
-		/**
-		 * The meta object literal for the '<em><b>Penalty Minutes</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GOALIE_STATS__PENALTY_MINUTES = eINSTANCE.getGoalieStats_PenaltyMinutes();
-
-		/**
-		 * The meta object literal for the '<em><b>Goals</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GOALIE_STATS__GOALS = eINSTANCE.getGoalieStats_Goals();
-
-		/**
-		 * The meta object literal for the '<em><b>Assists</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GOALIE_STATS__ASSISTS = eINSTANCE.getGoalieStats_Assists();
-
-		/**
-		 * The meta object literal for the '<em><b>Points</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GOALIE_STATS__POINTS = eINSTANCE.getGoalieStats_Points();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleagueObjectImpl <em>Object</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleagueObjectImpl
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getHockeyleagueObject()
-		 * @generated
-		 */
-		EClass HOCKEYLEAGUE_OBJECT = eINSTANCE.getHockeyleagueObject();
-
-		/**
-		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute HOCKEYLEAGUE_OBJECT__NAME = eINSTANCE.getHockeyleagueObject_Name();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.LeagueImpl <em>League</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.LeagueImpl
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getLeague()
-		 * @generated
-		 */
-		EClass LEAGUE = eINSTANCE.getLeague();
-
-		/**
-		 * The meta object literal for the '<em><b>Headoffice</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute LEAGUE__HEADOFFICE = eINSTANCE.getLeague_Headoffice();
-
-		/**
-		 * The meta object literal for the '<em><b>Teams</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference LEAGUE__TEAMS = eINSTANCE.getLeague_Teams();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerImpl <em>Player</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerImpl
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getPlayer()
-		 * @generated
-		 */
-		EClass PLAYER = eINSTANCE.getPlayer();
-
-		/**
-		 * The meta object literal for the '<em><b>Birthplace</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER__BIRTHPLACE = eINSTANCE.getPlayer_Birthplace();
-
-		/**
-		 * The meta object literal for the '<em><b>Number</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER__NUMBER = eINSTANCE.getPlayer_Number();
-
-		/**
-		 * The meta object literal for the '<em><b>Height Mesurement</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER__HEIGHT_MESUREMENT = eINSTANCE.getPlayer_HeightMesurement();
-
-		/**
-		 * The meta object literal for the '<em><b>Height Value</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER__HEIGHT_VALUE = eINSTANCE.getPlayer_HeightValue();
-
-		/**
-		 * The meta object literal for the '<em><b>Weight Mesurement</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER__WEIGHT_MESUREMENT = eINSTANCE.getPlayer_WeightMesurement();
-
-		/**
-		 * The meta object literal for the '<em><b>Weight Value</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER__WEIGHT_VALUE = eINSTANCE.getPlayer_WeightValue();
-
-		/**
-		 * The meta object literal for the '<em><b>Shot</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER__SHOT = eINSTANCE.getPlayer_Shot();
-
-		/**
-		 * The meta object literal for the '<em><b>Birthdate</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER__BIRTHDATE = eINSTANCE.getPlayer_Birthdate();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl <em>Player Stats</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getPlayerStats()
-		 * @generated
-		 */
-		EClass PLAYER_STATS = eINSTANCE.getPlayerStats();
-
-		/**
-		 * The meta object literal for the '<em><b>Year</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER_STATS__YEAR = eINSTANCE.getPlayerStats_Year();
-
-		/**
-		 * The meta object literal for the '<em><b>Team</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PLAYER_STATS__TEAM = eINSTANCE.getPlayerStats_Team();
-
-		/**
-		 * The meta object literal for the '<em><b>Games Played In</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER_STATS__GAMES_PLAYED_IN = eINSTANCE.getPlayerStats_GamesPlayedIn();
-
-		/**
-		 * The meta object literal for the '<em><b>Goals</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER_STATS__GOALS = eINSTANCE.getPlayerStats_Goals();
-
-		/**
-		 * The meta object literal for the '<em><b>Assists</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER_STATS__ASSISTS = eINSTANCE.getPlayerStats_Assists();
-
-		/**
-		 * The meta object literal for the '<em><b>Points</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER_STATS__POINTS = eINSTANCE.getPlayerStats_Points();
-
-		/**
-		 * The meta object literal for the '<em><b>Plus Minus</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER_STATS__PLUS_MINUS = eINSTANCE.getPlayerStats_PlusMinus();
-
-		/**
-		 * The meta object literal for the '<em><b>Penalty Minutes</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER_STATS__PENALTY_MINUTES = eINSTANCE.getPlayerStats_PenaltyMinutes();
-
-		/**
-		 * The meta object literal for the '<em><b>Power Play Goals</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER_STATS__POWER_PLAY_GOALS = eINSTANCE.getPlayerStats_PowerPlayGoals();
-
-		/**
-		 * The meta object literal for the '<em><b>Short Handed Goals</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER_STATS__SHORT_HANDED_GOALS = eINSTANCE.getPlayerStats_ShortHandedGoals();
-
-		/**
-		 * The meta object literal for the '<em><b>Game Winning Goals</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER_STATS__GAME_WINNING_GOALS = eINSTANCE.getPlayerStats_GameWinningGoals();
-
-		/**
-		 * The meta object literal for the '<em><b>Shots</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER_STATS__SHOTS = eINSTANCE.getPlayerStats_Shots();
-
-		/**
-		 * The meta object literal for the '<em><b>Shot Percentage</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLAYER_STATS__SHOT_PERCENTAGE = eINSTANCE.getPlayerStats_ShotPercentage();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.TeamImpl <em>Team</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.TeamImpl
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getTeam()
-		 * @generated
-		 */
-		EClass TEAM = eINSTANCE.getTeam();
-
-		/**
-		 * The meta object literal for the '<em><b>Forwards</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TEAM__FORWARDS = eINSTANCE.getTeam_Forwards();
-
-		/**
-		 * The meta object literal for the '<em><b>Defencemen</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TEAM__DEFENCEMEN = eINSTANCE.getTeam_Defencemen();
-
-		/**
-		 * The meta object literal for the '<em><b>Goalies</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TEAM__GOALIES = eINSTANCE.getTeam_Goalies();
-
-		/**
-		 * The meta object literal for the '<em><b>Arena</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TEAM__ARENA = eINSTANCE.getTeam_Arena();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.DefencePositionKind <em>Defence Position Kind</em>}' enum.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.DefencePositionKind
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getDefencePositionKind()
-		 * @generated
-		 */
-		EEnum DEFENCE_POSITION_KIND = eINSTANCE.getDefencePositionKind();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ForwardPositionKind <em>Forward Position Kind</em>}' enum.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ForwardPositionKind
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getForwardPositionKind()
-		 * @generated
-		 */
-		EEnum FORWARD_POSITION_KIND = eINSTANCE.getForwardPositionKind();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HeightKind <em>Height Kind</em>}' enum.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HeightKind
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getHeightKind()
-		 * @generated
-		 */
-		EEnum HEIGHT_KIND = eINSTANCE.getHeightKind();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ShotKind <em>Shot Kind</em>}' enum.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ShotKind
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getShotKind()
-		 * @generated
-		 */
-		EEnum SHOT_KIND = eINSTANCE.getShotKind();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.WeightKind <em>Weight Kind</em>}' enum.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.WeightKind
-		 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleaguePackageImpl#getWeightKind()
-		 * @generated
-		 */
-		EEnum WEIGHT_KIND = eINSTANCE.getWeightKind();
-
-	}
-
-} //HockeyleaguePackage
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/HockeyleaguePlugin.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/HockeyleaguePlugin.java
deleted file mode 100644
index c5753bf..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/HockeyleaguePlugin.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import org.eclipse.emf.common.EMFPlugin;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-/**
- * This is the central singleton for the Hockeyleague edit plugin.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public final class HockeyleaguePlugin extends EMFPlugin {
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final HockeyleaguePlugin INSTANCE = new HockeyleaguePlugin();
-
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static Implementation plugin;
-
-	/**
-	 * Create the instance.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public HockeyleaguePlugin() {
-		super
-		  (new ResourceLocator [] {
-		   });
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	public ResourceLocator getPluginResourceLocator() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	public static Implementation getPlugin() {
-		return plugin;
-	}
-
-	/**
-	 * The actual implementation of the Eclipse <b>Plugin</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static class Implementation extends EclipsePlugin {
-		/**
-		 * Creates an instance.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		public Implementation() {
-			super();
-
-			// Remember the static instance.
-			//
-			plugin = this;
-		}
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/League.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/League.java
deleted file mode 100644
index e2c0fa2..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/League.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>League</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League#getHeadoffice <em>Headoffice</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League#getTeams <em>Teams</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getLeague()
- * @model
- * @generated
- */
-public interface League extends HockeyleagueObject {
-	/**
-	 * Returns the value of the '<em><b>Headoffice</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Headoffice</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Headoffice</em>' attribute.
-	 * @see #setHeadoffice(String)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getLeague_Headoffice()
-	 * @model
-	 * @generated
-	 */
-	String getHeadoffice();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League#getHeadoffice <em>Headoffice</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Headoffice</em>' attribute.
-	 * @see #getHeadoffice()
-	 * @generated
-	 */
-	void setHeadoffice(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Teams</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Teams</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Teams</em>' containment reference list.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getLeague_Teams()
-	 * @model type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team" containment="true"
-	 * @generated
-	 */
-	EList getTeams();
-
-} // League
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Player.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Player.java
deleted file mode 100644
index 7aa5045e..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Player.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Player</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getBirthplace <em>Birthplace</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getNumber <em>Number</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getHeightMesurement <em>Height Mesurement</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getHeightValue <em>Height Value</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getWeightMesurement <em>Weight Mesurement</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getWeightValue <em>Weight Value</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getShot <em>Shot</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getBirthdate <em>Birthdate</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayer()
- * @model abstract="true"
- * @generated
- */
-public interface Player extends HockeyleagueObject {
-	/**
-	 * Returns the value of the '<em><b>Birthplace</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Birthplace</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Birthplace</em>' attribute.
-	 * @see #setBirthplace(String)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayer_Birthplace()
-	 * @model
-	 * @generated
-	 */
-	String getBirthplace();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getBirthplace <em>Birthplace</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Birthplace</em>' attribute.
-	 * @see #getBirthplace()
-	 * @generated
-	 */
-	void setBirthplace(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Number</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Number</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Number</em>' attribute.
-	 * @see #setNumber(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayer_Number()
-	 * @model
-	 * @generated
-	 */
-	int getNumber();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getNumber <em>Number</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Number</em>' attribute.
-	 * @see #getNumber()
-	 * @generated
-	 */
-	void setNumber(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Height Mesurement</b></em>' attribute.
-	 * The literals are from the enumeration {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HeightKind}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Height Mesurement</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Height Mesurement</em>' attribute.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HeightKind
-	 * @see #setHeightMesurement(HeightKind)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayer_HeightMesurement()
-	 * @model
-	 * @generated
-	 */
-	HeightKind getHeightMesurement();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getHeightMesurement <em>Height Mesurement</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Height Mesurement</em>' attribute.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HeightKind
-	 * @see #getHeightMesurement()
-	 * @generated
-	 */
-	void setHeightMesurement(HeightKind value);
-
-	/**
-	 * Returns the value of the '<em><b>Height Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Height Value</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Height Value</em>' attribute.
-	 * @see #setHeightValue(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayer_HeightValue()
-	 * @model
-	 * @generated
-	 */
-	int getHeightValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getHeightValue <em>Height Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Height Value</em>' attribute.
-	 * @see #getHeightValue()
-	 * @generated
-	 */
-	void setHeightValue(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Weight Mesurement</b></em>' attribute.
-	 * The literals are from the enumeration {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.WeightKind}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Weight Mesurement</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Weight Mesurement</em>' attribute.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.WeightKind
-	 * @see #setWeightMesurement(WeightKind)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayer_WeightMesurement()
-	 * @model
-	 * @generated
-	 */
-	WeightKind getWeightMesurement();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getWeightMesurement <em>Weight Mesurement</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Weight Mesurement</em>' attribute.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.WeightKind
-	 * @see #getWeightMesurement()
-	 * @generated
-	 */
-	void setWeightMesurement(WeightKind value);
-
-	/**
-	 * Returns the value of the '<em><b>Weight Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Weight Value</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Weight Value</em>' attribute.
-	 * @see #setWeightValue(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayer_WeightValue()
-	 * @model
-	 * @generated
-	 */
-	int getWeightValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getWeightValue <em>Weight Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Weight Value</em>' attribute.
-	 * @see #getWeightValue()
-	 * @generated
-	 */
-	void setWeightValue(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Shot</b></em>' attribute.
-	 * The literals are from the enumeration {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ShotKind}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Shot</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Shot</em>' attribute.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ShotKind
-	 * @see #setShot(ShotKind)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayer_Shot()
-	 * @model
-	 * @generated
-	 */
-	ShotKind getShot();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getShot <em>Shot</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Shot</em>' attribute.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ShotKind
-	 * @see #getShot()
-	 * @generated
-	 */
-	void setShot(ShotKind value);
-
-	/**
-	 * Returns the value of the '<em><b>Birthdate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Birthdate</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Birthdate</em>' attribute.
-	 * @see #setBirthdate(String)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayer_Birthdate()
-	 * @model
-	 * @generated
-	 */
-	String getBirthdate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player#getBirthdate <em>Birthdate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Birthdate</em>' attribute.
-	 * @see #getBirthdate()
-	 * @generated
-	 */
-	void setBirthdate(String value);
-
-} // Player
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/PlayerStats.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/PlayerStats.java
deleted file mode 100644
index 545f5c2..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/PlayerStats.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Player Stats</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getYear <em>Year</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getTeam <em>Team</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getGamesPlayedIn <em>Games Played In</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getGoals <em>Goals</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getAssists <em>Assists</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPoints <em>Points</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPlusMinus <em>Plus Minus</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPenaltyMinutes <em>Penalty Minutes</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPowerPlayGoals <em>Power Play Goals</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getShortHandedGoals <em>Short Handed Goals</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getGameWinningGoals <em>Game Winning Goals</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getShots <em>Shots</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getShotPercentage <em>Shot Percentage</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayerStats()
- * @model
- * @generated
- */
-public interface PlayerStats extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Year</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Year</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Year</em>' attribute.
-	 * @see #setYear(String)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayerStats_Year()
-	 * @model
-	 * @generated
-	 */
-	String getYear();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getYear <em>Year</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Year</em>' attribute.
-	 * @see #getYear()
-	 * @generated
-	 */
-	void setYear(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Team</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Team</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Team</em>' reference.
-	 * @see #setTeam(Team)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayerStats_Team()
-	 * @model
-	 * @generated
-	 */
-	Team getTeam();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getTeam <em>Team</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Team</em>' reference.
-	 * @see #getTeam()
-	 * @generated
-	 */
-	void setTeam(Team value);
-
-	/**
-	 * Returns the value of the '<em><b>Games Played In</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Games Played In</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Games Played In</em>' attribute.
-	 * @see #setGamesPlayedIn(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayerStats_GamesPlayedIn()
-	 * @model
-	 * @generated
-	 */
-	int getGamesPlayedIn();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getGamesPlayedIn <em>Games Played In</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Games Played In</em>' attribute.
-	 * @see #getGamesPlayedIn()
-	 * @generated
-	 */
-	void setGamesPlayedIn(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Goals</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Goals</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Goals</em>' attribute.
-	 * @see #setGoals(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayerStats_Goals()
-	 * @model
-	 * @generated
-	 */
-	int getGoals();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getGoals <em>Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Goals</em>' attribute.
-	 * @see #getGoals()
-	 * @generated
-	 */
-	void setGoals(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Assists</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Assists</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Assists</em>' attribute.
-	 * @see #setAssists(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayerStats_Assists()
-	 * @model
-	 * @generated
-	 */
-	int getAssists();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getAssists <em>Assists</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Assists</em>' attribute.
-	 * @see #getAssists()
-	 * @generated
-	 */
-	void setAssists(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Points</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Points</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Points</em>' attribute.
-	 * @see #setPoints(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayerStats_Points()
-	 * @model
-	 * @generated
-	 */
-	int getPoints();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPoints <em>Points</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Points</em>' attribute.
-	 * @see #getPoints()
-	 * @generated
-	 */
-	void setPoints(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Plus Minus</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Plus Minus</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Plus Minus</em>' attribute.
-	 * @see #setPlusMinus(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayerStats_PlusMinus()
-	 * @model
-	 * @generated
-	 */
-	int getPlusMinus();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPlusMinus <em>Plus Minus</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Plus Minus</em>' attribute.
-	 * @see #getPlusMinus()
-	 * @generated
-	 */
-	void setPlusMinus(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Penalty Minutes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Penalty Minutes</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Penalty Minutes</em>' attribute.
-	 * @see #setPenaltyMinutes(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayerStats_PenaltyMinutes()
-	 * @model
-	 * @generated
-	 */
-	int getPenaltyMinutes();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPenaltyMinutes <em>Penalty Minutes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Penalty Minutes</em>' attribute.
-	 * @see #getPenaltyMinutes()
-	 * @generated
-	 */
-	void setPenaltyMinutes(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Power Play Goals</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Power Play Goals</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Power Play Goals</em>' attribute.
-	 * @see #setPowerPlayGoals(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayerStats_PowerPlayGoals()
-	 * @model
-	 * @generated
-	 */
-	int getPowerPlayGoals();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getPowerPlayGoals <em>Power Play Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Power Play Goals</em>' attribute.
-	 * @see #getPowerPlayGoals()
-	 * @generated
-	 */
-	void setPowerPlayGoals(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Short Handed Goals</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Short Handed Goals</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Short Handed Goals</em>' attribute.
-	 * @see #setShortHandedGoals(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayerStats_ShortHandedGoals()
-	 * @model
-	 * @generated
-	 */
-	int getShortHandedGoals();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getShortHandedGoals <em>Short Handed Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Short Handed Goals</em>' attribute.
-	 * @see #getShortHandedGoals()
-	 * @generated
-	 */
-	void setShortHandedGoals(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Game Winning Goals</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Game Winning Goals</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Game Winning Goals</em>' attribute.
-	 * @see #setGameWinningGoals(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayerStats_GameWinningGoals()
-	 * @model
-	 * @generated
-	 */
-	int getGameWinningGoals();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getGameWinningGoals <em>Game Winning Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Game Winning Goals</em>' attribute.
-	 * @see #getGameWinningGoals()
-	 * @generated
-	 */
-	void setGameWinningGoals(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Shots</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Shots</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Shots</em>' attribute.
-	 * @see #setShots(int)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayerStats_Shots()
-	 * @model
-	 * @generated
-	 */
-	int getShots();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getShots <em>Shots</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Shots</em>' attribute.
-	 * @see #getShots()
-	 * @generated
-	 */
-	void setShots(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Shot Percentage</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Shot Percentage</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Shot Percentage</em>' attribute.
-	 * @see #setShotPercentage(float)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getPlayerStats_ShotPercentage()
-	 * @model
-	 * @generated
-	 */
-	float getShotPercentage();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats#getShotPercentage <em>Shot Percentage</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Shot Percentage</em>' attribute.
-	 * @see #getShotPercentage()
-	 * @generated
-	 */
-	void setShotPercentage(float value);
-
-} // PlayerStats
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ShotKind.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ShotKind.java
deleted file mode 100644
index 2a7ccbe..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ShotKind.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Shot Kind</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getShotKind()
- * @model
- * @generated
- */
-public final class ShotKind extends AbstractEnumerator {
-	/**
-	 * The '<em><b>Left</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Left</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #LEFT_LITERAL
-	 * @model name="left"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int LEFT = 0;
-
-	/**
-	 * The '<em><b>Right</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Right</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #RIGHT_LITERAL
-	 * @model name="right"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int RIGHT = 1;
-
-	/**
-	 * The '<em><b>Left</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LEFT
-	 * @generated
-	 * @ordered
-	 */
-	public static final ShotKind LEFT_LITERAL = new ShotKind(LEFT, "left", "left"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Right</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #RIGHT
-	 * @generated
-	 * @ordered
-	 */
-	public static final ShotKind RIGHT_LITERAL = new ShotKind(RIGHT, "right", "right"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * An array of all the '<em><b>Shot Kind</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final ShotKind[] VALUES_ARRAY =
-		new ShotKind[] {
-			LEFT_LITERAL,
-			RIGHT_LITERAL,
-		};
-
-	/**
-	 * A public read-only list of all the '<em><b>Shot Kind</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>Shot Kind</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static ShotKind get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			ShotKind result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Shot Kind</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static ShotKind getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			ShotKind result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Shot Kind</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static ShotKind get(int value) {
-		switch (value) {
-			case LEFT: return LEFT_LITERAL;
-			case RIGHT: return RIGHT_LITERAL;
-		}
-		return null;	
-	}
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private ShotKind(int value, String name, String literal) {
-		super(value, name, literal);
-	}
-
-} //ShotKind
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Team.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Team.java
deleted file mode 100644
index 41f59e2..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/Team.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Team</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team#getForwards <em>Forwards</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team#getDefencemen <em>Defencemen</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team#getGoalies <em>Goalies</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team#getArena <em>Arena</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getTeam()
- * @model
- * @generated
- */
-public interface Team extends HockeyleagueObject {
-	/**
-	 * Returns the value of the '<em><b>Forwards</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Forwards</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Forwards</em>' containment reference list.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getTeam_Forwards()
-	 * @model type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward" containment="true"
-	 * @generated
-	 */
-	EList getForwards();
-
-	/**
-	 * Returns the value of the '<em><b>Defencemen</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Defencemen</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Defencemen</em>' containment reference list.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getTeam_Defencemen()
-	 * @model type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence" containment="true"
-	 * @generated
-	 */
-	EList getDefencemen();
-
-	/**
-	 * Returns the value of the '<em><b>Goalies</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Goalies</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Goalies</em>' containment reference list.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getTeam_Goalies()
-	 * @model type="org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie" containment="true"
-	 * @generated
-	 */
-	EList getGoalies();
-
-	/**
-	 * Returns the value of the '<em><b>Arena</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Arena</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Arena</em>' containment reference.
-	 * @see #setArena(Arena)
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getTeam_Arena()
-	 * @model containment="true"
-	 * @generated
-	 */
-	Arena getArena();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team#getArena <em>Arena</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Arena</em>' containment reference.
-	 * @see #getArena()
-	 * @generated
-	 */
-	void setArena(Arena value);
-
-} // Team
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/WeightKind.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/WeightKind.java
deleted file mode 100644
index 27d5a9a..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/WeightKind.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Weight Kind</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#getWeightKind()
- * @model
- * @generated
- */
-public final class WeightKind extends AbstractEnumerator {
-	/**
-	 * The '<em><b>Pounds</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Pounds</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #POUNDS_LITERAL
-	 * @model name="pounds"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int POUNDS = 0;
-
-	/**
-	 * The '<em><b>Kilograms</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Kilograms</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #KILOGRAMS_LITERAL
-	 * @model name="kilograms"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int KILOGRAMS = 1;
-
-	/**
-	 * The '<em><b>Pounds</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #POUNDS
-	 * @generated
-	 * @ordered
-	 */
-	public static final WeightKind POUNDS_LITERAL = new WeightKind(POUNDS, "pounds", "pounds"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Kilograms</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #KILOGRAMS
-	 * @generated
-	 * @ordered
-	 */
-	public static final WeightKind KILOGRAMS_LITERAL = new WeightKind(KILOGRAMS, "kilograms", "kilograms"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * An array of all the '<em><b>Weight Kind</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final WeightKind[] VALUES_ARRAY =
-		new WeightKind[] {
-			POUNDS_LITERAL,
-			KILOGRAMS_LITERAL,
-		};
-
-	/**
-	 * A public read-only list of all the '<em><b>Weight Kind</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>Weight Kind</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static WeightKind get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			WeightKind result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Weight Kind</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static WeightKind getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			WeightKind result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Weight Kind</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static WeightKind get(int value) {
-		switch (value) {
-			case POUNDS: return POUNDS_LITERAL;
-			case KILOGRAMS: return KILOGRAMS_LITERAL;
-		}
-		return null;	
-	}
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private WeightKind(int value, String name, String literal) {
-		super(value, name, literal);
-	}
-
-} //WeightKind
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/ArenaImpl.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/ArenaImpl.java
deleted file mode 100644
index c8d2d4c..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/ArenaImpl.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl;
-
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Arena</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.ArenaImpl#getAddress <em>Address</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.ArenaImpl#getCapacity <em>Capacity</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ArenaImpl extends HockeyleagueObjectImpl implements Arena {
-	/**
-	 * The default value of the '{@link #getAddress() <em>Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ADDRESS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAddress() <em>Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected String address = ADDRESS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCapacity() <em>Capacity</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCapacity()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int CAPACITY_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getCapacity() <em>Capacity</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCapacity()
-	 * @generated
-	 * @ordered
-	 */
-	protected int capacity = CAPACITY_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ArenaImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return HockeyleaguePackage.Literals.ARENA;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAddress() {
-		return address;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAddress(String newAddress) {
-		String oldAddress = address;
-		address = newAddress;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.ARENA__ADDRESS, oldAddress, address));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getCapacity() {
-		return capacity;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCapacity(int newCapacity) {
-		int oldCapacity = capacity;
-		capacity = newCapacity;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.ARENA__CAPACITY, oldCapacity, capacity));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case HockeyleaguePackage.ARENA__ADDRESS:
-				return getAddress();
-			case HockeyleaguePackage.ARENA__CAPACITY:
-				return new Integer(getCapacity());
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case HockeyleaguePackage.ARENA__ADDRESS:
-				setAddress((String)newValue);
-				return;
-			case HockeyleaguePackage.ARENA__CAPACITY:
-				setCapacity(((Integer)newValue).intValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.ARENA__ADDRESS:
-				setAddress(ADDRESS_EDEFAULT);
-				return;
-			case HockeyleaguePackage.ARENA__CAPACITY:
-				setCapacity(CAPACITY_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.ARENA__ADDRESS:
-				return ADDRESS_EDEFAULT == null ? address != null : !ADDRESS_EDEFAULT.equals(address);
-			case HockeyleaguePackage.ARENA__CAPACITY:
-				return capacity != CAPACITY_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (address: "); //$NON-NLS-1$
-		result.append(address);
-		result.append(", capacity: "); //$NON-NLS-1$
-		result.append(capacity);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ArenaImpl
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/DefenceImpl.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/DefenceImpl.java
deleted file mode 100644
index aa41e04..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/DefenceImpl.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl;
-
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.DefencePositionKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Defence</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.DefenceImpl#getPosition <em>Position</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.DefenceImpl#getPlayerStats <em>Player Stats</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DefenceImpl extends PlayerImpl implements Defence {
-	/**
-	 * The default value of the '{@link #getPosition() <em>Position</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPosition()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final DefencePositionKind POSITION_EDEFAULT = DefencePositionKind.LEFT_DEFENCE_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getPosition() <em>Position</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPosition()
-	 * @generated
-	 * @ordered
-	 */
-	protected DefencePositionKind position = POSITION_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getPlayerStats() <em>Player Stats</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPlayerStats()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList playerStats = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefenceImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return HockeyleaguePackage.Literals.DEFENCE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefencePositionKind getPosition() {
-		return position;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPosition(DefencePositionKind newPosition) {
-		DefencePositionKind oldPosition = position;
-		position = newPosition == null ? POSITION_EDEFAULT : newPosition;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.DEFENCE__POSITION, oldPosition, position));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getPlayerStats() {
-		if (playerStats == null) {
-			playerStats = new EObjectContainmentEList(PlayerStats.class, this, HockeyleaguePackage.DEFENCE__PLAYER_STATS);
-		}
-		return playerStats;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case HockeyleaguePackage.DEFENCE__PLAYER_STATS:
-				return ((InternalEList)getPlayerStats()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case HockeyleaguePackage.DEFENCE__POSITION:
-				return getPosition();
-			case HockeyleaguePackage.DEFENCE__PLAYER_STATS:
-				return getPlayerStats();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case HockeyleaguePackage.DEFENCE__POSITION:
-				setPosition((DefencePositionKind)newValue);
-				return;
-			case HockeyleaguePackage.DEFENCE__PLAYER_STATS:
-				getPlayerStats().clear();
-				getPlayerStats().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.DEFENCE__POSITION:
-				setPosition(POSITION_EDEFAULT);
-				return;
-			case HockeyleaguePackage.DEFENCE__PLAYER_STATS:
-				getPlayerStats().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.DEFENCE__POSITION:
-				return position != POSITION_EDEFAULT;
-			case HockeyleaguePackage.DEFENCE__PLAYER_STATS:
-				return playerStats != null && !playerStats.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (position: "); //$NON-NLS-1$
-		result.append(position);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DefenceImpl
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/ForwardImpl.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/ForwardImpl.java
deleted file mode 100644
index 6e70813..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/ForwardImpl.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl;
-
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ForwardPositionKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Forward</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.ForwardImpl#getPosition <em>Position</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.ForwardImpl#getPlayerStats <em>Player Stats</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ForwardImpl extends PlayerImpl implements Forward {
-	/**
-	 * The default value of the '{@link #getPosition() <em>Position</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPosition()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final ForwardPositionKind POSITION_EDEFAULT = ForwardPositionKind.LEFT_WING_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getPosition() <em>Position</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPosition()
-	 * @generated
-	 * @ordered
-	 */
-	protected ForwardPositionKind position = POSITION_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getPlayerStats() <em>Player Stats</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPlayerStats()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList playerStats = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ForwardImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return HockeyleaguePackage.Literals.FORWARD;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ForwardPositionKind getPosition() {
-		return position;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPosition(ForwardPositionKind newPosition) {
-		ForwardPositionKind oldPosition = position;
-		position = newPosition == null ? POSITION_EDEFAULT : newPosition;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.FORWARD__POSITION, oldPosition, position));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getPlayerStats() {
-		if (playerStats == null) {
-			playerStats = new EObjectContainmentEList(PlayerStats.class, this, HockeyleaguePackage.FORWARD__PLAYER_STATS);
-		}
-		return playerStats;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case HockeyleaguePackage.FORWARD__PLAYER_STATS:
-				return ((InternalEList)getPlayerStats()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case HockeyleaguePackage.FORWARD__POSITION:
-				return getPosition();
-			case HockeyleaguePackage.FORWARD__PLAYER_STATS:
-				return getPlayerStats();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case HockeyleaguePackage.FORWARD__POSITION:
-				setPosition((ForwardPositionKind)newValue);
-				return;
-			case HockeyleaguePackage.FORWARD__PLAYER_STATS:
-				getPlayerStats().clear();
-				getPlayerStats().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.FORWARD__POSITION:
-				setPosition(POSITION_EDEFAULT);
-				return;
-			case HockeyleaguePackage.FORWARD__PLAYER_STATS:
-				getPlayerStats().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.FORWARD__POSITION:
-				return position != POSITION_EDEFAULT;
-			case HockeyleaguePackage.FORWARD__PLAYER_STATS:
-				return playerStats != null && !playerStats.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (position: "); //$NON-NLS-1$
-		result.append(position);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ForwardImpl
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/GoalieImpl.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/GoalieImpl.java
deleted file mode 100644
index bc65d81..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/GoalieImpl.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl;
-
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Goalie</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieImpl#getGoalieStats <em>Goalie Stats</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class GoalieImpl extends PlayerImpl implements Goalie {
-	/**
-	 * The cached value of the '{@link #getGoalieStats() <em>Goalie Stats</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGoalieStats()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList goalieStats = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GoalieImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return HockeyleaguePackage.Literals.GOALIE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getGoalieStats() {
-		if (goalieStats == null) {
-			goalieStats = new EObjectContainmentEList(GoalieStats.class, this, HockeyleaguePackage.GOALIE__GOALIE_STATS);
-		}
-		return goalieStats;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case HockeyleaguePackage.GOALIE__GOALIE_STATS:
-				return ((InternalEList)getGoalieStats()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case HockeyleaguePackage.GOALIE__GOALIE_STATS:
-				return getGoalieStats();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case HockeyleaguePackage.GOALIE__GOALIE_STATS:
-				getGoalieStats().clear();
-				getGoalieStats().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.GOALIE__GOALIE_STATS:
-				getGoalieStats().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.GOALIE__GOALIE_STATS:
-				return goalieStats != null && !goalieStats.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //GoalieImpl
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/GoalieStatsImpl.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/GoalieStatsImpl.java
deleted file mode 100644
index 6595d26..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/GoalieStatsImpl.java
+++ /dev/null
@@ -1,983 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl;
-
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Goalie Stats</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getYear <em>Year</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getTeam <em>Team</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getGamesPlayedIn <em>Games Played In</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getMinutesPlayedIn <em>Minutes Played In</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getGoalsAgainstAverage <em>Goals Against Average</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getWins <em>Wins</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getLosses <em>Losses</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getTies <em>Ties</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getEmptyNetGoals <em>Empty Net Goals</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getShutouts <em>Shutouts</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getGoalsAgainst <em>Goals Against</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getSaves <em>Saves</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getPenaltyMinutes <em>Penalty Minutes</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getGoals <em>Goals</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getAssists <em>Assists</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.GoalieStatsImpl#getPoints <em>Points</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class GoalieStatsImpl extends EObjectImpl implements GoalieStats {
-	/**
-	 * The default value of the '{@link #getYear() <em>Year</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getYear()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String YEAR_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getYear() <em>Year</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getYear()
-	 * @generated
-	 * @ordered
-	 */
-	protected String year = YEAR_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getTeam() <em>Team</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTeam()
-	 * @generated
-	 * @ordered
-	 */
-	protected Team team = null;
-
-	/**
-	 * The default value of the '{@link #getGamesPlayedIn() <em>Games Played In</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGamesPlayedIn()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int GAMES_PLAYED_IN_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getGamesPlayedIn() <em>Games Played In</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGamesPlayedIn()
-	 * @generated
-	 * @ordered
-	 */
-	protected int gamesPlayedIn = GAMES_PLAYED_IN_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMinutesPlayedIn() <em>Minutes Played In</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinutesPlayedIn()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int MINUTES_PLAYED_IN_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getMinutesPlayedIn() <em>Minutes Played In</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinutesPlayedIn()
-	 * @generated
-	 * @ordered
-	 */
-	protected int minutesPlayedIn = MINUTES_PLAYED_IN_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getGoalsAgainstAverage() <em>Goals Against Average</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGoalsAgainstAverage()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float GOALS_AGAINST_AVERAGE_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getGoalsAgainstAverage() <em>Goals Against Average</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGoalsAgainstAverage()
-	 * @generated
-	 * @ordered
-	 */
-	protected float goalsAgainstAverage = GOALS_AGAINST_AVERAGE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWins() <em>Wins</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWins()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int WINS_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getWins() <em>Wins</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWins()
-	 * @generated
-	 * @ordered
-	 */
-	protected int wins = WINS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLosses() <em>Losses</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLosses()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int LOSSES_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getLosses() <em>Losses</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLosses()
-	 * @generated
-	 * @ordered
-	 */
-	protected int losses = LOSSES_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getTies() <em>Ties</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTies()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int TIES_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getTies() <em>Ties</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTies()
-	 * @generated
-	 * @ordered
-	 */
-	protected int ties = TIES_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getEmptyNetGoals() <em>Empty Net Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEmptyNetGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int EMPTY_NET_GOALS_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getEmptyNetGoals() <em>Empty Net Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEmptyNetGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected int emptyNetGoals = EMPTY_NET_GOALS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getShutouts() <em>Shutouts</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getShutouts()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int SHUTOUTS_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getShutouts() <em>Shutouts</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getShutouts()
-	 * @generated
-	 * @ordered
-	 */
-	protected int shutouts = SHUTOUTS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getGoalsAgainst() <em>Goals Against</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGoalsAgainst()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int GOALS_AGAINST_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getGoalsAgainst() <em>Goals Against</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGoalsAgainst()
-	 * @generated
-	 * @ordered
-	 */
-	protected int goalsAgainst = GOALS_AGAINST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getSaves() <em>Saves</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSaves()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int SAVES_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getSaves() <em>Saves</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSaves()
-	 * @generated
-	 * @ordered
-	 */
-	protected int saves = SAVES_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPenaltyMinutes() <em>Penalty Minutes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPenaltyMinutes()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int PENALTY_MINUTES_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getPenaltyMinutes() <em>Penalty Minutes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPenaltyMinutes()
-	 * @generated
-	 * @ordered
-	 */
-	protected int penaltyMinutes = PENALTY_MINUTES_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getGoals() <em>Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int GOALS_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getGoals() <em>Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected int goals = GOALS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getAssists() <em>Assists</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAssists()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int ASSISTS_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getAssists() <em>Assists</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAssists()
-	 * @generated
-	 * @ordered
-	 */
-	protected int assists = ASSISTS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPoints() <em>Points</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPoints()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int POINTS_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getPoints() <em>Points</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPoints()
-	 * @generated
-	 * @ordered
-	 */
-	protected int points = POINTS_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GoalieStatsImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return HockeyleaguePackage.Literals.GOALIE_STATS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getYear() {
-		return year;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setYear(String newYear) {
-		String oldYear = year;
-		year = newYear;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__YEAR, oldYear, year));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Team getTeam() {
-		if (team != null && team.eIsProxy()) {
-			InternalEObject oldTeam = (InternalEObject)team;
-			team = (Team)eResolveProxy(oldTeam);
-			if (team != oldTeam) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, HockeyleaguePackage.GOALIE_STATS__TEAM, oldTeam, team));
-			}
-		}
-		return team;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Team basicGetTeam() {
-		return team;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTeam(Team newTeam) {
-		Team oldTeam = team;
-		team = newTeam;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__TEAM, oldTeam, team));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getGamesPlayedIn() {
-		return gamesPlayedIn;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGamesPlayedIn(int newGamesPlayedIn) {
-		int oldGamesPlayedIn = gamesPlayedIn;
-		gamesPlayedIn = newGamesPlayedIn;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__GAMES_PLAYED_IN, oldGamesPlayedIn, gamesPlayedIn));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getMinutesPlayedIn() {
-		return minutesPlayedIn;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMinutesPlayedIn(int newMinutesPlayedIn) {
-		int oldMinutesPlayedIn = minutesPlayedIn;
-		minutesPlayedIn = newMinutesPlayedIn;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__MINUTES_PLAYED_IN, oldMinutesPlayedIn, minutesPlayedIn));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getGoalsAgainstAverage() {
-		return goalsAgainstAverage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGoalsAgainstAverage(float newGoalsAgainstAverage) {
-		float oldGoalsAgainstAverage = goalsAgainstAverage;
-		goalsAgainstAverage = newGoalsAgainstAverage;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__GOALS_AGAINST_AVERAGE, oldGoalsAgainstAverage, goalsAgainstAverage));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getWins() {
-		return wins;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWins(int newWins) {
-		int oldWins = wins;
-		wins = newWins;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__WINS, oldWins, wins));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getLosses() {
-		return losses;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLosses(int newLosses) {
-		int oldLosses = losses;
-		losses = newLosses;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__LOSSES, oldLosses, losses));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getTies() {
-		return ties;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTies(int newTies) {
-		int oldTies = ties;
-		ties = newTies;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__TIES, oldTies, ties));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getEmptyNetGoals() {
-		return emptyNetGoals;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEmptyNetGoals(int newEmptyNetGoals) {
-		int oldEmptyNetGoals = emptyNetGoals;
-		emptyNetGoals = newEmptyNetGoals;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__EMPTY_NET_GOALS, oldEmptyNetGoals, emptyNetGoals));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getShutouts() {
-		return shutouts;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setShutouts(int newShutouts) {
-		int oldShutouts = shutouts;
-		shutouts = newShutouts;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__SHUTOUTS, oldShutouts, shutouts));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getGoalsAgainst() {
-		return goalsAgainst;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGoalsAgainst(int newGoalsAgainst) {
-		int oldGoalsAgainst = goalsAgainst;
-		goalsAgainst = newGoalsAgainst;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__GOALS_AGAINST, oldGoalsAgainst, goalsAgainst));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getSaves() {
-		return saves;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSaves(int newSaves) {
-		int oldSaves = saves;
-		saves = newSaves;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__SAVES, oldSaves, saves));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getPenaltyMinutes() {
-		return penaltyMinutes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPenaltyMinutes(int newPenaltyMinutes) {
-		int oldPenaltyMinutes = penaltyMinutes;
-		penaltyMinutes = newPenaltyMinutes;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__PENALTY_MINUTES, oldPenaltyMinutes, penaltyMinutes));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getGoals() {
-		return goals;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGoals(int newGoals) {
-		int oldGoals = goals;
-		goals = newGoals;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__GOALS, oldGoals, goals));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getAssists() {
-		return assists;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAssists(int newAssists) {
-		int oldAssists = assists;
-		assists = newAssists;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__ASSISTS, oldAssists, assists));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getPoints() {
-		return points;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPoints(int newPoints) {
-		int oldPoints = points;
-		points = newPoints;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.GOALIE_STATS__POINTS, oldPoints, points));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case HockeyleaguePackage.GOALIE_STATS__YEAR:
-				return getYear();
-			case HockeyleaguePackage.GOALIE_STATS__TEAM:
-				if (resolve) return getTeam();
-				return basicGetTeam();
-			case HockeyleaguePackage.GOALIE_STATS__GAMES_PLAYED_IN:
-				return new Integer(getGamesPlayedIn());
-			case HockeyleaguePackage.GOALIE_STATS__MINUTES_PLAYED_IN:
-				return new Integer(getMinutesPlayedIn());
-			case HockeyleaguePackage.GOALIE_STATS__GOALS_AGAINST_AVERAGE:
-				return new Float(getGoalsAgainstAverage());
-			case HockeyleaguePackage.GOALIE_STATS__WINS:
-				return new Integer(getWins());
-			case HockeyleaguePackage.GOALIE_STATS__LOSSES:
-				return new Integer(getLosses());
-			case HockeyleaguePackage.GOALIE_STATS__TIES:
-				return new Integer(getTies());
-			case HockeyleaguePackage.GOALIE_STATS__EMPTY_NET_GOALS:
-				return new Integer(getEmptyNetGoals());
-			case HockeyleaguePackage.GOALIE_STATS__SHUTOUTS:
-				return new Integer(getShutouts());
-			case HockeyleaguePackage.GOALIE_STATS__GOALS_AGAINST:
-				return new Integer(getGoalsAgainst());
-			case HockeyleaguePackage.GOALIE_STATS__SAVES:
-				return new Integer(getSaves());
-			case HockeyleaguePackage.GOALIE_STATS__PENALTY_MINUTES:
-				return new Integer(getPenaltyMinutes());
-			case HockeyleaguePackage.GOALIE_STATS__GOALS:
-				return new Integer(getGoals());
-			case HockeyleaguePackage.GOALIE_STATS__ASSISTS:
-				return new Integer(getAssists());
-			case HockeyleaguePackage.GOALIE_STATS__POINTS:
-				return new Integer(getPoints());
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case HockeyleaguePackage.GOALIE_STATS__YEAR:
-				setYear((String)newValue);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__TEAM:
-				setTeam((Team)newValue);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__GAMES_PLAYED_IN:
-				setGamesPlayedIn(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__MINUTES_PLAYED_IN:
-				setMinutesPlayedIn(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__GOALS_AGAINST_AVERAGE:
-				setGoalsAgainstAverage(((Float)newValue).floatValue());
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__WINS:
-				setWins(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__LOSSES:
-				setLosses(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__TIES:
-				setTies(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__EMPTY_NET_GOALS:
-				setEmptyNetGoals(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__SHUTOUTS:
-				setShutouts(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__GOALS_AGAINST:
-				setGoalsAgainst(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__SAVES:
-				setSaves(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__PENALTY_MINUTES:
-				setPenaltyMinutes(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__GOALS:
-				setGoals(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__ASSISTS:
-				setAssists(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__POINTS:
-				setPoints(((Integer)newValue).intValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.GOALIE_STATS__YEAR:
-				setYear(YEAR_EDEFAULT);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__TEAM:
-				setTeam((Team)null);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__GAMES_PLAYED_IN:
-				setGamesPlayedIn(GAMES_PLAYED_IN_EDEFAULT);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__MINUTES_PLAYED_IN:
-				setMinutesPlayedIn(MINUTES_PLAYED_IN_EDEFAULT);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__GOALS_AGAINST_AVERAGE:
-				setGoalsAgainstAverage(GOALS_AGAINST_AVERAGE_EDEFAULT);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__WINS:
-				setWins(WINS_EDEFAULT);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__LOSSES:
-				setLosses(LOSSES_EDEFAULT);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__TIES:
-				setTies(TIES_EDEFAULT);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__EMPTY_NET_GOALS:
-				setEmptyNetGoals(EMPTY_NET_GOALS_EDEFAULT);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__SHUTOUTS:
-				setShutouts(SHUTOUTS_EDEFAULT);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__GOALS_AGAINST:
-				setGoalsAgainst(GOALS_AGAINST_EDEFAULT);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__SAVES:
-				setSaves(SAVES_EDEFAULT);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__PENALTY_MINUTES:
-				setPenaltyMinutes(PENALTY_MINUTES_EDEFAULT);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__GOALS:
-				setGoals(GOALS_EDEFAULT);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__ASSISTS:
-				setAssists(ASSISTS_EDEFAULT);
-				return;
-			case HockeyleaguePackage.GOALIE_STATS__POINTS:
-				setPoints(POINTS_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.GOALIE_STATS__YEAR:
-				return YEAR_EDEFAULT == null ? year != null : !YEAR_EDEFAULT.equals(year);
-			case HockeyleaguePackage.GOALIE_STATS__TEAM:
-				return team != null;
-			case HockeyleaguePackage.GOALIE_STATS__GAMES_PLAYED_IN:
-				return gamesPlayedIn != GAMES_PLAYED_IN_EDEFAULT;
-			case HockeyleaguePackage.GOALIE_STATS__MINUTES_PLAYED_IN:
-				return minutesPlayedIn != MINUTES_PLAYED_IN_EDEFAULT;
-			case HockeyleaguePackage.GOALIE_STATS__GOALS_AGAINST_AVERAGE:
-				return goalsAgainstAverage != GOALS_AGAINST_AVERAGE_EDEFAULT;
-			case HockeyleaguePackage.GOALIE_STATS__WINS:
-				return wins != WINS_EDEFAULT;
-			case HockeyleaguePackage.GOALIE_STATS__LOSSES:
-				return losses != LOSSES_EDEFAULT;
-			case HockeyleaguePackage.GOALIE_STATS__TIES:
-				return ties != TIES_EDEFAULT;
-			case HockeyleaguePackage.GOALIE_STATS__EMPTY_NET_GOALS:
-				return emptyNetGoals != EMPTY_NET_GOALS_EDEFAULT;
-			case HockeyleaguePackage.GOALIE_STATS__SHUTOUTS:
-				return shutouts != SHUTOUTS_EDEFAULT;
-			case HockeyleaguePackage.GOALIE_STATS__GOALS_AGAINST:
-				return goalsAgainst != GOALS_AGAINST_EDEFAULT;
-			case HockeyleaguePackage.GOALIE_STATS__SAVES:
-				return saves != SAVES_EDEFAULT;
-			case HockeyleaguePackage.GOALIE_STATS__PENALTY_MINUTES:
-				return penaltyMinutes != PENALTY_MINUTES_EDEFAULT;
-			case HockeyleaguePackage.GOALIE_STATS__GOALS:
-				return goals != GOALS_EDEFAULT;
-			case HockeyleaguePackage.GOALIE_STATS__ASSISTS:
-				return assists != ASSISTS_EDEFAULT;
-			case HockeyleaguePackage.GOALIE_STATS__POINTS:
-				return points != POINTS_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (year: "); //$NON-NLS-1$
-		result.append(year);
-		result.append(", gamesPlayedIn: "); //$NON-NLS-1$
-		result.append(gamesPlayedIn);
-		result.append(", minutesPlayedIn: "); //$NON-NLS-1$
-		result.append(minutesPlayedIn);
-		result.append(", goalsAgainstAverage: "); //$NON-NLS-1$
-		result.append(goalsAgainstAverage);
-		result.append(", wins: "); //$NON-NLS-1$
-		result.append(wins);
-		result.append(", losses: "); //$NON-NLS-1$
-		result.append(losses);
-		result.append(", ties: "); //$NON-NLS-1$
-		result.append(ties);
-		result.append(", emptyNetGoals: "); //$NON-NLS-1$
-		result.append(emptyNetGoals);
-		result.append(", shutouts: "); //$NON-NLS-1$
-		result.append(shutouts);
-		result.append(", goalsAgainst: "); //$NON-NLS-1$
-		result.append(goalsAgainst);
-		result.append(", saves: "); //$NON-NLS-1$
-		result.append(saves);
-		result.append(", penaltyMinutes: "); //$NON-NLS-1$
-		result.append(penaltyMinutes);
-		result.append(", goals: "); //$NON-NLS-1$
-		result.append(goals);
-		result.append(", assists: "); //$NON-NLS-1$
-		result.append(assists);
-		result.append(", points: "); //$NON-NLS-1$
-		result.append(points);
-		result.append(')');
-		return result.toString();
-	}
-
-} //GoalieStatsImpl
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/HockeyleagueFactoryImpl.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/HockeyleagueFactoryImpl.java
deleted file mode 100644
index 025562b..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/HockeyleagueFactoryImpl.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl;
-
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.*;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class HockeyleagueFactoryImpl extends EFactoryImpl implements HockeyleagueFactory {
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static HockeyleagueFactory init() {
-		try {
-			HockeyleagueFactory theHockeyleagueFactory = (HockeyleagueFactory)EPackage.Registry.INSTANCE.getEFactory("http:///org/eclipse/ui/views/properties/tabbed/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ecore"); //$NON-NLS-1$ 
-			if (theHockeyleagueFactory != null) {
-				return theHockeyleagueFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new HockeyleagueFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public HockeyleagueFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case HockeyleaguePackage.ARENA: return createArena();
-			case HockeyleaguePackage.DEFENCE: return createDefence();
-			case HockeyleaguePackage.FORWARD: return createForward();
-			case HockeyleaguePackage.GOALIE: return createGoalie();
-			case HockeyleaguePackage.GOALIE_STATS: return createGoalieStats();
-			case HockeyleaguePackage.LEAGUE: return createLeague();
-			case HockeyleaguePackage.PLAYER_STATS: return createPlayerStats();
-			case HockeyleaguePackage.TEAM: return createTeam();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object createFromString(EDataType eDataType, String initialValue) {
-		switch (eDataType.getClassifierID()) {
-			case HockeyleaguePackage.DEFENCE_POSITION_KIND:
-				return createDefencePositionKindFromString(eDataType, initialValue);
-			case HockeyleaguePackage.FORWARD_POSITION_KIND:
-				return createForwardPositionKindFromString(eDataType, initialValue);
-			case HockeyleaguePackage.HEIGHT_KIND:
-				return createHeightKindFromString(eDataType, initialValue);
-			case HockeyleaguePackage.SHOT_KIND:
-				return createShotKindFromString(eDataType, initialValue);
-			case HockeyleaguePackage.WEIGHT_KIND:
-				return createWeightKindFromString(eDataType, initialValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertToString(EDataType eDataType, Object instanceValue) {
-		switch (eDataType.getClassifierID()) {
-			case HockeyleaguePackage.DEFENCE_POSITION_KIND:
-				return convertDefencePositionKindToString(eDataType, instanceValue);
-			case HockeyleaguePackage.FORWARD_POSITION_KIND:
-				return convertForwardPositionKindToString(eDataType, instanceValue);
-			case HockeyleaguePackage.HEIGHT_KIND:
-				return convertHeightKindToString(eDataType, instanceValue);
-			case HockeyleaguePackage.SHOT_KIND:
-				return convertShotKindToString(eDataType, instanceValue);
-			case HockeyleaguePackage.WEIGHT_KIND:
-				return convertWeightKindToString(eDataType, instanceValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Arena createArena() {
-		ArenaImpl arena = new ArenaImpl();
-		return arena;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Defence createDefence() {
-		DefenceImpl defence = new DefenceImpl();
-		return defence;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Forward createForward() {
-		ForwardImpl forward = new ForwardImpl();
-		return forward;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Goalie createGoalie() {
-		GoalieImpl goalie = new GoalieImpl();
-		return goalie;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GoalieStats createGoalieStats() {
-		GoalieStatsImpl goalieStats = new GoalieStatsImpl();
-		return goalieStats;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public League createLeague() {
-		LeagueImpl league = new LeagueImpl();
-		return league;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PlayerStats createPlayerStats() {
-		PlayerStatsImpl playerStats = new PlayerStatsImpl();
-		return playerStats;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Team createTeam() {
-		TeamImpl team = new TeamImpl();
-		return team;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefencePositionKind createDefencePositionKindFromString(EDataType eDataType, String initialValue) {
-		DefencePositionKind result = DefencePositionKind.get(initialValue);
-		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertDefencePositionKindToString(EDataType eDataType, Object instanceValue) {
-		return instanceValue == null ? null : instanceValue.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ForwardPositionKind createForwardPositionKindFromString(EDataType eDataType, String initialValue) {
-		ForwardPositionKind result = ForwardPositionKind.get(initialValue);
-		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertForwardPositionKindToString(EDataType eDataType, Object instanceValue) {
-		return instanceValue == null ? null : instanceValue.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public HeightKind createHeightKindFromString(EDataType eDataType, String initialValue) {
-		HeightKind result = HeightKind.get(initialValue);
-		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertHeightKindToString(EDataType eDataType, Object instanceValue) {
-		return instanceValue == null ? null : instanceValue.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ShotKind createShotKindFromString(EDataType eDataType, String initialValue) {
-		ShotKind result = ShotKind.get(initialValue);
-		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertShotKindToString(EDataType eDataType, Object instanceValue) {
-		return instanceValue == null ? null : instanceValue.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WeightKind createWeightKindFromString(EDataType eDataType, String initialValue) {
-		WeightKind result = WeightKind.get(initialValue);
-		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertWeightKindToString(EDataType eDataType, Object instanceValue) {
-		return instanceValue == null ? null : instanceValue.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public HockeyleaguePackage getHockeyleaguePackage() {
-		return (HockeyleaguePackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	public static HockeyleaguePackage getPackage() {
-		return HockeyleaguePackage.eINSTANCE;
-	}
-
-} //HockeyleagueFactoryImpl
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/HockeyleagueObjectImpl.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/HockeyleagueObjectImpl.java
deleted file mode 100644
index 080c1e4..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/HockeyleagueObjectImpl.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl;
-
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueObject;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Object</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.HockeyleagueObjectImpl#getName <em>Name</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class HockeyleagueObjectImpl extends EObjectImpl implements HockeyleagueObject {
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected HockeyleagueObjectImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return HockeyleaguePackage.Literals.HOCKEYLEAGUE_OBJECT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.HOCKEYLEAGUE_OBJECT__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case HockeyleaguePackage.HOCKEYLEAGUE_OBJECT__NAME:
-				return getName();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case HockeyleaguePackage.HOCKEYLEAGUE_OBJECT__NAME:
-				setName((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.HOCKEYLEAGUE_OBJECT__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.HOCKEYLEAGUE_OBJECT__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (name: "); //$NON-NLS-1$
-		result.append(name);
-		result.append(')');
-		return result.toString();
-	}
-
-} //HockeyleagueObjectImpl
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/HockeyleaguePackageImpl.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/HockeyleaguePackageImpl.java
deleted file mode 100644
index b8dc923..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/HockeyleaguePackageImpl.java
+++ /dev/null
@@ -1,1050 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl;
-
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.DefencePositionKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ForwardPositionKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HeightKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueFactory;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueObject;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ShotKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.WeightKind;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class HockeyleaguePackageImpl extends EPackageImpl implements HockeyleaguePackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass arenaEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass defenceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass forwardEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass goalieEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass goalieStatsEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass hockeyleagueObjectEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass leagueEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass playerEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass playerStatsEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass teamEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum defencePositionKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum forwardPositionKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum heightKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum shotKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum weightKindEEnum = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private HockeyleaguePackageImpl() {
-		super(eNS_URI, HockeyleagueFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this
-	 * model, and for any others upon which it depends.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static HockeyleaguePackage init() {
-		if (isInited) return (HockeyleaguePackage)EPackage.Registry.INSTANCE.getEPackage(HockeyleaguePackage.eNS_URI);
-
-		// Obtain or create and register package
-		HockeyleaguePackageImpl theHockeyleaguePackage = (HockeyleaguePackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof HockeyleaguePackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new HockeyleaguePackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theHockeyleaguePackage.createPackageContents();
-
-		// Initialize created meta-data
-		theHockeyleaguePackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theHockeyleaguePackage.freeze();
-
-		return theHockeyleaguePackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getArena() {
-		return arenaEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArena_Address() {
-		return (EAttribute)arenaEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArena_Capacity() {
-		return (EAttribute)arenaEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDefence() {
-		return defenceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDefence_Position() {
-		return (EAttribute)defenceEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDefence_PlayerStats() {
-		return (EReference)defenceEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getForward() {
-		return forwardEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getForward_Position() {
-		return (EAttribute)forwardEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getForward_PlayerStats() {
-		return (EReference)forwardEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGoalie() {
-		return goalieEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGoalie_GoalieStats() {
-		return (EReference)goalieEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGoalieStats() {
-		return goalieStatsEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGoalieStats_Year() {
-		return (EAttribute)goalieStatsEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGoalieStats_Team() {
-		return (EReference)goalieStatsEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGoalieStats_GamesPlayedIn() {
-		return (EAttribute)goalieStatsEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGoalieStats_MinutesPlayedIn() {
-		return (EAttribute)goalieStatsEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGoalieStats_GoalsAgainstAverage() {
-		return (EAttribute)goalieStatsEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGoalieStats_Wins() {
-		return (EAttribute)goalieStatsEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGoalieStats_Losses() {
-		return (EAttribute)goalieStatsEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGoalieStats_Ties() {
-		return (EAttribute)goalieStatsEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGoalieStats_EmptyNetGoals() {
-		return (EAttribute)goalieStatsEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGoalieStats_Shutouts() {
-		return (EAttribute)goalieStatsEClass.getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGoalieStats_GoalsAgainst() {
-		return (EAttribute)goalieStatsEClass.getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGoalieStats_Saves() {
-		return (EAttribute)goalieStatsEClass.getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGoalieStats_PenaltyMinutes() {
-		return (EAttribute)goalieStatsEClass.getEStructuralFeatures().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGoalieStats_Goals() {
-		return (EAttribute)goalieStatsEClass.getEStructuralFeatures().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGoalieStats_Assists() {
-		return (EAttribute)goalieStatsEClass.getEStructuralFeatures().get(14);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGoalieStats_Points() {
-		return (EAttribute)goalieStatsEClass.getEStructuralFeatures().get(15);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getHockeyleagueObject() {
-		return hockeyleagueObjectEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getHockeyleagueObject_Name() {
-		return (EAttribute)hockeyleagueObjectEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLeague() {
-		return leagueEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLeague_Headoffice() {
-		return (EAttribute)leagueEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLeague_Teams() {
-		return (EReference)leagueEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPlayer() {
-		return playerEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayer_Birthplace() {
-		return (EAttribute)playerEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayer_Number() {
-		return (EAttribute)playerEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayer_HeightMesurement() {
-		return (EAttribute)playerEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayer_HeightValue() {
-		return (EAttribute)playerEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayer_WeightMesurement() {
-		return (EAttribute)playerEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayer_WeightValue() {
-		return (EAttribute)playerEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayer_Shot() {
-		return (EAttribute)playerEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayer_Birthdate() {
-		return (EAttribute)playerEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPlayerStats() {
-		return playerStatsEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayerStats_Year() {
-		return (EAttribute)playerStatsEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPlayerStats_Team() {
-		return (EReference)playerStatsEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayerStats_GamesPlayedIn() {
-		return (EAttribute)playerStatsEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayerStats_Goals() {
-		return (EAttribute)playerStatsEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayerStats_Assists() {
-		return (EAttribute)playerStatsEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayerStats_Points() {
-		return (EAttribute)playerStatsEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayerStats_PlusMinus() {
-		return (EAttribute)playerStatsEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayerStats_PenaltyMinutes() {
-		return (EAttribute)playerStatsEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayerStats_PowerPlayGoals() {
-		return (EAttribute)playerStatsEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayerStats_ShortHandedGoals() {
-		return (EAttribute)playerStatsEClass.getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayerStats_GameWinningGoals() {
-		return (EAttribute)playerStatsEClass.getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayerStats_Shots() {
-		return (EAttribute)playerStatsEClass.getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlayerStats_ShotPercentage() {
-		return (EAttribute)playerStatsEClass.getEStructuralFeatures().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTeam() {
-		return teamEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTeam_Forwards() {
-		return (EReference)teamEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTeam_Defencemen() {
-		return (EReference)teamEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTeam_Goalies() {
-		return (EReference)teamEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTeam_Arena() {
-		return (EReference)teamEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getDefencePositionKind() {
-		return defencePositionKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getForwardPositionKind() {
-		return forwardPositionKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getHeightKind() {
-		return heightKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getShotKind() {
-		return shotKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getWeightKind() {
-		return weightKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public HockeyleagueFactory getHockeyleagueFactory() {
-		return (HockeyleagueFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		arenaEClass = createEClass(ARENA);
-		createEAttribute(arenaEClass, ARENA__ADDRESS);
-		createEAttribute(arenaEClass, ARENA__CAPACITY);
-
-		defenceEClass = createEClass(DEFENCE);
-		createEAttribute(defenceEClass, DEFENCE__POSITION);
-		createEReference(defenceEClass, DEFENCE__PLAYER_STATS);
-
-		forwardEClass = createEClass(FORWARD);
-		createEAttribute(forwardEClass, FORWARD__POSITION);
-		createEReference(forwardEClass, FORWARD__PLAYER_STATS);
-
-		goalieEClass = createEClass(GOALIE);
-		createEReference(goalieEClass, GOALIE__GOALIE_STATS);
-
-		goalieStatsEClass = createEClass(GOALIE_STATS);
-		createEAttribute(goalieStatsEClass, GOALIE_STATS__YEAR);
-		createEReference(goalieStatsEClass, GOALIE_STATS__TEAM);
-		createEAttribute(goalieStatsEClass, GOALIE_STATS__GAMES_PLAYED_IN);
-		createEAttribute(goalieStatsEClass, GOALIE_STATS__MINUTES_PLAYED_IN);
-		createEAttribute(goalieStatsEClass, GOALIE_STATS__GOALS_AGAINST_AVERAGE);
-		createEAttribute(goalieStatsEClass, GOALIE_STATS__WINS);
-		createEAttribute(goalieStatsEClass, GOALIE_STATS__LOSSES);
-		createEAttribute(goalieStatsEClass, GOALIE_STATS__TIES);
-		createEAttribute(goalieStatsEClass, GOALIE_STATS__EMPTY_NET_GOALS);
-		createEAttribute(goalieStatsEClass, GOALIE_STATS__SHUTOUTS);
-		createEAttribute(goalieStatsEClass, GOALIE_STATS__GOALS_AGAINST);
-		createEAttribute(goalieStatsEClass, GOALIE_STATS__SAVES);
-		createEAttribute(goalieStatsEClass, GOALIE_STATS__PENALTY_MINUTES);
-		createEAttribute(goalieStatsEClass, GOALIE_STATS__GOALS);
-		createEAttribute(goalieStatsEClass, GOALIE_STATS__ASSISTS);
-		createEAttribute(goalieStatsEClass, GOALIE_STATS__POINTS);
-
-		hockeyleagueObjectEClass = createEClass(HOCKEYLEAGUE_OBJECT);
-		createEAttribute(hockeyleagueObjectEClass, HOCKEYLEAGUE_OBJECT__NAME);
-
-		leagueEClass = createEClass(LEAGUE);
-		createEAttribute(leagueEClass, LEAGUE__HEADOFFICE);
-		createEReference(leagueEClass, LEAGUE__TEAMS);
-
-		playerEClass = createEClass(PLAYER);
-		createEAttribute(playerEClass, PLAYER__BIRTHPLACE);
-		createEAttribute(playerEClass, PLAYER__NUMBER);
-		createEAttribute(playerEClass, PLAYER__HEIGHT_MESUREMENT);
-		createEAttribute(playerEClass, PLAYER__HEIGHT_VALUE);
-		createEAttribute(playerEClass, PLAYER__WEIGHT_MESUREMENT);
-		createEAttribute(playerEClass, PLAYER__WEIGHT_VALUE);
-		createEAttribute(playerEClass, PLAYER__SHOT);
-		createEAttribute(playerEClass, PLAYER__BIRTHDATE);
-
-		playerStatsEClass = createEClass(PLAYER_STATS);
-		createEAttribute(playerStatsEClass, PLAYER_STATS__YEAR);
-		createEReference(playerStatsEClass, PLAYER_STATS__TEAM);
-		createEAttribute(playerStatsEClass, PLAYER_STATS__GAMES_PLAYED_IN);
-		createEAttribute(playerStatsEClass, PLAYER_STATS__GOALS);
-		createEAttribute(playerStatsEClass, PLAYER_STATS__ASSISTS);
-		createEAttribute(playerStatsEClass, PLAYER_STATS__POINTS);
-		createEAttribute(playerStatsEClass, PLAYER_STATS__PLUS_MINUS);
-		createEAttribute(playerStatsEClass, PLAYER_STATS__PENALTY_MINUTES);
-		createEAttribute(playerStatsEClass, PLAYER_STATS__POWER_PLAY_GOALS);
-		createEAttribute(playerStatsEClass, PLAYER_STATS__SHORT_HANDED_GOALS);
-		createEAttribute(playerStatsEClass, PLAYER_STATS__GAME_WINNING_GOALS);
-		createEAttribute(playerStatsEClass, PLAYER_STATS__SHOTS);
-		createEAttribute(playerStatsEClass, PLAYER_STATS__SHOT_PERCENTAGE);
-
-		teamEClass = createEClass(TEAM);
-		createEReference(teamEClass, TEAM__FORWARDS);
-		createEReference(teamEClass, TEAM__DEFENCEMEN);
-		createEReference(teamEClass, TEAM__GOALIES);
-		createEReference(teamEClass, TEAM__ARENA);
-
-		// Create enums
-		defencePositionKindEEnum = createEEnum(DEFENCE_POSITION_KIND);
-		forwardPositionKindEEnum = createEEnum(FORWARD_POSITION_KIND);
-		heightKindEEnum = createEEnum(HEIGHT_KIND);
-		shotKindEEnum = createEEnum(SHOT_KIND);
-		weightKindEEnum = createEEnum(WEIGHT_KIND);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Add supertypes to classes
-		arenaEClass.getESuperTypes().add(this.getHockeyleagueObject());
-		defenceEClass.getESuperTypes().add(this.getPlayer());
-		forwardEClass.getESuperTypes().add(this.getPlayer());
-		goalieEClass.getESuperTypes().add(this.getPlayer());
-		leagueEClass.getESuperTypes().add(this.getHockeyleagueObject());
-		playerEClass.getESuperTypes().add(this.getHockeyleagueObject());
-		teamEClass.getESuperTypes().add(this.getHockeyleagueObject());
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(arenaEClass, Arena.class, "Arena", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getArena_Address(), ecorePackage.getEString(), "address", null, 0, 1, Arena.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getArena_Capacity(), ecorePackage.getEInt(), "capacity", null, 0, 1, Arena.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(defenceEClass, Defence.class, "Defence", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getDefence_Position(), this.getDefencePositionKind(), "position", null, 0, 1, Defence.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getDefence_PlayerStats(), this.getPlayerStats(), null, "playerStats", null, 0, -1, Defence.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(forwardEClass, Forward.class, "Forward", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getForward_Position(), this.getForwardPositionKind(), "position", null, 0, 1, Forward.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getForward_PlayerStats(), this.getPlayerStats(), null, "playerStats", null, 0, -1, Forward.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(goalieEClass, Goalie.class, "Goalie", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(getGoalie_GoalieStats(), this.getGoalieStats(), null, "goalieStats", null, 0, -1, Goalie.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(goalieStatsEClass, GoalieStats.class, "GoalieStats", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getGoalieStats_Year(), ecorePackage.getEString(), "year", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getGoalieStats_Team(), this.getTeam(), null, "team", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getGoalieStats_GamesPlayedIn(), ecorePackage.getEInt(), "gamesPlayedIn", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getGoalieStats_MinutesPlayedIn(), ecorePackage.getEInt(), "minutesPlayedIn", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getGoalieStats_GoalsAgainstAverage(), ecorePackage.getEFloat(), "goalsAgainstAverage", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getGoalieStats_Wins(), ecorePackage.getEInt(), "wins", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getGoalieStats_Losses(), ecorePackage.getEInt(), "losses", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getGoalieStats_Ties(), ecorePackage.getEInt(), "ties", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getGoalieStats_EmptyNetGoals(), ecorePackage.getEInt(), "emptyNetGoals", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getGoalieStats_Shutouts(), ecorePackage.getEInt(), "shutouts", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getGoalieStats_GoalsAgainst(), ecorePackage.getEInt(), "goalsAgainst", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getGoalieStats_Saves(), ecorePackage.getEInt(), "saves", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getGoalieStats_PenaltyMinutes(), ecorePackage.getEInt(), "penaltyMinutes", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getGoalieStats_Goals(), ecorePackage.getEInt(), "goals", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getGoalieStats_Assists(), ecorePackage.getEInt(), "assists", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getGoalieStats_Points(), ecorePackage.getEInt(), "points", null, 0, 1, GoalieStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(hockeyleagueObjectEClass, HockeyleagueObject.class, "HockeyleagueObject", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getHockeyleagueObject_Name(), ecorePackage.getEString(), "name", null, 0, 1, HockeyleagueObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(leagueEClass, League.class, "League", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getLeague_Headoffice(), ecorePackage.getEString(), "headoffice", null, 0, 1, League.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getLeague_Teams(), this.getTeam(), null, "teams", null, 0, -1, League.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(playerEClass, Player.class, "Player", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getPlayer_Birthplace(), ecorePackage.getEString(), "birthplace", null, 0, 1, Player.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayer_Number(), ecorePackage.getEInt(), "number", null, 0, 1, Player.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayer_HeightMesurement(), this.getHeightKind(), "heightMesurement", null, 0, 1, Player.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayer_HeightValue(), ecorePackage.getEInt(), "heightValue", null, 0, 1, Player.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayer_WeightMesurement(), this.getWeightKind(), "weightMesurement", null, 0, 1, Player.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayer_WeightValue(), ecorePackage.getEInt(), "weightValue", null, 0, 1, Player.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayer_Shot(), this.getShotKind(), "shot", null, 0, 1, Player.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayer_Birthdate(), ecorePackage.getEString(), "birthdate", null, 0, 1, Player.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(playerStatsEClass, PlayerStats.class, "PlayerStats", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getPlayerStats_Year(), ecorePackage.getEString(), "year", null, 0, 1, PlayerStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getPlayerStats_Team(), this.getTeam(), null, "team", null, 0, 1, PlayerStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayerStats_GamesPlayedIn(), ecorePackage.getEInt(), "gamesPlayedIn", null, 0, 1, PlayerStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayerStats_Goals(), ecorePackage.getEInt(), "goals", null, 0, 1, PlayerStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayerStats_Assists(), ecorePackage.getEInt(), "assists", null, 0, 1, PlayerStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayerStats_Points(), ecorePackage.getEInt(), "points", null, 0, 1, PlayerStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayerStats_PlusMinus(), ecorePackage.getEInt(), "plusMinus", null, 0, 1, PlayerStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayerStats_PenaltyMinutes(), ecorePackage.getEInt(), "penaltyMinutes", null, 0, 1, PlayerStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayerStats_PowerPlayGoals(), ecorePackage.getEInt(), "powerPlayGoals", null, 0, 1, PlayerStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayerStats_ShortHandedGoals(), ecorePackage.getEInt(), "shortHandedGoals", null, 0, 1, PlayerStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayerStats_GameWinningGoals(), ecorePackage.getEInt(), "gameWinningGoals", null, 0, 1, PlayerStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayerStats_Shots(), ecorePackage.getEInt(), "shots", null, 0, 1, PlayerStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getPlayerStats_ShotPercentage(), ecorePackage.getEFloat(), "shotPercentage", null, 0, 1, PlayerStats.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(teamEClass, Team.class, "Team", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(getTeam_Forwards(), this.getForward(), null, "forwards", null, 0, -1, Team.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getTeam_Defencemen(), this.getDefence(), null, "defencemen", null, 0, -1, Team.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getTeam_Goalies(), this.getGoalie(), null, "goalies", null, 0, -1, Team.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getTeam_Arena(), this.getArena(), null, "arena", null, 0, 1, Team.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		// Initialize enums and add enum literals
-		initEEnum(defencePositionKindEEnum, DefencePositionKind.class, "DefencePositionKind"); //$NON-NLS-1$
-		addEEnumLiteral(defencePositionKindEEnum, DefencePositionKind.LEFT_DEFENCE_LITERAL);
-		addEEnumLiteral(defencePositionKindEEnum, DefencePositionKind.RIGHT_DEFENCE_LITERAL);
-
-		initEEnum(forwardPositionKindEEnum, ForwardPositionKind.class, "ForwardPositionKind"); //$NON-NLS-1$
-		addEEnumLiteral(forwardPositionKindEEnum, ForwardPositionKind.LEFT_WING_LITERAL);
-		addEEnumLiteral(forwardPositionKindEEnum, ForwardPositionKind.RIGHT_WING_LITERAL);
-		addEEnumLiteral(forwardPositionKindEEnum, ForwardPositionKind.CENTER_LITERAL);
-
-		initEEnum(heightKindEEnum, HeightKind.class, "HeightKind"); //$NON-NLS-1$
-		addEEnumLiteral(heightKindEEnum, HeightKind.INCHES_LITERAL);
-		addEEnumLiteral(heightKindEEnum, HeightKind.CENTIMETERS_LITERAL);
-
-		initEEnum(shotKindEEnum, ShotKind.class, "ShotKind"); //$NON-NLS-1$
-		addEEnumLiteral(shotKindEEnum, ShotKind.LEFT_LITERAL);
-		addEEnumLiteral(shotKindEEnum, ShotKind.RIGHT_LITERAL);
-
-		initEEnum(weightKindEEnum, WeightKind.class, "WeightKind"); //$NON-NLS-1$
-		addEEnumLiteral(weightKindEEnum, WeightKind.POUNDS_LITERAL);
-		addEEnumLiteral(weightKindEEnum, WeightKind.KILOGRAMS_LITERAL);
-
-		// Create resource
-		createResource(eNS_URI);
-	}
-
-} //HockeyleaguePackageImpl
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/LeagueImpl.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/LeagueImpl.java
deleted file mode 100644
index 3ccd325..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/LeagueImpl.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl;
-
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>League</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.LeagueImpl#getHeadoffice <em>Headoffice</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.LeagueImpl#getTeams <em>Teams</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class LeagueImpl extends HockeyleagueObjectImpl implements League {
-	/**
-	 * The default value of the '{@link #getHeadoffice() <em>Headoffice</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHeadoffice()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String HEADOFFICE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getHeadoffice() <em>Headoffice</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHeadoffice()
-	 * @generated
-	 * @ordered
-	 */
-	protected String headoffice = HEADOFFICE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getTeams() <em>Teams</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTeams()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList teams = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LeagueImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return HockeyleaguePackage.Literals.LEAGUE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getHeadoffice() {
-		return headoffice;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHeadoffice(String newHeadoffice) {
-		String oldHeadoffice = headoffice;
-		headoffice = newHeadoffice;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.LEAGUE__HEADOFFICE, oldHeadoffice, headoffice));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTeams() {
-		if (teams == null) {
-			teams = new EObjectContainmentEList(Team.class, this, HockeyleaguePackage.LEAGUE__TEAMS);
-		}
-		return teams;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case HockeyleaguePackage.LEAGUE__TEAMS:
-				return ((InternalEList)getTeams()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case HockeyleaguePackage.LEAGUE__HEADOFFICE:
-				return getHeadoffice();
-			case HockeyleaguePackage.LEAGUE__TEAMS:
-				return getTeams();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case HockeyleaguePackage.LEAGUE__HEADOFFICE:
-				setHeadoffice((String)newValue);
-				return;
-			case HockeyleaguePackage.LEAGUE__TEAMS:
-				getTeams().clear();
-				getTeams().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.LEAGUE__HEADOFFICE:
-				setHeadoffice(HEADOFFICE_EDEFAULT);
-				return;
-			case HockeyleaguePackage.LEAGUE__TEAMS:
-				getTeams().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.LEAGUE__HEADOFFICE:
-				return HEADOFFICE_EDEFAULT == null ? headoffice != null : !HEADOFFICE_EDEFAULT.equals(headoffice);
-			case HockeyleaguePackage.LEAGUE__TEAMS:
-				return teams != null && !teams.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (headoffice: "); //$NON-NLS-1$
-		result.append(headoffice);
-		result.append(')');
-		return result.toString();
-	}
-
-} //LeagueImpl
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/PlayerImpl.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/PlayerImpl.java
deleted file mode 100644
index a37d89a..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/PlayerImpl.java
+++ /dev/null
@@ -1,545 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl;
-
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HeightKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ShotKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.WeightKind;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Player</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerImpl#getBirthplace <em>Birthplace</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerImpl#getNumber <em>Number</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerImpl#getHeightMesurement <em>Height Mesurement</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerImpl#getHeightValue <em>Height Value</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerImpl#getWeightMesurement <em>Weight Mesurement</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerImpl#getWeightValue <em>Weight Value</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerImpl#getShot <em>Shot</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerImpl#getBirthdate <em>Birthdate</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class PlayerImpl extends HockeyleagueObjectImpl implements Player {
-	/**
-	 * The default value of the '{@link #getBirthplace() <em>Birthplace</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBirthplace()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String BIRTHPLACE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getBirthplace() <em>Birthplace</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBirthplace()
-	 * @generated
-	 * @ordered
-	 */
-	protected String birthplace = BIRTHPLACE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getNumber() <em>Number</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNumber()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int NUMBER_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getNumber() <em>Number</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNumber()
-	 * @generated
-	 * @ordered
-	 */
-	protected int number = NUMBER_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHeightMesurement() <em>Height Mesurement</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHeightMesurement()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final HeightKind HEIGHT_MESUREMENT_EDEFAULT = HeightKind.INCHES_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getHeightMesurement() <em>Height Mesurement</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHeightMesurement()
-	 * @generated
-	 * @ordered
-	 */
-	protected HeightKind heightMesurement = HEIGHT_MESUREMENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHeightValue() <em>Height Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHeightValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int HEIGHT_VALUE_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getHeightValue() <em>Height Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHeightValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected int heightValue = HEIGHT_VALUE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWeightMesurement() <em>Weight Mesurement</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWeightMesurement()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final WeightKind WEIGHT_MESUREMENT_EDEFAULT = WeightKind.POUNDS_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getWeightMesurement() <em>Weight Mesurement</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWeightMesurement()
-	 * @generated
-	 * @ordered
-	 */
-	protected WeightKind weightMesurement = WEIGHT_MESUREMENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWeightValue() <em>Weight Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWeightValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int WEIGHT_VALUE_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getWeightValue() <em>Weight Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWeightValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected int weightValue = WEIGHT_VALUE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getShot() <em>Shot</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getShot()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final ShotKind SHOT_EDEFAULT = ShotKind.LEFT_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getShot() <em>Shot</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getShot()
-	 * @generated
-	 * @ordered
-	 */
-	protected ShotKind shot = SHOT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getBirthdate() <em>Birthdate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBirthdate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String BIRTHDATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getBirthdate() <em>Birthdate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBirthdate()
-	 * @generated
-	 * @ordered
-	 */
-	protected String birthdate = BIRTHDATE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PlayerImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return HockeyleaguePackage.Literals.PLAYER;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getBirthplace() {
-		return birthplace;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBirthplace(String newBirthplace) {
-		String oldBirthplace = birthplace;
-		birthplace = newBirthplace;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER__BIRTHPLACE, oldBirthplace, birthplace));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getNumber() {
-		return number;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNumber(int newNumber) {
-		int oldNumber = number;
-		number = newNumber;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER__NUMBER, oldNumber, number));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public HeightKind getHeightMesurement() {
-		return heightMesurement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHeightMesurement(HeightKind newHeightMesurement) {
-		HeightKind oldHeightMesurement = heightMesurement;
-		heightMesurement = newHeightMesurement == null ? HEIGHT_MESUREMENT_EDEFAULT : newHeightMesurement;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER__HEIGHT_MESUREMENT, oldHeightMesurement, heightMesurement));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getHeightValue() {
-		return heightValue;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHeightValue(int newHeightValue) {
-		int oldHeightValue = heightValue;
-		heightValue = newHeightValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER__HEIGHT_VALUE, oldHeightValue, heightValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WeightKind getWeightMesurement() {
-		return weightMesurement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWeightMesurement(WeightKind newWeightMesurement) {
-		WeightKind oldWeightMesurement = weightMesurement;
-		weightMesurement = newWeightMesurement == null ? WEIGHT_MESUREMENT_EDEFAULT : newWeightMesurement;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER__WEIGHT_MESUREMENT, oldWeightMesurement, weightMesurement));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getWeightValue() {
-		return weightValue;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWeightValue(int newWeightValue) {
-		int oldWeightValue = weightValue;
-		weightValue = newWeightValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER__WEIGHT_VALUE, oldWeightValue, weightValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ShotKind getShot() {
-		return shot;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setShot(ShotKind newShot) {
-		ShotKind oldShot = shot;
-		shot = newShot == null ? SHOT_EDEFAULT : newShot;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER__SHOT, oldShot, shot));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getBirthdate() {
-		return birthdate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBirthdate(String newBirthdate) {
-		String oldBirthdate = birthdate;
-		birthdate = newBirthdate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER__BIRTHDATE, oldBirthdate, birthdate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case HockeyleaguePackage.PLAYER__BIRTHPLACE:
-				return getBirthplace();
-			case HockeyleaguePackage.PLAYER__NUMBER:
-				return new Integer(getNumber());
-			case HockeyleaguePackage.PLAYER__HEIGHT_MESUREMENT:
-				return getHeightMesurement();
-			case HockeyleaguePackage.PLAYER__HEIGHT_VALUE:
-				return new Integer(getHeightValue());
-			case HockeyleaguePackage.PLAYER__WEIGHT_MESUREMENT:
-				return getWeightMesurement();
-			case HockeyleaguePackage.PLAYER__WEIGHT_VALUE:
-				return new Integer(getWeightValue());
-			case HockeyleaguePackage.PLAYER__SHOT:
-				return getShot();
-			case HockeyleaguePackage.PLAYER__BIRTHDATE:
-				return getBirthdate();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case HockeyleaguePackage.PLAYER__BIRTHPLACE:
-				setBirthplace((String)newValue);
-				return;
-			case HockeyleaguePackage.PLAYER__NUMBER:
-				setNumber(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.PLAYER__HEIGHT_MESUREMENT:
-				setHeightMesurement((HeightKind)newValue);
-				return;
-			case HockeyleaguePackage.PLAYER__HEIGHT_VALUE:
-				setHeightValue(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.PLAYER__WEIGHT_MESUREMENT:
-				setWeightMesurement((WeightKind)newValue);
-				return;
-			case HockeyleaguePackage.PLAYER__WEIGHT_VALUE:
-				setWeightValue(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.PLAYER__SHOT:
-				setShot((ShotKind)newValue);
-				return;
-			case HockeyleaguePackage.PLAYER__BIRTHDATE:
-				setBirthdate((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.PLAYER__BIRTHPLACE:
-				setBirthplace(BIRTHPLACE_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER__NUMBER:
-				setNumber(NUMBER_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER__HEIGHT_MESUREMENT:
-				setHeightMesurement(HEIGHT_MESUREMENT_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER__HEIGHT_VALUE:
-				setHeightValue(HEIGHT_VALUE_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER__WEIGHT_MESUREMENT:
-				setWeightMesurement(WEIGHT_MESUREMENT_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER__WEIGHT_VALUE:
-				setWeightValue(WEIGHT_VALUE_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER__SHOT:
-				setShot(SHOT_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER__BIRTHDATE:
-				setBirthdate(BIRTHDATE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.PLAYER__BIRTHPLACE:
-				return BIRTHPLACE_EDEFAULT == null ? birthplace != null : !BIRTHPLACE_EDEFAULT.equals(birthplace);
-			case HockeyleaguePackage.PLAYER__NUMBER:
-				return number != NUMBER_EDEFAULT;
-			case HockeyleaguePackage.PLAYER__HEIGHT_MESUREMENT:
-				return heightMesurement != HEIGHT_MESUREMENT_EDEFAULT;
-			case HockeyleaguePackage.PLAYER__HEIGHT_VALUE:
-				return heightValue != HEIGHT_VALUE_EDEFAULT;
-			case HockeyleaguePackage.PLAYER__WEIGHT_MESUREMENT:
-				return weightMesurement != WEIGHT_MESUREMENT_EDEFAULT;
-			case HockeyleaguePackage.PLAYER__WEIGHT_VALUE:
-				return weightValue != WEIGHT_VALUE_EDEFAULT;
-			case HockeyleaguePackage.PLAYER__SHOT:
-				return shot != SHOT_EDEFAULT;
-			case HockeyleaguePackage.PLAYER__BIRTHDATE:
-				return BIRTHDATE_EDEFAULT == null ? birthdate != null : !BIRTHDATE_EDEFAULT.equals(birthdate);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (birthplace: "); //$NON-NLS-1$
-		result.append(birthplace);
-		result.append(", number: "); //$NON-NLS-1$
-		result.append(number);
-		result.append(", heightMesurement: "); //$NON-NLS-1$
-		result.append(heightMesurement);
-		result.append(", heightValue: "); //$NON-NLS-1$
-		result.append(heightValue);
-		result.append(", weightMesurement: "); //$NON-NLS-1$
-		result.append(weightMesurement);
-		result.append(", weightValue: "); //$NON-NLS-1$
-		result.append(weightValue);
-		result.append(", shot: "); //$NON-NLS-1$
-		result.append(shot);
-		result.append(", birthdate: "); //$NON-NLS-1$
-		result.append(birthdate);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PlayerImpl
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/PlayerStatsImpl.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/PlayerStatsImpl.java
deleted file mode 100644
index a9c11a8..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/PlayerStatsImpl.java
+++ /dev/null
@@ -1,821 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl;
-
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Player Stats</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl#getYear <em>Year</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl#getTeam <em>Team</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl#getGamesPlayedIn <em>Games Played In</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl#getGoals <em>Goals</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl#getAssists <em>Assists</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl#getPoints <em>Points</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl#getPlusMinus <em>Plus Minus</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl#getPenaltyMinutes <em>Penalty Minutes</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl#getPowerPlayGoals <em>Power Play Goals</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl#getShortHandedGoals <em>Short Handed Goals</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl#getGameWinningGoals <em>Game Winning Goals</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl#getShots <em>Shots</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.PlayerStatsImpl#getShotPercentage <em>Shot Percentage</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PlayerStatsImpl extends EObjectImpl implements PlayerStats {
-	/**
-	 * The default value of the '{@link #getYear() <em>Year</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getYear()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String YEAR_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getYear() <em>Year</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getYear()
-	 * @generated
-	 * @ordered
-	 */
-	protected String year = YEAR_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getTeam() <em>Team</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTeam()
-	 * @generated
-	 * @ordered
-	 */
-	protected Team team = null;
-
-	/**
-	 * The default value of the '{@link #getGamesPlayedIn() <em>Games Played In</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGamesPlayedIn()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int GAMES_PLAYED_IN_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getGamesPlayedIn() <em>Games Played In</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGamesPlayedIn()
-	 * @generated
-	 * @ordered
-	 */
-	protected int gamesPlayedIn = GAMES_PLAYED_IN_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getGoals() <em>Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int GOALS_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getGoals() <em>Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected int goals = GOALS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getAssists() <em>Assists</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAssists()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int ASSISTS_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getAssists() <em>Assists</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAssists()
-	 * @generated
-	 * @ordered
-	 */
-	protected int assists = ASSISTS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPoints() <em>Points</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPoints()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int POINTS_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getPoints() <em>Points</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPoints()
-	 * @generated
-	 * @ordered
-	 */
-	protected int points = POINTS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPlusMinus() <em>Plus Minus</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPlusMinus()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int PLUS_MINUS_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getPlusMinus() <em>Plus Minus</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPlusMinus()
-	 * @generated
-	 * @ordered
-	 */
-	protected int plusMinus = PLUS_MINUS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPenaltyMinutes() <em>Penalty Minutes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPenaltyMinutes()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int PENALTY_MINUTES_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getPenaltyMinutes() <em>Penalty Minutes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPenaltyMinutes()
-	 * @generated
-	 * @ordered
-	 */
-	protected int penaltyMinutes = PENALTY_MINUTES_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPowerPlayGoals() <em>Power Play Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPowerPlayGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int POWER_PLAY_GOALS_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getPowerPlayGoals() <em>Power Play Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPowerPlayGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected int powerPlayGoals = POWER_PLAY_GOALS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getShortHandedGoals() <em>Short Handed Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getShortHandedGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int SHORT_HANDED_GOALS_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getShortHandedGoals() <em>Short Handed Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getShortHandedGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected int shortHandedGoals = SHORT_HANDED_GOALS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getGameWinningGoals() <em>Game Winning Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGameWinningGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int GAME_WINNING_GOALS_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getGameWinningGoals() <em>Game Winning Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGameWinningGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected int gameWinningGoals = GAME_WINNING_GOALS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getShots() <em>Shots</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getShots()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int SHOTS_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getShots() <em>Shots</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getShots()
-	 * @generated
-	 * @ordered
-	 */
-	protected int shots = SHOTS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getShotPercentage() <em>Shot Percentage</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getShotPercentage()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float SHOT_PERCENTAGE_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getShotPercentage() <em>Shot Percentage</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getShotPercentage()
-	 * @generated
-	 * @ordered
-	 */
-	protected float shotPercentage = SHOT_PERCENTAGE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PlayerStatsImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return HockeyleaguePackage.Literals.PLAYER_STATS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getYear() {
-		return year;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setYear(String newYear) {
-		String oldYear = year;
-		year = newYear;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER_STATS__YEAR, oldYear, year));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Team getTeam() {
-		if (team != null && team.eIsProxy()) {
-			InternalEObject oldTeam = (InternalEObject)team;
-			team = (Team)eResolveProxy(oldTeam);
-			if (team != oldTeam) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, HockeyleaguePackage.PLAYER_STATS__TEAM, oldTeam, team));
-			}
-		}
-		return team;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Team basicGetTeam() {
-		return team;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTeam(Team newTeam) {
-		Team oldTeam = team;
-		team = newTeam;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER_STATS__TEAM, oldTeam, team));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getGamesPlayedIn() {
-		return gamesPlayedIn;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGamesPlayedIn(int newGamesPlayedIn) {
-		int oldGamesPlayedIn = gamesPlayedIn;
-		gamesPlayedIn = newGamesPlayedIn;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER_STATS__GAMES_PLAYED_IN, oldGamesPlayedIn, gamesPlayedIn));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getGoals() {
-		return goals;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGoals(int newGoals) {
-		int oldGoals = goals;
-		goals = newGoals;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER_STATS__GOALS, oldGoals, goals));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getAssists() {
-		return assists;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAssists(int newAssists) {
-		int oldAssists = assists;
-		assists = newAssists;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER_STATS__ASSISTS, oldAssists, assists));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getPoints() {
-		return points;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPoints(int newPoints) {
-		int oldPoints = points;
-		points = newPoints;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER_STATS__POINTS, oldPoints, points));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getPlusMinus() {
-		return plusMinus;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPlusMinus(int newPlusMinus) {
-		int oldPlusMinus = plusMinus;
-		plusMinus = newPlusMinus;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER_STATS__PLUS_MINUS, oldPlusMinus, plusMinus));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getPenaltyMinutes() {
-		return penaltyMinutes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPenaltyMinutes(int newPenaltyMinutes) {
-		int oldPenaltyMinutes = penaltyMinutes;
-		penaltyMinutes = newPenaltyMinutes;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER_STATS__PENALTY_MINUTES, oldPenaltyMinutes, penaltyMinutes));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getPowerPlayGoals() {
-		return powerPlayGoals;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPowerPlayGoals(int newPowerPlayGoals) {
-		int oldPowerPlayGoals = powerPlayGoals;
-		powerPlayGoals = newPowerPlayGoals;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER_STATS__POWER_PLAY_GOALS, oldPowerPlayGoals, powerPlayGoals));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getShortHandedGoals() {
-		return shortHandedGoals;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setShortHandedGoals(int newShortHandedGoals) {
-		int oldShortHandedGoals = shortHandedGoals;
-		shortHandedGoals = newShortHandedGoals;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER_STATS__SHORT_HANDED_GOALS, oldShortHandedGoals, shortHandedGoals));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getGameWinningGoals() {
-		return gameWinningGoals;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGameWinningGoals(int newGameWinningGoals) {
-		int oldGameWinningGoals = gameWinningGoals;
-		gameWinningGoals = newGameWinningGoals;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER_STATS__GAME_WINNING_GOALS, oldGameWinningGoals, gameWinningGoals));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getShots() {
-		return shots;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setShots(int newShots) {
-		int oldShots = shots;
-		shots = newShots;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER_STATS__SHOTS, oldShots, shots));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getShotPercentage() {
-		return shotPercentage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setShotPercentage(float newShotPercentage) {
-		float oldShotPercentage = shotPercentage;
-		shotPercentage = newShotPercentage;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.PLAYER_STATS__SHOT_PERCENTAGE, oldShotPercentage, shotPercentage));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case HockeyleaguePackage.PLAYER_STATS__YEAR:
-				return getYear();
-			case HockeyleaguePackage.PLAYER_STATS__TEAM:
-				if (resolve) return getTeam();
-				return basicGetTeam();
-			case HockeyleaguePackage.PLAYER_STATS__GAMES_PLAYED_IN:
-				return new Integer(getGamesPlayedIn());
-			case HockeyleaguePackage.PLAYER_STATS__GOALS:
-				return new Integer(getGoals());
-			case HockeyleaguePackage.PLAYER_STATS__ASSISTS:
-				return new Integer(getAssists());
-			case HockeyleaguePackage.PLAYER_STATS__POINTS:
-				return new Integer(getPoints());
-			case HockeyleaguePackage.PLAYER_STATS__PLUS_MINUS:
-				return new Integer(getPlusMinus());
-			case HockeyleaguePackage.PLAYER_STATS__PENALTY_MINUTES:
-				return new Integer(getPenaltyMinutes());
-			case HockeyleaguePackage.PLAYER_STATS__POWER_PLAY_GOALS:
-				return new Integer(getPowerPlayGoals());
-			case HockeyleaguePackage.PLAYER_STATS__SHORT_HANDED_GOALS:
-				return new Integer(getShortHandedGoals());
-			case HockeyleaguePackage.PLAYER_STATS__GAME_WINNING_GOALS:
-				return new Integer(getGameWinningGoals());
-			case HockeyleaguePackage.PLAYER_STATS__SHOTS:
-				return new Integer(getShots());
-			case HockeyleaguePackage.PLAYER_STATS__SHOT_PERCENTAGE:
-				return new Float(getShotPercentage());
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case HockeyleaguePackage.PLAYER_STATS__YEAR:
-				setYear((String)newValue);
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__TEAM:
-				setTeam((Team)newValue);
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__GAMES_PLAYED_IN:
-				setGamesPlayedIn(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__GOALS:
-				setGoals(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__ASSISTS:
-				setAssists(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__POINTS:
-				setPoints(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__PLUS_MINUS:
-				setPlusMinus(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__PENALTY_MINUTES:
-				setPenaltyMinutes(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__POWER_PLAY_GOALS:
-				setPowerPlayGoals(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__SHORT_HANDED_GOALS:
-				setShortHandedGoals(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__GAME_WINNING_GOALS:
-				setGameWinningGoals(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__SHOTS:
-				setShots(((Integer)newValue).intValue());
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__SHOT_PERCENTAGE:
-				setShotPercentage(((Float)newValue).floatValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.PLAYER_STATS__YEAR:
-				setYear(YEAR_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__TEAM:
-				setTeam((Team)null);
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__GAMES_PLAYED_IN:
-				setGamesPlayedIn(GAMES_PLAYED_IN_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__GOALS:
-				setGoals(GOALS_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__ASSISTS:
-				setAssists(ASSISTS_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__POINTS:
-				setPoints(POINTS_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__PLUS_MINUS:
-				setPlusMinus(PLUS_MINUS_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__PENALTY_MINUTES:
-				setPenaltyMinutes(PENALTY_MINUTES_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__POWER_PLAY_GOALS:
-				setPowerPlayGoals(POWER_PLAY_GOALS_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__SHORT_HANDED_GOALS:
-				setShortHandedGoals(SHORT_HANDED_GOALS_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__GAME_WINNING_GOALS:
-				setGameWinningGoals(GAME_WINNING_GOALS_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__SHOTS:
-				setShots(SHOTS_EDEFAULT);
-				return;
-			case HockeyleaguePackage.PLAYER_STATS__SHOT_PERCENTAGE:
-				setShotPercentage(SHOT_PERCENTAGE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.PLAYER_STATS__YEAR:
-				return YEAR_EDEFAULT == null ? year != null : !YEAR_EDEFAULT.equals(year);
-			case HockeyleaguePackage.PLAYER_STATS__TEAM:
-				return team != null;
-			case HockeyleaguePackage.PLAYER_STATS__GAMES_PLAYED_IN:
-				return gamesPlayedIn != GAMES_PLAYED_IN_EDEFAULT;
-			case HockeyleaguePackage.PLAYER_STATS__GOALS:
-				return goals != GOALS_EDEFAULT;
-			case HockeyleaguePackage.PLAYER_STATS__ASSISTS:
-				return assists != ASSISTS_EDEFAULT;
-			case HockeyleaguePackage.PLAYER_STATS__POINTS:
-				return points != POINTS_EDEFAULT;
-			case HockeyleaguePackage.PLAYER_STATS__PLUS_MINUS:
-				return plusMinus != PLUS_MINUS_EDEFAULT;
-			case HockeyleaguePackage.PLAYER_STATS__PENALTY_MINUTES:
-				return penaltyMinutes != PENALTY_MINUTES_EDEFAULT;
-			case HockeyleaguePackage.PLAYER_STATS__POWER_PLAY_GOALS:
-				return powerPlayGoals != POWER_PLAY_GOALS_EDEFAULT;
-			case HockeyleaguePackage.PLAYER_STATS__SHORT_HANDED_GOALS:
-				return shortHandedGoals != SHORT_HANDED_GOALS_EDEFAULT;
-			case HockeyleaguePackage.PLAYER_STATS__GAME_WINNING_GOALS:
-				return gameWinningGoals != GAME_WINNING_GOALS_EDEFAULT;
-			case HockeyleaguePackage.PLAYER_STATS__SHOTS:
-				return shots != SHOTS_EDEFAULT;
-			case HockeyleaguePackage.PLAYER_STATS__SHOT_PERCENTAGE:
-				return shotPercentage != SHOT_PERCENTAGE_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (year: "); //$NON-NLS-1$
-		result.append(year);
-		result.append(", gamesPlayedIn: "); //$NON-NLS-1$
-		result.append(gamesPlayedIn);
-		result.append(", goals: "); //$NON-NLS-1$
-		result.append(goals);
-		result.append(", assists: "); //$NON-NLS-1$
-		result.append(assists);
-		result.append(", points: "); //$NON-NLS-1$
-		result.append(points);
-		result.append(", plusMinus: "); //$NON-NLS-1$
-		result.append(plusMinus);
-		result.append(", penaltyMinutes: "); //$NON-NLS-1$
-		result.append(penaltyMinutes);
-		result.append(", powerPlayGoals: "); //$NON-NLS-1$
-		result.append(powerPlayGoals);
-		result.append(", shortHandedGoals: "); //$NON-NLS-1$
-		result.append(shortHandedGoals);
-		result.append(", gameWinningGoals: "); //$NON-NLS-1$
-		result.append(gameWinningGoals);
-		result.append(", shots: "); //$NON-NLS-1$
-		result.append(shots);
-		result.append(", shotPercentage: "); //$NON-NLS-1$
-		result.append(shotPercentage);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PlayerStatsImpl
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/TeamImpl.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/TeamImpl.java
deleted file mode 100644
index eef64da..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/impl/TeamImpl.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl;
-
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Team</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.TeamImpl#getForwards <em>Forwards</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.TeamImpl#getDefencemen <em>Defencemen</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.TeamImpl#getGoalies <em>Goalies</em>}</li>
- *   <li>{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.impl.TeamImpl#getArena <em>Arena</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TeamImpl extends HockeyleagueObjectImpl implements Team {
-	/**
-	 * The cached value of the '{@link #getForwards() <em>Forwards</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getForwards()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList forwards = null;
-
-	/**
-	 * The cached value of the '{@link #getDefencemen() <em>Defencemen</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefencemen()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList defencemen = null;
-
-	/**
-	 * The cached value of the '{@link #getGoalies() <em>Goalies</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGoalies()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList goalies = null;
-
-	/**
-	 * The cached value of the '{@link #getArena() <em>Arena</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getArena()
-	 * @generated
-	 * @ordered
-	 */
-	protected Arena arena = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TeamImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return HockeyleaguePackage.Literals.TEAM;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getForwards() {
-		if (forwards == null) {
-			forwards = new EObjectContainmentEList(Forward.class, this, HockeyleaguePackage.TEAM__FORWARDS);
-		}
-		return forwards;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDefencemen() {
-		if (defencemen == null) {
-			defencemen = new EObjectContainmentEList(Defence.class, this, HockeyleaguePackage.TEAM__DEFENCEMEN);
-		}
-		return defencemen;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getGoalies() {
-		if (goalies == null) {
-			goalies = new EObjectContainmentEList(Goalie.class, this, HockeyleaguePackage.TEAM__GOALIES);
-		}
-		return goalies;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Arena getArena() {
-		return arena;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetArena(Arena newArena, NotificationChain msgs) {
-		Arena oldArena = arena;
-		arena = newArena;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.TEAM__ARENA, oldArena, newArena);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setArena(Arena newArena) {
-		if (newArena != arena) {
-			NotificationChain msgs = null;
-			if (arena != null)
-				msgs = ((InternalEObject)arena).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - HockeyleaguePackage.TEAM__ARENA, null, msgs);
-			if (newArena != null)
-				msgs = ((InternalEObject)newArena).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - HockeyleaguePackage.TEAM__ARENA, null, msgs);
-			msgs = basicSetArena(newArena, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, HockeyleaguePackage.TEAM__ARENA, newArena, newArena));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case HockeyleaguePackage.TEAM__FORWARDS:
-				return ((InternalEList)getForwards()).basicRemove(otherEnd, msgs);
-			case HockeyleaguePackage.TEAM__DEFENCEMEN:
-				return ((InternalEList)getDefencemen()).basicRemove(otherEnd, msgs);
-			case HockeyleaguePackage.TEAM__GOALIES:
-				return ((InternalEList)getGoalies()).basicRemove(otherEnd, msgs);
-			case HockeyleaguePackage.TEAM__ARENA:
-				return basicSetArena(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case HockeyleaguePackage.TEAM__FORWARDS:
-				return getForwards();
-			case HockeyleaguePackage.TEAM__DEFENCEMEN:
-				return getDefencemen();
-			case HockeyleaguePackage.TEAM__GOALIES:
-				return getGoalies();
-			case HockeyleaguePackage.TEAM__ARENA:
-				return getArena();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case HockeyleaguePackage.TEAM__FORWARDS:
-				getForwards().clear();
-				getForwards().addAll((Collection)newValue);
-				return;
-			case HockeyleaguePackage.TEAM__DEFENCEMEN:
-				getDefencemen().clear();
-				getDefencemen().addAll((Collection)newValue);
-				return;
-			case HockeyleaguePackage.TEAM__GOALIES:
-				getGoalies().clear();
-				getGoalies().addAll((Collection)newValue);
-				return;
-			case HockeyleaguePackage.TEAM__ARENA:
-				setArena((Arena)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.TEAM__FORWARDS:
-				getForwards().clear();
-				return;
-			case HockeyleaguePackage.TEAM__DEFENCEMEN:
-				getDefencemen().clear();
-				return;
-			case HockeyleaguePackage.TEAM__GOALIES:
-				getGoalies().clear();
-				return;
-			case HockeyleaguePackage.TEAM__ARENA:
-				setArena((Arena)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case HockeyleaguePackage.TEAM__FORWARDS:
-				return forwards != null && !forwards.isEmpty();
-			case HockeyleaguePackage.TEAM__DEFENCEMEN:
-				return defencemen != null && !defencemen.isEmpty();
-			case HockeyleaguePackage.TEAM__GOALIES:
-				return goalies != null && !goalies.isEmpty();
-			case HockeyleaguePackage.TEAM__ARENA:
-				return arena != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //TeamImpl
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/ArenaItemProvider.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/ArenaItemProvider.java
deleted file mode 100644
index 6d01d59..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/ArenaItemProvider.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.provider;
-
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePlugin;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ArenaItemProvider
-	extends HockeyleagueObjectItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ArenaItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addAddressPropertyDescriptor(object);
-			addCapacityPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Address feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAddressPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Arena_address_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Arena_address_feature", "_UI_Arena_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.ARENA__ADDRESS,
-				 true,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Capacity feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addCapacityPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Arena_capacity_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Arena_capacity_feature", "_UI_Arena_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.ARENA__CAPACITY,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns Arena.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return getResourceLocator().getImage("full/obj16/Arena"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Arena)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_Arena_type") : //$NON-NLS-1$
-			getString("_UI_Arena_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Arena.class)) {
-			case HockeyleaguePackage.ARENA__ADDRESS:
-			case HockeyleaguePackage.ARENA__CAPACITY:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return HockeyleaguePlugin.INSTANCE;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/DefenceItemProvider.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/DefenceItemProvider.java
deleted file mode 100644
index 0a938e6..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/DefenceItemProvider.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.provider;
-
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueFactory;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePlugin;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DefenceItemProvider
-	extends PlayerItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefenceItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addPositionPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Position feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPositionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Defence_position_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Defence_position_feature", "_UI_Defence_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.DEFENCE__POSITION,
-				 true,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(HockeyleaguePackage.Literals.DEFENCE__PLAYER_STATS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * This returns Defence.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return getResourceLocator().getImage("full/obj16/Defence"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Defence)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_Defence_type") : //$NON-NLS-1$
-			getString("_UI_Defence_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Defence.class)) {
-			case HockeyleaguePackage.DEFENCE__POSITION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case HockeyleaguePackage.DEFENCE__PLAYER_STATS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(HockeyleaguePackage.Literals.DEFENCE__PLAYER_STATS,
-				 HockeyleagueFactory.eINSTANCE.createPlayerStats()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return HockeyleaguePlugin.INSTANCE;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/ForwardItemProvider.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/ForwardItemProvider.java
deleted file mode 100644
index e31339a..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/ForwardItemProvider.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.provider;
-
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueFactory;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePlugin;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ForwardItemProvider
-	extends PlayerItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ForwardItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addPositionPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Position feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPositionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Forward_position_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Forward_position_feature", "_UI_Forward_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.FORWARD__POSITION,
-				 true,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(HockeyleaguePackage.Literals.FORWARD__PLAYER_STATS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * This returns Forward.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return getResourceLocator().getImage("full/obj16/Forward"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Forward)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_Forward_type") : //$NON-NLS-1$
-			getString("_UI_Forward_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Forward.class)) {
-			case HockeyleaguePackage.FORWARD__POSITION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case HockeyleaguePackage.FORWARD__PLAYER_STATS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(HockeyleaguePackage.Literals.FORWARD__PLAYER_STATS,
-				 HockeyleagueFactory.eINSTANCE.createPlayerStats()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return HockeyleaguePlugin.INSTANCE;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/GoalieItemProvider.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/GoalieItemProvider.java
deleted file mode 100644
index c28bbcb..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/GoalieItemProvider.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.provider;
-
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueFactory;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePlugin;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class GoalieItemProvider
-	extends PlayerItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GoalieItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(HockeyleaguePackage.Literals.GOALIE__GOALIE_STATS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * This returns Goalie.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return getResourceLocator().getImage("full/obj16/Goalie"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Goalie)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_Goalie_type") : //$NON-NLS-1$
-			getString("_UI_Goalie_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Goalie.class)) {
-			case HockeyleaguePackage.GOALIE__GOALIE_STATS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(HockeyleaguePackage.Literals.GOALIE__GOALIE_STATS,
-				 HockeyleagueFactory.eINSTANCE.createGoalieStats()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return HockeyleaguePlugin.INSTANCE;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/GoalieStatsItemProvider.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/GoalieStatsItemProvider.java
deleted file mode 100644
index 448a5f2..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/GoalieStatsItemProvider.java
+++ /dev/null
@@ -1,486 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.provider;
-
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePlugin;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class GoalieStatsItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GoalieStatsItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addYearPropertyDescriptor(object);
-			addTeamPropertyDescriptor(object);
-			addGamesPlayedInPropertyDescriptor(object);
-			addMinutesPlayedInPropertyDescriptor(object);
-			addGoalsAgainstAveragePropertyDescriptor(object);
-			addWinsPropertyDescriptor(object);
-			addLossesPropertyDescriptor(object);
-			addTiesPropertyDescriptor(object);
-			addEmptyNetGoalsPropertyDescriptor(object);
-			addShutoutsPropertyDescriptor(object);
-			addGoalsAgainstPropertyDescriptor(object);
-			addSavesPropertyDescriptor(object);
-			addPenaltyMinutesPropertyDescriptor(object);
-			addGoalsPropertyDescriptor(object);
-			addAssistsPropertyDescriptor(object);
-			addPointsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Year feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addYearPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_year_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_year_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__YEAR,
-				 true,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Team feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTeamPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_team_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_team_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__TEAM,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Games Played In feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addGamesPlayedInPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_gamesPlayedIn_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_gamesPlayedIn_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__GAMES_PLAYED_IN,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Minutes Played In feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addMinutesPlayedInPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_minutesPlayedIn_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_minutesPlayedIn_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__MINUTES_PLAYED_IN,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Goals Against Average feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addGoalsAgainstAveragePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_goalsAgainstAverage_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_goalsAgainstAverage_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__GOALS_AGAINST_AVERAGE,
-				 true,
-				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Wins feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addWinsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_wins_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_wins_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__WINS,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Losses feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addLossesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_losses_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_losses_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__LOSSES,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Ties feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTiesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_ties_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_ties_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__TIES,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Empty Net Goals feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addEmptyNetGoalsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_emptyNetGoals_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_emptyNetGoals_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__EMPTY_NET_GOALS,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Shutouts feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addShutoutsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_shutouts_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_shutouts_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__SHUTOUTS,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Goals Against feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addGoalsAgainstPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_goalsAgainst_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_goalsAgainst_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__GOALS_AGAINST,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Saves feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSavesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_saves_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_saves_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__SAVES,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Penalty Minutes feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPenaltyMinutesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_penaltyMinutes_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_penaltyMinutes_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__PENALTY_MINUTES,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Goals feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addGoalsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_goals_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_goals_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__GOALS,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Assists feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAssistsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_assists_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_assists_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__ASSISTS,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Points feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPointsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_GoalieStats_points_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_GoalieStats_points_feature", "_UI_GoalieStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.GOALIE_STATS__POINTS,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns GoalieStats.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return getResourceLocator().getImage("full/obj16/GoalieStats"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((GoalieStats)object).getYear();
-		return label == null || label.length() == 0 ?
-			getString("_UI_GoalieStats_type") : //$NON-NLS-1$
-			getString("_UI_GoalieStats_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(GoalieStats.class)) {
-			case HockeyleaguePackage.GOALIE_STATS__YEAR:
-			case HockeyleaguePackage.GOALIE_STATS__GAMES_PLAYED_IN:
-			case HockeyleaguePackage.GOALIE_STATS__MINUTES_PLAYED_IN:
-			case HockeyleaguePackage.GOALIE_STATS__GOALS_AGAINST_AVERAGE:
-			case HockeyleaguePackage.GOALIE_STATS__WINS:
-			case HockeyleaguePackage.GOALIE_STATS__LOSSES:
-			case HockeyleaguePackage.GOALIE_STATS__TIES:
-			case HockeyleaguePackage.GOALIE_STATS__EMPTY_NET_GOALS:
-			case HockeyleaguePackage.GOALIE_STATS__SHUTOUTS:
-			case HockeyleaguePackage.GOALIE_STATS__GOALS_AGAINST:
-			case HockeyleaguePackage.GOALIE_STATS__SAVES:
-			case HockeyleaguePackage.GOALIE_STATS__PENALTY_MINUTES:
-			case HockeyleaguePackage.GOALIE_STATS__GOALS:
-			case HockeyleaguePackage.GOALIE_STATS__ASSISTS:
-			case HockeyleaguePackage.GOALIE_STATS__POINTS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return HockeyleaguePlugin.INSTANCE;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/HockeyleagueItemProviderAdapterFactory.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/HockeyleagueItemProviderAdapterFactory.java
deleted file mode 100644
index 167654a..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/HockeyleagueItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,364 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.provider;
-
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.edit.provider.ChangeNotifier;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.IChangeNotifier;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.INotifyChangedListener;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.util.HockeyleagueAdapterFactory;
-
-/**
- * This is the factory that is used to provide the interfaces needed to support Viewers.
- * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
- * The adapters also support Eclipse property sheets.
- * Note that most of the adapters are shared among multiple instances.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class HockeyleagueItemProviderAdapterFactory extends HockeyleagueAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable {
-	/**
-	 * This keeps track of the root adapter factory that delegates to this adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComposedAdapterFactory parentAdapterFactory;
-
-	/**
-	 * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IChangeNotifier changeNotifier = new ChangeNotifier();
-
-	/**
-	 * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Collection supportedTypes = new ArrayList();
-
-	/**
-	 * This constructs an instance.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public HockeyleagueItemProviderAdapterFactory() {
-		supportedTypes.add(IEditingDomainItemProvider.class);
-		supportedTypes.add(IStructuredItemContentProvider.class);
-		supportedTypes.add(ITreeItemContentProvider.class);
-		supportedTypes.add(IItemLabelProvider.class);
-		supportedTypes.add(IItemPropertySource.class);		
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ArenaItemProvider arenaItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createArenaAdapter() {
-		if (arenaItemProvider == null) {
-			arenaItemProvider = new ArenaItemProvider(this);
-		}
-
-		return arenaItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefenceItemProvider defenceItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDefenceAdapter() {
-		if (defenceItemProvider == null) {
-			defenceItemProvider = new DefenceItemProvider(this);
-		}
-
-		return defenceItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ForwardItemProvider forwardItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createForwardAdapter() {
-		if (forwardItemProvider == null) {
-			forwardItemProvider = new ForwardItemProvider(this);
-		}
-
-		return forwardItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GoalieItemProvider goalieItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createGoalieAdapter() {
-		if (goalieItemProvider == null) {
-			goalieItemProvider = new GoalieItemProvider(this);
-		}
-
-		return goalieItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GoalieStatsItemProvider goalieStatsItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createGoalieStatsAdapter() {
-		if (goalieStatsItemProvider == null) {
-			goalieStatsItemProvider = new GoalieStatsItemProvider(this);
-		}
-
-		return goalieStatsItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LeagueItemProvider leagueItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createLeagueAdapter() {
-		if (leagueItemProvider == null) {
-			leagueItemProvider = new LeagueItemProvider(this);
-		}
-
-		return leagueItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PlayerStatsItemProvider playerStatsItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPlayerStatsAdapter() {
-		if (playerStatsItemProvider == null) {
-			playerStatsItemProvider = new PlayerStatsItemProvider(this);
-		}
-
-		return playerStatsItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TeamItemProvider teamItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createTeamAdapter() {
-		if (teamItemProvider == null) {
-			teamItemProvider = new TeamItemProvider(this);
-		}
-
-		return teamItemProvider;
-	}
-
-	/**
-	 * This returns the root adapter factory that contains this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComposeableAdapterFactory getRootAdapterFactory() {
-		return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
-	}
-
-	/**
-	 * This sets the composed adapter factory that contains this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
-		this.parentAdapterFactory = parentAdapterFactory;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object type) {
-		return supportedTypes.contains(type) || super.isFactoryForType(type);
-	}
-
-	/**
-	 * This implementation substitutes the factory itself as the key for the adapter.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter adapt(Notifier notifier, Object type) {
-		return super.adapt(notifier, this);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object adapt(Object object, Object type) {
-		if (isFactoryForType(type)) {
-			Object adapter = super.adapt(object, type);
-			if (!(type instanceof Class) || (((Class)type).isInstance(adapter))) {
-				return adapter;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * This adds a listener.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void addListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.addListener(notifyChangedListener);
-	}
-
-	/**
-	 * This removes a listener.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void removeListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.removeListener(notifyChangedListener);
-	}
-
-	/**
-	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void fireNotifyChanged(Notification notification) {
-		changeNotifier.fireNotifyChanged(notification);
-
-		if (parentAdapterFactory != null) {
-			parentAdapterFactory.fireNotifyChanged(notification);
-		}
-	}
-
-	/**
-	 * This disposes all of the item providers created by this factory. 
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void dispose() {
-		if (arenaItemProvider != null) arenaItemProvider.dispose();
-		if (defenceItemProvider != null) defenceItemProvider.dispose();
-		if (forwardItemProvider != null) forwardItemProvider.dispose();
-		if (goalieItemProvider != null) goalieItemProvider.dispose();
-		if (goalieStatsItemProvider != null) goalieStatsItemProvider.dispose();
-		if (leagueItemProvider != null) leagueItemProvider.dispose();
-		if (playerStatsItemProvider != null) playerStatsItemProvider.dispose();
-		if (teamItemProvider != null) teamItemProvider.dispose();
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/HockeyleagueObjectItemProvider.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/HockeyleagueObjectItemProvider.java
deleted file mode 100644
index d4a63c4..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/HockeyleagueObjectItemProvider.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.provider;
-
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueObject;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePlugin;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueObject} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class HockeyleagueObjectItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public HockeyleagueObjectItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Name feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_HockeyleagueObject_name_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_HockeyleagueObject_name_feature", "_UI_HockeyleagueObject_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.HOCKEYLEAGUE_OBJECT__NAME,
-				 true,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((HockeyleagueObject)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_HockeyleagueObject_type") : //$NON-NLS-1$
-			getString("_UI_HockeyleagueObject_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(HockeyleagueObject.class)) {
-			case HockeyleaguePackage.HOCKEYLEAGUE_OBJECT__NAME:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return HockeyleaguePlugin.INSTANCE;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/LeagueItemProvider.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/LeagueItemProvider.java
deleted file mode 100644
index 6594ece..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/LeagueItemProvider.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.provider;
-
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueFactory;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePlugin;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class LeagueItemProvider
-	extends HockeyleagueObjectItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LeagueItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addHeadofficePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Headoffice feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addHeadofficePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_League_headoffice_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_League_headoffice_feature", "_UI_League_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.LEAGUE__HEADOFFICE,
-				 true,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(HockeyleaguePackage.Literals.LEAGUE__TEAMS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * This returns League.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return getResourceLocator().getImage("full/obj16/League"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((League)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_League_type") : //$NON-NLS-1$
-			getString("_UI_League_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(League.class)) {
-			case HockeyleaguePackage.LEAGUE__HEADOFFICE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case HockeyleaguePackage.LEAGUE__TEAMS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(HockeyleaguePackage.Literals.LEAGUE__TEAMS,
-				 HockeyleagueFactory.eINSTANCE.createTeam()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return HockeyleaguePlugin.INSTANCE;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/PlayerItemProvider.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/PlayerItemProvider.java
deleted file mode 100644
index 0235a1a..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/PlayerItemProvider.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.provider;
-
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePlugin;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PlayerItemProvider
-	extends HockeyleagueObjectItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PlayerItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addBirthplacePropertyDescriptor(object);
-			addNumberPropertyDescriptor(object);
-			addHeightMesurementPropertyDescriptor(object);
-			addHeightValuePropertyDescriptor(object);
-			addWeightMesurementPropertyDescriptor(object);
-			addWeightValuePropertyDescriptor(object);
-			addShotPropertyDescriptor(object);
-			addBirthdatePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Birthplace feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addBirthplacePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Player_birthplace_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Player_birthplace_feature", "_UI_Player_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER__BIRTHPLACE,
-				 true,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Number feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addNumberPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Player_number_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Player_number_feature", "_UI_Player_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER__NUMBER,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Height Mesurement feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addHeightMesurementPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Player_heightMesurement_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Player_heightMesurement_feature", "_UI_Player_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER__HEIGHT_MESUREMENT,
-				 true,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Height Value feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addHeightValuePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Player_heightValue_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Player_heightValue_feature", "_UI_Player_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER__HEIGHT_VALUE,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Weight Mesurement feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addWeightMesurementPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Player_weightMesurement_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Player_weightMesurement_feature", "_UI_Player_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER__WEIGHT_MESUREMENT,
-				 true,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Weight Value feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addWeightValuePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Player_weightValue_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Player_weightValue_feature", "_UI_Player_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER__WEIGHT_VALUE,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Shot feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addShotPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Player_shot_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Player_shot_feature", "_UI_Player_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER__SHOT,
-				 true,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Birthdate feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addBirthdatePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Player_birthdate_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Player_birthdate_feature", "_UI_Player_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER__BIRTHDATE,
-				 true,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Player)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_Player_type") : //$NON-NLS-1$
-			getString("_UI_Player_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Player.class)) {
-			case HockeyleaguePackage.PLAYER__BIRTHPLACE:
-			case HockeyleaguePackage.PLAYER__NUMBER:
-			case HockeyleaguePackage.PLAYER__HEIGHT_MESUREMENT:
-			case HockeyleaguePackage.PLAYER__HEIGHT_VALUE:
-			case HockeyleaguePackage.PLAYER__WEIGHT_MESUREMENT:
-			case HockeyleaguePackage.PLAYER__WEIGHT_VALUE:
-			case HockeyleaguePackage.PLAYER__SHOT:
-			case HockeyleaguePackage.PLAYER__BIRTHDATE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return HockeyleaguePlugin.INSTANCE;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/PlayerStatsItemProvider.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/PlayerStatsItemProvider.java
deleted file mode 100644
index 2072d50..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/PlayerStatsItemProvider.java
+++ /dev/null
@@ -1,420 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.provider;
-
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePlugin;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PlayerStatsItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PlayerStatsItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addYearPropertyDescriptor(object);
-			addTeamPropertyDescriptor(object);
-			addGamesPlayedInPropertyDescriptor(object);
-			addGoalsPropertyDescriptor(object);
-			addAssistsPropertyDescriptor(object);
-			addPointsPropertyDescriptor(object);
-			addPlusMinusPropertyDescriptor(object);
-			addPenaltyMinutesPropertyDescriptor(object);
-			addPowerPlayGoalsPropertyDescriptor(object);
-			addShortHandedGoalsPropertyDescriptor(object);
-			addGameWinningGoalsPropertyDescriptor(object);
-			addShotsPropertyDescriptor(object);
-			addShotPercentagePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Year feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addYearPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PlayerStats_year_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_PlayerStats_year_feature", "_UI_PlayerStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER_STATS__YEAR,
-				 true,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Team feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTeamPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PlayerStats_team_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_PlayerStats_team_feature", "_UI_PlayerStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER_STATS__TEAM,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Games Played In feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addGamesPlayedInPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PlayerStats_gamesPlayedIn_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_PlayerStats_gamesPlayedIn_feature", "_UI_PlayerStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER_STATS__GAMES_PLAYED_IN,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Goals feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addGoalsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PlayerStats_goals_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_PlayerStats_goals_feature", "_UI_PlayerStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER_STATS__GOALS,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Assists feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAssistsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PlayerStats_assists_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_PlayerStats_assists_feature", "_UI_PlayerStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER_STATS__ASSISTS,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Points feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPointsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PlayerStats_points_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_PlayerStats_points_feature", "_UI_PlayerStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER_STATS__POINTS,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Plus Minus feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPlusMinusPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PlayerStats_plusMinus_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_PlayerStats_plusMinus_feature", "_UI_PlayerStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER_STATS__PLUS_MINUS,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Penalty Minutes feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPenaltyMinutesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PlayerStats_penaltyMinutes_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_PlayerStats_penaltyMinutes_feature", "_UI_PlayerStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER_STATS__PENALTY_MINUTES,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Power Play Goals feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPowerPlayGoalsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PlayerStats_powerPlayGoals_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_PlayerStats_powerPlayGoals_feature", "_UI_PlayerStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER_STATS__POWER_PLAY_GOALS,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Short Handed Goals feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addShortHandedGoalsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PlayerStats_shortHandedGoals_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_PlayerStats_shortHandedGoals_feature", "_UI_PlayerStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER_STATS__SHORT_HANDED_GOALS,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Game Winning Goals feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addGameWinningGoalsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PlayerStats_gameWinningGoals_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_PlayerStats_gameWinningGoals_feature", "_UI_PlayerStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER_STATS__GAME_WINNING_GOALS,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Shots feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addShotsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PlayerStats_shots_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_PlayerStats_shots_feature", "_UI_PlayerStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER_STATS__SHOTS,
-				 true,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Shot Percentage feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addShotPercentagePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PlayerStats_shotPercentage_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_PlayerStats_shotPercentage_feature", "_UI_PlayerStats_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 HockeyleaguePackage.Literals.PLAYER_STATS__SHOT_PERCENTAGE,
-				 true,
-				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns PlayerStats.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return getResourceLocator().getImage("full/obj16/PlayerStats"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((PlayerStats)object).getYear();
-		return label == null || label.length() == 0 ?
-			getString("_UI_PlayerStats_type") : //$NON-NLS-1$
-			getString("_UI_PlayerStats_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(PlayerStats.class)) {
-			case HockeyleaguePackage.PLAYER_STATS__YEAR:
-			case HockeyleaguePackage.PLAYER_STATS__GAMES_PLAYED_IN:
-			case HockeyleaguePackage.PLAYER_STATS__GOALS:
-			case HockeyleaguePackage.PLAYER_STATS__ASSISTS:
-			case HockeyleaguePackage.PLAYER_STATS__POINTS:
-			case HockeyleaguePackage.PLAYER_STATS__PLUS_MINUS:
-			case HockeyleaguePackage.PLAYER_STATS__PENALTY_MINUTES:
-			case HockeyleaguePackage.PLAYER_STATS__POWER_PLAY_GOALS:
-			case HockeyleaguePackage.PLAYER_STATS__SHORT_HANDED_GOALS:
-			case HockeyleaguePackage.PLAYER_STATS__GAME_WINNING_GOALS:
-			case HockeyleaguePackage.PLAYER_STATS__SHOTS:
-			case HockeyleaguePackage.PLAYER_STATS__SHOT_PERCENTAGE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return HockeyleaguePlugin.INSTANCE;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/TeamItemProvider.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/TeamItemProvider.java
deleted file mode 100644
index 122942c..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/provider/TeamItemProvider.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.provider;
-
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueFactory;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePlugin;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class TeamItemProvider
-	extends HockeyleagueObjectItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TeamItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(HockeyleaguePackage.Literals.TEAM__FORWARDS);
-			childrenFeatures.add(HockeyleaguePackage.Literals.TEAM__DEFENCEMEN);
-			childrenFeatures.add(HockeyleaguePackage.Literals.TEAM__GOALIES);
-			childrenFeatures.add(HockeyleaguePackage.Literals.TEAM__ARENA);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns Team.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return getResourceLocator().getImage("full/obj16/Team"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Team)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_Team_type") : //$NON-NLS-1$
-			getString("_UI_Team_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Team.class)) {
-			case HockeyleaguePackage.TEAM__FORWARDS:
-			case HockeyleaguePackage.TEAM__DEFENCEMEN:
-			case HockeyleaguePackage.TEAM__GOALIES:
-			case HockeyleaguePackage.TEAM__ARENA:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds to the collection of {@link org.eclipse.emf.edit.command.CommandParameter}s
-	 * describing all of the children that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(HockeyleaguePackage.Literals.TEAM__FORWARDS,
-				 HockeyleagueFactory.eINSTANCE.createForward()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(HockeyleaguePackage.Literals.TEAM__DEFENCEMEN,
-				 HockeyleagueFactory.eINSTANCE.createDefence()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(HockeyleaguePackage.Literals.TEAM__GOALIES,
-				 HockeyleagueFactory.eINSTANCE.createGoalie()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(HockeyleaguePackage.Literals.TEAM__ARENA,
-				 HockeyleagueFactory.eINSTANCE.createArena()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return HockeyleaguePlugin.INSTANCE;
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/actions/HockeyleagueCreateChildAction.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/actions/HockeyleagueCreateChildAction.java
deleted file mode 100644
index c522581..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/actions/HockeyleagueCreateChildAction.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.actions;
-
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.CreateChildCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.ui.action.CreateChildAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.dialogs.HockeyleagueSetDefaultsDialog;
-
-/**
- * Create child action for the Tabbed Properties View Hockey League Example.
- * 
- * @author Anthony Hunter
- */
-public class HockeyleagueCreateChildAction extends CreateChildAction {
-	public HockeyleagueCreateChildAction(IEditorPart editorPart,
-			ISelection selection, Object descriptor) {
-		super(editorPart, selection, descriptor);
-	}
-
-	public void run() {
-		CreateChildCommand createChildCommand = (CreateChildCommand) this.command;
-		HockeyleagueSetDefaultsDialog dialog;
-		if (createChildCommand.getCommand() instanceof AddCommand) {
-			AddCommand addCommand = (AddCommand) createChildCommand.getCommand();
-			dialog = new HockeyleagueSetDefaultsDialog(Display.getCurrent()
-					.getActiveShell(), addCommand);
-		} else if (createChildCommand.getCommand() instanceof SetCommand) {
-			SetCommand setCommand = (SetCommand) createChildCommand.getCommand();
-			dialog = new HockeyleagueSetDefaultsDialog(Display.getCurrent()
-					.getActiveShell(), setCommand);
-		} else {
-			dialog = null;
-		}
-		dialog.open();
-		if (dialog.getReturnCode() == Window.CANCEL) {
-			return;
-		}
-		super.run();
-	}
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/dialogs/HockeyleagueSetDefaultsDialog.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/dialogs/HockeyleagueSetDefaultsDialog.java
deleted file mode 100644
index adf7d05..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/dialogs/HockeyleagueSetDefaultsDialog.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.dialogs;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.swt.SWT;
-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.swt.widgets.Text;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.DefencePositionKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ForwardPositionKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HeightKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ShotKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.WeightKind;
-
-/**
- * A defaults dialog that allows for data entry for the Tabbed Properties View
- * Hockey League Example.
- * 
- * @author Anthony Hunter
- */
-public class HockeyleagueSetDefaultsDialog
-	extends Dialog {
-
-	private class DefaultValue {
-
-		protected Method method;
-
-		protected String label;
-
-		protected Object value;
-
-		protected Object widget;
-
-		protected DefaultValue(Method method) {
-			this.method = method;
-			label = method.getName().substring(3) + ":";//$NON-NLS-1$
-		}
-
-		public String toString() {
-			return method.toString();
-		}
-	}
-
-	private EObject owner = null;
-
-	private EObject child = null;
-
-	private ArrayList defaultValues = null;
-
-	public HockeyleagueSetDefaultsDialog(Shell parentShell,
-			AddCommand addCommand) {
-		super(parentShell);
-		Collection collection = addCommand.getCollection();
-		this.owner = addCommand.getOwner();
-		this.child = (EObject) collection.iterator().next();
-		this.defaultValues = getDefaultValues(child);
-	}
-
-	public HockeyleagueSetDefaultsDialog(Shell parentShell,
-			SetCommand setCommand) {
-		super(parentShell);
-		this.owner = setCommand.getOwner();
-		this.child = (EObject) setCommand.getValue();
-		this.defaultValues = getDefaultValues(child);
-	}
-
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		shell.setText("Add New " + child.eClass().getName()); //$NON-NLS-1$
-	}
-
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite) super.createDialogArea(parent);
-		Group group = createGroup(composite, child.eClass().getName(), 2);
-		for (Iterator i = defaultValues.iterator(); i.hasNext();) {
-			DefaultValue defaultValue = (DefaultValue) i.next();
-			Label label = createLabel(group, defaultValue.label);
-			label.setToolTipText(""); //$NON-NLS-1$
-			Class setType = defaultValue.method.getParameterTypes()[0];
-			if (setType.equals(String.class)) {
-				defaultValue.widget = createTextField(group);
-				((Text) defaultValue.widget).setText(defaultValue.method
-					.getName().substring(3));
-			} else if (setType.equals(int.class)) {
-				defaultValue.widget = createTextField(group);
-				((Text) defaultValue.widget).setText("0");//$NON-NLS-1$
-			} else if (setType.equals(float.class)) {
-				defaultValue.widget = createTextField(group);
-				((Text) defaultValue.widget).setText("0.0F");//$NON-NLS-1$
-			} else if (setType.equals(Boolean.class)) {
-				defaultValue.widget = createCheckBox(group, "Yes"); //$NON-NLS-1$
-			} else if (setType.equals(DefencePositionKind.class)) {
-				defaultValue.widget = createCombo(group, new String[] {
-					DefencePositionKind.LEFT_DEFENCE_LITERAL.getName(),
-					DefencePositionKind.RIGHT_DEFENCE_LITERAL.getName()});
-			} else if (setType.equals(ForwardPositionKind.class)) {
-				defaultValue.widget = createCombo(group, new String[] {
-					ForwardPositionKind.LEFT_WING_LITERAL.getName(),
-					ForwardPositionKind.RIGHT_WING_LITERAL.getName(),
-					ForwardPositionKind.CENTER_LITERAL.getName()});
-			} else if (setType.equals(WeightKind.class)) {
-				defaultValue.widget = createCombo(group, new String[] {
-					WeightKind.POUNDS_LITERAL.getName(),
-					WeightKind.KILOGRAMS_LITERAL.getName()});
-			} else if (setType.equals(ShotKind.class)) {
-				defaultValue.widget = createCombo(group, new String[] {
-					ShotKind.LEFT_LITERAL.getName(),
-					ShotKind.RIGHT_LITERAL.getName()});
-			} else if (setType.equals(HeightKind.class)) {
-				defaultValue.widget = createCombo(group, new String[] {
-					HeightKind.INCHES_LITERAL.getName(),
-					HeightKind.CENTIMETERS_LITERAL.getName()});
-			} else if (setType.equals(Team.class)) {
-				League league = (League) owner.eResource().getContents().get(0);
-				Team[] teams = (Team[]) league.getTeams().toArray();
-				String[] teamNames = new String[teams.length];
-				for (int t = 0; t < teams.length; t++) {
-					teamNames[t] = teams[t].getName();
-				}
-				defaultValue.widget = createCombo(group, teamNames);
-			} else {
-				defaultValue.widget = createLabel(group, "N/A");//$NON-NLS-1$
-			}
-		}
-		return composite;
-	}
-
-	protected Group createGroup(Composite parent, String text, int numColumns) {
-		Group composite = new Group(parent, SWT.NONE);
-		composite.setText(text);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = numColumns;
-		layout.makeColumnsEqualWidth = false;
-		composite.setLayout(layout);
-		GridData data = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(data);
-		return composite;
-	}
-
-	protected Label createLabel(Composite parent, String text) {
-		Label label = new Label(parent, SWT.NONE);
-		label.setText(text);
-		GridData data = new GridData();
-		data.horizontalAlignment = GridData.FILL;
-		label.setLayoutData(data);
-		return label;
-	}
-
-	protected Text createTextField(Composite parent) {
-		Text text = new Text(parent, SWT.SINGLE | SWT.BORDER);
-		GridData data = new GridData();
-		data.horizontalAlignment = GridData.FILL;
-		data.grabExcessHorizontalSpace = true;
-		data.verticalAlignment = GridData.CENTER;
-		data.grabExcessVerticalSpace = false;
-		data.widthHint = 250;
-		text.setLayoutData(data);
-		return text;
-	}
-
-	protected Button createCheckBox(Composite group, String label) {
-		Button button = new Button(group, SWT.CHECK | SWT.LEFT);
-		button.setText(label);
-		GridData data = new GridData();
-		button.setLayoutData(data);
-		return button;
-	}
-
-	protected Combo createCombo(Composite parent, String[] items) {
-		Combo combo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
-		combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		combo.setFont(parent.getFont());
-		combo.setItems(items);
-		combo.select(0);
-		return combo;
-	}
-
-	protected void okPressed() {
-		for (Iterator i = defaultValues.iterator(); i.hasNext();) {
-			DefaultValue defaultValue = (DefaultValue) i.next();
-			Class setType = defaultValue.method.getParameterTypes()[0];
-			if (setType.equals(String.class)) {
-				defaultValue.value = ((Text) defaultValue.widget).getText();
-			} else if (setType.equals(int.class)) {
-				String text = ((Text) defaultValue.widget).getText();
-				defaultValue.value = Integer.valueOf(text);
-			} else if (setType.equals(float.class)) {
-				String text = ((Text) defaultValue.widget).getText();
-				defaultValue.value = Float.valueOf(text);
-			} else if (setType.equals(DefencePositionKind.class)) {
-				switch (((Combo) defaultValue.widget).getSelectionIndex()) {
-					case DefencePositionKind.LEFT_DEFENCE:
-						defaultValue.value = DefencePositionKind.LEFT_DEFENCE_LITERAL;
-						break;
-					case DefencePositionKind.RIGHT_DEFENCE:
-						defaultValue.value = DefencePositionKind.RIGHT_DEFENCE_LITERAL;
-						break;
-				}
-			} else if (setType.equals(ForwardPositionKind.class)) {
-				switch (((Combo) defaultValue.widget).getSelectionIndex()) {
-					case ForwardPositionKind.LEFT_WING:
-						defaultValue.value = ForwardPositionKind.LEFT_WING_LITERAL;
-						break;
-					case ForwardPositionKind.CENTER:
-						defaultValue.value = ForwardPositionKind.CENTER_LITERAL;
-						break;
-					case ForwardPositionKind.RIGHT_WING:
-						defaultValue.value = ForwardPositionKind.RIGHT_WING_LITERAL;
-						break;
-				}
-			} else if (setType.equals(WeightKind.class)) {
-				switch (((Combo) defaultValue.widget).getSelectionIndex()) {
-					case WeightKind.KILOGRAMS:
-						defaultValue.value = WeightKind.KILOGRAMS_LITERAL;
-						break;
-					case WeightKind.POUNDS:
-						defaultValue.value = WeightKind.POUNDS_LITERAL;
-						break;
-				}
-			} else if (setType.equals(ShotKind.class)) {
-				switch (((Combo) defaultValue.widget).getSelectionIndex()) {
-					case ShotKind.LEFT:
-						defaultValue.value = ShotKind.LEFT_LITERAL;
-						break;
-					case ShotKind.RIGHT:
-						defaultValue.value = ShotKind.RIGHT_LITERAL;
-						break;
-				}
-			} else if (setType.equals(HeightKind.class)) {
-				switch (((Combo) defaultValue.widget).getSelectionIndex()) {
-					case HeightKind.CENTIMETERS:
-						defaultValue.value = HeightKind.CENTIMETERS_LITERAL;
-						break;
-					case HeightKind.INCHES:
-						defaultValue.value = HeightKind.INCHES_LITERAL;
-						break;
-				}
-			} else if (setType.equals(Team.class)) {
-				League league = (League) owner.eResource().getContents().get(0);
-				Team[] teams = (Team[]) league.getTeams().toArray();
-				defaultValue.value = teams[((Combo) defaultValue.widget)
-					.getSelectionIndex()];
-			} else if (setType.equals(Boolean.class)) {
-				defaultValue.value = ((Button) defaultValue.widget)
-					.getSelection() ? Boolean.TRUE
-					: Boolean.FALSE;
-			}
-		}
-		setDefaultValues(defaultValues, child);
-		super.okPressed();
-	}
-
-	private ArrayList getDefaultValues(EObject aChild) {
-		ArrayList ret = new ArrayList();
-		Class childClassImpl = aChild.getClass();
-		Method[] methods = childClassImpl.getMethods();
-		for (int i = 0; i < methods.length; i++) {
-			if (methods[i].getName().startsWith("set")) {//$NON-NLS-1$
-				Class setType = methods[i].getParameterTypes()[0];
-				if (!setType.equals(Class.class)
-					&& !setType.equals(Arena.class)
-					&& !setType.equals(EList.class)) {
-					ret.add(new DefaultValue(methods[i]));
-				}
-			}
-		}
-		return ret;
-	}
-
-	private void setDefaultValues(ArrayList defaultValues, EObject child) {
-		for (Iterator i = defaultValues.iterator(); i.hasNext();) {
-			DefaultValue defaultValue = (DefaultValue) i.next();
-			try {
-				defaultValue.method.invoke(child,
-					new Object[] {defaultValue.value});
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/editor/HockeyleagueActionBarContributor.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/editor/HockeyleagueActionBarContributor.java
deleted file mode 100644
index 0ca9054..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/editor/HockeyleagueActionBarContributor.java
+++ /dev/null
@@ -1,405 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.editor;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.ui.action.CreateChildAction;
-import org.eclipse.emf.edit.ui.action.CreateSiblingAction;
-import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IContributionManager;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.action.SubContributionItem;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.actions.HockeyleagueCreateChildAction;
-
-/**
- * This is the action bar contributor for the Hockeyleague model editor.
- * 
- * @author Anthony Hunter
- */
-public class HockeyleagueActionBarContributor
-	extends EditingDomainActionBarContributor
-	implements ISelectionChangedListener {
-
-	/**
-	 * This keeps track of the active editor. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IEditorPart activeEditorPart;
-
-	/**
-	 * This keeps track of the current selection provider. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ISelectionProvider selectionProvider;
-
-	/**
-	 * This action opens the Properties view. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IAction showPropertiesViewAction = new Action(
-		"Show &Properties View") {//$NON-NLS-1$
-
-		public void run() {
-			try {
-				getPage().showView("org.eclipse.ui.views.PropertySheet");//$NON-NLS-1$
-			} catch (PartInitException exception) {
-				exception.printStackTrace();
-			}
-		}
-	};
-
-	/**
-	 * This action refreshes the viewer of the current editor if the editor
-	 * implements {@link IViewerProvider}. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IAction refreshViewerAction = new Action("Refresh") {//$NON-NLS-1$
-
-		public boolean isEnabled() {
-			return activeEditorPart instanceof IViewerProvider;
-		}
-
-		public void run() {
-			if (activeEditorPart instanceof IViewerProvider) {
-				Viewer viewer = ((IViewerProvider) activeEditorPart)
-					.getViewer();
-				if (viewer != null) {
-					viewer.refresh();
-				}
-			}
-		}
-	};
-
-	/**
-	 * This will contain one {@link CreateChildAction}corresponding to each
-	 * descriptor generated for the current selection by the item provider. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Collection createChildActions;
-
-	/**
-	 * This is the menu manager into which menu contribution items should be
-	 * added for CreateChild actions. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated
-	 */
-	protected IMenuManager createChildMenuManager;
-
-	/**
-	 * This will contain one {@link CreateSiblingAction}corresponding to each
-	 * descriptor generated for the current selection by the item provider. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Collection createSiblingActions;
-
-	/**
-	 * This is the menu manager into which menu contribution items should be
-	 * added for CreateSibling actions. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IMenuManager createSiblingMenuManager;
-
-	/**
-	 * This creates an instance of the contributor. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public HockeyleagueActionBarContributor() {
-		//
-	}
-
-	/**
-	 * This adds Separators for editor additions to the tool bar. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void contributeToToolBar(IToolBarManager toolBarManager) {
-		toolBarManager.add(new Separator("hockeyleague-settings"));//$NON-NLS-1$
-		toolBarManager.add(new Separator("hockeyleague-additions"));//$NON-NLS-1$
-	}
-
-	/**
-	 * This adds to the menu bar a menu and some separators for editor
-	 * additions, as well as the sub-menus for object creation items. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void contributeToMenu(IMenuManager menuManager) {
-		super.contributeToMenu(menuManager);
-
-		IMenuManager submenuManager = new MenuManager("&Hockeyleague Editor",//$NON-NLS-1$
-			"org.eclipse.ui.examples.views.properties.tabbed.hockeyleagueMenuID");//$NON-NLS-1$
-		menuManager.insertAfter("additions", submenuManager);//$NON-NLS-1$
-		submenuManager.add(new Separator("settings"));//$NON-NLS-1$
-		submenuManager.add(new Separator("actions"));//$NON-NLS-1$
-		submenuManager.add(new Separator("additions"));//$NON-NLS-1$
-		submenuManager.add(new Separator("additions-end"));//$NON-NLS-1$
-
-		// Prepare for CreateChild item addition or removal.
-		//
-		createChildMenuManager = new MenuManager("&New Child");//$NON-NLS-1$
-		submenuManager.insertBefore("additions", createChildMenuManager);//$NON-NLS-1$
-
-		// Prepare for CreateSibling item addition or removal.
-		//
-		createSiblingMenuManager = new MenuManager("N&ew Sibling");//$NON-NLS-1$
-		submenuManager.insertBefore("additions", createSiblingMenuManager);//$NON-NLS-1$
-	}
-
-	/**
-	 * When the active editor changes, this remembers the change, and registers
-	 * with it as a selection provider. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setActiveEditor(IEditorPart part) {
-		super.setActiveEditor(part);
-		activeEditorPart = part;
-
-		// Switch to the new selection provider.
-		//
-		if (selectionProvider != null) {
-			selectionProvider.removeSelectionChangedListener(this);
-		}
-		if (part == null) {
-			selectionProvider = null;
-		} else {
-			selectionProvider = part.getSite().getSelectionProvider();
-			selectionProvider.addSelectionChangedListener(this);
-
-			// Fake a selection changed event to update the menus.
-			//
-			if (selectionProvider.getSelection() != null) {
-				selectionChanged(new SelectionChangedEvent(selectionProvider,
-					selectionProvider.getSelection()));
-			}
-		}
-	}
-
-	/**
-	 * This implements {@link ISelectionChangedListener}, handling
-	 * {@link SelectionChangedEvents}by querying for the children and siblings
-	 * that can be added to the selected object and updating the menus
-	 * accordingly. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		// Remove any menu items for old selection.
-		//
-		if (createChildMenuManager != null) {
-			depopulateManager(createChildMenuManager, createChildActions);
-		}
-		if (createSiblingMenuManager != null) {
-			depopulateManager(createSiblingMenuManager, createSiblingActions);
-		}
-
-		// Query the new selection for appropriate new child/sibling descriptors
-		//
-		Collection newChildDescriptors = null;
-		Collection newSiblingDescriptors = null;
-
-		ISelection selection = event.getSelection();
-		if (selection instanceof IStructuredSelection
-			&& ((IStructuredSelection) selection).size() == 1) {
-			Object object = ((IStructuredSelection) selection)
-				.getFirstElement();
-
-			EditingDomain domain = ((IEditingDomainProvider) activeEditorPart)
-				.getEditingDomain();
-
-			newChildDescriptors = domain.getNewChildDescriptors(object, null);
-			newSiblingDescriptors = domain.getNewChildDescriptors(null, object);
-		}
-
-		// Generate actions for selection; populate and redraw the menus.
-		//
-		createChildActions = generateCreateChildActions(newChildDescriptors,
-			selection);
-		createSiblingActions = generateCreateSiblingActions(
-			newSiblingDescriptors, selection);
-
-		if (createChildMenuManager != null) {
-			populateManager(createChildMenuManager, createChildActions, null);
-			createChildMenuManager.update(true);
-		}
-		if (createSiblingMenuManager != null) {
-			populateManager(createSiblingMenuManager, createSiblingActions,
-				null);
-			createSiblingMenuManager.update(true);
-		}
-	}
-
-	/**
-	 * This generates a {@link CreateChildAction}for each object in
-	 * <code>descriptors</code>, and returns the collection of these actions.
-	 * <!-- begin-user-doc --> Modified <!-- end-user-doc -->
-	 */
-	protected Collection generateCreateChildActions(Collection descriptors,
-			ISelection selection) {
-		Collection actions = new LinkedList();
-		if (descriptors != null) {
-			for (Iterator i = descriptors.iterator(); i.hasNext();) {
-				actions.add(new HockeyleagueCreateChildAction(activeEditorPart,
-					selection, i.next()));
-			}
-		}
-		return actions;
-	}
-
-	/**
-	 * This generates a {@link CreateSiblingAction}for each object in
-	 * <code>descriptors</code>, and returns the collection of these actions.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Collection generateCreateSiblingActions(Collection descriptors,
-			ISelection selection) {
-		Collection actions = new LinkedList();
-		if (descriptors != null) {
-			for (Iterator i = descriptors.iterator(); i.hasNext();) {
-				actions.add(new CreateSiblingAction(activeEditorPart,
-					selection, i.next()));
-			}
-		}
-		return actions;
-	}
-
-	/**
-	 * This populates the specified <code>manager</code> with
-	 * {@link ActionContributionItem}s based on the {@link IAction}s contained
-	 * in the <code>actions</code> collection, by inserting them before the
-	 * specified contribution item <code>contributionID</code>. If
-	 * <code>ID</code> is <code>null</code>, they are simply added. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void populateManager(IContributionManager manager,
-			Collection actions, String contributionID) {
-		if (actions != null) {
-			for (Iterator i = actions.iterator(); i.hasNext();) {
-				IAction action = (IAction) i.next();
-				if (contributionID != null) {
-					manager.insertBefore(contributionID, action);
-				} else {
-					manager.add(action);
-				}
-			}
-		}
-	}
-
-	/**
-	 * This removes from the specified <code>manager</code> all
-	 * {@link ActionContributionItem}s based on the {@link IAction}s contained
-	 * in the <code>actions</code> collection. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void depopulateManager(IContributionManager manager,
-			Collection actions) {
-		if (actions != null) {
-			IContributionItem[] items = manager.getItems();
-			for (int i = 0; i < items.length; i++) {
-				// Look into SubContributionItems
-				//
-				IContributionItem contributionItem = items[i];
-				while (contributionItem instanceof SubContributionItem) {
-					contributionItem = ((SubContributionItem) contributionItem)
-						.getInnerItem();
-				}
-
-				// Delete the ActionContributionItems with matching action.
-				//
-				if (contributionItem instanceof ActionContributionItem) {
-					IAction action = ((ActionContributionItem) contributionItem)
-						.getAction();
-					if (actions.contains(action)) {
-						manager.remove(contributionItem);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * add actions to the menu manager.
-	 */
-	protected void populateManager(IContributionManager manager,
-			Collection actions) {
-		if (actions != null) {
-			for (Iterator i = actions.iterator(); i.hasNext();) {
-				IAction action = (IAction) i.next();
-				if (!action.getText().startsWith("Add")) {//$NON-NLS-1$
-					action.setText("Add " + action.getText() + "...");//$NON-NLS-2$//$NON-NLS-1$
-				}
-				manager.insertBefore("additions", action); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * This populates the pop-up menu before it appears. <!-- begin-user-doc -->
-	 * Modified <!-- end-user-doc -->
-	 */
-	public void menuAboutToShow(IMenuManager menuManager) {
-		refreshViewerAction.setEnabled(refreshViewerAction.isEnabled());
-
-		super.menuAboutToShow(menuManager);
-		populateManager(menuManager, createChildActions);
-
-		menuManager.insertAfter("additions-end", new Separator("ui-actions"));//$NON-NLS-2$//$NON-NLS-1$
-		menuManager.insertAfter("ui-actions", showPropertiesViewAction);//$NON-NLS-1$
-		menuManager.insertAfter("ui-actions", refreshViewerAction);//$NON-NLS-1$
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/editor/HockeyleagueEditor.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/editor/HockeyleagueEditor.java
deleted file mode 100644
index 4edaf32..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/editor/HockeyleagueEditor.java
+++ /dev/null
@@ -1,1199 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.editor;
-
-import java.io.IOException;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EventObject;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-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.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.common.command.CommandStackListener;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.ui.ViewerPane;
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
-import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
-import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
-import org.eclipse.emf.edit.ui.celleditor.AdapterFactoryTreeEditor;
-import org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter;
-import org.eclipse.emf.edit.ui.dnd.LocalTransfer;
-import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.provider.HockeyleagueItemProviderAdapterFactory;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.HockeyleaguePropertySheetPage;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.views.contentoutline.ContentOutline;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheet;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * This is the editor for the Hockeyleague model editor.
- * 
- * @author Anthony Hunter
- */
-public class HockeyleagueEditor
-	extends MultiPageEditorPart
-	implements IEditingDomainProvider, ISelectionProvider, IMenuListener,
-	IViewerProvider, ITabbedPropertySheetPageContributor {
-
-	/**
-	 * This keeps track of the editing domain that is used to track all changes
-	 * to the model. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected AdapterFactoryEditingDomain editingDomain;
-
-	/**
-	 * This is the one adapter factory used for providing views of the model.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ComposedAdapterFactory adapterFactory;
-
-	/**
-	 * This is the content outline page. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IContentOutlinePage contentOutlinePage;
-
-	/**
-	 * This is a kludge... <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IStatusLineManager contentOutlineStatusLineManager;
-
-	/**
-	 * This is the content outline page's viewer. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TreeViewer contentOutlineViewer;
-
-	/**
-	 * This is the property sheet page. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated protected TabbedPropertySheetPage propertySheetPage;
-	 */
-
-	/**
-	 * This shows how a tree view works. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TreeViewer treeViewer;
-
-	/**
-	 * This keeps track of the active viewer pane, in the book. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ViewerPane currentViewerPane;
-
-	/**
-	 * This keeps track of the active content viewer, which may be either one of
-	 * the viewers in the pages or the content outline viewer. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Viewer currentViewer;
-
-	/**
-	 * This listens to which ever viewer is active. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ISelectionChangedListener selectionChangedListener;
-
-	/**
-	 * This keeps track of all the
-	 * {@link org.eclipse.jface.viewers.ISelectionChangedListener}s that are
-	 * listening to this editor. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Collection selectionChangedListeners = new ArrayList();
-
-	/**
-	 * This keeps track of the selection of the editor as a whole. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ISelection editorSelection;
-
-	/**
-	 * This listens for when the outline becomes active <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IPartListener partListener = new IPartListener() {
-
-		public void partActivated(IWorkbenchPart p) {
-			if (p instanceof ContentOutline) {
-				if (((ContentOutline) p).getCurrentPage() == contentOutlinePage) {
-					getActionBarContributor().setActiveEditor(
-						HockeyleagueEditor.this);
-
-					setCurrentViewer(contentOutlineViewer);
-				}
-			} else if (p instanceof PropertySheet) {
-				if (((PropertySheet) p).getCurrentPage() == getPropertySheetPage()) {
-					getActionBarContributor().setActiveEditor(
-						HockeyleagueEditor.this);
-					handleActivate();
-				}
-			} else if (p == HockeyleagueEditor.this) {
-				handleActivate();
-			}
-		}
-
-		public void partBroughtToTop(IWorkbenchPart p) {
-		}
-
-		public void partClosed(IWorkbenchPart p) {
-		}
-
-		public void partDeactivated(IWorkbenchPart p) {
-		}
-
-		public void partOpened(IWorkbenchPart p) {
-		}
-	};
-
-	private HockeyleaguePropertySheetPage propertySheetPage;
-	
-	/**
-	 * Resources that have been removed since last activation.
-	 * 
-	 * @generated
-	 */
-	Collection removedResources = new ArrayList();
-
-	/**
-	 * Resources that have been changed since last activation.
-	 * 
-	 * @generated
-	 */
-	Collection changedResources = new ArrayList();
-
-	/**
-	 * Resources that have been saved.
-	 * 
-	 * @generated
-	 */
-	Collection savedResources = new ArrayList();
-
-	/**
-	 * This listens for workspace changes. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IResourceChangeListener resourceChangeListener = new IResourceChangeListener() {
-
-		public void resourceChanged(IResourceChangeEvent event) {
-			//ResourceSet resourceSet = editingDomain.getResourceSet();
-			// Only listening to these.
-			// if (event.getType() == IResourceDelta.POST_CHANGE)
-			{
-				IResourceDelta delta = event.getDelta();
-				try {
-					class ResourceDeltaVisitor
-						implements IResourceDeltaVisitor {
-
-						protected ResourceSet resourceSet = editingDomain
-							.getResourceSet();
-
-						//protected Collection changedResources = new
-						// ArrayList();
-						//protected Collection removedResources = new
-						// ArrayList();
-
-						public boolean visit(IResourceDelta delta1) {
-							if (delta1.getFlags() != IResourceDelta.MARKERS
-								&& delta1.getResource().getType() == IResource.FILE) {
-								if ((delta1.getKind() & (IResourceDelta.CHANGED | IResourceDelta.REMOVED)) != 0) {
-									Resource resource = resourceSet
-										.getResource(URI.createURI(delta1
-											.getFullPath().toString()), false);
-									if (resource != null) {
-										if ((delta1.getKind() & IResourceDelta.REMOVED) != 0) {
-											removedResources.add(resource);
-										} else {
-											changedResources.add(resource);
-										}
-									}
-								}
-							}
-
-							return true;
-						}
-
-						public Collection getChangedResources() {
-							return changedResources;
-						}
-
-						public Collection getRemovedResources() {
-							return removedResources;
-						}
-					}
-
-					ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();
-					delta.accept(visitor);
-
-					removedResources.addAll(visitor.getRemovedResources());
-					if (!visitor.getRemovedResources().isEmpty() && !isDirty()) {
-						getSite().getShell().getDisplay().asyncExec(
-							new Runnable() {
-
-								public void run() {
-									getSite().getPage().closeEditor(
-										HockeyleagueEditor.this, false);
-									HockeyleagueEditor.this.dispose();
-								}
-							});
-					}
-
-					changedResources.addAll(visitor.getChangedResources());
-				} catch (CoreException exception) {
-					exception.printStackTrace();
-				}
-			}
-		}
-	};
-
-	/**
-	 * Handles activation of the editor or it's associated views.
-	 * 
-	 * @generated
-	 */
-	protected void handleActivate() {
-		if (!removedResources.isEmpty()) {
-			if (handleDirtyConflict()) {
-				getSite().getPage().closeEditor(HockeyleagueEditor.this, false);
-				HockeyleagueEditor.this.dispose();
-			} else {
-				removedResources.clear();
-				changedResources.clear();
-				savedResources.clear();
-			}
-		} else if (!changedResources.isEmpty()) {
-			changedResources.removeAll(savedResources);
-			handleChangedResources();
-			changedResources.clear();
-			savedResources.clear();
-		}
-	}
-
-	/**
-	 * Handles what to do with changed resources on activation.
-	 * 
-	 * @generated
-	 */
-	protected void handleChangedResources() {
-		if (!changedResources.isEmpty()
-			&& (!isDirty() || handleDirtyConflict())) {
-			editingDomain.getCommandStack().flush();
-
-			for (Iterator i = changedResources.iterator(); i.hasNext();) {
-				Resource resource = (Resource) i.next();
-				if (resource.isLoaded()) {
-					resource.unload();
-					try {
-						resource.load(Collections.EMPTY_MAP);
-					} catch (IOException exception) {
-						exception.printStackTrace();
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Shows a dialog that asks if conflicting changes should be discarded.
-	 * 
-	 * @generated
-	 */
-	protected boolean handleDirtyConflict() {
-		return MessageDialog
-			.openQuestion(
-				getSite().getShell(),
-				"File Conflict",//$NON-NLS-1$
-				"There are unsaved changes that conflict with changes made outside the editor.  Do you wish to discard this editor's changes?");//$NON-NLS-1$
-	}
-
-	/**
-	 * This creates a model editor. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated
-	 */
-	public HockeyleagueEditor() {
-		super();
-
-		// Create an adapter factory that yields item providers.
-		//
-		List factories = new ArrayList();
-		factories.add(new ResourceItemProviderAdapterFactory());
-		factories.add(new HockeyleagueItemProviderAdapterFactory());
-		factories.add(new ReflectiveItemProviderAdapterFactory());
-
-		adapterFactory = new ComposedAdapterFactory(factories);
-
-		// Create the command stack that will notify this editor as commands are
-		// executed.
-		//
-		BasicCommandStack commandStack = new BasicCommandStack();
-
-		// Add a listener to set the most recent command's affected objects to
-		// be the selection of the viewer with focus.
-		//
-		commandStack.addCommandStackListener(new CommandStackListener() {
-
-			public void commandStackChanged(final EventObject event) {
-				getContainer().getDisplay().asyncExec(new Runnable() {
-
-					public void run() {
-						firePropertyChange(IEditorPart.PROP_DIRTY);
-
-						// Try to select the affected objects.
-						//
-						Command mostRecentCommand = ((CommandStack) event
-							.getSource()).getMostRecentCommand();
-						if (mostRecentCommand != null) {
-							setSelectionToViewer(mostRecentCommand
-								.getAffectedObjects());
-						}
-						if (getPropertySheetPage() != null) {
-							getPropertySheetPage().refresh();
-						}
-					}
-				});
-			}
-		});
-
-		// Create the editing domain with a special command stack.
-		//
-		editingDomain = new AdapterFactoryEditingDomain(adapterFactory,
-			commandStack);
-	}
-
-	/**
-	 * This is here for the listener to be able to call it. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void firePropertyChange(int action) {
-		super.firePropertyChange(action);
-	}
-
-	/**
-	 * This sets the selection into whichever viewer is active. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setSelectionToViewer(Collection collection) {
-		final Collection theSelection = collection;
-		// Make sure it's okay.
-		//
-		if (theSelection != null && !theSelection.isEmpty()) {
-			// I don't know if this should be run this deferred
-			// because we might have to give the editor a chance to process the
-			// viewer update events
-			// and hence to update the views first.
-			//
-			//
-			Runnable runnable = new Runnable() {
-
-				public void run() {
-					// Try to select the items in the current content viewer of
-					// the editor.
-					//
-					if (currentViewer != null) {
-						currentViewer.setSelection(new StructuredSelection(
-							theSelection.toArray()), true);
-					}
-				}
-			};
-			runnable.run();
-		}
-	}
-
-	/**
-	 * This returns the editing domain as required by the
-	 * {@link IEditingDomainProvider}interface. This is important for
-	 * implementing the static methods of {@link AdapterFactoryEditingDomain}
-	 * and for supporting {@link org.eclipse.emf.edit.ui.action.CommandAction}.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EditingDomain getEditingDomain() {
-		return editingDomain;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public class ReverseAdapterFactoryContentProvider
-		extends AdapterFactoryContentProvider {
-
-		public ReverseAdapterFactoryContentProvider(
-				AdapterFactory adapterFactory) {
-			super(adapterFactory);
-		}
-
-		public Object[] getElements(Object object) {
-			Object parent = super.getParent(object);
-			return (parent == null ? Collections.EMPTY_SET
-				: Collections.singleton(parent)).toArray();
-		}
-
-		public Object[] getChildren(Object object) {
-			Object parent = super.getParent(object);
-			return (parent == null ? Collections.EMPTY_SET
-				: Collections.singleton(parent)).toArray();
-		}
-
-		public boolean hasChildren(Object object) {
-			Object parent = super.getParent(object);
-			return parent != null;
-		}
-
-		public Object getParent(Object object) {
-			return null;
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setCurrentViewerPane(ViewerPane viewerPane) {
-		if (currentViewerPane != viewerPane) {
-			if (currentViewerPane != null) {
-				currentViewerPane.showFocus(false);
-			}
-			currentViewerPane = viewerPane;
-		}
-		setCurrentViewer(currentViewerPane.getViewer());
-	}
-
-	/**
-	 * This makes sure that one content viewer, either for the current page or
-	 * the outline view, if it has focus, is the current one. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setCurrentViewer(Viewer viewer) {
-		// If it is changing...
-		//
-		if (currentViewer != viewer) {
-			if (selectionChangedListener == null) {
-				// Create the listener on demand.
-				//
-				selectionChangedListener = new ISelectionChangedListener() {
-
-					// This just notifies those things that are affected by the
-					// section.
-					//
-					public void selectionChanged(
-							SelectionChangedEvent selectionChangedEvent) {
-						setSelection(selectionChangedEvent.getSelection());
-					}
-				};
-			}
-
-			// Stop listening to the old one.
-			//
-			if (currentViewer != null) {
-				currentViewer
-					.removeSelectionChangedListener(selectionChangedListener);
-			}
-
-			// Start listening to the new one.
-			//
-			if (viewer != null) {
-				viewer.addSelectionChangedListener(selectionChangedListener);
-			}
-
-			// Remember it.
-			//
-			currentViewer = viewer;
-
-			// Set the editors selection based on the current viewer's
-			// selection.
-			//
-			setSelection(currentViewer == null ? StructuredSelection.EMPTY
-				: currentViewer.getSelection());
-		}
-	}
-
-	/**
-	 * This returns the viewer as required by the {@link IViewerProvider}
-	 * interface. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Viewer getViewer() {
-		return currentViewer;
-	}
-
-	/**
-	 * This creates a context menu for the viewer and adds a listener as well
-	 * registering the menu for extension. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void createContextMenuFor(StructuredViewer viewer) {
-		MenuManager contextMenu = new MenuManager("#PopUp");//$NON-NLS-1$
-		contextMenu.add(new Separator("additions"));//$NON-NLS-1$
-		contextMenu.setRemoveAllWhenShown(true);
-		contextMenu.addMenuListener(this);
-		Menu menu = contextMenu.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(contextMenu, viewer);
-
-		int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
-		Transfer[] transfers = new Transfer[] {LocalTransfer.getInstance()};
-		viewer.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(
-			viewer));
-		viewer.addDropSupport(dndOperations, transfers,
-			new EditingDomainViewerDropAdapter(editingDomain, viewer));
-	}
-
-	/**
-	 * This is the method used by the framework to install your own controls.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void createPages() {
-		// I assume that the input is a file object.
-		//
-		IFileEditorInput modelFile = (IFileEditorInput) getEditorInput();
-
-		try {
-			// Load the resource through the editing domain.
-			//
-			editingDomain.loadResource(URI.createPlatformResourceURI(
-				modelFile.getFile().getFullPath().toString()).toString());
-		} catch (Exception exception) {
-			exception.printStackTrace();
-		}
-
-		// Create a page for the selection tree view.
-		//
-		{
-			ViewerPane viewerPane = new ViewerPane(getSite().getPage(),
-				HockeyleagueEditor.this) {
-
-				public Viewer createViewer(Composite composite) {
-					Tree tree = new Tree(composite, SWT.MULTI);
-					TreeViewer newTreeViewer = new TreeViewer(tree);
-					return newTreeViewer;
-				}
-
-				public void requestActivation() {
-					super.requestActivation();
-					setCurrentViewerPane(this);
-				}
-			};
-			viewerPane.createControl(getContainer());
-
-			treeViewer = (TreeViewer) viewerPane.getViewer();
-			treeViewer.setContentProvider(new AdapterFactoryContentProvider(
-				adapterFactory));
-
-			treeViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				adapterFactory));
-			treeViewer.setInput(editingDomain.getResourceSet());
-			viewerPane.setTitle(editingDomain.getResourceSet());
-
-			new AdapterFactoryTreeEditor(treeViewer.getTree(), adapterFactory);
-
-			createContextMenuFor(treeViewer);
-			int pageIndex = addPage(viewerPane.getControl());
-			setPageText(pageIndex, "tree");//$NON-NLS-1$
-		}
-
-		setActivePage(0);
-
-		getContainer().addControlListener(new ControlAdapter() {
-
-			boolean guard = false;
-
-			public void controlResized(ControlEvent event) {
-				if (!guard) {
-					guard = true;
-					hideTabs();
-					guard = false;
-				}
-			}
-		});
-	}
-
-	/**
-	 * If there is just one page in the multi-page editor part, this hides the
-	 * single tab at the bottom. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void hideTabs() {
-		if (getPageCount() <= 1) {
-			setPageText(0, "");//$NON-NLS-1$
-			if (getContainer() instanceof CTabFolder) {
-				((CTabFolder) getContainer()).setTabHeight(1);
-				Point point = getContainer().getSize();
-				getContainer().setSize(point.x, point.y + 6);
-			}
-		}
-	}
-
-	/**
-	 * This is used to track the active viewer. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void pageChange(int pageIndex) {
-		super.pageChange(pageIndex);
-
-		// This is a temporary workaround... EATM
-		//
-		Control control = getControl(pageIndex);
-		if (control != null) {
-			control.setVisible(true);
-			control.setFocus();
-		}
-
-		if (contentOutlinePage != null) {
-			handleContentOutlineSelection(contentOutlinePage.getSelection());
-		}
-	}
-
-	/**
-	 * This is how the framework determines which interfaces we implement. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object getAdapter(Class key) {
-		if (key.equals(IContentOutlinePage.class)) {
-			return getContentOutlinePage();
-		} else if (key.equals(IPropertySheetPage.class)) {
-			return getPropertySheetPage();
-		} else {
-			return super.getAdapter(key);
-		}
-	}
-
-	/**
-	 * This accesses a cached version of the content outliner. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public IContentOutlinePage getContentOutlinePage() {
-		if (contentOutlinePage == null) {
-			// The content outline is just a tree.
-			//
-			class MyContentOutlinePage
-				extends ContentOutlinePage {
-
-				public void createControl(Composite parent) {
-					super.createControl(parent);
-					contentOutlineViewer = getTreeViewer();
-					contentOutlineViewer.addSelectionChangedListener(this);
-
-					// Set up the tree viewer.
-					//
-					contentOutlineViewer
-						.setContentProvider(new AdapterFactoryContentProvider(
-							adapterFactory));
-					contentOutlineViewer
-						.setLabelProvider(new AdapterFactoryLabelProvider(
-							adapterFactory));
-					contentOutlineViewer.setInput(editingDomain
-						.getResourceSet());
-
-					// Make sure our popups work.
-					//
-					createContextMenuFor(contentOutlineViewer);
-
-					if (!editingDomain.getResourceSet().getResources()
-						.isEmpty()) {
-						// Select the root object in the view.
-						//
-						ArrayList selection = new ArrayList();
-						selection.add(editingDomain.getResourceSet()
-							.getResources().get(0));
-						contentOutlineViewer.setSelection(
-							new StructuredSelection(selection), true);
-					}
-				}
-
-				public void makeContributions(IMenuManager menuManager,
-						IToolBarManager toolBarManager,
-						IStatusLineManager statusLineManager) {
-					super.makeContributions(menuManager, toolBarManager,
-						statusLineManager);
-					contentOutlineStatusLineManager = statusLineManager;
-				}
-
-				public void setActionBars(IActionBars actionBars) {
-					super.setActionBars(actionBars);
-					getActionBarContributor().shareGlobalActions(this,
-						actionBars);
-				}
-			}
-
-			contentOutlinePage = new MyContentOutlinePage();
-
-			// Listen to selection so that we can handle it is a special way.
-			//
-			contentOutlinePage
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-
-					// This ensures that we handle selections correctly.
-					//
-					public void selectionChanged(SelectionChangedEvent event) {
-						handleContentOutlineSelection(event.getSelection());
-					}
-				});
-		}
-
-		return contentOutlinePage;
-	}
-
-	/**
-	 * Get the new property sheet page for this editor. 
-	 * @return the new property sheet page.
-	 */
-	public TabbedPropertySheetPage getPropertySheetPage() {
-		if (propertySheetPage == null || propertySheetPage.getControl() == null) {
-			propertySheetPage = new HockeyleaguePropertySheetPage(this);
-		}
-
-		return propertySheetPage;
-	}
-
-	/**
-	 * This deals with how we want selection in the outliner to affect the other
-	 * views. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void handleContentOutlineSelection(ISelection selection) {
-		if (currentViewerPane != null && !selection.isEmpty()
-			&& selection instanceof IStructuredSelection) {
-			Iterator selectedElements = ((IStructuredSelection) selection)
-				.iterator();
-			if (selectedElements.hasNext()) {
-				// Get the first selected element.
-				//
-				Object selectedElement = selectedElements.next();
-
-				ArrayList selectionList = new ArrayList();
-				selectionList.add(selectedElement);
-				while (selectedElements.hasNext()) {
-					selectionList.add(selectedElements.next());
-				}
-
-				// Set the selection to the widget.
-				//
-				treeViewer.setSelection(new StructuredSelection(selectionList));
-			}
-		}
-	}
-
-	/**
-	 * This is for implementing {@link IEditorPart}and simply tests the command
-	 * stack. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean isDirty() {
-		return ((BasicCommandStack) editingDomain.getCommandStack())
-			.isSaveNeeded();
-	}
-
-	/**
-	 * This is for implementing {@link IEditorPart}and simply saves the model
-	 * file. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void doSave(IProgressMonitor progressMonitor) {
-		// Do the work within an operation because this is a long running
-		// activity that modifies the workbench.
-		//
-		WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
-
-			// This is the method that gets invoked when the operation runs.
-			//
-			protected void execute(IProgressMonitor monitor)
-				throws CoreException {
-				try {
-					// Save the resource to the file system.
-					//
-					Resource savedResource = (Resource) editingDomain
-						.getResourceSet().getResources().get(0);
-					savedResources.add(savedResource);
-					savedResource.save(Collections.EMPTY_MAP);
-				} catch (Exception exception) {
-					exception.printStackTrace();
-				}
-			}
-		};
-
-		try {
-			// This runs the options, and shows progress.
-			// (It appears to be a bad thing to fork this onto another thread.)
-			//
-			new ProgressMonitorDialog(getSite().getShell()).run(false, false,
-				operation);
-
-			// Refresh the necessary state.
-			//
-			((BasicCommandStack) editingDomain.getCommandStack()).saveIsDone();
-			firePropertyChange(IEditorPart.PROP_DIRTY);
-		} catch (Exception exception) {
-			// Something went wrong that shouldn't.
-			//
-			exception.printStackTrace();
-		}
-	}
-
-	/**
-	 * This always returns true because it is not currently supported. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean isSaveAsAllowed() {
-		return true;
-	}
-
-	/**
-	 * This also changes the editor's input. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void doSaveAs() {
-		SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());
-		saveAsDialog.open();
-		IPath path = saveAsDialog.getResult();
-		if (path != null) {
-			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
-			if (file != null) {
-				((Resource) editingDomain.getResourceSet().getResources()
-					.get(0)).setURI(URI.createPlatformResourceURI(file
-					.getFullPath().toString()));
-				IFileEditorInput modelFile = new FileEditorInput(file);
-				setInput(modelFile);
-				doSave(getActionBars().getStatusLineManager()
-					.getProgressMonitor());
-			}
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void gotoMarker(IMarker marker) {
-		//
-	}
-
-	/**
-	 * This is called during startup. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated
-	 */
-	public void init(IEditorSite site, IEditorInput editorInput)
-		throws PartInitException {
-		if (editorInput instanceof IFileEditorInput) {
-			setSite(site);
-			setInput(editorInput);
-			site.setSelectionProvider(this);
-			site.getPage().addPartListener(partListener);
-			ResourcesPlugin.getWorkspace().addResourceChangeListener(
-				resourceChangeListener, IResourceChangeEvent.POST_CHANGE);
-		} else {
-			throw new PartInitException(
-				"Invalid Input: Must be IFileEditorInput.");//$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setFocus() {
-		getControl(getActivePage()).setFocus();
-	}
-
-	/**
-	 * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/**
-	 * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/**
-	 * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}to
-	 * return this editor's overall selection. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ISelection getSelection() {
-		return editorSelection;
-	}
-
-	/**
-	 * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}to
-	 * set this editor's overall selection. Calling this result will notify the
-	 * listeners. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setSelection(ISelection selection) {
-		editorSelection = selection;
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-			.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-				.next();
-			listener
-				.selectionChanged(new SelectionChangedEvent(this, selection));
-		}
-		setStatusLineManager(selection);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setStatusLineManager(ISelection selection) {
-		IStatusLineManager statusLineManager = getActionBars()
-			.getStatusLineManager();
-		if (currentViewer == contentOutlineViewer) {
-			statusLineManager = contentOutlineStatusLineManager;
-		}
-
-		if (selection instanceof IStructuredSelection) {
-			Collection collection = ((IStructuredSelection) selection).toList();
-			switch (collection.size()) {
-				case 0: {
-					statusLineManager.setMessage("No Object Selected");//$NON-NLS-1$
-					break;
-				}
-				case 1: {
-					String text = new AdapterFactoryItemDelegator(
-						adapterFactory).getText(collection.iterator().next());
-					statusLineManager.setMessage(MessageFormat.format(
-						"Selected Object: {0}", new Object[] {text}));//$NON-NLS-1$
-					break;
-				}
-				default: {
-					statusLineManager.setMessage(MessageFormat.format(
-						"Selected {0} Objects", new Object[] {Integer//$NON-NLS-1$
-							.toString(collection.size())}));
-					break;
-				}
-			}
-		} else {
-			statusLineManager.setMessage("");//$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * This implements {@link org.eclipse.jface.action.IMenuListener}to help
-	 * fill the context menus with contributions from the Edit menu. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void menuAboutToShow(IMenuManager menuManager) {
-		((IMenuListener) getEditorSite().getActionBarContributor())
-			.menuAboutToShow(menuManager);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EditingDomainActionBarContributor getActionBarContributor() {
-		return (EditingDomainActionBarContributor) getEditorSite()
-			.getActionBarContributor();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public IActionBars getActionBars() {
-		return getActionBarContributor().getActionBars();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public AdapterFactory getAdapterFactory() {
-		return adapterFactory;
-	}
-
-	/**
-	 * 
-	 */
-	public String getContributorId() {
-		return "org.eclipse.ui.examples.views.properties.tabbed.hockeyleague";//$NON-NLS-1$
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void dispose() {
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-			resourceChangeListener);
-
-		getSite().getPage().removePartListener(partListener);
-
-		adapterFactory.dispose();
-
-		getActionBarContributor().setActiveEditor(null);
-
-		if (getPropertySheetPage() != null) {
-			getPropertySheetPage().dispose();
-		}
-
-		if (contentOutlinePage != null) {
-			contentOutlinePage.dispose();
-		}
-
-		super.dispose();
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/HockeyleagueLabelProvider.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/HockeyleagueLabelProvider.java
deleted file mode 100644
index ea0bb60..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/HockeyleagueLabelProvider.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.editor.HockeyleagueEditor;
-
-/**
- * Label provider for the title bar for the tabbed property sheet page.
- * 
- * @author Anthony Hunter
- */
-public class HockeyleagueLabelProvider
-	extends LabelProvider {
-
-	private AdapterFactoryLabelProvider adapterFactoryLabelProvider;
-
-	/**
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object element) {
-		if (element == null || element.equals(StructuredSelection.EMPTY)) {
-			return null;
-		}
-		if (element instanceof IStructuredSelection) {
-			IStructuredSelection structuredSelection = (IStructuredSelection) element;
-			if (areDifferentTypes(structuredSelection)) {
-				return null;
-			}
-			element = structuredSelection.getFirstElement();
-		}
-		if (element instanceof EObject || element instanceof Resource) {
-			return getAdapterFactoryLabelProvider().getImage(element);
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object element) {
-		if (element == null || element.equals(StructuredSelection.EMPTY)) {
-			return null;
-		}
-		int size = 1;
-		if (element instanceof IStructuredSelection) {
-			IStructuredSelection structuredSelection = (IStructuredSelection) element;
-			if (areDifferentTypes(structuredSelection)) {
-				return structuredSelection.size() + " items selected";//$NON-NLS-1$
-			}
-			element = structuredSelection.getFirstElement();
-			size = structuredSelection.size();
-		}
-		if (element instanceof EObject) {
-			String split[] = getAdapterFactoryLabelProvider().getText(element)
-				.split(" ");//$NON-NLS-1$
-			StringBuffer type = new StringBuffer();
-			StringBuffer name = new StringBuffer();
-			for (int i = 0; i < split.length; i++) {
-				if (i == 0) {
-					type.append('\u00AB');
-					type.append(split[i]);
-					if (!(element instanceof PlayerStats || element instanceof GoalieStats)) {
-						type.append('\u00BB');
-					}
-				} else if ((i == 1 && (element instanceof PlayerStats || element instanceof GoalieStats))) {
-					type.append(' ');
-					type.append(split[i]);
-					type.append('\u00BB');
-				} else {
-					name.append(split[i]);
-					name.append(' ');
-				}
-			}
-			if (size == 1) {
-				type.append(' ');
-				type.append(name);
-			} else {
-				type.append(' ');
-				type.append(Integer.toString(size));
-				type.append(" selected");//$NON-NLS-1$
-			}
-			return type.toString();
-		} else if (element instanceof Resource) {
-			return "\u00ABResource\u00BB";//$NON-NLS-1$
-		}
-		return null;
-	}
-
-	/**
-	 * @return
-	 */
-	private AdapterFactoryLabelProvider getAdapterFactoryLabelProvider() {
-		if (adapterFactoryLabelProvider == null) {
-			adapterFactoryLabelProvider = new AdapterFactoryLabelProvider(
-				((HockeyleagueEditor) PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow().getActivePage()
-					.getActiveEditor()).getAdapterFactory());
-		}
-		return adapterFactoryLabelProvider;
-	}
-
-	/**
-	 * Determine there are objects in the structured selection of different
-	 * types.
-	 * 
-	 * @param structuredSelection
-	 *            the structured selection.
-	 * @return true if there are objects of different types in the selection.
-	 */
-	private boolean areDifferentTypes(IStructuredSelection structuredSelection) {
-		if (structuredSelection.size() == 1) {
-			return false;
-		}
-		Iterator i = structuredSelection.iterator();
-		Object element = i.next();
-		for (; i.hasNext();) {
-			if (i.next().getClass() != element.getClass()) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/HockeyleaguePropertySheetPage.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/HockeyleaguePropertySheetPage.java
deleted file mode 100644
index 306c543..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/HockeyleaguePropertySheetPage.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.editor.HockeyleagueEditor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * This is the property sheet page for the Hockeyleague model editor.
- * 
- * @author Anthony Hunter
- */
-public class HockeyleaguePropertySheetPage
-	extends TabbedPropertySheetPage {
-
-	/**
-	 * the hockey league model editor.
-	 */
-	protected HockeyleagueEditor editor;
-
-	/**
-	 * Contructor for this property sheet page.
-	 * 
-	 * @param tabbedPropertySheetPageContributor
-	 *            the editor contributor of the property sheet page.
-	 */
-	public HockeyleaguePropertySheetPage(HockeyleagueEditor editor) {
-		super(editor);
-		this.editor = editor;
-	}
-
-	/**
-	 * Get the EMF AdapterFactory for this editor.
-	 * 
-	 * @return the EMF AdapterFactory for this editor.
-	 */
-	public HockeyleagueEditor getEditor() {
-		return editor;
-	}
-
-	/**
-	 * Get the EMF AdapterFactory for this editor.
-	 * 
-	 * @return the EMF AdapterFactory for this editor.
-	 */
-	public AdapterFactory getAdapterFactory() {
-		return editor.getAdapterFactory();
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/TextChangeHelper.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/TextChangeHelper.java
deleted file mode 100644
index 3718510..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/TextChangeHelper.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * TextChangeHelper notifies the listner of text lifecycle events 
- * on behalf of the widget(s) it listens to. 
- * 
- * @author Anthony Hunter 
- */
-public abstract class TextChangeHelper implements Listener {
-	
-	private boolean nonUserChange;
-
-	/**
-	 * Marks the start of a programmatic change to the widget contents.
-	 * Clients must call startNonUserChange() before directly setting 
-	 * the widget contents to avoid unwanted lifecycle events.
-	 * @throws IllegalArgumentException if a programmatic change is 
-	 * already in progress.
-	 */
-	public void startNonUserChange() {
-		if (nonUserChange)
-			throw new IllegalStateException("we already started a non user change");//$NON-NLS-1$
-		nonUserChange = true;
-	}
-
-	/**
-	 * Clients who call startNonUserChange() should call 
-	 * finishNonUserChange() as soon as possible after the change is done.
-	 * @throws IllegalArgumentException if no change is in progress.
-	 */
-	public void finishNonUserChange() {
-		if (!nonUserChange)
-			throw new IllegalStateException("we are not in a non user change");//$NON-NLS-1$
-		nonUserChange = false;
-	}
-
-	/**
-	 * Determine if a programmatic change is in progress.
-	 * @return <code>true</code> if a programmatic change is in progress.
-	 */
-	public boolean isNonUserChange() {
-		return nonUserChange;
-	}
-
-	/**
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void handleEvent(Event event) {
-		switch (event.type) {
-			case SWT.KeyDown :
-				if (event.character == SWT.CR)
-					textChanged((Control)event.widget);
-				break;
-			case SWT.FocusOut :
-				textChanged((Control)event.widget);
-				break;
-		}
-	}
-
-	/**
-	 * Abstract method notified when a text field has been changed.
-	 * @param control the given control.
-	 */
-	public abstract void textChanged(Control control);
-
-	/**
-	 * Registers this helper with the given control to listen for events
-	 * which indicate that a change is in progress (or done).
-	 * @param control the given control.
-	 */
-	public void startListeningTo(Control control) {
-		control.addListener(SWT.FocusOut, this);
-		control.addListener(SWT.Modify, this);
-	}
-
-	/**
-	 * Registers this helper with the given control to listen for the
-	 * Enter key.  When Enter is pressed, the change is considered done 
-	 * (this is only appropriate for single-line Text widgets).
-	 * @param control the given control.
-	 */
-	public void startListeningForEnter(Control control) {
-		// NOTE: KeyDown rather than KeyUp, because of similar usage in CCombo. 
-		control.addListener(SWT.KeyDown, this);
-	}
-
-	/**
-	 * Unregisters this helper from a control previously passed to
-	 * startListeningTo() and/or startListeningForEnter().
-	 * @param control the given control.
-	 */
-	public void stopListeningTo(Control control) {
-		if ((control != null) && !control.isDisposed()) {
-			control.removeListener(SWT.FocusOut, this);
-			control.removeListener(SWT.Modify, this);
-			control.removeListener(SWT.KeyDown, this);
-		}
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractEnumerationPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractEnumerationPropertySection.java
deleted file mode 100644
index 5a08f79..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractEnumerationPropertySection.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.editor.HockeyleagueEditor;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * An abstract implementation of a section with a enumeration field using a
- * combo box (pulldown).
- * 
- * @author Anthony Hunter
- */
-public abstract class AbstractEnumerationPropertySection
-	extends AbstractHockeyleaguePropertySection {
-
-	/**
-	 * the combo box control for the section.
-	 */
-	protected CCombo combo;
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		Composite composite = getWidgetFactory()
-			.createFlatFormComposite(parent);
-		FormData data;
-
-		combo = getWidgetFactory().createCCombo(composite); 
-		data = new FormData();
-		data.left = new FormAttachment(0, getStandardLabelWidth(composite,
-			new String[] {getLabelText()}));
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, ITabbedPropertyConstants.VSPACE);
-		combo.setLayoutData(data);
-
-		CLabel nameLabel = getWidgetFactory().createCLabel(composite,
-			getLabelText());
-		data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(combo, -ITabbedPropertyConstants.HSPACE);
-		data.top = new FormAttachment(combo, 0, SWT.CENTER);
-		nameLabel.setLayoutData(data);
-
-		combo.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent event) {
-				handleComboModified();
-			}
-		});
-	}
-
-	/**
-	 * Handle the combo modified event.
-	 */
-	protected void handleComboModified() {
-
-		int index = combo.getSelectionIndex();
-		boolean equals = isEqual(index);
-		if (!equals) {
-			EditingDomain editingDomain = ((HockeyleagueEditor) getPart())
-				.getEditingDomain();
-			Object value = getFeatureValue(index);
-			if (eObjectList.size() == 1) {
-				/* apply the property change to single selected object */
-				editingDomain.getCommandStack().execute(
-					SetCommand.create(editingDomain, eObject, getFeature(),
-						value));
-			} else {
-				CompoundCommand compoundCommand = new CompoundCommand();
-				/* apply the property change to all selected elements */
-				for (Iterator i = eObjectList.iterator(); i.hasNext();) {
-					EObject nextObject = (EObject) i.next();
-					compoundCommand.append(SetCommand.create(editingDomain,
-						nextObject, getFeature(), value));
-				}
-				editingDomain.getCommandStack().execute(compoundCommand);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#refresh()
-	 */
-	public void refresh() {
-		combo.setItems(getEnumerationFeatureValues());
-		combo.setText(getFeatureAsText());
-	}
-
-	/**
-	 * Determine if the provided index of the enumeration is equal to the
-	 * current setting of the enumeration property.
-	 * 
-	 * @param index
-	 *            the new index in the enumeration.
-	 * @return <code>true</code> if the new index value is equal to the
-	 *         current property setting.
-	 */
-	protected abstract boolean isEqual(int index);
-
-	/**
-	 * Get the feature for the combo field for the section.
-	 * 
-	 * @return the feature for the text.
-	 */
-	protected abstract EAttribute getFeature();
-
-	/**
-	 * Get the enumeration values of the feature for the combo field for the
-	 * section.
-	 * 
-	 * @return the list of values of the feature as text.
-	 */
-	protected abstract String[] getEnumerationFeatureValues();
-
-	/**
-	 * Get the value of the feature as text for the combo field for the section.
-	 * 
-	 * @return the value of the feature as text.
-	 */
-	protected abstract String getFeatureAsText();
-
-	/**
-	 * Get the new value of the feature for the text field for the section.
-	 * 
-	 * @param index
-	 *            the new index in the enumeration.
-	 * @return the new value of the feature.
-	 */
-	protected abstract Object getFeatureValue(int index);
-
-	/**
-	 * Get the label for the combo field for the section.
-	 * 
-	 * @return the label for the text field.
-	 */
-	protected abstract String getLabelText();
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractHockeyleaguePropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractHockeyleaguePropertySection.java
deleted file mode 100644
index 1d4e2dc..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractHockeyleaguePropertySection.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.HockeyleaguePropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * An abstract implementation of a section in a tab in the tabbed property sheet
- * page for the hockey league example.
- * 
- * @author Anthony Hunter
- */
-public abstract class AbstractHockeyleaguePropertySection
-	extends AbstractPropertySection {
-
-	/**
-	 * the property sheet page for this section.
-	 */
-	protected HockeyleaguePropertySheetPage propertySheetPage;
-
-	/**
-	 * The current selected object or the first object in the selection when
-	 * multiple objects are selected.
-	 */
-	protected EObject eObject;
-
-	/**
-	 * The list of current selected objects.
-	 */
-	protected List eObjectList;
-
-	/**
-	 * Get the standard label width when labels for sections line up on the left
-	 * hand side of the composite. We line up to a fixed position, but if a
-	 * string is wider than the fixed position, then we use that widest string.
-	 * 
-	 * @param parent
-	 *            The parent composite used to create a GC.
-	 * @param labels
-	 *            The list of labels.
-	 * @return the standard label width.
-	 */
-	protected int getStandardLabelWidth(Composite parent, String[] labels) {
-		int standardLabelWidth = STANDARD_LABEL_WIDTH;
-		GC gc = new GC(parent);
-		int indent = gc.textExtent("XXX").x; //$NON-NLS-1$
-		for (int i = 0; i < labels.length; i++) {
-			int width = gc.textExtent(labels[i]).x;
-			if (width + indent > standardLabelWidth) {
-				standardLabelWidth = width + indent;
-			}
-		}
-		gc.dispose();
-		return standardLabelWidth;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		this.propertySheetPage = (HockeyleaguePropertySheetPage) aTabbedPropertySheetPage;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#setInput(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		if (!(selection instanceof IStructuredSelection)) {
-			return;
-		}
-		if (((IStructuredSelection) selection).getFirstElement() instanceof EObject) {
-			eObject = (EObject) ((IStructuredSelection) selection)
-				.getFirstElement();
-			eObjectList = ((IStructuredSelection) selection).toList();
-		}
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractIntegerPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractIntegerPropertySection.java
deleted file mode 100644
index 86f6708..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractIntegerPropertySection.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-/**
- * An abstract implementation of a section for a field with a String property
- * value.
- * 
- * @author Anthony Hunter
- */
-public abstract class AbstractIntegerPropertySection
-	extends AbstractTextPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTextPropertySection#isEqual(java.lang.String)
-	 */
-	protected boolean isEqual(String newText) {
-		try {
-			Integer.parseInt(newText);
-		} catch (NumberFormatException e) {
-			refresh();
-			return true;
-		}
-		Integer integer = new Integer(Integer.parseInt(newText)); 
-		return getFeatureInteger().equals(integer);
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTextPropertySection#getFeatureAsText()
-	 */
-	protected String getFeatureAsText() {
-		return getFeatureInteger().toString();
-	}
-
-	/**
-	 * Get the text value of the feature for the text field for the section.
-	 * 
-	 * @return the text value of the feature.
-	 */
-	protected abstract Integer getFeatureInteger();
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTextPropertySection#getFeatureValue(java.lang.String)
-	 */
-	protected Object getFeatureValue(String newText) {
-		return new Integer(Integer.parseInt(newText));
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractMeasurementPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractMeasurementPropertySection.java
deleted file mode 100644
index 056970b..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractMeasurementPropertySection.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.editor.HockeyleagueEditor;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * An abstract implementation of a section for measurements. There is a text
- * field for the mesurement value and a radio box for the measurement units. For
- * example, weight in either pounds or kilograms.
- * 
- * @author Anthony Hunter
- */
-public abstract class AbstractMeasurementPropertySection
-	extends AbstractIntegerPropertySection {
-
-	/**
-	 * the left radio button for the section.
-	 */
-	protected Button radioLeft;
-
-	/**
-	 * the right radio button for the section.
-	 */
-	protected Button radioRight;
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		Composite composite = getWidgetFactory()
-			.createFlatFormComposite(parent);
-
-		String[] labels = getEnumerationLabels();
-
-		radioLeft = getWidgetFactory().createButton(composite, labels[0],
-			SWT.RADIO);
-		FormData data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.top = new FormAttachment(0, ITabbedPropertyConstants.VSPACE);
-		radioLeft.setLayoutData(data);
-
-		radioRight = getWidgetFactory().createButton(composite, labels[1],
-			SWT.RADIO);
-		data = new FormData();
-		data.left = new FormAttachment(radioLeft,
-			ITabbedPropertyConstants.HSPACE);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, ITabbedPropertyConstants.VSPACE);
-		radioRight.setLayoutData(data);
-
-		SelectionListener selectionListener = new SelectionListener() {
-
-			public void widgetSelected(SelectionEvent e) {
-				handleRadioModified(((Button) e.getSource()));
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				widgetSelected(e);
-			}
-
-		};
-
-		radioLeft.addSelectionListener(selectionListener);
-		radioRight.addSelectionListener(selectionListener);
-	}
-
-	/**
-	 * Handle the radio box modified event.
-	 */
-	protected void handleRadioModified(Button button) {
-
-		int index;
-		if (button == radioLeft) {
-			index = 0;
-		} else {
-			index = 1;
-		}
-		boolean equals = isEnumerationEqual(index);
-		if (!equals) {
-			EditingDomain editingDomain = ((HockeyleagueEditor) getPart())
-				.getEditingDomain();
-			Object value = getEnumerationFeatureValue(index);
-			if (eObjectList.size() == 1) {
-				/* apply the property change to single selected object */
-				editingDomain.getCommandStack().execute(
-					SetCommand.create(editingDomain, eObject,
-						getEnumerationFeature(), value));
-			} else {
-				CompoundCommand compoundCommand = new CompoundCommand();
-				/* apply the property change to all selected elements */
-				for (Iterator i = eObjectList.iterator(); i.hasNext();) {
-					EObject nextObject = (EObject) i.next();
-					compoundCommand.append(SetCommand.create(editingDomain,
-						nextObject, getEnumerationFeature(), value));
-				}
-				editingDomain.getCommandStack().execute(compoundCommand);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#refresh()
-	 */
-	public void refresh() {
-		super.refresh();
-		if (getEnumerationIndex() == 0) {
-			radioLeft.setSelection(true);
-			radioRight.setSelection(false);
-		} else {
-			radioLeft.setSelection(false);
-			radioRight.setSelection(true);
-		}
-
-	}
-
-	/**
-	 * Determine if the provided index of the enumeration is equal to the
-	 * current setting of the enumeration property.
-	 * 
-	 * @param index
-	 *            the new index in the enumeration.
-	 * @return <code>true</code> if the new index value is equal to the
-	 *         current property setting.
-	 */
-	protected abstract boolean isEnumerationEqual(int index);
-
-	/**
-	 * Get the feature for the enumeration field for the section.
-	 * 
-	 * @return the feature for the text.
-	 */
-	protected abstract EAttribute getEnumerationFeature();
-
-	/**
-	 * Get the enumeration values of the feature for the radio field for the
-	 * section.
-	 * 
-	 * @return the list of values of the feature as text.
-	 */
-	protected abstract String[] getEnumerationLabels();
-
-	/**
-	 * Get the index value of the feature for the radio field for the section.
-	 * 
-	 * @return the index value of the feature.
-	 */
-	protected abstract int getEnumerationIndex();
-
-	/**
-	 * Get the new value of the feature for the text field for the section.
-	 * 
-	 * @param index
-	 *            the new index in the enumeration.
-	 * @return the new value of the feature.
-	 */
-	protected abstract Object getEnumerationFeatureValue(int index);
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractPlayersPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractPlayersPropertySection.java
deleted file mode 100644
index f977017..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractPlayersPropertySection.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player;
-
-/**
- * The abstract implementation for a players table section.
- * 
- * @author Anthony Hunter
- */
-public abstract class AbstractPlayersPropertySection
-	extends AbstractTablePropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getColumnLabelText()
-	 */
-	protected List getColumnLabelText() {
-		ArrayList ret = new ArrayList();
-		ret.add("Name");//$NON-NLS-1$
-		ret.add("Jersey Number");//$NON-NLS-1$
-		ret.add("Shot");//$NON-NLS-1$
-		ret.addAll(getAdditionalColumnLabelText());
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getKeyForRow(java.lang.Object)
-	 */
-	protected String getKeyForRow(Object object) {
-		return ((Player) object).getName();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getValuesForRow(java.lang.Object)
-	 */
-	protected List getValuesForRow(Object object) {
-		ArrayList ret = new ArrayList();
-		ret.add(((Player) object).getName());
-		ret.add(Integer.toString(((Player) object).getNumber()));
-		ret.add(((Player) object).getShot().getName());
-		ret.addAll(getAdditionalValuesForRow(object));
-		return ret;
-	}
-
-	/**
-	 * Get the labels for the additional columns for the table.
-	 * 
-	 * @return the labels for the columns.
-	 */
-	protected abstract List getAdditionalColumnLabelText();
-	
-	/**
-	 * Get the additional values for the row in the table.
-	 * 
-	 * @param object
-	 *            an object in the row of the table.
-	 * @return the list of string values for the row.
-	 */
-	protected abstract List getAdditionalValuesForRow(Object object);
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractStringPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractStringPropertySection.java
deleted file mode 100644
index 3185108..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractStringPropertySection.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-
-/**
- * An abstract implementation of a section for a field with a String property
- * value.
- * 
- * @author Anthony Hunter
- */
-public abstract class AbstractStringPropertySection
-	extends AbstractTextPropertySection {
-	
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTextPropertySection#isEqual(java.lang.String)
-	 */
-	protected boolean isEqual(String newText) {
-		return getFeatureAsText().equals(newText);
-	}
-	
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTextPropertySection#getFeatureAsText()
-	 */
-	protected String getFeatureAsText() {
-		String string = (String)eObject.eGet(getFeature());
-		if (string == null) {
-			return "";//$NON-NLS-1$
-		}
-		return string;
-	}
-	
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTextPropertySection#getFeatureValue(java.lang.String)
-	 */
-	protected Object getFeatureValue(String newText) {
-		return newText;
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractTablePropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractTablePropertySection.java
deleted file mode 100644
index 245b7e0..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractTablePropertySection.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-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.ui.PlatformUI;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.dialogs.HockeyleagueSetDefaultsDialog;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.editor.HockeyleagueEditor;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * An abstract implementation of a section with a table field with add and
- * remove buttons.
- * 
- * @author Anthony Hunter
- */
-public abstract class AbstractTablePropertySection
-	extends AbstractHockeyleaguePropertySection {
-
-	/**
-	 * the table control for the section.
-	 */
-	protected Table table;
-
-	/**
-	 * the title columns for the section.
-	 */
-	protected List columns;
-
-	/**
-	 * the add button for the section.
-	 */
-	protected Button addButton;
-
-	/**
-	 * the remove button for the section.
-	 */
-	protected Button removeButton;
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		Composite composite = getWidgetFactory()
-			.createFlatFormComposite(parent);
-		FormData data;
-
-		table = getWidgetFactory().createTable(composite,
-			SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-
-		List labels = getColumnLabelText();
-		columns = new ArrayList();
-
-		for (Iterator i = labels.iterator(); i.hasNext();) {
-			TableColumn column = new TableColumn(table, SWT.NONE);
-			column.setText((String) i.next());
-			columns.add(column);
-		}
-
-		Shell shell = new Shell();
-		GC gc = new GC(shell);
-		gc.setFont(shell.getFont());
-		Point point = gc.textExtent("");//$NON-NLS-1$
-		int buttonHeight = point.y + 11;
-		gc.dispose();
-		shell.dispose();
-
-		addButton = getWidgetFactory().createButton(composite,
-			MessageFormat.format("Add {0}...",//$NON-NLS-1$
-				new String[] {getButtonLabelText()}), SWT.PUSH);
-		data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.bottom = new FormAttachment(100, 0);
-		data.top = new FormAttachment(100, -buttonHeight);
-		addButton.setLayoutData(data);
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent event) {
-				EditingDomain editingDomain = ((HockeyleagueEditor) getPart())
-					.getEditingDomain();
-				AddCommand addCommand = (AddCommand) AddCommand.create(
-					editingDomain, eObject, getFeature(), getNewChild());
-				HockeyleagueSetDefaultsDialog dialog = new HockeyleagueSetDefaultsDialog(
-					PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-						.getShell(), addCommand);
-				dialog.open();
-				if (dialog.getReturnCode() == Window.CANCEL) {
-					return;
-				}
-				editingDomain.getCommandStack().execute(addCommand);
-			}
-		});
-
-		removeButton = getWidgetFactory().createButton(composite,
-			MessageFormat.format("Delete {0}",//$NON-NLS-1$
-				new String[] {getButtonLabelText()}), SWT.PUSH);
-		data = new FormData();
-		data.left = new FormAttachment(addButton,
-			ITabbedPropertyConstants.VSPACE, SWT.BOTTOM);
-		data.bottom = new FormAttachment(100, 0);
-		data.top = new FormAttachment(100, -buttonHeight);
-		removeButton.setLayoutData(data);
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent event) {
-				EditingDomain editingDomain = ((HockeyleagueEditor) getPart())
-					.getEditingDomain();
-				Object object = table.getSelection()[0].getData();
-				editingDomain.getCommandStack().execute(
-					RemoveCommand.create(editingDomain, object));
-			}
-		});
-
-		data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, ITabbedPropertyConstants.VSPACE);
-		data.bottom = new FormAttachment(addButton,
-			-ITabbedPropertyConstants.VSPACE);
-		data.width = 400;
-		table.setLayoutData(data);
-
-		table.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent event) {
-				removeButton.setEnabled(true);
-			}
-		});
-		table.addMouseListener(new MouseAdapter() {
-
-			public void mouseDoubleClick(MouseEvent e) {
-				Object object = table.getSelection()[0].getData();
-				propertySheetPage.getEditor().getViewer().setSelection(
-					new StructuredSelection(object), true);
-				propertySheetPage.getEditor().setFocus();
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#shouldUseExtraSpace()
-	 */
-	public boolean shouldUseExtraSpace() {
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#refresh()
-	 */
-	public void refresh() {
-		table.removeAll();
-		removeButton.setEnabled(false);
-
-		for (Iterator i = getOwnedRows().iterator(); i.hasNext();) {
-			Object next = i.next();
-			String key = getKeyForRow(next);
-
-			// find index (for sorting purposes)
-			int k = 0;
-			int size = table.getItemCount();
-			while (k < size) {
-				String currentKey = table.getItem(k).getText();
-				if (key.compareToIgnoreCase(currentKey) < 0) {
-					break;
-				}
-				k++;
-			}
-
-			// create the table item
-			TableItem item = new TableItem(table, SWT.NONE, k);
-			String[] values = new String[columns.size()];
-			List valuesForRow = getValuesForRow(next);
-			for (int j = 0; j < columns.size(); j++) {
-				values[j] = (String) valuesForRow.get(j);
-			}
-			item.setText(values);
-			item.setData(next);
-		}
-
-		for (Iterator i = columns.iterator(); i.hasNext();) {
-			((TableColumn) i.next()).pack();
-		}
-	}
-
-	/**
-	 * Get the text for the labels that will be used for the Add and Remove
-	 * buttons.
-	 * 
-	 * @return the label text.
-	 */
-	protected abstract String getButtonLabelText();
-
-	/**
-	 * Get the row objects for the table.
-	 * 
-	 * @return the list of the row objects.
-	 */
-	protected abstract List getOwnedRows();
-
-	/**
-	 * Get the feature for the table field for the section.
-	 * 
-	 * @return the feature for the table.
-	 */
-	protected abstract EReference getFeature();
-
-	/**
-	 * Get the key for the table that is used for sorting. Usually the table is
-	 * sorted by Name or some key string..
-	 * 
-	 * @param object
-	 *            an object in the row of the table.
-	 * @return the string for the key.
-	 */
-	protected abstract String getKeyForRow(Object object);
-
-	/**
-	 * Get the values for the row in the table.
-	 * 
-	 * @param object
-	 *            an object in the row of the table.
-	 * @return the list of string values for the row.
-	 */
-	protected abstract List getValuesForRow(Object object);
-
-	/**
-	 * Get the labels for the columns for the table.
-	 * 
-	 * @return the labels for the columns.
-	 */
-	protected abstract List getColumnLabelText();
-
-	/**
-	 * Get a new child instance for the result of clicking the add button.
-	 * 
-	 * @return a new child instance.
-	 */
-	protected abstract Object getNewChild();
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractTextPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractTextPropertySection.java
deleted file mode 100644
index 5be7e85..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AbstractTextPropertySection.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.editor.HockeyleagueEditor;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.TextChangeHelper;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * An abstract implementation of a section with a text field.
- * 
- * @author Anthony Hunter
- */
-public abstract class AbstractTextPropertySection
-	extends AbstractHockeyleaguePropertySection {
-
-	/**
-	 * the text control for the section.
-	 */
-	protected Text text;
-
-	/**
-	 * A helper to listen for events that indicate that a text field has been
-	 * changed.
-	 */
-	protected TextChangeHelper listener;
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		Composite composite = getWidgetFactory()
-			.createFlatFormComposite(parent);
-		FormData data;
-
-		text = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
-		data = new FormData();
-		data.left = new FormAttachment(0, getStandardLabelWidth(composite,
-			new String[] {getLabelText()}));
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, ITabbedPropertyConstants.VSPACE);
-		text.setLayoutData(data);
-
-		CLabel nameLabel = getWidgetFactory().createCLabel(composite,
-			getLabelText());
-		data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(text, -ITabbedPropertyConstants.HSPACE);
-		data.top = new FormAttachment(text, 0, SWT.CENTER);
-		nameLabel.setLayoutData(data);
-
-		listener = new TextChangeHelper() {
-
-			public void textChanged(Control control) {
-				handleTextModified();
-			}
-		};
-		listener.startListeningTo(text);
-		listener.startListeningForEnter(text);
-	}
-
-	/**
-	 * Handle the text modified event.
-	 */
-	protected void handleTextModified() {
-		String newText = text.getText();
-		boolean equals = isEqual(newText);
-		if (!equals) {
-			EditingDomain editingDomain = ((HockeyleagueEditor) getPart())
-				.getEditingDomain();
-			Object value = getFeatureValue(newText);
-			if (eObjectList.size() == 1) {
-				/* apply the property change to single selected object */
-				editingDomain.getCommandStack().execute(
-					SetCommand.create(editingDomain, eObject, getFeature(),
-						value));
-			} else {
-				CompoundCommand compoundCommand = new CompoundCommand();
-				/* apply the property change to all selected elements */
-				for (Iterator i = eObjectList.iterator(); i.hasNext();) {
-					EObject nextObject = (EObject) i.next();
-					compoundCommand.append(SetCommand.create(editingDomain,
-						nextObject, getFeature(), value));
-				}
-				editingDomain.getCommandStack().execute(compoundCommand);
-			}
-		}
-	}
-
-	/*
-	 * @see org.eclipse.ui.views.properties.tabbed.view.ITabbedPropertySection#refresh()
-	 */
-	public void refresh() {
-		text.setText(getFeatureAsText());
-	}
-
-	/**
-	 * Determine if the provided string value is an equal representation of the
-	 * current setting of the text property.
-	 * 
-	 * @param newText
-	 *            the new string value.
-	 * @return <code>true</code> if the new string value is equal to the
-	 *         current property setting.
-	 */
-	protected abstract boolean isEqual(String newText);
-
-	/**
-	 * Get the feature for the text field for the section.
-	 * 
-	 * @return the feature for the text.
-	 */
-	protected abstract EAttribute getFeature();
-
-	/**
-	 * Get the value of the feature as text for the text field for the section.
-	 * 
-	 * @return the value of the feature as text.
-	 */
-	protected abstract String getFeatureAsText();
-
-	/**
-	 * Get the new value of the feature for the text field for the section.
-	 * 
-	 * @param newText
-	 *            the new value of the feature as a string.
-	 * @return the new value of the feature.
-	 */
-	protected abstract Object getFeatureValue(String newText);
-
-	/**
-	 * Get the label for the text field for the section.
-	 * 
-	 * @return the label for the text field.
-	 */
-	protected abstract String getLabelText();
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AddressPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AddressPropertySection.java
deleted file mode 100644
index 7dc1eb1..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AddressPropertySection.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-
-/**
- * A section for the address property of a selected Arena Object.
- * 
- * @author Anthony Hunter
- */
-public class AddressPropertySection
-	extends AbstractStringPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractStringPropertySection#getFeature()
-	 */
-	protected EAttribute getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getArena_Address();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractStringPropertySection#getLabelText()
-	 */
-	protected String getLabelText() {
-		return "Address:"; //$NON-NLS-1$
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AdvancedPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AdvancedPropertySection.java
deleted file mode 100644
index 7d4b75d..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/AdvancedPropertySection.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.HockeyleaguePropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * Advanced property section.
- * 
- * @author Anthony Hunter
- */
-public class AdvancedPropertySection
-	extends org.eclipse.ui.views.properties.tabbed.AdvancedPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ISection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		HockeyleaguePropertySheetPage hockeyleaguePropertySheetPage = (HockeyleaguePropertySheetPage) tabbedPropertySheetPage;
-		page.setPropertySourceProvider(new AdapterFactoryContentProvider(
-			hockeyleaguePropertySheetPage.getAdapterFactory()));
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/BirthDatePropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/BirthDatePropertySection.java
deleted file mode 100644
index b5da321..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/BirthDatePropertySection.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-
-/**
- * A section for the birth date property of a selected player Object.
- * 
- * @author Anthony Hunter
- */
-public class BirthDatePropertySection
-	extends AbstractStringPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTextPropertySection#getFeature()
-	 */
-	protected EAttribute getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getPlayer_Birthdate();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTextPropertySection#getLabelText()
-	 */
-	protected String getLabelText() {
-		return "Birth Date:";//$NON-NLS-1$
-	}
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/BirthPlacePropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/BirthPlacePropertySection.java
deleted file mode 100644
index 6234258..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/BirthPlacePropertySection.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-
-/**
- * A section for the birth place property of a selected player Object.
- * 
- * @author Anthony Hunter
- */
-public class BirthPlacePropertySection
-	extends AbstractStringPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTextPropertySection#getFeature()
-	 */
-	protected EAttribute getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getPlayer_Birthplace();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTextPropertySection#getLabelText()
-	 */
-	protected String getLabelText() {
-		return "Birth Place:";//$NON-NLS-1$
-	}
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/CapacityPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/CapacityPropertySection.java
deleted file mode 100644
index d58b543..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/CapacityPropertySection.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-
-
-/**
- * A section for the capacity property of a selected Arena Object.
- * 
- * @author Anthony Hunter
- */
-public class CapacityPropertySection
-	extends AbstractIntegerPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractStringPropertySection#getFeature()
-	 */
-	protected EAttribute getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getArena_Capacity();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractStringPropertySection#getFeatureText()
-	 */
-	protected Integer getFeatureInteger() {
-		Arena arena = (Arena) eObject;
-		return new Integer(arena.getCapacity());
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractStringPropertySection#getLabelText()
-	 */
-	protected String getLabelText() {
-		return "Capacity:";//$NON-NLS-1$
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/DefencePositionPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/DefencePositionPropertySection.java
deleted file mode 100644
index eeeadf5..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/DefencePositionPropertySection.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.DefencePositionKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-
-/**
- * A section for the position property of a selected defence player Object.
- * 
- * @author Anthony Hunter
- */
-public class DefencePositionPropertySection
-	extends AbstractEnumerationPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#getFeature()
-	 */
-	protected EAttribute getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getDefence_Position();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#getFeatureAsText()
-	 */
-	protected String getFeatureAsText() {
-		return ((Defence) eObject).getPosition().getName();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#getFeatureValue(int)
-	 */
-	protected Object getFeatureValue(int index) {
-		return DefencePositionKind.VALUES.get(index);
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#getLabelText()
-	 */
-	protected String getLabelText() {
-		return "Position:";//$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#isEqual(int)
-	 */
-	protected boolean isEqual(int index) {
-		return DefencePositionKind.VALUES.get(index).equals(
-			((Defence) eObject).getPosition());
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#getEnumerationFeatureValues()
-	 */
-	protected String[] getEnumerationFeatureValues() {
-		List values = DefencePositionKind.VALUES;
-		String[] ret = new String[values.size()];
-		for (int i = 0; i < values.size(); i++) {
-			ret[i] = ((DefencePositionKind) values.get(i)).getName();
-		}
-		return ret;
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/DefencemenPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/DefencemenPropertySection.java
deleted file mode 100644
index 9da352d..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/DefencemenPropertySection.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueFactory;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team;
-
-/**
- * The defencemen section.
- * 
- * @author Anthony Hunter
- */
-public class DefencemenPropertySection
-	extends AbstractPlayersPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getButtonLabelText()
-	 */
-	protected String getButtonLabelText() {
-		return "Defenceman";//$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getOwnedRows()
-	 */
-	protected List getOwnedRows() {
-		ArrayList ret = new ArrayList();
-		for (Iterator i = ((Team) eObject).getDefencemen().iterator(); i
-			.hasNext();) {
-			ret.add(i.next());
-		}
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractPlayersPropertySection#getAdditionalColumnLabelText()
-	 */
-	protected List getAdditionalColumnLabelText() {
-		ArrayList ret = new ArrayList();
-		ret.add("Position");//$NON-NLS-1$
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractPlayersPropertySection#getAdditionalValuesForRow(java.lang.Object)
-	 */
-	protected List getAdditionalValuesForRow(Object object) {
-		ArrayList ret = new ArrayList();
-		ret.add(((Defence) object).getPosition().getName());
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getFeature()
-	 */
-	protected EReference getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getTeam_Defencemen();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getNewChild()
-	 */
-	protected Object getNewChild() {
-		return HockeyleagueFactory.eINSTANCE.createDefence();
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/ForwardPositionPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/ForwardPositionPropertySection.java
deleted file mode 100644
index 521f84e..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/ForwardPositionPropertySection.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ForwardPositionKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-
-/**
- * A section for the position property of a selected forward Object.
- * 
- * @author Anthony Hunter
- */
-public class ForwardPositionPropertySection
-	extends AbstractEnumerationPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#getFeature()
-	 */
-	protected EAttribute getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getForward_Position();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#getFeatureAsText()
-	 */
-	protected String getFeatureAsText() {
-		return ((Forward) eObject).getPosition().getName();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#getFeatureValue(int)
-	 */
-	protected Object getFeatureValue(int index) {
-		return ForwardPositionKind.VALUES.get(index);
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#getLabelText()
-	 */
-	protected String getLabelText() {
-		return "Position:";//$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#isEqual(int)
-	 */
-	protected boolean isEqual(int index) {
-		return ForwardPositionKind.VALUES.get(index).equals(
-			((Forward) eObject).getPosition());
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#getEnumerationFeatureValues()
-	 */
-	protected String[] getEnumerationFeatureValues() {
-		List values = ForwardPositionKind.VALUES;
-		String[] ret = new String[values.size()];
-		for (int i = 0; i < values.size(); i++) {
-			ret[i] = ((ForwardPositionKind) values.get(i)).getName();
-		}
-		return ret;
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/ForwardsPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/ForwardsPropertySection.java
deleted file mode 100644
index e8e0818..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/ForwardsPropertySection.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueFactory;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team;
-
-
-/**
- * The forwards section.
- * 
- * @author Anthony Hunter
- */
-public class ForwardsPropertySection
-	extends AbstractPlayersPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getButtonLabelText()
-	 */
-	protected String getButtonLabelText() {
-		return "Forward";//$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getOwnedRows()
-	 */
-	protected List getOwnedRows() {
-		ArrayList ret = new ArrayList();
-		for (Iterator i = ((Team) eObject).getForwards().iterator(); i
-			.hasNext();) {
-			ret.add(i.next());
-		}
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractPlayersPropertySection#getAdditionalColumnLabelText()
-	 */
-	protected List getAdditionalColumnLabelText() {
-		ArrayList ret = new ArrayList();
-		ret.add("Position");//$NON-NLS-1$
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractPlayersPropertySection#getAdditionalValuesForRow(java.lang.Object)
-	 */
-	protected List getAdditionalValuesForRow(Object object) {
-		ArrayList ret = new ArrayList();
-		ret.add(((Forward) object).getPosition().getName());
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getFeature()
-	 */
-	protected EReference getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getTeam_Forwards();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getNewChild()
-	 */
-	protected Object getNewChild() {
-		return HockeyleagueFactory.eINSTANCE.createForward();
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/GoaliesPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/GoaliesPropertySection.java
deleted file mode 100644
index d4baf2e..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/GoaliesPropertySection.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueFactory;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team;
-
-/**
- * The goalies section.
- * 
- * @author Anthony Hunter
- */
-public class GoaliesPropertySection
-	extends AbstractPlayersPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getButtonLabelText()
-	 */
-	protected String getButtonLabelText() {
-		return "Goalie";//$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getOwnedRows()
-	 */
-	protected List getOwnedRows() {
-		ArrayList ret = new ArrayList();
-		for (Iterator i = ((Team) eObject).getGoalies().iterator(); i.hasNext();) {
-			ret.add(i.next());
-		}
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractPlayersPropertySection#getAdditionalColumnLabelText()
-	 */
-	protected List getAdditionalColumnLabelText() {
-		return new ArrayList();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractPlayersPropertySection#getAdditionalValuesForRow(java.lang.Object)
-	 */
-	protected List getAdditionalValuesForRow(Object object) {
-		return new ArrayList();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getFeature()
-	 */
-	protected EReference getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getTeam_Goalies();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getNewChild()
-	 */
-	protected Object getNewChild() {
-		return HockeyleagueFactory.eINSTANCE.createGoalie();
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/HeadOfficePropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/HeadOfficePropertySection.java
deleted file mode 100644
index b0c6979..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/HeadOfficePropertySection.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-
-
-/**
- * A section for the head office property of a selected League Object.
- * 
- * @author Anthony Hunter
- */
-public class HeadOfficePropertySection
-	extends AbstractStringPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractStringPropertySection#getFeature()
-	 */
-	protected EAttribute getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getLeague_Headoffice();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractStringPropertySection#getLabelText()
-	 */
-	protected String getLabelText() {
-		return "Head Office:"; //$NON-NLS-1$
-	}
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/HeightPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/HeightPropertySection.java
deleted file mode 100644
index 769d032..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/HeightPropertySection.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HeightKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player;
-
-/**
- * A section for the height property of a selected player Object.
- * 
- * @author Anthony Hunter
- */
-public class HeightPropertySection
-	extends AbstractMeasurementPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractMeasurementPropertySection#isEnumerationEqual(int)
-	 */
-	protected boolean isEnumerationEqual(int index) {
-		return HeightKind.VALUES.get(index).equals(
-			((Player) eObject).getHeightMesurement());
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractMeasurementPropertySection#getEnumerationFeature()
-	 */
-	protected EAttribute getEnumerationFeature() {
-		return HockeyleaguePackage.eINSTANCE.getPlayer_HeightMesurement();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractMeasurementPropertySection#getEnumerationLabels()
-	 */
-	protected String[] getEnumerationLabels() {
-		List values = HeightKind.VALUES;
-		String[] ret = new String[values.size()];
-		for (int i = 0; i < values.size(); i++) {
-			ret[i] = ((HeightKind) values.get(i)).getName();
-		}
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractMeasurementPropertySection#getEnumerationIndex()
-	 */
-	protected int getEnumerationIndex() {
-		return ((Player) eObject).getHeightMesurement().getValue();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractMeasurementPropertySection#getEnumerationFeatureValue(int)
-	 */
-	protected Object getEnumerationFeatureValue(int index) {
-		return HeightKind.VALUES.get(index);
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractIntegerPropertySection#getFeatureInteger()
-	 */
-	protected Integer getFeatureInteger() {
-		return new Integer(((Player) eObject).getHeightValue());
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTextPropertySection#getFeature()
-	 */
-	protected EAttribute getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getPlayer_HeightValue();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTextPropertySection#getLabelText()
-	 */
-	protected String getLabelText() {
-		return "Height:";//$NON-NLS-1$
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/NamePropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/NamePropertySection.java
deleted file mode 100644
index 491e8c6..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/NamePropertySection.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-
-/**
- * A section for the name property of a selected HockeyleagueObject.
- * 
- * @author Anthony Hunter
- */
-public class NamePropertySection
-	extends AbstractStringPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractStringPropertySection#getLabelText()
-	 */
-	protected String getLabelText() {
-		return "Name:"; //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractStringPropertySection#getFeature()
-	 */
-	protected EAttribute getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getHockeyleagueObject_Name();
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/NumberPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/NumberPropertySection.java
deleted file mode 100644
index 8a57364..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/NumberPropertySection.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player;
-
-/**
- * A section for the jersey number property of a selected player Object.
- * 
- * @author Anthony Hunter
- */
-public class NumberPropertySection
-	extends AbstractIntegerPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractStringPropertySection#getFeature()
-	 */
-	protected EAttribute getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getPlayer_Number();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractStringPropertySection#getFeatureText()
-	 */
-	protected Integer getFeatureInteger() {
-		return new Integer(((Player) eObject).getNumber());
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractStringPropertySection#getLabelText()
-	 */
-	protected String getLabelText() {
-		return "Jersey Number:";//$NON-NLS-1$
-	}
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/PlayerStatsPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/PlayerStatsPropertySection.java
deleted file mode 100644
index d5d3b4d..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/PlayerStatsPropertySection.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueFactory;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats;
-
-/**
- * The player stats section.
- * 
- * @author Anthony Hunter
- */
-public class PlayerStatsPropertySection
-	extends AbstractTablePropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getColumnLabelText()
-	 */
-	protected List getColumnLabelText() {
-		ArrayList ret = new ArrayList();
-		ret.add("Year");//$NON-NLS-1$
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getKeyForRow(java.lang.Object)
-	 */
-	protected String getKeyForRow(Object object) {
-		return ((PlayerStats) object).getYear();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getValuesForRow(java.lang.Object)
-	 */
-	protected List getValuesForRow(Object object) {
-		ArrayList ret = new ArrayList();
-		ret.add(((PlayerStats) object).getYear());
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getButtonLabelText()
-	 */
-	protected String getButtonLabelText() {
-		return "Player Stats";//$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getOwnedRows()
-	 */
-	protected List getOwnedRows() {
-
-		ArrayList ret = new ArrayList();
-		for (Iterator i = (eObject instanceof Defence) ? ((Defence) eObject)
-			.getPlayerStats().iterator()
-			: ((Forward) eObject).getPlayerStats().iterator(); i.hasNext();) {
-			ret.add(i.next());
-		}
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getFeature()
-	 */
-	protected EReference getFeature() {
-		return (eObject instanceof Defence) ? HockeyleaguePackage.eINSTANCE
-			.getDefence_PlayerStats()
-			: HockeyleaguePackage.eINSTANCE.getForward_PlayerStats();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getNewChild()
-	 */
-	protected Object getNewChild() {
-		return HockeyleagueFactory.eINSTANCE.createPlayerStats();
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/ShotPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/ShotPropertySection.java
deleted file mode 100644
index 156919f..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/ShotPropertySection.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ShotKind;
-
-/**
- * A section for the shot property of a selected player Object.
- * 
- * @author Anthony Hunter
- */
-public class ShotPropertySection
-	extends AbstractEnumerationPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#getFeature()
-	 */
-	protected EAttribute getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getPlayer_Shot();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#getFeatureAsText()
-	 */
-	protected String getFeatureAsText() {
-		return ((Player) eObject).getShot().getName();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#getFeatureValue(int)
-	 */
-	protected Object getFeatureValue(int index) {
-		return ShotKind.VALUES.get(index);
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#getLabelText()
-	 */
-	protected String getLabelText() {
-		return "Shot:";//$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#isEqual(int)
-	 */
-	protected boolean isEqual(int index) {
-		return ShotKind.VALUES.get(index).equals(((Player) eObject).getShot());
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractEnumerationPropertySection#getEnumerationFeatureValues()
-	 */
-	protected String[] getEnumerationFeatureValues() {
-		List values = ShotKind.VALUES;
-		String[] ret = new String[values.size()];
-		for (int i = 0; i < values.size(); i++) {
-			ret[i] = ((ShotKind) values.get(i)).getName();
-		}
-		return ret;
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/TeamsPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/TeamsPropertySection.java
deleted file mode 100644
index b6b3303..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/TeamsPropertySection.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueFactory;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team;
-
-/**
- * The teams section in the teams tab for a league.
- * 
- * @author Anthony Hunter
- */
-public class TeamsPropertySection
-	extends AbstractTablePropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getColumnLabelText()
-	 */
-	protected List getColumnLabelText() {
-		ArrayList ret = new ArrayList();
-		ret.add("Name");//$NON-NLS-1$
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getKeyForRow(java.lang.Object)
-	 */
-	protected String getKeyForRow(Object object) {
-		return ((Team) object).getName();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getValuesForRow(java.lang.Object)
-	 */
-	protected List getValuesForRow(Object object) {
-		ArrayList ret = new ArrayList();
-		ret.add(((Team) object).getName());
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getButtonLabelText()
-	 */
-	protected String getButtonLabelText() {
-		return "Team";//$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getOwnedRows()
-	 */
-	protected List getOwnedRows() {
-		ArrayList ret = new ArrayList();
-		for (Iterator i = ((League) eObject).getTeams().iterator(); i.hasNext();) {
-			ret.add(i.next());
-		}
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getFeature()
-	 */
-	protected EReference getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getLeague_Teams();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTablePropertySection#getNewChild()
-	 */
-	protected Object getNewChild() {
-		return HockeyleagueFactory.eINSTANCE.createTeam();
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/WeightPropertySection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/WeightPropertySection.java
deleted file mode 100644
index ee68e1a..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/properties/sections/WeightPropertySection.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.WeightKind;
-
-/**
- * A section for the weight property of a selected player Object.
- * 
- * @author Anthony Hunter
- */
-public class WeightPropertySection
-	extends AbstractMeasurementPropertySection {
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractMeasurementPropertySection#isEnumerationEqual(int)
-	 */
-	protected boolean isEnumerationEqual(int index) {
-		return WeightKind.VALUES.get(index).equals(
-			((Player) eObject).getWeightMesurement());
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractMeasurementPropertySection#getEnumerationFeature()
-	 */
-	protected EAttribute getEnumerationFeature() {
-		return HockeyleaguePackage.eINSTANCE.getPlayer_WeightMesurement();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractMeasurementPropertySection#getEnumerationLabels()
-	 */
-	protected String[] getEnumerationLabels() {
-		List values = WeightKind.VALUES;
-		String[] ret = new String[values.size()];
-		for (int i = 0; i < values.size(); i++) {
-			ret[i] = ((WeightKind) values.get(i)).getName();
-		}
-		return ret;
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractMeasurementPropertySection#getEnumerationIndex()
-	 */
-	protected int getEnumerationIndex() {
-		return ((Player) eObject).getWeightMesurement().getValue();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractMeasurementPropertySection#getEnumerationFeatureValue(int)
-	 */
-	protected Object getEnumerationFeatureValue(int index) {
-		return WeightKind.VALUES.get(index);
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractIntegerPropertySection#getFeatureInteger()
-	 */
-	protected Integer getFeatureInteger() {
-		return new Integer(((Player) eObject).getWeightValue());
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTextPropertySection#getFeature()
-	 */
-	protected EAttribute getFeature() {
-		return HockeyleaguePackage.eINSTANCE.getPlayer_WeightValue();
-	}
-
-	/**
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.properties.sections.AbstractTextPropertySection#getLabelText()
-	 */
-	protected String getLabelText() {
-		return "Weight:";//$NON-NLS-1$
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/wizards/NewHockeyleagueFileWizard.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/wizards/NewHockeyleagueFileWizard.java
deleted file mode 100644
index db9038f..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/wizards/NewHockeyleagueFileWizard.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.wizards;
-
-import java.util.Collections;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-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.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueFactory;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.ISetSelectionTarget;
-import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
-
-/**
- * This is the wizard to create a new Hockeyleague model file.
- * 
- * @author Anthony Hunter
- */
-public class NewHockeyleagueFileWizard
-	extends BasicNewResourceWizard {
-
-	private NewHockeyleagueFileWizardPage mainPage;
-
-	private IStructuredSelection selection;
-
-	private IWorkbench workbench;
-
-	/**
-	 * The framework calls this to create the contents of the wizard.
-	 */
-	public void addPages() {
-		// Create a page, set the title, and the initial model file name.
-		//
-		mainPage = new NewHockeyleagueFileWizardPage("Whatever", selection); //$NON-NLS-1$
-		mainPage.setTitle("Hockey League Example File"); //$NON-NLS-1$
-		mainPage.setDescription("Create a new Tabbed Properties View Hockey League Example File"); //$NON-NLS-1$
-		mainPage.setFileName("example.hockeyleague"); //$NON-NLS-1$
-		addPage(mainPage);
-
-		// Try and get the resource selection to determine a current directory
-		// for the file dialog.
-		//
-		if (selection != null && !selection.isEmpty()) {
-			// Get the resource...
-			//
-			Object selectedElement = selection.iterator().next();
-			if (selectedElement instanceof IResource) {
-				// Get the resource parent, if its a file.
-				//
-				IResource selectedResource = (IResource) selectedElement;
-				if (selectedResource.getType() == IResource.FILE) {
-					selectedResource = selectedResource.getParent();
-				}
-
-				// This gives us a directory...
-				//
-				if (selectedResource instanceof IFolder
-					|| selectedResource instanceof IProject) {
-					// Set this for the container.
-					//
-					mainPage.setContainerFullPath(selectedResource
-						.getFullPath());
-
-					// Make up a unique new name here.
-					//
-					String defaultFilename = "example"; //$NON-NLS-1$
-					String defaultExtension = "hockeyleague"; //$NON-NLS-1$
-					String modelFilename = defaultFilename + "." //$NON-NLS-1$
-						+ defaultExtension;
-					for (int i = 1; ((IContainer) selectedResource)
-						.findMember(modelFilename) != null; ++i) {
-						modelFilename = defaultFilename + i + "." //$NON-NLS-1$
-							+ defaultExtension;
-					}
-					mainPage.setFileName(modelFilename);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Method declared on IWorkbenchWizard.
-	 */
-	public void init(IWorkbench aWorkbench,
-			IStructuredSelection currentSelection) {
-		super.init(aWorkbench, currentSelection);
-		this.workbench = aWorkbench;
-		this.selection = currentSelection;
-		setWindowTitle("New Hockey League File"); //$NON-NLS-1$
-		setNeedsProgressMonitor(true);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() {
-		try {
-			// Remember the file.
-			//
-			final IFile hockeyleagueFile = getHockeyleagueFile();
-
-			// Do the work within an operation.
-			//
-			WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
-
-				protected void execute(IProgressMonitor progressMonitor) {
-					try {
-						ResourceSet resourceSet = new ResourceSetImpl();
-
-						URI fileURI = URI
-							.createPlatformResourceURI(hockeyleagueFile
-								.getFullPath().toString());
-
-						Resource resource = resourceSet.createResource(fileURI);
-
-						// Add the initial model object to the contents.
-						//
-						EObject rootObject = createInitialModel();
-						if (rootObject != null) {
-							resource.getContents().add(rootObject);
-						}
-
-						// Save the contents of the resource to the file system.
-						//
-						resource.save(Collections.EMPTY_MAP);
-					} catch (Exception exception) {
-						exception.printStackTrace();
-					} finally {
-						progressMonitor.done();
-					}
-				}
-			};
-
-			getContainer().run(false, false, operation);
-
-			// Select the new file resource in the current view.
-			//
-			IWorkbenchWindow workbenchWindow = workbench
-				.getActiveWorkbenchWindow();
-			IWorkbenchPage page = workbenchWindow.getActivePage();
-			final IWorkbenchPart activePart = page.getActivePart();
-			if (activePart instanceof ISetSelectionTarget) {
-				final ISelection targetSelection = new StructuredSelection(
-					hockeyleagueFile);
-				getShell().getDisplay().asyncExec(new Runnable() {
-
-					public void run() {
-						((ISetSelectionTarget) activePart)
-							.selectReveal(targetSelection);
-					}
-				});
-			}
-
-			// Open an editor on the new file.
-			//
-			try {
-				IDE.openEditor(page, hockeyleagueFile, true);
-			} catch (PartInitException exception) {
-				MessageDialog.openError(workbenchWindow.getShell(),
-					"Open Editor", exception.getMessage()); //$NON-NLS-1$
-				return false;
-			}
-
-			return true;
-		} catch (Exception exception) {
-			exception.printStackTrace();
-			return false;
-		}
-	}
-
-	public IFile getHockeyleagueFile() {
-		return mainPage.getHockeyleagueFile();
-	}
-
-	private EObject createInitialModel() {
-		EClass eClass = HockeyleaguePackage.eINSTANCE.getLeague();
-		EObject rootObject = HockeyleagueFactory.eINSTANCE.create(eClass);
-		return rootObject;
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/wizards/NewHockeyleagueFileWizardPage.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/wizards/NewHockeyleagueFileWizardPage.java
deleted file mode 100644
index f96d351..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/wizards/NewHockeyleagueFileWizardPage.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.wizards;
-
-import java.text.MessageFormat;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
-
-/**
- * This is the wizard page to create a new Hockeyleague model file.
- * 
- * @author Anthony Hunter
- */
-public class NewHockeyleagueFileWizardPage
-	extends WizardNewFileCreationPage {
-
-	/**
-	 * The Hockey league file.
-	 */
-	protected IFile hockeyleagueFile;
-
-	/**
-	 * @param pageName
-	 * @param selection
-	 */
-	public NewHockeyleagueFileWizardPage(String pageName,
-			IStructuredSelection selection) {
-		super(pageName, selection);
-	}
-
-	/**
-	 * The framework calls this to see if the file is correct.
-	 */
-	protected boolean validatePage() {
-		if (super.validatePage()) {
-			// Make sure the file ends in ".hockeyleague".
-			//
-			String requiredExtStatic = "hockeyleague"; //$NON-NLS-1$
-			String enteredExt = new Path(getFileName()).getFileExtension();
-			if (enteredExt == null
-				|| !(enteredExt.equals(requiredExtStatic))) {
-				setErrorMessage(MessageFormat.format(
-					"The filename must end in \".{0}\"",//$NON-NLS-1$
-					new Object[] {requiredExtStatic}));
-				return false;
-			} else {
-				return true;
-			}
-		} else {
-			return false;
-		}
-	}
-
-	/**
-	 * Store the dialog field settings upon completion.
-	 */
-	public boolean performFinish() {
-		hockeyleagueFile = getHockeyleagueFile();
-		return true;
-	}
-
-	/**
-	 */
-	public IFile getHockeyleagueFile() {
-		return hockeyleagueFile == null ? ResourcesPlugin.getWorkspace()
-			.getRoot().getFile(getContainerFullPath().append(getFileName()))
-			: hockeyleagueFile;
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/wizards/NewHockeyleagueProjectWizard.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/wizards/NewHockeyleagueProjectWizard.java
deleted file mode 100644
index 2d35c9a..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/ui/wizards/NewHockeyleagueProjectWizard.java
+++ /dev/null
@@ -1,512 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ui.wizards;
-
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.text.MessageFormat;
-import java.util.Collections;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-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.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-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.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.DefencePositionKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ForwardPositionKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HeightKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueFactory;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePlugin;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.ShotKind;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.WeightKind;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.ISetSelectionTarget;
-import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
-
-/**
- * This is the wizard to create a new Hockeyleague example project.
- * 
- * @author Anthony Hunter
- */
-public class NewHockeyleagueProjectWizard
-	extends BasicNewResourceWizard {
-
-	private WizardNewProjectCreationPage mainPage;
-
-	private IWorkbench workbench;
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
-	 *      org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench aWorkbench,
-			IStructuredSelection currentSelection) {
-		super.init(workbench, currentSelection);
-		this.workbench = aWorkbench;
-		setWindowTitle("New Hockey League Project"); //$NON-NLS-1$
-		setNeedsProgressMonitor(true);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.IWizard#addPages()
-	 */
-	public void addPages() {
-		super.addPages();
-		mainPage = new WizardNewProjectCreationPage("basicNewProjectPage");//$NON-NLS-1$
-		mainPage.setTitle("Hockey League Example Project"); //$NON-NLS-1$
-		mainPage.setDescription("Create a new Tabbed Properties View Hockey League Example Project"); //$NON-NLS-1$
-		this.addPage(mainPage);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() {
-		// get a project handle
-		final IProject newProjectHandle = mainPage.getProjectHandle();
-		IPath newPath = null;
-		if (!mainPage.useDefaults())
-			newPath = mainPage.getLocationPath();
-		final IPath newProjectPath = newPath;
-		final IFile[] newFile = new IFile[1];
-
-		// create the new project operation
-		WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
-
-			protected void execute(IProgressMonitor monitor)
-				throws CoreException {
-				try {
-					monitor.beginTask("Creating New Project", 3000);//$NON-NLS-1$
-
-					monitor.setTaskName("Create a project descriptor");//$NON-NLS-1$
-					monitor.worked(1000);
-					IWorkspace workspace = ResourcesPlugin.getWorkspace();
-					final IProjectDescription description = workspace
-						.newProjectDescription(newProjectHandle.getName());
-					description.setLocation(newProjectPath);
-
-					monitor.setTaskName("Create the new project");//$NON-NLS-1$
-					newProjectHandle.create(description,
-						new SubProgressMonitor(monitor, 1000));
-
-					if (monitor.isCanceled())
-						throw new OperationCanceledException();
-
-					monitor.setTaskName("Open the new project");//$NON-NLS-1$
-					newProjectHandle
-						.open(new SubProgressMonitor(monitor, 1000));
-
-					if (monitor.isCanceled())
-						throw new OperationCanceledException();
-
-					monitor.setTaskName("Create the new file");//$NON-NLS-1$
-					monitor.worked(1000);
-					newFile[0] = newProjectHandle
-						.getFile("example.hockeyleague");//$NON-NLS-1$
-					ResourceSet resourceSet = new ResourceSetImpl();
-
-					URI fileURI = URI.createPlatformResourceURI(newFile[0]
-						.getFullPath().toString());
-
-					Resource resource = resourceSet.createResource(fileURI);
-
-					// Add the initial model object to the contents.
-					//
-					createInitialModel(resource);
-
-					try {
-						// Save the contents of the resource to the file system.
-						//
-						resource.save(Collections.EMPTY_MAP);
-					} catch (IOException e) {
-						e.printStackTrace();
-					}
-
-				} finally {
-					monitor.done();
-				}
-			}
-		};
-
-		// run the new project creation operation
-		try {
-			getContainer().run(true, true, op);
-		} catch (InterruptedException e) {
-			return false;
-		} catch (InvocationTargetException e) {
-			// ie.- one of the steps resulted in a core exception
-			Throwable t = e.getTargetException();
-			if (t instanceof CoreException) {
-				ErrorDialog.openError(getShell(), "Creation Problems", //$NON-NLS-1$
-					null, // no special message
-					((CoreException) t).getStatus());
-			} else {
-				// CoreExceptions are handled above, but unexpected runtime
-				// exceptions and errors may still occur.
-				HockeyleaguePlugin.getPlugin().getLog().log(
-					new Status(IStatus.ERROR, "HockeyleaguePlugin", 0, t//$NON-NLS-1$
-						.toString(), t));
-				MessageDialog.openError(getShell(), "Creation Problems", //$NON-NLS-1$
-					MessageFormat.format("Internal error: {0}", //$NON-NLS-1$
-						new Object[] {t.getMessage()}));
-			}
-			return false;
-		}
-
-		// Select the new file resource in the current view.
-		//
-		IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
-		IWorkbenchPage page = workbenchWindow.getActivePage();
-		final IWorkbenchPart activePart = page.getActivePart();
-		if (activePart instanceof ISetSelectionTarget) {
-			final ISelection targetSelection = new StructuredSelection(
-				newFile[0]);
-			getShell().getDisplay().asyncExec(new Runnable() {
-
-				public void run() {
-					((ISetSelectionTarget) activePart)
-						.selectReveal(targetSelection);
-				}
-			});
-		}
-
-		// Open an editor on the new file.
-		//
-		try {
-			IDE.openEditor(page, newFile[0], true);
-		} catch (PartInitException exception) {
-			MessageDialog.openError(workbenchWindow.getShell(), "Open Editor",//$NON-NLS-1$
-				exception.getMessage());
-			return false;
-		}
-
-		return true;
-	}
-
-	private EObject createInitialModel(Resource resource) {
-		HockeyleagueFactory hockeyleagueFactory = HockeyleagueFactory.eINSTANCE;
-
-		/* Global Hockey League */
-		League league = hockeyleagueFactory.createLeague();
-		league.setName("Global Hockey League");//$NON-NLS-1$
-		league
-			.setHeadoffice("99 Bee Street, Toronto, Ontario, Canada, M5J 1Y7");//$NON-NLS-1$
-		resource.getContents().add(league);
-
-		/* Toronto Storm */
-		Arena arena = hockeyleagueFactory.createArena();
-		arena.setAddress("40 Buy Street, Toronto, Ontario, Canada, M5J 1C3");//$NON-NLS-1$
-		arena.setCapacity(18918);
-		arena.setName("Storm Centre");//$NON-NLS-1$
-		resource.getContents().add(arena);
-
-		Team torontoStorm = hockeyleagueFactory.createTeam();
-		torontoStorm.setName("Toronto Storm");//$NON-NLS-1$
-		torontoStorm.setArena(arena);
-		createPlayers(torontoStorm);
-		resource.getContents().add(torontoStorm);
-
-		/* Montreal Eagles */
-		arena = hockeyleagueFactory.createArena();
-		arena
-			.setAddress("1010 de La Gauchetiere Street, Montreal, Quebec, Canada, H3B B7B");//$NON-NLS-1$
-		arena.setCapacity(22000);
-		arena.setName("Global Centre");//$NON-NLS-1$
-		resource.getContents().add(arena);
-
-		Team montrealEagles = hockeyleagueFactory.createTeam();
-		montrealEagles.setName("Montreal Eagles");//$NON-NLS-1$
-		montrealEagles.setArena(arena);
-		createPlayers(montrealEagles);
-		resource.getContents().add(montrealEagles);
-
-		/* Ottawa Lions */
-		arena = hockeyleagueFactory.createArena();
-		arena.setAddress("1001 Atlas Drive, Ottawa, Ontario, Canada, K2V 1L8");//$NON-NLS-1$
-		arena.setCapacity(19000);
-		arena.setName("Ottawa Memorial Arena");//$NON-NLS-1$
-		resource.getContents().add(arena);
-
-		Team ottawaLions = hockeyleagueFactory.createTeam();
-		ottawaLions.setName("Ottawa Lions");//$NON-NLS-1$
-		ottawaLions.setArena(arena);
-		createPlayers(ottawaLions);
-		resource.getContents().add(ottawaLions);
-
-		/* Vancouver Tigers */
-		arena = hockeyleagueFactory.createArena();
-		arena
-			.setAddress("200 Griffins Way, Vancouver, British Columbia, Canada, V6B 9M2");//$NON-NLS-1$
-		arena.setCapacity(18500);
-		arena.setName("Century Place");//$NON-NLS-1$
-		resource.getContents().add(arena);
-
-		Team vancouverTigers = hockeyleagueFactory.createTeam();
-		vancouverTigers.setName("Vancouver Tigers");//$NON-NLS-1$
-		vancouverTigers.setArena(arena);
-		createPlayers(vancouverTigers);
-		resource.getContents().add(vancouverTigers);
-
-		league.getTeams().add(torontoStorm);
-		league.getTeams().add(montrealEagles);
-		league.getTeams().add(ottawaLions);
-		league.getTeams().add(vancouverTigers);
-		return league;
-	}
-
-	/**
-	 */
-	private void createPlayers(Team team) {
-		createGoalie(team);
-		createLeftWing(team);
-		createCenter(team);
-		createRightWing(team);
-		createRightDefence(team);
-		createLeftDefence(team);
-	}
-
-	private void createRightDefence(Team team) {
-		HockeyleagueFactory hockeyleagueFactory = HockeyleagueFactory.eINSTANCE;
-		Defence defence = hockeyleagueFactory.createDefence();
-		defence.setName("Josef Kraft");//$NON-NLS-1$
-		defence.setBirthdate("September 2, 1980");//$NON-NLS-1$
-		defence.setBirthplace("Plzen, Czechoslovakia");//$NON-NLS-1$
-		defence.setHeightMesurement(HeightKind.INCHES_LITERAL);
-		defence.setHeightValue(74);
-		defence.setWeightMesurement(WeightKind.POUNDS_LITERAL);
-		defence.setWeightValue(224);
-		defence.setNumber(15);
-		defence.setShot(ShotKind.RIGHT_LITERAL);
-		defence.setPosition(DefencePositionKind.RIGHT_DEFENCE_LITERAL);
-
-		PlayerStats playerStats = hockeyleagueFactory.createPlayerStats();
-		playerStats.setYear("2004");//$NON-NLS-1$
-		playerStats.setTeam(team);
-		playerStats.setGamesPlayedIn(67);
-		playerStats.setGoals(28);
-		playerStats.setAssists(63);
-		playerStats.setPoints(91);
-		playerStats.setPlusMinus(-25);
-		playerStats.setPenaltyMinutes(43);
-		playerStats.setPowerPlayGoals(14);
-		playerStats.setShortHandedGoals(0);
-		playerStats.setGameWinningGoals(0);
-		playerStats.setShots(235);
-		playerStats.setShotPercentage(11.9F);
-		playerStats.setGameWinningGoals(4);
-		defence.getPlayerStats().add(playerStats);
-
-		team.getDefencemen().add(defence);
-	}
-
-	private void createLeftDefence(Team team) {
-		HockeyleagueFactory hockeyleagueFactory = HockeyleagueFactory.eINSTANCE;
-		Defence defence = hockeyleagueFactory.createDefence();
-		defence.setName("Tom Orpik");//$NON-NLS-1$
-		defence.setBirthdate("March 20, 1975");//$NON-NLS-1$
-		defence.setBirthplace("Cayuga, Ontario, Canada");//$NON-NLS-1$
-		defence.setHeightMesurement(HeightKind.INCHES_LITERAL);
-		defence.setHeightValue(74);
-		defence.setWeightMesurement(WeightKind.POUNDS_LITERAL);
-		defence.setWeightValue(224);
-		defence.setNumber(15);
-		defence.setShot(ShotKind.LEFT_LITERAL);
-		defence.setPosition(DefencePositionKind.LEFT_DEFENCE_LITERAL);
-
-		PlayerStats playerStats = hockeyleagueFactory.createPlayerStats();
-		playerStats.setYear("2004");//$NON-NLS-1$
-		playerStats.setTeam(team);
-		playerStats.setGamesPlayedIn(67);
-		playerStats.setGoals(28);
-		playerStats.setAssists(63);
-		playerStats.setPoints(91);
-		playerStats.setPlusMinus(-25);
-		playerStats.setPenaltyMinutes(43);
-		playerStats.setPowerPlayGoals(14);
-		playerStats.setShortHandedGoals(0);
-		playerStats.setGameWinningGoals(0);
-		playerStats.setShots(235);
-		playerStats.setShotPercentage(11.9F);
-		playerStats.setGameWinningGoals(4);
-		defence.getPlayerStats().add(playerStats);
-
-		team.getDefencemen().add(defence);
-	}
-
-	private void createCenter(Team team) {
-		HockeyleagueFactory hockeyleagueFactory = HockeyleagueFactory.eINSTANCE;
-		Forward forward = hockeyleagueFactory.createForward();
-		forward.setName("Tom Orpik");//$NON-NLS-1$
-		forward.setBirthdate("March 20, 1975");//$NON-NLS-1$
-		forward.setBirthplace("Cayuga, Ontario, Canada");//$NON-NLS-1$
-		forward.setHeightMesurement(HeightKind.INCHES_LITERAL);
-		forward.setHeightValue(74);
-		forward.setWeightMesurement(WeightKind.POUNDS_LITERAL);
-		forward.setWeightValue(224);
-		forward.setNumber(15);
-		forward.setShot(ShotKind.RIGHT_LITERAL);
-		forward.setPosition(ForwardPositionKind.CENTER_LITERAL);
-
-		PlayerStats playerStats = hockeyleagueFactory.createPlayerStats();
-		playerStats.setYear("2004");//$NON-NLS-1$
-		playerStats.setTeam(team);
-		playerStats.setGamesPlayedIn(67);
-		playerStats.setGoals(28);
-		playerStats.setAssists(63);
-		playerStats.setPoints(91);
-		playerStats.setPlusMinus(-25);
-		playerStats.setPenaltyMinutes(43);
-		playerStats.setPowerPlayGoals(14);
-		playerStats.setShortHandedGoals(0);
-		playerStats.setGameWinningGoals(0);
-		playerStats.setShots(235);
-		playerStats.setShotPercentage(11.9F);
-		playerStats.setGameWinningGoals(4);
-		forward.getPlayerStats().add(playerStats);
-
-		team.getForwards().add(forward);
-	}
-
-	private void createLeftWing(Team team) {
-		HockeyleagueFactory hockeyleagueFactory = HockeyleagueFactory.eINSTANCE;
-		Forward forward = hockeyleagueFactory.createForward();
-		forward.setName("Chris Sargeant");//$NON-NLS-1$
-		forward.setBirthdate("February 16, 1973");//$NON-NLS-1$
-		forward.setBirthplace("Cayuga, Ontario, Canada");//$NON-NLS-1$
-		forward.setHeightMesurement(HeightKind.INCHES_LITERAL);
-		forward.setHeightValue(75);
-		forward.setWeightMesurement(WeightKind.POUNDS_LITERAL);
-		forward.setWeightValue(198);
-		forward.setNumber(22);
-		forward.setShot(ShotKind.RIGHT_LITERAL);
-		forward.setPosition(ForwardPositionKind.RIGHT_WING_LITERAL);
-
-		PlayerStats playerStats = hockeyleagueFactory.createPlayerStats();
-		playerStats.setYear("2004");//$NON-NLS-1$
-		playerStats.setTeam(team);
-		playerStats.setGamesPlayedIn(67);
-		playerStats.setGoals(28);
-		playerStats.setAssists(63);
-		playerStats.setPoints(91);
-		playerStats.setPlusMinus(-25);
-		playerStats.setPenaltyMinutes(43);
-		playerStats.setPowerPlayGoals(14);
-		playerStats.setShortHandedGoals(0);
-		playerStats.setGameWinningGoals(0);
-		playerStats.setShots(235);
-		playerStats.setShotPercentage(11.9F);
-		playerStats.setGameWinningGoals(4);
-		forward.getPlayerStats().add(playerStats);
-
-		team.getForwards().add(forward);
-	}
-
-	private void createRightWing(Team team) {
-		HockeyleagueFactory hockeyleagueFactory = HockeyleagueFactory.eINSTANCE;
-		Forward forward = hockeyleagueFactory.createForward();
-		forward.setName("Martin Smyth");//$NON-NLS-1$
-		forward.setBirthdate("January 24, 1983");//$NON-NLS-1$
-		forward.setBirthplace("Calgary, Alberta, Canada");//$NON-NLS-1$
-		forward.setHeightMesurement(HeightKind.INCHES_LITERAL);
-		forward.setHeightValue(71);
-		forward.setWeightMesurement(WeightKind.POUNDS_LITERAL);
-		forward.setWeightValue(192);
-		forward.setNumber(14);
-		forward.setShot(ShotKind.LEFT_LITERAL);
-		forward.setPosition(ForwardPositionKind.LEFT_WING_LITERAL);
-
-		PlayerStats playerStats = hockeyleagueFactory.createPlayerStats();
-		playerStats.setYear("2004");//$NON-NLS-1$
-		playerStats.setTeam(team);
-		playerStats.setGamesPlayedIn(80);
-		playerStats.setGoals(45);
-		playerStats.setAssists(35);
-		playerStats.setPoints(80);
-		playerStats.setPlusMinus(8);
-		playerStats.setPenaltyMinutes(34);
-		playerStats.setPowerPlayGoals(14);
-		playerStats.setShortHandedGoals(0);
-		playerStats.setGameWinningGoals(10);
-		playerStats.setShots(229);
-		playerStats.setShotPercentage(19.7F);
-		playerStats.setGameWinningGoals(10);
-		forward.getPlayerStats().add(playerStats);
-
-		team.getForwards().add(forward);
-	}
-
-	private void createGoalie(Team team) {
-		HockeyleagueFactory hockeyleagueFactory = HockeyleagueFactory.eINSTANCE;
-		Goalie goalie = hockeyleagueFactory.createGoalie();
-		goalie.setName("Jaugues Leblanc");//$NON-NLS-1$
-		goalie.setBirthdate("July 7, 1979");//$NON-NLS-1$
-		goalie.setBirthplace("Laval, Quebec, Canada");//$NON-NLS-1$
-		goalie.setHeightMesurement(HeightKind.INCHES_LITERAL);
-		goalie.setHeightValue(71);
-		goalie.setWeightMesurement(WeightKind.POUNDS_LITERAL);
-		goalie.setWeightValue(192);
-		goalie.setNumber(29);
-		goalie.setShot(ShotKind.LEFT_LITERAL);
-
-		GoalieStats goalieStats = hockeyleagueFactory.createGoalieStats();
-		goalieStats.setYear("2004");//$NON-NLS-1$
-		goalieStats.setTeam(team);
-		goalieStats.setGamesPlayedIn(67);
-		goalieStats.setWins(39);
-		goalieStats.setLosses(20);
-		goalieStats.setTies(7);
-		goalieStats.setMinutesPlayedIn(3943);
-		goalieStats.setGoalsAgainst(142);
-		goalieStats.setSaves(1591);
-		goalieStats.setGoalsAgainstAverage(2.64F);
-		goalieStats.setShutouts(4);
-		goalieStats.setGoals(0);
-		goalieStats.setAssists(1);
-		goalieStats.setPoints(1);
-		goalieStats.setPenaltyMinutes(6);
-		goalieStats.setEmptyNetGoals(1);
-		goalie.getGoalieStats().add(goalieStats);
-
-		team.getGoalies().add(goalie);
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/util/HockeyleagueAdapterFactory.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/util/HockeyleagueAdapterFactory.java
deleted file mode 100644
index e847d94..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/util/HockeyleagueAdapterFactory.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.util;
-
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage
- * @generated
- */
-public class HockeyleagueAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static HockeyleaguePackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public HockeyleagueAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = HockeyleaguePackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected HockeyleagueSwitch modelSwitch =
-		new HockeyleagueSwitch() {
-			public Object caseArena(Arena object) {
-				return createArenaAdapter();
-			}
-			public Object caseDefence(Defence object) {
-				return createDefenceAdapter();
-			}
-			public Object caseForward(Forward object) {
-				return createForwardAdapter();
-			}
-			public Object caseGoalie(Goalie object) {
-				return createGoalieAdapter();
-			}
-			public Object caseGoalieStats(GoalieStats object) {
-				return createGoalieStatsAdapter();
-			}
-			public Object caseHockeyleagueObject(HockeyleagueObject object) {
-				return createHockeyleagueObjectAdapter();
-			}
-			public Object caseLeague(League object) {
-				return createLeagueAdapter();
-			}
-			public Object casePlayer(Player object) {
-				return createPlayerAdapter();
-			}
-			public Object casePlayerStats(PlayerStats object) {
-				return createPlayerStatsAdapter();
-			}
-			public Object caseTeam(Team object) {
-				return createTeamAdapter();
-			}
-			public Object defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena <em>Arena</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Arena
-	 * @generated
-	 */
-	public Adapter createArenaAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence <em>Defence</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Defence
-	 * @generated
-	 */
-	public Adapter createDefenceAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward <em>Forward</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Forward
-	 * @generated
-	 */
-	public Adapter createForwardAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie <em>Goalie</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Goalie
-	 * @generated
-	 */
-	public Adapter createGoalieAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats <em>Goalie Stats</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.GoalieStats
-	 * @generated
-	 */
-	public Adapter createGoalieStatsAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueObject <em>Object</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleagueObject
-	 * @generated
-	 */
-	public Adapter createHockeyleagueObjectAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League <em>League</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.League
-	 * @generated
-	 */
-	public Adapter createLeagueAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player <em>Player</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Player
-	 * @generated
-	 */
-	public Adapter createPlayerAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats <em>Player Stats</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.PlayerStats
-	 * @generated
-	 */
-	public Adapter createPlayerStatsAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team <em>Team</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.Team
-	 * @generated
-	 */
-	public Adapter createTeamAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //HockeyleagueAdapterFactory
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/util/HockeyleagueSwitch.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/util/HockeyleagueSwitch.java
deleted file mode 100644
index b47a3cf..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.hockeyleague/src/org/eclipse/ui/examples/views/properties/tabbed/hockeyleague/util/HockeyleagueSwitch.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.util;
-
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.ui.examples.views.properties.tabbed.hockeyleague.HockeyleaguePackage
- * @generated
- */
-public class HockeyleagueSwitch {
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static HockeyleaguePackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public HockeyleagueSwitch() {
-		if (modelPackage == null) {
-			modelPackage = HockeyleaguePackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-		else {
-			List eSuperTypes = theEClass.getESuperTypes();
-			return
-				eSuperTypes.isEmpty() ?
-					defaultCase(theEObject) :
-					doSwitch((EClass)eSuperTypes.get(0), theEObject);
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case HockeyleaguePackage.ARENA: {
-				Arena arena = (Arena)theEObject;
-				Object result = caseArena(arena);
-				if (result == null) result = caseHockeyleagueObject(arena);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case HockeyleaguePackage.DEFENCE: {
-				Defence defence = (Defence)theEObject;
-				Object result = caseDefence(defence);
-				if (result == null) result = casePlayer(defence);
-				if (result == null) result = caseHockeyleagueObject(defence);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case HockeyleaguePackage.FORWARD: {
-				Forward forward = (Forward)theEObject;
-				Object result = caseForward(forward);
-				if (result == null) result = casePlayer(forward);
-				if (result == null) result = caseHockeyleagueObject(forward);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case HockeyleaguePackage.GOALIE: {
-				Goalie goalie = (Goalie)theEObject;
-				Object result = caseGoalie(goalie);
-				if (result == null) result = casePlayer(goalie);
-				if (result == null) result = caseHockeyleagueObject(goalie);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case HockeyleaguePackage.GOALIE_STATS: {
-				GoalieStats goalieStats = (GoalieStats)theEObject;
-				Object result = caseGoalieStats(goalieStats);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case HockeyleaguePackage.HOCKEYLEAGUE_OBJECT: {
-				HockeyleagueObject hockeyleagueObject = (HockeyleagueObject)theEObject;
-				Object result = caseHockeyleagueObject(hockeyleagueObject);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case HockeyleaguePackage.LEAGUE: {
-				League league = (League)theEObject;
-				Object result = caseLeague(league);
-				if (result == null) result = caseHockeyleagueObject(league);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case HockeyleaguePackage.PLAYER: {
-				Player player = (Player)theEObject;
-				Object result = casePlayer(player);
-				if (result == null) result = caseHockeyleagueObject(player);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case HockeyleaguePackage.PLAYER_STATS: {
-				PlayerStats playerStats = (PlayerStats)theEObject;
-				Object result = casePlayerStats(playerStats);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case HockeyleaguePackage.TEAM: {
-				Team team = (Team)theEObject;
-				Object result = caseTeam(team);
-				if (result == null) result = caseHockeyleagueObject(team);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Arena</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Arena</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseArena(Arena object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Defence</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Defence</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDefence(Defence object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Forward</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Forward</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseForward(Forward object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Goalie</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Goalie</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseGoalie(Goalie object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Goalie Stats</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Goalie Stats</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseGoalieStats(GoalieStats object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Object</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Object</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseHockeyleagueObject(HockeyleagueObject object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>League</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>League</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseLeague(League object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Player</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Player</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePlayer(Player object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Player Stats</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Player Stats</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePlayerStats(PlayerStats object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Team</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Team</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTeam(Team object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-} //HockeyleagueSwitch
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.classpath b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.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/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.cvsignore b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.project b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.project
deleted file mode 100644
index 64e15f3..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.examples.views.properties.tabbed.logic</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 662a6cc..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,70 +0,0 @@
-#Mon Feb 06 11:18:30 EST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.settings/org.eclipse.jdt.ui.prefs b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 0b94798..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Mon Feb 06 11:18:33 EST 2006
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.2\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template></templates>
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.settings/org.eclipse.pde.prefs b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 5b8aef4..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,15 +0,0 @@
-#Tue Jan 31 19:06:57 EST 2006
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.illegal-att-value=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=1
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/META-INF/MANIFEST.MF b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/META-INF/MANIFEST.MF
deleted file mode 100644
index e8138af..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,15 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Logic Plug-in
-Bundle-SymbolicName: org.eclipse.ui.examples.views.properties.tabbed.logic;singleton:=true
-Bundle-Version: 3.2.0.qualifier
-Bundle-Activator: org.eclipse.ui.examples.views.properties.tabbed.logic.Activator
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.gef.examples.logic,
- org.eclipse.ui.views.properties.tabbed,
- org.eclipse.gef,
- org.eclipse.core.resources,
- org.eclipse.ui.ide
-Eclipse-LazyStart: true
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/about.html b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/about.html
deleted file mode 100644
index 4602330..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/build.properties b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/build.properties
deleted file mode 100644
index cb3487b..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               about.html,\
-               icons/,\
-               plugin.properties
-src.includes = about.html
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/icons/logic.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/icons/logic.gif
deleted file mode 100644
index ca05b78..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/icons/logic.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/icons/logicbanner.gif b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/icons/logicbanner.gif
deleted file mode 100644
index 6a4deba..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/icons/logicbanner.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/plugin.properties b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/plugin.properties
deleted file mode 100644
index d47c7bd..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/plugin.properties
+++ /dev/null
@@ -1,203 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Plugin.name = IBM Rational Common UI Properties Logic Example
-Plugin.providerName = IBM Rational
-
-Logic_example_graphical_editor_name = Logic Graphical Editor
-GEF_example_wizard_category_name = GEF (Graphical Editing Framework)
-Logic_example_wizard_name = Logic Diagram
-Logic_example_wizard_description=An example of a wizard that creates sample Logic file
-
-##############################################
-# PasteTemplateAction Class
-##############################################
-PasteAction.ActionToolTipText_UI_=Paste
-PasteAction.ActionLabelText_UI_=&Paste
-PasteAction.ActionDeleteCommandName_UI_=Paste
-
-##############################################
-# ZoomAction Class
-##############################################
-ZoomAction.ZoomIn.ActionToolTipText_UI_=Zoom In
-ZoomAction.ZoomIn.ActionLabelText_UI_=Zoom In
-ZoomAction.ZoomOut.ActionToolTipText_UI_=Zoom Out
-ZoomAction.ZoomOut.ActionLabelText_UI_=Zoom Out
-
-##############################################
-# View Menu
-##############################################
-ViewMenu.LabelText_UI_=&View
-
-##############################################
-# Property Source Cell Editor Validators
-##############################################
-CellEditorValidator.NotANumberMessage=Not a number
-
-##############################################
-# Palette Customizer
-##############################################
-PaletteCustomizer.InvalidCharMessage=Name contains invalid character: *
-
-##############################################
-# Model information
-##############################################
-Wire.LabelText=Wire
-LED.LabelText=LED
-LogicDiagram.LabelText=Logic Diagram
-Circuit.LabelText=Circuit
-AndGate.LabelText=And Gate
-OrGate.LabelText=Or Gate
-XORGate.LabelText=XOR Gate
-GroundOutput.LabelText=Ground
-LiveOutput.LabelText=Positive Voltage
-
-##############################################
-# PropertyDescriptors and PropertySources
-##############################################
-PropertyDescriptor.Label.Text=Text
-PropertyDescriptor.LogicSubPart.Size=Size
-PropertyDescriptor.LogicSubPart.Location=Location
-PropertyDescriptor.LED.Value=Value
-PropertyDescriptor.LogicDiagram.ConnectionRouter=Connection Router
-PropertyDescriptor.LogicDiagram.Manual=Manual
-PropertyDescriptor.LogicDiagram.Manhattan=Manhattan
-
-DimensionPropertySource.Property.Width.Label=Width
-DimensionPropertySource.Property.Height.Label=Height
-LocationPropertySource.Property.X.Label=X
-LocationPropertySource.Property.Y.Label=Y
-
-##############################################
-# Actions (IncrementDecrementAction)
-##############################################
-IncrementDecrementAction.Increment.ActionLabelText=Increment
-IncrementDecrementAction.Increment.ActionToolTipText=Increment LED
-IncrementDecrementAction.Decrement.ActionLabelText=Decrement
-IncrementDecrementAction.Decrement.ActionToolTipText=Decrement LED
-
-##############################################
-# Actions (AlignmentAction)
-##############################################
-AlignmentAction.AlignSubmenu.ActionLabelText=&Align
-
-##############################################
-# EditPolicies
-##############################################
-LogicXYLayoutEditPolicy.AddCommandLabelText=Reparenting LogicSubpart
-LogicXYLayoutEditPolicy.CreateCommandLabelText=Creating LogicSubpart
-LogicElementEditPolicy.OrphanCommandLabelText=Reparenting LogicSubpart
-IncrementDecrementCommand.LabelText=Logic Value Change
-LogicNullConstraintEditPolicy.OrphanCommandLabelText=Reparenting LogicSubpart
-LogicContainerEditPolicy.OrphanCommandLabelText=Orphan children
-
-##############################################
-# Wizard Page
-##############################################
-CreateLogicPage1.Title=Create Logic File
-CreateLogicPage1.Description=Create a new Logic file resource.
-CreateLogicPage1.ModelNames.GroupName=Logic Model Samples
-CreateLogicPage1.ModelNames.EmptyModelName=E&mpty Model
-CreateLogicPage1.ModelNames.HalfAdderModelName=Half-Adder Model
-CreateLogicPage1.ModelNames.FullAdderModelName=Full-Adder Model
-CreateLogicPage1.ModelNames.FourBitAdderModelName=F&our-bit Adder Model
-
-##############################################
-# LogicPlugin and Tools
-##############################################
-LogicPlugin.Category.ComplexParts.Label=Canned Parts
-LogicPlugin.Category.Components.Label=Components
-LogicPlugin.Category.ControlGroup.Label=Control Group
-LogicPlugin.Tool.CreationTool.LiveGroundStack.Label=Live & Ground Stack
-LogicPlugin.Tool.CreationTool.LiveGroundStack.Description=A stack containg the live output and ground parts
-LogicPlugin.Tool.CreationTool.LogicLabel=Label
-LogicPlugin.Tool.CreationTool.Label.Label=Label
-LogicPlugin.Tool.CreationTool.Label.Description=Creates labels (they support renaming, resizing, dragging, cut and paste, etc.)
-LogicPlugin.Tool.CreationTool.FlowContainer.Label=Flow Container
-LogicPlugin.Tool.CreationTool.FlowContainer.Description=Creates a container that can hold other circuit components
-LogicPlugin.Tool.CreationTool.HalfAdder.Label=HalfAdder
-LogicPlugin.Tool.CreationTool.HalfAdder.Description=Creates a circuit representing a half-adder
-LogicPlugin.Tool.CreationTool.FullAdder.Label=FullAdder
-LogicPlugin.Tool.CreationTool.FullAdder.Description=Creates a circuit representing a full-adder (uses two half-adders)
-LogicPlugin.Tool.CreationTool.LED.Label=LED
-LogicPlugin.Tool.CreationTool.LED.Description=Creates an LED which is used to read voltage input/output
-LogicPlugin.Tool.CreationTool.Circuit.Label=Circuit
-LogicPlugin.Tool.CreationTool.Circuit.Description=Create a circuit.  It can be connected to external circuits/parts, and can have an intricate design as well.
-LogicPlugin.Tool.CreationTool.ORGate.Label=Or Gate
-LogicPlugin.Tool.CreationTool.ORGate.Description=Create a gate that performs the logical OR operation
-LogicPlugin.Tool.CreationTool.XORGate.Label=XOR Gate
-LogicPlugin.Tool.CreationTool.XORGate.Description=Creates a gate that can perform the logical XOR operation
-LogicPlugin.Tool.CreationTool.ANDGate.Label=And Gate
-LogicPlugin.Tool.CreationTool.ANDGate.Description=Creates a gate that can perform the logical AND operation
-LogicPlugin.Tool.CreationTool.LiveOutput.Label=V+
-LogicPlugin.Tool.CreationTool.LiveOutput.Description=Creates a voltage positive node, which is an electrical equivalent of logical 'true'
-LogicPlugin.Tool.CreationTool.Ground.Label=Ground
-LogicPlugin.Tool.CreationTool.Ground.Description=Creates a ground node, which is an electrical equivalent of logical 'false'
-LogicPlugin.Tool.SelectionTool.SelectionTool.Label=Selection
-LogicPlugin.Tool.SelectionTool.SelectionTool.Description=Selection Tool can be used to select a figure in the editor.
-LogicPlugin.Tool.MarqueeSelectionTool.MarqueeSelectionTool.Label=Marquee
-LogicPlugin.Tool.MarqueeSelectionTool.MarqueeSelectionTool.Description=Marquee Selection Tool can be used to select multiple parts in the editor.
-LogicPlugin.Tool.ConnectionCreationTool.ConnectionCreationTool.Label=Connection
-LogicPlugin.Tool.ConnectionCreationTool.ConnectionCreationTool.Description=Connection tool can be used to connect the various circuit parts.
-
-##############################################
-# Commands
-##############################################
-AddChildCommand.Label=Add child to parent
-AddCommand.Label=Add command
-AddCommand.Description=Add
-
-ConnectionCommand.Label=wire connection
-ConnectionCommand.Description=Connection change
-
-CloneCommand.Label=Clone Object
-CloneCommand.Description=Clone
-
-CreateCommand.Label=Create Object
-CreateCommand.Description=Create
-
-OrphanChildCommand.Label=Orphan LogicSubpart
-
-ReorderPartCommand.Label=Reorder Subpart
-ReorderPartCommand.Description=Reorder
-
-SetLocationCommand.Description=Move Object
-SetLocationCommand.Label.Location=Move Object
-SetLocationCommand.Label.Resize=Resize Object
-SetMultipleLocationCommand.Description=Move Objects
-SetMultipleLocationCommand.Label.Location=Move Objects
-SetMultipleLocationCommand.Label.Resize=Resize Objects
-
-DeleteCommand.Label=Delete Object
-DeleteCommand.Description=Delete Object
-DeleteMultipleCommand.Label=Delete Objects
-DeleteMultipleCommand.Description=Delete Objects
-
-###############################################
-# Used by LogicEditor
-##############################################\
-GraphicalEditor.FILE_DELETED_TITLE_UI_ = File Deleted
-GraphicalEditor.FILE_DELETED_WITHOUT_SAVE_INFO_ = IWAG0001I The file has been deleted from the file system.  Do you want to save your changes or close the editor without saving?
-GraphicalEditor.SAVE_BUTTON_UI_ = Save
-GraphicalEditor.CLOSE_BUTTON_UI_ = Close
-
-###############################################
-# Exceptions
-###############################################
-LogicEditPart.CreateChild.Exception.Runtime_EXC_=This object has no children
-
-
-###############################################
-# Rulers and Guides
-###############################################
-CreateGuideCommand_Label=Create Guide
-DeleteGuideCommand_Label=Delete Guide
-MoveGuideCommand_Label=Move Guide
-
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/plugin.xml b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/plugin.xml
deleted file mode 100644
index 94d159f..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/plugin.xml
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-     <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            default="true"
-            name="Tabbed Properties View Example Logic Editor"
-            extensions="tabbedpropertieslogic"
-            icon="icons/logic.gif"
-            class="org.eclipse.ui.examples.views.properties.tabbed.logic.TabbedPropertiesLogicEditor"
-            contributorClass="org.eclipse.gef.examples.logicdesigner.actions.LogicActionBarContributor"
-            id="org.eclipse.ui.examples.views.properties.tabbed.logic.TabbedPropertiesLogicEditor">
-      </editor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.newWizards">
-      <category
-            name="Tabbed Properties View Examples"
-            parentCategory="org.eclipse.ui.Examples"
-            id="org.eclipse.ui.views.properties.tabbed">
-      </category>
-      <wizard
-            name="Tabbed Properties View Logic Example File"
-            icon="icons/logic.gif"
-            category="org.eclipse.ui.Examples/org.eclipse.ui.views.properties.tabbed"
-            class="org.eclipse.ui.examples.views.properties.tabbed.logic.LogicCreationWizard"
-            id="org.eclipse.ui.examples.views.properties.tabbed.logic.LogicCreationWizard">
-         <description>
-            Create a new Tabbed Properties View Logic Example file
-         </description>
-         <selection
-               class="org.eclipse.core.resources.IResource">
-         </selection>
-      </wizard>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-      <propertyContributor
-            typeMapper="org.eclipse.ui.examples.views.properties.tabbed.logic.properties.LogicElementTypeMapper"
-            contributorId="org.eclipse.ui.examples.views.properties.tabbed.logic.TabbedPropertiesLogicEditor"
-            labelProvider="org.eclipse.ui.examples.views.properties.tabbed.logic.properties.LogicElementLabelProvider">
-         <propertyCategory
-               category="element">
-         </propertyCategory>
-         <propertyCategory
-               category="other">
-         </propertyCategory>
-      </propertyContributor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
-      <propertyTabs
-            contributorId="org.eclipse.ui.examples.views.properties.tabbed.logic.TabbedPropertiesLogicEditor">
-         <propertyTab
-               label="Advanced"
-               category="other"
-               afterTab="logic.tab.Size"
-               id="logic.tab.Advanced">
-         </propertyTab>
-         <propertyTab
-               label="Location"
-               category="other"
-               id="logic.tab.Location">
-         </propertyTab>
-         <propertyTab
-               label="Size"
-               category="other"
-               afterTab="logic.tab.Location"
-               id="logic.tab.Size">
-         </propertyTab>
-         <propertyTab
-               label="Element"
-               category="element"
-               id="logic.tab.Element">
-         </propertyTab>
-      </propertyTabs>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertySections">
-      <propertySections
-            contributorId="org.eclipse.ui.examples.views.properties.tabbed.logic.TabbedPropertiesLogicEditor">
-         <propertySection
-               tab="logic.tab.Element"
-               class="org.eclipse.ui.examples.views.properties.tabbed.logic.properties.ValueSection"
-               afterSection="logic.section.Name"
-               id="logic.section.Value">
-            <input
-                  type="org.eclipse.gef.examples.logicdesigner.model.LED">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="logic.tab.Advanced"
-               class="org.eclipse.ui.views.properties.tabbed.AdvancedPropertySection"
-               id="logic.section.Advanced">
-            <input
-                  type="org.eclipse.gef.examples.logicdesigner.model.LogicElement">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="logic.tab.Element"
-               class="org.eclipse.ui.examples.views.properties.tabbed.logic.properties.NameSection"
-               id="logic.section.Name">
-            <input
-                  type="org.eclipse.gef.examples.logicdesigner.model.LogicElement">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="logic.tab.Location"
-               class="org.eclipse.ui.examples.views.properties.tabbed.logic.properties.LocationSection"
-               id="logic.section.Location">
-            <input
-                  type="org.eclipse.gef.examples.logicdesigner.model.LogicSubpart">
-            </input>
-         </propertySection>
-         <propertySection
-               tab="logic.tab.Size"
-               filter="org.eclipse.ui.examples.views.properties.tabbed.logic.properties.LogicElementSizeFilter"
-               class="org.eclipse.ui.examples.views.properties.tabbed.logic.properties.SizeSection"
-               id="logic.section.Size">
-            <input
-                  type="org.eclipse.gef.examples.logicdesigner.model.LogicSubpart">
-            </input>
-         </propertySection>
-      </propertySections>
-   </extension>
-
-</plugin>
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/Activator.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/Activator.java
deleted file mode 100644
index 74a5914..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/Activator.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.logic;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class Activator
-	extends AbstractUIPlugin {
-
-	// The shared instance.
-	private static Activator plugin;
-
-	/**
-	 * The constructor.
-	 */
-	public Activator() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context)
-		throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context)
-		throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 * 
-	 * @return the shared instance.
-	 */
-	public static Activator getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given plug-in
-	 * relative path.
-	 * 
-	 * @param path
-	 *            the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin(
-			"org.eclipse.ui.examples.views.properties.tabbed.logic", path);//$NON-NLS-1$
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/LogicCreationWizard.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/LogicCreationWizard.java
deleted file mode 100644
index cd13407..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/LogicCreationWizard.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.logic;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-public class LogicCreationWizard
-    extends Wizard
-    implements INewWizard {
-
-    private LogicWizardPage1 logicPage = null;
-
-    private IStructuredSelection selection;
-
-    private IWorkbench workbench;
-
-    public void addPages() {
-        logicPage = new LogicWizardPage1(workbench, selection);
-        addPage(logicPage);
-    }
-
-    public void init(IWorkbench aWorkbench,
-            IStructuredSelection currentSelection) {
-        workbench = aWorkbench;
-        selection = currentSelection;
-    }
-
-    public boolean performFinish() {
-        return logicPage.finish();
-    }
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/LogicWizardPage1.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/LogicWizardPage1.java
deleted file mode 100644
index 407d96f..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/LogicWizardPage1.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.logic;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.ObjectOutputStream;
-
-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.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
-import org.eclipse.ui.ide.IDE;
-
-import org.eclipse.gef.examples.logicdesigner.model.LogicDiagram;
-import org.eclipse.gef.examples.logicdesigner.model.LogicDiagramFactory;
-
-public class LogicWizardPage1
-    extends WizardNewFileCreationPage
-    implements SelectionListener {
-
-    private IWorkbench workbench;
-
-    private static int exampleCount = 1;
-
-    private Button model1 = null;
-
-    private Button model2 = null;
-
-    private int modelSelected = 1;
-
-    public LogicWizardPage1(IWorkbench aWorkbench,
-            IStructuredSelection selection) {
-        super("sampleLogicPage1", selection); //$NON-NLS-1$
-        this.setTitle("Tabbed Properties View Logic Example");//$NON-NLS-1$
-        this
-            .setDescription("Create a new Tabbed Properties View Logic Example file");//$NON-NLS-1$
-        this.setImageDescriptor(ImageDescriptor.createFromFile(getClass(),
-            "icons/logicbanner.gif")); //$NON-NLS-1$
-        this.workbench = aWorkbench;
-    }
-
-    public void createControl(Composite parent) {
-        super.createControl(parent);
-        this
-            .setFileName("emptyModel" + exampleCount + ".tabbedpropertieslogic"); //$NON-NLS-2$//$NON-NLS-1$
-
-        Composite composite = (Composite) getControl();
-
-        // sample section generation group
-        Group group = new Group(composite, SWT.NONE);
-        group.setLayout(new GridLayout());
-        group.setText("Logic Model Samples"); //$NON-NLS-1$
-        group.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
-            | GridData.HORIZONTAL_ALIGN_FILL));
-
-        // sample section generation checkboxes
-        model1 = new Button(group, SWT.RADIO);
-        model1.setText("E&mpty Model");//$NON-NLS-1$
-        model1.addSelectionListener(this);
-        model1.setSelection(true);
-
-        model2 = new Button(group, SWT.RADIO);
-        model2.setText("F&our-bit Adder Model");//$NON-NLS-1$
-        model2.addSelectionListener(this);
-
-        new Label(composite, SWT.NONE);
-
-        setPageComplete(validatePage());
-    }
-
-    protected InputStream getInitialContents() {
-        LogicDiagram ld = new LogicDiagram();
-        if (modelSelected == 2)
-            ld = (LogicDiagram) LogicDiagramFactory.createLargeModel();
-        ByteArrayInputStream bais = null;
-        try {
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            ObjectOutputStream oos = new ObjectOutputStream(baos);
-            oos.writeObject(ld);
-            oos.flush();
-            oos.close();
-            baos.close();
-            bais = new ByteArrayInputStream(baos.toByteArray());
-            bais.close();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return bais;
-    }
-
-    public boolean finish() {
-        IFile newFile = createNewFile();
-        if (newFile == null)
-            return false; // ie.- creation was unsuccessful
-
-        // Since the file resource was created fine, open it for editing
-        // iff requested by the user
-        try {
-            IWorkbenchWindow dwindow = workbench.getActiveWorkbenchWindow();
-            IWorkbenchPage page = dwindow.getActivePage();
-            if (page != null)
-                IDE.openEditor(page, newFile, true);
-        } catch (org.eclipse.ui.PartInitException e) {
-            e.printStackTrace();
-            return false;
-        }
-        exampleCount++;
-        return true;
-    }
-
-    /**
-     * @see org.eclipse.swt.events.SelectionListener#widgetSelected(SelectionEvent)
-     */
-    public void widgetSelected(SelectionEvent e) {
-        if (e.getSource() == model1) {
-            modelSelected = 1;
-            setFileName("emptyModel" + exampleCount + ".tabbedpropertieslogic"); //$NON-NLS-2$//$NON-NLS-1$
-        } else {
-            modelSelected = 2;
-            setFileName("fourBitAdder" + exampleCount + ".tabbedpropertieslogic"); //$NON-NLS-2$//$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Empty method
-     */
-    public void widgetDefaultSelected(SelectionEvent e) {
-        //
-    }
-
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/TabbedPropertiesLogicEditor.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/TabbedPropertiesLogicEditor.java
deleted file mode 100644
index a789382..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/TabbedPropertiesLogicEditor.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.logic;
-
-import org.eclipse.gef.examples.logicdesigner.LogicEditor;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-public class TabbedPropertiesLogicEditor
-    extends LogicEditor
-    implements ITabbedPropertySheetPageContributor {
-
-    private TabbedPropertySheetPage tabbedPropertySheetPage;
-
-    protected void initializeGraphicalViewer() {
-        super.initializeGraphicalViewer();
-        this.tabbedPropertySheetPage = new TabbedPropertySheetPage(this);
-    }
-
-    public String getContributorId() {
-        return getSite().getId();
-    }
-
-    public Object getAdapter(Class type) {
-        if (type == IPropertySheetPage.class)
-            return tabbedPropertySheetPage;
-        return super.getAdapter(type);
-    }
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/AbstractSection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/AbstractSection.java
deleted file mode 100644
index eb0b72b..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/AbstractSection.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.logic.properties;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.examples.logicdesigner.model.LogicElement;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-
-/**
- * Abstract class for a section in a tab in the properties view.
- * 
- * @author Anthony Hunter 
- */
-public abstract class AbstractSection
-	extends AbstractPropertySection implements PropertyChangeListener {
-
-	private LogicElement element;
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySection#setInput(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		Assert.isTrue(selection instanceof IStructuredSelection);
-		Object input = ((IStructuredSelection)selection).getFirstElement();
-		Assert.isTrue(input instanceof EditPart);
-		Object model = ((EditPart) input).getModel();
-		Assert.isTrue(model instanceof LogicElement);
-		this.element = (LogicElement) model;
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.view.ITabbedPropertySection#aboutToBeShown()
-	 */
-	public void aboutToBeShown() {
-		getElement().addPropertyChangeListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.view.ITabbedPropertySection#aboutToBeHidden()
-	 */
-	public void aboutToBeHidden() {
-		getElement().removePropertyChangeListener(this);
-	}
-
-	/**
-	 * Get the element.
-	 * @return the element.
-	 */
-	public LogicElement getElement() {
-		return element;
-	}
-
-	/**
-	 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent evt) {
-		refresh();
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/LocationSection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/LocationSection.java
deleted file mode 100644
index 3049fa2..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/LocationSection.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.logic.properties;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.examples.logicdesigner.model.LogicSubpart;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-
-/**
- * The location section on the location tab.
- * 
- * @author Anthony Hunter 
- */
-public class LocationSection extends AbstractSection {
-	private Text xText;
-	private Text yText;
-
-	/**
-	 * A helper to listen for events that indicate that a text
-	 * field has been changed.
-	 */
-	private TextChangeHelper listener = new TextChangeHelper() {
-		public void textChanged(Control control) {
-			Point point = new Point();
-			point.x = Integer.parseInt(xText.getText());
-			point.y = Integer.parseInt(yText.getText());
-			((LogicSubpart) getElement()).setLocation(point);
-		}
-	};
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		Composite composite =
-			getWidgetFactory().createFlatFormComposite(parent);
-		FormData data;
-
-		xText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
-		data = new FormData();
-		data.left = new FormAttachment(0, STANDARD_LABEL_WIDTH);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, 0);
-		xText.setLayoutData(data);
-
-		CLabel xLabel = getWidgetFactory().createCLabel(composite, "X:"); //$NON-NLS-1$
-		data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right =
-			new FormAttachment(xText, -ITabbedPropertyConstants.HSPACE);
-		data.top = new FormAttachment(xText, 0, SWT.CENTER);
-		xLabel.setLayoutData(data);
-
-		yText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
-		data = new FormData();
-		data.left = new FormAttachment(xText, 0, SWT.LEFT);
-		data.right = new FormAttachment(xText, 0, SWT.RIGHT);
-		data.top =
-			new FormAttachment(
-				xText,
-				ITabbedPropertyConstants.VSPACE,
-				SWT.BOTTOM);
-		yText.setLayoutData(data);
-
-		CLabel yLabel = getWidgetFactory().createCLabel(composite, "Y:"); //$NON-NLS-1$
-		data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right =
-			new FormAttachment(yText, -ITabbedPropertyConstants.HSPACE);
-		data.top = new FormAttachment(yText, 0, SWT.CENTER);
-		yLabel.setLayoutData(data);
-
-		listener.startListeningForEnter(xText);
-		listener.startListeningTo(xText);
-		listener.startListeningForEnter(yText);
-		listener.startListeningTo(yText);
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.view.ITabbedPropertySection#refresh()
-	 */
-	public void refresh() {
-		Assert.isTrue(getElement() instanceof LogicSubpart);
-		listener.startNonUserChange();
-		try {
-			Point point = ((LogicSubpart) getElement()).getLocation();
-			xText.setText(Integer.toString(point.x));
-			yText.setText(Integer.toString(point.y));
-		} finally {
-			listener.finishNonUserChange();
-		}
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/LogicElementLabelProvider.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/LogicElementLabelProvider.java
deleted file mode 100644
index 57ea088..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/LogicElementLabelProvider.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.logic.properties;
-
-import java.util.Iterator;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.examples.logicdesigner.model.Circuit;
-import org.eclipse.gef.examples.logicdesigner.model.LogicElement;
-import org.eclipse.gef.examples.logicdesigner.model.LogicSubpart;
-import org.eclipse.gef.examples.logicdesigner.model.Wire;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-/**
- * Label provider for the title bar for the tabbed property sheet page.
- * 
- * @author Anthony Hunter
- */
-public class LogicElementLabelProvider
-	extends LabelProvider {
-
-	private ITypeMapper typeMapper;
-
-	/**
-	 * constructor.
-	 */
-	public LogicElementLabelProvider() {
-		super();
-		typeMapper = new LogicElementTypeMapper();
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object objects) {
-		if (objects == null || objects.equals(StructuredSelection.EMPTY)) {
-			return null;
-		}
-		final boolean multiple[] = {false};
-		Object object = getObject(objects, multiple);
-		if (object == null) {
-			ImageDescriptor imageDescriptor = ImageDescriptor.createFromFile(
-				Circuit.class, "icons/comp.gif");//$NON-NLS-1$
-			return imageDescriptor.createImage();
-		} else {
-			if (!(object instanceof EditPart)) {
-				return null;
-			}
-			LogicElement element = (LogicElement) ((EditPart) object)
-				.getModel();
-			if (element instanceof Wire) {
-				ImageDescriptor imageDescriptor = ImageDescriptor
-					.createFromFile(Circuit.class, "icons/connection16.gif");//$NON-NLS-1$
-				return imageDescriptor.createImage();
-			}
-			return ((LogicSubpart) element).getIconImage();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object objects) {
-		if (objects == null || objects.equals(StructuredSelection.EMPTY)) {
-			return "No items selected";//$NON-NLS-1$
-		}
-		final boolean multiple[] = {false};
-		final Object object = getObject(objects, multiple);
-		if (object == null || ((IStructuredSelection) objects).size() > 1) {
-			return ((IStructuredSelection) objects).size() + " items selected";//$NON-NLS-1$
-		} else {
-			String name = typeMapper.mapType(object).getName();
-			return name.substring(name.lastIndexOf('.') + 1);
-		}
-	}
-
-	/**
-	 * Determine if a multiple object selection has been passed to the label
-	 * provider. If the objects is a IStructuredSelection, see if all the
-	 * objects in the selection are the same and if so, we want to provide
-	 * labels for the common selected element.
-	 * 
-	 * @param objects
-	 *            a single object or a IStructuredSelection.
-	 * @param multiple
-	 *            first element in the array is true if there is multiple
-	 *            unequal selected elements in a IStructuredSelection.
-	 * @return the object to get labels for.
-	 */
-	private Object getObject(Object objects, boolean multiple[]) {
-		Assert.isNotNull(objects);
-		Object object = null;
-		if (objects instanceof IStructuredSelection) {
-			IStructuredSelection selection = (IStructuredSelection) objects;
-			object = selection.getFirstElement();
-			if (selection.size() == 1) {
-				// one element selected
-				multiple[0] = false;
-				return object;
-			}
-			// multiple elements selected
-			multiple[0] = true;
-			Class firstClass = typeMapper.mapType(object);
-			// determine if all the objects in the selection are the same type
-			if (selection.size() > 1) {
-				for (Iterator i = selection.iterator(); i.hasNext();) {
-					Object next = i.next();
-					Class nextClass = typeMapper.mapType(next);
-					if (!nextClass.equals(firstClass)) {
-						// two elements not equal == multiple selected unequal
-						multiple[0] = false;
-						object = null;
-						break;
-					}
-				}
-			}
-		} else {
-			multiple[0] = false;
-			object = objects;
-		}
-		return object;
-	}
-
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/LogicElementSizeFilter.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/LogicElementSizeFilter.java
deleted file mode 100644
index 92390c6..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/LogicElementSizeFilter.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.logic.properties;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.examples.logicdesigner.model.LogicElement;
-import org.eclipse.gef.examples.logicdesigner.model.LogicSubpart;
-import org.eclipse.jface.viewers.IFilter;
-
-/**
- * Filter for the size section, do not display when the size cannot be modified.
- * 
- * @author Anthony Hunter
- */
-public class LogicElementSizeFilter
-	implements IFilter {
-
-	/**
-	 * @inheritDoc
-	 */
-	public boolean select(Object object) {
-		if (object instanceof EditPart) {
-			LogicElement element = (LogicElement) ((EditPart) object)
-				.getModel();
-			if (element instanceof LogicSubpart) {
-				Dimension dimension = ((LogicSubpart) element).getSize();
-				if (dimension.width != -1 && dimension.height != -1) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/LogicElementTypeMapper.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/LogicElementTypeMapper.java
deleted file mode 100644
index 5e2edcf..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/LogicElementTypeMapper.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.logic.properties;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-/**
- * Type mapper for the logic example. We want to get the GEF model
- * object from the selected element in the outline view and the diagram.
- * We can then filter on the model object type.
- * 
- * @author Anthony Hunter 
- */
-public class LogicElementTypeMapper
-	implements ITypeMapper {
-
-	/**
-	 * @inheritDoc 
-	 */
-	public Class mapType(Object object) {
-		Class type = object.getClass();
-		if (object instanceof EditPart) {
-			type = ((EditPart) object).getModel().getClass();
-		}
-		return type;
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/NameSection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/NameSection.java
deleted file mode 100644
index 8942956..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/NameSection.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.logic.properties;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * The name section on the element tab.
- * 
- * @author Anthony Hunter
- */
-public class NameSection
-	extends AbstractSection {
-
-	Text nameText;
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		Composite composite = getWidgetFactory()
-			.createFlatFormComposite(parent);
-		FormData data;
-
-		nameText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
-		nameText.setEditable(false);
-		data = new FormData();
-		data.left = new FormAttachment(0, STANDARD_LABEL_WIDTH);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, 0);
-		nameText.setLayoutData(data);
-
-		CLabel nameLabel = getWidgetFactory().createCLabel(composite, "Name:"); //$NON-NLS-1$
-		data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(nameText,
-			-ITabbedPropertyConstants.HSPACE);
-		data.top = new FormAttachment(nameText, 0, SWT.CENTER);
-		nameLabel.setLayoutData(data);
-	}
-
-	/*
-	 * @see org.eclipse.ui.views.properties.tabbed.view.ITabbedPropertySection#refresh()
-	 */
-	public void refresh() {
-		nameText.setText((getElement()).toString());
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/SizeSection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/SizeSection.java
deleted file mode 100644
index 6dd109a..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/SizeSection.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.logic.properties;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.gef.examples.logicdesigner.model.LogicSubpart;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * The size section on the size tab. TODO: Properties View for Aurora (Anthony
- * Hunter)
- * 
- * @author Anthony Hunter
- */
-public class SizeSection
-	extends AbstractSection {
-
-	Text widthText;
-
-	Text heightText;
-
-	/**
-	 * A helper to listen for events that indicate that a text field has been
-	 * changed.
-	 */
-	private TextChangeHelper listener = new TextChangeHelper() {
-
-		public void textChanged(Control control) {
-			Dimension dimension = new Dimension();
-			dimension.width = Integer.parseInt(widthText.getText());
-			dimension.height = Integer.parseInt(heightText.getText());
-			((LogicSubpart) getElement()).setSize(dimension);
-		}
-	};
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		Composite composite = getWidgetFactory()
-			.createFlatFormComposite(parent);
-		FormData data;
-
-		widthText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
-		data = new FormData();
-		data.left = new FormAttachment(0, STANDARD_LABEL_WIDTH);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, 0);
-		widthText.setLayoutData(data);
-
-		CLabel widthLabel = getWidgetFactory()
-			.createCLabel(composite, "Width:"); //$NON-NLS-1$
-		data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(widthText,
-			-ITabbedPropertyConstants.HSPACE);
-		data.top = new FormAttachment(widthText, 0, SWT.CENTER);
-		widthLabel.setLayoutData(data);
-
-		heightText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
-		data = new FormData();
-		data.left = new FormAttachment(widthText, 0, SWT.LEFT);
-		data.right = new FormAttachment(widthText, 0, SWT.RIGHT);
-		data.top = new FormAttachment(widthText,
-			ITabbedPropertyConstants.VSPACE, SWT.BOTTOM);
-		heightText.setLayoutData(data);
-
-		CLabel heightLabel = getWidgetFactory().createCLabel(composite,
-			"Height:"); //$NON-NLS-1$
-		data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(heightText,
-			-ITabbedPropertyConstants.HSPACE);
-		data.top = new FormAttachment(heightText, 0, SWT.CENTER);
-		heightLabel.setLayoutData(data);
-
-		listener.startListeningForEnter(heightText);
-		listener.startListeningTo(heightText);
-		listener.startListeningForEnter(widthText);
-		listener.startListeningTo(widthText);
-	}
-
-	/*
-	 * @see org.eclipse.ui.views.properties.tabbed.view.ITabbedPropertySection#refresh()
-	 */
-	public void refresh() {
-		Assert.isTrue(getElement() instanceof LogicSubpart);
-		listener.startNonUserChange();
-		try {
-			Dimension dimension = ((LogicSubpart) getElement()).getSize();
-			widthText.setText(Integer.toString(dimension.width));
-			heightText.setText(Integer.toString(dimension.height));
-		} finally {
-			listener.finishNonUserChange();
-		}
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/TextChangeHelper.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/TextChangeHelper.java
deleted file mode 100644
index c9a566a..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/TextChangeHelper.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.logic.properties;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * TextChangeHelper notifies the listner of text lifecycle events 
- * on behalf of the widget(s) it listens to. 
- * 
- * @author Anthony Hunter
- */
-public abstract class TextChangeHelper implements Listener {
-	
-	private boolean nonUserChange;
-
-	/**
-	 * Marks the start of a programmatic change to the widget contents.
-	 * Clients must call startNonUserChange() before directly setting 
-	 * the widget contents to avoid unwanted lifecycle events.
-	 * @throws IllegalArgumentException if a programmatic change is 
-	 * already in progress.
-	 */
-	public void startNonUserChange() {
-		if (nonUserChange)
-			throw new IllegalStateException("we already started a non user change");//$NON-NLS-1$
-		nonUserChange = true;
-	}
-
-	/**
-	 * Clients who call startNonUserChange() should call 
-	 * finishNonUserChange() as soon as possible after the change is done.
-	 * @throws IllegalArgumentException if no change is in progress.
-	 */
-	public void finishNonUserChange() {
-		if (!nonUserChange)
-			throw new IllegalStateException("we are not in a non user change");//$NON-NLS-1$
-		nonUserChange = false;
-	}
-
-	/**
-	 * Returns true if a programmatic change is in progress.
-	 */
-	public boolean isNonUserChange() {
-		return nonUserChange;
-	}
-
-	/**
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void handleEvent(Event event) {
-		switch (event.type) {
-			case SWT.KeyDown :
-				if (event.character == SWT.CR)
-					textChanged((Control)event.widget);
-				break;
-			case SWT.FocusOut :
-				textChanged((Control)event.widget);
-				break;
-		}
-	}
-
-	/**
-	 * Abstract method notified when a text field has been changed.
-	 * @param control
-	 */
-	public abstract void textChanged(Control control);
-
-	/**
-	 * Registers this helper with the given control to listen for events
-	 * which indicate that a change is in progress (or done).
-	 */
-	public void startListeningTo(Control control) {
-		control.addListener(SWT.FocusOut, this);
-		control.addListener(SWT.Modify, this);
-	}
-
-	/**
-	 * Registers this helper with the given control to listen for the
-	 * Enter key.  When Enter is pressed, the change is considered done 
-	 * (this is only appropriate for single-line Text widgets).
-	 */
-	public void startListeningForEnter(Control control) {
-		// NOTE: KeyDown rather than KeyUp, because of similar usage in CCombo. 
-		control.addListener(SWT.KeyDown, this);
-	}
-
-	/**
-	 * Unregisters this helper from a control previously passed to
-	 * startListeningTo() and/or startListeningForEnter().
-	 */
-	public void stopListeningTo(Control control) {
-		control.removeListener(SWT.FocusOut, this);
-		control.removeListener(SWT.Modify, this);
-		control.removeListener(SWT.KeyDown, this);
-	}
-}
diff --git a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/ValueSection.java b/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/ValueSection.java
deleted file mode 100644
index 0195d44..0000000
--- a/examples/org.eclipse.ui.examples.views.properties.tabbed.logic/src/org/eclipse/ui/examples/views/properties/tabbed/logic/properties/ValueSection.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.examples.views.properties.tabbed.logic.properties;
-
-import org.eclipse.gef.examples.logicdesigner.model.LED;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * The value section on the element tab.
- * 
- * @author Anthony Hunter
- */
-public class ValueSection extends AbstractSection {
-
-	Text valueText;
-
-	/**
-	 * A helper to listen for events that indicate that a text
-	 * field has been changed.
-	 */
-	private TextChangeHelper listener = new TextChangeHelper() {
-		public void textChanged(Control control) {
-			((LED) getElement()).setValue(
-				Integer.parseInt(valueText.getText()));
-		}
-	};
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(
-		Composite parent,
-		TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		
-		Composite composite =
-			getWidgetFactory().createFlatFormComposite(parent);
-		FormData data;
-
-		valueText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
-		data = new FormData();
-		data.left = new FormAttachment(0, STANDARD_LABEL_WIDTH);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, 0);
-		valueText.setLayoutData(data);
-
-		CLabel valueLabel = getWidgetFactory().createCLabel(composite, "Value:"); //$NON-NLS-1$
-		data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right =
-			new FormAttachment(valueText, -ITabbedPropertyConstants.HSPACE);
-		data.top = new FormAttachment(valueText, 0, SWT.CENTER);
-		valueLabel.setLayoutData(data);
-
-		listener.startListeningForEnter(valueText);
-		listener.startListeningTo(valueText);
-	}
-
-	/*
-	 * @see org.eclipse.ui.views.properties.tabbed.view.ITabbedPropertySection#refresh()
-	 */
-	public void refresh() {
-		Assert.isTrue(getElement() instanceof LED);
-		listener.startNonUserChange();
-		try {
-			valueText.setText(
-				Integer.toString(((LED) getElement()).getValue()));
-		} finally {
-			listener.finishNonUserChange();
-		}
-	}
-}
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.forms.examples/.classpath b/examples/org.eclipse.ui.forms.examples/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/examples/org.eclipse.ui.forms.examples/.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/examples/org.eclipse.ui.forms.examples/.cvsignore b/examples/org.eclipse.ui.forms.examples/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/examples/org.eclipse.ui.forms.examples/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/examples/org.eclipse.ui.forms.examples/.project b/examples/org.eclipse.ui.forms.examples/.project
deleted file mode 100644
index 0039091..0000000
--- a/examples/org.eclipse.ui.forms.examples/.project
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.forms.examples</name>
-	<comment></comment>
-	<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/examples/org.eclipse.ui.forms.examples/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.ui.forms.examples/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 5709915..0000000
--- a/examples/org.eclipse.ui.forms.examples/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,48 +0,0 @@
-#Mon May 16 16:39:49 EDT 2005
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
diff --git a/examples/org.eclipse.ui.forms.examples/.settings/org.eclipse.jdt.ui.prefs b/examples/org.eclipse.ui.forms.examples/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 817d509..0000000
--- a/examples/org.eclipse.ui.forms.examples/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon May 16 16:39:49 EDT 2005
-eclipse.preferences.version=1
-internal.default.compliance=default
diff --git a/examples/org.eclipse.ui.forms.examples/.settings/org.eclipse.pde.prefs b/examples/org.eclipse.ui.forms.examples/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index b4438da..0000000
--- a/examples/org.eclipse.ui.forms.examples/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,12 +0,0 @@
-#Mon May 16 16:39:49 EDT 2005
-compilers.p.deprecated=1
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=0
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=0
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/examples/org.eclipse.ui.forms.examples/about.html b/examples/org.eclipse.ui.forms.examples/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/examples/org.eclipse.ui.forms.examples/about.html
+++ /dev/null
@@ -1,22 +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>February 24, 2005</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.forms.examples/build.properties b/examples/org.eclipse.ui.forms.examples/build.properties
deleted file mode 100644
index ce0f7dd..0000000
--- a/examples/org.eclipse.ui.forms.examples/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.examples.jar = src/
-bin.includes = plugin.xml,\
-               *.jar,\
-               examples.jar,\
-               icons/,\
-               about.html
-output.examples.jar = bin/
diff --git a/examples/org.eclipse.ui.forms.examples/icons/clear.gif b/examples/org.eclipse.ui.forms.examples/icons/clear.gif
deleted file mode 100644
index 6bc10f9..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/clear.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/close_view.gif b/examples/org.eclipse.ui.forms.examples/icons/close_view.gif
deleted file mode 100644
index 1aca259..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/close_view.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/container_obj.gif b/examples/org.eclipse.ui.forms.examples/icons/container_obj.gif
deleted file mode 100644
index f32c28d..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/container_obj.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/e_search_menu.gif b/examples/org.eclipse.ui.forms.examples/icons/e_search_menu.gif
deleted file mode 100644
index f0f5d83..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/e_search_menu.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/file_obj.gif b/examples/org.eclipse.ui.forms.examples/icons/file_obj.gif
deleted file mode 100644
index 6b86d07..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/file_obj.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/form_banner.gif b/examples/org.eclipse.ui.forms.examples/icons/form_banner.gif
deleted file mode 100644
index aebc0b2..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/form_banner.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/help.gif b/examples/org.eclipse.ui.forms.examples/icons/help.gif
deleted file mode 100644
index 9d70301..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/help.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/help_topic.gif b/examples/org.eclipse.ui.forms.examples/icons/help_topic.gif
deleted file mode 100644
index 9bdd516..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/help_topic.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/large_image.gif b/examples/org.eclipse.ui.forms.examples/icons/large_image.gif
deleted file mode 100644
index c5c94ee..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/large_image.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/linkto_help.gif b/examples/org.eclipse.ui.forms.examples/icons/linkto_help.gif
deleted file mode 100644
index 86550fe..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/linkto_help.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/newprj_wiz.gif b/examples/org.eclipse.ui.forms.examples/icons/newprj_wiz.gif
deleted file mode 100644
index dc7d3a7..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/newprj_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/nw.gif b/examples/org.eclipse.ui.forms.examples/icons/nw.gif
deleted file mode 100644
index d0952a8..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/nw.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/progress.gif b/examples/org.eclipse.ui.forms.examples/icons/progress.gif
deleted file mode 100644
index f6a200f..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/progress.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/sample.gif b/examples/org.eclipse.ui.forms.examples/icons/sample.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/sample.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/th_horizontal.gif b/examples/org.eclipse.ui.forms.examples/icons/th_horizontal.gif
deleted file mode 100644
index f4c14a4..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/th_horizontal.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/th_vertical.gif b/examples/org.eclipse.ui.forms.examples/icons/th_vertical.gif
deleted file mode 100644
index f685839..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/th_vertical.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/toc_closed.gif b/examples/org.eclipse.ui.forms.examples/icons/toc_closed.gif
deleted file mode 100644
index 504acb2..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/toc_closed.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/toc_open.gif b/examples/org.eclipse.ui.forms.examples/icons/toc_open.gif
deleted file mode 100644
index 9e665d5..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/toc_open.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/icons/topic_small.gif b/examples/org.eclipse.ui.forms.examples/icons/topic_small.gif
deleted file mode 100644
index 17d8b2e..0000000
--- a/examples/org.eclipse.ui.forms.examples/icons/topic_small.gif
+++ /dev/null
Binary files differ
diff --git a/examples/org.eclipse.ui.forms.examples/plugin.properties b/examples/org.eclipse.ui.forms.examples/plugin.properties
deleted file mode 100644
index 94ed361..0000000
--- a/examples/org.eclipse.ui.forms.examples/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName = Examples of Eclipse Forms
-baseEditor = Simple Form (RCP) Editor
-singleHeaderEditor = Single Header Editor
diff --git a/examples/org.eclipse.ui.forms.examples/plugin.xml b/examples/org.eclipse.ui.forms.examples/plugin.xml
deleted file mode 100644
index c8eb601..0000000
--- a/examples/org.eclipse.ui.forms.examples/plugin.xml
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.ui.forms.examples"
-   name="%pluginName"
-   version="3.1.0"
-   provider-name="Eclipse.org"
-   class="org.eclipse.ui.forms.examples.internal.ExamplesPlugin">
-
-   <runtime>
-      <library name="examples.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.ui.forms"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.ui.ide"/>
-   </requires>
-   <extension
-         point="org.eclipse.ui.commands">
-      <category
-            id="org.eclipse.ui.forms.examples.category"
-            name="Eclipse Forms Examples">
-      </category>
-      <command
-            categoryId="org.eclipse.ui.forms.examples.category"
-            defaultHandler="org.eclipse.ui.forms.examples.internal.rcp.OpenSimpleFormEditorAction"
-            id="org.eclipse.ui.forms.examples.simple"
-            name="Simple Form Editor">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.forms.examples.category"
-            defaultHandler="org.eclipse.ui.forms.examples.internal.rcp.OpenSingleHeaderEditorAction"
-            id="org.eclipse.ui.forms.examples.singleHeader"
-            name="Single Header Editor">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.forms.examples.category"
-            defaultHandler="org.eclipse.ui.forms.examples.internal.dialogs.OpenFormDialog"
-            id="org.eclipse.ui.forms.examples.openDialog"
-            name="Open Form Dialog...">
-      </command>
-   </extension>
-
-
-   <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            name="%baseEditor"
-            default="true"
-            icon="icons/file_obj.gif"
-            class="org.eclipse.ui.forms.examples.internal.rcp.SimpleFormEditor"
-            id="org.eclipse.ui.forms.examples.base-editor">
-      </editor>
-      <editor
-            name="%singleHeaderEditor"
-            default="true"
-            icon="icons/file_obj.gif"
-            class="org.eclipse.ui.forms.examples.internal.rcp.SingleHeaderEditor"
-            id="org.eclipse.ui.forms.examples.single-header-editor">
-      </editor>      
-   </extension>
-   <extension
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.main.menu">
-         <menu
-               label="Form Editors">
-            <command
-                  commandId="org.eclipse.ui.forms.examples.simple"
-                  style="push">
-            </command>
-            <command
-                  commandId="org.eclipse.ui.forms.examples.singleHeader"
-                  style="push">
-            </command>
-            <command
-                  commandId="org.eclipse.ui.forms.examples.openDialog"
-                  style="push">
-            </command>
-         </menu>
-      </menuContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectiveExtensions">
-      <perspectiveExtension
-            targetID="org.eclipse.ui.resourcePerspective">
-         <view
-               ratio="0.5"
-               relative="org.eclipse.ui.views.TaskList"
-               relationship="right"
-               id="org.eclipse.ui.forms.examples.views.FormView">
-         </view>
-      </perspectiveExtension>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            name="Eclipse Forms Examples"
-            id="org.eclipse.ui.forms.examples">
-      </category>
-      <view
-            name="Eclipse Form"
-            icon="icons/sample.gif"
-            category="org.eclipse.ui.forms.examples"
-            class="org.eclipse.ui.forms.examples.views.FormView"
-            id="org.eclipse.ui.forms.examples.views.FormView">
-      </view>
-   </extension>
-</plugin>
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/ExamplesPlugin.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/ExamplesPlugin.java
deleted file mode 100644
index 269726d..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/ExamplesPlugin.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal;
-import java.net.URL;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.forms.FormColors;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-/**
- * The main plugin class to be used in the desktop.
- */
-public class ExamplesPlugin extends AbstractUIPlugin {
-	//The shared instance.
-	private static ExamplesPlugin plugin;
-	//Resource bundle.
-	private ResourceBundle resourceBundle;
-	private FormColors formColors;
-	public static final String IMG_FORM_BG = "formBg";
-	public static final String IMG_LARGE = "large";
-	public static final String IMG_HORIZONTAL = "horizontal";
-	public static final String IMG_VERTICAL = "vertical";
-	public static final String IMG_SAMPLE = "sample";
-	public static final String IMG_WIZBAN = "wizban";
-	public static final String IMG_LINKTO_HELP = "linkto_help";
-	public static final String IMG_HELP_TOPIC = "help_topic";
-	public static final String IMG_CLOSE = "close";
-	public static final String IMG_HELP_CONTAINER = "container_obj";
-	public static final String IMG_HELP_TOC_OPEN = "toc_open";
-	public static final String IMG_HELP_TOC_CLOSED = "toc_closed";
-	public static final String IMG_HELP_SEARCH = "e_search_menu";
-	public static final String IMG_CLEAR = "clear";
-	public static final String IMG_NW = "nw";
-
-	/**
-	 * The constructor.
-	 */
-	public ExamplesPlugin() {
-		plugin = this;
-		try {
-			resourceBundle = ResourceBundle
-					.getBundle("org.eclipse.ui.forms.examples.internal.ExamplesPluginResources");
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-	}
-
-	protected void initializeImageRegistry(ImageRegistry registry) {
-		registerImage(registry, IMG_FORM_BG, "form_banner.gif");
-		registerImage(registry, IMG_LARGE, "large_image.gif");
-		registerImage(registry, IMG_HORIZONTAL, "th_horizontal.gif");
-		registerImage(registry, IMG_VERTICAL, "th_vertical.gif");
-		registerImage(registry, IMG_SAMPLE, "sample.gif");
-		registerImage(registry, IMG_WIZBAN, "newprj_wiz.gif");
-		registerImage(registry, IMG_LINKTO_HELP, "linkto_help.gif");
-		registerImage(registry, IMG_HELP_TOPIC, "topic.gif");
-		registerImage(registry, IMG_HELP_CONTAINER, "container_obj.gif");
-		registerImage(registry, IMG_HELP_TOC_CLOSED, "toc_closed.gif");
-		registerImage(registry, IMG_HELP_TOC_OPEN, "toc_open.gif");
-		registerImage(registry, IMG_CLOSE, "close_view.gif");
-		registerImage(registry, IMG_HELP_SEARCH, "e_search_menu.gif");
-		registerImage(registry, IMG_CLEAR, "clear.gif");
-		registerImage(registry, IMG_NW, "nw.gif");
-	}
-
-	private void registerImage(ImageRegistry registry, String key,
-			String fileName) {
-		try {
-			IPath path = new Path("icons/" + fileName);
-			URL url = FileLocator.find(getBundle(), path, null);
-			if (url!=null) {
-				ImageDescriptor desc = ImageDescriptor.createFromURL(url);
-				registry.put(key, desc);
-			}
-		} catch (Exception e) {
-		}
-	}
-
-	public FormColors getFormColors(Display display) {
-		if (formColors == null) {
-			formColors = new FormColors(display);
-			formColors.markShared();
-		}
-		return formColors;
-	}
-	/**
-	 * Returns the shared instance.
-	 */
-	public static ExamplesPlugin getDefault() {
-		return plugin;
-	}
-	/**
-	 * Returns the workspace instance.
-	 */
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-	/**
-	 * Returns the string from the plugin's resource bundle, or 'key' if not
-	 * found.
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = ExamplesPlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null ? bundle.getString(key) : key);
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-	public void stop(BundleContext context) throws Exception {
-		try {
-			if (formColors != null) {
-				formColors.dispose();
-				formColors = null;
-			}
-		} finally {
-			super.stop(context);
-		}
-	}
-	public Image getImage(String key) {
-		return getImageRegistry().get(key);
-	}
-	public ImageDescriptor getImageDescriptor(String key) {
-		return getImageRegistry().getDescriptor(key);
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/ExamplesPluginResources.properties b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/ExamplesPluginResources.properties
deleted file mode 100644
index 339810c..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/ExamplesPluginResources.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2004 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/FormEditorInput.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/FormEditorInput.java
deleted file mode 100644
index 5d7dbc5..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/FormEditorInput.java
+++ /dev/null
@@ -1,69 +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 Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.*;
-
-public class FormEditorInput implements IEditorInput {
-	private String name;
-	public FormEditorInput(String name) {
-		this.name = name;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IEditorInput#exists()
-	 */
-	public boolean exists() {
-		return true;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
-				ISharedImages.IMG_OBJ_ELEMENT);
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IEditorInput#getName()
-	 */
-	public String getName() {
-		return name;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IEditorInput#getPersistable()
-	 */
-	public IPersistableElement getPersistable() {
-		return null;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IEditorInput#getToolTipText()
-	 */
-	public String getToolTipText() {
-		return getName();
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/OpenFormEditorAction.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/OpenFormEditorAction.java
deleted file mode 100644
index 02cd146..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/OpenFormEditorAction.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-
-public abstract class OpenFormEditorAction extends AbstractHandler {
-
-	protected Object openEditor(String inputName, String editorId, IWorkbenchWindow window) {
-		return openEditor(new FormEditorInput(inputName), editorId, window);
-	}
-	
-	protected Object openEditor(IEditorInput input, String editorId, IWorkbenchWindow window) {
-		IWorkbenchPage page = window.getActivePage();
-		try {
-			page.openEditor(input, editorId);
-		} catch (PartInitException e) {
-			System.out.println(e);
-		}
-		return null;
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/dialogs/OpenFormDialog.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/dialogs/OpenFormDialog.java
deleted file mode 100644
index 5b3df3d..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/dialogs/OpenFormDialog.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.dialogs;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-public class OpenFormDialog extends AbstractHandler {
-
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
-		SampleFormDialog dialog = new SampleFormDialog(window.getShell());
-		dialog.create();
-		dialog.getShell().setText("Sample Form Dialog");
-		dialog.getShell().setSize(500,500);
-		dialog.getShell().setLocation(100, 300);
-		dialog.open();
-		return null;
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/dialogs/SampleFormDialog.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/dialogs/SampleFormDialog.java
deleted file mode 100644
index 5ff3c25..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/dialogs/SampleFormDialog.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.forms.examples.internal.dialogs;
-
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.FormDialog;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.examples.internal.rcp.FreeFormPage;
-
-public class SampleFormDialog extends FormDialog {
-
-	public SampleFormDialog(Shell shell) {
-		super(shell);
-	}
-
-	public SampleFormDialog(IShellProvider parentShell) {
-		super(parentShell);
-	}
-
-	protected void createFormContent(IManagedForm mform) {
-		mform.getForm().setText("An example of a simple form dialog");
-		FreeFormPage.createSharedFormContent(mform);
-		mform.getForm().setBackgroundImage(null);
-		mform.getToolkit().decorateFormHeading(mform.getForm().getForm());
-		mform.getForm().setImage(
-				PlatformUI.getWorkbench().getSharedImages().getImage(
-						ISharedImages.IMG_OBJ_ELEMENT));
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ErrorMessagesPage.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ErrorMessagesPage.java
deleted file mode 100644
index 5b6a15d..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ErrorMessagesPage.java
+++ /dev/null
@@ -1,370 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-import org.eclipse.jface.dialogs.IMessageProvider;
-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.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FillLayout;
-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.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.HyperlinkSettings;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.IMessage;
-import org.eclipse.ui.forms.IMessageManager;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.Form;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-/**
- * This page shows how to use the message manager to handle errors in a form
- * page.
- * 
- * @since 3.3
- */
-public class ErrorMessagesPage extends FormPage {
-
-	/*
-	private RichMessageToolTipManager richToolTipMessageManager;
-	class RichToolTip extends ToolTip {
-		private IManagedForm mform;
-		private FormText text;
-		private String content;
-
-		public RichToolTip(IManagedForm mform, Control control) {
-			super(control);
-			this.mform = mform;
-			setShift(new Point(10, 10));
-		}
-
-		protected Composite createToolTipContentArea(Event event,
-				Composite parent) {
-			this.text = mform.getToolkit().createFormText(parent, true);
-			configureFormText(mform.getForm().getForm(), text);
-			update();
-			return text;
-		}
-
-		public void update(String content) {
-			if (content == null) {
-				// hide
-				deactivate();
-			} else {
-				activate();
-				this.content = content;
-				update();
-			}
-		}
-
-		private void update() {
-			if (text != null && text.isDisposed())
-				text = null;
-			if (text != null) {
-				if (content != null)
-					text.setText(content, true, false);
-				else
-					text.setText("", false, false);
-			}
-		}
-	}
-
-	class RichMessageToolTipManager implements IMessageToolTipManager {
-		private ArrayList toolTips = new ArrayList();
-		private IManagedForm mform;
-
-		public RichMessageToolTipManager(IManagedForm mform) {
-			this.mform = mform;
-		}
-
-		public void createToolTip(Control control, boolean imageLabel) {
-			ToolTip toolTip = new RichToolTip(mform, control);
-			toolTips.add(toolTip);
-		}
-
-		public void setActive(boolean active) {
-			for (int i = 0; i < toolTips.size(); i++) {
-				RichToolTip toolTip = (RichToolTip) toolTips.get(i);
-				if (active)
-					toolTip.activate();
-				else
-					toolTip.deactivate();
-			}
-		}
-
-		public void update() {
-			IMessage[] messages = mform.getForm().getForm()
-					.getChildrenMessages();
-			String content = mform.getForm().getMessage() == null ? null
-					: createFormTextContent(messages);
-			for (int i = 0; i < toolTips.size(); i++) {
-				RichToolTip toolTip = (RichToolTip) toolTips.get(i);
-				toolTip.update(content);
-			}
-		}
-	}
-	
-	*/
-
-	/**
-	 * @param id
-	 * @param title
-	 */
-	public ErrorMessagesPage(FormEditor editor) {
-		super(editor, "messageManager", "Message Manager");
-	}
-
-	protected void createFormContent(final IManagedForm managedForm) {
-		final ScrolledForm form = managedForm.getForm();
-		final FormToolkit toolkit = managedForm.getToolkit();
-		toolkit.getHyperlinkGroup().setHyperlinkUnderlineMode(
-				HyperlinkSettings.UNDERLINE_HOVER);
-		form.setText("Example with message handling");
-		toolkit.decorateFormHeading(form.getForm());
-		form.getForm().addMessageHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				String title = e.getLabel();
-				// String details = title;
-				Object href = e.getHref();
-				if (href instanceof IMessage[]) {
-					// details =
-					// managedForm.getMessageManager().createSummary((IMessage[])href);
-				}
-				// int type = form.getForm().getMessageType();
-				/*
-				 * switch (type) { case IMessageProvider.NONE: case
-				 * IMessageProvider.INFORMATION:
-				 * MessageDialog.openInformation(form.getShell(), title,
-				 * details); break; case IMessageProvider.WARNING:
-				 * MessageDialog.openWarning(form.getShell(), title, details);
-				 * break; case IMessageProvider.ERROR:
-				 * MessageDialog.openError(form.getShell(), title, details);
-				 * break; }
-				 */
-				Point hl = ((Control) e.widget).toDisplay(0, 0);
-				hl.x += 10;
-				hl.y += 10;
-				Shell shell = new Shell(form.getShell(), SWT.ON_TOP | SWT.TOOL);
-				shell.setImage(getImage(form.getMessageType()));
-				shell.setText(title);
-				shell.setLayout(new FillLayout());
-				// ScrolledFormText stext = new ScrolledFormText(shell, false);
-				// stext.setBackground(toolkit.getColors().getBackground());
-				FormText text = toolkit.createFormText(shell, true);
-				configureFormText(form.getForm(), text);
-				// stext.setFormText(text);
-				if (href instanceof IMessage[])
-					text.setText(createFormTextContent((IMessage[]) href),
-							true, false);
-				shell.setLocation(hl);
-				// Point size = shell.computeSize(400, SWT.DEFAULT);
-				/*
-				richToolTipMessageManager.setActive(false);
-				shell.addDisposeListener(new DisposeListener() {
-					public void widgetDisposed(DisposeEvent e) {
-						richToolTipMessageManager.setActive(true);
-					}
-				});
-				*/
-				shell.pack();
-				shell.open();
-			}
-		});
-
-		//richToolTipMessageManager = new RichMessageToolTipManager(managedForm);
-		//form.getForm().setMessageToolTipManager(richToolTipMessageManager);
-
-		final IMessageManager mmng = managedForm.getMessageManager();
-
-		TableWrapLayout layout = new TableWrapLayout();
-		form.getBody().setLayout(layout);
-		Section section = toolkit.createSection(form.getBody(),
-				Section.TITLE_BAR);
-		section.setText("Local field messages");
-		Composite sbody = toolkit.createComposite(section);
-		section.setClient(sbody);
-		GridLayout glayout = new GridLayout();
-		glayout.horizontalSpacing = 10;
-		glayout.numColumns = 2;
-		sbody.setLayout(glayout);
-		toolkit.paintBordersFor(sbody);
-		createDecoratedTextField("Field1", toolkit, sbody, mmng);
-		createDecoratedTextField("Field2", toolkit, sbody, mmng);
-		createDecoratedTextField("Field3", toolkit, sbody, mmng);
-		final Button button1 = toolkit.createButton(form.getBody(),
-				"Add general error", SWT.CHECK);
-		button1.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (button1.getSelection()) {
-					mmng.addMessage("saveError", "Save Error", null,
-							IMessageProvider.ERROR);
-				} else {
-					mmng.removeMessage("saveError");
-				}
-			}
-		});
-		final Button button2 = toolkit.createButton(form.getBody(),
-				"Add static message", SWT.CHECK);
-		button2.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (button2.getSelection()) {
-					mmng.addMessage("info", "Secondary info", null,
-							IMessageProvider.NONE);
-				} else {
-					mmng.removeMessage("info");
-				}
-			}
-		});
-		final Button button3 = toolkit.createButton(form.getBody(),
-				"Auto update", SWT.CHECK);
-		button3.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				mmng.setAutoUpdate(button3.getSelection());
-			}
-		});
-		button3.setSelection(true);
-	}
-
-	private Image getImage(int type) {
-		switch (type) {
-		case IMessageProvider.ERROR:
-			return PlatformUI.getWorkbench().getSharedImages().getImage(
-					ISharedImages.IMG_OBJS_ERROR_TSK);
-		case IMessageProvider.WARNING:
-			return PlatformUI.getWorkbench().getSharedImages().getImage(
-					ISharedImages.IMG_OBJS_WARN_TSK);
-		case IMessageProvider.INFORMATION:
-			return PlatformUI.getWorkbench().getSharedImages().getImage(
-					ISharedImages.IMG_OBJS_INFO_TSK);
-		}
-		return null;
-	}
-
-	private void configureFormText(final Form form, FormText text) {
-		text.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				String is = (String)e.getHref();
-				try {
-					int index = Integer.parseInt(is);
-					IMessage [] messages = form.getChildrenMessages();
-					IMessage message =messages[index];
-					Control c = message.getControl();
-					((FormText)e.widget).getShell().dispose();
-					if (c!=null)
-						c.setFocus();
-				}
-				catch (NumberFormatException ex) {
-				}
-			}
-		});
-		text.setImage("error", getImage(IMessageProvider.ERROR));
-		text.setImage("warning", getImage(IMessageProvider.WARNING));
-		text.setImage("info", getImage(IMessageProvider.INFORMATION));
-	}
-
-	String createFormTextContent(IMessage[] messages) {
-		StringWriter sw = new StringWriter();
-		PrintWriter pw = new PrintWriter(sw);
-		pw.println("<form>");
-		for (int i = 0; i < messages.length; i++) {
-			IMessage message = messages[i];
-			pw
-					.print("<li vspace=\"false\" style=\"image\" indent=\"16\" value=\"");
-			switch (message.getMessageType()) {
-			case IMessageProvider.ERROR:
-				pw.print("error");
-				break;
-			case IMessageProvider.WARNING:
-				pw.print("warning");
-				break;
-			case IMessageProvider.INFORMATION:
-				pw.print("info");
-				break;
-			}
-			pw.print("\"> <a href=\"");
-			pw.print(i+"");
-			pw.print("\">");
-			if (message.getPrefix() != null)
-				pw.print(message.getPrefix());
-			pw.print(message.getMessage());
-			pw.println("</a></li>");
-		}
-		pw.println("</form>");
-		pw.flush();
-		return sw.toString();
-	}
-
-	private void createDecoratedTextField(String label, FormToolkit toolkit,
-			Composite parent, final IMessageManager mmng) {
-		toolkit.createLabel(parent, label);
-		final Text text = toolkit.createText(parent, "");
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.widthHint = 150;
-		text.setLayoutData(gd);
-		text.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String s = text.getText();
-				// flag length
-				if (s.length() > 0 && s.length() <= 5) {
-					mmng.addMessage("textLength",
-							"Text is longer than 0 characters", null,
-							IMessageProvider.INFORMATION, text);
-				} else if (s.length() > 5 && s.length() <= 10) {
-					mmng.addMessage("textLength",
-							"Text is longer than 5 characters", null,
-							IMessageProvider.WARNING, text);
-				} else if (s.length() > 10) {
-					mmng.addMessage("textLength",
-							"Text is longer than 10 characters", null,
-							IMessageProvider.ERROR, text);
-				} else {
-					mmng.removeMessage("textLength", text);
-				}
-				// flag type
-				boolean badType = false;
-				for (int i = 0; i < s.length(); i++) {
-					if (!Character.isLetter(s.charAt(i))) {
-						badType = true;
-						break;
-					}
-				}
-				if (badType) {
-					mmng.addMessage("textType",
-							"Text must only contain letters", null,
-							IMessageProvider.ERROR, text);
-				} else {
-					mmng.removeMessage("textType", text);
-				}
-			}
-		});
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/FreeFormPage.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/FreeFormPage.java
deleted file mode 100644
index 1fb63d9..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/FreeFormPage.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-import java.io.*;
-import java.io.InputStream;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.forms.*;
-import org.eclipse.ui.forms.editor.*;
-import org.eclipse.ui.forms.events.*;
-import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
-import org.eclipse.ui.forms.widgets.*;
-/**
- * @author dejan
- * 
- * To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Generation - Code and Comments
- */
-public class FreeFormPage extends FormPage {
-	/**
-	 * @param id
-	 * @param title
-	 */
-	public FreeFormPage(FormEditor editor) {
-		super(editor, "first", "First Page");
-	}
-	public static final void createSharedFormContent(IManagedForm managedForm) {
-		ScrolledForm form = managedForm.getForm();
-		FormToolkit toolkit = managedForm.getToolkit();
-		toolkit.getHyperlinkGroup().setHyperlinkUnderlineMode(HyperlinkSettings.UNDERLINE_HOVER);
-		form.setText("Free-form text with links");
-		form.setBackgroundImage(ExamplesPlugin.getDefault().getImage(ExamplesPlugin.IMG_FORM_BG));
-		TableWrapLayout layout = new TableWrapLayout();
-		layout.leftMargin = 10;
-		layout.rightMargin = 10;
-		form.getBody().setLayout(layout);
-		TableWrapData td;
-		Hyperlink link = toolkit.createHyperlink(form.getBody(),
-				"Sample hyperlink with longer text.", SWT.WRAP);
-		link.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				try {
-					Thread.sleep(1000);
-				} catch (InterruptedException ex) {
-				}
-			}
-		});
-		td = new TableWrapData();
-		td.align = TableWrapData.LEFT;
-		link.setLayoutData(td);
-		createExpandable(form, toolkit);
-		createFormTextSection(form, toolkit);
-	}
-	
-	protected void createFormContent(IManagedForm managedForm) {
-		createSharedFormContent(managedForm);
-	}
-	private static void createExpandable(final ScrolledForm form, final FormToolkit toolkit) {
-		final ExpandableComposite exp = toolkit.createExpandableComposite(form
-				.getBody(), ExpandableComposite.TREE_NODE
-		//	ExpandableComposite.NONE
-				);
-		exp.setActiveToggleColor(toolkit.getHyperlinkGroup()
-				.getActiveForeground());
-		exp.setToggleColor(toolkit.getColors().getColor(IFormColors.SEPARATOR));
-		Composite client = toolkit.createComposite(exp);
-		exp.setClient(client);
-		TableWrapLayout elayout = new TableWrapLayout();
-		client.setLayout(elayout);
-		elayout.leftMargin = elayout.rightMargin = 0;
-		final Button button = toolkit.createButton(client, "Button", SWT.PUSH);
-		button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				//openFormWizard(button.getShell(), toolkit.getColors());
-			}
-		});
-		exp.addExpansionListener(new ExpansionAdapter() {
-			public void expansionStateChanged(ExpansionEvent e) {
-				form.reflow(true);
-			}
-		});
-		exp.setText("Expandable Section with a longer title");
-		TableWrapData td = new TableWrapData();
-		//td.colspan = 2;
-		td.align = TableWrapData.LEFT;
-		//td.align = TableWrapData.FILL;
-		exp.setLayoutData(td);
-	}
-	
-	private static void createFormTextSection(final ScrolledForm form, FormToolkit toolkit) {
-		Section section =
-			toolkit.createSection(
-				form.getBody(),
-				Section.TWISTIE | Section.DESCRIPTION);
-		section.setActiveToggleColor(
-			toolkit.getHyperlinkGroup().getActiveForeground());
-		section.setToggleColor(
-			toolkit.getColors().getColor(IFormColors.SEPARATOR));
-		toolkit.createCompositeSeparator(section);
-		FormText rtext = toolkit.createFormText(section, false);
-		section.setClient(rtext);
-		loadFormText(rtext, toolkit);
-
-		section.addExpansionListener(new ExpansionAdapter() {
-			public void expansionStateChanged(ExpansionEvent e) {
-				form.reflow(false);
-			}
-		});
-
-		section.setText("Section title");
-		section.setDescription(
-		"This is a section description that should be rendered below the separator.");
-		TableWrapData td = new TableWrapData();
-		td.align = TableWrapData.FILL;
-		td.grabHorizontal = true;
-		section.setLayoutData(td);
-	}
-
-	private static void loadFormText(final FormText rtext, FormToolkit toolkit) {
-		rtext.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				MessageDialog.openInformation(rtext.getShell(), "Eclipse Forms", 
-				"Link activated: href=" + e.getHref());
-			}
-		});
-		rtext.setHyperlinkSettings(toolkit.getHyperlinkGroup());
-		rtext.setImage("image1", ExamplesPlugin.getDefault().getImage(ExamplesPlugin.IMG_LARGE));
-		createCompositeControl(rtext, toolkit);
-		createControl(rtext, toolkit);
-		Menu menu = new Menu(rtext);
-		final MenuItem item = new MenuItem(menu, SWT.PUSH);
-		item.setText("&Copy");
-		item.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				rtext.copy();
-			}
-		});
-		//rtext.setMenu(menu);
-		item.setEnabled(false);
-		rtext.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				item.setEnabled(rtext.canCopy());
-			}
-		});
-		InputStream is = FreeFormPage.class.getResourceAsStream("index.xml");
-		if (is!=null) {
-			rtext.setContents(is, true);
-			try {
-				is.close();
-			}
-			catch (IOException e) {
-			}
-		}
-	}
-	private static void createControl(FormText ftext, FormToolkit toolkit) {
-		TreeNode node = new TreeNode(ftext, SWT.NULL);
-		toolkit.adapt(node, true, true);
-		ftext.setControl("node", node);
-	}
-	private static void createCompositeControl(FormText ftext, FormToolkit toolkit) {
-		Composite comp = toolkit.createComposite(ftext);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 3;
-		comp.setLayout(layout);
-		toolkit.createLabel(comp, "Sample text:");
-		Text text = toolkit.createText(comp, "");
-		text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		toolkit.createButton(comp, "Browse...", SWT.PUSH);
-		ftext.setControl("control1", comp);
-		toolkit.paintBordersFor(comp);
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/HeadlessPage.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/HeadlessPage.java
deleted file mode 100644
index 20814f1..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/HeadlessPage.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.forms.examples.internal.rcp;
-
-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.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-public class HeadlessPage extends FormPage {
-	private int count;
-
-	public HeadlessPage(FormEditor editor, int count) {
-		super(editor, "page"+count, "Page "+count);
-		this.count = count;
-	}
-	
-	protected void createFormContent(IManagedForm managedForm) {
-		FormToolkit toolkit = managedForm.getToolkit();
-		Composite body = managedForm.getForm().getBody();
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 4;
-		body.setLayout(layout);
-		Label label = toolkit.createLabel(body, "The content of the headless page #"+count);
-		GridData gd = new GridData();
-		gd.horizontalSpan = 4;
-		label.setLayoutData(gd);
-		for (int i=0; i<80; i++) {
-			toolkit.createLabel(body, "Field "+i);
-			Text text = toolkit.createText(body, null);
-			gd = new GridData(GridData.FILL_HORIZONTAL);
-			text.setLayoutData(gd);
-		}
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/IModelListener.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/IModelListener.java
deleted file mode 100644
index 8b432f4..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/IModelListener.java
+++ /dev/null
@@ -1,24 +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 Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public interface IModelListener {
-	String ADDED="__added";
-	String REMOVED="__removed";
-	String CHANGED = "__changed";
-	void modelChanged(Object[] objects, String type, String property);
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/NamedObject.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/NamedObject.java
deleted file mode 100644
index d62aa84..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/NamedObject.java
+++ /dev/null
@@ -1,36 +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 Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-
-/**
- *
- */
-public	class NamedObject {
-	private String name;
-	protected SimpleModel model;
-	
-	public NamedObject(String name) {
-		this.name = name;
-	}
-	public void setModel(SimpleModel model) {
-		this.model = model;
-	}
-	public String getName() {
-		return name;
-	}
-	public String toString() {
-		return getName();
-	}
-	public void setName(String name) {
-		this.name = name;
-		model.fireModelChanged(new Object [] {this}, IModelListener.CHANGED, "");
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/NewStylePage.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/NewStylePage.java
deleted file mode 100644
index c2edd4d..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/NewStylePage.java
+++ /dev/null
@@ -1,581 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ControlContribution;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.DragSourceListener;
-import org.eclipse.swt.dnd.DropTargetAdapter;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-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.Text;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.FormColors;
-import org.eclipse.ui.forms.HyperlinkSettings;
-import org.eclipse.ui.forms.IFormColors;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.IMessageManager;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.Section;
-
-/**
- * @author dejan
- * 
- * To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Generation - Code and Comments
- */
-public class NewStylePage extends FormPage {
-	private static final String SHORT_TITLE = "Short Title";
-	private static final String LONG_TITLE = "This title is somewhat longer";
-	private static final String SHORT_MESSAGE = "A short {0} message";
-	private static final String LONG_MESSAGE = "This {0} message is longer and will also compete with other header regions";
-	private static final String[] MESSAGE_NAMES = { "text", "info", "warning",
-			"error" };
-	
-	/**
-	 * @param id
-	 * @param title
-	 */
-	public NewStylePage(FormEditor editor) {
-		super(editor, "newStyle", "New Style");
-	}
-
-	protected void createFormContent(IManagedForm managedForm) {
-		final ScrolledForm form = managedForm.getForm();
-		final FormToolkit toolkit = managedForm.getToolkit();
-		toolkit.getHyperlinkGroup().setHyperlinkUnderlineMode(
-				HyperlinkSettings.UNDERLINE_HOVER);
-
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginHeight = 10;
-		layout.marginWidth = 6;
-		layout.horizontalSpacing = 20;
-		form.getBody().setLayout(layout);
-
-		Section section = toolkit.createSection(form.getBody(),
-				ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE
-						| ExpandableComposite.EXPANDED);
-		Composite client = toolkit.createComposite(section);
-		section.setClient(client);
-		section.setText("Header features");
-		section
-				.setDescription("Use the switches below to control basic heading parameters.");
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		section.setLayoutData(gd);
-		layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		client.setLayout(layout);
-		final Button tbutton = toolkit.createButton(client, "Add title",
-				SWT.CHECK);
-		final Button sbutton = toolkit.createButton(client, "Short title",
-				SWT.RADIO);
-		sbutton.setSelection(true);
-		sbutton.setEnabled(false);
-		gd = new GridData();
-		gd.horizontalIndent = 10;
-		sbutton.setLayoutData(gd);
-		final Button lbutton = toolkit.createButton(client, "Long title",
-				SWT.RADIO);
-		gd = new GridData();
-		gd.horizontalIndent = 10;
-		lbutton.setLayoutData(gd);
-		lbutton.setEnabled(false);
-		tbutton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateTitle(form, tbutton.getSelection(), sbutton
-						.getSelection());
-				sbutton.setEnabled(tbutton.getSelection());
-				lbutton.setEnabled(tbutton.getSelection());
-			}
-		});
-		sbutton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateTitle(form, tbutton.getSelection(), sbutton
-						.getSelection());
-			}
-		});
-		lbutton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateTitle(form, tbutton.getSelection(), sbutton
-						.getSelection());
-			}
-		});
-		final Button ibutton = toolkit.createButton(client, "Add image",
-				SWT.CHECK);
-		ibutton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateImage(form, ibutton.getSelection());
-			}
-		});
-
-		final Button tbbutton = toolkit.createButton(client, "Add tool bar",
-				SWT.CHECK);
-		
-		final Button albutton = toolkit.createButton(client, "Set tool bar allignment to SWT.BOTTOM",
-				SWT.CHECK);
-		albutton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				form.getForm().setToolBarVerticalAlignment(albutton.getSelection()?SWT.BOTTOM:SWT.TOP);
-				form.reflow(true);
-			}
-		});
-		gd = new GridData();
-		gd.horizontalIndent = 10;
-		albutton.setLayoutData(gd);
-		albutton.setEnabled(false);
-		tbbutton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				addToolBar(toolkit, form, tbbutton.getSelection());
-				albutton.setEnabled(tbbutton.getSelection());
-			}
-		});
-
-		final Button gbutton = toolkit.createButton(client,
-				"Paint background gradient", SWT.CHECK);
-		gbutton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				addHeadingGradient(toolkit, form, gbutton.getSelection());
-			}
-		});
-
-		final Button clbutton = toolkit.createButton(client, "Add head client",
-				SWT.CHECK);
-		clbutton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				addHeadClient(toolkit, form, clbutton.getSelection());
-			}
-		});
-
-		final Button mbutton = toolkit.createButton(client,
-				"Add drop-down menu", SWT.CHECK);
-		mbutton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				addMenu(toolkit, form, mbutton.getSelection());
-			}
-		});
-
-		final Button dbutton = toolkit.createButton(client, "Add drag support",
-				SWT.CHECK);
-		dbutton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (dbutton.getSelection()) {
-					addDragSupport(form);
-					dbutton.setEnabled(false);
-				}
-			}
-		});
-
-		section = toolkit.createSection(form.getBody(),
-				ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE
-						| ExpandableComposite.EXPANDED);
-		Composite client2 = toolkit.createComposite(section);
-		section.setClient(client2);
-		section.setText("Messages and active state");
-		section
-				.setDescription("Use the buttons below to control messages and active state.");
-		gd = new GridData(GridData.FILL_BOTH);
-		section.setLayoutData(gd);
-
-		layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		layout.numColumns = 4;
-		client2.setLayout(layout);
-
-		final Button shortMessage = toolkit.createButton(client2,
-				"Short message", SWT.RADIO);
-		shortMessage.setSelection(true);
-		gd = new GridData();
-		gd.horizontalSpan = 4;
-		shortMessage.setLayoutData(gd);
-		final Button longMessage = toolkit.createButton(client2, "Long message",
-				SWT.RADIO);
-		gd = new GridData();
-		gd.horizontalSpan = 4;
-		longMessage.setLayoutData(gd);
-
-		final IHyperlinkListener listener = new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				String title = e.getLabel();
-				String details = (String)e.getHref();
-				if (details==null) {
-					details = title;
-					title = null;
-				}
-				switch (form.getForm().getMessageType()) {
-				case IMessageProvider.NONE:
-				case IMessageProvider.INFORMATION:
-					if (title==null)
-						title = "Forms Information";
-					MessageDialog.openInformation(form.getShell(), title, details);
-					break;
-				case IMessageProvider.WARNING:
-					if (title==null)
-						title = "Forms Warning";
-					MessageDialog.openWarning(form.getShell(), title, details);
-					break;
-				case IMessageProvider.ERROR:
-					if (title==null)
-						title = "Forms Error";
-					MessageDialog.openError(form.getShell(), title, details);
-					break;
-				}
-			}
-		};
-
-		final Button hyperMessage = toolkit.createButton(client2,
-				"Message as hyperlink", SWT.CHECK);
-		gd = new GridData();
-		gd.horizontalSpan = 4;
-		hyperMessage.setLayoutData(gd);
-		hyperMessage.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (hyperMessage.getSelection())
-					form.getForm().addMessageHyperlinkListener(listener);
-				else
-					form.getForm().removeMessageHyperlinkListener(listener);
-			}
-		});
-		
-		Control[] children = client.getChildren();
-		ArrayList buttons = new ArrayList();
-		for (int i = 0; i < children.length; i++) {
-			if (children[i] instanceof Button) {
-				Button button = (Button) children[i];
-				if ((button.getStyle() & SWT.CHECK) != 0 && !button.equals(dbutton)) {
-					buttons.add(button);
-				}
-			}
-		}
-		final Button[] checkboxes = (Button[]) buttons.toArray(new Button[buttons.size()]);
-		
-		final Button manageMessage = toolkit.createButton(client2,
-				"Use message manager", SWT.CHECK);
-		gd = new GridData();
-		gd.horizontalSpan = 4;
-		manageMessage.setLayoutData(gd);
-		
-		SelectionAdapter mmListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (manageMessage.getSelection() && e.widget instanceof Button)
-					addRemoveMessage((Button) e.widget, form.getMessageManager());
-			}
-		};
-		for (int i = 0; i < checkboxes.length; i++)
-			checkboxes[i].addSelectionListener(mmListener);
-
-		final Button autoUpdate = toolkit.createButton(client2,
-				"Auto update message manager", SWT.CHECK);
-		gd = new GridData();
-		gd.horizontalSpan = 4;
-		autoUpdate.setLayoutData(gd);
-		autoUpdate.setSelection(true);
-		autoUpdate.setEnabled(false);
-		autoUpdate.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				form.getMessageManager().setAutoUpdate(autoUpdate.getSelection());
-			}
-		});
-		
-		shortMessage.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				form.setMessage(getErrorMessage(form.getMessageType(),
-						longMessage.getSelection()), form.getMessageType());
-			}
-		});
-		longMessage.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				form.setMessage(getErrorMessage(form.getMessageType(),
-						longMessage.getSelection()), form.getMessageType());
-			}
-		});
-
-		final Button error = toolkit.createButton(client2, "Error", SWT.PUSH);
-		error.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				form.setMessage(getErrorMessage(IMessageProvider.ERROR,
-						longMessage.getSelection()), IMessageProvider.ERROR);
-
-			}
-		});
-		final Button warning = toolkit.createButton(client2, "Warning", SWT.PUSH);
-		warning.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				form.setMessage(getErrorMessage(IMessageProvider.WARNING,
-						longMessage.getSelection()), IMessageProvider.WARNING);
-			}
-		});
-		final Button info = toolkit.createButton(client2, "Info", SWT.PUSH);
-		info.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				form.setMessage(getErrorMessage(IMessageProvider.INFORMATION,
-						longMessage.getSelection()),
-						IMessageProvider.INFORMATION);
-			}
-		});
-		final Button cancel = toolkit.createButton(client2, "Cancel", SWT.PUSH);
-		cancel.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				form.setMessage(null, 0);
-			}
-		});
-		manageMessage.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				boolean selection = manageMessage.getSelection();
-				if (!selection)
-					autoUpdate.setSelection(true);
-				autoUpdate.setEnabled(selection);
-				IMessageManager mm = form.getMessageManager();
-				mm.setAutoUpdate(false);
-				if (selection) {
-					for (int i = 0; i < checkboxes.length; i++) {
-						addRemoveMessage(checkboxes[i], mm);
-					}
-				}
-				else {
-					mm.removeAllMessages();
-				}
-				mm.setAutoUpdate(true);
-				error.setEnabled(!selection);
-				warning.setEnabled(!selection);
-				info.setEnabled(!selection);
-				cancel.setEnabled(!selection);
-				if (selection) {
-					hyperMessage.setSelection(false);
-					form.getForm().removeMessageHyperlinkListener(listener);
-				}
-				hyperMessage.setEnabled(!selection);
-			}
-		});
-
-		final Button busy = toolkit.createButton(client2, "Start Progress",
-				SWT.PUSH);
-		busy.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				// IWorkbenchSiteProgressService service =
-				// (IWorkbenchSiteProgressService)getSite().getAdapter(IWorkbenchSiteProgressService.class);
-
-				if (form.getForm().isBusy()) {
-					form.getForm().setBusy(false);
-					busy.setText("Start Progress");
-				} else {
-					form.getForm().setBusy(true);
-					busy.setText("Stop Progress");
-				}
-			}
-		});
-		gd = new GridData();
-		gd.horizontalSpan = 2;
-		busy.setLayoutData(gd);
-	}
-
-	private void addHeadingGradient(FormToolkit toolkit, ScrolledForm form,
-			boolean add) {
-		FormColors colors = toolkit.getColors();
-		Color top = colors.getColor(IFormColors.H_GRADIENT_END);
-		Color bot = colors.getColor(IFormColors.H_GRADIENT_START);
-		if (add)
-			form.getForm().setTextBackground(new Color[] { top, bot },
-					new int[] { 100 }, true);
-		else {
-			form.getForm().setTextBackground(null, null, false);
-			form.getForm().setBackground(colors.getBackground());
-		}
-		form.getForm().setHeadColor(IFormColors.H_BOTTOM_KEYLINE1,
-				add ? colors.getColor(IFormColors.H_BOTTOM_KEYLINE1) : null);
-		form.getForm().setHeadColor(IFormColors.H_BOTTOM_KEYLINE2,
-				add ? colors.getColor(IFormColors.H_BOTTOM_KEYLINE2) : null);
-		form.getForm().setHeadColor(IFormColors.H_HOVER_LIGHT,
-				add ? colors.getColor(IFormColors.H_HOVER_LIGHT) : null);
-		form.getForm().setHeadColor(IFormColors.H_HOVER_FULL,
-				add ? colors.getColor(IFormColors.H_HOVER_FULL) : null);
-		form.getForm().setHeadColor(IFormColors.TB_TOGGLE,
-				add ? colors.getColor(IFormColors.TB_TOGGLE) : null);
-		form.getForm().setHeadColor(IFormColors.TB_TOGGLE_HOVER,
-				add ? colors.getColor(IFormColors.TB_TOGGLE_HOVER) : null);
-		form.getForm().setSeparatorVisible(add);
-		form.reflow(true);
-		form.redraw();
-	}
-
-	private String getErrorMessage(int type, boolean longMessage) {
-		String name = MESSAGE_NAMES[type];
-		if (longMessage)
-			return MessageFormat.format(LONG_MESSAGE, new Object[] { name });
-		else
-			return MessageFormat.format(SHORT_MESSAGE, new Object[] { name });
-	}
-
-	private void updateTitle(ScrolledForm form, boolean addTitle,
-			boolean shortTitle) {
-		if (addTitle) {
-			String text = shortTitle ? SHORT_TITLE : LONG_TITLE;
-			form.setText(text);
-		} else {
-			form.setText(null);
-		}
-	}
-
-	private void updateImage(ScrolledForm form, boolean addImage) {
-		if (addImage)
-			form.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(
-					ISharedImages.IMG_DEF_VIEW));
-		else
-			form.setImage(null);
-	}
-	
-	private void addRemoveMessage(Button button, IMessageManager mm) {
-		if (button.getSelection())
-			mm.addMessage(button, button.getText() + " is checked.", null, IMessageProvider.INFORMATION, button);
-		else
-			mm.removeMessage(button, button);
-	}
-
-	private void addToolBar(FormToolkit toolkit, ScrolledForm form, boolean add) {
-		if (add) {
-			Action haction = new Action("hor", Action.AS_RADIO_BUTTON) {
-				public void run() {
-				}
-			};
-			haction.setChecked(true);
-			haction.setToolTipText("Horizontal orientation");
-			haction.setImageDescriptor(ExamplesPlugin.getDefault()
-					.getImageRegistry().getDescriptor(
-							ExamplesPlugin.IMG_HORIZONTAL));
-			Action vaction = new Action("ver", Action.AS_RADIO_BUTTON) {
-				public void run() {
-				}
-			};
-			vaction.setChecked(false);
-			vaction.setToolTipText("Vertical orientation");
-			vaction.setImageDescriptor(ExamplesPlugin.getDefault()
-					.getImageRegistry().getDescriptor(
-							ExamplesPlugin.IMG_VERTICAL));
-			ControlContribution save = new ControlContribution("save") {
-				protected Control createControl(Composite parent) {
-					Button saveButton = new Button(parent, SWT.PUSH);
-					saveButton.setText("Save");
-					return saveButton;
-				}
-			};
-			form.getToolBarManager().add(haction);
-			form.getToolBarManager().add(vaction);
-			form.getToolBarManager().add(save);
-			form.getToolBarManager().update(true);
-		} else {
-			form.getToolBarManager().removeAll();
-		}
-		form.reflow(true);
-	}
-
-	private void addMenu(FormToolkit toolkit, ScrolledForm form, boolean add) {
-		if (add) {
-			Action haction = new Action("hor", Action.AS_RADIO_BUTTON) {
-				public void run() {
-				}
-			};
-			haction.setChecked(true);
-			haction.setText("Horizontal");
-			haction.setToolTipText("Horizontal orientation");
-			haction.setImageDescriptor(ExamplesPlugin.getDefault()
-					.getImageRegistry().getDescriptor(
-							ExamplesPlugin.IMG_HORIZONTAL));
-			Action vaction = new Action("ver", Action.AS_RADIO_BUTTON) {
-				public void run() {
-				}
-			};
-			vaction.setChecked(false);
-			vaction.setText("Vertical");
-			vaction.setToolTipText("Vertical orientation");
-			vaction.setImageDescriptor(ExamplesPlugin.getDefault()
-					.getImageRegistry().getDescriptor(
-							ExamplesPlugin.IMG_VERTICAL));
-			form.getForm().getMenuManager().add(haction);
-			form.getForm().getMenuManager().add(vaction);
-		} else {
-			form.getForm().getMenuManager().removeAll();
-		}
-		form.reflow(true);
-	}
-
-	private void addHeadClient(FormToolkit toolkit, ScrolledForm form,
-			boolean add) {
-		if (add) {
-			Composite headClient = new Composite(form.getForm().getHead(),
-					SWT.NULL);
-			GridLayout glayout = new GridLayout();
-			glayout.marginWidth = glayout.marginHeight = 0;
-			glayout.numColumns = 3;
-			headClient.setLayout(glayout);
-			Text t = new Text(headClient, toolkit.getBorderStyle());
-			t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			new Combo(headClient, SWT.NULL);
-			new Combo(headClient, SWT.NULL);
-			toolkit.paintBordersFor(headClient);
-			form.setHeadClient(headClient);
-		} else {
-			Control client = form.getForm().getHeadClient();
-			if (client != null) {
-				client.dispose();
-				form.setHeadClient(null);
-			}
-		}
-	}
-
-	private void addDragSupport(final ScrolledForm form) {
-		int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
-		Transfer[] transferTypes = { TextTransfer.getInstance() };
-		form.getForm().addTitleDragSupport(operations, transferTypes,
-				new DragSourceListener() {
-					public void dragFinished(DragSourceEvent event) {
-					}
-
-					public void dragSetData(DragSourceEvent event) {
-						event.data = form.getForm().getText();
-					}
-
-					public void dragStart(DragSourceEvent event) {
-						event.doit = true;
-					}
-				});
-		form.getForm().addTitleDropSupport(operations, transferTypes,
-				new DropTargetAdapter() {
-				});
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/OpenSimpleFormEditorAction.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/OpenSimpleFormEditorAction.java
deleted file mode 100644
index 91af481..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/OpenSimpleFormEditorAction.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.forms.examples.internal.OpenFormEditorAction;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-public class OpenSimpleFormEditorAction extends OpenFormEditorAction {
-	
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
-		return openEditor(new SimpleFormEditorInput("Simple Editor"), "org.eclipse.ui.forms.examples.base-editor", window);
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/OpenSingleHeaderEditorAction.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/OpenSingleHeaderEditorAction.java
deleted file mode 100644
index 27d3c8b..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/OpenSingleHeaderEditorAction.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.forms.examples.internal.OpenFormEditorAction;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-public class OpenSingleHeaderEditorAction extends OpenFormEditorAction {
-	
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
-		return openEditor(new SimpleFormEditorInput("Single Header Editor"),
-				"org.eclipse.ui.forms.examples.single-header-editor", window);
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/PageWithSubPages.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/PageWithSubPages.java
deleted file mode 100644
index 7aa310b..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/PageWithSubPages.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.*;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.forms.*;
-import org.eclipse.ui.forms.editor.*;
-import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
-import org.eclipse.ui.forms.widgets.*;
-/**
- *
- */
-public class PageWithSubPages extends FormPage {
-	private CTabFolder tabFolder;
-	private Text text;
-	
-	class TextSection {
-		String text;
-		public TextSection(String text) {this.text = text;}
-	}
-	/**
-	 * @param id
-	 * @param title
-	 */
-	public PageWithSubPages(FormEditor editor) {
-		super(editor, "composite", "Composite Page");
-	}
-	protected void createFormContent(IManagedForm managedForm) {
-		ScrolledForm form = managedForm.getForm();
-		FormToolkit toolkit = managedForm.getToolkit();
-		form.setText("Form with subpages");
-		form.setBackgroundImage(ExamplesPlugin.getDefault().getImage(
-				ExamplesPlugin.IMG_FORM_BG));
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 10;
-		form.getBody().setLayout(layout);
-		tabFolder = new CTabFolder(form.getBody(), SWT.FLAT|SWT.TOP);
-		toolkit.adapt(tabFolder, true, true);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.heightHint = 0;
-		tabFolder.setLayoutData(gd);
-		Color selectedColor = toolkit.getColors().getColor(IFormColors.SEPARATOR);
-		tabFolder.setSelectionBackground(new Color[] {selectedColor, toolkit.getColors().getBackground()}, new int[] {50});
-		//tabFolder.setCursor(FormsResources.getHandCursor());
-
-		toolkit.paintBordersFor(tabFolder);
-		createTabs(toolkit);
-		createText(toolkit, form.getBody());
-		tabFolder.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateSelection();
-			}
-		});
-		tabFolder.setSelection(0);
-		updateSelection();		
-	}
-	private void createTabs(FormToolkit toolkit) {
-		createTab(toolkit, "Copyright", "Copyright 2004 IBM and others.");
-		createTab(toolkit, "License Agreement", "LICENSE AGREEMENT\n\nUse this feature any way you want.");
-		createTab(toolkit, "Description", "A simple description of the feature");
-	}
-	private void createText(FormToolkit toolkit, Composite parent) {
-		Composite tabContent = toolkit.createComposite(parent);
-		tabContent.setLayoutData(new GridData(GridData.FILL_BOTH));
-		GridLayout layout = new GridLayout();
-		tabContent.setLayout(layout);
-		layout.numColumns = 2;
-		layout.marginWidth = 0;
-		GridData gd;
-		text = toolkit.createText(tabContent, "", SWT.MULTI|SWT.WRAP);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.verticalSpan = 2;
-		text.setLayoutData(gd);
-		Button apply = toolkit.createButton(tabContent, "Apply", SWT.PUSH);
-		apply.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL|GridData.VERTICAL_ALIGN_BEGINNING));
-		Button reset = toolkit.createButton(tabContent, "Reset", SWT.PUSH);
-		reset.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL|GridData.VERTICAL_ALIGN_BEGINNING));
-	}
-	private void updateSelection() {
-		CTabItem item = tabFolder.getSelection();
-		TextSection section = (TextSection)item.getData();
-		text.setText(section.text);
-	}
-	private void createTab(FormToolkit toolkit, String title, String content) {
-		CTabItem item = new CTabItem(tabFolder, SWT.NULL);
-		TextSection section = new TextSection(content);
-		item.setText(title);
-		item.setData(section);
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ScrolledPropertiesBlock.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ScrolledPropertiesBlock.java
deleted file mode 100644
index f25a613..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ScrolledPropertiesBlock.java
+++ /dev/null
@@ -1,136 +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 Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.*;
-import org.eclipse.ui.forms.*;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
-import org.eclipse.ui.forms.widgets.*;
-/**
- *
- */
-public class ScrolledPropertiesBlock extends MasterDetailsBlock {
-	private FormPage page;
-	public ScrolledPropertiesBlock(FormPage page) {
-		this.page = page;
-	}
-	/**
-	 * @param id
-	 * @param title
-	 */
-	class MasterContentProvider implements IStructuredContentProvider {
-		public Object[] getElements(Object inputElement) {
-			if (inputElement instanceof SimpleFormEditorInput) {
-				SimpleFormEditorInput input = (SimpleFormEditorInput) page
-						.getEditor().getEditorInput();
-				return input.getModel().getContents();
-			}
-			return new Object[0];
-		}
-		public void dispose() {
-		}
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-	}
-	class MasterLabelProvider extends LabelProvider
-			implements
-				ITableLabelProvider {
-		public String getColumnText(Object obj, int index) {
-			return obj.toString();
-		}
-		public Image getColumnImage(Object obj, int index) {
-			if (obj instanceof TypeOne) {
-				return PlatformUI.getWorkbench().getSharedImages().getImage(
-						ISharedImages.IMG_OBJ_ELEMENT);
-			}
-			if (obj instanceof TypeTwo) {
-				return PlatformUI.getWorkbench().getSharedImages().getImage(
-						ISharedImages.IMG_OBJ_FILE);
-			}
-			return null;
-		}
-	}
-	protected void createMasterPart(final IManagedForm managedForm,
-			Composite parent) {
-		//final ScrolledForm form = managedForm.getForm();
-		FormToolkit toolkit = managedForm.getToolkit();
-		Section section = toolkit.createSection(parent, Section.DESCRIPTION);
-		section.setText("Model Objects");
-		section
-				.setDescription("The list contains objects from the model whose details are editable on the right");
-		section.marginWidth = 10;
-		section.marginHeight = 5;
-		toolkit.createCompositeSeparator(section);
-		Composite client = toolkit.createComposite(section, SWT.WRAP);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = 2;
-		layout.marginHeight = 2;
-		client.setLayout(layout);
-		Table t = toolkit.createTable(client, SWT.NULL);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.heightHint = 20;
-		gd.widthHint = 100;
-		t.setLayoutData(gd);
-		toolkit.paintBordersFor(client);
-		Button b = toolkit.createButton(client, "Add...", SWT.PUSH);
-		gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
-		b.setLayoutData(gd);
-		section.setClient(client);
-		final SectionPart spart = new SectionPart(section);
-		managedForm.addPart(spart);
-		TableViewer viewer = new TableViewer(t);
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				managedForm.fireSelectionChanged(spart, event.getSelection());
-			}
-		});
-		viewer.setContentProvider(new MasterContentProvider());
-		viewer.setLabelProvider(new MasterLabelProvider());
-		viewer.setInput(page.getEditor().getEditorInput());
-	}
-	protected void createToolBarActions(IManagedForm managedForm) {
-		final ScrolledForm form = managedForm.getForm();
-		Action haction = new Action("hor", Action.AS_RADIO_BUTTON) {
-			public void run() {
-				sashForm.setOrientation(SWT.HORIZONTAL);
-				form.reflow(true);
-			}
-		};
-		haction.setChecked(true);
-		haction.setToolTipText("Horizontal orientation");
-		haction.setImageDescriptor(ExamplesPlugin.getDefault()
-				.getImageRegistry()
-				.getDescriptor(ExamplesPlugin.IMG_HORIZONTAL));
-		Action vaction = new Action("ver", Action.AS_RADIO_BUTTON) {
-			public void run() {
-				sashForm.setOrientation(SWT.VERTICAL);
-				form.reflow(true);
-			}
-		};
-		vaction.setChecked(false);
-		vaction.setToolTipText("Vertical orientation");
-		vaction.setImageDescriptor(ExamplesPlugin.getDefault()
-				.getImageRegistry().getDescriptor(ExamplesPlugin.IMG_VERTICAL));
-		form.getToolBarManager().add(haction);
-		form.getToolBarManager().add(vaction);
-	}
-	protected void registerPages(DetailsPart detailsPart) {
-		detailsPart.registerPage(TypeOne.class, new TypeOneDetailsPage());
-		detailsPart.registerPage(TypeTwo.class, new TypeTwoDetailsPage());
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ScrolledPropertiesPage.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ScrolledPropertiesPage.java
deleted file mode 100644
index e8f0239..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ScrolledPropertiesPage.java
+++ /dev/null
@@ -1,36 +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 Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.*;
-import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
-import org.eclipse.ui.forms.widgets.*;
-/**
- * @author dejan
- * 
- * To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Generation - Code and Comments
- */
-public class ScrolledPropertiesPage extends FormPage {
-	private ScrolledPropertiesBlock block;
-	public ScrolledPropertiesPage(FormEditor editor) {
-		super(editor, "fourth", "Master Details");
-		block = new ScrolledPropertiesBlock(this);
-	}
-	protected void createFormContent(final IManagedForm managedForm) {
-		final ScrolledForm form = managedForm.getForm();
-		//FormToolkit toolkit = managedForm.getToolkit();
-		form.setText("Form with scrolled sections");
-		form.setBackgroundImage(ExamplesPlugin.getDefault().getImage(
-				ExamplesPlugin.IMG_FORM_BG));
-		block.createContent(managedForm);
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SecondPage.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SecondPage.java
deleted file mode 100644
index 199bcfb..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SecondPage.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.*;
-import org.eclipse.ui.forms.editor.*;
-import org.eclipse.ui.forms.events.*;
-import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
-import org.eclipse.ui.forms.widgets.*;
-
-/**
- * @author dejan
- * 
- * To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Generation - Code and Comments
- */
-public class SecondPage extends FormPage {
-	/**
-	 * @param id
-	 * @param title
-	 */
-	public SecondPage(FormEditor editor) {
-		super(editor, "second", "Section Page");
-	}
-
-	protected void createFormContent(IManagedForm managedForm) {
-		ScrolledForm form = managedForm.getForm();
-		FormToolkit toolkit = managedForm.getToolkit();
-		form.setText("Title for the second page");
-		form.setBackgroundImage(ExamplesPlugin.getDefault().getImage(
-				ExamplesPlugin.IMG_FORM_BG));
-		GridLayout layout = new GridLayout();
-		layout.makeColumnsEqualWidth = true;
-		layout.numColumns = 2;
-		form.getBody().setLayout(layout);
-		//This call is needed because the section will compute
-		// the bold version based on the parent.
-		Dialog.applyDialogFont(form.getBody());
-		Section s1 = createTableSection(form, toolkit, "First Table Section", true);
-		Section s2 = createTableSection(form, toolkit, "Second Table Section", false);
-		// This call is needed for all the children
-		Dialog.applyDialogFont(form.getBody());
-		s2.descriptionVerticalSpacing = s1.getTextClientHeightDifference();
-		form.reflow(true);
-	}
-
-	private Section createTableSection(final ScrolledForm form,
-			FormToolkit toolkit, String title, boolean addTextClient) {
-		Section section = toolkit.createSection(form.getBody(), Section.TWISTIE
-				| Section.TITLE_BAR);
-		section.setActiveToggleColor(toolkit.getHyperlinkGroup()
-				.getActiveForeground());
-		section.setToggleColor(toolkit.getColors().getColor(
-				IFormColors.SEPARATOR));
-		if (addTextClient) {
-			ToolBar tbar = new ToolBar(section, SWT.FLAT | SWT.HORIZONTAL);
-			ToolItem titem = new ToolItem(tbar, SWT.NULL);
-			titem.setImage(PlatformUI.getWorkbench().getSharedImages()
-					.getImage(ISharedImages.IMG_TOOL_CUT));
-			titem = new ToolItem(tbar, SWT.PUSH);
-			titem.setImage(PlatformUI.getWorkbench().getSharedImages()
-					.getImage(ISharedImages.IMG_TOOL_COPY));
-			titem = new ToolItem(tbar, SWT.SEPARATOR);
-			titem = new ToolItem(tbar, SWT.PUSH);
-			titem.setImage(PlatformUI.getWorkbench().getSharedImages()
-					.getImage(ISharedImages.IMG_TOOL_DELETE));
-			section.setTextClient(tbar);
-		}
-		FormText description = toolkit.createFormText(section, false);
-		description
-				.setText(
-						"<form><p>This description uses FormText widget and as a result can have <b>bold</b> text.</p></form>",
-						true, false);
-		section.setDescriptionControl(description);
-
-		Composite client = toolkit.createComposite(section, SWT.WRAP);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-
-		client.setLayout(layout);
-		Table t = toolkit.createTable(client, SWT.NULL);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.heightHint = 200;
-		gd.widthHint = 100;
-		t.setLayoutData(gd);
-		toolkit.paintBordersFor(client);
-		Button b = toolkit.createButton(client, "Add...", SWT.PUSH);
-		gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
-		b.setLayoutData(gd);
-		section.setText(title);
-		section
-				.setDescription("<form><p>This section has a <b>tree</b> and a button. It also has <a>a link</a> in the description.</p></form>");
-		section.setClient(client);
-		section.setExpanded(true);
-		section.addExpansionListener(new ExpansionAdapter() {
-			public void expansionStateChanged(ExpansionEvent e) {
-				form.reflow(false);
-			}
-		});
-		gd = new GridData(GridData.FILL_BOTH);
-		section.setLayoutData(gd);
-		return section;
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleFormEditor.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleFormEditor.java
deleted file mode 100644
index 94c95e7..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleFormEditor.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-/**
- * A simple multi-page form editor that uses Eclipse Forms support.
- * Example plug-in is configured to create one instance of
- * form colors that is shared between multiple editor instances.
- */
-public class SimpleFormEditor extends FormEditor {
-	/**
-	 *  
-	 */
-	public SimpleFormEditor() {
-	}
-	/*
-	 *  (non-Javadoc)
-	 * @see org.eclipse.ui.forms.editor.FormEditor#createToolkit(org.eclipse.swt.widgets.Display)
-	 */
-	protected FormToolkit createToolkit(Display display) {
-		// Create a toolkit that shares colors between editors.
-		return new FormToolkit(ExamplesPlugin.getDefault().getFormColors(
-				display));
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
-	 */
-	protected void addPages() {
-		try {
-		addPage(new NewStylePage(this));
-		addPage(new ErrorMessagesPage(this));
-		addPage(new FreeFormPage(this));
-		addPage(new SecondPage(this));
-		int index = addPage(new Composite(getContainer(), SWT.NULL));
-		setPageText(index, "Composite");
-		addPage(new ThirdPage(this));
-		addPage(new ScrolledPropertiesPage(this));
-		addPage(new PageWithSubPages(this));
-		}
-		catch (PartInitException e) {
-			//
-		}
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleFormEditorInput.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleFormEditorInput.java
deleted file mode 100644
index b2fd6af..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleFormEditorInput.java
+++ /dev/null
@@ -1,25 +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 Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-import org.eclipse.ui.forms.examples.internal.FormEditorInput;
-
-public class SimpleFormEditorInput extends FormEditorInput {
-	private SimpleModel model;
-	
-	public SimpleFormEditorInput(String name) {
-		super(name);
-		model = new SimpleModel();
-	}
-	
-	public SimpleModel getModel() {
-		return model;
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleModel.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleModel.java
deleted file mode 100644
index ba1ceab..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleModel.java
+++ /dev/null
@@ -1,70 +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 Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-import java.util.ArrayList;
-/**
- * @author dejan
- * 
- * To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Generation - Code and Comments
- */
-public class SimpleModel {
-	private ArrayList modelListeners;
-	private ArrayList objects;
-	public SimpleModel() {
-		modelListeners = new ArrayList();
-		initialize();
-	}
-	public void addModelListener(IModelListener listener) {
-		if (!modelListeners.contains(listener))
-			modelListeners.add(listener);
-	}
-	public void removeModelListener(IModelListener listener) {
-		modelListeners.remove(listener);
-	}
-	public void fireModelChanged(Object[] objects, String type, String property) {
-		for (int i = 0; i < modelListeners.size(); i++) {
-			((IModelListener) modelListeners.get(i)).modelChanged(objects,
-					type, property);
-		}
-	}
-	public Object[] getContents() {
-		return objects.toArray();
-	}
-	private void initialize() {
-		objects = new ArrayList();
-		NamedObject[] objects = {
-				new TypeOne("TypeOne instance 1", 2, true, "Some text"),
-				new TypeOne("TypeOne instance 2", 1, false, "Different text"),
-				new TypeOne("TypeOne instance 3", 3, true, "Text"),
-				new TypeOne("TypeOne instance 4", 0, false, "Longer text"),
-				new TypeOne("TypeOne instance 5", 1, true, "Sample"),
-				new TypeTwo("TypeTwo instance 1", false, true),
-				new TypeTwo("TypeTwo instance 2", true, false)};
-		add(objects, false);
-	}
-	public void add(NamedObject[] objs, boolean notify) {
-		for (int i = 0; i < objs.length; i++) {
-			objects.add(objs[i]);
-			objs[i].setModel(this);
-		}
-		if (notify)
-			fireModelChanged(objs, IModelListener.ADDED, "");
-	}
-	public void remove(NamedObject[] objs, boolean notify) {
-		for (int i = 0; i < objs.length; i++) {
-			objects.remove(objs[i]);
-			objs[i].setModel(null);
-		}
-		if (notify)
-			fireModelChanged(objs, IModelListener.REMOVED, "");
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SingleHeaderEditor.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SingleHeaderEditor.java
deleted file mode 100644
index 7245743..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SingleHeaderEditor.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ControlContribution;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.SharedHeaderFormEditor;
-import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
-import org.eclipse.ui.forms.widgets.Form;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-/**
- * A form editor that has several pages but only one stable header.
- */
-public class SingleHeaderEditor extends SharedHeaderFormEditor {
-	/**
-	 * 
-	 */
-	public SingleHeaderEditor() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormEditor#createToolkit(org.eclipse.swt.widgets.Display)
-	 */
-	protected FormToolkit createToolkit(Display display) {
-		// Create a toolkit that shares colors between editors.
-		return new FormToolkit(ExamplesPlugin.getDefault().getFormColors(
-				display));
-	}
-
-	protected void createHeaderContents(IManagedForm headerForm) {
-		final ScrolledForm sform = headerForm.getForm();
-		//sform.setText("Shared header for all the pages");
-		getToolkit().decorateFormHeading(sform.getForm());
-		addToolBar(sform.getForm());
-		sform.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(
-				ISharedImages.IMG_OBJ_FILE));
-		headerForm.getForm().getDisplay().timerExec(5000, new Runnable() {
-			public void run() {
-				sform.setText("<Another text>");
-			}
-		});
-		//sform.setMessage("Static text", 0);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
-	 */
-	protected void addPages() {
-		try {
-			addPage(new HeadlessPage(this, 1));
-			addPage(new HeadlessPage(this, 2));
-			addPage(new HeadlessPage(this, 3));
-		} catch (PartInitException e) {
-			//
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	private void addToolBar(Form form) {
-		Action haction = new Action("hor", Action.AS_RADIO_BUTTON) {
-			public void run() {
-			}
-		};
-		haction.setChecked(true);
-		haction.setToolTipText("Horizontal orientation");
-		haction.setImageDescriptor(ExamplesPlugin.getDefault()
-				.getImageRegistry()
-				.getDescriptor(ExamplesPlugin.IMG_HORIZONTAL));
-		Action vaction = new Action("ver", Action.AS_RADIO_BUTTON) {
-			public void run() {
-			}
-		};
-		vaction.setChecked(false);
-		vaction.setToolTipText("Vertical orientation");
-		vaction.setImageDescriptor(ExamplesPlugin.getDefault()
-				.getImageRegistry().getDescriptor(ExamplesPlugin.IMG_VERTICAL));
-		ControlContribution save = new ControlContribution("save") {
-			protected Control createControl(Composite parent) {
-				Button saveButton = new Button(parent, SWT.PUSH);
-				saveButton.setText("Save");
-				return saveButton;
-			}
-		};
-		form.getToolBarManager().add(haction);
-		form.getToolBarManager().add(vaction);
-		form.getToolBarManager().add(save);
-		form.getToolBarManager().update(true);
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ThirdPage.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ThirdPage.java
deleted file mode 100644
index c48b28c..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ThirdPage.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.*;
-import org.eclipse.ui.forms.events.*;
-import org.eclipse.ui.forms.widgets.*;
-/**
- * @author dejan
- * 
- * To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Generation - Code and Comments
- */
-public class ThirdPage extends FormPage {
-	/**
-	 * @param id
-	 * @param title
-	 */
-	public ThirdPage(FormEditor editor) {
-		super(editor, "third", "Flow Page");
-	}
-	protected void createFormContent(IManagedForm managedForm) {
-		ScrolledForm form = managedForm.getForm();
-		//FormToolkit toolkit = managedForm.getToolkit();
-		form.setText("Form with wrapped controls");
-		ColumnLayout layout = new ColumnLayout();
-		layout.topMargin = 0;
-		layout.bottomMargin = 5;
-		layout.leftMargin = 10;
-		layout.rightMargin = 10;
-		layout.horizontalSpacing = 10;
-		layout.verticalSpacing = 10;
-		layout.maxNumColumns = 4;
-		layout.minNumColumns = 1;
-		form.getBody().setLayout(layout);
-		//form.getBody().setBackground(
-		//		form.getBody().getDisplay().getSystemColor(SWT.COLOR_GREEN));
-		createSectionWithLinks(managedForm, "Link Section",
-				"An example of a section with links", 2);
-		createSectionWithLinks(managedForm, "Link Section",
-				"An example of a section with links", 2);
-		createMixedSection(managedForm, "Mixed Section",
-				"An example of a section with both links and form controls");
-		createSectionWithLinks(managedForm, "Link Section",
-				"An example of a section with links", 4);
-		createSectionWithControls(managedForm, "Control Section",
-				"An example of a section with form controls");
-		createSectionWithLinks(managedForm, "Sample Section",
-				"An example of a section with links", 3);
-		createSectionWithLinks(managedForm, "Sample Section",
-				"An example of a section with links", 5);
-		createMixedSection(managedForm, "Mixed Section",
-				"An example of a section with both links and form controls");
-		createSectionWithLinks(managedForm, "Sample Section",
-				"An example of a section with links", 2);
-		createSectionWithControls(managedForm, "Control Section",
-				"An example of a section with links");
-		createSectionWithLinks(managedForm, "Sample Section",
-				"An example of a section with links", 4);
-		createSectionWithLinks(managedForm, "Sample Section",
-				"An example of a section with links", 2);
-		createMixedSection(managedForm, "Mixed Section",
-				"An example of a section with both links and form controls");
-		createSectionWithLinks(managedForm, "Sample Section",
-				"An example of a section with links", 2);
-		createSectionWithControls(managedForm, "Control Section",
-				"An example of a section with form controls");
-	}
-	private void createSectionWithLinks(IManagedForm mform, String title,
-			String desc, int nlinks) {
-		Composite client = createSection(mform, title, desc, 1);
-		FormToolkit toolkit = mform.getToolkit();
-		for (int i = 1; i <= nlinks; i++)
-			toolkit.createHyperlink(client, "Hyperlink text " + i, SWT.WRAP);
-	}
-	private void createSectionWithControls(IManagedForm mform, String title,
-			String desc) {
-		Composite client = createSection(mform, title, desc, 1);
-		FormToolkit toolkit = mform.getToolkit();
-		toolkit.createButton(client, "A radio button 1", SWT.RADIO);
-		toolkit.createButton(client, "A radio button 2", SWT.RADIO);
-		toolkit.createButton(client, "A radio button with a longer text",
-				SWT.RADIO);
-		toolkit.createButton(client, "A checkbox button", SWT.CHECK);
-	}
-	private void createMixedSection(IManagedForm mform, String title, String desc) {
-		Composite client = createSection(mform, title, desc, 2);
-		FormToolkit toolkit = mform.getToolkit();
-		Hyperlink link = toolkit.createHyperlink(client,
-				"A longer hyperlink text example", SWT.WRAP);
-		GridData gd = new GridData();
-		gd.horizontalSpan = 2;
-		link.setLayoutData(gd);
-		link = toolkit.createHyperlink(client, "Another hyperlink text",
-				SWT.WRAP);
-		gd = new GridData();
-		gd.horizontalSpan = 2;
-		link.setLayoutData(gd);
-		toolkit.createLabel(client, "A text label:");
-		Text text = toolkit.createText(client, "", SWT.SINGLE);
-		text.setText("Sample text");
-		text.setEnabled(false);
-		gd = new GridData();
-		gd.widthHint = 150;
-		text.setLayoutData(gd);
-		toolkit.paintBordersFor(client);
-	}
-	private Composite createSection(IManagedForm mform, String title,
-			String desc, int numColumns) {
-		final ScrolledForm form = mform.getForm();
-		FormToolkit toolkit = mform.getToolkit();
-		Section section = toolkit.createSection(form.getBody(), Section.TWISTIE
-				| Section.SHORT_TITLE_BAR | Section.DESCRIPTION | Section.EXPANDED);
-		section.setText(title);
-		section.setDescription(desc);
-		Composite client = toolkit.createComposite(section);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = layout.marginHeight = 0;
-		layout.numColumns = numColumns;
-		client.setLayout(layout);
-		section.setClient(client);
-		section.addExpansionListener(new ExpansionAdapter() {
-			public void expansionStateChanged(ExpansionEvent e) {
-				form.reflow(false);
-			}
-		});
-		return client;
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeOne.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeOne.java
deleted file mode 100644
index 45dc98c..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeOne.java
+++ /dev/null
@@ -1,59 +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 Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class TypeOne extends NamedObject {
-	public static final String P_CHOICE="choice";
-	public static final String P_FLAG="flag";
-	public static final String P_TEXT="text";
-	public static final String [] CHOICES = {
-			"Choice 1", "Choice 2", "Choice 3", "Choice 4" };
-	private int choice=0;
-	private String text;
-	private boolean flag;
-
-	/**
-	 * @param name
-	 */
-	public TypeOne(String name, int choice, boolean flag, String text) {
-		super(name);
-		this.flag = flag;
-		this.text = text;
-		this.choice = choice;
-	}
-	public int getChoice() {
-		return choice;
-	}
-	public void setChoice(int choice) {
-		this.choice = choice;
-		model.fireModelChanged(new Object[] {this}, IModelListener.CHANGED, P_CHOICE);
-	}
-	public boolean getFlag() {
-		return flag;
-	}
-	public void setFlag(boolean flag) {
-		this.flag = flag;
-		model.fireModelChanged(new Object[] {this}, IModelListener.CHANGED, P_FLAG);
-	}
-	public String getText() {
-		return text;
-	}
-	public void setText(String text) {
-		this.text = text;
-		model.fireModelChanged(new Object[] {this}, IModelListener.CHANGED, P_TEXT);
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeOneDetailsPage.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeOneDetailsPage.java
deleted file mode 100644
index 94f1681..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeOneDetailsPage.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.*;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.forms.*;
-import org.eclipse.ui.forms.widgets.*;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class TypeOneDetailsPage implements IDetailsPage {
-	private IManagedForm mform;
-	private TypeOne input;
-	private Button [] choices;
-	private Button flag;
-	private Text text;
-	private static final String RTEXT_DATA =
-			"<form><p>An example of a free-form text that should be "+
-			"wrapped below the section with widgets.</p>"+
-			"<p>It can contain simple tags like <a>links</a> and <b>bold text</b>.</p></form>";
-	
-	public TypeOneDetailsPage() {
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#initialize(org.eclipse.ui.forms.IManagedForm)
-	 */
-	public void initialize(IManagedForm mform) {
-		this.mform = mform;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createContents(Composite parent) {
-		TableWrapLayout layout = new TableWrapLayout();
-		layout.topMargin = 5;
-		layout.leftMargin = 5;
-		layout.rightMargin = 2;
-		layout.bottomMargin = 2;
-		parent.setLayout(layout);
-
-		FormToolkit toolkit = mform.getToolkit();
-		Section s1 = toolkit.createSection(parent, Section.DESCRIPTION);
-		s1.marginWidth = 10;
-		s1.setText("Type One Details");
-		s1.setDescription("Set the properties of the selected TypeOne object.");
-		TableWrapData td = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);
-		td.grabHorizontal = true;
-		s1.setLayoutData(td);
-		toolkit.createCompositeSeparator(s1);
-		Composite client = toolkit.createComposite(s1);
-		GridLayout glayout = new GridLayout();
-		glayout.marginWidth = glayout.marginHeight = toolkit.getBorderStyle()==SWT.BORDER?0:2;
-		glayout.numColumns = 2;
-		client.setLayout(glayout);
-		//client.setBackground(client.getDisplay().getSystemColor(SWT.COLOR_CYAN));
-		
-		SelectionListener choiceListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				Integer value = (Integer)e.widget.getData();
-				if (input!=null) {
-					input.setChoice(value.intValue());
-				}
-			}
-		};
-		GridData gd;
-		choices = new Button[TypeOne.CHOICES.length];
-		for (int i=0; i<TypeOne.CHOICES.length; i++) {
-			choices[i] = toolkit.createButton(client, TypeOne.CHOICES[i], SWT.RADIO);
-			choices[i].setData(new Integer(i));
-			choices[i].addSelectionListener(choiceListener);
-			gd = new GridData();
-			gd.horizontalSpan = 2;
-			choices[i].setLayoutData(gd);
-		}
-		createSpacer(toolkit, client, 2);
-		flag = toolkit.createButton(client, "Value of the flag property", SWT.CHECK);
-		flag.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (input!=null)
-					input.setFlag(flag.getSelection());
-			}
-		});
-		gd = new GridData();
-		gd.horizontalSpan = 2;
-		flag.setLayoutData(gd);
-		createSpacer(toolkit, client, 2);
-		
-		toolkit.createLabel(client, "Text property:");
-		text = toolkit.createText(client, "", SWT.SINGLE);
-		text.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				if (input!=null)
-					input.setText(text.getText());
-			}
-		});
-		gd = new GridData(GridData.FILL_HORIZONTAL|GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.widthHint = 10;
-		text.setLayoutData(gd);
-		
-		createSpacer(toolkit, client, 2);
-		
-		FormText rtext = toolkit.createFormText(parent, false);
-		rtext.setText(RTEXT_DATA, true, false);
-		td = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);
-		td.grabHorizontal = true;
-		rtext.setLayoutData(td);
-		
-		toolkit.paintBordersFor(client);
-		s1.setClient(client);
-	}
-	private void createSpacer(FormToolkit toolkit, Composite parent, int span) {
-		Label spacer = toolkit.createLabel(parent, "");
-		GridData gd = new GridData();
-		gd.horizontalSpan = span;
-		spacer.setLayoutData(gd);
-	}
-	private void update() {
-		for (int i=0; i<TypeOne.CHOICES.length; i++) {
-			choices[i].setSelection(input!=null && input.getChoice()==i);
-		}
-		flag.setSelection(input!=null && input.getFlag());
-		text.setText(input!=null && input.getText()!=null?input.getText():"");
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#inputChanged(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void selectionChanged(IFormPart part, ISelection selection) {
-		IStructuredSelection ssel = (IStructuredSelection)selection;
-		if (ssel.size()==1) {
-			input = (TypeOne)ssel.getFirstElement();
-		}
-		else
-			input = null;
-		update();
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#commit()
-	 */
-	public void commit(boolean onSave) {
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#setFocus()
-	 */
-	public void setFocus() {
-		choices[0].setFocus();
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#dispose()
-	 */
-	public void dispose() {
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#isDirty()
-	 */
-	public boolean isDirty() {
-		return false;
-	}
-	public boolean isStale() {
-		return false;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#refresh()
-	 */
-	public void refresh() {
-		update();
-	}
-	public boolean setFormInput(Object input) {
-		return false;
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeTwo.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeTwo.java
deleted file mode 100644
index c1093c0..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeTwo.java
+++ /dev/null
@@ -1,47 +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 Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class TypeTwo extends NamedObject {
-	public static final String P_FLAG1="flag1";
-	public static final String P_FLAG2="flag2";
-	private boolean flag1;
-	private boolean flag2;
-
-	/**
-	 * @param name
-	 */
-	public TypeTwo(String name, boolean flag1, boolean flag2) {
-		super(name);
-		this.flag1 = flag1;
-		this.flag2 = flag2;
-	}
-	public boolean getFlag1() {
-		return flag1;
-	}
-	public boolean getFlag2() {
-		return flag2;
-	}
-	public void setFlag1(boolean flag1) {
-		this.flag1 = flag1;
-		model.fireModelChanged(new Object[] {this}, IModelListener.CHANGED, P_FLAG1);
-	}
-	public void setFlag2(boolean flag2) {
-		this.flag2 = flag2;
-		model.fireModelChanged(new Object[] {this}, IModelListener.CHANGED, P_FLAG2);
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeTwoDetailsPage.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeTwoDetailsPage.java
deleted file mode 100644
index 2988e28..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeTwoDetailsPage.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.internal.rcp;
-
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.*;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.forms.*;
-import org.eclipse.ui.forms.widgets.*;
-
-/**
- * @author dejan
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class TypeTwoDetailsPage implements IDetailsPage {
-	private IManagedForm mform;
-	private TypeTwo input;
-	private Button flag1;
-	private Button flag2;
-	
-	public TypeTwoDetailsPage() {
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#initialize(org.eclipse.ui.forms.IManagedForm)
-	 */
-	public void initialize(IManagedForm mform) {
-		this.mform = mform;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createContents(Composite parent) {
-		TableWrapLayout layout = new TableWrapLayout();
-		layout.topMargin = 5;
-		layout.leftMargin = 5;
-		layout.rightMargin = 2;
-		//layout.bottomMargin = 2;
-		parent.setLayout(layout);
-
-		FormToolkit toolkit = mform.getToolkit();
-		Section s1 = toolkit.createSection(parent, Section.DESCRIPTION);
-		s1.marginWidth = 10;
-		s1.setText("Type Two Details");
-		s1.setDescription("Set the properties of the selected TypeTwo object.");
-		TableWrapData td = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);
-		td.grabHorizontal = true;
-		s1.setLayoutData(td);
-		toolkit.createCompositeSeparator(s1);
-		Composite client = toolkit.createComposite(s1);
-		//client.setBackground(client.getDisplay().getSystemColor(SWT.COLOR_MAGENTA));
-		GridLayout glayout = new GridLayout();
-		glayout.marginWidth = glayout.marginHeight = 0;
-		client.setLayout(glayout);
-		
-		flag1 = toolkit.createButton(client, "Value of the flag1 property", SWT.CHECK);
-		flag1.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (input!=null)
-					input.setFlag1(flag1.getSelection());
-			}
-		});
-		
-		flag2 = toolkit.createButton(client, "Value of the flag2 property", SWT.CHECK);
-		flag2.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (input!=null)
-					input.setFlag2(flag2.getSelection());
-			}
-		});
-		s1.setClient(client);
-	}
-	private void update() {
-		flag1.setSelection(input!=null && input.getFlag1());
-		flag2.setSelection(input!=null && input.getFlag2());
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#inputChanged(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void selectionChanged(IFormPart part, ISelection selection) {
-		IStructuredSelection ssel = (IStructuredSelection)selection;
-		if (ssel.size()==1) {
-			input = (TypeTwo)ssel.getFirstElement();
-		}
-		else
-			input = null;
-		update();
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#commit()
-	 */
-	public void commit(boolean onSave) {
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#setFocus()
-	 */
-	public void setFocus() {
-		flag1.setFocus();
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#dispose()
-	 */
-	public void dispose() {
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#isDirty()
-	 */
-	public boolean isDirty() {
-		return false;
-	}
-	
-	public boolean isStale() {
-		return false;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.IDetailsPage#refresh()
-	 */
-	public void refresh() {
-		update();
-	}
-	public boolean setFormInput(Object input) {
-		return false;
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/index.xml b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/index.xml
deleted file mode 100644
index ed6aa1c..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/index.xml
+++ /dev/null
@@ -1,153 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<form>
-<p><control href="node"/></p>
-<p>
-To check for updates for features you have installed, 
-go to the <a href="action1">My Eclipse 1</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search. 
-Now we <b>will</b> add an 
-<img href="image1"/> 
-image here. Just
- to show how wrapping should apply to images when they are 
- larger than the regular text.
-</p>
-<p>New addition: controls in the text</p>
-<p><control href="control1" width="300"/></p>
-<p>Now we will show an image link: <a href="action1"><img href="image1"/></a></p>
-<p>And this is image and text as a link: <a href="action1"><img href="image1"/>Some link text</a></p>
-<li style="text" value="1.">To check for updates for features you have installed, 
-go to the <a href="action2">My Eclipse 2</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search.</li>
-<li style="text" value="2.">This is the item number 2.</li>
-<li style="text" value="3.">This is the item number 3.</li>
-<li>This is the bullet item.</li>
-<li>This is another bullet item.</li>
-<p>
-To check for updates for features you have installed, 
-go to the <a href="action1">My Eclipse 1</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search. 
-Now we <b>will</b> add an 
-<img href="image1"/> 
-image here. Just
- to show how wrapping should apply to images when they are 
- larger than the regular text.
-</p>
-<p>Now we will show an image link: <a href="action1"><img href="image1"/></a></p>
-<p>And this is image and text as a link: <a href="action1"><img href="image1"/>Some link text</a></p>
-<li style="text" value="1.">To check for updates for features you have installed, 
-go to the <a href="action2">My Eclipse 2</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search.</li>
-<li style="text" value="2.">This is the item number 2.</li>
-<li style="text" value="3.">This is the item number 3.</li>
-<li>This is the bullet item.</li>
-<li>This is another bullet item.</li>
-<p>
-To check for updates for features you have installed, 
-go to the <a href="action1">My Eclipse 1</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search. 
-Now we <b>will</b> add an 
-<img href="image1"/> 
-image here. Just
- to show how wrapping should apply to images when they are 
- larger than the regular text.
-</p>
-<p>Now we will show an image link: <a href="action1"><img href="image1"/></a></p>
-<p>And this is image and text as a link: <a href="action1"><img href="image1"/>Some link text</a></p>
-<li style="text" value="1.">To check for updates for features you have installed, 
-go to the <a href="action2">My Eclipse 2</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search.</li>
-<li style="text" value="2.">This is the item number 2.</li>
-<li style="text" value="3.">This is the item number 3.</li>
-<li>This is the bullet item.</li>
-<li>This is another bullet item.</li>
-<p>
-To check for updates for features you have installed, 
-go to the <a href="action1">My Eclipse 1</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search. 
-Now we <b>will</b> add an 
-<img href="image1"/> 
-image here. Just
- to show how wrapping should apply to images when they are 
- larger than the regular text.
-</p>
-<p>Now we will show an image link: <a href="action1"><img href="image1"/></a></p>
-<p>And this is image and text as a link: <a href="action1"><img href="image1"/>Some link text</a></p>
-<li style="text" value="1.">To check for updates for features you have installed, 
-go to the <a href="action2">My Eclipse 2</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search.</li>
-<li style="text" value="2.">This is the item number 2.</li>
-<li style="text" value="3.">This is the item number 3.</li>
-<li>This is the bullet item.</li>
-<li>This is another bullet item.</li>
-<p>
-To check for updates for features you have installed, 
-go to the <a href="action1">My Eclipse 1</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search. 
-Now we <b>will</b> add an 
-<img href="image1"/> 
-image here. Just
- to show how wrapping should apply to images when they are 
- larger than the regular text.
-</p>
-<p>Now we will show an image link: <a href="action1"><img href="image1"/></a></p>
-<p>And this is image and text as a link: <a href="action1"><img href="image1"/>Some link text</a></p>
-<li style="text" value="1.">To check for updates for features you have installed, 
-go to the <a href="action2">My Eclipse 2</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search.</li>
-<li style="text" value="2.">This is the item number 2.</li>
-<li style="text" value="3.">This is the item number 3.</li>
-<li>This is the bullet item.</li>
-<li>This is another bullet item.</li>
-<p>
-To check for updates for features you have installed, 
-go to the <a href="action1">My Eclipse 1</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search. 
-Now we <b>will</b> add an 
-<img href="image1"/> 
-image here. Just
- to show how wrapping should apply to images when they are 
- larger than the regular text.
-</p>
-<p>Now we will show an image link: <a href="action1"><img href="image1"/></a></p>
-<p>And this is image and text as a link: <a href="action1"><img href="image1"/>Some link text</a></p>
-<li style="text" value="1.">To check for updates for features you have installed, 
-go to the <a href="action2">My Eclipse 2</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search.</li>
-<li style="text" value="2.">This is the item number 2.</li>
-<li style="text" value="3.">This is the item number 3.</li>
-<li>This is the bullet item.</li>
-<li>This is another bullet item.</li>
-<p>
-To check for updates for features you have installed, 
-go to the <a href="action1">My Eclipse 1</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search. 
-Now we <b>will</b> add an 
-<img href="image1"/> 
-image here. Just
- to show how wrapping should apply to images when they are 
- larger than the regular text.
-</p>
-<p>Now we will show an image link: <a href="action1"><img href="image1"/></a></p>
-<p>And this is image and text as a link: <a href="action1"><img href="image1"/>Some link text</a></p>
-<li style="text" value="1.">To check for updates for features you have installed, 
-go to the <a href="action2">My Eclipse 2</a> and select 
-<b>Available Updates</b> folder. <b>Search page</b> will 
-be shown allowing you to initiate and customize the search.</li>
-<li style="text" value="2.">This is the item number 2.</li>
-<li style="text" value="3.">This is the item number 3.</li>
-<li>This is the bullet item.</li>
-<li>This is another bullet item.</li>
-</form>
\ No newline at end of file
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/views/FormView.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/views/FormView.java
deleted file mode 100644
index df7bf12..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/views/FormView.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.forms.examples.views;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-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.Text;
-import org.eclipse.ui.forms.IFormColors;
-import org.eclipse.ui.forms.events.ExpansionAdapter;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-import org.eclipse.ui.part.ViewPart;
-
-public class FormView extends ViewPart {
-	private FormToolkit toolkit;
-	private ScrolledForm form;
-	/**
-	 * The constructor.
-	 */
-	public FormView() {
-	}
-	/**
-	 * This is a callback that will allow us to create the viewer and
-	 * initialize it.
-	 */
-	public void createPartControl(Composite parent) {
-		toolkit = new FormToolkit(parent.getDisplay());
-		form = toolkit.createScrolledForm(parent);
-		form.setText("Hello, Eclipse Forms");
-		TableWrapLayout layout = new TableWrapLayout();
-		form.getBody().setLayout(layout);
-		
-		Hyperlink link = toolkit.createHyperlink(form.getBody(), "Click here.",
-				SWT.WRAP);
-		link.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				System.out.println("Link activated!");
-			}
-		});
-		link.setText("This is an example of a form that is much longer and will need to wrap.");
-		layout.numColumns = 2;
-		TableWrapData td = new TableWrapData();
-		td.colspan = 2;
-		link.setLayoutData(td);
-		toolkit.createLabel(form.getBody(), "Text field label:");
-		Text text = toolkit.createText(form.getBody(), "");
-		td = new TableWrapData(TableWrapData.FILL_GRAB);
-		text.setLayoutData(td);
-		Button button = toolkit.createButton(form.getBody(),
-				"An example of a checkbox in a form", SWT.CHECK);
-		td = new TableWrapData();
-		td.colspan = 2;
-		button.setLayoutData(td);
-		
-		ImageHyperlink ih = toolkit.createImageHyperlink(form.getBody(), SWT.NULL);
-		ih.setText("Image link with no image");
-		ih = toolkit.createImageHyperlink(form.getBody(), SWT.NULL);
-		ih.setImage(ExamplesPlugin.getDefault().getImageRegistry().get(ExamplesPlugin.IMG_SAMPLE));
-		ih.setText("Link with image and text");
-		
-		ExpandableComposite ec = toolkit.createExpandableComposite(form.getBody(), ExpandableComposite.TREE_NODE|ExpandableComposite.CLIENT_INDENT);
-		ImageHyperlink eci = toolkit.createImageHyperlink(ec, SWT.NULL);
-		eci.setImage(ExamplesPlugin.getDefault().getImageRegistry().get(ExamplesPlugin.IMG_SAMPLE));
-		ec.setTextClient(eci);
-		ec.setText("Expandable Composite title");
-		String ctext = "We will now create a somewhat long text so that "+
-		"we can use it as content for the expandable composite. "+
-		"Expandable composite is used to hide or show the text using the "+
-		"toggle control";
-		Label client = toolkit.createLabel(ec, ctext, SWT.WRAP);
-		ec.setClient(client);
-		td = new TableWrapData();
-		td.colspan = 2;
-		ec.setLayoutData(td);
-		ec.addExpansionListener(new ExpansionAdapter() {
-			public void expansionStateChanged(ExpansionEvent e) {
-				form.reflow(true);
-			}
-		});
-		Section section = toolkit.createSection(form.getBody(), Section.DESCRIPTION|Section.TWISTIE|Section.EXPANDED);
-		td = new TableWrapData(TableWrapData.FILL);
-		td.colspan = 2;
-		section.setLayoutData(td);
-		section.addExpansionListener(new ExpansionAdapter() {
-			public void expansionStateChanged(ExpansionEvent e) {
-				form.reflow(true);
-			}
-		});
-		section.setText("Section title");
-		toolkit.createCompositeSeparator(section);
-		section.setDescription("This is the description that goes below the title");
-		Composite sectionClient = toolkit.createComposite(section);
-		sectionClient.setLayout(new GridLayout());
-		button = toolkit.createButton(sectionClient, "Radio 1", SWT.RADIO);
-		button = toolkit.createButton(sectionClient, "Radio 2", SWT.RADIO);
-		section.setClient(sectionClient);
-
-		StringBuffer buf = new StringBuffer();
-		buf.append("<form>");
-		buf.append("<p>");
-		buf.append("Here is some plain text for the text to render; ");
-		buf.append("this text is at <a href=\"http://www.eclipse.org\" nowrap=\"true\">http://www.eclipse.org</a> web site.");
-		buf.append("</p>");
-		buf.append("<p>");
-		buf.append("<span color=\"header\" font=\"header\">This text is in header font and color.</span>");
-		buf.append("</p>");
-		buf.append("<p>This line will contain some <b>bold</b> and some <span font=\"code\">source</span> text. ");
-		buf.append("We can also add <img href=\"image\"/> an image. ");
-		buf.append("</p>");
-		buf.append("<li>A default (bulleted) list item.</li>");
-		buf.append("<li>Another bullet list item.</li>");
-		buf.append("<li style=\"text\" value=\"1.\">A list item with text.</li>");
-		buf.append("<li style=\"text\" value=\"2.\">Another list item with text</li>");
-		buf.append("<li style=\"image\" value=\"image\">List item with an image bullet</li>");
-		buf.append("<li style=\"text\" bindent=\"20\" indent=\"40\" value=\"3.\">A list item with text.</li>");
-		buf.append("<li style=\"text\" bindent=\"20\" indent=\"40\" value=\"4.\">A list item with text.</li>");
-		buf.append("<p>     leading blanks;      more white \n\n new lines   <br/><br/><br/> \n more <b>   bb   </b>  white  . </p>");
-		buf.append("</form>");
-		FormText rtext = toolkit.createFormText(form.getBody(), false);
-		//rtext.setWhitespaceNormalized(false);
-		td = new TableWrapData(TableWrapData.FILL);
-		td.colspan = 2;
-		rtext.setLayoutData(td);
-		rtext.setImage("image", ExamplesPlugin.getDefault().getImageRegistry().get(ExamplesPlugin.IMG_SAMPLE));
-		rtext.setColor("header", toolkit.getColors().getColor(IFormColors.TITLE));
-		rtext.setFont("header", JFaceResources.getHeaderFont());
-		rtext.setFont("code", JFaceResources.getTextFont());
-		rtext.setText(buf.toString(), true, false);
-		rtext.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				System.out.println("Link active: "+e.getHref());
-			}
-		});
-/*		layout.numColumns = 3;
-		Label label;
-		TableWrapData td;
-		
-		label = toolkit.createLabel(form.getBody(), "Some text to put in the first column", SWT.WRAP);
-		label = toolkit.createLabel(form.getBody() ,"Some text to put in the second column and make it a bit longer so that we can see what happens with column distribution. This text must be the longest so that it can get more space allocated to the columns it belongs to.", SWT.WRAP);
-		td = new TableWrapData();
-		td.colspan = 2;
-		label.setLayoutData(td);
-		label = toolkit.createLabel(form.getBody(), "This text will span two rows and should not grow the column.", SWT.WRAP);
-		td = new TableWrapData();
-		td.rowspan = 2;
-		label.setLayoutData(td);
-		label = toolkit.createLabel(form.getBody(), "This text goes into column 2 and consumes only one cell", SWT.WRAP);
-		label.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-		label = toolkit.createLabel(form.getBody(), "This text goes into column 3 and consumes only one cell too", SWT.WRAP);
-		label.setLayoutData(new TableWrapData(TableWrapData.FILL));
-		label = toolkit.createLabel(form.getBody(), "This text goes into column 2 and consumes only one cell", SWT.WRAP);
-		label.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-		label = toolkit.createLabel(form.getBody(), "This text goes into column 3 and consumes only one cell too", SWT.WRAP);
-		label.setLayoutData(new TableWrapData(TableWrapData.FILL));
-		form.getBody().setBackground(form.getBody().getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));*/
-		
-		toolkit.paintBordersFor(form.getBody());
-	}
-	/**
-	 * Passing the focus request to the form.
-	 */
-	public void setFocus() {
-		Control focusControl = form.getDisplay().getFocusControl();
-		if (focusControl!=null) {
-			Composite parent = focusControl.getParent();
-			while (parent!=null) {
-				if (parent==form) {
-					// already have focus
-					return;
-				}
-				parent = parent.getParent();
-			}
-		}
-		form.setFocus();
-	}
-	/**
-	 * Disposes the toolkit
-	 */
-	public void dispose() {
-		toolkit.dispose();
-		super.dispose();
-	}
-}
diff --git a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/views/ShowHelpAction.java b/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/views/ShowHelpAction.java
deleted file mode 100644
index 2484a37..0000000
--- a/examples/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/views/ShowHelpAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.forms.examples.views;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.*;
-
-/**
- * @author dejan
- *
- * TODO To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Style - Code Templates
- */
-public class ShowHelpAction implements IWorkbenchWindowActionDelegate {
-	private IWorkbenchWindow window;
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		this.window = window;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		try {
-			window.getActivePage().showView("org.eclipse.ui.forms.examples.helpView");
-		}
-		catch (PartInitException e) {
-			System.out.println(e);
-		}
-	}
-
-	/* (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) {
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/.classpath b/tests/org.eclipse.jface.tests.databinding.conformance/.classpath
deleted file mode 100644
index ce73933..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/.project b/tests/org.eclipse.jface.tests.databinding.conformance/.project
deleted file mode 100644
index 3094c2c..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jface.tests.databinding.conformance</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.jface.tests.databinding.conformance/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 383af26..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,355 +0,0 @@
-#Mon Dec 03 13:56:42 EST 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=80
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=tab
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.jface.tests.databinding.conformance/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 8ee15567..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,116 +0,0 @@
-#Mon Dec 03 13:56:42 EST 2007
-cleanup.add_default_serial_version_id=true
-cleanup.add_generated_serial_version_id=false
-cleanup.add_missing_annotations=true
-cleanup.add_missing_deprecated_annotations=true
-cleanup.add_missing_methods=false
-cleanup.add_missing_nls_tags=false
-cleanup.add_missing_override_annotations=true
-cleanup.add_serial_version_id=false
-cleanup.always_use_blocks=true
-cleanup.always_use_parentheses_in_expressions=false
-cleanup.always_use_this_for_non_static_field_access=false
-cleanup.always_use_this_for_non_static_method_access=false
-cleanup.convert_to_enhanced_for_loop=false
-cleanup.correct_indentation=false
-cleanup.format_source_code=false
-cleanup.format_source_code_changes_only=false
-cleanup.make_local_variable_final=true
-cleanup.make_parameters_final=false
-cleanup.make_private_fields_final=true
-cleanup.make_variable_declarations_final=false
-cleanup.never_use_blocks=false
-cleanup.never_use_parentheses_in_expressions=true
-cleanup.organize_imports=false
-cleanup.qualify_static_field_accesses_with_declaring_class=false
-cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-cleanup.qualify_static_member_accesses_with_declaring_class=true
-cleanup.qualify_static_method_accesses_with_declaring_class=false
-cleanup.remove_private_constructors=true
-cleanup.remove_trailing_whitespaces=false
-cleanup.remove_trailing_whitespaces_all=true
-cleanup.remove_trailing_whitespaces_ignore_empty=false
-cleanup.remove_unnecessary_casts=true
-cleanup.remove_unnecessary_nls_tags=true
-cleanup.remove_unused_imports=true
-cleanup.remove_unused_local_variables=false
-cleanup.remove_unused_private_fields=true
-cleanup.remove_unused_private_members=false
-cleanup.remove_unused_private_methods=true
-cleanup.remove_unused_private_types=true
-cleanup.sort_members=false
-cleanup.sort_members_all=false
-cleanup.use_blocks=false
-cleanup.use_blocks_only_for_return_and_throw=false
-cleanup.use_parentheses_in_expressions=false
-cleanup.use_this_for_non_static_field_access=false
-cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-cleanup.use_this_for_non_static_method_access=false
-cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-cleanup_profile=org.eclipse.jdt.ui.default.eclipse_clean_up_profile
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=false
-formatter_profile=org.eclipse.jdt.ui.default.eclipse_profile
-formatter_settings_version=11
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.ignorelowercasenames=true
-org.eclipse.jdt.ui.importorder=java;javax;org;com;
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.ondemandthreshold=99
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.staticondemandthreshold=99
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} The ${bare_field_name} to set.\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n ******************************************************************************/\r\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @since 3.2\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template></templates>
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.format_source_code=false
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=false
-sp_cleanup.organize_imports=true
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=false
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/.settings/org.eclipse.pde.prefs b/tests/org.eclipse.jface.tests.databinding.conformance/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 12a7331..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,18 +0,0 @@
-#Mon Dec 03 13:56:42 EST 2007
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=0
-compilers.p.illegal-att-value=0
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=2
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/META-INF/MANIFEST.MF b/tests/org.eclipse.jface.tests.databinding.conformance/META-INF/MANIFEST.MF
deleted file mode 100644
index d18d64f..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,24 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jface.tests.databinding.conformance
-Bundle-Version: 1.1.0
-Require-Bundle: org.junit,
- org.eclipse.core.databinding,
- org.eclipse.jface.databinding,
- org.eclipse.swt,
- org.eclipse.core.runtime
-Bundle-Vendor: %providerName
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-Localization: plugin
-Export-Package: org.eclipse.jface.databinding.conformance;uses:="org.eclipse.core.databinding.observable,org.eclipse.jface.databinding.conformance.delegate,junit.framework",
- org.eclipse.jface.databinding.conformance.delegate,
- org.eclipse.jface.databinding.conformance.swt,
- org.eclipse.jface.databinding.conformance.util;
-  uses:="org.eclipse.core.databinding.observable.map,
-   org.eclipse.jface.databinding.conformance.delegate,
-   org.eclipse.core.databinding.observable,
-   org.eclipse.core.databinding.observable.list,
-   org.eclipse.core.databinding.observable.value,
-   junit.framework,
-   org.eclipse.core.databinding.observable.set"
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/about.html b/tests/org.eclipse.jface.tests.databinding.conformance/about.html
deleted file mode 100644
index d42b3ce..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/build.properties b/tests/org.eclipse.jface.tests.databinding.conformance/build.properties
deleted file mode 100644
index cc15552..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = .,\
-               META-INF/,\
-               plugin.properties,\
-               about.html
-output.databinding.jar = bin/
-src.includes = about.html
-source.. = src/
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/plugin.properties b/tests/org.eclipse.jface.tests.databinding.conformance/plugin.properties
deleted file mode 100644
index 4e17d68..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName = JFace Data Binding Conformance Tests
-providerName = Eclipse.org
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/MutableObservableCollectionContractTest.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/MutableObservableCollectionContractTest.java
deleted file mode 100644
index ba34da5..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/MutableObservableCollectionContractTest.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bugs 208858, 213145
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance;
-
-import java.util.Arrays;
-import java.util.Collections;
-
-import junit.framework.Test;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.jface.databinding.conformance.delegate.IObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-import org.eclipse.jface.databinding.conformance.util.SuiteBuilder;
-
-/**
- * Mutability tests for IObservableCollection.
- * <p>
- * This class is experimental and can change at any time. It is recommended to
- * not subclass or assume the test names will not change. The only API that is
- * guaranteed to not change are the constructors. The tests will remain public
- * and not final in order to allow for consumers to turn off a test if needed by
- * subclassing.
- * </p>
- * 
- * @since 3.2
- */
-public class MutableObservableCollectionContractTest extends ObservableDelegateTest {
-	private IObservableCollectionContractDelegate delegate;
-
-	private IObservableCollection collection;
-
-	public MutableObservableCollectionContractTest(
-			IObservableCollectionContractDelegate delegate) {
-		super(delegate);
-		this.delegate = delegate;
-	}
-
-	public MutableObservableCollectionContractTest(String name,
-			IObservableCollectionContractDelegate delegate) {
-		super(name, delegate);
-		this.delegate = delegate;
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		collection = (IObservableCollection) super.getObservable();
-	}
-
-	public void testAdd_ChangeEvent() throws Exception {
-		assertChangeEventFired(new Runnable() {
-			public void run() {
-				collection.add(delegate.createElement(collection));
-			}
-		}, "Collection.add(Object)", collection);
-	}
-	
-	public void testAdd_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				collection.add(delegate.createElement(collection));
-			}
-		}, (CurrentRealm) collection.getRealm());
-	}
-
-	public void testAdd_ChangeEventFiredAfterElementIsAdded() throws Exception {
-		final Object element = delegate.createElement(collection);
-
-		assertContainsDuringChangeEvent(new Runnable() {
-			public void run() {
-				collection.add(element);
-			}
-		}, "Collection.add(Object)", collection, element);
-	}
-
-	public void testAddAll_ChangeEvent() throws Exception {
-		assertChangeEventFired(new Runnable() {
-			public void run() {
-				collection.addAll(Arrays.asList(new Object[] { delegate
-						.createElement(collection) }));
-			}
-		}, "Collection.addAll(Collection)", collection);
-	}
-	
-	public void testAddAll_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				collection.addAll(Arrays.asList(new Object[] { delegate
-						.createElement(collection) }));
-			}
-		}, (CurrentRealm) collection.getRealm());
-	}
-
-	public void testAddAll_ChangeEventFiredAfterElementsAreAdded()
-			throws Exception {
-		final Object element = delegate.createElement(collection);
-
-		assertContainsDuringChangeEvent(new Runnable() {
-			public void run() {
-				collection.addAll(Arrays.asList(new Object[] { element }));
-			}
-		}, "Collection.addAll(Collection)", collection, element);
-	}
-
-	public void testRemove_ChangeEvent() throws Exception {
-		final Object element = delegate.createElement(collection);
-		collection.add(element);
-
-		assertChangeEventFired(new Runnable() {
-			public void run() {
-				collection.remove(element);
-			}
-		}, "Collection.remove(Object)", collection);
-	}
-	
-	public void testRemove_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				collection.remove(delegate.createElement(collection));
-			}
-		}, (CurrentRealm) collection.getRealm());
-	}
-
-	public void testRemove_ChangeEventFiredAfterElementIsRemoved()
-			throws Exception {
-		final Object element = delegate.createElement(collection);
-		collection.add(element);
-
-		assertDoesNotContainDuringChangeEvent(new Runnable() {
-			public void run() {
-				collection.remove(element);
-			}
-		}, "Collection.remove(Object)", collection, element);
-	}
-
-	public void testRemoveAll_ChangeEvent() throws Exception {
-		final Object element = delegate.createElement(collection);
-		collection.add(element);
-
-		assertChangeEventFired(new Runnable() {
-			public void run() {
-				collection.removeAll(Arrays.asList(new Object[] { element }));
-			}
-		}, "Collection.removeAll(Collection)", collection);
-	}
-	
-	public void testRemoveAll_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				collection.removeAll(Arrays.asList(new Object[] { delegate.createElement(collection) }));
-			}
-		}, (CurrentRealm) collection.getRealm());
-	}
-
-	public void testRemoveAll_ChangeEventFiredAfterElementsAreRemoved()
-			throws Exception {
-		final Object element = delegate.createElement(collection);
-		collection.add(element);
-
-		assertDoesNotContainDuringChangeEvent(new Runnable() {
-			public void run() {
-				collection.removeAll(Arrays.asList(new Object[] { element }));
-			}
-		}, "Collection.removeAll(Collection)", collection, element);
-	}
-
-	public void testRemoveAll_NoChange() throws Exception {
-		ChangeEventTracker tracker = ChangeEventTracker.observe(collection);
-		collection.removeAll(Collections.EMPTY_LIST);
-		assertEquals(
-				"List.removeAll on an empty list should not fire a list change event",
-				0, tracker.count);
-	}
-
-	public void testRetainAll_ChangeEvent() throws Exception {
-		final Object element1 = delegate.createElement(collection);
-		collection.add(element1);
-		Object element2 = delegate.createElement(collection);
-		collection.add(element2);
-
-		assertChangeEventFired(new Runnable() {
-			public void run() {
-				collection.retainAll(Arrays.asList(new Object[] { element1 }));
-			}
-
-		}, "Collection.retainAll(Collection)", collection);
-	}
-	
-	public void testRetainAll_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				collection.retainAll(Collections.EMPTY_LIST);
-			}
-		}, (CurrentRealm) collection.getRealm());
-	}
-
-	public void testRetainAll_ChangeEventFiredAfterElementsAreRetained()
-			throws Exception {
-		Object element1 = delegate.createElement(collection);
-		collection.add(element1);
-		Object element2 = delegate.createElement(collection);
-		collection.add(element2);
-
-		// precondition
-		assertTrue(collection.contains(element1));
-		assertTrue(collection.contains(element2));
-
-		ContainsListener listener1 = new ContainsListener(collection, element1)
-				.init();
-		ContainsListener listener2 = new ContainsListener(collection, element2)
-				.init();
-
-		// set contains the the opposite of the expected outcome to ensure they
-		// get set
-		listener1.contains = false;
-		listener2.contains = true;
-
-		collection.retainAll(Arrays.asList(new Object[] { element1 }));
-		assertTrue(
-				formatFail("When Collection.retainAll(...) fires the change event the element should have been retained in the Collection."),
-				listener1.contains);
-		assertFalse(
-				formatFail("When Collection.retainAll(...) fires the change event the element should have been removed from the Collection."),
-				listener2.contains);
-	}
-	
-	public void testRetainAll_NoChangeFiresNoChangeEvent() throws Exception {
-		ChangeEventTracker tracker = ChangeEventTracker.observe(collection);
-		collection.retainAll(Collections.EMPTY_LIST);
-		assertEquals("List.retainAll should not have fired a change event:",
-				0, tracker.count);
-	}
-	
-	public void testClear_ChangeEvent() throws Exception {
-		collection.add(delegate.createElement(collection));
-
-		assertChangeEventFired(new Runnable() {
-			public void run() {
-				collection.clear();
-			}
-		}, "List.clear()", collection);
-	}
-
-	public void testClear_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				collection.clear();
-			}
-		}, (CurrentRealm) collection.getRealm());
-	}
-
-	public void testClear_ChangeEventFiredAfterElementIsRemoved()
-			throws Exception {
-		Object element = delegate.createElement(collection);
-		collection.add(element);
-
-		assertDoesNotContainDuringChangeEvent(new Runnable() {
-			public void run() {
-				collection.clear();
-			}
-		}, "List.clear()", collection, element);
-	}
-
-	/**
-	 * Asserts that a ChangeEvent is fired once when the provided
-	 * <code>runnable</code> is invoked and the source is the provided
-	 * <code>collection</code>.
-	 * 
-	 * @param runnable
-	 * @param methodName
-	 * @param collection
-	 */
-	/* package */void assertChangeEventFired(Runnable runnable,
-			String methodName, IObservableCollection collection) {
-		
-		ChangeEventTracker listener = ChangeEventTracker.observe(collection);
-		runnable.run();
-
-		assertEquals(formatFail(methodName + " should fire one ChangeEvent."), 1,
-				listener.count);
-		assertEquals(
-				formatFail(methodName
-						+ "'s change event observable should be the created Collection."),
-				collection, listener.event.getObservable());
-	}
-
-	/**
-	 * Asserts that when the change event is fired for the action contained in
-	 * the <code>runnable</code> the change will have been applied to the
-	 * <code>collection</code>.
-	 * 
-	 * @param runnable
-	 * @param methodName
-	 * @param collection
-	 * @param elementNotContained
-	 */
-	/* package */void assertDoesNotContainDuringChangeEvent(Runnable runnable,
-			String methodName, IObservableCollection collection,
-			Object elementNotContained) {
-
-		// precondition
-		assertTrue(collection.contains(elementNotContained));
-
-		ContainsListener listener = new ContainsListener(collection,
-				elementNotContained).init();
-		listener.contains = true;
-		collection.remove(elementNotContained);
-		assertFalse(
-				formatFail(new StringBuffer("When ")
-						.append(methodName)
-						.append(
-								" fires a change event the element should have been removed from the Collection.")
-						.toString()), listener.contains);
-	}
-
-	/**
-	 * Asserts that when the change event is fired for the action contained in
-	 * the <code>runnable</code> the change will have been applied to the
-	 * <code>collection</code>.
-	 * 
-	 * @param runnable
-	 * @param methodName
-	 * @param collection
-	 * @param elementContained
-	 */
-	/* package */void assertContainsDuringChangeEvent(Runnable runnable,
-			String methodName, IObservableCollection collection,
-			Object elementContained) {
-		ContainsListener listener = new ContainsListener(collection,
-				elementContained).init();
-
-		// precondition
-		assertFalse(collection.contains(elementContained));
-		runnable.run();
-
-		assertTrue(
-				formatFail(new StringBuffer("When ")
-						.append(methodName)
-						.append(
-								" fires a change event the element should have been added to the Collection.")
-						.toString()), listener.contains);
-	}
-
-	/* package */static class ContainsListener implements IChangeListener {
-		boolean contains;
-
-		final private Object element;
-
-		final private IObservableCollection collection;
-
-		ContainsListener(IObservableCollection collection, Object element) {
-			this.element = element;
-			this.collection = collection;
-		}
-
-		ContainsListener init() {
-			collection.addChangeListener(this);
-			return this;
-		}
-
-		public void handleChange(ChangeEvent event) {
-			contains = collection.contains(element);
-		}
-	}
-
-	public static Test suite(IObservableCollectionContractDelegate delegate) {
-		return new SuiteBuilder().addObservableContractTest(
-				MutableObservableCollectionContractTest.class, delegate)
-				.addObservableContractTest(
-						ObservableCollectionContractTest.class, delegate)
-				.build();
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/MutableObservableListContractTest.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/MutableObservableListContractTest.java
deleted file mode 100644
index 5766875..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/MutableObservableListContractTest.java
+++ /dev/null
@@ -1,623 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bugs 208858, 221351, 213145, 244098
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.Assert;
-import junit.framework.Test;
-
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.jface.databinding.conformance.delegate.IObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
-import org.eclipse.jface.databinding.conformance.util.ListChangeEventTracker;
-import org.eclipse.jface.databinding.conformance.util.SuiteBuilder;
-
-
-/**
- * Mutability tests for IObservableList.
- * 
- * <p>
- * This class is experimental and can change at any time. It is recommended to
- * not subclass or assume the test names will not change. The only API that is
- * guaranteed to not change are the constructors. The tests will remain public
- * and not final in order to allow for consumers to turn off a test if needed by
- * subclassing.
- * </p>
- * 
- * @since 3.2
- */
-public class MutableObservableListContractTest extends
-		MutableObservableCollectionContractTest {
-	private IObservableCollectionContractDelegate delegate;
-
-	private IObservableList list;
-
-	/**
-	 * @param delegate
-	 */
-	public MutableObservableListContractTest(
-			IObservableCollectionContractDelegate delegate) {
-		super(delegate);
-		this.delegate = delegate;
-	}
-
-	public MutableObservableListContractTest(String testName,
-			IObservableCollectionContractDelegate delegate) {
-		super(testName, delegate);
-		this.delegate = delegate;
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		list = (IObservableList) getObservable();
-	}
-
-	public void testAdd_ListChangeEvent() throws Exception {
-		assertListChangeEventFired(new Runnable() {
-			public void run() {
-				list.add(delegate.createElement(list));
-			}
-		}, "List.add(Object)", list);
-	}
-
-	public void testAdd_ListDiffEntry() throws Exception {
-		list.add(delegate.createElement(list));
-		final Object element = delegate.createElement(list);
-
-		assertAddDiffEntry(new Runnable() {
-			public void run() {
-				list.add(element);
-			}
-		}, "List.add(Object)", list, element, 1);
-	}
-
-	public void testAddAtIndex_ChangeEvent() throws Exception {
-		assertChangeEventFired(new Runnable() {
-			public void run() {
-				list.add(0, delegate.createElement(list));
-			}
-		}, "List.add(int, Object)", list);
-	}
-
-	public void testAddAtIndex_ListChangeEvent() throws Exception {
-		assertListChangeEventFired(new Runnable() {
-			public void run() {
-				list.add(0, delegate.createElement(list));
-			}
-		}, "List.add(int, Object)", list);
-	}
-
-	public void testAddAtIndex_ChangeEventFiredAfterElementIsAdded()
-			throws Exception {
-		final Object element = delegate.createElement(list);
-
-		assertContainsDuringChangeEvent(new Runnable() {
-			public void run() {
-				list.add(0, element);
-			}
-		}, "List.add(int, Collection)", list, element);
-	}
-
-	public void testAddAtIndex_ListDiffEntry() throws Exception {
-		list.add(delegate.createElement(list));
-		final Object element = delegate.createElement(list);
-
-		assertAddDiffEntry(new Runnable() {
-			public void run() {
-				list.add(1, element);
-			}
-		}, "List.add(int, Object)", list, element, 1);
-	}
-
-	public void testAddAll_ListChangeEvent() throws Exception {
-		assertListChangeEventFired(new Runnable() {
-			public void run() {
-				list.addAll(Arrays.asList(new Object[] { delegate
-						.createElement(list) }));
-			}
-		}, "List.addAll(Collection", list);
-	}
-
-	public void testAddAll_ListDiffEntry() throws Exception {
-		final Object element = delegate.createElement(list);
-
-		assertAddDiffEntry(new Runnable() {
-			public void run() {
-				list.addAll(Arrays.asList(new Object[] { element }));
-			}
-		}, "List.addAll(Collection)", list, element, 0);
-	}
-
-	public void testAddAll_ListDiffEntry2() throws Exception {
-		list.add(delegate.createElement(list));
-		final Object element = delegate.createElement(list);
-
-		assertAddDiffEntry(new Runnable() {
-			public void run() {
-				list.addAll(Collections.singletonList(element));
-			}
-		}, "List.addAll(Collection)", list, element, 1);
-	}
-
-	public void testAddAllAtIndex_ChangeEvent() throws Exception {
-		assertChangeEventFired(new Runnable() {
-			public void run() {
-				list.addAll(0, Arrays.asList(new Object[] { delegate
-						.createElement(list) }));
-			}
-		}, "List.addAll(int, Collection)", list);
-	}
-
-	public void testAddAllAtIndex_ListChangeEvent() throws Exception {
-		assertListChangeEventFired(new Runnable() {
-			public void run() {
-				list.addAll(0, Arrays.asList(new Object[] { delegate
-						.createElement(list) }));
-			}
-		}, "List.addAll(int, Collection)", list);
-	}
-
-	public void testAddAllAtIndex_ChangeEventFiredAfterElementIsAdded()
-			throws Exception {
-		final Object element = delegate.createElement(list);
-
-		assertContainsDuringChangeEvent(new Runnable() {
-			public void run() {
-				list.addAll(0, Arrays.asList(new Object[] { element }));
-			}
-		}, "List.addAll(int, Collection)", list, element);
-	}
-
-	public void testAddAllAtIndex_ListDiffEntry() throws Exception {
-		list.add(delegate.createElement(list));
-		final Object element = delegate.createElement(list);
-
-		assertAddDiffEntry(new Runnable() {
-			public void run() {
-				list.addAll(1, Arrays.asList(new Object[] { element }));
-			}
-		}, "List.addAll(int, Collection)", list, element, 1);
-	}
-
-	public void testSet_ChangeEvent() throws Exception {
-		list.add(delegate.createElement(list));
-
-		assertChangeEventFired(new Runnable() {
-			public void run() {
-				list.set(0, delegate.createElement(list));
-			}
-		}, "List.set(int, Object)", list);
-	}
-
-	public void testSet_ListChangeEvent() throws Exception {
-		list.add(delegate.createElement(list));
-
-		assertListChangeEventFired(new Runnable() {
-			public void run() {
-				list.set(0, delegate.createElement(list));
-			}
-		}, "List.set(int, Object)", list);
-	}
-
-	public void testSet_ChangeEventFiredAfterElementIsSet() throws Exception {
-		Object element1 = delegate.createElement(list);
-		list.add(element1);
-		final Object element2 = delegate.createElement(list);
-
-		assertContainsDuringChangeEvent(new Runnable() {
-			public void run() {
-				list.set(0, element2);
-			}
-		}, "List.set(int, Object)", list, element2);
-	}
-
-	public void testSet_ListDiffEntry() throws Exception {
-		list.add(delegate.createElement(list));
-		Object oldElement = delegate.createElement(list);
-		list.add(oldElement);
-
-		ListChangeEventTracker listener = ListChangeEventTracker.observe(list);
-
-		Object newElement = delegate.createElement(list);
-		list.set(1, newElement);
-
-		ListDiffEntry[] entries = listener.event.diff.getDifferences();
-		assertEquals(
-				"List.set(int, Object) should result in 2 list diff entries.",
-				2, entries.length);
-
-		ListDiffEntry remove = entries[0];
-		assertFalse(remove.isAddition());
-		assertEquals(
-				"List.set(int, Object) removed element should be the old element.",
-				oldElement, remove.getElement());
-		assertEquals(
-				"List.set(int, Object) removed index should be the index the new element was set at.",
-				1, remove.getPosition());
-
-		ListDiffEntry add = entries[1];
-		assertTrue(add.isAddition());
-		assertEquals(
-				"List.set(int, Object) added element should be the set element.",
-				newElement, add.getElement());
-		assertEquals(
-				"List.set(int, Object) add index should be the index the new element was set at.",
-				1, add.getPosition());
-	}
-
-	public void testMove_ChangeEvent() throws Exception {
-		list.add(delegate.createElement(list));
-		list.add(delegate.createElement(list));
-
-		assertChangeEventFired(new Runnable() {
-			public void run() {
-				list.move(0, 1);
-			}
-		}, "IObservableList.move(int, int)", list);
-	}
-
-	public void testMove_NoChangeEventAtSameIndex() throws Exception {
-		Object element = delegate.createElement(list);
-		list.add(element);
-
-		ListChangeEventTracker tracker = ListChangeEventTracker.observe(list);
-
-		final Object movedElement = list.move(0, 0);
-
-		assertEquals(
-				formatFail("IObservableList.move(int,int) should return the moved element"),
-				element, movedElement);
-		assertEquals(
-				formatFail("IObservableLIst.move(int,int) should not fire a change event"
-						+ "when the old and new indices are the same"), 0,
-				tracker.count);
-	}
-
-	public void testMove_ListChangeEvent() throws Exception {
-		final Object element = delegate.createElement(list);
-		list.add(element);
-		list.add(delegate.createElement(list));
-
-		assertListChangeEventFired(new Runnable() {
-			public void run() {
-				Object movedElement = list.move(0, 1);
-				assertEquals(element, movedElement);
-			}
-		}, "IObservableList.move(int, int)", list);
-	}
-
-	public void testMove_ChangeEventFiredAfterElementIsMoved() throws Exception {
-		Object element0 = delegate.createElement(list);
-		Object element1 = delegate.createElement(list);
-		list.add(element0);
-		list.add(element1);
-
-		assertSame(element0, list.get(0));
-		assertSame(element1, list.get(1));
-
-		list.move(0, 1);
-
-		assertSame(element1, list.get(0));
-		assertSame(element0, list.get(1));
-	}
-
-	public void testMove_ListDiffEntry() {
-		Object element = delegate.createElement(list);
-		list.add(element);
-		list.add(delegate.createElement(list));
-
-		ListChangeEventTracker listener = ListChangeEventTracker.observe(list);
-
-		list.move(0, 1);
-
-		ListDiffEntry[] entries = listener.event.diff.getDifferences();
-		assertEquals(
-				"List.set(int, Object) should result in 2 list diff entries.",
-				2, entries.length);
-
-		ListDiffEntry remove = entries[0];
-		ListDiffEntry add = entries[1];
-		assertFalse(
-				"IObservableList.move(int, int) removed element should be first in list diff",
-				remove.isAddition());
-		assertTrue(
-				"IObservableList.move(int, int) added element should be second in list diff",
-				add.isAddition());
-
-		assertEquals(
-				"IObservableList.move(int, int) remove entry contains incorrect element",
-				element, remove.getElement());
-		assertEquals(
-				"IObservableList.move(int, int) add entry contains incorrect element",
-				element, add.getElement());
-
-		assertEquals(
-				"IObservableList.move(int, int) remove entry should be the old element index",
-				0, remove.getPosition());
-		assertEquals(
-				"IObservableList.move(int, int) add entry should be the new element index",
-				1, add.getPosition());
-	}
-
-	public void testRemove_ListChangeEvent() throws Exception {
-		final Object element = delegate.createElement(list);
-		list.add(element);
-
-		assertListChangeEventFired(new Runnable() {
-			public void run() {
-				list.remove(element);
-			}
-		}, "List.remove(Object)", list);
-	}
-
-	public void testRemove_ListDiffEntry() throws Exception {
-		list.add(delegate.createElement(list));
-		final Object element = delegate.createElement(list);
-		list.add(element);
-
-		assertRemoveDiffEntry(new Runnable() {
-			public void run() {
-				list.remove(element);
-			}
-		}, "List.remove(Object)", list, element, 1);
-	}
-
-	public void testRemoveAtIndex_ChangeEvent() throws Exception {
-		list.add(delegate.createElement(list));
-
-		assertChangeEventFired(new Runnable() {
-			public void run() {
-				list.remove(0);
-			}
-		}, "List.remove(int)", list);
-	}
-
-	public void testRemoveAtIndex_ListChangeEvent() throws Exception {
-		list.add(delegate.createElement(list));
-
-		assertListChangeEventFired(new Runnable() {
-			public void run() {
-				list.remove(0);
-			}
-		}, "List.remove(int)", list);
-	}
-
-	public void testRemoveAtIndex_ChangeEventFiredAfterElementIsRemoved()
-			throws Exception {
-		final Object element = delegate.createElement(list);
-		list.add(element);
-
-		assertDoesNotContainDuringChangeEvent(new Runnable() {
-			public void run() {
-				list.remove(0);
-			}
-		}, "List.remove(int)", list, element);
-	}
-
-	public void testRemoveAtIndex_ListDiffEntry() throws Exception {
-		list.add(delegate.createElement(list));
-		Object element = delegate.createElement(list);
-		list.add(element);
-
-		assertRemoveDiffEntry(new Runnable() {
-			public void run() {
-				list.remove(1);
-			}
-		}, "List.remove(int)", list, element, 1);
-	}
-
-	public void testRemoveAll_ListChangeEvent() throws Exception {
-		final Object element = delegate.createElement(list);
-		list.add(element);
-
-		assertListChangeEventFired(new Runnable() {
-			public void run() {
-				list.removeAll(Arrays.asList(new Object[] { element }));
-			}
-		}, "List.removeAll(Collection)", list);
-	}
-
-	public void testRemoveAll_ListDiffEntry() throws Exception {
-		final Object element = delegate.createElement(list);
-		list.add(element);
-
-		assertRemoveDiffEntry(new Runnable() {
-			public void run() {
-				list.removeAll(Arrays.asList(new Object[] { element }));
-			}
-		}, "List.removeAll(Collection)", list, element, 0);
-	}
-
-	public void testRemoveAll_ListDiffEntry2() throws Exception {
-		list.add(delegate.createElement(list));
-		final Object element = delegate.createElement(list);
-		list.add(element);
-
-		assertRemoveDiffEntry(new Runnable() {
-			public void run() {
-				list.removeAll(Arrays.asList(new Object[] { element }));
-			}
-		}, "List.removeAll(Collection)", list, element, 1);
-	}
-
-	public void testRetainAll_ListChangeEvent() throws Exception {
-		final Object element1 = delegate.createElement(list);
-		list.add(element1);
-		list.add(delegate.createElement(list));
-
-		assertListChangeEventFired(new Runnable() {
-			public void run() {
-				list.retainAll(Arrays.asList(new Object[] { element1 }));
-			}
-		}, "List.retainAll(Collection", list);
-	}
-
-	public void testRetainAll_ListDiffEntry() throws Exception {
-		final Object element1 = delegate.createElement(list);
-		list.add(element1);
-		Object element2 = delegate.createElement(list);
-		list.add(element2);
-
-		assertRemoveDiffEntry(new Runnable() {
-			public void run() {
-				list.retainAll(Arrays.asList(new Object[] { element1 }));
-			}
-		}, "List.retainAll(Collection)", list, element2, 1);
-	}
-
-	public void testClear_ListChangeEvent() throws Exception {
-		list.add(delegate.createElement(list));
-
-		assertListChangeEventFired(new Runnable() {
-			public void run() {
-				list.clear();
-			}
-		}, "List.clear()", list);
-	}
-
-	public void testClear_ListDiffEntry() throws Exception {
-		Object element = delegate.createElement(list);
-		list.add(element);
-
-		assertRemoveDiffEntry(new Runnable() {
-			public void run() {
-				list.clear();
-			}
-		}, "List.clear()", list, element, 0);
-	}
-
-	public void testClear_ClearsList() {
-		Object element = delegate.createElement(list);
-		list.add(element);
-		Assert.assertEquals(Collections.singletonList(element), list);
-		list.clear();
-		Assert.assertEquals(Collections.EMPTY_LIST, list);
-	}
-
-	/**
-	 * Asserts standard behaviors of firing list change events.
-	 * <ul>
-	 * <li>Event fires once.</li>
-	 * <li>Source of the event is the provided <code>list</code>.
-	 * <li>The list change event is fired after the change event.</li>
-	 * </ul>
-	 * 
-	 * @param runnable
-	 * @param methodName
-	 * @param list
-	 */
-	private void assertListChangeEventFired(Runnable runnable,
-			String methodName, IObservableList list) {
-		List queue = new ArrayList();
-		ListChangeEventTracker listListener = new ListChangeEventTracker(queue);
-		ChangeEventTracker changeListener = new ChangeEventTracker(queue);
-
-		list.addListChangeListener(listListener);
-		list.addChangeListener(changeListener);
-
-		runnable.run();
-
-		assertEquals(formatFail(methodName + " should fire one ListChangeEvent."), 1,
-				listListener.count);
-		assertEquals(formatFail(methodName
-				+ "'s change event observable should be the created List."),
-				list, listListener.event.getObservable());
-
-		assertEquals(formatFail("Two notifications should have been received."), 2, queue
-				.size());
-		assertEquals("ChangeEvent of " + methodName
-				+ " should have fired before the ListChangeEvent.",
-				changeListener, queue.get(0));
-		assertEquals("ListChangeEvent of " + methodName
-				+ " should have fired after the ChangeEvent.", listListener,
-				queue.get(1));
-	}
-
-	/**
-	 * Asserts the list diff entry for a remove operation.
-	 * 
-	 * @param runnable
-	 * @param methodName
-	 * @param list
-	 * @param element
-	 * @param index
-	 */
-	private void assertRemoveDiffEntry(Runnable runnable, String methodName,
-			IObservableList list, Object element, int index) {
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		runnable.run();
-
-		ListDiffEntry[] entries = listener.event.diff.getDifferences();
-		assertEquals(methodName + " should result in one diff entry.", 1,
-				entries.length);
-
-		ListDiffEntry entry = entries[0];
-		assertFalse(methodName
-				+ " should result in a diff entry that is an removal.", entry
-				.isAddition());
-		assertEquals(methodName
-				+ " remove diff entry should have removed the element.",
-				element, entry.getElement());
-		assertEquals(
-				methodName
-						+ " remove diff entry should have removed the element from the provided index.",
-				index, entry.getPosition());
-	}
-
-	/**
-	 * Asserts the list diff entry for an add operation.
-	 * 
-	 * @param runnable
-	 * @param methodName
-	 * @param list
-	 * @param element
-	 * @param index
-	 */
-	private void assertAddDiffEntry(Runnable runnable, String methodName,
-			IObservableList list, Object element, int index) {
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		runnable.run();
-
-		ListDiffEntry[] entries = listener.event.diff.getDifferences();
-		assertEquals(methodName + " should result in one diff entry.", 1,
-				entries.length);
-
-		ListDiffEntry entry = entries[0];
-		assertTrue(methodName
-				+ " should result in a diff entry that is an addition.", entry
-				.isAddition());
-		assertEquals(methodName
-				+ " add diff entry should have added the element.", element,
-				entry.getElement());
-		assertEquals(
-				methodName
-						+ "add diff entry should have added the element at the provided index.",
-				index, entry.getPosition());
-	}
-
-	public static Test suite(IObservableCollectionContractDelegate delegate) {
-		return new SuiteBuilder().addObservableContractTest(
-				MutableObservableListContractTest.class, delegate)
-				.addObservableContractTest(ObservableListContractTest.class,
-						delegate).build();
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/MutableObservableSetContractTest.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/MutableObservableSetContractTest.java
deleted file mode 100644
index 8ff8cdb..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/MutableObservableSetContractTest.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bugs 215531, 221351, 213145
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-import junit.framework.Test;
-
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.jface.databinding.conformance.delegate.IObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
-import org.eclipse.jface.databinding.conformance.util.SetChangeEventTracker;
-import org.eclipse.jface.databinding.conformance.util.SuiteBuilder;
-
-/**
- */
-public class MutableObservableSetContractTest extends
-		MutableObservableCollectionContractTest {
-	private IObservableCollectionContractDelegate delegate;
-
-	private IObservableSet set;
-
-	public MutableObservableSetContractTest(String testName,
-			IObservableCollectionContractDelegate delegate) {
-		super(testName, delegate);
-		this.delegate = delegate;
-	}
-
-	/**
-	 * @param delegate
-	 */
-	public MutableObservableSetContractTest(
-			IObservableCollectionContractDelegate delegate) {
-		super(delegate);
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		set = (IObservableSet) getObservable();
-	}
-
-	public void testAdd_SetChangeEvent() throws Exception {
-		assertSetChangeEventFired(new Runnable() {
-			public void run() {
-				set.add(delegate.createElement(set));
-			}
-		}, "Set.add(Object)", set);
-	}
-
-	public void testAdd_SetDiffEntry() throws Exception {
-		set.add(delegate.createElement(set));
-		final Object element = delegate.createElement(set);
-
-		assertAddDiffEntry(new Runnable() {
-			public void run() {
-				set.add(element);
-			}
-		}, "Set.add(Object)", set, element);
-	}
-
-	public void testAdd_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				set.add(delegate.createElement(set));
-			}
-		}, "Set.add(Object)", set);
-	}
-
-	public void testAddAll_SetChangeEvent() throws Exception {
-		assertSetChangeEventFired(new Runnable() {
-			public void run() {
-				set.addAll(Arrays.asList(new Object[] { delegate
-						.createElement(set) }));
-			}
-		}, "Set.addAll(Collection", set);
-	}
-
-	public void testAddAll_SetDiffEntry() throws Exception {
-		final Object element = delegate.createElement(set);
-
-		assertAddDiffEntry(new Runnable() {
-			public void run() {
-				set.addAll(Arrays.asList(new Object[] { element }));
-			}
-		}, "Set.addAll(Collection)", set, element);
-	}
-
-	public void testAddAll_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				set.addAll(Collections.singleton(delegate.createElement(set)));
-			}
-		}, "Set.addAll(Collection)", set);
-	}
-
-	public void testRemove_SetChangeEvent() throws Exception {
-		final Object element = delegate.createElement(set);
-		set.add(element);
-
-		assertSetChangeEventFired(new Runnable() {
-			public void run() {
-				set.remove(element);
-			}
-		}, "Set.remove(Object)", set);
-	}
-
-	public void testRemove_SetDiffEntry() throws Exception {
-		set.add(delegate.createElement(set));
-		final Object element = delegate.createElement(set);
-		set.add(element);
-
-		assertRemoveDiffEntry(new Runnable() {
-			public void run() {
-				set.remove(element);
-			}
-		}, "Set.remove(Object)", set, element);
-	}
-
-	public void testRemove_GetterCalled() throws Exception {
-		final Object element = delegate.createElement(set);
-		set.add(element);
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				set.remove(element);
-			}
-		}, "Set.remove(Object)", set);
-	}
-
-	public void testRemoveAll_SetChangeEvent() throws Exception {
-		final Object element = delegate.createElement(set);
-		set.add(element);
-
-		assertSetChangeEventFired(new Runnable() {
-			public void run() {
-				set.removeAll(Arrays.asList(new Object[] { element }));
-			}
-		}, "Set.removeAll(Collection)", set);
-	}
-
-	public void testRemoveAll_SetDiffEntry() throws Exception {
-		final Object element = delegate.createElement(set);
-		set.add(element);
-
-		assertRemoveDiffEntry(new Runnable() {
-			public void run() {
-				set.removeAll(Arrays.asList(new Object[] { element }));
-			}
-		}, "Set.removeAll(Collection)", set, element);
-	}
-
-	public void testRemoveAll_GetterCalled() throws Exception {
-		final Object element = delegate.createElement(set);
-		set.add(element);
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				set.removeAll(Collections.singleton(element));
-			}
-		}, "Set.removeAll(Collection)", set);
-	}
-
-	public void testRetainAll_SetChangeEvent() throws Exception {
-		final Object element1 = delegate.createElement(set);
-		set.add(element1);
-		set.add(delegate.createElement(set));
-
-		assertSetChangeEventFired(new Runnable() {
-			public void run() {
-				set.retainAll(Arrays.asList(new Object[] { element1 }));
-			}
-		}, "Set.retainAll(Collection", set);
-	}
-
-	public void testRetainAll_SetDiffEntry() throws Exception {
-		final Object element1 = delegate.createElement(set);
-		set.add(element1);
-		Object element2 = delegate.createElement(set);
-		set.add(element2);
-
-		assertRemoveDiffEntry(new Runnable() {
-			public void run() {
-				set.retainAll(Arrays.asList(new Object[] { element1 }));
-			}
-		}, "Set.retainAll(Collection)", set, element2);
-	}
-
-	public void testRetainAll_GetterCalled() throws Exception {
-		set.add(delegate.createElement(set));
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				set.retainAll(Collections.EMPTY_SET);
-			}
-		}, "Set.retainAll(Collection)", set);
-	}
-
-	public void testClear_SetChangeEvent() throws Exception {
-		set.add(delegate.createElement(set));
-
-		assertSetChangeEventFired(new Runnable() {
-			public void run() {
-				set.clear();
-			}
-		}, "Set.clear()", set);
-	}
-
-	public void testClear_SetDiffEntry() throws Exception {
-		Object element = delegate.createElement(set);
-		set.add(element);
-
-		assertRemoveDiffEntry(new Runnable() {
-			public void run() {
-				set.clear();
-			}
-		}, "Set.clear()", set, element);
-	}
-
-	public void testClear_GetterCalled() throws Exception {
-		set.add(delegate.createElement(set));
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				set.clear();
-			}
-		}, "Set.clear()", set);
-	}
-
-	/**
-	 * Asserts standard behaviors of firing set change events.
-	 * <ul>
-	 * <li>Event fires once.</li>
-	 * <li>Source of the event is the provided <code>set</code>.
-	 * <li>The set change event is fired after the change event.</li>
-	 * </ul>
-	 * 
-	 * @param runnable
-	 * @param methodName
-	 * @param set
-	 */
-	private void assertSetChangeEventFired(Runnable runnable,
-			String methodName, IObservableSet set) {
-		List queue = new ArrayList();
-		SetChangeEventTracker setListener = new SetChangeEventTracker(queue);
-		ChangeEventTracker changeListener = new ChangeEventTracker(queue);
-
-		set.addSetChangeListener(setListener);
-		set.addChangeListener(changeListener);
-
-		runnable.run();
-
-		assertEquals(formatFail(methodName + " should fire one SetChangeEvent."), 1,
-				setListener.count);
-		assertEquals(formatFail(methodName
-				+ "'s change event observable should be the created Set."), set,
-				setListener.event.getObservable());
-
-		assertEquals(formatFail("Two notifications should have been received."), 2, queue
-				.size());
-		assertEquals(formatFail("ChangeEvent of " + methodName
-				+ " should have fired before the SetChangeEvent."),
-				changeListener, queue.get(0));
-		assertEquals(formatFail("SetChangeEvent of " + methodName
-				+ " should have fired after the ChangeEvent."), setListener,
-				queue.get(1));
-	}
-
-	/**
-	 * Asserts the set diff entry for an add operation.
-	 * 
-	 * @param runnable
-	 * @param methodName
-	 * @param set
-	 * @param element
-	 */
-	private void assertAddDiffEntry(Runnable runnable, String methodName,
-			IObservableSet set, Object element) {
-		SetChangeEventTracker listener = new SetChangeEventTracker();
-		set.addSetChangeListener(listener);
-
-		runnable.run();
-
-		Set entries = listener.event.diff.getAdditions();
-		assertEquals(formatFail(methodName + " should result in one diff entry."), 1,
-				entries.size());
-
-		assertTrue(formatFail(methodName
-				+ " should result in a diff entry that is an addition."),
-				entries.contains(element));
-	}
-
-	/**
-	 * Asserts the set diff entry for a remove operation.
-	 * 
-	 * @param runnable
-	 * @param methodName
-	 * @param set
-	 * @param element
-	 */
-	private void assertRemoveDiffEntry(Runnable runnable, String methodName,
-			IObservableSet set, Object element) {
-		SetChangeEventTracker listener = new SetChangeEventTracker();
-		set.addSetChangeListener(listener);
-
-		runnable.run();
-
-		Set entries = listener.event.diff.getRemovals();
-		assertEquals(formatFail(methodName + " should result in one diff entry."), 1,
-				entries.size());
-
-		assertTrue(formatFail(methodName
-				+ " should result in a diff entry that is a removal."),
-				entries.contains(element));
-	}
-
-	public static Test suite(IObservableCollectionContractDelegate delegate) {
-		return new SuiteBuilder().addObservableContractTest(
-				MutableObservableSetContractTest.class, delegate)
-				.addObservableContractTest(
-						ObservableCollectionContractTest.class, delegate)
-				.build();
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/MutableObservableValueContractTest.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/MutableObservableValueContractTest.java
deleted file mode 100644
index e03b0aa..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/MutableObservableValueContractTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance;
-
-import junit.framework.Test;
-
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.delegate.IObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-import org.eclipse.jface.databinding.conformance.util.SuiteBuilder;
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-
-/**
- * Mutability tests for IObservableValue.
- * 
- * <p>
- * This class is experimental and can change at any time. It is recommended to
- * not subclass or assume the test names will not change. The only API that is
- * guaranteed to not change are the constructors. The tests will remain public
- * and not final in order to allow for consumers to turn off a test if needed by
- * subclassing.
- * </p>
- * 
- * @since 3.2
- */
-public class MutableObservableValueContractTest extends
-		ObservableDelegateTest {
-	private IObservableValueContractDelegate delegate;
-
-	private IObservableValue observable;
-
-	/**
-	 * @param delegate
-	 */
-	public MutableObservableValueContractTest(
-			IObservableValueContractDelegate delegate) {
-		this(null, delegate);
-	}
-
-	public MutableObservableValueContractTest(String testName,
-			IObservableValueContractDelegate delegate) {
-		super(testName, delegate);
-		this.delegate = delegate;
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		this.observable = (IObservableValue) getObservable();
-	}
-
-	public void testSetValue_SetsValue() throws Exception {
-		Object value = delegate.createValue(observable);
-		
-		observable.setValue(value);
-		assertEquals(formatFail("IObservableValue.setValue(Object) should set the value of the observable."), value, observable.getValue());
-	}
-	
-	public void testSetValue_ChangeEvent() throws Exception {
-		ChangeEventTracker listener = ChangeEventTracker.observe(observable);
-		
-		observable.setValue(delegate.createValue(observable));
-		
-		assertEquals(formatFail("Change event listeners were not notified"), 1, listener.count);
-		assertEquals(formatFail("IObservableValue.setValue(Object) should fire one ChangeEvent."), 1,
-				listener.count);
-		assertEquals(
-				formatFail("IObservableValue.setValue(Object)'s change event observable should be the created observable."),
-				observable, listener.event.getObservable());
-	}
-	
-	public void testSetValue_SameValue() throws Exception {
-		// invoke change to ensure observable has a value
-		delegate.change(observable);
-
-		ValueChangeEventTracker valueChangeListener = ValueChangeEventTracker.observe(observable);
-		ChangeEventTracker changeListener = ChangeEventTracker.observe(observable);
-		Object value = observable.getValue();
-		observable.setValue(value);
-
-		assertEquals(
-				formatFail("IObservableValue.setValue() should not fire a value change event when the value has not change."),
-				0, valueChangeListener.count);
-		assertEquals(
-				formatFail("IObservableValue.setValue() should not fire a change event when the value has not change."),
-				0, changeListener.count);
-	}
-	
-	public void testSetValue_RealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				observable.setValue(delegate.createValue(observable));
-			}
-		}, (CurrentRealm) observable.getRealm());
-	}
-
-	public static Test suite(IObservableValueContractDelegate delegate) {
-		return new SuiteBuilder().addObservableContractTest(
-				MutableObservableValueContractTest.class, delegate)
-				.addObservableContractTest(ObservableValueContractTest.class,
-						delegate).build();
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableCollectionContractTest.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableCollectionContractTest.java
deleted file mode 100644
index 23985ac..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableCollectionContractTest.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance;
-
-import java.util.Arrays;
-
-import junit.framework.Test;
-
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.jface.databinding.conformance.delegate.IObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-import org.eclipse.jface.databinding.conformance.util.SuiteBuilder;
-
-/**
- * Tests for IObservableCollection that don't mutate the collection.
- * <p>
- * This class is experimental and can change at any time. It is recommended to
- * not subclass or assume the test names will not change. The only API that is
- * guaranteed to not change are the constructors. The tests will remain public
- * and not final in order to allow for consumers to turn off a test if needed by
- * subclassing.
- * </p>
- * 
- * @since 3.2
- */
-public class ObservableCollectionContractTest extends ObservableContractTest {
-	private IObservableCollectionContractDelegate delegate;
-
-	private IObservableCollection collection;
-
-	public ObservableCollectionContractTest(
-			IObservableCollectionContractDelegate delegate) {
-		super(delegate);
-		this.delegate = delegate;
-	}
-
-	public ObservableCollectionContractTest(String testName,
-			IObservableCollectionContractDelegate delegate) {
-		super(testName, delegate);
-		this.delegate = delegate;
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		collection = (IObservableCollection) getObservable();
-	}
-
-	public void testIterator_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				collection.iterator();
-			}
-		}, "Collection.iterator()", collection);
-	}
-	
-	public void testIterator_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				collection.iterator();
-			}
-		}, (CurrentRealm) collection.getRealm());
-	}
-
-	public void testSize_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				collection.size();
-			}
-		}, "Collection.size()", collection);
-	}
-	
-	public void testSize_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				collection.size();
-			}
-		}, (CurrentRealm) collection.getRealm());
-	}
-
-	public void testIsEmpty_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				collection.isEmpty();
-			}
-		}, "Collection.isEmpty()", collection);
-	}
-	
-	public void testIsEmpty_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				collection.isEmpty();
-			}
-		}, (CurrentRealm) collection.getRealm());
-	}
-
-	public void testContains_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				collection.contains(delegate.createElement(collection));
-			}
-		}, "Collection.contains(...)", collection);
-	}
-	
-	public void testContains_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				collection.contains(delegate.createElement(collection));
-			}
-		}, (CurrentRealm) collection.getRealm());
-	}
-
-	public void testContainsAll_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				collection.containsAll(Arrays.asList(new Object[] { delegate
-						.createElement(collection) }));
-			}
-		}, "Collection.containsAll(Collection)", collection);
-	}
-
-	public void testContainsAll_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				collection.containsAll(Arrays.asList(new Object[] { delegate
-						.createElement(collection) }));
-			}
-		}, (CurrentRealm) collection.getRealm());
-	}
-	
-	public void testToArray_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				collection.toArray();
-			}
-		}, "Collection.toArray()", collection);
-	}
-	
-	public void testToArray_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				collection.toArray();
-			}
-		}, (CurrentRealm) collection.getRealm());
-	}
-
-	public void testToArrayWithObjectArray_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				collection.toArray(new Object[collection.size()]);
-			}
-		}, "Collection.toArray(Object[])", collection);
-	}
-	
-	public void testToArrayWithObjectArray_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				collection.toArray(new Object[collection.size()]);
-			}
-		}, (CurrentRealm) collection.getRealm());
-	}
-
-	public void testEquals_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				collection.equals(collection);
-			}
-		}, "Collection.equals(Object)", collection);
-	}
-	
-	public void testEquals_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				collection.equals(collection);
-			}
-		}, (CurrentRealm) collection.getRealm());
-	}
-
-	public void testHashCode_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				collection.hashCode();
-			}
-		}, "Collection.hashCode()", collection);
-	}
-	
-	public void testHashCode_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				collection.hashCode();
-			}
-		}, (CurrentRealm) collection.getRealm());
-	}
-
-	public void testGetElementType_ReturnsType() throws Exception {
-		assertEquals(
-				"Element type of the collection should be returned from IObservableCollection.getElementType()",
-				delegate.getElementType(collection), collection
-						.getElementType());
-	}
-
-	public static Test suite(IObservableCollectionContractDelegate delegate) {
-		return new SuiteBuilder().addObservableContractTest(
-				ObservableCollectionContractTest.class, delegate).build();
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableContractTest.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableContractTest.java
deleted file mode 100644
index 58c90fc..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableContractTest.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bugs 208322, 221351, 208858, 146397
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance;
-
-import junit.framework.Test;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.DisposeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.databinding.conformance.delegate.IObservableContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.DisposeEventTracker;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-import org.eclipse.jface.databinding.conformance.util.SuiteBuilder;
-
-/**
- * Tests for IObservable that don't require mutating the observable.
- * <p>
- * This class is experimental and can change at any time. It is recommended to
- * not subclass or assume the test names will not change. The only API that is
- * guaranteed to not change are the constructors. The tests will remain public
- * and not final in order to allow for consumers to turn off a test if needed by
- * subclassing.
- * </p>
- * 
- * @since 3.2
- */
-public class ObservableContractTest extends ObservableDelegateTest {
-	private IObservable observable;
-
-	private IObservableContractDelegate delegate;
-
-	public ObservableContractTest(IObservableContractDelegate delegate) {
-		this(null, delegate);
-	}
-
-	public ObservableContractTest(String testName,
-			IObservableContractDelegate delegate) {
-		super(testName, delegate);
-		
-		this.delegate = delegate;
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		observable = getObservable();
-	}
-
-	public void testGetRealm_NotNull() throws Exception {
-		assertNotNull(formatFail("The observable's realm should not be null."), observable
-				.getRealm());
-	}
-
-	public void testChange_ChangeEvent() throws Exception {
-		ChangeListener listener = new ChangeListener();
-
-		observable.addChangeListener(listener);
-		delegate.change(observable);
-
-		assertEquals(
-				formatFail("A change in the observable should notify change listeners."),
-				1, listener.count);
-	}
-
-	public void testChange_EventObservable() throws Exception {
-		ChangeListener listener = new ChangeListener();
-
-		observable.addChangeListener(listener);
-		delegate.change(observable);
-
-		ChangeEvent event = listener.event;
-		assertNotNull(formatFail("change event was null"), event);
-
-		assertSame(
-				formatFail("In the change event the source of the change should be the observable."),
-				observable, event.getObservable());
-	}
-
-	public void testChange_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				delegate.change(observable);
-			}			
-		}, (CurrentRealm) observable.getRealm());
-	}
-	
-	public void testChange_ObservableRealmIsTheCurrentRealm() throws Exception {
-		ChangeListener listener = new ChangeListener();
-		observable.addChangeListener(listener);
-
-		delegate.change(observable);
-		assertTrue(
-				formatFail("On change the current realm should be the realm of the observable."),
-				listener.isCurrentRealm);
-	}
-
-	public void testRemoveChangeListener_RemovesListener() throws Exception {
-		ChangeListener listener = new ChangeListener();
-
-		observable.addChangeListener(listener);
-		delegate.change(observable);
-
-		// precondition check
-		assertEquals(formatFail("change did not notify listeners"), 1, listener.count);
-
-		observable.removeChangeListener(listener);
-		delegate.change(observable);
-
-		assertEquals(
-				formatFail("When a change listener is removed it should not still receive change events."),
-				1, listener.count);
-	}
-
-	public void testIsStale_NotStale() throws Exception {
-		delegate.setStale(observable, false);
-		assertFalse(
-				formatFail("When an observable is not stale isStale() should return false."),
-				observable.isStale());
-	}
-	
-	public void testIsStale_RealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				observable.isStale();
-			}
-		}, (CurrentRealm) observable.getRealm());
-	}
-
-	public void testIsStale_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				observable.isStale();
-			}
-		}, "isStale", observable);
-	}
-
-	public void testIsDisposed() throws Exception {
-		assertFalse(observable.isDisposed());
-		observable.dispose();
-		assertTrue(observable.isDisposed());
-	}
-
-	public void testAddDisposeListener_HandleDisposeInvoked() {
-		DisposeEventTracker tracker = DisposeEventTracker.observe(observable);
-		assertEquals(0, tracker.count);
-		observable.dispose();
-		assertEquals(1, tracker.count);
-		assertSame(observable, tracker.event.getSource());
-	}
-
-	public void testHandleDispose_IsDisposedTrue() {
-		// Ensures observable.isDisposed() == true before
-		// the dispose listeners are called
-		observable.addDisposeListener(new IDisposeListener() {
-			public void handleDispose(DisposeEvent staleEvent) {
-				assertTrue(observable.isDisposed());
-			}
-		});
-		observable.dispose();
-	}
-
-	public void testDispose_RemovesListeners() throws Exception {
-		ChangeListener disposedObservableListener = new ChangeListener();
-		Realm realm = observable.getRealm();
-		
-		observable.addChangeListener(disposedObservableListener);
-		observable.dispose();
-		
-		//create a new observable to fire a change from
-		observable = delegate.createObservable(realm);
-		delegate.change(observable);
-		
-		assertEquals(
-				formatFail("After being disposed listeners should not receive change events."),
-				0, disposedObservableListener.count);
-	}
-
-	/* package */static class ChangeListener implements IChangeListener {
-		int count;
-
-		ChangeEvent event;
-
-		boolean isCurrentRealm;
-
-		public void handleChange(ChangeEvent event) {
-			count++;
-			this.event = event;
-			this.isCurrentRealm = event.getObservable().getRealm().isCurrent();
-		}
-	}
-
-	public static Test suite(IObservableContractDelegate delegate) {
-		return new SuiteBuilder().addObservableContractTest(
-				ObservableContractTest.class, delegate).build();
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableDelegateTest.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableDelegateTest.java
deleted file mode 100644
index f740539..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableDelegateTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 221351
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.databinding.conformance.delegate.IObservableContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-
-/**
- * TestCase that provides the standard behavior expected for delegating test cases.
- * 
- * @since 3.2
- */
-public class ObservableDelegateTest extends TestCase {
-	private IObservableContractDelegate delegate;
-
-	private Realm previousRealm;
-
-	private IObservable observable;
-	private String debugInfo;
-
-	public ObservableDelegateTest(IObservableContractDelegate delegate) {
-		this(null, delegate);
-	}
-	
-	public ObservableDelegateTest(String testName, IObservableContractDelegate delegate) {
-		super(testName);
-		this.delegate = delegate;
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		previousRealm = Realm.getDefault();
-
-		delegate.setUp();
-		observable = doCreateObservable();
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-
-		delegate.tearDown();
-		observable.dispose();
-		observable = null;
-		
-		RealmTester.setDefault(previousRealm);
-
-		observable = null;
-		previousRealm = null;
-	}
-	
-	/**
-	 * Creates a new observable with a default realm. Invoked from
-	 * {@link #setUp()}. Override to customize the creation of observables
-	 * (e.g. specifying a different Realm).
-	 * 
-	 * @return observable
-	 */
-	protected IObservable doCreateObservable() {
-		return delegate.createObservable(new CurrentRealm(true));
-	}
-
-	/**
-	 * Returns the created observable. The observable is created in
-	 * {@link #setUp()}. If invoked before {@link #setUp()} will be
-	 * <code>null</code>.
-	 * 
-	 * @return observable
-	 */
-	protected IObservable getObservable() {
-		return observable;
-	}	
-	
-	/**
-	 * Returns the delegate in use.
-	 * 
-	 * @return delegate
-	 */
-	protected IObservableContractDelegate getObservableContractDelegate() {
-		return delegate;
-	}
-	
-	protected String formatFail(String message) {
-		return message + getDebugString();
-	}
-	
-	private String getDebugString() {
-		if (debugInfo == null) {
-			debugInfo = "(Test: " + this.getClass().getName() + ", Delegate: " + delegate.getClass().getName() + ")";
-		}
-		
-		return debugInfo;
-	}
-
-	/**
-	 * Asserts that ObservableTracker.getterCalled(...) is invoked when the
-	 * provided <code>runnable</code> is invoked.
-	 * 
-	 * @param runnable
-	 * @param methodName
-	 *            method name to display when displaying a message
-	 * @param observable
-	 *            observable that should be collected by ObservableTracker
-	 */
-	protected void assertGetterCalled(Runnable runnable, String methodName, IObservable observable) {
-		IObservable[] observables = ObservableTracker.runAndMonitor(runnable,
-				null, null);
-	
-		int count = 0;
-		for (int i = 0; i < observables.length; i++) {
-			if (observables[i] == observable) {
-				count++;
-			}
-		}
-		
-		assertEquals(formatFail(methodName
-				+ " should invoke ObservableTracker.getterCalled() once."), 1,
-				count);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableListContractTest.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableListContractTest.java
deleted file mode 100644
index a0e48c1..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableListContractTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance;
-
-import junit.framework.Test;
-
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.jface.databinding.conformance.delegate.IObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.SuiteBuilder;
-
-/**
- * Tests for IObservableList that don't require mutating the collection.
- * <p>
- * This class is experimental and can change at any time. It is recommended to
- * not subclass or assume the test names will not change. The only API that is
- * guaranteed to not change are the constructors. The tests will remain public
- * and not final in order to allow for consumers to turn off a test if needed by
- * subclassing.
- * </p>
- * 
- * @since 3.2
- */
-public class ObservableListContractTest extends
-		ObservableCollectionContractTest {
-	private IObservableList list;
-
-	private IObservableCollectionContractDelegate delegate;
-
-	/**
-	 * @param delegate
-	 */
-	public ObservableListContractTest(
-			IObservableCollectionContractDelegate delegate) {
-		super(delegate);
-		this.delegate = delegate;
-	}
-
-	public ObservableListContractTest(String testName,
-			IObservableCollectionContractDelegate delegate) {
-		super(testName, delegate);
-		this.delegate = delegate;
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		list = (IObservableList) getObservable();
-	}
-
-	public void testListIterator_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				list.listIterator();
-			}
-		}, "List.listIterator()", list);
-	}
-
-	public void testGet_GetterCalled() throws Exception {
-		list = (IObservableList) delegate.createObservableCollection(new CurrentRealm(true), 1);
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				list.get(0);
-			}
-		}, "List.get(int)", list);
-	}
-
-	public void testIndexOf_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				list.indexOf(delegate.createElement(list));
-			}
-		}, "List.indexOf(int)", list);
-	}
-
-	public void testLastIndexOf_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				list.lastIndexOf(delegate.createElement(list));
-			}
-		}, "List.lastIndexOf(Object)", list);
-	}
-
-	public void testListIteratorAtIndex_GetterCalled() throws Exception {
-		// Create a new list instead of adding an item because the list might
-		// not be mutable
-		list = (IObservableList) delegate.createObservableCollection(new CurrentRealm(true), 1);
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				list.listIterator(0);
-			}
-		}, "List.listIterator(int)", list);
-	}
-
-	public void testSubList_GetterCalled() throws Exception {
-		list = (IObservableList) delegate.createObservableCollection(new CurrentRealm(true), 1);
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				list.subList(0, 1);
-			}
-		}, "List.subList(int, int)", list);
-	}
-
-	public static Test suite(IObservableCollectionContractDelegate delegate) {
-		return new SuiteBuilder().addObservableContractTest(
-				ObservableListContractTest.class, delegate).build();
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableStaleContractTest.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableStaleContractTest.java
deleted file mode 100644
index 9c754aa..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableStaleContractTest.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance;
-
-import junit.framework.Test;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.jface.databinding.conformance.delegate.IObservableContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.SuiteBuilder;
-
-/**
- * @since 3.3
- */
-public class ObservableStaleContractTest extends ObservableDelegateTest {
-	private IObservableContractDelegate delegate;
-	private IObservable observable;
-	
-	public ObservableStaleContractTest(IObservableContractDelegate delegate) {
-		this(null, delegate);
-	}
-	
-	public ObservableStaleContractTest(String testName, IObservableContractDelegate delegate) {
-		super(testName, delegate);
-		this.delegate = delegate;
-	}
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		observable = getObservable();
-	}
-	
-	public void testIsStale_TrueWhenStale() throws Exception {
-		delegate.setStale(observable, true);
-		assertTrue(formatFail("When stale isStale() should return true."), observable.isStale());
-	}
-	
-	public void testIsStale_FalseWhenNotStale() throws Exception {
-		delegate.setStale(observable, false);
-		assertFalse(formatFail("When not stale isStale() should return false."), observable.isStale());
-	}
-
-	public void testBecomingStaleFiresStaleEvent() throws Exception {
-		StaleListener listener = new StaleListener();
-
-		// precondition
-		ensureStale(observable, false);
-
-		observable.addStaleListener(listener);
-		delegate.setStale(observable, true);
-
-		assertEquals(formatFail("When becoming stale listeners should be notified."), 1, listener.count);
-	}
-
-	public void testStaleEventObservable() throws Exception {
-		StaleListener listener = new StaleListener();
-
-		// precondition
-		ensureStale(observable, false);
-
-		observable.addStaleListener(listener);
-		delegate.setStale(observable, true);
-
-		StaleEvent event = listener.event;
-		assertNotNull(formatFail("stale event was null"), event);
-		assertEquals(formatFail("When notifying listeners of becoming stale the observable should be the source of the event."), observable,
-				event.getObservable());
-	}
-
-	public void testRemoveStaleListener_RemovesListener() throws Exception {
-		StaleListener listener = new StaleListener();
-
-		observable.addStaleListener(listener);
-		ensureStale(observable, false);
-		delegate.setStale(observable, true);
-
-		// precondition check
-		assertEquals(formatFail("set stale did not notify listeners"), 1, listener.count);
-
-		observable.removeStaleListener(listener);
-		ensureStale(observable, false);
-		delegate.setStale(observable, true);
-
-		assertEquals(formatFail("Once removed stale listeners should not be notified of becoming stale."), 1,
-				listener.count);
-	}
-
-	public void testStaleListenersAreNotNotifiedWhenObservableIsNoLongerStale()
-			throws Exception {
-		ensureStale(observable, true);
-
-		StaleListener listener = new StaleListener();
-		observable.addStaleListener(listener);
-		delegate.setStale(observable, false);
-
-		assertEquals(formatFail("Stale listeners should not be notified when the stale state changes from true to false."), 0,
-				listener.count);
-	}
-
-	public void testObservableRealmIsCurrentOnStale() throws Exception {
-		ensureStale(observable, false);
-
-		StaleListener listener = new StaleListener();
-		observable.addStaleListener(listener);
-		delegate.setStale(observable, true);
-
-		assertTrue(formatFail("When notifying listeners of becoming stale the observable's realm should be the current realm."),
-				listener.isCurrentRealm);
-	}
-	
-	/**
-	 * Ensures that stale is set to the provided state. Will throw an
-	 * AssertionFailedError if setting of the state is unsuccessful.
-	 * 
-	 * @param observable
-	 * @param stale
-	 */
-	private void ensureStale(IObservable observable, boolean stale) {
-		if (observable.isStale() != stale) {
-			delegate.setStale(observable, stale);
-		}
-
-		assertEquals(stale, observable.isStale());
-	}
-	
-	/* package */static class StaleListener implements IStaleListener {
-		int count;
-
-		StaleEvent event;
-
-		boolean isCurrentRealm;
-
-		public void handleStale(StaleEvent staleEvent) {
-			count++;
-			this.event = staleEvent;
-			this.isCurrentRealm = staleEvent.getObservable().getRealm()
-					.isCurrent();
-		}
-	}
-
-	public static Test suite(IObservableContractDelegate delegate) {
-		return new SuiteBuilder().addObservableContractTest(
-				ObservableStaleContractTest.class, delegate).build();
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableValueContractTest.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableValueContractTest.java
deleted file mode 100644
index 5ea3098..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/ObservableValueContractTest.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Test;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.jface.databinding.conformance.delegate.IObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-import org.eclipse.jface.databinding.conformance.util.SuiteBuilder;
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-
-/**
- * @since 3.2
- */
-public class ObservableValueContractTest extends ObservableContractTest {
-	private IObservableValueContractDelegate delegate;
-	private IObservableValue observable;
-
-	public ObservableValueContractTest(IObservableValueContractDelegate delegate) {
-		super(delegate);
-		this.delegate = delegate;			
-	}
-
-	/**
-	 * @param testName
-	 * @param delegate
-	 */
-	public ObservableValueContractTest(String testName,
-			IObservableValueContractDelegate delegate) {
-		super(testName, delegate);
-		this.delegate = delegate;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.databinding.conformance.ObservableContractTest#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		observable = (IObservableValue) getObservable();
-	}
-
-	public void testChange_ValueChangeEvent() throws Exception {
-		ValueChangeEventTracker listener = ValueChangeEventTracker.observe(observable);
-
-		delegate.change(observable);
-		assertEquals(formatFail("On change value change listeners should be notified."), 1,
-				listener.count);
-	}
-
-	public void testGetValueType_ExpectedType() throws Exception {
-		assertEquals(formatFail("Type of the value should be returned from getType()."),
-				delegate.getValueType(observable), observable.getValueType());
-	}
-
-	public void testChange_OrderOfNotifications() throws Exception {
-		final List listeners = new ArrayList();
-		IChangeListener changeListener = new IChangeListener() {
-			public void handleChange(ChangeEvent event) {
-				listeners.add(this);
-			}
-		};
-
-		IValueChangeListener valueChangeListener = new IValueChangeListener() {
-			public void handleValueChange(ValueChangeEvent event) {
-				listeners.add(this);
-			}
-		};
-
-		observable.addChangeListener(changeListener);
-		observable.addValueChangeListener(valueChangeListener);
-
-		delegate.change(observable);
-		
-		assertTrue(formatFail("Change Listeners were not notified on change."), listeners.size() > 0);
-		
-		// not asserting the fact that both are notified as this is asserted in
-		// other tests
-		assertEquals(
-				formatFail("Change listeners should be notified before value change listeners."),
-				changeListener, listeners.get(0));
-		assertEquals(
-				formatFail("Value change listeners should be notified after change listeners."),
-				valueChangeListener, listeners.get(1));
-	}
-
-	public void testChange_ValueChangeEventDiff() throws Exception {
-		ValueChangeEventTracker listener = ValueChangeEventTracker.observe(observable);
-		Object oldValue = observable.getValue();
-
-		delegate.change(observable);
-
-		ValueChangeEvent event = listener.event;
-		
-		assertTrue(formatFail("Change Listeners were not notified on change."), listener.count > 0);
-		
-		assertEquals(
-				formatFail("When a value change event is fired the old value should be the previous value of the observable value."),
-				oldValue, event.diff.getOldValue());
-		assertEquals(
-				formatFail("When a value change event is fired the new value should be the same as the current value of the observable value."),
-				observable.getValue(), event.diff.getNewValue());
-	}
-
-	public void testChange_ValueChangeEventFiredAfterValueIsSet()
-			throws Exception {
-		class ValueChangeListener implements IValueChangeListener {
-			Object value;
-
-			public void handleValueChange(ValueChangeEvent event) {
-				this.value = event.getObservableValue().getValue();
-			}
-		}
-		
-		ValueChangeListener listener = new ValueChangeListener();
-		observable.addValueChangeListener(listener);
-		delegate.change(observable);
-		assertEquals(
-				formatFail("When a value change event is fired the new value should be applied before firing the change event."),
-				listener.value, observable.getValue());
-	}
-
-	public void testRemoveValueChangeListener_RemovesListener() throws Exception {
-		ValueChangeEventTracker listener = ValueChangeEventTracker.observe(observable);
-		delegate.change(observable);
-
-		// precondition
-		assertEquals(formatFail("Value change listeners should be notified on change."), 1,
-				listener.count);
-
-		observable.removeValueChangeListener(listener);
-		delegate.change(observable);
-
-		assertEquals(
-				formatFail("Value change listeners should not be notified after they've been removed from the observable."),
-				1, listener.count);
-	}
-
-	public void testGetValue_GetterCalled() throws Exception {
-		assertGetterCalled(new Runnable() {
-			public void run() {
-				observable.getValue();
-			}
-		}, formatFail("IObservableValue.getValue()"), observable);
-	}
-
-	public void testGetValue_RealmCheck() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				observable.getValue();
-			}
-		}, (CurrentRealm) observable.getRealm());
-	}
-
-	public static Test suite(IObservableValueContractDelegate delegate) {
-		return new SuiteBuilder().addObservableContractTest(
-				ObservableValueContractTest.class, delegate).build();
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/AbstractObservableCollectionContractDelegate.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/AbstractObservableCollectionContractDelegate.java
deleted file mode 100644
index 5455d7f..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/AbstractObservableCollectionContractDelegate.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance.delegate;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * Abstract implementation of {@link IObservableCollectionContractDelegate}.
- * 
- * @since 3.2
- */
-public abstract class AbstractObservableCollectionContractDelegate extends
-		AbstractObservableContractDelegate implements
-		IObservableCollectionContractDelegate {
-
-	/**
-	 * Invokes {@link IObservableCollectionContractDelegate#createObservableCollection(Realm, int)}.
-	 * @param realm 
-	 * @return observable
-	 */
-	public final IObservable createObservable(Realm realm) {
-		return createObservableCollection(realm, 0);
-	}
-	
-	public Object createElement(IObservableCollection collection) {
-		//no op
-		return null;
-	}
-
-	public Object getElementType(IObservableCollection collection) {
-		//no op
-		return null;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/AbstractObservableContractDelegate.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/AbstractObservableContractDelegate.java
deleted file mode 100644
index 8146760..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/AbstractObservableContractDelegate.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance.delegate;
-
-import org.eclipse.core.databinding.observable.IObservable;
-
-/**
- * Abstract implementation of {@link IObservableContractDelegate}.
- * 
- * @since 1.1
- */
-public abstract class AbstractObservableContractDelegate implements
-		IObservableContractDelegate {
-
-	public void setUp() {
-		// no op
-	}
-
-	public void tearDown() {
-		// no op
-	}
-
-	public void change(IObservable observable) {
-		// no op
-	}
-
-	public void setStale(IObservable observable, boolean stale) {
-		// no op
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/AbstractObservableValueContractDelegate.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/AbstractObservableValueContractDelegate.java
deleted file mode 100644
index 6de2c2c..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/AbstractObservableValueContractDelegate.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance.delegate;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-
-/**
- * Abstract implementation of {@link IObservableValueContractDelegate}.
- * 
- * @since 1.1
- */
-public abstract class AbstractObservableValueContractDelegate extends
-		AbstractObservableContractDelegate implements
-		IObservableValueContractDelegate {
-
-	/**
-	 * Invokes {@link #createObservableValue(Realm)}.
-	 * @param realm 
-	 * @return observable
-	 */
-	public final IObservable createObservable(Realm realm) {
-		return createObservableValue(realm);
-	}
-
-	/**
-	 * Default implementation returns <code>null</code>.
-	 * @param observable 
-	 * @return value type
-	 */
-	public Object getValueType(IObservableValue observable) {
-		// no op
-		return null;
-	}
-	
-	/**
-	 * Default implementation returns <code>null</code>.
-	 * @param observable 
-	 * @return value
-	 */
-	public Object createValue(IObservableValue observable) {
-		//no op
-		return null;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/IObservableCollectionContractDelegate.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/IObservableCollectionContractDelegate.java
deleted file mode 100644
index 5fb412c..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/IObservableCollectionContractDelegate.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance.delegate;
-
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * Delegate interface for an IObservableCollection.
- * 
- * <p>
- * This interface is not intended to be implemented by clients. Clients should
- * instead subclass one of the classes that implement this interface. Note that
- * direct implementers of this interface outside of the framework will be broken
- * in future releases when methods are added to this interface.
- * </p>
- * 
- * @since 1.1
- */
-public interface IObservableCollectionContractDelegate extends
-		IObservableContractDelegate {
-	/**
-	 * Creates a new observable collection with the provided
-	 * <code>elementCount</code>.
-	 * 
-	 * @param realm realm of the collection
-	 * @param elementCount
-	 *            number of elements to initialize the collection with
-	 * 
-	 * @return new observable collection
-	 */
-	public IObservableCollection createObservableCollection(Realm realm, int elementCount);
-
-	/**
-	 * Creates a new element of the appropriate type for the provided
-	 * <code>collection</code>. This element will be employed to assert the
-	 * addition and removal of elements in the collection.
-	 * 
-	 * @param collection
-	 * @return valid element for the collection
-	 */
-	public Object createElement(IObservableCollection collection);
-
-	/**
-	 * Returns the expected type of the elements in the collection.
-	 * 
-	 * @param collection
-	 * @return element type
-	 */
-	public Object getElementType(IObservableCollection collection);
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/IObservableContractDelegate.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/IObservableContractDelegate.java
deleted file mode 100644
index bcd59bb..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/IObservableContractDelegate.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance.delegate;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * Delegate interface for observables.
- * 
- * <p>
- * This interface is not intended to be implemented by clients. Clients should
- * instead subclass one of the classes that implement this interface. Note that
- * direct implementers of this interface outside of the framework will be broken
- * in future releases when methods are added to this interface.
- * </p>
- * 
- * @since 1.1
- */
-public interface IObservableContractDelegate {
-	/**
-	 * Notifies the delegate of the start of a test.
-	 */
-	public void setUp();
-
-	/**
-	 * Notifies the delegate of the end of a test.
-	 */
-	public void tearDown();
-
-	/**
-	 * Invokes an operation to set the stale state of the provided
-	 * <code>observable</code>.
-	 * 
-	 * @param observable
-	 * @param stale
-	 */
-	public void setStale(IObservable observable, boolean stale);
-
-	/**
-	 * Creates a new observable.
-	 * 
-	 * @param realm realm of the observable
-	 * @return observable
-	 */
-	public IObservable createObservable(Realm realm);
-
-	/**
-	 * Invokes a change operation resulting in a change event being fired from
-	 * the observable. The preferred approach is to change the observed object
-	 * resulting in an observable event. There is no guaranteed as to the state
-	 * of the observable when invoked. The observable could be disposed to
-	 * assert the proper behavior of dispose.
-	 * 
-	 * @param observable
-	 */
-	public void change(IObservable observable);
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/IObservableValueContractDelegate.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/IObservableValueContractDelegate.java
deleted file mode 100644
index 873b005..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/delegate/IObservableValueContractDelegate.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance.delegate;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-
-/**
- * Delegate interface for an observable value.
- * 
- * <p>
- * This interface is not intended to be implemented by clients. Clients should
- * instead subclass one of the classes that implement this interface. Note that
- * direct implementers of this interface outside of the framework will be broken
- * in future releases when methods are added to this interface.
- * </p>
- * 
- * @since 1.1
- */
-public interface IObservableValueContractDelegate extends
-		IObservableContractDelegate {
-
-	/**
-	 * Creates a new observable value.
-	 * 
-	 * @param realm
-	 *            realm of the observable
-	 * @return observable value
-	 */
-	public IObservableValue createObservableValue(Realm realm);
-
-	/**
-	 * Returns the expected type of the observable.
-	 * 
-	 * @param observable
-	 * @return type
-	 */
-	public Object getValueType(IObservableValue observable);
-	
-	/**
-	 * Returns a valid value that is not the current value of the observable.
-	 * 
-	 * @param observable
-	 * @return value
-	 */
-	public Object createValue(IObservableValue observable);
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/swt/SWTMutableObservableValueContractTest.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/swt/SWTMutableObservableValueContractTest.java
deleted file mode 100644
index b16fb6e..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/swt/SWTMutableObservableValueContractTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance.swt;
-
-import junit.framework.Test;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.IObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.DelegatingRealm;
-import org.eclipse.jface.databinding.conformance.util.SuiteBuilder;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Mutability tests for IObservableValue for a SWT widget.
- * 
- * <p>
- * This class is experimental and can change at any time. It is recommended to
- * not subclass or assume the test names will not change. The only API that is
- * guaranteed to not change are the constructors. The tests will remain public
- * and not final in order to allow for consumers to turn off a test if needed by
- * subclassing.
- * </p>
- * 
- * @since 3.2
- */
-public class SWTMutableObservableValueContractTest extends
-		MutableObservableValueContractTest {
-	private IObservableValueContractDelegate delegate;
-
-	public SWTMutableObservableValueContractTest(
-			IObservableValueContractDelegate delegate) {
-		this(null, delegate);
-	}
-
-	/**
-	 * @param testName
-	 * @param delegate
-	 */
-	public SWTMutableObservableValueContractTest(String testName,
-			IObservableValueContractDelegate delegate) {
-		super(testName, delegate);
-		this.delegate = delegate;
-	}
-
-	/**
-	 * Creates a new observable passing the realm for the current display.
-	 * @return observable
-	 */
-	protected IObservable doCreateObservable() {
-		Display display = Display.getCurrent();
-		if (display == null) {
-			display = new Display();
-		}
-		DelegatingRealm delegateRealm = new DelegatingRealm(SWTObservables
-				.getRealm(display));
-		delegateRealm.setCurrent(true);
-
-		return delegate.createObservable(delegateRealm);
-	}
-
-	public static Test suite(IObservableValueContractDelegate delegate) {
-		return new SuiteBuilder().addObservableContractTest(
-				SWTMutableObservableValueContractTest.class, delegate)
-				.addObservableContractTest(
-						SWTObservableValueContractTest.class, delegate).build();
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/swt/SWTObservableValueContractTest.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/swt/SWTObservableValueContractTest.java
deleted file mode 100644
index ef21669..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/swt/SWTObservableValueContractTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance.swt;
-
-import junit.framework.Test;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.jface.databinding.conformance.ObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.IObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.DelegatingRealm;
-import org.eclipse.jface.databinding.conformance.util.SuiteBuilder;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Tests for IObservableValue that don't mutate the value.
- * <p>
- * This class is experimental and can change at any time. It is recommended to
- * not subclass or assume the test names will not change. The only API that is
- * guaranteed to not change are the constructors. The tests will remain public
- * and not final in order to allow for consumers to turn off a test if needed by
- * subclassing.
- * </p>
- * 
- * @since 3.2
- */
-public class SWTObservableValueContractTest extends ObservableValueContractTest {
-	private IObservableValueContractDelegate delegate;
-
-	/**
-	 * @param delegate
-	 */
-	public SWTObservableValueContractTest(
-			IObservableValueContractDelegate delegate) {
-		this(null, delegate);
-	}
-
-	public SWTObservableValueContractTest(String testName,
-			IObservableValueContractDelegate delegate) {
-		super(testName, delegate);
-		this.delegate = delegate;
-	}
-
-	/**
-	 * Creates a new observable passing the realm for the current display.
-	 * @return observable
-	 */
-	protected IObservable doCreateObservable() {
-		Display display = Display.getCurrent();
-		if (display == null) {
-			display = new Display();
-		}
-		DelegatingRealm delegateRealm = new DelegatingRealm(SWTObservables
-				.getRealm(display));
-		delegateRealm.setCurrent(true);
-
-		return delegate.createObservable(delegateRealm);
-	}
-
-	public static Test suite(IObservableValueContractDelegate delegate) {
-		return new SuiteBuilder().addObservableContractTest(SWTObservableValueContractTest.class, delegate).build();
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/ChangeEventTracker.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/ChangeEventTracker.java
deleted file mode 100644
index 1e38756..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/ChangeEventTracker.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.databinding.conformance.util;
-
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-
-/**
- * Listener for tracking the firing of ChangeEvents.
- */
-public class ChangeEventTracker implements IChangeListener {
-	public int count;
-	public ChangeEvent event;
-
-	/**
-	 * Queue that the listener will add itself too when it is notified of an
-	 * event. Used to determine order of notifications of listeners.  Can be null.
-	 */
-	public final List queue;
-
-	public ChangeEventTracker() {
-		queue = null;
-	}
-
-	public ChangeEventTracker(List notificationQueue) {
-		this.queue = notificationQueue;
-	}
-
-	public void handleChange(ChangeEvent event) {
-		count++;
-		this.event = event;
-		if (queue != null) {
-			queue.add(this);
-		}
-	}
-
-	/**
-	 * Convenience method to register a new listener.
-	 * 
-	 * @param observable
-	 * @return tracker
-	 */
-	public static ChangeEventTracker observe(IObservable observable) {
-		ChangeEventTracker tracker = new ChangeEventTracker();
-		observable.addChangeListener(tracker);
-		return tracker;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/CurrentRealm.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/CurrentRealm.java
deleted file mode 100644
index 82e56fb..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/CurrentRealm.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.databinding.conformance.util;
-
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * Allows for the toggling of the current status of the realm. The
- * asyncExec(...) implementations do nothing.
- * 
- * @since 3.2
- */
-public class CurrentRealm extends Realm {
-	private boolean current;
-
-	public CurrentRealm() {
-		this(false);
-	}
-
-	public CurrentRealm(boolean current) {
-		this.current = current;
-	}
-
-	public boolean isCurrent() {
-		return current;
-	}
-
-	public void setCurrent(boolean current) {
-		this.current = current;
-	}
-
-	protected void syncExec(Runnable runnable) {
-		super.syncExec(runnable);
-	}
-
-	public void asyncExec(Runnable runnable) {
-		throw new UnsupportedOperationException(
-				"CurrentRealm does not support asyncExec(Runnable)."); //$NON-NLS-1$
-	}
-
-	protected static Realm setDefault(Realm realm) {
-		return Realm.setDefault(realm);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/DelegatingRealm.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/DelegatingRealm.java
deleted file mode 100644
index 229d5fc..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/DelegatingRealm.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.databinding.conformance.util;
-
-import org.eclipse.core.databinding.observable.Realm;
-
-/**
- * Realm that will delegate to another for all operations except calls to
- * {@link #isCurrent()}. The current status can be set by the consumer to
- * enable testing of realm checks.
- * 
- * @since 3.2
- */
-public class DelegatingRealm extends CurrentRealm {
-	private Realm realm;
-
-	public DelegatingRealm(Realm realm) {
-		this.realm = realm;
-	}
-
-	protected void syncExec(Runnable runnable) {
-		realm.exec(runnable);
-	}
-
-	public void asyncExec(Runnable runnable) {
-		realm.asyncExec(runnable);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/DisposeEventTracker.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/DisposeEventTracker.java
deleted file mode 100644
index 130acef..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/DisposeEventTracker.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 146397)
- *******************************************************************************/
-package org.eclipse.jface.databinding.conformance.util;
-
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.DisposeEvent;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-
-/**
- * Listener for tracking the firing of DisposeEvents.
- */
-public class DisposeEventTracker implements IDisposeListener {
-	public int count;
-	public DisposeEvent event;
-
-	/**
-	 * Queue that the listener will add itself too when it is notified of an
-	 * event. Used to determine order of notifications of listeners. Can be
-	 * null.
-	 */
-	public final List queue;
-
-	public DisposeEventTracker() {
-		queue = null;
-	}
-
-	public DisposeEventTracker(List notificationQueue) {
-		this.queue = notificationQueue;
-	}
-
-	public void handleDispose(DisposeEvent event) {
-		count++;
-		this.event = event;
-		if (queue != null) {
-			queue.add(this);
-		}
-	}
-
-	/**
-	 * Convenience method to register a new listener.
-	 * 
-	 * @param observable
-	 * @return tracker
-	 */
-	public static DisposeEventTracker observe(IObservable observable) {
-		DisposeEventTracker tracker = new DisposeEventTracker();
-		observable.addDisposeListener(tracker);
-		return tracker;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/ListChangeEventTracker.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/ListChangeEventTracker.java
deleted file mode 100644
index da2a263..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/ListChangeEventTracker.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.databinding.conformance.util;
-
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-
-/**
- * Listener for tracking the firing of ListChangeEvents.
- */
-public class ListChangeEventTracker implements IListChangeListener {
-	public int count;
-
-	public ListChangeEvent event;
-
-	/**
-	 * Queue that the listener will add itself too when it is notified of an
-	 * event. Used to determine order of notifications of listeners.
-	 */
-	public final List listenerQueue;
-
-	public ListChangeEventTracker() {
-		this(null);
-	}
-
-	public ListChangeEventTracker(List listenerQueue) {
-		this.listenerQueue = listenerQueue;
-	}
-
-	public void handleListChange(ListChangeEvent event) {
-		count++;
-		this.event = event;
-		if (listenerQueue != null) {
-			listenerQueue.add(this);
-		}
-	}
-	
-	/**
-	 * Convenience method to register a new listener.
-	 * 
-	 * @param observable
-	 * @return tracker
-	 */
-	public static ListChangeEventTracker observe(IObservableList observable) {
-		ListChangeEventTracker tracker = new ListChangeEventTracker();
-		observable.addListChangeListener(tracker);
-		return tracker;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/MapChangeEventTracker.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/MapChangeEventTracker.java
deleted file mode 100644
index 52e87e9..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/MapChangeEventTracker.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.databinding.conformance.util;
-
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.map.MapChangeEvent;
-
-/**
- * Listener for tracking the firing of ChangeEvents.
- */
-public class MapChangeEventTracker implements IMapChangeListener {
-	public int count;
-
-	public MapChangeEvent event;
-
-	public List queue;
-	
-	public MapChangeEventTracker() {
-		this(null);
-	}
-	
-	public MapChangeEventTracker(List queue) {
-		this.queue = queue;
-	}
-
-	public void handleMapChange(MapChangeEvent event) {
-		count++;
-		this.event = event;
-		
-		if (queue != null) {
-			queue.add(this);
-		}
-	}
-	
-	/**
-	 * Convenience method to register a new listener.
-	 * 
-	 * @param observable
-	 * @return tracker
-	 */
-	public static MapChangeEventTracker observe(IObservableMap observable) {
-		MapChangeEventTracker tracker = new MapChangeEventTracker();
-		observable.addMapChangeListener(tracker);
-		return tracker;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/RealmTester.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/RealmTester.java
deleted file mode 100644
index bae6b17..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/RealmTester.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance.util;
-
-import junit.framework.Assert;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.runtime.AssertionFailedException;
-
-/**
- * Aids in the testing of Realms.
- * 
- * @since 3.2
- */
-public class RealmTester {
-
-	/**
-	 * Sets the default realm without using Realm.runWithDefault() for testing
-	 * purposes.
-	 * 
-	 * @param realm
-	 */
-	public static void setDefault(Realm realm) {
-		CurrentRealm.setDefault(realm);
-	}
-
-	/**
-	 * Runs the provided <code>runnable</code> when the realm is both current
-	 * and not current. It checks for AssertionFailedExceptions and if an
-	 * exception occurs or doesn't occur as expected the test fails. The realm
-	 * of an observable created before the method was invoked must be of type
-	 * {@link CurrentRealm}. The default realm during the runnable invocation
-	 * is set to an instance of {@link CurrentRealm} when the runnable is
-	 * invoked.
-	 * 
-	 * @param runnable
-	 */
-	public static void exerciseCurrent(Runnable runnable) {
-		CurrentRealm previousRealm = (CurrentRealm) Realm.getDefault();
-		CurrentRealm realm = new CurrentRealm();
-		setDefault(realm);
-
-		try {
-			realm.setCurrent(true);
-			if (previousRealm != null) {
-				previousRealm.setCurrent(true);
-			}
-
-			try {
-				runnable.run();
-			} catch (AssertionFailedException e) {
-				Assert
-						.fail("Correct realm, exception should not have been thrown");
-			}
-
-			realm.setCurrent(false);
-			if (previousRealm != null) {
-				previousRealm.setCurrent(false);
-			}
-
-			try {
-				runnable.run();
-				Assert
-						.fail("Incorrect realm, exception should have been thrown");
-			} catch (AssertionFailedException e) {
-			}
-		} finally {
-			setDefault(previousRealm);
-		}
-	}
-
-	/**
-	 * Runs the provided <code>runnable</code> when the realm is both current
-	 * and not current. It checks for AssertionFailedExceptions and if an
-	 * exception occurs or doesn't occur as expected the test fails.
-	 * 
-	 * @param runnable
-	 * @param realm
-	 */
-	public static void exerciseCurrent(Runnable runnable, CurrentRealm realm) {
-		realm.setCurrent(true);
-
-		try {
-			runnable.run();
-		} catch (AssertionFailedException e) {
-			Assert.fail("Correct realm, exception should not have been thrown");
-		}
-
-		realm.setCurrent(false);
-
-		try {
-			runnable.run();
-			Assert.fail("Incorrect realm, exception should have been thrown");
-		} catch (AssertionFailedException e) {
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/SetChangeEventTracker.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/SetChangeEventTracker.java
deleted file mode 100644
index 9de2f88..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/SetChangeEventTracker.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.databinding.conformance.util;
-
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-
-public class SetChangeEventTracker implements ISetChangeListener {
-	public int count;
-
-	public SetChangeEvent event;
-
-	/**
-	 * Queue that the listener will add itself too when it is notified of an
-	 * event. Used to determine order of notifications of listeners.
-	 */
-	public final List listenerQueue;
-
-	public SetChangeEventTracker() {
-		this(null);
-	}
-
-	public SetChangeEventTracker(List notificationQueue) {
-		this.listenerQueue = notificationQueue;
-	}
-
-	public void handleSetChange(SetChangeEvent event) {
-		count++;
-		this.event = event;
-		if (listenerQueue != null) {
-			listenerQueue.add(this);
-		}
-	}
-	
-	/**
-	 * Convenience method to register a new listener.
-	 * 
-	 * @param observable
-	 * @return tracker
-	 */
-	public static SetChangeEventTracker observe(IObservableSet observable) {
-		SetChangeEventTracker tracker = new SetChangeEventTracker();
-		observable.addSetChangeListener(tracker);
-		return tracker;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/StaleEventTracker.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/StaleEventTracker.java
deleted file mode 100644
index b10c1e2..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/StaleEventTracker.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Ovidio Mallo - bug 242166
- *******************************************************************************/
-package org.eclipse.jface.databinding.conformance.util;
-
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.StaleEvent;
-
-/**
- * Listener for tracking the firing of StaleEvents.
- * @since 1.1
- */
-public class StaleEventTracker implements IStaleListener {
-	public int count;
-
-	public StaleEvent event;
-
-	/**
-	 * Queue that the listener will add itself too when it is notified of an
-	 * event. Used to determine order of notifications of listeners. Can be
-	 * null.
-	 */
-	public final List queue;
-
-	public StaleEventTracker() {
-		this(null);
-	}
-
-	public StaleEventTracker(List notificationQueue) {
-		this.queue = notificationQueue;
-	}
-
-	public void handleStale(StaleEvent event) {
-		count++;
-		this.event = event;
-		if (queue != null) {
-			queue.add(this);
-		}
-	}
-
-	/**
-	 * Convenience method to register a new listener.
-	 * 
-	 * @param observable
-	 * @return tracker
-	 */
-	public static StaleEventTracker observe(IObservable observable) {
-		StaleEventTracker tracker = new StaleEventTracker();
-		observable.addStaleListener(tracker);
-		return tracker;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/SuiteBuilder.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/SuiteBuilder.java
deleted file mode 100644
index cc50de5..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/SuiteBuilder.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 208322
- ******************************************************************************/
-
-package org.eclipse.jface.databinding.conformance.util;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-
-import org.eclipse.jface.databinding.conformance.delegate.IObservableContractDelegate;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Builds a test suite.
- * 
- * @since 1.1
- */
-public class SuiteBuilder {
-	private LinkedHashSet content;
-
-	public SuiteBuilder() {
-		content = new LinkedHashSet();
-	}
-
-	/**
-	 * Adds all test methods from the provided <code>testCase</code> to the
-	 * suite.
-	 * 
-	 * @param testCase
-	 * @return builder
-	 */
-	public SuiteBuilder addTests(Class testCase) {
-		content.add(testCase);
-		return this;
-	}
-
-	/**
-	 * Adds all test methods from the provided <code>testCase</code> with the
-	 * provided <code>parameters</code>. A constructor must exist in the
-	 * testCase that accepts a String as the first parameter followed by
-	 * parameters matching the provided parameters. If an appropriate
-	 * constructor is not found an exception will be thrown.
-	 * 
-	 * @param testCase
-	 * @param parameters
-	 * @return builder
-	 */
-	public SuiteBuilder addParameterizedTests(Class testCase,
-			Object[] parameters) {
-
-		Constructor constructor = findConstructor(testCase, parameters);
-		if (constructor == null) {
-			throw new IllegalArgumentException(
-					"The parameters provided don't match a constructor found in ["
-							+ testCase.getName() + "]");
-		}
-
-		content.add(new ParameterizedTest(testCase, constructor, parameters));
-
-		return this;
-	}
-
-	/**
-	 * Convenience method for invoking
-	 * {@link #addParameterizedTests(Class, Object[])} with a delegate.
-	 * 
-	 * @param testCase
-	 * @param delegate
-	 * @return builder
-	 */
-	public SuiteBuilder addObservableContractTest(Class testCase,
-			IObservableContractDelegate delegate) {
-
-		addParameterizedTests(testCase, new Object[] {delegate});
-		return this;
-	}
-
-	/**
-	 * Builds a new TestSuite out of the tests.
-	 * 
-	 * @return suite
-	 */
-	public TestSuite build() {
-		TestSuite suite = new TestSuite();
-
-		for (Iterator it = content.iterator(); it.hasNext();) {
-			Object o = it.next();
-			if (o instanceof Class) {
-				suite.addTestSuite((Class) o);
-			} else if (o instanceof ParameterizedTest) {
-				ParameterizedTest test = (ParameterizedTest) o;
-
-				// Outer test named for parameterized test class
-				TestSuite testClassSuite = new TestSuite();
-				testClassSuite.setName(test.testClass.getName());
-
-				// Inner test named for parameter
-				TestSuite parameterSuite = new TestSuite();
-				parameterSuite.setName(test.parameters[0].getClass().getName());
-				testClassSuite.addTest(parameterSuite);
-
-				Method[] methods = test.testClass.getMethods();
-				for (int i = 0; i < methods.length; i++) {
-					String name = methods[i].getName();
-					if (name.startsWith("test")) {
-						try {
-							parameterSuite.addTest((Test) test.constructor
-									.newInstance(toParamArray(name,
-											test.parameters)));
-						} catch (Exception e) {
-							throw new RuntimeException(e);
-						}
-					}
-				}
-
-				if (testClassSuite.countTestCases() > 0)
-					suite.addTest(testClassSuite);
-			}
-		}
-
-		return suite;
-	}
-
-	private Object[] toParamArray(String testName, Object[] parameters) {
-		Object[] result = new Object[parameters.length + 1];
-		result[0] = testName;
-		System.arraycopy(parameters, 0, result, 1, parameters.length);
-		return result;
-	}
-
-	/**
-	 * Returns the constructor that has a String as the first parameters and
-	 * then matches the type of the parameters.
-	 * @param clazz 
-	 * @param parameters
-	 * @return constructor
-	 */
-	private static Constructor findConstructor(Class clazz, Object[] parameters) {
-		Constructor[] constructors = clazz.getConstructors();
-		int expectedParametersLength = parameters.length + 1;
-
-		for (int i = 0; i < constructors.length; i++) {
-			Constructor constructor = constructors[i];
-			Class[] types = constructor.getParameterTypes();
-
-			if (types.length != expectedParametersLength
-					|| !String.class.equals(types[0])) {
-				continue;
-			}
-
-			boolean skip = false;
-			for (int j = 1; j < types.length; j++) {
-				Class type = types[j];
-				if (!type.isInstance(parameters[j - 1])) {
-					skip = true;
-					break;
-				}
-			}
-
-			if (!skip) {
-				return constructor;
-			}
-		}
-
-		return null;
-	}
-
-	/* package */static class ParameterizedTest {
-		final Constructor constructor;
-
-		final Object[] parameters;
-
-		private Class testClass;
-
-		ParameterizedTest(Class testClass, Constructor constructor,
-				Object[] parameterss) {
-			this.testClass = testClass;
-			this.constructor = constructor;
-			this.parameters = parameterss;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/ValueChangeEventTracker.java b/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/ValueChangeEventTracker.java
deleted file mode 100644
index b54bd14..0000000
--- a/tests/org.eclipse.jface.tests.databinding.conformance/src/org/eclipse/jface/databinding/conformance/util/ValueChangeEventTracker.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.databinding.conformance.util;
-
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-
-/**
- * Listener for tracking the firing of ValueChangeEvents.
- */
-public class ValueChangeEventTracker implements IValueChangeListener {
-	public int count;
-
-	public ValueChangeEvent event;
-
-	public final List queue;
-
-	public ValueChangeEventTracker() {
-		this(null);
-	}
-
-	public ValueChangeEventTracker(List queue) {
-		this.queue = queue;
-	}
-
-	public void handleValueChange(ValueChangeEvent event) {
-		count++;
-		this.event = event;
-
-		if (queue != null) {
-			queue.add(this);
-		}
-	}
-
-	/**
-	 * Convenience method to register a new listener.
-	 * 
-	 * @param observable
-	 * @return tracker
-	 */
-	public static ValueChangeEventTracker observe(IObservableValue observable) {
-		ValueChangeEventTracker tracker = new ValueChangeEventTracker();
-		observable.addValueChangeListener(tracker);
-		return tracker;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/.classpath b/tests/org.eclipse.jface.tests.databinding/.classpath
deleted file mode 100644
index ce73933..0000000
--- a/tests/org.eclipse.jface.tests.databinding/.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/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tests/org.eclipse.jface.tests.databinding/.cvsignore b/tests/org.eclipse.jface.tests.databinding/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/tests/org.eclipse.jface.tests.databinding/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/tests/org.eclipse.jface.tests.databinding/.project b/tests/org.eclipse.jface.tests.databinding/.project
deleted file mode 100644
index 815de41..0000000
--- a/tests/org.eclipse.jface.tests.databinding/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jface.tests.databinding</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/tests/org.eclipse.jface.tests.databinding/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.jface.tests.databinding/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 9ad30f4..0000000
--- a/tests/org.eclipse.jface.tests.databinding/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,354 +0,0 @@
-#Fri Apr 04 13:14:00 GMT-07:00 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=ignore
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=80
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=tab
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/tests/org.eclipse.jface.tests.databinding/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.jface.tests.databinding/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 8ee15567..0000000
--- a/tests/org.eclipse.jface.tests.databinding/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,116 +0,0 @@
-#Mon Dec 03 13:56:42 EST 2007
-cleanup.add_default_serial_version_id=true
-cleanup.add_generated_serial_version_id=false
-cleanup.add_missing_annotations=true
-cleanup.add_missing_deprecated_annotations=true
-cleanup.add_missing_methods=false
-cleanup.add_missing_nls_tags=false
-cleanup.add_missing_override_annotations=true
-cleanup.add_serial_version_id=false
-cleanup.always_use_blocks=true
-cleanup.always_use_parentheses_in_expressions=false
-cleanup.always_use_this_for_non_static_field_access=false
-cleanup.always_use_this_for_non_static_method_access=false
-cleanup.convert_to_enhanced_for_loop=false
-cleanup.correct_indentation=false
-cleanup.format_source_code=false
-cleanup.format_source_code_changes_only=false
-cleanup.make_local_variable_final=true
-cleanup.make_parameters_final=false
-cleanup.make_private_fields_final=true
-cleanup.make_variable_declarations_final=false
-cleanup.never_use_blocks=false
-cleanup.never_use_parentheses_in_expressions=true
-cleanup.organize_imports=false
-cleanup.qualify_static_field_accesses_with_declaring_class=false
-cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-cleanup.qualify_static_member_accesses_with_declaring_class=true
-cleanup.qualify_static_method_accesses_with_declaring_class=false
-cleanup.remove_private_constructors=true
-cleanup.remove_trailing_whitespaces=false
-cleanup.remove_trailing_whitespaces_all=true
-cleanup.remove_trailing_whitespaces_ignore_empty=false
-cleanup.remove_unnecessary_casts=true
-cleanup.remove_unnecessary_nls_tags=true
-cleanup.remove_unused_imports=true
-cleanup.remove_unused_local_variables=false
-cleanup.remove_unused_private_fields=true
-cleanup.remove_unused_private_members=false
-cleanup.remove_unused_private_methods=true
-cleanup.remove_unused_private_types=true
-cleanup.sort_members=false
-cleanup.sort_members_all=false
-cleanup.use_blocks=false
-cleanup.use_blocks_only_for_return_and_throw=false
-cleanup.use_parentheses_in_expressions=false
-cleanup.use_this_for_non_static_field_access=false
-cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-cleanup.use_this_for_non_static_method_access=false
-cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-cleanup_profile=org.eclipse.jdt.ui.default.eclipse_clean_up_profile
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=false
-formatter_profile=org.eclipse.jdt.ui.default.eclipse_profile
-formatter_settings_version=11
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.ignorelowercasenames=true
-org.eclipse.jdt.ui.importorder=java;javax;org;com;
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.ondemandthreshold=99
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.staticondemandthreshold=99
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} The ${bare_field_name} to set.\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\r\n * Copyright (c) ${year} IBM Corporation and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     IBM Corporation - initial API and implementation\r\n ******************************************************************************/\r\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @since 3.2\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template></templates>
-sp_cleanup.add_default_serial_version_id=true
-sp_cleanup.add_generated_serial_version_id=false
-sp_cleanup.add_missing_annotations=true
-sp_cleanup.add_missing_deprecated_annotations=true
-sp_cleanup.add_missing_methods=false
-sp_cleanup.add_missing_nls_tags=false
-sp_cleanup.add_missing_override_annotations=true
-sp_cleanup.add_serial_version_id=false
-sp_cleanup.always_use_blocks=true
-sp_cleanup.always_use_parentheses_in_expressions=false
-sp_cleanup.always_use_this_for_non_static_field_access=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=false
-sp_cleanup.correct_indentation=false
-sp_cleanup.format_source_code=false
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_variable_declarations_final=true
-sp_cleanup.never_use_blocks=false
-sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=false
-sp_cleanup.organize_imports=true
-sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
-sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
-sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=false
-sp_cleanup.remove_trailing_whitespaces_all=true
-sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
-sp_cleanup.remove_unnecessary_casts=true
-sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
-sp_cleanup.remove_unused_local_variables=false
-sp_cleanup.remove_unused_private_fields=true
-sp_cleanup.remove_unused_private_members=false
-sp_cleanup.remove_unused_private_methods=true
-sp_cleanup.remove_unused_private_types=true
-sp_cleanup.sort_members=false
-sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=false
-sp_cleanup.use_blocks_only_for_return_and_throw=false
-sp_cleanup.use_parentheses_in_expressions=false
-sp_cleanup.use_this_for_non_static_field_access=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/tests/org.eclipse.jface.tests.databinding/.settings/org.eclipse.pde.prefs b/tests/org.eclipse.jface.tests.databinding/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 12a7331..0000000
--- a/tests/org.eclipse.jface.tests.databinding/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,18 +0,0 @@
-#Mon Dec 03 13:56:42 EST 2007
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=0
-compilers.p.illegal-att-value=0
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=2
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/tests/org.eclipse.jface.tests.databinding/JFace-Data Binding Test Suite.launch b/tests/org.eclipse.jface.tests.databinding/JFace-Data Binding Test Suite.launch
deleted file mode 100644
index f4ba8c5..0000000
--- a/tests/org.eclipse.jface.tests.databinding/JFace-Data Binding Test Suite.launch
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
-<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
-<booleanAttribute key="askclear" value="false"/>
-<booleanAttribute key="automaticAdd" value="true"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="checked" value="[NONE]"/>
-<booleanAttribute key="clearConfig" value="true"/>
-<booleanAttribute key="clearws" value="true"/>
-<booleanAttribute key="clearwslog" value="false"/>
-<booleanAttribute key="com.mountainminds.eclemma.core.INPLACE_INSTRUMENTATION" value="true"/>
-<listAttribute key="com.mountainminds.eclemma.core.INSTRUMENTATION_PATHS">
-<listEntry value="/org.eclipse.jface.databinding/bin"/>
-<listEntry value="/org.eclipse.core.databinding.beans/bin"/>
-<listEntry value="/org.eclipse.core.databinding/bin"/>
-</listAttribute>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
-<booleanAttribute key="default" value="true"/>
-<booleanAttribute key="includeOptional" value="true"/>
-<stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSuite.java"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.jface.tests.databinding.BindingTestSuite"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.jface.tests.databinding"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<stringAttribute key="product" value="org.eclipse.sdk.ide"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="templateConfig" value=""/>
-<booleanAttribute key="tracing" value="false"/>
-<booleanAttribute key="useDefaultConfig" value="true"/>
-<booleanAttribute key="useDefaultConfigArea" value="false"/>
-<booleanAttribute key="useProduct" value="false"/>
-</launchConfiguration>
diff --git a/tests/org.eclipse.jface.tests.databinding/META-INF/MANIFEST.MF b/tests/org.eclipse.jface.tests.databinding/META-INF/MANIFEST.MF
deleted file mode 100644
index 1697f05..0000000
--- a/tests/org.eclipse.jface.tests.databinding/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jface.tests.databinding
-Bundle-Version: 1.0.100.qualifier
-Bundle-ClassPath: jfacebindingtests.jar
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.databinding,
- org.junit,
- org.eclipse.swt,
- org.eclipse.jface,
- org.eclipse.core.runtime,
- org.eclipse.jface.examples.databinding,
- org.eclipse.core.databinding.beans,
- org.eclipse.jface.databinding,
- org.eclipse.jface.tests.databinding.conformance
-Import-Package: com.ibm.icu.math,
- com.ibm.icu.text
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/tests/org.eclipse.jface.tests.databinding/about.html b/tests/org.eclipse.jface.tests.databinding/about.html
deleted file mode 100644
index 4602330..0000000
--- a/tests/org.eclipse.jface.tests.databinding/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.jface.tests.databinding/build.properties b/tests/org.eclipse.jface.tests.databinding/build.properties
deleted file mode 100644
index e671f5a..0000000
--- a/tests/org.eclipse.jface.tests.databinding/build.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.jfacebindingtests.jar = src/
-               
-src.includes = about.html
-output.jfacebindingtests.jar = bin/
-bin.includes = META-INF/,\
-               about.html,\
-               test.xml,\
-               *.html,\
-               jfacebindingtests.jar,\
-               plugin.properties
diff --git a/tests/org.eclipse.jface.tests.databinding/plugin.properties b/tests/org.eclipse.jface.tests.databinding/plugin.properties
deleted file mode 100644
index 6f8acfc..0000000
--- a/tests/org.eclipse.jface.tests.databinding/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-pluginName = JFace Data Binding Tests
-providerName = Eclipse.org
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/AggregateValidationStatusTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/AggregateValidationStatusTest.java
deleted file mode 100644
index 28d5b06..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/AggregateValidationStatusTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding;
-
-import org.eclipse.core.databinding.AggregateValidationStatus;
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
-
-/**
- * @since 1.1
- */
-public class AggregateValidationStatusTest extends AbstractSWTTestCase {
-	public void testAggregateValidationStatusValueType() throws Exception {
-		DataBindingContext dbc = new DataBindingContext();
-		AggregateValidationStatus status = new AggregateValidationStatus(dbc
-				.getBindings(), AggregateValidationStatus.MAX_SEVERITY);
-		assertEquals(IStatus.class, status.getValueType());
-	}
-
-	public void testConstructor_DefaultRealm() throws Exception {
-		DataBindingContext dbc = new DataBindingContext();
-		AggregateValidationStatus status = new AggregateValidationStatus(dbc
-				.getBindings(), AggregateValidationStatus.MAX_SEVERITY);
-		assertEquals(Realm.getDefault(), status.getRealm());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/BindingTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/BindingTest.java
deleted file mode 100644
index b175bfb..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/BindingTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 254524)
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding;
-
-import org.eclipse.core.databinding.Binding;
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-public class BindingTest extends AbstractDefaultRealmTestCase {
-	private IObservable target;
-
-	private IObservable model;
-
-	private DataBindingContext dbc;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		target = WritableValue.withValueType(String.class);
-		model = WritableValue.withValueType(String.class);
-		dbc = new DataBindingContext();
-	}
-
-	public void testDisposeTargetDisposesBinding() {
-		Binding binding = createBinding();
-		assertFalse(binding.isDisposed());
-		target.dispose();
-		assertTrue(binding.isDisposed());
-	}
-
-	public void testDisposeModelDisposesBinding() {
-		Binding binding = createBinding();
-		assertFalse(binding.isDisposed());
-		model.dispose();
-		assertTrue(binding.isDisposed());
-	}
-
-	public void testPreDisposedTarget_FiresIllegalArgumentException() {
-		try {
-			target.dispose();
-			createBinding();
-			fail("Expected IllegalArgumentException");
-		} catch (IllegalArgumentException expected) {
-		}
-	}
-
-	public void testPreDisposedModel_FiresIllegalArgumentException() {
-		try {
-			model.dispose();
-			createBinding();
-			fail("Expected IllegalArgumentException");
-		} catch (IllegalArgumentException expected) {
-		}
-	}
-
-	public void testDisposeModelThenBinding() {
-		Binding binding = createBinding();
-		model.dispose();
-		binding.dispose();
-	}
-
-	public void testDisposeTargetThenBinding() {
-		Binding binding = createBinding();
-		target.dispose();
-		binding.dispose();
-	}
-
-	public void testDisposeObservablesThenBinding() {
-		Binding binding = createBinding();
-		model.dispose();
-		target.dispose();
-		binding.dispose();
-	}
-
-	public void testDisposeBindingThenModel() {
-		Binding binding = createBinding();
-		binding.dispose();
-		model.dispose();
-	}
-
-	public void testDisposeBindingThenTarget() {
-		Binding binding = createBinding();
-		binding.dispose();
-		target.dispose();
-	}
-
-	public void testDisposeBindingThenObservables() {
-		Binding binding = createBinding();
-		binding.dispose();
-		model.dispose();
-		target.dispose();
-	}
-
-	private Binding createBinding() {
-		Binding binding = new BindingStub(target, model);
-		binding.init(dbc);
-		return binding;
-	}
-
-	private static class BindingStub extends Binding {
-		BindingStub(IObservable target, IObservable model) {
-			super(target, model);
-		}
-
-		public IObservableValue getValidationStatus() {
-			return null;
-		}
-
-		protected void postInit() {
-		}
-
-		protected void preInit() {
-		}
-
-		public void updateModelToTarget() {
-		}
-
-		public void updateTargetToModel() {
-		}
-
-		public void validateModelToTarget() {
-		}
-
-		public void validateTargetToModel() {
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/DatabindingContextTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/DatabindingContextTest.java
deleted file mode 100755
index aa64437..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/DatabindingContextTest.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 159539
- *     Brad Reynolds - bug 140644
- *     Brad Reynolds - bug 159940
- *     Brad Reynolds - bug 116920, 159768
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-package org.eclipse.core.tests.databinding;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.databinding.AggregateValidationStatus;
-import org.eclipse.core.databinding.Binding;
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.UpdateListStrategy;
-import org.eclipse.core.databinding.UpdateValueStrategy;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-public class DatabindingContextTest extends AbstractDefaultRealmTestCase {
-	private DataBindingContext dbc;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		dbc = new DataBindingContext();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		if (dbc != null) {
-			dbc.dispose();
-		}
-		super.tearDown();
-	}
-
-	public void testDisposeBindings() throws Exception {
-		Binding binding = new BindingStub();
-		binding.init(dbc);
-
-		assertFalse(binding.isDisposed());
-		dbc.dispose();
-		assertTrue("binding should be diposed when dbc is disposed", binding
-				.isDisposed());
-	}
-
-	public void testBindValue() throws Exception {
-		IObservableValue target = WritableValue.withValueType(String.class);
-		IObservableValue model = WritableValue.withValueType(String.class);
-
-		Binding binding = dbc.bindValue(target, model, null, null);
-		assertTrue("binding is of the incorrect type",
-				binding.getClass().getName().endsWith("ValueBinding"));
-	}
-
-	public void testBindList() throws Exception {
-		IObservableList target = WritableList.withElementType(Object.class);
-		IObservableList model = WritableList.withElementType(Object.class);
-
-		Binding binding = dbc.bindList(target, model, null, null);
-		assertTrue("binding is of the incorrect type",
-				binding.getClass().getName().endsWith("ListBinding"));
-	}
-
-	/**
-	 * Asserts that IStatus is populated and change events are fired when a
-	 * Binding that is associated with a context is in error.
-	 * 
-	 * @throws Exception
-	 */
-	public void testValidationError() throws Exception {
-		WritableValue targetObservable = WritableValue.withValueType(String.class);
-		WritableValue modelObservable = WritableValue.withValueType(String.class);
-
-		final String errorMessage = "error";
-		ValueChangeEventTracker errorCounter = new ValueChangeEventTracker();
-		ChangeEventTracker errorsCounter = new ChangeEventTracker();
-
-		IObservableValue error = new AggregateValidationStatus(dbc
-				.getBindings(), AggregateValidationStatus.MAX_SEVERITY);
-		error.addValueChangeListener(errorCounter);
-		assertTrue(((IStatus) error.getValue()).isOK());
-
-		IObservableMap errors = dbc.getValidationStatusMap();
-		errors.addChangeListener(errorsCounter);
-		assertEquals(0, errors.size());
-
-		IValidator validator = new IValidator() {
-			public IStatus validate(Object value) {
-				return ValidationStatus.error(errorMessage);
-			}
-		};
-
-		dbc
-				.bindValue(targetObservable, modelObservable,
-						new UpdateValueStrategy().setAfterGetValidator(validator), null);
-
-		targetObservable.setValue("");
-		assertFalse(((IStatus) error.getValue()).isOK());
-		assertEquals(errorMessage, ((IStatus) error.getValue()).getMessage());
-		assertEquals(1, errors.size());
-		assertEquals(1, errorsCounter.count);
-		assertEquals(1, errorCounter.count);
-		error.dispose();
-	}
-
-	/**
-	 * Asserts that then
-	 * {@link DataBindingContext#bindValue(IObservableValue, IObservableValue, org.eclipse.jface.databinding.DefaultBindSpec, BindSpec)}
-	 * if invoked the created binding is added to the internal list of bindings.
-	 * 
-	 * @throws Exception
-	 */
-	public void testBindValueAddBinding() throws Exception {
-		WritableValue targetValue = WritableValue.withValueType(String.class);
-		WritableValue modelValue = WritableValue.withValueType(String.class);
-
-		assertNotNull(dbc.getBindings());
-		assertEquals(0, dbc.getBindings().size());
-
-		Binding binding = dbc.bindValue(targetValue, modelValue, null, null);
-		assertNotNull(binding);
-		assertNotNull(dbc.getBindings());
-		assertEquals(1, dbc.getBindings().size());
-		assertEquals(binding, dbc.getBindings().get(0));
-	}
-
-	/**
-	 * Asserts that when
-	 * {@link DataBindingContext#bindList(IObservableList, IObservableList, org.eclipse.jface.databinding.DefaultBindSpec, UpdateListStrategy)}
-	 * is invoked the created binding is added to the intenal list of bindings.
-	 * 
-	 * @throws Exception
-	 */
-	public void testBindListAddBinding() throws Exception {
-		WritableList targetList = new WritableList(new ArrayList(),
-				Object.class);
-		WritableList modelList = new WritableList(new ArrayList(), Object.class);
-
-		assertNotNull(dbc.getBindings());
-		assertEquals(0, dbc.getBindings().size());
-
-		Binding binding = dbc.bindList(targetList, modelList, null, null);
-		assertNotNull(binding);
-		assertNotNull(dbc.getBindings());
-		assertEquals(1, dbc.getBindings().size());
-		assertEquals(binding, dbc.getBindings().get(0));
-	}
-
-	public void testGetBindingsImmutability() throws Exception {
-		BindingStub binding = new BindingStub();
-		binding.init(dbc);
-
-		try {
-			dbc.getBindings().remove(0);
-			fail("exception should have been thrown");
-		} catch (UnsupportedOperationException e) {
-		}
-	}
-
-	public void testRemoveBinding() throws Exception {
-		BindingStub binding = new BindingStub();
-		binding.init(dbc);
-
-		assertTrue("context should contain the binding", dbc.getBindings()
-				.contains(binding));
-		binding.dispose();
-		assertFalse("binding should have been removed", dbc.getBindings()
-				.contains(binding));
-	}
-
-	/**
-	 * Asserts that when a ValueBinding is created validation is ran to ensure
-	 * that the validation status of the Binding reflects the validity of the
-	 * value in the target.
-	 * 
-	 * @throws Exception
-	 */
-	public void testValidateTargetAfterValueBindingCreation() throws Exception {
-		WritableValue target = new WritableValue("", String.class);
-		WritableValue model = new WritableValue("2", String.class);
-		class Validator implements IValidator {
-			public IStatus validate(Object value) {
-				return ValidationStatus.error("error");
-			}
-		}
-
-		Binding binding = dbc.bindValue(target, model,
-				new UpdateValueStrategy().setAfterConvertValidator(new Validator()), null);
-
-		assertEquals(IStatus.ERROR, ((IStatus) binding.getValidationStatus()
-				.getValue()).getSeverity());
-	}
-	
-	protected void assertNoErrorsFound() {
-		IStatus status = AggregateValidationStatus.getStatusMaxSeverity(dbc.getBindings());
-		assertTrue("No errors should be found, but found " + status , status.isOK());
-	}
-
-	protected void assertErrorsFound() {
-		IStatus status = AggregateValidationStatus.getStatusMaxSeverity(dbc.getBindings());
-		assertFalse("Errors should be found, but found none.", status.isOK());
-	}
-
-	private static class BindingStub extends Binding {
-		DataBindingContext context;
-
-		public BindingStub() {
-			super(new WritableValue(), new WritableValue());
-		}
-
-		public IObservableValue getValidationStatus() {
-			return null;
-		}
-
-		public void updateTargetToModel() {
-		}
-
-		public void updateModelToTarget() {
-		}
-
-		protected void postInit() {
-		}
-
-		protected void preInit() {
-		}
-
-		public void validateModelToTarget() {
-		}
-
-		public void validateTargetToModel() {
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/ListBindingTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/ListBindingTest.java
deleted file mode 100755
index cf97ec1..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/ListBindingTest.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920, 159768
- *******************************************************************************/
-
-package org.eclipse.core.tests.databinding;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.databinding.Binding;
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.UpdateListStrategy;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.BindingStatus;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 1.1
- */
-public class ListBindingTest extends AbstractDefaultRealmTestCase {
-	private IObservableList target;
-	private IObservableList model;
-	private DataBindingContext dbc;
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		target = new WritableList(new ArrayList(), String.class);
-		model = new WritableList(new ArrayList(), String.class);
-		dbc = new DataBindingContext();
-	}
-
-	public void testUpdateModelFromTarget() throws Exception {
-		Binding binding = dbc.bindList(target, model,
-				new UpdateListStrategy(UpdateListStrategy.POLICY_ON_REQUEST),
-				new UpdateListStrategy(UpdateListStrategy.POLICY_ON_REQUEST));
-		
-		target.add("1");
-		List targetCopy = new ArrayList(target.size());
-		targetCopy.addAll(target);
-		
-		model.add("2");
-		
-		assertFalse("target should not equal model", target.equals(model));
-		binding.updateTargetToModel();
-		assertEquals("target should not have changed", targetCopy, target);
-		assertEquals("target != model", target, model);
-	}
-
-	public void testUpdateTargetFromModel() throws Exception {
-		Binding binding = dbc.bindList(target, model,
-				new UpdateListStrategy(UpdateListStrategy.POLICY_ON_REQUEST),
-				new UpdateListStrategy(UpdateListStrategy.POLICY_ON_REQUEST));
-		
-		target.add("1");		
-		model.add("2");
-		
-		List modelCopy = new ArrayList(model.size());
-		modelCopy.addAll(model);
-		
-		assertFalse("model should not equal target", model.equals(target));
-		binding.updateModelToTarget();
-		
-		assertEquals("model should not have changed", modelCopy, model);
-		assertEquals("model != target", model, target);
-	}
-	
-	public void testGetTarget() throws Exception {
-		Binding binding = dbc.bindList(target, model,
-				null,
-				null);
-		assertEquals(target, binding.getTarget());
-	}
-	
-	public void testGetModel() throws Exception {
-		Binding binding = dbc.bindList(target, model,
-				null,
-				null);
-		assertEquals(model, binding.getModel());
-	}
-	
-	public void testStatusIsInstanceOfBindingStatus() throws Exception {
-		Binding binding = dbc.bindList(target, model, null, null);
-		assertTrue(binding.getValidationStatus().getValue() instanceof BindingStatus);
-	}
-	
-	public void testAddValidationStatusContainsMultipleStatuses() throws Exception {
-		UpdateListStrategy strategy = new UpdateListStrategy() {
-			protected IStatus doAdd(IObservableList observableList,
-					Object element, int index) {
-				super.doAdd(observableList, element, index);
-				
-				switch (index) {
-				case 0:
-					return ValidationStatus.error("");
-				case 1:
-					return ValidationStatus.info("");
-				}
-				
-				return null;
-			}
-		};
-		
-		Binding binding = dbc.bindList(target, model, strategy, null);
-		target.addAll(Arrays.asList(new String[] {"1", "2"}));
-		
-		IStatus status = (IStatus) binding.getValidationStatus().getValue();
-		assertEquals("maximum status", IStatus.ERROR, status.getSeverity());
-		assertTrue("multi status", status.isMultiStatus());
-		
-		IStatus[] children = status.getChildren();
-		assertEquals("multi status children", 2, children.length);
-		assertEquals("first status severity", IStatus.ERROR, children[0].getSeverity());
-		assertEquals("second status severity", IStatus.INFO, children[1].getSeverity());
-	}
-	
-	public void testRemoveValidationStatusContainsMultipleStatuses() throws Exception {
-		List items = Arrays.asList(new String[] {"1", "2"});
-		model.addAll(items);
-		
-		UpdateListStrategy strategy = new UpdateListStrategy() {
-			int count;
-			/* (non-Javadoc)
-			 * @see org.eclipse.core.databinding.UpdateListStrategy#doRemove(org.eclipse.core.databinding.observable.list.IObservableList, int)
-			 */
-			protected IStatus doRemove(IObservableList observableList, int index) {
-				super.doRemove(observableList, index);
-				
-				switch (count++) {
-				case 0:
-					return ValidationStatus.error("");
-				case 1:
-					return ValidationStatus.info("");
-				}
-				
-				return null; 	
-			}
-		};
-		
-		Binding binding = dbc.bindList(target, model, strategy, null);
-		target.removeAll(items);
-		
-		IStatus status = (IStatus) binding.getValidationStatus().getValue();
-		assertEquals("maximum status", IStatus.ERROR, status.getSeverity());
-		assertTrue("multi status", status.isMultiStatus());
-		
-		IStatus[] children = status.getChildren();
-		assertEquals("multi status children", 2, children.length);
-		assertEquals("first status severity", IStatus.ERROR, children[0].getSeverity());
-		assertEquals("second status severity", IStatus.INFO, children[1].getSeverity());
-	}
-	
-	public void testAddOKValidationStatus() throws Exception {
-		Binding binding = dbc.bindList(target, model, null, null);
-		target.add("1");
-		
-		IStatus status = (IStatus) binding.getValidationStatus().getValue();
-		assertTrue(status.isOK());
-		assertEquals(0, status.getChildren().length);
-	}
-	
-	public void testRemoveOKValidationStatus() throws Exception {
-		model.add("1");
-		Binding binding = dbc.bindList(target, model, null, null);
-		
-		target.remove("1");
-		IStatus status = (IStatus) binding.getValidationStatus().getValue();
-		assertTrue(status.isOK());
-		assertEquals(0, status.getChildren().length);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/ObservablesManagerTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/ObservablesManagerTest.java
deleted file mode 100644
index 7becb40..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/ObservablesManagerTest.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Bob Smith and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Bob Smith - initial API and implementation (bug 198880)
- *     Matthew Hall - bug 146397
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.ObservablesManager;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.2
- *
- */
-public class ObservablesManagerTest extends AbstractDefaultRealmTestCase {
-	private DataBindingContext dbc;
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		dbc = new DataBindingContext();
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		if (dbc != null) {
-			dbc.dispose();
-		}
-		super.tearDown();
-	}
-
-	public void testOnlyModelIsDisposed() throws Exception {
-
-		FlagOnDisposeObservableValue targetOv = new FlagOnDisposeObservableValue();
-		FlagOnDisposeObservableValue modelOv = new FlagOnDisposeObservableValue();
-		dbc.bindValue(targetOv, modelOv, null, null);
-
-		ObservablesManager observablesManager = new ObservablesManager();
-
-		observablesManager.addObservablesFromContext(dbc, false, true);
-		observablesManager.dispose();
-
-		assertFalse(targetOv.disposeCalled);
-		assertTrue(modelOv.disposeCalled);
-	}
-
-	public void testOnlyTargetIsDisposed() throws Exception {
-
-		FlagOnDisposeObservableValue targetOv = new FlagOnDisposeObservableValue();
-		FlagOnDisposeObservableValue modelOv = new FlagOnDisposeObservableValue();
-		dbc.bindValue(targetOv, modelOv, null, null);
-
-		ObservablesManager observablesManager = new ObservablesManager();
-
-		observablesManager.addObservablesFromContext(dbc, true, false);
-		observablesManager.dispose();
-
-		assertTrue(targetOv.disposeCalled);
-		assertFalse(modelOv.disposeCalled);
-	}
-
-	public void testTargetAndModelIsDisposed() throws Exception {
-
-		FlagOnDisposeObservableValue targetOv = new FlagOnDisposeObservableValue();
-		FlagOnDisposeObservableValue modelOv = new FlagOnDisposeObservableValue();
-		dbc.bindValue(targetOv, modelOv, null, null);
-
-		ObservablesManager observablesManager = new ObservablesManager();
-
-		observablesManager.addObservablesFromContext(dbc, true, true);
-		observablesManager.dispose();
-
-		assertTrue(targetOv.disposeCalled);
-		assertTrue(modelOv.disposeCalled);
-	}
-
-	private static class FlagOnDisposeObservableValue implements
-			IObservableValue {
-
-		private boolean disposeCalled = false;
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.databinding.observable.value.IObservableValue#addValueChangeListener(org.eclipse.core.databinding.observable.value.IValueChangeListener)
-		 */
-		public void addValueChangeListener(IValueChangeListener listener) {
-			// dummy
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.databinding.observable.value.IObservableValue#getValue()
-		 */
-		public Object getValue() {
-			// dummy
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.databinding.observable.value.IObservableValue#getValueType()
-		 */
-		public Object getValueType() {
-			// dummy
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.databinding.observable.value.IObservableValue#removeValueChangeListener(org.eclipse.core.databinding.observable.value.IValueChangeListener)
-		 */
-		public void removeValueChangeListener(IValueChangeListener listener) {
-			// dummy
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.databinding.observable.value.IObservableValue#setValue(java.lang.Object)
-		 */
-		public void setValue(Object value) {
-			// dummy
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.databinding.observable.IObservable#addChangeListener(org.eclipse.core.databinding.observable.IChangeListener)
-		 */
-		public void addChangeListener(IChangeListener listener) {
-			// dummy
-
-		}
-
-		public void addDisposeListener(IDisposeListener listener) {
-			// dummy
-	
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.databinding.observable.IObservable#addStaleListener(org.eclipse.core.databinding.observable.IStaleListener)
-		 */
-		public void addStaleListener(IStaleListener listener) {
-			// dummy
-
-		}
-
-		public boolean isDisposed() {
-			return disposeCalled;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.databinding.observable.IObservable#dispose()
-		 */
-		public void dispose() {
-			disposeCalled = true;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.databinding.observable.IObservable#getRealm()
-		 */
-		public Realm getRealm() {
-			return Realm.getDefault();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.databinding.observable.IObservable#isStale()
-		 */
-		public boolean isStale() {
-			// dummy
-			return false;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.databinding.observable.IObservable#removeChangeListener(org.eclipse.core.databinding.observable.IChangeListener)
-		 */
-		public void removeChangeListener(IChangeListener listener) {
-			// dummy
-
-		}
-
-		public void removeDisposeListener(IDisposeListener listener) {
-			// dummy
-			
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.eclipse.core.databinding.observable.IObservable#removeStaleListener(org.eclipse.core.databinding.observable.IStaleListener)
-		 */
-		public void removeStaleListener(IStaleListener listener) {
-			// dummy
-
-		}
-
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/UpdateStrategyTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/UpdateStrategyTest.java
deleted file mode 100644
index 351f668..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/UpdateStrategyTest.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Date;
-
-import org.eclipse.core.databinding.UpdateValueStrategy;
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.databinding.conversion.NumberToStringConverter;
-import org.eclipse.core.databinding.conversion.StringToNumberConverter;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.internal.databinding.conversion.DateToStringConverter;
-import org.eclipse.core.internal.databinding.conversion.IdentityConverter;
-import org.eclipse.core.internal.databinding.conversion.IntegerToStringConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToBigDecimalConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToBigIntegerConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToByteConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToDoubleConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToFloatConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToIntegerConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToLongConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToShortConverter;
-import org.eclipse.core.internal.databinding.conversion.StatusToStringConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToBooleanConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToBooleanPrimitiveConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToByteConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToCharacterConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToDateConverter;
-import org.eclipse.core.internal.databinding.conversion.StringToShortConverter;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 1.1
- */
-public class UpdateStrategyTest extends AbstractDefaultRealmTestCase {
-	public void testDefaultConverterForStringToInteger() throws Exception {
-		assertDefaultConverter(String.class, Integer.class, StringToNumberConverter.class);
-	}
-	
-	public void testDefaultConverterForStringToIntegerPrimitive() throws Exception {
-		assertDefaultConverter(String.class, Integer.TYPE, StringToNumberConverter.class);
-	}
-	
-	public void testDefaultConverterForStringToLong() throws Exception {
-		assertDefaultConverter(String.class, Long.class, StringToNumberConverter.class);
-	}
-
-	public void testDefaultConverterForStringToLongPrimitive() throws Exception {
-		assertDefaultConverter(String.class, Long.TYPE, StringToNumberConverter.class);
-	}
-
-	public void testDefaultConverterForStringToDouble() throws Exception {
-		assertDefaultConverter(String.class, Double.class, StringToNumberConverter.class);
-	}
-
-	public void testDefaultConverterForStringToDoublePrimitive() throws Exception {
-		assertDefaultConverter(String.class, Double.TYPE, StringToNumberConverter.class);
-	}
-
-	public void testDefaultConverterForStringToFloat() throws Exception {
-		assertDefaultConverter(String.class, Float.class, StringToNumberConverter.class);
-	}
-
-	public void testDefaultConverterForStringToFloatPrimitive() throws Exception {
-		assertDefaultConverter(String.class, Float.TYPE, StringToNumberConverter.class);
-	}
-
-	public void testDefaultConverterForStringToBigInteger() throws Exception {
-		assertDefaultConverter(String.class, BigInteger.class, StringToNumberConverter.class);
-	}
-	
-	public void testDefaultConverterForIntegerToString() throws Exception {
-		assertDefaultConverter(Integer.class, String.class, NumberToStringConverter.class);
-	}
-
-	public void testDefaultConverterForIntegerPrimitiveToString() throws Exception {
-		assertDefaultConverter(Integer.TYPE, String.class, NumberToStringConverter.class);
-	}
-
-	public void testDefaultConverterForLongToString() throws Exception {
-		assertDefaultConverter(Long.class, String.class, NumberToStringConverter.class);
-	}
-
-	public void testDefaultConverterForLongPrimitiveToString() throws Exception {
-		assertDefaultConverter(Long.TYPE, String.class, NumberToStringConverter.class);
-	}
-
-	public void testDefaultConverterForDoubleToString() throws Exception {
-		assertDefaultConverter(Double.class, String.class, NumberToStringConverter.class);
-	}
-	
-	public void testDefaultConverterForDoublePrimitiveToString() throws Exception {
-		assertDefaultConverter(Double.TYPE, String.class, NumberToStringConverter.class);
-	}
-	
-	public void testDefaultConverterForFloatToString() throws Exception {
-		assertDefaultConverter(Float.class, String.class, NumberToStringConverter.class);
-	}
-	
-	public void testDefaultConverterForFloatPrimitiveToString() throws Exception {
-		assertDefaultConverter(Float.TYPE, String.class, NumberToStringConverter.class);
-	}
-
-	public void testDefaultConverterForBigIntegerToString() throws Exception {
-		assertDefaultConverter(BigInteger.class, String.class, NumberToStringConverter.class);
-	}
-	
-	public void testDefaultConverterForDateToString() throws Exception {
-		assertDefaultConverter(Date.class, String.class, DateToStringConverter.class);
-	}
-	
-	public void testDefaultConverterForStringToBoolean() throws Exception {
-		assertDefaultConverter(String.class, Boolean.class, StringToBooleanConverter.class);
-	}
-	
-	public void testDefaultConverterForStringToBooleanPrimitive() throws Exception {
-		assertDefaultConverter(String.class, Boolean.TYPE, StringToBooleanPrimitiveConverter.class);
-	}
-	
-	public void testDefaultConverterForStringToByte() throws Exception {
-		assertDefaultConverter(String.class, Byte.class, StringToByteConverter.class);
-	}
-	
-	public void testDefaultConverterForStringToBytePrimitive() throws Exception {
-		assertDefaultConverter(String.class, Byte.TYPE, StringToByteConverter.class);
-	}
-	
-	public void testDefaultConverterForStringToCharacter() throws Exception {
-		assertDefaultConverter(String.class, Character.class, StringToCharacterConverter.class);
-	}
-	
-	public void testDefaultConverterForStringToDate() throws Exception {
-		assertDefaultConverter(String.class, Date.class, StringToDateConverter.class);
-	}
-	
-	public void testDefaultConverterForStringToShort() throws Exception {
-		assertDefaultConverter(String.class, Short.class, StringToShortConverter.class);
-	}
-	
-	public void testDefaultConverterForStringToShortPrimitive() throws Exception {
-		assertDefaultConverter(String.class, Short.TYPE, StringToShortConverter.class);
-	}
-	
-	public void testDefaultConverterForByteToString() throws Exception {
-		assertDefaultConverter(Byte.class, String.class, IntegerToStringConverter.class);
-	}
-	
-	public void testDefaultConverterForBytePrimitiveToString() throws Exception {
-		assertDefaultConverter(Byte.TYPE, String.class, IntegerToStringConverter.class);
-	}
-	
-	public void testDefaultConverterForShortToString() throws Exception {
-		assertDefaultConverter(Short.class, String.class, IntegerToStringConverter.class);
-	}
-	
-	public void testDefaultConverterForShortPrimitiveToString() throws Exception {
-		assertDefaultConverter(Short.TYPE, String.class, IntegerToStringConverter.class);
-	}
-	
-	public void testDefaultConverterForStatusToString() throws Exception {
-		assertDefaultConverter(IStatus.class, String.class, StatusToStringConverter.class);
-	}
-	
-
-	public void testDefaultConverterForNumberToByte() throws Exception {
-		assertFromNumberToNumberConverter(Byte.class, Byte.TYPE,
-				NumberToByteConverter.class);
-	}
-
-	public void testDefaultConverterForNumberToShort() throws Exception {
-		assertFromNumberToNumberConverter(Short.class, Short.TYPE,
-				NumberToShortConverter.class);
-	}
-
-	public void testDefaultConverterForNumberToShortPrimitive()
-			throws Exception {
-		assertFromNumberToNumberConverter(Short.TYPE, Short.class,
-				NumberToShortConverter.class);
-	}
-
-	public void testDefaultConverterForNumberToInteger() throws Exception {
-		assertFromNumberToNumberConverter(Integer.class, Integer.TYPE,
-				NumberToIntegerConverter.class);
-	}
-
-	public void testDefaultConverterForNumberToIntegerPrimitive()
-			throws Exception {
-		assertFromNumberToNumberConverter(Integer.TYPE, Integer.class,
-				NumberToIntegerConverter.class);
-	}
-
-	public void testDefaultConverterForNumberToLong() throws Exception {
-		assertFromNumberToNumberConverter(Long.class, Long.TYPE,
-				NumberToLongConverter.class);
-	}
-
-	public void testDefaultConverterForNumberToLongPrimitive() throws Exception {
-		assertFromNumberToNumberConverter(Long.TYPE, Long.class,
-				NumberToLongConverter.class);
-	}
-
-	public void testDefaultConverterForNumberToFloat() throws Exception {
-		assertFromNumberToNumberConverter(Float.class, Float.TYPE,
-				NumberToFloatConverter.class);
-	}
-
-	public void testDefaultConverterForNumberToFloatPrimitive()
-			throws Exception {
-		assertFromNumberToNumberConverter(Float.TYPE, Float.class,
-				NumberToFloatConverter.class);
-	}
-
-	public void testDefaultConverterForNumberToDouble() throws Exception {
-		assertFromNumberToNumberConverter(Double.class, Double.TYPE,
-				NumberToDoubleConverter.class);
-	}
-
-	public void testDefaultConverterForNumberToDoublePrimitive()
-			throws Exception {
-		assertFromNumberToNumberConverter(Double.TYPE, Double.class,
-				NumberToDoubleConverter.class);
-	}
-
-	public void testDefaultConverterForNumberToBigInteger() throws Exception {
-		assertFromNumberToNumberConverter(BigInteger.class, null,
-				NumberToBigIntegerConverter.class);
-	}
-
-	public void testDefaultConverterForNumberToBigDecimal() throws Exception {
-		assertFromNumberToNumberConverter(BigDecimal.class, null,
-				NumberToBigDecimalConverter.class);
-	}
-
-
-	private static Class[] primitiveNumberTypes = new Class[] { Byte.TYPE,
-			Short.TYPE, Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE };
-
-	private static Class[] boxedNumberTypes = new Class[] { Byte.class,
-			Short.class, Integer.class, Long.class, Float.class, Double.class,
-			BigInteger.class, BigDecimal.class };
-
-	private void assertFromNumberToNumberConverter(Class toType,
-			Class toCounterPrimitiveType, Class converterType) {
-
-		for (int i = 0; i < primitiveNumberTypes.length; i++) {
-			Class primitiveType = primitiveNumberTypes[i];
-
-			if (!primitiveType.equals(toType)
-					&& !primitiveType.equals(toCounterPrimitiveType)) {
-				assertDefaultConverter(primitiveType, toType, converterType);
-			} else if (!primitiveType.equals(toType)) {
-				assertDefaultConverter(primitiveType, toType,
-						IdentityConverter.class);
-			}
-		}
-
-		for (int i = 0; i < boxedNumberTypes.length; i++) {
-			Class boxedType = boxedNumberTypes[i];
-
-			if (!boxedType.equals(toType)
-					&& !boxedType.equals(toCounterPrimitiveType)) {
-				assertDefaultConverter(boxedType, toType, converterType);
-			} else if (!boxedType.equals(toType)) {
-				assertDefaultConverter(boxedType, toType,
-						IdentityConverter.class);
-			}
-		}
-	}
-	
-	private void assertDefaultConverter(Class fromType, Class toType, Class converterType) {
-		WritableValue source = WritableValue.withValueType(fromType);
-		WritableValue destination = WritableValue.withValueType(toType);
-		
-		UpdateStrategyStub strategy = new UpdateStrategyStub();
-		strategy.fillDefaults(source, destination);
-		
-		IConverter converter = strategy.converter;
-		assertNotNull("converter not null", converter);
-		assertEquals("fromType [" + fromType + "]" , fromType, converter.getFromType());
-		assertEquals("toType [" + toType + "]", toType, converter.getToType());
-		assertTrue("converter should be instanceof " + converterType
-				+ " but was instanceof " + converter.getClass(), converterType
-				.isInstance(converter));
-	}
-	
-	class UpdateStrategyStub extends UpdateValueStrategy {
-		IConverter converter;
-		
-		protected void fillDefaults(IObservableValue source,
-				IObservableValue destination) {
-			super.fillDefaults(source, destination);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.databinding.UpdateValueStrategy#setConverter(org.eclipse.core.databinding.conversion.IConverter)
-		 */
-		public UpdateValueStrategy setConverter(IConverter converter) {
-			this.converter = converter;
-			return super.setConverter(converter);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/UpdateValueStrategyTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/UpdateValueStrategyTest.java
deleted file mode 100644
index 881b562..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/UpdateValueStrategyTest.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Date;
-
-import org.eclipse.core.databinding.UpdateValueStrategy;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToByteValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToDoubleValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToFloatValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToIntegerValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToLongValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToShortValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToUnboundedNumberValidator;
-import org.eclipse.core.internal.databinding.validation.StringToByteValidator;
-import org.eclipse.core.internal.databinding.validation.StringToDateValidator;
-import org.eclipse.core.internal.databinding.validation.StringToDoubleValidator;
-import org.eclipse.core.internal.databinding.validation.StringToFloatValidator;
-import org.eclipse.core.internal.databinding.validation.StringToIntegerValidator;
-import org.eclipse.core.internal.databinding.validation.StringToLongValidator;
-import org.eclipse.core.internal.databinding.validation.StringToShortValidator;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 1.1
- */
-public class UpdateValueStrategyTest extends AbstractDefaultRealmTestCase {
-	public void testDefaultValidatorForStringToInteger() throws Exception {
-		assertDefaultValidator(String.class, Integer.class, StringToIntegerValidator.class);
-	}
-	
-	public void testDefaultValidatorForStringToIntegerPrimitive() throws Exception {
-		assertDefaultValidator(String.class, Integer.TYPE, StringToIntegerValidator.class);
-	}
-	
-	public void testDefaultValidatorForStringToLong() throws Exception {
-		assertDefaultValidator(String.class, Long.class, StringToLongValidator.class);		
-	}
-	
-	public void testDefaultValidatorForStringToLongPrimitive() throws Exception {
-		assertDefaultValidator(String.class, Long.TYPE, StringToLongValidator.class);		
-	}
-	
-	public void testDefaultValidatorForStringToFloat() throws Exception {
-		assertDefaultValidator(String.class, Float.class, StringToFloatValidator.class);				
-	}
-	
-	public void testDefaultValidatorForStringToFloatPrimitive() throws Exception {
-		assertDefaultValidator(String.class, Float.TYPE, StringToFloatValidator.class);						
-	}
-	
-	public void testDefaultValidatorForStringToDouble() throws Exception {
-		assertDefaultValidator(String.class, Double.class, StringToDoubleValidator.class);
-	}
-	
-	public void testDefaultValidatorForStringToDoublePrimitive() throws Exception {
-		assertDefaultValidator(String.class, Double.TYPE, StringToDoubleValidator.class);
-	}
-	
-	public void testDefaultValidatorForStringToByte() throws Exception {
-		assertDefaultValidator(String.class, Byte.class, StringToByteValidator.class);
-	}
-	
-	public void testDefaultValidatorForStringToBytePrimitive() throws Exception {
-		assertDefaultValidator(String.class, Byte.TYPE, StringToByteValidator.class);
-	}
-	
-	public void testDefaultValidatorForStringToShort() throws Exception {
-		assertDefaultValidator(String.class, Short.class, StringToShortValidator.class);
-	}
-
-	public void testDefaultValidatorForStringToShortPrimitive() throws Exception {
-		assertDefaultValidator(String.class, Short.TYPE, StringToShortValidator.class);
-	}
-
-	public void testDefaultValidatorForStringToDate() throws Exception {
-		assertDefaultValidator(String.class, Date.class, StringToDateValidator.class);
-	}
-	
-	public void testDefaultValidatorForNumberToByte() throws Exception {
-		assertDefaultValidator(Integer.class, Byte.class, NumberToByteValidator.class);
-	}
-	
-	public void testDefaultValidatorForNumberToShort() throws Exception {
-		assertDefaultValidator(Integer.class, Short.class, NumberToShortValidator.class);
-	}
-	
-	public void testDefaultValidatorForNumberToInteger() throws Exception {
-		assertDefaultValidator(Short.class, Integer.class, NumberToIntegerValidator.class);
-	}
-	
-	public void testDefaultValidatorForNumberToLong() throws Exception {
-		assertDefaultValidator(Short.class, Long.class, NumberToLongValidator.class);
-	}
-	
-	public void testDefaultValidatorForNumberToFloat() throws Exception {
-		assertDefaultValidator(Short.class, Float.class, NumberToFloatValidator.class);
-	}
-	
-	public void testDefaultValidatorForNumberToDouble() throws Exception {
-		assertDefaultValidator(Short.class, Double.class, NumberToDoubleValidator.class);
-	}
-	
-	public void testDefaultValidatorForNumberToBigInteger() throws Exception {
-		assertDefaultValidator(Short.class, BigInteger.class, NumberToUnboundedNumberValidator.class);
-	}
-	
-	public void testDefaultValidatorForNumberToBigDecimal() throws Exception {
-		assertDefaultValidator(Short.class, BigDecimal.class, NumberToUnboundedNumberValidator.class);		
-	}
-	
-	public void testCachesDefaultedValidators() throws Exception {
-		WritableValue source = WritableValue.withValueType(String.class);
-		WritableValue destination = WritableValue.withValueType(Integer.class);
-		
-		UpdateValueStrategyStub strategy = new UpdateValueStrategyStub();
-		strategy.fillDefaults(source, destination);
-		
-		IValidator validator = strategy.validator;
-		assertNotNull(validator);
-		
-		strategy = new UpdateValueStrategyStub();
-		strategy.fillDefaults(source, destination);
-		
-		assertSame(validator,strategy.validator);
-	}
-	
-	private void assertDefaultValidator(Class fromType, Class toType, Class validatorType) {
-		WritableValue source = WritableValue.withValueType(fromType);
-		WritableValue destination = WritableValue.withValueType(toType);
-		
-		UpdateValueStrategyStub strategy = new UpdateValueStrategyStub();
-		strategy.fillDefaults(source, destination);
-		
-		IValidator validator = strategy.validator;
-		assertNotNull("validator not null", validator);
-		assertTrue("converter instanceof " + validatorType, validatorType.isInstance(validator));
-	}
-	
-	class UpdateValueStrategyStub extends UpdateValueStrategy {
-		IValidator validator;
-		
-		protected void fillDefaults(IObservableValue source,
-				IObservableValue destination) {
-			super.fillDefaults(source, destination);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.databinding.UpdateValueStrategy#createValidator(java.lang.Object, java.lang.Object)
-		 */
-		protected IValidator createValidator(Object fromType, Object toType) {
-			validator = super.createValidator(fromType, toType);
-			return validator;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/ValueBindingTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/ValueBindingTest.java
deleted file mode 100755
index 12d32cd..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/ValueBindingTest.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Brad Reynolds - bug 116920
- *     Brad Reynolds - bug 164653, 159768
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding;
-
-import org.eclipse.core.databinding.Binding;
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.UpdateValueStrategy;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.ValueDiff;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.BindingStatus;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 1.1
- */
-public class ValueBindingTest extends AbstractDefaultRealmTestCase {
-	private WritableValue target;
-
-	private WritableValue model;
-
-	private DataBindingContext dbc;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		target = WritableValue.withValueType(String.class);
-		model = WritableValue.withValueType(String.class);
-		dbc = new DataBindingContext();
-	}
-
-	/**
-	 * Bug 152543.
-	 * 
-	 * @throws Exception
-	 */
-	public void testNoUpdateTargetFromModel() throws Exception {
-		try {
-			new DataBindingContext().bindValue(new ObservableValueStub(),
-					new ObservableValueStub(), new UpdateValueStrategy(
-							UpdateValueStrategy.POLICY_NEVER),
-					new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER));
-		} catch (Exception e) {
-			fail(e.getMessage());
-		}
-	}
-
-	public void testValuePropagation() throws Exception {
-		String initialValue = "value";
-		model.setValue(initialValue);
-
-		assertFalse(model.getValue().equals(target.getValue()));
-		dbc.bindValue(target, model, null, null);
-
-		assertEquals(target.getValue(), model.getValue());
-	}
-
-	public void testGetTarget() throws Exception {
-		Binding binding = dbc.bindValue(target, model, null, null);
-
-		assertEquals(target, binding.getTarget());
-	}
-
-	public void testGetModel() throws Exception {
-		Binding binding = dbc.bindValue(target, model, null, null);
-
-		assertEquals(model, binding.getModel());
-	}
-
-	public void testOKStatusInValidationUpdatesModel() throws Exception {
-		Binding binding = dbc.bindValue(target, model, null, null);
-
-		String value = "value";
-		assertFalse(value.equals(model.getValue()));
-		target.setValue(value);
-
-		assertEquals("value copied to model", value, model.getValue());
-		assertTrue(((IStatus) binding.getValidationStatus().getValue()).isOK());
-	}
-
-	public void testWarningStatusInValidationUpdatesModel() throws Exception {
-		Binding binding = dbc.bindValue(target, model,
-				new UpdateValueStrategy()
-						.setAfterGetValidator(warningValidator()), null);
-
-		String value = "value";
-		assertFalse(value.equals(model.getValue()));
-		target.setValue(value);
-
-		assertEquals("value copied to model", value, model.getValue());
-		assertEquals("warning status", IStatus.WARNING, ((IStatus) binding
-				.getValidationStatus().getValue()).getSeverity());
-	}
-
-	public void testInfoStatusInValidationUpdatesModel() throws Exception {
-		Binding binding = dbc
-				.bindValue(target, model, new UpdateValueStrategy()
-						.setAfterGetValidator(infoValidator()), null);
-
-		String value = "value";
-		assertFalse(value.equals(model.getValue()));
-		target.setValue(value);
-
-		assertEquals("value copied to model", value, model.getValue());
-		assertEquals("info status", IStatus.INFO, ((IStatus) binding
-				.getValidationStatus().getValue()).getSeverity());
-	}
-
-	public void testErrorStatusInValidationDoesNotUpdateModel()
-			throws Exception {
-		Binding binding = dbc.bindValue(target, model,
-				new UpdateValueStrategy()
-						.setAfterGetValidator(errorValidator()), null);
-
-		String value = "value";
-		assertFalse(value.equals(model.getValue()));
-		target.setValue(value);
-
-		assertFalse("value not copied to model", value.equals(model.getValue()));
-		assertEquals("error status", IStatus.ERROR, ((IStatus) binding
-				.getValidationStatus().getValue()).getSeverity());
-	}
-
-	public void testCancelStatusInValidationDoesNotUpdateModel()
-			throws Exception {
-		Binding binding = dbc.bindValue(target, model,
-				new UpdateValueStrategy()
-						.setAfterGetValidator(cancelValidator()), null);
-
-		String value = "value";
-		assertFalse(value.equals(model.getValue()));
-		target.setValue(value);
-
-		assertFalse("value not copied to model", value.equals(model.getValue()));
-		assertEquals("cancel status", IStatus.CANCEL, ((IStatus) binding
-				.getValidationStatus().getValue()).getSeverity());
-	}
-
-	public void testStatusesFromEveryPhaseAreReturned() throws Exception {
-		UpdateValueStrategy strategy = new UpdateValueStrategy() {
-			protected IStatus doSet(IObservableValue observableValue,
-					Object value) {
-				super.doSet(observableValue, value);
-				return ValidationStatus.info("");
-			}
-		};
-
-		strategy.setAfterGetValidator(warningValidator());
-		strategy.setAfterConvertValidator(infoValidator());
-		strategy.setBeforeSetValidator(warningValidator());
-
-		Binding binding = dbc.bindValue(target, model, strategy, null);
-		String value = "value";
-		assertFalse(value.equals(model.getValue()));
-
-		target.setValue(value);
-		assertEquals(value, model.getValue());
-		IStatus status = (IStatus) binding.getValidationStatus().getValue();
-		assertTrue(status.isMultiStatus());
-		assertEquals("max status", IStatus.WARNING, status.getSeverity());
-
-		MultiStatus multiStatus = (MultiStatus) status;
-		assertEquals(4, multiStatus.getChildren().length);
-		IStatus[] children = multiStatus.getChildren();
-
-		assertEquals("after get severity", IStatus.WARNING, children[0]
-				.getSeverity());
-		assertEquals("after convert severity", IStatus.INFO, children[1]
-				.getSeverity());
-		assertEquals("before set severity", IStatus.WARNING, children[2]
-				.getSeverity());
-		assertEquals("doSet severity", IStatus.INFO, children[3].getSeverity());
-	}
-
-	public void testStatusIsInstanceOfBindingStatus() throws Exception {
-		Binding binding = dbc.bindValue(target, model, null, null);
-		assertTrue(binding.getValidationStatus().getValue() instanceof BindingStatus);
-	}
-	
-	public void testDiffsAreCheckedForEqualityBeforeUpdate() throws Exception {
-		class WritableValueStub extends WritableValue {
-			public WritableValueStub() {
-				super("", String.class);
-			}
-			
-			protected void fireValueChange(ValueDiff diff) {
-				super.fireValueChange(diff);
-			}
-		}
-		
-		WritableValueStub target = new WritableValueStub();
-		WritableValue model = WritableValue.withValueType(String.class);
-		
-		class Strategy extends UpdateValueStrategy {
-			int afterGetCount;
-			public IStatus validateAfterGet(Object value) {
-				afterGetCount++;
-				return super.validateAfterGet(value);
-			}
-		}
-		
-		Strategy strategy = new Strategy();
-		dbc.bindValue(target, model, strategy, null);
-		int count = strategy.afterGetCount;
-		
-		target.fireValueChange(Diffs.createValueDiff("", ""));
-		assertEquals("update does not occur", count, strategy.afterGetCount);
-	}
-	
-	private IValidator warningValidator() {
-		return new IValidator() {
-			public IStatus validate(Object value) {
-				return ValidationStatus.warning("");
-			}
-		};
-	}
-
-	private IValidator infoValidator() {
-		return new IValidator() {
-			public IStatus validate(Object value) {
-				return ValidationStatus.info("");
-			}
-		};
-	}
-
-	private IValidator errorValidator() {
-		return new IValidator() {
-			public IStatus validate(Object value) {
-				return ValidationStatus.error("");
-			}
-		};
-	}
-
-	private IValidator cancelValidator() {
-		return new IValidator() {
-			public IStatus validate(Object value) {
-				return ValidationStatus.cancel("");
-			}
-		};
-	}
-
-	private static class ObservableValueStub extends AbstractObservableValue {
-		protected Object doGetValue() {
-			// do nothing
-			return null;
-		}
-
-		public Object getValueType() {
-			// do nothing
-			return null;
-		}
-
-		protected void doSetValue(Object value) {
-
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/beans/BeansObservablesTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/beans/BeansObservablesTest.java
deleted file mode 100644
index 5a360ec..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/beans/BeansObservablesTest.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164268, 171616
- *     Mike Evans - bug 217558
- *     Matthew Hall - bugs 221351, 246625
- *******************************************************************************/
-
-package org.eclipse.core.tests.databinding.beans;
-
-import java.util.Arrays;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.beans.IBeanObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.internal.databinding.beans.BeanObservableListDecorator;
-import org.eclipse.core.internal.databinding.beans.BeanObservableSetDecorator;
-import org.eclipse.core.internal.databinding.beans.BeanObservableValueDecorator;
-import org.eclipse.core.tests.internal.databinding.beans.Bean;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.2
- */
-public class BeansObservablesTest extends AbstractDefaultRealmTestCase {
-	Bean[] elements = null;
-	Bean model = null;
-	Class elementType = null;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		elements = new Bean[] { new Bean("1"), new Bean("2"), new Bean("3") };
-		model = new Bean(elements);
-		model.setList(Arrays.asList(elements));
-		elementType = Bean.class;
-	}
-
-	public void testObserveListArrayInferredElementType() throws Exception {
-		IObservableList list = BeansObservables.observeList(Realm.getDefault(),
-				model, "list", null);
-		assertEquals("element type", Object.class, list.getElementType());
-	}
-
-	public void testObserveListNonInferredElementType() throws Exception {
-		elementType = Object.class;
-		IObservableList list = BeansObservables.observeList(Realm.getDefault(),
-				model, "list", null);
-		assertEquals("element type", elementType, list.getElementType());
-	}
-
-	public void testListFactory() throws Exception {
-		IObservableFactory factory = BeansObservables.listFactory(Realm
-				.getDefault(), "list", elementType);
-		IObservableList list = (IObservableList) factory
-				.createObservable(model);
-
-		assertTrue("elements of the list", Arrays.equals(elements, list
-				.toArray(new Bean[list.size()])));
-		assertEquals("element type", elementType, list.getElementType());
-	}
-
-	public void testObserveDetailListElementType() throws Exception {
-		WritableValue parent = WritableValue.withValueType(Bean.class);
-		parent.setValue(model);
-		IObservableList list = BeansObservables.observeDetailList(Realm
-				.getDefault(), parent, "list", elementType);
-
-		assertEquals("element type", elementType, list.getElementType());
-		assertTrue("elements of list", Arrays.equals(elements, list
-				.toArray(new Bean[list.size()])));
-	}
-
-	public void testObserveDetailValueIBeanObservable() throws Exception {
-		WritableValue parent = WritableValue.withValueType(Bean.class);
-		Bean bean = new Bean();
-		parent.setValue(bean);
-
-		IObservableValue detailValue = BeansObservables.observeDetailValue(
-				Realm.getDefault(), parent, "value", String.class);
-		assertTrue(detailValue instanceof IBeanObservable);
-
-		BeanObservableValueDecorator beanObservable = (BeanObservableValueDecorator) detailValue;
-		assertEquals("property descriptor", Bean.class.getMethod("getValue",
-				null), beanObservable.getPropertyDescriptor().getReadMethod());
-		assertEquals("observed", bean, beanObservable.getObserved());
-		assertTrue("delegate", beanObservable.getDecorated().getClass()
-				.getName().endsWith("DetailObservableValue"));
-	}
-
-	public void testObserveDetailValueNullOuterElementType() throws Exception {
-		WritableValue parent = new WritableValue(new Bean(), null);
-
-		IObservableValue detailValue = BeansObservables.observeDetailValue(
-				Realm.getDefault(), parent, "value", String.class);
-		
-		assertNull("property descriptor", ((IBeanObservable) detailValue)
-				.getPropertyDescriptor());
-	}
-
-	public void testObservableDetailListIBeanObservable() throws Exception {
-		WritableValue parent = WritableValue.withValueType(Bean.class);
-		Bean bean = new Bean();
-		parent.setValue(bean);
-
-		IObservableList detailList = BeansObservables.observeDetailList(Realm
-				.getDefault(), parent, "list", Bean.class);
-		assertTrue("detail is not an IBeanObservable",
-				detailList instanceof IBeanObservable);
-
-		BeanObservableListDecorator beanObservable = (BeanObservableListDecorator) detailList;
-		assertEquals("property descriptor", Bean.class.getMethod("getList",
-				null), beanObservable.getPropertyDescriptor().getReadMethod());
-		assertEquals("observed", bean, beanObservable
-				.getObserved());
-
-		// DetailObservableList is package level we can do a straight instanceof
-		// check
-		assertTrue("delegate is the observed", beanObservable.getDecorated()
-				.equals(detailList));
-	}
-
-	public void testObservableDetailListNullOuterElementType() throws Exception {
-		WritableValue parent = new WritableValue(new Bean(), null);
-
-		IObservableList detailList = BeansObservables.observeDetailList(Realm
-				.getDefault(), parent, "list", Bean.class);
-
-		assertNull("property descriptor", ((IBeanObservable) detailList)
-				.getPropertyDescriptor());
-	}
-
-	public void testObservableDetailSetIBeanObservable() throws Exception {
-		WritableValue parent = WritableValue.withValueType(Bean.class);
-		Bean bean = new Bean();
-		parent.setValue(bean);
-
-		IObservableSet detailSet = BeansObservables.observeDetailSet(Realm
-				.getDefault(), parent, "set", Bean.class);
-		assertTrue("detail is not an IBeanObservable",
-				detailSet instanceof IBeanObservable);
-
-		BeanObservableSetDecorator beanObservable = (BeanObservableSetDecorator) detailSet;
-		assertEquals("property descriptor", Bean.class
-				.getMethod("getSet", null), beanObservable
-				.getPropertyDescriptor().getReadMethod());
-		assertEquals("observed", bean, beanObservable
-				.getObserved());
-
-		// DetailObservableSet is package level we can't do a straight
-		// instanceof check
-		assertTrue("delegate is the observed", beanObservable.getDecorated()
-				.equals(detailSet));
-	}
-
-	public void testObservableDetailSetNullOuterElementType() throws Exception {
-		WritableValue parent = new WritableValue(new Bean(), null);
-
-		IObservableSet detailSet = BeansObservables.observeDetailSet(Realm
-				.getDefault(), parent, "set", Bean.class);
-
-		assertNull("property descriptor", ((IBeanObservable) detailSet)
-				.getPropertyDescriptor());
-	}
-
-	public void testObserveSetElementType() throws Exception {
-		Bean bean = new Bean();
-		IObservableSet observableSet = BeansObservables.observeSet(Realm
-				.getDefault(), bean, "set", Bean.class);
-		assertEquals(Bean.class, observableSet.getElementType());
-	}
-
-	public void testObserveSetNonInferredElementType() throws Exception {
-		Bean bean = new Bean();
-		IObservableSet observableSet = BeansObservables.observeSet(Realm
-				.getDefault(), bean, "set");
-		assertEquals(Object.class, observableSet.getElementType());
-	}
-	/**
-	 * Test for fix for Bug 217558 [DataBinding] Databinding - BeansObservables.observeList() 
-	 * - error when external code modifies observed list.
-	 */
-	public void testHandleExternalChangeToProperty() {
-		Bean targetBean = new Bean();
-		IObservableList modelObservable = BeansObservables.observeList(Realm.getDefault(),
-				model, "array", elementType );
-		IObservableList targetObservable = BeansObservables.observeList(Realm.getDefault(),
-				targetBean, "array", elementType );
-		
-		DataBindingContext context = new DataBindingContext( Realm.getDefault() );
-		try {
-			// bind two beans and check the binding works
-			context.bindList(
-					targetObservable, 
-					modelObservable, 
-					null, 
-					null );
-			assertTrue( Arrays.equals( elements, targetBean.getArray() ) );
-			
-			// set source direct - target databinding still works...
-			Bean[] newElements = new Bean[] { new Bean("4"), new Bean("5"), new Bean("6") };
-			model.setArray( newElements );
-			assertTrue( Arrays.equals( newElements, targetBean.getArray() ) );
-			
-			// ... but setting the model's list breaks databinding the other way...
-			
-			// ... so setting target direct breaks databinding without fix and 
-			// the assert would fail
-			newElements = new Bean[] { new Bean("7"), new Bean("8"), new Bean("9") };
-			targetBean.setArray( newElements );
-			assertTrue( Arrays.equals( newElements, model.getArray() ) );
-		}
-		finally {
-			// context only needed for this test so not put in setUp / tearDown
-			context.dispose();
-		}
-		
-	}
-	
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/beans/PojoObservablesTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/beans/PojoObservablesTest.java
deleted file mode 100644
index 720837c..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/beans/PojoObservablesTest.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.tests.databinding.beans;
-
-import org.eclipse.core.databinding.beans.PojoObservables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableList;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableMap;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableSet;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableValue;
-import org.eclipse.core.tests.internal.databinding.beans.Bean;
-import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.2
- */
-public class PojoObservablesTest extends AbstractDefaultRealmTestCase {
-	private Bean pojo;
-	private String propertyName;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		pojo = new Bean();
-		propertyName = "value";
-	}
-
-	public void testObserveValue_ReturnsJavaBeanObservableValue()
-			throws Exception {
-		IObservableValue value = PojoObservables.observeValue(pojo, propertyName);
-
-		assertNotNull(value);
-		assertTrue(value instanceof JavaBeanObservableValue);
-	}
-
-	public void testObserveValue_DoesNotAttachListeners() throws Exception {
-		IObservableValue value = PojoObservables.observeValue(pojo, propertyName);
-
-		ChangeEventTracker.observe(value);
-		assertFalse(pojo.hasListeners(propertyName));
-	}
-
-	public void testObservableValueWithRealm_ReturnsJavaBeanObservable()
-			throws Exception {
-		CurrentRealm realm = new CurrentRealm(true);
-		IObservableValue value = PojoObservables.observeValue(realm, pojo,
-				propertyName);
-
-		assertNotNull(value);
-		assertTrue(value instanceof JavaBeanObservableValue);
-	}
-
-	public void testObservableMap_ReturnsJavaBeanObservableMap()
-			throws Exception {
-		IObservableSet set = new WritableSet();
-		set.add(new Bean());
-
-		IObservableMap map = PojoObservables.observeMap(set, Bean.class,
-				propertyName);
-		assertNotNull(map);
-		assertTrue(map instanceof JavaBeanObservableMap);
-	}
-	
-	public void testObservableMap_DoesNotAttachListeners() throws Exception {
-		IObservableSet set = new WritableSet();
-		set.add(pojo);
-		
-		IObservableMap map = PojoObservables.observeMap(set, Bean.class, propertyName);
-		assertFalse(pojo.hasListeners(propertyName));
-		ChangeEventTracker.observe(map);
-		assertFalse(pojo.hasListeners(propertyName));
-	}
-	
-	public void testObserveMaps_ReturnsMaps() throws Exception {
-		IObservableSet set = new WritableSet();
-		set.add(pojo);
-		
-		IObservableMap[] maps = PojoObservables.observeMaps(set, Bean.class, new String[] {"value", "class"});
-		assertEquals(2, maps.length);
-	}
-	
-	public void testObserveListWithElementType_ReturnsJavaBeanObservableList() throws Exception {
-		IObservableList list = PojoObservables.observeList(Realm.getDefault(), pojo, "list", String.class);
-		assertTrue(list instanceof JavaBeanObservableList);
-	}
-	
-	public void testObserveListWithElementType_DoesNotAttachListeners() throws Exception {
-		IObservableList observable = PojoObservables.observeList(Realm.getDefault(), pojo, "list", String.class);
-		assertFalse(pojo.hasListeners("list"));
-		ChangeEventTracker.observe(observable);
-		assertFalse(pojo.hasListeners("list"));
-	}
-	
-	public void testObserveList_ReturnsJavaBeanObservableList() throws Exception {
-		IObservableList observable = PojoObservables.observeList(Realm.getDefault(), pojo, "list");
-		assertTrue(observable instanceof JavaBeanObservableList);
-	}
-	
-	public void testObserveList_DoesNotAttachListeners() throws Exception {
-		IObservableList observable = PojoObservables.observeList(Realm.getDefault(), pojo, "list");
-		assertFalse(pojo.hasListeners("list"));
-		ChangeEventTracker.observe(observable);
-		assertFalse(pojo.hasListeners("list"));
-	}
-	
-	public void testObserveSetWithElementType_ReturnsJavaBeanObservableList() throws Exception {
-		IObservableSet list = PojoObservables.observeSet(Realm.getDefault(), pojo, "set", String.class);
-		assertTrue(list instanceof JavaBeanObservableSet);
-	}
-	
-	public void testObserveSetWithElementType_DoesNotAttachListeners() throws Exception {
-		IObservableSet observable = PojoObservables.observeSet(Realm.getDefault(), pojo, "set", String.class);
-		assertFalse(pojo.hasListeners("set"));
-		ChangeEventTracker.observe(observable);
-		assertFalse(pojo.hasListeners("set"));
-	}
-	
-	public void testObserveSet_ReturnsJavaBeanObservableList() throws Exception {
-		IObservableSet list = PojoObservables.observeSet(Realm.getDefault(), pojo, "set");
-		assertTrue(list instanceof JavaBeanObservableSet);
-	}
-	
-	public void testObserveSet_DoesNotAttachListeners() throws Exception {
-		IObservableSet observable = PojoObservables.observeSet(Realm.getDefault(), pojo, "set");
-		assertFalse(pojo.hasListeners("set"));
-		ChangeEventTracker.observe(observable);
-		assertFalse(pojo.hasListeners("set"));
-	}
-	
-	public void testValueFactory_DoesNotAttachListeners() throws Exception {
-		IObservableFactory factory = PojoObservables.valueFactory(Realm.getDefault(), "value");
-		IObservableValue observable = (IObservableValue) factory.createObservable(pojo);
-		
-		assertFalse(pojo.hasListeners("value"));
-		ChangeEventTracker.observe(observable);
-		assertFalse(pojo.hasListeners("value"));
-	}
-	
-	public void testListFactory_DoesNotAttachListeners() throws Exception {
-		IObservableFactory factory = PojoObservables.listFactory(Realm.getDefault(), "list", String.class);
-		IObservableList observable = (IObservableList) factory.createObservable(pojo);
-		
-		assertFalse(pojo.hasListeners("value"));
-		ChangeEventTracker.observe(observable);
-		assertFalse(pojo.hasListeners("value"));
-	}
-	
-	public void testSetFactory_DoesNotAttachListeners() throws Exception {
-		IObservableFactory factory = PojoObservables.setFactory(Realm.getDefault(), propertyName);
-		IObservableSet observable = (IObservableSet) factory.createObservable(pojo);
-		
-		assertFalse(pojo.hasListeners("set"));
-		ChangeEventTracker.observe(observable);
-		assertFalse(pojo.hasListeners("set"));
-	}
-	
-	public void testSetFactoryWithElementType_DoesNotAttachListeners() throws Exception {
-		IObservableFactory factory = PojoObservables.setFactory(Realm.getDefault(), propertyName, String.class);
-		IObservableSet observable = (IObservableSet) factory.createObservable(pojo);
-		
-		assertFalse(pojo.hasListeners("set"));
-		ChangeEventTracker.observe(observable);
-		assertFalse(pojo.hasListeners("set"));
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/conversion/NumberToStringConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/conversion/NumberToStringConverterTest.java
deleted file mode 100644
index df7c816..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/conversion/NumberToStringConverterTest.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matt Carter - Bug 180392     
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.conversion;
-
-import java.lang.reflect.Constructor;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.conversion.NumberToStringConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToStringConverterTest extends TestCase {
-	private NumberFormat numberFormat;
-	private NumberFormat integerFormat;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		numberFormat = NumberFormat.getNumberInstance();
-		integerFormat = NumberFormat.getIntegerInstance();
-	}
-
-	public void testFromTypes() throws Exception {
-		assertEquals("Integer.class", Integer.class, NumberToStringConverter
-				.fromInteger(false).getFromType());
-		assertEquals("Integer.TYPE", Integer.TYPE, NumberToStringConverter
-				.fromInteger(true).getFromType());
-		assertEquals("Double.class", Double.class, NumberToStringConverter
-				.fromDouble(false).getFromType());
-		assertEquals("Double.TYPE", Double.TYPE, NumberToStringConverter
-				.fromDouble(true).getFromType());
-		assertEquals("Long.class", Long.class, NumberToStringConverter
-				.fromLong(false).getFromType());
-		assertEquals("Long.TYPE", Long.TYPE, NumberToStringConverter.fromLong(
-				true).getFromType());
-		assertEquals("Float.class", Float.class, NumberToStringConverter
-				.fromFloat(false).getFromType());
-		assertEquals("Float.TYPE", Float.TYPE, NumberToStringConverter
-				.fromFloat(true).getFromType());
-		assertEquals("BigInteger.class", BigInteger.class,
-				NumberToStringConverter.fromBigInteger().getFromType());
-		assertEquals("BigDecimal.class", BigDecimal.class,
-				NumberToStringConverter.fromBigDecimal().getFromType());
-		assertEquals("Short.class", Short.class,
-				NumberToStringConverter.fromShort(false).getFromType());
-		assertEquals("Byte.class", Byte.class,
-				NumberToStringConverter.fromByte(false).getFromType());
-	}
-
-	public void testToTypeIsStringClass() throws Exception {
-		assertEquals(String.class, NumberToStringConverter.fromInteger(false)
-				.getToType());
-	}
-
-	public void testConvertIntegerToString() throws Exception {
-		Integer input = new Integer(1000);
-		String expected = integerFormat.format(input.longValue());
-
-		NumberToStringConverter converter = NumberToStringConverter
-				.fromInteger(false);
-		String result = (String) converter.convert(input);
-		assertEquals(expected, result);
-	}
-
-	public void testConvertDoubleToString() throws Exception {
-		Double input = new Double(1000.1d);
-		String expected = numberFormat.format(input.doubleValue());
-
-		NumberToStringConverter converter = NumberToStringConverter
-				.fromDouble(false);
-		String result = (String) converter.convert(input);
-		assertEquals(expected, result);
-	}
-
-	public void testConvertFloatToString() throws Exception {
-		Float input = new Float(1000.1f);
-		String expected = numberFormat.format(input.floatValue());
-
-		NumberToStringConverter converter = NumberToStringConverter
-				.fromFloat(false);
-		String result = (String) converter.convert(input);
-		assertEquals(expected, result);
-	}
-
-	public void testConvertLongToString() throws Exception {
-		Long input = new Long(1000l);
-		String expected = integerFormat.format(input.longValue());
-
-		NumberToStringConverter converter = NumberToStringConverter
-				.fromLong(false);
-		String result = (String) converter.convert(input);
-		assertEquals(expected, result);
-	}
-	
-	public void testConvertBigIntegerToString() throws Exception {
-		BigInteger input = BigInteger.valueOf(1000);
-		String expected = integerFormat.format(input);
-		
-		NumberToStringConverter converter = NumberToStringConverter.fromBigInteger();
-		String result = (String) converter.convert(input);
-		assertEquals(expected, result);
-	}
-
-	Class icuBigDecimal = null;
-	Constructor icuBigDecimalCtr = null;
-	{
-		try {
-			icuBigDecimal = Class.forName("com.ibm.icu.math.BigDecimal");
-			icuBigDecimalCtr = icuBigDecimal.getConstructor(new Class[] {BigInteger.class, int.class});
-		}
-		catch(ClassNotFoundException e) {}
-		catch(NoSuchMethodException e) {}
-	}
-	/**
-	 * Takes a java.math.BigDecimal and returns an ICU formatted string for it,
-	 * when ICU is available, otherwise platform default. Note that
-	 * Java < 1.5 did not format BigDecimals properly, truncating them via doubleValue(),
-	 * so this method will return bad results, Data Binding will not, so
-	 * the test will FAIL on Java < 1.5 under these conditions. 
-	 * @param bd
-	 * @return
-	 * @throws ClassNotFoundException
-	 * @throws NoSuchMethodException
-	 */
-	private String formatBigDecimal(BigDecimal javabd) throws Exception {
-		if(icuBigDecimal != null && icuBigDecimalCtr != null) {
-			// ICU Big Decimal constructor available
-			Number icubd = (Number) icuBigDecimalCtr.newInstance(
-					new Object[] { javabd.unscaledValue(), new Integer(javabd.scale()) });
-			return numberFormat.format(icubd);
-		}
-		throw new IllegalArgumentException("ICU not present. Cannot reliably format large BigDecimal values; needed for testing. Java platforms prior to 1.5 fail to format/parse these decimals correctly.");
-	}	
-	public void testConvertBigDecimalToString() throws Exception {
-		NumberToStringConverter converter = NumberToStringConverter.fromBigDecimal();
-		// Test 1: Decimal
-		BigDecimal input = new BigDecimal("100.23");
-		String expected = formatBigDecimal(input);
-		String result = (String) converter.convert(input);
-		assertEquals("Non-integer BigDecimal", expected, result);
-		
-		// Test 2: Long
-		input = new BigDecimal(Integer.MAX_VALUE + 100L);
-		expected = formatBigDecimal(input);
-		result = (String) converter.convert(input);
-		assertEquals("Integral BigDecimal in long range", expected, result);
-		
-		// Test 3: BigInteger range
-		input = new BigDecimal(BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.valueOf(100L)));
-		expected = formatBigDecimal(input);
-		result = (String) converter.convert(input);
-		assertEquals("Integral BigDecimal in BigInteger range", expected, result);
-
-		// Test 4: Very high precision Decimal
-		input = new BigDecimal("100404101.233456783456788934567893456789231982001345678234567890");
-		expected = formatBigDecimal(input);
-		result = (String) converter.convert(input);
-		assertEquals("High-precision BigDecimal", expected, result);
-		
-	}
-
-	public void testNullSourceConvertsToEmptyString() throws Exception {
-		NumberToStringConverter converter = NumberToStringConverter
-				.fromInteger(false);
-		assertEquals("", converter.convert(null));
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/conversion/StringToNumberConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/conversion/StringToNumberConverterTest.java
deleted file mode 100644
index 5915bda..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/conversion/StringToNumberConverterTest.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matt Carter - Bug 180392     
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.conversion;
-
-import java.lang.reflect.Constructor;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.conversion.StringToNumberConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class StringToNumberConverterTest extends TestCase {
-	private NumberFormat numberFormat;
-	private NumberFormat numberIntegerFormat;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		numberFormat = NumberFormat.getNumberInstance();
-		numberFormat.setMaximumFractionDigits(305); // Used for BigDecimal test
-		numberFormat.setGroupingUsed(false); // Not really needed
-		numberIntegerFormat = NumberFormat.getIntegerInstance();
-	}
-
-	public void testToTypes() throws Exception {
-		assertEquals("Integer.class", Integer.class, StringToNumberConverter.toInteger(false).getToType());
-		assertEquals("Integer.TYPE", Integer.TYPE, StringToNumberConverter.toInteger(true).getToType());
-		assertEquals("Double.class", Double.class, StringToNumberConverter.toDouble(false).getToType());
-		assertEquals("Double.TYPE", Double.TYPE, StringToNumberConverter.toDouble(true).getToType());
-		assertEquals("Long.class", Long.class, StringToNumberConverter.toLong(false).getToType());
-		assertEquals("Long.TYPE", Long.TYPE, StringToNumberConverter.toLong(true).getToType());
-		assertEquals("Float.class", Float.class, StringToNumberConverter.toFloat(false).getToType());
-		assertEquals("Float.TYPE", Float.TYPE, StringToNumberConverter.toFloat(true).getToType());
-		assertEquals("BigInteger.TYPE", BigInteger.class, StringToNumberConverter.toBigInteger().getToType());
-		assertEquals("BigDecimal.TYPE", BigDecimal.class, StringToNumberConverter.toBigDecimal().getToType());
-		assertEquals("Short.class", Short.class, StringToNumberConverter.toShort(false).getToType());
-		assertEquals("Short.TYPE", Short.TYPE, StringToNumberConverter.toShort(true).getToType());
-		assertEquals("Byte.class", Byte.class, StringToNumberConverter.toByte(false).getToType());
-		assertEquals("Byte.TYPE", Byte.TYPE, StringToNumberConverter.toByte(true).getToType());
-	}
-	
-	public void testFromTypeIsString() throws Exception {
-		assertEquals(String.class, StringToNumberConverter.toInteger(false)
-				.getFromType());
-	}
-	
-	public void testConvertsToBigInteger() throws Exception {
-		BigInteger input = BigInteger.valueOf(1000);
-		
-		StringToNumberConverter converter = StringToNumberConverter.toBigInteger();
-		BigInteger result = (BigInteger) converter.convert(numberFormat.format(input));
-		
-		assertEquals(input, result);
-	}
-	
-	Class icuBigDecimal = null;
-	Constructor icuBigDecimalCtr = null;
-	{
-		try {
-			icuBigDecimal = Class.forName("com.ibm.icu.math.BigDecimal");
-			icuBigDecimalCtr = icuBigDecimal.getConstructor(new Class[] {BigInteger.class, int.class});
-		}
-		catch(ClassNotFoundException e) {}
-		catch(NoSuchMethodException e) {}
-	}
-	/**
-	 * Takes a java.math.BigDecimal and returns an ICU formatted string for it.
-	 * These tests depend on ICU to reliably format test strings for comparison. 
-	 * Java < 1.5 DecimalFormat did not format/parse BigDecimals properly, 
-	 * converting them via doubleValue(), so we have a dependency for this unit test on ICU4J.
-	 * See Bug #180392 for more info.  
-	 * @param bd
-	 * @return
-	 * @throws ClassNotFoundException
-	 * @throws NoSuchMethodException
-	 */
-	private String formatBigDecimal(BigDecimal javabd) throws Exception {
-		if(icuBigDecimal != null && icuBigDecimalCtr != null) {
-			// ICU Big Decimal constructor available
-			Number icubd = (Number) icuBigDecimalCtr.newInstance(
-					new Object[] { javabd.unscaledValue(), new Integer(javabd.scale()) });
-			return numberFormat.format(icubd);
-		}
-		throw new IllegalArgumentException("ICU not present. Cannot reliably format large BigDecimal values; needed for testing. Java platforms prior to 1.5 fail to format/parse these decimals correctly.");
-	}
-	
-	public void testConvertsToBigDecimal() throws Exception {
-		StringToNumberConverter converter = StringToNumberConverter.toBigDecimal();
-		// Test 1: Decimal
-		BigDecimal input = new BigDecimal("100.23");
-		BigDecimal result = (BigDecimal) converter.convert(formatBigDecimal(input));
-		assertEquals("Non-integer BigDecimal", input, result);
-
-		// Test 2: Long
-		input = new BigDecimal((long) (Integer.MAX_VALUE + 100));
-		result = (BigDecimal) converter.convert(formatBigDecimal(input));
-		assertEquals("Integral BigDecimal in long range", input, result);
-
-		// Test 3: BigInteger range
-		input = new BigDecimal("92233720368547990480");
-		result = (BigDecimal) converter.convert(formatBigDecimal(input));
-		assertEquals("Integral BigDecimal in long range", input, result);
-		
-		// Test 4: Very high precision Decimal. 
-		input = new BigDecimal("100404101.23345678345678893456789345678923198200134567823456789");
-		result = (BigDecimal) converter.convert(formatBigDecimal(input));
-		assertEquals("Non-integer BigDecimal", input, result);
-	}
-	
-	public void testConvertsToInteger() throws Exception {
-		Integer input = new Integer(1000);
-
-		StringToNumberConverter converter = StringToNumberConverter.toInteger(false);
-		Integer result = (Integer) converter.convert(numberIntegerFormat.format(input
-				.longValue()));
-		assertEquals(input, result);
-	}
-
-	public void testConvertsToDouble() throws Exception {
-		Double input = new Double(1000);
-
-		StringToNumberConverter converter = StringToNumberConverter.toDouble(false);
-		Double result = (Double) converter.convert(numberFormat.format(input
-				.doubleValue()));
-
-		assertEquals(input, result);
-	}
-
-	public void testConvertsToLong() throws Exception {
-		Long input = new Long(1000);
-
-		StringToNumberConverter converter = StringToNumberConverter.toLong(false);
-		Long result = (Long) converter.convert(numberIntegerFormat.format(input
-				.longValue()));
-
-		assertEquals(input, result);
-	}
-
-	public void testConvertsToFloat() throws Exception {
-		Float input = new Float(1000);
-
-		StringToNumberConverter converter = StringToNumberConverter.toFloat(false);
-		Float result = (Float) converter.convert(numberFormat.format(input
-				.floatValue()));
-
-		assertEquals(input, result);
-	}
-
-	public void testConvertedToIntegerPrimitive() throws Exception {
-		Integer input = new Integer(1000);
-
-		StringToNumberConverter converter = StringToNumberConverter.toInteger(true);
-		Integer result = (Integer) converter.convert(numberIntegerFormat.format(input
-				.longValue()));
-		assertEquals(input, result);
-	}
-
-	public void testConvertsToDoublePrimitive() throws Exception {
-		Double input = new Double(1000);
-
-		StringToNumberConverter converter = StringToNumberConverter.toDouble(true);
-		Double result = (Double) converter.convert(numberFormat.format(input
-				.doubleValue()));
-
-		assertEquals(input, result);
-	}
-
-	public void testConvertsToLongPrimitive() throws Exception {
-		Long input = new Long(1000);
-
-		StringToNumberConverter converter = StringToNumberConverter.toLong(true);
-		Long result = (Long) converter.convert(numberIntegerFormat.format(input
-				.longValue()));
-
-		assertEquals(input, result);
-	}
-
-	public void testConvertsToFloatPrimitive() throws Exception {
-		Float input = new Float(1000);
-
-		StringToNumberConverter converter = StringToNumberConverter.toFloat(true);
-		Float result = (Float) converter.convert(numberFormat.format(input
-				.floatValue()));
-
-		assertEquals(input, result);
-	}
-	
-	public void testReturnsNullBoxedTypeForEmptyString() throws Exception {
-		StringToNumberConverter converter = StringToNumberConverter.toInteger(false);
-		try {
-			assertNull(converter.convert(""));
-		} catch (Exception e) {
-			fail("exception should not have been thrown");
-		}
-	}
-
-	public void testThrowsIllegalArgumentExceptionIfAskedToConvertNonString()
-			throws Exception {
-		StringToNumberConverter converter = StringToNumberConverter.toInteger(false);
-		try {
-			converter.convert(new Integer(1));
-			fail("exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-	
-	/**
-	 * Asserts a use case where the integer starts with a valid value but ends
-	 * in an unparsable format.
-	 * 
-	 * @throws Exception
-	 */
-	public void testInvalidInteger() throws Exception {
-		StringToNumberConverter converter = StringToNumberConverter
-				.toInteger(false);
-
-		try {
-			converter.convert("1 1 1");
-			fail("exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-	
-	public void testThrowsIllegalArgumentExceptionIfNumberIsOutOfRange() throws Exception {
-		StringToNumberConverter converter = StringToNumberConverter.toInteger(false);
-		try {
-			converter.convert(numberFormat.format(Long.MAX_VALUE));
-			fail("exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/AbstractObservableTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/AbstractObservableTest.java
deleted file mode 100755
index 322c03b..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/AbstractObservableTest.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Brad Reynolds - bug 116920
- *     Matthew Hall - bugs 208332, 213145
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.jface.databinding.conformance.ObservableContractTest;
-import org.eclipse.jface.databinding.conformance.ObservableStaleContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * Tests for AbstractObservable.
- * 
- * @since 1.1
- */
-public class AbstractObservableTest extends AbstractDefaultRealmTestCase {
-	private ObservableStub observable;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		observable = new ObservableStub(Realm.getDefault());
-	}
-
-	public void testStaleListener() throws Exception {
-		assertFalse(observable.hasListeners());
-
-		StaleListener listener1 = new StaleListener();
-
-		assertFalse(observable.firstListenerAdded);
-		observable.addStaleListener(listener1);
-		assertTrue(observable.firstListenerAdded);
-		observable.firstListenerAdded = false; // reset
-
-		assertTrue(observable.hasListeners());
-		assertEquals(0, listener1.count);
-
-		observable.fireStale();
-
-		assertEquals(1, listener1.count);
-		assertSame(observable, listener1.source);
-
-		// Add a second stale listener as 1 vs. 2 listener code is different.
-		StaleListener listener2 = new StaleListener();
-		assertEquals(0, listener2.count);
-		observable.addStaleListener(listener2);
-		observable.fireStale();
-
-		assertEquals(2, listener1.count);
-		assertEquals(1, listener2.count);
-
-		// Add a third stale listener as 2 vs. 3 or greater code is different.
-		StaleListener listener3 = new StaleListener();
-		observable.addStaleListener(listener3);
-		assertEquals(0, listener3.count);
-
-		observable.fireStale();
-
-		assertEquals(3, listener1.count);
-		assertEquals(2, listener2.count);
-		assertEquals(1, listener3.count);
-
-		assertFalse(observable.lastListenerRemoved);
-		observable.removeStaleListener(listener1);
-		observable.removeStaleListener(listener2);
-		observable.removeStaleListener(listener3);
-		assertTrue(observable.lastListenerRemoved);
-
-		assertFalse(observable.hasListeners());
-	}
-
-	public void testChangeListener() throws Exception {
-		assertFalse(observable.hasListeners());
-
-		ChangeEventTracker listener1 = new ChangeEventTracker();
-
-		assertFalse(observable.firstListenerAdded);
-		observable.addChangeListener(listener1);
-		assertTrue(observable.firstListenerAdded);
-		observable.firstListenerAdded = false;
-
-		assertTrue(observable.hasListeners());
-		assertEquals(0, listener1.count);
-
-		observable.fireChange();
-
-		assertEquals(1, listener1.count);
-		assertSame(observable, listener1.event.getSource());
-
-		// Add a second listener as the 1 vs. 2 listener code is different.
-		ChangeEventTracker listener2 = new ChangeEventTracker();
-		observable.addChangeListener(listener2);
-		assertEquals(0, listener2.count);
-
-		observable.fireChange();
-		assertEquals(2, listener1.count);
-		assertEquals(1, listener2.count);
-
-		// Add a third listener as the 2 vs. 3 or greater code is different.
-		ChangeEventTracker listener3 = new ChangeEventTracker();
-		observable.addChangeListener(listener3);
-		assertEquals(0, listener3.count);
-
-		observable.fireChange();
-
-		assertEquals(3, listener1.count);
-		assertEquals(2, listener2.count);
-		assertEquals(1, listener3.count);
-
-		assertFalse(observable.lastListenerRemoved);
-		observable.removeChangeListener(listener1);
-		observable.removeChangeListener(listener2);
-		observable.removeChangeListener(listener3);
-		assertTrue(observable.lastListenerRemoved);
-
-		assertFalse(observable.hasListeners());
-	}
-
-	public void testHasListenersWithChangeAndStaleListeners() throws Exception {
-		ChangeEventTracker changeListener = new ChangeEventTracker();
-		StaleListener staleListener = new StaleListener();
-
-		assertFalse(observable.hasListeners());
-		assertFalse(observable.firstListenerAdded);
-		assertFalse(observable.lastListenerRemoved);
-
-		observable.addChangeListener(changeListener);
-		assertTrue(observable.hasListeners());
-		assertTrue(observable.firstListenerAdded);
-		assertFalse(observable.lastListenerRemoved);
-
-		// reset
-		observable.firstListenerAdded = false;
-		observable.lastListenerRemoved = false;
-
-		observable.addStaleListener(staleListener);
-		assertTrue(observable.hasListeners());
-		assertFalse(observable.firstListenerAdded);
-		assertFalse(observable.lastListenerRemoved);
-
-		observable.removeChangeListener(changeListener);
-		assertTrue(observable.hasListeners());
-		assertFalse(observable.firstListenerAdded);
-		assertFalse(observable.lastListenerRemoved);
-
-		observable.removeStaleListener(staleListener);
-		assertFalse(observable.hasListeners());
-		assertFalse(observable.firstListenerAdded);
-		assertTrue(observable.lastListenerRemoved);
-	}
-
-	public void testFireStaleRealmChecks() throws Exception {
-		RealmTester.setDefault(new CurrentRealm(true));
-
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				observable = new ObservableStub();
-				observable.fireStale();
-			}
-		});
-	}
-
-	public void testFireChangeRealmChecks() throws Exception {
-		RealmTester.setDefault(new CurrentRealm(true));
-
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				observable = new ObservableStub();
-				observable.fireChange();
-			}
-		});
-	}
-
-	private class StaleListener implements IStaleListener {
-		int count;
-		IObservable source;
-
-		public void handleStale(StaleEvent event) {
-			count++;
-			this.source = event.getObservable();
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(AbstractObservableTest.class.getName());
-		suite.addTestSuite(AbstractObservableTest.class);
-		Delegate delegate = new Delegate();
-		suite.addTest(ObservableContractTest.suite(delegate));
-		suite.addTest(ObservableStaleContractTest.suite(delegate));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableContractDelegate {
-
-		public void change(IObservable observable) {
-			((ObservableStub) observable).fireChange();
-		}
-
-		public void setStale(IObservable observable, boolean stale) {
-			((ObservableStub) observable).setStale(stale);
-		}
-
-		public IObservable createObservable(Realm realm) {
-			return new ObservableStub(realm);
-		}
-	}
-
-	private static class ObservableStub extends AbstractObservable {
-		private boolean stale;
-
-		public ObservableStub() {
-			this(Realm.getDefault());
-		}
-
-		/**
-		 * @param realm
-		 */
-		public ObservableStub(Realm realm) {
-			super(realm);
-		}
-
-		private boolean firstListenerAdded;
-
-		private boolean lastListenerRemoved;
-
-		protected Object doGetValue() {
-			return null;
-		}
-
-		public Object getValueType() {
-			return null;
-		}
-
-		protected void fireStale() {
-			super.fireStale();
-		}
-
-		protected void fireChange() {
-			super.fireChange();
-		}
-
-		public boolean isStale() {
-			getterCalled();
-			return stale;
-		}
-
-		private void getterCalled() {
-			ObservableTracker.getterCalled(this);
-		}
-
-		public void setStale(boolean stale) {
-			boolean old = this.stale;
-			this.stale = stale;
-
-			if (stale && !old) {
-				fireStale();
-			}
-		}
-
-		protected boolean hasListeners() {
-			return super.hasListeners();
-		}
-
-		protected void firstListenerAdded() {
-			firstListenerAdded = true;
-		}
-
-		protected void lastListenerRemoved() {
-			lastListenerRemoved = true;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/DiffsTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/DiffsTest.java
deleted file mode 100755
index 551acdd..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/DiffsTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable;
-
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.observable.set.SetDiff;
-import org.eclipse.core.databinding.observable.value.ValueDiff;
-
-/**
- * @since 3.2
- *
- */
-public class DiffsTest extends TestCase {
-	/**
-	 * Asserts that the {@link SetDiff#toString()} implementation doesn't throw a NPE if any of its properties are <code>null</code>.
-	 */
-	public void test_SetDiff() {
-		SetDiff diff = new SetDiff() {
-			public Set getAdditions() {
-				return null;
-			}
-
-			public Set getRemovals() {
-				return null;
-			}
-		};
-		
-		try {
-			diff.toString();
-			assertTrue(true);
-		} catch (NullPointerException e) {
-			fail("NPE was thrown.");
-		}
-	}
-
-	/**
-	 * Asserts that if the {@link ValueDiff#toString()} implementation doesn't throw a NPE if any of its properties are <code>null</code>.
-	 *
-	 */
-	public void test_ValueDiff() {
-		ValueDiff diff = new ValueDiff() {
-			public Object getNewValue() {
-				return null;
-			}
-
-			public Object getOldValue() {
-				return null;
-			}
-		};
-		
-		try {
-			diff.toString();
-			assertTrue(true);
-		} catch (NullPointerException e) {
-			fail("NPE was thrown.");
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/Diffs_ListDiffTests.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/Diffs_ListDiffTests.java
deleted file mode 100644
index 5cd9aff..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/Diffs_ListDiffTests.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 226216
- *******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.list.ListDiff;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.databinding.observable.list.ListDiffVisitor;
-
-/**
- * @since 1.1
- */
-public class Diffs_ListDiffTests extends TestCase {
-	public void testListDiffEntryToStringDoesNotThrowNPEForNullListDiffEntry() {
-		ListDiffEntry entry = new ListDiffEntry() {
-			public Object getElement() {
-				return null;
-			}
-
-			public int getPosition() {
-				return 0;
-			}
-
-			public boolean isAddition() {
-				return false;
-			}
-		};
-
-		try {
-			entry.toString();
-			assertTrue(true);
-		} catch (NullPointerException e) {
-			fail("NPE was thrown.");
-		}
-	}
-
-	public void testListDiffToStringDoesNotThrowNPEForNullListDiff() {
-		ListDiff diff = new ListDiff() {
-			public ListDiffEntry[] getDifferences() {
-				return null;
-			}
-		};
-
-		try {
-			diff.toString();
-			assertTrue(true);
-		} catch (NullPointerException e) {
-			fail("NPE was thrown.");
-		}
-	}
-
-	public void testListDiffToStringDoesNotThrowNPEForNullListDiffEntry() {
-		ListDiff diff = new ListDiff() {
-			public ListDiffEntry[] getDifferences() {
-				return new ListDiffEntry[1];
-			}
-		};
-
-		try {
-			diff.toString();
-			assertTrue(true);
-		} catch (NullPointerException e) {
-			fail("NPE was thrown.");
-		}
-	}
-
-	public void testDiffScenario1() throws Exception {
-		ListDiff diff = diff(null, null);
-		assertEquals(0, diff.getDifferences().length);
-	}
-	
-	private ListDiff diff(String[] oldArray, String[] newArray) {
-		List a = Arrays.asList((oldArray != null) ? oldArray : new String[] {});
-		List b = Arrays.asList((newArray != null) ? newArray : new String[] {});
-		
-		return Diffs.computeListDiff(a, b);
-	}
-	
-	public void testDiffScenario2() throws Exception {
-		ListDiff diff = diff(new String[] {"a"}, null);
-		assertEquals(1, diff.getDifferences().length);
-		assertEntry(diff.getDifferences()[0], false, 0, "a");
-	}
-	
-	public void testDiffScenario3() throws Exception {
-		ListDiff diff = diff(null, new String[] {"a"});
-		assertEquals(1, diff.getDifferences().length);
-		assertEntry(diff.getDifferences()[0], true, 0, "a");
-	}
-	
-	public void testDiffScenario4() throws Exception {
-		ListDiff diff = diff(new String[] {"a"}, new String[] {"a"});
-		
-		assertEquals(0, diff.getDifferences().length);
-	}
-	
-	public void testDiffScenario5() throws Exception {
-		ListDiff diff = diff(new String[] {"a"}, new String[] {"b"});
-		assertEquals(2, diff.getDifferences().length);
-		
-		assertEntry(diff.getDifferences()[0], true, 0, "b");
-		assertEntry(diff.getDifferences()[1], false, 1, "a");
-	}
-	
-	public void testDiffScenario6() throws Exception {
-		ListDiff diff = diff(new String[] { "a" }, new String[] { "a", "b" });
-		
-		assertEquals(1, diff.getDifferences().length);
-		assertEntry(diff.getDifferences()[0], true, 1, "b");
-	}
-	
-	public void testDiffScenario7() throws Exception {
-		ListDiff diff = diff(new String[] { "a" }, new String[] { "b", "a" });
-		
-		assertEquals(1, diff.getDifferences().length);
-		assertEntry(diff.getDifferences()[0], true, 0, "b");
-	}
-	
-	public void testDiffScenario8() throws Exception {
-		ListDiff diff = diff(new String[] { "a" }, new String[] { "b", "b" });
-		
-		assertEquals(3, diff.getDifferences().length);
-		assertEntry(diff.getDifferences()[0], true, 0, "b");
-		assertEntry(diff.getDifferences()[1], true, 1, "b");
-		assertEntry(diff.getDifferences()[2], false, 2, "a");
-	}
-	
-	public void testDiffScenario9() throws Exception {
-		ListDiff diff = diff(new String[] { "a" }, new String[] { "a", "b", "c" });
-		
-		assertEquals(2, diff.getDifferences().length);
-		assertEntry(diff.getDifferences()[0], true, 1, "b");
-		assertEntry(diff.getDifferences()[1], true, 2, "c");
-	}
-	
-	public void testDiffScenario10() throws Exception {
-		ListDiff diff = diff(new String[] { "b" }, new String[] { "a", "b", "c" });
-		
-		assertEquals(2, diff.getDifferences().length);
-		assertEntry(diff.getDifferences()[0], true, 0, "a");
-		assertEntry(diff.getDifferences()[1], true, 2, "c");
-	}
-	
-	public void testDiffScenario11() throws Exception {
-		ListDiff diff = diff(new String[] { "c" }, new String[] { "a", "b", "c" });
-		
-		assertEquals(2, diff.getDifferences().length);
-		assertEntry(diff.getDifferences()[0], true, 0, "a");
-		assertEntry(diff.getDifferences()[1], true, 1, "b");		
-	}
-	
-	public void testDiffScenario12() throws Exception {
-		ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "a", "b", "c" });
-		
-		assertEquals(0, diff.getDifferences().length);
-	}
-	
-	public void testDiffScenario13() throws Exception {
-		ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "b", "c" });
-		
-		assertEquals(1, diff.getDifferences().length);
-		assertEntry(diff.getDifferences()[0], false, 0, "a");
-	}
-	
-	public void testDiffScenarios14() throws Exception {
-		ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "a", "c" });
-		
-		assertEquals(1, diff.getDifferences().length);
-		assertEntry(diff.getDifferences()[0], false, 1, "b");
-	}
-	
-	public void testDiffScenarios15() throws Exception {
-		ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "a", "b" });
-		
-		assertEquals(1, diff.getDifferences().length);
-		assertEntry(diff.getDifferences()[0], false, 2, "c");
-	}
-	
-	public void testDiffScenarios16() throws Exception {
-		ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "c", "b", "a" });
-		
-		assertEquals(4, diff.getDifferences().length);
-		assertEntry(diff.getDifferences()[0], false, 2, "c");
-		assertEntry(diff.getDifferences()[1], true, 0, "c");
-		assertEntry(diff.getDifferences()[2], false, 2, "b");
-		assertEntry(diff.getDifferences()[3], true, 1, "b");
-	}
-	
-	public void testDiffScenarios17() throws Exception {
-		ListDiff diff = diff(new String[] { "a", "b", "c" }, new String[] { "c", "b" });
-		
-		assertEquals(3, diff.getDifferences().length);
-		assertEntry(diff.getDifferences()[0], false, 0, "a");
-		assertEntry(diff.getDifferences()[1], false, 1, "c");
-		assertEntry(diff.getDifferences()[2], true, 0, "c");
-	}
-	
-	private static void assertEntry(ListDiffEntry entry, boolean addition, int position, String element) {
-		assertEquals("addition", addition, entry.isAddition());
-		assertEquals("position", position, entry.getPosition());
-		assertEquals("element", element, entry.getElement());
-	}
-
-	public void testComputeListDiff_SingleInsert() {
-		checkComputedListDiff(Arrays.asList(new Object[] { "a", "c" }), Arrays
-				.asList(new Object[] { "a", "b", "c" }));
-	}
-
-	public void testComputeListDiff_SingleAppend() {
-		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b" }), Arrays
-				.asList(new Object[] { "a", "b", "c" }));
-	}
-
-	public void testComputeListDiff_SingleRemove() {
-		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b", "c" }),
-				Arrays.asList(new Object[] { "a", "b" }));
-		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b", "c" }),
-				Arrays.asList(new Object[] { "a", "c" }));
-		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b", "c" }),
-				Arrays.asList(new Object[] { "b", "c" }));
-	}
-
-	public void testComputeListDiff_MoveDown1() {
-		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b" }), Arrays
-				.asList(new Object[] { "b", "a" }));
-	}
-
-	public void testComputeListDiff_MoveDown2() {
-		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b", "c" }),
-				Arrays.asList(new Object[] { "b", "c", "a" }));
-	}
-
-	public void testComputeListDiff_MoveUp1() {
-		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b" }), Arrays
-				.asList(new Object[] { "b", "a" }));
-	}
-
-	public void testComputeListDiff_MoveUp2() {
-		checkComputedListDiff(Arrays.asList(new Object[] { "a", "b", "c" }),
-				Arrays.asList(new Object[] { "c", "a", "b" }));
-	}
-
-	private static void checkComputedListDiff(List oldList, List newList) {
-		ListDiff diff = Diffs.computeListDiff(oldList, newList);
-
-		final List list = new ArrayList(oldList);
-		diff.accept(new ListDiffVisitor() {
-			public void handleAdd(int index, Object element) {
-				list.add(index, element);
-			}
-
-			public void handleRemove(int index, Object element) {
-				assertEquals(element, list.remove(index));
-			}
-
-			public void handleReplace(int index, Object oldElement,
-					Object newElement) {
-				assertEquals(oldElement, list.set(index, newElement));
-			}
-		});
-
-		assertEquals(
-				"Applying diff to old list should make it equal to new list",
-				newList, list);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/LockRealm.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/LockRealm.java
deleted file mode 100755
index 768fb33..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/LockRealm.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable;
-
-import java.util.LinkedList;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ILock;
-import org.eclipse.core.runtime.jobs.Job;
-
-/**
- * @since 3.2
- * 
- */
-public class LockRealm extends Realm {
-
-	private LinkedList queue;
-	private ILock lock;
-	private Job job;
-	private boolean lockAcquired;
-
-	public LockRealm() {
-		queue = new LinkedList();
-		lock = Job.getJobManager().newLock();
-		job = new Job("Lock Realm Job") {
-			protected IStatus run(IProgressMonitor monitor) {
-				for (Runnable runnable; (runnable = dequeue()) != null;) {
-					acquireLock();
-					try {
-						safeRun(runnable);
-					} finally {
-						releaseLock();
-					}
-				}
-				return Status.OK_STATUS;
-			}
-		};
-		job.setSystem(true);
-	}
-
-	protected void syncExec(Runnable runnable) {
-		acquireLock();
-		try {
-			safeRun(runnable);
-		} finally {
-			releaseLock();
-		}
-	}
-
-	public void asyncExec(Runnable runnable) {
-		enqueue(runnable);
-		job.schedule();
-	}
-
-	/**
-	 * @param runnable
-	 */
-	private void enqueue(Runnable runnable) {
-		synchronized (queue) {
-			queue.addLast(runnable);
-		}
-	}
-
-	private Runnable dequeue() {
-		synchronized (queue) {
-			if (queue.isEmpty()) {
-				return null;
-			}
-			return (Runnable) queue.getFirst();
-		}
-	}
-
-	public boolean isCurrent() {
-		return lockAcquired;
-	}
-
-	private void acquireLock() {
-		lock.acquire();
-		lockAcquired = true;
-	}
-
-	private void releaseLock() {
-		lockAcquired = false;
-		lock.release();
-	}
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/ObservableTrackerTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/ObservableTrackerTest.java
deleted file mode 100644
index be13fa3..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/ObservableTrackerTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 210115)
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable;
-
-import org.eclipse.core.databinding.observable.*;
-import org.eclipse.core.runtime.AssertionFailedException;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-public class ObservableTrackerTest extends AbstractDefaultRealmTestCase {
-	public void testGetterCalled_ObservableDisposed() throws Exception {
-		try {
-			IObservable observable = new ObservableStub();
-			observable.dispose();
-
-			ObservableTracker.getterCalled(observable);
-
-			fail("expected AssertionFailedException");
-		} catch (AssertionFailedException expected) {
-		}
-	}
-
-	public void testGetterCalled_ObservableRealmNotCurrent() throws Exception {
-		try {
-			IObservable observable = new ObservableStub(new NotCurrentRealm());
-
-			ObservableTracker.getterCalled(observable);
-
-			fail("expected AssertionFailedException");
-		} catch (AssertionFailedException expected) {
-		}
-	}
-
-	public static class ObservableStub extends AbstractObservable {
-		public ObservableStub() {
-			this(Realm.getDefault());
-		}
-
-		public ObservableStub(Realm realm) {
-			super(realm);
-		}
-
-		public boolean isStale() {
-			return false;
-		}
-	}
-
-	public static class NotCurrentRealm extends Realm {
-		public boolean isCurrent() {
-			return false;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/ObservablesTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/ObservablesTest.java
deleted file mode 100755
index 6c896db..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/ObservablesTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Cerner Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ObservableList;
-import org.eclipse.core.internal.databinding.observable.UnmodifiableObservableList;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-public class ObservablesTest extends AbstractDefaultRealmTestCase {	
-	public void testUnmodifableObservableListExceptions() throws Exception {
-		try {
-			Observables.unmodifiableObservableList(null);
-			fail("IllegalArgumentException should have been thrown.");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-	
-	public void testUnmodifiableObservableList() throws Exception {
-		IObservableList unmodifiable = Observables.unmodifiableObservableList(new ObservableListStub(new ArrayList(0), String.class));
-		assertTrue(unmodifiable instanceof UnmodifiableObservableList);
-	}
-	
-	private static class ObservableListStub extends ObservableList {
-		/**
-		 * @param wrappedList
-		 * @param elementType
-		 */
-		protected ObservableListStub(List wrappedList, Object elementType) {
-			super(wrappedList, elementType);
-		}		
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/RealmTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/RealmTest.java
deleted file mode 100644
index ad8caf0..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/RealmTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-
-/**
- * @since 3.2
- */
-public class RealmTest extends TestCase {
-	public void testSetDefaultWithRunnable() throws Exception {
-		Realm oldRealm = new CurrentRealm(true);
-		final Realm newRealm = new CurrentRealm(true);
-		
-		RealmTester.setDefault(oldRealm);
-		Realm.runWithDefault(newRealm, new Runnable() {
-			public void run() {
-				assertEquals("new realm should be default", newRealm, Realm.getDefault());
-			}
-		});
-		
-		assertEquals("old realm should have been restored", oldRealm, Realm.getDefault());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/ThreadRealm.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/ThreadRealm.java
deleted file mode 100755
index 7562a16..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/ThreadRealm.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 118516
- *******************************************************************************/
-package org.eclipse.core.tests.databinding.observable;
-
-import java.util.LinkedList;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.runtime.Assert;
-
-/**
- * {@link Realm} that enforces execution to be within a specific
- * {@link Thread}.
- * 
- * @since 3.2
- */
-public class ThreadRealm extends Realm {
-    private Thread thread;
-
-    private final LinkedList queue = new LinkedList();
-
-    private volatile boolean block;
-
-    /**
-     * Initializes the realm.
-     * 
-     * @param thread
-     */
-    public synchronized void init(Thread thread) {
-        if (thread == null) {
-            throw new IllegalArgumentException("Parameter thread was null."); //$NON-NLS-1$
-        }
-        Assert.isTrue(this.thread == null, "Realm can only be initialized once.");
-
-        this.thread = thread;
-    }
-
-    /**
-     * @return <code>true</code> if the current thread is the thread for
-     *         the realm
-     */
-    public boolean isCurrent() {
-        return Thread.currentThread() == thread;
-    }
-
-    /**
-     * @return thread, <code>null</code> if not
-     *         {@link #init(Thread) initialized}
-     */
-    public Thread getThread() {
-        return thread;
-    }
-
-    /**
-     * Queues the provided <code>runnable</code>.
-     * 
-     * @param runnable
-     */
-    public void asyncExec(Runnable runnable) {
-        synchronized (queue) {
-            queue.add(runnable);
-            queue.notifyAll();
-        }
-    }
-    
-    public boolean isBlocking() {
-        return block;
-    }
-
-    /**
-     * Blocks the current thread invoking runnables.
-     */
-    public void block() {
-        if (block) {
-            throw new IllegalStateException("Realm is already blocking.");
-        }
-        
-        if (Thread.currentThread() != thread) {
-            throw new IllegalStateException("The current thread is not the correct thread.");
-        }
-        
-        try {
-            block = true;
-            while (block) {
-                Runnable runnable = null;
-                synchronized (queue) {
-                    while (queue.isEmpty()) {
-                        queue.wait();
-                    }
-                    
-                    // Check the size in case the thread is being awoken by
-                    // unblock().
-                    if (!queue.isEmpty()) {
-                        runnable = (Runnable) queue.removeFirst();
-                    }
-                }
-
-                if (runnable != null) {
-                    safeRun(runnable);
-                    runnable = null;
-                }
-            }
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-        } finally {
-            block = false;
-        }
-    }
-
-    /**
-     * Unblocks the thread.
-     */
-    public void unblock() {
-        block = false;
-
-        // Awaken the thread if waiting.
-        synchronized (queue) {
-            queue.notifyAll();
-        }
-    }
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/AbstractObservableListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/AbstractObservableListTest.java
deleted file mode 100755
index d608bd4..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/AbstractObservableListTest.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Brad Reynolds - bug 167204
- *     Matthew Hall - bugs 208858, 213145, 247367
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.list;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.list.AbstractObservableList;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiff;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.jface.databinding.conformance.ObservableListContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-
-/**
- * @since 3.2
- */
-public class AbstractObservableListTest extends TestCase {
-	private AbstractObservableListStub list;
-
-	protected void setUp() throws Exception {
-		RealmTester.setDefault(new CurrentRealm(true));
-		list = new AbstractObservableListStub();
-	}
-
-	protected void tearDown() throws Exception {
-		RealmTester.setDefault(null);
-	}
-
-	public void testFireChangeRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				list.fireChange();
-			}
-		});
-	}
-
-	public void testFireStaleRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				list.fireStale();
-			}
-		});
-	}
-
-	public void testFireListChangeRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				list.fireListChange(null);
-			}
-		});
-	}
-
-	public void testMove_FiresListChanges() throws Exception {
-		list = new MutableObservableListStub();
-		final Object element = new Object();
-		list.add(element);
-		list.add(new Object());
-
-		final List diffEntries = new ArrayList();
-		list.addListChangeListener(new IListChangeListener() {
-			public void handleListChange(ListChangeEvent event) {
-				diffEntries.addAll(Arrays.asList(event.diff.getDifferences()));
-			}
-		});
-
-		list.move(0, 1);
-
-		assertEquals(2, diffEntries.size());
-
-		ListDiffEntry entry = (ListDiffEntry) diffEntries.get(0);
-		assertEquals(element, entry.getElement());
-		assertEquals(false, entry.isAddition());
-		assertEquals(0, entry.getPosition());
-
-		entry = (ListDiffEntry) diffEntries.get(1);
-		assertEquals(element, entry.getElement());
-		assertEquals(true, entry.isAddition());
-		assertEquals(1, entry.getPosition());
-	}
-
-	public void testMove_MovesElement() throws Exception {
-		list = new MutableObservableListStub();
-		final Object element0 = new Object();
-		final Object element1 = new Object();
-		list.add(element0);
-		list.add(element1);
-
-		list.move(0, 1);
-
-		assertEquals(element1, list.get(0));
-		assertEquals(element0, list.get(1));
-	}
-
-	public void testAddListChangeListener_AfterDispose() {
-		list.dispose();
-		list.addListChangeListener(new IListChangeListener() {
-			public void handleListChange(ListChangeEvent event) {
-				// do nothing
-			}
-		});
-	}
-
-	public void testRemoveListChangeListener_AfterDispose() {
-		list.dispose();
-		list.removeListChangeListener(new IListChangeListener() {
-			public void handleListChange(ListChangeEvent event) {
-				// do nothing
-			}
-		});
-	}
-
-	public void testAddChangeListener_AfterDispose() {
-		list.dispose();
-		list.addChangeListener(new IChangeListener() {
-			public void handleChange(ChangeEvent event) {
-				// do nothing
-			}
-		});
-	}
-
-	public void testRemoveChangeListener_AfterDispose() {
-		list.dispose();
-		list.removeChangeListener(new IChangeListener() {
-			public void handleChange(ChangeEvent event) {
-				// do nothing
-			}
-		});
-	}
-
-	public void testAddStaleListener_AfterDispose() {
-		list.dispose();
-		list.addStaleListener(new IStaleListener() {
-			public void handleStale(StaleEvent staleEvent) {
-				// do nothing
-			}
-		});
-	}
-
-	public void testRemoveStaleListener_AfterDispose() {
-		list.dispose();
-		list.removeStaleListener(new IStaleListener() {
-			public void handleStale(StaleEvent staleEvent) {
-				// do nothing
-			}
-		});
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(AbstractObservableListTest.class.getName());
-		suite.addTestSuite(AbstractObservableListTest.class);
-		suite.addTest(ObservableListContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableCollectionContractDelegate {
-
-		public IObservableCollection createObservableCollection(Realm realm,
-				final int itemCount) {
-
-			String[] items = new String[itemCount];
-			for (int i = 0; i < itemCount; i++) {
-				items[i] = String.valueOf(i);
-			}
-
-			AbstractObservableListStub observable = new AbstractObservableListStub(realm, Arrays.asList(items));
-			observable.elementType = String.class;
-			return observable;
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return String.class;
-		}
-
-		public void change(IObservable observable) {
-			((AbstractObservableListStub) observable).fireChange();
-		}
-	}
-
-	static class AbstractObservableListStub extends AbstractObservableList {
-		Object elementType;
-
-		List wrappedList;
-
-		public AbstractObservableListStub() {
-			super();
-			wrappedList = new ArrayList();
-		}
-
-		public AbstractObservableListStub(Realm realm, List list) {
-			super(realm);
-			this.wrappedList = list;
-		}
-
-		protected int doGetSize() {
-			return wrappedList.size();
-		}
-
-		public Object get(int index) {
-			ObservableTracker.getterCalled(this);
-			return wrappedList.get(index);
-		}
-
-		public Object getElementType() {
-			return elementType;
-		}
-
-		protected void fireChange() {
-			super.fireChange();
-		}
-
-		protected void fireStale() {
-			super.fireStale();
-		}
-
-		protected void fireListChange(ListDiff diff) {
-			super.fireListChange(diff);
-		}
-	}
-
-	static class MutableObservableListStub extends AbstractObservableListStub {
-		// These methods are present so we can test AbstractObservableList.move()
-
-		public void add(int index, Object element) {
-			checkRealm();
-			wrappedList.add(index, element);
-			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
-					index, true, element)));
-		}
-
-		public Object remove(int index) {
-			checkRealm();
-			Object element = wrappedList.remove(index);
-			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
-					index, false, element)));
-			return element;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/ComputedListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/ComputedListTest.java
deleted file mode 100644
index 6b1aebe..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/ComputedListTest.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 211786)
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.list;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.list.ComputedList;
-import org.eclipse.jface.databinding.conformance.ObservableListContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.ListChangeEventTracker;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-public class ComputedListTest extends AbstractDefaultRealmTestCase {
-	ComputedListStub list;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		list = new ComputedListStub();
-		list.size(); // Force list to compute
-	}
-
-	public void testDependency_Staleness() {
-		assertFalse(list.isStale());
-		list.dependency.fireStale();
-		assertTrue(list.isStale());
-	}
-
-	public void testDependency_FiresListChange() {
-		assertEquals(list.nextComputation, list);
-
-		Object element = new Object();
-		list.nextComputation.add(element);
-
-		list.dependency.fireChange();
-
-		List expectedList = new ArrayList();
-		expectedList.add(element);
-		assertEquals(expectedList, list);
-	}
-
-	public void testDependency_NoStaleEventIfAlreadyDirty() {
-		list.dependency.fireChange();
-		list.addStaleListener(new IStaleListener() {
-			public void handleStale(StaleEvent staleEvent) {
-				fail("Should not fire stale when list is already dirty");
-			}
-		});
-		list.dependency.fireStale();
-	}
-
-	public void testDependency_ListChangeEventFiresOnlyWhenNotDirty() {
-		ListChangeEventTracker tracker = ListChangeEventTracker.observe(list);
-
-		list.dependency.fireChange();
-		assertEquals(
-				"ComputedList should fire list change event when its dependency changes",
-				1, tracker.count);
-
-		list.dependency.fireChange();
-		assertEquals(
-				"ComputedList should not fire list change events when dirty",
-				1, tracker.count);
-
-		list.size(); // Force list to recompute.
-		list.dependency.fireChange();
-		assertEquals(
-				"ComputedList should fire list change event when its dependency changes",
-				2, tracker.count);
-	}
-
-	static class ComputedListStub extends ComputedList {
-		List nextComputation = new ArrayList();
-		ObservableStub dependency;
-
-		ComputedListStub() {
-			this(Realm.getDefault());
-		}
-
-		ComputedListStub(Realm realm) {
-			super(realm);
-			dependency = new ObservableStub(realm);
-		}
-
-		protected List calculate() {
-			ObservableTracker.getterCalled(dependency);
-			return new ArrayList(nextComputation);
-		}
-	}
-
-	static class ObservableStub extends AbstractObservable {
-		public ObservableStub(Realm realm) {
-			super(realm);
-		}
-
-		boolean stale;
-
-		public boolean isStale() {
-			return stale;
-		}
-
-		protected void fireStale() {
-			stale = true;
-			super.fireStale();
-		}
-
-		protected void fireChange() {
-			super.fireChange();
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ComputedListTest.class.getName());
-		suite.addTestSuite(ComputedListTest.class);
-		suite.addTest(ObservableListContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableCollectionContractDelegate {
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			final ComputedListStub list = new ComputedListStub(realm);
-			for (int i = 0; i < elementCount; i++)
-				list.nextComputation.add(createElement(list));
-			list.size(); // force list to compute
-			return list;
-		}
-
-		public void change(IObservable observable) {
-			ComputedListStub list = (ComputedListStub) observable;
-			list.nextComputation.add(new Object());
-			list.dependency.fireChange();
-		}
-
-		public void setStale(IObservable observable, boolean stale) {
-			if (stale)
-				((ComputedListStub) observable).dependency.fireStale();
-			else {
-				ComputedListStub computedList = (ComputedListStub) observable;
-				computedList.dependency.stale = false;
-				computedList.dependency.fireChange();
-			}
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/DecoratingObservableListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/DecoratingObservableListTest.java
deleted file mode 100644
index ca361d5..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/DecoratingObservableListTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 208332)
- *     Matthew Hall - bug 213145
- *         (through ProxyObservableListTest.java)
- *     Matthew Hall - bug 237718
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.list;
-
-import java.util.ArrayList;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.DecoratingObservableList;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.jface.databinding.conformance.MutableObservableListContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-
-/**
- * @since 3.2
- * 
- */
-public class DecoratingObservableListTest {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(DecoratingObservableListTest.class
-				.getName());
-		suite.addTest(MutableObservableListContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableCollectionContractDelegate {
-		private Object elementType = Object.class;
-
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			IObservableList wrappedList = new WritableList(realm,
-					new ArrayList(), elementType);
-			for (int i = 0; i < elementCount; i++)
-				wrappedList.add(new Object());
-			return new DecoratingObservableListStub(wrappedList);
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object();
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return elementType;
-		}
-
-		public void change(IObservable observable) {
-			((DecoratingObservableListStub) observable).decorated
-					.add(new Object());
-		}
-	}
-
-	static class DecoratingObservableListStub extends DecoratingObservableList {
-		IObservableList decorated;
-
-		DecoratingObservableListStub(IObservableList decorated) {
-			super(decorated, true);
-			this.decorated = decorated;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/ListDiffTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/ListDiffTest.java
deleted file mode 100644
index 959d828..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/ListDiffTest.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 208858)
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.list;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.list.ListDiff;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.databinding.observable.list.ListDiffVisitor;
-
-import junit.framework.TestCase;
-
-/**
- * Tests for ListDiff class
- * 
- * @since 1.1
- */
-public class ListDiffTest extends TestCase {
-	ListDiffVisitorStub visitor;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		visitor = new ListDiffVisitorStub();
-	}
-
-	public void testAccept_Add() {
-		createListDiff(add(0, "element")).accept(visitor);
-		assertEquals("add(0,element)", visitor.log);
-	}
-
-	public void testAccept_Remove() {
-		createListDiff(remove(0, "element")).accept(visitor);
-		assertEquals("remove(0,element)", visitor.log);
-	}
-
-	public void testAccept_Move() {
-		createListDiff(remove(0, "element"), add(1, "element")).accept(visitor);
-		assertEquals("move(0,1,element)", visitor.log);
-	}
-
-	public void testAccept_Replace() {
-		createListDiff(remove(0, "element0"), add(0, "element1")).accept(
-				visitor);
-		assertEquals("replace(0,element0,element1)", visitor.log);
-	}
-
-	public void testAccept_AllPatterns() {
-		createListDiff(new ListDiffEntry[] {
-				// Replace
-				remove(0, "element0"), add(0, "element1"),
-				// Remove
-				remove(1, "element2"),
-				// Add
-				add(2, "element3"),
-				// Move
-				remove(3, "element4"), add(4, "element4") }).accept(visitor);
-		assertEquals(
-				"replace(0,element0,element1), remove(1,element2), add(2,element3), move(3,4,element4)",
-				visitor.log);
-	}
-
-	public void testAccept_MoveDetectionUsesEqualityNotSameness() {
-		Object element0 = new String("element");
-		Object element1 = new String("element");
-		assertNotSame(element0, element1);
-		assertEquals(element0, element1);
-
-		createListDiff(remove(0, element0), add(1, element1)).accept(visitor);
-		assertEquals("move(0,1,element)", visitor.log);
-	}
-
-	private ListDiffEntry add(int index, Object element) {
-		return Diffs.createListDiffEntry(index, true, element);
-	}
-
-	private ListDiffEntry remove(int index, Object element) {
-		return Diffs.createListDiffEntry(index, false, element);
-	}
-
-	private ListDiff createListDiff(ListDiffEntry difference) {
-		return createListDiff(new ListDiffEntry[] { difference });
-	}
-
-	private ListDiff createListDiff(ListDiffEntry first, ListDiffEntry second) {
-		return createListDiff(new ListDiffEntry[] { first, second });
-	}
-
-	private ListDiff createListDiff(ListDiffEntry[] differences) {
-		return Diffs.createListDiff(differences);
-	}
-
-	class ListDiffVisitorStub extends ListDiffVisitor {
-		String log = "";
-
-		public void handleAdd(int index, Object element) {
-			log("add(" + index + "," + element + ")");
-		}
-
-		public void handleRemove(int index, Object element) {
-			log("remove(" + index + "," + element + ")");
-		}
-
-		public void handleMove(int oldIndex, int newIndex, Object element) {
-			log("move(" + oldIndex + "," + newIndex + "," + element + ")");
-		}
-
-		public void handleReplace(int index, Object oldElement,
-				Object newElement) {
-			log("replace(" + index + "," + oldElement + "," + newElement + ")");
-		}
-
-		private void log(String message) {
-			if (log.length() > 0)
-				log += ", ";
-			log += message;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/ListDiffVisitorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/ListDiffVisitorTest.java
deleted file mode 100644
index 4ec9288..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/ListDiffVisitorTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 208858)
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.list;
-
-import org.eclipse.core.databinding.observable.list.ListDiffVisitor;
-
-import junit.framework.TestCase;
-
-/**
- * Tests for ListDiffVisitor class
- * 
- * @since 1.1
- */
-public class ListDiffVisitorTest extends TestCase {
-	ListDiffVisitorStub visitor;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		visitor = new ListDiffVisitorStub();
-	}
-
-	public void testHandleMove_DelegatesByDefault() {
-		visitor.handleMove(0, 1, "element");
-		assertEquals(
-				"Default ListDiffVisitor.handleMove must delegate to handleRemove and handleAdd",
-				"remove(0,element), add(1,element)", visitor.log);
-	}
-
-	public void testHandleReplace_DelegatesByDefault() {
-		visitor.handleReplace(2, "oldElement", "newElement");
-		assertEquals(
-				"Default ListDiffVisitor.handleReplace must delegate to handleRemove and handleAdd",
-				"remove(2,oldElement), add(2,newElement)", visitor.log);
-	}
-
-	static class ListDiffVisitorStub extends ListDiffVisitor {
-		String log = "";
-
-		private void log(String message) {
-			if (log.length() > 0)
-				log += ", ";
-			log += message;
-		}
-
-		public void handleAdd(int index, Object element) {
-			log("add(" + index + "," + element + ")");
-		}
-
-		public void handleRemove(int index, Object element) {
-			log("remove(" + index + "," + element + ")");
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/MultiListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/MultiListTest.java
deleted file mode 100644
index 79859a6..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/MultiListTest.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 222289)
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.list;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.databinding.observable.list.MultiList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.jface.databinding.conformance.ObservableListContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.ListChangeEventTracker;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-public class MultiListTest extends AbstractDefaultRealmTestCase {
-	MultiListStub multiList;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		WritableList[] lists = new WritableList[] { new WritableList(),
-				new WritableList() };
-		multiList = new MultiListStub(Realm.getDefault(), lists);
-	}
-
-	public void testIsStale_FollowsSublist() {
-		assertFalse(multiList.isStale());
-		multiList.subLists[0].setStale(true);
-		assertTrue(multiList.isStale());
-		multiList.subLists[0].setStale(false);
-		assertFalse(multiList.isStale());
-	}
-
-	public void testDependency_FiresListChange() {
-		List expectedList = new ArrayList();
-		assertEquals(expectedList, multiList);
-
-		Object element = new Object();
-		expectedList.add(element);
-		multiList.subLists[0].add(element);
-		assertEquals(expectedList, multiList);
-	}
-
-	public void testStaleEvent_NoFireEventIfAlreadyStale() {
-		multiList.subLists[0].setStale(true);
-		multiList.addStaleListener(new IStaleListener() {
-			public void handleStale(StaleEvent staleEvent) {
-				fail("Should not fire stale when list is already dirty");
-			}
-		});
-		multiList.subLists[1].setStale(true);
-	}
-
-	public void testModifySubList_FiresListChangeEventFromMultiList() {
-		ListChangeEventTracker tracker = ListChangeEventTracker
-				.observe(multiList);
-		ListDiffEntry[] differences;
-
-		//
-
-		Object element0 = new Object();
-		multiList.subLists[0].add(element0);
-
-		assertEquals(1, tracker.count);
-
-		differences = tracker.event.diff.getDifferences();
-		assertEquals(1, differences.length);
-		assertEntry(differences[0], 0, true, element0);
-
-		//
-
-		Object element1 = new Object();
-		multiList.subLists[1].add(element1);
-
-		assertEquals(2, tracker.count);
-
-		differences = tracker.event.diff.getDifferences();
-		assertEquals(1, differences.length);
-		assertEntry(differences[0], 1, true, element1);
-
-		//
-
-		Object element2 = new Object();
-		multiList.subLists[0].add(element2);
-
-		assertEquals(3, tracker.count);
-
-		differences = tracker.event.diff.getDifferences();
-		assertEquals(1, differences.length);
-		assertEntry(differences[0], 1, true, element2);
-
-	}
-
-	/**
-	 * @param entry
-	 * @param position
-	 * @param addition
-	 * @param element
-	 */
-	private void assertEntry(ListDiffEntry entry, int position,
-			boolean addition, Object element) {
-		assertEquals(element, entry.getElement());
-		assertEquals(addition, entry.isAddition());
-		assertEquals(position, entry.getPosition());
-	}
-
-	private static class MultiListStub extends MultiList {
-		WritableList[] subLists;
-
-		MultiListStub(Realm realm, WritableList[] lists) {
-			super(realm, lists);
-			this.subLists = lists;
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(MultiListTest.class.getName());
-		suite.addTestSuite(MultiListTest.class);
-		suite.addTest(ObservableListContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableCollectionContractDelegate {
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			WritableList[] subLists = new WritableList[] {
-					new WritableList(realm), new WritableList(realm) };
-			final MultiListStub list = new MultiListStub(realm, subLists);
-			for (int i = 0; i < elementCount; i++)
-				list.subLists[0].add(createElement(list));
-			return list;
-		}
-
-		public void change(IObservable observable) {
-			MultiListStub list = (MultiListStub) observable;
-			list.subLists[0].add(new Object());
-		}
-
-		public void setStale(IObservable observable, boolean stale) {
-			((MultiListStub) observable).subLists[0].setStale(stale);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/ObservableListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/ObservableListTest.java
deleted file mode 100755
index 461e87b..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/ObservableListTest.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 167204
- *     Matthew Hall - bugs 208858, 213145
- *******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.list;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiff;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.databinding.observable.list.ObservableList;
-import org.eclipse.jface.databinding.conformance.ObservableListContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-
-/**
- * @since 3.2
- */
-public class ObservableListTest extends TestCase {
-	private ObservableListStub list;
-
-	protected void setUp() throws Exception {
-		RealmTester.setDefault(new CurrentRealm(true));
-
-		list = new ObservableListStub(new ArrayList(0), Object.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		RealmTester.setDefault(null);
-	}
-
-	public void testIsStaleRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				list.isStale();
-			}
-		});
-	}
-
-	public void testSetStaleRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				list.setStale(false);
-			}
-		});
-	}
-
-	public void testMove_FiresListChanges() throws Exception {
-		list = new MutableObservableListStub();
-		final Object element = new Object();
-		list.add(0, element);
-		list.add(1, new Object());
-
-		final List diffEntries = new ArrayList();
-		list.addListChangeListener(new IListChangeListener() {
-			public void handleListChange(ListChangeEvent event) {
-				diffEntries.addAll(Arrays.asList(event.diff.getDifferences()));
-			} 
-		}); 
-
-		list.move(0, 1);
-
-		assertEquals(2, diffEntries.size());
-
-		ListDiffEntry entry = (ListDiffEntry) diffEntries.get(0);
-		assertEquals(element, entry.getElement());
-		assertEquals(false, entry.isAddition());
-		assertEquals(0, entry.getPosition());
-
-		entry = (ListDiffEntry) diffEntries.get(1);
-		assertEquals(element, entry.getElement());
-		assertEquals(true, entry.isAddition());
-		assertEquals(1, entry.getPosition());
-	}
-
-	public void testMove_MovesElement() throws Exception {
-		list = new MutableObservableListStub();
-		final Object element0 = new Object();
-		final Object element1 = new Object();
-		list.add(0, element0);
-		list.add(1, element1);
-		
-		list.move(0, 1);
-
-		assertEquals(element1, list.get(0));
-		assertEquals(element0, list.get(1));
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ObservableListTest.class.getName());
-		suite.addTestSuite(ObservableListTest.class);
-		suite.addTest(ObservableListContractTest.suite(new Delegate()));
-		return suite;
-	}
-	
-	/* package */ static class Delegate extends AbstractObservableCollectionContractDelegate {
-		public IObservableCollection createObservableCollection(Realm realm, final int elementCount) {
-			List wrappedList = new ArrayList();
-			for (int i = 0; i < elementCount; i++) {
-				wrappedList.add(String.valueOf(i));
-			}
-			
-			return new MutableObservableListStub(realm, wrappedList, String.class);
-		}
-		
-		public void change(IObservable observable) {
-			ObservableListStub list = (ObservableListStub) observable;
-			Object element = "element";
-			list.wrappedList.add(element);
-			list.fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(list.size(), true, element)));
-		}
-		
-		public Object getElementType(IObservableCollection collection) {
-			return String.class;
-		}
-	}
-
-	/* package */static class ObservableListStub extends ObservableList {
-		List wrappedList;
-		ObservableListStub(Realm realm, List wrappedList, Object elementType) {
-			super(realm, wrappedList, elementType);
-			this.wrappedList = wrappedList;
-		}
-		
-		ObservableListStub(List wrappedList, Object elementType) {
-			super(wrappedList, elementType);
-			this.wrappedList = wrappedList;
-		}
-		
-		protected void fireListChange(ListDiff diff) {
-			super.fireListChange(diff);
-		}
-	}
-
-	/* package */static class MutableObservableListStub extends
-			ObservableListStub {
-		MutableObservableListStub() {
-			this(Realm.getDefault(), new ArrayList(), null);
-		}
-
-		MutableObservableListStub(Realm realm, List wrappedList,
-				Object elementType) {
-			super(realm, wrappedList, elementType);
-		}
-
-		public void add(int index, Object element) {
-			checkRealm();
-			wrappedList.add(index, element);
-			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
-					index, true, element)));
-		}
-
-		public Object remove(int index) {
-			checkRealm();
-			Object element = wrappedList.remove(index);
-			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
-					index, false, element)));
-			return element;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/WritableListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/WritableListTest.java
deleted file mode 100755
index 5a7d158..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/list/WritableListTest.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 164653, 147515
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.list;
-
-import java.util.ArrayList;
-import java.util.Collections;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.jface.databinding.conformance.MutableObservableListContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 3.2
- */
-public class WritableListTest extends TestCase {
-	protected void tearDown() throws Exception {
-		RealmTester.setDefault(null);
-	}
-
-	public void testSetRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				WritableList list = new WritableList();
-				list.add("");
-				list.set(0, "");
-			}
-		});
-	}
-
-	public void testAddRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				WritableList list = new WritableList();
-				list.add("");
-			}
-		});
-	}
-
-	public void testAddByIndexRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				WritableList list = new WritableList();
-				list.add(0, "");
-			}
-		});
-	}
-
-	public void testAddAllRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				WritableList list = new WritableList();
-				list.addAll(Collections.EMPTY_LIST);
-			}
-		});
-	}
-
-	public void testAddAllByIndexRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				WritableList list = new WritableList();
-				list.addAll(0, Collections.EMPTY_LIST);
-			}
-		});
-	}
-
-	public void testRemoveRealmChecks() throws Exception {
-		RealmTester.setDefault(new CurrentRealm(true));
-		final WritableList list = new WritableList();
-		list.add("");
-		list.add("");
-
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				list.remove("");
-			}
-		});
-		RealmTester.setDefault(null);
-	}
-
-	public void testRemoveByIndexRealmChecks() throws Exception {
-		RealmTester.setDefault(new CurrentRealm(true));
-		final WritableList list = new WritableList();
-		list.add("");
-		list.add("");
-
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				list.remove(list.size() - 1);
-			}
-		});
-
-		RealmTester.setDefault(null);
-	}
-
-	public void testRemoveAllRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				WritableList list = new WritableList();
-				list.removeAll(Collections.EMPTY_LIST);
-			}
-		});
-	}
-
-	public void testRetainAllRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				WritableList list = new WritableList();
-				list.retainAll(Collections.EMPTY_LIST);
-			}
-		});
-	}
-
-	public void testClearRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				WritableList list = new WritableList();
-				list.clear();
-			}
-		});
-	}
-
-	public void testNullElementType() throws Exception {
-		RealmTester.setDefault(SWTObservables.getRealm(Display.getDefault()));
-		WritableList writableList = new WritableList();
-		assertNull(writableList.getElementType());
-
-		writableList = new WritableList(Realm.getDefault());
-		assertNull(writableList.getElementType());
-	}
-
-	public void testWithElementType() throws Exception {
-		RealmTester.setDefault(SWTObservables.getRealm(Display.getDefault()));
-
-		Object elementType = String.class;
-		WritableList list = WritableList.withElementType(elementType);
-		assertNotNull(list);
-		assertEquals(Realm.getDefault(), list.getRealm());
-		assertEquals(elementType, list.getElementType());
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(WritableListTest.class.getName());
-		suite.addTestSuite(WritableListTest.class);
-		suite.addTest(MutableObservableListContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableCollectionContractDelegate {
-		public Object createElement(IObservableCollection collection) {
-			return String.valueOf(collection.size() + 1);
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return String.class;
-		}
-
-		public IObservableCollection createObservableCollection(Realm realm,
-				final int itemCount) {
-			WritableList observable = new WritableList(realm, new ArrayList(), String.class);
-
-			for (int i = 0; i < itemCount; i++) {
-				observable.add(String.valueOf(i));
-			}
-
-			return observable;
-		}
-
-		public void change(IObservable observable) {
-			((WritableList) observable).add("");
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/AbstractObservableMapTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/AbstractObservableMapTest.java
deleted file mode 100644
index a183952..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/AbstractObservableMapTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.map;
-
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.observable.map.AbstractObservableMap;
-import org.eclipse.core.databinding.observable.map.MapDiff;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-
-/**
- * @since 3.2
- */
-public class AbstractObservableMapTest extends TestCase {
-	private AbstractObservableMapStub map;
-
-	protected void setUp() throws Exception {
-		RealmTester.setDefault(new CurrentRealm(true));
-		map = new AbstractObservableMapStub();
-	}
-	
-	protected void tearDown() throws Exception {
-		RealmTester.setDefault(null);
-	}
-	
-	public void testIsStaleRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				map.isStale();
-			}			
-		});
-	}
-	
-	public void testSetStaleRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				map.setStale(true);
-			}
-		});
-	}
-	
-	public void testFireStaleRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() { 
-			public void run() {
-				map.fireStale();
-			}
-		});
-	}
-	
-	public void testFireChangeRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				map.fireChange();
-			}
-		});
-	}
-	
-	public void testFireMapChangeRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				map.fireMapChange(null);
-			}
-		});
-	}
-	
-	static class AbstractObservableMapStub extends AbstractObservableMap {
-		public Set entrySet() {
-			return null;
-		}
-		
-		protected void fireChange() {
-			super.fireChange();
-		}
-		
-		protected void fireMapChange(MapDiff diff) {
-			super.fireMapChange(diff);
-		}
-		
-		protected void fireStale() {
-			super.fireStale();
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/BidiObservableMapTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/BidiObservableMapTest.java
deleted file mode 100644
index c9932aa..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/BidiObservableMapTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 233306)
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.map;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.databinding.observable.map.BidiObservableMap;
-import org.eclipse.core.databinding.observable.map.BidirectionalMap;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.map.WritableMap;
-import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.2
- * 
- */
-public class BidiObservableMapTest extends AbstractDefaultRealmTestCase {
-	private IObservableMap wrappedMap;
-	private BidiObservableMap bidiMap;
-	private Object key1;
-	private Object key2;
-	private Object value1;
-	private Object value2;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		wrappedMap = new WritableMap();
-		bidiMap = new BidiObservableMap(wrappedMap);
-		key1 = new Object();
-		key2 = new Object();
-		value1 = new Object();
-		value2 = new Object();
-	}
-
-	public void testConstructor_NullArgument() {
-		try {
-			new BidirectionalMap(null);
-			fail("Expected NullPointerException");
-		} catch (NullPointerException expected) {
-		}
-	}
-
-	public void withAndWithoutListeners(Runnable runnable) throws Exception {
-		// assuming setUp() beforehand
-
-		// without listeners
-		runnable.run();
-
-		tearDown();
-		setUp();
-
-		// with listeners
-		ChangeEventTracker.observe(wrappedMap);
-		runnable.run();
-
-		// assuming tearDown() afterward
-	}
-
-	public void testGetKeys_Empty() throws Exception {
-		withAndWithoutListeners(new Runnable() {
-			public void run() {
-				assertEquals(Collections.EMPTY_SET, bidiMap.getKeys(value1));
-			}
-		});
-	}
-
-	public void testGetKeys_NullKey() throws Exception {
-		withAndWithoutListeners(new Runnable() {
-			public void run() {
-				wrappedMap.put(null, value1);
-				assertEquals(Collections.singleton(null), bidiMap
-						.getKeys(value1));
-			}
-		});
-	}
-
-	public void testGetKeys_NullValue() throws Exception {
-		withAndWithoutListeners(new Runnable() {
-			public void run() {
-				wrappedMap.put(key1, null);
-				assertEquals(Collections.singleton(key1), bidiMap.getKeys(null));
-			}
-		});
-	}
-
-	public void testGetKeys_SinglePut() throws Exception {
-		withAndWithoutListeners(new Runnable() {
-			public void run() {
-				wrappedMap.put(key1, value1);
-				assertEquals(Collections.singleton(key1), bidiMap
-						.getKeys(value1));
-			}
-		});
-	}
-
-	public void testGetKeys_ReplaceValue() throws Exception {
-		withAndWithoutListeners(new Runnable() {
-			public void run() {
-				wrappedMap.put(key1, value1);
-				assertEquals(Collections.singleton(key1), bidiMap
-						.getKeys(value1));
-				assertEquals(Collections.EMPTY_SET, bidiMap.getKeys(value2));
-				wrappedMap.put(key1, value2);
-				assertEquals(Collections.EMPTY_SET, bidiMap.getKeys(value1));
-				assertEquals(Collections.singleton(key1), bidiMap
-						.getKeys(value2));
-			}
-		});
-	}
-
-	public void testGetKeys_MultipleKeysWithSameValue() throws Exception {
-		withAndWithoutListeners(new Runnable() {
-			public void run() {
-				wrappedMap.put(key1, value1);
-				wrappedMap.put(key2, value1);
-
-				Set expected = new HashSet();
-				expected.add(key1);
-				expected.add(key2);
-				assertEquals(expected, bidiMap.getKeys(value1));
-			}
-		});
-	}
-
-	public void testContainsValue_PutAndRemove() throws Exception {
-		withAndWithoutListeners(new Runnable() {
-			public void run() {
-				assertFalse(bidiMap.containsValue(value1));
-				wrappedMap.put(key1, value1);
-				assertTrue(bidiMap.containsValue(value1));
-				wrappedMap.put(key2, value1);
-				assertTrue(bidiMap.containsValue(value1));
-				wrappedMap.remove(key1);
-				assertTrue(bidiMap.containsValue(value1));
-				wrappedMap.remove(key2);
-				assertFalse(bidiMap.containsValue(value1));
-			}
-		});
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/CompositeMapTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/CompositeMapTest.java
deleted file mode 100644
index 488d86c..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/CompositeMapTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.map;
-
-import java.util.Collections;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.map.CompositeMap;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.jface.databinding.conformance.util.MapChangeEventTracker;
-import org.eclipse.jface.examples.databinding.model.SimpleCart;
-import org.eclipse.jface.examples.databinding.model.SimplePerson;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.2
- * 
- */
-public class CompositeMapTest extends AbstractDefaultRealmTestCase {
-
-	private WritableSet persons;
-	private CompositeMap composedMap;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		persons = new WritableSet();
-		IObservableMap first = BeansObservables.observeMap(persons,
-				SimplePerson.class, "cart");
-		composedMap = new CompositeMap(first, new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return BeansObservables.observeMap((IObservableSet) target,
-						SimpleCart.class, "numItems");
-			}
-		});
-	}
-
-	public void testAddToFirstMap() {
-		MapChangeEventTracker tracker = new MapChangeEventTracker();
-		composedMap.addMapChangeListener(tracker);
-		assertEquals(0, tracker.count);
-		SimplePerson newPerson = new SimplePerson("p1", "a1", "c1", "s1");
-		newPerson.getCart().setNumItems(42);
-		persons.add(newPerson);
-		assertEquals(1, tracker.count);
-		assertEquals(0, tracker.event.diff.getRemovedKeys().size());
-		assertEquals(0, tracker.event.diff.getChangedKeys().size());
-		assertEquals(Collections.singleton(newPerson), tracker.event.diff
-				.getAddedKeys());
-		assertEquals(new Integer(42), tracker.event.diff.getNewValue(newPerson));
-		assertEquals(new Integer(42), composedMap.get(newPerson));
-	}
-
-	public void testAddSharedToFirstMap() {
-		SimplePerson person1 = new SimplePerson("p1", "a1", "c1", "s1");
-		person1.getCart().setNumItems(42);
-		persons.add(person1);
-		MapChangeEventTracker tracker = new MapChangeEventTracker();
-		composedMap.addMapChangeListener(tracker);
-		assertEquals(0, tracker.count);
-		SimplePerson person2 = new SimplePerson("p1", "a1", "c1", "s1");
-		person2.setCart(person1.getCart());
-		persons.add(person2);
-		assertEquals(1, tracker.count);
-		assertEquals(0, tracker.event.diff.getRemovedKeys().size());
-		assertEquals(0, tracker.event.diff.getChangedKeys().size());
-		assertEquals(Collections.singleton(person2), tracker.event.diff
-				.getAddedKeys());
-		assertEquals(new Integer(42), tracker.event.diff.getNewValue(person2));
-		assertEquals(new Integer(42), composedMap.get(person2));
-		assertEquals(new Integer(42), composedMap.get(person1));
-	}
-
-	public void testRemoveFromFirstMap() {
-		MapChangeEventTracker tracker = new MapChangeEventTracker();
-		SimplePerson newPerson = new SimplePerson("p1", "a1", "c1", "s1");
-		newPerson.getCart().setNumItems(42);
-		persons.add(newPerson);
-		assertTrue("newPerson should be added", composedMap.containsKey(newPerson));
-		composedMap.addMapChangeListener(tracker);
-		assertEquals(0, tracker.count);
-		persons.remove(newPerson);
-		assertEquals(1, tracker.count);
-		assertEquals(0, tracker.event.diff.getAddedKeys().size());
-		assertEquals(0, tracker.event.diff.getChangedKeys().size());
-		assertEquals(Collections.singleton(newPerson), tracker.event.diff
-				.getRemovedKeys());
-		assertEquals(new Integer(42), tracker.event.diff.getOldValue(newPerson));
-		assertFalse("newPerson should be removed", composedMap.containsKey(newPerson));
-	}
-
-	public void testRemoveSharedFromFirstMap() {
-		SimplePerson person1 = new SimplePerson("p1", "a1", "c1", "s1");
-		person1.getCart().setNumItems(42);
-		persons.add(person1);
-		SimplePerson person2 = new SimplePerson("p1", "a1", "c1", "s1");
-		person2.setCart(person1.getCart());
-		persons.add(person2);
-		assertTrue("person2 should be added", composedMap.containsKey(person2));
-		MapChangeEventTracker tracker = new MapChangeEventTracker();
-		composedMap.addMapChangeListener(tracker);
-		assertEquals(0, tracker.count);
-		persons.remove(person2);
-		assertEquals(1, tracker.count);
-		assertEquals(0, tracker.event.diff.getAddedKeys().size());
-		assertEquals(0, tracker.event.diff.getChangedKeys().size());
-		assertEquals(Collections.singleton(person2), tracker.event.diff
-				.getRemovedKeys());
-		assertEquals(new Integer(42), tracker.event.diff.getOldValue(person2));
-		assertFalse("person2 should be removed", composedMap.containsKey(person2));
-		assertEquals(new Integer(42), composedMap.get(person1));
-	}
-
-	public void testChangeInFirstMap() {
-		SimplePerson person1 = new SimplePerson("p1", "a1", "c1", "s1");
-		person1.getCart().setNumItems(42);
-		persons.add(person1);
-		MapChangeEventTracker tracker = new MapChangeEventTracker();
-		composedMap.addMapChangeListener(tracker);
-		assertEquals(0, tracker.count);
-		person1.setCart(new SimpleCart());
-		assertEquals(1, tracker.count);
-		assertEquals(0, tracker.event.diff.getAddedKeys().size());
-		assertEquals(0, tracker.event.diff.getRemovedKeys().size());
-		assertEquals(Collections.singleton(person1), tracker.event.diff
-				.getChangedKeys());
-		assertEquals(new Integer(42), tracker.event.diff.getOldValue(person1));
-		assertEquals(new Integer(0), tracker.event.diff.getNewValue(person1));
-		assertEquals(new Integer(0), composedMap.get(person1));
-	}
-	
-	public void testChangeInFirstMapToShared() {
-		SimplePerson person0 = new SimplePerson("p0", "a0", "c0", "s0");
-		person0.getCart().setNumItems(13);
-		persons.add(person0);
-		SimplePerson person1 = new SimplePerson("p1", "a1", "c1", "s1");
-		person1.getCart().setNumItems(42);
-		persons.add(person1);
-		MapChangeEventTracker tracker = new MapChangeEventTracker();
-		composedMap.addMapChangeListener(tracker);
-		assertEquals(0, tracker.count);
-		person1.setCart(person0.getCart());
-		assertEquals(1, tracker.count);
-		assertEquals(0, tracker.event.diff.getAddedKeys().size());
-		assertEquals(0, tracker.event.diff.getRemovedKeys().size());
-		assertEquals(Collections.singleton(person1), tracker.event.diff
-				.getChangedKeys());
-		assertEquals(new Integer(42), tracker.event.diff.getOldValue(person1));
-		assertEquals(new Integer(13), tracker.event.diff.getNewValue(person1));
-		assertEquals(new Integer(13), composedMap.get(person1));
-	}
-	
-	public void testChangeInFirstMapFromShared() {
-		SimplePerson person0 = new SimplePerson("p0", "a0", "c0", "s0");
-		person0.getCart().setNumItems(13);
-		persons.add(person0);
-		SimplePerson person1 = new SimplePerson("p1", "a1", "c1", "s1");
-		person1.setCart(person0.getCart());
-		persons.add(person1);
-		MapChangeEventTracker tracker = new MapChangeEventTracker();
-		composedMap.addMapChangeListener(tracker);
-		assertEquals(0, tracker.count);
-		person1.setCart(new SimpleCart());
-		assertEquals(1, tracker.count);
-		assertEquals(0, tracker.event.diff.getAddedKeys().size());
-		assertEquals(0, tracker.event.diff.getRemovedKeys().size());
-		assertEquals(Collections.singleton(person1), tracker.event.diff
-				.getChangedKeys());
-		assertEquals(new Integer(13), tracker.event.diff.getOldValue(person1));
-		assertEquals(new Integer(0), tracker.event.diff.getNewValue(person1));
-		assertEquals(new Integer(0), composedMap.get(person1));
-	}
-	
-	public void testChangeInSecondMap() {
-		SimplePerson person0 = new SimplePerson("p0", "a0", "c0", "s0");
-		person0.getCart().setNumItems(13);
-		persons.add(person0);
-		MapChangeEventTracker tracker = new MapChangeEventTracker();
-		composedMap.addMapChangeListener(tracker);
-		assertEquals(0, tracker.count);
-		person0.getCart().setNumItems(42);
-		assertEquals(1, tracker.count);
-		assertEquals(0, tracker.event.diff.getAddedKeys().size());
-		assertEquals(0, tracker.event.diff.getRemovedKeys().size());
-		assertEquals(Collections.singleton(person0), tracker.event.diff
-				.getChangedKeys());
-		assertEquals(new Integer(13), tracker.event.diff.getOldValue(person0));
-		assertEquals(new Integer(42), tracker.event.diff.getNewValue(person0));
-		assertEquals(new Integer(42), composedMap.get(person0));
-	}
-	
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/ComputedObservableMapTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/ComputedObservableMapTest.java
deleted file mode 100644
index 2342337..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/ComputedObservableMapTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 247394)
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.map;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.map.ComputedObservableMap;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.core.tests.internal.databinding.beans.Bean;
-import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.2
- * 
- */
-public class ComputedObservableMapTest extends AbstractDefaultRealmTestCase {
-	private IObservableSet keySet;
-	private ComputedObservableMapStub map;
-	private String propertyName;
-	private Bean bean;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		keySet = new WritableSet();
-		map = new ComputedObservableMapStub(keySet);
-		propertyName = "value";
-		bean = new Bean("a");
-	}
-
-	public void testGet_ElementNotInKeySet() {
-		assertNull(map.get(bean));
-	}
-
-	public void testGet_ElementInKeySet() {
-		keySet.add(bean);
-		assertEquals("a", map.get(bean));
-	}
-
-	public void testPut_ElementNotInKeySet() {
-		assertNull(map.put(bean, "b"));
-		assertEquals("a", bean.getValue());
-	}
-
-	public void testPut_ElementInKeySet() {
-		keySet.add(bean);
-		assertEquals("a", map.put(bean, "b"));
-		assertEquals("b", map.get(bean));
-	}
-
-	public void testAddToKeySet_BeforeFirstListenerAdded_DoesNotAddListenerToKey() {
-		assertFalse(bean.hasListeners(propertyName));
-		keySet.add(bean);
-		assertFalse(bean.hasListeners(propertyName));
-	}
-
-	public void testAddToKeySet_AfterFirstListenerAdded_AddsListenerToKey() {
-		ChangeEventTracker.observe(map);
-		assertFalse(bean.hasListeners(propertyName));
-		keySet.add(bean);
-		assertTrue(bean.hasListeners(propertyName));
-	}
-
-	public void testRemoveFromKeySet_RemovesListenersFromKey() {
-		ChangeEventTracker.observe(map);
-		keySet.add(bean);
-		assertTrue(bean.hasListeners(propertyName));
-		keySet.remove(bean);
-		assertFalse(bean.hasListeners(propertyName));
-	}
-
-	public void testRemoveLastListener_DoNotDiscardKeySet() {
-		IChangeListener listener = new IChangeListener() {
-			public void handleChange(ChangeEvent event) {
-				// do nothing
-			}
-		};
-		map.addChangeListener(listener); // first listener added
-		map.removeChangeListener(listener); // last listener removed
-		keySet.add(bean);
-		assertEquals(1, map.size());
-	}
-
-	public void testDispose_RemoveListenersFromKeySetElements() {
-		ChangeEventTracker.observe(map);
-		keySet.add(bean);
-		assertTrue(bean.hasListeners(propertyName));
-		map.dispose();
-		assertFalse(bean.hasListeners(propertyName));
-	}
-
-	static class ComputedObservableMapStub extends ComputedObservableMap {
-		private PropertyChangeListener listener = new PropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent evt) {
-				fireSingleChange(evt.getSource(), evt.getOldValue(), evt
-						.getNewValue());
-			}
-		};
-
-		ComputedObservableMapStub(IObservableSet keySet) {
-			super(keySet);
-		}
-
-		protected Object doGet(Object key) {
-			return ((Bean) key).getValue();
-		}
-
-		protected Object doPut(Object key, Object value) {
-			Object result = doGet(key);
-			((Bean) key).setValue((String) value);
-			return result;
-		}
-
-		protected void hookListener(Object addedKey) {
-			((Bean) addedKey).addPropertyChangeListener(listener);
-		}
-
-		protected void unhookListener(Object removedKey) {
-			((Bean) removedKey).removePropertyChangeListener(listener);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/ObservableMapTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/ObservableMapTest.java
deleted file mode 100644
index d69e786..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/ObservableMapTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.map;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.map.MapChangeEvent;
-import org.eclipse.core.databinding.observable.map.MapDiff;
-import org.eclipse.core.databinding.observable.map.ObservableMap;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-
-/**
- * @since 3.2
- * 
- */
-public class ObservableMapTest extends TestCase {
-	ObservableMapStub map;
-
-	protected void setUp() throws Exception {
-		RealmTester.setDefault(new CurrentRealm(true));
-		map = new ObservableMapStub(new HashMap());
-	}
-
-	protected void tearDown() throws Exception {
-		RealmTester.setDefault(null);
-	}
-
-	public void testDisposeMapChangeListeners() throws Exception {
-		class MapChangeListener implements IMapChangeListener {
-			int count;
-
-			public void handleMapChange(MapChangeEvent event) {
-				count++;
-			}
-		}
-
-		MapChangeListener listener = new MapChangeListener();
-		map.addMapChangeListener(listener);
-
-		assertEquals(0, listener.count);
-		map.fireMapChange(null);
-		assertEquals(1, listener.count);
-
-		map.dispose();
-		try {
-			map.fireMapChange(null);
-		} catch (Exception e) {
-			// do nothing
-		}
-
-		assertEquals("listener should not have been notified", 1,
-				listener.count);
-	}
-
-	public void testIsStaleRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				map.isStale();
-			}
-		});
-	}
-
-	public void testSetStaleRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				map.setStale(true);
-			}
-		});
-	}
-
-	public void testFireMapChangeRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				map.fireMapChange(null);
-			}
-		});
-	}
-
-	static class ObservableMapStub extends ObservableMap {
-		/**
-		 * @param wrappedMap
-		 */
-		public ObservableMapStub(Map wrappedMap) {
-			super(wrappedMap);
-		}
-
-		protected void fireMapChange(MapDiff diff) {
-			super.fireMapChange(diff);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/WritableMapTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/WritableMapTest.java
deleted file mode 100644
index 9190e25..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/map/WritableMapTest.java
+++ /dev/null
@@ -1,302 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bugs 184830, 233306
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.map;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.map.MapChangeEvent;
-import org.eclipse.core.databinding.observable.map.MapDiff;
-import org.eclipse.core.databinding.observable.map.WritableMap;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.MapChangeEventTracker;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-
-/**
- * @since 3.2
- * 
- */
-public class WritableMapTest extends TestCase {
-	protected void setUp() throws Exception {
-		RealmTester.setDefault(new CurrentRealm(true));
-	}
-
-	protected void tearDown() throws Exception {
-		RealmTester.setDefault(null);
-	}
-
-	public void testPutRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				WritableMap map = new WritableMap();
-				map.put("", "");
-			}
-		});
-	}
-
-	public void testRemoveRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				WritableMap map = new WritableMap();
-				CurrentRealm realm = (CurrentRealm) Realm.getDefault();
-				boolean current = realm.isCurrent();
-				realm.setCurrent(true);
-				map.put("", "");
-				realm.setCurrent(current);
-
-				map.remove("");
-			}
-		});
-	}
-
-	public void testClearRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				WritableMap map = new WritableMap();
-				map.clear();
-			}
-		});
-	}
-
-	public void testPutAllRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				WritableMap map = new WritableMap();
-				map.putAll(Collections.EMPTY_MAP);
-			}
-		});
-	}
-	
-	public void testPutWithExistingKeyMapChangeEvent() throws Exception {
-		WritableMap map = new WritableMap();
-		String key = "key";
-		String value = "value";
-		map.put(key, value);
-		
-		MapChangeEventTracker listener = new MapChangeEventTracker();
-		map.addMapChangeListener(listener);
-		
-		assertEquals(0, listener.count);
-		
-		String newValue = "new value";
-		map.put(key, newValue);
-		
-		assertEquals(1, listener.count);
-		MapChangeEvent event = listener.event;
-		
-		
-		Set changedKeys = event.diff.getChangedKeys();
-		assertEquals(1, changedKeys.size());
-		assertTrue(changedKeys.contains(key));
-		assertEquals(value, event.diff.getOldValue(key));
-		assertEquals(newValue, event.diff.getNewValue(key));
-	}
-
-	public void testPutSameValue_NoMapChangeEvent() {
-		WritableMap map = new WritableMap();
-		Object key = new Object();
-		Object value = "value";
-		map.put(key, value);
-
-		MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
-
-		assertEquals(0, tracker.count);
-
-		Object equalValue = new String("value");
-		map.put(key, equalValue);
-
-		assertEquals(0, tracker.count);
-		
-	}
-
-	public void testPutNullKey_SingleAdditionChangeEvent() {
-		WritableMap map = new WritableMap();
-		MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
-
-		assertEquals(0, tracker.count);
-
-		Object key = null;
-		Object value = new Object();
-		map.put(key, value);
-
-		assertEquals(1, tracker.count);
-		MapDiff diff = tracker.event.diff;
-		assertEquals(Collections.singleton(key), diff.getAddedKeys());
-		assertEquals(Collections.EMPTY_SET, diff.getChangedKeys());
-		assertEquals(Collections.EMPTY_SET, diff.getRemovedKeys());
-		assertEquals(value, diff.getNewValue(key));
-	}
-
-	public void testRemoveNullKey_SingleRemovalChangeEvent() {
-		WritableMap map = new WritableMap();
-		Object key = null;
-		Object value = new Object();
-		map.put(key, value);
-
-		MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
-
-		map.remove(key);
-
-		assertEquals(1, tracker.count);
-		MapDiff diff = tracker.event.diff;
-		assertEquals(Collections.EMPTY_SET, diff.getAddedKeys());
-		assertEquals(Collections.EMPTY_SET, diff.getChangedKeys());
-		assertEquals(Collections.singleton(key), diff.getRemovedKeys());
-		assertEquals(value, diff.getOldValue(key));
-	}
-
-	public void testPutNullValue_SingleAdditionChangeEvent() {
-		WritableMap map = new WritableMap();
-
-		MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
-
-		assertEquals(0, tracker.count);
-
-		Object key = new Object();
-		Object value = null;
-		map.put(key, value);
-
-		assertEquals(1, tracker.count);
-		MapDiff diff = tracker.event.diff;
-		assertEquals(Collections.singleton(key), diff.getAddedKeys());
-		assertEquals(Collections.EMPTY_SET, diff.getChangedKeys());
-		assertEquals(Collections.EMPTY_SET, diff.getRemovedKeys());
-		assertEquals(value, diff.getNewValue(key));
-	}
-
-	public void testPutNullOverNonNullValue_SingleChangeEvent() {
-		WritableMap map = new WritableMap();
-		Object key = new Object();
-		Object oldValue = new Object();
-		map.put(key, oldValue);
-
-		MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
-
-		Object newValue = null;
-		map.put(key, newValue);
-
-		assertEquals(1, tracker.count);
-		MapDiff diff = tracker.event.diff;
-		assertEquals(Collections.EMPTY_SET, diff.getAddedKeys());
-		assertEquals(Collections.singleton(key), diff.getChangedKeys());
-		assertEquals(Collections.EMPTY_SET, diff.getRemovedKeys());
-		assertEquals(oldValue, diff.getOldValue(key));
-		assertEquals(newValue, diff.getNewValue(key));
-	}
-
-	public void testPutNonNullOverNullValue_SingleChangeEvent() {
-		WritableMap map = new WritableMap();
-		Object key = new Object();
-		Object oldValue = null;
-		map.put(key, oldValue);
-
-		MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
-
-		Object newValue = new Object();
-		map.put(key, newValue);
-
-		assertEquals(1, tracker.count);
-		MapDiff diff = tracker.event.diff;
-		assertEquals(Collections.EMPTY_SET, diff.getAddedKeys());
-		assertEquals(Collections.singleton(key), diff.getChangedKeys());
-		assertEquals(Collections.EMPTY_SET, diff.getRemovedKeys());
-		assertEquals(oldValue, diff.getOldValue(key));
-		assertEquals(newValue, diff.getNewValue(key));
-	}
-
-	public void testRemoveNullValue_SingleRemovalChangeEvent() {
-		WritableMap map = new WritableMap();
-		Object key = new Object();
-		Object value = null;
-		map.put(key, value);
-
-		MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
-
-		map.remove(key);
-
-		assertEquals(1, tracker.count);
-		MapDiff diff = tracker.event.diff;
-		assertEquals(Collections.EMPTY_SET, diff.getAddedKeys());
-		assertEquals(Collections.EMPTY_SET, diff.getChangedKeys());
-		assertEquals(Collections.singleton(key), diff.getRemovedKeys());
-		assertEquals(value, diff.getOldValue(key));
-	}
-
-	public void testPutAllNullValue_SingleAdditionChangeEvent() {
-		WritableMap map = new WritableMap();
-
-		MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
-
-		Object key = new Object();
-		Object value = null;
-		Map other = new HashMap();
-		other.put(key, value);
-		map.putAll(other);
-
-		assertEquals(1, tracker.count);
-		MapDiff diff = tracker.event.diff;
-		assertEquals(Collections.singleton(key), diff.getAddedKeys());
-		assertEquals(Collections.EMPTY_SET, diff.getChangedKeys());
-		assertEquals(Collections.EMPTY_SET, diff.getRemovedKeys());
-		assertEquals(value, diff.getNewValue(key));
-	}
-
-	public void testPutAllNullValueToNonNullValue_SingleChangeEvent() {
-		WritableMap map = new WritableMap();
-		Object key = new Object();
-		Object oldValue = null;
-		map.put(key, oldValue);
-
-		MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
-
-		Object newValue = new Object();
-		Map other = new HashMap();
-		other.put(key, newValue);
-		map.putAll(other);
-
-		assertEquals(1, tracker.count);
-		MapDiff diff = tracker.event.diff;
-		assertEquals(Collections.EMPTY_SET, diff.getAddedKeys());
-		assertEquals(Collections.singleton(key), diff.getChangedKeys());
-		assertEquals(Collections.EMPTY_SET, diff.getRemovedKeys());
-		assertEquals(oldValue, diff.getOldValue(key));
-		assertEquals(newValue, diff.getNewValue(key));
-	}
-
-	public void testPutAllNonNullValueToNullValue_SingleChangeEvent() {
-		WritableMap map = new WritableMap();
-		Object key = new Object();
-		Object oldValue = new Object();
-		map.put(key, oldValue);
-
-		MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
-
-		Object newValue = null;
-		Map other = new HashMap();
-		other.put(key, newValue);
-		map.putAll(other);
-
-		assertEquals(1, tracker.count);
-		MapDiff diff = tracker.event.diff;
-		assertEquals(Collections.EMPTY_SET, diff.getAddedKeys());
-		assertEquals(Collections.singleton(key), diff.getChangedKeys());
-		assertEquals(Collections.EMPTY_SET, diff.getRemovedKeys());
-		assertEquals(oldValue, diff.getOldValue(key));
-		assertEquals(newValue, diff.getNewValue(key));
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/AbstractObservableSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/AbstractObservableSetTest.java
deleted file mode 100644
index 4992c1b..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/AbstractObservableSetTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.set;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.AbstractObservableSet;
-import org.eclipse.core.databinding.observable.set.SetDiff;
-import org.eclipse.jface.databinding.conformance.ObservableCollectionContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-
-/**
- */
-public class AbstractObservableSetTest extends TestCase {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(AbstractObservableSetTest.class.getName());
-		suite.addTest(ObservableCollectionContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	private static class Delegate extends
-			AbstractObservableCollectionContractDelegate {
-		public void change(IObservable observable) {
-			((AbstractObservableSetStub) observable).fireSetChange(Diffs.createSetDiff(new HashSet(), new HashSet()));
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return Integer.toString(collection.size());
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return String.class;
-		}
-
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			AbstractObservableSetStub set = new AbstractObservableSetStub(realm, String.class);
-			
-			for (int i = 0; i < elementCount; i++) {
-				set.getWrappedSet().add(Integer.toString(i));
-			}
-			
-			return set;
-		}
-	}
-	
-	private static class AbstractObservableSetStub extends AbstractObservableSet {
-		private Object type;
-		private HashSet set;
-		
-		private AbstractObservableSetStub(Realm realm, Object type) {
-			super (realm);
-			set = new HashSet();
-			this.type = type;
-		}
-		
-		protected Set getWrappedSet() {
-			return set;
-		}
-
-		public Object getElementType() {
-			return type;
-		}		
-		
-		protected void fireSetChange(SetDiff diff) {
-			super.fireSetChange(diff);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/ComputedSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/ComputedSetTest.java
deleted file mode 100644
index ead335c..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/ComputedSetTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237703)
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.set;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.set.ComputedSet;
-import org.eclipse.jface.databinding.conformance.ObservableCollectionContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.SetChangeEventTracker;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-public class ComputedSetTest extends AbstractDefaultRealmTestCase {
-	ComputedSetStub set;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		set = new ComputedSetStub();
-		set.size(); // Force set to compute
-	}
-
-	public void testDependency_Staleness() {
-		assertFalse(set.isStale());
-		set.dependency.fireStale();
-		assertTrue(set.isStale());
-	}
-
-	public void testDependency_FiresSetChange() {
-		assertEquals(set.nextComputation, set);
-
-		Object element = new Object();
-		set.nextComputation.add(element);
-
-		set.dependency.fireChange();
-
-		assertEquals(Collections.singleton(element), set);
-	}
-
-	public void testDependency_NoStaleEventIfAlreadyDirty() {
-		set.dependency.fireChange();
-		set.addStaleListener(new IStaleListener() {
-			public void handleStale(StaleEvent staleEvent) {
-				fail("Should not fire stale when set is already dirty");
-			}
-		});
-		set.dependency.fireStale();
-	}
-
-	public void testDependency_SetChangeEventFiresOnlyWhenNotDirty() {
-		SetChangeEventTracker tracker = SetChangeEventTracker.observe(set);
-
-		set.dependency.fireChange();
-		assertEquals(
-				"ComputedSet should fire set change event when its dependency changes",
-				1, tracker.count);
-
-		set.dependency.fireChange();
-		assertEquals(
-				"ComputedSet should not fire set change events when dirty",
-				1, tracker.count);
-
-		set.size(); // Force set to recompute.
-		set.dependency.fireChange();
-		assertEquals(
-				"ComputedSet should fire set change event when its dependency changes",
-				2, tracker.count);
-	}
-
-	static class ComputedSetStub extends ComputedSet {
-		Set nextComputation = new HashSet();
-		ObservableStub dependency;
-
-		ComputedSetStub() {
-			this(Realm.getDefault());
-		}
-
-		ComputedSetStub(Realm realm) {
-			super(realm);
-			dependency = new ObservableStub(realm);
-		}
-
-		protected Set calculate() {
-			ObservableTracker.getterCalled(dependency);
-			return new HashSet(nextComputation);
-		}
-	}
-
-	static class ObservableStub extends AbstractObservable {
-		public ObservableStub(Realm realm) {
-			super(realm);
-		}
-
-		boolean stale;
-
-		public boolean isStale() {
-			return stale;
-		}
-
-		protected void fireStale() {
-			stale = true;
-			super.fireStale();
-		}
-
-		protected void fireChange() {
-			super.fireChange();
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ComputedSetTest.class.getName());
-		suite.addTestSuite(ComputedSetTest.class);
-		suite.addTest(ObservableCollectionContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableCollectionContractDelegate {
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			final ComputedSetStub set = new ComputedSetStub(realm);
-			for (int i = 0; i < elementCount; i++)
-				set.nextComputation.add(createElement(set));
-			set.size(); // force set to compute
-			return set;
-		}
-
-		public void change(IObservable observable) {
-			ComputedSetStub set = (ComputedSetStub) observable;
-			set.nextComputation.add(new Object());
-			set.dependency.fireChange();
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object();
-		}
-
-		public void setStale(IObservable observable, boolean stale) {
-			if (stale)
-				((ComputedSetStub) observable).dependency.fireStale();
-			else {
-				ComputedSetStub computedSet = (ComputedSetStub) observable;
-				computedSet.dependency.stale = false;
-				computedSet.dependency.fireChange();
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/DecoratingObservableSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/DecoratingObservableSetTest.java
deleted file mode 100644
index 7c7ae29..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/DecoratingObservableSetTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 208332)
- *     Matthew Hall - bug 213145
- *         (through ProxyObservableSetTest.java)
- *     Matthew Hall - bug 237718
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.set;
-
-import java.util.Collections;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.DecoratingObservableSet;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.jface.databinding.conformance.MutableObservableCollectionContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-
-/**
- * @since 3.2
- * 
- */
-public class DecoratingObservableSetTest {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(DecoratingObservableSetTest.class
-				.getName());
-		suite.addTest(MutableObservableCollectionContractTest
-				.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableCollectionContractDelegate {
-		private Object elementType = Object.class;
-
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			IObservableSet wrappedSet = new WritableSet(realm,
-					Collections.EMPTY_SET, elementType);
-			for (int i = 0; i < elementCount; i++)
-				wrappedSet.add(createElement(wrappedSet));
-			return new DecoratingObservableSetStub(wrappedSet);
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object();
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return elementType;
-		}
-
-		public void change(IObservable observable) {
-			DecoratingObservableSetStub set = (DecoratingObservableSetStub) observable;
-			set.wrappedSet.add(createElement(set));
-		}
-	}
-
-	static class DecoratingObservableSetStub extends DecoratingObservableSet {
-		IObservableSet wrappedSet;
-
-		DecoratingObservableSetStub(IObservableSet wrappedSet) {
-			super(wrappedSet, true);
-			this.wrappedSet = wrappedSet;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/ObservableSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/ObservableSetTest.java
deleted file mode 100755
index 7e0752f..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/ObservableSetTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.set;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ObservableSet;
-import org.eclipse.core.databinding.observable.set.SetDiff;
-import org.eclipse.jface.databinding.conformance.ObservableCollectionContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-
-/**
- * @since 1.1
- */
-public class ObservableSetTest extends TestCase {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ObservableSetTest.class.getName());
-		suite.addTest(ObservableCollectionContractTest.suite(new Delegate()));
-		return suite;
-	}
-	
-	private static class Delegate extends AbstractObservableCollectionContractDelegate {	
-		private Delegate() {	
-		}
-		
-		public void change(IObservable observable) {
-			((ObservableSetStub) observable).fireSetChange(Diffs.createSetDiff(new HashSet(), new HashSet()));
-		}
-		
-		public Object createElement(IObservableCollection collection) {
-			return Integer.toString(collection.size());
-		}
-	
-		public Object getElementType(IObservableCollection collection) {
-			return String.class;
-		}
-
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			IObservableSet set = new ObservableSetStub(realm, new HashSet(), String.class);
-			
-			for (int i = 0; i < elementCount; i++) {
-				set.add(Integer.toString(i));
-			}
-			
-			return set;
-		}
-	}
-
-	private static class ObservableSetStub extends ObservableSet {
-		/**
-		 * @param wrappedSet
-		 * @param elementType
-		 */
-		protected ObservableSetStub(Realm realm, Set wrappedSet, Object elementType) {
-			super(realm, wrappedSet, elementType);
-		}
-
-		public void fireSetChange(SetDiff diff) {
-			super.fireSetChange(diff);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/UnionSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/UnionSetTest.java
deleted file mode 100755
index ad69960..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/UnionSetTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.set;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.UnionSet;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.jface.databinding.conformance.ObservableCollectionContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-
-/**
- */
-public class UnionSetTest extends TestCase {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(UnionSetTest.class.getName());
-		suite.addTest(ObservableCollectionContractTest.suite(new Delegate()));
-		return suite;
-	}
-	
-	private static class Delegate extends
-			AbstractObservableCollectionContractDelegate {
-		private IObservableSet[] sets;
-
-		private Delegate() {
-		}
-
-		public void setUp() {
-			
-			super.setUp();
-		}
-
-		public void tearDown() {
-			sets = null;
-
-			super.tearDown();
-		}
-
-		public void change(IObservable observable) {
-			sets[0].add(Integer.toString(sets[0].size()));
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return Integer.toString(collection.size());
-		}
-
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {			
-			sets = new IObservableSet[]{new WritableSet(realm), new WritableSet(realm)};
-			
-			IObservableSet set = new UnionSet(sets);
-
-			for (int i = 0; i < elementCount; i++) {
-				sets[0].add(Integer.toString(i));
-			}
-
-			return set;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/WritableSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/WritableSetTest.java
deleted file mode 100644
index f23f315..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/set/WritableSetTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bugs 221351, 213145
- ******************************************************************************/
-package org.eclipse.core.tests.databinding.observable.set;
-
-import java.util.Collections;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.jface.databinding.conformance.MutableObservableSetContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- */
-public class WritableSetTest extends AbstractDefaultRealmTestCase {
-	public void testWithElementType() throws Exception {
-		Object elementType = String.class;
-		WritableSet set = WritableSet.withElementType(elementType);
-		assertNotNull(set);
-		assertEquals(Realm.getDefault(), set.getRealm());
-		assertEquals(elementType, set.getElementType());
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(WritableSetTest.class.getName());
-		suite.addTestSuite(WritableSetTest.class);
-		suite.addTest(MutableObservableSetContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	private static class Delegate extends
-			AbstractObservableCollectionContractDelegate {
-		private Delegate() {
-			super();
-		}
-
-		public void change(IObservable observable) {
-			IObservableSet set = (IObservableSet) observable;
-			set.add(createElement(set));
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object();
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return String.class;
-		}
-
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			IObservableSet set = new WritableSet(realm, Collections.EMPTY_SET,
-					String.class);
-			for (int i = 0; i < elementCount; i++) {
-				set.add(createElement(set));
-			}
-
-			return set;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/value/AbstractObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/value/AbstractObservableValueTest.java
deleted file mode 100755
index 66fb359..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/value/AbstractObservableValueTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.value;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.observable.value.ValueDiff;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-
-/**
- * @since 3.2
- */
-public class AbstractObservableValueTest extends TestCase {
-	public void testSetValueRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				ObservableValueStub observable = new ObservableValueStub();
-				try {
-					observable.setValue(null);
-				} catch (UnsupportedOperationException e) {
-					// do nothing
-				}
-			}
-		});
-	}
-
-	public void testSetValueInvokesDoSetValue() throws Exception {
-		class ValueStub extends ObservableValueStub {
-			int doSetValue;
-
-			ValueStub(Realm realm) {
-				super(realm);
-			}
-
-			protected void doSetValue(Object value) {
-				doSetValue++;
-			}
-		}
-
-		Realm realm = new CurrentRealm(true);
-		ValueStub stub = new ValueStub(realm);
-		assertEquals(0, stub.doSetValue);
-		stub.setValue(new Object());
-		assertEquals("doSetValue should have been invoked", 1, stub.doSetValue);
-	}
-
-	public void testFireValueChangeRealmChecks() throws Exception {
-		RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				ObservableValueStub observable = new ObservableValueStub();
-				observable.fireValueChange(null);
-			}
-		});
-	}
-
-	private static class ObservableValueStub extends AbstractObservableValue {
-		ObservableValueStub() {
-			super(Realm.getDefault());
-		}
-
-		private ObservableValueStub(Realm realm) {
-			super(realm);
-		}
-
-		protected Object doGetValue() {
-			return null;
-		}
-
-		public Object getValueType() {
-			return null;
-		}
-
-		protected void fireValueChange(ValueDiff diff) {
-			super.fireValueChange(diff);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/value/AbstractVetoableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/value/AbstractVetoableValueTest.java
deleted file mode 100755
index 2507db4..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/value/AbstractVetoableValueTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.value;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.AbstractVetoableValue;
-import org.eclipse.core.databinding.observable.value.ValueDiff;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-
-/**
- * @since 3.2
- */
-public class AbstractVetoableValueTest extends TestCase {
-    public void testSetValueInvokesDoSetApprovedValue() throws Exception {
-        class VetoableValue extends VetoableValueStub {
-            int count;
-            Object value;
-            
-            VetoableValue(Realm realm) {
-                super(realm);
-            }
-            
-            protected void doSetApprovedValue(Object value) {
-                count++;
-                this.value = value;
-            }      
-        }
-        
-        Realm realm = new CurrentRealm(true);
-        VetoableValue vetoableValue = new VetoableValue(realm);
-        assertEquals(0, vetoableValue.count);
-        assertEquals(null, vetoableValue.value);
-        
-        Object value = new Object();
-        vetoableValue.setValue(value);
-        assertEquals(1, vetoableValue.count);
-        assertEquals(value, vetoableValue.value);
-    }
-    
-    public void testFireValueChangeRealmChecks() throws Exception {
-    	RealmTester.exerciseCurrent(new Runnable() {
-			public void run() {
-				VetoableValueStub observable = new VetoableValueStub();
-				observable.fireValueChanging(null);
-			}
-    	});
-	}
-    
-    private static class VetoableValueStub extends AbstractVetoableValue {
-    	VetoableValueStub() {
-    		this(Realm.getDefault());
-    	}
-    	
-    	VetoableValueStub(Realm realm) {
-    		super(realm);
-    	}
-    	
-		protected void doSetApprovedValue(Object value) {
-		}
-
-		protected Object doGetValue() {
-			return null;
-		}
-
-
-		public Object getValueType() {
-			return null;
-		}    	
-		
-		protected boolean fireValueChanging(ValueDiff diff) {
-			return super.fireValueChanging(diff);
-		}
-    }
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/value/ComputedValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/value/ComputedValueTest.java
deleted file mode 100755
index 8d90011..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/value/ComputedValueTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *     Brad Reynolds - bug 164653
- *******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.value;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.value.ComputedValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 1.0
- * 
- */
-public class ComputedValueTest extends AbstractDefaultRealmTestCase {
-    public void testValueType() throws Exception {
-        ComputedValue cv = new ComputedValue(Integer.TYPE) {
-            protected Object calculate() {
-                return new Integer(42);
-            }
-        };
-        assertEquals("value type should be the type that was set", Integer.TYPE, cv.getValueType());
-
-        cv = new ComputedValue() {
-            protected Object calculate() {
-                // TODO Auto-generated method stub
-                return null;
-            }
-        };
-
-        assertNull(cv.getValueType());
-    }
-
-    public void test_getValue() throws Exception {
-        ComputedValue cv = new ComputedValue() {
-            protected Object calculate() {
-                return new Integer(42);
-            }
-        };
-        assertEquals("Calculated value should be 42", new Integer(42), cv.getValue());
-    }
-
-    public void testDependencyValueChange() throws Exception {
-        final WritableValue value = new WritableValue(new Integer(42), Integer.TYPE);
-
-        ComputedValue cv = new ComputedValue() {
-            protected Object calculate() {
-                return value.getValue();
-            }
-        };
-
-        assertEquals("calculated value should have been that of the writable value", value.getValue(), cv.getValue());
-
-        value.setValue(new Integer(44));
-
-        assertEquals("calculated value should have been that of the writable value", value.getValue(), cv.getValue());
-    }
-
-    private static class WritableValueExt extends WritableValue {
-        public WritableValueExt(Object valueType, Object initialValue) {
-            super(initialValue, valueType);
-        }
-
-        public boolean hasListeners() {
-            return super.hasListeners();
-        }
-    }
-
-    public void testHookAndUnhookDependantObservables() throws Exception {
-        final List values = new ArrayList();
-
-        ComputedValue cv = new ComputedValue() {
-            protected Object calculate() {
-                int sum = 0;
-                for (Iterator it = values.iterator(); it.hasNext();) {
-                    WritableValue value = (WritableValue) it.next();
-                    sum += ((Integer) value.getValue()).intValue();
-
-                }
-
-                return new Integer(sum);
-            }
-        };
-
-        WritableValueExt value1 = new WritableValueExt(Integer.TYPE, new Integer(1));
-        WritableValueExt value2 = new WritableValueExt(Integer.TYPE, new Integer(1));
-        values.add(value1);
-        values.add(value2);
-        
-        assertFalse(value1.hasListeners());
-        assertFalse(value2.hasListeners());
-        cv.getValue();
-        assertTrue(value1.hasListeners());
-        assertTrue(value2.hasListeners());
-        
-        //force the computed value to be stale
-        value2.setValue(new Integer(2));
-        //remove value2 from the values that are used to compute the value
-        values.remove(value2);
-        
-        //force the value to be computed
-        cv.getValue();
-        assertEquals(new Integer(1), cv.getValue());
-        assertTrue(value1.hasListeners());
-        assertFalse("because value2 is not a part of the calculation the listeners should have been removed", value2.hasListeners());
-    }
-    
-    public void testSetValueUnsupportedOperationException() throws Exception {
-        ComputedValue cv = new ComputedValue() {
-            protected Object calculate() {
-                return null;
-            }
-        };
-        
-        try {
-            cv.setValue(new Object());
-            fail("exception should have been thrown");
-        } catch (UnsupportedOperationException e) {
-        }
-    }
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/value/DecoratingObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/value/DecoratingObservableValueTest.java
deleted file mode 100644
index 6ea9056..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/value/DecoratingObservableValueTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 237718)
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.value;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.DecoratingObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-
-/**
- * @since 3.2
- * 
- */
-public class DecoratingObservableValueTest {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(DecoratingObservableValueTest.class
-				.getName());
-		suite.addTest(MutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableValueContractDelegate {
-		private Object valueType = Object.class;
-
-		public IObservableValue createObservableValue(Realm realm) {
-			IObservableValue decorated = new WritableValue(realm, new Object(),
-					valueType);
-			return new DecoratingObservableValueStub(decorated);
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return valueType;
-		}
-
-		public void change(IObservable observable) {
-			((DecoratingObservableValueStub) observable).decorated
-					.setValue(new Object());
-		}
-	}
-
-	static class DecoratingObservableValueStub extends
-			DecoratingObservableValue {
-		IObservableValue decorated;
-
-		DecoratingObservableValueStub(IObservableValue decorated) {
-			super(decorated, true);
-			this.decorated = decorated;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/value/WritableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/value/WritableValueTest.java
deleted file mode 100755
index 8437e74..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/observable/value/WritableValueTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - bug 158687
- *     Brad Reynolds - bug 164653
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.observable.value;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 3.2
- */
-public class WritableValueTest extends AbstractDefaultRealmTestCase {
-	/**
-	 * All constructors delegate to the 3 arg constructor.
-	 * 
-	 * @throws Exception
-	 */
-	public void testConstructor() throws Exception {
-		WritableValue value = new WritableValue(SWTObservables.getRealm(Display
-				.getDefault()));
-		assertNull(value.getValue());
-		assertNull(value.getValueType());
-	}
-
-	public void testWithValueType() throws Exception {
-		Object elementType = String.class;
-		WritableValue value = WritableValue.withValueType(elementType);
-		assertNotNull(value);
-		assertEquals(Realm.getDefault(), value.getRealm());
-		assertEquals(elementType, value.getValueType());
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(WritableValueTest.class.getName());
-		suite.addTestSuite(WritableValueTest.class);
-		suite.addTest(MutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		public IObservableValue createObservableValue(Realm realm) {
-			return new WritableValue(realm, "", String.class);
-		}
-
-		public void change(IObservable observable) {
-			IObservableValue observableValue = (IObservableValue) observable;
-			observableValue.setValue(createValue(observableValue));
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return String.class;
-		}
-		
-		public Object createValue(IObservableValue observable) {
-			return observable.getValue() + "a";
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/util/PolicyTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/util/PolicyTest.java
deleted file mode 100644
index ff8d747..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/util/PolicyTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.eclipse.core.tests.databinding.util;
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.util.ILogger;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * @since 3.2
- * 
- */
-public class PolicyTest extends TestCase {
-
-	public void testConstructor() {
-		// cover the constructor too
-		new Policy();
-	}
-
-	public void testDummyLog() {
-		ILogger oldLog = Policy.getLog();
-		PrintStream oldErr = System.err;
-		try {
-			// this should reset to using dummy log
-			Policy.setLog(null);
-			ByteArrayOutputStream os = new ByteArrayOutputStream();
-			PrintStream ps = new PrintStream(os);
-			System.setErr(ps);
-			IStatus status = new Status(IStatus.CANCEL, "somePluginId",
-					"someMessage", new RuntimeException());
-			Policy.getLog().log(status);
-			ps.flush();
-			String message = new String(os.toByteArray());
-			System.out.println("testDummyLog message: " + message);
-			if (true) {
-				return;
-			}
-			assertTrue("expecting severity", message.indexOf(IStatus.CANCEL
-					+ "") != -1);
-			assertTrue("expecting plugin id",
-					message.indexOf("somePluginId") != -1);
-			assertTrue("expecting message",
-					message.indexOf("someMessage") != -1);
-			assertTrue("expecting RuntimeException", message
-					.indexOf("RuntimeException") != -1);
-		} finally {
-			Policy.setLog(oldLog);
-			System.setErr(oldErr);
-		}
-	}
-
-	public void testCustomLog() {
-		ILogger oldLog = Policy.getLog();
-		try {
-			final IStatus[] statusHolder = new IStatus[1];
-			Policy.setLog(new ILogger() {
-				public void log(IStatus status) {
-					statusHolder[0] = status;
-				}
-			});
-			IStatus status = new Status(IStatus.CANCEL, "somePluginId",
-					"someMessage", new RuntimeException());
-			Policy.getLog().log(status);
-			assertEquals(status, statusHolder[0]);
-		} finally {
-			Policy.setLog(oldLog);
-		}
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/MultiValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/MultiValidatorTest.java
deleted file mode 100644
index c46ce83..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/MultiValidatorTest.java
+++ /dev/null
@@ -1,426 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 218269)
- *     Matthew Hall - bug 237884, 251003
- *     Ovidio Mallo - bugs 240590, 238909, 251003
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.validation;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.databinding.validation.MultiValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.observable.ValidatedObservableValue;
-import org.eclipse.core.runtime.AssertionFailedException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-public class MultiValidatorTest extends AbstractDefaultRealmTestCase {
-	private DependencyObservableValue dependency;
-	private MultiValidator validator;
-	private IObservableValue validationStatus;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		dependency = new DependencyObservableValue(null, IStatus.class);
-		validator = new MultiValidator() {
-			protected IStatus validate() {
-				return (IStatus) dependency.getValue();
-			}
-		};
-		validationStatus = validator.getValidationStatus();
-	}
-
-	public void testConstructor_NullArgument() {
-		try {
-			new MultiValidator(null) {
-				protected IStatus validate() {
-					return null;
-				}
-			};
-			fail("Expected AssertionFailedException");
-		} catch (AssertionFailedException expected) {
-		}
-	}
-
-	public void testGetValidationStatus_NullResultYieldsOKStatus() {
-		IStatus status = (IStatus) validationStatus.getValue();
-		assertTrue(status.isOK()); // null -> OK
-	}
-
-	public void testGetValidationStatus_ExceptionThrownYieldsErrorStatus() {
-		final RuntimeException e = new RuntimeException("message");
-		validator = new MultiValidator() {
-			protected IStatus validate() {
-				throw e;
-			}
-		};
-		assertEquals(ValidationStatus.error("message", e), validator
-				.getValidationStatus().getValue());
-	}
-
-	public void testGetValidationStatus_TracksWithDependency() {
-		IStatus newStatus = ValidationStatus.error("error");
-		dependency.setValue(newStatus);
-		assertEquals(newStatus, validationStatus.getValue());
-	}
-
-	public void testInit_AddsValidationProducer() {
-		DataBindingContext dbc = new DataBindingContext();
-		dbc.addValidationStatusProvider(validator);
-		assertTrue(dbc.getValidationStatusProviders().contains(validator));
-	}
-
-	public void testObserveValidatedValue_NullArgument() {
-		try {
-			validator.observeValidatedValue(null);
-			fail("Expected AssertionFailedException");
-		} catch (AssertionFailedException expected) {
-		}
-	}
-
-	public void testObserveValidatedValue_WrongRealm() {
-		Realm otherRealm = new CurrentRealm(true);
-		try {
-			validator.observeValidatedValue(new WritableValue(otherRealm));
-			fail("Expected AssertionFailedException");
-		} catch (AssertionFailedException expected) {
-		}
-	}
-
-	public void testObserveValidatedValue_ReturnValue() {
-		WritableValue target = new WritableValue();
-		ValidatedObservableValue validated = (ValidatedObservableValue) validator
-				.observeValidatedValue(target);
-
-		target.setValue(new Object());
-		assertEquals(target.getValue(), validated.getValue());
-
-		dependency.setValue(ValidationStatus.error("error"));
-		assertFalse(validated.isStale());
-
-		target.setValue(new Object());
-		assertTrue(validated.isStale());
-		assertFalse(target.getValue().equals(validated.getValue()));
-
-		dependency.setValue(ValidationStatus.info("info")); // considered valid
-		assertEquals(target.getValue(), validated.getValue());
-		assertFalse(validated.isStale());
-	}
-
-	public void testBug237884_DisposeCausesNPE() {
-		MultiValidator validator = new MultiValidator() {
-			protected IStatus validate() {
-				return ValidationStatus.ok();
-			}
-		};
-		try {
-			validator.dispose();
-		} catch (NullPointerException e) {
-			fail("Bug 237884: MultiValidator.dispose() causes NPE");
-		}
-	}
-
-	public void testBug237884_MultipleDispose() {
-		validator.dispose();
-		validator.dispose();
-	}
-
-	public void testBug237884_Comment3_ValidationStatusAsDependencyCausesStackOverflow() {
-		dependency = new DependencyObservableValue(new Object(), Object.class);
-		validator = new MultiValidator() {
-			private int counter;
-
-			protected IStatus validate() {
-				ObservableTracker.getterCalled(dependency);
-				return ValidationStatus.info("info " + counter++);
-			}
-		};
-		validationStatus = validator.getValidationStatus();
-
-		// bug behavior: the validation status listener causes the validation
-		// status observable to become a dependency of the validator.
-		validationStatus.addChangeListener(new IChangeListener() {
-			public void handleChange(ChangeEvent event) {
-				ObservableTracker.getterCalled(validationStatus);
-			}
-		});
-		dependency.setValue(new Object());
-
-		// at this point, because the validation status observable is a
-		// dependency, changes to the validation status cause revalidation in an
-		// infinite recursion.
-		try {
-			dependency.setValue(new Object());
-		} catch (StackOverflowError e) {
-			fail("Bug 237884: Accessing MultiValidator validation status from within listener "
-					+ "causes infinite recursion");
-		}
-	}
-
-	public void testBug237884_ValidationStatusListenerCausesLoopingDependency() {
-		validationStatus.addChangeListener(new IChangeListener() {
-			public void handleChange(ChangeEvent event) {
-				ObservableTracker.getterCalled(validationStatus);
-			}
-		});
-		assertFalse(validator.getTargets().contains(validationStatus));
-		// trigger revalidation
-		dependency.setValue(ValidationStatus.info("info"));
-		assertFalse(validator.getTargets().contains(validationStatus));
-	}
-
-	public void testBug237884_ValidationStatusAccessDuringValidationCausesLoopingDependency() {
-		validator = new MultiValidator() {
-			protected IStatus validate() {
-				ObservableTracker.getterCalled(getValidationStatus());
-				return (IStatus) dependency.getValue();
-			}
-		};
-		// trigger revalidation
-		dependency.setValue(ValidationStatus.info("info"));
-		assertFalse(validator.getTargets().contains(validationStatus));
-	}
-
-	public void testBug240590_ValidationStatusSetWhileTrackingDependencies() {
-		final IObservableValue noDependency = new WritableValue();
-		validationStatus.addValueChangeListener(new IValueChangeListener() {
-			public void handleValueChange(ValueChangeEvent event) {
-				// Explicitly track the faked dependency.
-				ObservableTracker.getterCalled(noDependency);
-			}
-		});
-
-		// Trigger a validation change.
-		dependency.setValue(ValidationStatus.error("new error"));
-
-		// Make sure the faked dependency has not been included in the
-		// dependency set (the validator's targets).
-		assertFalse(validator.getTargets().contains(noDependency));
-	}
-
-	public void testValidationStaleness() {
-		ValueChangeEventTracker validationChangeCounter = ValueChangeEventTracker
-				.observe(validationStatus);
-
-		StaleCounter validationStaleCounter = new StaleCounter();
-		validationStatus.addStaleListener(validationStaleCounter);
-
-		// Assert initial state.
-		assertFalse(validationStatus.isStale());
-		assertEquals(0, validationChangeCounter.count);
-		assertEquals(0, validationStaleCounter.count);
-
-		// Change to a stale state.
-		dependency.setStale(true);
-		assertTrue(validationStatus.isStale());
-		assertEquals(0, validationChangeCounter.count);
-		assertEquals(1, validationStaleCounter.count); // +1
-
-		// The validation status is already stale so even if it gets another
-		// stale event from its dependencies, it should not propagate that
-		// event.
-		dependency.fireStale();
-		assertTrue(validationStatus.isStale());
-		assertEquals(0, validationChangeCounter.count);
-		assertEquals(1, validationStaleCounter.count);
-
-		// Change the validation status while remaining stale.
-		dependency.setValue(ValidationStatus.error("e1"));
-		assertTrue(validationStatus.isStale());
-		assertEquals(1, validationChangeCounter.count); // +1
-		assertEquals(1, validationStaleCounter.count);
-
-		// Move back to a non-stale state.
-		dependency.setStale(false);
-		assertFalse(dependency.isStale());
-		assertFalse(validationStatus.isStale());
-		assertEquals(2, validationChangeCounter.count); // +1
-		assertEquals(1, validationStaleCounter.count);
-	}
-
-	public void testStatusValueChangeWhileValidationStale() {
-		// Change to a stale state.
-		dependency.setStale(true);
-		assertTrue(validationStatus.isStale());
-
-		// Even if the validation is stale, we want the current value to be
-		// tracked.
-		dependency.setValue(ValidationStatus.error("e1"));
-		assertTrue(validationStatus.isStale());
-		assertEquals(dependency.getValue(), validationStatus.getValue());
-		dependency.setValue(ValidationStatus.error("e2"));
-		assertTrue(validationStatus.isStale());
-		assertEquals(dependency.getValue(), validationStatus.getValue());
-	}
-
-	public void testValidationStatusBecomesStaleThroughNewDependency() {
-		final DependencyObservableValue nonStaleDependency = new DependencyObservableValue(
-				ValidationStatus.ok(), IStatus.class);
-		nonStaleDependency.setStale(false);
-
-		final DependencyObservableValue staleDependency = new DependencyObservableValue(
-				ValidationStatus.ok(), IStatus.class);
-		staleDependency.setStale(true);
-
-		validator = new MultiValidator() {
-			protected IStatus validate() {
-				if (nonStaleDependency.getValue() != null) {
-					return (IStatus) nonStaleDependency.getValue();
-				}
-				return (IStatus) staleDependency.getValue();
-			}
-		};
-		validationStatus = validator.getValidationStatus();
-
-		assertFalse(validationStatus.isStale());
-
-		StaleCounter validationStaleCounter = new StaleCounter();
-		validationStatus.addStaleListener(validationStaleCounter);
-		assertEquals(0, validationStaleCounter.count);
-
-		// Setting the status of the non-stale dependency to null leads to the
-		// new stale dependency being accessed which in turn should trigger a
-		// stale event.
-		nonStaleDependency.setValue(null);
-		assertTrue(validationStatus.isStale());
-		assertEquals(1, validationStaleCounter.count);
-	}
-
-	public void testBug251003_CompareDependenciesByIdentity() {
-		DependencyObservable dependency1 = new DependencyObservable();
-		DependencyObservable dependency2 = new DependencyObservable();
-		assertEquals(dependency1, dependency2);
-		assertNotSame(dependency1, dependency2);
-
-		final List dependencies = new ArrayList();
-		dependencies.add(dependency1);
-		validator = new MultiValidator() {
-			protected IStatus validate() {
-				for (Iterator it = dependencies.iterator(); it.hasNext();)
-					ObservableTracker.getterCalled((IObservable) it.next());
-				return null;
-			}
-		};
-
-		// force init validation
-		validationStatus = validator.getValidationStatus();
-
-		IObservableList targets = validator.getTargets();
-		assertEquals(1, targets.size());
-		assertSame(dependency1, targets.get(0));
-
-		dependencies.set(0, dependency2);
-		dependency1.fireChange(); // force revalidate
-
-		assertEquals(1, targets.size());
-		assertSame(dependency2, targets.get(0));
-	}
-
-	public void testBug251003_MissingDependencies() {
-		final WritableList emptyListDependency = new WritableList();
-		validator = new MultiValidator() {
-			protected IStatus validate() {
-				ObservableTracker.getterCalled(emptyListDependency);
-				return null;
-			}
-		};
-
-		// Make sure the validation above is really triggered.
-		validator.getValidationStatus().getValue();
-
-		// emptyListDependency should be included in the dependency set.
-		assertTrue(validator.getTargets().contains(emptyListDependency));
-	}
-
-	private static class DependencyObservableValue extends WritableValue {
-		private boolean stale = false;
-
-		public DependencyObservableValue(Object initialValue, Object valueType) {
-			super(initialValue, valueType);
-		}
-
-		public boolean isStale() {
-			ObservableTracker.getterCalled(this);
-			return stale;
-		}
-
-		public void setStale(boolean stale) {
-			if (this.stale != stale) {
-				this.stale = stale;
-				if (stale) {
-					fireStale();
-				} else {
-					fireValueChange(Diffs.createValueDiff(doGetValue(),
-							doGetValue()));
-				}
-			}
-		}
-
-		protected void fireStale() {
-			super.fireStale();
-		}
-	}
-
-	private static class DependencyObservable extends AbstractObservable {
-		public DependencyObservable() {
-			super(Realm.getDefault());
-		}
-
-		public boolean isStale() {
-			return false;
-		}
-
-		public boolean equals(Object obj) {
-			if (obj == this)
-				return true;
-			if (obj == null)
-				return false;
-			return getClass() == obj.getClass();
-		}
-
-		public int hashCode() {
-			return getClass().hashCode();
-		}
-
-		protected void fireChange() {
-			// TODO Auto-generated method stub
-			super.fireChange();
-		}
-	}
-
-	private static class StaleCounter implements IStaleListener {
-		int count;
-
-		public void handleStale(StaleEvent event) {
-			count++;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/ValidationStatusTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/ValidationStatusTest.java
deleted file mode 100644
index b6f831e..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/databinding/validation/ValidationStatusTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.databinding.validation;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * @since 1.1
- */
-public class ValidationStatusTest extends TestCase {
-	public void testEqualsAndHashCode() throws Exception {
-		String message = "error";
-		Exception e = new IllegalArgumentException();
-		IStatus status1 = ValidationStatus.error(message, e);
-		IStatus status2 = ValidationStatus.error(message, e);
-		
-		assertEquals(status1, status2);
-		assertEquals(status1.hashCode(), status2.hashCode());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/BindingMessagesTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/BindingMessagesTest.java
deleted file mode 100644
index 5e6b516..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/BindingMessagesTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.eclipse.core.tests.internal.databinding;
-import junit.framework.TestCase;
-
-import org.eclipse.core.internal.databinding.BindingMessages;
-
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-/**
- * @since 3.2
- *
- */
-public class BindingMessagesTest extends TestCase {
-	public void testFormatString() throws Exception {
-		String key = "Validate_NumberOutOfRangeError";
-		String result = BindingMessages.formatString(key, new Object[] {"1", "2"});
-		assertFalse("key should not be returned", key.equals(result));
-	}
-	
-	public void testFormatStringForKeyNotFound() throws Exception {
-		String key = "key_that_does_not_exist";
-		String result = BindingMessages.formatString(key, null);
-		assertTrue(key.equals(result));
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/BindingStatusTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/BindingStatusTest.java
deleted file mode 100644
index 4e73204..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/BindingStatusTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package org.eclipse.core.tests.internal.databinding;
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.BindingStatus;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-/**
- * @since 1.1
- */
-public class BindingStatusTest extends TestCase {
-	private BindingStatus bindingStatus;
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		bindingStatus = BindingStatus.ok();
-	}
-	
-	public void testMessageIsFromStatus() throws Exception {
-		String message = "error message";
-		IStatus status = ValidationStatus.error(message);
-		
-		bindingStatus.add(status);
-		assertEquals(message, bindingStatus.getMessage());
-	}
-	
-	public void testExceptionIsFromStatus() throws Exception {
-		IllegalArgumentException e = new IllegalArgumentException();
-		Status status = new Status(0, Policy.JFACE_DATABINDING, 0, "", e);
-		
-		bindingStatus.add(status);
-		assertEquals(e, bindingStatus.getException());
-	}
-	
-	public void testPluginIsFromStatus() throws Exception {
-		String plugin = "test";
-		Status status = new Status(0, plugin, 0, "", null);
-		
-		bindingStatus.add(status);
-		assertEquals(plugin, bindingStatus.getPlugin());
-	}
-	
-	public void testCodeIsFromStatus() throws Exception {
-		int code = 1;
-		Status status = new Status(0, Policy.JFACE_DATABINDING, code, "", null);
-		
-		bindingStatus.add(status);
-		assertEquals(code, status.getCode());
-	}
-	
-	public void testSeverityIsFromStatus() throws Exception {
-		IStatus status = ValidationStatus.error("");
-		
-		bindingStatus.add(status);
-		assertEquals(IStatus.ERROR, status.getSeverity());
-	}
-	
-	public void testLowerSeverityDoesNotOverwriteGreaterSeverity() throws Exception {
-		String info = "info";
-		String error = "error";
-		
-		bindingStatus.add(ValidationStatus.error(error));
-		assertEquals(IStatus.ERROR, bindingStatus.getSeverity());
-		assertEquals(error, bindingStatus.getMessage());
-		
-		bindingStatus.add(ValidationStatus.info(info));
-		assertEquals(IStatus.ERROR, bindingStatus.getSeverity());
-		assertEquals(error, bindingStatus.getMessage());
-		
-		IStatus[] children = bindingStatus.getChildren();
-		assertEquals(2, children.length);
-		assertEquals(IStatus.ERROR, children[0].getSeverity());
-		assertEquals(IStatus.INFO, children[1].getSeverity());
-	}
-	
-	public void testEqual() throws Exception {
-		BindingStatus status1 = BindingStatus.ok();
-		BindingStatus status2 = BindingStatus.ok();
-		
-		assertEquals(status1, status2);
-	}
-	
-	public void testNotEqual() throws Exception {
-		BindingStatus status1 = BindingStatus.ok();
-		BindingStatus status2 = BindingStatus.ok();
-		
-		status2.add(ValidationStatus.error(""));
-		assertFalse(status1.equals(status2));
-	}
-	
-	public void testHashCode() throws Exception {
-		BindingStatus status1 = BindingStatus.ok();
-		BindingStatus status2 = BindingStatus.ok();
-		
-		assertEquals(status1.hashCode(), status2.hashCode());
-	}
-	
-	public void testOkInitializesStatus() throws Exception {
-		BindingStatus status = BindingStatus.ok();
-		assertEquals(Policy.JFACE_DATABINDING, status.getPlugin());
-		assertEquals("", status.getMessage());
-		assertEquals(0, status.getCode());
-		assertEquals(0, status.getChildren().length);
-		assertNull(status.getException());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/QueueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/QueueTest.java
deleted file mode 100644
index 0541847..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/QueueTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding;
-
-import org.eclipse.core.internal.databinding.Queue;
-
-import junit.framework.TestCase;
-
-/**
- * @since 3.2
- *
- */
-public class QueueTest extends TestCase {
-
-	private Queue queue;
-
-	protected void setUp() throws Exception {
-		this.queue = new Queue();
-	}
-	
-	public void testIsEmpty() {
-		assertTrue(queue.isEmpty());
-		queue.enqueue("foo");
-		assertFalse(queue.isEmpty());
-		queue.enqueue("bar");
-		assertFalse(queue.isEmpty());
-		queue.dequeue();
-		assertFalse(queue.isEmpty());
-		queue.dequeue();
-		assertTrue(queue.isEmpty());
-	}
-	
-	public void testEnqueueAndDequeue() {
-		try {
-			queue.dequeue();
-			fail("expected IllegalStateException");
-		} catch(IllegalStateException ex) {
-			// expected
-		}
-		queue.enqueue("foo");
-		assertEquals("foo", queue.dequeue());
-		try {
-			queue.dequeue();
-			fail("expected IllegalStateException");
-		} catch(IllegalStateException ex) {
-			// expected
-		}
-		queue.enqueue("foo");
-		queue.enqueue("bar");
-		queue.dequeue();
-		queue.enqueue("bas");
-		queue.enqueue("moo");
-		assertEquals("bar", queue.dequeue());
-		assertEquals("bas", queue.dequeue());
-		assertEquals("moo", queue.dequeue());
-		assertTrue(queue.isEmpty());
-	}
-	
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/RandomAccessListIteratorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/RandomAccessListIteratorTest.java
deleted file mode 100755
index 20bcbdc..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/RandomAccessListIteratorTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.core.tests.internal.databinding;
-
-import java.util.LinkedList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.internal.databinding.RandomAccessListIterator;
-
-public class RandomAccessListIteratorTest extends TestCase {
-
-	private List emptyList = new LinkedList();
-	private RandomAccessListIterator rali0 = new RandomAccessListIterator(emptyList);
-	private List listWithOne;
-	private RandomAccessListIterator rali1;
-	private List list;
-	private RandomAccessListIterator raliN;
-	
-	protected void setUp() throws Exception {
-		listWithOne = new LinkedList();
-		listWithOne.add("Uno");
-		rali1 = new RandomAccessListIterator(listWithOne);
-		list = new LinkedList();
-		list.add("One");
-		list.add("Two");
-		list.add("three");
-		list.add("four");
-		raliN = new RandomAccessListIterator(list);
-	}
-
-	public void testGet_emptyList() {
-		try {
-			rali0.get(0);
-			fail("Should have thrown exception");
-		} catch (IndexOutOfBoundsException e) {
-			// success
-		}
-	}
-
-	public void testGet_withOne() {
-		try {
-			assertEquals("Uno", "Uno", rali1.get(0));
-			
-			rali1.get(1);
-			fail("Should have thrown IndexOutOfBoundsException");
-		} catch (Exception e) {
-			// success
-		}
-	}
-	
-	public void testGet_alreadyAtItem() {
-		assertEquals("one", "One", raliN.get(0));
-	}
-	
-	public void testGet_moveForward() throws Exception {
-		assertEquals("three", "three", raliN.get(2));
-	}
-	
-	public void testGet_moveBackward() throws Exception {
-		raliN.next();
-		raliN.next();
-		assertEquals("one", "One", raliN.get(0));
-	}
-	
-	public void testGet_getLast() throws Exception {
-		assertEquals("four", "four", raliN.get(3));
-	}
-	
-	public void testGet_indexTooHigh() throws Exception {
-		try {
-			raliN.get(4);
-			fail("Should have thrown exception");
-		} catch (IndexOutOfBoundsException e) {
-			// success
-		}
-	}
-
-	public void testGet_indexTooLow() throws Exception {
-		try {
-			raliN.get(-100);
-			fail("Should have thrown exception");
-		} catch (IndexOutOfBoundsException e) {
-			// success
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/AnnoyingBean.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/AnnoyingBean.java
deleted file mode 100644
index 257218c..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/AnnoyingBean.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 246103)
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * A bean in which all property change events are fired according to an annoying
- * provision in the bean spec, where <code>(oldValue == null && newValue ==
- * null)</code> indicates that an unknown change occured.
- * 
- * @since 3.2
- */
-public class AnnoyingBean extends Bean {
-	public void setValue(String value) {
-		this.value = value;
-		changeSupport.firePropertyChange("value", null, null);
-	}
-
-	public void setArray(Object[] array) {
-		this.array = array;
-		changeSupport.firePropertyChange("array", null, null);
-	}
-
-	public void setList(List list) {
-		this.list = list;
-		changeSupport.firePropertyChange("list", null, null);
-	}
-
-	public void setSet(Set set) {
-		this.set = set;
-		changeSupport.firePropertyChange("set", null, null);
-	}
-
-	public void setMap(Map map) {
-		this.map = map;
-		changeSupport.firePropertyChange("map", null, null);
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/Bean.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/Bean.java
deleted file mode 100644
index bfb7197..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/Bean.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 221351
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Simple Java Bean for testing.
- * 
- * @since 3.3
- */
-public class Bean {
-	protected PropertyChangeSupport changeSupport = new PropertyChangeSupport(
-			this);
-	protected String value;
-	protected Object[] array;
-	protected List list;
-	protected Set set;
-	protected Map map;
-
-	public Bean() {
-	}
-
-	public Bean(String value) {
-		this.value = value;
-	}
-
-	public Bean(Object[] array) {
-		this.array = array;
-	}
-
-	public Bean(List list) {
-		this.list = list;
-	}
-
-	public Bean(Set set) {
-		this.set = set;
-	}
-
-	public Bean(Map map) {
-		this.map = map;
-	}
-
-	public void addPropertyChangeListener(PropertyChangeListener listener) {
-		changeSupport.addPropertyChangeListener(listener);
-	}
-
-	public void removePropertyChangeListener(PropertyChangeListener listener) {
-		changeSupport.removePropertyChangeListener(listener);
-	}
-
-	public String getValue() {
-		return value;
-	}
-
-	public void setValue(String value) {
-		changeSupport.firePropertyChange("value", this.value,
-				this.value = value);
-	}
-
-	public Object[] getArray() {
-		return array;
-	}
-
-	public void setArray(Object[] array) {
-		changeSupport.firePropertyChange("array", this.array,
-				this.array = array);
-	}
-
-	public List getList() {
-		return list;
-	}
-
-	public void setList(List list) {
-		changeSupport.firePropertyChange("list", this.list, this.list = list);
-	}
-
-	public Set getSet() {
-		return set;
-	}
-
-	public void setSet(Set set) {
-		changeSupport.firePropertyChange("set", this.set, this.set = set);
-	}
-
-	public Map getMap() {
-		return map;
-	}
-
-	public void setMap(Map map) {
-		changeSupport.firePropertyChange("map", this.map, this.map = map);
-	}
-
-	public boolean hasListeners(String propertyName) {
-		return changeSupport.hasListeners(propertyName);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableListDecoratorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableListDecoratorTest.java
deleted file mode 100644
index 8ef9665..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableListDecoratorTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bugs 208858, 213145, 246625
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.internal.databinding.beans.BeanObservableListDecorator;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableList;
-import org.eclipse.jface.databinding.conformance.MutableObservableListContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 3.3
- */
-public class BeanObservableListDecoratorTest extends TestCase {
-	private Bean bean;
-	private PropertyDescriptor propertyDescriptor;
-	private JavaBeanObservableList observableList;
-	private BeanObservableListDecorator decorator;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		bean = new Bean();
-		propertyDescriptor = new PropertyDescriptor(
-				"list", Bean.class,"getList","setList");
-		observableList = new JavaBeanObservableList(
-				SWTObservables.getRealm(Display.getDefault()), bean,
-				propertyDescriptor, Bean.class);
-		decorator = new BeanObservableListDecorator(observableList, propertyDescriptor);
-	}
-
-	public void testGetDelegate() throws Exception {
-		assertEquals(observableList, decorator.getDecorated());
-	}
-
-	public void testGetObserved() throws Exception {
-		assertEquals(bean, decorator.getObserved());
-	}
-
-	public void testGetPropertyDescriptor() throws Exception {
-		assertEquals(propertyDescriptor, decorator.getPropertyDescriptor());
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(BeanObservableListDecoratorTest.class.getName());
-		suite.addTestSuite(BeanObservableListDecoratorTest.class);
-		suite.addTest(MutableObservableListContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableCollectionContractDelegate {
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			final WritableList delegate = new WritableList(realm);
-			for (int i = 0; i < elementCount; i++)
-				delegate.add(createElement(delegate));
-			return new BeanObservableListDecorator(delegate, null);
-		}
-
-		private int counter;
-
-		public Object createElement(IObservableCollection collection) {
-			return Integer.toString(counter++);
-		}
-
-		public void change(IObservable observable) {
-			IObservableList list = (IObservableList) observable;
-			list.add(createElement(list));
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableSetDecoratorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableSetDecoratorTest.java
deleted file mode 100644
index b380d88..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableSetDecoratorTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 246625
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.internal.databinding.beans.BeanObservableSetDecorator;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableSet;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 3.3
- */
-public class BeanObservableSetDecoratorTest extends TestCase {
-	private PropertyDescriptor propertyDescriptor;
-	private JavaBeanObservableSet observableSet;
-	private BeanObservableSetDecorator decorator;
-	private Bean bean;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		bean = new Bean();
-		propertyDescriptor = new PropertyDescriptor("set",
-				Bean.class);
-		observableSet = new JavaBeanObservableSet(
-				SWTObservables.getRealm(Display.getDefault()), bean,
-				propertyDescriptor, String.class);
-		decorator = new BeanObservableSetDecorator(
-				observableSet, propertyDescriptor);
-	}
-
-	public void testGetDelegate() throws Exception {
-		assertEquals(observableSet, decorator.getDecorated());
-	}
-
-	public void testGetObserved() throws Exception {
-		assertEquals(bean, decorator.getObserved());
-	}
-
-	public void testGetPropertyDescriptor() throws Exception {
-		assertEquals(propertyDescriptor, decorator.getPropertyDescriptor());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableValueDecoratorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableValueDecoratorTest.java
deleted file mode 100644
index cde57ff..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableValueDecoratorTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 246625
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-
-import org.eclipse.core.internal.databinding.beans.BeanObservableValueDecorator;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 3.3
- */
-public class BeanObservableValueDecoratorTest extends AbstractDefaultRealmTestCase {
-	private Bean bean;
-	private JavaBeanObservableValue observableValue;
-	private BeanObservableValueDecorator decorator;
-	private PropertyDescriptor propertyDescriptor;
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		bean = new Bean();
-		propertyDescriptor = new PropertyDescriptor("value",
-				Bean.class);
-		observableValue = new JavaBeanObservableValue(
-				SWTObservables.getRealm(Display.getDefault()), bean,
-				propertyDescriptor);
-		decorator = new BeanObservableValueDecorator(
-				observableValue, observableValue
-						.getPropertyDescriptor());
-	}
-
-	public void testGetDelegate() throws Exception {
-		assertEquals(observableValue, decorator.getDecorated());
-	}
-	
-	public void testGetObserved() throws Exception {
-		assertEquals(bean, decorator.getObserved());
-	}
-
-	public void testGetPropertyDescriptor() throws Exception {
-		assertEquals(propertyDescriptor, decorator.getPropertyDescriptor());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableArrayBasedListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableArrayBasedListTest.java
deleted file mode 100644
index 8c5ffea..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableArrayBasedListTest.java
+++ /dev/null
@@ -1,557 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bugs 221351, 213145, 244098, 246103
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.IntrospectionException;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyDescriptor;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableList;
-import org.eclipse.jface.databinding.conformance.MutableObservableListContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.ListChangeEventTracker;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 1.1
- */
-public class JavaBeanObservableArrayBasedListTest extends
-		AbstractDefaultRealmTestCase {
-	private JavaBeanObservableList list;
-
-	private PropertyDescriptor propertyDescriptor;
-
-	private Bean bean;
-
-	private String propertyName;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		propertyName = "array";
-		propertyDescriptor = new PropertyDescriptor(propertyName, Bean.class);
-		bean = new Bean(new Object[0]);
-
-		list = new JavaBeanObservableList(SWTObservables.getRealm(Display
-				.getDefault()), bean, propertyDescriptor, Bean.class);
-	}
-
-	public void testGetObserved() throws Exception {
-		assertSame(bean, list.getObserved());
-	}
-
-	public void testGetPropertyDescriptor() throws Exception {
-		assertSame(propertyDescriptor, list.getPropertyDescriptor());
-	}
-
-	public void testRegistersListenerOnCreation()
-			throws Exception {
-		assertTrue(bean.changeSupport.hasListeners(propertyName));
-	}
-
-	public void testRemovesListenerOnDisposal()
-			throws Exception {
-		list.dispose();
-		assertFalse(bean.changeSupport.hasListeners(propertyName));
-	}
-
-	public void testFiresListChangeEvents() throws Exception {
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		assertEquals(0, listener.count);
-		bean.setArray(new Bean[] { new Bean() });
-		assertEquals(1, listener.count);
-	}
-
-	public void testAddAddsElement() throws Exception {
-		int count = list.size();
-		String element = "1";
-
-		assertEquals(0, count);
-		list.add(element);
-		assertEquals(count + 1, list.size());
-		assertEquals(element, bean.getArray()[count]);
-	}
-
-	public void testAddListChangeEvent() throws Exception {
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		assertEquals(0, listener.count);
-		String element = "1";
-
-		list.add(element);
-
-		assertEquals(1, listener.count);
-		ListChangeEvent event = listener.event;
-
-		assertEquals(list, event.getObservableList());
-		assertEntry(event.diff.getDifferences()[0], true, 0, element);
-	}
-
-	public void testAdd_FiresPropertyChangeEvent() throws Exception {
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.add("0");
-			}
-		});
-	}
-
-	public void testAddWithIndex() throws Exception {
-		String element = "1";
-		assertEquals(0, list.size());
-
-		list.add(0, element);
-		assertEquals(element, bean.getArray()[0]);
-	}
-
-	public void testAddAtIndexListChangeEvent() throws Exception {
-		String element = "1";
-		assertEquals(0, list.size());
-
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		list.add(0, element);
-
-		ListChangeEvent event = listener.event;
-		assertEntry(event.diff.getDifferences()[0], true, 0, element);
-	}
-
-	public void testAddAtIndexPropertyChangeEvent() throws Exception {
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.add(0, "0");
-			}
-		});
-	}
-
-	public void testRemove() throws Exception {
-		String element = "1";
-		list.add(element);
-
-		assertEquals(1, bean.getArray().length);
-		list.remove(element);
-		assertEquals(0, bean.getArray().length);
-	}
-
-	public void testRemoveListChangeEvent() throws Exception {
-		String element = "1";
-		list.add(element);
-
-		assertEquals(1, list.size());
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		list.remove(element);
-
-		assertEquals(1, listener.count);
-		ListChangeEvent event = listener.event;
-		assertEquals(list, event.getObservableList());
-		assertEntry(event.diff.getDifferences()[0], false, 0, element);
-	}
-
-	public void testRemovePropertyChangeEvent() throws Exception {
-		list.add("0");
-
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.remove("0");
-			}
-		});
-	}
-
-	public void testRemoveAtIndex() throws Exception {
-		String element = "1";
-		list.add(element);
-
-		assertEquals(element, bean.getArray()[0]);
-
-		list.remove(0);
-		assertEquals(0, bean.getArray().length);
-	}
-
-	public void testRemoveAtIndexListChangeEvent() throws Exception {
-		String element = "1";
-		list.add(element);
-
-		assertEquals(1, list.size());
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		list.remove(0);
-
-		assertEquals(1, listener.count);
-		ListChangeEvent event = listener.event;
-		assertEquals(list, event.getObservableList());
-		assertEntry(event.diff.getDifferences()[0], false, 0, element);
-	}
-
-	public void testRemoveAtIndexPropertyChangeEvent() throws Exception {
-		list.add("0");
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.remove(0);
-			}
-		});
-	}
-
-	public void testAddAll() throws Exception {
-		Collection elements = Arrays.asList(new String[] { "1", "2" });
-		assertEquals(0, list.size());
-
-		list.addAll(elements);
-
-		assertEquals(2, bean.getArray().length);
-	}
-
-	public void testAddAllListChangEvent() throws Exception {
-		List elements = Arrays.asList(new String[] { "1", "2" });
-		assertEquals(0, list.size());
-
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-		assertEquals(0, listener.count);
-
-		list.addAll(elements);
-
-		assertEquals(1, listener.count);
-		ListChangeEvent event = listener.event;
-		assertEquals(list, event.getObservableList());
-
-		assertEntry(event.diff.getDifferences()[0], true, 0, elements.get(0));
-		assertEntry(event.diff.getDifferences()[1], true, 1, elements.get(1));
-	}
-
-	public void testAddAllPropertyChangeEvent() throws Exception {
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.addAll(Arrays.asList(new String[] { "0", "1" }));
-			}
-		});
-	}
-
-	public void testAddAllAtIndex() throws Exception {
-		List elements = Arrays.asList(new String[] { "1", "2" });
-		list.addAll(elements);
-
-		assertEquals(2, list.size());
-
-		list.addAll(2, elements);
-
-		assertEquals(4, bean.getArray().length);
-		assertEquals(elements.get(0), bean.getArray()[0]);
-		assertEquals(elements.get(1), bean.getArray()[1]);
-	}
-
-	public void testAddAllAtIndexListChangeEvent() throws Exception {
-		List elements = Arrays.asList(new String[] { "1", "2" });
-		list.addAll(elements);
-
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		assertEquals(0, listener.count);
-
-		list.addAll(2, elements);
-
-		assertEquals(1, listener.count);
-		ListChangeEvent event = listener.event;
-		assertEquals(list, event.getObservableList());
-		assertEntry(event.diff.getDifferences()[0], true, 2, elements.get(0));
-		assertEntry(event.diff.getDifferences()[1], true, 3, elements.get(1));
-	}
-
-	public void testAddAllAtIndexPropertyChangeEvent() throws Exception {
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.addAll(0, Arrays.asList(new String[] { "1", "2" }));
-			}
-		});
-	}
-
-	public void testRemoveAll() throws Exception {
-		List elements = Arrays.asList(new String[] { "1", "2" });
-		list.addAll(elements);
-		list.addAll(elements);
-
-		assertEquals(4, bean.getArray().length);
-		list.removeAll(elements);
-
-		assertEquals(2, bean.getArray().length);
-		assertEquals(elements.get(0), bean.getArray()[0]);
-		assertEquals(elements.get(1), bean.getArray()[1]);
-	}
-
-	public void testRemoveAllListChangeEvent() throws Exception {
-		List elements = Arrays.asList(new String[] { "1", "2" });
-		list.addAll(elements);
-		list.addAll(elements);
-
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		assertEquals(0, listener.count);
-		list.removeAll(elements);
-
-		ListChangeEvent event = listener.event;
-		assertEquals(list, event.getObservableList());
-		assertEntry(event.diff.getDifferences()[0], false, 0, elements.get(0));
-		assertEntry(event.diff.getDifferences()[1], false, 0, elements.get(1));
-	}
-
-	public void testRemoveAllPropertyChangeEvent() throws Exception {
-		list.add("0");
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.removeAll(Arrays.asList(new String[] { "0" }));
-			}
-		});
-	}
-
-	public void testRetailAll() throws Exception {
-		List elements = Arrays.asList(new String[] { "0", "1", "2", "3" });
-		list.addAll(elements);
-
-		assertEquals(4, bean.getArray().length);
-
-		list.retainAll(elements.subList(0, 2));
-		assertEquals(2, bean.getArray().length);
-
-		assertEquals(elements.get(0), bean.getArray()[0]);
-		assertEquals(elements.get(1), bean.getArray()[1]);
-	}
-
-	public void testRetainAllListChangeEvent() throws Exception {
-		List elements = Arrays.asList(new String[] { "0", "1", "2", "3" });
-		list.addAll(elements);
-
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		assertEquals(0, listener.count);
-		list.retainAll(elements.subList(0, 2));
-
-		assertEquals(1, listener.count);
-		ListChangeEvent event = listener.event;
-		assertEquals(list, event.getObservableList());
-		assertEntry(event.diff.getDifferences()[0], false, 2, elements.get(2));
-		assertEntry(event.diff.getDifferences()[1], false, 2, elements.get(3));
-	}
-
-	public void testRetainAllPropertyChangeEvent() throws Exception {
-		list.addAll(Arrays.asList(new String[] { "0", "1" }));
-
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.retainAll(Arrays.asList(new String[] { "0" }));
-			}
-		});
-	}
-
-	public void testSet() throws Exception {
-		String oldElement = "old";
-		String newElement = "new";
-		list.add(oldElement);
-
-		assertEquals(oldElement, bean.getArray()[0]);
-
-		list.set(0, newElement);
-		assertEquals(newElement, bean.getArray()[0]);
-	}
-
-	public void testMove() throws Exception {
-		String element0 = "element0";
-		String element1 = "element1";
-		list.add(element0);
-		list.add(element1);
-
-		assertEquals(2, bean.getArray().length);
-		assertEquals(element0, bean.getArray()[0]);
-		assertEquals(element1, bean.getArray()[1]);
-
-		list.move(0, 1);
-
-		assertEquals(2, bean.getArray().length);
-		assertEquals(element1, bean.getArray()[0]);
-		assertEquals(element0, bean.getArray()[1]);
-	}
-
-	public void testSetListChangeEvent() throws Exception {
-		String oldElement = "old";
-		String newElement = "new";
-		list.add(oldElement);
-
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-		assertEquals(0, listener.count);
-
-		list.set(0, newElement);
-
-		assertEquals(1, listener.count);
-		ListChangeEvent event = listener.event;
-		assertEquals(list, event.getObservableList());
-		assertEntry(event.diff.getDifferences()[0], false, 0, oldElement);
-		assertEntry(event.diff.getDifferences()[1], true, 0, newElement);
-	}
-
-	public void testSetPropertyChangeEvent() throws Exception {
-		list.add("0");
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.set(0, "1");
-			}
-		});
-	}
-
-	public void testListChangeEventFiresWhenNewListIsSet() throws Exception {
-		Bean[] elements = new Bean[] { new Bean(), new Bean() };
-
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		assertEquals(0, listener.count);
-		bean.setArray(elements);
-		assertEquals(1, listener.count);
-	}
-
-	public void testSetBeanProperty_CorrectForNullOldAndNewValues() {
-		// The java bean spec allows the old and new values in a
-		// PropertyChangeEvent to be null, which indicates that an unknown
-		// change occured.
-
-		// This test ensures that JavaBeanObservableValue fires the correct
-		// value diff even if the bean implementor is lazy :-P
-
-		Bean bean = new AnnoyingBean();
-		bean.setArray(new Object[] { "old" });
-		IObservableList observable = BeansObservables.observeList(
-				new CurrentRealm(true), bean, "array");
-		ListChangeEventTracker tracker = ListChangeEventTracker
-				.observe(observable);
-		bean.setArray(new Object[] { "new" });
-		assertEquals(1, tracker.count);
-
-		List list = new ArrayList();
-		list.add("old");
-		tracker.event.diff.applyTo(list);
-		assertEquals(Collections.singletonList("new"), list);
-	}
-
-	private static void assertEntry(ListDiffEntry entry, boolean addition,
-			int position, Object element) {
-		assertEquals("addition", addition, entry.isAddition());
-		assertEquals("position", position, entry.getPosition());
-		assertEquals("element", element, entry.getElement());
-	}
-
-	private static void assertPropertyChangeEvent(Bean bean, Runnable runnable) {
-		PropertyChangeTracker listener = new PropertyChangeTracker();
-		bean.addPropertyChangeListener(listener);
-
-		Object[] old = bean.getArray();
-		assertEquals(0, listener.count);
-
-		runnable.run();
-
-		PropertyChangeEvent event = listener.evt;
-		assertEquals("event did not fire", 1, listener.count);
-		assertEquals("array", event.getPropertyName());
-		assertTrue("old value", Arrays.equals(old, (Object[]) event.getOldValue()));
-		assertTrue("new value", Arrays.equals(bean.getArray(), (Object[]) event.getNewValue()));
-		assertFalse("lists are equal", Arrays.equals(bean.getArray(), old));
-	}
-
-	private static class PropertyChangeTracker implements
-			PropertyChangeListener {
-		int count;
-
-		PropertyChangeEvent evt;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
-		 */
-		public void propertyChange(PropertyChangeEvent evt) {
-			count++;
-			this.evt = evt;
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(JavaBeanObservableArrayBasedListTest.class.getName());
-		suite.addTestSuite(JavaBeanObservableArrayBasedListTest.class);
-		suite.addTest(MutableObservableListContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableCollectionContractDelegate {
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			String propertyName = "array";
-			PropertyDescriptor propertyDescriptor;
-			try {
-				propertyDescriptor = new PropertyDescriptor(propertyName,
-						Bean.class);
-			} catch (IntrospectionException e) {
-				throw new RuntimeException(e);
-			}
-			Object bean = new Bean(new Object[0]);
-
-			IObservableList list = new JavaBeanObservableList(realm, bean,
-					propertyDescriptor, String.class);
-			for (int i = 0; i < elementCount; i++)
-				list.add(createElement(list));
-			return list;
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object();
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return String.class;
-		}
-
-		public void change(IObservable observable) {
-			IObservableList list = (IObservableList) observable;
-			list.add(createElement(list));
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableArrayBasedSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableArrayBasedSetTest.java
deleted file mode 100644
index ceeb1b9..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableArrayBasedSetTest.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 221351)
- *     Brad Reynolds - through JavaBeanObservableArrayBasedListTest.java
- *     Matthew Hall - bug 213145, 244098, 246103
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.IntrospectionException;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyDescriptor;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableSet;
-import org.eclipse.jface.databinding.conformance.MutableObservableSetContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.SetChangeEventTracker;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 1.1
- */
-public class JavaBeanObservableArrayBasedSetTest extends
-		AbstractDefaultRealmTestCase {
-	private JavaBeanObservableSet set;
-
-	private PropertyDescriptor propertyDescriptor;
-
-	private Bean bean;
-
-	private String propertyName;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		propertyName = "array";
-		propertyDescriptor = new PropertyDescriptor(propertyName, Bean.class);
-		bean = new Bean(new HashSet());
-
-		set = new JavaBeanObservableSet(SWTObservables.getRealm(Display
-				.getDefault()), bean, propertyDescriptor, String.class);
-	}
-
-	public void testGetObserved() throws Exception {
-		assertEquals(bean, set.getObserved());
-	}
-
-	public void testGetPropertyDescriptor() throws Exception {
-		assertEquals(propertyDescriptor, set.getPropertyDescriptor());
-	}
-
-	public void testRegistersListenerOnCreation() throws Exception {
-		assertTrue(bean.changeSupport.hasListeners(propertyName));
-	}
-
-	public void testRemovesListenerOnDisposal() throws Exception {
-		set.dispose();
-		assertFalse(bean.changeSupport.hasListeners(propertyName));
-	}
-
-	public void testSetBeanProperty_FiresSetChangeEvents() throws Exception {
-		SetChangeEventTracker listener = SetChangeEventTracker.observe(set);
-
-		assertEquals(0, listener.count);
-		bean.setArray(new String[] { "element" });
-		assertEquals(1, listener.count);
-	}
-
-	public void testAdd_AddsElement() throws Exception {
-		assertEquals(0, set.size());
-
-		String element = "1";
-		set.add(element);
-
-		assertEquals(1, set.size());
-		assertEquals(element, bean.getArray()[0]);
-	}
-
-	public void testAdd_SetChangeEvent() throws Exception {
-		SetChangeEventTracker listener = SetChangeEventTracker.observe(set);
-		assertEquals(0, listener.count);
-
-		String element = "1";
-		set.add(element);
-
-		assertEquals(1, listener.count);
-		SetChangeEvent event = listener.event;
-
-		assertSame(set, event.getObservableSet());
-		assertEquals(Collections.singleton(element), event.diff.getAdditions());
-		assertEquals(Collections.EMPTY_SET, event.diff.getRemovals());
-	}
-
-	public void testAdd_FiresPropertyChangeEvent() throws Exception {
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				set.add("0");
-			}
-		});
-	}
-
-	public void testRemove() throws Exception {
-		String element = "1";
-		set.add(element);
-
-		assertEquals(1, bean.getArray().length);
-		set.remove(element);
-		assertEquals(0, bean.getArray().length);
-	}
-
-	public void testRemove_SetChangeEvent() throws Exception {
-		String element = "1";
-		set.add(element);
-		assertEquals(1, set.size());
-
-		SetChangeEventTracker listener = SetChangeEventTracker.observe(set);
-		assertEquals(0, listener.count);
-
-		set.remove(element);
-
-		assertEquals(1, listener.count);
-		SetChangeEvent event = listener.event;
-		assertEquals(set, event.getObservableSet());
-		assertEquals(Collections.singleton(element), event.diff.getRemovals());
-		assertEquals(Collections.EMPTY_SET, event.diff.getAdditions());
-	}
-
-	public void testRemovePropertyChangeEvent() throws Exception {
-		set.add("0");
-
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				set.remove("0");
-			}
-		});
-	}
-
-	public void testAddAll() throws Exception {
-		Collection elements = Arrays.asList(new String[] { "1", "2" });
-		assertEquals(0, set.size());
-
-		set.addAll(elements);
-
-		assertEquals(2, bean.getArray().length);
-	}
-
-	public void testAddAll_SetChangeEvent() throws Exception {
-		Collection elements = Arrays.asList(new String[] { "1", "2" });
-		assertEquals(0, set.size());
-
-		SetChangeEventTracker listener = SetChangeEventTracker.observe(set);
-		assertEquals(0, listener.count);
-
-		set.addAll(elements);
-
-		assertEquals(1, listener.count);
-		SetChangeEvent event = listener.event;
-		assertEquals(set, event.getObservableSet());
-
-		assertEquals(new HashSet(elements), event.diff.getAdditions());
-		assertEquals(Collections.EMPTY_SET, event.diff.getRemovals());
-	}
-
-	public void testAddAllPropertyChangeEvent() throws Exception {
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				set.addAll(Arrays.asList(new String[] { "0", "1" }));
-			}
-		});
-	}
-
-	public void testRemoveAll() throws Exception {
-		Collection elements = Arrays.asList(new String[] { "1", "2" });
-		set.addAll(elements);
-
-		assertEquals(2, bean.getArray().length);
-		set.removeAll(elements);
-
-		assertEquals(0, bean.getArray().length);
-	}
-
-	public void testRemoveAll_SetChangeEvent() throws Exception {
-		Collection elements = Arrays.asList(new String[] { "1", "2" });
-		set.addAll(elements);
-
-		SetChangeEventTracker listener = SetChangeEventTracker.observe(set);
-		assertEquals(0, listener.count);
-
-		set.removeAll(elements);
-
-		SetChangeEvent event = listener.event;
-		assertEquals(set, event.getObservableSet());
-		assertEquals(Collections.EMPTY_SET, event.diff.getAdditions());
-		assertEquals(new HashSet(elements), event.diff.getRemovals());
-	}
-
-	public void testRemoveAllPropertyChangeEvent() throws Exception {
-		set.add("0");
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				set.removeAll(Arrays.asList(new String[] { "0" }));
-			}
-		});
-	}
-
-	public void testRetailAll() throws Exception {
-		set.addAll(Arrays.asList(new String[] { "0", "1", "2", "3" }));
-
-		assertEquals(4, bean.getArray().length);
-
-		set.retainAll(Arrays.asList(new String[] { "0", "1" }));
-		assertEquals(2, bean.getArray().length);
-
-		assertTrue(set.containsAll(Arrays.asList(new String[] { "1", "0" })));
-	}
-
-	public void testRetainAll_SetChangeEvent() throws Exception {
-		set.addAll(Arrays.asList(new String[] { "0", "1", "2", "3" }));
-
-		SetChangeEventTracker listener = SetChangeEventTracker.observe(set);
-
-		assertEquals(0, listener.count);
-		set.retainAll(Arrays.asList(new String[] { "0", "1" }));
-
-		assertEquals(1, listener.count);
-		SetChangeEvent event = listener.event;
-		assertEquals(set, event.getObservableSet());
-		assertEquals(Collections.EMPTY_SET, event.diff.getAdditions());
-		assertEquals(new HashSet(Arrays.asList(new String[] { "2", "3" })),
-				event.diff.getRemovals());
-	}
-
-	public void testRetainAllPropertyChangeEvent() throws Exception {
-		set.addAll(Arrays.asList(new String[] { "0", "1" }));
-
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				set.retainAll(Arrays.asList(new String[] { "0" }));
-			}
-		});
-	}
-
-	public void testSetChangeEventFiresWhenNewSetIsSet() throws Exception {
-		Bean[] elements = new Bean[] { new Bean(), new Bean() };
-
-		SetChangeEventTracker listener = SetChangeEventTracker.observe(set);
-
-		assertEquals(0, listener.count);
-		bean.setArray(elements);
-		assertEquals(1, listener.count);
-	}
-
-	public void testSetBeanProperty_CorrectForNullOldAndNewValues() {
-		// The java bean spec allows the old and new values in a
-		// PropertyChangeEvent to be null, which indicates that an unknown
-		// change occured.
-
-		// This test ensures that JavaBeanObservableValue fires the correct
-		// value diff even if the bean implementor is lazy :-P
-
-		Bean bean = new AnnoyingBean();
-		bean.setArray(new Object[] { "old" });
-		IObservableSet observable = BeansObservables.observeSet(
-				new CurrentRealm(true), bean, "array");
-		SetChangeEventTracker tracker = SetChangeEventTracker
-				.observe(observable);
-		bean.setArray(new Object[] { "new" });
-		assertEquals(1, tracker.count);
-		assertEquals(Collections.singleton("old"), tracker.event.diff
-				.getRemovals());
-		assertEquals(Collections.singleton("new"), tracker.event.diff
-				.getAdditions());
-	}
-
-	private static void assertPropertyChangeEvent(Bean bean, Runnable runnable) {
-		PropertyChangeTracker listener = new PropertyChangeTracker();
-		bean.addPropertyChangeListener(listener);
-
-		Object[] old = bean.getArray();
-		assertEquals(0, listener.count);
-
-		runnable.run();
-
-		PropertyChangeEvent event = listener.evt;
-		assertEquals("event did not fire", 1, listener.count);
-		assertEquals("array", event.getPropertyName());
-		assertTrue("old value", Arrays.equals(old, (Object[]) event
-				.getOldValue()));
-		assertTrue("new value", Arrays.equals(bean.getArray(), (Object[]) event.getNewValue()));
-		assertFalse("sets are equal", Arrays.equals(bean.getArray(), old));
-	}
-
-	private static class PropertyChangeTracker implements
-			PropertyChangeListener {
-		int count;
-
-		PropertyChangeEvent evt;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
-		 */
-		public void propertyChange(PropertyChangeEvent evt) {
-			count++;
-			this.evt = evt;
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(JavaBeanObservableArrayBasedSetTest.class.getName());
-		suite.addTestSuite(JavaBeanObservableArrayBasedSetTest.class);
-		suite.addTest(MutableObservableSetContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableCollectionContractDelegate {
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			String propertyName = "array";
-			PropertyDescriptor propertyDescriptor;
-			try {
-				propertyDescriptor = new PropertyDescriptor(propertyName,
-						Bean.class);
-			} catch (IntrospectionException e) {
-				throw new RuntimeException(e);
-			}
-			Object bean = new Bean(new Object[0]);
-
-			IObservableSet set = new JavaBeanObservableSet(realm, bean,
-					propertyDescriptor, String.class);
-			for (int i = 0; i < elementCount; i++)
-				set.add(createElement(set));
-			return set;
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object().toString();
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return String.class;
-		}
-
-		public void change(IObservable observable) {
-			IObservableSet set = (IObservableSet) observable;
-			set.add(createElement(set));
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableListTest.java
deleted file mode 100644
index 9fac964..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableListTest.java
+++ /dev/null
@@ -1,587 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bugs 221351, 213145, 244098, 246103
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.IntrospectionException;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyDescriptor;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableList;
-import org.eclipse.jface.databinding.conformance.MutableObservableListContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.ListChangeEventTracker;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 1.1
- */
-public class JavaBeanObservableListTest extends AbstractDefaultRealmTestCase {
-	private JavaBeanObservableList list;
-
-	private PropertyDescriptor propertyDescriptor;
-
-	private Bean bean;
-
-	private String propertyName;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		propertyName = "list";
-		propertyDescriptor = new PropertyDescriptor(propertyName, Bean.class);
-		bean = new Bean(new ArrayList());
-
-		list = new JavaBeanObservableList(SWTObservables.getRealm(Display
-				.getDefault()), bean, propertyDescriptor, String.class);
-	}
-
-	public void testGetObserved() throws Exception {
-		assertEquals(bean, list.getObserved());
-	}
-
-	public void testGetPropertyDescriptor() throws Exception {
-		assertEquals(propertyDescriptor, list.getPropertyDescriptor());
-	}
-
-	public void testRegistersListenerOnCreation() throws Exception {
-		assertTrue(bean.changeSupport.hasListeners(propertyName));
-	}
-
-	public void testRemovesListenerOnDisposal() throws Exception {
-		list.dispose();
-		assertFalse(bean.changeSupport.hasListeners(propertyName));
-	}
-
-	public void testFiresListChangeEvents() throws Exception {
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		assertEquals(0, listener.count);
-		bean.setList(Arrays.asList(new String[] { "value" }));
-		assertEquals(1, listener.count);
-	}
-
-	public void testAddAddsElement() throws Exception {
-		int count = list.size();
-		String element = "1";
-
-		assertEquals(0, count);
-		list.add(element);
-		assertEquals(count + 1, list.size());
-		assertEquals(element, bean.getList().get(count));
-	}
-
-	public void testAddListChangeEvent() throws Exception {
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		assertEquals(0, listener.count);
-		String element = "1";
-
-		list.add(element);
-
-		assertEquals(1, listener.count);
-		ListChangeEvent event = listener.event;
-
-		assertEquals(list, event.getObservableList());
-		assertEntry(event.diff.getDifferences()[0], true, 0, element);
-	}
-
-	public void testAddFiresPropertyChangeEvent() throws Exception {
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.add("0");
-			}			
-		});
-	}
-
-	public void testAddAtIndex() throws Exception {
-		String element = "1";
-		assertEquals(0, list.size());
-
-		list.add(0, element);
-		assertEquals(element, bean.getList().get(0));
-	}
-
-	public void testAddAtIndexListChangeEvent() throws Exception {
-		String element = "1";
-		assertEquals(0, list.size());
-
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		list.add(0, element);
-
-		ListChangeEvent event = listener.event;
-		assertEntry(event.diff.getDifferences()[0], true, 0, element);
-	}
-	
-	public void testAddAtIndexPropertyChangeEvent() throws Exception {
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.add(0, "0");
-			}			
-		});
-	}
-
-	public void testClear() throws Exception {
-		String element = "1";
-		list.add(element);
-
-		assertEquals(1, bean.getList().size());
-		assertPropertyChangeEvent(bean, new Runnable(){
-			public void run() {
-				list.clear();
-			}
-		});
-		assertEquals(0, bean.getList().size());
-	}
-
-	public void testRemove() throws Exception {
-		String element = "1";
-		list.add(element);
-		
-		assertEquals(1, bean.getList().size());
-		list.remove(element);
-		assertEquals(0, bean.getList().size());
-	}
-	
-	public void testRemoveListChangeEvent() throws Exception {
-		String element = "1";
-		list.add(element);
-
-		assertEquals(1, list.size());
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		list.remove(element);
-
-		assertEquals(1, listener.count);
-		ListChangeEvent event = listener.event;
-		assertEquals(list, event.getObservableList());
-		assertEntry(event.diff.getDifferences()[0], false, 0, element);
-	}
-	
-	public void testRemovePropertyChangeEvent() throws Exception {
-		list.add("0");
-		
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.remove("0");
-			}			
-		});
-	}
-
-	public void testRemoveAtIndex() throws Exception {
-		String element = "1";
-		list.add(element);
-
-		assertEquals(element, bean.getList().get(0));
-
-		list.remove(0);
-		assertEquals(0, bean.getList().size());
-	}
-
-	public void testRemoveAtIndexListChangeEvent() throws Exception {
-		String element = "1";
-		list.add(element);
-
-		assertEquals(1, list.size());
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		list.remove(0);
-
-		assertEquals(1, listener.count);
-		ListChangeEvent event = listener.event;
-		assertEquals(list, event.getObservableList());
-		assertEntry(event.diff.getDifferences()[0], false, 0, element);
-	}
-	
-	public void testRemoveAtIndexPropertyChangeEvent() throws Exception {
-		list.add("0");
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.remove(0);
-			}			
-		});
-	}
-
-	public void testAddAll() throws Exception {
-		Collection elements = Arrays.asList(new String[] { "1", "2" });
-		assertEquals(0, list.size());
-
-		list.addAll(elements);
-
-		assertEquals(2, bean.getList().size());
-	}
-
-	public void testAddAllListChangEvent() throws Exception {
-		List elements = Arrays.asList(new String[] { "1", "2" });
-		assertEquals(0, list.size());
-
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-		assertEquals(0, listener.count);
-
-		list.addAll(elements);
-
-		assertEquals(1, listener.count);
-		ListChangeEvent event = listener.event;
-		assertEquals(list, event.getObservableList());
-
-		assertEntry(event.diff.getDifferences()[0], true, 0, elements.get(0));
-		assertEntry(event.diff.getDifferences()[1], true, 1, elements.get(1));
-	}
-	
-	public void testAddAllPropertyChangeEvent() throws Exception {
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.addAll(Arrays.asList(new String[] {"0", "1"}));
-			}			
-		});
-	}
-
-	public void testAddAllAtIndex() throws Exception {
-		List elements = Arrays.asList(new String[] { "1", "2" });
-		list.addAll(elements);
-
-		assertEquals(2, list.size());
-
-		list.addAll(2, elements);
-
-		assertEquals(4, bean.getList().size());
-		assertEquals(elements.get(0), bean.getList().get(0));
-		assertEquals(elements.get(1), bean.getList().get(1));
-	}
-
-	public void testAddAllAtIndexListChangeEvent() throws Exception {
-		List elements = Arrays.asList(new String[] { "1", "2" });
-		list.addAll(elements);
-
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		assertEquals(0, listener.count);
-
-		list.addAll(2, elements);
-
-		assertEquals(1, listener.count);
-		ListChangeEvent event = listener.event;
-		assertEquals(list, event.getObservableList());
-		assertEntry(event.diff.getDifferences()[0], true, 2, elements.get(0));
-		assertEntry(event.diff.getDifferences()[1], true, 3, elements.get(1));
-	}
-	
-	public void testAddAllAtIndexPropertyChangeEvent() throws Exception {
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.addAll(0, Arrays.asList(new String[] {"1", "2"}));
-			}			
-		});
-	}
-
-	public void testRemoveAll() throws Exception {
-		List elements = Arrays.asList(new String[] { "1", "2" });
-		list.addAll(elements);
-		list.addAll(elements);
-
-		assertEquals(4, bean.getList().size());
-		list.removeAll(elements);
-
-		assertEquals(2, bean.getList().size());
-		assertEquals(elements.get(0), bean.getList().get(0));
-		assertEquals(elements.get(1), bean.getList().get(1));
-	}
-
-	public void testRemoveAllListChangeEvent() throws Exception {
-		List elements = Arrays.asList(new String[] { "1", "2" });
-		list.addAll(elements);
-		list.addAll(elements);
-
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		assertEquals(0, listener.count);
-		list.removeAll(elements);
-
-		ListChangeEvent event = listener.event;
-		assertEquals(list, event.getObservableList());
-		assertEntry(event.diff.getDifferences()[0], false, 0, elements.get(0));
-		assertEntry(event.diff.getDifferences()[1], false, 0, elements.get(1));
-	}
-	
-	public void testRemoveAllPropertyChangeEvent() throws Exception {
-		list.add("0");
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.removeAll(Arrays.asList(new String[] {"0"}));
-			}			
-		});
-	}
-
-	public void testRetailAll() throws Exception {
-		List elements = Arrays.asList(new String[] { "0", "1", "2", "3" });
-		list.addAll(elements);
-
-		assertEquals(4, bean.getList().size());
-
-		list.retainAll(elements.subList(0, 2));
-		assertEquals(2, bean.getList().size());
-
-		assertEquals(elements.get(0), bean.getList().get(0));
-		assertEquals(elements.get(1), bean.getList().get(1));
-	}
-
-	public void testRetainAllListChangeEvent() throws Exception {
-		List elements = Arrays.asList(new String[] { "0", "1", "2", "3" });
-		list.addAll(elements);
-
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		assertEquals(0, listener.count);
-		list.retainAll(elements.subList(0, 2));
-
-		assertEquals(1, listener.count);
-		ListChangeEvent event = listener.event;
-		assertEquals(list, event.getObservableList());
-		assertEntry(event.diff.getDifferences()[0], false, 2, elements.get(2));
-		assertEntry(event.diff.getDifferences()[1], false, 2, elements.get(3));
-	}
-	
-	public void testRetainAllPropertyChangeEvent() throws Exception {
-		list.addAll(Arrays.asList(new String[] {"0", "1"}));
-		
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.retainAll(Arrays.asList(new String[] {"0"}));
-			}			
-		});
-	}
-
-	public void testSet() throws Exception {
-		String oldElement = "old";
-		String newElement = "new";
-		list.add(oldElement);
-
-		assertEquals(oldElement, bean.getList().get(0));
-
-		list.set(0, newElement);
-		assertEquals(newElement, bean.getList().get(0));
-	}
-
-	public void testMove() throws Exception {
-		String element0 = "element0";
-		String element1 = "element1";
-		list.add(element0);
-		list.add(element1);
-
-		assertEquals(2, bean.getList().size());
-		assertEquals(element0, bean.getList().get(0));
-		assertEquals(element1, bean.getList().get(1));
-
-		list.move(0, 1);
-
-		assertEquals(2, bean.getList().size());
-		assertEquals(element1, bean.getList().get(0));
-		assertEquals(element0, bean.getList().get(1));
-	}
-
-	public void testSetListChangeEvent() throws Exception {
-		String oldElement = "old";
-		String newElement = "new";
-		list.add(oldElement);
-
-		ListChangeEventTracker listener = ListChangeEventTracker.observe(list);
-		assertEquals(0, listener.count);
-
-		list.set(0, newElement);
-
-		assertEquals(1, listener.count);
-		ListChangeEvent event = listener.event;
-		assertEquals(list, event.getObservableList());
-		assertEntry(event.diff.getDifferences()[0], false, 0, oldElement);
-		assertEntry(event.diff.getDifferences()[1], true, 0, newElement);
-	}
-
-	public void testSetPropertyChangeEvent() throws Exception {
-		list.add("0");
-		assertPropertyChangeEvent(bean, new Runnable() {
-			public void run() {
-				list.set(0, "1");
-			}			
-		});
-	}
-
-	public void testListChangeEventFiresWhenNewListIsSet() throws Exception {
-		List elements = Arrays.asList(new String[] { "1", "2" });
-
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		list.addListChangeListener(listener);
-
-		assertEquals(0, listener.count);
-		bean.setList(elements);
-		assertEquals(1, listener.count);
-	}
-
-	public void testConstructor_RegistersListener() throws Exception {
-		Bean bean = new Bean();
-		new JavaBeanObservableList(Realm.getDefault(), bean,
-				new PropertyDescriptor("list", Bean.class), Bean.class);
-
-		assertTrue(bean.hasListeners("list"));
-	}
-
-	public void testConstructor_SkipsRegisterListener() throws Exception {
-		Bean bean = new Bean();
-		JavaBeanObservableList observable = new JavaBeanObservableList(Realm
-				.getDefault(), bean,
-				new PropertyDescriptor("list", Bean.class), Bean.class, false);
-
-		assertFalse(bean.hasListeners("list"));
-		ChangeEventTracker.observe(observable);
-		assertFalse(bean.hasListeners("list"));
-	}
-
-	public void testSetBeanProperty_CorrectForNullOldAndNewValues() {
-		// The java bean spec allows the old and new values in a
-		// PropertyChangeEvent to be null, which indicates that an unknown
-		// change occured.
-
-		// This test ensures that JavaBeanObservableValue fires the correct
-		// value diff even if the bean implementor is lazy :-P
-
-		Bean bean = new AnnoyingBean();
-		bean.setList(Collections.singletonList("old"));
-		IObservableList observable = BeansObservables.observeList(
-				new CurrentRealm(true), bean, "list");
-		ListChangeEventTracker tracker = ListChangeEventTracker
-				.observe(observable);
-		bean.setList(Collections.singletonList("new"));
-
-		assertEquals(1, tracker.count);
-		
-		List list = new ArrayList();
-		list.add("old");
-		tracker.event.diff.applyTo(list);
-		assertEquals(Collections.singletonList("new"), list);
-	}
-
-	private static void assertEntry(ListDiffEntry entry, boolean addition,
-			int position, Object element) {
-		assertEquals("addition", addition, entry.isAddition());
-		assertEquals("position", position, entry.getPosition());
-		assertEquals("element", element, entry.getElement());
-	}
-
-	private static void assertPropertyChangeEvent(Bean bean, Runnable runnable) {
-		PropertyChangeTracker listener = new PropertyChangeTracker();
-		bean.addPropertyChangeListener(listener);
-		
-		List old = bean.getList();
-		assertEquals(0, listener.count);
-		
-		runnable.run();
-		
-		PropertyChangeEvent event = listener.evt;
-		assertEquals("event did not fire", 1, listener.count);
-		assertEquals("list", event.getPropertyName());
-		assertEquals("old value", old, event.getOldValue());
-		assertEquals("new value", bean.getList(), event.getNewValue());
-		assertFalse("lists are equal", bean.getList().equals(old));
-	}
-	
-	private static class PropertyChangeTracker implements
-			PropertyChangeListener {
-		int count;
-
-		PropertyChangeEvent evt;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
-		 */
-		public void propertyChange(PropertyChangeEvent evt) {
-			count++;
-			this.evt = evt;
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(JavaBeanObservableListTest.class.getName());
-		suite.addTestSuite(JavaBeanObservableListTest.class);
-		suite.addTest(MutableObservableListContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableCollectionContractDelegate {
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			String propertyName = "list";
-			PropertyDescriptor propertyDescriptor;
-			try {
-				propertyDescriptor = new PropertyDescriptor(propertyName,
-						Bean.class);
-			} catch (IntrospectionException e) {
-				throw new RuntimeException(e);
-			}
-			Object bean = new Bean(new ArrayList());
-
-			IObservableList list = new JavaBeanObservableList(realm, bean,
-					propertyDescriptor, String.class);
-			for (int i = 0; i < elementCount; i++)
-				list.add(createElement(list));
-			return list;
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object().toString();
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return String.class;
-		}
-
-		public void change(IObservable observable) {
-			IObservableList list = (IObservableList) observable;
-			list.add(createElement(list));
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableMapTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableMapTest.java
deleted file mode 100644
index 6df02ae..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableMapTest.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bugs 213145, 241585, 246103
- *******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.PropertyDescriptor;
-import java.util.Collections;
-import java.util.HashSet;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.map.IMapChangeListener;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.map.MapChangeEvent;
-import org.eclipse.core.databinding.observable.map.MapDiff;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableMap;
-import org.eclipse.core.tests.databinding.observable.ThreadRealm;
-import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.MapChangeEventTracker;
-
-/**
- * @since 3.2
- * 
- */
-public class JavaBeanObservableMapTest extends TestCase {
-	private Bean model1;
-
-	private Bean model2;
-
-	private WritableSet set;
-
-	private PropertyDescriptor propertyDescriptor;
-
-	private JavaBeanObservableMap map;
-
-	protected void setUp() throws Exception {
-		ThreadRealm realm = new ThreadRealm();
-		realm.init(Thread.currentThread());
-		model1 = new Bean("1");
-		model2 = new Bean("2");
-
-		set = new WritableSet(realm, new HashSet(), Bean.class);
-		set.add(model1);
-		set.add(model2);
-
-		propertyDescriptor = new PropertyDescriptor("value", Bean.class);
-		map = new JavaBeanObservableMap(set, propertyDescriptor);
-	}
-
-	public void testGetValue() throws Exception {
-		assertEquals(
-				"The 'value' from the map should be the value of the property of the model.",
-				model1.getValue(), map.get(model1));
-	}
-
-	public void testGetValue_KeyOutOfDomain() {
-		Bean model3 = new Bean("3");
-		assertFalse(map.containsKey(model3));
-		assertFalse(model3.getValue().equals(map.get(model3)));
-	}
-
-	public void testSetValueNotifications() throws Exception {
-		String oldValue = model1.getValue();
-		String newValue = model1.getValue() + model1.getValue();
-		MapChangeListener listener = new MapChangeListener();
-
-		map.addMapChangeListener(listener);
-		assertEquals(0, listener.count);
-		model1.setValue(newValue);
-		assertEquals(1, listener.count);
-		assertTrue(listener.diff.getChangedKeys().contains(model1));
-		assertEquals(newValue, listener.diff.getNewValue(model1));
-		assertEquals(oldValue, listener.diff.getOldValue(model1));
-		assertFalse(listener.diff.getAddedKeys().contains(model1));
-		assertFalse(listener.diff.getRemovedKeys().contains(model1));
-	}
-
-	public void testPutValue() throws Exception {
-		String oldValue = model1.getValue();
-		String newValue = model1.getValue() + model1.getValue();
-		MapChangeListener listener = new MapChangeListener();
-		map.addMapChangeListener(listener);
-
-		assertEquals(0, listener.count);
-		map.put(model1, newValue);
-		assertEquals(1, listener.count);
-		assertEquals(newValue, model1.getValue());
-		assertEquals(oldValue, listener.diff.getOldValue(model1));
-		assertEquals(newValue, listener.diff.getNewValue(model1));
-		assertFalse(listener.diff.getAddedKeys().contains(model1));
-		assertTrue(listener.diff.getChangedKeys().contains(model1));
-		assertFalse(listener.diff.getRemovedKeys().contains(model1));
-	}
-
-	public void testAddKey() throws Exception {
-		MapChangeListener listener = new MapChangeListener();
-		map.addMapChangeListener(listener);
-
-		Bean model3 = new Bean("3");
-
-		assertEquals(0, listener.count);
-		set.add(model3);
-		assertEquals(1, listener.count);
-		assertTrue(listener.diff.getAddedKeys().contains(model3));
-		assertEquals(model3.getValue(), map.get(model3));
-
-		String newValue = model3.getValue() + model3.getValue();
-		model3.setValue(newValue);
-		assertEquals(2, listener.count);
-		assertEquals(3, map.size());
-	}
-
-	public void testRemoveKey() throws Exception {
-		MapChangeListener listener = new MapChangeListener();
-		map.addMapChangeListener(listener);
-
-		assertEquals(0, listener.count);
-		set.remove(model1);
-		assertEquals(1, listener.count);
-		assertFalse(listener.diff.getAddedKeys().contains(model1));
-		assertFalse(listener.diff.getChangedKeys().contains(model1));
-		assertTrue(listener.diff.getRemovedKeys().contains(model1));
-		assertEquals(1, map.size());
-	}
-	
-	public void testGetObserved() throws Exception {
-		assertEquals(set, map.getObserved());
-	}
-	
-	public void testGetPropertyDescriptor() throws Exception {
-		assertEquals(propertyDescriptor, map.getPropertyDescriptor());
-	}
-	
-	public void testConstructor_SkipRegisterListeners() throws Exception {
-		Realm realm = new CurrentRealm(true);
-		WritableSet set = new WritableSet(realm);
-		Bean bean = new Bean();
-		set.add(bean);
-		
-		JavaBeanObservableMap observable = new JavaBeanObservableMap(set, new PropertyDescriptor("value", Bean.class), false);
-		ChangeEventTracker.observe(observable);
-
-		assertFalse(bean.hasListeners("value"));
-	}
-	
-	public void testConstructor_RegistersListeners() throws Exception {
-		Realm realm = new CurrentRealm(true);
-		WritableSet set = new WritableSet(realm);
-		Bean bean = new Bean();
-		set.add(bean);
-		
-		JavaBeanObservableMap observable = new JavaBeanObservableMap(set, new PropertyDescriptor("value", Bean.class));
-		ChangeEventTracker.observe(observable);
-
-		assertTrue(bean.hasListeners("value"));
-	}
-
-	public void testSetBeanProperty_CorrectForNullOldAndNewValues() {
-		// The java bean spec allows the old and new values in a
-		// PropertyChangeEvent to be null, which indicates that an unknown
-		// change occured.
-
-		// This test ensures that JavaBeanObservableValue fires the correct
-		// value diff even if the bean implementor is lazy :-P
-
-		WritableSet set = new WritableSet(new CurrentRealm(true));
-
-		Bean bean = new AnnoyingBean();
-		bean.setValue("old");
-		set.add(bean);
-
-		IObservableMap map = BeansObservables.observeMap(set, Bean.class,
-				"value");
-		MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
-
-		bean.setValue("new");
-
-		assertEquals(1, tracker.count);
-
-		assertEquals(Collections.EMPTY_SET, tracker.event.diff.getAddedKeys());
-		assertEquals(Collections.singleton(bean), tracker.event.diff
-				.getChangedKeys());
-		assertEquals(Collections.EMPTY_SET, tracker.event.diff.getRemovedKeys());
-
-		assertEquals("old", tracker.event.diff.getOldValue(bean));
-		assertEquals("new", tracker.event.diff.getNewValue(bean));
-	}
-
-	private static class MapChangeListener implements IMapChangeListener {
-		int count;
-
-		MapDiff diff;
-
-		public void handleMapChange(MapChangeEvent event) {
-			count++;
-			this.diff = event.diff;
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(JavaBeanObservableMapTest.class.getName());
-		suite.addTestSuite(JavaBeanObservableMapTest.class);
-		return suite;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableSetTest.java
deleted file mode 100644
index 816243a..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableSetTest.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bugs 221351, 213145, 244098, 246103
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.IntrospectionException;
-import java.beans.PropertyDescriptor;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableSet;
-import org.eclipse.jface.databinding.conformance.MutableObservableSetContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.SetChangeEventTracker;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 3.3
- */
-public class JavaBeanObservableSetTest extends TestCase {
-	private JavaBeanObservableSet observableSet;
-	private Bean bean;
-	private PropertyDescriptor propertyDescriptor;
-	private String propertyName;
-	private SetChangeListener listener;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		bean = new Bean();
-		propertyName = "set";
-		propertyDescriptor = new PropertyDescriptor(propertyName, Bean.class);
-
-		observableSet = new JavaBeanObservableSet(SWTObservables
-				.getRealm(Display.getDefault()), bean, propertyDescriptor,
-				Bean.class);
-		listener = new SetChangeListener();
-	}
-
-	public void testGetObserved() throws Exception {
-		assertEquals(bean, observableSet.getObserved());
-	}
-
-	public void testGetPropertyDescriptor() throws Exception {
-		assertEquals(propertyDescriptor, observableSet.getPropertyDescriptor());
-	}
-	
-	public void testGetElementType() throws Exception {
-		assertEquals(Bean.class, observableSet.getElementType());
-	}
-	
-	public void testRegistersListenerOnCreation() throws Exception {
-		assertTrue(bean.changeSupport.hasListeners(propertyName));
-	}
-		
-	public void testRemovesListenerOnDisposal() throws Exception {
-		observableSet.dispose();
-		assertFalse(bean.changeSupport.hasListeners(propertyName));
-	}
-	
-	public void testFiresChangeEvents() throws Exception {
-		observableSet.addSetChangeListener(listener);
-		assertEquals(0, listener.count);
-		bean.setSet(new HashSet(Arrays.asList(new String[] {"1"})));
-		assertEquals(1, listener.count);
-	}
-
-	public void testConstructor_RegisterListeners() throws Exception {
-		bean = new Bean();
-		new JavaBeanObservableSet(new CurrentRealm(true), bean,
-				propertyDescriptor, Bean.class);
-		assertTrue(bean.hasListeners(propertyName));
-	}
-
-	public void testConstructor_SkipsRegisterListeners() throws Exception {
-		bean = new Bean();
-
-		observableSet = new JavaBeanObservableSet(new CurrentRealm(true), bean,
-				propertyDescriptor, Bean.class, false);
-		assertFalse(bean.hasListeners(propertyName));
-		ChangeEventTracker.observe(observableSet);
-		assertFalse(bean.hasListeners(propertyName));
-	}
-
-	public void testSetBeanProperty_CorrectForNullOldAndNewValues() {
-		// The java bean spec allows the old and new values in a
-		// PropertyChangeEvent to be null, which indicates that an unknown
-		// change occured.
-
-		// This test ensures that JavaBeanObservableValue fires the correct
-		// value diff even if the bean implementor is lazy :-P
-
-		Bean bean = new AnnoyingBean();
-		bean.setSet(Collections.singleton("old"));
-		IObservableSet observable = BeansObservables.observeSet(
-				new CurrentRealm(true), bean, "set");
-		SetChangeEventTracker tracker = SetChangeEventTracker
-				.observe(observable);
-		bean.setSet(Collections.singleton("new"));
-		assertEquals(1, tracker.count);
-		assertEquals(Collections.singleton("old"), tracker.event.diff
-				.getRemovals());
-		assertEquals(Collections.singleton("new"), tracker.event.diff
-				.getAdditions());
-	}
-
-	static class SetChangeListener implements ISetChangeListener {
-		int count;
-		public void handleSetChange(SetChangeEvent event) {
-			count++;
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(JavaBeanObservableSetTest.class.getName());
-		suite.addTestSuite(JavaBeanObservableSetTest.class);
-		suite.addTest(MutableObservableSetContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	private static class Delegate extends
-			AbstractObservableCollectionContractDelegate {
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			Bean bean = new Bean();
-			String propertyName = "set";
-			PropertyDescriptor propertyDescriptor;
-			try {
-				propertyDescriptor = new PropertyDescriptor(propertyName,
-						Bean.class);
-			} catch (IntrospectionException e) {
-				throw new RuntimeException(e);
-			}
-
-			IObservableSet set = new JavaBeanObservableSet(realm,
-					bean, propertyDescriptor, String.class);
-			for (int i = 0; i < elementCount; i++)
-				set.add(createElement(set));
-			return set;
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object();
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return String.class;
-		}
-
-		public void change(IObservable observable) {
-			IObservableSet set = (IObservableSet) observable;
-			set.add(createElement(set));
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableValueTest.java
deleted file mode 100644
index a7e1012..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableValueTest.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Brad Reynolds - bug 171616
- *     Katarzyna Marszalek - test case for bug 198519
- *     Matthew Hall - bug 213145, 246103
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.IntrospectionException;
-import java.beans.PropertyDescriptor;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.ComputedValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.internal.databinding.beans.JavaBeanObservableValue;
-import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.examples.databinding.model.SimplePerson;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.2
- */
-public class JavaBeanObservableValueTest extends AbstractDefaultRealmTestCase {
-	private Bean bean;
-	private JavaBeanObservableValue observableValue;
-	private PropertyDescriptor propertyDescriptor;
-	private String propertyName;
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		bean = new Bean();
-		propertyName = "value";
-		propertyDescriptor = new PropertyDescriptor(propertyName, Bean.class);
-		observableValue = new JavaBeanObservableValue(Realm.getDefault(), bean, propertyDescriptor);
-	}
-
-	public void testGetObserved() throws Exception {
-		assertEquals(bean, observableValue.getObserved());
-	}
-
-	public void testGetPropertyDescriptor() throws Exception {
-    	assertEquals(propertyDescriptor, observableValue.getPropertyDescriptor());
-	}
-
-	public void testSetValueThrowsExceptionThrownByBean() throws Exception {
-		ThrowsSetException temp = new ThrowsSetException();
-		JavaBeanObservableValue observable = new JavaBeanObservableValue(Realm
-				.getDefault(), temp,
-				new PropertyDescriptor("value", ThrowsSetException.class));
-
-		try {
-			observable.setValue("");
-			fail("exception should have been thrown");
-		} catch (RuntimeException e) {	
-			assertEquals(temp.thrownException, e.getCause());
-		}
-	}
-	
-	public void testGetValueThrowsExceptionThrownByBean() throws Exception {
-		ThrowsGetException temp = new ThrowsGetException();
-		JavaBeanObservableValue observable = new JavaBeanObservableValue(Realm
-				.getDefault(), temp,
-				new PropertyDescriptor("value", ThrowsGetException.class));
-
-		try {
-			observable.getValue();
-			fail("exception should have been thrown");
-		} catch (RuntimeException e) {	
-			assertEquals(temp.thrownException, e.getCause());
-		}
-	}
-	
-	public void testBug198519() {
-		final SimplePerson person = new SimplePerson();
-		final ComputedValue cv = new ComputedValue() {
-            final IObservableValue name = BeansObservables.observeValue(person, "name"); //$NON-NLS-1$
-            protected Object calculate() {
-                return Boolean.valueOf(name.getValue() != null);
-            }
-        };
-        cv.addChangeListener(new IChangeListener() {
-        	public void handleChange(ChangeEvent event) {
-        		cv.getValue();
-        	}
-        });
-        person.setName("foo");
-	}
-
-	public void testConstructor_RegistersListeners() throws Exception {
-		JavaBeanObservableValue observable = new JavaBeanObservableValue(Realm.getDefault(), bean, propertyDescriptor);
-		ChangeEventTracker.observe(observable);
-		
-		assertTrue(bean.hasListeners(propertyName));
-	}
-	
-	public void testConstructor_SkipRegisterListeners() throws Exception {
-		JavaBeanObservableValue observable = new JavaBeanObservableValue(Realm.getDefault(), bean, propertyDescriptor, false);
-		ChangeEventTracker.observe(observable);
-		
-		assertFalse(bean.hasListeners(propertyName));
-	}
-	
-	public void testSetBeanProperty_CorrectForNullOldAndNewValues() {
-		// The java bean spec allows the old and new values in a PropertyChangeEvent to
-		// be null, which indicates that an unknown change occured.
-
-		// This test ensures that JavaBeanObservableValue fires the correct value diff
-		// even if the bean implementor is lazy :-P
-
-		Bean bean = new AnnoyingBean();
-		bean.setValue("old");
-		IObservableValue observable = BeansObservables.observeValue(bean, "value");
-		ValueChangeEventTracker tracker = ValueChangeEventTracker.observe(observable);
-		bean.setValue("new");
-		assertEquals(1, tracker.count);
-		assertEquals("old", tracker.event.diff.getOldValue());
-		assertEquals("new", tracker.event.diff.getNewValue());
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(JavaBeanObservableValueTest.class.getName());
-		suite.addTestSuite(JavaBeanObservableValueTest.class);
-		suite.addTest(MutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */ static class Delegate extends AbstractObservableValueContractDelegate {
-		private Bean bean;
-		
-		public void setUp() {
-			super.setUp();
-			
-			bean = new Bean("");
-		}
-		
-		public IObservableValue createObservableValue(Realm realm) {
-			try {
-				PropertyDescriptor propertyDescriptor = new PropertyDescriptor("value", Bean.class);
-				return new JavaBeanObservableValue(realm, bean,
-						propertyDescriptor);					
-			} catch (IntrospectionException e) {
-				throw new RuntimeException(e);
-			}
-		}
-		
-		public void change(IObservable observable) {
-			IObservableValue observableValue = (IObservableValue) observable;
-			observableValue.setValue(createValue(observableValue));
-		}
-		
-		public Object getValueType(IObservableValue observable) {
-			return String.class;
-		}
-		
-		public Object createValue(IObservableValue observable) {
-			return observable.getValue() + "a";
-		}
-	}
-	
-	/**
-	 * Throws an exception when the value is set.
-	 * 
-	 * @since 3.2
-	 */
-	/* package */class ThrowsSetException {
-		private String value;
-
-		/* package */NullPointerException thrownException;
-
-		public void setValue(String value) {
-			throw thrownException = new NullPointerException();
-		}
-
-		public String getValue() {
-			return value;
-		}
-	}
-
-	/* package */class ThrowsGetException {
-		public String value;
-
-		/* package */NullPointerException thrownException;
-
-		public String getValue() {
-			throw thrownException = new NullPointerException();
-		}
-
-		public void setValue(String value) {
-			this.value = value;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanPropertyObservableMapTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanPropertyObservableMapTest.java
deleted file mode 100644
index bcd9899..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanPropertyObservableMapTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 246103)
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.util.Collections;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.MapChangeEventTracker;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.2
- * 
- */
-public class JavaBeanPropertyObservableMapTest extends
-		AbstractDefaultRealmTestCase {
-	public void testSetBeanProperty_CorrectForNullOldAndNewValues() {
-		// The java bean spec allows the old and new values in a
-		// PropertyChangeEvent to be null, which indicates that an unknown
-		// change occured.
-
-		// This test ensures that JavaBeanObservableValue fires the correct
-		// value diff even if the bean implementor is lazy :-P
-
-		Bean bean = new AnnoyingBean();
-		bean.setMap(Collections.singletonMap("key", "old"));
-
-		IObservableMap map = BeansObservables.observeMap(
-				new CurrentRealm(true), bean, "map");
-		MapChangeEventTracker tracker = MapChangeEventTracker.observe(map);
-
-		bean.setMap(Collections.singletonMap("key", "new"));
-
-		assertEquals(1, tracker.count);
-
-		assertEquals(Collections.EMPTY_SET, tracker.event.diff.getAddedKeys());
-		assertEquals(Collections.singleton("key"), tracker.event.diff
-				.getChangedKeys());
-		assertEquals(Collections.EMPTY_SET, tracker.event.diff.getRemovedKeys());
-
-		assertEquals("old", tracker.event.diff.getOldValue("key"));
-		assertEquals("new", tracker.event.diff.getNewValue("key"));
-	}
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/ListenerSupportTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/ListenerSupportTest.java
deleted file mode 100644
index b55271a..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/beans/ListenerSupportTest.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.beans;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.util.Arrays;
-
-import org.eclipse.core.databinding.util.ILogger;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.internal.databinding.beans.ListenerSupport;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 1.1
- */
-public class ListenerSupportTest extends AbstractDefaultRealmTestCase {
-	private PropertyChangeListenerStub listener;
-	private String propertyName;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		listener = new PropertyChangeListenerStub();
-		propertyName = "value";
-	}
-
-	public void testAddPropertyChangeListenerWithPropertyName()
-			throws Exception {
-		SpecificListenerBean bean = new SpecificListenerBean();
-
-		ListenerSupport support = new ListenerSupport(listener, propertyName);
-		assertFalse(bean.changeSupport.hasListeners(propertyName));
-		assertNull(support.getHookedTargets());
-		
-		support.hookListener(bean);
-		assertTrue("has listeners", bean.changeSupport.hasListeners(propertyName));
-		assertTrue("hooked target", Arrays.asList(support.getHookedTargets()).contains(bean));
-	}
-
-	public void testAddPropertyChangeListenerWithoutPropertyName()
-			throws Exception {
-		GenericListenerBean bean = new GenericListenerBean();
-
-		ListenerSupport support = new ListenerSupport(listener, propertyName);
-		assertFalse(bean.changeSupport.hasListeners(propertyName));
-		assertNull(support.getHookedTargets());
-		
-		support.hookListener(bean);
-		assertTrue("has listeners", bean.changeSupport.hasListeners(propertyName));
-		assertTrue("hooked target", Arrays.asList(support.getHookedTargets()).contains(bean));
-	}
-
-	public void testChangeListenerIsOnlyNotifiedWhenWatchedPropertyChanges()
-			throws Exception {
-		GenericListenerBean bean = new GenericListenerBean();
-		ListenerSupport support = new ListenerSupport(listener, propertyName);
-		support.hookListener(bean);
-
-		assertEquals(0, listener.count);
-		bean.setValue("1");
-		assertEquals(1, listener.count);
-		assertEquals("value", listener.event.getPropertyName());
-
-		bean.setOther("2");
-		assertEquals(1, listener.count);
-	}
-
-	public void testLogStatusWhenAddPropertyChangeListenerMethodIsNotFound()
-			throws Exception {
-		class BeanStub {
-		}
-
-		class Log implements ILogger {
-			int count;
-			IStatus status;
-
-			public void log(IStatus status) {
-				count++;
-				this.status = status;
-			}
-		}
-
-		Log log = new Log();
-		Policy.setLog(log);
-
-		ListenerSupport support = new ListenerSupport(listener, "value");
-		BeanStub bean = new BeanStub();
-
-		assertEquals(0, log.count);
-		support.hookListener(bean);
-		assertEquals(1, log.count);
-		assertEquals(IStatus.WARNING, log.status.getSeverity());
-	}
-
-	public void testRemovePropertyChangeListenerWithPropertyName()
-			throws Exception {
-		SpecificListenerBean bean = new SpecificListenerBean();
-		ListenerSupport support = new ListenerSupport(listener, propertyName);
-		support.hookListener(bean);
-
-		assertTrue(bean.changeSupport.hasListeners(propertyName));
-		assertTrue(Arrays.asList(support.getHookedTargets()).contains(bean));
-		
-		support.unhookListener(bean);
-		assertFalse("has listeners", bean.changeSupport.hasListeners(propertyName));
-		assertNull("unhooked target", support.getHookedTargets());
-	}
-
-	public void testRemovePropertyChangeListenerWithoutPropertyName()
-			throws Exception {
-		GenericListenerBean bean = new GenericListenerBean();
-		ListenerSupport support = new ListenerSupport(listener, propertyName);
-		support.hookListener(bean);
-
-		assertTrue(bean.changeSupport.hasListeners(propertyName));
-		assertTrue(Arrays.asList(support.getHookedTargets()).contains(bean));
-		
-		support.unhookListener(bean);
-		assertFalse("has listeners", bean.changeSupport.hasListeners(propertyName));
-		assertNull("unhooked target", support.getHookedTargets());
-	}
-
-	public void testLogStatusWhenRemovePropertyChangeListenerMethodIsNotFound()
-			throws Exception {
-		class InvalidBean {
-		}
-
-		class Log implements ILogger {
-			int count;
-			IStatus status;
-
-			public void log(IStatus status) {
-				count++;
-				this.status = status;
-			}
-		}
-
-		Log log = new Log();
-		Policy.setLog(log);
-
-		ListenerSupport support = new ListenerSupport(listener, "value");
-		InvalidBean bean = new InvalidBean();
-
-		support.hookListener(bean);
-		log.count = 0;
-		log.status = null;
-		assertEquals(0, log.count);
-		support.unhookListener(bean);
-		assertEquals(1, log.count);
-		assertEquals(IStatus.WARNING, log.status.getSeverity());
-	}
-
-	static class GenericListenerBean {
-		private String other;
-		PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
-		private String value;
-
-		public String getValue() {
-			return value;
-		}
-
-		public void setValue(String value) {
-			changeSupport.firePropertyChange("value", this.value,
-					this.value = value);
-		}
-
-		public String getOther() {
-			return other;
-		}
-
-		public void setOther(String other) {
-			changeSupport.firePropertyChange("other", this.other,
-					this.other = other);
-		}
-
-		public void addPropertyChangeListener(PropertyChangeListener listener) {
-			changeSupport.addPropertyChangeListener(listener);
-		}
-
-		public void removePropertyChangeListener(PropertyChangeListener listener) {
-			changeSupport.removePropertyChangeListener(listener);
-		}
-	}
-
-	static class SpecificListenerBean {
-		PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
-		String propertyName;
-		String value;
-
-		public void addPropertyChangeListener(String name,
-				PropertyChangeListener listener) {
-			this.propertyName = name;
-			changeSupport.addPropertyChangeListener(name, listener);
-		}
-
-		public void removePropertyChangeListener(String name,
-				PropertyChangeListener listener) {
-			changeSupport.removePropertyChangeListener(name, listener);
-		}
-
-		public String getValue() {
-			return value;
-		}
-
-		public void setValue(String value) {
-			this.value = value;
-		}
-	}
-
-	static class PropertyChangeListenerStub implements PropertyChangeListener {
-		PropertyChangeEvent event;
-		int count;
-
-		public void propertyChange(PropertyChangeEvent evt) {
-			count++;
-			this.event = evt;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/DateConversionSupportTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/DateConversionSupportTest.java
deleted file mode 100644
index 5e66de4..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/DateConversionSupportTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.internal.databinding.BindingMessages;
-import org.eclipse.core.internal.databinding.conversion.DateConversionSupport;
-
-import com.ibm.icu.text.DateFormat;
-import com.ibm.icu.text.SimpleDateFormat;
-
-/**
- * @since 1.1
- */
-public class DateConversionSupportTest extends TestCase {
-	public void testDatePatternIsExternalized() throws Exception {
-		StubConverter stub = new StubConverter();
-		String key = "DateFormat_DateTime";
-		String format = BindingMessages.getString(key);
-		
-		assertFalse("format is defined", key.equals(format));
-		SimpleDateFormat dateFormat = (SimpleDateFormat) stub.getDateFormat(0);
-		assertEquals(format, dateFormat.toPattern());
-	}
-	
-	public void testTimePatternIsExternalized() throws Exception {
-		StubConverter stub = new StubConverter();
-		String key = "DateFormat_Time";
-		String format = BindingMessages.getString(key);
-		
-		assertFalse("format is defined", key.equals(format));
-		SimpleDateFormat dateFormat = (SimpleDateFormat) stub.getDateFormat(1);
-		assertEquals(format, dateFormat.toPattern());
-	}
-	
-	static class StubConverter extends DateConversionSupport {
-		protected DateFormat getDateFormat(int index) {
-			return super.getDateFormat(index);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/IdentityConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/IdentityConverterTest.java
deleted file mode 100755
index 8076183..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/IdentityConverterTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *     Matt Carter - bug 197679
- *******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.BindingException;
-import org.eclipse.core.internal.databinding.conversion.IdentityConverter;
-
-/**
- * @since 3.2
- * 
- */
-public class IdentityConverterTest extends TestCase {
-
-	private IdentityConverter c;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		c = new IdentityConverter(Integer.TYPE, Integer.TYPE);
-	}
-
-	public void testIsPrimitiveTypeMatchedWithBoxed() throws Exception {
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Integer.class,
-				Integer.TYPE));
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Integer.TYPE,
-				Integer.class));
-
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Byte.class, Byte.TYPE));
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Byte.TYPE, Byte.class));
-
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Short.class, Short.TYPE));
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Short.TYPE, Short.class));
-
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Long.class, Long.TYPE));
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Long.TYPE, Long.class));
-
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Float.class, Float.TYPE));
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Float.TYPE, Float.class));
-
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Double.class, Double.TYPE));
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Double.TYPE, Double.class));
-
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Boolean.class,
-				Boolean.TYPE));
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Boolean.TYPE,
-				Boolean.class));
-
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Character.class,
-				Character.TYPE));
-		assertTrue(c.isPrimitiveTypeMatchedWithBoxed(Character.TYPE,
-				Character.class));
-
-		assertFalse(c.isPrimitiveTypeMatchedWithBoxed(Boolean.class,
-				Integer.TYPE));
-	}
-
-	public void testConvert_NullToPrimitive() {
-		IdentityConverter p2b = new IdentityConverter(Float.TYPE, Float.TYPE);
-		try {
-			p2b.convert(null);
-			fail("Should have thrown an exception");
-		} catch (BindingException b) {
-			// success
-		}
-	}
-
-	public void testConvert_PrimitiveToBoxed() throws Exception {
-		IdentityConverter p2b = new IdentityConverter(Float.TYPE, Float.class);
-		assertEquals("4.2", new Float(4.2), p2b.convert(new Float(4.2)));
-	}
-
-	public void testConvert_BoxedToPrimitive() throws Exception {
-		IdentityConverter p2b = new IdentityConverter(Float.class, Float.TYPE);
-		assertEquals("4.2", new Float(4.2), p2b.convert(new Float(4.2)));
-	}
-
-	public void testConvert_PrimitiveToPrimitive() throws Exception {
-		IdentityConverter p2b = new IdentityConverter(Float.TYPE, Float.TYPE);
-		assertEquals("4.2", new Float(4.2), p2b.convert(new Float(4.2)));
-	}
-
-	public void testConvert_BoxedToBoxed() throws Exception {
-		IdentityConverter p2b = new IdentityConverter(Float.class, Float.class);
-		assertEquals("4.2", new Float(4.2), p2b.convert(new Float(4.2)));
-	}
-
-	public static class Person {
-		public String foo = "blah";
-	}
-
-	public static class Animal {
-		public String name = "fido";
-	}
-
-	public void test_Convert_ValidAssignment() throws Exception {
-		IdentityConverter pc = new IdentityConverter(Object.class, Person.class);
-		Person orig = new Person();
-		Object person = pc.convert(orig);
-		assertTrue("Person class", person.getClass().equals(Person.class));
-		assertTrue("Need correct Person", person.equals(orig));
-	}
-
-	public void test_Convert_ValidAssignment2() throws Exception {
-		IdentityConverter pc = new IdentityConverter(Person.class, Object.class);
-		Person orig = new Person();
-		Object person = pc.convert(orig);
-		assertTrue("Person class", person.getClass().equals(Person.class));
-		assertTrue("Need correct Person", person.equals(orig));
-	}
-
-	public void testConvert_InvalidAssignment() throws Exception {
-		IdentityConverter pc = new IdentityConverter(Object.class, Person.class);
-		try {
-			pc.convert(new Animal());
-			fail("Should have gotten an exception");
-		} catch (Exception e) {
-			// success
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/IntegerToStringConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/IntegerToStringConverterTest.java
deleted file mode 100644
index a86de2d..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/IntegerToStringConverterTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.internal.databinding.conversion.IntegerToStringConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class IntegerToStringConverterTest extends TestCase {
-	private NumberFormat integerFormat;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		integerFormat = NumberFormat.getIntegerInstance();
-	}
-
-	public void testFromTypeShort() throws Exception {
-		assertEquals(Short.class, IntegerToStringConverter.fromShort(false)
-				.getFromType());
-		assertEquals(Short.TYPE, IntegerToStringConverter.fromShort(true)
-				.getFromType());
-		assertEquals(Byte.class, IntegerToStringConverter.fromByte(false)
-				.getFromType());
-		assertEquals(Byte.TYPE, IntegerToStringConverter.fromByte(true)
-				.getFromType());
-	}
-
-	public void testToTypeIsStringClass() throws Exception {
-		assertEquals(String.class, IntegerToStringConverter.fromShort(false)
-				.getToType());
-	}
-
-	public void testConvertShortToString() throws Exception {
-		Short value = new Short((short) 1);
-		String expected = integerFormat.format(value);
-
-		IntegerToStringConverter converter = IntegerToStringConverter
-				.fromShort(integerFormat, false);
-		String result = (String) converter.convert(value);
-		assertEquals(expected, result);
-	}
-
-	public void testConvertByteToString() throws Exception {
-		Byte value = new Byte((byte) 1);
-		String expected = integerFormat.format(value);
-
-		IntegerToStringConverter converter = IntegerToStringConverter.fromByte(
-				integerFormat, false);
-		String result = (String) converter.convert(value);
-		assertEquals(expected, result);
-	}
-
-	public void testNullSourceConvertsToEmptyString() throws Exception {
-		IntegerToStringConverter converter = IntegerToStringConverter
-				.fromByte(false);
-		assertEquals("", converter.convert(null));
-	}
-
-	public void testIllegalArgumentExceptionIfSourceIsNotExpectedType() throws Exception {
-		IntegerToStringConverter converter = IntegerToStringConverter.fromByte(false);
-		try {
-			converter.convert(new Integer(1));
-			fail("exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToBigDecimalTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToBigDecimalTest.java
deleted file mode 100644
index 9cdabd9..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToBigDecimalTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import java.math.BigDecimal;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToBigDecimalConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToBigDecimalTest extends NumberToNumberTestHarness {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetOutOfRangeNumber()
-	 */
-	protected Number doGetOutOfRangeNumber() {
-		return null; //does not exist
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToBoxedTypeValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToBoxedTypeValidator(Class fromType) {
-		return new NumberToBigDecimalConverter(NumberFormat.getInstance(), fromType);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToPrimitiveValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToPrimitiveValidator(Class fromType) {
-		return null; // does not exist
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToType(boolean)
-	 */
-	protected Class doGetToType(boolean primitive) {
-		return (primitive) ? null : BigDecimal.class;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToBigIntegerConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToBigIntegerConverterTest.java
deleted file mode 100644
index 2d41a6a..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToBigIntegerConverterTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import java.math.BigInteger;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToBigIntegerConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToBigIntegerConverterTest extends NumberToNumberTestHarness {
-	private NumberFormat numberFormat;
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetOutOfRangeNumber()
-	 */
-	protected Number doGetOutOfRangeNumber() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToBoxedTypeValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToBoxedTypeValidator(Class fromType) {
-		return new NumberToBigIntegerConverter(numberFormat, fromType);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToPrimitiveValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToPrimitiveValidator(Class fromType) {
-		return null;  //no such thing
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToType(boolean)
-	 */
-	protected Class doGetToType(boolean primitive) {
-		return (primitive) ? null : BigInteger.class;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToByteConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToByteConverterTest.java
deleted file mode 100644
index 551b684..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToByteConverterTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToByteConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToByteConverterTest extends NumberToNumberTestHarness {
-	private NumberFormat numberFormat;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		numberFormat = NumberFormat.getInstance();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetOutOfRangeNumber()
-	 */
-	protected Number doGetOutOfRangeNumber() {
-		return new Integer(Byte.MAX_VALUE + 1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToBoxedTypeValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToBoxedTypeValidator(Class fromType) {
-		return new NumberToByteConverter(numberFormat, fromType, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToPrimitiveValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToPrimitiveValidator(Class fromType) {
-		return new NumberToByteConverter(numberFormat, fromType, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToType()
-	 */
-	protected Class doGetToType(boolean primitive) {
-		return (primitive) ? Byte.TYPE : Byte.class;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToDoubleConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToDoubleConverterTest.java
deleted file mode 100644
index 2a5a480..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToDoubleConverterTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import java.math.BigDecimal;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToDoubleConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToDoubleConverterTest extends NumberToNumberTestHarness {
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetOutOfRangeNumber()
-	 */
-	protected Number doGetOutOfRangeNumber() {
-		return new BigDecimal(Double.MAX_VALUE).add(new BigDecimal(Double.MAX_VALUE));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToBoxedTypeValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToBoxedTypeValidator(Class fromType) {
-		return new NumberToDoubleConverter(NumberFormat.getInstance(), fromType, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToPrimitiveValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToPrimitiveValidator(Class fromType) {
-		return new NumberToDoubleConverter(NumberFormat.getInstance(), fromType, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToType(boolean)
-	 */
-	protected Class doGetToType(boolean primitive) {
-		return (primitive) ? Double.TYPE : Double.class;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToFloatConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToFloatConverterTest.java
deleted file mode 100644
index 17752f6..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToFloatConverterTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToFloatConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToFloatConverterTest extends NumberToNumberTestHarness {
-	private NumberFormat numberFormat;
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		numberFormat = NumberFormat.getInstance();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetOutOfRangeNumber()
-	 */
-	protected Number doGetOutOfRangeNumber() {
-		return new Double(Double.MAX_VALUE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToBoxedTypeValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToBoxedTypeValidator(Class fromType) {
-		return new NumberToFloatConverter(numberFormat, fromType, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToPrimitiveValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToPrimitiveValidator(Class fromType) {
-		return new NumberToFloatConverter(numberFormat, fromType, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToType(boolean)
-	 */
-	protected Class doGetToType(boolean primitive) {
-		return (primitive) ? Float.TYPE : Float.class;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToIntegerConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToIntegerConverterTest.java
deleted file mode 100644
index 0734677..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToIntegerConverterTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToIntegerConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToIntegerConverterTest extends NumberToNumberTestHarness {
-	private NumberFormat numberFormat;
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		numberFormat = NumberFormat.getInstance();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetOutOfRangeNumber()
-	 */
-	protected Number doGetOutOfRangeNumber() {
-		return new Long((long) Integer.MAX_VALUE + 1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToBoxedTypeValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToBoxedTypeValidator(Class fromType) {
-		return new NumberToIntegerConverter(numberFormat, fromType, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToPrimitiveValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToPrimitiveValidator(Class fromType) {
-		return new NumberToIntegerConverter(numberFormat, fromType, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToType(boolean)
-	 */
-	protected Class doGetToType(boolean primitive) {
-		return (primitive) ? Integer.TYPE : Integer.class;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToLongConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToLongConverterTest.java
deleted file mode 100644
index aff8120..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToLongConverterTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToLongConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToLongConverterTest extends NumberToNumberTestHarness {
-	private NumberFormat numberFormat;
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		numberFormat = NumberFormat.getInstance();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetOutOfRangeNumber()
-	 */
-	protected Number doGetOutOfRangeNumber() {
-		return new Double(Double.MAX_VALUE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToBoxedTypeValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToBoxedTypeValidator(Class fromType) {
-		return new NumberToLongConverter(numberFormat, fromType, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToPrimitiveValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToPrimitiveValidator(Class fromType) {
-		return new NumberToLongConverter(numberFormat, fromType, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToType(boolean)
-	 */
-	protected Class doGetToType(boolean primitive) {
-		return (primitive) ? Long.TYPE : Long.class;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToNumberTestHarness.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToNumberTestHarness.java
deleted file mode 100644
index d6373b3..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToNumberTestHarness.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-
-/**
- * @since 1.1
- */
-public abstract class NumberToNumberTestHarness extends TestCase {
-
-	/**
-	 * Invoked when a to primitive validator is needed.
-	 * 
-	 * @param fromType
-	 * @return validator, <code>null</code> if the type does not have a primitive form
-	 */
-	protected abstract IConverter doGetToPrimitiveValidator(Class fromType);
-
-	/**
-	 * Invoked when a to boxed validator is needed.
-	 * 
-	 * @param fromType
-	 * @return
-	 */
-	protected abstract IConverter doGetToBoxedTypeValidator(Class fromType);
-
-	/**
-	 * Invoked when the type is needed.
-	 * 
-	 * @param primitive
-	 * @return type, <code>null</code> if the type does not have a primitive form
-	 */
-	protected abstract Class doGetToType(boolean primitive);
-
-	/**
-	 * Invoked when an out of range number is needed to use for conversion.
-	 * 
-	 * @return out of range number of <code>null</code> if the type has no bounds
-	 */
-	protected abstract Number doGetOutOfRangeNumber();
-
-	public void testFromType() throws Exception {
-		Class from = Integer.class;
-		assertEquals(from, doGetToBoxedTypeValidator(from).getFromType());
-	}
-
-	public void testToTypeIsPrimitive() throws Exception {
-		Class toType = doGetToType(true);
-		
-		if (toType == null) {
-			//return if there is no primitive type
-			return;
-		}
-		assertEquals("to type was not of the correct type", toType, doGetToPrimitiveValidator(Integer.class)
-				.getToType());
-		assertTrue("to type was not primitive", toType.isPrimitive());
-	}
-
-	public void testToTypeIsBoxedType() throws Exception {
-		Class toType = doGetToType(false);
-		assertEquals(toType, doGetToBoxedTypeValidator(Integer.class)
-				.getToType());
-		assertFalse(toType.isPrimitive());
-	}
-
-	public void testValidConversion() throws Exception {
-		Integer value = new Integer(1);
-		Number result = (Number) doGetToBoxedTypeValidator(Integer.class)
-				.convert(value);
-		
-		assertNotNull("result was null", result);
-		
-		// regardless if the converter is for the primitive value the returned
-		// value will be the boxed type
-		assertEquals(doGetToType(false), result.getClass());
-		assertEquals(value, new Integer(result.intValue()));
-	}
-
-	public void testOutOfRangeConversion() throws Exception {
-		Number outOfRange = doGetOutOfRangeNumber();
-		
-		if (outOfRange == null) {
-			//the number does not have bounds (e.g. BigInteger or BigDecimal)
-			return;
-		}
-		try {
-			doGetToBoxedTypeValidator(Integer.class).convert(outOfRange);
-			fail("exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-
-	public void testConvertNullValueForPrimitiveThrowsIllegalArgumentException()
-			throws Exception {
-		if (doGetToType(true) == null) {
-			//return if primitive is not supported
-			
-			return;
-		}
-		
-		try {
-			doGetToPrimitiveValidator(Integer.class).convert(null);
-			fail("exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-
-	public void testConvertNullValueForBoxedTypeReturnsNull() throws Exception {
-		assertNull(doGetToBoxedTypeValidator(Integer.class).convert(null));
-	}
-
-	public void testNonNumberThrowsIllegalArgumentException() throws Exception {
-		try {
-			doGetToBoxedTypeValidator(Integer.class).convert("");
-			fail("exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToShortConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToShortConverterTest.java
deleted file mode 100644
index 4c00cfc..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/NumberToShortConverterTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.internal.databinding.conversion.NumberToShortConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToShortConverterTest extends NumberToNumberTestHarness {
-	private NumberFormat numberFormat;
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		numberFormat = NumberFormat.getInstance();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetOutOfRangeNumber()
-	 */
-	protected Number doGetOutOfRangeNumber() {
-		return new Integer(Short.MAX_VALUE + 1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToBoxedTypeValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToBoxedTypeValidator(Class fromType) {
-		return new NumberToShortConverter(numberFormat, fromType, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToPrimitiveValidator(java.lang.Class)
-	 */
-	protected IConverter doGetToPrimitiveValidator(Class fromType) {
-		return new NumberToShortConverter(numberFormat, fromType, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.NumberToNumberTestHarness#doGetToType(boolean)
-	 */
-	protected Class doGetToType(boolean primitive) {
-		return (primitive) ? Short.TYPE : Short.class;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/ObjectToPrimitiveValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/ObjectToPrimitiveValidatorTest.java
deleted file mode 100755
index 9fbfb83..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/ObjectToPrimitiveValidatorTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.internal.databinding.validation.ObjectToPrimitiveValidator;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * @since 3.2
- * 
- */
-public class ObjectToPrimitiveValidatorTest extends TestCase {
-
-	private ObjectToPrimitiveValidator objectToPrimitiveValidator;
-
-	protected void setUp() throws Exception {
-		this.objectToPrimitiveValidator = new ObjectToPrimitiveValidator(
-				Integer.TYPE);
-	}
-
-	/**
-	 * Test method for
-	 * {@link org.eclipse.jface.internal.databinding.provisional.validation.ObjectToPrimitiveValidator#isValid(java.lang.Object)}.
-	 */
-	public void testIsValid() {
-		IStatus result = this.objectToPrimitiveValidator.validate(null);
-		assertEquals("The wrong validation error was found.", result
-				.getMessage(), this.objectToPrimitiveValidator.getNullHint());
-
-		result = this.objectToPrimitiveValidator.validate(new Integer(1));
-		assertTrue("No validation error should be found.", result.isOK());
-
-		result = this.objectToPrimitiveValidator.validate(new Object());
-		assertEquals("The wrong validation error was found.", result
-				.getMessage(), this.objectToPrimitiveValidator.getClassHint());
-	}
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StatusToStringConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StatusToStringConverterTest.java
deleted file mode 100644
index 51bb872..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StatusToStringConverterTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.conversion.StatusToStringConverter;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * @since 1.1
- */
-public class StatusToStringConverterTest extends TestCase {
-	private StatusToStringConverter converter;
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		converter = new StatusToStringConverter();
-	}
-	
-	public void testConvertedValueIsMessageOfStatus() throws Exception {
-		String message = "this is my message";
-		IStatus status = ValidationStatus.error(message);
-		assertEquals(message, converter.convert(status));
-	}
-	
-	public void testFromTypeIsIStatus() throws Exception {
-		assertEquals(IStatus.class, converter.getFromType());
-	}
-	
-	public void testToTypeIsString() throws Exception {
-		assertEquals(String.class, converter.getToType());
-	}
-	
-	public void testIllegalArgumentExceptionIsThrownWithNullInput() throws Exception {
-		try {
-			converter.convert(null);
-			fail();
-		} catch (IllegalArgumentException e) {
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToBooleanConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToBooleanConverterTest.java
deleted file mode 100644
index b1534ec..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToBooleanConverterTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import junit.framework.TestCase;
-import junit.framework.TestResult;
-
-import org.eclipse.core.internal.databinding.BindingMessages;
-import org.eclipse.core.internal.databinding.conversion.StringToBooleanConverter;
-
-/**
- * @since 1.1
- */
-public class StringToBooleanConverterTest extends TestCase {
-	private StringToBooleanConverter converter;
-
-	private List trueValues;
-
-	private List falseValues;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#run(junit.framework.TestResult)
-	 */
-	public void run(TestResult result) {
-		trueValues = Collections.unmodifiableList(toValues(BindingMessages
-				.getString("ValueDelimiter"), BindingMessages
-				.getString("TrueStringValues")));
-		falseValues = Collections.unmodifiableList(toValues(BindingMessages
-				.getString("ValueDelimiter"), BindingMessages
-				.getString("FalseStringValues")));
-
-		super.run(result);
-	}
-
-	private List toValues(String delimiter, String values) {
-		StringTokenizer tokenizer = new StringTokenizer(values, delimiter);
-		List result = new LinkedList();
-
-		while (tokenizer.hasMoreTokens()) {
-			result.add(tokenizer.nextToken());
-		}
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		converter = new StringToBooleanConverter();
-		assertTrue(trueValues.size() > 0);
-		assertTrue(falseValues.size() > 0);
-	}
-
-	public void testConvertsToTrue() throws Exception {
-		Boolean result = (Boolean) converter.convert(trueValues.get(0));
-		assertTrue(result.booleanValue());
-	}
-
-	public void testConvertsToFalse() throws Exception {
-		Boolean result = (Boolean) converter.convert(falseValues.get(0));
-		assertFalse(result.booleanValue());
-	}
-
-	public void testUpperCaseStringConvertsToTrue() throws Exception {
-		Boolean result = (Boolean) converter.convert(((String) trueValues.get(0))
-				.toUpperCase());
-		assertTrue(result.booleanValue());
-	}
-
-	public void testUpperCaseStringConvertsToFalse() throws Exception {
-		Boolean result = (Boolean) converter.convert(((String) falseValues.get(0))
-				.toUpperCase());
-		assertFalse(result.booleanValue());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToByteConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToByteConverterTest.java
deleted file mode 100644
index 1c61468..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToByteConverterTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.internal.databinding.conversion.StringToByteConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class StringToByteConverterTest extends TestCase {
-	private NumberFormat numberFormat;
-	private StringToByteConverter converter;
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		numberFormat = NumberFormat.getIntegerInstance();
-		converter = StringToByteConverter.toByte(numberFormat, false);
-	}
-
-	public void testConvertsToByte() throws Exception {
-		Byte value = new Byte((byte) 1);
-		Byte result = (Byte) converter.convert(numberFormat.format(value));
-		
-		assertEquals(value, result);
-	}
-
-	public void testConvertsToBytePrimitive() throws Exception {
-		converter = StringToByteConverter.toByte(numberFormat, true);
-		Byte value = new Byte((byte) 1);
-		Byte result = (Byte) converter.convert(numberFormat.format(value));
-		assertEquals(value, result);
-	}
-
-	public void testFromTypeIsString() throws Exception {
-		assertEquals(String.class, converter.getFromType());
-	}
-
-	public void testToTypeIsShort() throws Exception {
-		assertEquals(Byte.class, converter.getToType());
-	}
-	
-	public void testToTypeIsBytePrimitive() throws Exception {
-		converter = StringToByteConverter.toByte(true);
-		assertEquals(Byte.TYPE, converter.getToType());
-	}
-	
-	public void testReturnsNullBoxedTypeForEmptyString() throws Exception {
-		assertNull(converter.convert(""));
-	}
-
-	public void testThrowsIllegalArgumentExceptionIfAskedToConvertNonString()
-			throws Exception {
-		try {
-			converter.convert(new Integer(1));
-			fail("exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToCharacterConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToCharacterConverterTest.java
deleted file mode 100644
index 21250df..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToCharacterConverterTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) Matt Carter and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matt Carter - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.internal.databinding.conversion.StringToCharacterConverter;
-
-/**
- * @since 1.1
- */
-public class StringToCharacterConverterTest extends TestCase {
-
-	private StringToCharacterConverter converter;
-	private StringToCharacterConverter primitiveConverter;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		converter = StringToCharacterConverter.toCharacter(false);
-		primitiveConverter = StringToCharacterConverter.toCharacter(true);
-	}
-
-	public void testConvertsToCharacter() throws Exception {
-		Character value = new Character('X');
-		Character result = (Character) converter.convert(Character
-				.toString(value.charValue()));
-
-		assertEquals(value, result);
-	}
-
-	public void testConvertsToCharacterPrimitive() throws Exception {
-		Character value = new Character('Y');
-		Character result = (Character) primitiveConverter.convert(String
-				.valueOf(value.charValue()));
-		assertEquals(value, result);
-	}
-
-	public void testFromTypeIsString() throws Exception {
-		assertEquals(String.class, converter.getFromType());
-	}
-
-	public void testToTypeIsCharacter() throws Exception {
-		assertEquals(Character.class, converter.getToType());
-	}
-
-	public void testToTypeIsCharacterPrimitive() throws Exception {
-		assertEquals(Character.TYPE, primitiveConverter.getToType());
-	}
-
-	public void testReturnsNullBoxedTypeForEmptyString() throws Exception {
-		assertNull(converter.convert(""));
-	}
-
-	public void testNullCharacterIsOK() throws Exception {
-		assertNull(converter.convert(null));
-	}
-
-	public void testNullCharacterIsNotOKForPrimitive() throws Exception {
-		try {
-			primitiveConverter.convert(null);
-			fail("exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-
-	public void testThrowsIllegalArgumentExceptionIfAskedToConvertNonString()
-			throws Exception {
-		try {
-			converter.convert(new Integer(1));
-			fail("exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserByteTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserByteTest.java
deleted file mode 100644
index dd8b65b..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserByteTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * @since 3.2
- *
- */
-public class StringToNumberParserByteTest extends
-		StringToNumberParserTestHarness {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#assertValid(java.lang.Number)
-	 */
-	protected boolean assertValid(Number number) {
-		return StringToNumberParser.inByteRange(number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#getValidMax()
-	 */
-	protected Number getValidMax() {
-		return new Byte(Byte.MAX_VALUE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#getValidMin()
-	 */
-	protected Number getValidMin() {
-		return new Byte(Byte.MIN_VALUE);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserDoubleTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserDoubleTest.java
deleted file mode 100644
index 485d059..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserDoubleTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * @since 3.2
- *
- */
-public class StringToNumberParserDoubleTest extends
-		StringToNumberParserTestHarness {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#assertValid(java.lang.Number)
-	 */
-	protected boolean assertValid(Number number) {
-		return StringToNumberParser.inDoubleRange(number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#getValidMax()
-	 */
-	protected Number getValidMax() {
-		return new Double(Double.MAX_VALUE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#getValidMin()
-	 */
-	protected Number getValidMin() {
-		return new Double(-Double.MAX_VALUE);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserFloatTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserFloatTest.java
deleted file mode 100644
index 8a286eb..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserFloatTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * @since 1.1
- *
- */
-public class StringToNumberParserFloatTest extends
-		StringToNumberParserTestHarness {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#assertValid(java.lang.Number)
-	 */
-	protected boolean assertValid(Number number) {
-		return StringToNumberParser.inFloatRange(number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#getValidMax()
-	 */
-	protected Number getValidMax() {
-		return new Float(Float.MAX_VALUE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#getValidMin()
-	 */
-	protected Number getValidMin() {
-		return new Float(-Float.MAX_VALUE);
-	}
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserIntegerTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserIntegerTest.java
deleted file mode 100644
index cd37511..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserIntegerTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * @since 1.1
- */
-public class StringToNumberParserIntegerTest extends
-		StringToNumberParserTestHarness {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#assertValid(java.lang.Number)
-	 */
-	protected boolean assertValid(Number number) {
-		return StringToNumberParser.inIntegerRange(number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#getValidMax()
-	 */
-	protected Number getValidMax() {
-		return new Integer(Integer.MAX_VALUE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#getValidMin()
-	 */
-	protected Number getValidMin() {
-		return new Integer(Integer.MIN_VALUE);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserLongTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserLongTest.java
deleted file mode 100644
index 3ecef0d..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserLongTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-/**
- * @since 1.1
- *
- */
-public class StringToNumberParserLongTest extends
-		StringToNumberParserTestHarness {
-
-	protected boolean assertValid(Number number) {
-		return StringToNumberParser.inLongRange(number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#getValidMax()
-	 */
-	protected Number getValidMax() {
-		return new Long(Long.MAX_VALUE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#getValidMin()
-	 */
-	protected Number getValidMin() {
-		return new Long(Long.MIN_VALUE);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserShortTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserShortTest.java
deleted file mode 100644
index cf0c0fa..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserShortTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-
-/**
- * @since 1.1
- */
-public class StringToNumberParserShortTest extends StringToNumberParserTestHarness {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#assertValid(java.lang.Number)
-	 */
-	protected boolean assertValid(Number number) {
-		return StringToNumberParser.inShortRange(number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#getValidMax()
-	 */
-	protected Number getValidMax() {
-		return new Short(Short.MAX_VALUE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTestHarness#getValidMin()
-	 */
-	protected Number getValidMin() {
-		return new Short(Short.MIN_VALUE);
-	}	
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserTest.java
deleted file mode 100644
index a1329a0..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser.ParseResult;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class StringToNumberParserTest extends TestCase {
-	private NumberFormat integerFormat;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		integerFormat = NumberFormat.getIntegerInstance();
-	}
-
-	public void testParseNonStringThrowsIllegalArgumentException()
-			throws Exception {
-		try {
-			StringToNumberParser.parse(new Integer(0), integerFormat, false);
-			fail("exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-
-	public void testEmptyStringReturnsNullIfNotPrimitive() throws Exception {
-		ParseResult result = StringToNumberParser.parse("",
-				integerFormat, false);
-		assertNull(result.getNumber());
-	}
-
-	public void testReturnsParsePositionWhenValueCannotBeParsed()
-			throws Exception {
-		ParseResult result = StringToNumberParser.parse("adsf",
-				integerFormat, false);
-		assertNotNull(result.getPosition());
-		assertNull(result.getNumber());
-	}
-
-	public void testReturnsNumberWhenSuccessfullyParsed() throws Exception {
-		Integer number = new Integer(5);
-		ParseResult result = StringToNumberParser.parse(integerFormat
-				.format(number.longValue()), integerFormat, false);
-		assertNull(result.getPosition());
-		assertEquals(number.intValue(), result.getNumber().intValue());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserTestHarness.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserTestHarness.java
deleted file mode 100644
index 476ba39..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToNumberParserTestHarness.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.core.internal.databinding.conversion.StringToNumberParser;
-
-import junit.framework.TestCase;
-
-/**
- * @since 1.1
- */
-public abstract class StringToNumberParserTestHarness extends TestCase {
-
-	protected abstract Number getValidMax();
-
-	protected abstract Number getValidMin();
-
-	protected abstract boolean assertValid(Number number);
-
-	public void testRanges() throws Exception {
-		Number min = getValidMin();
-		Number max = getValidMax();
-
-		double minDouble = min.doubleValue();
-		double maxDouble = max.doubleValue();
-
-		//test bytes
-		assertTrue("valid byte", assertValid(new Byte((byte) 1)));
-		assertTrue("valid byte min", assertValid(new Byte(Byte.MIN_VALUE)));
-		assertTrue("valid byte max", assertValid(new Byte(Byte.MAX_VALUE)));
-		
-		// test shorts
-		assertTrue("valid short", assertValid(new Short((short) 1)));
-		boolean result = assertValid(new Short(Short.MIN_VALUE));
-		if (minDouble > Short.MIN_VALUE) {
-			assertFalse("invalid short min", result);
-		} else {
-			assertTrue("valid short min", result);
-		}
-
-		result = assertValid(new Short(Short.MAX_VALUE));
-		if (maxDouble < Short.MAX_VALUE) {
-			assertFalse("invalid short max", result);
-		} else {
-			assertTrue("valid short max", result);
-		}
-
-		// test integers
-		assertTrue("valid Integer", assertValid(new Integer(1)));
-
-		result = assertValid(new Integer(Integer.MIN_VALUE));
-		if (minDouble > Integer.MIN_VALUE) {
-			assertFalse("invalid Integer min", result);
-		} else {
-			assertTrue("valid integer min", result);
-		}
-
-		result = assertValid(new Integer(Integer.MAX_VALUE));
-		if (maxDouble < Integer.MAX_VALUE) {
-			assertFalse("valid Integer max", result);
-		} else {
-			assertTrue("valid integer max", result);
-		}
-
-		// test longs
-		assertTrue("valid long", assertValid(new Long(1)));
-		result = assertValid(new Long(Long.MIN_VALUE));
-		if (minDouble > Long.MIN_VALUE) {
-			assertFalse("invalid long min", result);
-		} else {
-			assertTrue("valid long min", result);
-		}
-
-		result = assertValid(new Long(Long.MAX_VALUE));
-		if (maxDouble < Long.MAX_VALUE) {
-			assertFalse("invalid long max", result);
-		} else {
-			assertTrue("valid long max", result);
-		}
-
-		// test floats
-		assertTrue("valid float", assertValid(new Float(1)));
-		result = assertValid(new Float(-Float.MAX_VALUE));
-		if (minDouble > -Float.MAX_VALUE) {
-			assertFalse("invalid float min", result);
-		} else {
-			assertTrue("valid float min", result);
-		}
-
-		result = assertValid(new Float(Float.MAX_VALUE));
-		if (maxDouble < Float.MAX_VALUE) {
-			assertFalse("invalid float max", result);
-		} else {
-			assertTrue("valid float max", result);
-		}
-
-		assertFalse("invalid negative float infinity", assertValid(new Float(
-				Float.NEGATIVE_INFINITY)));
-		assertFalse("invalid positive float infinity", assertValid(new Float(
-				Float.POSITIVE_INFINITY)));
-		assertFalse("invalid float NaN", assertValid(new Float(Float.NaN)));
-
-		// test doubles
-		assertTrue("valid double", assertValid(new Double(1)));
-		result = assertValid(new Double(-Double.MAX_VALUE));
-		if (minDouble > -Double.MAX_VALUE) {
-			assertFalse("invalid double min", result);
-		} else {
-			assertTrue("valid double min", result);
-		}
-
-		result = assertValid(new Double(Double.MAX_VALUE));
-		if (maxDouble < Double.MAX_VALUE) {
-			assertFalse("invalid float max", result);
-		} else {
-			assertTrue("valid float max", result);
-		}
-
-		assertFalse("invalid negative double infinity", assertValid(new Double(
-				Double.NEGATIVE_INFINITY)));
-		assertFalse("invalid positive double infinity", assertValid(new Double(
-				Double.POSITIVE_INFINITY)));
-		assertFalse("invalid double NaN", assertValid(new Double(Double.NaN)));
-
-		// test BigIntegers
-		assertTrue("valid BigInteger", assertValid(BigInteger.valueOf(1)));
-		BigDecimal bigDecimalMin = new BigDecimal(min.doubleValue());
-		bigDecimalMin = bigDecimalMin.subtract(new BigDecimal(1));
-		assertFalse("invalid BigInteger min", assertValid(bigDecimalMin.toBigInteger()));
-
-		BigDecimal bigDecimalMax = new BigDecimal(max.doubleValue());
-		bigDecimalMax = bigDecimalMax.add(new BigDecimal(1));
-		assertFalse("invalid BigInteger max", assertValid(bigDecimalMax.toBigInteger()));
-		
-		// test BigDecimals
-		assertTrue("valid BigDecimal", assertValid(new BigDecimal(1)));
-		assertFalse("invalid BigDecimal min", assertValid(bigDecimalMin));
-		assertFalse("invalid BigDecimal max", assertValid(bigDecimalMax));
-
-		/**
-		 * The ICU4J plugin's NumberFormat will return it's own BigDecimal
-		 * implementation, com.ibm.icu.math.BigDecimal. The issue this causes is
-		 * that we can't reference this class as it's not part of the
-		 * replacement plugin. So in order to ensure that we handle Number's
-		 * that are not part of the JDK stub a number implemenation and ensure
-		 * that the double representation of this number is used.
-		 * 
-		 * @throws Exception
-		 */
-		class MyNumber extends Number {
-			double value;
-			int count;
-
-			MyNumber(double value) {
-				this.value = value;
-			}
-
-			private static final long serialVersionUID = 1L;
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see java.lang.Number#doubleValue()
-			 */
-			public double doubleValue() {
-				count++;
-				return value;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see java.lang.Number#floatValue()
-			 */
-			public float floatValue() {
-				return 0;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see java.lang.Number#intValue()
-			 */
-			public int intValue() {
-				return 0;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see java.lang.Number#longValue()
-			 */
-			public long longValue() {
-				return 0;
-			}
-		}
-
-		MyNumber number = new MyNumber(1);
-		assertEquals(0, number.count);
-		assertTrue(StringToNumberParser.inIntegerRange(number));
-		assertTrue("double value retrieved", number.count > 0);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToShortConverterTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToShortConverterTest.java
deleted file mode 100644
index b37fba1..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/conversion/StringToShortConverterTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.conversion;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.internal.databinding.conversion.StringToShortConverter;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class StringToShortConverterTest extends TestCase {
-	private NumberFormat numberFormat;
-	private StringToShortConverter converter;
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		numberFormat = NumberFormat.getIntegerInstance();
-		converter = StringToShortConverter.toShort(numberFormat, false);
-	}
-
-	public void testConvertsToShort() throws Exception {
-		Short value = new Short((short) 1);
-		Short result = (Short) converter.convert(numberFormat.format(value));
-		
-		assertEquals(value, result);
-	}
-
-	public void testConvertsToShortPrimitive() throws Exception {
-		converter = StringToShortConverter.toShort(numberFormat, true);
-		Short value = new Short((short) 1);
-		Short result = (Short) converter.convert(numberFormat.format(value));
-		assertEquals(value, result);
-	}
-
-	public void testFromTypeIsString() throws Exception {
-		assertEquals(String.class, converter.getFromType());
-	}
-
-	public void testToTypeIsShort() throws Exception {
-		assertEquals(Short.class, converter.getToType());
-	}
-	
-	public void testToTypeIsShortPrimitive() throws Exception {
-		converter = StringToShortConverter.toShort(true);
-		assertEquals(Short.TYPE, converter.getToType());
-	}
-	
-	public void testReturnsNullBoxedTypeForEmptyString() throws Exception {
-		assertNull(converter.convert(""));
-	}
-
-	public void testThrowsIllegalArgumentExceptionIfAskedToConvertNonString()
-			throws Exception {
-		try {
-			converter.convert(new Integer(1));
-			fail("exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ConstantObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ConstantObservableValueTest.java
deleted file mode 100644
index abd1df4..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ConstantObservableValueTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 212518)
- *     Matthew Hall - bug 146397
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.internal.databinding.observable.ConstantObservableValue;
-import org.eclipse.jface.databinding.conformance.ObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.delegate.IObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.SuiteBuilder;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Tests for ConstantObservableValue
- * 
- * @since 1.1
- */
-public class ConstantObservableValueTest extends AbstractDefaultRealmTestCase {
-	public void testConstructor_NullRealm() {
-		try {
-			new ConstantObservableValue(null, null, null);
-			fail("Constructor should throw an exception when null realm is passed in");
-		} catch (RuntimeException expected) {
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite("ConstantValueTest");
-		suite.addTestSuite(ConstantObservableValueTest.class);
-		suite.addTest(UnchangeableObservableValueContractTest
-				.suite(new Delegate()));
-		return suite;
-	}
-
-	private static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		public IObservableValue createObservableValue(Realm realm) {
-			return new ConstantObservableValue(realm, new Object(),
-					Object.class);
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return Object.class;
-		}
-	}
-
-	/**
-	 * Non-API--this class is public so that SuiteBuilder can access it.
-	 */
-	public static class UnchangeableObservableValueContractTest extends
-			ObservableValueContractTest {
-		public UnchangeableObservableValueContractTest(String name,
-				IObservableValueContractDelegate delegate) {
-			super(name, delegate);
-		}
-
-		public void testChange_OrderOfNotifications() {
-			// disabled
-		}
-
-		public void testChange_ValueChangeEvent() {
-			// disabled
-		}
-
-		public void testChange_ValueChangeEventDiff() {
-			// disabled
-		}
-
-		public void testChange_ValueChangeEventFiredAfterValueIsSet() {
-			// disabled
-		}
-
-		public void testRemoveValueChangeListener_RemovesListener()
-				throws Exception {
-			// disabled
-		}
-
-		public void testChange_ChangeEvent() {
-			// disabled
-		}
-
-		public void testChange_EventObservable() {
-			// disabled
-		}
-
-		public void testChange_ObservableRealmIsTheCurrentRealm() {
-			// disabled
-		}
-
-		public void testChange_RealmCheck() {
-			// disabled
-		}
-
-		public void testRemoveChangeListener_RemovesListener() {
-			// disabled
-		}
-
-		public void testIsStale_RealmChecks() {
-			// disabled
-		}
-
-		public void testIsStale_GetterCalled() throws Exception {
-			// disabled
-		}
-
-		public void testIsDisposed() throws Exception {
-			// disabled
-		}
-
-		public void testAddDisposeListener_HandleDisposeInvoked() {
-			// disabled
-		}
-
-		public static Test suite(IObservableValueContractDelegate delegate) {
-			return new SuiteBuilder().addObservableContractTest(
-					UnchangeableObservableValueContractTest.class, delegate)
-					.build();
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/DelayedObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/DelayedObservableValueTest.java
deleted file mode 100644
index a223579..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/DelayedObservableValueTest.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 212223)
- *     Matthew Hall - bug 213145, 245647
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Tests for DelayedObservableValue
- * 
- * @since 1.2
- */
-public class DelayedObservableValueTest extends AbstractDefaultRealmTestCase {
-	private Object oldValue;
-	private Object newValue;
-	private ObservableValueStub target;
-	private IObservableValue delayed;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		target = new ObservableValueStub(Realm.getDefault());
-		oldValue = new Object();
-		newValue = new Object();
-		target.setValue(oldValue);
-		delayed = Observables.observeDelayedValue(1, target);
-	}
-
-	protected void tearDown() throws Exception {
-		target.dispose();
-		target = null;
-		super.tearDown();
-	}
-
-	public void testIsStale_WhenTargetIsStale() {
-		assertFalse(target.isStale());
-		assertFalse(delayed.isStale());
-
-		target.fireStale();
-
-		assertTrue(target.isStale());
-		assertTrue(delayed.isStale());
-	}
-
-	public void testIsStale_DuringDelay() {
-		assertFalse(target.isStale());
-		assertFalse(delayed.isStale());
-
-		target.setValue(newValue);
-
-		assertFalse(target.isStale());
-		assertTrue(delayed.isStale());
-	}
-
-	public void testGetValueType_SameAsTarget() {
-		assertEquals(target.getValueType(), delayed.getValueType());
-	}
-
-	public void testGetValue_FiresPendingValueChange() {
-		assertFiresPendingValueChange(new Runnable() {
-			public void run() {
-				final Object value = delayed.getValue();
-				assertEquals(newValue, value);
-			}
-		});
-	}
-
-	public void testSetValue_PropagatesToTarget() {
-		assertEquals(oldValue, delayed.getValue());
-		assertEquals(oldValue, target.getValue());
-
-		delayed.setValue(newValue);
-
-		assertEquals(newValue, target.getValue());
-		assertEquals(newValue, delayed.getValue());
-	}
-
-	public void testSetValue_CachesGetValueFromTarget() {
-		Object overrideValue = target.overrideValue = new Object();
-
-		assertEquals(oldValue, delayed.getValue());
-		assertEquals(oldValue, target.getValue());
-
-		delayed.setValue(newValue);
-
-		assertEquals(overrideValue, target.getValue());
-		assertEquals(overrideValue, delayed.getValue());
-	}
-
-	public void testSetValue_FiresValueChangeEvent() {
-		ValueChangeEventTracker targetTracker = ValueChangeEventTracker
-				.observe(target);
-		ValueChangeEventTracker delayedTracker = ValueChangeEventTracker
-				.observe(delayed);
-
-		delayed.setValue(newValue);
-
-		assertEquals(1, targetTracker.count);
-		assertEquals(oldValue, targetTracker.event.diff.getOldValue());
-		assertEquals(newValue, targetTracker.event.diff.getNewValue());
-
-		assertEquals(1, delayedTracker.count);
-		assertEquals(oldValue, delayedTracker.event.diff.getOldValue());
-		assertEquals(newValue, delayedTracker.event.diff.getNewValue());
-	}
-
-	public void testWait_FiresPendingValueChange() {
-		assertFiresPendingValueChange(new Runnable() {
-			public void run() {
-				// Give plenty of time for display to run timer task
-				long timeout = time() + 5000;
-				do {
-					sleep(10);
-					processDisplayEvents();
-				} while (delayed.isStale() && time() < timeout);
-			}
-
-			private void sleep(int delay) {
-				try {
-					Thread.sleep(delay);
-				} catch (InterruptedException e) {
-					Thread.currentThread().interrupt();
-				}
-			}
-
-			private void processDisplayEvents() {
-				Display display = Display.getCurrent();
-				while (display.readAndDispatch()) {
-				}
-			}
-
-			private long time() {
-				return System.currentTimeMillis();
-			}
-		});
-	}
-
-	private void assertFiresPendingValueChange(Runnable runnable) {
-		ValueChangeEventTracker tracker = ValueChangeEventTracker
-				.observe(delayed);
-
-		target.setValue(newValue);
-		assertTrue(delayed.isStale());
-		assertEquals(0, tracker.count);
-
-		runnable.run();
-
-		assertFalse(delayed.isStale());
-		assertEquals(1, tracker.count);
-		assertEquals(oldValue, tracker.event.diff.getOldValue());
-		assertEquals(newValue, tracker.event.diff.getNewValue());
-	}
-
-	static class ObservableValueStub extends AbstractObservableValue {
-		private Object value;
-		private boolean stale;
-
-		Object overrideValue;
-
-		public ObservableValueStub(Realm realm) {
-			super(realm);
-		}
-
-		protected Object doGetValue() {
-			return value;
-		}
-
-		protected void doSetValue(Object value) {
-			Object oldValue = this.value;
-			if (overrideValue != null)
-				value = overrideValue;
-			this.value = value;
-			stale = false;
-			fireValueChange(Diffs.createValueDiff(oldValue, value));
-		}
-
-		public Object getValueType() {
-			return Object.class;
-		}
-
-		protected void fireStale() {
-			stale = true;
-			super.fireStale();
-		}
-
-		public boolean isStale() {
-			return stale;
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(DelayedObservableValueTest.class
-				.getName());
-		suite.addTestSuite(DelayedObservableValueTest.class);
-		suite.addTest(MutableObservableValueContractTest
-				.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableValueContractDelegate {
-		public IObservableValue createObservableValue(Realm realm) {
-			return Observables.observeDelayedValue(0, new ObservableValueStub(
-					realm));
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return Object.class;
-		}
-
-		public void change(IObservable observable) {
-			IObservableValue observableValue = (IObservableValue) observable;
-			observableValue.setValue(createValue(observableValue));
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return new Object();
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/EmptyObservableListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/EmptyObservableListTest.java
deleted file mode 100644
index 59ca5be..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/EmptyObservableListTest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 208332)
- *     Matthew Hall - bugs 213145, 146397
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.internal.databinding.observable.EmptyObservableList;
-import org.eclipse.jface.databinding.conformance.ObservableListContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.delegate.IObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.SuiteBuilder;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * @since 3.2
- * 
- */
-public class EmptyObservableListTest {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(EmptyObservableListTest.class.getName());
-		suite.addTest(ImmutableObservableListContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	public static class ImmutableObservableListContractTest extends
-			ObservableListContractTest {
-		public static Test suite(IObservableCollectionContractDelegate delegate) {
-			return new SuiteBuilder().addObservableContractTest(
-					ImmutableObservableListContractTest.class, delegate)
-					.build();
-		}
-
-		public ImmutableObservableListContractTest(
-				IObservableCollectionContractDelegate delegate) {
-			super(delegate);
-		}
-
-		public ImmutableObservableListContractTest(String name,
-				IObservableCollectionContractDelegate delegate) {
-			super(name, delegate);
-		}
-
-		public void testGet_GetterCalled() {
-			// disabled
-		}
-
-		public void testSubList_GetterCalled() {
-			// disabled
-		}
-
-		public void testChange_ChangeEvent() {
-			// disabled
-		}
-
-		public void testChange_EventObservable() {
-			// disabled
-		}
-
-		public void testChange_ObservableRealmIsTheCurrentRealm() {
-			// disabled
-		}
-
-		public void testChange_RealmCheck() {
-			// disabled
-		}
-
-		public void testRemoveChangeListener_RemovesListener() {
-			// disabled
-		}
-
-		public void testIndexOf_GetterCalled() {
-			// disabled
-		}
-
-		public void testLastIndexOf_GetterCalled() {
-			// disabled
-		}
-
-		public void testListIterator_GetterCalled() {
-			// disabled
-		}
-
-		public void testListIteratorAtIndex_GetterCalled() {
-			// disabled
-		}
-
-		public void testContains_GetterCalled() {
-			// disabled
-		}
-
-		public void testContainsAll_GetterCalled() {
-			// disabled
-		}
-
-		public void testEquals_GetterCalled() {
-			// disabled
-		}
-
-		public void testHashCode_GetterCalled() {
-			// disabled
-		}
-
-		public void testIsEmpty_GetterCalled() {
-			// disabled
-		}
-
-		public void testIterator_GetterCalled() {
-			// disabled
-		}
-
-		public void testSize_GetterCalled() throws Exception {
-			// disabled
-		}
-
-		public void testToArray_GetterCalled() throws Exception {
-			// disabled
-		}
-
-		public void testToArrayWithObjectArray_GetterCalled() throws Exception {
-			// disabled
-		}
-
-		public void testIsStale_GetterCalled() throws Exception {
-			// disabled
-		}
-
-		public void testIsDisposed() throws Exception {
-			// disabled
-		}
-
-		public void testAddDisposeListener_HandleDisposeInvoked() {
-			// disabled
-		}
-	}
-
-	private static class Delegate extends
-			AbstractObservableCollectionContractDelegate {
-		private Object elementType = new Object();
-
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			return new EmptyObservableList(realm, elementType);
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return elementType;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/EmptyObservableSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/EmptyObservableSetTest.java
deleted file mode 100644
index 79f2c06..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/EmptyObservableSetTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 208332)
- *     Matthew Hall - bugs 213145, 146397
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.internal.databinding.observable.EmptyObservableSet;
-import org.eclipse.jface.databinding.conformance.ObservableCollectionContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.delegate.IObservableCollectionContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.SuiteBuilder;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * @since 3.2
- * 
- */
-public class EmptyObservableSetTest {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(EmptyObservableSetTest.class.getName());
-		suite.addTest(ImmutableObservableSetContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	public static class ImmutableObservableSetContractTest extends
-			ObservableCollectionContractTest {
-		public static Test suite(IObservableCollectionContractDelegate delegate) {
-			return new SuiteBuilder().addObservableContractTest(
-					ImmutableObservableSetContractTest.class, delegate).build();
-		}
-
-		public ImmutableObservableSetContractTest(
-				IObservableCollectionContractDelegate delegate) {
-			super(delegate);
-		}
-
-		public ImmutableObservableSetContractTest(String name,
-				IObservableCollectionContractDelegate delegate) {
-			super(name, delegate);
-		}
-
-		public void testChange_ChangeEvent() {
-			// disabled
-		}
-
-		public void testChange_EventObservable() {
-			// disabled
-		}
-
-		public void testChange_ObservableRealmIsTheCurrentRealm() {
-			// disabled
-		}
-
-		public void testChange_RealmCheck() {
-			// disabled
-		}
-
-		public void testRemoveChangeListener_RemovesListener() {
-			// disabled
-		}
-
-		public void testContains_GetterCalled() {
-			// disabled
-		}
-
-		public void testContainsAll_GetterCalled() {
-			// disabled
-		}
-
-		public void testEquals_GetterCalled() {
-			// disabled
-		}
-
-		public void testHashCode_GetterCalled() {
-			// disabled
-		}
-
-		public void testIsEmpty_GetterCalled() {
-			// disabled
-		}
-
-		public void testIterator_GetterCalled() {
-			// disabled
-		}
-
-		public void testSize_GetterCalled() {
-			// disabled
-		}
-
-		public void testToArray_GetterCalled() {
-			// disabled
-		}
-
-		public void testToArrayWithObjectArray_GetterCalled() {
-			// disabled
-		}
-
-		public void testIsStale_GetterCalled() throws Exception {
-			// disabled
-		}
-
-		public void testIsDisposed() throws Exception {
-			// disabled
-		}
-
-		public void testAddDisposeListener_HandleDisposeInvoked() {
-			// disabled
-		}
-	}
-
-	private static class Delegate extends
-			AbstractObservableCollectionContractDelegate {
-		private Object elementType = new Object();
-
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			return new EmptyObservableSet(realm, elementType);
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return elementType;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/MapEntryObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/MapEntryObservableValueTest.java
deleted file mode 100644
index d27e02a..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/MapEntryObservableValueTest.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Marko Topolnik and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Marko Topolnik - initial API and implementation (bug 184830)
- *     Matthew Hall - bugs 184830, 213145
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.map.WritableMap;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.databinding.observable.value.ValueDiff;
-import org.eclipse.core.internal.databinding.observable.MapEntryObservableValue;
-import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.ObservableStaleContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 1.2
- */
-public class MapEntryObservableValueTest extends AbstractDefaultRealmTestCase
-		implements IValueChangeListener {
-	private static final String VALUE1 = "Value1";
-	private static final String VALUE2 = "Value2";
-
-	private final Object key = "mapKey";
-	private IObservableMap map;
-	private ValueDiff diff;
-	private MapEntryObservableValue observedValue;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		this.map = new WritableMap();
-		this.observedValue = (MapEntryObservableValue) Observables
-				.observeMapEntry(this.map, this.key, String.class);
-		observedValue.addValueChangeListener(this);
-	}
-
-	public void handleValueChange(ValueChangeEvent p_event) {
-		this.diff = p_event.diff;
-	}
-
-	public void testNullValue() {
-		// test entry added with value null
-		this.map.put(this.key, null);
-		assertNull(this.diff);
-		assertNull(this.observedValue.getValue());
-		// test value changed from null to null
-		this.map.put(this.key, null);
-		assertNull(this.diff);
-		assertNull(this.observedValue.getValue());
-		// test null-valued entry removed
-		this.map.remove(this.key);
-		assertNull(this.diff);
-		assertNull(this.observedValue.getValue());
-	}
-
-	public void testNonNullValue() {
-		// test add non-null value
-		this.map.put(this.key, VALUE1);
-		assertNotNull(this.diff);
-		assertNull(this.diff.getOldValue());
-		assertSame(VALUE1, this.diff.getNewValue());
-		assertSame(VALUE1, this.observedValue.getValue());
-
-		// test change to another non-null value
-		this.diff = null;
-		this.map.put(this.key, VALUE2);
-		assertNotNull(this.diff);
-		assertSame(VALUE1, this.diff.getOldValue());
-		assertSame(VALUE2, this.diff.getNewValue());
-		assertSame(VALUE2, this.observedValue.getValue());
-	}
-
-	public void testTransitionBetweenNullAndNonNull() {
-		this.map.put(this.key, null);
-
-		// test transition to non-null
-		this.diff = null;
-		this.map.put(this.key, VALUE1);
-		assertNotNull(this.diff);
-		assertNull(this.diff.getOldValue());
-		assertSame(VALUE1, this.diff.getNewValue());
-
-		// test transition to null
-		this.diff = null;
-		this.map.put(this.key, null);
-		assertNotNull(this.diff);
-		assertSame(VALUE1, this.diff.getOldValue());
-		assertNull(this.diff.getNewValue());
-	}
-
-	public void testRemoveKey() {
-		this.map.put(this.key, VALUE1);
-
-		this.diff = null;
-		this.map.remove(this.key);
-		assertNotNull(this.diff);
-		assertSame(VALUE1, this.diff.getOldValue());
-		assertNull(this.diff.getNewValue());
-	}
-
-	public void testGetAndSetValue() {
-		// test set null value
-		this.observedValue.setValue(null);
-		assertNull(this.observedValue.getValue());
-		assertNull(this.diff);
-
-		// test set non-null value
-		this.observedValue.setValue(VALUE1);
-		assertSame(VALUE1, this.observedValue.getValue());
-		assertNotNull(this.diff);
-		assertNull(this.diff.getOldValue());
-		assertSame(VALUE1, this.diff.getNewValue());
-
-		// test set another non-null value
-		this.diff = null;
-		this.observedValue.setValue(VALUE2);
-		assertSame(VALUE2, this.observedValue.getValue());
-		assertNotNull(this.diff);
-		assertSame(VALUE1, this.diff.getOldValue());
-		assertSame(VALUE2, this.diff.getNewValue());
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(MapEntryObservableValueTest.class.getName());
-		suite.addTestSuite(MapEntryObservableValueTest.class);
-		suite.addTest(MutableObservableValueContractTest.suite(new Delegate()));
-		suite.addTest(ObservableStaleContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	private static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Object valueType = new Object();
-
-		public IObservableValue createObservableValue(Realm realm) {
-			WritableMap map = new WritableMap(realm);
-			Object key = new Object();
-			map.put(key, new Object());
-			return new MapEntryObservableValueStub(map, key, valueType);
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return new Object();
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return valueType;
-		}
-
-		public void change(IObservable observable) {
-			MapEntryObservableValueStub mapEntryValue = (MapEntryObservableValueStub) observable;
-			mapEntryValue.map
-					.put(mapEntryValue.key, createValue(mapEntryValue));
-		}
-
-		public void setStale(IObservable observable, boolean stale) {
-			MapEntryObservableValueStub mapEntryValue = (MapEntryObservableValueStub) observable;
-			mapEntryValue.map.setStale(stale);
-		}
-	}
-
-	private static class MapEntryObservableValueStub extends
-			MapEntryObservableValue {
-		WritableMap map;
-		Object key;
-
-		MapEntryObservableValueStub(WritableMap map, Object key,
-				Object valueType) {
-			super(map, key, valueType);
-			this.map = map;
-			this.key = key;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/StalenessObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/StalenessObservableValueTest.java
deleted file mode 100644
index 0d5a5f3..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/StalenessObservableValueTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 212468)
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable;
-
-import org.eclipse.core.databinding.observable.AbstractObservable;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.internal.databinding.observable.StalenessObservableValue;
-import org.eclipse.jface.databinding.conformance.ObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-/**
- * Tests for StalenessObservableValue
- * 
- * @since 1.1
- */
-public class StalenessObservableValueTest extends TestCase {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(StalenessObservableValueTest.class.getName());
-		suite.addTest(ObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class ObservableStub extends AbstractObservable {
-		boolean stale;
-
-		public ObservableStub(Realm realm) {
-			super(realm);
-		}
-
-		public boolean isStale() {
-			return stale;
-		}
-
-		public void setStale(boolean stale) {
-			if (this.stale == stale)
-				return;
-
-			this.stale = stale;
-			if (stale) {
-				fireStale();
-			} else {
-				fireChange();
-			}
-		}
-	}
-
-	static class StalenessObservableValueStub extends StalenessObservableValue {
-		ObservableStub target;
-
-		StalenessObservableValueStub(ObservableStub target) {
-			super(target);
-			this.target = target;
-		}
-	}
-
-	static class Delegate extends AbstractObservableValueContractDelegate {
-		public IObservableValue createObservableValue(Realm realm) {
-			return new StalenessObservableValueStub(new ObservableStub(realm));
-		}
-
-		public void change(IObservable observable) {
-			ObservableStub target = ((StalenessObservableValueStub) observable).target;
-			target.setStale(!target.isStale());
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return Boolean.TYPE;
-		}
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/UnmodifiableObservableListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/UnmodifiableObservableListTest.java
deleted file mode 100755
index ef13044..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/UnmodifiableObservableListTest.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Cerner Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bugs 208332, 213145, 237718
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.list.IListChangeListener;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.ListChangeEvent;
-import org.eclipse.core.databinding.observable.list.ListDiff;
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.core.databinding.observable.list.ObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.internal.databinding.observable.UnmodifiableObservableList;
-import org.eclipse.jface.databinding.conformance.ObservableListContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-public class UnmodifiableObservableListTest extends
-		AbstractDefaultRealmTestCase {
-	IObservableList unmodifiable;
-	ObservableList mutable;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		List list = new ArrayList();
-		list.add("1");
-		list.add("2");
-
-		mutable = new MutableObservableList(list, String.class);
-		unmodifiable = Observables.unmodifiableObservableList(mutable);
-	}
-
-	public void testFiresChangeEvents() throws Exception {
-		ChangeCounter mutableListener = new ChangeCounter();
-		ChangeCounter unmodifiableListener = new ChangeCounter();
-
-		mutable.addChangeListener(mutableListener);
-		unmodifiable.addChangeListener(unmodifiableListener);
-
-		assertEquals(0, mutableListener.count);
-		assertEquals(0, unmodifiableListener.count);
-		mutable.add("3");
-		assertEquals(1, mutableListener.count);
-		assertEquals(1, unmodifiableListener.count);
-	}
-
-	public void testFiresListChangeEvents() throws Exception {
-		ListChangeCounter mutableListener = new ListChangeCounter();
-		ListChangeCounter unmodifiableListener = new ListChangeCounter();
-
-		mutable.addListChangeListener(mutableListener);
-		unmodifiable.addListChangeListener(unmodifiableListener);
-
-		assertEquals(0, mutableListener.count);
-		assertEquals(0, unmodifiableListener.count);
-
-		String element = "3";
-		mutable.add(element);
-		assertEquals(1, mutableListener.count);
-		assertEquals(mutable, mutableListener.source);
-		assertEquals(1, mutableListener.diff.getDifferences().length);
-
-		ListDiffEntry difference = mutableListener.diff.getDifferences()[0];
-		assertEquals(element, difference.getElement());
-		assertTrue(difference.isAddition());
-		assertEquals(3, mutable.size());
-
-		assertEquals(1, unmodifiableListener.count);
-		assertEquals(unmodifiable, unmodifiableListener.source);
-		assertEquals(1, unmodifiableListener.diff.getDifferences().length);
-
-		difference = unmodifiableListener.diff.getDifferences()[0];
-		assertEquals(element, difference.getElement());
-		assertTrue(difference.isAddition());
-		assertEquals(3, unmodifiable.size());
-	}
-
-	public void testFiresStaleEvents() throws Exception {
-		StaleCounter mutableListener = new StaleCounter();
-		StaleCounter unmodifiableListener = new StaleCounter();
-
-		mutable.addStaleListener(mutableListener);
-		unmodifiable.addStaleListener(unmodifiableListener);
-
-		assertEquals(0, mutableListener.count);
-		assertEquals(0, unmodifiableListener.count);
-		mutable.setStale(true);
-		assertEquals(1, mutableListener.count);
-		assertEquals(mutable, mutableListener.source);
-		assertTrue(mutable.isStale());
-		assertEquals(1, unmodifiableListener.count);
-		assertEquals(unmodifiable, unmodifiableListener.source);
-		assertTrue(unmodifiable.isStale());
-	}
-
-	public void testIsStale() throws Exception {
-		assertFalse(mutable.isStale());
-		assertFalse(unmodifiable.isStale());
-		mutable.setStale(true);
-		assertTrue(mutable.isStale());
-		assertTrue(unmodifiable.isStale());
-	}
-
-	private static class StaleCounter implements IStaleListener {
-		int count;
-		IObservable source;
-
-		public void handleStale(StaleEvent event) {
-			count++;
-			this.source = event.getObservable();
-		}
-	}
-
-	private static class ChangeCounter implements IChangeListener {
-		int count;
-		IObservable source;
-
-		public void handleChange(ChangeEvent event) {
-			count++;
-			this.source = event.getObservable();
-		}
-	}
-
-	private static class ListChangeCounter implements IListChangeListener {
-		int count;
-		IObservableList source;
-		ListDiff diff;
-
-		public void handleListChange(ListChangeEvent event) {
-			count++;
-			this.source = event.getObservableList();
-			this.diff = event.diff;
-		}
-	}
-
-	private static class MutableObservableList extends ObservableList {
-		/**
-		 * @param wrappedList
-		 * @param elementType
-		 */
-		public MutableObservableList(List wrappedList, Object elementType) {
-			super(wrappedList, elementType);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.internal.databinding.provisional.observable.list.ObservableList#add(java.lang.Object)
-		 */
-		public boolean add(Object o) {
-			boolean result = wrappedList.add(o);
-			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
-					wrappedList.size() - 1, true, o)));
-
-			return result;
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(UnmodifiableObservableListTest.class.getName());
-		suite.addTestSuite(UnmodifiableObservableListTest.class);
-		suite.addTest(ObservableListContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	private static class Delegate extends
-			AbstractObservableCollectionContractDelegate {
-		private Object elementType = new Object();
-
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			IObservableList backingList = new WritableList(realm,
-					new ArrayList(), elementType);
-			IObservableList result = new UnmodifiableObservableListStub(
-					backingList);
-			for (int i = 0; i < elementCount; i++)
-				backingList.add(createElement(result));
-			return result;
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object();
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return elementType;
-		}
-
-		public void change(IObservable observable) {
-			UnmodifiableObservableListStub unmodifiableList = (UnmodifiableObservableListStub) observable;
-			IObservableList wrappedList = unmodifiableList.wrappedList;
-			wrappedList.add(createElement(unmodifiableList));
-		}
-	}
-
-	private static class UnmodifiableObservableListStub extends
-			UnmodifiableObservableList {
-		IObservableList wrappedList;
-
-		UnmodifiableObservableListStub(IObservableList wrappedList) {
-			super(wrappedList);
-			this.wrappedList = wrappedList;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/UnmodifiableObservableSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/UnmodifiableObservableSetTest.java
deleted file mode 100644
index 1c3520b..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/UnmodifiableObservableSetTest.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 Matthew and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *         (through UnmodifiableObservableListTest.java)
- *     Matthew Hall - bugs 208332, 213145, 237718
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.ISetChangeListener;
-import org.eclipse.core.databinding.observable.set.ObservableSet;
-import org.eclipse.core.databinding.observable.set.SetChangeEvent;
-import org.eclipse.core.databinding.observable.set.SetDiff;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.core.internal.databinding.observable.UnmodifiableObservableSet;
-import org.eclipse.jface.databinding.conformance.ObservableCollectionContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-public class UnmodifiableObservableSetTest extends AbstractDefaultRealmTestCase {
-	UnmodifiableObservableSet unmodifiable;
-	MutableObservableSet mutable;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		Set set = new HashSet();
-		set.add("1");
-		set.add("2");
-
-		mutable = new MutableObservableSet(set, String.class);
-		unmodifiable = (UnmodifiableObservableSet) Observables
-				.unmodifiableObservableSet(mutable);
-	}
-
-	public void testFiresChangeEvents() throws Exception {
-		ChangeCounter mutableListener = new ChangeCounter();
-		ChangeCounter unmodifiableListener = new ChangeCounter();
-
-		mutable.addChangeListener(mutableListener);
-		unmodifiable.addChangeListener(unmodifiableListener);
-
-		assertEquals(0, mutableListener.count);
-		assertEquals(0, unmodifiableListener.count);
-		mutable.add("3");
-		assertEquals(1, mutableListener.count);
-		assertEquals(1, unmodifiableListener.count);
-	}
-
-	public void testFiresSetChangeEvents() throws Exception {
-		SetChangeCounter mutableListener = new SetChangeCounter();
-		SetChangeCounter unmodifiableListener = new SetChangeCounter();
-
-		mutable.addSetChangeListener(mutableListener);
-		unmodifiable.addSetChangeListener(unmodifiableListener);
-
-		assertEquals(0, mutableListener.count);
-		assertEquals(0, unmodifiableListener.count);
-
-		String element = "3";
-		mutable.add(element);
-		assertEquals(1, mutableListener.count);
-		assertEquals(mutable, mutableListener.source);
-		assertEquals(1, mutableListener.diff.getAdditions().size());
-
-		Object addition = mutableListener.diff.getAdditions().toArray()[0];
-		assertEquals(element, addition);
-		assertEquals(3, mutable.size());
-
-		assertEquals(1, unmodifiableListener.count);
-		assertEquals(unmodifiable, unmodifiableListener.source);
-		assertEquals(1, unmodifiableListener.diff.getAdditions().size());
-
-		addition = unmodifiableListener.diff.getAdditions().toArray()[0];
-		assertEquals(element, addition);
-		assertEquals(3, unmodifiable.size());
-	}
-
-	public void testFiresStaleEvents() throws Exception {
-		StaleCounter mutableListener = new StaleCounter();
-		StaleCounter unmodifiableListener = new StaleCounter();
-
-		mutable.addStaleListener(mutableListener);
-		unmodifiable.addStaleListener(unmodifiableListener);
-
-		assertEquals(0, mutableListener.count);
-		assertEquals(0, unmodifiableListener.count);
-		mutable.setStale(true);
-		assertEquals(1, mutableListener.count);
-		assertEquals(mutable, mutableListener.source);
-		assertTrue(mutable.isStale());
-		assertEquals(1, unmodifiableListener.count);
-		assertEquals(unmodifiable, unmodifiableListener.source);
-		assertTrue(unmodifiable.isStale());
-	}
-
-	public void testIsStale() throws Exception {
-		assertFalse(mutable.isStale());
-		assertFalse(unmodifiable.isStale());
-		mutable.setStale(true);
-		assertTrue(mutable.isStale());
-		assertTrue(unmodifiable.isStale());
-	}
-
-	private static class StaleCounter implements IStaleListener {
-		int count;
-		IObservable source;
-
-		public void handleStale(StaleEvent event) {
-			count++;
-			this.source = event.getObservable();
-		}
-	}
-
-	private static class ChangeCounter implements IChangeListener {
-		int count;
-		IObservable source;
-
-		public void handleChange(ChangeEvent event) {
-			count++;
-			this.source = event.getObservable();
-		}
-	}
-
-	private static class SetChangeCounter implements ISetChangeListener {
-		int count;
-		IObservableSet source;
-		SetDiff diff;
-
-		public void handleSetChange(SetChangeEvent event) {
-			count++;
-			this.source = event.getObservableSet();
-			this.diff = event.diff;
-		}
-	}
-
-	private static class MutableObservableSet extends ObservableSet {
-		/**
-		 * @param wrappedList
-		 * @param elementType
-		 */
-		public MutableObservableSet(Set wrappedSet, Object elementType) {
-			super(wrappedSet, elementType);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.internal.databinding.provisional.observable.list.ObservableList#add(java.lang.Object)
-		 */
-		public boolean add(Object o) {
-			boolean result = wrappedSet.add(o);
-			if (result)
-				fireSetChange(Diffs.createSetDiff(Collections.singleton(o),
-						Collections.EMPTY_SET));
-			return result;
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(UnmodifiableObservableSetTest.class.getName());
-		suite.addTestSuite(UnmodifiableObservableSetTest.class);
-		suite.addTest(ObservableCollectionContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	private static class Delegate extends
-			AbstractObservableCollectionContractDelegate {
-		private Object elementType = new Object();
-
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			IObservableSet backingList = new WritableSet(realm, new HashSet(),
-					elementType);
-			IObservableSet result = new UnmodifiableObservableSetStub(
-					backingList);
-			for (int i = 0; i < elementCount; i++)
-				backingList.add(createElement(result));
-			return result;
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object();
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return elementType;
-		}
-
-		public void change(IObservable observable) {
-			UnmodifiableObservableSetStub unmodifiableList = (UnmodifiableObservableSetStub) observable;
-			IObservableSet wrappedList = unmodifiableList.wrappedSet;
-			wrappedList.add(createElement(unmodifiableList));
-		}
-	}
-
-	private static class UnmodifiableObservableSetStub extends
-			UnmodifiableObservableSet {
-		IObservableSet wrappedSet;
-
-		UnmodifiableObservableSetStub(IObservableSet wrappedSet) {
-			super(wrappedSet);
-			this.wrappedSet = wrappedSet;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/UnmodifiableObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/UnmodifiableObservableValueTest.java
deleted file mode 100644
index 6654285..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/UnmodifiableObservableValueTest.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 219909)
- *     Matthew Hall - bug 213145
- *     Ovidio Mallo - bug 237163
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.StaleEvent;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.internal.databinding.observable.UnmodifiableObservableValue;
-import org.eclipse.jface.databinding.conformance.ObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.2
- * 
- */
-public class UnmodifiableObservableValueTest extends
-		AbstractDefaultRealmTestCase {
-
-	private UnmodifiableObservableValueStub unmodifiable;
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(UnmodifiableObservableValueTest.class.getName());
-		suite.addTestSuite(UnmodifiableObservableValueTest.class);
-		suite.addTest(ObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		WrappedObservableValue wrapped = new WrappedObservableValue(Realm
-				.getDefault(), null, String.class);
-		unmodifiable = new UnmodifiableObservableValueStub(wrapped);
-	}
-
-	public void testFiresStaleEvents() {
-		StaleCounter wrappedListener = new StaleCounter();
-		StaleCounter unmodifiableListener = new StaleCounter();
-
-		unmodifiable.wrappedValue.addStaleListener(wrappedListener);
-		unmodifiable.addStaleListener(unmodifiableListener);
-
-		assertEquals(0, wrappedListener.count);
-		assertEquals(0, unmodifiableListener.count);
-		unmodifiable.wrappedValue.setStale(true);
-		assertEquals(1, wrappedListener.count);
-		assertEquals(unmodifiable.wrappedValue, wrappedListener.source);
-		assertTrue(unmodifiable.wrappedValue.isStale());
-		assertEquals(1, unmodifiableListener.count);
-		assertEquals(unmodifiable, unmodifiableListener.source);
-		assertTrue(unmodifiable.isStale());
-	}
-
-	public void testIsStale() {
-		assertFalse(unmodifiable.wrappedValue.isStale());
-		assertFalse(unmodifiable.isStale());
-		unmodifiable.wrappedValue.setStale(true);
-		assertTrue(unmodifiable.wrappedValue.isStale());
-		assertTrue(unmodifiable.isStale());
-	}
-
-	private static class StaleCounter implements IStaleListener {
-		int count;
-		IObservable source;
-
-		public void handleStale(StaleEvent event) {
-			count++;
-			source = event.getObservable();
-		}
-	}
-
-	private static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Object valueType = new Object();
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new UnmodifiableObservableValueStub(new WrappedObservableValue(realm,
-					null, valueType));
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return valueType;
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return new Object();
-		}
-
-		public void change(IObservable observable) {
-			UnmodifiableObservableValueStub wrapper = (UnmodifiableObservableValueStub) observable;
-			wrapper.wrappedValue.setValue(createValue(wrapper));
-		}
-
-		public void setStale(IObservable observable, boolean stale) {
-			UnmodifiableObservableValueStub wrapper = (UnmodifiableObservableValueStub) observable;
-			wrapper.wrappedValue.setStale(stale);
-		}
-	}
-
-	private static class UnmodifiableObservableValueStub extends
-			UnmodifiableObservableValue {
-		WrappedObservableValue wrappedValue;
-
-		UnmodifiableObservableValueStub(WrappedObservableValue wrappedValue) {
-			super(wrappedValue);
-			this.wrappedValue = wrappedValue;
-		}
-	}
-
-	private static class WrappedObservableValue extends WritableValue {
-		private boolean stale = false;
-
-		public WrappedObservableValue(Realm realm, Object initialValue,
-				Object valueType) {
-			super(realm, initialValue, valueType);
-		}
-
-		public boolean isStale() {
-			ObservableTracker.getterCalled(this);
-			return stale;
-		}
-
-		public void setStale(boolean stale) {
-			if (this.stale != stale) {
-				this.stale = stale;
-				if (stale) {
-					fireStale();
-				} else {
-					fireValueChange(Diffs.createValueDiff(getValue(),
-							getValue()));
-				}
-			}
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ValidatedObservableListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ValidatedObservableListTest.java
deleted file mode 100644
index 21793a7..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ValidatedObservableListTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 218269)
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable;
-
-import java.util.ArrayList;
-
-import junit.framework.Test;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.observable.ValidatedObservableList;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.databinding.conformance.MutableObservableListContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-public class ValidatedObservableListTest extends AbstractDefaultRealmTestCase {
-	public static Test suite() {
-		return MutableObservableListContractTest.suite(new Delegate());
-	}
-
-	static class Delegate extends AbstractObservableCollectionContractDelegate {
-		private Object elementType = new Object();
-
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			IObservableList target = new WritableList(realm, new ArrayList(),
-					elementType);
-			for (int i = 0; i < elementCount; i++)
-				target.add(createElement(target));
-			IObservableValue validationStatus = new WritableValue(realm,
-					ValidationStatus.ok(), IStatus.class);
-			return new ValidatedObservableListStub(target, validationStatus);
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object();
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return elementType;
-		}
-
-		public void change(IObservable observable) {
-			ValidatedObservableListStub validated = (ValidatedObservableListStub) observable;
-			validated.target.add(createElement(validated));
-		}
-
-		public void setStale(IObservable observable, boolean stale) {
-			ValidatedObservableListStub validated = (ValidatedObservableListStub) observable;
-			if (stale) {
-				validated.validationStatus.setValue(ValidationStatus
-						.error("error"));
-				validated.target.add(createElement(validated));
-			} else {
-				validated.validationStatus.setValue(ValidationStatus.ok());
-			}
-		}
-
-	}
-
-	static class ValidatedObservableListStub extends ValidatedObservableList {
-		IObservableList target;
-		IObservableValue validationStatus;
-
-		ValidatedObservableListStub(IObservableList target,
-				IObservableValue validationStatus) {
-			super(target, validationStatus);
-			this.target = target;
-			this.validationStatus = validationStatus;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ValidatedObservableSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ValidatedObservableSetTest.java
deleted file mode 100644
index 0748e0a..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ValidatedObservableSetTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 218269)
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable;
-
-import java.util.Collections;
-
-import junit.framework.Test;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.observable.ValidatedObservableSet;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.databinding.conformance.MutableObservableSetContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-public class ValidatedObservableSetTest extends AbstractDefaultRealmTestCase {
-	public static Test suite() {
-		return MutableObservableSetContractTest.suite(new Delegate());
-	}
-
-	static class Delegate extends AbstractObservableCollectionContractDelegate {
-		private Object elementType = new Object();
-
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			IObservableSet target = new WritableSet(realm,
-					Collections.EMPTY_SET, elementType);
-			for (int i = 0; i < elementCount; i++)
-				target.add(createElement(target));
-			IObservableValue validationStatus = new WritableValue(realm,
-					ValidationStatus.ok(), IStatus.class);
-			return new ValidatedObservableSetStub(target, validationStatus);
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object();
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return elementType;
-		}
-
-		public void change(IObservable observable) {
-			ValidatedObservableSetStub validated = (ValidatedObservableSetStub) observable;
-			validated.target.add(createElement(validated));
-		}
-
-		public void setStale(IObservable observable, boolean stale) {
-			ValidatedObservableSetStub validated = (ValidatedObservableSetStub) observable;
-			if (stale) {
-				validated.validationStatus.setValue(ValidationStatus
-						.error("error"));
-				validated.target.add(createElement(validated));
-			} else {
-				validated.validationStatus.setValue(ValidationStatus.ok());
-			}
-		}
-
-	}
-
-	static class ValidatedObservableSetStub extends ValidatedObservableSet {
-		IObservableSet target;
-		IObservableValue validationStatus;
-
-		ValidatedObservableSetStub(IObservableSet target,
-				IObservableValue validationStatus) {
-			super(target, validationStatus);
-			this.target = target;
-			this.validationStatus = validationStatus;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ValidatedObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ValidatedObservableValueTest.java
deleted file mode 100644
index fd2e0e4..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/ValidatedObservableValueTest.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 218269)
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.observable.ValidatedObservableValue;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.2
- * 
- */
-public class ValidatedObservableValueTest extends AbstractDefaultRealmTestCase {
-	private ValidatedObservableValue validated;
-	private ObservableValueStub target;
-	private IObservableValue validationStatus;
-
-	private Object oldValue;
-	private Object newValue;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		oldValue = new Object();
-		newValue = new Object();
-		target = new ObservableValueStub(Realm.getDefault());
-		target.setValue(oldValue);
-		validationStatus = new WritableValue(ValidationStatus.ok(),
-				IStatus.class);
-		validated = new ValidatedObservableValue(target, validationStatus);
-	}
-
-	public void testConstructor_RequireObservablesOnSameRealm() {
-		CurrentRealm realm1 = new CurrentRealm(true);
-		CurrentRealm realm2 = new CurrentRealm(true);
-		target = new ObservableValueStub(realm1);
-		validationStatus = new WritableValue(realm2);
-		try {
-			new ValidatedObservableValue(target, validationStatus);
-			fail("Expected exception--target and validation status should have the same realm");
-		} catch (RuntimeException expected) {
-		}
-	}
-
-	public void testIsStale_WhenTargetIsStale() {
-		assertFalse(target.isStale());
-		assertFalse(validated.isStale());
-
-		target.fireStale();
-
-		assertTrue(target.isStale());
-		assertTrue(validated.isStale());
-	}
-
-	public void testIsStale_WhileChangesPending() {
-		assertFalse(target.isStale());
-		assertFalse(validated.isStale());
-
-		validationStatus.setValue(ValidationStatus.error("error"));
-
-		// The validated observable goes stale only when the target changes
-		// value but the validation status is not OK.
-		assertFalse(target.isStale());
-		assertFalse(validated.isStale());
-
-		target.setValue(newValue);
-
-		assertFalse(target.isStale());
-		assertTrue(validated.isStale());
-
-		validationStatus.setValue(ValidationStatus.ok());
-
-		assertFalse(validated.isStale());
-	}
-
-	public void testGetValueType_SameAsTarget() {
-		assertEquals(target.getValueType(), validated.getValueType());
-	}
-
-	public void testGetValue_InitialValue() {
-		assertEquals(oldValue, target.getValue());
-		assertEquals(oldValue, validated.getValue());
-	}
-
-	public void testGetValue_WhileChangesPending() {
-		assertEquals(oldValue, target.getValue());
-		assertEquals(oldValue, validated.getValue());
-
-		validationStatus.setValue(ValidationStatus.error("error"));
-
-		assertEquals(oldValue, target.getValue());
-		assertEquals(oldValue, validated.getValue());
-
-		target.setValue(newValue);
-
-		assertEquals(newValue, target.getValue());
-		assertEquals(oldValue, validated.getValue());
-
-		validationStatus.setValue(ValidationStatus.ok());
-
-		assertEquals(newValue, validated.getValue());
-	}
-
-	public void testSetValue_PropagatesToTarget() {
-		validated.setValue(newValue);
-
-		assertEquals(newValue, validated.getValue());
-		assertEquals(newValue, target.getValue());
-	}
-
-	public void testSetValue_PropagatesToTargetWhileStatusNotOK() {
-		validationStatus.setValue(ValidationStatus.error("error"));
-
-		validated.setValue(newValue);
-
-		assertEquals(newValue, validated.getValue());
-		assertEquals(newValue, target.getValue());
-		assertFalse(validated.isStale());
-	}
-
-	public void testSetValue_CachesGetValueFromTarget() {
-		Object overrideValue = target.overrideValue = new Object();
-
-		assertEquals(oldValue, validated.getValue());
-		assertEquals(oldValue, target.getValue());
-
-		validationStatus.setValue(ValidationStatus.error("error"));
-
-		validated.setValue(newValue);
-
-		assertEquals(overrideValue, target.getValue());
-		assertEquals(overrideValue, validated.getValue());
-	}
-
-	public void testSetValue_SingleValueChangeEvent() {
-		ValueChangeEventTracker tracker = ValueChangeEventTracker
-				.observe(validated);
-
-		validated.setValue(newValue);
-		assertEquals(1, tracker.count);
-		assertEquals(oldValue, tracker.event.diff.getOldValue());
-		assertEquals(newValue, tracker.event.diff.getNewValue());
-	}
-
-	public void testSetValue_SingleValueChangeEventWhileInvalid() {
-		ValueChangeEventTracker tracker = ValueChangeEventTracker
-				.observe(validated);
-
-		validationStatus.setValue(ValidationStatus.error("error"));
-		validated.setValue(newValue);
-		assertEquals(1, tracker.count);
-		assertEquals(oldValue, tracker.event.diff.getOldValue());
-		assertEquals(newValue, tracker.event.diff.getNewValue());
-	}
-
-	public void testSetValue_FiresSingleValueChangeEventWithTargetOverride() {
-		ValueChangeEventTracker tracker = ValueChangeEventTracker
-				.observe(validated);
-
-		Object overrideValue = new Object();
-		target.overrideValue = overrideValue;
-		validated.setValue(newValue);
-
-		assertEquals(1, tracker.count);
-		assertEquals(oldValue, tracker.event.diff.getOldValue());
-		assertEquals(overrideValue, tracker.event.diff.getNewValue());
-	}
-
-	public void testSetValue_FiresValueChangeEvent() {
-		ValueChangeEventTracker targetTracker = ValueChangeEventTracker
-				.observe(target);
-		ValueChangeEventTracker validatedTracker = ValueChangeEventTracker
-				.observe(validated);
-
-		validated.setValue(newValue);
-
-		assertEquals(1, targetTracker.count);
-		assertEquals(oldValue, targetTracker.event.diff.getOldValue());
-		assertEquals(newValue, targetTracker.event.diff.getNewValue());
-
-		assertEquals(1, validatedTracker.count);
-		assertEquals(oldValue, validatedTracker.event.diff.getOldValue());
-		assertEquals(newValue, validatedTracker.event.diff.getNewValue());
-	}
-
-	public void testIsStale_MatchTargetStaleness() {
-		target.forceStale = true;
-		target.fireStale();
-
-		assertTrue(target.isStale());
-		assertTrue(validated.isStale());
-
-		target.setValue(newValue);
-
-		assertTrue(target.isStale());
-		assertTrue(validated.isStale());
-	}
-
-	static class ObservableValueStub extends AbstractObservableValue {
-		private Object value;
-		private boolean stale;
-		private boolean forceStale;
-
-		Object overrideValue;
-
-		public ObservableValueStub(Realm realm) {
-			super(realm);
-		}
-
-		protected Object doGetValue() {
-			return value;
-		}
-
-		protected void doSetValue(Object value) {
-			Object oldValue = this.value;
-			if (overrideValue != null)
-				value = overrideValue;
-			this.value = value;
-			stale = forceStale;
-			fireValueChange(Diffs.createValueDiff(oldValue, value));
-		}
-
-		public Object getValueType() {
-			return Object.class;
-		}
-
-		protected void fireStale() {
-			stale = true;
-			super.fireStale();
-		}
-
-		public boolean isStale() {
-			return stale;
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ValidatedObservableValueTest.class.getName());
-		suite.addTestSuite(ValidatedObservableValueTest.class);
-		suite.addTest(MutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableValueContractDelegate {
-		private Object valueType = new Object();
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new ValidatedObservableValueStub(realm, valueType);
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return new Object();
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return valueType;
-		}
-
-		public void change(IObservable observable) {
-			ValidatedObservableValueStub validated = (ValidatedObservableValueStub) observable;
-			IObservableValue target = validated.target;
-			target.setValue(createValue(validated));
-		}
-	}
-
-	static class ValidatedObservableValueStub extends ValidatedObservableValue {
-		final IObservableValue target;
-		final IObservableValue validationStatus;
-
-		ValidatedObservableValueStub(Realm realm, Object valueType) {
-			this(new WritableValue(realm, null, valueType), new WritableValue(
-					realm, ValidationStatus.ok(), IStatus.class));
-		}
-
-		private ValidatedObservableValueStub(IObservableValue target,
-				IObservableValue validationStatus) {
-			super(target, validationStatus);
-			this.target = target;
-			this.validationStatus = validationStatus;
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableListTest.java
deleted file mode 100644
index 653f777..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableListTest.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bugs 208858, 221351, 213145
- *     Ovidio Mallo - bug 241318
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable.masterdetail;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableList;
-import org.eclipse.core.runtime.AssertionFailedException;
-import org.eclipse.jface.databinding.conformance.MutableObservableListContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.2
- */
-public class DetailObservableListTest extends AbstractDefaultRealmTestCase {
-	/**
-	 * Asserts the use case of specifying null on construction for the detail
-	 * type of the detail list.
-	 * 
-	 * @throws Exception
-	 */
-	public void testElementTypeNull() throws Exception {
-		WritableValue observableValue = new WritableValue(new WritableList(new ArrayList(), Object.class), null);
-
-		WritableListFactory factory = new WritableListFactory();
-		DetailObservableList detailObservable = new DetailObservableList(
-				factory, observableValue, null);
-		assertNull(detailObservable.getElementType());
-
-		//change the type returned from the factory
-		factory.type = String.class;
-		observableValue.setValue(new WritableList(new ArrayList(), String.class));
-		assertNull("element type not null", detailObservable.getElementType());
-	}
-	
-	/**
-	 * Asserts that you can't change the type across multiple inner observables.
-	 * 
-	 * @throws Exception
-	 */
-	public void testElementTypeNotNull() throws Exception {
-		WritableValue observableValue = new WritableValue(new WritableList(new ArrayList(), Object.class),
-				null);
-
-		WritableListFactory factory = new WritableListFactory();
-		DetailObservableList detailObservable = new DetailObservableList(factory,
-				observableValue, Object.class);
-		assertEquals(factory.type, detailObservable.getElementType());
-
-		try {
-			factory.type = String.class;
-			observableValue.setValue(new WritableList(Arrays
-					.asList(new Object[] { new Object() }), String.class));
-			fail("if an element type is set this cannot be changed");
-		} catch (AssertionFailedException e) {
-		}
-	}
-
-	/**
-	 * Asserts that the master observable value is not disposed upon disposing
-	 * its detail observable value (bug 241318).
-	 */
-	public void testMasterNotDisposedWhenDetailDisposed() {
-		class OuterObservable extends WritableValue {
-			boolean disposed = false;
-
-			public synchronized void dispose() {
-				disposed = true;
-				super.dispose();
-			}
-		}
-
-		OuterObservable outerObservable = new OuterObservable();
-		WritableListFactory factory = new WritableListFactory();
-		DetailObservableList detailObservable = new DetailObservableList(
-				factory, outerObservable, null);
-
-		assertFalse(outerObservable.disposed);
-
-		detailObservable.dispose();
-		assertFalse(outerObservable.disposed);
-	}
-
-	private static class WritableListFactory implements IObservableFactory {
-		Object type = Object.class;
-
-		public IObservable createObservable(Object target) {
-			return new WritableList(new ArrayList(), type);
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(DetailObservableListTest.class.getName());
-		suite.addTestSuite(DetailObservableListTest.class);
-		suite.addTest(MutableObservableListContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableCollectionContractDelegate {
-		Object elementType = Object.class;
-
-		public IObservableCollection createObservableCollection(
-				final Realm realm, final int elementCount) {
-
-			IObservableValue master = new WritableValue(realm, new Integer(
-					elementCount), Integer.class);
-			IObservableFactory factory = new FactoryStub(realm, elementType);
-			return new DetailObservableListStub(factory, master, elementType);
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object();
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return elementType;
-		}
-
-		public void change(IObservable observable) {
-			final IObservableValue master = ((DetailObservableListStub)observable).master;
-			master.setValue(new Integer(((Integer)master.getValue()).intValue()+1));
-		}
-	}
-
-	static class FactoryStub implements IObservableFactory {
-		private Realm realm;
-		private Object elementType;
-
-		FactoryStub(Realm realm, Object elementType) {
-			this.realm = realm;
-			this.elementType = elementType;
-		}
-
-		Object type = Object.class;
-
-		public IObservable createObservable(Object target) {
-			int elementCount = ((Integer) target).intValue();
-			final ArrayList wrappedList = new ArrayList();
-			for (int i = 0; i < elementCount; i++)
-				wrappedList.add(new Object());
-			return new WritableList(realm, wrappedList, elementType);
-		}
-	}
-
-	static class DetailObservableListStub extends DetailObservableList {
-		IObservableValue master;
-		DetailObservableListStub(IObservableFactory factory,
-				IObservableValue master, Object elementType) {
-			super(factory, master, elementType);
-			this.master = master;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableSetTest.java
deleted file mode 100644
index e92d6e8..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableSetTest.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bugs 221351, 213145
- *     Ovidio Mallo - bug 241318
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable.masterdetail;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableSet;
-import org.eclipse.core.runtime.AssertionFailedException;
-import org.eclipse.jface.databinding.conformance.MutableObservableSetContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.2
- * 
- */
-public class DetailObservableSetTest extends AbstractDefaultRealmTestCase {
-	/**
-	 * Asserts the use case of specifying null on construction for the detail
-	 * type of the detail set.
-	 * 
-	 * @throws Exception
-	 */
-	public void testElementTypeNull() throws Exception {
-		WritableValue observableValue = new WritableValue(new WritableSet(new HashSet(), Object.class),
-				null);
-
-		WritableSetFactory factory = new WritableSetFactory();
-		DetailObservableSet detailObservable = new DetailObservableSet(factory,
-				observableValue, null);
-		assertNull(detailObservable.getElementType());
-
-		factory.type = Object.class;
-		observableValue.setValue(new WritableSet(Arrays
-				.asList(new Object[] { new Object() }), String.class));
-		assertNull("element type not null", detailObservable.getElementType());
-
-		factory.type = String.class;
-		// set the value again to ensure that the observable doesn't update the
-		// element type with that of the new element type
-		observableValue.setValue(new WritableSet(Arrays
-				.asList(new String[] { "1" }), Object.class));
-		assertNull("element type not null", detailObservable.getElementType());
-	}
-
-	/**
-	 * Asserts that you can't change the type across multiple inner observables.
-	 * 
-	 * @throws Exception
-	 */
-	public void testElementTypeNotNull() throws Exception {
-		WritableValue observableValue = new WritableValue(new WritableSet(new HashSet(), Object.class),
-				null);
-
-		WritableSetFactory factory = new WritableSetFactory();
-		DetailObservableSet detailObservable = new DetailObservableSet(factory,
-				observableValue, Object.class);
-		assertEquals(factory.type, detailObservable.getElementType());
-
-		try {
-			factory.type = String.class;
-			observableValue.setValue(new WritableSet(Arrays
-					.asList(new Object[] { new Object() }), String.class));
-			fail("if an element type is set this cannot be changed");
-		} catch (AssertionFailedException e) {
-		}
-	}
-
-	/**
-	 * Asserts that the master observable value is not disposed upon disposing
-	 * its detail observable value (bug 241318).
-	 */
-	public void testMasterNotDisposedWhenDetailDisposed() {
-		class OuterObservable extends WritableValue {
-			boolean disposed = false;
-
-			public synchronized void dispose() {
-				disposed = true;
-				super.dispose();
-			}
-		}
-
-		OuterObservable outerObservable = new OuterObservable();
-		WritableSetFactory factory = new WritableSetFactory();
-		DetailObservableSet detailObservable = new DetailObservableSet(factory,
-				outerObservable, null);
-
-		assertFalse(outerObservable.disposed);
-
-		detailObservable.dispose();
-		assertFalse(outerObservable.disposed);
-	}
-
-	private static class WritableSetFactory implements IObservableFactory {
-		Object type = Object.class;
-
-		public IObservable createObservable(Object target) {
-			return new WritableSet(new HashSet(), type);
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(DetailObservableSetTest.class.getName());
-		suite.addTestSuite(DetailObservableSetTest.class);
-		suite.addTest(MutableObservableSetContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableCollectionContractDelegate {
-		Object elementType = Object.class;
-
-		public IObservableCollection createObservableCollection(
-				final Realm realm, final int elementCount) {
-
-			IObservableValue master = new WritableValue(realm, new Integer(
-					elementCount), Integer.class);
-			IObservableFactory factory = new FactoryStub(realm, elementType);
-			return new DetailObservableSetStub(factory, master, elementType);
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object();
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return elementType;
-		}
-
-		public void change(IObservable observable) {
-			final IObservableValue master = ((DetailObservableSetStub) observable).master;
-			master.setValue(new Integer(((Integer) master.getValue())
-					.intValue() + 1));
-		}
-	}
-
-	static class FactoryStub implements IObservableFactory {
-		private Realm realm;
-		private Object elementType;
-
-		FactoryStub(Realm realm, Object elementType) {
-			this.realm = realm;
-			this.elementType = elementType;
-		}
-
-		Object type = Object.class;
-
-		public IObservable createObservable(Object target) {
-			int elementCount = ((Integer) target).intValue();
-			final Set wrappedSet = new HashSet();
-			for (int i = 0; i < elementCount; i++)
-				wrappedSet.add(new Object());
-			return new WritableSet(realm, wrappedSet, elementType);
-		}
-	}
-
-	static class DetailObservableSetStub extends DetailObservableSet {
-		IObservableValue master;
-
-		DetailObservableSetStub(IObservableFactory factory,
-				IObservableValue master, Object elementType) {
-			super(factory, master, elementType);
-			this.master = master;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableValueTest.java
deleted file mode 100755
index d6b7f7b..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/observable/masterdetail/DetailObservableValueTest.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2008 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Brad Reynolds - bug 147515
- *     Matthew Hall - bugs 221351, 213145
- *     Ovidio Mallo - bug 241318
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.observable.masterdetail;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableValue;
-import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.2
- */
-public class DetailObservableValueTest extends AbstractDefaultRealmTestCase {
-	private WritableValue outerObservable;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		outerObservable = new WritableValue();
-	}
-
-	public void testSetValue() throws Exception {
-		WritableValueFactory factory = new WritableValueFactory();
-		outerObservable.setValue("");
-
-		IObservableValue detailObservable = MasterDetailObservables
-				.detailValue(outerObservable, factory, null);
-		WritableValue innerObservable = factory.innerObservable;
-		Object value = new Object();
-
-		assertFalse(value.equals(innerObservable.getValue()));
-		detailObservable.setValue(value);
-		assertEquals("inner value", value, innerObservable.getValue());
-	}
-
-	public void testGetValueType() throws Exception {
-		DetailObservableValue detailObservable = new DetailObservableValue(outerObservable, null, String.class);
-		assertEquals(String.class, detailObservable.getValueType());
-	}
-	
-	/**
-	 * Asserts that when a null value type is set for the detail observable no
-	 * type checking is performed and the value type is always <code>null</code>.
-	 */
-	public void testGetValueTypeNullValueType() throws Exception {
-		WritableValueFactory factory = new WritableValueFactory();
-		DetailObservableValue detailObservable = new DetailObservableValue(
-				outerObservable, factory, null);
-		assertNull(detailObservable.getValueType());
-		factory.type = String.class;
-
-		// force the inner observable to be recreated
-		outerObservable.setValue("1");
-		assertNull("value type should be ignored", detailObservable.getValueType());
-		
-		factory.type = Object.class;
-
-		// force the inner observable to be recreated
-		outerObservable.setValue("2");
-		assertNull("value type should be ignored", detailObservable.getValueType());
-	}
-
-	/**
-	 * Asserts that the master observable value is not disposed upon disposing
-	 * its detail observable value (bug 241318).
-	 */
-	public void testMasterNotDisposedWhenDetailDisposed() {
-		class OuterObservable extends WritableValue {
-			boolean disposed = false;
-
-			public synchronized void dispose() {
-				disposed = true;
-				super.dispose();
-			}
-		}
-
-		OuterObservable outerObservable = new OuterObservable();
-		WritableValueFactory factory = new WritableValueFactory();
-		DetailObservableValue detailObservable = new DetailObservableValue(
-				outerObservable, factory, null);
-
-		assertFalse(outerObservable.disposed);
-
-		detailObservable.dispose();
-		assertFalse(outerObservable.disposed);
-	}
-
-	/**
-	 * Factory that creates WritableValues with the target as the value.
-	 */
-	static class WritableValueFactory implements IObservableFactory {
-		Realm realm;
-		WritableValue innerObservable;
-		Object type;
-
-		public IObservable createObservable(Object target) {
-			return innerObservable = new WritableValue(realm == null ? Realm
-					.getDefault() : realm, target, type);
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(DetailObservableValueTest.class.getName());
-		suite.addTestSuite(DetailObservableValueTest.class);
-		suite.addTest(MutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	private static class DetailObservableValueStub extends
-			DetailObservableValue {
-		IObservableValue outerObservableValue;
-
-		DetailObservableValueStub(IObservableValue outerObservableValue,
-				IObservableFactory valueFactory, Object detailType) {
-			super(outerObservableValue, valueFactory, detailType);
-			this.outerObservableValue = outerObservableValue;
-		}
-	}
-
-	private static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Object valueType;
-		private Realm previousRealm;
-
-		public void setUp() {
-			super.setUp();
-			valueType = new Object();
-			previousRealm = Realm.getDefault();
-
-			RealmTester.setDefault(new CurrentRealm());
-		}
-
-		public void tearDown() {
-			RealmTester.setDefault(previousRealm);
-			super.tearDown();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			WritableValueFactory valueFactory = new WritableValueFactory();
-			valueFactory.realm = realm;
-			valueFactory.type = valueType;
-			WritableValue masterObservableValue = new WritableValue(realm,
-					new Object(), null);
-			return new DetailObservableValueStub(masterObservableValue,
-					valueFactory, valueType);
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return new Object();
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return valueType;
-		}
-
-		public void change(IObservable observable) {
-			DetailObservableValueStub value = (DetailObservableValueStub) observable;
-			value.outerObservableValue.setValue(createValue(value));
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/AbstractStringToNumberValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/AbstractStringToNumberValidatorTest.java
deleted file mode 100644
index cf58d35..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/AbstractStringToNumberValidatorTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.conversion.StringToNumberConverter;
-import org.eclipse.core.internal.databinding.validation.AbstractStringToNumberValidator;
-import org.eclipse.core.internal.databinding.validation.NumberFormatConverter;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Tests for AbstractStringToNumberValidator. Most tests should be included in
- * StringToNumberValidatorTestHarness. This class is for the edge cases.
- * 
- * @since 3.2
- */
-public class AbstractStringToNumberValidatorTest extends TestCase {
-	/**
-	 * Test for bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=194353.
-	 * 
-	 * @throws Exception
-	 */
-	public void testErrorMessagesAreNotCached() throws Exception {
-		NumberFormatConverter c = StringToNumberConverter.toInteger(false);
-		ValidatorStub v = new ValidatorStub(c);
-
-		IStatus status1 = v.validate("1a");
-		assertEquals(IStatus.ERROR, status1.getSeverity());
-
-		IStatus status2 = v.validate("2b");
-		assertEquals(IStatus.ERROR, status2.getSeverity());
-
-		assertFalse("messages should not be equal", status1.getMessage().equals(status2.getMessage()));
-	}
-	
-	static class ValidatorStub extends AbstractStringToNumberValidator {
-		ValidatorStub(NumberFormatConverter c) {
-			super(c, new Integer(Integer.MIN_VALUE), new Integer(Integer.MAX_VALUE));
-		}
-		
-		protected boolean isInRange(Number number) {
-			return true;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToByteValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToByteValidatorTest.java
deleted file mode 100644
index 88f2750..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToByteValidatorTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.NumberToByteConverter;
-import org.eclipse.core.internal.databinding.validation.NumberToByteValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToNumberValidator;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToByteValidatorTest extends NumberToNumberValidatorTestHarness {
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetOutOfRangeNumber()
-	 */
-	protected Number doGetOutOfRangeNumber() {
-		return new Integer(Byte.MAX_VALUE + 1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetToBoxedTypeValidator()
-	 */
-	protected NumberToNumberValidator doGetToBoxedTypeValidator(Class fromType) {
-		NumberToByteConverter converter = new NumberToByteConverter(NumberFormat.getInstance(),
-				fromType, false);
-		return new NumberToByteValidator(converter);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetToPrimitiveValidator()
-	 */
-	protected NumberToNumberValidator doGetToPrimitiveValidator(Class fromType) {
-		NumberToByteConverter converter = new NumberToByteConverter(NumberFormat.getInstance(),
-				fromType, true);
-		return new NumberToByteValidator(converter);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToDoubleValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToDoubleValidatorTest.java
deleted file mode 100644
index 38c7a29..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToDoubleValidatorTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import java.math.BigDecimal;
-
-import org.eclipse.core.internal.databinding.conversion.NumberToDoubleConverter;
-import org.eclipse.core.internal.databinding.validation.NumberToDoubleValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToNumberValidator;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToDoubleValidatorTest extends
-		NumberToNumberValidatorTestHarness {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetOutOfRangeNumber()
-	 */
-	protected Number doGetOutOfRangeNumber() {
-		return new BigDecimal(Double.MAX_VALUE).add(new BigDecimal(Double.MAX_VALUE));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetToBoxedTypeValidator(java.lang.Class)
-	 */
-	protected NumberToNumberValidator doGetToBoxedTypeValidator(Class fromType) {
-		NumberToDoubleConverter converter = new NumberToDoubleConverter(NumberFormat.getInstance(), fromType, false);
-		return new NumberToDoubleValidator(converter);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetToPrimitiveValidator(java.lang.Class)
-	 */
-	protected NumberToNumberValidator doGetToPrimitiveValidator(Class fromType) {
-		NumberToDoubleConverter converter = new NumberToDoubleConverter(NumberFormat.getInstance(), fromType, true);
-		return new NumberToDoubleValidator(converter);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToFloatValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToFloatValidatorTest.java
deleted file mode 100644
index f2f8a58..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToFloatValidatorTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.NumberToFloatConverter;
-import org.eclipse.core.internal.databinding.validation.NumberToFloatValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToNumberValidator;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToFloatValidatorTest extends
-		NumberToNumberValidatorTestHarness {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetOutOfRangeNumber()
-	 */
-	protected Number doGetOutOfRangeNumber() {
-		return new Double(Double.MAX_VALUE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetToBoxedTypeValidator(java.lang.Class)
-	 */
-	protected NumberToNumberValidator doGetToBoxedTypeValidator(Class fromType) {
-		NumberToFloatConverter converter = new NumberToFloatConverter(NumberFormat.getInstance(), fromType, false);
-		return new NumberToFloatValidator(converter);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetToPrimitiveValidator(java.lang.Class)
-	 */
-	protected NumberToNumberValidator doGetToPrimitiveValidator(Class fromType) {
-		NumberToFloatConverter converter = new NumberToFloatConverter(NumberFormat.getInstance(), fromType, true);
-		return new NumberToFloatValidator(converter);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToIntegerValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToIntegerValidatorTest.java
deleted file mode 100644
index 37015a2..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToIntegerValidatorTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.NumberToIntegerConverter;
-import org.eclipse.core.internal.databinding.validation.NumberToIntegerValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToNumberValidator;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToIntegerValidatorTest extends
-		NumberToNumberValidatorTestHarness {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetOutOfRangeNumber()
-	 */
-	protected Number doGetOutOfRangeNumber() {
-		return new Long((long) Integer.MAX_VALUE + 1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetToBoxedTypeValidator(java.lang.Class)
-	 */
-	protected NumberToNumberValidator doGetToBoxedTypeValidator(Class fromType) {
-		NumberToIntegerConverter converter = new NumberToIntegerConverter(NumberFormat.getInstance(), fromType, false);
-		return new NumberToIntegerValidator(converter);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetToPrimitiveValidator(java.lang.Class)
-	 */
-	protected NumberToNumberValidator doGetToPrimitiveValidator(Class fromType) {
-		NumberToIntegerConverter converter = new NumberToIntegerConverter(NumberFormat.getInstance(), fromType, true);
-		return new NumberToIntegerValidator(converter);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToLongValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToLongValidatorTest.java
deleted file mode 100644
index 7821d75..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToLongValidatorTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.NumberToLongConverter;
-import org.eclipse.core.internal.databinding.validation.NumberToLongValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToNumberValidator;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToLongValidatorTest extends
-		NumberToNumberValidatorTestHarness {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetOutOfRangeNumber()
-	 */
-	protected Number doGetOutOfRangeNumber() {
-		return new Double(Double.MAX_VALUE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetToBoxedTypeValidator(java.lang.Class)
-	 */
-	protected NumberToNumberValidator doGetToBoxedTypeValidator(Class fromType) {
-		NumberToLongConverter converter = new NumberToLongConverter(NumberFormat.getInstance(), fromType, false);
-		return new NumberToLongValidator(converter);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetToPrimitiveValidator(java.lang.Class)
-	 */
-	protected NumberToNumberValidator doGetToPrimitiveValidator(Class fromType) {
-		NumberToLongConverter converter = new NumberToLongConverter(NumberFormat.getInstance(), fromType, true);
-		return new NumberToLongValidator(converter);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToNumberValidatorTestHarness.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToNumberValidatorTestHarness.java
deleted file mode 100644
index 817241c..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToNumberValidatorTestHarness.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToNumberValidator;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * @since 1.1
- */
-public abstract class NumberToNumberValidatorTestHarness extends TestCase {
-	protected abstract NumberToNumberValidator doGetToPrimitiveValidator(Class fromType);
-	protected abstract NumberToNumberValidator doGetToBoxedTypeValidator(Class fromType);
-	protected abstract Number doGetOutOfRangeNumber();
-	
-	public void testValidateNullForBoxedTypeIsOK() throws Exception {
-		IStatus status = doGetToBoxedTypeValidator(Integer.class).validate(null);
-		assertTrue(status.isOK());
-	}
-
-	public void testValidateNullForPrimitiveThrowsIllegalArgumentException()
-			throws Exception {
-		IValidator validator = doGetToPrimitiveValidator(Integer.class);
-		
-		if (validator == null) {
-			//return if a primitive validator does not exist (e.g. BigInteger, BigDecimal, etc.)
-			return;
-		}
-		
-		try {
-			doGetToPrimitiveValidator(Integer.class).validate(null);
-			
-			fail("exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-
-	public void testValidReturnsOK() throws Exception {
-		assertTrue(doGetToBoxedTypeValidator(Integer.class).validate(new Integer(1)).isOK());
-	}
-
-	public void testOutOfRangeReturnsError() throws Exception {
-		Number number = doGetOutOfRangeNumber();
-		
-		if (number == null) {
-			//return if there is no value out of range (e.g. BigInteger, BigDecimal, etc.)
-			return;
-		}
-		
-		IStatus status = doGetToBoxedTypeValidator(Integer.class).validate(number);
-		
-		assertEquals(IStatus.ERROR, status.getSeverity());
-		assertTrue(status.getMessage() != null);
-	}
-	
-	public void testValidateIncorrectTypeThrowsIllegalArgumentException() throws Exception {
-		try {
-			doGetToBoxedTypeValidator(Integer.class).validate("");
-			fail("exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToShortValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToShortValidatorTest.java
deleted file mode 100644
index df91593..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToShortValidatorTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.NumberToShortConverter;
-import org.eclipse.core.internal.databinding.validation.NumberToNumberValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToShortValidator;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToShortValidatorTest extends NumberToNumberValidatorTestHarness {
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetOutOfRangeNumber()
-	 */
-	protected Number doGetOutOfRangeNumber() {
-		return new Integer(Short.MAX_VALUE + 1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetToBoxedTypeValidator(java.lang.Class)
-	 */
-	protected NumberToNumberValidator doGetToBoxedTypeValidator(Class fromType) {
-		NumberToShortConverter converter = new NumberToShortConverter(NumberFormat.getInstance(),
-				Integer.class, false);
-		return new NumberToShortValidator(converter);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetToPrimitiveValidator(java.lang.Class)
-	 */
-	protected NumberToNumberValidator doGetToPrimitiveValidator(Class fromType) {
-		NumberToShortConverter converter = new NumberToShortConverter(NumberFormat.getInstance(),
-				Integer.class, true);
-		return new NumberToShortValidator(converter);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToUnboundedNumberValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToUnboundedNumberValidatorTest.java
deleted file mode 100644
index da5fa74..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/NumberToUnboundedNumberValidatorTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import org.eclipse.core.internal.databinding.conversion.NumberToBigIntegerConverter;
-import org.eclipse.core.internal.databinding.validation.NumberToNumberValidator;
-import org.eclipse.core.internal.databinding.validation.NumberToUnboundedNumberValidator;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class NumberToUnboundedNumberValidatorTest extends
-		NumberToNumberValidatorTestHarness {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetOutOfRangeNumber()
-	 */
-	protected Number doGetOutOfRangeNumber() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetToBoxedTypeValidator(java.lang.Class)
-	 */
-	protected NumberToNumberValidator doGetToBoxedTypeValidator(Class fromType) {
-		NumberToBigIntegerConverter converter = new NumberToBigIntegerConverter(NumberFormat.getInstance(), fromType);
-		return new NumberToUnboundedNumberValidator(converter);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.NumberToNumberValidatorTestHarness#doGetToPrimitiveValidator(java.lang.Class)
-	 */
-	protected NumberToNumberValidator doGetToPrimitiveValidator(Class fromType) {
-		return null;  // primitive BigInteger does not exist
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToByteValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToByteValidatorTest.java
deleted file mode 100644
index 7e33bc2..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToByteValidatorTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.internal.databinding.conversion.StringToByteConverter;
-import org.eclipse.core.internal.databinding.validation.StringToByteValidator;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class StringToByteValidatorTest extends
-		StringToNumberValidatorTestHarness {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getInRangeNumber()
-	 */
-	protected Number getInRangeNumber() {
-		return new Byte(Byte.MAX_VALUE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getInvalidString()
-	 */
-	protected String getInvalidString() {
-		return "1.1";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getOutOfRangeNumber()
-	 */
-	protected Number getOutOfRangeNumber() {
-		return new Integer(Byte.MAX_VALUE + 1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#setupNumberFormat()
-	 */
-	protected NumberFormat setupNumberFormat() {
-		return NumberFormat.getIntegerInstance();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#setupValidator(com.ibm.icu.text.NumberFormat)
-	 */
-	protected IValidator setupValidator(NumberFormat numberFormat) {
-		StringToByteConverter converter = StringToByteConverter.toByte(numberFormat, false);
-		return new StringToByteValidator(converter);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToCharacterValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToCharacterValidatorTest.java
deleted file mode 100644
index ca753fd..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToCharacterValidatorTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) Matt Carter and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matt Carter - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.internal.databinding.conversion.StringToCharacterConverter;
-import org.eclipse.core.internal.databinding.validation.StringToCharacterValidator;
-
-/**
- * @since 1.1
- */
-public class StringToCharacterValidatorTest extends TestCase {
-
-	private StringToCharacterValidator validator;
-	private StringToCharacterValidator primitiveValidator;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		StringToCharacterConverter converter = StringToCharacterConverter
-				.toCharacter(false);
-		StringToCharacterConverter primitiveConverter = StringToCharacterConverter
-				.toCharacter(true);
-		validator = new StringToCharacterValidator(converter);
-		primitiveValidator = new StringToCharacterValidator(primitiveConverter);
-	}
-
-	public void testValidatesCharacter() throws Exception {
-		assertTrue(validator.validate("X").isOK());
-	}
-
-	public void testValidatesCharacterPrimitive() throws Exception {
-		assertTrue(primitiveValidator.validate("X").isOK());
-	}
-
-	public void testNullCharacterIsValid() throws Exception {
-		assertTrue(validator.validate(null).isOK());
-	}
-
-	public void testEmptyStringCharacterIsValid() throws Exception {
-		assertTrue(validator.validate("").isOK());
-	}
-
-	public void testNullCharacterIsInvalidForPrimitive() throws Exception {
-		assertFalse(primitiveValidator.validate(null).isOK());
-	}
-
-	public void testNonStringIsInvalid() throws Exception {
-		assertFalse(primitiveValidator.validate(new Integer(4)).isOK());
-	}
-
-	public void testLongerThanOneCharacterIsInvalid() throws Exception {
-		assertFalse(primitiveValidator.validate("XYZ").isOK());
-	}
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToDoubleValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToDoubleValidatorTest.java
deleted file mode 100644
index 71d6f3f..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToDoubleValidatorTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import java.math.BigDecimal;
-
-import org.eclipse.core.databinding.conversion.StringToNumberConverter;
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.internal.databinding.validation.StringToDoubleValidator;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class StringToDoubleValidatorTest extends
-		StringToNumberValidatorTestHarness {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getInRangeNumber()
-	 */
-	protected Number getInRangeNumber() {
-		return new Double(1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getInvalidString()
-	 */
-	protected String getInvalidString() {
-		return "1a";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getOutOfRangeNumber()
-	 */
-	protected Number getOutOfRangeNumber() {
-		BigDecimal decimal = new BigDecimal(Double.MAX_VALUE);
-		return decimal.add(new BigDecimal(Double.MAX_VALUE));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#setupNumberFormat()
-	 */
-	protected NumberFormat setupNumberFormat() {
-		return NumberFormat.getInstance();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#setupValidator(com.ibm.icu.text.NumberFormat)
-	 */
-	protected IValidator setupValidator(NumberFormat numberFormat) {
-		StringToNumberConverter converter = StringToNumberConverter.toDouble(numberFormat, false);
-		return new StringToDoubleValidator(converter);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToFloatValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToFloatValidatorTest.java
deleted file mode 100644
index d7ec032..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToFloatValidatorTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import org.eclipse.core.databinding.conversion.StringToNumberConverter;
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.internal.databinding.validation.StringToFloatValidator;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class StringToFloatValidatorTest extends
-		StringToNumberValidatorTestHarness {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getInRangeNumber()
-	 */
-	protected Number getInRangeNumber() {
-		return new Float(1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getInvalidString()
-	 */
-	protected String getInvalidString() {
-		return "1a";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getOutOfRangeNumber()
-	 */
-	protected Number getOutOfRangeNumber() {
-		return new Double(Double.MAX_VALUE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#setupNumberFormat()
-	 */
-	protected NumberFormat setupNumberFormat() {
-		return NumberFormat.getInstance();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#setupValidator(com.ibm.icu.text.NumberFormat)
-	 */
-	protected IValidator setupValidator(NumberFormat numberFormat) {
-		StringToNumberConverter converter = StringToNumberConverter.toFloat(numberFormat, false);
-		return new StringToFloatValidator(converter);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToIntegerValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToIntegerValidatorTest.java
deleted file mode 100644
index d854d0b..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToIntegerValidatorTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import org.eclipse.core.databinding.conversion.StringToNumberConverter;
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.internal.databinding.validation.StringToIntegerValidator;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class StringToIntegerValidatorTest extends
-		StringToNumberValidatorTestHarness {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#setupNumberFormat()
-	 */
-	protected NumberFormat setupNumberFormat() {
-		return NumberFormat.getIntegerInstance();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#setupValidator(com.ibm.icu.text.NumberFormat)
-	 */
-	protected IValidator setupValidator(NumberFormat numberFormat) {
-		StringToNumberConverter converter = StringToNumberConverter.toInteger(
-				numberFormat, false);
-		return new StringToIntegerValidator(converter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getInRangeNumber()
-	 */
-	protected Number getInRangeNumber() {
-		return new Integer(1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getInvalidString()
-	 */
-	protected String getInvalidString() {
-		return "1.1";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getOutOfRangeNumber()
-	 */
-	protected Number getOutOfRangeNumber() {
-		return new Double(Double.MAX_VALUE);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToLongValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToLongValidatorTest.java
deleted file mode 100644
index 97f7647..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToLongValidatorTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import org.eclipse.core.databinding.conversion.StringToNumberConverter;
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.internal.databinding.validation.NumberFormatConverter;
-import org.eclipse.core.internal.databinding.validation.StringToLongValidator;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class StringToLongValidatorTest extends StringToNumberValidatorTestHarness {
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getInRangeNumber()
-	 */
-	protected Number getInRangeNumber() {
-		return new Long(1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getInvalidString()
-	 */
-	protected String getInvalidString() {
-		return "1.1";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getOutOfRangeNumber()
-	 */
-	protected Number getOutOfRangeNumber() {
-		return new Double(Double.MAX_VALUE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#setupNumberFormat()
-	 */
-	protected NumberFormat setupNumberFormat() {
-		return NumberFormat.getIntegerInstance();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#setupValidator()
-	 */
-	protected IValidator setupValidator(NumberFormat numberFormat) {
-		NumberFormatConverter converter = StringToNumberConverter.toInteger(numberFormat, false);
-		return new StringToLongValidator(converter);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToNumberValidatorTestHarness.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToNumberValidatorTestHarness.java
deleted file mode 100644
index 9e62ec3..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToNumberValidatorTestHarness.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.runtime.IStatus;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * A test harness for testing string to number validators.
- * 
- * @since 1.1
- */
-public abstract class StringToNumberValidatorTestHarness extends TestCase {
-	private NumberFormat numberFormat;
-	private IValidator validator;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		numberFormat = setupNumberFormat();
-		validator = setupValidator(numberFormat);
-	}
-	
-	/**
-	 * Invoked during setup to instantiate the number format.
-	 * 
-	 * @return number format
-	 */
-	protected abstract NumberFormat setupNumberFormat();
-	
-	/**
-	 * Invoked during setup to instantiate the validator.
-	 * 
-	 * @param numberFormat
-	 * @return validator
-	 */
-	protected abstract IValidator setupValidator(NumberFormat numberFormat);
-
-	/**
-	 * Returns a string value that will not parse.
-	 * 
-	 * @return string
-	 */
-	protected abstract String getInvalidString();
-
-	/**
-	 * Returns a number value that is out of range for the validator.
-	 * 
-	 * @return number
-	 */
-	protected abstract Number getOutOfRangeNumber();
-	
-	/**
-	 * Returns a number that is in range for the validator.
-	 * 
-	 * @return number
-	 */
-	protected abstract Number getInRangeNumber();
-	
-	public void testInvalidValueReturnsError() throws Exception {
-		IStatus status = validator.validate(getInvalidString());
-		assertEquals("error severify", IStatus.ERROR, status.getSeverity());
-		assertNotNull("message not null", status.getMessage());
-	}
-	
-	public void testOutOfRangeValueReturnsError() throws Exception {
-		String string = numberFormat.format(getOutOfRangeNumber());
-		IStatus status = validator.validate(string);
-		assertEquals(IStatus.ERROR, status.getSeverity());
-		assertNotNull(status.getMessage());
-	}
-
-	public void testValidateValidValue() throws Exception {
-		String string = numberFormat.format(getInRangeNumber());
-		assertTrue(validator.validate(string).isOK());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToShortValidatorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToShortValidatorTest.java
deleted file mode 100644
index 9de5b38..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/core/tests/internal/databinding/validation/StringToShortValidatorTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.core.tests.internal.databinding.validation;
-
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.internal.databinding.conversion.StringToShortConverter;
-import org.eclipse.core.internal.databinding.validation.StringToShortValidator;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * @since 1.1
- */
-public class StringToShortValidatorTest extends
-		StringToNumberValidatorTestHarness {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getInRangeNumber()
-	 */
-	protected Number getInRangeNumber() {
-		return new Short(Short.MAX_VALUE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getInvalidString()
-	 */
-	protected String getInvalidString() {
-		return "1.1";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#getOutOfRangeNumber()
-	 */
-	protected Number getOutOfRangeNumber() {
-		return new Integer(Short.MAX_VALUE + 1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#setupNumberFormat()
-	 */
-	protected NumberFormat setupNumberFormat() {
-		return NumberFormat.getIntegerInstance();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.tests.internal.databinding.validation.StringToNumberValidatorTestHarness#setupValidator(com.ibm.icu.text.NumberFormat)
-	 */
-	protected IValidator setupValidator(NumberFormat numberFormat) {
-		StringToShortConverter converter = StringToShortConverter.toShort(numberFormat, false);
-		return new StringToShortValidator(converter);
-	}
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/AbstractDefaultRealmTestCase.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/AbstractDefaultRealmTestCase.java
deleted file mode 100644
index c6fd4a9..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/AbstractDefaultRealmTestCase.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.databinding;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Base class that sets the default realm to be the SWT realm.
- * 
- * @since 3.3
- */
-public class AbstractDefaultRealmTestCase extends TestCase {
-	private Realm previousRealm;
-
-	/**
-	 * Sets the default realm to be the realm for the default display.
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		previousRealm = Realm.getDefault();
-
-		Display display = Display.getCurrent() != null
-				&& !Display.getCurrent().isDisposed() ? Display.getCurrent()
-				: Display.getDefault();
-		RealmTester.setDefault(SWTObservables.getRealm(display));
-	}
-
-	/**
-	 * Removes the default realm.
-	 */
-	protected void tearDown() throws Exception {
-		super.tearDown();
-
-		RealmTester.setDefault(previousRealm);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/AbstractSWTTestCase.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/AbstractSWTTestCase.java
deleted file mode 100644
index 32f0cdb..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/AbstractSWTTestCase.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Ashley Cambrell - bug 198904
- ******************************************************************************/
-
-package org.eclipse.jface.tests.databinding;
-
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Abstract test case that handles disposing of the Shell after each test.
- * 
- * @since 1.1
- */
-public abstract class AbstractSWTTestCase extends AbstractDefaultRealmTestCase {
-	private Shell shell;
-	
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		
-		if (shell != null && !shell.isDisposed()) {
-			shell.dispose();
-		}
-	}
-	
-	/**
-	 * Returns a Shell to be used in a test.
-	 * 
-	 * @return shell
-	 */
-	protected Shell getShell() {
-		if (shell == null || shell.isDisposed()) {
-			shell = new Shell();
-		}
-		
-		return shell;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSetup.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSetup.java
deleted file mode 100644
index 7ef5f67..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSetup.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.databinding;
-
-import java.util.Locale;
-
-import org.eclipse.core.databinding.util.ILogger;
-import org.eclipse.core.databinding.util.Policy;
-import org.eclipse.core.runtime.IStatus;
-
-import junit.extensions.TestSetup;
-import junit.framework.Test;
-
-/**
- * @since 3.2
- * 
- */
-public class BindingTestSetup extends TestSetup {
-
-	private Locale oldLocale;
-	private ILogger oldLogger;
-	private org.eclipse.jface.util.ILogger oldJFaceLogger;
-
-	public BindingTestSetup(Test test) {
-		super(test);
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		oldLocale = Locale.getDefault();
-		Locale.setDefault(Locale.US);
-		oldLogger = Policy.getLog();
-		Policy.setLog(new ILogger() {
-			public void log(IStatus status) {
-				// we are not expecting anything in the log while we test.
-				if (status.getException() != null) {
-					throw new RuntimeException(status.getException());
-				}
-				fail();
-			}
-		});
-		oldJFaceLogger = org.eclipse.jface.util.Policy.getLog();
-		org.eclipse.jface.util.Policy.setLog(new org.eclipse.jface.util.ILogger(){
-			public void log(IStatus status) {
-				// we are not expecting anything in the log while we test.
-				if (status.getException() != null) {
-					throw new RuntimeException(status.getException());
-				}
-				fail();
-			}
-		});
-	}
-
-	protected void tearDown() throws Exception {
-		Locale.setDefault(oldLocale);
-		Policy.setLog(oldLogger);
-		org.eclipse.jface.util.Policy.setLog(oldJFaceLogger);
-		super.tearDown();
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSuite.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSuite.java
deleted file mode 100644
index 312c6ec..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/BindingTestSuite.java
+++ /dev/null
@@ -1,440 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005-2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bugs 137877, 152543, 152540, 116920, 164247, 164653,
- *                     159768, 170848, 147515
- *     Bob Smith - bug 198880
- *     Ashley Cambrell - bugs 198903, 198904
- *     Matthew Hall - bugs 210115, 212468, 212223, 206839, 208858, 208322,
- *                    212518, 215531, 221351, 184830, 213145, 218269, 239015,
- *                    237703, 237718, 222289, 247394, 233306, 247647
- *                    254524, 246103
- *     Ovidio Mallo - bug 237163, bug 235195
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.tests.databinding.AggregateValidationStatusTest;
-import org.eclipse.core.tests.databinding.BindingTest;
-import org.eclipse.core.tests.databinding.DatabindingContextTest;
-import org.eclipse.core.tests.databinding.ListBindingTest;
-import org.eclipse.core.tests.databinding.ObservablesManagerTest;
-import org.eclipse.core.tests.databinding.UpdateStrategyTest;
-import org.eclipse.core.tests.databinding.UpdateValueStrategyTest;
-import org.eclipse.core.tests.databinding.ValueBindingTest;
-import org.eclipse.core.tests.databinding.beans.BeansObservablesTest;
-import org.eclipse.core.tests.databinding.beans.PojoObservablesTest;
-import org.eclipse.core.tests.databinding.conversion.NumberToStringConverterTest;
-import org.eclipse.core.tests.databinding.conversion.StringToNumberConverterTest;
-import org.eclipse.core.tests.databinding.observable.AbstractObservableTest;
-import org.eclipse.core.tests.databinding.observable.DiffsTest;
-import org.eclipse.core.tests.databinding.observable.Diffs_ListDiffTests;
-import org.eclipse.core.tests.databinding.observable.ObservableTrackerTest;
-import org.eclipse.core.tests.databinding.observable.ObservablesTest;
-import org.eclipse.core.tests.databinding.observable.RealmTest;
-import org.eclipse.core.tests.databinding.observable.list.AbstractObservableListTest;
-import org.eclipse.core.tests.databinding.observable.list.ComputedListTest;
-import org.eclipse.core.tests.databinding.observable.list.DecoratingObservableListTest;
-import org.eclipse.core.tests.databinding.observable.list.ListDiffTest;
-import org.eclipse.core.tests.databinding.observable.list.ListDiffVisitorTest;
-import org.eclipse.core.tests.databinding.observable.list.MultiListTest;
-import org.eclipse.core.tests.databinding.observable.list.ObservableListTest;
-import org.eclipse.core.tests.databinding.observable.list.WritableListTest;
-import org.eclipse.core.tests.databinding.observable.map.AbstractObservableMapTest;
-import org.eclipse.core.tests.databinding.observable.map.BidiObservableMapTest;
-import org.eclipse.core.tests.databinding.observable.map.CompositeMapTest;
-import org.eclipse.core.tests.databinding.observable.map.ComputedObservableMapTest;
-import org.eclipse.core.tests.databinding.observable.map.ObservableMapTest;
-import org.eclipse.core.tests.databinding.observable.map.WritableMapTest;
-import org.eclipse.core.tests.databinding.observable.set.AbstractObservableSetTest;
-import org.eclipse.core.tests.databinding.observable.set.ComputedSetTest;
-import org.eclipse.core.tests.databinding.observable.set.DecoratingObservableSetTest;
-import org.eclipse.core.tests.databinding.observable.set.ObservableSetTest;
-import org.eclipse.core.tests.databinding.observable.set.UnionSetTest;
-import org.eclipse.core.tests.databinding.observable.set.WritableSetTest;
-import org.eclipse.core.tests.databinding.observable.value.AbstractObservableValueTest;
-import org.eclipse.core.tests.databinding.observable.value.AbstractVetoableValueTest;
-import org.eclipse.core.tests.databinding.observable.value.ComputedValueTest;
-import org.eclipse.core.tests.databinding.observable.value.DecoratingObservableValueTest;
-import org.eclipse.core.tests.databinding.observable.value.WritableValueTest;
-import org.eclipse.core.tests.databinding.util.PolicyTest;
-import org.eclipse.core.tests.databinding.validation.MultiValidatorTest;
-import org.eclipse.core.tests.databinding.validation.ValidationStatusTest;
-import org.eclipse.core.tests.internal.databinding.BindingMessagesTest;
-import org.eclipse.core.tests.internal.databinding.BindingStatusTest;
-import org.eclipse.core.tests.internal.databinding.QueueTest;
-import org.eclipse.core.tests.internal.databinding.RandomAccessListIteratorTest;
-import org.eclipse.core.tests.internal.databinding.beans.BeanObservableListDecoratorTest;
-import org.eclipse.core.tests.internal.databinding.beans.BeanObservableSetDecoratorTest;
-import org.eclipse.core.tests.internal.databinding.beans.BeanObservableValueDecoratorTest;
-import org.eclipse.core.tests.internal.databinding.beans.JavaBeanObservableArrayBasedListTest;
-import org.eclipse.core.tests.internal.databinding.beans.JavaBeanObservableArrayBasedSetTest;
-import org.eclipse.core.tests.internal.databinding.beans.JavaBeanObservableListTest;
-import org.eclipse.core.tests.internal.databinding.beans.JavaBeanObservableMapTest;
-import org.eclipse.core.tests.internal.databinding.beans.JavaBeanObservableSetTest;
-import org.eclipse.core.tests.internal.databinding.beans.JavaBeanObservableValueTest;
-import org.eclipse.core.tests.internal.databinding.beans.JavaBeanPropertyObservableMapTest;
-import org.eclipse.core.tests.internal.databinding.beans.ListenerSupportTest;
-import org.eclipse.core.tests.internal.databinding.conversion.DateConversionSupportTest;
-import org.eclipse.core.tests.internal.databinding.conversion.IdentityConverterTest;
-import org.eclipse.core.tests.internal.databinding.conversion.IntegerToStringConverterTest;
-import org.eclipse.core.tests.internal.databinding.conversion.NumberToBigDecimalTest;
-import org.eclipse.core.tests.internal.databinding.conversion.NumberToBigIntegerConverterTest;
-import org.eclipse.core.tests.internal.databinding.conversion.NumberToByteConverterTest;
-import org.eclipse.core.tests.internal.databinding.conversion.NumberToDoubleConverterTest;
-import org.eclipse.core.tests.internal.databinding.conversion.NumberToFloatConverterTest;
-import org.eclipse.core.tests.internal.databinding.conversion.NumberToIntegerConverterTest;
-import org.eclipse.core.tests.internal.databinding.conversion.NumberToLongConverterTest;
-import org.eclipse.core.tests.internal.databinding.conversion.NumberToShortConverterTest;
-import org.eclipse.core.tests.internal.databinding.conversion.ObjectToPrimitiveValidatorTest;
-import org.eclipse.core.tests.internal.databinding.conversion.StatusToStringConverterTest;
-import org.eclipse.core.tests.internal.databinding.conversion.StringToBooleanConverterTest;
-import org.eclipse.core.tests.internal.databinding.conversion.StringToByteConverterTest;
-import org.eclipse.core.tests.internal.databinding.conversion.StringToCharacterConverterTest;
-import org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserByteTest;
-import org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserDoubleTest;
-import org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserFloatTest;
-import org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserIntegerTest;
-import org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserLongTest;
-import org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserShortTest;
-import org.eclipse.core.tests.internal.databinding.conversion.StringToNumberParserTest;
-import org.eclipse.core.tests.internal.databinding.conversion.StringToShortConverterTest;
-import org.eclipse.core.tests.internal.databinding.observable.ConstantObservableValueTest;
-import org.eclipse.core.tests.internal.databinding.observable.DelayedObservableValueTest;
-import org.eclipse.core.tests.internal.databinding.observable.EmptyObservableListTest;
-import org.eclipse.core.tests.internal.databinding.observable.EmptyObservableSetTest;
-import org.eclipse.core.tests.internal.databinding.observable.MapEntryObservableValueTest;
-import org.eclipse.core.tests.internal.databinding.observable.StalenessObservableValueTest;
-import org.eclipse.core.tests.internal.databinding.observable.UnmodifiableObservableListTest;
-import org.eclipse.core.tests.internal.databinding.observable.UnmodifiableObservableSetTest;
-import org.eclipse.core.tests.internal.databinding.observable.UnmodifiableObservableValueTest;
-import org.eclipse.core.tests.internal.databinding.observable.ValidatedObservableListTest;
-import org.eclipse.core.tests.internal.databinding.observable.ValidatedObservableSetTest;
-import org.eclipse.core.tests.internal.databinding.observable.ValidatedObservableValueTest;
-import org.eclipse.core.tests.internal.databinding.observable.masterdetail.DetailObservableListTest;
-import org.eclipse.core.tests.internal.databinding.observable.masterdetail.DetailObservableSetTest;
-import org.eclipse.core.tests.internal.databinding.observable.masterdetail.DetailObservableValueTest;
-import org.eclipse.core.tests.internal.databinding.validation.AbstractStringToNumberValidatorTest;
-import org.eclipse.core.tests.internal.databinding.validation.NumberToByteValidatorTest;
-import org.eclipse.core.tests.internal.databinding.validation.NumberToDoubleValidatorTest;
-import org.eclipse.core.tests.internal.databinding.validation.NumberToFloatValidatorTest;
-import org.eclipse.core.tests.internal.databinding.validation.NumberToIntegerValidatorTest;
-import org.eclipse.core.tests.internal.databinding.validation.NumberToLongValidatorTest;
-import org.eclipse.core.tests.internal.databinding.validation.NumberToShortValidatorTest;
-import org.eclipse.core.tests.internal.databinding.validation.NumberToUnboundedNumberValidatorTest;
-import org.eclipse.core.tests.internal.databinding.validation.StringToByteValidatorTest;
-import org.eclipse.core.tests.internal.databinding.validation.StringToCharacterValidatorTest;
-import org.eclipse.core.tests.internal.databinding.validation.StringToDoubleValidatorTest;
-import org.eclipse.core.tests.internal.databinding.validation.StringToFloatValidatorTest;
-import org.eclipse.core.tests.internal.databinding.validation.StringToIntegerValidatorTest;
-import org.eclipse.core.tests.internal.databinding.validation.StringToLongValidatorTest;
-import org.eclipse.core.tests.internal.databinding.validation.StringToShortValidatorTest;
-import org.eclipse.jface.tests.databinding.scenarios.BindingScenariosTestSuite;
-import org.eclipse.jface.tests.databinding.swt.SWTObservablesTest;
-import org.eclipse.jface.tests.databinding.viewers.ObservableListTreeContentProviderTest;
-import org.eclipse.jface.tests.databinding.viewers.ObservableMapLabelProviderTest;
-import org.eclipse.jface.tests.databinding.viewers.ObservableSetContentProviderTest;
-import org.eclipse.jface.tests.databinding.viewers.ObservableSetTreeContentProviderTest;
-import org.eclipse.jface.tests.databinding.viewers.ViewersObservablesTest;
-import org.eclipse.jface.tests.databinding.wizard.WizardPageSupportTest;
-import org.eclipse.jface.tests.examples.databinding.mask.internal.EditMaskLexerAndTokenTest;
-import org.eclipse.jface.tests.examples.databinding.mask.internal.EditMaskParserTest;
-import org.eclipse.jface.tests.internal.databinding.swt.ButtonObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.swt.CComboObservableValueSelectionTest;
-import org.eclipse.jface.tests.internal.databinding.swt.CComboObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.swt.CComboObservableValueTextTest;
-import org.eclipse.jface.tests.internal.databinding.swt.CComboSingleSelectionObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.swt.CLabelObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.swt.ComboObservableValueSelectionTest;
-import org.eclipse.jface.tests.internal.databinding.swt.ComboObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.swt.ComboObservableValueTextTest;
-import org.eclipse.jface.tests.internal.databinding.swt.ComboSingleSelectionObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.swt.ControlObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.swt.LabelObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.swt.ListSingleSelectionObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.swt.SWTDelayedObservableValueDecoratorTest;
-import org.eclipse.jface.tests.internal.databinding.swt.SWTObservableListTest;
-import org.eclipse.jface.tests.internal.databinding.swt.ScaleObservableValueMaxTest;
-import org.eclipse.jface.tests.internal.databinding.swt.ScaleObservableValueMinTest;
-import org.eclipse.jface.tests.internal.databinding.swt.ScaleObservableValueSelectionTest;
-import org.eclipse.jface.tests.internal.databinding.swt.ShellObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.swt.SpinnerObservableValueMaxTest;
-import org.eclipse.jface.tests.internal.databinding.swt.SpinnerObservableValueMinTest;
-import org.eclipse.jface.tests.internal.databinding.swt.SpinnerObservableValueSelectionTest;
-import org.eclipse.jface.tests.internal.databinding.swt.SpinnerObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.swt.TableObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.swt.TableSingleSelectionObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.swt.TextEditableObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.swt.TextObservableValueFocusOutTest;
-import org.eclipse.jface.tests.internal.databinding.swt.TextObservableValueModifyTest;
-import org.eclipse.jface.tests.internal.databinding.swt.TextObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.viewers.ObservableCollectionTreeContentProviderTest;
-import org.eclipse.jface.tests.internal.databinding.viewers.ObservableViewerElementSetTest;
-import org.eclipse.jface.tests.internal.databinding.viewers.SelectionProviderMultiSelectionObservableListTest;
-import org.eclipse.jface.tests.internal.databinding.viewers.SelectionProviderSingleSelectionObservableValueTest;
-import org.eclipse.jface.tests.internal.databinding.viewers.ViewerElementMapTest;
-import org.eclipse.jface.tests.internal.databinding.viewers.ViewerElementSetTest;
-import org.eclipse.jface.tests.internal.databinding.viewers.ViewerElementWrapperTest;
-import org.eclipse.jface.tests.internal.databinding.viewers.ViewerInputObservableValueTest;
-
-public class BindingTestSuite extends TestSuite {
-
-	public static void main(String[] args) {
-		junit.textui.TestRunner.run(suite());
-	}
-
-	public static Test suite() {
-		return new BindingTestSetup(new BindingTestSuite());
-	}
-
-	public BindingTestSuite() {
-		
-		// org.eclipse.core.tests.databinding
-		addTestSuite(AggregateValidationStatusTest.class);
-		addTestSuite(BindingTest.class);
-		addTestSuite(DatabindingContextTest.class);
-		addTestSuite(ListBindingTest.class);
-		addTestSuite(UpdateStrategyTest.class);
-		addTestSuite(UpdateValueStrategyTest.class);
-		addTestSuite(ValueBindingTest.class);
-		addTestSuite(ObservablesManagerTest.class);
-
-		// org.eclipse.core.tests.databinding.util
-		addTestSuite(PolicyTest.class);
-
-		// org.eclipse.core.tests.databinding.beans
-		addTestSuite(BeansObservablesTest.class);
-		addTestSuite(PojoObservablesTest.class);
-
-		// org.eclipse.core.tests.databinding.conversion
-		addTestSuite(NumberToStringConverterTest.class);
-		addTestSuite(StringToNumberConverterTest.class);
-
-		// org.eclipse.core.tests.databinding.observable
-		addTest(AbstractObservableTest.suite());
-		addTestSuite(Diffs_ListDiffTests.class);
-		addTestSuite(DiffsTest.class);
-		addTestSuite(ObservablesTest.class);
-		addTestSuite(ObservableTrackerTest.class);
-		addTestSuite(RealmTest.class);
-
-		// org.eclipse.core.tests.databinding.observable.list
-		addTest(AbstractObservableListTest.suite());
-		addTest(ComputedListTest.suite());
-		addTest(DecoratingObservableListTest.suite());
-		addTestSuite(ListDiffTest.class);
-		addTestSuite(ListDiffVisitorTest.class);
-		addTest(MultiListTest.suite());
-		addTest(ObservableListTest.suite());
-		addTest(WritableListTest.suite());
-
-		// org.eclipse.core.tests.databinding.observable.map
-		addTestSuite(AbstractObservableMapTest.class);
-		addTestSuite(BidiObservableMapTest.class);
-		addTestSuite(ObservableMapTest.class);
-		addTestSuite(WritableMapTest.class);
-		addTestSuite(CompositeMapTest.class);
-		addTestSuite(ComputedObservableMapTest.class);
-
-		// org.eclipse.core.tests.databinding.observable.set
-		addTest(AbstractObservableSetTest.suite());
-		addTest(ComputedSetTest.suite());
-		addTest(DecoratingObservableSetTest.suite());
-		addTest(ObservableSetTest.suite());
-		addTest(UnionSetTest.suite());
-		addTest(WritableSetTest.suite());
-		
-		//org.eclipse.core.tests.databinding.observable.value
-		addTestSuite(AbstractObservableValueTest.class);
-		addTestSuite(AbstractVetoableValueTest.class);
-		addTestSuite(ComputedValueTest.class);
-		addTest(DecoratingObservableValueTest.suite());
-		addTest(WritableValueTest.suite());
-		
-		//org.eclipse.core.tests.databinding.validation
-		addTestSuite(MultiValidatorTest.class);
-		addTestSuite(ValidationStatusTest.class);
-		
-		// org.eclipse.core.tests.internal.databinding
-		addTestSuite(BindingMessagesTest.class);
-		addTestSuite(BindingStatusTest.class);
-		addTestSuite(RandomAccessListIteratorTest.class);
-		addTestSuite(QueueTest.class);
-
-		// org.eclipse.core.tests.internal.databinding.conversion
-		addTestSuite(DateConversionSupportTest.class);
-		addTestSuite(IdentityConverterTest.class);
-		addTestSuite(IntegerToStringConverterTest.class);
-		addTestSuite(NumberToBigDecimalTest.class);
-		addTestSuite(NumberToBigIntegerConverterTest.class);
-		addTestSuite(NumberToByteConverterTest.class);
-		addTestSuite(NumberToDoubleConverterTest.class);
-		addTestSuite(NumberToFloatConverterTest.class);
-		addTestSuite(NumberToIntegerConverterTest.class);
-		addTestSuite(NumberToLongConverterTest.class);
-		addTestSuite(NumberToShortConverterTest.class);
-		addTestSuite(ObjectToPrimitiveValidatorTest.class);
-		addTestSuite(StatusToStringConverterTest.class);
-		addTestSuite(StringToBooleanConverterTest.class);
-		addTestSuite(StringToByteConverterTest.class);
-		addTestSuite(StringToCharacterConverterTest.class);
-		addTestSuite(StringToNumberParserByteTest.class);
-		addTestSuite(StringToNumberParserDoubleTest.class);
-		addTestSuite(StringToNumberParserFloatTest.class);
-		addTestSuite(StringToNumberParserIntegerTest.class);
-		addTestSuite(StringToNumberParserLongTest.class);
-		addTestSuite(StringToNumberParserShortTest.class);
-		addTestSuite(StringToNumberParserTest.class);
-		addTestSuite(StringToShortConverterTest.class);
-
-		//org.eclipse.core.tests.internal.databinding.internal.beans
-		addTest(BeanObservableListDecoratorTest.suite());
-		addTestSuite(BeanObservableSetDecoratorTest.class);
-		addTestSuite(BeanObservableValueDecoratorTest.class);
-		addTestSuite(BeanObservableListDecoratorTest.class);
-		addTest(JavaBeanObservableArrayBasedListTest.suite());
-		addTest(JavaBeanObservableArrayBasedSetTest.suite());
-		addTest(JavaBeanObservableListTest.suite());
-		addTest(JavaBeanObservableMapTest.suite());
-		addTest(JavaBeanObservableSetTest.suite());
-		addTest(JavaBeanObservableValueTest.suite());
-		addTestSuite(JavaBeanPropertyObservableMapTest.class);
-		addTestSuite(ListenerSupportTest.class);
-		
-		//org.eclipse.core.tests.internal.databinding.observable
-		addTest(ConstantObservableValueTest.suite());
-		addTest(DelayedObservableValueTest.suite());
-		addTest(EmptyObservableListTest.suite());
-		addTest(EmptyObservableSetTest.suite());
-		addTest(MapEntryObservableValueTest.suite());
-		addTest(StalenessObservableValueTest.suite());
-		addTest(UnmodifiableObservableValueTest.suite());
-		addTest(UnmodifiableObservableListTest.suite());
-		addTest(UnmodifiableObservableSetTest.suite());
-		addTest(ValidatedObservableValueTest.suite());
-		addTest(ValidatedObservableListTest.suite());
-		addTest(ValidatedObservableSetTest.suite());
-//		addTest(ValidatedObservableMapTest.suite());
-		
-		// org.eclipse.core.tests.internal.databinding.observable.masterdetail
-		addTest(DetailObservableListTest.suite());
-		addTest(DetailObservableSetTest.suite());
-		addTest(DetailObservableValueTest.suite());
-
-		// org.eclipse.core.tests.internal.databinding.validation
-		addTestSuite(AbstractStringToNumberValidatorTest.class);
-		addTestSuite(NumberToByteValidatorTest.class);
-		addTestSuite(NumberToDoubleValidatorTest.class);
-		addTestSuite(NumberToFloatValidatorTest.class);
-		addTestSuite(NumberToIntegerValidatorTest.class);
-		addTestSuite(NumberToLongValidatorTest.class);
-		addTestSuite(NumberToShortValidatorTest.class);
-		addTestSuite(NumberToUnboundedNumberValidatorTest.class);
-		addTestSuite(StringToByteValidatorTest.class);
-		addTestSuite(StringToCharacterValidatorTest.class);
-		addTestSuite(StringToDoubleValidatorTest.class);
-		addTestSuite(StringToFloatValidatorTest.class);
-		addTestSuite(StringToIntegerValidatorTest.class);
-		addTestSuite(StringToLongValidatorTest.class);
-		addTestSuite(StringToShortValidatorTest.class);
-
-		// org.eclipse.jface.tests.databinding.scenarios
-		addTest(BindingScenariosTestSuite.suite());
-		// The files in this package are in the above test suite
-
-		//org.eclipse.jface.tests.databinding.swt
-		addTestSuite(SWTObservablesTest.class);
-		
-		// org.eclipse.jface.tests.databinding.viewers
-		addTestSuite(ObservableListTreeContentProviderTest.class);
-		addTestSuite(ObservableMapLabelProviderTest.class);
-		addTestSuite(ObservableSetContentProviderTest.class);
-		addTestSuite(ObservableSetTreeContentProviderTest.class);
-		addTestSuite(ViewersObservablesTest.class);
-		
-		// org.eclipse.jface.tests.databinding.wizard
-		addTestSuite(WizardPageSupportTest.class);
-		
-		//org.eclipse.jface.tests.example.databinding.mask.internal
-		addTestSuite(EditMaskLexerAndTokenTest.class);
-		addTestSuite(EditMaskParserTest.class);
-
-		//org.eclipse.jface.tests.internal.databinding.internal.swt
-		addTest(ButtonObservableValueTest.suite());
-		addTestSuite(CComboObservableValueTest.class);
-		addTest(CComboObservableValueSelectionTest.suite());
-		addTest(CComboObservableValueTextTest.suite());
-		addTestSuite(CComboSingleSelectionObservableValueTest.class);
-		addTest(CComboSingleSelectionObservableValueTest.suite());
-		addTest(CLabelObservableValueTest.suite());
-		addTestSuite(ComboObservableValueTest.class);
-		addTest(ComboObservableValueSelectionTest.suite());
-		addTest(ComboObservableValueTextTest.suite());
-		addTestSuite(ComboSingleSelectionObservableValueTest.class);
-		addTest(SWTDelayedObservableValueDecoratorTest.suite());
-		
-		addTest(SWTObservableListTest.suite());
-		
-		addTestSuite(ControlObservableValueTest.class);
-		addTest(LabelObservableValueTest.suite());
-		addTestSuite(ListSingleSelectionObservableValueTest.class);
-		addTest(ScaleObservableValueMinTest.suite());
-		addTest(ScaleObservableValueMaxTest.suite());
-		addTest(ScaleObservableValueSelectionTest.suite());
-		
-		addTest(ShellObservableValueTest.suite());
-		
-		addTestSuite(SpinnerObservableValueTest.class);
-		addTest(SpinnerObservableValueMinTest.suite());
-		addTest(SpinnerObservableValueMaxTest.suite());
-		addTest(SpinnerObservableValueSelectionTest.suite());
-		
-		addTestSuite(TableObservableValueTest.class);
-		addTest(TableSingleSelectionObservableValueTest.suite());
-		addTest(TextEditableObservableValueTest.suite());
-		addTest(TextObservableValueFocusOutTest.suite());
-		addTest(TextObservableValueModifyTest.suite());
-		addTestSuite(TextObservableValueTest.class);
-		
-		//org.eclipse.jface.tests.internal.databinding.internal.viewers
-		addTest(ObservableViewerElementSetTest.suite());
-		addTestSuite(ObservableCollectionTreeContentProviderTest.class);
-		addTestSuite(SelectionProviderMultiSelectionObservableListTest.class);
-		addTestSuite(SelectionProviderSingleSelectionObservableValueTest.class);
-		addTestSuite(ViewerElementMapTest.class);
-		addTestSuite(ViewerElementSetTest.class);
-		addTestSuite(ViewerElementWrapperTest.class);
-		addTest(ViewerInputObservableValueTest.suite());
-	}
-
-	/**
-	 * @param testCase
-	 *            TODO
-	 * @return true if the given test is temporarily disabled
-	 */
-	public static boolean failingTestsDisabled(TestCase testCase) {
-		System.out.println("Ignoring disabled test: "
-				+ testCase.getClass().getName() + "." + testCase.getName());
-		return true;
-	}
-
-	/**
-	 * @param testSuite
-	 *            TODO
-	 * @return true if the given test is temporarily disabled
-	 */
-	public static boolean failingTestsDisabled(TestSuite testSuite) {
-		System.out.println("Ignoring disabled test: "
-				+ testSuite.getClass().getName() + "." + testSuite.getName());
-		return true;
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/AutomationUtil.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/AutomationUtil.java
deleted file mode 100644
index 9e881ae..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/AutomationUtil.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-
-/**
- * COPIED FROM org.eclipse.ui.tests
- * <code>AutomationUtil</code> contains utility methods to mimic key events.
- * Mouse event methods can be added if needed to complete this class.
- */
-
-public class AutomationUtil {
-
-	/**
-	 * Method to mimic a key code event on a display.
-	 * 
-	 * @param display
-	 *            The display.
-	 * @param eventType
-	 *            The event type.
-	 * @param keyCode
-	 *            The key code.
-	 */
-	public static void performKeyCodeEvent(Display display, int eventType,
-			int keyCode) {
-		Event event = new Event();
-		event.type = eventType;
-		event.keyCode = keyCode;
-		display.post(event);
-	}
-
-	/**
-	 * Method to mimic a character event on a display.
-	 * 
-	 * @param display
-	 *            The display.
-	 * @param eventType
-	 *            The event type.
-	 * @param character
-	 *            The character to mimic.
-	 */
-	public static void performCharacterEvent(Display display, int eventType,
-			char character) {
-		Event event = new Event();
-		event.type = eventType;
-		event.character = character;
-		display.post(event);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/BindingScenariosTestSuite.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/BindingScenariosTestSuite.java
deleted file mode 100644
index 93fb3cb..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/BindingScenariosTestSuite.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import junit.extensions.TestSetup;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * To run this test suite, right-click and select "Run As JUnit Plug-in Test".
- * This will also start an Eclipse instance. To clean up the launch
- * configuration, open up its "Main" tab and select "[No Application] - Headless
- * Mode" as the application to run. You can also run this class as an SWT
- * application.
- */
-public class BindingScenariosTestSuite extends TestSuite {
-
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(suite());
-    }
-
-    private static Display display;
-
-    private static Shell shell;
-
-    public static Test suite() {
-        return new TestSetup(new BindingScenariosTestSuite()) {
-            protected void setUp() throws Exception {
-                Display d = Display.getDefault();
-                shell = new Shell(d, SWT.SHELL_TRIM);
-                shell.setLayout(new FillLayout());
-            }
-
-            protected void tearDown() throws Exception {
-                shell.close();
-                shell.dispose();
-                if (display != null) {
-                    display.dispose();
-                }
-            }
-        };
-    }
-
-    public BindingScenariosTestSuite() {
-        addTestSuite(ButtonControlScenario.class);
-        addTestSuite(ComboScenarios.class);
-        addTestSuite(ComboUpdatingTest.class);
-        addTestSuite(ComboViewerScenario.class);
-        addTestSuite(CustomConverterScenarios.class);
-        addTestSuite(CustomScenarios.class);
-        addTestSuite(ListViewerScenario.class);
-        addTestSuite(MasterDetailScenarios.class);
-        addTestSuite(NewTableScenarios.class);
-        addTestSuite(NPETestScenario.class);
-        addTestSuite(PropertyScenarios.class);
-        addTestSuite(SpinnerControlScenario.class);
-        addTestSuite(TableScenarios.class);
-        addTestSuite(TextControlScenario.class);
-    }
-
-    public static Shell getShell() {
-        return shell;
-    }
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ButtonControlScenario.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ButtonControlScenario.java
deleted file mode 100644
index 5f1ac5a..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ButtonControlScenario.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.examples.databinding.model.Adventure;
-import org.eclipse.jface.examples.databinding.model.SampleData;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Button;
-
-/**
- * To run the tests in this class, right-click and select "Run As JUnit Plug-in
- * Test". This will also start an Eclipse instance. To clean up the launch
- * configuration, open up its "Main" tab and select "[No Application] - Headless
- * Mode" as the application to run.
- */
-
-public class ButtonControlScenario extends ScenariosTestCase {
-
-    private Adventure adventure;
-
-    private Button button;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        // do any setup work here
-        button = new Button(getComposite(), SWT.CHECK);
-        adventure = SampleData.WINTER_HOLIDAY;
-    }
-
-    protected void tearDown() throws Exception {
-        button.dispose();
-        super.tearDown();
-    }
-
-    public void testScenario01() {
-        // Bind the button's selection to the adventure "isPetsAllowed"
-        getDbc().bindValue(SWTObservables.observeSelection(button),
-                BeansObservables.observeValue(adventure, "petsAllowed"),
-                null, null);
-
-        // Check the model and GUI are in the same state
-        assertEquals(button.getSelection(), adventure.isPetsAllowed());
-        // Change the model and check the GUI is updated
-        boolean newBoolean = !adventure.isPetsAllowed();
-        adventure.setPetsAllowed(newBoolean);
-        assertEquals(newBoolean, adventure.isPetsAllowed());
-        assertEquals(button.getSelection(), newBoolean);
-        // Change the GUI and check the model
-        newBoolean = !newBoolean;
-        button.setSelection(newBoolean);
-        button.notifyListeners(SWT.Selection, null);
-        assertEquals(newBoolean, adventure.isPetsAllowed());
-        newBoolean = !newBoolean;
-        final boolean finalNewBoolean = newBoolean;
-        adventure.setPetsAllowed(finalNewBoolean);
-        spinEventLoop(0);
-        assertEquals(newBoolean, button.getSelection());
-
-    }
-
-    public void testScenario02() {
-        // Test with an SWT.Toggle button
-        button.dispose();
-        button = new Button(getComposite(), SWT.TOGGLE);
-        // Bind the button's selection to the adventure "isPetsAllowed"
-        getDbc().bindValue(SWTObservables.observeSelection(button),
-                BeansObservables.observeValue(adventure, "petsAllowed"),
-                null, null);
-
-        // Check the model and GUI are in the same state
-        assertEquals(button.getSelection(), adventure.isPetsAllowed());
-        // Change the model and check the GUI is updated
-        boolean newBoolean = !adventure.isPetsAllowed();
-        adventure.setPetsAllowed(newBoolean);
-        assertEquals(newBoolean, adventure.isPetsAllowed());
-        assertEquals(button.getSelection(), newBoolean);
-        // Change the GUI and check the model
-        newBoolean = !newBoolean;
-        button.setSelection(newBoolean);
-        button.notifyListeners(SWT.Selection, null);
-        assertEquals(newBoolean, adventure.isPetsAllowed());
-    }
-
-    public void testScenario03() {
-        // Test with an SWT.Radio button
-        button.dispose();
-        button = new Button(getComposite(), SWT.RADIO);
-
-        // Bind the button's selection to the adventure "isPetsAllowed"
-        getDbc().bindValue(SWTObservables.observeSelection(button),
-                BeansObservables.observeValue(adventure, "petsAllowed"),
-                null, null);
-
-        // Check the model and GUI are in the same state
-        assertEquals(button.getSelection(), adventure.isPetsAllowed());
-        // Change the model and check the GUI is updated
-        boolean newBoolean = !adventure.isPetsAllowed();
-        adventure.setPetsAllowed(newBoolean);
-        assertEquals(newBoolean, adventure.isPetsAllowed());
-        assertEquals(button.getSelection(), newBoolean);
-        // Change the GUI and check the model
-        newBoolean = !newBoolean;
-        button.setSelection(newBoolean);
-        button.notifyListeners(SWT.Selection, null);
-        assertEquals(newBoolean, adventure.isPetsAllowed());
-    }
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ComboScenarios.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ComboScenarios.java
deleted file mode 100644
index aefc9e2..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ComboScenarios.java
+++ /dev/null
@@ -1,563 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *     Brad Reynolds - bug 160000
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.examples.databinding.model.Account;
-import org.eclipse.jface.examples.databinding.model.Adventure;
-import org.eclipse.jface.examples.databinding.model.Catalog;
-import org.eclipse.jface.examples.databinding.model.Lodging;
-import org.eclipse.jface.examples.databinding.model.SampleData;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Combo;
-
-public class ComboScenarios extends ScenariosTestCase {
-
-	protected ComboViewer cviewer = null;
-
-	protected Combo combo = null;
-
-	protected Catalog catalog = null;
-
-	ILabelProvider lodgingLabelProvider = new LabelProvider() {
-		public String getText(Object element) {
-			return ((Lodging) element).getName();
-		}
-	};
-
-	ILabelProvider accountLabelProvider = new LabelProvider() {
-		public String getText(Object element) {
-			return ((Account) element).getCountry();
-		}
-	};
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		getComposite().setLayout(new FillLayout());
-
-		combo = new Combo(getComposite(), SWT.READ_ONLY | SWT.DROP_DOWN);
-		cviewer = new ComboViewer(combo);
-
-		catalog = SampleData.CATALOG_2005; // Lodging source
-	}
-
-	protected void tearDown() throws Exception {
-		combo.dispose();
-		combo = null;
-		cviewer = null;
-		super.tearDown();
-	}
-
-	protected Object getViewerSelection() {
-		return ((IStructuredSelection) cviewer.getSelection())
-				.getFirstElement();
-	}
-
-	/**
-	 * @return the ComboViewer's domain object list
-	 */
-	protected List getViewerContent(ComboViewer cviewer) {
-		Object[] elements = ((IStructuredContentProvider) cviewer
-				.getContentProvider()).getElements(null);
-		if (elements != null)
-			return Arrays.asList(elements);
-		return null;
-	}
-
-	/**
-	 * 
-	 * @return the combo's items (String[]), which is the same thing as the
-	 *         Viewer's labels
-	 * 
-	 */
-	protected List getComboContent() {
-		String[] elements = combo.getItems();
-		if (elements != null)
-			return Arrays.asList(elements);
-		return null;
-	}
-
-	protected List getColumn(Object[] list, String feature) {
-		List result = new ArrayList();
-		if (list == null || list.length == 0)
-			return result;
-		String getterName = "get"
-				+ feature.substring(0, 1).toUpperCase(Locale.ENGLISH)
-				+ feature.substring(1);
-		try {
-			Method getter = list[0].getClass().getMethod(getterName,
-					new Class[0]);
-			try {
-				for (int i = 0; i < list.length; i++) {
-					result.add(getter.invoke(list[i], new Object[0]));
-				}
-			} catch (IllegalArgumentException e) {
-			} catch (IllegalAccessException e) {
-			} catch (InvocationTargetException e) {
-			}
-		} catch (SecurityException e) {
-		} catch (NoSuchMethodException e) {
-		}
-		return result;
-	}
-
-	/**
-	 * This test case deal with the 3rd scenario, using vanilla bindings: Ensure
-	 * a valid content and selection are bounded correctly Bind a collection of
-	 * Lodgings to a ComboViewer Bind the ComboViewer's selection to the
-	 * defaultLodging of an Adventure
-	 * 
-	 * This test does not deal with null values, empty content, changed content,
-	 * property change of content elements, etc.
-	 * 
-	 */
-	public void test_ROCombo_Scenario03_vanilla() {
-		IObservableList lodgings = BeansObservables.observeList(Realm
-				.getDefault(), catalog, "lodgings");
-		ObservableListContentProvider contentProvider = new ObservableListContentProvider();
-
-		IObservableMap[] attributeMaps = BeansObservables.observeMaps(
-				contentProvider.getKnownElements(), Lodging.class,
-				new String[] { "name" });
-
-		// Bind the ComboViewer's content to the available lodging
-		cviewer.setContentProvider(contentProvider);
-		cviewer.setLabelProvider(new ObservableMapLabelProvider(attributeMaps));
-		cviewer.setInput(lodgings);
-
-		Adventure skiAdventure = SampleData.WINTER_HOLIDAY; // selection will
-
-		// Ensure that cv's content now has the catalog's lodgings
-		assertArrayEquals(catalog.getLodgings(), getViewerContent(cviewer)
-				.toArray());
-
-		// Ensure that the cv's labels are the same as the lodging descriptions
-		assertEquals(getColumn(catalog.getLodgings(), "name"),
-				getComboContent());
-
-		getDbc().bindValue(ViewersObservables.observeSingleSelection(cviewer),
-				BeansObservables.observeValue(skiAdventure, "defaultLodging"),
-				null, null);
-
-		// Check to see that the initial selection is the currentDefault Lodging
-		assertEquals(getViewerSelection(), skiAdventure.getDefaultLodging());
-
-		// Change the selection of the ComboViewer to all possible lodgings, and
-		// verify that skiAdventure's default lodging was changed accordingly
-		for (int i = 0; i < catalog.getLodgings().length; i++) {
-			Object selection = catalog.getLodgings()[i];
-			cviewer.setSelection(new StructuredSelection(selection));
-			assertEquals(selection, skiAdventure.getDefaultLodging());
-			assertEquals(getViewerSelection(), skiAdventure.getDefaultLodging());
-		}
-
-	}
-
-	/**
-	 * This test case deal with the 3rd scenario, and focuses on the collection
-	 * binding to the combo. It will bind a collection, add/remove/change
-	 * elements in the collection, and change element's properties to ensure
-	 * that the combo's labels were updated appropriatly.
-	 * 
-	 * it also induce null values in properties, and elments.
-	 * 
-	 * This test does not deal with the combo's selection.
-	 */
-	public void test_ROCombo_Scenario03_collectionBindings() {
-		// column binding
-		// Bind the ComboViewer's content to the available lodging
-		IObservableList lodgings = BeansObservables.observeList(Realm
-				.getDefault(), catalog, "lodgings");
-		ObservableListContentProvider contentProvider = new ObservableListContentProvider();
-
-		IObservableMap[] attributeMaps = BeansObservables.observeMaps(
-				contentProvider.getKnownElements(), Lodging.class,
-				new String[] { "name" });
-
-		cviewer.setContentProvider(contentProvider);
-		cviewer.setLabelProvider(new ObservableMapLabelProvider(attributeMaps));
-		cviewer.setInput(lodgings);
-
-		// Ensure that cv's content now has the catalog's lodgings
-		assertArrayEquals(catalog.getLodgings(), getViewerContent(cviewer)
-				.toArray());
-
-		// Ensure that the cv's labels are the same as the lodging descriptions
-		assertEquals(getColumn(catalog.getLodgings(), "name"),
-				getComboContent());
-
-		// Add a lodging in the middle (not supported by the model right now)
-		// Lodging lodging = SampleData.FACTORY.createLodging();
-		// lodging.setName("Middle Lodging");
-		// catalog.addLodging(lodging);
-		// assertEquals(getViewerContent(cviewer).get(2), lodging);
-
-		// Add a lodging at the end
-		Lodging lodging = SampleData.FACTORY.createLodging();
-		lodging.setName("End Lodging");
-		catalog.addLodging(lodging);
-		int index = getComboContent().size() - 1;
-		assertEquals(getViewerContent(cviewer).get(index), lodging);
-
-		// Delete the first Lodging
-		catalog.removeLodging(catalog.getLodgings()[0]);
-		// Ensure that the cv's labels are the same as the lodging descriptions
-		assertEquals(getColumn(catalog.getLodgings(), "name"),
-				getComboContent());
-
-		// Delete middle Lodging
-		catalog.removeLodging(catalog.getLodgings()[2]);
-		// Ensure that the cv's labels are the same as the lodging descriptions
-		assertEquals(getColumn(catalog.getLodgings(), "name"),
-				getComboContent());
-
-		// Change the names of all Lodging
-		for (int i = 0; i < catalog.getLodgings().length; i++) {
-			Lodging l = catalog.getLodgings()[i];
-			l.setName("Changed: " + l.getName());
-		}
-		spinEventLoop(0); // force Async. efforts
-		assertEquals(getColumn(catalog.getLodgings(), "name"),
-				getComboContent());
-
-		// Set to null value
-		Lodging l = catalog.getLodgings()[0];
-		assertEquals(combo.getItem(0), l.getName());
-		l.setName(null);
-		assertEquals("", combo.getItem(0));
-
-		// set to empty list
-		while (catalog.getLodgings().length > 0) {
-			catalog.removeLodging(catalog.getLodgings()[0]);
-			assertEquals(getColumn(catalog.getLodgings(), "name"),
-					getComboContent());
-		}
-	}
-
-	/**
-	 * This scenario tests a simple SWT combo with a set item list where the
-	 * selection is bouded to a String property
-	 */
-	// public void test_ROCombo_Scenario01() {
-	//
-	// // Read-Only Combo will not change its text property on a call to
-	// // setText()
-	//
-	// String[] items = new String[] { "FairyLand", "TuneLand", "NoWereLand",
-	// "TinkerLand", "DreamLand" };
-	// combo.setItems(items);
-	// Account account = catalog.getAccounts()[0];
-	//
-	// // simple Combo's selection bound to the Account's country property
-	// getDbc().bind(new Property(combo, SWTProperties.SELECTION),
-	// new Property(account, "country"), null);
-	//
-	// // Drive the combo selection
-	// int index = 3;
-	// combo.setText(items[index]); // this should drive the selection
-	// assertEquals(account.getCountry(), items[index]);
-	//
-	// // Set the country, and ensure selection is set property
-	// index = 1;
-	// account.setCountry(items[index]);
-	// assertEquals(index, combo.getSelectionIndex());
-	// assertEquals(combo.getText(), items[index]);
-	//
-	// index = combo.getSelectionIndex();
-	// String txt = combo.getText();
-	// // Set the country to something that is not in the Combo's list
-	// account.setCountry("FooBar");
-	// // Combo's selection will not Change
-	// assertEquals(combo.getSelectionIndex(), index);
-	// assertEquals(combo.getText(), txt);
-	//
-	// }
-	/**
-	 * This scenario tests a simple SWT combo that is bound to a list of Country
-	 * objects. The Country object's name property is listed in the Combo.
-	 * 
-	 * The Combo's selection is bounded to the Country property of an Account.
-	 */
-	// public void test_ROCombo_Scenario02_SWTCombo() {
-	//
-	// // Create a list of Strings for the countries
-	// IObservableList list = new WritableList();
-	// for (int i = 0; i < catalog.getAccounts().length; i++)
-	// list.add(catalog.getAccounts()[i].getCountry());
-	//
-	// // Bind the combo's content to that of the String based list
-	// getDbc().bind(combo, list, null);
-	// assertEquals(Arrays.asList(combo.getItems()), list);
-	//
-	// Account account = catalog.getAccounts()[0];
-	//
-	// // simple Combo's selection bound to the Account's country property
-	// getDbc().bind(new Property(combo, SWTProperties.SELECTION),
-	// new Property(account, "country"), null);
-	//
-	// // Drive the combo selection
-	// String selection = (String) list.get(2);
-	// combo.setText(selection); // this should drive the selection
-	// assertEquals(account.getCountry(), selection);
-	//
-	// }
-	/**
-	 * This scenario tests a simple SWT combo that is bound to a list of Country
-	 * objects. The Country object's name property is listed in the Combo.
-	 * 
-	 * The Combo's selection is bounded to the Country property of an Account.
-	 */
-	// public void test_ROCombo_Scenario02_ComboViewer() {
-	//
-	// // Account label provider will fill the combo with the country
-	// cviewer.setLabelProvider(accountLabelProvider);
-	// // Bind the ComboViewer's content to the available accounts
-	// getDbc().bind(
-	// cviewer,
-	// new ListModelDescription(new Property(catalog, "accounts"),
-	// "country"), null);
-	//
-	// // Ensure that cv's content now has the catalog's accounts
-	// assertArrayEquals(catalog.getAccounts(), getViewerContent(cviewer)
-	// .toArray());
-	// // Ensure that the cv's labels are the same as the account countries
-	// assertEquals(getColumn(catalog.getAccounts(), "country"),
-	// getComboContent());
-	//
-	// Account account = SampleData.FACTORY.createAccount();
-	//
-	// // Use the Viewers visual Combo (Strings) to set the account's country
-	// getDbc().bind(new Property(combo, SWTProperties.SELECTION),
-	// new Property(account, "country"), null);
-	//
-	// // Change the selection of the ComboViewer to all possible accounts, and
-	// // verify that the account's Country is being changed correctly.
-	// for (int i = 0; i < catalog.getAccounts().length; i++) {
-	// Account selection = catalog.getAccounts()[i];
-	// cviewer.setSelection(new StructuredSelection(selection));
-	// assertEquals(selection.getCountry(), account.getCountry());
-	// }
-	//
-	// }
-	/**
-	 * This test ensure that multiple combos can be bound to the same deomain
-	 * model
-	 */
-	public void test_ROCombo_multipleBindings() {
-		Adventure skiAdventure = SampleData.WINTER_HOLIDAY; // for selection
-
-		// Bind the ComboViewer's content to the available lodging
-		IObservableList lodgings = BeansObservables.observeList(Realm
-				.getDefault(), catalog, "lodgings");
-		ObservableListContentProvider contentProvider = new ObservableListContentProvider();
-
-		IObservableMap[] attributeMaps = BeansObservables.observeMaps(
-				contentProvider.getKnownElements(), Lodging.class,
-				new String[] { "name" });
-
-		cviewer.setContentProvider(contentProvider);
-		cviewer.setLabelProvider(new ObservableMapLabelProvider(attributeMaps));
-		cviewer.setInput(lodgings);
-
-		// Ensure that cv's content now has the catalog's lodgings
-		assertArrayEquals(catalog.getLodgings(), getViewerContent(cviewer)
-				.toArray());
-
-		// Ensure that the cv's labels are the same as the lodging descriptions
-		assertEquals(getColumn(catalog.getLodgings(), "name"),
-				getComboContent());
-
-		ComboViewer otherViewer = new ComboViewer(getComposite(), SWT.NONE);
-		lodgings = BeansObservables.observeList(Realm.getDefault(), catalog,
-				"lodgings");
-		contentProvider = new ObservableListContentProvider();
-
-		attributeMaps = BeansObservables.observeMaps(contentProvider
-				.getKnownElements(), Lodging.class, new String[] { "name" });
-
-		otherViewer.setContentProvider(contentProvider);
-		otherViewer.setLabelProvider(new ObservableMapLabelProvider(
-				attributeMaps));
-		otherViewer.setInput(lodgings);
-
-		// Ensure that cv's content now has the catalog's lodgings
-		assertArrayEquals(catalog.getLodgings(), getViewerContent(otherViewer)
-				.toArray());
-
-		// Bind both selections to the same thing
-		IObservableValue selection = ViewersObservables
-				.observeSingleSelection(cviewer);
-		getDbc().bindValue(selection,
-				BeansObservables.observeValue(skiAdventure, "defaultLodging"),
-				null, null);
-
-		IObservableValue otherSelection = ViewersObservables
-				.observeSingleSelection(otherViewer);
-		getDbc().bindValue(otherSelection,
-				BeansObservables.observeValue(skiAdventure, "defaultLodging"),
-				null, null);
-
-		Lodging lodging = catalog.getLodgings()[0];
-
-		// Ensure that setting the selection is driven forward to the other
-		// combo
-		cviewer.setSelection(new StructuredSelection(lodging));
-		assertEquals(((IStructuredSelection) cviewer.getSelection())
-				.getFirstElement(), ((IStructuredSelection) otherViewer
-				.getSelection()).getFirstElement());
-
-		// Change the list of one combo, and ensure it updates the other combo
-		catalog.removeLodging(lodging);
-		assertEquals(getViewerContent(cviewer), getViewerContent(otherViewer));
-
-	}
-
-	/**
-	 * This scenario tests a simple SWT CCombo that is bound to a list of
-	 * Country objects. The Country object's name property is listed in the
-	 * Combo.
-	 * 
-	 * The Combo's selection is bounded to the Country property of an Account.
-	 */
-	public void test_ROCombo_SWTCCombo() {
-
-		// Create a list of Strings for the countries
-		IObservableList list = new WritableList();
-		for (int i = 0; i < catalog.getAccounts().length; i++)
-			list.add(catalog.getAccounts()[i].getCountry());
-
-		CCombo ccombo = new CCombo(getComposite(), SWT.READ_ONLY
-				| SWT.DROP_DOWN);
-
-		// Bind the combo's content to that of the String based list
-		getDbc().bindList(SWTObservables.observeItems(ccombo), list, null, null);
-		assertEquals(Arrays.asList(ccombo.getItems()), list);
-
-		Account account = catalog.getAccounts()[0];
-
-		// simple Combo's selection bound to the Account's country property
-		IObservableValue comboSelection = SWTObservables.observeSelection(ccombo);
-		getDbc().bindValue(comboSelection,
-				BeansObservables.observeValue(account, "country"), null, null);
-
-		// Drive the combo selection
-		String selection = (String) list.get(2);
-		ccombo.setText(selection); // this should drive the selection
-		assertEquals(account.getCountry(), selection);
-
-	}
-
-	/**
-	 * This scenario tests a simple SWT CCombo that is bound to a list of
-	 * Country objects. The Country object's name property is listed in the
-	 * Combo.
-	 * 
-	 * The Combo's selection is bounded to the Country property of an Account.
-	 */
-	public void test_WCombo_SWTCCombo() {
-
-		// Create a list of Strings for the countries
-		IObservableList list = new WritableList();
-		for (int i = 0; i < catalog.getAccounts().length; i++)
-			list.add(catalog.getAccounts()[i].getCountry());
-
-		CCombo ccombo = new CCombo(getComposite(), SWT.READ_ONLY
-				| SWT.DROP_DOWN);
-
-		// Bind the combo's content to that of the String based list
-		getDbc().bindList(SWTObservables.observeItems(ccombo), list, null, null);
-		assertEquals(Arrays.asList(ccombo.getItems()), list);
-
-		Account account = catalog.getAccounts()[0];
-
-		// simple Combo's selection bound to the Account's country property
-		IObservableValue comboSelection = SWTObservables.observeSelection(ccombo);
-		getDbc().bindValue(comboSelection,
-				BeansObservables.observeValue(account, "country"), null, null);
-
-		// Drive the combo selection
-		String selection = (String) list.get(2);
-		ccombo.setText(selection); // this should drive the selection
-		assertEquals(account.getCountry(), selection);
-
-		selection = (String) list.get(1);
-		account.setCountry(selection);
-		assertEquals(selection, ccombo.getItem(ccombo.getSelectionIndex()));
-		assertEquals(selection, ccombo.getText());
-
-		selection = "country not in list";
-		account.setCountry(selection);
-		assertEquals(-1, ccombo.getSelectionIndex());
-		assertEquals(selection, ccombo.getText());
-	}
-
-	/**
-	 * This scenario tests a simple SWT CCombo that is bound to a list of
-	 * Country objects. The Country object's name property is listed in the
-	 * Combo.
-	 * 
-	 * The Combo's selection is bounded to the Country property of an Account.
-	 */
-	public void test_ROCombo_SWTList() {
-
-		// Create a list of Strings for the countries
-		IObservableList list = new WritableList();
-		for (int i = 0; i < catalog.getAccounts().length; i++)
-			list.add(catalog.getAccounts()[i].getCountry());
-
-		org.eclipse.swt.widgets.List swtlist = new org.eclipse.swt.widgets.List(
-				getComposite(), SWT.READ_ONLY | SWT.SINGLE);
-
-		// Bind the combo's content to that of the String based list
-		getDbc().bindList(SWTObservables.observeItems(swtlist), list, null, null);
-		assertEquals(Arrays.asList(swtlist.getItems()), list);
-
-		Account account = catalog.getAccounts()[0];
-
-		// simple Combo's selection bound to the Account's country property
-		IObservableValue listSelection = SWTObservables.observeSelection(swtlist);
-		getDbc().bindValue(listSelection,
-				BeansObservables.observeValue(account, "country"), null, null);
-
-		String selection = (String) list.get(2);
-		swtlist.select(2); // this should drive the selection
-		swtlist.notifyListeners(SWT.Selection, null); // Force notification
-		assertEquals(account.getCountry(), selection);
-
-	}
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ComboUpdatingTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ComboUpdatingTest.java
deleted file mode 100644
index 31c683b..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ComboUpdatingTest.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.tests.databinding.BindingTestSuite;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Combo;
-
-/**
- * @since 3.2
- */
-public class ComboUpdatingTest extends ScenariosTestCase {
-
-	private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(
-			this);
-
-	public void addPropertyChangeListener(PropertyChangeListener listener) {
-		propertyChangeSupport.addPropertyChangeListener(listener);
-	}
-
-	public void addPropertyChangeListener(String propertyName,
-			PropertyChangeListener listener) {
-		propertyChangeSupport.addPropertyChangeListener(propertyName, listener);
-	}
-
-	public void removePropertyChangeListener(PropertyChangeListener listener) {
-		propertyChangeSupport.removePropertyChangeListener(listener);
-	}
-
-	public void removePropertyChangeListener(String propertyName,
-			PropertyChangeListener listener) {
-		propertyChangeSupport.removePropertyChangeListener(propertyName,
-				listener);
-	}
-
-	protected void firePropertyChange(String propertyName, Object oldValue,
-			Object newValue) {
-		propertyChangeSupport.firePropertyChange(propertyName, oldValue,
-				newValue);
-	}
-	
-
-	private Combo comboEditable;
-	//private Combo comboReadOnly;
-	
-	private static final String PROP_TEXT = "text";
-	private String text = "Hello, world";
-	
-	public String getText() {
-		return text;
-	}
-
-	public void setText(String text) {
-		this.text = text;
-	}
-	
-	private static final String PROP_CHOICES = "choices";
-	private List choices = new ArrayList();
-	 {
-		choices.add("Banana");
-		choices.add("Apple");
-		choices.add("Mango");
-	}
-
-	public List getChoices() {
-		return choices;
-	}
-
-	public void setChoices(List choices) {
-		this.choices = choices;
-		firePropertyChange(PROP_CHOICES, null, null);
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		getComposite().setLayout(new FillLayout());
-		comboEditable = new Combo(getComposite(), SWT.DROP_DOWN);
-//		comboReadOnly = new Combo(getComposite(), SWT.DROP_DOWN | SWT.READ_ONLY);
-	}
-	
-	//-------------------------------------------------------------------------
-	
-	private static final String NEXT = "Next";
-	public void testBindText() throws Exception {
-        getDbc().bindValue(SWTObservables.observeText(comboEditable), BeansObservables.observeValue(this, "text"), null, null);
-		spinEventLoop(0);
-		assertEquals("Should find value of text", text, comboEditable.getText());
-		comboEditable.setText(NEXT);
-		spinEventLoop(0);
-		assertEquals("Should find new value in text", NEXT, text);
-	}
-	
-	public void testBindItems_listHasSameItems_editable() throws Exception {
-		if (BindingTestSuite.failingTestsDisabled(this)) {
-			return;
-		}
-		text = "Apple";
-        
-        getDbc().bindValue(SWTObservables.observeText(comboEditable), BeansObservables.observeValue(this, PROP_TEXT), null, null);
-        
-		spinEventLoop(0);
-		assertEquals("Should find value of text", text, comboEditable.getText());
-        
-        IObservableList list = new WritableList(getChoices(), null);
-        getDbc().bindList(SWTObservables.observeItems(comboEditable), list, null, null);
-
-		spinEventLoop(0);
-		int position = 0;
-		for (Iterator choicesIter = choices.iterator(); choicesIter.hasNext();) {
-			String element = (String) choicesIter.next();
-			assertEquals(element, comboEditable.getItem(position));
-			++position;
-		}
-//		assertEquals("Should find value of text", "Apple", text);
-		assertEquals("Should find value of combo.getText()", "", comboEditable.getText());
-		comboEditable.setText("Banana");
-		spinEventLoop(0);
-		assertEquals("Should find value of text", "Banana", text);
-	}
-
-//	public void testBindItems_listHasSameItems_readOnly() throws Exception {
-//		text = "Apple";
-//		ComboObservableValue value = (ComboObservableValue) getDbc().createObservable(new Property(comboReadOnly, PROP_TEXT));
-//		getDbc().bind(value.getItems(), new Property(this, PROP_CHOICES), null);
-////		getDbc().bind(combo, new Property(this, PROP_CHOICES, String.class, Boolean.TRUE), null);
-//		spinEventLoop(0);
-//		assertEquals("Should find value of text", "Apple", text);
-// 		getDbc().bind(value, new Property(this, PROP_TEXT), null);
-//		spinEventLoop(0);
-//		assertEquals("Should find value of text", "Apple", text);
-//		assertEquals("Should find value of combo.getText()", "Apple", comboReadOnly.getText());
-//		int position = 0;
-//		for (Iterator choicesIter = choices.iterator(); choicesIter.hasNext();) {
-//			String element = (String) choicesIter.next();
-//			assertEquals(element, comboReadOnly.getItem(position));
-//			++position;
-//		}
-//		assertEquals("Should find value of text", "Apple", text);
-//		assertEquals("Should find value of combo.getText()", "Apple", comboReadOnly.getText());
-//		comboReadOnly.setText("Banana");
-//		spinEventLoop(0);
-//		assertEquals("Should find value of text", "Banana", text);
-//	}
-
-	public void testBindItems_listHasDifferentItems_editable() throws Exception {
-		if (BindingTestSuite.failingTestsDisabled(this)) {
-			return;
-		}
-        
-        getDbc().bindValue(SWTObservables.observeText(comboEditable), BeansObservables.observeValue(this, PROP_TEXT), null, null);
-
-		spinEventLoop(0);
-		assertEquals("Should find value of text", text, comboEditable.getText());
-        
-        IObservableList list = new WritableList(new ArrayList(), String.class);
-        list.addAll(getChoices());
-        getDbc().bindList(SWTObservables.observeItems(comboEditable), list, null, null);
-        
-		spinEventLoop(0);
-		int position = 0;
-		for (Iterator choicesIter = choices.iterator(); choicesIter.hasNext();) {
-			String element = (String) choicesIter.next();
-			assertEquals(element, comboEditable.getItem(position));
-			++position;
-		}
-//		assertEquals("Should find value of text", "Hello, world", text);
-		assertEquals("Should find value of combo.getText()", "", comboEditable.getText());
-		comboEditable.setText("Banana");
-		spinEventLoop(0);
-		assertEquals("Should find value of text", "Banana", text);
-	}
-
-//	public void testBindItems_listHasDifferentItems_readOnly() throws Exception {
-//		ComboObservableValue value = (ComboObservableValue) getDbc().createObservable(new Property(comboReadOnly, PROP_TEXT));
-//		getDbc().bind(value, new Property(this, PROP_TEXT), null);
-//		spinEventLoop(0);
-//		getDbc().bind(value.getItems(), new Property(this, PROP_CHOICES), null);
-////		getDbc().bind(combo, new Property(this, PROP_CHOICES, String.class, Boolean.TRUE), null);
-//		spinEventLoop(0);
-//		int position = 0;
-//		for (Iterator choicesIter = choices.iterator(); choicesIter.hasNext();) {
-//			String element = (String) choicesIter.next();
-//			assertEquals(element, comboReadOnly.getItem(position));
-//			++position;
-//		}
-////		assertEquals("Should find value of text", "Hello, world", text);
-//		assertEquals("Should find value of combo.getText()", "", comboReadOnly.getText());
-//		comboReadOnly.setText("Banana");
-//		spinEventLoop(0);
-//		assertEquals("Should find value of text", "Banana", text);
-//	}
-	
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ComboViewerScenario.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ComboViewerScenario.java
deleted file mode 100644
index 4cf8176..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ComboViewerScenario.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *     Brad Reynolds - bug 160000
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.examples.databinding.model.Adventure;
-import org.eclipse.jface.examples.databinding.model.Catalog;
-import org.eclipse.jface.examples.databinding.model.Lodging;
-import org.eclipse.jface.examples.databinding.model.SampleData;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Combo;
-
-/**
- * To run the tests in this class, right-click and select "Run As JUnit Plug-in
- * Test". This will also start an Eclipse instance. To clean up the launch
- * configuration, open up its "Main" tab and select "[No Application] - Headless
- * Mode" as the application to run.
- */
-
-public class ComboViewerScenario extends ScenariosTestCase {
-
-	private Catalog catalog;
-
-	private Combo combo;
-
-	private ComboViewer comboViewer;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		// do any setup work here
-		combo = new Combo(getComposite(), SWT.READ_ONLY | SWT.DROP_DOWN);
-		comboViewer = new ComboViewer(combo);
-		catalog = SampleData.CATALOG_2005; // Lodging source
-	}
-
-	protected void tearDown() throws Exception {
-		combo.dispose();
-		combo = null;
-		comboViewer = null;
-		super.tearDown();
-	}
-
-	public void testScenario01() {
-		// Bind the catalog's lodgings to the combo
-		IObservableList lodgings = BeansObservables.observeList(realm, catalog,
-				"lodgings");
-		ObservableListContentProvider contentProvider = new ObservableListContentProvider();
-
-		IObservableMap attributeMap = BeansObservables.observeMap(
-				contentProvider.getKnownElements(), Lodging.class, "name");
-		comboViewer.setLabelProvider(new ObservableMapLabelProvider(
-				attributeMap));
-		comboViewer.setContentProvider(contentProvider);
-		comboViewer.setInput(lodgings);
-
-		// Verify that the combo's items are the lodgings
-		for (int i = 0; i < catalog.getLodgings().length; i++) {
-			assertEquals(catalog.getLodgings()[i], comboViewer.getElementAt(i));
-		}
-		// Verify that the String being shown in the combo viewer is the
-		// "toString" of the combo viewer
-		String[] lodgingStrings = new String[catalog.getLodgings().length];
-		for (int i = 0; i < catalog.getLodgings().length; i++) {
-			lodgingStrings[i] = catalog.getLodgings()[i].getName();
-		}
-		assertArrayEquals(lodgingStrings, combo.getItems());
-
-		// Verify that the combo has no selected item
-		assertEquals(null, ((IStructuredSelection) comboViewer.getSelection())
-				.getFirstElement());
-
-		// Now bind the selection of the combo to the "defaultLodging" property
-		// of an adventure
-		final Adventure adventure = SampleData.WINTER_HOLIDAY;
-		IObservableValue selection = ViewersObservables
-				.observeSingleSelection(comboViewer);
-		getDbc().bindValue(selection,
-				BeansObservables.observeValue(adventure, "defaultLodging"),
-				null, null);
-
-		// Verify that the combo selection is the default lodging
-		assertEquals(((IStructuredSelection) comboViewer.getSelection())
-				.getFirstElement(), adventure.getDefaultLodging());
-
-		// Change the model and verify that the combo selection changes
-		adventure.setDefaultLodging(SampleData.CAMP_GROUND);
-		assertEquals(adventure.getDefaultLodging(), SampleData.CAMP_GROUND);
-		assertEquals(((IStructuredSelection) comboViewer.getSelection())
-				.getFirstElement(), adventure.getDefaultLodging());
-
-		// Change the combo selection and verify that the model changes
-		comboViewer.getCombo().select(3);
-		assertEquals(((IStructuredSelection) comboViewer.getSelection())
-				.getFirstElement(), adventure.getDefaultLodging());
-
-		adventure.setDefaultLodging(SampleData.YOUTH_HOSTEL);
-		spinEventLoop(0);
-		assertEquals(((IStructuredSelection) comboViewer.getSelection())
-				.getFirstElement(), adventure.getDefaultLodging());
-	}
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/CustomBeanModelType.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/CustomBeanModelType.java
deleted file mode 100644
index f8af853..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/CustomBeanModelType.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.databinding.scenarios;
-
-/**
- * @since 3.2
- * 
- */
-public class CustomBeanModelType {
-
-	private String propertyName;
-
-	private Object object;
-
-	private Class type;
-
-	/**
-	 * @param object
-	 * @param propertyName
-	 * @param type
-	 */
-	public CustomBeanModelType(Object object, String propertyName, Class type) {
-		this.object = object;
-		this.propertyName = propertyName;
-		this.type = type;
-	}
-
-	/**
-	 * @return
-	 */
-	public String getPropertyName() {
-		return propertyName;
-	}
-
-	/**
-	 * @return
-	 */
-	public Object getObject() {
-		return object;
-	}
-
-	/**
-	 * @return
-	 */
-	public Class getType() {
-		return type;
-	}
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/CustomBeanUpdateValueStrategy.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/CustomBeanUpdateValueStrategy.java
deleted file mode 100644
index e244710..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/CustomBeanUpdateValueStrategy.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920, 159768
- *******************************************************************************/
-// TODO djo: copyright
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import java.lang.reflect.Method;
-
-import org.eclipse.core.databinding.UpdateValueStrategy;
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.validation.IValidator;
-
-/**
- * A BindSpec that will automatically grab validators from an object's
- * properties, if a get&lt;PropertyName>Validator method is defined. Makes it
- * easy to associate validators with the properties that they are responsible
- * for validating.
- * 
- */
-public class CustomBeanUpdateValueStrategy extends UpdateValueStrategy {
-
-	public IConverter createConverter(Object fromType, Object toType) {
-		if (fromType instanceof CustomBeanModelType) {
-			CustomBeanModelType customBeanModelType = (CustomBeanModelType) fromType;
-			fromType = customBeanModelType.getType();
-		}
-		if (toType instanceof CustomBeanModelType) {
-			CustomBeanModelType customBeanModelType = (CustomBeanModelType) toType;
-			toType = customBeanModelType.getType();
-		}
-		return super.createConverter(fromType, toType);
-	}
-
-	protected void fillDefaults(IObservableValue source,
-			IObservableValue destination) {
-		if (destination.getValueType() instanceof CustomBeanModelType) {
-			if (beforeSetValidator==null) {
-				CustomBeanModelType property = (CustomBeanModelType) destination.getValueType();
-				String propertyName = property.getPropertyName();
-				String getValidatorMethodName = "get" + upperCaseFirstLetter(propertyName) + "Validator"; //$NON-NLS-1$ //$NON-NLS-2$
-
-				Class objectClass = property.getObject().getClass();
-
-				Method getValidator;
-				try {
-					getValidator = objectClass.getMethod(getValidatorMethodName,
-							new Class[] { Class.class });
-					beforeSetValidator= (IValidator) getValidator.invoke(property
-								.getObject(), new Object[0]);
-				} catch (Exception e) {
-					// ignore
-				}
-
-			}
- 		}
-		super.fillDefaults(source, destination);
-	}
-
-	private String upperCaseFirstLetter(String name) {
-		String result = name.substring(0, 1).toUpperCase() + name.substring(1);
-		return result;
-	}
-
-	public Boolean isAssignableFromTo(Object fromType, Object toType) {
-		if (fromType instanceof CustomBeanModelType) {
-			fromType = ((CustomBeanModelType) fromType).getType();
-		}
-		if (toType instanceof CustomBeanModelType) {
-			toType = ((CustomBeanModelType) toType).getType();
-		}
-		return super.isAssignableFromTo(fromType, toType);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/CustomConverterScenarios.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/CustomConverterScenarios.java
deleted file mode 100644
index d350778..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/CustomConverterScenarios.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.examples.databinding.model.Adventure;
-import org.eclipse.jface.examples.databinding.model.PriceModelObject;
-import org.eclipse.jface.examples.databinding.model.SampleData;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Spinner;
-
-/**
- * To run the tests in this class, right-click and select "Run As JUnit Plug-in
- * Test". This will also start an Eclipse instance. To clean up the launch
- * configuration, open up its "Main" tab and select "[No Application] - Headless
- * Mode" as the application to run.
- */
-
-public class CustomConverterScenarios extends ScenariosTestCase {
-
-    private Adventure skiTrip;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        skiTrip = SampleData.WINTER_HOLIDAY;
-    }
-
-    protected void tearDown() throws Exception {
-        // do any teardown work here
-        super.tearDown();
-    }
-
-    public void testScenario01() {
-        DataBindingContext dbc = getDbc();
-        Spinner spinner_dollars = new Spinner(getComposite(), SWT.NONE);
-        spinner_dollars.setMaximum(10000);
-        Spinner spinner_cents = new Spinner(getComposite(), SWT.NONE);
-
-        // The price object is a double which contains both the dollars and
-        // cents
-        // To allow this to be worked on with two separate spinner controls
-        // (which get and set int values)
-        // an intermediate object is used
-        PriceModelObject priceModel = new PriceModelObject();
-
-        dbc.bindValue(BeansObservables.observeValue(priceModel, "price"), BeansObservables.observeValue(skiTrip,
-                "price"), null, null);
-
-        dbc.bindValue(SWTObservables.observeSelection(spinner_dollars),
-                BeansObservables.observeValue(priceModel, "dollars"),
-                null, null);
-
-        dbc.bindValue(SWTObservables.observeSelection(spinner_cents),
-                BeansObservables.observeValue(priceModel, "cents"),
-                null, null);
-
-        // spinEventLoop(1);
-        // Make sure that the selection on the spinner_dollars matches the
-        // dollars of the price
-        assertEquals(spinner_dollars.getSelection(), new Double(skiTrip.getPrice()).intValue());
-        // Make sure that the selection on the spinner_cents matches the dollars
-        // of the price
-        Double doublePrice = new Double(skiTrip.getPrice());
-        double cents = 100 * doublePrice.doubleValue() - 100 * doublePrice.intValue();
-        assertEquals(spinner_cents.getSelection(), (int) cents);
-
-        // Change the selection on the spinner_dollars to be $50 and make sure
-        // the model is updated with the cents included
-        spinner_dollars.setSelection(50);
-        double expectedPrice = 50 + cents / 100;
-        assertEquals(expectedPrice, skiTrip.getPrice(), 0.01);
-
-        // Change the selection on the spinner_cents to be 27 and make sure the
-        // model is updated with the dollars included
-        spinner_cents.setSelection(27);
-        assertEquals(50.27, skiTrip.getPrice(), 0.01);
-
-        // Change the model to be $60.99 dollars and make sure the
-        // spinner_dollars is 60 and spinner_cents is 99
-        skiTrip.setPrice(60.99);
-        assertEquals(60, spinner_dollars.getSelection());
-        assertEquals(99, spinner_cents.getSelection());
-
-    }
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/CustomScenarios.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/CustomScenarios.java
deleted file mode 100644
index c6eb678..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/CustomScenarios.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.examples.databinding.model.Adventure;
-import org.eclipse.jface.examples.databinding.model.AggregateObservableValue;
-import org.eclipse.jface.examples.databinding.model.SampleData;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * To run the tests in this class, right-click and select "Run As JUnit Plug-in
- * Test". This will also start an Eclipse instance. To clean up the launch
- * configuration, open up its "Main" tab and select "[No Application] - Headless
- * Mode" as the application to run.
- */
-
-public class CustomScenarios extends ScenariosTestCase {
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        // do any setup work here
-    }
-
-    protected void tearDown() throws Exception {
-        // do any teardown work here
-        super.tearDown();
-    }
-
-    public void testScenario01() {
-
-        // Binding the name property of an Adventure object to the contents of
-        // Text controls, no conversion, no validation.
-
-        Adventure adventure = SampleData.WINTER_HOLIDAY;
-        Text text = new Text(getComposite(), SWT.BORDER);
-
-        IObservableValue descriptionObservable = BeansObservables.observeValue(adventure, "description");
-        IObservableValue nameObservable = BeansObservables.observeValue(adventure, "name");
-        AggregateObservableValue customObservable_comma = new AggregateObservableValue(new IObservableValue[] {
-                descriptionObservable, nameObservable }, ",");
-
-        getDbc().bindValue(SWTObservables.observeText(text, SWT.Modify), customObservable_comma, null, null);
-        // spinEventLoop(1);
-        // Make sure that the description on the model match the widget
-        assertEquals(adventure.getDescription() + "," + adventure.getName(), text.getText());
-
-        // Change the widget to newDescription,newName and ensure the model is
-        // updated
-        text.setText("newDescription,newName");
-        assertEquals("newDescription", adventure.getDescription());
-        assertEquals("newName", adventure.getName());
-
-        // Change the model to newDescription_0 and newName_0 and ensure the GUI
-        // is updated
-        adventure.setDescription("newDescription_0");
-        adventure.setName("newName_0");
-        assertEquals("newDescription_0,newName_0", text.getText());
-
-        // Change text to newDescription_1 with no comma and ensure the model is
-        // updated correctly with no name
-        text.setText("newDescription_1");
-        assertEquals("newDescription_1", adventure.getDescription());
-        assertEquals(null, adventure.getName());
-
-        // Change text to newName with a preceeding comma and ensure the model
-        // is updated correctly with no description
-        // TODO - Get this test working + Add the one where we have two
-        // aggregates and update one and
-        // check that the other is updated - currently this fails on the GUI -
-        // JRW
-        // text.setText(",newName_1");
-        // assertEquals(null, adventure.getDescription());
-        // assertEquals("newName_1", adventure.getName());
-
-    }
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/LabelControlScenario.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/LabelControlScenario.java
deleted file mode 100644
index ad234a6..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/LabelControlScenario.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.examples.databinding.model.Adventure;
-import org.eclipse.jface.examples.databinding.model.SampleData;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * To run the tests in this class, right-click and select "Run As JUnit Plug-in
- * Test". This will also start an Eclipse instance. To clean up the launch
- * configuration, open up its "Main" tab and select "[No Application] - Headless
- * Mode" as the application to run.
- */
-
-public class LabelControlScenario extends ScenariosTestCase {
-
-    private Adventure adventure;
-
-    private Label label;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        // do any setup work here
-        label = new Label(getComposite(), SWT.NONE);
-        adventure = SampleData.WINTER_HOLIDAY;
-    }
-
-    protected void tearDown() throws Exception {
-        // do any teardown work here
-        super.tearDown();
-        label.dispose();
-        label = null;
-    }
-
-    public void testScenario01() {
-        // Bind the adventure "name" property to a label control
-        // Change the UI and verify the model and UI are the same value
-        // Change the model and verify the UI changes
-        getDbc().bindValue(SWTObservables.observeText(label), BeansObservables.observeValue(adventure, "name"), null, null);
-
-        assertEquals(adventure.getName(), label.getText());
-        adventure.setName("France");
-        assertEquals("France", label.getText());
-        adventure.setName("Climb Everest");
-        spinEventLoop(0);
-        assertEquals("Climb Everest", label.getText());
-    }
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ListViewerScenario.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ListViewerScenario.java
deleted file mode 100644
index 0fe7dda..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ListViewerScenario.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *     Brad Reynolds - bug 160000
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.examples.databinding.model.Adventure;
-import org.eclipse.jface.examples.databinding.model.Catalog;
-import org.eclipse.jface.examples.databinding.model.Lodging;
-import org.eclipse.jface.examples.databinding.model.SampleData;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.List;
-
-/**
- * To run the tests in this class, right-click and select "Run As JUnit Plug-in
- * Test". This will also start an Eclipse instance. To clean up the launch
- * configuration, open up its "Main" tab and select "[No Application] - Headless
- * Mode" as the application to run.
- */
-
-public class ListViewerScenario extends ScenariosTestCase {
-
-	private Catalog catalog;
-
-	private List list;
-
-	private ListViewer listViewer;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		// do any setup work here
-		list = new List(getComposite(), SWT.READ_ONLY | SWT.SINGLE);
-		listViewer = new ListViewer(list);
-		catalog = SampleData.CATALOG_2005; // Lodging source
-	}
-
-	protected void tearDown() throws Exception {
-		list.dispose();
-		list = null;
-		listViewer = null;
-		super.tearDown();
-	}
-
-	public void testScenario01() {
-		// Bind the catalog's lodgings to the combo
-		IObservableList lodgings = BeansObservables.observeList(Realm
-				.getDefault(), catalog, "lodgings");
-		ObservableListContentProvider contentProvider = new ObservableListContentProvider();
-
-		IObservableMap[] attributeMaps = BeansObservables.observeMaps(
-				contentProvider.getKnownElements(), Lodging.class,
-				new String[] { "name" });
-		listViewer.setContentProvider(contentProvider);
-		listViewer.setLabelProvider(new ObservableMapLabelProvider(
-				attributeMaps));
-		listViewer.setInput(lodgings);
-
-		// Verify that the combo's items are the lodgings
-		for (int i = 0; i < catalog.getLodgings().length; i++) {
-			assertEquals(catalog.getLodgings()[i], listViewer.getElementAt(i));
-		}
-		// Verify that the String being shown in the list viewer is the
-		// "toString" of the combo viewer
-		String[] lodgingStrings = new String[catalog.getLodgings().length];
-		for (int i = 0; i < catalog.getLodgings().length; i++) {
-			lodgingStrings[i] = catalog.getLodgings()[i].getName();
-		}
-		assertArrayEquals(lodgingStrings, list.getItems());
-
-		// Verify that the list has no selected item
-		assertEquals(null, ((IStructuredSelection) listViewer.getSelection())
-				.getFirstElement());
-
-		// Now bind the selection of the combo to the "defaultLodging" property
-		// of an adventure
-		final Adventure adventure = SampleData.WINTER_HOLIDAY;
-
-		IObservableValue selection = ViewersObservables
-				.observeSingleSelection(listViewer);
-		getDbc().bindValue(selection,
-				BeansObservables.observeValue(adventure, "defaultLodging"),
-				null, null);
-
-		// Verify that the list selection is the default lodging
-		assertEquals(((IStructuredSelection) listViewer.getSelection())
-				.getFirstElement(), adventure.getDefaultLodging());
-
-		// Change the model and verify that the list selection changes
-		adventure.setDefaultLodging(SampleData.CAMP_GROUND);
-		assertEquals(adventure.getDefaultLodging(), SampleData.CAMP_GROUND);
-		assertEquals(((IStructuredSelection) listViewer.getSelection())
-				.getFirstElement(), adventure.getDefaultLodging());
-
-		// Change the list selection and verify that the model changes
-		listViewer.getList().select(3);
-		assertEquals(((IStructuredSelection) listViewer.getSelection())
-				.getFirstElement(), adventure.getDefaultLodging());
-
-		adventure.setDefaultLodging(SampleData.YOUTH_HOSTEL);
-		spinEventLoop(0);
-		assertEquals(((IStructuredSelection) listViewer.getSelection())
-				.getFirstElement(), adventure.getDefaultLodging());
-
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/MasterDetailScenarios.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/MasterDetailScenarios.java
deleted file mode 100644
index d8b8b76..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/MasterDetailScenarios.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 160000
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
-import org.eclipse.core.databinding.observable.value.ComputedValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.examples.databinding.model.Adventure;
-import org.eclipse.jface.examples.databinding.model.Catalog;
-import org.eclipse.jface.examples.databinding.model.Category;
-import org.eclipse.jface.examples.databinding.model.Lodging;
-import org.eclipse.jface.examples.databinding.model.SampleData;
-import org.eclipse.jface.viewers.ContentViewer;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.StructuredSelection;
-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.widgets.Button;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * To run the tests in this class, right-click and select "Run As JUnit Plug-in
- * Test". This will also start an Eclipse instance. To clean up the launch
- * configuration, open up its "Main" tab and select "[No Application] - Headless
- * Mode" as the application to run.
- */
-
-public class MasterDetailScenarios extends ScenariosTestCase {
-
-	protected Object getViewerSelection(ContentViewer contentViewer) {
-		return ((IStructuredSelection) contentViewer.getSelection())
-				.getFirstElement();
-	}
-
-	/**
-	 * @return the ComboViewer's domain object list
-	 */
-	protected List getViewerContent(ContentViewer contentViewer) {
-		Object[] elements = ((IStructuredContentProvider) contentViewer
-				.getContentProvider()).getElements(null);
-		if (elements != null)
-			return Arrays.asList(elements);
-		return null;
-	}
-
-	public void testScenario01() {
-		// Displaying the catalog's list of Lodging objects in a list viewer,
-		// using their names. The name of the currently selected Lodging can
-		// be edited in a text widget. There is always a selected Lodging
-		// object.
-		ListViewer listViewer = new ListViewer(getComposite(), SWT.BORDER);
-		Realm realm = SWTObservables.getRealm(listViewer.getControl()
-				.getDisplay());
-		listViewer.getList().setLayoutData(
-				new GridData(SWT.FILL, SWT.FILL, false, false));
-		Catalog catalog = SampleData.CATALOG_2005;
-
-		IObservableList lodgings = BeansObservables.observeList(realm, catalog,
-				"lodgings");
-		ObservableListContentProvider contentProvider = new ObservableListContentProvider();
-		IObservableMap[] attributeMaps = BeansObservables.observeMaps(
-				contentProvider.getKnownElements(), Lodging.class,
-				new String[] { "name" });
-		listViewer.setContentProvider(contentProvider);
-		listViewer.setLabelProvider(new ObservableMapLabelProvider(
-				attributeMaps));
-		listViewer.setInput(lodgings);
-
-		assertArrayEquals(catalog.getLodgings(), getViewerContent(listViewer)
-				.toArray());
-
-		IObservableValue selectedLodging = ViewersObservables
-				.observeSingleSelection(listViewer);
-
-		selectedLodging.setValue(SampleData.CAMP_GROUND);
-
-		assertEquals(SampleData.CAMP_GROUND, getViewerSelection(listViewer));
-		Text txtName = new Text(getComposite(), SWT.BORDER);
-
-		getDbc().bindValue(
-				SWTObservables.observeText(txtName, SWT.Modify),
-				BeansObservables.observeDetailValue(realm, selectedLodging,
-						"name", String.class), null, null);
-
-		assertEquals(txtName.getText(), SampleData.CAMP_GROUND.getName());
-		enterText(txtName, "foobar");
-		assertEquals("foobar", SampleData.CAMP_GROUND.getName());
-		listViewer.setSelection(new StructuredSelection(
-				SampleData.FIVE_STAR_HOTEL));
-		assertEquals(SampleData.FIVE_STAR_HOTEL, selectedLodging.getValue());
-		assertEquals(SampleData.FIVE_STAR_HOTEL.getName(), txtName.getText());
-		SampleData.FIVE_STAR_HOTEL.setName("barfoo");
-		assertEquals("barfoo", txtName.getText());
-
-		// Now make sure that the event listeners get removed on dispose()
-		// Values should no longer be updated
-		selectedLodging.dispose();
-
-		// selectedLodging.setValue(SampleData.CAMP_GROUND);
-		// assertNotSame(SampleData.CAMP_GROUND,
-		// getViewerSelection(listViewer));
-		// assertNotSame(txtName.getText(), SampleData.CAMP_GROUND.getName());
-		// enterText(txtName, "foobar");
-		// assertNotSame("foobar", SampleData.CAMP_GROUND.getName());
-		// listViewer.setSelection(new StructuredSelection(
-		// SampleData.FIVE_STAR_HOTEL));
-		// assertNotSame(SampleData.FIVE_STAR_HOTEL,
-		// selectedLodging.getValue());
-		// assertNotSame(SampleData.FIVE_STAR_HOTEL.getName(),
-		// txtName.getText());
-		// SampleData.FIVE_STAR_HOTEL.setName("barfoo");
-		// assertNotSame("barfoo", txtName.getText());
-	}
-
-	public void testScenario02() {
-		// Selecting from the list of lodgings for an adventure and editing the
-		// properties of the selected lodging in text widgets. If no lodging is
-		// selected the input controls for name and adventure are disabled.
-		// There are two buttons "Add" and "Remove"; clicking on "Add" creates a
-		// new lodging and selects it so it can be edited, clicking on "Remove"
-		// removes the currently selected lodging from the list.
-		final ListViewer listViewer = new ListViewer(getComposite(), SWT.BORDER);
-		listViewer.getList().setLayoutData(
-				new GridData(SWT.FILL, SWT.FILL, false, false));
-		final Catalog catalog = SampleData.CATALOG_2005;
-
-		IObservableList lodgings = BeansObservables.observeList(realm, catalog,
-				"lodgings");
-		ObservableListContentProvider contentProvider = new ObservableListContentProvider();
-		IObservableMap[] attributeMaps = BeansObservables.observeMaps(
-				contentProvider.getKnownElements(), Lodging.class,
-				new String[] { "name" });
-		listViewer.setContentProvider(contentProvider);
-		listViewer.setLabelProvider(new ObservableMapLabelProvider(
-				attributeMaps));
-		listViewer.setInput(lodgings);
-
-		assertArrayEquals(catalog.getLodgings(), getViewerContent(listViewer)
-				.toArray());
-
-		final IObservableValue selectedLodgingObservable = ViewersObservables
-				.observeSingleSelection(listViewer);
-
-		selectedLodgingObservable.setValue(null);
-		assertTrue(listViewer.getSelection().isEmpty());
-
-		ComputedValue selectionExistsObservable = new ComputedValue(
-				boolean.class) {
-			protected Object calculate() {
-				return new Boolean(selectedLodgingObservable.getValue() != null);
-			}
-		};
-
-		assertFalse(((Boolean) selectionExistsObservable.getValue())
-				.booleanValue());
-
-		final Text txtName = new Text(getComposite(), SWT.BORDER);
-
-		getDbc().bindValue(SWTObservables.observeEnabled(txtName),
-				selectionExistsObservable, null, null);
-		getDbc().bindValue(
-				SWTObservables.observeText(txtName, SWT.Modify),
-				BeansObservables.observeDetailValue(realm,
-						selectedLodgingObservable, "name", String.class), null, null);
-
-		assertEquals(txtName.getText(), "");
-		assertFalse(txtName.getEnabled());
-
-		final Text txtDescription = new Text(getComposite(), SWT.BORDER);
-
-		getDbc().bindValue(SWTObservables.observeEnabled(txtDescription),
-				selectionExistsObservable, null, null);
-		getDbc().bindValue(
-				SWTObservables.observeText(txtDescription, SWT.Modify),
-				MasterDetailObservables.detailValue(
-						selectedLodgingObservable, BeansObservables
-								.valueFactory(realm, "description"),
-						String.class), null, null);
-
-		assertEquals(txtDescription.getText(), "");
-		assertFalse(txtDescription.getEnabled());
-
-		Button addButton = new Button(getComposite(), SWT.PUSH);
-		addButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				Lodging selectedLodging = (Lodging) selectedLodgingObservable
-						.getValue();
-				int insertionIndex = 0;
-				if (selectedLodging != null) {
-					insertionIndex = Arrays.asList(catalog.getLodgings())
-							.indexOf(selectedLodging);
-					assertTrue(insertionIndex >= 0);
-				}
-				Lodging newLodging = SampleData.FACTORY.createLodging();
-				int itemCount = listViewer.getList().getItemCount();
-				newLodging.setName("new lodging name " + itemCount);
-				newLodging.setDescription("new lodging description "
-						+ itemCount);
-				catalog.addLodging(newLodging);
-				assertEquals(itemCount + 1, listViewer.getList().getItemCount());
-				listViewer.setSelection(new StructuredSelection(newLodging));
-				assertSame(newLodging, selectedLodgingObservable.getValue());
-				assertTrue(txtName.getEnabled());
-				assertTrue(txtDescription.getEnabled());
-				assertEquals(newLodging.getName(), txtName.getText());
-				assertEquals(newLodging.getDescription(), txtDescription
-						.getText());
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				widgetSelected(e);
-			}
-		});
-
-		Button removeButton = new Button(getComposite(), SWT.PUSH);
-		removeButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				Lodging selectedLodging = (Lodging) selectedLodgingObservable
-						.getValue();
-				assertNotNull(selectedLodging);
-				int deletionIndex = Arrays.asList(catalog.getLodgings())
-						.indexOf(selectedLodging);
-				assertTrue(deletionIndex >= 0);
-				int itemCount = listViewer.getList().getItemCount();
-				catalog.removeLodging(selectedLodging);
-				assertEquals(itemCount - 1, listViewer.getList().getItemCount());
-				assertNull(selectedLodgingObservable.getValue());
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				widgetSelected(e);
-			}
-		});
-
-		pushButtonWithEvents(addButton);
-		pushButtonWithEvents(removeButton);
-		pushButtonWithEvents(addButton);
-		pushButtonWithEvents(addButton);
-		pushButtonWithEvents(removeButton);
-	}
-
-	public void testScenario03() {
-		// List adventures and for the selected adventure allow its default
-		// lodging�s name and description to be changed in text controls. If
-		// there is no selected adventure or the default lodging is null the
-		// text controls are disabled. This is a nested property. The default
-		// lodging can be changed elsewhere, and the list
-		final Catalog catalog = SampleData.CATALOG_2005;
-
-		final ListViewer categoryListViewer = new ListViewer(getComposite(),
-				SWT.BORDER);
-		categoryListViewer.getList().setLayoutData(
-				new GridData(SWT.FILL, SWT.FILL, false, false));
-
-		IObservableList categories = BeansObservables.observeList(realm,
-				catalog, "categories");
-		ObservableListContentProvider contentProvider = new ObservableListContentProvider();
-		IObservableMap[] attributeMaps = BeansObservables.observeMaps(
-				contentProvider.getKnownElements(), Category.class,
-				new String[] { "name" });
-		categoryListViewer.setContentProvider(contentProvider);
-		categoryListViewer.setLabelProvider(new ObservableMapLabelProvider(
-				attributeMaps));
-		categoryListViewer.setInput(categories);
-
-		assertArrayEquals(catalog.getCategories(), getViewerContent(
-				categoryListViewer).toArray());
-
-		final IObservableValue selectedCategoryObservable = ViewersObservables
-				.observeSingleSelection(categoryListViewer);
-
-		final ListViewer adventureListViewer = new ListViewer(getComposite(),
-				SWT.BORDER);
-		adventureListViewer.getList().setLayoutData(
-				new GridData(SWT.FILL, SWT.FILL, false, false));
-
-		IObservableList adventures = BeansObservables.observeDetailList(realm,
-				selectedCategoryObservable, "adventures", Adventure.class);
-		contentProvider = new ObservableListContentProvider();
-		attributeMaps = BeansObservables.observeMaps(contentProvider
-				.getKnownElements(), Adventure.class, new String[] { "name" });
-		adventureListViewer.setContentProvider(contentProvider);
-		adventureListViewer.setLabelProvider(new ObservableMapLabelProvider(
-				attributeMaps));
-		adventureListViewer.setInput(adventures);
-
-		ComputedValue categorySelectionExistsObservable = new ComputedValue() {
-			protected Object calculate() {
-				return new Boolean(
-						selectedCategoryObservable.getValue() != null);
-			}
-		};
-
-		getDbc().bindValue(
-				SWTObservables.observeEnabled(adventureListViewer.getList()),
-				categorySelectionExistsObservable, null, null);
-
-		final IObservableValue selectedAdventureObservable = ViewersObservables
-				.observeSingleSelection(adventureListViewer);
-
-		ComputedValue adventureSelectionExistsObservable = new ComputedValue() {
-			protected Object calculate() {
-				return new Boolean(
-						selectedAdventureObservable.getValue() != null);
-			}
-		};
-
-		final Text txtName = new Text(getComposite(), SWT.BORDER);
-
-		getDbc().bindValue(SWTObservables.observeEnabled(txtName),
-				adventureSelectionExistsObservable, null, null);
-		getDbc().bindValue(
-				SWTObservables.observeText(txtName, SWT.Modify),
-				BeansObservables.observeDetailValue(realm,
-						selectedAdventureObservable, "name", String.class),
-				null, null);
-
-		assertEquals(txtName.getText(), "");
-		assertFalse(txtName.getEnabled());
-
-		final Text txtDescription = new Text(getComposite(), SWT.BORDER);
-
-		getDbc().bindValue(SWTObservables.observeEnabled(txtDescription),
-				adventureSelectionExistsObservable, null, null);
-		getDbc().bindValue(
-				SWTObservables.observeText(txtDescription, SWT.Modify),
-				BeansObservables.observeDetailValue(realm,
-						selectedAdventureObservable, "description",
-						String.class), null, null);
-
-		assertFalse(adventureListViewer.getList().isEnabled());
-		categoryListViewer.setSelection(new StructuredSelection(
-				SampleData.SUMMER_CATEGORY));
-		assertTrue(adventureListViewer.getList().isEnabled());
-		assertFalse(txtName.getEnabled());
-		adventureListViewer.setSelection(new StructuredSelection(
-				SampleData.RAFTING_HOLIDAY));
-		assertEquals(Boolean.TRUE, adventureSelectionExistsObservable
-				.getValue());
-		assertTrue(txtName.getEnabled());
-		assertEquals(SampleData.RAFTING_HOLIDAY.getName(), txtName.getText());
-		categoryListViewer.setSelection(new StructuredSelection(
-				SampleData.WINTER_CATEGORY));
-		assertTrue(adventureListViewer.getList().isEnabled());
-		assertFalse(txtName.getEnabled());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/NPETestScenario.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/NPETestScenario.java
deleted file mode 100644
index b7e4aed..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/NPETestScenario.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @since 3.2
- * 
- */
-public class NPETestScenario extends ScenariosTestCase {
-    private Text text;
-
-    Person person;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        person = new Person();
-        text = new Text(getComposite(), SWT.BORDER);
-    }
-
-    /**
-     * Asserts the ability to have an initial value of <code>null</code> on
-     * the model and to update the value by changing the value of the view.
-     */
-    public void test_InitialNullValue() {
-        Person person = new Person();
-        assertNull(person.getName());
-
-        System.out.println("Expecting message about not being able to attach a listener");
-        getDbc().bindValue(SWTObservables.observeText(text, SWT.Modify),
-                BeansObservables.observeValue(person, "name"),
-                null, null);
-
-        text.setText("Brad");
-        text.notifyListeners(SWT.FocusOut, null);
-        assertEquals("Brad", person.getName());
-    }
-
-    private static class Person {
-        private String name;
-
-        /**
-         * @return Returns the name.
-         */
-        public String getName() {
-            return name;
-        }
-
-        /**
-         * @param name
-         *            The name to set.
-         */
-        public void setName(String name) {
-            this.name = name;
-        }
-    }
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/NewTableScenarios.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/NewTableScenarios.java
deleted file mode 100644
index 6a32325..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/NewTableScenarios.java
+++ /dev/null
@@ -1,443 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import org.eclipse.jface.examples.databinding.model.Catalog;
-import org.eclipse.jface.examples.databinding.model.Category;
-import org.eclipse.jface.examples.databinding.model.SampleData;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * To run the tests in this class, right-click and select "Run As JUnit Plug-in
- * Test". This will also start an Eclipse instance. To clean up the launch
- * configuration, open up its "Main" tab and select "[No Application] - Headless
- * Mode" as the application to run.
- */
-
-public class NewTableScenarios extends ScenariosTestCase {
-
-	private TableViewer tableViewer;
-
-	Catalog catalog;
-
-	Category category;
-
-	private TableColumn firstNameColumn;
-
-	private TableColumn lastNameColumn;
-
-	private TableColumn stateColumn;
-
-	Image[] images;
-
-	private TableColumn fancyColumn;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		getComposite().setLayout(new FillLayout());
-		tableViewer = new TableViewer(getComposite());
-		tableViewer.getTable().setLinesVisible(true);
-		tableViewer.getTable().setHeaderVisible(true);
-		firstNameColumn = new TableColumn(tableViewer.getTable(), SWT.NONE);
-		firstNameColumn.setWidth(50);
-		lastNameColumn = new TableColumn(tableViewer.getTable(), SWT.NONE);
-		lastNameColumn.setWidth(50);
-		stateColumn = new TableColumn(tableViewer.getTable(), SWT.NONE);
-		stateColumn.setWidth(50);
-		fancyColumn = new TableColumn(tableViewer.getTable(), SWT.NONE);
-		fancyColumn.setWidth(250);
-
-		catalog = SampleData.CATALOG_2005; // Lodging source
-		category = SampleData.WINTER_CATEGORY;
-
-		images = new Image[] {
-				getShell().getDisplay().getSystemImage(SWT.ICON_ERROR),
-				getShell().getDisplay().getSystemImage(SWT.ICON_WARNING),
-				getShell().getDisplay().getSystemImage(SWT.ICON_INFORMATION), };
-	}
-
-	protected void tearDown() throws Exception {
-		// do any teardown work here
-		super.tearDown();
-		tableViewer.getTable().dispose();
-		tableViewer = null;
-		firstNameColumn = null;
-		lastNameColumn = null;
-		stateColumn = null;
-	}
-
-	String getValue(String text) {
-		if (text == null)
-			return "";
-		return text;
-	}
-
-	public void testScenario01() {
-//		// Factory for directly creating IObservables for beans
-//		JavaBeans javaBeans = new JavaBeans();
-//		
-//		// Wrap the TableViewer in an IObservableCollectionWithLabels
-//		IObservableCollectionWithLabels accountTable = new TableViewerObservableTable(
-//				tableViewer);
-//
-//		// Create a readable set to track the catalog's accounts
-//		IReadableSet accountSet = javaBeans.createReadableSet(catalog,
-//				new PropertyDescriptor("accounts", Catalog.class, "getAccounts", null),
-//				Account.class);
-//		
-//		// Create an observable cell provider to track the given accounts' properties.
-//		IObservableCellProvider accountCellProvider = javaBeans.createObservableCellProvider(
-//				accountSet, new String[] { "firstName", "lastName", "state" });
-//
-//		// bind
-//		getDbc().bind(accountTable, accountCellProvider, null);
-//		
-//		// uncomment next line to see result interactively
-//		// interact();
-//
-//		// Verify the data in the table columns matches the accounts
-//		Account[] accounts = catalog.getAccounts();
-//		for (int i = 0; i < accounts.length; i++) {
-//			Account account = accounts[i];
-//			String col_0 = ((ITableLabelProvider) tableViewer
-//					.getLabelProvider()).getColumnText(account, 0);
-//			assertEquals(getValue(account.getFirstName()), col_0);
-//			String col_1 = ((ITableLabelProvider) tableViewer
-//					.getLabelProvider()).getColumnText(account, 1);
-//			assertEquals(getValue(account.getLastName()), col_1);
-//			String col_2 = ((ITableLabelProvider) tableViewer
-//					.getLabelProvider()).getColumnText(account, 2);
-//			assertEquals(getValue(account.getState()), col_2);
-//
-//		}
-	}
-
-	public void testScenario02() throws SecurityException,
-			IllegalArgumentException {
-//		// Show that a TableViewer with three columns can be used to update
-//		// columns
-//		Account[] accounts = catalog.getAccounts();
-//
-//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
-//				tableViewer);
-//		tableViewerDescription.addEditableColumn("firstName");
-//		tableViewerDescription.addEditableColumn("lastName", null, null,
-//				new PhoneConverter());
-//		tableViewerDescription.addEditableColumn("state", null, null,
-//				new StateConverter());
-//		getDbc().bind(tableViewerDescription,
-//				new Property(catalog, "accounts"), null);
-//
-//		Account account = accounts[0];
-//		// Select the first item in the table
-//		tableViewer.editElement(account, 0);
-//		// Set the text property of the cell editor which is now active over the
-//		// "firstName" column
-//		CellEditor[] cellEditors = tableViewer.getCellEditors();
-//		TextCellEditor firstNameEditor = (TextCellEditor) cellEditors[0];
-//		// Change the firstName and test it goes to the model
-//		enterText((Text) firstNameEditor.getControl(), "Bill");
-//		// Check whether the model has changed
-//		assertEquals("Bill", account.getFirstName());
-	}
-
-	public void testScenario04() {
-//		// Show that when an item is added to a collection the table gets an
-//		// extra item
-//		Account[] accounts = catalog.getAccounts();
-//
-//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
-//				tableViewer);
-//		tableViewerDescription.addColumn("firstName");
-//		tableViewerDescription.addColumn("lastName");
-//		tableViewerDescription.addColumn("state");
-//		tableViewerDescription.addColumn(null, new IConverter() {
-//
-//			public Class getModelType() {
-//				return Account.class;
-//			}
-//
-//			public Class getTargetType() {
-//				return ViewerLabel.class;
-//			}
-//
-//			public Object convertTargetToModel(Object targetObject) {
-//				return null;
-//			}
-//
-//			public Object convertModelToTarget(Object modelObject) {
-//				Account account = (Account) modelObject;
-//				return new ViewerLabel(account.toString(), images[new Random()
-//						.nextInt(images.length)]);
-//			}
-//		});
-//		getDbc().bind(tableViewerDescription,
-//				new Property(catalog, "accounts"), null);
-//
-//		// interact();
-//
-//		// Verify the number of accounts matches the number of items in the
-//		// table
-//		assertEquals(tableViewer.getTable().getItemCount(), accounts.length);
-//		// Add a new account and verify that the number of items in the table
-//		// increases
-//		Account newAccount = new Account();
-//		newAccount.setFirstName("Finbar");
-//		newAccount.setLastName("McGoo");
-//		newAccount.setLastName("NC");
-//		catalog.addAccount(newAccount);
-//		// The number of items should have gone up by one
-//		assertEquals(tableViewer.getTable().getItemCount(), accounts.length + 1);
-//		// The number of items should still match the number of accounts (i.e.
-//		// test the model)
-//		assertEquals(tableViewer.getTable().getItemCount(), catalog
-//				.getAccounts().length);
-//		// Remove the account that was just added
-//		catalog.removeAccount(newAccount);
-//		// The number of items should match the original
-//		assertEquals(tableViewer.getTable().getItemCount(), accounts.length);
-//		// The number of items should still match the number of accounts (i.e.
-//		// test the model is reset)
-//		assertEquals(tableViewer.getTable().getItemCount(), catalog
-//				.getAccounts().length);
-//
-//		// Test adding and removing to the model on a non UI thread
-//		int numberOfAccounts = catalog.getAccounts().length;
-//		final Account barney = new Account();
-//		barney.setFirstName("Barney");
-//		barney.setLastName("Smith");
-//		barney.setLastName("CA");
-//		invokeNonUI(new Runnable() {
-//			public void run() {
-//				catalog.addAccount(barney);
-//			}
-//		});
-//		spinEventLoop(0);
-//		// The number of items should have gone up by one
-//		assertEquals(tableViewer.getTable().getItemCount(),
-//				numberOfAccounts + 1);
-//
-//		invokeNonUI(new Runnable() {
-//			public void run() {
-//				catalog.removeAccount(barney);
-//			}
-//		});
-//		spinEventLoop(0);
-//		// The number of items should have reverted to the original number
-//		// before barney was added and removed
-//		assertEquals(tableViewer.getTable().getItemCount(), numberOfAccounts);
-//
-	}
-
-	public void testScenario03() {
-//		// Show that converters work for table columns
-//		Account[] accounts = catalog.getAccounts();
-//
-//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
-//				tableViewer);
-//		tableViewerDescription.addEditableColumn("lastName");
-//		tableViewerDescription.addEditableColumn("phone", null, null,
-//				new PhoneConverter());
-//		tableViewerDescription.addEditableColumn("state", null, null,
-//				new StateConverter());
-//		getDbc().bind(tableViewerDescription,
-//				new Property(catalog, "accounts"), null);
-//
-//		// Verify that the data in the the table columns matches the expected
-//		// What we are looking for is that the phone numbers are converterted to
-//		// nnn-nnn-nnnn and that
-//		// the state letters are converted to state names
-//		// Verify the data in the table columns matches the accounts
-//		PhoneConverter phoneConverter = new PhoneConverter();
-//		StateConverter stateConverter = new StateConverter();
-//		for (int i = 0; i < accounts.length; i++) {
-//			Account account = catalog.getAccounts()[i];
-//			// Check the phone number
-//			String col_phone = ((ITableLabelProvider) tableViewer
-//					.getLabelProvider()).getColumnText(account, 1);
-//			assertEquals(getValue((String) phoneConverter
-//					.convertModelToTarget(account.getPhone())), col_phone);
-//			String col_state = ((ITableLabelProvider) tableViewer
-//					.getLabelProvider()).getColumnText(account, 2);
-//			assertEquals(getValue((String) stateConverter
-//					.convertModelToTarget(account.getState())), col_state);
-//		}
-	}
-
-	public void testScenario05() {
-//		// Show that when the model changes then the UI refreshes to reflect
-//		// this
-//
-//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
-//				tableViewer);
-//		tableViewerDescription.addColumn("lastName");
-//		tableViewerDescription.addColumn("phone", new PhoneConverter());
-//		tableViewerDescription.addColumn("state", new StateConverter());
-//		getDbc().bind(tableViewerDescription,
-//				new Property(catalog, "accounts"), null);
-//
-//		final Account account = catalog.getAccounts()[0];
-//		String lastName = tableViewer.getTable().getItem(0).getText(0);
-//		// Check the firstName in the TableItem is the same as the model
-//		assertEquals(lastName, account.getLastName());
-//		// Now change the model and check again
-//		account.setLastName("Gershwin");
-//		lastName = tableViewer.getTable().getItem(0).getText(0);
-//		assertEquals(lastName, account.getLastName());
-//
-//		// Test the model update on a non UI thread
-//		invokeNonUI(new Runnable() {
-//			public void run() {
-//				account.setLastName("Mozart");
-//			}
-//		});
-//		spinEventLoop(0);
-//		lastName = tableViewer.getTable().getItem(0).getText(0);
-//		assertEquals(lastName, account.getLastName());
-//
-	}
-
-	public void testScenario06() {
-//		// Check that explicit type means that defaulting of converters works
-//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
-//				tableViewer);
-//		tableViewerDescription.addEditableColumn("price");
-//		tableViewerDescription.getColumn(0).setPropertyType(Double.TYPE);
-//		getDbc().bind(tableViewerDescription,
-//				new Property(catalog, "transporations"), null);
-//		Transportation transporation = catalog.getTransporations()[0];
-//		tableViewer.editElement(transporation, 0);
-//		// Set the text property of the cell editor which is now active over the
-//		// "firstName" column
-//		CellEditor[] cellEditors = tableViewer.getCellEditors();
-//		TextCellEditor priceEditor = (TextCellEditor) cellEditors[0];
-//		// Change the firstName and test it goes to the model
-//		enterText((Text) priceEditor.getControl(), "123.45");
-//		// Verify the model is updated
-//		assertEquals(transporation.getPrice(), 123.45, 0);
-
-	}
-
-	public void testScenario07() {
-//		// Verify that even when a column's property type is not set, that it is
-//		// worked out lazily from the target type
-//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
-//				tableViewer);
-//		tableViewerDescription.addEditableColumn("price");
-//		// The column's type is not set to be Double.TYPE. This will be inferred
-//		// once the first Transportation object is set
-//		// into the ObservableCollection
-//		getDbc().bind(tableViewerDescription,
-//				new Property(catalog, "transporations"), null);
-//		Transportation transporation = catalog.getTransporations()[0];
-//		tableViewer.editElement(transporation, 0);
-//		// Set the text property of the cell editor which is now active over the
-//		// "firstName" column
-//		CellEditor[] cellEditors = tableViewer.getCellEditors();
-//		TextCellEditor priceEditor = (TextCellEditor) cellEditors[0];
-//		// Change the firstName and test it goes to the model
-//		enterText((Text) priceEditor.getControl(), "123.45");
-//		// Verify the model is updated
-//		assertEquals(transporation.getPrice(), 123.45, 0);
-//
-	}
-
-	public void testScenario08_00() {
-//		// Verify that binding to a Collection property (rather than an array)
-//		// works when specifying data type
-//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
-//				tableViewer);
-//		tableViewerDescription.addEditableColumn("userId");
-//		tableViewerDescription.addEditableColumn("password");
-//		getDbc().bind(tableViewerDescription,
-//				new Property(catalog, "signons", Signon.class, null), null);
-//		Signon firstSignon = (Signon) catalog.getSignons().get(0);
-//		// Verify the UI matches the model
-//		TableItem firstTableItem = tableViewer.getTable().getItem(0);
-//		assertEquals(firstTableItem.getText(1), firstSignon.getPassword());
-//		// Change the model and ensure the UI refreshes
-//		firstSignon.setPassword("Eclipse123Rocks");
-//		assertEquals("Eclipse123Rocks", firstSignon.getPassword());
-//		assertEquals(firstTableItem.getText(1), firstSignon.getPassword());
-//		// Change the GUI and ensure the model refreshes
-//		tableViewer.editElement(firstSignon, 1);
-//		CellEditor[] cellEditors = tableViewer.getCellEditors();
-//		TextCellEditor passwordEditor = (TextCellEditor) cellEditors[1];
-//		enterText((Text) passwordEditor.getControl(), "Cricket11Players");
-//		assertEquals("Cricket11Players", firstSignon.getPassword());
-//
-	}
-
-	public void testScenario08_01() {
-//		// Verify that binding to a Collection property (rather than an array)
-//		// works without specifying data type
-//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
-//				tableViewer);
-//		tableViewerDescription.addEditableColumn("userId");
-//		tableViewerDescription.addEditableColumn("password");
-//		getDbc().bind(tableViewerDescription, new Property(catalog, "signons"),
-//				null);
-//		Signon firstSignon = (Signon) catalog.getSignons().get(0);
-//		// Verify the UI matches the model
-//		TableItem firstTableItem = tableViewer.getTable().getItem(0);
-//		assertEquals(firstTableItem.getText(1), firstSignon.getPassword());
-//		// Change the model and ensure the UI refreshes
-//		firstSignon.setPassword("Eclipse123Rocks");
-//		assertEquals("Eclipse123Rocks", firstSignon.getPassword());
-//		assertEquals(firstTableItem.getText(1), firstSignon.getPassword());
-//		// Change the GUI and ensure the model refreshes
-//		tableViewer.editElement(firstSignon, 1);
-//		CellEditor[] cellEditors = tableViewer.getCellEditors();
-//		TextCellEditor passwordEditor = (TextCellEditor) cellEditors[1];
-//		enterText((Text) passwordEditor.getControl(), "Cricket11Players");
-//		assertEquals("Cricket11Players", firstSignon.getPassword());
-//
-	}
-
-	public void testScenario09() {
-//		// Verify that nested properties work. Catalog has adventures. Adventure
-//		// has defaultLodging. Loding has name.
-//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
-//				tableViewer);
-//		tableViewerDescription.addColumn("name");
-//		tableViewerDescription.addColumn("defaultLodging.name");
-//		getDbc().bind(tableViewerDescription,
-//				new Property(category, "adventures"), null);
-	}
-	/**
-	 * public void testScenario10(){ // Verify that for TIME_EARLY updating
-	 * occurs on a per key basic for a TextCellEditor // Show that converters
-	 * work for table columns Account[] accounts = catalog.getAccounts();
-	 * Account firstAccount = accounts[0];
-	 * SampleData.getSWTObservableFactory().setUpdateTime(DataBindingContext.TIME_EARLY);
-	 * TableViewerDescription tableViewerDescription = new
-	 * TableViewerDescription(tableViewer);
-	 * tableViewerDescription.addEditableColumn("lastName");
-	 * tableViewerDescription.addColumn("lastName");
-	 * getDbc().bind(tableViewerDescription,new Property(catalog, "accounts"),
-	 * null); // Verify that the first account is shown in the first row with
-	 * the last name correctly
-	 * assertEquals(tableViewer.getTable().getItem(0).getData(),firstAccount);
-	 * assertEquals(tableViewer.getTable().getItem(0).getText(0),firstAccount.getLastName());
-	 * assertEquals(tableViewer.getTable().getItem(0).getText(1),firstAccount.getLastName()); //
-	 * Create a cell editor over the first column
-	 * tableViewer.editElement(firstAccount, 0); // Set the text property of the
-	 * cell editor which is now active over the "firstName" column CellEditor[]
-	 * cellEditors = tableViewer.getCellEditors(); TextCellEditor
-	 * lastNameCellEditor = (TextCellEditor) cellEditors[0];
-	 * ((Text)lastNameCellEditor.getControl()).setText("E"); // Verify that the
-	 * key press goes to the model assertEquals(firstAccount.getLastName(),"E"); }
-	 */
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/PropertyScenarios.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/PropertyScenarios.java
deleted file mode 100644
index 719ceed..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/PropertyScenarios.java
+++ /dev/null
@@ -1,579 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920, 159768
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import java.text.ParseException;
-import java.util.Date;
-import java.util.Locale;
-
-import org.eclipse.core.databinding.AggregateValidationStatus;
-import org.eclipse.core.databinding.Binding;
-import org.eclipse.core.databinding.UpdateValueStrategy;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.conversion.Converter;
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.databinding.conversion.NumberToStringConverter;
-import org.eclipse.core.databinding.conversion.StringToNumberConverter;
-import org.eclipse.core.databinding.observable.ChangeEvent;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.validation.IValidator;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.databinding.conversion.IdentityConverter;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.examples.databinding.model.Account;
-import org.eclipse.jface.examples.databinding.model.Adventure;
-import org.eclipse.jface.examples.databinding.model.Cart;
-import org.eclipse.jface.examples.databinding.model.SampleData;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Spinner;
-import org.eclipse.swt.widgets.Text;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * To run the tests in this class, right-click and select "Run As JUnit Plug-in
- * Test". This will also start an Eclipse instance. To clean up the launch
- * configuration, open up its "Main" tab and select "[No Application] - Headless
- * Mode" as the application to run.
- */
-
-public class PropertyScenarios extends ScenariosTestCase {
-
-    private Adventure adventure;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        // do any setup work here
-        adventure = SampleData.WINTER_HOLIDAY;
-    }
-
-    protected void tearDown() throws Exception {
-        // do any teardown work here
-        super.tearDown();
-    }
-
-    public void testEnterText() {
-        // just to make sure enterText() generates a FocusOut event.
-        Text text = new Text(getComposite(), SWT.BORDER);
-        final boolean[] focusLostHolder = { false };
-        text.addFocusListener(new FocusListener() {
-
-            public void focusGained(FocusEvent e) {
-                // only interested in focus lost events
-            }
-
-            public void focusLost(FocusEvent e) {
-                focusLostHolder[0] = true;
-            }
-        });
-        enterText(text, "hallo");
-        assertTrue(focusLostHolder[0]);
-    }
-
-    public void testScenario01() {
-        Text text = new Text(getComposite(), SWT.BORDER);
-        getDbc().bindValue(SWTObservables.observeText(text, SWT.Modify),
-                BeansObservables.observeValue(adventure, "name"),
-                null, null);
-
-        // getDbc().bind(text, new Property(adventure, "name"), null);
-        // uncomment the following line to see what's happening
-        // spinEventLoop(1);
-        assertEquals(adventure.getName(), text.getText());
-        enterText(text, "foobar");
-        // uncomment the following line to see what's happening
-        // spinEventLoop(1);
-        assertEquals("foobar", adventure.getName());
-        adventure.setName("barfoo");
-        // uncomment the following line to see what's happening
-        // spinEventLoop(1);
-        assertEquals("barfoo", text.getText());
-    }
-
-    public void testScenario02() {
-        // Binding the name property of an Adventure object to the contents of
-        // Text controls, no conversion, no validation. The Text widget editable
-        // is set to false.by the developer (can not change the name)
-        Text text = new Text(getComposite(), SWT.READ_ONLY);
-
-        getDbc().bindValue(SWTObservables.observeText(text, SWT.None),
-                BeansObservables.observeValue(adventure, "name"),
-                null, null);
-        assertEquals(adventure.getName(), text.getText());
-    }
-
-    public void testScenario03() {
-        // Binding of a read-only property of an Adventure object to the
-        // contents of Text controls, no conversion, no validation. Text control
-        // is not editable as a side effect of binding to a read-only property..
-        Cart cart = SampleData.CART;
-        cart.setAdventureDays(42);
-        // bind to the lodgingDays feature, which is read-only and always one
-        // less than the number of adventure days.
-        Text text = new Text(getComposite(), SWT.BORDER);
-
-        System.out.println("Expecting message about not being able to attach a listener");
-        getDbc().bindValue(SWTObservables.observeText(text, SWT.Modify),
-                BeansObservables.observeValue(cart, "lodgingDays"),
-                null, null);
-
-        assertEquals(new Integer(cart.getLodgingDays()).toString(), text.getText());
-    }
-
-    public void testScenario04() {
-        // Binding a nested property of an Adventure object to the content of a
-        // Text control, no conversion, no validation.
-        Text text = new Text(getComposite(), SWT.BORDER);
-        // TODO Scenario needs to be more specific - I'm binding to the default
-        // lodging's description of an adventure. What do we expect to happen
-        // when the default lodging changes? If we expect no change, then this
-        // scenario does not introduce anything new. If we expect the binding to
-        // be to the new default lodging's description, shouldn't we move this
-        // scenario to the master/detail section? I'm assuming the latter for
-        // now.
-
-        IObservableValue defaultLodging =BeansObservables.observeDetailValue(realm, BeansObservables.observeValue(adventure,
-        "defaultLodging"), "description", String.class); 
-
-        getDbc().bindValue(SWTObservables.observeText(text, SWT.Modify), defaultLodging, null, null);
-
-        // test changing the description
-        assertEquals(adventure.getDefaultLodging().getDescription(), text.getText());
-        enterText(text, "foobar");
-        assertEquals("foobar", adventure.getDefaultLodging().getDescription());
-        adventure.getDefaultLodging().setDescription("barfoo");
-        assertEquals(adventure.getDefaultLodging().getDescription(), text.getText());
-
-        // test changing the default lodging
-        adventure.setDefaultLodging(SampleData.CAMP_GROUND);
-        assertEquals(adventure.getDefaultLodging().getDescription(), text.getText());
-        adventure.getDefaultLodging().setDescription("barfo");
-        assertEquals(adventure.getDefaultLodging().getDescription(), text.getText());
-
-        adventure.setDefaultLodging(null);
-        assertEquals("", text.getText());
-
-        adventure.setDefaultLodging(SampleData.FIVE_STAR_HOTEL);
-        assertEquals(adventure.getDefaultLodging().getDescription(), text.getText());
-        adventure.getDefaultLodging().setDescription("barf");
-        assertEquals(adventure.getDefaultLodging().getDescription(), text.getText());
-
-    }
-
-    public void testScenario05() {
-        // Binding the name property of an Adventure object to the contents of
-        // Text controls where conversion occurs � the model data is held all
-        // in
-        // uppercase and displayed in lowercase with the first letter
-        // capitalized.
-        Text text = new Text(getComposite(), SWT.BORDER);
-        adventure.setName("UPPERCASE");
-
-        IConverter converter1 = new IConverter() {
-            public Object getFromType() {
-                return String.class;
-            }
-
-            public Object getToType() {
-                return String.class;
-            }
-
-            public Object convert(Object toObject) {
-                String modelValue = (String) toObject;
-                if (modelValue == null || modelValue.equals("")) {
-                    return modelValue;
-                }
-                String firstChar = modelValue.substring(0, 1);
-                String remainingChars = modelValue.substring(1);
-                return firstChar.toUpperCase() + remainingChars.toLowerCase();
-            }
-        };
-        IConverter converter2 = new IConverter() {
-            public Object getFromType() {
-                return String.class;
-            }
-
-            public Object getToType() {
-                return String.class;
-            }
-
-            public Object convert(Object fromObject) {
-                return ((String) fromObject).toUpperCase();
-            }
-        };
-
-        getDbc().bindValue(SWTObservables.observeText(text, SWT.Modify),
-                BeansObservables.observeValue(adventure, "name"),
-                new UpdateValueStrategy().setConverter(converter2), new UpdateValueStrategy().setConverter(converter1));
-
-        // spinEventLoop(1);
-        assertEquals("Uppercase", text.getText());
-        enterText(text, "lowercase");
-        // spinEventLoop(1);
-        // TODO If we wanted to "canonicalize" the value in the text field, how
-        // could we do that?
-        assertEquals("LOWERCASE", adventure.getName());
-    }
-
-    public void testScenario06() {
-        // Binding the name property of an Adventure object to the contents of
-        // Text controls where validation occurs and the name cannot be longer
-        // than 15 characters and cannot contain spaces
-        Text text = new Text(getComposite(), SWT.BORDER);
-        final String noSpacesMessage = "Name must not contain spaces.";
-        final String max15CharactersMessage = "Maximum length for name is 15 characters.";
-        adventure.setName("ValidValue");
-
-        IValidator validator = new IValidator() {
-            public IStatus validate(Object value) {
-                String stringValue = (String) value;
-                if (stringValue.length() > 15) {
-                    return ValidationStatus.error(max15CharactersMessage);
-                } else if (stringValue.indexOf(' ') != -1) {
-                    return ValidationStatus.cancel(noSpacesMessage);
-                } else {
-                    return Status.OK_STATUS;
-                }
-            }
-        };
-
-//        BindSpec bindSpec = new DefaultBindSpec().setModelToTargetConverter(new IdentityConverter(String.class))
-//                .setTargetToModelConverter(new IdentityConverter(String.class))
-//                .addTargetValidator(BindingEvent.PIPELINE_VALUE_CHANGING, validator);
-
-        Binding binding = getDbc().bindValue(
-				SWTObservables.observeText(text, SWT.Modify),
-				BeansObservables.observeValue(adventure, "name"),
-				new UpdateValueStrategy().setConverter(new IdentityConverter(
-						String.class)).setAfterGetValidator(validator),
-				new UpdateValueStrategy().setConverter(new IdentityConverter(
-						String.class)));
-
-        // no validation message
-        assertTrue(((IStatus)binding.getValidationStatus().getValue()).isOK());
-        enterText(text, "Invalid Value");
-        assertEquals(noSpacesMessage, ((IStatus) binding.getValidationStatus().getValue()).getMessage());
-        assertEquals("ValidValue", adventure.getName());
-        text.setText("InvalidValueBecauseTooLong");
-        assertEquals(max15CharactersMessage,
-                ((IStatus) binding.getValidationStatus().getValue()).getMessage());
-        assertEquals("ValidValue", adventure.getName());
-        enterText(text, "anothervalid");
-        assertTrue(((IStatus)binding.getValidationStatus().getValue()).isOK());
-        assertEquals("anothervalid", adventure.getName());
-    }
-
-    public void testScenario07() {
-        // Binding the price property of an Adventure to a Text control. Price
-        // is a double and Text accepts String so conversion will have to occur.
-        // Validation ensure that the value is positive
-        Text text = new Text(getComposite(), SWT.BORDER);
-        adventure.setPrice(5.0);
-        final String cannotBeNegativeMessage = "Price cannot be negative.";
-        final String mustBeCurrencyMessage = "Price must be a currency.";
-
-        IValidator validator = new IValidator() {
-            public IStatus validate(Object value) {
-                String stringValue = (String) value;
-                try {
-                    double doubleValue = new Double(stringValue).doubleValue();
-                    if (doubleValue < 0.0) {
-                        return ValidationStatus.error(cannotBeNegativeMessage);
-                    }
-                    return Status.OK_STATUS;
-                } catch (NumberFormatException ex) {
-                    return ValidationStatus.error(mustBeCurrencyMessage);
-                }
-            }
-        };
-        
-        //Create a number formatter that will display one decimal position.
-		NumberFormat numberFormat = NumberFormat.getInstance();
-		numberFormat.setMinimumFractionDigits(1);
-
-		IConverter targetToModelConverter = StringToNumberConverter.toDouble(
-				numberFormat, true);
-		IConverter modelToTargetConverter = NumberToStringConverter.fromDouble(
-				numberFormat, true);
-
-		getDbc().bindValue(
-				SWTObservables.observeText(text, SWT.Modify),
-				BeansObservables.observeValue(adventure, "price"),
-				new UpdateValueStrategy().setAfterGetValidator(validator)
-						.setConverter(targetToModelConverter),
-				new UpdateValueStrategy().setConverter(modelToTargetConverter));
-
-		String expected = numberFormat.format(adventure.getPrice());
-        assertEquals(expected, text.getText());
-        assertTrue(AggregateValidationStatus.getStatusMaxSeverity(getDbc().getBindings()).isOK());
-        
-        String toEnter = numberFormat.format(0.65);
-        enterText(text, toEnter);
-        assertTrue(AggregateValidationStatus.getStatusMaxSeverity(getDbc().getBindings()).isOK());
-        assertEquals(0.65, adventure.getPrice(), 0.0001);
-        
-        adventure.setPrice(42.24);
-        expected = numberFormat.format(adventure.getPrice());
-        assertEquals(expected, text.getText());
-        assertTrue(AggregateValidationStatus.getStatusMaxSeverity(getDbc().getBindings()).isOK());
-        
-        enterText(text, "jygt");
-        assertEquals(mustBeCurrencyMessage, AggregateValidationStatus.getStatusMaxSeverity(getDbc().getBindings()).getMessage());
-        
-        toEnter = numberFormat.format(-23.9);
-        enterText(text, toEnter);
-        assertEquals(cannotBeNegativeMessage, AggregateValidationStatus.getStatusMaxSeverity(getDbc().getBindings()).getMessage());
-        assertEquals(42.24, adventure.getPrice(), 0.0001);
-        
-        adventure.setPrice(0.0);
-        assertTrue(AggregateValidationStatus.getStatusMaxSeverity(getDbc().getBindings()).isOK());
-    }
-
-    public void testScenario08() {
-        // Binding the price property of an Adventure to a Text control but with
-        // custom conversion � the double will be validated to only have two
-        // decimal places and displayed with a leading currency symbol, and can
-        // be entered with or without the currency symbol.
-        Text text = new Text(getComposite(), SWT.BORDER);
-        adventure.setPrice(5.0);
-        final String cannotBeNegativeMessage = "Price cannot be negative.";
-        final String mustBeCurrencyMessage = "Price must be a currency.";
-        final NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(Locale.CANADA);
-
-        IConverter toCurrency = new Converter(double.class, String.class) {
-            public Object convert(Object toObject) {
-                return currencyFormat.format(((Double) toObject).doubleValue());
-            }
-        };
-
-        IConverter toDouble = new Converter(String.class, double.class) {
-            public Object convert(Object fromObject) {
-                try {
-                    return new Double(currencyFormat.parse((String) fromObject).doubleValue());
-                } catch (ParseException e) {
-                    // TODO throw something like
-                    // IllegalConversionException?
-                    return new Double(0);
-                }
-            }
-        };
-
-        IValidator validator = new IValidator() {
-            public IStatus validate(Object value) {
-                String stringValue = (String) value;
-                try {
-                    double doubleValue = currencyFormat.parse(stringValue).doubleValue();
-                    if (doubleValue < 0.0) {
-                        return ValidationStatus.error(cannotBeNegativeMessage);
-                    }
-                    return Status.OK_STATUS;
-                } catch (ParseException e) {
-                    return ValidationStatus.error(mustBeCurrencyMessage);
-                }
-            }
-        };
-
-        getDbc().bindValue(SWTObservables.observeText(text, SWT.Modify),
-                BeansObservables.observeValue(adventure, "price"),
-new UpdateValueStrategy().setConverter(toDouble).setAfterGetValidator(validator),new UpdateValueStrategy().setConverter(toCurrency));
-
-        String expected = currencyFormat.format(5);
-        assertEquals(expected, text.getText());
-        assertTrue(AggregateValidationStatus.getStatusMaxSeverity(getDbc().getBindings()).isOK());
-        
-        String toEnter = currencyFormat.format(0.65);
-        enterText(text, toEnter);
-        assertTrue(AggregateValidationStatus.getStatusMaxSeverity(getDbc().getBindings()).isOK());
-        assertEquals(0.65, adventure.getPrice(), 0.0001);
-        
-        adventure.setPrice(42.24);
-        expected = currencyFormat.format(adventure.getPrice());
-        assertEquals(expected, text.getText());
-        
-        assertTrue(AggregateValidationStatus.getStatusMaxSeverity(getDbc().getBindings()).isOK());
-        enterText(text, "jygt");
-        assertEquals(mustBeCurrencyMessage, AggregateValidationStatus.getStatusMaxSeverity(getDbc().getBindings()).getMessage());
-        
-        toEnter = currencyFormat.format(-23.9);
-        enterText(text, toEnter);
-        
-        assertEquals(cannotBeNegativeMessage, AggregateValidationStatus.getStatusMaxSeverity(getDbc().getBindings()).getMessage());
-        assertEquals(42.24, adventure.getPrice(), 0.0001);
-        adventure.setPrice(0.0);
-        assertTrue(AggregateValidationStatus.getStatusMaxSeverity(getDbc().getBindings()).isOK());
-    }
-
-    public void testScenario09() {
-        // Binding a boolean property to a CheckBox. Adventure will have a
-        // Boolean property �petsAllowed�
-        Button checkbox = new Button(getComposite(), SWT.CHECK);
-        // checkbox.setText("Pets allowed");
-        // checkbox.setLayoutData(new GridData(SWT.LEFT,SWT.TOP, false,false));
-        adventure.setPetsAllowed(true);
-
-        getDbc().bindValue(SWTObservables.observeSelection(checkbox),
-                BeansObservables.observeValue(adventure, "petsAllowed"),
-                null, null);
-
-        assertEquals(true, checkbox.getSelection());
-        setButtonSelectionWithEvents(checkbox, false);
-        assertEquals(false, adventure.isPetsAllowed());
-        adventure.setPetsAllowed(true);
-        assertEquals(true, checkbox.getSelection());
-    }
-
-    public void testScenario10() {
-        // Binding a Transportation departure time to a Text control that
-        // formats and validates the time to and from a String. There are
-        // property bindings that bind elements of the GUI to elements to GUI
-        // and also elements of the domain to elements of the domain
-        // TODO fail("not implemented");
-    }
-
-    public void testScenario11() {
-        // Binding the max value of a spinner to another spinner.
-        Spinner spinner1 = new Spinner(getComposite(), SWT.NONE);
-        spinner1.setSelection(10);
-        spinner1.setMinimum(1);
-        spinner1.setMaximum(100);
-        Spinner spinner2 = new Spinner(getComposite(), SWT.NONE);
-        spinner2.setMaximum(1);
-
-        getDbc().bindValue(SWTObservables.observeSelection(spinner1), SWTObservables.observeMax(spinner2), null, null);
-
-        assertEquals(1, spinner1.getSelection());
-        spinner1.setSelection(10);
-        spinner1.notifyListeners(SWT.Modify, new Event());
-        assertEquals(10, spinner2.getMaximum());
-    }
-
-    public void testScenario12() {
-        // Binding the enabled state of several Text controls to a check box.
-        // There will be two check boxes, so as each is enabled/disabled the
-        // other one follows as do the states of the Text controls.
-        Button checkbox1 = new Button(getComposite(), SWT.CHECK);
-        checkbox1.setSelection(false);
-        Button checkbox2 = new Button(getComposite(), SWT.CHECK);
-        checkbox2.setSelection(false);
-        Text text1 = new Text(getComposite(), SWT.NONE);
-        Text text2 = new Text(getComposite(), SWT.NONE);
-
-        IObservableValue checkbox1Selected = SWTObservables.observeSelection(checkbox1);
-        IObservableValue checkbox2Selected = SWTObservables.observeSelection(checkbox2);
-
-        // bind the two checkboxes so that if one is checked, the other is not
-        // and vice versa.
-        Converter negatingConverter = new Converter(boolean.class, boolean.class) {
-            private Boolean negated(Boolean booleanObject) {
-                return new Boolean(!booleanObject.booleanValue());
-            }
-
-            public Object convert(Object targetObject) {
-                return negated((Boolean) targetObject);
-            }
-        };
-
-        getDbc().bindValue(checkbox1Selected,
-                checkbox2Selected,new UpdateValueStrategy().setConverter(negatingConverter),
-                new UpdateValueStrategy().setConverter(negatingConverter));
-        
-        // bind the enabled state of the two text widgets to one of the
-        // checkboxes each.
-        
-        getDbc().bindValue(SWTObservables.observeEnabled(text1), checkbox1Selected, null, null);
-        getDbc().bindValue(SWTObservables.observeEnabled(text2), checkbox2Selected, null, null);
-                
-        assertEquals(true, text1.getEnabled());
-        assertEquals(false, text2.getEnabled());
-        assertEquals(true, checkbox1.getSelection());
-        setButtonSelectionWithEvents(checkbox1, false);
-        assertEquals(false, text1.getEnabled());
-        assertEquals(true, text2.getEnabled());
-        assertEquals(true, checkbox2.getSelection());
-        setButtonSelectionWithEvents(checkbox2, false);
-        assertEquals(true, text1.getEnabled());
-        assertEquals(false, text2.getEnabled());
-        assertEquals(true, checkbox1.getSelection());
-    }
-
-    public void testScenario13() {
-        Text text = new Text(getComposite(), SWT.BORDER);
-        
-        getDbc().bindValue(SWTObservables.observeText(text, SWT.FocusOut), BeansObservables.observeValue(adventure, "name"), null, null);
-
-        // uncomment the following line to see what's happening
-        // happening
-        // spinEventLoop(1);
-        String adventureName = adventure.getName();
-        assertEquals(adventureName, text.getText());
-        enterText(text, "foobar");
-        // uncomment the following line to see what's happening
-        // spinEventLoop(1);
-        assertEquals("foobar", adventure.getName());
-        adventure.setName("barfoo");
-        // uncomment the following line to see what's happening
-        // spinEventLoop(1);
-        assertEquals("barfoo", text.getText());
-    }
-
-    public void testScenario14() {
-        Text t1 = new Text(getComposite(), SWT.BORDER);
-        Text t2 = new Text(getComposite(), SWT.BORDER);
-  
-        getDbc().bindValue(SWTObservables.observeText(t1, SWT.Modify), BeansObservables.observeValue(adventure, "name"), null, null);
-        getDbc().bindValue(SWTObservables.observeText(t2, SWT.Modify), BeansObservables.observeValue(adventure, "name"), null, null);
-        
-        final int[] counter = { 0 };
-        
-        IObservableValue uv = BeansObservables.observeValue(adventure, "name");
-        
-        uv.addChangeListener(new IChangeListener() {
-            public void handleChange(ChangeEvent event) {
-                // Count how many times adventure has changed
-                counter[0]++;
-            }
-        });
-
-        String name = adventure.getName() + "Foo";
-        enterText(t1, name);
-        assertEquals(name, adventure.getName());
-        assertEquals(name, t2.getText());
-        assertTrue(counter[0] == 1);
-
-        name = name + "Bar";
-        uv.setValue(name);
-        assertEquals(t1.getText(), adventure.getName());
-        assertEquals(2, counter[0]);
-
-    }
-
-    public void testScenario15() {
-        Text text = new Text(getComposite(), SWT.NONE);
-        Account account = new Account();
-        account.setExpiryDate(new Date());
-        
-        Binding b = getDbc().bindValue(SWTObservables.observeText(text, SWT.Modify), BeansObservables.observeValue(account, "expiryDate"), null, null);
-        Text errorText = new Text(getComposite(), SWT.NONE);
-        
-        getDbc().bindValue(SWTObservables.observeText(errorText, SWT.Modify), b.getValidationStatus(), new UpdateValueStrategy(false, UpdateValueStrategy.POLICY_NEVER), null);
-        assertTrue(((IStatus)b.getValidationStatus().getValue()).isOK());
-        enterText(text, "foo");
-        assertFalse(((IStatus)b.getValidationStatus().getValue()).isOK());
-    }
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ScenariosTestCase.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ScenariosTestCase.java
deleted file mode 100644
index b55c59b..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/ScenariosTestCase.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.examples.databinding.model.SampleData;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Abstract base class of the JFace binding scenario test classes.
- */
-abstract public class ScenariosTestCase extends TestCase {
-
-	private Composite composite;
-	private DataBindingContext dbc;
-	protected Display display;
-	private boolean disposeDisplay = false;
-	protected Shell shell;
-	protected Text dummyText;
-	protected Realm realm;
-
-	protected Composite getComposite() {
-		return composite;
-	}
-
-	protected DataBindingContext getDbc() {
-		return dbc;
-	}
-
-	public Shell getShell() {
-		if (shell != null) {
-			return shell;
-		}
-		Shell result = BindingScenariosTestSuite.getShell();
-		if (result == null) {
-			display = Display.getDefault();
-			if (Display.getDefault() == null) {
-				display = new Display();
-				disposeDisplay = true;
-			}
-			shell = new Shell(display, SWT.SHELL_TRIM);
-			shell.setLayout(new FillLayout());
-			result = shell;
-		}
-		result.setText(getName()); // In the case that the shell() becomes
-		// visible.
-		return result;
-	}
-
-	protected void spinEventLoop(int secondsToWaitWithNoEvents) {
-		if (!composite.isVisible() && secondsToWaitWithNoEvents > 0) {
-			composite.getShell().open();
-		}
-		while (composite.getDisplay().readAndDispatch()) {
-			// do nothing, just process events
-		}
-		try {
-			Thread.sleep(secondsToWaitWithNoEvents * 1000);
-		} catch (InterruptedException e) {
-			Thread.currentThread().interrupt();
-		}
-	}
-
-	protected void interact() {
-		if (!getShell().isVisible()) {
-			getShell().open();
-		}
-		while (!getShell().isDisposed()) {
-			if (!getShell().getDisplay().readAndDispatch()) {
-				getShell().getDisplay().sleep();
-			}
-		}
-	}
-
-	protected void setButtonSelectionWithEvents(Button button, boolean value) {
-		if (button.getSelection() == value) {
-			return;
-		}
-		button.setSelection(value);
-		pushButtonWithEvents(button);
-	}
-
-	protected void pushButtonWithEvents(Button button) {
-		button.notifyListeners(SWT.Selection, null);
-	}
-
-	protected void setUp() throws Exception {
-		realm = SWTObservables.getRealm(Display.getDefault());
-		RealmTester.setDefault(realm);
-
-		composite = new Composite(getShell(), SWT.NONE);
-		composite.setLayout(new FillLayout());
-		SampleData.initializeData(); // test may manipulate the data... let
-		// all start from fresh
-		dbc = new DataBindingContext();
-		dummyText = new Text(getComposite(), SWT.NONE);
-		dummyText.setText("dummy");
-	}
-
-	protected void tearDown() throws Exception {
-		realm = null;
-		getShell().setVisible(false); // same Shell may be reUsed across tests
-		composite.dispose();
-		composite = null;
-		if (shell != null) {
-			shell.close();
-			shell.dispose();
-		} else
-			dbc.dispose();
-		if (display != null && disposeDisplay) {
-			display.dispose();
-		}
-	}
-
-	protected void enterText(Text text, String string) {
-		text.notifyListeners(SWT.FocusIn, null);
-		text.setText(string);
-		text.notifyListeners(SWT.FocusOut, null);
-	}
-
-	protected void assertArrayEquals(Object[] expected, Object[] actual) {
-		assertEquals(Arrays.asList(expected), Arrays.asList(actual));
-	}
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/SpinnerControlScenario.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/SpinnerControlScenario.java
deleted file mode 100644
index b1d2ad2..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/SpinnerControlScenario.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.examples.databinding.model.Adventure;
-import org.eclipse.jface.examples.databinding.model.SampleData;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Spinner;
-
-/**
- * To run the tests in this class, right-click and select "Run As JUnit Plug-in
- * Test". This will also start an Eclipse instance. To clean up the launch
- * configuration, open up its "Main" tab and select "[No Application] - Headless
- * Mode" as the application to run.
- */
-
-public class SpinnerControlScenario extends ScenariosTestCase {
-
-    private Adventure adventure;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        // do any setup work here
-        adventure = SampleData.WINTER_HOLIDAY;
-    }
-
-    protected void tearDown() throws Exception {
-        // do any teardown work here
-        super.tearDown();
-    }
-
-    public void testScenario01() {
-        // Bind the adventure "maxNumberOfPeople" property to a spinner
-        // Change the UI and verify the model changes
-        // Change the model and verify the UI changes
-        Spinner spinner = new Spinner(getComposite(), SWT.BORDER);
-        getDbc().bindValue(SWTObservables.observeSelection(spinner),
-                BeansObservables.observeValue(adventure, "maxNumberOfPeople"),
-                null, null);
-
-        assertEquals(adventure.getMaxNumberOfPeople(), spinner.getSelection());
-        // Verify the model is updated when the GUI is changed
-        spinner.setSelection(5);
-        assertEquals(5, adventure.getMaxNumberOfPeople());
-        // Verify the GUI is updated when the model changes
-        adventure.setMaxNumberOfPeople(7);
-        assertEquals(7, spinner.getSelection());
-        adventure.setMaxNumberOfPeople(11);
-        spinEventLoop(0);
-        assertEquals(11, spinner.getSelection());
-    }
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/TableScenarios.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/TableScenarios.java
deleted file mode 100644
index 70c38ac..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/TableScenarios.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *     Brad Reynolds - bug 160000
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.examples.databinding.model.Account;
-import org.eclipse.jface.examples.databinding.model.Catalog;
-import org.eclipse.jface.examples.databinding.model.Category;
-import org.eclipse.jface.examples.databinding.model.SampleData;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * To run the tests in this class, right-click and select "Run As JUnit Plug-in
- * Test". This will also start an Eclipse instance. To clean up the launch
- * configuration, open up its "Main" tab and select "[No Application] - Headless
- * Mode" as the application to run.
- */
-
-public class TableScenarios extends ScenariosTestCase {
-
-	private TableViewer tableViewer;
-
-	private Catalog catalog;
-
-	Category category;
-
-	private TableColumn firstNameColumn;
-
-	private TableColumn lastNameColumn;
-
-	private TableColumn stateColumn;
-
-	Image[] images;
-
-	private TableColumn fancyColumn;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		getComposite().setLayout(new FillLayout());
-		tableViewer = new TableViewer(getComposite());
-		tableViewer.getTable().setLinesVisible(true);
-		tableViewer.getTable().setHeaderVisible(true);
-		firstNameColumn = new TableColumn(tableViewer.getTable(), SWT.NONE);
-		firstNameColumn.setWidth(50);
-		lastNameColumn = new TableColumn(tableViewer.getTable(), SWT.NONE);
-		lastNameColumn.setWidth(50);
-		stateColumn = new TableColumn(tableViewer.getTable(), SWT.NONE);
-		stateColumn.setWidth(50);
-		fancyColumn = new TableColumn(tableViewer.getTable(), SWT.NONE);
-		fancyColumn.setWidth(250);
-
-		catalog = SampleData.CATALOG_2005; // Lodging source
-		category = SampleData.WINTER_CATEGORY;
-
-		images = new Image[] {
-				getShell().getDisplay().getSystemImage(SWT.ICON_ERROR),
-				getShell().getDisplay().getSystemImage(SWT.ICON_WARNING),
-				getShell().getDisplay().getSystemImage(SWT.ICON_INFORMATION), };
-	}
-
-	protected void tearDown() throws Exception {
-		// do any teardown work here
-		super.tearDown();
-		tableViewer.getTable().dispose();
-		tableViewer = null;
-		firstNameColumn = null;
-		lastNameColumn = null;
-		stateColumn = null;
-	}
-
-	public void testScenario01() {
-		// Show that a TableViewer with three columns renders the accounts
-		Account[] accounts = catalog.getAccounts();
-
-		IObservableList list = new WritableList(new ArrayList(), Account.class);
-		list.addAll(Arrays.asList(accounts));
-
-		ObservableListContentProvider contentProvider = new ObservableListContentProvider();
-		IObservableMap[] attributeMaps = BeansObservables.observeMaps(
-				contentProvider.getKnownElements(), Account.class,
-				new String[] { "firstName", "lastName", "state" });
-
-		tableViewer.setContentProvider(contentProvider);
-		tableViewer.setLabelProvider(new ObservableMapLabelProvider(
-				attributeMaps));
-		tableViewer.setInput(list);
-
-		Table table = tableViewer.getTable();
-
-		// Verify the data in the table columns matches the accounts
-		for (int i = 0; i < accounts.length; i++) {
-			Account account = catalog.getAccounts()[i];
-			TableItem item = table.getItem(i);
-
-			assertEquals(account.getFirstName(), item.getText(0));
-			assertEquals(account.getLastName(), item.getText(1));
-			assertEquals(account.getState(), item.getText(2));
-		}
-	}
-
-	public void testScenario02() throws SecurityException,
-			IllegalArgumentException {
-		// Show that a TableViewer with three columns can be used to update
-		// columns
-		// Account[] accounts = catalog.getAccounts();
-		//
-		// TableModelDescription tableModelDescription = new
-		// TableModelDescription(new Property(catalog, "accounts"), new
-		// String[]{"firstName","lastName","state"});
-		// // tableViewerDescription.addEditableColumn("firstName");
-		// // tableViewerDescription.addEditableColumn("lastName", null, null,
-		// new PhoneConverter());
-		// // tableViewerDescription.addEditableColumn("state", null, null, new
-		// StateConverter());
-		// getDbc().bind(tableViewer,
-		// tableModelDescription, null);
-		//
-		// Account account = accounts[0];
-		// // Select the first item in the table
-		// tableViewer.editElement(account, 0);
-		// // Set the text property of the cell editor which is now active over
-		// the "firstName" column
-		// CellEditor[] cellEditors = tableViewer.getCellEditors();
-		// TextCellEditor firstNameEditor = (TextCellEditor) cellEditors[0];
-		// // Change the firstName and test it goes to the model
-		// enterText((Text) firstNameEditor.getControl(), "Bill");
-		// // Check whether the model has changed
-		// assertEquals("Bill",account.getFirstName());
-	}
-
-	public void testScenario04() {
-		// // Show that when an item is added to a collection the table gets an
-		// extra item
-		// Account[] accounts = catalog.getAccounts();
-		//		
-		// TableViewerDescription tableViewerDescription = new
-		// TableViewerDescription(
-		// tableViewer);
-		// tableViewerDescription.addColumn("firstName");
-		// tableViewerDescription.addColumn("lastName");
-		// tableViewerDescription.addColumn("state");
-		// tableViewerDescription.addColumn(null,new IConverter(){
-		//			
-		// public Class getModelType() {
-		// return Account.class;
-		// }
-		//			
-		// public Class getTargetType() {
-		// return ViewerLabel.class;
-		// }
-		//			
-		// public Object convertTargetToModel(Object targetObject) {
-		// return null;
-		// }
-		//			
-		// public Object convertModelToTarget(Object modelObject) {
-		// Account account = (Account) modelObject;
-		// return new ViewerLabel(account.toString(), images[new
-		// Random().nextInt(images.length)]);
-		// }});
-		// getDbc().bind(tableViewerDescription,
-		// new Property(catalog, "accounts"), null);
-		//
-		// //interact();
-		//		
-		// // Verify the number of accounts matches the number of items in the
-		// table
-		// assertEquals(tableViewer.getTable().getItemCount(),accounts.length);
-		// // Add a new account and verify that the number of items in the table
-		// increases
-		// Account newAccount = new Account();
-		// newAccount.setFirstName("Finbar");
-		// newAccount.setLastName("McGoo");
-		// newAccount.setLastName("NC");
-		// catalog.addAccount(newAccount);
-		// // The number of items should have gone up by one
-		// assertEquals(tableViewer.getTable().getItemCount(),accounts.length +
-		// 1);
-		// // The number of items should still match the number of accounts
-		// (i.e. test the model)
-		// assertEquals(tableViewer.getTable().getItemCount(),catalog.getAccounts().length);
-		// // Remove the account that was just added
-		// catalog.removeAccount(newAccount);
-		// // The number of items should match the original
-		// assertEquals(tableViewer.getTable().getItemCount(),accounts.length);
-		// // The number of items should still match the number of accounts
-		// (i.e. test the model is reset)
-		// assertEquals(tableViewer.getTable().getItemCount(),catalog.getAccounts().length);
-		//		
-		// // Test adding and removing to the model on a non UI thread
-		// int numberOfAccounts = catalog.getAccounts().length;
-		// final Account barney = new Account();
-		// barney.setFirstName("Barney");
-		// barney.setLastName("Smith");
-		// barney.setLastName("CA");
-		// invokeNonUI(new Runnable(){
-		// public void run(){
-		// catalog.addAccount(barney);
-		// }
-		// });
-		// spinEventLoop(0);
-		// // The number of items should have gone up by one
-		// assertEquals(tableViewer.getTable().getItemCount(),numberOfAccounts +
-		// 1);
-		//		
-		// invokeNonUI(new Runnable(){
-		// public void run(){
-		// catalog.removeAccount(barney);
-		// }
-		// });
-		// spinEventLoop(0);
-		// // The number of items should have reverted to the original number
-		// before barney was added and removed
-		// assertEquals(tableViewer.getTable().getItemCount(),numberOfAccounts);
-		//		
-	}
-
-	public void testScenario03() {
-		// // Show that converters work for table columns
-		// Account[] accounts = catalog.getAccounts();
-		//
-		// TableViewerDescription tableViewerDescription = new
-		// TableViewerDescription(
-		// tableViewer);
-		// tableViewerDescription.addEditableColumn("lastName");
-		// tableViewerDescription.addEditableColumn("phone", null, null ,
-		// new PhoneConverter());
-		// tableViewerDescription.addEditableColumn("state", null, null ,
-		// new StateConverter());
-		// getDbc().bind(tableViewerDescription,
-		// new Property(catalog, "accounts"), null);
-		//
-		// // Verify that the data in the the table columns matches the expected
-		// // What we are looking for is that the phone numbers are converterted
-		// to
-		// // nnn-nnn-nnnn and that
-		// // the state letters are converted to state names
-		// // Verify the data in the table columns matches the accounts
-		// PhoneConverter phoneConverter = new PhoneConverter();
-		// StateConverter stateConverter = new StateConverter();
-		// for (int i = 0; i < accounts.length; i++) {
-		// Account account = catalog.getAccounts()[i];
-		// // Check the phone number
-		// String col_phone = ((ITableLabelProvider) tableViewer
-		// .getLabelProvider()).getColumnText(account, 1);
-		// assertEquals(getValue((String)phoneConverter
-		// .convertModelToTarget(account.getPhone())), col_phone);
-		// String col_state = ((ITableLabelProvider) tableViewer
-		// .getLabelProvider()).getColumnText(account, 2);
-		// assertEquals(getValue((String)stateConverter
-		// .convertModelToTarget(account.getState())), col_state);
-		// }
-	}
-
-	public void testScenario05() {
-		// // Show that when the model changes then the UI refreshes to reflect
-		// this
-		//
-		// TableViewerDescription tableViewerDescription = new
-		// TableViewerDescription(
-		// tableViewer);
-		// tableViewerDescription.addColumn("lastName");
-		// tableViewerDescription.addColumn("phone",
-		// new PhoneConverter());
-		// tableViewerDescription.addColumn("state",
-		// new StateConverter());
-		// getDbc().bind(tableViewerDescription,
-		// new Property(catalog, "accounts"), null);
-		//		
-		// final Account account = catalog.getAccounts()[0];
-		// String lastName = tableViewer.getTable().getItem(0).getText(0);
-		// // Check the firstName in the TableItem is the same as the model
-		// assertEquals(lastName,account.getLastName());
-		// // Now change the model and check again
-		// account.setLastName("Gershwin");
-		// lastName = tableViewer.getTable().getItem(0).getText(0);
-		// assertEquals(lastName,account.getLastName());
-		//		
-		// // Test the model update on a non UI thread
-		// invokeNonUI(new Runnable(){
-		// public void run(){
-		// account.setLastName("Mozart");
-		// }
-		// });
-		// spinEventLoop(0);
-		// lastName = tableViewer.getTable().getItem(0).getText(0);
-		// assertEquals(lastName,account.getLastName());
-		//		
-	}
-
-	public void testScenario06() {
-		// // Check that explicit type means that defaulting of converters works
-		// TableViewerDescription tableViewerDescription = new
-		// TableViewerDescription(
-		// tableViewer);
-		// tableViewerDescription.addEditableColumn("price");
-		// tableViewerDescription.getColumn(0).setPropertyType(Double.TYPE);
-		// getDbc().bind(tableViewerDescription,
-		// new Property(catalog, "transporations"), null);
-		// Transportation transporation = catalog.getTransporations()[0];
-		// tableViewer.editElement(transporation, 0);
-		// // Set the text property of the cell editor which is now active over
-		// the "firstName" column
-		// CellEditor[] cellEditors = tableViewer.getCellEditors();
-		// TextCellEditor priceEditor = (TextCellEditor) cellEditors[0];
-		// // Change the firstName and test it goes to the model
-		// enterText((Text) priceEditor.getControl(), "123.45");
-		// // Verify the model is updated
-		// assertEquals(transporation.getPrice(),123.45,0);
-
-	}
-
-	public void testScenario07() {
-		// // Verify that even when a column's property type is not set, that it
-		// is worked out lazily from the target type
-		// TableViewerDescription tableViewerDescription = new
-		// TableViewerDescription(
-		// tableViewer);
-		// tableViewerDescription.addEditableColumn("price");
-		// // The column's type is not set to be Double.TYPE. This will be
-		// inferred once the first Transportation object is set
-		// // into the ObservableCollection
-		// getDbc().bind(tableViewerDescription,
-		// new Property(catalog, "transporations"), null);
-		// Transportation transporation = catalog.getTransporations()[0];
-		// tableViewer.editElement(transporation, 0);
-		// // Set the text property of the cell editor which is now active over
-		// the "firstName" column
-		// CellEditor[] cellEditors = tableViewer.getCellEditors();
-		// TextCellEditor priceEditor = (TextCellEditor) cellEditors[0];
-		// // Change the firstName and test it goes to the model
-		// enterText((Text) priceEditor.getControl(), "123.45");
-		// // Verify the model is updated
-		// assertEquals(transporation.getPrice(),123.45,0);
-		//		
-	}
-
-	public void testScenario08_00() {
-		// // Verify that binding to a Collection property (rather than an
-		// array) works when specifying data type
-		// TableViewerDescription tableViewerDescription = new
-		// TableViewerDescription(
-		// tableViewer);
-		// tableViewerDescription.addEditableColumn("userId");
-		// tableViewerDescription.addEditableColumn("password");
-		// getDbc().bind(tableViewerDescription,
-		// new Property(catalog, "signons", Signon.class, null), null);
-		// Signon firstSignon = (Signon) catalog.getSignons().get(0);
-		// // Verify the UI matches the model
-		// TableItem firstTableItem = tableViewer.getTable().getItem(0);
-		// assertEquals(firstTableItem.getText(1),firstSignon.getPassword());
-		// // Change the model and ensure the UI refreshes
-		// firstSignon.setPassword("Eclipse123Rocks");
-		// assertEquals("Eclipse123Rocks",firstSignon.getPassword());
-		// assertEquals(firstTableItem.getText(1),firstSignon.getPassword());
-		// // Change the GUI and ensure the model refreshes
-		// tableViewer.editElement(firstSignon, 1);
-		// CellEditor[] cellEditors = tableViewer.getCellEditors();
-		// TextCellEditor passwordEditor = (TextCellEditor) cellEditors[1];
-		// enterText((Text) passwordEditor.getControl(), "Cricket11Players");
-		// assertEquals("Cricket11Players",firstSignon.getPassword());
-		//		
-	}
-
-	public void testScenario08_01() {
-		// // Verify that binding to a Collection property (rather than an
-		// array) works without specifying data type
-		// TableViewerDescription tableViewerDescription = new
-		// TableViewerDescription(
-		// tableViewer);
-		// tableViewerDescription.addEditableColumn("userId");
-		// tableViewerDescription.addEditableColumn("password");
-		// getDbc().bind(tableViewerDescription,
-		// new Property(catalog, "signons"), null);
-		// Signon firstSignon = (Signon) catalog.getSignons().get(0);
-		// // Verify the UI matches the model
-		// TableItem firstTableItem = tableViewer.getTable().getItem(0);
-		// assertEquals(firstTableItem.getText(1),firstSignon.getPassword());
-		// // Change the model and ensure the UI refreshes
-		// firstSignon.setPassword("Eclipse123Rocks");
-		// assertEquals("Eclipse123Rocks",firstSignon.getPassword());
-		// assertEquals(firstTableItem.getText(1),firstSignon.getPassword());
-		// // Change the GUI and ensure the model refreshes
-		// tableViewer.editElement(firstSignon, 1);
-		// CellEditor[] cellEditors = tableViewer.getCellEditors();
-		// TextCellEditor passwordEditor = (TextCellEditor) cellEditors[1];
-		// enterText((Text) passwordEditor.getControl(), "Cricket11Players");
-		// assertEquals("Cricket11Players",firstSignon.getPassword());
-		//		
-	}
-
-	public void testScenario09() {
-		// // Verify that nested properties work. Catalog has adventures.
-		// Adventure has defaultLodging. Loding has name.
-		// TableViewerDescription tableViewerDescription = new
-		// TableViewerDescription(tableViewer);
-		// tableViewerDescription.addColumn("name");
-		// tableViewerDescription.addColumn("defaultLodging.name");
-		// getDbc().bind(tableViewerDescription,new Property(category,
-		// "adventures"),null);
-		//		
-	}
-	/**
-	 * public void testScenario10(){ // Verify that for TIME_EARLY updating
-	 * occurs on a per key basic for a TextCellEditor // Show that converters
-	 * work for table columns Account[] accounts = catalog.getAccounts();
-	 * Account firstAccount = accounts[0];
-	 * SampleData.getSWTObservableFactory().setUpdateTime(DataBindingContext.TIME_EARLY);
-	 * TableViewerDescription tableViewerDescription = new
-	 * TableViewerDescription(tableViewer);
-	 * tableViewerDescription.addEditableColumn("lastName");
-	 * tableViewerDescription.addColumn("lastName");
-	 * getDbc().bind(tableViewerDescription,new Property(catalog, "accounts"),
-	 * null); // Verify that the first account is shown in the first row with
-	 * the last name correctly
-	 * assertEquals(tableViewer.getTable().getItem(0).getData(),firstAccount);
-	 * assertEquals(tableViewer.getTable().getItem(0).getText(0),firstAccount.getLastName());
-	 * assertEquals(tableViewer.getTable().getItem(0).getText(1),firstAccount.getLastName()); //
-	 * Create a cell editor over the first column
-	 * tableViewer.editElement(firstAccount, 0); // Set the text property of the
-	 * cell editor which is now active over the "firstName" column CellEditor[]
-	 * cellEditors = tableViewer.getCellEditors(); TextCellEditor
-	 * lastNameCellEditor = (TextCellEditor) cellEditors[0];
-	 * ((Text)lastNameCellEditor.getControl()).setText("E"); // Verify that the
-	 * key press goes to the model assertEquals(firstAccount.getLastName(),"E"); }
-	 */
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/TextControlScenario.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/TextControlScenario.java
deleted file mode 100644
index 500b09b..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/scenarios/TextControlScenario.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-package org.eclipse.jface.tests.databinding.scenarios;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.examples.databinding.model.Account;
-import org.eclipse.jface.examples.databinding.model.Adventure;
-import org.eclipse.jface.examples.databinding.model.SampleData;
-import org.eclipse.jface.examples.databinding.model.Transportation;
-import org.eclipse.jface.tests.databinding.BindingTestSuite;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-import com.ibm.icu.text.NumberFormat;
-
-/**
- * To run the tests in this class, right-click and select "Run As JUnit Plug-in
- * Test". This will also start an Eclipse instance. To clean up the launch
- * configuration, open up its "Main" tab and select "[No Application] - Headless
- * Mode" as the application to run.
- */
-
-public class TextControlScenario extends ScenariosTestCase {
-
-    private Text text;
-
-    private Adventure adventure;
-
-    private Transportation transportation;
-
-    Account account;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-        // do any setup work here
-        adventure = SampleData.WINTER_HOLIDAY;
-        transportation = SampleData.EXECUTIVE_JET;
-        account = SampleData.PRESIDENT;
-        text = new Text(getComposite(), SWT.BORDER);
-    }
-
-    protected void tearDown() throws Exception {
-        text.dispose();
-        text = null;
-        super.tearDown();
-    }
-
-    public void testScenario01() {
-        // Bind the adventure "name" property to a text field
-        // Change the UI and verify the model changes
-        // Change the model and verify the UI changes
-        getDbc().bindValue(SWTObservables.observeText(text, SWT.Modify),
-                BeansObservables.observeValue(adventure, "name"),
-                null, null);
-
-        assertEquals(adventure.getName(), text.getText());
-        text.setText("England");
-        text.notifyListeners(SWT.FocusOut, null);
-        assertEquals("England", adventure.getName());
-        adventure.setName("France");
-        assertEquals("France", text.getText());
-        adventure.setName("Germany");
-        spinEventLoop(0);
-        assertEquals("Germany", text.getText());
-    }
-
-    public void testScenario02() {
-
-        // Bind the transportation "price" property to a text field
-        // This is a Double.TYPE so we check that conversion and validation
-        // occurs
-        // Change the UI and verify the model changes
-        // Change the model and verify the UI changes
-        getDbc().bindValue(SWTObservables.observeText(text, SWT.Modify),
-                BeansObservables.observeValue(transportation, "price"),
-                null, null);
-
-        NumberFormat numberFormat = NumberFormat.getInstance();
-        
-        assertEquals(numberFormat.format(transportation.getPrice()), text.getText());
-        text.setText("9876.54");
-        text.notifyListeners(SWT.FocusOut, null);
-        assertEquals(9876.54, transportation.getPrice(), 0);
-        
-        transportation.setPrice(1234.56);
-        assertEquals(numberFormat.format(transportation.getPrice()), text.getText());
-    }
-
-//    public void testScenario03() {
-//        // Show that the Escape key can be pressed in the middle of editing and
-//        // the value will revert
-//        // the updatePolicy for this test is TIME_LATE so it occurs when focus
-//        // is lost from the Text control
-//        getDbc().bindValue(SWTObservables.observeText(text, SWT.FocusOut),
-//                BeansObservables.observeValue(adventure, "name"),
-//                null, null);
-//
-//        String currentText = text.getText();
-//        text.setText("Switzerland");
-//        // We do not notify FocusOut
-//        // Verify that the model hasn't changed
-//        assertEquals(currentText, adventure.getName());
-//        Event event = new Event();
-//        event.character = SWT.ESC;
-//        event.keyCode = 27;
-//        text.notifyListeners(SWT.KeyDown, event);
-//        // Verify that the text has reverted
-//        assertEquals(currentText, text.getText());
-//        // And that the model didn't change
-//        assertEquals(adventure.getName(), currentText);
-//        // Now change the GUI and commit this change
-//        currentText = "Austria";
-//        text.setText(currentText);
-//        text.notifyListeners(SWT.FocusOut, null);
-//        assertEquals(text.getText(), adventure.getName());
-//        // Now change the text again and press escape a second time
-//        text.setText("Turkey");
-//        // Send escape
-//        text.notifyListeners(SWT.KeyDown, event);
-//        // Verify it has reverted to "Austria" and not any other value, i.e. the
-//        // last value it displayed
-//        assertEquals(currentText, text.getText());
-//
-//    }
-
-//    public void testScenario04() {
-//        // Show that the Escape key can be pressed in the middle of editing and
-//        // the value will revert
-//        // the updatePolicy for this test is TIME_EARLY so it occurs when each
-//        // keystroke occurs
-//        getDbc().bindValue(SWTObservables.observeText(text, SWT.Modify),
-//                BeansObservables.observeValue(adventure, "name"),
-//                null, null);
-//
-//        String originalName = adventure.getName();
-//        // Change the text field character by character and ensure that the
-//        // model changes
-//        String newName = "Switzerland";
-//        for (int i = 0; i < newName.length(); i++) {
-//            text.setText(newName.substring(0, i + 1));
-//            // Verify the model has changed
-//            assertEquals(newName.substring(0, i + 1), adventure.getName());
-//        }
-//        
-//        // Now send an escape key and verify that the model reverts
-//        Event event = new Event();
-//        event.character = SWT.ESC;
-//        event.keyCode = 27;
-//        text.notifyListeners(SWT.KeyDown, event);
-//        assertEquals(adventure.getName(), originalName);
-//        
-//        // Now send "Austria" key by key
-//        newName = "Austria";
-//        for (int i = 0; i < newName.length(); i++) {
-//            text.setText(newName.substring(0, i + 1));
-//            // Verify the model has changed
-//            assertEquals(newName.substring(0, i + 1), adventure.getName());
-//        }
-//        // Send a focus lost event to commit the change
-//        text.notifyListeners(SWT.FocusOut, null);
-//        // Send an escape key
-//        text.notifyListeners(SWT.KeyDown, event);
-//        // Verify that the model has changed and has not reverted
-//        assertEquals(newName, adventure.getName());
-//    }
-
-    /**
-     * public void testScenario05(){ // Show that nesting of properties works.
-     * Adventure has defaultLodging and Lodging has name getDbc().bind(text,new
-     * Property(adventure,"defaultLodging.name"),null); // Verify the GUI is
-     * showing the model value
-     * assertEquals(text.getText(),adventure.getDefaultLodging().getName()); }
-     */
-    public void testScenario06() {
-        // // Show that partial validation works for TIME_EARLY
-        // // We are using TIME_EARLY to verify that invalid states are not sent
-        // to the model
-        // getSWTObservableFactory().setUpdateTime(DataBindingContext.TIME_EARLY);
-        // getDbc().bind(text, new Property(account, "phone"), new BindSpec(new
-        // PhoneConverter(),new PhoneValidator()));
-        // // Verify we have no error message for partial validation or full
-        // validation yet
-        // assertTrue(((String)getDbc().getPartialValidationMessage().getValue()).length()
-        // == 0);
-        // assertTrue(((String)getDbc().getValidationMessage().getValue()).length()
-        // == 0);
-        // // Update some of the phone number
-        // String originalPhoneNumber = account.getPhone();
-        // text.setText("999");
-        // // Verify that the phone number is partially invalid and there is no
-        // validation message
-        // assertTrue(((String)getDbc().getPartialValidationMessage().getValue()).length()
-        // > 0);
-        // assertTrue(((String)getDbc().getValidationMessage().getValue()).length()
-        // == 0);
-        // // And that the model has not changed
-        // assertEquals(account.getPhone(),originalPhoneNumber);
-        // // Verify that fixing the phone removes the error and the model is
-        // updated too
-        // text.setText("999-888-7777");
-        // assertTrue(((String)getDbc().getPartialValidationMessage().getValue()).length()
-        // == 0);
-        // assertEquals(account.getPhone(),"9998887777");
-    }
-
-    public void testScenario07() {
-        // // Show that partial validation works for TIME_LATE
-        // getSWTObservableFactory().setUpdateTime(DataBindingContext.TIME_LATE);
-        // getDbc().bind(text, new Property(account, "phone"), new BindSpec(new
-        // PhoneConverter(),new PhoneValidator()));
-        // // Update some of the phone number
-        // String originalPhoneNumber = account.getPhone();
-        // text.setText("222");
-        // // Verify that we have no completion validation message and a partial
-        // one
-        // assertTrue(((String)getDbc().getPartialValidationMessage().getValue()).length()
-        // > 0);
-        // assertTrue(((String)getDbc().getValidationMessage().getValue()).length()
-        // == 0);
-        // // Fix the error
-        // text.setText("222-333-4444");
-        // // Verify that the errors are both fixed
-        // assertTrue(((String)getDbc().getPartialValidationMessage().getValue()).length()
-        // == 0);
-        // assertTrue(((String)getDbc().getValidationMessage().getValue()).length()
-        // == 0);
-        // // The model should not be changed
-        // assertEquals(originalPhoneNumber,account.getPhone());
-        // // Lose focus and verify that the complete validation message is
-        // fixed
-        // text.notifyListeners(SWT.FocusOut,null);
-        // assertTrue(((String)getDbc().getValidationMessage().getValue()).length()
-        // == 0);
-        // // The model should be changed
-        // assertEquals("2223334444",account.getPhone());
-    }
-
-    public void testScenario08() {
-
-        if (BindingTestSuite.failingTestsDisabled(this)) {
-            return;
-        }
-
-        // Show that the CustomBeanBindSupportFactory will automatically pick up
-        // the
-        // validator on the MaxNumberOfPeople property
-
-        DataBindingContext dbc = getDbc();
-        
-        dbc.bindValue(SWTObservables.observeText(text, SWT.Modify),
-				BeansObservables.observeValue(adventure, "maxNumberOfPeople"),
-				new CustomBeanUpdateValueStrategy(), null);
-
-        // make sure we can set a value inside the validator's range
-        text.setText("4");
-        assertEquals(4, adventure.getMaxNumberOfPeople());
-        // Now try to set a value outside the validator's range
-        text.setText("999");
-        assertEquals(4, adventure.getMaxNumberOfPeople());
-        dbc.dispose();
-    }
-
-    public void testScenario09() {
-        // Verify direct binding between a Text and Label following bugzilla
-        // 118696        
-        Label label = new Label(getComposite(), SWT.NONE);
-        getDbc().bindValue(SWTObservables.observeText(text, SWT.FocusOut), SWTObservables.observeText(label), null, null);
-
-        // Change the text
-        text.setText("Frog");
-        // Verify the label does not change
-        assertTrue(label.getText().length() == 0);
-        // Lose focus from the text field
-        text.notifyListeners(SWT.FocusOut, null);
-        assertEquals(label.getText(), "Frog");
-
-    }
-
-    public void testScenario10() {
-        // Verify direct binding between a Text and Label following bugzilla
-        // 118696 with TIME_EARLY
-        Label label = new Label(getComposite(), SWT.NONE);
-        getDbc().bindValue(SWTObservables.observeText(text, SWT.Modify), SWTObservables.observeText(label), null, null);
-
-        // Change the text
-        String newTextValue = "Frog";
-        for (int i = 0; i < newTextValue.length(); i++) {
-            text.setText(newTextValue.substring(0, i + 1));
-            // Verify the label has changed key by key
-            assertEquals(text.getText(), label.getText());
-        }
-        // Lose focus
-        text.notifyListeners(SWT.FocusOut, null);
-        // Verify the text and label are the same following a lose focus
-        assertEquals(text.getText(), label.getText());
-    }
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/smoketest/swt.xswt b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/smoketest/swt.xswt
deleted file mode 100644
index 0097d63..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/smoketest/swt.xswt
+++ /dev/null
@@ -1,301 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xswt xmlns:x="http://sweet_swt.sf.net/xswt">
-	<import xmlns="http://sweet_swt.sf.net/xswt">
-		<package name="java.lang"/>
-		<package name="org.eclipse.swt.widgets"/>
-		<package name="org.eclipse.swt.custom"/>
-		<package name="org.eclipse.swt.layout"/>
-	</import>
-
-	<!-- An XSWT example that uses nearly every SWT control and uses the new
-	     syntax wherever possible. 
-	     
-	     Get XSWT at:
-	     
-	     http://xswt.sourceforge.net/updates 
-	     
-	     then choose Window | Show View | Other... | XSWT Views | XSWT Preview -->
-
-	<layout x:class="gridLayout"/>
-	
-	<label text="SWT Controls:"/>
-	<tabFolder>
-		<layoutData x:class="gridData" grabExcessHorizontalSpace="true" grabExcessVerticalSpace="true" horizontalAlignment="GridData.FILL" verticalAlignment="GridData.FILL"/>
-
-		<composite x:id="Text">
-			<layoutData x:class="gridData" grabExcessHorizontalSpace="true" horizontalAlignment="GridData.FILL"/>
-			<layout x:class="gridLayout" numColumns="2"/>
-
-			<composite x:style="BORDER">
-				<layoutData x:class="gridData" grabExcessHorizontalSpace="true" verticalAlignment="GridData.FILL" horizontalAlignment="GridData.FILL"/>
-				<layout x:class="gridLayout" numColumns="2"/>
-
-				<label text="Integer:"/><text x:style="BORDER" x:id="intText" text="1"/>
-				<label text="Float:"/><text x:style="BORDER" x:id="floatText" text="1.0"/>
-				<label text="String:"/><text x:style="BORDER" x:id="stringText" text="The quick brown fox jumped over the lazy dog."/>
-				<label text="RegexValidated String:"/><text x:style="BORDER" x:id="regexStringText" text="The quick brown fox jumped over the lazy dog."/>
-				<label text="Masked String:"/><text x:style="BORDER" x:id="maskedStringText" background="208 128 128"/>
-			</composite>
-			<slider x:style="VERTICAL" x:id="buttonScroller">
-				<layoutData x:class="gridData" verticalAlignment="GridData.FILL"/>
-			</slider>
-		</composite>
-		<tabItem text="Text" control="Text"/>
-
-		<composite x:id="Labels">
-			<layoutData x:class="gridData" grabExcessHorizontalSpace="true" horizontalAlignment="GridData.FILL"/>
-			<layout x:class="gridLayout" numColumns="2"/>
-
-			<composite x:style="BORDER">
-				<layoutData x:class="gridData" grabExcessHorizontalSpace="true" verticalAlignment="GridData.FILL" horizontalAlignment="GridData.FILL"/>
-				<layout x:class="gridLayout" numColumns="1"/>
-
-				<label text="Label with text"/>
-				<label text="Label with image"/>
-				<label text="Label with text and image"/>
-				<label x:style="SEPARATOR | HORIZONTAL"><layoutData x:class="gridData" grabExcessHorizontalSpace="true" horizontalAlignment="GridData.FILL"/></label>
-				<cLabel text="CLabel with text"/>
-				<cLabel text="CLabel with image"/>
-				<cLabel text="CLabel with text and image"/>
-			</composite>
-			<slider x:style="VERTICAL" x:id="textScroller"/>
-		</composite>
-		<tabItem text="Label / CLabel" control="Labels"/>
-	
-		<composite x:id="Button">
-			<layoutData x:class="gridData" grabExcessHorizontalSpace="true" horizontalAlignment="GridData.FILL"/>
-			<layout x:class="gridLayout" numColumns="2"/>
-
-			<composite x:style="BORDER">
-				<layoutData x:class="gridData" grabExcessHorizontalSpace="true" verticalAlignment="GridData.FILL" horizontalAlignment="GridData.FILL"/>
-				<layout x:class="gridLayout" numColumns="2"/>
-
-				<label text="Push:"/><button x:id="pushButton" text="PushButton"/>
-				<label text="Arrow:"/><button x:id="arrowButton" x:style="ARROW" text="ArrowButton"/>
-				<label text="Toggle:"/><button x:id="toggleButton" x:style="TOGGLE" text="ToggleButton"/>
-				<label text="Check:"/><button x:style="CHECK" x:id="checkButton" text="CheckBox"/>
-				<label text="Radio Group 1:"/>
-				<composite x:style="BORDER" x:id="radioGroup1">
-					<layoutData x:class="gridData" horizontalAlignment="GridData.FILL"/>
-					<layout x:class="gridLayout" numColumns="1"/>
-
-					<button x:style="RADIO" x:id="radioButton0.1" text="Radio"/>
-					<button x:style="RADIO" x:id="radioButton0.2" text="Radio2" selection="true"/>
-					<button x:style="RADIO" x:id="radioButton0.3" text="Radio3"/>
-				</composite>
-				<label text="Radio Group 2:"/>
-				<composite x:style="BORDER" x:id="radioGroup2">
-					<layoutData x:class="gridData" horizontalAlignment="GridData.FILL"/>
-					<layout x:class="gridLayout" numColumns="1"/>
-
-					<button x:style="RADIO" x:id="radioButton1.1" text="Radio"/>
-					<button x:style="RADIO" x:id="radioButton1.2" text="Radio2"/>
-					<button x:style="RADIO" x:id="radioButton1.3" text="Radio3"/>
-				</composite>
-			</composite>
-			<slider x:style="VERTICAL" x:id="1buttonScroller">
-				<layoutData x:class="gridData" verticalAlignment="GridData.FILL"/>
-			</slider>
-		</composite>
-		<tabItem text="Button" control="Button"/>
-
-		<composite x:id="List">
-			<layoutData x:class="gridData" grabExcessHorizontalSpace="true" horizontalAlignment="GridData.FILL"/>
-			<layout x:class="gridLayout" numColumns="1"/>
-
-			<composite>
-				<layoutData x:class="gridData" grabExcessHorizontalSpace="true" horizontalAlignment="GridData.FILL" grabExcessVerticalSpace="true" verticalAlignment="GridData.FILL"/>
-	            <layout x:class="fillLayout" type="VERTICAL"/>
-
-				<list x:style="BORDER | V_SCROLL | MULTI"/>
-				<list x:style="BORDER | V_SCROLL"/>
-			</composite>
-		</composite>
-		<tabItem text="List" control="List"/>
-
-		<composite x:id="Combos">
-			<layoutData x:class="gridData" grabExcessHorizontalSpace="true" horizontalAlignment="GridData.FILL"/>
-			<layout x:class="gridLayout" numColumns="2"/>
-
-			<composite x:style="BORDER">
-				<layoutData x:class="gridData" grabExcessHorizontalSpace="true" verticalAlignment="GridData.FILL" horizontalAlignment="GridData.FILL"/>
-				<layout x:class="gridLayout" numColumns="1"/>
-
-				<combo>
-					<add x:p0="item1"/>
-					<add x:p0="item2"/>
-					<add x:p0="item3"/>
-				</combo>
-				<combo x:style="SIMPLE">
-					<add x:p0="item1"/>
-					<add x:p0="item2"/>
-					<add x:p0="item3"/>
-				</combo>
-				<combo x:style="READ_ONLY">
-					<add x:p0="item1"/>
-					<add x:p0="item2"/>
-					<add x:p0="item3"/>
-				</combo>
-				<label x:style="SEPARATOR | HORIZONTAL"><layoutData x:class="gridData" grabExcessHorizontalSpace="true" horizontalAlignment="GridData.FILL"/></label>
-				<cCombo>
-					<add x:p0="item1"/>
-					<add x:p0="item2"/>
-					<add x:p0="item3"/>
-				</cCombo>
-				<cCombo x:style="READ_ONLY" background="255 255 255">
-					<add x:p0="item1"/>
-					<add x:p0="item2"/>
-					<add x:p0="item3"/>
-				</cCombo>
-			</composite>
-			<slider x:style="VERTICAL" x:id="2buttonScroller">
-				<layoutData x:class="gridData" verticalAlignment="GridData.FILL"/>
-			</slider>
-		</composite>
-		<tabItem text="Combo / CCombo" control="Combos"/>
-
-		<composite x:id="Table">
-			<layoutData x:class="gridData" grabExcessHorizontalSpace="true" horizontalAlignment="GridData.FILL"/>
-			<layout x:class="gridLayout" numColumns="1"/>
-
-			<composite x:style="BORDER">
-				<layoutData x:class="gridData" grabExcessHorizontalSpace="true" grabExcessVerticalSpace="true" horizontalAlignment="GridData.FILL" verticalAlignment="GridData.FILL"/>
-				<layout x:class="gridLayout" numColumns="2"/>
-
-				<table x:style="BORDER" linesVisible="true" headerVisible="true">
-					<layoutData x:class="gridData" grabExcessHorizontalSpace="true" grabExcessVerticalSpace="true" horizontalAlignment="GridData.FILL" verticalAlignment="GridData.FILL"/>
-
-					<tableColumn width="50" text="Done"/>
-					<tableColumn width="200" text="Description"/>
-					<tableColumn width="60" text="Planned"/>
-					<tableColumn width="60" text="Revised"/>
-					<tableColumn width="60" text="Actual"/>
-					<!--<tableItem/>-->
-				</table>
-			</composite>
-		</composite>
-		<tabItem text="Table" control="Table"/>
-
-		<composite x:id="Tree">
-			<layoutData x:class="gridData" grabExcessHorizontalSpace="true" horizontalAlignment="GridData.FILL"/>
-			<layout x:class="gridLayout" numColumns="1"/>
-
-			<composite x:style="BORDER">
-				<layoutData x:class="gridData" grabExcessHorizontalSpace="true" grabExcessVerticalSpace="true" horizontalAlignment="GridData.FILL" verticalAlignment="GridData.FILL"/>
-				<layout x:class="gridLayout" numColumns="2"/>
-
-				<tree x:style="BORDER">
-					<layoutData x:class="gridData" grabExcessHorizontalSpace="true" grabExcessVerticalSpace="true" horizontalAlignment="GridData.FILL" verticalAlignment="GridData.FILL"/>
-
-					<treeItem text="item">
-						<x:children>
-							<treeItem text="item"/>
-							<treeItem text="item"/>
-							<treeItem text="item">
-								<x:children>
-									<treeItem text="item"/>
-									<treeItem text="item"/>
-									<treeItem text="item"/>
-									<treeItem text="item"/>
-									<treeItem text="item"/>
-								</x:children>
-							</treeItem>
-							<treeItem text="item"/>
-						</x:children>
-					</treeItem>
-					<treeItem text="item with Image (or at least needs one)">
-						<x:children>
-							<treeItem text="item"/>
-							<treeItem text="item"/>
-						</x:children>
-					</treeItem>
-					<treeItem text="Another item">
-						<x:children>
-							<treeItem text="item"/>
-							<treeItem text="item"/>
-							<treeItem text="item"/>
-							<treeItem text="item"/>
-							<treeItem text="item"/>
-						</x:children>
-					</treeItem>
-				</tree>
-			</composite>
-		</composite>
-		<tabItem text="Tree" control="Tree"/>
-
-		<composite x:id="TableTree">
-			<layoutData x:class="gridData" grabExcessHorizontalSpace="true" horizontalAlignment="GridData.FILL"/>
-			<layout x:class="gridLayout" numColumns="1"/>
-
-			<composite x:style="BORDER">
-				<layoutData x:class="gridData" grabExcessHorizontalSpace="true" grabExcessVerticalSpace="true" horizontalAlignment="GridData.FILL" verticalAlignment="GridData.FILL"/>
-				<layout x:class="gridLayout" numColumns="2"/>
-
-				<tableTree x:style="BORDER">
-					<layoutData x:class="gridData" grabExcessHorizontalSpace="true" grabExcessVerticalSpace="true" horizontalAlignment="GridData.FILL" verticalAlignment="GridData.FILL"/>
-
-					<tableTreeItem text="item">
-						<x:children>
-							<tableTreeItem text="subitem"/>
-							<tableTreeItem text="subitem"/>
-						</x:children>
-					</tableTreeItem>
-					<tableTreeItem text="item">
-						<x:children>
-							<tableTreeItem text="subitem"/>
-							<tableTreeItem text="subitem"/>
-							<tableTreeItem text="subitem"/>
-							<tableTreeItem text="subitem"/>
-							<tableTreeItem text="subitem"/>
-						</x:children>
-					</tableTreeItem>
-					<tableTreeItem text="item">
-						<x:children>
-							<tableTreeItem text="item">
-								<x:children>
-									<tableTreeItem text="subitem"/>
-								</x:children>
-							</tableTreeItem>
-							<tableTreeItem text="item">
-								<x:children>
-									<tableTreeItem text="subitem"/>
-									<tableTreeItem text="subitem"/>
-									<tableTreeItem text="subitem"/>
-									<tableTreeItem text="subitem"/>
-									<tableTreeItem text="subitem"/>
-								</x:children>
-							</tableTreeItem>
-							<tableTreeItem text="item">
-								<x:children>
-									<tableTreeItem text="subitem"/>
-									<tableTreeItem text="subitem"/>
-									<tableTreeItem text="subitem"/>
-								</x:children>
-							</tableTreeItem>
-						</x:children>
-					</tableTreeItem>
-				</tableTree>
-			</composite>
-		</composite>
-		<tabItem text="TableTree" control="TableTree"/>
-
-		<composite x:id="Progress">
-			<layoutData x:class="gridData" grabExcessHorizontalSpace="true" horizontalAlignment="GridData.FILL"/>
-			<layout x:class="gridLayout" numColumns="2"/>
-
-			<composite x:style="BORDER">
-				<layoutData x:class="gridData" grabExcessHorizontalSpace="true" verticalAlignment="GridData.FILL" horizontalAlignment="GridData.FILL"/>
-				<layout x:class="gridLayout" numColumns="1"/>
-
-				<progressBar x:style="INDETERMINATE"/>
-				<progressBar x:style="INDETERMINATE | SMOOTH"/>
-				<progressBar x:style="SMOOTH" minimum="0" maximum="100" selection="40"/>
-				<progressBar minimum="0" maximum="100" selection="60"/>
-			</composite>
-			<slider x:style="VERTICAL" x:id="3textScroller"/>
-		</composite>
-		<tabItem text="ProgressBar" control="Progress"/>
-
-	</tabFolder>
-</xswt>
-
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/swt/SWTObservablesTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/swt/SWTObservablesTest.java
deleted file mode 100644
index 613ab58..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/swt/SWTObservablesTest.java
+++ /dev/null
@@ -1,384 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 248621
- ******************************************************************************/
-
-package org.eclipse.jface.tests.databinding.swt;
-
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.jface.databinding.conformance.util.RealmTester;
-import org.eclipse.jface.databinding.swt.ISWTObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.swt.ButtonObservableValue;
-import org.eclipse.jface.internal.databinding.swt.CComboObservableList;
-import org.eclipse.jface.internal.databinding.swt.CComboObservableValue;
-import org.eclipse.jface.internal.databinding.swt.CLabelObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ComboObservableList;
-import org.eclipse.jface.internal.databinding.swt.ComboObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ControlObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ItemObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ItemTooltipObservableValue;
-import org.eclipse.jface.internal.databinding.swt.LabelObservableValue;
-import org.eclipse.jface.internal.databinding.swt.ListObservableList;
-import org.eclipse.jface.internal.databinding.swt.ListObservableValue;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.jface.internal.databinding.swt.ScaleObservableValue;
-import org.eclipse.jface.internal.databinding.swt.SpinnerObservableValue;
-import org.eclipse.jface.internal.databinding.swt.TableSingleSelectionObservableValue;
-import org.eclipse.jface.internal.databinding.swt.TextEditableObservableValue;
-import org.eclipse.jface.internal.databinding.swt.TextObservableValue;
-import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Scale;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Spinner;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.ToolTip;
-import org.eclipse.swt.widgets.Tree;
-
-/**
- * @since 1.1
- */
-public class SWTObservablesTest extends AbstractSWTTestCase {
-	private Shell shell;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		shell = getShell();
-		RealmTester.setDefault(SWTObservables.getRealm(shell.getDisplay()));
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		
-		RealmTester.setDefault(null);
-	}
-
-	public void testObserveForeground() throws Exception {
-		ISWTObservableValue value = SWTObservables.observeForeground(shell);
-		assertNotNull(value);
-		assertEquals(Color.class, value.getValueType());
-	}
-
-	public void testObserveBackground() throws Exception {
-		ISWTObservableValue value = SWTObservables.observeBackground(shell);
-		assertNotNull(value);
-		assertEquals(Color.class, value.getValueType());
-	}
-
-	public void testObserveFont() throws Exception {
-		ISWTObservableValue value = SWTObservables.observeFont(shell);
-		assertNotNull(value);
-		assertEquals(Font.class, value.getValueType());
-	}
-
-	public void testObserveSelectionOfSpinner() throws Exception {
-		Spinner spinner = new Spinner(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeSelection(spinner);
-		assertNotNull(value);
-		assertTrue(value instanceof SpinnerObservableValue);
-
-		SpinnerObservableValue spinnerObservable = (SpinnerObservableValue) value;
-		assertEquals(SWTProperties.SELECTION, spinnerObservable.getAttribute());
-	}
-
-	public void testObserveSelectionOfButton() throws Exception {
-		Button button = new Button(shell, SWT.PUSH);
-		ISWTObservableValue value = SWTObservables.observeSelection(button);
-		assertNotNull(value);
-		assertTrue(value instanceof ButtonObservableValue);
-	}
-
-	public void testObserveSelectionOfCombo() throws Exception {
-		Combo combo = new Combo(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeSelection(combo);
-		assertNotNull(value);
-		assertTrue(value instanceof ComboObservableValue);
-
-		ComboObservableValue comboObservable = (ComboObservableValue) value;
-		assertEquals(SWTProperties.SELECTION, comboObservable.getAttribute());
-	}
-
-	public void testObserveSelectionOfCCombo() throws Exception {
-		CCombo combo = new CCombo(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeSelection(combo);
-		assertNotNull(value);
-		assertTrue(value instanceof CComboObservableValue);
-
-		CComboObservableValue ccomboObservable = (CComboObservableValue) value;
-		assertEquals(SWTProperties.SELECTION, ccomboObservable.getAttribute());
-	}
-
-	public void testObserveSelectionOfList() throws Exception {
-		List list = new List(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeSelection(list);
-		assertNotNull(value);
-		assertTrue(value instanceof ListObservableValue);
-	}
-	
-	public void testObserveSelectionOfScale() throws Exception {
-		Scale scale = new Scale(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeSelection(scale);
-		assertNotNull(value);
-		assertTrue(value instanceof ScaleObservableValue);
-		
-		ScaleObservableValue scaleObservable = (ScaleObservableValue) value;
-		assertEquals(SWTProperties.SELECTION, scaleObservable.getAttribute());
-	}
-
-	public void testObserveSelectionOfUnsupportedControl() throws Exception {
-		try {
-			Text text = new Text(shell, SWT.NONE);
-			SWTObservables.observeSelection(text);
-			fail("Exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-
-	public void testObserveTextWithEventOfText() throws Exception {
-		Text text = new Text(shell, SWT.NONE);
-		assertFalse(text.isListening(SWT.FocusOut));
-
-		ISWTObservableValue value = SWTObservables.observeText(text,
-				SWT.FocusOut);
-		assertNotNull(value);
-		assertTrue(value instanceof TextObservableValue);
-		assertTrue(text.isListening(SWT.FocusOut));
-	}
-
-	public void testObserveTextWithEventOfUnsupportedControl() throws Exception {
-		Label label = new Label(shell, SWT.NONE);
-		try {
-			SWTObservables.observeText(label, SWT.FocusOut);
-			fail("Exception should have been thrown");
-		} catch (Exception e) {
-		}
-	}
-
-	public void testObserveTextOfLabel() throws Exception {
-		Label label = new Label(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeText(label);
-		assertNotNull(label);
-		assertTrue(value instanceof LabelObservableValue);
-	}
-
-	public void testObserveTextOfCLabel() throws Exception {
-		CLabel label = new CLabel(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeText(label);
-		assertNotNull(label);
-		assertTrue(value instanceof CLabelObservableValue);
-	}
-
-	public void testObserveTextOfCombo() throws Exception {
-		Combo combo = new Combo(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeText(combo);
-		assertNotNull(value);
-		assertTrue(value instanceof ComboObservableValue);
-
-		ComboObservableValue comboObservable = (ComboObservableValue) value;
-		assertEquals(SWTProperties.TEXT, comboObservable.getAttribute());
-	}
-
-	public void testObserveTextOfCCombo() throws Exception {
-		CCombo combo = new CCombo(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeText(combo);
-		assertNotNull(value);
-		assertTrue(value instanceof CComboObservableValue);
-
-		CComboObservableValue ccomboObservable = (CComboObservableValue) value;
-		assertEquals(SWTProperties.TEXT, ccomboObservable.getAttribute());
-	}
-
-	public void testObserveTextOfText() throws Exception {
-		Text text = new Text(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeText(text);
-		assertNotNull(value);
-		assertTrue(value instanceof TextObservableValue);
-		assertFalse(text.isListening(SWT.Modify));
-		assertFalse(text.isListening(SWT.FocusOut));
-	}
-
-	public void testObserveTextOfItem() throws Exception {
-		CTabFolder ctf = new CTabFolder(shell, SWT.NONE);
-		Item item = new CTabItem(ctf, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeText(item);
-		assertNotNull(value);
-		assertTrue(value instanceof ItemObservableValue);
-	}
-
-	public void testObserveTextOfUnsupportedControl() throws Exception {
-		Table table = new Table(shell, SWT.NONE);
-		try {
-			SWTObservables.observeText(table);
-			fail("Exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-
-	public void testObserveTooltipOfItem() throws Exception {
-		CTabFolder ctf = new CTabFolder(shell, SWT.NONE);
-		Item item = new CTabItem(ctf, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeTooltipText(item);
-		assertNotNull(value);
-		assertTrue(value instanceof ItemTooltipObservableValue);
-	}
-
-	public void testObserveTooltipOfUnsupportedControl() throws Exception {
-		ToolTip ttip = new ToolTip(shell, SWT.NONE);
-		try {
-			SWTObservables.observeTooltipText(ttip);
-			fail("Exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-
-	public void testObserveTooltipOfControl() throws Exception {
-		Label label = new Label(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeTooltipText(label);
-		assertNotNull(value);
-		assertTrue(value instanceof ControlObservableValue);
-	}
-
-	public void testObserveItemsOfCombo() throws Exception {
-		Combo combo = new Combo(shell, SWT.NONE);
-		IObservableList list = SWTObservables.observeItems(combo);
-		assertNotNull(list);
-		assertTrue(list instanceof ComboObservableList);
-	}
-
-	public void testObserveItemsOfCCombo() throws Exception {
-		CCombo ccombo = new CCombo(shell, SWT.NONE);
-		IObservableList list = SWTObservables.observeItems(ccombo);
-		assertNotNull(list);
-		assertTrue(list instanceof CComboObservableList);
-	}
-
-	public void testObserveItemsOfList() throws Exception {
-		List list = new List(shell, SWT.NONE);
-		IObservableList observableList = SWTObservables.observeItems(list);
-		assertNotNull(observableList);
-		assertTrue(observableList instanceof ListObservableList);
-	}
-
-	public void testObserveItemsOfUnsupportedControl() throws Exception {
-		Table table = new Table(shell, SWT.NONE);
-		try {
-			SWTObservables.observeItems(table);
-			fail("Exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-
-	public void testObserveSingleSelectionIndexOfTable() throws Exception {
-		Table table = new Table(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables
-				.observeSingleSelectionIndex(table);
-		assertNotNull(value);
-		assertTrue(value instanceof TableSingleSelectionObservableValue);
-	}
-
-	public void testObserveSingleSelectionIndexOfUnsupportedControl()
-			throws Exception {
-		Tree tree = new Tree(shell, SWT.NONE);
-		try {
-			SWTObservables.observeSingleSelectionIndex(tree);
-			fail("Exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-
-		}
-	}
-	
-	public void testObserveMinOfSpinner() throws Exception {
-		Spinner spinner = new Spinner(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeMin(spinner);
-		assertNotNull(value);
-		assertTrue(value instanceof SpinnerObservableValue);
-		
-		SpinnerObservableValue spinnerObservable = (SpinnerObservableValue) value;
-		assertEquals(SWTProperties.MIN, spinnerObservable.getAttribute());
-	}
-	
-	public void testObserveMinOfScale() throws Exception {
-		Scale scale = new Scale(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeMin(scale);
-		assertNotNull(value);
-		assertTrue(value instanceof ScaleObservableValue);
-		
-		ScaleObservableValue scaleObservable = (ScaleObservableValue) value;
-		assertEquals(SWTProperties.MIN, scaleObservable.getAttribute());
-	}
-
-	public void testObserveMinOfUnsupportedControl() throws Exception {
-		Text text = new Text(shell, SWT.NONE);
-		try {
-			SWTObservables.observeMin(text);
-			fail("Exception should have been thrown");
-		} catch (IllegalArgumentException e) {	
-		}
-	}
-	
-	public void testObserveMaxOfSpinner() throws Exception {
-		Spinner spinner = new Spinner(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeMax(spinner);
-		assertNotNull(value);
-		assertTrue(value instanceof SpinnerObservableValue);
-		
-		SpinnerObservableValue spinnerObservable = (SpinnerObservableValue) value;
-		assertEquals(SWTProperties.MAX, spinnerObservable.getAttribute());
-	}
-	
-	public void testObserveMaxOfScale() throws Exception {
-		Scale scale = new Scale(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeMax(scale);
-		assertNotNull(value);
-		assertTrue(value instanceof ScaleObservableValue);
-		
-		ScaleObservableValue scaleObservable = (ScaleObservableValue) value;
-		assertEquals(SWTProperties.MAX, scaleObservable.getAttribute());
-	}
-	
-	public void testObserveMaxOfUnsupportedControl() throws Exception {
-		Text text = new Text(shell, SWT.NONE);
-		try {
-			SWTObservables.observeMax(text);
-			fail("Exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-	
-	public void testObserveEditableOfText() throws Exception {
-		Text text = new Text(shell, SWT.NONE);
-		ISWTObservableValue value = SWTObservables.observeEditable(text);
-		assertNotNull(value);
-		assertTrue(value instanceof TextEditableObservableValue);
-	}
-	
-	public void testObserveEditableOfUnsupportedControl() throws Exception {
-		Label label = new Label(shell, SWT.NONE);
-		try {
-			SWTObservables.observeEditable(label);
-			fail("Exception should have been thrown");
-		} catch (IllegalArgumentException e) {
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableListContentProviderTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableListContentProviderTest.java
deleted file mode 100644
index 9154e71..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableListContentProviderTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 215531)
- ******************************************************************************/
-package org.eclipse.jface.tests.databinding.viewers;
-
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-
-public class ObservableListContentProviderTest extends
-		AbstractDefaultRealmTestCase {
-	private Shell shell;
-	private TableViewer viewer;
-	private ObservableListContentProvider contentProvider;
-	private IObservableList input;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		shell = new Shell();
-		viewer = new TableViewer(shell, SWT.NONE);
-
-		contentProvider = new ObservableListContentProvider();
-		viewer.setContentProvider(contentProvider);
-
-		input = new WritableList();
-		viewer.setInput(input);
-	}
-
-	protected void tearDown() throws Exception {
-		shell.dispose();
-		viewer = null;
-		input = null;
-		super.tearDown();
-	}
-
-	public void testViewerUpdate_RemoveElementAfterMutation() {
-		Mutable element = new Mutable(1);
-		input.add(element);
-
-		assertEquals(1, viewer.getTable().getItemCount());
-
-		element.id++;
-		input.remove(element);
-
-		assertEquals(0, viewer.getTable().getItemCount());
-	}
-
-	static class Mutable {
-		public int id;
-
-		public Mutable(int id) {
-			this.id = id;
-		}
-
-		public boolean equals(Object obj) {
-			if (obj == this)
-				return true;
-			if (obj == null)
-				return false;
-			if (getClass() != obj.getClass())
-				return false;
-			Mutable that = (Mutable) obj;
-			return this.id == that.id;
-		}
-
-		public int hashCode() {
-			return id;
-		}
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableListTreeContentProviderTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableListTreeContentProviderTest.java
deleted file mode 100644
index 3d2bb24..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableListTreeContentProviderTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 207858)
- *******************************************************************************/
-
-package org.eclipse.jface.tests.databinding.viewers;
-
-import java.util.Arrays;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.runtime.AssertionFailedException;
-import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-
-public class ObservableListTreeContentProviderTest extends
-		AbstractDefaultRealmTestCase {
-	private Shell shell;
-	private TreeViewer viewer;
-	private Tree tree;
-	private ObservableListTreeContentProvider contentProvider;
-	private Object input;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		shell = new Shell();
-		tree = new Tree(shell, SWT.NONE);
-		viewer = new TreeViewer(tree);
-		input = new Object();
-	}
-
-	protected void tearDown() throws Exception {
-		shell.dispose();
-		tree = null;
-		viewer = null;
-		input = null;
-		super.tearDown();
-	}
-
-	private void initContentProvider(IObservableFactory listFactory) {
-		contentProvider = new ObservableListTreeContentProvider(listFactory, null);
-		viewer.setContentProvider(contentProvider);
-		viewer.setInput(input);
-	}
-
-	public void testConstructor_NullArgumentThrowsException() {
-		try {
-			initContentProvider(null);
-			fail("Constructor should have thrown AssertionFailedException");
-		} catch (AssertionFailedException expected) {
-		}
-	}
-
-	public void testGetElements_ChangesFollowObservedList() {
-		final IObservableList elements = new WritableList();
-		final Object input = new Object();
-		initContentProvider(new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return target == input ? elements : null;
-			}
-		});
-
-		assertTrue(Arrays.equals(new Object[0], contentProvider
-				.getElements("unknown input")));
-
-		Object element0 = new Object();
-		elements.add(element0);
-
-		assertTrue(Arrays.equals(new Object[] { element0 }, contentProvider
-				.getElements(input)));
-
-		Object element1 = new Object();
-		elements.add(element1);
-
-		assertTrue(Arrays.equals(new Object[] { element0, element1 },
-				contentProvider.getElements(input)));
-	}
-
-	public void testViewerUpdate_RemoveElementAfterMutation() {
-		final IObservableList children = new WritableList();
-		initContentProvider(new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return target == input ? children : null;
-			}
-		});
-
-		Mutable element = new Mutable();
-		children.add(element);
-		assertEquals(1, tree.getItemCount());
-
-		element.mutate();
-		children.remove(element);
-		assertEquals(0, tree.getItemCount());
-	}
-
-	static class Mutable {
-		private int id;
-
-		public Mutable() {
-			this(0);
-		}
-
-		public Mutable(int id) {
-			this.id = id;
-		}
-
-		public void mutate() {
-			id++;
-		}
-
-		public boolean equals(Object obj) {
-			if (obj == this)
-				return true;
-			if (obj == null)
-				return false;
-			if (getClass() != obj.getClass())
-				return false;
-			Mutable that = (Mutable) obj;
-			return this.id == that.id;
-		}
-
-		public int hashCode() {
-			return id;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableMapLabelProviderTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableMapLabelProviderTest.java
deleted file mode 100644
index cffed54..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableMapLabelProviderTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Brad Reynolds - bug 164247
- ******************************************************************************/
-
-package org.eclipse.jface.tests.databinding.viewers;
-
-import java.util.HashSet;
-
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.examples.databinding.ModelObject;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 1.1
- */
-public class ObservableMapLabelProviderTest extends AbstractDefaultRealmTestCase {
-    
-    public void testGetColumnText() throws Exception {
-        WritableSet set = new WritableSet(new HashSet(), Item.class);
-        Item item = new Item();
-        String value = "value";
-        item.setValue(value);
-        set.add(item);
-        
-        ObservableMapLabelProvider labelProvider = new ObservableMapLabelProvider(BeansObservables.observeMap(set, Item.class, "value"));
-        assertEquals(item.getValue(), labelProvider.getColumnText(item, 0));
-    }
-    
-    public void testGetColumnTextNullValue() throws Exception {
-        WritableSet set = new WritableSet(new HashSet(), Item.class);
-        Item item = new Item();
-        set.add(item);   
-        
-        ObservableMapLabelProvider labelProvider = new ObservableMapLabelProvider(BeansObservables.observeMap(set, Item.class, "value"));
-        assertNull(item.getValue());
-        assertEquals("", labelProvider.getColumnText(item, 0));
-    }
-    
-    private static class Item extends ModelObject {
-        private String value;
-        
-        public String getValue() {
-            return value;
-        }
-        
-        public void setValue(String value) {
-            String old = this.value;
-            
-            firePropertyChange("value", old, this.value = value);
-        }
-    }
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableSetContentProviderTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableSetContentProviderTest.java
deleted file mode 100644
index 2d02ff5..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableSetContentProviderTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Boris Bokowski, IBM - bug 209484
- ******************************************************************************/
-
-package org.eclipse.jface.tests.databinding.viewers;
-
-import java.util.Arrays;
-
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableSetContentProvider;
-import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 3.3
- * 
- */
-public class ObservableSetContentProviderTest extends AbstractSWTTestCase {
-	public void testKnownElementsRealm() throws Exception {
-		ObservableSetContentProvider contentProvider = new ObservableSetContentProvider();
-		assertSame("realm for the known elements should be the SWT realm",
-				SWTObservables.getRealm(Display.getDefault()), contentProvider
-						.getKnownElements().getRealm());
-	}
-	
-	public void testKnownElementsAfterSetInput() {
-		ObservableSetContentProvider contentProvider = new ObservableSetContentProvider();
-		TableViewer tableViewer = new TableViewer(getShell());
-		tableViewer.setContentProvider(contentProvider);
-		assertEquals(0, contentProvider.getKnownElements().size());
-		WritableSet input = new WritableSet(Arrays.asList(new String[] {"one","two","three"}), String.class);
-		tableViewer.setInput(input);
-		assertEquals(3, contentProvider.getKnownElements().size());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableSetTreeContentProviderTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableSetTreeContentProviderTest.java
deleted file mode 100644
index 1d5fc47..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableSetTreeContentProviderTest.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 207858)
- *******************************************************************************/
-
-package org.eclipse.jface.tests.databinding.viewers;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.set.WritableSet;
-import org.eclipse.core.runtime.AssertionFailedException;
-import org.eclipse.jface.databinding.viewers.ObservableSetTreeContentProvider;
-import org.eclipse.jface.internal.databinding.viewers.ObservableViewerElementSet;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.jface.viewers.IElementComparer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-
-public class ObservableSetTreeContentProviderTest extends
-		AbstractDefaultRealmTestCase {
-	private Shell shell;
-	private TreeViewer viewer;
-	private Tree tree;
-	private ObservableSetTreeContentProvider contentProvider;
-	private Object input;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		shell = new Shell();
-		tree = new Tree(shell, SWT.NONE);
-		viewer = new TreeViewer(tree);
-		input = new Object();
-	}
-
-	protected void tearDown() throws Exception {
-		shell.dispose();
-		tree = null;
-		viewer = null;
-		input = null;
-		super.tearDown();
-	}
-
-	private void initContentProvider(IObservableFactory listFactory) {
-		contentProvider = new ObservableSetTreeContentProvider(listFactory, null);
-		viewer.setContentProvider(contentProvider);
-		viewer.setInput(input);
-	}
-
-	public void testConstructor_NullArgumentThrowsException() {
-		try {
-			initContentProvider(null);
-			fail("Constructor should have thrown AssertionFailedException");
-		} catch (AssertionFailedException expected) {
-		}
-	}
-
-	public void testGetElements_ChangesFollowObservedList() {
-		final IObservableSet elements = new WritableSet();
-		final Object input = new Object();
-		initContentProvider(new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return target == input ? elements : null;
-			}
-		});
-
-		assertTrue(Arrays.equals(new Object[0], contentProvider
-				.getElements("unknown input")));
-
-		Object element0 = new Object();
-		elements.add(element0);
-
-		assertTrue(Arrays.equals(new Object[] { element0 }, contentProvider
-				.getElements(input)));
-
-		Object element1 = new Object();
-		elements.add(element1);
-
-		List elementList = Arrays.asList(contentProvider.getElements(input));
-		assertEquals(2, elementList.size());
-		assertTrue(elementList.containsAll(Arrays.asList(new Object[] {
-				element0, element1 })));
-	}
-
-	public void testViewerUpdate_RemoveElementAfterMutation() {
-		IElementComparer comparer = new IElementComparer() {
-			public boolean equals(Object a, Object b) {
-				return a == b;
-			}
-
-			public int hashCode(Object element) {
-				return System.identityHashCode(element);
-			}
-		};
-		viewer.setComparer(comparer);
-
-		final IObservableSet children = ObservableViewerElementSet
-				.withComparer(Realm.getDefault(), null, comparer);
-		initContentProvider(new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				return target == input ? children : null;
-			}
-		});
-
-		Mutable element = new Mutable();
-		children.add(element);
-		assertEquals(1, tree.getItemCount());
-
-		element.mutate();
-		assertTrue(children.remove(element));
-		assertEquals(0, tree.getItemCount());
-	}
-
-	static class Mutable {
-		private int id;
-
-		public Mutable() {
-			this(0);
-		}
-
-		public Mutable(int id) {
-			this.id = id;
-		}
-
-		public void mutate() {
-			id++;
-		}
-
-		public boolean equals(Object obj) {
-			if (obj == this)
-				return true;
-			if (obj == null)
-				return false;
-			if (getClass() != obj.getClass())
-				return false;
-			Mutable that = (Mutable) obj;
-			return this.id == that.id;
-		}
-
-		public int hashCode() {
-			return id;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableValueEditingSupportTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableValueEditingSupportTest.java
deleted file mode 100644
index 6760026..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ObservableValueEditingSupportTest.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 146397
- *******************************************************************************/
-
-package org.eclipse.jface.tests.databinding.viewers;
-
-import org.eclipse.core.databinding.Binding;
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IDisposeListener;
-import org.eclipse.core.databinding.observable.IStaleListener;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.map.IObservableMap;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.tests.internal.databinding.beans.Bean;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.databinding.viewers.ObservableValueEditingSupport;
-import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-public class ObservableValueEditingSupportTest extends AbstractSWTTestCase {
-	private Shell shell;
-
-	private ObservableValueEditingSupportStub editingSupport;
-
-	private DataBindingContext dbc;
-
-	private TableViewer viewer;
-
-	private Bean bean;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.databinding.AbstractSWTTestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		shell = getShell();
-		dbc = new DataBindingContext();
-
-		viewer = new TableViewer(shell);
-		TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
-
-		// Create a standard content provider
-		ObservableListContentProvider peopleViewerContentProvider = new ObservableListContentProvider();
-		viewer.setContentProvider(peopleViewerContentProvider);
-
-		// And a standard label provider that maps columns
-		IObservableMap[] attributeMaps = BeansObservables.observeMaps(
-				peopleViewerContentProvider.getKnownElements(), Bean.class,
-				new String[] { "value" });
-		viewer.setLabelProvider(new ObservableMapLabelProvider(attributeMaps));
-
-		editingSupport = new ObservableValueEditingSupportStub(viewer, dbc);
-		column.setEditingSupport(editingSupport);
-
-		WritableList input = WritableList.withElementType(String.class);
-		bean = new Bean();
-		bean.setValue("value");
-		input.add(bean);
-		viewer.setInput(input);
-	}
-
-	public void testInitializeCellEditorValue_OrderOfOperations()
-			throws Exception {
-		assertEquals("precondition", 0, editingSupport.events.length());
-
-		viewer.editElement(bean, 0);
-		assertEquals(
-				"createCellEditorObservable createElementObservable createBinding",
-				editingSupport.events.toString());
-	}
-
-	public void testSaveCellEditorValue_UpdatesModel() throws Exception {
-		Text text = new Text(shell, SWT.NONE);
-		shell.open();
-
-		String newValue = bean.getValue() + "a";
-
-		viewer.editElement(bean, 0);
-		editingSupport.editor.setValue(newValue);
-
-		// force the focus to leave the editor updating the value
-		text.setFocus();
-
-		assertEquals(newValue, bean.getValue());
-	}
-
-	public void testDisposesBinding() throws Exception {
-		Text text = new Text(shell, SWT.NONE);
-		shell.open();
-
-		viewer.editElement(bean, 0);
-		assertFalse("precondition", editingSupport.binding.isDisposed());
-
-		text.setFocus();
-		assertTrue(editingSupport.binding.isDisposed());
-	}
-
-	public void testDisposesTargetObservable() throws Exception {
-		Text text = new Text(shell, SWT.NONE);
-		shell.open();
-
-		viewer.editElement(bean, 0);
-		assertEquals("precondition", 0, editingSupport.target.disposed);
-
-		text.setFocus();
-		assertEquals(1, editingSupport.target.disposed);
-	}
-
-	public void testDisposesModelObservable() throws Exception {
-		Text text = new Text(shell, SWT.NONE);
-		shell.open();
-
-		viewer.editElement(bean, 0);
-		assertEquals("precondition", 0, editingSupport.model.disposed);
-
-		text.setFocus();
-		assertEquals(1, editingSupport.model.disposed);
-	}
-
-	public void testCanEdit_DefaultIsTrue() throws Exception {
-		assertTrue(editingSupport.canEdit(bean));
-	}
-
-	private static class ObservableValueEditingSupportStub extends
-			ObservableValueEditingSupport {
-		StringBuffer events = new StringBuffer();
-
-		TextCellEditor editor;
-
-		Binding binding;
-
-		ObservableValueDecorator target;
-
-		ObservableValueDecorator model;
-
-		/**
-		 * @param viewer
-		 * @param dbc
-		 */
-		public ObservableValueEditingSupportStub(ColumnViewer viewer,
-				DataBindingContext dbc) {
-			super(viewer, dbc);
-			editor = new TextCellEditor((Composite) viewer.getControl());
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.databinding.viewers.ObservableValueEditingSupport#canEdit(java.lang.Object)
-		 */
-		protected boolean canEdit(Object element) {
-			return super.canEdit(element);
-		}
-
-		public CellEditor getCellEditor() {
-			return editor;
-		}
-
-		private void event(String event) {
-			if (events.length() > 0) {
-				events.append(" ");
-			}
-
-			events.append(event);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.databinding.viewers.ObservableValueEditingSupport#createCellEditorObservable(org.eclipse.jface.viewers.CellEditor)
-		 */
-		protected IObservableValue doCreateCellEditorObservable(
-				CellEditor cellEditor) {
-			event("createCellEditorObservable");
-
-			return target = new ObservableValueDecorator(SWTObservables
-					.observeText(cellEditor.getControl(), SWT.NONE));
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.databinding.viewers.ObservableValueEditingSupport#createElementObservable(java.lang.Object,
-		 *      org.eclipse.jface.viewers.ViewerCell)
-		 */
-		protected IObservableValue doCreateElementObservable(Object element,
-				ViewerCell cell) {
-			event("createElementObservable");
-			return model = new ObservableValueDecorator(BeansObservables
-					.observeValue(element, "value"));
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.databinding.viewers.ObservableValueEditingSupport#createBinding(org.eclipse.core.databinding.observable.value.IObservableValue,
-		 *      org.eclipse.core.databinding.observable.value.IObservableValue)
-		 */
-		protected Binding createBinding(IObservableValue target,
-				IObservableValue model) {
-			event("createBinding");
-
-			return binding = super.createBinding(target, model);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.EditingSupport#getCellEditor(java.lang.Object)
-		 */
-		protected CellEditor getCellEditor(Object element) {
-			return editor;
-		}
-	}
-
-	/**
-	 * Decorator that will allow for tracking calls to dispose(). We really need
-	 * an isDisposed() method on IObservable...
-	 */
-	private static class ObservableValueDecorator implements IObservableValue {
-		int disposed;
-
-		IObservableValue delegate;
-
-		ObservableValueDecorator(IObservableValue delegate) {
-			this.delegate = delegate;
-		}
-
-		public boolean isDisposed() {
-			return disposed > 0;
-		}
-
-		public synchronized void dispose() {
-			disposed++;
-			delegate.dispose();
-		}
-
-		public void addChangeListener(IChangeListener listener) {
-			delegate.addChangeListener(listener);
-		}
-
-		public void addDisposeListener(IDisposeListener listener) {
-			delegate.addDisposeListener(listener);
-		}
-
-		public void addStaleListener(IStaleListener listener) {
-			delegate.addStaleListener(listener);
-		}
-
-		public void addValueChangeListener(IValueChangeListener listener) {
-			delegate.addValueChangeListener(listener);
-		}
-
-		public Realm getRealm() {
-			return delegate.getRealm();
-		}
-
-		public Object getValue() {
-			return delegate.getValue();
-		}
-
-		public Object getValueType() {
-			return delegate.getValueType();
-		}
-
-		public boolean isStale() {
-			return delegate.isStale();
-		}
-
-		public void removeChangeListener(IChangeListener listener) {
-			delegate.removeChangeListener(listener);
-		}
-
-		public void removeDisposeListener(IDisposeListener listener) {
-			delegate.removeDisposeListener(listener);
-		}
-
-		public void removeStaleListener(IStaleListener listener) {
-			delegate.removeStaleListener(listener);
-		}
-
-		public void removeValueChangeListener(IValueChangeListener listener) {
-			delegate.removeValueChangeListener(listener);
-		}
-
-		public void setValue(Object value) {
-			delegate.setValue(value);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ViewersObservablesTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ViewersObservablesTest.java
deleted file mode 100644
index 56d24ef..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/viewers/ViewersObservablesTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 206839)
- ******************************************************************************/
-
-package org.eclipse.jface.tests.databinding.viewers;
-
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.internal.databinding.viewers.ViewerInputObservableValue;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Tests for ViewersObservables
- * 
- * @since 1.2
- */
-public class ViewersObservablesTest extends AbstractDefaultRealmTestCase {
-	TableViewer viewer;
-	Realm realm;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		realm = SWTObservables.getRealm(Display.getCurrent());
-		Shell shell = new Shell();
-		viewer = new TableViewer(shell, SWT.NONE);
-	}
-
-	protected void tearDown() throws Exception {
-		Shell shell = viewer.getTable().getShell();
-		if (!shell.isDisposed())
-			shell.dispose();
-		shell = null;
-		realm = null;
-		super.tearDown();
-	}
-
-	public void testObserveInput_InstanceOfViewerInputObservableValue() {
-		IObservableValue observable = ViewersObservables.observeInput(viewer);
-		assertTrue(observable instanceof ViewerInputObservableValue);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/wizard/WizardPageSupportTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/wizard/WizardPageSupportTest.java
deleted file mode 100644
index 7129235..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/wizard/WizardPageSupportTest.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ovidio Mallo and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Ovidio Mallo - initial API and implementation (bug 235195)
- *     Ovidio Mallo - bug 237856
- ******************************************************************************/
-
-package org.eclipse.jface.tests.databinding.wizard;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.ValidationStatusProvider;
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.ObservableTracker;
-import org.eclipse.core.databinding.observable.Observables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.databinding.validation.ValidationStatus;
-import org.eclipse.core.internal.commands.util.Util;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.databinding.wizard.WizardPageSupport;
-import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * @since 1.2
- */
-public class WizardPageSupportTest extends AbstractSWTTestCase {
-
-	/**
-	 * Bug 235195.
-	 */
-	public void testPageComplete() {
-		IWizardPage page = new WizardPage("Page") {
-			public void createControl(Composite parent) {
-				setControl(parent);
-
-				IObservableValue validation = new WritableValue(
-						ValidationStatus.ok(), IStatus.class);
-
-				DataBindingContext dbc = new DataBindingContext();
-				ValidationProvider validationProvider = new ValidationProvider(
-						validation);
-				dbc.addValidationStatusProvider(validationProvider);
-
-				WizardPageSupport.create(this, dbc);
-
-				assertTrue(isPageComplete());
-
-				validation.setValue(ValidationStatus.info("INFO"));
-				assertTrue(isPageComplete());
-
-				validation.setValue(ValidationStatus.warning("WARNING"));
-				assertTrue(isPageComplete());
-
-				validation.setValue(ValidationStatus.error("ERROR"));
-				assertFalse(isPageComplete());
-
-				validation.setValue(ValidationStatus.cancel("CANCEL"));
-				assertFalse(isPageComplete());
-			}
-		};
-
-		loadWizardPage(page);
-	}
-
-	public void testPageCompleteOnValidationStaleness() {
-		IWizardPage page = new WizardPage("Page") {
-			public void createControl(Composite parent) {
-				setControl(parent);
-
-				ValidationObservable validation = new ValidationObservable();
-
-				DataBindingContext dbc = new DataBindingContext();
-				dbc.addValidationStatusProvider(new ValidationProvider(
-						validation));
-
-				WizardPageSupport.create(this, dbc);
-
-				assertTrue(isPageComplete());
-
-				validation.setStale(true);
-				assertFalse(isPageComplete());
-
-				validation.setStale(false);
-				assertTrue(isPageComplete());
-			}
-		};
-
-		loadWizardPage(page);
-	}
-
-	private void loadWizardPage(IWizardPage page) {
-		Wizard wizard = new Wizard() {
-			public boolean performFinish() {
-				return true;
-			}
-		};
-		wizard.addPage(page);
-
-		WizardDialog dialog = new WizardDialog(getShell(), wizard);
-		dialog.create();
-	}
-
-	private static class ValidationObservable extends AbstractObservableValue {
-
-		private Object value = ValidationStatus.ok();
-
-		private boolean stale = false;
-
-		public ValidationObservable() {
-			super(Realm.getDefault());
-		}
-
-		protected Object doGetValue() {
-			return value;
-		}
-
-		protected void doSetValue(Object value) {
-			Object oldValue = this.value;
-			this.value = value;
-			if (!Util.equals(oldValue, value)) {
-				fireValueChange(Diffs.createValueDiff(oldValue, value));
-			}
-		}
-
-		public boolean isStale() {
-			ObservableTracker.getterCalled(this);
-			return stale;
-		}
-
-		public void setStale(boolean stale) {
-			if (this.stale != stale) {
-				this.stale = stale;
-				if (stale) {
-					fireStale();
-				} else {
-					fireValueChange(Diffs.createValueDiff(value, value));
-				}
-			}
-		}
-
-		public Object getValueType() {
-			return IStatus.class;
-		}
-	}
-
-	private static class ValidationProvider extends ValidationStatusProvider {
-
-		private final IObservableValue validation;
-
-		public ValidationProvider(IObservableValue validation) {
-			this.validation = validation;
-		}
-
-		public IObservableValue getValidationStatus() {
-			return validation;
-		}
-
-		public IObservableList getTargets() {
-			return Observables.emptyObservableList();
-		}
-
-		public IObservableList getModels() {
-			return Observables.emptyObservableList();
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/examples/databinding/mask/internal/EditMaskLexerAndTokenTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/examples/databinding/mask/internal/EditMaskLexerAndTokenTest.java
deleted file mode 100755
index 040ae6c..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/examples/databinding/mask/internal/EditMaskLexerAndTokenTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.examples.databinding.mask.internal;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.examples.databinding.mask.internal.EditMaskLexerAndToken;
-
-public class EditMaskLexerAndTokenTest extends TestCase {
-
-	private EditMaskLexerAndToken token;
-	
-	protected void setUp() throws Exception {
-		token = new EditMaskLexerAndToken();
-	}
-
-	public void testInitWithNumeric() throws Exception {
-		token.initializeEditMask("#", 0);
-		assertTrue("Should accept a digit", token.accept("0"));
-		token.clear();
-		assertTrue("Should accept a digit", token.accept("1"));
-		token.clear();
-		assertTrue("Should accept a digit", token.accept("2"));
-		token.clear();
-		assertTrue("Should accept a digit", token.accept("3"));
-		token.clear();
-		assertTrue("Should accept a digit", token.accept("4"));
-		token.clear();
-		assertTrue("Should accept a digit", token.accept("5"));
-		token.clear();
-		assertTrue("Should accept a digit", token.accept("6"));
-		token.clear();
-		assertTrue("Should accept a digit", token.accept("7"));
-		token.clear();
-		assertTrue("Should accept a digit", token.accept("8"));
-		token.clear();
-		assertTrue("Should accept a digit", token.accept("9"));
-		token.clear();
-		assertFalse("Should not accept an alpha", token.accept("A"));
-		token.clear();
-		assertFalse("Should not accept an alpha", token.accept("z"));
-		assertFalse("Placeholders are not read-only", token.isReadOnly());
-	}
-	
-	public void testInitWithLiteral() throws Exception {
-		token.initializeEditMask("(", 0);
-		assertEquals("Literals automatically set their input", "(", token.getInput());
-		assertFalse("Literals don't accept anything", token.accept("("));
-		assertTrue("literals are read-only", token.isReadOnly());
-		assertTrue("Literals are complete", token.isComplete());
-		assertFalse("Literals cannot accept characters", token.canAcceptMoreCharacters());
-	}
-	
-	public void testInitWithBackslashLiteral() throws Exception {
-		token.initializeEditMask("\\#", 0);
-		assertEquals("Should get backslash literal", "#", token.getInput());
-	}
-	
-	public void testAcceptWithValidInputAndEmpty() throws Exception {
-		token.initializeEditMask("#", 0);
-		assertTrue("Should accept a 0", token.accept("0"));
-	}
-	
-	public void testAcceptWhenParserCannotAcceptMoreCharacters() throws Exception {
-		token.initializeEditMask("#", 0);
-		assertTrue("Should accept a 0", token.accept("0"));
-		assertFalse("Should not accept a 0 -- input full", token.accept("0"));
-	}
-	
-	public void testGetInput() throws Exception {
-		token.initializeEditMask("#", 0);
-		assertTrue("Should accept a #", token.accept("0"));
-		assertEquals(token.getInput(), "0");
-	}
-	
-	public void testClear_withNonLiteral() throws Exception {
-		token.initializeEditMask("#", 0);
-		assertTrue("Should accept a 0", token.accept("0"));
-		assertNotNull("Input should not be null", token.getInput());
-		token.clear();
-		assertNull("Input should be null after clear", token.getInput());
-	}
-	
-	public void testClear_withLiteral() throws Exception {
-		token.initializeEditMask("(", 0);
-		assertNotNull("Input should not be null", token.getInput());
-		token.clear();
-		assertNotNull("Input should still not be null after clear of read-only literal", token.getInput());
-	}
-	
-	public void testIsComplete_withNonLiteral() throws Exception {
-		token.initializeEditMask("#", 0);
-		assertFalse("should not be complete", token.isComplete());
-		token.accept("1");
-		assertTrue("should be complete", token.isComplete());
-		token.clear();
-		assertFalse("should not be complete", token.isComplete());
-	}
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/examples/databinding/mask/internal/EditMaskParserTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/examples/databinding/mask/internal/EditMaskParserTest.java
deleted file mode 100755
index 8a2ceb4..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/examples/databinding/mask/internal/EditMaskParserTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.tests.examples.databinding.mask.internal;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.examples.databinding.mask.EditMaskParseException;
-import org.eclipse.jface.examples.databinding.mask.internal.EditMaskParser;
-
-/**
- * @since 3.2
- *
- */
-public class EditMaskParserTest extends TestCase {
-
-	private EditMaskParser parser;
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		parser = new EditMaskParser("(###) ###-####");
-	}
-
-	/**
-	 * Test method for {@link org.eclipse.jface.examples.databinding.mask.internal.EditMaskParser#EditMaskParser(java.lang.String)}.
-	 */
-	public void testEditMaskParser_validMask() {
-		new EditMaskParser("(###) ###-####");
-	}
-
-	/**
-	 * Test method for {@link org.eclipse.jface.examples.databinding.mask.internal.EditMaskParser#EditMaskParser(java.lang.String)}.
-	 */
-	public void testEditMaskParser_invalidMask() {
-		try {
-			new EditMaskParser("(###) ###-####\\");
-			fail("Should have thrown exception");
-		} catch (EditMaskParseException e) {
-			// success
-		}
-	}
-
-	/**
-	 * Test method for {@link org.eclipse.jface.examples.databinding.mask.internal.EditMaskParser#setInput(java.lang.String)}.
-	 */
-	public void testSetInput() {
-		parser.setInput("63a0) 5*55-1\\212abc9");
-		assertEquals("Unformatted input", "6305551212", parser.getRawResult());
-		assertEquals("Formatted input", "(630) 555-1212", parser.getFormattedResult());
-	}
-
-	/**
-	 * Test method for {@link org.eclipse.jface.examples.databinding.mask.internal.EditMaskParser#setInput(java.lang.String)}.
-	 */
-	public void testSetInput_incomplete() {
-		parser.setInput("6a0) 5*5-1\\12");
-		assertEquals("Unformatted input", "6055112", parser.getRawResult());
-		assertEquals("Formatted input", "(605) 511-2   ", parser.getFormattedResult());
-	}
-
-	/**
-	 * Test method for {@link org.eclipse.jface.examples.databinding.mask.internal.EditMaskParser#isComplete()}.
-	 */
-	public void testIsComplete() {
-		parser.setInput("63a0) 5*55-1\\212");
-		assertTrue("complete", parser.isComplete());
-		parser.setInput("6a0) 5*5-1\\12");
-		assertFalse("incomplete", parser.isComplete());
-	}
-	
-	public void testSetPlaceholder() throws Exception {
-		parser.setInput("6a0) 5*5-1\\12");
-		assertEquals("Formatted input", "(605) 511-2   ", parser.getFormattedResult());
-		parser.setPlaceholder('_');
-		assertEquals("Formatted input", "(605) 511-2___", parser.getFormattedResult());
-	}
-
-	/**
-	 * Test method for {@link org.eclipse.jface.examples.databinding.mask.internal.EditMaskParser#getNextInputPosition(int)}.
-	 */
-	public void testGetNextInputPosition() {
-		assertEquals("Skip leading (", 1, parser.getNextInputPosition(0));
-		assertEquals("Position 1 is good", 1, parser.getNextInputPosition(1));
-		assertEquals("Skip )<space>", 6, parser.getNextInputPosition(4));
-	}
-	
-	public void testGetFirstIncompleteInputPosition() throws Exception {
-		assertEquals("1st position incomplete", 1, parser.getFirstIncompleteInputPosition());
-		parser.setInput("6a0) 5*5-1\\12");
-		assertEquals("11th position incomplete", 11, parser.getFirstIncompleteInputPosition());
-		parser.setInput("63a0) 5*55-1\\212");
-		assertEquals("all complete", -1, parser.getFirstIncompleteInputPosition());
-	}
-}
-
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/examples/model/PersonTests.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/examples/model/PersonTests.java
deleted file mode 100644
index 1c9b9c1..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/examples/model/PersonTests.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Brad Reynolds - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.tests.examples.model;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.examples.databinding.model.SimplePerson;
-
-/**
- * @since 3.2
- *
- */
-public class PersonTests extends TestCase {
-	public void testSetName() {
-		SimplePerson person = new SimplePerson();
-		Listener listener = new Listener();
-		
-		person.addPropertyChangeListener(listener);
-		assertEquals(0, listener.count);
-		assertNull(listener.lastEvent);
-		person.setState("new state"); //$NON-NLS-1$
-		
-		assertEquals(1, listener.count);
-		assertNotNull(listener.lastEvent);
-		assertEquals("state", listener.lastEvent.getPropertyName()); //$NON-NLS-1$
-		assertEquals("", listener.lastEvent.getOldValue());
-		assertEquals("new state", listener.lastEvent.getNewValue()); //$NON-NLS-1$
-		assertEquals("new state", person.getState());
-	}
-	
-	private class Listener implements PropertyChangeListener {
-		private int count;
-		private PropertyChangeEvent lastEvent;
-		
-		public void propertyChange(PropertyChangeEvent evt) {
-			count++;
-			this.lastEvent = evt;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ButtonObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ButtonObservableValueTest.java
deleted file mode 100644
index 9b84d92..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ButtonObservableValueTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Ashley Cambrell - bug 198904
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.internal.databinding.swt.ButtonObservableValue;
-import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.2
- */
-public class ButtonObservableValueTest extends AbstractSWTTestCase {
-	private Button button;
-	private ButtonObservableValue observableValue;
-	private ValueChangeEventTracker listener;
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		Shell shell = getShell();
-		button = new Button(shell, SWT.CHECK);
-		observableValue = new ButtonObservableValue(
-				button);
-		listener = new ValueChangeEventTracker();
-	}
-	
-	public void testSelection_ChangeNotifiesObservable() throws Exception {
-		observableValue.addValueChangeListener(listener);
-		button.setSelection(true);
-
-		// precondition
-		assertEquals(0, listener.count);
-		button.notifyListeners(SWT.Selection, null);
-
-		assertEquals("Selection event should notify observable.", 1,
-				listener.count);
-	}
-	
-	public void testSelection_NoChange() throws Exception {
-		button.setSelection(true);
-		button.notifyListeners(SWT.Selection, null);
-		observableValue.addValueChangeListener(listener);
-		
-		//precondition
-		assertEquals(0, listener.count);
-		
-		button.notifyListeners(SWT.Selection, null);
-		assertEquals("Value did not change.  Listeners should not have been notified.", 0, listener.count);
-	}
-	
-	public void testSetValue_NullConvertedToFalse() {
-		button.setSelection(true);
-		assertEquals(Boolean.TRUE, observableValue.getValue());
-
-		observableValue.setValue(null);
-		assertEquals(Boolean.FALSE, observableValue.getValue());
-	}
-
-	public void testDispose() throws Exception {
-		ValueChangeEventTracker testCounterValueChangeListener = new ValueChangeEventTracker();
-		observableValue.addValueChangeListener(testCounterValueChangeListener);
-
-		assertEquals(Boolean.FALSE, observableValue.getValue());
-		assertFalse(button.getSelection());
-
-		button.setSelection(true);
-		button.notifyListeners(SWT.Selection, null);
-
-		assertEquals(1, testCounterValueChangeListener.count);
-		assertEquals(Boolean.TRUE, observableValue.getValue());
-		assertTrue(button.getSelection());
-
-		observableValue.dispose();
-
-		button.setSelection(false);
-		button.notifyListeners(SWT.Selection, null);
-
-		assertEquals(1, testCounterValueChangeListener.count);
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ButtonObservableValueTest.class.getName());
-		suite.addTestSuite(ButtonObservableValueTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		Shell shell;
-
-		Button button;
-
-		public void setUp() {
-			super.setUp();
-
-			shell = new Shell();
-			button = new Button(shell, SWT.CHECK);
-		}
-
-		public void tearDown() {
-			super.tearDown();
-
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new ButtonObservableValue(realm, button);
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return Boolean.TYPE;
-		}
-
-		public void change(IObservable observable) {
-			button.setSelection(changeValue(button));
-			button.notifyListeners(SWT.Selection, null);
-		}
-		
-		public Object createValue(IObservableValue observable) {
-			return Boolean.valueOf(changeValue(button));
-		}
-		
-		private boolean changeValue(Button button) {
-			return !button.getSelection();
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/CComboObservableValueSelectionTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/CComboObservableValueSelectionTest.java
deleted file mode 100644
index dc48c2a..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/CComboObservableValueSelectionTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.databinding.swt.ISWTObservable;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.swt.CComboObservableValue;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.2
- */
-public class CComboObservableValueSelectionTest extends TestCase {
-	private Delegate delegate;
-
-	private CCombo combo;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		delegate = new Delegate();
-		delegate.setUp();
-		combo = delegate.combo;
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-
-		delegate.tearDown();
-	}
-
-	public void testSelection_NotifiesObservable() throws Exception {
-		IObservableValue observable = (IObservableValue) delegate
-				.createObservable(SWTObservables.getRealm(Display.getDefault()));
-
-		ValueChangeEventTracker listener = ValueChangeEventTracker.observe(observable);
-		combo.select(0);
-
-		assertEquals("Observable was not notified.", 1, listener.count);
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(CComboObservableValueSelectionTest.class.getName());
-		suite.addTestSuite(CComboObservableValueSelectionTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Shell shell;
-
-		/* package */CCombo combo;
-
-		public void setUp() {
-			shell = new Shell();
-			combo = new CCombo(shell, SWT.NONE);
-			combo.add("a");
-			combo.add("b");
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new CComboObservableValue(realm, combo,
-					SWTProperties.SELECTION);
-		}
-
-		public void change(IObservable observable) {
-			int index = combo
-					.indexOf((String) createValue((IObservableValue) observable));
-
-			combo.select(index);
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return String.class;
-		}
-
-		public Object createValue(IObservableValue observable) {
-			CCombo combo = ((CCombo) ((ISWTObservable) observable).getWidget());
-			switch (combo.getSelectionIndex()) {
-			case -1:
-				// fall thru
-			case 1:
-				return combo.getItem(0);
-			case 0:
-				return combo.getItem(1);
-			default:
-				throw new RuntimeException("Unexpected selection.");
-			}
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/CComboObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/CComboObservableValueTest.java
deleted file mode 100644
index e89fe42..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/CComboObservableValueTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Ashley Cambrell - bug 198904
- *     Eric Rizzo - bug 134884
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.internal.databinding.swt.CComboObservableValue;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-
-/**
- * @since 3.2
- */
-public class CComboObservableValueTest extends AbstractSWTTestCase {
-	public void testDispose() throws Exception {
-		CCombo combo = new CCombo(getShell(), SWT.NONE);
-		CComboObservableValue observableValue = new CComboObservableValue(
-				combo, SWTProperties.TEXT);
-
-		ValueChangeEventTracker testCounterValueChangeListener = new ValueChangeEventTracker();
-		observableValue.addValueChangeListener(testCounterValueChangeListener);
-
-		assertEquals("", combo.getText());
-		assertEquals("", observableValue.getValue());
-
-		String expected1 = "Test123";
-		combo.setText(expected1);
-
-		assertEquals(1, testCounterValueChangeListener.count);
-		assertEquals(expected1, combo.getText());
-		assertEquals(expected1, observableValue.getValue());
-
-		observableValue.dispose();
-
-		String expected2 = "NewValue123";
-		combo.setText(expected2);
-
-		assertEquals(1, testCounterValueChangeListener.count);
-		assertEquals(expected2, combo.getText());
-	}
-
-	public void testSetValueWithNull() {
-		testSetValueWithNull(SWTProperties.TEXT);
-		testSetValueWithNull(SWTProperties.SELECTION);
-	}
-
-	protected void testSetValueWithNull(String observableMode) {
-		CCombo combo = new CCombo(getShell(), SWT.NONE);
-		combo.setItems(new String[] {"one", "two", "three"});
-		CComboObservableValue observable = new CComboObservableValue(
-				combo, observableMode);
-
-		observable.doSetValue("two");
-		assertEquals("two", combo.getText());
-		assertEquals(1, combo.getSelectionIndex());
-
-		observable.doSetValue(null);
-		assertEquals("", combo.getText());
-		assertEquals(-1, combo.getSelectionIndex());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/CComboObservableValueTextTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/CComboObservableValueTextTest.java
deleted file mode 100644
index 246879f..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/CComboObservableValueTextTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.databinding.swt.ISWTObservable;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.swt.CComboObservableValue;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.2
- */
-public class CComboObservableValueTextTest extends TestCase {
-	private Delegate delegate;
-
-	private CCombo combo;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		delegate = new Delegate();
-		delegate.setUp();
-		combo = delegate.combo;
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-
-		delegate.tearDown();
-	}
-
-	public void testModify_NotifiesObservable() throws Exception {
-		IObservableValue observable = delegate
-				.createObservableValue(SWTObservables.getRealm(Display
-						.getDefault()));
-		ValueChangeEventTracker listener = ValueChangeEventTracker
-				.observe(observable);
-
-		combo.setText((String) delegate.createValue(observable));
-
-		assertEquals("Observable was not notified.", 1, listener.count);
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(CComboObservableValueTextTest.class.getName());
-		suite.addTestSuite(CComboObservableValueTextTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		/* package */CCombo combo;
-
-		private Shell shell;
-
-		public void setUp() {
-			shell = new Shell();
-			combo = new CCombo(shell, SWT.NONE);
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new CComboObservableValue(realm, combo, SWTProperties.TEXT);
-		}
-
-		public void change(IObservable observable) {
-			CCombo combo = (CCombo) ((ISWTObservable) observable).getWidget();
-			combo.setText(combo.getText() + "a");
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return String.class;
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return observable.getValue() + "a";
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/CComboSingleSelectionObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/CComboSingleSelectionObservableValueTest.java
deleted file mode 100644
index 36d0bc7..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/CComboSingleSelectionObservableValueTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Ashley Cambrell - bug 198903
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.swt.ISWTObservable;
-import org.eclipse.jface.internal.databinding.swt.CComboSingleSelectionObservableValue;
-import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.2
- */
-public class CComboSingleSelectionObservableValueTest extends AbstractSWTTestCase {
-	public void testSetValue() throws Exception {
-		CCombo combo = new CCombo(getShell(), SWT.NONE);
-		CComboSingleSelectionObservableValue observableValue = new CComboSingleSelectionObservableValue(
-				combo);
-		combo.add("Item1");
-		combo.add("Item2");
-
-		assertEquals(-1, combo.getSelectionIndex());
-		assertEquals(-1, ((Integer) observableValue.getValue()).intValue());
-
-		Integer value = new Integer(1);
-		observableValue.setValue(value);
-		assertEquals("combo selection index", value.intValue(), combo
-				.getSelectionIndex());
-		assertEquals("observable value", value, observableValue.getValue());
-
-		assertEquals("Item2", combo.getText());
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(CComboSingleSelectionObservableValueTest.class.getName());
-		suite.addTestSuite(CComboSingleSelectionObservableValueTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private CCombo combo;
-		private Shell shell;
-
-		public void setUp() {
-			shell = new Shell();
-			combo = new CCombo(shell, SWT.NONE);
-			combo.add("0");
-			combo.add("1");
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new CComboSingleSelectionObservableValue(realm, combo);
-		}
-
-		public void change(IObservable observable) {
-			int index = _createValue((IObservableValue) observable);
-			combo.select(index);
-			combo.notifyListeners(SWT.Selection, null);
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return Integer.TYPE;
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return new Integer(_createValue(observable));
-		}
-		
-		private int _createValue(IObservableValue observable) {
-			CCombo combo = ((CCombo) ((ISWTObservable) observable).getWidget());
-			int value = Math.max(0, combo.getSelectionIndex());
-			
-			//returns either 0 or 1 depending upon current value
-			return Math.abs(value - 1);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/CLabelObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/CLabelObservableValueTest.java
deleted file mode 100644
index abdf4e4..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/CLabelObservableValueTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.swt.CLabelObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.2
- * 
- */
-public class CLabelObservableValueTest extends TestCase {
-	private Delegate delegate;
-	private IObservableValue observable;
-	private CLabel label;
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		delegate = new Delegate();
-		delegate.setUp();
-		label = delegate.label;
-		observable = delegate.createObservableValue(SWTObservables.getRealm(Display.getDefault()));
-	}
-	
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		
-		delegate.tearDown();
-		observable.dispose();
-	}
-	
-    public void testSetValue() throws Exception {
-    	//preconditions
-        assertEquals(null, label.getText());
-        assertEquals(null, observable.getValue());
-        
-        String value = "value";
-        observable.setValue(value);
-        assertEquals("label text", value, label.getText());
-        assertEquals("observable value", value, observable.getValue());
-    }
-	
-	public static Test suite() {
-		TestSuite suite = new TestSuite(CLabelObservableValueTest.class.getName());
-		suite.addTestSuite(CLabelObservableValueTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Shell shell;
-
-		CLabel label;
-
-		public void setUp() {
-			shell = new Shell();
-			label = new CLabel(shell, SWT.NONE);
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new CLabelObservableValue(realm, label);
-		}
-
-		public void change(IObservable observable) {
-			IObservableValue value = (IObservableValue) observable;
-			value.setValue(value.getValue() + "a");
-		}
-		
-		public Object getValueType(IObservableValue observable) {
-			return String.class;
-		}
-		
-		public Object createValue(IObservableValue observable) {
-			return observable.getValue() + "a";
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ComboObservableValueSelectionTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ComboObservableValueSelectionTest.java
deleted file mode 100644
index 48d431d..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ComboObservableValueSelectionTest.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.databinding.swt.ISWTObservable;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.swt.ComboObservableValue;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.2
- *
- */
-public class ComboObservableValueSelectionTest extends TestCase {
-	private Delegate delegate;
-
-	private Combo combo;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		delegate = new Delegate();
-		delegate.setUp();
-		combo = delegate.combo;
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-
-		delegate.tearDown();
-	}
-
-	public void testSelection_NotifiesObservable() throws Exception {
-		IObservableValue observable = (IObservableValue) delegate
-				.createObservable(SWTObservables.getRealm(Display.getDefault()));
-
-		ValueChangeEventTracker listener = ValueChangeEventTracker
-				.observe(observable);
-		combo.select(0);
-		combo.notifyListeners(SWT.Selection, null);
-
-		assertEquals("Observable was not notified.", 1, listener.count);
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ComboObservableValueSelectionTest.class.toString());
-		suite.addTestSuite(ComboObservableValueSelectionTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Shell shell;
-
-		/* package */Combo combo;
-
-		public void setUp() {
-			shell = new Shell();
-			combo = new Combo(shell, SWT.NONE);
-			combo.add("a");
-			combo.add("b");
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new ComboObservableValue(realm, combo,
-					SWTProperties.SELECTION);
-		}
-
-		public void change(IObservable observable) {
-			int index = combo
-					.indexOf((String) createValue((IObservableValue) observable));
-
-			combo.select(index);
-			combo.notifyListeners(SWT.Selection, null);
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return String.class;
-		}
-
-		public Object createValue(IObservableValue observable) {
-			Combo combo = ((Combo) ((ISWTObservable) observable).getWidget());
-			switch (combo.getSelectionIndex()) {
-			case -1:
-				// fall thru
-			case 1:
-				return combo.getItem(0);
-			case 0:
-				return combo.getItem(1);
-			default:
-				throw new RuntimeException("Unexpected selection.");
-			}
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ComboObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ComboObservableValueTest.java
deleted file mode 100644
index 0423bb2..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ComboObservableValueTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Ashley Cambrell - bug 198904
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.internal.databinding.swt.ComboObservableValue;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Combo;
-
-/**
- * @since 3.2
- * @no
- */
-public class ComboObservableValueTest extends AbstractSWTTestCase {
-	public void testDispose() throws Exception {
-		Combo combo = new Combo(getShell(), SWT.NONE);
-		ComboObservableValue observableValue = new ComboObservableValue(combo,
-				SWTProperties.TEXT);
-		ValueChangeEventTracker testCounterValueChangeListener = new ValueChangeEventTracker();
-		observableValue.addValueChangeListener(testCounterValueChangeListener);
-
-		assertEquals("", combo.getText());
-		assertEquals("", observableValue.getValue());
-
-		String expected1 = "Test123";
-		combo.setText(expected1);
-
-		assertEquals(1, testCounterValueChangeListener.count);
-		assertEquals(expected1, combo.getText());
-		assertEquals(expected1, observableValue.getValue());
-
-		observableValue.dispose();
-
-		String expected2 = "NewValue123";
-		combo.setText(expected2);
-
-		assertEquals(1, testCounterValueChangeListener.count);
-		assertEquals(expected2, combo.getText());
-	}
-
-	public void testSetValueWithNull() {
-		testSetValueWithNull(SWTProperties.TEXT);
-		testSetValueWithNull(SWTProperties.SELECTION);
-	}
-
-	protected void testSetValueWithNull(String observableMode) {
-		Combo combo = new Combo(getShell(), SWT.NONE);
-		combo.setItems(new String[] {"one", "two", "three"});
-		ComboObservableValue observable = new ComboObservableValue(
-				combo, observableMode);
-
-		observable.doSetValue("two");
-		assertEquals("two", combo.getText());
-		if (observableMode.equals(SWTProperties.SELECTION)) {
-			assertEquals("expect selection at index 1 in mode " + observableMode, 1, combo.getSelectionIndex());
-		}
-
-		if (observableMode.equals(SWTProperties.TEXT)) {
-			observable.doSetValue(null);
-			assertEquals("expect empty text in mode " + observableMode, "", combo.getText());
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ComboObservableValueTextTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ComboObservableValueTextTest.java
deleted file mode 100644
index 5b73771..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ComboObservableValueTextTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.databinding.swt.ISWTObservable;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.swt.ComboObservableValue;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.2
- * 
- */
-public class ComboObservableValueTextTest extends TestCase {
-	private Delegate delegate;
-
-	private Combo combo;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		delegate = new Delegate();
-		delegate.setUp();
-		combo = delegate.combo;
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-
-		delegate.tearDown();
-	}
-
-	public void testModify_NotifiesObservable() throws Exception {
-		IObservableValue observable = delegate
-				.createObservableValue(SWTObservables.getRealm(Display
-						.getDefault()));
-		ValueChangeEventTracker listener = ValueChangeEventTracker
-				.observe(observable);
-
-		combo.setText((String) delegate.createValue(observable));
-
-		assertEquals("Observable was not notified.", 1, listener.count);
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ComboObservableValueTextTest.class.toString());
-		suite.addTestSuite(ComboObservableValueTextTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		/* package */Combo combo;
-
-		private Shell shell;
-
-		public void setUp() {
-			shell = new Shell();
-			combo = new Combo(shell, SWT.NONE);
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new ComboObservableValue(realm, combo, SWTProperties.TEXT);
-		}
-
-		public void change(IObservable observable) {
-			Combo combo = (Combo) ((ISWTObservable) observable).getWidget();
-			combo.setText(combo.getText() + "a");
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return String.class;
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return observable.getValue() + "a";
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ComboSingleSelectionObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ComboSingleSelectionObservableValueTest.java
deleted file mode 100644
index b8b3154..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ComboSingleSelectionObservableValueTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Ashley Cambrell and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Ashley Cambrell - initial API and implementation (bug 198903)
- ******************************************************************************/
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import org.eclipse.jface.internal.databinding.swt.ComboSingleSelectionObservableValue;
-import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Combo;
-
-/**
- * @since 3.2
- *
- */
-public class ComboSingleSelectionObservableValueTest extends
-		AbstractSWTTestCase {
-	public void testSetValue() throws Exception {
-		Combo combo = new Combo(getShell(), SWT.NONE);
-		ComboSingleSelectionObservableValue observableValue = new ComboSingleSelectionObservableValue(
-				combo);
-		combo.add("Item1");
-		combo.add("Item2");
-
-		assertEquals(-1, combo.getSelectionIndex());
-		assertEquals(-1, ((Integer) observableValue.getValue()).intValue());
-
-		Integer value = new Integer(1);
-		observableValue.setValue(value);
-		assertEquals("combo selection index", value.intValue(), combo
-				.getSelectionIndex());
-		assertEquals("observable value", value, observableValue.getValue());
-
-		assertEquals("Item2", combo.getText());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ControlObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ControlObservableValueTest.java
deleted file mode 100644
index 9e9db62..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ControlObservableValueTest.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Brad Reynolds - bug 170848
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import org.eclipse.jface.internal.databinding.swt.ControlObservableValue;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.2
- * 
- */
-public class ControlObservableValueTest extends AbstractDefaultRealmTestCase {
-	private Shell shell;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		shell = new Shell();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		if (shell != null && !shell.isDisposed()) {
-			shell.dispose();
-			shell = null;
-		}
-	}
-
-	public void testSetValueEnabled() throws Exception {
-		ControlObservableValue observableValue = new ControlObservableValue(
-				shell, SWTProperties.ENABLED);
-		Boolean value = Boolean.FALSE;
-		observableValue.setValue(value);
-		assertFalse(shell.isEnabled());
-	}
-
-	public void testGetValueEnabled() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.ENABLED);
-		shell.setEnabled(false);
-		assertEquals(Boolean.FALSE, value.getValue());
-	}
-
-	public void testGetValueTypeEnabled() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.ENABLED);
-		assertEquals(boolean.class, value.getValueType());
-	}
-
-	public void testSetValueVisible() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.VISIBLE);
-		value.setValue(Boolean.FALSE);
-		assertFalse(shell.isVisible());
-	}
-
-	public void testGetValueVisible() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.VISIBLE);
-		shell.setVisible(false);
-		assertEquals(Boolean.FALSE, value.getValue());
-	}
-
-	public void testGetValueTypeVisible() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.VISIBLE);
-		assertEquals(Boolean.TYPE, value.getValueType());
-	}
-
-	public void testSetValueForeground() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.FOREGROUND);
-
-		Color color = shell.getDisplay().getSystemColor(SWT.COLOR_BLACK);
-
-		value.setValue(color);
-		assertEquals(color, shell.getForeground());
-	}
-
-	public void testGetValueForeground() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.FOREGROUND);
-
-		Color color = shell.getDisplay().getSystemColor(SWT.COLOR_BLACK);
-		shell.setForeground(color);
-		assertEquals(color, value.getValue());
-	}
-
-	public void testGetValueTypeForgroundColor() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.FOREGROUND);
-		assertEquals(Color.class, value.getValueType());
-	}
-
-	public void testGetValueBackground() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.BACKGROUND);
-
-		Color color = shell.getDisplay().getSystemColor(SWT.COLOR_BLACK);
-		shell.setBackground(color);
-		assertEquals(color, value.getValue());
-	}
-
-	public void testSetValueBackground() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.BACKGROUND);
-
-		Color color = shell.getDisplay().getSystemColor(SWT.COLOR_BLACK);
-
-		value.setValue(color);
-		assertEquals(color, shell.getBackground());
-	}
-
-	public void testGetValueTypeBackgroundColor() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.BACKGROUND);
-		assertEquals(Color.class, value.getValueType());
-	}
-
-	public void testGetValueTypeTooltip() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.TOOLTIP_TEXT);
-		assertEquals(String.class, value.getValueType());
-	}
-
-	public void testSetValueFont() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.FONT);
-
-		Font font = JFaceResources.getDialogFont();
-
-		value.setValue(font);
-		assertEquals(font, shell.getFont());
-	}
-
-	public void testGetValueFont() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.FONT);
-
-		Font font = JFaceResources.getDialogFont();
-		shell.setFont(font);
-		assertEquals(font, value.getValue());
-	}
-
-	public void testGetValueTypeFont() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.FONT);
-		assertEquals(Font.class, value.getValueType());
-	}
-
-	public void testSetValueTooltipText() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.TOOLTIP_TEXT);
-		String text = "text";
-		value.setValue(text);
-		assertEquals(text, shell.getToolTipText());
-	}
-
-	public void testGetValueTooltipText() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.TOOLTIP_TEXT);
-		String text = "text";
-		shell.setToolTipText(text);
-		assertEquals(text, value.getValue());
-	}
-
-	public void testGetValueTypeTooltipText() throws Exception {
-		ControlObservableValue value = new ControlObservableValue(shell,
-				SWTProperties.TOOLTIP_TEXT);
-		assertEquals(String.class, value.getValueType());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/LabelObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/LabelObservableValueTest.java
deleted file mode 100644
index 55abc7e..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/LabelObservableValueTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.swt.LabelObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.2
- */
-public class LabelObservableValueTest extends ObservableDelegateTest {
-	private Delegate delegate;
-	private IObservableValue observable;
-	private Label label;
-	
-	public LabelObservableValueTest() {
-		this(null);
-	}
-	
-	public LabelObservableValueTest(String testName) {
-		super(testName, new Delegate());
-	}
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		delegate = (Delegate) getObservableContractDelegate();
-		observable = (IObservableValue) getObservable();
-		label = delegate.label;
-	}
-	
-	protected IObservable doCreateObservable() {
-		return getObservableContractDelegate().createObservable(SWTObservables.getRealm(Display.getDefault()));
-	}
-	
-    public void testSetValue() throws Exception {
-    	//preconditions
-        assertEquals("", label.getText());
-        assertEquals("", observable.getValue());
-        
-        String value = "value";
-        observable.setValue(value);
-        assertEquals("label text", value, label.getText());
-        assertEquals("observable value", value, observable.getValue());
-    }
-    
-    public static Test suite() {
-    	TestSuite suite = new TestSuite(LabelObservableValueTest.class.toString());
-    	suite.addTestSuite(LabelObservableValueTest.class);
-    	suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-    	return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Shell shell;
-
-		Label label;
-
-		public void setUp() {
-			shell = new Shell();
-			label = new Label(shell, SWT.NONE);
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new LabelObservableValue(realm, label);
-		}
-
-		public void change(IObservable observable) {
-			IObservableValue value = (IObservableValue) observable;
-			value.setValue(value.getValue() + "a");
-		}
-		
-		public Object getValueType(IObservableValue observable) {
-			return String.class;
-		}
-		
-		public Object createValue(IObservableValue observable) {
-			return observable.getValue() + "a";
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ListSingleSelectionObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ListSingleSelectionObservableValueTest.java
deleted file mode 100644
index 0bc7315..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ListSingleSelectionObservableValueTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Ashley Cambrell and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Ashley Cambrell - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import org.eclipse.jface.internal.databinding.swt.ListSingleSelectionObservableValue;
-import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.List;
-
-/**
- * @since 3.2
- *
- */
-public class ListSingleSelectionObservableValueTest extends AbstractSWTTestCase {
-	public void testSetValue() throws Exception {
-		List list = new List(getShell(), SWT.NONE);
-		ListSingleSelectionObservableValue observableValue = new ListSingleSelectionObservableValue(
-				list);
-		list.add("Item1");
-
-		assertEquals(-1, list.getSelectionIndex());
-		assertEquals(-1, ((Integer) observableValue.getValue()).intValue());
-
-		Integer value = new Integer(0);
-		observableValue.setValue(value);
-		assertEquals("list selection index", value.intValue(), list
-				.getSelectionIndex());
-		assertEquals("observable value", value, observableValue.getValue());
-	}
-
-	public void testDispose() throws Exception {
-		List list = new List(getShell(), SWT.NONE);
-		ListSingleSelectionObservableValue observableValue = new ListSingleSelectionObservableValue(
-				list);
-		list.add("Item1");
-		list.add("Item2");
-
-		assertEquals(-1, list.getSelectionIndex());
-		assertEquals(-1, ((Integer) observableValue.getValue()).intValue());
-
-		list.select(0);
-		list.notifyListeners(SWT.Selection, null);
-		assertEquals(0, list.getSelectionIndex());
-		assertEquals(new Integer(0), observableValue.getValue());
-
-		observableValue.dispose();
-
-		list.select(1);
-		list.notifyListeners(SWT.Selection, null);
-		assertEquals(1, list.getSelectionIndex());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SWTDelayedObservableValueDecoratorTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SWTDelayedObservableValueDecoratorTest.java
deleted file mode 100644
index d463506..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SWTDelayedObservableValueDecoratorTest.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007-2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 212223)
- *     Matthew Hall - bug 213145, 245647
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.databinding.swt.ISWTObservableValue;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * Tests for DelayedObservableValue
- * 
- * @since 1.2
- */
-public class SWTDelayedObservableValueDecoratorTest extends
-		AbstractDefaultRealmTestCase {
-	private Display display;
-	private Shell shell;
-	private Object oldValue;
-	private Object newValue;
-	private SWTObservableValueStub target;
-	private ISWTObservableValue delayed;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		display = Display.getCurrent();
-		shell = new Shell(display);
-		target = new SWTObservableValueStub(SWTObservables.getRealm(display),
-				shell);
-		oldValue = new Object();
-		newValue = new Object();
-		target.setValue(oldValue);
-		delayed = SWTObservables.observeDelayedValue(1, target);
-	}
-
-	protected void tearDown() throws Exception {
-		delayed.dispose();
-		target.dispose();
-		target = null;
-		shell.dispose();
-		shell = null;
-		display = null;
-		super.tearDown();
-	}
-
-	public void testFocusOut_FiresPendingValueChange() {
-		assertFiresPendingValueChange(new Runnable() {
-			public void run() {
-				// simulate focus-out event
-				shell.notifyListeners(SWT.FocusOut, new Event());
-			}
-		});
-	}
-
-	private void assertFiresPendingValueChange(Runnable runnable) {
-		ValueChangeEventTracker tracker = ValueChangeEventTracker
-				.observe(delayed);
-
-		target.setValue(newValue);
-		assertTrue(delayed.isStale());
-		assertEquals(0, tracker.count);
-
-		runnable.run();
-
-		assertFalse(delayed.isStale());
-		assertEquals(1, tracker.count);
-		assertEquals(oldValue, tracker.event.diff.getOldValue());
-		assertEquals(newValue, tracker.event.diff.getNewValue());
-	}
-
-	static class SWTObservableValueStub extends AbstractSWTObservableValue {
-		private Object value;
-		private boolean stale;
-
-		Object overrideValue;
-
-		public SWTObservableValueStub(Realm realm, Widget widget) {
-			super(realm, widget);
-		}
-
-		protected Object doGetValue() {
-			return value;
-		}
-
-		protected void doSetValue(Object value) {
-			Object oldValue = this.value;
-			if (overrideValue != null)
-				value = overrideValue;
-			this.value = value;
-			stale = false;
-			fireValueChange(Diffs.createValueDiff(oldValue, value));
-		}
-
-		public Object getValueType() {
-			return Object.class;
-		}
-
-		protected void fireStale() {
-			stale = true;
-			super.fireStale();
-		}
-
-		public boolean isStale() {
-			return stale;
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(
-				SWTDelayedObservableValueDecoratorTest.class.getName());
-		suite.addTestSuite(SWTDelayedObservableValueDecoratorTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest
-				.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableValueContractDelegate {
-		Shell shell;
-
-		public void setUp() {
-			super.setUp();
-			shell = new Shell();
-		}
-
-		public void tearDown() {
-			shell.dispose();
-			shell = null;
-			super.tearDown();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return SWTObservables.observeDelayedValue(0,
-					new SWTObservableValueStub(realm, shell));
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return Object.class;
-		}
-
-		public void change(IObservable observable) {
-			IObservableValue observableValue = (IObservableValue) observable;
-			observableValue.setValue(createValue(observableValue));
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return new Object();
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SWTObservableListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SWTObservableListTest.java
deleted file mode 100644
index fe9ee8f..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SWTObservableListTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 208858)
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.jface.databinding.conformance.MutableObservableListContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.internal.databinding.swt.SWTObservableList;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-
-/**
- * @since 3.3
- */
-public class SWTObservableListTest extends AbstractDefaultRealmTestCase {
-	SWTObservableListStub list;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		list = new SWTObservableListStub(Realm.getDefault(), 0);
-	}
-
-	public void testMove_ForwardAndBackward() {
-		String element0 = "element0";
-		String element1 = "element1";
-
-		list.add(element0);
-		list.add(element1);
-
-		// move forward
-		assertEquals(element0, list.move(0, 1));
-		assertEquals(element1, list.move(0, 1));
-
-		// move backward
-		assertEquals(element1, list.move(1, 0));
-		assertEquals(element0, list.move(1, 0));
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(SWTObservableListTest.class.toString());
-		suite.addTestSuite(SWTObservableListTest.class);
-		suite.addTest(MutableObservableListContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableCollectionContractDelegate {
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			return new SWTObservableListStub(realm, elementCount);
-		}
-
-		private int counter;
-
-		public Object createElement(IObservableCollection collection) {
-			return "Item" + counter++;
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return String.class;
-		}
-
-		public void change(IObservable observable) {
-			((SWTObservableListStub) observable).fireChange();
-		}
-	}
-
-	static class SWTObservableListStub extends SWTObservableList {
-		String[] items;
-
-		public SWTObservableListStub(Realm realm, int elementCount) {
-			super(realm);
-			items = new String[elementCount];
-			for (int i = 0; i < items.length; i++)
-				items[i] = Integer.toString(i);
-		}
-
-		protected String getItem(int index) {
-			return items[index];
-		}
-
-		protected int getItemCount() {
-			return items.length;
-		}
-
-		protected String[] getItems() {
-			return items;
-		}
-
-		protected void setItem(int index, String string) {
-			items[index] = string;
-		}
-
-		protected void setItems(String[] newItems) {
-			items = newItems;
-		}
-
-		protected void fireChange() {
-			super.fireChange();
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ScaleObservableValueMaxTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ScaleObservableValueMaxTest.java
deleted file mode 100644
index d598dcf..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ScaleObservableValueMaxTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.jface.internal.databinding.swt.ScaleObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Scale;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.2
- */
-public class ScaleObservableValueMaxTest extends ObservableDelegateTest {
-	private Delegate delegate;
-
-	private Scale scale;
-
-	private IObservableValue observable;
-
-	public ScaleObservableValueMaxTest() {
-		this(null);
-	}
-
-	public ScaleObservableValueMaxTest(String testName) {
-		super(testName, new Delegate());
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		delegate = (Delegate) getObservableContractDelegate();
-		observable = (IObservableValue) getObservable();
-		scale = delegate.scale;
-	}
-
-	protected IObservable doCreateObservable() {
-		return getObservableContractDelegate().createObservable(
-				SWTObservables.getRealm(Display.getDefault()));
-	}
-
-	public void testGetValue() throws Exception {
-		int max = 100;
-		scale.setMaximum(max);
-		assertEquals(new Integer(max), observable.getValue());
-	}
-
-	public void testSetValue() throws Exception {
-		int max = 100;
-		observable.setValue(new Integer(max));
-		assertEquals(max, scale.getMaximum());
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ScaleObservableValueMaxTest.class.toString());
-		suite.addTestSuite(ScaleObservableValueMaxTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Shell shell;
-
-		Scale scale;
-
-		public void setUp() {
-			shell = new Shell();
-			scale = new Scale(shell, SWT.NONE);
-			scale.setMaximum(1000);
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new ScaleObservableValue(realm, scale, SWTProperties.MAX);
-		}
-
-		public void change(IObservable observable) {
-			IObservableValue observableValue = (IObservableValue) observable;
-			observableValue.setValue(createValue(observableValue));
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return Integer.TYPE;
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return createIntegerValue(observable);
-		}
-
-		private Integer createIntegerValue(IObservableValue observable) {
-			return new Integer(((Integer) observable.getValue()).intValue() + 1);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ScaleObservableValueMinTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ScaleObservableValueMinTest.java
deleted file mode 100644
index f3f56dd..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ScaleObservableValueMinTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.jface.internal.databinding.swt.ScaleObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Scale;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.2
- */
-public class ScaleObservableValueMinTest extends ObservableDelegateTest {
-	private Delegate delegate;
-
-	private Scale scale;
-
-	private IObservableValue observable;
-
-	public ScaleObservableValueMinTest() {
-		this(null);
-	}
-	
-	public ScaleObservableValueMinTest(String testName) {
-		super(testName, new Delegate());
-	}
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		delegate = (Delegate) getObservableContractDelegate();
-		observable = (IObservableValue) getObservable();
-		scale = delegate.scale;
-	}
-
-	protected IObservable doCreateObservable() {
-		return getObservableContractDelegate().createObservable(SWTObservables.getRealm(Display.getDefault()));
-	}
-	
-	public void testGetValue() throws Exception {
-		int min = 100;
-		scale.setMinimum(min);
-		assertEquals(new Integer(min), observable.getValue());
-	}
-
-	public void testSetValue() throws Exception {
-		int min = 100;
-		observable.setValue(new Integer(min));
-		assertEquals(min, scale.getMinimum());
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ScaleObservableValueMinTest.class.toString());
-		suite.addTestSuite(ScaleObservableValueMinTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Shell shell;
-
-		Scale scale;
-
-		public void setUp() {
-			shell = new Shell();
-			scale = new Scale(shell, SWT.NONE);
-			scale.setMaximum(1000);
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new ScaleObservableValue(realm, scale, SWTProperties.MIN);
-		}
-
-		public void change(IObservable observable) {
-			IObservableValue observableValue = (IObservableValue) observable;
-			observableValue.setValue(createValue(observableValue));
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return Integer.TYPE;
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return createIntegerValue(observable);
-		}
-
-		private Integer createIntegerValue(IObservableValue observable) {
-			return new Integer(((Integer) observable.getValue()).intValue() + 1);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ScaleObservableValueSelectionTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ScaleObservableValueSelectionTest.java
deleted file mode 100644
index 8043b02..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ScaleObservableValueSelectionTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.jface.internal.databinding.swt.ScaleObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Scale;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.2
- */
-public class ScaleObservableValueSelectionTest extends ObservableDelegateTest {
-	private Delegate delegate;
-
-	private Scale scale;
-
-	private IObservableValue observable;
-
-	public ScaleObservableValueSelectionTest() {
-		this(null);
-	}
-	
-	public ScaleObservableValueSelectionTest(String testName) {
-		super(testName, new Delegate());
-	}
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		delegate = (Delegate) getObservableContractDelegate();
-		observable = (IObservableValue) getObservable();
-		scale = delegate.scale;
-	}
-
-	protected IObservable doCreateObservable() {
-		return getObservableContractDelegate().createObservable(SWTObservables.getRealm(Display.getDefault()));
-	}
-
-	public void testGetValue() throws Exception {
-		int value = 100;
-		scale.setSelection(value);
-		assertEquals(new Integer(value), observable.getValue());
-	}
-
-	public void testSetValue() throws Exception {
-		int value = 100;
-		observable.setValue(new Integer(value));
-		assertEquals(value, scale.getSelection());
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ScaleObservableValueSelectionTest.class
-				.toString());
-		suite.addTestSuite(ScaleObservableValueSelectionTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest
-				.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Shell shell;
-
-		Scale scale;
-
-		public void setUp() {
-			shell = new Shell();
-			scale = new Scale(shell, SWT.NONE);
-			scale.setMaximum(1000);
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new ScaleObservableValue(realm, scale, SWTProperties.SELECTION);
-		}
-
-		public void change(IObservable observable) {
-			scale
-					.setSelection(createIntegerValue(
-							(IObservableValue) observable).intValue());
-			scale.notifyListeners(SWT.Selection, null);
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return Integer.TYPE;
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return createIntegerValue(observable);
-		}
-
-		private Integer createIntegerValue(IObservableValue observable) {
-			return new Integer(((Integer) observable.getValue()).intValue() + 1);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ShellObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ShellObservableValueTest.java
deleted file mode 100644
index 41d5330..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/ShellObservableValueTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 212235)
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.internal.databinding.swt.ShellObservableValue;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Tests for ShellObservableValue
- * 
- * @since 1.2
- */
-public class ShellObservableValueTest extends AbstractDefaultRealmTestCase {
-	String oldValue;
-	String newValue;
-	Shell shell;
-	ShellObservableValue observable;
-	ValueChangeEventTracker tracker;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		shell = new Shell();
-		observable = new ShellObservableValue(shell);
-		oldValue = "old";
-		newValue = "new";
-		shell.setText(oldValue);
-		tracker = ValueChangeEventTracker.observe(observable);
-	}
-
-	public void tearDown() throws Exception {
-		observable.dispose();
-		observable = null;
-		shell.dispose();
-		shell = null;
-		super.tearDown();
-	}
-
-	public void testGetValueType() {
-		assertEquals(String.class, observable.getValueType());
-	}
-
-	public void testSetValue_FiresValueChangeEvent() {
-		observable.setValue(newValue);
-
-		assertEquals(1, tracker.count);
-		assertEquals(oldValue, tracker.event.diff.getOldValue());
-		assertEquals(newValue, tracker.event.diff.getNewValue());
-	}
-
-	public void testSetValue_NullConvertedToEmptyString() {
-		observable.setValue(null);
-
-		assertEquals("", observable.getValue());
-		assertEquals("", shell.getText());
-	}
-
-	public void testShellSetText_GetValueReturnsSame() {
-		assertEquals(oldValue, observable.getValue());
-
-		shell.setText(newValue);
-
-		assertEquals(newValue, observable.getValue());
-	}
-
-	public void testShellSetText_NoValueChangeEvent() {
-		shell.setText(newValue);
-		assertEquals(0, tracker.count);
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ShellObservableValueTest.class.toString());
-		suite.addTestSuite(ShellObservableValueTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableValueContractDelegate {
-		Shell shell;
-
-		public void setUp() {
-			super.setUp();
-			shell = new Shell();
-		}
-
-		public void tearDown() {
-			shell.dispose();
-			shell = null;
-			super.tearDown();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new ShellObservableValue(realm, shell);
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return String.class;
-		}
-
-		public void change(IObservable observable) {
-			IObservableValue observableValue = (IObservableValue) observable;
-			observableValue.setValue(createValue(observableValue));
-		}
-
-		int counter;
-
-		public Object createValue(IObservableValue observable) {
-			return Integer.toString(counter++);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueMaxTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueMaxTest.java
deleted file mode 100644
index 52806b7..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueMaxTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.jface.internal.databinding.swt.SpinnerObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Spinner;
-
-/**
- * @since 3.2
- */
-public class SpinnerObservableValueMaxTest extends ObservableDelegateTest {
-	private Delegate delegate;
-
-	private Spinner spinner;
-
-	private IObservableValue observable;
-
-	public SpinnerObservableValueMaxTest() {
-		this(null);
-	}
-
-	public SpinnerObservableValueMaxTest(String testName) {
-		super(testName, new Delegate());
-	}
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		delegate = (Delegate) getObservableContractDelegate();
-		observable = (IObservableValue) getObservable();
-		spinner = delegate.spinner;
-	}
-	
-	protected IObservable doCreateObservable() {
-		return getObservableContractDelegate().createObservable(SWTObservables.getRealm(Display.getDefault()));
-	}
-
-	public void testGetValue() throws Exception {
-		int max = 100;
-		spinner.setMaximum(max);
-		assertEquals(new Integer(max), observable.getValue());
-	}
-
-	public void testSetValue() throws Exception {
-		int max = 100;
-		observable.setValue(new Integer(max));
-		assertEquals(max, spinner.getMaximum());
-	}
-	
-	public static Test suite() {
-		TestSuite suite = new TestSuite(SpinnerObservableValueMaxTest.class.toString());
-		suite.addTestSuite(SpinnerObservableValueMaxTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Shell shell;
-
-		Spinner spinner;
-
-		public void setUp() {
-			shell = new Shell();
-			spinner = new Spinner(shell, SWT.NONE);
-			spinner.setMaximum(1000);
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new SpinnerObservableValue(realm, spinner, SWTProperties.MAX);
-		}
-
-		public void change(IObservable observable) {
-			IObservableValue observableValue = (IObservableValue) observable;
-			observableValue.setValue(createValue(observableValue));
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return Integer.TYPE;
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return createIntegerValue(observable);
-		}
-
-		private Integer createIntegerValue(IObservableValue observable) {
-			return new Integer(((Integer) observable.getValue()).intValue() + 1);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueMinTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueMinTest.java
deleted file mode 100644
index c208bea..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueMinTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.jface.internal.databinding.swt.SpinnerObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Spinner;
-
-/**
- * @since 3.2
- */
-public class SpinnerObservableValueMinTest extends ObservableDelegateTest {
-	private Delegate delegate;
-
-	private Spinner spinner;
-
-	private IObservableValue observable;
-
-	public SpinnerObservableValueMinTest() {
-		this(null);
-	}
-
-	public SpinnerObservableValueMinTest(String testName) {
-		super(testName, new Delegate());
-	}
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		delegate = (Delegate) getObservableContractDelegate();
-		observable = (IObservableValue) getObservable();
-		spinner = delegate.spinner;
-	}
-	
-	protected IObservable doCreateObservable() {
-		return getObservableContractDelegate().createObservable(SWTObservables.getRealm(Display.getDefault()));
-	}
-
-	public void testGetValue() throws Exception {
-		int min = 100;
-		spinner.setMinimum(min);
-		assertEquals(new Integer(min), observable.getValue());
-	}
-
-	public void testSetValue() throws Exception {
-		int min = 100;
-		observable.setValue(new Integer(min));
-		assertEquals(min, spinner.getMinimum());
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(SpinnerObservableValueMinTest.class.toString());
-		suite.addTestSuite(SpinnerObservableValueMinTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Shell shell;
-
-		Spinner spinner;
-
-		public void setUp() {
-			shell = new Shell();
-			spinner = new Spinner(shell, SWT.NONE);
-			spinner.setMaximum(1000);
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new SpinnerObservableValue(realm, spinner, SWTProperties.MIN);
-		}
-
-		public void change(IObservable observable) {
-			IObservableValue observableValue = (IObservableValue) observable;
-			observableValue.setValue(createValue(observableValue));
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return Integer.TYPE;
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return createIntegerValue(observable);
-		}
-
-		private Integer createIntegerValue(IObservableValue observable) {
-			return new Integer(((Integer) observable.getValue()).intValue() + 1);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueSelectionTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueSelectionTest.java
deleted file mode 100644
index 066344c..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueSelectionTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.jface.internal.databinding.swt.SpinnerObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Spinner;
-
-/**
- * @since 3.2
- */
-public class SpinnerObservableValueSelectionTest extends ObservableDelegateTest {
-	private Delegate delegate;
-
-	private Spinner spinner;
-
-	private IObservableValue observable;
-	
-	public SpinnerObservableValueSelectionTest() {
-		this(null);
-	}
-
-	public SpinnerObservableValueSelectionTest(String testName) {
-		super(testName, new Delegate());
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		delegate = (Delegate) getObservableContractDelegate();
-		observable = (IObservableValue) getObservable();
-		spinner = delegate.spinner;
-	}
-
-	protected IObservable doCreateObservable() {
-		return getObservableContractDelegate().createObservable(SWTObservables.getRealm(Display.getDefault()));
-	}
-
-	public void testGetValue() throws Exception {
-		int value = 100;
-		spinner.setSelection(value);
-		assertEquals(new Integer(value), observable.getValue());
-	}
-
-	public void testSetValue() throws Exception {
-		int value = 100;
-		observable.setValue(new Integer(value));
-		assertEquals(value, spinner.getSelection());
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(SpinnerObservableValueSelectionTest.class.toString());
-		suite.addTestSuite(SpinnerObservableValueSelectionTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Shell shell;
-
-		Spinner spinner;
-
-		public void setUp() {
-			shell = new Shell();
-			spinner = new Spinner(shell, SWT.NONE);
-			spinner.setMaximum(1000);
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new SpinnerObservableValue(realm, spinner, SWTProperties.SELECTION);
-		}
-
-		public void change(IObservable observable) {
-			spinner
-					.setSelection(createIntegerValue(
-							(IObservableValue) observable).intValue());
-			spinner.notifyListeners(SWT.Selection, null);
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return Integer.TYPE;
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return createIntegerValue(observable);
-		}
-
-		private Integer createIntegerValue(IObservableValue observable) {
-			return new Integer(((Integer) observable.getValue()).intValue() + 1);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueTest.java
deleted file mode 100644
index 481c74b..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Ashley Cambrell - bug 198904
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.internal.databinding.swt.SWTProperties;
-import org.eclipse.jface.internal.databinding.swt.SpinnerObservableValue;
-import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Spinner;
-
-/**
- * @since 3.2
- *
- */
-public class SpinnerObservableValueTest extends AbstractSWTTestCase {
-	public void testDispose() throws Exception {
-		Spinner spinner = new Spinner(getShell(), SWT.NONE);
-		SpinnerObservableValue observableValue = new SpinnerObservableValue(
-				spinner, SWTProperties.SELECTION);
-		ValueChangeEventTracker testCounterValueChangeListener = new ValueChangeEventTracker();
-		observableValue.addValueChangeListener(testCounterValueChangeListener);
-
-		assertEquals(0, spinner.getSelection());
-		assertEquals(0, ((Integer) observableValue.getValue()).intValue());
-
-		Integer expected1 = new Integer(1);
-		spinner.setSelection(expected1.intValue());
-
-//		assertEquals(1, testCounterValueChangeListener.counter);
-		assertEquals(expected1.intValue(), spinner.getSelection());
-		assertEquals(expected1, observableValue.getValue());
-
-		observableValue.dispose();
-
-		Integer expected2 = new Integer(2);
-		spinner.setSelection(expected2.intValue());
-
-//		assertEquals(1, testCounterValueChangeListener.counter);
-		assertEquals(expected2.intValue(), spinner.getSelection());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TableObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TableObservableValueTest.java
deleted file mode 100644
index 25302da..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TableObservableValueTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Ashley Cambrell - bug 198904
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import org.eclipse.jface.internal.databinding.swt.TableSingleSelectionObservableValue;
-import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * @since 3.2
- */
-public class TableObservableValueTest extends AbstractSWTTestCase {
-	public void testDispose() throws Exception {
-		Table table = new Table(getShell(), SWT.NONE);
-		TableSingleSelectionObservableValue observableValue = new TableSingleSelectionObservableValue(
-				table);
-
-		TableItem item1 = new TableItem(table, SWT.NONE);
-		item1.setText("Item1");
-		TableItem item2 = new TableItem(table, SWT.NONE);
-		item2.setText("Item2");
-
-		assertEquals(-1, table.getSelectionIndex());
-		assertEquals(-1, ((Integer) observableValue.getValue()).intValue());
-
-		table.select(0);
-		table.notifyListeners(SWT.Selection, null);
-
-		assertEquals(0, table.getSelectionIndex());
-		assertEquals(new Integer(0), observableValue.getValue());
-
-		observableValue.dispose();
-
-		table.select(1);
-		table.notifyListeners(SWT.Selection, null);
-		assertEquals(1, table.getSelectionIndex());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TableSingleSelectionObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TableSingleSelectionObservableValueTest.java
deleted file mode 100644
index f475a6b..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TableSingleSelectionObservableValueTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 Brad Reynolds and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Brad Reynolds - initial API and implementation
- *     Matthew Hall - bugs 118516, 213145
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.swt.TableSingleSelectionObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * @since 3.2
- */
-public class TableSingleSelectionObservableValueTest extends ObservableDelegateTest {
-	private Delegate delegate;
-	private IObservableValue observable;
-	private Table table;
-	
-	public TableSingleSelectionObservableValueTest() {
-		this(null);
-	}
-	
-	public TableSingleSelectionObservableValueTest(String testName) {
-		super(testName, new Delegate());
-	}
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		observable = (IObservableValue) getObservable();
-		delegate = (Delegate) getObservableContractDelegate();
-		table = delegate.table;
-	}
-	
-	protected IObservable doCreateObservable() {
-		Delegate delegate = (Delegate) getObservableContractDelegate();
-		return delegate.createObservableValue(SWTObservables.getRealm(Display.getDefault()));
-	}
-	
-	public void testSetValue() throws Exception {
-		//preconditions
-		assertEquals(-1, table.getSelectionIndex());
-		assertEquals(-1, ((Integer) observable.getValue()).intValue());
-
-		Integer value = new Integer(0);
-		observable.setValue(value);
-		assertEquals("table selection index", value.intValue(), table
-				.getSelectionIndex());
-		assertEquals("observable value", value, observable.getValue());
-	}
-	
-	public void testGetValue() throws Exception {
-		int value = 1;
-		table.setSelection(value);
-		
-		assertEquals("table selection index", value, table.getSelectionIndex());
-		assertEquals("observable value", new Integer(value), observable.getValue());
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(TableSingleSelectionObservableValueTest.class.toString());
-		suite.addTestSuite(TableSingleSelectionObservableValueTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Shell shell;
-
-		Table table;
-
-		public void setUp() {
-			shell = new Shell();
-			table = new Table(shell, SWT.NONE);
-			new TableItem(table, SWT.NONE).setText("0");
-			new TableItem(table, SWT.NONE).setText("1");
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new TableSingleSelectionObservableValue(realm, table);
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return Integer.TYPE;
-		}
-
-		public void change(IObservable observable) {
-			int index = createIntegerValue((IObservableValue) observable)
-					.intValue();
-			table.select(index);
-
-			table.notifyListeners(SWT.Selection, null);
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return createIntegerValue(observable);
-		}
-
-		private Integer createIntegerValue(IObservableValue observable) {
-			int value = ((Integer) observable.getValue()).intValue();
-			switch (value) {
-			case -1:
-			case 1:
-				return new Integer(0);
-			case 0:
-				return new Integer(1);
-			}
-
-			Assert.isTrue(false);
-			return null;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TestCounterValueChangeListener.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TestCounterValueChangeListener.java
deleted file mode 100644
index 8e1ca78..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TestCounterValueChangeListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Ashley Cambrell and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Ashley Cambrell - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-
-class TestCounterValueChangeListener implements
-		IValueChangeListener {
-	public int counter = 0;
-
-	public void handleValueChange(ValueChangeEvent event) {
-		++counter;
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TextEditableObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TextEditableObservableValueTest.java
deleted file mode 100644
index 8d1b09e..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TextEditableObservableValueTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.internal.databinding.swt.TextEditableObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @since 1.1
- */
-public class TextEditableObservableValueTest extends
-		ObservableDelegateTest {
-	
-	private Delegate delegate;
-	private Text text;
-	private IObservableValue observable;
-
-	public TextEditableObservableValueTest() {
-		this(null);
-	}
-	
-	public TextEditableObservableValueTest(String testName) {
-		super(testName, new Delegate());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.conformance.databinding.ObservableDelegateTest#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		delegate = (Delegate) getObservableContractDelegate();
-		observable = (IObservableValue) getObservable();
-		text = delegate.text;
-	}
-	
-	protected IObservable doCreateObservable() {
-		return super.doCreateObservable();
-	}
-	
-	public void testGetValue() throws Exception {
-		text.setEditable(false);
-		assertEquals(Boolean.valueOf(text.getEditable()), observable.getValue());
-		
-		text.setEditable(true);
-		assertEquals(Boolean.valueOf(text.getEditable()), observable.getValue());
-	}
-	
-	public void testSetValue() throws Exception {
-		text.setEditable(false);
-		observable.setValue(Boolean.TRUE);
-		assertEquals(Boolean.TRUE, Boolean.valueOf(text.getEditable()));
-		
-		observable.setValue(Boolean.FALSE);
-		assertEquals(Boolean.FALSE, Boolean.valueOf(text.getEditable()));
-	}
-	
-	public static Test suite() {
-		TestSuite suite = new TestSuite(TextEditableObservableValueTest.class.toString());
-		suite.addTestSuite(TextEditableObservableValueTest.class);
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-	
-	/*package*/ static class Delegate extends AbstractObservableValueContractDelegate {
-		private Shell shell;
-		Text text;
-		
-		public void setUp() {			
-			shell = new Shell();
-			text = new Text(shell, SWT.NONE);
-		}
-
-		public void tearDown() {			
-			shell.dispose();
-		}
-		
-		public IObservableValue createObservableValue(Realm realm) {
-			return new TextEditableObservableValue(realm, text);
-		}
-		
-		public Object getValueType(IObservableValue observable) {
-			return Boolean.TYPE;
-		}
-		
-		public void change(IObservable observable) {
-			IObservableValue observableValue = (IObservableValue) observable;
-			observableValue.setValue(createValue(observableValue));
-		}
-		
-		public Object createValue(IObservableValue observable) {
-			return (Boolean.TRUE.equals(observable.getValue()) ? Boolean.FALSE: Boolean.TRUE);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TextObservableValueFocusOutTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TextObservableValueFocusOutTest.java
deleted file mode 100644
index 9504160..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TextObservableValueFocusOutTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.internal.databinding.swt.TextObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Tests for the FocusOut version of TextObservableValue.
- */
-public class TextObservableValueFocusOutTest extends TestCase {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(TextObservableValueFocusOutTest.class.toString());
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Shell shell;
-
-		private Text text;
-		
-		public void setUp() {
-			shell = new Shell();
-			text = new Text(shell, SWT.NONE);
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new TextObservableValue(realm, text, SWT.FocusOut);
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return String.class;
-		}
-
-		public void change(IObservable observable) {
-			text.setFocus();
-			
-			IObservableValue observableValue = (IObservableValue) observable;
-			text.setText((String) createValue(observableValue));
-			
-			text.notifyListeners(SWT.FocusOut, null);
-		}
-
-		public Object createValue(IObservableValue observable) {
-			String value = (String) observable.getValue();
-			return value + "a";
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TextObservableValueModifyTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TextObservableValueModifyTest.java
deleted file mode 100644
index 9867754..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TextObservableValueModifyTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
-import org.eclipse.jface.internal.databinding.swt.TextObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @since 3.2
- */
-public class TextObservableValueModifyTest extends TestCase {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(TextObservableValueModifyTest.class.toString());
-		suite.addTest(SWTMutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	/* package */static class Delegate extends
-			AbstractObservableValueContractDelegate {
-		private Shell shell;
-
-		private Text text;
-		
-		public void setUp() {
-			shell = new Shell();
-			text = new Text(shell, SWT.NONE);
-		}
-
-		public void tearDown() {
-			shell.dispose();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new TextObservableValue(realm, text, SWT.Modify);
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return String.class;
-		}
-
-		public void change(IObservable observable) {
-			text.setFocus();
-			
-			IObservableValue observableValue = (IObservableValue) observable;
-			text.setText((String) createValue(observableValue));
-		}
-
-		public Object createValue(IObservableValue observable) {
-			String value = (String) observable.getValue();
-			return value + "a";
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TextObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TextObservableValueTest.java
deleted file mode 100644
index 5e96a3d..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/swt/TextObservableValueTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds - bug 116920
- *     Brad Reynolds - bug 164653
- *     Ashley Cambrell - bug 198904
- *******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.swt;
-
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.internal.databinding.swt.TextObservableValue;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Tests to assert the inputs of the TextObservableValue constructor.
- * 
- * @since 3.2
- */
-public class TextObservableValueTest extends AbstractDefaultRealmTestCase {
-	private Text text;
-	private ValueChangeEventTracker listener;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		Shell shell = new Shell();
-		text = new Text(shell, SWT.NONE);
-		
-		listener = new ValueChangeEventTracker();
-	}
-
-	/**
-	 * Asserts that only valid SWT event types are accepted on construction of
-	 * TextObservableValue.
-	 */
-	public void testConstructorUpdateEventTypes() {
-		try {
-			new TextObservableValue(text, SWT.NONE);
-			new TextObservableValue(text, SWT.FocusOut);
-			new TextObservableValue(text, SWT.Modify);
-			assertTrue(true);
-		} catch (IllegalArgumentException e) {
-			fail();
-		}
-
-		try {
-			new TextObservableValue(text, SWT.Verify);
-			fail();
-		} catch (IllegalArgumentException e) {
-			assertTrue(true);
-		}
-	}
-	
-	/**
-	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=171132
-	 * 
-	 * @throws Exception
-	 */
-	public void testGetValueBeforeFocusOutChangeEventsFire() throws Exception {
-		TextObservableValue observableValue = new TextObservableValue(text, SWT.FocusOut);
-		observableValue.addValueChangeListener(listener);
-		
-		String a = "a";
-		String b = "b";
-		
-		text.setText(a);
-		assertEquals(a, observableValue.getValue()); //fetch the value updating the buffered value
-		
-		text.setText(b);
-		text.notifyListeners(SWT.FocusOut, null);
-		
-		assertEquals(1, listener.count);
-		assertEquals(a, listener.event.diff.getOldValue());
-		assertEquals(b, listener.event.diff.getNewValue());
-	}
-
-	public void testDispose() throws Exception {
-		TextObservableValue observableValue = new TextObservableValue(text,
-				SWT.Modify);
-		ValueChangeEventTracker testCounterValueChangeListener = new ValueChangeEventTracker();
-		observableValue.addValueChangeListener(testCounterValueChangeListener);
-
-		String expected1 = "Test123";
-		text.setText(expected1);
-
-		assertEquals(1, testCounterValueChangeListener.count);
-		assertEquals(expected1, text.getText());
-		assertEquals(expected1, observableValue.getValue());
-
-		observableValue.dispose();
-
-		String expected2 = "NewValue123";
-		text.setText(expected2);
-
-		assertEquals(1, testCounterValueChangeListener.count);
-		assertEquals(expected2, text.getText());
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ObservableCollectionTreeContentProviderTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ObservableCollectionTreeContentProviderTest.java
deleted file mode 100644
index 6509628..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ObservableCollectionTreeContentProviderTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 239015)
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.viewers;
-
-import java.util.Arrays;
-import java.util.HashSet;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.2
- * 
- */
-public class ObservableCollectionTreeContentProviderTest extends
-		AbstractDefaultRealmTestCase {
-	private Shell shell;
-	private TreeViewer viewer;
-	ObservableListTreeContentProvider contentProvider;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		shell = new Shell();
-		viewer = new TreeViewer(shell);
-	}
-
-	protected void tearDown() throws Exception {
-		shell.dispose();
-		shell = null;
-		viewer = null;
-		super.tearDown();
-	}
-
-	private void createContentProvider(IObservableFactory factory) {
-		contentProvider = new ObservableListTreeContentProvider(
-				factory, null);
-		viewer.setContentProvider(contentProvider);
-	}
-
-	public void testGetKnownElements_ExcludesInput() {
-		final Object input = new Object();
-		Object[] rootElements = new Object[] { "one", "two", "three" };
-		final IObservableList rootElementList = new WritableList(Arrays
-				.asList(rootElements), null);
-		createContentProvider(new IObservableFactory() {
-			public IObservable createObservable(Object target) {
-				if (target == input)
-					return rootElementList;
-				return null;
-			}
-		});
-		viewer.setInput(input);
-		contentProvider.getElements(input);
-
-		IObservableSet knownElements = contentProvider.getKnownElements();
-		assertFalse(knownElements.contains(input));
-		assertEquals(new HashSet(Arrays.asList(rootElements)), knownElements);
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ObservableViewerElementSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ObservableViewerElementSetTest.java
deleted file mode 100644
index ad54db7..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ObservableViewerElementSetTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 215531)
- *     Matthew Hall - bug 213145
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.viewers;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.IObservableCollection;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.jface.databinding.conformance.MutableObservableSetContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
-import org.eclipse.jface.internal.databinding.viewers.ObservableViewerElementSet;
-import org.eclipse.jface.viewers.IElementComparer;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class ObservableViewerElementSetTest extends TestCase {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ObservableViewerElementSetTest.class.getName());
-		suite.addTest(MutableObservableSetContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	private static class Delegate extends
-			AbstractObservableCollectionContractDelegate {
-
-		public IObservableCollection createObservableCollection(Realm realm,
-				int elementCount) {
-			ObservableViewerElementSet set = new ObservableViewerElementSet(realm,
-					Object.class, new IdentityElementComparer());
-			for (int i = 0; i < elementCount; i++)
-				set.add(createElement(set));
-			return set;
-		}
-
-		public Object createElement(IObservableCollection collection) {
-			return new Object();
-		}
-
-		public void change(IObservable observable) {
-			IObservableSet set = (IObservableSet) observable;
-			set.add(createElement(set));
-		}
-
-		public Object getElementType(IObservableCollection collection) {
-			return Object.class;
-		}
-	}
-
-	private static class IdentityElementComparer implements IElementComparer {
-		public boolean equals(Object a, Object b) {
-			return a == b;
-		}
-
-		public int hashCode(Object element) {
-			return System.identityHashCode(element);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/SelectionProviderMultiSelectionObservableListTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/SelectionProviderMultiSelectionObservableListTest.java
deleted file mode 100644
index 0bbf6bf..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/SelectionProviderMultiSelectionObservableListTest.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Brad Reynolds - initial API and implementation
- *     Brad Reynolds - bug 116920
- *******************************************************************************/
-package org.eclipse.jface.tests.internal.databinding.viewers;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.databinding.observable.list.ListDiffEntry;
-import org.eclipse.jface.databinding.conformance.util.ListChangeEventTracker;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.viewers.SelectionProviderMultipleSelectionObservableList;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Tests for SelectionProviderMultiSelectionObservableList.
- * 
- * @since 1.2
- */
-public class SelectionProviderMultiSelectionObservableListTest extends TestCase {
-	private ISelectionProvider selectionProvider;
-
-	private TableViewer viewer;
-
-	private static String[] model = new String[] { "0", "1", "2", "3" };
-
-	protected void setUp() throws Exception {
-		Shell shell = new Shell();
-		viewer = new TableViewer(shell, SWT.MULTI);
-		viewer.setContentProvider(new ContentProvider());
-		viewer.setInput(model);
-		selectionProvider = viewer;
-	}
-
-	protected void tearDown() throws Exception {
-		Shell shell = viewer.getTable().getShell();
-		if (!shell.isDisposed())
-			shell.dispose();
-	}
-
-	public void testConstructorIllegalArgumentException() {
-		try {
-			new SelectionProviderMultipleSelectionObservableList(SWTObservables
-					.getRealm(Display.getDefault()), null, Object.class);
-			fail();
-		} catch (IllegalArgumentException e) {
-		}
-	}
-
-	/**
-	 * Asserts that when a selection is set on the viewer:
-	 * <ul>
-	 * <li>the selection is available in the observable</li>
-	 * <li>Value change events are fired with appropriate diff values</li>
-	 * </ul>
-	 */
-	public void testAddRemove() {
-		SelectionProviderMultipleSelectionObservableList observable = new SelectionProviderMultipleSelectionObservableList(
-				SWTObservables.getRealm(Display.getDefault()),
-				selectionProvider, Object.class);
-		ListChangeEventTracker listener = new ListChangeEventTracker();
-		observable.addListChangeListener(listener);
-		assertEquals(0, observable.size());
-
-		selectionProvider.setSelection(new StructuredSelection(model[0]));
-		assertEquals(1, listener.count);
-		assertEquals(1, listener.event.diff.getDifferences().length);
-		assertDiffEntry(listener.event.diff.getDifferences()[0], 0, model[0], true);
-		assertEquals(observable, listener.event.getObservableList());
-		assertEquals(1, observable.size());
-		assertEquals(model[0], observable.get(0));
-
-		selectionProvider.setSelection(new StructuredSelection(model[1]));
-		assertEquals(2, listener.count);
-		assertEquals(2, listener.event.diff.getDifferences().length);
-		assertDiffEntry(listener.event.diff.getDifferences()[0], 0, model[1], true);
-		assertDiffEntry(listener.event.diff.getDifferences()[1], 1, model[0], false);
-		assertEquals(observable, listener.event.getObservableList());
-		assertEquals(1, observable.size());
-		assertEquals(model[1], observable.get(0));
-
-		selectionProvider.setSelection(new StructuredSelection(new Object[]{model[2],model[3]}));
-		assertEquals(3, listener.count);
-		assertEquals(3, listener.event.diff.getDifferences().length);
-		assertDiffEntry(listener.event.diff.getDifferences()[0], 0, model[2], true);
-		assertDiffEntry(listener.event.diff.getDifferences()[1], 1, model[3], true);
-		assertDiffEntry(listener.event.diff.getDifferences()[2], 2, model[1], false);
-		assertEquals(observable, listener.event.getObservableList());
-		assertEquals(2, observable.size());
-		assertEquals(model[2], observable.get(0));
-		assertEquals(model[3], observable.get(1));
-		
-		selectionProvider.setSelection(StructuredSelection.EMPTY);
-		assertEquals(4, listener.count);
-		assertEquals(2, listener.event.diff.getDifferences().length);
-		assertDiffEntry(listener.event.diff.getDifferences()[0], 1, model[3], false);
-		assertDiffEntry(listener.event.diff.getDifferences()[1], 0, model[2], false);
-		assertEquals(observable, listener.event.getObservableList());
-		assertEquals(0, observable.size());
-		
-		observable.add(model[1]);
-		assertEquals(5, listener.count);
-		assertEquals(1, listener.event.diff.getDifferences().length);
-		assertDiffEntry(listener.event.diff.getDifferences()[0], 0, model[1], true);
-		assertEquals(observable, listener.event.getObservableList());
-		assertEquals(1, ((IStructuredSelection)viewer.getSelection()).size());
-
-		observable.add(0, model[2]);
-		assertEquals(6, listener.count);
-		assertEquals(1, listener.event.diff.getDifferences().length);
-		// This is a bit surprising (we added at index 0 but the event says index 1).
-		// It is to the fact that the observable list tracks the underlying selection
-		// provider's notion of which element is at which index.
-		assertDiffEntry(listener.event.diff.getDifferences()[0], 1, model[2], true);
-		assertEquals(observable, listener.event.getObservableList());
-		assertEquals(2, ((IStructuredSelection)viewer.getSelection()).size());
-
-		observable.clear();
-		assertEquals(7, listener.count);
-		assertEquals(2, listener.event.diff.getDifferences().length);
-		assertDiffEntry(listener.event.diff.getDifferences()[0], 1, model[2], false);
-		assertDiffEntry(listener.event.diff.getDifferences()[1], 0, model[1], false);
-		assertEquals(observable, listener.event.getObservableList());
-		assertEquals(0, ((IStructuredSelection)viewer.getSelection()).size());
-}
-
-	/**
-	 * @param diffEntry
-	 * @param position
-	 * @param element
-	 * @param isAddition
-	 */
-	private void assertDiffEntry(ListDiffEntry diffEntry, int position,
-			String element, boolean isAddition) {
-		assertEquals(isAddition, diffEntry.isAddition());
-		assertEquals(position, diffEntry.getPosition());
-		assertEquals(element, diffEntry.getElement());
-	}
-
-	private class ContentProvider implements IStructuredContentProvider {
-		public void dispose() {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			// TODO Auto-generated method stub
-
-		}
-
-		public Object[] getElements(Object inputElement) {
-			return (String[]) inputElement;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/SelectionProviderSingleSelectionObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/SelectionProviderSingleSelectionObservableValueTest.java
deleted file mode 100644
index a5abde8..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/SelectionProviderSingleSelectionObservableValueTest.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Brad Reynolds - initial API and implementation
- *    Brad Reynolds - bug 116920
- *    Ashley Cambrell - bug 198906
- *******************************************************************************/
-package org.eclipse.jface.tests.internal.databinding.viewers;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.internal.databinding.viewers.SelectionProviderSingleSelectionObservableValue;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Tests for SelectionProviderSingleSelectionObservableValue.
- * 
- * @since 1.1
- */
-public class SelectionProviderSingleSelectionObservableValueTest extends
-		TestCase {
-	private ISelectionProvider selectionProvider;
-
-	private TableViewer viewer;
-
-	private static String[] model = new String[] { "0", "1" };
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		Shell shell = new Shell();
-		viewer = new TableViewer(shell, SWT.NONE);
-		viewer.setContentProvider(new ContentProvider());
-		viewer.setInput(model);
-		selectionProvider = viewer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		Shell shell = viewer.getTable().getShell();
-		if (!shell.isDisposed())
-			shell.dispose();
-	}
-
-	public void testConstructorIllegalArgumentException() {
-		try {
-			new SelectionProviderSingleSelectionObservableValue(SWTObservables
-					.getRealm(Display.getDefault()), null);
-			fail();
-		} catch (IllegalArgumentException e) {
-		}
-	}
-
-	/**
-	 * Asserts that when a selection is set on the viewer:
-	 * <ul>
-	 * <li>the selection is available in the observable</li>
-	 * <li>Value change events are fired with appropriate diff values</li>
-	 * </ul>
-	 */
-	public void testGetSetValue() {
-		SelectionProviderSingleSelectionObservableValue observable = new SelectionProviderSingleSelectionObservableValue(
-				SWTObservables.getRealm(Display.getDefault()),
-				selectionProvider);
-		ValueChangeEventTracker listener = new ValueChangeEventTracker();
-		observable.addValueChangeListener(listener);
-		assertNull(observable.getValue());
-
-		selectionProvider.setSelection(new StructuredSelection(model[0]));
-		assertEquals(1, listener.count);
-		assertNull(listener.event.diff.getOldValue());
-		assertEquals(model[0], listener.event.diff.getNewValue());
-		assertEquals(observable, listener.event.getObservableValue());
-		assertEquals(model[0], observable.getValue());
-
-		selectionProvider.setSelection(new StructuredSelection(model[1]));
-		assertEquals(2, listener.count);
-		assertEquals(model[0], listener.event.diff.getOldValue());
-		assertEquals(model[1], listener.event.diff.getNewValue());
-		assertEquals(observable, listener.event.getObservableValue());
-		assertEquals(model[1], observable.getValue());
-
-		selectionProvider.setSelection(StructuredSelection.EMPTY);
-		assertEquals(3, listener.count);
-		assertEquals(model[1], listener.event.diff.getOldValue());
-		assertNull(listener.event.diff.getNewValue());
-		assertEquals(observable, listener.event.getObservableValue());
-		assertEquals(null, observable.getValue());
-	}
-
-	public void testDispose() throws Exception {
-		SelectionProviderSingleSelectionObservableValue observable = new SelectionProviderSingleSelectionObservableValue(
-				SWTObservables.getRealm(Display.getDefault()),
-				selectionProvider);
-		ValueChangeEventTracker listener = new ValueChangeEventTracker();
-		observable.addValueChangeListener(listener);
-
-		selectionProvider.setSelection(new StructuredSelection(model[0]));
-		assertEquals(1, listener.count);
-		assertNull(listener.event.diff.getOldValue());
-		assertEquals(model[0], listener.event.diff.getNewValue());
-		assertEquals(observable, listener.event.getObservableValue());
-		assertEquals(model[0], observable.getValue());
-
-		observable.dispose();
-		selectionProvider.setSelection(new StructuredSelection(model[1]));
-		assertEquals(1, listener.count);
-	}
-
-	private class ContentProvider implements IStructuredContentProvider {
-		public void dispose() {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			// TODO Auto-generated method stub
-
-		}
-
-		public Object[] getElements(Object inputElement) {
-			return (String[]) inputElement;
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ViewerElementMapTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ViewerElementMapTest.java
deleted file mode 100644
index 1aece17..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ViewerElementMapTest.java
+++ /dev/null
@@ -1,535 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 215531)
- *     Matthew Hall - bug 228125
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.viewers;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jface.internal.databinding.viewers.ViewerElementMap;
-import org.eclipse.jface.viewers.IElementComparer;
-
-import junit.framework.TestCase;
-
-/**
- * @since 1.2
- */
-public class ViewerElementMapTest extends TestCase {
-	IdentityElementComparer comparer;
-	ViewerElementMap map;
-
-	Object key;
-	Object value;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		comparer = new IdentityElementComparer();
-		map = new ViewerElementMap(comparer);
-		key = new Object();
-		value = new Object();
-	}
-
-	public void testConstructor_NullComparer() {
-		try {
-			new ViewerElementMap(null);
-			fail("Constructor should throw exception when null comparer passed in");
-		} catch (RuntimeException expected) {
-		}
-	}
-
-	public void testConstructorWithCollection_NullCollection() {
-		try {
-			new ViewerElementMap(null, new IdentityElementComparer());
-			fail("Constructor should throw exception when null collection passed in");
-		} catch (RuntimeException expected) {
-		}
-	}
-
-	public void testConstructorWithCollection_ContainsAllEntries() {
-		Map toCopy = new HashMap();
-		toCopy.put(new Object(), new Object());
-		map = new ViewerElementMap(toCopy, new IdentityElementComparer());
-		assertEquals(toCopy, map);
-	}
-
-	public void testIsEmpty() {
-		assertTrue(map.isEmpty());
-		map.put(key, value);
-		assertFalse(map.isEmpty());
-	}
-
-	public void testSize() {
-		assertEquals(0, map.size());
-		map.put(key, value);
-		assertEquals(1, map.size());
-	}
-
-	public void testClear() {
-		map.put(key, value);
-		assertFalse(map.isEmpty());
-		map.clear();
-		assertTrue(map.isEmpty());
-	}
-
-	public void testGet() {
-		assertNull(map.get(key));
-		map.put(key, value);
-		assertEquals(value, map.get(key));
-	}
-
-	public void testContainsKey() {
-		String key1 = new String("key");
-		String key2 = new String("key"); // equal but distinct instances
-		assertFalse(map.containsKey(key1));
-		map.put(key1, value);
-		assertTrue(map.containsKey(key1));
-		assertFalse(map.containsKey(key2));
-	}
-
-	public void testContainsValue() {
-		assertFalse(map.containsValue(value));
-		map.put(key, value);
-		assertTrue(map.containsValue(value));
-	}
-
-	public void testPutAll() {
-		Map other = new HashMap();
-		other.put(key, value);
-
-		assertTrue(map.isEmpty());
-		map.putAll(other);
-		assertEquals(1, map.size());
-		assertTrue(map.containsKey(key));
-		assertEquals(value, map.get(key));
-	}
-
-	public void testRemove() {
-		map.put(key, value);
-		assertTrue(map.containsKey(key));
-		map.remove(key);
-		assertFalse(map.containsKey(key));
-	}
-
-	public void testValues() {
-		Collection values = map.values();
-		assertTrue(values.isEmpty());
-
-		map.put(key, value);
-
-		assertEquals(1, values.size());
-		assertEquals(value, values.iterator().next());
-
-		map.remove(key);
-		assertTrue(map.values().isEmpty());
-	}
-
-	public void testKeySet() {
-		Set keySet = map.keySet();
-		assertTrue(keySet.isEmpty());
-
-		map.put(key, value);
-		assertEquals(1, keySet.size());
-		assertTrue(keySet.contains(key));
-
-		map.remove(key);
-		assertTrue(keySet.isEmpty());
-	}
-
-	public void testKeySet_Add() {
-		try {
-			map.keySet().add(key);
-			fail("Expected UnsupportedOperationException");
-		} catch (UnsupportedOperationException expected) {
-		}
-	}
-
-	public void testKeySet_AddAll() {
-		try {
-			map.keySet().addAll(Collections.singleton(key));
-			fail("Expected UnsupportedOperationException");
-		} catch (UnsupportedOperationException expected) {
-		}
-	}
-
-	public void testKeySet_Clear() {
-		map.put(key, value);
-		Set keySet = map.keySet();
-		assertTrue(keySet.contains(key));
-		keySet.clear();
-		assertTrue(keySet.isEmpty());
-		assertTrue(map.isEmpty());
-	}
-
-	public void testKeySet_Contains() {
-		Set keySet = map.keySet();
-		assertFalse(keySet.contains(key));
-		map.put(key, value);
-		assertTrue(keySet.contains(key));
-	}
-
-	public void testKeySet_ContainsAll() {
-		Set keySet = map.keySet();
-		assertFalse(keySet.containsAll(Collections.singleton(key)));
-		map.put(key, value);
-		assertTrue(keySet.containsAll(Collections.singleton(key)));
-	}
-
-	public void testKeySet_IsEmpty() {
-		Set keySet = map.keySet();
-		assertTrue(keySet.isEmpty());
-		map.put(key, value);
-		assertFalse(keySet.isEmpty());
-	}
-
-	public void testKeySet_Iterator() {
-		map.put(key, value);
-		Iterator iterator = map.keySet().iterator();
-		assertTrue(iterator.hasNext());
-		assertEquals(key, iterator.next());
-
-		assertEquals(1, map.size());
-		iterator.remove();
-		assertTrue(map.isEmpty());
-
-		assertFalse(iterator.hasNext());
-	}
-
-	public void testKeySet_Remove() {
-		map.put(key, value);
-		assertEquals(1, map.size());
-		map.keySet().remove(key);
-		assertTrue(map.isEmpty());
-	}
-
-	public void testKeySet_RemoveAll() {
-		map.put(key, value);
-		Set keySet = map.keySet();
-		assertFalse(keySet.removeAll(Collections.EMPTY_SET));
-		assertEquals(1, map.size());
-		assertTrue(keySet.removeAll(Collections.singleton(key)));
-		assertTrue(map.isEmpty());
-	}
-
-	public void testKeySet_RetainAll() {
-		map.put(key, value);
-		Set keySet = map.keySet();
-		assertFalse(keySet.retainAll(Collections.singleton(key)));
-		assertEquals(1, map.size());
-		assertTrue(keySet.retainAll(Collections.EMPTY_SET));
-		assertTrue(map.isEmpty());
-	}
-
-	public void testKeySet_Size() {
-		Set keySet = map.keySet();
-		assertEquals(0, keySet.size());
-		map.put(key, value);
-		assertEquals(1, keySet.size());
-		map.clear();
-		assertEquals(0, keySet.size());
-	}
-
-	public void testKeySet_ToArray() {
-		Set keySet = map.keySet();
-		map.put(key, value);
-		Object[] array = keySet.toArray();
-		assertEquals(1, array.length);
-		assertSame(key, array[0]);
-	}
-
-	public void testKeySet_ToArrayWithObjectArray() {
-		key = new String("key");
-		map.put(key, value);
-		String[] array = (String[]) map.keySet().toArray(new String[0]);
-		assertEquals(1, array.length);
-		assertSame(key, array[0]);
-	}
-
-	public void testKeySet_Equals() {
-		Set keySet = map.keySet();
-		assertFalse(keySet.equals(null));
-		assertTrue(keySet.equals(keySet));
-
-		assertTrue(keySet.equals(Collections.EMPTY_SET));
-		map.put(key, value);
-		assertTrue(keySet.equals(Collections.singleton(key)));
-	}
-
-	public void testKeySet_HashCode() {
-		Set keySet = map.keySet();
-		assertEquals(0, keySet.hashCode());
-		map.put(key, value);
-		int hash = comparer.hashCode(key);
-		assertEquals(hash, keySet.hashCode());
-	}
-
-	public void testEntrySet() {
-		Set entrySet = map.entrySet();
-		assertTrue(entrySet.isEmpty());
-
-		map.put(key, value);
-		assertEquals(1, entrySet.size());
-		Map.Entry entry = (Map.Entry) entrySet.iterator().next();
-		assertEquals(key, entry.getKey());
-		assertEquals(value, entry.getValue());
-
-		map.remove(key);
-		assertTrue(entrySet.isEmpty());
-	}
-
-	public void testEntrySet_Add() {
-		try {
-			map.entrySet().add(key);
-			fail("Expected UnsupportedOperationException");
-		} catch (UnsupportedOperationException expected) {
-		}
-	}
-
-	public void testEntrySet_AddAll() {
-		try {
-			map.entrySet().addAll(Collections.EMPTY_SET);
-			fail("Expected UnsupportedOperationException");
-		} catch (UnsupportedOperationException expected) {
-		}
-	}
-
-	public void testEntrySet_Clear() {
-		map.put(key, value);
-		assertEquals(1, map.size());
-		map.entrySet().clear();
-		assertTrue(map.isEmpty());
-	}
-
-	public void testEntrySet_Contains() {
-		map.put(key, value);
-		Set entrySet = map.entrySet();
-		assertTrue(entrySet.contains(new MapEntryStub(key, value)));
-		map.remove(key);
-		assertFalse(entrySet.contains(new MapEntryStub(key, value)));
-	}
-
-	public void testEntrySet_ContainsAll() {
-		Set entrySet = map.entrySet();
-		assertFalse(entrySet.containsAll(Collections
-				.singleton(new MapEntryStub(key, value))));
-		assertTrue(entrySet.containsAll(Collections.EMPTY_SET));
-
-		map.put(key, value);
-		assertTrue(entrySet.containsAll(Collections.singleton(new MapEntryStub(
-				key, value))));
-	}
-
-	public void testEntrySet_IsEmpty() {
-		Set entrySet = map.entrySet();
-		assertTrue(entrySet.isEmpty());
-		map.put(key, value);
-		assertFalse(entrySet.isEmpty());
-	}
-
-	public void testEntrySet_Iterator() {
-		map.put(key, value);
-		Iterator iterator = map.entrySet().iterator();
-		assertTrue(iterator.hasNext());
-		Map.Entry entry = (Map.Entry) iterator.next();
-		assertTrue(entry.equals(new MapEntryStub(key, value)));
-
-		assertEquals(1, map.size());
-		iterator.remove();
-		assertTrue(map.isEmpty());
-		assertFalse(iterator.hasNext());
-	}
-
-	public void testEntrySet_Remove() {
-		map.put(key, value);
-		assertEquals(1, map.size());
-
-		assertTrue(map.entrySet().remove(new MapEntryStub(key, value)));
-		assertTrue(map.isEmpty());
-	}
-
-	public void testEntrySet_RemoveAll() {
-		Set entrySet = map.entrySet();
-		assertFalse(entrySet.removeAll(Collections.EMPTY_SET));
-
-		map.put(key, value);
-		assertEquals(1, map.size());
-		assertTrue(entrySet.removeAll(Collections.singleton(new MapEntryStub(
-				key, value))));
-		assertTrue(map.isEmpty());
-	}
-
-	public void testEntrySet_RetainAll() {
-		Set entrySet = map.entrySet();
-		assertFalse(entrySet.retainAll(Collections.EMPTY_SET));
-
-		map.put(key, value);
-		assertEquals(1, map.size());
-		assertFalse(entrySet.retainAll(Collections.singleton(new MapEntryStub(
-				key, value))));
-		assertEquals(1, map.size());
-		assertTrue(entrySet.retainAll(Collections.EMPTY_SET));
-		assertTrue(map.isEmpty());
-	}
-
-	public void testEntrySet_Size() {
-		Set entrySet = map.entrySet();
-		assertEquals(0, entrySet.size());
-		map.put(key, value);
-		assertEquals(1, entrySet.size());
-	}
-
-	public void testEntrySet_ToArray() {
-		Set entrySet = map.entrySet();
-		assertEquals(0, entrySet.toArray().length);
-
-		map.put(key, value);
-		Object[] array = entrySet.toArray();
-		assertEquals(1, array.length);
-		assertTrue(array[0].equals(new MapEntryStub(key, value)));
-	}
-
-	public void testEntrySet_ToArrayWithObjectArray() {
-		Set entrySet = map.entrySet();
-		assertEquals(0, entrySet.toArray(new Object[0]).length);
-
-		map.put(key, value);
-		Map.Entry[] array = (Map.Entry[]) entrySet.toArray(new Map.Entry[0]);
-		assertEquals(1, array.length);
-		assertTrue(array[0].equals(new MapEntryStub(key, value)));
-	}
-
-	public void testEntrySet_Equals() {
-		Set entrySet = map.entrySet();
-		assertFalse(entrySet.equals(null));
-		assertTrue(entrySet.equals(entrySet));
-
-		assertTrue(entrySet.equals(Collections.EMPTY_SET));
-		assertFalse(entrySet.equals(Collections.singleton(new MapEntryStub(key,
-				value))));
-
-		map.put(key, value);
-		assertFalse(entrySet.equals(Collections.EMPTY_SET));
-		assertTrue(entrySet.equals(Collections.singleton(new MapEntryStub(key,
-				value))));
-	}
-
-	public void testEntrySet_HashCode() {
-		// hash formula mandated by Map contract
-		Set entrySet = map.entrySet();
-		assertEquals(0, entrySet.hashCode());
-
-		map.put(key, value);
-		int hash = comparer.hashCode(key) ^ value.hashCode();
-		assertEquals(hash, entrySet.hashCode());
-	}
-
-	public void testEntrySet_Entry_SetValue() {
-		map.put(key, value);
-
-		Map.Entry entry = (Map.Entry) map.entrySet().iterator().next();
-
-		Object newValue = new Object();
-		Object oldValue = entry.setValue(newValue);
-		assertEquals(value, oldValue);
-		assertEquals(newValue, entry.getValue());
-		assertEquals(newValue, map.get(key));
-	}
-
-	public void testEntrySet_Entry_Equals() {
-		map.put(key, value);
-
-		Map.Entry entry = (Map.Entry) map.entrySet().iterator().next();
-		assertFalse(entry.equals(null));
-		assertTrue(entry.equals(entry));
-		assertTrue(entry.equals(new MapEntryStub(key, value)));
-	}
-
-	public void testEntrySet_Entry_HashCode() {
-		map.put(key, value);
-
-		// hash computed as required by Map contract
-		int hash = comparer.hashCode(key) ^ value.hashCode();
-		assertEquals(hash, map.entrySet().iterator().next().hashCode());
-	}
-
-	public void testEquals() {
-		assertFalse(map.equals(null));
-		assertTrue(map.equals(map));
-
-		Map other = new HashMap();
-		other.put(key, value);
-
-		assertTrue(map.equals(Collections.EMPTY_MAP));
-		assertFalse(map.equals(other));
-
-		map.put(key, value);
-
-		assertFalse(map.equals(Collections.EMPTY_MAP));
-		assertTrue(map.equals(other));
-	}
-
-	public void testHashCode() {
-		assertEquals(0, map.hashCode());
-
-		map.put(key, value);
-		int hash = comparer.hashCode(key) ^ value.hashCode();
-		assertEquals(hash, map.hashCode());
-	}
-
-	public void testWithComparer() {
-		assertFalse(ViewerElementMap.withComparer(null) instanceof ViewerElementMap);
-		assertTrue(ViewerElementMap.withComparer(comparer) instanceof ViewerElementMap);
-	}
-
-	static class IdentityElementComparer implements IElementComparer {
-		public boolean equals(Object a, Object b) {
-			return a == b;
-		}
-
-		public int hashCode(Object element) {
-			return System.identityHashCode(element);
-		}
-	}
-
-	static class MapEntryStub implements Map.Entry {
-		private final Object key;
-		private final Object value;
-
-		public MapEntryStub(Object key, Object value) {
-			this.key = key;
-			this.value = value;
-		}
-
-		public Object getKey() {
-			return key;
-		}
-
-		public Object getValue() {
-			return value;
-		}
-
-		public Object setValue(Object value) {
-			throw new UnsupportedOperationException();
-		}
-
-		public boolean equals(Object obj) {
-			throw new UnsupportedOperationException();
-		}
-
-		public int hashCode() {
-			throw new UnsupportedOperationException();
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ViewerElementSetTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ViewerElementSetTest.java
deleted file mode 100644
index 4d4a55b..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ViewerElementSetTest.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Matthew Hall - initial API and implementation (bug 215531)
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.viewers;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-
-import org.eclipse.jface.internal.databinding.viewers.ViewerElementSet;
-import org.eclipse.jface.viewers.IElementComparer;
-
-import junit.framework.TestCase;
-
-/**
- * @since 1.2
- */
-public class ViewerElementSetTest extends TestCase {
-	IdentityElementComparer comparer;
-	ViewerElementSet set;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		comparer = new IdentityElementComparer();
-		set = new ViewerElementSet(comparer);
-	}
-
-	public void testConstructor_NullComparer() {
-		try {
-			new ViewerElementSet(null);
-			fail("Constructor should throw exception when null comparer passed in");
-		} catch (RuntimeException expected) {
-		}
-	}
-
-	public void testConstructorWithCollection_NullCollection() {
-		try {
-			new ViewerElementSet(null, new IdentityElementComparer());
-			fail("Constructor should throw exception when null collection passed in");
-		} catch (RuntimeException expected) {}
-	}
-
-	public void testConstructorWithCollection_AddsAllElements() {
-		Collection toCopy = Collections.singleton(new Object());
-		set = new ViewerElementSet(toCopy, new IdentityElementComparer());
-		assertTrue(set.containsAll(toCopy));
-	}
-
-	public void testAdd_ContainsHonorsComparer() {
-		Object o1 = new String("string");
-		Object o2 = new String("string"); // distinct instances
-		assertTrue(o1.equals(o2));
-		assertNotSame(o1, o2);
-
-		assertTrue(set.add(o1));
-
-		assertTrue(set.contains(o1));
-		assertFalse(set.contains(o2));
-	}
-
-	public void testAdd_FilterDuplicateElements() {
-		Object o = new Object();
-
-		assertTrue(set.add(o));
-		assertFalse(set.add(o)); // no change--element already in set
-
-		assertEquals(1, set.size());
-		assertTrue(set.contains(o));
-	}
-
-	public void testAddAll_ContainsAllHonorsComparer() {
-		String o1 = new String("o1");
-		String o2 = new String("o2");
-		Collection items = Arrays.asList(new Object[] { o1, o2 });
-		assertTrue(set.addAll(items));
-
-		assertTrue(set.containsAll(items));
-		assertFalse(set.containsAll(Collections.singleton(new String("o1"))));
-		assertFalse(set.containsAll(Collections.singleton(new String("o2"))));
-	}
-
-	public void testAddAll_FiltersDuplicateElements() {
-		Object o = new Object();
-		set.add(o);
-
-		assertFalse(set.addAll(Collections.singleton(o)));
-	}
-
-	public void testClear() {
-		set.add(new Object());
-		assertEquals(1, set.size());
-
-		set.clear();
-		assertEquals(0, set.size());
-	}
-
-	public void testIsEmpty() {
-		assertTrue(set.isEmpty());
-		set.add(new Object());
-		assertFalse(set.isEmpty());
-	}
-
-	public void testIterator() {
-		Object o = new Object();
-		set.add(o);
-
-		Iterator iterator = set.iterator();
-		assertTrue(iterator.hasNext());
-		assertSame(o, iterator.next());
-
-		assertTrue(set.contains(o));
-		iterator.remove();
-		assertFalse(set.contains(o));
-
-		assertFalse(iterator.hasNext());
-	}
-
-	public void testRemove() {
-		Object o = new Object();
-		assertFalse(set.remove(o));
-
-		assertTrue(set.add(o));
-		assertTrue(set.contains(o));
-		assertTrue(set.remove(o));
-
-		assertFalse(set.contains(o));
-	}
-
-	public void testRemoveAll() {
-		assertFalse(set.removeAll(Collections.EMPTY_SET));
-
-		Object o1 = new Object();
-		Object o2 = new Object();
-		set.addAll(Arrays.asList(new Object[] { o1, o2 }));
-
-		assertTrue(set.removeAll(Collections.singleton(o1)));
-		assertFalse(set.contains(o1));
-		assertFalse(set.removeAll(Collections.singleton(o1)));
-
-		assertTrue(set.removeAll(Arrays.asList(new Object[] { o2, "some",
-				"other", "objects" })));
-		assertFalse(set.contains(o2));
-	}
-
-	public void testRetainAll() {
-		Object o1 = new Object();
-		Object o2 = new Object();
-		set.add(o1);
-		set.add(o2);
-
-		assertFalse(set.retainAll(Arrays.asList(new Object[] { o1, o2 }))); // no
-																			// change
-
-		assertTrue(set.contains(o2));
-		assertTrue(set.retainAll(Collections.singleton(o1)));
-		assertFalse(set.contains(o2));
-
-		assertTrue(set.contains(o1));
-		assertTrue(set.retainAll(Collections.EMPTY_SET));
-		assertFalse(set.contains(o1));
-	}
-
-	public void testSize() {
-		assertEquals(0, set.size());
-
-		Object o = new Object();
-		set.add(o);
-		assertEquals(1, set.size());
-
-		set.remove(o);
-		assertEquals(0, set.size());
-	}
-
-	public void testToArray() {
-		assertEquals(0, set.toArray().length);
-
-		Object o = new Object();
-		set.add(o);
-		assertTrue(Arrays.equals(new Object[] { o }, set.toArray()));
-	}
-
-	public void testToArrayWithObjectArray() {
-		Object o = new String("unique");
-		set.add(o);
-
-		String[] array = (String[]) set.toArray(new String[0]);
-		assertEquals(1, array.length);
-		assertSame(o, array[0]);
-	}
-
-	public void testEquals() {
-		assertTrue(set.equals(set));
-		assertFalse(set.equals(null));
-		assertFalse(set.equals(new Object()));
-
-		assertTrue(set.equals(Collections.EMPTY_SET));
-
-		Object o = new String("string");
-		Object distinct = new String("string");
-		set.add(o);
-		assertTrue(set.equals(Collections.singleton(o)));
-		assertFalse(set.equals(Collections.singleton(distinct)));
-	}
-
-	public void testHashCode() {
-		// Hash code implementation is mandated
-		assertEquals(0, set.hashCode());
-
-		Object o = new Object();
-		set.add(o);
-		int hash = comparer.hashCode(o);
-		assertEquals(hash, set.hashCode());
-
-		Object o2 = new Object();
-		set.add(o2);
-		hash += comparer.hashCode(o2);
-		assertEquals(hash, set.hashCode());
-	}
-
-	static class IdentityElementComparer implements IElementComparer {
-		public boolean equals(Object a, Object b) {
-			return a == b;
-		}
-
-		public int hashCode(Object element) {
-			return System.identityHashCode(element);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ViewerElementWrapperTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ViewerElementWrapperTest.java
deleted file mode 100644
index f85d811..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ViewerElementWrapperTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.internal.databinding.viewers;
-
-import org.eclipse.jface.internal.databinding.viewers.ViewerElementWrapper;
-import org.eclipse.jface.viewers.IElementComparer;
-
-import junit.framework.TestCase;
-
-/**
- * @since 3.2
- * 
- */
-public class ViewerElementWrapperTest extends TestCase {
-	private ViewerElementWrapper wrapper;
-	private Object element;
-	private IElementComparer comparer;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		element = new ElementStub(0);
-		comparer = new IdentityElementComparer();
-		wrapper = new ViewerElementWrapper(element, comparer);
-	}
-
-	public void testConstructor_NullComparer() {
-		try {
-			new ViewerElementWrapper(element, null);
-			fail("Expected NullPointerException");
-		} catch (NullPointerException expected) {
-		}
-	}
-
-	public void testEquals() {
-		assertFalse(wrapper.equals(null));
-		assertTrue(wrapper.equals(wrapper));
-		assertTrue(wrapper.equals(new ViewerElementWrapper(element, comparer)));
-	}
-
-	public void testHashCode() {
-		int hash = 0;
-		element = new ElementStub(hash);
-		wrapper = new ViewerElementWrapper(element, comparer);
-		assertEquals(System.identityHashCode(element), wrapper.hashCode());
-		assertEquals(hash, element.hashCode());
-	}
-
-	static class ElementStub {
-		private final int hash;
-
-		public ElementStub(int hash) {
-			this.hash = hash;
-		}
-
-		public boolean equals(Object obj) {
-			if (obj == this)
-				return true;
-			if (obj == null)
-				return false;
-			if (obj.getClass() != getClass())
-				return false;
-			ElementStub that = (ElementStub) obj;
-			return this.hash == that.hash;
-		}
-
-		public int hashCode() {
-			return hash;
-		}
-	}
-
-	static class IdentityElementComparer implements IElementComparer {
-		public boolean equals(Object a, Object b) {
-			return a == b;
-		}
-
-		public int hashCode(Object element) {
-			return System.identityHashCode(element);
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ViewerInputObservableValueTest.java b/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ViewerInputObservableValueTest.java
deleted file mode 100644
index 6161721..0000000
--- a/tests/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/internal/databinding/viewers/ViewerInputObservableValueTest.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Matthew Hall and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Matthew Hall - initial API and implementation (bug 206839)
- *     Matthew Hall - bug 213145
- *******************************************************************************/
-package org.eclipse.jface.tests.internal.databinding.viewers;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest;
-import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
-import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
-import org.eclipse.jface.internal.databinding.viewers.ViewerInputObservableValue;
-import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Tests for ViewerInputObservableValue.
- * 
- * @since 1.2
- */
-public class ViewerInputObservableValueTest extends
-		AbstractDefaultRealmTestCase {
-	private TableViewer viewer;
-	private static String[] model = new String[] { "0", "1" };
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		Shell shell = new Shell();
-		viewer = new TableViewer(shell, SWT.NONE);
-		viewer.setContentProvider(new ContentProvider());
-	}
-
-	protected void tearDown() throws Exception {
-		Shell shell = viewer.getTable().getShell();
-		if (!shell.isDisposed())
-			shell.dispose();
-		super.tearDown();
-	}
-
-	public void testConstructor_IllegalArgumentException() {
-		try {
-			new ViewerInputObservableValue(Realm.getDefault(), null);
-			fail("Expected IllegalArgumentException for null argument");
-		} catch (IllegalArgumentException expected) {
-		}
-	}
-
-	public void testSetInputOnViewer_FiresNoChangeEvents() {
-		IObservableValue observable = new ViewerInputObservableValue(Realm
-				.getDefault(), viewer);
-		ValueChangeEventTracker listener = ValueChangeEventTracker.observe(observable);
-
-		assertNull(viewer.getInput());
-		assertEquals(0, listener.count);
-
-		viewer.setInput(model);
-
-		assertEquals(model, observable.getValue());
-		assertEquals(0, listener.count);
-
-		viewer.setInput(null);
-
-		assertEquals(null, observable.getValue());
-		assertEquals(0, listener.count);
-	}
-
-	public void testGetSetValue_FiresChangeEvents() {
-		IObservableValue observable = new ViewerInputObservableValue(Realm
-				.getDefault(), viewer);
-		ValueChangeEventTracker listener = new ValueChangeEventTracker();
-		observable.addValueChangeListener(listener);
-
-		assertNull(observable.getValue());
-		assertEquals(0, listener.count);
-
-		observable.setValue(model);
-
-		assertEquals(model, observable.getValue());
-		assertEquals(1, listener.count);
-		assertValueChangeEventEquals(observable, null, model, listener.event);
-
-		observable.setValue(null);
-
-		assertNull(observable.getValue());
-		assertEquals(2, listener.count);
-		assertValueChangeEventEquals(observable, model, null, listener.event);
-	}
-
-	public void testGetValueType_AlwaysNull() throws Exception {
-		IObservableValue observable = new ViewerInputObservableValue(Realm
-				.getDefault(), viewer);
-		assertEquals(null, observable.getValueType());
-	}
-
-	public void testDispose() throws Exception {
-		IObservableValue observable = new ViewerInputObservableValue(Realm
-				.getDefault(), viewer);
-		observable.dispose();
-		assertNull(observable.getRealm());
-		try {
-			observable.setValue(model);
-			fail("Expected NullPointerException");
-		} catch (NullPointerException expected) {
-		}
-	}
-
-	private void assertValueChangeEventEquals(
-			IObservableValue expectedObservable, Object expectedOldValue,
-			Object expectedNewValue, ValueChangeEvent event) {
-		assertSame(expectedObservable, event.getObservableValue());
-		assertEquals(expectedOldValue, event.diff.getOldValue());
-		assertEquals(expectedNewValue, event.diff.getNewValue());
-	}
-
-	static class ContentProvider implements IStructuredContentProvider {
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-		public Object[] getElements(Object inputElement) {
-			return (String[]) inputElement;
-		}
-	}
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(ViewerInputObservableValueTest.class.getName());
-		suite.addTestSuite(ViewerInputObservableValueTest.class);
-		suite.addTest(MutableObservableValueContractTest.suite(new Delegate()));
-		return suite;
-	}
-
-	static class Delegate extends AbstractObservableValueContractDelegate {
-		TableViewer viewer;
-
-		public void setUp() {
-			super.setUp();
-			Shell shell = new Shell();
-			viewer = new TableViewer(shell, SWT.NONE);
-			viewer.setContentProvider(new ContentProvider());
-		}
-
-		public void tearDown() {
-			Shell shell = viewer.getTable().getShell();
-			if (!shell.isDisposed())
-				shell.dispose();
-			super.tearDown();
-		}
-
-		public IObservableValue createObservableValue(Realm realm) {
-			return new ViewerInputObservableValue(realm, viewer);
-		}
-
-		public void change(IObservable observable) {
-			IObservableValue value = (IObservableValue)observable;
-			value.setValue(createValue(value));
-		}
-
-		public Object createValue(IObservableValue observable) {
-			return new String[] { "one", "two" };
-		}
-
-		public Object getValueType(IObservableValue observable) {
-			return null;
-		}
-	}
-}
diff --git a/tests/org.eclipse.jface.tests.databinding/test.xml b/tests/org.eclipse.jface.tests.databinding/test.xml
deleted file mode 100644
index 73284d5..0000000
--- a/tests/org.eclipse.jface.tests.databinding/test.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0"?>
-
-<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.jface.tests.databinding"/>
-  <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="sniff-folder"
-              value="${eclipse-home}/databinding_sniff_folder"/>
-    <delete dir="${sniff-folder}" quiet="true"/>
-    <ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${sniff-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname"
-                value="org.eclipse.jface.tests.databinding.BindingTestSuite"/>
-    </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/tests/org.eclipse.ui.tests.browser/.classpath b/tests/org.eclipse.ui.tests.browser/.classpath
deleted file mode 100644
index 275b34c..0000000
--- a/tests/org.eclipse.ui.tests.browser/.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/tests/org.eclipse.ui.tests.browser/.cvsignore b/tests/org.eclipse.ui.tests.browser/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/tests/org.eclipse.ui.tests.browser/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.browser/.options b/tests/org.eclipse.ui.tests.browser/.options
deleted file mode 100644
index 3481178..0000000
--- a/tests/org.eclipse.ui.tests.browser/.options
+++ /dev/null
@@ -1,4 +0,0 @@
-# Debugging options for the org.eclipse.ui.browser plugin.
-
-# Turn on debugging for the org.eclipse.ui.browser plugin.
-org.eclipse.ui.browser/debug=false
diff --git a/tests/org.eclipse.ui.tests.browser/.project b/tests/org.eclipse.ui.tests.browser/.project
deleted file mode 100644
index 8a25b7f..0000000
--- a/tests/org.eclipse.ui.tests.browser/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.tests.browser</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/tests/org.eclipse.ui.tests.browser/about.html b/tests/org.eclipse.ui.tests.browser/about.html
deleted file mode 100644
index 6f6b96c..0000000
--- a/tests/org.eclipse.ui.tests.browser/about.html
+++ /dev/null
@@ -1,22 +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>February 24, 2005</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.browser/build.properties b/tests/org.eclipse.ui.tests.browser/build.properties
deleted file mode 100644
index 642090b..0000000
--- a/tests/org.eclipse.ui.tests.browser/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               about.html,\
-               .,\
-               browser.jar,\
-               test.xml
-src.includes = about.html
-jars.compile.order = browser.jar
-source.browser.jar = src/
-output.browser.jar = bin/
diff --git a/tests/org.eclipse.ui.tests.browser/plugin.xml b/tests/org.eclipse.ui.tests.browser/plugin.xml
deleted file mode 100644
index d59b7ae..0000000
--- a/tests/org.eclipse.ui.tests.browser/plugin.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.ui.tests.browser"
-   name="%Plugin.name"
-   version="3.1.0"
-   provider-name="%Plugin.providerName"
-   class="org.eclipse.ui.tests.browser.internal.WebBrowserTestsPlugin">
-
-   <runtime>
-      <library name="browser.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.junit"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.ui.browser"/>
-   </requires>
-
-</plugin>
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/AllTests.java b/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/AllTests.java
deleted file mode 100644
index 87abaf7..0000000
--- a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/AllTests.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.browser.internal;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllTests {
-	public static Test suite() {
-		TestSuite suite = new TestSuite("Tests for org.eclipse.ui.browser.tests");
-		//$JUnit-BEGIN$
-		suite.addTestSuite(ExistenceTestCase.class);
-		suite.addTestSuite(InternalBrowserViewTestCase.class);
-		suite.addTestSuite(InternalBrowserEditorTestCase.class);
-		//suite.addTestSuite(ExternalBrowserTestCase.class);
-		
-		suite.addTestSuite(DialogsTestCase.class);
-		suite.addTestSuite(PreferencesTestCase.class);
-		suite.addTestSuite(ToolbarBrowserTestCase.class);
-		//$JUnit-END$
-		return suite;
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/DialogsTestCase.java b/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/DialogsTestCase.java
deleted file mode 100644
index 27bf329..0000000
--- a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/DialogsTestCase.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.browser.internal;
-
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.browser.BrowserDescriptorDialog;
-
-import junit.framework.TestCase;
-
-public class DialogsTestCase extends TestCase {
-	private Shell getShell() {
-		return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-	}
-
-	public void testExternalBrowserDialog() {
-		BrowserDescriptorDialog bdd = new BrowserDescriptorDialog(getShell());
-		UITestHelper.assertDialog(bdd);
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/ExistenceTestCase.java b/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/ExistenceTestCase.java
deleted file mode 100644
index c385ad5..0000000
--- a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/ExistenceTestCase.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.browser.internal;
-
-import org.eclipse.ui.internal.browser.WebBrowserUIPlugin;
-
-import junit.framework.TestCase;
-
-public class ExistenceTestCase extends TestCase {
-	public void testPluginExists() {
-		assertNotNull(WebBrowserUIPlugin.getInstance());
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/ExternalBrowserTestCase.java b/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/ExternalBrowserTestCase.java
deleted file mode 100644
index 64df756..0000000
--- a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/ExternalBrowserTestCase.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.browser.internal;
-
-import java.net.URL;
-
-import org.eclipse.ui.browser.IWebBrowser;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-import org.eclipse.ui.internal.browser.WebBrowserPreference;
-
-import junit.framework.TestCase;
-
-public class ExternalBrowserTestCase extends TestCase {
-	public void testBrowser() throws Exception {
-		WebBrowserPreference.setBrowserChoice(WebBrowserPreference.EXTERNAL);
-		IWorkbenchBrowserSupport wbs = WebBrowserTestsPlugin.getInstance().getWorkbench().getBrowserSupport();
-		IWebBrowser wb = wbs.createBrowser("test2");
-		
-		wb.openURL(new URL("http://www.ibm.com"));
-		
-		try {
-			Thread.sleep(2000);
-		} catch (Exception e) {
-			// ignore
-		}
-		
-		wb.openURL(new URL("http://www.eclipse.org"));
-		
-		try {
-			Thread.sleep(2000);
-		} catch (Exception e) {
-			// ignore
-		}
-		
-		wb.close();
-		
-		try {
-			Thread.sleep(2000);
-		} catch (Exception e) {
-			// ignore
-		}
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/InternalBrowserEditorTestCase.java b/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/InternalBrowserEditorTestCase.java
deleted file mode 100644
index e6a7db1..0000000
--- a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/InternalBrowserEditorTestCase.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.browser.internal;
-
-import java.net.URL;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.browser.IWebBrowser;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-import org.eclipse.ui.internal.browser.WebBrowserPreference;
-
-import junit.framework.TestCase;
-
-public class InternalBrowserEditorTestCase extends TestCase {
-	protected Shell shell;
-
-	public void testBrowser() throws Exception {
-		shell = WebBrowserTestsPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
-		WebBrowserPreference.setBrowserChoice(WebBrowserPreference.INTERNAL);
-		IWorkbenchBrowserSupport wbs = WebBrowserTestsPlugin.getInstance().getWorkbench().getBrowserSupport();
-		IWebBrowser wb = wbs.createBrowser(IWorkbenchBrowserSupport.AS_EDITOR, "test", "MyBrowser", "A tooltip");
-		
-		wb.openURL(new URL("http://www.ibm.com"));
-		runLoopTimer(2);
-		
-		wb.openURL(new URL("http://www.eclipse.org"));
-		runLoopTimer(2);
-		
-		wb.close();
-		runLoopTimer(2);
-	}
-	
-	void runLoopTimer(final int seconds) {
-		final boolean[] exit = {false};
-		new Thread() {
-			public void run() {
-				try {
-					Thread.sleep(seconds * 1000);
-				} catch (Exception e) {
-					// ignore
-				}
-				exit[0] = true;
-				// wake up the event loop
-				Display display = Display.getDefault();
-				if (!display.isDisposed()) {
-					display.asyncExec(new Runnable() {
-						public void run() {
-							if (!shell.isDisposed()) shell.redraw();						
-						}
-					});
-				}
-			}
-		}.start();
-		shell.open();
-		Display display = Display.getCurrent();
-		while (!exit[0] && !shell.isDisposed()) if (!display.readAndDispatch()) display.sleep();
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/InternalBrowserViewTestCase.java b/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/InternalBrowserViewTestCase.java
deleted file mode 100644
index 5a90c56..0000000
--- a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/InternalBrowserViewTestCase.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.browser.internal;
-
-import java.net.URL;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.browser.IWebBrowser;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-import org.eclipse.ui.internal.browser.WebBrowserPreference;
-
-import junit.framework.TestCase;
-
-public class InternalBrowserViewTestCase extends TestCase {
-	protected Shell shell;
-
-	public void testBrowser() throws Exception {
-		shell = WebBrowserTestsPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
-		WebBrowserPreference.setBrowserChoice(WebBrowserPreference.INTERNAL);
-		IWorkbenchBrowserSupport wbs = WebBrowserTestsPlugin.getInstance().getWorkbench().getBrowserSupport();
-		IWebBrowser wb = wbs.createBrowser(IWorkbenchBrowserSupport.AS_VIEW, "test3", "MyBrowser", "A tooltip");
-		
-		wb.openURL(new URL("http://www.ibm.com"));
-		runLoopTimer(2);
-		
-		wb.openURL(new URL("http://www.eclipse.org"));
-		runLoopTimer(2);
-		
-		wb.close();
-		runLoopTimer(2);
-	}
-	
-	void runLoopTimer(final int seconds) {
-		final boolean[] exit = {false};
-		new Thread() {
-			public void run() {
-				try {
-					Thread.sleep(seconds * 1000);
-				} catch (Exception e) {
-					// ignore
-				}
-				exit[0] = true;
-				// wake up the event loop
-				Display display = Display.getDefault();
-				if (!display.isDisposed()) {
-					display.asyncExec(new Runnable() {
-						public void run() {
-							if (!shell.isDisposed()) shell.redraw();						
-						}
-					});
-				}
-			}
-		}.start();
-		shell.open();
-		Display display = Display.getCurrent();
-		while (!exit[0] && !shell.isDisposed()) if (!display.readAndDispatch()) display.sleep();
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/OrderedTestSuite.java b/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/OrderedTestSuite.java
deleted file mode 100644
index 491d8fe..0000000
--- a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/OrderedTestSuite.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.browser.internal;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.Vector;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-class OrderedTestSuite extends TestSuite{
-	public OrderedTestSuite(Class theClass, String name) {
-		this(theClass);
-		setName(name);
-	}
-
-	public OrderedTestSuite(final Class theClass) {
-		super();
-		setName(theClass.getName());
-		try {
-			getTestConstructor(theClass); // Avoid generating multiple error messages
-		} catch (NoSuchMethodException e) {
-			addTest(warning("Class " + theClass.getName()
-					+ " has no public constructor TestCase(String name) or TestCase()"));
-			return;
-		}
-		if (!Modifier.isPublic(theClass.getModifiers())) {
-			addTest(warning("Class " + theClass.getName() + " is not public"));
-			return;
-		}
-		Class superClass = theClass;
-		Vector names = new Vector();
-		while (Test.class.isAssignableFrom(superClass)) {
-			Method[] methods = superClass.getDeclaredMethods();
-			int size = methods.length;
-			for (int i = 0; i < size - 1; i++) {
-				for (int j = i + 1; j < size; j++) {
-					if (methods[i].getName().compareTo(methods[j].getName()) > 0) {
-						Method m = methods[i];
-						methods[i] = methods[j];
-						methods[j] = m;
-					}
-				}
-			}
-			for (int i = 0; i < size; i++) {
-				addTestMethod(methods[i], names, theClass);
-			}
-			superClass = superClass.getSuperclass();
-		}
-		if (!tests().hasMoreElements())
-			addTest(warning("No tests found in " + theClass.getName()));
-	}
-
-	private void addTestMethod(Method m, Vector names, Class theClass) {
-		String name = m.getName();
-		if (names.contains(name))
-			return;
-		if (!isPublicTestMethod(m)) {
-			if (isTestMethod(m))
-				addTest(warning("Test method isn't public: " + m.getName()));
-			return;
-		}
-		names.addElement(name);
-		addTest(createTest(theClass, name));
-	}
-
-	private boolean isPublicTestMethod(Method m) {
-		return isTestMethod(m) && Modifier.isPublic(m.getModifiers());
-	}
-
-	private boolean isTestMethod(Method m) {
-		String name = m.getName();
-		Class[] parameters = m.getParameterTypes();
-		Class returnType = m.getReturnType();
-		return parameters.length == 0 && name.startsWith("test") && returnType.equals(Void.TYPE);
-	}
-
-	private Test warning(final String message) {
-		return new TestCase("warning") {
-			protected void runTest() {
-				fail(message);
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/PreferencesTestCase.java b/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/PreferencesTestCase.java
deleted file mode 100644
index 262d273..0000000
--- a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/PreferencesTestCase.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.browser.internal;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jface.dialogs.Dialog;
-
-public class PreferencesTestCase extends TestCase {
-	public static Test suite() {
-		return new TestSuite(PreferencesTestCase.class);
-	}
-
-	public PreferencesTestCase(String name) {
-		super(name);
-	}
-
-	public void testInternetPreferencePage() {
-		Dialog dialog = UITestHelper.getPreferenceDialog("org.eclipse.internet");
-		UITestHelper.assertDialog(dialog);
-	}
-
-	public void testWebBrowserPreferencePage() {
-		Dialog dialog = UITestHelper.getPreferenceDialog("org.eclipse.wst.internet.webbrowser.preferencePage");
-		UITestHelper.assertDialog(dialog);
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/ToolbarBrowserTestCase.java b/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/ToolbarBrowserTestCase.java
deleted file mode 100644
index 5eb9f1f..0000000
--- a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/ToolbarBrowserTestCase.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.browser.internal;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.browser.BrowserViewer;
-
-public class ToolbarBrowserTestCase extends TestCase {
-	protected static Dialog dialog;
-	protected static Shell shell;
-	protected static BrowserViewer browser;
-	
-	class TestToolbarBrowser extends BrowserViewer {
-
-		public TestToolbarBrowser(Composite parent, int style) {
-			super(parent, style);
-		}
-		
-		public void testProtectedMethods() {
-			super.addToHistory("www.eclispe.org");
-			super.updateBackNextBusy();
-			super.updateHistory();
-			super.updateLocation();
-		}
-	}
-	
-	public static Test suite() {
-		return new OrderedTestSuite(ToolbarBrowserTestCase.class, "ToolbarBrowserTestCase");
-	}
-
-	public void test00Open() throws Exception {
-		shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-		dialog = new Dialog(shell) {
-			protected Control createDialogArea(Composite parent) {
-				Composite composite = (Composite) super.createDialogArea(parent);
-				
-				browser = new BrowserViewer(composite, BrowserViewer.LOCATION_BAR | BrowserViewer.BUTTON_BAR);
-				GridData data = new GridData(GridData.FILL_BOTH);
-				data.widthHint = 400;
-				data.heightHint = 400;
-				browser.setLayoutData(data);
-				
-				return composite;
-			}
-		};
-		dialog.setBlockOnOpen(false);
-		dialog.open();
-		
-		boolean b = Display.getCurrent().readAndDispatch();
-		while (b)
-			b = Display.getCurrent().readAndDispatch();
-	}
-	
-	public void test01SetURL() throws Exception {
-		runLoopTimer(5);
-		browser.setURL("http://www.eclipse.org");
-		runLoopTimer(10);
-	}
-
-	public void test02Home() throws Exception {
-		browser.home();
-		runLoopTimer(2);
-	}
-
-	public void test03SetURL() throws Exception {
-		browser.setURL("http://www.eclipse.org/webtools/index.html");
-		runLoopTimer(10);
-	}
-
-	public void test04IsBackEnabled() throws Exception {
-		assertTrue(browser.isBackEnabled());
-	}
-
-	public void test05Back() throws Exception {
-		assertTrue(browser.back());
-		runLoopTimer(5);
-	}
-	
-	public void test06IsForwardEnabled() throws Exception {
-		assertTrue(browser.isForwardEnabled());
-	}
-
-	public void test07Forward() throws Exception {
-		assertTrue(browser.forward());
-		runLoopTimer(5);
-	}
-	
-	public void test08Refresh() throws Exception {
-		browser.refresh();
-	}
-	
-	public void test09GetBrowser() throws Exception {
-		assertNotNull(browser.getBrowser());
-	}
-	
-	public void test10Stop() throws Exception {
-		browser.stop();
-	}
-
-	public void test11GetURL() throws Exception {
-		assertNotNull(browser.getURL());
-	}
-
-	public void test12SetFocus() throws Exception {
-		browser.setFocus();
-	}
-
-	public void test13Close() throws Exception {
-		dialog.close();
-	}
-	
-	TestToolbarBrowser ttb = null;
-	
-	public void test14ProtectedMethods() {
-		shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-		dialog = new Dialog(shell) {
-			protected Control createDialogArea(Composite parent) {
-				Composite composite = (Composite) super.createDialogArea(parent);
-				
-				ttb = new TestToolbarBrowser(composite, BrowserViewer.LOCATION_BAR | BrowserViewer.BUTTON_BAR);
-				GridData data = new GridData(GridData.FILL_BOTH);
-				data.widthHint = 400;
-				data.heightHint = 400;
-				ttb.setLayoutData(data);
-				
-				return composite;
-			}
-		};
-		dialog.setBlockOnOpen(false);
-		dialog.open();
-		
-		ttb.testProtectedMethods();
-		dialog.close();
-	}
-	
-	public void test15Listeners() {
-		BrowserViewer.IBackNextListener listener = new BrowserViewer.IBackNextListener() {
-			public void updateBackNextBusy() {
-				// ignore
-			}
-		};
-		
-		listener.updateBackNextBusy();
-	}
-	
-	public void test16Listeners() {
-		BrowserViewer.ILocationListener listener = new BrowserViewer.ILocationListener() {
-			public void locationChanged(String url) {
-				// ignore
-			}
-
-			public void historyChanged(String[] history2) {
-				// ignore
-			}
-		};
-		
-		listener.locationChanged(null);
-		listener.historyChanged(null);
-	}
-
-	void runLoopTimer(final int seconds) {
-		final boolean[] exit = {false};
-		new Thread() {
-			public void run() {
-				try {
-					Thread.sleep(seconds * 1000);
-				} catch (Exception e) {
-					// ignore
-				}
-				exit[0] = true;
-				// wake up the event loop
-				Display display = Display.getDefault();
-				if (!display.isDisposed()) {
-					display.asyncExec(new Runnable() {
-						public void run() {
-							if (!shell.isDisposed()) shell.redraw();						
-						}
-					});
-				}
-			}
-		}.start();
-		shell.open();
-		Display display = Display.getCurrent();
-		while (!exit[0] && !shell.isDisposed()) if (!display.readAndDispatch()) display.sleep();
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/UITestHelper.java b/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/UITestHelper.java
deleted file mode 100644
index 3966b1e..0000000
--- a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/UITestHelper.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.browser.internal;
-
-import java.text.MessageFormat;
-import java.util.Iterator;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-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.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.PlatformUI;
-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;
-
-public class UITestHelper {
-	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 static 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);
-		}
-	}
-
-	protected static Shell getShell() {
-		return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-	}
-
-	public static PreferenceDialog getPreferenceDialog(String id) {
-		PreferenceDialogWrapper dialog = null;
-		PreferenceManager manager = WorkbenchPlugin.getDefault().getPreferenceManager();
-		if (manager != null) {
-			dialog = new PreferenceDialogWrapper(getShell(), manager);
-			dialog.create();	
-
-			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 static 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;
-		
-		title = MessageFormat.format("PropertyDialog.propertyMessage", new Object[] {name});
-		dialog = new PropertyDialogWrapper(getShell(), manager, new StructuredSelection(element)); 
-		dialog.create();
-		dialog.getShell().setText(title);
-		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;
-	}
-	
-	/**
-	 * 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 assertDialog(Dialog dialog) {
-		Assert.assertNotNull(dialog);
-		dialog.setBlockOnOpen(false);
-		dialog.open();
-		Shell shell = dialog.getShell();
-		verifyCompositeText(shell);
-		dialog.close();
-	}
-
-	/*
-	 * 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;
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/WebBrowserTestsPlugin.java b/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/WebBrowserTestsPlugin.java
deleted file mode 100644
index e566b7c..0000000
--- a/tests/org.eclipse.ui.tests.browser/src/org/eclipse/ui/tests/browser/internal/WebBrowserTestsPlugin.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.browser.internal;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-/**
- * The web browser tests plugin class.
- */
-public class WebBrowserTestsPlugin extends AbstractUIPlugin {
-	// Web browser plugin id
-	public static final String PLUGIN_ID = "org.eclipse.ui.browser.tests";
-
-	// singleton instance of this class
-	private static WebBrowserTestsPlugin singleton;
-
-	/**
-	 * Create the WebBrowserTestsPlugin
-	 */
-	public WebBrowserTestsPlugin() {
-		super();
-		singleton = this;
-	}
-
-	/**
-	 * Returns the singleton instance of this plugin.
-	 *
-	 * @return org.eclipse.ui.internal.browser.WebBrowserPlugin
-	 */
-	public static WebBrowserTestsPlugin getInstance() {
-		return singleton;
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.browser/test.xml b/tests/org.eclipse.ui.tests.browser/test.xml
deleted file mode 100644
index a48251d..0000000
--- a/tests/org.eclipse.ui.tests.browser/test.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0"?>
-
-<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}\..\.."/> -->
-	<echo message="basedir ${basedir}" />
-	<echo message="eclipse place ${eclipse-home}" />
-  <!-- sets the properties plugin-name, and library-file -->
-  <property name="plugin-name" value="org.eclipse.wst.internet.webbrowser.tests"/>
-  <property name="library-file" value="${eclipse-home}/plugins/org.eclipse.test_3.1.0/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="wst-folder" value="${eclipse-home}/wst_folder"/>
-    <delete dir="${wst-folder}" quiet="true"/>
-    <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${wst-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname" value="org.eclipse.wst.internet.webbrowser.tests.AllTests" />
-   	<property name="plugin-path" value="${eclipse-home}/plugins/${plugin-name}"/>
-    </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>
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.forms/.classpath b/tests/org.eclipse.ui.tests.forms/.classpath
deleted file mode 100755
index d63d95a..0000000
--- a/tests/org.eclipse.ui.tests.forms/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="forms"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tests/org.eclipse.ui.tests.forms/.project b/tests/org.eclipse.ui.tests.forms/.project
deleted file mode 100755
index 59578af..0000000
--- a/tests/org.eclipse.ui.tests.forms/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.tests.forms</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/tests/org.eclipse.ui.tests.forms/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.ui.tests.forms/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100755
index de9c6bf..0000000
--- a/tests/org.eclipse.ui.tests.forms/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Tue Dec 04 10:00:25 PST 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/tests/org.eclipse.ui.tests.forms/META-INF/MANIFEST.MF b/tests/org.eclipse.ui.tests.forms/META-INF/MANIFEST.MF
deleted file mode 100755
index 70fc130..0000000
--- a/tests/org.eclipse.ui.tests.forms/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,16 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Forms Test
-Bundle-SymbolicName: org.eclipse.ui.tests.forms;singleton:=true
-Bundle-Version: 3.3.100.qualifier
-Bundle-Activator: org.eclipse.ui.tests.forms.plugin.FormsTestPlugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.test.performance,
- org.eclipse.ui.forms,
- org.junit
-Eclipse-LazyStart: true
-Bundle-Vendor: Eclipse.org
-Bundle-ClassPath: forms-tests.jar
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
diff --git a/tests/org.eclipse.ui.tests.forms/about.html b/tests/org.eclipse.ui.tests.forms/about.html
deleted file mode 100755
index d42b3ce..0000000
--- a/tests/org.eclipse.ui.tests.forms/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests.forms/build.properties b/tests/org.eclipse.ui.tests.forms/build.properties
deleted file mode 100755
index 0e2ed4c..0000000
--- a/tests/org.eclipse.ui.tests.forms/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = forms-tests.jar,\
-               META-INF/,\
-               about.html,\
-               test.xml
-jars.compile.order = forms-tests.jar
-output.forms-tests.jar = bin/
-source.forms-tests.jar = forms/
diff --git a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/AllFormsPerformanceTests.java b/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/AllFormsPerformanceTests.java
deleted file mode 100755
index 8871ee9..0000000
--- a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/AllFormsPerformanceTests.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.forms;
-
-import org.eclipse.ui.tests.forms.performance.FormsPerformanceTest;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/*
- * Tests forms performance (automated).
- */
-public class AllFormsPerformanceTests extends TestSuite {
-
-	/*
-	 * Returns the entire test suite.
-	 */
-	public static Test suite() {
-		return new AllFormsPerformanceTests();
-	}
-
-	/*
-	 * Constructs a new performance test suite.
-	 */
-	public AllFormsPerformanceTests() {
-		addTestSuite(FormsPerformanceTest.class);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/AllFormsTests.java b/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/AllFormsTests.java
deleted file mode 100755
index 154822a..0000000
--- a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/AllFormsTests.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.forms;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.ui.tests.forms.layout.AllLayoutTests;
-import org.eclipse.ui.tests.forms.util.AllUtilityTests;
-
-/*
- * Tests all cheat sheet functionality (automated).
- */
-public class AllFormsTests extends TestSuite {
-
-	/*
-	 * Returns the entire test suite.
-	 */
-	public static Test suite() {
-		return new AllFormsTests();
-	}
-
-	/*
-	 * Constructs a new test suite.
-	 */
-	public AllFormsTests() {
-		addTest(AllLayoutTests.suite());
-		addTest(AllUtilityTests.suite());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/layout/AllLayoutTests.java b/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/layout/AllLayoutTests.java
deleted file mode 100755
index 4f47a8f..0000000
--- a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/layout/AllLayoutTests.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.forms.layout;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllLayoutTests {
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite(
-				"org.eclipse.ua.tests.forms.AllLayoutTests");
-		//$JUnit-BEGIN$
-		suite.addTestSuite(TestTableWrapLayout.class);
-		//$JUnit-END$
-		return suite;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/layout/TestTableWrapLayout.java b/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/layout/TestTableWrapLayout.java
deleted file mode 100755
index da8ffea..0000000
--- a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/layout/TestTableWrapLayout.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.forms.layout;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-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.ui.PlatformUI;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-import junit.framework.TestCase;
-
-public class TestTableWrapLayout extends TestCase {
-
-	private final String A1 = "A";
-	private final String A10 = "A A A A A A A A A A";
-	private final String A20 = A10 + " " + A10;
-	private final String A40 = A20 + " " + A20;
-	private final String A80 = A40 + " " + A40;
-	
-	// Returns the width + left
-	private int rightEdge(Label lab) {
-		Rectangle r = lab.getBounds();
-		return r.x + r.width;
-	}
-	
-	/**
-	 * Test that labels with the WRAP property set do indeed wrap.
-	 */
-	public void testTableWrapLayoutNonWrappingLabels() {
-		Display display = PlatformUI.getWorkbench().getDisplay();
-		Shell shell = new Shell(display);
-		shell.setSize(100, 300);
-		shell.setLayout(new FillLayout());
-		Composite inner = new Composite(shell, SWT.V_SCROLL);
-		inner.setLayout(new TableWrapLayout());
-		Label l1 = new Label(inner, SWT.NULL);
-		l1.setText(A10);
-		Label l2 = new Label(inner, SWT.NULL);
-		l2.setText(A80);
-		shell.layout();
-		assertEquals(l1.getSize().y, l2.getSize().y);
-		assertTrue(l2.getSize().x > 100);
-		shell.dispose();
-	}
-	
-	/**
-	 * Test that labels with the WRAP property set do indeed wrap.
-	 */
-    // Test suppressed for now - does not pass but not sure if this is a bug
-	public void suppressed_testWrappingPoint() {
-		Display display = PlatformUI.getWorkbench().getDisplay();
-		Shell shell = new Shell(display);
-		shell.setSize(300, 300);
-		shell.setLayout(new FillLayout());
-		Composite inner = new Composite(shell, SWT.V_SCROLL);
-		TableWrapLayout tableWrapLayout = new TableWrapLayout();
-		tableWrapLayout.leftMargin = 0;
-		tableWrapLayout.rightMargin = 0;
-		inner.setLayout(tableWrapLayout);
-		Label l1 = new Label(inner, SWT.WRAP);
-		l1.setText(A10);
-		shell.layout();
-		int originalWidth = l1.getSize().x;
-		int originalHeight = l1.getSize().y;
-		shell.setSize(originalWidth, 300);
-		shell.layout();
-		assertEquals(l1.getSize().y, originalHeight);
-		shell.setSize(originalWidth / 2, 300);
-		shell.layout();
-		inner.layout();
-		assertTrue(l1.getSize().y > originalHeight);
-		shell.dispose();
-	}
-	
-	/**
-	 * Test that labels with the WRAP property set do indeed wrap.
-	 */
-	// Test suppressed for now, see Bug 196686 
-	public void suppressed_testTableWrapLayoutWrappingLabels() {
-		Display display = PlatformUI.getWorkbench().getDisplay();
-		Shell shell = new Shell(display);
-		shell.setSize(100, 300);
-		shell.setLayout(new FillLayout());
-		Composite inner = new Composite(shell, SWT.V_SCROLL);
-		inner.setLayout(new TableWrapLayout());
-		Label l1 = new Label(inner, SWT.WRAP);
-		l1.setText(A10);
-		Label l2 = new Label(inner, SWT.WRAP);
-		l2.setText(A80);
-		shell.layout();
-		assertTrue(l1.getSize().y < l2.getSize().y);
-		assertTrue("Label is too wide for layout ", l1.getSize().x <= 100);
-		assertTrue("Label is too wide for layout ", l2.getSize().x <= 100);
-		assertTrue("Labels overlap", l2.getBounds().y >= l1.getBounds().y + l1.getBounds().height);
-		shell.dispose();
-	}
-	
-	/**
-	 * Test a 2x2 grid with unequal sizes
-	 */
-	public void testTableWrapLayoutTwoColumnsWrappingLabels() {
-		Display display = PlatformUI.getWorkbench().getDisplay();
-		Shell shell = new Shell(display);
-		shell.setSize(100, 300);
-		shell.setLayout(new FillLayout());
-		Composite inner = new Composite(shell, SWT.V_SCROLL);
-		TableWrapLayout tableWrapLayout = new TableWrapLayout();
-		tableWrapLayout.numColumns = 2;
-		inner.setLayout(tableWrapLayout);
-		Label l1 = new Label(inner, SWT.WRAP);
-		l1.setText(A10);
-		Label l2 = new Label(inner, SWT.WRAP);
-		l2.setText(A20);
-		Label l3 = new Label(inner, SWT.WRAP);
-		l3.setText(A40);
-		Label l4 = new Label(inner, SWT.WRAP);
-		l4.setText(A80);
-		shell.layout();
-		assertTrue(l1.getSize().x < l2.getSize().x);
-		assertTrue(l1.getSize().y < l3.getSize().y);
-		assertTrue(l1.getSize().x < l4.getSize().x);
-		assertTrue(l2.getSize().y < l3.getSize().y);
-		assertTrue("Label is too wide for layout ", l1.getSize().x + l2.getSize().x <= 100);
-		assertTrue("Labels overlap", l2.getBounds().x >= l1.getBounds().x + l1.getBounds().width);
-		assertTrue("Labels overlap", l3.getBounds().y >= l1.getBounds().y + l1.getBounds().height);
-		assertTrue("Labels overlap", l4.getBounds().x >= l3.getBounds().x + l3.getBounds().width);
-		assertTrue("Labels overlap", l4.getBounds().y >= l2.getBounds().y + l2.getBounds().height);
-		shell.dispose();
-	}
-	
-	/**
-	 * Test alignments and margins
-	 */
-	// Suppressed for now - see Bug 196686 
-	public void suppressed_testTableWrapLayoutAlignment() {
-		Display display = PlatformUI.getWorkbench().getDisplay();
-		Shell shell = new Shell(display);
-		shell.setSize(100, 300);
-		shell.setLayout(new FillLayout());
-		Composite inner = new Composite(shell, SWT.V_SCROLL);
-		TableWrapLayout tableWrapLayout = new TableWrapLayout();
-		final int LEFT_MARGIN = 1;
-		final int RIGHT_MARGIN = 2;
-		final int TOP_MARGIN = 3;
-		final int BOTTOM_MARGIN = 4;
-		tableWrapLayout.leftMargin = LEFT_MARGIN;
-		tableWrapLayout.rightMargin = RIGHT_MARGIN;
-		tableWrapLayout.topMargin = TOP_MARGIN;
-		tableWrapLayout.bottomMargin = BOTTOM_MARGIN;
-		inner.setLayout(tableWrapLayout);
-		Label lab0 = new Label(inner, SWT.WRAP);
-		lab0.setText(A80);
-		Label labLeft = new Label(inner, SWT.NULL);
-		labLeft.setText(A1);
-		TableWrapData dataLeft = new TableWrapData();
-		dataLeft.align = TableWrapData.LEFT;
-		labLeft.setLayoutData(dataLeft);
-		Label labRight = new Label(inner, SWT.NULL);
-		labRight.setText(A1);
-		TableWrapData dataRight = new TableWrapData();
-		dataRight.align = TableWrapData.RIGHT;
-		labRight.setLayoutData(dataRight);
-		Label labCenter = new Label(inner, SWT.NULL);
-		labCenter.setText(A1);
-		TableWrapData dataCenter = new TableWrapData();
-		dataCenter.align = TableWrapData.CENTER;
-		labCenter.setLayoutData(dataCenter);
-		Label labFill = new Label(inner, SWT.NULL);
-		labFill.setText(A1);
-		TableWrapData dataFill = new TableWrapData();
-		dataFill.align = TableWrapData.FILL;
-		labFill.setLayoutData(dataFill);
-		shell.layout();
-		// Check layout
-		assertEquals(LEFT_MARGIN , labLeft.getBounds().x);
-		assertTrue(rightEdge(lab0) > rightEdge(labLeft));
-		assertTrue(rightEdge(labLeft) + tableWrapLayout.rightMargin < 100);
-		
-		assertEquals(rightEdge(labRight), rightEdge(lab0));
-		assertTrue(labRight.getBounds().x > LEFT_MARGIN);
-		
-		assertTrue(labCenter.getBounds().x > LEFT_MARGIN);
-		assertTrue(rightEdge(lab0) > rightEdge(labCenter));
-		
-		int offCenter = rightEdge(labCenter) + labCenter.getBounds().x 
-		   - rightEdge(lab0) + lab0.getBounds().x;
-		assertTrue(offCenter >= -2);
-		assertTrue(offCenter <= 2);
-		
-		assertEquals(LEFT_MARGIN , labFill.getBounds().x);
-		assertEquals(rightEdge(labFill), rightEdge(lab0));
-		shell.dispose();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/performance/FormsPerformanceTest.java b/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/performance/FormsPerformanceTest.java
deleted file mode 100755
index ec8a642..0000000
--- a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/performance/FormsPerformanceTest.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.forms.performance;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-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.Text;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.test.performance.Performance;
-import org.eclipse.test.performance.PerformanceTestCase;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.events.ExpansionAdapter;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-public class FormsPerformanceTest extends PerformanceTestCase {
-	
-	public void test_createForm() {
-		tagAsSummary("Create Form", Dimension.ELAPSED_PROCESS);
-	    Performance.getDefault();
-		
-		// Warm up.
-
-		Display display = PlatformUI.getWorkbench().getDisplay();
-
-		FormToolkit toolkit;
-		toolkit = new FormToolkit(display);
-		for(int samples = 0; samples < 2; samples++) {
-			Shell shell = new Shell(display);
-			shell.setSize(400, 300);
-			shell.setLayout(new FillLayout());
-			shell.open();
-
-			for (int i = 0; i < 5; i++) {
-				Composite c = new Composite(shell, SWT.H_SCROLL + SWT.V_SCROLL);
-				c.setLayout(new FillLayout());
-                createPartControl(c, toolkit);
-                shell.layout(true); 
-                while(display.readAndDispatch()){/*empty*/}
-				c.dispose();
-			}
-			shell.dispose();
-			while(display.readAndDispatch()){/*empty*/}
-		}
-
-		for(int samples = 0; samples < 50; samples++) {
-			Shell shell = new Shell(display);
-			shell.setSize(400, 300);
-			shell.setLayout(new FillLayout());
-			shell.open();
-			startMeasuring();
-			for (int i = 0; i < 3; i++) {
-				Composite c = new Composite(shell, SWT.H_SCROLL + SWT.V_SCROLL);
-				c.setLayout(new FillLayout());
-                createPartControl(c, toolkit);
-                shell.layout(true);
-                while(display.readAndDispatch()){/*empty*/}
-				c.dispose();
-			}
-			stopMeasuring(); 
-			shell.dispose();
-			while(display.readAndDispatch()){/*empty*/}
-		}	
-		toolkit.dispose();
-		commitMeasurements();
-		assertPerformance();
-	}
-	
-	public void createPartControl(Composite parent, FormToolkit toolkit) {
-		//Label l = new Label(parent, SWT.NULL);
-		//l.setText ("a label");
-		ScrolledForm form;
-		form = toolkit.createScrolledForm(parent);
-		form.setText("Hello, Eclipse Forms");
-		TableWrapLayout layout = new TableWrapLayout();
-		form.getBody().setLayout(layout);
-		
-		Hyperlink link = toolkit.createHyperlink(form.getBody(), "Click here.",
-				SWT.WRAP);
-		link.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				System.out.println("Link activated!");
-			}
-		});
-		link.setText("This is an example of a form that is much longer and will need to wrap.");
-		layout.numColumns = 2;
-		TableWrapData td = new TableWrapData();
-		td.colspan = 2;
-		link.setLayoutData(td);
-		toolkit.createLabel(form.getBody(), "Text field label:");
-		Text text = toolkit.createText(form.getBody(), "");
-		td = new TableWrapData(TableWrapData.FILL_GRAB);
-		text.setLayoutData(td);
-		Button button = toolkit.createButton(form.getBody(),
-				"An example of a checkbox in a form", SWT.CHECK);
-		td = new TableWrapData();
-		td.colspan = 2;
-		button.setLayoutData(td);
-		
-		ImageHyperlink ih = toolkit.createImageHyperlink(form.getBody(), SWT.NULL);
-		ih.setText("Image link with no image");
-		ih = toolkit.createImageHyperlink(form.getBody(), SWT.NULL);
-		//ih.setImage(ExamplesPlugin.getDefault().getImageRegistry().get(ExamplesPlugin.IMG_SAMPLE));
-		ih.setText("Link with image and text");
-		
-		ExpandableComposite ec = toolkit.createExpandableComposite(form.getBody(), ExpandableComposite.TREE_NODE|ExpandableComposite.CLIENT_INDENT);
-		ImageHyperlink eci = toolkit.createImageHyperlink(ec, SWT.NULL);
-		//eci.setImage(ExamplesPlugin.getDefault().getImageRegistry().get(ExamplesPlugin.IMG_SAMPLE));
-		ec.setTextClient(eci);
-		ec.setText("Expandable Composite title");
-		String ctext = "We will now create a somewhat long text so that "+
-		"we can use it as content for the expandable composite. "+
-		"Expandable composite is used to hide or show the text using the "+
-		"toggle control";
-		Label client = toolkit.createLabel(ec, ctext, SWT.WRAP);
-		ec.setClient(client);
-		td = new TableWrapData();
-		td.colspan = 2;
-		ec.setLayoutData(td);
-		ec.addExpansionListener(new ExpansionAdapter() {
-			public void expansionStateChanged(ExpansionEvent e) {
-				//form.reflow(true);
-			}
-		});
-		Section section = toolkit.createSection(form.getBody(), Section.DESCRIPTION|Section.TWISTIE|Section.EXPANDED);
-		td = new TableWrapData(TableWrapData.FILL);
-		td.colspan = 2;
-		section.setLayoutData(td);
-		section.addExpansionListener(new ExpansionAdapter() {
-			public void expansionStateChanged(ExpansionEvent e) {
-				//form.reflow(true);
-			}
-		});
-		section.setText("Section title");
-		toolkit.createCompositeSeparator(section);
-		section.setDescription("This is the description that goes below the title");
-		Composite sectionClient = toolkit.createComposite(section);
-		sectionClient.setLayout(new GridLayout());
-		button = toolkit.createButton(sectionClient, "Radio 1", SWT.RADIO);
-		button = toolkit.createButton(sectionClient, "Radio 2", SWT.RADIO);
-		section.setClient(sectionClient);
-
-		StringBuffer buf = new StringBuffer();
-		buf.append("<form>");
-		buf.append("<p>");
-		buf.append("Here is some plain text for the text to render; ");
-		buf.append("this text is at <a href=\"http://www.eclipse.org\" nowrap=\"true\">http://www.eclipse.org</a> web site.");
-		buf.append("</p>");
-		buf.append("<p>");
-		buf.append("<span color=\"header\" font=\"header\">This text is in header font.</span>");
-		buf.append("</p>");
-		buf.append("<p>This line will contain some <b>bold</b> and some <span font=\"code\">source</span> text. ");
-		buf.append("We can also add <img href=\"image\"/> an image. ");
-		buf.append("</p>");
-		buf.append("<li>A default (bulleted) list item.</li>");
-		buf.append("<li>Another bullet list item.</li>");
-		buf.append("<li style=\"text\" value=\"1.\">A list item with text.</li>");
-		buf.append("<li style=\"text\" value=\"2.\">Another list item with text</li>");
-		buf.append("<li style=\"image\" value=\"image\">List item with an image bullet</li>");
-		buf.append("<li style=\"text\" bindent=\"20\" indent=\"40\" value=\"3.\">A list item with text.</li>");
-		buf.append("<li style=\"text\" bindent=\"20\" indent=\"40\" value=\"4.\">A list item with text.</li>");
-		buf.append("<p>     leading blanks;      more white \n\n new lines   <br/><br/><br/> \n more <b>   bb   </b>  white  . </p>");
-		buf.append("</form>");
-		FormText rtext = toolkit.createFormText(form.getBody(), false);
-		//rtext.setWhitespaceNormalized(false);
-		td = new TableWrapData(TableWrapData.FILL);
-		td.colspan = 2;
-		rtext.setLayoutData(td);
-		//rtext.setImage("image", ExamplesPlugin.getDefault().getImageRegistry().get(ExamplesPlugin.IMG_SAMPLE));
-		//rtext.setColor("header", JFaceColors.getErrorText(display));
-		rtext.setFont("header", JFaceResources.getHeaderFont());
-		rtext.setFont("code", JFaceResources.getTextFont());
-		rtext.setText(buf.toString(), true, false);
-		rtext.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				System.out.println("Link active: "+e.getHref());
-			}
-		});
-/*		layout.numColumns = 3;
-		Label label;
-		TableWrapData td;
-		
-		label = toolkit.createLabel(form.getBody(), "Some text to put in the first column", SWT.WRAP);
-		label = toolkit.createLabel(form.getBody() ,"Some text to put in the second column and make it a bit longer so that we can see what happens with column distribution. This text must be the longest so that it can get more space allocated to the columns it belongs to.", SWT.WRAP);
-		td = new TableWrapData();
-		td.colspan = 2;
-		label.setLayoutData(td);
-		label = toolkit.createLabel(form.getBody(), "This text will span two rows and should not grow the column.", SWT.WRAP);
-		td = new TableWrapData();
-		td.rowspan = 2;
-		label.setLayoutData(td);
-		label = toolkit.createLabel(form.getBody(), "This text goes into column 2 and consumes only one cell", SWT.WRAP);
-		label.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-		label = toolkit.createLabel(form.getBody(), "This text goes into column 3 and consumes only one cell too", SWT.WRAP);
-		label.setLayoutData(new TableWrapData(TableWrapData.FILL));
-		label = toolkit.createLabel(form.getBody(), "This text goes into column 2 and consumes only one cell", SWT.WRAP);
-		label.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-		label = toolkit.createLabel(form.getBody(), "This text goes into column 3 and consumes only one cell too", SWT.WRAP);
-		label.setLayoutData(new TableWrapData(TableWrapData.FILL));
-		form.getBody().setBackground(form.getBody().getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));*/
-		
-		toolkit.paintBordersFor(form.getBody());
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/plugin/FormsTestPlugin.java b/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/plugin/FormsTestPlugin.java
deleted file mode 100755
index 0e3ceb2..0000000
--- a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/plugin/FormsTestPlugin.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.forms.plugin;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class FormsTestPlugin extends AbstractUIPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.ui.tests.forms";
-
-	// The shared instance
-	private static FormsTestPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public FormsTestPlugin() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static FormsTestPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/util/AllUtilityTests.java b/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/util/AllUtilityTests.java
deleted file mode 100755
index 79910b6..0000000
--- a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/util/AllUtilityTests.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.forms.util;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/*
- * Tests forms performance (automated).
- */
-public class AllUtilityTests extends TestSuite {
-
-	/*
-	 * Returns the entire test suite.
-	 */
-	public static Test suite() {
-		return new AllUtilityTests();
-	}
-
-	/*
-	 * Constructs a new performance test suite.
-	 */
-	public AllUtilityTests() {
-		addTestSuite(FormImagesTests.class);
-		addTestSuite(FormFontsTests.class);
-		addTestSuite(FormColorsTests.class);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/util/FormColorsTests.java b/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/util/FormColorsTests.java
deleted file mode 100644
index d98e8ff..0000000
--- a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/util/FormColorsTests.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
- 
-package org.eclipse.ui.tests.forms.util;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.forms.FormColors;
-import org.eclipse.ui.forms.IFormColors;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-
-public class FormColorsTests extends TestCase {
-
-	// these keys should always return a Color until disposed
-	private static String[] KEYS_NON_NULL = {
-		IFormColors.BORDER,
-		IFormColors.H_BOTTOM_KEYLINE1,
-		IFormColors.H_BOTTOM_KEYLINE2,
-		IFormColors.H_GRADIENT_END,
-		IFormColors.H_GRADIENT_START,
-		IFormColors.H_HOVER_FULL,
-		IFormColors.H_HOVER_LIGHT,
-		IFormColors.SEPARATOR,
-		IFormColors.TB_BG,
-		IFormColors.TB_BORDER,
-		IFormColors.TB_TOGGLE,
-		IFormColors.TB_TOGGLE_HOVER
-	};
-	// these keys may return null
-	private static String[] KEYS_NULL = {
-		IFormColors.TB_FG
-	};
-
-	private static String TEST_KEY_1 = "testKey1";
-	private static String TEST_KEY_2 = "testKey2";
-	
-	public void testStandalone() {
-		FormColors fColors = new FormColors(Display.getCurrent());
-		Color[] colors = new Color[KEYS_NON_NULL.length];
-		for (int i = 0; i < KEYS_NON_NULL.length; i++)
-			colors[i] = fColors.getColor(KEYS_NON_NULL[i]);
-		Color[] nullColors = new Color[KEYS_NULL.length];
-		for (int i = 0; i < KEYS_NULL.length; i++)
-			nullColors[i] = fColors.getColor(KEYS_NULL[i]);
-		Color inactiveBg = fColors.getInactiveBackground();
-		Color bg = fColors.getBackground();
-		Color fg = fColors.getForeground();
-		Color bc = fColors.getBorderColor();
-		for (int i = 0; i < KEYS_NON_NULL.length; i++)
-			assertEquals("FormColors did not return the same instance for key: " + KEYS_NON_NULL[i], colors[i], fColors.getColor(KEYS_NON_NULL[i]));
-		for (int i = 0; i < KEYS_NULL.length; i++)
-			assertEquals("FormColors did not return the same instance for key: " + KEYS_NULL[i], nullColors[i], fColors.getColor(KEYS_NULL[i]));
-		Assert.assertEquals("FormColors did not return the same instance for getInactiveBackground()", inactiveBg, fColors.getInactiveBackground());
-		Assert.assertEquals("FormColors did not return the same instance for getBackground()", bg, fColors.getBackground());
-		Assert.assertEquals("FormColors did not return the same instance for getForeground()", fg, fColors.getForeground());
-		Assert.assertEquals("FormColors did not return the same instance for getBorderColor()", bc, fColors.getBorderColor());
-		boolean testBorderDispose = !bc.equals(fColors.getColor(IFormColors.BORDER));
-		fColors.dispose();
-		for (int i = 0; i < KEYS_NON_NULL.length; i++)
-			Assert.assertTrue("FormColors did not dispose key: " + KEYS_NON_NULL[i], colors[i].isDisposed());
-		for (int i = 0; i < KEYS_NULL.length; i++)
-			Assert.assertTrue("FormColors did not dispose key: " + KEYS_NULL[i], nullColors[i] == null || nullColors[i].isDisposed());
-		Assert.assertTrue("FormColors did not dispose getInactiveBackground()", inactiveBg.isDisposed());
-		Assert.assertFalse("FormColors disposed getBackground()", bg.isDisposed());
-		Assert.assertFalse("FormColors disposed getForeground()", fg.isDisposed());
-		if (testBorderDispose)
-			Assert.assertFalse("FormColors disposed getBorderColor() when it shouldn't have", bc.isDisposed());
-	}
-	
-	public void testMultiple() {
-		FormColors fColors = new FormColors(Display.getCurrent());
-		Color[] colors = new Color[KEYS_NON_NULL.length];
-		for (int i = 0; i < KEYS_NON_NULL.length; i++)
-			colors[i] = fColors.getColor(KEYS_NON_NULL[i]);
-		Color[] nullColors = new Color[KEYS_NULL.length];
-		for (int i = 0; i < KEYS_NULL.length; i++)
-			nullColors[i] = fColors.getColor(KEYS_NULL[i]);
-		Color inactiveBg = fColors.getInactiveBackground();
-		Color bg = fColors.getBackground();
-		Color fg = fColors.getForeground();
-		Color bc = fColors.getBorderColor();
-		FormColors fColors2 = new FormColors(Display.getCurrent());
-		Color[] colors2 = new Color[KEYS_NON_NULL.length];
-		for (int i = 0; i < KEYS_NON_NULL.length; i++)
-			colors2[i] = fColors2.getColor(KEYS_NON_NULL[i]);
-		Color[] nullColors2 = new Color[KEYS_NULL.length];
-		for (int i = 0; i < KEYS_NULL.length; i++)
-			nullColors2[i] = fColors2.getColor(KEYS_NULL[i]);
-		Color inactiveBg2 = fColors2.getInactiveBackground();
-		Color bg2 = fColors2.getBackground();
-		Color fg2 = fColors2.getForeground();
-		Color bc2 = fColors2.getBorderColor();
-		for (int i = 0; i < KEYS_NON_NULL.length; i++)
-			Assert.assertEquals("Different concurrent instances of FormColors did not return the same Color for key: " + KEYS_NON_NULL[i], colors[i], colors2[i]);
-		for (int i = 0; i < KEYS_NULL.length; i++)
-			Assert.assertEquals("Different concurrent instances of FormColors did not return the same Color for key: " + KEYS_NULL[i], nullColors[i], nullColors2[i]);
-		Assert.assertEquals("Different concurrent instances of FormColors did not return the same Color for getInactiveBackground()", inactiveBg, inactiveBg2);
-		Assert.assertEquals("Different concurrent instances of FormColors did not return the same Color for getBackground()", bg, bg2);
-		Assert.assertEquals("Different concurrent instances of FormColors did not return the same Color for getForeground()", fg, fg2);
-		Assert.assertEquals("Different concurrent instances of FormColors did not return the same Color for getBorderColor()", bc, bc2);
-		fColors2.dispose();
-		for (int i = 0; i < KEYS_NON_NULL.length; i++)
-			Assert.assertFalse("FormColors disposed different instance's key: " + KEYS_NON_NULL[i] , colors[i].isDisposed());
-		for (int i = 0; i < KEYS_NULL.length; i++)
-			Assert.assertFalse("FormColors disposed different instance's key: " + KEYS_NULL[i], nullColors[i] != null && nullColors[i].isDisposed());
-		Assert.assertFalse("FormColors disposed different instance's getInactiveBackground()", inactiveBg.isDisposed());
-		Assert.assertFalse("FormColors disposed different instance's getBackground()", bg.isDisposed());
-		Assert.assertFalse("FormColors disposed different instance's getForeground()", fg.isDisposed());
-		Assert.assertFalse("FormColors disposed different instance's getBorderColor()", bc.isDisposed());
-		fColors.dispose();
-	}
-
-	public void testShared() {
-		FormColors fColors = new FormColors(Display.getCurrent());
-		fColors.markShared();
-		FormToolkit tk = new FormToolkit(fColors);
-		FormToolkit tk2 = new FormToolkit(fColors);
-		Color[] colors = new Color[KEYS_NON_NULL.length];
-		for (int i = 0; i < KEYS_NON_NULL.length; i++)
-			colors[i] = tk.getColors().getColor(KEYS_NON_NULL[i]);
-		Color[] nullColors = new Color[KEYS_NULL.length];
-		for (int i = 0; i < KEYS_NULL.length; i++)
-			nullColors[i] = tk.getColors().getColor(KEYS_NULL[i]);
-		Color inactiveBg = tk.getColors().getInactiveBackground();
-		Color bg = tk.getColors().getBackground();
-		Color fg = tk.getColors().getForeground();
-		Color bc = tk.getColors().getBorderColor();
-		Color[] colors2 = new Color[KEYS_NON_NULL.length];
-		for (int i = 0; i < KEYS_NON_NULL.length; i++)
-			colors2[i] = tk2.getColors().getColor(KEYS_NON_NULL[i]);
-		Color[] nullColors2 = new Color[KEYS_NULL.length];
-		for (int i = 0; i < KEYS_NULL.length; i++)
-			nullColors2[i] = tk2.getColors().getColor(KEYS_NULL[i]);
-		boolean testBorderDispose = !bc.equals(fColors.getColor(IFormColors.BORDER));
-		tk2.dispose();
-		for (int i = 0; i < KEYS_NON_NULL.length; i++)
-			Assert.assertFalse("FormToolkit disposed shared FormColor's key: " + KEYS_NON_NULL[i] , colors[i].isDisposed());
-		for (int i = 0; i < KEYS_NULL.length; i++)
-			Assert.assertFalse("FormToolkit disposed shared FormColor's key: " + KEYS_NULL[i], nullColors[i] != null && nullColors[i].isDisposed());
-		Assert.assertFalse("FormToolkit disposed shared FormColor's getInactiveBackground()", inactiveBg.isDisposed());
-		Assert.assertFalse("FormToolkit disposed shared FormColor's getBackground()", bg.isDisposed());
-		Assert.assertFalse("FormToolkit disposed shared FormColor's getForeground()", fg.isDisposed());
-		Assert.assertFalse("FormToolkit disposed shared FormColor's getBorderColor()", bc.isDisposed());
-		tk.dispose();
-		for (int i = 0; i < KEYS_NON_NULL.length; i++)
-			Assert.assertFalse("Last FormToolkit disposed shared FormColor's key: " + KEYS_NON_NULL[i], colors[i].isDisposed());
-		for (int i = 0; i < KEYS_NULL.length; i++)
-			Assert.assertFalse("Last FormToolkit disposed shared FormColor's key: " + KEYS_NULL[i], nullColors[i] != null && nullColors[i].isDisposed());
-		Assert.assertFalse("Last FormToolkit disposed shared FormColor's getInactiveBackground()", inactiveBg.isDisposed());
-		Assert.assertFalse("Last FormToolkit disposed shared FormColor's getBackground()", bg.isDisposed());
-		Assert.assertFalse("Last FormToolkit disposed shared FormColor's getForeground()", fg.isDisposed());
-		if (testBorderDispose)
-			Assert.assertFalse("Last FormToolkit with shared FormColors disposed getBorderColor() when it shouldn't have", bc.isDisposed());
-		fColors.dispose();
-	}
-	
-	public void testCustom() {
-		FormColors fColors = new FormColors(Display.getCurrent());
-		Color test1 = fColors.createColor(TEST_KEY_1, 255, 155, 55);
-		Color test2 = fColors.createColor(TEST_KEY_2, 55, 155, 255);
-		Assert.assertEquals("FormColors returned wrong color for an existing key.", fColors.getColor(TEST_KEY_1), test1);
-		Assert.assertEquals("FormColors returned wrong color for an existing key.", fColors.getColor(TEST_KEY_2), test2);
-		fColors.dispose();
-		Assert.assertTrue("FormColors did not dispose a custom key.", test1.isDisposed());
-		Assert.assertTrue("FormColors did not dispose a custom key.", test2.isDisposed());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/util/FormFontsTests.java b/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/util/FormFontsTests.java
deleted file mode 100755
index e10713a..0000000
--- a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/util/FormFontsTests.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
- 
-package org.eclipse.ui.tests.forms.util;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.internal.forms.widgets.FormFonts;
-
-public class FormFontsTests extends TestCase {
-	public void testSingleton() {
-		Display display = Display.getCurrent();
-		FormFonts instance = FormFonts.getInstance();
-		// ensure the singleton is returning the same instance
-		Assert.assertTrue("getInstance() returned a different FormFonts instance", instance.equals(FormFonts.getInstance()));
-		Font boldSystemFont = instance.getBoldFont(display, display.getSystemFont());
-		instance.markFinished(boldSystemFont);
-		// ensure the singleton is returning the same instance after creating and disposing one gradient
-		Assert.assertTrue("getInstance() returned a different FormFonts instance after creation and disposal of one bold font", instance.equals(FormFonts.getInstance()));
-	}
-	
-	public void testDisposeOne() {
-		Display display = Display.getCurrent();
-		Font boldSystemFont = FormFonts.getInstance().getBoldFont(display, display.getSystemFont());
-		FormFonts.getInstance().markFinished(boldSystemFont);
-		// ensure that getting a single gradient and marking it as finished disposed it
-		Assert.assertTrue("markFinished(...) did not dispose a font after a single getBoldFont()", boldSystemFont.isDisposed());
-	}
-	
-	public void testMultipleInstances() {
-		Display display = Display.getCurrent();
-		Font boldSystemFont = FormFonts.getInstance().getBoldFont(display, display.getSystemFont());
-		int count;
-		// ensure that the same image is returned for many calls with the same parameter
-		for (count = 1; count < 20; count ++)
-			Assert.assertEquals("getBoldFont(...) returned a different font for the same params on iteration "+count,
-					boldSystemFont, FormFonts.getInstance().getBoldFont(display, display.getSystemFont()));
-		for ( ;count > 0; count--) {
-			FormFonts.getInstance().markFinished(boldSystemFont);
-			if (count != 1)
-				// ensure that the gradient is not disposed early
-				Assert.assertFalse("markFinished(...) disposed a shared font early on iteration "+count,boldSystemFont.isDisposed());
-			else
-				// ensure that the gradient is disposed on the last markFinished
-				Assert.assertTrue("markFinished(...) did not dispose a shared font on the last call",boldSystemFont.isDisposed());
-		}
-	}
-	
-	public void testMultipleFonts() {
-		Display display = Display.getCurrent();
-		Font veranda = new Font(display, "Veranda",12,SWT.NORMAL);
-		Font arial = new Font(display, "Arial",12,SWT.NORMAL);
-		Font boldVeranda = FormFonts.getInstance().getBoldFont(display, veranda);
-		Font boldArial = FormFonts.getInstance().getBoldFont(display, arial);
-		assertFalse(boldVeranda.equals(boldArial));
-		FormFonts.getInstance().markFinished(boldVeranda);
-		assertTrue(boldVeranda.isDisposed());
-		assertFalse(boldArial.isDisposed());
-		FormFonts.getInstance().markFinished(boldArial);
-		assertTrue(boldArial.isDisposed());
-		veranda.dispose();
-		arial.dispose();
-	}
-	
-	public void testDisposeUnknown() {
-		Display display = Display.getCurrent();
-		Font system = new Font(display, display.getSystemFont().getFontData());
-		FormFonts.getInstance().markFinished(system);
-		Assert.assertTrue("markFinished(...) did not dispose of an unknown font", system.isDisposed());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/util/FormImagesTests.java b/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/util/FormImagesTests.java
deleted file mode 100755
index 9288ce9..0000000
--- a/tests/org.eclipse.ui.tests.forms/forms/org/eclipse/ui/tests/forms/util/FormImagesTests.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
- 
-package org.eclipse.ui.tests.forms.util;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.internal.forms.widgets.FormImages;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-public class FormImagesTests extends TestCase {
-	public void testSingleton() {
-		Display display = Display.getCurrent();
-		FormImages instance = FormImages.getInstance();
-		// ensure the singleton is returning the same instance
-		Assert.assertTrue("getInstance() returned a different FormImages instance", instance.equals(FormImages.getInstance()));
-		Image gradient = instance.getGradient(new Color(display, 1, 1, 1), new Color(display, 7, 7, 7), 21, 21, 0);
-		instance.markFinished(gradient);
-		// ensure the singleton is returning the same instance after creating and disposing one gradient
-		Assert.assertTrue("getInstance() returned a different FormImages instance after creation and disposal of one image", instance.equals(FormImages.getInstance()));
-	}
-	
-	public void testDisposeOne() {
-		Display display = Display.getCurrent();
-		Image gradient = FormImages.getInstance().getGradient(new Color(display, 255, 255, 255), new Color(display, 0, 0, 0), 21, 21, 0);
-		FormImages.getInstance().markFinished(gradient);
-		// ensure that getting a single gradient and marking it as finished disposed it
-		Assert.assertTrue("markFinished(...) did not dispose an image after a single getGradient()", gradient.isDisposed());
-	}
-	
-	public void testMultipleSimpleInstances() {
-		Display display = Display.getCurrent();
-		Image gradient = FormImages.getInstance().getGradient(new Color(display, 200, 200, 200), new Color(display, 0, 0, 0), 30, 16, 3);
-		int count;
-		// ensure that the same image is returned for many calls with the same parameter
-		for (count = 1; count < 20; count ++)
-			Assert.assertEquals("getGradient(...) returned a different image for the same params on iteration "+count,
-					gradient, FormImages.getInstance().getGradient(new Color(display, 200, 200, 200), new Color(display, 0, 0, 0), 30, 16, 3));
-		for ( ;count > 0; count--) {
-			FormImages.getInstance().markFinished(gradient);
-			if (count != 1)
-				// ensure that the gradient is not disposed early
-				Assert.assertFalse("markFinished(...) disposed a shared image early on iteration "+count,gradient.isDisposed());
-			else
-				// ensure that the gradient is disposed on the last markFinished
-				Assert.assertTrue("markFinished(...) did not dispose a shared image on the last call",gradient.isDisposed());
-		}
-	}
-	
-	public void testMultipleComplexInstances() {
-		Display display = Display.getCurrent();
-		Image gradient = FormImages.getInstance().getGradient(new Color[] {new Color(display, 200, 200, 200), new Color(display, 0, 0, 0)},
-				new int[] {100}, 31, true, null);
-		int count;
-		// ensure that the same image is returned for many calls with the same parameter
-		for (count = 1; count < 20; count ++)
-			Assert.assertEquals("getGradient(...) returned a different image for the same params on iteration "+count,
-					gradient, FormImages.getInstance().getGradient(new Color[] {new Color(display, 200, 200, 200), new Color(display, 0, 0, 0)},
-							new int[] {100}, 31, true, null));
-		for ( ;count > 0; count--) {
-			FormImages.getInstance().markFinished(gradient);
-			if (count != 1)
-				// ensure that the gradient is not disposed early
-				Assert.assertFalse("markFinished(...) disposed a shared image early on iteration "+count,gradient.isDisposed());
-			else
-				// ensure that the gradient is disposed on the last markFinished
-				Assert.assertTrue("markFinished(...) did not dispose a shared image on the last call",gradient.isDisposed());
-		}
-	}
-	
-	public void testMultipleUniqueInstances() {
-		Display display = Display.getCurrent();
-		Image[] images = new Image[24];
-		images[0] = FormImages.getInstance().getGradient(new Color(display, 1, 0, 0), new Color(display, 100, 100, 100), 25, 23, 1);
-		images[1] = FormImages.getInstance().getGradient(new Color(display, 0, 1, 0), new Color(display, 100, 100, 100), 25, 23, 1);
-		images[2] = FormImages.getInstance().getGradient(new Color(display, 0, 0, 1), new Color(display, 100, 100, 100), 25, 23, 1);
-		images[3] = FormImages.getInstance().getGradient(new Color(display, 0, 0, 0), new Color(display, 101, 100, 100), 25, 23, 1);
-		images[4] = FormImages.getInstance().getGradient(new Color(display, 0, 0, 0), new Color(display, 100, 101, 100), 25, 23, 1);
-		images[5] = FormImages.getInstance().getGradient(new Color(display, 0, 0, 0), new Color(display, 100, 100, 101), 25, 23, 1);
-		images[6] = FormImages.getInstance().getGradient(new Color(display, 0, 0, 0), new Color(display, 100, 100, 100), 20, 23, 1);
-		images[7] = FormImages.getInstance().getGradient(new Color(display, 0, 0, 0), new Color(display, 100, 100, 100), 25, 10, 1);
-		images[8] = FormImages.getInstance().getGradient(new Color(display, 0, 0, 0), new Color(display, 100, 100, 100), 25, 23, 2);
-		images[9] = FormImages.getInstance().getGradient(new Color(display, 1, 1, 1), new Color(display, 101, 101, 101), 20, 10, 2);
-		images[10] = FormImages.getInstance().getGradient(new Color[]{new Color(display,0,0,0)}, new int[] {}, 31, true, null);
-		images[11] = FormImages.getInstance().getGradient(new Color[]{new Color(display,0,0,0), new Color(display,1,1,1)},
-				new int[] {80}, 31, true, new Color(display,255,255,255));
-		images[12] = FormImages.getInstance().getGradient(new Color[]{new Color(display,0,0,0), new Color(display,1,1,1)},
-				new int[] {80}, 31, true, new Color(display,0,0,0));
-		images[13] = FormImages.getInstance().getGradient(new Color[]{new Color(display,0,0,0), new Color(display,100,100,100)},
-				new int[] {100}, 31, true, null);
-		images[14] = FormImages.getInstance().getGradient(new Color[]{new Color(display,1,0,0), new Color(display,100,100,100)},
-				new int[] {100}, 31, true, null);
-		images[15] = FormImages.getInstance().getGradient(new Color[]{new Color(display,0,1,0), new Color(display,100,100,100)},
-				new int[] {100}, 31, true, null);
-		images[16] = FormImages.getInstance().getGradient(new Color[]{new Color(display,0,0,1), new Color(display,100,100,100)},
-				new int[] {100}, 31, true, null);
-		images[17] = FormImages.getInstance().getGradient(new Color[]{new Color(display,0,0,0), new Color(display,101,100,100)},
-				new int[] {100}, 31, true, null);
-		images[18] = FormImages.getInstance().getGradient(new Color[]{new Color(display,0,0,0), new Color(display,100,101,100)},
-				new int[] {100}, 31, true, null);
-		images[19] = FormImages.getInstance().getGradient(new Color[]{new Color(display,0,0,0), new Color(display,100,100,101)},
-				new int[] {100}, 31, true, null);
-		images[20] = FormImages.getInstance().getGradient(new Color[]{new Color(display,0,0,0), new Color(display,100,100,100)},
-				new int[] {100}, 20, true, null);
-		images[21] = FormImages.getInstance().getGradient(new Color[]{new Color(display,0,0,0), new Color(display,100,100,100)},
-				new int[] {100}, 31, false, null);
-		images[22] = FormImages.getInstance().getGradient(new Color[]{new Color(display,0,0,0), new Color(display,100,100,100)},
-				new int[] {50}, 31, true, new Color(display,1,1,1));
-		images[23] = FormImages.getInstance().getGradient(new Color[]{new Color(display,1,1,1), new Color(display,101,101,101)},
-				new int[] {50}, 20, false, new Color(display,1,1,1));
-		// ensure none of the images are the same
-		for (int i = 0; i < images.length - 1; i++) {
-			for (int j = i+1; j < images.length; j++) {
-				Assert.assertNotSame("getGradient(...) returned the same image for different parameters: i = " + i + "; j = " + j, images[i], images[j]);
-			}
-		}
-		// ensure all of the images are disposed with one call to markFinished
-		for (int i = 0; i < images.length; i++) {
-			FormImages.getInstance().markFinished(images[i]);
-			Assert.assertTrue("markFinished(...) did not dispose an image that was only requested once: i = " + i, images[i].isDisposed());
-		}
-	}
-	
-	public void testComplexEquality() {
-		Display display = Display.getCurrent();
-		Image image1 = FormImages.getInstance().getGradient(new Color[] {new Color(display,0,0,0), new Color(display,255,255,255)},
-				new int[] {100}, 20, true, new Color(display,100,100,100));
-		Image image2 = FormImages.getInstance().getGradient(new Color[] {new Color(display,0,0,0), new Color(display,255,255,255)},
-				new int[] {100}, 20, true, new Color(display,0,0,0));
-		Assert.assertEquals("different images were created with only the background color differing when that difference is irrelevant", image1, image2);
-		FormImages.getInstance().markFinished(image1);
-		FormImages.getInstance().markFinished(image2);
-		image1 = FormImages.getInstance().getGradient(new Color[] {new Color(display,0,0,0), new Color(display,255,255,255)},
-				new int[] {80}, 20, true, new Color(display,100,100,100));
-		image2 = FormImages.getInstance().getGradient(new Color[] {new Color(display,0,0,0), new Color(display,255,255,255)},
-				new int[] {80}, 20, true, new Color(display,0,0,0));
-		Assert.assertNotSame("the same image was used when different background colors were specified", image1, image2);
-		FormImages.getInstance().markFinished(image1);
-		FormImages.getInstance().markFinished(image2);
-	}
-	
-	public void testToolkitColors() {
-		String blueKey = "blue";
-		String redKey = "red";
-		
-		Display display = Display.getCurrent();
-		FormToolkit kit1 = new FormToolkit(display);
-		kit1.getColors().createColor(blueKey, new RGB(0,0,255));
-		kit1.getColors().createColor(redKey, new RGB(255,0,0));
-		FormToolkit kit2 = new FormToolkit(display);
-		kit2.getColors().createColor(blueKey, new RGB(0,0,255));
-		kit2.getColors().createColor(redKey, new RGB(255,0,0));
-		Image image1 = FormImages.getInstance().getGradient(kit1.getColors().getColor(blueKey), kit1.getColors().getColor(redKey), 21, 21, 0);
-		Image image2 = FormImages.getInstance().getGradient(kit2.getColors().getColor(blueKey), kit2.getColors().getColor(redKey), 21, 21, 0);
-		Assert.assertEquals("different images were created for the same RGBs with different Color instances", image1, image2);
-		Image image3 = FormImages.getInstance().getGradient(new Color(display,0,0,255), new Color(display,255,0,0), 21, 21, 0);
-		Assert.assertEquals("different images were created for the same RGBs with different Color instances", image1, image3);
-		kit1.dispose();
-		Assert.assertFalse("image was disposed after toolkits were disposed", image1.isDisposed());
-		kit2.dispose();
-		Assert.assertFalse("image was disposed after toolkits were disposed", image2.isDisposed());
-		FormImages.getInstance().markFinished(image1);
-		Assert.assertFalse("image was disposed early", image1.isDisposed());
-		FormImages.getInstance().markFinished(image2);
-		Assert.assertFalse("image was disposed early", image2.isDisposed());
-		FormImages.getInstance().markFinished(image3);
-		Assert.assertTrue("image was not disposed", image3.isDisposed());
-	}
-	
-	public void testDisposeUnknown() {
-		Display display = Display.getCurrent();
-		Image image = new Image(display, 10, 10);
-		FormImages.getInstance().markFinished(image);
-		Assert.assertTrue("markFinished(...) did not dispose of an unknown image", image.isDisposed());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.forms/test.xml b/tests/org.eclipse.ui.tests.forms/test.xml
deleted file mode 100755
index 72779d4..0000000
--- a/tests/org.eclipse.ui.tests.forms/test.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0"?>
-
-<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.ui.tests.forms"/>
-	<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="session-folder" value="${eclipse-home}/ui_session_sniff_folder"/>
-		<delete dir="${session-folder}" quiet="true"/>
-		<ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-			<property name="data-dir" value="${session-folder}"/>
-			<property name="plugin-name" value="${plugin-name}"/>
-			<property name="classname" value="org.eclipse.ui.tests.forms.AllFormsTests"/>
-		</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>
-
-	<!-- This target defines the performance tests that need to be run. -->
-	<target name="performance-suite">
-		<property name="your-performance-folder" value="${eclipse-home}/ui_forms_performance_folder"/>
-		<delete dir="${your-performance-folder}" quiet="true"/>
-		<ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-			<property name="data-dir" value="${your-performance-folder}"/>
-			<property name="plugin-name" value="${plugin-name}"/>
-			<property name="classname" value="org.eclipse.ui.tests.forms.AllFormsPerformanceTests"/>
-		</ant>
-	</target>
-
-	<!-- This target runs the performance test suite. Any actions that need to happen -->
-	<!-- after all the tests have been run should go here. -->
-	<target name="performance" depends="init,performance-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/tests/org.eclipse.ui.tests.harness/.classpath b/tests/org.eclipse.ui.tests.harness/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/tests/org.eclipse.ui.tests.harness/.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/tests/org.eclipse.ui.tests.harness/.cvsignore b/tests/org.eclipse.ui.tests.harness/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/tests/org.eclipse.ui.tests.harness/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/tests/org.eclipse.ui.tests.harness/.project b/tests/org.eclipse.ui.tests.harness/.project
deleted file mode 100644
index d1441f8..0000000
--- a/tests/org.eclipse.ui.tests.harness/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.tests.harness</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/tests/org.eclipse.ui.tests.harness/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.ui.tests.harness/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100755
index d3ae5de..0000000
--- a/tests/org.eclipse.ui.tests.harness/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,72 +0,0 @@
-#Mon Nov 19 11:44:19 CET 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=ignore
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=private
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=no_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/tests/org.eclipse.ui.tests.harness/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.ui.tests.harness/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100755
index 18b09f6..0000000
--- a/tests/org.eclipse.ui.tests.harness/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Mon Feb 06 11:19:46 EST 2006
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.3\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template></templates>
diff --git a/tests/org.eclipse.ui.tests.harness/.settings/org.eclipse.pde.prefs b/tests/org.eclipse.ui.tests.harness/.settings/org.eclipse.pde.prefs
deleted file mode 100755
index 883666b..0000000
--- a/tests/org.eclipse.ui.tests.harness/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Mon Feb 21 14:17:36 EST 2005
-compilers.p.deprecated=2
-compilers.p.illegal-att-value=0
-compilers.p.no-required-att=1
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/tests/org.eclipse.ui.tests.harness/META-INF/MANIFEST.MF b/tests/org.eclipse.ui.tests.harness/META-INF/MANIFEST.MF
deleted file mode 100644
index a921da7..0000000
--- a/tests/org.eclipse.ui.tests.harness/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Harness Plug-in
-Bundle-SymbolicName: org.eclipse.ui.tests.harness;singleton:=true
-Bundle-Version: 1.1.0.qualifier
-Bundle-Activator: org.eclipse.ui.tests.harness.UITestHarnessPlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.core.tests.harness,
- org.junit,
- org.eclipse.core.resources
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.ui.tests.harness,
- org.eclipse.ui.tests.harness.tests,
- org.eclipse.ui.tests.harness.util,
- org.eclipse.ui.tests.internal.util;x-internal:=true
diff --git a/tests/org.eclipse.ui.tests.harness/about.html b/tests/org.eclipse.ui.tests.harness/about.html
deleted file mode 100644
index 4602330..0000000
--- a/tests/org.eclipse.ui.tests.harness/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.harness/build.properties b/tests/org.eclipse.ui.tests.harness/build.properties
deleted file mode 100644
index 44806c6..0000000
--- a/tests/org.eclipse.ui.tests.harness/build.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml
diff --git a/tests/org.eclipse.ui.tests.harness/icons/anything.gif b/tests/org.eclipse.ui.tests.harness/icons/anything.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests.harness/icons/anything.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.harness/plugin.xml b/tests/org.eclipse.ui.tests.harness/plugin.xml
deleted file mode 100644
index 482a837..0000000
--- a/tests/org.eclipse.ui.tests.harness/plugin.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
- <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            name="Performance Empty Perspective"
-            class="org.eclipse.ui.tests.harness.util.EmptyPerspective"
-            id="org.eclipse.ui.tests.harness.util.EmptyPerspective">
-      </perspective>
-      <perspective
-            name="Performance Empty Perspective 2"
-            class="org.eclipse.ui.tests.harness.util.EmptyPerspective"
-            id="org.eclipse.ui.tests.harness.util.EmptyPerspective2">
-      </perspective>
-	</extension>
-</plugin>
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/AllTests.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/AllTests.java
deleted file mode 100644
index 42eeb67..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/AllTests.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.harness;
-
-import org.eclipse.ui.tests.harness.tests.MocksTest;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Test the test harness :)
- * 
- * @since 3.3
- *
- */
-public class AllTests extends TestSuite {
-
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(suite());
-    }
-    
-    public static Test suite() {
-        return new AllTests();
-    }
-
-    public AllTests() {
-        addTestSuite(MocksTest.class);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/UITestHarnessPlugin.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/UITestHarnessPlugin.java
deleted file mode 100644
index e0d7b26..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/UITestHarnessPlugin.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.harness;
-
-import org.eclipse.ui.plugin.*;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class UITestHarnessPlugin extends AbstractUIPlugin {
-
-	//The shared instance.
-	private static UITestHarnessPlugin plugin;
-	
-	/**
-	 * The constructor.
-	 */
-	public UITestHarnessPlugin() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 *
-	 * @return the shared instance.
-	 */
-	public static UITestHarnessPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path.
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ui.tests.harness", path);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/tests/MocksTest.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/tests/MocksTest.java
deleted file mode 100644
index b7a9f5c..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/tests/MocksTest.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Brad Reynolds - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.harness.tests;
-
-import java.lang.reflect.UndeclaredThrowableException;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ui.tests.harness.util.Mocks;
-
-/**
- * Tests for the Mocks class.
- * 
- * @since 1.1
- */
-public class MocksTest extends TestCase {
-	private IPrimitive primitiveMock;
-
-	private static boolean uninitializedBoolean;
-	private static byte unitializedByte;
-	private static char unitializedChar;
-	private static short unitializedShort;
-	private static int unitializedInt;
-	private static long unitializedLong;
-	private static float unitializedFloat;
-	private static double unitializedDouble;
-	
-	protected void setUp() throws Exception {
-		primitiveMock = (IPrimitive) Mocks.createRelaxedMock(IPrimitive.class);
-	}
-
-	public void testPrimitiveBooleanReturnType() throws Exception {
-		try {
-			boolean value = primitiveMock.getBoolean();
-			assertEquals(uninitializedBoolean, value);
-		} catch (UndeclaredThrowableException e) {
-			fail("exception should not have been thrown");
-		}
-	}
-	
-	public void testPrimitiveBooleanSetLastReturnValue() throws Exception {
-		Boolean value = Boolean.TRUE;
-		primitiveMock.getBoolean();
-		Mocks.setLastReturnValue(primitiveMock, value);
-		Mocks.startChecking(primitiveMock);
-		
-		assertEquals(value.booleanValue(), primitiveMock.getBoolean());		
-	}
-	
-	public void testPrimitiveByteReturnType() throws Exception {
-		try {
-			byte value = primitiveMock.getByte();
-			assertEquals(unitializedByte, value);
-		} catch (UndeclaredThrowableException e) {
-			fail("exception should not have been thrown");
-		}
-	}
-	
-	public void testPrimitiveByteSetLastReturnValue() throws Exception {
-		Byte value = new Byte((byte) 1);
-		primitiveMock.getByte();
-		Mocks.setLastReturnValue(primitiveMock, value);
-		Mocks.startChecking(primitiveMock);
-		
-		assertEquals(value.byteValue(), primitiveMock.getByte());
-	}
-	
-	public void testPrimitiveCharReturnType() throws Exception {
-		try {
-			char value = primitiveMock.getChar();
-			assertEquals(unitializedChar, value);
-		} catch (UndeclaredThrowableException e) {
-			fail("exception should not have been thrown");
-		}
-	}
-	
-	public void testPrimitiveCharSetLastReturnValue() throws Exception {
-		Character value = new Character('a');
-		primitiveMock.getChar();
-		Mocks.setLastReturnValue(primitiveMock, value);
-		Mocks.startChecking(primitiveMock);
-		
-		assertEquals(value.charValue(), primitiveMock.getChar());
-	}
-	
-	public void testPrimitiveShortReturnType() throws Exception {
-		try {
-			short value = primitiveMock.getShort();
-			assertEquals(unitializedShort, value);
-		} catch (UndeclaredThrowableException e) {
-			fail("exception should not have been thrown");
-		}
-	}
-
-	public void testPrimitiveShortSetLastReturnValue() throws Exception {
-		Short value = new Short((short) 1);
-		primitiveMock.getShort();
-		Mocks.setLastReturnValue(primitiveMock, value);
-		Mocks.startChecking(primitiveMock);
-		
-		assertEquals(value.shortValue(), primitiveMock.getShort());
-	}
-	
-	public void testPrimitiveIntReturnType() throws Exception {
-		try {
-			int value = primitiveMock.getInt();
-			assertEquals(unitializedInt, value);
-		} catch (UndeclaredThrowableException e) {
-			fail("exception should not have been thrown");
-		}
-	}
-	
-	public void testPrimitiveIntSetLastReturnValue() throws Exception {
-		Integer value = new Integer(1);
-		primitiveMock.getInt();
-		Mocks.setLastReturnValue(primitiveMock, value);
-		Mocks.startChecking(primitiveMock);
-		
-		assertEquals(value.intValue(), primitiveMock.getInt());
-	}
-	
-	public void testPrimitiveLongReturnType() throws Exception {
-		try {
-			long value = primitiveMock.getLong();
-			assertEquals(unitializedLong, value);
-		} catch (UndeclaredThrowableException e) {
-			fail("exception should not have been thrown");
-		}
-	}
-	
-	public void testPrimitiveLongSetLastReturnValue() throws Exception {
-		Long value = new Long(1);
-		primitiveMock.getLong();
-		Mocks.setLastReturnValue(primitiveMock, value);
-		Mocks.startChecking(primitiveMock);
-		
-		assertEquals(value.longValue(), primitiveMock.getLong());
-	}
-	
-	public void testPrimitiveFloatReturnType() throws Exception {
-		try {
-			float value = primitiveMock.getFloat();
-			assertEquals(unitializedFloat, value, 0);
-		} catch (UndeclaredThrowableException e) {
-			fail("exception should not have been thrown");
-		}
-	}
-	
-	public void testPrimitiveFloatSetLastReturnValue() throws Exception {
-		Float value = new Float(1);
-		primitiveMock.getFloat();
-		Mocks.setLastReturnValue(primitiveMock, value);
-		Mocks.startChecking(primitiveMock);
-		
-		assertEquals(value.floatValue(), primitiveMock.getFloat(), 0);
-	}
-	
-	public void testPrimitiveDoubleReturnType() throws Exception {
-		try {
-			double value = primitiveMock.getDouble();
-			assertEquals(unitializedDouble, value, 0);
-		} catch (UndeclaredThrowableException e) {
-			fail("exception should not have been thrown");
-		}
-	}
-	
-	public void testPrimitiveDoubleSetLastReturnValue() throws Exception {
-		Double value = new Double(1);
-		primitiveMock.getDouble();
-		Mocks.setLastReturnValue(primitiveMock, value);
-		Mocks.startChecking(primitiveMock);
-		
-		assertEquals(value.doubleValue(), primitiveMock.getDouble(), 0);
-	}
-
-	public interface IPrimitive {
-		public boolean getBoolean();
-
-		public byte getByte();
-
-		public char getChar();
-
-		public short getShort();
-
-		public int getInt();
-
-		public long getLong();
-
-		public float getFloat();
-
-		public double getDouble();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/ActionUtil.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/ActionUtil.java
deleted file mode 100644
index 35e5393..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/ActionUtil.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.harness.util;
-
-import java.lang.reflect.Method;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.SubContributionItem;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.WorkbenchWindow;
-
-/**
- * <code>ActionUtil</code> contains methods to run actions
- * in the workbench.
- */
-public class ActionUtil {
-
-    /**
-     * Runs an action contribution.
-     * 
-     * @param test the current test case
-     * @param item an action contribution item
-     */
-    public static void runAction(TestCase test, IContributionItem item) {
-        Assert.assertTrue(item instanceof ActionContributionItem);
-        ((ActionContributionItem) item).getAction().run();
-    }
-
-    /**
-     * Runs the first action found in a menu manager with a
-     * particular label. 
-     *
-     * @param test the current test case
-     * @param mgr the containing menu manager
-     * @param label the action label
-     */
-    public static void runActionWithLabel(TestCase test, IMenuManager mgr,
-            String label) {
-        IContributionItem[] items = mgr.getItems();
-        for (int nX = 0; nX < items.length; nX++) {
-            IContributionItem item = items[nX];
-            if (item instanceof SubContributionItem)
-                item = ((SubContributionItem) item).getInnerItem();
-            if (item instanceof ActionContributionItem) {
-                IAction action = ((ActionContributionItem) item).getAction();
-                if (label.equals(action.getText())) {
-                    action.run();
-                    return;
-                }
-            }
-        }
-        Assert.fail("Unable to find action: " + label);
-    }
-
-    /**
-     * Runs the first action found in a window with a
-     * particular label. 
-     * 
-     * @param test the current test case
-     * @param win the containing window
-     * @param label the action label
-     */
-    public static void runActionWithLabel(TestCase test, IWorkbenchWindow win,
-            String label) {
-        WorkbenchWindow realWin = (WorkbenchWindow) win;
-        IMenuManager mgr = realWin.getMenuManager();
-        runActionWithLabel(test, mgr, label);
-    }
-
-    /**
-     * Runs an action identified by an id path in a 
-     * menu manager.
-     * 
-     * @param test the current test case
-     * @param mgr the containing menu manager
-     * @param label the action label
-     */
-    public static void runActionUsingPath(TestCase test, IMenuManager mgr,
-            String idPath) {
-        IContributionItem item = mgr.findUsingPath(idPath);
-        Assert.assertNotNull(item);
-        runAction(test, item);
-    }
-
-    /**
-     * Runs an action identified by an id path in a 
-     * window.
-     * 
-     * @param test the current test case
-     * @param win the containing window
-     * @param label the action label
-     */
-    public static void runActionUsingPath(TestCase test, IWorkbenchWindow win,
-            String idPath) {
-        WorkbenchWindow realWin = (WorkbenchWindow) win;
-        IMenuManager mgr = realWin.getMenuManager();
-        runActionUsingPath(test, mgr, idPath);
-    }
-
-    /**
-     * Returns the first action found in a menu manager with a
-     * particular label. 
-     *
-     * @param mgr the containing menu manager
-     * @param label the action label
-     * @return the first action with the label, or <code>null</code>
-     * 		if it is not found.
-     */
-    public static IAction getActionWithLabel(IMenuManager mgr, String label) {
-        IContributionItem[] items = mgr.getItems();
-        for (int nX = 0; nX < items.length; nX++) {
-            IContributionItem item = items[nX];
-            if (item instanceof SubContributionItem)
-                item = ((SubContributionItem) item).getInnerItem();
-            if (item instanceof ActionContributionItem) {
-                IAction action = ((ActionContributionItem) item).getAction();
-                if (label.equals(action.getText())) {
-                    return action;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Fire the "handleAboutToShow" method in a menu manager.
-     * This triggers the same behavior as when a user opens a menu.
-     * The menu to be populated with actions and those 
-     * actions to be enacted in SWT widgets.
-     * 
-     * @param mgr the menu manager to open
-     */
-    public static void fireAboutToShow(MenuManager mgr) throws Throwable {
-        Class clazz = mgr.getClass();
-        Method method = clazz.getDeclaredMethod("handleAboutToShow",
-                new Class[0]);
-        method.setAccessible(true);
-        method.invoke(mgr, new Object[0]);
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/ArrayUtil.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/ArrayUtil.java
deleted file mode 100644
index 9afabce..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/ArrayUtil.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.harness.util;
-
-import java.util.Random;
-
-/**
- * <code>ArrayUtil</code> contains methods for array 
- * examination.  
- */
-public class ArrayUtil {
-    private static Random randomBox = new Random();
-
-    /**
-     * Returns a random object chosen from an array.
-     * 
-     * @param array the input array
-     * @return a random object in the array
-     */
-    public static Object pickRandom(Object[] array) {
-        int num = randomBox.nextInt(array.length);
-        return array[num];
-    }
-
-    /**
-     * Returns whether an array is not null and
-     * each object in the array is not null.
-     *
-     * @param array the input array
-     * @return <code>true or false</code>
-     */
-    public static boolean checkNotNull(Object[] array) {
-        if (array == null)
-            return false;
-        else {
-            for (int i = 0; i < array.length; i++)
-                if (array[i] == null)
-                    return false;
-            return true;
-        }
-    }
-
-    /**
-     * Returns whether an array contains a given object.
-     *
-     * @param array the input array
-     * @param element the test object
-     * @return <code>true</code> if the array contains the object,
-     * 		<code>false</code> otherwise.
-     */
-    public static boolean contains(Object[] array, Object element) {
-        if (array == null || element == null)
-            return false;
-        else {
-            for (int i = 0; i < array.length; i++)
-                if (array[i] == element)
-                    return true;
-            return false;
-        }
-    }
-
-    /**
-     * Returns whether two arrays are equal.  They must
-     * have the same size and the same contents.
-     *
-     * @param one the first array
-     * @param two the second array
-     * @return <code>true</code> if the array are equal,
-     * 		<code>false</code> otherwise.
-     */
-    public static boolean equals(Object[] one, Object[] two) {
-        if (one.length != two.length)
-            return false;
-        else {
-            for (int i = 0; i < one.length; i++)
-                if (one[i] != two[i])
-                    return false;
-            return true;
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/AutomationUtil.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/AutomationUtil.java
deleted file mode 100644
index eae1417..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/AutomationUtil.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.harness.util;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-
-/**
- * <code>AutomationUtil</code> contains utility methods to mimic key events.
- * Mouse event methods can be added if needed to complete this class.
- */
-public class AutomationUtil {
-
-	/**
-	 * Method to mimic a key code event on a display.
-	 * 
-	 * @param display
-	 *            The display.
-	 * @param eventType
-	 *            The event type.
-	 * @param keyCode
-	 *            The key code.
-	 */
-	public static void performKeyCodeEvent(Display display, int eventType,
-			int keyCode) {
-		Event event = new Event();
-		event.type = eventType;
-		event.keyCode = keyCode;
-		display.post(event);
-	}
-
-	/**
-	 * Method to mimic a character event on a display.
-	 * 
-	 * @param display
-	 *            The display.
-	 * @param eventType
-	 *            The event type.
-	 * @param character
-	 *            The character to mimic.
-	 */
-	public static void performCharacterEvent(Display display, int eventType,
-			char character) {
-		Event event = new Event();
-		event.type = eventType;
-		event.character = character;
-		display.post(event);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/CallHistory.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/CallHistory.java
deleted file mode 100644
index 4ec7030..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/CallHistory.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.harness.util;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-
-/**
- * <code>CallHistory</code> is used to record the invocation
- * of methods within a target object.  This is useful during
- * lifecycle testing for an object.
- * <p>
- * To use <code>CallHistory</code> ..
- * <ol>
- * <li>Create a CallHistory in the target or pass one in.</li>
- * <li>Invoke some test scenario.  </li>
- * <li>If a method is called on the target record the invocation
- * 	in the call history</li>
- * <li>Verify the call history after the test scenario is
- * 	complete.</li>
- * </ol>
- * </p><p>
- * Each <code>CallHistory</code> has a target which is used to 
- * verify the method names passed to the history.  If an invalid 
- * name is passed an <code>IllegalArgumentException</code> will 
- * be thrown.
- * </p>
- */
-public class CallHistory {
-    private ArrayList methodList;
-
-    private Class classType;
-
-    /**
-     * Creates a new call history for an object.  
-     * 
-     * @param target the call history target. 
-     */
-    public CallHistory(Object target) {
-        methodList = new ArrayList();
-        classType = target.getClass();
-    }
-
-    /**
-     * Throws an exception if the method name is invalid
-     * for the given target class.
-     */
-    private void testMethodName(String methodName) {
-        Method[] methods = classType.getMethods();
-        for (int i = 0; i < methods.length; i++)
-            if (methods[i].getName().equals(methodName))
-                return;
-        throw new IllegalArgumentException("Target class ("
-                + classType.getName() + ") does not contain method: "
-                + methodName);
-    }
-
-    /**
-     * Adds a method name to the call history.  
-     * 
-     * @param methodName the name of a method
-     */
-    public void add(String methodName) {
-        testMethodName(methodName);
-        methodList.add(methodName);
-    }
-
-    /**
-     * Clears the call history.
-     */
-    public void clear() {
-        methodList.clear();
-    }
-
-    /**
-     * Returns whether a list of methods have been called in
-     * order.  
-     * 
-     * @param testNames an array of the method names in the order they are expected
-     * @return <code>true</code> if the methods were called in order
-     */
-    public boolean verifyOrder(String[] testNames)
-            throws IllegalArgumentException {
-        int testIndex = 0;
-        int testLength = testNames.length;
-        if (testLength == 0)
-            return true;
-        for (int nX = 0; nX < methodList.size(); nX++) {
-            String methodName = (String) methodList.get(nX);
-            String testName = testNames[testIndex];
-            testMethodName(testName);
-            if (testName.equals(methodName))
-                ++testIndex;
-            if (testIndex >= testLength)
-                return true;
-        }
-        return false;
-    }
-
-    /**
-     * Returns whether a method has been called.
-     * 
-     * @param methodName a method name
-     * @return <code>true</code> if the method was called
-     */
-    public boolean contains(String methodName) {
-        testMethodName(methodName);
-        return methodList.contains(methodName);
-    }
-
-    /**
-     * Returns whether a list of methods were called.
-     * 
-     * @param methodNames a list of methods
-     * @return <code>true</code> if the methods were called
-     */
-    public boolean contains(String[] methodNames) {
-        for (int i = 0; i < methodNames.length; i++) {
-            testMethodName(methodNames[i]);
-            if (!methodList.contains(methodNames[i]))
-                return false;
-        }
-        return true;
-    }
-
-    /**
-     * Returns whether the list of methods called is empty.
-     * 
-     * @return <code>true</code> iff the list of methods is empty
-     */
-    public boolean isEmpty() {
-        return methodList.isEmpty();
-    }
-
-    /**
-     * Prints the call history to the console.
-     */
-    public void printToConsole() {
-        for (int i = 0; i < methodList.size(); i++)
-            System.out.println(methodList.get(i));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/DialogCheck.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/DialogCheck.java
deleted file mode 100644
index f7f0c37..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/DialogCheck.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.harness.util;
-
-import junit.framework.Assert;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-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.swt.widgets.TabFolder;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.tests.internal.util.VerifyDialog;
-
-/**
- * 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.
-     * @param assert this is the test case object, assertions will be
-     * executed on this object.
-     */
-    public static void assertDialog(Dialog dialog, Assert assertion) {
-        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.
-     * @param assert this is the test case object, assertions will be
-     * executed on this object.
-     */
-    public static void assertDialogTexts(Dialog dialog, Assert assertion) {
-        Assert.assertNotNull(dialog);
-        dialog.setBlockOnOpen(false);
-        dialog.open();
-        Shell shell = dialog.getShell();
-        verifyCompositeText(shell, assertion);
-        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
-     * @param assert The object to invoke assertions on.
-     */
-    private static void verifyCompositeText(Composite composite,
-            Assert assertion) {
-        Control children[] = composite.getChildren();
-        for (int i = 0; i < children.length; i++) {
-        	Control child = children[i];
-            if (child instanceof TabFolder) {
-                TabFolder folder = (TabFolder) child;
-                int numPages = folder.getItemCount();
-                for (int j = 0; j < numPages; j++) {
-                    folder.setSelection(j);
-                }
-            }
-            else if (child instanceof Button) {
-                //verify the text if the child is a button
-                verifyButtonText((Button) child, assertion);
-            }
-            else if (child instanceof Label) {
-                //child is not a button, maybe a label
-                verifyLabelText((Label) child, assertion);
-            }
-            else if (child instanceof Composite) {
-                //child is not a label, make a recursive call if it is a composite
-                verifyCompositeText((Composite) child, assertion);
-            }
-        }
-    }
-
-    /*
-     * Verifies that a given button is large enough to display its text.
-     * @param button The button to verify,
-     * @param assert The object to invoke assertions on.
-     */
-    private static void verifyButtonText(Button button, Assert assertion) {
-        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,
-     * @param assert The object to invoke assertions on.
-     */
-    private static void verifyLabelText(Label label, Assert assertion) {
-        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/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/EmptyPerspective.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/EmptyPerspective.java
deleted file mode 100644
index 3baed17..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/EmptyPerspective.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.harness.util;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- * This perspective is used for testing api.  It defines an initial
- * layout with no parts, just an editor area.
- */
-public class EmptyPerspective implements IPerspectiveFactory {
-
-    /**
-     * The perspective id for the empty perspective.
-     */
-    public static final String PERSP_ID = "org.eclipse.ui.tests.harness.util.EmptyPerspective";
-
-    /**
-     * The perspective id for the second empty perspective.
-     */
-    public static final String PERSP_ID2 = "org.eclipse.ui.tests.harness.util.EmptyPerspective2";
-
-    private static String LastPerspective;
-    
-    /**
-     * Returns the descriptor for the perspective last opened using this factory.
-     * 
-     * @return the descriptor for the perspective last opened using this factory, or <code>null</code>
-     */
-	public static String getLastPerspective() {
-		return LastPerspective;
-	}
-
-    /**
-     * Sets the descriptor for the perspective last opened using this factory.
-     * 
-     * @param persp the descriptor for the perspective last opened using this factory, or <code>null</code>
-     */
-	public static void setLastPerspective(String perspId) {
-		LastPerspective = perspId;
-	}
-    
-    /**
-     * Constructs a new Default layout engine.
-     */
-    public EmptyPerspective() {
-        super();
-    }
-
-    /**
-     * Defines the initial layout for a perspective.  
-     *
-     * Implementors of this method may add additional views to a
-     * perspective.  The perspective already contains an editor folder
-     * with <code>ID = ILayoutFactory.ID_EDITORS</code>.  Add additional views
-     * to the perspective in reference to the editor folder.
-     *
-     * This method is only called when a new perspective is created.  If
-     * an old perspective is restored from a persistence file then
-     * this method is not called.
-     *
-     * @param factory the factory used to add views to the perspective
-     */
-    public void createInitialLayout(IPageLayout layout) {
-    	setLastPerspective(layout.getDescriptor().getId());
-        // do no layout, this is the empty perspective
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/FileTool.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/FileTool.java
deleted file mode 100644
index 47e6b2a..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/FileTool.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.harness.util;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-
-
-public class FileTool {
-	
-	/**
-	 * A buffer.
-	 */
-	private static byte[] buffer = new byte[8192];
-	/**
-	 * Unzips the given zip file to the given destination directory
-	 * extracting only those entries the pass through the given
-	 * filter.
-	 * 
-	 * @param filter filters out unwanted zip entries
-	 * @param zipFile the zip file to unzip
-	 * @param dstDir the destination directory
-	 */
-	public static void unzip(ZipFile zipFile, File dstDir) throws IOException {
-		unzip(zipFile, dstDir, dstDir, 0);
-	}
-	
-	private static void unzip(ZipFile zipFile, File rootDstDir, File dstDir, int depth) throws IOException {
-	
-		Enumeration entries = zipFile.entries();
-	
-		try {
-			while(entries.hasMoreElements()){
-				ZipEntry entry = (ZipEntry)entries.nextElement();
-				if(entry.isDirectory()){
-					continue;
-				}
-				String entryName = entry.getName();
-				File file = new File(dstDir, changeSeparator(entryName, '/', File.separatorChar));
-				file.getParentFile().mkdirs();
-				InputStream src = null;
-				OutputStream dst = null;
-				try {
-					src = zipFile.getInputStream(entry);
-					dst = new FileOutputStream(file);
-					transferData(src, dst);
-				} finally {
-					if(dst != null){
-						try {
-							dst.close();
-						} catch(IOException e){
-						}
-					}
-					if(src != null){
-						try {
-							src.close();
-						} catch(IOException e){
-						}
-					}
-				}
-			}
-		} finally {
-			try {
-				zipFile.close();
-			} catch(IOException e){
-			}
-		}
-	}
-	/**
-	 * Returns the given file path with its separator
-	 * character changed from the given old separator to the
-	 * given new separator.
-	 * 
-	 * @param path a file path
-	 * @param oldSeparator a path separator character
-	 * @param newSeparator a path separator character
-	 * @return the file path with its separator character
-	 * changed from the given old separator to the given new
-	 * separator
-	 */
-	public static String changeSeparator(String path, char oldSeparator, char newSeparator){
-		return path.replace(oldSeparator, newSeparator);
-	}
-	/**
-	 * Copies all bytes in the given source file to
-	 * the given destination file.
-	 * 
-	 * @param source the given source file
-	 * @param destination the given destination file
-	 */
-	public static void transferData(File source, File destination) throws IOException {
-		destination.getParentFile().mkdirs();
-		InputStream is = null;
-		OutputStream os = null;
-		try {
-			is = new FileInputStream(source);
-			os = new FileOutputStream(destination);
-			transferData(is, os);
-		} finally {
-			if(os != null){
-				try {
-					os.close();
-				} catch(IOException e){
-				}
-			}
-			if(is != null){
-				try {
-					is.close();
-				} catch(IOException e){
-				}
-			}
-		}
-	}
-	/**
-	 * Copies all bytes in the given source stream to
-	 * the given destination stream. Neither streams
-	 * are closed.
-	 * 
-	 * @param source the given source stream
-	 * @param destination the given destination stream
-	 */
-	public static void transferData(InputStream source, OutputStream destination) throws IOException {
-		int bytesRead = 0;
-		while(bytesRead != -1){
-			bytesRead = source.read(buffer, 0, buffer.length);
-			if(bytesRead != -1){
-				destination.write(buffer, 0, bytesRead);
-			}
-		}
-	}
-
-	/**
-	 * Copies the given source file to the given destination file.
-	 * 
-	 * @param src the given source file
-	 * @param dst the given destination file
-	 */
-	public static void copy(File src, File dst) throws IOException {
-		if(src.isDirectory()){
-			String[] srcChildren = src.list();
-			for(int i = 0; i < srcChildren.length; ++i){
-				File srcChild= new File(src, srcChildren[i]);
-				File dstChild= new File(dst, srcChildren[i]);
-				copy(srcChild, dstChild);
-			}
-		} else
-			transferData(src, dst);
-	}
-
-	public static File getFileInPlugin(Plugin plugin, IPath path) {
-		try {
-			URL installURL= plugin.getBundle().getEntry(path.toString());
-			URL localURL= Platform.asLocalURL(installURL);
-			return new File(localURL.getFile());
-		} catch (IOException e) {
-			return null;
-		}
-	}
-
-	public static StringBuffer read(String fileName) throws IOException {
-		return read(new FileReader(fileName));
-	}
-
-	public static StringBuffer read(Reader reader) throws IOException {
-		StringBuffer s= new StringBuffer();
-		try {
-			char[] buffer= new char[8196];
-			int chars= reader.read(buffer);
-			while (chars != -1) {
-				s.append(buffer, 0, chars);
-				chars= reader.read(buffer);
-			}
-		} finally {
-			try {
-				reader.close();
-			} catch (IOException e) {
-			}
-		}
-		return s;
-	}
-
-	public static void write(String fileName, StringBuffer content) throws IOException {
-		Writer writer= new FileWriter(fileName);
-		try {
-			writer.write(content.toString());
-		} finally {
-			try {
-				writer.close();
-			} catch (IOException e) {
-			}
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/FileUtil.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/FileUtil.java
deleted file mode 100644
index ae6685f..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/FileUtil.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.harness.util;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * <code>FileUtil</code> contains methods to create and
- * delete files and projects.
- */
-public class FileUtil {
-
-    /**
-     * Creates a new project.
-     * 
-     * @param name the project name
-     */
-    public static IProject createProject(String name) throws CoreException {
-        IWorkspace ws = ResourcesPlugin.getWorkspace();
-        IWorkspaceRoot root = ws.getRoot();
-        IProject proj = root.getProject(name);
-        if (!proj.exists())
-            proj.create(null);
-        if (!proj.isOpen())
-            proj.open(null);
-        return proj;
-    }
-
-    /**
-     * Deletes a project.
-     * 
-     * @param proj the project
-     */
-    public static void deleteProject(IProject proj) throws CoreException {
-        proj.delete(true, null);
-    }
-
-    /**
-     * Creates a new file in a project.
-     * 
-     * @param name the new file name
-     * @param proj the existing project
-     * @return the new file
-     */
-    public static IFile createFile(String name, IProject proj)
-            throws CoreException {
-        IFile file = proj.getFile(name);
-        if (!file.exists()) {
-            String str = " ";
-            InputStream in = new ByteArrayInputStream(str.getBytes());
-            file.create(in, true, null);
-        }
-        return file;
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/ImageTests.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/ImageTests.java
deleted file mode 100644
index 2a9111a..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/ImageTests.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.harness.util;
-
-import java.util.Arrays;
-
-import junit.framework.Assert;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-
-/**
- * @since 3.1
- */
-public final class ImageTests {
-
-	/**
-	 * 
-	 */
-	private ImageTests() {
-		super();
-	}
-
-    public static void assertEquals(Image i1, Image i2) {
-        ImageData data1 = i1.getImageData();
-        ImageData data2 = i2.getImageData();
-        Assert.assertTrue(Arrays.equals(data1.data, data2.data));
-    }
-    
-    public static void assertNotEquals(Image i1, Image i2) {
-        ImageData data1 = i1.getImageData();
-        ImageData data2 = i2.getImageData();
-        Assert.assertFalse(Arrays.equals(data1.data, data2.data));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/Mocks.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/Mocks.java
deleted file mode 100644
index 59e7701..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/Mocks.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brad Reynolds (bug 146435)
- *******************************************************************************/
-package org.eclipse.ui.tests.harness.util;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import junit.framework.AssertionFailedError;
-
-/**
- * Utility class for creating mock objects for public interfaces.
- * 
- * @since 3.3
- *
- */
-public class Mocks {
-
-	public static interface EqualityComparator {
-		public boolean equals(Object o1, Object o2);
-	}
-
-	private static EqualityComparator defaultEqualityComparator = new EqualityComparator() {
-		public boolean equals(Object o1, Object o2) {
-			return o1 == null ? o2 == null : o1.equals(o2);
-		}
-	};
-
-	private static EqualityComparator indifferentEqualityComparator = new EqualityComparator() {
-		public boolean equals(Object o1, Object o2) {
-			return true;
-		}
-	};
-
-	private static interface Mock {
-		public MockInvocationHandler getMockInvocationHandler();
-	}
-
-	private static Method getMockInvocationHandlerMethod;
-
-	private static Method equalsMethod;
-
-	static {
-		try {
-			getMockInvocationHandlerMethod = Mock.class.getMethod(
-					"getMockInvocationHandler", new Class[0]);
-			equalsMethod = Object.class.getMethod("equals",
-					new Class[] { Object.class });
-		} catch (Exception e) {
-			// ignore, will lead to NullPointerExceptions later on
-		}
-	}
-
-	private static final class MockInvocationHandler implements
-			InvocationHandler {
-
-		private class MethodCall {
-			private final Method method;
-
-			private final Object[] args;
-
-			private Object returnValue = null;
-
-			public MethodCall(Method method, Object[] args) {
-				this.method = method;
-				this.args = args;
-			}
-
-			public boolean equals(Object obj) {
-				if (!(obj instanceof MethodCall)) {
-					return false;
-				}
-				MethodCall other = (MethodCall) obj;
-				if (other.method != method
-						|| (other.args == null && args != null)
-						|| (other.args != null && args == null)
-						|| (args != null && other.args.length != args.length)) {
-					return false;
-				}
-				if (args != null) {
-					for (int i = 0; i < args.length; i++) {
-						if (!equalityComparator.equals(args[i], other.args[i])) {
-							return false;
-						}
-					}
-				}
-				return true;
-			}
-
-			public void setReturnValue(Object object) {
-				returnValue = object;
-			}
-
-			public Object getReturnValue() {
-				return returnValue;
-			}
-			
-			public String toString() {
-				return method.toString();
-			}
-		}
-
-		List previousCallHistory = null;
-
-		List currentCallHistory = new ArrayList();
-
-		private final boolean ordered;
-
-		private final EqualityComparator equalityComparator;
-
-		public MockInvocationHandler(boolean ordered,
-				EqualityComparator equalityComparator) {
-			this.ordered = ordered;
-			this.equalityComparator = equalityComparator;
-		}
-
-		public Object invoke(Object proxy, Method method, Object[] args)
-				throws Throwable {
-			if (getMockInvocationHandlerMethod.equals(method)) {
-				return this;
-			}
-			if (equalsMethod.equals(method)) {
-				return new Boolean(proxy == args[0]);
-			}
-			MethodCall methodCall = new MethodCall(method, args);
-			if (previousCallHistory != null) {
-				// we are in replay mode
-				int indexOfMethodCall = previousCallHistory.indexOf(methodCall);
-				if (indexOfMethodCall != -1) {
-					// copy return value over to this method call
-					methodCall.setReturnValue(((MethodCall) previousCallHistory
-							.get(indexOfMethodCall)).getReturnValue());
-				} else {
-					throw new AssertionFailedError("unexpected method call: "
-							+ method.getName());
-				}
-				if (ordered) {
-					if (previousCallHistory.size() <= currentCallHistory.size()) {
-						throw new AssertionFailedError("extra method call: "
-								+ method.getName());
-					}
-					MethodCall previousCall = (MethodCall) previousCallHistory
-							.get(currentCallHistory.size());
-					if (!methodCall.equals(previousCall)) {
-						throw new AssertionFailedError(
-								"different method call (expected:"
-										+ previousCall.method.getName()
-										+ ", actual:" + method.getName() + ")");
-					}
-				}
-			}
-			currentCallHistory.add(methodCall);
-			Class returnType = method.getReturnType();
-			if (returnType.isPrimitive() && void.class != returnType) {
-				Object result = null;
-				Object returnValue = methodCall.getReturnValue();
-
-				if (returnType == boolean.class) {
-					result = (returnValue != null) ? (Boolean) returnValue
-							: Boolean.FALSE;
-				} else if (returnType == byte.class) {
-					result = (returnValue != null) ? (Byte) returnValue
-							: new Byte((byte) 0);
-				} else if (returnType == char.class) {
-					result = (returnValue != null) ? (Character) returnValue
-							: new Character((char) 0);
-				} else if (returnType == short.class) {
-					result = (returnValue != null) ? (Short) returnValue
-							: new Short((short) 0);
-				} else if (returnType == int.class) {
-					result = (returnValue != null) ? (Integer) returnValue
-							: new Integer(0);
-				} else if (returnType == long.class) {
-					result = (returnValue != null) ? (Long) returnValue
-							: new Long(0);
-				} else if (returnType == float.class) {
-					result = (returnValue != null) ? (Float) returnValue
-							: new Float(0);
-				} else if (returnType == double.class) {
-					result = (returnValue != null) ? (Double) returnValue
-							: new Double(0);
-				}
-
-				return result;
-			}
-			return methodCall.getReturnValue();
-		}
-
-		public void replay() {
-			previousCallHistory = currentCallHistory;
-			currentCallHistory = new ArrayList();
-		}
-
-		public void verify() {
-			if (previousCallHistory == null) {
-				if (currentCallHistory.size() == 0) {
-					// mock object was not used at all
-					return;
-				}
-				throw new AssertionFailedError("unexpected");
-			}
-			if (ordered) {
-				int numMissingCalls = previousCallHistory.size()
-						- currentCallHistory.size();
-				if (numMissingCalls > 0) {
-					throw new AssertionFailedError("missing method calls ("
-							+ numMissingCalls + ", first is: " + previousCallHistory.get(currentCallHistory.size()) + ")");
-				}
-				for (int i = 0; i < previousCallHistory.size(); i++) {
-					if (!previousCallHistory.get(i).equals(
-							currentCallHistory.get(i))) {
-						throw new AssertionFailedError(
-								"method call did not match (" + i + " of "
-										+ currentCallHistory.size() + ")");
-					}
-				}
-			} else {
-				for (Iterator it = previousCallHistory.iterator(); it.hasNext();) {
-					MethodCall methodCall = (MethodCall) it.next();
-					if (!currentCallHistory.contains(methodCall)) {
-						throw new AssertionFailedError("missing method call:"
-								+ methodCall.method.getName());
-					}
-				}
-			}
-			reset();
-		}
-
-		public void reset() {
-			previousCallHistory = null;
-			currentCallHistory = new ArrayList();
-		}
-
-		public void setLastReturnValue(Object object) {
-			MethodCall methodCall = (MethodCall) currentCallHistory
-					.get(currentCallHistory.size() - 1);
-			methodCall.setReturnValue(object);
-		}
-	}
-
-	/**
-	 * Creates a mock object that neither looks at the order of method calls nor
-	 * at the arguments.
-	 * 
-	 * @param interfaceType
-	 * @return a mock object that checks for the order of method invocations but
-	 *         not for equality of method arguments
-	 */
-	public static Object createRelaxedMock(Class interfaceType) {
-		return createMock(interfaceType, false, indifferentEqualityComparator);
-	}
-
-	/**
-	 * Creates a mock object that does not look at the arguments, but checks
-	 * that the order of calls is as expected.
-	 * 
-	 * @param interfaceType
-	 * @return a mock object that checks for the order of method invocations but
-	 *         not for equality of method arguments
-	 */
-	public static Object createOrderedMock(Class interfaceType) {
-		return createMock(interfaceType, true, indifferentEqualityComparator);
-	}
-
-	/**
-	 * creates a fussy mock object
-	 * 
-	 * @param interfaceType
-	 * @return a mock object that checks for the order of method invocations and
-	 *         for equality of method arguments
-	 */
-	public static Object createMock(Class interfaceType) {
-		return createMock(interfaceType, true, defaultEqualityComparator);
-	}
-
-	/**
-	 * creates a fussy mock object with a comparator
-	 * 
-	 * @param interfaceType
-	 * @return a mock object that checks for the order of method invocations and
-	 *         uses the given comparator to compare method arguments
-	 */
-	public static Object createMock(Class interfaceType,
-			EqualityComparator equalityComparator) {
-		return createMock(interfaceType, true, equalityComparator);
-	}
-
-	private static Object createMock(Class interfaceType, boolean ordered,
-			EqualityComparator equalityComparator) {
-		if (!interfaceType.isInterface()) {
-			throw new IllegalArgumentException();
-		}
-		MockInvocationHandler mockInvocationHandler = new MockInvocationHandler(
-				ordered, equalityComparator);
-		Object newProxyInstance = Proxy.newProxyInstance(Mocks.class
-				.getClassLoader(), new Class[] { interfaceType, Mock.class },
-				mockInvocationHandler);
-		return newProxyInstance;
-	}
-
-	public static void startChecking(Object mock) {
-		getMockInvocationHandler(mock).replay();
-	}
-
-	public static void verify(Object mock) {
-		getMockInvocationHandler(mock).verify();
-	}
-
-	public static void reset(Object mock) {
-		getMockInvocationHandler(mock).reset();
-	}
-
-	private static MockInvocationHandler getMockInvocationHandler(Object mock) {
-		return ((Mock) mock).getMockInvocationHandler();
-	}
-
-	public static void setLastReturnValue(Object mock, Object object) {
-		getMockInvocationHandler(mock).setLastReturnValue(object);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/PlatformUtil.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/PlatformUtil.java
deleted file mode 100644
index 35db105..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/PlatformUtil.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.harness.util;
-
-import org.eclipse.jface.util.Util;
-
-/**
- * The Platform Util class is used to test for which platform we are in
- */
-public class PlatformUtil {
-    
-    /**
-     * Determine if we are running on the Mac platform.
-     * 
-     * @return true if we are runnig on the Mac platform.
-     */
-    public static boolean onMac() {
-        return Util.isMac();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/TweakletCheckTest.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/TweakletCheckTest.java
deleted file mode 100644
index edb895f..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/TweakletCheckTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.harness.util;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-
-/**
- * Tests to see if we're running with Tweaklets. If so, fail early so we don't
- * waste an entire morning trying to figure out why all of the part tests are
- * failing.
- * 
- * @since 3.4
- * 
- */
-public class TweakletCheckTest extends TestCase {
-
-	/**
-	 * 
-	 */
-	public TweakletCheckTest() {
-		setName("test for tweaklets");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#run(junit.framework.TestResult)
-	 */
-	public void run(TestResult result) {
-
-		result.startTest(this);
-		try {
-			IExtensionPoint point = Platform.getExtensionRegistry()
-
-			.getExtensionPoint("org.eclipse.ui.internalTweaklets");
-			boolean abort = point.getExtensions().length > 0;
-
-			if (abort) {
-				Error error = new Error(
-						"Tweaklets present in test setup - all test results are now suspect.  Please restart the tests with the tweaklet extensions removed.");
-				result.addError(this, error);
-				result.stop();
-			}
-		} finally {
-			result.endTest(this);
-		}
-
-	}
-
-	public static Test suite() {
-		TestSuite test = new TestSuite();
-		test.addTest(new TweakletCheckTest());
-		test.addTest(new TweakletCheckTest());
-		// should not run if there are tweaklets present - the first run should
-		// aggressively take down the framework.
-		return test;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/UITestCase.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/UITestCase.java
deleted file mode 100644
index 56c68b6..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/harness/util/UITestCase.java
+++ /dev/null
@@ -1,365 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.harness.util;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-
-/**
- * <code>UITestCase</code> is a useful super class for most
- * UI tests cases.  It contains methods to create new windows 
- * and pages.  It will also automatically close the test 
- * windows when the tearDown method is called.
- */
-public abstract class UITestCase extends TestCase {
-
-	/**
-	 * Returns the workbench page input to use for newly created windows.
-	 *  
-	 * @return the page input to use for newly created windows
-	 * @since 3.1
-	 */
-	public static IAdaptable getPageInput() {
-		return ResourcesPlugin.getWorkspace().getRoot();
-	}
-	
-	class TestWindowListener implements IWindowListener {
-        private boolean enabled = true;
-
-        public void setEnabled(boolean enabled) {
-            this.enabled = enabled;
-        }
-
-        public void windowActivated(IWorkbenchWindow window) {
-            // do nothing
-        }
-
-        public void windowDeactivated(IWorkbenchWindow window) {
-            // do nothing
-        }
-
-        public void windowClosed(IWorkbenchWindow window) {
-            if (enabled)
-                testWindows.remove(window);
-        }
-
-        public void windowOpened(IWorkbenchWindow window) {
-            if (enabled)
-                testWindows.add(window);
-        }
-    }
-
-    protected IWorkbench fWorkbench;
-
-    private List testWindows;
-
-    private TestWindowListener windowListener;
-
-    public UITestCase(String testName) {
-        super(testName);
-        //		ErrorDialog.NO_UI = true;
-        fWorkbench = PlatformUI.getWorkbench();
-        testWindows = new ArrayList(3);
-    }
-
-	/**
-	 * Fails the test due to the given throwable.
-	 */
-	public static void fail(String message, Throwable e) {
-		// If the exception is a CoreException with a multistatus
-		// then print out the multistatus so we can see all the info.
-		if (e instanceof CoreException) {
-			IStatus status = ((CoreException) e).getStatus();
-			write(status, 0);
-		} else
-			e.printStackTrace();
-		fail(message + ": " + e);
-	}
-
-	private static void indent(OutputStream output, int indent) {
-		for (int i = 0; i < indent; i++)
-			try {
-				output.write("\t".getBytes());
-			} catch (IOException e) {
-				// ignore
-			}
-	}
-
-	private static void write(IStatus status, int indent) {
-		PrintStream output = System.out;
-		indent(output, indent);
-		output.println("Severity: " + status.getSeverity());
-
-		indent(output, indent);
-		output.println("Plugin ID: " + status.getPlugin());
-
-		indent(output, indent);
-		output.println("Code: " + status.getCode());
-
-		indent(output, indent);
-		output.println("Message: " + status.getMessage());
-
-		if (status.getException() != null) {
-			indent(output, indent);
-			output.print("Exception: ");
-			status.getException().printStackTrace(output);
-		}
-
-		if (status.isMultiStatus()) {
-			IStatus[] children = status.getChildren();
-			for (int i = 0; i < children.length; i++)
-				write(children[i], indent + 1);
-		}
-	}
-
-	/**
-     * Adds a window listener to the workbench to keep track of
-     * opened test windows.
-     */
-    private void addWindowListener() {
-        windowListener = new TestWindowListener();
-        fWorkbench.addWindowListener(windowListener);
-    }
-
-    /**
-     * Removes the listener added by <code>addWindowListener</code>. 
-     */
-    private void removeWindowListener() {
-        if (windowListener != null) {
-            fWorkbench.removeWindowListener(windowListener);
-        }
-    }
-
-    /**
-     * Outputs a trace message to the trace output device, if enabled.
-     * By default, trace messages are sent to <code>System.out</code>.
-     * 
-     * @param msg the trace message
-     */
-    protected void trace(String msg) {
-        System.err.println(msg);
-    }
-
-    /**
-     * Simple implementation of setUp. Subclasses are prevented 
-     * from overriding this method to maintain logging consistency.
-     * doSetUp() should be overriden instead.
-     */
-    protected final void setUp() throws Exception {
-    	super.setUp();
-    	trace("----- " + this.getName()); //$NON-NLS-1$
-        trace(this.getName() + ": setUp..."); //$NON-NLS-1$
-        addWindowListener();
-        doSetUp();
-       
-    }
-
-    /**
-     * Sets up the fixture, for example, open a network connection.
-     * This method is called before a test is executed.
-     * The default implementation does nothing.
-     * Subclasses may extend.
-     */
-    protected void doSetUp() throws Exception {
-        // do nothing.
-    }
-
-    /**
-     * Simple implementation of tearDown.  Subclasses are prevented 
-     * from overriding this method to maintain logging consistency.
-     * doTearDown() should be overriden instead.
-     */
-    protected final void tearDown() throws Exception {
-        super.tearDown();
-        trace(this.getName() + ": tearDown...\n"); //$NON-NLS-1$
-        removeWindowListener();
-        doTearDown();
-    }
-
-    /**
-     * Tears down the fixture, for example, close a network connection.
-     * This method is called after a test is executed.
-     * The default implementation closes all test windows, processing events both before
-     * and after doing so.
-     * Subclasses may extend.
-     */
-    protected void doTearDown() throws Exception {
-        processEvents();
-        closeAllTestWindows();
-        processEvents();
-    }
-
-    protected static void processEvents() {
-        Display display = PlatformUI.getWorkbench().getDisplay();
-        if (display != null)
-            while (display.readAndDispatch())
-                ;
-    }
-
-    protected static interface Condition {
-    	public boolean compute();
-    }
-    
-	/**
-	 * 
-	 * @param condition
-	 *            , or null if this should only wait
-	 * @param timeout
-	 *            , -1 if forever
-	 * @return true if successful, false if time out or interrupted
-	 */
-	protected boolean processEventsUntil(Condition condition, long timeout) {
-		long startTime = System.currentTimeMillis();
-		Display display = getWorkbench().getDisplay();
-		while (condition == null || !condition.compute()) {
-			if (timeout != -1
-					&& System.currentTimeMillis() - startTime > timeout) {
-				return false;
-			}
-			while (display.readAndDispatch())
-				;
-			try {
-				Thread.sleep(20);
-			} catch (InterruptedException e) {
-				Thread.currentThread().interrupt();
-				return false;
-			}
-		}
-		return true;
-	}
-    
-    /** 
-     * Open a test window with the empty perspective.
-     */
-    public IWorkbenchWindow openTestWindow() {
-        return openTestWindow(EmptyPerspective.PERSP_ID);
-    }
-
-    /**
-     * Open a test window with the provided perspective.
-     */
-    public IWorkbenchWindow openTestWindow(String perspectiveId) {
-		try {
-			IWorkbenchWindow window = fWorkbench.openWorkbenchWindow(
-					perspectiveId, getPageInput());
-			waitOnShell(window.getShell());
-			return window;
-		} catch (WorkbenchException e) {
-			fail();
-			return null;
-		}
-	}
-
-    /**
-	 * Try and process events until the new shell is the active shell. This may
-	 * never happen, so time out after a suitable period.
-	 * 
-	 * @param shell
-	 *            the shell to wait on
-	 * @since 3.2
-	 */
-	private void waitOnShell(Shell shell) {
-
-		processEvents();
-//		long endTime = System.currentTimeMillis() + 5000;
-//
-//		while (shell.getDisplay().getActiveShell() != shell
-//				&& System.currentTimeMillis() < endTime) {
-//			processEvents();
-//		}
-	}
-
-	/**
-	 * Close all test windows.
-	 */
-    public void closeAllTestWindows() {
-        Iterator iter = new ArrayList(testWindows).iterator();
-        while (iter.hasNext()) {
-            IWorkbenchWindow win = (IWorkbenchWindow) iter.next();
-            win.close();
-        }
-        testWindows.clear();
-    }
-
-    /**
-     * Open a test page with the empty perspective in a window.
-     */
-    public IWorkbenchPage openTestPage(IWorkbenchWindow win) {
-        IWorkbenchPage[] pages = openTestPage(win, 1);
-        if (pages != null)
-            return pages[0];
-        else
-            return null;
-    }
-
-    /**
-     * Open "n" test pages with the empty perspective in a window.
-     */
-    public IWorkbenchPage[] openTestPage(IWorkbenchWindow win, int pageTotal) {
-        try {
-            IWorkbenchPage[] pages = new IWorkbenchPage[pageTotal];
-            IAdaptable input = getPageInput();
-
-            for (int i = 0; i < pageTotal; i++) {
-                pages[i] = win.openPage(EmptyPerspective.PERSP_ID, input);
-            }
-            return pages;
-        } catch (WorkbenchException e) {
-            fail();
-            return null;
-        }
-    }
-
-    /**
-     * Close all pages within a window.
-     */
-    public void closeAllPages(IWorkbenchWindow window) {
-        IWorkbenchPage[] pages = window.getPages();
-        for (int i = 0; i < pages.length; i++)
-            pages[i].close();
-    }
-
-    /**
-     * Set whether the window listener will manage opening and closing of created windows.
-     */
-    protected void manageWindows(boolean manage) {
-        windowListener.setEnabled(manage);
-    }
-    
-    /**
-     * Returns the workbench.
-     * 
-     * @return the workbench
-     * @since 3.1
-     */
-    protected IWorkbench getWorkbench() {
-        return fWorkbench;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/AccessibilityTestPass.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/AccessibilityTestPass.java
deleted file mode 100644
index ef9e030..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/AccessibilityTestPass.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal.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;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/FailureDialog.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/FailureDialog.java
deleted file mode 100644
index 22e2735..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/FailureDialog.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal.util;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-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;
-
-/*
- * 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/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/FocusTestPass.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/FocusTestPass.java
deleted file mode 100644
index d0808e4..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/FocusTestPass.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal.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/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/IDialogTestPass.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/IDialogTestPass.java
deleted file mode 100644
index a8c6bef..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/IDialogTestPass.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal.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/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/SizingTestPass.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/SizingTestPass.java
deleted file mode 100644
index 79d866b..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/SizingTestPass.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal.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/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/VerifyDialog.java b/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/VerifyDialog.java
deleted file mode 100644
index 4354bae..0000000
--- a/tests/org.eclipse.ui.tests.harness/src/org/eclipse/ui/tests/internal/util/VerifyDialog.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal.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.jface.util.Util;
-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 _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);
-        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(Util.getWS())
-                .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/tests/org.eclipse.ui.tests.navigator/.classpath b/tests/org.eclipse.ui.tests.navigator/.classpath
deleted file mode 100644
index 2eda2ff..0000000
--- a/tests/org.eclipse.ui.tests.navigator/.classpath
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.navigator/.cvsignore b/tests/org.eclipse.ui.tests.navigator/.cvsignore
deleted file mode 100644
index e91529a..0000000
--- a/tests/org.eclipse.ui.tests.navigator/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin 
diff --git a/tests/org.eclipse.ui.tests.navigator/.project b/tests/org.eclipse.ui.tests.navigator/.project
deleted file mode 100644
index 89770ed..0000000
--- a/tests/org.eclipse.ui.tests.navigator/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.tests.navigator</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/tests/org.eclipse.ui.tests.navigator/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.ui.tests.navigator/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index b217e05..0000000
--- a/tests/org.eclipse.ui.tests.navigator/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,73 +0,0 @@
-#Mon Dec 01 11:36:35 PST 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.4
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=ignore
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.4
diff --git a/tests/org.eclipse.ui.tests.navigator/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.ui.tests.navigator/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index afed118..0000000
--- a/tests/org.eclipse.ui.tests.navigator/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Thu Sep 14 08:14:32 EDT 2006
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.3\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template></templates>
diff --git a/tests/org.eclipse.ui.tests.navigator/.settings/org.eclipse.pde.prefs b/tests/org.eclipse.ui.tests.navigator/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 3960b87..0000000
--- a/tests/org.eclipse.ui.tests.navigator/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,25 +0,0 @@
-#Mon Dec 01 11:36:34 PST 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=2
-compilers.p.internal=1
-compilers.p.missing-packages=2
-compilers.p.missing-version-export-package=2
-compilers.p.missing-version-import-package=2
-compilers.p.missing-version-require-bundle=2
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/tests/org.eclipse.ui.tests.navigator/META-INF/MANIFEST.MF b/tests/org.eclipse.ui.tests.navigator/META-INF/MANIFEST.MF
deleted file mode 100644
index 0275421..0000000
--- a/tests/org.eclipse.ui.tests.navigator/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %bundlename
-Bundle-SymbolicName: org.eclipse.ui.tests.navigator;singleton:=true
-Bundle-Activator: org.eclipse.ui.tests.navigator.NavigatorTestsPlugin
-Bundle-Version: 3.3.200.qualifier
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.ui.navigator,
- org.eclipse.ui,
- org.eclipse.ui.ide,
- org.eclipse.ui.workbench,
- org.junit,
- org.eclipse.ui.navigator.resources
-Bundle-Vendor: Eclipse.org
-Bundle-ClassPath: uinavtests.jar
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
diff --git a/tests/org.eclipse.ui.tests.navigator/Navigator Test Suite.launch b/tests/org.eclipse.ui.tests.navigator/Navigator Test Suite.launch
deleted file mode 100644
index b430e29..0000000
--- a/tests/org.eclipse.ui.tests.navigator/Navigator Test Suite.launch
+++ /dev/null
@@ -1,321 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
-<booleanAttribute key="askclear" value="false"/>
-<booleanAttribute key="automaticAdd" value="true"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="checked" value="org.eclipse.ui.navigator"/>
-<booleanAttribute key="clearConfig" value="true"/>
-<booleanAttribute key="clearws" value="true"/>
-<booleanAttribute key="clearwslog" value="false"/>
-<booleanAttribute key="com.mountainminds.eclemma.core.INPLACE_INSTRUMENTATION" value="true"/>
-<listAttribute key="com.mountainminds.eclemma.core.INSTRUMENTATION_PATHS">
-<listEntry value="/org.eclipse.ui.navigator.resources/bin"/>
-<listEntry value="/org.eclipse.ui.navigator/bin"/>
-</listAttribute>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
-<booleanAttribute key="default" value="true"/>
-<booleanAttribute key="includeOptional" value="true"/>
-<stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/NavigatorTestSuite.java"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.ui.tests.navigator.NavigatorTestSuite"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.ui.tests.navigator"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<stringAttribute key="product" value="org.eclipse.sdk.ide"/>
-<stringAttribute key="selectedPlugin" value="org.eclipse.ui.navigator"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="templateConfig" value=""/>
-<booleanAttribute key="tracing" value="true"/>
-<mapAttribute key="tracingOptions">
-<mapEntry key="org.eclipse.pde.core/cache" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/compatibility/debug" value="false"/>
-<mapEntry key="org.eclipse.jface/debug" value="false"/>
-<mapEntry key="org.eclipse.update.core/debug/parsing" value="false"/>
-<mapEntry key="org.eclipse.core.resources/perf/listeners" value="500"/>
-<mapEntry key="org.eclipse.help.ui/debug" value="true"/>
-<mapEntry key="org.eclipse.team.cvs.ssh/debug" value="false"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/location" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/filter" value="false"/>
-<mapEntry key="org.eclipse.pde.core/debug" value="true"/>
-<mapEntry key="org.eclipse.osgi/defaultprofile/logsynchronously" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/debug" value="false"/>
-<mapEntry key="org.eclipse.core.resources/perf/snapshot" value="1000"/>
-<mapEntry key="org.eclipse.jface.text/assert/TextSelection/validConstructorArguments" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/needbuildstack" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/stacktrace" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs/errorondeadlock" value="false"/>
-<mapEntry key="org.eclipse.ui/perf/part.create" value="800"/>
-<mapEntry key="org.eclipse.core.runtime/debug" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/debug/context" value="false"/>
-<mapEntry key="org.eclipse.jface/trace/actions" value="false"/>
-<mapEntry key="org.eclipse.osgi/monitor/classes" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/indexmanager" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/operations" value="false"/>
-<mapEntry key="org.eclipse.jdt.apt.core/debug" value="false"/>
-<mapEntry key="org.eclipse.osgi/profile/debug" value="false"/>
-<mapEntry key="org.eclipse.team.cvs.core/cvsprotocol" value="true"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/explorer/createPartControl" value="1300"/>
-<mapEntry key="org.eclipse.core.runtime/url/debug/cachecopy" value="false"/>
-<mapEntry key="org.eclipse.ui.intro.universal/debug" value="true"/>
-<mapEntry key="org.eclipse.jdt.core/debug/builder" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/hierarchy" value="false"/>
-<mapEntry key="org.eclipse.help/debug/search" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPropertyChangeListener" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save/tree" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/keyBindings.verbose" value="false"/>
-<mapEntry key="org.eclipse.team.cvs.core/debug" value="false"/>
-<mapEntry key="org.eclipse.jface/trace/toolbarDisposal" value="false"/>
-<mapEntry key="org.eclipse.ltk.core.refactoring/perf/participants/createChanges" value="300"/>
-<mapEntry key="org.eclipse.update.core/debug/reconciler" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/javadelta/verbose" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs/beginend" value="false"/>
-<mapEntry key="org.eclipse.jface/debug/viewers/reentrantViewerCalls" value="false"/>
-<mapEntry key="org.eclipse.debug.core/debug/events" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save/mastertable" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/contexts" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/debug/BreadcrumbItemDropDown" value="false"/>
-<mapEntry key="org.eclipse.equinox.registry/debug" value="false"/>
-<mapEntry key="org.eclipse.equinox.security.ui/debug" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/perf" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/updateSequence" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/selection" value="false"/>
-<mapEntry key="org.eclipse.ui.browser/debug" value="false"/>
-<mapEntry key="org.eclipse.ui.ide/debug" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/debug" value="true"/>
-<mapEntry key="org.eclipse.jface.text.source/debug/RevisionRulerColumn" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/buffermanager" value="false"/>
-<mapEntry key="org.eclipse.jdt.apt.core/debug/generatedFiles" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/debug" value="true"/>
-<mapEntry key="org.eclipse.ui/debug/swtdebug" value="false"/>
-<mapEntry key="org.eclipse.team.core/debug" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/explorer/RefactorActionGroup" value="150"/>
-<mapEntry key="org.eclipse.ui.navigator/debug/dnd" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/perf/completion" value="300"/>
-<mapEntry key="org.eclipse.jdt.core/debug/compiler" value="false"/>
-<mapEntry key="org.eclipse.osgi/trace/activation" value="false"/>
-<mapEntry key="org.eclipse.team.cvs.core/metafiles" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/debug/setup" value="true"/>
-<mapEntry key="org.eclipse.ui/experimental/menus" value="false"/>
-<mapEntry key="org.eclipse.help.ui/debug/infopop" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/url/debug" value="false"/>
-<mapEntry key="org.eclipse.ui/perf/perspective.create" value="800"/>
-<mapEntry key="org.eclipse.core.resources/debug" value="false"/>
-<mapEntry key="org.eclipse.equinox.security/debug/loginFramework" value="false"/>
-<mapEntry key="org.eclipse.equinox.preferences/set" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/metainfo" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/showAllJobs" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/workingSets" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/operations.verbose" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/contexts.performance" value="false"/>
-<mapEntry key="org.eclipse.debug.core/debug" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/wiring" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/javamodel" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPartListener2" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/model" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/messageBundles" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/sourcemapper" value="false"/>
-<mapEntry key="org.eclipse.ui.ide/debug/gc" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs/locks" value="false"/>
-<mapEntry key="org.eclipse.ui/perf/uijob" value="200"/>
-<mapEntry key="org.eclipse.jdt.core.manipulation/debug" value="true"/>
-<mapEntry key="org.eclipse.help/debug" value="true"/>
-<mapEntry key="org.eclipse.equinox.registry/debug/events" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/builder/stats" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs/timing" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/contentProvider" value="false"/>
-<mapEntry key="org.eclipse.ui.ide/debug/internalerror/openDialog" value="false"/>
-<mapEntry key="org.eclipse.ui/perf/part.control" value="800"/>
-<mapEntry key="org.eclipse.osgi/defaultprofile/logfilename" value=""/>
-<mapEntry key="org.eclipse.jface.text/debug/ContentAssistSubjectAdapters" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/perf/javadeltalistener" value="500"/>
-<mapEntry key="org.eclipse.ui.intro/trace/printHTML" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/events" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/services" value="false"/>
-<mapEntry key="org.eclipse.update.core/debug/type" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/perf/containerinitializer" value="5000"/>
-<mapEntry key="org.eclipse.jdt.apt.core/debug/generatedFileMaps" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug" value="true"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/explorer/makeActions" value="1000"/>
-<mapEntry key="org.eclipse.ui/debug/swtdebugglobal" value="false"/>
-<mapEntry key="org.eclipse.ui/debug" value="false"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/perf/success" value="false"/>
-<mapEntry key="org.eclipse.ui/perf/page.listeners" value="200"/>
-<mapEntry key="org.eclipse.jdt.core/debug/resolution" value="false"/>
-<mapEntry key="org.eclipse.equinox.preferences/get" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/delta" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug" value="false"/>
-<mapEntry key="org.eclipse.update.core/debug/configuration" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/contributions" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/deltas" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/commands" value="false"/>
-<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/javadelta" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/declaredImages" value="false"/>
-<mapEntry key="org.eclipse.ui.intro.universal/trace/logInfo" value="true"/>
-<mapEntry key="org.eclipse.osgi/debug/manifest" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/keyBindings" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/security" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/markers" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/debug/TypeConstraints" value="false"/>
-<mapEntry key="org.eclipse.help.webapp/debug" value="true"/>
-<mapEntry key="org.eclipse.core.resources/save" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/sources" value="false"/>
-<mapEntry key="org.eclipse.ui/perf/perspective.switch" value="800"/>
-<mapEntry key="org.eclipse.core.runtime/preferences/plugin" value="false"/>
-<mapEntry key="org.eclipse.core.resources/strings" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/startlevel" value="false"/>
-<mapEntry key="org.eclipse.team.core/threading" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/debug/ResultCollector" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/requires" value="false"/>
-<mapEntry key="org.eclipse.osgi/profile/impl" value="org.eclipse.osgi.internal.profile.DefaultProfileLogger"/>
-<mapEntry key="org.eclipse.ui/trace/handlers.verbose.commandId" value=""/>
-<mapEntry key="org.eclipse.team.cvs.core/dirtycaching" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/perf/reconcile" value="1000"/>
-<mapEntry key="org.eclipse.core.resources/save/metainfo" value="false"/>
-<mapEntry key="org.eclipse.update.configurator/debug" value="false"/>
-<mapEntry key="org.eclipse.update.core/debug/installhandler" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/bundleTime" value="false"/>
-<mapEntry key="org.eclipse.ui/perf/part.activate" value="200"/>
-<mapEntry key="org.eclipse.core.resources/build/needbuild" value="false"/>
-<mapEntry key="org.eclipse.jdt.apt.core/debug/compilationEnv" value="false"/>
-<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser/inprocess" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/syncinfo" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/cycles" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/invoking" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/indexmanager/advanced" value="false"/>
-<mapEntry key="org.eclipse.team.cvs.core/syncchangeevents" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/cpresolution/advanced" value="false"/>
-<mapEntry key="org.eclipse.core.resources/contenttype" value="false"/>
-<mapEntry key="org.eclipse.ui.intro/trace/logInfo" value="true"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/viewer" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/perf/selection" value="300"/>
-<mapEntry key="org.eclipse.ui.workbench/debug" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/failure" value="false"/>
-<mapEntry key="org.eclipse.update.core/debug/web" value="false"/>
-<mapEntry key="org.eclipse.core.resources/refresh" value="false"/>
-<mapEntry key="org.eclipse.ui.ide/debug/markers" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/perf/variableinitializer" value="5000"/>
-<mapEntry key="org.eclipse.osgi/debug/loader" value="false"/>
-<mapEntry key="org.eclipse.osgi/monitor/activation" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/handlers.verbose" value="false"/>
-<mapEntry key="org.eclipse.jface.text/debug/FastPartitioner/PositionCache" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/packageadmin" value="false"/>
-<mapEntry key="org.eclipse.ui/perf/part.input" value="200"/>
-<mapEntry key="org.eclipse.jdt.core/debug/search" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/imports" value="false"/>
-<mapEntry key="org.eclipse.jdt.apt.pluggable.core/debug" value="false"/>
-<mapEntry key="org.eclipse.team.core/streams" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/search/participants" value="300"/>
-<mapEntry key="org.eclipse.update.core/debug/install" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs/shutdown" value="false"/>
-<mapEntry key="org.eclipse.core.resources/history" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPerspectiveListener" value="false"/>
-<mapEntry key="org.eclipse.equinox.security.ui/debug/storage" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/cpresolution/failure" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/generics" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/postaction" value="false"/>
-<mapEntry key="org.eclipse.team.cvs.core/threading" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/stateSaveRestore" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/launchhistory" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/zipaccess" value="false"/>
-<mapEntry key="org.eclipse.ui.intro/debug/toolbar" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save/markers" value="false"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver" value="false"/>
-<mapEntry key="org.eclipse.ui/perf/perspective.listeners" value="200"/>
-<mapEntry key="org.eclipse.core.resources/restore/tree" value="false"/>
-<mapEntry key="org.eclipse.update.core/debug/warning" value="false"/>
-<mapEntry key="org.eclipse.core.expressions/tracePropertyResolving" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/content_assist/extensions" value="1000"/>
-<mapEntry key="org.eclipse.ui/perf/contentTypes" value="200"/>
-<mapEntry key="org.eclipse.core.runtime/url/debug/cachelookup" value="false"/>
-<mapEntry key="org.eclipse.osgi/defaultprofile/buffersize" value="256"/>
-<mapEntry key="org.eclipse.pde.build/debug" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/formatter" value="false"/>
-<mapEntry key="org.eclipse.pde.core/validation" value="false"/>
-<mapEntry key="org.eclipse.jface/newlook/preferences/showNewLook" value="false"/>
-<mapEntry key="org.eclipse.pde.core/classpath" value="false"/>
-<mapEntry key="org.eclipse.core.resources/preferences" value="false"/>
-<mapEntry key="org.eclipse.osgi/trace/classLoading" value="false"/>
-<mapEntry key="org.eclipse.ui/perf/part.init" value="800"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPartListener2" value="false"/>
-<mapEntry key="org.eclipse.equinox.preferences/general" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save/syncinfo" value="false"/>
-<mapEntry key="org.eclipse.ui/perf/workbench.start" value="45000"/>
-<mapEntry key="org.eclipse.ui/trace/multipageeditor" value="false"/>
-<mapEntry key="org.eclipse.osgi/profile/startup" value="false"/>
-<mapEntry key="org.eclipse.osgi/trace/filters" value="trace.properties"/>
-<mapEntry key="org.eclipse.core.jobs/jobs" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/graphics" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/debug/ASTProvider" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/javamodel/cache" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/url/debug/connect" value="false"/>
-<mapEntry key="org.eclipse.team.core/refreshjob" value="false"/>
-<mapEntry key="org.eclipse.core.resources/contenttype/cache" value="false"/>
-<mapEntry key="org.eclipse.ui.intro/flags/noBrowser" value="false"/>
-<mapEntry key="org.eclipse.core.contenttype/debug" value="false"/>
-<mapEntry key="org.eclipse.ui/perf/workbench.restore" value="30000"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPageListener" value="false"/>
-<mapEntry key="org.eclipse.team.cvs.ssh/ssh_protocol" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPartListener" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/debug/resolution" value="true"/>
-<mapEntry key="org.eclipse.team.core/backgroundevents" value="false"/>
-<mapEntry key="org.eclipse.ui.intro/trace/logPerformance" value="false"/>
-<mapEntry key="org.eclipse.jface.text/debug/AbstractInformationControlManager" value="false"/>
-<mapEntry key="org.eclipse.equinox.security/debug" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/content_assist_sorters/extensions" value=""/>
-<mapEntry key="org.eclipse.debug.core/debug/commands" value="false"/>
-<mapEntry key="org.eclipse.core.resources/perf/save.participants" value="500"/>
-<mapEntry key="org.eclipse.update.core/debug" value="true"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPartReference" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPartListener" value="false"/>
-<mapEntry key="org.eclipse.osgi/profile/benchmark" value="false"/>
-<mapEntry key="org.eclipse.core.resources/natures" value="false"/>
-<mapEntry key="org.eclipse.ui.ide/debug/undomonitor" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/handlers.performance" value="false"/>
-<mapEntry key="org.eclipse.core.resources/perf/builders" value="10000"/>
-<mapEntry key="org.eclipse.ui/trace/contexts.verbose" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/mastertable" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/interrupt" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/job.stale" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/cpresolution" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/snapshots" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/contextlaunching" value="false"/>
-<mapEntry key="org.eclipse.ltk.core.refactoring/perf/participants/checkConditions" value="300"/>
-<mapEntry key="org.eclipse.ui/trace/handlers" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/completion" value="false"/>
-<mapEntry key="org.eclipse.osgi/monitor/resources" value="false"/>
-<mapEntry key="org.eclipse.help.webapp/debug/workingsets" value="false"/>
-<mapEntry key="org.eclipse.jface/debug/dialog/noparent" value="false"/>
-<mapEntry key="org.eclipse.ui.intro/debug" value="true"/>
-<mapEntry key="org.eclipse.osgi/resolver/uses" value="false"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/converter/debug" value="false"/>
-<mapEntry key="org.eclipse.help/debug/context" value="false"/>
-<mapEntry key="org.eclipse.osgi/trace/filename" value="runtime.traces"/>
-<mapEntry key="org.eclipse.ui/perf/part.listeners" value="200"/>
-<mapEntry key="org.eclipse.ui.intro.universal/trace/logPerformance" value="false"/>
-<mapEntry key="org.eclipse.jface.text/debug/AnnotationPainter" value="false"/>
-<mapEntry key="org.eclipse.help/debug/toc" value="false"/>
-<mapEntry key="org.eclipse.ui/perf/showHeapStatus" value="true"/>
-</mapAttribute>
-<booleanAttribute key="useDefaultConfig" value="true"/>
-<booleanAttribute key="useDefaultConfigArea" value="false"/>
-<booleanAttribute key="useProduct" value="true"/>
-</launchConfiguration>
diff --git a/tests/org.eclipse.ui.tests.navigator/about.html b/tests/org.eclipse.ui.tests.navigator/about.html
deleted file mode 100644
index 4602330..0000000
--- a/tests/org.eclipse.ui.tests.navigator/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.navigator/build.properties b/tests/org.eclipse.ui.tests.navigator/build.properties
deleted file mode 100644
index 934058d..0000000
--- a/tests/org.eclipse.ui.tests.navigator/build.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.uinavtests.jar = src/
-               
-src.includes = about.html
-output.uinavtests.jar = bin/
-bin.includes = testdata/,\
-               META-INF/,\
-               about.html,\
-               test.xml,\
-               plugin.xml,\
-               *.html,\
-               *.jar,\
-               *.xml,\
-               plugin.properties
diff --git a/tests/org.eclipse.ui.tests.navigator/plugin.properties b/tests/org.eclipse.ui.tests.navigator/plugin.properties
deleted file mode 100644
index 46a7215..0000000
--- a/tests/org.eclipse.ui.tests.navigator/plugin.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bundlename=Common Navigator Tests
-
-test.navigator.viewName=Test Navigator Viewer
-test.navigator.programmaticViewName=Test Programmatic Navigator View
-test.navigator.overrideViewName=Test Override View
-test.navigator.pipelineViewName=Test Pipeline View
-test.navigator.extension=Test Navigator Extension
diff --git a/tests/org.eclipse.ui.tests.navigator/plugin.xml b/tests/org.eclipse.ui.tests.navigator/plugin.xml
deleted file mode 100644
index 051a309..0000000
--- a/tests/org.eclipse.ui.tests.navigator/plugin.xml
+++ /dev/null
@@ -1,480 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            allowMultiple="false"
-            class="org.eclipse.ui.navigator.CommonNavigator"
-            id="org.eclipse.ui.tests.navigator.TestView"
-            name="%test.navigator.viewName"/>
-            
-      <view
-            allowMultiple="false"
-            class="org.eclipse.ui.navigator.CommonNavigator"
-            id="org.eclipse.ui.tests.navigator.ProgrammaticTestView"
-            name="%test.navigator.programmaticViewName"/>     
-            
-      <view
-            allowMultiple="false"
-            class="org.eclipse.ui.navigator.CommonNavigator"
-            id="org.eclipse.ui.tests.navigator.PipelineTestView"
-            name="%test.navigator.pipelineViewName"/>            
-
-      <view
-            allowMultiple="false"
-            class="org.eclipse.ui.navigator.CommonNavigator"
-            id="org.eclipse.ui.tests.navigator.OverrideTestView"
-            name="%test.navigator.overrideViewName"/>            
-
-      <view
-            allowMultiple="false"
-            class="org.eclipse.ui.navigator.CommonNavigator"
-            id="org.eclipse.ui.tests.navigator.HideAvailableExtensionsTestView"
-            name="Test Hide Available Extensions View"/>            
-   </extension>
-   <extension
-         point="org.eclipse.ui.navigator.navigatorContent">
-      <navigatorContent 
-            id="org.eclipse.ui.tests.navigator.testContent" 
-            name="%test.navigator.extension"
-            contentProvider="org.eclipse.ui.tests.navigator.extension.TestContentProvider"
-            labelProvider="org.eclipse.ui.tests.navigator.extension.TestLabelProviderBlue"
-            activeByDefault="true"
-            priority="higher">
-         <triggerPoints>
-			<adapt type="org.eclipse.core.resources.IProject"/>
-         </triggerPoints> 
-         <possibleChildren>
-            <or>
-				<instanceof value="org.eclipse.ui.tests.navigator.extension.TestExtensionTreeData"/>
-				<instanceof value="org.eclipse.core.resources.IFile" />
-			</or>
-    
-         </possibleChildren> 
-      	 <actionProvider
-            class="org.eclipse.ui.tests.navigator.extension.TestNestedActionProvider"
-            id="org.eclipse.ui.tests.navigator.extension.TestNestedActionProvider"> 
-      	 </actionProvider>
-        <commonSorter
-              class="org.eclipse.ui.tests.navigator.extension.TestDataSorter"
-              id="org.eclipse.ui.tests.navigator.commonSorter">
-           <parentExpression>
-              <or>
-                 <adapt type="org.eclipse.core.resources.IProject"/>
-                 <instanceof value="org.eclipse.ui.tests.navigator.extension.TestExtensionTreeData"/>
-              </or>
-           </parentExpression>
-        </commonSorter>
-        <!-- The following two sorters are used to test the INavigatorSorterService -->
-       <commonSorter class="org.eclipse.ui.tests.navigator.extension.TestDataSorter">
-          <parentExpression>
-             <instanceof value="org.eclipse.ui.navigator.INavigatorSorterService"/>
-          </parentExpression>
-       </commonSorter> 
-       <commonSorter class="org.eclipse.ui.tests.navigator.extension.TestDataSorter">
-          <parentExpression>
-             <instanceof value="org.eclipse.ui.navigator.INavigatorSorterService"/>
-          </parentExpression>
-       </commonSorter>
-	      <actionProvider
-	            class="org.eclipse.ui.tests.navigator.extension.TestActionProvider"
-	            id="org.eclipse.ui.tests.navigator.extension.TestActionProvider"
-	            overrides="org.eclipse.ui.navigator.resources.actions.RefactorActions">
-	         <enablement>
-	            <or>
-	              <instanceof value="org.eclipse.core.resources.IFolder"/>
-	              <instanceof value="org.eclipse.core.resources.IFile"/>
-	            </or>  
-	         </enablement>
-	      </actionProvider>
-      </navigatorContent>
-      <actionProvider
-            class="org.eclipse.ui.tests.navigator.extension.DependentActionProvider"
-            dependsOn="org.eclipse.ui.tests.navigator.extension.TestActionProvider"
-            id="org.eclipse.ui.tests.navigator.extension.DependentActionProvider">
-         <enablement>
-            <instanceof value="org.eclipse.core.resources.IResource"/>
-         </enablement>
-      </actionProvider>
-      <actionProvider
-            class="org.eclipse.ui.tests.navigator.extension.DependentActionProvider"
-            dependsOn="Invalid Id"
-            id="org.eclipse.ui.tests.navigator.extension.[If this menu option shows, it is an INTENTIONAL ERROR from org.eclipse.ui.tests.navigator! A warning SHOULD appear in the log!]">
-         <enablement>
-            <instanceof value="org.eclipse.core.resources.IResource"/>
-         </enablement>
-      </actionProvider>
-      <actionProvider
-            class="org.eclipse.ui.tests.navigator.extension.DependentActionProvider"
-            dependsOn="org.eclipse.ui.tests.navigator.extension.DependentActionProvider"
-            id="org.eclipse.ui.tests.navigator.extension.[Second Dependent Action]">
-         <enablement>
-            <instanceof value="org.eclipse.core.resources.IResource"/>
-         </enablement>
-      </actionProvider>
-      <navigatorContent
-            contentProvider="org.eclipse.ui.tests.navigator.extension.TestContentProvider"
-            id="org.eclipse.ui.tests.navigator.testContent2"
-            labelProvider="org.eclipse.ui.tests.navigator.extension.TestLabelProviderBlue"
-            name="Test Navigator Extension [Programmatic Binding]">
-	     <triggerPoints>
-            <instanceof value="org.eclipse.core.resources.IProject"/>
-         </triggerPoints>            
-      </navigatorContent>
-      <commonFilter
-            class="org.eclipse.ui.tests.navigator.extension.TestItemsThatEndIn3"
-            description="Hide TestItem objects that end in the number &quot;3&quot;"
-            id="org.eclipse.ui.tests.navigator.filters.TestItemsThatEndWith3"
-            name="TestItems that end with &quot;3&quot;"
-            activeByDefault="true"
-            /> 
-      <commonFilter
-            description="Hides all instances of Test Item"
-            id="org.eclipse.ui.tests.navigator.filters.AllTestItems"
-            name="A TestItem Exp Filter (should be sorted alphab..)">
-         <filterExpression>
-            <instanceof value="org.eclipse.ui.tests.navigator.extension.TestExtensionTreeData"/>
-         </filterExpression>
-      </commonFilter>      
-      <commonFilter
-            class="org.eclipse.ui.tests.navigator.extension.TestItemsThatEndIn3"
-            description="This filter specifies a class an an expression; selecting it should result in a warning in the log."
-            id="org.eclipse.ui.tests.navigator.filters.ErrantFilter"
-            name="An errant filter">
-         <filterExpression>
-            <instanceof value="org.eclipse.ui.tests.navigator.extension.TestExtensionTreeData"/>
-         </filterExpression>
-      </commonFilter>
-      <commonFilter
-            id="org.eclipse.ui.tests.navigator.filters.NoDescriptionFilter"
-            name="No Description Filter">
-         <filterExpression>
-            <instanceof value="org.eclipse.ui.navigator.INavigatorContentService"/>
-         </filterExpression>
-      </commonFilter>
-      <actionProvider
-            class="org.eclipse.ui.tests.navigator.extension.TestOverrideableActionProvider"
-            id="org.eclipse.ui.tests.navigator.extension.TestOverrideABLEActionProvider"
-            priority="normal">
-         <enablement>
-            <instanceof
-                  value="org.eclipse.core.resources.IResource">
-            </instanceof>
-         </enablement>
-      </actionProvider>
-      <actionProvider
-            class="org.eclipse.ui.tests.navigator.extension.TestOverrideableActionProvider"
-            id="org.eclipse.ui.tests.navigator.extension.TestOverridINGActionProvider1"
-            overrides="org.eclipse.ui.tests.navigator.extension.TestOverrideABLEActionProvider"
-            priority="high">
-         <enablement>
-            <instanceof
-                  value="org.eclipse.core.resources.IFile">
-            </instanceof>
-         </enablement>
-      </actionProvider>
-            <actionProvider
-            class="org.eclipse.ui.tests.navigator.extension.TestOverrideableActionProvider"
-            id="org.eclipse.ui.tests.navigator.extension.TestOverridINGActionProvider2"
-            overrides="org.eclipse.ui.tests.navigator.extension.TestOverrideABLEActionProvider"
-            priority="higher">
-         <enablement>
-         	<and>
-            	<instanceof
-                 	value="org.eclipse.core.resources.IFile" />
-                <test property="org.eclipse.core.resources.extension" value="txt"/>
-            </and> 
-         </enablement>
-      </actionProvider>
-      <actionProvider
-            class="org.eclipse.ui.tests.navigator.extension.DependentActionProvider"
-            id="org.eclipse.ui.tests.navigator.extension.TestOverridINGAndDependentActionProvider1"
-            overrides="org.eclipse.ui.tests.navigator.extension.TestOverrideABLEActionProvider"
-            dependsOn="org.eclipse.ui.tests.navigator.extension.TestActionProvider"
-            priority="high">
-         <enablement>
-            <instanceof
-                  value="org.eclipse.core.resources.IFolder">
-            </instanceof>
-         </enablement>
-      </actionProvider>
-      <navigatorContent 
-            id="org.eclipse.ui.tests.navigator.testHasChildren" 
-            name="Dat File Content Extension"
-            contentProvider="org.eclipse.ui.tests.navigator.extension.DatContentProvider"
-            labelProvider="org.eclipse.ui.tests.navigator.extension.TestLabelProviderBlue"
-            activeByDefault="true"
-            priority="lower">
-         <triggerPoints>
-            <or> 
-            	<and>
-					<instanceof value="org.eclipse.core.resources.IFile" />
-                <test property="org.eclipse.core.resources.extension" value="dat"/>
-				</and>
-			</or> 
-         </triggerPoints> 
-         <possibleChildren> 
-         </possibleChildren> 
-	  </navigatorContent>      
-      <navigatorContent 
-            id="org.eclipse.ui.tests.navigator.testOverriddenContent1" 
-            name="Test Content 1"
-            contentProvider="org.eclipse.ui.internal.navigator.resources.workbench.ResourceExtensionContentProvider"
-            labelProvider="org.eclipse.ui.tests.navigator.extension.TestLabelProviderRed"
-            priority="lower">
-         <enablement>
-            <instanceof
-                  value="org.eclipse.core.resources.IResource">
-            </instanceof>
-         </enablement>
-	  </navigatorContent>      
-      <navigatorContent 
-            id="org.eclipse.ui.tests.navigator.testOverriddenContent2" 
-            name="Test Content 2"
-            contentProvider="org.eclipse.ui.internal.navigator.resources.workbench.ResourceExtensionContentProvider"
-            labelProvider="org.eclipse.ui.tests.navigator.extension.TestLabelProviderBlue"
-            priority="lower">
-         <enablement>
-            <instanceof
-                  value="org.eclipse.core.resources.IResource">
-            </instanceof>
-         </enablement>
-	  </navigatorContent>      
-      <navigatorContent 
-            id="org.eclipse.ui.tests.navigator.testOverride1" 
-            name="Override 1"
-            contentProvider="org.eclipse.ui.internal.navigator.resources.workbench.ResourceExtensionContentProvider"
-            labelProvider="org.eclipse.ui.tests.navigator.extension.TestLabelProviderGreen"
-            priority="lower">
-         <enablement>
-            <instanceof
-                  value="org.eclipse.core.resources.IResource">
-            </instanceof>
-         </enablement>
-		<override suppressedExtensionId="org.eclipse.ui.tests.navigator.testOverriddenContent1"/>
-	  </navigatorContent>      
-      <navigatorContent 
-            id="org.eclipse.ui.tests.navigator.testOverride2" 
-            name="Override 2"
-            contentProvider="org.eclipse.ui.internal.navigator.resources.workbench.ResourceExtensionContentProvider"
-            labelProvider="org.eclipse.ui.tests.navigator.extension.TestLabelProviderCyan"
-            priority="lower">
-         <enablement>
-            <instanceof
-                  value="org.eclipse.core.resources.IResource">
-            </instanceof>
-         </enablement>
-		<override suppressedExtensionId="org.eclipse.ui.tests.navigator.testOverriddenContent2"/>
-	  </navigatorContent>      
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.navigator.viewer">
-      <viewer
-            popupMenuId="org.eclipse.ui.tests.navigator.TestView#PopupMenu"
-            viewerId="org.eclipse.ui.tests.navigator.TestView">
-         <options>
-            <property
-                  name="org.eclipse.ui.navigator.hideLinkWithEditorAction"
-                  value="true"/> 
-            <property
-                  name="org.eclipse.ui.navigator.hideCollapseAllAction"
-                  value="true"/>  
-            <property
-                  name="org.eclipse.ui.navigator.enforceHasChildren"
-                  value="true"/> 
-         </options>
-      </viewer>
-      <viewerContentBinding viewerId="org.eclipse.ui.tests.navigator.TestView">
-         <includes>
-            <contentExtension pattern="org.eclipse.ui.tests.navigator.testContent"/>
-            <contentExtension pattern="org.eclipse.ui.tests.navigator.testHasChildren"/>            
-            <contentExtension pattern="org.eclipse.ui.navigator.resourceContent"/>
-            <contentExtension pattern="org.eclipse.ui.tests.navigator.filters.*"/> 
-            <!-- pick up the resource filters for free --> 
-            <contentExtension pattern="org.eclipse.ui.navigator.resources.filters.*"/>
-            <actionExtension
-                  pattern="org.eclipse.ui.tests.navigator.extension.*">
-            </actionExtension> 
-         </includes>
-      </viewerContentBinding>
-      
-      <!-- For testing -->
-      <viewerContentBinding viewerId="org.eclipse.ui.navigator.ProjectExplorer">
-         <includes>
-            <contentExtension pattern="org.eclipse.ui.tests.navigator.testContent"/> 
-            <contentExtension pattern="org.eclipse.ui.tests.navigator.filters.*"/> 
-         </includes>
-      </viewerContentBinding>
-      <viewerActionBinding viewerId="org.eclipse.ui.tests.navigator.TestView">
-         <includes>
-            <actionExtension pattern="org.eclipse.ui.tests.navigator.extension.*"/>
-            <actionExtension pattern="org.eclipse.ui.navigator.resources.PropertiesActionProvider"/>
-         </includes>
-      </viewerActionBinding>
-      <dragAssistant
-            class="org.eclipse.ui.navigator.resources.ResourceDragAdapterAssistant"
-            viewerId="org.eclipse.ui.tests.navigator.TestView"/>
-      <viewer
-            viewerId="org.eclipse.ui.tests.navigator.HideAvailableExtensionsTestView">
-         <options>
-            <property
-                  name="org.eclipse.ui.navigator.hideAvailableExtensionsTab"
-                  value="true"/>
-         </options>
-          <popupMenu
-                allowsPlatformContributions="true"
-                id="org.eclipse.ui.navigator.ProjectExplorer#PopupMenu"/>  
-      </viewer>
-      <viewerContentBinding viewerId="org.eclipse.ui.tests.navigator.HideAvailableExtensionsTestView">
-          <includes>
-       	      <contentExtension pattern="org.eclipse.ui.navigator.resourceContent" />		       	      
-	          <contentExtension pattern="org.eclipse.ui.navigator.resources.filters.*"/>
-           <contentExtension pattern="org.eclipse.ui.navigator.resources.linkHelper"/>
-           <contentExtension pattern="org.eclipse.ui.navigator.resources.workingSets"/>
-          </includes>
-      </viewerContentBinding>
-      <viewerActionBinding viewerId="org.eclipse.ui.tests.navigator.HideAvailableExtensionsTestView">
-         <includes>
-             <actionExtension pattern="org.eclipse.ui.navigator.resources.*" />
-         </includes>
-      </viewerActionBinding>
-      <viewer viewerId="org.eclipse.ui.tests.navigator.ProgrammaticTestView"/>      
-      <viewer viewerId="org.eclipse.ui.tests.navigator.PipelineTestView"/>      
-      <viewer viewerId="org.eclipse.ui.tests.navigator.OverrideTestView"/>      
-      <viewerContentBinding viewerId="org.eclipse.ui.tests.navigator.OverrideTestView">
-          <includes>
-       	      <contentExtension pattern="org.eclipse.ui.tests.navigator.testOverride1" />		       	      
-       	      <contentExtension pattern="org.eclipse.ui.tests.navigator.testOverriddenContent1" />		       	      
-          </includes>
-      </viewerContentBinding>
-   </extension>
- 
-   <extension
-         point="org.eclipse.core.runtime.adapters">
-      <factory
-            adaptableType="org.eclipse.ui.tests.navigator.extension.TestExtensionTreeData"
-            class="org.eclipse.ui.tests.navigator.extension.TestExtensionAdapterFactory">
-         <adapter type="org.eclipse.core.resources.IResource"/>
-         <adapter type="org.eclipse.core.resources.IFile"/>
-      </factory>
-   </extension>
-   
-   <!-- Verify decorator extension: Adds ">>" to Test Items that end in "3" --> 
-   <extension
-         point="org.eclipse.ui.decorators">
-      <decorator
-            class="org.eclipse.ui.tests.navigator.extension.TestLabelDecorator"
-            id="org.eclipse.ui.tests.navigator.threeDecorator"
-            label="Items that end in 3 decorator"
-            lightweight="false"
-            state="true">
-         <enablement>
-            <objectClass name="org.eclipse.ui.tests.navigator.extension.TestExtensionTreeData"/>
-         </enablement>
-      </decorator>
-   </extension>
-   <extension
-         point="org.eclipse.ui.activities">
-      <activityPatternBinding
-            activityId="org.eclipse.ui.tests.navigator.testActivity"
-            pattern="org\.eclipse\.ui\.tests\.navigator.*"/>
-      <activity
-            description="Common Navigator Test Activity"
-            id="org.eclipse.ui.tests.navigator.testActivity"
-            name="CN Test">
-      </activity>
-      <category
-            id="org.eclipse.ui.tests.navigator.category1"
-            name="CN Test Category">
-      </category>
-      <categoryActivityBinding
-            activityId="org.eclipse.ui.tests.navigator.testActivity"
-            categoryId="org.eclipse.ui.tests.navigator.category1">
-      </categoryActivityBinding> 
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.newWizards">
-      <wizard
-            class="org.eclipse.ui.tests.navigator.wizards.NewWizard1"
-            id="org.eclipse.ui.tests.navigator.SampleNewWizard"
-            name="Test CNF New Wizard1 (Does Nothing)"/>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.newWizards">
-      <wizard
-            class="org.eclipse.ui.tests.navigator.wizards.NewWizard1"
-            id="org.eclipse.ui.tests.navigator.SampleNewWizard2"
-            name="Test CNF New Wizard2 (Does Nothing)"/>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.importWizards">
-      <wizard
-            class="org.eclipse.ui.tests.navigator.wizards.ImportWizard1"
-            id="org.eclipse.ui.tests.navigator.SampleImportWizard"
-            name="Test CNF Import Wizard  (Does Nothing)"/>
-   </extension>
-  
-   <extension
-         point="org.eclipse.ui.exportWizards">
-      <wizard
-            class="org.eclipse.ui.tests.navigator.wizards.ExportWizard1"
-            id="org.eclipse.ui.tests.navigator.SampleExportWizard"
-            name="Test CNF Export Wizard  (Does Nothing)"/>
-   </extension>
-	<extension
-	      point="org.eclipse.ui.navigator.navigatorContent"> 
-      <commonWizard
-            associatedExtensionId="org.eclipse.ui.tests.navigator.testContent"
-            menuGroupId="org.eclipse.ui.tests.navigator"
-            type="import"
-            wizardId="org.eclipse.ui.tests.navigator.SampleImportWizard">
-         <enablement>
-            <or>
-				<instanceof value="org.eclipse.ui.tests.navigator.extension.TestExtensionTreeData"/>
-				<instanceof value="org.eclipse.core.resources.IResource" />
-			</or>         
-         </enablement>
-      </commonWizard>
-      <commonWizard
-            associatedExtensionId="org.eclipse.ui.tests.navigator.testContent"
-            menuGroupId="org.eclipse.ui.tests.navigator"
-            type="export"
-            wizardId="org.eclipse.ui.tests.navigator.SampleExportWizard">
-         <enablement>
-            <or>
-				<instanceof value="org.eclipse.ui.tests.navigator.extension.TestExtensionTreeData"/>
-				<instanceof value="org.eclipse.core.resources.IResource" />
-			</or>         
-         </enablement>
-      </commonWizard>
-      <commonWizard
-            associatedExtensionId="org.eclipse.ui.tests.navigator.testContent"
-            menuGroupId="org.eclipse.ui.tests.navigator"
-            type="new"
-            wizardId="org.eclipse.ui.tests.navigator.SampleNewWizard">  
-         <enablement>
-            <or>
-				<instanceof value="org.eclipse.ui.tests.navigator.extension.TestExtensionTreeData"/>
-				<instanceof value="org.eclipse.core.resources.IResource" />
-			</or>         
-         </enablement>            
-      </commonWizard>
-      <commonWizard
-            associatedExtensionId="org.eclipse.NotFound"
-            menuGroupId="org.eclipse.ui.tests.navigator"
-            type="new"
-            wizardId="org.eclipse.ui.tests.navigator.SampleNewWizard2">  
-         <enablement>
-            <or>
-				<instanceof value="org.eclipse.ui.tests.navigator.extension.TestExtensionTreeData"/>
-				<instanceof value="org.eclipse.core.resources.IResource" />
-			</or>         
-         </enablement>            
-      </commonWizard>
-   </extension> 
-</plugin>
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/ActivityTest.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/ActivityTest.java
deleted file mode 100644
index a66f268..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/ActivityTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oakland Software Incorporated and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oakland Software Incorporated - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.activities.IWorkbenchActivitySupport;
-import org.eclipse.ui.navigator.resources.ProjectExplorer;
-
-public class ActivityTest extends NavigatorTestBase {
-
-	public ActivityTest() {
-		_navigatorInstanceId = ProjectExplorer.VIEW_ID;
-	}
-
-	protected static final String ACTIVITY = "org.eclipse.ui.tests.navigator.testActivity";
-
-	protected boolean verifyMenu(IStructuredSelection sel, String item) {
-		MenuManager mm = new MenuManager();
-		_actionService.setContext(new ActionContext(sel));
-		_actionService.fillContextMenu(mm);
-
-		IContributionItem[] items = mm.getItems();
-
-		MenuManager newMm = (MenuManager) items[1];
-
-		items = newMm.getItems();
-		// Get the new Menu
-		for (int i = 0; i < items.length; i++) {
-			if (items[i] instanceof ActionContributionItem) {
-				ActionContributionItem aci = (ActionContributionItem) items[i];
-				if (aci.getAction().getText().startsWith(item))
-					return true;
-				if (false)
-					System.out.println("action text: " + aci.getAction().getText());
-			}
-		}
-
-		return false;
-	}
-
-	// Bug 217801 make sure category filtering works with common wizards
-	public void testCategoryWizard() throws Exception {
-
-		IStructuredSelection sel = new StructuredSelection(project);
-		viewer.setSelection(sel);
-
-		IWorkbenchActivitySupport actSupport = PlatformUI.getWorkbench().getActivitySupport();
-
-		assertFalse(verifyMenu(sel, "Test CNF"));
-
-		Set ids = new HashSet();
-		ids = actSupport.getActivityManager().getEnabledActivityIds();
-
-		//System.out.println("enabled before: " + ids);
-
-		Set newIds = new HashSet();
-		newIds.addAll(ids);
-		newIds.add(ACTIVITY);
-		actSupport.setEnabledActivityIds(newIds);
-
-		ids = actSupport.getActivityManager().getEnabledActivityIds();
-		//System.out.println("enabled now: " + ids);
-
-		assertTrue(verifyMenu(sel, "Test CNF"));
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/CreateProjectTest.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/CreateProjectTest.java
deleted file mode 100644
index c11cddb..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/CreateProjectTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 webtekie@gmail.com
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     webtekie@gmail.com - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import java.io.ByteArrayInputStream;
-import java.text.DecimalFormat;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.navigator.CommonNavigator;
-
-/**
- * A test to see if created projects are reflected in Project Explorer
- * 
- * @author akravets
- * 
- */
-public class CreateProjectTest extends TestCase {
-
-	private static final int NUM_OF_PROJECTS = 300; // number of projects to
-
-	// created
-
-	public void testCreateMultipleProjects() throws Exception {
-		CommonNavigator view = null;
-		try {
-			// initialize Project Explorer view and assign in it to view
-			// variable
-			PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-					.getActivePage().showView(
-							"org.eclipse.ui.navigator.ProjectExplorer");
-			IViewReference[] viewReferences = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow().getActivePage()
-					.getViewReferences();
-			for (int j = 0; j < viewReferences.length; j++) {
-				if (viewReferences[j].getId().equals(
-						"org.eclipse.ui.navigator.ProjectExplorer")) {
-					view = (CommonNavigator) viewReferences[j].getView(true);
-				}
-			}
-		} catch (PartInitException e1) {
-			fail("Couldn't not initialize CommonNavigator");
-		}
-
-		Job createJob = new Job("Create projects") {
-
-			protected IStatus run(IProgressMonitor monitor) {
-				try {
-					DecimalFormat df = new DecimalFormat("000");
-					for (int i = 0; i < NUM_OF_PROJECTS; i++) {
-						String name = df.format(i);
-						IProject p1 = ResourcesPlugin.getWorkspace().getRoot()
-								.getProject("p" + name);
-						p1.create(null);
-						p1.open(null);
-						IFile f1 = p1.getFile("f" + name);
-						f1.create(new ByteArrayInputStream(new byte[] {}),
-								true, null);
-					}
-				} catch (Exception ex) {
-					ex.printStackTrace();
-					fail("Unexpected exception: " + ex);
-				}
-				return Status.OK_STATUS;
-			}
-		};
-
-		createJob.schedule();
-		createJob.join();
-		
-		assertEquals(createJob.getResult(), Status.OK_STATUS);
-
-		DisplayHelper.runEventLoop(Display.getCurrent(), 10);
-		
-		int numOfProjects = view.getCommonViewer().getTree().getItemCount();
-		System.out.println("Projects created: " + numOfProjects);
-
-		if (false)
-			DisplayHelper.sleep(Display.getCurrent(), 10000000);
-
-		// as a test compare number of created projects with NUM_OF_PROJECTS
-		// constant
-		assertEquals(NUM_OF_PROJECTS, numOfProjects);
-
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/DisplayHelper.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/DisplayHelper.java
deleted file mode 100644
index fc9959b..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/DisplayHelper.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Runs the event loop of the given display until {@link #condition()} becomes
- * <code>true</code> or no events have occurred for the supplied timeout.
- * Between running the event loop, {@link Display#sleep()} is called.
- * <p>
- * There is a caveat: the given timeouts must be long enough that the calling
- * thread can enter <code>Display.sleep()</code> before the timeout elapses,
- * otherwise, the waiter may time out before <code>sleep</code> is called and
- * the sleeping thread may never be waken up.
- * </p>
- * 
- * @since 3.1
- */
-public abstract class DisplayHelper {
-	/**
-	 * Creates a new instance.
-	 */
-	protected DisplayHelper() {
-	}
-	
-	/**
-	 * Until {@link #condition()} becomes <code>true</code> or the timeout
-	 * elapses, call {@link Display#sleep()} and run the event loop.
-	 * <p>
-	 * If <code>timeout &lt; 0</code>, the event loop is never driven and
-	 * only the condition is checked. If <code>timeout == 0</code>, the event
-	 * loop is driven at most once, but <code>Display.sleep()</code> is never
-	 * invoked.
-	 * </p>
-	 * 
-	 * @param display the display to run the event loop of
-	 * @param timeout the timeout in milliseconds
-	 * @return <code>true</code> if the condition became <code>true</code>,
-	 *         <code>false</code> if the timeout elapsed
-	 */
-	public final boolean waitForCondition(Display display, long timeout) {
-		// if the condition already holds, succeed
-		if (condition())
-			return true;
-		
-		if (timeout < 0)
-			return false;
-		
-		// if driving the event loop once makes the condition hold, succeed
-		// without spawning a thread.
-		driveEventQueue(display);
-		if (condition())
-			return true;
-		
-		// if the timeout is negative or zero, fail
-		if (timeout == 0)
-			return false;
-
-		// repeatedly sleep until condition becomes true or timeout elapses
-		DisplayWaiter waiter= new DisplayWaiter(display);
-		DisplayWaiter.Timeout timeoutState= waiter.start(timeout);
-		boolean condition;
-		try {
-			do {
-				if (display.sleep())
-					driveEventQueue(display);
-				condition= condition();
-			} while (!condition && !timeoutState.hasTimedOut());
-		} finally {
-			waiter.stop();
-		}
-		return condition;
-	}
-	
-	/**
-	 * Call {@link Display#sleep()} and run the event loop until the given
-	 * timeout has elapsed.
-	 * <p>
-	 * If <code>timeout &lt; 0</code>, nothing happens. If
-	 * <code>timeout == 0</code>, the event loop is driven exactly once, but
-	 * <code>Display.sleep()</code> is never invoked.
-	 * </p>
-	 * 
-	 * @param display the display to run the event loop of
-	 * @param millis the timeout in milliseconds
-	 */
-	public static void sleep(Display display, long millis) {
-		new DisplayHelper() {
-			public boolean condition() {
-				return false;
-			}
-		}.waitForCondition(display, millis);
-	}
-	
-	/**
-	 * Call {@link Display#sleep()} and run the event loop once if
-	 * <code>sleep</code> returns before the timeout elapses. Returns
-	 * <code>true</code> if any events were processed, <code>false</code> if
-	 * not.
-	 * <p>
-	 * If <code>timeout &lt; 0</code>, nothing happens and false is returned.
-	 * If <code>timeout == 0</code>, the event loop is driven exactly once,
-	 * but <code>Display.sleep()</code> is never invoked.
-	 * </p>
-	 * 
-	 * @param display the display to run the event loop of
-	 * @param timeout the timeout in milliseconds
-	 * @return <code>true</code> if any event was taken off the event queue,
-	 *         <code>false</code> if not
-	 */
-	public static boolean runEventLoop(Display display, long timeout) {
-		if (timeout < 0)
-			return false;
-		
-		if (timeout == 0)
-			return driveEventQueue(display);
-		
-		// repeatedly sleep until condition becomes true or timeout elapses
-		DisplayWaiter waiter= new DisplayWaiter(display);
-		DisplayWaiter.Timeout timeoutState= waiter.start(timeout);
-		boolean events= false;
-		if (display.sleep() && !timeoutState.hasTimedOut()) {
-			driveEventQueue(display);
-			events= true;
-		}
-		waiter.stop();
-		return events;
-	}
-	
-	/**
-	 * The condition which has to be met in order for
-	 * {@link #waitForCondition(Display, int)} to return before the timeout
-	 * elapses.
-	 * 
-	 * @return <code>true</code> if the condition is met, <code>false</code>
-	 *         if the event loop should be driven some more
-	 */
-	protected abstract boolean condition();
-
-	/**
-	 * Runs the event loop on the given display.
-	 * 
-	 * @param display the display
-	 * @return if <code>display.readAndDispatch</code> returned
-	 *         <code>true</code> at least once
-	 */
-	private static boolean driveEventQueue(Display display) {
-		boolean events= false;
-		while (display.readAndDispatch()) {
-			events= true;
-		}
-		return events;
-	}
-
-	/**
-	 * Until {@link #condition()} becomes <code>true</code> or the timeout
-	 * elapses, call {@link Display#sleep()} and run the event loop.
-	 * <p>
-	 * If <code>timeout &lt; 0</code>, the event loop is never driven and
-	 * only the condition is checked. If <code>timeout == 0</code>, the event
-	 * loop is driven at most once, but <code>Display.sleep()</code> is never
-	 * invoked.
-	 * </p>
-	 * <p>
-	 * The condition gets rechecked every <code>interval</code> milliseconds, even
-	 * if no events were read from the queue.
-	 * </p>
-	 * 
-	 * @param display the display to run the event loop of
-	 * @param timeout the timeout in milliseconds
-	 * @param interval the interval to re-check the condition in milliseconds
-	 * @return <code>true</code> if the condition became <code>true</code>,
-	 *         <code>false</code> if the timeout elapsed
-	 */
-	public final boolean waitForCondition(Display display, long timeout, long interval) {
-		// if the condition already holds, succeed
-		if (condition())
-			return true;
-		
-		if (timeout < 0)
-			return false;
-		
-		// if driving the event loop once makes the condition hold, succeed
-		// without spawning a thread.
-		driveEventQueue(display);
-		if (condition())
-			return true;
-		
-		// if the timeout is negative or zero, fail
-		if (timeout == 0)
-			return false;
-	
-		// repeatedly sleep until condition becomes true or timeout elapses
-		DisplayWaiter waiter= new DisplayWaiter(display, true);
-		long currentTimeMillis= System.currentTimeMillis();
-		long finalTimeout= timeout + currentTimeMillis;
-		if (finalTimeout < currentTimeMillis)
-			finalTimeout= Long.MAX_VALUE;
-		boolean condition;
-		try {
-			do {
-				waiter.restart(interval);
-				if (display.sleep())
-					driveEventQueue(display);
-				condition= condition();
-			} while (!condition && finalTimeout > System.currentTimeMillis());
-		} finally {
-			waiter.stop();
-		}
-		return condition;
-	}
-
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/DisplayWaiter.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/DisplayWaiter.java
deleted file mode 100644
index 3517ad6..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/DisplayWaiter.java
+++ /dev/null
@@ -1,410 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import junit.framework.Assert;
-
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Implements the thread that will wait for the timeout and wake up the display
- * so it does not wait forever. The thread may be restarted after it was stopped
- * or timed out.
- * 
- * @since 3.1
- */
-final class DisplayWaiter {
-	/**
-	 * Timeout state of a display waiter thread.
-	 */
-	public final class Timeout {
-		boolean fTimeoutState= false;
-		/**
-		 * Returns <code>true</code> if the timeout has been reached,
-		 * <code>false</code> if not.
-		 * 
-		 * @return <code>true</code> if the timeout has been reached,
-		 *         <code>false</code> if not
-		 */
-		public boolean hasTimedOut() {
-			synchronized (fMutex) {
-				return fTimeoutState;
-			}
-		}
-		void setTimedOut(boolean timedOut) {
-			fTimeoutState= timedOut;
-		}
-		Timeout(boolean initialState) {
-			fTimeoutState= initialState;
-		}
-	}
-	
-	// configuration
-	private final Display fDisplay;
-	private final Object fMutex= new Object();
-	private final boolean fKeepRunningOnTimeout;
-	
-	/* State -- possible transitions:
-	 * 
-	 * STOPPED   -> RUNNING
-	 * RUNNING   -> STOPPED
-	 * RUNNING   -> IDLE
-	 * IDLE      -> RUNNING
-	 * IDLE      -> STOPPED
-	 */
-	private static final int RUNNING= 1 << 1;
-	private static final int STOPPED= 1 << 2;
-	private static final int IDLE= 1 << 3;
-	
-	/** The current state. */
-	private int fState;
-	/** The time in milliseconds (see Date) that the timeout will occur. */
-	private long fNextTimeout;
-	/** The thread. */
-	private Thread fCurrentThread;
-	/** The timeout state of the current thread. */
-	private Timeout fCurrentTimeoutState;
-
-	/**
-	 * Creates a new instance on the given display and timeout.
-	 * 
-	 * @param display the display to run the event loop of
-	 */
-	public DisplayWaiter(Display display) {
-		this(display, false);
-	}
-	
-	/**
-	 * Creates a new instance on the given display and timeout.
-	 * 
-	 * @param display the display to run the event loop of
-	 * @param keepRunning <code>true</code> if the thread should be kept
-	 *        running after timing out
-	 */
-	public DisplayWaiter(Display display, boolean keepRunning) {
-		Assert.assertNotNull(display);
-		fDisplay= display;
-		fState= STOPPED;
-		fKeepRunningOnTimeout= keepRunning;
-	}
-	
-	/**
-	 * Starts the timeout thread if it is not currently running. Nothing happens
-	 * if a thread is already running.
-	 * 
-	 * @param delay the delay from now in milliseconds
-	 * @return the timeout state which can be queried for its timed out status
-	 */
-	public Timeout start(long delay) {
-		Assert.assertTrue(delay > 0);
-		synchronized (fMutex) {
-			switch (fState) {
-				case STOPPED:
-					startThread();
-					setNextTimeout(delay);
-					break;
-				case IDLE:
-					unhold();
-					setNextTimeout(delay);
-					break;
-			}
-			
-			return fCurrentTimeoutState;
-		}
-	}
-
-	/**
-	 * Sets the next timeout to <em>current time</em> plus <code>delay</code>.
-	 * 
-	 * @param delay the delay until the next timeout occurs in milliseconds from
-	 *        now
-	 */
-	private void setNextTimeout(long delay) {
-		long currentTimeMillis= System.currentTimeMillis();
-		long next= currentTimeMillis + delay;
-		if (next > currentTimeMillis)
-			fNextTimeout= next;
-		else
-			fNextTimeout= Long.MAX_VALUE;
-	}
-	
-	/**
-	 * Starts the thread if it is not currently running; resets the timeout if
-	 * it is.
-	 * 
-	 * @param delay the delay from now in milliseconds
-	 * @return the timeout state which can be queried for its timed out status
-	 */
-	public Timeout restart(long delay) {
-		Assert.assertTrue(delay > 0);
-		synchronized (fMutex) {
-			switch (fState) {
-				case STOPPED:
-					startThread();
-					break;
-				case IDLE:
-					unhold();
-					break;
-			}
-			setNextTimeout(delay);
-
-			return fCurrentTimeoutState;
-		}
-	}
-
-	/**
-	 * Stops the thread if it is running. If not, nothing happens. Another
-	 * thread may be started by calling {@link #start(long)} or
-	 * {@link #restart(long)}.
-	 */
-	public void stop() {
-		synchronized (fMutex) {
-			if (tryTransition(RUNNING | IDLE, STOPPED))
-				fMutex.notifyAll();
-		}
-	}
-	
-	/**
-	 * Puts the reaper thread on hold but does not stop it. It may be restarted
-	 * by calling {@link #start(long)} or {@link #restart(long)}.
-	 */
-	public void hold() {
-		synchronized (fMutex) {
-			// nothing to do if there is no thread
-			if (tryTransition(RUNNING, IDLE))
-				fMutex.notifyAll();
-		}
-	}
-
-	/**
-	 * Transition to <code>RUNNING</code> and clear the timed out flag. Assume
-	 * current state is <code>IDLE</code>.
-	 */
-	private void unhold() {
-		checkedTransition(IDLE, RUNNING);
-		fCurrentTimeoutState= new Timeout(false);
-		fMutex.notifyAll();
-	}
-		
-	/**
-	 * Start the thread. Assume the current state is <code>STOPPED</code>.
-	 */
-	private void startThread() {
-		checkedTransition(STOPPED, RUNNING);
-		fCurrentTimeoutState= new Timeout(false);
-		fCurrentThread= new Thread() {
-			/**
-			 * Exception thrown when a thread notices that it has been stopped
-			 * and a new thread has been started.
-			 */
-			final class ThreadChangedException extends Exception {
-				private static final long serialVersionUID= 1L;
-			}
-
-			/*
-			 * @see java.lang.Runnable#run()
-			 */
-			public void run() {
-				try {
-					run2();
-				} catch (InterruptedException e) {
-					// ignore and end the thread - we never interrupt ourselves,
-					// so it must be an external entity that interrupted us
-					Logger.global.log(Level.FINE, "", e); //$NON-NLS-1$
-				} catch (ThreadChangedException e) {
-					// the thread was stopped and restarted before we got out
-					// of a wait - we're no longer used
-					// we might have been notified instead of the current thread,
-					// so wake it up
-					Logger.global.log(Level.FINE, "", e); //$NON-NLS-1$
-					synchronized (fMutex) {
-						fMutex.notifyAll();
-					}
-				}
-			}
-			
-			/**
-			 * Runs the thread.
-			 * 
-			 * @throws InterruptedException if the thread was interrupted
-			 * @throws ThreadChangedException if the thread changed
-			 */
-			private void run2() throws InterruptedException, ThreadChangedException {
-				synchronized (fMutex) {
-					checkThread();
-					tryHold(); // wait / potential state change
-					assertStates(STOPPED | RUNNING);
-					
-					while (isState(RUNNING)) {
-						waitForTimeout(); // wait / potential state change
-						
-						if (isState(RUNNING))
-							timedOut(); // state change
-						assertStates(STOPPED | IDLE);
-						
-						tryHold(); // wait / potential state change
-						assertStates(STOPPED | RUNNING);
-					}
-					assertStates(STOPPED);
-				}
-			}
-
-			/**
-			 * Check whether the current thread is this thread, throw an
-			 * exception otherwise.
-			 * 
-			 * @throws ThreadChangedException if the current thread changed
-			 */
-			private void checkThread() throws ThreadChangedException {
-				if (fCurrentThread != this)
-					throw new ThreadChangedException();
-			}
-
-			/**
-			 * Waits until the next timeout occurs.
-			 * 
-			 * @throws InterruptedException if the thread was interrupted
-			 * @throws ThreadChangedException if the thread changed
-			 */
-			private void waitForTimeout() throws InterruptedException, ThreadChangedException {
-				long delta;
-				while (isState(RUNNING) && (delta = fNextTimeout - System.currentTimeMillis()) > 0) {
-					delta= Math.max(delta, 50); // wait at least 50ms in order to avoid timing out before the display is going to sleep
-					Logger.global.finest("sleeping for " + delta + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
-					fMutex.wait(delta);
-					checkThread();
-				}
-			}
-
-			/**
-			 * Sets the timed out flag and wakes up the display. Transitions to
-			 * <code>IDLE</code> (if in keep-running mode) or
-			 * <code>STOPPED</code>.
-			 */
-			private void timedOut() {
-				Logger.global.finer("timed out"); //$NON-NLS-1$
-				fCurrentTimeoutState.setTimedOut(true);
-				fDisplay.wake(); // wake up call!
-				if (fKeepRunningOnTimeout)
-					checkedTransition(RUNNING, IDLE);
-				else
-					checkedTransition(RUNNING, STOPPED);
-			}
-			
-			/**
-			 * Waits while the state is <code>IDLE</code>, then returns. The
-			 * state must not be <code>RUNNING</code> when calling this
-			 * method. The state is either <code>STOPPED</code> or
-			 * <code>RUNNING</code> when the method returns.
-			 * 
-			 * @throws InterruptedException if the thread was interrupted
-			 * @throws ThreadChangedException if the thread has changed while on
-			 *         hold
-			 */
-			private void tryHold() throws InterruptedException, ThreadChangedException {
-				while (isState(IDLE)) {
-					fMutex.wait(0);
-					checkThread();
-				}
-				assertStates(STOPPED | RUNNING);
-			}
-		};
-		
-		fCurrentThread.start();
-	}
-	
-	/**
-	 * Transitions to <code>nextState</code> if the current state is one of
-	 * <code>possibleStates</code>. Returns <code>true</code> if the
-	 * transition happened, <code>false</code> otherwise.
-	 * 
-	 * @param possibleStates the states which trigger a transition
-	 * @param nextState the state to transition to
-	 * @return <code>true</code> if the transition happened,
-	 *         <code>false</code> otherwise
-	 */
-	private boolean tryTransition(int possibleStates, int nextState) {
-		if (isState(possibleStates)) {
-			Logger.global.finer(name(fState) + " > " + name(nextState) + " (" + name(possibleStates) + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			fState= nextState;
-			return true;
-		}
-		Logger.global.finest("noTransition" + name(fState) + " !> " + name(nextState) + " (" + name(possibleStates) + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		return false;
-	}
-	
-	/**
-	 * Checks the <code>possibleStates</code> and throws an assertion if it is
-	 * not met, then transitions to <code>nextState</code>.
-	 * 
-	 * @param possibleStates the allowed states
-	 * @param nextState the state to transition to
-	 */
-	private void checkedTransition(int possibleStates, int nextState) {
-		assertStates(possibleStates);
-		Logger.global.finer(name(fState) + " > " + name(nextState)); //$NON-NLS-1$
-		fState= nextState;
-	}
-	
-	/**
-	 * Implements state consistency checking.
-	 * 
-	 * @param states the allowed states
-	 * @throws junit.framework.AssertionFailedError if the current state is not
-	 *         in <code>states</code>
-	 */
-	private void assertStates(int states) {
-		Assert.assertTrue("illegal state", isState(states)); //$NON-NLS-1$
-	}
-
-	/**
-	 * Answers <code>true</code> if the current state is in the given
-	 * <code>states</code>.
-	 * 
-	 * @param states the possible states
-	 * @return <code>true</code> if the current state is in the given states,
-	 *         <code>false</code> otherwise
-	 */
-	private boolean isState(int states) {
-		return (states & fState) == fState;
-	}
-	
-	/**
-	 * Pretty print the given states.
-	 * 
-	 * @param states the states
-	 * @return a string representation of the states
-	 */
-	private String name(int states) {
-		StringBuffer buf= new StringBuffer();
-		boolean comma= false;
-		if ((states & RUNNING) == RUNNING) {
-			buf.append("RUNNING"); //$NON-NLS-1$
-			comma= true;
-		}
-		if ((states & STOPPED) == STOPPED) {
-			if (comma)
-				buf.append(","); //$NON-NLS-1$
-			buf.append("STOPPED"); //$NON-NLS-1$
-			comma= true;
-		}
-		if ((states & IDLE) == IDLE) {
-			if (comma)
-				buf.append(","); //$NON-NLS-1$
-			buf.append("IDLE"); //$NON-NLS-1$
-		}
-		return buf.toString();
-	}
-
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/EditorTestHelper.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/EditorTestHelper.java
deleted file mode 100644
index 2870ee1..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/EditorTestHelper.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Logger;
-
-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.jobs.IJobManager;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-
-
-/**
- * @since 3.1
- */
-public class EditorTestHelper {
-	
- 
-	
-	public static final String TEXT_EDITOR_ID= "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$
-	
-	public static final String COMPILATION_UNIT_EDITOR_ID= "org.eclipse.jdt.ui.CompilationUnitEditor"; //$NON-NLS-1$
-	
-	public static final String RESOURCE_PERSPECTIVE_ID= "org.eclipse.ui.resourcePerspective"; //$NON-NLS-1$
-	
-	public static final String JAVA_PERSPECTIVE_ID= "org.eclipse.jdt.ui.JavaPerspective"; //$NON-NLS-1$
-	
-	public static final String OUTLINE_VIEW_ID= "org.eclipse.ui.views.ContentOutline"; //$NON-NLS-1$
-	
-	public static final String PACKAGE_EXPLORER_VIEW_ID= "org.eclipse.jdt.ui.PackageExplorer"; //$NON-NLS-1$
-	
-	public static final String NAVIGATOR_VIEW_ID= "org.eclipse.ui.views.ResourceNavigator"; //$NON-NLS-1$
-	
-	public static final String INTRO_VIEW_ID= "org.eclipse.ui.internal.introview"; //$NON-NLS-1$
-  
-	public static void closeEditor(IEditorPart editor) {
-		IWorkbenchPartSite site;
-		IWorkbenchPage page;
-		if (editor != null && (site= editor.getSite()) != null && (page= site.getPage()) != null)
-			page.closeEditor(editor, false);
-	}
-	
-	public static void closeAllEditors() {
-		IWorkbenchWindow[] windows= PlatformUI.getWorkbench().getWorkbenchWindows();
-		for (int i= 0; i < windows.length; i++) {
-			IWorkbenchPage[] pages= windows[i].getPages();
-			for (int j= 0; j < pages.length; j++) {
-				IEditorReference[] editorReferences= pages[j].getEditorReferences();
-				for (int k= 0; k < editorReferences.length; k++)
-					closeEditor(editorReferences[k].getEditor(false));
-			}
-		}
-	}
-	
-	/**
-	 * Runs the event queue on the current display until it is empty.
-	 */
-	public static void runEventQueue() {
-		IWorkbenchWindow window= getActiveWorkbenchWindow();
-		if (window != null)
-			runEventQueue(window.getShell());
-	}
-	
-	public static void runEventQueue(IWorkbenchPart part) {
-		runEventQueue(part.getSite().getShell());
-	}
-	
-	public static void runEventQueue(Shell shell) {
-		runEventQueue(shell.getDisplay());
-	}
-	
-	public static void runEventQueue(Display display) {
-		while (display.readAndDispatch()) {
-			// do nothing
-		}
-	}
-	
-	/**
-	 * Runs the event queue on the current display and lets it sleep until the
-	 * timeout elapses.
-	 * 
-	 * @param millis the timeout in milliseconds
-	 */
-	public static void runEventQueue(long millis) {
-		runEventQueue(getActiveDisplay(), millis);
-	}
-	
-	public static void runEventQueue(IWorkbenchPart part, long millis) {
-		runEventQueue(part.getSite().getShell(), millis);
-	}
-	
-	public static void runEventQueue(Shell shell, long millis) {
-		runEventQueue(shell.getDisplay(), millis);
-	}
-	
-	public static void runEventQueue(Display display, long minTime) {
-		if (display != null) {
-			DisplayHelper.sleep(display, minTime);
-		} else {
-			sleep((int) minTime);
-		}
-	}
-	
-	public static IWorkbenchWindow getActiveWorkbenchWindow() {
-		return PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-	}
-	
-	public static void forceFocus() {
-		IWorkbenchWindow window= getActiveWorkbenchWindow();
-		if (window == null) {
-			IWorkbenchWindow[] wbWindows= PlatformUI.getWorkbench().getWorkbenchWindows();
-			if (wbWindows.length == 0)
-				return;
-			window= wbWindows[0];
-		}
-		Shell shell= window.getShell();
-		if (shell != null && !shell.isDisposed()) {
-			shell.forceActive();
-			shell.forceFocus();
-		}
-	}
-	
-	public static IWorkbenchPage getActivePage() {
-		IWorkbenchWindow window= getActiveWorkbenchWindow();
-		return window != null ? window.getActivePage() : null;
-	}
-	
-	public static Display getActiveDisplay() {
-		IWorkbenchWindow window= getActiveWorkbenchWindow();
-		return window != null ? window.getShell().getDisplay() : null;
-	} 
-	
-	public static void joinBackgroundActivities() throws CoreException {
-		// Join Building
-		Logger.global.entering("EditorTestHelper", "joinBackgroundActivities"); //$NON-NLS-1$ //$NON-NLS-2$
-		Logger.global.finer("join builder"); //$NON-NLS-1$
-		boolean interrupted= true;
-		while (interrupted) {
-			try {
-				Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, null);
-				interrupted= false;
-			} catch (InterruptedException e) {
-				interrupted= true;
-			}
-		} 
-		// Join jobs
-		joinJobs(0, 0, 500);
-		Logger.global.exiting("EditorTestHelper", "joinBackgroundActivities"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-	public static boolean joinJobs(long minTime, long maxTime, long intervalTime) {
-		Logger.global.entering("EditorTestHelper", "joinJobs"); //$NON-NLS-1$ //$NON-NLS-2$
-		runEventQueue(minTime);
-		
-		DisplayHelper helper= new DisplayHelper() {
-			public boolean condition() {
-				return allJobsQuiet();
-			}
-		};
-		boolean quiet= helper.waitForCondition(getActiveDisplay(), maxTime > 0 ? maxTime : Long.MAX_VALUE, intervalTime);
-		Logger.global.exiting("EditorTestHelper", "joinJobs", new Boolean(quiet)); //$NON-NLS-1$ //$NON-NLS-2$
-		return quiet;
-	}
-	
-	public static void sleep(int intervalTime) {
-		try {
-			Thread.sleep(intervalTime);
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-	
-	public static boolean allJobsQuiet() {
-		IJobManager jobManager= Job.getJobManager();
-		Job[] jobs= jobManager.find(null);
-		for (int i= 0; i < jobs.length; i++) {
-			Job job= jobs[i];
-			int state= job.getState();
-			if (state == Job.RUNNING || state == Job.WAITING) {
-				Logger.global.finest(job.getName());
-				return false;
-			}
-		}
-		return true;
-	}
-	
-	public static boolean isViewShown(String viewId) {
-		return getActivePage().findViewReference(viewId) != null;
-	}
-	
-	public static boolean showView(String viewId, boolean show) throws PartInitException {
-		IWorkbenchPage activePage= getActivePage();
-		IViewReference view= activePage.findViewReference(viewId);
-		boolean shown= view != null;
-		if (shown != show)
-			if (show)
-				activePage.showView(viewId);
-			else
-				activePage.hideView(view);
-		return shown;
-	}
-	
-	public static void bringToTop() {
-		getActiveWorkbenchWindow().getShell().forceActive();
-	} 
-	
-	public static String showPerspective(String perspective) throws WorkbenchException {
-		String shownPerspective= getActivePage().getPerspective().getId();
-		if (!perspective.equals(shownPerspective)) {
-			IWorkbench workbench= PlatformUI.getWorkbench();
-			IWorkbenchWindow activeWindow= workbench.getActiveWorkbenchWindow();
-			workbench.showPerspective(perspective, activeWindow);
-		}
-		return shownPerspective;
-	}
-	
- 
-	
-	public static IFile[] findFiles(IResource resource) throws CoreException {
-		List files= new ArrayList();
-		findFiles(resource, files);
-		return (IFile[]) files.toArray(new IFile[files.size()]);
-	}
-	
-	private static void findFiles(IResource resource, List files) throws CoreException {
-		if (resource instanceof IFile) {
-			files.add(resource);
-			return;
-		}
-		if (resource instanceof IContainer) {
-			IResource[] resources= ((IContainer) resource).members();
-			for (int i= 0; i < resources.length; i++)
-				findFiles(resources[i], files);
-		}
-	}
-	  
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/ExtensionsTest.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/ExtensionsTest.java
deleted file mode 100644
index 567231c..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/ExtensionsTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oakland Software Incorporated and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oakland Software Incorporated - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.internal.navigator.filters.CommonFilterSelectionDialog;
-import org.eclipse.ui.navigator.CommonViewer;
-
-public class ExtensionsTest extends NavigatorTestBase {
-
-	public ExtensionsTest() {
-		_navigatorInstanceId = "org.eclipse.ui.tests.navigator.HideAvailableExtensionsTestView";
-	}
-
-	class CFDialog extends CommonFilterSelectionDialog {
-		public CFDialog(CommonViewer aCommonViewer) {
-			super(aCommonViewer);
-		}
-
-		public void finish() {
-			okPressed();
-			close();
-		}
-
-	}
-
-	// Bug 185561 when hideAvailableExtensionsTab is true, everything gone
-	public void testHideAvailableExtensions() throws Exception {
-		assertEquals(1, _commonNavigator.getCommonViewer().getTree()
-				.getItemCount());
-
-		// Just showing the filters dialog upsets the apple cart
-		CFDialog cfDialog = new CFDialog(_commonNavigator.getCommonViewer());
-		cfDialog.create();
-		cfDialog.finish();
-
-		assertEquals(1, _commonNavigator.getCommonViewer().getTree()
-				.getItemCount());
-
-		if (false)
-			DisplayHelper.sleep(Display.getCurrent(), 10000000);
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/INavigatorContentServiceTests.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/INavigatorContentServiceTests.java
deleted file mode 100644
index 32e9a79..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/INavigatorContentServiceTests.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.navigator.NavigatorContentService;
-import org.eclipse.ui.navigator.CommonViewer;
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorContentExtension;
-import org.eclipse.ui.navigator.INavigatorContentService;
-import org.eclipse.ui.navigator.NavigatorContentServiceFactory;
-import org.eclipse.ui.tests.navigator.extension.TestContentProvider;
-import org.eclipse.ui.tests.navigator.util.TestWorkspace;
-
-public class INavigatorContentServiceTests extends TestCase {
-
-	public static final String COMMON_NAVIGATOR_INSTANCE_ID = "org.eclipse.ui.tests.navigator.TestView";
-
-	public static final String TEST_EXTENSION_ID = "org.eclipse.ui.tests.navigator.testContent";
-	
-	public static final String ENFORCE_HASCHILDREN_EXTENSION_ID = "org.eclipse.ui.tests.navigator.testHasChildren";
-
-	public static final String TEST_EXTENSION_2_ID = "org.eclipse.ui.tests.navigator.testContent2";
-
-	public static final String RESOURCE_EXTENSION_ID = "org.eclipse.ui.navigator.resourceContent";
-
-	private final Map expectedChildren = new HashMap();
-
-	private IProject project;
-
-	private INavigatorContentService contentService;
-
-	private CommonViewer viewer;
-
-	protected void setUp() throws Exception {
-
-		TestWorkspace.init();
-
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		project = root.getProject("Test");
-		Map projectMap = new HashMap();
-
-		expectedChildren.put(project, (projectMap = new HashMap()));
-
-		projectMap.put(project.getFolder("src"), new HashMap());
-		projectMap.put(project.getFolder("bin"), new HashMap());
-		projectMap.put(project.getFile(".project"), null);
-		projectMap.put(project.getFile(".classpath"), null);
-		projectMap.put(project.getFile("model.properties"), null);
-
-		EditorTestHelper.showView(COMMON_NAVIGATOR_INSTANCE_ID, true);
-
-		IWorkbenchWindow activeWindow = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		IWorkbenchPage activePage = activeWindow.getActivePage();
-
-		IViewPart commonNavigator = activePage
-				.findView(COMMON_NAVIGATOR_INSTANCE_ID);
-
-		viewer = (CommonViewer) commonNavigator.getAdapter(CommonViewer.class);
-		viewer.expandAll();
-
-		contentService = viewer.getNavigatorContentService();
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-	}
-
-	public void testFindValidExtensions() {
-
-		contentService
-				.getActivationService()
-				.activateExtensions(
-						new String[] { TEST_EXTENSION_ID, RESOURCE_EXTENSION_ID },
-						true);
-
-		ITreeContentProvider contentServiceContentProvider = contentService
-				.createCommonContentProvider();
-
-		ILabelProvider contentServiceLabelProvider = contentService
-				.createCommonLabelProvider();
-
-		ITreeContentProvider[] rootContentProviders = ((NavigatorContentService) contentService)
-				.findRootContentProviders(ResourcesPlugin.getWorkspace()
-						.getRoot());
-
-		assertEquals("Ensure there is only one root content provider.", 1,
-				rootContentProviders.length);
-
-		Set projectContentExtensions = contentService
-				.findContentExtensionsByTriggerPoint(project);
-
-		assertEquals("Ensure there are two content providers for an IProject.",
-				2, projectContentExtensions.size());
-
-		boolean found = false;
-		INavigatorContentExtension ext;
-		for (Iterator i = projectContentExtensions.iterator(); i.hasNext();) {
-			ext = (INavigatorContentExtension) i.next();
-			if (ext.getContentProvider() instanceof TestContentProvider) {
-
-				TestContentProvider testContentProvider = (TestContentProvider) ext
-						.getContentProvider();
-				Object[] projectChildren = testContentProvider
-						.getChildren(project);
-				assertEquals(
-						"There should be one test-type child of the project.",
-						1, projectChildren.length);
-				assertEquals("BlueParent", contentServiceLabelProvider
-						.getText(projectChildren[0]));
-				Object[] testRootChildren = contentServiceContentProvider
-						.getChildren(projectChildren[0]);
-				assertEquals(
-						"There should be one test-type child of the root test-type item.",
-						3, testRootChildren.length);
-				found = true;
-			}
-		}
-
-		assertTrue("The test content provider was not found.", found);
-
-	}
-
-	public void testDeactivateTestExtension() {
-
-		contentService.getActivationService().activateExtensions(
-				new String[] { RESOURCE_EXTENSION_ID }, true);
-
-		contentService.createCommonContentProvider();
-
-		contentService.createCommonLabelProvider();
-
-		Set rootContentProviders = contentService
-				.findRootContentExtensions(ResourcesPlugin.getWorkspace()
-						.getRoot());
-
-		assertEquals("Ensure there is only one root content provider.", 1,
-				rootContentProviders.size());
-
-		Set projectContentExtensions = contentService
-				.findContentExtensionsByTriggerPoint(project);
-
-		assertEquals("Ensure there is one content provider for an IProject.",
-				1, projectContentExtensions.size());
-
-	}
-
-	public void testBindTestExtension() {
-
-		INavigatorContentService contentServiceWithProgrammaticBindings = NavigatorContentServiceFactory.INSTANCE
-				.createContentService(COMMON_NAVIGATOR_INSTANCE_ID);
-		INavigatorContentDescriptor[] boundDescriptors = contentServiceWithProgrammaticBindings
-				.bindExtensions(new String[] { TEST_EXTENSION_2_ID }, false);
-		contentServiceWithProgrammaticBindings
-				.getActivationService()
-				.activateExtensions(
-						new String[] { RESOURCE_EXTENSION_ID,
-								TEST_EXTENSION_ID, TEST_EXTENSION_2_ID }, false);
-
-		assertEquals("One descriptor should have been returned.", 1,
-				boundDescriptors.length);
-
-		assertEquals(
-				"The declarative content service should have one fewer visible extension ids than the one created programmatically.",
-				contentService.getVisibleExtensionIds().length + 1,
-				contentServiceWithProgrammaticBindings.getVisibleExtensionIds().length);
-
-		INavigatorContentDescriptor[] visibleDescriptors = contentServiceWithProgrammaticBindings
-				.getVisibleExtensions();
-		boolean found = false;
-		for (int i = 0; i < visibleDescriptors.length; i++)
-			if (TEST_EXTENSION_2_ID.equals(visibleDescriptors[i].getId()))
-				found = true;
-		assertTrue("The programmatically bound extension should be bound.",
-				found);
-
-		Set enabledDescriptors = contentServiceWithProgrammaticBindings
-				.findContentExtensionsByTriggerPoint(project);
-
-		assertEquals("There should be a three extensions.", 3,
-				enabledDescriptors.size());
-
-	}
-
-	public void testTestExtensionVisibility() {
-		assertTrue("The test extension should be visible.", contentService
-				.getViewerDescriptor().isVisibleContentExtension(
-						TEST_EXTENSION_ID));
-	}
-
-	public void testResourceExtensionVisibility() {
-		assertTrue("The test extension should be visible.", contentService
-				.getViewerDescriptor().isVisibleContentExtension(
-						RESOURCE_EXTENSION_ID));
-	}
-
-	public void testVisibleExtensionIds() {
-		String[] visibleIds = contentService.getVisibleExtensionIds();
-
-		assertEquals("There should be three visible extensions.", 3,
-				visibleIds.length);
-
-		for (int i = 0; i < visibleIds.length; i++) {
-			if (!TEST_EXTENSION_ID.equals(visibleIds[i])
-					&& !RESOURCE_EXTENSION_ID.equals(visibleIds[i])
-					&& !ENFORCE_HASCHILDREN_EXTENSION_ID.equals(visibleIds[i])) {
-				assertTrue("The extension id is invalid:" + visibleIds[i],
-						false);
-			}
-		}
-
-		INavigatorContentDescriptor[] visibleDescriptors = contentService
-				.getVisibleExtensions();
-
-		for (int i = 0; i < visibleIds.length; i++) {
-			if (!TEST_EXTENSION_ID.equals(visibleDescriptors[i].getId())
-					&& !RESOURCE_EXTENSION_ID.equals(visibleDescriptors[i]
-							.getId())
-						&& !ENFORCE_HASCHILDREN_EXTENSION_ID.equals(visibleDescriptors[i].getId())) {
-				assertTrue("The extension id is invalid:"
-						+ visibleDescriptors[i].getId(), false);
-			}
-		}
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/NavigatorTestBase.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/NavigatorTestBase.java
deleted file mode 100644
index 5ef0350..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/NavigatorTestBase.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.navigator.filters.UpdateActiveFiltersOperation;
-import org.eclipse.ui.navigator.CommonNavigator;
-import org.eclipse.ui.navigator.CommonViewer;
-import org.eclipse.ui.navigator.INavigatorContentService;
-import org.eclipse.ui.navigator.NavigatorActionService;
-import org.eclipse.ui.tests.navigator.util.TestWorkspace;
-
-public class NavigatorTestBase extends TestCase {
-
-	public static final String COMMON_NAVIGATOR_RESOURCE_EXT = "org.eclipse.ui.navigator.resourceContent"; //$NON-NLS-1$
-
-	public static final String COMMON_NAVIGATOR_JAVA_EXT = "org.eclipse.jdt.java.ui.javaContent"; //$NON-NLS-1$
-
-	public static final String COMMON_NAVIGATOR_TEST_EXT = "org.eclipse.ui.tests.navigator.testContent"; //$NON-NLS-1$
-
-	public static final String TEST_CONTENT1 = "org.eclipse.ui.tests.navigator.testOverriddenContent1";
-	public static final String TEST_CONTENT2 = "org.eclipse.ui.tests.navigator.testOverriddenContent2";
-	public static final String TEST_OVERRIDE1= "org.eclipse.ui.tests.navigator.testOverride1";
-	public static final String TEST_OVERRIDE2 = "org.eclipse.ui.tests.navigator.testOverride2";
-
-	protected String _navigatorInstanceId;
-
-	protected Set expectedChildren = new HashSet();
-
-	protected IProject project;
-
-	protected CommonViewer viewer;
-
-	protected CommonNavigator _commonNavigator;
-
-	protected INavigatorContentService contentService;
-	protected NavigatorActionService _actionService;
-
-	protected boolean _initTestData = true;
-
-	protected void setUp() throws Exception {
-
-		if (_navigatorInstanceId == null) {
-			throw new RuntimeException(
-					"Set the _navigatorInstanceId in the constructor");
-		}
-
-		if (_initTestData) {
-
-			TestWorkspace.init();
-
-			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-			project = root.getProject("Test"); //$NON-NLS-1$
-
-			expectedChildren.add(project.getFolder("src")); //$NON-NLS-1$
-			expectedChildren.add(project.getFolder("bin")); //$NON-NLS-1$
-			expectedChildren.add(project.getFile(".project")); //$NON-NLS-1$
-			expectedChildren.add(project.getFile(".classpath")); //$NON-NLS-1$ 
-			expectedChildren.add(project.getFile("model.properties")); //$NON-NLS-1$
-		}
-
-		EditorTestHelper.showView(_navigatorInstanceId, true);
-
-		IWorkbenchWindow activeWindow = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		IWorkbenchPage activePage = activeWindow.getActivePage();
-
-		_commonNavigator = (CommonNavigator) activePage
-				.findView(_navigatorInstanceId);
-		_commonNavigator.setFocus();
-		viewer = (CommonViewer) _commonNavigator.getAdapter(CommonViewer.class);
-
-		contentService = viewer.getNavigatorContentService();
-		_actionService = _commonNavigator.getNavigatorActionService();
-
-		IUndoableOperation updateFilters = new UpdateActiveFiltersOperation(
-				viewer, new String[0], true);
-		updateFilters.execute(null, null);
-	}
-
-	protected void tearDown() throws Exception {
-		IProject[] projects = ResourcesPlugin.getWorkspace().getRoot()
-				.getProjects();
-		for (int i = 0; i < projects.length; i++) {
-			projects[i].delete(true, null);
-		}
-		// Hide it, we want a new one each time
-		EditorTestHelper.showView(_navigatorInstanceId, false);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/NavigatorTestSuite.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/NavigatorTestSuite.java
deleted file mode 100644
index 3c27867..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/NavigatorTestSuite.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public final class NavigatorTestSuite extends TestSuite {
-
-	/**
-	 * Returns the suite. This is required to use the JUnit Launcher.
-	 */
-	public static final Test suite() {
-		return new NavigatorTestSuite();
-	}
-
-	/**
-	 * Construct the test suite.
-	 */
-	public NavigatorTestSuite() {
-		addTest(new TestSuite(ExtensionsTest.class));
-		addTest(new TestSuite(WorkingSetTest.class));
-		addTest(new TestSuite(ActivityTest.class));
-		addTest(new TestSuite(OpenTest.class));
-		addTest(new TestSuite(INavigatorContentServiceTests.class));
-		addTest(new TestSuite(ProgrammaticOpenTest.class));
-		addTest(new TestSuite(PipelineTest.class));
-		//addTest(new TestSuite(OverrideTest.class));
-		//addTest(new TestSuite(CreateProjectTest.class));
-		
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/NavigatorTestsPlugin.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/NavigatorTestsPlugin.java
deleted file mode 100644
index 97babda..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/NavigatorTestsPlugin.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * 
- * Not exposed as API.
- * @since 3.2
- *
- */
-public class NavigatorTestsPlugin extends AbstractUIPlugin {
-
-	//The shared instance.
-	private static NavigatorTestsPlugin plugin; 
-	/**
-	 * The plugin id
-	 */
-	public static String PLUGIN_ID = "org.eclipse.ui.tests.navigator"; //$NON-NLS-1$
-
-	/**
-	 * Creates a new instance of the receiver
-	 */
-	public NavigatorTestsPlugin() {
- 		super();
-		plugin = this;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static NavigatorTestsPlugin getDefault() {
-		return plugin;
-	}
- 
-
-	/**
-	 * Log the given status to the ISV log.
-	 * 
-	 * When to use this:
-	 * 
-	 * This should be used when a PluginException or a ExtensionException occur but for which an
-	 * error dialog cannot be safely shown.
-	 * 
-	 * If you can show an ErrorDialog then do so, and do not call this method.
-	 * 
-	 * If you have a plugin exception or core exception in hand call log(String, IStatus)
-	 * 
-	 * This convenience method is for internal use by the Workbench only and must not be called
-	 * outside the workbench.
-	 * 
-	 * This method is supported in the event the log allows plugin related information to be logged
-	 * (1FTTJKV). This would be done by this method.
-	 * 
-	 * This method is internal to the workbench and must not be called by any plugins, or examples.
-	 * 
-	 * @param message
-	 *            A high level UI message describing when the problem happened.
-	 *  
-	 */
-
-	public static void log(String message) {
-		getDefault().getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, 0, message, null));
-		System.err.println(message);
-		//1FTTJKV: ITPCORE:ALL - log(status) does not allow plugin information to be recorded
-	}
-
-	/**
-	 * Logs errors.
-	 */
-	public static void log(String message, IStatus status) {
-		if (message != null) {
-			getDefault().getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, 0, message, null));
-			System.err.println(message + "\nReason:"); //$NON-NLS-1$
-		}
-		getDefault().getLog().log(status);
-		System.err.println(status.getMessage());
-	} 
-	
-
-	public static void logError(int aCode, String aMessage, Throwable anException) { 
-		getDefault().getLog().log(createErrorStatus(aCode, aMessage, anException)); 
-	}
-
-	public static void log(int severity, int aCode, String aMessage, Throwable exception) {
-		log(createStatus(severity, aCode, aMessage, exception));
-	}
-
-	public static void log(IStatus aStatus) { 
-		getDefault().getLog().log(aStatus); 
-	} 
-	 
-	public static IStatus createStatus(int severity, int aCode, String aMessage, Throwable exception) {
-		return new Status(severity, PLUGIN_ID, aCode, aMessage, exception);
-	}
- 
-	public static IStatus createErrorStatus(int aCode, String aMessage, Throwable exception) {
-		return createStatus(IStatus.ERROR, aCode, aMessage, exception);
-	} 
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/OpenTest.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/OpenTest.java
deleted file mode 100644
index 2734ffe..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/OpenTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.navigator.resources.ProjectExplorer;
-
-public class OpenTest extends NavigatorTestBase {
-
-	public OpenTest()
-	{
-		_navigatorInstanceId = ProjectExplorer.VIEW_ID;
-	}
-	
-	public void testNavigatorRootContents() throws Exception {
-
-		contentService.getActivationService().activateExtensions(
-				new String[] { COMMON_NAVIGATOR_RESOURCE_EXT }, true); 
-
-		viewer.refresh();
-		viewer.expandAll();
-
-		TreeItem[] items = viewer.getTree().getItems();
-
-		assertTrue("There should be some items.", items.length > 0); //$NON-NLS-1$		
-
-		assertEquals(project, items[0].getData());
-
-		// we do this to force the rendering of the children of items[0]
-		viewer
-				.setSelection(new StructuredSelection(project
-						.getFile(".project"))); //$NON-NLS-1$
-
-		TreeItem[] children = items[0].getItems();
-
-		assertEquals(expectedChildren.size(), children.length);
-		for (int i = 0; i < children.length; i++) {
-			assertTrue(expectedChildren.contains(children[i].getData()));
-		}
-
-	}
-
-	public void testNavigatorExtensionEnablement() throws Exception { 
-
-		contentService.getActivationService().activateExtensions(new String[] {}, true);
-
-		viewer.refresh();
-		viewer.expandAll();
-
-		TreeItem[] items = viewer.getTree().getItems();
-
-		assertTrue("There should be NO items.", items.length == 0); //$NON-NLS-1$
-
-		contentService.getActivationService().deactivateExtensions(new String[] {}, true);
-
-		viewer.expandToLevel(2);
-
-		items = viewer.getTree().getItems();
-
-		assertTrue("There should be some items.", items.length > 0); //$NON-NLS-1$
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/OverrideTest.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/OverrideTest.java
deleted file mode 100644
index a004632..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/OverrideTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
-p * Copyright (c) 2008 Oakland Software Incorporated and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oakland Software Incorporated - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.tests.navigator.extension.TestLabelProviderCyan;
-import org.eclipse.ui.tests.navigator.extension.TestLabelProviderGreen;
-
-public class OverrideTest extends NavigatorTestBase {
-
-	public OverrideTest() {
-		_navigatorInstanceId = "org.eclipse.ui.tests.navigator.OverrideTestView";
-	}
-
-	// bug 252293 [CommonNavigator] LabelProviders do not obey override rules
-	public void NOTYETtestSimpleResFirst() throws Exception {
-
-		if (!false) {
-			contentService.bindExtensions(new String[] { TEST_CONTENT1,
-					TEST_OVERRIDE1 }, false);
-			contentService.getActivationService().activateExtensions(
-					new String[] { TEST_OVERRIDE1, TEST_CONTENT1 }, true);
-		}
-
-		viewer.refresh();
-
-		TreeItem[] rootItems = viewer.getTree().getItems();
-
-		if (false) {
-			DisplayHelper.sleep(Display.getCurrent(), 10000000);
-		}
-
-		if (!rootItems[0].getText().startsWith("Green"))
-			fail("Wrong text: " + rootItems[0].getText());
-		assertEquals(TestLabelProviderGreen.getTestColor(), rootItems[0]
-				.getBackground(0));
-	}
-
-	// bug 252293 [CommonNavigator] LabelProviders do not obey override rules
-	public void NOTYETtestSimpleResLast() throws Exception {
-
-		if (!false) {
-			contentService.bindExtensions(new String[] { TEST_CONTENT2,
-					TEST_OVERRIDE2 }, false);
-			contentService.getActivationService().activateExtensions(
-					new String[] { TEST_CONTENT2, TEST_OVERRIDE2 }, true);
-		}
-
-		viewer.refresh();
-		TreeItem[] rootItems = viewer.getTree().getItems();
-		assertEquals(TestLabelProviderCyan.getTestColor(), rootItems[0]
-				.getBackground(0));
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/PipelineTest.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/PipelineTest.java
deleted file mode 100644
index b28d089..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/PipelineTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.TreeItem;
-
-public class PipelineTest extends NavigatorTestBase {
-
-	public PipelineTest() {
-		_navigatorInstanceId = "org.eclipse.ui.tests.navigator.PipelineTestView";
-	}
-
-	public void testNavigatorRootContents() throws Exception {
-
-		assertEquals(
-				"There should be no visible extensions for the pipeline viewer.",
-				0, contentService.getVisibleExtensionIds().length);
-
-		contentService.bindExtensions(new String[] {
-				COMMON_NAVIGATOR_RESOURCE_EXT, COMMON_NAVIGATOR_JAVA_EXT },
-				false);
-
-		assertEquals(
-				"There should be two visible extension for the pipeline viewer.",
-				2, contentService.getVisibleExtensionIds().length);
-
-		contentService.getActivationService().activateExtensions(
-				new String[] { COMMON_NAVIGATOR_RESOURCE_EXT,
-						COMMON_NAVIGATOR_JAVA_EXT }, true);
-
-		viewer.refresh();
-
-		// we do this to force the rendering of the children of items[0]
-		viewer.setSelection(
-				new StructuredSelection(project.getFile(".project")), true); //$NON-NLS-1$
-
-		TreeItem[] rootItems = viewer.getTree().getItems();
-
-		assertEquals("There should be one item.", 1, rootItems.length); //$NON-NLS-1$		
-
-		assertTrue(
-				"The root object should be an IJavaProject, which is IAdaptable.", rootItems[0].getData() instanceof IAdaptable); //$NON-NLS-1$
-
-		IProject adaptedProject = (IProject) ((IAdaptable) rootItems[0]
-				.getData()).getAdapter(IProject.class);
-		assertEquals(project, adaptedProject);
-
-		IFolder sourceFolder = project.getFolder(new Path("src"));
-		viewer.add(project, sourceFolder);
-
-		TreeItem[] projectChildren = rootItems[0].getItems();
-
-		assertTrue("There should be some items.", projectChildren.length > 0); //$NON-NLS-1$
-
-		for (int i = 0; i < projectChildren.length; i++) {
-			if (projectChildren[i].getData() == sourceFolder)
-				fail("The src folder should not be added as an IFolder.");
-		}
-
-		// a new project without a Java nature should add without an issue.
-		IProject newProject = ResourcesPlugin.getWorkspace().getRoot()
-				.getProject("New Project");
-		viewer.add(viewer.getInput(), newProject);
-
-		rootItems = viewer.getTree().getItems();
-
-		assertEquals("There should be two items.", 2, rootItems.length); //$NON-NLS-1$
-
-		boolean found = false;
-		for (int i = 0; i < rootItems.length && !found; i++) {
-			if (rootItems[i].getData() instanceof IProject) {
-				IProject newProjectFromTree = (IProject) rootItems[i].getData();
-				if (newProject.equals(newProjectFromTree))
-					found = true;
-			}
-		}
-		assertTrue(found);
-	}
-
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/ProgrammaticOpenTest.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/ProgrammaticOpenTest.java
deleted file mode 100644
index 06bcde0..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/ProgrammaticOpenTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.TreeItem;
-
-import org.eclipse.ui.navigator.INavigatorContentDescriptor;
-import org.eclipse.ui.navigator.INavigatorSorterService;
-import org.eclipse.ui.tests.navigator.extension.TestDataSorter;
-
-public class ProgrammaticOpenTest extends NavigatorTestBase {
-
-	public ProgrammaticOpenTest() {
-
-		_navigatorInstanceId = "org.eclipse.ui.tests.navigator.ProgrammaticTestView"; //$NON-NLS-1$
-	}
-
-	public void testNavigatorRootContents() throws Exception {
-
-		assertEquals("There should be no visible extensions for the programmatic viewer.", 0, contentService.getVisibleExtensionIds().length);
-
-		contentService.bindExtensions(new String[] { COMMON_NAVIGATOR_RESOURCE_EXT }, false);
-
-		assertEquals("There should be one visible extension for the programmatic viewer.", 1, contentService.getVisibleExtensionIds().length);
-
-		contentService.getActivationService().activateExtensions(new String[] { COMMON_NAVIGATOR_RESOURCE_EXT }, true);
-
-		viewer.refresh();
-		viewer.expandAll();
-
-		TreeItem[] items = viewer.getTree().getItems();
-
-		assertTrue("There should be some items.", items.length > 0); //$NON-NLS-1$		
-
-		assertEquals(project, items[0].getData());
-
-		// we do this to force the rendering of the children of items[0]
-		viewer.setSelection(new StructuredSelection(project.getFile(".project"))); //$NON-NLS-1$
-
-		TreeItem[] children = items[0].getItems();
-
-		assertEquals(expectedChildren.size(), children.length);
-		for (int i = 0; i < children.length; i++) {
-			assertTrue(expectedChildren.contains(children[i].getData()));
-		}
-
-	}
-
-	public void testNavigatorExtensionEnablement() throws Exception {
-
-		assertEquals("There should be no visible extensions for the programmatic viewer.", 0, contentService.getVisibleExtensionIds().length);
-
-		contentService.bindExtensions(new String[] { COMMON_NAVIGATOR_RESOURCE_EXT }, false);
-
-		assertEquals("There should be one visible extension for the programmatic viewer.", 1, contentService.getVisibleExtensionIds().length);
-
-		contentService.getActivationService().activateExtensions(new String[] { COMMON_NAVIGATOR_RESOURCE_EXT }, true);
-
-		contentService.getActivationService().activateExtensions(new String[] {}, true);
-
-		viewer.refresh();
-		viewer.expandAll();
-
-		TreeItem[] items = viewer.getTree().getItems();
-
-		assertTrue("There should be NO items.", items.length == 0); //$NON-NLS-1$
-
-		contentService.getActivationService().deactivateExtensions(new String[] {}, true);
-
-		viewer.expandToLevel(2);
-
-		items = viewer.getTree().getItems();
-
-		assertTrue("There should be some items.", items.length > 0); //$NON-NLS-1$
-
-	}
-
-	public void testNavigatorSorterAccess() throws Exception {
-
-		INavigatorSorterService sorterService = contentService.getSorterService();
-
-		INavigatorContentDescriptor testDescriptor = contentService.getContentDescriptorById(COMMON_NAVIGATOR_TEST_EXT);
-
-		Map sorters = sorterService.findAvailableSorters(testDescriptor);
-
-		assertEquals(3, sorters.size());
-
-		for (Iterator iter = sorters.entrySet().iterator(); iter.hasNext();) {
-			Map.Entry entry = (Map.Entry) iter.next();
-			assertTrue(entry.getValue() instanceof TestDataSorter);
-		}
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/SWTEventHelper.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/SWTEventHelper.java
deleted file mode 100644
index 77ef6b0..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/SWTEventHelper.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.navigator;
-
-import junit.framework.Assert;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-
-
-/**
- * @since 3.1
- */
-public class SWTEventHelper {
-	
-	public static void pressKeyCode(Display display, int keyCode) {
-		pressKeyCode(display, keyCode, true);
-	}
-	
-	public static void pressKeyCode(Display display, int keyCode, boolean runEventQueue) {
-		keyCodeDown(display, keyCode, runEventQueue);
-		keyCodeUp(display, keyCode, runEventQueue);
-	}
-
-	public static void pressKeyCodeCombination(Display display, int[] keyCodes) {
-		pressKeyCodeCombination(display, keyCodes, true);
-	}
-	
-	public static void pressKeyCodeCombination(Display display, int[] keyCodes, boolean runEventQueue) {
-		for (int i= 0; i < keyCodes.length; i++)
-			keyCodeDown(display, keyCodes[i], runEventQueue);
-		for (int i= keyCodes.length - 1; i >= 0; i--)
-			keyCodeUp(display, keyCodes[i], runEventQueue);
-	}
-
-	public static void keyCodeDown(Display display, int keyCode) {
-		keyCodeEvent(display, SWT.KeyDown, keyCode, true);
-	}
-	
-	public static void keyCodeDown(Display display, int keyCode, boolean runEventQueue) {
-		keyCodeEvent(display, SWT.KeyDown, keyCode, runEventQueue);
-	}
-
-	public static void keyCodeUp(Display display, int keyCode) {
-		keyCodeEvent(display, SWT.KeyUp, keyCode, true);
-	}
-	
-	public static void keyCodeUp(Display display, int keyCode, boolean runEventQueue) {
-		keyCodeEvent(display, SWT.KeyUp, keyCode, runEventQueue);
-	}
-
-	private static Event fgKeyCodeEvent= new Event();
-	public static void keyCodeEvent(Display display, int type, int keyCode, boolean runEventQueue) {
-		fgKeyCodeEvent.type= type;
-		fgKeyCodeEvent.keyCode= keyCode;
-		postEvent(display, fgKeyCodeEvent, runEventQueue);
-	}
-	
-	public static void pressKeyChar(Display display, char keyChar) {
-		pressKeyChar(display, keyChar, true);
-	}
-	
-	public static void pressKeyChar(Display display, char keyChar, boolean runEventQueue) {
-		keyCharDown(display, keyChar, runEventQueue);
-		keyCharUp(display, keyChar, runEventQueue);
-	}
-
-	public static void pressKeyCharCombination(Display display, char[] keyChars) {
-		pressKeyCharCombination(display, keyChars, true);
-	}
-	
-	public static void pressKeyCharCombination(Display display, char[] keyChars, boolean runEventQueue) {
-		for (int i= 0; i < keyChars.length; i++)
-			keyCharDown(display, keyChars[i], runEventQueue);
-		for (int i= keyChars.length - 1; i >= 0; i--)
-			keyCharUp(display, keyChars[i], runEventQueue);
-	}
-
-	public static void keyCharDown(Display display, char keyChar, boolean runEventQueue) {
-		keyCharEvent(display, SWT.KeyDown, keyChar, runEventQueue);
-	}
-
-	public static void keyCharUp(Display display, char keyChar, boolean runEventQueue) {
-		keyCharEvent(display, SWT.KeyUp, keyChar, runEventQueue);
-	}
-
-	private static Event fgKeyCharEvent= new Event();
-	public static void keyCharEvent(Display display, int type, char keyChar, boolean runEventQueue) {
-		fgKeyCharEvent.type= type;
-		fgKeyCharEvent.character= keyChar;
-		postEvent(display, fgKeyCharEvent, runEventQueue);
-	}
-
-	private static void postEvent(final Display display, final Event event, boolean runEventQueue) {
-		DisplayHelper helper= new DisplayHelper() {
-			public boolean condition() {
-				return display.post(event);
-			}
-		};
-		Assert.assertTrue(helper.waitForCondition(display, 1000));
-
-		if (runEventQueue)
-			EditorTestHelper.runEventQueue();
-			
-	}
-	
-	private static Event fgMouseMoveEvent= new Event();
-	public static void mouseMoveEvent(Display display, int x, int y, boolean runEventQueue) {
-		fgMouseMoveEvent.type= SWT.MouseMove;
-		fgMouseMoveEvent.x= x;
-		fgMouseMoveEvent.y= y;
-		postEvent(display, fgMouseMoveEvent, runEventQueue);
-	}
-	
-	public static void mouseDownEvent(Display display, int button, boolean runEventQueue) {
-		mouseButtonEvent(display, SWT.MouseDown, button, runEventQueue);
-	}
-
-	public static void mouseUpEvent(Display display, int button, boolean runEventQueue) {
-		mouseButtonEvent(display, SWT.MouseUp, button, runEventQueue);
-	}
-
-	private static Event fgMouseButtonEvent= new Event();
-	public static void mouseButtonEvent(Display display, int type, int button, boolean runEventQueue) {
-		fgMouseButtonEvent.type= type;
-		fgMouseButtonEvent.button= button;
-		postEvent(display, fgMouseButtonEvent, runEventQueue);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/TestAccessHelper.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/TestAccessHelper.java
deleted file mode 100644
index df2308a..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/TestAccessHelper.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oakland Software Incorporated and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oakland Software Incorporated - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.navigator;
-
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.internal.navigator.actions.CommonActionDescriptorManager;
-import org.eclipse.ui.internal.navigator.actions.CommonActionProviderDescriptor;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.INavigatorContentService;
-import org.eclipse.ui.navigator.NavigatorActionService;
-
-/**
- * Helper used to access things from the CN implementation.
- */
-public class TestAccessHelper {
-
-	
-	public static CommonActionProvider getActionProvider(
-			INavigatorContentService contentService,
-			NavigatorActionService actionService, Class cls) throws Exception {
-
-		CommonActionProvider provider = null;
-		CommonActionProviderDescriptor[] providerDescriptors = CommonActionDescriptorManager
-				.getInstance().findRelevantActionDescriptors(contentService,
-						new ActionContext(new StructuredSelection()));
-		if (providerDescriptors.length > 0) {
-			for (int i = 0; i < providerDescriptors.length; i++) {
-				provider = actionService
-						.getActionProviderInstance(providerDescriptors[i]);
-				if (provider.getClass() == cls)
-					return provider;
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/WorkingSetTest.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/WorkingSetTest.java
deleted file mode 100644
index eab0e23..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/WorkingSetTest.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oakland Software Incorporated and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oakland Software Incorporated - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import java.io.ByteArrayInputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkingSetFilterActionGroup;
-import org.eclipse.ui.internal.AggregateWorkingSet;
-import org.eclipse.ui.internal.WorkingSet;
-import org.eclipse.ui.internal.navigator.resources.actions.WorkingSetActionProvider;
-import org.eclipse.ui.internal.navigator.workingsets.WorkingSetsContentProvider;
-import org.eclipse.ui.navigator.IExtensionStateModel;
-import org.eclipse.ui.navigator.INavigatorContentExtension;
-import org.eclipse.ui.navigator.resources.ProjectExplorer;
-import org.eclipse.ui.tests.navigator.util.TestWorkspace;
-
-public class WorkingSetTest extends NavigatorTestBase {
-
-	public WorkingSetTest() {
-		_navigatorInstanceId = ProjectExplorer.VIEW_ID;
-		_initTestData = false;
-	}
-
-	// Bug 157877 when using empty window working set, it should show all
-	public void testEmptyWindowWorkingSet() throws Exception {
-		TestWorkspace.init();
-
-		WorkingSetActionProvider provider = (WorkingSetActionProvider) TestAccessHelper
-				.getActionProvider(contentService, _actionService,
-						WorkingSetActionProvider.class);
-
-		IWorkingSet workingSet = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage()
-				.getAggregateWorkingSet();
-
-		// Set the filter to window working set (which should be empty)
-		IPropertyChangeListener l = provider.getFilterChangeListener();
-		PropertyChangeEvent event = new PropertyChangeEvent(this,
-				WorkingSetFilterActionGroup.CHANGE_WORKING_SET, null,
-				workingSet);
-		l.propertyChange(event);
-
-		TreeItem[] items = viewer.getTree().getItems();
-		assertTrue("There should be some items.", items.length > 0);
-	}
-
-	// Bug 212389 projects are not shown when they are not in the working set,
-	// but their children are
-	public void testMissingProjectsInWorkingSet() throws Exception {
-
-		IProject p1 = ResourcesPlugin.getWorkspace().getRoot().getProject("p1");
-		p1.create(null);
-		p1.open(null);
-		IFile f1 = p1.getFile("f1");
-		f1.create(new ByteArrayInputStream(new byte[] {}), true, null);
-
-		WorkingSetActionProvider provider = (WorkingSetActionProvider) TestAccessHelper
-				.getActionProvider(contentService, _actionService,
-						WorkingSetActionProvider.class);
-
-		IWorkingSet workingSet = new WorkingSet("ws1", "ws1",
-				new IAdaptable[] { f1 });
-
-		AggregateWorkingSet agWorkingSet = new AggregateWorkingSet("AgWs",
-				"Ag Working Set", new IWorkingSet[] { workingSet });
-
-		IPropertyChangeListener l = provider.getFilterChangeListener();
-		PropertyChangeEvent event = new PropertyChangeEvent(this,
-				WorkingSetFilterActionGroup.CHANGE_WORKING_SET, null,
-				agWorkingSet);
-		l.propertyChange(event);
-
-		DisplayHelper.runEventLoop(Display.getCurrent(), 100);
-
-		// DisplayHelper.sleep(Display.getCurrent(), 10000000);
-
-		TreeItem[] items = viewer.getTree().getItems();
-		// The bug is here where the first item is a IFile, not the enclosing
-		// project
-		assertTrue("First item needs to be project", items[0].getData().equals(
-				p1));
-	}
-
-	// bug 220090 test that working sets are shown when selected locally (not
-	// using the window working set)
-	public void testTopLevelWorkingSet() throws Exception {
-
-		IProject p1 = ResourcesPlugin.getWorkspace().getRoot().getProject("p1");
-		p1.create(null);
-		p1.open(null);
-		IFile f1 = p1.getFile("f1");
-		f1.create(new ByteArrayInputStream(new byte[] {}), true, null);
-
-		WorkingSetActionProvider provider = (WorkingSetActionProvider) TestAccessHelper
-				.getActionProvider(contentService, _actionService,
-						WorkingSetActionProvider.class);
-
-		IExtensionStateModel extensionStateModel = contentService
-				.findStateModel(WorkingSetsContentProvider.EXTENSION_ID);
-
-		extensionStateModel.setBooleanProperty(
-				WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS, true);
-
-		IWorkingSet workingSet = new WorkingSet("ws1", "ws1",
-				new IAdaptable[] { p1 });
-
-		IPropertyChangeListener l = provider.getFilterChangeListener();
-		PropertyChangeEvent event = new PropertyChangeEvent(this,
-				WorkingSetFilterActionGroup.CHANGE_WORKING_SET, null,
-				workingSet);
-		l.propertyChange(event);
-
-		//DisplayHelper.sleep(Display.getCurrent(), 10000000);
-
-		TreeItem[] items = viewer.getTree().getItems();
-		// The bug is here where the first item is a IFile, not the enclosing
-		// project
-		assertTrue("First item needs to be working set", items[0].getData().equals(
-				workingSet));
-	}
-
-	// bug 244174 test property to switch back and forth between working sets
-	// as top level and not
-	public void testTopLevelChange() throws Exception {
-
-		IProject p1 = ResourcesPlugin.getWorkspace().getRoot().getProject("p1");
-		p1.create(null);
-		p1.open(null);
-		IFile f1 = p1.getFile("f1");
-		f1.create(new ByteArrayInputStream(new byte[] {}), true, null);
-
-		IExtensionStateModel extensionStateModel = contentService
-				.findStateModel(WorkingSetsContentProvider.EXTENSION_ID);
-
-		// Force the content provider to be loaded so that it responds to the 
-		// working set events
-		INavigatorContentExtension ce = 
-				contentService.getContentExtensionById(WorkingSetsContentProvider.EXTENSION_ID);
-		ce.getContentProvider();
-		
-		IWorkingSet workingSet = new WorkingSet("ws1", "ws1",
-				new IAdaptable[] { p1 });
-
-		WorkingSetActionProvider provider = (WorkingSetActionProvider) TestAccessHelper
-		.getActionProvider(contentService, _actionService,
-				WorkingSetActionProvider.class);
-		IPropertyChangeListener l = provider.getFilterChangeListener();
-		PropertyChangeEvent event = new PropertyChangeEvent(this,
-				WorkingSetFilterActionGroup.CHANGE_WORKING_SET, null,
-				workingSet);
-		l.propertyChange(event);
-
-		IWorkbenchWindow activeWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-		IWorkbenchPage activePage = activeWindow.getActivePage();
-		activePage.setWorkingSets(new IWorkingSet[] {workingSet});
-
-		extensionStateModel.setBooleanProperty(
-				WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS, true);
-		viewer.refresh();
-
-		TreeItem[] items = viewer.getTree().getItems();
-
-		assertTrue("First item needs to be working set", items[0].getData().equals(
-				workingSet));
-
-		extensionStateModel.setBooleanProperty(
-				WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS, false);
-		viewer.refresh();
-
-		items = viewer.getTree().getItems();
-		assertTrue("First item needs to be project", items[0].getData().equals(
-				p1));
-
-		extensionStateModel.setBooleanProperty(
-				WorkingSetsContentProvider.SHOW_TOP_LEVEL_WORKING_SETS, true);
-		viewer.refresh();
-
-		items = viewer.getTree().getItems();
-		assertTrue("First item needs to be working set", items[0].getData().equals(
-				workingSet));
-
-	}
-
-	
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/DatContentProvider.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/DatContentProvider.java
deleted file mode 100644
index c2fd3c4..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/DatContentProvider.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.extension;
-
-import java.util.Set;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.navigator.ICommonContentExtensionSite;
-import org.eclipse.ui.navigator.PipelinedShapeModification;
-import org.eclipse.ui.navigator.PipelinedViewerUpdate;
-
-public class DatContentProvider implements ITreeContentProvider {
-	   
-	private TestExtensionTreeData child = new TestExtensionTreeData(null, "Child", null, null);
-
-	public Object[] getChildren(Object parentElement) { 
-		return new Object[] { child } ;
-	}
-
-	public Object getParent(Object element) { 
-		return null;
-	}
-
-	public boolean hasChildren(Object element) { 
-		return false;
-	}
-
-	public Object[] getElements(Object inputElement) { 
-		return null;
-	}
-
-	public void dispose() { 
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 
-	}
-
-	//
-	// IPipelinedTreeContentProvider (not currently implemented)
-	//
-	
-	public void getPipelinedChildren(Object parent, Set theCurrentChildren) {
-	}
-
-	public void getPipelinedElements(Object anInput, Set theCurrentElements) {
-	}
-
-	public Object getPipelinedParent(Object anObject, Object suggestedParent) {
-		return null;
-	}
-
-	public PipelinedShapeModification interceptAdd(
-			PipelinedShapeModification anAddModification) {
-		return null;
-	}
-
-	public boolean interceptRefresh(PipelinedViewerUpdate refreshSynchronization) {
-		return false;
-	}
-
-	public PipelinedShapeModification interceptRemove(
-			PipelinedShapeModification removeModification) {
-		return null;
-	}
-
-	public boolean interceptUpdate(PipelinedViewerUpdate anUpdateSynchronization) {
-		return false;
-	}
-
-	public void init(ICommonContentExtensionSite config) {
-
-	}
-
-	public void restoreState(IMemento memento) {
-		
-	}
-
-	public void saveState(IMemento memento) {
-		
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/DependentAction.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/DependentAction.java
deleted file mode 100644
index 8179ddc..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/DependentAction.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.extension;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Shell;
-
-public class DependentAction extends Action implements IAction {
- 
-	private Shell shell;
-
-	public DependentAction(Shell aShell, String isValid) {
-		super("Dependent Action: " + isValid);
-		shell = aShell;
-		
-	}
-	
-	public void run() {
-		MessageDialog.openInformation(shell, "DependentAction", "The dependent action ran!");
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/DependentActionProvider.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/DependentActionProvider.java
deleted file mode 100644
index 7415868..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/DependentActionProvider.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.extension;
-
-import junit.framework.Assert;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-
-public class DependentActionProvider extends CommonActionProvider {
-
-	private IAction action = null;
-	
-	public void init(ICommonActionExtensionSite aConfig) {
-		 action = new DependentAction(aConfig.getViewSite().getShell(), aConfig.getExtensionId());
-	}
-	
-	public void fillContextMenu(IMenuManager menu) { 
-		IMenuManager submenu = menu.findMenuUsingPath(TestActionProvider.GROUP_TEST_MENU);
-		Assert.assertNotNull("The submenu should have been added by TestActionProvider!", submenu);
-		submenu.insertAfter(TestActionProvider.GROUP_TEST_DEPENDENCY, action);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestAction.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestAction.java
deleted file mode 100644
index 2d4ba86..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestAction.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.extension;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Shell;
-
-public class TestAction extends Action implements IAction {
-
-	private Shell shell;
-
-	public TestAction(Shell aShell) {
-		super("Test Action");
-		shell = aShell;
-	}
-
-	public TestAction(Shell aShell, String label) {
-		super(label);
-		shell = aShell;
-	}
-
-	public void run() {
-		MessageDialog.openInformation(shell, "Shell", "The " + getText()
-				+ " ran!");
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestActionProvider.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestActionProvider.java
deleted file mode 100644
index b6547aa..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestActionProvider.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.extension;
-
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-import org.eclipse.ui.navigator.ICommonMenuConstants;
-
-public class TestActionProvider extends CommonActionProvider {
-
-	public static final String GROUP_TEST_MENU = "group.testMenu";
-
-	public static final String GROUP_TEST_DEPENDENCY = "group.testDependency";
-
-	private IAction action = null;
-
-	public void init(ICommonActionExtensionSite aSite) {
-		action = new TestAction(aSite.getViewSite().getShell());
-		
-
-	}
-
-	public void fillContextMenu(IMenuManager menu) {
-		IMenuManager submenu = new MenuManager("CN Test Menu", GROUP_TEST_MENU);
-		submenu.add(action);
-		submenu.add(new GroupMarker(GROUP_TEST_DEPENDENCY));
-		menu.insertAfter(ICommonMenuConstants.GROUP_REORGANIZE, submenu);
-	}
-
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestContentProvider.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestContentProvider.java
deleted file mode 100644
index 00e7a02..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestContentProvider.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.extension;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-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.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-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.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.progress.UIJob;
-
-public class TestContentProvider implements ITreeContentProvider,
-		IResourceChangeListener, IResourceDeltaVisitor {
-
-	private static final String MODEL_ROOT = "root";
-
-	private static final Object[] NO_CHILDREN = new Object[0];
-
-	private static final IPath MODEL_FILE_PATH = new Path("model.properties");
-
-	private final Map rootElements = new HashMap();
-
-	private StructuredViewer viewer;
-	
-	public TestContentProvider() {
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
-	}
-
-	public Object[] getChildren(Object parentElement) {
-		
-		
-		
-		if (parentElement instanceof TestExtensionTreeData) {
-			TestExtensionTreeData data = (TestExtensionTreeData) parentElement;
-			return data.getChildren();
-		} else {
-
-			IProject project = adaptToProject(parentElement);  
-			if (project != null && project.isAccessible()) {
-				IFile modelFile = project.getFile(MODEL_FILE_PATH);
-				if (rootElements.containsKey(modelFile)) {
-					TestExtensionTreeData model = (TestExtensionTreeData) rootElements
-							.get(modelFile);
-					return model != null ? model.getChildren() : NO_CHILDREN;
-				} else {
-					TestExtensionTreeData model = updateModel(modelFile);
-					return model != null ? model.getChildren() : NO_CHILDREN;
-				}
-			}
-		}  
-		return NO_CHILDREN;
-	}
-
-	/**
-	 * @param parentElement
-	 * @param class1
-	 * @return
-	 */
-	private IProject adaptToProject(Object parentElement) {
-		if(parentElement instanceof IProject)
-			return (IProject) parentElement;
-		else if(parentElement instanceof IAdaptable)
-			return (IProject) ((IAdaptable) parentElement).getAdapter(IProject.class);
-		else 
-			return (IProject) Platform.getAdapterManager().getAdapter(parentElement, IProject.class); 
-	}
-
-	/**
-	 * @param modelFile
-	 */
-	private TestExtensionTreeData updateModel(IFile modelFile) {
-		Properties model = new Properties();
-		if (modelFile.exists()) {
-			try {
-				InputStream is = modelFile.getContents();
-				model.load(is);
-				is.close();
-				TestExtensionTreeData root = new TestExtensionTreeData(null,
-						MODEL_ROOT, model, modelFile);
-				rootElements.put(modelFile, root);
-				return root;
-			} catch (IOException e) {
-			} catch (CoreException e) {
-			}
-		} else {
-			rootElements.remove(modelFile);
-		}
-		return null;
-
-	}
-
-	public Object getParent(Object element) {
-		if (element instanceof TestExtensionTreeData) {
-			TestExtensionTreeData data = (TestExtensionTreeData) element;
-			return data.getParent();
-		}
-		return null;
-	}
-
-	public boolean hasChildren(Object element) {
-		if (element instanceof TestExtensionTreeData) {
-			TestExtensionTreeData data = (TestExtensionTreeData) element;
-			return data.getChildren().length > 0;
-		}
-		return false;
-	}
-
-	public Object[] getElements(Object inputElement) {
-		return getChildren(inputElement);
-	}
-
-	public void dispose() {
-		rootElements.clear();
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-
-	}
-
-	public void inputChanged(Viewer aViewer, Object oldInput, Object newInput) {
-		if (oldInput != null && !oldInput.equals(newInput))
-			rootElements.clear();
-		viewer = (StructuredViewer)aViewer;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-
-		IResourceDelta delta = event.getDelta();
-		try {
-			delta.accept(this);
-		} catch (CoreException e) { 
-			e.printStackTrace();
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-	 */
-	public boolean visit(IResourceDelta delta) throws CoreException {
-
-		IResource source = delta.getResource();
-		switch (source.getType()) {
-		case IResource.ROOT:
-		case IResource.PROJECT:
-		case IResource.FOLDER:
-			return true;
-		case IResource.FILE:
-			final IFile file = (IFile) source;
-			if ("model.properties".equals(file.getName())) {
-				updateModel(file);
-				new UIJob("Update Test Model in CommonViewer") {
-					public IStatus runInUIThread(IProgressMonitor monitor) {
-						if (viewer != null && !viewer.getControl().isDisposed())
-							viewer.refresh(file.getParent());
-						return Status.OK_STATUS;						
-					}
-				}.schedule();
-			}
-			return false;
-		}
-		return false;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestDataSorter.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestDataSorter.java
deleted file mode 100644
index c5776a1..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestDataSorter.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.extension;
-
-import java.text.Collator;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-
-public class TestDataSorter extends ViewerSorter {
-
-	public TestDataSorter() {
-		super(); 
-	}
-
-	public TestDataSorter(Collator collator) {
-		super(collator); 
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Viewer viewer, Object e1, Object e2) {
-	
-		if(e1 instanceof TestExtensionTreeData) {
-			if(e2 instanceof TestExtensionTreeData) {
-				TestExtensionTreeData lvalue = (TestExtensionTreeData) e1;
-				TestExtensionTreeData rvalue = (TestExtensionTreeData) e2;
-				
-				return lvalue.getName().compareTo(rvalue.getName());
-			}
-			return -1;
-		} else if(e2 instanceof TestExtensionTreeData) {
-			return +1;
-		}
-		
-		return super.compare(viewer, e1, e2);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestExtensionAdapterFactory.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestExtensionAdapterFactory.java
deleted file mode 100644
index 56109bd..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestExtensionAdapterFactory.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.extension;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdapterFactory;
-
-public class TestExtensionAdapterFactory implements IAdapterFactory {
-	
-	private static final Class IRESOURCE_TYPE = IResource.class;
-	private static final Class IFILE_TYPE = IFile.class;
-
-	private static final Class[] ADAPTED_TYPES = new Class[] { IRESOURCE_TYPE, IFILE_TYPE };
-
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		 if(IRESOURCE_TYPE == adapterType || IFILE_TYPE == adapterType) {
-			 TestExtensionTreeData data = (TestExtensionTreeData) adaptableObject;
-			 return data.getFile();
-		 }
-		 return null;
-	}
-
-	public Class[] getAdapterList() { 
-		return ADAPTED_TYPES;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestExtensionTreeData.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestExtensionTreeData.java
deleted file mode 100644
index 1e6f0bd..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestExtensionTreeData.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.extension;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-
-public class TestExtensionTreeData {
-
-	private final Map children = new HashMap();
-
-	private TestExtensionTreeData parent;
-
-	private String name;
-
-	private Properties model;
-
-	private IFile container;
-
-	public TestExtensionTreeData(TestExtensionTreeData aParent, String aName,
-			Properties theModel, IFile aFile) {
-		parent = aParent;
-		name = aName;
-		model = theModel;
-		container = aFile;
-	}
-
-	public TestExtensionTreeData getParent() {
-		return parent;
-	}
-
-	public TestExtensionTreeData[] getChildren() {
-		Set updatedChildren = new HashSet();
-		String childrenString = model.getProperty(getName());
-		if (childrenString != null) {
-			String[] childrenElements = childrenString.split(",");
-			for (int i = 0; i < childrenElements.length; i++) {
-				if (children.containsKey(childrenElements[i])) {
-					updatedChildren.add(children.get(childrenElements[i]));
-				} else {
-					TestExtensionTreeData newChild = new TestExtensionTreeData(
-							this, childrenElements[i], model, container);
-					children.put(newChild.getName(), newChild);
-					updatedChildren.add(newChild);
-				}
-			}
-		}
-		return (TestExtensionTreeData[]) updatedChildren
-				.toArray(new TestExtensionTreeData[updatedChildren.size()]);
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public int hashCode() {
-		return name.hashCode();
-	}
-
-	public boolean equals(Object obj) {
-		return obj instanceof TestExtensionTreeData
-				&& ((TestExtensionTreeData) obj).getName().equals(name);
-	}
-
-	public String toString() {
-		StringBuffer toString = new StringBuffer(getName()).append(":");
-
-		toString.append("[");
-		// update local children to remove any stale kids
-		for (Iterator childIterator = children.keySet().iterator(); childIterator
-				.hasNext();) {
-			String childName = (String) childIterator.next();
-			TestExtensionTreeData child = (TestExtensionTreeData) children
-					.get(childName);
-			toString.append(child.toString());
-		}
-		toString.append("]");
-		return toString.toString();
-	}
-
-	/**
-	 * @return
-	 */
-	public IFile getFile() { 
-		return container;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestItemsThatEndIn3.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestItemsThatEndIn3.java
deleted file mode 100644
index 3917989..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestItemsThatEndIn3.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.navigator.extension;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-/**
- * @since 3.2
- *
- */
-public class TestItemsThatEndIn3 extends ViewerFilter {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public boolean select(Viewer viewer, Object parentElement, Object element) {
-
-		if(element instanceof TestExtensionTreeData) {
-			TestExtensionTreeData data = (TestExtensionTreeData)element;
-			return (data.getName() != null && !data.getName().endsWith("3"));
-		}
-		return true;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelDecorator.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelDecorator.java
deleted file mode 100644
index 1ea6c01..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelDecorator.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.extension;
-
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-public class TestLabelDecorator implements ILabelDecorator {
-	
-	/**
-	 * 
-	 */
-	public TestLabelDecorator() {
-		
-	}
-
-	public Image decorateImage(Image image, Object element) { 
-		if(element != null && element instanceof TestExtensionTreeData) {
-			TestExtensionTreeData data = (TestExtensionTreeData) element;
-			if(data.getName().endsWith("3")) {
-				return PlatformUI.getWorkbench().getSharedImages().getImage(
-						ISharedImages.IMG_OBJS_INFO_TSK);
-			}
-		}
-		return null;
-	}
-
-	public String decorateText(String text, Object element) { 
-		if(element instanceof TestExtensionTreeData) {
-			
-			if(text != null && text.endsWith("3")) {
-				return "x " + text + " x";
-			}
-		}
-		return null;
-	}
-
-	public void addListener(ILabelProviderListener listener) {
-		// no-op
-
-	}
-
-	public void dispose() {
-		// no-op
-
-	}
-
-	public boolean isLabelProperty(Object element, String property) {
-		return true;
-	}
-
-	public void removeListener(ILabelProviderListener listener) {
-		// no-op
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProvider.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProvider.java
deleted file mode 100644
index 9d63e0f..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProvider.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.extension;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.navigator.ICommonContentExtensionSite;
-import org.eclipse.ui.navigator.ICommonLabelProvider;
-import org.eclipse.ui.navigator.IDescriptionProvider;
-
-public abstract class TestLabelProvider extends LabelProvider implements
-		ICommonLabelProvider, IDescriptionProvider, IColorProvider,
-		IFontProvider {
-
-	private FontData boldFontData = new FontData();
-
-	private Font boldFont;
-
-	public void init(ICommonContentExtensionSite aSite) {
-		boldFontData.setStyle(SWT.BOLD);
-		boldFont = new Font(Display.getDefault(), boldFontData);
-	}
-
-	protected String getColorName() {
-		return "";
-	}
-
-	public Image getImage(Object element) {
-		if (element instanceof TestExtensionTreeData)
-			return PlatformUI.getWorkbench().getSharedImages().getImage(
-					ISharedImages.IMG_OBJ_ELEMENT);
-		return null;
-	}
-
-	public String getText(Object element) {
-		if (element instanceof TestExtensionTreeData) {
-			TestExtensionTreeData data = (TestExtensionTreeData) element;
-			return getColorName() + data.getName();
-		}
-		if (element instanceof IResource) {
-			return getColorName() + ((IResource) element).getName();
-		}
-		return null;
-	}
-
-	public String getDescription(Object anElement) {
-		if (anElement instanceof TestExtensionTreeData) {
-			TestExtensionTreeData data = (TestExtensionTreeData) anElement;
-			return "TestItem: " + data.getName();
-		}
-		return null;
-	}
-
-	public void restoreState(IMemento aMemento) {
-
-	}
-
-	public void saveState(IMemento aMemento) {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-	 */
-	public Color getForeground(Object element) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-	 */
-	public Font getFont(Object element) {
-		if (element instanceof TestExtensionTreeData) {
-			TestExtensionTreeData data = (TestExtensionTreeData) element;
-			if (data.getParent() != null
-					&& data.getParent().getParent() == null)
-				return boldFont;
-		}
-		return null;
-	}
-
-	public void dispose() {
-		final Font f = boldFont;
-		final Color c = getBackground(null);
-		boldFont = null;
-		Display.getCurrent().timerExec(20, new Runnable() {
-			public void run() {
-				f.dispose();
-				c.dispose();
-			}
-		});
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProviderBlue.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProviderBlue.java
deleted file mode 100644
index 043862a..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProviderBlue.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oakland Software Incorporated and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oakland Software Incorporated - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.navigator.extension;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 3.3
- *
- */
-public class TestLabelProviderBlue extends TestLabelProvider {
-
-	public static Color backgroundColor = Display.getCurrent().getSystemColor(
-			SWT.COLOR_BLUE);
-	
-	public static Color getTestColor() {
-		return backgroundColor;
-	}
-	public Color getBackground(Object element) {
-		return backgroundColor;
-	}
-
-	public String getColorName() {
-		return "Blue";
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProviderCyan.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProviderCyan.java
deleted file mode 100644
index 4babee1..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProviderCyan.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oakland Software Incorporated and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oakland Software Incorporated - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.navigator.extension;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 3.3
- *
- */
-public class TestLabelProviderCyan extends TestLabelProvider {
-
-	public static Color backgroundColor = Display.getCurrent().getSystemColor(
-			SWT.COLOR_CYAN);
-	
-	public static Color getTestColor() {
-		return backgroundColor;
-	}
-	public Color getBackground(Object element) {
-		return backgroundColor;
-	}
-
-	public String getColorName() {
-		return "Cyan";
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProviderGreen.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProviderGreen.java
deleted file mode 100644
index 1788fee..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProviderGreen.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oakland Software Incorporated and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oakland Software Incorporated - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.navigator.extension;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 3.3
- *
- */
-public class TestLabelProviderGreen extends TestLabelProvider {
-
-	public static Color backgroundColor = Display.getCurrent().getSystemColor(
-			SWT.COLOR_GREEN);
-	
-	public static Color getTestColor() {
-		return backgroundColor;
-	}
-	public Color getBackground(Object element) {
-		return backgroundColor;
-	}
-
-	public String getColorName() {
-		return "Green";
-	}
-
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProviderRed.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProviderRed.java
deleted file mode 100644
index e65699a..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestLabelProviderRed.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oakland Software Incorporated and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oakland Software Incorporated - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.navigator.extension;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @since 3.3
- *
- */
-public class TestLabelProviderRed extends TestLabelProvider {
-
-	public static Color backgroundColor = Display.getCurrent().getSystemColor(
-			SWT.COLOR_RED);
-	
-	public static Color getTestColor() {
-		return backgroundColor;
-	}
-	public Color getBackground(Object element) {
-		return backgroundColor;
-	}
-
-	public String getColorName() {
-		return "Red";
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestNestedActionProvider.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestNestedActionProvider.java
deleted file mode 100644
index 4a6b6a7..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestNestedActionProvider.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.extension;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionConstants;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-import org.eclipse.ui.navigator.ICommonMenuConstants;
-import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
-
-public class TestNestedActionProvider extends CommonActionProvider {
-
-	public static final String GROUP_TEST_MENU = "group.testMenu";
-
-	public static final String GROUP_TEST_DEPENDENCY = "group.testDependency";
-
-	private IAction action = null;
-
-	private IAction openAction;
-
-	private ICommonActionExtensionSite site;
-
-	public void init(ICommonActionExtensionSite aSite) {
-		site = aSite;
-		action = new TestAction(aSite.getViewSite().getShell(),
-				"Nested action (only visible if test ext active)");
-
-		openAction = new Action() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.action.Action#run()
-			 */
-			public void run() {
-
-				IStructuredSelection selection = (IStructuredSelection) getContext()
-						.getSelection();
-				if (selection.size() == 1) {
-					TestExtensionTreeData data = (TestExtensionTreeData) selection
-							.getFirstElement();
-					((TreeViewer) site.getStructuredViewer()).setExpandedState(
-							data, true);
-					try {
-						IDE
-								.openEditor(((ICommonViewerWorkbenchSite) site
-										.getViewSite()).getPage(), data
-										.getFile(), true);
-					} catch (PartInitException e) {
-						e.printStackTrace();
-					}
-				}
-			}
-		};
-	}
-
-	public void fillContextMenu(IMenuManager menu) {
-		menu.insertAfter(ICommonMenuConstants.GROUP_ADDITIONS, action);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillActionBars(org.eclipse.ui.IActionBars)
-	 */
-	public void fillActionBars(IActionBars actionBars) {
-		super.fillActionBars(actionBars);
-		
-		actionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, openAction);
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestOverrideableActionProvider.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestOverrideableActionProvider.java
deleted file mode 100755
index fe33d0f..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/extension/TestOverrideableActionProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.extension;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.ui.navigator.CommonActionProvider;
-import org.eclipse.ui.navigator.ICommonActionExtensionSite;
-
-public class TestOverrideableActionProvider extends CommonActionProvider {
-	
-	private IAction action;
-
-	public TestOverrideableActionProvider() { 
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.navigator.CommonActionProvider#init(org.eclipse.ui.navigator.ICommonActionExtensionSite)
-	 */
-	public void init(ICommonActionExtensionSite site) { 
-
-		action = new Action() {
-			
-		}; 
-		action.setText(site.getExtensionId());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) { 		 
-		menu.add(action);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/util/ProjectUnzipUtil.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/util/ProjectUnzipUtil.java
deleted file mode 100644
index 3e24761..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/util/ProjectUnzipUtil.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.util;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.ui.tests.navigator.NavigatorTestsPlugin;
-
-public class ProjectUnzipUtil {
-
-	private IPath zipLocation;
-	private String[] projectNames;
-	private IPath rootLocation = ResourcesPlugin.getWorkspace().getRoot().getLocation();
-	private static final String META_PROJECT_NAME = ".project"; //$NON-NLS-1$
-
-	public ProjectUnzipUtil(IPath aLocalZipFilePath, String[] aProjectNames) {
-		zipLocation = getLocalPath(aLocalZipFilePath);
-		projectNames = aProjectNames;
-
-	}
-
-	public IPath getLocalPath(IPath zipFilePath) {
-		URL url = FileLocator.find(NavigatorTestsPlugin.getDefault().getBundle(), zipFilePath, null);
-		try {
-			url = FileLocator.toFileURL(url);
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		return new Path(url.getPath());
-	}
-
-	public boolean createProjects() {
-		try {
-			expandZip();
-			ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, null);
-			buildProjects();
-		} catch (CoreException e) {
-			e.printStackTrace();
-			return false;
-		} catch (IOException e) {
-			e.printStackTrace();
-			return false;
-		}
-
-		return true;
-	}
-
-	public boolean reset() {
-		try {
-			expandZip();
-			ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, null);
-		} catch (CoreException e) {
-			e.printStackTrace();
-			return false;
-		} catch (IOException e) {
-			e.printStackTrace();
-			return false;
-		}
-
-		return true;
-	}
-
-	private IProgressMonitor getProgessMonitor() {
-		return new NullProgressMonitor();
-	}
-
-	private void expandZip() throws CoreException, IOException {
-		IProgressMonitor monitor = getProgessMonitor();
-		ZipFile zipFile = null;
-		try {
-			zipFile = new ZipFile(zipLocation.toFile());
-		} catch (IOException e1) {
-			throw e1;
-		}
-		Enumeration entries = zipFile.entries();
-		while (entries.hasMoreElements()) {
-			ZipEntry entry = (ZipEntry) entries.nextElement();
-			monitor.subTask(entry.getName());
-			File aFile = computeLocation(entry.getName()).toFile();
-			File parentFile = null;
-			try {
-				if (entry.isDirectory()) {
-					aFile.mkdirs();
-				} else {
-					parentFile = aFile.getParentFile();
-					if (!parentFile.exists())
-						parentFile.mkdirs();
-					if (!aFile.exists())
-						aFile.createNewFile();
-					copy(zipFile.getInputStream(entry), new FileOutputStream(aFile));
-					if (entry.getTime() > 0)
-						aFile.setLastModified(entry.getTime());
-				}
-			} catch (IOException e) {
-				throw e;
-			}
-			monitor.worked(1);
-		}
-	}
-
-	private IPath computeLocation(String name) {
-		return rootLocation.append(name);
-	}
-
-	public static void copy(InputStream in, OutputStream out) throws IOException {
-		byte[] buffer = new byte[1024];
-		try {
-			int n = in.read(buffer);
-			while (n > 0) {
-				out.write(buffer, 0, n);
-				n = in.read(buffer);
-			}
-		} finally {
-			in.close();
-			out.close();
-		}
-	}
-
-	public void setRootLocation(IPath rootLocation) {
-		this.rootLocation = rootLocation;
-	}
-
-	private void buildProjects() throws IOException, CoreException {
-		for (int i = 0; i < projectNames.length; i++) {
-
-			IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-			IPath projectPath = new Path("/" + projectNames[i] + "/" + META_PROJECT_NAME); //$NON-NLS-1$//$NON-NLS-2$
-			IPath path = rootLocation.append(projectPath);
-			IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectNames[i]);
-			IProjectDescription description = workspace.loadProjectDescription(path);
-			project.create(description, (getProgessMonitor()));
-			project.open(getProgessMonitor());
-
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/util/TestWorkspace.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/util/TestWorkspace.java
deleted file mode 100644
index 4f6bdfe..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/util/TestWorkspace.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others. All rights reserved. This program and the
- * accompanying materials are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.ui.tests.navigator.util;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-
-public class TestWorkspace {
-	public static final String TEST_PROJECT_NAME= "Test"; //$NON-NLS-1$
-
-	private static final String TEST_TESTDATA= "/testdata/Test.zip"; //$NON-NLS-1$
-
-
-	public static void init() {
-
-		// setup test resource project
-		ProjectUnzipUtil util= new ProjectUnzipUtil(new Path(TEST_TESTDATA), new String[]{TEST_PROJECT_NAME});
-
-		if (!getTestProject().isAccessible()) {
-			util.createProjects();
-		} else {
-			util.reset();
-		}
-
-	}
-
-	public static IProject getTestProject() {
-		return ResourcesPlugin.getWorkspace().getRoot().getProject(TEST_PROJECT_NAME);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/wizards/ExportWizard1.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/wizards/ExportWizard1.java
deleted file mode 100644
index 8f5ae87..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/wizards/ExportWizard1.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.wizards;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.IExportWizard;
-import org.eclipse.ui.IWorkbench;
-/**
- * Does nothing. Used to test the Capability-awareness of the <b>commonWizard</b> extension.
- * 
- * @since 3.2
- *
- */
-public class ExportWizard1 extends Wizard implements IExportWizard {
-
-	public ExportWizard1() { 
-	}
-
-	public boolean performFinish() { 
-		return false;
-	}
-
-	public void init(IWorkbench workbench, IStructuredSelection selection) { 
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/wizards/ImportWizard1.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/wizards/ImportWizard1.java
deleted file mode 100644
index a8f346a..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/wizards/ImportWizard1.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.wizards;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.IImportWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * Does nothing. Used to test the Capability-awareness of the <b>commonWizard</b> extension.
- * 
- * @since 3.2
- *
- */
-public class ImportWizard1 extends Wizard implements IImportWizard {
-
-	public ImportWizard1() { 
-	}
- 
-	public boolean performFinish() { 
-		return false;
-	}
-
-	public void init(IWorkbench workbench, IStructuredSelection selection) { 
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/wizards/NewWizard1.java b/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/wizards/NewWizard1.java
deleted file mode 100644
index f5e6746..0000000
--- a/tests/org.eclipse.ui.tests.navigator/src/org/eclipse/ui/tests/navigator/wizards/NewWizard1.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator.wizards;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * Does nothing. Used to test the Capability-awareness of the <b>commonWizard</b> extension.
- * 
- * @since 3.2
- *
- */
-public class NewWizard1 extends Wizard implements INewWizard {
-
-	public NewWizard1() { 
-	}
- 
-	public boolean performFinish() { 
-		return false;
-	}
-
-	public void init(IWorkbench workbench, IStructuredSelection selection) { 
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.navigator/test.xml b/tests/org.eclipse.ui.tests.navigator/test.xml
deleted file mode 100644
index a1b2a7a..0000000
--- a/tests/org.eclipse.ui.tests.navigator/test.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0"?>
-
-<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.ui.tests.navigator"/>
-  <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="sniff-folder"
-              value="${eclipse-home}/navigator_sniff_folder"/>
-    <delete dir="${sniff-folder}" quiet="true"/>
-    <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${sniff-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname"
-                value="org.eclipse.ui.tests.navigator.NavigatorTestSuite"/>
-    </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/tests/org.eclipse.ui.tests.navigator/testdata/Test.zip b/tests/org.eclipse.ui.tests.navigator/testdata/Test.zip
deleted file mode 100644
index fc36e6e..0000000
--- a/tests/org.eclipse.ui.tests.navigator/testdata/Test.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.performance/.classpath b/tests/org.eclipse.ui.tests.performance/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/tests/org.eclipse.ui.tests.performance/.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/tests/org.eclipse.ui.tests.performance/.cvsignore b/tests/org.eclipse.ui.tests.performance/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/tests/org.eclipse.ui.tests.performance/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/tests/org.eclipse.ui.tests.performance/.project b/tests/org.eclipse.ui.tests.performance/.project
deleted file mode 100644
index 394eac0..0000000
--- a/tests/org.eclipse.ui.tests.performance/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.tests.performance</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/tests/org.eclipse.ui.tests.performance/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.ui.tests.performance/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100755
index 141bae8..0000000
--- a/tests/org.eclipse.ui.tests.performance/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,70 +0,0 @@
-#Fri Mar 03 16:41:54 EST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=disabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=ignore
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=private
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/tests/org.eclipse.ui.tests.performance/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.ui.tests.performance/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100755
index 61158fa..0000000
--- a/tests/org.eclipse.ui.tests.performance/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Tue Sep 12 09:00:30 EDT 2006
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.3\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template></templates>
diff --git a/tests/org.eclipse.ui.tests.performance/.settings/org.eclipse.pde.prefs b/tests/org.eclipse.ui.tests.performance/.settings/org.eclipse.pde.prefs
deleted file mode 100755
index 883666b..0000000
--- a/tests/org.eclipse.ui.tests.performance/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,14 +0,0 @@
-#Mon Feb 21 14:17:36 EST 2005
-compilers.p.deprecated=2
-compilers.p.illegal-att-value=0
-compilers.p.no-required-att=1
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/tests/org.eclipse.ui.tests.performance/META-INF/MANIFEST.MF b/tests/org.eclipse.ui.tests.performance/META-INF/MANIFEST.MF
deleted file mode 100644
index 854d3ee..0000000
--- a/tests/org.eclipse.ui.tests.performance/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,21 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Performance Plug-in
-Bundle-ClassPath: uiperformance.jar
-Bundle-SymbolicName: org.eclipse.ui.tests.performance;singleton:=true
-Bundle-Version: 1.1.0.qualifier
-Bundle-Activator: org.eclipse.ui.tests.performance.UIPerformancePlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.core.tests.harness,
- org.junit,
- org.eclipse.test.performance,
- org.eclipse.core.resources,
- org.eclipse.ui.tests.harness,
- org.eclipse.ui.ide,
- org.eclipse.jface.text,
- org.eclipse.ui.editors,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.ui.views
-Eclipse-LazyStart: true
diff --git a/tests/org.eclipse.ui.tests.performance/about.html b/tests/org.eclipse.ui.tests.performance/about.html
deleted file mode 100644
index 4602330..0000000
--- a/tests/org.eclipse.ui.tests.performance/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.performance/build.properties b/tests/org.eclipse.ui.tests.performance/build.properties
deleted file mode 100644
index 63d086f..0000000
--- a/tests/org.eclipse.ui.tests.performance/build.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.uiperformance.jar = src/
-bin.includes = META-INF/,\
-               *.xml,\
-               icons/,\
-               uiperformance.jar
diff --git a/tests/org.eclipse.ui.tests.performance/data/testContentType.zip b/tests/org.eclipse.ui.tests.performance/data/testContentType.zip
deleted file mode 100644
index 14e323b..0000000
--- a/tests/org.eclipse.ui.tests.performance/data/testContentType.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.performance/icons/anything.gif b/tests/org.eclipse.ui.tests.performance/icons/anything.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests.performance/icons/anything.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.performance/icons/binary_co.gif b/tests/org.eclipse.ui.tests.performance/icons/binary_co.gif
deleted file mode 100644
index 23a508e..0000000
--- a/tests/org.eclipse.ui.tests.performance/icons/binary_co.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.performance/icons/dynamic.gif b/tests/org.eclipse.ui.tests.performance/icons/dynamic.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests.performance/icons/dynamic.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.performance/icons/editor.gif b/tests/org.eclipse.ui.tests.performance/icons/editor.gif
deleted file mode 100644
index 9bd92bf..0000000
--- a/tests/org.eclipse.ui.tests.performance/icons/editor.gif
+++ /dev/null
@@ -1 +0,0 @@
-GIF89a
diff --git a/tests/org.eclipse.ui.tests.performance/icons/imagetests/anything.gif b/tests/org.eclipse.ui.tests.performance/icons/imagetests/anything.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests.performance/icons/imagetests/anything.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.performance/icons/imagetests/binary_co.gif b/tests/org.eclipse.ui.tests.performance/icons/imagetests/binary_co.gif
deleted file mode 100644
index 23a508e..0000000
--- a/tests/org.eclipse.ui.tests.performance/icons/imagetests/binary_co.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.performance/icons/imagetests/dynamic.gif b/tests/org.eclipse.ui.tests.performance/icons/imagetests/dynamic.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests.performance/icons/imagetests/dynamic.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.performance/icons/imagetests/editor.gif b/tests/org.eclipse.ui.tests.performance/icons/imagetests/editor.gif
deleted file mode 100644
index 9bd92bf..0000000
--- a/tests/org.eclipse.ui.tests.performance/icons/imagetests/editor.gif
+++ /dev/null
@@ -1 +0,0 @@
-GIF89a
diff --git a/tests/org.eclipse.ui.tests.performance/icons/imagetests/mockeditorpart1.gif b/tests/org.eclipse.ui.tests.performance/icons/imagetests/mockeditorpart1.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests.performance/icons/imagetests/mockeditorpart1.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.performance/icons/imagetests/mockeditorpart2.gif b/tests/org.eclipse.ui.tests.performance/icons/imagetests/mockeditorpart2.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests.performance/icons/imagetests/mockeditorpart2.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.performance/icons/imagetests/view.gif b/tests/org.eclipse.ui.tests.performance/icons/imagetests/view.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests.performance/icons/imagetests/view.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.performance/icons/mockeditorpart1.gif b/tests/org.eclipse.ui.tests.performance/icons/mockeditorpart1.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests.performance/icons/mockeditorpart1.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.performance/icons/mockeditorpart2.gif b/tests/org.eclipse.ui.tests.performance/icons/mockeditorpart2.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests.performance/icons/mockeditorpart2.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.performance/icons/view.gif b/tests/org.eclipse.ui.tests.performance/icons/view.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests.performance/icons/view.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.performance/plugin.xml b/tests/org.eclipse.ui.tests.performance/plugin.xml
deleted file mode 100644
index 0a69f05..0000000
--- a/tests/org.eclipse.ui.tests.performance/plugin.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-     
-   <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            icon="icons/anything.gif"
-            class="org.eclipse.ui.tests.performance.parts.PerformanceEditorPart"
-            default="true"
-            name="Basic Performance Editor"
-            id="org.eclipse.ui.tests.perf_basic"
-            extensions="perf_basic"/>
-            
-      <editor
-            icon="icons/anything.gif"
-            class="org.eclipse.ui.tests.performance.parts.PerformanceEditorPart:outline"
-            default="true"
-            name="Editor w/Outline"
-            id="org.eclipse.ui.tests.perf_outline"
-            extensions="perf_outline"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            class="org.eclipse.ui.tests.performance.PerformancePerspective1"
-            name="Performance Test Perspective1"
-            id="org.eclipse.ui.tests.performancePerspective1"/>
-      <perspective
-            class="org.eclipse.ui.tests.performance.PerformancePerspective2"
-            name="Performance Test Perspective"
-            id="org.eclipse.ui.tests.performancePerspective2"/>    
-       <perspective
-            name="UI Test Standalone View Perspective"
-            class="org.eclipse.ui.tests.performance.presentations.StandaloneViewPerspective"
-            id="org.eclipse.ui.tests.presentations.StandaloneViewPerspective">
-      </perspective>
-      <perspective
-            name="UI Test Standalone View Perspective  2 "
-            class="org.eclipse.ui.tests.performance.presentations.StandaloneViewPerspective2"
-            id="org.eclipse.ui.tests.presentations.StandaloneViewPerspective2">
-      </perspective>        
-   </extension>
-    <extension
-          point="org.eclipse.ui.views">
-       <view
-             icon="icons/anything.gif"
-             class="org.eclipse.ui.tests.performance.parts.PerformanceViewPart"
-             name="Basic Performance View"
-             id="org.eclipse.ui.tests.perf_basic"/>
-    </extension>
-   <!-- 
-   this content type was added to provide
-   "regression test" for bug 107121. See OpenNavigatorFolderTest
-   for more details. 
-   -->
-   <extension point="org.eclipse.core.runtime.contentTypes">
-   	<content-type 
-   		file-extensions="htmltestonly" 
-   		priority="high"
-   		name="Content Type for Test Only" 
-   		id="testOnlyContentType"
-   		base-type="org.eclipse.core.runtime.text">
-   		<describer
-   			class="org.eclipse.ui.tests.performance.ContentDescriberForTestsOnly" />
-   	</content-type>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            class="org.eclipse.ui.tests.performance.parts.PerformanceProblemsView"
-            id="org.eclipse.ui.tests.performance.problemsView"
-            name="Performance Problems View"/>
-   </extension>
-    
- 
-</plugin>
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/CollatorPerformanceTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/CollatorPerformanceTest.java
deleted file mode 100644
index 31b1659..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/CollatorPerformanceTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.performance;
-
-import java.util.Arrays;
-import java.util.Comparator;
-
-import org.eclipse.jface.util.Policy;
-import org.eclipse.ui.tests.performance.BasicPerformanceTest;
-
-/**
- * @since 3.5
- *
- */
-public class CollatorPerformanceTest extends BasicPerformanceTest {
-
-	private static final int ARRAYSIZE=100000; 
-	private static String[] fArray;
-	
-	/**
-	 * @param testName
-	 */
-	public CollatorPerformanceTest (String testName) {
-		super(testName);
-		generateArray();
-	}
-	
-	/**
-	 *  test Collator by sorting the array
-	 */
-	public void testCollator(){
-		Comparator comparator=Policy.getComparator();
-		for (int i = 0; i <250; i++) {
-			String[] array=(String[]) fArray.clone();
-			startMeasuring();
-			Arrays.sort(array, comparator);
-			stopMeasuring();
-		}
-        commitMeasurements();
-        assertPerformance();
-	}
-	
-	/**
-	 * Generate a large sized array for sorting
-	 */
-	private void generateArray() {
-		if(fArray==null){
-			fArray=new String[ARRAYSIZE];
-			int count=ARRAYSIZE-1;
-			while(count>=0){
-				for (int i = 0; i < 26; i++) {
-					for (int j = 0; j < 26; j++) {
-						for (int k = 0; k < 26; k++) {
-							if(count<0)return;
-							if(k%2==0)
-							fArray[count]=new String(new char[]{
-									(char) (i+'a'),(char) (j+'A'),(char) (k+'a')
-							});
-							else if(k%3==0)
-								fArray[count]=new String(new char[]{
-										(char) (i+'a'),(char) (j+'a'),(char) (k+'A')
-							});
-							else
-								fArray[count]=new String(new char[]{
-										(char) (i+'A'),(char) (j+'a'),(char) (k+'a')
-								});
-							--count;
-						}
-						
-					}
-				}
-				
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ComboViewerRefreshTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ComboViewerRefreshTest.java
deleted file mode 100644
index 6b85bb2..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ComboViewerRefreshTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.tests.performance;
-
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.tests.performance.TestRunnable;
-
-/**
- * ComboViewerRefreshTest is a test of refreshes of difference size in the combo
- * viewer.
- */
-public class ComboViewerRefreshTest extends ViewerTest {
-
-	ComboViewer viewer;
-
-	private RefreshTestContentProvider contentProvider;
-
-	private static int ELEMENT_COUNT;
-
-	public ComboViewerRefreshTest(String testName, int tagging) {
-		super(testName, tagging);
-
-	}
-
-	public ComboViewerRefreshTest(String testName) {
-		super(testName);
-
-	}
-
-	protected StructuredViewer createViewer(Shell shell) {
-
-		viewer = new ComboViewer(shell);
-		contentProvider = new RefreshTestContentProvider(ELEMENT_COUNT);
-		viewer.setContentProvider(contentProvider);
-		viewer.setLabelProvider(getLabelProvider());
-		return viewer;
-	}
-
-	/**
-	 * Test the time for doing a refresh.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testRefresh() throws Throwable {
-
-		setDegradationComment("<a href=https://bugs.eclipse.org/bugs/show_bug.cgi?id=98265>See Bug 98265</a> ");
-		ELEMENT_COUNT = 1000;
-		openBrowser();
-
-		exercise(new TestRunnable() {
-			public void run() {
-				startMeasuring();
-				viewer.refresh();
-				processEvents();
-				stopMeasuring();
-			}
-		}, MIN_ITERATIONS, ITERATIONS, JFacePerformanceSuite.MAX_TIME);
-
-		commitMeasurements();
-		assertPerformance();
-	}
-
-	/**
-	 * Test the time for doing a refresh.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testRefreshSmall() throws Throwable {
-
-		setDegradationComment("<a href=https://bugs.eclipse.org/bugs/show_bug.cgi?id=98265>See Bug 98265</a> ");
-
-		ELEMENT_COUNT = 50;
-		openBrowser();
-
-		exercise(new TestRunnable() {
-			public void run() {
-				startMeasuring();
-				for (int i = 0; i < 1000; i++) {
-					viewer.refresh();
-				}
-				processEvents();
-				stopMeasuring();
-			}
-		}, MIN_ITERATIONS, slowGTKIterations(), JFacePerformanceSuite.MAX_TIME);
-
-		commitMeasurements();
-		assertPerformance();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/FastTableViewerRefreshTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/FastTableViewerRefreshTest.java
deleted file mode 100644
index 017ff6a..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/FastTableViewerRefreshTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.performance;
-
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.tests.performance.TestRunnable;
-
-public class FastTableViewerRefreshTest extends TableViewerRefreshTest {
-
-	public FastTableViewerRefreshTest(String testName, int tagging) {
-		super(testName, tagging);
-	}
-
-	public FastTableViewerRefreshTest(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Test the time for doing a refresh.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testRefreshMultiple() throws Throwable {
-		openBrowser();
-
-		exercise(new TestRunnable() {
-			public void run() {
-				startMeasuring();
-				for (int i = 0; i < 10; i++) {
-					viewer.refresh();
-					processEvents();
-
-				}
-				stopMeasuring();
-			}
-		}, MIN_ITERATIONS, slowGTKIterations(),
-				JFacePerformanceSuite.MAX_TIME);
-
-		commitMeasurements();
-		assertPerformance();
-	}
-
-	/**
-	 * Test the time for doing a refresh.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testUpdateMultiple() throws Throwable {
-		openBrowser();
-
-		exercise(
-				new TestRunnable() {
-					public void run() {
-						startMeasuring();
-						for (int i = 0; i < 10; i++) {
-							TableItem[] items = viewer.getTable().getItems();
-							for (int j = 0; j < items.length; j++) {
-								TableItem item = items[j];
-								Object element = RefreshTestContentProvider.allElements[j];
-								viewer.testUpdateItem(item, element);
-							}
-							processEvents();
-						}
-
-						stopMeasuring();
-
-					}
-				}, MIN_ITERATIONS, slowGTKIterations(),
-				JFacePerformanceSuite.MAX_TIME);
-
-		commitMeasurements();
-		assertPerformance();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/FastTreeTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/FastTreeTest.java
deleted file mode 100644
index 63e5636..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/FastTreeTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.performance;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.ui.tests.performance.TestRunnable;
-
-public class FastTreeTest extends TreeAddTest {
-
-
-	public FastTreeTest(String testName, int tagging) {
-		super(testName, tagging);
-	}
-
-	public FastTreeTest(String testName) {
-		super(testName);
-	}
-	
-	/**
-	 * @throws CoreException
-	 *             Test addition to the tree one element at a time.
-	 */
-	public void testAddTenTenTimes() throws CoreException {
-
-		doTestAdd(10, TEST_COUNT, false);
-	}
-
-	
-	/**
-	 * @throws CoreException
-	 *             Test addition to the tree one element at a time.
-	 */
-	public void testAddFiftyTenTimes() throws CoreException {
-
-		doTestAdd(50, TEST_COUNT, false);
-	}
-
-	/**
-	 * @throws CoreException
-	 *             Test addition to the tree one element at a time.
-	 */
-	public void testAddHundredTenTimes() throws CoreException {
-
-		tagIfNecessary("JFace - Add 10000 items 100 at a time TreeViewer 10 times",
-				Dimension.ELAPSED_PROCESS);
-		
-		doTestAdd(100, TEST_COUNT, false);
-	}
-
-	/**
-	 * Run the test for one of the fast insertions.
-	 * 
-	 * @param count
-	 * @throws CoreException
-	 */
-	protected void doTestAdd(final int increment, final int total,final boolean preSort)
-			throws CoreException {
-
-		openBrowser();
-
-		exercise(new TestRunnable() {
-			public void run() {
-
-				TestTreeElement input = new TestTreeElement(0, null);
-				viewer.setInput(input);
-				input.createChildren(total);
-				if (preSort)
-					viewer.getSorter().sort(viewer, input.children);
-				Collection batches = new ArrayList();
-				int blocks = input.children.length / increment;
-				for (int j = 0; j < blocks; j = j + increment) {
-					Object[] batch = new Object[increment];
-					System.arraycopy(input.children, j * increment, batch, 0,
-							increment);
-					batches.add(batch);
-				}
-				processEvents();
-				Object[] batchArray = batches.toArray();
-				startMeasuring();
-				for (int i = 0; i < 10; i++) {
-					viewer.remove(input.children);
-					for (int k = 0; k < batchArray.length; k++) {
-						viewer.add(input, (Object[]) batchArray[k]);
-						processEvents();
-					}
-				}
-				
-
-				stopMeasuring();
-
-			}
-		}, MIN_ITERATIONS, ITERATIONS, JFacePerformanceSuite.MAX_TIME);
-
-		commitMeasurements();
-		assertPerformance();
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/FileImageDescriptorTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/FileImageDescriptorTest.java
deleted file mode 100644
index 4dc7cf9..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/FileImageDescriptorTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.tests.performance;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.tests.performance.BasicPerformanceTest;
-import org.eclipse.ui.tests.performance.TestRunnable;
-import org.eclipse.ui.tests.performance.UIPerformancePlugin;
-import org.osgi.framework.Bundle;
-
-/**
- * ComboViewerRefreshTest is a test of refreshes of difference size in the combo
- * viewer.
- */
-public class FileImageDescriptorTest extends BasicPerformanceTest {
-
-	protected static final String IMAGES_DIRECTORY = "/icons/imagetests";
-
-	public FileImageDescriptorTest(String testName, int tagging) {
-		super(testName, tagging);
-
-	}
-
-	public FileImageDescriptorTest(String testName) {
-		super(testName);
-
-	}
-
-	/**
-	 * Test the time for doing a refresh.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testRefresh() throws Throwable {
-
-		exercise(new TestRunnable() {
-			public void run() {
-				Class missing = null;
-				ArrayList images = new ArrayList();
-
-				Bundle bundle = UIPerformancePlugin.getDefault().getBundle();
-				Enumeration bundleEntries = bundle
-						.getEntryPaths(IMAGES_DIRECTORY);
-
-				
-				while (bundleEntries.hasMoreElements()) {
-					ImageDescriptor descriptor;
-					String localImagePath = (String) bundleEntries
-							.nextElement();
-					
-					if(localImagePath.indexOf('.') < 0)
-						continue;
-					
-					URL[] files = FileLocator.findEntries(bundle, new Path(
-							localImagePath));
-
-					for (int i = 0; i < files.length; i++) {
-						
-						startMeasuring();
-
-						try {
-							descriptor = ImageDescriptor.createFromFile(missing,
-									FileLocator.toFileURL(files[i]).getFile());
-						} catch (IOException e) {
-							fail(e.getLocalizedMessage(),e);
-							continue;
-						}
-
-						for (int j = 0; j < 10; j++) {
-							Image image = descriptor.createImage();
-							images.add(image);							
-						}
-						
-						processEvents();
-						stopMeasuring();
-
-					}
-
-				}
-
-			
-				Iterator imageIterator = images.iterator();
-				while (imageIterator.hasNext()) {
-					((Image) imageIterator.next()).dispose();
-				}
-			}
-		}, 20, 100, JFacePerformanceSuite.MAX_TIME);
-
-		commitMeasurements();
-		assertPerformance();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/JFacePerformanceSuite.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/JFacePerformanceSuite.java
deleted file mode 100644
index 4d49bcc..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/JFacePerformanceSuite.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.performance;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.ui.tests.performance.BasicPerformanceTest;
-import org.eclipse.ui.tests.performance.UIPerformanceTestSetup;
-
-/**
- * The JFacePerformanceSuite are the performance tests for JFace.
- */
-public class JFacePerformanceSuite extends TestSuite {
-	
-	//Some of these tests are very slow on 3.0
-	//Specify the minimum number of iterations
-	//and the time to drop down to a lower number
-	
-	public static int MAX_TIME = 10000;
-	
-	/**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static Test suite() {
-    	return new UIPerformanceTestSetup(new JFacePerformanceSuite());
-    }
-
-	public JFacePerformanceSuite() {
-		super();
-		addTest(new ListViewerRefreshTest("testRefresh"));
-		addTest(new ComboViewerRefreshTest("testRefreshSmall"));
-		addTest(new FastTableViewerRefreshTest("testRefreshMultiple"));
-		addTest(new FastTableViewerRefreshTest("testUpdateMultiple"));
-		addTest(new FastTreeTest("testAddTenTenTimes"));
-		addTest(new FastTreeTest("testAddFiftyTenTimes"));
-		addTest(new TreeAddTest("testAddThousand"));
-		addTest(new FastTreeTest("testAddHundredTenTimes", BasicPerformanceTest.LOCAL));
-		addTest(new TreeAddTest("testAddThousandPreSort", BasicPerformanceTest.GLOBAL));
-		addTest(new ProgressMonitorDialogPerformanceTest("testLongNames"));
-		addTest(new ShrinkingTreeTest("testTreeViewerRefresh"));
-		addTest(new CollatorPerformanceTest("Policy.getComparatorTest"));
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ListPopulationTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ListPopulationTest.java
deleted file mode 100644
index 21da911..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ListPopulationTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.tests.performance;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.tests.performance.BasicPerformanceTest;
-import org.eclipse.ui.tests.performance.TestRunnable;
-
-/**
- * The ListPopulationTest is the test for simple
- * SWT lists.
- *
- */
-public class ListPopulationTest extends BasicPerformanceTest {
-
-	List list;
-
-	public ListPopulationTest(String testName, int tagging) {
-		super(testName, tagging);		
-	}
-
-	public ListPopulationTest(String testName) {
-		super(testName);
-	}
-
-	protected void openBrowser() {
-		Display fDisplay = Display.getCurrent();
-		if (fDisplay == null) {
-			fDisplay = new Display();
-		}
-		Shell shell = new Shell(fDisplay);
-		shell.setSize(500, 500);
-		shell.setLayout(new FillLayout());
-		list = new List(shell,SWT.NONE);
-		shell.open();
-		// processEvents();
-	}
-	
-	public void testSmallAdd() throws Throwable {
-		addBench(100);
-	}
-	
-	public void testSmallSetItems() throws Throwable {
-		setItemsBench(100);
-	}
-	
-	public void testMediumAdd() throws Throwable {
-		addBench(5000);
-	}
-	
-	public void testMediumSetItems() throws Throwable {
-		setItemsBench(5000);
-	}
-	
-	public void testLargeAdd() throws Throwable {
-		addBench(50000);
-	}
-	
-	public void testLargeSetItems() throws Throwable {
-		setItemsBench(50000);
-	}
-	
-	/**
-	 * Test the time for adding elements using add.
-	 * @throws Throwable
-	 */
-	public void addBench(int count) throws Throwable {
-		openBrowser();		
-		final String [] items = getItems(count);
-        
-        exercise(new TestRunnable() {
-            public void run() {
-    			list.removeAll();
-    			startMeasuring();
-    			for (int j = 0; j < items.length; j++) {
-    				list.add(items[j]);
-    			}
-    			processEvents();
-    			stopMeasuring();
-    		}
-        });
-		
-		commitMeasurements();
-		assertPerformance();
-	}
-	
-	/**
-	 * Test the time for adding elements using setItem.
-	 * @throws Throwable
-	 */
-	public void setItemsBench(int count) throws Throwable {
-		openBrowser();		
-		final String [] items = getItems(count);
-        exercise(new TestRunnable() {
-            public void run() {
-    			list.removeAll();
-    			startMeasuring();
-    			list.setItems(items);
-    			processEvents();
-    			stopMeasuring();
-            }
-        });
-		
-		commitMeasurements();
-		assertPerformance();
-	}
-
-	/**
-	 * Get count number of items.
-	 * @param count
-	 * @return
-	 */
-	private String[] getItems(int count) {
-		String[] items = new String[count];
-		for (int j = 0; j < items.length; j++) {
-			items[j] = "Element " + String.valueOf(j);
-			
-		}
-		return items;
-	}
-	
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ListViewerRefreshTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ListViewerRefreshTest.java
deleted file mode 100644
index 9006504..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ListViewerRefreshTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.tests.performance;
-
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.ui.tests.performance.TestRunnable;
-
-/**
- * The ListViewerRefreshTest is a test of refreshing the list viewer.
- * 
- */
-public class ListViewerRefreshTest extends ViewerTest {
-
-	ListViewer viewer;
-
-	private RefreshTestContentProvider contentProvider;
-
-	public ListViewerRefreshTest(String testName, int tagging) {
-		super(testName, tagging);
-
-	}
-
-	public ListViewerRefreshTest(String testName) {
-		super(testName);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.performance.ViewerTest#createViewer(org.eclipse.swt.widgets.Shell)
-	 */
-	protected StructuredViewer createViewer(Shell shell) {
-		viewer = new ListViewer(shell);
-		contentProvider = new RefreshTestContentProvider(
-				RefreshTestContentProvider.ELEMENT_COUNT);
-		viewer.setContentProvider(contentProvider);
-		viewer.setLabelProvider(getLabelProvider());
-		return viewer;
-	}
-
-	/**
-	 * Test the time for doing a refresh.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testRefresh() throws Throwable {
-
-		tagIfNecessary("JFace - Refresh 100 item ListViewer 10 times",
-				Dimension.ELAPSED_PROCESS);
-		setDegradationComment("<a href=https://bugs.eclipse.org/bugs/show_bug.cgi?id=99022>See Bug 99022</a> ");
-
-		openBrowser();
-
-		exercise(new TestRunnable() {
-			public void run() {
-				startMeasuring();
-				viewer.refresh();
-				processEvents();
-				stopMeasuring();
-			}
-		}, MIN_ITERATIONS, ITERATIONS,
-				JFacePerformanceSuite.MAX_TIME);
-
-		commitMeasurements();
-		assertPerformance();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ProgressMonitorDialogPerformanceTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ProgressMonitorDialogPerformanceTest.java
deleted file mode 100644
index 0145481..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ProgressMonitorDialogPerformanceTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.performance;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.ui.tests.performance.BasicPerformanceTest;
-import org.eclipse.ui.tests.performance.TestRunnable;
-
-/**
- * @since 3.3
- *
- */
-public class ProgressMonitorDialogPerformanceTest extends BasicPerformanceTest {
-
-	/**
-	 * @param testName
-	 */
-	public ProgressMonitorDialogPerformanceTest(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Create a new instance of the receiver.
-	 * @param testName
-	 * @param tagging
-	 */
-	public ProgressMonitorDialogPerformanceTest(String testName, int tagging) {
-		super(testName, tagging);
-		
-	}
-
-	/**
-	 * Test the time for doing a refresh.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testLongNames() throws Throwable {
-
-		tagIfNecessary("JFace - 10000 element task name in progress dialog",
-				Dimension.ELAPSED_PROCESS);
-		
-		Display display = Display.getCurrent();
-		if (display == null) {
-			display = new Display();
-		}
-		
-		ProgressMonitorDialog dialog = new ProgressMonitorDialog(new Shell(display));
-
-		IRunnableWithProgress runnable = new IRunnableWithProgress() {
-				public void run(IProgressMonitor monitor) {
-				
-				char[] chars = new char[10000];
-				for (int i = 0; i < chars.length; i++) {
-					chars[i] = 'A';
-				}
-				
-				final String taskName = new String(chars);
-				final IProgressMonitor finalMonitor = monitor;
-				
-				try {
-					exercise(new TestRunnable() {
-						public void run() {
-							startMeasuring();
-							finalMonitor.setTaskName(taskName);
-							processEvents();
-							stopMeasuring();
-						}
-					}, ViewerTest.MIN_ITERATIONS, ViewerTest.ITERATIONS,
-							JFacePerformanceSuite.MAX_TIME);
-				} catch (CoreException e) {
-					fail(e.getMessage(), e);
-				}
-
-			
-
-			}
-		};
-
-		try {
-			dialog.run(false, true, runnable);
-		} catch (InvocationTargetException e) {
-			fail(e.getMessage(), e);
-		} catch (InterruptedException e) {
-			fail(e.getMessage(), e);
-		}
-		
-		commitMeasurements();
-		assertPerformance();
-	}
-	
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/RefreshTestContentProvider.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/RefreshTestContentProvider.java
deleted file mode 100644
index 2c99804..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/RefreshTestContentProvider.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.tests.performance;
-
-import org.eclipse.jface.util.Assert;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-
-/**
- * The RefreshTestContentProvider is the content
- * provider for refresh tests.
- *
- */
-public class RefreshTestContentProvider implements IStructuredContentProvider {
-
-	static int seed = 1;
-	static TestElement[] allElements;
-	public static int ELEMENT_COUNT = 10000;
-	TestElement[] currentElements;
-	
-	static{
-		allElements = new TestElement[ELEMENT_COUNT];
-		for (int i = 0; i < ELEMENT_COUNT; i++) {
-			allElements[i] = new TestElement(i);			
-		}
-	}
-	
-	void preSortElements(Viewer viewer, ViewerSorter sorter){
-		sorter.sort(viewer,currentElements);
-		
-	}
-	
-	public RefreshTestContentProvider(int size){
-		Assert.isTrue(size <= ELEMENT_COUNT);
-		setSize(size);
-	}
-	
-	/**
-	 * Set the size of the amount we are currently displaying 
-	 * to size.
-	 * @param size
-	 */
-	public void setSize(int size) {
-		
-		currentElements = new TestElement[size];
-		for (int i = 0; i < currentElements.length; i++) {
-			currentElements[i] = allElements[i];
-		}
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-		return currentElements;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-		currentElements = null;
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		//Do nothing here
-	}
-
-	/**
-	 * Restore the elements to thier old poorly sorted
-	 * state.
-	 *
-	 */
-	public void refreshElements() {
-		for (int i = 0; i < ELEMENT_COUNT; i++) {
-			currentElements[i] = new TestElement(i + seed);			
-		}
-		seed += 257;
-		
-		
-	}
-	
-	public void cloneElements(){
-		currentElements = (TestElement [] )currentElements.clone();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/RefreshTestTreeContentProvider.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/RefreshTestTreeContentProvider.java
deleted file mode 100644
index cead70f..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/RefreshTestTreeContentProvider.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.performance;
-
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * The RefreshTestTreeContentProvider is the content provider for test trees.
- */
-public class RefreshTestTreeContentProvider implements ITreeContentProvider {
-
-    static TestTreeElement[] elements;
-    static {
-        elements = new TestTreeElement[RefreshTestContentProvider.ELEMENT_COUNT];
-        for (int i = 0; i < RefreshTestContentProvider.ELEMENT_COUNT; i++) {
-           elements[i] = (new TestTreeElement(i,null));
-            
-        }
-     
-    }
-
-    public RefreshTestTreeContentProvider() {
-        super();
-    }
-
-    public Object[] getChildren(Object parentElement) {
-       return ((TestTreeElement)parentElement).children;
-    }
-
-    public Object getParent(Object element) {
-        return ((TestTreeElement)element).parent;
-    }
-
-    public boolean hasChildren(Object element) {
-        return ((TestTreeElement)element).children.length > 0;
-    }
-
-    public Object[] getElements(Object inputElement) {
-       return elements;
-    }
-
-    public void dispose() {
-    }
-
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/SWTTreeTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/SWTTreeTest.java
deleted file mode 100644
index d646ffe..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/SWTTreeTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.performance;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.tests.performance.BasicPerformanceTest;
-import org.eclipse.ui.tests.performance.TestRunnable;
-
-public class SWTTreeTest extends BasicPerformanceTest {
-
-	Shell browserShell;
-
-	Tree tree;
-
-	public SWTTreeTest(String testName, int tagging) {
-		super(testName, tagging);
-	}
-
-	public SWTTreeTest(String testName) {
-		super(testName);
-	}
-
-	protected void openBrowser() {
-		Display display = Display.getCurrent();
-		if (display == null) {
-			display = new Display();
-		}
-		browserShell = new Shell(display);
-		browserShell.setSize(500, 500);
-		browserShell.setLayout(new FillLayout());
-		tree = new Tree(browserShell, SWT.NONE);
-		createChildren();
-		browserShell.open();
-		// processEvents();
-	}
-
-	private void createChildren() {
-		for (int i = 0; i < TreeAddTest.TEST_COUNT; i++) {
-			TreeItem item = new TreeItem(tree, SWT.NONE);
-			item.setText("Element " + String.valueOf(i));
-
-		}
-
-	}
-
-	/**
-	 * Test the getItems API.
-	 * 
-	 */
-	public void testGetItems() throws CoreException {
-		openBrowser();
-
-        exercise(new TestRunnable() {
-            public void run() throws Exception {
-                processEvents();
-                startMeasuring();
-                for (int j = 0; j < TreeAddTest.TEST_COUNT; j++) {
-                    tree.getItems();
-                    processEvents();
-                }
-                stopMeasuring();
-            } 
-        });
-        
-		commitMeasurements();
-		assertPerformance();
-		browserShell.close();
-	}
-
-	/**
-	 * @throws CoreException 
-	 * Test the getItem API.
-	 * 
-	 */
-	public void testGetItemAt() throws CoreException {
-		openBrowser();
-
-        exercise(new TestRunnable() {
-            public void run() throws Exception {
-                processEvents();
-                startMeasuring();
-                for (int j = 0; j < TreeAddTest.TEST_COUNT; j++) {
-                    tree.getItem(j);
-                    processEvents();
-                }
-                stopMeasuring();
-            } 
-        });
-
-		commitMeasurements();
-		assertPerformance();
-		browserShell.close();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ShrinkingTreeTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ShrinkingTreeTest.java
deleted file mode 100644
index 8bbe01b..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ShrinkingTreeTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.performance;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.ui.tests.performance.TestRunnable;
-
-/**
- * ShrinkingTreeTest is a test to see how long it takes to refresh a tree that goes
- * from a large item count to a smaller one.
- * @since 3.3
- *
- */
-public class ShrinkingTreeTest extends TreeTest {
-
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param testName
-	 */
-	public ShrinkingTreeTest(String testName) {
-		super(testName);
-	}
-
-	public ShrinkingTreeTest(String testName, int tagging) {
-		super(testName, tagging);
-	}
-
-	public void testTreeViewerRefresh() throws CoreException {
-		
-		tagIfNecessary("JFace - Refresh from 1000 items to 100 items",
-				Dimension.ELAPSED_PROCESS);
-		
-		openBrowser();
-//		int smallCount = 1;
-//		for (int i = 0; i < 3; i++) {
-//
-//			int largeCount = smallCount * 10;
-//			for (int j = 0; j < 2; j++) {
-//				System.out.println("Small " + String.valueOf(smallCount)
-//						+ "Large " + String.valueOf(largeCount));
-				testRefresh(100, 1000);
-//				largeCount *= 10;
-//			}
-//			smallCount *= 10;
-//		}
-	}
-
-	/**
-	 * Run the test for one of the fast insertions.
-	 * 
-	 * @param count
-	 * @throws CoreException
-	 */
-	private void testRefresh(final int smallSize, final int largeSize)
-			throws CoreException {
-
-		exercise(new TestRunnable() {
-			public void run() {
-
-				TestTreeElement input = new TestTreeElement(0, null);
-				viewer.setInput(input);
-				input.createChildren(largeSize);
-
-				processEvents();
-				viewer.refresh();
-				viewer.expandAll();
-				input.createChildren(smallSize);
-				startMeasuring();
-				viewer.refresh();
-
-				stopMeasuring();
-
-			}
-		}, MIN_ITERATIONS, ITERATIONS, JFacePerformanceSuite.MAX_TIME);
-
-		commitMeasurements();
-		assertPerformance();
-
-	}
-
-	
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TableViewerRefreshTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TableViewerRefreshTest.java
deleted file mode 100644
index 73ef1e0..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TableViewerRefreshTest.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.tests.performance;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.tests.performance.TestRunnable;
-
-/**
- * The TableViewerRefreshTest is a test for refreshing the TableViewer.
- */
-public class TableViewerRefreshTest extends ViewerTest {
-
-	class TestTableViewer extends TableViewer {
-
-		public TestTableViewer(Composite parent, int style) {
-			super(parent, style);
-		}
-
-		public TestTableViewer(Composite parent) {
-			super(parent);
-		}
-
-		public TestTableViewer(Table table) {
-			super(table);
-		}
-
-		public void testUpdateItem(Widget widget, Object element) {
-			updateItem(widget, element);
-		}
-	}
-
-	TestTableViewer viewer;
-
-	private RefreshTestContentProvider contentProvider;
-
-	public TableViewerRefreshTest(String testName, int tagging) {
-		super(testName, tagging);
-	}
-
-	public TableViewerRefreshTest(String testName) {
-		super(testName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.performance.ViewerTest#createViewer(org.eclipse.swt.widgets.Shell)
-	 */
-	protected StructuredViewer createViewer(Shell shell) {
-		viewer = new TestTableViewer(shell);
-		contentProvider = new RefreshTestContentProvider(
-				RefreshTestContentProvider.ELEMENT_COUNT);
-		viewer.setContentProvider(contentProvider);
-		viewer.setLabelProvider(getLabelProvider());
-		return viewer;
-	}
-
-	/**
-	 * Test the time for doing a refresh.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testRefresh() throws Throwable {
-		openBrowser();
-
-		exercise(new TestRunnable() {
-			public void run() {
-				startMeasuring();
-				viewer.refresh();
-				processEvents();
-				stopMeasuring();
-			}
-		}, MIN_ITERATIONS, slowGTKIterations(),
-				JFacePerformanceSuite.MAX_TIME);
-
-		commitMeasurements();
-		assertPerformance();
-	}
-
-	/**
-	 * Test the time for doing a refresh.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testRefreshSorted() throws Throwable {
-		openBrowser();
-		viewer.setSorter(new ViewerSorter());
-
-		exercise(new TestRunnable() {
-			public void run() {
-				startMeasuring();
-				viewer.refresh();
-				processEvents();
-				stopMeasuring();
-			}
-		}, MIN_ITERATIONS, slowGTKIterations(),
-				JFacePerformanceSuite.MAX_TIME);
-
-		commitMeasurements();
-		assertPerformance();
-	}
-
-	/**
-	 * Test the time for doing a refresh.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testRefreshPreSorted() throws Throwable {
-		openBrowser();
-		final ViewerSorter sorter = new ViewerSorter();
-		viewer.setSorter(sorter);
-
-		exercise(new TestRunnable() {
-			public void run() {
-				contentProvider.refreshElements();
-				startMeasuring();
-				contentProvider.cloneElements();
-				contentProvider.preSortElements(viewer, sorter);
-				viewer.refresh();
-				processEvents();
-				stopMeasuring();
-			}
-		}, MIN_ITERATIONS, ITERATIONS,
-				JFacePerformanceSuite.MAX_TIME);
-
-		commitMeasurements();
-		assertPerformance();
-	}
-
-	/**
-	 * Test the time for doing a refresh.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testUpdate() throws Throwable {
-		openBrowser();
-
-		exercise(new TestRunnable() {
-			public void run() {
-
-				TableItem[] items = viewer.getTable().getItems();
-				startMeasuring();
-				for (int j = 0; j < items.length; j++) {
-					TableItem item = items[j];
-					Object element = RefreshTestContentProvider.allElements[j];
-
-					viewer.testUpdateItem(item, element);
-
-				}
-				processEvents();
-				stopMeasuring();
-
-			}
-		}, MIN_ITERATIONS, slowGTKIterations(),
-				JFacePerformanceSuite.MAX_TIME);
-
-		commitMeasurements();
-		assertPerformance();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TestElement.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TestElement.java
deleted file mode 100644
index 4ebbb3f..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TestElement.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.tests.performance;
-
-/**
- * The TestElement is the element used for testing
- * viewers.
- *
- */
-public class TestElement {
-	
-	String name;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 */
-	public TestElement() {
-		super();
-	}
-	
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param index
-	 */
-	public TestElement(int index) {
-		name = TestTreeElement.generateFirstEntry() + String.valueOf(index);
-	}
-
-	public String getText() {
-		return name;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TestTreeElement.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TestTreeElement.java
deleted file mode 100644
index faf7472..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TestTreeElement.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.performance;
-
-
-public class TestTreeElement extends TestElement {
-
-	TestTreeElement parent;
-
-	TestTreeElement[] children = new TestTreeElement[0];
-
-	private static int index = 0;
-
-	static String characters = "M1NqBwV2CeXrZ3LtKyJ4HuGiF5DoSpA6PaOsI7UdYfT8RgEhW9Qjk0DlWzMxUcsvfbwnm";
-
-	/**
-	 * Create a new instance of the receiver .
-	 * 
-	 * @param index
-	 * @param treeParent
-	 */
-	public TestTreeElement(int index, TestTreeElement treeParent) {
-		super();
-		this.parent = treeParent;
-		name = generateFirstEntry() + String.valueOf(index);
-	}
-
-	/**
-	 * Generate a random string.
-	 * 
-	 * @return String
-	 */
-	static String generateFirstEntry() {
-
-		String next = characters.substring(index);
-		index++;
-		if (index > characters.length() - 2)
-			index = 0;
-		return next;
-	}
-
-	/**
-	 * Create count number of children in the receiver.
-	 * 
-	 * @param count
-	 */
-	public void createChildren(int count) {
-		children = new TestTreeElement[count];
-		for (int i = 0; i < count; i++) {
-			children[i] = new TestTreeElement(i, this);
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TreeAddTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TreeAddTest.java
deleted file mode 100644
index 87f7ef2..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TreeAddTest.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.performance;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.ui.tests.performance.TestRunnable;
-
-public class TreeAddTest extends TreeTest {
-
-	static int TEST_COUNT = 1000;
-
-	public TreeAddTest(String testName, int tagging) {
-		super(testName, tagging);
-	}
-
-	public TreeAddTest(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * @throws CoreException
-	 *             Test addition to the tree one element at a time.
-	 */
-	public void testAddOneAtATime() {
-		openBrowser();
-
-		for (int i = 0; i < ITERATIONS / 10; i++) {
-			TestTreeElement input = new TestTreeElement(0, null);
-			viewer.setInput(input);
-			input.createChildren(TEST_COUNT);
-			processEvents();
-			startMeasuring();
-			for (int j = 0; j < input.children.length; j++) {
-
-				viewer.add(input, input.children[j]);
-				processEvents();
-
-			}
-			stopMeasuring();
-		}
-
-		commitMeasurements();
-		assertPerformance();
-	}
-
-	/**
-	 * @throws CoreException
-	 *             Test addition to the tree one element at a time.
-	 */
-	public void testAddTen() throws CoreException {
-
-		doTestAdd(10, TEST_COUNT, false);
-	}
-
-	/**
-	 * @throws CoreException
-	 *             Test addition to the tree one element at a time.
-	 */
-	public void testAddFifty() throws CoreException {
-
-		doTestAdd(50, TEST_COUNT, false);
-	}
-
-	/**
-	 * @throws CoreException
-	 *             Test addition to the tree one element at a time.
-	 */
-	public void testAddHundred() throws CoreException {
-
-		tagIfNecessary("JFace - Add 1000 items in 10 blocks to TreeViewer",
-				Dimension.ELAPSED_PROCESS);
-		setDegradationComment("<a href=https://bugs.eclipse.org/bugs/show_bug.cgi?id=101853>See Bug 101853</a> ");
-
-		doTestAdd(100, TEST_COUNT, false);
-	}
-
-	/**
-	 * Run the test for one of the fast insertions.
-	 * 
-	 * @param count
-	 * @throws CoreException
-	 */
-	protected void doTestAdd(final int increment, final int total,final boolean preSort)
-			throws CoreException {
-
-		openBrowser();
-
-		exercise(new TestRunnable() {
-			public void run() {
-
-				TestTreeElement input = new TestTreeElement(0, null);
-				viewer.setInput(input);
-				input.createChildren(total);
-				if (preSort)
-					viewer.getSorter().sort(viewer, input.children);
-				Collection batches = new ArrayList();
-				int blocks = input.children.length / increment;
-				for (int j = 0; j < blocks; j = j + increment) {
-					Object[] batch = new Object[increment];
-					System.arraycopy(input.children, j * increment, batch, 0,
-							increment);
-					batches.add(batch);
-				}
-				processEvents();
-				Object[] batchArray = batches.toArray();
-				startMeasuring();
-
-				// Measure more than one for the fast cases
-				for (int k = 0; k < batchArray.length; k++) {
-					viewer.add(input, (Object[]) batchArray[k]);
-					processEvents();
-				}
-
-				stopMeasuring();
-
-			}
-		}, MIN_ITERATIONS, ITERATIONS, JFacePerformanceSuite.MAX_TIME);
-
-		commitMeasurements();
-		assertPerformance();
-
-	}
-
-	/**
-	 * Test addition to the tree.
-	 */
-	public void testAddThousand() throws CoreException {
-		doTestAdd(1000, 2000, false);
-	}
-
-	/**
-	 * @throws CoreException
-	 *             Test addition to the tree one element at a time.
-	 */
-	public void testAddTwoThousand() throws CoreException {
-
-		doTestAdd(2000, 4000, false);
-
-	}
-
-	/**
-	 * @throws CoreException
-	 *             Test addition to the tree with the items presorted.
-	 */
-	public void testAddHundredPreSort() throws CoreException {
-
-		doTestAdd(100, 1000, true);
-	}
-
-	/**
-	 * @throws CoreException
-	 *             Test addition to the tree with the items presorted.
-	 */
-	public void testAddThousandPreSort() throws CoreException {
-		tagIfNecessary("JFace - Add 2000 items in 2 blocks to TreeViewer",
-				Dimension.ELAPSED_PROCESS);
-
-		doTestAdd(1000, 2000, true);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TreeTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TreeTest.java
deleted file mode 100644
index ab62540..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TreeTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.performance;
-
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.3
- *
- */
-public abstract class TreeTest extends ViewerTest {
-	
-
-
-	TreeViewer viewer;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * @param testName
-	 * @param tagging
-	 */
-	public TreeTest(String testName, int tagging) {
-		super(testName, tagging);
-	}
-
-	/**
-	 * Create a new instance of the receiver.
-	 * @param testName
-	 */
-	public TreeTest(String testName) {
-		super(testName);
-	}
-
-
-	protected StructuredViewer createViewer(Shell shell) {
-		viewer = createTreeViewer(shell);
-		viewer.setContentProvider(getContentProvider());
-		viewer.setLabelProvider(getLabelProvider());
-		viewer.setSorter(new ViewerSorter());
-		viewer.setUseHashlookup(true);
-		return viewer;
-	}
-
-	/**
-	 * Create the tree viewer
-	 * @return
-	 */
-	protected TreeViewer createTreeViewer(Shell shell) {
-		return new TreeViewer(shell);
-	}
-
-	protected Object getInitialInput() {
-		return new TestTreeElement(0, null);
-	}
-
-	private IContentProvider getContentProvider() {
-		return new ITreeContentProvider() {
-	
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-			 */
-			public Object[] getChildren(Object parentElement) {
-				TestTreeElement element = (TestTreeElement) parentElement;
-				return element.children;
-			}
-	
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-			 */
-			public Object getParent(Object element) {
-				return ((TestTreeElement) element).parent;
-			}
-	
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-			 */
-			public boolean hasChildren(Object element) {
-				return ((TestTreeElement) element).children.length > 0;
-			}
-	
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				return getChildren(inputElement);
-			}
-	
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-				// Do nothing here
-			}
-	
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer localViewer, Object oldInput,
-					Object newInput) {
-				// Do nothing here
-			}
-	
-		};
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TreeViewerRefreshTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TreeViewerRefreshTest.java
deleted file mode 100644
index b5ec976..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/TreeViewerRefreshTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.tests.performance;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.widgets.Shell;
-
-
-/**
- * The TreeViewerRefreshTest is the refresh test for 
- * tree viewers.
- *
- */
-public class TreeViewerRefreshTest extends ViewerTest {
-    
-    TreeViewer viewer;
-    private RefreshTestTreeContentProvider contentProvider;
-
-    public TreeViewerRefreshTest(String testName, int tagging) {
-        super(testName, tagging);
-    }
-
-    public TreeViewerRefreshTest(String testName) {
-        super(testName);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.tests.performance.ViewerTest#createViewer(org.eclipse.swt.widgets.Shell)
-     */
-    protected StructuredViewer createViewer(Shell shell) {
-        viewer = new TreeViewer(shell);
-        contentProvider = new RefreshTestTreeContentProvider();
-        viewer.setContentProvider(contentProvider);
-        viewer.setLabelProvider(getLabelProvider());
-        return viewer;
-    }
-
-    /**
-     * Test the time for doing a refresh.
-     * @throws Throwable
-     */
-    public void testRefresh() throws Throwable {
-        openBrowser();
-
-        for (int i = 0; i < ITERATIONS; i++) {
-            startMeasuring();
-            viewer.refresh();
-            processEvents();
-            stopMeasuring();
-        }
-        
-        commitMeasurements();
-        assertPerformance();
-    }
-    
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ViewerTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ViewerTest.java
deleted file mode 100644
index 2cad9b3..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/jface/tests/performance/ViewerTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.tests.performance;
-
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.tests.performance.BasicPerformanceTest;
-
-/**
- * The LinearViewerTest is a test that tests viewers.
- * 
- */
-public abstract class ViewerTest extends BasicPerformanceTest {
-
-	Shell browserShell;
-	
-	public static int ITERATIONS = 100;
-	public static int MIN_ITERATIONS = 20;
-
-	public ViewerTest(String testName, int tagging) {
-		super(testName, tagging);
-	}
-
-	public ViewerTest(String testName) {
-		super(testName);
-	}
-
-	protected void openBrowser() {
-		Display display = Display.getCurrent();
-		if (display == null) {
-			display = new Display();
-		}
-		browserShell = new Shell(display);
-		browserShell.setSize(500, 500);
-		browserShell.setLayout(new FillLayout());
-		StructuredViewer viewer = createViewer(browserShell);
-		viewer.setUseHashlookup(true);
-		viewer.setInput(getInitialInput());
-		browserShell.open();
-		// processEvents();
-	}
-
-	/**
-	 * Get the initial input for the receiver.
-	 * @return
-	 */
-	protected Object getInitialInput() {
-		return this;
-	}
-
-	/**
-	 * Create the viewer we are testing.
-	 * @param aShell
-	 * @return
-	 */
-	protected abstract StructuredViewer createViewer(Shell shell);
-
-	public ILabelProvider getLabelProvider() {
-		return new LabelProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-			 */
-			public String getText(Object element) {
-				return ((TestElement) element).getText();
-			}
-
-		};
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.util.UITestCase#doTearDown()
-	 */
-	protected void doTearDown() throws Exception {
-		super.doTearDown();
-		if(browserShell!= null){
-			browserShell.close();
-			browserShell = null;
-		}
-	}
-	
-	/**
-	 * Return the number of iterations for tests that are slow on Linux
-	 * @return int
-	 */
-	public int slowGTKIterations(){
-		if(Util.isGtk())
-			return ITERATIONS / 5;
-		return ITERATIONS;
-	}
-	
-	
-	/**
-	 * Return the number of iterations for tests that are slow on Linux
-	 * @return int
-	 */
-	public int slowWindowsIterations(){
-		if(Util.isWindows())
-			return ITERATIONS / 5;
-		return ITERATIONS;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ActivitiesPerformanceSuite.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ActivitiesPerformanceSuite.java
deleted file mode 100644
index fc21369..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ActivitiesPerformanceSuite.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * @since 3.1
- *
- */
-public class ActivitiesPerformanceSuite extends TestSuite {
-
-
-    
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new ActivitiesPerformanceSuite();
-    }
-    
-    /**
-     * 
-     */
-    public ActivitiesPerformanceSuite() {
-        super();
-        addTest(new GenerateIdentifiersTest(10000));
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/BasicPerformanceTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/BasicPerformanceTest.java
deleted file mode 100644
index 5d529b2..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/BasicPerformanceTest.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-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.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Baseclass for simple performance tests.
- * 
- * @since 3.1
- */
-public abstract class BasicPerformanceTest extends UITestCase {
-
-	public static final int NONE = 0;
-
-	public static final int LOCAL = 1;
-
-	public static final int GLOBAL = 2;
-
-	private PerformanceTester tester;
-
-	private IProject testProject;
-
-	final private boolean tagAsGlobalSummary;
-
-	final private boolean tagAsSummary;
-
-	public BasicPerformanceTest(String testName) {
-		this(testName, NONE);
-	}
-
-	/**
-	 * @param testName
-	 */
-	public BasicPerformanceTest(String testName, int tagging) {
-		super(testName);
-		tagAsGlobalSummary = ((tagging & GLOBAL) != 0);
-		tagAsSummary = ((tagging & LOCAL) != 0);
-	}
-
-	/**
-	 * Answers whether this test should be tagged globally.
-	 * 
-	 * @return whether this test should be tagged globally
-	 */
-	private boolean shouldGloballyTag() {
-		return tagAsGlobalSummary;
-	}
-
-	/**
-	 * Answers whether this test should be tagged locally.
-	 * 
-	 * @return whether this test should be tagged locally
-	 */
-	private boolean shouldLocallyTag() {
-		return tagAsSummary;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.util.UITestCase#doSetUp()
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		tester = new PerformanceTester(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.util.UITestCase#doTearDown()
-	 */
-	protected void doTearDown() throws Exception {
-		super.doTearDown();
-		tester.dispose();
-	}
-
-	protected IProject getProject() {
-		if (testProject == null) {
-			IWorkspace workspace = ResourcesPlugin.getWorkspace();
-			testProject = workspace.getRoot().getProject(
-					UIPerformanceTestSetup.PROJECT_NAME);
-		}
-		return testProject;
-	}
-
-	/**
-	 * Asserts default properties of the measurements captured for this test
-	 * case.
-	 * 
-	 * @throws RuntimeException
-	 *             if the properties do not hold
-	 */
-	public void assertPerformance() {
-		tester.assertPerformance();
-	}
-
-	/**
-	 * Asserts that the measurement specified by the given dimension is within a
-	 * certain range with respect to some reference value. If the specified
-	 * dimension isn't available, the call has no effect.
-	 * 
-	 * @param dim
-	 *            the Dimension to check
-	 * @param lowerPercentage
-	 *            a negative number indicating the percentage the measured value
-	 *            is allowed to be smaller than some reference value
-	 * @param upperPercentage
-	 *            a positive number indicating the percentage the measured value
-	 *            is allowed to be greater than some reference value
-	 * @throws RuntimeException
-	 *             if the properties do not hold
-	 */
-	public void assertPerformanceInRelativeBand(Dimension dim,
-			int lowerPercentage, int upperPercentage) {
-		tester.assertPerformanceInRelativeBand(dim, lowerPercentage,
-				upperPercentage);
-	}
-
-	public void commitMeasurements() {
-		tester.commitMeasurements();
-	}
-
-	/**
-	 * Called from within a test case immediately before the code to measure is
-	 * run. It starts capturing of performance data. Must be followed by a call
-	 * to {@link PerformanceTestCase#stopMeasuring()}before subsequent calls to
-	 * this method or {@link PerformanceTestCase#commitMeasurements()}.
-	 */
-	public void startMeasuring() {
-		tester.startMeasuring();
-	}
-
-	public void stopMeasuring() {
-		tester.stopMeasuring();
-	}
-
-	/**
-	 * Mark the scenario of this test case to be included into the global
-	 * performance summary. The summary shows the given dimension of the
-	 * scenario and labels the scenario with the short name.
-	 * 
-	 * @param shortName
-	 *            a short (shorter than 40 characters) descritive name of the
-	 *            scenario
-	 * @param dimension
-	 *            the dimension to show in the summary
-	 */
-	private void tagAsGlobalSummary(String shortName, Dimension dimension) {
-		System.out.println("GLOBAL " + shortName);
-		tester.tagAsGlobalSummary(shortName, dimension);
-	}
-
-	private void tagAsSummary(String shortName, Dimension dimension) {
-		System.out.println("LOCAL " + shortName);
-		tester.tagAsSummary(shortName, dimension);
-	}
-
-	public void tagIfNecessary(String shortName, Dimension dimension) {
-		if (shouldGloballyTag()) {
-			tagAsGlobalSummary(shortName, dimension);
-		}
-		if (shouldLocallyTag()) {
-			tagAsSummary(shortName, dimension);
-		}
-	}
-
-	public static void waitForBackgroundJobs() {
-
-		Job backgroundJob = new Job(
-				"This is a test job which sits around being low priority until everything else finishes") {
-			protected IStatus run(IProgressMonitor monitor) {
-				return Status.OK_STATUS;
-			}
-		};
-
-		backgroundJob.setPriority(Job.DECORATE);
-
-		boolean hadEvents = true;
-		Display display = PlatformUI.getWorkbench().getDisplay();
-		if (display != null) {
-			while (hadEvents) {
-				hadEvents = false;
-				// Join a low priority job then spin the event loop
-				backgroundJob.schedule(0);
-				try {
-					backgroundJob.join();
-				} catch (InterruptedException e) {
-				}
-
-				while (display.readAndDispatch()) {
-					hadEvents = true;
-				}
-			}
-		}
-	}
-
-	/**
-	 * Runs the given runnable until either 100 iterations or 4s has elapsed.
-	 * Runs a minimum of 3 times.
-	 * 
-	 * @param runnable
-	 * @since 3.1
-	 */
-	public static void exercise(TestRunnable runnable) throws CoreException {
-		exercise(runnable, 3, 100, 4000);
-	}
-
-	/**
-	 * Exercises the given runnable until either the given number of iterations
-	 * or the given amount of time has elapsed, whatever occurs first.
-	 * 
-	 * @param runnable
-	 * @param maxIterations
-	 * @param maxTime
-	 * @since 3.1
-	 */
-	public static void exercise(TestRunnable runnable, int minIterations,
-			int maxIterations, int maxTime) throws CoreException {
-		long startTime = System.currentTimeMillis();
-
-		for (int counter = 0; counter < maxIterations; counter++) {
-
-			try {
-				runnable.run();
-			} catch (Exception e) {
-				throw new CoreException(new Status(IStatus.ERROR,
-						UIPerformancePlugin.getDefault().getBundle()
-								.getSymbolicName(), IStatus.OK,
-						"An exception occurred", e));
-			}
-
-			long curTime = System.currentTimeMillis();
-			if (curTime - startTime > maxTime && counter >= minIterations - 1) {
-				break;
-			}
-		}
-	}
-
-	/**
-	 * Set the comment for the receiver to string. Note this is added to the
-	 * output as is so you will need to add markup if you need a link.
-	 * 
-	 * @param string
-	 *            The comment to write out for the test.
-	 */
-	public void setDegradationComment(String string) {
-		tester.setDegradationComment(string);
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/CommandsPerformanceTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/CommandsPerformanceTest.java
deleted file mode 100644
index 7260a30..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/CommandsPerformanceTest.java
+++ /dev/null
@@ -1,474 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.CommandManager;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.contexts.Context;
-import org.eclipse.core.commands.contexts.ContextManager;
-import org.eclipse.jface.bindings.Binding;
-import org.eclipse.jface.bindings.BindingManager;
-import org.eclipse.jface.bindings.Scheme;
-import org.eclipse.jface.bindings.keys.IKeyLookup;
-import org.eclipse.jface.bindings.keys.KeyBinding;
-import org.eclipse.jface.bindings.keys.KeyLookupFactory;
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.jface.bindings.keys.ParseException;
-import org.eclipse.jface.util.Util;
-
-/**
- * <p>
- * Responsible for testing the commands, contexts and bindings architecture.
- * This test does not rely on the existence of the workbench; it operates purely
- * on JFace code and lower. See the method comments for descriptions of the
- * currently supported performance tests.
- * </p>
- * 
- * @since 3.1
- */
-public final class CommandsPerformanceTest extends BasicPerformanceTest {
-
-	/**
-	 * <p>
-	 * Constructs a branch of a context tree. This creates a branch of the given
-	 * depth -- remembering the identifiers along the way. This method operates
-	 * recursively.
-	 * </p>
-	 * <p>
-	 * TODO This should add a bit of breadth to the tree.
-	 * </p>
-	 * 
-	 * @param contextManager
-	 *            The context manager in which the contexts should be defined;
-	 *            must not be <code>null</code>.
-	 * @param parent
-	 *            The parent context identifier for the context to be created;
-	 *            may be <code>null</code>.
-	 * @param successors
-	 *            The number of successors to create. The depth of the branch to
-	 *            be created. If this number is zero, then a context is created,
-	 *            but no recursive call is made.
-	 * @param activeContextIds
-	 *            The list of active context identifiers; must not be
-	 *            <code>null</code>.
-	 */
-	private static final void createContext(
-			final ContextManager contextManager, final String parent,
-			final int successors, final List activeContextIds) {
-		final int count = activeContextIds.size();
-		final String contextString = "context" + count;
-		final Context context = contextManager.getContext(contextString);
-		context.define(contextString, contextString, parent);
-		activeContextIds.add(contextString);
-
-		if (successors == 0) {
-			return;
-		}
-
-		createContext(contextManager, contextString, successors - 1,
-				activeContextIds);
-	}
-
-	/**
-	 * <p>
-	 * Constructs a branch of a scheme tree. This creates a branch of the given
-	 * depth -- remembering the schemes along the way. This method operates
-	 * recursively.
-	 * </p>
-	 * <p>
-	 * TODO This should add a bit of breadth to the tree.
-	 * </p>
-	 * 
-	 * @param bindingManager
-	 *            The binding manager in which the schemes should be defined;
-	 *            must not be <code>null</code>.
-	 * @param parent
-	 *            The parent scheme identifier for the scheme to be created; may
-	 *            be <code>null</code>.
-	 * @param successors
-	 *            The number of successors to create. The depth of the branch to
-	 *            be created. If this number is zero, then a scheme is created,
-	 *            but no recursive call is made.
-	 * @param schemes
-	 *            The list of created schemes; must not be <code>null</code>.
-	 */
-	private static final void createScheme(final BindingManager bindingManager,
-			final String parent, final int successors, final List schemes) {
-		final int count = schemes.size();
-		final String schemeString = "scheme" + count;
-		final Scheme scheme = bindingManager.getScheme(schemeString);
-		scheme.define(schemeString, schemeString, parent);
-		schemes.add(scheme);
-
-		if (successors == 0) {
-			return;
-		}
-
-		createScheme(bindingManager, schemeString, successors - 1, schemes);
-	}
-
-	/**
-	 * The binding manager for the currently running test. <code>null</code>
-	 * if no test is running.
-	 */
-	private BindingManager bindingManager = null;
-
-	/**
-	 * The command manager for the currently running test. <code>null</code>
-	 * if no test is running.
-	 */
-	private CommandManager commandManager = null;
-
-	/**
-	 * The context manager for the currently running test. <code>null</code>
-	 * if no test is running.
-	 */
-	private ContextManager contextManager = null;
-
-	/**
-	 * Constructs an instance of <code>CommandsPerformanceTest</code>.
-	 * 
-	 * @param testName
-	 *            Test's name.
-	 */
-	public CommandsPerformanceTest(final String name) {
-		super(name);
-	}
-
-	/**
-	 * <p>
-	 * Sets up a sufficiently complex set of bindings.
-	 * </p>
-	 * <p>
-	 * At the time of writing, Eclipse's key binding set contains about five
-	 * hundred bindings. Of these, 140 specify platform information, while only
-	 * 5 specify locale information. About 40 are deletion markers. The deepest
-	 * point in the context tree is four levels. There are two schemes.
-	 * </p>
-	 * <p>
-	 * The test binding set contains five thousand bindings. About 1400 specify
-	 * either locale or platform information. Five hundred are deletion markers.
-	 * The deepest point in the context tree is 40 levels. There are twenty
-	 * schemes.
-	 * </p>
-	 * <p>
-	 * The depth of the locale and platform tree is the same in both real life
-	 * and the test case. It is difficult to imagine why the locale list would
-	 * ever be anything but four elements, or why the platform list would ever
-	 * be anything but three elements.
-	 * </p>
-	 * 
-	 * @throws NotDefinedException
-	 *             If something went wrong initializing the active scheme.
-	 */
-	protected final void doSetUp() throws NotDefinedException, Exception {
-		super.doSetUp();
-
-		/*
-		 * The constants to use in creating the various objects. The platform
-		 * locale count must be greater than or equal to the number of deletion
-		 * markers. Deletion markers are typically created based on the platform
-		 * or locale.
-		 */
-		final int contextTreeDepth = 40;
-		final int schemeDepth = 20;
-		final int bindingCount = 5000;
-		final int platformLocaleCount = 1400;
-		final int deletionMarkers = 500;
-		final String currentLocale = Locale.getDefault().toString();
-		final String currentPlatform = Util.getWS();
-
-		// Set-up a table of modifier keys.
-		final IKeyLookup lookup = KeyLookupFactory.getDefault();
-		final int modifierKeys0 = 0;
-		final int modifierKeys1 = lookup.getAlt();
-		final int modifierKeys2 = lookup.getCommand();
-		final int modifierKeys3 = lookup.getCtrl();
-		final int modifierKeys4 = lookup.getShift();
-		final int modifierKeys5 = lookup.getAlt() | lookup.getCommand();
-		final int modifierKeys6 = lookup.getAlt() | lookup.getCtrl();
-		final int modifierKeys7 = lookup.getAlt() | lookup.getShift();
-		final int modifierKeys8 = lookup.getCommand() | lookup.getCtrl();
-		final int modifierKeys9 = lookup.getCommand() | lookup.getShift();
-		final int modifierKeys10 = lookup.getCtrl() | lookup.getShift();
-		final int modifierKeys11 = lookup.getAlt() | lookup.getCommand()
-				| lookup.getCtrl();
-		final int modifierKeys12 = lookup.getAlt() | lookup.getCommand()
-				| lookup.getShift();
-		final int modifierKeys13 = lookup.getAlt() | lookup.getCtrl()
-				| lookup.getShift();
-		final int modifierKeys14 = lookup.getCommand() | lookup.getCtrl()
-				| lookup.getShift();
-		final int modifierKeys15 = lookup.getAlt() | lookup.getCommand()
-				| lookup.getCtrl() | lookup.getShift();
-		final int[] modifierKeyTable = { modifierKeys0, modifierKeys1,
-				modifierKeys2, modifierKeys3, modifierKeys4, modifierKeys5,
-				modifierKeys6, modifierKeys7, modifierKeys8, modifierKeys9,
-				modifierKeys10, modifierKeys11, modifierKeys12, modifierKeys13,
-				modifierKeys14, modifierKeys15 };
-
-		// Initialize the command manager.
-		commandManager = new CommandManager();
-
-		// Initialize the contexts.
-		contextManager = new ContextManager();
-		final List activeContextIds = new ArrayList();
-		createContext(contextManager, null, contextTreeDepth, activeContextIds);
-		contextManager.setActiveContextIds(new HashSet(activeContextIds));
-
-		// Initialize the schemes.
-		bindingManager = new BindingManager(contextManager, commandManager);
-		final List schemes = new ArrayList();
-		createScheme(bindingManager, null, schemeDepth, schemes);
-		bindingManager
-				.setActiveScheme((Scheme) schemes.get(schemes.size() - 1));
-
-		// Create the deletion markers.
-		final Binding[] bindings = new Binding[bindingCount];
-		for (int i = 0; i < deletionMarkers; i++) {
-			/*
-			 * Set-up the locale and platform. These are based on the numbers
-			 * given above.
-			 */
-			String locale = null;
-			String platform = null;
-
-			if (i < platformLocaleCount) {
-				switch (i % 4) {
-				case 0:
-					locale = currentLocale;
-					break;
-				case 1:
-					platform = currentPlatform;
-					break;
-				case 2:
-					locale = "gibberish";
-					break;
-				case 3:
-					platform = "gibberish";
-					break;
-				}
-			}
-
-			// Build a key sequence.
-			final char character = (char) ('A' + (i % 26));
-			final int modifierKeys = modifierKeyTable[(i / 26)
-					% modifierKeyTable.length];
-			final KeyStroke keyStroke = KeyStroke.getInstance(modifierKeys,
-					character);
-			final KeySequence keySequence = KeySequence.getInstance(keyStroke);
-
-			// Build the other parameters.
-			final String schemeId = ((Scheme) schemes.get(i % schemes.size()))
-					.getId();
-			final String contextId = (String) activeContextIds.get(i
-					% activeContextIds.size());
-			final int type = (i % 2);
-
-			// Construct the binding.
-			final Binding binding = new KeyBinding(keySequence, null, schemeId,
-					contextId, locale, platform, null, type);
-			bindings[i] = binding;
-		}
-
-		/*
-		 * Now create the regular bindings. By using the same loop structure and
-		 * resetting the index to zero, we ensure that the deletion markers will
-		 * actually delete something.
-		 */
-		for (int i = 0; i < bindingCount - deletionMarkers; i++) {
-			/*
-			 * Set-up the locale and platform for those bindings that will not
-			 * be used to match the above deletion markers. These are based on
-			 * the numbers given above.
-			 */
-			String locale = null;
-			String platform = null;
-
-			if ((i > deletionMarkers) && (i < platformLocaleCount)) {
-				switch (i % 4) {
-				case 0:
-					locale = currentLocale;
-					break;
-				case 1:
-					platform = currentPlatform;
-					break;
-				case 2:
-					locale = "gibberish";
-					break;
-				case 3:
-					platform = "gibberish";
-					break;
-				}
-			}
-
-			// Build a key sequence.
-			final char character = (char) ('A' + (i % 26));
-			final int modifierKeys = modifierKeyTable[(i / 26)
-					% modifierKeyTable.length];
-			final KeyStroke keyStroke = KeyStroke.getInstance(modifierKeys,
-					character);
-			final KeySequence keySequence = KeySequence.getInstance(keyStroke);
-
-			// Build the other parameters.
-			final String commandId = "command" + i;
-			final String schemeId = ((Scheme) schemes.get(i % schemes.size()))
-					.getId();
-			final String contextId = (String) activeContextIds.get(i
-					% activeContextIds.size());
-			final int type = (i % 2);
-
-			// Construct the binding.
-			final Command command = commandManager.getCommand(commandId);
-			final ParameterizedCommand parameterizedCommand = new ParameterizedCommand(
-					command, null);
-			final Binding binding = new KeyBinding(keySequence,
-					parameterizedCommand, schemeId, contextId, locale,
-					platform, null, type);
-			bindings[i + deletionMarkers] = binding;
-		}
-		bindingManager.setBindings(bindings);
-	}
-
-	protected final void doTearDown() throws Exception {
-		bindingManager = null;
-		commandManager = null;
-		contextManager = null;
-		super.doTearDown();
-	}
-
-	/**
-	 * <p>
-	 * Tests how long it takes to access the cache if no conditions have
-	 * changed. It measures how long it takes to look up the computation from
-	 * the cache one million times.
-	 * </p>
-	 * 
-	 * @throws ParseException
-	 *             If "CTRL+F" can't be parsed for some strange reason.
-	 */
-	public final void testBindingCacheHitHard() throws ParseException {
-		// Constants
-		final int cacheHits = 1000000;
-		final KeySequence keySequence = KeySequence.getInstance("CTRL+F");
-
-		// Compute once.
-		bindingManager.getPartialMatches(keySequence);
-
-		// Time how long it takes to access the cache;
-		startMeasuring();
-		for (int i = 0; i < cacheHits; i++) {
-			bindingManager.getPartialMatches(keySequence);
-		}
-		stopMeasuring();
-		commitMeasurements();
-		assertPerformance();
-	}
-
-	/**
-	 * <p>
-	 * Tests how long it takes to access the cache if no conditions have
-	 * changed. It measures how long it takes to look up the computation from
-	 * the cache one million times. In this test, the look-up is done in reverse --
-	 * from command identifier to trigger.
-	 * </p>
-	 * 
-	 * @throws ParseException
-	 *             If "CTRL+F" can't be parsed for some strange reason.
-	 */
-	public final void testBindingCacheHitHardReverse() throws ParseException {
-		// Constants
-		final int cacheHits = 1000000;
-		final KeySequence keySequence = KeySequence.getInstance("CTRL+F");
-
-		// Compute once.
-		bindingManager.getPartialMatches(keySequence);
-
-		// Time how long it takes to access the cache;
-		startMeasuring();
-		for (int i = 0; i < cacheHits; i++) {
-			bindingManager.getActiveBindingsFor((ParameterizedCommand) null);
-		}
-		stopMeasuring();
-		commitMeasurements();
-		assertPerformance();
-	}
-
-	/**
-	 * <p>
-	 * Tests how long it takes to access the cache if the conditions have
-	 * changed, but the cache contains a matching entry. It measures how long it
-	 * takes to look up the computation from the cache forty thousand times.
-	 * </p>
-	 * 
-	 * @throws ParseException
-	 *             If "CTRL+F" can't be parsed for some strange reason.
-	 */
-	public final void testBindingCacheHitSoft() throws ParseException {
-		// Constants
-		final int cacheHits = 10000;
-		final KeySequence keySequence = KeySequence.getInstance("CTRL+F");
-
-		// Compute once for each context set.
-		final Set contextSet1 = contextManager.getActiveContextIds();
-		bindingManager.getPartialMatches(keySequence);
-		final List contextList = new ArrayList(contextSet1);
-		contextList.remove(contextList.size() - 1);
-		final Set contextSet2 = new HashSet(contextList);
-		contextManager.setActiveContextIds(contextSet2);
-		bindingManager.getPartialMatches(keySequence);
-
-		// Time how long it takes to access the cache;
-		startMeasuring();
-		for (int i = 0; i < cacheHits; i++) {
-			if ((i % 2) == 0) {
-				contextManager.setActiveContextIds(contextSet1);
-			} else {
-				contextManager.setActiveContextIds(contextSet2);
-			}
-			bindingManager.getPartialMatches(keySequence);
-		}
-		stopMeasuring();
-		commitMeasurements();
-		assertPerformance();
-	}
-
-	/**
-	 * <p>
-	 * Tests how long it takes to do a full computation (i.e., a cache miss) on
-	 * an exceptionally large set of bindings. The binding set tries to mimick
-	 * some of the same properties of a "real" binding set.
-	 * </p>
-	 * 
-	 * @throws ParseException
-	 *             If "CTRL+F" can't be parsed for some strange reason.
-	 */
-	public final void testBindingCacheMissLarge() throws ParseException {
-		// Constants
-		final KeySequence keySequence = KeySequence.getInstance("CTRL+F");
-
-		// Time how long it takes to solve the binding set.
-		startMeasuring();
-		bindingManager.getPartialMatches(keySequence);
-		stopMeasuring();
-		commitMeasurements();
-		assertPerformance();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ContentDescriberForTestsOnly.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ContentDescriberForTestsOnly.java
deleted file mode 100644
index 001769d..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ContentDescriberForTestsOnly.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.content.IContentDescriber;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.ITextContentDescriber;
-
-/**
- * This test ContentDescriber added specifically for OpenNavigatorFolderTest.
- * 
- */
-
-public final class ContentDescriberForTestsOnly implements ITextContentDescriber {
-
-	/*
-	 * this "simulated time" represents how long a content describer might
-	 * take parsing a file. Offhand (i.e. just guessing) 2000 msecs would be "bad case" examples. 
-	 * 20 msecs would be near a good, optimistic case.
-	 * I've picked 75 msecs for this test, to represent "normal" case 
-	 * (such as the HTML parser that gave rise to the original bug :)  
-	 * 
-	 * Note: unlike a "real" ContentDescriber, this one only effects "elapsed
-	 * time", not "CPU Time", since all it is doing is sleeping.
-	 */
-	private static final int SIMULATED_CALCULATION_TIME = 75;
-	private static final QualifiedName[] SUPPORTED_OPTIONS = {IContentDescription.CHARSET, IContentDescription.BYTE_ORDER_MARK};
-
-	public int describe(InputStream contents, IContentDescription description) throws IOException {
-		int result = IContentDescriber.INDETERMINATE;
-
-		if (description == null) {
-			result = computeValidity(contents);
-		}
-		else {
-			calculateSupportedOptions(contents, description);
-			// assummming we should return same 'validity' value we did
-			// when called before. (technically, could be a performance issue
-			// in future, so might want to check if any 'ol value would
-			// be ok here.
-			result = computeValidity(contents);
-		}
-
-		return result;
-	}
-
-	public int describe(Reader contents, IContentDescription description) throws IOException {
-		int result = IContentDescriber.INDETERMINATE;
-
-		if (description == null) {
-			result = computeValidity(contents);
-		}
-		else {
-			calculateSupportedOptions(contents, description);
-			// assummming we should return same 'validity' value we did
-			// when called before. (technically, could be a performance issue
-			// in future, so might want to check if hard coded 'valid' would
-			// be ok here.
-			result = computeValidity(contents);
-		}
-
-		return result;
-	}
-
-	public QualifiedName[] getSupportedOptions() {
-
-		return SUPPORTED_OPTIONS;
-	}
-
-	private void calculateSupportedOptions(InputStream contents, IContentDescription description) throws IOException {
-		if (isRelevent(description)) {
-			makeBusy();
-		}
-	}
-
-	private void makeBusy() {
-		// for this test "content type", we don't
-		// really calculate anything. We just
-		// just take a long time doing nothing.
-		try {
-			Thread.sleep(SIMULATED_CALCULATION_TIME);
-		}
-		catch (InterruptedException e) {
-			// never expected
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @param contents
-	 * @param description
-	 * @throws IOException
-	 */
-	private void calculateSupportedOptions(Reader contents, IContentDescription description) throws IOException {
-		if (isRelevent(description)) {
-			makeBusy();
-		}
-	}
-
-	private int computeValidity(InputStream inputStream) {
-		// currently no contents specific check for valid HTML contents
-		// (this may change once we add XHTML content type)
-		return IContentDescriber.INDETERMINATE;
-	}
-
-	private int computeValidity(Reader reader) {
-		// no contents specific check for valid HTML contents
-		// (this may change once we add XHTML content type)
-		return IContentDescriber.INDETERMINATE;
-	}
-
-	/**
-	 * @param description
-	 * @return
-	 */
-	private boolean isRelevent(IContentDescription description) {
-		boolean result = false;
-		if (description == null)
-			result = false;
-		else if (description.isRequested(IContentDescription.BYTE_ORDER_MARK))
-			result = true;
-		else if (description.isRequested(IContentDescription.CHARSET))
-			result = true;
-		return result;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/EditorPerformanceSuite.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/EditorPerformanceSuite.java
deleted file mode 100644
index 5aaf68b..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/EditorPerformanceSuite.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * @since 3.1
- */
-public class EditorPerformanceSuite extends TestSuite {
-    
-    public static final String [] EDITOR_FILE_EXTENSIONS = {"perf_basic", "perf_outline", "java"};
-    public static final String [][] EDITOR_SWITCH_PAIRS = {
-        {"perf_outline", "java"},
-        {"perf_basic", "perf_outline"}};
-    
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new EditorPerformanceSuite();
-    }
-
-    public EditorPerformanceSuite() {
-        addOpenCloseScenarios();
-        addSwitchScenarios();
-        addOpenMultipleScenarios(true);
-        addOpenMultipleScenarios(false);
-    }
-
-    // Commented out: these tests don't seem to be working 
-//    /**
-//     * 
-//     * @since 3.1
-//     */
-//    private void addResizeScenarios() {
-//        for (int i = 0; i < EDITOR_FILE_EXTENSIONS.length; i++) {
-//            addTest(new ResizeTest(new EditorWidgetFactory("1." + EDITOR_FILE_EXTENSIONS[i])));            
-//        }               
-//    }
-
-    /**
-     * 
-     */
-    private void addSwitchScenarios() {
-        for (int i = 0; i < EDITOR_SWITCH_PAIRS.length; i++) {
-            addTest(new EditorSwitchTest(EDITOR_SWITCH_PAIRS[i]));            
-        }       
-    }
-
-    /**
-     * 
-     */
-    private void addOpenMultipleScenarios(boolean closeAll) {
-        for (int i = 0; i < EDITOR_FILE_EXTENSIONS.length; i++) {
-            addTest(new OpenMultipleEditorTest(EDITOR_FILE_EXTENSIONS[i], closeAll, BasicPerformanceTest.NONE));            
-        }
-    }
-
-    /**
-     * 
-     */
-    private void addOpenCloseScenarios() {
-        for (int i = 0; i < EDITOR_FILE_EXTENSIONS.length; i++) {
-            addTest(new OpenCloseEditorTest(EDITOR_FILE_EXTENSIONS[i], i == 3 ? BasicPerformanceTest.LOCAL : BasicPerformanceTest.NONE));            
-        }        
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/EditorSwitchTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/EditorSwitchTest.java
deleted file mode 100644
index 94a78c5..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/EditorSwitchTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.ide.IDE;
-
-/**
- * Test editor switching.
- */
-public class EditorSwitchTest extends BasicPerformanceTest {
-
-	private String extension1;
-
-	private String extension2;
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param testName
-	 *            Test's name.
-	 */
-	public EditorSwitchTest(String[] pair) {
-		super("testEditorSwitch:" + pair[0] + "," + pair[1]);
-		extension1 = pair[0];
-		extension2 = pair[1];
-	}
-
-	/**
-	 * Test editor opening performance. This test always fails.
-	 */
-	protected void runTest() throws CoreException {
-
-		// Open both files outside the loop so as not to include
-		// the initial time to open, just switching.
-		IWorkbenchWindow window = openTestWindow(UIPerformanceTestSetup.PERSPECTIVE1);
-		final IWorkbenchPage activePage = window.getActivePage();
-		final IFile file1 = getProject().getFile("1." + extension1);
-		assertTrue(file1.exists());
-		final IFile file2 = getProject().getFile("1." + extension2);
-		assertTrue(file2.exists());
-		IDE.openEditor(activePage, file1, true);
-		IDE.openEditor(activePage, file2, true);
-		processEvents();
-        EditorTestHelper.calmDown(500, 30000, 500);
-        waitForBackgroundJobs();
-        
-		for (int j = 0; j < 100; j++) {
-
-			startMeasuring();
-			for (int i = 0; i < 12; i++) {
-                IDE.openEditor(activePage, file1, true);
-                processEvents();
-                IDE.openEditor(activePage, file2, true);
-                processEvents();
-			}
-			stopMeasuring();
-            EditorTestHelper.calmDown(500, 30000, 100);
-		}
-        
-		commitMeasurements();
-		assertPerformance();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/EditorTestHelper.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/EditorTestHelper.java
deleted file mode 100644
index ba27a2a..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/EditorTestHelper.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance;
-
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.jobs.IJobManager;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-
-/**
- * @since 3.1
- */
-public class EditorTestHelper {
-
-	public static IEditorPart openInEditor(IFile file, boolean runEventLoop) throws PartInitException {
-		IEditorPart part= IDE.openEditor(getActivePage(), file);
-		if (runEventLoop)
-			runEventQueue(part);
-		return part;
-	}
-
-	public static IEditorPart openInEditor(IFile file, String editorId, boolean runEventLoop) throws PartInitException {
-		IEditorPart part= IDE.openEditor(getActivePage(), file, editorId);
-		if (runEventLoop)
-			runEventQueue(part);
-		return part;
-	}
-
-	public static IDocument getDocument(ITextEditor editor) {
-		IDocumentProvider provider= editor.getDocumentProvider();
-		IEditorInput input= editor.getEditorInput();
-		return provider.getDocument(input);
-	}
-
-	public static void revertEditor(ITextEditor editor, boolean runEventQueue) {
-		editor.doRevertToSaved();
-		if (runEventQueue)
-			runEventQueue(editor);
-	}
-	
-	public static void closeAllEditors() {
-		IWorkbenchPage page= getActivePage();
-		if (page != null)
-			page.closeAllEditors(false);
-	}
-	
-	public static void runEventQueue() {
-		IWorkbenchWindow window= getActiveWorkbenchWindow();
-		if (window != null)
-			runEventQueue(window.getShell());
-	}
-	
-	public static void runEventQueue(IWorkbenchPart part) {
-		runEventQueue(part.getSite().getShell());
-	}
-	
-	public static void runEventQueue(Shell shell) {
-		while (shell.getDisplay().readAndDispatch());
-	}
-	
-	public static void runEventQueue(long minTime) {
-		long nextCheck= System.currentTimeMillis() + minTime;
-		while (System.currentTimeMillis() < nextCheck) {
-			runEventQueue();
-			sleep(1);
-		}
-	}
-	
-	public static IWorkbenchWindow getActiveWorkbenchWindow() {
-		return PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-	}
-
-	public static IWorkbenchPage getActivePage() {
-		IWorkbenchWindow window= getActiveWorkbenchWindow();
-		return window != null ? window.getActivePage() : null;
-	}
-
-	public static Display getActiveDisplay() {
-		IWorkbenchWindow window= getActiveWorkbenchWindow();
-		return window != null ? window.getShell().getDisplay() : null;
-	}
-
-	public static boolean calmDown(long minTime, long maxTime, long intervalTime) {
-		long startTime= System.currentTimeMillis() + minTime;
-		runEventQueue();
-		while (System.currentTimeMillis() < startTime)
-			runEventQueue(intervalTime);
-		
-		long endTime= maxTime > 0 ? System.currentTimeMillis() + maxTime : Long.MAX_VALUE;
-		boolean calm= isCalm();
-		while (!calm && System.currentTimeMillis() < endTime) {
-			runEventQueue(intervalTime);
-			calm= isCalm();
-		}
-//		System.out.println("--------------------------------------------------");
-		return calm;
-	}
-
-	public static void sleep(int intervalTime) {
-		try {
-			Thread.sleep(intervalTime);
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	public static boolean isCalm() {
-		IJobManager jobManager= Platform.getJobManager();
-		Job[] jobs= jobManager.find(null);
-		for (int i= 0; i < jobs.length; i++) {
-			Job job= jobs[i];
-			int state= job.getState();
-//			System.out.println(job.getName() + ": " + getStateName(state));
-			if (state == Job.RUNNING || state == Job.WAITING) {
-//				System.out.println();
-				return false;
-			}
-		}
-//		System.out.println();
-		return true;
-	}
-
-//	private static String getStateName(int state) {
-//		switch (state) {
-//			case Job.RUNNING: return "RUNNING";
-//			case Job.WAITING: return "WAITING";
-//			case Job.SLEEPING: return "SLEEPING";
-//			case Job.NONE: return "NONE";
-//			default: return "unknown " + state;
-//		}
-//	}
-
-	public static boolean showView(String viewId) throws PartInitException {
-		IWorkbenchPage activePage= getActivePage();
-		IViewReference view= activePage.findViewReference(viewId);
-		boolean notShown= view == null;
-		if (notShown)
-			activePage.showView(viewId);
-		return notShown;
-	}
-
-	public static boolean hideView(String viewId) {
-		IWorkbenchPage activePage= getActivePage();
-		IViewReference view= activePage.findViewReference(viewId);
-		boolean shown= view != null;
-		if (shown)
-			activePage.hideView(view);
-		return shown;
-	}
-
-	public static void bringToTop() {
-		getActiveWorkbenchWindow().getShell().forceActive();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/GenerateIdentifiersTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/GenerateIdentifiersTest.java
deleted file mode 100644
index 83d48bf..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/GenerateIdentifiersTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-import org.eclipse.ui.activities.IActivityManager;
-
-/**
- * @since 3.1
- *
- */
-public class GenerateIdentifiersTest extends BasicPerformanceTest {
-
-    private int count;
-
-    public GenerateIdentifiersTest(int numberOfIdentifiers) {
-        super("Generate " + numberOfIdentifiers + " identifiers");
-        this.count = numberOfIdentifiers;
-    }
-    
-    protected void runTest() throws Throwable {       
-        final IActivityManager activityManager = fWorkbench.getActivitySupport().getActivityManager();
-        
-        exercise(new TestRunnable() {
-            public void run() throws Exception {
-                // construct the Identifiers to test
-                final String [] ids = new String[count];
-                for (int i = 0; i < ids.length; i++) {
-                    long timestamp = System.currentTimeMillis();
-                    ids[i] = "org.eclipse.jdt.ui/" + i + timestamp;
-                }
-                
-                startMeasuring();
-                for(int i = 0; i < ids.length; i++) {
-                    activityManager.getIdentifier(ids[i]);
-                }                
-                stopMeasuring();
-            } 
-        });
-        commitMeasurements();
-        assertPerformance();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ObjectContributionClasses.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ObjectContributionClasses.java
deleted file mode 100644
index f303543..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ObjectContributionClasses.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.mapping.*;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.ui.IContributorResourceAdapter;
-import org.eclipse.ui.ide.IContributorResourceAdapter2;
-
-public class ObjectContributionClasses implements IAdapterFactory {
-	
-	public static final String PROJECT_NAME = "testContributorResourceAdapter";
-	
-	public static interface ICommon {
-	}
-	
-	public static class Common implements ICommon {		
-	}
-	
-	public static interface IA {
-	}
-	
-	public static class A implements IA {	
-	}
-	
-	public static class A1 extends A {
-	}
-	
-	public static class A11 extends A1 {
-	}
-	
-	public static interface IB {
-	}
-	
-	public static class B implements IB {
-	}
-	
-	public static class B2 implements IB {
-	}
-	
-	public static class D extends Common implements IA {
-	}
-	
-	public static class C implements ICommon {
-	}
-	
-	public static class CResource implements IAdaptable {
-		public Object getAdapter(Class adapter) {
-			if(adapter == IContributorResourceAdapter.class) {
-				return new ResourceAdapter();
-			}			
-			return null;
-		}		
-	}
-	
-	public static class CFile implements IAdaptable {
-		public Object getAdapter(Class adapter) {
-			if(adapter == IContributorResourceAdapter.class) {
-				return new ResourceAdapter();
-			}			
-			return null;
-		}		
-	}
-	
-	// Returns a contribution adapter that doesn't handle ResourceMappings
-	public static class CResourceOnly implements IAdaptable {
-		public Object getAdapter(Class adapter) {
-			if(adapter == IContributorResourceAdapter.class) {
-				return new ResourceOnlyAdapter();
-			}			
-			return null;
-		}		
-	}
-    
-    public interface IModelElement {
-    }
-	
-    public static class ModelElement extends PlatformObject implements IModelElement {
-    }
-    
-	// Default contributor adapter
-	
-	public static class ResourceAdapter implements IContributorResourceAdapter2 {
-		public IResource getAdaptedResource(IAdaptable adaptable) {
-			if(adaptable instanceof CResource) {
-				return ResourcesPlugin.getWorkspace().getRoot();
-			}
-			if(adaptable instanceof CFile) {
-				return ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECT_NAME).getFile("dummy");
-			}
-			return null;
-		}
-        public ResourceMapping getAdaptedResourceMapping(IAdaptable adaptable) {
-            return (ResourceMapping)getAdaptedResource(adaptable).getAdapter(ResourceMapping.class);
-        }	
-	}
-	
-	// Contributor adapter that doesn't handle resource mappings
-	
-	public static class ResourceOnlyAdapter implements IContributorResourceAdapter {
-		public IResource getAdaptedResource(IAdaptable adaptable) {
-			if(adaptable instanceof CResourceOnly) {
-				return ResourcesPlugin.getWorkspace().getRoot();
-			}
-			return null;
-		}
-	}
-	
-	// Adapter methods
-	
-	public Object getAdapter(final Object adaptableObject, Class adapterType) {
-		if(adapterType == IContributorResourceAdapter.class) {
-			return new ResourceAdapter();
-		}
-		if(adaptableObject instanceof IA && adapterType == IA.class) {
-			return new A();
-		}
-		if(adapterType == IResource.class) {
-			return ResourcesPlugin.getWorkspace().getRoot();
-		}
-		if(adapterType == ICommon.class) {
-			return new Common();
-		}
-        if(adapterType == ResourceMapping.class) {
-            return new ResourceMapping() {    
-                public ResourceTraversal[] getTraversals(ResourceMappingContext context, IProgressMonitor monitor) {
-                    return new ResourceTraversal[] {
-                            new ResourceTraversal(new IResource[] {ResourcesPlugin.getWorkspace().getRoot()}, IResource.DEPTH_INFINITE, IResource.NONE)
-                    };
-                }
-                public IProject[] getProjects() {
-                    return ResourcesPlugin.getWorkspace().getRoot().getProjects();
-                }
-                public Object getModelObject() {
-                    return adaptableObject;
-                }
-				public String getModelProviderId() {
-					return ModelProvider.RESOURCE_MODEL_PROVIDER_ID;
-				}
-            };
-        }
-        
-		return null;
-	}
-
-	public Class[] getAdapterList() {
-		return new Class[] { ICommon.class, IResource.class, IFile.class, IContributorResourceAdapter.class, ResourceMapping.class};
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ObjectContributionTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ObjectContributionTest.java
deleted file mode 100644
index acf173f..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ObjectContributionTest.java
+++ /dev/null
@@ -1,444 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance;
-
-import java.io.ByteArrayInputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.SubContributionItem;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.PluginActionContributionItem;
-import org.eclipse.ui.internal.PopupMenuExtender;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.tests.performance.ObjectContributionClasses.ICommon;
-/**
- * Tests that object contributions are enabled and shown correctly in pop-up
- * menus depending on the state of the workbench. This test relies on the
- * <code>plugin.xml</code> file containing certain values. Please see the
- * appropriate section in that file for more information about the initial
- * set-up.
- * 
- * @since 3.0
- */
-public final class ObjectContributionTest extends UITestCase {
-
-    /**
-     * Constructs a new instance of <code>ObjectContributionTest</code> with
-     * the name of the test.
-     * 
-     * @param name
-     *            The name of the test; may be <code>null</code>.
-     */
-    public ObjectContributionTest(final String name) {
-        super(name);
-    }
-
-    /**
-     * Tests whether the content-type object contribution works. This is testing
-     * a use care familiar to Ant UI. The content-type scans an XML file to see
-     * if its root element is <code>&lt;project&gt;</code>.
-     * 
-     * @throws CoreException
-     *             If a problem occurs when creating the project or file, or if
-     *             the project can't be opened.
-     */
-    public final void testObjectStateContentType() throws CoreException {
-        // Create an XML file with <project> as its root element.
-        final IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        final IProject testProject = workspace.getRoot().getProject(
-                "ObjectContributionTestProject");
-        testProject.create(null);
-        testProject.open(null);
-        final IFile xmlFile = testProject.getFile("ObjectContributionTest.xml");
-        final String contents = "<testObjectStateContentTypeElement></testObjectStateContentTypeElement>";
-        final ByteArrayInputStream inputStream = new ByteArrayInputStream(
-                contents.getBytes());
-        xmlFile.create(inputStream, true, null);
-        final ISelection selection = new StructuredSelection(xmlFile);
-        assertPopupMenus("1", new String[] {"org.eclipse.ui.tests.testObjectStateContentType"}, selection, null, true);
-    }
-    
-    /**
-     * This tests backwards compatibility support for adaptable IResource objectContributions. This
-     * allows IResource adaptable contributions without an adapter factory and using
-     * the IContributorResourceAdapter factory. In addition, test the ResourceMapping adaptations.
-     * 
-     * @since 3.1
-     */
-    public final void testContributorResourceAdapter() throws CoreException {
-    	
-    	final IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        final IProject testProject = workspace.getRoot().getProject(ObjectContributionClasses.PROJECT_NAME);
-        if(! testProject.exists()) {
-        	testProject.create(null);
-        }
-        if(! testProject.isOpen()) {
-        	testProject.open(null);
-        }
-    	
-    	assertPopupMenus("1",
-    			new String[] {"IResource.1"}, 
-    			new StructuredSelection(new Object[] {new ObjectContributionClasses.CResource()}),
-				IResource.class,
-				true
-			);
-    	assertPopupMenus("2",
-    			new String[] {"IProject.1"}, 
-    			new StructuredSelection(new Object[] {new ObjectContributionClasses.CFile()}),
-				null,
-				false
-			);
-    	assertPopupMenus("3", 
-    			new String[] {"IFile.1"}, 
-    			new StructuredSelection(new Object[] {new ObjectContributionClasses.CFile()}),
-				IFile.class,
-				true
-			);
-    	assertPopupMenus("4", 
-    			new String[] {"IResource.1"}, 
-    			new StructuredSelection(new Object[] {new ObjectContributionClasses.CFile(), new ObjectContributionClasses.CResource()}),
-				IResource.class,
-				true
-			);
-    	assertPopupMenus("5", 
-    			new String[] {"IFile.1", "IProject.1"}, 
-    			new StructuredSelection(new Object[] {new ObjectContributionClasses.CFile(), new ObjectContributionClasses.CResource()}),
-				IResource.class,
-				false
-			);
-        assertPopupMenus("6", 
-                new String[] {"ResourceMapping.1"}, 
-                new StructuredSelection(new Object[] {new ObjectContributionClasses.CFile(), new ObjectContributionClasses.CResource()}),
-                ResourceMapping.class,
-                true
-            );
-        assertPopupMenus("7", 
-                new String[] {"ResourceMapping.1", "IResource.1"}, 
-                new StructuredSelection(new Object[] {new ObjectContributionClasses.ModelElement()}),
-                ResourceMapping.class,
-                true
-            );
-        // Ensure that the case where an object uses a contribution adapter that doesn't handle mappings
-        // will still show the menus for resource mappings
-        assertPopupMenus("8", 
-                new String[] {"ResourceMapping.1", "IResource.1"}, 
-                new StructuredSelection(new Object[] {new ObjectContributionClasses.CResourceOnly()}),
-                ResourceMapping.class,
-                true
-            );
-    }
-    
-    /**
-     * This tests adaptable contributions that are not IResource.
-     * 
-     * @since 3.1
-     */
-    public final void testAdaptables()  {
-    	assertPopupMenus("1", 
-    			new String[] {"ICommon.1"}, 
-    			new StructuredSelection(new Object[] {
-    					new ObjectContributionClasses.A()}),
-				ICommon.class,
-				true
-			);  
-    	assertPopupMenus("2", 
-    			new String[] {"ICommon.1"}, 
-    			new StructuredSelection(new Object[] {
-    					new ObjectContributionClasses.A(), 
-						new ObjectContributionClasses.B()}),
-				ICommon.class,
-				true
-			);      	
-    	assertPopupMenus("3", 
-    			new String[] {"ICommon.1"}, 
-    			new StructuredSelection(new Object[] {
-    					new ObjectContributionClasses.A(), 
-						new ObjectContributionClasses.B(), 
-						new ObjectContributionClasses.C(),
-						new ObjectContributionClasses.Common()
-				}),
-				ICommon.class,
-				true
-			);
-    	assertPopupMenus("4", 
-    			new String[] {"ICommon.1"}, 
-    			new StructuredSelection(new Object[] {
-    					new ObjectContributionClasses.Common(), 
-						new ObjectContributionClasses.C(), 
-						new ObjectContributionClasses.B(),
-						new ObjectContributionClasses.A()
-				}),
-				ICommon.class,
-				true
-			);
-    	assertPopupMenus("5", 
-    			new String[] {"ICommon.1"}, 
-    			new StructuredSelection(new Object[] {
-    					new ObjectContributionClasses.Common(), 
-						new ObjectContributionClasses.C(), 
-						new ObjectContributionClasses.B(),
-						new ObjectContributionClasses.C(), 
-						new ObjectContributionClasses.A(),
-						new ObjectContributionClasses.Common() 
-				}),
-				ICommon.class,
-				true
-			);
-    	assertPopupMenus("6", 
-    			new String[] {"ICommon.1"}, 
-    			new StructuredSelection(new Object[] { 
-						new ObjectContributionClasses.C(),
-						new ObjectContributionClasses.Common()
-				}),
-				ICommon.class,
-				true
-			);
-    	assertPopupMenus("7", 
-    			new String[] {"ICommon.1"}, 
-    			new StructuredSelection(new Object[] { 
-						new Object()				
-				}),
-				ICommon.class,
-				false
-			);
-    	assertPopupMenus("8", 
-    			new String[] {"ICommon.1"}, 
-    			new StructuredSelection(new Object[] { 
-    					new ObjectContributionClasses.C(),
-						new Object()				
-				}),
-				ICommon.class,
-				false
-			);
-    	assertPopupMenus("9", 
-    			new String[] {"ICommon.1"}, 
-    			new StructuredSelection(new Object[] { 
-    					new ObjectContributionClasses.C(),
-    					new ObjectContributionClasses.A(),
-						new Object()				
-				}),
-				ICommon.class,
-				false
-			);
-    }
-    
-    /**
-     * Ensure that there are no duplicate contributions.
-     * 
-     * @since 3.1
-     */
-    public final void testDuplicateAdaptables() {
-    	assertPopupMenus("1",
-    			new String[] {"ICommon.1"}, 
-    			new StructuredSelection(new Object[] {
-    					new ObjectContributionClasses.D()}),
-				ICommon.class,
-				true
-			);
-    	// repeat test on purpose to ensure no double call duplicates.    	
-    	assertPopupMenus("1",
-    			new String[] {"ICommon.1"}, 
-    			new StructuredSelection(new Object[] {
-    					new ObjectContributionClasses.D()}),
-				ICommon.class,
-				true
-			);
-    	assertPopupMenus("2",
-    			new String[] {"ICommon.1"}, 
-    			new StructuredSelection(new Object[] {
-    					new ObjectContributionClasses.D(),
-						new ObjectContributionClasses.A()
-						}),
-				ICommon.class,
-				true
-			);
-    	assertPopupMenus("3",
-    			new String[] {"ICommon.1"}, 
-    			new StructuredSelection(new Object[] {
-    					new ObjectContributionClasses.A(),
-						new ObjectContributionClasses.D()
-						}),
-				ICommon.class,
-				true
-			);
-    	assertPopupMenus("4",
-    			new String[] {"ICommon.1"}, 
-    			new StructuredSelection(new Object[] {
-    					new ObjectContributionClasses.Common(),
-						new ObjectContributionClasses.D()
-						}),
-				ICommon.class,
-				true
-			);
-    	assertPopupMenus("5",
-    			new String[] {"ICommon.1"}, 
-    			new StructuredSelection(new Object[] {    					
-						new ObjectContributionClasses.D(),
-						new ObjectContributionClasses.Common()
-						}),
-				ICommon.class,
-				true
-			);
-    }
-    
-    /**
-     * Test non-adaptable contributions
-     * 
-     * @since 3.1
-     */
-    public final void testNonAdaptableContributions()  {
-    	assertPopupMenus("1",
-    			new String[] {"ICommon.2"}, 
-    			new StructuredSelection(new Object[] {
-    					new ObjectContributionClasses.A(),
-						new ObjectContributionClasses.B()}),
-				ICommon.class,
-				false
-			);
-    	assertPopupMenus("2",
-    			new String[] {"ICommon.2"}, 
-    			new StructuredSelection(new Object[] {
-    					new ObjectContributionClasses.D(),
-						new ObjectContributionClasses.C(),
-						new ObjectContributionClasses.Common()}),
-				ICommon.class,
-				true
-			); 
-    	assertPopupMenus("3",
-    			new String[] {"Common.2"}, 
-    			new StructuredSelection(new Object[] {
-    					new ObjectContributionClasses.D(),
-						new ObjectContributionClasses.C(),
-						new ObjectContributionClasses.A()}),
-				ICommon.class,
-				false
-			); 
-    	assertPopupMenus("4",
-    			new String[] {"Common.2"}, 
-    			new StructuredSelection(new Object[] {
-    					new ObjectContributionClasses.B(),
-						new ObjectContributionClasses.C(),
-						new ObjectContributionClasses.A()}),
-				ICommon.class,
-				false
-			); 
-    }
-    
-    /**
-     * Helper class that will create a popup menu based on the given selection and
-     * then ensure that the provided commandIds are added to the menu.
-     * 
-     * @param commandIds the command ids that should appear in the menu
-     * @param selection the selection on which to contribute object contributions
-     */
-    public void assertPopupMenus(String name, String[] commandIds, final ISelection selection, Class selectionType, boolean existance) {
-    	ISelectionProvider selectionProvider = new ISelectionProvider() {
-			public void addSelectionChangedListener(ISelectionChangedListener listener) {
-			}
-			public ISelection getSelection() {
-				return selection;
-			}
-			public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-			}
-			public void setSelection(ISelection selection) {
-			}
-		};
-		
-		// The popup extender needs a part to notify actions of the active part
-        final WorkbenchWindow window = (WorkbenchWindow) PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-        final IWorkbenchPage page = window.getActivePage();
-        IWorkbenchPart part = page.getActivePartReference().getPart(true);
-    	
-    	 // Create a fake PopupMenuExtender so we can get some data back.
-        final MenuManager fakeMenuManager = new MenuManager();
-        fakeMenuManager.add(new GroupMarker(
-                org.eclipse.ui.IWorkbenchActionConstants.MB_ADDITIONS));
-        final PopupMenuExtender extender = new PopupMenuExtender(null,
-                fakeMenuManager, selectionProvider, part);
-        
-        
-
-        /*
-         * Pretend to show the pop-up menu -- looking to motivate the extender
-         * to fill the menu based on the selection provider.
-         * 
-         * TODO This causes a big delay (in the order of a minute or more) while
-         * trying to fill this menu. It seems to be loading a bunch of plug-ins,
-         * and doing class loading.
-         */
-        extender.menuAboutToShow(fakeMenuManager);
-
-        extender.dispose();
-        
-        // Check to see if the appropriate object contributions are present.
-        final IContributionItem[] items = fakeMenuManager.getItems();
-        Set seenCommands = new HashSet(Arrays.asList(commandIds));
-        List commands = new ArrayList(Arrays.asList(commandIds));
-        for (int i = 0; i < items.length; i++) {
-           IContributionItem contributionItem = items[i];
-           // Step 1: test the selection
-           if (selectionType != null) {
-				IContributionItem item = contributionItem;
-				if (item instanceof SubContributionItem) {
-					item = ((SubContributionItem) contributionItem).getInnerItem();
-				}
-				if (item instanceof PluginActionContributionItem) {
-					// Verify that the selection passed to the action has been
-					// converted
-					ISelection s = null;
-					if (s instanceof IStructuredSelection) {
-						for (Iterator it = ((IStructuredSelection) s).iterator(); it.hasNext();) {
-							Object element = it.next();
-							assertTrue(name + " selection not converted", selectionType.isInstance(element));
-						}
-					}
-				}
-			}
-           // Step 2: remember that we saw this element
-           String id = contributionItem.getId();
-           if(existance) {    		
-           		boolean removed = commands.remove(id);	
-           		if(seenCommands.contains(id) && ! removed) {
-           			fail(name + " item duplicated in the context menu: " + id);
-           		}           		
-           } else {
-           		assertTrue(name + " item should not be in the context menu", ! commands.contains(id));
-           }
-        }
-        
-        if(existance && ! commands.isEmpty()) {
-        	fail(name + " Missing " + commands.toString() + " from context menu.");
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ObjectContributionsPerformance.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ObjectContributionsPerformance.java
deleted file mode 100644
index 67491f5..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ObjectContributionsPerformance.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.test.performance.Dimension;
-
-public class ObjectContributionsPerformance extends BasicPerformanceTest {
-
-	public  static final int SEED = 1001001;
-	private IStructuredSelection selection;
-	
-	public static Test suite() {
-		TestSuite suite = new TestSuite("Object contribution performance");
-        suite.addTest(new ObjectContributionsPerformance(
-                "large selection, limited contributors",
-                generateAdaptableSelection(SEED, 5000),
-                BasicPerformanceTest.NONE));
-        suite
-                .addTest(new ObjectContributionsPerformance(
-                        "limited selection, limited contributors",
-                        generateAdaptableSelection(SEED, 50),
-                        BasicPerformanceTest.NONE));
-        return suite;
-	}
-	
-	public ObjectContributionsPerformance(String label, IStructuredSelection selection, int tagging) {
-		super("testObjectContributions:" + label, tagging);
-		this.selection = selection;
-	}
-
-	protected void runTest() {
-		ObjectContributionTest tests = new ObjectContributionTest(
-                "testObjectContributions");
-        tagIfNecessary("UI - " + selection.size() + " contribution(s)",
-                Dimension.ELAPSED_PROCESS);
-        setDegradationComment("<a href=https://bugs.eclipse.org/bugs/show_bug.cgi?id=88274>See Bug 88274</a> ");
-        startMeasuring();
-        for (int i = 0; i < 5000; i++) {
-            tests.assertPopupMenus("1", new String[] { "bogus" }, selection,
-                    null, false);
-        }
-        stopMeasuring();
-        commitMeasurements();
-        assertPerformance();
-	}
-	
-	protected static IStructuredSelection generateAdaptableSelection(int seed, int size) {
-		Random rand = new Random(seed);
-		List selection = new ArrayList();
-		for (int i = 0; i < size; i++) {
-			switch ((int) Math.round(rand.nextDouble() * 5)) {
-				case 0 :
-					selection.add(new ObjectContributionClasses.A());
-					break;
-				case 1 :
-					selection.add(new ObjectContributionClasses.B());
-					break;
-				case 2 :
-					selection.add(new ObjectContributionClasses.C());
-					break;
-				case 3 :
-					selection.add(new ObjectContributionClasses.Common());
-					break;
-				case 4 :
-					selection.add(new ObjectContributionClasses.D());
-					break;
-				case 5 :
-					selection.add(new ObjectContributionClasses.A1());
-					break;
-				default :
-					selection.add(new Object());
-			}
-		}
-		return new StructuredSelection(selection);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenCloseEditorTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenCloseEditorTest.java
deleted file mode 100644
index 9b95cef..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenCloseEditorTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.ide.IDE;
-
-/**
- * @since 3.1
- */
-public class OpenCloseEditorTest extends BasicPerformanceTest {
-
-	private String extension;
-
-	public OpenCloseEditorTest(String extension, int tagging) {
-		super("testOpenAndCloseEditors:" + extension, tagging);
-		this.extension = extension;
-	}
-
-	protected void runTest() throws Throwable {
-		final IFile file = getProject().getFile("1." + extension);
-		assertTrue(file.exists());
-		
-		IWorkbenchWindow window = openTestWindow(UIPerformanceTestSetup.PERSPECTIVE1);
-		final IWorkbenchPage activePage = window.getActivePage();
-
-        exercise(new TestRunnable() {
-            public void run() throws Exception {
-                startMeasuring();
-                for (int j = 0; j < 10; j++) {
-                    IEditorPart part = IDE.openEditor(activePage, file, true);
-                    processEvents();
-                    activePage.closeEditor(part, false);
-                    processEvents();
-                    
-                }
-                stopMeasuring();
-            } 
-        });
-        
-		tagIfNecessary("UI - Open/Close Editor", Dimension.ELAPSED_PROCESS);
-		commitMeasurements();
-		assertPerformance();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenClosePerspectiveTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenClosePerspectiveTest.java
deleted file mode 100644
index db914b0..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenClosePerspectiveTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-import java.util.HashMap;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.NotEnabledException;
-import org.eclipse.core.commands.NotHandledException;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-
-/**
- * @since 3.1
- */
-public class OpenClosePerspectiveTest extends BasicPerformanceTest {
-
-    private String id;
-
-    /**
-     * @param tagging
-     * @param testName
-     */
-    public OpenClosePerspectiveTest(String id, int tagging) {
-        super("testOpenClosePerspectives:" + id, tagging);
-        this.id = id;
-    }
-    
-    protected void runTest() throws Throwable {
-        // Get the two perspectives to switch between.
-        final IPerspectiveRegistry registry = WorkbenchPlugin.getDefault()
-                .getPerspectiveRegistry();
-        final IPerspectiveDescriptor perspective1 = registry
-                .findPerspectiveWithId(id);
-
-        // Don't fail if we reference an unknown perspective ID. This can be
-        // a normal occurrance since the test suites reference JDT perspectives, which
-        // might not exist.
-        if (perspective1 == null) {
-            System.out.println("Unknown perspective id: " + id);
-            return;
-        }
-        
-        // create a nice clean window.
-        IWorkbenchWindow window = openTestWindow();          
-        final IWorkbenchPage activePage = window.getActivePage();
-        
-        //causes creation of all views 
-        activePage.setPerspective(perspective1);
-        IViewReference [] refs = activePage.getViewReferences();
-        //get the IDs now - after we close hte perspective the view refs will be partiall disposed and their IDs will be null
-        String [] ids = new String[refs.length];
-        for (int i = 0; i < refs.length; i++) {
-            ids[i] = refs[i].getId();
-        }
-        closePerspective(activePage);
-        //populate the empty perspective with all view that will be shown in the test view
-        for (int i = 0; i < ids.length; i++) {
-            activePage.showView(ids[i]);
-        }      
-
-        tagIfNecessary("UI - Open/Close " + perspective1.getLabel() + " Perspective", Dimension.ELAPSED_PROCESS);
-        
-        exercise(new TestRunnable() {
-            public void run() throws Exception {
-                processEvents();
-                EditorTestHelper.calmDown(500, 30000, 500);
-                
-                startMeasuring();
-                activePage.setPerspective(perspective1);
-                processEvents();      
-                closePerspective(activePage);
-                processEvents(); 
-                stopMeasuring();
-            } 
-        });
-        
-        commitMeasurements();
-        assertPerformance();
-    }
-
-    /**
-     * @param activePage
-     */
-    private void closePerspective(IWorkbenchPage activePage) {
-		IPerspectiveDescriptor persp = activePage.getPerspective();
-
-		ICommandService commandService = (ICommandService) fWorkbench
-				.getService(ICommandService.class);
-		Command command = commandService
-				.getCommand("org.eclipse.ui.window.closePerspective");
-
-		HashMap parameters = new HashMap();
-		parameters.put("org.eclipse.ui.window.closePerspective.perspectiveId",
-				persp.getId());
-
-		ParameterizedCommand pCommand = ParameterizedCommand.generateCommand(
-				command, parameters);
-
-		IHandlerService handlerService = (IHandlerService) fWorkbench
-				.getService(IHandlerService.class);
-		try {
-			handlerService.executeCommand(pCommand, null);
-		} catch (ExecutionException e1) {
-		} catch (NotDefinedException e1) {
-		} catch (NotEnabledException e1) {
-		} catch (NotHandledException e1) {
-		}
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenCloseViewTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenCloseViewTest.java
deleted file mode 100644
index 7472211..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenCloseViewTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance;
-
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * Performance tests for showing views.
- * There are separate tests for showing a simple view (MockViewPart)
- * and a more complex view (Resource Navigator).
- * The views are shown in an empty perspective.
- */
-public class OpenCloseViewTest extends BasicPerformanceTest {
-
-    private String viewId;
-
-    public OpenCloseViewTest(String viewId, int tagging) {
-        super("showView:" + viewId, tagging);
-        this.viewId = viewId;
-    }
-
-    protected void runTest() throws Throwable {
-        IWorkbenchWindow window = openTestWindow();
-        final IWorkbenchPage page = window.getActivePage();
-        
-        // prime it
-        IViewPart view1 = page.showView(viewId);
-        page.hideView(view1);
-        waitForBackgroundJobs();
-        processEvents();
-        
-       	tagIfNecessary("UI - Open/Close " + view1.getTitle(), Dimension.ELAPSED_PROCESS);
-        	
-		for (int j = 0; j < 100; j++) {
-
-			startMeasuring();
-			for (int i = 0; i < 5; i++) {
-				IViewPart view = page.showView(viewId);
-				processEvents();
-
-				page.hideView(view);
-				processEvents();
-			}
-			stopMeasuring();
-		}
-
-        commitMeasurements();
-        assertPerformance();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenCloseWindowTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenCloseWindowTest.java
deleted file mode 100644
index dd0e251..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenCloseWindowTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * @since 3.1
- */
-public class OpenCloseWindowTest extends BasicPerformanceTest {
-
-    private String id;
-
-    /**
-     * @param tagging
-     * @param testName
-     */
-    public OpenCloseWindowTest(String id, int tagging) {
-        super("testOpenCloseWindows:" + id, tagging);
-        this.id = id;
-    }
-    
-    protected void runTest() throws Throwable {
-    	
-    	tagIfNecessary("UI - Open/Close Window", Dimension.ELAPSED_PROCESS);
-        
-    	setDegradationComment("<a href=https://bugs.eclipse.org/bugs/show_bug.cgi?id=179725>See Bug 179725</a> ");
-
-    	exercise(new TestRunnable() {
-            public void run() throws Exception {
-                processEvents();
-                EditorTestHelper.calmDown(500, 30000, 500);
-                
-                startMeasuring();
-                IWorkbenchWindow window = openTestWindow(id);
-                processEvents();   
-                window.close();
-                processEvents(); 
-                stopMeasuring();
-            } 
-        });
-                
-        commitMeasurements();
-        assertPerformance();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenMultipleEditorTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenMultipleEditorTest.java
deleted file mode 100644
index a450866..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenMultipleEditorTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.ide.IDE;
-
-/**
- * @since 3.1
- */
-public class OpenMultipleEditorTest extends BasicPerformanceTest {
-
-    private String extension;
-    private boolean closeAll;
-
-    /**
-     * @param testName
-     */
-    public OpenMultipleEditorTest(String extension, boolean closeAll, int tagging) {
-        super ("testOpenMultipleEditors:" + extension + (closeAll ? "[closeAll]" : "[closeEach]"), tagging);
-        this.extension = extension;        
-        this.closeAll = closeAll;
-    }
-    
-    protected void runTest() throws Throwable {
-    	setDegradationComment("<a href=https://bugs.eclipse.org/bugs/show_bug.cgi?id=179578>See Bug 179578</a>");
-		IWorkbenchWindow window = openTestWindow(UIPerformanceTestSetup.PERSPECTIVE1);
-		IWorkbenchPage activePage = window.getActivePage();
-        
-        tagIfNecessary("UI - Open Multiple Editors",Dimension.ELAPSED_PROCESS);
-        
-        startMeasuring();      
-                
-        for (int i = 0; i < 100; i++) {
-            IFile file = getProject().getFile(i + "." + extension);
-            IDE.openEditor(activePage, file, true);
-            processEvents();
-        }
-        if (closeAll) {
-            activePage.closeAllEditors(false);
-        }
-        else {
-            IEditorPart [] parts = activePage.getEditors();
-            for (int i = 0; i < parts.length; i++) {
-                activePage.closeEditor(parts[i], false);
-            }
-        }
-        stopMeasuring();
-        commitMeasurements();
-        assertPerformance();        
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenNavigatorFolderTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenNavigatorFolderTest.java
deleted file mode 100644
index e371250..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/OpenNavigatorFolderTest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.net.URL;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-import junit.framework.Assert;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.test.performance.PerformanceTestCase;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.views.navigator.ResourceNavigator;
-import org.osgi.framework.Bundle;
-
-/**
- * This class/test was originally written for WTP bug 106158, and adapted to a
- * generic "platform" test case, since some of the problem was due to bug
- * 107121
- * 
- * Thanks for Jeffrey Liu (jeffliu@ca.ibm.com) who wrote the test for WTP.
- * 
- * And, thanks to Eric Glass <ericglass@maximus.com> for opening bug 106158
- * (100% CPU for over 3 minutes opening a directory in the Navigator view with
- * over 2000 HTML files) https://bugs.eclipse.org/bugs/show_bug.cgi?id=106158
- * and for providing 2500 "generic" HTML files for the original test case in
- * WTP.
- * 
- * modified by David Williams for platform level test that does not depend on
- * WTP or, for that matter, any meaningful content type. The content type
- * assumed there is designed simply to "take a while" to complete, if asked
- * for its properties.
- * 
- * Note, since this test companion "ContentDescriberForTestsOnly", simply uses
- * "sleep" to simulate computations, it only effects Elapsed Time (not CPU
- * Time).
- * 
- */
-public class OpenNavigatorFolderTest extends PerformanceTestCase {
-	/*
-	 * performance testcase for bug 106158
-	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=106158
-	 */
-	public void testOpenNavigatorFolder() {
-		IProject project = createProject("testViewAndContentTypeProject");
-		Bundle bundle = Platform.getBundle("org.eclipse.ui.tests.performance");
-		URL url = bundle.getEntry("data/testContentType.zip");
-		ZipInputStream zis = null;
-		try {
-			zis = new ZipInputStream(url.openStream());
-			ZipEntry entry = zis.getNextEntry();
-			while (entry != null) {
-				ByteArrayOutputStream baos = new ByteArrayOutputStream();
-				try {
-					byte[] b = new byte[2048];
-					int read = zis.read(b);
-					while (read != -1) {
-						baos.write(b, 0, read);
-						read = zis.read(b);
-					}
-				}
-				catch (IOException e) {
-					Assert.fail(e.getMessage());
-				}
-				finally {
-					try {
-						baos.close();
-					}
-					catch (IOException e) {
-						Assert.fail(e.getMessage());
-					}
-				}
-				IFile file = project.getFile(entry.getName());
-				ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-				try {
-					if (!file.exists())
-						file.create(bais, true, new NullProgressMonitor());
-					else
-						file.setContents(bais, true, false, new NullProgressMonitor());
-				}
-				catch (CoreException e) {
-					Assert.fail(e.getMessage());
-				}
-				finally {
-					try {
-						bais.close();
-					}
-					catch (IOException e) {
-						Assert.fail(e.getMessage());
-					}
-				}
-				entry = zis.getNextEntry();
-			}
-		}
-		catch (IOException e) {
-			Assert.fail(e.getMessage());
-		}
-		finally {
-			try {
-				if (zis != null) {
-					zis.close();
-				}
-			}
-			catch (IOException e) {
-				Assert.fail(e.getMessage());
-			}
-		}
-		startMeasuring();
-		IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-		IViewPart view = null;
-		try {
-			view = activePage.showView("org.eclipse.ui.views.ResourceNavigator");
-		}
-		catch (PartInitException e) {
-			Assert.fail(e.getMessage());
-		}
-		ResourceNavigator navigatorView = null;
-		try {
-			navigatorView = (ResourceNavigator) view;
-		}
-		catch (ClassCastException e) {
-			Assert.fail(e.getMessage());
-		}
-		navigatorView.getTreeViewer().expandAll();
-		stopMeasuring();
-		commitMeasurements();
-		assertPerformance();
-	}
-
-	private IProject createProject(String name) {
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
-		if (!project.exists()) {
-			try {
-				project.create(new NullProgressMonitor());
-				project.open(new NullProgressMonitor());
-			}
-			catch (CoreException e) {
-				Assert.fail(e.getMessage());
-			}
-		}
-		return project;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/PerformancePerspective1.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/PerformancePerspective1.java
deleted file mode 100644
index 686c165..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/PerformancePerspective1.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- * @since 3.1
- */
-public class PerformancePerspective1 implements IPerspectiveFactory {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout)
-     */
-    public void createInitialLayout(IPageLayout layout) {
-        layout.addView(IPageLayout.ID_OUTLINE, IPageLayout.RIGHT, .75f, IPageLayout.ID_EDITOR_AREA);
-        layout.addView(IPageLayout.ID_PROP_SHEET, IPageLayout.BOTTOM, .75f, IPageLayout.ID_EDITOR_AREA);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/PerformancePerspective2.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/PerformancePerspective2.java
deleted file mode 100644
index c984367..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/PerformancePerspective2.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- * @since 3.1
- */
-public class PerformancePerspective2 implements IPerspectiveFactory {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout)
-     */
-    public void createInitialLayout(IPageLayout layout) {
-    	layout.setEditorAreaVisible(false);
-        layout.addView(IPageLayout.ID_TASK_LIST, IPageLayout.RIGHT, .75f, IPageLayout.ID_EDITOR_AREA);
-        layout.addView(IPageLayout.ID_OUTLINE, IPageLayout.BOTTOM, .75f, IPageLayout.ID_EDITOR_AREA);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/PerformanceTestRunner.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/PerformanceTestRunner.java
deleted file mode 100644
index 64d9132..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/PerformanceTestRunner.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Runs a test specified by the org.eclipse.ui.performance.test property.  
- * This test is prepped via the UIPerformanceTestSetup test setup.
- * 
- * @since 3.1
- */
-public class PerformanceTestRunner extends TestSuite {
-
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new UIPerformanceTestSetup(new PerformanceTestRunner());
-    }
-
-    public PerformanceTestRunner() {
-        String className = System.getProperty("org.eclipse.ui.performance.test");
-        try {
-            Class clazz = Class.forName(className);
-            if (TestSuite.class.isAssignableFrom(clazz))
-                addTest((Test) clazz.newInstance());
-            else
-                addTestSuite(clazz);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/PerformanceTester.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/PerformanceTester.java
deleted file mode 100644
index 14ea021..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/PerformanceTester.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance;
-
-import junit.framework.TestCase;
-
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.test.performance.Performance;
-import org.eclipse.test.performance.PerformanceMeter;
-
-/**
- * @since 3.1
- */
-final class PerformanceTester {
-
-	protected PerformanceMeter fPerformanceMeter;
-
-	/**
-	 * @param testCase
-	 */
-	public PerformanceTester(TestCase testCase) {
-		Performance performance= Performance.getDefault();
-		fPerformanceMeter= performance.createPerformanceMeter(performance.getDefaultScenarioId(testCase));
-	}
-
-	/**
-	 * Asserts default properties of the measurements captured for this test
-	 * case.
-	 * 
-	 * @throws RuntimeException if the properties do not hold
-	 */
-	public void assertPerformance() {
-		Performance.getDefault().assertPerformance(fPerformanceMeter);
-	}
-
-	/**
-	 * Asserts that the measurement specified by the given dimension is within a
-	 * certain range with respect to some reference value. If the specified
-	 * dimension isn't available, the call has no effect.
-	 * 
-	 * @param dim
-	 *            the Dimension to check
-	 * @param lowerPercentage
-	 *            a negative number indicating the percentage the measured value
-	 *            is allowed to be smaller than some reference value
-	 * @param upperPercentage
-	 *            a positive number indicating the percentage the measured value
-	 *            is allowed to be greater than some reference value
-	 * @throws RuntimeException
-	 *            if the properties do not hold
-	 */
-	public void assertPerformanceInRelativeBand(Dimension dim, int lowerPercentage, int upperPercentage) {
-		Performance.getDefault().assertPerformanceInRelativeBand(fPerformanceMeter, dim, lowerPercentage, upperPercentage);
-	}
-
-	public void commitMeasurements() {
-		fPerformanceMeter.commit();
-	}
-
-	public void dispose() {
-		fPerformanceMeter.dispose();
-	}
-
-	/**
-	 * Called from within a test case immediately before the code to measure is
-	 * run. It starts capturing of performance data. Must be followed by a call
-	 * to {@link PerformanceTestCase#stopMeasuring()}before subsequent calls to
-	 * this method or {@link PerformanceTestCase#commitMeasurements()}.
-	 */
-	public void startMeasuring() {
-		fPerformanceMeter.start();
-	}
-
-	public void stopMeasuring() {
-		fPerformanceMeter.stop();
-	}
-
-	/**
-	 * Mark the scenario of this test case to be included both into the global
-	 * and the local (component) performance summary. The summary shows the given dimension of the
-	 * scenario and labels the scenario with the short name.
-	 * 
-	 * @param shortName
-	 *            a short (shorter than 40 characters) descritive name of the scenario
-	 * @param dimension
-	 *            the dimension to show in the summary
-	 */
-	public void tagAsGlobalSummary(String shortName, Dimension dimension) {
-		Performance.getDefault().tagAsGlobalSummary(fPerformanceMeter, shortName, new Dimension[] { dimension });
-	}
-
-	/**
-	 * Mark the scenario represented by the given PerformanceMeter to be
-	 * included into the global and the local (component) performance summary. The summary shows the given
-	 * dimensions of the scenario and labels the scenario with the short name.
-	 * 
-	 * @param shortName
-	 *            a short (shorter than 40 characters) descritive name of the scenario
-	 * @param dimensions
-	 *            an array of dimensions to show in the summary
-	 */
-	public void tagAsGlobalSummary(String shortName, Dimension[] dimensions) {
-		Performance.getDefault().tagAsGlobalSummary(fPerformanceMeter, shortName, dimensions);
-	}
-
-	/**
-	 * Mark the scenario of this test case to be included into the local (component)
-	 * performance summary. The summary shows the given dimension of the
-	 * scenario and labels the scenario with the short name.
-	 * 
-	 * @param shortName
-	 *            a short (shorter than 40 characters) descriptive name of the scenario
-	 * @param dimension
-	 *            the dimension to show in the summary
-	 */
-	public void tagAsSummary(String shortName, Dimension dimension) {
-		Performance.getDefault().tagAsSummary(fPerformanceMeter, shortName, new Dimension[] { dimension });
-	}
-
-	/**
-	 * Mark the scenario represented by the given PerformanceMeter to be
-	 * included into the local (component) performance summary. The summary shows the given
-	 * dimensions of the scenario and labels the scenario with the short name.
-	 * 
-	 * @param shortName
-	 *            a short (shorter than 40 characters) descriptive name of the scenario
-	 * @param dimensions
-	 *            an array of dimensions to show in the summary
-	 */
-	public void tagAsSummary(String shortName, Dimension[] dimensions) {
-		Performance.getDefault().tagAsSummary(fPerformanceMeter, shortName, dimensions);
-	}
-
-	/**
-	 * Set a degradation comment for the current meter.
-	 * @param string
-	 */
-	public void setDegradationComment(String string) {
-		Performance.getDefault().setComment(
-				fPerformanceMeter, 
-				Performance.EXPLAINS_DEGRADATION_COMMENT, 
-				string);
-		
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/PerspectiveSwitchTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/PerspectiveSwitchTest.java
deleted file mode 100644
index 370779d..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/PerspectiveSwitchTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-
-/**
- * Test perspective switching.
- */
-public class PerspectiveSwitchTest extends BasicPerformanceTest {
-
-    private String id1;
-    private String id2;
-    private String activeEditor;
-
-    /**
-     * Constructor.
-     * 
-     * @param id
-     */
-    public PerspectiveSwitchTest(String [] ids, int tagging) {
-        super("testPerspectiveSwitch:" + ids[0] + "," + ids[1] + ",editor " + ids[2], tagging);
-        this.id1 = ids[0];
-        this.id2 = ids[1];
-        this.activeEditor = ids[2];
-    }
-	
-    /**
-     * Test perspective switching performance. 
-     */
-    protected void runTest() throws CoreException, WorkbenchException {
-    	setDegradationComment("<a href=https://bugs.eclipse.org/bugs/show_bug.cgi?id=179581>See Bug 179581</a>");
-        // Get the two perspectives to switch between.
-        final IPerspectiveRegistry registry = WorkbenchPlugin.getDefault()
-                .getPerspectiveRegistry();
-        final IPerspectiveDescriptor perspective1 = registry
-                .findPerspectiveWithId(id1);
-        final IPerspectiveDescriptor perspective2 = registry
-                .findPerspectiveWithId(id2);
-
-        // Don't fail if we reference an unknown perspective ID. This can be
-        // a normal occurrance since the test suites reference JDT perspectives, which
-        // might not exist. Just skip the test.
-        if (perspective1 == null) {
-            System.out.println("Unknown perspective ID: " + id1);
-            return;
-        }
-
-        if (perspective2 == null) {
-            System.out.println("Unknown perspective ID: " + id2);
-            return;
-        }
-        
-        // Open the two perspectives and the file, in a new window.
-        // Do this outside the loop so as not to include
-        // the initial time to open, just switching.        
-        IWorkbenchWindow window = openTestWindow(id1);
-        final IWorkbenchPage page = window.getActivePage();
-        assertNotNull(page);
-        page.setPerspective(perspective2);
-        
-        //IFile aFile = getProject().getFile("1." + EditorPerformanceSuite.EDITOR_FILE_EXTENSIONS[0]);
-        IFile aFile = getProject().getFile(activeEditor);
-        assertTrue(aFile.exists());
-
-        IDE.openEditor(page, aFile, true);
-
-       	tagIfNecessary("UI - Perspective Switch", Dimension.ELAPSED_PROCESS);
-        
-        exercise(new TestRunnable() {
-            public void run() throws Exception {
-                processEvents();
-                
-                startMeasuring();
-                page.setPerspective(perspective1);
-                processEvents();
-                page.setPerspective(perspective2);
-                processEvents();
-                stopMeasuring();
-            } 
-        });
-        
-        commitMeasurements();
-        assertPerformance();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ProblemsViewPerformanceTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ProblemsViewPerformanceTest.java
deleted file mode 100644
index af0f638..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ProblemsViewPerformanceTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.tests.performance.parts.PerformanceProblemsView;
-import org.eclipse.ui.texteditor.MarkerUtilities;
-
-/**
- * The ProblemsViewPerformanceTest is a test of population of the problems view.
- * 
- * @since 3.2
- * 
- */
-public class ProblemsViewPerformanceTest extends BasicPerformanceTest {
-
-	private String EMPTY_PERSPECTIVE_ID = "org.eclipse.ui.tests.harness.util.EmptyPerspective";
-
-	private String PROBLEMS_VIEW_ID = "org.eclipse.ui.tests.performance.problemsView";
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param testName
-	 */
-	public ProblemsViewPerformanceTest(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Test the population of the problems view.
-	 */
-	public void testPopulation() {
-		IWorkbenchWindow window = openTestWindow(EMPTY_PERSPECTIVE_ID);
-		final IWorkbenchPage page = window.getActivePage();
-
-		PerformanceProblemsView view;
-
-		try {
-			view = (PerformanceProblemsView) page.showView(PROBLEMS_VIEW_ID);
-		} catch (PartInitException e) {
-			e.printStackTrace();
-			fail();
-			return;
-		}
-
-		tagIfNecessary("UI - Problems View population",
-				Dimension.ELAPSED_PROCESS);
-
-		for (int i = 0; i < 100; i++) {
-			createMarkers();
-			processEvents();
-			startMeasuring();
-			while (view.getTreeWidget().getItemCount() == 0)
-				processEvents();
-			stopMeasuring();
-			removeMarkers();
-			while (view.getTreeWidget().getItemCount() > 0)
-				processEvents();
-		}
-		commitMeasurements();
-		assertPerformance();
-
-	}
-
-	/**
-	 * Remove the created markers
-	 */
-	private void removeMarkers() {
-
-		try {
-			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-
-			IMarker[] markers = root.findMarkers(IMarker.PROBLEM, false,
-					IResource.DEPTH_ZERO);
-
-			for (int i = 0; i < markers.length; i++) {
-				String message = (String) markers[i]
-						.getAttribute(IMarker.MESSAGE);
-
-				if (message != null && message.startsWith("this is a test")) {
-					markers[i].delete();
-				}
-			}
-		} catch (CoreException e) {
-			e.printStackTrace();
-		}
-
-	}
-
-	/**
-	 * Create the markers for the receiver.
-	 */
-	private void createMarkers() {
-		try {
-			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-			Map attribs = new HashMap();
-			for (int i = 0; i < 1000; i++) {
-				attribs.put(IMarker.SEVERITY, new Integer(
-						IMarker.SEVERITY_ERROR));
-				attribs.put(IMarker.MESSAGE, "this is a test " + i);
-				MarkerUtilities.createMarker(root, attribs, IMarker.PROBLEM);
-			}
-		} catch (CoreException e) {
-			e.printStackTrace();
-		}
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ResourceTestHelper.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ResourceTestHelper.java
deleted file mode 100644
index b1b9cf3..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ResourceTestHelper.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.ui.tests.harness.util.FileTool;
-
-public class ResourceTestHelper {
-
-	public static void replicate(String src, String destPrefix, String destSuffix, int n) throws CoreException {
-		for (int i= 0; i < n; i++)
-			copy(src, destPrefix + i + destSuffix);
-	}
-
-	public static void copy(String src, String dest) throws CoreException {
-		IFile file= getRoot().getFile(new Path(src));
-		file.copy(new Path(dest), true, null);
-	}
-
-	public static void delete(String file) throws CoreException {
-		getRoot().getFile(new Path(file)).delete(true, null);
-	}
-
-	public static IFile findFile(String path) {
-		return getRoot().getFile(new Path(path));
-	}
-
-	public static IFile[] findFiles(String prefix, String suffix, int i, int n) {
-		IWorkspaceRoot root= getRoot();
-		List files= new ArrayList(n - i);
-		for (int j= i; j < i + n; j++) {
-			String path= root.getLocation().toString() + "/" + prefix + j + suffix;
-			files.add(findFile(path));
-		}
-		return (IFile[]) files.toArray(new IFile[files.size()]);
-	}
-
-	public static StringBuffer read(String src) throws IOException, CoreException {
-		return FileTool.read(new InputStreamReader(getRoot().getFile(new Path(src)).getContents()));
-	}
-
-	public static void write(String dest, final String content) throws IOException, CoreException {
-		InputStream stream= new InputStream() {
-			private Reader fReader= new StringReader(content);
-			public int read() throws IOException {
-				return fReader.read();
-			}
-		};
-		getRoot().getFile(new Path(dest)).create(stream, true, null);
-	}
-	
-
-	public static void replicate(String src, String destPrefix, String destSuffix, int n, String srcName, String destNamePrefix) throws IOException, CoreException {
-		
-		StringBuffer s= read(src);
-		
-		List positions= identifierPositions(s, srcName);
-		
-		for (int j= 0; j < n; j++) {
-			StringBuffer c= new StringBuffer(s.toString());
-			replacePositions(c, srcName.length(), destNamePrefix + j, positions);
-			write(destPrefix + j + destSuffix, c.toString());
-		}
-	}
-
-	public static void copy(String src, String dest, String srcName, String destName) throws IOException, CoreException {
-		StringBuffer buf= read(src);
-		List positions= identifierPositions(buf, srcName);
-		replacePositions(buf, srcName.length(), destName, positions);
-		write(dest, buf.toString());
-	}
-
-	private static void replacePositions(StringBuffer c, int origLength, String string, List positions) {
-		int offset= 0;
-		for (Iterator iter= positions.iterator(); iter.hasNext();) {
-			int position= ((Integer) iter.next()).intValue();
-			c.replace(offset + position, offset + position + origLength, string);
-			offset += string.length() - origLength;
-		}
-	}
-
-	private static List identifierPositions(StringBuffer buffer, String identifier) {
-		List positions= new ArrayList();
-		int i= -1;
-		while (true) {
-			i= buffer.indexOf(identifier, i + 1);
-			if (i == -1)
-				break;
-			if (i > 0 && Character.isJavaIdentifierPart(buffer.charAt(i - 1)))
-				continue;
-			if (i < buffer.length() - 1 && Character.isJavaIdentifierPart(buffer.charAt(i + identifier.length())))
-				continue;
-			positions.add(new Integer(i));
-		}
-		return positions;
-	}
-
-	private static IWorkspaceRoot getRoot() {
-		return ResourcesPlugin.getWorkspace().getRoot();
-	}
-
-	public static boolean enableAutoBuilding() {
-		IWorkspaceDescription description= ResourcesPlugin.getWorkspace().getDescription();
-		boolean wasOff= !description.isAutoBuilding();
-		if (wasOff)
-			description.setAutoBuilding(true);
-		return wasOff;
-	}
-
-	public static void incrementalBuild() throws CoreException {
-		ResourcesPlugin.getWorkspace().build(IncrementalProjectBuilder.INCREMENTAL_BUILD, null);
-	}
-
-	public static void fullBuild() throws CoreException {
-		ResourcesPlugin.getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
-	}
-
-	public static boolean disableAutoBuilding() {
-		IWorkspaceDescription description= ResourcesPlugin.getWorkspace().getDescription();
-		boolean wasOn= description.isAutoBuilding();
-		if (wasOn)
-			description.setAutoBuilding(false);
-		return wasOn;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/TestRunnable.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/TestRunnable.java
deleted file mode 100644
index a677bca..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/TestRunnable.java
+++ /dev/null
@@ -1,15 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance;
-
-public abstract class TestRunnable {
-    public abstract void run() throws Exception;
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/UIPerformancePlugin.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/UIPerformancePlugin.java
deleted file mode 100644
index 789c978..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/UIPerformancePlugin.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance;
-
-import org.eclipse.ui.plugin.*;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class UIPerformancePlugin extends AbstractUIPlugin {
-
-	//The shared instance.
-	private static UIPerformancePlugin plugin;
-	
-	/**
-	 * The constructor.
-	 */
-	public UIPerformancePlugin() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 *
-	 * @return the shared instance.
-	 */
-	public static UIPerformancePlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path.
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ui.tests.performance", path);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/UIPerformanceTestSetup.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/UIPerformanceTestSetup.java
deleted file mode 100644
index 3cfec1b..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/UIPerformanceTestSetup.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-import java.io.ByteArrayInputStream;
-
-import junit.extensions.TestSetup;
-import junit.framework.Test;
-
-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.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-public class UIPerformanceTestSetup extends TestSetup {
-
-	public static final String PERSPECTIVE1= "org.eclipse.ui.tests.performancePerspective1";
-	public static final String PERSPECTIVE2= "org.eclipse.ui.tests.performancePerspective2";
-
-	public static final String PROJECT_NAME = "Performance Project";
-
-	private static final String INTRO_VIEW= "org.eclipse.ui.internal.introview";
-
-    private IProject testProject;
-	
-	public UIPerformanceTestSetup(Test test) {
-		super(test);		
-	}
-
-	/*
-	 * @see junit.extensions.TestSetup#setUp()
-	 */
-	protected void setUp() throws Exception {
-		IWorkbench workbench= PlatformUI.getWorkbench();
-		IWorkbenchWindow activeWindow= workbench.getActiveWorkbenchWindow();
-		IWorkbenchPage activePage= activeWindow.getActivePage();
-		
-		activePage.hideView(activePage.findViewReference(INTRO_VIEW));
-		
-		workbench.showPerspective(PERSPECTIVE1, activeWindow);
-		
-		boolean wasAutobuilding= ResourceTestHelper.disableAutoBuilding();
-		setUpProject();
-		ResourceTestHelper.fullBuild();
-		if (wasAutobuilding) {
-			ResourceTestHelper.enableAutoBuilding();
-			EditorTestHelper.calmDown(2000, 30000, 1000);
-		}
-	}
-	
-	/*
-	 * @see junit.extensions.TestSetup#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		// do nothing, the set up workspace will be used by the open editor tests
-		
-		/* 
-		 * ensure the workbench state gets saved when running with the Automated Testing Framework
-                 * TODO: remove when https://bugs.eclipse.org/bugs/show_bug.cgi?id=71362 is fixed
-                 */
-		StackTraceElement[] elements=  new Throwable().getStackTrace();
-		for (int i= 0; i < elements.length; i++) {
-			StackTraceElement element= elements[i];
-			if (element.getClassName().equals("org.eclipse.test.EclipseTestRunner")) {
-				PlatformUI.getWorkbench().close();
-				break;
-			}
-		}
-	}
-	
-	private void setUpProject() throws CoreException {
-   
-        // Create a java project.
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        testProject = workspace.getRoot().getProject(PROJECT_NAME);
-        testProject.create(null);
-        testProject.open(null);        
-        /*IProjectDescription projectDescription = testProject.getDescription();
-        String[] natureIds = { "org.eclipse.jdt.core.javanature" };
-        projectDescription.setNatureIds(natureIds);*/
-       /*ICommand buildCommand = new BuildCommand();
-        buildCommand.setBuilderName("org.eclipse.jdt.core.javabuilder");
-        projectDescription.setBuildSpec(new ICommand[] { buildCommand });
-        testProject.setDescription(projectDescription, null);*/
-        
-        for (int i = 0; i < EditorPerformanceSuite.EDITOR_FILE_EXTENSIONS.length; i++) {
-            createFiles(EditorPerformanceSuite.EDITOR_FILE_EXTENSIONS[i]);
-        }
-	}
-
-    
-    /**
-     * @param ext
-     * @throws CoreException
-     */
-    private void createFiles(String ext) throws CoreException {
-        for (int i = 0; i < 100; i++) {
-            String fileName = i + "." + ext;
-	        IFile iFile = testProject.getFile(fileName);
-	        iFile.create(new ByteArrayInputStream(new byte[] { '\n' }), true, null);
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/UIPerformanceTestSuite.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/UIPerformanceTestSuite.java
deleted file mode 100644
index f4756a8..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/UIPerformanceTestSuite.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.ui.tests.performance.presentations.PresentationPerformanceTestSuite;
-
-/**
- * Test all areas of the UI API.
- */
-public class UIPerformanceTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static Test suite() {
-    	return new UIPerformanceTestSetup(new UIPerformanceTestSuite());
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public UIPerformanceTestSuite() {
-        addTest(new ActivitiesPerformanceSuite());
-        addTest(new PresentationPerformanceTestSuite());
-        addTest(new WorkbenchPerformanceSuite());
-        addTest(new ViewPerformanceSuite());
-        addTest(new EditorPerformanceSuite());
-        addTest(new TestSuite(CommandsPerformanceTest.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ViewPerformanceSuite.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ViewPerformanceSuite.java
deleted file mode 100644
index 82da2fd..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/ViewPerformanceSuite.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-import java.util.HashSet;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.ui.internal.Workbench;
-import org.eclipse.ui.tests.performance.layout.ResizeTest;
-import org.eclipse.ui.tests.performance.layout.ViewWidgetFactory;
-import org.eclipse.ui.views.IViewDescriptor;
-
-/**
- * @since 3.1
- */
-public class ViewPerformanceSuite extends TestSuite {
-
-	public static final String PROJECT_EXPLORER = "org.eclipse.ui.navigator.ProjectExplorer";
-
-	public static final String BASIC_PATH = "org.eclipse.ui";
-
-	public static final String VIEWS_PATTERN = "org.eclipse.ui.views";
-
-	/**
-	 * Returns the suite. This is required to use the JUnit Launcher.
-	 */
-	public static Test suite() {
-		return new ViewPerformanceSuite();
-	}
-
-	/**
-	 * 
-	 */
-	public ViewPerformanceSuite() {
-		addOpenCloseTests();
-		addResizeTests();
-		addTestSuite(OpenNavigatorFolderTest.class);
-	}
-
-	/**
-	 * 
-	 */
-	private void addOpenCloseTests() {
-		String[] ids = getAllTestableViewIds();
-
-		for (int i = 0; i < ids.length; i++) {
-			String id = ids[i];
-
-			addTest(new OpenCloseViewTest(id,
-					id.equals(PROJECT_EXPLORER) ? BasicPerformanceTest.GLOBAL
-							: BasicPerformanceTest.NONE));
-		}
-	}
-
-	private void addResizeTests() {
-		String[] ids = getAllTestableViewIds();
-
-		for (int i = 0; i < ids.length; i++) {
-			String id = ids[i];
-
-			addTest(new ResizeTest(new ViewWidgetFactory(id)));
-		}
-
-	}
-
-	public static String[] getAllTestableViewIds() {
-		HashSet result = new HashSet();
-
-		IViewDescriptor[] descriptors = Workbench.getInstance()
-				.getViewRegistry().getViews();
-		for (int i = 0; i < descriptors.length; i++) {
-			IViewDescriptor descriptor = descriptors[i];
-
-			String[] categoryPath = descriptor.getCategoryPath();
-
-			if (categoryPath == null)
-				continue;
-
-			for (int j = 0; j < categoryPath.length; j++) {
-				// Only test basic views
-				if (categoryPath[j].equals(BASIC_PATH)) {
-					if (descriptor.getId().indexOf(VIEWS_PATTERN) >= 0
-							|| descriptor.getId().equals(PROJECT_EXPLORER)) {
-						result.add(descriptor.getId());
-					}
-				}
-			}
-
-		}
-
-		return (String[]) result.toArray(new String[result.size()]);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/WorkbenchPerformanceSuite.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/WorkbenchPerformanceSuite.java
deleted file mode 100644
index d4ab9f6..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/WorkbenchPerformanceSuite.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance;
-
-import java.util.ArrayList;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.internal.Workbench;
-import org.eclipse.ui.tests.harness.util.EmptyPerspective;
-import org.eclipse.ui.tests.performance.layout.ComputeSizeTest;
-import org.eclipse.ui.tests.performance.layout.LayoutTest;
-import org.eclipse.ui.tests.performance.layout.PerspectiveWidgetFactory;
-import org.eclipse.ui.tests.performance.layout.RecursiveTrimLayoutWidgetFactory;
-import org.eclipse.ui.tests.performance.layout.ResizeTest;
-import org.eclipse.ui.tests.performance.layout.TestWidgetFactory;
-
-/**
- * @since 3.1
- */
-class WorkbenchPerformanceSuite extends TestSuite {
-
-	private static String RESOURCE_PERSPID = "org.eclipse.ui.resourcePerspective";
-    // Note: to test perspective switching properly, we need perspectives with lots of
-    // associated actions. 
-	// NOTE - do not change the order of the IDs below.  the PerspectiveSwitchTest has a 
-	// fingerprint test for performance that releys on this not changing.
-    public static final String [] PERSPECTIVE_IDS = {
-        EmptyPerspective.PERSP_ID2,
-        UIPerformanceTestSetup.PERSPECTIVE1, 
-        RESOURCE_PERSPID,
-        "org.eclipse.jdt.ui.JavaPerspective", 
-        "org.eclipse.debug.ui.DebugPerspective"};
-    
-    // Perspective ID to use for the resize window fingerprint test
-    public static String resizeFingerprintTest = RESOURCE_PERSPID; 
-    
-    public static final String [][] PERSPECTIVE_SWITCH_PAIRS = {
-        // Test switching between the two most commonly used perspectives in the SDK (this is the most important
-        // perspective switch test, but it is easily affected by changes in JDT, etc.)
-        {"org.eclipse.jdt.ui.JavaPerspective", "org.eclipse.debug.ui.DebugPerspective", "1.java"},
-        
-        {UIPerformanceTestSetup.PERSPECTIVE1, UIPerformanceTestSetup.PERSPECTIVE2, "1.perf_basic"},
-		
-        {"org.eclipse.ui.tests.dnd.dragdrop", "org.eclipse.ui.tests.fastview_perspective", "1.perf_basic"},
-        
-        // Test switching between a perspective with lots of actions and a perspective with none
-        {"org.eclipse.jdt.ui.JavaPerspective", "org.eclipse.ui.tests.util.EmptyPerspective", "1.perf_basic"},
-        
-        {RESOURCE_PERSPID, "org.eclipse.jdt.ui.JavaPerspective", "1.java"} 
-    };
-    
-    public static final String[] VIEW_IDS = {
-        "org.eclipse.ui.views.ProblemView",
-        "org.eclipse.ui.views.ResourceNavigator"
-    };
-    public static final int ITERATIONS = 25;
-    
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new WorkbenchPerformanceSuite();
-    }
-    
-    /**
-     * 
-     */
-    public WorkbenchPerformanceSuite() {
-        addLayoutScenarios();
-        addResizeScenarios();
-        addPerspectiveSwitchScenarios();
-        addPerspectiveOpenCloseScenarios();
-        addWindowOpenCloseScenarios();
-        addContributionScenarios();
-    }
-
-    /**
-	 * 
-	 */
-	private void addContributionScenarios() {
-        addTest(new ObjectContributionsPerformance(
-                "large selection, limited contributors",
-                ObjectContributionsPerformance.generateAdaptableSelection(
-                        ObjectContributionsPerformance.SEED, 5000),
-                BasicPerformanceTest.NONE));
-        addTest(new ObjectContributionsPerformance(
-                "limited selection, limited contributors",
-                ObjectContributionsPerformance.generateAdaptableSelection(
-                        ObjectContributionsPerformance.SEED, 50),
-                BasicPerformanceTest.NONE));
-	}
-
-	/**
-     * 
-     */
-    private void addWindowOpenCloseScenarios() {
-        for (int i = 0; i < PERSPECTIVE_IDS.length; i++) {
-            addTest(new OpenCloseWindowTest(PERSPECTIVE_IDS[i], BasicPerformanceTest.NONE));
-        }        
-    }
-
-    /**
-     * 
-     *
-     */
-    private void addPerspectiveOpenCloseScenarios() {
-        for (int i = 0; i < PERSPECTIVE_IDS.length; i++) {
-            addTest(new OpenClosePerspectiveTest(PERSPECTIVE_IDS[i], i == 1 ? BasicPerformanceTest.LOCAL : BasicPerformanceTest.NONE));
-        }
-    }
-    
-    /**
-     * 
-     */
-    private void addPerspectiveSwitchScenarios() {
-        for (int i = 0; i < PERSPECTIVE_SWITCH_PAIRS.length; i++) {
-            addTest(new PerspectiveSwitchTest(PERSPECTIVE_SWITCH_PAIRS[i], BasicPerformanceTest.NONE));            
-        }   
-    }
-    
-    /**
-     * Add performance tests for the layout of the given widget 
-     * 
-     * @param factory
-     * @since 3.1
-     */
-    private void addLayoutScenarios(TestWidgetFactory factory) {
-        
-        // Determine the effect of flushing the cache
-        addTest(new ComputeSizeTest(factory));
-        
-        // Test layout(false)
-        addTest(new LayoutTest(factory, false));
-        
-        // Test layout(true)
-        addTest(new LayoutTest(factory, true));
-        
-        // Test resizing
-        addTest(new ResizeTest(factory));
-    }
-
-    private void addLayoutScenarios() {
-        addLayoutScenarios(new RecursiveTrimLayoutWidgetFactory());
-    }
-    
-    public static String[] getAllPerspectiveIds() {
-        ArrayList result = new ArrayList();
-        IPerspectiveDescriptor[] perspectives = Workbench.getInstance().getPerspectiveRegistry().getPerspectives();
-        
-        for (int i = 0; i < perspectives.length; i++) {
-            IPerspectiveDescriptor descriptor = perspectives[i];
-            String id = descriptor.getId();
-            result.add(id);
-        }
-
-        return (String[]) result.toArray(new String[result.size()]);
-    }
-    
-    /**
-     * 
-     */
-    private void addResizeScenarios() {
-        String[] perspectiveIds = getAllPerspectiveIds();
-        for (int i = 0; i < perspectiveIds.length; i++) {
-            String id = perspectiveIds[i];
-            addTest(new ResizeTest(new PerspectiveWidgetFactory(id), 
-                    id.equals(resizeFingerprintTest) ? BasicPerformanceTest.LOCAL : BasicPerformanceTest.NONE, 
-                            "UI - Workbench Window Resize"));
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/ComputeSizeTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/ComputeSizeTest.java
deleted file mode 100644
index ea00221..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/ComputeSizeTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.layout;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.tests.performance.BasicPerformanceTest;
-
-/**
- * Measures the performance of a widget's computeSize method
- * 
- * @since 3.1
- */
-public class ComputeSizeTest extends BasicPerformanceTest {
-
-    private TestWidgetFactory widgetFactory;
-    private int xIterations = 10;
-    private int yIterations = 10;
-    
-    /**
-     * @param testName
-     */
-    public ComputeSizeTest(TestWidgetFactory widgetFactory) {
-        super(widgetFactory.getName() + " computeSize");
-        
-        this.widgetFactory = widgetFactory;
-    }
-
-    /**
-     * Run the test
-     */
-    protected void runTest() throws CoreException, WorkbenchException {
-
-        widgetFactory.init();
-        final Composite widget = widgetFactory.getControl();
-        //Rectangle initialBounds = widget.getBounds();
-        final Point maxSize = widgetFactory.getMaxSize();
-        
-        // Iteration counter. We increment this each pass through the loop in order to 
-        // generate slightly different test data each time
-        final int[] counter = new int[] {0};
- 
-		for (int j = 0; j < 100; j++) {
-	        // This counter determines whether we're computing a width,
-			// height, or fixed
-			// size and whether or not we flush the cache.
-
-			// We do things this way to avoid calling computeSize with the same (or
-			// similar) values
-			// twice in a row, which would be too easy to cache.
-			int count = counter[0];
-
-			startMeasuring();
-			for (int i = 0; i < 200; i++) {
-
-               for (int xIteration = 0; xIteration < xIterations; xIteration++) {
-                   
-                   for (int yIteration = 0; yIteration < yIterations; yIteration++) {
-                       // Avoid giving the same x value twice in a row in order to make it hard to cache
-                       int xSize = maxSize.x * ((xIteration + yIteration) % xIterations) / xIterations;
-                       int ySize = maxSize.y * yIteration / yIterations;
-
-                       // Alternate between flushing and not flushing the cache
-                       boolean flushState = (count % 2) != 0;
-                       
-                       // Alternate between width, height, and fixed, and default size queries 
-                       // (note: we need to alternate in order to make the result hard to cache)
-                       switch(count % 4) {
-                           case 0: widget.computeSize(xSize, SWT.DEFAULT, flushState); break;
-                           case 1: widget.computeSize(SWT.DEFAULT, ySize, flushState); break;
-                           case 2: widget.computeSize(xSize, ySize, flushState); break;
-                           case 3: widget.computeSize(SWT.DEFAULT, SWT.DEFAULT, flushState); break;
-                       }
-
-						count++;
-					}
-				}
-
-			}
-			stopMeasuring();
-			processEvents();
-			counter[0]++;
-		}
-
-		commitMeasurements();
-		assertPerformance();
-        widgetFactory.done();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/ConstantAreaLayout.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/ConstantAreaLayout.java
deleted file mode 100644
index ce3f360..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/ConstantAreaLayout.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.layout;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Layout;
-
-/**
- * A very efficient (but useless) layout with complicated preferred size behavior.
- * Its preferred size attempts to maintain a constant area. This can be used for 
- * performance testing other layouts (by attaching this to child Composites in the 
- * layout being tested). It will give a good estimate as to how the layout will
- * handle wrapping widgets.
- * 
- * @since 3.1
- */
-public class ConstantAreaLayout extends Layout {
-
-    private int area;
-    private int preferredWidth;
-    
-    public ConstantAreaLayout(int area, int preferredWidth) {
-        this.area = area;
-        this.preferredWidth = preferredWidth;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.widgets.Layout#computeSize(org.eclipse.swt.widgets.Composite, int, int, boolean)
-     */
-    protected Point computeSize(Composite composite, int wHint, int hHint,
-            boolean flushCache) {
-        
-        if (wHint == 0 || hHint == 0) {
-            return new Point(1,1);
-        }
-        
-        if (wHint == SWT.DEFAULT) {
-            if (hHint == SWT.DEFAULT) {
-                wHint = preferredWidth;
-            } else {
-                wHint = area / hHint;
-            }
-        }
-        
-        if (hHint == SWT.DEFAULT) {
-            hHint = area / wHint;
-        }
-        
-        return new Point(wHint, hHint);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.swt.widgets.Layout#layout(org.eclipse.swt.widgets.Composite, boolean)
-     */
-    protected void layout(Composite composite, boolean flushCache) {
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/EditorWidgetFactory.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/EditorWidgetFactory.java
deleted file mode 100644
index 16def55..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/EditorWidgetFactory.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.layout;
-
-import junit.framework.Assert;
-
-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.swt.widgets.Composite;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.EditorSite;
-import org.eclipse.ui.internal.PartPane;
-import org.eclipse.ui.tests.harness.util.EmptyPerspective;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.tests.performance.UIPerformanceTestSetup;
-
-/**
- * @since 3.1
- */
-public class EditorWidgetFactory extends TestWidgetFactory {
-
-    private String editorId;
-    private String filename;
-    private IWorkbenchWindow window;
-    private Composite ctrl;
-    
-    public EditorWidgetFactory(String filename) {
-        this.filename = filename;
-        this.editorId = null;
-    }
-    
-    public EditorWidgetFactory(String filename, String editorId) {
-        this.filename = filename;
-        this.editorId = editorId;
-    }
-    
-    public static Composite getControl(IEditorPart part) {
-		EditorSite site = (EditorSite)part.getSite();
-		
-		PartPane pane = site.getPane();
-        
-		return (Composite)pane.getControl();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.layout.TestWidgetFactory#getName()
-     */
-    public String getName() {
-        return "editor " + filename + (editorId != null ? editorId : "");
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.layout.TestWidgetFactory#init()
-     */
-    public void init() throws CoreException, WorkbenchException {
-
-		// Open an editor in a new window.
-        window = PlatformUI.getWorkbench().openWorkbenchWindow(EmptyPerspective.PERSP_ID, UITestCase.getPageInput());
-		IWorkbenchPage activePage = window.getActivePage();
-        Assert.assertNotNull(activePage);
-		
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        IProject testProject = workspace.getRoot().getProject(UIPerformanceTestSetup.PROJECT_NAME);
-        IFile file = testProject.getFile(filename);
-		
-        if (editorId == null) {
-            editorId = IDE.getEditorDescriptor(file).getId();
-        }
-        
-        IEditorPart part = IDE.openEditor(activePage, file, editorId, true);
-        ctrl = getControl(part);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.layout.TestWidgetFactory#getControl()
-     */
-    public Composite getControl() throws CoreException, WorkbenchException {
-        return ctrl;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.layout.TestWidgetFactory#done()
-     */
-    public void done() throws CoreException, WorkbenchException {
-    	window.close();
-    	super.done();
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/LayoutTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/LayoutTest.java
deleted file mode 100644
index bf1f3f1..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/LayoutTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.layout;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.tests.performance.BasicPerformanceTest;
-
-/**
- * Measures the time required to layout the widget 10 times. Does not include
- * the time required for any deferred repaints.
- * 
- * @since 3.1
- */
-public class LayoutTest extends BasicPerformanceTest {
-
-	private TestWidgetFactory widgetFactory;
-
-	private int xIterations = 100;
-
-	private int yIterations = 10;
-
-	private boolean flushState;
-
-	/**
-	 * @param testName
-	 */
-	public LayoutTest(TestWidgetFactory widgetFactory, boolean flushState) {
-		super(widgetFactory.getName() + " layout("
-				+ (flushState ? "true" : "false") + ")");
-
-		this.widgetFactory = widgetFactory;
-		this.flushState = flushState;
-	}
-
-	/**
-	 * Run the test
-	 */
-	protected void runTest() throws CoreException, WorkbenchException {
-
-		widgetFactory.init();
-		final Composite widget = widgetFactory.getControl();
-		final Point maxSize = widgetFactory.getMaxSize();
-		Rectangle initialBounds = widget.getBounds();
-		final Rectangle newBounds = Geometry.copy(initialBounds);
-
-		// This test is different now duw to trim API changes so 'gray' it...
-       	setDegradationComment("<a href=https://bugs.eclipse.org/bugs/show_bug.cgi?id=129001>See Bug 129001</a> ");
-		
-		for (int xIteration = 0; xIteration < xIterations; xIteration++) {
-
-			processEvents();
-
-			startMeasuring();
-
-			for (int yIteration = 0; yIteration < yIterations; yIteration++) {
-				// Avoid giving the same x value twice in a row in order to make
-				// it hard to cache
-				int xSize = maxSize.x
-						* ((xIteration + yIteration) % xIterations)
-						/ xIterations;
-				int ySize = maxSize.y * yIteration / yIterations;
-
-				newBounds.width = xSize;
-				newBounds.height = ySize;
-
-				widget.setBounds(newBounds);
-				widget.layout(flushState);
-			}
-
-			stopMeasuring();
-		}
-
-		commitMeasurements();
-		assertPerformance();
-
-		widget.setBounds(initialBounds);
-		widgetFactory.done();
-	}
-}
-
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/PerspectiveWidgetFactory.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/PerspectiveWidgetFactory.java
deleted file mode 100644
index 143fdfc..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/PerspectiveWidgetFactory.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.layout;
-
-import junit.framework.Assert;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.1
- */
-public class PerspectiveWidgetFactory extends TestWidgetFactory {
-
-    private String perspectiveId;
-    private IWorkbenchWindow window;
-    
-    public PerspectiveWidgetFactory(String initialPerspective) {
-        perspectiveId = initialPerspective;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.TestWidgetFactory#getMaxSize()
-     */
-    public Point getMaxSize() {
-        return new Point(1024, 768);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.TestWidgetFactory#init()
-     */
-    public void init() throws WorkbenchException {
-    	// open the perspective in a new window
-        window = PlatformUI.getWorkbench().openWorkbenchWindow(perspectiveId, UITestCase.getPageInput());
-		IWorkbenchPage page = window.getActivePage();
-        Assert.assertNotNull(page);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.TestWidgetFactory#getName()
-     */
-    public String getName() {
-        return "Perspective " + perspectiveId;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.TestWidgetFactory#getControl()
-     */
-    public Composite getControl() {
-        return window.getShell();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.layout.TestWidgetFactory#done()
-     */
-    public void done() throws CoreException, WorkbenchException {
-    	window.close();
-    	super.done();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/PresentationWidgetFactory.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/PresentationWidgetFactory.java
deleted file mode 100644
index fe77728..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/PresentationWidgetFactory.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.layout;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.internal.presentations.PresentationFactoryUtil;
-import org.eclipse.ui.presentations.AbstractPresentationFactory;
-import org.eclipse.ui.tests.performance.UIPerformancePlugin;
-import org.eclipse.ui.tests.performance.presentations.PresentationTestbed;
-import org.eclipse.ui.tests.performance.presentations.TestPresentablePart;
-
-public class PresentationWidgetFactory extends TestWidgetFactory {
-
-    private AbstractPresentationFactory factory;
-    private int type;
-    private Shell shell;
-    private Image img;
-    private Control ctrl;
-    private int numParts;
-    
-    public PresentationWidgetFactory(AbstractPresentationFactory factory, int type, int numParts) {
-        this.factory = factory;
-        this.type = type;
-        this.numParts = numParts;
-    }
-    
-    public void init() throws CoreException, WorkbenchException {
-        super.init();
-        
-        img = UIPerformancePlugin.getImageDescriptor("icons/anything.gif").createImage();
-        Display display = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().getDisplay();
-        
-        shell = new Shell(display);
-    
-        TestPresentablePart selection = null;
-        PresentationTestbed testBed = new PresentationTestbed(shell, factory, type);
-        for(int partCount = 0; partCount < numParts; partCount++) {
-            TestPresentablePart part = new TestPresentablePart(shell, img);
-            part.setName("Some part");
-            part.setContentDescription("Description");
-            part.setTitle("Some title");
-            part.setDirty(partCount % 2 == 0);
-            part.setTooltip("This is a tooltip");
-            testBed.add(part);
-            selection = part;
-        }
-        
-        testBed.setSelection(selection);
-        
-        ctrl = testBed.getControl();
-        shell.setBounds(0,0,1024,768);
-        ctrl.setBounds(shell.getClientArea());
-        shell.setVisible(true);
-    }
-    
-    public void done() throws CoreException, WorkbenchException {
-        shell.dispose();
-        img.dispose();
-
-        super.done();
-    }
-    
-    public static String describePresentation(AbstractPresentationFactory factory, int type) {
-        String typeDesc = "unknown";
-        
-        switch(type) {
-        case PresentationFactoryUtil.ROLE_EDITOR: typeDesc = "editor"; break;
-        case PresentationFactoryUtil.ROLE_STANDALONE: typeDesc = "standalone with title"; break;
-        case PresentationFactoryUtil.ROLE_STANDALONE_NOTITLE: typeDesc = "standalone without title"; break;
-        case PresentationFactoryUtil.ROLE_VIEW: typeDesc = "view"; break;
-        }
-        
-        return "Presentation " + factory.getId() + " " + typeDesc;
-        
-    }
-    
-    public String getName() {
-        return describePresentation(factory, type);
-    }
-
-    public Composite getControl() throws CoreException, WorkbenchException {
-        return (Composite)ctrl;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/RecursiveTrimLayoutWidgetFactory.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/RecursiveTrimLayoutWidgetFactory.java
deleted file mode 100644
index 2084a7e..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/RecursiveTrimLayoutWidgetFactory.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.layout;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.internal.WindowTrimProxy;
-import org.eclipse.ui.internal.layout.TrimLayout;
-
-/**
- * @since 3.1
- */
-public class RecursiveTrimLayoutWidgetFactory extends TestWidgetFactory {
-
-    private Shell shell;
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.layout.TestWidgetFactory#getName()
-     */
-    public String getName() {
-        return "Massively Recursive TrimLayout";
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.layout.TestWidgetFactory#done()
-     */
-    public void done() throws CoreException, WorkbenchException {
-        super.done();
-        
-        shell.dispose();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.layout.TestWidgetFactory#init()
-     */
-    public void init() throws CoreException, WorkbenchException {
-        super.init();
-        
-		Display display = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().getDisplay();
-		
-		shell = new Shell(display);
-	
-		createTrimLayout(shell, 10, SWT.TOP);
-		
-		shell.setBounds(0,0,1024,768);
-		shell.setVisible(true);
-    }
-    
-    
-    /**
-     * Create a set of recursive trim layouts with the given depth. That is, the
-     * trim controls themselves are also trim layouts. This ensures that TrimLayout 
-     * can handle 
-     * Note that this
-     * will create O(2^depth) children.
-     * 
-     * @param composite
-     * @param depth
-     * @param side
-     * @since 3.1
-     */
-    public void createTrimLayout(Composite composite, int depth, int side) {
-        if (depth == 0) {
-            composite.setLayout(new ConstantAreaLayout(5000, 300));
-        } else {
-            TrimLayout layout = new TrimLayout();
-            
-            composite.setLayout(layout);
-            
-            int nextSide = SWT.TOP; 
-            
-            switch (side) {
-            	case SWT.TOP : nextSide = SWT.RIGHT; break;
-            	case SWT.RIGHT : nextSide = SWT.BOTTOM; break;
-            	case SWT.BOTTOM : nextSide = SWT.LEFT; break;
-            	case SWT.LEFT : nextSide = SWT.TOP; break;
-            }
-            
-            // Add a resizable child
-            Composite child = new Composite(composite, SWT.NONE);
-            WindowTrimProxy proxy = new WindowTrimProxy(child, 
-            		"child1." + side + "." + depth, "Resizable Child", SWT.NONE, true);
-            layout.addTrim(side, proxy);
-            createTrimLayout(child, depth - 1, nextSide); 
-
-            // Add a non-resizable child
-            child = new Composite(composite, SWT.NONE);
-            proxy = new WindowTrimProxy(child, 
-            		"child2." + side + "." + depth, "Non-Resizable Child", SWT.NONE, false);
-            layout.addTrim(side, proxy);
-            createTrimLayout(child, depth - 1, nextSide);
-            
-            // Fill the client area
-            child = new Composite(composite, SWT.NONE);
-            layout.setCenterControl(child);
-            child.setLayout(new ConstantAreaLayout(3000, 150));
-        }
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.layout.TestWidgetFactory#getControl()
-     */
-    public Composite getControl() throws CoreException, WorkbenchException {
-		return shell;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/ResizeTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/ResizeTest.java
deleted file mode 100644
index 5eb3ab5..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/ResizeTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.layout;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.tests.performance.BasicPerformanceTest;
-
-/**
- * Measures the time to resize the widget 10 times, including the time required
- * to redraw.
- * 
- * @since 3.1
- */
-public class ResizeTest extends BasicPerformanceTest {
-
-	private TestWidgetFactory widgetFactory;
-
-	private int xIterations = 5;
-
-	private int yIterations = 5;
-
-	private String tagString;
-
-	
-	
-	/**
-	 * Create a new instance of the receiver.
-	 * @param factory
-	 */
-	public ResizeTest(TestWidgetFactory factory) {
-		this(factory, NONE, factory.getName() + " setSize");
-	}
-
-	
-	
-	/**
-	 * Create a new instance of the receiver.
-	 * @param factory
-	 * @param tagging
-	 * @param tag
-	 */
-	public ResizeTest(TestWidgetFactory factory, int tagging,
-			String tag) {
-		super(factory.getName() + " setSize", tagging);
-		this.tagString = tag;
-		this.widgetFactory = factory;
-	}
-
-	/**
-	 * Run the test
-	 */
-	protected void runTest() throws CoreException, WorkbenchException {
-
-		tagIfNecessary(tagString, Dimension.ELAPSED_PROCESS);
-
-		widgetFactory.init();
-		final Composite widget = widgetFactory.getControl();
-		Rectangle initialBounds = widget.getBounds();
-		final Point maxSize = widgetFactory.getMaxSize();
-
-		waitForBackgroundJobs();
-		processEvents();
-		for (int j = 0; j < 50; j++) {
-
-			startMeasuring();
-			for (int i = 0; i < 2; i++) {
-
-				for (int xIteration = 0; xIteration < xIterations; xIteration += 5) {
-
-					for (int yIteration = 0; yIteration < yIterations; yIteration++) {
-						// Avoid giving the same x value twice in a row in order
-						// to make it hard to cache
-						int xSize = maxSize.x
-								* ((xIteration + yIteration) % xIterations)
-								/ xIterations;
-						int ySize = maxSize.y * yIteration / yIterations;
-
-						widget.setSize(xSize, ySize);
-
-						processEvents();
-					}
-
-				}
-
-			}
-			stopMeasuring();
-		}
-		commitMeasurements();
-		assertPerformance();
-
-		widget.setBounds(initialBounds);
-		widgetFactory.done();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/TestWidgetFactory.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/TestWidgetFactory.java
deleted file mode 100644
index c7b4f72..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/TestWidgetFactory.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.layout;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.WorkbenchException;
-
-/**
- * @since 3.1
- */
-public abstract class TestWidgetFactory {
-	public Point getMaxSize() throws CoreException, WorkbenchException {
-	    Composite control = getControl();
-	    Composite parent = control.getParent();
-	    
-	    if (parent == null) {
-	        return new Point(800, 600);
-	    }
-	    return Geometry.getSize(parent.getClientArea());
-	}
-	public void init() throws CoreException, WorkbenchException {}
-	public void done() throws CoreException, WorkbenchException {}
-	public abstract String getName();
-	public abstract Composite getControl() throws CoreException, WorkbenchException;
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/ViewWidgetFactory.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/ViewWidgetFactory.java
deleted file mode 100644
index 5d7784c..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/layout/ViewWidgetFactory.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.layout;
-
-import junit.framework.Assert;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.internal.PartPane;
-import org.eclipse.ui.internal.ViewSite;
-import org.eclipse.ui.tests.harness.util.EmptyPerspective;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.tests.performance.BasicPerformanceTest;
-
-/**
- * @since 3.1
- */
-public class ViewWidgetFactory extends TestWidgetFactory {
-
-    private String viewId;
-    private Control ctrl;
-    private IWorkbenchWindow window;
-    
-    public ViewWidgetFactory(String viewId) {
-        this.viewId = viewId;
-        Assert.assertNotNull(viewId);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.TestWidgetFactory#getMaxSize()
-     */
-    public Point getMaxSize() {
-        return new Point(1024, 768);
-    }
-
-    public static Composite getControl(IViewPart part) {
-		ViewSite site = (ViewSite)part.getSite();
-		
-		PartPane pane = site.getPane();
-        
-		return (Composite)pane.getControl();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.TestWidgetFactory#init()
-     */
-    public void init() throws CoreException, WorkbenchException {
-    	// open the view in a new window
-        window = PlatformUI.getWorkbench().openWorkbenchWindow(EmptyPerspective.PERSP_ID, UITestCase.getPageInput());
-		IWorkbenchPage page = window.getActivePage();
-        Assert.assertNotNull(page);
-
-		IViewPart part = page.showView(viewId, null, IWorkbenchPage.VIEW_ACTIVATE);
-        
-        BasicPerformanceTest.waitForBackgroundJobs();
-        
-		ctrl = getControl(part);
-        
-        Point size = getMaxSize();
-        ctrl.setBounds(0,0,size.x, size.y);
-        window.getShell().setSize(size);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.TestWidgetFactory#getName()
-     */
-    public String getName() {
-        return "View " + viewId;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.TestWidgetFactory#getControl()
-     */
-    public Composite getControl() throws CoreException, WorkbenchException {
-        return (Composite)ctrl;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.performance.layout.TestWidgetFactory#done()
-     */
-    public void done() throws CoreException, WorkbenchException {
-    	window.close();
-    	super.done();
-    }
-    
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/marked.txt b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/marked.txt
deleted file mode 100644
index 1c63f0c..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/marked.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-window resizing
-perf1/perf2 perspective switching
-
- V basic view open/close
- V empty perspective open/close
- V perf_basic editor open/close
- V perf_basic closeAll
- V perf1 open/close window
-
-* ask Stefan for one interesting test
-
-view to editor switching
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/parts/PerformanceEditorPart.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/parts/PerformanceEditorPart.java
deleted file mode 100644
index a6ca32a..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/parts/PerformanceEditorPart.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance.parts;
-
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-/**
- * @since 3.1
- */
-public class PerformanceEditorPart extends EditorPart {
-
-    private static final String PARAM_OUTLINE = "outline";
-    
-    private boolean dirty;
-    private Label control;
-    private boolean useOutline = false;
-
-    /**
-     * 
-     */
-    public PerformanceEditorPart() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-     */
-    public void doSave(IProgressMonitor monitor) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-     */
-    public void doSaveAs() {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IEditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-     */
-    public void init(IEditorSite site, IEditorInput input)
-            throws PartInitException {
-        super.setSite(site);
-        super.setInput(input);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.ISaveablePart#isDirty()
-     */
-    public boolean isDirty() {
-        return dirty;
-    }
-    
-    public void setDirty(boolean dirty) {
-        this.dirty = dirty;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-     */
-    public boolean isSaveAsAllowed() {        
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-     */
-    public void createPartControl(Composite parent) {
-        control = new Label(parent, SWT.NONE);
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-     */
-    public void setFocus() {
-        control.setFocus();
-    }
-
-    /* (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) {
-        super.setInitializationData(cfig, propertyName, data);
-        
-        if (data instanceof String) {
-           for (StringTokenizer toker = new StringTokenizer((String) data, ","); toker.hasMoreTokens(); ) {
-               String token = toker.nextToken();
-               if (token.equals(PARAM_OUTLINE))
-                   useOutline = true;
-           }
-           
-        }        
-    }
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-     */
-    public Object getAdapter(Class adapter) {
-        Object object = null;
-        if (useOutline && adapter.equals(IContentOutlinePage.class)) {
-            object = new ContentOutlinePage() {
-            };
-        }
-        if (object != null)
-            return object;
-        return super.getAdapter(adapter);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/parts/PerformanceProblemsView.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/parts/PerformanceProblemsView.java
deleted file mode 100644
index 166dfe7..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/parts/PerformanceProblemsView.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.performance.parts;
-
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.views.markers.internal.ProblemView;
-
-/**
- * PerformanceProblemsView is a problems view created
- * for the performance tests.
- * @since 3.2
- *
- */
-public class PerformanceProblemsView extends ProblemView {
-
-	public Tree getTreeWidget(){
-		return getTree();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/parts/PerformanceViewPart.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/parts/PerformanceViewPart.java
deleted file mode 100644
index a683a72..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/parts/PerformanceViewPart.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.parts;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * @since 3.1
- */
-public class PerformanceViewPart extends ViewPart {
-
-	private Label control;
-	
-	/**
-	 * 
-	 */
-	public PerformanceViewPart() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		control = new Label(parent, SWT.NONE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		control.setFocus();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationActivateTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationActivateTest.java
deleted file mode 100644
index 59596d7..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationActivateTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.presentations;
-
-import org.eclipse.ui.presentations.AbstractPresentationFactory;
-import org.eclipse.ui.presentations.StackPresentation;
-import org.eclipse.ui.tests.performance.TestRunnable;
-import org.eclipse.ui.tests.performance.layout.PresentationWidgetFactory;
-
-public class PresentationActivateTest extends PresentationPerformanceTest {
-    
-    private int type;
-    private int number;
-    private AbstractPresentationFactory factory;
-    
-    public PresentationActivateTest(AbstractPresentationFactory factory, int type, int number) {
-        super(PresentationWidgetFactory.describePresentation(factory, type) + " activation");
-        this.type = type;
-        this.number = number;
-        this.factory = factory;
-    }
-    
-    protected void runTest() throws Throwable {
-        final PresentationTestbed testbed = createPresentation(factory, type, number);
-        
-        exercise(new TestRunnable() {
-            public void run() throws Exception {
-                
-                startMeasuring();
-                
-                for (int i = 0; i < 100; i++) {
-                    testbed.setActive(StackPresentation.AS_ACTIVE_FOCUS);
-                    processEvents();                    
-                    testbed.setActive(StackPresentation.AS_ACTIVE_NOFOCUS);
-                    processEvents();
-                    testbed.setActive(StackPresentation.AS_INACTIVE);
-                    processEvents();
-                }
-                
-                stopMeasuring();
-            } 
-        });
-        
-        commitMeasurements();
-        assertPerformance();   
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationActivePartPropertyTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationActivePartPropertyTest.java
deleted file mode 100644
index af600f2..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationActivePartPropertyTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.presentations;
-
-import org.eclipse.ui.presentations.AbstractPresentationFactory;
-import org.eclipse.ui.tests.performance.layout.PresentationWidgetFactory;
-
-public class PresentationActivePartPropertyTest extends PresentationPerformanceTest {
-    
-    private int type;
-    private int number;
-    private int iterations;
-    private boolean fastTest;
-    private AbstractPresentationFactory factory;
-    
-    public PresentationActivePartPropertyTest(AbstractPresentationFactory factory, int type, int number, boolean fastTest) {
-        super(PresentationWidgetFactory.describePresentation(factory, type) + " active part properties");
-        this.type = type;
-        this.number = number;
-        this.factory = factory;
-        this.fastTest = fastTest;
-       
-    }
-    
-    protected void runTest() throws Throwable {
-        
-    	setDegradationComment("<a href=https://bugs.eclipse.org/bugs/show_bug.cgi?id=101072>See Bug 101072</a> ");
-    	 
-        final PresentationTestbed testbed = createPresentation(factory, type, number);
-        
-        final TestPresentablePart part = (TestPresentablePart)testbed.getSelection();
-        
-        if(fastTest)
-        	iterations = 300;
-        else
-        	iterations = 5;
-        
-		for (int j = 0; j < 50; j++) {
-
-			startMeasuring();
-			for (int i = 0; i < iterations; i++) {
-            
-                twiddleProperty(DESCRIPTION, part);
-                twiddleProperty(DIRTY, part);
-                twiddleProperty(IMAGE, part);
-                twiddleProperty(NAME, part);
-                twiddleProperty(TITLE, part);
-                twiddleProperty(TOOLBAR, part);
-                twiddleProperty(TOOLTIP, part);
-                
-            } 
-            stopMeasuring();
-		}
-        
-        commitMeasurements();
-        assertPerformance();                
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationCreateTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationCreateTest.java
deleted file mode 100644
index 9401767..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationCreateTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.presentations;
-
-import org.eclipse.ui.presentations.AbstractPresentationFactory;
-import org.eclipse.ui.tests.performance.TestRunnable;
-import org.eclipse.ui.tests.performance.layout.PresentationWidgetFactory;
-
-public class PresentationCreateTest extends PresentationPerformanceTest {
-    
-    private int type;
-    private int number;
-    private AbstractPresentationFactory factory;
-
-    public PresentationCreateTest(AbstractPresentationFactory factory, int type, int number) {
-        this(factory, type, number, "creation");
-    }
-    
-    public PresentationCreateTest(AbstractPresentationFactory factory, int type, int number, String message) {
-        super(PresentationWidgetFactory.describePresentation(factory, type) + " " + message);
-        this.type = type;
-        this.number = number;
-        this.factory = factory;
-    }
-    
-    protected void runTest() throws Throwable {
-        exercise(new TestRunnable() {
-            public void run() throws Exception {
-                
-                startMeasuring();
-                
-                PresentationTestbed testbed = createPresentation(factory, type, number);
-                processEvents();
-                testbed.getControl().dispose();
-                processEvents();
-                
-                stopMeasuring();
-            } 
-        });
-        
-        commitMeasurements();
-        assertPerformance();    
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationInactivePartPropertyTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationInactivePartPropertyTest.java
deleted file mode 100644
index f5df0dc..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationInactivePartPropertyTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.presentations;
-
-import org.eclipse.ui.presentations.AbstractPresentationFactory;
-import org.eclipse.ui.tests.performance.TestRunnable;
-import org.eclipse.ui.tests.performance.layout.PresentationWidgetFactory;
-
-public class PresentationInactivePartPropertyTest extends PresentationPerformanceTest {
-    
-    private int type;
-    private int number;
-    private AbstractPresentationFactory factory;
-    
-    public PresentationInactivePartPropertyTest(AbstractPresentationFactory factory, int type, int number) {
-        super(PresentationWidgetFactory.describePresentation(factory, type) + " inactive part properties");
-        this.type = type;
-        this.number = number;
-        this.factory = factory;
-    }
-    
-    protected void runTest() throws Throwable {
-        final PresentationTestbed testbed = createPresentation(factory, type, number);
-        
-        final TestPresentablePart part = new TestPresentablePart(theShell, img);
-        testbed.add(part);
-        
-        exercise(new TestRunnable() {
-            public void run() throws Exception {
-                
-                startMeasuring();
-                
-                for (int counter = 0; counter < 5; counter++) {
-                    twiddleProperty(DESCRIPTION, part);
-                    twiddleProperty(DIRTY, part);
-                    twiddleProperty(IMAGE, part);
-                    twiddleProperty(NAME, part);
-                    twiddleProperty(TITLE, part);
-                    twiddleProperty(TOOLBAR, part);
-                    twiddleProperty(TOOLTIP, part);
-                }
-                
-                stopMeasuring();
-            } 
-        });
-        
-        commitMeasurements();
-        assertPerformance();       
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationPerformanceTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationPerformanceTest.java
deleted file mode 100644
index 013a9a6..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationPerformanceTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.presentations;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.ui.presentations.AbstractPresentationFactory;
-import org.eclipse.ui.tests.performance.BasicPerformanceTest;
-import org.eclipse.ui.tests.performance.UIPerformancePlugin;
-
-public class PresentationPerformanceTest extends BasicPerformanceTest {
-
-	protected Shell theShell;
-
-	protected Image img;
-
-	protected Image img2;
-
-	protected static final int NAME = 0;
-
-	protected static final int TITLE = 1;
-
-	protected static final int DIRTY = 2;
-
-	protected static final int DESCRIPTION = 3;
-
-	protected static final int TOOLTIP = 4;
-
-	protected static final int IMAGE = 5;
-
-	protected static final int TOOLBAR = 6;
-
-	public PresentationPerformanceTest(String testName) {
-		super(testName);
-	}
-
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		theShell = new Shell(Display.getCurrent(), SWT.NONE);
-		theShell.setBounds(0, 0, 1024, 768);
-		theShell.setVisible(true);
-		img = UIPerformancePlugin.getImageDescriptor(
-				"icons/anything.gif").createImage();
-		img2 = UIPerformancePlugin.getImageDescriptor("icons/view.gif")
-				.createImage();
-	}
-
-	protected void doTearDown() throws Exception {
-		theShell.dispose();
-		theShell = null;
-		img.dispose();
-		img2.dispose();
-		super.doTearDown();
-	}
-
-	protected PresentationTestbed createPresentation(
-			AbstractPresentationFactory factory, int type, int numParts) {
-		TestPresentablePart selection = null;
-		PresentationTestbed testBed = new PresentationTestbed(theShell,
-				factory, type);
-		for (int partCount = 0; partCount < numParts; partCount++) {
-			TestPresentablePart part = new TestPresentablePart(theShell, img);
-			part.setName("Some part");
-			part.setContentDescription("Description");
-			part.setTitle("Some title");
-			part.setDirty(partCount % 2 == 0);
-			part.setTooltip("This is a tooltip");
-			testBed.add(part);
-			selection = part;
-		}
-
-		testBed.setSelection(selection);
-
-		Control ctrl = testBed.getControl();
-		ctrl.setBounds(theShell.getClientArea());
-		return testBed;
-	}
-
-	protected void twiddleProperty(int property, TestPresentablePart part) {
-		switch (property) {
-		case NAME: {
-			String originalName = part.getName();
-			part.setName("Some new name");
-			processEvents();
-			part.setName(originalName);
-			processEvents();
-			break;
-		}
-		case TITLE: {
-			String originalTitle = part.getTitle();
-			part.setTitle("Some new title");
-			processEvents();
-			part.setTitle(originalTitle);
-			processEvents();
-			break;
-		}
-		case DIRTY: {
-			boolean originalDirty = part.isDirty();
-			part.setDirty(!originalDirty);
-			processEvents();
-			part.setDirty(originalDirty);
-			processEvents();
-			break;
-		}
-		case DESCRIPTION: {
-			String originalDescription = part.getTitleStatus();
-			part.setContentDescription("Some new description");
-			processEvents();
-			part.setContentDescription(originalDescription);
-			processEvents();
-			break;
-		}
-		case TOOLTIP: {
-			String originalTooltip = part.getTitleToolTip();
-			part.setTooltip("Some new tooltip");
-			processEvents();
-			part.setTooltip(originalTooltip);
-			processEvents();
-			break;
-		}
-		case IMAGE: {
-			Image originalImage = part.getTitleImage();
-
-			part.setImage(img2);
-			processEvents();
-			part.setImage(originalImage);
-			processEvents();
-			break;
-		}
-		case TOOLBAR: {
-			ToolItem newItem = part.addToToolbar(img2);
-
-			processEvents();
-			part.removeFromToolbar(newItem);
-			processEvents();
-			break;
-		}
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationPerformanceTestSuite.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationPerformanceTestSuite.java
deleted file mode 100644
index e180108..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationPerformanceTestSuite.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.performance.presentations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ui.internal.IWorkbenchConstants;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.presentations.PresentationFactoryUtil;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.eclipse.ui.presentations.AbstractPresentationFactory;
-import org.eclipse.ui.tests.performance.layout.PresentationWidgetFactory;
-import org.eclipse.ui.tests.performance.layout.ResizeTest;
-
-/**
- * @since 3.1
- */
-public class PresentationPerformanceTestSuite extends TestSuite {
-
-    
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new PresentationPerformanceTestSuite();
-    }
-    
-    /**
-     * 
-     */
-    public PresentationPerformanceTestSuite() {        
-        String[] ids = getPresentationIds();
-        
-        for (int i = 0; i < ids.length; i++) {
-            String string = ids[i];
-            
-            addTests(string);
-        }
-    }
-
-    private void addTests(String presentationId) {
-        AbstractPresentationFactory factory = WorkbenchPlugin.getDefault().getPresentationFactory(presentationId);
-
-        addTest(new PresentationInactivePartPropertyTest(factory, PresentationFactoryUtil.ROLE_EDITOR, 5));
-        addTest(new PresentationInactivePartPropertyTest(factory, PresentationFactoryUtil.ROLE_VIEW, 5));
-        
-        addTest(new PresentationActivePartPropertyTest(factory, PresentationFactoryUtil.ROLE_EDITOR, 5, false));
-        addTest(new PresentationActivePartPropertyTest(factory, PresentationFactoryUtil.ROLE_VIEW, 5, false));
-        addTest(new PresentationActivePartPropertyTest(factory, PresentationFactoryUtil.ROLE_STANDALONE, 1, false));
-        if(presentationId.equals(IWorkbenchConstants.DEFAULT_PRESENTATION_ID))
-        	addTest(new PresentationActivePartPropertyTest(factory, PresentationFactoryUtil.ROLE_STANDALONE_NOTITLE, 1, true));
-        else
-        	addTest(new PresentationActivePartPropertyTest(factory, PresentationFactoryUtil.ROLE_STANDALONE_NOTITLE, 1, false));
-
-        addTest(new PresentationCreateTest(factory, PresentationFactoryUtil.ROLE_EDITOR, 100, "large folder creation"));
-        addTest(new PresentationCreateTest(factory, PresentationFactoryUtil.ROLE_VIEW, 100, "large folder creation"));
-        
-        addTest(new PresentationCreateTest(factory, PresentationFactoryUtil.ROLE_EDITOR, 5));
-        addTest(new PresentationCreateTest(factory, PresentationFactoryUtil.ROLE_VIEW, 5));
-        addTest(new PresentationCreateTest(factory, PresentationFactoryUtil.ROLE_STANDALONE, 1));
-        addTest(new PresentationCreateTest(factory, PresentationFactoryUtil.ROLE_STANDALONE_NOTITLE, 1));
-        
-        addTest(new PresentationSelectTest(factory, PresentationFactoryUtil.ROLE_EDITOR, 100));
-        addTest(new PresentationSelectTest(factory, PresentationFactoryUtil.ROLE_VIEW, 100));
-        
-        addTest(new PresentationActivateTest(factory, PresentationFactoryUtil.ROLE_EDITOR, 5));
-        addTest(new PresentationActivateTest(factory, PresentationFactoryUtil.ROLE_VIEW, 5));
-        addTest(new PresentationActivateTest(factory, PresentationFactoryUtil.ROLE_STANDALONE, 1));
-        addTest(new PresentationActivateTest(factory, PresentationFactoryUtil.ROLE_STANDALONE_NOTITLE, 1));
-        
-        addTest(new ResizeTest(new PresentationWidgetFactory(factory, PresentationFactoryUtil.ROLE_EDITOR, 5)));
-        addTest(new ResizeTest(new PresentationWidgetFactory(factory, PresentationFactoryUtil.ROLE_VIEW, 5)));
-        addTest(new ResizeTest(new PresentationWidgetFactory(factory, PresentationFactoryUtil.ROLE_STANDALONE, 1)));
-        addTest(new ResizeTest(new PresentationWidgetFactory(factory, PresentationFactoryUtil.ROLE_STANDALONE_NOTITLE, 1)));
-        
-    }
-    
-    private static String[] getPresentationIds() {
-        return listIds(IWorkbenchRegistryConstants.PL_PRESENTATION_FACTORIES,
-                "factory");
-    }
-    
-    private static String[] listIds(String extensionPointId, String elementName) {
-        
-        List result = new ArrayList();
-        
-        IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-                .getExtensionPoint(WorkbenchPlugin.PI_WORKBENCH, extensionPointId);
-        if (extensionPoint == null) {
-            WorkbenchPlugin
-                    .log("Unable to find extension. Extension point: " + extensionPointId + " not found"); //$NON-NLS-1$ //$NON-NLS-2$
-            return null;
-        }
-        
-        // Loop through the config elements.
-        IConfigurationElement[] elements = extensionPoint
-                .getConfigurationElements();
-        for (int j = 0; j < elements.length; j++) {
-            IConfigurationElement element = elements[j];
-            if (elementName == null || elementName.equals(element.getName())) {
-                String strID = element.getAttribute("id"); //$NON-NLS-1$
-                if (strID != null) {
-                    result.add(strID);
-                }
-            }
-        }
-        
-        return (String[]) result.toArray(new String[result.size()]);
-    }    
-    
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationSelectTest.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationSelectTest.java
deleted file mode 100644
index bdbc112..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationSelectTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.presentations;
-
-import org.eclipse.ui.presentations.AbstractPresentationFactory;
-import org.eclipse.ui.presentations.IPresentablePart;
-import org.eclipse.ui.tests.performance.TestRunnable;
-import org.eclipse.ui.tests.performance.layout.PresentationWidgetFactory;
-
-public class PresentationSelectTest extends PresentationPerformanceTest {
-    
-    private int type;
-    private int number;
-    private AbstractPresentationFactory factory;
-    
-    public PresentationSelectTest(AbstractPresentationFactory factory, int type, int number) {
-        super(PresentationWidgetFactory.describePresentation(factory, type) + " selection change");
-        this.type = type;
-        this.number = number;
-        this.factory = factory;
-    }
-    
-    protected void runTest() throws Throwable {
-        final PresentationTestbed testbed = createPresentation(factory, type, number);
-        
-        final IPresentablePart[] parts = testbed.getPartList();
-        
-        exercise(new TestRunnable() {
-            public void run() throws Exception {
-                
-                startMeasuring();
-                
-                for (int i = 0; i < parts.length; i++) {
-                    IPresentablePart part = parts[i];
-                    
-                    testbed.setSelection(part);
-                    processEvents();
-                }
-                
-                stopMeasuring();
-            } 
-        });
-        
-        commitMeasurements();
-        assertPerformance(); 
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationTestbed.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationTestbed.java
deleted file mode 100644
index 4724bf0..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/PresentationTestbed.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Chris Gross chris.gross@us.ibm.com Bug 107443
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.presentations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Assert;
-
-import org.eclipse.swt.SWT;
-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.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.ui.ISizeProvider;
-import org.eclipse.ui.internal.DefaultStackPresentationSite;
-import org.eclipse.ui.internal.presentations.PresentationFactoryUtil;
-import org.eclipse.ui.presentations.AbstractPresentationFactory;
-import org.eclipse.ui.presentations.IPresentablePart;
-import org.eclipse.ui.presentations.IStackPresentationSite;
-import org.eclipse.ui.presentations.StackPresentation;
-
-public class PresentationTestbed {
-    
-    private StackPresentation presentation;
-    private List partList = new ArrayList();
-    private IPresentablePart selectedPart;
-    private Composite control;
-    
-    private DefaultStackPresentationSite site = new DefaultStackPresentationSite() {
-        public void close(IPresentablePart[] toClose) {}
-        public void flushLayout() {}
-        public IPresentablePart[] getPartList() {
-            return (IPresentablePart[]) partList.toArray(new IPresentablePart[partList.size()]);
-        }
-        public IPresentablePart getSelectedPart() {
-            return selectedPart;
-        }
-        public boolean isPartMoveable(IPresentablePart toMove) {
-            return true;
-        }
-        public boolean isStackMoveable() {
-            return true;
-        }
-        /* (non-Javadoc)
-         * @see org.eclipse.ui.presentations.IStackPresentationSite#getProperty(java.lang.String)
-         */
-        public String getProperty(String id) {
-        	return null;
-        }
-    };
-    
-    public PresentationTestbed(Composite parentComposite, AbstractPresentationFactory factory, int type) {
-        presentation = PresentationFactoryUtil.createPresentation(factory, type, parentComposite, site, null, null);
-        site.setPresentation(presentation);
-        control = new Composite(parentComposite, SWT.NONE);
-        control.addControlListener(new ControlListener() {
-            public void controlMoved(ControlEvent e) {
-                updatePresentationBounds();
-            }
-            public void controlResized(ControlEvent e) {
-                updatePresentationBounds();
-            }
-        });
-        
-        control.addDisposeListener(new DisposeListener() {
-            public void widgetDisposed(DisposeEvent e) {
-                site.dispose();
-            } 
-        });
-        
-        control.setLayout(new Layout() {
-            protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
-                int widthHint = wHint == SWT.DEFAULT ? ISizeProvider.INFINITE : wHint;
-                int heightHint = hHint == SWT.DEFAULT ? ISizeProvider.INFINITE : hHint;
-                
-                int width = 200;
-                int height = 200;
-                StackPresentation presentation = site.getPresentation();
-                if (presentation != null) {
-                    width = presentation.computePreferredSize(true, widthHint, heightHint, widthHint);
-                    height = presentation.computePreferredSize(false, heightHint, widthHint, heightHint);
-                }
-                
-                if (width == ISizeProvider.INFINITE) {
-                    width = 200;
-                }
-
-                if (height == ISizeProvider.INFINITE) {
-                    height = 200;
-                }
-                
-                return new Point(width, height);
-            }
-           
-            protected void layout(Composite composite, boolean flushCache) {
-            }
-        });
-        
-        control.setVisible(false);
-        site.setActive(StackPresentation.AS_ACTIVE_FOCUS);
-        site.setState(IStackPresentationSite.STATE_RESTORED);
-    }
-    
-    public Control getControl() {
-        return control;
-    }
-    
-    public void add(IPresentablePart part) {
-        partList.add(part);
-        site.getPresentation().addPart(part, null);
-    }
-    
-    public void remove(IPresentablePart part) {
-        Assert.assertTrue(part != selectedPart);
-        partList.remove(part);
-        site.getPresentation().removePart(part);
-    }
-    
-    public void setSelection(IPresentablePart newSelection) {
-        Assert.assertTrue(partList.contains(newSelection));
-        
-        selectedPart = newSelection;
-        if (selectedPart != null) {
-            site.selectPart(newSelection);
-        }
-    }
-    
-    public void setState(int newState) {
-        site.setPresentationState(newState);
-    }
-    
-    public void setActive(int activeState) {
-        site.setActive(activeState);
-    }
-    
-    public IPresentablePart[] getPartList() {
-        return (IPresentablePart[]) partList.toArray(new IPresentablePart[partList.size()]);
-    }
-    
-    private void updatePresentationBounds() {
-        StackPresentation presentation = site.getPresentation();
-        if (presentation != null) {
-            presentation.setBounds(control.getBounds());
-        }
-    }
-    
-    public IPresentablePart getSelection() {
-        return selectedPart;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/StandaloneViewPerspective.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/StandaloneViewPerspective.java
deleted file mode 100644
index ad825c5..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/StandaloneViewPerspective.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.presentations;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- * @since 3.1
- */
-public class StandaloneViewPerspective implements IPerspectiveFactory {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout)
-     */
-    public void createInitialLayout(IPageLayout layout) {
-        // One standalone view (bookmarks) with trim
-        layout.addStandaloneView(IPageLayout.ID_BOOKMARKS, true, 
-                IPageLayout.LEFT, 0.5f, IPageLayout.ID_EDITOR_AREA);
-        
-        // One standalone view (problems) without trim
-        layout.addStandaloneView(IPageLayout.ID_PROBLEM_VIEW, false, 
-                IPageLayout.RIGHT, 0.5f, IPageLayout.ID_EDITOR_AREA);
-        
-        // One regular view (outline)
-        layout.addView(IPageLayout.ID_OUTLINE, IPageLayout.BOTTOM, 0.5f, IPageLayout.ID_EDITOR_AREA);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/StandaloneViewPerspective2.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/StandaloneViewPerspective2.java
deleted file mode 100644
index 4a873e2..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/StandaloneViewPerspective2.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.presentations;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- * @since 3.1
- */
-public class StandaloneViewPerspective2 implements IPerspectiveFactory {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout)
-     */
-    public void createInitialLayout(IPageLayout layout) {
-        // One standalone view (bookmarks) without trim
-        layout.addStandaloneView(IPageLayout.ID_BOOKMARKS, false, 
-                IPageLayout.LEFT, 0.5f, IPageLayout.ID_EDITOR_AREA);
-        
-        // One standalone view (problems) without trim
-        layout.addStandaloneView(IPageLayout.ID_PROBLEM_VIEW, false, 
-                IPageLayout.RIGHT, 0.5f, IPageLayout.ID_EDITOR_AREA);
-        
-        // One regular view (outline)
-        layout.addStandaloneView(IPageLayout.ID_OUTLINE, false, IPageLayout.BOTTOM, 0.5f, IPageLayout.ID_EDITOR_AREA);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/TestPresentablePart.java b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/TestPresentablePart.java
deleted file mode 100644
index ba85490..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/presentations/TestPresentablePart.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.performance.presentations;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.util.IPropertyChangeListener;
-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.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.presentations.IPartMenu;
-import org.eclipse.ui.presentations.IPresentablePart;
-
-public class TestPresentablePart implements IPresentablePart {
-
-    private List listeners = new ArrayList();
-    
-    private Composite control;
-    private String name = "";
-    private String title = "";
-    private String status = "";
-    private Image image;
-    private String tooltip = "";
-    private boolean dirty;
-    private ToolBar toolbar;
-    
-    public TestPresentablePart(Composite parent, Image image) {
-        control = new Composite(parent, SWT.NONE);
-        control.addDisposeListener(new DisposeListener() {
-            public void widgetDisposed(DisposeEvent e) {
-                disposed();
-            } 
-        });
-        
-        // Add some items to the toolbar
-        toolbar = new ToolBar(parent, SWT.WRAP);
-        for (int idx = 0; idx < 6; idx++) {
-            ToolItem item = new ToolItem(toolbar, SWT.PUSH);
-            item.setImage(image);
-        }
-        this.image = image;
-    }
-    
-    // Set methods called from presentation (all ignored)
-    public void setBounds(Rectangle bounds) {
-        control.setBounds(bounds);
-    }
-    
-    public void setVisible(boolean isVisible) {
-        control.setVisible(isVisible);
-        toolbar.setVisible(isVisible);
-    }
-    
-    public void setFocus() {
-        control.setFocus();
-    }
-
-    public void addPropertyListener(IPropertyListener listener) {
-        listeners.add(listener);
-    }
-
-    public void removePropertyListener(IPropertyListener listener) {
-        listeners.remove(listener);
-    }
-
-    private void firePropertyChange(int propertyId) {
-        for (int i = 0; i < listeners.size(); i++) {
-            ((IPropertyListener) listeners.get(i)).propertyChanged(this,
-                    propertyId);
-        }
-    }
-    
-    public String getName() {
-        return name;
-    }
-
-    public String getTitle() {
-        return title;
-    }
-
-    public String getTitleStatus() {
-        return status;
-    }
-
-    public Image getTitleImage() {
-        return image;
-    }
-
-    public String getTitleToolTip() {
-        return tooltip;
-    }
-
-    public boolean isDirty() {
-        return dirty;
-    }
-
-    public boolean isBusy() {
-        return false;
-    }
-
-    public boolean isCloseable() {
-        return true;
-    }
-
-    public Control getToolBar() {
-        return toolbar;
-    }
-
-    public IPartMenu getMenu() {
-        return null;
-    }
-
-    public Control getControl() {
-        return control;
-    }
-
-    public void disposed() {
-        toolbar.dispose();
-        toolbar = null;
-    }
-    
-    public void setTitle(String title) {
-        this.title = title;
-        firePropertyChange(IPresentablePart.PROP_TITLE);
-    }
-    
-    public void setName(String name) {
-        this.name = name;
-        firePropertyChange(IPresentablePart.PROP_PART_NAME);
-    }
-    
-    public void setImage(Image newImage) {
-        this.image = newImage;
-        firePropertyChange(IPresentablePart.PROP_TITLE);
-    }
-    
-    public void setContentDescription(String descr) {
-        this.status = descr;
-        firePropertyChange(IPresentablePart.PROP_CONTENT_DESCRIPTION);
-    }
-    
-    public void setTooltip(String tooltip) {
-        this.tooltip = tooltip;
-        firePropertyChange(IPresentablePart.PROP_TITLE);
-    }
-    
-    public void setDirty(boolean dirty) {
-        this.dirty = dirty;
-        firePropertyChange(IPresentablePart.PROP_DIRTY);
-    }
-
-    public ToolItem addToToolbar(Image toAdd) {
-        ToolItem item = new ToolItem(toolbar, SWT.PUSH);
-        item.setImage(toAdd);
-        firePropertyChange(IPresentablePart.PROP_TOOLBAR);
-        return item;
-    }
-    
-    public void removeFromToolbar(ToolItem toRemove) {
-        toRemove.dispose();
-        firePropertyChange(IPresentablePart.PROP_TOOLBAR);
-    }
-
-    private ListenerList partPropertyListeners = new ListenerList();
-    
-    private Map partProperties = new HashMap();
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.presentations.IPresentablePart#addPartPropertyListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
-	public void addPartPropertyListener(IPropertyChangeListener listener) {
-		partPropertyListeners.add(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.presentations.IPresentablePart#getPartProperty(java.lang.String)
-	 */
-	public String getPartProperty(String key) {
-		return (String) partProperties.get(key);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.presentations.IPresentablePart#removePartPropertyListener(org.eclipse.jface.util.IPropertyChangeListener)
-	 */
-	public void removePartPropertyListener(IPropertyChangeListener listener) {
-		partPropertyListeners.remove(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISizeProvider#computePreferredSize(boolean, int, int, int)
-	 */
-	public int computePreferredSize(boolean width, int availableParallel,
-			int availablePerpendicular, int preferredResult) {
-		return preferredResult;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISizeProvider#getSizeFlags(boolean)
-	 */
-	public int getSizeFlags(boolean width) {
-		return 0;
-	}
-    
-}
diff --git a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/test_ideas.txt b/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/test_ideas.txt
deleted file mode 100644
index 22f8fe7..0000000
--- a/tests/org.eclipse.ui.tests.performance/src/org/eclipse/ui/tests/performance/test_ideas.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-- Startup time/memory use
-- About
-    - open about then open configuration details then close
-- Workbench [resize Workbench Shell] [switch active part leak check] [stress test switch active part perf.][popup menu open]
-    - with a set of empty views and editors in standard layout
-    - with an editor with a menu entry/a toolbar entry and a view with a simple menu and toolbar
-- Editor [open/close] [zoom/unzoom] [split/unsplit] [stress test open 100 w/o close] [close 100 editors] [minimize/mazimize]
-	- empty
-	- editor with key/context support
-	- multi-page editor
-	- editor that provides a content outline
-	- editor that provides a property sheet
-	- editor that contributes heavily to menus
-	- editor that contributes heavily to toolbars
-	- change icon/title frequently
-	- with lots of popup menu contributions
-- View [open/close] [zoom/unzoom] [detached/re-attach] [make fastview/restore] [minimize/mazimize] [popup menu open]
-	- empty
-	- view with local toolbar
-	- with with view menu
-	- table viewer (TableView)
-	- view that indicates progress when in forground and background
-	- view with content message (see Problems view)
-	- change icon/title frequently
-    - with lots of popup menu contributions
-- Intro [close/open] [standby/non-standby]
-    - basic intro		
-- Perspective [open/close] [stress test open 10 w/o close] [open in new window] [switch pespective]
-	- empty
-	- complex layout
-- Themes [switching theme]
-	- two themes that support the default workbench presentation items
-
--	Shutdown
--	Action Factory (brings in all classes)
--	Leak tests
--	Selection listeners
--	Decorators
--	GDI resources
--	Thread count
--	Overhead of progress support/progress monitor/view
--	Layout
diff --git a/tests/org.eclipse.ui.tests.performance/test.xml b/tests/org.eclipse.ui.tests.performance/test.xml
deleted file mode 100644
index 7178600..0000000
--- a/tests/org.eclipse.ui.tests.performance/test.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0"?>
-
-<project name="testsuite" default="runtests" 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.ui.tests.performance"/>
-  <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>
-
-	<!--default target that does nothing.  The performance target is called explicitly
-	by build team.-->
-  <target name="runtests"/>
-
-  <!-- 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 performance test suites. -->
-  <target name="performance" depends="init,performance-suite,jface-performance-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>
-  
-  <target name="performance-suite">
-  	<property name="performance-workspace" value="${eclipse-home}/performance-workspace-platform-ui"/>
-    <delete dir="${performance-workspace}" quiet="true"/>
-  	<ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${performance-workspace}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname" value="org.eclipse.ui.tests.performance.UIPerformanceTestSuite"/>
-    </ant>
-  </target>
-
-	<target name="jface-performance-suite">
-	  	<property name="performance-workspace-jface" value="${eclipse-home}/performance-workspace-platform-jface"/>
-	    <delete dir="${performance-workspace-jface}" quiet="true"/>
-	  	<ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-	      <property name="data-dir" value="${performance-workspace-jface}"/>
-	      <property name="plugin-name" value="${plugin-name}"/>
-	      <property name="classname" value="org.eclipse.jface.tests.performance.JFacePerformanceSuite"/>
-	    </ant>
-	  </target>
-	
-</project>
diff --git a/tests/org.eclipse.ui.tests.rcp/.classpath b/tests/org.eclipse.ui.tests.rcp/.classpath
deleted file mode 100644
index 1f84474..0000000
--- a/tests/org.eclipse.ui.tests.rcp/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="Eclipse RCP Tests"/>
-	<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/tests/org.eclipse.ui.tests.rcp/.cvsignore b/tests/org.eclipse.ui.tests.rcp/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/tests/org.eclipse.ui.tests.rcp/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/tests/org.eclipse.ui.tests.rcp/.project b/tests/org.eclipse.ui.tests.rcp/.project
deleted file mode 100644
index 7f8ff02..0000000
--- a/tests/org.eclipse.ui.tests.rcp/.project
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.tests.rcp</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.ui</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/tests/org.eclipse.ui.tests.rcp/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.ui.tests.rcp/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 81b36c6..0000000
--- a/tests/org.eclipse.ui.tests.rcp/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,70 +0,0 @@
-#Fri Mar 03 16:43:22 EST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=disabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=private
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/tests/org.eclipse.ui.tests.rcp/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.ui.tests.rcp/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index b29eacb..0000000
--- a/tests/org.eclipse.ui.tests.rcp/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Tue Sep 12 09:00:08 EDT 2006
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.3\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template></templates>
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/ActionBarConfigurerTest.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/ActionBarConfigurerTest.java
deleted file mode 100644
index 4d1fcc4..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/ActionBarConfigurerTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp;
-
-import junit.framework.TestCase;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.tests.rcp.util.WorkbenchAdvisorObserver;
-
-public class ActionBarConfigurerTest extends TestCase {
-
-    public ActionBarConfigurerTest(String name) {
-        super(name);
-    }
-
-    private Display display = null;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        assertNull(display);
-        display = PlatformUI.createDisplay();
-        assertNotNull(display);
-    }
-
-    protected void tearDown() throws Exception {
-        assertNotNull(display);
-        display.dispose();
-        assertTrue(display.isDisposed());
-        super.tearDown();
-    }
-
-    public void testDefaults() {
-        WorkbenchAdvisor wa = new WorkbenchAdvisorObserver(1) {
-
-            public void fillActionBars(IWorkbenchWindow window,
-                    IActionBarConfigurer actionBarConfig, int flags) {
-                super.fillActionBars(window, actionBarConfig, flags);
-
-                assertNotNull(actionBarConfig.getMenuManager());
-                assertNotNull(actionBarConfig.getStatusLineManager());
-                assertNotNull(actionBarConfig.getCoolBarManager());
-            }
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_OK, code);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/IWorkbenchPageTest.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/IWorkbenchPageTest.java
deleted file mode 100644
index 189680c..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/IWorkbenchPageTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp;
-
-import junit.framework.TestCase;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.tests.rcp.util.EmptyView;
-import org.eclipse.ui.tests.rcp.util.WorkbenchAdvisorObserver;
-
-/**
- * Tests the behaviour of various IWorkbenchPage methods under different
- * workbench configurations.
- */
-public class IWorkbenchPageTest extends TestCase {
-
-    public IWorkbenchPageTest(String name) {
-        super(name);
-    }
-
-    private Display display = null;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        assertNull(display);
-        display = PlatformUI.createDisplay();
-        assertNotNull(display);
-    }
-
-    protected void tearDown() throws Exception {
-        assertNotNull(display);
-        display.dispose();
-        assertTrue(display.isDisposed());
-
-        super.tearDown();
-    }
-
-    /**
-     * Regression test for Bug 70080 [RCP] Reset Perspective does not work if no
-     * perspective toolbar shown (RCP).
-     */
-    public void test70080() {
-        WorkbenchAdvisor wa = new WorkbenchAdvisorObserver(1) {
-
-            public void preWindowOpen(IWorkbenchWindowConfigurer configurer) {
-                super.preWindowOpen(configurer);
-                configurer.setShowPerspectiveBar(false);
-            }
-
-            public void postStartup() {
-                try {
-                    IWorkbenchWindow window = getWorkbenchConfigurer()
-                            .getWorkbench().getActiveWorkbenchWindow();
-                    IWorkbenchPage page = window.getActivePage();
-                    page.showView(EmptyView.ID);
-                    assertNotNull(page.findView(EmptyView.ID));
-                    page.resetPerspective();
-                    assertNull(page.findView(EmptyView.ID));
-                } catch (PartInitException e) {
-                    fail(e.toString());
-                }
-            }
-        };
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_OK, code);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/PlatformUITest.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/PlatformUITest.java
deleted file mode 100644
index 29e3527..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/PlatformUITest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.rcp.util.RCPTestWorkbenchAdvisor;
-import org.eclipse.ui.tests.rcp.util.WorkbenchAdvisorObserver;
-
-public class PlatformUITest extends TestCase {
-
-    public PlatformUITest(String testName) {
-        super(testName);
-    }
-
-    /** Make sure workbench is not returned before it is running. */
-    public void testEarlyGetWorkbench() {
-        assertFalse(PlatformUI.isWorkbenchRunning());
-        try {
-            PlatformUI.getWorkbench();
-            fail("Exception should have been thrown."); //$NON-NLS-1$
-        } catch (IllegalStateException e) {
-            // do nothing
-        }
-    }
-
-    public void testCreateDisplay() {
-        Display disp = PlatformUI.createDisplay();
-        assertNotNull(disp);
-        assertFalse(disp.isDisposed());
-        disp.dispose();
-        assertTrue(disp.isDisposed());
-    }
-
-    public void testCreateAndRunWorkbench() {
-        final Display display = PlatformUI.createDisplay();
-        assertNotNull(display);
-
-        CheckForWorkbench wa = new CheckForWorkbench(2);
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_OK, code);
-        assertTrue(wa.checkComplete);
-        display.dispose();
-        assertTrue(display.isDisposed());
-    }
-    
-    /**
-     * Tests that, if an exception occurs on startup, the workbench returns RETURN_UNSTARTABLE 
-     * and PlatformUI.isWorkbenchRunning() returns false. 
-     * Regression test for bug 82286.
-     */
-    public void testCreateAndRunWorkbenchWithExceptionOnStartup() {
-        final Display display = PlatformUI.createDisplay();
-        assertNotNull(display);
-
-        WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1) {
-            public void preStartup() {
-                throw new IllegalArgumentException("Thrown deliberately by PlatformUITest");
-            }
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_UNSTARTABLE, code);
-        assertFalse(PlatformUI.isWorkbenchRunning());
-        display.dispose();
-        assertTrue(display.isDisposed());
-    }
-    
-    public void testStartupThreading() {
-		assertNotNull(
-				"No display during startup.  See RCPTestWorkbenchAdvisor.preStartup()",
-				RCPTestWorkbenchAdvisor.asyncDuringStartup);
-
-		assertEquals(
-				"Async run during startup.  See RCPTestWorkbenchAdvisor.preStartup()",
-				Boolean.FALSE,
-				RCPTestWorkbenchAdvisor.asyncDuringStartup);
-	}
-    // the following four methods test the various combinations of Thread +
-	// DisplayAccess + a/sync exec. Anything without a call to DisplayAccess
-	// should be deferred until after startup.
-    public void testDisplayAccess_sync() {
-    	assertNotNull(
-				"No display during startup.  See RCPTestWorkbenchAdvisor.preStartup()",
-				RCPTestWorkbenchAdvisor.syncWithDisplayAccess);
-
-		assertEquals(
-				"Sync from qualified thread did not run during startup.  See RCPTestWorkbenchAdvisor.preStartup()",
-				Boolean.TRUE,
-				RCPTestWorkbenchAdvisor.syncWithDisplayAccess);
-    }
-    
-    public void testDisplayAccess_async() {    
-    	assertNotNull(
-				"No display during startup.  See RCPTestWorkbenchAdvisor.preStartup()",
-				RCPTestWorkbenchAdvisor.asyncWithDisplayAccess);
-    	
-    	assertEquals(
-				"Async from qualified thread did not run during startup.  See RCPTestWorkbenchAdvisor.preStartup()",
-				Boolean.TRUE,
-				RCPTestWorkbenchAdvisor.asyncWithDisplayAccess);
-    }
-    
-    public void testWithoutDisplayAccess_sync() {
-    	assertNotNull(
-				"No display during startup.  See RCPTestWorkbenchAdvisor.preStartup()",
-				RCPTestWorkbenchAdvisor.syncWithoutDisplayAccess);
-    	
-		assertEquals(
-				"Sync from un-qualified thread ran during startup.  See RCPTestWorkbenchAdvisor.preStartup()",
-				Boolean.FALSE,
-				RCPTestWorkbenchAdvisor.syncWithoutDisplayAccess);
-    }
-    
-    public void testWithoutDisplayAccess_async() { 
-       	assertNotNull(
-				"No display during startup.  See RCPTestWorkbenchAdvisor.preStartup()",
-				RCPTestWorkbenchAdvisor.asyncWithoutDisplayAccess);
-       	
-       	assertEquals(
-				"Async from un-qualified thread ran during startup.  See RCPTestWorkbenchAdvisor.preStartup()",
-				Boolean.FALSE,
-				RCPTestWorkbenchAdvisor.asyncWithoutDisplayAccess);
-    }
-    
-    public void testDisplayAccessInUIThreadAllowed() {
-		assertFalse(
-				"DisplayAccess.accessDisplayDuringStartup() in UI thread did not result in exception.",
-				RCPTestWorkbenchAdvisor.displayAccessInUIThreadAllowed);
-	}
-}
-
-class CheckForWorkbench extends WorkbenchAdvisorObserver {
-
-    public boolean checkComplete = false;
-
-    public CheckForWorkbench(int idleBeforeExit) {
-        super(idleBeforeExit);
-    }
-
-    public void eventLoopIdle(Display display) {
-        super.eventLoopIdle(display);
-
-        if (checkComplete)
-            return;
-
-        Assert.assertNotNull(PlatformUI.getWorkbench());
-        checkComplete = true;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/RcpTestSuite.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/RcpTestSuite.java
deleted file mode 100644
index 4a68702..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/RcpTestSuite.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * The test suite for the RCP APIs in the generic workbench.
- * To run, use a headless JUnit Plug-in Test launcher, configured
- * to have [No Application] as its application. 
- */
-public class RcpTestSuite extends TestSuite {
-
-    /** Returns the suite. This is required to use the JUnit Launcher. */
-    public static Test suite() {
-        return new RcpTestSuite();
-    }
-
-    public RcpTestSuite() {
-        addTest(new TestSuite(PlatformUITest.class));
-        addTest(new TestSuite(WorkbenchAdvisorTest.class));
-        addTest(new TestSuite(WorkbenchConfigurerTest.class));
-        addTest(new TestSuite(WorkbenchWindowConfigurerTest.class));
-        addTest(new TestSuite(ActionBarConfigurerTest.class));
-        addTest(new TestSuite(IWorkbenchPageTest.class));
-        addTest(new TestSuite(WorkbenchSaveRestoreStateTest.class));
-        addTest(new TestSuite(WorkbenchListenerTest.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/WorkbenchAdvisorTest.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/WorkbenchAdvisorTest.java
deleted file mode 100644
index 73b74aa..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/WorkbenchAdvisorTest.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.internal.progress.ProgressManagerUtil;
-import org.eclipse.ui.tests.rcp.util.WorkbenchAdvisorObserver;
-
-public class WorkbenchAdvisorTest extends TestCase {
-
-      public WorkbenchAdvisorTest(String name) {
-        super(name);
-    }
-
-    private Display display = null;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        assertNull(display);
-        display = PlatformUI.createDisplay();
-        assertNotNull(display);
-    }
-
-    protected void tearDown() throws Exception {
-        assertNotNull(display);
-        display.dispose();
-        assertTrue(display.isDisposed());
-
-        super.tearDown();
-    }
-
-    /**
-     * The workbench should be created before any of the advisor's life cycle
-     * methods are called. #initialize is the first one called, so check that
-     * the workbench has been been created by then.
-     */
-    public void testEarlyGetWorkbench() {
-        WorkbenchAdvisor wa = new WorkbenchAdvisorObserver(1) {
-
-            public void initialize(IWorkbenchConfigurer configurer) {
-                super.initialize(configurer);
-                assertNotNull(PlatformUI.getWorkbench());
-            }
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_OK, code);
-    }
-
-    public void testTwoDisplays() {
-        WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1);
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_OK, code);
-        assertFalse(display.isDisposed());
-        display.dispose();
-        assertTrue(display.isDisposed());
-
-        display = PlatformUI.createDisplay();
-        assertNotNull(display);
-
-        WorkbenchAdvisorObserver wa2 = new WorkbenchAdvisorObserver(1);
-
-        int code2 = PlatformUI.createAndRunWorkbench(display, wa2);
-        assertEquals(PlatformUI.RETURN_OK, code2);
-    }
-
-    public void testTrivialOpenClose() {
-        WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1) {
-
-            private boolean windowOpenCalled = false;
-
-            private boolean windowCloseCalled = false;
-
-            public void initialize(IWorkbenchConfigurer c) {
-                super.initialize(c);
-                c.getWorkbench().addWindowListener(new IWindowListener() {
-
-                    public void windowActivated(IWorkbenchWindow window) {
-                        // do nothing
-                    }
-
-                    public void windowDeactivated(IWorkbenchWindow window) {
-                        // do nothing
-                    }
-
-                    public void windowClosed(IWorkbenchWindow window) {
-                        windowCloseCalled = true;
-                    }
-
-                    public void windowOpened(IWorkbenchWindow window) {
-                        windowOpenCalled = true;
-                    }
-                });
-            }
-
-            public void preWindowOpen(IWorkbenchWindowConfigurer c) {
-                assertFalse(windowOpenCalled);
-                super.preWindowOpen(c);
-            }
-
-            public void postWindowOpen(IWorkbenchWindowConfigurer c) {
-                assertTrue(windowOpenCalled);
-                super.postWindowOpen(c);
-            }
-
-            public boolean preWindowShellClose(IWorkbenchWindowConfigurer c) {
-                assertFalse(windowCloseCalled);
-                return super.preWindowShellClose(c);
-            }
-
-            public void postWindowClose(IWorkbenchWindowConfigurer c) {
-                if (false) // which should be called first?
-                    assertTrue(windowCloseCalled);
-                super.postWindowClose(c);
-            }
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_OK, code);
-
-        wa.resetOperationIterator();
-        wa.assertNextOperation(WorkbenchAdvisorObserver.INITIALIZE);
-        wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_STARTUP);
-        wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_WINDOW_OPEN);
-        wa.assertNextOperation(WorkbenchAdvisorObserver.FILL_ACTION_BARS);
-        wa.assertNextOperation(WorkbenchAdvisorObserver.POST_WINDOW_OPEN);
-        wa.assertNextOperation(WorkbenchAdvisorObserver.POST_STARTUP);
-        wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_SHUTDOWN);
-        wa.assertNextOperation(WorkbenchAdvisorObserver.POST_SHUTDOWN);
-        wa.assertAllOperationsExamined();
-    }
-
-    public void testTrivialRestoreClose() {
-        WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1) {
-
-            public void initialize(IWorkbenchConfigurer c) {
-                super.initialize(c);
-                c.setSaveAndRestore(true);
-            }
-
-            public void eventLoopIdle(Display d) {
-                workbenchConfig.getWorkbench().restart();
-            }
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_RESTART, code);
-        assertFalse(display.isDisposed());
-        display.dispose();
-        assertTrue(display.isDisposed());
-
-        display = PlatformUI.createDisplay();
-        WorkbenchAdvisorObserver wa2 = new WorkbenchAdvisorObserver(1) {
-
-            public void initialize(IWorkbenchConfigurer c) {
-                super.initialize(c);
-                c.setSaveAndRestore(true);
-            }
-        };
-
-        int code2 = PlatformUI.createAndRunWorkbench(display, wa2);
-        assertEquals(PlatformUI.RETURN_OK, code2);
-
-        wa2.resetOperationIterator();
-        wa2.assertNextOperation(WorkbenchAdvisorObserver.INITIALIZE);
-        wa2.assertNextOperation(WorkbenchAdvisorObserver.PRE_STARTUP);
-        wa2.assertNextOperation(WorkbenchAdvisorObserver.PRE_WINDOW_OPEN);
-        wa2.assertNextOperation(WorkbenchAdvisorObserver.FILL_ACTION_BARS);
-        wa2.assertNextOperation(WorkbenchAdvisorObserver.POST_WINDOW_RESTORE);
-        wa2.assertNextOperation(WorkbenchAdvisorObserver.POST_WINDOW_OPEN);
-        wa2.assertNextOperation(WorkbenchAdvisorObserver.POST_STARTUP);
-        wa2.assertNextOperation(WorkbenchAdvisorObserver.PRE_SHUTDOWN);
-        wa2.assertNextOperation(WorkbenchAdvisorObserver.POST_SHUTDOWN);
-        wa2.assertAllOperationsExamined();
-    }
-
-    /**
-     * The WorkbenchAdvisor comment for #postStartup says it is ok to close
-     * things from in there.
-     */
-    public void testCloseFromPostStartup() {
-
-        WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1) {
-            public void postStartup() {
-                super.postStartup();
-                assertTrue(PlatformUI.getWorkbench().close());
-            }
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_OK, code);
-
-        wa.resetOperationIterator();
-        wa.assertNextOperation(WorkbenchAdvisorObserver.INITIALIZE);
-        wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_STARTUP);
-        wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_WINDOW_OPEN);
-        wa.assertNextOperation(WorkbenchAdvisorObserver.FILL_ACTION_BARS);
-        wa.assertNextOperation(WorkbenchAdvisorObserver.POST_WINDOW_OPEN);
-        wa.assertNextOperation(WorkbenchAdvisorObserver.POST_STARTUP);
-        wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_SHUTDOWN);
-        wa.assertNextOperation(WorkbenchAdvisorObserver.POST_SHUTDOWN);
-        wa.assertAllOperationsExamined();
-    }
-
-    public void testEventLoopCrash() {
-        WorkbenchAdvisorExceptionObserver wa = new WorkbenchAdvisorExceptionObserver();
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_OK, code);
-        assertTrue(wa.exceptionCaught);
-    }
-
-    public void testFillAllActionBar() {
-        WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1) {
-
-            public void fillActionBars(IWorkbenchWindow window,
-                    IActionBarConfigurer configurer, int flags) {
-                super.fillActionBars(window, configurer, flags);
-
-                assertEquals(FILL_COOL_BAR, flags & FILL_COOL_BAR);
-                assertEquals(FILL_MENU_BAR, flags & FILL_MENU_BAR);
-                assertEquals(FILL_STATUS_LINE, flags & FILL_STATUS_LINE);
-                assertEquals(0, flags & FILL_PROXY);
-            }
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_OK, code);
-    }
-	
-    public void testEmptyProgressRegion() {
-        WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1) {
-			public void preWindowOpen(IWorkbenchWindowConfigurer configurer) {
-				super.preWindowOpen(configurer);
-				configurer.setShowProgressIndicator(false);
-			}
-
-			public void postWindowOpen(IWorkbenchWindowConfigurer configurer) {
-				try {
-					ProgressManagerUtil.animateUp(new Rectangle(0, 0, 100, 50));
-				}
-				catch (NullPointerException e) {
-					// we shouldn't get here
-					assertTrue(false);
-				}
-			}
-				
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_OK, code);
-    }
-
-//  testShellClose() is commented out because it was failing with the shells having already been disposed.
-//      It's unclear what this was really trying to test anyway.
-//    
-//    public void testShellClose() {
-//        WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver() {
-//
-//            public void eventLoopIdle(Display disp) {
-//                super.eventLoopIdle(disp);
-//
-//                Shell[] shells = disp.getShells();
-//                for (int i = 0; i < shells.length; ++i)
-//                    if (shells[i] != null)
-//                        shells[i].close();
-//            }
-//        };
-//
-//        int code = PlatformUI.createAndRunWorkbench(display, wa);
-//        assertEquals(PlatformUI.RETURN_OK, code);
-//
-//        wa.resetOperationIterator();
-//        wa.assertNextOperation(WorkbenchAdvisorObserver.INITIALIZE);
-//        wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_STARTUP);
-//        wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_WINDOW_OPEN);
-//        wa.assertNextOperation(WorkbenchAdvisorObserver.FILL_ACTION_BARS);
-//        wa.assertNextOperation(WorkbenchAdvisorObserver.POST_WINDOW_OPEN);
-//        wa.assertNextOperation(WorkbenchAdvisorObserver.POST_STARTUP);
-//        wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_WINDOW_SHELL_CLOSE);
-//        wa.assertNextOperation(WorkbenchAdvisorObserver.PRE_SHUTDOWN);
-//        wa.assertNextOperation(WorkbenchAdvisorObserver.POST_SHUTDOWN);
-//        wa.assertAllOperationsExamined();
-//    }
-}
-
-class WorkbenchAdvisorExceptionObserver extends WorkbenchAdvisorObserver {
-
-    public boolean exceptionCaught = false;
-
-    private RuntimeException runtimeException;
-
-    public WorkbenchAdvisorExceptionObserver() {
-        super(2);
-    }
-
-    // this is used to indicate when the event loop has started
-    public void eventLoopIdle(Display disp) {
-        super.eventLoopIdle(disp);
-
-        // only crash the loop one time
-        if (runtimeException != null)
-            return;
-
-        runtimeException = new RuntimeException();
-        throw runtimeException;
-    }
-
-    public void eventLoopException(Throwable exception) {
-        // *** Don't let the parent log the exception since it makes for
-        // confusing
-        //     test results.
-
-        exceptionCaught = true;
-        Assert.assertEquals(runtimeException, exception);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/WorkbenchConfigurerTest.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/WorkbenchConfigurerTest.java
deleted file mode 100644
index faa6900..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/WorkbenchConfigurerTest.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-import org.eclipse.ui.tests.rcp.util.RCPTestWorkbenchAdvisor;
-import org.eclipse.ui.tests.rcp.util.WorkbenchAdvisorObserver;
-
-public class WorkbenchConfigurerTest extends TestCase {
-
-    public WorkbenchConfigurerTest(String name) {
-        super(name);
-    }
-
-    private Display display = null;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        assertNull(display);
-        display = PlatformUI.createDisplay();
-        assertNotNull(display);
-    }
-
-    protected void tearDown() throws Exception {
-        assertNotNull(display);
-        display.dispose();
-        assertTrue(display.isDisposed());
-
-        super.tearDown();
-    }
-
-    public void testDefaults() {
-        WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1) {
-
-            private IWorkbenchConfigurer configurer;
-
-            public void initialize(IWorkbenchConfigurer c) {
-                super.initialize(c);
-                configurer = c;
-
-                assertNotNull(c.getWorkbench());
-                assertFalse(c.getSaveAndRestore());
-                assertNotNull(c.getWorkbenchWindowManager());
-            }
-
-            public void postShutdown() {
-                super.postShutdown();
-
-                // *** This should be checked on all of the advisor callbacks
-                //     but assume that if its still set in the last one, then it
-                //     must have been set for all of them.
-                assertFalse(configurer.emergencyClosing());
-            }
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_OK, code);
-    }
-
-    public void testEmergencyClose() {
-        WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(2) {
-
-            private IWorkbenchConfigurer configurer;
-
-            public void initialize(IWorkbenchConfigurer c) {
-                super.initialize(c);
-                configurer = c;
-
-                assertNotNull(c.getWorkbench());
-                assertFalse(c.getSaveAndRestore());
-                assertNotNull(c.getWorkbenchWindowManager());
-            }
-
-            // emergencyClose as soon as possible
-            public void eventLoopIdle(Display disp) {
-                super.eventLoopIdle(disp);
-                configurer.emergencyClose();
-            }
-
-            public void postShutdown() {
-                super.postShutdown();
-
-                // *** This should be checked on all of the advisor callbacks
-                //     but assume that if its still set in the last one, then it
-                //     must have been set for all of them.
-                assertTrue(configurer.emergencyClosing());
-            }
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_EMERGENCY_CLOSE, code);
-    }
-    
-
-	// tests to ensure that all WorkbenchAdvisor API is called from the UI thread.
-	public void testThreading() {
-		final ArrayList results = new ArrayList();
-		
-		WorkbenchAdvisor advisor = new RCPTestWorkbenchAdvisor(1) {
-
-			public void createWindowContents(
-					IWorkbenchWindowConfigurer configurer, Shell shell) {
-				ensureThread();
-				super.createWindowContents(configurer, shell);
-			}
-
-			private void ensureThread() {
-				if (Display.getCurrent() != null)
-					return; 
-				
-				Exception e = new Exception();
-				e.fillInStackTrace();
-				results.add(e);
-			}
-
-			public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
-					IWorkbenchWindowConfigurer configurer) {
-				ensureThread();
-				return super.createWorkbenchWindowAdvisor(configurer);
-			}
-
-			public void eventLoopException(Throwable exception) {
-				ensureThread();
-				super.eventLoopException(exception);
-			}
-
-			public void eventLoopIdle(Display display) {
-				ensureThread();
-				super.eventLoopIdle(display);
-			}
-
-			public void fillActionBars(IWorkbenchWindow window,
-					IActionBarConfigurer configurer, int flags) {
-				ensureThread();
-				super.fillActionBars(window, configurer, flags);
-			}
-
-			public IAdaptable getDefaultPageInput() {
-				ensureThread();
-				return super.getDefaultPageInput();
-			}
-
-			public String getMainPreferencePageId() {
-				ensureThread();
-				return super.getMainPreferencePageId();
-			}
-
-			protected IWorkbenchConfigurer getWorkbenchConfigurer() {
-				ensureThread();
-				return super.getWorkbenchConfigurer();
-			}
-
-			public void initialize(IWorkbenchConfigurer configurer) {
-				ensureThread();
-				super.initialize(configurer);
-			}
-
-			public boolean isApplicationMenu(
-					IWorkbenchWindowConfigurer configurer, String menuId) {
-				ensureThread();
-				return super.isApplicationMenu(configurer, menuId);
-			}
-
-			public void openIntro(IWorkbenchWindowConfigurer configurer) {
-				ensureThread();
-				super.openIntro(configurer);
-			}
-
-			public boolean openWindows() {
-				ensureThread();
-				return super.openWindows();
-			}
-
-			public void postShutdown() {
-				ensureThread();
-				super.postShutdown();
-			}
-
-			public void postStartup() {
-				ensureThread();
-				super.postStartup();
-			}
-
-			public void postWindowClose(IWorkbenchWindowConfigurer configurer) {
-				ensureThread();
-				super.postWindowClose(configurer);
-			}
-
-			public void postWindowCreate(IWorkbenchWindowConfigurer configurer) {
-				ensureThread();
-				super.postWindowCreate(configurer);
-			}
-
-			public void postWindowOpen(IWorkbenchWindowConfigurer configurer) {
-				ensureThread();
-				super.postWindowOpen(configurer);
-			}
-
-			public void postWindowRestore(IWorkbenchWindowConfigurer configurer)
-					throws WorkbenchException {
-				ensureThread();
-				super.postWindowRestore(configurer);
-			}
-
-			public boolean preShutdown() {
-				ensureThread();
-				return super.preShutdown();
-			}
-
-			public void preStartup() {
-				ensureThread();
-				super.preStartup();
-			}
-
-			public void preWindowOpen(IWorkbenchWindowConfigurer configurer) {
-				ensureThread();
-				super.preWindowOpen(configurer);
-			}
-
-			public boolean preWindowShellClose(
-					IWorkbenchWindowConfigurer configurer) {
-				ensureThread();
-				return super.preWindowShellClose(configurer);
-			}
-
-			public IStatus restoreState(IMemento memento) {
-				ensureThread();
-				return super.restoreState(memento);
-			}
-
-			public IStatus saveState(IMemento memento) {
-				ensureThread();
-				return super.saveState(memento);
-			}
-
-			public String getInitialWindowPerspectiveId() {
-				//ensureThread();
-				return null;
-			}};
-			
-		int code = PlatformUI.createAndRunWorkbench(display, advisor);
-		assertEquals(PlatformUI.RETURN_OK, code);
-		
-		if (!results.isEmpty()) {
-			StringBuffer buffer = new StringBuffer("Advisor methods called from non-UI threads:\n");
-			int count=0;
-			for (Iterator i = results.iterator(); i.hasNext();) {
-				Exception e = (Exception) i.next();
-				StackTraceElement [] stack = e.getStackTrace();
-				buffer.append("Failure ").append(++count).append('\n');
-				for (int j = 1; j < Math.min(stack.length, 10); j++) {
-					StackTraceElement stackTraceElement = stack[j];
-					buffer.append(stackTraceElement.getClassName()).append('.')
-							.append(stackTraceElement.getMethodName()).append(
-									":").append(
-									stackTraceElement.getLineNumber()).append(
-									'\n');
-				}
-			}
-			fail(buffer.toString());
-		}
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/WorkbenchListenerTest.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/WorkbenchListenerTest.java
deleted file mode 100644
index 6181328..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/WorkbenchListenerTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchListener;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.tests.rcp.util.WorkbenchAdvisorObserver;
-
-/**
- * Tests for IWorkbenchListener API and implementation.
- */
-public class WorkbenchListenerTest extends TestCase {
-
-    public WorkbenchListenerTest(String name) {
-        super(name);
-    }
-
-    private Display display = null;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        assertNull(display);
-        display = PlatformUI.createDisplay();
-        assertNotNull(display);
-    }
-
-    protected void tearDown() throws Exception {
-        assertNotNull(display);
-        display.dispose();
-        assertTrue(display.isDisposed());
-
-        super.tearDown();
-    }
-
-    /**
-     * Brings the workbench up and tries to shut it down twice, the first time with a veto
-     * from the IWorkbenchListener.  Tests for the correct sequence of notifications.
-     */
-    public void testPreAndPostShutdown() {
-    	final boolean[] proceed = new boolean[1];
-    	final List operations = new ArrayList();
-        WorkbenchAdvisor wa = new WorkbenchAdvisorObserver(1) {
-        	public void postStartup() {
-        		IWorkbench workbench = getWorkbenchConfigurer().getWorkbench();
-        		workbench.addWorkbenchListener(new IWorkbenchListener() {
-					public boolean preShutdown(IWorkbench workbench, boolean forced) {
-						operations.add(PRE_SHUTDOWN);
-						return proceed[0];
-					}
-					public void postShutdown(IWorkbench workbench) {
-						operations.add(POST_SHUTDOWN);
-					}
-				});
-        		proceed[0] = false;
-        		assertEquals(false, workbench.close());
-        		proceed[0] = true;
-        		assertEquals(true, workbench.close());
-        	}
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_OK, code);
-
-        assertEquals(3, operations.size());
-        assertEquals(WorkbenchAdvisorObserver.PRE_SHUTDOWN, operations.get(0));
-        assertEquals(WorkbenchAdvisorObserver.PRE_SHUTDOWN, operations.get(1));
-        assertEquals(WorkbenchAdvisorObserver.POST_SHUTDOWN, operations.get(2));
-    }
-
-    
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/WorkbenchSaveRestoreStateTest.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/WorkbenchSaveRestoreStateTest.java
deleted file mode 100644
index 4a8904e..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/WorkbenchSaveRestoreStateTest.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-import org.eclipse.ui.internal.UIPlugin;
-import org.eclipse.ui.tests.rcp.util.WorkbenchAdvisorObserver;
-
-public class WorkbenchSaveRestoreStateTest extends TestCase {
-	
-	private static final String ADVISOR_STATE_KEY = "advisorStateKey";
-	private static final String WINDOW_ADVISOR_STATE_KEY = "windowAdvisorStateKey";
-	private static final String ACTIONBAR_ADVISOR_STATE_KEY = "actionBarAdvisorStateKey";
-	
-    public WorkbenchSaveRestoreStateTest(String name) {
-        super(name);
-    }
-
-    private Display display = null;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        assertNull(display);
-		display = PlatformUI.createDisplay();
-        assertNotNull(display);
-    }
-
-    protected void tearDown() throws Exception {
-        assertNotNull(display);
-        display.dispose();
-        assertTrue(display.isDisposed());
-
-        super.tearDown();
-    }
-
-	/**
-	 * Test save/restore state lifecycle API for WorkbenchAdvisor
-	 */
-	public void testSaveRestoreAdvisorState() {		
-		final String advisorStateData = Long.toString(System.currentTimeMillis());
-		
-		// launch workbench and save some state data
-        WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1) {
-		
-			public IStatus saveState (IMemento memento) {
-				assertNotNull(memento);
-				memento.putString(ADVISOR_STATE_KEY, advisorStateData);
-				return super.saveState(memento);
-			}
-			
-			public void initialize(IWorkbenchConfigurer c) {
-                super.initialize(c);
-                c.setSaveAndRestore(true);
-            }
-
-            public void eventLoopIdle(Display d) {
-                workbenchConfig.getWorkbench().restart();
-            }
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_RESTART, code);
-        assertFalse(display.isDisposed());
-        display.dispose();
-        assertTrue(display.isDisposed());
-
-		// restore the workbench and check for state data
-        display = PlatformUI.createDisplay();		
-		WorkbenchAdvisorObserver wa2 = new WorkbenchAdvisorObserver(1) {
-
-			public IStatus restoreState(IMemento memento) {
-				assertNotNull(memento);
-				String stateData = memento.getString(ADVISOR_STATE_KEY);
-				assertNotNull(stateData);
-				assertTrue(advisorStateData.equals(stateData));
-				return super.restoreState(memento);
-			}
-			
-			public void initialize(IWorkbenchConfigurer c) {
-                super.initialize(c);
-                c.setSaveAndRestore(true);
-            }
-        };
-
-        int code2 = PlatformUI.createAndRunWorkbench(display, wa2);
-        assertEquals(PlatformUI.RETURN_OK, code2);
-	}
-	
-	/**
-	 * Test save/restore state lifecycle API for WorkbenchWindowAdvisor
-	 */
-	public void testSaveRestoreWindowState() {
-		final String advisorStateData = Long.toString(System.currentTimeMillis());
-		
-		// launch workbench and save some state data
-        WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1) {
-			
-			public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-				return new WorkbenchWindowAdvisor(configurer) {
-					public IStatus saveState(IMemento memento) {
-						assertNotNull(memento);
-						memento.putString(WINDOW_ADVISOR_STATE_KEY, advisorStateData);
-						return super.saveState(memento);
-					}
-				};
-			}
-
-			public void initialize(IWorkbenchConfigurer c) {
-                super.initialize(c);
-                c.setSaveAndRestore(true);
-            }
-
-            public void eventLoopIdle(Display d) {
-                workbenchConfig.getWorkbench().restart();
-            }
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_RESTART, code);
-        assertFalse(display.isDisposed());
-        display.dispose();
-        assertTrue(display.isDisposed());
-
-		// restore the workbench and check for state data
-        display = PlatformUI.createDisplay();		
-		WorkbenchAdvisorObserver wa2 = new WorkbenchAdvisorObserver(1) {
-
-			public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-				return new WorkbenchWindowAdvisor(configurer) {
-					public IStatus restoreState(IMemento memento) {
-						assertNotNull(memento);
-						String stateData = memento.getString(WINDOW_ADVISOR_STATE_KEY);
-						assertNotNull(stateData);
-						assertTrue(advisorStateData.equals(stateData));
-						return super.restoreState(memento);
-					}
-				};
-			}
-			
-			public void initialize(IWorkbenchConfigurer c) {
-                super.initialize(c);
-                c.setSaveAndRestore(true);
-            }
-        };
-
-        int code2 = PlatformUI.createAndRunWorkbench(display, wa2);
-        assertEquals(PlatformUI.RETURN_OK, code2);
-	}
-	
-	/**
-	 * Test save/restore state lifecycle API for WorkbenchWindowAdvisor
-	 */
-	public void testSaveRestoreActionBarState() {
-		final String advisorStateData = Long.toString(System.currentTimeMillis());
-		
-		// launch workbench and save some state data
-        WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1) {
-			
-			public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-				return new WorkbenchWindowAdvisor(configurer) {
-					public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer1) {
-						return new ActionBarAdvisor(configurer1) {
-							public IStatus saveState(IMemento memento) {
-								assertNotNull(memento);
-								memento.putString(ACTIONBAR_ADVISOR_STATE_KEY, advisorStateData);
-								return super.saveState(memento);
-							}
-						};
-					}
-				};
-			}
-
-			public void initialize(IWorkbenchConfigurer c) {
-                super.initialize(c);
-                c.setSaveAndRestore(true);
-            }
-
-            public void eventLoopIdle(Display d) {
-                workbenchConfig.getWorkbench().restart();
-            }
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_RESTART, code);
-        assertFalse(display.isDisposed());
-        display.dispose();
-        assertTrue(display.isDisposed());
-
-		// restore the workbench and check for state data
-        display = PlatformUI.createDisplay();		
-		WorkbenchAdvisorObserver wa2 = new WorkbenchAdvisorObserver(1) {
-
-			public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-				return new WorkbenchWindowAdvisor(configurer) {
-					public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer1) {
-						return new ActionBarAdvisor(configurer1) {
-							public IStatus restoreState(IMemento memento) {
-								assertNotNull(memento);
-								String stateData = memento.getString(ACTIONBAR_ADVISOR_STATE_KEY);
-								assertNotNull(stateData);
-								assertTrue(advisorStateData.equals(stateData));
-								return super.restoreState(memento);
-							}
-						};
-					}
-				};
-			}
-			
-			public void initialize(IWorkbenchConfigurer c) {
-                super.initialize(c);
-                c.setSaveAndRestore(true);
-            }
-        };
-
-        int code2 = PlatformUI.createAndRunWorkbench(display, wa2);
-        assertEquals(PlatformUI.RETURN_OK, code2);
-	}
-	
-	/**
-	 * Test on-demand save/restore state API 
-	 */
-	public void testOnDemandSaveRestoreState() {
-		
-		// save some window state on demand
-        WorkbenchAdvisorObserver wa = new WorkbenchAdvisorObserver(1) {
-			
-			public void initialize(IWorkbenchConfigurer c) {
-                super.initialize(c);
-                c.setSaveAndRestore(true);
-            }
-
-            public void eventLoopIdle(Display d) {
-                workbenchConfig.getWorkbench().restart();
-            }
-			
-			public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-				return new WorkbenchWindowAdvisor(configurer) {
-					public void postWindowOpen() {
-						File stateLocation = getStateFileLocation();
-						ensureDirectoryExists(stateLocation);
-						String stateFileName = stateLocation.getPath() + File.separator + "testOnDemandSaveRestoreState.xml";
-							
-					    OutputStreamWriter writer = null;
-				        try {
-				            writer = new OutputStreamWriter(new FileOutputStream(stateFileName),"UTF-8");
-				            
-				        } catch (UnsupportedEncodingException e1) {
-				            // not possible, UTF-8 is required to be implemented by all JVMs
-				        } catch (FileNotFoundException e1) {
-				            // creating a new file, won't happen  unless the path eclipse 
-							// specifies is totally wrong, or its read-only
-				        }
-							
-				        XMLMemento xmlm = XMLMemento.createWriteRoot("TestState");
-						saveState(xmlm);
-				        
-				        try {
-				            xmlm.save(writer);
-				            writer.close();
-				        } catch (IOException e) {
-							e.printStackTrace();
-				        }
-					}					
-				};
-			}
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_RESTART, code);
-        assertFalse(display.isDisposed());
-        display.dispose();
-        assertTrue(display.isDisposed());
-
-		// restore the workbench and restore a window 
-		// with state data on demand
-        display = PlatformUI.createDisplay();		
-		WorkbenchAdvisorObserver wa2 = new WorkbenchAdvisorObserver(1) {
-			
-			public void initialize(IWorkbenchConfigurer c) {
-                super.initialize(c);
-                c.setSaveAndRestore(true);
-            }
-			
-			public boolean openWindows() {
-				File stateLocation = getStateFileLocation();
-		        String stateFileName = "testOnDemandSaveRestoreState.xml";
-		        File stateFile = new File(stateLocation.getPath() + File.separator + stateFileName);
-		        assertTrue(stateFile.exists());
-	            
-				IMemento memento = null;
-		        try {
-					memento = XMLMemento.createReadRoot( new InputStreamReader (
-							new FileInputStream(stateFile),"UTF-8"));
-		        } catch (WorkbenchException e) {
-		            e.printStackTrace();
-		        } catch (FileNotFoundException e) {
-		            // won't happen because we already checked it exists
-		        } catch (UnsupportedEncodingException e) {
-		           // not possible - UTF8 is required
-		        }
-				
-				assertNotNull(memento);
-				IWorkbenchWindowConfigurer window = null;
-				try {
-					window = getWorkbenchConfigurer().restoreWorkbenchWindow(memento);	
-				} catch (WorkbenchException e) {
-					e.printStackTrace();
-				}
-				assertNotNull(window);
-				return true;
-			}
-
-			public void postWindowRestore(IWorkbenchWindowConfigurer configurer) throws WorkbenchException {
-				// TODO Auto-generated method stub
-				super.postWindowRestore(configurer);
-			}
-        };
-
-        int code2 = PlatformUI.createAndRunWorkbench(display, wa2);
-        assertEquals(PlatformUI.RETURN_OK, code2);
-	}
-			
-	private File getStateFileLocation() {
-	    IPath path = UIPlugin.getDefault().getStateLocation();
-	    StringBuffer fileName = new StringBuffer();
-	    fileName.append(File.separator);
-	    fileName.append("TestWorkbenchState");
-	    fileName.append(File.separator);
-		
-	    File stateLocation = path.append(fileName.toString()).toFile();		
-	    ensureDirectoryExists(stateLocation);
-		
-		return stateLocation;
-	}
-	
-	private void ensureDirectoryExists(File directory) {
-	    directory.mkdirs();
-	}
-	
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/WorkbenchWindowConfigurerTest.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/WorkbenchWindowConfigurerTest.java
deleted file mode 100644
index dcb4cd9..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/WorkbenchWindowConfigurerTest.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.ICoolBarManager;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.tests.rcp.util.RCPTestWorkbenchAdvisor;
-import org.eclipse.ui.tests.rcp.util.WorkbenchAdvisorObserver;
-
-public class WorkbenchWindowConfigurerTest extends TestCase {
-
-    public WorkbenchWindowConfigurerTest(String name) {
-        super(name);
-    }
-
-    private Display display = null;
-
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        assertNull(display);
-        display = PlatformUI.createDisplay();
-        assertNotNull(display);
-    }
-
-    protected void tearDown() throws Exception {
-        assertNotNull(display);
-        display.dispose();
-        assertTrue(display.isDisposed());
-
-        super.tearDown();
-    }
-
-    public void testDefaults() {
-        WorkbenchAdvisor wa = new WorkbenchAdvisorObserver(1) {
-
-            public void fillActionBars(IWorkbenchWindow window,
-                    IActionBarConfigurer actionBarConfig, int flags) {
-                super.fillActionBars(window, actionBarConfig, flags);
-
-                String tempTitle = "title"; //$NON-NLS-1$
-
-                IWorkbenchWindowConfigurer windowConfig = workbenchConfig
-                        .getWindowConfigurer(window);
-                assertNotNull(windowConfig);
-
-                assertEquals(window, windowConfig.getWindow());
-                assertEquals(workbenchConfig, windowConfig
-                        .getWorkbenchConfigurer());
-                assertEquals(actionBarConfig, windowConfig
-                        .getActionBarConfigurer());
-                assertNotNull(windowConfig.getTitle());
-                assertTrue(windowConfig.getShowCoolBar());
-                assertTrue(windowConfig.getShowMenuBar());
-                assertFalse(windowConfig.getShowPerspectiveBar());
-                assertTrue(windowConfig.getShowStatusLine());
-
-                windowConfig.setTitle(tempTitle);
-                windowConfig.setShowCoolBar(false);
-                windowConfig.setShowMenuBar(false);
-                windowConfig.setShowPerspectiveBar(true);
-                windowConfig.setShowStatusLine(false);
-                assertEquals(tempTitle, windowConfig.getTitle());
-                assertFalse(windowConfig.getShowCoolBar());
-                assertFalse(windowConfig.getShowMenuBar());
-                assertTrue(windowConfig.getShowPerspectiveBar());
-                assertFalse(windowConfig.getShowStatusLine());
-
-                // *** title is orginally null, but cannot set it back to null,
-                // should that
-                //     check be allowed?
-                windowConfig.setTitle("");//$NON-NLS-1$
-                windowConfig.setShowCoolBar(true);
-                windowConfig.setShowMenuBar(true);
-                windowConfig.setShowPerspectiveBar(false);
-                windowConfig.setShowStatusLine(true);
-            }
-        };
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_OK, code);
-    }
-
-	public void test104558_T_T() throws Throwable {
-		doTest104558(true, true);
-	}
-	
-	public void test104558_F_T() throws Throwable {
-		doTest104558(false, true);
-	}
-	
-	public void test104558_T_F() throws Throwable {
-		doTest104558(true, false);
-	}
-	
-	public void test104558_F_F() throws Throwable {
-		doTest104558(false, false);
-	}
-
-	private void doTest104558(final boolean showPerspectiveBar, final boolean showCoolBar) {
-		WorkbenchAdvisor wa = new WorkbenchAdvisorObserver(1) {
-			public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
-					IWorkbenchWindowConfigurer workbenchWindowConfigurer) {
-				return new WorkbenchWindowAdvisor(workbenchWindowConfigurer) {
-					public void preWindowOpen() {
-						super.preWindowOpen();
-						getWindowConfigurer().setShowCoolBar(showCoolBar);
-						getWindowConfigurer().setShowPerspectiveBar(showPerspectiveBar);
-					}
-					public void createWindowContents(Shell shell) {
-						IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-						configurer.createPageComposite(shell);
-					}
-				};
-			}
-			
-			public void eventLoopIdle(Display disp) {
-				IWorkbenchWindow activeWorkbenchWindow = getWorkbenchConfigurer()
-						.getWorkbench().getActiveWorkbenchWindow();
-				assertEquals("testing showCoolBar=" + showCoolBar, showCoolBar, ((WorkbenchWindow)activeWorkbenchWindow).getCoolBarVisible());
-				assertEquals("testing showPerspectiveBar=" + showPerspectiveBar, showPerspectiveBar, ((WorkbenchWindow)activeWorkbenchWindow).getPerspectiveBarVisible());
-				super.eventLoopIdle(disp);
-			}
-			
-			public void eventLoopException(Throwable exception) {
-				throw new RuntimeException(exception);
-			}
-		};
-	
-		int code = PlatformUI.createAndRunWorkbench(display, wa);
-		assertEquals(PlatformUI.RETURN_OK, code);
-	}
-	
-
-	// tests to ensure that all WorkbenchAdvisor API is called from the UI thread.
-	public void testThreading() {
-		final ArrayList results = new ArrayList();
-		
-		WorkbenchAdvisor advisor = new RCPTestWorkbenchAdvisor(1) {
-
-			public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
-					IWorkbenchWindowConfigurer configurer) {
-				WorkbenchWindowAdvisor advisor = new WorkbenchWindowAdvisor(configurer) {
-
-					private void ensureThread() {
-						if (Display.getCurrent() != null)
-							return; 
-						
-						Exception e = new Exception();
-						e.fillInStackTrace();
-						StackTraceElement element = e.getStackTrace()[1];
-						results.add(element.getClassName() + '.' + element.getMethodName());
-					}
-					
-					public ActionBarAdvisor createActionBarAdvisor(
-							IActionBarConfigurer configurer) {
-						ensureThread();
-						
-						ActionBarAdvisor advisor = new ActionBarAdvisor(configurer) {
-
-							public void dispose() {
-								ensureThread();
-								super.dispose();
-							}
-
-							protected void disposeAction(IAction action) {
-								ensureThread();
-								super.disposeAction(action);
-							}
-
-							protected void disposeActions() {
-								ensureThread();
-								super.disposeActions();
-							}
-
-							public void fillActionBars(int flags) {
-								ensureThread();
-								super.fillActionBars(flags);
-							}
-
-							protected void fillCoolBar(ICoolBarManager coolBar) {
-								ensureThread();
-								super.fillCoolBar(coolBar);
-							}
-
-							protected void fillMenuBar(IMenuManager menuBar) {
-								ensureThread();
-								super.fillMenuBar(menuBar);
-							}
-
-							protected void fillStatusLine(
-									IStatusLineManager statusLine) {
-								ensureThread();
-								super.fillStatusLine(statusLine);
-							}
-
-							protected IAction getAction(String id) {
-								ensureThread();
-								return super.getAction(id);
-							}
-
-							protected IActionBarConfigurer getActionBarConfigurer() {
-								ensureThread();
-								return super.getActionBarConfigurer();
-							}
-
-							public boolean isApplicationMenu(String menuId) {
-								ensureThread();
-								return super.isApplicationMenu(menuId);
-							}
-
-							protected void makeActions(IWorkbenchWindow window) {
-								ensureThread();
-								super.makeActions(window);
-							}
-
-							protected void register(IAction action) {
-								ensureThread();
-								super.register(action);
-							}
-
-							public IStatus restoreState(IMemento memento) {
-								ensureThread();
-								return super.restoreState(memento);
-							}
-
-							public IStatus saveState(IMemento memento) {
-								ensureThread();
-								return super.saveState(memento);
-							}};
-						return advisor;
-					}
-
-					public Control createEmptyWindowContents(Composite parent) {
-						ensureThread();
-						return super.createEmptyWindowContents(parent);
-					}
-
-					public void createWindowContents(Shell shell) {
-						ensureThread();
-						super.createWindowContents(shell);
-					}
-
-					public void dispose() {
-						ensureThread();
-						super.dispose();
-					}
-
-					protected IWorkbenchWindowConfigurer getWindowConfigurer() {
-						ensureThread();
-						return super.getWindowConfigurer();
-					}
-
-					public void openIntro() {
-						ensureThread();
-						super.openIntro();
-					}
-
-					public void postWindowClose() {
-						ensureThread();
-						super.postWindowClose();
-					}
-
-					public void postWindowCreate() {
-						ensureThread();
-						super.postWindowCreate();
-					}
-
-					public void postWindowOpen() {
-						ensureThread();
-						super.postWindowOpen();
-					}
-
-					public void postWindowRestore() throws WorkbenchException {
-						ensureThread();
-						super.postWindowRestore();
-					}
-
-					public void preWindowOpen() {
-						ensureThread();
-						super.preWindowOpen();
-					}
-
-					public boolean preWindowShellClose() {
-						ensureThread();
-						return super.preWindowShellClose();
-					}
-
-					public IStatus restoreState(IMemento memento) {
-						ensureThread();
-						return super.restoreState(memento);
-					}
-
-					public IStatus saveState(IMemento memento) {
-						ensureThread();
-						return super.saveState(memento);
-					}
-					
-				};
-				return advisor;
-			}
-		};
-			
-		int code = PlatformUI.createAndRunWorkbench(display, advisor);
-		assertEquals(PlatformUI.RETURN_OK, code);
-		
-		if (!results.isEmpty()) {
-			StringBuffer buffer = new StringBuffer("Window/action bar advisor methods called from non-UI threads:\n");
-			for (Iterator i = results.iterator(); i.hasNext();) {
-				String string = (String) i.next();
-				buffer.append(string).append('\n');
-			}
-			fail(buffer.toString());
-		}
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/performance/EmptyWorkbenchPerfTest.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/performance/EmptyWorkbenchPerfTest.java
deleted file mode 100644
index 5a09a6d..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/performance/EmptyWorkbenchPerfTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp.performance;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.test.performance.Dimension;
-import org.eclipse.test.performance.Performance;
-import org.eclipse.test.performance.PerformanceTestCase;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.tests.rcp.util.IPerformanceMeterArray;
-import org.eclipse.ui.tests.rcp.util.IntervalMeters;
-import org.eclipse.ui.tests.rcp.util.RestoreWorkbenchIntervalMonitor;
-import org.eclipse.ui.tests.rcp.util.OpenWorkbenchIntervalMonitor;
-
-/**
- * @since 3.1
- */
-public class EmptyWorkbenchPerfTest extends PerformanceTestCase {
-
-    private static final int REPEAT_COUNT = 10;
-
-    public void testOpen() {
-        Display display = PlatformUI.createDisplay();
-
-        Performance perf = Performance.getDefault();
-
-        String baseScenarioId = perf.getDefaultScenarioId(this);
-        IPerformanceMeterArray meters = new IntervalMeters(perf, baseScenarioId, OpenWorkbenchIntervalMonitor.intervalNames);
-        tagAsSummary("Open RCP App", Dimension.CPU_TIME);
-        for (int i = 0; i < REPEAT_COUNT; ++i ) {
-            meters.start(OpenWorkbenchIntervalMonitor.firstInterval);
-            int code = PlatformUI.createAndRunWorkbench(display,
-                    new OpenWorkbenchIntervalMonitor(meters));
-            meters.stop(OpenWorkbenchIntervalMonitor.finalInterval);
-
-            assertEquals(PlatformUI.RETURN_OK, code);
-        }
-
-        display.dispose();
-        assertTrue(display.isDisposed());
-
-        meters.commit();
-        meters.assertPerformance();
-        meters.dispose();
-    }
-
-    public void testRestore() {
-        Display display = PlatformUI.createDisplay();
-
-        // create an advisor that will just start the workbench long enough to create
-        // something to be restored later
-        WorkbenchAdvisor wa = new RestoreWorkbenchIntervalMonitor();
-
-        int code = PlatformUI.createAndRunWorkbench(display, wa);
-        assertEquals(PlatformUI.RETURN_RESTART, code);
-        assertFalse(display.isDisposed());
-
-        // the rest is a bunch of code to restore the workbench and monitor performance
-        // while doing so
-
-        Performance perf = Performance.getDefault();
-
-        String baseScenarioId = perf.getDefaultScenarioId(this);
-        IPerformanceMeterArray meters = new IntervalMeters(perf, baseScenarioId, RestoreWorkbenchIntervalMonitor.intervalNames);
-
-        tagAsSummary("Restore RCP App", Dimension.CPU_TIME);
-        
-        for (int i = 0; i < REPEAT_COUNT; ++i ) {
-            meters.start(RestoreWorkbenchIntervalMonitor.firstInterval);
-            code = PlatformUI.createAndRunWorkbench(display,
-                    new RestoreWorkbenchIntervalMonitor(meters));
-            meters.stop(RestoreWorkbenchIntervalMonitor.finalInterval);
-
-            assertEquals(PlatformUI.RETURN_OK, code);
-        }
-
-        meters.commit();
-        meters.assertPerformance();
-        meters.dispose();
-
-        display.dispose();
-        assertTrue(display.isDisposed());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/performance/PlatformUIPerfTest.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/performance/PlatformUIPerfTest.java
deleted file mode 100644
index 1e38cd8..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/performance/PlatformUIPerfTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp.performance;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.test.performance.PerformanceTestCase;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.rcp.util.WorkbenchAdvisorObserver;
-
-/**
- * @since 3.1
- */
-public class PlatformUIPerfTest extends PerformanceTestCase {
-
-    public void testCreateAndDisposeDisplayX100() {
-        for (int i = 0; i < 10; ++i ) {
-            startMeasuring();
-            for (int j = 0; j < 100; ++j) {
-            	Display display = PlatformUI.createDisplay();
-                display.dispose();
-                assertTrue(display.isDisposed());
-            }
-            stopMeasuring();
-        }
-
-        commitMeasurements();
-        assertPerformance();
-    }
-
-    public void testRunAndShutdownWorkbench() {
-        Display display = PlatformUI.createDisplay();
-
-        for (int i = 0; i < 10; ++i ) {
-            startMeasuring();
-            int code = PlatformUI.createAndRunWorkbench(display, new WorkbenchAdvisorObserver(2));
-            stopMeasuring();
-
-            assertEquals(PlatformUI.RETURN_OK, code);
-        }
-
-        display.dispose();
-        assertTrue(display.isDisposed());
-
-        commitMeasurements();
-        assertPerformance();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/performance/RCPPerformanceTestSetup.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/performance/RCPPerformanceTestSetup.java
deleted file mode 100644
index 2fc03da..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/performance/RCPPerformanceTestSetup.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp.performance;
-
-import junit.extensions.TestSetup;
-import junit.framework.Test;
-
-/**
- * @since 3.1
- */
-public class RCPPerformanceTestSetup extends TestSetup {
-
-	public RCPPerformanceTestSetup(Test test) {
-		super(test);
-	}
-	
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/performance/RCPPerformanceTestSuite.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/performance/RCPPerformanceTestSuite.java
deleted file mode 100644
index 583ca97..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/performance/RCPPerformanceTestSuite.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp.performance;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * @since 3.1
- */
-public class RCPPerformanceTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static Test suite() {
-    	return new RCPPerformanceTestSetup(new RCPPerformanceTestSuite());
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public RCPPerformanceTestSuite() {
-        addTestSuite(PlatformUIPerfTest.class);
-        addTestSuite(EmptyWorkbenchPerfTest.class);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/EmptyPerspective.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/EmptyPerspective.java
deleted file mode 100644
index d9e506b..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/EmptyPerspective.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp.util;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- * This perspective is used for testing api.  It defines an initial
- * layout with no parts, just an editor area.
- */
-public class EmptyPerspective implements IPerspectiveFactory {
-
-    /**
-     * The perspective id for the empty perspective.
-     */
-    public static final String PERSP_ID = "org.eclipse.ui.tests.rcp.util.EmptyPerspective"; //$NON-NLS-1$
-
-    /**
-     * Constructs a new Default layout engine.
-     */
-    public EmptyPerspective() {
-        super();
-    }
-
-    /**
-     * Defines the initial layout for a perspective.  
-     *
-     * Implementors of this method may add additional views to a
-     * perspective.  The perspective already contains an editor folder
-     * with <code>ID = ILayoutFactory.ID_EDITORS</code>.  Add additional views
-     * to the perspective in reference to the editor folder.
-     *
-     * This method is only called when a new perspective is created.  If
-     * an old perspective is restored from a persistence file then
-     * this method is not called.
-     *
-     * @param factory the factory used to add views to the perspective
-     */
-    public void createInitialLayout(IPageLayout layout) {
-        // do nothing, this is the empty perspective
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/EmptyView.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/EmptyView.java
deleted file mode 100644
index 3de3969..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/EmptyView.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp.util;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * Minimal view, for the RCP tests. 
- */
-public class EmptyView extends ViewPart {
-
-    public static final String ID = "org.eclipse.ui.tests.rcp.util.EmptyView"; //$NON-NLS-1$
-    
-    private Label label;
-    
-	public EmptyView() {
-	    // do nothing
-	}
-
-	public void createPartControl(Composite parent) {
-	    label = new Label(parent, SWT.NONE);
-	    label.setText("Empty view");
-	}
-
-	public void setFocus() {
-		label.setFocus();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/IPerformanceMeterArray.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/IPerformanceMeterArray.java
deleted file mode 100644
index 2cf5d8b..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/IPerformanceMeterArray.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp.util;
-
-/**
- * An array of performance meters that can be used for things like interval timing.
- * 
- * @since 3.1
- */
-public interface IPerformanceMeterArray {
-
-    /**
-     * Start the meter at the argument index.
-     */
-    public void start(int meterIndex);
-
-    /**
-     * Stop the meter at the argument index.
-     */
-    public void stop(int meterIndex);
-
-    /**
-     * Commit all meters in this array.
-     */
-    public void commit();
-
-    /**
-     * Assert the performance of all meters in this array.
-     */
-    public void assertPerformance();
-
-    /**
-     * Dispose all meters in this array.
-     */
-    public void dispose();
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/IntervalMeters.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/IntervalMeters.java
deleted file mode 100644
index 1c2317d..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/IntervalMeters.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp.util;
-
-import org.eclipse.test.performance.Performance;
-import org.eclipse.test.performance.PerformanceMeter;
-
-/**
- * A set of meters that should be used to check performance of intervals.  For example, this
- * collection is used to check performance between all stages of the workbench life-cycle
- * (the significant events are marked in the WorkbenchAdvisor callbacks).
- * 
- * @since 3.1
- */
-public class IntervalMeters implements IPerformanceMeterArray {
-
-    private Performance perf;
-    private String baseScenarioId;
-
-    /**
-     * Clients instantiate the interval meter set as a specific size and are then responsible
-     * for controlling by index.
-     */
-    private PerformanceMeter[] meters;
-
-    /**
-     * Create an set of performance meters using the argument array of strings in the name
-     * for each one
-     * @param intervals
-     */
-    public IntervalMeters(Performance perf, String baseScenarioId, String[] intervals) {
-        this.perf = perf;
-        this.baseScenarioId = baseScenarioId;
-
-        meters = new PerformanceMeter[intervals.length];
-        for (int i = 0; i < intervals.length; ++i) {
-            meters[i] = perf.createPerformanceMeter(getScenarioId(intervals[i]));
-        }
-    }
-
-    private String getScenarioId(String intervalName) {
-        return baseScenarioId + " [" + intervalName + ']'; //$NON-NLS-1$
-    }
-
-    public void start(int meterIndex) {
-        meters[meterIndex].start();
-    }
-
-    public void stop(int meterIndex) {
-        meters[meterIndex].stop();
-    }
-
-    /**
-     * The interval at the argument has completed.  Stop that meter and start the next.
-     * @param completedIntervalIndex
-     */
-    public void intervalBoundary(int completedIntervalIndex) {
-        meters[completedIntervalIndex].stop();
-        meters[completedIntervalIndex + 1].start();
-    }
-
-    public void commit() {
-        for (int i = 0; i < meters.length; ++i)
-            meters[i].commit();
-    }
-
-    public void assertPerformance() {
-        for (int i = 0; i < meters.length; ++i)
-            perf.assertPerformance(meters[i]);
-    }
-
-    public void dispose() {
-        for (int i = 0; i < meters.length; ++i)
-            meters[i].dispose();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/NullMeters.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/NullMeters.java
deleted file mode 100644
index 3dd21b0..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/NullMeters.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp.util;
-
-/**
- * An empty array of meters, all calls are ignored.
- * 
- * @since 3.1
- */
-public class NullMeters implements IPerformanceMeterArray {
-
-    public NullMeters() {
-        // do nothing
-    }
-
-    public void start(int meterIndex) {
-        // do nothing
-    }
-
-    public void stop(int meterIndex) {
-        // do nothing
-    }
-
-    public void intervalBoundary(int completedIntervalIndex) {
-        // do nothing
-    }
-
-    public void commit() {
-        // do nothing
-    }
-
-    public void assertPerformance() {
-        // do nothing
-    }
-
-    public void dispose() {
-        // do nothing
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/OpenWorkbenchIntervalMonitor.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/OpenWorkbenchIntervalMonitor.java
deleted file mode 100644
index f3097de..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/OpenWorkbenchIntervalMonitor.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp.util;
-
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-
-
-/**
- * This implementation of the workbench advisor tracks performance for the intervals between
- * lifecycle events.
- * 
- * @since 3.1
- */
-public class OpenWorkbenchIntervalMonitor extends RCPTestWorkbenchAdvisor {
-
-    public static final String[] intervalNames = new String[] {
-        "open", //$NON-NLS-1$
-        "close" //$NON-NLS-1$
-	};
-	
-	public static final int openInterval = 0;
-	public static final int closeInterval = 1;
-	
-	public static final int firstInterval = openInterval;
-	public static final int finalInterval = closeInterval;
-
-//    public static final String[] intervalNames = new String[] {
-//            "to initialize", //$NON-NLS-1$
-//            "initialize to preStartup", //$NON-NLS-1$
-//            "preStartup to preWindowOpen", //$NON-NLS-1$
-//            "preWindowOpen to fillActionBars", //$NON-NLS-1$
-//            "fillActionBars to postWindowOpen", //$NON-NLS-1$
-//            "postWindowOpen to postStartup", //$NON-NLS-1$
-//            "preShutdown to postShutdown", //$NON-NLS-1$
-//            "postShutdown to complete" //$NON-NLS-1$
-//    };
-//
-//    public static final int initializeInterval = 0;
-//    public static final int preStartupInterval = 1;
-//    public static final int preWindowOpenInterval = 2;
-//    public static final int fillActionBarsInterval = 3;
-//    public static final int postWindowOpenInterval = 4;
-//    public static final int postStartupInterval = 5;
-//    public static final int shutdownInterval = 6;
-//    public static final int workbenchDestroyedInterval = 7;
-//
-//    public static final int firstInterval = initializeInterval;
-//    public static final int finalInterval = workbenchDestroyedInterval;
-
-    private IPerformanceMeterArray meters;
-
-    public OpenWorkbenchIntervalMonitor(IPerformanceMeterArray meters) {
-        super(2);
-        this.meters = meters;
-    }
-
-    public void initialize(IWorkbenchConfigurer configurer) {
-//        meters.stop(initializeInterval);
-//        meters.start(preStartupInterval);
-        super.initialize(configurer);
-    }
-
-    public void preStartup() {
-//        meters.stop(preStartupInterval);
-//        meters.start(preWindowOpenInterval);
-        super.preStartup();
-    }
-
-    public void preWindowOpen(IWorkbenchWindowConfigurer configurer) {
-//        meters.stop(preWindowOpenInterval);
-//        meters.start(fillActionBarsInterval);
-        super.preWindowOpen(configurer);
-    }
-
-    public void fillActionBars(IWorkbenchWindow window, IActionBarConfigurer configurer, int flags) {
-//        meters.stop(fillActionBarsInterval);
-//        meters.start(postWindowOpenInterval);
-        super.fillActionBars(window, configurer, flags);
-
-    }
-
-    public void postWindowOpen(IWorkbenchWindowConfigurer configurer) {
-//        meters.stop(postWindowOpenInterval);
-//        meters.start(postStartupInterval);
-        super.postWindowOpen(configurer);
-    }
-
-    public void postStartup() {
-//        meters.stop(postStartupInterval);
-    	meters.stop(openInterval);
-    	
-        // no reason to track performace between when startup completes and shutdown starts
-        // since that is just testing overhead
-
-        super.postStartup();
-    }
-
-    public boolean preShutdown() {
-//        meters.start(shutdownInterval);
-    	meters.start(closeInterval);
-        return super.preShutdown();
-    }
-
-    public void postShutdown() {
-//        meters.stop(shutdownInterval);
-//        meters.start(workbenchDestroyedInterval);
-        super.postShutdown();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/RCPTestWorkbenchAdvisor.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/RCPTestWorkbenchAdvisor.java
deleted file mode 100644
index 68b7318..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/RCPTestWorkbenchAdvisor.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp.util;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.application.DisplayAccess;
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-
-/**
- * This advisor adds the ability to exit the workbench after it has started up.
- * This is done with a call to close from within the advisor's event idle loop.
- * The number of times the idle is called before exiting can be configured. Test
- * cases should subclass this advisor and add their own callback methods if
- * needed.
- * 
- * @since 3.1
- */
-public class RCPTestWorkbenchAdvisor extends WorkbenchAdvisor {
-
-	public static Boolean asyncDuringStartup = null;
-	
-	// the following fields are set by the threads that attempt sync/asyncs
-	// during startup.
-	public static Boolean syncWithDisplayAccess = null;
-	public static Boolean asyncWithDisplayAccess = null;
-	public static Boolean syncWithoutDisplayAccess = null;
-	public static Boolean asyncWithoutDisplayAccess = null;
-	
-	private static boolean started = false;
-
-	public static boolean isSTARTED() {
-		synchronized (RCPTestWorkbenchAdvisor.class) {
-			return started;
-		}
-	}
-
-	/** Default value of -1 causes the option to be ignored. */
-	private int idleBeforeExit = -1;
-
-	/**
-	 * Traps whether or not calls to displayAccess in the UI thread resulted in
-	 * an exception. Should be false.
-	 */
-	public static boolean displayAccessInUIThreadAllowed;
-
-	public RCPTestWorkbenchAdvisor() {
-		// default value means the advisor will not trigger the workbench to
-		// close
-		this.idleBeforeExit = -1;
-	}
-
-	public RCPTestWorkbenchAdvisor(int idleBeforeExit) {
-		this.idleBeforeExit = idleBeforeExit;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#initialize(org.eclipse.ui.application.IWorkbenchConfigurer)
-	 */
-	public void initialize(IWorkbenchConfigurer configurer) {
-		super.initialize(configurer);
-
-		// The RCP tests are currently run in the context of the Platform
-		// product, which specifies
-		// the Resource perspective as the default, and also reports progress on
-		// startup.
-		// We don't want either in effect when running the RCP tests.
-		// Also disable intro.
-		IPreferenceStore prefs = PlatformUI.getPreferenceStore();
-		prefs
-				.setValue(IWorkbenchPreferenceConstants.DEFAULT_PERSPECTIVE_ID,
-						"");
-		prefs.setValue(IWorkbenchPreferenceConstants.SHOW_PROGRESS_ON_STARTUP,
-				false);
-		prefs.setValue(IWorkbenchPreferenceConstants.SHOW_INTRO, false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#getInitialWindowPerspectiveId()
-	 */
-	public String getInitialWindowPerspectiveId() {
-		return EmptyPerspective.PERSP_ID;
-	}
-
-	public void eventLoopIdle(final Display display) {
-		// Bug 107369: RCP test suite hangs on GTK
-		if (idleBeforeExit != -1 && --idleBeforeExit <= 0)
-			PlatformUI.getWorkbench().close();
-
-		// bug 73184: On the mac the parent eventLoopIdle will put the display
-		// to sleep
-		// until there are events (e.g., mouse jiggled).
-// if (!Util.isCarbon)
-// super.eventLoopIdle(display);
-
-		if (idleBeforeExit == -1)
-			return;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#preStartup()
-	 */
-	public void preStartup() {
-		super.preStartup();
-		final Display display = Display.getCurrent();
-		if (display != null) {
-			display.asyncExec(new Runnable() {
-
-				public void run() {
-					if (isSTARTED())
-						asyncDuringStartup = Boolean.FALSE;
-					else
-						asyncDuringStartup = Boolean.TRUE;
-				}
-			});
-		}
-		
-		// start a bunch of threads that are going to do a/sync execs. For some
-		// of them, call DisplayAccess.accessDisplayDuringStartup. For others,
-		// dont. Those that call this method should have their runnables invoked
-		// prior to the method isSTARTED returning true.
-		
-		setupAsyncDisplayThread(true, display);
-		setupSyncDisplayThread(true, display);
-		setupAsyncDisplayThread(false, display);
-		setupSyncDisplayThread(false, display);
-		
-		try {
-			DisplayAccess.accessDisplayDuringStartup();
-			displayAccessInUIThreadAllowed = true;
-		}
-		catch (IllegalStateException e) {
-			displayAccessInUIThreadAllowed = false;
-		}
-	}
-
-	/**
-	 * @param display
-	 */
-	private void setupSyncDisplayThread(final boolean callDisplayAccess, final Display display) {
-		Thread syncThread = new Thread() {
-			/* (non-Javadoc)
-			 * @see java.lang.Thread#run()
-			 */
-			public void run() {
-				if (callDisplayAccess)
-					DisplayAccess.accessDisplayDuringStartup();
-				try {
-					display.syncExec(new Runnable() {
-						public void run() {
-							synchronized (RCPTestWorkbenchAdvisor.class) {
-								if (callDisplayAccess)
-									syncWithDisplayAccess = !isSTARTED() ? Boolean.TRUE
-											: Boolean.FALSE;
-								else
-									syncWithoutDisplayAccess = !isSTARTED() ? Boolean.TRUE
-											: Boolean.FALSE;
-							}
-						}
-					});
-				} catch (SWTException e) {
-					// this can happen because we shut down the workbench just
-					// as soon as we're initialized - ie: when we're trying to
-					// run this runnable in the deferred case.
-				}
-			}
-		};
-		syncThread.setDaemon(true);
-		syncThread.start();
-	}
-
-	/**
-	 * @param display
-	 */
-	private void setupAsyncDisplayThread(final boolean callDisplayAccess, final Display display) {
-		Thread asyncThread = new Thread() {
-			/* (non-Javadoc)
-			 * @see java.lang.Thread#run()
-			 */
-			public void run() {
-				if (callDisplayAccess)
-					DisplayAccess.accessDisplayDuringStartup();
-				display.asyncExec(new Runnable() {
-					public void run() {
-						synchronized (RCPTestWorkbenchAdvisor.class) {
-							if (callDisplayAccess)
-								asyncWithDisplayAccess = !isSTARTED() ? Boolean.TRUE
-										: Boolean.FALSE;
-							else
-								asyncWithoutDisplayAccess = !isSTARTED() ? Boolean.TRUE
-										: Boolean.FALSE;
-						}
-					}});
-			}
-		};
-		asyncThread.setDaemon(true);
-		asyncThread.start();
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#postStartup()
-	 */
-	public void postStartup() {
-		super.postStartup();
-		synchronized (RCPTestWorkbenchAdvisor.class) {
-			started = true;
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/RestoreWorkbenchIntervalMonitor.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/RestoreWorkbenchIntervalMonitor.java
deleted file mode 100644
index b8e4e8a..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/RestoreWorkbenchIntervalMonitor.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp.util;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-
-
-/**
- * This implementation of the workbench advisor tracks performance for the intervals between
- * lifecycle events.
- * 
- * @since 3.1
- */
-public class RestoreWorkbenchIntervalMonitor extends RCPTestWorkbenchAdvisor {
-
-    public static final String[] intervalNames = new String[] {
-        "open", //$NON-NLS-1$
-        "close" //$NON-NLS-1$
-	};
-	
-	public static final int openInterval = 0;
-	public static final int closeInterval = 1;
-	
-	public static final int firstInterval = openInterval;
-	public static final int finalInterval = closeInterval;
-	
-	private boolean createRestorableWorkbench = false;
-	private IPerformanceMeterArray meters = new NullMeters();
-	
-//    public static final String[] intervalNames = new String[] {
-//            "to initialize", //$NON-NLS-1$
-//            "initialize to preStartup", //$NON-NLS-1$
-//            "preStartup to preWindowOpen", //$NON-NLS-1$
-//            "preWindowOpen to fillActionBars", //$NON-NLS-1$
-//            "fillActionBars to postWindowRestore", //$NON-NLS-1$
-//            "postWindowRestore to postWindowOpen", //$NON-NLS-1$
-//            "postWindowOpen to postStartup", //$NON-NLS-1$
-//            "preShutdown to postShutdown", //$NON-NLS-1$
-//            "postShutdown to complete" //$NON-NLS-1$
-//    };
-//
-//    public static final int initializeInterval = 0;
-//    public static final int preStartupInterval = 1;
-//    public static final int preWindowOpenInterval = 2;
-//    public static final int fillActionBarsInterval = 3;
-//    public static final int postWindowRestoreInterval = 4;
-//    public static final int postWindowOpenInterval = 5;
-//    public static final int postStartupInterval = 6;
-//    public static final int shutdownInterval = 7;
-//    public static final int workbenchDestroyedInterval = 8;
-//
-//    public static final int firstInterval = initializeInterval;
-//    public static final int finalInterval = workbenchDestroyedInterval;
-//
-//    private boolean createRestorableWorkbench = false;
-//    private IPerformanceMeterArray meters = new NullMeters();
-
-    private IWorkbenchConfigurer workbenchConfigurer;
-
-    /**
-     * The default behaviour is to create a workbench that can be restored later.  This
-     * constructor starts that behaviour by setting a flag that will be checked in the
-     * appropriate methods.
-     */
-    public RestoreWorkbenchIntervalMonitor() {
-        super(2);
-        createRestorableWorkbench = true;
-    }
-
-    public RestoreWorkbenchIntervalMonitor(IPerformanceMeterArray meters) {
-        super(2);
-        this.meters = meters;
-    }
-
-    public void initialize(IWorkbenchConfigurer configurer) {
-//        meters.stop(initializeInterval);
-
-        super.initialize(configurer);
-        workbenchConfigurer = configurer;
-        workbenchConfigurer.setSaveAndRestore(true);
-
-//        meters.start(preStartupInterval);
-    }
-
-    public void preStartup() {
-//        meters.stop(preStartupInterval);
-        super.preStartup();
-//        meters.start(preWindowOpenInterval);
-    }
-
-    public void preWindowOpen(IWorkbenchWindowConfigurer configurer) {
-//        meters.stop(preWindowOpenInterval);
-        super.preWindowOpen(configurer);
-//        meters.start(fillActionBarsInterval);
-    }
-
-    public void fillActionBars(IWorkbenchWindow window, IActionBarConfigurer configurer, int flags) {
-//        meters.stop(fillActionBarsInterval);
-        super.fillActionBars(window, configurer, flags);
-//        meters.start(postWindowRestoreInterval);
-    }
-
-    public void postWindowRestore(IWorkbenchWindowConfigurer configurer) throws WorkbenchException {
-//        meters.stop(postWindowRestoreInterval);
-        super.postWindowRestore(configurer);
-//        meters.start(postWindowOpenInterval);
-    }
-
-    public void postWindowOpen(IWorkbenchWindowConfigurer configurer) {
-//        meters.stop(postWindowOpenInterval);
-        super.postWindowOpen(configurer);
-//        meters.start(postStartupInterval);
-    }
-
-    public void postStartup() {
-//        meters.stop(postStartupInterval);
-        meters.stop(openInterval);
-
-        // no reason to track performace between when startup completes and shutdown starts
-        // since that is just testing overhead
-
-        super.postStartup();
-    }
-
-    public boolean preShutdown() {
-        boolean ret = super.preShutdown();
-//        meters.start(shutdownInterval);
-        meters.start(closeInterval);
-        return ret;
-    }
-
-    public void postShutdown() {
-//        meters.stop(shutdownInterval);
-        super.postShutdown();
-//        meters.start(workbenchDestroyedInterval);
-    }
-
-    public void eventLoopIdle(Display d) {
-        if (createRestorableWorkbench)
-            workbenchConfigurer.getWorkbench().restart();
-        else
-            super.eventLoopIdle(d);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/WorkbenchAdvisorObserver.java b/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/WorkbenchAdvisorObserver.java
deleted file mode 100644
index 3c54a5a..0000000
--- a/tests/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/util/WorkbenchAdvisorObserver.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.rcp.util;
-
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import junit.framework.Assert;
-
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-
-/**
- * This utility class is used to record the order in which the hooks are called.
- * It should be subclassed to provide the behaviour needed for a particular test
- * case. After the case has run, its list can be examined to check for the
- * expected order.
- * <p>
- * NOTE: This differs from <code>org.eclipse.ui.tests.CallHistory</code> since
- * this class allows assertions on individual method names. Which means that the
- * junit error will identify the exact error, not just the existence of an
- * error.
- */
-public class WorkbenchAdvisorObserver extends RCPTestWorkbenchAdvisor {
-
-    private List operations = new LinkedList();
-
-    private Iterator iterator;
-
-    public final static String INITIALIZE = "initialize"; //$NON-NLS-1$
-
-    public final static String PRE_STARTUP = "preStartup"; //$NON-NLS-1$
-
-    public final static String POST_STARTUP = "postStartup"; //$NON-NLS-1$
-
-    public final static String PRE_WINDOW_OPEN = "preWindowOpen"; //$NON-NLS-1$
-
-    public final static String FILL_ACTION_BARS = "fillActionBars"; //$NON-NLS-1$
-
-    public final static String POST_WINDOW_RESTORE = "postWindowRestore"; //$NON-NLS-1$
-
-    public final static String POST_WINDOW_OPEN = "postWindowOpen"; //$NON-NLS-1$
-
-    public final static String PRE_WINDOW_SHELL_CLOSE = "preWindowShellClose"; //$NON-NLS-1$
-
-    public final static String EVENT_LOOP_EXCEPTION = "eventLoopException"; //$NON-NLS-1$
-
-    public final static String PRE_SHUTDOWN = "preShutdown"; //$NON-NLS-1$
-
-    public final static String POST_SHUTDOWN = "postShutdown"; //$NON-NLS-1$
-
-    public IWorkbenchConfigurer workbenchConfig;
-
-    public WorkbenchAdvisorObserver() {
-        super();
-    }
-
-    public WorkbenchAdvisorObserver(int idleBeforeExit) {
-        super(idleBeforeExit);
-    }
-
-    public void resetOperationIterator() {
-        iterator = operations.iterator();
-    }
-
-    public void assertNextOperation(String expected) {
-        Assert.assertTrue(iterator.hasNext());
-        Assert.assertEquals(expected, (String) iterator.next());
-    }
-
-    public void assertAllOperationsExamined() {
-        Assert.assertNotNull(iterator);
-        Assert.assertFalse(iterator.hasNext());
-    }
-
-    private void addOperation(String operation) {
-        operations.add(operation);
-    }
-
-    public void initialize(IWorkbenchConfigurer configurer) {
-        super.initialize(configurer);
-        workbenchConfig = configurer;
-        addOperation(INITIALIZE);
-    }
-
-    public void preStartup() {
-        super.preStartup();
-        addOperation(PRE_STARTUP);
-    }
-
-    public void preWindowOpen(IWorkbenchWindowConfigurer configurer) {
-        super.preWindowOpen(configurer);
-        addOperation(PRE_WINDOW_OPEN);
-    }
-
-    public void fillActionBars(IWorkbenchWindow window,
-            IActionBarConfigurer configurer, int flags) {
-        super.fillActionBars(window, configurer, flags);
-        addOperation(FILL_ACTION_BARS);
-    }
-
-    public void postWindowRestore(IWorkbenchWindowConfigurer configurer)
-            throws WorkbenchException {
-        super.postWindowRestore(configurer);
-        addOperation(POST_WINDOW_RESTORE);
-    }
-
-    public void postWindowOpen(IWorkbenchWindowConfigurer configurer) {
-        super.postWindowOpen(configurer);
-        addOperation(POST_WINDOW_OPEN);
-    }
-
-    public void postStartup() {
-        super.postStartup();
-        addOperation(POST_STARTUP);
-    }
-
-    public boolean preWindowShellClose(IWorkbenchWindowConfigurer configurer) {
-        if (!super.preWindowShellClose(configurer))
-            return false;
-        addOperation(PRE_WINDOW_SHELL_CLOSE);
-        return true;
-    }
-
-    public boolean preShutdown() {
-        boolean result = super.preShutdown();
-        addOperation(PRE_SHUTDOWN);
-        return result;
-    }
-
-    public void postShutdown() {
-        super.postShutdown();
-        addOperation(POST_SHUTDOWN);
-    }
-
-    public void eventLoopException(Throwable exception) {
-        super.eventLoopException(exception);
-        addOperation(EVENT_LOOP_EXCEPTION);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.rcp/META-INF/MANIFEST.MF b/tests/org.eclipse.ui.tests.rcp/META-INF/MANIFEST.MF
deleted file mode 100644
index 4db119e..0000000
--- a/tests/org.eclipse.ui.tests.rcp/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,14 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Eclipse RCP Tests
-Bundle-SymbolicName: org.eclipse.ui.tests.rcp; singleton:=true
-Bundle-Version: 3.3.0.qualifier
-Bundle-ClassPath: rcptests.jar
-Bundle-Activator: org.eclipse.core.internal.compatibility.PluginActivator
-Bundle-Vendor: Eclipse.org
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime.compatibility,
- org.eclipse.ui,
- org.junit,
- org.eclipse.test.performance
-Bundle-ActivationPolicy: lazy
diff --git a/tests/org.eclipse.ui.tests.rcp/RCP Test Suite.launch b/tests/org.eclipse.ui.tests.rcp/RCP Test Suite.launch
deleted file mode 100644
index 2d47d9d..0000000
--- a/tests/org.eclipse.ui.tests.rcp/RCP Test Suite.launch
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
-<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
-<booleanAttribute key="askclear" value="false"/>
-<booleanAttribute key="automaticAdd" value="true"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="checked" value="[NONE]"/>
-<booleanAttribute key="clearConfig" value="true"/>
-<booleanAttribute key="clearws" value="true"/>
-<booleanAttribute key="clearwslog" value="false"/>
-<booleanAttribute key="com.mountainminds.eclemma.core.INPLACE_INSTRUMENTATION" value="true"/>
-<listAttribute key="com.mountainminds.eclemma.core.INSTRUMENTATION_PATHS">
-<listEntry value="/org.eclipse.ui/bin"/>
-<listEntry value="/org.eclipse.ui.workbench/bin"/>
-</listAttribute>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
-<booleanAttribute key="default" value="true"/>
-<booleanAttribute key="includeOptional" value="true"/>
-<stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.ui.tests.rcp/Eclipse RCP Tests/org/eclipse/ui/tests/rcp/RcpTestSuite.java"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.ui.tests.rcp.RcpTestSuite"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.ui.tests.rcp"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<stringAttribute key="product" value="org.eclipse.sdk.ide"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="templateConfig" value=""/>
-<booleanAttribute key="tracing" value="false"/>
-<booleanAttribute key="useDefaultConfig" value="true"/>
-<booleanAttribute key="useDefaultConfigArea" value="false"/>
-<booleanAttribute key="useProduct" value="false"/>
-</launchConfiguration>
diff --git a/tests/org.eclipse.ui.tests.rcp/about.html b/tests/org.eclipse.ui.tests.rcp/about.html
deleted file mode 100644
index 4602330..0000000
--- a/tests/org.eclipse.ui.tests.rcp/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.rcp/build.properties b/tests/org.eclipse.ui.tests.rcp/build.properties
deleted file mode 100644
index c51eb2e..0000000
--- a/tests/org.eclipse.ui.tests.rcp/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = plugin.properties,\
-               plugin.xml,\
-               *.html,\
-               *.jar,\
-               *.xml,\
-               rcptests.jar,\
-               META-INF/
-src.includes = about.html
-jars.compile.order = rcptests.jar
-source.rcptests.jar = Eclipse RCP Tests/
-output.rcptests.jar = bin/
diff --git a/tests/org.eclipse.ui.tests.rcp/icons/sample.gif b/tests/org.eclipse.ui.tests.rcp/icons/sample.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/tests/org.eclipse.ui.tests.rcp/icons/sample.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.rcp/plugin.xml b/tests/org.eclipse.ui.tests.rcp/plugin.xml
deleted file mode 100644
index 4bd58f1..0000000
--- a/tests/org.eclipse.ui.tests.rcp/plugin.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-     <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            name="Empty Perspective"
-            class="org.eclipse.ui.tests.rcp.util.EmptyPerspective"
-            id="org.eclipse.ui.tests.rcp.util.EmptyPerspective">
-      </perspective>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            name="RCP Test Views"
-            id="org.eclipse.ui.tests.rcp"/>
-      <view
-            class="org.eclipse.ui.tests.rcp.util.EmptyView"
-            icon="icons/sample.gif"
-            category="org.eclipse.ui.tests.rcp"
-            name="EmptyView"
-            id="org.eclipse.ui.tests.rcp.util.EmptyView"/>
-   </extension>
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests.rcp/test.xml b/tests/org.eclipse.ui.tests.rcp/test.xml
deleted file mode 100644
index 2a9ae39..0000000
--- a/tests/org.eclipse.ui.tests.rcp/test.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0"?>
-
-<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 plugin-name, and library-file -->
-  <property name="plugin-name" value="org.eclipse.ui.tests.rcp"/>
-  <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="rcp-folder" 
-              value="${eclipse-home}/ui_rcp_folder"/>
-    <delete dir="${rcp-folder}" quiet="true"/>
-    <ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${rcp-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname" 
-                value="org.eclipse.ui.tests.rcp.RcpTestSuite"/>
-    </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>
-
-  <!-- This target runs the performance test suites. -->
-  <target name="performance" depends="init,performance-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>
-
-  <target name="performance-suite">
-  	<property name="performance-workspace" value="${eclipse-home}/performance-workspace-platform-rcp"/>
-    <delete dir="${performance-workspace}" quiet="true"/>
-  	<ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${performance-workspace}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname" value="org.eclipse.ui.tests.rcp.performance.RCPPerformanceTestSuite"/>
-    </ant>
-  </target>
-
-</project>
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/.classpath b/tests/org.eclipse.ui.tests.views.properties.tabbed/.classpath
deleted file mode 100644
index c2ce266..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/CDC-1.0%Foundation-1.0"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/.cvsignore b/tests/org.eclipse.ui.tests.views.properties.tabbed/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/.project b/tests/org.eclipse.ui.tests.views.properties.tabbed/.project
deleted file mode 100644
index d92ccf3..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.tests.views.properties.tabbed</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.ui.tests.views.properties.tabbed/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 9f0559d..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,70 +0,0 @@
-#Mon Feb 13 14:25:08 EST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=disabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.deprecation=ignore
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=private
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.ui.tests.views.properties.tabbed/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 678d30c..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Tue Sep 12 08:59:52 EDT 2006
-eclipse.preferences.version=1
-internal.default.compliance=user
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.4\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template></templates>
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/.settings/org.eclipse.pde.prefs b/tests/org.eclipse.ui.tests.views.properties.tabbed/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 57ad3a2..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,15 +0,0 @@
-#Mon Feb 13 14:25:08 EST 2006
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.illegal-att-value=0
-compilers.p.no-required-att=1
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/META-INF/MANIFEST.MF b/tests/org.eclipse.ui.tests.views.properties.tabbed/META-INF/MANIFEST.MF
deleted file mode 100644
index 5201f76..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Plugin.name
-Bundle-SymbolicName: org.eclipse.ui.tests.views.properties.tabbed;singleton:=true
-Bundle-Version: 3.5.0.qualifier
-Bundle-Activator: org.eclipse.ui.tests.views.properties.tabbed.Activator
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.junit,
- org.eclipse.ui.ide,
- org.eclipse.ui.views.properties.tabbed,
- org.eclipse.jface.text
-Bundle-Vendor: %Plugin.providerName
-Bundle-ClassPath: uitptests.jar
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: CDC-1.0/Foundation-1.0,
- J2SE-1.3
-
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/Tabbed Properties View-All Tests.launch b/tests/org.eclipse.ui.tests.views.properties.tabbed/Tabbed Properties View-All Tests.launch
deleted file mode 100644
index 70e6664..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/Tabbed Properties View-All Tests.launch
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
-<booleanAttribute key="askclear" value="false"/>
-<booleanAttribute key="automaticAdd" value="true"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="checked" value="[NONE]"/>
-<booleanAttribute key="clearConfig" value="true"/>
-<booleanAttribute key="clearws" value="true"/>
-<booleanAttribute key="clearwslog" value="false"/>
-<booleanAttribute key="com.mountainminds.eclemma.core.INPLACE_INSTRUMENTATION" value="true"/>
-<listAttribute key="com.mountainminds.eclemma.core.INSTRUMENTATION_PATHS">
-<listEntry value="/org.eclipse.ui.views.properties.tabbed/bin"/>
-</listAttribute>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
-<booleanAttribute key="default" value="true"/>
-<booleanAttribute key="includeOptional" value="true"/>
-<stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/AllTests.java"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.ui.tests.views.properties.tabbed.AllTests"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.ui.tests.views.properties.tabbed"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<stringAttribute key="product" value="org.eclipse.sdk.ide"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="templateConfig" value=""/>
-<booleanAttribute key="tracing" value="false"/>
-<booleanAttribute key="useDefaultConfig" value="true"/>
-<booleanAttribute key="useDefaultConfigArea" value="false"/>
-<booleanAttribute key="useProduct" value="true"/>
-</launchConfiguration>
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/about.html b/tests/org.eclipse.ui.tests.views.properties.tabbed/about.html
deleted file mode 100644
index 4602330..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/build.properties b/tests/org.eclipse.ui.tests.views.properties.tabbed/build.properties
deleted file mode 100644
index 8f2c68b..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/build.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-bin.includes = plugin.xml,\
-               icons/,\
-               META-INF/,\
-               about.html,\
-               test.xml,\
-               uitptests.jar,\
-               plugin.properties
-
-src.includes = about.html
-jars.compile.order = uitptests.jar
-source.uitptests.jar = src/
-output.uitptests.jar = bin/
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/black_triangle.gif b/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/black_triangle.gif
deleted file mode 100644
index 7f4c34b..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/black_triangle.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/blue_circle.gif b/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/blue_circle.gif
deleted file mode 100644
index ab2ce37..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/blue_circle.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/blue_square.gif b/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/blue_square.gif
deleted file mode 100644
index daae4c9..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/blue_square.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/blue_triangle.gif b/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/blue_triangle.gif
deleted file mode 100644
index f746d78..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/blue_triangle.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/green_circle.gif b/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/green_circle.gif
deleted file mode 100644
index 201b66b..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/green_circle.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/green_square.gif b/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/green_square.gif
deleted file mode 100644
index b950282..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/green_square.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/green_triangle.gif b/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/green_triangle.gif
deleted file mode 100644
index 620ddfb..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/green_triangle.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/red_circle.gif b/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/red_circle.gif
deleted file mode 100644
index b648ff6..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/red_circle.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/red_square.gif b/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/red_square.gif
deleted file mode 100644
index 56212ab..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/red_square.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/red_star.gif b/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/red_star.gif
deleted file mode 100644
index bab9824..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/red_star.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/red_triangle.gif b/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/red_triangle.gif
deleted file mode 100644
index f1c3268..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/red_triangle.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/sample.gif b/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/sample.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/icons/sample.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/plugin.properties b/tests/org.eclipse.ui.tests.views.properties.tabbed/plugin.properties
deleted file mode 100644
index fe51e2a..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/plugin.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2006, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Plugin.name = Tabbed Properties View Tests
-Plugin.providerName = Eclipse.org
-
-Views.category.name = Tabbed Properties View
-Views.example.name = Tabbed Properties Tests View
-Views.dynamic.name = Tabbed Properties Dynamic Tests View
-Views.text.name = Tabbed Properties Text Tests View
-Views.override.name = Tabbed Properties Override Tests View
-Views.example.perspective = Tabbed Properties View Tests Perspective
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/plugin.xml b/tests/org.eclipse.ui.tests.views.properties.tabbed/plugin.xml
deleted file mode 100644
index 5e6a97e..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/plugin.xml
+++ /dev/null
@@ -1,382 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            name="%Views.category.name"
-            id="org.eclipse.ui.views.properties.tabbed">
-      </category>
-      <view
-            name="%Views.example.name"
-            category="org.eclipse.ui.views.properties.tabbed"
-            icon="icons/sample.gif"
-            class="org.eclipse.ui.tests.views.properties.tabbed.views.TestsView"
-            id="org.eclipse.ui.tests.views.properties.tabbed.views.TestsView">
-      </view>
-      <view
-            name="%Views.dynamic.name"
-            icon="icons/sample.gif"
-            category="org.eclipse.ui.views.properties.tabbed"
-            class="org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsView"
-            id="org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsView">
-      </view>
-      <view
-            name="%Views.text.name"
-            icon="icons/sample.gif"
-            category="org.eclipse.ui.views.properties.tabbed"
-            class="org.eclipse.ui.tests.views.properties.tabbed.text.TextTestsView"
-            id="org.eclipse.ui.tests.views.properties.tabbed.text.TextTestsView">
-      </view>
-      <view
-            name="%Views.override.name"
-            icon="icons/sample.gif"
-            category="org.eclipse.ui.views.properties.tabbed"
-            class="org.eclipse.ui.tests.views.properties.tabbed.override.OverrideTestsView"
-            id="org.eclipse.ui.tests.views.properties.tabbed.override.OverrideTestsView">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-      <propertyContributor
-            contributorId="org.eclipse.ui.tests.views.properties.tabbed.views.TestsView"
-            labelProvider="org.eclipse.ui.tests.views.properties.tabbed.views.LabelProvider"
-            typeMapper="org.eclipse.ui.tests.views.properties.tabbed.views.TypeMapper">
-         <propertyCategory category="first">
-         </propertyCategory>
-         <propertyCategory category="second">
-         </propertyCategory>
-      </propertyContributor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
-      <propertyTabs contributorId="org.eclipse.ui.tests.views.properties.tabbed.views.TestsView">
-         <propertyTab
-               category="first"
-               id="propertyTab1"
-               label="Name"/>
-         <propertyTab
-               afterTab="propertyTab1"
-               category="first"
-               id="propertyTab2"
-               label="Project"/>
-         <propertyTab
-               afterTab="propertyTab2"
-               category="first"
-               id="propertyTab3"
-               label="Folder"/>
-         <propertyTab
-               afterTab="propertyTab3"
-               category="first"
-               id="propertyTab4"
-               label="File"/>
-         <propertyTab
-               afterTab="propertyTab4"
-               category="first"
-               id="propertyTab5"
-               label="Information"/>
-         <propertyTab
-               afterTab="propertyTab5"
-               category="first"
-               id="propertyTab6"
-               label="Warning"/>
-         <propertyTab
-               afterTab="propertyTab6"
-               category="first"
-               id="propertyTab7"
-               label="Error"/>
-         <propertyTab
-               category="second"
-               id="propertyTab8"
-               indented="true"
-               label="Message"/>
-         <propertyTab
-               category="second"
-               image="icons/sample.gif"
-               id="propertyTab9"
-               label="Resource"/>
-         <propertyTab
-               category="unknown_bugzilla_152473"
-               image="icons/sample.gif"
-               id="propertyTab9"
-               label="Unknown"/>
-      </propertyTabs>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertySections">
-      <propertySections contributorId="org.eclipse.ui.tests.views.properties.tabbed.views.TestsView">
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.sections.NameSection"
-               enablesFor="1"
-               id="propertySection1"
-               tab="propertyTab1">
-            <input type="org.eclipse.ui.tests.views.properties.tabbed.model.Element"/>
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.sections.LabelSection"
-               id="propertySection2"
-               tab="propertyTab2">
-            <input type="org.eclipse.ui.tests.views.properties.tabbed.model.Project"/>
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.sections.LabelSection"
-               id="propertySection3"
-               tab="propertyTab3">
-            <input type="org.eclipse.ui.tests.views.properties.tabbed.model.Folder"/>
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.sections.LabelSection"
-               id="propertySection4"
-               tab="propertyTab4">
-            <input type="org.eclipse.ui.tests.views.properties.tabbed.model.File"/>
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.sections.LabelSection"
-               id="propertySection5"
-               tab="propertyTab5">
-            <input type="org.eclipse.ui.tests.views.properties.tabbed.model.Information"/>
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.sections.LabelSection"
-               id="propertySection6"
-               tab="propertyTab6">
-            <input type="org.eclipse.ui.tests.views.properties.tabbed.model.Warning"/>
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.sections.LabelSection"
-               id="propertySection7"
-               tab="propertyTab7">
-            <input type="org.eclipse.ui.tests.views.properties.tabbed.model.Error"/>
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.sections.MessageSection"
-               id="propertySection8"
-               tab="propertyTab8">
-            <input type="org.eclipse.ui.tests.views.properties.tabbed.model.Error"/>
-            <input type="org.eclipse.ui.tests.views.properties.tabbed.model.Warning"/>
-            <input type="org.eclipse.ui.tests.views.properties.tabbed.model.Information"/>
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.sections.ResourceSection"
-               id="propertySection9"
-               tab="propertyTab9">
-            <input type="org.eclipse.ui.tests.views.properties.tabbed.model.File"/>
-            <input type="org.eclipse.ui.tests.views.properties.tabbed.model.Folder"/>
-            <input type="org.eclipse.ui.tests.views.properties.tabbed.model.Project"/>
-         </propertySection>
-         <propertySection
-               afterSection="propertySection5"
-               class="org.eclipse.ui.tests.views.properties.tabbed.sections.InformationTwoSection"
-               filter="org.eclipse.ui.tests.views.properties.tabbed.views.InformationTwoFilter"
-               id="propertySection10"
-               tab="propertyTab1">
-         </propertySection>
-      </propertySections>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            class="org.eclipse.ui.tests.views.properties.tabbed.views.TestsPerspective"
-            icon="icons/sample.gif"
-            id="org.eclipse.ui.tests.views.properties.tabbed.views.TestsPerspective"
-            name="%Views.example.perspective">
-      </perspective>
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-      <propertyContributor
-            contributorId="org.eclipse.ui.tests.views.properties.tabbed.static"
-            labelProvider="org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsTitleBarLabelProvider"
-            typeMapper="org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsTypeMapper">
-         <propertyCategory
-               category="default">
-         </propertyCategory>
-         <propertyCategory
-               category="advanced">
-         </propertyCategory>
-      </propertyContributor>
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
-      <propertyTabs contributorId="org.eclipse.ui.tests.views.properties.tabbed.static">
-         <propertyTab
-               category="default"
-               id="ElementTab"
-               label="Element"/>
-         <propertyTab
-               afterTab="ElementTab"
-               category="default"
-               id="ColorTab"
-               label="Color"/>
-         <propertyTab
-               afterTab="ColorTab"
-               category="default"
-               id="ShapeTab"
-               label="Shape"/>
-         <propertyTab
-               category="advanced"
-               id="AdvancedTab"
-               label="Advanced">
-         </propertyTab>
-      </propertyTabs>
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertySections">
-      <propertySections
-            contributorId="org.eclipse.ui.tests.views.properties.tabbed.static">
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsElementSection"
-               id="ElementSection"
-               tab="ElementTab">
-            <input
-                  type="org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsElement">
-            </input>
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsRedSection"
-               filter="org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters.DynamicTestsRedSectionFilter"
-               id="RedSection"
-               tab="ColorTab">
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsGreenSection"
-               filter="org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters.DynamicTestsGreenSectionFilter"
-               id="GreenSection"
-               tab="ColorTab">
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.views.properties.tabbed.AdvancedPropertySection"
-               enablesFor="1"
-               id="AdvancedSection"
-               tab="AdvancedTab">
-            <input type="org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsElement"/>
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsBlueSection"
-               filter="org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters.DynamicTestsBlueSectionFilter"
-               id="BlueSection"
-               tab="ColorTab">
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsSquareSection"
-               filter="org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters.DynamicTestsSquareSectionFilter"
-               id="SquareSection"
-               tab="ShapeTab">
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsTriangleSection"
-               filter="org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters.DynamicTestsTriangleSectionFilter"
-               id="TriangleSection"
-               tab="ShapeTab">
-         </propertySection>
-         <propertySection
-               class="org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsCircleSection"
-               filter="org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters.DynamicTestsCircleSectionFilter"
-               id="CircleSection"
-               tab="ShapeTab">
-         </propertySection>
-      </propertySections>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-      <propertyContributor
-            contributorId="org.eclipse.ui.tests.views.properties.tabbed.dynamic.section"
-            labelProvider="org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsTitleBarLabelProvider"
-            sectionDescriptorProvider="org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors.DynamicTestsSectionDescriptorProvider"
-            typeMapper="org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsTypeMapper">
-         <propertyCategory
-               category="default">
-         </propertyCategory>
-         <propertyCategory
-               category="advanced">
-         </propertyCategory>
-      </propertyContributor>
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
-      <propertyTabs contributorId="org.eclipse.ui.tests.views.properties.tabbed.dynamic.section">
-         <propertyTab
-               category="default"
-               id="ElementTab"
-               label="Element"/>
-         <propertyTab
-               afterTab="ElementTab"
-               category="default"
-               id="ColorTab"
-               label="Color"/>
-         <propertyTab
-               afterTab="ColorTab"
-               category="default"
-               id="ShapeTab"
-               label="Shape"/>
-         <propertyTab
-               category="advanced"
-               id="AdvancedTab"
-               label="Advanced">
-         </propertyTab>
-         <propertyTab
-               afterTab="ColorTab"
-               category="default"
-               id="StarTab"
-               indented="true"
-               label="Star">
-         </propertyTab>
-      </propertyTabs>
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-      <propertyContributor
-            contributorId="org.eclipse.ui.tests.views.properties.tabbed.dynamic.tab"
-            labelProvider="org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsTitleBarLabelProvider"
-            tabDescriptorProvider="org.eclipse.ui.tests.views.properties.tabbed.dynamic.tab.descriptors.DynamicTestsTabDescriptorProvider"
-            typeMapper="org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsTypeMapper">
-         <propertyCategory
-               category="default">
-         </propertyCategory>
-         <propertyCategory
-               category="advanced">
-         </propertyCategory>
-      </propertyContributor>
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-      <propertyContributor
-            contributorId="org.eclipse.ui.tests.views.properties.tabbed.text"
-            labelProvider="org.eclipse.ui.tests.views.properties.tabbed.text.TextTestsLabelProvider"
-            tabDescriptorProvider="org.eclipse.ui.tests.views.properties.tabbed.text.TextTestsTabDescriptorProvider">
-         <propertyCategory
-               category="default">
-         </propertyCategory>
-      </propertyContributor>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-      <propertyContributor
-            contributorId="org.eclipse.ui.tests.views.properties.tabbed.override"
-            sectionDescriptorProvider="org.eclipse.ui.tests.views.properties.tabbed.override.tablist.OverrideTestsSectionDescriptorProvider"
-            overridableTabListContentProvider="true">
-          <propertyCategory
-                category="org.eclipse.ui.tests.views.properties.tabbed.override">
-          </propertyCategory>
-      </propertyContributor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
-      <propertyTabs
-            contributorId="org.eclipse.ui.tests.views.properties.tabbed.override">
-         <propertyTab
-               label="Override"
-               category="org.eclipse.ui.tests.views.properties.tabbed.override"
-               id="org.eclipse.ui.tests.views.properties.tabbed.override">
-         </propertyTab>
-      </propertyTabs>
-   </extension>
-</plugin>
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/Activator.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/Activator.java
deleted file mode 100644
index 8cfa680..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/Activator.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class Activator
-    extends AbstractUIPlugin {
-
-    // The shared instance.
-    private static Activator plugin;
-
-    /**
-     * The constructor.
-     */
-    public Activator() {
-        plugin = this;
-    }
-
-    /**
-     * This method is called upon plug-in activation
-     */
-    public void start(BundleContext context)
-        throws Exception {
-        super.start(context);
-    }
-
-    /**
-     * This method is called when the plug-in is stopped
-     */
-    public void stop(BundleContext context)
-        throws Exception {
-        super.stop(context);
-        plugin = null;
-    }
-
-    /**
-     * Returns the shared instance.
-     */
-    public static Activator getDefault() {
-        return plugin;
-    }
-
-    /**
-     * Returns an image descriptor for the image file at the given plug-in
-     * relative path.
-     * 
-     * @param path
-     *            the path
-     * @return the image descriptor
-     */
-    public static ImageDescriptor getImageDescriptor(String path) {
-        return AbstractUIPlugin.imageDescriptorFromPlugin(
-            "org.eclipse.ui.tests.views.properties.tabbed", path); //$NON-NLS-1$
-    }
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/AllTests.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/AllTests.java
deleted file mode 100644
index f796d69..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/AllTests.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-import junit.textui.TestRunner;
-
-public class AllTests
-    extends TestCase {
-
-    public static void main(String[] args) {
-        TestRunner.run(suite());
-    }
-
-    public static Test suite() {
-        TestSuite suite = new TestSuite();
-        suite.addTestSuite(TabbedPropertySheetPageTest.class);
-        suite.addTestSuite(TabbedPropertySheetPageDynamicTest.class);
-        suite.addTestSuite(TabbedPropertySheetPageTextTest.class);
-        suite.addTestSuite(TabbedPropertySheetPageOverrideTest.class);
-        return suite;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageDynamicTest.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageDynamicTest.java
deleted file mode 100644
index c73b4b7..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageDynamicTest.java
+++ /dev/null
@@ -1,397 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsColor;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsElement;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsShape;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsTreeNode;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsView;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsViewContentProvider;
-import org.eclipse.ui.tests.views.properties.tabbed.views.TestsPerspective;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptor;
-
-/**
- * Tests for the dynamic tab and section support.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class TabbedPropertySheetPageDynamicTest extends TestCase {
-
-	private DynamicTestsView dynamicTestsView;
-
-	private DynamicTestsTreeNode[] treeNodes;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		/**
-		 * Close the existing perspectives.
-		 */
-		IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		assertNotNull(workbenchWindow);
-		IWorkbenchPage workbenchPage = workbenchWindow.getActivePage();
-		assertNotNull(workbenchPage);
-		workbenchPage.closeAllPerspectives(false, false);
-
-		/**
-		 * Open the tests perspective.
-		 */
-		PlatformUI.getWorkbench().showPerspective(
-				TestsPerspective.TESTS_PERSPECTIVE_ID, workbenchWindow);
-
-		/**
-		 * Open the dynamic tests view.
-		 */
-		IViewPart view = workbenchPage
-				.showView(DynamicTestsView.DYNAMIC_TESTS_VIEW_ID);
-		assertNotNull(view);
-		assertTrue(view instanceof DynamicTestsView);
-		dynamicTestsView = (DynamicTestsView) view;
-
-		/**
-		 * get the list of tree nodes from the view.
-		 */
-		IContentProvider contentProvider = dynamicTestsView.getViewer()
-				.getContentProvider();
-		assertTrue(contentProvider instanceof DynamicTestsViewContentProvider);
-		DynamicTestsViewContentProvider viewContentProvider = (DynamicTestsViewContentProvider) contentProvider;
-		treeNodes = (DynamicTestsTreeNode[]) viewContentProvider
-				.getInvisibleRoot().getChildren();
-		assertEquals(treeNodes.length, 11);
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-
-		/**
-		 * Bug 175070: Make sure the views have finished painting.
-		 */
-		while (Display.getCurrent().readAndDispatch()) {
-			//
-		}
-
-		/**
-		 * Deselect everything in the Tests view.
-		 */
-		setSelection(new DynamicTestsTreeNode[] {});
-	}
-
-	/**
-	 * Set the selection in the view to cause the properties view to change.
-	 * 
-	 * @param selectedNodes
-	 *            nodes to select in the view.
-	 */
-	private void setSelection(DynamicTestsTreeNode[] selectedNodes) {
-		StructuredSelection selection = new StructuredSelection(selectedNodes);
-		dynamicTestsView.getViewer().setSelection(selection, true);
-	}
-
-	/**
-	 * When the three blue nodes are selected, two tabs display.
-	 */
-	public void test_BlueStaticContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_STATIC);
-		select_all_blue();
-	}
-
-	/**
-	 * When the three blue nodes are selected, two tabs display.
-	 */
-	public void test_BlueDynamicTabContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_DYNAMIC_TABS);
-		select_all_blue();
-	}
-
-	/**
-	 * When the three blue nodes are selected, two tabs display.
-	 */
-	public void test_BlueDynamicSectionContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_DYNAMIC_SECTIONS);
-		select_all_blue();
-	}
-
-	/**
-	 * When the three blue nodes are selected, two tabs display.
-	 */
-	public void select_all_blue() {
-		List blueList = new ArrayList();
-		for (int i = 0; i < treeNodes.length; i++) {
-			if (DynamicTestsColor.BLUE.equals(treeNodes[i]
-					.getDynamicTestsElement().getPropertyValue(
-							DynamicTestsElement.ID_COLOR))) {
-				blueList.add(treeNodes[i]);
-			}
-		}
-		DynamicTestsTreeNode[] selectNodes = (DynamicTestsTreeNode[]) blueList
-				.toArray(new DynamicTestsTreeNode[blueList.size()]);
-		assertEquals(blueList.size(), 3);
-
-		setSelection(selectNodes);
-
-        ITabDescriptor[] tabDescriptors = dynamicTestsView.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * First tab is Element
-		 */
-		assertEquals("Element", tabDescriptors[0].getLabel());//$NON-NLS-1$
-		/**
-		 * Second tab is Color
-		 */
-		assertEquals("Color", tabDescriptors[1].getLabel());//$NON-NLS-1$
-		/**
-		 * No other tab
-		 */
-        assertEquals(2, tabDescriptors.length);
-	}
-
-	/**
-	 * When the three triangle nodes are selected, two tabs display.
-	 */
-	public void test_TriangleStaticContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_STATIC);
-		select_all_triangle();
-	}
-
-	/**
-	 * When the three triangle nodes are selected, two tabs display.
-	 */
-	public void test_TriangleDynamicTabContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_DYNAMIC_TABS);
-		select_all_triangle();
-	}
-
-	/**
-	 * When the three triangle nodes are selected, two tabs display.
-	 */
-	public void test_TriangleDynamicSectionContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_DYNAMIC_SECTIONS);
-		select_all_triangle();
-	}
-
-	/**
-	 * When the three triangle nodes are selected, two tabs display.
-	 */
-	public void select_all_triangle() {
-		List triangleList = new ArrayList();
-		for (int i = 0; i < treeNodes.length; i++) {
-			if (DynamicTestsShape.TRIANGLE.equals(treeNodes[i]
-					.getDynamicTestsElement().getPropertyValue(
-							DynamicTestsElement.ID_SHAPE))) {
-				triangleList.add(treeNodes[i]);
-			}
-		}
-		DynamicTestsTreeNode[] selectNodes = (DynamicTestsTreeNode[]) triangleList
-				.toArray(new DynamicTestsTreeNode[triangleList.size()]);
-		assertEquals(triangleList.size(), 4);
-
-		setSelection(selectNodes);
-
-        ITabDescriptor[] tabDescriptors = dynamicTestsView.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * First tab is Element
-		 */
-		assertEquals("Element", tabDescriptors[0].getLabel());//$NON-NLS-1$
-		/**
-		 * Second tab is Shape
-		 */
-		assertEquals("Shape", tabDescriptors[1].getLabel());//$NON-NLS-1$
-		/**
-		 * No other tab
-		 */
-        assertEquals(2, tabDescriptors.length);
-	}
-
-	/**
-	 * When the black triangle is selected, three tabs display.
-	 */
-	public void test_BlackTriangleStaticContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_STATIC);
-		select_blackTriangle();
-        ITabDescriptor[] tabDescriptors = dynamicTestsView.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * Only three tabs displayed for static contribution.
-		 */
-        assertEquals(3, tabDescriptors.length);
-	}
-
-	/**
-	 * When the black triangle is selected, four tabs display.
-	 */
-	public void test_BlackTriangleDynamicTabContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_DYNAMIC_TABS);
-		select_blackTriangle();
-        ITabDescriptor[] tabDescriptors = dynamicTestsView.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * Fourth tab is Black
-		 */
-		assertEquals("Black", tabDescriptors[3].getLabel());//$NON-NLS-1$
-		/**
-		 * No other tab
-		 */
-        assertEquals(4, tabDescriptors.length);
-	}
-
-	/**
-	 * When the black triangle is selected, three tabs display.
-	 */
-	public void test_BlackTriangleDynamicSectionContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_DYNAMIC_SECTIONS);
-		select_blackTriangle();
-        ITabDescriptor[] tabDescriptors = dynamicTestsView.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * Only three tabs displayed for dynamic section contribution.
-		 */
-        assertEquals(3, tabDescriptors.length);
-	}
-
-	/**
-	 * When the black triangle is selected, three tabs display.
-	 */
-	public void select_blackTriangle() {
-		DynamicTestsTreeNode blackTriangleNode = null;
-		for (int i = 0; i < treeNodes.length; i++) {
-			if (DynamicTestsColor.BLACK.equals(treeNodes[i]
-					.getDynamicTestsElement().getPropertyValue(
-							DynamicTestsElement.ID_COLOR))) {
-				blackTriangleNode = treeNodes[i];
-				break;
-			}
-		}
-		assertNotNull(blackTriangleNode);
-
-		setSelection(new DynamicTestsTreeNode[] { blackTriangleNode });
-
-        ITabDescriptor[] tabDescriptors = dynamicTestsView.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * First tab is Element
-		 */
-		assertEquals("Element", tabDescriptors[0].getLabel());//$NON-NLS-1$
-		/**
-		 * Second tab is Shape
-		 */
-		assertEquals("Shape", tabDescriptors[1].getLabel());//$NON-NLS-1$
-		/**
-		 * Third tab is Advanced
-		 */
-		assertEquals("Advanced", tabDescriptors[2].getLabel());//$NON-NLS-1$
-	}
-
-	/**
-	 * When the red star is selected, three tabs display.
-	 */
-	public void test_RedStarStaticContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_STATIC);
-		select_RedStar();
-        ITabDescriptor[] tabDescriptors = dynamicTestsView.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * Third tab is Advanced
-		 */
-		assertEquals("Advanced", tabDescriptors[2].getLabel());//$NON-NLS-1$
-		/**
-		 * No other tab
-		 */
-        assertEquals(3, tabDescriptors.length);
-	}
-
-	/**
-	 * When the red star is selected, four tabs display.
-	 */
-	public void test_RedStarDynamicTabContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_DYNAMIC_TABS);
-		select_RedStar();
-        ITabDescriptor[] tabDescriptors = dynamicTestsView.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * Third tab is Advanced
-		 */
-		assertEquals("Advanced", tabDescriptors[2].getLabel());//$NON-NLS-1$
-		/**
-		 * No other tab
-		 */
-        assertEquals(3, tabDescriptors.length);
-	}
-
-	/**
-	 * When the red star is selected, three tabs display.
-	 */
-	public void test_RedStarDynamicSectionContribution() {
-		dynamicTestsView
-				.setContributorId(DynamicTestsView.DYNAMIC_TESTS_VIEW_DYNAMIC_SECTIONS);
-		select_RedStar();
-        ITabDescriptor[] tabDescriptors = dynamicTestsView.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * Third tab is Star
-		 */
-		assertEquals("Star", tabDescriptors[2].getLabel());//$NON-NLS-1$
-		/**
-		 * Fourth tab is Advanced
-		 */
-		assertEquals("Advanced", tabDescriptors[3].getLabel());//$NON-NLS-1$
-		/**
-		 * No other tab
-		 */
-        assertEquals(4, tabDescriptors.length);
-	}
-
-	/**
-	 * When the red star is selected, four tabs display.
-	 */
-	public void select_RedStar() {
-		DynamicTestsTreeNode redStarNode = null;
-		for (int i = 0; i < treeNodes.length; i++) {
-			if (DynamicTestsShape.STAR.equals(treeNodes[i]
-					.getDynamicTestsElement().getPropertyValue(
-							DynamicTestsElement.ID_SHAPE))) {
-				redStarNode = treeNodes[i];
-				break;
-			}
-		}
-		assertNotNull(redStarNode);
-
-		setSelection(new DynamicTestsTreeNode[] { redStarNode });
-
-        ITabDescriptor[] tabDescriptors = dynamicTestsView.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * First tab is Element
-		 */
-		assertEquals("Element", tabDescriptors[0].getLabel());//$NON-NLS-1$
-		/**
-		 * Second tab is Color
-		 */
-		assertEquals("Color", tabDescriptors[1].getLabel());//$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageOverrideTest.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageOverrideTest.java
deleted file mode 100644
index 4468bd8..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageOverrideTest.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed;
-
-import junit.framework.TestCase;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Error;
-import org.eclipse.ui.tests.views.properties.tabbed.model.File;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Folder;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Information;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Warning;
-import org.eclipse.ui.tests.views.properties.tabbed.override.OverrideTestsView;
-import org.eclipse.ui.tests.views.properties.tabbed.views.TestsPerspective;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptor;
-
-/**
- * Tests for the override tabs support.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class TabbedPropertySheetPageOverrideTest extends TestCase {
-
-	private OverrideTestsView overrideTestsView;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		/**
-		 * Close the existing perspectives.
-		 */
-		IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		assertNotNull(workbenchWindow);
-		IWorkbenchPage workbenchPage = workbenchWindow.getActivePage();
-		assertNotNull(workbenchPage);
-		workbenchPage.closeAllPerspectives(false, false);
-
-		/**
-		 * Open the tests perspective.
-		 */
-		PlatformUI.getWorkbench().showPerspective(
-				TestsPerspective.TESTS_PERSPECTIVE_ID, workbenchWindow);
-
-		/**
-		 * Open the dynamic tests view.
-		 */
-		IViewPart view = workbenchPage
-				.showView(OverrideTestsView.OVERRIDE_TESTS_VIEW_ID);
-		assertNotNull(view);
-		assertTrue(view instanceof OverrideTestsView);
-		overrideTestsView = (OverrideTestsView) view;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		super.tearDown();
-
-		/**
-		 * Bug 175070: Make sure the views have finished painting.
-		 */
-		while (Display.getCurrent().readAndDispatch()) {
-			//
-		}
-
-	}
-
-	/**
-	 * When nothing is selected, there is one tab called empty.
-	 * <p>
-	 * Normally an empty structured selection shows "Properties are not
-	 * available". The override tests provide a custom selection provider that
-	 * allows for the display of a tab and section when the selection is empty.
-	 */
-	public void test_tabForEmpty() {
-		/**
-		 * select nothing
-		 */
-		overrideTestsView.setSelection(null);
-
-		ITabDescriptor[] tabDescriptors = overrideTestsView
-				.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * First tab is "Empty Item"
-		 */
-		assertEquals("Empty Item", tabDescriptors[0].getLabel());//$NON-NLS-1$
-		/**
-		 * No second tab
-		 */
-		assertEquals(1, tabDescriptors.length);
-	}
-
-	/**
-	 * Tests for the dynamic tabs and sections (items) when the Error element is
-	 * selected.
-	 */
-	public void test_tabForError() {
-		/**
-		 * select "Error"
-		 */
-		overrideTestsView.setSelection(Error.class);
-
-		ITabDescriptor[] tabDescriptors = overrideTestsView
-				.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * First tab is "Information".
-		 */
-		assertEquals("Information", tabDescriptors[0].getLabel());//$NON-NLS-1$
-
-		/**
-		 * Second tab is "Warning".
-		 */
-		assertEquals("Warning", tabDescriptors[1].getLabel());//$NON-NLS-1$
-
-		/**
-		 * Third tab is "Error" and is selected.
-		 */
-		assertEquals("Error", tabDescriptors[2].getLabel());//$NON-NLS-1$
-		assertEquals("Error", overrideTestsView.getTabbedPropertySheetPage()
-				.getSelectedTab().getLabel());
-
-		/**
-		 * No fourth tab
-		 */
-		assertEquals(3, tabDescriptors.length);
-
-	}
-
-	/**
-	 * Tests for the dynamic tabs and sections (items) when the File element is
-	 * selected.
-	 */
-	public void test_tabForFile() {
-		/**
-		 * select "File"
-		 */
-		overrideTestsView.setSelection(File.class);
-
-		ITabDescriptor[] tabDescriptors = overrideTestsView
-				.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * First tab is "File" and is selected.
-		 */
-		assertEquals("File", tabDescriptors[0].getLabel());//$NON-NLS-1$
-		assertEquals("File", overrideTestsView.getTabbedPropertySheetPage()
-				.getSelectedTab().getLabel());
-
-		/**
-		 * Second tab is "Folder" and is selected.
-		 */
-		assertEquals("Folder", tabDescriptors[1].getLabel());//$NON-NLS-1$
-
-		/**
-		 * No third tab
-		 */
-		assertEquals(2, tabDescriptors.length);
-	}
-
-	/**
-	 * Tests for the dynamic tabs and sections (items) when the Folder element
-	 * is selected.
-	 */
-	public void test_tabForFolder() {
-		/**
-		 * select "Folder"
-		 */
-		overrideTestsView.setSelection(Folder.class);
-
-		ITabDescriptor[] tabDescriptors = overrideTestsView
-				.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * First tab is "File".
-		 */
-		assertEquals("File", tabDescriptors[0].getLabel());//$NON-NLS-1$
-
-		/**
-		 * Second tab is "Folder" and is selected.
-		 */
-		assertEquals("Folder", tabDescriptors[1].getLabel());//$NON-NLS-1$
-		assertEquals("Folder", overrideTestsView.getTabbedPropertySheetPage()
-				.getSelectedTab().getLabel());
-
-		/**
-		 * No third tab
-		 */
-		assertEquals(2, tabDescriptors.length);
-	}
-
-	/**
-	 * Tests for the dynamic tabs and sections (items) when the Information
-	 * element is selected.
-	 */
-	public void test_tabForInformation() {
-		/**
-		 * select "Information"
-		 */
-		overrideTestsView.setSelection(Information.class);
-
-		ITabDescriptor[] tabDescriptors = overrideTestsView
-				.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * First tab is "Information" and is selected.
-		 */
-		assertEquals("Information", tabDescriptors[0].getLabel());//$NON-NLS-1$
-		assertEquals("Information", overrideTestsView
-				.getTabbedPropertySheetPage().getSelectedTab().getLabel());
-
-		/**
-		 * Second tab is "Warning".
-		 */
-		assertEquals("Warning", tabDescriptors[1].getLabel());//$NON-NLS-1$
-
-		/**
-		 * Third tab is "Error".
-		 */
-		assertEquals("Error", tabDescriptors[2].getLabel());//$NON-NLS-1$
-
-		/**
-		 * No fourth tab
-		 */
-		assertEquals(3, tabDescriptors.length);
-	}
-
-	/**
-	 * Tests for the dynamic tabs and sections (items) when the Warning element
-	 * is selected.
-	 */
-	public void test_tabForWarning() {
-		/**
-		 * select "Warning"
-		 */
-		overrideTestsView.setSelection(Warning.class);
-
-		ITabDescriptor[] tabDescriptors = overrideTestsView
-				.getTabbedPropertySheetPage().getActiveTabs();
-		/**
-		 * First tab is "Information".
-		 */
-		assertEquals("Information", tabDescriptors[0].getLabel());//$NON-NLS-1$
-
-		/**
-		 * Second tab is "Warning" and is selected.
-		 */
-		assertEquals("Warning", tabDescriptors[1].getLabel());//$NON-NLS-1$
-		assertEquals("Warning", overrideTestsView.getTabbedPropertySheetPage()
-				.getSelectedTab().getLabel());
-
-		/**
-		 * Third tab is "Error".
-		 */
-		assertEquals("Error", tabDescriptors[2].getLabel());//$NON-NLS-1$
-
-		/**
-		 * No fourth tab
-		 */
-		assertEquals(3, tabDescriptors.length);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageTest.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageTest.java
deleted file mode 100644
index 56b8b8e..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageTest.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeNode;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.views.properties.tabbed.sections.InformationTwoSection;
-import org.eclipse.ui.tests.views.properties.tabbed.sections.NameSection;
-import org.eclipse.ui.tests.views.properties.tabbed.views.TestsPerspective;
-import org.eclipse.ui.tests.views.properties.tabbed.views.TestsView;
-import org.eclipse.ui.tests.views.properties.tabbed.views.TestsViewContentProvider;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptor;
-import org.eclipse.ui.views.properties.tabbed.TabContents;
-
-public class TabbedPropertySheetPageTest
-    extends TestCase {
-
-    private TestsView testsView;
-
-    private TreeNode[] treeNodes;
-
-    protected void setUp()
-        throws Exception {
-        super.setUp();
-
-        /**
-         * Close the existing perspectives.
-         */
-        IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench()
-            .getActiveWorkbenchWindow();
-        assertNotNull(workbenchWindow);
-        IWorkbenchPage workbenchPage = workbenchWindow.getActivePage();
-        assertNotNull(workbenchPage);
-        workbenchPage.closeAllPerspectives(false, false);
-
-        /**
-         * Open the tests perspective.
-         */
-        PlatformUI.getWorkbench().showPerspective(
-            TestsPerspective.TESTS_PERSPECTIVE_ID, workbenchWindow);
-
-        /**
-         * Select the Tests view.
-         */
-        IViewPart view = workbenchPage.showView(TestsView.TESTS_VIEW_ID);
-        assertNotNull(view);
-        assertTrue(view instanceof TestsView);
-        testsView = (TestsView) view;
-
-        /**
-         * get the list of tree nodes from the view.
-         */
-        IContentProvider contentProvider = testsView.getViewer()
-            .getContentProvider();
-        assertTrue(contentProvider instanceof TestsViewContentProvider);
-        TestsViewContentProvider viewContentProvider = (TestsViewContentProvider) contentProvider;
-        treeNodes = viewContentProvider.getInvisibleRoot().getChildren();
-        assertEquals(treeNodes.length, 8);
-    }
-
-    protected void tearDown()
-        throws Exception {
-        super.tearDown();
-
-        /**
-		 * Bug 175070: Make sure the views have finished painting.
-         */
-        while (Display.getCurrent().readAndDispatch()) {
-            //
-        }
-
-        /**
-         * Deselect everything in the Tests view.
-         */
-        setSelection(new TreeNode[] {} );
-    }
-
-    /**
-     * Set the selection in the view to cause the properties view to change.
-     * 
-     * @param selectedNodes
-     *            nodes to select in the view.
-     */
-    private void setSelection(TreeNode[] selectedNodes) {
-        StructuredSelection selection = new StructuredSelection(selectedNodes);
-        testsView.getViewer().setSelection(selection, true);
-    }
-
-    /**
-     * When One Information Node is selected, three tabs display. Tests
-     * typeMapper, labelProvider, propertyCategories, afterTab attributes.
-     */
-    public void test_tabDisplay() {
-        /**
-         * select node 0 which is an Information
-         */
-        setSelection(new TreeNode[] {treeNodes[0]});
-        ITabDescriptor[] tabDescriptors = testsView.getTabbedPropertySheetPage().getActiveTabs();
-        
-        /**
-         * First tab is Name
-         */
-        assertEquals("Name", tabDescriptors[0].getLabel());//$NON-NLS-1$
-        /**
-         * Second tab is Information
-         */
-        assertEquals("Information", tabDescriptors[1].getLabel());//$NON-NLS-1$
-        /**
-         * Third tab is Message
-         */
-        assertEquals("Message", tabDescriptors[2].getLabel());//$NON-NLS-1$
-        /**
-         * No fourth tab
-         */
-        assertEquals(3, tabDescriptors.length);
-    }
-
-    /**
-     * When Two Information Node is selected, only two tabs display. Tests
-     * enablesFor attribute.
-     */
-    public void test_enablesForFilter() {
-        /**
-         * select nodes
-         */
-        setSelection(new TreeNode[] {treeNodes[0], treeNodes[1]});
-        ITabDescriptor[] tabDescriptors = testsView.getTabbedPropertySheetPage().getActiveTabs();
-        /**
-         * First tab is Information
-         */
-        assertEquals("Information", tabDescriptors[0].getLabel());//$NON-NLS-1$
-        /**
-         * Second tab is Message
-         */
-        assertEquals("Message", tabDescriptors[1].getLabel());//$NON-NLS-1$
-        /**
-         * No other tab
-         */
-        assertEquals(2, tabDescriptors.length);
-    }
-
-    /**
-     * When Two Information Node is selected, two section displayed on Name tab.
-     * Tests filter, afterSection attribute.
-     */
-    public void test_sectionInformationTwoFilter() {
-        /**
-         * select nodes
-         */
-        setSelection(new TreeNode[] {treeNodes[1]});
-        ITabDescriptor[] tabDescriptors = testsView.getTabbedPropertySheetPage().getActiveTabs();
-        /**
-         * First tab is Information
-         */
-        assertEquals("Name", tabDescriptors[0].getLabel());//$NON-NLS-1$
-        TabContents tabContents = testsView.getTabbedPropertySheetPage().getCurrentTab();
-        /**
-         * the tab has two sections.
-         */
-        ISection[] sections = tabContents.getSections();
-        assertEquals(2, sections.length);
-        assertEquals(NameSection.class, sections[0].getClass());
-        assertEquals(InformationTwoSection.class, sections[1].getClass());
-    }
-
-    /**
-     * When Information, Error and Warning Nodes are selected, only the Message
-     * tab displays. Tests input attribute.
-     */
-    public void test_selectThreeMessageNodes() {
-        /**
-         * select nodes
-         */
-        setSelection(new TreeNode[] {treeNodes[1], treeNodes[2], treeNodes[3],});
-        ITabDescriptor[] tabDescriptors = testsView.getTabbedPropertySheetPage().getActiveTabs();
-        /**
-         * Only tab is Message
-         */
-        assertEquals("Message", tabDescriptors[0].getLabel());//$NON-NLS-1$
-        /**
-         * No other tab
-         */
-        assertEquals(1, tabDescriptors.length);
-    }
-
-    /**
-     * When File, Folder and Project Nodes are selected, only the Resource tab
-     * displays. Tests input attribute.
-     */
-    public void test_selectThreeResourceNodes() {
-        /**
-         * select nodes
-         */
-        setSelection(new TreeNode[] {treeNodes[5], treeNodes[6], treeNodes[7],});
-        ITabDescriptor[] TabDescriptors = testsView.getTabbedPropertySheetPage().getActiveTabs();
-        /**
-         * Only tab is Resource
-         */
-        assertEquals("Resource", TabDescriptors[0].getLabel());//$NON-NLS-1$
-        /**
-         * No other tab
-         */
-        assertEquals(1, TabDescriptors.length);
-    }
-
-    /**
-     * When the view first comes up, there is no properties so the "Properties
-     * are not available." banner is displayed. Tests null selection in a
-     * viewer.
-     */
-    public void test_noPropertiesAvailable() {
-    	TabContents tabContents = testsView.getTabbedPropertySheetPage().getCurrentTab();
-        assertNull(tabContents);
-        ITabDescriptor[] TabDescriptors = testsView.getTabbedPropertySheetPage().getActiveTabs();
-        assertEquals(0, TabDescriptors.length);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageTextTest.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageTextTest.java
deleted file mode 100644
index 898fc92..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/TabbedPropertySheetPageTextTest.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.views.properties.tabbed.text.TextTestsLabelSection;
-import org.eclipse.ui.tests.views.properties.tabbed.text.TextTestsView;
-import org.eclipse.ui.tests.views.properties.tabbed.views.TestsPerspective;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptor;
-import org.eclipse.ui.views.properties.tabbed.TabContents;
-
-/**
- * Tests for the text tests view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class TabbedPropertySheetPageTextTest extends TestCase {
-
-	private TextTestsView textTestsView;
-
-	protected void setUp() throws Exception {
-		super.setUp();
-
-        /**
-         * Close the existing perspectives.
-         */
-        IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench()
-            .getActiveWorkbenchWindow();
-        assertNotNull(workbenchWindow);
-        IWorkbenchPage workbenchPage = workbenchWindow.getActivePage();
-        assertNotNull(workbenchPage);
-        workbenchPage.closeAllPerspectives(false, false);
-
-        /**
-         * Open the tests perspective.
-         */
-        PlatformUI.getWorkbench().showPerspective(
-            TestsPerspective.TESTS_PERSPECTIVE_ID, workbenchWindow);
-
-		/**
-		 * Open the dynamic tests view.
-		 */
-		IViewPart view = workbenchPage
-				.showView(TextTestsView.TEXT_TESTS_VIEW_ID);
-		assertNotNull(view);
-		assertTrue(view instanceof TextTestsView);
-		textTestsView = (TextTestsView) view;
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-
-		/**
-		 * Bug 175070: Make sure the views have finished painting.
-		 */
-		while (Display.getCurrent().readAndDispatch()) {
-			//
-		}
-
-	}
-
-    /**
-     * When text is selected, there is one tab for each selected word.
-     */
-    public void test_tabForSelectedTextDisplay() {
-        IDocument document = textTestsView.getViewer().getDocument();
-        document.set("This is a test");
-        textTestsView.getViewer().setSelectedRange(0, 14);
-        
-        ITabDescriptor[] tabDescriptors = textTestsView.getTabbedPropertySheetPage().getActiveTabs();
-        /**
-         * First tab is "This"
-         */
-        assertEquals("This", tabDescriptors[0].getLabel());//$NON-NLS-1$
-        /**
-         * Second tab is "is"
-         */
-        assertEquals("is", tabDescriptors[1].getLabel());//$NON-NLS-1$
-        /**
-         * Third tab is "a"
-         */
-        assertEquals("a", tabDescriptors[2].getLabel());//$NON-NLS-1$
-        /**
-         * Third tab is "test"
-         */
-        assertEquals("test", tabDescriptors[3].getLabel());//$NON-NLS-1$
-        /**
-         * No fifth tab
-         */
-        assertEquals(4, tabDescriptors.length);
-    }
-
-	/**
-	 * Test changing the selected tab through API (Bug 119085).
-	 */
-	public void test_tabSelectedTab() {
-	    IDocument document = textTestsView.getViewer().getDocument();
-	    document.set("The fifth tab is selected");
-	    textTestsView.getViewer().setSelectedRange(0, 26);
-	    
-	    ITabDescriptor[] tabDescriptors = textTestsView.getTabbedPropertySheetPage().getActiveTabs();
-	    /**
-	     * First tab is "the" and is selected.
-	     */
-	    assertEquals("The", tabDescriptors[0].getLabel());//$NON-NLS-1$
-		assertEquals("The", textTestsView.getTabbedPropertySheetPage()
-				.getSelectedTab().getLabel());
-	    /**
-	     * Fifth tab is "selected"
-	     */
-	    assertEquals("selected", tabDescriptors[4].getLabel());//$NON-NLS-1$
-	    
-	    /** 
-	     * Set the new selected tab.
-	     */
-	    textTestsView.getTabbedPropertySheetPage().setSelectedTab(tabDescriptors[4].getId());
-	    
-	    tabDescriptors = textTestsView.getTabbedPropertySheetPage().getActiveTabs();
-	    /**
-	     * First tab is "the"
-	     */
-	    assertEquals("The", tabDescriptors[0].getLabel());//$NON-NLS-1$
-	    /**
-	     * Fifth tab is "selected" and is selected.
-	     */
-	    assertEquals("selected", tabDescriptors[4].getLabel());//$NON-NLS-1$
-		assertEquals("selected", textTestsView.getTabbedPropertySheetPage()
-				.getSelectedTab().getLabel());
-	}
-
-	/**
-	 * This test makes sure that the list of sections has only one section. The
-	 * TextTestsTabDescriptor returns two sections and one section is always
-	 * filtered (Bug 245690).
-	 */
-	public void test_listOfSections() {
-        IDocument document = textTestsView.getViewer().getDocument();
-        document.set("This is a test");
-        textTestsView.getViewer().setSelectedRange(0, 14);
-
-        /**
-         * each tab has one section.
-         */
-        TabContents tabContents = textTestsView.getTabbedPropertySheetPage().getCurrentTab();
-        ISection[] sections = tabContents.getSections();
-        assertEquals(1, sections.length);
-        assertEquals(TextTestsLabelSection.class, sections[0].getClass());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsBlackSectionFilter.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsBlackSectionFilter.java
deleted file mode 100644
index ca81205..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsBlackSectionFilter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters;
-
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsColor;
-
-/**
- * A section filter for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsBlackSectionFilter extends
-		DynamicTestsElementSectionFilter {
-
-	protected boolean appliesToColor(DynamicTestsColor color) {
-		return DynamicTestsColor.BLACK.equals(color);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsBlueSectionFilter.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsBlueSectionFilter.java
deleted file mode 100644
index 2e3c105..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsBlueSectionFilter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters;
-
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsColor;
-
-/**
- * A section filter for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsBlueSectionFilter extends
-		DynamicTestsElementSectionFilter {
-
-	protected boolean appliesToColor(DynamicTestsColor color) {
-		return DynamicTestsColor.BLUE.equals(color);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsCircleSectionFilter.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsCircleSectionFilter.java
deleted file mode 100644
index 10bdb1a..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsCircleSectionFilter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters;
-
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsShape;
-
-/**
- * A section filter for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsCircleSectionFilter extends
-		DynamicTestsElementSectionFilter {
-
-	protected boolean appliesToShape(DynamicTestsShape shape) {
-		return DynamicTestsShape.CIRCLE.equals(shape);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsElementSectionFilter.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsElementSectionFilter.java
deleted file mode 100644
index a40875b..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsElementSectionFilter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsColor;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsElement;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsShape;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsTreeNode;
-
-/**
- * A section filter for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsElementSectionFilter implements IFilter {
-
-	/**
-	 * Determine if the filter applies to the provided color.
-	 * 
-	 * @param element
-	 *            the element.
-	 * @return true if the filter applies to the provided color.
-	 */
-	protected boolean appliesToColor(DynamicTestsColor color) {
-		Assert.isNotNull(color);
-		return true;
-	}
-
-	/**
-	 * Determine if the filter applies to the provided shape.
-	 * 
-	 * @param element
-	 *            the element.
-	 * @return true if the filter applies to the provided shape.
-	 */
-	protected boolean appliesToShape(DynamicTestsShape shape) {
-		Assert.isNotNull(shape);
-		return true;
-	}
-
-	public boolean select(Object object) {
-		if (object instanceof DynamicTestsTreeNode) {
-			DynamicTestsElement element = ((DynamicTestsTreeNode) object)
-					.getDynamicTestsElement();
-			DynamicTestsColor color = (DynamicTestsColor) element
-					.getPropertyValue(DynamicTestsElement.ID_COLOR);
-			DynamicTestsShape shape = (DynamicTestsShape) element
-					.getPropertyValue(DynamicTestsElement.ID_SHAPE);
-			return (appliesToColor(color) && appliesToShape(shape));
-		}
-		return false;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsGreenSectionFilter.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsGreenSectionFilter.java
deleted file mode 100644
index 4df31a9..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsGreenSectionFilter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters;
-
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsColor;
-
-/**
- * A section filter for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsGreenSectionFilter extends
-		DynamicTestsElementSectionFilter {
-
-	protected boolean appliesToColor(DynamicTestsColor color) {
-		return DynamicTestsColor.GREEN.equals(color);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsRedSectionFilter.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsRedSectionFilter.java
deleted file mode 100644
index ccf646e..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsRedSectionFilter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters;
-
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsColor;
-
-/**
- * A section filter for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsRedSectionFilter extends
-		DynamicTestsElementSectionFilter {
-
-	protected boolean appliesToColor(DynamicTestsColor color) {
-		return DynamicTestsColor.RED.equals(color);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsSquareSectionFilter.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsSquareSectionFilter.java
deleted file mode 100644
index 8bfff07..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsSquareSectionFilter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters;
-
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsShape;
-
-/**
- * A section filter for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsSquareSectionFilter extends
-		DynamicTestsElementSectionFilter {
-
-	protected boolean appliesToShape(DynamicTestsShape shape) {
-		return DynamicTestsShape.SQUARE.equals(shape);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsStarSectionFilter.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsStarSectionFilter.java
deleted file mode 100644
index 8cac35f..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsStarSectionFilter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters;
-
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsShape;
-
-/**
- * A section filter for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsStarSectionFilter extends
-		DynamicTestsElementSectionFilter {
-
-	protected boolean appliesToShape(DynamicTestsShape shape) {
-		return DynamicTestsShape.STAR.equals(shape);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsTriangleSectionFilter.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsTriangleSectionFilter.java
deleted file mode 100644
index cb110a7..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/filters/DynamicTestsTriangleSectionFilter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters;
-
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsShape;
-
-/**
- * A section filter for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsTriangleSectionFilter extends
-		DynamicTestsElementSectionFilter {
-
-	protected boolean appliesToShape(DynamicTestsShape shape) {
-		return DynamicTestsShape.TRIANGLE.equals(shape);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/model/DynamicTestsColor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/model/DynamicTestsColor.java
deleted file mode 100644
index 2524c7c..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/model/DynamicTestsColor.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.model;
-
-/**
- * A color enumeration for the dynamic tests view. (Should use an enum when we
- * can use Java 5).
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsColor {
-
-	public static final DynamicTestsColor BLACK = new DynamicTestsColor("black"); //$NON-NLS-1$
-
-	public static final DynamicTestsColor BLUE = new DynamicTestsColor("blue"); //$NON-NLS-1$
-
-	public static final DynamicTestsColor GREEN = new DynamicTestsColor("green"); //$NON-NLS-1$
-
-	public static final DynamicTestsColor RED = new DynamicTestsColor("red"); //$NON-NLS-1$
-
-	/**
-	 * @return the color
-	 */
-	public static DynamicTestsColor getColor(String value) {
-		if (RED.getColor().equals(value)) {
-			return RED;
-		} else if (GREEN.getColor().equals(value)) {
-			return GREEN;
-		} else if (BLUE.getColor().equals(value)) {
-			return BLUE;
-		} else if (BLACK.getColor().equals(value)) {
-			return BLACK;
-		}
-		return null;
-	}
-
-	private String color;
-
-	private DynamicTestsColor(String aColor) {
-		setColor(aColor);
-	}
-
-	/**
-	 * @return the color
-	 */
-	public String getColor() {
-		return color;
-	}
-
-	/**
-	 * @param color
-	 *            the color to set
-	 */
-	public void setColor(String aColor) {
-		this.color = aColor;
-	}
-
-	public String toString() {
-		return getColor();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/model/DynamicTestsElement.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/model/DynamicTestsElement.java
deleted file mode 100644
index f269b47..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/model/DynamicTestsElement.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.tests.views.properties.tabbed.Activator;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsView;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-
-/**
- * An element for the dynamic tests view. We build an element for one of the
- * icons. For example, "icons/blue_circle.gif" becomes a "Blue Circle" element.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsElement implements
-		ITabbedPropertySheetPageContributor, IPropertySource {
-
-	public static String ADVANCED_CATEGORY = "Advanced"; //$NON-NLS-1$
-
-	public static String DEFAULT_CATEGORY = "Default"; //$NON-NLS-1$
-
-	public static String ID_COLOR = "Color"; //$NON-NLS-1$
-
-	public static String ID_IMAGE = "Image"; //$NON-NLS-1$
-
-	public static String ID_NAME = "Name"; //$NON-NLS-1$
-
-	public static String ID_SHAPE = "Shape"; //$NON-NLS-1$
-
-	private DynamicTestsColor dynamicTestsColor;
-
-	private Image image;
-
-	private String name;
-
-	private String path;
-
-	private List propertyDescriptors = new ArrayList();
-
-	private DynamicTestsShape shape;
-
-	private DynamicTestsView view;
-
-	public DynamicTestsElement(DynamicTestsView aView, String aPath) {
-		super();
-		this.view = aView;
-		this.path = aPath;
-		int slash = path.indexOf('/');
-		Assert.isTrue(slash > 0);
-		int underscore = path.indexOf('_');
-		Assert.isTrue(underscore > 0);
-		int dot = path.indexOf('.');
-		Assert.isTrue(dot > 0);
-		this.shape = DynamicTestsShape.getShape(path.substring(underscore + 1,
-				dot));
-		this.dynamicTestsColor = DynamicTestsColor.getColor(path.substring(
-				slash + 1, underscore));
-		this.image = Activator.getImageDescriptor(path).createImage();
-		StringBuffer nameBuffer = new StringBuffer(path);
-		nameBuffer.replace(slash + 1, slash + 2, path.substring(slash + 1,
-				slash + 2).toUpperCase());
-		nameBuffer.replace(underscore + 1, underscore + 2, path.substring(
-				underscore + 1, underscore + 2).toUpperCase());
-		nameBuffer.replace(underscore, underscore + 1, " ");//$NON-NLS-1$
-		name = nameBuffer.substring(slash + 1, dot).toString();
-		PropertyDescriptor propertyDescriptor = new PropertyDescriptor(ID_NAME,
-				ID_NAME);
-		propertyDescriptor.setCategory(DEFAULT_CATEGORY);
-		propertyDescriptors.add(propertyDescriptor);
-		propertyDescriptor = new PropertyDescriptor(ID_COLOR, ID_COLOR);
-		propertyDescriptor.setCategory(DEFAULT_CATEGORY);
-		propertyDescriptors.add(propertyDescriptor);
-		propertyDescriptor = new PropertyDescriptor(ID_SHAPE, ID_SHAPE);
-		propertyDescriptor.setCategory(DEFAULT_CATEGORY);
-		propertyDescriptors.add(propertyDescriptor);
-		propertyDescriptor = new PropertyDescriptor(ID_IMAGE, ID_IMAGE);
-		propertyDescriptor.setCategory(ADVANCED_CATEGORY);
-		propertyDescriptors.add(propertyDescriptor);
-	}
-
-	public String getContributorId() {
-		return view.getContributorId();
-	}
-
-	public Object getEditableValue() {
-		return this;
-	}
-
-	/**
-	 * @return the image
-	 */
-	public Image getImage() {
-		return image;
-	}
-
-	/**
-	 * @return the name
-	 */
-	public String getName() {
-		return name;
-	}
-
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		return (IPropertyDescriptor[]) propertyDescriptors
-				.toArray(new IPropertyDescriptor[0]);
-	}
-
-	public Object getPropertyValue(Object id) {
-		if (id.equals(ID_COLOR)) {
-			return dynamicTestsColor;
-		} else if (id.equals(ID_SHAPE)) {
-			return shape;
-		} else if (id.equals(ID_NAME)) {
-			return name;
-		} else if (id.equals(ID_IMAGE)) {
-			return path;
-		}
-		return null;
-	}
-
-	public boolean isPropertySet(Object id) {
-		return true;
-	}
-
-	public void resetPropertyValue(Object id) {
-		// Not implemented, read only properties
-	}
-
-	public void setPropertyValue(Object id, Object value) {
-		// Not implemented, read only properties
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/model/DynamicTestsShape.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/model/DynamicTestsShape.java
deleted file mode 100644
index 1110bdd..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/model/DynamicTestsShape.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.model;
-
-/**
- * A shape enumeration for the dynamic tests view. (Should use an enum when we
- * can use Java 5).
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsShape {
-
-	public static final DynamicTestsShape CIRCLE = new DynamicTestsShape(
-			"circle"); //$NON-NLS-1$
-
-	public static final DynamicTestsShape SQUARE = new DynamicTestsShape(
-			"square"); //$NON-NLS-1$
-
-	public static final DynamicTestsShape STAR = new DynamicTestsShape("star"); //$NON-NLS-1$
-
-	public static final DynamicTestsShape TRIANGLE = new DynamicTestsShape(
-			"triangle"); //$NON-NLS-1$
-
-	/**
-	 * @return the shape
-	 */
-	public static DynamicTestsShape getShape(String value) {
-		if (SQUARE.getShape().equals(value)) {
-			return SQUARE;
-		} else if (CIRCLE.getShape().equals(value)) {
-			return CIRCLE;
-		} else if (TRIANGLE.getShape().equals(value)) {
-			return TRIANGLE;
-		} else if (STAR.getShape().equals(value)) {
-			return STAR;
-		}
-		return null;
-	}
-
-	private String shape;
-
-	private DynamicTestsShape(String aShape) {
-		setShape(aShape);
-	}
-
-	/**
-	 * @return the shape
-	 */
-	public String getShape() {
-		return shape;
-	}
-
-	/**
-	 * @param shape
-	 *            the shape to set
-	 */
-	public void setShape(String aShape) {
-		this.shape = aShape;
-	}
-
-	public String toString() {
-		return getShape();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsAdvancedSectionDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsAdvancedSectionDescriptor.java
deleted file mode 100644
index 0d4ca12..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsAdvancedSectionDescriptor.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsElement;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.AdvancedPropertySection;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-/**
- * A section descriptor for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsAdvancedSectionDescriptor extends
-		AbstractSectionDescriptor {
-
-	/**
-	 * Constructor for DynamicTestsAdvancedSectionDescriptor.
-	 * 
-	 * @param typeMapper
-	 *            the optional type mapper for the section.
-	 */
-	public DynamicTestsAdvancedSectionDescriptor(ITypeMapper typeMapper) {
-		super(typeMapper);
-	}
-
-	public int getEnablesFor() {
-		return 1;
-	}
-
-	public String getId() {
-		return "AdvancedSection"; //$NON-NLS-1$
-	}
-
-	public List getInputTypes() {
-		List list = new ArrayList();
-		list.add(DynamicTestsElement.class.getName());
-		return list;
-	}
-
-	public ISection getSectionClass() {
-		return new AdvancedPropertySection();
-	}
-
-	public String getTargetTab() {
-		return "AdvancedTab"; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsBlackSectionDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsBlackSectionDescriptor.java
deleted file mode 100644
index 107ae3e..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsBlackSectionDescriptor.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters.DynamicTestsBlackSectionFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsBlackSection;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-/**
- * A section descriptor for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsBlackSectionDescriptor extends
-		AbstractSectionDescriptor {
-
-	/**
-	 * Constructor for DynamicTestsBlackSectionDescriptor.
-	 * 
-	 * @param typeMapper
-	 *            the optional type mapper for the section.
-	 */
-	public DynamicTestsBlackSectionDescriptor(ITypeMapper typeMapper) {
-		super(typeMapper);
-	}
-
-	public IFilter getFilter() {
-		return new DynamicTestsBlackSectionFilter();
-	}
-
-	public String getId() {
-		return "DynamicTestsBlackSection"; //$NON-NLS-1$
-	}
-
-	public ISection getSectionClass() {
-		return new DynamicTestsBlackSection();
-	}
-
-	public String getTargetTab() {
-		return "BlackTab"; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsBlueSectionDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsBlueSectionDescriptor.java
deleted file mode 100644
index 2eca181..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsBlueSectionDescriptor.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters.DynamicTestsBlueSectionFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsBlueSection;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-/**
- * A section descriptor for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsBlueSectionDescriptor extends
-		AbstractSectionDescriptor {
-
-	/**
-	 * Constructor for DynamicTestsBlueSectionDescriptor.
-	 * 
-	 * @param typeMapper
-	 *            the optional type mapper for the section.
-	 */
-	public DynamicTestsBlueSectionDescriptor(ITypeMapper typeMapper) {
-		super(typeMapper);
-	}
-
-	public IFilter getFilter() {
-		return new DynamicTestsBlueSectionFilter();
-	}
-
-	public String getId() {
-		return "DynamicTestsBlueSection"; //$NON-NLS-1$
-	}
-
-	public ISection getSectionClass() {
-		return new DynamicTestsBlueSection();
-	}
-
-	public String getTargetTab() {
-		return "ColorTab"; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsCircleSectionDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsCircleSectionDescriptor.java
deleted file mode 100644
index ab6e4b7..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsCircleSectionDescriptor.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters.DynamicTestsCircleSectionFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsCircleSection;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-/**
- * A section descriptor for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsCircleSectionDescriptor extends
-		AbstractSectionDescriptor {
-
-	/**
-	 * Constructor for DynamicTestsCircleSectionDescriptor.
-	 * 
-	 * @param typeMapper
-	 *            the optional type mapper for the section.
-	 */
-	public DynamicTestsCircleSectionDescriptor(ITypeMapper typeMapper) {
-		super(typeMapper);
-	}
-
-	public IFilter getFilter() {
-		return new DynamicTestsCircleSectionFilter();
-	}
-
-	public String getId() {
-		return "DynamicTestsCircleSection"; //$NON-NLS-1$
-	}
-
-	public ISection getSectionClass() {
-		return new DynamicTestsCircleSection();
-	}
-
-	public String getTargetTab() {
-		return "ShapeTab"; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsElementSectionDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsElementSectionDescriptor.java
deleted file mode 100644
index 0d0e9bd..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsElementSectionDescriptor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsElement;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsElementSection;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-/**
- * A section descriptor for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsElementSectionDescriptor extends
-		AbstractSectionDescriptor {
-
-	/**
-	 * Constructor for DynamicTestsElementSectionDescriptor.
-	 * 
-	 * @param typeMapper
-	 *            the optional type mapper for the section.
-	 */
-	public DynamicTestsElementSectionDescriptor(ITypeMapper typeMapper) {
-		super(typeMapper);
-	}
-
-	public String getId() {
-		return "DynamicTestsElementSection"; //$NON-NLS-1$
-	}
-
-	public List getInputTypes() {
-		List list = new ArrayList();
-		list.add(DynamicTestsElement.class.getName());
-		return list;
-	}
-
-	public ISection getSectionClass() {
-		return new DynamicTestsElementSection();
-	}
-
-	public String getTargetTab() {
-		return "ElementTab"; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsGreenSectionDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsGreenSectionDescriptor.java
deleted file mode 100644
index 74e2da3..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsGreenSectionDescriptor.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters.DynamicTestsGreenSectionFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsGreenSection;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-/**
- * A section descriptor for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsGreenSectionDescriptor extends
-		AbstractSectionDescriptor {
-
-	/**
-	 * Constructor for DynamicTestsGreenSectionDescriptor.
-	 * 
-	 * @param typeMapper
-	 *            the optional type mapper for the section.
-	 */
-	public DynamicTestsGreenSectionDescriptor(ITypeMapper typeMapper) {
-		super(typeMapper);
-	}
-
-	public IFilter getFilter() {
-		return new DynamicTestsGreenSectionFilter();
-	}
-
-	public String getId() {
-		return "DynamicTestsGreenSection"; //$NON-NLS-1$
-	}
-
-	public ISection getSectionClass() {
-		return new DynamicTestsGreenSection();
-	}
-
-	public String getTargetTab() {
-		return "ColorTab"; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsRedSectionDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsRedSectionDescriptor.java
deleted file mode 100644
index 72a25c8..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsRedSectionDescriptor.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters.DynamicTestsRedSectionFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsRedSection;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-/**
- * A section descriptor for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsRedSectionDescriptor extends AbstractSectionDescriptor {
-
-	/**
-	 * Constructor for DynamicTestsRedSectionDescriptor.
-	 * 
-	 * @param typeMapper
-	 *            the optional type mapper for the section.
-	 */
-	public DynamicTestsRedSectionDescriptor(ITypeMapper typeMapper) {
-		super(typeMapper);
-	}
-
-	public IFilter getFilter() {
-		return new DynamicTestsRedSectionFilter();
-	}
-
-	public String getId() {
-		return "DynamicTestsRedSection"; //$NON-NLS-1$
-	}
-
-	public ISection getSectionClass() {
-		return new DynamicTestsRedSection();
-	}
-
-	public String getTargetTab() {
-		return "ColorTab"; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsSectionDescriptorProvider.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsSectionDescriptorProvider.java
deleted file mode 100644
index 8a65acb..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsSectionDescriptorProvider.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors;
-
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsTypeMapper;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptorProvider;
-
-/**
- * A section descriptor provider for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsSectionDescriptorProvider implements
-		ISectionDescriptorProvider {
-
-	public ISectionDescriptor[] getSectionDescriptors() {
-		return new ISectionDescriptor[] {
-				new DynamicTestsStarSectionDescriptor(
-						new DynamicTestsTypeMapper()),
-				new DynamicTestsBlueSectionDescriptor(
-						new DynamicTestsTypeMapper()),
-				new DynamicTestsCircleSectionDescriptor(
-						new DynamicTestsTypeMapper()),
-				new DynamicTestsElementSectionDescriptor(
-						new DynamicTestsTypeMapper()),
-				new DynamicTestsGreenSectionDescriptor(
-						new DynamicTestsTypeMapper()),
-				new DynamicTestsAdvancedSectionDescriptor(
-						new DynamicTestsTypeMapper()),
-				new DynamicTestsRedSectionDescriptor(
-						new DynamicTestsTypeMapper()),
-				new DynamicTestsSquareSectionDescriptor(
-						new DynamicTestsTypeMapper()),
-				new DynamicTestsTriangleSectionDescriptor(
-						new DynamicTestsTypeMapper()) };
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsSquareSectionDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsSquareSectionDescriptor.java
deleted file mode 100644
index af5377d..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsSquareSectionDescriptor.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters.DynamicTestsSquareSectionFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsSquareSection;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-/**
- * A section descriptor for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsSquareSectionDescriptor extends
-		AbstractSectionDescriptor {
-
-	/**
-	 * Constructor for DynamicTestsSquareSectionDescriptor.
-	 * 
-	 * @param typeMapper
-	 *            the optional type mapper for the section.
-	 */
-	public DynamicTestsSquareSectionDescriptor(ITypeMapper typeMapper) {
-		super(typeMapper);
-	}
-
-	public IFilter getFilter() {
-		return new DynamicTestsSquareSectionFilter();
-	}
-
-	public String getId() {
-		return "DynamicTestsSquareSection"; //$NON-NLS-1$
-	}
-
-	public ISection getSectionClass() {
-		return new DynamicTestsSquareSection();
-	}
-
-	public String getTargetTab() {
-		return "ShapeTab"; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsStarSectionDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsStarSectionDescriptor.java
deleted file mode 100644
index 440f588..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsStarSectionDescriptor.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters.DynamicTestsStarSectionFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsStarSection;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-/**
- * A section descriptor for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsStarSectionDescriptor extends
-		AbstractSectionDescriptor {
-
-	/**
-	 * Constructor for DynamicTestsStarSectionDescriptor.
-	 * 
-	 * @param typeMapper
-	 *            the optional type mapper for the section.
-	 */
-	public DynamicTestsStarSectionDescriptor(ITypeMapper typeMapper) {
-		super(typeMapper);
-	}
-
-	public IFilter getFilter() {
-		return new DynamicTestsStarSectionFilter();
-	}
-
-	public String getId() {
-		return "DynamicTestsStarSection"; //$NON-NLS-1$
-	}
-
-	public ISection getSectionClass() {
-		return new DynamicTestsStarSection();
-	}
-
-	public String getTargetTab() {
-		return "StarTab"; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsTriangleSectionDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsTriangleSectionDescriptor.java
deleted file mode 100644
index 7f5f3e3..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/section/descriptors/DynamicTestsTriangleSectionDescriptor.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.filters.DynamicTestsTriangleSectionFilter;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections.DynamicTestsTriangleSection;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-/**
- * A section descriptor for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsTriangleSectionDescriptor extends
-		AbstractSectionDescriptor {
-
-	/**
-	 * Constructor for DynamicTestsTriangleSectionDescriptor.
-	 * 
-	 * @param typeMapper
-	 *            the optional type mapper for the section.
-	 */
-	public DynamicTestsTriangleSectionDescriptor(ITypeMapper typeMapper) {
-		super(typeMapper);
-	}
-
-	public IFilter getFilter() {
-		return new DynamicTestsTriangleSectionFilter();
-	}
-
-	public String getId() {
-		return "DynamicTestsTriangleSection"; //$NON-NLS-1$
-	}
-
-	public ISection getSectionClass() {
-		return new DynamicTestsTriangleSection();
-	}
-
-	public String getTargetTab() {
-		return "ShapeTab"; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsAbstractLabelSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsAbstractLabelSection.java
deleted file mode 100644
index 0959295..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsAbstractLabelSection.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections;
-
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * An abstract section for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public abstract class DynamicTestsAbstractLabelSection extends
-		AbstractPropertySection {
-
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		Composite composite = getWidgetFactory()
-				.createFlatFormComposite(parent);
-
-		Group group = getWidgetFactory().createGroup(composite, getGroup());
-		FormLayout layout = new FormLayout();
-		layout.marginWidth = ITabbedPropertyConstants.HSPACE + 2;
-		layout.marginHeight = ITabbedPropertyConstants.VSPACE;
-		layout.spacing = ITabbedPropertyConstants.VMARGIN + 1;
-		group.setLayout(layout);
-		FormData data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, 0);
-		data.bottom = new FormAttachment(100, 0);
-		group.setLayoutData(data);
-
-		CLabel nameLabel = getWidgetFactory().createCLabel(group, getLabel());
-		data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, 0);
-		nameLabel.setLayoutData(data);
-	}
-
-	public abstract String getGroup();
-
-	public abstract String getLabel();
-
-	public boolean shouldUseExtraSpace() {
-		return true;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsBlackSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsBlackSection.java
deleted file mode 100644
index 7e89b64..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsBlackSection.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections;
-
-/**
- * A section for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsBlackSection extends DynamicTestsAbstractLabelSection {
-
-	public String getGroup() {
-		return "Black"; //$NON-NLS-1$
-	}
-
-	public String getLabel() {
-		return "A section for black elements."; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsBlueSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsBlueSection.java
deleted file mode 100644
index 12a22ca..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsBlueSection.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections;
-
-/**
- * A section for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsBlueSection extends DynamicTestsAbstractLabelSection {
-
-	public String getGroup() {
-		return "Color"; //$NON-NLS-1$
-	}
-
-	public String getLabel() {
-		return "A section for blue elements."; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsCircleSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsCircleSection.java
deleted file mode 100644
index 4306e65..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsCircleSection.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections;
-
-/**
- * A section for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsCircleSection extends DynamicTestsAbstractLabelSection {
-
-	public String getGroup() {
-		return "Shape"; //$NON-NLS-1$
-	}
-
-	public String getLabel() {
-		return "A section for circle elements."; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsElementSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsElementSection.java
deleted file mode 100644
index 2940831..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsElementSection.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections;
-
-/**
- * A section for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsElementSection extends
-		DynamicTestsAbstractLabelSection {
-
-	public String getGroup() {
-		return "Element"; //$NON-NLS-1$
-	}
-
-	public String getLabel() {
-		return "A section for any element."; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsGreenSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsGreenSection.java
deleted file mode 100644
index ea5b7ff..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsGreenSection.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections;
-
-/**
- * A section for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsGreenSection extends DynamicTestsAbstractLabelSection {
-
-	public String getGroup() {
-		return "Color"; //$NON-NLS-1$
-	}
-
-	public String getLabel() {
-		return "A section for green elements."; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsRedSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsRedSection.java
deleted file mode 100644
index dbe0ce3..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsRedSection.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections;
-
-/**
- * A section for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsRedSection extends DynamicTestsAbstractLabelSection {
-
-	public String getGroup() {
-		return "Color"; //$NON-NLS-1$
-	}
-
-	public String getLabel() {
-		return "A section for red elements."; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsSquareSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsSquareSection.java
deleted file mode 100644
index f946347..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsSquareSection.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections;
-
-/**
- * A section for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsSquareSection extends DynamicTestsAbstractLabelSection {
-
-	public String getGroup() {
-		return "Shape"; //$NON-NLS-1$
-	}
-
-	public String getLabel() {
-		return "A section for square elements."; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsStarSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsStarSection.java
deleted file mode 100644
index fd8f058..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsStarSection.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections;
-
-/**
- * A section for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsStarSection extends DynamicTestsAbstractLabelSection {
-
-	public String getGroup() {
-		return "Star"; //$NON-NLS-1$
-	}
-
-	public String getLabel() {
-		return "A section for star elements."; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsTriangleSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsTriangleSection.java
deleted file mode 100644
index 875049b..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/sections/DynamicTestsTriangleSection.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.sections;
-
-/**
- * A section for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsTriangleSection extends
-		DynamicTestsAbstractLabelSection {
-
-	public String getGroup() {
-		return "Shape"; //$NON-NLS-1$
-	}
-
-	public String getLabel() {
-		return "A section for triangle elements."; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsAdvancedTabDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsAdvancedTabDescriptor.java
deleted file mode 100644
index 775ce3b..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsAdvancedTabDescriptor.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.tab.descriptors;
-
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors.DynamicTestsAdvancedSectionDescriptor;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsTypeMapper;
-import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
-
-/**
- * A tab descriptor for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsAdvancedTabDescriptor extends AbstractTabDescriptor {
-
-	public DynamicTestsAdvancedTabDescriptor() {
-		super();
-		getSectionDescriptors().add(
-				new DynamicTestsAdvancedSectionDescriptor(
-						new DynamicTestsTypeMapper()));
-	}
-
-	public String getCategory() {
-		return "advanced"; //$NON-NLS-1$
-	}
-
-	public String getId() {
-		return "AdvancedTab"; //$NON-NLS-1$
-	}
-
-	public String getLabel() {
-		return "Advanced"; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsBlackTabDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsBlackTabDescriptor.java
deleted file mode 100644
index 1482a53..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsBlackTabDescriptor.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.tab.descriptors;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.tests.views.properties.tabbed.Activator;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors.DynamicTestsBlackSectionDescriptor;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsTypeMapper;
-import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
-
-/**
- * A tab descriptor for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsBlackTabDescriptor extends AbstractTabDescriptor {
-	private Image image;
-
-	public DynamicTestsBlackTabDescriptor() {
-		super();
-		getSectionDescriptors().add(
-				new DynamicTestsBlackSectionDescriptor(
-						new DynamicTestsTypeMapper()));
-	}
-
-	public String getAfterTab() {
-		return "ColorTab"; //$NON-NLS-1$
-	}
-
-	public String getCategory() {
-		return "default"; //$NON-NLS-1$
-	}
-
-	public String getId() {
-		return "BlackTab"; //$NON-NLS-1$
-	}
-
-	public Image getImage() {
-		if (image == null) {
-			image = Activator
-					.getImageDescriptor("icons/black_triangle.gif").createImage(); //$NON-NLS-1$ 
-		}
-		return image;
-	}
-
-	public String getLabel() {
-		return "Black"; //$NON-NLS-1$
-	}
-
-	public boolean isIndented() {
-		return true;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsColorTabDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsColorTabDescriptor.java
deleted file mode 100644
index 0749af6..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsColorTabDescriptor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.tab.descriptors;
-
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors.DynamicTestsBlueSectionDescriptor;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors.DynamicTestsGreenSectionDescriptor;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors.DynamicTestsRedSectionDescriptor;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsTypeMapper;
-import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
-
-/**
- * A tab descriptor for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsColorTabDescriptor extends AbstractTabDescriptor {
-
-	public DynamicTestsColorTabDescriptor() {
-		super();
-		getSectionDescriptors().add(
-				new DynamicTestsRedSectionDescriptor(
-						new DynamicTestsTypeMapper()));
-		getSectionDescriptors().add(
-				new DynamicTestsGreenSectionDescriptor(
-						new DynamicTestsTypeMapper()));
-		getSectionDescriptors().add(
-				new DynamicTestsBlueSectionDescriptor(
-						new DynamicTestsTypeMapper()));
-	}
-
-	public String getAfterTab() {
-		return "ElementTab"; //$NON-NLS-1$
-	}
-
-	public String getCategory() {
-		return "default"; //$NON-NLS-1$
-	}
-
-	public String getId() {
-		return "ColorTab"; //$NON-NLS-1$
-	}
-
-	public String getLabel() {
-		return "Color"; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsElementTabDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsElementTabDescriptor.java
deleted file mode 100644
index 8748e6d..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsElementTabDescriptor.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.tab.descriptors;
-
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors.DynamicTestsElementSectionDescriptor;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsTypeMapper;
-import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
-
-/**
- * A tab descriptor for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsElementTabDescriptor extends AbstractTabDescriptor {
-
-	public DynamicTestsElementTabDescriptor() {
-		super();
-		getSectionDescriptors().add(
-				new DynamicTestsElementSectionDescriptor(
-						new DynamicTestsTypeMapper()));
-	}
-
-	public String getCategory() {
-		return "default"; //$NON-NLS-1$
-	}
-
-	public String getId() {
-		return "ElementTab"; //$NON-NLS-1$
-	}
-
-	public String getLabel() {
-		return "Element"; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsShapeTabDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsShapeTabDescriptor.java
deleted file mode 100644
index 724e7b1..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsShapeTabDescriptor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.tab.descriptors;
-
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors.DynamicTestsCircleSectionDescriptor;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors.DynamicTestsSquareSectionDescriptor;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.section.descriptors.DynamicTestsTriangleSectionDescriptor;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsTypeMapper;
-import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
-
-/**
- * A tab descriptor for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsShapeTabDescriptor extends AbstractTabDescriptor {
-
-	public DynamicTestsShapeTabDescriptor() {
-		super();
-		getSectionDescriptors().add(
-				new DynamicTestsCircleSectionDescriptor(
-						new DynamicTestsTypeMapper()));
-		getSectionDescriptors().add(
-				new DynamicTestsSquareSectionDescriptor(
-						new DynamicTestsTypeMapper()));
-		getSectionDescriptors().add(
-				new DynamicTestsTriangleSectionDescriptor(
-						new DynamicTestsTypeMapper()));
-	}
-
-	public String getAfterTab() {
-		return "ColorTab"; //$NON-NLS-1$
-	}
-
-	public String getCategory() {
-		return "default"; //$NON-NLS-1$
-	}
-
-	public String getId() {
-		return "ShapeTab"; //$NON-NLS-1$
-	}
-
-	public String getLabel() {
-		return "Shape"; //$NON-NLS-1$
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsTabDescriptorProvider.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsTabDescriptorProvider.java
deleted file mode 100644
index b726ff8..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/tab/descriptors/DynamicTestsTabDescriptorProvider.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.tab.descriptors;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider;
-
-/**
- * A tab descriptor provider for the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsTabDescriptorProvider implements
-		ITabDescriptorProvider {
-
-	public ITabDescriptor[] getTabDescriptors(IWorkbenchPart part,
-			ISelection selection) {
-		return new ITabDescriptor[] { new DynamicTestsElementTabDescriptor(),
-				new DynamicTestsShapeTabDescriptor(),
-				new DynamicTestsColorTabDescriptor(),
-				new DynamicTestsAdvancedTabDescriptor(),
-				new DynamicTestsBlackTabDescriptor() };
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/views/DynamicTestsTitleBarLabelProvider.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/views/DynamicTestsTitleBarLabelProvider.java
deleted file mode 100644
index 86e57f4..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/views/DynamicTestsTitleBarLabelProvider.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.views;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeNode;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsElement;
-
-/**
- * Label provider for the title bar for the tabbed property view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsTitleBarLabelProvider extends
-		org.eclipse.jface.viewers.LabelProvider {
-
-	public Image getImage(Object obj) {
-		Assert.isTrue(obj instanceof IStructuredSelection);
-		IStructuredSelection structuredSelection = (IStructuredSelection) obj;
-		if (structuredSelection.equals(StructuredSelection.EMPTY) ||
-				structuredSelection.size() > 1) {
-			return null;
-		}
-		DynamicTestsElement dynamicTestsElement = (DynamicTestsElement) ((DynamicTestsTreeNode) structuredSelection
-				.getFirstElement()).getValue();
-		return dynamicTestsElement.getImage();
-	}
-
-	public String getText(Object obj) {
-		Assert.isTrue(obj instanceof IStructuredSelection);
-		IStructuredSelection structuredSelection = (IStructuredSelection) obj;
-		if (structuredSelection.equals(StructuredSelection.EMPTY)) {
-			return null;
-		}
-		if (structuredSelection.size() > 1) {
-			return structuredSelection.size() + " items selected";//$NON-NLS-1$
-		}
-		DynamicTestsElement dynamicTestsElement = (DynamicTestsElement) ((TreeNode) structuredSelection
-				.getFirstElement()).getValue();
-		return dynamicTestsElement.getName();
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/views/DynamicTestsTreeNode.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/views/DynamicTestsTreeNode.java
deleted file mode 100644
index e607c65..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/views/DynamicTestsTreeNode.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.views;
-
-import org.eclipse.jface.viewers.TreeNode;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsElement;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-
-/**
- * A nodes in the tree of the dynamic tests view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class DynamicTestsTreeNode extends TreeNode implements
-		ITabbedPropertySheetPageContributor {
-
-	public DynamicTestsTreeNode(Object object) {
-		super(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor#getContributorId()
-	 */
-	public String getContributorId() {
-		return getDynamicTestsElement().getContributorId();
-	}
-
-	public DynamicTestsElement getDynamicTestsElement() {
-		return (DynamicTestsElement) getValue();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/views/DynamicTestsTypeMapper.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/views/DynamicTestsTypeMapper.java
deleted file mode 100644
index d68dd1d..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/views/DynamicTestsTypeMapper.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.views;
-
-import org.eclipse.ui.views.properties.tabbed.AbstractTypeMapper;
-
-/**
- * A type mapper for nodes in the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsTypeMapper extends AbstractTypeMapper {
-
-	public Class mapType(Object object) {
-		if (object instanceof DynamicTestsTreeNode) {
-			return ((DynamicTestsTreeNode) object).getDynamicTestsElement()
-					.getClass();
-		}
-		return super.mapType(object);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/views/DynamicTestsView.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/views/DynamicTestsView.java
deleted file mode 100644
index 0f52383..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/views/DynamicTestsView.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.views;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.tests.views.properties.tabbed.Activator;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsElement;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * A view to test dynamic contributions to the tabbed properties view. The view
- * has three modes of providing tabs and sections to the tabbed properties view:
- * use static contributions from plugin.xml, use dynamic section contributions
- * from code, or use dynamic tab (and section) contributions from code.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsView extends ViewPart implements
-		ITabbedPropertySheetPageContributor {
-
-	class DynamicTestsViewLabelProvider extends LabelProvider {
-
-		public Image getImage(Object obj) {
-			DynamicTestsElement element = ((DynamicTestsTreeNode) obj)
-					.getDynamicTestsElement();
-			return element.getImage();
-		}
-
-		public String getText(Object obj) {
-			DynamicTestsElement element = ((DynamicTestsTreeNode) obj)
-					.getDynamicTestsElement();
-			return element.getName();
-		}
-	}
-
-	public static final String DYNAMIC_TESTS_VIEW_ID = "org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsView"; //$NON-NLS-1$
-
-	public static final String DYNAMIC_TESTS_VIEW_STATIC = "org.eclipse.ui.tests.views.properties.tabbed.static"; //$NON-NLS-1$
-
-	public static final String DYNAMIC_TESTS_VIEW_DYNAMIC_TABS = "org.eclipse.ui.tests.views.properties.tabbed.dynamic.tab"; //$NON-NLS-1$
-
-	public static final String DYNAMIC_TESTS_VIEW_DYNAMIC_SECTIONS = "org.eclipse.ui.tests.views.properties.tabbed.dynamic.section"; //$NON-NLS-1$
-	private Action dynamicSectionsAction;
-
-	private Action dynamicTabsAction;
-
-	private Action staticAction;
-
-	private TabbedPropertySheetPage tabbedPropertySheetPage;
-
-	private TreeViewer viewer;
-
-	public void createPartControl(Composite parent) {
-		viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		viewer.setContentProvider(new DynamicTestsViewContentProvider(this));
-		viewer.setLabelProvider(new DynamicTestsViewLabelProvider());
-		viewer.setInput(getViewSite());
-		initToolBar();
-		getSite().setSelectionProvider(viewer);
-	}
-
-	public Object getAdapter(Class adapter) {
-		if (adapter == IPropertySheetPage.class) {
-			if (tabbedPropertySheetPage == null) {
-				tabbedPropertySheetPage = new TabbedPropertySheetPage(this);
-			}
-			return tabbedPropertySheetPage;
-		}
-		return super.getAdapter(adapter);
-	}
-
-	public String getContributorId() {
-		if (staticAction.isChecked()) {
-			return DYNAMIC_TESTS_VIEW_STATIC;
-		} else if (dynamicSectionsAction.isChecked()) {
-			return DYNAMIC_TESTS_VIEW_DYNAMIC_SECTIONS;
-		} else if (dynamicTabsAction.isChecked()) {
-			return DYNAMIC_TESTS_VIEW_DYNAMIC_TABS;
-		} else {
-			return null;
-		}
-	}
-
-	public void setContributorId(String contributorId) {
-		if (DYNAMIC_TESTS_VIEW_STATIC.equals(contributorId)) {
-			staticAction.setChecked(true);
-			dynamicSectionsAction.setChecked(false);
-			dynamicTabsAction.setChecked(false);
-		} else if (DYNAMIC_TESTS_VIEW_DYNAMIC_SECTIONS.equals(contributorId)) {
-			staticAction.setChecked(false);
-			dynamicSectionsAction.setChecked(true);
-			dynamicTabsAction.setChecked(false);
-		} else if (DYNAMIC_TESTS_VIEW_DYNAMIC_TABS.equals(contributorId)) {
-			staticAction.setChecked(false);
-			dynamicSectionsAction.setChecked(false);
-			dynamicTabsAction.setChecked(true);
-		}
-	}
-
-	public TabbedPropertySheetPage getTabbedPropertySheetPage() {
-		return tabbedPropertySheetPage;
-	}
-
-	public TreeViewer getViewer() {
-		return viewer;
-	}
-
-	/**
-	 * Create the tool bar for the view. The tool bar has three toggle buttons
-	 * which enable one of the three property contributors.
-	 */
-	private void initToolBar() {
-		final String staticText = "Use static contributions from plugin.xml"; //$NON-NLS-1$
-		final String dynamicSectionsText = "Use dynamic section contributions from code"; //$NON-NLS-1$
-		final String dynamicTabsText = "Use dynamic tab (and section) contributions from code"; //$NON-NLS-1$
-		ImageDescriptor imageDescriptor = Activator
-				.getImageDescriptor("icons/sample.gif");//$NON-NLS-1$
-		if (imageDescriptor == null) {
-			imageDescriptor = PlatformUI.getWorkbench().getSharedImages()
-					.getImageDescriptor(ISharedImages.IMG_OBJS_ERROR_TSK);
-		}
-
-		staticAction = new Action(staticText, IAction.AS_CHECK_BOX) {
-			public void run() {
-				if (isChecked()) {
-					getViewSite().getActionBars().getStatusLineManager()
-							.setMessage(staticText);
-					dynamicSectionsAction.setChecked(false);
-					dynamicTabsAction.setChecked(false);
-					viewer.setSelection(StructuredSelection.EMPTY);
-				}
-			}
-		};
-		staticAction.setToolTipText(staticText);
-		staticAction.setImageDescriptor(imageDescriptor);
-		staticAction.setDisabledImageDescriptor(imageDescriptor);
-
-		dynamicSectionsAction = new Action(dynamicSectionsText,
-				IAction.AS_CHECK_BOX) {
-			public void run() {
-				if (isChecked()) {
-					getViewSite().getActionBars().getStatusLineManager()
-							.setMessage(dynamicSectionsText);
-					staticAction.setChecked(false);
-					dynamicTabsAction.setChecked(false);
-					viewer.setSelection(StructuredSelection.EMPTY);
-				}
-			}
-		};
-		dynamicSectionsAction.setToolTipText(dynamicSectionsText);
-		dynamicSectionsAction.setImageDescriptor(imageDescriptor);
-		dynamicSectionsAction.setDisabledImageDescriptor(imageDescriptor);
-
-		dynamicTabsAction = new Action(dynamicTabsText, IAction.AS_CHECK_BOX) {
-			public void run() {
-				if (isChecked()) {
-					getViewSite().getActionBars().getStatusLineManager()
-							.setMessage(dynamicTabsText);
-					staticAction.setChecked(false);
-					dynamicSectionsAction.setChecked(false);
-					viewer.setSelection(StructuredSelection.EMPTY);
-				}
-			}
-		};
-		dynamicTabsAction.setToolTipText(dynamicTabsText);
-		dynamicTabsAction.setImageDescriptor(imageDescriptor);
-		dynamicTabsAction.setDisabledImageDescriptor(imageDescriptor);
-		staticAction.setChecked(true);
-
-		IToolBarManager toolBarManager = getViewSite().getActionBars()
-				.getToolBarManager();
-		toolBarManager.add(staticAction);
-		toolBarManager.add(dynamicSectionsAction);
-		toolBarManager.add(dynamicTabsAction);
-
-		getViewSite().getActionBars().getStatusLineManager().setMessage(
-				staticText);
-	}
-
-	public void setFocus() {
-		viewer.getControl().setFocus();
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/views/DynamicTestsViewContentProvider.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/views/DynamicTestsViewContentProvider.java
deleted file mode 100644
index 28ed034..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/dynamic/views/DynamicTestsViewContentProvider.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.dynamic.views;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.model.DynamicTestsElement;
-
-/**
- * A content provider for nodes in the tree of the dynamic tests view.
- * 
- * @author Anthony Hunter
- */
-public class DynamicTestsViewContentProvider implements
-		IStructuredContentProvider, ITreeContentProvider {
-
-	private DynamicTestsTreeNode invisibleRoot;
-
-	private final DynamicTestsView view;
-
-	public DynamicTestsViewContentProvider(DynamicTestsView dynamicTestsView) {
-		super();
-		this.view = dynamicTestsView;
-	}
-
-	public void dispose() {
-		//
-	}
-
-	public Object[] getChildren(Object parent) {
-		if (parent instanceof DynamicTestsTreeNode) {
-			return ((DynamicTestsTreeNode) parent).getChildren();
-		}
-		return new Object[0];
-	}
-
-	public Object[] getElements(Object parent) {
-		if (parent.equals(this.view.getViewSite())) {
-			if (invisibleRoot == null)
-				initialize();
-			return getChildren(invisibleRoot);
-		}
-		return getChildren(parent);
-	}
-
-	public DynamicTestsTreeNode getInvisibleRoot() {
-		return invisibleRoot;
-	}
-
-	public Object getParent(Object child) {
-		if (child instanceof DynamicTestsTreeNode) {
-			return ((DynamicTestsTreeNode) child).getParent();
-		}
-		return null;
-	}
-
-	public boolean hasChildren(Object parent) {
-		if (parent instanceof DynamicTestsTreeNode)
-			return ((DynamicTestsTreeNode) parent).hasChildren();
-		return false;
-	}
-
-	public void initialize() {
-		String elements[] = new String[] { "icons/black_triangle.gif",//$NON-NLS-1$
-				"icons/blue_circle.gif",//$NON-NLS-1$
-				"icons/blue_square.gif",//$NON-NLS-1$
-				"icons/blue_triangle.gif",//$NON-NLS-1$
-				"icons/green_circle.gif",//$NON-NLS-1$
-				"icons/green_square.gif",//$NON-NLS-1$
-				"icons/green_triangle.gif",//$NON-NLS-1$
-				"icons/red_circle.gif",//$NON-NLS-1$
-				"icons/red_square.gif",//$NON-NLS-1$
-				"icons/red_star.gif",//$NON-NLS-1$
-				"icons/red_triangle.gif" };//$NON-NLS-1$
-		DynamicTestsTreeNode[] nodes = new DynamicTestsTreeNode[elements.length];
-		for (int i = 0; i < elements.length; i++) {
-			DynamicTestsElement dynamicTestsElement = new DynamicTestsElement(
-					view, elements[i]);
-			nodes[i] = new DynamicTestsTreeNode(dynamicTestsElement);
-		}
-		invisibleRoot = new DynamicTestsTreeNode(null);
-		invisibleRoot.setChildren(nodes);
-	}
-
-	public void inputChanged(Viewer v, Object oldInput, Object newInput) {
-		//
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Element.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Element.java
deleted file mode 100644
index 7e6f4c1..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Element.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.model;
-
-import org.eclipse.swt.graphics.Image;
-
-public abstract class Element {
-
-    private String name;
-
-    public Element(String aName) {
-        super();
-        this.name = aName;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public abstract Image getImage();
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Error.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Error.java
deleted file mode 100644
index beb86a0..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Error.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.model;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-public class Error
-    extends Element {
-
-    public Error(String name) {
-        super(name);
-    }
-
-    public Image getImage() {
-        return PlatformUI.getWorkbench().getSharedImages().getImage(
-            ISharedImages.IMG_OBJS_ERROR_TSK);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/File.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/File.java
deleted file mode 100644
index e7f8761..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/File.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.model;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-public class File
-    extends Element {
-
-    public File(String name) {
-        super(name);
-    }
-
-    public Image getImage() {
-        return PlatformUI.getWorkbench().getSharedImages().getImage(
-            ISharedImages.IMG_OBJ_FILE);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Folder.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Folder.java
deleted file mode 100644
index f1251c7..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Folder.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.model;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-public class Folder
-    extends Element {
-
-    public Folder(String name) {
-        super(name);
-    }
-
-    public Image getImage() {
-        return PlatformUI.getWorkbench().getSharedImages().getImage(
-            ISharedImages.IMG_OBJ_FOLDER);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Information.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Information.java
deleted file mode 100644
index a6c515d..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Information.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.model;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-public class Information
-    extends Element {
-
-    public Information(String name) {
-        super(name);
-    }
-
-    public Image getImage() {
-        return PlatformUI.getWorkbench().getSharedImages().getImage(
-            ISharedImages.IMG_OBJS_INFO_TSK);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Project.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Project.java
deleted file mode 100644
index a883146..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Project.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.model;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE.SharedImages;
-
-public class Project
-    extends Element {
-
-    public Project(String name) {
-        super(name);
-    }
-
-    public Image getImage() {
-        return PlatformUI.getWorkbench().getSharedImages().getImage(
-            SharedImages.IMG_OBJ_PROJECT);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Warning.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Warning.java
deleted file mode 100644
index 6498d3b..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/model/Warning.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.model;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-public class Warning
-    extends Element {
-
-    public Warning(String name) {
-        super(name);
-    }
-
-    public Image getImage() {
-        return PlatformUI.getWorkbench().getSharedImages().getImage(
-            ISharedImages.IMG_OBJS_WARN_TSK);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsContentProvider.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsContentProvider.java
deleted file mode 100644
index 27b9026..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsContentProvider.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Error;
-import org.eclipse.ui.tests.views.properties.tabbed.model.File;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Folder;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Information;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Warning;
-
-/**
- * The content provider for the override tests view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class OverrideTestsContentProvider implements IStructuredContentProvider {
-
-	private Element[] elements;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-		// not implemented
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object parent) {
-		if (elements == null) {
-			elements = new Element[] { new Information("Information"), //$NON-NLS-1$
-					new Warning("Warning"), new Error("Error"), //$NON-NLS-1$ //$NON-NLS-2$
-					new File("File"), new Folder("Folder") }; //$NON-NLS-1$//$NON-NLS-2$
-		}
-		return elements;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer v, Object oldInput, Object newInput) {
-		// not implemented
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsLabelProvider.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsLabelProvider.java
deleted file mode 100644
index 3419880..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsLabelProvider.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override;
-
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-
-/**
- * The label provider for the override tests view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class OverrideTestsLabelProvider extends LabelProvider implements
-		ITableLabelProvider {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object,
-	 *      int)
-	 */
-	public Image getColumnImage(Object obj, int index) {
-		return getImage(obj);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object,
-	 *      int)
-	 */
-	public String getColumnText(Object obj, int index) {
-		return getText(obj);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object object) {
-		if (object instanceof Element) {
-			Element element = (Element) object;
-			return element.getImage();
-		}
-		return super.getImage(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		if (object instanceof Element) {
-			Element element = (Element) object;
-			return element.getName();
-		}
-		return super.getText(object);
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsSelection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsSelection.java
deleted file mode 100644
index 850cf1c..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsSelection.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-
-/**
- * The selection in the override tests view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class OverrideTestsSelection implements ISelection {
-
-	private Element element;
-
-	/**
-	 * Constructor for OverrideTestsSelection
-	 * 
-	 * @param newElement
-	 *            the selected element.
-	 */
-	public OverrideTestsSelection(Element newElement) {
-		this.element = newElement;
-	}
-
-	/**
-	 * Get the selected element.
-	 * 
-	 * @return the selected element.
-	 */
-	public Element getElement() {
-		return element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelection#isEmpty()
-	 */
-	public boolean isEmpty() {
-		/*
-		 * Since we want to display UI when there is no selection (empty
-		 * selection), we need to return false to isEmpty().
-		 */
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		if (getElement() == null) {
-			return super.toString();
-		}
-		return getElement().getName();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsSelectionProvider.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsSelectionProvider.java
deleted file mode 100644
index 88a7ad2..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsSelectionProvider.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-
-/**
- * The selection provider for the override tests view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class OverrideTestsSelectionProvider implements ISelectionProvider {
-
-	private ListenerList selectionChangedListeners = new ListenerList();
-
-	private final TableViewer viewer;
-
-	/**
-	 * Constructor for OverrideTestsSelectionProvider
-	 * 
-	 * @param aViewer
-	 *            the viewer in the OverrideTestsView.
-	 */
-	OverrideTestsSelectionProvider(TableViewer aViewer) {
-		this.viewer = aViewer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		ISelection selection = viewer.getSelection();
-		IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-		if (structuredSelection.isEmpty()) {
-			return new OverrideTestsSelection(null);
-		}
-		Element element = (Element) structuredSelection.getFirstElement();
-		return new OverrideTestsSelection(element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/**
-	 * Notify the selection changed listeners that a selection change has
-	 * occurred.
-	 * 
-	 * @param event
-	 *            the selection change event.
-	 */
-	public void selectionChanged(final SelectionChangedEvent event) {
-		// pass on the notification to listeners
-		Object[] listeners = selectionChangedListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
-			l.selectionChanged(event);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		viewer.setSelection(selection);
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsView.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsView.java
deleted file mode 100644
index 77b144e..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/OverrideTestsView.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.tests.views.properties.tabbed.override.folders.OverrideTestsTabFolderPropertySheetPage;
-import org.eclipse.ui.tests.views.properties.tabbed.views.TestsPerspective;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * The override tests view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class OverrideTestsView extends ViewPart implements
-		ITabbedPropertySheetPageContributor, ISelectionChangedListener {
-
-	public static final String OVERRIDE_TESTS_VIEW_ID = "org.eclipse.ui.tests.views.properties.tabbed.override.OverrideTestsView"; //$NON-NLS-1$
-
-	private OverrideTestsContentProvider overrideTestsContentProvider;
-
-	private ArrayList selection = new ArrayList();
-
-	private OverrideTestsSelectionProvider selectionProvider;
-
-	private TabbedPropertySheetPage tabbedPropertySheetPage;
-
-	private TableViewer viewer;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL |
-				SWT.V_SCROLL);
-		overrideTestsContentProvider = new OverrideTestsContentProvider();
-		viewer.setContentProvider(overrideTestsContentProvider);
-		viewer.setLabelProvider(new OverrideTestsLabelProvider());
-		viewer.setInput(getViewSite());
-		selectionProvider = new OverrideTestsSelectionProvider(viewer);
-		getSite().setSelectionProvider(selectionProvider);
-		selection.add(viewer);
-		viewer.addSelectionChangedListener(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (IPropertySheetPage.class.equals(adapter)) {
-			if (TestsPerspective.TESTS_PERSPECTIVE_ID.equals(getSite()
-					.getWorkbenchWindow().getActivePage().getPerspective()
-					.getId())) {
-				if (tabbedPropertySheetPage == null) {
-					tabbedPropertySheetPage = new TabbedPropertySheetPage(this);
-				}
-				return tabbedPropertySheetPage;
-			}
-			return new OverrideTestsTabFolderPropertySheetPage();
-		}
-		return super.getAdapter(adapter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor#getContributorId()
-	 */
-	public String getContributorId() {
-		return "org.eclipse.ui.tests.views.properties.tabbed.override"; //$NON-NLS-1$
-	}
-
-	/**
-	 * Get the currently selected element in the view.
-	 * 
-	 * @return the currently selected element in the view.
-	 */
-	public ISelection getSelection() {
-		return selectionProvider.getSelection();
-	}
-
-	/**
-	 * Get the tabbed property sheet page for the view.
-	 * 
-	 * @return the tabbed property sheet page for the view.
-	 */
-	public TabbedPropertySheetPage getTabbedPropertySheetPage() {
-		return tabbedPropertySheetPage;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		SelectionChangedEvent newEvent = new SelectionChangedEvent(
-				selectionProvider, selectionProvider.getSelection());
-		selectionProvider.selectionChanged(newEvent);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		viewer.getControl().setFocus();
-	}
-
-	/**
-	 * Set the selected element to be the same type as the provided class.
-	 * 
-	 * @param elementClass
-	 *            the provided class.
-	 */
-	public void setSelection(Class elementClass) {
-		if (elementClass == null) {
-			viewer.setSelection(StructuredSelection.EMPTY);
-		}
-		Object[] elements = overrideTestsContentProvider.getElements(null);
-		for (int i = 0; i < elements.length; i++) {
-			Element element = (Element) elements[i];
-			Class clazz = element.getClass();
-			if (elementClass == clazz) {
-				StructuredSelection newSelection = new StructuredSelection(
-						element);
-				viewer.setSelection(newSelection);
-				break;
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/AbstractTabFolder.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/AbstractTabFolder.java
deleted file mode 100644
index 164426d..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/AbstractTabFolder.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.folders;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem;
-
-/**
- * The abstract implementation of a TabFolder.
- * <p>
- * The OverrideTestsTabFolderPropertySheetPage example is a before look at the
- * properties view before the migration to the tabbed properties view and the
- * override tabs support. When elements are selected in the OverrideTestsView,
- * TabFolder/TabItem are displayed for the elements.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public abstract class AbstractTabFolder implements IOverrideTestsTabFolder {
-
-	private ListenerList itemSelectionListeners = new ListenerList();
-
-	private CTabFolder tabFolder;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see asd.views.folders.ISampleViewFolder#addSampleViewItemSelectionListener(asd.views.folders.ISampleViewItemSelectionListener)
-	 */
-	public void addItemSelectionListener(
-			IOverrideTestsTabItemSelectionListener listener) {
-		itemSelectionListeners.add(listener);
-	}
-
-	/**
-	 * Determines if this folder applies to the element.
-	 * 
-	 * @param element
-	 *            the element.
-	 * @return <code>true</code> if this folder applies to the element.
-	 */
-	public boolean appliesTo(Element element) {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see asd.views.folders.IAaaFolder#createControls(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControls(Composite composite) {
-		tabFolder = new CTabFolder(composite, SWT.NONE);
-
-		IOverrideTestsItem[] items = getItem();
-
-		for (int i = 0; i < items.length; i++) {
-			CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE);
-			items[i].createControls(tabFolder);
-			tabItem.setText(items[i].getText());
-			tabItem.setImage(items[i].getImage());
-			tabItem.setControl(items[i].getComposite());
-			tabItem.setData(items[i]);
-		}
-		tabFolder.setSelection(0);
-
-		tabFolder.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				CTabItem aTabItem = (CTabItem) e.item;
-				Object[] listeners = itemSelectionListeners.getListeners();
-				for (int i = 0; i < listeners.length; i++) {
-					IOverrideTestsTabItemSelectionListener listener = (IOverrideTestsTabItemSelectionListener) listeners[i];
-					listener.itemSelected((IOverrideTestsItem) aTabItem
-							.getData());
-				}
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see asd.views.folders.IAaaFolder#dispose()
-	 */
-	public void dispose() {
-		tabFolder.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see asd.views.folders.ISampleViewFolder#removeSampleViewItemSelectionListener(asd.views.folders.ISampleViewItemSelectionListener)
-	 */
-	public void removeItemSelectionListener(
-			IOverrideTestsTabItemSelectionListener listener) {
-		itemSelectionListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see asd.views.folders.IAaaFolder#selectionChanged(asd.views.elements.IAaaElement)
-	 */
-	public void selectionChanged(Element element) {
-		CTabItem[] items = tabFolder.getItems();
-		for (int i = 0; i < items.length; i++) {
-			CTabItem tabItem = items[i];
-			if (((IOverrideTestsItem) tabItem.getData()).getText().equals(
-					element.getName())) {
-				tabFolder.setSelection(tabItem);
-			}
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/AdvancedTabFolder.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/AdvancedTabFolder.java
deleted file mode 100644
index e46ce7c..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/AdvancedTabFolder.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.folders;
-
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.tests.views.properties.tabbed.model.File;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Folder;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.FileItem;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.FolderItem;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem;
-
-/**
- * The advanced TabFolder is displayed when Information, Warning or Error is the
- * selected element in the override tests view.
- * <p>
- * The OverrideTestsTabFolderPropertySheetPage example is a before look at the
- * properties view before the migration to the tabbed properties view and the
- * override tabs support. When elements are selected in the OverrideTestsView,
- * TabFolder/TabItem are displayed for the elements.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class AdvancedTabFolder extends AbstractTabFolder {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see asd.views.folders.AbstractSampleViewFolder#appliesTo(asd.views.elements.ISampleViewElement)
-	 */
-	public boolean appliesTo(Element element) {
-		return ((element instanceof File) || (element instanceof Folder));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see asd.views.folders.IAaaFolder#getAaaItem()
-	 */
-	public IOverrideTestsItem[] getItem() {
-		return new IOverrideTestsItem[] { new FileItem(), new FolderItem() };
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/BasicTabFolder.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/BasicTabFolder.java
deleted file mode 100644
index 27dac06..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/BasicTabFolder.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.folders;
-
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Error;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Information;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Warning;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.ErrorItem;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.InformationItem;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.WarningItem;
-
-/**
- * The basic TabFolder is displayed when Information, Warning or Error is the
- * selected element in the override tests view.
- * <p>
- * The OverrideTestsTabFolderPropertySheetPage example is a before look at the
- * properties view before the migration to the tabbed properties view and the
- * override tabs support. When elements are selected in the OverrideTestsView,
- * TabFolder/TabItem are displayed for the elements.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class BasicTabFolder extends AbstractTabFolder {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see asd.views.folders.AbstractSampleViewFolder#appliesTo(asd.views.elements.ISampleViewElement)
-	 */
-	public boolean appliesTo(Element element) {
-		return ((element instanceof Information) ||
-				(element instanceof Warning) || (element instanceof Error));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see asd.views.folders.IAaaFolder#getAaaItem()
-	 */
-	public IOverrideTestsItem[] getItem() {
-		return new IOverrideTestsItem[] { new InformationItem(),
-				new WarningItem(), new ErrorItem() };
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/EmptyTabFolder.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/EmptyTabFolder.java
deleted file mode 100644
index c2063d0..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/EmptyTabFolder.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.folders;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.tests.views.properties.tabbed.override.OverrideTestsView;
-
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.EmptyItem;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem;
-
-/**
- * The empty TabFolder is displayed when there is no selected element in the
- * override tests view.
- * <p>
- * The OverrideTestsTabFolderPropertySheetPage example is a before look at the
- * properties view before the migration to the tabbed properties view and the
- * override tabs support. When elements are selected in the OverrideTestsView,
- * TabFolder/TabItem are displayed for the elements.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class EmptyTabFolder extends AbstractTabFolder {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see asd.views.folders.ISampleViewFolder#appliesTo(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		if (part instanceof OverrideTestsView) {
-			if (selection instanceof IStructuredSelection) {
-				IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-				if (structuredSelection.equals(StructuredSelection.EMPTY)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	public IOverrideTestsItem[] getItem() {
-		return new IOverrideTestsItem[] { new EmptyItem() };
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/IOverrideTestsTabFolder.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/IOverrideTestsTabFolder.java
deleted file mode 100644
index 63072b1..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/IOverrideTestsTabFolder.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.folders;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem;
-
-/**
- * Interface for a TabFolder used by the properties view for the
- * TabFolder/TabItem example.
- * <p>
- * The OverrideTestsTabFolderPropertySheetPage example is a before look at the
- * properties view before the migration to the tabbed properties view and the
- * override tabs support. When elements are selected in the OverrideTestsView,
- * TabFolder/TabItem are displayed for the elements.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public interface IOverrideTestsTabFolder {
-	/**
-	 * Add the listener from the item selection listeners.
-	 * 
-	 * @param listener
-	 *            the item selection listener.
-	 */
-	public void addItemSelectionListener(
-			IOverrideTestsTabItemSelectionListener listener);
-
-	/**
-	 * Determines if this folder applies to the element.
-	 * 
-	 * @param element
-	 *            the element.
-	 * @return <code>true</code> if this folder applies to the element.
-	 */
-	public boolean appliesTo(Element element);
-
-	/**
-	 * Creates the controls for the folder.
-	 * 
-	 * @param parent
-	 *            the parent composite for the contents.
-	 */
-	public void createControls(Composite parent);
-
-	/**
-	 * Dispose the controls for the folder.
-	 */
-	public void dispose();
-
-	/**
-	 * Get the items for this folder.
-	 * 
-	 * @return the items for this folder.
-	 */
-	public IOverrideTestsItem[] getItem();
-
-	/**
-	 * Remove the listener from the item selection listeners.
-	 * 
-	 * @param listener
-	 *            the item selection listener.
-	 */
-	public void removeItemSelectionListener(
-			IOverrideTestsTabItemSelectionListener listener);
-
-	/**
-	 * Notifies the folder that the selected element has changed.
-	 * 
-	 * @param element
-	 *            the selected element.
-	 */
-	public void selectionChanged(Element element);
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/IOverrideTestsTabItemSelectionListener.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/IOverrideTestsTabItemSelectionListener.java
deleted file mode 100644
index 15f2e12..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/IOverrideTestsTabItemSelectionListener.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.folders;
-
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem;
-
-/**
- * An item selection listener.
- * <p>
- * The OverrideTestsTabFolderPropertySheetPage example is a before look at the
- * properties view before the migration to the tabbed properties view and the
- * override tabs support. When elements are selected in the OverrideTestsView,
- * TabFolder/TabItem are displayed for the elements.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public interface IOverrideTestsTabItemSelectionListener {
-	/**
-	 * Notifies this listener that the selected item has changed.
-	 * 
-	 * @param key
-	 *            the name of the selected item.
-	 */
-	public void itemSelected(IOverrideTestsItem item);
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/OverrideTestsTabFolderPropertySheetPage.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/OverrideTestsTabFolderPropertySheetPage.java
deleted file mode 100644
index 2578bb3..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/OverrideTestsTabFolderPropertySheetPage.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.folders;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-
-/**
- * The OverrideTestsTabFolderPropertySheetPage example is a before look at the
- * properties view before the migration to the tabbed properties view and the
- * override tabs support. When elements are selected in the OverrideTestsView,
- * TabFolder/TabItem are displayed for the elements.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class OverrideTestsTabFolderPropertySheetPage implements
-		IPropertySheetPage {
-
-	private Composite composite;
-
-	private OverrideTestsTabFolderPropertySheetPageContentManager contentManager;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new FillLayout());
-		contentManager = new OverrideTestsTabFolderPropertySheetPageContentManager(
-				composite);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.IPage#dispose()
-	 */
-	public void dispose() {
-		composite.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.IPage#getControl()
-	 */
-	public Control getControl() {
-		return composite;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		contentManager.selectionChanged(part, selection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.IPage#setActionBars(org.eclipse.ui.IActionBars)
-	 */
-	public void setActionBars(IActionBars actionBars) {
-		// Not implemented
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.IPage#setFocus()
-	 */
-	public void setFocus() {
-		composite.setFocus();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/OverrideTestsTabFolderPropertySheetPageContentManager.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/OverrideTestsTabFolderPropertySheetPageContentManager.java
deleted file mode 100644
index c472fa6..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/folders/OverrideTestsTabFolderPropertySheetPageContentManager.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.folders;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.tests.views.properties.tabbed.override.OverrideTestsSelection;
-import org.eclipse.ui.tests.views.properties.tabbed.override.OverrideTestsView;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem;
-
-/**
- * The content manager for the override tests property sheet page.
- * <p>
- * The OverrideTestsTabFolderPropertySheetPage example is a before look at the
- * properties view before the migration to the tabbed properties view and the
- * override tabs support. When elements are selected in the OverrideTestsView,
- * TabFolder/TabItem are displayed for the elements.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class OverrideTestsTabFolderPropertySheetPageContentManager implements
-		IOverrideTestsTabItemSelectionListener {
-
-	private IOverrideTestsTabFolder activeFolder;
-
-	private Composite composite;
-
-	private IOverrideTestsTabFolder emptyFolder;
-
-	private IOverrideTestsTabFolder[] folders;
-
-	private OverrideTestsView overrideTestsView;
-
-	public OverrideTestsTabFolderPropertySheetPageContentManager(
-			Composite parent) {
-		this.composite = parent;
-		this.folders = new IOverrideTestsTabFolder[] { new BasicTabFolder(),
-				new AdvancedTabFolder() };
-		this.emptyFolder = new EmptyTabFolder();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see asd.views.folders.ISampleViewItemSelectionListener#selectionChanged(java.lang.String)
-	 */
-	public void itemSelected(IOverrideTestsItem item) {
-		overrideTestsView.setSelection(item.getElement());
-	}
-
-	/**
-	 * Notifies the content manager that the selection has changed.
-	 * 
-	 * @param part
-	 *            the workbench part containing the selection
-	 * @param selection
-	 *            the current selection.
-	 */
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		Assert.isTrue(part instanceof OverrideTestsView);
-		this.overrideTestsView = (OverrideTestsView) part;
-		Assert.isTrue(selection instanceof OverrideTestsSelection);
-		Element element = ((OverrideTestsSelection) selection).getElement();
-		IOverrideTestsTabFolder newFolder = null;
-
-		if (element == null) {
-			newFolder = emptyFolder;
-		} else {
-			for (int i = 0; i < folders.length; i++) {
-				if (folders[i].appliesTo(element)) {
-					newFolder = folders[i];
-					break;
-				}
-			}
-		}
-
-		Assert.isTrue(newFolder != null);
-		if (newFolder != activeFolder) {
-			if (activeFolder != null) {
-				activeFolder.removeItemSelectionListener(this);
-				activeFolder.dispose();
-			}
-			activeFolder = newFolder;
-			newFolder.createControls(composite);
-			composite.layout(true);
-			activeFolder.addItemSelectionListener(this);
-		}
-		if (element != null) {
-			activeFolder.selectionChanged(element);
-		}
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/EmptyItem.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/EmptyItem.java
deleted file mode 100644
index da1dddb..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/EmptyItem.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.items;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-
-/**
- * An item for the emply selection when there is no selected element in the
- * override tests view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class EmptyItem implements IOverrideTestsItem {
-
-	private Composite composite;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#createControls(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControls(Composite parent) {
-		TabbedPropertySheetWidgetFactory factory = new TabbedPropertySheetWidgetFactory();
-		composite = factory.createFlatFormComposite(parent);
-		Label label = factory.createLabel(composite,
-				"Empty Item (no selected element)"); //$NON-NLS-1$
-		label.setLayoutData(new FormData());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#dispose()
-	 */
-	public void dispose() {
-		if (composite != null && !composite.isDisposed()) {
-			composite.dispose();
-			composite = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#getComposite()
-	 */
-	public Composite getComposite() {
-		return composite;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#getElement()
-	 */
-	public Class getElement() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#getImage()
-	 */
-	public Image getImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#getText()
-	 */
-	public String getText() {
-		return "Empty Item"; //$NON-NLS-1$
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/ErrorItem.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/ErrorItem.java
deleted file mode 100644
index f6d9905..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/ErrorItem.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.items;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Error;
-
-/**
- * An item for when the Error element is the selected element in the override
- * tests view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class ErrorItem extends InformationItem {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.InformationItem#getElement()
-	 */
-	public Class getElement() {
-		return Error.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.InformationItem#getImage()
-	 */
-	public Image getImage() {
-		return PlatformUI.getWorkbench().getSharedImages().getImage(
-				ISharedImages.IMG_OBJS_ERROR_TSK);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.InformationItem#getText()
-	 */
-	public String getText() {
-		return "Error"; //$NON-NLS-1$
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/FileItem.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/FileItem.java
deleted file mode 100644
index 3621f82..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/FileItem.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.items;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.views.properties.tabbed.model.File;
-
-/**
- * An item for when the File element is the selected element in the override
- * tests view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class FileItem extends InformationItem {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.InformationItem#getElement()
-	 */
-	public Class getElement() {
-		return File.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.InformationItem#getImage()
-	 */
-	public Image getImage() {
-		return PlatformUI.getWorkbench().getSharedImages().getImage(
-				ISharedImages.IMG_OBJ_FILE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.InformationItem#getText()
-	 */
-	public String getText() {
-		return "File"; //$NON-NLS-1$
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/FolderItem.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/FolderItem.java
deleted file mode 100644
index aac32a3..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/FolderItem.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.items;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Folder;
-
-/**
- * An item for when the Folder element is the selected element in the override
- * tests view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class FolderItem extends InformationItem {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.InformationItem#getElement()
-	 */
-	public Class getElement() {
-		return Folder.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.InformationItem#getImage()
-	 */
-	public Image getImage() {
-		return PlatformUI.getWorkbench().getSharedImages().getImage(
-				ISharedImages.IMG_OBJ_FOLDER);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.InformationItem#getText()
-	 */
-	public String getText() {
-		return "Folder"; //$NON-NLS-1$
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/IOverrideTestsItem.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/IOverrideTestsItem.java
deleted file mode 100644
index 31fde69..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/IOverrideTestsItem.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.items;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Interface for an item used by the properties view for the override tabs
- * tests.
- * <p>
- * When the TabbedPropertySheetPage is used by the OverrideTestsView tests view,
- * each item is displayed in a ISection.
- * <p>
- * The OverrideTestsTabFolderPropertySheetPage example uses the items to display
- * in TabFolder/TabItem.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public interface IOverrideTestsItem {
-
-	/**
-	 * Creates the controls for the item.
-	 * 
-	 * @param parent
-	 *            the parent composite for the item.
-	 * @param factory
-	 *            the factory to create widgets for the item.
-	 */
-	public void createControls(Composite parent);
-
-	/**
-	 * Dispose the controls for the item.
-	 */
-	public void dispose();
-
-	/**
-	 * Get the root composite for the item.
-	 * 
-	 * @return the root composite for the item.
-	 */
-	public Composite getComposite();
-
-	/**
-	 * Get the kind of {@link Element} that this item applies to.
-	 * 
-	 * @return the kind of {@link Element} that this item applies to.
-	 */
-	public Class getElement();
-
-	/**
-	 * Get the icon image for the item.
-	 * 
-	 * @return the icon image for the item.
-	 */
-	public Image getImage();
-
-	/**
-	 * Get the text label for the item.
-	 * 
-	 * @return the text label for the item.
-	 */
-	public String getText();
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/InformationItem.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/InformationItem.java
deleted file mode 100644
index 36183ca..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/InformationItem.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.items;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-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.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Information;
-
-/**
- * An item for when the Information element is the selected element in the
- * override tests view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class InformationItem implements IOverrideTestsItem {
-
-	private Composite composite;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#createControls(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControls(Composite parent) {
-		FormToolkit toolkit = new FormToolkit(parent.getDisplay());
-		composite = toolkit.createComposite(parent);
-		composite.setLayout(new FillLayout());
-
-		ScrolledForm form = toolkit.createScrolledForm(composite);
-		form.getBody().setLayout(new TableWrapLayout());
-
-		Section section = toolkit.createSection(form.getBody(),
-				Section.DESCRIPTION);
-		TableWrapData td = new TableWrapData(TableWrapData.FILL,
-				TableWrapData.TOP);
-		td.grabHorizontal = true;
-		section.setLayoutData(td);
-		section.setText(getText() + " Properties"); //$NON-NLS-1$
-		toolkit.createCompositeSeparator(section);
-		section.setDescription("Set the properties of the selected " + //$NON-NLS-1$
-				getText() + " element.");//$NON-NLS-1$
-
-		Composite sectionClient = toolkit.createComposite(section);
-		FormLayout layout = new FormLayout();
-		layout.marginWidth = 5;
-		layout.marginHeight = 5;
-		layout.spacing = 2;
-		sectionClient.setLayout(layout);
-		section.setClient(sectionClient);
-		toolkit.paintBordersFor(sectionClient);
-
-		Button radioLeft = toolkit.createButton(sectionClient, "Choice 1",//$NON-NLS-1$
-				SWT.RADIO);
-		FormData data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.top = new FormAttachment(0, 5);
-		radioLeft.setLayoutData(data);
-
-		Button radioRight = toolkit.createButton(sectionClient, "Choice 2",//$NON-NLS-1$
-				SWT.RADIO);
-		data = new FormData();
-		data.left = new FormAttachment(radioLeft, 5);
-		data.top = new FormAttachment(0, 5);
-		radioRight.setLayoutData(data);
-
-		Button radioRight2 = toolkit.createButton(sectionClient, "Choice 3",//$NON-NLS-1$
-				SWT.RADIO);
-		data = new FormData();
-		data.left = new FormAttachment(radioRight, 5);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, 5);
-		radioRight2.setLayoutData(data);
-
-		Button flag = toolkit.createButton(sectionClient,
-				"Value of the flag property", SWT.CHECK);//$NON-NLS-1$
-		data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(radioLeft, 5);
-		flag.setLayoutData(data);
-
-		Label nameLabel = toolkit.createLabel(sectionClient, "Text Property:"); //$NON-NLS-1$
-		data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.top = new FormAttachment(flag, 5);
-		nameLabel.setLayoutData(data);
-
-		Text nameText = toolkit.createText(sectionClient, ""); //$NON-NLS-1$
-		data = new FormData();
-		data.left = new FormAttachment(nameLabel, 5);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(flag, 5);
-		nameText.setLayoutData(data);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#dispose()
-	 */
-	public void dispose() {
-		if (composite != null && !composite.isDisposed()) {
-			composite.dispose();
-			composite = null;
-		}
-	}
-
-	public Composite getComposite() {
-		return composite;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#getElement()
-	 */
-	public Class getElement() {
-		return Information.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#getImage()
-	 */
-	public Image getImage() {
-		return PlatformUI.getWorkbench().getSharedImages().getImage(
-				ISharedImages.IMG_OBJS_INFO_TSK);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#getText()
-	 */
-	public String getText() {
-		return "Information"; //$NON-NLS-1$
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/WarningItem.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/WarningItem.java
deleted file mode 100644
index 102d280..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/items/WarningItem.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.items;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Warning;
-
-/**
- * An item for when the Warning element is the selected element in the override
- * tests view.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class WarningItem extends InformationItem {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.InformationItem#getElement()
-	 */
-	public Class getElement() {
-		return Warning.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.InformationItem#getImage()
-	 */
-	public Image getImage() {
-		return PlatformUI.getWorkbench().getSharedImages().getImage(
-				ISharedImages.IMG_OBJS_WARN_TSK);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.InformationItem#getText()
-	 */
-	public String getText() {
-		return "Warning"; //$NON-NLS-1$
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/AbstractTabList.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/AbstractTabList.java
deleted file mode 100644
index fde823a..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/AbstractTabList.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.tablist;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem;
-import org.eclipse.ui.views.properties.tabbed.ITabItem;
-
-/**
- * The abstract implementation of a tab list.
- * <p>
- * The OverrideTestsView TabbedPropertySheetPage example is a look at the
- * properties view after the migration of a TabFolder/TabItem framework to the
- * tabbed properties view. In the case of a TabFolder, the folder (provider)
- * knows both the tab labels and tab items. This aligns to the tabbed properties
- * view, but the tab labels are tab descriptors and tab items are section
- * descriptions. This does not work with the default framework as the tabs
- * provide the sections. In this case, the IOverridableTabListContentProvider
- * framework has been provided.
- * <p>
- * The overridable tab list is a content provider that provides both the
- * sections and the tab labels.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public abstract class AbstractTabList implements IOverrideTestsTabList {
-
-	private Composite composite;
-
-	private int selectedTabItem;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.tablist.IOverrideTestsTabList#appliesTo(org.eclipse.ui.tests.views.properties.tabbed.model.Element)
-	 */
-	public boolean appliesTo(Element element) {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.tablist.IOverrideTestsTabList#createControls(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControls(Composite parent) {
-		this.composite = parent;
-		OverrideTestsTabItem activeTab = (OverrideTestsTabItem) (getTabs()[selectedTabItem]);
-		activeTab.getItem().createControls(parent);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.tablist.IOverrideTestsTabList#dispose()
-	 */
-	public void dispose() {
-		OverrideTestsTabItem activeTab = (OverrideTestsTabItem) (getTabs()[selectedTabItem]);
-		activeTab.getItem().dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.IOverridableTabList#getTabs()
-	 */
-	public ITabItem[] getTabs() {
-		IOverrideTestsItem[] items = getItems();
-		OverrideTestsTabItem[] tabs = new OverrideTestsTabItem[items.length];
-
-		for (int i = 0; i < items.length; i++) {
-			tabs[i] = new OverrideTestsTabItem(items[i]);
-			if (i == selectedTabItem) {
-				tabs[i].setSelected(true);
-			}
-		}
-
-		return tabs;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.tablist.IOverrideTestsTabList#selectionChanged(org.eclipse.ui.tests.views.properties.tabbed.model.Element)
-	 */
-	public void selectionChanged(Element element) {
-		ITabItem[] tabs = getTabs();
-		for (int i = 0; i < tabs.length; i++) {
-			if (tabs[i].getText().equals(element.getName())) {
-				selectedTabItem = i;
-				break;
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.IOverridableTabList#selectTab(int)
-	 */
-	public void selectTab(int index) {
-		if (selectedTabItem == index) {
-			return;
-		}
-		OverrideTestsTabItem activeTab = (OverrideTestsTabItem) (getTabs()[selectedTabItem]);
-		activeTab.getItem().dispose();
-
-		selectedTabItem = index;
-
-		activeTab = (OverrideTestsTabItem) (getTabs()[selectedTabItem]);
-		activeTab.getItem().createControls(composite);
-		composite.layout(true);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/AdvancedTabList.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/AdvancedTabList.java
deleted file mode 100644
index fbe5094..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/AdvancedTabList.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.tablist;
-
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.tests.views.properties.tabbed.model.File;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Folder;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.FileItem;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.FolderItem;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem;
-
-/**
- * The advanced tab list is displayed when Information, Warning or Error is the
- * selected element in the override tests view.
- * <p>
- * The OverrideTestsView TabbedPropertySheetPage example is a look at the
- * properties view after the migration of a TabFolder/TabItem framework to the
- * tabbed properties view. In the case of a TabFolder, the folder (provider)
- * knows both the tab labels and tab items. This aligns to the tabbed properties
- * view, but the tab labels are tab descriptors and tab items are section
- * descriptions. This does not work with the default framework as the tabs
- * provide the sections. In this case, the IOverridableTabListContentProvider
- * framework has been provided.
- * <p>
- * The overridable tab list is a content provider that provides both the
- * sections and the tab labels.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class AdvancedTabList extends AbstractTabList {
-
-	private IOverrideTestsItem[] items;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.tablist.AbstractTabList#appliesTo(org.eclipse.ui.tests.views.properties.tabbed.model.Element)
-	 */
-	public boolean appliesTo(Element element) {
-		return ((element instanceof File) || (element instanceof Folder));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.tablist.IOverrideTestsTabList#getItems()
-	 */
-	public IOverrideTestsItem[] getItems() {
-		if (items == null) {
-			items = new IOverrideTestsItem[] { new FileItem(), new FolderItem() };
-		}
-		return items;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/BasicTabList.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/BasicTabList.java
deleted file mode 100644
index fca052e..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/BasicTabList.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.tablist;
-
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Error;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Information;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Warning;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.ErrorItem;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.InformationItem;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.WarningItem;
-
-/**
- * The basic tab list is displayed when Information, Warning or Error is the
- * selected element in the override tests view.
- * <p>
- * The OverrideTestsView TabbedPropertySheetPage example is a look at the
- * properties view after the migration of a TabFolder/TabItem framework to the
- * tabbed properties view. In the case of a TabFolder, the folder (provider)
- * knows both the tab labels and tab items. This aligns to the tabbed properties
- * view, but the tab labels are tab descriptors and tab items are section
- * descriptions. This does not work with the default framework as the tabs
- * provide the sections. In this case, the IOverridableTabListContentProvider
- * framework has been provided.
- * <p>
- * The overridable tab list is a content provider that provides both the
- * sections and the tab labels.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class BasicTabList extends AbstractTabList {
-
-	private IOverrideTestsItem[] overrideTestsItems;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.tablist.AbstractTabList#appliesTo(org.eclipse.ui.tests.views.properties.tabbed.model.Element)
-	 */
-	public boolean appliesTo(Element element) {
-		return ((element instanceof Information) ||
-				(element instanceof Warning) || (element instanceof Error));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.tablist.IOverrideTestsTabList#getItems()
-	 */
-	public IOverrideTestsItem[] getItems() {
-		if (overrideTestsItems == null) {
-			overrideTestsItems = new IOverrideTestsItem[] {
-					new InformationItem(), new WarningItem(), new ErrorItem() };
-		}
-		return overrideTestsItems;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/EmptyTabList.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/EmptyTabList.java
deleted file mode 100644
index 64778c2..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/EmptyTabList.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.tablist;
-
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.EmptyItem;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem;
-
-/**
- * The empty tab list is displayed when there is no selected element in the
- * override tests view.
- * <p>
- * The OverrideTestsView TabbedPropertySheetPage example is a look at the
- * properties view after the migration of a TabFolder/TabItem framework to the
- * tabbed properties view. In the case of a TabFolder, the folder (provider)
- * knows both the tab labels and tab items. This aligns to the tabbed properties
- * view, but the tab labels are tab descriptors and tab items are section
- * descriptions. This does not work with the default framework as the tabs
- * provide the sections. In this case, the IOverridableTabListContentProvider
- * framework has been provided.
- * <p>
- * The overridable tab list is a content provider that provides both the
- * sections and the tab labels.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class EmptyTabList extends AbstractTabList {
-
-	private IOverrideTestsItem[] sampleViewItems;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.tablist.AbstractTabList#appliesTo(org.eclipse.ui.tests.views.properties.tabbed.model.Element)
-	 */
-	public boolean appliesTo(Element element) {
-		if (element == null) {
-			return true;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.tablist.IOverrideTestsTabList#getItems()
-	 */
-	public IOverrideTestsItem[] getItems() {
-		if (sampleViewItems == null) {
-			sampleViewItems = new IOverrideTestsItem[] { new EmptyItem() };
-		}
-		return sampleViewItems;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/IOverrideTestsTabList.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/IOverrideTestsTabList.java
deleted file mode 100644
index 80a9bc9..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/IOverrideTestsTabList.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.tablist;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem;
-import org.eclipse.ui.views.properties.tabbed.IOverridableTabList;
-
-/**
- * Interface for a tab list used by the tabbed properties view for the override
- * tests example.
- * <p>
- * The OverrideTestsView TabbedPropertySheetPage example is a look at the
- * properties view after the migration of a TabFolder/TabItem framework to the
- * tabbed properties view. In the case of a TabFolder, the folder (provider)
- * knows both the tab labels and tab items. This aligns to the tabbed properties
- * view, but the tab labels are tab descriptors and tab items are section
- * descriptions. This does not work with the default framework as the tabs
- * provide the sections. In this case, the IOverridableTabListContentProvider
- * framework has been provided.
- * <p>
- * The overridable tab list is a content provider that provides both the
- * sections and the tab labels.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public interface IOverrideTestsTabList extends IOverridableTabList {
-
-	/**
-	 * Determines if this tab list applies to the element.
-	 * 
-	 * @param element
-	 *            the element.
-	 * @return <code>true</code> if this folder applies to the element.
-	 */
-	public boolean appliesTo(Element element);
-
-	/**
-	 * Creates the controls for the tab list.
-	 * 
-	 * @param parent
-	 *            the parent composite for the contents.
-	 */
-	public void createControls(Composite parent);
-
-	/**
-	 * Dispose the controls for the tab list.
-	 */
-	public void dispose();
-
-	/**
-	 * Get the items for this tab list.
-	 * 
-	 * @return the items for this tab list.
-	 */
-	public IOverrideTestsItem[] getItems();
-
-	/**
-	 * Notifies the tab list that the selected element has changed.
-	 * 
-	 * @param element
-	 *            the selected element.
-	 */
-	public void selectionChanged(Element element);
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/OverrideTestsSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/OverrideTestsSection.java
deleted file mode 100644
index efb770c..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/OverrideTestsSection.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.tablist;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.AbstractOverridableTabListPropertySection;
-import org.eclipse.ui.views.properties.tabbed.ITabItem;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * Section for a tab list used by the tabbed properties view for the override
- * tests example.
- * <p>
- * The OverrideTestsView TabbedPropertySheetPage example is a look at the
- * properties view after the migration of a TabFolder/TabItem framework to the
- * tabbed properties view. In the case of a TabFolder, the folder (provider)
- * knows both the tab labels and tab items. This aligns to the tabbed properties
- * view, but the tab labels are tab descriptors and tab items are section
- * descriptions. This does not work with the default framework as the tabs
- * provide the sections. In this case, the IOverridableTabListContentProvider
- * framework has been provided.
- * <p>
- * The overridable tab list is a content provider that provides both the
- * sections and the tab labels.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class OverrideTestsSection extends
-		AbstractOverridableTabListPropertySection {
-	private OverrideTestsTabListsContentsManager contentsManager;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		contentsManager = new OverrideTestsTabListsContentsManager(parent,
-				tabbedPropertySheetPage, this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#dispose()
-	 */
-	public void dispose() {
-		if (contentsManager != null) {
-			contentsManager.dispose();
-			contentsManager = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractOverridableTabListPropertySection#getTabs()
-	 */
-	public ITabItem[] getTabs() {
-		if (contentsManager != null) {
-			return contentsManager.getTabs();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractOverridableTabListPropertySection#selectTab(int)
-	 */
-	public void selectTab(int index) {
-		if (contentsManager != null) {
-			contentsManager.selectTab(index);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#setInput(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		if (contentsManager != null) {
-			contentsManager.selectionChanged(getPart(), getSelection());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#shouldUseExtraSpace()
-	 */
-	public boolean shouldUseExtraSpace() {
-		return true;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/OverrideTestsSectionDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/OverrideTestsSectionDescriptor.java
deleted file mode 100644
index 46e5cc8..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/OverrideTestsSectionDescriptor.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.tablist;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-
-/**
- * Section descriptor for the override tests example.
- * <p>
- * The OverrideTestsView TabbedPropertySheetPage example is a look at the
- * properties view after the migration of a TabFolder/TabItem framework to the
- * tabbed properties view. In the case of a TabFolder, the folder (provider)
- * knows both the tab labels and tab items. This aligns to the tabbed properties
- * view, but the tab labels are tab descriptors and tab items are section
- * descriptions. This does not work with the default framework as the tabs
- * provide the sections. In this case, the IOverridableTabListContentProvider
- * framework has been provided.
- * <p>
- * The overridable tab list is a content provider that provides both the
- * sections and the tab labels.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class OverrideTestsSectionDescriptor extends AbstractSectionDescriptor {
-
-	private ISection section;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getId()
-	 */
-	public String getId() {
-		return "org.eclipse.ui.tests.views.properties.tabbed.override"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getSectionClass()
-	 */
-	public ISection getSectionClass() {
-		if (section == null) {
-			this.section = new OverrideTestsSection();
-		}
-		return section;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptor#getTargetTab()
-	 */
-	public String getTargetTab() {
-		return "org.eclipse.ui.tests.views.properties.tabbed.override"; //$NON-NLS-1$
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/OverrideTestsSectionDescriptorProvider.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/OverrideTestsSectionDescriptorProvider.java
deleted file mode 100644
index dcc17c6..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/OverrideTestsSectionDescriptorProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.tablist;
-
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptorProvider;
-
-/**
- * Section descriptor provider for the override tests example.
- * <p>
- * The OverrideTestsView TabbedPropertySheetPage example is a look at the
- * properties view after the migration of a TabFolder/TabItem framework to the
- * tabbed properties view. In the case of a TabFolder, the folder (provider)
- * knows both the tab labels and tab items. This aligns to the tabbed properties
- * view, but the tab labels are tab descriptors and tab items are section
- * descriptions. This does not work with the default framework as the tabs
- * provide the sections. In this case, the IOverridableTabListContentProvider
- * framework has been provided.
- * <p>
- * The overridable tab list is a content provider that provides both the
- * sections and the tab labels.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class OverrideTestsSectionDescriptorProvider implements
-		ISectionDescriptorProvider {
-
-	private ISectionDescriptor[] sectionDescriptors;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.ISectionDescriptorProvider#getSectionDescriptors()
-	 */
-	public ISectionDescriptor[] getSectionDescriptors() {
-		if (sectionDescriptors == null) {
-			sectionDescriptors = new ISectionDescriptor[] { new OverrideTestsSectionDescriptor() };
-		}
-		return sectionDescriptors;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/OverrideTestsTabItem.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/OverrideTestsTabItem.java
deleted file mode 100644
index 10c86f1..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/OverrideTestsTabItem.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.tablist;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem;
-import org.eclipse.ui.views.properties.tabbed.ITabItem;
-
-/**
- * A tab item for the override tests example.
- * <p>
- * The OverrideTestsView TabbedPropertySheetPage example is a look at the
- * properties view after the migration of a TabFolder/TabItem framework to the
- * tabbed properties view. In the case of a TabFolder, the folder (provider)
- * knows both the tab labels and tab items. This aligns to the tabbed properties
- * view, but the tab labels are tab descriptors and tab items are section
- * descriptions. This does not work with the default framework as the tabs
- * provide the sections. In this case, the IOverridableTabListContentProvider
- * framework has been provided.
- * <p>
- * The overridable tab list is a content provider that provides both the
- * sections and the tab labels.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class OverrideTestsTabItem implements ITabItem {
-	private IOverrideTestsItem item;
-	private boolean selected = false;
-
-	/**
-	 * Constructor for OverrideTestsTabItem
-	 * 
-	 * @param anItem
-	 *            the item.
-	 */
-	public OverrideTestsTabItem(IOverrideTestsItem anItem) {
-		this.item = anItem;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabItem#getImage()
-	 */
-	public Image getImage() {
-		return item.getImage();
-	}
-
-	/**
-	 * Get the item.
-	 * 
-	 * @return the item.
-	 */
-	public IOverrideTestsItem getItem() {
-		return item;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabItem#getText()
-	 */
-	public String getText() {
-		return item.getText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabItem#isIndented()
-	 */
-	public boolean isIndented() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabItem#isSelected()
-	 */
-	public boolean isSelected() {
-		return selected;
-	}
-
-	/*
-	 * 
-	 */
-	public void setSelected(boolean newSelected) {
-		this.selected = newSelected;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/OverrideTestsTabListsContentsManager.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/OverrideTestsTabListsContentsManager.java
deleted file mode 100644
index 6508d32..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/override/tablist/OverrideTestsTabListsContentsManager.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.override.tablist;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.tests.views.properties.tabbed.override.OverrideTestsSelection;
-import org.eclipse.ui.tests.views.properties.tabbed.override.OverrideTestsView;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITabItem;
-import org.eclipse.ui.views.properties.tabbed.TabContents;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * The content manager for the override tests example for the tabbed property
- * sheet page.
- * <p>
- * The OverrideTestsView TabbedPropertySheetPage example is a look at the
- * properties view after the migration of a TabFolder/TabItem framework to the
- * tabbed properties view. In the case of a TabFolder, the folder (provider)
- * knows both the tab labels and tab items. This aligns to the tabbed properties
- * view, but the tab labels are tab descriptors and tab items are section
- * descriptions. This does not work with the default framework as the tabs
- * provide the sections. In this case, the IOverridableTabListContentProvider
- * framework has been provided.
- * <p>
- * The overridable tab list is a content provider that provides both the
- * sections and the tab labels.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class OverrideTestsTabListsContentsManager {
-
-	private Element activeElement;
-
-	private IOverrideTestsTabList activeFolder;
-
-	private ITabItem[] activeTabs;
-
-	private Composite composite;
-
-	private IOverrideTestsTabList emptyFolder;
-
-	private IOverrideTestsTabList[] folders;
-
-	private boolean processingUpdateTabs;
-
-	private OverrideTestsView sampleView;
-
-	private ISection section;
-
-	private TabbedPropertySheetPage tabbedPropertySheetPage;
-
-	public OverrideTestsTabListsContentsManager(Composite aComposite,
-			TabbedPropertySheetPage aTabbedPropertySheetPage, ISection aSection) {
-		this.composite = aComposite;
-		this.section = aSection;
-		this.tabbedPropertySheetPage = aTabbedPropertySheetPage;
-		this.folders = new IOverrideTestsTabList[] { new BasicTabList(),
-				new AdvancedTabList() };
-		this.emptyFolder = new EmptyTabList();
-	}
-
-	private boolean compareTab(OverrideTestsTabItem a, OverrideTestsTabItem b) {
-		return a.getItem().equals(b.getItem()) &&
-				a.isSelected() == b.isSelected() &&
-				a.getText().equals(b.getText());
-	}
-
-	private boolean compareTabs(ITabItem[] a, ITabItem[] b) {
-		if (a != null && b != null) {
-			if (a.length != b.length) {
-				return false;
-			}
-			for (int i = 0; i < a.length; i++) {
-				if (!compareTab((OverrideTestsTabItem) a[i],
-						(OverrideTestsTabItem) b[i])) {
-					return false;
-				}
-			}
-			return true;
-		}
-		return a == null && b == null;
-	}
-
-	public void dispose() {
-		if (activeFolder != null) {
-			activeFolder.dispose();
-		}
-	}
-
-	public ITabItem[] getTabs() {
-		if (activeFolder != null) {
-			return activeFolder.getTabs();
-		}
-		return new ITabItem[] {};
-	}
-
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		if (composite.isDisposed()) {
-			return;
-		}
-		if (processingUpdateTabs) {
-			return;
-		}
-		if (!validateSection()) {
-			return;
-		}
-		Assert.isTrue(part instanceof OverrideTestsView);
-		this.sampleView = (OverrideTestsView) part;
-		Assert.isTrue(selection instanceof OverrideTestsSelection);
-		Element newElement = ((OverrideTestsSelection) selection).getElement();
-		IOverrideTestsTabList newFolder = null;
-
-		if (newElement == null) {
-			newFolder = emptyFolder;
-		} else {
-			for (int i = 0; i < folders.length; i++) {
-				if (folders[i].appliesTo(newElement)) {
-					newFolder = folders[i];
-					break;
-				}
-			}
-		}
-
-		if (newFolder != activeFolder) {
-			if (activeFolder != null) {
-				activeFolder.dispose();
-				activeFolder = null;
-			}
-			activeFolder = newFolder;
-			if (newElement != null) {
-				activeFolder.selectionChanged(newElement);
-			}
-			newFolder.createControls(composite);
-			composite.layout(true);
-		} else if (newElement != activeElement) {
-			activeFolder.dispose();
-			if (newElement != null) {
-				activeFolder.selectionChanged(newElement);
-			}
-			activeFolder.createControls(composite);
-			composite.layout(true);
-			activeElement = newElement;
-			return;
-		}
-		ITabItem[] newTabs = activeFolder.getTabs();
-		if (!compareTabs(newTabs, activeTabs)) {
-			processingUpdateTabs = true;
-			tabbedPropertySheetPage.overrideTabs();
-			processingUpdateTabs = false;
-			activeTabs = newTabs;
-		}
-
-	}
-
-	public void selectTab(int index) {
-		if (activeTabs == null) {
-			return;
-		}
-		OverrideTestsTabItem selectedTab = (OverrideTestsTabItem) activeTabs[index];
-		sampleView.setSelection(selectedTab.getItem().getElement());
-
-		OverrideTestsSelection selection = (OverrideTestsSelection) sampleView
-				.getSelection();
-		Element newElement = selection.getElement();
-
-		activeFolder.dispose();
-		activeFolder.selectionChanged(newElement);
-		activeFolder.createControls(composite);
-		composite.layout(true);
-		activeElement = newElement;
-		activeTabs = getTabs();
-	}
-
-	/**
-	 * Returns true if the section is valid.
-	 */
-	private boolean validateSection() {
-		TabContents tab = tabbedPropertySheetPage.getCurrentTab();
-		if (tab != null) {
-			ISection[] sections = tab.getSections();
-			if (sections != null) {
-				for (int i = 0; i < sections.length; i++) {
-					if (sections[i] == section) {
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/sections/InformationTwoSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/sections/InformationTwoSection.java
deleted file mode 100644
index 0e24a3f..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/sections/InformationTwoSection.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.sections;
-
-public class InformationTwoSection
-    extends LabelSection {
-
-    public InformationTwoSection() {
-        super();
-        label = "A section for Information that contains the word \"Two\"";//$NON-NLS-1$
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/sections/LabelSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/sections/LabelSection.java
deleted file mode 100644
index eb2822c..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/sections/LabelSection.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.sections;
-
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-public class LabelSection
-    extends AbstractPropertySection {
-
-    protected String label;
-
-    public LabelSection() {
-        super();
-        label = "A simple section.";//$NON-NLS-1$
-    }
-
-    public void createControls(Composite parent,
-            TabbedPropertySheetPage aTabbedPropertySheetPage) {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        Composite composite = getWidgetFactory()
-            .createFlatFormComposite(parent);
-
-        CLabel nameLabel = getWidgetFactory().createCLabel(composite, label);
-        FormData data = new FormData();
-        data.left = new FormAttachment(0, 0);
-        data.right = new FormAttachment(100, 0);
-        data.top = new FormAttachment(0, 0);
-        nameLabel.setLayoutData(data);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/sections/MessageSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/sections/MessageSection.java
deleted file mode 100644
index f529d73..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/sections/MessageSection.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.sections;
-
-public class MessageSection
-    extends LabelSection {
-
-    public MessageSection() {
-        super();
-        label = "A section common to message elements (Information, Warning and Error)";//$NON-NLS-1$
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/sections/NameSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/sections/NameSection.java
deleted file mode 100644
index c1a82d9..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/sections/NameSection.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.sections;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreeNode;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * The name section on the element tab.
- * 
- * @author Anthony Hunter
- */
-public class NameSection
-    extends AbstractPropertySection {
-
-    private TreeNode treeNode;
-
-    private Text nameText;
-
-    /**
-     * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite,
-     *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-     */
-    public void createControls(Composite parent,
-            TabbedPropertySheetPage tabbedPropertySheetPage) {
-        super.createControls(parent, tabbedPropertySheetPage);
-        Composite composite = getWidgetFactory()
-            .createFlatFormComposite(parent);
-        FormData data;
-
-        nameText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
-        nameText.setEditable(false);
-        data = new FormData();
-        data.left = new FormAttachment(0, STANDARD_LABEL_WIDTH);
-        data.right = new FormAttachment(100, 0);
-        data.top = new FormAttachment(0, 0);
-        nameText.setLayoutData(data);
-
-        CLabel nameLabel = getWidgetFactory().createCLabel(composite, "Name:"); //$NON-NLS-1$
-        data = new FormData();
-        data.left = new FormAttachment(0, 0);
-        data.right = new FormAttachment(nameText,
-            -ITabbedPropertyConstants.HSPACE);
-        data.top = new FormAttachment(nameText, 0, SWT.CENTER);
-        nameLabel.setLayoutData(data);
-
-    }
-
-    /**
-     * Get the element.
-     * 
-     * @return the element.
-     */
-    public TreeNode getTreeNode() {
-        return treeNode;
-    }
-
-    /*
-     * @see org.eclipse.ui.views.properties.tabbed.view.ITabbedPropertySection#refresh()
-     */
-    public void refresh() {
-        Element element = (Element) getTreeNode().getValue();
-        nameText.setText(element.getName());
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection) {
-        super.setInput(part, selection);
-        Assert.isTrue(selection instanceof IStructuredSelection);
-        Object input = ((IStructuredSelection) selection).getFirstElement();
-        Assert.isTrue(input instanceof TreeNode);
-        this.treeNode = (TreeNode) input;
-    }
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/sections/ResourceSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/sections/ResourceSection.java
deleted file mode 100644
index 13b3624..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/sections/ResourceSection.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.sections;
-
-public class ResourceSection
-    extends LabelSection {
-
-    public ResourceSection() {
-        super();
-        label = "A section common to resource elements (Project, Folder and File)";//$NON-NLS-1$
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsLabelProvider.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsLabelProvider.java
deleted file mode 100644
index 9426bf0..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsLabelProvider.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.text;
-
-import java.util.StringTokenizer;
-
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Label provider for the title bar for the tabbed property view.
- * 
- * @author Anthony Hunter
- */
-public class TextTestsLabelProvider extends LabelProvider {
-
-	/**
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object obj) {
-		return PlatformUI.getWorkbench().getSharedImages().getImage(
-				ISharedImages.IMG_OBJ_FILE);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object obj) {
-		if (obj instanceof ITextSelection) {
-			ITextSelection textSelection = (ITextSelection) obj;
-			if (textSelection.getLength() != 0) {
-				StringTokenizer tokenizer = new StringTokenizer(textSelection
-						.getText());
-				int size = 0;
-				while (tokenizer.hasMoreTokens()) {
-					size++;
-					tokenizer.nextToken();
-				}
-				if (size == 1) {
-					return textSelection.getText();
-				}
-				return size + " words selected";//$NON-NLS-1$
-			}
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsLabelSection.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsLabelSection.java
deleted file mode 100644
index 259cd77..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsLabelSection.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.text;
-
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * A section for the text test view.
- * 
- * @author Anthony Hunter
- */
-public class TextTestsLabelSection extends AbstractPropertySection {
-
-	protected String label;
-
-	public TextTestsLabelSection(String word) {
-		super();
-		label = "A simple section for a selected word \"" + word + "\".";//$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		Composite composite = getWidgetFactory()
-				.createFlatFormComposite(parent);
-
-		CLabel nameLabel = getWidgetFactory().createCLabel(composite, label);
-		FormData data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, 0);
-		nameLabel.setLayoutData(data);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsSectionDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsSectionDescriptor.java
deleted file mode 100644
index 0336b08..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsSectionDescriptor.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.text;
-
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-
-/**
- * A section descriptor for the text test view.
- * 
- * @author Anthony Hunter
- */
-public class TextTestsSectionDescriptor extends AbstractSectionDescriptor {
-
-	private String word;
-
-	private String tabId;
-
-	public TextTestsSectionDescriptor(String aWord, String aTabId) {
-		super(null);
-		this.word = aWord;
-		this.tabId = aTabId;
-	}
-
-	public String getId() {
-		return word + "@" + Integer.toHexString(word.hashCode());
-	}
-
-	public ISection getSectionClass() {
-		return new TextTestsLabelSection(word);
-	}
-
-	public String getTargetTab() {
-		return tabId;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsSectionDescriptor2.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsSectionDescriptor2.java
deleted file mode 100644
index 5783f87..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsSectionDescriptor2.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.views.properties.tabbed.text;
-
-import org.eclipse.jface.viewers.IFilter;
-
-/**
- * A section descriptor for the text test view that should be filtered and not
- * shown.
- * 
- * @author Anthony Hunter
- * @since 3.4
- */
-public class TextTestsSectionDescriptor2 extends TextTestsSectionDescriptor {
-
-	public TextTestsSectionDescriptor2(String word, String tabId) {
-		super(word, tabId);
-	}
-
-	/*
-	 * @see
-	 * org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor#getFilter
-	 * ()
-	 */
-	public IFilter getFilter() {
-		return new IFilter() {
-
-			public boolean select(Object toTest) {
-				return false;
-			}
-		};
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsTabDescriptor.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsTabDescriptor.java
deleted file mode 100644
index 10520b8..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsTabDescriptor.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.text;
-
-import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
-
-/**
- * A tab descriptor for the text test view.
- * 
- * @author Anthony Hunter
- */
-public class TextTestsTabDescriptor extends AbstractTabDescriptor {
-
-	private String word;
-
-	public TextTestsTabDescriptor(String aWord) {
-		super();
-		this.word = aWord;
-		getSectionDescriptors().add(new TextTestsSectionDescriptor(aWord, getId()));
-		/* TextTestsSectionDescriptor2 added to the tests and it is filtered */
-		getSectionDescriptors().add(new TextTestsSectionDescriptor2(aWord, getId()));
-	}
-
-	public String getCategory() {
-		return "default"; //$NON-NLS-1$
-	}
-
-	public String getId() {
-		return word + "@" + Integer.toHexString(word.hashCode());
-	}
-
-	public String getLabel() {
-		return word;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsTabDescriptorProvider.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsTabDescriptorProvider.java
deleted file mode 100644
index 927d049..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsTabDescriptorProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.text;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider;
-
-/**
- * A tab descriptor for the text test view.
- * 
- * @author Anthony Hunter
- */
-public class TextTestsTabDescriptorProvider implements ITabDescriptorProvider {
-
-	public ITabDescriptor[] getTabDescriptors(IWorkbenchPart part,
-			ISelection selection) {
-		if (selection instanceof ITextSelection) {
-			ITextSelection textSelection = (ITextSelection) selection;
-			if (textSelection.getLength() != 0) {
-				List result = new ArrayList();
-				StringTokenizer tokenizer = new StringTokenizer(textSelection
-						.getText());
-				while (tokenizer.hasMoreTokens()) {
-					result
-							.add(new TextTestsTabDescriptor(tokenizer
-									.nextToken()));
-				}
-				return (ITabDescriptor[]) result
-						.toArray(new ITabDescriptor[result.size()]);
-			}
-		}
-		return new ITabDescriptor[0];
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsView.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsView.java
deleted file mode 100644
index 7e967f8..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/text/TextTestsView.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.text;
-
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * A text view to test dynamic contributions to the tabbed properties view.
- * 
- * @author Anthony Hunter
- */
-public class TextTestsView extends ViewPart implements
-		ITabbedPropertySheetPageContributor {
-
-	public static final String TEXT_TESTS_VIEW_ID = "org.eclipse.ui.tests.views.properties.tabbed.text.TextTestsView"; //$NON-NLS-1$
-
-	private TabbedPropertySheetPage tabbedPropertySheetPage;
-
-	private TextViewer viewer;
-
-	public void createPartControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		FormLayout layout = new FormLayout();
-		layout.marginWidth = ITabbedPropertyConstants.HSPACE;
-		layout.marginHeight = ITabbedPropertyConstants.VSPACE;
-		layout.spacing = ITabbedPropertyConstants.VMARGIN;
-		composite.setLayout(layout);
-
-		Label label = new Label(composite, SWT.NONE);
-		label.setText("Enter text, selected words becomes tabs and sections");
-		FormData data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, 0);
-		label.setLayoutData(data);
-
-		viewer = new TextViewer(composite, SWT.WRAP | SWT.H_SCROLL |
-				SWT.V_SCROLL | SWT.BORDER);
-		viewer.setDocument(new Document());
-		data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(label, 0);
-		data.bottom = new FormAttachment(100, 0);
-		viewer.getControl().setLayoutData(data);
-
-		getSite().setSelectionProvider(viewer);
-	}
-
-	public Object getAdapter(Class adapter) {
-		if (adapter == IPropertySheetPage.class) {
-			if (tabbedPropertySheetPage == null) {
-				tabbedPropertySheetPage = new TabbedPropertySheetPage(this);
-			}
-			return tabbedPropertySheetPage;
-		}
-		return super.getAdapter(adapter);
-	}
-
-	public String getContributorId() {
-		return "org.eclipse.ui.tests.views.properties.tabbed.text"; //$NON-NLS-1$
-	}
-
-	public TabbedPropertySheetPage getTabbedPropertySheetPage() {
-		return tabbedPropertySheetPage;
-	}
-
-	public TextViewer getViewer() {
-		return viewer;
-	}
-
-	public void setFocus() {
-		viewer.getControl().setFocus();
-	}
-
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/InformationTwoFilter.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/InformationTwoFilter.java
deleted file mode 100644
index 610c2f1..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/InformationTwoFilter.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.views;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.jface.viewers.TreeNode;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Information;
-
-/**
- * A filter for Information messages that have the work "Two" in them.
- * 
- * @author Anthony Hunter
- */
-public class InformationTwoFilter
-    implements IFilter {
-
-    public boolean select(Object object) {
-        if (object instanceof TreeNode) {
-            Element element = (Element) ((TreeNode) object).getValue();
-            if (element instanceof Information) {
-                Information information = (Information) element;
-                if (information.getName().indexOf("Two") > -1) {//$NON-NLS-1$
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/LabelProvider.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/LabelProvider.java
deleted file mode 100644
index 10919e5..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/LabelProvider.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.views;
-
-import java.util.Iterator;
-
-import org.eclipse.jface.viewers.TreeNode;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-
-/**
- * Label provider for the title bar for the tabbed property sheet page.
- * 
- * @author Anthony Hunter
- */
-public class LabelProvider
-    extends org.eclipse.jface.viewers.LabelProvider {
-
-    /**
-     * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-     */
-    public Image getImage(Object obj) {
-        if (obj == null || obj.equals(StructuredSelection.EMPTY)) {
-            return null;
-        }
-        if (obj instanceof IStructuredSelection) {
-            IStructuredSelection structuredSelection = (IStructuredSelection) obj;
-            if (areDifferentTypes(structuredSelection)) {
-                return null;
-            }
-            obj = structuredSelection.getFirstElement();
-        }
-        Element element = (Element) ((TreeNode) obj).getValue();
-        return element.getImage();
-    }
-
-    /**
-     * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-     */
-    public String getText(Object obj) {
-        if (obj == null || obj.equals(StructuredSelection.EMPTY)) {
-            return null;
-        }
-        int size = 1;
-        if (obj instanceof IStructuredSelection) {
-            IStructuredSelection structuredSelection = (IStructuredSelection) obj;
-            if (areDifferentTypes(structuredSelection)) {
-                return structuredSelection.size() + " items selected";//$NON-NLS-1$
-            }
-            obj = structuredSelection.getFirstElement();
-            size = structuredSelection.size();
-        }
-        StringBuffer ret = new StringBuffer();
-        Element element = (Element) ((TreeNode) obj).getValue();
-        String type = element.getClass().getName();
-        String name = element.getName();
-        ret.append('\u00AB');
-        ret.append(type.substring(type.lastIndexOf('.') + 1));
-        ret.append('\u00BB');
-        if (size == 1) {
-            ret.append(' ');
-            ret.append(name);
-        } else {
-            ret.append(' ');
-            ret.append(Integer.toString(size));
-            ret.append(" selected");//$NON-NLS-1$
-        }
-        return ret.toString();
-    }
-
-    /**
-     * Determine there are objects in the structured selection of different
-     * types.
-     * 
-     * @param structuredSelection
-     *            the structured selection.
-     * @return true if there are objects of different types in the selection.
-     */
-    private boolean areDifferentTypes(IStructuredSelection structuredSelection) {
-        if (structuredSelection.size() == 1) {
-            return false;
-        }
-        Iterator i = structuredSelection.iterator();
-        Element element = (Element) ((TreeNode) i.next()).getValue();
-        for (; i.hasNext();) {
-            Element next = (Element) ((TreeNode) i.next()).getValue();
-            if (next.getClass() != element.getClass()) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/TestsPerspective.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/TestsPerspective.java
deleted file mode 100644
index 5845aff..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/TestsPerspective.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.views.properties.tabbed.views;
-
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-import org.eclipse.ui.tests.views.properties.tabbed.dynamic.views.DynamicTestsView;
-import org.eclipse.ui.tests.views.properties.tabbed.override.OverrideTestsView;
-import org.eclipse.ui.tests.views.properties.tabbed.text.TextTestsView;
-
-/**
- * Perspective used by the tabbed properties view test JUnit tests.
- * 
- * @since 3.3
- */
-public class TestsPerspective implements IPerspectiveFactory {
-
-	public static final String TESTS_PERSPECTIVE_ID = "org.eclipse.ui.tests.views.properties.tabbed.views.TestsPerspective"; //$NON-NLS-1$
-
-	public void createInitialLayout(IPageLayout layout) {
-		String editorArea = layout.getEditorArea();
-		IFolderLayout topLeft = layout.createFolder(
-				"topLeft", IPageLayout.LEFT, (float) 0.50, editorArea);//$NON-NLS-1$
-		topLeft.addView(TestsView.TESTS_VIEW_ID);
-		IFolderLayout middleLeft = layout.createFolder(
-				"middleLeft", IPageLayout.BOTTOM, (float) 0.33, "topLeft");//$NON-NLS-1$
-		middleLeft.addView(OverrideTestsView.OVERRIDE_TESTS_VIEW_ID);
-		IFolderLayout bottomLeft = layout.createFolder(
-				"bottomLeft", IPageLayout.BOTTOM, (float) 0.40, "middleLeft");//$NON-NLS-1$//$NON-NLS-2$
-		bottomLeft.addView(DynamicTestsView.DYNAMIC_TESTS_VIEW_ID);
-		IFolderLayout top = layout.createFolder(
-				"top", IPageLayout.TOP, (float) 0.25, editorArea);//$NON-NLS-1$
-		top.addView(TextTestsView.TEXT_TESTS_VIEW_ID);
-		IFolderLayout bottom = layout.createFolder(
-				"bottom", IPageLayout.BOTTOM, (float) 0.25,//$NON-NLS-1$
-				editorArea);
-		bottom.addView(IPageLayout.ID_PROP_SHEET);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/TestsView.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/TestsView.java
deleted file mode 100644
index 8099080..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/TestsView.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.views;
-
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TreeNode;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Element;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-public class TestsView
-    extends ViewPart
-    implements ITabbedPropertySheetPageContributor {
-
-    private TreeViewer viewer;
-
-    private TabbedPropertySheetPage tabbedPropertySheetPage;
-
-    public static final String TESTS_VIEW_ID = "org.eclipse.ui.tests.views.properties.tabbed.views.TestsView"; //$NON-NLS-1$
-
-    class ViewLabelProvider
-        extends LabelProvider {
-
-        public String getText(Object obj) {
-            Element element = (Element) ((TreeNode) obj).getValue();
-            return element.getName();
-        }
-
-        public Image getImage(Object obj) {
-            Element element = (Element) ((TreeNode) obj).getValue();
-            return element.getImage();
-        }
-    }
-
-    /**
-     * The constructor.
-     */
-    public TestsView() {
-        //
-    }
-
-    /**
-     * This is a callback that will allow us to create the viewer and initialize
-     * it.
-     */
-    public void createPartControl(Composite parent) {
-        viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-        viewer.setContentProvider(new TestsViewContentProvider(this));
-        viewer.setLabelProvider(new ViewLabelProvider());
-        viewer.setInput(getViewSite());
-        getSite().setSelectionProvider(viewer);
-    }
-
-    /**
-     * Passing the focus request to the viewer's control.
-     */
-    public void setFocus() {
-        viewer.getControl().setFocus();
-    }
-
-    public Object getAdapter(Class adapter) {
-        if (adapter == IPropertySheetPage.class) {
-            if (tabbedPropertySheetPage == null) {
-                tabbedPropertySheetPage = new TabbedPropertySheetPage(this);
-            }
-            return tabbedPropertySheetPage;
-        }
-        return super.getAdapter(adapter);
-    }
-
-    public String getContributorId() {
-        return TESTS_VIEW_ID;
-    }
-
-    public TreeViewer getViewer() {
-        return viewer;
-    }
-
-    public TabbedPropertySheetPage getTabbedPropertySheetPage() {
-        return tabbedPropertySheetPage;
-    }
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/TestsViewContentProvider.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/TestsViewContentProvider.java
deleted file mode 100644
index dd68ef6..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/TestsViewContentProvider.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.views;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TreeNode;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Error;
-import org.eclipse.ui.tests.views.properties.tabbed.model.File;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Folder;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Information;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Project;
-import org.eclipse.ui.tests.views.properties.tabbed.model.Warning;
-
-public class TestsViewContentProvider
-    implements IStructuredContentProvider, ITreeContentProvider {
-
-    /**
-     * 
-     */
-    private final TestsView view;
-
-    /**
-     * @param view
-     */
-    TestsViewContentProvider(TestsView aView) {
-        this.view = aView;
-    }
-
-    private TreeNode invisibleRoot;
-
-    public void inputChanged(Viewer v, Object oldInput, Object newInput) {
-        //
-    }
-
-    public void dispose() {
-        //
-    }
-
-    public Object[] getElements(Object parent) {
-        if (parent.equals(this.view.getViewSite())) {
-            if (invisibleRoot == null)
-                initialize();
-            return getChildren(invisibleRoot);
-        }
-        return getChildren(parent);
-    }
-
-    public Object getParent(Object child) {
-        if (child instanceof TreeNode) {
-            return ((TreeNode) child).getParent();
-        }
-        return null;
-    }
-
-    public Object[] getChildren(Object parent) {
-        if (parent instanceof TreeNode) {
-            return ((TreeNode) parent).getChildren();
-        }
-        return new Object[0];
-    }
-
-    public boolean hasChildren(Object parent) {
-        if (parent instanceof TreeNode)
-            return ((TreeNode) parent).hasChildren();
-        return false;
-    }
-
-    /*
-     * We will set up a dummy model to initialize tree heararchy. In a real
-     * code, you will connect to a real model and expose its hierarchy.
-     */
-    void initialize() {
-        TreeNode[] nodes = new TreeNode[] {
-            new TreeNode(new Information("Informational Message One")),//$NON-NLS-1$
-            new TreeNode(new Information("Informational Message Two")),//$NON-NLS-1$
-            new TreeNode(new Error("Error Message One")),//$NON-NLS-1$
-            new TreeNode(new Warning("Warning Message One")),//$NON-NLS-1$
-            new TreeNode(new File("file.txt")),//$NON-NLS-1$
-            new TreeNode(new File("another.txt")),//$NON-NLS-1$
-            new TreeNode(new Folder("folder")),//$NON-NLS-1$
-            new TreeNode(new Project("project"))};//$NON-NLS-1$
-        invisibleRoot = new TreeNode(new Project(""));//$NON-NLS-1$
-        invisibleRoot.setChildren(nodes);
-    }
-
-    public TreeNode getInvisibleRoot() {
-        return invisibleRoot;
-    }
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/TypeMapper.java b/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/TypeMapper.java
deleted file mode 100644
index 5f20e44..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/src/org/eclipse/ui/tests/views/properties/tabbed/views/TypeMapper.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.views.properties.tabbed.views;
-
-import org.eclipse.jface.viewers.TreeNode;
-import org.eclipse.ui.views.properties.tabbed.AbstractTypeMapper;
-
-public class TypeMapper
-    extends AbstractTypeMapper {
-
-    public Class mapType(Object object) {
-        if (object instanceof TreeNode) {
-            return ((TreeNode) object).getValue().getClass();
-        }
-        return super.mapType(object);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests.views.properties.tabbed/test.xml b/tests/org.eclipse.ui.tests.views.properties.tabbed/test.xml
deleted file mode 100644
index d5d6d89..0000000
--- a/tests/org.eclipse.ui.tests.views.properties.tabbed/test.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0"?>
-
-<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.ui.tests.views.properties.tabbed"/>
-  <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="sniff-folder"
-              value="${eclipse-home}/tabbedproperties_sniff_folder"/>
-    <delete dir="${sniff-folder}" quiet="true"/>
-    <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${sniff-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname"
-                value="org.eclipse.ui.tests.views.properties.tabbed.AllTests"/>
-    </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/tests/org.eclipse.ui.tests/.classpath b/tests/org.eclipse.ui.tests/.classpath
deleted file mode 100644
index e4cbbcd..0000000
--- a/tests/org.eclipse.ui.tests/.classpath
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="Eclipse JFace Tests"/>
-	<classpathentry kind="src" path="Eclipse UI Tests"/>
-	<classpathentry kind="src" path="Eclipse Part References Test"/>
-	<classpathentry kind="src" path="Benchmark Tests"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tests/org.eclipse.ui.tests/.cvsignore b/tests/org.eclipse.ui.tests/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/tests/org.eclipse.ui.tests/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/.project b/tests/org.eclipse.ui.tests/.project
deleted file mode 100644
index 447cf42..0000000
--- a/tests/org.eclipse.ui.tests/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.tests</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/tests/org.eclipse.ui.tests/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.ui.tests/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 67b13eb..0000000
--- a/tests/org.eclipse.ui.tests/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,94 +0,0 @@
-#Fri Mar 28 15:34:15 EDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.builder.cleanOutputFolder=clean
-org.eclipse.jdt.core.builder.duplicateResourceTask=warning
-org.eclipse.jdt.core.builder.invalidClasspath=abort
-org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
-org.eclipse.jdt.core.circularClasspath=error
-org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
-org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=ignore
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=private
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=no_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
-org.eclipse.jdt.core.incompatibleJDKLevel=ignore
-org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/tests/org.eclipse.ui.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.ui.tests/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 8393a8a..0000000
--- a/tests/org.eclipse.ui.tests/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Oct 02 09:24:11 EDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.javadoc=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return Returns the ${bare_field_name}.\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} The ${bare_field_name} to set.\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*******************************************************************************\n * Copyright (c) ${year} IBM Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n *     IBM Corporation - initial API and implementation\n ******************************************************************************/\n</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @since 3.5\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Javadoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template></templates>
diff --git a/tests/org.eclipse.ui.tests/.settings/org.eclipse.pde.prefs b/tests/org.eclipse.ui.tests/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index e7eee2d..0000000
--- a/tests/org.eclipse.ui.tests/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,17 +0,0 @@
-#Wed Oct 17 16:19:53 EDT 2007
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=2
-compilers.p.illegal-att-value=0
-compilers.p.missing-packages=2
-compilers.p.no-required-att=1
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=1
-compilers.p.unresolved-import=0
-compilers.p.unused-element-or-attribute=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/tests/org.eclipse.ui.tests/Benchmark Tests/org/eclipse/ui/tests/benchmarks/OpenCloseTest.java b/tests/org.eclipse.ui.tests/Benchmark Tests/org/eclipse/ui/tests/benchmarks/OpenCloseTest.java
deleted file mode 100644
index 32de6d0..0000000
--- a/tests/org.eclipse.ui.tests/Benchmark Tests/org/eclipse/ui/tests/benchmarks/OpenCloseTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.benchmarks;
-
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @version 	1.0
- * @author
- */
-public class OpenCloseTest extends UITestCase {
-
-    /**
-     * Constructor for OpenCloseTest.
-     * @param testName
-     */
-    public OpenCloseTest(String testName) {
-        super(testName);
-    }
-
-    /**
-     * Tests that the Navigator is initially populated with
-     * the correct elements from the workspace.
-     */
-    public void testOpenClose() {
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/AllTests.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/AllTests.java
deleted file mode 100644
index ffdc0bb..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/AllTests.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllTests extends TestSuite {
-
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(suite());
-    }
-    
-    public static Test suite() {
-        return new AllTests();
-    }
-
-    public AllTests() {
-        addTest(new org.eclipse.jface.tests.action.AllTests());
-        addTest(new org.eclipse.jface.tests.dialogs.AllTests());
-        addTest(new org.eclipse.jface.tests.images.AllTests());
-        addTest(new org.eclipse.jface.tests.viewers.AllTests());
-        addTest(new org.eclipse.jface.tests.layout.AllTests());
-        addTest(new org.eclipse.jface.tests.wizards.WizardTestSuite());
-        addTest(new org.eclipse.jface.tests.labelProviders.DecoratingLabelProviderTests());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/AllTests.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/AllTests.java
deleted file mode 100644
index 20ca5df..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/AllTests.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.action;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllTests extends TestSuite {
-
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(suite());
-    }
-
-    public static Test suite() {
-        return new AllTests();
-    }
-    
-    public AllTests() {
-        addTestSuite(ContributionItemTest.class);
-        addTestSuite(MenuManagerTest.class);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/ContributionItemTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/ContributionItemTest.java
deleted file mode 100644
index e3263c4..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/ContributionItemTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.action;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IContributionManager;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * Tests for the [I]ContributionItem API.
- * 
- * @since 3.1
- */
-public class ContributionItemTest extends JFaceActionTest {
-
-    /**
-     * Constructs a new test with the given name.
-     * 
-     * @param name
-     *            the name of the test
-     */
-    public ContributionItemTest(String name) {
-        super(name);
-    }
-
-    /**
-     * Tests that a contribution item's parent link is set when added to a
-     * contribution manager, and cleared when the item is removed.
-     * This is a regression test for:
-     * Bug 80569 [Contributions] Parent of contribution item not cleared when item removed from manager
-     */
-    public void testParentLink() {
-        IContributionManager mgr = new DummyContributionManager();
-        ContributionItem item = new ActionContributionItem(new DummyAction());
-        assertNull(item.getParent());
-        mgr.add(item);
-        assertEquals(mgr, item.getParent());
-        mgr.remove(item);
-        assertNull(item.getParent());
-    }
-    
-    /**
-     * Tests that an action contribution item will display the text in a
-     * created SWT button when the MODE_FORCE_TEXT mode is set.
-     * This is a test for:
-     * Bug 187956 [ActionSets] ActionContributionItem.MODE_FORCE_TEXT should apply to Buttons too
-     */
-    public void testForceModeText() {
-    	Action action = new DummyAction();
-    	action.setImageDescriptor(
-    	AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ui.tests",
-    			"icons/anything.gif"));
-    	ActionContributionItem item = new ActionContributionItem(action);
-    	item.fill(getShell());
-    	
-    	Control[] children = getShell().getChildren();
-    	Button button = (Button) children[0];
-    	assertEquals("", button.getText());
-    	action.setText("Text");
-    	assertEquals("", button.getText());
-    	item.setMode(ActionContributionItem.MODE_FORCE_TEXT);
-    	assertEquals("Text", button.getText());
-    	action.setText(null);
-    	assertEquals("", button.getText());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/DummyAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/DummyAction.java
deleted file mode 100644
index 7b1faf0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/DummyAction.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.action;
-
-import org.eclipse.jface.action.Action;
-
-
-/**
- * A dummy action, used just for testing.
- */
-class DummyAction extends Action {
-    
-    static int Count = 0;
-    
-    public DummyAction() {
-        super("DummyAction " + ++Count);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/DummyContributionManager.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/DummyContributionManager.java
deleted file mode 100644
index 9c7e5f3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/DummyContributionManager.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.action;
-
-import org.eclipse.jface.action.ContributionManager;
-
-
-/**
- * A dummy contribution manager, used just for testing.
- * Does not populate any widgets.
- */
-class DummyContributionManager extends ContributionManager {
-    public void update(boolean force) {
-        // ignore
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/JFaceActionTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/JFaceActionTest.java
deleted file mode 100644
index 72389d8..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/JFaceActionTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.action;
-
-import junit.framework.TestCase;
-
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Abstract superclass of all JFace action tests.
- * 
- * @since 3.1
- */
-public abstract class JFaceActionTest extends TestCase {
-
-    private Display display;
-    private Shell shell;
-
-    /**
-     * Constructs a new test with the given name
-     * 
-     * @param name the name of the test
-     */
-    protected JFaceActionTest(String name) {
-        super(name);
-    }
-
-    /* (non-Javadoc)
-     * @see junit.framework.TestCase#setUp()
-     */
-    protected void setUp() throws Exception {
-	    display = Display.getCurrent();
-	    if (display == null) {
-	        display = new Display();
-	    }
-	    shell = new Shell(display);
-	    shell.setSize(500, 500);
-	    shell.setLayout(new FillLayout());
-	    shell.open();
-    }
-    
-    /* (non-Javadoc)
-     * @see junit.framework.TestCase#tearDown()
-     */
-    protected void tearDown() throws Exception {
-       shell.dispose();
-    }
-    
-    protected Display getDisplay() {
-        return display;
-    }
-    
-    protected Shell getShell() {
-        return shell;
-    }
-    
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/MenuManagerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/MenuManagerTest.java
deleted file mode 100644
index e090125..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/action/MenuManagerTest.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.action;
-
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IContributionManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Tests for the MenuManager API.
- * 
- * @since 3.1
- */
-public class MenuManagerTest extends JFaceActionTest {
-
-    private int groupMarkerCount = 0;
-    private int separatorCount = 0;
-
-    /**
-     * Constructs a new test with the given name.
-     * 
-     * @param name
-     *            the name of the test
-     */
-    public MenuManagerTest(String name) {
-        super(name);
-    }
-
-    /**
-     * Tests that a menu with no concrete visible items (that is, ignoring
-     * separators and group markers) is hidden.
-     * 
-     * @see MenuManager#isVisible()
-     */
-    public void testMenuWithNoConcreteVisibleItemsIsHidden() {
-        MenuManager menuBarMgr = createMenuBarManager();
-
-        MenuManager fileMenu = createMenuManager("File", "gsgn");
-        menuBarMgr.add(fileMenu);
-        menuBarMgr.updateAll(false);
-        assertEquals(0, getShell().getMenuBar().getItems().length);
-    }
-
-    /**
-     * Tests that adding a concrete visible item to a menu with no concrete
-     * visible items makes the menu visible. Regression test for bug 54779 [RCP]
-     * Problem updating menus, menu not appearing
-     * 
-     * @see MenuManager#isVisible()
-     * @see MenuManager#markDirty()
-     */
-    public void testAddingConcreteItemToMenuWithNoConcreteVisibleItems() {
-        MenuManager menuBarMgr = createMenuBarManager();
-
-        MenuManager fileMenuMgr = createMenuManager("File", "gsgn");
-        menuBarMgr.add(fileMenuMgr);
-        menuBarMgr.updateAll(false);
-        
-        Menu menuBar = getShell().getMenuBar();
-        assertEquals(0, menuBar.getItems().length);
-        
-        fileMenuMgr.add(createItem('a'));
-        menuBarMgr.updateAll(false);
-        assertEquals(1, menuBar.getItems().length);
-        
-        assertEquals("File", menuBar.getItems()[0].getText());
-        
-        Menu fileMenu = menuBar.getItems()[0].getMenu();
-        assertEquals(1, fileMenu.getItems().length);
-    }
-    
-    /**
-     * This is a test case for bug 204788 to ensure that a disposed menu is
-     * marked as being dirty.
-     */
-    public void testDisposedMenuIsDirty() {
-        MenuManager menuBarMgr = createMenuBarManager();
-
-        MenuManager fileMenuMgr = createMenuManager("File", "gsgn");
-        menuBarMgr.add(fileMenuMgr);
-        menuBarMgr.updateAll(false);
-        
-        assertFalse(menuBarMgr.isDirty());
-        
-        menuBarMgr.dispose();
-        assertTrue(menuBarMgr.isDirty());
-    }
-
-    /**
-     * Creates a menu manager with the given name, adding items based on the given template.
-     * 
-     * @param name the name
-     * @param template the template
-     * 
-     * @return a menu with no concrete visible items
-     */
-    private MenuManager createMenuManager(String name, String template) {
-        MenuManager menuMgr = new MenuManager(name);
-        addItems(menuMgr, template);
-        return menuMgr;
-    }
-
-    private void addItems(IContributionManager manager, String template) {
-        for (int i = 0; i < template.length(); ++i) {
-            manager.add(createItem(template.charAt(i)));
-        }
-    }
-    
-    private IContributionItem createItem(char template) {
-        switch (template) {
-        	case 'g':
-        	    return new GroupMarker("testGroup" + groupMarkerCount++);
-        	case 's':
-        	    return new Separator("testSeparator" + separatorCount++);
-        	case 'a': {
-        	    IAction action = new DummyAction();
-        	    return new ActionContributionItem(action);
-        	}
-        	case 'n': {
-        	    IAction action = new DummyAction();
-        	    ActionContributionItem item = new ActionContributionItem(action);
-        	    item.setVisible(false);
-        	    return item;
-        	}
-        	default:
-        	    throw new IllegalArgumentException("Unknown template char: " + template);
-        }
-    }
-
-    protected MenuManager createMenuBarManager() {
-        Shell shell = getShell();
-        MenuManager menuMgr = new MenuManager();
-        Menu menuBar = menuMgr.createMenuBar(shell);
-        shell.setMenuBar(menuBar);
-        return menuMgr;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/AllTests.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/AllTests.java
deleted file mode 100644
index 0c0d7fc..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/AllTests.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.dialogs;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllTests extends TestSuite {
-
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(suite());
-    }
-
-    public static Test suite() {
-        return new AllTests();
-    }
-
-    public AllTests() {
-    	addTestSuite(DialogSettingsTest.class);
-    	addTestSuite(InputDialogTest.class);
-        addTestSuite(TitleAreaDialogTest.class);
-        addTestSuite(SafeRunnableErrorTest.class);
-        addTestSuite(ProgressIndicatorStyleTest.class);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/DialogSettingsTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/DialogSettingsTest.java
deleted file mode 100644
index 1e1bdcf..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/DialogSettingsTest.java
+++ /dev/null
@@ -1,436 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.dialogs;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.dialogs.DialogSettings;
-import org.eclipse.jface.dialogs.IDialogSettings;
-
-public class DialogSettingsTest extends TestCase {
-
-	private static final float DELTA = 0.0000001f;
-
-	private static final String[] TEST_STRINGS = { "value",
-			" value with spaces ", "value.with.many.dots",
-			"value_with_underscores", "value<with<lessthan",
-			"value>with>greaterthan", "value&with&ampersand",
-			"value\"with\"quote", "value#with#hash", "",
-			"\nvalue\nwith\nnewlines\n", "\tvalue\twith\ttab\t",
-			"\rvalue\rwith\rreturn\r", };
-
-	public void testDialogSettings() throws IOException {
-		for (int i = 0; i < TEST_STRINGS.length; i++) {
-			final String name = TEST_STRINGS[i];
-			testPutAndGetWithTitle(new DialogSettingsChecker() {
-				public void prepareAndCheckBeforeSerialization(
-						IDialogSettings dialogSettingsToSerialize) {
-					// nothing
-				}
-
-				public void checkAfterDeserialization(
-						IDialogSettings deserializedDialogSettings) {
-					assertEquals(name, deserializedDialogSettings.getName());
-				}
-			}, name);
-		}
-	}
-
-	public void testAddNewSection() throws IOException {
-		for (int i = 0; i < TEST_STRINGS.length; i++) {
-			final String name = TEST_STRINGS[i];
-			testPutAndGet(new DialogSettingsChecker() {
-
-				public void prepareAndCheckBeforeSerialization(
-						IDialogSettings dialogSettingsToSerialize) {
-					assertEquals(0,
-							dialogSettingsToSerialize.getSections().length);
-					assertEquals(null, dialogSettingsToSerialize
-							.getSection(name));
-					dialogSettingsToSerialize.addNewSection(name);
-					assertEquals(1,
-							dialogSettingsToSerialize.getSections().length);
-					assertNotNull(dialogSettingsToSerialize.getSection(name));
-					assertEquals(name, dialogSettingsToSerialize.getSection(
-							name).getName());
-					assertEquals(name,
-							dialogSettingsToSerialize.getSections()[0]
-									.getName());
-				}
-
-				public void checkAfterDeserialization(
-						IDialogSettings deserializedDialogSettings) {
-					assertEquals(1,
-							deserializedDialogSettings.getSections().length);
-					assertNotNull(deserializedDialogSettings.getSection(name));
-					assertEquals(name, deserializedDialogSettings.getSection(
-							name).getName());
-					assertEquals(name,
-							deserializedDialogSettings.getSections()[0]
-									.getName());
-				}
-			});
-		}
-	}
-
-	/**
-	 * Helper method to fill a DialogSettings object to be checked later by
-	 * check.
-	 * 
-	 * @param memento
-	 */
-	private void fill(IDialogSettings dialogSettings) {
-		dialogSettings.put("booleanKey", true);
-		dialogSettings.put("floatKey", 0.4f);
-		dialogSettings.put("doubleKey", 0.5);
-		dialogSettings.put("integerKey", 324765);
-		dialogSettings.put("longKey", 1324765L);
-		dialogSettings.put("stringKey", "a string");
-		dialogSettings.put("stringArrayKey", new String[] { "some text data1",
-				"some text data2" });
-		final IDialogSettings section = dialogSettings.addNewSection("child1");
-		section.addNewSection("child2");
-		section.addNewSection("child3");
-	}
-
-	/**
-	 * Helper method to check if the values set by fill are still there.
-	 * 
-	 */
-	protected void check(IDialogSettings dialogSettings) {
-		assertEquals(true, dialogSettings.getBoolean("booleanKey"));
-		assertEquals(0.4f, dialogSettings.getFloat("floatKey"), 0.4f);
-		assertEquals(0.4f, dialogSettings.getDouble("doubleKey"), 0.5);
-		assertEquals(324765, dialogSettings.getInt("integerKey"));
-		assertEquals(1324765L, dialogSettings.getLong("longKey"));
-		assertEquals("a string", dialogSettings.get("stringKey"));
-		String[] stringArray = dialogSettings.getArray("stringArrayKey");
-		assertEquals(2, stringArray.length);
-		assertEquals("some text data1", stringArray[0]);
-		assertEquals("some text data2", stringArray[1]);
-		IDialogSettings section = dialogSettings.getSection("child1");
-		assertNotNull(section);
-		assertNotNull(section.getSection("child2"));
-		assertNotNull(section.getSection("child3"));
-	}
-
-	public void testAddSection() throws IOException {
-		testPutAndGet(new DialogSettingsChecker() {
-
-			public void prepareAndCheckBeforeSerialization(
-					IDialogSettings dialogSettingsToSerialize) {
-				IDialogSettings section = new DialogSettings("some section");
-				fill(section);
-				check(section);
-				assertEquals("some section", section.getName());
-				dialogSettingsToSerialize.addSection(section);
-			}
-
-			public void checkAfterDeserialization(
-					IDialogSettings deserializedDialogSettings) {
-				final IDialogSettings section = deserializedDialogSettings
-						.getSection("some section");
-				assertNotNull(section);
-				assertEquals("some section", section.getName());
-				check(section);
-			}
-		});
-	}
-
-	public void testKeys() throws IOException {
-		for (int i = 0; i < TEST_STRINGS.length; i++) {
-			final String key = TEST_STRINGS[i];
-			testPutAndGet(new DialogSettingsChecker() {
-				public void prepareAndCheckBeforeSerialization(
-						IDialogSettings dialogSettingsToSerialize) {
-					assertNull(dialogSettingsToSerialize.get(key));
-					dialogSettingsToSerialize.put(key, "some string");
-					assertEquals("some string", dialogSettingsToSerialize
-							.get(key));
-				}
-
-				public void checkAfterDeserialization(
-						IDialogSettings deserializedDialogSettings) {
-					assertEquals("some string", deserializedDialogSettings
-							.get(key));
-				}
-			});
-		}
-	}
-
-	public void testGet() throws IOException {
-		for (int i = 0; i < TEST_STRINGS.length; i++) {
-			final String value = TEST_STRINGS[i];
-			testPutAndGet(new DialogSettingsChecker() {
-
-				public void prepareAndCheckBeforeSerialization(
-						IDialogSettings dialogSettingsToSerialize) {
-					dialogSettingsToSerialize.put("someKey", value);
-					assertEquals(value, dialogSettingsToSerialize
-							.get("someKey"));
-				}
-
-				public void checkAfterDeserialization(
-						IDialogSettings deserializedDialogSettings) {
-					assertEquals(value, deserializedDialogSettings
-							.get("someKey"));
-				}
-			});
-		}
-	}
-
-	public void testGetArray() throws IOException {
-		for (int i = 0; i < TEST_STRINGS.length; i++) {
-			final String value1 = TEST_STRINGS[i];
-			for (int j = 0; j < TEST_STRINGS.length; j++) {
-				final String value2 = TEST_STRINGS[j];
-				final String[] value = new String[] { value1, value2 };
-				testPutAndGet(new DialogSettingsChecker() {
-
-					public void prepareAndCheckBeforeSerialization(
-							IDialogSettings dialogSettingsToSerialize) {
-						dialogSettingsToSerialize.put("someKey", value);
-						assertEquals(2, dialogSettingsToSerialize
-								.getArray("someKey").length);
-						assertEquals(value1, dialogSettingsToSerialize
-								.getArray("someKey")[0]);
-						assertEquals(value2, dialogSettingsToSerialize
-								.getArray("someKey")[1]);
-						dialogSettingsToSerialize.put("anotherKey1",
-								new String[] {});
-						// TODO see bug 98332, we should handle null cases too
-						// dialogSettingsToSerialize.put("anotherKey2",
-						// new String[] { null });
-						// dialogSettingsToSerialize.put("anotherKey3",
-						// new String[] { "string", null });
-						// dialogSettingsToSerialize.put("anotherKey4",
-						// new String[] { null, "string", null });
-					}
-
-					public void checkAfterDeserialization(
-							IDialogSettings deserializedDialogSettings) {
-						assertEquals(2, deserializedDialogSettings
-								.getArray("someKey").length);
-						assertEquals(value1, deserializedDialogSettings
-								.getArray("someKey")[0]);
-						assertEquals(value2, deserializedDialogSettings
-								.getArray("someKey")[1]);
-						assertEquals(0, deserializedDialogSettings
-								.getArray("anotherKey1").length);
-						// TODO see bug 98332, we should handle null cases too
-						// assertEquals(1, deserializedDialogSettings
-						// .getArray("anotherKey2").length);
-						// assertEquals(null, deserializedDialogSettings
-						// .getArray("anotherKey2")[0]);
-						// assertEquals(2, deserializedDialogSettings
-						// .getArray("anotherKey3").length);
-						// assertEquals("string", deserializedDialogSettings
-						// .getArray("anotherKey3")[0]);
-						// assertEquals(null, deserializedDialogSettings
-						// .getArray("anotherKey3")[1]);
-						// assertEquals(3, deserializedDialogSettings
-						// .getArray("anotherKey4").length);
-						// assertEquals(null, deserializedDialogSettings
-						// .getArray("anotherKey4")[0]);
-						// assertEquals("string", deserializedDialogSettings
-						// .getArray("anotherKey4")[1]);
-						// assertEquals(null, deserializedDialogSettings
-						// .getArray("anotherKey4")[2]);
-					}
-				});
-			}
-		}
-	}
-
-	public void testGetBoolean() throws IOException {
-		testPutAndGet(new DialogSettingsChecker() {
-
-			public void prepareAndCheckBeforeSerialization(
-					IDialogSettings dialogSettingsToSerialize) {
-				dialogSettingsToSerialize.put("true", true);
-				dialogSettingsToSerialize.put("false", false);
-				assertEquals(true, dialogSettingsToSerialize.getBoolean("true"));
-				assertEquals(false, dialogSettingsToSerialize
-						.getBoolean("false"));
-			}
-
-			public void checkAfterDeserialization(
-					IDialogSettings deserializedDialogSettings) {
-				assertEquals(true, deserializedDialogSettings
-						.getBoolean("true"));
-				assertEquals(false, deserializedDialogSettings
-						.getBoolean("false"));
-			}
-		});
-	}
-
-	public void testGetDouble() throws IOException {
-		final double[] values = new double[] { -3.1415, 1, 0, 4554.45235,
-				Double.MAX_VALUE, Double.MIN_VALUE, Double.NaN,
-				Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY };
-
-		for (int i = 0; i < values.length; i++) {
-			final double value = values[i];
-			testPutAndGet(new DialogSettingsChecker() {
-				public void prepareAndCheckBeforeSerialization(
-						IDialogSettings dialogSettingsToSerialize) {
-					dialogSettingsToSerialize.put("someKey", value);
-					final double d = dialogSettingsToSerialize
-							.getDouble("someKey");
-					if (Double.isNaN(value)) {
-						assertTrue(Double.isNaN(d));
-					} else {
-						assertEquals(value, d, DELTA);
-					}
-				}
-
-				public void checkAfterDeserialization(
-						IDialogSettings deserializedDialogSettings) {
-					final double d = deserializedDialogSettings
-							.getDouble("someKey");
-					if (Double.isNaN(value)) {
-						assertTrue(Double.isNaN(d));
-					} else {
-						assertEquals(value, d, DELTA);
-					}
-				}
-			});
-		}
-	}
-
-	public void testGetFloat() throws IOException {
-		final float[] values = new float[] { -3.1415f, 1, 0, 4554.45235f,
-				Float.MAX_VALUE, Float.MIN_VALUE, Float.NaN,
-				Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY };
-
-		for (int i = 0; i < values.length; i++) {
-			final float value = values[i];
-			testPutAndGet(new DialogSettingsChecker() {
-				public void prepareAndCheckBeforeSerialization(
-						IDialogSettings dialogSettingsToSerialize) {
-					dialogSettingsToSerialize.put("someKey", value);
-					final float f = dialogSettingsToSerialize
-							.getFloat("someKey");
-					if (Float.isNaN(value)) {
-						assertTrue(Float.isNaN(f));
-					} else {
-						assertEquals(value, f, DELTA);
-					}
-				}
-
-				public void checkAfterDeserialization(
-						IDialogSettings deserializedDialogSettings) {
-					final float f = deserializedDialogSettings
-							.getFloat("someKey");
-					if (Float.isNaN(value)) {
-						assertTrue(Float.isNaN(f));
-					} else {
-						assertEquals(value, f, DELTA);
-					}
-				}
-			});
-		}
-	}
-
-	public void testGetInt() throws IOException {
-		int[] values = new int[] { 36254, 0, 1, -36254, Integer.MAX_VALUE,
-				Integer.MIN_VALUE };
-
-		for (int i = 0; i < values.length; i++) {
-			final int value = values[i];
-			testPutAndGet(new DialogSettingsChecker() {
-
-				public void prepareAndCheckBeforeSerialization(
-						IDialogSettings dialogSettingsToSerialize) {
-					dialogSettingsToSerialize.put("someKey", value);
-					assertEquals(value, dialogSettingsToSerialize
-							.getInt("someKey"));
-				}
-
-				public void checkAfterDeserialization(
-						IDialogSettings deserializedDialogSettings) {
-					assertEquals(value, deserializedDialogSettings
-							.getInt("someKey"));
-				}
-			});
-		}
-	}
-
-	public void testGetLong() throws IOException {
-		long[] values = new long[] { 36254L, 0L, 1L, -36254L, Long.MAX_VALUE,
-				Long.MIN_VALUE };
-
-		for (int i = 0; i < values.length; i++) {
-			final long value = values[i];
-			testPutAndGet(new DialogSettingsChecker() {
-
-				public void prepareAndCheckBeforeSerialization(
-						IDialogSettings dialogSettingsToSerialize) {
-					dialogSettingsToSerialize.put("someKey", value);
-					assertEquals(value, dialogSettingsToSerialize
-							.getLong("someKey"));
-				}
-
-				public void checkAfterDeserialization(
-						IDialogSettings deserializedDialogSettings) {
-					assertEquals(value, deserializedDialogSettings
-							.getLong("someKey"));
-				}
-			});
-		}
-
-	}
-
-	public void testGetSection() {
-	}
-
-	public void testGetSections() {
-	}
-
-	private static interface DialogSettingsChecker {
-		void prepareAndCheckBeforeSerialization(
-				IDialogSettings dialogSettingsToSerialize);
-
-		void checkAfterDeserialization(
-				IDialogSettings deserializedDialogSettings);
-	}
-
-	private void testPutAndGet(DialogSettingsChecker dialogSettingsChecker)
-			throws IOException {
-		testPutAndGetWithTitle(dialogSettingsChecker, "DialogSettingsTest");
-	}
-
-	private void testPutAndGetWithTitle(
-			DialogSettingsChecker dialogSettingsChecker, String sectionName)
-			throws IOException {
-		IDialogSettings dialogSettingsToSerialize = new DialogSettings(
-				sectionName);
-
-		dialogSettingsChecker
-				.prepareAndCheckBeforeSerialization(dialogSettingsToSerialize);
-
-		StringWriter writer = new StringWriter();
-		dialogSettingsToSerialize.save(writer);
-		writer.close();
-
-		StringReader reader = new StringReader(writer.getBuffer().toString());
-		DialogSettings deserializedDialogSettings = new DialogSettings("");
-		deserializedDialogSettings.load(reader);
-
-		dialogSettingsChecker
-				.checkAfterDeserialization(deserializedDialogSettings);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/InputDialogTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/InputDialogTest.java
deleted file mode 100644
index 51f4474..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/InputDialogTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.dialogs;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.dialogs.InputDialog;
-
-public class InputDialogTest extends TestCase {
-
-	public void testSetErrorMessageEarly() {
-		final InputDialog dialog = new InputDialog(null, "TEST", "value",
-				"test", null);
-		dialog.setBlockOnOpen(false);
-		dialog.setErrorMessage("error");
-		dialog.open();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/ProgressIndicatorStyleTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/ProgressIndicatorStyleTest.java
deleted file mode 100644
index 367ef29..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/ProgressIndicatorStyleTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.dialogs;
-
-import java.lang.reflect.Field;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.dialogs.ProgressIndicator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.ProgressBar;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Test case to assert proper styles have been set for ProgressIndicator.
- * 
- * @since 3.4
- * 
- */
-public class ProgressIndicatorStyleTest extends TestCase {
-
-	protected ProgressIndicator progress;
-	protected ProgressBar deter, indeter;
-	protected int style;
-
-	public ProgressIndicatorStyleTest(String name) {
-		super(name);
-
-	}
-
-	/**
-	 * Test the indicator styles.
-	 */
-	public void testProgressIndicator() {
-		style = SWT.SMOOTH;
-		verifyIndicator();
-
-		style = SWT.VERTICAL;
-		verifyIndicator();		
-
-		style = SWT.HORIZONTAL;
-		verifyIndicator();
-		
-	}
-
-	/**
-	 * Verify the indicator is working by opening it and doing something.
-	 */
-	private void verifyIndicator() {
-		Shell shell = new Shell();
-		progress = new ProgressIndicator(shell, style);
-		progress.setSize(175,175);
-		shell.setSize(200,200);
-		shell.open();
-		shell.forceActive();
-		progress.beginTask(100);
-		progress.worked(50);
-		loader("determinateProgressBar", deter);
-		loader("indeterminateProgressBar", indeter);
-		long timeout = System.currentTimeMillis() + 1000;
-		while(System.currentTimeMillis() < timeout){
-			shell.getDisplay().readAndDispatch();
-		}
-		shell.close();
-		progress.dispose();
-	}
-
-	/**
-	 * Loads, using reflection, the internal ProgressBars from inside the
-	 * ProgressIndicator and tests to assert the proper style has been set on
-	 * them.
-	 */
-	private void loader(String field, ProgressBar p) {
-		Class c = progress.getClass();
-		try {
-			Field f = c.getDeclaredField(field);
-			f.setAccessible(true);
-			p = (ProgressBar) f.get(progress);
-
-			assertEquals(style, p.getStyle() & style);
-		} catch (NoSuchFieldException e) {
-			System.err.println("No such field");
-		} catch (IllegalAccessException e) {
-			System.err.println("Illegal Access");
-		}
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/SafeRunnableErrorTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/SafeRunnableErrorTest.java
deleted file mode 100644
index 8a17139..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/SafeRunnableErrorTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oakland Software and others. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: Oakland Software (francisu@ieee.org) - initial API and
- * implementation
- ******************************************************************************/
-package org.eclipse.jface.tests.dialogs;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.jface.util.SafeRunnable;
-
-/**
- * NOTE - these tests are not really very good, in order to really test this you
- * need to actually see what happens in the dialog, and therefore test it by
- * hand.
- * 
- * @since 3.4
- * 
- */
-public class SafeRunnableErrorTest extends TestCase {
-
-	int count;
-
-	protected Thread runner() {
-		return new Thread(new Runnable() {
-
-			public void run() {
-				ISafeRunnable runnable = new SafeRunnable() {
-					public void run() throws Exception {
-						throw new RuntimeException("test exception " + ++count);
-					}
-				};
-				SafeRunnable.run(runnable);
-
-			}
-		});
-	}
-
-	public void testSafeRunnableHandler() {
-		// Just make sure that nothing bad happens when we throw here
-		SafeRunnable.run(new SafeRunnable() {
-			public void run() throws Exception {
-				throw new RuntimeException("test exception");
-			}
-		});
-	}
-
-	public void testSafeRunnableHandlerOtherThread() throws Exception {
-		Thread t = runner();
-		t.run();
-		t.join();
-	}
-
-	public void testSafeRunnableHandlerMulti() {
-		ISafeRunnable runnable = new SafeRunnable() {
-			public void run() throws Exception {
-				throw new RuntimeException("test exception " + ++count);
-			}
-		};
-
-		// Make sure these don't block
-		SafeRunnable.run(runnable);
-		SafeRunnable.run(runnable);
-		SafeRunnable.run(runnable);
-		assertEquals(3, count);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/TitleAreaDialogTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/TitleAreaDialogTest.java
deleted file mode 100644
index 7d1f58d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/dialogs/TitleAreaDialogTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.dialogs;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-public class TitleAreaDialogTest extends TestCase {
-
-	static ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ui.tests", "icons/anything.gif");
-
-	// Test setting the title image before creating the dialog.
-	public void testSetTitleImageEarly() {
-		final TitleAreaDialog dialog = new TitleAreaDialog(null);
-		dialog.setBlockOnOpen(false);
-		final Image image = descriptor.createImage();
-		dialog.setTitleImage(image);
-		dialog.create();
-		Shell shell = dialog.getShell();
-		shell.addDisposeListener(new DisposeListener() {
-
-			public void widgetDisposed(DisposeEvent e) {
-				image.dispose();
-			}
-		});
-		dialog.open();
-	}
-	
-	public void testSetTitleImageNull() {
-		TitleAreaDialog dialog = new TitleAreaDialog(null);
-		dialog.setBlockOnOpen(false);
-		dialog.setTitleImage(null);
-		dialog.open();
-		dialog.setTitleImage(null);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/images/AllTests.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/images/AllTests.java
deleted file mode 100644
index 2d23636..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/images/AllTests.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.images;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllTests extends TestSuite {
-
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(suite());
-    }
-
-    public static Test suite() {
-        return new AllTests();
-    }
-
-    public AllTests() {
-        addTestSuite(ImageRegistryTest.class);
-        addTestSuite(ResourceManagerTest.class);
-        addTestSuite(FileImageDescriptorTest.class);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/images/FileImageDescriptorTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/images/FileImageDescriptorTest.java
deleted file mode 100644
index 99b3c1e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/images/FileImageDescriptorTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Karsten Stoeckmann <ngc2997@gmx.net> - Test case for Bug 220766
- *     		[JFace] ImageRegistry.get does not work as expected (crashes with NullPointerException)
- ******************************************************************************/
-
-package org.eclipse.jface.tests.images;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Iterator;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.tests.TestPlugin;
-import org.osgi.framework.Bundle;
-
-/**
- * Test loading a directory full of images.
- * 
- * @since 3.4
- * 
- */
-public class FileImageDescriptorTest extends TestCase {
-
-	protected static final String IMAGES_DIRECTORY = "/icons/imagetests";
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param name
-	 */
-	public FileImageDescriptorTest(String name) {
-		super(name);
-	}
-
-	/**
-	 * Test loading the image descriptors.
-	 */
-	public void testFileImageDescriptorWorkbench() {
-
-		Class missing = null;
-		ArrayList images = new ArrayList();
-
-		Bundle bundle = TestPlugin.getDefault().getBundle();
-		Enumeration bundleEntries = bundle.getEntryPaths(IMAGES_DIRECTORY);
-
-		while (bundleEntries.hasMoreElements()) {
-			ImageDescriptor descriptor;
-			String localImagePath = (String) bundleEntries.nextElement();
-			URL[] files = FileLocator.findEntries(bundle, new Path(
-					localImagePath));
-
-			for (int i = 0; i < files.length; i++) {
-
-				// Skip any subdirectories added by version control
-				if (files[i].getPath().lastIndexOf('.') < 0)
-					continue;
-
-				try {
-					descriptor = ImageDescriptor.createFromFile(missing,
-							FileLocator.toFileURL(files[i]).getFile());
-				} catch (IOException e) {
-					fail(e.getLocalizedMessage());
-					continue;
-				}
-
-				Image image = descriptor.createImage();
-				images.add(image);
-
-			}
-
-		}
-
-		Iterator imageIterator = images.iterator();
-		while (imageIterator.hasNext()) {
-			((Image) imageIterator.next()).dispose();
-		}
-
-	}
-
-	/**
-	 * Test the file image descriptor.
-	 */
-	public void testFileImageDescriptorLocal() {
-
-		ImageDescriptor descriptor = ImageDescriptor.createFromFile(
-				FileImageDescriptorTest.class, "anything.gif");
-
-		Image image = descriptor.createImage();
-		assertTrue("Could not find image", image != null);
-		image.dispose();
-
-	}
-
-	/**
-	 * Test for a missing file image descriptor.
-	 */
-	public void testFileImageDescriptorMissing() {
-
-		ImageDescriptor descriptor = ImageDescriptor.createFromFile(
-				FileImageDescriptorTest.class, "missing.gif");
-
-		Image image = descriptor.createImage(false);
-		assertTrue("Found an image but should be null", image == null);
-	}
-	
-	/**
-	 * Test for a missing file image descriptor.
-	 */
-	public void testFileImageDescriptorMissingWithDefault() {
-
-		ImageDescriptor descriptor = ImageDescriptor.createFromFile(
-				FileImageDescriptorTest.class, "missing.gif");
-
-		Image image = descriptor.createImage(true);
-		assertTrue("Did not find default image", image != null);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/images/ImageRegistryTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/images/ImageRegistryTest.java
deleted file mode 100644
index e1486c0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/images/ImageRegistryTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.images;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IconAndMessageDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @since 3.0
- */
-public class ImageRegistryTest extends TestCase {
-    public ImageRegistryTest(String name) {
-        super(name);
-    }
-
-    public static void main(String args[]) {
-        junit.textui.TestRunner.run(ImageRegistryTest.class);
-    }
-
-    public void testGetNull() {
-        ImageRegistry reg = JFaceResources.getImageRegistry();
-
-        Image result = reg.get((String) null);
-        assertTrue("Registry should handle null", result == null);
-    }
-
-    public void testGetString() {
-
-        // note, we must touch the class to ensure the static initialer runs
-        // so the image registry is up to date
-        Dialog.getBlockedHandler();
-
-        String[] imageNames = new String[] { Dialog.DLG_IMG_ERROR,
-                Dialog.DLG_IMG_INFO, Dialog.DLG_IMG_QUESTION,
-                Dialog.DLG_IMG_WARNING, Dialog.DLG_IMG_MESSAGE_ERROR,
-                Dialog.DLG_IMG_MESSAGE_INFO, Dialog.DLG_IMG_MESSAGE_WARNING };
-
-        ImageRegistry reg = JFaceResources.getImageRegistry();
-
-        for (int i = 0; i < imageNames.length; i++) {
-            String imageName = imageNames[i];
-            Image image1 = reg.get(imageName);
-            assertTrue("Returned null image", image1 != null);
-        }
-
-    }
-
-    /**
-     * check that we get non-null versions of the <code>IconAndMessageDialog</code> images
-     * so we know that the code using them can rely on them.
-     * 
-     * Note that they can be <code>null</code> from SWT.
-     *
-     */
-    public void testGetIconMessageDialogImages() {
-
-        IconAndMessageDialog iconDialog = new MessageDialog(null,
-                "testGetDialogIcons", null, "Message", Window.CANCEL,
-                new String[] { "cancel" }, 0);
-
-        Image[] images = new Image[] { iconDialog.getErrorImage(),
-                iconDialog.getInfoImage(), iconDialog.getQuestionImage(),
-                iconDialog.getWarningImage() };
-
-        for (int i = 0; i < images.length; i++) {
-            assertTrue("Returned null image", images[i] != null);
-        }
-
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/images/ResourceManagerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/images/ResourceManagerTest.java
deleted file mode 100644
index bb09cda..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/images/ResourceManagerTest.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.images;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import org.eclipse.jface.resource.ColorDescriptor;
-import org.eclipse.jface.resource.DeviceResourceDescriptor;
-import org.eclipse.jface.resource.DeviceResourceException;
-import org.eclipse.jface.resource.DeviceResourceManager;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.LocalResourceManager;
-import org.eclipse.jface.resource.ResourceManager;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Device;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * @since 3.1
- */
-public class ResourceManagerTest extends TestCase {
-    
-    private DeviceResourceDescriptor[] descriptors;
-    private Image testImage;
-    private Image testImage2;
-    private Color testColor;
-    private Color testColor2;
-    private int numDupes;
-    
-    private DeviceResourceManager globalResourceManager;
-    
-    private static ImageDescriptor getImage(String path) {
-        return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ui.tests", path);
-    }
-    
-    private static final class TestDescriptor extends DeviceResourceDescriptor {
-        DeviceResourceDescriptor toWrap;
-        public static int refCount = 0;
-        
-        public TestDescriptor(DeviceResourceDescriptor toWrap) {
-            this.toWrap = toWrap;
-        }
-        
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.resource.DeviceResourceDescriptor#createResource(org.eclipse.swt.graphics.Device)
-         */
-        public Object createResource(Device device) throws DeviceResourceException {
-            Object result = toWrap.createResource(device);
-            refCount++;
-            return result;
-        }
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.resource.DeviceResourceDescriptor#destroyResource(java.lang.Object)
-         */
-        public void destroyResource(Object previouslyCreatedObject) {
-            refCount--;
-            toWrap.destroyResource(previouslyCreatedObject);
-        }
-        
-        /* (non-Javadoc)
-         * @see java.lang.Object#equals(java.lang.Object)
-         */
-        public boolean equals(Object arg0) {
-            if (arg0 instanceof TestDescriptor) {
-                TestDescriptor td = (TestDescriptor)arg0;
-                
-                return td.toWrap.equals(toWrap);
-            }
-            
-            return false;
-        }
-        
-        /* (non-Javadoc)
-         * @see java.lang.Object#hashCode()
-         */
-        public int hashCode() {
-            return toWrap.hashCode();
-        }
-    }
-    
-    /* (non-Javadoc)
-     * @see junit.framework.TestCase#setUp()
-     */
-    protected void setUp() throws Exception {
-        super.setUp();
-        TestDescriptor.refCount = 0;
-        Display display = Display.getCurrent();
-        globalResourceManager = new DeviceResourceManager(display);
-        testImage = getImage("icons/anything.gif").createImage(display);
-        testImage2 = getImage("icons/binary_co.gif").createImage(display);
-        testColor = new Color(display, new RGB(10, 40, 20));
-        testColor2 = new Color(display, new RGB(230, 100, 26));
-        
-        // Array of resource descriptors containing at least one duplicate of each type.
-        // If you modify this array, be sure to adjust numDupes as well. Note that some
-        // tests index the array directly, so it is a good idea to always add to this
-        // array rather than remove from it.
-        descriptors = new DeviceResourceDescriptor[] {
-                new TestDescriptor(getImage("icons/anything.gif")),
-                new TestDescriptor(getImage("icons/anything.gif")),
-                new TestDescriptor(getImage("icons/binary_co.gif")),
-                new TestDescriptor(getImage("icons/binary_co.gif")),
-                new TestDescriptor(getImage("icons/mockeditorpart1.gif")),
-                
-                new TestDescriptor(getImage("icons/view.gif")), // 5
-                new TestDescriptor(ImageDescriptor.createFromImage(testImage2)),
-                new TestDescriptor(ImageDescriptor.createFromImage(testImage)),
-                new TestDescriptor(ImageDescriptor.createFromImage(testImage)),
-                new TestDescriptor(ImageDescriptor.createFromImage(testImage, display)),
-                
-                new TestDescriptor(ImageDescriptor.createFromImage(testImage, display)),  // 10
-                new TestDescriptor(ImageDescriptor.createFromImage(testImage2, display)),
-                new TestDescriptor(ColorDescriptor.createFrom(new RGB(10, 200, 54))),
-                new TestDescriptor(ColorDescriptor.createFrom(new RGB(10, 200, 54))),
-                new TestDescriptor(ColorDescriptor.createFrom(new RGB(200, 220, 54))),
-                
-                new TestDescriptor(ColorDescriptor.createFrom(testColor)), // 15
-                new TestDescriptor(ColorDescriptor.createFrom(testColor)),
-                new TestDescriptor(ColorDescriptor.createFrom(testColor2)),
-                new TestDescriptor(ColorDescriptor.createFrom(testColor, display)),
-                new TestDescriptor(ColorDescriptor.createFrom(testColor, display)),
-                new TestDescriptor(ColorDescriptor.createFrom(testColor2, display))
-                };
-        
-        // Let the tests know how many duplicates are in the array
-        numDupes = 11;
-    }
-    
-    /* (non-Javadoc)
-     * @see junit.framework.TestCase#tearDown()
-     */
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        globalResourceManager.dispose();
-        Assert.assertEquals("Detected leaks", 0, TestDescriptor.refCount);
-        testImage.dispose();
-        testImage2.dispose();
-    }
-    
-    protected void validateResource(Object resource) throws Exception {
-        Assert.assertNotNull("Allocated resource was null", resource);
-        if (resource instanceof Image) {
-            Image image = (Image) resource;
-            
-            Assert.assertTrue("Image is disposed", !image.isDisposed());
-            return;
-        }
-    }
-    
-    /**
-     * Tests that the descriptors themselves w
-     *
-     * @throws Exception
-     */
-    public void testDescriptorAllocations() throws Exception {
-        Display display = Display.getCurrent();
-        
-        // Allocate resources directly using the descriptors.
-        Object[] resources = new Object[descriptors.length];
-        
-        for (int i = 0; i < descriptors.length; i++) {
-            DeviceResourceDescriptor next = descriptors[i];
-            
-            Object resource = next.createResource(display);
-            // Ensure that this resource was allocated correctly
-            validateResource(resource);
-            resources[i] = resource;
-        }
-        
-        // Allocating resources without the manager will not reuse duplicates, so we
-        // should get exactly one resource per descriptor.
-        
-        Assert.assertEquals("Expecting one resource to be allocated per descriptor", 
-                descriptors.length, TestDescriptor.refCount);
-        
-        // Deallocate resources directly using the descriptors
-        for (int i = 0; i < descriptors.length; i++) {
-            DeviceResourceDescriptor next = descriptors[i];
-            
-            next.destroyResource(resources[i]);
-        }   
-    }
-    
-    public void testDeviceManagerAllocations() throws Exception {
-        
-        // Allocate resources directly using the descriptors.
-        Object[] resources = new Object[descriptors.length];
-        
-        for (int i = 0; i < descriptors.length; i++) {
-            DeviceResourceDescriptor next = descriptors[i];
-            
-            Object resource = globalResourceManager.create(next);
-            // Ensure that this resource was allocated correctly
-            validateResource(resource);
-            resources[i] = resource;
-        }
-        
-        Assert.assertEquals("Descriptors created from Images should not reallocate Images when the original can be reused",
-                testImage, resources[9]);
-        
-        // Allocating resources without the manager will reuse duplicates, so the number
-        // of resources should equal the number of unique descriptors.
-        
-        Assert.assertEquals("Duplicate descriptors should be reused", 
-                descriptors.length - numDupes, 
-                TestDescriptor.refCount);
-        
-        // Deallocate resources directly using the descriptors
-        for (int i = 0; i < descriptors.length; i++) {
-            DeviceResourceDescriptor next = descriptors[i];
-            
-            globalResourceManager.destroy(next);
-        }
-    }
-    
-    private void allocateResources(ResourceManager mgr, int[] toAllocate) throws Exception {
-        for (int i = 0; i < toAllocate.length; i++) {
-            int j = toAllocate[i];
-            
-            validateResource(mgr.create(descriptors[j]));
-        }
-    }
-    
-    private void deallocateResources(ResourceManager mgr, int[] toDeallocate) {
-        for (int i = 0; i < toDeallocate.length; i++) {
-            int j = toDeallocate[i];
-            
-            mgr.destroy(descriptors[j]);
-        }
-    }
-    
-    public void testLocalManagerAllocations() throws Exception {
-        // These arrays are indices into the descriptors array. For example, {0,1,7}
-        // is a quick shorthand to indicate we should allocate resources 0, 1, and 7.
-        int[] gResources = {0, 1, 5, 3, 7, 12, 13, 14};
-        int[] lm1Resources = {0, 2, 3, 4, 11, 12, 13, 15};
-        int[] lm2Resources = {0, 1, 6, 7, 8, 12, 14, 16};
-        
-        LocalResourceManager lm1 = new LocalResourceManager(globalResourceManager);
-        LocalResourceManager lm2 = new LocalResourceManager(globalResourceManager);
-        
-        // Allocate a bunch of global resources
-        allocateResources(globalResourceManager, gResources);
-        
-        // Remember how many global resources were allocated
-        int initialCount = TestDescriptor.refCount;
-        
-        // Allocate a bunch of resources in lm1
-        allocateResources(lm1, lm1Resources);
-        
-        // Remember how many global + lm1 resources there are
-        int lm1Count = TestDescriptor.refCount;
-        
-        // Allocate and deallocate a bunch of resources in lm2
-        // Ensure that all the lm2 resources were deallocated (we should be
-        // back down to the count we had after we allocated lm1 resources)
-        allocateResources(lm2, lm2Resources);
-        deallocateResources(lm2, lm2Resources);
-        Assert.assertEquals(lm1Count, TestDescriptor.refCount);
-
-        // Dispose lm2 (shouldn't do anything since we already deallocated all of its resources)
-        // Ensure that this doesn't change any refcounts
-        lm2.dispose();
-        Assert.assertEquals(lm1Count, TestDescriptor.refCount);
-        
-        // Dispose lm1 without first deallocating its resources. This should correctly detect
-        // what needs to be deallocated from lm1 without affecting any global resources.
-        // If everything works, we should be back to the resource count we had after allocating
-        // the global resources.
-        lm1.dispose();
-        Assert.assertEquals(initialCount, TestDescriptor.refCount);
-        
-    }
-    
-    /*
-     * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=135088
-     */
-    public void testResourceManagerFind() throws Exception {
-    	DeviceResourceDescriptor descriptor = descriptors[0];
-    	Object resource = globalResourceManager.find(descriptor);
-    	assertNull("Resource should be null since it is not allocated", resource);
-    	resource = globalResourceManager.create(descriptor);
-    	
-        // Ensure that the resource was allocated correctly
-        validateResource(resource);
-        
-        // Now the resource should be found
-        Object foundResource = globalResourceManager.find(descriptor);
-    	assertNotNull("Found resource should not be null", foundResource);
-    	assertTrue("Found resource should be an image", foundResource instanceof Image);
-    	
-    	// Destroy the resource we created
-    	globalResourceManager.destroy(descriptor);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/images/anything.gif b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/images/anything.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/images/anything.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/ColorAndFontLabelProviderTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/ColorAndFontLabelProviderTest.java
deleted file mode 100644
index bd21edc..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/ColorAndFontLabelProviderTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.labelProviders;
-
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * ColorAndFontProviderTest is a test of a color and font provider but not an
- * IViewerLabelProvider.
- * 
- * @since 3.3
- * 
- */
-public class ColorAndFontLabelProviderTest extends CompositeLabelProviderTest {
-
-	class ColorAndFontProvider extends LabelProvider implements IColorProvider,
-			IFontProvider {
-
-		/**
-		 * Create a new instance of the receiver.
-		 */
-		public ColorAndFontProvider() {
-			super();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-		 */
-		public Font getFont(Object element) {
-			return font;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-		 */
-		public Color getBackground(Object element) {
-			return background;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-		 */
-		public Color getForeground(Object element) {
-			return foreground;
-		}
-
-
-	}
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param name
-	 */
-	public ColorAndFontLabelProviderTest(String name) {
-		super(name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.ViewerTestCase#createViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	protected StructuredViewer createViewer(Composite parent) {
-		initializeColors(parent);
-		final TableViewer v = new TableViewer(parent);
-		v.setContentProvider(new LabelTableContentProvider());
-		v.setLabelProvider(new ColorAndFontProvider());
-		;
-		v.getTable().setLinesVisible(true);
-		return v;
-	}
-
-	/**
-	 * Test that all of the colours and fonts from the label provider are
-	 * applied.
-	 */
-	public void testColorsAndFonts() {
-		Table table = (Table) fViewer.getControl();
-		TableItem item = table.getItem(0);
-
-		assertTrue("Background was not set", item.getBackground(0).equals(
-				background));
-		assertTrue("Foreground was not set", item.getForeground(0).equals(
-				foreground));
-		assertTrue("Font was not set", item.getFont(0).equals(font));
-		
-		Font oldFont = font;
-
-		clearColors();
-		fViewer.refresh(item.getData());
-
-		Display display = table.getDisplay();
-		assertTrue("Background was not cleared", item.getBackground(0).equals(
-				display.getSystemColor(SWT.COLOR_LIST_BACKGROUND)));
-		assertTrue("Foreground was not cleared", item.getForeground(0).equals(
-				display.getSystemColor(SWT.COLOR_LIST_FOREGROUND)));
-		assertFalse("Font was not cleared", item.getFont(0).getFontData()[0]
-				.equals(oldFont.getFontData()[0]));
-
-	}
-
-	/**
-	 * Clear the colors and fonts to null.
-	 */
-	private void clearColors() {
-		background = null;
-		foreground = null;
-		font = null;
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/ColorAndFontViewerLabelProviderTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/ColorAndFontViewerLabelProviderTest.java
deleted file mode 100644
index d88cc08..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/ColorAndFontViewerLabelProviderTest.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.labelProviders;
-
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.IViewerLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.ViewerLabel;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * ColorAndFontProviderTest is a test of a color and font provider that is an
- * IViewerLabelProvider.
- * 
- * @since 3.3
- * 
- */
-public class ColorAndFontViewerLabelProviderTest extends CompositeLabelProviderTest {
-
-	class ColorAndFontProvider extends LabelProvider implements IColorProvider,
-			IFontProvider, IViewerLabelProvider {
-
-		/**
-		 * Create a new instance of the receiver.
-		 */
-		public ColorAndFontProvider() {
-			super();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-		 */
-		public Font getFont(Object element) {
-			return font;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-		 */
-		public Color getBackground(Object element) {
-			return background;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-		 */
-		public Color getForeground(Object element) {
-			return foreground;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IViewerLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel,
-		 *      java.lang.Object)
-		 */
-		public void updateLabel(ViewerLabel label, Object element) {
-			// Do nothing
-
-		}
-
-	}
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param name
-	 */
-	public ColorAndFontViewerLabelProviderTest(String name) {
-		super(name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.ViewerTestCase#createViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	protected StructuredViewer createViewer(Composite parent) {
-		initializeColors(parent);
-		final TableViewer v = new TableViewer(parent);
-		v.setContentProvider(new LabelTableContentProvider());
-		v.setLabelProvider(new ColorAndFontProvider());
-		;
-		v.getTable().setLinesVisible(true);
-		return v;
-	}
-
-	/**
-	 * Test that all of the colours and fonts from the label provider are
-	 * applied.
-	 */
-	public void testColorsAndFonts() {
-		Table table = (Table) fViewer.getControl();
-		TableItem item = table.getItem(0);
-
-		assertTrue("Background was not set", item.getBackground(0).equals(
-				background));
-		assertTrue("Foreground was not set", item.getForeground(0).equals(
-				foreground));
-		assertTrue("Font was not set", item.getFont(0).equals(font));
-
-		Font oldFont = font;
-		
-		clearColors();
-		fViewer.refresh(item.getData());
-
-		Display display = table.getDisplay();
-		assertTrue("Background was not cleared", item.getBackground(0).equals(
-				display.getSystemColor(SWT.COLOR_LIST_BACKGROUND)));
-		assertTrue("Foreground was not cleared", item.getForeground(0).equals(
-				display.getSystemColor(SWT.COLOR_LIST_FOREGROUND)));
-		assertFalse("Font was not cleared", item.getFont(0).getFontData()[0]
-				.equals(oldFont.getFontData()[0]));
-
-	}
-
-	/**
-	 * Clear the colors and fonts to null.
-	 */
-	private void clearColors() {
-		background = null;
-		foreground = null;
-		font = null;
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/CompositeLabelProviderTableTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/CompositeLabelProviderTableTest.java
deleted file mode 100644
index 00878c5..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/CompositeLabelProviderTableTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.labelProviders;
-
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.IViewerLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.ViewerLabel;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * CompositeLabelProviderTableTest tests a table that is a {@link IViewerLabelProvider},
- * {@link IColorProvider}, {@link org.eclipse.jface.viewers.IColorProvider},
- * {@link IFontProvider}
- * @since 3.3
- * 
- */
-public class CompositeLabelProviderTableTest extends CompositeLabelProviderTest {
-
-	class MyLabelProvider extends LabelProvider implements IColorProvider,
-			IViewerLabelProvider, IFontProvider {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-		 */
-		public Color getForeground(Object element) {
-			return foreground;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-		 */
-		public Color getBackground(Object element) {
-			return background;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IViewerLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel,
-		 *      java.lang.Object)
-		 */
-		public void updateLabel(ViewerLabel label, Object element) {
-			label.setText(getText(element));
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-		 */
-		public Font getFont(Object element) {
-			return font;
-		}
-	}
-
-	/**
-	 * Create a new instance of the recevier.
-	 * 
-	 * @param name
-	 */
-	public CompositeLabelProviderTableTest(String name) {
-		super(name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.ViewerTestCase#createViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	protected StructuredViewer createViewer(Composite parent) {
-		
-		initializeColors(parent);
-		final TableViewer v = new TableViewer(parent);
-		v.setContentProvider(new LabelTableContentProvider());
-		v.setLabelProvider(new MyLabelProvider());
-		v.getTable().setLinesVisible(true);
-		return v;
-	}
-
-	/**
-	 * Test that all of the colours and fonts from the label provider are
-	 * applied.
-	 */
-	public void testColorsAndFonts() {
-		Table table = (Table) fViewer.getControl();
-		TableItem item = table.getItem(0);
-
-		assertTrue("Background was not set", item.getBackground(0).equals(
-				background));
-		assertTrue("Foreground was not set", item.getForeground(0).equals(
-				foreground));
-		assertTrue("Font was not set", item.getFont(0).equals(font));
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/CompositeLabelProviderTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/CompositeLabelProviderTest.java
deleted file mode 100644
index 5ff0690..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/CompositeLabelProviderTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.labelProviders;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.tests.viewers.TestElement;
-import org.eclipse.jface.tests.viewers.ViewerTestCase;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * CompositeLabelProviderTest is the abstract superclass of the LabelProvider
- * tests that use multiple label provider suppliers.
- * 
- * @since 3.3
- * 
- */
-public abstract class CompositeLabelProviderTest extends ViewerTestCase {
-
-	class LabelTableContentProvider implements IStructuredContentProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return fRootElement.getChildren();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-
-		}
-
-	}
-
-	Color background;
-	Color foreground;
-	Font font;
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param name
-	 */
-	public CompositeLabelProviderTest(String name) {
-		super(name);
-	}
-
-	/**
-	 * Initialize the colors used by the receiver.
-	 * 
-	 * @param parent
-	 */
-	void initializeColors(Control parent) {
-		background = parent.getDisplay().getSystemColor(SWT.COLOR_RED);
-		foreground = parent.getDisplay().getSystemColor(SWT.COLOR_BLUE);
-		font = JFaceResources.getBannerFont();
-	}
-
-	class TestTreeContentProvider implements ITreeContentProvider {
-
-		public Object[] getChildren(Object parentElement) {
-			return ((TestElement) parentElement).getChildren();
-		}
-
-		public Object getParent(Object element) {
-			return ((TestElement) element).getContainer();
-		}
-
-		public boolean hasChildren(Object element) {
-			return getChildren(element).length > 0;
-		}
-
-		public Object[] getElements(Object inputElement) {
-			return fRootElement.getChildren();
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/DecoratingLabelProviderTests.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/DecoratingLabelProviderTests.java
deleted file mode 100644
index 97c5c38..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/DecoratingLabelProviderTests.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.labelProviders;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class DecoratingLabelProviderTests extends TestSuite {
-
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(suite());
-    }
-
-    public static Test suite() {
-        return new DecoratingLabelProviderTests();
-    }
-
-    public DecoratingLabelProviderTests() {
-    	addTestSuite(CompositeLabelProviderTableTest.class);
-    	addTestSuite(DecoratingLabelProviderTreePathTest.class);
-        addTestSuite(DecoratingLabelProviderTreeTest.class);
-        addTestSuite(ColorAndFontLabelProviderTest.class);
-        addTestSuite(ColorAndFontViewerLabelProviderTest.class);
-        addTestSuite(DecoratingStyledCellLabelProviderTest.class);
-        addTestSuite(IDecorationContextTest.class);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/DecoratingLabelProviderTreePathTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/DecoratingLabelProviderTreePathTest.java
deleted file mode 100644
index bdbfbe1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/DecoratingLabelProviderTreePathTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.labelProviders;
-
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.ITreePathLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerLabel;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- * DecoratingLabelProviderTreePathTest is the tree path version of the
- * DecoratingLabelProviderTreeTest.
- * 
- * @since 3.3
- * 
- */
-public class DecoratingLabelProviderTreePathTest extends
-		CompositeLabelProviderTest {
-
-	class TreePathTestLabelProvider extends LabelProvider implements
-			IColorProvider, IFontProvider, ITreePathLabelProvider {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-		 */
-		public Color getForeground(Object element) {
-			return foreground;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-		 */
-		public Color getBackground(Object element) {
-			return background;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-		 */
-		public Font getFont(Object element) {
-			return font;
-		}
-
-		public void updateLabel(ViewerLabel label, TreePath elementPath) {
-			label.setText(getText(elementPath.getLastSegment()));
-		}
-	}
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param name
-	 */
-	public DecoratingLabelProviderTreePathTest(String name) {
-		super(name);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.labelProviders.DecoratingLabelProviderTreeTest#createViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	protected StructuredViewer createViewer(Composite parent) {
-
-		initializeColors(parent);
-		final TreeViewer v = new TreeViewer(parent);
-		v.setLabelProvider(new TreePathTestLabelProvider());
-		v.setContentProvider(new TestTreeContentProvider());
-
-		v.setLabelProvider(new TreePathTestLabelProvider());
-
-		v.getTree().setLinesVisible(true);
-		return v;
-
-	}
-
-	/**
-	 * Test that all of the colours and fonts from the label provider are
-	 * applied.
-	 */
-	public void testColorsAndFonts() {
-		Tree tree = (Tree) fViewer.getControl();
-		TreeItem item = tree.getItem(0);
-
-		assertTrue("Background was not set", item.getBackground(0).equals(
-				background));
-		assertTrue("Foreground was not set", item.getForeground(0).equals(
-				foreground));
-		assertTrue("Font was not set", item.getFont(0).equals(font));
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/DecoratingLabelProviderTreeTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/DecoratingLabelProviderTreeTest.java
deleted file mode 100644
index da8669b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/DecoratingLabelProviderTreeTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.labelProviders;
-
-import org.eclipse.jface.viewers.DecoratingLabelProvider;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- * @since 3.3
- * 
- */
-public class DecoratingLabelProviderTreeTest extends CompositeLabelProviderTest {
-
-	class IntListLabelProvider extends LabelProvider implements IColorProvider,
-			IFontProvider {
-
-		public IntListLabelProvider() {
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-		 */
-		public Color getBackground(Object element) {
-			return background;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-		 */
-		public Color getForeground(Object element) {
-			return foreground;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-		 */
-		public Font getFont(Object element) {
-			return font;
-		}
-	}
-
-	/**
-	 * @param name
-	 */
-	public DecoratingLabelProviderTreeTest(String name) {
-		super(name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.ViewerTestCase#createViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	protected StructuredViewer createViewer(Composite parent) {
-
-		initializeColors(parent);
-		StructuredViewer viewer = new TreeViewer(parent);
-		viewer.setContentProvider(new TestTreeContentProvider());
-
-		viewer.setLabelProvider(new DecoratingLabelProvider(
-				new IntListLabelProvider(), null));
-		return viewer;
-	}
-	
-	/**
-	 * Test that all of the colours and fonts from the label provider are
-	 * applied.
-	 */
-	public void testColorsAndFonts() {
-		Tree tree = (Tree) fViewer.getControl();
-		TreeItem item = tree.getItem(0);
-
-		assertTrue("Background was not set", item.getBackground(0).equals(
-				background));
-		assertTrue("Foreground was not set", item.getForeground(0).equals(
-				foreground));
-		assertTrue("Font was not set", item.getFont(0).equals(font));
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/DecoratingStyledCellLabelProviderTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/DecoratingStyledCellLabelProviderTest.java
deleted file mode 100644
index e034389..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/DecoratingStyledCellLabelProviderTest.java
+++ /dev/null
@@ -1,665 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.labelProviders;
-
-import org.eclipse.core.runtime.AssertionFailedException;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.tests.viewers.ViewerTestCase;
-import org.eclipse.jface.viewers.CellLabelProvider;
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider;
-import org.eclipse.jface.viewers.IColorDecorator;
-import org.eclipse.jface.viewers.IDecorationContext;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.graphics.TextLayout;
-import org.eclipse.swt.graphics.TextStyle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * Most of the setup has been taken from
- * org.eclipse.jface.snippets.viewers.Snippet010OwnerDraw.java
- * 
- * @since 3.4
- * 
- */
-public class DecoratingStyledCellLabelProviderTest extends ViewerTestCase {
-
-	// static ResourceManager resourceManager = PlatformUI.getWorkbench().
-	private class TestCellLabelProvider extends CellLabelProvider implements
-			IStyledLabelProvider, IFontProvider {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.CellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell)
-		 */
-		public void update(ViewerCell cell) {
-			Object element = cell.getElement();
-			cell.setText((element == null) ? "" : element.toString());
-			cell.setImage(getImage(element));
-			cell.setFont(JFaceResources.getFont(JFaceResources.BANNER_FONT));
-			cell.setForeground(cell.getControl().getDisplay().getSystemColor(
-					SWT.COLOR_BLUE));
-			cell.setBackground(cell.getControl().getDisplay().getSystemColor(
-					SWT.COLOR_RED));
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getImage(java.lang.Object)
-		 */
-		public Image getImage(Object element) {
-			// create a resource manager that holds onto images
-			// OR create image set, dispose in teardown
-
-			return fViewer.getControl().getDisplay().getSystemImage(
-					SWT.ICON_WARNING);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getStyledText(java.lang.Object)
-		 */
-		public StyledString getStyledText(Object element) {
-			return new StyledString(element.toString(),
-					StyledString.COUNTER_STYLER);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-		 */
-		public Font getFont(Object element) {
-			return JFaceResources.getFont(JFaceResources.BANNER_FONT);
-		}
-
-	}
-
-	private class TestLabelDecorator implements ILabelDecorator,
-			IColorDecorator {
-
-		public Image decorateImage(Image image, Object element) {
-			return image;
-		}
-
-		public String decorateText(String text, Object element) {
-			return text;
-		}
-
-		public void addListener(ILabelProviderListener listener) {
-		}
-
-		public void dispose() {
-		}
-
-		public boolean isLabelProperty(Object element, String property) {
-			return false;
-		}
-
-		public void removeListener(ILabelProviderListener listener) {
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IColorDecorator#decorateBackground(java.lang.Object)
-		 */
-		public Color decorateBackground(Object element) {
-			return fViewer.getControl().getDisplay().getSystemColor(
-					SWT.COLOR_RED);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IColorDecorator#decorateForeground(java.lang.Object)
-		 */
-		public Color decorateForeground(Object element) {
-			return fViewer.getControl().getDisplay().getSystemColor(
-					SWT.COLOR_BLUE);
-		}
-	}
-
-	private CountryEntry[] entries;
-	protected String changeMe = "OLD";
-	private static int COLUMN_COUNT = 3;
-
-	public DecoratingStyledCellLabelProviderTest(String name) {
-		super(name);
-		entries = new CountryEntry[3];
-		entries[0] = new AustriaEntry();
-		entries[1] = new GermanyEntry();
-		entries[2] = new EnglandEntry();
-	}
-
-	protected StructuredViewer createViewer(Composite parent) {
-		TableViewer viewer = new TableViewer(parent, SWT.FULL_SELECTION);
-
-		viewer.setContentProvider(new IStructuredContentProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-			};
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				return entries;
-			};
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(org.eclipse.jface.viewers.Viewer viewer,
-					Object oldInput, Object newInput) {
-			}
-
-		});
-		createColumns(viewer);
-		viewer.setLabelProvider(createLabelProvider());
-
-		GridData data = new GridData(GridData.GRAB_HORIZONTAL
-				| GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
-
-		viewer.getControl().setLayoutData(data);
-		viewer.setSelection(new StructuredSelection(entries[1]));
-
-		return viewer;
-	}
-
-	/**
-	 * @return {@link DecoratingStyledCellLabelProvider}
-	 */
-	private DecoratingStyledCellLabelProvider createLabelProvider() {
-		return new DecoratingStyledCellLabelProvider(
-				new TestCellLabelProvider(), getDecorator(), getContext());
-	}
-
-	/**
-	 * @return
-	 */
-	private IDecorationContext getContext() {
-		return new IDecorationContext() {
-
-			public String[] getProperties() {
-				return null;
-			}
-
-			public Object getProperty(String property) {
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @return
-	 */
-	private ILabelDecorator getDecorator() {
-		return new TestLabelDecorator();
-	}
-
-	private ILabelProviderListener getListener() {
-		return new ILabelProviderListener() {
-
-			public void labelProviderChanged(LabelProviderChangedEvent event) {
-				changeMe = "been changed";
-			}
-		};
-	}
-
-	/**
-	 * Create the columns to be used in the tree.
-	 */
-	private void createColumns(TableViewer viewer) {
-		TableLayout layout = new TableLayout();
-		Table table = viewer.getTable();
-		table.setLayout(layout);
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-
-		for (int i = 0; i < COLUMN_COUNT; i++) {
-			TableColumn tc = new TableColumn(table, SWT.NONE, i);
-			layout.addColumnData(new ColumnPixelData(100));
-			tc.setText(getTitleFor(i));
-		}
-	}
-
-	protected void setInput() {
-		fViewer.setInput(this);
-	}
-
-	// the tests
-	public void testGetDecorationContext() {
-		assertNotNull(getDecoratingStyledLabelProvider().getDecorationContext());
-	}
-
-	public void testSetDecorationContext() {
-		try {
-			getDecoratingStyledLabelProvider().setDecorationContext(null);
-			fail("DecoratingStyledCellLabelProvider.setDecorationContext did not throw an exception when passed null");
-		} catch (AssertionFailedException e) {
-			// A Good Thing.
-		}
-	}
-
-	public void testUpdate() {
-		Table table = ((TableViewer) fViewer).getTable();
-		String before = table.getItem(0).toString();
-		entries[0].name = "Updated";
-		fViewer.refresh();
-		assertNotSame(before, table.getItem(0).toString());
-	}
-
-	public void testGetForeground() {
-		// TODO: Incomplete test
-		// fViewer.getControl().getShell().setFocus();
-		//
-		// long stopTime = System.currentTimeMillis() + 1000;
-		// while (stopTime < System.currentTimeMillis()) {
-		// Display.getCurrent().readAndDispatch();
-		// }
-		//
-		// Table table = ((TableViewer) fViewer).getTable();
-		//
-		// TableItem ti = table.getItem(0);
-		//
-		// Color widget = ti.getForeground();
-		// assertEquals(widget,
-		// getDecoratingStyledLabelProvider().getForeground(
-		// ti));
-	}
-
-	public void testGetBackground() {
-		// TODO: Incomplete test
-
-		// Table table = ((TableViewer) fViewer).getTable();
-		// TableItem ti = table.getItem(0);
-		// Color d = ((DecoratingStyledCellLabelProvider) ((TableViewer)
-		// fViewer)
-		// .getLabelProvider(0)).getBackground(ti);
-		// assertEquals(d,
-		// getDecoratingStyledLabelProvider().getBackground(ti));
-	}
-
-	public void testGetFont() {
-		// TODO: Incomplete test
-
-		// Table table = ((TableViewer) fViewer).getTable();
-		// TableItem ti = table.getItem(0);
-
-		// assertEquals(f, getDecoratingStyledLabelProvider().getFont(ti));
-	}
-
-	public void testGetImage() {
-		Table table = ((TableViewer) fViewer).getTable();
-
-		assertEquals(table.getItem(0).getImage(),
-				getDecoratingStyledLabelProvider().getImage(table.getItem(0)));
-
-	}
-
-	public void testGetLabelDecorator() {
-		assertNotNull(getDecoratingStyledLabelProvider().getLabelDecorator());
-
-		getDecoratingStyledLabelProvider().setLabelDecorator(null);
-		assertNull(getDecoratingStyledLabelProvider().getLabelDecorator());
-	}
-
-	public void testSetLabelDecorator() {
-		ILabelDecorator labelDecorator = getDecorator();
-		getDecoratingStyledLabelProvider().setLabelDecorator(labelDecorator);
-		assertEquals(labelDecorator, getDecoratingStyledLabelProvider()
-				.getLabelDecorator());
-
-	}
-
-	public void testAddListener() {
-		String old = changeMe; // String will change because the listener will
-		// be listening for it
-		ILabelProviderListener listener = getListener();
-		getDecoratingStyledLabelProvider().addListener(listener);
-		getDecoratingStyledLabelProvider().setLabelDecorator(getDecorator());
-		assertNotSame(old, changeMe);
-	}
-
-	public void testRemoveListener() {
-		String old = changeMe = "OLD";
-		ILabelProviderListener listener = getListener();
-		getDecoratingStyledLabelProvider().addListener(listener);
-		getDecoratingStyledLabelProvider().removeListener(listener);
-		getDecoratingStyledLabelProvider().setLabelDecorator(getDecorator());
-		assertEquals(old, changeMe);
-	}
-
-	public void testIsLabelProperty() {
-		boolean check = getDecoratingStyledLabelProvider().isLabelProperty(
-				"element", "property");
-		assertTrue(check);
-	}
-
-	public void testDispose() {
-		fShell.dispose();
-		assertFalse(fViewer.getLabelProvider() instanceof DecoratingStyledCellLabelProvider);
-		// the viewer will return a new LabelProvider if the current is null
-	}
-
-	/**
-	 * @return Returns the {@link DecoratingStyledCellLabelProvider} used for
-	 *         this test
-	 */
-	private DecoratingStyledCellLabelProvider getDecoratingStyledLabelProvider() {
-		return ((DecoratingStyledCellLabelProvider) fViewer.getLabelProvider());
-	}
-
-	class CountryEntry {
-
-		String name;
-
-		String cupYear;
-
-		private String baseName;
-
-		/**
-		 * Create a new instance of the receiver.
-		 * 
-		 * @param countryName
-		 * @param worldCupYear
-		 */
-		CountryEntry(String countryName, String englishName, String worldCupYear) {
-			name = countryName;
-			cupYear = worldCupYear;
-			baseName = englishName;
-		}
-
-		public String toString() {
-			return name + " " + cupYear + " " + baseName;
-		}
-
-		/**
-		 * @param index
-		 * @return
-		 */
-		public int getHeight(Event event) {
-			switch (event.index) {
-			case 0:
-				return event.gc.textExtent(name).y;
-			case 1:
-				return 50;
-			case 2:
-				return event.gc.textExtent(cupYear).y;
-			default:
-				return 10;
-			}
-		}
-
-		/**
-		 * @param index
-		 * @return
-		 */
-		public int getWidth(Event event) {
-
-			switch (event.index) {
-			case 0:
-				return event.gc.textExtent(getDisplayString().toString()).x + 4;
-
-			case 1:
-				return 200;
-
-			case 2:
-				return event.gc.textExtent(cupYear).x + 5;
-
-			default:
-				return 10;
-			}
-		}
-
-		/**
-		 * Draw the flag in bounds.
-		 * 
-		 * @param event
-		 */
-		protected void drawFlag(Event event) {
-			event.gc.setBackground(fViewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_BLUE));
-
-			Rectangle bounds = event.getBounds();
-			bounds.width += 100;
-			event.gc.fillRectangle(bounds);
-		}
-
-		/**
-		 * Draw the cup year
-		 * 
-		 * @param event
-		 */
-		private void drawCupYear(Event event) {
-			event.gc.drawText(cupYear, event.x, event.y);
-
-		}
-
-		/**
-		 * Draw the name of the receiver.
-		 * 
-		 * @param event
-		 */
-		protected void drawName(Event event) {
-
-			StringBuffer buffer = getDisplayString();
-
-			Display display = fViewer.getControl().getDisplay();
-			TextLayout layout = new TextLayout(display);
-			layout.setText(buffer.toString());
-
-			TextStyle plain = new TextStyle(JFaceResources
-					.getFont(JFaceResources.DEFAULT_FONT), display
-					.getSystemColor(SWT.COLOR_LIST_FOREGROUND), display
-					.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-
-			TextStyle italic = new TextStyle(JFaceResources.getFontRegistry()
-					.getItalic(JFaceResources.DEFAULT_FONT), display
-					.getSystemColor(SWT.COLOR_BLUE), display
-					.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-
-			layout.setStyle(plain, 0, name.length() - 1);
-			layout.setStyle(italic, name.length(), buffer.length() - 1);
-
-			layout.draw(event.gc, event.x, event.y);
-
-		}
-
-		/**
-		 * @return
-		 */
-		private StringBuffer getDisplayString() {
-			StringBuffer buffer = new StringBuffer();
-			buffer.append(name);
-			buffer.append(" (");
-			buffer.append(baseName);
-			buffer.append(")");
-			return buffer;
-		}
-
-		/**
-		 * @param event
-		 */
-		public void draw(Event event) {
-
-			switch (event.index) {
-			case 0:
-				drawName(event);
-				break;
-			case 1:
-				drawFlag(event);
-				break;
-			case 2:
-				drawCupYear(event);
-				break;
-
-			default:
-				break;
-			}
-
-		}
-	}
-
-	private class GermanyEntry extends CountryEntry {
-
-		GermanyEntry() {
-			super("Deutschland", "Germany", "1990");
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(org.eclipse.swt.widgets.Event)
-		 */
-		protected void drawFlag(Event event) {
-
-			Rectangle bounds = event.getBounds();
-			bounds.width += 100;
-			int stripeHeight = bounds.height / 3;
-			Rectangle stripe = new Rectangle(bounds.x, bounds.y, bounds.width,
-					stripeHeight);
-
-			event.gc.setBackground(fViewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_BLACK));
-			event.gc.fillRectangle(stripe);
-
-			stripe.y += stripeHeight;
-
-			event.gc.setBackground(fViewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_YELLOW));
-			event.gc.fillRectangle(stripe);
-
-			stripe.y += stripeHeight;
-
-			event.gc.setBackground(fViewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_RED));
-			event.gc.fillRectangle(stripe);
-
-		}
-
-	}
-
-	private class AustriaEntry extends CountryEntry {
-
-		AustriaEntry() {
-			super("\u00D6sterreich", "Austria", "TBD");
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(org.eclipse.swt.widgets.Event)
-		 */
-		protected void drawFlag(Event event) {
-
-			Rectangle bounds = event.getBounds();
-			bounds.width += 100;
-			int stripeHeight = bounds.height / 3;
-			Rectangle stripe = new Rectangle(bounds.x, bounds.y, bounds.width,
-					stripeHeight);
-
-			event.gc.setBackground(fViewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_RED));
-			event.gc.fillRectangle(stripe);
-
-			stripe.y += stripeHeight;
-
-			event.gc.setBackground(fViewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_WHITE));
-			event.gc.fillRectangle(stripe);
-
-			stripe.y += stripeHeight;
-
-			event.gc.setBackground(fViewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_RED));
-			event.gc.fillRectangle(stripe);
-
-		}
-	}
-
-	private class EnglandEntry extends CountryEntry {
-		EnglandEntry() {
-			super("Blighty", "England", "1966");
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.tests.viewers.OwnerDrawExample.CountryEntry#drawFlag(org.eclipse.swt.widgets.Event)
-		 */
-		protected void drawFlag(Event event) {
-
-			Rectangle bounds = event.getBounds();
-			bounds.width += 100;
-
-			event.gc.setBackground(fViewer.getControl().getDisplay()
-					.getSystemColor(SWT.COLOR_RED));
-			event.gc.fillRectangle(new Rectangle(bounds.width / 2 + bounds.x
-					- 5, bounds.y, 10, bounds.height));
-			event.gc.fillRectangle(new Rectangle(bounds.x, bounds.height / 2
-					+ bounds.y - 5, bounds.width, 10));
-
-		}
-	}
-
-	/**
-	 * @param i
-	 * @return
-	 */
-	private String getTitleFor(int i) {
-		switch (i) {
-		case 0:
-			return "Name";
-		case 1:
-			return "Flag";
-		case 2:
-			return "World Cup Year";
-		}
-		return "Unknown";
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/IDecorationContextTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/IDecorationContextTest.java
deleted file mode 100644
index 761a223..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/IDecorationContextTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.labelProviders;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.AssertionFailedException;
-import org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider;
-import org.eclipse.jface.viewers.DecorationContext;
-import org.eclipse.jface.viewers.IDecorationContext;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Most of the setup has been taken from
- * org.eclipse.jface.snippets.viewers.Snippet010OwnerDraw.java
- * 
- * @since 3.4
- * 
- */
-public class IDecorationContextTest extends TestCase {
-
-	private IDecorationContext getDecorationContext() {
-		return new IDecorationContext() {
-
-			public String[] getProperties() {
-				return null;
-			}
-
-			public Object getProperty(String property) {
-				return null;
-			}
-		};
-	}
-
-	private IStyledLabelProvider getStyledLabelProvider() {
-		return new IStyledLabelProvider() {
-
-			public Image getImage(Object element) {
-				return null;
-			}
-
-			public StyledString getStyledText(Object element) {
-				return null;
-			}
-
-			public void addListener(ILabelProviderListener listener) {
-
-			}
-
-			public void dispose() {
-
-			}
-
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-
-			public void removeListener(ILabelProviderListener listener) {
-
-			}
-		};
-	}
-
-	private ILabelDecorator getLabelDecorator() {
-		return new ILabelDecorator() {
-
-			public Image decorateImage(Image image, Object element) {
-				return null;
-			}
-
-			public String decorateText(String text, Object element) {
-				return null;
-			}
-
-			public void addListener(ILabelProviderListener listener) {
-
-			}
-
-			public void dispose() {
-
-			}
-
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-
-			public void removeListener(ILabelProviderListener listener) {
-
-			}
-		};
-	}
-
-	private DecoratingStyledCellLabelProvider getDecoratingStyledCellLabelProvider(
-			boolean nullDecorationContext) {
-		return nullDecorationContext ? new DecoratingStyledCellLabelProvider(
-				getStyledLabelProvider(), getLabelDecorator(), null)
-				: new DecoratingStyledCellLabelProvider(
-						getStyledLabelProvider(), getLabelDecorator(),
-						getDecorationContext());
-	}
-
-	public IDecorationContextTest(String name) {
-		super(name);
-	}
-
-	public void testDefaultContextIsUsed() {
-		// Create a DecoratingStyledCellLabelProvider with a null
-		// decorationContext
-		assertEquals(getDecoratingStyledCellLabelProvider(true)
-				.getDecorationContext(), DecorationContext.DEFAULT_CONTEXT);
-
-	}
-
-	public void testSetDecorationContextNull() {
-		DecoratingStyledCellLabelProvider label = getDecoratingStyledCellLabelProvider(false);
-		try {
-			label.setDecorationContext(null);
-			fail("DecoratingStyledCellLabelProvider.setDecorationContext did not throw an exception when passed null");
-		} catch (AssertionFailedException e) {
-			// A Good Thing.
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/TestColorAndFontLabelProvider.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/TestColorAndFontLabelProvider.java
deleted file mode 100644
index e2434dc..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/labelProviders/TestColorAndFontLabelProvider.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.labelProviders;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * TestColorAndFontLabelProvider is a simple label provider that uses fonts and
- * colors.
- * @since 3.3
- *
- */
-public class TestColorAndFontLabelProvider extends LabelProvider implements
-		IColorProvider, ILabelProvider {
-	private final Display fDisplay;
-
-	public TestColorAndFontLabelProvider(Display display) {
-		fDisplay= display;
-	}
-
-	public Color getBackground(Object element) {
-		return fDisplay.getSystemColor(SWT.COLOR_RED);
-	}
-
-	public Color getForeground(Object element) {
-		return fDisplay.getSystemColor(SWT.COLOR_BLUE);
-	}
-	
-	public Font getFont(Object element) {
-		return JFaceResources.getFontRegistry().getItalic(JFaceResources.BANNER_FONT);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/layout/AbstractColumnLayoutTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/layout/AbstractColumnLayoutTest.java
deleted file mode 100644
index f2a0208..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/layout/AbstractColumnLayoutTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Micah Hainline and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Micah Hainline <micah_hainline@yahoo.com> - initial API and implementation (bug 208335)
- *     Tom Schindl <tom.schindl@bestsolution.at> - fixed GTK problem
- ******************************************************************************/
-
-package org.eclipse.jface.tests.layout;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.layout.TableColumnLayout;
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * @since 3.4
- *
- */
-public final class AbstractColumnLayoutTest extends TestCase {
-	Display display;
-	Shell shell;
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		display = Display.getCurrent();
-		if (display == null) {
-			display = new Display();
-		}
-		shell = new Shell(display, SWT.SHELL_TRIM);
-		shell.setSize(500, 500);
-		shell.setLayout(new FillLayout());
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		shell.dispose();
-	}
-
-	/**
-	 * Ensures that the minimum size is not taken into account in a shell unless
-	 * the weighted size falls below the minimum.
-	 */
-	public void testIgnoreMinimumSize() {
-		Composite composite = new Composite(shell, SWT.NONE);
-		TableColumnLayout layout = new TableColumnLayout();
-		composite.setLayout(layout);
-
-		Table table = new Table(composite, SWT.BORDER | SWT.H_SCROLL
-				| SWT.V_SCROLL);
-		TableColumn col1 = new TableColumn(table, SWT.LEFT);
-		TableColumn col2 = new TableColumn(table, SWT.LEFT);
-		TableColumn col3 = new TableColumn(table, SWT.LEFT);
-		TableColumn col4 = new TableColumn(table, SWT.LEFT);
-
-		layout.setColumnData(col1, new ColumnWeightData(2, 100));
-		layout.setColumnData(col2, new ColumnWeightData(2));
-		layout.setColumnData(col3, new ColumnWeightData(1, 30));
-		// Needed because last column on GTK always maximized
-		layout.setColumnData(col4, new ColumnPixelData(1));
-		
-
-		composite.layout(true, true);
-		shell.open();
-
-		assertTrue(col1.getWidth() > 100);
-		assertTrue(col1.getWidth() == col2.getWidth());
-		assertTrue(Math.abs(col1.getWidth() - 2 * col3.getWidth()) <= 1);
-	}
-
-	/**
-	 * Ensures that width values based on weight are recalculated when a column falls below minimums.
-	 */
-	public void testRecalculatePreferredSize() {
-		Composite composite = new Composite(shell, SWT.NONE);
-		TableColumnLayout layout = new TableColumnLayout();
-		composite.setLayout(layout);
-
-		Table table = new Table(composite, SWT.BORDER | SWT.H_SCROLL
-				| SWT.V_SCROLL);
-		TableColumn col1 = new TableColumn(table, SWT.LEFT);
-		TableColumn col2 = new TableColumn(table, SWT.LEFT);
-		TableColumn col3 = new TableColumn(table, SWT.LEFT);
-		TableColumn col4 = new TableColumn(table, SWT.LEFT);
-
-		layout.setColumnData(col1, new ColumnWeightData(4,40));
-		layout.setColumnData(col2, new ColumnWeightData(1,200));
-		layout.setColumnData(col3, new ColumnWeightData(2,30));
-		// Needed because last column on GTK always maximized
-		layout.setColumnData(col4, new ColumnPixelData(1));
-		
-
-		composite.layout(true, true);
-		shell.open();
-
-		assertTrue(col1.getWidth() >= 40);
-		assertTrue(col2.getWidth() >= 200);
-		assertTrue(col3.getWidth() >= 30);
-		assertTrue(Math.abs(col1.getWidth() - 2 * col3.getWidth()) <= 1);
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/layout/AllTests.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/layout/AllTests.java
deleted file mode 100644
index 67c0292..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/layout/AllTests.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.layout;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllTests extends TestSuite {
-
-	public static void main(String[] args) {
-		junit.textui.TestRunner.run(suite());
-	}
-
-	public static Test suite() {
-		return new AllTests();
-	}
-
-	public AllTests() {
-		addTestSuite(GeometryTest.class);
-		addTestSuite(AbstractColumnLayoutTest.class);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/layout/GeometryTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/layout/GeometryTest.java
deleted file mode 100644
index 919b158..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/layout/GeometryTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.layout;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.swt.graphics.Rectangle;
-
-/**
- * @since 3.3
- * 
- */
-public class GeometryTest extends TestCase {
-
-	public void testNewGeometryMethods() {
-		// Test the new Geometry methods
-		Rectangle margins = Geometry.createDiffRectangle(0, 10, 40, 80);
-
-		Rectangle testRectangle = new Rectangle(100, 100, 100, 100);
-		Rectangle expandedRectangle = Geometry.add(testRectangle, margins);
-		Rectangle expectedResult = new Rectangle(100, 60, 110, 220);
-
-		assertEquals(expectedResult, expandedRectangle);
-
-		Rectangle difference = Geometry.subtract(expandedRectangle,
-				testRectangle);
-
-		assertEquals(margins, difference);
-
-		Geometry.expand(testRectangle, margins);
-		assertEquals(expectedResult, testRectangle);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/preferences/AllTests.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/preferences/AllTests.java
deleted file mode 100644
index e53e875..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/preferences/AllTests.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.preferences;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllTests extends TestSuite {
-
-	public static void main(String[] args) {
-		junit.textui.TestRunner.run(suite());
-	}
-
-	public static Test suite() {
-		return new AllTests();
-	}
-
-	public AllTests() {
-		addTestSuite(BooleanFieldEditorTest.class);
-		addTestSuite(StringFieldEditorTest.class);
-		addTestSuite(IntegerFieldEditorTest.class);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/preferences/BooleanFieldEditorTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/preferences/BooleanFieldEditorTest.java
deleted file mode 100644
index 2c0fe43..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/preferences/BooleanFieldEditorTest.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Bisson - <mrbisson@ca.ibm.com> Initial test implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.preferences;
-
-import java.lang.reflect.Field;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.preference.PreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-public class BooleanFieldEditorTest extends TestCase {
-
-	private Shell shell;
-	private BooleanFieldEditor bfEditorWithSameLabel;
-	private BooleanFieldEditor bfEditorWithSeparateLabel;
-	
-	private boolean otherThreadEventOccurred = false;
-	private final Object lock = new Object();
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		shell = new Shell();
-		
-		bfEditorWithSameLabel = new BooleanFieldEditor("name", "label", shell);
-		bfEditorWithSeparateLabel = new BooleanFieldEditor("name2", "label", BooleanFieldEditor.SEPARATE_LABEL, shell);
-	}
-	
-	public void testSetLabelText() {
-		bfEditorWithSameLabel.setLabelText("label text");
-		assertEquals("label text", bfEditorWithSameLabel.getLabelText());
-		
-		bfEditorWithSeparateLabel.setLabelText("label text");
-		assertEquals("label text", bfEditorWithSameLabel.getLabelText());
-	}
-	
-	public void testLoad() {	
-		PreferenceStore myPreferenceStore = new PreferenceStore();
-		bfEditorWithSameLabel.setPreferenceName("name");
-		bfEditorWithSameLabel.setPreferenceStore(myPreferenceStore);	
-
-		myPreferenceStore.setDefault("name", true);	//Make sure this doesn't interfere
-		myPreferenceStore.setValue("name", false);
-		bfEditorWithSameLabel.load();
-		assertFalse(bfEditorWithSameLabel.getBooleanValue());
-		
-		myPreferenceStore.setDefault("name", false); //Make sure this doesn't interfere
-		myPreferenceStore.setValue("name", true);
-		bfEditorWithSameLabel.load();
-		assertTrue(bfEditorWithSameLabel.getBooleanValue());
-	}
-	
-	public void testLoadDefault() {	
-		PreferenceStore myPreferenceStore = new PreferenceStore();
-		bfEditorWithSameLabel.setPreferenceName("name");
-		bfEditorWithSameLabel.setPreferenceStore(myPreferenceStore);	
-
-		myPreferenceStore.setDefault("name", false);
-		myPreferenceStore.setValue("name", true);	//Make sure this doesn't interfere
-		bfEditorWithSameLabel.loadDefault();
-		assertFalse(bfEditorWithSameLabel.getBooleanValue());
-		
-		myPreferenceStore.setDefault("name", true);
-		myPreferenceStore.setValue("name", false);	//Make sure this doesn't interfere
-		bfEditorWithSameLabel.loadDefault();
-		assertTrue(bfEditorWithSameLabel.getBooleanValue());
-	}
-	
-	public void testGetBooleanValue() {
-		PreferenceStore myPreferenceStore = new PreferenceStore();
-		bfEditorWithSameLabel.setPreferenceName("name");
-		bfEditorWithSameLabel.setPreferenceStore(myPreferenceStore);	
-
-		myPreferenceStore.setValue("name", true);
-		bfEditorWithSameLabel.load();
-		assertTrue(bfEditorWithSameLabel.getBooleanValue());
-		
-		Button button = getButton(bfEditorWithSameLabel);
-		button.setSelection(false);
-		assertFalse(bfEditorWithSameLabel.getBooleanValue());
-		
-		button.setSelection(true);
-		assertTrue(bfEditorWithSameLabel.getBooleanValue());
-	}
-	
-	public void testStore() {
-		PreferenceStore myPreferenceStore = new PreferenceStore();
-		bfEditorWithSameLabel.setPreferenceName("name");
-		bfEditorWithSameLabel.setPreferenceStore(myPreferenceStore);	
-
-		myPreferenceStore.setValue("name", true);
-		bfEditorWithSameLabel.load();
-		assertTrue(bfEditorWithSameLabel.getBooleanValue());
-		
-		Button button = getButton(bfEditorWithSameLabel);
-		button.setSelection(false);
-		assertTrue(myPreferenceStore.getBoolean("name"));
-		bfEditorWithSameLabel.store();
-		assertFalse(myPreferenceStore.getBoolean("name"));
-		
-		button.setSelection(true);
-		assertTrue(bfEditorWithSameLabel.getBooleanValue());
-		assertFalse(myPreferenceStore.getBoolean("name"));
-		bfEditorWithSameLabel.store();
-		assertTrue(myPreferenceStore.getBoolean("name"));
-	}
-	
-	public void testValueChanged() {
-		bfEditorWithSameLabel.setPropertyChangeListener(new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				otherThreadEventOccurred();
-			}
-		});
-		
-		PreferenceStore myPreferenceStore = new PreferenceStore();
-		bfEditorWithSameLabel.setPreferenceName("name");
-		bfEditorWithSameLabel.setPreferenceStore(myPreferenceStore);	
-
-		myPreferenceStore.setValue("name", false);
-		bfEditorWithSameLabel.load();
-		assertFalse(bfEditorWithSameLabel.getBooleanValue());
-		
-		Button button = getButton(bfEditorWithSameLabel);
-		button.setSelection(true);
-		
-		assertFalse(otherThreadEventOccurred);
-		button.notifyListeners(SWT.Selection, null);
-		assertTrue(bfEditorWithSameLabel.getBooleanValue());
-		
-		waitForEventInOtherThread();
-		
-		assertTrue(otherThreadEventOccurred);
-	}
-
-	
-	public void testSetFocus() {
-		bfEditorWithSameLabel = new BooleanFieldEditor("name", "label", shell){
-			protected Button getChangeControl(Composite parent) {
-				return new Button(parent,SWT.CHECK){
-					protected void checkSubclass() {}
-					public boolean setFocus() {
-						otherThreadEventOccurred();
-						return super.setFocus();
-					}
-				};
-			}
-		};
-		assertFalse(otherThreadEventOccurred);
-		bfEditorWithSameLabel.setFocus();
-		waitForEventInOtherThread();
-		assertTrue(otherThreadEventOccurred);
-	}
-	
-	public void testSetEnabled() {
-		Button buttonWithSameLabel = getButton(bfEditorWithSameLabel);
-		
-		bfEditorWithSameLabel.setEnabled(true, shell);
-		assertTrue(buttonWithSameLabel.isEnabled());
-		
-		bfEditorWithSameLabel.setEnabled(false, shell);
-		assertFalse(buttonWithSameLabel.isEnabled());
-		
-		bfEditorWithSameLabel.setEnabled(true, shell);
-		assertTrue(buttonWithSameLabel.isEnabled());
-		
-		Button buttonWithSeparateLabel = getButton(bfEditorWithSeparateLabel);
-		Label separateLabel = bfEditorWithSeparateLabel.getLabelControl(shell);
-		
-		bfEditorWithSeparateLabel.setEnabled(true, shell);
-		assertTrue(buttonWithSeparateLabel.isEnabled());
-		assertTrue(separateLabel.isEnabled());
-		
-		bfEditorWithSeparateLabel.setEnabled(false, shell);
-		assertFalse(buttonWithSeparateLabel.isEnabled());
-		assertFalse(separateLabel.isEnabled());
-		
-		bfEditorWithSeparateLabel.setEnabled(true, shell);
-		assertTrue(buttonWithSeparateLabel.isEnabled());
-		assertTrue(separateLabel.isEnabled());
-	}
-	
-	public void testAdjustForNumColumns() {
-		final BooleanFieldEditor[] editors = new BooleanFieldEditor[2];
-		
-		PreferencePage page = new FieldEditorPreferencePage(FieldEditorPreferencePage.GRID) {
-			protected void createFieldEditors() {
-				Composite parent = getFieldEditorParent();
-				BooleanFieldEditor bfEditorWithSameLabel = new BooleanFieldEditor("name", "label", parent);
-				BooleanFieldEditor bfEditorWithSeparateLabel = new BooleanFieldEditor("name2", "label", BooleanFieldEditor.SEPARATE_LABEL, parent);
-
-				editors[0] = bfEditorWithSameLabel;
-				editors[1] = bfEditorWithSeparateLabel;
-				
-				addField(bfEditorWithSameLabel);
-				addField(bfEditorWithSeparateLabel);
-			}			
-		};
-		
-		page.createControl(shell);
-		
-		BooleanFieldEditor bfEditorWithSameLabel = editors[0];
-		BooleanFieldEditor bfEditorWithSeparateLabel = editors[1];
-		
-		Button buttonWithSameLabel = getButton(bfEditorWithSameLabel);
-		Button buttonWithSeparateLabel = getButton(bfEditorWithSeparateLabel);
-		
-		int withLabelSpan = ((GridData)buttonWithSameLabel.getLayoutData()).horizontalSpan;
-		int separateLabelSpan = ((GridData)buttonWithSeparateLabel.getLayoutData()).horizontalSpan;
-		
-		assertEquals(withLabelSpan - 1, separateLabelSpan);
-	}
-	
-	/**
-	 * Reads the button control from the BooleanFieldEditor
-	 */
-	private Button getButton(BooleanFieldEditor booleanFieldEditor) {
-		try {
-			Field f = BooleanFieldEditor.class.getDeclaredField("checkBox");
-			f.setAccessible(true);
-			return (Button) f.get(booleanFieldEditor);
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-	}
-	
-	/**
-	 * Invoke to signal a single expected event from another thread.
-	 */
-	private void otherThreadEventOccurred() {
-		synchronized (lock) {
-			otherThreadEventOccurred = true;
-			lock.notify();	
-		}
-	}
-	
-	/**
-	 * Invoke to wait for a single expected event from another thread.
-	 * Times out after one second.
-	 */
-	private void waitForEventInOtherThread() {
-		synchronized (lock) {
-			if(!otherThreadEventOccurred) {
-				try {
-					lock.wait(1000);
-				} catch (InterruptedException e) {
-					throw new RuntimeException(e);
-				}
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		super.tearDown();
-	}
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/preferences/IntegerFieldEditorTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/preferences/IntegerFieldEditorTest.java
deleted file mode 100644
index c839dbf9..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/preferences/IntegerFieldEditorTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Bisson - <mrbisson@ca.ibm.com> Initial test implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.preferences;
-
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.preference.IntegerFieldEditor;
-import org.eclipse.jface.preference.PreferenceStore;
-import org.eclipse.jface.preference.StringFieldEditor;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-public class IntegerFieldEditorTest extends TestCase {
-
-	private Shell shell;
-	private IntegerFieldEditor integerFieldEditor;
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		shell = new Shell();
-		
-		integerFieldEditor = new IntegerFieldEditor("name", "label", shell);
-		integerFieldEditor.setValidRange(0, 500);
-		integerFieldEditor.setValidateStrategy(StringFieldEditor.VALIDATE_ON_KEY_STROKE);
-	}
-	
-	public void testLoad() {	
-		PreferenceStore myPreferenceStore = new PreferenceStore();
-		integerFieldEditor.setPreferenceName("name");
-		integerFieldEditor.setPreferenceStore(myPreferenceStore);	
-
-		myPreferenceStore.setDefault("name", 5);
-		integerFieldEditor.load();
-		assertEquals(integerFieldEditor.getIntValue(), 5);
-		
-		myPreferenceStore.setDefault("name", 5); 
-		myPreferenceStore.setValue("name", 6);
-		integerFieldEditor.load();
-		assertEquals(integerFieldEditor.getIntValue(), 6);
-	}
-	
-	public void testLoadDefault() {	
-		PreferenceStore myPreferenceStore = new PreferenceStore();
-		integerFieldEditor.setPreferenceName("name");
-		integerFieldEditor.setPreferenceStore(myPreferenceStore);	
-
-		myPreferenceStore.setDefault("name", 5);
-		myPreferenceStore.setValue("name", 6);	
-		integerFieldEditor.loadDefault();
-		assertEquals(integerFieldEditor.getIntValue(), 5);
-	}
-	
-	public void testSetValueInWidget() {
-		PreferenceStore myPreferenceStore = new PreferenceStore();
-		integerFieldEditor.setPreferenceName("name");
-		integerFieldEditor.setPreferenceStore(myPreferenceStore);	
-
-		myPreferenceStore.setValue("name", 5);
-		integerFieldEditor.load();
-		assertEquals(integerFieldEditor.getIntValue(), 5);
-		
-		Text text = integerFieldEditor.getTextControl(shell);
-		text.setText("6");
-		assertEquals(integerFieldEditor.getIntValue(), 6);
-	}
-	
-	public void testSetValueInEditor() {
-		PreferenceStore myPreferenceStore = new PreferenceStore();
-		integerFieldEditor.setPreferenceName("name");
-		integerFieldEditor.setPreferenceStore(myPreferenceStore);	
-
-		myPreferenceStore.setValue("name", 5);
-		integerFieldEditor.load();
-		assertEquals(integerFieldEditor.getIntValue(), 5);
-		
-		integerFieldEditor.setStringValue("6");
-		Text text = integerFieldEditor.getTextControl(shell);
-		assertEquals(text.getText(), "6");
-		assertEquals(integerFieldEditor.getIntValue(), 6);
-	}
-	
-	public void testValidate() {
-		PreferenceStore myPreferenceStore = new PreferenceStore();
-		integerFieldEditor.setPreferenceName("name");
-		integerFieldEditor.setPreferenceStore(myPreferenceStore);	
-
-		myPreferenceStore.setValue("name", 5000);
-		integerFieldEditor.load();
-		assertFalse(integerFieldEditor.isValid());
-	}
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		super.tearDown();
-	}
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/preferences/StringFieldEditorTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/preferences/StringFieldEditorTest.java
deleted file mode 100644
index 9390c05..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/preferences/StringFieldEditorTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Matthew Bisson - <mrbisson@ca.ibm.com> Initial test implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.preferences;
-
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.preference.PreferenceStore;
-import org.eclipse.jface.preference.StringFieldEditor;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-public class StringFieldEditorTest extends TestCase {
-
-	private Shell shell;
-	private StringFieldEditor stringFieldEditor;
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		shell = new Shell();
-		
-		stringFieldEditor = new StringFieldEditor("name", "label", shell);
-	}
-	
-	public void testSetLabelText() {
-		stringFieldEditor.setLabelText("label text");
-		assertEquals("label text", stringFieldEditor.getLabelText());
-		
-		stringFieldEditor.setLabelText("label text");
-		assertEquals("label text", stringFieldEditor.getLabelText());
-	}
-	
-	public void testLoad() {	
-		PreferenceStore myPreferenceStore = new PreferenceStore();
-		stringFieldEditor.setPreferenceName("name");
-		stringFieldEditor.setPreferenceStore(myPreferenceStore);	
-
-		myPreferenceStore.setDefault("name", "foo");
-		stringFieldEditor.load();
-		assertEquals(stringFieldEditor.getStringValue(), "foo");
-		
-		myPreferenceStore.setDefault("name", "foo"); 
-		myPreferenceStore.setValue("name", "bar");
-		stringFieldEditor.load();
-		assertEquals(stringFieldEditor.getStringValue(), "bar");
-	}
-	
-	public void testLoadDefault() {	
-		PreferenceStore myPreferenceStore = new PreferenceStore();
-		stringFieldEditor.setPreferenceName("name");
-		stringFieldEditor.setPreferenceStore(myPreferenceStore);	
-
-		myPreferenceStore.setDefault("name", "foo");
-		myPreferenceStore.setValue("name", "bar");	
-		stringFieldEditor.loadDefault();
-		assertEquals(stringFieldEditor.getStringValue(), "foo");
-	}
-	
-	public void testSetValueInWidget() {
-		PreferenceStore myPreferenceStore = new PreferenceStore();
-		stringFieldEditor.setPreferenceName("name");
-		stringFieldEditor.setPreferenceStore(myPreferenceStore);	
-
-		myPreferenceStore.setValue("name", "foo");
-		stringFieldEditor.load();
-		assertEquals(stringFieldEditor.getStringValue(), "foo");
-		
-		Text text = stringFieldEditor.getTextControl(shell);
-		text.setText("bar");
-		assertEquals(stringFieldEditor.getStringValue(), "bar");
-	}
-	
-	public void testSetValueInEditor() {
-		PreferenceStore myPreferenceStore = new PreferenceStore();
-		stringFieldEditor.setPreferenceName("name");
-		stringFieldEditor.setPreferenceStore(myPreferenceStore);	
-
-		myPreferenceStore.setValue("name", "foo");
-		stringFieldEditor.load();
-		assertEquals(stringFieldEditor.getStringValue(), "foo");
-		
-		stringFieldEditor.setStringValue("bar");
-		Text text = stringFieldEditor.getTextControl(shell);
-		assertEquals(text.getText(), "bar");
-		assertEquals(stringFieldEditor.getStringValue(), "bar");
-	}
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		super.tearDown();
-	}
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/AbstractTreeViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/AbstractTreeViewerTest.java
deleted file mode 100644
index 83c99bf..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/AbstractTreeViewerTest.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Widget;
-
-public abstract class AbstractTreeViewerTest extends StructuredItemViewerTest {
-
-    AbstractTreeViewer fTreeViewer;
-
-    public AbstractTreeViewerTest(String name) {
-        super(name);
-    }
-
-    protected void assertEqualsArray(String s, Object[] a1, Object[] a2) {
-        int s1 = a1.length;
-        int s2 = a2.length;
-        assertEquals(s, s1, s2);
-        for (int i = 0; i < s1; i++) {
-            assertEquals(s, a1[i], a2[i]);
-        }
-    }
-
-	protected void assertSelectionEquals(String message, TestElement expected) {
-	    ISelection selection = fViewer.getSelection();
-	    assertTrue(selection instanceof IStructuredSelection);
-	    List expectedList = new ArrayList();
-	    expectedList.add(expected);
-	    IStructuredSelection structuredSelection = (IStructuredSelection)selection;
-	    assertEquals("selectionEquals - " + message, expectedList, (structuredSelection).toList());
-	}
-
-    protected abstract int getItemCount(TestElement element); //was IElement
-
-    public void testBulkExpand() {
-        // navigate
-        TestElement first = fRootElement.getFirstChild();
-        TestElement first2 = first.getFirstChild();
-        TestElement last = fRootElement.getLastChild();
-
-        // expand a few nodes
-        fTreeViewer.expandToLevel(first, 2);
-        fTreeViewer.expandToLevel(first2, 2);
-        fTreeViewer.expandToLevel(last, 2);
-        // get expand state
-        Object[] list1 = fTreeViewer.getExpandedElements();
-        // flush viewer
-        setInput();
-        processEvents();
-
-        // restore old expand state
-        fTreeViewer.collapseAll();
-        fTreeViewer.expandToLevel(first, 2);
-        fTreeViewer.expandToLevel(first2, 2);
-        fTreeViewer.expandToLevel(last, 2);
-
-        Object[] list2 = fTreeViewer.getExpandedElements();
-
-        assertEqualsArray("old and new expand state are the same", list1, list2);
-    }
-
-    public void testDeleteChildExpanded() {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement first2 = first.getFirstChild();
-        fTreeViewer.expandToLevel(first2, 0);
-
-        assertNotNull("first child is visible", fViewer.testFindItem(first2));
-        first.deleteChild(first2);
-        assertNull("first child is not visible", fViewer.testFindItem(first2));
-    }
-
-    public void testDeleteChildren() {
-        TestElement first = fRootElement.getFirstChild();
-        first.deleteChildren();
-        assertTrue("no children", getItemCount(first) == 0);
-    }
-
-    public void testDeleteChildrenExpanded() {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement first2 = first.getFirstChild();
-        fTreeViewer.expandToLevel(first2, 0);
-        assertNotNull("first child is visible", fViewer.testFindItem(first2));
-
-        first.deleteChildren();
-        assertTrue("no children", getItemCount(first) == 0);
-    }
-
-    public void testExpand() {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement first2 = first.getFirstChild();
-        assertNull("first child is not visible", fViewer.testFindItem(first2));
-        fTreeViewer.expandToLevel(first2, 0);
-        assertNotNull("first child is visible", fViewer.testFindItem(first2));
-    }
-
-    public void testExpandElement() {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement first2 = first.getFirstChild();
-        TestElement first3 = first2.getFirstChild();
-        fTreeViewer.expandToLevel(first3, 0);
-        assertNotNull("first3 is visible", fViewer.testFindItem(first3));
-        assertNotNull("first2 is visible", fViewer.testFindItem(first2));
-    }
-
-    public void testExpandToLevel() {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement first2 = first.getFirstChild();
-        TestElement first3 = first2.getFirstChild();
-        fTreeViewer.expandToLevel(3);
-        assertNotNull("first2 is visible", fViewer.testFindItem(first2));
-        assertNotNull("first3 is visible", fViewer.testFindItem(first3));
-    }
-
-    public void testFilterExpanded() {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement first2 = first.getFirstChild();
-        fTreeViewer.expandToLevel(first2, 0);
-
-        fTreeViewer.addFilter(new TestLabelFilter());
-        assertTrue("filtered count", getItemCount() == 5);
-    }
-
-    public void testInsertChildReveal() {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement newElement = first.addChild(TestModelChange.INSERT
-                | TestModelChange.REVEAL);
-        assertNotNull("new sibling is visible", fViewer
-                .testFindItem(newElement));
-    }
-
-    public void testInsertChildRevealSelect() {
-        TestElement last = fRootElement.getLastChild();
-        TestElement newElement = last.addChild(TestModelChange.INSERT
-                | TestModelChange.REVEAL | TestModelChange.SELECT);
-        assertNotNull("new sibling is visible", fViewer
-                .testFindItem(newElement));
-        assertSelectionEquals("new element is selected", newElement);
-    }
-
-    public void testInsertChildRevealSelectExpanded() {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement newElement = first.addChild(TestModelChange.INSERT
-                | TestModelChange.REVEAL | TestModelChange.SELECT);
-        assertNotNull("new sibling is visible", fViewer
-                .testFindItem(newElement));
-        assertSelectionEquals("new element is selected", newElement);
-    }
-
-    /**
-     * Regression test for 1GDN0PX: ITPUI:WIN2000 - SEVERE  - AssertionFailure when expanding Navigator
-     * Problem was:
-     *   - before addition, parent item had no children, and was expanded
-     *   - after addition, during refresh(), updatePlus() added dummy node even though parent item was expanded
-     *   - in updateChildren, it wasn't handling a dummy node
-     */
-    public void testRefreshWithAddedChildren() {
-        TestElement parent = fRootElement.addChild(TestModelChange.INSERT);
-        TestElement child = parent.addChild(TestModelChange.INSERT);
-        ((AbstractTreeViewer) fViewer).setExpandedState(parent, true);
-        parent.deleteChild(child);
-        child = parent.addChild(TestModelChange.STRUCTURE_CHANGE);
-        // On some platforms (namely GTK), removing all children causes the
-        // parent to collapse (actually it's worse than that: GTK doesn't
-        // allow there to be an empty expanded tree item, even if you do a
-        // setExpanded(true)).  
-        // This behaviour makes it impossible to do this regression test.
-        // See bug 40797 for more details.
-        processEvents();
-        if (((AbstractTreeViewer) fViewer).getExpandedState(parent)) {
-            assertNotNull("new child is visible", fViewer.testFindItem(child));
-        }
-    }
-
-    /**
-     * Regression test for 1GBDB5A: ITPUI:WINNT - Exception in AbstractTreeViewer update.
-     * Problem was:
-     *   node has child A
-     *   node gets duplicate child A
-     *   viewer is refreshed rather than using add for new A
-     *   AbstractTreeViewer.updateChildren(...) was not properly handling it
-     */
-    public void testRefreshWithDuplicateChild() {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement newElement = (TestElement) first.clone();
-        fRootElement.addChild(newElement, new TestModelChange(
-                TestModelChange.STRUCTURE_CHANGE, fRootElement));
-        assertNotNull("new sibling is visible", fViewer
-                .testFindItem(newElement));
-    }
-
-    /**
-     * Regression test for Bug 3840 [Viewers] free expansion of jar happening when deleting projects (1GEV2FL)
-     * Problem was:
-     *   - node has children A and B 
-     *   - A is expanded, B is not
-     *   - A gets deleted
-     *   - B gets expanded because it reused A's item
-     */
-    public void testRefreshWithReusedItems() {
-        //        TestElement a= fRootElement.getFirstChild();
-        //        TestElement aa= a.getChildAt(0);
-        //        TestElement ab= a.getChildAt(1);
-        //        fTreeViewer.expandToLevel(aa, 1);
-        //		List expandedBefore = Arrays.asList(fTreeViewer.getExpandedElements());
-        //		assertTrue(expandedBefore.contains(a));
-        //		assertTrue(expandedBefore.contains(aa));
-        //		assertFalse(expandedBefore.contains(ab));
-        //        a.deleteChild(aa, new TestModelChange(TestModelChange.STRUCTURE_CHANGE, a));
-        //        List expandedAfter = Arrays.asList(fTreeViewer.getExpandedElements());
-        //        assertFalse(expandedAfter.contains(ab));
-    }
-
-    public void testRenameChildElement() {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement first2 = first.getFirstChild();
-        fTreeViewer.expandToLevel(first2, 0);
-        assertNotNull("first child is visible", fViewer.testFindItem(first2));
-
-        String newLabel = first2.getLabel() + " changed";
-        first2.setLabel(newLabel);
-        Widget widget = fViewer.testFindItem(first2);
-        assertTrue(widget instanceof Item);
-        assertEquals("changed label", first2.getID() + " " + newLabel,
-                ((Item) widget).getText());
-    }
-
-    /**
-     * Regression test for Bug 26698 [Viewers] stack overflow during debug session, causing IDE to crash
-     * Problem was:
-     *   - node A has child A
-     *   - setExpanded with A in the list caused an infinite recursion 
-     */
-    public void testSetExpandedWithCycle() {
-        TestElement first = fRootElement.getFirstChild();
-        first.addChild(first, new TestModelChange(TestModelChange.INSERT,
-                first, first));
-        fTreeViewer.setExpandedElements(new Object[] { first });
-
-    }
-
-    /**
-     * Test for Bug 41710 - assertion that an object may not be added to a given
-     * TreeItem more than once.     
-     */
-    public void testSetDuplicateChild() {
-        //Widget root = fViewer.testFindItem(fRootElement);
-        //assertNotNull(root);
-        TestElement parent = fRootElement.addChild(TestModelChange.INSERT);
-        TestElement child = parent.addChild(TestModelChange.INSERT);
-        int initialCount = getItemCount(parent);
-        fRootElement.addChild(child, new TestModelChange(
-                TestModelChange.INSERT, fRootElement, child));
-        int postCount = getItemCount(parent);
-        assertEquals("Same element added to a parent twice.", initialCount,
-                postCount);
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.tests.viewers.ViewerTestCase#tearDown()
-     */
-    public void tearDown() {
-    	super.tearDown();
-    	fTreeViewer = null;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/AllTests.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/AllTests.java
deleted file mode 100644
index ab86f08..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/AllTests.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllTests extends TestSuite {
-
-	public static void main(String[] args) {
-		junit.textui.TestRunner.run(suite());
-	}
-
-	public static Test suite() {
-		return new AllTests();
-	}
-
-	public AllTests() {
-		addTestSuite(TreeSelectionTest.class);
-		addTestSuite(MultipleEqualElementsTreeViewerTest.class);
-		addTestSuite(LazySortedCollectionTest.class);
-		addTestSuite(TreeViewerTest.class);
-		addTestSuite(VirtualTreeViewerTest.class);
-		addTestSuite(SimpleTreeViewerTest.class);
-		addTestSuite(SimpleTableViewerTest.class);
-		addTestSuite(SimpleVirtualLazyTreeViewerTest.class);
-		addTestSuite(VirtualLazyTreeViewerTest.class);
-		addTestSuite(TableViewerTest.class);
-		addTestSuite(TreeViewerColumnTest.class);
-		addTestSuite(VirtualTableViewerTest.class);
-		addTestSuite(VirtualLazyTableViewerTest.class);
-		addTestSuite(TableTreeViewerTest.class);
-		addTestSuite(TableColorProviderTest.class);
-		addTestSuite(TableFontProviderTest.class);
-		addTestSuite(ListViewerTest.class);
-		addTestSuite(CheckboxTableViewerTest.class);
-		addTestSuite(CheckboxTreeViewerTest.class);
-		addTestSuite(ComboViewerTest.class);
-		addTestSuite(CComboViewerTest.class);
-		addTestSuite(TreeViewerComparatorTest.class);
-		addTestSuite(ListViewerComparatorTest.class);
-		addTestSuite(TableViewerComparatorTest.class);
-		addTestSuite(Bug138608Test.class);
-		addTestSuite(ComboViewerComparerTest.class);
-		addTestSuite(ListViewerRefreshTest.class);
-		addTestSuite(Bug200558Test.class);
-		addTestSuite(Bug201002TableViewerTest.class);
-		addTestSuite(Bug201002TreeViewerTest.class);
-		addTestSuite(Bug200337TableViewerTest.class);
-		addTestSuite(Bug203657TreeViewerTest.class);
-		addTestSuite(Bug203657TableViewerTest.class);
-		addTestSuite(Bug205700TreeViewerTest.class);
-		addTestSuite(Bug180504TableViewerTest.class);
-		addTestSuite(Bug180504TreeViewerTest.class);
-		addTestSuite(StyledStringBuilderTest.class);
-		addTestSuite(TreeManagerTest.class);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug138608Test.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug138608Test.java
deleted file mode 100644
index da40a0b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug138608Test.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Ivailo Abadjiev (bug 151857)
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeNode;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Description of the bug:
- * Initially tree is populated by way shown below and is completely expanded.
- * 
- * root
- *     |-a
- *        |-c
- *        |-d
- *     |-b
- *        |-c
- * 
- * Then 'd' model element is added as child of 'b' in model and through
- * add(parent,child) method of TreeViewer to tree.
- * 
- * The problem - It seems that calling add(parent,child) has no desired efect.
- * 'd' model element is not shown as child of 'b'!
- * 
- * @since 3.2
- * 
- */
-public class Bug138608Test extends ViewerTestCase {
-
-	private TreeContentProvider contentProvider;
-
-	/**
-	 * @param name
-	 */
-	public Bug138608Test(String name) {
-		super(name);
-	}
-
-	protected StructuredViewer createViewer(Composite parent) {
-		final TreeViewer viewer = new TreeViewer(parent);
-		viewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
-		contentProvider = new TreeContentProvider();
-		LabelProvider labelProvider = new LabelProvider();
-		viewer.setContentProvider(contentProvider);
-		viewer.setLabelProvider(labelProvider);
-		return viewer;
-	}
-
-	protected void setUpModel() {
-		// don't do anything here - we are not using the normal fModel and
-		// fRootElement
-	}
-
-	protected void setInput() {
-		getTreeViewer().setInput(contentProvider.root);
-		getTreeViewer().expandAll();
-	}
-
-	/**
-	 * @return
-	 */
-	private TreeViewer getTreeViewer() {
-		return (TreeViewer) fViewer;
-	}
-
-	public void testBug138608() {
-		processEvents();
-		// Add 'd' as child of 'b' in data model first
-
-		contentProvider.root.getChildren()[1].setChildren(contentProvider.root
-				.getChildren()[0].getChildren());
-		// Then add 'd' as child of 'b' in tree itself
-		// THE PROBLEM IS HERE - after this call Tree will not show his
-		// new child
-
-		getTreeViewer().add(contentProvider.root.getChildren()[1],
-				contentProvider.root.getChildren()[1].getChildren()[1]);
-
-		assertEquals("expected two children of node b", 2, getTreeViewer()
-				.getTree().getItem(1).getItemCount());
-
-		getTreeViewer().add(contentProvider.root.getChildren()[1],
-				contentProvider.root.getChildren()[1].getChildren()[1]);
-
-		assertEquals("expected two children of node b", 2, getTreeViewer()
-				.getTree().getItem(1).getItemCount());
-
-	}
-
-	public void tearDown() {
-		contentProvider = null;
-		super.tearDown();
-	}
-
-	private static class TreeContentProvider implements ITreeContentProvider {
-
-		public TreeNode root = new TreeNode("root");
-
-		public TreeContentProvider() {
-			TreeNode d = new TreeNode("d");
-			TreeNode c = new TreeNode("c");
-			TreeNode b = new TreeNode("b");
-			TreeNode a = new TreeNode("a");
-			// build initial hierarchy
-			root.setChildren(new TreeNode[] { a, b });
-			a.setChildren(new TreeNode[] { c, d });
-			b.setChildren(new TreeNode[] { c });
-		}
-
-		public Object[] getChildren(Object parentElement) {
-			return ((TreeNode) parentElement).getChildren();
-		}
-
-		public Object getParent(Object element) {
-			return ((TreeNode) element).getParent();
-		}
-
-		public boolean hasChildren(Object element) {
-			return ((TreeNode) element).hasChildren();
-		}
-
-		public Object[] getElements(Object inputElement) {
-			return getChildren(inputElement);
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug180504TableViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug180504TableViewerTest.java
deleted file mode 100644
index 057e980..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug180504TableViewerTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * @since 3.3
- *
- */
-public class Bug180504TableViewerTest extends ViewerTestCase {
-
-	/**
-	 * @param name
-	 */
-	public Bug180504TableViewerTest(String name) {
-		super(name);
-		// TODO Auto-generated constructor stub
-	}
-
-	protected StructuredViewer createViewer(Composite parent) {
-		final TableViewer tableViewer = new TableViewer(parent, SWT.FULL_SELECTION);
-		tableViewer.setContentProvider(new ArrayContentProvider());
-		tableViewer.setCellEditors(new CellEditor[] { new TextCellEditor(
-				tableViewer.getTable()) });
-		tableViewer.setColumnProperties(new String[] { "0" });
-		tableViewer.setCellModifier(new ICellModifier() {
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return "";
-			}
-
-			public void modify(Object element, String property, Object value) {
-				tableViewer.getControl().dispose();
-			}
-
-		});
-
-	    new TableColumn(tableViewer.getTable(), SWT.NONE).setWidth(200);
-
-		return tableViewer;
-	}
-
-	protected void setUpModel() {
-		// don't do anything here - we are not using the normal fModel and
-		// fRootElement
-	}
-
-	protected void setInput() {
-		String[] ar = new String[100];
-		for( int i = 0; i < ar.length; i++ ) {
-			ar[i] = i + "";
-		}
-		getTableViewer().setInput(ar);
-	}
-
-	private TableViewer getTableViewer() {
-		return (TableViewer) fViewer;
-	}
-
-	public void testBug180504ApplyEditor() {
-		getTableViewer().editElement(getTableViewer().getElementAt(0), 0);
-		Method m;
-		try {
-			m = ColumnViewer.class.getDeclaredMethod("applyEditorValue", new Class[0]);
-			m.setAccessible(true);
-			m.invoke(getTableViewer(), new Object[0]);
-		} catch (SecurityException e) {
-			e.printStackTrace();
-			fail(e.getMessage());
-		} catch (NoSuchMethodException e) {
-			e.printStackTrace();
-			fail(e.getMessage());
-		} catch (IllegalArgumentException e) {
-			e.printStackTrace();
-			fail(e.getMessage());
-		} catch (IllegalAccessException e) {
-			e.printStackTrace();
-			fail(e.getMessage());
-		} catch (InvocationTargetException e) {
-			e.printStackTrace();
-			fail(e.getMessage());
-
-		}
-	}
-
-	public void testBug180504CancleEditor() {
-		getTableViewer().editElement(getTableViewer().getElementAt(0), 0);
-		getTableViewer().cancelEditing();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug180504TreeViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug180504TreeViewerTest.java
deleted file mode 100644
index cf194e9..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug180504TreeViewerTest.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TreeColumn;
-
-/**
- * @since 3.3
- *
- */
-public class Bug180504TreeViewerTest extends ViewerTestCase {
-	public class MyModel {
-		public MyModel parent;
-
-		public ArrayList child = new ArrayList();
-
-		public int counter;
-
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if (parent != null) {
-				rv = parent.toString() + ".";
-			}
-
-			rv += counter;
-
-			return rv;
-		}
-	}
-	/**
-	 * @param name
-	 */
-	public Bug180504TreeViewerTest(String name) {
-		super(name);
-		// TODO Auto-generated constructor stub
-	}
-
-	protected StructuredViewer createViewer(Composite parent) {
-		final TreeViewer treeViewer = new TreeViewer(parent, SWT.FULL_SELECTION);
-
-		treeViewer.setContentProvider(new ITreeContentProvider() {
-
-			public Object[] getElements(Object inputElement) {
-				return ((MyModel) inputElement).child.toArray();
-			}
-
-			public void dispose() {
-
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-
-			}
-
-			public Object[] getChildren(Object parentElement) {
-				return getElements(parentElement);
-			}
-
-			public Object getParent(Object element) {
-				if (element == null) {
-					return null;
-				}
-
-				return ((MyModel) element).parent;
-			}
-
-			public boolean hasChildren(Object element) {
-				return ((MyModel) element).child.size() > 0;
-			}
-		});
-
-		treeViewer.setCellEditors(new CellEditor[] { new TextCellEditor(
-				treeViewer.getTree()) });
-		treeViewer.setColumnProperties(new String[] { "0" });
-		treeViewer.setCellModifier(new ICellModifier() {
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return "";
-			}
-
-			public void modify(Object element, String property, Object value) {
-				treeViewer.getControl().dispose();
-			}
-
-		});
-
-		new TreeColumn(treeViewer.getTree(), SWT.NONE).setWidth(200);
-
-		return treeViewer;
-	}
-
-	protected void setUpModel() {
-		// don't do anything here - we are not using the normal fModel and
-		// fRootElement
-	}
-
-	protected void setInput() {
-		MyModel root = new MyModel(0, null);
-		root.counter = 0;
-
-		MyModel tmp;
-		for (int i = 1; i < 100; i++) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for (int j = 1; j < i; j++) {
-				tmp.child.add(new MyModel(j, tmp));
-			}
-		}
-
-		getTreeViewer().setInput(root);
-	}
-
-	private TreeViewer getTreeViewer() {
-		return (TreeViewer) fViewer;
-	}
-
-	public void testBug201002() {
-		getTreeViewer().editElement(((MyModel)((MyModel)getTreeViewer().getInput()).child.get(90)).child.get(10), 0);
-		Method m;
-		try {
-			m = ColumnViewer.class.getDeclaredMethod("applyEditorValue", new Class[0]);
-			m.setAccessible(true);
-			m.invoke(getTreeViewer(), new Object[0]);
-		} catch (SecurityException e) {
-			e.printStackTrace();
-			fail(e.getMessage());
-		} catch (NoSuchMethodException e) {
-			e.printStackTrace();
-			fail(e.getMessage());
-		} catch (IllegalArgumentException e) {
-			e.printStackTrace();
-			fail(e.getMessage());
-		} catch (IllegalAccessException e) {
-			e.printStackTrace();
-			fail(e.getMessage());
-		} catch (InvocationTargetException e) {
-			e.printStackTrace();
-			fail(e.getMessage());
-		}
-	}
-
-	public void testBug180504CancleEditor() {
-		getTreeViewer().editElement(((MyModel)((MyModel)getTreeViewer().getInput()).child.get(90)).child.get(10), 0);
-		getTreeViewer().cancelEditing();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug200337TableViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug200337TableViewerTest.java
deleted file mode 100644
index 007039c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug200337TableViewerTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * @since 3.3
- *
- */
-public class Bug200337TableViewerTest extends ViewerTestCase {
-
-	/**
-	 * @param name
-	 */
-	public Bug200337TableViewerTest(String name) {
-		super(name);
-		// TODO Auto-generated constructor stub
-	}
-
-	protected StructuredViewer createViewer(Composite parent) {
-		final TableViewer tableViewer = new TableViewer(parent, SWT.FULL_SELECTION);
-		tableViewer.setContentProvider(new ArrayContentProvider());
-		tableViewer.setCellEditors(new CellEditor[] { new TextCellEditor(
-				tableViewer.getTable()) });
-		tableViewer.setColumnProperties(new String[] { "0" });
-		tableViewer.setCellModifier(new ICellModifier() {
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return "";
-			}
-
-			public void modify(Object element, String property, Object value) {
-			}
-
-		});
-
-	    new TableColumn(tableViewer.getTable(), SWT.NONE).setWidth(200);
-
-		return tableViewer;
-	}
-
-	protected void setUpModel() {
-		// don't do anything here - we are not using the normal fModel and
-		// fRootElement
-	}
-
-	protected void setInput() {
-		String[] ar = new String[100];
-		for( int i = 0; i < ar.length; i++ ) {
-			ar[i] = i + "";
-		}
-		getTableViewer().setInput(ar);
-	}
-
-	private TableViewer getTableViewer() {
-		return (TableViewer) fViewer;
-	}
-
-	public void testBug200337() {
-		getTableViewer().editElement(getTableViewer().getElementAt(0), 0);
-		getTableViewer().editElement(getTableViewer().getElementAt(90), 0);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug200558Test.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug200558Test.java
deleted file mode 100644
index 1e9a245..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug200558Test.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.TreeColumn;
-
-/**
- * @since 3.3
- *
- */
-public class Bug200558Test extends ViewerTestCase {
-
-	/**
-	 * @param name
-	 */
-	public Bug200558Test(String name) {
-		super(name);
-		// TODO Auto-generated constructor stub
-	}
-
-	protected StructuredViewer createViewer(Composite parent) {
-		final TreeViewer treeViewer = new TreeViewer(parent, SWT.FULL_SELECTION);
-		treeViewer.setContentProvider(new ITreeContentProvider() {
-
-			public void dispose() {
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-			}
-
-			public Object[] getElements(Object inputElement) {
-				return new Object[] { "item" };
-			}
-
-			public Object[] getChildren(Object parentElement) {
-				return null;
-			}
-
-			public Object getParent(Object element) {
-				return null;
-			}
-
-			public boolean hasChildren(Object element) {
-				return false;
-			}
-
-		});
-		treeViewer.setCellEditors(new CellEditor[] { new TextCellEditor(
-				treeViewer.getTree()) });
-		treeViewer.setColumnProperties(new String[] { "0" });
-		treeViewer.setCellModifier(new ICellModifier() {
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return "Test";
-			}
-
-			public void modify(Object element, String property, Object value) {
-			}
-
-		});
-
-	    new TreeColumn(treeViewer.getTree(), SWT.NONE);
-	    new TreeColumn(treeViewer.getTree(), SWT.NONE).setWidth(100);
-
-		return treeViewer;
-	}
-
-	protected void setUpModel() {
-		// don't do anything here - we are not using the normal fModel and
-		// fRootElement
-	}
-
-	protected void setInput() {
-		getTreeViewer().setInput(new Object());
-		getTreeViewer().getTree().getColumn(0).dispose();
-	}
-
-	private TreeViewer getTreeViewer() {
-		return (TreeViewer) fViewer;
-	}
-
-	public void testBug200558() {
-		getTreeViewer().editElement(getTreeViewer().getTree().getItem(0).getData(), 0);
-		assertEquals("Test", ((Text)getTreeViewer().getCellEditors()[0].getControl()).getText());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug201002TableViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug201002TableViewerTest.java
deleted file mode 100644
index 337883f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug201002TableViewerTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * @since 3.3
- *
- */
-public class Bug201002TableViewerTest extends ViewerTestCase {
-
-	/**
-	 * @param name
-	 */
-	public Bug201002TableViewerTest(String name) {
-		super(name);
-		// TODO Auto-generated constructor stub
-	}
-
-	protected StructuredViewer createViewer(Composite parent) {
-		final TableViewer tableViewer = new TableViewer(parent, SWT.FULL_SELECTION);
-		tableViewer.setContentProvider(new ArrayContentProvider());
-		tableViewer.setCellEditors(new CellEditor[] { new TextCellEditor(
-				tableViewer.getTable()) });
-		tableViewer.setColumnProperties(new String[] { "0" });
-		tableViewer.setCellModifier(new ICellModifier() {
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return "";
-			}
-
-			public void modify(Object element, String property, Object value) {
-			}
-
-		});
-
-	    new TableColumn(tableViewer.getTable(), SWT.NONE).setWidth(200);
-
-		return tableViewer;
-	}
-
-	protected void setUpModel() {
-		// don't do anything here - we are not using the normal fModel and
-		// fRootElement
-	}
-
-	protected void setInput() {
-		String[] ar = new String[100];
-		for( int i = 0; i < ar.length; i++ ) {
-			ar[i] = i + "";
-		}
-		getTableViewer().setInput(ar);
-	}
-
-	private TableViewer getTableViewer() {
-		return (TableViewer) fViewer;
-	}
-
-	public void testBug201002() {
-		getTableViewer().getTable().setTopIndex(0);
-		getTableViewer().editElement(getTableViewer().getElementAt(90), 0);
-
-		// GTK-Issue where call to getTopItem() immediately
-		// afterwards will fail
-		while( getTableViewer().getTable().getDisplay().readAndDispatch () ) {
-
-		}
-
-		assertEquals(true, getTableViewer().getTable().getTopIndex() != 0);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug201002TreeViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug201002TreeViewerTest.java
deleted file mode 100644
index 2b57d5e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug201002TreeViewerTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TreeColumn;
-
-/**
- * @since 3.3
- *
- */
-public class Bug201002TreeViewerTest extends ViewerTestCase {
-	public class MyModel {
-		public MyModel parent;
-
-		public ArrayList child = new ArrayList();
-
-		public int counter;
-
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if (parent != null) {
-				rv = parent.toString() + ".";
-			}
-
-			rv += counter;
-
-			return rv;
-		}
-	}
-	/**
-	 * @param name
-	 */
-	public Bug201002TreeViewerTest(String name) {
-		super(name);
-		// TODO Auto-generated constructor stub
-	}
-
-	protected StructuredViewer createViewer(Composite parent) {
-		final TreeViewer treeViewer = new TreeViewer(parent, SWT.FULL_SELECTION);
-
-		treeViewer.setContentProvider(new ITreeContentProvider() {
-
-			public Object[] getElements(Object inputElement) {
-				return ((MyModel) inputElement).child.toArray();
-			}
-
-			public void dispose() {
-
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-
-			}
-
-			public Object[] getChildren(Object parentElement) {
-				return getElements(parentElement);
-			}
-
-			public Object getParent(Object element) {
-				if (element == null) {
-					return null;
-				}
-
-				return ((MyModel) element).parent;
-			}
-
-			public boolean hasChildren(Object element) {
-				return ((MyModel) element).child.size() > 0;
-			}
-		});
-
-		treeViewer.setCellEditors(new CellEditor[] { new TextCellEditor(
-				treeViewer.getTree()) });
-		treeViewer.setColumnProperties(new String[] { "0" });
-		treeViewer.setCellModifier(new ICellModifier() {
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return "";
-			}
-
-			public void modify(Object element, String property, Object value) {
-			}
-
-		});
-
-		new TreeColumn(treeViewer.getTree(), SWT.NONE).setWidth(200);
-
-		return treeViewer;
-	}
-
-	protected void setUpModel() {
-		// don't do anything here - we are not using the normal fModel and
-		// fRootElement
-	}
-
-	protected void setInput() {
-		MyModel root = new MyModel(0, null);
-		root.counter = 0;
-
-		MyModel tmp;
-		for (int i = 1; i < 100; i++) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for (int j = 1; j < i; j++) {
-				tmp.child.add(new MyModel(j, tmp));
-			}
-		}
-
-		getTreeViewer().setInput(root);
-	}
-
-	private TreeViewer getTreeViewer() {
-		return (TreeViewer) fViewer;
-	}
-
-	public void testBug201002() {
-		getTreeViewer().getTree().setTopItem(
-				getTreeViewer().getTree().getItem(0));
-		getTreeViewer().editElement(((MyModel)((MyModel)getTreeViewer().getInput()).child.get(90)).child.get(10), 0);
-
-		// GTK-Issue where call to getTopItem() immediately
-		// afterwards will fail
-		while( getTreeViewer().getTree().getDisplay().readAndDispatch () ) {
-
-		}
-
-		assertEquals(true,
-				getTreeViewer().getTree().getTopItem() != getTreeViewer()
-						.getTree().getItem(0));
-	}
-
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug203657TableViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug203657TableViewerTest.java
deleted file mode 100644
index 5332a50..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug203657TableViewerTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import java.lang.reflect.Field;
-
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * @since 3.3
- *
- */
-public class Bug203657TableViewerTest extends ViewerTestCase {
-
-	/**
-	 * @param name
-	 */
-	public Bug203657TableViewerTest(String name) {
-		super(name);
-		// TODO Auto-generated constructor stub
-	}
-
-	protected StructuredViewer createViewer(Composite parent) {
-		final TableViewer tableViewer = new TableViewer(parent, SWT.FULL_SELECTION);
-		tableViewer.setContentProvider(new ArrayContentProvider());
-		tableViewer.setCellEditors(new CellEditor[] { new TextCellEditor(
-				tableViewer.getTable()) });
-		tableViewer.setColumnProperties(new String[] { "0" });
-		tableViewer.setCellModifier(new ICellModifier() {
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return "";
-			}
-
-			public void modify(Object element, String property, Object value) {
-			}
-
-		});
-
-	    new TableColumn(tableViewer.getTable(), SWT.NONE).setWidth(200);
-
-		return tableViewer;
-	}
-
-	protected void setUpModel() {
-		// don't do anything here - we are not using the normal fModel and
-		// fRootElement
-	}
-
-	protected void setInput() {
-		String[] ar = new String[100];
-		for( int i = 0; i < ar.length; i++ ) {
-			ar[i] = i + "";
-		}
-		getTableViewer().setInput(ar);
-	}
-
-	private TableViewer getTableViewer() {
-		return (TableViewer) fViewer;
-	}
-
-	public void testBug203657() {
-		try {
-			Field f = ColumnViewer.class.getDeclaredField("cell");
-			f.setAccessible(true);
-			ViewerCell cell = (ViewerCell) f.get(getTableViewer());
-			assertNull(cell.getElement());
-			assertNull(cell.getViewerRow());
-			assertEquals(0, cell.getColumnIndex());
-		} catch (SecurityException e) {
-			fail(e.getMessage());
-		} catch (NoSuchFieldException e) {
-			fail(e.getMessage());
-		} catch (IllegalArgumentException e) {
-			fail(e.getMessage());
-		} catch (IllegalAccessException e) {
-			fail(e.getMessage());
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug203657TreeViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug203657TreeViewerTest.java
deleted file mode 100644
index b5cab34..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug203657TreeViewerTest.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TreeColumn;
-
-/**
- * @since 3.3
- *
- */
-public class Bug203657TreeViewerTest extends ViewerTestCase {
-	public class MyModel {
-		public MyModel parent;
-
-		public ArrayList child = new ArrayList();
-
-		public int counter;
-
-		public MyModel(int counter, MyModel parent) {
-			this.parent = parent;
-			this.counter = counter;
-		}
-
-		public String toString() {
-			String rv = "Item ";
-			if (parent != null) {
-				rv = parent.toString() + ".";
-			}
-
-			rv += counter;
-
-			return rv;
-		}
-	}
-	/**
-	 * @param name
-	 */
-	public Bug203657TreeViewerTest(String name) {
-		super(name);
-		// TODO Auto-generated constructor stub
-	}
-
-	protected StructuredViewer createViewer(Composite parent) {
-		final TreeViewer treeViewer = new TreeViewer(parent, SWT.FULL_SELECTION);
-
-		treeViewer.setContentProvider(new ITreeContentProvider() {
-
-			public Object[] getElements(Object inputElement) {
-				return ((MyModel) inputElement).child.toArray();
-			}
-
-			public void dispose() {
-
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-
-			}
-
-			public Object[] getChildren(Object parentElement) {
-				return getElements(parentElement);
-			}
-
-			public Object getParent(Object element) {
-				if (element == null) {
-					return null;
-				}
-
-				return ((MyModel) element).parent;
-			}
-
-			public boolean hasChildren(Object element) {
-				return ((MyModel) element).child.size() > 0;
-			}
-		});
-
-		treeViewer.setCellEditors(new CellEditor[] { new TextCellEditor(
-				treeViewer.getTree()) });
-		treeViewer.setColumnProperties(new String[] { "0" });
-		treeViewer.setCellModifier(new ICellModifier() {
-			public boolean canModify(Object element, String property) {
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				return "";
-			}
-
-			public void modify(Object element, String property, Object value) {
-			}
-
-		});
-
-		new TreeColumn(treeViewer.getTree(), SWT.NONE).setWidth(200);
-
-		return treeViewer;
-	}
-
-	protected void setUpModel() {
-		// don't do anything here - we are not using the normal fModel and
-		// fRootElement
-	}
-
-	protected void setInput() {
-		MyModel root = new MyModel(0, null);
-		root.counter = 0;
-
-		MyModel tmp;
-		for (int i = 1; i < 100; i++) {
-			tmp = new MyModel(i, root);
-			root.child.add(tmp);
-			for (int j = 1; j < i; j++) {
-				tmp.child.add(new MyModel(j, tmp));
-			}
-		}
-
-		getTreeViewer().setInput(root);
-	}
-
-	private TreeViewer getTreeViewer() {
-		return (TreeViewer) fViewer;
-	}
-
-	public void testBug203657() {
-		try {
-			Field f = ColumnViewer.class.getDeclaredField("cell");
-			f.setAccessible(true);
-			ViewerCell cell = (ViewerCell) f.get(getTreeViewer());
-			assertNull(cell.getElement());
-			assertNull(cell.getViewerRow());
-			assertEquals(0, cell.getColumnIndex());
-		} catch (SecurityException e) {
-			fail(e.getMessage());
-		} catch (NoSuchFieldException e) {
-			fail(e.getMessage());
-		} catch (IllegalArgumentException e) {
-			fail(e.getMessage());
-		} catch (IllegalAccessException e) {
-			fail(e.getMessage());
-		}
-	}
-
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug205700TreeViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug205700TreeViewerTest.java
deleted file mode 100644
index bfcdd8d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/Bug205700TreeViewerTest.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Lasse Knudsen and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Lasse Knudsen - initial API and implementation, bug 205700
- *     Boris Bokowski, IBM - additional test cases
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-
-public class Bug205700TreeViewerTest extends TestCase {
-
-	private Shell shell;
-
-	private TreeViewer viewer;
-
-	private TreeNode rootNode;
-
-	private final TreeNode child1 = new TreeNode("Child1");
-
-	private final TreeNode child5 = new TreeNode("Child5");
-
-	private final TreeNode child10 = new TreeNode("Child10");
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		shell = new Shell();
-
-		viewer = new TreeViewer(shell, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-
-		viewer.setContentProvider(new InternalContentProvider());
-		viewer.setLabelProvider(new InternalLabelProvider());
-
-		viewer.setInput(createInput());
-
-		shell.open();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		shell.close();
-	}
-
-	public void testAddWithoutSorter() throws Exception {
-		assertItemNames(new String[] { "Child1", "Child5", "Child10" });
-
-		rootNode.add(new TreeNode("Child2"));
-		rootNode.add(new TreeNode("Child3"));
-		rootNode.add(new TreeNode("Child4"));
-		rootNode.add(new TreeNode("Child6"));
-		rootNode.add(new TreeNode("Child7"));
-		rootNode.add(new TreeNode("Child8"));
-		rootNode.add(new TreeNode("Child9"));
-
-		viewer.add(rootNode, rootNode.getChildren().toArray());
-
-		assertItemNames(new String[] { "Child1", "Child5", "Child10", "Child2",
-				"Child3", "Child4", "Child6", "Child7", "Child8", "Child9" });
-	}
-
-	/**
-	 * @param names
-	 */
-	private void assertItemNames(String[] names) {
-		for (int i = 0; i < names.length; i++) {
-			assertItemName(i, names[i]);
-		}
-	}
-
-	/**
-	 * @param index
-	 * @param name
-	 */
-	private void assertItemName(int index, String name) {
-		assertEquals("at " + index, name, viewer.getTree().getItem(index)
-				.getText());
-	}
-
-	public void testAddWithSorter() throws Exception {
-		assertItemNames(new String[] { "Child1", "Child5", "Child10" });
-		viewer.setSorter(new ViewerSorter());
-		assertItemNames(new String[] { "Child1", "Child10", "Child5" });
-
-		rootNode.add(new TreeNode("Child2"));
-		rootNode.add(new TreeNode("Child3"));
-		rootNode.add(new TreeNode("Child4"));
-		rootNode.add(new TreeNode("Child6"));
-		rootNode.add(new TreeNode("Child7"));
-		rootNode.add(new TreeNode("Child8"));
-		rootNode.add(new TreeNode("Child9"));
-
-		viewer.add(rootNode, rootNode.getChildren().toArray());
-
-		assertItemNames(new String[] { "Child1", "Child10", "Child2", "Child3",
-				"Child4", "Child5", "Child6", "Child7", "Child8", "Child9" });
-	}
-
-	public void testAddEquallySortedElements() throws Exception {
-		assertItemNames(new String[] { "Child1", "Child5", "Child10" });
-		viewer.setSorter(new ViewerSorter());
-		assertItemNames(new String[] { "Child1", "Child10", "Child5" });
-
-		// add before the existing "Child1" node
-		rootNode.getChildren().add(0, new TreeNode("Child1"));
-
-		viewer.add(rootNode, rootNode.getChildren().toArray());
-
-		assertItemNames(new String[] { "Child1", "Child1", "Child10",
-				"Child5" });
-	}
-
-	private Object createInput() {
-		rootNode = new TreeNode("Root");
-
-		rootNode.add(child1);
-		rootNode.add(child5);
-		rootNode.add(child10);
-
-		return rootNode;
-	}
-
-	private class TreeNode {
-
-		private final String name;
-
-		private TreeNode parent = null;
-
-		private final List children = new ArrayList();
-
-		public TreeNode(String name) {
-			this.name = name;
-		}
-
-		public void add(TreeNode newChild) {
-			if (newChild != null) {
-				children.add(newChild);
-			}
-		}
-
-		public List getChildren() {
-			return children;
-		}
-
-		public TreeNode getParent() {
-			return parent;
-		}
-
-		public String getName() {
-			return name;
-		}
-
-		public String toString() {
-			return getName();
-		}
-	}
-
-	private class InternalLabelProvider extends LabelProvider {
-		public String getText(Object element) {
-			if (element instanceof TreeNode) {
-				return ((TreeNode) element).getName();
-			}
-			return null;
-		}
-	}
-
-	private class InternalContentProvider implements ITreeContentProvider {
-		public Object[] getChildren(Object parentElement) {
-			if (parentElement instanceof TreeNode) {
-				return ((TreeNode) parentElement).getChildren().toArray();
-			}
-			return new Object[0];
-		}
-
-		public Object getParent(Object element) {
-			if (element instanceof TreeNode) {
-				return ((TreeNode) element).getParent();
-			}
-			return null;
-		}
-
-		public boolean hasChildren(Object element) {
-			if (element instanceof TreeNode) {
-				return !((TreeNode) element).getChildren().isEmpty();
-			}
-			return false;
-		}
-
-		public Object[] getElements(Object inputElement) {
-			return getChildren(inputElement);
-		}
-
-		public void dispose() {
-			// nothing
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			// nothing
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CComboViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CComboViewerTest.java
deleted file mode 100644
index fe7b581..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CComboViewerTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * @since 3.0
- */
-public class CComboViewerTest extends StructuredViewerTest {
-    public CComboViewerTest(String name) {
-        super(name);
-    }
-
-    protected StructuredViewer createViewer(Composite parent) {
-    	CCombo cCombo = new CCombo(parent, SWT.READ_ONLY | SWT.BORDER);
-        ComboViewer viewer = new ComboViewer(cCombo);
-        viewer.setContentProvider(new TestModelContentProvider());
-        return viewer;
-    }
-
-    protected int getItemCount() {
-        TestElement first = fRootElement.getFirstChild();
-        CCombo list = (CCombo) fViewer.testFindItem(first);
-        return list.getItemCount();
-    }
-
-    protected String getItemText(int at) {
-        CCombo list = (CCombo) fViewer.getControl();
-        return list.getItem(at);
-    }
-
-    public static void main(String args[]) {
-        junit.textui.TestRunner.run(CComboViewerTest.class);
-    }
-
-    /**
-     * TODO: Determine if this test is applicable to ComboViewer 
-     */
-    public void testInsertChild() {
-
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CheckStateProviderTestsUtil.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CheckStateProviderTestsUtil.java
deleted file mode 100644
index 7ef751c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CheckStateProviderTestsUtil.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ICheckStateProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-
-/**
- * Utilities for testing ICheckStateProviders.
- * @since 3.5
- */
-public class CheckStateProviderTestsUtil {
-	private static final int NUMBER_OF_STATES = 4;
-
-	/**
-	 * An ICheckStateProvider which records whether
-	 * its isChecked and isGrayed methods are invoked.
-	 * @since 3.5
-	 */
-	public static class TestMethodsInvokedCheckStateProvider implements ICheckStateProvider {
-		public List isCheckedInvokedOn = new ArrayList();
-		public List isGrayedInvokedOn = new ArrayList();
-		
-		public boolean isChecked(Object element) {
-			isCheckedInvokedOn.add(element);
-			return true;
-		}
-
-		public boolean isGrayed(Object element) {
-			isGrayedInvokedOn.add(element);
-			return true;
-		}
-		
-		public void reset() {
-			isCheckedInvokedOn = new ArrayList();
-			isGrayedInvokedOn = new ArrayList();
-		}
-	}
-	
-	/**
-	 * An ICheckStateProvider which provides a consistent
-	 * variety of states for input elements based on the
-	 * parameter provided in the constructor.
-	 * @since 3.5
-	 */
-	public static final class TestCheckStateProvider extends TestMethodsInvokedCheckStateProvider {
-		private int shift;
-		
-		/**
-		 * A value from 0 to 2 which will change the 
-		 * checkstate assignments.
-		 * @param shift
-		 */
-		public TestCheckStateProvider(int shift) {
-			this.shift = shift;
-		}
-		
-		public boolean isChecked(Object element) {
-			super.isChecked(element);
-			return shouldBeChecked((TestElement)element, shift);
-		}
-
-		public boolean isGrayed(Object element) {
-			super.isGrayed(element);
-			return shouldBeGrayed((TestElement)element, shift);
-		}
-	}
-	
-	/**
-	 * A sorter for TestElements.
-	 * @since 3.5
-	 */
-	public static final class Sorter extends ViewerSorter {
-		public int compare(Viewer viewer, Object e1, Object e2) {
-			return constructNumber((TestElement)e1) - constructNumber((TestElement)e2);
-		}
-	}
-	
-	/**
-	 * A filter for TestElements.
-	 * @since 3.5
-	 */
-	public static final class Filter extends ViewerFilter {
-		public boolean select(Viewer viewer, Object parentElement, Object element) {
-			return (constructNumber((TestElement)element) % (NUMBER_OF_STATES * 2 - 1)) == (NUMBER_OF_STATES - 1);
-		}
-	}
-    /**
-     * @param te
-     * @return	a number between 0 and 3 based on <code>te</code>. 
-     * 	Given the same TestElement, this function always returns the
-     * 	same value.
-     */
-	public static int constructNumber(TestElement te) {
-		String id = te.getID();
-		int number = Integer.parseInt(id.substring(id.lastIndexOf('-') + 1)) + id.length();
-		return number % NUMBER_OF_STATES;
-	}
-	
-	/**
-	 * @param te
-	 * @param shift	a parameter to change all check states
-	 * 		to be different (use to simulate different
-	 * 		providers over time)
-	 * @return	true iff <code>te</code> should be checked
-	 */
-	public static boolean shouldBeChecked(TestElement te, int shift) {
-		return ((constructNumber(te) + shift) % NUMBER_OF_STATES) > 1;
-	}
-	
-	/**
-	 * @param te
-	 * @param shift	a parameter to change all check states
-	 * 		to be different (use to simulate different
-	 * 		providers over time)
-	 * @return	true iff <code>te</code> should be grayed
-	 */	
-	public static boolean shouldBeGrayed(TestElement te, int shift) {
-		return ((constructNumber(te) + shift) % NUMBER_OF_STATES) % 2 == 1;
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CheckboxTableViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CheckboxTableViewerTest.java
deleted file mode 100644
index 3154135..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CheckboxTableViewerTest.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.util.Iterator;
-
-import org.eclipse.jface.tests.viewers.CheckStateProviderTestsUtil.TestCheckStateProvider;
-import org.eclipse.jface.tests.viewers.CheckStateProviderTestsUtil.TestMethodsInvokedCheckStateProvider;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ICheckStateProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-public class CheckboxTableViewerTest extends TableViewerTest {
-    public static class CheckboxTableTestLabelProvider extends
-            TestLabelProvider implements ITableLabelProvider {
-
-        public boolean fExtended = false;
-
-        public String getText(Object element) {
-            if (fExtended)
-                return providedString((String) element);
-            return element.toString();
-        }
-
-        public String getColumnText(Object element, int index) {
-            if (fExtended)
-                return providedString((TestElement) element);
-            return element.toString();
-        }
-
-        public Image getColumnImage(Object element, int columnIndex) {
-            return null;
-        }
-    }
-
-    public CheckboxTableViewerTest(String name) {
-        super(name);
-    }
-
-    protected StructuredViewer createViewer(Composite parent) {
-        Table table = new Table(parent, SWT.CHECK | SWT.BORDER);
-        table.setLinesVisible(true);
-        TableLayout layout = new TableLayout();
-        table.setLayout(layout);
-        table.setHeaderVisible(true);
-
-        String headers[] = { "column 1 header", "column 2 header" };
-
-        ColumnLayoutData layouts[] = { new ColumnWeightData(100),
-                new ColumnWeightData(100) };
-
-        final TableColumn columns[] = new TableColumn[headers.length];
-
-        for (int i = 0; i < headers.length; i++) {
-            layout.addColumnData(layouts[i]);
-            TableColumn tc = new TableColumn(table, SWT.NONE, i);
-            tc.setResizable(layouts[i].resizable);
-            tc.setText(headers[i]);
-            columns[i] = tc;
-        }
-
-        TableViewer viewer = new CheckboxTableViewer(table);
-        viewer.setContentProvider(new TestModelContentProvider());
-        viewer.setLabelProvider(new TableTestLabelProvider());
-        return viewer;
-    }
-
-    public static void main(String args[]) {
-        junit.textui.TestRunner.run(CheckboxTableViewerTest.class);
-    }
-
-    public void testCheckAllElements() {
-        CheckboxTableViewer ctv = (CheckboxTableViewer) fViewer;
-        ctv.setAllChecked(true);
-        assertTrue(ctv.getChecked(fRootElement.getFirstChild()));
-        assertTrue(ctv.getChecked(fRootElement.getLastChild()));
-        ctv.setAllChecked(false);
-        assertTrue(!ctv.getChecked(fRootElement.getFirstChild()));
-        assertTrue(!ctv.getChecked(fRootElement.getLastChild()));
-    }
-
-    public void testGrayAllElements() {
-        CheckboxTableViewer ctv = (CheckboxTableViewer) fViewer;
-        ctv.setAllGrayed(true);
-        assertTrue(ctv.getGrayed(fRootElement.getFirstChild()));
-        assertTrue(ctv.getGrayed(fRootElement.getLastChild()));
-        ctv.setAllGrayed(false);
-        assertTrue(!ctv.getGrayed(fRootElement.getFirstChild()));
-        assertTrue(!ctv.getGrayed(fRootElement.getLastChild()));
-    }
-
-    public void testGrayed() {
-        CheckboxTableViewer ctv = (CheckboxTableViewer) fViewer;
-        TestElement element = fRootElement.getFirstChild();
-
-        assertTrue(ctv.getGrayedElements().length == 0);
-        assertTrue(!ctv.getGrayed(element));
-
-        ctv.setGrayed(element, true);
-        assertTrue(ctv.getGrayedElements().length == 1);
-        assertTrue(ctv.getGrayed(element));
-
-        ctv.setGrayed(element, false);
-        assertTrue(ctv.getGrayedElements().length == 0);
-        assertTrue(!ctv.getGrayed(element));
-
-        ctv.setAllGrayed(false);
-    }
-
-    public void testGrayedElements() {
-        CheckboxTableViewer ctv = (CheckboxTableViewer) fViewer;
-        TestElement first = fRootElement.getFirstChild();
-        TestElement last = fRootElement.getLastChild();
-
-        assertTrue(ctv.getGrayedElements().length == 0);
-        assertTrue(!ctv.getGrayed(first));
-        assertTrue(!ctv.getGrayed(last));
-
-        ctv.setGrayed(first, true);
-        ctv.setGrayed(last, true);
-        Object[] elements = ctv.getGrayedElements();
-        assertTrue(elements.length == 2);
-        assertTrue(elements[0] == first);
-        assertTrue(elements[1] == last);
-
-        ctv.setGrayed(first, false);
-        ctv.setGrayed(last, false);
-        assertTrue(ctv.getGrayedElements().length == 0);
-
-        ctv.setAllGrayed(false);
-    }
-    
-    public void testWithoutCheckProvider() {
-    	//Check that without a provider, no exceptions are thrown
-    	CheckboxTableViewer ctv = (CheckboxTableViewer)fViewer;
-    	ctv.refresh();
-    }
-    
-    public void testCheckProviderInvoked() {
-    	//Check that a refresh successfully causes the provider's
-    	//setChecked and setGrayed methods to be invoked.
-    	CheckboxTableViewer ctv = (CheckboxTableViewer)fViewer;
-
-    	TestMethodsInvokedCheckStateProvider provider = new TestMethodsInvokedCheckStateProvider();
-    	
-    	ctv.setCheckStateProvider(provider);
-    	assertTrue("isChecked should be invoked on a refresh", (!provider.isCheckedInvokedOn.isEmpty()));
-    	assertTrue("isGrayed should be invoked on a refresh", (!provider.isGrayedInvokedOn.isEmpty()));
-
-    	provider.reset();
-    	ctv.refresh();
-    	assertTrue("isChecked should be invoked on a refresh", (!provider.isCheckedInvokedOn.isEmpty()));
-    	assertTrue("isGrayed should be invoked on a refresh", (!provider.isGrayedInvokedOn.isEmpty()));
-    }
-    
-    public void testCheckedFalseGrayedFalse() {
-    	testSpecificState(false, false);
-    }
-    
-    public void testCheckedFalseGrayedTrue() {
-    	testSpecificState(false, true);
-    }
-    
-    public void testCheckedTrueGrayedFalse() {
-    	testSpecificState(true, false);
-    }
-    
-    public void testCheckedTrueGrayedTrue() {
-    	testSpecificState(true, true);
-    }
-    
-    private void testSpecificState(final boolean isChecked, final boolean isGrayed) {
-    	CheckboxTableViewer ctv = (CheckboxTableViewer)fViewer;
-    	
-    	ctv.setCheckStateProvider(new ICheckStateProvider() {
-			public boolean isChecked(Object element)	{	return isChecked;	}
-			public boolean isGrayed(Object element) 	{	return isGrayed;	}
-    	});
-    	
-    	TableItem item = ctv.getTable().getItem(0);
-    	
-    	assertEquals(item.getChecked(), isChecked);
-    	assertEquals(item.getGrayed(), isGrayed);
-    }
-    
-    public void testSetCheckProviderRefreshesItems() {
-    	CheckboxTableViewer ctv = (CheckboxTableViewer)fViewer;
-    	
-    	//First provider
-    	//Should cause visible items' check state to adhere to provider
-    	ctv.setCheckStateProvider(new TestCheckStateProvider(0));
-    	
-    	//Check that all states are properly set
-    	checkAllStates("Testing checkbox state after refresh", ctv, 0);
-    	
-    	//Remove the check state provider
-    	ctv.setCheckStateProvider(null);
-    	
-    	//Test that an update doesn't fail
-    	TestElement update = fRootElement.getChildAt(5);
-    	ctv.update(update, null);
-    	
-    	//Test that a refresh doesn't fail
-    	ctv.refresh();
-    }
-    
-    public void testCheckProviderWithSorter() {
-    	CheckboxTableViewer ctv = (CheckboxTableViewer) fViewer;
-    	
-    	ctv.setSorter(new CheckStateProviderTestsUtil.Sorter());
-    	
-    	//First provider
-    	//Should cause visible items' check state adhere to provider
-    	ctv.setCheckStateProvider(new TestCheckStateProvider(0));
-    	
-    	//Check that all states are properly set
-    	checkAllStates("Testing checkbox state with a sorter", ctv, 0);
-    }
-    
-    public void testCheckProviderWithFilter() {
-    	CheckboxTableViewer ctv = (CheckboxTableViewer) fViewer;
-    	
-    	final CheckStateProviderTestsUtil.Filter filter = new CheckStateProviderTestsUtil.Filter();
-		ctv.addFilter(filter);
-    	
-    	//First provider
-		//Should cause visible items' check state adhere to provider
-    	final TestCheckStateProvider checkStateProvider = new TestCheckStateProvider(0);
-		ctv.setCheckStateProvider(checkStateProvider);
-    	
-    	//Check that all states are properly set
-    	checkAllStates("Testing checkbox state with a sorter", ctv, 0);
-    	
-    	//Check that the provider is only invoked on elements which pass the filter
-    	for (Iterator i = checkStateProvider.isCheckedInvokedOn.iterator(); i.hasNext();) {
-			TestElement element = (TestElement) i.next();
-			assertTrue("The check provider should not be invoked on elements which did not get through the filter", filter.select(ctv, null, element));
-		}
-    	
-    	for (Iterator i = checkStateProvider.isGrayedInvokedOn.iterator(); i.hasNext();) {
-			TestElement element = (TestElement) i.next();
-			assertTrue("The check provider should not be invoked on elements which did not get through the filter", filter.select(ctv, null, element));
-		}
-    }
-    
-    public void testCheckProviderUpdate() {
-    	CheckboxTableViewer ctv = (CheckboxTableViewer)fViewer;
-    	
-    	//First provider
-    	//Should cause visible items' check state to adhere to provider
-    	ctv.setCheckStateProvider(new TestCheckStateProvider(0));
-    	
-    	checkAllStates("Testing checkbox state after refresh", ctv, 0);
-    	
-    	//Put in a new check state provider
-    	ctv.setCheckStateProvider(new TestCheckStateProvider(1));
-    	
-    	//Check that setting a new check provider caused a refresh,
-    	//and thus all the items have their new appropriate check
-    	//states.
-    	checkAllStates("Testing checkbox state after refresh", ctv, 1);
-    }
-
-	private void checkAllStates(String comment, CheckboxTableViewer ctv, int shift) {
-		TableItem[] items = ctv.getTable().getItems();
-    	
-    	//Check that actual states were set properly
-    	for (int i = 0; i < items.length; i++) {
-			TableItem item = items[i];
-    		TestElement element = (TestElement)items[i].getData();
-    		
-    		checkState(comment, element, item, shift);	//check in Table
-    		checkState(comment, element, ctv, shift);	//check in Viewer
-		}
-	}
-    
-	/**
-	 * Invokes the appropriate asserts to verify the state
-	 * of a TestElement.
-	 * @param te
-	 * @param viewer	the viewer <code>te</code> is in.
-	 * @param shift 	the shift parameter being used
-	 */
-	private void checkState(String comment, TestElement te, CheckboxTableViewer viewer, int shift) {
-		assertEquals(comment, CheckStateProviderTestsUtil.shouldBeChecked(te, shift), viewer.getChecked(te));
-		assertEquals(comment, CheckStateProviderTestsUtil.shouldBeGrayed(te, shift), viewer.getGrayed(te));
-	}
-	
-	/**
-	 * Invokes the appropriate asserts to verify the state
-	 * of a TestElement's associated TableItem
-	 * @param te
-	 * @param item	the item representing <code>te</code>
-	 * @param shift	the shift parameter being used
-	 */
-	private void checkState(String comment, TestElement te, TableItem item, int shift) {
-		assertEquals("Wrong checkstate: " + comment, CheckStateProviderTestsUtil.shouldBeChecked(te, shift), item.getChecked());
-		assertEquals("Wrong checkstate: " + comment, CheckStateProviderTestsUtil.shouldBeGrayed(te, shift), item.getGrayed());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CheckboxTreeViewerMissingTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CheckboxTreeViewerMissingTest.java
deleted file mode 100644
index a49f3c5..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CheckboxTreeViewerMissingTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-/**
- * Test with missing images.
- */
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-public class CheckboxTreeViewerMissingTest extends CheckboxTreeViewerTest {
-    private static Image testImage;
-
-    public static Image getMissingImage() {
-        if (testImage == null)
-            testImage = ImageDescriptor.createFromFile(TestLabelProvider.class,
-                    "images/missing.gif").createImage();
-        return testImage;
-    }
-
-    public static class CheckboxMissingTableTestLabelProvider extends
-            CheckboxTreeViewerTest.CheckboxTableTestLabelProvider implements
-            ITableLabelProvider {
-        /*
-         * (non-Javadoc)
-         * 
-         * @see org.eclipse.jface.tests.viewers.StructuredViewerTest.TestLabelProvider#getImage(java.lang.Object)
-         */
-        public Image getImage(Object element) {
-            return getMissingImage();
-        }
-
-    }
-
-    public CheckboxTreeViewerMissingTest(String name) {
-        super(name);
-    }
-
-    /*
-     *  (non-Javadoc)
-     * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#getTestLabelProvider()
-     */
-    public IBaseLabelProvider getTestLabelProvider() {
-        return new CheckboxMissingTableTestLabelProvider();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#tearDown()
-     */
-    public void tearDown() {
-        super.tearDown();
-        if (testImage != null) {
-            testImage.dispose();
-            testImage = null;
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testLabelProvider()
-     */
-    public void testLabelProvider() {
-        super.testLabelProvider();
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CheckboxTreeViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CheckboxTreeViewerTest.java
deleted file mode 100644
index a5ebdd8..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/CheckboxTreeViewerTest.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.tests.viewers.CheckStateProviderTestsUtil.TestCheckStateProvider;
-import org.eclipse.jface.tests.viewers.CheckStateProviderTestsUtil.TestMethodsInvokedCheckStateProvider;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TreeItem;
-
-public class CheckboxTreeViewerTest extends TreeViewerTest {
-    public static class CheckboxTableTestLabelProvider extends
-            TestLabelProvider implements ITableLabelProvider {
-
-        public boolean fExtended = false;
-
-        public String getText(Object element) {
-            if (fExtended)
-                return providedString((String) element);
-            return element.toString();
-        }
-
-        public String getColumnText(Object element, int index) {
-            if (fExtended)
-                return providedString((TestElement) element);
-            return element.toString();
-        }
-
-        public Image getColumnImage(Object element, int columnIndex) {
-            return null;
-        }
-    }
-
-    public CheckboxTreeViewerTest(String name) {
-        super(name);
-    }
-
-    protected StructuredViewer createViewer(Composite parent) {
-        fTreeViewer = new CheckboxTreeViewer(parent);
-        fTreeViewer.setContentProvider(new TestModelContentProvider());
-        return fTreeViewer;
-    }
-
-    public static void main(String args[]) {
-        junit.textui.TestRunner.run(CheckboxTreeViewerTest.class);
-    }
-
-    public void testCheckSubtree() {
-        CheckboxTreeViewer ctv = (CheckboxTreeViewer) fViewer;
-        TestElement first = fRootElement.getFirstChild();
-        TestElement firstfirst = first.getFirstChild();
-        TestElement firstfirstfirst = firstfirst.getFirstChild();
-        fTreeViewer.expandToLevel(firstfirst, 0);
-
-        ctv.setSubtreeChecked(first, true);
-        assertTrue(ctv.getChecked(firstfirst));
-        ctv.setSubtreeChecked(first, false);
-        assertTrue(!ctv.getChecked(firstfirst));
-
-        // uncheck invisible subtree
-        assertTrue(ctv.setSubtreeChecked(firstfirstfirst, false));
-        assertTrue(!ctv.getChecked(firstfirstfirst));
-    }
-
-    public void testGrayed() {
-        CheckboxTreeViewer ctv = (CheckboxTreeViewer) fViewer;
-        TestElement element = fRootElement.getFirstChild();
-
-        assertTrue(ctv.getGrayedElements().length == 0);
-        assertTrue(!ctv.getGrayed(element));
-
-        ctv.setGrayed(element, true);
-        assertTrue(ctv.getGrayedElements().length == 1);
-        assertTrue(ctv.getGrayed(element));
-
-        ctv.setGrayed(element, false);
-        assertTrue(ctv.getGrayedElements().length == 0);
-        assertTrue(!ctv.getGrayed(element));
-    }
-
-    public void testParentGrayed() {
-        CheckboxTreeViewer ctv = (CheckboxTreeViewer) fViewer;
-        TestElement first = fRootElement.getFirstChild();
-        TestElement firstfirst = first.getFirstChild();
-        TestElement firstfirstfirst = firstfirst.getFirstChild();
-        ctv.expandToLevel(firstfirstfirst, 0);
-
-        ctv.setParentsGrayed(firstfirstfirst, true);
-        Object[] elements = ctv.getGrayedElements();
-        assertTrue(elements.length == 3);
-        for (int i = 0; i < elements.length; ++i) {
-            assertTrue(ctv.getGrayed(elements[i]));
-        }
-
-        assertTrue(elements[0] == first);
-        assertTrue(elements[1] == firstfirst);
-        assertTrue(elements[2] == firstfirstfirst);
-        ctv.setParentsGrayed(firstfirstfirst, false);
-    }
-    
-    public void testWithoutCheckProvider() {
-    	//Check that without a provider, no exceptions are thrown
-    	CheckboxTreeViewer ctv = (CheckboxTreeViewer)fViewer;
-    	ctv.expandAll();
-    	ctv.refresh();
-    }
-    
-    public void testCheckProviderInvoked() {
-    	//Check that a refresh successfully causes the provider's
-    	//setChecked and setGrayed methods to be invoked.
-    	CheckboxTreeViewer ctv = (CheckboxTreeViewer)fViewer;
-    	
-    	TestMethodsInvokedCheckStateProvider provider = new TestMethodsInvokedCheckStateProvider();
-    	
-    	ctv.setCheckStateProvider(provider);
-    	assertTrue("isChecked should be invoked on a refresh", (!provider.isCheckedInvokedOn.isEmpty()));
-    	assertTrue("isGrayed should be invoked on a refresh", (!provider.isGrayedInvokedOn.isEmpty()));
-    	
-    	provider.reset();
-    	ctv.refresh();
-    	assertTrue("isChecked should be invoked on a refresh", (!provider.isCheckedInvokedOn.isEmpty()));
-    	assertTrue("isGrayed should be invoked on a refresh", (!provider.isGrayedInvokedOn.isEmpty()));
-
-    }
-    
-    public void testCheckProviderLazilyInvoked() {
-    	//Check that a refresh successfully causes the provider's
-    	//setChecked and setGrayed methods to be invoked.
-    	CheckboxTreeViewer ctv = (CheckboxTreeViewer)fViewer;
-    	
-    	TestMethodsInvokedCheckStateProvider provider = new TestMethodsInvokedCheckStateProvider();
-    	
-    	ctv.setCheckStateProvider(provider);
-    	ctv.refresh();
-    	
-    	TestElement[] expected = fRootElement.getChildren();
-    	
-    	for (Iterator i = provider.isCheckedInvokedOn.iterator(); i.hasNext();) {
-			TestElement element = (TestElement) i.next();
-			boolean firstLevelElement = false;
-			for (int j = 0; j < expected.length && !firstLevelElement; j++) {
-				firstLevelElement = element.equals(expected[j]);
-			}
-			assertTrue("The check provider should only be invoked with visible elements", firstLevelElement);
-		}
-    	
-    	for (Iterator i = provider.isGrayedInvokedOn.iterator(); i.hasNext();) {
-			TestElement element = (TestElement) i.next();
-			boolean firstLevelElement = false;
-			for (int j = 0; j < expected.length && !firstLevelElement; j++) {
-				firstLevelElement = element.equals(expected[j]);
-			}
-			assertTrue("The check provider should only be invoked with visible elements", firstLevelElement);
-		}
-    }
-    
-    public void testCheckedFalseGrayedFalse() {
-    	testSpecificState(false, false);
-    }
-    
-    public void testCheckedFalseGrayedTrue() {
-    	testSpecificState(false, true);
-    }
-    
-    public void testCheckedTrueGrayedFalse() {
-    	testSpecificState(true, false);
-    }
-    
-    public void testCheckedTrueGrayedTrue() {
-    	testSpecificState(true, true);
-    }
-    
-    private void testSpecificState(final boolean isChecked, final boolean isGrayed) {
-    	CheckboxTreeViewer ctv = (CheckboxTreeViewer)fViewer;
-    	
-    	ctv.setCheckStateProvider(new ICheckStateProvider() {
-			public boolean isChecked(Object element)	{	return isChecked;	}
-			public boolean isGrayed(Object element) 	{	return isGrayed;	}
-    	});
-    	
-    	TreeItem item = ctv.getTree().getItem(0);
-    	
-    	assertEquals(item.getChecked(), isChecked);
-    	assertEquals(item.getGrayed(), isGrayed);
-    }
-    
-    public void testSetCheckProviderRefreshesItems() {
-    	CheckboxTreeViewer ctv = (CheckboxTreeViewer) fViewer;
-    	
-    	//First provider
-    	//Should cause visible items' check state adhere to provider
-    	ctv.setCheckStateProvider(new TestCheckStateProvider(0));
-    	
-    	ctv.expandAll();
-    	
-    	//Check that all states are properly set
-    	checkAllStates("Testing checkbox state after refresh", ctv, 0);
-    	
-    	//Remove the check state provider
-    	ctv.setCheckStateProvider(null);
-    	
-    	//Test that an update doesn't fail
-    	TestElement update = fRootElement.getFirstChild().getChildAt(5);
-    	ctv.update(update, null);
-    	
-    	//Test that a refresh doesn't fail
-    	ctv.refresh();
-    }
-    
-    public void testCheckProviderWithSorter() {
-    	CheckboxTreeViewer ctv = (CheckboxTreeViewer) fViewer;
-    	
-    	ctv.setSorter(new CheckStateProviderTestsUtil.Sorter());
-    	
-    	//First provider
-    	//Should cause visible items' check state adhere to provider
-    	ctv.setCheckStateProvider(new TestCheckStateProvider(0));
-    	ctv.expandAll();
-    	
-    	//Check that all states are properly set
-    	checkAllStates("Testing checkbox state with a sorter", ctv, 0);
-    }
-    
-    public void testCheckProviderWithFilter() {
-    	CheckboxTreeViewer ctv = (CheckboxTreeViewer) fViewer;
-    	
-    	final CheckStateProviderTestsUtil.Filter filter = new CheckStateProviderTestsUtil.Filter();
-		ctv.addFilter(filter);
-    	
-    	//First provider
-		//Should cause visible items' check state adhere to provider
-    	final TestCheckStateProvider checkStateProvider = new TestCheckStateProvider(0);
-		ctv.setCheckStateProvider(checkStateProvider);
-    	ctv.expandAll();
-    	
-    	//Check that all states are properly set
-    	checkAllStates("Testing checkbox state with a sorter", ctv, 0);
-    	
-    	//Check that the provider is only invoked on elements which pass the filter
-    	for (Iterator i = checkStateProvider.isCheckedInvokedOn.iterator(); i.hasNext();) {
-			TestElement element = (TestElement) i.next();
-			assertTrue("The check provider should not be invoked on elements which did not get through the filter", filter.select(ctv, null, element));
-		}
-    	
-    	for (Iterator i = checkStateProvider.isGrayedInvokedOn.iterator(); i.hasNext();) {
-			TestElement element = (TestElement) i.next();
-			assertTrue("The check provider should not be invoked on elements which did not get through the filter", filter.select(ctv, null, element));
-		}
-    }
-
-    public void testSetNewCheckProvider() {
-    	CheckboxTreeViewer ctv = (CheckboxTreeViewer) fViewer;
-    	
-    	//First provider
-    	//Should cause visible items' check state to adhere to provider
-    	ctv.setCheckStateProvider(new TestCheckStateProvider(0));
-    	ctv.expandAll();
-    	
-    	checkAllStates("Testing checkbox state after first refresh", ctv, 0);
-    	
-    	//Put in a new check state provider
-    	ctv.setCheckStateProvider(new TestCheckStateProvider(1));
-    	
-    	//Check that setting a new check provider caused a refresh,
-    	//and thus all the items have their new appropriate check
-    	//states.
-    	checkAllStates("Testing checkbox state after setting new check provider", ctv, 1);
-    }
-    
-    private void collectElementsInBranch(TreeItem item, Collection treeItems, Collection testElements) {
-    	treeItems.add(item);
-    	testElements.add(item.getData());
-    	TreeItem[] children = item.getItems();
-    	for (int i = 0; i < children.length; i++) {
-    		collectElementsInBranch(children[i], treeItems, testElements);
-    	}
-    }
-    
-    private void checkAllStates(String comment, CheckboxTreeViewer ctv, int shift) {
-    	List items = new ArrayList();
-    	List elements = new ArrayList();
-    	collectElementsInBranch(ctv.getTree().getItem(0), items, elements);
-    	
-    	//Check that actual states were set properly
-    	for (Iterator i = items.iterator(), j = elements.iterator(); i.hasNext();) {
-    		TreeItem item = (TreeItem)i.next();
-    		TestElement element = (TestElement)j.next();
-    		
-    		checkState(comment, element, item, shift);	//check in Tree
-    		checkState(comment, element, ctv, shift);	//check in Viewer
-    	}
-    }
-	
-	/**
-	 * Invokes the appropriate asserts to verify the state
-	 * of a TestElement.
-	 * @param te
-	 * @param viewer	the viewer <code>te</code> is in.
-	 * @param shift 	the shift parameter being used
-	 */
-	private void checkState(String comment, TestElement te, CheckboxTreeViewer viewer, int shift) {
-		assertEquals(comment, CheckStateProviderTestsUtil.shouldBeChecked(te, shift), viewer.getChecked(te));
-		assertEquals(comment, CheckStateProviderTestsUtil.shouldBeGrayed(te, shift), viewer.getGrayed(te));
-	}
-	
-	/**
-	 * Invokes the appropriate asserts to verify the state
-	 * of a TestElement's associated TreeItem
-	 * @param te
-	 * @param item	the item representing <code>te</code>
-	 * @param shift	the shift parameter being used
-	 */
-	private void checkState(String comment, TestElement te, TreeItem item, int shift) {
-		assertEquals("Wrong checkstate: " + comment, CheckStateProviderTestsUtil.shouldBeChecked(te, shift), item.getChecked());
-		assertEquals("Wrong checkstate: " + comment, CheckStateProviderTestsUtil.shouldBeGrayed(te, shift), item.getGrayed());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ComboViewerComparerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ComboViewerComparerTest.java
deleted file mode 100644
index c45cc99..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ComboViewerComparerTest.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Ruediger Herrmann and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Ruediger Herrmann <rherrmann@innoopract.com> - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.util.ILogger;
-import org.eclipse.jface.util.ISafeRunnableRunner;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.IElementComparer;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-public class ComboViewerComparerTest extends TestCase {
-
-	private Shell shell;
-
-	private StructuredViewer viewer;
-
-	private static final class TestElement {
-
-		private final String name;
-
-		public TestElement(final String name) {
-			this.name = name;
-		}
-
-		public String getName() {
-			return name;
-		}
-	}
-
-	public void testSetSelection() {
-		viewer.setContentProvider(new ArrayContentProvider());
-		viewer.setComparer(new IElementComparer() {
-			public boolean equals(final Object element1, final Object element2) {
-				TestElement testElement1 = (TestElement) element1;
-				TestElement testElement2 = (TestElement) element2;
-				return testElement1.getName().equals(testElement2.getName());
-			}
-
-			public int hashCode(final Object element) {
-				TestElement testElement = (TestElement) element;
-				return testElement.getName().hashCode();
-			}
-		});
-		viewer.setInput(new TestElement[] { new TestElement("a"),
-				new TestElement("b") });
-		// Select equal element with different identity
-		TestElement aElement = new TestElement("a");
-		viewer.setSelection(new StructuredSelection(aElement));
-		StructuredSelection sel = ((StructuredSelection) viewer.getSelection());
-		assertEquals(false, sel.isEmpty());
-		TestElement selectedElement = (TestElement) sel.getFirstElement();
-		assertEquals(aElement.getName(), selectedElement.getName());
-	}
-
-	protected void setUp() {
-		Policy.setLog(new ILogger() {
-			public void log(IStatus status) {
-				fail(status.getMessage());
-			}
-		});
-		SafeRunnable.setRunner(new ISafeRunnableRunner() {
-			public void run(ISafeRunnable code) {
-				try {
-					code.run();
-				} catch (Throwable th) {
-					throw new RuntimeException(th);
-				}
-			}
-		});
-		Display display = Display.getCurrent();
-		if (display == null) {
-			display = new Display();
-		}
-		shell = new Shell(display);
-		shell.setSize(500, 500);
-		shell.setLayout(new FillLayout());
-		viewer = createViewer(shell);
-		shell.open();
-	}
-
-	protected void tearDown() {
-		processEvents();
-		viewer = null;
-		if (shell != null) {
-			shell.dispose();
-			shell = null;
-		}
-	}
-
-	protected StructuredViewer createViewer(final Shell parent) {
-		return new ComboViewer(parent, SWT.NONE);
-	}
-
-	private void processEvents() {
-		if (shell != null && !shell.isDisposed()) {
-			Display display = shell.getDisplay();
-			if (display != null) {
-				while (display.readAndDispatch()) {
-					// loop until there are no more events to dispatch
-				}
-			}
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ComboViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ComboViewerTest.java
deleted file mode 100644
index c2a5cb1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ComboViewerTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * @since 3.0
- */
-public class ComboViewerTest extends StructuredViewerTest {
-    public ComboViewerTest(String name) {
-        super(name);
-    }
-
-    protected StructuredViewer createViewer(Composite parent) {
-        ComboViewer viewer = new ComboViewer(parent);
-        viewer.setContentProvider(new TestModelContentProvider());
-        return viewer;
-    }
-
-    protected int getItemCount() {
-        TestElement first = fRootElement.getFirstChild();
-        Combo list = (Combo) fViewer.testFindItem(first);
-        return list.getItemCount();
-    }
-
-    protected String getItemText(int at) {
-        Combo list = (Combo) fViewer.getControl();
-        return list.getItem(at);
-    }
-
-    public static void main(String args[]) {
-        junit.textui.TestRunner.run(ComboViewerTest.class);
-    }
-
-    /**
-     * TODO: Determine if this test is applicable to ComboViewer 
-     */
-    public void testInsertChild() {
-
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ComparatorModelChange.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ComparatorModelChange.java
deleted file mode 100644
index 4990d23..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ComparatorModelChange.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.tests.viewers.ViewerComparatorTest.Team;
-import org.eclipse.jface.tests.viewers.ViewerComparatorTest.TeamMember;
-
-/**
- * @since 3.2
- *
- */
-public class ComparatorModelChange {
-    private int fKind;
-
-    private Team fParent;
-
-    private TeamMember[] fChildren;
-
-    public static final int KIND_MASK = 0x0F;
-
-    public static final int INSERT = 1;
-
-    public static final int REMOVE = 2;
-
-    public static final int STRUCTURE_CHANGE = 3;
-
-    public static final int NON_STRUCTURE_CHANGE = 4;
-
-    public static final int REVEAL = 16;
-
-    public static final int SELECT = 32;
-
-    public ComparatorModelChange(int kind, Team parent) {
-        this(kind, parent, new TeamMember[0]);
-    }
-
-    public ComparatorModelChange(int kind, Team parent, TeamMember[] children) {
-        fKind = kind;
-        fParent = parent;
-        fChildren = children;
-    }
-
-    public ComparatorModelChange(int kind, Team parent, TeamMember child) {
-        this(kind, parent, new TeamMember[] { child });
-    }
-
-    public TeamMember[] getChildren() {
-        return fChildren;
-    }
-
-    public int getKind() {
-        return fKind & KIND_MASK;
-    }
-
-    public int getModifiers() {
-        return fKind & ~KIND_MASK;
-    }
-
-    public Team getParent() {
-        return fParent;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/IComparatorModelListener.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/IComparatorModelListener.java
deleted file mode 100644
index 6707319..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/IComparatorModelListener.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-/**
- * @since 3.2
- *
- */
-public interface IComparatorModelListener {
-
-	public void modelChanged(ComparatorModelChange change);
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ITestModelListener.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ITestModelListener.java
deleted file mode 100644
index dd343e2..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ITestModelListener.java
+++ /dev/null
@@ -1,15 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-public interface ITestModelListener {
-    public void testModelChanged(TestModelChange change);
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/LazySortedCollectionTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/LazySortedCollectionTest.java
deleted file mode 100644
index efdc29b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/LazySortedCollectionTest.java
+++ /dev/null
@@ -1,557 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.TreeSet;
-
-import junit.framework.Assert;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jface.viewers.deferred.LazySortedCollection;
-
-/**
- * @since 3.1
- */
-public class LazySortedCollectionTest extends TestCase {
-    
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(LazySortedCollectionTest.class);
-    }
-    
-    public static Test suite() {
-        return new TestSuite(LazySortedCollectionTest.class);
-    }
-    
-    private TestComparator comparator;
-    private TestComparator comparisonComparator;
-    
-    // All operations will be done on both collections -- after each operation, the result
-    // will be compared
-    private LazySortedCollection collection;
-    private TreeSet comparisonCollection;
-
-    /**
-     * Please don't add or remove from this set -- we rely on the exact insertion order
-     * to get full coverage from the removal tests.
-     */
-    private String[] se = new String[] {
-            "v00 aaaaaa",
-            "v01 apple",
-            "v02 booger",
-            "v03 car",
-            "v04 dog",
-            "v05 elephant",
-            "v06 fox",
-            "v07 goose",
-            "v08 hippie",
-            "v09 iguana",
-            "v10 junk",
-            "v11 karma",
-            "v12 lemon",
-            "v13 mongoose",
-            "v14 noodle",
-            "v15 opal",
-            "v16 pumpkin",
-            "v17 quirks",
-            "v18 resteraunt",
-            "v19 soap",
-            "v20 timmy",
-            "v21 ugly",
-            "v22 virus",
-            "v23 wigwam",
-            "v24 xerxes",
-            "v25 yellow",
-            "v26 zero"
-    };
-    
-    /**
-     * Please don't mess with the insertion order here or add or remove from this set -- 
-     * we rely on the exact order in order to get full coverage for the removal tests.
-     */
-    private String[] elements = new String[] {
-            se[19],
-            se[7],
-            se[6],
-            se[1],
-            se[20],
-            se[8],
-            se[0],
-            se[23],
-            se[17],
-            se[18],
-            se[24],
-            se[25],
-            se[10],
-            se[5],
-            se[15],
-            se[16],
-            se[21],
-            se[26],
-            se[22],
-            se[3],
-            se[9],
-            se[4],
-            se[11],
-            se[12],
-            se[13],
-            se[14],
-            se[2]  
-        };
-
-    
-    public static void printArray(Object[] array) {
-        for (int i = 0; i < array.length; i++) {
-            System.out.println("[" + i + "] = " + array[i]);
-        }
-    }
-    
-    /* (non-Javadoc)
-     * @see junit.framework.TestCase#setUp()
-     */
-    protected void setUp() throws Exception {
-        System.out.println("--- " + getName());
-        
-        comparator = new TestComparator();
-        collection = new LazySortedCollection(comparator);
-        // Ensure a predictable tree structure
-        collection.enableDebug = true;
-     
-        comparisonComparator = new TestComparator();
-        comparisonCollection = new TreeSet(comparisonComparator);
-        
-        addAll(elements);
-        
-        super.setUp();
-    }
-    
-    /* (non-Javadoc)
-     * @see junit.framework.TestCase#tearDown()
-     */
-    protected void tearDown() throws Exception {
-        System.out.println("Comparisons required by lazy collection: " + comparator.comparisons);
-        System.out.println("Comparisons required by reference implementation: " + comparisonComparator.comparisons);
-        System.out.println("");
-        
-        super.tearDown();
-    }
-    
-    /**
-     * Computes the entries that are expected to lie in the given range. The result
-     * is sorted.
-     * 
-     * @param start
-     * @param length
-     * @return
-     * @since 3.1
-     */
-    private Object[] computeExpectedElementsInRange(int start, int length) {
-        int counter = 0;
-        
-        Iterator iter = comparisonCollection.iterator();
-        while(iter.hasNext() && counter < start) {
-            iter.next();
-            counter++;
-        }
-        
-        Object[] result = new Object[length];
-        for (int i = 0; i < result.length; i++) {
-            result[i] = iter.next(); 
-        }
-                
-        return result;
-    }
-
-    private void addAll(Object[] elements) {
-        collection.addAll(elements);
-        comparisonCollection.addAll(Arrays.asList(elements));
-    }
-    
-    private void add(Object toAdd) {
-        collection.add(toAdd);
-        comparisonCollection.add(toAdd);
-    }
-    
-    private void remove(Object toRemove) {
-        collection.remove(toRemove);
-        comparisonCollection.remove(toRemove);
-    }
-    
-    private void removeRange(int start, int length) {
-        collection.removeRange(start, length);
-        
-        Object[] expected = computeExpectedElementsInRange(start, length);
-
-        // Alternative remove implementation that removes one-at-a-time
-        for (int i = 0; i < expected.length; i++) {
-            comparisonCollection.remove(expected[i]);
-        }
-    }
-    
-    private void clear() {
-        collection.clear();
-        comparisonCollection.clear();
-    }
-    
-    /**
-     * Force the collection to sort all elements immediately.
-     * 
-     * @since 3.1
-     */
-    private void forceFullSort() {
-        queryRange(0, elements.length, true);
-    }
-    
-    private void assertContentsValid() {
-        queryRange(0, comparisonCollection.size(), false);
-        Assert.assertEquals(comparisonCollection.size(), collection.size());
-        Assert.assertEquals(comparisonCollection.isEmpty(), collection.isEmpty());
-    }
-    
-    private void assertIsPermutation(Object[] array1, Object[] array2) {
-        Object[] sorted1 = new Object[array1.length];
-        System.arraycopy(array1, 0, sorted1, 0, array1.length);
-        Arrays.sort(sorted1, new TestComparator());
-        
-        Object[] sorted2 = new Object[array2.length];
-        System.arraycopy(array2, 0, sorted2, 0, array2.length);
-        Arrays.sort(sorted2, new TestComparator());
-        
-        assertArrayEquals(sorted1, sorted2);
-    }
-
-    /**
-     * Queries the collection for the given range, and throws an assertation failure if the 
-     * result was unexpected. Assumes that the "elements" array was initially added and that nothing
-     * has been added or removed since.
-     * 
-     * @param start
-     * @param length
-     * @param sorted
-     * @since 3.1
-     */
-    private Object[] queryRange(int start, int length, boolean sorted) {
-        Object[] result = new Object[length];
-        
-        int returnValue = collection.getRange(result, start, sorted);
-        
-        Assert.assertEquals(returnValue, length);
-        
-        Object[] expectedResult = computeExpectedElementsInRange(start, length);
-        
-        if (sorted) {
-            // If the result is supposed to be sorted, it will match the expected
-            // result exactly
-            assertArrayEquals(expectedResult, result);
-        } else {
-            // Otherwise, the result merely needs to be a permutation of the
-            // expected result.
-            assertIsPermutation(result, expectedResult);
-        }
-        
-        collection.testInvariants();
-        
-        return result;
-    }
-    
-    private void assertArrayEquals(Object[] array1, Object[] array2) {
-        for (int i = 0; i < array1.length; i++) {
-
-            Assert.assertEquals(array1[i], array2[i]);
-        }        
-    }
-    
-    public void testComparisonCount() {
-        Assert.assertTrue("additions should not require any comparisons", comparator.comparisons == 0);
-        
-        queryRange(0, elements.length, false);
-
-        Assert.assertTrue("requesting the complete set of unsorted elements should not require any comparisons", comparator.comparisons == 0);
-    }
-    
-    /**
-     * Ensure that no comparisons are required for range queries once the collection is fully sorted
-     * 
-     * @since 3.1
-     */
-    public void testSortAll() {
-        // Test that sorting the entire array works
-        queryRange(0, elements.length, true);
-        
-        int comparisons = comparator.comparisons;
-        
-        // Ensure that subsequent operations require no comparisons
-        queryRange(elements.length - 10, 10, true);
-        queryRange(0, 10, false);
-        
-        Assert.assertEquals("Once the lazy collection is fully sorted, it should not require further comparisons", 
-                comparisons, comparator.comparisons);
-    }
-    
-    /**
-     * Tests LazySortedCollection.removeNode(int) when removing a leaf node
-     */
-    public void testRemoveLeafNode() {
-        forceFullSort();
-        remove(se[9]);
-        assertContentsValid();
-    }
-
-    /**
-     * Tests LazySortedCollection.removeNode(int) when removing a node with no left child
-     */
-    public void testRemoveNodeWithNoLeftChild() {
-        forceFullSort();
-        remove(se[23]);
-        assertContentsValid();
-    }
-
-    /**
-     * Tests LazySortedCollection.removeNode(int) when removing a node with no right child
-     * 
-     * @since 3.1
-     */
-    public void testRemoveNodeWithNoRightChild() {
-        forceFullSort();
-        remove(se[13]);
-        assertContentsValid();
-    }
-    
-    /**
-     * Tests LazySortedCollection.remove when removing the root node
-     * 
-     * @since 3.1
-     */
-    public void testRemoveRootNode() {
-        forceFullSort();
-        remove(se[19]);
-        assertContentsValid();
-    }
-
-    /**
-     * Tests LazySortedCollection.remove when the removal
-     * will require swapping with a non-leaf node. (The descendent with the closest value
-     * in the largest subtree has at least 1 child).
-     * 
-     * @since 3.1
-     */
-    public void testRemoveWhereSwappedNodeIsntLeaf() {
-        forceFullSort();
-        remove(se[14]);
-        assertContentsValid();
-    }
-    
-    /**
-     * Tests LazySortedCollection.remove when the removal
-     * will require swapping with a non-leaf node, and both the removed node and the swapped
-     * node contain unsorted children.
-     * 
-     * @since 3.1
-     */
-    public void testRemoveWithUnsortedSwap() {
-        // Ensure that we've sorted nodes 13 and 14 
-        queryRange(14, 1, true);
-        queryRange(13, 1, true);
-        
-        // Add some unsorted nodes that will become children of the node with value "v13 mongoose"
-        addAll(new String[] {"v13 n", "v13 l"});
-        // Ensure that the new nodes are pushed down to node 14 by querying its parent (currently at position 8)
-        queryRange(8, 1, true);
-        
-        // Add some unsorted nodes that will become children of the node with value "v14 noodle" 
-        addAll(new String[] {"v14 m", "v14 o"});
-        // Push down the unsorted nodes by querying for the parent of "v14 noodle" 
-        // (the parent is currently at position 7) 
-        queryRange(7, 1, true);
-        
-        // Now remove node with value "v14 noodle" -- this should swap it with the node "v13 mongoose", requiring
-        // both sets of unsorted children to be dealt with
-        
-        remove(se[14]);
-        assertContentsValid();
-    }
-    
-    /**
-     * Remove an element from an initially unsorted collection
-     * 
-     * @since 3.1
-     */
-    public void testRemoveFromUnsorted() {
-        remove(se[10]);
-        assertContentsValid();
-    }
-    
-    /**
-     * Remove the root from an initially-unsorted collection
-     * 
-     * @since 3.1
-     */
-    public void testRemoveRootFromUnsorted() {
-        remove(se[19]);
-        assertContentsValid();
-    }
-    
-    /**
-     * Ensure that removing an element that isn't in the collection is a no-op
-     * 
-     * @since 3.1
-     */
-    public void testRemoveUnknown() {
-        remove("some unknown element");
-        assertContentsValid();
-    }
-    
-    /**
-     * Tests that the swaps during removal don't mess up the internal hashmap.
-     * Perform a removal that will require a swap, add a new item, then
-     * remove the item that was previously swapped. If the hashmap was not updated,
-     * then the removed item may still be pointing to its old index and the 
-     * new item will be removed instead. 
-     * 
-     * @since 3.1
-     */
-    public void testRemovePreviouslySwappedNode() {
-        queryRange(0, elements.length, true);
-        remove(se[14]);
-        // Add a new item -- should reuse the same index used by the previous item
-        add("something new");
-        assertContentsValid();
-        remove(se[13]);
-        assertContentsValid();
-    }
-    
-    /**
-     * Remove all nodes using removeRange
-     * 
-     * @since 3.1
-     */
-    public void testRemoveFullRange() {
-        removeRange(0, se.length);
-        assertContentsValid();
-    }
-    
-    /**
-     * Remove a range that includes the start
-     * 
-     * @since 3.1
-     */
-    public void testRemoveFromStart() {
-        removeRange(0, se.length / 2);
-        assertContentsValid();
-    }
-    
-    /**
-     * Remove a range that includes the last node
-     * 
-     * @since 3.1
-     */
-    public void testRemoveFromEnd() {
-        int start = se.length / 2;
-        removeRange(start, se.length - start);
-        assertContentsValid();
-    }
-    
-    /**
-     * Remove a range that includes the root, but leaves nodes in both subtrees intact.
-     * 
-     * @since 3.1
-     */
-    public void testRemoveIncludingRoot() {
-        removeRange(14, 6);
-        assertContentsValid();
-    }
-    
-    /**
-     * Test boundary conditions: 
-     * 
-     * Tests moving an entire right subtree, and a left subtree including the tree itself
-     */
-    public void testRemoveRightSubtree() {
-        removeRange(9, 5);
-        assertContentsValid();
-    }
-
-    /**
-     * Test boundary conditions: Tests moving an entire left subtree
-     */
-    public void testRemoveLeftSubtree() {
-        removeRange(3, 4);
-        assertContentsValid();
-    }
-
-    /**
-     * Test boundary conditions: Tests moving an entire left subtree including the tree itself
-     */
-    public void testRemoveRightIncludingRoot() {
-        removeRange(3, 5);
-        assertContentsValid();
-    }
-    
-    public void testClear() {
-        clear();
-        assertContentsValid();
-    }
-    
-    public void testClearSorted() {
-        forceFullSort();
-        clear();
-        assertContentsValid();
-    }
-    
-    //    
-//    
-//    public static void testAdditions() {
-//        TestComparator comparator = new TestComparator();
-//        LazySortedCollection collection = new LazySortedCollection(comparator);
-//
-//        addSomeElements(collection);
-//        
-//        System.out.println("comparisons after add = " + comparator.comparisons);
-//        comparator.comparisons = 0;
-//        
-//        // Getfirst10Elements
-//        Object[] first10Elements = new Object[10];
-//        collection.getFirst(first10Elements, false);
-//        System.out.println("first 10 elements:");
-//        printArray(first10Elements);
-//        System.out.println("comparisons after getFirst = " + comparator.comparisons);
-//        comparator.comparisons = 0;
-//        
-//        collection.print();
-//        
-//        // remove the 10th element
-//        collection.remove(first10Elements[9]);
-//        
-//        collection.print();
-//
-////        
-////        collection.getFirst(first10Elements, true);
-////        System.out.println("first 10 elements (sorted):");
-////        printArray(first10Elements);
-////        System.out.println("comparisons after getFirst = " + comparator.comparisons);
-////        comparator.comparisons = 0;
-////        
-////        
-////        
-////        // get elements 8-13
-////        Object[] eightThrough14 = new Object[7];
-////        collection.getRange(eightThrough14, 8, false);
-////        System.out.println("elements 8-14:");
-////        printArray(eightThrough14);
-////        System.out.println("comparisons after 8-14 query = " + comparator.comparisons);
-////        comparator.comparisons = 0;
-//        
-//        collection.print();
-//    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ListViewerComparatorTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ListViewerComparatorTest.java
deleted file mode 100644
index cf6b29b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ListViewerComparatorTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * @since 3.2
- *
- */
-public class ListViewerComparatorTest extends ViewerComparatorTest {
-
-	/**
-	 * @param name
-	 */
-	public ListViewerComparatorTest(String name) {
-		super(name);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.tests.viewers.ViewerTestCase#createViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	protected StructuredViewer createViewer(Composite parent) {
-        ListViewer viewer = new ListViewer(parent);
-        viewer.setContentProvider(new TeamModelContentProvider());
-        viewer.setLabelProvider(new TeamModelLabelProvider());
-        return viewer;
-	}
-	
-	public void testViewerSorter(){
-		fViewer.setSorter(new ViewerSorter());
-		assertSortedResult(TEAM1_SORTED);
-	}
-	
-	public void testViewerSorterInsertElement(){
-		fViewer.setSorter(new ViewerSorter());
-		team1.addMember("Duong");
-		assertSortedResult(TEAM1_SORTED_WITH_INSERT);
-	}
-	
-	public void testViewerComparator(){
-		fViewer.setComparator(new ViewerComparator());
-		assertSortedResult(TEAM1_SORTED);
-	}
-	
-	public void testViewerComparatorInsertElement(){
-		fViewer.setComparator(new ViewerComparator());
-		team1.addMember("Duong");
-		assertSortedResult(TEAM1_SORTED_WITH_INSERT);
-	}
-	
-	private void assertSortedResult(String[] expected){
-		String[] items = getListViewer().getList().getItems();
-		for (int i = 0; i < items.length; i++){
-			String item = items[i];
-			assertEquals("Item not expected.  actual=" + item + " expected=", expected[i], item);
-		}
-	}
-	
-	protected void setInput() {
-		fViewer.setInput(team1);
-	}
-	
-	protected ListViewer getListViewer(){
-		return (ListViewer)fViewer;
-	}
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		junit.textui.TestRunner.run(ListViewerComparatorTest.class);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ListViewerRefreshTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ListViewerRefreshTest.java
deleted file mode 100644
index de7ab44..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ListViewerRefreshTest.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Brad Reynolds.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Brad Reynolds - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-public class ListViewerRefreshTest extends TestCase {
-	/**
-	 * Used for viewing the UI. Set to 0 if not wanting to see the UI.
-	 */
-	private static final int DELAY = 0;
-
-	private Shell shell = null;
-
-	private Label label = null;
-
-	private ListViewer viewer = null;
-
-	private ArrayList input = null;
-
-	protected void setUp() throws Exception {
-		shell = new Shell();
-		shell.setSize(400, 200);
-		shell.setLayout(new FillLayout());
-		label = new Label(shell, SWT.WRAP);
-		viewer = new ListViewer(shell);
-		input = new ArrayList();
-
-		for (int i = 0; i < 50; i++) {
-			input.add("item " + i); //$NON-NLS-1$
-		}
-
-		viewer.setContentProvider(new ContentProvider());
-		viewer.setInput(input);
-		shell.layout();
-		shell.open();
-	}
-
-	/**
-	 * Asserts the ability to refresh without a selection and preserve the
-	 * scrolled to position.
-	 * 
-	 * @throws Exception
-	 */
-	public void testNoSelectionRefresh() throws Exception {
-		shell.setText("Lost Scrolled Position Test"); //$NON-NLS-1$
-		readAndDispatch();
-
-		run("Scrolled to position 30.", new Runnable() { //$NON-NLS-1$
-					public void run() {
-						viewer.reveal(input.get(30));
-					}
-				});
-
-		run("Refreshed viewer without a selection.", new Runnable() { //$NON-NLS-1$
-					public void run() {
-						viewer.refresh();
-					}
-				});
-
-		// BUG: The top index should not be the first item.
-		assertTrue(viewer.getList().getTopIndex() != 0);
-	}
-
-	/**
-	 * Asserts the ability to refresh with a selection and preserve the scrolled
-	 * to position.
-	 * 
-	 * @throws Exception
-	 */
-	public void testSelectionRefresh() throws Exception {
-		shell.setText("Preserved Scrolled Position Test"); //$NON-NLS-1$
-		readAndDispatch();
-
-		run("Setting selection to index 30.", new Runnable() { //$NON-NLS-1$
-					public void run() {
-						viewer.setSelection(new StructuredSelection(input
-								.get(30)));
-					}
-				});
-		
-		// Ensure that to index is 0
-		viewer.getList().setTopIndex(0);
-		
-		run("Refreshed viewer with selection.", new Runnable() { //$NON-NLS-1$
-					public void run() {
-						viewer.refresh();
-					}
-				});
-		
-		// Checking that the viewer is not scrolling
-		assertTrue(viewer.getList().getTopIndex() == 0);
-		
-		viewer.getList().showSelection();
-		
-		assertTrue(viewer.getList().getTopIndex() != 0);
-	}
-	
-	/**
-	 * Runs the runnable and displays the description.
-	 * 
-	 * @param description
-	 * @param runnable
-	 */
-	private void run(String description, Runnable runnable) {
-		runnable.run();
-		label.setText(description);
-
-		readAndDispatch();
-	}
-
-	/**
-	 * Flush UI events and {@link #DELAY delays}.
-	 */
-	private void readAndDispatch() {
-		Display display = Display.getCurrent();
-		while(display.readAndDispatch());
-
-		try {
-			Thread.sleep(DELAY);
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	private class ContentProvider implements IStructuredContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return ((List) inputElement).toArray();
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ListViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ListViewerTest.java
deleted file mode 100644
index 60e6c55..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ListViewerTest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - test case for bug 157309, 177619
- *     Brad Reynolds - test case for bug 141435
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.List;
-
-public class ListViewerTest extends StructuredViewerTest {
-
-    public ListViewerTest(String name) {
-        super(name);
-    }
-
-    protected StructuredViewer createViewer(Composite parent) {
-        ListViewer viewer = new ListViewer(parent);
-        viewer.setContentProvider(new TestModelContentProvider());
-        return viewer;
-    }
-
-    protected int getItemCount() {
-        TestElement first = fRootElement.getFirstChild();
-        List list = (List) fViewer.testFindItem(first);
-        return list.getItemCount();
-    }
-
-    protected String getItemText(int at) {
-        List list = (List) fViewer.getControl();
-        return list.getItem(at);
-    }
-
-    public static void main(String args[]) {
-        junit.textui.TestRunner.run(ListViewerTest.class);
-    }
-    
-    public void testInsert() {
-    	ListViewer v = ((ListViewer)fViewer);
-    	TestElement element = new TestElement(fModel, fRootElement);
-    	v.insert(element, 1);
-    	assertSame("test insert", element, v.getElementAt(1));
-    	assertEquals("test insert", element.toString(), v.getList().getItem(1));
-    	
-    	v.addFilter(new ViewerFilter() {
-
-			public boolean select(Viewer viewer, Object parentElement, Object element) {
-				return true;
-			}
-    	});
-    	
-    	TestElement element1 = new TestElement(fModel, fRootElement);
-    	v.insert(element1, 1);
-    	assertNotSame("test insert", element1, v.getElementAt(1));
-    	
-    	v.setFilters(new ViewerFilter[0]);
-    	v.remove(element);
-    	v.remove(element1);
-    }
-    
-    public void testRevealBug69076() {
-    	// TODO remove the Mac OS check when SWT has fixed the bug in List.java
-    	// see bug 116105
-    	if (Util.isCarbon()) {
-    		return;
-    	}
-		fViewer = null;
-		if (fShell != null) {
-			fShell.dispose();
-			fShell = null;
-		}
-		openBrowser();
-		for (int i = 40; i < 45; i++) {
-			fRootElement = TestElement.createModel(1, i);
-			fModel = fRootElement.getModel();
-			fViewer.setInput(fRootElement);
-			for (int j = 30; j < fRootElement.getChildCount(); j++) {
-				fViewer.setSelection(new StructuredSelection(fRootElement
-						.getFirstChild()), true);
-				TestElement child = fRootElement.getChildAt(j);
-				fViewer.reveal(child);
-				List list = ((ListViewer) fViewer).getList();
-				int topIndex = list.getTopIndex();
-				// even though we pass in reveal=false, SWT still scrolls to show the selection (since 20020815)
-				fViewer.setSelection(new StructuredSelection(child), false);
-				assertEquals("topIndex should not change on setSelection", topIndex, list
-						.getTopIndex());
-				list.showSelection();
-				assertEquals("topIndex should not change on showSelection", topIndex, list
-						.getTopIndex());
-			}
-		}
-	}
-    
-    /**
-     * Asserts the ability to refresh a List that contains no selection without losing vertically scrolled state.
-     * 
-     * @throws Exception
-     */
-    public void testRefreshBug141435() throws Exception {
-    	fViewer = null;
-		if (fShell != null) {
-			fShell.dispose();
-			fShell = null;
-		}
-		openBrowser();
-		TestElement model = TestElement.createModel(1, 50);
-		fViewer.setInput(model);
-		
-		int lastIndex = model.getChildCount() - 1;
-		
-		//Scroll...
-		fViewer.reveal(model.getChildAt(lastIndex));
-		List list = (List) fViewer.getControl();
-		int topIndex = list.getTopIndex();
-		
-		assertTrue("Top item should not be the first item.", topIndex != 0);
-		fViewer.refresh();
-		processEvents();
-		assertEquals("Top index was not preserved after refresh.", topIndex, list.getTopIndex());
-		
-		//Assert that when the previous top index after refresh is invalid no exceptions are thrown.
-		model.deleteChildren();
-		
-		try {
-			fViewer.refresh();
-			assertEquals(0, list.getTopIndex());
-		} catch (Exception e) {
-			fail("Refresh failure when refreshing with an empty model.");
-		}		
-	}
-    
-    public void testSelectionRevealBug177619() throws Exception {
-    	TestElement model = TestElement.createModel(1, 100);
-		fViewer.setInput(model);
-		
-    	fViewer.setSelection(new StructuredSelection(((ListViewer)fViewer).getElementAt(50)),true);
-    	assertTrue(((ListViewer)fViewer).getList().getTopIndex() != 0);
-	}
-	
-	public void testSelectionNoRevealBug177619() throws Exception {
-		TestElement model = TestElement.createModel(1, 100);
-		fViewer.setInput(model);
-		
-		fViewer.setSelection(new StructuredSelection(((ListViewer)fViewer).getElementAt(50)),false);
-		assertTrue(((ListViewer)fViewer).getList().getTopIndex() == 0);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/MultipleEqualElementsTreeViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/MultipleEqualElementsTreeViewerTest.java
deleted file mode 100644
index b02adc6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/MultipleEqualElementsTreeViewerTest.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * Tests TreeViewer's support for multiple equal elements ().
- * 
- * @since 3.2
- */
-public class MultipleEqualElementsTreeViewerTest extends TreeViewerTest {
-	
-	private TestElement element_2;
-
-	private TestElement element_2_1;
-
-	private TestElement element_2_1_2;
-
-	private TestElement element_1;
-
-	private TestElement element_1_3;
-
-	private TreePath treePath_1_2_21_212;
-
-	private TreePath treePath_1_21_212;
-
-	private TreePath treePath_1_212;
-
-	private TreePath treePath_2_21_212;
-
-	private TreePath treePath_1;
-
-	private TreePath treePath_1_21;
-
-	private TreePath treePath_2_21;
-
-	private TreePath treePath_1_2_21;
-
-	private TreePath treePath_1_2;
-
-	private TreePath treePath_2;
-
-	public MultipleEqualElementsTreeViewerTest(String name) {
-		super(name);
-	}
-
-	public TreeViewer getTreeViewer() {
-		return (TreeViewer) fViewer;
-	}
-
-	protected void setUpModel() {
-		/*
-		 * - fRootElement
-		 * |+element_0
-		 * |-element_1
-		 * ||+element_1_0
-		 * ||+element_1_1
-		 * ||+element_1_2
-		 * ||+element_1_3
-		 * ||+element_1_4
-		 * ||+element_1_5
-		 * ||+element_1_6
-		 * ||+element_1_7
-		 * ||+element_1_8
-		 * ||+element_1_9
-		 * ||+element_2
-		 * ||+element_2_1
-		 * ||+element_2_1_2
-		 * |-element_2
-		 * ||+element_2_0
-		 * ||-element_2_1
-		 * |||+element_2_1_0
-		 * |||+element_2_1_1
-		 * |||+element_2_1_2
-		 * |||+element_2_1_3
-		 * |||+element_2_1_4
-		 * |||+element_2_1_5
-		 * |||+element_2_1_6
-		 * |||+element_2_1_7
-		 * |||+element_2_1_8
-		 * |||+element_2_1_9
-		 * ||+element_2_2
-		 * ||+element_2_3
-		 * ||+element_2_4
-		 * ||+element_2_5
-		 * ||+element_2_6
-		 * ||+element_2_7
-		 * ||+element_2_8
-		 * ||+element_2_9
-		 * |+element_3
-		 * |+element_4
-		 * |+element_5
-		 * |+element_6
-		 * |+element_7
-		 * |+element_8
-		 * |+element_9
-		 */
-
-		fRootElement = TestElement.createModel(3, 10);
-		element_2 = fRootElement.getChildAt(2);
-		element_2_1 = element_2.getChildAt(1);
-		element_2_1_2 = element_2_1.getChildAt(2);
-		element_1 = fRootElement.getChildAt(1);
-		element_1_3 = element_1.getChildAt(1);
-		element_1.addChild(element_2, null);
-		element_1.addChild(element_2_1, null);
-		element_1.addChild(element_2_1_2, null);
-		treePath_1_2_21_212 = new TreePath(new Object[] { element_1, element_2,
-				element_2_1, element_2_1_2 });
-		treePath_1_2_21 = new TreePath(new Object[] { element_1, element_2,
-				element_2_1 });
-		treePath_1 = new TreePath(new Object[] { element_1 });
-		treePath_2 = new TreePath(new Object[] { element_2 });
-		treePath_1_2 = new TreePath(new Object[] { element_1, element_2 });
-		treePath_1_21 = new TreePath(new Object[] { element_1, element_2_1 });
-		treePath_1_21_212 = new TreePath(new Object[] { element_1, element_2_1,
-				element_2_1_2 });
-		treePath_1_212 = new TreePath(new Object[] { element_1, element_2_1_2 });
-		treePath_2_21_212 = new TreePath(new Object[] { element_2, element_2_1,
-				element_2_1_2 });
-		treePath_2_21 = new TreePath(new Object[] { element_2, element_2_1 });
-		fModel = fRootElement.getModel();
-	}
-
-	public void testElementMap() {
-		getTreeViewer().expandToLevel(element_1, AbstractTreeViewer.ALL_LEVELS);
-		getTreeViewer().expandToLevel(element_2, AbstractTreeViewer.ALL_LEVELS);
-		assertEquals(1, getTreeViewer().testFindItems(element_1).length);
-		assertEquals(2, getTreeViewer().testFindItems(element_2).length);
-		assertEquals(3, getTreeViewer().testFindItems(element_2_1).length);
-		assertEquals(4, getTreeViewer().testFindItems(element_2_1_2).length);
-	}
-
-	public void testSelection() {
-		getTreeViewer().expandToLevel(element_1, AbstractTreeViewer.ALL_LEVELS);
-		getTreeViewer().expandToLevel(element_2, AbstractTreeViewer.ALL_LEVELS);
-		getTreeViewer().setSelection(new StructuredSelection(element_1_3));
-		ISelection selection = getTreeViewer().getSelection();
-		assertTrue(selection instanceof ITreeSelection);
-		ITreeSelection treeSelection = (ITreeSelection) selection;
-		assertEquals(new TreeSelection(new TreePath(new Object[] { element_1,
-				element_1_3 }), null), treeSelection);
-		Widget[] items = getTreeViewer().testFindItems(element_2_1_2);
-		TreeItem[] treeItems = new TreeItem[items.length];
-		System.arraycopy(items, 0, treeItems, 0, items.length);
-		assertEquals(4, treeItems.length);
-		for (int i = 0; i < treeItems.length; i++) {
-			assertNotNull(treeItems[i]);
-		}
-		getTreeViewer().getTree().setSelection(treeItems);
-		treeSelection = (ITreeSelection) getTreeViewer().getSelection();
-		List paths = Arrays.asList(treeSelection.getPaths());
-		assertEquals(4, paths.size());
-		assertTrue(paths.contains(treePath_1_2_21_212));
-		assertTrue(paths.contains(treePath_1_21_212));
-		assertTrue(paths.contains(treePath_1_212));
-		assertTrue(paths.contains(treePath_2_21_212));
-		getTreeViewer().setSelection(
-				new TreeSelection(new TreePath[] { treePath_2_21_212 }, null));
-		assertEquals(1, getTreeViewer().getTree().getSelectionCount());
-		assertMatchingPath(treePath_2_21_212, getTreeViewer().getTree()
-				.getSelection()[0]);
-	}
-
-	public void testExpansion() {
-		getTreeViewer().expandToLevel(treePath_1_21_212, 1);
-		assertEqualsArray("element expansion", new Object[] { element_1,
-				element_2_1 }, getTreeViewer().getExpandedElements());
-		assertEqualsArray("path expansion", new Object[] { treePath_1,
-				treePath_1_21 }, getTreeViewer().getExpandedTreePaths());
-		getTreeViewer().setExpandedTreePaths(
-				new TreePath[] { treePath_1, treePath_1_2, treePath_1_2_21, treePath_2, treePath_2_21 });
-		assertEqualsArray("path expansion", new Object[] { treePath_1, treePath_1_2, treePath_1_2_21, treePath_2, treePath_2_21 }, getTreeViewer().getExpandedTreePaths());
-	}
-
-	private void assertMatchingPath(TreePath expectedPath, TreeItem item) {
-		for (int i = expectedPath.getSegmentCount() - 1; i >= 0; i--) {
-			assertNotNull(item);
-			assertEquals(expectedPath.getSegment(i), item.getData());
-			item = item.getParentItem();
-		}
-		assertNull(item);
-	}
-
-	public void testUpdate() {
-		// materialize
-		getTreeViewer().setExpandedTreePaths(
-				new TreePath[] { treePath_1_2_21, treePath_2_21 });
-		Widget[] items = getTreeViewer().testFindItems(element_2_1);
-		for (int i = 0; i < items.length; i++) {
-			assertEquals("0-2-1 name-1", ((TreeItem) items[i]).getText());
-		}
-		element_2_1.setLabel("billy");
-		// the setLabel call fires a change event which results in a call like this:
-		// getTreeViewer().update(element_2_1, null);
-		for (int i = 0; i < items.length; i++) {
-			assertEquals("0-2-1 billy", ((TreeItem) items[i]).getText());
-		}
-	}
-	
-	public void testAddWithoutMaterialize() {
-		TestElement newElement = element_2.addChild(TestModelChange.INSERT);
-		getTreeViewer().setExpandedTreePaths(
-				new TreePath[] { treePath_1_2_21, treePath_2_21 });
-		Widget[] items = getTreeViewer().testFindItems(newElement);
-		assertEquals(2, items.length);
-	}
-	
-	public void testAddAfterMaterialize() {
-		// materialize before adding
-		getTreeViewer().setExpandedTreePaths(
-				new TreePath[] { treePath_1_2_21, treePath_2_21 });
-		TestElement newElement = element_2.addChild(TestModelChange.INSERT);
-		getTreeViewer().setExpandedTreePaths(
-				new TreePath[] { treePath_1_2_21, treePath_2_21 });
-		Widget[] items = getTreeViewer().testFindItems(newElement);
-		assertEquals(2, items.length);
-	}
-	
-	public void testRemoveWithParentAfterMaterialize() {
-		// materialize
-		getTreeViewer().expandToLevel(element_1, AbstractTreeViewer.ALL_LEVELS);
-		getTreeViewer().expandToLevel(element_2, AbstractTreeViewer.ALL_LEVELS);
-		element_2.basicDeleteChild(element_2_1);
-		getTreeViewer().remove(element_2, new Object[]{element_2_1});
-		assertEquals(2, getTreeViewer().testFindItems(element_2).length);
-		assertEquals(1, getTreeViewer().testFindItems(element_2_1).length);
-		assertEquals(2, getTreeViewer().testFindItems(element_2_1_2).length);
-	}
-
-	public void testRemoveWithParentBeforeMaterialize() {
-		element_2.basicDeleteChild(element_2_1);
-		getTreeViewer().remove(element_2, new Object[]{element_2_1});
-		// materialize
-		getTreeViewer().expandToLevel(element_1, AbstractTreeViewer.ALL_LEVELS);
-		getTreeViewer().expandToLevel(element_2, AbstractTreeViewer.ALL_LEVELS);
-		assertEquals(2, getTreeViewer().testFindItems(element_2).length);
-		assertEquals(1, getTreeViewer().testFindItems(element_2_1).length);
-		assertEquals(2, getTreeViewer().testFindItems(element_2_1_2).length);
-	}
-	
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/SimpleTableViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/SimpleTableViewerTest.java
deleted file mode 100644
index 4a8a251..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/SimpleTableViewerTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.tests.harness.util.Mocks;
-
-/**
- * @since 3.2
- * 
- */
-public class SimpleTableViewerTest extends ViewerTestCase {
-
-	private TableViewer tableViewer;
-
-	/**
-	 * @param name
-	 */
-	public SimpleTableViewerTest(String name) {
-		super(name);
-	}
-
-	protected StructuredViewer createViewer(Composite parent) {
-		tableViewer = new TableViewer(parent);
-		tableViewer.setContentProvider(new TestModelContentProvider());
-		return tableViewer;
-	}
-
-	public void testNullLabel() {
-		tableViewer.setLabelProvider(new ITableLabelProvider() {
-
-			public Image getColumnImage(Object element, int columnIndex) {
-				return null;
-			}
-
-			public String getColumnText(Object element, int columnIndex) {
-				return null;
-			}
-
-			public void addListener(ILabelProviderListener listener) {
-			}
-
-			public void dispose() {
-			}
-
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-
-			public void removeListener(ILabelProviderListener listener) {
-			}
-		});
-	}
-
-	public void testLabelProviderListeners() {
-		Table table = tableViewer.getTable();
-		new TableColumn(table, SWT.NONE);
-		new TableColumn(table, SWT.NONE);
-		ILabelProvider mockLabelProvider = (ILabelProvider) Mocks
-				.createOrderedMock(ILabelProvider.class);
-		// setLabelProvider will cause the addListener and does a refresh,
-		// so getText and getImage will be called for each element and both
-		// columns
-		mockLabelProvider.addListener(null);
-		int count = table.getItemCount();
-		for (int i = 0; i < count; i++) {
-			mockLabelProvider.getText(null);
-			mockLabelProvider.getImage(null);
-			mockLabelProvider.getText(null);
-			mockLabelProvider.getImage(null);
-		}
-		Mocks.startChecking(mockLabelProvider);
-		tableViewer.setLabelProvider(mockLabelProvider);
-		Mocks.verify(mockLabelProvider);
-
-		// this will be caused by the dispose()
-		mockLabelProvider.removeListener(null);
-		mockLabelProvider.dispose();
-		Mocks.startChecking(mockLabelProvider);
-		tableViewer.getTable().dispose();
-		Mocks.verify(mockLabelProvider);
-	}
-
-	public void testLabelProviderListenersWithColumn() {
-		Table table = tableViewer.getTable();
-		new TableColumn(table, SWT.NONE);
-		new TableViewerColumn(tableViewer, SWT.NONE);
-		final int[] disposeCounter = { 0 };
-		final int[] listenerCounter = { 0 };
-		tableViewer.setLabelProvider(new LabelProvider() {
-			public void addListener(ILabelProviderListener listener) {
-				listenerCounter[0]++;
-				super.addListener(listener);
-			}
-			public void removeListener(ILabelProviderListener listener) {
-				super.removeListener(listener);
-				listenerCounter[0]--;
-			}
-			public void dispose() {
-				disposeCounter[0]++;
-			}
-		});
-		table.dispose();
-		assertEquals(1, disposeCounter[0]);
-		assertEquals(0, listenerCounter[0]);
-	}
-
-	public void testColumnLabelProviderListeners() {
-		Table table = tableViewer.getTable();
-		new TableColumn(table, SWT.NONE);
-		TableViewerColumn tvc = new TableViewerColumn(tableViewer, SWT.NONE);
-		final int[] disposeCounter = { 0 };
-		final int[] listenerCounter = { 0 };
-		tvc.setLabelProvider(new ColumnLabelProvider() {
-			public void addListener(ILabelProviderListener listener) {
-				listenerCounter[0]++;
-				super.addListener(listener);
-			}
-			public void removeListener(ILabelProviderListener listener) {
-				super.removeListener(listener);
-				listenerCounter[0]--;
-			}
-			public void dispose() {
-				disposeCounter[0]++;
-			}
-		});
-		table.dispose();
-		assertEquals(0, listenerCounter[0]);
-		assertEquals(1, disposeCounter[0]);
-	}
-	
-	public void testCellLabelProviderDispose() {
-		final int[] disposeCounter = { 0 };
-		tableViewer.setLabelProvider(new ColumnLabelProvider() {
-			public void dispose() {
-				disposeCounter[0]++;
-			}
-		});
-		tableViewer.getTable().dispose();
-		assertEquals(1, disposeCounter[0]);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/SimpleTreeViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/SimpleTreeViewerTest.java
deleted file mode 100644
index eed61df..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/SimpleTreeViewerTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreePathViewerSorter;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * @since 3.2
- * 
- */
-public class SimpleTreeViewerTest extends ViewerTestCase {
-
-	private TreeViewer treeViewer;
-
-	/**
-	 * @param name
-	 */
-	public SimpleTreeViewerTest(String name) {
-		super(name);
-	}
-
-	protected StructuredViewer createViewer(Composite parent) {
-		treeViewer = new TreeViewer(parent);
-		treeViewer.setContentProvider(new TestModelContentProvider());
-		return treeViewer;
-	}
-
-	public void testSetTreePathViewerSorterOnNullInput() {
-		treeViewer.setInput(null);
-		treeViewer.setSorter(new TreePathViewerSorter());
-	}
-	
-	public void testNullLabel() {
-		treeViewer.setLabelProvider(new ITableLabelProvider(){
-
-			public Image getColumnImage(Object element, int columnIndex) {
-				return null;
-			}
-
-			public String getColumnText(Object element, int columnIndex) {
-				return null;
-			}
-
-			public void addListener(ILabelProviderListener listener) {
-			}
-
-			public void dispose() {
-			}
-
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-
-			public void removeListener(ILabelProviderListener listener) {
-			}});
-	}
-
-	static class MyViewerSorter extends ViewerSorter {
-		boolean inverted = false;
-
-		public int compare(Viewer viewer, Object e1, Object e2) {
-			if (inverted) {
-				return super.compare(viewer, e2, e1);
-			}
-			return super.compare(viewer, e1, e2);
-		}
-	}
-
-	public void testBug184441() {
-		MyViewerSorter sorter = new MyViewerSorter();
-		treeViewer.setSorter(sorter);
-		ITreeContentProvider contentProvider = (ITreeContentProvider) treeViewer
-				.getContentProvider();
-		Object firstRoot = contentProvider.getElements(treeViewer.getInput())[0];
-		Object childOfFirstRoot = contentProvider.getChildren(firstRoot)[0];
-		treeViewer.setSelection(new StructuredSelection(childOfFirstRoot), true);
-		final ISelectionChangedListener listener = new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				fail();
-			}
-		};
-		treeViewer.addSelectionChangedListener(listener);
-		sorter.inverted = true;
-		treeViewer.refresh();
-		treeViewer.removeSelectionChangedListener(listener);
-	}
-	
-	public void testBug184712() {
-		class TableAndTreeLabelProvider extends LabelProvider implements ITableLabelProvider {
-			public Image getColumnImage(Object element, int columnIndex) {
-				return null;
-			}
-			public String getColumnText(Object element, int columnIndex) {
-				return "wrong";
-			}
-			public String getText(Object element) {
-				return "right";
-			}
-		}
-		treeViewer.setLabelProvider(new TableAndTreeLabelProvider());
-		assertEquals("right", treeViewer.getTree().getItem(0).getText());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/SimpleVirtualLazyTreeViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/SimpleVirtualLazyTreeViewerTest.java
deleted file mode 100644
index a3fe6e2..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/SimpleVirtualLazyTreeViewerTest.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.ILazyTreeContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- * Tests TreeViewer's VIRTUAL support with a lazy content provider.
- * 
- * @since 3.2
- */
-public class SimpleVirtualLazyTreeViewerTest extends ViewerTestCase {
-	private static final int NUM_ROOTS = 100;
-	private static final int NUM_CHILDREN = 10;
-
-	private boolean callbacksEnabled = true;
-	private boolean printCallbacks = false;
-	private int offset = 0;
-
-	private class LazyTreeContentProvider implements ILazyTreeContentProvider {
-		/**
-		 * 
-		 */
-		private Object input;
-
-		public void updateElement(Object parent, int index) {
-			updateElementCallCount++;
-			String parentString = (String) parent;
-			Object childElement = parentString + "-" + (index+offset);
-			if (printCallbacks)
-				System.out.println("updateElement called for " + parent + " at " + index);
-			if (callbacksEnabled) {
-				getTreeViewer().replace(parent, index, childElement);
-				getTreeViewer().setChildCount(childElement, NUM_CHILDREN);
-			}
-		}
-
-		public void dispose() {
-			// do nothing
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			this.input = newInput;
-		}
-
-		public Object getParent(Object element) {
-			return null;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ILazyTreeContentProvider#updateChildCount(java.lang.Object, int)
-		 */
-		public void updateChildCount(Object element, int currentChildCount) {
-			if (printCallbacks)
-				System.out.println("updateChildCount called for " + element + " with " + currentChildCount);
-			if (callbacksEnabled) {
-				getTreeViewer().setChildCount(element, element==input?NUM_ROOTS:NUM_CHILDREN);
-			}
-		}
-	}
-
-	private int updateElementCallCount = 0;
-
-	public SimpleVirtualLazyTreeViewerTest(String name) {
-		super(name);
-	}
-
-	public TreeViewer getTreeViewer() {
-		return (TreeViewer) fViewer;
-	}
-
-	protected void setInput() {
-		String letterR = "R";
-		getTreeViewer().setInput(letterR);
-	}
-
-	protected StructuredViewer createViewer(Composite parent) {
-		Tree tree = new Tree(fShell, SWT.VIRTUAL | SWT.MULTI);
-		TreeViewer treeViewer = new TreeViewer(tree);
-		treeViewer.setContentProvider(new LazyTreeContentProvider());
-		return treeViewer;
-	}
-
-	public void testCreation() {
-		processEvents();
-		assertTrue("tree should have items", getTreeViewer().getTree()
-				.getItemCount() > 0);
-		assertTrue("call to updateElement expected", updateElementCallCount > 0);
-		assertTrue(
-				"expected calls to updateElement for less than half of the items",
-				updateElementCallCount < NUM_ROOTS / 2);
-		assertEquals("R-0", getTreeViewer().getTree().getItem(0).getText());
-	}
-
-	public void testExpand() {
-		processEvents();
-		Tree tree = getTreeViewer().getTree();
-		getTreeViewer().expandToLevel("R-0", 1);
-		// force redrawing the tree - this will trigger the SetData event
-		tree.update();
-		assertEquals(NUM_CHILDREN, tree.getItem(0).getItemCount());
-		TreeItem treeItem = tree.getItem(0).getItem(3);
-		expandAndNotify(treeItem);
-		// force redrawing the tree - this will trigger the SetData event
-		tree.update();
-		assertEquals(NUM_CHILDREN, treeItem.getItemCount());
-		assertEquals(NUM_CHILDREN, treeItem.getItems().length);
-		// interact();
-	}
-
-	private void expandAndNotify(TreeItem treeItem) {
-		// callbacksEnabled = false;
-		Tree tree = treeItem.getParent();
-		tree.setRedraw(false);
-		treeItem.setExpanded(true);
-		try {
-			Event event = new Event();
-			event.item = treeItem;
-			event.type = SWT.Expand;
-			tree.notifyListeners(SWT.Expand, event);
-		} finally {
-			// callbacksEnabled = true;
-			tree.setRedraw(true);
-		}
-	}
-	
-	public void testSetSorterOnNullInput() {
-		fViewer.setInput(null);
-		fViewer.setSorter(new ViewerSorter());
-	}
-	
-	public void testSetComparatorOnNullInput(){
-		fViewer.setInput(null);
-		fViewer.setComparator(new ViewerComparator());		
-	}
-	
-	/* test TreeViewer.remove(parent, index) */ 
-	public void testRemoveAt() {
-		TreeViewer treeViewer = (TreeViewer) fViewer;
-		// correct what the content provider is answering with
-		treeViewer.getTree().update();
-		offset = 1;
-		treeViewer.remove(treeViewer.getInput(), 3);
-		assertEquals(NUM_ROOTS - 1, treeViewer.getTree().getItemCount());
-		treeViewer.setSelection(new StructuredSelection(new Object[] { "R-0",
-				"R-1" }));
-		assertEquals(2, ((IStructuredSelection) treeViewer.getSelection())
-				.size());
-		processEvents();
-		assertTrue("expected less than " + (NUM_ROOTS / 2) + " but got "
-				+ updateElementCallCount,
-				updateElementCallCount < NUM_ROOTS / 2);
-		updateElementCallCount = 0;
-//		printCallbacks = true;
-		// correct what the content provider is answering with
-		offset = 2;
-		treeViewer.remove(treeViewer.getInput(), 1);
-		assertEquals(NUM_ROOTS - 2, treeViewer.getTree().getItemCount());
-		processEvents();
-		assertEquals(1, ((IStructuredSelection) treeViewer.getSelection())
-				.size());
-		assertEquals(1, updateElementCallCount);
-//		printCallbacks = false;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StructuredItemViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StructuredItemViewerTest.java
deleted file mode 100644
index da9e76f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StructuredItemViewerTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.ICheckable;
-
-public abstract class StructuredItemViewerTest extends StructuredViewerTest {
-
-    public StructuredItemViewerTest(String name) {
-        super(name);
-    }
-
-    public void testCheckElement() {
-
-        if (fViewer instanceof ICheckable) {
-            TestElement first = fRootElement.getFirstChild();
-            TestElement firstfirst = first.getFirstChild();
-
-            ICheckable ctv = (ICheckable) fViewer;
-            ctv.setChecked(first, true);
-            assertTrue(ctv.getChecked(first));
-
-            // checking an invisible element
-            if (fViewer instanceof AbstractTreeViewer) {
-                // The first child of the first child can only be resolved in a tree
-                assertTrue(ctv.setChecked(firstfirst, true));
-                assertTrue(ctv.getChecked(firstfirst));
-            } else {
-                assertTrue(!ctv.setChecked(firstfirst, true));
-                assertTrue(!ctv.getChecked(firstfirst));
-            }
-
-            ctv.setChecked(first, false);
-            assertTrue(!ctv.getChecked(first));
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StructuredSelectionTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StructuredSelectionTest.java
deleted file mode 100644
index 64af9d7..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StructuredSelectionTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.viewers.StructuredSelection;
-
-public class StructuredSelectionTest extends TestCase {
-
-    public StructuredSelectionTest(String name) {
-        super(name);
-    }
-
-    public static void main(String args[]) {
-        junit.textui.TestRunner.run(StructuredSelectionTest.class);
-    }
-
-    public void testEquals() {
-        String element = "A selection";
-        StructuredSelection sel1 = new StructuredSelection(element);
-        StructuredSelection sel2 = new StructuredSelection(element);
-        assertEquals(sel1, sel2);
-    }
-
-    public void testEquals2() {
-        String element1 = "A selection";
-        String element2 = "A selection";
-        String element3 = "Other";
-        StructuredSelection sel1 = new StructuredSelection(element1);
-        StructuredSelection sel2 = new StructuredSelection(element2);
-        StructuredSelection sel3 = new StructuredSelection(element3);
-        assertEquals(sel1, sel2);
-        assertTrue(!sel1.equals(sel3));
-    }
-
-    public void testEquals3() { // two empty selections
-        StructuredSelection empty1 = new StructuredSelection();
-        StructuredSelection empty2 = new StructuredSelection();
-        assertTrue(empty1.equals(empty2));
-        assertTrue(empty2.equals(empty1));
-    }
-
-    public void testEquals4() { // empty selection with non-empty selection
-        StructuredSelection sel = new StructuredSelection("A selection");
-        StructuredSelection empty = new StructuredSelection();
-        assertTrue(!sel.equals(empty));
-        assertTrue(!empty.equals(sel));
-    }
-
-    public void testEquals5() { // equality is order-dependent
-        List l1 = new ArrayList();
-        l1.add("element 1");
-        l1.add("element 2");
-
-        List l2 = new ArrayList();
-        l2.add("element 2");
-        l2.add("element 1");
-
-        StructuredSelection sel1 = new StructuredSelection(l1);
-        StructuredSelection sel2 = new StructuredSelection(l2);
-        assertTrue(!sel1.equals(sel2));
-        assertTrue(!sel2.equals(sel1));
-    }
-
-    public void testEquals6() { // different selections
-        List l1 = new ArrayList();
-        l1.add("element 1");
-        l1.add("element 2");
-
-        List l2 = new ArrayList();
-        l2.add("element 2");
-        l2.add("element 3");
-        l2.add("element 1");
-
-        StructuredSelection sel1 = new StructuredSelection(l1);
-        StructuredSelection sel2 = new StructuredSelection(l2);
-        assertTrue(!sel1.equals(sel2));
-        assertTrue(!sel2.equals(sel1));
-    }
-
-    /**
-     * Empty selections via different constructors.
-     * Regression test for bug 40245.
-     */
-    public void testEquals7() {
-        StructuredSelection empty1 = new StructuredSelection();
-        StructuredSelection empty2 = new StructuredSelection(new Object[0]);
-        assertTrue(empty1.equals(empty2));
-        assertTrue(empty2.equals(empty1));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StructuredViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StructuredViewerTest.java
deleted file mode 100644
index 437c695..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StructuredViewerTest.java
+++ /dev/null
@@ -1,383 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl - bug 151205
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableTreeViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.graphics.Image;
-
-public abstract class StructuredViewerTest extends ViewerTestCase {
-    public static class TestLabelFilter extends ViewerFilter {
-        public boolean select(Viewer viewer, Object parent, Object element) {
-            String label = ((TestElement) element).getLabel();
-            int count = label.indexOf("-");
-            if (count < 0)
-                return false;
-            String number = label.substring(count + 1);
-            return ((Integer.parseInt(number) % 2) == 0);
-        }
-
-        public boolean isFilterProperty(Object element, String property) {
-            return property.equals(IBasicPropertyConstants.P_TEXT);
-        }
-    }
-
-    public static class TestLabelFilter2 extends ViewerFilter {
-        public boolean select(Viewer viewer, Object parent, Object element) {
-            String label = ((TestElement) element).getLabel();
-            int count = label.indexOf("-");
-            if (count < 0)
-                return false;
-            String number = label.substring(count + 1);
-            return Integer.parseInt(number) == 0;
-        }
-
-        public boolean isFilterProperty(Object element, String property) {
-            return property.equals(IBasicPropertyConstants.P_TEXT);
-        }
-    }
-    
-    public static class TestLabelSorter extends ViewerSorter {
-        public int compare(Viewer v, Object e1, Object e2) {
-            // put greater labels first
-            String name1 = ((TestElement) e1).getLabel();
-            String name2 = ((TestElement) e2).getLabel();
-            return name2.compareTo(name1);
-        }
-
-        public boolean isSorterProperty(Object element, String property) {
-            return property.equals(IBasicPropertyConstants.P_TEXT);
-        }
-    }
-
-    public static class TestLabelProvider extends LabelProvider {
-        public static String fgSuffix = "";
-
-        static Image fgImage = ImageDescriptor.createFromFile(
-                TestLabelProvider.class, "images/java.gif").createImage();
-
-        public String getText(Object element) {
-            return providedString((TestElement) element);
-        }
-
-        public Image getImage(Object element) {
-            return fgImage;
-        }
-
-        public void setSuffix(String suffix) {
-            fgSuffix = suffix;
-            fireLabelProviderChanged(new LabelProviderChangedEvent(this));
-        }
-    }
-
-    public StructuredViewerTest(String name) {
-        super(name);
-    }
-
-    protected void bulkChange(TestModelChange eventToFire) {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement newElement = first.getContainer().basicAddChild();
-        fRootElement.basicDeleteChild(first);
-        fModel.fireModelChanged(eventToFire);
-        processEvents();
-        assertNotNull("new sibling is visible", fViewer
-                .testFindItem(newElement));
-        assertNull("first child is not visible", fViewer.testFindItem(first));
-    }
-
-    protected abstract int getItemCount();
-
-    protected abstract String getItemText(int at);
-
-    public static String providedString(String s) {
-        return s + "<rendered>" + TestLabelProvider.fgSuffix;
-    }
-
-    public static String providedString(TestElement element) {
-        return element.getID() + " " + element.getLabel() + "<rendered>"
-                + TestLabelProvider.fgSuffix;
-    }
-
-    public void testClearSelection() {
-        TestElement first = fRootElement.getFirstChild();
-        StructuredSelection selection = new StructuredSelection(first);
-        fViewer.setSelection(selection);
-        fViewer.setSelection(new StructuredSelection());
-        ISelection result = fViewer.getSelection();
-        assertTrue(result.isEmpty());
-    }
-
-    public void testDeleteChild() {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement first2 = first.getFirstChild();
-        first.deleteChild(first2);
-        assertNull("first child is not visible", fViewer.testFindItem(first2));
-    }
-
-    public void testDeleteInput() {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement firstfirst = first.getFirstChild();
-        fRootElement = first;
-        setInput();
-        fRootElement.deleteChild(first);
-        assertNull("first child is not visible", fViewer
-                .testFindItem(firstfirst));
-    }
-
-    public void testDeleteSibling() {
-        TestElement first = fRootElement.getFirstChild();
-        assertNotNull("first child is visible", fViewer.testFindItem(first));
-        fRootElement.deleteChild(first);
-        assertNull("first child is not visible", fViewer.testFindItem(first));
-    }
-    
-    /**
-     * Tests to ensure that the viewer is properly diposed.  Includes:
-     *     removal of filters
-     */
-    public void testDispose() {
-    	assertEquals(0, fViewer.getFilters().length);
-    	fViewer.addFilter(new ViewerFilter() {
-
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return false;
-			}});
-    	assertEquals(1, fViewer.getFilters().length);
-    	fViewer.getControl().dispose();
-    	assertEquals(0, fViewer.getFilters().length);
-    }
-
-    public void testFilter() {
-        ViewerFilter filter = new TestLabelFilter();
-        fViewer.addFilter(filter);
-        assertTrue("filtered count", getItemCount() == 5);
-        fViewer.removeFilter(filter);
-        assertTrue("unfiltered count", getItemCount() == 10);
-
-    }
-
-    public void testSetFilters() {
-    	ViewerFilter filter = new TestLabelFilter();
-    	fViewer.setFilters(new ViewerFilter[] { filter, new TestLabelFilter2() });
-//    	System.err.println("Item: " + getItemCount() );
-    	assertTrue("2 filters count", getItemCount() == 1);
-    	
-    	fViewer.setFilters(new ViewerFilter[] { filter });
-    	assertTrue("1 filtered count", getItemCount() == 5);
-    	
-    	fViewer.setFilters(new ViewerFilter[0]);
-    	assertTrue("unfiltered count", getItemCount() == 10);
-    }
-    
-    public void testInsertChild() {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement newElement = first.addChild(TestModelChange.INSERT);
-        assertNull("new sibling is not visible", fViewer
-                .testFindItem(newElement));
-    }
-
-    public void testInsertSibling() {
-        TestElement newElement = fRootElement.addChild(TestModelChange.INSERT);
-        processEvents();
-        assertNotNull("new sibling is visible", fViewer
-                .testFindItem(newElement));
-    }
-
-    public void testInsertSiblingReveal() {
-        TestElement newElement = fRootElement.addChild(TestModelChange.INSERT
-                | TestModelChange.REVEAL);
-        assertNotNull("new sibling is visible", fViewer
-                .testFindItem(newElement));
-    }
-
-    public void testInsertSiblings() {
-        TestElement[] newElements = fRootElement
-                .addChildren(TestModelChange.INSERT);
-        processEvents();
-        for (int i = 0; i < newElements.length; ++i)
-            assertNotNull("new siblings are visible", fViewer
-                    .testFindItem(newElements[i]));
-    }
-
-    public void testInsertSiblingSelectExpanded() {
-        TestElement newElement = fRootElement.addChild(TestModelChange.INSERT
-                | TestModelChange.REVEAL | TestModelChange.SELECT);
-        processEvents();
-        assertNotNull("new sibling is visible", fViewer
-                .testFindItem(newElement));
-        assertSelectionEquals("new element is selected", newElement);
-    }
-
-    public void testInsertSiblingWithFilterFiltered() {
-        fViewer.addFilter(new TestLabelFilter());
-        TestElement newElement = new TestElement(fModel, fRootElement);
-        newElement.setLabel("name-111");
-        fRootElement.addChild(newElement, new TestModelChange(
-                TestModelChange.INSERT | TestModelChange.REVEAL
-                        | TestModelChange.SELECT, fRootElement, newElement));
-        assertNull("new sibling is not visible", fViewer
-                .testFindItem(newElement));
-        assertTrue(getItemCount() == 5);
-    }
-
-    public void testInsertSiblingWithFilterNotFiltered() {
-        fViewer.addFilter(new TestLabelFilter());
-        TestElement newElement = new TestElement(fModel, fRootElement);
-        newElement.setLabel("name-222");
-        fRootElement.addChild(newElement, new TestModelChange(
-                TestModelChange.INSERT | TestModelChange.REVEAL
-                        | TestModelChange.SELECT, fRootElement, newElement));
-        assertNotNull("new sibling is visible", fViewer
-                .testFindItem(newElement));
-        assertTrue(getItemCount() == 6);
-    }
-
-    public void testInsertSiblingWithSorter() {
-        fViewer.setSorter(new TestLabelSorter());
-        TestElement newElement = new TestElement(fModel, fRootElement);
-        newElement.setLabel("name-9999");
-        fRootElement.addChild(newElement, new TestModelChange(
-                TestModelChange.INSERT | TestModelChange.REVEAL
-                        | TestModelChange.SELECT, fRootElement, newElement));
-        String newLabel = newElement.toString();
-        assertEquals("sorted first", newLabel, getItemText(0));
-        assertSelectionEquals("new element is selected", newElement);
-    }
-
-    public void testLabelProvider() {
-        // BUG: non-polymorphic behaviour
-        // if (fViewer instanceof TableViewer || fViewer instanceof TableTreeViewer)
-        // 	return;
-        fViewer.setLabelProvider(getTestLabelProvider());
-        TestElement first = fRootElement.getFirstChild();
-        String newLabel = providedString(first);
-        assertEquals("rendered label", newLabel, getItemText(0));
-    }
-
-    /**
-     * @return IBaseLabelProvder used in this test
-     */
-    public IBaseLabelProvider getTestLabelProvider() {
-        return new TestLabelProvider();
-    }
-
-    public void testLabelProviderStateChange() {
-        // BUG: non-polymorphic behaviour
-        // if (fViewer instanceof TableViewer || fViewer instanceof TableTreeViewer)
-        // 	return;
-        TestLabelProvider provider = new TestLabelProvider();
-        fViewer.setLabelProvider(provider);
-        provider.setSuffix("added suffix");
-        TestElement first = fRootElement.getFirstChild();
-        String newLabel = providedString(first);
-        assertEquals("rendered label", newLabel, getItemText(0));
-    }
-
-    public void testRename() {
-        TestElement first = fRootElement.getFirstChild();
-        String newLabel = first.getLabel() + " changed";
-        first.setLabel(newLabel);
-        assertEquals("changed label", first.getID() + " " + newLabel,
-                getItemText(0));
-    }
-
-    public void testRenameWithFilter() {
-        fViewer.addFilter(new TestLabelFilter());
-        TestElement first = fRootElement.getFirstChild();
-        first.setLabel("name-1111"); // should disappear
-        assertNull("changed sibling is not visible", fViewer
-                .testFindItem(first));
-        first.setLabel("name-2222"); // should reappear
-        fViewer.refresh();
-        assertNotNull("changed sibling is not visible", fViewer
-                .testFindItem(first));
-    }
-
-    public void testRenameWithLabelProvider() {
-        if (fViewer instanceof TableViewer
-                || fViewer instanceof TableTreeViewer)
-            return;
-        fViewer.setLabelProvider(new TestLabelProvider());
-        TestElement first = fRootElement.getFirstChild();
-        first.setLabel("changed name");
-        String newLabel = providedString(first);
-        assertEquals("rendered label", newLabel, getItemText(0));
-    }
-
-    public void testRenameWithSorter() {
-        fViewer.setSorter(new TestLabelSorter());
-        TestElement first = fRootElement.getFirstChild();
-        first.setLabel("name-9999");
-        String newElementLabel = first.toString();
-        assertEquals("sorted first", newElementLabel, getItemText(0));
-    }
-
-    public void testSetInput() {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement firstfirst = first.getFirstChild();
-
-        fRootElement = first;
-        setInput();
-        processEvents();
-        assertNotNull("first child is visible", fViewer
-                .testFindItem(firstfirst));
-    }
-
-    public void testSetSelection() {
-        TestElement first = fRootElement.getFirstChild();
-        StructuredSelection selection = new StructuredSelection(first);
-        fViewer.setSelection(selection);
-        IStructuredSelection result = (IStructuredSelection) fViewer
-                .getSelection();
-        assertTrue(result.size() == 1);
-        assertTrue(result.getFirstElement() == first);
-    }
-
-    public void testSomeChildrenChanged() {
-		bulkChange(new TestModelChange(TestModelChange.STRUCTURE_CHANGE,
-				fRootElement));
-    }
-
-    public void testSorter() {
-        TestElement first = fRootElement.getFirstChild();
-        TestElement last = fRootElement.getLastChild();
-        int size = fRootElement.getChildCount();
-
-        String firstLabel = first.toString();
-        String lastLabel = last.toString();
-        assertEquals("unsorted", firstLabel, getItemText(0));
-        assertEquals("unsorted", lastLabel, getItemText(size - 1));
-        fViewer.setSorter(new TestLabelSorter());
-        assertEquals("reverse sorted", firstLabel, getItemText(size - 1));
-        assertEquals("reverse sorted", lastLabel, getItemText(0));
-
-        fViewer.setSorter(null);
-        assertEquals("unsorted", firstLabel, getItemText(0));
-        assertEquals("unsorted", lastLabel, getItemText(size - 1));
-    }
-
-    public void testWorldChanged() {
-		bulkChange(new TestModelChange(TestModelChange.STRUCTURE_CHANGE, null));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StyledStringBuilderTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StyledStringBuilderTest.java
deleted file mode 100644
index 384629d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/StyledStringBuilderTest.java
+++ /dev/null
@@ -1,798 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.graphics.TextStyle;
-
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.jface.viewers.StyledString.Styler;
-
-public class StyledStringBuilderTest extends TestCase {
-	
-	public static class TestStyler extends Styler {
-		
-		public final int borderStyle;
-
-		public TestStyler(int borderStyle) {
-			this.borderStyle= borderStyle;
-		}
-		
-		public void applyStyles(TextStyle textStyle) {
-			textStyle.borderStyle= borderStyle;
-		}
-	}
-	
-	public static final TestStyler STYLER1= new TestStyler(SWT.BORDER_DOT);
-	public static final TestStyler STYLER2= new TestStyler(SWT.BORDER_DASH);
-	
-	
-	public static Test allTests() {
-		return new TestSuite(StyledStringBuilderTest.class);
-	}
-
-	public static Test suite() {
-		return allTests();
-	}
-	
-	public void testEmpty() {
-		StyledString styledString= new StyledString();
-		
-		String str= "";
-		
-		assertEquals(str.length(), styledString.length());
-		assertEquals(str, styledString.getString());
-		assertEquals(styledString.getStyleRanges().length, 0);
-	}
-	
-	public void testAppendString1() {
-		StyledString styledString= new StyledString();
-		
-		String str= "Hello";
-		
-		styledString.append(str, STYLER1);
-		
-		assertEquals(str.length(), styledString.length());
-		assertEquals(str, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		
-		assertEquals(styleRanges[0], STYLER1, 0, str.length());
-	}
-	
-	public void testAppendString2() {
-		StyledString styledString= new StyledString();
-		
-		String str1= "Hello";
-		String str2= "You";
-		styledString.append(str1);
-		styledString.append(str2, STYLER1);
-		
-		String res= str1 + str2;
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, str1.length(), str2.length());
-	}
-	
-	public void testAppendString3() {
-		StyledString styledString= new StyledString();
-		
-		String str1= "Hello";
-		String str2= "You";
-		styledString.append(str1, STYLER1);
-		styledString.append(str2);
-		
-		String res= str1 + str2;
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, 0, str1.length());
-	}
-	
-	public void testAppendString4() {
-		StyledString styledString= new StyledString();
-		
-		String str1= "Hello";
-		String str2= "You";
-		styledString.append(str1);
-		styledString.append(str2, STYLER1);
-		styledString.append(str2, STYLER1);
-		
-		String res= str1 + str2 + str2;
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, str1.length(), str2.length() * 2);
-	}
-	
-	public void testAppendString5() {
-		StyledString styledString= new StyledString();
-		
-		String str1= "Hello";
-		String str2= "You";
-		String str3= "Me";
-		styledString.append(str1);
-		styledString.append(str2, STYLER1);
-		styledString.append(str3, STYLER2);
-		
-		String res= str1 + str2 + str3;
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(2, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, str1.length(), str2.length());
-		assertEquals(styleRanges[1], STYLER2, str1.length() + str2.length(), str3.length());
-	}
-	
-	public void testAppendString6() {
-		StyledString styledString= new StyledString();
-		
-		String str1= "Hello";
-		String str2= "You";
-		String str3= "Me";
-		styledString.append(str1, STYLER1);
-		styledString.append(str2);
-		styledString.append(str3, STYLER2);
-		
-		String res= str1 + str2 + str3;
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(2, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, 0, str1.length());
-		assertEquals(styleRanges[1], STYLER2, str1.length() + str2.length(), str3.length());
-	}
-	
-	public void testAppendString7() {
-		StyledString styledString= new StyledString();
-		
-		String str1= "Hello";
-		String str2= "";
-		String str3= "Me";
-		styledString.append(str1, STYLER1);
-		styledString.append(str2, STYLER2);
-		styledString.append(str3, STYLER1);
-		
-		String res= str1 + str2 + str3;
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, 0, res.length());
-	}
-	
-	public void testAppendChar1() {
-		StyledString styledString= new StyledString();
-		
-		styledString.append('H', STYLER1);
-		styledString.append('2', STYLER2);
-		styledString.append('O', STYLER1);
-		
-		String res= "H2O";
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(3, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, 0, 1);
-		assertEquals(styleRanges[1], STYLER2, 1, 1);
-		assertEquals(styleRanges[2], STYLER1, 2, 1);
-	}
-	
-	public void testAppendChar2() {
-		StyledString styledString= new StyledString();
-		
-		styledString.append('H', STYLER1);
-		styledString.append('2');
-		styledString.append('O', STYLER2);
-		
-		String res= "H2O";
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(2, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, 0, 1);
-		assertEquals(styleRanges[1], STYLER2, 2, 1);
-	}
-	
-	public void testAppendStyledString1() {
-		StyledString other= new StyledString();
-		
-		String str2= "You";
-		String str3= "Me";
-		other.append(str2, STYLER1);
-		other.append(str3, STYLER2);
-		
-		String str1= "We";
-		
-		StyledString styledString= new StyledString(str1);
-		styledString.append(other);
-		
-		String res= str1 + str2 + str3;
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(2, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, str1.length(), str2.length());
-		assertEquals(styleRanges[1], STYLER2, str1.length() + str2.length(), str3.length());
-	}
-	
-	public void testAppendStyledString2() {
-		StyledString other= new StyledString();
-		
-		String str2= "You";
-		String str3= "Me";
-		other.append(str2, STYLER1);
-		other.append(str3, STYLER2);
-		
-		String str1= "We";
-		
-		StyledString styledString= new StyledString(str1, STYLER1);
-		styledString.append(other);
-		
-		String res= str1 + str2 + str3;
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(2, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, 0, str1.length() + str2.length());
-		assertEquals(styleRanges[1], STYLER2, str1.length() + str2.length(), str3.length());
-	}
-	
-	public void testAppendStyledString3() {
-		
-		StyledString other= new StyledString();
-		
-		String str2= "You";
-		String str3= "Me";
-		other.append(str2);
-		other.append(str3, STYLER2);
-		
-		String str1= "We";
-		
-		StyledString styledString= new StyledString(str1, STYLER1);
-		styledString.append(other);
-		
-		String res= str1 + str2 + str3;
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(2, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, 0, str1.length());
-		assertEquals(styleRanges[1], STYLER2, str1.length() + str2.length(), str3.length());
-	}
-	
-	public void testAppendStyledString4() {
-		
-		StyledString other= new StyledString();
-		
-		String str2= "You";
-		String str3= "Me";
-		other.append(str2, STYLER2);
-		other.append(str3);
-		
-		String str1= "We";
-		
-		StyledString styledString= new StyledString(str1, STYLER1);
-		styledString.append(other);
-		
-		String res= str1 + str2 + str3;
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(2, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, 0, str1.length());
-		assertEquals(styleRanges[1], STYLER2, str1.length(), str2.length());
-	}
-	
-	public void testAppendStyledString5() {
-		StyledString other= new StyledString();
-		
-		String str2= "You";
-		String str3= "Me";
-		other.append(str2);
-		other.append(str3, STYLER1);
-		
-		String str1= "We";
-		
-		StyledString styledString= new StyledString(str1);
-		styledString.append(other);
-		
-		String res= str1 + str2 + str3;
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, str1.length() +  str2.length(), str3.length());
-	}
-	
-	public void testSetStyle1() {
-		String str1= "One";
-		String str2= "Two";
-		String str3= "Three";
-		
-		String res= str1 + str2 + str3;
-		
-		StyledString styledString= new StyledString();
-		styledString.append(res);
-		
-		styledString.setStyle(0, str1.length(), STYLER1);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, 0, str1.length());
-	}
-	
-	public void testSetStyle2() {
-		
-		String str1= "One";
-		String str2= "Two";
-		String str3= "Three";
-		
-		String res= str1 + str2 + str3;
-		
-		StyledString styledString= new StyledString();
-		styledString.append(res);
-		
-		styledString.setStyle(str1.length(), str2.length(), STYLER1);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, str1.length(), str2.length());
-	}
-	
-	public void testSetStyle3() {
-		
-		String str1= "One";
-		String str2= "Two";
-		String str3= "Three";
-		
-		String res= str1 + str2 + str3;
-		
-		StyledString styledString= new StyledString();
-		styledString.append(res);
-		
-		styledString.setStyle(str1.length(), res.length() - str1.length(), STYLER1);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, str1.length(), res.length() - str1.length());
-	}
-	
-	public void testSetStyle4() {
-		
-		String str1= "One";
-		String str2= "Two";
-		String str3= "Three";
-		
-		String res= str1 + str2 + str3;
-		
-		StyledString styledString= new StyledString();
-		styledString.append(res);
-		
-		styledString.setStyle(0, res.length(), STYLER1);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, 0, res.length());
-	}
-	
-	public void testSetStyle5() {
-		
-		String str1= "One";
-		String str2= "Two";
-		String str3= "Three";
-		
-		String res= str1 + str2 + str3;
-		
-		StyledString styledString= new StyledString();
-		styledString.append(res);
-		
-		styledString.setStyle(0, res.length(), null);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(0, styleRanges.length);
-	}
-	
-	public void testSetStyle6() {
-		
-		String str1= "One";
-		String str2= "Two";
-		
-		String res= str1 + str2;
-		
-		StyledString styledString= new StyledString(str1, STYLER1);
-		styledString.append(str2);
-		
-		styledString.setStyle(str1.length(), str2.length(), STYLER2);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(2, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER1, 0, str1.length());
-		assertEquals(styleRanges[1], STYLER2, str1.length(), str2.length());
-	}
-	
-	public void testSetStyle7() {
-		
-		String str1= "One";
-		String str2= "Two";
-		
-		String res= str1 + str2;
-		
-		StyledString styledString= new StyledString(str1);
-		styledString.append(str2, STYLER1);
-		
-		styledString.setStyle(0, str1.length(), STYLER2);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(2, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER2, 0, str1.length());
-		assertEquals(styleRanges[1], STYLER1, str1.length(), str2.length());
-	}
-	
-	public void testSetStyle8() {
-		
-		String str1= "One";
-		String str2= "Two";
-		
-		String res= str1 + str2;
-		
-		StyledString styledString= new StyledString();
-		styledString.append(str1, STYLER1);
-		styledString.append(str2, STYLER2);
-		
-		styledString.setStyle(0, str1.length(), STYLER2);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		assertEquals(styleRanges[0], STYLER2, 0, res.length());
-	}
-	
-	public void testSetStyle9() {
-		
-		String str1= "One";
-		String str2= "Two";
-		
-		String res= str1 + str2;
-		
-		StyledString styledString= new StyledString();
-		styledString.append(str1, STYLER1);
-		styledString.append(str2, STYLER2);
-		
-		styledString.setStyle(0, res.length(), null);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(0, styleRanges.length);
-	}
-	
-	public void testSetStyle10() {
-		
-		String str1= "One";
-		String str2= "Two";
-		
-		String res= str1 + str2;
-		
-		StyledString styledString= new StyledString();
-		styledString.append(str1, STYLER1);
-		styledString.append(str2, STYLER2);
-		
-		styledString.setStyle(1, res.length() - 2, null);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(2, styleRanges.length);
-		
-		assertEquals(styleRanges[0], STYLER1, 0, 1);
-		assertEquals(styleRanges[1], STYLER2, res.length() - 1, 1);
-	}
-	
-	public void testSetStyle11() {
-		
-		String str1= "One";
-		String str2= "Two";
-		
-		String res= str1 + str2;
-		
-		StyledString styledString= new StyledString();
-		styledString.append(str1, STYLER1);
-		styledString.append(str2, STYLER2);
-		
-		styledString.setStyle(1, res.length() - 1, STYLER1);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		
-		assertEquals(styleRanges[0], STYLER1, 0, res.length());
-	}
-	
-	public void testSetStyle12() {
-		
-		String str1= "One";
-		String str2= "Two";
-		
-		String res= str1 + str2;
-		
-		StyledString styledString= new StyledString();
-		styledString.append(str1, STYLER1);
-		styledString.append(str2, STYLER2);
-		
-		styledString.setStyle(0, res.length() - 1, STYLER2);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		
-		assertEquals(styleRanges[0], STYLER2, 0, res.length());
-	}
-	
-	public void testSetStyle13() {
-		
-		String str1= "One";
-		String str2= "Two";
-		
-		String res= str1 + str2;
-		
-		StyledString styledString= new StyledString();
-		styledString.append(str1, STYLER1);
-		styledString.append(str2, STYLER2);
-		
-		styledString.setStyle(1, res.length() - 2, STYLER1);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(2, styleRanges.length);
-		
-		assertEquals(styleRanges[0], STYLER1, 0, res.length() - 1);
-		assertEquals(styleRanges[1], STYLER2, res.length() - 1, 1);
-	}
-	
-	public void testSetStyle14() {
-		
-		String str1= "One";
-		String str2= "Two";
-		
-		String res= str1 + str2;
-		
-		StyledString styledString= new StyledString();
-		styledString.append(str1, STYLER1);
-		styledString.append(str2, STYLER2);
-		
-		styledString.setStyle(1, res.length() - 2, STYLER2);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(2, styleRanges.length);
-		
-		assertEquals(styleRanges[0], STYLER1, 0, 1);
-		assertEquals(styleRanges[1], STYLER2, 1, res.length() - 1);
-	}
-	
-	public void testSetStyle15() {
-		
-		String str1= "One";
-		String str2= "Two";
-		
-		String res= str1 + str2;
-		
-		StyledString styledString= new StyledString();
-		styledString.append(str1, null);
-		styledString.append(str2, STYLER2);
-		
-		styledString.setStyle(0, 1, STYLER1);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(2, styleRanges.length);
-		
-		assertEquals(styleRanges[0], STYLER1, 0, 1);
-		assertEquals(styleRanges[1], STYLER2, str1.length(), str2.length());
-	}
-	
-	public void testSetStyle16() {
-				
-		String res= "H2O";
-		
-		StyledString styledString= new StyledString();
-		styledString.append('H', null);
-		styledString.append('2', STYLER1);
-		styledString.append('O', STYLER2);
-		
-		styledString.setStyle(0, res.length(), STYLER1);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		
-		assertEquals(styleRanges[0], STYLER1, 0, res.length());
-	}
-	
-	public void testSetStyle17() {
-		
-		String res= "H2O";
-		
-		StyledString styledString= new StyledString();
-		styledString.append('H', null);
-		styledString.append('2', STYLER1);
-		styledString.append('O', STYLER2);
-		
-		styledString.setStyle(0, res.length(), null);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(0, styleRanges.length);
-	}
-	
-	public void testSetStyle18() {
-		String res= "H2OH2O";
-		
-		StyledString styledString= new StyledString();
-		styledString.append('H', null);
-		styledString.append('2', STYLER1);
-		styledString.append('O', STYLER2);
-		styledString.append('H', null);
-		styledString.append('2', STYLER2);
-		styledString.append('O', STYLER1);
-		
-		styledString.setStyle(1, res.length() - 2, STYLER1);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		
-		assertEquals(styleRanges[0], STYLER1, 1, res.length() - 1);
-	}
-	
-	public void testSetStyle19() {
-		String res= "O2O2O2O2O2O2";
-		
-		StyledString styledString= new StyledString();
-		styledString.append("O2", null);
-		styledString.append("O2", STYLER1);
-		styledString.append("O2", STYLER2);
-		styledString.append("O2", STYLER1);
-		styledString.append("O2", STYLER2);
-		styledString.append("O2", null);
-		
-		styledString.setStyle(1, res.length() - 2, STYLER1);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		
-		assertEquals(styleRanges[0], STYLER1, 1, res.length() - 2);
-	}
-	
-	public void testSetStyle20() {
-		String res= "O2O2O2O2O2O2";
-		
-		StyledString styledString= new StyledString();
-		styledString.append("O2", null);
-		styledString.append("O2", STYLER1);
-		styledString.append("O2", STYLER2);
-		styledString.append("O2", STYLER1);
-		styledString.append("O2", STYLER2);
-		styledString.append("O2", null);
-		
-		styledString.setStyle(3, 6, null);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(2, styleRanges.length);
-		
-		assertEquals(styleRanges[0], STYLER1, 2, 1);
-		assertEquals(styleRanges[1], STYLER2, 9, 1);
-	}
-	
-	public void testSetStyle21() {
-		String res= "O2O2O2O2O2O2";
-		
-		StyledString styledString= new StyledString();
-		styledString.append("O2", null);
-		styledString.append("O2", STYLER1);
-		styledString.append("O2", STYLER2);
-		styledString.append("O2", STYLER1);
-		styledString.append("O2", STYLER2);
-		styledString.append("O2", null);
-		
-		styledString.setStyle(3, 6, STYLER1);
-		styledString.setStyle(3, 6, null);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(2, styleRanges.length);
-		
-		assertEquals(styleRanges[0], STYLER1, 2, 1);
-		assertEquals(styleRanges[1], STYLER2, 9, 1);
-	}
-	
-	public void testCombination1() {
-		String str1= "One";
-		String str2= "Two";
-		
-		String res= str1 + str2 + str1;
-		
-		StyledString styledString= new StyledString();
-		styledString.append(str1, null);
-		styledString.append(str2, STYLER2);
-		
-		styledString.setStyle(str1.length(), str2.length(), STYLER1);
-		
-		styledString.append(str1, STYLER1);
-		
-		assertEquals(res.length(), styledString.length());
-		assertEquals(res, styledString.getString());
-		StyleRange[] styleRanges= styledString.getStyleRanges();
-		assertEquals(1, styleRanges.length);
-		
-		assertEquals(styleRanges[0], STYLER1, str1.length(), str2.length() + str1.length());
-	}
-	
-	
-	private void assertEquals(StyleRange range, TestStyler style, int offset, int length) {
-		assertEquals(offset, range.start);
-		assertEquals(length, range.length);
-		assertEquals(style.borderStyle, range.borderStyle);
-	}
-	
-	
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableColorProviderTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableColorProviderTest.java
deleted file mode 100644
index 70b8e32..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableColorProviderTest.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Initial implementation - Gunnar Ahlberg (IBS AB, www.ibs.net)
- *     IBM Corporation - further revisions
- *******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.tests.viewers.TableViewerTest.TableTestLabelProvider;
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.ITableColorProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * The TableColorProviderTest is a test suite designed to test 
- * ITableColorProviders.
- */
-public class TableColorProviderTest extends StructuredViewerTest {
-    Color red = null;
-
-    Color green = null;
-
-    /**
-     * Create a new instance of the receiver
-     * @param name
-     */
-    public TableColorProviderTest(String name) {
-        super(name);
-    }
-
-    /**
-     *  Test with a standard color provider.
-     */
-    public void testColorProviderForeground() {
-        TableViewer viewer = (TableViewer) fViewer;
-        ColorViewLabelProvider provider = new ColorViewLabelProvider();
-        
-        viewer.setLabelProvider(provider);
-
-        //refresh so that the colors are set
-        fViewer.refresh();
-
-        assertEquals("foreground 1 green", viewer.getTable().getItem(0).getForeground(0), green);//$NON-NLS-1$
-        assertEquals("foreground 2 green", viewer.getTable().getItem(0).getForeground(1), green);//$NON-NLS-1$
-
-        provider.fExtended = false;
-
-    }
-
-    /**
-     * Test that the backgrounds are being set.
-     */
-    public void testColorProviderBackground() {
-        TableViewer viewer = (TableViewer) fViewer;
-        ColorViewLabelProvider provider = new ColorViewLabelProvider();
-        
-        viewer.setLabelProvider(provider);
-        
-        fViewer.refresh();
-
-        assertEquals("background 1 red", viewer.getTable().getItem(0).getBackground(0), red);//$NON-NLS-1$
-        assertEquals("background 2 red", viewer.getTable().getItem(1).getBackground(1), red);//$NON-NLS-1$
-
-        provider.fExtended = false;
-
-    }
-
-    /**
-     * Test that the foregrounds are being set.
-     *
-     */
-    public void testTableItemsColorProviderForeground() {
-        TableViewer viewer = (TableViewer) fViewer;
-        TableColorViewLabelProvider provider = new TableColorViewLabelProvider();
-        
-        viewer.setLabelProvider(provider);
-        Table table = viewer.getTable();
-
-        fViewer.refresh();
-
-        assertEquals("table item 1 green", table.getItem(0).getForeground(0), green);//$NON-NLS-1$
-        assertEquals("table item 2 red", table.getItem(0).getForeground(1), red);//$NON-NLS-1$
-        provider.fExtended = false;
-
-    }
-
-    /**
-     * Test the table item colours.
-     *
-     */
-    public void testTableItemsColorProviderBackground() {
-        TableViewer viewer = (TableViewer) fViewer;
-        TableColorViewLabelProvider provider = new TableColorViewLabelProvider();
-        
-        viewer.setLabelProvider(provider);
-        
-        Table table = viewer.getTable();
-        fViewer.refresh();
-
-        assertEquals("table item 1 background red", table.getItem(0).getBackground(0), red);//$NON-NLS-1$
-        assertEquals("table item 2 background green", table.getItem(0).getBackground(1), green);//$NON-NLS-1$
-        provider.fExtended = false;
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#tearDown()
-     */
-    public void tearDown() {
-        super.tearDown();
-        red.dispose();
-        green.dispose();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#setUp()
-     */
-    public void setUp() {
-        super.setUp();
-        red = new Color(Display.getCurrent(), 255, 0, 0);
-        green = new Color(Display.getCurrent(), 0, 255, 0);
-    }
-
-    /**
-     * Run as a stand alone test
-     * @param args
-     */
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(TableColorProviderTest.class);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#createViewer(org.eclipse.swt.widgets.Composite)
-     */
-    protected StructuredViewer createViewer(Composite parent) {
-        TableViewer viewer = new TableViewer(parent);
-        viewer.setContentProvider(new TestModelContentProvider());
-        
-        viewer.getTable().setLinesVisible(true);
-
-        TableLayout layout = new TableLayout();
-        viewer.getTable().setLayout(layout);
-        viewer.getTable().setHeaderVisible(true);
-        String headers[] = { "column 1 header", "column 2 header" };//$NON-NLS-1$ //$NON-NLS-2$
-
-        ColumnLayoutData layouts[] = { new ColumnWeightData(100),
-                new ColumnWeightData(100) };
-
-        final TableColumn columns[] = new TableColumn[headers.length];
-
-        for (int i = 0; i < headers.length; i++) {
-            layout.addColumnData(layouts[i]);
-            TableColumn tc = new TableColumn(viewer.getTable(), SWT.NONE, i);
-            tc.setResizable(layouts[i].resizable);
-            tc.setText(headers[i]);
-            columns[i] = tc;
-        }
-        return viewer;
-    }
-
-    protected int getItemCount() {
-        TestElement first = fRootElement.getFirstChild();
-        TableItem ti = (TableItem) fViewer.testFindItem(first);
-        Table table = ti.getParent();
-        return table.getItemCount();
-    }
-
-    protected String getItemText(int at) {
-        Table table = (Table) fViewer.getControl();
-        return table.getItem(at).getText();
-    }
-
-    class TableColorViewLabelProvider extends TableTestLabelProvider implements
-            ITableColorProvider {
-
-        public Image getColumnImage(Object obj, int index) {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableColorProvider#getForeground(java.lang.Object, int)
-         */
-        public Color getForeground(Object element, int columnIndex) {
-            switch (columnIndex) {
-            case 0:
-                return green;
-
-            default:
-                return red;
-            }
-        }
-        
-       
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableColorProvider#getBackground(java.lang.Object, int)
-         */
-        public Color getBackground(Object element, int columnIndex) {
-            switch (columnIndex) {
-            case 0:
-                return red;
-            default:
-                return green;
-            }
-        }
-
-    }
-
-    /**
-     * A class to test color providing without coloured columns.
-     */
-    class ColorViewLabelProvider extends TableTestLabelProvider implements IColorProvider{
-    	/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-		 */
-		public Color getBackground(Object element) {
-			return red;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-		 */
-		public Color getForeground(Object element) {
-			return green;
-		}
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableFontProviderTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableFontProviderTest.java
deleted file mode 100644
index 7bfd819..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableFontProviderTest.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.tests.viewers.TableViewerTest.TableTestLabelProvider;
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.ITableFontProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * The TableFontProviderTest is a test suite designed to test
- * ITableFontProviders.
- */
-public class TableFontProviderTest extends StructuredViewerTest {
-	Font font1;
-
-	Font font2;
-	
-
-	/**
-	 * Create a new instance of the receiver
-	 * 
-	 * @param name
-	 */
-	public TableFontProviderTest(String name) {
-		super(name);
-	}
-
-	/**
-	 *  Test the general font provider.
-	 */
-	public void testFontProvider() {
-		TableViewer viewer = (TableViewer) fViewer;
-		
-		FontViewLabelProvider provider = new FontViewLabelProvider();
-		viewer.setLabelProvider(provider);
-
-
-		//refresh so that the colors are set
-		fViewer.refresh();
-
-		compareFontDatas(viewer.getTable().getItem(0).getFont(0), font1);//$NON-NLS-1$
-		compareFontDatas(viewer.getTable().getItem(0).getFont(1), font1);//$NON-NLS-1$
-		
-
-		provider.fExtended = false;
-
-	}
-
-	/**
-	 * Test that the fonts are being set.
-	 *  
-	 */
-	public void testTableItemsFontProvider() {
-		TableViewer viewer = (TableViewer) fViewer;
-
-		TableFontViewLabelProvider provider = new TableFontViewLabelProvider();
-		viewer.setLabelProvider(provider);
-
-		Table table = viewer.getTable();
-
-		fViewer.refresh();
-
-		compareFontDatas(font1, table.getItem(0).getFont(0));//$NON-NLS-1$
-		compareFontDatas(font2,table.getItem(0).getFont(1));//$NON-NLS-1$
-		provider.fExtended = false;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#setUp()
-	 */
-	public void setUp() {
-		super.setUp();
-		font1 = JFaceResources.getFont(JFaceResources.BANNER_FONT);
-		font2 = JFaceResources.getFont(JFaceResources.HEADER_FONT);
-		
-	}
-
-	/**
-	 * Run as a stand alone test
-	 * 
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		junit.textui.TestRunner.run(TableFontProviderTest.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#createViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	protected StructuredViewer createViewer(Composite parent) {
-		TableViewer viewer = new TableViewer(parent);
-		viewer.setContentProvider(new TestModelContentProvider());
-		viewer.getTable().setLinesVisible(true);
-
-		TableLayout layout = new TableLayout();
-		viewer.getTable().setLayout(layout);
-		viewer.getTable().setHeaderVisible(true);
-		String headers[] = { "column 1 header", "column 2 header" };//$NON-NLS-1$ //$NON-NLS-2$
-
-		ColumnLayoutData layouts[] = { new ColumnWeightData(100),
-				new ColumnWeightData(100) };
-
-		final TableColumn columns[] = new TableColumn[headers.length];
-
-		for (int i = 0; i < headers.length; i++) {
-			layout.addColumnData(layouts[i]);
-			TableColumn tc = new TableColumn(viewer.getTable(), SWT.NONE, i);
-			tc.setResizable(layouts[i].resizable);
-			tc.setText(headers[i]);
-			columns[i] = tc;
-		}
-		return viewer;
-	}
-
-	protected int getItemCount() {
-		TestElement first = fRootElement.getFirstChild();
-		TableItem ti = (TableItem) fViewer.testFindItem(first);
-		Table table = ti.getParent();
-		return table.getItemCount();
-	}
-
-	protected String getItemText(int at) {
-		Table table = (Table) fViewer.getControl();
-		return table.getItem(at).getText();
-	}
-	
-	private void compareFontDatas(Font font1, Font font2){
-		
-		FontData[] font1Data = font1.getFontData();
-		FontData[] font2Data = font2.getFontData();
-		
-		assertTrue("Mismatched sizes",font1Data.length == font2Data.length);
-		for (int a = 0; a < font2Data.length; a++) {
-			assertTrue("Mismatched fontData",font1Data[a].equals(font2Data[a]));
-		}
-		
-		
-	}
-
-	class TableFontViewLabelProvider extends TableTestLabelProvider implements
-			ITableFontProvider {
-
-		public Image getColumnImage(Object obj, int index) {
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITableFontProvider#getFont(java.lang.Object,
-		 *      int)
-		 */
-		public Font getFont(Object element, int columnIndex) {
-			switch (columnIndex) {
-			case 0:
-				return font1;
-
-			default:
-				return font2;
-			}
-		}
-
-	}
-
-	/**
-	 * A label provider that does not provide font support entry by entry.
-	 */
-	class FontViewLabelProvider extends TableTestLabelProvider implements
-			IFontProvider {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-		 */
-		public Font getFont(Object element) {
-			return font1;
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableTreeViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableTreeViewerTest.java
deleted file mode 100644
index 7985c18..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableTreeViewerTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableTreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TableTree;
-import org.eclipse.swt.custom.TableTreeItem;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TableColumn;
-
-public class TableTreeViewerTest extends AbstractTreeViewerTest {
-
-    public static class TableTreeTestLabelProvider extends TestLabelProvider
-            implements ITableLabelProvider {
-        public boolean fExtended = false;
-
-        public String getText(Object element) {
-            if (fExtended)
-                return providedString((String) element);
-
-            return element.toString();
-        }
-
-        public String getColumnText(Object element, int index) {
-            if (fExtended)
-                return providedString((TestElement) element);
-            return element.toString();
-        }
-
-        public Image getColumnImage(Object element, int columnIndex) {
-            return null;
-        }
-    }
-
-    public TableTreeViewerTest(String name) {
-        super(name);
-    }
-
-    protected StructuredViewer createViewer(Composite parent) {
-        TableTreeViewer viewer = new TableTreeViewer(parent);
-        viewer.setContentProvider(new TestModelContentProvider());
-        viewer.setLabelProvider(new TableTreeTestLabelProvider());
-        viewer.getTableTree().getTable().setLinesVisible(true);
-
-        TableLayout layout = new TableLayout();
-        viewer.getTableTree().getTable().setLayout(layout);
-        viewer.getTableTree().getTable().setHeaderVisible(true);
-        String headers[] = { "column 1 header", "column 2 header" };
-
-        ColumnLayoutData layouts[] = { new ColumnWeightData(100),
-                new ColumnWeightData(100) };
-
-        final TableColumn columns[] = new TableColumn[headers.length];
-
-        for (int i = 0; i < headers.length; i++) {
-            layout.addColumnData(layouts[i]);
-            TableColumn tc = new TableColumn(viewer.getTableTree().getTable(),
-                    SWT.NONE, i);
-            tc.setResizable(layouts[i].resizable);
-            tc.setText(headers[i]);
-            columns[i] = tc;
-        }
-        fTreeViewer = viewer;
-        return viewer;
-    }
-
-    protected int getItemCount() {
-        TestElement first = fRootElement.getFirstChild();
-        TableTreeItem ti = (TableTreeItem) fViewer.testFindItem(first);
-        TableTree table = ti.getParent();
-        return table.getItemCount();
-    }
-
-    protected int getItemCount(TestElement element) {
-        TableTreeItem ti = (TableTreeItem) fViewer.testFindItem(element);
-        return ti.getItemCount();
-    }
-
-    protected String getItemText(int at) {
-        TableTree table = (TableTree) fViewer.getControl();
-        return table.getItems()[at].getText();
-    }
-
-    public static void main(String args[]) {
-        junit.textui.TestRunner.run(TableTreeViewerTest.class);
-    }
-
-    public void testLabelProvider() {
-        TableTreeViewer viewer = (TableTreeViewer) fViewer;
-        TableTreeTestLabelProvider provider = (TableTreeTestLabelProvider) viewer
-                .getLabelProvider();
-        provider.fExtended = true;
-        // BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
-        fViewer.refresh();
-        TestElement first = fRootElement.getFirstChild();
-        String newLabel = providedString(first);
-        assertEquals("rendered label", newLabel, getItemText(0));
-        provider.fExtended = false;
-        // BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
-        fViewer.refresh();
-    }
-
-    public void testLabelProviderStateChange() {
-        TableTreeViewer viewer = (TableTreeViewer) fViewer;
-        TableTreeTestLabelProvider provider = (TableTreeTestLabelProvider) viewer
-                .getLabelProvider();
-        provider.fExtended = true;
-        provider.setSuffix("added suffix");
-        // BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
-        fViewer.refresh();
-        TestElement first = fRootElement.getFirstChild();
-        String newLabel = providedString(first);
-        assertEquals("rendered label", newLabel, getItemText(0));
-        provider.fExtended = false;
-        // BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
-        fViewer.refresh();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableViewerComparatorTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableViewerComparatorTest.java
deleted file mode 100644
index 57d68a6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableViewerComparatorTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * @since 3.2
- *
- */
-public class TableViewerComparatorTest extends ViewerComparatorTest {
-
-	/**
-	 * @param name
-	 */
-	public TableViewerComparatorTest(String name) {
-		super(name);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.tests.viewers.ViewerTestCase#createViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	protected StructuredViewer createViewer(Composite parent) {
-		TableViewer viewer = new TableViewer(parent);
-		viewer.setContentProvider(new TeamModelContentProvider());
-		viewer.setLabelProvider(new TeamModelLabelProvider());
-		viewer.getTable().setLinesVisible(true);
-
-		TableLayout layout = new TableLayout();
-		viewer.getTable().setLayout(layout);
-		viewer.getTable().setHeaderVisible(true);
-		String headers[] = { "column 1 header", "column 2 header" };
-
-		ColumnLayoutData layouts[] = { new ColumnWeightData(100),
-				new ColumnWeightData(100) };
-
-		final TableColumn columns[] = new TableColumn[headers.length];
-
-		for (int i = 0; i < headers.length; i++) {
-			layout.addColumnData(layouts[i]);
-			TableColumn tc = new TableColumn(viewer.getTable(), SWT.NONE, i);
-			tc.setResizable(layouts[i].resizable);
-			tc.setText(headers[i]);
-			columns[i] = tc;
-		}
-
-		return viewer;
-	}
-	
-	public void testViewerSorter(){
-		fViewer.setSorter(new ViewerSorter());
-		assertSortedResult(TEAM1_SORTED);
-	}
-	
-	public void testViewerSorterInsertElement(){
-		fViewer.setSorter(new ViewerSorter());
-		team1.addMember("Duong");
-		assertSortedResult(TEAM1_SORTED_WITH_INSERT);
-	}
-	
-	public void testViewerComparator(){
-		fViewer.setComparator(new ViewerComparator());
-		assertSortedResult(TEAM1_SORTED);
-	}
-	
-	public void testViewerComparatorInsertElement(){
-		fViewer.setComparator(new ViewerComparator());
-		team1.addMember("Duong");
-		assertSortedResult(TEAM1_SORTED_WITH_INSERT);
-	}
-	
-	private void assertSortedResult(String[] expected){
-		TableItem[] items = getTableViewer().getTable().getItems();
-		for (int i = 0; i < items.length; i++){
-			TableItem item = items[i];
-			assertEquals("Item not expected.  actual=" + item.getText() + " expected=", expected[i], item.getText());
-		}
-	}
-	
-	protected void setInput() {
-		fViewer.setInput(team1);
-	}
-	
-	protected TableViewer getTableViewer(){
-		return (TableViewer)fViewer;
-	}
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		junit.textui.TestRunner.run(TableViewerComparatorTest.class);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableViewerTest.java
deleted file mode 100644
index a146c43..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TableViewerTest.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.lang.reflect.Method;
-
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.ViewerColumn;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-public class TableViewerTest extends StructuredItemViewerTest {
-	public static class TableTestLabelProvider extends TestLabelProvider
-			implements ITableLabelProvider {
-		public boolean fExtended = false;
-
-		public String getText(Object element) {
-			if (fExtended)
-				return providedString((String) element);
-			return element.toString();
-		}
-
-		public String getColumnText(Object element, int index) {
-			if (fExtended)
-				return providedString((TestElement) element);
-			return element.toString();
-		}
-
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-	}
-
-	public TableViewerTest(String name) {
-		super(name);
-	}
-
-	/**
-	 * Creates the viewer used by this test, under the given parent widget.
-	 */
-	protected StructuredViewer createViewer(Composite parent) {
-		TableViewer viewer = createTableViewer(parent);
-		viewer.setContentProvider(getContentProvider());
-		viewer.setLabelProvider(new TableTestLabelProvider());
-		viewer.getTable().setLinesVisible(true);
-
-		TableLayout layout = new TableLayout();
-		viewer.getTable().setLayout(layout);
-		viewer.getTable().setHeaderVisible(true);
-		String headers[] = { "column 1 header", "column 2 header" };
-
-		ColumnLayoutData layouts[] = { new ColumnWeightData(100),
-				new ColumnWeightData(100) };
-
-		final TableColumn columns[] = new TableColumn[headers.length];
-
-		for (int i = 0; i < headers.length; i++) {
-			layout.addColumnData(layouts[i]);
-			TableColumn tc = new TableColumn(viewer.getTable(), SWT.NONE, i);
-			tc.setResizable(layouts[i].resizable);
-			tc.setText(headers[i]);
-			columns[i] = tc;
-		}
-
-		return viewer;
-	}
-	
-	ViewerColumn getViewerColumn(ColumnViewer viewer, int index) {
-		Method method;
-		try {
-			method = ColumnViewer.class.getDeclaredMethod("getViewerColumn", new Class[]{int.class});
-			method.setAccessible(true);
-			return (ViewerColumn) method.invoke(viewer, new Object[]{new Integer(index)});
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-	}
-
-	public void testViewerColumn() {
-    	assertNull(getViewerColumn((TableViewer) fViewer, -1));
-		assertNotNull(getViewerColumn((TableViewer) fViewer, 0));
-		assertNotNull(getViewerColumn((TableViewer) fViewer, 1));
-		assertNull(getViewerColumn((TableViewer) fViewer, 2));
-    }
-	
-	/**
-	 * Get the content provider for the viewer.
-	 * 
-	 * @return IContentProvider
-	 */
-	protected TestModelContentProvider getContentProvider() {
-		return new TestModelContentProvider();
-	}
-
-	/**
-	 * Create the table viewer for the test
-	 * 
-	 * @param parent
-	 * @return
-	 */
-	protected TableViewer createTableViewer(Composite parent) {
-		return new TableViewer(parent);
-	}
-
-	protected int getItemCount() {
-		TestElement first = fRootElement.getFirstChild();
-		TableItem ti = (TableItem) fViewer.testFindItem(first);
-		Table table = ti.getParent();
-		return table.getItemCount();
-	}
-
-	protected String getItemText(int at) {
-		Table table = (Table) fViewer.getControl();
-		return table.getItem(at).getText();
-	}
-
-	public static void main(String args[]) {
-		junit.textui.TestRunner.run(TableViewerTest.class);
-	}
-
-	public void testLabelProvider() {
-
-		TableViewer viewer = (TableViewer) fViewer;
-		TableTestLabelProvider provider = (TableTestLabelProvider) viewer
-				.getLabelProvider();
-
-		provider.fExtended = true;
-		// BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for
-		// LabelProvider changes
-		fViewer.refresh();
-		TestElement first = fRootElement.getFirstChild();
-		String newLabel = providedString(first);
-		assertEquals("rendered label", newLabel, getItemText(0));
-		provider.fExtended = false;
-		// BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for
-		// LabelProvider changes
-	}
-
-	public void testLabelProviderStateChange() {
-		TableViewer tableviewer = (TableViewer) fViewer;
-		TableTestLabelProvider provider = (TableTestLabelProvider) tableviewer
-				.getLabelProvider();
-
-		provider.fExtended = true;
-		provider.setSuffix("added suffix");
-		// BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for
-		// LabelProvider changes
-		tableviewer.refresh();
-		TestElement first = fRootElement.getFirstChild();
-		String newLabel = providedString(first);
-		assertEquals("rendered label", newLabel, getItemText(0));
-		provider.fExtended = false;
-		// BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for
-		// LabelProvider changes
-		fViewer.refresh();
-	}
-
-	public void testRemove() {
-		TableViewer tableviewer = (TableViewer) fViewer;
-		TestElement first = fRootElement.getFirstChild();
-		((TestElement) fViewer.getInput()).deleteChild(first);
-		tableviewer.remove(first);
-		assertTrue("Removed item still exists",
-				fViewer.testFindItem(first) == null);
-
-	}
-
-	
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestComparator.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestComparator.java
deleted file mode 100644
index 1814fce..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestComparator.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.util.Comparator;
-
-/**
- * @since 3.1
- */
-public class TestComparator implements Comparator {
-
-    public volatile int comparisons = 0;
-    
-    /* (non-Javadoc)
-     * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-     */
-    public int compare(Object arg0, Object arg1) {
-        comparisons++;
-
-        return (arg0.toString()).compareTo(arg1.toString());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestElement.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestElement.java
deleted file mode 100644
index 882549a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestElement.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.util.Vector;
-
-public class TestElement implements Cloneable {
-    TestModel fModel;
-
-    TestElement fContainer;
-
-    String fSomeName;
-
-    String fId;
-
-    Vector fChildren = new Vector();
-
-    boolean fIsDeleted = false;
-
-    public static final String P_SOMENAME = "org.eclipse.jface.viewertest.name";
-
-    public static final String P_COLUMN_1 = "org.eclipse.jface.viewertest.column1";
-
-    public TestElement(TestModel model, TestElement container) {
-        fModel = model;
-        fContainer = container;
-        int p = 0;
-        TestElement lastSibling = container.getLastChild();
-        if (lastSibling != null) {
-            p = lastSibling.childId() + 1;
-        }
-        fId = container.getID() + "-" + p;
-    }
-
-    public TestElement(TestModel model, TestElement container, int level,
-            int position) {
-        fModel = model;
-        fContainer = container;
-        if (container != null)
-            fId = container.getID() + "-" + position;
-        else
-            fId = Integer.toString(position);
-        fSomeName = "name-" + position;
-
-        if (level < model.getNumLevels()) {
-            for (int i = 0; i < model.getNumChildren(); i++) {
-                fChildren.add(new TestElement(model, this, level + 1, i));
-            }
-        }
-    }
-
-    public TestElement addChild(int event) {
-        TestElement element = new TestElement(fModel, this);
-        element.fSomeName = "added";
-        addChild(element, new TestModelChange(event, this, element));
-        return element;
-    }
-
-    public TestElement addChild(TestElement element, TestModelChange change) {
-        fChildren.add(element);
-        fModel.fireModelChanged(change);
-        return element;
-    }
-
-    public void addChildren(TestElement[] elements, TestModelChange change) {
-        for (int i = 0; i < elements.length; i++)
-            fChildren.add(elements[i]);
-        fModel.fireModelChanged(change);
-    }
-
-    public TestElement[] addChildren(int event) {
-        TestElement elements[] = new TestElement[] {
-                new TestElement(fModel, this), new TestElement(fModel, this) };
-
-        elements[0].fSomeName = "added1";
-        elements[1].fSomeName = "added2";
-        // change the id of the second element, otherwise there will be
-        // two equal elements under the same parent
-        elements[1].fId += "madeUnique";
-        addChildren(elements, new TestModelChange(event, this, elements));
-        return elements;
-    }
-
-    public TestElement basicAddChild() {
-        TestElement element = new TestElement(fModel, this);
-        element.fSomeName = "added";
-        fChildren.add(element);
-        return element;
-    }
-
-    public void basicDeleteChild(TestElement element) {
-        fChildren.remove(element);
-        element.fIsDeleted = true;
-    }
-
-    private int childId() {
-        String id = fId.substring(fId.lastIndexOf("-") + 1);
-        return Integer.parseInt(id);
-    }
-
-    public Object clone() {
-        try {
-            return super.clone();
-        } catch (CloneNotSupportedException e) {
-            throw new Error(); // should not happen
-        }
-    }
-
-    static public TestElement createModel(int numLevels, int numChildren) {
-        return new TestElement(new TestModel(numLevels, numChildren), null, 0,
-                0);
-    }
-
-    public void deleteChild(TestElement element) {
-        deleteChild(element, new TestModelChange(TestModelChange.REMOVE, this,
-                element));
-    }
-
-    public void deleteChild(TestElement element, TestModelChange change) {
-        basicDeleteChild(element);
-        fModel.fireModelChanged(change);
-    }
-
-    public void deleteChildren() {
-        for (int i = fChildren.size() - 1; i >= 0; i--) {
-            TestElement te = (TestElement) fChildren.elementAt(i);
-            fChildren.remove(te);
-            te.fIsDeleted = true;
-        }
-        fModel.fireModelChanged(new TestModelChange(
-                TestModelChange.STRUCTURE_CHANGE, this));
-    }
-
-    public void deleteSomeChildren() {
-        for (int i = fChildren.size() - 1; i >= 0; i -= 2) {
-            TestElement te = (TestElement) fChildren.elementAt(i);
-            fChildren.remove(te);
-            te.fIsDeleted = true;
-        }
-        fModel.fireModelChanged(new TestModelChange(
-                TestModelChange.STRUCTURE_CHANGE, this));
-    }
-
-    public boolean equals(Object arg) {
-        if (!(arg instanceof TestElement))
-            return false;
-        TestElement element = (TestElement) arg;
-        return element.fId.equals(fId);
-    }
-
-    public TestElement getChildAt(int i) {
-        return (TestElement) fChildren.elementAt(i);
-    }
-
-    public int getChildCount() {
-        return fChildren.size();
-    }
-    
-    /**
-     * Get the children of the receiver.
-     * @return TestElement[]
-     */
-    public TestElement[] getChildren(){
-    	TestElement[] result = new TestElement[fChildren.size()];
-    	fChildren.toArray(result);
-    	return result;    	
-    }
-
-    public TestElement getContainer() {
-        return fContainer;
-    }
-
-    public TestElement getFirstChild() {
-        if (fChildren.size() > 0)
-            return (TestElement) fChildren.elementAt(0);
-        return null;
-    }
-
-    public String getID() {
-        return fId;
-    }
-
-    public String getLabel() {
-        return fSomeName;
-    }
-
-    public TestElement getLastChild() {
-        int size = fChildren.size();
-        if (size > 0)
-            return (TestElement) fChildren.elementAt(size - 1);
-        return null;
-    }
-
-    public TestModel getModel() {
-        return fModel;
-    }
-
-    public int hashCode() {
-        return fId.hashCode();
-    }
-
-    public boolean isDeleted() {
-        return fIsDeleted;
-    }
-
-    public void setLabel(String label) {
-        fSomeName = label;
-        fModel.fireModelChanged(new TestModelChange(
-                TestModelChange.NON_STRUCTURE_CHANGE, this));
-    }
-
-    public boolean testDeleted() {
-        if (fIsDeleted)
-            return true;
-        if (fContainer != null)
-            return fContainer.testDeleted();
-        return false;
-    }
-
-    public String toString() {
-        return getID() + " " + getLabel();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestLabelProvider.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestLabelProvider.java
deleted file mode 100644
index 711b5b2..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestLabelProvider.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-public class TestLabelProvider extends LabelProvider {
-
-    static Image fgImage = null;
-
-    /**
-     *
-     */
-    public static Image getImage() {
-        if (fgImage == null)
-            fgImage = ImageDescriptor.createFromFile(TestLabelProvider.class,
-                    "images/java.gif").createImage();
-        return fgImage;
-    }
-
-    public Image getImage(Object element) {
-        return getImage();
-    }
-
-    public String getText(Object element) {
-        String label = element.toString();
-        return label + " <rendered>";
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestLazyModelContentProvider.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestLazyModelContentProvider.java
deleted file mode 100644
index 4cb3f2b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestLazyModelContentProvider.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import junit.framework.AssertionFailedError;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ILazyContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * The TestLazyModelContentProvider is the lazy version
- * of the model content provider.
- */
-public class TestLazyModelContentProvider extends TestModelContentProvider implements ILazyContentProvider, IContentProvider {
-	
-	TableViewerTest test;
-	TestElement input;
-	
-	TestLazyModelContentProvider(TableViewerTest testObject){
-		test = testObject;
-		if(!(testObject instanceof VirtualLazyTableViewerTest)) {
-			throw new AssertionFailedError("TestLazyModelContentProvider only works with VirtualLazyTableViewerTest");
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILazyContentProvider#updateElements(int, int)
-	 */
-	public void updateElement(int index) {
-		
-		((VirtualLazyTableViewerTest)test).updateElementCalled(index);
-
-		if(input == null)
-			return; //Nothing to update yet
-		
-        ((TableViewer) test.fViewer).replace(input.getChildAt(index), index);
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.tests.viewers.TestModelContentProvider#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.tests.viewers.TestModelContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		input = (TestElement) newInput;
-		((TableViewer)viewer).setItemCount(input==null?0:input.getChildCount());
-		super.inputChanged(viewer, oldInput, newInput);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.tests.viewers.TestModelContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object element) {
-		Assert.isTrue(false,"Should not ever call getElements if lazy");
-		return super.getElements(element);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestModel.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestModel.java
deleted file mode 100644
index 21a8f34..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestModel.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.util.Vector;
-
-public class TestModel {
-    Vector fListeners = new Vector();
-
-    int fNumLevels;
-
-    int fNumChildren;
-
-    public TestModel(int numLevels, int numChildren) {
-        fNumLevels = numLevels;
-        fNumChildren = numChildren;
-    }
-
-    public void addListener(ITestModelListener listener) {
-        fListeners.addElement(listener);
-    }
-
-    /**
-     * Fires a model changed event to all listeners.
-     */
-    public void fireModelChanged(TestModelChange change) {
-        for (int i = 0; i < fListeners.size(); ++i) {
-            ITestModelListener listener = (ITestModelListener) fListeners
-                    .get(i);
-            listener.testModelChanged(change);
-        }
-    }
-
-    public int getNumChildren() {
-        return fNumChildren;
-    }
-
-    public int getNumLevels() {
-        return fNumLevels;
-    }
-
-    public void removeListener(ITestModelListener listener) {
-        fListeners.removeElement(listener);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestModelChange.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestModelChange.java
deleted file mode 100644
index db92b6d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestModelChange.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-public class TestModelChange {
-    private int fKind;
-
-    private TestElement fParent;
-
-    private TestElement[] fChildren;
-
-    public static final int KIND_MASK = 0x0F;
-
-    public static final int INSERT = 1;
-
-    public static final int REMOVE = 2;
-
-    public static final int STRUCTURE_CHANGE = 3;
-
-    public static final int NON_STRUCTURE_CHANGE = 4;
-
-    public static final int REVEAL = 16;
-
-    public static final int SELECT = 32;
-
-    public TestModelChange(int kind, TestElement parent) {
-        this(kind, parent, new TestElement[0]);
-    }
-
-    public TestModelChange(int kind, TestElement parent, TestElement[] children) {
-        fKind = kind;
-        fParent = parent;
-        fChildren = children;
-    }
-
-    public TestModelChange(int kind, TestElement parent, TestElement child) {
-        this(kind, parent, new TestElement[] { child });
-    }
-
-    public TestElement[] getChildren() {
-        return fChildren;
-    }
-
-    public int getKind() {
-        return fKind & KIND_MASK;
-    }
-
-    public int getModifiers() {
-        return fKind & ~KIND_MASK;
-    }
-
-    public TestElement getParent() {
-        return fParent;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestModelContentProvider.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestModelContentProvider.java
deleted file mode 100644
index 3928e64..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestModelContentProvider.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-public class TestModelContentProvider implements ITestModelListener,
-        IStructuredContentProvider, ITreeContentProvider {
-    Viewer fViewer;
-
-    public void dispose() {
-    }
-
-    protected void doInsert(TestModelChange change) {
-        if (fViewer instanceof ListViewer) {
-            if (change.getParent() != null
-                    && change.getParent().equals(fViewer.getInput())) {
-                ((ListViewer) fViewer).add(change.getChildren());
-            }
-        } else if (fViewer instanceof TableViewer) {
-            if (change.getParent() != null
-                    && change.getParent().equals(fViewer.getInput())) {
-                ((TableViewer) fViewer).add(change.getChildren());
-            }
-        } else if (fViewer instanceof AbstractTreeViewer) {
-            ((AbstractTreeViewer) fViewer).add(change.getParent(), change
-                    .getChildren());
-        } else if (fViewer instanceof ComboViewer) {
-            ((ComboViewer) fViewer).add(change.getChildren());
-        } else {
-            Assert.isTrue(false, "Unknown kind of viewer");
-        }
-    }
-
-    protected void doNonStructureChange(TestModelChange change) {
-        if (fViewer instanceof StructuredViewer) {
-            ((StructuredViewer) fViewer).update(change.getParent(),
-                    new String[] { IBasicPropertyConstants.P_TEXT });
-        } else {
-            Assert.isTrue(false, "Unknown kind of viewer");
-        }
-    }
-
-    protected void doRemove(TestModelChange change) {
-        if (fViewer instanceof ListViewer) {
-            ((ListViewer) fViewer).remove(change.getChildren());
-        } else if (fViewer instanceof TableViewer) {
-            ((TableViewer) fViewer).remove(change.getChildren());
-        } else if (fViewer instanceof AbstractTreeViewer) {
-            ((AbstractTreeViewer) fViewer).remove(change.getChildren());
-        } else if (fViewer instanceof ComboViewer) {
-            ((ComboViewer) fViewer).remove(change.getChildren());
-        } else {
-            Assert.isTrue(false, "Unknown kind of viewer");
-        }
-    }
-
-    protected void doStructureChange(TestModelChange change) {
-        if (fViewer instanceof StructuredViewer) {
-            ((StructuredViewer) fViewer).refresh(change.getParent());
-        } else {
-            Assert.isTrue(false, "Unknown kind of viewer");
-        }
-    }
-
-    public Object[] getChildren(Object element) {
-        TestElement testElement = (TestElement) element;
-        int count = testElement.getChildCount();
-        TestElement[] children = new TestElement[count];
-        for (int i = 0; i < count; ++i)
-            children[i] = testElement.getChildAt(i);
-        return children;
-    }
-
-    public Object[] getElements(Object element) {
-        return getChildren(element);
-    }
-
-    public Object getParent(Object element) {
-        return ((TestElement) element).getContainer();
-    }
-
-    public boolean hasChildren(Object element) {
-        return ((TestElement) element).getChildCount() > 0;
-    }
-
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-        fViewer = viewer;
-        TestElement oldElement = (TestElement) oldInput;
-        if (oldElement != null) {
-            oldElement.getModel().removeListener(this);
-        }
-        TestElement newElement = (TestElement) newInput;
-        if (newElement != null) {
-            newElement.getModel().addListener(this);
-        }
-    }
-
-    public boolean isDeleted(Object element) {
-        return ((TestElement) element).isDeleted();
-    }
-
-    public void testModelChanged(TestModelChange change) {
-        switch (change.getKind()) {
-        case TestModelChange.INSERT:
-            doInsert(change);
-            break;
-        case TestModelChange.REMOVE:
-            doRemove(change);
-            break;
-        case TestModelChange.STRUCTURE_CHANGE:
-            doStructureChange(change);
-            break;
-        case TestModelChange.NON_STRUCTURE_CHANGE:
-            doNonStructureChange(change);
-            break;
-        default:
-            throw new IllegalArgumentException("Unknown kind of change");
-        }
-
-        StructuredSelection selection = new StructuredSelection(change
-                .getChildren());
-        if ((change.getModifiers() & TestModelChange.SELECT) != 0) {
-            ((StructuredViewer) fViewer).setSelection(selection);
-        }
-        if ((change.getModifiers() & TestModelChange.REVEAL) != 0) {
-            Object element = selection.getFirstElement();
-            if (element != null) {
-                ((StructuredViewer) fViewer).reveal(element);
-            }
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestModelLazyTreeContentProvider.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestModelLazyTreeContentProvider.java
deleted file mode 100644
index 6d64b60..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TestModelLazyTreeContentProvider.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import junit.framework.Assert;
-
-import org.eclipse.jface.viewers.ILazyTreeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-public class TestModelLazyTreeContentProvider extends TestModelContentProvider
-		implements ILazyTreeContentProvider {
-
-	private final TreeViewer treeViewer;
-
-	public TestModelLazyTreeContentProvider(TreeViewer treeViewer) {
-		this.treeViewer = treeViewer;
-	}
-
-	public void updateElement(Object parent, int index) {
-		TestElement parentElement = (TestElement) parent;
-		if(parentElement.getChildCount() > index) {
-			TestElement childElement = parentElement.getChildAt(index);
-			treeViewer.replace(parent, index, childElement);
-			treeViewer.setChildCount(childElement, childElement.getChildCount());
-		}
-	}
-
-	public Object[] getChildren(Object element) {
-		Assert.fail("should not be called on a LazyTreeContentProvider");
-		return null;
-	}
-
-	public Object[] getElements(Object element) {
-		Assert.fail("should not be called on a LazyTreeContentProvider");
-		return null;
-	}
-
-	public boolean hasChildren(Object element) {
-		Assert.fail("should not be called on a LazyTreeContentProvider");
-		return false;
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput,
-			final Object newInput) {
-		super.inputChanged(viewer, oldInput, newInput);
-	}
-
-	public void updateChildCount(Object element, int currentChildCount) {
-		treeViewer.setChildCount(element, ((TestElement) element).getChildCount());
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TreeManagerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TreeManagerTest.java
deleted file mode 100644
index 288617e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TreeManagerTest.java
+++ /dev/null
@@ -1,654 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ui.internal.dialogs.TreeManager;
-import org.eclipse.ui.internal.dialogs.TreeManager.TreeItem;
-
-public class TreeManagerTest extends TestCase {
-	
-	private static final List STATE_NAMES;
-	
-	private static final int CHECKSTATE_UNCHECKED = 0;
-	private static final int CHECKSTATE_GRAY = 1;
-	private static final int CHECKSTATE_CHECKED = 2;
-	
-	static {
-		STATE_NAMES = new ArrayList();
-		STATE_NAMES.add(CHECKSTATE_UNCHECKED, "unchecked");
-		STATE_NAMES.add(CHECKSTATE_GRAY, "gray");
-		STATE_NAMES.add(CHECKSTATE_CHECKED, "checked");
-	}
-	
-	private static String getName(int checkstate) {
-		return (String)STATE_NAMES.get(checkstate);
-	}
-	
-	private static void assertState(TreeItem item, int expectedState) throws Exception {
-		Field checkStateField = TreeItem.class.getDeclaredField("checkState");
-		checkStateField.setAccessible(true);
-		int checkState = checkStateField.getInt(item);
-				
-		assertEquals("For TreeItem " + item.getLabel() + ", expected " + 
-				getName(expectedState) + " but was " + getName(checkState) + ";",
-				expectedState, checkState);
-	}
-	
-	public void testSingleEntry() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem item = manager.new TreeItem("item");
-		
-		item.setCheckState(true);		
-		assertState(item, CHECKSTATE_CHECKED);
-		
-		item.setCheckState(true);		
-		assertState(item, CHECKSTATE_CHECKED);
-		
-		item.setCheckState(false);		
-		assertState(item, CHECKSTATE_UNCHECKED);
-		
-		item.setCheckState(true);		
-		assertState(item, CHECKSTATE_CHECKED);
-		
-		item.setCheckState(false);		
-		assertState(item, CHECKSTATE_UNCHECKED);
-
-		item.setCheckState(false);		
-		assertState(item, CHECKSTATE_UNCHECKED);
-	}
-	
-	public void testSingleChildAffectsParent() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem parent = manager.new TreeItem("parent");
-		TreeItem child = manager.new TreeItem("child");
-		parent.addChild(child);
-		
-		child.setCheckState(true);
-		assertState(parent, CHECKSTATE_CHECKED);
-		assertState(child, CHECKSTATE_CHECKED);
-		
-		child.setCheckState(true);
-		assertState(parent, CHECKSTATE_CHECKED);
-		assertState(child, CHECKSTATE_CHECKED);
-		
-		child.setCheckState(false);
-		assertState(parent, CHECKSTATE_UNCHECKED);
-		assertState(child, CHECKSTATE_UNCHECKED);
-		
-		child.setCheckState(true);
-		assertState(parent, CHECKSTATE_CHECKED);
-		assertState(child, CHECKSTATE_CHECKED);
-		
-		child.setCheckState(false);
-		assertState(parent, CHECKSTATE_UNCHECKED);
-		assertState(child, CHECKSTATE_UNCHECKED);
-		
-		child.setCheckState(false);
-		assertState(parent, CHECKSTATE_UNCHECKED);
-		assertState(child, CHECKSTATE_UNCHECKED);
-	}
-	
-	public void testTwoChildrenAffectParent() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem parent = manager.new TreeItem("parent");
-		TreeItem son = manager.new TreeItem("son");
-		TreeItem daughter = manager.new TreeItem("daughter");
-		parent.addChild(son);
-		parent.addChild(daughter);
-		
-		son.setCheckState(true);
-		daughter.setCheckState(false);
-		assertState(parent, CHECKSTATE_GRAY);
-		assertState(son, CHECKSTATE_CHECKED);
-		assertState(daughter, CHECKSTATE_UNCHECKED);
-		
-		daughter.setCheckState(true);
-		assertState(parent, CHECKSTATE_CHECKED);
-		assertState(son, CHECKSTATE_CHECKED);
-		assertState(daughter, CHECKSTATE_CHECKED);
-		
-		son.setCheckState(false);
-		assertState(parent, CHECKSTATE_GRAY);
-		assertState(son, CHECKSTATE_UNCHECKED);
-		assertState(daughter, CHECKSTATE_CHECKED);
-		
-		daughter.setCheckState(false);
-		assertState(parent, CHECKSTATE_UNCHECKED);
-		assertState(son, CHECKSTATE_UNCHECKED);
-		assertState(daughter, CHECKSTATE_UNCHECKED);
-	}
-	
-	public void testCheckUncheckChildAt3Deep() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem grandparent = manager.new TreeItem("grandparent");
-		TreeItem parent = manager.new TreeItem("parent");
-		TreeItem child = manager.new TreeItem("child");
-		grandparent.addChild(parent);
-		parent.addChild(child);
-		
-		child.setCheckState(true);
-		assertState(grandparent, CHECKSTATE_CHECKED);
-		assertState(parent, CHECKSTATE_CHECKED);
-		assertState(child, CHECKSTATE_CHECKED);
-		
-		child.setCheckState(true);
-		assertState(grandparent, CHECKSTATE_CHECKED);
-		assertState(parent, CHECKSTATE_CHECKED);
-		assertState(child, CHECKSTATE_CHECKED);
-		
-		child.setCheckState(false);
-		assertState(grandparent, CHECKSTATE_UNCHECKED);
-		assertState(parent, CHECKSTATE_UNCHECKED);
-		assertState(child, CHECKSTATE_UNCHECKED);
-		
-		child.setCheckState(true);
-		assertState(grandparent, CHECKSTATE_CHECKED);
-		assertState(parent, CHECKSTATE_CHECKED);
-		assertState(child, CHECKSTATE_CHECKED);
-		
-		child.setCheckState(false);
-		assertState(grandparent, CHECKSTATE_UNCHECKED);
-		assertState(parent, CHECKSTATE_UNCHECKED);
-		assertState(child, CHECKSTATE_UNCHECKED);
-		
-		child.setCheckState(false);
-		assertState(grandparent, CHECKSTATE_UNCHECKED);
-		assertState(parent, CHECKSTATE_UNCHECKED);
-		assertState(child, CHECKSTATE_UNCHECKED);
-	}
-	
-	public void testCauseGrayAt3Deep() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem grandparent = manager.new TreeItem("grandparent");
-		TreeItem parent = manager.new TreeItem("parent");
-		TreeItem child1 = manager.new TreeItem("child1");
-		TreeItem child2 = manager.new TreeItem("child2");
-		grandparent.addChild(parent);
-		parent.addChild(child1);
-		parent.addChild(child2);
-		
-		child1.setCheckState(true);
-		child2.setCheckState(false);
-		assertState(grandparent, CHECKSTATE_GRAY);
-		assertState(parent, CHECKSTATE_GRAY);
-		assertState(child1, CHECKSTATE_CHECKED);
-		assertState(child2, CHECKSTATE_UNCHECKED);
-		
-		child2.setCheckState(true);
-		assertState(grandparent, CHECKSTATE_CHECKED);
-		assertState(parent, CHECKSTATE_CHECKED);
-		assertState(child1, CHECKSTATE_CHECKED);
-		assertState(child2, CHECKSTATE_CHECKED);
-		
-		child1.setCheckState(false);
-		assertState(grandparent, CHECKSTATE_GRAY);
-		assertState(parent, CHECKSTATE_GRAY);
-		assertState(child1, CHECKSTATE_UNCHECKED);
-		assertState(child2, CHECKSTATE_CHECKED);
-		
-		child2.setCheckState(false);
-		assertState(grandparent, CHECKSTATE_UNCHECKED);
-		assertState(parent, CHECKSTATE_UNCHECKED);
-		assertState(child1, CHECKSTATE_UNCHECKED);
-		assertState(child2, CHECKSTATE_UNCHECKED);
-	}
-	
-	public void testCheckUncheckChildAt5Deep() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem items[] = new TreeItem[5];
-		for(int i = 0; i < items.length; i++) {
-			items[i] = manager.new TreeItem("item" + i);
-			if(i > 0)
-				items[i-1].addChild(items[i]);
-		}
-		
-		items[4].setCheckState(true);
-		for(int i = 0; i < items.length; i++)
-			assertState(items[i], CHECKSTATE_CHECKED);
-		
-		items[4].setCheckState(false);
-		for(int i = 0; i < items.length; i++)
-			assertState(items[i], CHECKSTATE_UNCHECKED);
-	}
-	
-	public void testCauseGrayAt5Deep() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem items[] = new TreeItem[4];
-		for(int i = 0; i < items.length; i++) {
-			items[i] = manager.new TreeItem("item" + i);
-			if(i > 0)
-				items[i-1].addChild(items[i]);
-		}
-		TreeItem child1 = manager.new TreeItem("child1");
-		TreeItem child2 = manager.new TreeItem("child2");
-		items[3].addChild(child1);
-		items[3].addChild(child2);
-		
-		child1.setCheckState(true);
-		child2.setCheckState(false);
-		for(int i = 0; i < items.length; i++)
-			assertState(items[i], CHECKSTATE_GRAY);
-		assertState(child1, CHECKSTATE_CHECKED);
-		assertState(child2, CHECKSTATE_UNCHECKED);
-		
-		child2.setCheckState(true);
-		for(int i = 0; i < items.length; i++)
-			assertState(items[i], CHECKSTATE_CHECKED);
-		assertState(child1, CHECKSTATE_CHECKED);
-		assertState(child2, CHECKSTATE_CHECKED);
-		
-		child1.setCheckState(false);
-		for(int i = 0; i < items.length; i++)
-			assertState(items[i], CHECKSTATE_GRAY);
-		assertState(child1, CHECKSTATE_UNCHECKED);
-		assertState(child2, CHECKSTATE_CHECKED);
-		
-		child2.setCheckState(false);
-		for(int i = 0; i < items.length; i++)
-			assertState(items[i], CHECKSTATE_UNCHECKED);
-		assertState(child1, CHECKSTATE_UNCHECKED);
-		assertState(child2, CHECKSTATE_UNCHECKED);
-	}
-	
-	public void testChildrenInMultipleBranchesAffectAncestors() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem root = manager.new TreeItem("root");
-		TreeItem itemA = manager.new TreeItem("itemA");
-		TreeItem itemA1 = manager.new TreeItem("itemA1");
-		TreeItem itemA2 = manager.new TreeItem("itemA2");
-		TreeItem itemB = manager.new TreeItem("itemB");
-		TreeItem itemB1 = manager.new TreeItem("itemB1");
-		TreeItem itemB2 = manager.new TreeItem("itemB2");
-		
-		root.addChild(itemA);
-		root.addChild(itemB);
-		itemA.addChild(itemA1);
-		itemA.addChild(itemA2);
-		itemB.addChild(itemB1);
-		itemB.addChild(itemB2);
-		
-		itemA1.setCheckState(true);
-		itemA2.setCheckState(false);
-		itemB1.setCheckState(false);
-		itemB2.setCheckState(false);
-		
-		assertState(root, CHECKSTATE_GRAY);
-		assertState(itemA, CHECKSTATE_GRAY);
-		assertState(itemA1, CHECKSTATE_CHECKED);
-		assertState(itemA2, CHECKSTATE_UNCHECKED);
-		assertState(itemB, CHECKSTATE_UNCHECKED);
-		assertState(itemB1, CHECKSTATE_UNCHECKED);
-		assertState(itemB2, CHECKSTATE_UNCHECKED);
-		
-		itemB2.setCheckState(true);
-		assertState(root, CHECKSTATE_GRAY);
-		assertState(itemA, CHECKSTATE_GRAY);
-		assertState(itemA1, CHECKSTATE_CHECKED);
-		assertState(itemA2, CHECKSTATE_UNCHECKED);
-		assertState(itemB, CHECKSTATE_GRAY);
-		assertState(itemB1, CHECKSTATE_UNCHECKED);
-		assertState(itemB2, CHECKSTATE_CHECKED);
-		
-		itemA1.setCheckState(false);
-		assertState(root, CHECKSTATE_GRAY);
-		assertState(itemA, CHECKSTATE_UNCHECKED);
-		assertState(itemA1, CHECKSTATE_UNCHECKED);
-		assertState(itemA2, CHECKSTATE_UNCHECKED);
-		assertState(itemB, CHECKSTATE_GRAY);
-		assertState(itemB1, CHECKSTATE_UNCHECKED);
-		assertState(itemB2, CHECKSTATE_CHECKED);
-		
-		itemB1.setCheckState(true);
-		assertState(root, CHECKSTATE_GRAY);
-		assertState(itemA, CHECKSTATE_UNCHECKED);
-		assertState(itemA1, CHECKSTATE_UNCHECKED);
-		assertState(itemA2, CHECKSTATE_UNCHECKED);
-		assertState(itemB, CHECKSTATE_CHECKED);
-		assertState(itemB1, CHECKSTATE_CHECKED);
-		assertState(itemB2, CHECKSTATE_CHECKED);
-		
-		itemA1.setCheckState(true);
-		assertState(root, CHECKSTATE_GRAY);
-		assertState(itemA, CHECKSTATE_GRAY);
-		assertState(itemA1, CHECKSTATE_CHECKED);
-		assertState(itemA2, CHECKSTATE_UNCHECKED);
-		assertState(itemB, CHECKSTATE_CHECKED);
-		assertState(itemB1, CHECKSTATE_CHECKED);
-		assertState(itemB2, CHECKSTATE_CHECKED);
-		
-		itemA2.setCheckState(true);
-		assertState(root, CHECKSTATE_CHECKED);
-		assertState(itemA, CHECKSTATE_CHECKED);
-		assertState(itemA1, CHECKSTATE_CHECKED);
-		assertState(itemA2, CHECKSTATE_CHECKED);
-		assertState(itemB, CHECKSTATE_CHECKED);
-		assertState(itemB1, CHECKSTATE_CHECKED);
-		assertState(itemB2, CHECKSTATE_CHECKED);
-		
-		itemB2.setCheckState(false);
-		assertState(root, CHECKSTATE_GRAY);
-		assertState(itemA, CHECKSTATE_CHECKED);
-		assertState(itemA1, CHECKSTATE_CHECKED);
-		assertState(itemA2, CHECKSTATE_CHECKED);
-		assertState(itemB, CHECKSTATE_GRAY);
-		assertState(itemB1, CHECKSTATE_CHECKED);
-		assertState(itemB2, CHECKSTATE_UNCHECKED);
-		
-		itemA1.setCheckState(false);
-		itemA2.setCheckState(false);
-		itemB1.setCheckState(false);
-		assertState(root, CHECKSTATE_UNCHECKED);
-		assertState(itemA, CHECKSTATE_UNCHECKED);
-		assertState(itemA1, CHECKSTATE_UNCHECKED);
-		assertState(itemA2, CHECKSTATE_UNCHECKED);
-		assertState(itemB, CHECKSTATE_UNCHECKED);
-		assertState(itemB1, CHECKSTATE_UNCHECKED);
-		assertState(itemB2, CHECKSTATE_UNCHECKED);
-	}
-	
-	public void testMultipleChildrenInOneBranchAffectParent() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem root = manager.new TreeItem("root");
-		TreeItem items[] = new TreeItem[5];
-		for(int i = 0; i < items.length; i++) {
-			items[i] = manager.new TreeItem("child" + i);
-			root.addChild(items[i]);
-			items[i].setCheckState(false);
-		}
-		
-		items[0].setCheckState(true);
-		assertState(root, CHECKSTATE_GRAY);
-		assertState(items[0], CHECKSTATE_CHECKED);
-		assertState(items[1], CHECKSTATE_UNCHECKED);
-		assertState(items[2], CHECKSTATE_UNCHECKED);
-		assertState(items[3], CHECKSTATE_UNCHECKED);
-		assertState(items[4], CHECKSTATE_UNCHECKED);
-		
-		items[1].setCheckState(true);
-		assertState(root, CHECKSTATE_GRAY);
-		assertState(items[0], CHECKSTATE_CHECKED);
-		assertState(items[1], CHECKSTATE_CHECKED);
-		assertState(items[2], CHECKSTATE_UNCHECKED);
-		assertState(items[3], CHECKSTATE_UNCHECKED);
-		assertState(items[4], CHECKSTATE_UNCHECKED);
-		
-		items[0].setCheckState(false);
-		assertState(root, CHECKSTATE_GRAY);
-		assertState(items[0], CHECKSTATE_UNCHECKED);
-		assertState(items[1], CHECKSTATE_CHECKED);
-		assertState(items[2], CHECKSTATE_UNCHECKED);
-		assertState(items[3], CHECKSTATE_UNCHECKED);
-		assertState(items[4], CHECKSTATE_UNCHECKED);
-		
-		items[2].setCheckState(true);
-		items[3].setCheckState(true);
-		assertState(root, CHECKSTATE_GRAY);
-		assertState(items[0], CHECKSTATE_UNCHECKED);
-		assertState(items[1], CHECKSTATE_CHECKED);
-		assertState(items[2], CHECKSTATE_CHECKED);
-		assertState(items[3], CHECKSTATE_CHECKED);
-		assertState(items[4], CHECKSTATE_UNCHECKED);
-		
-		items[0].setCheckState(true);
-		items[4].setCheckState(true);
-		assertState(root, CHECKSTATE_CHECKED);
-		assertState(items[0], CHECKSTATE_CHECKED);
-		assertState(items[1], CHECKSTATE_CHECKED);
-		assertState(items[2], CHECKSTATE_CHECKED);
-		assertState(items[3], CHECKSTATE_CHECKED);
-		assertState(items[4], CHECKSTATE_CHECKED);
-		
-		items[2].setCheckState(false);
-		assertState(root, CHECKSTATE_GRAY);
-		assertState(items[0], CHECKSTATE_CHECKED);
-		assertState(items[1], CHECKSTATE_CHECKED);
-		assertState(items[2], CHECKSTATE_UNCHECKED);
-		assertState(items[3], CHECKSTATE_CHECKED);
-		assertState(items[4], CHECKSTATE_CHECKED);
-		
-		items[0].setCheckState(false);
-		items[1].setCheckState(false);
-		items[3].setCheckState(false);
-		items[4].setCheckState(false);
-		assertState(root, CHECKSTATE_UNCHECKED);
-		assertState(items[0], CHECKSTATE_UNCHECKED);
-		assertState(items[1], CHECKSTATE_UNCHECKED);
-		assertState(items[2], CHECKSTATE_UNCHECKED);
-		assertState(items[3], CHECKSTATE_UNCHECKED);
-		assertState(items[4], CHECKSTATE_UNCHECKED);
-	}
-	
-	public void testParentAffectsSingleChild() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem parent = manager.new TreeItem("parent");
-		TreeItem child = manager.new TreeItem("child");
-		parent.addChild(child);
-		
-		parent.setCheckState(true);
-		assertState(parent, CHECKSTATE_CHECKED);
-		assertState(child, CHECKSTATE_CHECKED);
-		
-		parent.setCheckState(true);
-		assertState(parent, CHECKSTATE_CHECKED);
-		assertState(child, CHECKSTATE_CHECKED);
-		
-		parent.setCheckState(false);
-		assertState(parent, CHECKSTATE_UNCHECKED);
-		assertState(child, CHECKSTATE_UNCHECKED);
-		
-		parent.setCheckState(true);
-		assertState(parent, CHECKSTATE_CHECKED);
-		assertState(child, CHECKSTATE_CHECKED);
-		
-		parent.setCheckState(false);
-		assertState(parent, CHECKSTATE_UNCHECKED);
-		assertState(child, CHECKSTATE_UNCHECKED);
-		
-		parent.setCheckState(false);
-		assertState(parent, CHECKSTATE_UNCHECKED);
-		assertState(child, CHECKSTATE_UNCHECKED);
-	}
-	
-	public void testParentAffectsTwoChildren() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem parent = manager.new TreeItem("parent");
-		TreeItem son = manager.new TreeItem("son");
-		TreeItem daughter = manager.new TreeItem("daughter");
-		parent.addChild(son);
-		parent.addChild(daughter);
-		
-		parent.setCheckState(true);
-		assertState(parent, CHECKSTATE_CHECKED);
-		assertState(son, CHECKSTATE_CHECKED);
-		assertState(daughter, CHECKSTATE_CHECKED);
-		
-		parent.setCheckState(true);
-		assertState(parent, CHECKSTATE_CHECKED);
-		assertState(son, CHECKSTATE_CHECKED);
-		assertState(daughter, CHECKSTATE_CHECKED);
-		
-		parent.setCheckState(false);
-		assertState(parent, CHECKSTATE_UNCHECKED);
-		assertState(son, CHECKSTATE_UNCHECKED);
-		assertState(daughter, CHECKSTATE_UNCHECKED);
-		
-		parent.setCheckState(true);
-		assertState(parent, CHECKSTATE_CHECKED);
-		assertState(son, CHECKSTATE_CHECKED);
-		assertState(daughter, CHECKSTATE_CHECKED);
-		
-		parent.setCheckState(false);
-		assertState(parent, CHECKSTATE_UNCHECKED);
-		assertState(son, CHECKSTATE_UNCHECKED);
-		assertState(daughter, CHECKSTATE_UNCHECKED);
-		
-		parent.setCheckState(false);
-		assertState(parent, CHECKSTATE_UNCHECKED);
-		assertState(son, CHECKSTATE_UNCHECKED);
-		assertState(daughter, CHECKSTATE_UNCHECKED);
-	}
-	
-	public void testParentAffectsMultipleChildrenInOneBranch() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem root = manager.new TreeItem("root");
-		TreeItem items[] = new TreeItem[5];
-		for(int i = 0; i < items.length; i++) {
-			items[i] = manager.new TreeItem("child" + i);
-			root.addChild(items[i]);
-			items[i].setCheckState(false);
-		}
-		
-		root.setCheckState(true);
-		assertState(root, CHECKSTATE_CHECKED);
-		assertState(items[0], CHECKSTATE_CHECKED);
-		assertState(items[1], CHECKSTATE_CHECKED);
-		assertState(items[2], CHECKSTATE_CHECKED);
-		assertState(items[3], CHECKSTATE_CHECKED);
-		assertState(items[4], CHECKSTATE_CHECKED);
-		
-		root.setCheckState(false);
-		assertState(root, CHECKSTATE_UNCHECKED);
-		assertState(items[0], CHECKSTATE_UNCHECKED);
-		assertState(items[1], CHECKSTATE_UNCHECKED);
-		assertState(items[2], CHECKSTATE_UNCHECKED);
-		assertState(items[3], CHECKSTATE_UNCHECKED);
-		assertState(items[4], CHECKSTATE_UNCHECKED);
-	}
-	
-	public void testParentAffectsDescendantsInMultipleBranches() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem root = manager.new TreeItem("root");
-		TreeItem itemA = manager.new TreeItem("itemA");
-		TreeItem itemA1 = manager.new TreeItem("itemA1");
-		TreeItem itemA2 = manager.new TreeItem("itemA2");
-		TreeItem itemB = manager.new TreeItem("itemB");
-		TreeItem itemB1 = manager.new TreeItem("itemB1");
-		TreeItem itemB2 = manager.new TreeItem("itemB2");
-		
-		root.addChild(itemA);
-		root.addChild(itemB);
-		itemA.addChild(itemA1);
-		itemA.addChild(itemA2);
-		itemB.addChild(itemB1);
-		itemB.addChild(itemB2);
-		
-		root.setCheckState(true);
-		assertState(root, CHECKSTATE_CHECKED);
-		assertState(itemA, CHECKSTATE_CHECKED);
-		assertState(itemA1, CHECKSTATE_CHECKED);
-		assertState(itemA2, CHECKSTATE_CHECKED);
-		assertState(itemB, CHECKSTATE_CHECKED);
-		assertState(itemB1, CHECKSTATE_CHECKED);
-		assertState(itemB2, CHECKSTATE_CHECKED);
-		
-		root.setCheckState(false);
-		assertState(root, CHECKSTATE_UNCHECKED);
-		assertState(itemA, CHECKSTATE_UNCHECKED);
-		assertState(itemA1, CHECKSTATE_UNCHECKED);
-		assertState(itemA2, CHECKSTATE_UNCHECKED);
-		assertState(itemB, CHECKSTATE_UNCHECKED);
-		assertState(itemB1, CHECKSTATE_UNCHECKED);
-		assertState(itemB2, CHECKSTATE_UNCHECKED);
-	}
-	
-	public void testCheckUncheckParentWithDescendants5Deep() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem items[] = new TreeItem[5];
-		for(int i = 0; i < items.length; i++) {
-			items[i] = manager.new TreeItem("item" + i);
-			if(i > 0)
-				items[i-1].addChild(items[i]);
-		}
-		
-		items[0].setCheckState(true);
-		for(int i = 0; i < items.length; i++)
-			assertState(items[i], CHECKSTATE_CHECKED);
-		
-		items[0].setCheckState(false);
-		for(int i = 0; i < items.length; i++)
-			assertState(items[i], CHECKSTATE_UNCHECKED);
-	}
-	
-	public void testChangeOnGray() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem root = manager.new TreeItem("root");
-		TreeItem itemA = manager.new TreeItem("itemA");
-		TreeItem itemA1 = manager.new TreeItem("itemA1");
-		TreeItem itemA2 = manager.new TreeItem("itemA2");
-		TreeItem itemB = manager.new TreeItem("itemB");
-		
-		root.addChild(itemA);
-		root.addChild(itemB);
-		itemA.addChild(itemA1);
-		itemA.addChild(itemA2);
-		
-		root.setCheckState(true);
-		assertState(root, CHECKSTATE_CHECKED);
-		assertState(itemA, CHECKSTATE_CHECKED);
-		assertState(itemA1, CHECKSTATE_CHECKED);
-		assertState(itemA2, CHECKSTATE_CHECKED);
-		assertState(itemB, CHECKSTATE_CHECKED);
-		
-		itemA.setCheckState(false);
-		assertState(root, CHECKSTATE_GRAY);
-		assertState(itemA, CHECKSTATE_UNCHECKED);
-		assertState(itemA1, CHECKSTATE_UNCHECKED);
-		assertState(itemA2, CHECKSTATE_UNCHECKED);
-		assertState(itemB, CHECKSTATE_CHECKED);
-		
-		itemA1.setCheckState(true);
-		assertState(root, CHECKSTATE_GRAY);
-		assertState(itemA, CHECKSTATE_GRAY);
-		assertState(itemA1, CHECKSTATE_CHECKED);
-		assertState(itemA2, CHECKSTATE_UNCHECKED);
-		assertState(itemB, CHECKSTATE_CHECKED);
-		
-		itemA.setCheckState(false);
-		assertState(root, CHECKSTATE_GRAY);
-		assertState(itemA, CHECKSTATE_UNCHECKED);
-		assertState(itemA1, CHECKSTATE_UNCHECKED);
-		assertState(itemA2, CHECKSTATE_UNCHECKED);
-		assertState(itemB, CHECKSTATE_CHECKED);
-		
-		itemA.setCheckState(true);
-		assertState(root, CHECKSTATE_CHECKED);
-		assertState(itemA, CHECKSTATE_CHECKED);
-		assertState(itemA1, CHECKSTATE_CHECKED);
-		assertState(itemA2, CHECKSTATE_CHECKED);
-		assertState(itemB, CHECKSTATE_CHECKED);
-	}
-	
-	public void testCheckUncheckItemWithAncestorsAndDescendants() throws Exception {
-		TreeManager manager = new TreeManager();
-		TreeItem items[] = new TreeItem[5];
-		for(int i = 0; i < items.length; i++) {
-			items[i] = manager.new TreeItem("item" + i);
-			if(i > 0)
-				items[i-1].addChild(items[i]);
-		}
-		
-		items[3].setCheckState(true);
-		for(int i = 0; i < items.length; i++)
-			assertState(items[i], CHECKSTATE_CHECKED);
-		
-		items[3].setCheckState(false);
-		for(int i = 0; i < items.length; i++)
-			assertState(items[i], CHECKSTATE_UNCHECKED);
-	}
-	
-	
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TreeSelectionTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TreeSelectionTest.java
deleted file mode 100644
index 0ed53bf..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TreeSelectionTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-
-import junit.framework.TestCase;
-
-/**
- * @since 3.2
- *
- */
-public class TreeSelectionTest extends TestCase {
-	
-	public TreeSelectionTest(String name) {
-		super(name);
-	}
-	
-	public void testBug1384558() {
-		Object one = new Object();
-		Object two = new Object();
-		Object three = new Object();
-		TreePath[] treePaths1 = new TreePath[3];
-		treePaths1[0] = new TreePath(new Object[]{one, two});
-		treePaths1[1] = new TreePath(new Object[]{one, three});
-		treePaths1[2] = new TreePath(new Object[]{two, two});
-		TreeSelection treeSelection1 = new TreeSelection(treePaths1);
-		TreePath[] treePaths2 = new TreePath[2];
-		treePaths2[0] = new TreePath(new Object[]{one, two});
-		treePaths2[1] = new TreePath(new Object[]{one, three});
-		TreeSelection treeSelection2 = new TreeSelection(treePaths2);
-		// before fixing the bug, this threw an AIOOBE:
-		assertFalse(treeSelection1.equals(treeSelection2));
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TreeViewerColumnTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TreeViewerColumnTest.java
deleted file mode 100644
index 22f0bd0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TreeViewerColumnTest.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.lang.reflect.Method;
-
-import org.eclipse.jface.viewers.ColumnViewer;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerColumn;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.swt.widgets.TreeItem;
-
-public class TreeViewerColumnTest extends AbstractTreeViewerTest {
-
-    public static class TableTreeTestLabelProvider extends TestLabelProvider
-            implements ITableLabelProvider {
-        public boolean fExtended = false;
-
-        public String getText(Object element) {
-            if (fExtended)
-                return providedString((String) element);
-
-            return element.toString();
-        }
-
-        public String getColumnText(Object element, int index) {
-            if (fExtended)
-                return providedString((TestElement) element);
-            return element.toString();
-        }
-
-        public Image getColumnImage(Object element, int columnIndex) {
-            return null;
-        }
-    }
-
-    public TreeViewerColumnTest(String name) {
-        super(name);
-    }
-
-    protected StructuredViewer createViewer(Composite parent) {
-        TreeViewer viewer = new TreeViewer(parent);
-        viewer.setContentProvider(new TestModelContentProvider());
-        viewer.setLabelProvider(new TableTreeTestLabelProvider());
-        viewer.getTree().setLinesVisible(true);
-
-        viewer.getTree().setHeaderVisible(true);
-        String headers[] = { "column 1 header", "column 2 header" };
-
-        final TreeColumn columns[] = new TreeColumn[headers.length];
-
-        for (int i = 0; i < headers.length; i++) {
-             TreeColumn tc = new TreeColumn(viewer.getTree(),
-                    SWT.NONE, i);
-            tc.setResizable(true);
-            tc.setText(headers[i]);
-            tc.setWidth(25);
-            columns[i] = tc;
-        }
-        fTreeViewer = viewer;
-        return viewer;
-    }
-    
-    protected int getItemCount() {
-        TestElement first = fRootElement.getFirstChild();
-        TreeItem ti = (TreeItem) fViewer.testFindItem(first);
-         return ti.getParent().getItemCount();
-    }
-
-    protected int getItemCount(TestElement element) {
-        TreeItem ti = (TreeItem) fViewer.testFindItem(element);
-        return ti.getItemCount();
-    }
-
-    protected String getItemText(int at) {
-        return ((Tree) fViewer.getControl()).getItems()[at].getText();
-    }
-
-    public static void main(String args[]) {
-        junit.textui.TestRunner.run(TreeViewerColumnTest.class);
-    }
-
-	private ViewerColumn getViewerColumn(ColumnViewer viewer, int index) {
-		Method method;
-		try {
-			method = ColumnViewer.class.getDeclaredMethod("getViewerColumn", new Class[]{int.class});
-			method.setAccessible(true);
-			return (ViewerColumn) method.invoke(viewer, new Object[]{new Integer(index)});
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-	}
-
-    public void testViewerColumn() {
-    	assertNull(getViewerColumn((TreeViewer) fViewer, -1));
-		assertNotNull(getViewerColumn((TreeViewer) fViewer, 0));
-		assertNotNull(getViewerColumn((TreeViewer) fViewer, 1));
-		assertNull(getViewerColumn((TreeViewer) fViewer, 2));
-    }
-    
-    public void testLabelProvider() {
-        TreeViewer viewer = (TreeViewer) fViewer;
-        TableTreeTestLabelProvider provider = (TableTreeTestLabelProvider) viewer
-                .getLabelProvider();
-        provider.fExtended = true;
-        // BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
-        fViewer.refresh();
-        TestElement first = fRootElement.getFirstChild();
-        String newLabel = providedString(first);
-        assertEquals("rendered label", newLabel, getItemText(0));
-        provider.fExtended = false;
-        // BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
-        fViewer.refresh();
-    }
-
-    public void testLabelProviderStateChange() {
-        TreeViewer viewer = (TreeViewer) fViewer;
-        TableTreeTestLabelProvider provider = (TableTreeTestLabelProvider) viewer
-                .getLabelProvider();
-        provider.fExtended = true;
-        provider.setSuffix("added suffix");
-        // BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
-        fViewer.refresh();
-        TestElement first = fRootElement.getFirstChild();
-        String newLabel = providedString(first);
-        assertEquals("rendered label", newLabel, getItemText(0));
-        provider.fExtended = false;
-        // BUG 1FZ5SDC: JFUIF:WINNT - TableViewerColumn should listen for LabelProvider changes
-        fViewer.refresh();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TreeViewerComparatorTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TreeViewerComparatorTest.java
deleted file mode 100644
index 8f3a08b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TreeViewerComparatorTest.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.viewers;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- * @since 3.2
- *
- */
-public class TreeViewerComparatorTest extends ViewerComparatorTest{
-	
-	protected class TeamModelTreeContentProvider extends TeamModelContentProvider 
-				implements ITreeContentProvider{
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return getChildren(inputElement);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			if (parentElement instanceof List){
-				List children = new ArrayList();
-				Iterator iter = ((List)parentElement).iterator();
-				while(iter.hasNext()){
-					Object next = iter.next();
-					if (next instanceof Team){
-						Team team = (Team)next;
-						children.add(team);
-					}
-				}
-				return children.toArray(new Team[children.size()]);
-			}
-			else if (parentElement instanceof Team){
-				return ((Team)parentElement).members;
-			}
-			return null; 
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			if (element instanceof TeamMember){
-				return ((TeamMember)element).team;
-			}
-			return null;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-	        if (element instanceof Team) {
-	            if (getChildren(element).length > 0) {
-					return true;
-				}
-	        }
-	        return false;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			List oldElement = (List) oldInput;
-	        if (oldElement != null) {
-	        	Iterator iter = oldElement.iterator();
-	        	while (iter.hasNext()){
-	        		((Team)iter.next()).removeListener(this);
-	        	}
-	        }
-	        List newElement = (List) newInput;
-	        if (newElement != null) {
-	        	Iterator iter = newElement.iterator();
-	        	while (iter.hasNext()){
-	        		((Team)iter.next()).addListener(this);
-	        	}
-	        }			
-		}
-	}
-	
-	/**
-	 * constructor
-	 */
-	public TreeViewerComparatorTest(String name) {
-		super(name);
-	}
-	
-	public void testViewerSorter(){
-		fViewer.setSorter(new ViewerSorter());
-		getTreeViewer().expandAll();
-		String[][] expected = {TEAM3_SORTED, TEAM2_SORTED, TEAM1_SORTED};
-		assertSortedResult(expected);
-	}
-	
-	public void testViewerSorterInsertElement(){
-		fViewer.setSorter(new ViewerSorter());
-		getTreeViewer().expandAll();
-		team1.addMember("Duong");
-		String[][] expected = {TEAM3_SORTED, TEAM2_SORTED, TEAM1_SORTED_WITH_INSERT};
-		assertSortedResult(expected);
-	}
-	
-	public void testViewerComparator(){
-		fViewer.setComparator(new ViewerComparator());
-		getTreeViewer().expandAll();
-		String[][] expected = {TEAM3_SORTED, TEAM2_SORTED, TEAM1_SORTED};
-		assertSortedResult(expected);
-	}
-	
-	public void testViewerComparatorInsertElement(){
-		fViewer.setComparator(new ViewerComparator());
-		getTreeViewer().expandAll();
-		team1.addMember("Duong");
-		String[][] expected = {TEAM3_SORTED, TEAM2_SORTED, TEAM1_SORTED_WITH_INSERT};
-		assertSortedResult(expected);
-	}
-	
-	private void assertSortedResult(String[][] resultArrays){
-		TreeItem[] rootItems = getTreeViewer().getTree().getItems();
-		assertEquals("Number of root items in tree not correct (actual=" + rootItems.length + ")", 3, rootItems.length);
-		TreeItem item = rootItems[0];
-		assertEquals("Item not expected.  actual=" + item.getText() + " expected=" + CORE, CORE, item.getText());	
-		item = rootItems[1];
-		assertEquals("Item not expected.  actual=" + item.getText() + " expected=" + RUNTIME, RUNTIME, item.getText());	
-		item = rootItems[2];
-		assertEquals("Item not expected.  actual=" + item.getText() + " expected=" + UI, UI, item.getText());	
-		
-		TreeItem[] childItems = rootItems[0].getItems();
-		for (int i = 0; i < childItems.length; i++){
-			TreeItem child = childItems[i];
-			String result = child.getText();
-			assertEquals("", resultArrays[0][i], result);		
-		}
-		childItems = rootItems[1].getItems();
-		for (int i = 0; i < childItems.length; i++){
-			TreeItem child = childItems[i];
-			String result = child.getText();
-			assertEquals("", resultArrays[1][i], result);		
-		}
-		childItems = rootItems[2].getItems();
-		for (int i = 0; i < childItems.length; i++){
-			TreeItem child = childItems[i];
-			String result = child.getText();
-			assertEquals("", resultArrays[2][i], result);		
-		}
-	}
-
-	protected TreeViewer getTreeViewer(){
-		return (TreeViewer)fViewer;
-	}
-	
-	protected StructuredViewer createViewer(Composite parent) {
-		Tree tree = new Tree(fShell, SWT.SINGLE | SWT.H_SCROLL
-                | SWT.V_SCROLL | SWT.BORDER);
-		TreeViewer viewer = new TreeViewer(tree);
-		viewer.setContentProvider(new TeamModelTreeContentProvider());
-		viewer.setLabelProvider(new TeamModelLabelProvider());
-		return viewer;
-	}
-
-	protected void setInput() {
-		List input = new ArrayList(3);
-		input.add(team1);
-		input.add(team2);
-		input.add(team3);
-		fViewer.setInput(input);
-	}
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		junit.textui.TestRunner.run(TreeViewerComparatorTest.class);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TreeViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TreeViewerTest.java
deleted file mode 100644
index f956147..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/TreeViewerTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-public class TreeViewerTest extends AbstractTreeViewerTest {
-
-    public TreeViewerTest(String name) {
-        super(name);
-    }
-
-    protected StructuredViewer createViewer(Composite parent) {
-        fTreeViewer = new TreeViewer(parent);
-        fTreeViewer.setContentProvider(new TestModelContentProvider());
-        return fTreeViewer;
-    }
-
-    protected int getItemCount() {
-        TestElement first = fRootElement.getFirstChild();
-        TreeItem ti = (TreeItem) fViewer.testFindItem(first);
-        Tree tree = ti.getParent();
-        return tree.getItemCount();
-    }
-
-    /**
-     * getItemCount method comment.
-     */
-    protected int getItemCount(TestElement element) {
-        return element.getChildCount();
-    }
-
-    protected String getItemText(int at) {
-        Tree tree = (Tree) fTreeViewer.getControl();
-        return tree.getItems()[at].getText();
-    }
-
-    public static void main(String args[]) {
-        junit.textui.TestRunner.run(TreeViewerTest.class);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ViewerComparatorTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ViewerComparatorTest.java
deleted file mode 100644
index 79ea88d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ViewerComparatorTest.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Brock Janiczak  (brockj@tpg.com.au) - Bug 142960 Performance tweak for ignored file processing
- ******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.util.Vector;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * @since 3.2
- *
- */
-public abstract class ViewerComparatorTest extends ViewerTestCase {
-	protected String UI = "UI";
-	protected String[] TEAM1 = {"Karice", "Tod", "Eric", "Paul", 
-				"Mike", "Michael", "Andrea", "Kim", "Boris", "Susan"};
-	protected String[] TEAM1_SORTED = {"Andrea", "Boris", "Eric", "Karice", "Kim", 
-			"Michael", "Mike", "Paul", "Susan", "Tod"};
-	protected String[] TEAM1_SORTED_WITH_INSERT = {"Andrea", "Boris", "Duong", "Eric", "Karice", "Kim", 
-			"Michael", "Mike", "Paul", "Susan", "Tod"};
-	
-	protected String RUNTIME = "Runtime";
-	protected String[] TEAM2 = {"Pascal", "DJ", "Jeff", "Andrew", "Oleg"};
-	protected String[] TEAM2_SORTED = {"Andrew", "DJ", "Jeff", "Oleg", "Pascal"};
-	
-	protected String CORE = "Core";
-	protected String[] TEAM3 = {"John", "Michael", "Bogdan"};
-	protected String[] TEAM3_SORTED = {"Bogdan", "John", "Michael"};
-
-	protected Team team1 = new Team(UI, TEAM1);
-	protected Team team2 = new Team(RUNTIME, TEAM2);
-	protected Team team3 = new Team(CORE, TEAM3);
-	
-	/*
-	 * model object - parent
-	 */
-	protected class Team {
-		Vector fListeners = new Vector();
-		
-		TeamMember[] members;
-		String name;
-		
-		public Team(String name, String[] members){
-			this.name = name;
-			this.members = new TeamMember[members.length];
-			for (int i = 0; i < members.length; i++)
-				this.members[i] = new TeamMember(members[i], this);
-		}
-		
-		public void addMember(String person){
-			TeamMember newMember = new TeamMember(person, this);
-			TeamMember[] newMembers = new TeamMember[members.length + 1];
-			for (int i = 0; i < members.length; i++){
-				newMembers[i] = members[i];
-			}
-			newMembers[newMembers.length - 1] = newMember;
-			members = null;
-			members = newMembers;
-			newMembers = null;
-			fireModelChanged(new ComparatorModelChange(TestModelChange.INSERT, this, newMember));
-		}
-		
-	    public void addListener(IComparatorModelListener listener) {
-	        fListeners.addElement(listener);
-	    }
-
-	    /**
-	     * Fires a model changed event to all listeners.
-	     */
-	    public void fireModelChanged(ComparatorModelChange change) {
-	        for (int i = 0; i < fListeners.size(); ++i) {
-	        	IComparatorModelListener listener = (IComparatorModelListener) fListeners
-	                    .get(i);
-	            listener.modelChanged(change);
-	        }
-	    }
-
-	    public void removeListener(IComparatorModelListener listener) {
-	        fListeners.removeElement(listener);
-	    }
-	}
-	
-	/*
-	 * model object - child
-	 */
-	protected class TeamMember {
-		String name;
-		Team team;
-		
-		public TeamMember(String name, Team team){
-			this.name = name;
-			this.team = team;
-		}
-	}
-	
-	/*
-	 * label provider
-	 */
-	protected class TeamModelLabelProvider extends LabelProvider{
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-		 */
-		public String getText(Object element) {
-			if (element instanceof Team)
-				return ((Team)element).name;
-			else if (element instanceof TeamMember){
-				return ((TeamMember)element).name;
-			}
-			return element.toString();
-		}			
-	}
-	
-	/*
-	 * content provider
-	 */
-	protected class TeamModelContentProvider implements IComparatorModelListener,IStructuredContentProvider{
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			if (inputElement instanceof Team){
-				return ((Team)inputElement).members;
-			}
-			return new Object[0];
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			if (oldInput != null){
-				((Team) oldInput).removeListener(this);;
-			}
-	       
-	        if (newInput != null){
-	        	((Team) newInput).addListener(this);
-	        }
-		}
-
-	    public void modelChanged(ComparatorModelChange change) {
-	        switch (change.getKind()) {
-	        case TestModelChange.INSERT:
-	            doInsert(change);
-	            break;
-	        case TestModelChange.REMOVE:
-	            doRemove(change);
-	            break;
-	        case TestModelChange.STRUCTURE_CHANGE:
-	            doStructureChange(change);
-	            break;
-	        case TestModelChange.NON_STRUCTURE_CHANGE:
-	            doNonStructureChange(change);
-	            break;
-	        default:
-	            throw new IllegalArgumentException("Unknown kind of change");
-	        }
-
-	        StructuredSelection selection = new StructuredSelection(change
-	                .getChildren());
-	        if ((change.getModifiers() & TestModelChange.SELECT) != 0) {
-	            fViewer.setSelection(selection);
-	        }
-	        if ((change.getModifiers() & TestModelChange.REVEAL) != 0) {
-	            Object element = selection.getFirstElement();
-	            if (element != null) {
-	                fViewer.reveal(element);
-	            }
-	        }
-	    }
-	    
-	    protected void doInsert(ComparatorModelChange change) {
-	        if (fViewer instanceof ListViewer) {
-	            if (change.getParent() != null
-	                    && change.getParent().equals(fViewer.getInput())) {
-	                ((ListViewer) fViewer).add(change.getChildren());
-	            }
-	        } else if (fViewer instanceof TableViewer) {
-	            if (change.getParent() != null
-	                    && change.getParent().equals(fViewer.getInput())) {
-	                ((TableViewer) fViewer).add(change.getChildren());
-	            }
-	        } else if (fViewer instanceof AbstractTreeViewer) {
-	            ((AbstractTreeViewer) fViewer).add(change.getParent(), change
-	                    .getChildren());
-	        } else if (fViewer instanceof ComboViewer) {
-	            ((ComboViewer) fViewer).add(change.getChildren());
-	        } else {
-	            Assert.isTrue(false, "Unknown kind of viewer");
-	        }
-	    }
-
-	    protected void doNonStructureChange(ComparatorModelChange change) {
-           fViewer.update(change.getParent(),
-                    new String[] { IBasicPropertyConstants.P_TEXT });
-	    }
-
-	    protected void doRemove(ComparatorModelChange change) {
-	        if (fViewer instanceof ListViewer) {
-	            ((ListViewer) fViewer).remove(change.getChildren());
-	        } else if (fViewer instanceof TableViewer) {
-	            ((TableViewer) fViewer).remove(change.getChildren());
-	        } else if (fViewer instanceof AbstractTreeViewer) {
-	            ((AbstractTreeViewer) fViewer).remove(change.getChildren());
-	        } else if (fViewer instanceof ComboViewer) {
-	            ((ComboViewer) fViewer).remove(change.getChildren());
-	        } else {
-	            Assert.isTrue(false, "Unknown kind of viewer");
-	        }
-	    }
-
-	    protected void doStructureChange(ComparatorModelChange change) {
-            fViewer.refresh(change.getParent());
-	    }
-	    
-	}
-	
-	public ViewerComparatorTest(String name) {
-		super(name);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ViewerTestCase.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ViewerTestCase.java
deleted file mode 100644
index 708f90f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/ViewerTestCase.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.util.ILogger;
-import org.eclipse.jface.util.ISafeRunnableRunner;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-public abstract class ViewerTestCase extends TestCase {
-
-	Display fDisplay;
-	protected Shell fShell;
-	protected StructuredViewer fViewer;
-	protected TestElement fRootElement;
-	public TestModel fModel;
-
-	public ViewerTestCase(String name) {
-		super(name);
-	}
-
-	protected void assertSelectionEquals(String message, TestElement expected) {
-	    ISelection selection = fViewer.getSelection();
-	    assertTrue(selection instanceof IStructuredSelection);
-	    IStructuredSelection expectedSelection = new StructuredSelection(
-	            expected);
-	    assertEquals("selectionEquals - " + message, selection, expectedSelection);
-	}
-
-	protected abstract StructuredViewer createViewer(Composite parent);
-
-	public void interact() {
-	    Shell shell = fShell;
-	    if (shell != null && !shell.isDisposed()) {
-	        Display display = shell.getDisplay();
-	        if (display != null) {
-	            while (shell.isVisible())
-	                display.readAndDispatch();
-	        }
-	    }
-	}
-
-	protected void openBrowser() {
-	    fDisplay = Display.getCurrent();
-	    if (fDisplay == null) {
-	        fDisplay = new Display();
-	    }
-	    fShell = new Shell(fDisplay, getShellStyle());
-	    fShell.setSize(500, 500);
-	    fShell.setLayout(new FillLayout());
-	    fViewer = createViewer(fShell);
-	    fViewer.setUseHashlookup(true);
-	    setInput();
-	    fShell.open();
-	    //processEvents();
-	}
-
-	/**
-	 * @return
-	 */
-	protected int getShellStyle() {
-		return SWT.SHELL_TRIM;
-	}
-
-	protected void setInput() {
-		fViewer.setInput(fRootElement);
-	}
-
-	public void processEvents() {
-	    Shell shell = fShell;
-	    if (shell != null && !shell.isDisposed()) {
-	        Display display = shell.getDisplay();
-	        if (display != null) {
-	            while (display.readAndDispatch()) {
-	            	// loop until there are no more events to dispatch
-	            }
-	        }
-	    }
-	}
-
-	public void setUp() {
-		Policy.setLog(new ILogger(){
-			public void log(IStatus status) {
-				fail(status.getMessage());
-			}});
-		SafeRunnable.setRunner(new ISafeRunnableRunner(){
-			public void run(ISafeRunnable code) {
-				try {
-					code.run();
-				} catch(Throwable th) {
-					throw new RuntimeException(th);
-				}
-			}});
-	    setUpModel();
-	    openBrowser();
-	}
-
-	protected void setUpModel() {
-		fRootElement = TestElement.createModel(3, 10);
-	    fModel = fRootElement.getModel();
-	}
-
-	void sleep(int d) {
-	    processEvents();
-        try {
-			Thread.sleep(d * 1000);
-		} catch (InterruptedException e) {
-			Thread.currentThread().interrupt();
-		}
-	}
-
-	public void tearDown() {
-	    processEvents();
-	    fViewer = null;
-	    if (fShell != null) {
-	        fShell.dispose();
-	        fShell = null;
-	    }
-	    // leave the display
-	    fRootElement = null;
-	    fModel = null;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/VirtualLazyTableViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/VirtualLazyTableViewerTest.java
deleted file mode 100644
index 202d4fb..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/VirtualLazyTableViewerTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl <tom.schindl@bestsolution.at> - bug 170381
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.widgets.Table;
-
-
-/**
- * The VirtualLazyTableViewerTest is a test of table viewers
- * with lazy population.
- */
-public class VirtualLazyTableViewerTest extends VirtualTableViewerTest {
-	
-	private List updatedElements;
-	// by default, no failure is triggered when updateElement is called
-	int updatedElementFailureTriggerIndex = -1;
-
-	/**
-	 * Create a new instance of the receiver/
-	 * @param name
-	 */
-	public VirtualLazyTableViewerTest(String name) {
-		super(name);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.tests.viewers.TableViewerTest#getContentProvider()
-	 */
-	protected TestModelContentProvider getContentProvider() {
-		return new TestLazyModelContentProvider(this);
-	}
-	
-	public void setUp() {
-		updatedElements = new ArrayList();
-		super.setUp();
-		processEvents();
-	}
-	
-	protected void setUpModel() {
-		fRootElement = TestElement.createModel(2, 100);
-        fModel = fRootElement.getModel();
-	}
-
-	public void tearDown() {
-		super.tearDown();
-		updatedElements = null;
-	}
-	
-	// this method is called from TestLazyModelContentProvider
-	public void updateElementCalled(int index) {
-		updatedElements.add(new Integer(index));
-		if(updatedElementFailureTriggerIndex!=-1 && updatedElements.size()>=updatedElementFailureTriggerIndex) {
-			fail("unexpected call to updateElement, this is the " + updatedElements.size() + "th call");
-		}
-	}
-	
-	/**
-	 * Test selecting all elements.
-	 */
-	public void testSetIndexedSelection() {
-		TestElement[] children = fRootElement.getChildren();
-		int selectionSize = children.length / 2;
-		int[] indices = new int[selectionSize];
-		for (int i = 0; i < indices.length; i++) {
-			indices[i]  = i * 2;			
-		}
-		
-		Table table = ((TableViewer) fViewer).getTable();
-		table.setSelection(indices);
-
-		// we are virtual, so not all indices we requested to select will be selected.
-		indices = table.getSelectionIndices();
-		selectionSize = indices.length;
-		assertTrue("Expected at least one selected element", selectionSize > 0);
-		
-		table.showSelection();
-		
-		IStructuredSelection result = (IStructuredSelection) fViewer
-				.getSelection();
-		assertEquals(selectionSize, result.size());
-		assertTrue("First elements do not match ",
-				result.getFirstElement() == children[indices[0]]);
-		int lastIndex = indices[indices.length - 1];
-		assertTrue(
-				"Last elements do not match ",
-				result.toArray()[result.size() - 1] == children[lastIndex]);
-	
-	}
-	
-	public void testSetInputDoesNotMaterializeEverything() {
-		fViewer.setInput(null);
-		updatedElements.clear();
-		// Assume something is wrong if all TableItems are materialized:
-		updatedElementFailureTriggerIndex = fRootElement.getChildCount();
-		fViewer.setInput(fRootElement);
-
-		int materializedSize = updatedElements.size();
-		assertTrue("Expected less than " + fRootElement.getChildCount()
-				+ ", actual " + materializedSize,
-				materializedSize < fRootElement.getChildCount());
-		// create a new model and check if we get an equal number of calls to updateElement
-		setUpModel();
-		updatedElements.clear();
-		fViewer.setInput(fRootElement);
-		assertEquals(materializedSize, updatedElements.size());
-	}
-	
-	public void testBug160153() {
-		int childCount = fRootElement.getChildCount();
-		TestElement lastChild = fRootElement.getChildAt(childCount-1);
-		// materialize last child
-		fViewer.setSelection(new StructuredSelection(lastChild));
-		processEvents();
-		assertNotNull("last Child should be in the map", fViewer.testFindItem(lastChild));
-		((TableViewer)fViewer).setItemCount(childCount - 1);
-		assertNull("last Child should no longer be in the map", fViewer.testFindItem(lastChild));
-	}
-	
-
-	public void testSorter() {
-		// This test is no use here as it is
-		// based on the assumption that all items
-		// are created.
-	}
-	
-	public void testRenameWithSorter() {
-		// This test is no use here as it is
-		// based on the assumption that all items
-		// are created.
-	}
-	
-	public void testSetFilters() {
-		// This test is no use here as it is
-		// based on the assumption that all items
-		// are created.
-	}
-	
-	public void testFilter() {
-		// This test is no use here as it is
-		// based on the assumption that all items
-		// are created.
-	}
-	
-	public void testRenameWithFilter() {
-		// This test is no use here as it is
-		// based on the assumption that all items
-		// are created.
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/VirtualLazyTreeViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/VirtualLazyTreeViewerTest.java
deleted file mode 100644
index 868fe50..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/VirtualLazyTreeViewerTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl - bug 151205
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Tree;
-
-public class VirtualLazyTreeViewerTest extends TreeViewerTest {
-
-	protected int setDataCalls = 0;
-
-	public VirtualLazyTreeViewerTest(String name) {
-		super(name);
-	}
-
-    protected StructuredViewer createViewer(Composite parent) {
-    	Tree tree = new Tree(parent, SWT.VIRTUAL);
-    	tree.addListener(SWT.SetData, new Listener(){
-
-			public void handleEvent(Event event) {
-				setDataCalls++;
-			}});
-        fTreeViewer = new TreeViewer(tree);
-        fTreeViewer.setContentProvider(new TestModelLazyTreeContentProvider((TreeViewer) fTreeViewer));
-        return fTreeViewer;
-    }
-    
-    public void setUp() {
-    	super.setUp();
-    	// process events because the content provider uses an asyncExec to set the item count of the tree
-    	processEvents();
-    }
-    
-    protected void setInput() {
-		super.setInput();
-	}
-    
-    public void tearDown() {
-    	super.tearDown();
-//    	System.out.println("calls: " + setDataCalls);
-    }
-    
-    public void testLeafIsExpandable() {
-    	TestElement leafElement = fRootElement.getChildAt(2).getChildAt(3).getChildAt(2);
-    	assertEquals(0, leafElement.getChildCount());
-		assertFalse(fTreeViewer.isExpandable(leafElement));
-    }
-
-    public void testRootIsExpandable() {
-    	TestElement rootElement = fRootElement.getChildAt(2);
-    	assertTrue(rootElement.getChildCount() > 0);
-    	assertTrue(fTreeViewer.isExpandable(rootElement));
-    }
-    
-    public void testNodeIsExpandable() {
-    	TestElement nodeElement = fRootElement.getChildAt(2).getChildAt(3);
-    	assertTrue(nodeElement.getChildCount() > 0);
-    	assertTrue(fTreeViewer.isExpandable(nodeElement));
-    }
-    
-
-    public void testRefreshWithDuplicateChild() {
-    	// Test leads to infinite loop. Duplicate children are a bad idea in virtual trees.
-    }
-    
-    public void testSetExpandedWithCycle() {
-    	// Test leads to infinite loop. Cycles are a bad idea in virtual trees.
-    }
-    
-    public void testFilterExpanded() {
-    	// no need to test since virtual trees do not support filtering
-    }
-    
-    public void testFilter() {
-    	// no need to test since virtual trees do not support filtering
-    }
-    
-    public void testSetFilters() {
-    	// no need to test since virtual trees do not support filtering
-    }
-    
-    public void testInsertSiblingWithFilterFiltered() {
-    	// no need to test since virtual trees do not support filtering
-    }
-    
-    public void testInsertSiblingWithFilterNotFiltered() {
-    	// no need to test since virtual trees do not support filtering
-    }
-    
-    public void testInsertSiblingWithSorter() {
-    	// no need to test since virtual trees do not support sorting
-    }
-        
-    public void testRenameWithFilter() {
-    	// no need to test since virtual trees do not support filtering
-    }
-    
-    public void testRenameWithSorter() {
-    	// no need to test since virtual trees do not support sorting
-    }
-    
-    public void testSorter() {
-    	// no need to test since virtual trees do not support sorting
-    }
-    
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/VirtualTableViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/VirtualTableViewerTest.java
deleted file mode 100644
index 84b6406..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/VirtualTableViewerTest.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Tom Schindl - bug 151205, 170381
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-/**
- * The TableViewerTest is a test of the SWT#VIRTUAL support in TableViewers,
- */
-public class VirtualTableViewerTest extends TableViewerTest {
-
-	Set visibleItems = new HashSet();
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param name
-	 */
-	public VirtualTableViewerTest(String name) {
-		super(name);
-	}
-	
-	protected int getShellStyle() {
-		return super.getShellStyle() | SWT.ON_TOP;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.TableViewerTest#createTableViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	protected TableViewer createTableViewer(Composite parent) {
-		visibleItems = new HashSet();
-		TableViewer viewer = new TableViewer(parent, SWT.VIRTUAL | SWT.MULTI);
-		viewer.setUseHashlookup(true);
-		final Table table = viewer.getTable();
-		table.addListener(SWT.SetData, new Listener() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-			 */
-			public void handleEvent(Event event) {
-				TableItem item = (TableItem) event.item;
-				visibleItems.add(item);
-			}
-		});
-		return viewer;
-	}
-
-	/**
-	 * Get the collection of currently visible table items.
-	 * 
-	 * @return TableItem[]
-	 */
-	private TableItem[] getVisibleItems() {
-		return (TableItem[]) visibleItems.toArray(new TableItem[visibleItems.size()]);
-	}
-
-	public void testElementsCreated() {
-
-		TableItem[] items = getVisibleItems();
-
-		for (int i = 0; i < items.length; i++) {
-			TableItem item = items[i];
-			assertTrue("Missing data in item " + String.valueOf(i) + " of " + items.length, item
-					.getData() instanceof TestElement);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.TableViewerTest#getItemCount()
-	 */
-	protected int getItemCount() {
-		return getVisibleItems().length;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testFilter()
-	 */
-	public void testFilter() {
-		ViewerFilter filter = new TestLabelFilter();
-
-		visibleItems = new HashSet();
-		fViewer.addFilter(filter);
-		((TableViewer) fViewer).getControl().update();
-		assertEquals("filtered count", 5, getItemCount());
-
-		visibleItems = new HashSet();
-		fViewer.removeFilter(filter);
-		((TableViewer) fViewer).getControl().update();
-		assertEquals("unfiltered count", 10, getItemCount());
-	}
-
-	public void testSetFilters() {
-		ViewerFilter filter = new TestLabelFilter();
-
-		visibleItems = new HashSet();
-		fViewer.setFilters(new ViewerFilter[] { filter, new TestLabelFilter2() });
-		((TableViewer) fViewer).getControl().update();
-		assertEquals("2 filters count",1, getItemCount());
-
-		visibleItems = new HashSet();
-		fViewer.setFilters(new ViewerFilter[] { filter });
-		((TableViewer) fViewer).getControl().update();
-		assertEquals("1 filtered count",5, getItemCount());
-
-		visibleItems = new HashSet();
-		fViewer.setFilters(new ViewerFilter[0]);
-		((TableViewer) fViewer).getControl().update();
-		assertEquals("unfiltered count",10, getItemCount());
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testInsertSibling()
-	 */
-	public void testInsertSibling() {
-		// This test is no use here as it is
-		// based on the assumption that all items
-		// are created.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testInsertSiblingReveal()
-	 */
-	public void testInsertSiblingReveal() {
-		// This test is no use here as it is
-		// based on the assumption that all items
-		// are created.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testInsertSiblings()
-	 */
-	public void testInsertSiblings() {
-		// This test is no use here as it is
-		// based on the assumption that all items
-		// are created.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testInsertSiblingWithFilterFiltered()
-	 */
-	public void testInsertSiblingWithFilterFiltered() {
-		// This test is no use here as it is
-		// based on the assumption that all items
-		// are created.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testInsertSiblingWithFilterNotFiltered()
-	 */
-	public void testInsertSiblingWithFilterNotFiltered() {
-		// This test is no use here as it is
-		// based on the assumption that all items
-		// are created.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testInsertSiblingWithSorter()
-	 */
-	public void testInsertSiblingWithSorter() {
-		// This test is no use here as it is
-		// based on the assumption that all items
-		// are created.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testRenameWithFilter()
-	 */
-	public void testRenameWithFilter() {
-		fViewer.addFilter(new TestLabelFilter());
-		((TableViewer) fViewer).getControl().update();
-        TestElement first = fRootElement.getFirstChild();
-        first.setLabel("name-1111"); // should disappear
-        ((TableViewer) fViewer).getControl().update();
-        assertNull("changed sibling is not visible", fViewer
-                .testFindItem(first));
-        first.setLabel("name-2222"); // should reappear
-        fViewer.refresh();
-        ((TableViewer) fViewer).getControl().update();
-        assertNotNull("changed sibling is not visible", fViewer
-                .testFindItem(first));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testSetInput()
-	 */
-	public void testSetInput() {
-		// This test us based on findItem assuming all items
-		// are created so it is not valid.
-	}
-
-	public void testRenameWithSorter() {
-		// Call update to make sure the viewer is in a correct state
-		// At least on MacOSX I get failures without this call
-		((TableViewer) fViewer).getControl().update();
-		fViewer.setSorter(new TestLabelSorter());
-		TestElement first = fRootElement.getFirstChild();
-		first.setLabel("name-9999");
-		String newElementLabel = first.toString();
-		((TableViewer) fViewer).getControl().update();
-		assertEquals("sorted first", newElementLabel, getItemText(0));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testSorter()
-	 */
-	public void testSorter() {
-		TestElement first = fRootElement.getFirstChild();
-		TestElement last = fRootElement.getLastChild();
-
-		String firstLabel = first.toString();
-		String lastLabel = last.toString();
-
-		((TableViewer) fViewer).getControl().update();
-		assertEquals("unsorted", firstLabel, getItemText(0));
-		fViewer.setSorter(new TestLabelSorter());
-
-		((TableViewer) fViewer).getControl().update();
-		assertEquals("reverse sorted", lastLabel, getItemText(0));
-
-		fViewer.setSorter(null);
-		((TableViewer) fViewer).getControl().update();
-		assertEquals("unsorted", firstLabel, getItemText(0));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testInsertSiblingSelectExpanded()
-	 */
-	public void testInsertSiblingSelectExpanded() {
-		// This test is no use here as it is
-		// based on the assumption that all items
-		// are created.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testSomeChildrenChanged()
-	 */
-	public void testSomeChildrenChanged() {
-		// This test is no use here as it is
-		// based on the assumption that all items
-		// are created.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testWorldChanged()
-	 */
-	public void testWorldChanged() {
-		// This test is no use here as it is
-		// based on the assumption that all items
-		// are created.
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testDeleteSibling()
-	 */
-	public void testDeleteSibling() {
-		//Force creation of the item first
-		((TableViewer) fViewer).getTable().getItem(0).getText();
-		super.testDeleteSibling();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.tests.viewers.StructuredViewerTest#testSetSelection()
-	 */
-	public void testSetSelection() {
-		//Force creation of the item first
-		((TableViewer) fViewer).getTable().getItem(0).getText();
-		super.testSetSelection();
-	}
-	
-	/**
-	 * Test selecting all elements.
-	 */
-	public void testSetAllSelection() {
-		TestElement[] children = fRootElement.getChildren();
-		StructuredSelection selection = new StructuredSelection(children);
-		fViewer.setSelection(selection);
-		IStructuredSelection result = (IStructuredSelection) fViewer
-				.getSelection();
-		assertTrue("Size was " + String.valueOf(result.size()) + " expected "
-				+ String.valueOf(children.length),
-				(result.size() == children.length));
-		Set childrenSet = new HashSet(Arrays.asList(children));
-		Set selectedSet = new HashSet(result.toList());
-		assertTrue("Elements do not match ", childrenSet.equals(selectedSet));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/VirtualTreeViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/VirtualTreeViewerTest.java
deleted file mode 100644
index 4f4a7ff..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/VirtualTreeViewerTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Tree;
-
-/**
- * Tests TreeViewer's VIRTUAL support with a normal content provider.
- * @since 3.2
- */
-public class VirtualTreeViewerTest extends TreeViewerTest {
-
-	public VirtualTreeViewerTest(String name) {
-		super(name);
-	}
-
-	protected StructuredViewer createViewer(Composite parent) {
-		Tree tree = new Tree(parent, SWT.VIRTUAL);
-		fTreeViewer = new TreeViewer(tree);
-		fTreeViewer.setContentProvider(new TestModelContentProvider());
-		return fTreeViewer;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/images/java.gif b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/images/java.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/images/java.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/AddChildAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/AddChildAction.java
deleted file mode 100644
index c7835ef..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/AddChildAction.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestElement;
-import org.eclipse.jface.tests.viewers.TestModelChange;
-
-public class AddChildAction extends TestSelectionAction {
-
-    int fEventKind;
-
-    public AddChildAction(String label, TestBrowser browser) {
-        this(label, browser, TestModelChange.INSERT);
-    }
-
-    public AddChildAction(String label, TestBrowser browser, int eventKind) {
-        super(label, browser);
-        fEventKind = eventKind;
-    }
-
-    public void run(TestElement element) {
-        element.addChild(fEventKind);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/AddElementAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/AddElementAction.java
deleted file mode 100644
index f90e426..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/AddElementAction.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestElement;
-import org.eclipse.jface.tests.viewers.TestModelChange;
-
-public class AddElementAction extends TestBrowserAction {
-
-    public AddElementAction(String label, TestBrowser browser) {
-        super(label, browser);
-        //		window.addFocusChangedListener(this);
-    }
-
-    public void run() {
-        TestElement element = (TestElement) getBrowser().getViewer().getInput();
-        element.addChild(TestModelChange.INSERT);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/AddFilterAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/AddFilterAction.java
deleted file mode 100644
index 0bc3bfe..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/AddFilterAction.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-public class AddFilterAction extends TestBrowserAction {
-
-    public AddFilterAction(String label, TestBrowser browser) {
-        super(label, browser);
-    }
-
-    public void run() {
-        Viewer viewer = getBrowser().getViewer();
-        if (viewer instanceof StructuredViewer)
-            ((StructuredViewer) viewer).addFilter(new Filter());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/AddSiblingAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/AddSiblingAction.java
deleted file mode 100644
index 48ccf90..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/AddSiblingAction.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestElement;
-import org.eclipse.jface.tests.viewers.TestModelChange;
-
-public class AddSiblingAction extends TestSelectionAction {
-
-    int fEventKind;
-
-    public AddSiblingAction(String label, TestBrowser browser) {
-        this(label, browser, TestModelChange.INSERT);
-    }
-
-    public AddSiblingAction(String label, TestBrowser browser, int eventKind) {
-        super(label, browser);
-        fEventKind = eventKind;
-    }
-
-    public void run(TestElement element) {
-        element.getContainer().addChild(fEventKind);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ChangeChildLabelAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ChangeChildLabelAction.java
deleted file mode 100644
index bb2703d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ChangeChildLabelAction.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestElement;
-
-public class ChangeChildLabelAction extends TestSelectionAction {
-    public ChangeChildLabelAction(String label, TestBrowser browser) {
-        super(label, browser);
-    }
-
-    public void run(TestElement element) {
-        TestElement child = element.getFirstChild();
-        if (child != null)
-            child.setLabel(child.getLabel() + " renamed child");
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ChangeInputLabelAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ChangeInputLabelAction.java
deleted file mode 100644
index 5493282..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ChangeInputLabelAction.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestElement;
-
-public class ChangeInputLabelAction extends TestBrowserAction {
-
-    public ChangeInputLabelAction(String label, TestBrowser browser) {
-        super(label, browser);
-    }
-
-    public void run() {
-        TestElement element = (TestElement) getBrowser().getInput();
-        element.setLabel(element.getLabel() + " changed");
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ChangeLabelAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ChangeLabelAction.java
deleted file mode 100644
index b93335b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ChangeLabelAction.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestElement;
-
-public class ChangeLabelAction extends TestSelectionAction {
-
-    public ChangeLabelAction(String label, TestBrowser browser) {
-        super(label, browser);
-    }
-
-    public void run(TestElement element) {
-        element.setLabel(element.getLabel() + " changed");
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ClearSelectionAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ClearSelectionAction.java
deleted file mode 100644
index e9e2992..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ClearSelectionAction.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.viewers.StructuredSelection;
-
-public class ClearSelectionAction extends TestBrowserAction {
-
-    public ClearSelectionAction(String label, TestBrowser browser) {
-        super(label, browser);
-    }
-
-    public void run() {
-        getBrowser().getViewer().setSelection(new StructuredSelection());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ConcurrentTableTestView.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ConcurrentTableTestView.java
deleted file mode 100644
index 3dbc286..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ConcurrentTableTestView.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import java.util.ArrayList;
-import java.util.Random;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.tests.viewers.TestComparator;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.deferred.DeferredContentProvider;
-import org.eclipse.jface.viewers.deferred.SetModel;
-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.part.ViewPart;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * @since 3.1
- */
-public class ConcurrentTableTestView extends ViewPart {
-
-    private TableViewer table;
-    private boolean enableSlowComparisons = false;
-    private TestComparator comparator = new TestComparator() {
-        
-        /* (non-Javadoc)
-         * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-         */
-        public int compare(Object arg0, Object arg1) {
-//            try {
-//                // Insert a bogus delay to simulate doing work
-//                Thread.sleep(1);
-//            } catch (InterruptedException e) {
-//            }
-
-        	if (enableSlowComparisons) {
-	            int delay = 2; // Time to spin the CPU for (milliseconds)
-	            
-	            // Do some work to occupy time 
-	            int counter = 0;
-	            long timestamp = System.currentTimeMillis();
-	            while (System.currentTimeMillis() < timestamp + delay) {
-	                counter++;
-	            }
-        	}
-            
-            int result = super.compare(arg0, arg1);
-            
-            scheduleComparisonUpdate();
-            
-            return result;
-        }
-    };
-    private DeferredContentProvider contentProvider;
-    
-    private WorkbenchJob updateCountRunnable = new WorkbenchJob("") {
-        
-        /* (non-Javadoc)
-         * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
-         */
-        public IStatus runInUIThread(IProgressMonitor monitor) {
-            updateCount.setText("Comparison count = " + comparator.comparisons);
-            return Status.OK_STATUS;
-        }
-    };
-    
-    private Label updateCount;
-    private SetModel model = new SetModel();
-    private Random rand = new Random();
-    private Button slowComparisons;
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-     */
-    public void createPartControl(Composite temp) {
-        Composite parent = new Composite(temp, SWT.NONE);
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 2;
-        
-        parent.setLayout(layout);
-        
-        // Create the table
-        {
-	        table = new TableViewer(parent, SWT.VIRTUAL);
-	        contentProvider = new DeferredContentProvider(comparator);
-	        table.setContentProvider(contentProvider);
-	        
-	        GridData data = new GridData(GridData.FILL_BOTH);
-	        table.getControl().setLayoutData(data);
-	        table.setInput(model);
-        }
-        
-        // Create the buttons
-        Composite buttonBar = new Composite(parent, SWT.NONE);
-        buttonBar.setLayoutData(new GridData(GridData.FILL_BOTH));
-        GridLayout buttonBarLayout = new GridLayout();
-        buttonBarLayout.numColumns = 1;
-        buttonBar.setLayout(buttonBarLayout);
-        {
-
-            updateCount = new Label(buttonBar, SWT.NONE);
-            updateCount.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-            slowComparisons = new Button(buttonBar, SWT.CHECK);
-            slowComparisons.setLayoutData(new GridData(GridData.FILL_BOTH));
-            slowComparisons.setText("Slow comparisons");
-            slowComparisons.setSelection(enableSlowComparisons);
-            slowComparisons.addSelectionListener(new SelectionAdapter() {
-            	/* (non-Javadoc)
-				 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-				 */
-				public void widgetSelected(SelectionEvent e) {
-					enableSlowComparisons = slowComparisons.getSelection();
-					super.widgetSelected(e);
-				}
-            });
-            
-            
-            final Button limitSize = new Button(buttonBar, SWT.CHECK);
-            limitSize.setLayoutData(new GridData(GridData.FILL_BOTH));
-            limitSize.setText("Limit table size to 400");
-            limitSize.addSelectionListener(new SelectionAdapter() {
-            	/* (non-Javadoc)
-				 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-				 */
-				public void widgetSelected(SelectionEvent e) {
-					if (limitSize.getSelection()) {
-						contentProvider.setLimit(400);
-					} else {
-						contentProvider.setLimit(-1);
-					}
-					super.widgetSelected(e);
-				}
-            });
-            
-            Button resetCountButton = new Button(buttonBar, SWT.PUSH);
-            resetCountButton.setLayoutData(new GridData(GridData.FILL_BOTH));
-            resetCountButton.setText("Reset comparison count");
-	        resetCountButton.addSelectionListener(new SelectionAdapter() {
-		        /* (non-Javadoc)
-	             * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-	             */
-	            public void widgetSelected(SelectionEvent e) {
-	                comparator.comparisons = 0;
-	                scheduleComparisonUpdate();
-	            } 
-	        });
-	        
-	        Button testButton = new Button(buttonBar, SWT.PUSH);
-	        testButton.setLayoutData(new GridData(GridData.FILL_BOTH));
-	        testButton.setText("add 100000 elements");
-	        testButton.addSelectionListener(new SelectionAdapter() {
-		        /* (non-Javadoc)
-	             * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-	             */
-	            public void widgetSelected(SelectionEvent e) {
-	                addRandomElements(100000);
-	            } 
-	        });
-	        
-	        Button removeButton = new Button(buttonBar, SWT.PUSH);
-	        removeButton.setLayoutData(new GridData(GridData.FILL_BOTH));
-	        removeButton.setText("remove all");
-	        removeButton.addSelectionListener(new SelectionAdapter() {
-		        /* (non-Javadoc)
-	             * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-	             */
-	            public void widgetSelected(SelectionEvent e) {
-	                clear();
-	            } 
-	        });
-
-        }
-    }
-    
-    
-    /**
-     * 
-     * @since 3.1
-     */
-    protected void scheduleComparisonUpdate() {
-        updateCountRunnable.schedule(100);
-    }
-
-
-
-    public void addRandomElements(int amount) {
-        
-        ArrayList tempList = new ArrayList();
-
-        for (int counter = 0; counter < amount; counter++) {
-            tempList.add("" + rand.nextLong() + " " + counter );
-        }
-        
-        model.addAll(tempList);
-    }
-    
-    public void clear() {
-        model.clear();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-     */
-    public void setFocus() {
-        // TODO Auto-generated method stub
-
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/CreateModelAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/CreateModelAction.java
deleted file mode 100644
index 9ba75ec..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/CreateModelAction.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestElement;
-
-public class CreateModelAction extends TestBrowserAction {
-    int fLevel;
-
-    int fChildCount;
-
-    public CreateModelAction(String label, TestBrowser browser, int level,
-            int childCount) {
-        super(label, browser);
-        fLevel = level;
-        fChildCount = childCount;
-    }
-
-    public void run() {
-        // Clear input since TestElement.equals does only
-        // check the id, not the size of the TestElement.
-        getBrowser().setInput(null);
-        getBrowser().setInput(TestElement.createModel(fLevel, fChildCount));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/DeleteAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/DeleteAction.java
deleted file mode 100644
index ab9a860..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/DeleteAction.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestElement;
-
-public class DeleteAction extends TestSelectionAction {
-
-    public DeleteAction(String label, TestBrowser browser) {
-        super(label, browser);
-    }
-
-    public void run(TestElement element) {
-        element.getContainer().deleteChild(element);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/DeleteChildrenAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/DeleteChildrenAction.java
deleted file mode 100644
index 376ccd9..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/DeleteChildrenAction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestElement;
-
-public class DeleteChildrenAction extends TestSelectionAction {
-
-    boolean fAll = false;
-
-    public DeleteChildrenAction(String label, TestBrowser browser, boolean all) {
-        super(label, browser);
-        fAll = all;
-    }
-
-    public void run(TestElement element) {
-        if (fAll)
-            element.deleteChildren();
-        else
-            element.deleteSomeChildren();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/DeleteSiblingsAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/DeleteSiblingsAction.java
deleted file mode 100644
index 6b1cad3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/DeleteSiblingsAction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestElement;
-
-public class DeleteSiblingsAction extends TestSelectionAction {
-
-    boolean fAll = false;
-
-    public DeleteSiblingsAction(String label, TestBrowser browser, boolean all) {
-        super(label, browser);
-        fAll = all;
-    }
-
-    public void run(TestElement element) {
-        if (fAll)
-            element.getContainer().deleteChildren();
-        else
-            element.getContainer().deleteSomeChildren();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ExpandAllAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ExpandAllAction.java
deleted file mode 100644
index 610e7f1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ExpandAllAction.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-public class ExpandAllAction extends TestBrowserAction {
-
-    public ExpandAllAction(String label, TestBrowser browser) {
-        super(label, browser);
-    }
-
-    public void run() {
-        Viewer viewer = getBrowser().getViewer();
-        if (viewer instanceof AbstractTreeViewer)
-            ((AbstractTreeViewer) viewer).expandAll();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/Filter.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/Filter.java
deleted file mode 100644
index e3be1ef..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/Filter.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-public class Filter extends ViewerFilter {
-
-    public Object[] filter(Viewer viewer, Object parent, Object[] elements) {
-        ArrayList result = new ArrayList();
-        for (int i = 0; i < elements.length; ++i) {
-            // toss every second item
-            if (i % 2 == 1) {
-                result.add(elements[i]);
-            }
-        }
-        return result.toArray();
-    }
-
-    public boolean isFilterProperty(Object element, Object aspect) {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ViewerFilter
-     */
-    public boolean select(Viewer viewer, Object parentElement, Object element) {
-        // not used
-        return false;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/FlushInputAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/FlushInputAction.java
deleted file mode 100644
index c8d2154..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/FlushInputAction.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-public class FlushInputAction extends TestBrowserAction {
-
-    public FlushInputAction(String label, TestBrowser browser) {
-        super(label, browser);
-    }
-
-    public void run() {
-        getBrowser().setInput(null);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/LazyDeferredVirtualTableView.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/LazyDeferredVirtualTableView.java
deleted file mode 100644
index be77f5e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/LazyDeferredVirtualTableView.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ILazyContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * The LazyVirtualTableView is the VirtualTableView with lazy content.
- */
-public class LazyDeferredVirtualTableView extends VirtualTableView {
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public LazyDeferredVirtualTableView() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.interactive.VirtualTableView#getContentProvider()
-	 */
-	protected IContentProvider getContentProvider() {
-		return new ILazyContentProvider() {
-
-			int rangeStart = -1;
-
-			int rangeEnd = -1;
-
-			UIJob updateJob = new UIJob("Update") {
-				public IStatus runInUIThread(IProgressMonitor monitor) {
-					if(viewer.getControl().isDisposed())
-						return Status.CANCEL_STATUS;
-					int rangeLength = rangeEnd - rangeStart;
-					for (int i = 0; i <= rangeLength; i++) {
-						int index = i + rangeStart;
-						viewer.replace("Element " + String.valueOf(index),
-								index);
-					}
-
-					return Status.OK_STATUS;
-				}
-			};
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ILazyContentProvider#updateElements(int,
-			 *      int)
-			 */
-			public void updateElement(int index) {
-
-				int begin = Math.max(0, index - 50);
-				int end = Math.min(begin + 50, 9999);
-
-				// Initial case
-				if (rangeStart == -1 || rangeEnd == -1) {
-					rangeStart = begin;
-					rangeEnd = end;
-					updateJob.schedule(1000);
-					return;
-				}
-
-				// Are we in the range already being worked on?
-				if (index >= rangeStart && index <= rangeEnd)
-					return;
-
-				// Are we outside of the old range?
-				if (begin > rangeEnd || end < rangeStart) {
-					viewer.getTable().clear(rangeStart, rangeEnd);
-					rangeStart = begin;
-					rangeEnd = end;
-					updateJob.schedule(1000);
-					return;
-				}
-
-				// Shift if it is before
-				if (begin < rangeStart) {
-					rangeStart = begin;
-					int oldEnd = rangeEnd;
-					rangeEnd = end;
-					viewer.getTable().clear(end + 1, oldEnd);
-
-					updateJob.schedule(1000);
-					return;
-				}
-
-				// Shift if it is after
-				if (end > rangeEnd) {
-					rangeEnd = end;
-					int oldStart = rangeStart;
-					rangeStart = begin;
-					viewer.getTable().clear(oldStart, rangeStart - 1);
-					updateJob.schedule(1000);
-					return;
-				}
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-				// Do Nothing
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-				// Do nothing.
-			}
-		};
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.tests.viewers.interactive.VirtualTableView#resetInput()
-	 */
-	protected void resetInput() {
-		viewer.setItemCount(itemCount);
-		super.resetInput();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/LazyVirtualTableView.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/LazyVirtualTableView.java
deleted file mode 100644
index ce2d4dc..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/LazyVirtualTableView.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ILazyContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * The LazyVirtualTableView is the VirtualTableView with
- * lazy content.
- */
-public class LazyVirtualTableView extends VirtualTableView {
-
-	private List elements;
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public LazyVirtualTableView() {
-		super();
-		initElements();
-	}
-
-	/**
-	 * 
-	 */
-	private void initElements() {
-		elements = new ArrayList();
-		for (int i = 0; i < itemCount; i++) {
-			elements.add("Element " + String.valueOf(i));
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.tests.viewers.interactive.VirtualTableView#getContentProvider()
-	 */
-	protected IContentProvider getContentProvider() {
-		return new ILazyContentProvider() {
-			
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.ILazyContentProvider#updateElements(int, int)
-			 */
-			public void updateElement(int index) {
-		        viewer.replace(elements.get(index), index);
-			}
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-				//Do Nothing
-			}
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-				// Do nothing.
-			}
-		};
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.tests.viewers.interactive.VirtualTableView#doRemove(java.lang.Object[])
-	 */
-	protected void doRemove(Object[] selection, int[] selectionIndices) {
-		for (int i = 0; i < selectionIndices.length; i++) {
-			int index = selectionIndices[i];
-			elements.remove(index);
-		}
-		super.doRemove(selection, selectionIndices);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.tests.viewers.interactive.VirtualTableView#resetInput()
-	 */
-	protected void resetInput() {
-		viewer.setItemCount(itemCount);
-		super.resetInput();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ResetFilterAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ResetFilterAction.java
deleted file mode 100644
index a44dff4..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ResetFilterAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-public class ResetFilterAction extends TestBrowserAction {
-
-    public ResetFilterAction(String label, TestBrowser browser) {
-        super(label, browser);
-    }
-
-    public void run() {
-        Viewer viewer = getBrowser().getViewer();
-        if (viewer instanceof StructuredViewer) {
-            StructuredViewer v = (StructuredViewer) viewer;
-            v.resetFilters();
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ResetSorterAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ResetSorterAction.java
deleted file mode 100644
index fa2d616..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/ResetSorterAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-public class ResetSorterAction extends TestBrowserAction {
-
-    public ResetSorterAction(String label, TestBrowser browser) {
-        super(label, browser);
-    }
-
-    public void run() {
-        Viewer viewer = getBrowser().getViewer();
-        if (viewer instanceof StructuredViewer) {
-            StructuredViewer v = (StructuredViewer) viewer;
-            v.setSorter(null);
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/SetLabelProviderAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/SetLabelProviderAction.java
deleted file mode 100644
index b348b35..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/SetLabelProviderAction.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestLabelProvider;
-import org.eclipse.jface.viewers.ContentViewer;
-
-public class SetLabelProviderAction extends TestBrowserAction {
-
-    public SetLabelProviderAction(String label, TestBrowser browser) {
-        super(label, browser);
-    }
-
-    public void run() {
-        ((ContentViewer) getBrowser().getViewer())
-                .setLabelProvider(new TestLabelProvider());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/SetSorterAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/SetSorterAction.java
deleted file mode 100644
index 7d72a9b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/SetSorterAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-public class SetSorterAction extends TestBrowserAction {
-
-    public SetSorterAction(String label, TestBrowser browser) {
-        super(label, browser);
-    }
-
-    public void run() {
-        Viewer viewer = getBrowser().getViewer();
-        if (viewer instanceof StructuredViewer) {
-            StructuredViewer v = (StructuredViewer) viewer;
-            v.setSorter(new Sorter());
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/Sorter.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/Sorter.java
deleted file mode 100644
index 144afe3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/Sorter.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.viewers.IBasicPropertyConstants;
-import org.eclipse.jface.viewers.ViewerSorter;
-
-public class Sorter extends ViewerSorter {
-
-    public boolean isSorterProperty(Object element, String property) {
-        return IBasicPropertyConstants.P_TEXT.equals(property);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/StyledCellLabelProviderTests.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/StyledCellLabelProviderTests.java
deleted file mode 100644
index 351b795..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/StyledCellLabelProviderTests.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Michael Krkoska - initial API and implementation (bug 188333)
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import java.text.DecimalFormat;
-import java.text.MessageFormat;
-
-import org.eclipse.jface.preference.JFacePreferences;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.StyledCellLabelProvider;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.viewers.StyledString.Styler;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.graphics.TextStyle;
-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.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Using a {@link StyledCellLabelProvider} on table viewer.
- */
-
-public class StyledCellLabelProviderTests {
-	
-	private static int IMAGE_SIZE= 16;
-
-	private static Image IMAGE1;
-	private static Image IMAGE2;
-
-	public static void main(String[] args) {
-
-		Display display = new Display();
-
-		JFaceResources.getColorRegistry().put(JFacePreferences.COUNTER_COLOR, new RGB(0,127,174));
-		
-		IMAGE1= new Image(display, display.getSystemImage(SWT.ICON_WARNING).getImageData().scaledTo(IMAGE_SIZE, IMAGE_SIZE));
-		IMAGE2= new Image(display, display.getSystemImage(SWT.ICON_ERROR).getImageData().scaledTo(IMAGE_SIZE, IMAGE_SIZE));
-
-		Shell shell= new Shell(display , SWT.CLOSE | SWT.RESIZE);
-		shell.setSize(400, 600);
-		shell.setLayout(new GridLayout(1, false));
-
-		StyledCellLabelProviderTests example= new StyledCellLabelProviderTests();
-		Control composite= example.createPartControl(shell);
-		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-		
-		shell.open();
-
-		while (!shell.isDisposed()) {
-			if (!display.readAndDispatch()) {
-				display.sleep();
-			}
-		}
-		display.dispose();
-	}
-
-	protected boolean useBold;
-
-	public StyledCellLabelProviderTests() {
-	}
-
-	public Composite createPartControl(Composite parent) {
-		Composite composite= new Composite(parent, SWT.NONE);
-
-		composite.setLayout(new GridLayout(1, true));
-
-		final Label label= new Label(composite, SWT.NONE);
-		label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
-		label.setText("Operations per second: xxxxx"); //$NON-NLS-1$
-		
-		final Runnable[] operation = new Runnable[1];
-		
-		final Button timeButton = new Button(composite, SWT.CHECK);
-		timeButton.setText("Time");
-		timeButton.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				setTimer(timeButton.getDisplay(), timeButton.getSelection(), operation, label);
-			}
-		});
-		
-		final Button stylingButton = new Button(composite, SWT.CHECK);
-		stylingButton.setText("enable styling");
-		stylingButton.setSelection(true);
-		
-		final Button boldButton = new Button(composite, SWT.CHECK);
-		boldButton.setText("use bold");
-
-		final TableViewer tableViewer= new TableViewer(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		
-		boldButton.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				useBold = boldButton.getSelection();
-				tableViewer.refresh();
-			}
-		});
-		
-		operation[0] = new Runnable(){
-			public void run() {
-				tableViewer.refresh();
-			}
-		};
-		
-		FontData[] boldFontData= getModifiedFontData(tableViewer.getTable().getFont().getFontData(), SWT.BOLD);
-
-		Font boldFont = new Font(Display.getCurrent(), boldFontData);
-		final ExampleLabelProvider labelProvider= new ExampleLabelProvider(boldFont);
-		TestContentProvider contentProvider= new TestContentProvider();
-		
-		tableViewer.setContentProvider(contentProvider);
-		tableViewer.setLabelProvider(labelProvider);
-		
-		stylingButton.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				labelProvider.setOwnerDrawEnabled(stylingButton.getSelection());
-				tableViewer.refresh();
-			}
-		});
-
-
-		GridData data= new GridData(GridData.FILL, GridData.FILL, true, true);
-		tableViewer.getControl().setLayoutData(data);
-		tableViewer.setInput(new Object());
-
-		return composite;
-	}
-	
-	boolean timerOn = false;
-	long startTime;
-	int numOperations;
-	DecimalFormat decimalFormat = new DecimalFormat("##.#");
-	
-	protected void setTimer(final Display display, boolean selection, final Runnable[] operation, final Label resultLabel) {
-		timerOn = selection;
-		if (timerOn) {
-			startTime = System.currentTimeMillis();
-			numOperations = 0;
-			display.asyncExec(new Runnable() {
-				public void run() {
-					if (display.isDisposed() || resultLabel.isDisposed()) {
-						return;
-					}
-					if (operation[0] != null) {
-						operation[0].run();
-					}
-					numOperations++;
-					long currentTime = System.currentTimeMillis();
-					long elapsedTime = currentTime - startTime;
-					if (elapsedTime >= 1000) {
-						double timePerOperation = elapsedTime / 1000.0 / numOperations;
-						double operationsPerSecond = 1.0/timePerOperation;
-						resultLabel.setText("Operations per second: " + decimalFormat.format(operationsPerSecond));
-						numOperations = 0;
-						startTime = System.currentTimeMillis();
-					}
-					if (timerOn) {
-						display.asyncExec(this);
-					}
-				}
-			});
-		} else {
-			resultLabel.setText("Operations per second: xxxx");
-		}
-	}
-
-	private static FontData[] getModifiedFontData(FontData[] originalData, int additionalStyle) {
-		FontData[] styleData = new FontData[originalData.length];
-		for (int i = 0; i < styleData.length; i++) {
-			FontData base = originalData[i];
-			styleData[i] = new FontData(base.getName(), base.getHeight(), base.getStyle() | additionalStyle);
-		}
-       	return styleData;
-    }
-	
-	private class ExampleLabelProvider extends StyledCellLabelProvider {
-
-		private final Styler fBoldStyler; 
-		
-		public ExampleLabelProvider(final Font boldFont) {
-			fBoldStyler= new Styler() {
-				public void applyStyles(TextStyle textStyle) {
-					textStyle.font= boldFont;
-				}
-			};
-		}
-		
-		public void update(ViewerCell cell) {
-			Object element= cell.getElement();
-			
-			if (element instanceof File) {
-				File file= (File) element;
-				
-				Styler style= file.isDirectory() && useBold ? fBoldStyler: null;
-				StyledString styledString= new StyledString(file.getName(), style);
-				String decoration = MessageFormat.format(" ({0} bytes)", new Object[] { new Long(file.length()) }); //$NON-NLS-1$
-				styledString.append(decoration, StyledString.COUNTER_STYLER);
-				
-				cell.setText(styledString.toString());
-				cell.setStyleRanges(styledString.getStyleRanges());
-				
-				if (file.isDirectory()) {
-					cell.setImage(IMAGE1);
-				} else {
-					cell.setImage(IMAGE2);
-				}
-			} else {
-				cell.setText("Unknown element"); //$NON-NLS-1$
-			}
-
-			super.update(cell);
-		}
-		
-		protected void measure(Event event, Object element) {
-			super.measure(event, element);
-		}
-	}
-
-	static class File {
-
-		private final String name;
-		private final int length;
-		private final boolean dir;
-
-		File(String name, int length, boolean dir) {
-			this.name = name;
-			this.length = length;
-			this.dir = dir;
-		}
-
-		public int length() {
-			return length;
-		}
-
-		public String getName() {
-			return name;
-		}
-
-		boolean isDirectory() {
-			return dir;
-		}
-
-	}
-	
-	private static class TestContentProvider implements IStructuredContentProvider {
-
-		public Object[] getElements(Object element) {
-			return new File[]{
-					new File("asdfkjghfasdkjasdfhjgasdfkjhg", 2348, false),
-					new File("sdafkuyasdfkljh", 2348, false),
-					new File("asdklufhalsdkhlkjhnklj hlh", 2348, true),
-					new File("asdfasdf asdf ", 2348, false),
-					new File("fds sdf", 2348, true),
-					new File(" sdafuh lsdfahj alsdfk hl", 2348, false),
-					new File("sdfahj sdfajk hsdfjkh", 2348, false),
-					new File("sdafkja sdfjkh asdfkhj", 2348, false),
-					new File("sdfakj hasdfljkha sdfljkh sdfa", 348, true),
-					new File("hj ka g", 1334, true),
-					new File("asdfjk hsdfaljkh", 2348, false),
-					new File("asdh gasdflhg ", 3348, true),
-					new File("asd ghasdfkjg sdfkyug ", 4345, false),
-					new File("asdf hjasdflkjh sdfal", 5345, false),
-					new File("asdlfuh afsdhjg fdsalhj", 6648, false),
-					new File("uiy viuh vhj v", 7448, true),
-					new File("sdfauighsdvpyu ghasjkn", 8848, true),
-					new File("asduih cuia ;nac", 9548, false),
-					new File("chju kljhuuklh jk;", 348, false),
-					new File("cdailukhu l;hj .n", 448, false),
-					new File("auihy akl;h l;j", 2348, false),
-					new File("caiugh j l;kjlh jcd", 2328, true),
-					new File("auio;h jkh lhjl h ljjhbvj", 2348, true),
-					new File("ajklkja kj lkjh jklh ", 2248, false),
-					new File("asdfkjghfasdkjasdfhjgasdfkjhg", 2348, true),
-					new File("sdafkuyasdfkljh", 2348, false),
-					new File("asdklufhalsdkhlkjhnklj hlh", 2348, true),
-					new File("asdfasdf asdf ", 2348, false),
-					new File("fds sdf", 2348, true),
-					new File(" sdafuh lsdfahj alsdfk hl", 2348, true),
-					new File("sdfahj sdfajk hsdfjkh", 2348, false),
-					new File("sdafkja sdfjkh asdfkhj", 2348, true),
-					new File("sdfakj hasdfljkha sdfljkh sdfa", 348, true),
-					new File("hj ka g", 1334, false),
-					new File("asdfjk hsdfaljkh", 2348, false),
-					new File("asdh gasdflhg ", 3348, true),
-					new File("asd ghasdfkjg sdfkyug ", 4345, true),
-					new File("asdf hjasdflkjh sdfal", 5345, true),
-					new File("asdlfuh afsdhjg fdsalhj", 6648, false),
-					new File("uiy viuh vhj v", 7448, false),
-					new File("sdfauighsdvpyu ghasjkn", 8848, true),
-					new File("asduih cuia ;nac", 9548, false),
-					new File("chju kljhuuklh jk;", 348, true),
-					new File("cdailukhu l;hj .n", 448, true),
-					new File("auihy akl;h l;j", 2348, false),
-					new File("caiugh j l;kjlh jcd", 2328, true),
-					new File("auio;h jkh lhjl h ljjhbvj", 2348, false),
-					new File("ajklkja kj lkjh jklh ", 2248, true),
-			};
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestApplicationWindow.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestApplicationWindow.java
deleted file mode 100644
index fbd0979..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestApplicationWindow.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.window.ApplicationWindow;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A simple application window used for testing various bugs.
- * Insert code as needed to test problems in a raw application
- * window.
- * 
- * Designed to be started as an SWT application.
- * 
- * @since 3.2
- */
-
-public class TestApplicationWindow extends ApplicationWindow {
-
-	public static void main(String[] args) {
-		new TestApplicationWindow().open();
-	}
-
-	public TestApplicationWindow() {
-		super(null);
-		setBlockOnOpen(true);
-		addMenuBar();
-	}
-
-	/*
-	 * Test initial location and size.
-	 * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=96955
-	 */
-	protected Point getInitialLocation(Point initialSize) {
-		return new Point(30, 30);
-	}
-
-	protected Point getInitialSize() {
-		return new Point(150, 150);
-	}
-
-    protected Control createContents(Composite parent) {
-    	// create your contents here
-		Control contents = super.createContents(parent);
-		
-		// fill the menu bar
-    	fillMenuBar();
-    	
-    	return contents;
-	}
-    
-    private void fillMenuBar() {
-    	MenuManager menuManager = getMenuBarManager();
-    	MenuManager fileMenu = new MenuManager("&File");
-		menuManager.add(fileMenu);
-
-		Action loadAction = new Action("&Save") {
-			public void run() {
-				// do nothing
-			}
-		};
-		fileMenu.add(loadAction);
-		menuManager.updateAll(false);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestBrowser.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestBrowser.java
deleted file mode 100644
index 6854e11..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestBrowser.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.tests.viewers.TestElement;
-import org.eclipse.jface.tests.viewers.TestModelChange;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.ApplicationWindow;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.custom.ViewForm;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-public abstract class TestBrowser extends ApplicationWindow {
-    TestElement fInput;
-
-    Viewer fViewer;
-
-    Action fChangeLabelAction;
-
-    Action fChangeInputLabelAction;
-
-    Action fChangeChildLabelAction;
-
-    Action fReloadAction;
-
-    Action fReloadActionLarge;
-
-    Action fReloadActionFlat;
-
-    Action fDeleteAction;
-
-    Action fDeleteChildrenAction;
-
-    Action fDeleteSomeChildrenAction;
-
-    Action fDeleteSiblingsAction;
-
-    Action fFlushInputAction;
-
-    Action fAddElementAction;
-
-    Action fAddSiblingAction;
-
-    Action fAddSiblingRevealAction;
-
-    Action fAddSiblingSelectAction;
-
-    Action fAddChildAction;
-
-    Action fAddChildRevealAction;
-
-    Action fAddChildSelectAction;
-
-    Action fWorldChangedAction;
-
-    Action fSetLabelProvider;
-
-    Action fAddFilterAction;
-
-    Action fResetFilters;
-
-    Action fSetSorter;
-
-    Action fResetSorter;
-
-    Action fClearSelection;
-
-    int fPanes = 1;
-
-    public TestBrowser() {
-        super(null);
-        addMenuBar();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on Window.
-     */
-    protected void configureShell(Shell shell) {
-        super.configureShell(shell);
-        shell.setText("Test Browser");
-    }
-
-    protected void createActions() {
-        fChangeLabelAction = new ChangeLabelAction("Change Label", this);
-        fChangeChildLabelAction = new ChangeChildLabelAction(
-                "Change Child Label", this);
-        //	fChangeInputLabelAction =
-        //		new ChangeInputLabelAction("Change Input Label", this);
-
-        fReloadAction = new CreateModelAction("Reload Test Data (small)", this,
-                3, 10);
-        fReloadActionLarge = new CreateModelAction("Reload Test Data (large)",
-                this, 3, 33);
-        fReloadActionFlat = new CreateModelAction("Reload Test Data (flat)",
-                this, 1, 2000);
-
-        fDeleteAction = new DeleteAction("Delete", this);
-        fDeleteChildrenAction = new DeleteChildrenAction("Delete Children",
-                this, true);
-        fDeleteSomeChildrenAction = new DeleteChildrenAction(
-                "Delete Odd Children", this, false);
-        fDeleteSiblingsAction = new DeleteSiblingsAction("Delete Siblings",
-                this, true);
-
-        fFlushInputAction = new FlushInputAction("Flush Input", this);
-
-        fAddElementAction = new AddElementAction("Add Element to Input", this);
-        fAddSiblingAction = new AddSiblingAction("Add Sibling", this);
-        fAddSiblingRevealAction = new AddSiblingAction(
-                "Add Sibling and Reveal", this, TestModelChange.INSERT
-                        | TestModelChange.REVEAL);
-        fAddSiblingSelectAction = new AddSiblingAction(
-                "Add Sibling and Select", this, TestModelChange.INSERT
-                        | TestModelChange.REVEAL | TestModelChange.SELECT);
-        fAddChildAction = new AddChildAction("Add Child", this);
-        fAddChildRevealAction = new AddChildAction("Add Child and Reveal",
-                this, TestModelChange.INSERT | TestModelChange.REVEAL);
-        fAddChildSelectAction = new AddChildAction("Add Child and Select",
-                this, TestModelChange.INSERT | TestModelChange.REVEAL
-                        | TestModelChange.SELECT);
-
-        fWorldChangedAction = new WorldChangedAction("World Changed", this);
-
-        fSetLabelProvider = new SetLabelProviderAction(
-                "Set Custom Label Provider", this);
-
-        fAddFilterAction = new AddFilterAction("Add Filter", this);
-        fResetFilters = new ResetFilterAction("Reset All Filters", this);
-
-        fSetSorter = new SetSorterAction("Set Sorter", this);
-        fResetSorter = new ResetSorterAction("Reset Sorter", this);
-
-        fClearSelection = new ClearSelectionAction("Clear Selection", this);
-    }
-
-    protected Control createContents(Composite parent) {
-        ViewForm form = new ViewForm(parent, SWT.NONE);
-        CLabel label = new CLabel(form, SWT.NONE);
-        form.setTopLeft(label);
-        Object input = getInput();
-        label.setText(input.toString());
-        if (fPanes == 1) {
-            Viewer viewer = createViewer(form);
-            form.setContent(viewer.getControl());
-            fViewer = viewer;
-            setInput((TestElement) input);
-        } else if (fPanes == 2) {
-            SashForm sashForm = new SashForm(form, SWT.VERTICAL);
-            form.setContent(sashForm);
-            Viewer viewer = createViewer(sashForm);
-            fViewer = viewer;
-            viewer.setInput(input);
-            viewer = createViewer(sashForm);
-            viewer.setInput(input);
-        }
-        createActions();
-        fillMenuBar(getMenuBarManager());
-        viewerFillMenuBar(getMenuBarManager());
-        getMenuBarManager().updateAll(false);
-        return form;
-    }
-
-    public abstract Viewer createViewer(Composite parent);
-
-    protected void fillMenuBar(MenuManager mgr) {
-
-        MenuManager setupMenu = new MenuManager("Setup", "Setup");
-        mgr.add(setupMenu);
-        setupMenu.add(fReloadAction);
-        setupMenu.add(fReloadActionLarge);
-        setupMenu.add(fReloadActionFlat);
-        setupMenu.add(new Separator());
-        setupMenu.add(fFlushInputAction);
-        setupMenu.add(new Separator());
-        setupMenu.add(fSetLabelProvider);
-        setupMenu.add(new Separator());
-        setupMenu.add(fAddFilterAction);
-        setupMenu.add(fResetFilters);
-        setupMenu.add(new Separator());
-        setupMenu.add(fSetSorter);
-        setupMenu.add(fResetSorter);
-
-        MenuManager testMenu = new MenuManager("Tests", "Tests");
-        mgr.add(testMenu);
-        testMenu.add(fChangeLabelAction);
-        testMenu.add(fChangeChildLabelAction);
-        //	testMenu.add(fChangeInputLabelAction);
-        testMenu.add(new Separator());
-
-        testMenu.add(fDeleteAction);
-        testMenu.add(fDeleteChildrenAction);
-        testMenu.add(fDeleteSomeChildrenAction);
-        testMenu.add(fDeleteSiblingsAction);
-        testMenu.add(new Separator());
-
-        testMenu.add(fAddElementAction);
-        testMenu.add(new Separator());
-
-        testMenu.add(fAddSiblingAction);
-        testMenu.add(fAddSiblingRevealAction);
-        testMenu.add(fAddSiblingSelectAction);
-        testMenu.add(new Separator());
-
-        testMenu.add(fAddChildAction);
-        testMenu.add(fAddChildRevealAction);
-        testMenu.add(fAddChildSelectAction);
-        testMenu.add(new Separator());
-
-        testMenu.add(fClearSelection);
-        testMenu.add(new Separator());
-
-        testMenu.add(fWorldChangedAction);
-        //	((TestTree)this).testTreeFillMenuBar(testMenu);
-    }
-
-    public TestElement getInput() {
-        return fInput;
-    }
-
-    public Viewer getViewer() {
-        return fViewer;
-    }
-
-    public Composite getViewerContainer() {
-        return null;
-    }
-
-    public void open(TestElement input) {
-    	setInput(input);
-        super.open();
-    }
-
-    public void setInput(TestElement input) {
-        fInput = input;
-        if (getViewer() != null)
-            getViewer().setInput(input);
-    }
-
-    public void show2Panes() {
-        fPanes = 2;
-    }
-
-    protected abstract void viewerFillMenuBar(MenuManager mgr);
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestBrowserAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestBrowserAction.java
deleted file mode 100644
index 1778e61..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestBrowserAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.action.Action;
-
-public abstract class TestBrowserAction extends Action {
-    private TestBrowser browser;
-
-    public TestBrowserAction(String label, TestBrowser browser) {
-        super(label);
-        this.browser = browser;
-    }
-
-    /**
-     * Returns the test browser.
-     */
-    public TestBrowser getBrowser() {
-        return browser;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestCheckboxTree.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestCheckboxTree.java
deleted file mode 100644
index 7110e57..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestCheckboxTree.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestElement;
-import org.eclipse.jface.tests.viewers.TestLabelProvider;
-import org.eclipse.jface.tests.viewers.TestModelContentProvider;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ITreeViewerListener;
-import org.eclipse.jface.viewers.TreeExpansionEvent;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Composite;
-
-public class TestCheckboxTree extends TestTree {
-    CheckboxTreeViewer fCheckboxViewer;
-
-    public TestCheckboxTree() {
-        super();
-    }
-
-    public void checkChildren(TestElement element, boolean state) {
-        int numChildren = element.getChildCount();
-        for (int i = 0; i < numChildren; i++) {
-            TestElement child = element.getChildAt(i);
-            if (fCheckboxViewer.setChecked(child, state))
-                checkChildren(child, state);
-        }
-    }
-
-    public Viewer createViewer(Composite parent) {
-        CheckboxTreeViewer viewer = new CheckboxTreeViewer(parent);
-        viewer.setContentProvider(new TestModelContentProvider());
-        viewer.setLabelProvider(new TestLabelProvider());
-
-        viewer.addTreeListener(new ITreeViewerListener() {
-            public void treeExpanded(TreeExpansionEvent e) {
-                handleTreeExpanded((TestElement) e.getElement());
-            }
-
-            public void treeCollapsed(TreeExpansionEvent e) {
-            }
-        });
-
-        viewer.addCheckStateListener(new ICheckStateListener() {
-            public void checkStateChanged(CheckStateChangedEvent e) {
-                checkChildren((TestElement) e.getElement(), e.getChecked());
-            }
-        });
-
-        fCheckboxViewer = viewer;
-        fViewer = viewer;
-        return viewer;
-    }
-
-    public void handleTreeExpanded(TestElement element) {
-        // apply the same check recursively to all children
-        boolean checked = fCheckboxViewer.getChecked(element);
-        int numChildren = element.getChildCount();
-        for (int i = 0; i < numChildren; i++) {
-            TestElement child = element.getChildAt(i);
-            fCheckboxViewer.setChecked(child, checked);
-        }
-    }
-
-    public static void main(String[] args) {
-        TestBrowser browser = new TestCheckboxTree();
-        if (args.length > 0 && args[0].equals("-twopanes"))
-            browser.show2Panes();
-        browser.setBlockOnOpen(true);
-        browser.open(TestElement.createModel(3, 10));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestLazyVirtualTree.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestLazyVirtualTree.java
deleted file mode 100644
index c2c897f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestLazyVirtualTree.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestElement;
-import org.eclipse.jface.tests.viewers.TestModelLazyTreeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-public class TestLazyVirtualTree extends TestTree {
-
-	public Viewer createViewer(Composite parent) {
-		Tree tree = new Tree(parent, SWT.VIRTUAL);
-		tree.addListener(SWT.SetData, new Listener() {
-			private String getPosition(TreeItem item) {
-				TreeItem parentItem = item.getParentItem();
-				if (parentItem == null) {
-					return "" + item.getParent().indexOf(item);
-				}
-				return getPosition(parentItem) + "." + parentItem.indexOf(item);
-			}
-
-			public void handleEvent(Event event) {
-				String position = getPosition((TreeItem) event.item);
-				System.out.println("updating " + position);
-			}
-		});
-		TreeViewer viewer = new TreeViewer(tree);
-		viewer.setContentProvider(new TestModelLazyTreeContentProvider(viewer));
-		viewer.setUseHashlookup(true);
-
-		if (fViewer == null)
-			fViewer = viewer;
-		return viewer;
-	}
-	
-	public void setInput(TestElement input) {
-		if(fViewer!=null) {
-			Object oldInput = fViewer.getInput();
-			if(oldInput!=null) {
-				fViewer.setChildCount(oldInput, 0);
-			}
-		}
-		super.setInput(input);
-		if(fViewer!=null && input!=null) {
-			fViewer.setChildCount(input, input.getChildCount());
-		}
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		TestBrowser browser = new TestLazyVirtualTree();
-		if (args.length > 0 && args[0].equals("-twopanes"))
-			browser.show2Panes();
-		browser.setBlockOnOpen(true);
-		browser.open(TestElement.createModel(3, 10));
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestList.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestList.java
deleted file mode 100644
index 959788c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestList.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.tests.viewers.TestElement;
-import org.eclipse.jface.tests.viewers.TestModelContentProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Composite;
-
-public class TestList extends TestBrowser {
-    public Viewer createViewer(Composite parent) {
-        ListViewer viewer = new ListViewer(parent);
-        viewer.setUseHashlookup(true);
-        viewer.setContentProvider(new TestModelContentProvider());
-        return viewer;
-    }
-
-    public static void main(String[] args) {
-        TestList browser = new TestList();
-        browser.setBlockOnOpen(true);
-        browser.open(TestElement.createModel(3, 10));
-    }
-
-    /**
-     * 
-     */
-    protected void viewerFillMenuBar(MenuManager mgr) {
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestSelectionAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestSelectionAction.java
deleted file mode 100644
index 595b10e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestSelectionAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestElement;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-
-public abstract class TestSelectionAction extends TestBrowserAction implements
-        ISelectionChangedListener {
-    public TestSelectionAction(String label, TestBrowser browser) {
-        super(label, browser);
-        browser.getViewer().addSelectionChangedListener(this);
-        setEnabled(false);
-    }
-
-    public TestElement getTestElement(ISelection selection) {
-        if (selection instanceof IStructuredSelection) {
-            return (TestElement) ((IStructuredSelection) selection)
-                    .getFirstElement();
-        }
-        return null;
-    }
-
-    /**
-     * Overridden from Action.
-     */
-    public void run() {
-        TestElement testElement = getTestElement(getBrowser().getViewer()
-                .getSelection());
-        if (testElement != null) {
-            run(testElement);
-        }
-    }
-
-    /**
-     * The default implementation calls run(TestElement)
-     * on every element contained in the vector.
-     */
-    public void run(TestElement o) {
-    }
-
-    public void selectionChanged(SelectionChangedEvent event) {
-        setEnabled(!event.getSelection().isEmpty());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestTable.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestTable.java
deleted file mode 100644
index 4df5e8a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestTable.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.tests.viewers.TestElement;
-import org.eclipse.jface.tests.viewers.TestLabelProvider;
-import org.eclipse.jface.tests.viewers.TestModelContentProvider;
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TableColumn;
-
-public class TestTable extends TestBrowser {
-
-    public Viewer createViewer(Composite parent) {
-        TableViewer viewer = new TableViewer(parent);
-        viewer.setContentProvider(new TestModelContentProvider());
-        viewer.setLabelProvider(new TestLabelProvider());
-        viewer.getTable().setLinesVisible(true);
-
-        TableLayout layout = new TableLayout();
-        viewer.getTable().setLayout(layout);
-        viewer.getTable().setHeaderVisible(true);
-        String headers[] = { "Label Column", "Second Column" };
-
-        ColumnLayoutData layouts[] = { new ColumnWeightData(100, false),
-                new ColumnWeightData(100, false) };
-
-        final TableColumn columns[] = new TableColumn[headers.length];
-
-        for (int i = 0; i < headers.length; i++) {
-            layout.addColumnData(layouts[i]);
-            TableColumn tc = new TableColumn(viewer.getTable(), SWT.NONE, i);
-            tc.setResizable(layouts[i].resizable);
-            tc.setText(headers[i]);
-            columns[i] = tc;
-        }
-
-        viewer.setUseHashlookup(true);
-
-        return viewer;
-    }
-
-    public static void main(String[] args) {
-        TestTable browser = new TestTable();
-        browser.setBlockOnOpen(true);
-        browser.open(TestElement.createModel(3, 10));
-    }
-
-    /**
-     * 
-     */
-    protected void viewerFillMenuBar(MenuManager mgr) {
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestTableTree.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestTableTree.java
deleted file mode 100644
index e7164d6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestTableTree.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.tests.viewers.TestElement;
-import org.eclipse.jface.tests.viewers.TestModelContentProvider;
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableTreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TableColumn;
-
-public class TestTableTree extends TestBrowser {
-
-    TableTreeViewer fViewer;
-
-    Action fExpandAllAction;
-
-    public TestTableTree() {
-        super();
-        fExpandAllAction = new ExpandAllAction("Expand All", this);
-    }
-
-    public Viewer createViewer(Composite parent) {
-        TableTreeViewer viewer = new TableTreeViewer(parent);
-        viewer.setContentProvider(new TestModelContentProvider());
-        viewer.setLabelProvider(new TestTableTreeLabelProvider());
-        viewer.getTableTree().getTable().setLinesVisible(true);
-
-        TableLayout layout = new TableLayout();
-        viewer.getTableTree().getTable().setLayout(layout);
-        viewer.getTableTree().getTable().setHeaderVisible(true);
-        String headers[] = { "First Column", "Second Column" };
-
-        ColumnLayoutData layouts[] = { new ColumnWeightData(100),
-                new ColumnWeightData(100) };
-
-        final TableColumn columns[] = new TableColumn[headers.length];
-
-        for (int i = 0; i < headers.length; i++) {
-            layout.addColumnData(layouts[i]);
-            TableColumn tc = new TableColumn(viewer.getTableTree().getTable(),
-                    SWT.NONE, i);
-            tc.setResizable(layouts[i].resizable);
-            tc.setText(headers[i]);
-            columns[i] = tc;
-        }
-        if (fViewer == null)
-            fViewer = viewer;
-
-        return viewer;
-    }
-
-    public static void main(String[] args) {
-        TestBrowser browser = new TestTableTree();
-        if (args.length > 0 && args[0].equals("-twopanes"))
-            browser.show2Panes();
-        browser.setBlockOnOpen(true);
-        browser.open(TestElement.createModel(3, 10));
-    }
-
-    /**
-     * Adds the expand all action to the tests menu.
-     */
-    protected void viewerFillMenuBar(MenuManager mgr) {
-        MenuManager testMenu = (MenuManager) (mgr.findMenuUsingPath("tests"));
-        testMenu.add(new Separator());
-        testMenu.add(fExpandAllAction);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestTableTreeLabelProvider.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestTableTreeLabelProvider.java
deleted file mode 100644
index 476abd3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestTableTreeLabelProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestLabelProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-public class TestTableTreeLabelProvider extends TestLabelProvider implements
-        ITableLabelProvider {
-    /**
-     * Returns the label image for a given column.
-     *
-     * @param element the object representing the entire row. Can be 
-     *     <code>null</code> indicating that no input object is set in the viewer.
-     * @param columnIndex the index of the column in which the label appears. Numbering is zero based.
-     */
-    public Image getColumnImage(Object element, int columnIndex) {
-        return getImage();
-    }
-
-    /**
-     * Returns the label text for a given column.
-     *
-     * @param element the object representing the entire row. Can be 
-     *     <code>null</code> indicating that no input object is set in the viewer.
-     * @param columnIndex the index of the column in which the label appears. Numbering is zero based.
-     */
-    public String getColumnText(Object element, int columnIndex) {
-        if (element != null)
-            return element.toString() + " column " + columnIndex;
-        return null;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestTree.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestTree.java
deleted file mode 100644
index 4c2e0f7..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestTree.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.tests.viewers.TestElement;
-import org.eclipse.jface.tests.viewers.TestModelContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Composite;
-
-public class TestTree extends TestBrowser {
-    TreeViewer fViewer;
-
-    Action fExpandAllAction;
-
-    public TestTree() {
-        super();
-        fExpandAllAction = new ExpandAllAction("Expand All", this);
-    }
-
-    /**
-     * 
-     */
-    public Viewer createViewer(Composite parent) {
-        TreeViewer viewer = new TreeViewer(parent);
-        viewer.setContentProvider(new TestModelContentProvider());
-        viewer.setUseHashlookup(true);
-
-        if (fViewer == null)
-            fViewer = viewer;
-        return viewer;
-    }
-
-    public static void main(String[] args) {
-        TestBrowser browser = new TestTree();
-        if (args.length > 0 && args[0].equals("-twopanes"))
-            browser.show2Panes();
-        browser.setBlockOnOpen(true);
-        browser.open(TestElement.createModel(3, 10));
-    }
-
-    public void testTreeFillMenuBar(MenuManager testMenu) {
-
-    }
-
-    /**
-     * Adds the expand all action to the tests menu.
-     */
-    protected void viewerFillMenuBar(MenuManager mgr) {
-        MenuManager testMenu = (MenuManager) (mgr.findMenuUsingPath("tests"));
-        testMenu.add(new Separator());
-        testMenu.add(fExpandAllAction);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestVirtualTree.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestVirtualTree.java
deleted file mode 100644
index f227105..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/TestVirtualTree.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.tests.viewers.TestElement;
-import org.eclipse.jface.tests.viewers.TestModelContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-public class TestVirtualTree extends TestTree {
-
-	public Viewer createViewer(Composite parent) {
-		Tree tree = new Tree(parent, SWT.VIRTUAL);
-		tree.addListener(SWT.SetData, new Listener() {
-			private String getPosition(TreeItem item) {
-				TreeItem parentItem = item.getParentItem();
-				if (parentItem == null) {
-					return "" + item.getParent().indexOf(item);
-				}
-				return getPosition(parentItem) + "." + parentItem.indexOf(item);
-			}
-
-			public void handleEvent(Event event) {
-				String position = getPosition((TreeItem) event.item);
-				if (position.endsWith(".32"))
-					Thread.dumpStack();
-				System.out.println("updating " + position);
-			}
-		});
-		TreeViewer viewer = new TreeViewer(tree);
-		viewer.setContentProvider(new TestModelContentProvider());
-		viewer.setUseHashlookup(true);
-
-		if (fViewer == null)
-			fViewer = viewer;
-		return viewer;
-	}
-
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		TestBrowser browser = new TestVirtualTree();
-		if (args.length > 0 && args[0].equals("-twopanes"))
-			browser.show2Panes();
-		browser.setBlockOnOpen(true);
-		browser.open(TestElement.createModel(3, 10));
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/VirtualTableView.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/VirtualTableView.java
deleted file mode 100644
index ddf2d7c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/VirtualTableView.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * The is a test VirtualTableView of the support for SWT.VIRTUAL in JFace.
- * 
- * @since 3.1
- */
-public class VirtualTableView extends ViewPart {
-
-	TableViewer viewer;
-
-	int itemCount = 10000;
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public VirtualTableView() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-
-		viewer = new TableViewer(parent, SWT.VIRTUAL);
-		viewer.setContentProvider(getContentProvider());
-		viewer.setInput(this);
-		viewer.setItemCount(itemCount);
-		
-		Composite buttonComposite = new Composite(parent,SWT.NONE);
-		buttonComposite.setLayout(new GridLayout());
-
-		Button resetInput = new Button(buttonComposite,SWT.PUSH);
-		resetInput.setText("Reset input");
-		resetInput.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e){
-				resetInput();
-			}
-		});
-		
-		Button delete = new Button(buttonComposite, SWT.PUSH);
-		delete.setText("Delete selection");
-		delete.addSelectionListener(new SelectionAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				Object[] selection = ((IStructuredSelection) viewer.getSelection()).toArray();
-				doRemove(selection, viewer.getTable().getSelectionIndices());
-			}
-		});
-
-	}
-
-	protected void doRemove(Object[] selection, int[] selectionIndices) {
-		viewer.remove(selection);
-	}
-
-	/**
-	 * Get the content provider for the receiver.
-	 * 
-	 * @return IContentProvider
-	 */
-	protected IContentProvider getContentProvider() {
-		return new IStructuredContentProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-			 */
-			public void dispose() {
-				// Nothing to do here.
-
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-			 */
-			public Object[] getElements(Object inputElement) {
-				String[] elements = new String[itemCount];
-				for (int i = 0; i < itemCount; i++) {
-					elements[i] = "Element " + String.valueOf(i);
-				}
-				return elements;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-			 *      java.lang.Object, java.lang.Object)
-			 */
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-				// Nothing to do here.
-
-			}
-		};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		viewer.getTable().setFocus();
-
-	}
-
-	/**
-	 * Reset the input of the view.
-	 */
-	protected void resetInput() {
-		viewer.setInput(this);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/WorldChangedAction.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/WorldChangedAction.java
deleted file mode 100644
index edbb80c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/viewers/interactive/WorldChangedAction.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jface.tests.viewers.interactive;
-
-import org.eclipse.jface.viewers.StructuredViewer;
-
-public class WorldChangedAction extends TestBrowserAction {
-
-    public WorldChangedAction(String label, TestBrowser browser) {
-        super(label, browser);
-    }
-
-    public void run() {
-        ((StructuredViewer) getBrowser().getViewer()).refresh();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/wizards/TheTestWizard.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/wizards/TheTestWizard.java
deleted file mode 100644
index 3898fa9..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/wizards/TheTestWizard.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.tests.wizards;
-
-import org.eclipse.jface.wizard.Wizard;
-
-
-public class TheTestWizard extends Wizard {
-	public TheTestWizardPage page1;
-	public TheTestWizardPage page2;
-	public TheTestWizardPage page3;
-	public final String page1Name = "PAGE1";
-	public final String page2Name = "PAGE2";
-	public final String page3Name = "PAGE3";
-	
-	public TheTestWizard() {
-		super();
-		setNeedsProgressMonitor(true);
-	}
-	
-	/**
-	 * Adding the page to the wizard.
-	 */
-
-	public void addPages() {
-		page1 = new TheTestWizardPage(page1Name);
-		addPage(page1);
-		page2 = new TheTestWizardPage(page2Name);
-		addPage(page2);
-		page3 = new TheTestWizardPage(page3Name);
-		addPage(page3);
-	}
-
-	/**
-	 * This method is called when 'Finish' button is pressed in
-	 * the wizard. 
-	 */
-	public boolean performFinish() {
-		WizardTest.DID_FINISH = true;
-		return true;
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/wizards/TheTestWizardDialog.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/wizards/TheTestWizardDialog.java
deleted file mode 100644
index aec2b72..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/wizards/TheTestWizardDialog.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.wizards;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * The purpose of this class is to expose WizardDialog internals for testing
- */
-public class TheTestWizardDialog extends WizardDialog {
-
-	/**
-	 * @param parentShell
-	 * @param newWizard
-	 */
-	public TheTestWizardDialog(Shell parentShell, IWizard newWizard) {
-		super(parentShell, newWizard);
-		setBlockOnOpen(false);
-	}
-
-	public Button getFinishedButton() {
-		return getButton(IDialogConstants.FINISH_ID);
-	}
-	
-	public Button getCancelButton() {
-		return getButton(IDialogConstants.CANCEL_ID);
-	}
-
-	public Button getBackButton() {
-		return getButton(IDialogConstants.BACK_ID);
-	}
-	
-	public Button getNextButton() {
-		return getButton(IDialogConstants.NEXT_ID);
-	}
-	
-	public void finishPressed() {
-		super.finishPressed();
-	}
-	public void cancelPressed() {
-		super.cancelPressed();
-	}
-	public void backPressed() {
-		super.backPressed();
-	}
-	public void nextPressed() {
-		super.nextPressed();
-	}
-	public void buttonPressed(int buttonId) {
-		super.buttonPressed(buttonId);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/wizards/TheTestWizardPage.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/wizards/TheTestWizardPage.java
deleted file mode 100644
index ffcfc9d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/wizards/TheTestWizardPage.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.wizards;
-
-import org.eclipse.jface.dialogs.IDialogPage;
-import org.eclipse.jface.wizard.WizardPage;
-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;
-
-public class TheTestWizardPage extends WizardPage {
-	public static final String BAD_TEXT_FIELD_CONTENTS = "BAD VALUE";
-	public static final String BAD_TEXT_FIELD_STATUS = "A bad value was entered";
-	public static final String GOOD_TEXT_FIELD_CONTENTS = "GOOD VALUE";
-	public Text textInputField;
-
-	public TheTestWizardPage(String name) {
-		super(name);
-	}
-
-	/**
-	 * @see IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		container.setLayout(layout);
-		layout.numColumns = 2;
-		layout.verticalSpacing = 9;
-		Label label = new Label(container, SWT.NULL);
-		label.setText(getName());
-
-		textInputField = new Text(container, SWT.BORDER | SWT.SINGLE);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		textInputField.setLayoutData(gd);
-		textInputField.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				dialogChanged();
-			}
-		});
-		
-		initialize();
-		dialogChanged();
-		setControl(container);
-	}
-
-	private void initialize() {}
-
-
-	/**
-	 * Handle dialog values changing
-	 */
-
-	private void dialogChanged() {
-		if (textInputField.getText().equals(BAD_TEXT_FIELD_CONTENTS)) {
-			setPageComplete(false);
-			updateStatus(BAD_TEXT_FIELD_STATUS);
-			return;
-		}
-		//any other value, including no value, is good
-		setPageComplete(true);
-		updateStatus(null);
-	}
-
-	private void updateStatus(String message) {
-		setErrorMessage(message);
-		setPageComplete(message == null);
-	}
-
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/wizards/WizardTest.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/wizards/WizardTest.java
deleted file mode 100644
index 927d3ea..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/wizards/WizardTest.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jface.tests.wizards;
-
-import java.io.IOException;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IPageChangedListener;
-import org.eclipse.jface.dialogs.IPageChangingListener;
-import org.eclipse.jface.dialogs.PageChangedEvent;
-import org.eclipse.jface.dialogs.PageChangingEvent;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-public class WizardTest extends TestCase {
-	/**
-	 * 
-	 */
-	protected static final int NUM_PAGES = 3;
-
-	static boolean DID_FINISH = false; //accessed from this test AND wizard
-
-	protected final static String WIZARD_TITLE = "TEST WIZARD TITLE";
-	protected final static String PAGE_TITLE = "TEST PAGE TITLE";
-	protected RGB color1;
-	protected RGB color2;
-	
-	protected TheTestWizard wizard;
-	protected TheTestWizardDialog dialog;
-	
-	boolean pageChanged = false;
-	boolean pageChangingFired = false;
-
-	
-	public WizardTest() {
-		super("NewWizardTest");
-	}
-
-
-	public void testEndingWithFinish() throws IOException {
-		//test page count
-        assertEquals("Wizard has wrong number of pages", NUM_PAGES, wizard.getPageCount());
-
-        //test page name
-        assertEquals("WizardPage.getName() returned wrong name", wizard.page1Name, wizard.page1.getName());
-
-        //test getPage()
-        assertSame("Wizard.getPage() returned wrong page", wizard.getPage(wizard.page1Name), wizard.page1);
-
-		//test title
-		wizard.setWindowTitle(WIZARD_TITLE);
-        assertEquals("Wizard has wrong title", wizard.getWindowTitle(), WIZARD_TITLE);
-        wizard.page1.setTitle(PAGE_TITLE);
-        assertEquals("Wizard has wrong title", wizard.page1.getTitle(), PAGE_TITLE);
-        
-        //set+test color twice to ensure initial color didn't happen to be color1
-        wizard.setTitleBarColor(color1);
-        assertEquals("Wizard has wrong title color", wizard.getTitleBarColor(), color1);
-        wizard.setTitleBarColor(color2);
-        assertEquals("Wizard has wrong title color", wizard.getTitleBarColor(), color2);
-        
-        //test on starting page
-		assertSame("Wizard has wrong starting page", wizard.page1, wizard.getStartingPage());
-		assertSame("Wizard not on starting page", wizard.page1, dialog.getCurrentPage());
-
-		//test getMessage() 
-        assertSame("WizardPage error message should be null", null, wizard.page1.getErrorMessage());
-		wizard.page1.textInputField.setText(TheTestWizardPage.BAD_TEXT_FIELD_CONTENTS);
-        assertEquals("WizardPage error message set correctly", TheTestWizardPage.BAD_TEXT_FIELD_STATUS, wizard.page1.getErrorMessage());
-
-        //test page completion
-		wizard.page1.textInputField.setText(TheTestWizardPage.GOOD_TEXT_FIELD_CONTENTS);
-        assertEquals("Page should be completed", true, wizard.page1.canFlipToNextPage());
-        //Setting good value should've cleared the error message
-        assertSame("WizardPage error message should be null", null, wizard.page1.getErrorMessage());
-
-        //test getNextPage() without page changes
-        assertSame("WizardPage.getNexPage() wrong page", wizard.page2, wizard.page1.getNextPage());
-        assertSame("Wizard.getNexPage() wrong page", wizard.page2, wizard.getNextPage(wizard.page1));
-        assertSame("WizardPage.getPreviousPage() wrong page", wizard.page1, wizard.page2.getPreviousPage());
-        assertSame("Wizard.getPreviousPage() wrong page", wizard.page1, wizard.getPreviousPage(wizard.page2));
-        assertSame("WizardPage.getNexPage() wrong page", wizard.page3, wizard.page2.getNextPage());
-        assertSame("Wizard.getPreviousPage() wrong page", wizard.page2, wizard.getPreviousPage(wizard.page3));
-	
-        //test canFinish()
-        wizard.page2.textInputField.setText(TheTestWizardPage.BAD_TEXT_FIELD_CONTENTS);
-        assertEquals("Wizard should not be able to finish", false, wizard.canFinish());
-        wizard.page2.textInputField.setText(TheTestWizardPage.GOOD_TEXT_FIELD_CONTENTS);
-        assertEquals("Wizard should be able to finish", true, wizard.canFinish());
-
-		//test simulated Finish button hit
-		//TheTestWizard's performFinish() sets DID_FINISH to true
-		dialog.finishPressed();
-        assertEquals("Wizard didn't perform finish", true, DID_FINISH);
-	}
-	
-	public void testEndingWithCancel() throws IOException {
-		assertSame("Wizard not on starting page", wizard.page1, dialog.getCurrentPage());
-
-		//TheTestWizard's performFinish() sets DID_FINISH to true, ensure it was not called
-		wizard.performCancel();
-        assertEquals("Wizard finished but should not have", false, DID_FINISH);
-
-        dialog.cancelPressed();
-        assertEquals("Wizard performed finished but should not have", false, DID_FINISH);
-	}
-
-	public void testPageChanging() throws IOException {    
-		//initially on first page
-	    assertSame("Wizard started on wrong page", wizard.page1, dialog.getCurrentPage());  
-		assertEquals("Back button should be disabled on first page", false, dialog.getBackButton().getEnabled());
-		assertEquals("Next button should be enabled on first page", true, dialog.getNextButton().getEnabled());
-
-		//move to middle page 2
-		dialog.nextPressed();
-	    assertSame("Wizard.nextPressed() set wrong page", wizard.page2, dialog.getCurrentPage());
-		assertEquals("Back button should be enabled on middle page", true, dialog.getBackButton().getEnabled());
-		assertEquals("Next button should be enabled on middle page", true, dialog.getNextButton().getEnabled());
-		
-		//test that can't complete by inserting bad value to be validated
-		wizard.page2.textInputField.setText(TheTestWizardPage.BAD_TEXT_FIELD_CONTENTS);
-		assertEquals("Finish should be disabled when bad field value", false, dialog.getFinishedButton().getEnabled());
-		assertEquals("Cancel should always be enabled", true, dialog.getCancelButton().getEnabled());
-		
-		//test that can complete by inserting good value to be validated
-        wizard.page2.textInputField.setText(TheTestWizardPage.GOOD_TEXT_FIELD_CONTENTS);
-		assertEquals("Finish should be enabled when good field value", true, dialog.getFinishedButton().getEnabled());
-
-		//move to last page 3
-		dialog.nextPressed();
-	    assertSame("Wizard.nextPressed() set wrong page", wizard.page3, dialog.getCurrentPage());
-		assertEquals("Back button should be enabled on last page", true, dialog.getBackButton().getEnabled());
-		assertEquals("Next button should be disenabled on last page", false, dialog.getNextButton().getEnabled());
-		
-		//move back to page 2
-		dialog.backPressed();
-	    assertSame("Wizard.backPressed() set wrong page", wizard.page2, dialog.getCurrentPage());
-		assertEquals("Back button should be enabled on middle page", true, dialog.getBackButton().getEnabled());
-		assertEquals("Next button should be enabled on middle page", true, dialog.getNextButton().getEnabled());
-
-		//move back to page 1
-		dialog.backPressed();
-	    assertSame("Wizard.backPressed() set wrong page", wizard.page1, dialog.getCurrentPage());  
-		assertEquals("Back button should be disabled on first page", false, dialog.getBackButton().getEnabled());
-		assertEquals("Next button should be enabled on first page", true, dialog.getNextButton().getEnabled());
-		
-		//move Next to page 2
-		dialog.buttonPressed(IDialogConstants.NEXT_ID);
-	    assertSame("Wizard.backPressed() set wrong page", wizard.page2, dialog.getCurrentPage());
-		//move Back to page 1
-		dialog.buttonPressed(IDialogConstants.BACK_ID);
-	    assertSame("Wizard.backPressed() set wrong page", wizard.page1, dialog.getCurrentPage());  	    
-	}
-	
-	public void testShowPage() throws IOException {    
-		//move to page 3
-		dialog.nextPressed();
-		dialog.nextPressed();
-	    assertSame("Wizard.nextPressed() set wrong page", wizard.page3, dialog.getCurrentPage());
-
-	    //showPage() back to page 1
-		dialog.showPage(wizard.page1);
-
-		assertSame("Wizard.showPage() set wrong page", wizard.page1, dialog.getCurrentPage());
-		
-		//TODO Next test fails due to bug #249369
-//		assertEquals("Back button should be disabled on first page", false, dialog.getBackButton().getEnabled());
-		assertEquals("Next button should be enabled on first page", true, dialog.getNextButton().getEnabled());
-	}
-
-	public void testPageChangeListening() throws IOException {   
-		pageChanged = false;
-		pageChangingFired = false;
-		
-		IPageChangedListener changedListener = new IPageChangedListener() {
-			public void pageChanged(PageChangedEvent event) {
-				pageChanged = true;				
-			}
-			
-		};
-
-		IPageChangingListener changingListener = new IPageChangingListener() {
-			public void handlePageChanging(PageChangingEvent event) {
-				assertEquals("Page should not have changed yet", false, pageChanged);
-				pageChangingFired = true;
-			}
-		
-		};
-		
-		//test that listener notifies us of page change
-		dialog.addPageChangedListener(changedListener);
-		dialog.addPageChangingListener(changingListener); //assert is in the listener
-		assertEquals("Page change notified unintentially", false, pageChanged);	
-		//change to page 2
-		dialog.nextPressed();
-		assertEquals("Wasn't notified of page change", true, pageChanged);
-		assertEquals("Wasn't notified of page changing", true, pageChangingFired);
-
-		dialog.removePageChangingListener(changingListener); //if not removed, its assert will fail on next nextPressed()
-		//change to page 2
-		dialog.nextPressed();
-
-		//test with listener removed
-		pageChanged = false;
-		dialog.removePageChangedListener(changedListener);
-		//change to page 3
-		dialog.nextPressed();
-		assertEquals("Page change notified unintentially", false, pageChanged);
-	}
-	
-	//----------------------------------------------------
-
-	
-	protected void setUp() throws Exception {
-		// TODO Auto-generated method stub
-		super.setUp();
-		DID_FINISH = false;
-		color1 = new RGB(255, 0, 0);
-		color2 = new RGB(0, 255, 0);
-		
-		createWizardDialog();
-	}
-
-	protected void tearDown() throws Exception {
-		if(dialog.getShell() != null && ! dialog.getShell().isDisposed()) {
-		    dialog.close();
-		}		
-	}
-	
-	//Create and open the wizard 
-	protected void createWizardDialog() {
-		//ensure we've initialized a display for this thread
-		Display.getDefault();
-        
-		wizard = new TheTestWizard();
-        dialog = new TheTestWizardDialog(null, wizard);
-        dialog.create();
-        
-        dialog.open();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/wizards/WizardTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/wizards/WizardTestSuite.java
deleted file mode 100644
index ced834d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/wizards/WizardTestSuite.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jface.tests.wizards;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class WizardTestSuite extends TestSuite {
-
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(suite());
-    }
-
-    public static Test suite() {
-        return new WizardTestSuite();
-    }
-
-    public WizardTestSuite() {
-    	addTestSuite(WizardTest.class);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/ui/tests/propertyPages/TestPropertyPage.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/ui/tests/propertyPages/TestPropertyPage.java
deleted file mode 100644
index 2f797e7..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/ui/tests/propertyPages/TestPropertyPage.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.propertyPages;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IWorkbenchPropertyPage;
-import org.eclipse.ui.dialogs.PropertyPage;
-
-public class TestPropertyPage extends PropertyPage implements
-		IWorkbenchPropertyPage {
-
-	public TestPropertyPage() {
-		//Create a new instance of the receiver
-	}
-
-	protected Control createContents(Composite parent) {
-		Label label = new Label(parent,SWT.NONE);
-		label.setText("Test page");
-		return label;
-		
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/ui/tests/session/NonRestorableView.java b/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/ui/tests/session/NonRestorableView.java
deleted file mode 100644
index 309b360..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/ui/tests/session/NonRestorableView.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Versant Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Versant Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.session;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.part.ViewPart;
-
-public class NonRestorableView extends ViewPart {
-
-	public NonRestorableView() {
-		// TODO Auto-generated constructor stub
-	}
-
-	public void createPartControl(Composite parent) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void setFocus() {
-		// TODO Auto-generated method stub
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/EditorsReferencesTest.java b/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/EditorsReferencesTest.java
deleted file mode 100644
index a9a56ad..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/EditorsReferencesTest.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation 
- *******************************************************************************/
-package org.eclipse.ui.parts.tests;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.util.PrefUtil;
-import org.eclipse.ui.parts.tests.util.PartsTestUtil;
-import org.eclipse.ui.parts.tests.util.PartsWorkbenchAdvisor;
-
-/**
- * Test case to ensure that editor references are created when neededed. Also
- * ensures that zooming behaves correctly on start up (Bug 64043).
- */
-public class EditorsReferencesTest extends TestCase {
-
-    private Display display;
-
-    /**
-     * Constructor.
-     * 
-     * @param testName
-     *            The test's name.
-     */
-    public EditorsReferencesTest(String testName) {
-        super(testName);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see junit.framework.TestCase#setUp()
-     */
-    protected void setUp() throws Exception {
-        super.setUp();
-        createDisplay();
-    }
-
-	private void createDisplay() {
-		display = PlatformUI.createDisplay();
-	}
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see junit.framework.TestCase#tearDown()
-     */
-    protected void tearDown() throws Exception {
-        disposeDisplay();
-        super.tearDown();
-    }
-
-	private void disposeDisplay() {
-		display.dispose();
-		display = null;
-	}
-
-    /**
-     * Test that only file0's part has been created (ideally).
-     *  
-     */
-    public void testActivePartFile0() {
-        openEditors(0);
-        newDisplay();
-        checkEditorsParts(0);
-
-    }
-
-    /**
-     * Test that only file1's part has been created (ideally).
-     *  
-     */
-    public void testActivePartFile1() {
-        openEditors(1);
-        newDisplay();
-        checkEditorsParts(1);
-
-    }
-
-    /**
-     * Test that only file2's part has been created (ideally).
-     *  
-     */
-    public void testActivePartFile2() {
-        openEditors(2);
-        newDisplay();
-        checkEditorsParts(2);
-
-    }
-
-    /**
-     * Test that zooming file0 on start up and navigating to other editors
-     * behaves correcly.
-     *  
-     */
-    public void testZoomActivePartFile0() {
-		// These tests are hard-wired to the pre-3.3 zoom behaviour
-		// Run them anyway to ensure that we preserve the 3.0 mechanism
-        IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore();
-        boolean curMinMaxState = apiStore.getBoolean(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX);
-        apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, false);
-        
-        openEditors(0);
-        newDisplay();
-        zoomEditor(0);
-        
-        // Restore the previous state (just in case)
-        apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, curMinMaxState);
-    }
-
-    /**
-     * Test that zooming file1 on start up and navigating to other editors
-     * behaves correcly.
-     *  
-     */
-    public void testZoomActivePartFile1() {
-		// These tests are hard-wired to the pre-3.3 zoom behaviour
-		// Run them anyway to ensure that we preserve the 3.0 mechanism
-        IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore();
-        boolean curMinMaxState = apiStore.getBoolean(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX);
-        apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, false);
-        
-        openEditors(1);
-        newDisplay();
-        zoomEditor(1);
-        
-        // Restore the previous state (just in case)
-        apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, curMinMaxState);
-    }
-
-    /**
-     * Test that zooming file2 on start up and navigating to other editors
-     * behaves correcly.
-     *  
-     */
-    public void testZoomActivePartFile2() {
-		// These tests are hard-wired to the pre-3.3 zoom behaviour
-		// Run them anyway to ensure that we preserve the 3.0 mechanism
-        IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore();
-        boolean curMinMaxState = apiStore.getBoolean(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX);
-        apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, false);
-        
-        openEditors(2);
-        newDisplay();
-        zoomEditor(2);
-        
-        // Restore the previous state (just in case)
-        apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, curMinMaxState);
-    }
-
-    /**
-     * Open all the editors.
-     * 
-     * @param lastFileToOpen
-     *            The index of the last file to be opened.
-     */
-    private void openEditors(final int lastFileToOpen) {
-        PartsWorkbenchAdvisor wa = new PartsWorkbenchAdvisor() {
-            protected void validate(IWorkbenchPage page) {
-                for (int index = 0; index < PartsTestUtil.numOfParts; index++) {
-                    if (index != lastFileToOpen)
-                        PartsTestUtil.openEditor(PartsTestUtil
-                                .getFileName(index), page);
-                }
-                PartsTestUtil.openEditor(PartsTestUtil
-                        .getFileName(lastFileToOpen), page);
-                assertEquals(page.getEditorReferences().length,
-                        PartsTestUtil.numOfParts);
-                assertEquals(page.getActiveEditor().getTitle(), PartsTestUtil
-                        .getFileName(lastFileToOpen));
-
-            }
-        };
-        PlatformUI.createAndRunWorkbench(display, wa);
-
-    }
-
-    /**
-     * Check that the active editor's part has been created.
-     * 
-     * @param lastFileOpened
-     *            The active file's index.
-     */
-    private void checkEditorsParts(final int lastFileOpened) {
-
-        PartsWorkbenchAdvisor wa = new PartsWorkbenchAdvisor() {
-            protected void validate(IWorkbenchPage page) {
-                String activeFileName = PartsTestUtil
-                        .getFileName(lastFileOpened);
-                assertEquals(page.getEditorReferences().length,
-                        PartsTestUtil.numOfParts);
-                assertTrue(page.getActivePart() instanceof IEditorPart);
-                IEditorPart activeEditorPart = page.getActiveEditor();
-                assertEquals(activeEditorPart.getTitle(), activeFileName);
-                IEditorReference[] editorReferences = page
-                        .getEditorReferences();
-                int numActiveParts = 0;
-                for (int index = 0; index < editorReferences.length; index++) {
-                    if (editorReferences[index].getEditor(false) != null)
-                        numActiveParts++;
-
-                }
-                //TODO: Ideally, the number of active parts would be 1
-                assertTrue(numActiveParts <= 2);
-            }
-        };
-
-        PlatformUI.createAndRunWorkbench(display, wa);
-
-    }
-
-    /**
-     * Zoom the active editor and navigate to the other open editors.
-     * 
-     * @param editorIndex
-     *            The active editor's index.
-     */
-    public void zoomEditor(final int editorIndex) {
-        PartsWorkbenchAdvisor wa = new PartsWorkbenchAdvisor() {
-            protected void validate(IWorkbenchPage page) {
-                IWorkbenchPartReference activePartReference = page
-                        .getActivePartReference();
-                String activePartReferenceTitle = activePartReference
-                        .getTitle();
-                assertTrue(activePartReference instanceof IEditorReference);
-                assertEquals(activePartReferenceTitle, PartsTestUtil
-                        .getFileName(editorIndex));
-
-                IWorkbenchPart activePart = page.getActivePart();
-                assertTrue(activePart instanceof IEditorPart);
-
-                PartsTestUtil.zoom(activePart);
-                assertTrue(PartsTestUtil.isZoomed(activePart));
-
-                IEditorReference[] editorReferences = page
-                        .getEditorReferences();
-                String currentEditorTitle = null;
-                for (int index = 0; index < editorReferences.length; index++) {
-                    currentEditorTitle = editorReferences[index].getTitle();
-                    if (!currentEditorTitle.equals(activePartReferenceTitle)) {
-                        PartsTestUtil.openEditor(currentEditorTitle, page);
-                        activePartReferenceTitle = currentEditorTitle;
-                    }
-                }
-
-                activePart = page.getActivePart();
-                assertTrue(activePart instanceof IEditorPart);
-
-                if (PartsTestUtil.isZoomed(activePart))
-                    PartsTestUtil.zoom(activePart);
-
-            }
-        };
-        PlatformUI.createAndRunWorkbench(display, wa);
-    }
-
-    /**
-     * Dispose of the old display and create a new one.
-     */
-	private void newDisplay() {
-		disposeDisplay();
-        createDisplay();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/PartsReferencesTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/PartsReferencesTestSuite.java
deleted file mode 100644
index d59fc0a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/PartsReferencesTestSuite.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation 
- *******************************************************************************/
-package org.eclipse.ui.parts.tests;
-
-import junit.extensions.TestSetup;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.parts.tests.util.PartsTestUtil;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.TweakletCheckTest;
-
-/**
- * Test suite to check the behavior of parts (editors and views) creation on
- * start up. Suite written for Bug 66065.
- */
-public class PartsReferencesTestSuite {
-
-    /**
-     * Constructor.
-     * 
-     * @return the test.
-     */
-    public static Test suite() {
-
-        TestSuite suite = new TestSuite();
-
-        suite.addTest(new TweakletCheckTest());
-        suite.addTest(new TestSuite(ViewsReferencesTest.class));
-        suite.addTest(new TestSuite(EditorsReferencesTest.class));
-
-        /**
-         * Wrapper to set up the tests. Ensures the creation of files on set up
-         * and the deletion on tear down.
-         */
-        TestSetup wrapper = new TestSetup(suite) {
-
-            /*
-             * (non-Javadoc)
-             * 
-             * @see junit.extensions.TestSetup#setUp()
-             */
-            protected void setUp() {
-                try {
-                    IProject testProject = FileUtil
-                            .createProject(PartsTestUtil.projectName); //$NON-NLS-1$
-                    for (int index = 0; index < PartsTestUtil.numOfParts; index++) {
-                        FileUtil.createFile(PartsTestUtil.getFileName(index),
-                                testProject);
-                    }
-                } catch (CoreException e) {
-                    e.printStackTrace(System.err);
-                }
-
-            }
-
-            /*
-             * (non-Javadoc)
-             * 
-             * @see junit.extensions.TestSetup#tearDown()
-             */
-            protected void tearDown() {
-                try {
-                    FileUtil.deleteProject(PartsTestUtil.getProject());
-                } catch (CoreException e) {
-                    e.printStackTrace(System.err);
-                }
-            }
-        };
-
-        return wrapper;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/ViewsReferencesTest.java b/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/ViewsReferencesTest.java
deleted file mode 100644
index 9338a63..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/ViewsReferencesTest.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation 
- *******************************************************************************/
-package org.eclipse.ui.parts.tests;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.util.PrefUtil;
-import org.eclipse.ui.parts.tests.util.PartsTestUtil;
-import org.eclipse.ui.parts.tests.util.PartsWorkbenchAdvisor;
-
-/**
- * Test case to ensure that view references are created when neededed. Also
- * ensures that zooming behaves correctly on start up (Bug 64043).
- */
-public class ViewsReferencesTest extends TestCase {
-
-    private Display display;
-
-    /**
-     * Constructor.
-     * 
-     * @param testName
-     *            The test's name.
-     */
-    public ViewsReferencesTest(String testName) {
-        super(testName);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see junit.framework.TestCase#setUp()
-     */
-    protected void setUp() throws Exception {
-        super.setUp();
-        createDisplay();
-    }
-
-	private void createDisplay() {
-		display = PlatformUI.createDisplay();
-	}
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see junit.framework.TestCase#tearDown()
-     */
-    protected void tearDown() throws Exception {
-        disposeDisplay();
-        super.tearDown();
-    }
-
-	private void disposeDisplay() {
-		display.dispose();
-		display = null;
-	}
-
-    /**
-     * Test that only view0's part has been created (ideally).
-     *  
-     */
-    public void testActivePartView0() {
-        openViews(0);
-        newDisplay();
-        checkViewsParts(0);
-    }
-
-    /**
-     * Dispose of the old display and create a new one.
-     */
-	private void newDisplay() {
-		disposeDisplay();
-        createDisplay();
-	}
-
-    /**
-     * Test that only view1's part has been created (ideally).
-     *  
-     */
-    public void testActivePartView1() {
-        openViews(1);
-        newDisplay();
-        checkViewsParts(1);
-
-    }
-
-    /**
-     * Test that only view2's part has been created (ideally).
-     *  
-     */
-    public void testActivePartView2() {
-        openViews(2);
-        newDisplay();
-        checkViewsParts(2);
-    }
-
-    /**
-     * Test that zooming view0 on start up and navigating to other views behaves
-     * correcly.
-     *  
-     */
-    public void testZoomActivePartView0() {
-		// These tests are hard-wired to the pre-3.3 zoom behaviour
-		// Run them anyway to ensure that we preserve the 3.0 mechanism
-        IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore();
-        boolean curMinMaxState = apiStore.getBoolean(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX);
-        apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, false);
-        
-        openViews(0);
-        newDisplay();
-        zoomView(0);
-        
-        // Restore the previous state (just in case)
-        apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, curMinMaxState);
-    }
-
-    /**
-     * Test that zooming view1 on start up and navigating to other views behaves
-     * correcly.
-     *  
-     */
-    public void testZoomActivePartView1() {
-		// These tests are hard-wired to the pre-3.3 zoom behaviour
-		// Run them anyway to ensure that we preserve the 3.0 mechanism
-        IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore();
-        boolean curMinMaxState = apiStore.getBoolean(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX);
-        apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, false);
-        
-        openViews(1);
-        newDisplay();
-        zoomView(1);
-        
-        // Restore the previous state (just in case)
-        apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, curMinMaxState);
-    }
-
-    /**
-     * Test that zooming view2 on start up and navigating to other views behaves
-     * correcly.
-     *  
-     */
-    public void testZoomActivePartView2() {
-		// These tests are hard-wired to the pre-3.3 zoom behaviour
-		// Run them anyway to ensure that we preserve the 3.0 mechanism
-        IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore();
-        boolean curMinMaxState = apiStore.getBoolean(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX);
-        apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, false);
-        
-        openViews(2);
-        newDisplay();
-        zoomView(2);
-        
-        // Restore the previous state (just in case)
-        apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, curMinMaxState);
-    }
-
-    /**
-     * Open all the views.
-     * 
-     * @param lastViewToOpen
-     *            The index of the last view to be opened.
-     */
-    private void openViews(final int lastViewToOpen) {
-        PartsWorkbenchAdvisor wa = new PartsWorkbenchAdvisor() {
-            protected void validate(IWorkbenchPage page) {
-                try {
-                    for (int index = 0; index < PartsTestUtil.numOfParts; index++) {
-                        if (index != lastViewToOpen)
-                            page.showView(PartsTestUtil.getView(index));
-
-                    }
-                    page.showView(PartsTestUtil.getView(lastViewToOpen));
-                } catch (PartInitException e) {
-                    e.printStackTrace(System.err);
-                }
-                assertEquals(page.getViewReferences().length,
-                        PartsTestUtil.numOfParts);
-                assertTrue(page.getActivePart() instanceof IViewPart);
-                IViewPart activePart = (IViewPart) page.getActivePart();
-                assertEquals(activePart.getViewSite().getId(), PartsTestUtil
-                        .getView(lastViewToOpen));
-
-            }
-        };
-        PlatformUI.createAndRunWorkbench(display, wa);
-
-    }
-
-    /**
-     * Check that the active view's part has been created.
-     * 
-     * @param lastViewOpened
-     *            The active file's index.
-     */
-    private void checkViewsParts(final int lastViewOpened) {
-
-        PartsWorkbenchAdvisor wa = new PartsWorkbenchAdvisor() {
-            protected void validate(IWorkbenchPage page) {
-                String activeViewId = PartsTestUtil.getView(lastViewOpened);
-                assertEquals(page.getViewReferences().length,
-                        PartsTestUtil.numOfParts);
-                assertTrue(page.getActivePart() instanceof IViewPart);
-
-                IViewPart activeViewPart = (IViewPart) page.getActivePart();
-                assertEquals(activeViewPart.getViewSite().getId(), activeViewId);
-
-                IViewReference[] viewReferences = page.getViewReferences();
-                int numActiveParts = 0;
-                for (int index = 0; index < viewReferences.length; index++) {
-                    if (viewReferences[index].getView(false) != null)
-                        numActiveParts++;
-
-                }
-                // TODO: Ideally, the number of active parts would be 1
-                assertTrue(numActiveParts <= 2);
-            }
-        };
-
-        PlatformUI.createAndRunWorkbench(display, wa);
-    }
-
-    /**
-     * Zoom the active view and navigate to the other open views.
-     * 
-     * @param viewIndex
-     *            The active view's index.
-     */
-    public void zoomView(final int viewIndex) {
-        PartsWorkbenchAdvisor wa = new PartsWorkbenchAdvisor() {
-            protected void validate(IWorkbenchPage page) {
-                IWorkbenchPartReference activePartReference = page
-                        .getActivePartReference();
-                String activePartReferenceId = activePartReference.getId();
-                assertTrue(activePartReference instanceof IViewReference);
-                assertEquals(activePartReferenceId, PartsTestUtil
-                        .getView(viewIndex));
-
-                IWorkbenchPart activePart = page.getActivePart();
-                assertTrue(activePart instanceof IViewPart);
-
-                PartsTestUtil.zoom(activePart);
-                assertTrue(PartsTestUtil.isZoomed(activePart));
-
-                IViewReference[] viewReferences = page.getViewReferences();
-                String currentViewId = null;
-
-                for (int index = 0; index < viewReferences.length; index++) {
-                    currentViewId = viewReferences[index].getId();
-                    if (!currentViewId.equals(activePartReferenceId)) {
-                        try {
-                            page.showView(currentViewId);
-                        } catch (PartInitException e) {
-                            e.printStackTrace();
-                        }
-                        activePartReferenceId = currentViewId;
-                    }
-                }
-
-                activePart = page.getActivePart();
-                assertTrue(activePart instanceof IViewPart);
-
-                if (PartsTestUtil.isZoomed(activePart))
-                    PartsTestUtil.zoom(activePart);
-
-            }
-        };
-        PlatformUI.createAndRunWorkbench(display, wa);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/util/PartsTestUtil.java b/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/util/PartsTestUtil.java
deleted file mode 100644
index a4788e9..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/util/PartsTestUtil.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation 
- *******************************************************************************/
-package org.eclipse.ui.parts.tests.util;
-
-import org.eclipse.core.internal.resources.Workspace;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.PartPane;
-import org.eclipse.ui.internal.PartSite;
-
-/**
- * Utility class for the parts test suite.
- */
-public class PartsTestUtil {
-
-    public final static String projectName = "TestProject"; //$NON-NLS-1$
-
-    private final static String fileExtension = ".txt"; //$NON-NLS-1$
-
-    private final static String preFileName = "file"; //$NON-NLS-1$
-
-    private final static String View0 = "org.eclipse.ui.views.ResourceNavigator"; //$NON-NLS-1$
-
-    private final static String View1 = "org.eclipse.ui.views.ProblemView"; //$NON-NLS-1$
-
-    private final static String View2 = "org.eclipse.ui.views.PropertySheet"; //$NON-NLS-1$
-
-    public final static int numOfParts = 3;
-
-    /**
-     * Get the workspace.
-     * 
-     * @return the workspace.
-     */
-    public static Workspace getWorkspace() {
-        return (Workspace) ResourcesPlugin.getWorkspace();
-    }
-
-    /**
-     * Get the file name for the given index.
-     * 
-     * @param index
-     *            The file index.
-     * @return the file's name.
-     */
-    public static String getFileName(int index) {
-        return new String(preFileName + Integer.toString(index) + fileExtension);
-    }
-
-    /**
-     * Get the project.
-     * 
-     * @return the project.
-     */
-    public static IProject getProject() {
-        IWorkspace ws = getWorkspace();
-        IWorkspaceRoot root = ws.getRoot();
-        return root.getProject(projectName);
-    }
-
-    /**
-     * Open an editor.
-     * 
-     * @param filename
-     *            The file's name.
-     */
-    public static void openEditor(String filename, IWorkbenchPage page) {
-        try {
-            IDE.openEditor(page, PartsTestUtil.getProject().getFile(filename),
-                    "org.eclipse.ui.DefaultTextEditor", true); //$NON-NLS-1$
-        } catch (PartInitException e) {
-            e.printStackTrace(System.err);
-        }
-    }
-
-    /**
-     * Get the corresponding view id for the index.
-     * 
-     * @param index
-     *            The view index.
-     * @return the view's id.
-     */
-    public static String getView(int index) {
-        switch (index) {
-        case 0:
-            return View0;
-        case 1:
-            return View1;
-        default:
-            return View2;
-        }
-    }
-
-    /**
-     * Zoom the given part.
-     * 
-     * @param part
-     *            The part.
-     */
-    public static void zoom(IWorkbenchPart part) {
-		part.getSite().getPage().toggleZoom(
-				part.getSite().getPage().getReference(part));
-	}
-
-    /**
-     * Determines if the part is zoomed.
-     * 
-     * @param part
-     *            The pat.
-     * @return true if zoomed.
-     */
-    public static boolean isZoomed(IWorkbenchPart part) {
-        PartSite site = (PartSite) part.getSite();
-        PartPane pane = site.getPane();
-        return pane.isZoomed();
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/util/PartsWorkbenchAdvisor.java b/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/util/PartsWorkbenchAdvisor.java
deleted file mode 100644
index 7093108..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/util/PartsWorkbenchAdvisor.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation 
- *******************************************************************************/
-package org.eclipse.ui.parts.tests.util;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-import org.eclipse.ui.tests.harness.util.EmptyPerspective;
-import org.eclipse.ui.tests.harness.util.PlatformUtil;
-
-/**
- * Workbench advisor for the parts test suite.
- */
-public abstract class PartsWorkbenchAdvisor extends WorkbenchAdvisor {
-
-    /**
-     * Constructor.
-     */
-    public PartsWorkbenchAdvisor() {
-        // Do nothing
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.application.WorkbenchAdvisor#createWorkbenchWindowAdvisor(org.eclipse.ui.application.IWorkbenchWindowConfigurer)
-     */
-    public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-        return new PartsWorkbenchWindowAdvisor(this, configurer);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.application.WorkbenchAdvisor#eventLoopIdle(org.eclipse.swt.widgets.Display)
-     */
-    public void eventLoopIdle(Display display) {
-        if(!PlatformUtil.onMac()) {
-            super.eventLoopIdle(display);
-        }
-        PlatformUI.getWorkbench().close();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.application.WorkbenchAdvisor#initialize
-     */
-    public void initialize(IWorkbenchConfigurer configurer) {
-        // make sure we always save and restore workspace state
-        configurer.setSaveAndRestore(true);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.application.WorkbenchAdvisor#preStartup()
-     */
-    public void preStartup() {
-        // Overwrite preference to set empty pespective as our default
-        IPerspectiveRegistry fReg = PlatformUI.getWorkbench()
-                .getPerspectiveRegistry();
-        fReg.setDefaultPerspective(EmptyPerspective.PERSP_ID);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.application.WorkbenchAdvisor
-     */
-    public String getInitialWindowPerspectiveId() {
-        return EmptyPerspective.PERSP_ID;
-    }
-
-    /**
-     * Validates the layout of the page in a new window.
-     * Tests override this.
-     */
-    protected abstract void validate(IWorkbenchPage page);
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/util/PartsWorkbenchWindowAdvisor.java b/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/util/PartsWorkbenchWindowAdvisor.java
deleted file mode 100644
index 10fedeb..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/util/PartsWorkbenchWindowAdvisor.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.parts.tests.util;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-import org.eclipse.ui.internal.ide.WorkbenchActionBuilder;
-
-/**
- * Workbench window advisor for the parts test suite.
- * 
- * @since 3.1
- */
-public class PartsWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
-
-    private PartsWorkbenchAdvisor wbAdvisor;
-    
-    public PartsWorkbenchWindowAdvisor(PartsWorkbenchAdvisor advisor, IWorkbenchWindowConfigurer configurer) {
-        super(configurer);
-        this.wbAdvisor = advisor;
-    }
-
-    public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
-        return new WorkbenchActionBuilder(configurer);
-    }
-    
-    public void openIntro() {
-        // Do not open any intro part
-    }
-    
-    /**
-     * When the window has opened, validate the layout.  Tests override the validate method in the advisor.
-     */
-    public void postWindowOpen() {
-        IWorkbenchPage page = getWindowConfigurer().getWindow().getActivePage();
-        wbAdvisor.validate(page);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/PerspectiveState.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/PerspectiveState.java
deleted file mode 100644
index b992060..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/PerspectiveState.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests;
-
-import java.util.ArrayList;
-
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.internal.Perspective;
-import org.eclipse.ui.internal.WorkbenchPage;
-
-/**
- * Represents the state of a perspective (layout, etc).
- * 
- * @since 3.1
- */
-public class PerspectiveState {
-
-    private IMemento memento;
-    
-    /**
-     *  
-     */
-    public PerspectiveState(IWorkbenchPage page) {
-        WorkbenchPage wbPage = (WorkbenchPage) page;
-        Perspective persp = wbPage.getActivePerspective();
-        XMLMemento mem = XMLMemento.createWriteRoot("perspectiveState");
-        persp.saveState(mem);
-        this.memento = mem;
-    }
-
-    /**
-     * Returns the part ids in the given folder (specify <code>null</code> for top level).
-     *  
-     * @param folderId the folder id, or <code>null</code>
-     * @return the part ids in the given folder (an <code>ArrayList</code> of <code>String</code>)
-     */
-    public ArrayList getPartIds(String folderId) {
-        ArrayList result = new ArrayList();
-        IMemento[] infos = memento.getChild("layout").getChild("mainWindow").getChildren("info");
-        for (int i = 0; i < infos.length; i++) {
-            IMemento info = infos[i];
-            String partId = info.getString("part");
-            if ("true".equals(info.getString("folder"))) {
-                if (partId.equals(folderId)) {
-	                IMemento[] pages = info.getChild("folder").getChildren("page");
-	                for (int j = 0; j < pages.length; j++) {
-	                    IMemento page = pages[j];
-	                    result.add(page.getString("content"));
-	                }
-                }
-            }
-            else {
-                if (folderId == null) {
-                    result.add(partId);
-                }
-            }
-        }
-        return result;
-    }
-    
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/SelectionProviderView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/SelectionProviderView.java
deleted file mode 100644
index b042c63..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/SelectionProviderView.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests;
-
-import org.eclipse.core.runtime.ListenerList;
-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.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- *  The view provides api to fire a selection event for its workbench page. 
- */
-
-public class SelectionProviderView extends ViewPart implements
-        ISelectionProvider {
-    public final static String ID = "org.eclipse.ui.tests.SelectionProviderView";
-
-    public final static String ID_2 = "org.eclipse.ui.tests.SelectionProviderView2";
-
-    private ListenerList selectionChangedListeners = new ListenerList();
-
-    private ISelection lastSelection = StructuredSelection.EMPTY;
-
-    private Text text;
-
-    public SelectionProviderView() {
-        super();
-    }
-
-    /**
-     * @see WorkbenchPart#setFocus()
-     */
-    public void setFocus() {
-        text.setFocus();
-    }
-
-    /**
-     * @see WorkbenchPart#createPartControl(Composite)
-     */
-    public void createPartControl(Composite parent) {
-        text = new Text(parent, SWT.MULTI | SWT.WRAP);
-        text.setLayoutData(new GridData(GridData.FILL_BOTH));
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IViewPart.
-     */
-    public void init(IViewSite site) throws PartInitException {
-        site.setSelectionProvider(this);
-        super.init(site);
-    }
-
-    /**
-     * @see ISelectionProvider#addSelectionChangedListener(ISelectionChangedListener)
-     */
-    public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        selectionChangedListeners.add(listener);
-    }
-
-    /**
-     * @see ISelectionProvider#getSelection()
-     */
-    public ISelection getSelection() {
-        return lastSelection;
-    }
-
-    /**
-     * @see ISelectionProvider#removeSelectionChangedListener(ISelectionChangedListener)
-     */
-    public void removeSelectionChangedListener(
-            ISelectionChangedListener listener) {
-        selectionChangedListeners.remove(listener);
-    }
-
-    /**
-     * Sets the selection to a particular object.
-     */
-    public void setSelection(Object obj) {
-        setSelection(new StructuredSelection(obj));
-    }
-
-    /**
-     * @see ISelectionProvider#setSelection(ISelection)
-     */
-    public void setSelection(ISelection selection) {
-        lastSelection = selection;
-
-        // create an event
-        SelectionChangedEvent event = new SelectionChangedEvent(this, selection);
-
-        // write text
-        text.setText(selection.toString());
-
-        // fire the event
-        Object[] listeners = selectionChangedListeners.getListeners();
-        for (int i = 0; i < listeners.length; ++i) {
-            ((ISelectionChangedListener) listeners[i]).selectionChanged(event);
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/TestPlugin.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/TestPlugin.java
deleted file mode 100644
index 1aac5cf..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/TestPlugin.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IStartup;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.tests.decorators.BackgroundColorDecorator;
-import org.eclipse.ui.tests.dynamicplugins.TestInstallUtil;
-import org.eclipse.ui.tests.menus.MenuBuilder;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class TestPlugin extends AbstractUIPlugin implements IStartup {
-    //The shared instance.
-    private static TestPlugin plugin;
-
-    //Resource bundle.
-    private ResourceBundle resourceBundle;
-
-    // This boolean should only be true if the earlyStartup() method
-    // has been called.
-    private static boolean earlyStartupCalled = false;
-    
-    public static final String PLUGIN_ID = "org.eclipse.ui.tests"; 
-
-    /**
-     * The constructor.
-     */
-    public TestPlugin(IPluginDescriptor descriptor) {
-        super(descriptor);
-        plugin = this;
-        try {
-            resourceBundle = ResourceBundle
-                    .getBundle("org.eclipse.ui.tests.TestPluginResources");
-        } catch (MissingResourceException x) {
-            resourceBundle = null;
-        }
-    }
-
-    /**
-     * Returns the shared instance.
-     */
-    public static TestPlugin getDefault() {
-        return plugin;
-    }
-
-    /**
-     * Returns the workspace instance.
-     */
-    public static IWorkspace getWorkspace() {
-        return ResourcesPlugin.getWorkspace();
-    }
-
-    /**
-     * Returns the string from the plugin's resource bundle,
-     * or 'key' if not found.
-     */
-    public static String getResourceString(String key) {
-        ResourceBundle bundle = TestPlugin.getDefault().getResourceBundle();
-        try {
-            return bundle.getString(key);
-        } catch (MissingResourceException e) {
-            return key;
-        }
-    }
-
-    /**
-     * Returns the plugin's resource bundle,
-     */
-    public ResourceBundle getResourceBundle() {
-        return resourceBundle;
-    }
-
-    /**
-     * Returns the image descriptor with the given relative path.
-     */
-    public ImageDescriptor getImageDescriptor(String relativePath) {
-        String iconPath = "icons/";
-        try {
-            URL installURL = getDescriptor().getInstallURL();
-            URL url = new URL(installURL, iconPath + relativePath);
-            return ImageDescriptor.createFromURL(url);
-        } catch (MalformedURLException e) {
-            // should not happen
-            return ImageDescriptor.getMissingImageDescriptor();
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IStartup#earlyStartup()
-     */
-    public void earlyStartup() {
-        earlyStartupCalled = true;
-    }
-
-    public static boolean getEarlyStartupCalled() {
-        return earlyStartupCalled;
-    }
-
-    public static void clearEarlyStartup() {
-        earlyStartupCalled = false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext)
-     */
-    public void start(BundleContext context) throws Exception {
-        TestInstallUtil.setContext(context);
-        super.start(context);
-        MenuBuilder.addMenuContribution();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
-     */
-    public void stop(BundleContext context) throws Exception {
-    	MenuBuilder.removeMenuContribution();
-        TestInstallUtil.setContext(null);
-        super.stop(context);
-        BackgroundColorDecorator.color = null;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/UiTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/UiTestSuite.java
deleted file mode 100644
index 819d5cb..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/UiTestSuite.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.ui.tests.activities.ActivitiesTestSuite;
-import org.eclipse.ui.tests.adaptable.AdaptableTestSuite;
-import org.eclipse.ui.tests.api.ApiTestSuite;
-import org.eclipse.ui.tests.api.StartupTest;
-import org.eclipse.ui.tests.commands.CommandsTestSuite;
-import org.eclipse.ui.tests.concurrency.ConcurrencyTestSuite;
-import org.eclipse.ui.tests.contexts.ContextsTestSuite;
-import org.eclipse.ui.tests.datatransfer.DataTransferTestSuite;
-import org.eclipse.ui.tests.decorators.DecoratorsTestSuite;
-import org.eclipse.ui.tests.dialogs.UIAutomatedSuite;
-import org.eclipse.ui.tests.dnd.DragTestSuite;
-import org.eclipse.ui.tests.dynamicplugins.DynamicPluginsTestSuite;
-import org.eclipse.ui.tests.encoding.EncodingTestSuite;
-import org.eclipse.ui.tests.fieldassist.FieldAssistTestSuite;
-import org.eclipse.ui.tests.filteredtree.FilteredTreeTests;
-import org.eclipse.ui.tests.harness.util.TweakletCheckTest;
-import org.eclipse.ui.tests.internal.InternalTestSuite;
-import org.eclipse.ui.tests.intro.IntroTestSuite;
-import org.eclipse.ui.tests.keys.KeysTestSuite;
-import org.eclipse.ui.tests.leaks.LeakTests;
-import org.eclipse.ui.tests.menus.MenusTestSuite;
-import org.eclipse.ui.tests.multieditor.MultiEditorTestSuite;
-import org.eclipse.ui.tests.multipageeditor.MultiPageEditorTestSuite;
-import org.eclipse.ui.tests.navigator.NavigatorTestSuite;
-import org.eclipse.ui.tests.operations.OperationsTestSuite;
-import org.eclipse.ui.tests.preferences.PreferencesTestSuite;
-import org.eclipse.ui.tests.presentations.PresentationsTestSuite;
-import org.eclipse.ui.tests.propertysheet.PropertySheetTestSuite;
-import org.eclipse.ui.tests.quickaccess.QuickAccessTestSuite;
-import org.eclipse.ui.tests.services.ServicesTestSuite;
-import org.eclipse.ui.tests.statushandlers.StatusHandlingTestSuite;
-import org.eclipse.ui.tests.systeminplaceeditor.OpenSystemInPlaceEditorTest;
-import org.eclipse.ui.tests.themes.ThemesTestSuite;
-import org.eclipse.ui.tests.zoom.ZoomTestSuite;
-
-/**
- * Test all areas of the UI.
- */
-public class UiTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new UiTestSuite();
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public UiTestSuite() {
-    	// run the StartupTest first, since we need to check early that the tests 
-    	// run only after early startup has completed (bug 93518).
-    	addTest(new TweakletCheckTest());
-    	addTest(new TestSuite(StartupTest.class));
-        addTest(new UIAutomatedSuite());
-        addTest(new ApiTestSuite());
-        addTest(new PropertySheetTestSuite());
-        addTest(new QuickAccessTestSuite());
-        addTest(new InternalTestSuite());
-        addTest(new NavigatorTestSuite());
-        addTest(new DecoratorsTestSuite());
-        addTest(new AdaptableTestSuite());
-        addTest(new ZoomTestSuite());
-        addTest(new DataTransferTestSuite());
-        addTest(new PreferencesTestSuite());
-        addTest(new DynamicPluginsTestSuite());
-        addTest(new KeysTestSuite());
-        addTest(new MultiPageEditorTestSuite());
-        addTest(new ActivitiesTestSuite());
-        addTest(new CommandsTestSuite());
-        addTest(new ContextsTestSuite());
-        addTest(new DragTestSuite());
-        addTest(new ThemesTestSuite());
-        addTest(new IntroTestSuite());
-        addTest(new MenusTestSuite());
-        addTest(new EncodingTestSuite());
-        addTest(new PresentationsTestSuite());
-        addTest(new TestSuite(LeakTests.class));
-        addTest(new ConcurrencyTestSuite());
-        addTest(new OperationsTestSuite());
-        addTest(new FieldAssistTestSuite());
-        addTest(new MultiEditorTestSuite());
-        addTest(new TestSuite(FilteredTreeTests.class));
-        addTest(new ServicesTestSuite());
-        addTest(new StatusHandlingTestSuite());
-        addTest(OpenSystemInPlaceEditorTest.suite());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/ActivitiesTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/ActivitiesTestSuite.java
deleted file mode 100644
index 5747c9a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/ActivitiesTestSuite.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.activities;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * The ActivitiesTestSuite class runs the activities' test suites.
- */
-public class ActivitiesTestSuite extends TestSuite {
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new ActivitiesTestSuite();
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public ActivitiesTestSuite() {
-      	addTest(new TestSuite(ImagesTest.class));
-		addTest(new TestSuite(UtilTest.class));
-        addTest(new TestSuite(StaticTest.class));
-        addTest(new TestSuite(DynamicTest.class));
-        addTest(new TestSuite(PersistanceTest.class));
-        addTest(new TestSuite(ActivityPreferenceTest.class));
-        addTest(new TestSuite(MenusTest.class));
-        addTest(new TestSuite(PatternUtilTest.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/ActivityPreferenceTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/ActivityPreferenceTest.java
deleted file mode 100644
index f5a1739..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/ActivityPreferenceTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.activities;
-
-import java.util.Collections;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ui.activities.IActivityManager;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.1
- */
-public class ActivityPreferenceTest extends UITestCase {
-    /**
-     * Preference prefix - must match the one specified in ActivityPreferenceHelper
-     */
-    private static String PREFIX = "UIActivities."; //$NON-NLS-1$
-    /**
-     * The activity id
-     */
-    private static String ID = "org.eclipse.ui.PT.A2"; //$NON-NLS-1$
-    
-    /**
-     * @param testName
-     */
-    public ActivityPreferenceTest(String testName) {
-        super(testName);
-    }
-    
-    /**
-     * Tests whether activity preferences are persisted as soon as the activity set changes.
-     */
-    public void testActivityPreference() {
-        IActivityManager manager = fWorkbench.getActivitySupport().getActivityManager();
-        
-        boolean initialState = manager.getEnabledActivityIds().contains(ID);
-        IPreferenceStore store = WorkbenchPlugin.getDefault().getPreferenceStore();
-        assertEquals(initialState, store.getBoolean(PREFIX + ID));
-        
-        fWorkbench.getActivitySupport().setEnabledActivityIds(initialState ? Collections.EMPTY_SET : Collections.singleton(ID));
-        assertEquals(!initialState, store.getBoolean(PREFIX + ID));
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/DynamicModelActivityRegistry.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/DynamicModelActivityRegistry.java
deleted file mode 100644
index 63e10b2..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/DynamicModelActivityRegistry.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.activities;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.ui.internal.activities.AbstractActivityRegistry;
-import org.eclipse.ui.internal.activities.ActivityDefinition;
-import org.eclipse.ui.internal.activities.ActivityPatternBindingDefinition;
-import org.eclipse.ui.internal.activities.ActivityRequirementBindingDefinition;
-import org.eclipse.ui.internal.activities.CategoryActivityBindingDefinition;
-import org.eclipse.ui.internal.activities.CategoryDefinition;
-
-/**
- * 
- * The dynamic activity registry populated activities with dummy definitions for
- * testing purposes.
- */
-public class DynamicModelActivityRegistry extends AbstractActivityRegistry {
-    final String sourceId = "org.eclipse.ui.tests"; //$NON-NLS-1$
-
-    /**
-     * The constructor for the plugin model registry.
-     */
-    public DynamicModelActivityRegistry() {
-        super();
-        load();
-    }
-
-    /**
-     * Populate definitions.
-     *  
-     */
-    private void load() {
-        categoryDefinitions = new ArrayList();
-        activityDefinitions = new ArrayList();
-        categoryActivityBindingDefinitions = new ArrayList();
-        activityPatternBindingDefinitions = new ArrayList();
-        activityRequirementBindingDefinitions = new ArrayList();
-        defaultEnabledActivities = new ArrayList();
-        populateCategoryDefinitions();
-        populateActivityDefinitions();
-        populateCategoryActivityBindingDefinitions();
-        populateActivityPatternBindingDefinitions();
-        populateActivityRequirementBindingDefinitions();
-        populateDefaultEnabledActivities();
-    }
-
-    /**
-     * Populate the default enabled activties.
-     *  
-     */
-    private void populateDefaultEnabledActivities() {
-        defaultEnabledActivities.add(((ActivityDefinition) activityDefinitions
-                .toArray()[0]).getId());
-        defaultEnabledActivities.add(((ActivityDefinition) activityDefinitions
-                .toArray()[2]).getId());
-        defaultEnabledActivities.add(((ActivityDefinition) activityDefinitions
-                .toArray()[8]).getId());
-    }
-
-    /**
-     * Populate the activity activity binding definitions.
-     *  
-     */
-    private void populateActivityRequirementBindingDefinitions() {
-        activityRequirementBindingDefinitions
-                .add(new ActivityRequirementBindingDefinition(
-                        ((ActivityDefinition) activityDefinitions.toArray()[0])
-                                .getId(),
-                        ((ActivityDefinition) activityDefinitions.toArray()[1])
-                                .getId(), sourceId)); //$NON-NLS-1$
-        activityRequirementBindingDefinitions
-                .add(new ActivityRequirementBindingDefinition(
-                        ((ActivityDefinition) activityDefinitions.toArray()[2])
-                                .getId(),
-                        ((ActivityDefinition) activityDefinitions.toArray()[3])
-                                .getId(), sourceId)); //$NON-NLS-1$
-    }
-
-    /**
-     * Populate the activity pattern binding definitions.
-     *  
-     */
-    private void populateActivityPatternBindingDefinitions() {
-        for (int index = 0; index < activityDefinitions.size(); index++) {
-            activityPatternBindingDefinitions
-                    .add(new ActivityPatternBindingDefinition(
-                            ((ActivityDefinition) activityDefinitions.toArray()[index])
-                                    .getId(), "org.eclipse.pattern" //$NON-NLS-1$
-                                    + Integer.toString(index + 1), sourceId));
-        }
-    }
-
-    /**
-     * Populate the category activity binding definitions.
-     *  
-     */
-    private void populateCategoryActivityBindingDefinitions() {
-        int counter = 1;
-        for (int index = 1; index <= categoryDefinitions.size(); index++) {
-            categoryActivityBindingDefinitions
-                    .add(new CategoryActivityBindingDefinition(
-                            "org.eclipse.activity" + Integer.toString(counter), //$NON-NLS-1$
-                            "org.eclipse.category" + Integer.toString(index), //$NON-NLS-1$
-                            sourceId));
-            counter++;
-            categoryActivityBindingDefinitions
-                    .add(new CategoryActivityBindingDefinition(
-                            "org.eclipse.activity" + Integer.toString(counter), //$NON-NLS-1$
-                            "org.eclipse.category" + Integer.toString(index), //$NON-NLS-1$
-                            sourceId));
-            counter++;
-            categoryActivityBindingDefinitions
-                    .add(new CategoryActivityBindingDefinition(
-                            "org.eclipse.activity" + Integer.toString(counter), //$NON-NLS-1$
-                            "org.eclipse.category" + Integer.toString(index), //$NON-NLS-1$
-                            sourceId));
-            counter++;
-        }
-    }
-
-    /**
-     * Populate the activity definitions.
-     *  
-     */
-    private void populateActivityDefinitions() {
-        String stringToAppend = null;
-        for (int index = 1; index <= categoryDefinitions.size() * 3; index++) {
-            stringToAppend = Integer.toString(index);
-            activityDefinitions.add(new ActivityDefinition(
-                    "org.eclipse.activity" + stringToAppend, "Activity " //$NON-NLS-1$ //$NON-NLS-2$
-                            + stringToAppend, sourceId, "description")); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Populate the category definitions.
-     *  
-     */
-    private void populateCategoryDefinitions() {
-        String stringToAppend = null;
-        for (int index = 1; index <= 6; index++) {
-            stringToAppend = Integer.toString(index);
-            categoryDefinitions.add(new CategoryDefinition(
-                    "org.eclipse.category" + stringToAppend, "Category " //$NON-NLS-1$ //$NON-NLS-2$
-                            + stringToAppend, sourceId, "description")); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * Add an activity.
-     * 
-     * @param activityId
-     *            The activity's id.
-     * @param activityName
-     *            The activity's name
-     */
-    public void addActivity(String activityId, String activityName) {
-        activityDefinitions.add(new ActivityDefinition(activityId,
-                activityName, sourceId, "description")); //$NON-NLS-1$
-        fireActivityRegistryChanged();
-    }
-
-    /**
-     * Remove adn activity.
-     * 
-     * @param activityId
-     *            The activity's id.
-     * @param activityName
-     *            The activity's name.
-     */
-    public void removeActivity(String activityId, String activityName) {
-        activityDefinitions.remove(new ActivityDefinition(activityId,
-                activityName, sourceId, "description")); //$NON-NLS-1$
-        fireActivityRegistryChanged();
-    }
-
-    /**
-     * Add a category.
-     * 
-     * @param categoryId
-     *            The category's id.
-     * @param categoryName
-     *            The category's name.
-     */
-    public void addCategory(String categoryId, String categoryName) {
-        categoryDefinitions.add(new CategoryDefinition(categoryId,
-                categoryName, sourceId, "description")); //$NON-NLS-1$
-        fireActivityRegistryChanged();
-    }
-
-    /**
-     * Remove a category.
-     * 
-     * @param categoryId
-     *            The category's id.
-     * @param categoryName
-     *            The category's name.
-     */
-    public void removeCategory(String categoryId, String categoryName) {
-        categoryDefinitions.remove(new CategoryDefinition(categoryId,
-                categoryName, sourceId, "description")); //$NON-NLS-1$
-        fireActivityRegistryChanged();
-    }
-
-    /**
-     * Add an activity activity binding.
-     * 
-     * @param parentId
-     *            The parent id.
-     * @param childId
-     *            The child id.
-     */
-    public void addActivityRequirementBinding(String childId, String parentId) {
-        activityRequirementBindingDefinitions
-                .add(new ActivityRequirementBindingDefinition(childId,
-                        parentId, sourceId));
-        fireActivityRegistryChanged();
-    }
-
-    /**
-     * Reomve an activity activity binding.
-     * 
-     * @param parentId
-     *            The parent id.
-     * @param childId
-     *            The child id.
-     */
-    public void removeActivityRequirementBinding(String childId, String parentId) {
-        activityRequirementBindingDefinitions
-                .remove(new ActivityRequirementBindingDefinition(childId,
-                        parentId, sourceId));
-        fireActivityRegistryChanged();
-    }
-
-    /**
-     * Add a category activity binding.
-     * 
-     * @param activityId
-     *            The activity id.
-     * @param categoryId
-     *            The category id.
-     */
-    public void addCategoryActivityBinding(String activityId, String categoryId) {
-        categoryActivityBindingDefinitions
-                .add(new CategoryActivityBindingDefinition(activityId,
-                        categoryId, sourceId));
-        fireActivityRegistryChanged();
-    }
-
-    /**
-     * Remove a category activity binding.
-     * 
-     * @param activityId
-     *            The activity id.
-     * @param categoryId
-     *            The category id.
-     */
-    public void removeCategoryActivityBinding(String activityId,
-            String categoryId) {
-        categoryActivityBindingDefinitions
-                .remove(new CategoryActivityBindingDefinition(activityId,
-                        categoryId, sourceId));
-        fireActivityRegistryChanged();
-    }
-
-    /**
-     * Update the category's description.
-     * 
-     * @param categoryId
-     *            The category Id.
-     * @param categoryDescription
-     *            The category description.
-     */
-    public void updateCategoryDescription(String categoryId,
-            String categoryDescription) {
-        CategoryDefinition currentCategory = null;
-        for (Iterator i = categoryDefinitions.iterator(); i.hasNext();) {
-            currentCategory = (CategoryDefinition) i.next();
-            if (currentCategory.getId().equals(categoryId)) {
-                categoryDefinitions.remove(currentCategory);
-                categoryDefinitions.add(new CategoryDefinition(categoryId,
-                        currentCategory.getName(), currentCategory
-                                .getSourceId(), categoryDescription));
-                fireActivityRegistryChanged();
-                return;
-            }
-        }
-    }
-
-    /**
-     * Update the activity's description.
-     * 
-     * @param activityId
-     *            The activity id.
-     * @param activityDescription
-     *            The activity description.
-     */
-    public void updateActivityDescription(String activityId,
-            String activityDescription) {
-        ActivityDefinition currentActivity = null;
-        for (Iterator i = activityDefinitions.iterator(); i.hasNext();) {
-            currentActivity = (ActivityDefinition) i.next();
-            if (currentActivity.getId().equals(activityId)) {
-                activityDefinitions.remove(currentActivity);
-                activityDefinitions.add(new ActivityDefinition(activityId,
-                        currentActivity.getName(), currentActivity
-                                .getSourceId(), activityDescription));
-                fireActivityRegistryChanged();
-                return;
-            }
-        }
-    }
-
-    /**
-     * Update the activity's name.
-     * 
-     * @param activityId
-     *            The activity id.
-     * @param activityName
-     *            The activity's name.
-     */
-    public void updateActivityName(String activityId, String activityName) {
-        ActivityDefinition currentActivity = null;
-        for (Iterator i = activityDefinitions.iterator(); i.hasNext();) {
-            currentActivity = (ActivityDefinition) i.next();
-            if (currentActivity.getId().equals(activityId)) {
-                activityDefinitions.remove(currentActivity);
-                activityDefinitions.add(new ActivityDefinition(activityId,
-                        activityName, currentActivity.getSourceId(),
-                        currentActivity.getDescription()));
-                fireActivityRegistryChanged();
-                return;
-            }
-        }
-    }
-
-    /**
-     * Update the category's name.
-     * 
-     * @param categoryId
-     *            The category id.
-     * @param categoryName
-     *            The category name.
-     */
-    public void updateCategoryName(String categoryId, String categoryName) {
-        CategoryDefinition currentCategory = null;
-        for (Iterator i = categoryDefinitions.iterator(); i.hasNext();) {
-            currentCategory = (CategoryDefinition) i.next();
-            if (currentCategory.getId().equals(categoryId)) {
-                categoryDefinitions.remove(currentCategory);
-                categoryDefinitions.add(new CategoryDefinition(categoryId,
-                        categoryName, currentCategory.getSourceId(),
-                        currentCategory.getDescription()));
-                fireActivityRegistryChanged();
-                return;
-            }
-        }
-    }
-
-    /**
-     * Remove an activity pattern binding.
-     * 
-     * @param pattern
-     *            The pattern binding.
-     */
-    public void removeActivityPatternBinding(String pattern) {
-        ActivityPatternBindingDefinition currentDefinition = null;
-        for (Iterator i = activityPatternBindingDefinitions.iterator(); i
-                .hasNext();) {
-            currentDefinition = (ActivityPatternBindingDefinition) i.next();
-            if (currentDefinition.getPattern().equals(pattern)) {
-                activityPatternBindingDefinitions.remove(currentDefinition);
-                fireActivityRegistryChanged();
-                return;
-            }
-        }
-    }
-
-    /**
-     * Add an activity pattern binding.
-     * 
-     * @param activityId
-     *            The actvity Id.
-     * @param pattern
-     *            The pattern.
-     */
-    public void addActivityPatternBinding(String activityId, String pattern) {
-        if (activityPatternBindingDefinitions
-                .add(new ActivityPatternBindingDefinition(activityId, pattern,
-                        sourceId))) {
-            fireActivityRegistryChanged();
-            return;
-        }
-    }
-    
-    /**
-     * Add default enablement to the provided activity
-     * @param activityId the activity id
-     */
-    public void addDefaultEnabledActivity(String activityId) {
-        if (defaultEnabledActivities.add(activityId)) {
-            fireActivityRegistryChanged();
-        }
-    }
-    
-    
-    /**
-     * Remove default enablement to the provided activity
-     * 
-     * @param activityId the activity id.
-     */
-    public void removeDefaultEnabledActivity(String activityId) {
-        if (defaultEnabledActivities.remove(activityId)) {
-            fireActivityRegistryChanged();
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/DynamicTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/DynamicTest.java
deleted file mode 100644
index b1f511f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/DynamicTest.java
+++ /dev/null
@@ -1,434 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.activities;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.ui.activities.ActivityEvent;
-import org.eclipse.ui.activities.ActivityManagerEvent;
-import org.eclipse.ui.activities.CategoryEvent;
-import org.eclipse.ui.activities.IActivity;
-import org.eclipse.ui.activities.IActivityListener;
-import org.eclipse.ui.activities.IActivityManagerListener;
-import org.eclipse.ui.activities.ICategory;
-import org.eclipse.ui.activities.ICategoryListener;
-import org.eclipse.ui.activities.IIdentifier;
-import org.eclipse.ui.activities.IIdentifierListener;
-import org.eclipse.ui.activities.IdentifierEvent;
-import org.eclipse.ui.activities.NotDefinedException;
-import org.eclipse.ui.activities.WorkbenchTriggerPointAdvisor;
-import org.eclipse.ui.internal.activities.MutableActivityManager;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * 
- * The dynamic test manipualtes the categories, activities and their definitions
- * and ensures that their content and their listeners are behaving properly.
- */
-public class DynamicTest extends UITestCase {
-    private MutableActivityManager activityManager;
-
-    private DynamicModelActivityRegistry fixedModelRegistry;
-
-    private int listenerType;
-
-    static final int ACTIVITY_ENABLED_CHANGED = 0;
-
-    static final int ACTIVITY_IDS_CHANGED = 1;
-
-    static final int ENABLED_ACTIVITYIDS_CHANGED = 2;
-
-    static final int DEFINED_CATEGORYIDS_CHANGED = 3;
-
-    static final int DEFINED_ACTIVITYIDS_CHANGED = 4;
-
-    static final int DEFINED_CHANGED = 5;
-
-    static final int ENABLED_CHANGED = 6;
-
-    static final int NAME_CHANGED = 7;
-
-    static final int PATTERN_BINDINGS_CHANGED = 8;
-
-    static final int ACTIVITY_ACTIVITY_BINDINGS_CHANGED = 9;
-
-    static final int DESCRIPTION_CHANGED = 10;
-    
-    static final int DEFAULT_ENABLED_CHANGED = 11;
-
-    /**
-     * Constructor.
-     * 
-     * @param testName
-     *            Test's name.
-     */
-    public DynamicTest(String testName) {
-        super(testName);
-        fixedModelRegistry = new DynamicModelActivityRegistry();
-        activityManager = new MutableActivityManager(new WorkbenchTriggerPointAdvisor(), fixedModelRegistry);
-        listenerType = -1;
-    }
-
-    /**
-     * Test sizes of what has been read.
-     *  
-     */
-    public void testSizes() {
-        assertTrue(activityManager.getDefinedCategoryIds().size() == 6);
-        assertTrue(activityManager.getDefinedActivityIds().size() == 18);
-        assertTrue(activityManager.getEnabledActivityIds().size() == 3);
-    }
-
-    /**
-     * Test activity bindings.
-     *  
-     */
-    public void testActivityPatternBindings() {
-        IActivity first_activity = activityManager
-                .getActivity((String) activityManager.getDefinedActivityIds()
-                        .toArray()[0]);
-        Set initialPatternBindings = first_activity
-                .getActivityPatternBindings();
-        // Add pattern binding
-        String pattern = "org\\.eclipse\\.ui\\.myPattern/.*"; //$NON-NLS-1$
-        fixedModelRegistry.addActivityPatternBinding(first_activity.getId(),
-                pattern);
-        assertFalse(initialPatternBindings.size() == first_activity
-                .getActivityPatternBindings().size());
-        // Remove pattern binding
-        fixedModelRegistry.removeActivityPatternBinding(pattern);
-        assertTrue(initialPatternBindings.size() == first_activity
-                .getActivityPatternBindings().size());
-    }
-
-    /**
-     * Test the enabled activities.
-     *  
-     */
-    public void testEnabledActivities() {
-        // Add an enabled activity
-        Set compareSet;
-        Set copySet = new HashSet(activityManager.getEnabledActivityIds());
-        copySet.add(activityManager.getDefinedActivityIds().toArray()[0]);
-        activityManager.setEnabledActivityIds(copySet);
-        compareSet = activityManager.getEnabledActivityIds();
-        assertTrue(compareSet.size() == copySet.size());
-        // Remove an enabled activity
-        copySet.remove(activityManager.getDefinedActivityIds().toArray()[0]);
-        activityManager.setEnabledActivityIds(copySet);
-        compareSet = activityManager.getEnabledActivityIds();
-        assertTrue(compareSet.size() == copySet.size());
-    }
-
-    /**
-     * Test the identifier listener.
-     *  
-     */
-    public void testIdentifiersListener() {
-        final IIdentifier enabledIdentifier = activityManager
-                .getIdentifier("org.eclipse.pattern3"); //$NON-NLS-1$
-        assertTrue(enabledIdentifier.isEnabled());
-        enabledIdentifier.addIdentifierListener(new IIdentifierListener() {
-            public void identifierChanged(IdentifierEvent identifierEvent) {
-                switch (listenerType) {
-                case ACTIVITY_ENABLED_CHANGED:
-                    assertTrue(identifierEvent.hasEnabledChanged());
-                    break;
-                case ACTIVITY_IDS_CHANGED:
-                    assertTrue(identifierEvent.hasActivityIdsChanged());
-                    break;
-                }
-                listenerType = -1;
-            }
-        });
-        // Test correcteness of identifier
-        IIdentifier activitiesIdentifier = activityManager
-                .getIdentifier("org.eclipse.pattern4"); //$NON-NLS-1$
-        Set identifiedActivities = activitiesIdentifier.getActivityIds(); //$NON-NLS-1$
-        assertTrue(identifiedActivities.size() == 1);
-        assertTrue(((String) identifiedActivities.toArray()[0])
-                .equals("org.eclipse.activity4")); //$NON-NLS-1$
-        assertFalse(activitiesIdentifier.isEnabled());
-        // Disable Enabled activity
-        listenerType = 0;
-        Set copySet = new HashSet(activityManager.getEnabledActivityIds());
-        copySet.remove(enabledIdentifier.getActivityIds().toArray()[0]);
-        activityManager.setEnabledActivityIds(copySet);
-        assertTrue(listenerType == -1);
-        // Enable Disabled activity
-        listenerType = 0;
-        copySet.add("org.eclipse.activity3"); //$NON-NLS-1$
-        activityManager.setEnabledActivityIds(copySet);
-        assertTrue(listenerType == -1);
-        // Add pattern binding
-        listenerType = 1;
-        fixedModelRegistry.addActivityPatternBinding("org.eclipse.activity1", //$NON-NLS-1$
-                "org.eclipse.pattern3"); //$NON-NLS-1$ //$NON-NLS-2$
-        assertTrue(listenerType == -1);
-        // Test correctenesss of identifier
-        Set manipulatedIdentifiers = activityManager.getIdentifier(
-                "org.eclipse.pattern3").getActivityIds(); //$NON-NLS-1$
-        assertTrue(manipulatedIdentifiers.size() == 2);
-        // Remove pattern binding
-        listenerType = 1;
-        fixedModelRegistry.removeActivityPatternBinding("org.eclipse.pattern3"); //$NON-NLS-1$
-        assertTrue(listenerType == -1);
-        manipulatedIdentifiers = activityManager.getIdentifier(
-                "org.eclipse.pattern3").getActivityIds(); //$NON-NLS-1$
-        assertTrue(manipulatedIdentifiers.size() == 1);
-    }
-
-    /**
-     * Test the activity manager listener.
-     *  
-     */
-    public void testActivityManagerListener() {
-        activityManager
-                .addActivityManagerListener(new IActivityManagerListener() {
-                    public void activityManagerChanged(
-                            ActivityManagerEvent activityManagerEvent) {
-                        switch (listenerType) {
-                        case ENABLED_ACTIVITYIDS_CHANGED:
-                            assertTrue(activityManagerEvent
-                                    .haveEnabledActivityIdsChanged());
-                            break;
-                        case DEFINED_CATEGORYIDS_CHANGED:
-                            assertTrue(activityManagerEvent
-                                    .haveDefinedCategoryIdsChanged());
-                            break;
-                        case DEFINED_ACTIVITYIDS_CHANGED:
-                            assertTrue(activityManagerEvent
-                                    .haveDefinedActivityIdsChanged());
-                            break; 
-                        }
-                        listenerType = -1;
-                    }
-                });
-        // Add an enabled activity
-        listenerType = 2;
-        Set enabledSet = new HashSet(activityManager.getEnabledActivityIds());
-        enabledSet.add("org.eclipse.activity19"); //$NON-NLS-1$
-        activityManager.setEnabledActivityIds(enabledSet);
-        assertTrue(listenerType == -1);
-        // Remove an enabled activity
-        listenerType = 2;
-        enabledSet.remove("org.eclipse.activity19"); //$NON-NLS-1$
-        activityManager.setEnabledActivityIds(enabledSet);
-        assertTrue(listenerType == -1);
-        // Add categroy
-        listenerType = 3;
-        fixedModelRegistry.addCategory("org.eclipse.category7", "Category 7"); //$NON-NLS-1$ //$NON-NLS-2$
-        assertTrue(listenerType == -1);
-        // Remove category
-        listenerType = 3;
-        fixedModelRegistry.removeCategory("org.eclipse.category7", //$NON-NLS-1$
-                "Category 7"); //$NON-NLS-1$ //$NON-NLS-2$
-        assertTrue(listenerType == -1);
-        // Add activity
-        listenerType = 4;
-        fixedModelRegistry.addActivity("org.eclipse.activity19", "Activity 19"); //$NON-NLS-1$ //$NON-NLS-2$
-        assertTrue(listenerType == -1);
-        // Remove activity
-        listenerType = 4;
-        fixedModelRegistry.removeActivity("org.eclipse.activity19", //$NON-NLS-1$
-                "Activity 19"); //$NON-NLS-1$ //$NON-NLS-2$
-        assertTrue(listenerType == -1);
-    }
-
-    /**
-     * Test the activity listener.
-     *  
-     */
-    public void testActivityListener() {
-        final IActivity activity_to_listen = activityManager
-                .getActivity((String) activityManager.getDefinedActivityIds()
-                        .toArray()[0]);
-        activity_to_listen.addActivityListener(new IActivityListener() {
-            public void activityChanged(ActivityEvent activityEvent) {
-                switch (listenerType) {
-                case DEFINED_CHANGED:
-                    assertTrue(activityEvent.hasDefinedChanged());
-                    break;
-                case ENABLED_CHANGED:
-                    assertTrue(activityEvent.hasEnabledChanged());
-                    break;
-                case NAME_CHANGED:
-                    assertTrue(activityEvent.hasNameChanged());
-                    break;
-                case PATTERN_BINDINGS_CHANGED:
-                    assertTrue(activityEvent
-                            .haveActivityPatternBindingsChanged());
-                    break;
-                case ACTIVITY_ACTIVITY_BINDINGS_CHANGED:
-                    assertTrue(activityEvent
-                            .haveActivityRequirementBindingsChanged());
-                    break;
-                case DESCRIPTION_CHANGED:
-                    assertTrue(activityEvent.hasDescriptionChanged());
-                    break;
-                case DEFAULT_ENABLED_CHANGED:
-                    assertTrue(activityEvent.hasDefaultEnabledChanged());
-                    break;
-                }
-                listenerType = -1;
-            }
-        });
-        // Remove activity and change name consequently
-        try {
-            fixedModelRegistry.removeActivity(activity_to_listen.getId(),
-                    activity_to_listen.getName());
-        } catch (NotDefinedException e) {
-            e.printStackTrace(System.err);
-        }
-        assertTrue(listenerType == -1);
-        // Add activity
-        listenerType = 5;
-        fixedModelRegistry.addActivity(activity_to_listen.getId(),
-                "Activity 18"); //$NON-NLS-1$ //$NON-NLS-2$
-        assertTrue(listenerType == -1);
-        // Add to enabled activity
-        listenerType = 6;
-        Set enabledSet = new HashSet(activityManager.getEnabledActivityIds());
-        enabledSet.add(activity_to_listen.getId());
-        activityManager.setEnabledActivityIds(enabledSet);
-        assertTrue(listenerType == -1);
-        // Remove from enabled activity
-        listenerType = 6;
-        enabledSet.remove(activity_to_listen.getId());
-        activityManager.setEnabledActivityIds(enabledSet);
-        assertTrue(listenerType == -1);
-        // Add pattern binding
-        listenerType = 8;
-        fixedModelRegistry.addActivityPatternBinding("org.eclipse.activity18", //$NON-NLS-1$
-                "org.eclipse.pattern3"); //$NON-NLS-1$ //$NON-NLS-2$
-        assertTrue(listenerType == -1);
-        // Remove pattern binding
-        listenerType = 8;
-        fixedModelRegistry.removeActivityPatternBinding("org.eclipse.pattern3");//$NON-NLS-1$
-        assertTrue(listenerType == -1);
-        // Add activity activity binding as parent
-        listenerType = 9;
-        fixedModelRegistry.addActivityRequirementBinding(
-                "org.eclipse.activity9", //$NON-NLS-1$
-                activity_to_listen.getId());//$NON-NLS-1$
-        assertTrue(listenerType == -1);
-        // Remove activity activity binding as parent
-        listenerType = 9;
-        fixedModelRegistry.removeActivityRequirementBinding(
-                "org.eclipse.activity9", activity_to_listen.getId());//$NON-NLS-1$
-        assertTrue(listenerType == -1);
-        //		 Update activity name
-        listenerType = 7;
-        fixedModelRegistry.updateActivityName(activity_to_listen.getId(),
-                "name_change"); //$NON-NLS-1$
-        assertTrue(listenerType == -1);
-        // Update activity description
-        listenerType = 10;
-        fixedModelRegistry.updateActivityDescription(
-                activity_to_listen.getId(), "description_change"); //$NON-NLS-1$
-        assertTrue(listenerType == -1);
-
-        // check default enablement
-        listenerType = DEFAULT_ENABLED_CHANGED;
-        fixedModelRegistry.addDefaultEnabledActivity(activity_to_listen.getId());
-        assertTrue(listenerType == -1);
-        try {
-            assertTrue(activity_to_listen.isDefaultEnabled());
-        } catch (NotDefinedException e1) {
-            fail(e1.getMessage());
-        }
-        
-        listenerType = DEFAULT_ENABLED_CHANGED;
-        fixedModelRegistry.removeDefaultEnabledActivity(activity_to_listen.getId());
-        assertTrue(listenerType == -1);
-        try {
-            assertFalse(activity_to_listen.isDefaultEnabled());
-        } catch (NotDefinedException e1) {
-            fail(e1.getMessage());
-        }
-    }
-
-    /**
-     * Test the category listener.
-     *  
-     */
-    public void testCategoryListener() {
-        final ICategory category_to_listen = activityManager
-                .getCategory((String) activityManager.getDefinedCategoryIds()
-                        .toArray()[0]);
-        category_to_listen.addCategoryListener(new ICategoryListener() {
-            public void categoryChanged(CategoryEvent categoryEvent) {
-                switch (listenerType) {
-                case DEFINED_CHANGED:
-                    assertTrue(categoryEvent.hasDefinedChanged());
-                    break;
-                case NAME_CHANGED:
-                    assertTrue(categoryEvent.hasNameChanged());
-                    break;
-                case PATTERN_BINDINGS_CHANGED:
-                    assertTrue(categoryEvent
-                            .haveCategoryActivityBindingsChanged());
-                    break;
-                case DESCRIPTION_CHANGED:
-                    //	assertTrue(categoryEvent.hasDescriptionChanged());
-                    break;
-                }
-                listenerType = -1;
-            }
-        });
-        // Remove category, and change name
-        try {
-            fixedModelRegistry.removeCategory(category_to_listen.getId(),
-                    category_to_listen.getName()); //$NON-NLS-1$
-        } catch (NotDefinedException e) {
-            e.printStackTrace(System.err);
-        }
-        assertTrue(listenerType == -1);
-        // Add category
-        listenerType = 5;
-        fixedModelRegistry
-                .addCategory(category_to_listen.getId(), "Category 6"); //$NON-NLS-1$ //$NON-NLS-2$
-        assertTrue(listenerType == -1);
-        // Add category activity binding
-        listenerType = 8;
-        fixedModelRegistry.addCategoryActivityBinding((String) activityManager
-                .getDefinedActivityIds().toArray()[4], category_to_listen
-                .getId()); //$NON-NLS-1$
-        assertTrue(listenerType == -1);
-        // Remove activity activity binding
-        listenerType = 8;
-        fixedModelRegistry.removeCategoryActivityBinding(
-                (String) activityManager.getDefinedActivityIds().toArray()[4],
-                category_to_listen.getId());//$NON-NLS-1$
-        // Change category description
-        listenerType = 10;
-        fixedModelRegistry.updateCategoryDescription(
-                category_to_listen.getId(), "description_change"); //$NON-NLS-1$
-        try {
-            assertTrue(category_to_listen.getDescription().equals(
-                    "description_change")); //$NON-NLS-1$
-        } catch (NotDefinedException e) {
-            e.printStackTrace(System.err);
-        }
-        assertTrue(listenerType == -1);
-        // Change category name
-        listenerType = 7;
-        fixedModelRegistry.updateCategoryName(category_to_listen.getId(),
-                "name_change"); //$NON-NLS-1$
-        try {
-            assertTrue(category_to_listen.getName().equals("name_change")); //$NON-NLS-1$
-        } catch (NotDefinedException e) {
-            e.printStackTrace(System.err);
-        }
-        assertTrue(listenerType == -1);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/ImagesTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/ImagesTest.java
deleted file mode 100644
index 9d0272c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/ImagesTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.activities;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.IActivity;
-import org.eclipse.ui.activities.ICategory;
-import org.eclipse.ui.activities.IWorkbenchActivitySupport;
-import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
-import org.eclipse.ui.internal.WorkbenchImages;
-import org.eclipse.ui.tests.harness.util.ImageTests;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.1
- */
-public class ImagesTest extends UITestCase {
-
-	private Image defaultImage;
-	private Image image1;
-	private Image image2;
-
-	/**
-	 * @param testName
-	 */
-	public ImagesTest(String testName) {
-		super(testName);
-	}
-	
-	public void testActivityImages() {
-		IWorkbenchActivitySupport support = PlatformUI.getWorkbench().getActivitySupport();
-		IActivity activity1 = support.getActivityManager().getActivity("org.eclipse.activity1");
-		assertNotNull(activity1);
-		assertTrue(activity1.isDefined());
-		IActivity activity2 = support.getActivityManager().getActivity("org.eclipse.activity2");
-		assertNotNull(activity2);
-		assertTrue(activity2.isDefined());
-		
-		ImageDescriptor defaultImageDesc = WorkbenchImages.getImageDescriptor(IWorkbenchGraphicConstants.IMG_OBJ_ACTIVITY);		
-		defaultImage = defaultImageDesc.createImage();
-		
-		ImageDescriptor desc1 = support.getImageDescriptor(activity1);
-		image1 = desc1.createImage();
-		
-		assertNotSame(defaultImageDesc, desc1);
-	    ImageTests.assertNotEquals(defaultImage, image1);
-	    
-		ImageDescriptor desc2 = support.getImageDescriptor(activity2);
-		image2 = desc2.createImage();
-		
-		assertSame(defaultImageDesc, desc2);
-		ImageTests.assertEquals(defaultImage, image2);
-	}
-	
-	
-	public void testCategoryImages() {
-		IWorkbenchActivitySupport support = PlatformUI.getWorkbench().getActivitySupport();
-		ICategory category1 = support.getActivityManager().getCategory("org.eclipse.category1");
-		assertNotNull(category1);
-		assertTrue(category1.isDefined());
-		ICategory category2 = support.getActivityManager().getCategory("org.eclipse.category2");
-		assertNotNull(category2);
-		assertTrue(category2.isDefined());
-		
-		ImageDescriptor defaultImageDesc = WorkbenchImages.getImageDescriptor(IWorkbenchGraphicConstants.IMG_OBJ_ACTIVITY_CATEGORY);		
-		defaultImage = defaultImageDesc.createImage();
-		
-		ImageDescriptor desc1 = support.getImageDescriptor(category1);
-		image1 = desc1.createImage();
-		
-		assertNotSame(defaultImageDesc, desc1);
-	    ImageTests.assertNotEquals(defaultImage, image1);
-	    
-		ImageDescriptor desc2 = support.getImageDescriptor(category2);
-		image2 = desc2.createImage();
-		
-		assertSame(defaultImageDesc, desc2);
-		ImageTests.assertEquals(defaultImage, image2);
-	}
-
-
-	protected void doTearDown() throws Exception {
-		super.doTearDown();
-		if (defaultImage != null)
-			defaultImage.dispose();
-		if (image1 != null)
-			image1.dispose();
-		if (image2 != null)
-			image2.dispose();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/MenusTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/MenusTest.java
deleted file mode 100644
index befd34d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/MenusTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.activities;
-
-import java.util.Collections;
-import java.util.Set;
-
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.menus.AbstractContributionFactory;
-import org.eclipse.ui.menus.CommandContributionItem;
-import org.eclipse.ui.menus.IContributionRoot;
-import org.eclipse.ui.menus.IMenuService;
-import org.eclipse.ui.services.IServiceLocator;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.3
- * 
- */
-public class MenusTest extends UITestCase {
-
-	private TestFactory factory;
-	private IWorkbenchWindow window;
-	private IMenuService service;
-	private Set enabledActivities;
-
-	/**
-	 * @since 3.3
-	 * 
-	 */
-	private final class TestFactory extends AbstractContributionFactory {
-		private CommandContributionItem fooItemWithNoVisibilityClause;
-		private CommandContributionItem barItemWithNoVisibilityClause;
-
-		/**
-		 * @param location
-		 * @param namespace
-		 * @param items
-		 */
-		private TestFactory(String location, String namespace) {
-			super(location, namespace);
-		}
-
-		public void createContributionItems(IServiceLocator serviceLocator,
-				IContributionRoot additions) {
-			fooItemWithNoVisibilityClause = new CommandContributionItem(
-					serviceLocator, "foo", "foo", null, null, null, null,
-					"Hi there", null, null, CommandContributionItem.STYLE_PUSH);
-			barItemWithNoVisibilityClause = new CommandContributionItem(
-					serviceLocator, "bar", "bar", null, null, null, null,
-					"Muppet", null, null, CommandContributionItem.STYLE_PUSH);
-
-			additions.addContributionItem(fooItemWithNoVisibilityClause, null);
-			additions.addContributionItem(barItemWithNoVisibilityClause, null);
-		}
-
-		/**
-		 * @return Returns the fooItemWithNoVisibilityClause.
-		 */
-		public CommandContributionItem getFooItemWithNoVisibilityClause() {
-			return fooItemWithNoVisibilityClause;
-		}
-
-		/**
-		 * @return Returns the barItemWithNoVisibilityClause.
-		 */
-		public CommandContributionItem getBarItemWithNoVisibilityClause() {
-			return barItemWithNoVisibilityClause;
-		}
-	}
-
-	/**
-	 * @param testName
-	 */
-	public MenusTest(String testName) {
-		super(testName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doSetUp()
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		window = openTestWindow();
-		enabledActivities = window.getWorkbench().getActivitySupport()
-				.getActivityManager().getEnabledActivityIds();
-		service = (IMenuService) window.getService(IMenuService.class);
-		assertNotNull(service);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doTearDown()
-	 */
-	protected void doTearDown() throws Exception {
-		window.getWorkbench().getActivitySupport().setEnabledActivityIds(
-				enabledActivities);
-		assertEquals(enabledActivities, window.getWorkbench()
-				.getActivitySupport().getActivityManager()
-				.getEnabledActivityIds());
-		if (factory != null) {
-			service.removeContributionFactory(factory);
-		}
-		super.doTearDown();
-	}
-
-	public void testNoNamespaceFactory() {
-		window.getWorkbench().getActivitySupport().setEnabledActivityIds(
-				Collections.singleton("menuTest1")); // enable the foo
-														// activity
-
-		factory = new TestFactory("menu:tests", null);
-		service.addContributionFactory(factory);
-		MenuManager manager = new MenuManager();
-		service.populateContributionManager(manager, "menu:tests");
-		assertTrue(manager.getSize() > 0);
-		
-		assertTrue(factory.getFooItemWithNoVisibilityClause().isVisible());
-		assertTrue(factory.getBarItemWithNoVisibilityClause().isVisible());
-		
-		window.getWorkbench().getActivitySupport().setEnabledActivityIds(
-				Collections.EMPTY_SET);
-		assertTrue(factory.getFooItemWithNoVisibilityClause().isVisible());
-		assertTrue(factory.getBarItemWithNoVisibilityClause().isVisible());
-		
-	}
-
-	public void testMenuVisibilityWithCustomFactory() {
-		window.getWorkbench().getActivitySupport().setEnabledActivityIds(
-				Collections.singleton("menuTest1")); // enable the foo
-														// activity		
-		factory = new TestFactory("menu:tests",
-				"org.eclipse.ui.tests");
-		service.addContributionFactory(factory);
-		MenuManager manager = new MenuManager();
-		service.populateContributionManager(manager, "menu:tests");
-		assertTrue(manager.getSize() > 0);
-
-		assertTrue(factory.getFooItemWithNoVisibilityClause().isVisible());
-		assertFalse(factory.getBarItemWithNoVisibilityClause().isVisible());
-
-		window.getWorkbench().getActivitySupport().setEnabledActivityIds(
-				Collections.EMPTY_SET);
-		assertFalse(factory.getFooItemWithNoVisibilityClause().isVisible());
-		assertFalse(factory.getBarItemWithNoVisibilityClause().isVisible());
-
-		window.getWorkbench().getActivitySupport().setEnabledActivityIds(
-				Collections.singleton("menuTest2")); // enable the all
-														// activity
-		assertFalse(factory.getFooItemWithNoVisibilityClause().isVisible());
-		assertTrue(factory.getBarItemWithNoVisibilityClause().isVisible());
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/PatternUtilTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/PatternUtilTest.java
deleted file mode 100644
index d196178..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/PatternUtilTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Bredex GmbH - Creator of this testing class.
- ******************************************************************************/
-
-package org.eclipse.ui.tests.activities;
-
-import java.util.regex.Pattern;
-
-import org.eclipse.ui.internal.activities.PatternUtil;
-
-import junit.framework.TestCase;
-
-/**
- * Test for:
- * Utility helper class for regular expression string patterns. 
- * 
- * @since 3.4
- * @author Jan Diederich
- */
-public class PatternUtilTest extends TestCase {
-	
-    /**
-     * Tests if the quote function of ActivityPatternBinding works.
-     */    
-    public static void testQuotePattern() {
-    	assertTrue(PatternUtil.quotePattern("abcd").equals("\\Qabcd\\E"));
-    	assertTrue(PatternUtil.quotePattern("Test\\Q").equals("\\QTest\\Q\\E"));
-		assertTrue(PatternUtil.quotePattern("Test\\Q\\E").equals(
-				"\\QTest\\Q\\E\\\\E\\Q\\E"));
-		assertTrue(PatternUtil.quotePattern("Test\\E\\Q").equals(
-				"\\QTest\\E\\\\E\\Q\\Q\\E"));		
-		assertTrue(PatternUtil.quotePattern("\\ETest\\E\\\\E\\E").equals(
-				"\\Q\\E\\\\E\\QTest\\E\\\\E\\Q\\\\E\\\\E\\Q\\E\\\\E\\Q\\E"));
-		String searchString = "xy[^a]";
-		assertFalse(Pattern.compile(searchString).matcher(searchString)
-				.matches());
-		assertTrue(Pattern.compile(PatternUtil.quotePattern(searchString))
-				.matcher(searchString).matches());    	
-    }
-    
-    /**
-     * For quick testing, without JUnit launch.
-     * 
-     * @param args
-     */
-    public static void main(String[] args) {
-    	testQuotePattern();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/PersistanceTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/PersistanceTest.java
deleted file mode 100644
index aa62a17..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/PersistanceTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.activities;
-
-import java.util.Iterator;
-
-import org.eclipse.ui.activities.IActivity;
-import org.eclipse.ui.activities.IActivityManager;
-import org.eclipse.ui.activities.ICategory;
-import org.eclipse.ui.activities.NotDefinedException;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests that the Persistance class is catching malformed registry entries.
- * 
- * @since 3.1
- */
-public class PersistanceTest extends UITestCase {
-
-    /**
-     * @param testName
-     */
-    public PersistanceTest(String testName) {
-        super(testName);
-    }
-
-    public void testCategoryPermutations() {
-        try {
-	        IActivityManager manager = fWorkbench.getActivitySupport().getActivityManager();
-	        ICategory category = manager.getCategory("org.eclipse.ui.PT.C1"); // should not be defined - missing name
-	        assertFalse(category.isDefined());
-	        
-	        category = manager.getCategory("org.eclipse.ui.PT.C2"); // should be defined - missing desc
-	        assertTrue(category.isDefined());
-	        assertNotNull(category.getDescription());
-	        
-	        for (Iterator i = manager.getDefinedCategoryIds().iterator(); i.hasNext(); ) {
-	            if (manager.getCategory((String) i.next()).getName().equals("org.eclipse.ui.PT.C3"))
-	                fail("Found category that should not be.");
-	        }
-        }
-        catch (NotDefinedException e) {
-            fail(e.getMessage());
-        }
-    }    
-    
-    public void testActivityRequirementBindings() {
-        IActivityManager manager = fWorkbench.getActivitySupport().getActivityManager();
-        IActivity activity  = manager.getActivity("org.eclipse.ui.PT.A2");
-        assertTrue(activity.getActivityRequirementBindings().isEmpty());     
-    }
-    
-    public void testActivityPatternBindings() {
-        IActivityManager manager = fWorkbench.getActivitySupport().getActivityManager();
-        IActivity activity  = manager.getActivity("org.eclipse.ui.PT.A2");
-        assertTrue(activity.getActivityPatternBindings().isEmpty());     
-    }
-
-    public void testCategoryActivityBindings() {
-        IActivityManager manager = fWorkbench.getActivitySupport().getActivityManager();
-        ICategory category  = manager.getCategory("org.eclipse.ui.PT.C2");
-        assertTrue(category.getCategoryActivityBindings().isEmpty());     
-    } 
-    
-    public void testActivityPermutations() {
-        try {
-	        IActivityManager manager = fWorkbench.getActivitySupport().getActivityManager();
-	        IActivity activity = manager.getActivity("org.eclipse.ui.PT.A1"); // should not be defined - missing name
-	        assertFalse(activity.isDefined());
-	        
-	        activity = manager.getActivity("org.eclipse.ui.PT.A2"); // should be defined - missing desc
-	        assertTrue(activity.isDefined());
-	        assertNotNull(activity.getDescription());
-	        
-	        for (Iterator i = manager.getDefinedActivityIds().iterator(); i.hasNext(); ) {
-	            if (manager.getActivity((String) i.next()).getName().equals("org.eclipse.ui.PT.A3"))
-	                fail("Found activity that should not be.");
-	        }
-        }
-        catch (NotDefinedException e) {
-            fail(e.getMessage());
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/StaticTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/StaticTest.java
deleted file mode 100644
index 395a7dd..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/StaticTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.activities;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.ui.activities.IActivity;
-import org.eclipse.ui.activities.IActivityManager;
-import org.eclipse.ui.activities.IActivityPatternBinding;
-import org.eclipse.ui.activities.ICategory;
-import org.eclipse.ui.activities.IIdentifier;
-import org.eclipse.ui.activities.NotDefinedException;
-import org.eclipse.ui.internal.Workbench;
-import org.eclipse.ui.internal.activities.ActivityRequirementBinding;
-import org.eclipse.ui.internal.activities.CategoryActivityBinding;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * 
- * The static test reads activity definitions from the plugin.xml (in
- * org.eclipse.ui.tests) file and valides its content.
- */
-public class StaticTest extends UITestCase {
-    private IActivityManager activityManager;
-
-    private List categoryIds;
-
-    private List activityIds;
-
-    private List patternActivityIds;
-
-    /**
-     * Constructor.
-     * 
-     * @param testName
-     *            Test's name.
-     */
-    public StaticTest(String testName) {
-        super(testName);
-        activityManager = Workbench.getInstance().getActivitySupport()
-                .getActivityManager();
-        populateIds();
-    }
-
-    /**
-     * Populate the id arrays.
-     *  
-     */
-    private void populateIds() {
-        int index = 0;
-        categoryIds = new ArrayList();
-        for (index = 1; index <= 6; index++)
-            categoryIds.add("org.eclipse.category" + Integer.toString(index)); //$NON-NLS-1$
-        activityIds = new ArrayList();
-        for (index = 1; index <= 18; index++)
-            activityIds.add("org.eclipse.activity" + Integer.toString(index)); //$NON-NLS-1$
-        patternActivityIds = new ArrayList();
-        for (index = 0; index < 3; index++)
-            patternActivityIds.add(activityIds.toArray()[index]);
-    }
-
-    /**
-     * Test the activity manager's content.
-     *  
-     */
-    public void testActivityManager() {
-        // Check the defined category Ids
-        assertTrue(activityManager.getDefinedCategoryIds().containsAll(
-                categoryIds));
-        // Check the defined activity Ids
-        assertTrue(activityManager.getDefinedActivityIds().containsAll(
-                activityIds));
-        // Check enabled activity Ids
-        for (int index = 1; index <= 4; index++)
-            assertTrue(activityManager.getEnabledActivityIds().contains(
-                    "org.eclipse.activity" + Integer.toString(index)));
-        // Check identifier
-        IIdentifier activityIdentifier = activityManager
-                .getIdentifier("org.eclipse.pattern1");
-        Set activityIds = activityIdentifier.getActivityIds();
-        assertTrue(activityIds.containsAll(patternActivityIds));
-        assertTrue(activityIdentifier.getId().equals("org.eclipse.pattern1"));
-    }
-
-    /**
-     * Test an activitie's content.
-     *  
-     */
-    public void testActivity() {
-        IActivity first_activity = activityManager
-                .getActivity((String) activityIds.toArray()[0]);
-        // Check activity activity bindings for parent activity
-        Set activityRequirementBindings = first_activity
-                .getActivityRequirementBindings();
-        for (int index = 2; index <= 7; index++) {
-            assertTrue(activityRequirementBindings
-                    .contains(new ActivityRequirementBinding(
-                            "org.eclipse.activity" + Integer.toString(index),
-                            "org.eclipse.activity1")));
-        }
-        // Check activity pattern bindings
-        Set activityPatternBindings = first_activity
-                .getActivityPatternBindings();
-        assertTrue(activityPatternBindings.size() != 0);
-        IActivityPatternBinding activityPatternBinding = (IActivityPatternBinding) activityPatternBindings
-                .toArray()[0];
-        assertTrue(activityPatternBinding.getActivityId().equals(
-                first_activity.getId()));
-        assertTrue(activityPatternBinding.getPattern().pattern().equals(
-                "org.eclipse.pattern1"));
-        // Check description
-        try {
-            assertTrue(first_activity.getDescription().equals("description"));
-        } catch (NotDefinedException e) {
-            e.printStackTrace();
-        }
-        // Check activity id
-        assertTrue(first_activity.getId().equals("org.eclipse.activity1"));
-        // Check activity name
-        try {
-            assertTrue(first_activity.getName().equals("Activity 1"));
-        } catch (NotDefinedException e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Test a category's content.
-     *  
-     */
-    public void testCategory() {
-        ICategory first_category = activityManager
-                .getCategory((String) categoryIds.toArray()[0]);
-        // Check category activity bindings
-        Set categoryActivityBindings = first_category
-                .getCategoryActivityBindings();
-        for (int index = 1; index <= 4; index++)
-            assertTrue(categoryActivityBindings
-                    .contains(new CategoryActivityBinding(
-                            "org.eclipse.activity" + Integer.toString(index),
-                            first_category.getId())));
-        try {
-            // Check category description
-            assertTrue(first_category.getDescription().equals("description"));
-        } catch (NotDefinedException e) {
-            e.printStackTrace();
-        }
-        // Check category id
-        assertTrue(first_category.getId().equals("org.eclipse.category1"));
-        try {
-            // Check category name
-            assertTrue(first_category.getName().equals("Category 1"));
-        } catch (NotDefinedException e) {
-            e.printStackTrace();
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/UtilTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/UtilTest.java
deleted file mode 100644
index 5765ab4..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/activities/UtilTest.java
+++ /dev/null
@@ -1,634 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.activities;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.internal.expressions.TestExpression;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.AbstractSourceProvider;
-import org.eclipse.ui.IPluginContribution;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.IActivity;
-import org.eclipse.ui.activities.IActivityManager;
-import org.eclipse.ui.activities.IActivityPatternBinding;
-import org.eclipse.ui.activities.IIdentifier;
-import org.eclipse.ui.activities.IWorkbenchActivitySupport;
-import org.eclipse.ui.activities.WorkbenchActivityHelper;
-import org.eclipse.ui.contexts.IContextActivation;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.services.IEvaluationService;
-
-/**
- * Tests various utility methods on WorkbenchActivityHelper as well as other misc. activities functionality.
- * 
- * @since 3.1
- */
-public class UtilTest extends TestCase {
-	
-	private Set rememberedSet;
-	
-	public static final String ID1 = "org.eclipse.ui.tests.util.1";
-	public static final String ID2 = "org.eclipse.ui.tests.util.2";
-	public static final String ID3 = "org.eclipse.ui.tests.util.3";
-	public static final String ID4 = "org.eclipse.ui.tests.util.4";
-	public static final String ID5 = "org.eclipse.ui.tests.util.5";
-	
-	/**
-	 * @param name
-	 */
-	public UtilTest(String name) {
-		super(name); 
-	}
-
-	/**
-	 * Asserts that if you enable cat 1 then cat 3 would also be enabled (they
-	 * contain the same activity).
-	 */
-	public void testGetEnabledCategories1() {
-		Set ids = WorkbenchActivityHelper.getEnabledCategories(getActivityManager(), ID1);
-		assertEquals(1, ids.size());
-		assertTrue(ids.contains(ID3));
-	}
-
-	/**
-	 * Asserts that if you enable cat 2 then cat 1 and cat 3 would also be
-	 * enabled. Cat 2 has activity 2, which depends on activity 1.
-	 */
-	public void testGetEnabledCategories2() {
-		Set ids = WorkbenchActivityHelper.getEnabledCategories(getActivityManager(), ID2);
-		assertEquals(2, ids.size());
-		assertTrue(ids.contains(ID1));
-		assertTrue(ids.contains(ID3));
-	}
-		
-	/**
-	 * Asserts that if you enable cat 3 then cat 1 would also be enabled (they
-	 * contain the same activity).
-	 */
-	public void testGetEnabledCategories3() {
-		Set ids = WorkbenchActivityHelper.getEnabledCategories(getActivityManager(), ID3);
-		assertEquals(1, ids.size());
-		assertTrue(ids.contains(ID1));
-	}
-	
-	/**
-	 * Asserts that if you enable cat 4 then no other categories would change..
-	 */
-	public void testGetEnabledCategories4() {
-		Set ids = WorkbenchActivityHelper.getEnabledCategories(getActivityManager(), ID4);
-		assertEquals(0, ids.size());
-	}
-	
-	/**
-	 * Asserts that if you enable cat 5 then cat 4 will become enabled
-	 */
-	public void testGetEnabledCategories5() {
-		Set ids = WorkbenchActivityHelper.getEnabledCategories(getActivityManager(), ID5);
-		assertEquals(1, ids.size());
-		assertTrue(ids.contains(ID4));
-	}
-
-	/**
-	 * Asserts that if you enable cat 1 when it's activity is already enabled
-	 * then no categories would change.
-	 */
-	public void testGetEnabledCategories1_A() {
-		HashSet set = new HashSet();
-		set.add(ID1);
-		PlatformUI.getWorkbench().getActivitySupport().setEnabledActivityIds(set);
-		assertEquals(0, WorkbenchActivityHelper.getEnabledCategories(getActivityManager(), ID1).size());
-	}
-	
-	/**
-	 * Asserts that if you enable cat 2 when it's activity is already enabled
-	 * then no categories would change.
-	 */
-	public void testGetEnabledCategories2_A() {
-		HashSet set = new HashSet();
-		set.add(ID2);
-		PlatformUI.getWorkbench().getActivitySupport().setEnabledActivityIds(set);
-		assertEquals(0, WorkbenchActivityHelper.getEnabledCategories(getActivityManager(), ID2).size());
-	}
-	
-	/**
-	 * Asserts that if you enable cat 3 when it's activity is already enabled
-	 * then no categories would change.
-	 */
-	public void testGetEnabledCategories3_A() {
-		HashSet set = new HashSet();
-		set.add(ID1);
-		PlatformUI.getWorkbench().getActivitySupport().setEnabledActivityIds(set);
-		assertEquals(0, WorkbenchActivityHelper.getEnabledCategories(getActivityManager(), ID3).size());
-	}	
-	
-	/**
-	 * Asserts that if you enable cat 4 when it's activity is already enabled
-	 * then no categories would change.
-	 */
-	public void testGetEnabledCategories4_A() {
-		HashSet set = new HashSet();
-		set.add(ID4);
-		PlatformUI.getWorkbench().getActivitySupport().setEnabledActivityIds(set);
-		assertEquals(0, WorkbenchActivityHelper.getEnabledCategories(getActivityManager(), ID4).size());
-	}
-	
-	/**
-	 * Asserts that if you enable cat 5 when activity 4 is already enabled
-	 * then no categories would change.
-	 */
-	public void testGetEnabledCategories5_Aa() {
-		HashSet set = new HashSet();
-		set.add(ID4);
-		PlatformUI.getWorkbench().getActivitySupport().setEnabledActivityIds(set);
-		assertEquals(0, WorkbenchActivityHelper.getEnabledCategories(getActivityManager(), ID5).size());
-	}
-	
-	/**
-	 * Asserts that if you enable cat 5 when activity 5 is already enabled
-	 * then cat 4 would change.
-	 */
-	public void testGetEnabledCategories5_Ab() {
-		HashSet set = new HashSet();
-		set.add(ID5);
-		PlatformUI.getWorkbench().getActivitySupport().setEnabledActivityIds(set);
-		Set ids = WorkbenchActivityHelper.getEnabledCategories(getActivityManager(), ID5);
-		assertEquals(1, ids.size());
-		assertTrue(ids.contains(ID4));
-	}	
-	
-	/**
-	 * Asserts that if you disable cat 1 then cat 3 would also be disabled (they
-	 * contain the same activity).
-	 */
-	public void testGetDisabledCategories1() {
-		enableAll();
-		Set ids = WorkbenchActivityHelper.getDisabledCategories(getActivityManager(), ID1);
-		assertEquals(1, ids.size());
-		assertTrue(ids.contains(ID3));
-	}
-	
-	/**
-	 * Asserts that if you disable cat 2 then cat 1 and cat 3 would also be disabled.
-	 */
-	public void testGetDisabledCategories2() {
-		enableAll();
-		Set ids = WorkbenchActivityHelper.getDisabledCategories(getActivityManager(), ID2);
-		assertEquals(2, ids.size());
-		assertTrue(ids.contains(ID1));
-		assertTrue(ids.contains(ID3));
-	}
-	
-	/**
-	 * Asserts that if you disable cat 3 then cat 1 would also be disabled.
-	 */
-	public void testGetDisabledCategories3() {
-		enableAll();
-		Set ids = WorkbenchActivityHelper.getDisabledCategories(getActivityManager(), ID3);
-		assertEquals(1, ids.size());
-		assertTrue(ids.contains(ID1));
-	}
-	
-	/**
-	 * Asserts that if you disable cat 4 then no other categories would also be disabled.
-	 */
-	public void testGetDisabledCategories4() {
-		enableAll();
-		Set ids = WorkbenchActivityHelper.getDisabledCategories(getActivityManager(), ID4);
-		assertEquals(0, ids.size());
-	}
-	
-	/**
-	 * Asserts that if you disable cat 5 then cat 4 would also be disabled.
-	 */
-	public void testGetDisabledCategories5() {
-		enableAll();
-		Set ids = WorkbenchActivityHelper.getDisabledCategories(getActivityManager(), ID5);
-		assertEquals(1, ids.size());
-		assertTrue(ids.contains(ID4));
-	}
-	
-	/**
-	 * Asserts that the enabled category count for activity 1 is 2 (cat 1 and 3).
-	 */
-	public void testCategoryCount1_A() {
-		enableAll();
-		Set ids = WorkbenchActivityHelper.getEnabledCategoriesForActivity(getActivityManager(), ID1);
-		assertEquals(2, ids.size());
-		assertTrue(ids.contains(ID1));
-		assertTrue(ids.contains(ID3));
-	}
-	
-	/**
-	 * Asserts that the enabled category count for activity 2 is 1 (cat 2).
-	 */
-	public void testCategoryCount2_A() {
-		enableAll();
-		Set ids = WorkbenchActivityHelper.getEnabledCategoriesForActivity(getActivityManager(), ID2);
-		assertEquals(1, ids.size());
-		assertTrue(ids.contains(ID2));
-	}
-	
-	/**
-	 * Asserts that the enabled category count for activity 4 is 2 (cat 4 and 5).
-	 */
-	public void testCategoryCount4_A() {
-		enableAll();
-		Set ids = WorkbenchActivityHelper.getEnabledCategoriesForActivity(getActivityManager(), ID4);
-		assertEquals(2, ids.size());
-		assertTrue(ids.contains(ID4));
-		assertTrue(ids.contains(ID5));
-	}
-	
-	/**
-	 * Asserts that the enabled category count for activity 5 is 1 (cat 5).
-	 */
-	public void testCategoryCount5_A() {
-		enableAll();
-		Set ids = WorkbenchActivityHelper.getEnabledCategoriesForActivity(getActivityManager(), ID5);
-		assertEquals(1, ids.size());
-		assertTrue(ids.contains(ID5));
-	}
-	
-	/**
-	 * Test the activity property tester.  Test the isActivityEnabled property
-	 * 
-	 */
-	public void testPropertyTester1() {
-		enableAll();
-		EvaluationContext context = new EvaluationContext(null, PlatformUI.getWorkbench());
-
-		IWorkbenchActivitySupport workbenchActivitySupport = PlatformUI
-				.getWorkbench().getActivitySupport();
-		IActivityManager activityManager = workbenchActivitySupport
-				.getActivityManager();
-		
-		testPropertyTester1(context, activityManager);
-		Set set = new HashSet();
-		workbenchActivitySupport.setEnabledActivityIds(set);
-		
-		testPropertyTester1(context, activityManager);
-	}
-
-	/**
-	 * @param context
-	 * @param activityManager
-	 */
-	private void testPropertyTester1(EvaluationContext context,
-			IActivityManager activityManager) {
-		boolean result = activityManager
-				.getActivity(ID1).isEnabled();
-
-		TestExpression test = new TestExpression("org.eclipse.ui",
-				"isActivityEnabled", new Object[] { ID1 },
-				null);
-		
-		try {
-			assertEquals(result ? EvaluationResult.TRUE: EvaluationResult.FALSE, test.evaluate(context));
-		} catch (CoreException e) {
-			fail(e.getMessage());
-		}
-	}
-	
-	/**
-	 * Test the activity property tester.  Test the isCategoryEnabled property
-	 * 
-	 */
-	public void testPropertyTester2() {
-		enableAll();
-		EvaluationContext context = new EvaluationContext(null, PlatformUI.getWorkbench());
-
-		IWorkbenchActivitySupport workbenchActivitySupport = PlatformUI
-				.getWorkbench().getActivitySupport();
-		IActivityManager activityManager = workbenchActivitySupport
-				.getActivityManager();
-		
-		testPropertyTester2(context, activityManager);
-		Set set = new HashSet();
-		workbenchActivitySupport.setEnabledActivityIds(set);
-		
-		testPropertyTester2(context, activityManager);
-	}
-	
-	
-	public static final String EXPRESSION_ACTIVITY_ID = "org.eclipse.ui.tests.filter1.enabled";
-	public static final String EXPRESSION_ACTIVITY_ID_2 = "org.eclipse.ui.tests.filter2.enabled";
-	public static final String EXPRESSION_ACTIVITY_ID_3 = "org.eclipse.ui.tests.filter3.enabled";
-	public static final String EXPRESSION_ACTIVITY_ID_4 = "org.eclipse.ui.tests.filter4.enabled";
-	public static final String EXPRESSION_ACTIVITY_ID_5 = "org.eclipse.ui.tests.filter5.enabled";
-	public static final String EXPRESSION_ACTIVITY_ID_6 = "org.eclipse.ui.tests.filter6.enabled";
-	public static final String EXPRESSION_ACTIVITY_ID_7 = "org.eclipse.ui.tests.filter7.enabled";
-
-	public static final String EXPRESSION_VALUE = "org.eclipse.ui.command.contexts.enablement_test1";
-
-	class TestSourceProvider extends AbstractSourceProvider {
-		public static final String VARIABLE = "arbitraryVariable";
-		public static final String VALUE = "arbitraryValue";
-
-		private Map sourceState = new HashMap(1);
-
-		public TestSourceProvider() {
-			super();
-			clearVariable();
-		}
-
-		public Map getCurrentState() {
-			return sourceState;
-		}
-
-		public String[] getProvidedSourceNames() {
-			return new String[] { VARIABLE };
-		}
-
-		/* 
-		 * (non-Javadoc)		 
-		 * @see org.eclipse.ui.ISourceProvider#dispose()
-		 */
-		public void dispose() {
-		}
-
-		/**
-		 * @see {@link #fireSourceChanged(int, Map)}
-		 */
-		public void fireSourceChanged() {
-			fireSourceChanged(0, sourceState);
-		}
-
-		/**
-		 * Sets variable to value. Triggers no fireSourceChanged() update.
-		 */
-		public void setVariable() {
-			sourceState.put(VARIABLE, VALUE);
-		}
-		
-		/**
-		 * Clears variable to empty string. Triggers no fireSourceChanged()
-		 * update.
-		 */
-		public void clearVariable() {
-			sourceState.put(VARIABLE, "");
-		}
-	};
-	
-	public void testExpressionEnablement() throws Exception {
-		IPluginContribution filterExp = new IPluginContribution() {
-			public String getLocalId() {
-				return "filter";
-			}
-			public String getPluginId() {
-				return "org";
-			}
-		};
-		IPluginContribution filterExp2 = new IPluginContribution() {
-			public String getLocalId() {
-				return "filter2";
-			}
-			public String getPluginId() {
-				return "org";
-			}
-		};
-		IPluginContribution noExp = new IPluginContribution() {
-			public String getLocalId() {
-				return "donotfilter";
-			}
-			public String getPluginId() {
-				return "org";
-			}
-		};
-		assertTrue(WorkbenchActivityHelper.filterItem(filterExp));
-		assertTrue(WorkbenchActivityHelper.filterItem(noExp));
-		assertTrue(WorkbenchActivityHelper.restrictUseOf(filterExp));
-		assertFalse(WorkbenchActivityHelper.restrictUseOf(noExp));
-		
-		// The EXPRESSION_ACTIVITY_ID_3 is always true, and therefore it must
-		// be in the enabledActivityIds list - right from the beginning.
-		IWorkbenchActivitySupport support = PlatformUI.getWorkbench()
-				.getActivitySupport();
-		Set enabledActivityIds = support.getActivityManager()
-				.getEnabledActivityIds();
-		assertTrue(enabledActivityIds.contains(EXPRESSION_ACTIVITY_ID_3));
-		
-		// Test activityRequirmentBinding ignored on expression controlled
-		// activities.
-		// Test conventional activity depends on expression activity. 
-		assertFalse(enabledActivityIds.contains(EXPRESSION_ACTIVITY_ID_4));
-		assertFalse(enabledActivityIds.contains(EXPRESSION_ACTIVITY_ID_5));
-		enabledActivityIds = new HashSet(enabledActivityIds);
-		enabledActivityIds.add(EXPRESSION_ACTIVITY_ID_5);
-		support.setEnabledActivityIds(enabledActivityIds);
-		enabledActivityIds = support.getActivityManager()
-				.getEnabledActivityIds();
-		assertFalse(enabledActivityIds.contains(EXPRESSION_ACTIVITY_ID_4));
-		assertTrue(enabledActivityIds.contains(EXPRESSION_ACTIVITY_ID_5));
-		
-		// Test expression activity depends on conventional activity.
-		assertFalse(enabledActivityIds.contains(EXPRESSION_ACTIVITY_ID_6));
-		assertTrue(enabledActivityIds.contains(EXPRESSION_ACTIVITY_ID_7));
-		
-		
-		// need to enable the normal activity, org.eclipse.ui.tests.filter1.normal
-		// and change the context to enable org.eclipse.ui.tests.filter1.enabled:
-		// context: org.eclipse.ui.command.contexts.enablement_test1
-		
-		IContextService localService = (IContextService) PlatformUI
-				.getWorkbench().getService(IContextService.class);
-		IContextActivation activation = localService.activateContext(EXPRESSION_VALUE);
-		try {
-		// Not restricted anymore.
-		assertFalse(WorkbenchActivityHelper.restrictUseOf(filterExp));
-
-		// Test recognition of disabled expression which is already filtered.
-		localService.deactivateContext(activation);
-		assertTrue(WorkbenchActivityHelper.restrictUseOf(filterExp));		
-
-		//
-		// Testing with an arbitrary self-declared test variable.
-		//
-		TestSourceProvider testSourceProvider = new TestSourceProvider();
-		IEvaluationService evalService = (IEvaluationService) PlatformUI
-				.getWorkbench().getService(IEvaluationService.class);
-		evalService.addSourceProvider(testSourceProvider);
-		testSourceProvider.fireSourceChanged();
-
-		// Non-set variable.
-		assertTrue(WorkbenchActivityHelper.restrictUseOf(filterExp2));
-
-		// Set variable.
-		testSourceProvider.setVariable();
-		testSourceProvider.fireSourceChanged();
-		assertFalse(WorkbenchActivityHelper.restrictUseOf(filterExp2));
-		
-		//------------------------
-		// Rerun last test with a "twist" - "twist" described in next comment.
-		//------------------------
-		// Clear variable again.
-		testSourceProvider.clearVariable();
-		testSourceProvider.fireSourceChanged();
-		
-		// Put the activity in the enabledActivity list, so it would run into
-		// problems if it not correctly recognizes the difference when already
-		// marked as enabled (by being in the list) while the expression, which
-		// controls the activity, becomes in reality only later enabled.		
-		Set set = new HashSet(support.getActivityManager().getEnabledActivityIds());
-		set.add(EXPRESSION_ACTIVITY_ID_2);
-		support.setEnabledActivityIds(set);
-		
-		// Set variable again.
-		testSourceProvider.setVariable();
-		testSourceProvider.fireSourceChanged();
-		assertFalse(WorkbenchActivityHelper.restrictUseOf(filterExp2));
-
-		evalService.removeSourceProvider(testSourceProvider);
-		}
-		finally {
-			localService.deactivateContext(activation);
-		}
-	}
-	
-	/**
-	 * @param context
-	 * @param activityManager
-	 */
-	private void testPropertyTester2(EvaluationContext context,
-			IActivityManager activityManager) {
-		boolean result = WorkbenchActivityHelper.isEnabled(activityManager, ID1);
-
-
-		TestExpression test = new TestExpression("org.eclipse.ui",
-				"isCategoryEnabled", new Object[] { ID1 },
-				null);
-		
-		try {
-			assertEquals(result ? EvaluationResult.TRUE: EvaluationResult.FALSE, test.evaluate(context));
-		} catch (CoreException e) {
-			fail(e.getMessage());
-		}
-	}
-	
-	/**
-	 * Enable all test activities.
-	 */
-	private void enableAll() {
-		HashSet set = new HashSet();
-		set.add(ID1);
-		set.add(ID2);
-		set.add(ID4);
-		set.add(ID5);
-		PlatformUI.getWorkbench().getActivitySupport().setEnabledActivityIds(
-				set);
-	}
-
-    /**
-     * Return the system activity manager.
-     * 
-     * @return the system activity manager
-     */
-    private IActivityManager getActivityManager() {
-        return  PlatformUI.getWorkbench()
-        .getActivitySupport().getActivityManager();
-    }
-    
-    /**
-     * Tests non-regular Expression Pattern bindings.
-     */
-    public void testNonRegExpressionPattern() {    	
-    	final String ACTIVITY_NON_REG_EXP = "org.eclipse.activityNonRegExp";
-    	
-    	// Check Activity -> Binding connection.
-    	IActivityManager manager = getActivityManager();    	
-    	IActivity activity = manager.getActivity(ACTIVITY_NON_REG_EXP);
-    	Set bindings = activity.getActivityPatternBindings();
-    	assertTrue(bindings.size() == 1);
-    	IActivityPatternBinding binding = 
-    		(IActivityPatternBinding)bindings.iterator().next();
-    	assertTrue(binding.isEqualityPattern());
-    	
-    	// Check Binding -> Activity connection.
-    	final String IDENTIFIER = "org.eclipse.ui.tests.activity{No{Reg(Exp[^d]";
-    	IIdentifier identifier = manager.getIdentifier(IDENTIFIER);
-    	Set boundActivities = identifier.getActivityIds();
-    	assertTrue(boundActivities.size() == 1);
-    	String id = boundActivities.iterator().next().toString();
-    	assertTrue(id.equals(ACTIVITY_NON_REG_EXP));
-    	
-    	// Check conversion from normal string to regular expression string
-    	// for <code>Pattern()</code> constructing.
-    	Pattern pattern = binding.getPattern();    	
-    	assertTrue(pattern.pattern().equals(
-				Pattern.compile("\\Q" + IDENTIFIER + "\\E").pattern()));
-    }    
-    
-    /**
-	 * Tests to ensure that setting enabled of an activity disabled by
-	 * expression and setting disabled of an activity enabled by expression both
-	 * behave as expected. Ie: it's a no-op.
-	 */
-    public void testSetEnabledExpressionActivity() {
-    	try {
-    		TestSourceProvider testSourceProvider = new TestSourceProvider();
-    		IEvaluationService evalService = (IEvaluationService) PlatformUI
-    				.getWorkbench().getService(IEvaluationService.class);
-    		evalService.addSourceProvider(testSourceProvider);
-    		testSourceProvider.fireSourceChanged();
-    		
-    		
-    		IWorkbenchActivitySupport support = PlatformUI.getWorkbench()
-    			.getActivitySupport();		
-    		support.setEnabledActivityIds(new HashSet());
-    		Set set = new HashSet(support.getActivityManager().getEnabledActivityIds());
-    		Set previousSet = new HashSet(support.getActivityManager().getEnabledActivityIds());
-    		set.add(EXPRESSION_ACTIVITY_ID_2);
-    		support.setEnabledActivityIds(set);
-    		assertEquals(previousSet, support.getActivityManager().getEnabledActivityIds());
-    		
-    		testSourceProvider.setVariable();
-    		testSourceProvider.fireSourceChanged();
-    		
-    		set = new HashSet(support.getActivityManager().getEnabledActivityIds());
-    		assertFalse(set.equals(previousSet));
-    		
-    		set.remove(EXPRESSION_ACTIVITY_ID_2);
-    		support.setEnabledActivityIds(set);
-    		
-    		assertFalse(support.getActivityManager().getEnabledActivityIds().equals(previousSet));
-
-    		evalService.removeSourceProvider(testSourceProvider);
-    	}
-    	finally {
-    		
-    	}
-    }
-    
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		rememberedSet = getActivityManager().getEnabledActivityIds();
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		PlatformUI.getWorkbench().getActivitySupport().setEnabledActivityIds(
-				rememberedSet);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/AdaptableDecoratorTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/AdaptableDecoratorTestCase.java
deleted file mode 100644
index 58000c0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/AdaptableDecoratorTestCase.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.adaptable;
-
-import java.io.ByteArrayInputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-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.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.decorators.DecoratorDefinition;
-import org.eclipse.ui.internal.decorators.DecoratorManager;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @version 1.0
- */
-public class AdaptableDecoratorTestCase extends UITestCase implements
-		ILabelProviderListener {
-
-	private DecoratorDefinition fullDefinition;
-
-	private DecoratorDefinition lightDefinition;
-
-	private boolean updated = false;
-
-	public String ADAPTED_NAVIGATOR_ID = "org.eclipse.ui.tests.adaptable.adaptedHierarchy";
-
-	protected IProject testProject;
-
-	protected IFolder testFolder;
-
-	protected IFile testFile;
-
-	/**
-	 * Constructor for DecoratorTestCase.
-	 * 
-	 * @param testName
-	 */
-	public AdaptableDecoratorTestCase(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Sets up the hierarchy.
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		createTestFile();
-		showAdaptedNav();
-
-		WorkbenchPlugin.getDefault().getDecoratorManager().addListener(this);
-
-		DecoratorDefinition[] definitions = WorkbenchPlugin.getDefault()
-				.getDecoratorManager().getAllDecoratorDefinitions();
-		for (int i = 0; i < definitions.length; i++) {
-			if (definitions[i].getId().equals(
-					"org.eclipse.ui.tests.adaptable.decorator"))
-				fullDefinition = definitions[i];
-			if (definitions[i].getId().equals(
-					"org.eclipse.ui.tests.decorators.lightweightdecorator"))
-				lightDefinition = definitions[i];
-		}
-	}
-
-	private DecoratorManager getDecoratorManager() {
-		return WorkbenchPlugin.getDefault().getDecoratorManager();
-	}
-
-	/**
-	 * Remove the listener.
-	 */
-	protected void doTearDown() throws Exception {
-
-		if (testProject != null) {
-			try {
-				testProject.delete(true, null);
-			} catch (CoreException e) {
-				fail(e.toString());
-			}
-			testProject = null;
-			testFolder = null;
-			testFile = null;
-		}
-		super.doTearDown();
-
-		getDecoratorManager().removeListener(this);
-	}
-
-	/**
-	 * Test enabling the contributor
-	 */
-	public void testEnableDecorator() throws CoreException {
-		getDecoratorManager().updateForEnablementChange();
-		fullDefinition.setEnabled(true);
-		lightDefinition.setEnabled(true);
-		getDecoratorManager().updateForEnablementChange();
-
-	}
-
-	/**
-	 * Test disabling the contributor
-	 */
-	public void testDisableDecorator() {
-		getDecoratorManager().updateForEnablementChange();
-		fullDefinition.setEnabled(false);
-		lightDefinition.setEnabled(false);
-		getDecoratorManager().updateForEnablementChange();
-	}
-
-	/**
-	 * Refresh the full decorator.
-	 */
-	public void testRefreshFullContributor() {
-
-		updated = false;
-		getDecoratorManager().updateForEnablementChange();
-		fullDefinition.setEnabled(true);
-		lightDefinition.setEnabled(false);
-		getDecoratorManager().updateForEnablementChange();
-		assertTrue("Got an update", updated);
-		updated = false;
-
-	}
-
-	/**
-	 * Refresh the full decorator.
-	 */
-	public void testRefreshLightContributor() throws CoreException {
-
-		updated = false;
-		getDecoratorManager().updateForEnablementChange();
-		lightDefinition.setEnabled(true);
-		fullDefinition.setEnabled(false);
-		getDecoratorManager().updateForEnablementChange();
-		assertTrue("Got an update", updated);
-		updated = false;
-
-	}
-
-	/*
-	 * @see ILabelProviderListener#labelProviderChanged(LabelProviderChangedEvent)
-	 */
-	public void labelProviderChanged(LabelProviderChangedEvent event) {
-		updated = true;
-	}
-
-	/**
-	 * Shows the Adapted Resource Navigator in a new test window.
-	 */
-	protected void showAdaptedNav() throws PartInitException {
-		IWorkbenchWindow window = openTestWindow();
-		window.getActivePage().showView(ADAPTED_NAVIGATOR_ID);
-	}
-
-	protected void createTestProject() throws CoreException {
-		if (testProject == null) {
-			IWorkspace workspace = ResourcesPlugin.getWorkspace();
-			testProject = workspace.getRoot().getProject("AdaptedTestProject");
-			testProject.create(null);
-			testProject.open(null);
-		}
-	}
-
-	protected void createTestFolder() throws CoreException {
-		if (testFolder == null) {
-			createTestProject();
-			testFolder = testProject.getFolder("AdaptedTestFolder");
-			testFolder.create(false, false, null);
-		}
-	}
-
-	protected void createTestFile() throws CoreException {
-		if (testFile == null) {
-			createTestFolder();
-			testFile = testFolder.getFile("AdaptedFoo.txt");
-			testFile.create(
-					new ByteArrayInputStream("Some content.".getBytes()),
-					false, null);
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/AdaptableResourceWrapper.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/AdaptableResourceWrapper.java
deleted file mode 100644
index e240c9c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/AdaptableResourceWrapper.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.adaptable;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-public class AdaptableResourceWrapper implements IAdaptable {
-
-    IResource resource;
-
-    /*
-     * @see IAdaptable#getAdapter(Class)
-     */
-    public Object getAdapter(Class adapter) {
-        if (adapter == IResource.class)
-            return resource;
-        if (adapter == IWorkbenchAdapter.class)
-            return TestAdaptableWorkbenchAdapter.getInstance();
-        return null;
-    }
-
-    public AdaptableResourceWrapper(IResource wrapped) {
-        resource = wrapped;
-    }
-
-    public String getLabel() {
-        return resource.getName() + " Adapted";
-    }
-
-    public AdaptableResourceWrapper getParent() {
-        if (resource.getParent() != null)
-            return new AdaptableResourceWrapper(resource.getParent());
-        return null;
-    }
-
-    public AdaptableResourceWrapper[] getChildren() {
-        AdaptableResourceWrapper[] wrappers = new AdaptableResourceWrapper[0];
-
-        if (resource instanceof IContainer) {
-            IResource[] children;
-            try {
-                children = ((IContainer) resource).members();
-            } catch (CoreException exception) {
-                return wrappers;
-            }
-            wrappers = new AdaptableResourceWrapper[children.length];
-            for (int i = 0; i < children.length; i++) {
-                wrappers[i] = new AdaptableResourceWrapper(children[i]);
-            }
-        }
-        return wrappers;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/AdaptableTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/AdaptableTestSuite.java
deleted file mode 100644
index 8f12312..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/AdaptableTestSuite.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.adaptable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * The AdaptableTestSuite is the TestSuite for the
- * adaptable support in the UI.
- */
-public class AdaptableTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite.  This is required to
-     * use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new AdaptableTestSuite();
-    }
-
-    /**
-     * Constructor for AdaptableTestSuite.
-     */
-    public AdaptableTestSuite() {
-        addTest(new TestSuite(AdaptableDecoratorTestCase.class));
-        addTest(new TestSuite(MarkerImageProviderTest.class));
-        addTest(new TestSuite(WorkingSetTestCase.class));
-        addTest(new TestSuite(SelectionAdapterTest.class));
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/AdaptedResourceNavigator.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/AdaptedResourceNavigator.java
deleted file mode 100644
index 9850f66..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/AdaptedResourceNavigator.java
+++ /dev/null
@@ -1,534 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.adaptable;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.DecoratingLabelProvider;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IDecoratorManager;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-import org.eclipse.ui.part.DrillDownAdapter;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.views.navigator.ResourceSorter;
-
-/**
- * Implements the Resource Navigator view.
- */
-public class AdaptedResourceNavigator extends ViewPart {
-    private TreeViewer viewer;
-
-    private IDialogSettings settings;
-
-    private IMemento memento;
-
-    protected TestNavigatorActionGroup actionGroup;
-
-    /**
-     * Preference name constant for linking editor switching to navigator selection.
-     * 
-     * [Issue: We're cheating here, by referencing a preference which is actually defined
-     * on the Workbench's preference page.  The Navigator should eventually have its own
-     * preference page with this preference on it, instead of on the Workbench's.
-     * The value must be the same as IWorkbenchPreferenceConstants.LINK_NAVIGATOR_TO_EDITOR.]
-     */
-    private static final String LINK_NAVIGATOR_TO_EDITOR = "LINK_NAVIGATOR_TO_EDITOR"; //$NON-NLS-1$
-
-    private IPartListener partListener = new IPartListener() {
-        public void partActivated(IWorkbenchPart part) {
-            if (part instanceof IEditorPart)
-                editorActivated((IEditorPart) part);
-        }
-
-        public void partBroughtToTop(IWorkbenchPart part) {
-        }
-
-        public void partClosed(IWorkbenchPart part) {
-        }
-
-        public void partDeactivated(IWorkbenchPart part) {
-        }
-
-        public void partOpened(IWorkbenchPart part) {
-        }
-    };
-
-    /**
-     * Creates a new AdaptedResourceNavigator.
-     */
-    public AdaptedResourceNavigator() {
-        IDialogSettings workbenchSettings = getPlugin().getDialogSettings();
-        settings = workbenchSettings.getSection("ResourceNavigator"); //$NON-NLS-1$
-        if (settings == null)
-            settings = workbenchSettings.addNewSection("ResourceNavigator"); //$NON-NLS-1$
-    }
-
-    /**
-     * Converts the given selection into a form usable by the viewer,
-     * where the elements are resources.
-     */
-    StructuredSelection convertSelection(ISelection selection) {
-        ArrayList list = new ArrayList();
-        if (selection instanceof IStructuredSelection) {
-            IStructuredSelection ssel = (IStructuredSelection) selection;
-            for (Iterator i = ssel.iterator(); i.hasNext();) {
-                Object o = i.next();
-                IResource resource = null;
-                if (o instanceof IResource) {
-                    resource = (IResource) o;
-                } else {
-                    if (o instanceof IAdaptable) {
-                        resource = (IResource) ((IAdaptable) o)
-                                .getAdapter(IResource.class);
-                    }
-                }
-                if (resource != null) {
-                    list.add(resource);
-                }
-            }
-        }
-        return new StructuredSelection(list);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchPart.
-     */
-    public void createPartControl(Composite parent) {
-        viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-        //	initDrillDownAdapter(viewer);
-        viewer.setUseHashlookup(true);
-        viewer.setContentProvider(new TestAdaptableContentProvider());
-        IDecoratorManager manager = getSite().getWorkbenchWindow()
-                .getWorkbench().getDecoratorManager();
-        viewer.setLabelProvider(new DecoratingLabelProvider(
-                new TestAdaptableWorkbenchAdapter(), manager
-                        .getLabelDecorator()));
-
-        viewer.setInput(getInitialInput());
-        updateTitle();
-
-        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
-        menuMgr.setRemoveAllWhenShown(true);
-        menuMgr.addMenuListener(new IMenuListener() {
-            public void menuAboutToShow(IMenuManager manager) {
-                AdaptedResourceNavigator.this.fillContextMenu(manager);
-            }
-        });
-        Menu menu = menuMgr.createContextMenu(viewer.getTree());
-        viewer.getTree().setMenu(menu);
-        getSite().registerContextMenu(menuMgr, viewer);
-
-        makeActions();
-
-        // Update the global action enable state to match
-        // the current selection.
-        IStructuredSelection selection = (IStructuredSelection) viewer
-                .getSelection();
-        actionGroup.updateGlobalActions(selection);
-
-        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-            public void selectionChanged(SelectionChangedEvent event) {
-                handleSelectionChanged(event);
-            }
-        });
-        viewer.addDoubleClickListener(new IDoubleClickListener() {
-            public void doubleClick(DoubleClickEvent event) {
-                handleDoubleClick(event);
-            }
-        });
-        viewer.getControl().addKeyListener(new KeyListener() {
-            public void keyPressed(KeyEvent event) {
-                handleKeyPressed(event);
-            }
-
-            public void keyReleased(KeyEvent event) {
-                handleKeyReleased(event);
-            }
-        });
-
-        actionGroup.fillActionBars(selection);
-
-        getSite().setSelectionProvider(viewer);
-
-        getSite().getPage().addPartListener(partListener);
-
-        if (memento != null)
-            restoreState(memento);
-        memento = null;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IWorkbenchPart.
-     */
-    public void dispose() {
-        getSite().getPage().removePartListener(partListener);
-        super.dispose();
-    }
-
-    /**
-     * An editor has been activated.  Set the selection in this navigator
-     * to be the editor's input, if linking is enabled.
-     */
-    void editorActivated(IEditorPart editor) {
-        if (!isLinkingEnabled())
-            return;
-
-        IEditorInput input = editor.getEditorInput();
-        if (input instanceof IFileEditorInput) {
-            IFileEditorInput fileInput = (IFileEditorInput) input;
-            IFile file = fileInput.getFile();
-            ISelection newSelection = new StructuredSelection(file);
-            if (!viewer.getSelection().equals(newSelection)) {
-                viewer.setSelection(newSelection);
-            }
-        }
-
-    }
-
-    /**
-     * Called when the context menu is about to open.
-     */
-    void fillContextMenu(IMenuManager menu) {
-        actionGroup.setContext(new ActionContext(getViewer().getSelection()));
-        actionGroup.fillContextMenu(menu);
-    }
-
-    /** 
-     * Returns the initial input for the viewer.
-     * Tries to convert the input to a resource, either directly or via IAdaptable.
-     * If the resource is a container, it uses that.
-     * If the resource is a file, it uses its parent folder.
-     * If a resource could not be obtained, it uses the workspace root.
-     */
-    IContainer getInitialInput() {
-        IAdaptable input = getSite().getPage().getInput();
-        IResource resource = null;
-        if (input instanceof IResource) {
-            resource = (IResource) input;
-        } else {
-            resource = (IResource) input.getAdapter(IResource.class);
-        }
-        if (resource != null) {
-            switch (resource.getType()) {
-            case IResource.FILE:
-                return resource.getParent();
-            case IResource.FOLDER:
-            case IResource.PROJECT:
-            case IResource.ROOT:
-                return (IContainer) resource;
-            default:
-                // Unknown resource type.  Fall through.
-                break;
-            }
-        }
-        return ResourcesPlugin.getWorkspace().getRoot();
-    }
-
-    /**
-     * Returns the navigator's plugin.
-     */
-    public AbstractUIPlugin getPlugin() {
-        return (AbstractUIPlugin) Platform.getPlugin(PlatformUI.PLUGIN_ID);
-    }
-
-    /**
-     * Returns the current sorter.
-     * @since 2.0
-     */
-    public ResourceSorter getSorter() {
-        return (ResourceSorter) getViewer().getSorter();
-    }
-
-    /**
-     * Returns the tree viewer which shows the resource hierarchy.
-     * @since 2.0
-     */
-    public TreeViewer getViewer() {
-        return viewer;
-    }
-
-    /**
-     * Returns the shell to use for opening dialogs.
-     * Used in this class, and in the actions.
-     */
-    public Shell getShell() {
-        return getViewSite().getShell();
-    }
-
-    /**
-     * Returns the message to show in the status line.
-     *
-     * @param selection the current selection
-     * @return the status line message
-     */
-    String getStatusLineMessage(IStructuredSelection selection) {
-        if (selection.size() == 1) {
-            Object o = selection.getFirstElement();
-            if (o instanceof IResource) {
-                return ((IResource) o).getFullPath().makeRelative().toString();
-            } else {
-                return ResourceNavigatorMessages.ResourceNavigator_oneItemSelected;
-            }
-        }
-        if (selection.size() > 1) {
-            return NLS.bind(ResourceNavigatorMessages.ResourceNavigator_statusLine, new Integer(selection.size()));
-        }
-        return ""; //$NON-NLS-1$
-    }
-
-    /**
-     * Returns the tool tip text for the given element.
-     */
-    String getToolTipText(Object element) {
-        if (element instanceof IResource) {
-            IPath path = ((IResource) element).getFullPath();
-            if (path.isRoot()) {
-                return ResourceNavigatorMessages.ResourceManager_toolTip;
-            } else {
-                return path.makeRelative().toString();
-            }
-        } else {
-            return ((ILabelProvider) getViewer().getLabelProvider())
-                    .getText(element);
-        }
-    }
-
-    /**
-     * Handles double clicks in viewer.
-     * Opens editor if file double-clicked.
-     * @since 2.0
-     */
-    protected void handleDoubleClick(DoubleClickEvent event) {
-        IStructuredSelection selection = (IStructuredSelection) event
-                .getSelection();
-        Object element = selection.getFirstElement();
-
-        // 1GBZIA0: ITPUI:WIN2000 - Double-clicking in navigator should expand/collapse containers
-        if (viewer.isExpandable(element)) {
-            viewer.setExpandedState(element, !viewer.getExpandedState(element));
-        }
-
-    }
-
-    /**
-     * Handles selection changed in viewer.
-     * Updates global actions.
-     * Links to editor (if option enabled)
-     * @since 2.0
-     */
-    protected void handleSelectionChanged(SelectionChangedEvent event) {
-        IStructuredSelection sel = (IStructuredSelection) event.getSelection();
-        updateStatusLine(sel);
-        actionGroup.updateGlobalActions(sel);
-        actionGroup.selectionChanged(sel);
-        linkToEditor(sel);
-    }
-
-    /**
-     * Handles a key press in viewer. By default do nothing.
-     */
-    protected void handleKeyPressed(KeyEvent event) {
-
-    }
-
-    /**
-     * Handles a key release in viewer.
-     */
-    protected void handleKeyReleased(KeyEvent event) {
-
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IViewPart.
-     */
-    public void init(IViewSite site, IMemento memento) throws PartInitException {
-        super.init(site, memento);
-        this.memento = memento;
-    }
-
-    /**
-     * Initializes a drill down adapter on the viewer.
-     */
-    void initDrillDownAdapter(TreeViewer viewer) {
-        DrillDownAdapter drillDownAdapter = new DrillDownAdapter(viewer) {
-            // need to update title whenever input changes;
-            // updateNavigationButtons is called whenever any of the drill down buttons are used
-            protected void updateNavigationButtons() {
-                super.updateNavigationButtons();
-                updateTitle();
-            }
-        };
-        drillDownAdapter.addNavigationActions(getViewSite().getActionBars()
-                .getToolBarManager());
-    }
-
-    /**
-     * Returns whether the preference to link navigator selection to active editor is enabled.
-     * @since 2.0
-     */
-    protected boolean isLinkingEnabled() {
-        IPreferenceStore store = getPlugin().getPreferenceStore();
-        return store.getBoolean(LINK_NAVIGATOR_TO_EDITOR);
-    }
-
-    /**
-     * Links to editor (if option enabled)
-     * @since 2.0
-     */
-    protected void linkToEditor(IStructuredSelection selection) {
-        if (!isLinkingEnabled())
-            return;
-
-        Object obj = selection.getFirstElement();
-        if (obj instanceof IFile && selection.size() == 1) {
-            IFile file = (IFile) obj;
-            IWorkbenchPage page = getSite().getPage();
-            IEditorReference editorArray[] = page.getEditorReferences();
-            for (int i = 0; i < editorArray.length; ++i) {
-                IEditorPart editor = editorArray[i].getEditor(true);
-                IEditorInput input = editor.getEditorInput();
-                if (input instanceof IFileEditorInput
-                        && file.equals(((IFileEditorInput) input).getFile())) {
-                    page.bringToTop(editor);
-                    return;
-                }
-            }
-        }
-    }
-
-    /**
-     *	Create self's action objects
-     */
-    protected void makeActions() {
-        actionGroup = new TestNavigatorActionGroup(this);
-    }
-
-    /**
-     * Restore the state of the receiver to the state described in
-     * momento.
-     * @since 2.0
-     */
-
-    protected void restoreState(IMemento memento) {
-    }
-
-    public void saveState(IMemento memento) {
-    }
-
-    /**
-     *	Reveal and select the passed element selection in self's visual component
-     */
-    public void selectReveal(ISelection selection) {
-        StructuredSelection ssel = convertSelection(selection);
-        if (!ssel.isEmpty()) {
-            getViewer().setSelection(ssel, true);
-        }
-    }
-
-    /**
-     * @see IWorkbenchPart#setFocus()
-     */
-    public void setFocus() {
-        getViewer().getTree().setFocus();
-    }
-
-    /**
-     * Note: For experimental use only.
-     * Sets the decorator for the navigator.
-     *
-     * @param decorator a label decorator or <code>null</code> for no decorations.
-     */
-    public void setLabelDecorator(ILabelDecorator decorator) {
-        DecoratingLabelProvider provider = (DecoratingLabelProvider) getViewer()
-                .getLabelProvider();
-        if (decorator == null) {
-            IDecoratorManager manager = getSite().getWorkbenchWindow()
-                    .getWorkbench().getDecoratorManager();
-            provider.setLabelDecorator(manager.getLabelDecorator());
-        } else {
-            provider.setLabelDecorator(decorator);
-        }
-    }
-
-    /**
-     * Updates the message shown in the status line.
-     *
-     * @param selection the current selection
-     */
-    void updateStatusLine(IStructuredSelection selection) {
-        String msg = getStatusLineMessage(selection);
-        getViewSite().getActionBars().getStatusLineManager().setMessage(msg);
-    }
-
-    /**
-     * Updates the title text and title tool tip.
-     * Called whenever the input of the viewer changes.
-     */
-    void updateTitle() {
-        Object input = getViewer().getInput();
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        if (input == null || input.equals(workspace)
-                || input.equals(workspace.getRoot())) {
-            setContentDescription(""); //$NON-NLS-1$
-            setTitleToolTip(""); //$NON-NLS-1$
-        } else {
-            ILabelProvider labelProvider = (ILabelProvider) getViewer()
-                    .getLabelProvider();
-            setContentDescription(labelProvider.getText(input));
-            //$NON-NLS-1$
-            setTitleToolTip(getToolTipText(input));
-        }
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/MarkerImageProviderTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/MarkerImageProviderTest.java
deleted file mode 100644
index c2e085a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/MarkerImageProviderTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.adaptable;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests the markerImageProviders extension point.
- */
-public class MarkerImageProviderTest extends UITestCase {
-
-    public MarkerImageProviderTest(String testName) {
-        super(testName);
-    }
-
-    /**
-     * Tests the static form of the extension, where just a file path is given.
-     */
-    public void testStatic() {
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        IMarker marker = null;
-        try {
-            marker = workspace.getRoot().createMarker(
-                    "org.eclipse.ui.tests.testmarker"); //$NON-NLS-1$
-        } catch (CoreException e) {
-            fail(e.getMessage());
-        }
-        IWorkbenchAdapter adapter = (IWorkbenchAdapter) marker
-                .getAdapter(IWorkbenchAdapter.class);
-        ImageDescriptor imageDesc = adapter.getImageDescriptor(marker);
-        assertNotNull(imageDesc);
-        assertTrue(imageDesc.toString().indexOf("anything") != -1); //$NON-NLS-1$
-    }
-
-    /**
-     * Tests the dynamic form of the extension, where an IMarkerImageProvider class is given.
-     */
-    public void testDynamic() {
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        IMarker marker = null;
-        try {
-            marker = workspace.getRoot().createMarker(
-                    "org.eclipse.ui.tests.testmarker2"); //$NON-NLS-1$
-        } catch (CoreException e) {
-            fail(e.getMessage());
-        }
-        IWorkbenchAdapter adapter = (IWorkbenchAdapter) marker
-                .getAdapter(IWorkbenchAdapter.class);
-        ImageDescriptor imageDesc = adapter.getImageDescriptor(marker);
-        assertNotNull(imageDesc);
-        assertTrue(imageDesc.toString().indexOf("anything") != -1); //$NON-NLS-1$
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/NullLabelDecorator.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/NullLabelDecorator.java
deleted file mode 100644
index e913764..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/NullLabelDecorator.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.adaptable;
-
-/*
- * This decorator tests the null cases
- */
-
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @version 	1.0
- * @author
- */
-public class NullLabelDecorator 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 null;
-    }
-
-    /*
-     * @see IBaseLabelProvider#addListener(ILabelProviderListener)
-     */
-    public void addListener(ILabelProviderListener listener) {
-    }
-
-    /*
-     * @see IBaseLabelProvider#dispose()
-     */
-    public void dispose() {
-    }
-
-    /*
-     * @see IBaseLabelProvider#isLabelProperty(Object, String)
-     */
-    public boolean isLabelProperty(Object element, String property) {
-        return false;
-    }
-
-    /*
-     * @see IBaseLabelProvider#removeListener(ILabelProviderListener)
-     */
-    public void removeListener(ILabelProviderListener listener) {
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/ResourceAction.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/ResourceAction.java
deleted file mode 100644
index 81c3e0b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/ResourceAction.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.adaptable;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.tests.decorators.TestDecoratorContributor;
-
-public class ResourceAction implements IObjectActionDelegate {
-
-    Object selectedItem;
-
-    /*
-     * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
-     */
-    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-    }
-
-    /*
-     * @see IActionDelegate#run(IAction)
-     */
-    public void run(IAction action) {
-
-        if (selectedItem != null)
-            TestDecoratorContributor.contributor.refreshListeners(selectedItem);
-
-    }
-
-    /*
-     * @see IActionDelegate#selectionChanged(IAction, ISelection)
-     */
-    public void selectionChanged(IAction action, ISelection selection) {
-        if (selection instanceof IStructuredSelection) {
-            IStructuredSelection structured = (IStructuredSelection) selection;
-            if (structured.isEmpty())
-                selectedItem = null;
-            else
-                selectedItem = structured.getFirstElement();
-        }
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/SelectionAdapterTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/SelectionAdapterTest.java
deleted file mode 100644
index ccbce01..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/SelectionAdapterTest.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.adaptable;
-
-import java.util.Iterator;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.expressions.ICountable;
-import org.eclipse.core.expressions.IIterable;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-/**
- * @since 3.3
- * 
- */
-public class SelectionAdapterTest extends TestCase {
-
-	public void testBasicSelectionEmpty() {
-		ISelection empty = new ISelection() {
-
-			public boolean isEmpty() {
-				return true;
-			}
-		};
-		ICountable countable = (ICountable) Platform.getAdapterManager()
-				.getAdapter(empty, ICountable.class);
-		assertEquals(0, countable.count());
-
-		IIterable iterate = (IIterable) Platform.getAdapterManager()
-				.getAdapter(empty, IIterable.class);
-		assertFalse(iterate.iterator().hasNext());
-	}
-
-	public void testBasicSelection() {
-		ISelection selection = new ISelection() {
-
-			public boolean isEmpty() {
-				return false;
-			}
-		};
-		ICountable countable = (ICountable) Platform.getAdapterManager()
-				.getAdapter(selection, ICountable.class);
-		assertEquals(1, countable.count());
-
-		IIterable iterate = (IIterable) Platform.getAdapterManager()
-				.getAdapter(selection, IIterable.class);
-		Iterator iterator = iterate.iterator();
-		assertTrue(iterator.hasNext());
-		Object o = iterator.next();
-		assertTrue(o == selection);
-	}
-
-	public void testStructuredSelectionEmpty() {
-		StructuredSelection selection = new StructuredSelection();
-		ICountable countable = (ICountable) Platform.getAdapterManager()
-				.getAdapter(selection, ICountable.class);
-		assertEquals(0, countable.count());
-
-		IIterable iterate = (IIterable) Platform.getAdapterManager()
-				.getAdapter(selection, IIterable.class);
-		assertFalse(iterate.iterator().hasNext());
-	}
-
-	public void testStructuredSelectionOne() {
-		String obj = "me";
-		StructuredSelection selection = new StructuredSelection(obj);
-		ICountable countable = (ICountable) Platform.getAdapterManager()
-				.getAdapter(selection, ICountable.class);
-		assertEquals(1, countable.count());
-
-		IIterable iterate = (IIterable) Platform.getAdapterManager()
-				.getAdapter(selection, IIterable.class);
-		Iterator iterator = iterate.iterator();
-		assertTrue(iterator.hasNext());
-		Object o = iterator.next();
-		assertTrue(o == obj);
-		assertFalse(iterator.hasNext());
-	}
-
-	public void testStructuredSelection() {
-		String obj = "me";
-		String obj2 = "you";
-		StructuredSelection selection = new StructuredSelection(new Object[] {
-				obj, obj2 });
-		ICountable countable = (ICountable) Platform.getAdapterManager()
-				.getAdapter(selection, ICountable.class);
-		assertEquals(2, countable.count());
-
-		IIterable iterate = (IIterable) Platform.getAdapterManager()
-				.getAdapter(selection, IIterable.class);
-		Iterator iterator = iterate.iterator();
-		assertTrue(iterator.hasNext());
-		Object o = iterator.next();
-		assertTrue(o == obj);
-		o = iterator.next();
-		assertTrue(o == obj2);
-		assertFalse(iterator.hasNext());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/TestAdaptableContentProvider.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/TestAdaptableContentProvider.java
deleted file mode 100644
index fcffc7a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/TestAdaptableContentProvider.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.adaptable;
-
-import org.eclipse.core.resources.IContainer;
-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.IWorkspace;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-/**
- * Provides tree contents for objects that have the IWorkbenchAdapter
- * adapter registered. 
- */
-public class TestAdaptableContentProvider implements ITreeContentProvider,
-        IResourceChangeListener {
-    protected Viewer viewer;
-
-    /* (non-Javadoc)
-     * Method declared on IContentProvider.
-     */
-    public void dispose() {
-        if (viewer != null) {
-            Object obj = viewer.getInput();
-            if (obj instanceof IWorkspace) {
-                IWorkspace workspace = (IWorkspace) obj;
-                workspace.removeResourceChangeListener(this);
-            } else if (obj instanceof IContainer) {
-                IWorkspace workspace = ((IContainer) obj).getWorkspace();
-                workspace.removeResourceChangeListener(this);
-            }
-        }
-    }
-
-    /**
-     * Returns the implementation of IWorkbenchAdapter for the given
-     * object.  Returns null if the adapter is not defined or the
-     * object is not adaptable.
-     */
-    protected IWorkbenchAdapter getAdapter(Object o) {
-        return TestAdaptableWorkbenchAdapter.getInstance();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ITreeContentProvider.
-     */
-    public Object[] getChildren(Object element) {
-        IWorkbenchAdapter adapter = getAdapter(element);
-        if (adapter != null) {
-            return adapter.getChildren(element);
-        }
-        return new Object[0];
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStructuredContentProvider.
-     */
-    public Object[] getElements(Object element) {
-        return getChildren(element);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ITreeContentProvider.
-     */
-    public Object getParent(Object element) {
-        IWorkbenchAdapter adapter = getAdapter(element);
-        if (adapter != null) {
-            return adapter.getParent(element);
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ITreeContentProvider.
-     */
-    public boolean hasChildren(Object element) {
-        return getChildren(element).length > 0;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IContentProvider.
-     */
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-        this.viewer = viewer;
-        IWorkspace oldWorkspace = null;
-        IWorkspace newWorkspace = null;
-        if (oldInput instanceof IWorkspace) {
-            oldWorkspace = (IWorkspace) oldInput;
-        } else if (oldInput instanceof IContainer) {
-            oldWorkspace = ((IContainer) oldInput).getWorkspace();
-        }
-        if (newInput instanceof IWorkspace) {
-            newWorkspace = (IWorkspace) newInput;
-        } else if (newInput instanceof IContainer) {
-            newWorkspace = ((IContainer) newInput).getWorkspace();
-        }
-        if (oldWorkspace != newWorkspace) {
-            if (oldWorkspace != null) {
-                oldWorkspace.removeResourceChangeListener(this);
-            }
-            if (newWorkspace != null) {
-                newWorkspace.addResourceChangeListener(this,
-                        IResourceChangeEvent.POST_CHANGE);
-            }
-        }
-    }
-
-    /**
-     * Process a resource delta.  
-     */
-    protected void processDelta(IResourceDelta delta) {
-        // This method runs inside a syncExec.  The widget may have been destroyed
-        // by the time this is run.  Check for this and do nothing if so.
-        Control ctrl = viewer.getControl();
-        if (ctrl == null || ctrl.isDisposed())
-            return;
-
-        // Get the affected resource
-        IResource resource = delta.getResource();
-
-        // If any children have changed type, just do a full refresh of this parent,
-        // since a simple update on such children won't work, 
-        // and trying to map the change to a remove and add is too dicey.
-        // The case is: folder A renamed to existing file B, answering yes to overwrite B.
-        IResourceDelta[] affectedChildren = delta
-                .getAffectedChildren(IResourceDelta.CHANGED);
-        for (int i = 0; i < affectedChildren.length; i++) {
-            if ((affectedChildren[i].getFlags() & IResourceDelta.TYPE) != 0) {
-                ((StructuredViewer) viewer).refresh(resource);
-                return;
-            }
-        }
-
-        // Check the flags for changes the Navigator cares about.
-        // See ResourceLabelProvider for the aspects it cares about.
-        // Notice we don't care about F_CONTENT or F_MARKERS currently.
-        int changeFlags = delta.getFlags();
-        if ((changeFlags & (IResourceDelta.OPEN | IResourceDelta.SYNC)) != 0) {
-            ((StructuredViewer) viewer).update(resource, null);
-        }
-
-        // Handle changed children .
-        for (int i = 0; i < affectedChildren.length; i++) {
-            processDelta(affectedChildren[i]);
-        }
-
-        // Process removals before additions, to avoid multiple equal elements in the viewer.
-
-        // Handle removed children. Issue one update for all removals.
-        affectedChildren = delta.getAffectedChildren(IResourceDelta.REMOVED);
-        if (affectedChildren.length > 0) {
-            Object[] affected = new Object[affectedChildren.length];
-            for (int i = 0; i < affectedChildren.length; i++)
-                affected[i] = affectedChildren[i].getResource();
-            if (viewer instanceof AbstractTreeViewer) {
-                ((AbstractTreeViewer) viewer).remove(affected);
-            } else {
-                ((StructuredViewer) viewer).refresh(resource);
-            }
-        }
-
-        // Handle added children. Issue one update for all insertions.
-        affectedChildren = delta.getAffectedChildren(IResourceDelta.ADDED);
-        if (affectedChildren.length > 0) {
-            Object[] affected = new Object[affectedChildren.length];
-            for (int i = 0; i < affectedChildren.length; i++)
-                affected[i] = affectedChildren[i].getResource();
-            if (viewer instanceof AbstractTreeViewer) {
-                ((AbstractTreeViewer) viewer).add(resource, affected);
-            } else {
-                ((StructuredViewer) viewer).refresh(resource);
-            }
-        }
-    }
-
-    /**
-     * The workbench has changed.  Process the delta and issue updates to the viewer,
-     * inside the UI thread.
-     *
-     * @see IResourceChangeListener#resourceChanged
-     */
-    public void resourceChanged(final IResourceChangeEvent event) {
-        final IResourceDelta delta = event.getDelta();
-        Control ctrl = viewer.getControl();
-        if (ctrl != null && !ctrl.isDisposed()) {
-            // Do a sync exec, not an async exec, since the resource delta
-            // must be traversed in this method.  It is destroyed
-            // when this method returns.
-            ctrl.getDisplay().syncExec(new Runnable() {
-                public void run() {
-                    processDelta(delta);
-                }
-            });
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/TestAdaptableWorkbenchAdapter.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/TestAdaptableWorkbenchAdapter.java
deleted file mode 100644
index 4fc40ae..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/TestAdaptableWorkbenchAdapter.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.adaptable;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-/**
- * @version 	1.0
- * @author
- */
-public class TestAdaptableWorkbenchAdapter extends LabelProvider implements
-        IWorkbenchAdapter {
-
-    private static TestAdaptableWorkbenchAdapter singleton = new TestAdaptableWorkbenchAdapter();
-
-    public static TestAdaptableWorkbenchAdapter getInstance() {
-        return singleton;
-    }
-
-    public TestAdaptableWorkbenchAdapter() {
-    }
-
-    /*
-     * @see IWorkbenchAdapter#getChildren(Object)
-     */
-    public Object[] getChildren(Object o) {
-        if (o instanceof AdaptableResourceWrapper)
-            return ((AdaptableResourceWrapper) o).getChildren();
-        if (o instanceof IResource) {
-            AdaptableResourceWrapper wrapper = new AdaptableResourceWrapper(
-                    (IResource) o);
-            return wrapper.getChildren();
-        }
-        return new Object[0];
-    }
-
-    /*
-     * @see IWorkbenchAdapter#getImageDescriptor(Object)
-     */
-    public ImageDescriptor getImageDescriptor(Object object) {
-        return null;
-    }
-
-    /*
-     * @see IWorkbenchAdapter#getLabel(Object)
-     */
-    public String getLabel(Object o) {
-        if (o instanceof AdaptableResourceWrapper)
-            return ((AdaptableResourceWrapper) o).getLabel();
-        else
-            return null;
-    }
-
-    /*
-     * @see IWorkbenchAdapter#getParent(Object)
-     */
-    public Object getParent(Object o) {
-        if (o instanceof AdaptableResourceWrapper)
-            return ((AdaptableResourceWrapper) o).getParent();
-        else
-            return null;
-    }
-
-    /**
-     * Returns an image descriptor that is based on the given descriptor,
-     * but decorated with additional information relating to the state
-     * of the provided object.
-     *
-     * Subclasses may reimplement this method to decorate an object's
-     * image.
-     * @see org.eclipse.jface.resource.CompositeImage
-     */
-    protected ImageDescriptor decorateImage(ImageDescriptor input,
-            Object element) {
-        return input;
-    }
-
-    /**
-     * Returns a label that is based on the given label,
-     * but decorated with additional information relating to the state
-     * of the provided object.
-     *
-     * Subclasses may implement this method to decorate an object's
-     * label.
-     */
-    protected String decorateText(String input, Object element) {
-        return input;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IBaseLabelProvider
-     */
-    /**
-     * Disposes of all allocated images.
-     */
-    public final void dispose() {
-    }
-
-    /**
-     * Returns the implementation of IWorkbenchAdapter for the given
-     * object.  Returns <code>null</code> if the adapter is not defined or the
-     * object is not adaptable.
-     */
-    protected final IWorkbenchAdapter getAdapter(Object o) {
-        if (!(o instanceof IAdaptable)) {
-            return null;
-        }
-        return (IWorkbenchAdapter) ((IAdaptable) o)
-                .getAdapter(IWorkbenchAdapter.class);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ILabelProvider
-     */
-    public final Image getImage(Object element) {
-        //obtain the base image by querying the element
-        IWorkbenchAdapter adapter = getAdapter(element);
-        if (adapter == null)
-            return null;
-        ImageDescriptor descriptor = adapter.getImageDescriptor(element);
-        if (descriptor == null)
-            return null;
-
-        //add any annotations to the image descriptor
-        descriptor = decorateImage(descriptor, element);
-
-        return descriptor.createImage();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on ILabelProvider
-     */
-    public final String getText(Object element) {
-        //query the element for its label
-        IWorkbenchAdapter adapter = getAdapter(element);
-        if (adapter == null)
-            return ""; //$NON-NLS-1$
-        String label = adapter.getLabel(element);
-
-        //return the decorated label
-        return decorateText(label, element);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/TestMarkerImageProvider.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/TestMarkerImageProvider.java
deleted file mode 100644
index edbba88..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/TestMarkerImageProvider.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.adaptable;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ui.internal.ide.IMarkerImageProvider;
-
-/**
- * A test marker image provider.
- */
-public class TestMarkerImageProvider implements IMarkerImageProvider {
-    public String getImagePath(IMarker marker) {
-        return "icons/anything.gif"; //$NON-NLS-1$
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/TestNavigatorActionGroup.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/TestNavigatorActionGroup.java
deleted file mode 100644
index b1a8d8d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/TestNavigatorActionGroup.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.adaptable;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.ui.actions.AddBookmarkAction;
-import org.eclipse.ui.actions.NewWizardMenu;
-import org.eclipse.ui.dialogs.PropertyDialogAction;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-
-public class TestNavigatorActionGroup extends ActionGroup {
-
-    private AdaptedResourceNavigator navigator;
-
-    private AddBookmarkAction addBookmarkAction;
-
-    private PropertyDialogAction propertyDialogAction;
-
-
-    public TestNavigatorActionGroup(AdaptedResourceNavigator navigator) {
-        this.navigator = navigator;
-    }
-
-    protected void makeActions() {
-        Shell shell = navigator.getSite().getShell();
-        addBookmarkAction = new AddBookmarkAction(navigator.getSite(), true);
-        propertyDialogAction = new PropertyDialogAction(shell, navigator
-                .getViewer());
-    }
-
-    /**
-     * @see ActionGroup#fillContextMenu(IMenuManager)
-     */
-    public void fillContextMenu(IMenuManager menu) {
-        IStructuredSelection selection = (IStructuredSelection) getContext()
-                .getSelection();
-
-        MenuManager newMenu = new MenuManager(ResourceNavigatorMessages.ResourceNavigator_new);
-        menu.add(newMenu);
-        newMenu.add(new NewWizardMenu(navigator.getSite().getWorkbenchWindow()));
-
-        //Update the selections of those who need a refresh before filling
-        addBookmarkAction.selectionChanged(selection);
-        menu.add(addBookmarkAction);
-
-        menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-        menu
-                .add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS
-                        + "-end")); //$NON-NLS-1$
-        menu.add(new Separator());
-
-        propertyDialogAction.selectionChanged(selection);
-        if (propertyDialogAction.isApplicableForSelection())
-            menu.add(propertyDialogAction);
-    }
-
-    /*
-     * @see ActionFactory#fillActionBarMenu(IMenuManager, IStructuredSelection)
-     */
-    public void fillActionBarMenu(IMenuManager menu,
-            IStructuredSelection selection) {
-    }
-
-    /**
-     * Updates the global actions with the given selection.
-     * Be sure to invoke after actions objects have updated, since can* methods delegate to action objects.
-     */
-    public void updateGlobalActions(IStructuredSelection selection) {
-
-    }
-
-    /**
-     * Contributes actions to the local tool bar and local pulldown menu.
-     * @since 2.0
-     */
-    public void fillActionBars(IStructuredSelection selection) {
-    }
-
-    /**
-     * Update the selection for new selection.
-     */
-    public void selectionChanged(IStructuredSelection selection) {
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/WorkingSetTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/WorkingSetTestCase.java
deleted file mode 100644
index be9225b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/adaptable/WorkingSetTestCase.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.adaptable;
-
-import org.eclipse.core.internal.propertytester.ResourceMappingPropertyTester;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.resources.mapping.ResourceTraversal;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.ui.IResourceActionFilter;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test that Working Sets adapt to resource mappings
- */
-public class WorkingSetTestCase extends UITestCase {
-
-    public WorkingSetTestCase(String testName) {
-        super(testName);
-    }
-    
-    private ResourceMapping getResourceMapping(IWorkingSet set) {
-        return (ResourceMapping)((IAdaptable)set).getAdapter(ResourceMapping.class);
-    }
-    
-    private IWorkbenchAdapter getWorkbenchAdapter(IWorkingSet set) {
-        return (IWorkbenchAdapter)((IAdaptable)set).getAdapter(IWorkbenchAdapter.class);
-    }
-    
-    private void assertMatches(ResourceMapping mapping, IResource[] resources) throws CoreException {
-    	assertTrue(mapping != null);
-        ResourceTraversal[] traversals = mapping.getTraversals(null, null);
-        assertTrue(traversals.length == resources.length);
-        for (int i = 0; i < traversals.length; i++) {
-            ResourceTraversal traversal = traversals[i];
-            boolean found = false;
-            for (int j = 0; j < resources.length; j++) {
-                IAdaptable element = resources[j];
-                if (element.equals(traversal.getResources()[0])) {
-                    found = true;
-                }
-            }
-            assertTrue(found);
-        }
-        
-    }
-    
-    private IProject createProject(String name) throws CoreException {
-        IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(getName() + name);
-        project.create(null);
-        project.open(IResource.NONE, null);
-        return project;
-    }
-    
-    public void testWorkSetAdaptation() throws CoreException {
-        
-        // First, test that the set adapts to a ResourceMapping
-        IWorkingSetManager man = getWorkbench().getWorkingSetManager();
-        IResource[] resources = new IResource[3];
-        resources[0] = createProject("Project0");
-        resources[1] = createProject("Project1");
-        resources[2] = createProject("Project2");
-        IWorkingSet set = man.createWorkingSet("test", resources);
-        ResourceMapping mapping = getResourceMapping(set);
-        assertMatches(mapping, resources);
-        
-        // Next, test that the set adapts to an IWorkbenchAdapter
-        IWorkbenchAdapter adapter = getWorkbenchAdapter(set);
-        String name = adapter.getLabel(set);
-        assertEquals("test", name);
-        
-        // Test the persistent property filter
-        QualifiedName key = new QualifiedName("org.eclipse.ui.test", "set");
-        ResourceMappingPropertyTester tester = new ResourceMappingPropertyTester();
-        
-        // Test with no persistent properties set
-        assertFalse(tester.test(getResourceMapping(set), IResourceActionFilter.PROJECT_PERSISTENT_PROPERTY, new Object[] { "org.eclipse.ui.test.set", "one"}, null));
-
-        // Test with one set on a subset of projects
-        resources[0].setPersistentProperty(key, "one");
-        assertTrue(tester.test(getResourceMapping(set), IResourceActionFilter.PROJECT_PERSISTENT_PROPERTY, new Object[] { "org.eclipse.ui.test.set", "one"}, null));
-        assertFalse(tester.test(getResourceMapping(set), IResourceActionFilter.PROJECT_PERSISTENT_PROPERTY, new Object[] { "org.eclipse.ui.test.set", "wrong"}, null));
-        
-        // Test again with the property set to two different values
-        resources[1].setPersistentProperty(key, "two");
-        assertFalse(tester.test(getResourceMapping(set), IResourceActionFilter.PROJECT_PERSISTENT_PROPERTY, new Object[] { "org.eclipse.ui.test.set", "one"}, null));
-        assertFalse(tester.test(getResourceMapping(set), IResourceActionFilter.PROJECT_PERSISTENT_PROPERTY, new Object[] { "org.eclipse.ui.test.set", "two"}, null));
-
-        // Test with them all set
-        resources[1].setPersistentProperty(key, "one");
-        resources[2].setPersistentProperty(key, "one");
-        assertTrue(tester.test(getResourceMapping(set), IResourceActionFilter.PROJECT_PERSISTENT_PROPERTY, new Object[] { "org.eclipse.ui.test.set", "one"}, null));
-        assertFalse(tester.test(getResourceMapping(set), IResourceActionFilter.PROJECT_PERSISTENT_PROPERTY, new Object[] { "org.eclipse.ui.test.set", "two"}, null));
-
-        // Test with a closed project in the set
-        ((IProject)resources[0]).close(null);
-        assertTrue(tester.test(getResourceMapping(set), IResourceActionFilter.PROJECT_PERSISTENT_PROPERTY, new Object[] { "org.eclipse.ui.test.set", "one"}, null));
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ApiTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ApiTestSuite.java
deleted file mode 100644
index 1834883..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ApiTestSuite.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.ui.tests.api.workbenchpart.ArbitraryPropertyTest;
-import org.eclipse.ui.tests.api.workbenchpart.LifecycleViewTest;
-import org.eclipse.ui.tests.api.workbenchpart.OverriddenTitleTest;
-import org.eclipse.ui.tests.api.workbenchpart.RawIViewPartTest;
-import org.eclipse.ui.tests.api.workbenchpart.ViewPartTitleTest;
-import org.eclipse.ui.tests.ide.api.FileEditorInputTest;
-
-/**
- * Test all areas of the UI API.
- */
-public class ApiTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite.  This is required to
-     * use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new ApiTestSuite();
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public ApiTestSuite() {
-        addTest(new TestSuite(IPageLayoutTest.class));
-        addTest(new TestSuite(PlatformUITest.class));
-        addTest(new TestSuite(IWorkbenchTest.class));
-        addTest(new TestSuite(IWorkbenchWindowTest.class));
-        addTest(new TestSuite(IWorkbenchPageTest.class));
-        addTest(new TestSuite(IDeprecatedWorkbenchPageTest.class));
-        addTest(new TestSuite(IActionFilterTest.class));
-        addTest(new TestSuite(IPageListenerTest.class));
-        addTest(new TestSuite(IPageServiceTest.class));
-        addTest(new TestSuite(IPerspectiveRegistryTest.class));
-        addTest(new TestSuite(IPerspectiveDescriptorTest.class));
-        addTest(new TestSuite(IFileEditorMappingTest.class));
-        addTest(new TestSuite(IEditorDescriptorTest.class));
-        addTest(new TestSuite(IEditorRegistryTest.class));
-        addTest(new TestSuite(IPerspectiveListenerTest.class));
-        addTest(new TestSuite(IWorkbenchWindowActionDelegateTest.class));
-        addTest(new TestSuite(IViewActionDelegateTest.class));
-        addTest(new TestSuite(IViewSiteTest.class));
-        addTest(new TestSuite(IEditorSiteTest.class));
-        addTest(new TestSuite(IActionBarsTest.class));
-        addTest(new TestSuite(IViewPartTest.class));
-        addTest(new TestSuite(IEditorPartTest.class));
-        addTest(new TestSuite(IEditorActionBarContributorTest.class));
-        addTest(new TestSuite(IPartServiceTest.class));
-        addTest(new TestSuite(ISelectionServiceTest.class));
-        addTest(new TestSuite(IWorkingSetTest.class));
-        addTest(new TestSuite(IWorkingSetManagerTest.class));
-        addTest(new TestSuite(MockWorkingSetTest.class));
-        addTest(new TestSuite(Bug42616Test.class));
-        addTest(new TestSuite(StickyViewTest.class));
-        addTest(new TestSuite(EditorIconTest.class));
-        addTest(new TestSuite(RawIViewPartTest.class));
-        addTest(new TestSuite(ViewPartTitleTest.class));
-        addTest(new TestSuite(OverriddenTitleTest.class));
-        addTest(new TestSuite(UIJobTest.class));
-        addTest(new TestSuite(Bug75118Test.class));
-        addTest(new TestSuite(FileEditorInputTest.class));
-        addTest(new TestSuite(IEditorMatchingStrategyTest.class));
-        addTest(new TestSuite(XMLMementoTest.class));
-        addTest(new TestSuite(TrimLayoutTest.class));
-        addTest(new TestSuite(IWorkbenchPartTestableTests.class));
-        addTest(new TestSuite(ArbitraryPropertyTest.class));
-        addTest(new TestSuite(LifecycleViewTest.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/BadElementFactory.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/BadElementFactory.java
deleted file mode 100644
index c0b4b94..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/BadElementFactory.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.ui.IElementFactory;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPersistableElement;
-
-/**
- * Simple factory implementation that will fail on command. This is used to test
- * that working set restoration does not die if one of the factories dies.
- * 
- * @since 3.4
- * 
- */
-public class BadElementFactory implements IElementFactory {
-
-	/**
-	 * Set to cause the factory to fail.
-	 */
-	public static boolean fail = false;
-	
-
-	/**
-	 * Set to true when {@link #createElement(IMemento)} is called while fail is true.
-	 */
-	public static boolean failAttempted = false;
-
-	public static class BadElementInstance implements IAdaptable,
-			IPersistableElement {
-
-		/**
-		 * Set to cause save to fail.
-		 */
-		public static boolean fail = false;
-		
-
-		/**
-		 * Set to true when {@link #saveState(IMemento)} is called while fail is true.
-		 */
-		public static boolean failAttempted = false;
-
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-		 */
-		public Object getAdapter(Class adapter) {
-			if (adapter.equals(IPersistableElement.class))
-				return this;
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.IPersistableElement#getFactoryId()
-		 */
-		public String getFactoryId() {
-			return "org.eclipse.ui.tests.badFactory";
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.IPersistable#saveState(org.eclipse.ui.IMemento)
-		 */
-		public void saveState(IMemento memento) {
-			if (fail) {
-				failAttempted = true;
-				throw new RuntimeException();
-			}
-
-		}
-
-	}
-;
-
-	public IAdaptable createElement(IMemento memento) {
-		if (fail) {
-			failAttempted = true;
-			throw new RuntimeException();
-		}
-		return new BadElementInstance();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/Bug42616Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/Bug42616Test.java
deleted file mode 100644
index 802d838..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/Bug42616Test.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test to ensure that <code>WorkbenchPlugin.createExtension()</code> will only 
- * throw <code>CoreException</code>s if there is a problem creating the 
- * extension.
- * 
- * @since 3.0
- */
-public class Bug42616Test extends UITestCase {
-
-    /**
-     * @param testName
-     */
-    public Bug42616Test(String testName) {
-        super(testName);
-    }
-
-    public void testErrorCondition() {
-        try {
-            WorkbenchPlugin.createExtension(null, null);
-            fail("createExtension with nulls succeeded");
-        } catch (CoreException e) {
-            // ensure that exception has a root cause.
-            assertNotNull("Cause is null", e.getStatus().getException());
-        } catch (Throwable t) {
-            fail("Throwable not wrapped in core exception.");
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/Bug75118Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/Bug75118Test.java
deleted file mode 100644
index 8b66381..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/Bug75118Test.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.dialogs.WorkbenchWizardElement;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.eclipse.ui.internal.registry.WizardsRegistryReader;
-
-/**
- * @since 3.1
- */
-public class Bug75118Test extends TestCase {
-
-	/**
-	 * 
-	 */
-	public Bug75118Test() {
-		super();
-	}
-
-	/**
-	 * @param name
-	 */
-	public Bug75118Test(String name) {
-		super(name);
-	}
-
-	public void testWizards() {
-		WizardsRegistryReader reader = new WizardsRegistryReader(
-				PlatformUI.PLUGIN_ID, IWorkbenchRegistryConstants.PL_NEW);
-		WorkbenchWizardElement [] primaryWizards = reader.getPrimaryWizards();
-		Set wizardSet = new HashSet(Arrays.asList(primaryWizards));
-		
-		//any duplicates would have been removed by adding it to the set
-		//so if the sizes are different something has been removed - ie:
-		//a duplicate
-		assertEquals(primaryWizards.length, wizardSet.size());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/DeprecatedSessionRestoreTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/DeprecatedSessionRestoreTest.java
deleted file mode 100644
index 398afc0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/DeprecatedSessionRestoreTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.EmptyPerspective;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * SessionRestoreTest runs the second half of our session
- * presistance tests.
- * 
- */
-public class DeprecatedSessionRestoreTest extends UITestCase {
-
-    /** 
-     * Construct an instance.
-     */
-    public DeprecatedSessionRestoreTest(String arg) {
-        super(arg);
-    }
-
-    /**
-     * Generates a session state in the workbench.
-     */
-    public void testRestoreSession() throws Throwable {
-        IWorkbenchWindow[] windows;
-        IWorkbenchPage[] pages;
-
-        // Get windows.
-        windows = fWorkbench.getWorkbenchWindows();
-        assertEquals(windows.length, 3);
-
-        // First window contains empty perspective.
-        pages = windows[0].getPages();
-        assertEquals(pages.length, 1);
-        assertEquals(pages[0].getPerspective().getId(),
-                EmptyPerspective.PERSP_ID);
-
-        // Second window contains empty + session.
-        pages = windows[1].getPages();
-        assertEquals(pages.length, 2);
-        assertEquals(pages[0].getPerspective().getId(),
-                EmptyPerspective.PERSP_ID);
-        assertEquals(pages[1].getPerspective().getId(), SessionPerspective.ID);
-        testSessionView(pages[1]);
-
-        // Third window contains 2 sessions.
-        pages = windows[2].getPages();
-        assertEquals(pages.length, 2);
-        assertEquals(pages[0].getPerspective().getId(), SessionPerspective.ID);
-        assertEquals(pages[1].getPerspective().getId(), SessionPerspective.ID);
-        testSessionView(pages[0]);
-        testSessionView(pages[1]);
-
-        // Last page contains 3 editors.
-        IEditorPart[] editors = pages[1].getEditors();
-        assertEquals(editors.length, 3);
-        testSessionEditor(editors[0], SessionCreateTest.TEST_FILE_1);
-        testSessionEditor(editors[1], SessionCreateTest.TEST_FILE_2);
-        testSessionEditor(editors[2], SessionCreateTest.TEST_FILE_3);
-    }
-
-    /**
-     * Tests the session view within a page.
-     */
-    private void testSessionView(IWorkbenchPage page) {
-        IViewPart view = page.findView(SessionView.VIEW_ID);
-        assertNotNull(view);
-        SessionView sessionView = (SessionView) view;
-        sessionView.testMementoState(this);
-    }
-
-    /**
-     * Tests the state of a session editor.
-     */
-    private void testSessionEditor(IEditorPart part, String fileName) {
-        IEditorSite site = part.getEditorSite();
-        assertEquals(site.getId(), MockEditorPart.ID1);
-        IEditorInput input = part.getEditorInput();
-        assertTrue(input instanceof IFileEditorInput);
-        IFile file = ((IFileEditorInput) input).getFile();
-        assertEquals(fileName, file.getName());
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/EditorIconTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/EditorIconTest.java
deleted file mode 100644
index 6aa6c59..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/EditorIconTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.tests.harness.util.ImageTests;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests to ensure that various icon scenarios work.  These are tested on 
- * editors but should be applicable for any client of 
- * AbstractUIPlugin.imageDescriptorFromPlugin()
- * 
- * @since 3.0
- */
-public class EditorIconTest extends UITestCase {
-
-    /**
-     * @param testName
-     */
-    public EditorIconTest(String testName) {
-        super(testName);
-    }
-
-    public void testDependantBundleIcon() {
-        Image i1 = null;
-        Image i2 = null;
-        
-        try {
-	        i1 = fWorkbench.getEditorRegistry().getDefaultEditor(
-	                "foo.icontest1").getImageDescriptor().createImage();
-	        i2 = AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ui",
-	                "icons/full/obj16/font.gif").createImage();
-	        ImageTests.assertEquals(i1, i2);
-        }
-        finally {
-        	if (i1 != null) {
-        		i1.dispose();
-        	}
-        	if (i2 != null) {
-        		i2.dispose();
-        	}
-        }
-    }
-
-    public void testNonDependantBundleIcon() {
-        Image i1 = null;
-        Image i2 = null;
-        try {
-	        i1 = fWorkbench.getEditorRegistry().getDefaultEditor(
-	                "foo.icontest2").getImageDescriptor().createImage();
-	        i2 = AbstractUIPlugin.imageDescriptorFromPlugin(
-	                "org.eclipse.jdt.ui", "icons/full/obj16/class_obj.gif")
-	                .createImage();
-	        ImageTests.assertEquals(i1, i2);
-        }
-        finally {
-        	if (i1 != null) {
-        		i1.dispose();
-        	}
-        	if (i2 != null) {
-        		i2.dispose();
-        	}
-        }	        
-    }
-
-    public void testBadIcon() {
-        Image i1 = null;
-        Image i2 = null;
-        
-        try {
-	        i1 = fWorkbench.getEditorRegistry().getDefaultEditor(
-	                "foo.icontest3").getImageDescriptor().createImage();
-	        i2 = AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.ui",
-	                "icons/full/obj16/file_obj.gif").createImage();
-	        ImageTests.assertEquals(i1, i2);
-        }
-        finally {
-        	if (i1 != null) {
-        		i1.dispose();
-        	}
-        	if (i2 != null) {
-        		i2.dispose();
-        	}
-        }	        
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/GenericCommandActionDelegate.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/GenericCommandActionDelegate.java
deleted file mode 100644
index 7b59d3d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/GenericCommandActionDelegate.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.IParameter;
-import org.eclipse.core.commands.Parameterization;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.NotDefinedException;
-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.core.runtime.Status;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IEditorActionDelegate;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-
-/**
- * This action delegate can be used to specify a command with or without
- * parameters be called from an &lt;action/&gt; specified in actionSets,
- * editorActions, viewActions, or popupMenus.
- */
-public class GenericCommandActionDelegate implements
-		IWorkbenchWindowActionDelegate, IViewActionDelegate,
-		IEditorActionDelegate, IObjectActionDelegate, IExecutableExtension {
-
-	/**
-	 * The commandId parameter needed when using the &lt;class/&gt; form for
-	 * this IActionDelegate. Value is "commandId".
-	 */
-	public static final String PARM_COMMAND_ID = "commandId";
-
-	private String commandId = null;
-
-	private Map parameterMap = null;
-
-	private ParameterizedCommand parameterizedCommand = null;
-
-	private IHandlerService handlerService = null;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-		handlerService = null;
-		parameterizedCommand = null;
-		parameterMap = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		if (handlerService == null) {
-			// what, no handler service ... no problem
-			return;
-		}
-		try {
-			if (commandId != null) {
-				handlerService.executeCommand(commandId, null);
-			} else if (parameterizedCommand != null) {
-				handlerService.executeCommand(parameterizedCommand, null);
-			}
-			// else there is no command for this delegate
-		} catch (Exception e) {
-			// exceptions reduced for brevity
-			// and we won't just do a print out :-)
-		}
-	}
-
-	/*
-	 * (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) {
-		// we don't care, handlers get their selection from the
-		// ExecutionEvent application context
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
-	 *      java.lang.String, java.lang.Object)
-	 */
-	public void setInitializationData(IConfigurationElement config,
-			String propertyName, Object data) throws CoreException {
-		String id = config.getAttribute(IWorkbenchRegistryConstants.ATT_ID);
-		// save the data until our init(*) call, where we can get
-		// the services.
-		if (data instanceof String) {
-			commandId = (String) data;
-		} else if (data instanceof Map) {
-			parameterMap = (Map) data;
-			if (parameterMap.get(PARM_COMMAND_ID) == null) {
-				Status status = new Status(IStatus.ERROR,
-						"org.eclipse.ui.tests", "The '" + id
-								+ "' action won't work without a commandId");
-				throw new CoreException(status);
-			}
-		} else {
-			Status status = new Status(
-					IStatus.ERROR,
-					"org.eclipse.ui.tests",
-					"The '"
-							+ id
-							+ "' action won't work without some initialization parameters");
-			throw new CoreException(status);
-		}
-	}
-
-	/**
-	 * Build a command from the executable extension information.
-	 * 
-	 * @param commandService
-	 *            to get the Command object
-	 */
-	private void createCommand(ICommandService commandService) {
-		String id = (String) parameterMap.get(PARM_COMMAND_ID);
-		if (id == null) {
-			return;
-		}
-		if (parameterMap.size() == 1) {
-			commandId = id;
-			return;
-		}
-		try {
-			Command cmd = commandService.getCommand(id);
-			if (!cmd.isDefined()) {
-				// command not defined? no problem ...
-				return;
-			}
-			ArrayList parameters = new ArrayList();
-			Iterator i = parameterMap.keySet().iterator();
-			while (i.hasNext()) {
-				String parmName = (String) i.next();
-				if (PARM_COMMAND_ID.equals(parmName)) {
-					continue;
-				}
-				IParameter parm = cmd.getParameter(parmName);
-				if (parm == null) {
-					// asking for a bogus parameter? No problem
-					return;
-				}
-				parameters.add(new Parameterization(parm, (String) parameterMap
-						.get(parmName)));
-			}
-			parameterizedCommand = new ParameterizedCommand(cmd,
-					(Parameterization[]) parameters
-							.toArray(new Parameterization[parameters.size()]));
-		} catch (NotDefinedException e) {
-			// command is bogus? No problem, we'll do nothing.
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		if (handlerService != null) {
-			// already initialized
-			return;
-		}
-
-		handlerService = (IHandlerService) window
-				.getService(IHandlerService.class);
-		if (parameterMap != null) {
-			ICommandService commandService = (ICommandService) window
-					.getService(ICommandService.class);
-			createCommand(commandService);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		init(view.getSite().getWorkbenchWindow());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IEditorActionDelegate#setActiveEditor(org.eclipse.jface.action.IAction,
-	 *      org.eclipse.ui.IEditorPart)
-	 */
-	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
-		// we don't actually care about the active editor, since that
-		// information is in the ExecutionEvent application context
-		// but we need to make sure we're initialized.
-		if (targetEditor != null) {
-			init(targetEditor.getSite().getWorkbenchWindow());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction,
-	 *      org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		// we don't actually care about the active part, since that
-		// information is in the ExecutionEvent application context
-		// but we need to make sure we're initialized.
-		if (targetPart != null) {
-			init(targetPart.getSite().getWorkbenchWindow());
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IActionBarsTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IActionBarsTest.java
deleted file mode 100644
index 015940a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IActionBarsTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.commands.NotEnabledException;
-import org.eclipse.core.commands.NotHandledException;
-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.ui.IActionBars;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.internal.handlers.IActionCommandMappingService;
-import org.eclipse.ui.tests.harness.util.ActionUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test the lifecycle of an action delegate.
- */
-public class IActionBarsTest extends UITestCase {
-
-    protected IWorkbenchWindow fWindow;
-
-    protected IWorkbenchPage fPage;
-
-    private class MockAction extends Action {
-        public boolean hasRun = false;
-
-        public MockAction() {
-            super();
-        }
-
-        public void run() {
-            hasRun = true;
-        }
-    }
-
-    /**
-     * Constructor for IActionDelegateTest
-     */
-    public IActionBarsTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWindow = openTestWindow();
-        fPage = fWindow.getActivePage();
-    }
-
-    public void testGetMenuManager() throws Throwable {
-        // From Javadoc: "Returns the menu manager."
-
-        IViewPart part = fPage.showView(MockViewPart.ID);
-        IActionBars bars = part.getViewSite().getActionBars();
-        assertNotNull(bars);
-        IMenuManager mgr = bars.getMenuManager();
-        assertNotNull(mgr);
-    }
-
-    public void testGetStatusLineManager() throws Throwable {
-        // From Javadoc: "Returns the status line manager."
-
-        IViewPart part = fPage.showView(MockViewPart.ID);
-        IActionBars bars = part.getViewSite().getActionBars();
-        assertNotNull(bars);
-        IStatusLineManager mgr = bars.getStatusLineManager();
-        assertNotNull(mgr);
-    }
-
-    public void testGetToolBarManager() throws Throwable {
-        // From Javadoc: "Returns the tool bar manager."
-
-        IViewPart part = fPage.showView(MockViewPart.ID);
-        IActionBars bars = part.getViewSite().getActionBars();
-        assertNotNull(bars);
-        IToolBarManager mgr = bars.getToolBarManager();
-        assertNotNull(mgr);
-    }
-
-    public void testGetGlobalActionHandler() throws Throwable {
-        // From Javadoc: "Returns the global action handler for 
-        // the action with the given id.  
-
-        IViewPart part = fPage.showView(MockViewPart.ID);
-        IActionBars bars = part.getViewSite().getActionBars();
-        assertNotNull(bars);
-
-        // Get actions.  They should all be null.
-        assertNull(bars.getGlobalActionHandler(IWorkbenchActionConstants.CUT));
-        assertNull(bars.getGlobalActionHandler(IWorkbenchActionConstants.COPY));
-        assertNull(bars.getGlobalActionHandler(IWorkbenchActionConstants.UNDO));
-
-        // Create actions.
-        MockAction cut = new MockAction();
-        MockAction copy = new MockAction();
-        MockAction undo = new MockAction();
-
-        // Set actions.
-        bars.setGlobalActionHandler(IWorkbenchActionConstants.CUT, cut);
-        bars.setGlobalActionHandler(IWorkbenchActionConstants.COPY, copy);
-        bars.setGlobalActionHandler(IWorkbenchActionConstants.UNDO, undo);
-        bars.updateActionBars();
-
-        // Get actions.  They should not be null.
-        assertEquals(cut, bars
-                .getGlobalActionHandler(IWorkbenchActionConstants.CUT));
-        assertEquals(copy, bars
-                .getGlobalActionHandler(IWorkbenchActionConstants.COPY));
-        assertEquals(undo, bars
-                .getGlobalActionHandler(IWorkbenchActionConstants.UNDO));
-    }
-
-        public void testSetGlobalActionHandler() throws Throwable {
-	        // From Javadoc: "Returns the global action handler for 
-	        // the action with the given id.  
-	
-	        IViewPart part = fPage.showView(MockViewPart.ID);
-	        IActionBars bars = part.getViewSite().getActionBars();
-	        assertNotNull(bars);
-	
-	        // Create actions.
-	        MockAction cut = new MockAction();
-	        MockAction copy = new MockAction();
-	        MockAction undo = new MockAction();
-	
-	        // Set actions.
-	        bars.setGlobalActionHandler(IWorkbenchActionConstants.CUT, cut);
-	        bars.setGlobalActionHandler(IWorkbenchActionConstants.COPY, copy);
-	        bars.setGlobalActionHandler(IWorkbenchActionConstants.UNDO, undo);
-	        bars.updateActionBars();
-	
-	        // Run the real workbench actions.
-	        // Verify the actions are invoked.
-	        cut.hasRun = copy.hasRun = undo.hasRun = false;
-	        
-	        // anything that has been converted from a RetargetAction in
-	        // WorkbenchActionBuilder must be run as a command
-	        runMatchingCommand(fWindow, ActionFactory.CUT.getId());
-	        
-	        ActionUtil.runActionUsingPath(this, fWindow,
-	                IWorkbenchActionConstants.M_EDIT + '/'
-	                        + IWorkbenchActionConstants.UNDO);
-	        assertTrue(cut.hasRun);
-	        assertTrue(!copy.hasRun);
-	        assertTrue(undo.hasRun);
-	
-	        // Now create a second view and run the actions again.
-	        // Our global actions should not be invoked.
-	        fPage.showView(MockViewPart.ID2);
-	        cut.hasRun = copy.hasRun = undo.hasRun = false;
-	        runMatchingCommand(fWindow, ActionFactory.CUT.getId());
-	        ActionUtil.runActionUsingPath(this, fWindow,
-	                IWorkbenchActionConstants.M_EDIT + '/'
-	                        + IWorkbenchActionConstants.UNDO);
-	        assertTrue(!cut.hasRun);
-	        assertTrue(!copy.hasRun);
-	        assertTrue(!undo.hasRun);
-	
-	        // Reactivate test view and run actions again.
-	        // This time our global actions should be invoked.		
-	        fPage.activate(part);
-	        cut.hasRun = copy.hasRun = undo.hasRun = false;
-	        runMatchingCommand(fWindow, ActionFactory.CUT.getId());
-	        ActionUtil.runActionUsingPath(this, fWindow,
-	                IWorkbenchActionConstants.M_EDIT + '/'
-	                        + IWorkbenchActionConstants.UNDO);
-	        assertTrue(cut.hasRun);
-	        assertTrue(!copy.hasRun);
-	        assertTrue(undo.hasRun);
-	    }
-    
-    private void runMatchingCommand(IWorkbenchWindow window, String actionId) {
-    	IHandlerService hs = (IHandlerService) window.getService(IHandlerService.class);
-    	IActionCommandMappingService ms = (IActionCommandMappingService) window.getService(IActionCommandMappingService.class);
-    	String commandId = ms.getCommandId(actionId);
-    	assertNotNull(commandId);
-    	try {
-			hs.executeCommand(commandId, null);
-    	} catch (NotHandledException e) {
-    		// this is not a failure, just a condition to be checked by
-    		// the test
-    	} catch (NotEnabledException e) {
-    		// this is not a failure, just a condition to be checked by
-    		// the test
-		} catch (Exception e) {
-			fail("Failed to run " + commandId, e);
-		}
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IActionDelegateTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IActionDelegateTest.java
deleted file mode 100644
index fdfe486..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IActionDelegateTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test the lifecycle of an action delegate.
- */
-public abstract class IActionDelegateTest extends UITestCase {
-
-    protected IWorkbenchWindow fWindow;
-
-    protected IWorkbenchPage fPage;
-
-    /**
-     * Constructor for IActionDelegateTest
-     */
-    public IActionDelegateTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWindow = openTestWindow();
-        fPage = fWindow.getActivePage();
-    }
-
-    public void testRun() throws Throwable {
-        // Create the action.
-        Object obj = createActionWidget();
-
-        // Run the action delegate.
-        // The selectionChanged and run methods should be called, in that order.
-        runAction(obj);
-        MockActionDelegate delegate = getDelegate();
-        assertNotNull(delegate);
-        assertTrue(delegate.callHistory.verifyOrder(new String[] {
-                "selectionChanged", "run" }));
-    }
-
-    public void testSelectionChanged() throws Throwable {
-        // Create the delegate by running it.
-        Object obj = createActionWidget();
-        runAction(obj);
-        MockActionDelegate delegate = getDelegate();
-        assertNotNull(delegate);
-
-        // Fire a selection.
-        // The selectionChanged method should be invoked.
-        delegate.callHistory.clear();
-        fireSelection(obj);
-        assertTrue(delegate.callHistory.contains("selectionChanged"));
-    }
-
-    /**
-     * Returns the last mock action delegate which was created.
-     */
-    protected MockActionDelegate getDelegate() throws Throwable {
-        MockActionDelegate delegate = MockActionDelegate.lastDelegate;
-        assertNotNull(delegate);
-        return delegate;
-    }
-
-    /**
-     * Creates the widget for an action, and adds the action.
-     * 
-     * @returns an object which will be passed to runAction and 
-     * fireSelection.
-     */
-    protected abstract Object createActionWidget() throws Throwable;
-
-    /**
-     * Adds and runs the action delegate.  Subclasses should override.
-     * 
-     * @param obj the object returned from createActionWidget.
-     */
-    protected abstract void runAction(Object widget) throws Throwable;
-
-    /**
-     * Fires a selection from the source.  Subclasses should override.
-     * 
-     * @param obj the object returned from createActionWidget.
-     */
-    protected abstract void fireSelection(Object widget) throws Throwable;
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IActionFilterTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IActionFilterTest.java
deleted file mode 100644
index c7f2610..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IActionFilterTest.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.ActionUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test the lifecycle of an action filter.
- * 
- * From Javadoc: "An IActionFilter returns whether the specific attribute
- * 		matches the state of the target object."
- * 
- * Setup: The plugin.xml contains a number of popup menu action 
- * targetted to ListElements 
- * 
- * 		redAction -> (name = red)
- * 		blueAction -> (name = blue)
- * 		trueAction -> (flag = true)
- * 		falseAction -> (flag = false)
- * 		redTrueAction -> (name = red) (flag = true)
- */
-public class IActionFilterTest extends UITestCase {
-
-    protected IWorkbenchWindow fWindow;
-
-    protected IWorkbenchPage fPage;
-
-    protected String STATIC_MENU_VIEW_ID = "org.eclipse.ui.tests.api.IActionFilterTest1";
-
-    protected String DYNAMIC_MENU_VIEW_ID = "org.eclipse.ui.tests.api.IActionFilterTest2";
-
-    public IActionFilterTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWindow = openTestWindow();
-        fPage = fWindow.getActivePage();
-    }
-
-    public void testStaticLifecycle() throws Throwable {
-        testLifecycle(STATIC_MENU_VIEW_ID);
-    }
-
-    public void testDynamicLifecycle() throws Throwable {
-        testLifecycle(DYNAMIC_MENU_VIEW_ID);
-    }
-
-    /**
-     * Select a list element, popup the menu, and verify that the 
-     * action filter is called.
-     * 
-     * See Setup above.
-     */
-    private void testLifecycle(String viewId) throws Throwable {
-        // Create a list view.  
-        ListView view = (ListView) fPage.showView(viewId);
-
-        // Create the test objects.
-        ListElement red = new ListElement("red");
-        view.addElement(red);
-        view.selectElement(red);
-
-        // Get action filter.
-        ListElementActionFilter filter = ListElementActionFilter.getSingleton();
-
-        // Open menu.  Verify that action filter is called.			
-        MenuManager menuMgr = view.getMenuManager();
-        ActionUtil.fireAboutToShow(menuMgr);
-        assertTrue(filter.getCalled());
-    }
-
-    public void testDynamicMenuContribution() throws Throwable {
-        testMenu(DYNAMIC_MENU_VIEW_ID);
-    }
-
-    public void testStaticMenuContribution() throws Throwable {
-        testMenu(STATIC_MENU_VIEW_ID);
-    }
-
-    /**
-     * Select a ListElement, popup a menu and verify that the 
-     * ListElementActionFilter.testAttribute method is invoked.  
-     * Then verify that the correct actions are added to the
-     * popup menu.
-     * 
-     * See Setup above.
-     */
-    private void testMenu(String viewId) throws Throwable {
-        // Create the test objects.
-        ListElement red = new ListElement("red");
-        ListElement blue = new ListElement("blue");
-        ListElement green = new ListElement("green");
-        ListElement redTrue = new ListElement("red", true);
-
-        // Create a list view.  
-        ListView view = (ListView) fPage.showView(viewId);
-        MenuManager menuMgr = view.getMenuManager();
-        view.addElement(red);
-        view.addElement(blue);
-        view.addElement(green);
-        view.addElement(redTrue);
-
-        // Get action filter.
-        ListElementActionFilter filter = ListElementActionFilter.getSingleton();
-
-        // Select red, verify popup.
-        view.selectElement(red);
-        ActionUtil.fireAboutToShow(menuMgr);
-        assertTrue(filter.getCalled());
-        assertNotNull(ActionUtil.getActionWithLabel(menuMgr, "redAction_v1"));
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "blueAction_v1"));
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "trueAction_v1"));
-        assertNotNull(ActionUtil.getActionWithLabel(menuMgr, "falseAction_v1"));
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "redTrueAction_v1"));
-        view.verifyActions(this, menuMgr);
-
-        // Select blue, verify popup.
-        filter.clearCalled();
-        view.selectElement(blue);
-        ActionUtil.fireAboutToShow(menuMgr);
-        assertTrue(filter.getCalled());
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "redAction_v1"));
-        assertNotNull(ActionUtil.getActionWithLabel(menuMgr, "blueAction_v1"));
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "trueAction_v1"));
-        assertNotNull(ActionUtil.getActionWithLabel(menuMgr, "falseAction_v1"));
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "redTrueAction_v1"));
-        view.verifyActions(this, menuMgr);
-
-        // Select green, verify popup.
-        filter.clearCalled();
-        view.selectElement(green);
-        ActionUtil.fireAboutToShow(menuMgr);
-        assertTrue(filter.getCalled());
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "redAction_v1"));
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "blueAction_v1"));
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "trueAction_v1"));
-        assertNotNull(ActionUtil.getActionWithLabel(menuMgr, "falseAction_v1"));
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "redTrueAction_v1"));
-        view.verifyActions(this, menuMgr);
-
-        // Select redTrue, verify popup.
-        filter.clearCalled();
-        view.selectElement(redTrue);
-        ActionUtil.fireAboutToShow(menuMgr);
-        assertTrue(filter.getCalled());
-        assertNotNull(ActionUtil.getActionWithLabel(menuMgr, "redAction_v1"));
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "blueAction_v1"));
-        assertNotNull(ActionUtil.getActionWithLabel(menuMgr, "trueAction_v1"));
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "falseAction_v1"));
-        assertNotNull(ActionUtil
-                .getActionWithLabel(menuMgr, "redTrueAction_v1"));
-        view.verifyActions(this, menuMgr);
-
-        // Select nothing, verify popup.
-        filter.clearCalled();
-        view.selectElement(null);
-        ActionUtil.fireAboutToShow(menuMgr);
-        assertTrue(!filter.getCalled());
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "redAction_v1"));
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "blueAction_v1"));
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "trueAction_v1"));
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "falseAction_v1"));
-        assertNull(ActionUtil.getActionWithLabel(menuMgr, "redTrueAction_v1"));
-        view.verifyActions(this, menuMgr);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IConstants.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IConstants.java
deleted file mode 100644
index 267b52d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IConstants.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-public interface IConstants {
-    public static String FakeID = "Is this fake ID for buying beer or getting into a club?",
-            FakeLabel = "Hmmm. Who's to say this is a fake label? I mean, someday, this can be a real label.",
-            UnknownFileName[] = {
-                    "This is not a known file name to the world.with a cool extension",
-                    "this is not the same as the other.anyways this is a file extension" },
-            KnownFileName[] = { "plugin.xml" },
-            ProjectName = "JUnitTestingProjectName";
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IDeprecatedWorkbenchPageTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IDeprecatedWorkbenchPageTest.java
deleted file mode 100644
index d0b34e9..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IDeprecatedWorkbenchPageTest.java
+++ /dev/null
@@ -1,848 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.registry.IActionSetDescriptor;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.harness.util.ArrayUtil;
-import org.eclipse.ui.tests.harness.util.CallHistory;
-import org.eclipse.ui.tests.harness.util.EmptyPerspective;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-public class IDeprecatedWorkbenchPageTest extends UITestCase {
-
-	private IWorkbenchPage fActivePage;
-
-	private IWorkbenchWindow fWin;
-
-	private IProject proj;
-
-	public IDeprecatedWorkbenchPageTest(String testName) {
-		super(testName);
-	}
-
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		fWin = openTestWindow();
-		fActivePage = fWin.getActivePage();
-	}
-
-	protected void doTearDown() throws Exception {
-		super.doTearDown();
-		if (proj != null) {
-			FileUtil.deleteProject(proj);
-			proj = null;
-		}
-	}
-
-	/**
-	 * tests both of the following: setEditorAreaVisible() isEditorAreaVisible()
-	 */
-	public void testGet_SetEditorAreaVisible() throws Throwable {
-		fActivePage.setEditorAreaVisible(true);
-		assertTrue(fActivePage.isEditorAreaVisible() == true);
-
-		fActivePage.setEditorAreaVisible(false);
-		assertTrue(fActivePage.isEditorAreaVisible() == false);
-	}
-
-	public void testGetPerspective() throws Throwable {
-		assertNotNull(fActivePage.getPerspective());
-
-		IWorkbenchPage page = fWin.openPage(EmptyPerspective.PERSP_ID,
-				getPageInput());
-		assertEquals(EmptyPerspective.PERSP_ID, page.getPerspective().getId());
-	}
-
-	public void testSetPerspective() throws Throwable {
-		IPerspectiveDescriptor per = PlatformUI.getWorkbench()
-				.getPerspectiveRegistry().findPerspectiveWithId(
-						EmptyPerspective.PERSP_ID);
-		fActivePage.setPerspective(per);
-		assertEquals(per, fActivePage.getPerspective());
-	}
-
-	public void testGetLabel() {
-		assertNotNull(fActivePage.getLabel());
-	}
-
-	public void testGetInput() throws Throwable {
-		IAdaptable input = getPageInput();
-		IWorkbenchPage page = fWin.openPage(input);
-		assertEquals(input, page.getInput());
-	}
-
-	public void testActivate() throws Throwable {
-		MockViewPart part = (MockViewPart) fActivePage
-				.showView(MockViewPart.ID);
-		MockViewPart part2 = (MockViewPart) fActivePage
-				.showView(MockViewPart.ID2);
-
-		MockPartListener listener = new MockPartListener();
-		fActivePage.addPartListener(listener);
-		fActivePage.activate(part);
-
-		CallHistory callTrace;
-
-		callTrace = part2.getCallHistory();
-		callTrace.clear();
-		fActivePage.activate(part2);
-		assertTrue(callTrace.contains("setFocus"));
-		assertTrue(listener.getCallHistory().contains("partActivated"));
-
-		callTrace = part.getCallHistory();
-		callTrace.clear();
-		fActivePage.activate(part);
-		assertTrue(callTrace.contains("setFocus"));
-		assertTrue(listener.getCallHistory().contains("partActivated"));
-	}
-
-	public void testBringToTop() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		IEditorPart part = IDE.openEditor(fActivePage, FileUtil.createFile(
-				"a.mock1", proj), true);
-		IEditorPart part2 = IDE.openEditor(fActivePage, FileUtil.createFile(
-				"b.mock1", proj), true);
-
-		MockPartListener listener = new MockPartListener();
-		fActivePage.addPartListener(listener);
-		CallHistory callTrace = listener.getCallHistory();
-
-		// at this point, part2 is active
-		fActivePage.bringToTop(part);
-		assertEquals(callTrace.contains("partBroughtToTop"), true);
-
-		callTrace.clear();
-		fActivePage.bringToTop(part2);
-		assertEquals(callTrace.contains("partBroughtToTop"), true);
-	}
-
-	public void testGetWorkbenchWindow() {
-		/*
-		 * Commented out because until test case can be updated to work with new
-		 * window/page/perspective implementation
-		 * 
-		 * assertEquals(fActivePage.getWorkbenchWindow(), fWin); IWorkbenchPage
-		 * page = openTestPage(fWin); assertEquals(page.getWorkbenchWindow(),
-		 * fWin);
-		 */
-	}
-
-	public void testShowView() throws Throwable {
-		/*
-		 * javadoc: Shows a view in this page and give it focus
-		 */
-		MockViewPart view = (MockViewPart) fActivePage
-				.showView(MockViewPart.ID);
-		assertNotNull(view);
-		assertTrue(view.getCallHistory().verifyOrder(
-				new String[] { "init", "createPartControl", "setFocus" }));
-
-		fActivePage.showView(MockViewPart.ID2);
-
-		/*
-		 * javadoc: If the view is already visible, it is given focus
-		 */
-		CallHistory callTrace = view.getCallHistory();
-		callTrace.clear();
-		assertEquals(fActivePage.showView(MockViewPart.ID), view);
-		assertEquals(callTrace.contains("setFocus"), true);
-	}
-
-	/**
-	 * openEditor(IFile input)
-	 */
-	public void testOpenEditor() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-
-		/*
-		 * javadoc: 1. The workbench editor registry is consulted to determine
-		 * if an editor extension has been registered for the file type. If so,
-		 * an instance of the editor extension is opened on the file
-		 */
-		IFile file = FileUtil.createFile("test.mock1", proj);
-		IEditorPart editor = IDE.openEditor(fActivePage, file, true);
-		assertEquals(ArrayUtil.contains(fActivePage.getEditors(), editor), true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-		assertEquals(editor.getSite().getId(), fWorkbench.getEditorRegistry()
-				.getDefaultEditor(file.getName()).getId());
-
-		/*
-		 * javadoc: 2. Next, the native operating system will be consulted to
-		 * determine if a native editor exists for the file type. If so, a new
-		 * process is started and the native editor is opened on the file.
-		 */
-		// can not be tested
-		/*
-		 * javadoc: 3. If all else fails the file will be opened in a default
-		 * text editor.
-		 */
-		file = FileUtil.createFile("a.null and void", proj);
-		editor = IDE.openEditor(fActivePage, file, true);
-		if (editor != null) {//Editor may be external
-			assertEquals(ArrayUtil.contains(fActivePage.getEditors(), editor),
-					true);
-			assertEquals(fActivePage.getActiveEditor(), editor);
-			assertEquals(editor.getSite().getId(),
-					"org.eclipse.ui.DefaultTextEditor");
-
-			// open another editor to take the focus away from the first editor
-			IDE.openEditor(fActivePage,
-					FileUtil.createFile("test.mock2", proj), true);
-
-			/*
-			 * javadoc: If this page already has an editor open on the target
-			 * object that editor is activated
-			 */
-			// open the editor second time.
-			assertEquals(editor, IDE.openEditor(fActivePage, file, true));
-			assertEquals(editor, fActivePage.getActiveEditor());
-		}
-	}
-
-	/**
-	 * openEditor(IFile input, String editorID)
-	 */
-	public void testOpenEditor2() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		final IFile file = FileUtil.createFile("asfasdasdf", proj);
-		final String id = MockEditorPart.ID1;
-
-		/*
-		 * javadoc: The editor type is determined by mapping editorId to an
-		 * editor extension registered with the workbench.
-		 */
-		IEditorPart editor = fActivePage.openEditor(new FileEditorInput(file),
-				id);
-		assertEquals(editor.getSite().getId(), id);
-		assertEquals(ArrayUtil.contains(fActivePage.getEditors(), editor), true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-
-		// open another editor to take the focus away from the first editor
-		IDE.openEditor(fActivePage, FileUtil.createFile("test.mock2", proj),
-				true);
-
-		/*
-		 * javadoc: If this page already has an editor open on the target object
-		 * that editor is activated
-		 */
-		// open the first editor second time.
-		assertEquals(fActivePage.openEditor(new FileEditorInput(file), id),
-				editor);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-	}
-
-	/**
-	 * openEditor(IEditorInput input,String editorId)
-	 */
-	public void testOpenEditor3() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		final String id = MockEditorPart.ID1;
-		IEditorInput input = new FileEditorInput(FileUtil.createFile(
-				"test.mock1", proj));
-
-		/*
-		 * javadoc: The editor type is determined by mapping editorId to an
-		 * editor extension registered with the workbench
-		 */
-		IEditorPart editor = fActivePage.openEditor(input, id);
-		assertEquals(editor.getEditorInput(), input);
-		assertEquals(editor.getSite().getId(), id);
-		assertEquals(ArrayUtil.contains(fActivePage.getEditors(), editor), true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-
-		// open another editor to take the focus away from the first editor
-		IDE.openEditor(fActivePage, FileUtil.createFile("test.mock2", proj),
-				true);
-
-		/*
-		 * javadoc: If this page already has an editor open on the target object
-		 * that editor is activated
-		 */
-		// open the first editor second time.
-		assertEquals(fActivePage.openEditor(input, id), editor);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-	}
-
-	/**
-	 * openEditor(IEditorInput input, String editorId, boolean activate)
-	 */
-	public void testOpenEditor4() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		final String id = MockEditorPart.ID1;
-		IEditorInput input = new FileEditorInput(FileUtil.createFile(
-				"test.mock1", proj));
-		MockPartListener listener = new MockPartListener();
-		fActivePage.addPartListener(listener);
-		CallHistory callTrace = listener.getCallHistory();
-
-		/*
-		 * javadoc: The editor type is determined by mapping editorId to an
-		 * editor extension registered with the workbench. javadoc: If activate ==
-		 * true the editor will be activated
-		 */
-		// open an editor with activation
-		IEditorPart editor = fActivePage.openEditor(input, id, true);
-		assertEquals(editor.getEditorInput(), input);
-		assertEquals(editor.getSite().getId(), id);
-		assertEquals(ArrayUtil.contains(fActivePage.getEditors(), editor), true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-		assertEquals(callTrace.contains("partActivated"), true);
-
-		// we need another editor so that the editor under test can receive
-		// events.
-		// otherwise, events will be ignored.
-		IEditorPart extra = IDE.openEditor(fActivePage, FileUtil.createFile(
-				"aaaaa", proj), true);
-
-		// close the first editor after the second has opened; necessary for
-		// test to work with fix to PR 7743
-		fActivePage.closeEditor(editor, false);
-
-		// Activate something in a different stack, or the editor will end up
-		// activated regardless of
-		// the activate flag.
-		fActivePage.showView(IPageLayout.ID_PROBLEM_VIEW, null,
-				IWorkbenchPage.VIEW_ACTIVATE);
-		// open an editor without activation
-		callTrace.clear();
-		editor = fActivePage.openEditor(input, id, false);
-		assertEquals(editor.getEditorInput(), input);
-		assertEquals(editor.getSite().getId(), id);
-		assertEquals(ArrayUtil.contains(fActivePage.getEditors(), editor), true);
-		assertEquals(callTrace.contains("partActivated"), false);
-		assertEquals(callTrace.contains("partBroughtToTop"), true);
-
-		fActivePage.activate(extra);
-
-		/*
-		 * javadoc: If this page already has an editor open on the target object
-		 * that editor is brought to the front
-		 */
-		// Activate something in a different stack, or the editor will end up
-		// activated regardless of
-		// the activate flag.
-		fActivePage.showView(IPageLayout.ID_PROBLEM_VIEW, null,
-				IWorkbenchPage.VIEW_ACTIVATE);
-		// open the editor under test second time without activation
-		callTrace.clear();
-		assertEquals(fActivePage.openEditor(input, id, false), editor);
-		assertEquals(callTrace.contains("partBroughtToTop"), true);
-		assertEquals(callTrace.contains("partActivated"), false);
-
-		// activate the other editor
-		fActivePage.activate(extra);
-
-		/*
-		 * javadoc: If activate == true the editor will be activated
-		 */
-		// open the editor under test second time with activation
-		callTrace.clear();
-		assertEquals(fActivePage.openEditor(input, id, true), editor);
-		assertEquals(callTrace.contains("partBroughtToTop"), true);
-		assertEquals(callTrace.contains("partActivated"), true);
-	}
-
-	/**
-	 * openEditor(IMarker marker)
-	 */
-	public void testOpenEditor5() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		IMarker marker = FileUtil.createFile("aa.mock2", proj).createMarker(
-				IMarker.TASK);
-		CallHistory callTrace;
-
-		/*
-		 * javadoc: the cursor and selection state of the editor is then updated
-		 * from information recorded in the marker.
-		 */
-		// open the registered editor for the marker resource
-		IEditorPart editor = IDE.openEditor(fActivePage, marker, true);
-		callTrace = ((MockEditorPart) editor).getCallHistory();
-		assertEquals(editor.getSite().getId(), MockEditorPart.ID2);
-		assertEquals(ArrayUtil.contains(fActivePage.getEditors(), editor), true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-		assertEquals(callTrace.contains("gotoMarker"), true);
-		fActivePage.closeEditor(editor, false);
-
-		/*
-		 * javadoc: If the marker contains an EDITOR_ID_ATTR attribute the
-		 * attribute value will be used to determine the editor type to be
-		 * opened
-		 */
-		marker.setAttribute(IWorkbenchPage.EDITOR_ID_ATTR, MockEditorPart.ID1);
-		editor = IDE.openEditor(fActivePage, marker, true);
-		callTrace = ((MockEditorPart) editor).getCallHistory();
-		assertEquals(editor.getSite().getId(), MockEditorPart.ID1);
-		assertEquals(ArrayUtil.contains(fActivePage.getEditors(), editor), true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-		assertEquals(callTrace.contains("gotoMarker"), true);
-		// do not close the editor this time
-
-		/*
-		 * javdoc: If this page already has an editor open on the target object
-		 * that editor is activated
-		 */
-		callTrace.clear();
-		assertEquals(IDE.openEditor(fActivePage, marker, true), editor);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-		assertEquals(callTrace.contains("gotoMarker"), true);
-		fActivePage.closeEditor(editor, false);
-	}
-
-	/**
-	 * openEditor(IMarker marker, boolean activate)
-	 */
-	public void testOpenEditor6() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		IMarker marker = FileUtil.createFile("aa.mock2", proj).createMarker(
-				IMarker.TASK);
-		MockPartListener listener = new MockPartListener();
-		fActivePage.addPartListener(listener);
-		CallHistory listenerCall = listener.getCallHistory();
-		CallHistory editorCall;
-
-		// we need another editor so that the editor under test can receive
-		// events.
-		// otherwise, events will be ignored.
-		IEditorPart extra = IDE.openEditor(fActivePage, FileUtil.createFile(
-				"aaaaa", proj), true);
-
-		/*
-		 * javadoc: If activate == true the editor will be activated
-		 */
-		// open the registered editor for the marker resource with activation
-		IEditorPart editor = IDE.openEditor(fActivePage, marker, true);
-		editorCall = ((MockEditorPart) editor).getCallHistory();
-		assertEquals(editor.getSite().getId(), MockEditorPart.ID2);
-		assertEquals(ArrayUtil.contains(fActivePage.getEditors(), editor), true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-
-		/*
-		 * javadoc: the cursor and selection state of the editor is then updated
-		 * from information recorded in the marker.
-		 */
-		assertEquals(editorCall.contains("gotoMarker"), true);
-		fActivePage.closeEditor(editor, false);
-
-		fActivePage.activate(extra);
-
-		// Activate something in a different stack, or the editor will end up
-		// activated regardless of
-		// the activate flag.
-		fActivePage.showView(IPageLayout.ID_PROBLEM_VIEW, null,
-				IWorkbenchPage.VIEW_ACTIVATE);
-
-		// open the registered editor for the marker resource without activation
-		listenerCall.clear();
-		editor = IDE.openEditor(fActivePage, marker, false);
-		editorCall = ((MockEditorPart) editor).getCallHistory();
-		assertEquals(editor.getSite().getId(), MockEditorPart.ID2);
-		assertEquals(ArrayUtil.contains(fActivePage.getEditors(), editor), true);
-		assertEquals(listenerCall.contains("partBroughtToTop"), true);
-		assertEquals(listenerCall.contains("partActivated"), false);
-		assertEquals(editorCall.contains("gotoMarker"), true);
-		fActivePage.closeEditor(editor, false);
-
-		/*
-		 * javadoc: If the marker contains an EDITOR_ID_ATTR attribute the
-		 * attribute value will be used to determine the editor type to be
-		 * opened
-		 */
-		String id = MockEditorPart.ID1;
-		marker.setAttribute(IWorkbenchPage.EDITOR_ID_ATTR, id);
-
-		// open an editor with activation
-		listenerCall.clear();
-
-		editor = IDE.openEditor(fActivePage, marker, true);
-		editorCall = ((MockEditorPart) editor).getCallHistory();
-		assertEquals(editor.getSite().getId(), id);
-		assertEquals(ArrayUtil.contains(fActivePage.getEditors(), editor), true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-		assertEquals(editorCall.contains("gotoMarker"), true);
-		fActivePage.closeEditor(editor, false);
-
-		fActivePage.activate(extra);
-
-		// Activate something in a different stack, or the editor will end up
-		// activated regardless of
-		// the activate flag.
-		fActivePage.showView(IPageLayout.ID_PROBLEM_VIEW, null,
-				IWorkbenchPage.VIEW_ACTIVATE);
-
-		// open an editor without activation
-		listenerCall.clear();
-		editor = IDE.openEditor(fActivePage, marker, false);
-		editorCall = ((MockEditorPart) editor).getCallHistory();
-		assertEquals(editor.getSite().getId(), id);
-		assertEquals(ArrayUtil.contains(fActivePage.getEditors(), editor), true);
-		assertEquals(editorCall.contains("gotoMarker"), true);
-		assertEquals(listenerCall.contains("partActivated"), false);
-		assertEquals(listenerCall.contains("partBroughtToTop"), true);
-		// do not close the editor this time
-
-		fActivePage.activate(extra);
-
-		/*
-		 * javadoc: If this page already has an editor open on the target object
-		 * that editor is brought to front
-		 */
-		// Activate something in a different stack, or the editor will end up
-		// activated regardless of
-		// the activate flag.
-		fActivePage.showView(IPageLayout.ID_PROBLEM_VIEW, null,
-				IWorkbenchPage.VIEW_ACTIVATE);
-		// open the editor second time without activation
-		listenerCall.clear();
-		assertEquals(IDE.openEditor(fActivePage, marker, false), editor);
-		assertEquals(listenerCall.contains("partBroughtToTop"), true);
-		assertEquals(listenerCall.contains("partActivated"), false);
-
-		fActivePage.activate(extra);
-
-		/*
-		 * javdoc: If activate == true the editor will be activated
-		 */
-		// open the editor second time with activation
-		listenerCall.clear();
-		assertEquals(IDE.openEditor(fActivePage, marker, true), editor);
-		assertEquals(editorCall.contains("gotoMarker"), true);
-		assertEquals(listenerCall.contains("partBroughtToTop"), true);
-		assertEquals(listenerCall.contains("partActivated"), true);
-	}
-
-	public void testFindView() throws Throwable {
-		String id = MockViewPart.ID3;
-		// id of valid, but not open view
-		assertNull(fActivePage.findView(id));
-
-		IViewPart view = fActivePage.showView(id);
-		assertEquals(fActivePage.findView(id), view);
-
-		// close view
-		fActivePage.hideView(view);
-		assertNull(fActivePage.findView(id));
-	}
-
-	public void testGetViews() throws Throwable {
-		int totalBefore = fActivePage.getViews().length;
-
-		IViewPart view = fActivePage.showView(MockViewPart.ID2);
-		assertEquals(ArrayUtil.contains(fActivePage.getViews(), view), true);
-		assertEquals(fActivePage.getViews().length, totalBefore + 1);
-
-		fActivePage.hideView(view);
-		assertEquals(ArrayUtil.contains(fActivePage.getViews(), view), false);
-		assertEquals(fActivePage.getViews().length, totalBefore);
-	}
-
-	public void testHideView() throws Throwable {
-		IViewPart view = fActivePage.showView(MockViewPart.ID3);
-
-		fActivePage.hideView(view);
-		CallHistory callTrace = ((MockViewPart) view).getCallHistory();
-		assertTrue(callTrace.contains("dispose"));
-	}
-
-	public void testClose() throws Throwable {
-		IWorkbenchPage page = openTestPage(fWin);
-
-		proj = FileUtil.createProject("testOpenEditor");
-		final IFile file = FileUtil.createFile("aaa.mock1", proj);
-		IEditorPart editor = IDE.openEditor(page, file, true);
-		CallHistory callTrace = ((MockEditorPart) editor).getCallHistory();
-		callTrace.clear();
-
-		/*
-		 * javadoc: If the page has open editors with unsaved content and save
-		 * is true, the user will be given the opportunity to save them
-		 */
-		assertEquals(page.close(), true);
-		assertEquals(callTrace
-				.verifyOrder(new String[] { "isDirty", "dispose" }), true);
-		assertEquals(fWin.getActivePage(), fActivePage);
-	}
-
-	public void testCloseEditor() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		final IFile file = FileUtil.createFile("test.mock1", proj);
-		IEditorPart editor;
-		CallHistory callTrace;
-		MockEditorPart mock;
-
-		/*
-		 * javadoc: Parameters: save - true to save the editor contents if
-		 * required (recommended)
-		 */
-		// create a clean editor that needs to be saved on closing
-		editor = IDE.openEditor(fActivePage, file, true);
-		mock = (MockEditorPart) editor;
-		mock.setSaveNeeded(true);
-		callTrace = mock.getCallHistory();
-		callTrace.clear();
-		// close the editor with save confirmation
-		assertEquals(fActivePage.closeEditor(editor, true), true);
-		assertEquals(callTrace
-				.verifyOrder(new String[] { "isDirty", "dispose" }), true);
-
-		/*
-		 * javadoc: If the editor has unsaved content and save is true, the user
-		 * will be given the opportunity to save it.
-		 */
-		// can't be tested
-		/*
-		 * javadoc: Parameters: save - false to discard any unsaved changes
-		 */
-		// create a dirty editor
-		editor = IDE.openEditor(fActivePage, file, true);
-		mock = (MockEditorPart) editor;
-		mock.setDirty(true);
-		mock.setSaveNeeded(true);
-		callTrace = mock.getCallHistory();
-		callTrace.clear();
-		// close the editor and discard changes
-		assertEquals(fActivePage.closeEditor(editor, false), true);
-		assertEquals(callTrace.contains("isSaveOnCloseNeeded"), false);
-		/*
-		 * It is possible that some action may query the isDirty value of the
-		 * editor to update its enabled state. There is nothing wrong in doing
-		 * that, so do not test for no isDirty call here.
-		 * 
-		 * assertEquals(callTrace.contains( "isDirty"), false);
-		 */
-		assertEquals(callTrace.contains("doSave"), false);
-		assertEquals(callTrace.contains("dispose"), true);
-	}
-
-	public void testCloseAllEditors() throws Throwable {
-		int total = 5;
-		final IFile[] files = new IFile[total];
-		IEditorPart[] editors = new IEditorPart[total];
-		CallHistory[] callTraces = new CallHistory[total];
-		MockEditorPart[] mocks = new MockEditorPart[total];
-
-		proj = FileUtil.createProject("testOpenEditor");
-		for (int i = 0; i < total; i++)
-			files[i] = FileUtil.createFile(i + ".mock2", proj);
-
-		/*
-		 * javadoc: If the page has open editors with unsaved content and save
-		 * is true, the user will be given the opportunity to save them.
-		 */
-		// close all clean editors with confirmation
-		for (int i = 0; i < total; i++) {
-			editors[i] = IDE.openEditor(fActivePage, files[i], true);
-			callTraces[i] = ((MockEditorPart) editors[i]).getCallHistory();
-		}
-		assertEquals(fActivePage.closeAllEditors(true), true);
-		for (int i = 0; i < total; i++) {
-			assertEquals(callTraces[i].contains("isDirty"), true);
-			assertEquals(callTraces[i].contains("doSave"), false);
-			callTraces[i].clear();
-		}
-
-		// close all dirty editors with confirmation
-		// can't be tested
-
-		// close all dirty editors discarding them
-		for (int i = 0; i < total; i++) {
-			editors[i] = IDE.openEditor(fActivePage, files[i], true);
-			mocks[i] = (MockEditorPart) editors[i];
-			mocks[i].setDirty(true);
-			callTraces[i] = mocks[i].getCallHistory();
-		}
-		assertEquals(fActivePage.closeAllEditors(false), true);
-		for (int i = 0; i < total; i++) {
-			assertEquals(callTraces[i].contains("doSave"), false);
-		}
-	}
-
-	public void testSaveEditor() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		final IFile file = FileUtil.createFile("test.mock1", proj);
-		IEditorPart editor;
-		CallHistory callTrace;
-		MockEditorPart mock;
-
-		// create a clean editor
-		editor = IDE.openEditor(fActivePage, file, true);
-		mock = (MockEditorPart) editor;
-		callTrace = mock.getCallHistory();
-		callTrace.clear();
-
-		/*
-		 * javadoc: Saves the contents of the given editor if dirty. If not,
-		 * this method returns without effect
-		 */
-		// save the clean editor with confirmation
-		assertEquals(fActivePage.saveEditor(editor, true), true);
-		assertEquals(callTrace.contains("isDirty"), true);
-		assertEquals(callTrace.contains("doSave"), false);
-
-		/*
-		 * javadoc: If confirm is true the user is prompted to confirm the
-		 * command.
-		 */
-		// can't be tested
-		/*
-		 * javadoc: Otherwise, the save happens without prompt.
-		 */
-		// save the clean editor without confirmation
-		assertEquals(fActivePage.saveEditor(editor, false), true);
-		assertEquals(callTrace.contains("isDirty"), true);
-		assertEquals(callTrace.contains("doSave"), false);
-
-		// save the dirty editor without confirmation
-		mock.setDirty(true);
-		callTrace.clear();
-		assertEquals(fActivePage.saveEditor(editor, false), true);
-		assertEquals(callTrace
-				.verifyOrder(new String[] { "isDirty", "doSave" }), true);
-	}
-
-	public void testSaveAllEditors() throws Throwable {
-		int total = 3;
-
-		final IFile[] files = new IFile[total];
-		IEditorPart[] editors = new IEditorPart[total];
-		CallHistory[] callTraces = new CallHistory[total];
-		MockEditorPart[] mocks = new MockEditorPart[total];
-
-		proj = FileUtil.createProject("testOpenEditor");
-		for (int i = 0; i < total; i++) {
-			files[i] = FileUtil.createFile(i + ".mock2", proj);
-			editors[i] = IDE.openEditor(fActivePage, files[i], true);
-			mocks[i] = (MockEditorPart) editors[i];
-			callTraces[i] = mocks[i].getCallHistory();
-		}
-
-		/*
-		 * javadoc: If there are no dirty editors this method returns without
-		 * effect. javadoc: If confirm is true the user is prompted to confirm
-		 * the command
-		 */
-		// save all clean editors with confirmation
-		assertEquals(fActivePage.saveAllEditors(true), true);
-		for (int i = 0; i < total; i++) {
-			assertEquals(callTraces[i].contains("isDirty"), true);
-			assertEquals(callTraces[i].contains("doSave"), false);
-			callTraces[i].clear();
-		}
-
-		// save all dirty editors with confirmation can't be tested
-
-		/*
-		 * javadoc: Parameters: confirm - false to save unsaved changes without
-		 * asking
-		 */
-		// save all clean editors without confirmation
-		assertEquals(fActivePage.saveAllEditors(false), true);
-		for (int i = 0; i < total; i++) {
-			assertEquals(callTraces[i].contains("isDirty"), true);
-			assertEquals(callTraces[i].contains("doSave"), false);
-			callTraces[i].clear();
-		}
-
-		// save all dirty editors without confirmation
-		for (int i = 0; i < total; i++)
-			mocks[i].setDirty(true);
-		assertEquals(fActivePage.saveAllEditors(false), true);
-		for (int i = 0; i < total; i++)
-			assertEquals(callTraces[i].verifyOrder(new String[] { "isDirty",
-					"doSave" }), true);
-	}
-
-	public void testGetEditors() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		int totalBefore = fActivePage.getEditors().length;
-		int num = 3;
-		IEditorPart[] editors = new IEditorPart[num];
-
-		for (int i = 0; i < num; i++) {
-			editors[i] = IDE.openEditor(fActivePage, FileUtil.createFile(i
-					+ ".mock2", proj), true);
-			assertEquals(ArrayUtil.contains(fActivePage.getEditors(),
-					editors[i]), true);
-		}
-		assertEquals(fActivePage.getEditors().length, totalBefore + num);
-
-		fActivePage.closeEditor(editors[0], false);
-		assertEquals(ArrayUtil.contains(fActivePage.getEditors(), editors[0]),
-				false);
-		assertEquals(fActivePage.getEditors().length, totalBefore + num - 1);
-
-		fActivePage.closeAllEditors(false);
-		assertEquals(fActivePage.getEditors().length, 0);
-	}
-
-	public void testShowActionSet() {
-		String id = MockActionDelegate.ACTION_SET_ID;
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-
-		int totalBefore = page.getActionSets().length;
-		fActivePage.showActionSet(id);
-
-		IActionSetDescriptor[] sets = ((WorkbenchPage) fActivePage)
-				.getActionSets();
-		boolean found = false;
-		for (int i = 0; i < sets.length; i++)
-			if (id.equals(sets[i].getId()))
-				found = true;
-		assertEquals(found, true);
-
-		// check that the method does not add an invalid action set to itself
-		id = IConstants.FakeID;
-		fActivePage.showActionSet(id);
-
-		sets = ((WorkbenchPage) fActivePage).getActionSets();
-		found = false;
-		for (int i = 0; i < sets.length; i++)
-			if (id.equals(sets[i].getId()))
-				found = true;
-		assertEquals(found, false);
-		assertEquals(page.getActionSets().length, totalBefore + 1);
-	}
-
-	public void testHideActionSet() {
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-		int totalBefore = page.getActionSets().length;
-
-		String id = MockWorkbenchWindowActionDelegate.SET_ID;
-		fActivePage.showActionSet(id);
-		assertEquals(page.getActionSets().length, totalBefore + 1);
-
-		fActivePage.hideActionSet(id);
-		assertEquals(page.getActionSets().length, totalBefore);
-
-		IActionSetDescriptor[] sets = page.getActionSets();
-		boolean found = false;
-		for (int i = 0; i < sets.length; i++)
-			if (id.equals(sets[i].getId()))
-				found = true;
-		assertEquals(found, false);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorActionBarContributorTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorActionBarContributorTest.java
deleted file mode 100644
index e7f771f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorActionBarContributorTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.harness.util.CallHistory;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * This is a test for IEditorPart.  Since IEditorPart is an
- * interface this test verifies the IEditorPart lifecycle rather
- * than the implementation.
- */
-public class IEditorActionBarContributorTest extends UITestCase {
-
-    protected IWorkbenchWindow fWindow;
-
-    protected IWorkbenchPage fPage;
-
-    private String EDITOR_ID = "org.eclipse.ui.tests.api.IEditorActionBarContributorTest";
-
-    /**
-     * Constructor for IEditorPartTest
-     */
-    public IEditorActionBarContributorTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWindow = openTestWindow();
-        fPage = fWindow.getActivePage();
-    }
-
-    public void testInit() throws Throwable {
-        // From javadoc: "Initializes this contributor, which is expected to 
-        // add contributions as required to the given action bars and global 
-        // action handlers."
-
-        // Open a part.
-        MockEditorPart part = openEditor(fPage, "1");
-
-        // Get contributor and verify call history.
-        MockEditorActionBarContributor contributor = (MockEditorActionBarContributor) part
-                .getEditorSite().getActionBarContributor();
-        CallHistory history = contributor.getCallHistory();
-        assertTrue(history
-                .verifyOrder(new String[] { "init", "setActiveEditor" }));
-        assertEquals(part, contributor.getActiveEditor());
-
-        // Close the part.
-        fPage.closeAllEditors(false);
-    }
-
-    public void testSetActiveEditor() throws Throwable {
-        // From javadoc: "Sets the active editor for the contributor."
-
-        // Open an editor.
-        MockEditorPart part = openEditor(fPage, "X");
-
-        // Get contributor and verify call history.
-        MockEditorActionBarContributor contributor = (MockEditorActionBarContributor) part
-                .getEditorSite().getActionBarContributor();
-        CallHistory history = contributor.getCallHistory();
-        assertTrue(history
-                .verifyOrder(new String[] { "init", "setActiveEditor" }));
-        assertEquals(part, contributor.getActiveEditor());
-
-        // Open a few more and verify setActiveEditor.
-        int editorCount = 5;
-        MockEditorPart[] parts = new MockEditorPart[editorCount];
-        for (int nX = 0; nX < editorCount; nX++) {
-            history.clear();
-            parts[nX] = openEditor(fPage, Integer.toString(nX));
-            assertTrue(history.verifyOrder(new String[] { "setActiveEditor" }));
-            assertEquals(parts[nX], contributor.getActiveEditor());
-        }
-
-        // Activate the parts and verify setActiveEditor.
-        for (int nX = 0; nX < editorCount; nX++) {
-            history.clear();
-            fPage.activate(parts[nX]);
-            assertTrue(history.verifyOrder(new String[] { "setActiveEditor" }));
-            assertEquals(parts[nX], contributor.getActiveEditor());
-        }
-
-        // Close the parts.
-        fPage.closeAllEditors(false);
-    }
-
-    /**
-     * @see IWorkbenchPartTest#openPart(IWorkbenchPage)
-     */
-    protected MockEditorPart openEditor(IWorkbenchPage page, String suffix)
-            throws Throwable {
-        IProject proj = FileUtil
-                .createProject("IEditorActionBarContributorTest");
-        IFile file = FileUtil.createFile("test" + suffix + ".txt", proj);
-        return (MockEditorPart) page.openEditor(new FileEditorInput(file),
-                EDITOR_ID);
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorActionDelegateTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorActionDelegateTest.java
deleted file mode 100644
index 925ec76..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorActionDelegateTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.harness.util.ActionUtil;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-
-/**
- * Tests the lifecycle for an editor action delegate.
- */
-public class IEditorActionDelegateTest extends IActionDelegateTest {
-
-    public static String EDITOR_ID = "org.eclipse.ui.tests.api.IEditorActionDelegateTest";
-
-    private MockEditorPart editor;
-
-    /**
-     * Constructor for IWorkbenchWindowActionDelegateTest
-     */
-    public IEditorActionDelegateTest(String testName) {
-        super(testName);
-    }
-
-    public void testSetActiveEditor() throws Throwable {
-        // When an action delegate is run the
-        // setActiveEditor, selectionChanged, and run methods should
-        // be called, in that order.
-
-        // Run the action.
-        testRun();
-
-        // Verify lifecycle.
-        MockActionDelegate delegate = getDelegate();
-        assertNotNull(delegate);
-        assertTrue(delegate.callHistory.verifyOrder(new String[] {
-                "setActiveEditor", "selectionChanged", "run" }));
-    }
-
-    /**
-     * @see IActionDelegateTest#createActionWidget()
-     */
-    protected Object createActionWidget() throws Throwable {
-        editor = openEditor(fPage, "X");
-        return editor;
-    }
-
-    /**
-     * @see IActionDelegateTest#runAction()
-     */
-    protected void runAction(Object widget) throws Throwable {
-        MockEditorPart editor = (MockEditorPart) widget;
-        MockEditorActionBarContributor contributor = (MockEditorActionBarContributor) editor
-                .getEditorSite().getActionBarContributor();
-        IMenuManager mgr = contributor.getActionBars().getMenuManager();
-        ActionUtil.runActionWithLabel(this, mgr, "Mock Action");
-    }
-
-    /**
-     * @see IActionDelegateTest#fireSelection()
-     */
-    protected void fireSelection(Object widget) throws Throwable {
-        MockEditorPart editor = (MockEditorPart) widget;
-        editor.fireSelection();
-    }
-
-    protected MockEditorPart openEditor(IWorkbenchPage page, String suffix)
-            throws Throwable {
-        IProject proj = FileUtil.createProject("IEditorActionDelegateTest");
-        IFile file = FileUtil.createFile("test" + suffix + ".txt", proj);
-        return (MockEditorPart) page.openEditor(new FileEditorInput(file),
-                EDITOR_ID);
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorDescriptorTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorDescriptorTest.java
deleted file mode 100644
index 51cac67..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorDescriptorTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IFileEditorMapping;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.harness.util.ArrayUtil;
-
-public class IEditorDescriptorTest extends TestCase {
-    IEditorDescriptor[] fEditors;
-
-    public IEditorDescriptorTest(String testName) {
-        super(testName);
-    }
-
-    public void setUp() {
-        IFileEditorMapping mapping = (IFileEditorMapping) ArrayUtil
-                .pickRandom(PlatformUI.getWorkbench().getEditorRegistry()
-                        .getFileEditorMappings());
-        fEditors = mapping.getEditors();
-    }
-
-    public void testGetId() throws Throwable {
-        for (int i = 0; i < fEditors.length; i++)
-            assertNotNull(fEditors[i].getId());
-    }
-
-    public void testGetImageDescriptor() throws Throwable {
-        for (int i = 0; i < fEditors.length; i++)
-            assertNotNull(fEditors[i].getImageDescriptor());
-    }
-
-    public void testGetLabel() throws Throwable {
-        for (int i = 0; i < fEditors.length; i++)
-            assertNotNull(fEditors[i].getLabel());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorLauncherTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorLauncherTest.java
deleted file mode 100644
index 3f126a6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorLauncherTest.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-public class IEditorLauncherTest {
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorMatchingStrategyTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorMatchingStrategyTest.java
deleted file mode 100644
index a9226f1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorMatchingStrategyTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests the <code>IEditorMatchingStrategyTest</code> API and behaviour.
- * 
- * @since 3.1
- */
-public class IEditorMatchingStrategyTest extends UITestCase {
-
-    private static final String MATCHING_EDITOR_ID = "org.eclipse.ui.tests.api.MockMatchingEditorPart1";
-
-    public IEditorMatchingStrategyTest(String testName) {
-        super(testName);
-    }
-
-    public void testOpenMatchingEditor() throws Exception {
-        IProject proj = FileUtil.createProject("IEditorMatchingStrategyTest");
-        IFile file1 = FileUtil.createFile("plugin.xml", proj);
-        IFile file2 = FileUtil.createFile("MANIFEST.MF", proj);
-        IFile file3 = FileUtil.createFile("build.properties", proj);
-        IFile file4 = FileUtil.createFile("something.txt", proj);
-        
-        IWorkbenchPage page = openTestWindow().getActivePage();
-        IEditorPart editor1 = page.openEditor(new FileEditorInput(file1), MATCHING_EDITOR_ID);
-        IEditorPart editor1b = page.openEditor(new FileEditorInput(file1), MATCHING_EDITOR_ID);
-        IEditorPart editor2 = page.openEditor(new FileEditorInput(file2), MATCHING_EDITOR_ID);
-        IEditorPart editor3 = page.openEditor(new FileEditorInput(file3), MATCHING_EDITOR_ID);
-        IEditorPart editor4 = page.openEditor(new FileEditorInput(file4), MATCHING_EDITOR_ID);
-        assertSame(editor1, editor1b);
-        assertSame(editor1, editor2);
-        assertSame(editor1, editor3);
-        assertNotSame(editor1, editor4);
-    }
-
-    public void testFindMatchingEditor() throws Exception {
-        IProject proj = FileUtil.createProject("IEditorMatchingStrategyTest");
-        IFile file1 = FileUtil.createFile("plugin.xml", proj);
-        IFile file2 = FileUtil.createFile("MANIFEST.MF", proj);
-        IFile file3 = FileUtil.createFile("build.properties", proj);
-        IFile file4 = FileUtil.createFile("something.txt", proj);
-        
-        IWorkbenchPage page = openTestWindow().getActivePage();
-        IEditorPart editor = page.openEditor(new FileEditorInput(file1), MATCHING_EDITOR_ID);
-        assertEquals(editor, page.findEditor(new FileEditorInput(file1)));
-        assertEquals(editor, page.findEditor(new FileEditorInput(file2)));
-        assertEquals(editor, page.findEditor(new FileEditorInput(file3)));
-        assertEquals(null, page.findEditor(new FileEditorInput(file4)));
-    }
-    
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorPartTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorPartTest.java
deleted file mode 100644
index 00eb956..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorPartTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.harness.util.CallHistory;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-
-/**
- * This is a test for IEditorPart. Since IEditorPart is an interface this test
- * verifies the IEditorPart lifecycle rather than the implementation.
- */
-public class IEditorPartTest extends IWorkbenchPartTest {
-
-	/**
-	 * Constructor for IEditorPartTest
-	 */
-	public IEditorPartTest(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * @see IWorkbenchPartTest#openPart(IWorkbenchPage)
-	 */
-	protected MockPart openPart(IWorkbenchPage page) throws Throwable {
-		IProject proj = FileUtil.createProject("IEditorPartTest");
-		IFile file = FileUtil.createFile("IEditorPartTest.txt", proj);
-		return (MockWorkbenchPart) page.openEditor(new FileEditorInput(file),
-				MockEditorPart.ID1);
-	}
-
-	/**
-	 * @see IWorkbenchPartTest#closePart(IWorkbenchPage, MockWorkbenchPart)
-	 */
-	protected void closePart(IWorkbenchPage page, MockPart part)
-			throws Throwable {
-		page.closeEditor((IEditorPart) part, true);
-	}
-
-	/**
-	 * Tests that the editor is closed without saving if isSaveOnCloseNeeded()
-	 * returns false.
-	 * 
-	 * @see ISaveablePart#isSaveOnCloseNeeded()
-	 */
-	public void testOpenAndCloseSaveNotNeeded() throws Throwable {
-		// Open a part.
-		MockEditorPart part = (MockEditorPart) openPart(fPage);
-		part.setDirty(true);
-		part.setSaveNeeded(false);
-		closePart(fPage, part);
-
-		CallHistory history = part.getCallHistory();
-		assertTrue(history.verifyOrder(new String[] { "setInitializationData",
-				"init", "createPartControl", "setFocus", "isSaveOnCloseNeeded",
-				"widgetDisposed", "dispose" }));
-		assertFalse(history.contains("doSave"));
-	}
-
-	public void testOpenAndCloseWithNoMemento() throws Throwable {
-		IProject proj = FileUtil.createProject("IEditorPartTest");
-		IFile file = FileUtil.createFile("IEditorPartTest.txt", proj);
-		MockEditorWithState editor = (MockEditorWithState) fPage.openEditor(
-				new FileEditorInput(file), MockEditorWithState.ID);
-		closePart(fPage, editor);
-		
-		CallHistory history = editor.getCallHistory();
-		assertFalse(history.contains("saveState"));
-		assertFalse(history.contains("restoreState"));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorRegistryTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorRegistryTest.java
deleted file mode 100644
index 8d557b6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorRegistryTest.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IFileEditorMapping;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.misc.ExternalProgramImageDescriptor;
-import org.eclipse.ui.internal.registry.EditorRegistry;
-import org.eclipse.ui.internal.registry.FileEditorMapping;
-import org.eclipse.ui.tests.TestPlugin;
-import org.eclipse.ui.tests.harness.util.ArrayUtil;
-import org.eclipse.ui.tests.harness.util.CallHistory;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-
-public class IEditorRegistryTest extends TestCase {
-	private IEditorRegistry fReg;
-
-	private IProject proj;
-
-	public IEditorRegistryTest(String testName) {
-		super(testName);
-	}
-
-	public void setUp() {
-		fReg = PlatformUI.getWorkbench().getEditorRegistry();
-	}
-
-	public void tearDown() {
-		if (proj != null) {
-			try {
-				FileUtil.deleteProject(proj);
-			} catch (CoreException e) {
-				TestPlugin.getDefault().getLog().log(e.getStatus());
-				fail();
-			}
-		}
-	}
-
-	public void testGetFileEditorMappings() {
-		assertTrue(ArrayUtil.checkNotNull(fReg.getFileEditorMappings()));
-	}
-
-	/**
-	 * tests both of the following: IEditorDescriptor[] getEditors(IFile file)
-	 * IEditorDescriptor[] getEditors(String filename)
-	 */
-	public void testGetEditors() throws Throwable {
-		IEditorDescriptor[] editors, editors2;
-		String[][] maps = { { "a.mock1", MockEditorPart.ID1 },
-				{ "b.mock2", MockEditorPart.ID2 } };
-
-		proj = FileUtil.createProject("testProject");
-
-		for (int i = 0; i < maps.length; i++) {
-			editors = fReg.getEditors(maps[i][0]);
-			assertEquals(editors.length, 1);
-			assertEquals(editors[0].getId(), maps[i][1]);
-			editors2 = fReg.getEditors(FileUtil.createFile(maps[i][0], proj)
-					.getName());
-			assertEquals(ArrayUtil.equals(editors, editors2), true);
-		}
-
-		// there is no matching editor
-		String fileName = IConstants.UnknownFileName[0];
-		editors = fReg.getEditors(fileName);
-		assertEquals(editors.length, 0);
-		editors = fReg
-				.getEditors(FileUtil.createFile(fileName, proj).getName());
-		assertEquals(editors.length, 0);
-	}
-
-	public void testFindEditor() {
-		String id = MockEditorPart.ID1;
-		IEditorDescriptor editor = fReg.findEditor(id);
-		assertEquals(editor.getId(), id);
-
-		// editor is not found
-		id = IConstants.FakeID;
-		editor = fReg.findEditor(id);
-		assertNull(editor);
-	}
-
-	/**
-	 * getDefaultEditor()
-	 */
-	public void testGetDefaultEditor() {
-		assertNotNull(fReg.getDefaultEditor());
-	}
-
-	/**
-	 * getDefaultEditor(String fileName)
-	 */
-	public void testGetDefaultEditor2() {
-		IEditorDescriptor editor = fReg.getDefaultEditor("a.mock1");
-		assertEquals(editor.getId(), MockEditorPart.ID1);
-
-		// same extension with different name
-		IEditorDescriptor editor2 = fReg.getDefaultEditor("b.mock1");
-		assertEquals(editor, editor2);
-
-		// editor not found
-		assertNull(fReg.getDefaultEditor(IConstants.UnknownFileName[0]));
-	}
-
-	/**
-	 * getDefaultEditor(IFile file)
-	 */
-	public void testGetDefaultEditor3() throws Throwable {
-		proj = FileUtil.createProject("testProject");
-
-		IFile file = FileUtil.createFile("Whats up.bro", proj);
-		String id = MockEditorPart.ID1;
-		IDE.setDefaultEditor(file, id);
-		IEditorDescriptor editor = IDE.getDefaultEditor(file);
-		assertEquals(editor.getId(), id);
-
-		// attach an IFile object with a registered extension to a different
-		// editor
-		file = FileUtil.createFile("ambush.mock1", proj);
-		id = MockEditorPart.ID2;
-		IDE.setDefaultEditor(file, id);
-		editor = IDE.getDefaultEditor(file);
-		assertEquals(editor.getId(), id);
-
-		// a non-registered IFile object with a registered extension
-		String name = "what.mock2";
-		file = FileUtil.createFile(name, proj);
-		editor = IDE.getDefaultEditor(file);
-		assertEquals(editor, fReg.getDefaultEditor(name));
-
-		// a non-registered IFile object with an unregistered extension
-		name = IConstants.UnknownFileName[0];
-		file = FileUtil.createFile(name, proj);
-		assertNull(IDE.getDefaultEditor(file));
-	}
-
-	public void testSetDefaultEditor() throws Throwable {
-		proj = FileUtil.createProject("testProject");
-		IFile file = FileUtil.createFile("good.file", proj);
-
-		String id = MockEditorPart.ID1;
-		IDE.setDefaultEditor(file, id);
-		IEditorDescriptor editor = IDE.getDefaultEditor(file);
-		assertEquals(editor.getId(), id);
-
-		// change the default editor
-		id = MockEditorPart.ID2;
-		IDE.setDefaultEditor(file, id);
-		editor = IDE.getDefaultEditor(file);
-		assertEquals(editor.getId(), id);
-
-		// register the default editor with an invalid editor id
-		IDE.setDefaultEditor(file, IConstants.FakeID);
-		assertNull(IDE.getDefaultEditor(file));
-	}
-
-	/**
-	 * tests both of the following: getImageDescriptor(IFile file)
-	 * getImageDescriptor(String filename)
-	 */
-	public void testGetImageDescriptor() throws Throwable {
-		proj = FileUtil.createProject("testProject");
-
-		ImageDescriptor image1, image2;
-		String fileName;
-
-		fileName = "a.mock1";
-		IFile file = FileUtil.createFile(fileName, proj);
-		image1 = fReg.getImageDescriptor(fileName);
-		image2 = fReg.getDefaultEditor(fileName).getImageDescriptor();
-		assertEquals(image1, image2);
-		// for getImageDescriptor(IFile file)
-		assertEquals(image1, fReg.getImageDescriptor(file.getName()));
-
-		// same extension, different file name
-		fileName = "b.mock1";
-		file = FileUtil.createFile(fileName, proj);
-		assertEquals(image1, fReg.getImageDescriptor(fileName));
-		assertEquals(image1, fReg.getImageDescriptor(file.getName()));
-
-		// default image
-		fileName = "a.nullAndVoid";
-		file = FileUtil.createFile(fileName, proj);
-		image1 = fReg.getImageDescriptor(fileName);
-		image2 = fReg.getImageDescriptor("b.this_is_not_good");
-		assertNotNull(image1);
-		if (image1 instanceof ExternalProgramImageDescriptor || image2 instanceof ExternalProgramImageDescriptor) {
-			return;//If they are external we can't compare them
-		}
-		assertEquals(image1, image2);
-		assertEquals(image2, fReg.getImageDescriptor(file.getName()));
-		
-	}
-
-	public void testAddPropertyListener() throws Throwable {
-		final String METHOD = "propertyChanged";
-
-		// take out mappings from the registry and put them back right away
-		// so that the event gets triggered without making change to the
-		// registry
-		IFileEditorMapping[] src = fReg.getFileEditorMappings();
-		FileEditorMapping[] maps = new FileEditorMapping[src.length];
-		System.arraycopy(src, 0, maps, 0, src.length);
-
-		MockPropertyListener listener = new MockPropertyListener(fReg,
-				IEditorRegistry.PROP_CONTENTS);
-		fReg.addPropertyListener(listener);
-		CallHistory callTrace = listener.getCallHistory();
-
-		// multiple listener
-		MockPropertyListener listener2 = new MockPropertyListener(fReg,
-				IEditorRegistry.PROP_CONTENTS);
-		fReg.addPropertyListener(listener2);
-		CallHistory callTrace2 = listener2.getCallHistory();
-
-		// fire!!
-		callTrace.clear();
-		callTrace2.clear();
-		((EditorRegistry) fReg).setFileEditorMappings(maps);
-		assertEquals(callTrace.contains(METHOD), true);
-		assertEquals(callTrace2.contains(METHOD), true);
-
-		// add the same listener second time
-		fReg.addPropertyListener(listener);
-
-		// fire!!
-		callTrace.clear();
-		((EditorRegistry) fReg).setFileEditorMappings(maps);
-		// make sure the method was called only once
-		assertEquals(callTrace.verifyOrder(new String[] { METHOD }), true);
-
-		fReg.removePropertyListener(listener);
-		fReg.removePropertyListener(listener2);
-	}
-
-	public void testRemovePropertyListener() {
-		IFileEditorMapping[] src = fReg.getFileEditorMappings();
-		FileEditorMapping[] maps = new FileEditorMapping[src.length];
-		System.arraycopy(src, 0, maps, 0, src.length);
-
-		MockPropertyListener listener = new MockPropertyListener(fReg,
-				IEditorRegistry.PROP_CONTENTS);
-		fReg.addPropertyListener(listener);
-		// remove the listener immediately after adding it
-		fReg.removePropertyListener(listener);
-		CallHistory callTrace = listener.getCallHistory();
-
-		// fire!!
-		callTrace.clear();
-		((EditorRegistry) fReg).setFileEditorMappings(maps);
-		assertEquals(callTrace.contains("propertyChanged"), false);
-
-		// removing the listener that is not registered yet should have no
-		// effect
-		try {
-			fReg.removePropertyListener(listener);
-		} catch (Throwable e) {
-			fail();
-		}
-	}
-
-	/**
-	 * Assert that the content-type based editor is chosen.
-	 */
-	public void testEditorContentTypeByFilenameWithContentType() {
-		IContentType contentType = Platform.getContentTypeManager()
-				.getContentType("org.eclipse.ui.tests.content-type1");
-		IEditorDescriptor descriptor = fReg.getDefaultEditor(
-				"content-type1.blah", contentType);
-		assertNotNull(descriptor);
-		assertEquals("org.eclipse.ui.tests.contentType1Editor-fallback",
-				descriptor.getId());
-	}
-
-	/**
-	 * Assert that the content type based editor is chosen.
-	 */
-	public void testEditorContentTypeByExtWithContentType() {
-		IContentType contentType = Platform.getContentTypeManager()
-				.getContentType("org.eclipse.ui.tests.content-type1");
-		IEditorDescriptor descriptor = fReg.getDefaultEditor(
-				"blah.content-type1", contentType);
-		assertNotNull(descriptor);
-		assertEquals("org.eclipse.ui.tests.contentType1Editor-fallback",
-				descriptor.getId());
-	}
-
-	/**
-	 * Assert that in the absence of content type, fall back to the traditional
-	 * filename binding.
-	 */
-	public void testEditorContentTypeByExtWithoutContentType1() {
-		IEditorDescriptor descriptor = fReg
-				.getDefaultEditor("blah.content-type1");
-		assertNotNull(descriptor);
-		assertEquals("org.eclipse.ui.tests.contentType1Editor-fallback",
-				descriptor.getId());
-	}
-
-	/**
-	 * Assert that in the absence of content type, fall back to the traditional
-	 * filename binding.
-	 */
-	public void testEditorContentTypeByFilenameWithoutContentType1() {
-		IEditorDescriptor descriptor = fReg
-				.getDefaultEditor("content-type1.blah");
-		assertNotNull(descriptor);
-		assertEquals("org.eclipse.ui.tests.contentType1Editor-fallback",
-				descriptor.getId());
-	}
-
-	/**
-	 * Assert that in the absence of content type, choose the content type
-	 * editor based on content type guess.
-	 */
-	public void testEditorContentTypeByFilenameWithoutContentType2() {
-		IEditorDescriptor descriptor = fReg
-				.getDefaultEditor("content-type2.blah");
-		assertNotNull(descriptor);
-		assertEquals("org.eclipse.ui.tests.contentType2Editor", descriptor
-				.getId());
-	}
-
-	/**
-	 * Assert that in the absence of content type, choose the content type
-	 * editor based on content type guess.
-	 */
-	public void testEditorContentTypeByExtWithoutContentType2() {
-		IEditorDescriptor descriptor = fReg
-				.getDefaultEditor("blah.content-type2");
-		assertNotNull(descriptor);
-		assertEquals("org.eclipse.ui.tests.contentType2Editor", descriptor
-				.getId());
-	}
-
-	public void testDefaultedContentTypeEditor() {
-		// check the default editor
-		IEditorDescriptor descriptor = fReg
-				.getDefaultEditor("foo.defaultedContentType");
-		assertNotNull(descriptor);
-		assertEquals("org.eclipse.ui.tests.defaultedContentTypeEditor",
-				descriptor.getId());
-
-		// check the entire list
-		IEditorDescriptor[] descriptors = fReg
-				.getEditors("foo.defaultedContentType");
-		assertNotNull(descriptors);
-		assertEquals(4, descriptors.length);
-
-		assertEquals("org.eclipse.ui.tests.defaultedContentTypeEditor",
-				descriptors[0].getId());
-		assertEquals("org.eclipse.ui.tests.nondefaultedContentTypeEditor1",
-				descriptors[1].getId());
-		assertEquals("org.eclipse.ui.tests.nondefaultedContentTypeEditor2",
-				descriptors[2].getId());
-		assertEquals("org.eclipse.ui.tests.nondefaultedContentTypeEditor3",
-				descriptors[3].getId());
-	}
-
-	/**
-	 * Assert that IEditorRegistry.getEditors() does not return null children
-	 * when the default editor has been set to null.
-	 */
-	public void testNoDefaultEditors() {
-		IEditorDescriptor desc = fReg.getDefaultEditor("bogusfile.txt");
-
-		try {
-			fReg.setDefaultEditor("*.txt", null);
-			IEditorDescriptor[] descriptors = fReg.getEditors("bogusfile.txt");
-			for (int i = 0; i < descriptors.length; i++) {
-				assertNotNull(descriptors[i]);
-			}
-		} finally {
-			if (desc != null)
-				fReg.setDefaultEditor("*.txt", desc.getId());
-		}
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorSiteTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorSiteTest.java
deleted file mode 100644
index 8dd0162..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IEditorSiteTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-
-public class IEditorSiteTest extends IWorkbenchPartSiteTest {
-
-    /**
-     * Constructor for IEditorSiteTest
-     */
-    public IEditorSiteTest(String testName) {
-        super(testName);
-    }
-
-    /**
-     * @see IWorkbenchPartSiteTest#getTestPartName()
-     */
-    protected String getTestPartName() throws Throwable {
-        return MockEditorPart.NAME;
-    }
-
-    /**
-     * @see IWorkbenchPartSiteTest#getTestPartId()
-     */
-    protected String getTestPartId() throws Throwable {
-        return MockEditorPart.ID1;
-    }
-
-    /**
-     * @see IWorkbenchPartSiteTest#createTestPart(IWorkbenchPage)
-     */
-    protected IWorkbenchPart createTestPart(IWorkbenchPage page)
-            throws Throwable {
-        IProject proj = FileUtil.createProject("createTestPart");
-        IFile file = FileUtil.createFile("test1.mock1", proj);
-        return IDE.openEditor(page, file, true);
-    }
-
-    public void testGetActionBarContributor() throws Throwable {
-        // From Javadoc: "Returns the editor action bar contributor for 
-        // this editor.
-
-        IEditorPart editor = (IEditorPart) createTestPart(fPage);
-        IEditorSite site = editor.getEditorSite();
-        assertNull(site.getActionBarContributor());
-
-        // TBD: Flesh this out with a real contributor.
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IFileEditorMappingTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IFileEditorMappingTest.java
deleted file mode 100644
index 058714c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IFileEditorMappingTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IFileEditorMapping;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.harness.util.ArrayUtil;
-
-public class IFileEditorMappingTest extends TestCase {
-    private IFileEditorMapping[] fMappings;
-
-    public IFileEditorMappingTest(String testName) {
-        super(testName);
-    }
-
-    public void setUp() {
-        fMappings = PlatformUI.getWorkbench().getEditorRegistry()
-                .getFileEditorMappings();
-    }
-
-    public void testGetName() throws Throwable {
-        for (int i = 0; i < fMappings.length; i++)
-            assertNotNull(fMappings[i].getName());
-    }
-
-    public void testGetLabel() throws Throwable {
-        String label;
-        for (int i = 0; i < fMappings.length; i++) {
-            label = fMappings[i].getLabel();
-            assertNotNull(label);
-            assertEquals(label, fMappings[i].getName() + "."
-                    + fMappings[i].getExtension());
-        }
-    }
-
-    public void testGetExtension() throws Throwable {
-        for (int i = 0; i < fMappings.length; i++)
-            assertNotNull(fMappings[i].getExtension());
-    }
-
-    public void testGetEditors() throws Throwable {
-        IEditorDescriptor[] editors;
-
-        for (int i = 0; i < fMappings.length; i++) {
-            editors = fMappings[i].getEditors();
-            assertTrue(ArrayUtil.checkNotNull(editors) == true);
-        }
-    }
-
-    public void testGetImageDescriptor() throws Throwable {
-        for (int i = 0; i < fMappings.length; i++)
-            assertNotNull(fMappings[i].getImageDescriptor());
-    }
-
-    //how do i set the default editor?
-    public void testGetDefaultEditor() throws Throwable {
-        /*		for( int i = 0; i < fMappings.length; i ++ )
-         assertNotNull( fMappings[ i ].getDefaultEditor() );*/
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPageLayoutTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPageLayoutTest.java
deleted file mode 100644
index 1525ba5..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPageLayoutTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.tests.harness.util.EmptyPerspective;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test cases for the <code>IPageLayout</code> API.
- * 
- * @since 3.2
- */
-public class IPageLayoutTest extends UITestCase {
-
-	public IPageLayoutTest(String testName) {
-		super(testName);
-	}
-
-	public void testGetDescriptor() {
-		EmptyPerspective.setLastPerspective(null);
-		openTestWindow(EmptyPerspective.PERSP_ID);
-		assertEquals(EmptyPerspective.PERSP_ID, EmptyPerspective.getLastPerspective());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPageListenerTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPageListenerTest.java
deleted file mode 100644
index 66b6f3c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPageListenerTest.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IPageListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests the IPageListener class.
- */
-public class IPageListenerTest extends UITestCase implements IPageListener {
-    private IWorkbenchWindow fWindow;
-
-    private int eventsReceived = 0;
-
-    final private int OPEN = 0x01;
-
-    final private int CLOSE = 0x02;
-
-    final private int ACTIVATE = 0x04;
-
-    private IWorkbenchPage pageMask;
-
-    public IPageListenerTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWindow = openTestWindow();
-        fWindow.addPageListener(this);
-    }
-
-    protected void doTearDown() throws Exception {
-        fWindow.removePageListener(this);
-        super.doTearDown();
-    }
-
-    /**
-     * Tests the pageOpened method.
-     */
-    public void testPageOpened() throws Throwable {
-        /*
-         * Commented out because until test case can be updated to work
-         * with new window/page/perspective implementation
-         * 
-         // From Javadoc: "Notifies this listener that the given page has been opened."
-         
-         // Test open page.
-         eventsReceived = 0;
-         IWorkbenchPage page = fWindow.openPage(EmptyPerspective.PERSP_ID,
-         fWorkspace);
-         assertEquals(eventsReceived, OPEN|ACTIVATE);
-         
-         // Close page.
-         page.close();
-         */
-    }
-
-    /**
-     * Tests the pageClosed method.
-     */
-    public void testPageClosed() throws Throwable {
-        /*
-         * Commented out because until test case can be updated to work
-         * with new window/page/perspective implementation
-         * 
-         // From Javadoc: "Notifies this listener that the given page has been closed."
-         
-         // Open page.
-         IWorkbenchPage page = fWindow.openPage(EmptyPerspective.PERSP_ID,
-         fWorkspace);
-         
-         // Test close page.
-         eventsReceived = 0;
-         pageMask = page;
-         page.close();
-         assertEquals(eventsReceived, CLOSE);
-         */
-    }
-
-    /**
-     * Tests the pageActivated method.
-     */
-    public void testPageActivate() throws Throwable {
-        /*
-         * Commented out because until test case can be updated to work
-         * with new window/page/perspective implementation
-         * 
-         // From Javadoc: "Notifies this listener that the given page has been activated."
-         
-         // Add pages.
-         IWorkbenchPage page1 = fWindow.openPage(EmptyPerspective.PERSP_ID,
-         fWorkspace);
-         IWorkbenchPage page2 = fWindow.openPage(EmptyPerspective.PERSP_ID,
-         fWorkspace);
-         
-         // Test activation of page 1.
-         eventsReceived = 0;
-         pageMask = page1;
-         fWindow.setActivePage(page1);
-         assertEquals(eventsReceived, ACTIVATE);
-
-         // Test activation of page 2.
-         eventsReceived = 0;		
-         pageMask = page2;
-         fWindow.setActivePage(page2);
-         assertEquals(eventsReceived, ACTIVATE);
-         
-         // Cleanup.
-         page1.close();
-         page2.close();
-         */
-    }
-
-    /**
-     * @see IPageListener#pageActivated(IWorkbenchPage)
-     */
-    public void pageActivated(IWorkbenchPage page) {
-        if (pageMask == null || page == pageMask)
-            eventsReceived |= ACTIVATE;
-    }
-
-    /**
-     * @see IPageListener#pageClosed(IWorkbenchPage)
-     */
-    public void pageClosed(IWorkbenchPage page) {
-        if (pageMask == null || page == pageMask)
-            eventsReceived |= CLOSE;
-    }
-
-    /**
-     * @see IPageListener#pageOpened(IWorkbenchPage)
-     */
-    public void pageOpened(IWorkbenchPage page) {
-        if (pageMask == null || page == pageMask)
-            eventsReceived |= OPEN;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPageServiceTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPageServiceTest.java
deleted file mode 100644
index 3899ad1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPageServiceTest.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IPageListener;
-import org.eclipse.ui.IPageService;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.SlavePageService;
-import org.eclipse.ui.tests.harness.util.EmptyPerspective;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests the IPageService class.
- */
-public class IPageServiceTest extends UITestCase implements IPageListener,
-        org.eclipse.ui.IPerspectiveListener {
-    private IWorkbenchWindow fWindow;
-
-    private boolean pageEventReceived;
-
-    private boolean perspEventReceived;
-
-    public IPageServiceTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWindow = openTestWindow();
-    }
-
-    public void testLocalPageService() throws Throwable {
-		IWorkbenchPage page = fWindow.openPage(EmptyPerspective.PERSP_ID,
-				getPageInput());
-
-		MockViewPart view = (MockViewPart) page.showView(MockViewPart.ID);
-
-		IPageService slaveService = (IPageService) view.getSite().getService(
-				IPageService.class);
-
-		assertTrue(fWindow != slaveService);
-		assertTrue(slaveService instanceof SlavePageService);
-
-		perspEventReceived = false;
-		slaveService.addPerspectiveListener(this);
-		page.resetPerspective();
-
-		assertTrue(perspEventReceived);
-
-
-		page.hideView(view);
-		
-		perspEventReceived = false;
-		page.resetPerspective();
-		
-		assertFalse(perspEventReceived);
-	}
-    
-    /**
-	 * Tests the addPageListener method.
-	 */
-    public void testAddPageListener() throws Throwable {
-        /*
-         * Commented out because until test case can be updated to work
-         * with new window/page/perspective implementation
-         * 
-         // From Javadoc: "Adds the given listener for page lifecycle events.
-         // Has no effect if an identical listener is already registered."
-         
-         // Add listener.
-         fWindow.addPageListener(this);
-         
-         // Open and close page.
-         // Verify events are received.
-         pageEventReceived = false;
-         IWorkbenchPage page = fWindow.openPage(EmptyPerspective.PERSP_ID,
-         fWorkspace);
-         page.close();
-         assertTrue(pageEventReceived);
-         
-         // Remove listener.	
-         fWindow.removePageListener(this);		
-         */
-    }
-
-    /**
-     * Tests the removePageListener method.
-     */
-    public void testRemovePageListener() throws Throwable {
-        // From Javadoc: "Removes the given page listener.
-        // Has no affect if an identical listener is not registered."
-
-        // Add and remove listener.
-        fWindow.addPageListener(this);
-        fWindow.removePageListener(this);
-
-        // Open and close page.
-        // Verify no events are received.
-        pageEventReceived = false;
-        IWorkbenchPage page = fWindow.openPage(EmptyPerspective.PERSP_ID, getPageInput());
-        page.close();
-        assertTrue(!pageEventReceived);
-    }
-
-    /**
-     * Tests getActivePage.
-     */
-    public void testGetActivePage() throws Throwable {
-        /*
-         * Commented out because until test case can be updated to work
-         * with new window/page/perspective implementation
-         * 
-         // From Javadoc: "return the active page, or null if no page 
-         // is currently active"
-         
-         // Add page.
-         IWorkbenchPage page1 = fWindow.openPage(EmptyPerspective.PERSP_ID,
-         fWorkspace);
-         assertEquals(fWindow.getActivePage(), page1);
-         
-         // Add second page.
-         IWorkbenchPage page2 = fWindow.openPage(EmptyPerspective.PERSP_ID,
-         fWorkspace);
-         assertEquals(fWindow.getActivePage(), page2);
-         
-         // Set active page.
-         fWindow.setActivePage(page1);
-         assertEquals(fWindow.getActivePage(), page1);
-         fWindow.setActivePage(page2);
-         assertEquals(fWindow.getActivePage(), page2);
-         
-         // Cleanup.
-         page1.close();
-         page2.close();
-         */
-    }
-
-    /**
-     * Tests the addPerspectiveListener method.
-     */
-    public void testAddPerspectiveListener() throws Throwable {
-        /*
-         * Commented out because until test case can be updated to work
-         * with new window/page/perspective implementation
-         * 
-         // From Javadoc: "Adds the given listener for a page's perspective lifecycle events.
-         // Has no effect if an identical listener is already registered."
-         
-         // Add listener.
-         fWindow.addPerspectiveListener(this);
-         
-         // Open page and change persp feature.
-         // Verify events are received.
-         perspEventReceived = false;
-         IWorkbenchPage page = fWindow.openPage(IWorkbenchConstants.DEFAULT_LAYOUT_ID,
-         fWorkspace);
-         page.setEditorAreaVisible(false);
-         page.setEditorAreaVisible(true);
-         page.close();
-         assertTrue(perspEventReceived);
-         
-         // Remove listener.	
-         fWindow.removePerspectiveListener(this);		
-         */
-    }
-
-    /**
-     * Tests the removePerspectiveListener method.
-     */
-    public void testRemovePerspectiveListener() throws Throwable {
-        // From Javadoc: "Removes the given page's perspective listener.
-        // Has no affect if an identical listener is not registered."
-
-        // Add and remove listener.
-        fWindow.addPerspectiveListener(this);
-        fWindow.removePerspectiveListener(this);
-
-        // Open page and change persp feature.
-        // Verify no events are received.
-        perspEventReceived = false;
-        IWorkbenchPage page = fWindow.openPage(IDE.RESOURCE_PERSPECTIVE_ID, getPageInput());
-        page.setEditorAreaVisible(false);
-        page.setEditorAreaVisible(true);
-        page.close();
-        assertTrue(!perspEventReceived);
-    }
-
-    /**
-     * @see IPageListener#pageActivated(IWorkbenchPage)
-     */
-    public void pageActivated(IWorkbenchPage page) {
-        pageEventReceived = true;
-    }
-
-    /**
-     * @see IPageListener#pageClosed(IWorkbenchPage)
-     */
-    public void pageClosed(IWorkbenchPage page) {
-        pageEventReceived = true;
-    }
-
-    /**
-     * @see IPageListener#pageOpened(IWorkbenchPage)
-     */
-    public void pageOpened(IWorkbenchPage page) {
-        pageEventReceived = true;
-    }
-
-    /**
-     * @see IPerspectiveListener#perspectiveActivated(IWorkbenchPage, IPerspectiveDescriptor)
-     */
-    public void perspectiveActivated(IWorkbenchPage page,
-            IPerspectiveDescriptor perspective) {
-        perspEventReceived = true;
-    }
-
-    /**
-     * @see IPerspectiveListener#perspectiveChanged(IWorkbenchPage, IPerspectiveDescriptor, String)
-     */
-    public void perspectiveChanged(IWorkbenchPage page,
-            IPerspectiveDescriptor perspective, String changeId) {
-        perspEventReceived = true;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPartServiceTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPartServiceTest.java
deleted file mode 100644
index c4d00d0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPartServiceTest.java
+++ /dev/null
@@ -1,603 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IPartService;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.PartSite;
-import org.eclipse.ui.internal.SlavePartService;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.harness.util.CallHistory;
-import org.eclipse.ui.tests.harness.util.EmptyPerspective;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests the IPartService, IPartListener and IPartListener2 interfaces.
- */
-public class IPartServiceTest extends UITestCase {
-
-    private IWorkbenchWindow fWindow;
-
-    private IWorkbenchPage fPage;
-
-    // Event state.
-    private IWorkbenchPart eventPart;
-
-    private IWorkbenchPartReference eventPartRef;
-
-    class TestPartListener implements IPartListener {
-        public void partActivated(IWorkbenchPart part) {
-            history.add("partActivated");
-            eventPart = part;
-        }
-
-        public void partBroughtToTop(IWorkbenchPart part) {
-            history.add("partBroughtToTop");
-            eventPart = part;
-        }
-
-        public void partClosed(IWorkbenchPart part) {
-            history.add("partClosed");
-            eventPart = part;
-        }
-
-        public void partDeactivated(IWorkbenchPart part) {
-            history.add("partDeactivated");
-            eventPart = part;
-        }
-
-        public void partOpened(IWorkbenchPart part) {
-            history.add("partOpened");
-            eventPart = part;
-        }
-    }
-
-    class TestPartListener2 implements IPartListener2 {
-        public void partActivated(IWorkbenchPartReference ref) {
-            history2.add("partActivated");
-            eventPartRef = ref;
-        }
-
-        public void partBroughtToTop(IWorkbenchPartReference ref) {
-            history2.add("partBroughtToTop");
-            eventPartRef = ref;
-        }
-
-        public void partClosed(IWorkbenchPartReference ref) {
-            history2.add("partClosed");
-            eventPartRef = ref;
-        }
-
-        public void partDeactivated(IWorkbenchPartReference ref) {
-            history2.add("partDeactivated");
-            eventPartRef = ref;
-        }
-
-        public void partOpened(IWorkbenchPartReference ref) {
-            history2.add("partOpened");
-            eventPartRef = ref;
-        }
-
-        public void partHidden(IWorkbenchPartReference ref) {
-            history2.add("partHidden");
-            eventPartRef = ref;
-        }
-
-        public void partVisible(IWorkbenchPartReference ref) {
-            history2.add("partVisible");
-            eventPartRef = ref;
-        }
-
-        public void partInputChanged(IWorkbenchPartReference ref) {
-            history2.add("partInputChanged");
-            eventPartRef = ref;
-        }
-    }
-
-    private IPartListener partListener = new TestPartListener();
-
-    private IPartListener2 partListener2 = new TestPartListener2();
-
-    private CallHistory history = new CallHistory(partListener);
-
-    private CallHistory history2 = new CallHistory(partListener2);
-
-    public IPartServiceTest(String testName) {
-        super(testName);
-    }
-
-    /**
-     * Clear the event state.
-     */
-    private void clearEventState() {
-        eventPart = null;
-        eventPartRef = null;
-        history.clear();
-        history2.clear();
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWindow = openTestWindow();
-        fPage = fWindow.getActivePage();
-    }
-
-    private IWorkbenchPartReference getRef(IWorkbenchPart part) {
-        return ((PartSite) part.getSite()).getPartReference();
-    }
-
-    /**
-     * Tests the addPartListener method on IWorkbenchPage's part service.
-     */
-    public void testAddPartListenerToPage() throws Throwable {
-        // From Javadoc: "Adds the given listener for part lifecycle events.
-        // Has no effect if an identical listener is already registered."
-        fPage.addPartListener(partListener);
-        fPage.addPartListener(partListener2);
-
-        // Open a view.
-        // Verify events are received.
-        clearEventState();
-        MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
-        assertTrue(history.verifyOrder(new String[] { "partOpened",
-                "partActivated" }));
-        assertEquals(view, eventPart);
-        assertTrue(history2.verifyOrder(new String[] { "partOpened",
-                "partVisible", "partActivated" }));
-        assertEquals(getRef(view), eventPartRef);
-
-        // Hide the view
-        // Verify events are received.
-        clearEventState();
-        fPage.hideView(view);
-        assertTrue(history.verifyOrder(new String[] { "partDeactivated",
-                "partClosed" }));
-        assertEquals(view, eventPart);
-        assertTrue(history2.verifyOrder(new String[] { "partDeactivated",
-                "partHidden", "partClosed" }));
-        assertEquals(getRef(view), eventPartRef);
-        
-        fPage.removePartListener(partListener);
-        fPage.removePartListener(partListener2);
-    }
-    
-    public void testLocalPartService() throws Throwable {
-    	IPartService service = (IPartService) fWindow
-				.getService(IPartService.class);
-
-		MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
-		MockViewPart view2 = (MockViewPart) fPage.showView(MockViewPart.ID2);
-
-		IPartService slaveService = (IPartService) view.getSite()
-				.getService(IPartService.class);
-
-		assertTrue(service != slaveService);
-		assertNotNull(slaveService);
-		assertNotNull(service);
-		assertTrue(slaveService instanceof SlavePartService);
-
-		// Add listener, should receive events
-		slaveService.addPartListener(partListener);
-		fPage.activate(view);
-
-		assertTrue(history.verifyOrder(new String[] { "partDeactivated",
-				"partActivated" }));
-
-		// Remove listener, should not receive events
-		slaveService.removePartListener(partListener);
-		clearEventState();
-		fPage.activate(view2);
-		assertTrue(history.isEmpty());
-
-		// Hide another view, should still receive events
-		slaveService.addPartListener(partListener);
-		clearEventState();
-		fPage.hideView(view2);
-		assertTrue(history.verifyOrder(new String[] { "partDeactivated",
-				"partActivated", "partClosed" }));
-		
-		// Hide view, listeners should be disposed
-		fPage.hideView(view);
-		clearEventState();
-		fPage.showView(MockViewPart.ID3);
-		assertTrue(history.isEmpty());
-    }
-
-    /**
-     * Tests the addPartListener method on IWorkbenchWindow's part service.
-     */
-    public void testAddPartListenerToWindow() throws Throwable {
-        // From Javadoc: "Adds the given listener for part lifecycle events.
-		// Has no effect if an identical listener is already registered."
-		IPartService service = (IPartService) fWindow
-				.getService(IPartService.class);
-		service.addPartListener(partListener);
-		service.addPartListener(partListener2);
-
-        // Open a view.
-        // Verify events are received.
-        clearEventState();
-        MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
-        assertTrue(history.verifyOrder(new String[] { "partOpened",
-                "partActivated" }));
-        assertEquals(view, eventPart);
-        assertTrue(history2.verifyOrder(new String[] { "partOpened",
-                "partVisible", "partActivated" }));
-        assertEquals(getRef(view), eventPartRef);
-
-        // Hide the view
-        // Verify events are received.
-        clearEventState();
-        fPage.hideView(view);
-        assertTrue(history.verifyOrder(new String[] { "partDeactivated",
-                "partClosed" }));
-        assertEquals(view, eventPart);
-        assertTrue(history2.verifyOrder(new String[] { "partDeactivated",
-                "partHidden", "partClosed" }));
-        assertEquals(getRef(view), eventPartRef);
-        
-        service.removePartListener(partListener);
-        service.removePartListener(partListener2);
-    }
-
-    /**
-     * Tests the removePartListener method on IWorkbenchPage's part service.
-     */
-    public void testRemovePartListenerFromPage() throws Throwable {
-        // From Javadoc: "Removes the given part listener.
-        // Has no affect if an identical listener is not registered."
-
-        // Add and remove listener.
-        fPage.addPartListener(partListener);
-        fPage.addPartListener(partListener2);
-        fPage.removePartListener(partListener);
-        fPage.removePartListener(partListener2);
-
-        // Open a view.
-        // Verify no events are received.
-        clearEventState();
-        fPage.showView(MockViewPart.ID);
-        assertTrue(history.isEmpty());
-        assertTrue(history2.isEmpty());
-    }
-
-    /**
-     * Tests the removePartListener method on IWorkbenchWindow's part service.
-     */
-    public void testRemovePartListenerFromWindow() throws Throwable {
-		// From Javadoc: "Removes the given part listener.
-		// Has no affect if an identical listener is not registered."
-
-		// Add and remove listener.
-		IPartService service = (IPartService) fWindow
-				.getService(IPartService.class);
-		service.addPartListener(partListener);
-		service.addPartListener(partListener2);
-		service.removePartListener(partListener);
-		service.removePartListener(partListener2);
-
-		// Open a view.
-		// Verify no events are received.
-		clearEventState();
-		fPage.showView(MockViewPart.ID);
-		assertTrue(history.isEmpty());
-		assertTrue(history2.isEmpty());
-	}
-
-    /**
-	 * Tests the partHidden method by closing a view when it is not shared with
-	 * another perspective. Includes regression test for: Bug 60039 [ViewMgmt]
-	 * (regression) IWorkbenchPage#findView returns non-null value after part
-	 * has been closed
-	 */
-    public void testPartHiddenWhenClosedAndUnshared() throws Throwable {
-        IPartListener2 listener = new TestPartListener2() {
-            public void partHidden(IWorkbenchPartReference ref) {
-                super.partHidden(ref);
-                // ensure that the notification is for the view we closed
-                assertEquals(MockViewPart.ID, ref.getId());
-                // ensure that the view cannot be found
-                assertNull(fPage.findView(MockViewPart.ID));
-            }
-        };
-        MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
-        fPage.addPartListener(listener);
-        clearEventState();
-        fPage.hideView(view);
-        assertTrue(history2.contains("partHidden"));
-        assertEquals(getRef(view), eventPartRef);
-        fPage.removePartListener(listener);
-    }
-
-    /**
-     * Tests the partHidden method by closing a view when it is shared with another perspective.
-     * Includes regression test for: 
-     *   Bug 60039 [ViewMgmt] (regression) IWorkbenchPage#findView returns non-null value after part has been closed
-     */
-    public void testPartHiddenWhenClosedAndShared() throws Throwable {
-        IPartListener2 listener = new TestPartListener2() {
-            public void partHidden(IWorkbenchPartReference ref) {
-                super.partHidden(ref);
-                // ensure that the notification is for the view we closed
-                assertEquals(MockViewPart.ID, ref.getId());
-                // ensure that the view cannot be found
-                assertNull(fPage.findView(MockViewPart.ID));
-            }
-        };
-        MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
-        IPerspectiveDescriptor emptyPerspDesc2 = fWindow.getWorkbench()
-                .getPerspectiveRegistry().findPerspectiveWithId(
-                        EmptyPerspective.PERSP_ID2);
-        fPage.setPerspective(emptyPerspDesc2);
-        MockViewPart view2 = (MockViewPart) fPage.showView(MockViewPart.ID);
-        assertTrue(view == view2);
-        fPage.addPartListener(listener);
-        clearEventState();
-        fPage.hideView(view);
-        assertTrue(history2.contains("partHidden"));
-        assertEquals(getRef(view), eventPartRef);
-        fPage.removePartListener(listener);
-    }
-
-    /**
-     * Tests the partHidden method by activating another view in the same folder.
-     */
-    public void testPartHiddenWhenObscured() throws Throwable {
-        final boolean[] eventReceived = { false };
-        IPartListener2 listener = new TestPartListener2() {
-            public void partHidden(IWorkbenchPartReference ref) {
-                super.partHidden(ref);
-                // ensure that the notification is for the view that was obscured
-                assertEquals(MockViewPart.ID, ref.getId());
-                // ensure that the view can still be found
-                assertNotNull(fPage.findView(MockViewPart.ID));
-                eventReceived[0] = true;
-            }
-        };
-        MockViewPart view2 = (MockViewPart) fPage.showView(MockViewPart.ID2);
-        MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
-        assertEquals(view, fPage.getActivePart());
-        fPage.addPartListener(listener);
-        clearEventState();
-        fPage.activate(view2);
-        fPage.removePartListener(listener);
-        assertTrue(eventReceived[0]);
-    }
-
-    /**
-     * Tests the partVisible method by showing a view when it is not
-     * open in any other perspectives.
-     */
-    public void testPartVisibleWhenOpenedUnshared() throws Throwable {
-        final boolean[] eventReceived = { false };
-        IPartListener2 listener = new TestPartListener2() {
-            public void partVisible(IWorkbenchPartReference ref) {
-                super.partVisible(ref);
-                // ensure that the notification is for the view we opened
-                assertEquals(MockViewPart.ID, ref.getId());
-                // ensure that the view can be found
-                assertNotNull(fPage.findView(MockViewPart.ID));
-                eventReceived[0] = true;
-            }
-        };
-        fPage.addPartListener(listener);
-        clearEventState();
-        MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
-        fPage.removePartListener(listener);
-        assertEquals(view, fPage.getActivePart());
-        assertTrue(eventReceived[0]);
-    }
-
-    /**
-     * Tests the partVisible method by showing a view when it is already
-     * open in another perspective.
-     */
-    public void testPartVisibleWhenOpenedShared() throws Throwable {
-        final boolean[] eventReceived = { false };
-        IPartListener2 listener = new TestPartListener2() {
-            public void partVisible(IWorkbenchPartReference ref) {
-                super.partVisible(ref);
-                // ensure that the notification is for the view we opened
-                assertEquals(MockViewPart.ID, ref.getId());
-                // ensure that the view can be found
-                assertNotNull(fPage.findView(MockViewPart.ID));
-                eventReceived[0] = true;
-            }
-        };
-        MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
-        IPerspectiveDescriptor emptyPerspDesc2 = fWindow.getWorkbench()
-                .getPerspectiveRegistry().findPerspectiveWithId(
-                        EmptyPerspective.PERSP_ID2);
-        fPage.setPerspective(emptyPerspDesc2);
-        fPage.addPartListener(listener);
-        clearEventState();
-        MockViewPart view2 = (MockViewPart) fPage.showView(MockViewPart.ID);
-        assertTrue(view == view2);
-        assertEquals(view2, fPage.getActivePart());
-        assertTrue(eventReceived[0]);
-        fPage.removePartListener(listener);
-    }
-
-    /**
-     * Tests that both a part hidden and a part closed event are sent when
-     * a part is closed
-     *
-     * @throws Throwable
-     */
-    public void testPartHiddenBeforeClosing() throws Throwable {
-        
-        final boolean[] eventReceived = {false, false};
-        IPartListener2 listener = new TestPartListener2() {
-            public void partHidden(IWorkbenchPartReference ref) {
-                super.partHidden(ref);
-                // ensure that the notification is for the view we revealed
-                assertEquals(MockViewPart.ID, ref.getId());
-                // ensure that the part cannot be found in the page
-                assertNull(fPage.findView(MockViewPart.ID));
-                // Ensure that partHidden is sent first
-                eventReceived[0] = true;
-                assertFalse(eventReceived[1]);
-            }
-            public void partClosed(IWorkbenchPartReference ref) {
-                super.partClosed(ref);
-                // ensure that the notification is for the view we revealed
-                assertEquals(MockViewPart.ID, ref.getId());
-                // ensure that the view can no longer be found
-                assertNull(fPage.findView(MockViewPart.ID));
-                // Ensure that partHidden is sent first
-                eventReceived[1] = true;
-                assertTrue(eventReceived[0]);
-
-            }
-        };
-        MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
-        assertEquals(view, fPage.getActivePart());
-        fPage.addPartListener(listener);
-        clearEventState();
-        fPage.hideView(view);
-        fPage.removePartListener(listener);
-        history.verifyOrder(new String[] {"partHidden", "partClosed"});
-        assertTrue(eventReceived[0]);
-        assertTrue(eventReceived[1]);
-    }
-    
-    /**
-     * Tests the partVisible method by activating a view obscured by
-     * another view in the same folder.
-     */
-    public void testPartVisibleWhenObscured() throws Throwable {
-        final boolean[] eventReceived = { false };
-        IPartListener2 listener = new TestPartListener2() {
-            public void partVisible(IWorkbenchPartReference ref) {
-                super.partVisible(ref);
-                // ensure that the notification is for the view we revealed
-                assertEquals(MockViewPart.ID, ref.getId());
-                // ensure that the view can still be found
-                assertNotNull(fPage.findView(MockViewPart.ID));
-                eventReceived[0] = true;
-            }
-        };
-        MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
-        MockViewPart view2 = (MockViewPart) fPage.showView(MockViewPart.ID2);
-        assertEquals(view2, fPage.getActivePart());
-        fPage.addPartListener(listener);
-        clearEventState();
-        fPage.activate(view);
-        fPage.removePartListener(listener);
-        assertTrue(eventReceived[0]);
-    }
-    
-//    /**
-//     * Tests that when a partOpened is received for a view being shown,
-//     * the view is available via findView, findViewReference, getViews and getViewReferences.
-//     * 
-//     * @since 3.1
-//     */
-// This does not work as expected.  See bug 93784.
-//  
-//    public void testViewFoundWhenOpened() throws Throwable {
-//    	final String viewId = MockViewPart.ID;
-//        final boolean[] eventReceived = { false, false };
-//        IPartListener listener = new TestPartListener() {
-//            public void partOpened(IWorkbenchPart part) {
-//                super.partOpened(part);
-//                // ensure that the notification is for the view we opened
-//                assertEquals(viewId, part.getSite().getId());
-//                // ensure that the view can be found
-//                assertNotNull(fPage.findView(viewId));
-//                IViewPart[] views = fPage.getViews();
-//                assertEquals(1, views.length);
-//                assertEquals(viewId, views[0].getSite().getId());
-//                eventReceived[0] = true;
-//            }
-//        };
-//        IPartListener2 listener2 = new TestPartListener2() {
-//            public void partOpened(IWorkbenchPartReference ref) {
-//                super.partOpened(ref);
-//                // ensure that the notification is for the view we opened
-//                assertEquals(viewId, ref.getId());
-//                // ensure that the view can be found
-//                assertNotNull(fPage.findViewReference(viewId));
-//                IViewReference[] refs = fPage.getViewReferences();
-//                assertEquals(1, refs.length);
-//                assertEquals(viewId, refs[0].getId());
-//                eventReceived[1] = true;
-//            }
-//        };
-//        fPage.addPartListener(listener);
-//        fPage.addPartListener(listener2);
-//        fPage.showView(viewId);
-//        fPage.removePartListener(listener);
-//        fPage.removePartListener(listener2);
-//        assertTrue(eventReceived[0]);
-//        assertTrue(eventReceived[1]);
-//    }
-
-    /**
-     * Tests that when a partOpened is received for an editor being opened,
-     * the editor is available via findEditor, getEditors, and getEditorReferences.
-     * 
-     * @since 3.1
-     */
-    public void testEditorFoundWhenOpened() throws Throwable {
-    	final String editorId = MockEditorPart.ID1;
-		IProject proj = FileUtil.createProject("IPartServiceTest");
-		IFile file = FileUtil.createFile("testEditorFoundWhenOpened.txt", proj);
-		final IEditorInput editorInput = new FileEditorInput(file);
-    	
-        final boolean[] eventReceived = { false, false };
-        IPartListener listener = new TestPartListener() {
-            public void partOpened(IWorkbenchPart part) {
-                super.partOpened(part);
-                // ensure that the notification is for the editor we opened
-                assertEquals(editorId, part.getSite().getId());
-                // ensure that the editor can be found
-                assertNotNull(fPage.findEditor(editorInput));
-                IEditorPart[] editors = fPage.getEditors();
-                assertEquals(1, editors.length);
-                assertEquals(editorId, editors[0].getSite().getId());
-                eventReceived[0] = true;
-            }
-        };
-        IPartListener2 listener2 = new TestPartListener2() {
-            public void partOpened(IWorkbenchPartReference ref) {
-                super.partOpened(ref);
-                // ensure that the notification is for the editor we opened
-                assertEquals(editorId, ref.getId());
-                // ensure that the editor can be found
-                IEditorReference[] refs = fPage.getEditorReferences();
-                assertEquals(1, refs.length);
-                assertEquals(editorId, refs[0].getId());
-                eventReceived[1] = true;
-            }
-        };
-        fPage.addPartListener(listener);
-        fPage.addPartListener(listener2);
-		fPage.openEditor(editorInput, editorId);
-        fPage.removePartListener(listener);
-        fPage.removePartListener(listener2);
-        assertTrue(eventReceived[0]);
-        assertTrue(eventReceived[1]);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPerspectiveDescriptorTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPerspectiveDescriptorTest.java
deleted file mode 100644
index dee7a5b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPerspectiveDescriptorTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.PlatformUI;
-
-public class IPerspectiveDescriptorTest extends TestCase {
-
-    private IPerspectiveDescriptor[] fPerspectives;
-
-    public IPerspectiveDescriptorTest(String testName) {
-        super(testName);
-    }
-
-    public void setUp() {
-        fPerspectives = PlatformUI
-                .getWorkbench().getPerspectiveRegistry().getPerspectives();
-    }
-
-    /**
-     * Tests that the ids for all perspective descriptors are non-null and non-empty.
-     */
-    public void testGetId() {
-        for (int i = 0; i < fPerspectives.length; i++) {
-            String id = fPerspectives[i].getId();
-            assertNotNull(id);
-            assertTrue(id.length() > 0);
-        }
-    }
-
-    /**
-     * Tests that the labels for all perspective descriptors are non-null and non-empty.
-     */
-    public void testGetLabel() {
-        for (int i = 0; i < fPerspectives.length; i++) {
-            String label = fPerspectives[i].getLabel();
-            assertNotNull(label);
-            assertTrue(label.length() > 0);
-        }
-    }
-
-    /**
-     * Tests that the image descriptors for all perspective descriptors are non-null.
-     * <p>
-     * Note that some perspective extensions in the test suite do not specify an icon
-     * attribute.  getImageDescriptor should return a default image descriptor in this
-     * case.  This is a regression test for bug 68325.
-     * </p>
-     */
-    public void testGetImageDescriptor() {
-        for (int i = 0; i < fPerspectives.length; i++) {
-            ImageDescriptor image = fPerspectives[i].getImageDescriptor();
-            assertNotNull(image);
-        }
-    }
-    
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPerspectiveListenerTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPerspectiveListenerTest.java
deleted file mode 100644
index 3fee6e2..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPerspectiveListenerTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-public class IPerspectiveListenerTest extends UITestCase implements
-        IPerspectiveListener {
-    private int fEvent;
-
-    private IWorkbenchWindow fWindow;
-
-    private IWorkbenchPage fPageMask;
-
-    private IPerspectiveDescriptor fPerMask;
-
-    /**
-     * bit masks for events
-     */
-    public static final int NONE = 0x00, OPEN = 0x01, CLOSED = 0x02,
-            ACTIVATED = 0x04, CHANGED = 0x08;
-
-    public IPerspectiveListenerTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fEvent = NONE;
-        fWindow = openTestWindow();
-        fWindow.addPerspectiveListener(this);
-    }
-
-    protected void doTearDown() throws Exception {
-        fWindow.removePerspectiveListener(this);
-        super.doTearDown();
-    }
-
-    public void testPerspectiveActivated() {
-        /*
-         * Commented out because until test case can be updated to work
-         * with new window/page/perspective implementation
-         * 
-         fPageMask = fWindow.getActivePage();
-         fPerMask = fWorkbench.getPerspectiveRegistry().findPerspectiveWithId(EmptyPerspective.PERSP_ID );
-         fPageMask.setPerspective( fPerMask );
-         
-         assertEquals( isActivated( fEvent ), true );
-         */
-    }
-
-    public void testPerspectiveChanged() {
-        /*
-         * Commented out because until test case can be updated to work
-         * with new window/page/perspective implementation
-         * 
-         fPageMask = fWindow.getActivePage();
-         fPerMask = fWorkbench.getPerspectiveRegistry().findPerspectiveWithId(EmptyPerspective.PERSP_ID );
-         fPageMask.setPerspective( fPerMask );
-         
-         assertEquals( isActivated( fEvent ), true );
-         */
-    }
-
-    /**
-     * @see IPerspectiveListener#perspectiveActivated(IWorkbenchPage, IPerspectiveDescriptor)
-     */
-    public void perspectiveActivated(IWorkbenchPage page,
-            IPerspectiveDescriptor perspective) {
-        if (page == fPageMask && perspective == fPerMask)
-            fEvent |= ACTIVATED;
-    }
-
-    /**
-     * @see IPerspectiveListener#perspectiveChanged(IWorkbenchPage, IPerspectiveDescriptor, String)
-     */
-    public void perspectiveChanged(IWorkbenchPage page,
-            IPerspectiveDescriptor perspective, String changeId) {
-        if (page == fPageMask && perspective == fPerMask)
-            fEvent |= CHANGED;
-    }
-
-    public static boolean isOpen(int bits) {
-        return ((bits & OPEN) != 0);
-    }
-
-    public static boolean isClosed(int bits) {
-        return ((bits & CLOSED) != 0);
-    }
-
-    public static boolean isActivated(int bits) {
-        return ((bits & ACTIVATED) != 0);
-    }
-
-    public static boolean isChanged(int bits) {
-        return ((bits & CLOSED) != 0);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPerspectiveRegistryTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPerspectiveRegistryTest.java
deleted file mode 100644
index 02ab731..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IPerspectiveRegistryTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.harness.util.ArrayUtil;
-
-public class IPerspectiveRegistryTest extends TestCase {
-
-    private IPerspectiveRegistry fReg;
-
-    public IPerspectiveRegistryTest(String testName) {
-        super(testName);
-    }
-
-    public void setUp() {
-        fReg = PlatformUI.getWorkbench().getPerspectiveRegistry();
-    }
-
-    public void testFindPerspectiveWithId() {
-        IPerspectiveDescriptor pers = (IPerspectiveDescriptor) ArrayUtil
-                .pickRandom(fReg.getPerspectives());
-
-        IPerspectiveDescriptor suspect = fReg.findPerspectiveWithId(pers
-                .getId());
-        assertNotNull(suspect);
-        assertEquals(pers, suspect);
-
-        suspect = fReg.findPerspectiveWithId(IConstants.FakeID);
-        assertNull(suspect);
-    }
-
-    /*	
-     public void testFindPerspectiveWithLabel()
-     {
-     IPerspectiveDescriptor pers = ( IPerspectiveDescriptor )ArrayUtil.pickRandom( fReg.getPerspectives() );
-     
-     IPerspectiveDescriptor suspect = fReg.findPerspectiveWithLabel( pers.getLabel() );
-     assertNotNull( suspect );
-     assertEquals( pers, suspect );
-     
-     suspect = fReg.findPerspectiveWithLabel( IConstants.FakeLabel );
-     assertNull( suspect );
-     }
-     */
-    public void testGetDefaultPerspective() {
-        String id = fReg.getDefaultPerspective();
-        assertNotNull(id);
-
-        IPerspectiveDescriptor suspect = fReg.findPerspectiveWithId(id);
-        assertNotNull(suspect);
-    }
-
-    public void testSetDefaultPerspective() {
-        IPerspectiveDescriptor pers = (IPerspectiveDescriptor) ArrayUtil
-                .pickRandom(fReg.getPerspectives());
-        fReg.setDefaultPerspective(pers.getId());
-
-        assertEquals(pers.getId(), fReg.getDefaultPerspective());
-    }
-
-    public void testGetPerspectives() throws Throwable {
-        IPerspectiveDescriptor[] pers = fReg.getPerspectives();
-        assertNotNull(pers);
-
-        for (int i = 0; i < pers.length; i++)
-            assertNotNull(pers[i]);
-    }
-    
-    public void testDeleteClonedPerspective() {
-		IWorkbenchPage page = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage();
-		String perspId = page.getPerspective().getId() + ".1";
-		IPerspectiveDescriptor desc = fReg.clonePerspective(perspId, perspId, page.getPerspective());
-		page.setPerspective(desc);
-		
-		assertNotNull(fReg.findPerspectiveWithId(perspId));
-		
-		page.closePerspective(desc, false, false);
-		fReg.deletePerspective(desc);
-		
-		assertNull(fReg.findPerspectiveWithId(perspId));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ISelectionServiceTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ISelectionServiceTest.java
deleted file mode 100644
index 8c4ef6e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ISelectionServiceTest.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.ISelectionService;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.SlaveSelectionService;
-import org.eclipse.ui.tests.SelectionProviderView;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests the ISelectionService class.
- */
-public class ISelectionServiceTest extends UITestCase implements
-        ISelectionListener {
-    private IWorkbenchWindow fWindow;
-
-    private IWorkbenchPage fPage;
-
-    // Event state.
-    private boolean eventReceived;
-
-    private ISelection eventSelection;
-
-    private IWorkbenchPart eventPart;
-
-    public ISelectionServiceTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWindow = openTestWindow();
-        fPage = fWindow.getActivePage();
-    }
-
-    /**
-     * Tests the addSelectionListener method.
-     */
-    public void testAddSelectionListener() throws Throwable {
-        // From Javadoc: "Adds the given selection listener.
-        // Has no effect if an identical listener is already registered."
-
-        // Add listener.
-        fPage.addSelectionListener(this);
-
-        // Open a view and select something.
-        // Verify events are received.
-        clearEventState();
-        SelectionProviderView view = (SelectionProviderView) fPage
-                .showView(SelectionProviderView.ID);
-        view.setSelection("Selection");
-        assertTrue("EventReceived", eventReceived);
-    }
-
-    /**
-     * Tests the removePageListener method.
-     */
-    public void testRemoveSelectionListener() throws Throwable {
-        // From Javadoc: "Removes the given selection listener.
-        // Has no affect if an identical listener is not registered."
-
-        // Add and remove listener.
-        fPage.addSelectionListener(this);
-        fPage.removeSelectionListener(this);
-
-        // Open a view and select something.
-        // Verify no events are received.
-        clearEventState();
-        SelectionProviderView view = (SelectionProviderView) fPage
-                .showView(SelectionProviderView.ID);
-        view.setSelection("Selection");
-        assertTrue("EventReceived", !eventReceived);
-    }
-
-    /**
-     * Tests getActivePage.
-     */
-    public void testGetSelection() throws Throwable {
-        // From Javadoc: "Returns the current selection in the active part.  
-        // If the selection in the active part is <em>undefined</em> (the 
-        // active part has no selection provider) the result will be 
-        // <code>null</code>"
-        Object actualSel, sel1 = "Selection 1", sel2 = "Selection 2";
-
-        // Open view.
-        SelectionProviderView view = (SelectionProviderView) fPage
-                .showView(SelectionProviderView.ID);
-
-        // Fire selection and verify.
-        view.setSelection(sel1);
-        actualSel = unwrapSelection(fPage.getSelection());
-        assertEquals("Selection", sel1, actualSel);
-
-        // Fire selection and verify.
-        view.setSelection(sel2);
-        actualSel = unwrapSelection(fPage.getSelection());
-        assertEquals("Selection", sel2, actualSel);
-
-        // Close view and verify.
-        fPage.hideView(view);
-        assertNull("getSelection", fPage.getSelection());
-    }
-    
-    /**
-     * Tests getting a selection service local to the part site
-     */
-    public void testLocalSelectionService() throws Throwable {
-		Object sel1 = "Selection 1";
-
-		// Open view.
-		SelectionProviderView view2 = (SelectionProviderView) fPage
-				.showView(SelectionProviderView.ID_2);
-		SelectionProviderView view = (SelectionProviderView) fPage
-				.showView(SelectionProviderView.ID);
-
-		ISelectionService service = fWindow.getSelectionService();
-		ISelectionService windowService = (ISelectionService) fWindow
-				.getService(ISelectionService.class);
-		ISelectionService slaveService = (ISelectionService) view2.getSite()
-				.getService(ISelectionService.class);
-
-		assertTrue(service != slaveService);
-		assertEquals(service, windowService);
-		assertNotNull(service);
-		assertNotNull(slaveService);
-		assertTrue(slaveService instanceof SlaveSelectionService);
-
-		slaveService.addSelectionListener(this);
-		view.setSelection(sel1);
-
-		// Should receive selection events
-		assertTrue("EventReceived", eventReceived);
-		assertEquals("EventPart", view, eventPart);
-		assertEquals("Event Selection", sel1, unwrapSelection(eventSelection));
-
-		fPage.hideView(view2);
-		clearEventState();
-
-		view.setSelection(sel1);
-
-		// Should not receive selection events
-		assertFalse(eventReceived);
-		assertNull(eventPart);
-		assertNull(eventSelection);
-	}
-
-    /**
-	 * Test event firing for inactive parts. In this scenario the event should
-	 * not be fired.
-	 */
-    public void testSelectionEventWhenInactive() throws Throwable {
-        Object sel1 = "Selection 1", sel2 = "Selection 2";
-
-        // Add listener.
-        fPage.addSelectionListener(this);
-
-        // Open two views.
-        SelectionProviderView view1 = (SelectionProviderView) fPage
-                .showView(SelectionProviderView.ID);
-        SelectionProviderView view2 = (SelectionProviderView) fPage
-                .showView(SelectionProviderView.ID_2);
-
-        // Fire selection from the second.
-        // Verify it is received.
-        clearEventState();
-        view2.setSelection(sel2);
-        assertTrue("EventReceived", eventReceived);
-        assertEquals("EventPart", view2, eventPart);
-        assertEquals("Event Selection", sel2, unwrapSelection(eventSelection));
-
-        // Fire selection from the first.
-        // Verify it is NOT received.
-        clearEventState();
-        view1.setSelection(sel1);
-        assertTrue("Unexpected selection events received", !eventReceived);
-    }
-
-    /**
-     * Test event firing when activated.  
-     */
-    public void testSelectionEventWhenActivated() throws Throwable {
-        // From Javadoc: "Adds the given selection listener.
-        // Has no effect if an identical listener is already registered."
-        Object sel1 = "Selection 1", sel2 = "Selection 2";
-
-        // Add listener.
-        fPage.addSelectionListener(this);
-
-        // Open a view and select something.
-        SelectionProviderView view1 = (SelectionProviderView) fPage
-                .showView(SelectionProviderView.ID);
-        view1.setSelection(sel1);
-
-        // Open another view and select something.
-        SelectionProviderView view2 = (SelectionProviderView) fPage
-                .showView(SelectionProviderView.ID_2);
-        view2.setSelection(sel2);
-
-        // Activate the first view.
-        // Verify that selection events are fired.
-        clearEventState();
-        fPage.activate(view1);
-        assertTrue("EventReceived", eventReceived);
-        assertEquals("EventPart", view1, eventPart);
-        assertEquals("Event Selection", sel1, unwrapSelection(eventSelection));
-
-        // Activate the second view.
-        // Verify that selection events are fired.
-        clearEventState();
-        fPage.activate(view2);
-        assertTrue("EventReceived", eventReceived);
-        assertEquals("EventPart", view2, eventPart);
-        assertEquals("Event Selection", sel2, unwrapSelection(eventSelection));
-    }
-
-    /**
-     * Unwrap a selection.
-     */
-    private Object unwrapSelection(ISelection sel) {
-        if (sel instanceof IStructuredSelection) {
-            IStructuredSelection struct = (IStructuredSelection) sel;
-            if (struct.size() == 1)
-                return struct.getFirstElement();
-        }
-        return null;
-    }
-
-    /**
-     * Clear the event state.
-     */
-    private void clearEventState() {
-        eventReceived = false;
-        eventPart = null;
-        eventSelection = null;
-    }
-
-    /*
-     * @see ISelectionListener#selectionChanged(IWorkbenchPart, ISelection)
-     */
-    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-        eventReceived = true;
-        eventPart = part;
-        eventSelection = selection;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IViewActionDelegateTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IViewActionDelegateTest.java
deleted file mode 100644
index 302dfe16..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IViewActionDelegateTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.ui.tests.harness.util.ActionUtil;
-
-/**
- * Tests the lifecycle for a view action delegate.
- */
-public class IViewActionDelegateTest extends IActionDelegateTest {
-
-    public static String TEST_VIEW_ID = "org.eclipse.ui.tests.api.IViewActionDelegateTest";
-
-    /**
-     * Constructor for IWorkbenchWindowActionDelegateTest
-     */
-    public IViewActionDelegateTest(String testName) {
-        super(testName);
-    }
-
-    public void testInit() throws Throwable {
-        // When an action delegate is run the
-        // init, selectionChanged, and run methods should
-        // be called, in that order.
-
-        // Run the action.
-        testRun();
-
-        // Verify lifecycle.
-        MockActionDelegate delegate = getDelegate();
-        assertNotNull(delegate);
-        assertTrue(delegate.callHistory.verifyOrder(new String[] { "init",
-                "selectionChanged", "run" }));
-    }
-
-    /**
-     * @see IActionDelegateTest#createActionWidget()
-     */
-    protected Object createActionWidget() throws Throwable {
-        MockViewPart view = (MockViewPart) fPage.showView(TEST_VIEW_ID);
-        return view;
-    }
-
-    /**
-     * @see IActionDelegateTest#runAction()
-     */
-    protected void runAction(Object widget) throws Throwable {
-        MockViewPart view = (MockViewPart) widget;
-        IMenuManager mgr = view.getViewSite().getActionBars().getMenuManager();
-        ActionUtil.runActionWithLabel(this, mgr, "Mock Action");
-    }
-
-    /**
-     * @see IActionDelegateTest#fireSelection()
-     */
-    protected void fireSelection(Object widget) throws Throwable {
-        MockViewPart view = (MockViewPart) widget;
-        view.fireSelection();
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IViewPartTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IViewPartTest.java
deleted file mode 100644
index d3b064f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IViewPartTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.tests.harness.util.CallHistory;
-
-/**
- * This is a test for IViewPart.  Since IViewPart is an
- * interface this test verifies the IViewPart lifecycle rather
- * than the implementation.
- */
-public class IViewPartTest extends IWorkbenchPartTest {
-
-    /**
-     * Constructor for IEditorPartTest
-     */
-    public IViewPartTest(String testName) {
-        super(testName);
-    }
-
-    /**
-     * @see IWorkbenchPartTest#openPart(IWorkbenchPage)
-     */
-    protected MockPart openPart(IWorkbenchPage page) throws Throwable {
-        return (MockWorkbenchPart) page.showView(MockViewPart.ID);
-    }
-
-    /**
-     * @see IWorkbenchPartTest#closePart(IWorkbenchPage, MockWorkbenchPart)
-     */
-    protected void closePart(IWorkbenchPage page, MockPart part)
-            throws Throwable {
-        page.hideView((IViewPart) part);
-    }
-    
-    /**
-     * Tests that the view is closed without saving if isSaveOnCloseNeeded()
-     * returns false. This also tests some disposal behaviors specific to 
-     * views: namely, that the contribution items are disposed in the correct
-     * order with respect to the disposal of the view. 
-     * 
-     * @see ISaveablePart#isSaveOnCloseNeeded()
-     */
-    public void testOpenAndCloseSaveNotNeeded() throws Throwable {
-        // Open a part.
-        SaveableMockViewPart part = (SaveableMockViewPart) fPage.showView(SaveableMockViewPart.ID);
-        part.setDirty(true);
-        part.setSaveNeeded(false);
-        closePart(fPage, part);
-        
-        CallHistory history = part.getCallHistory();
-        
-        // TODO: This verifies the 3.0 disposal order. However, there may be a bug here.
-        // That is, it may be necessary to change this and dispose the contribution items 
-        // after the view's dispose method in order to ensure that the site is never returning
-        // a disposed contribution item. See bug 94457 for details.
-        assertTrue(history.verifyOrder(new String[] { "setInitializationData", "init",
-                "createPartControl", "setFocus", "isSaveOnCloseNeeded", 
-                "widgetDisposed", "toolbarContributionItemWidgetDisposed", 
-                "toolbarContributionItemDisposed", "dispose" }));
-        assertFalse(history.contains("doSave"));
-    }
-    
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IViewSiteTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IViewSiteTest.java
deleted file mode 100644
index c5d01c3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IViewSiteTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-
-public class IViewSiteTest extends IWorkbenchPartSiteTest {
-
-    /**
-     * Constructor for IViewPartSiteTest
-     */
-    public IViewSiteTest(String testName) {
-        super(testName);
-    }
-
-    /**
-     * @see IWorkbenchPartSiteTest#getTestPartName()
-     */
-    protected String getTestPartName() throws Throwable {
-        return MockViewPart.NAME;
-    }
-
-    /**
-     * @see IWorkbenchPartSiteTest#getTestPartId()
-     */
-    protected String getTestPartId() throws Throwable {
-        return MockViewPart.ID;
-    }
-
-    /**
-     * @see IWorkbenchPartSiteTest#createTestPart(IWorkbenchPage)
-     */
-    protected IWorkbenchPart createTestPart(IWorkbenchPage page)
-            throws Throwable {
-        return page.showView(MockViewPart.ID);
-    }
-
-    public void testGetActionBars() throws Throwable {
-        // From Javadoc: "Returns the action bars for this part site."
-
-        IViewPart view = (IViewPart) createTestPart(fPage);
-        IViewSite site = view.getViewSite();
-        assertNotNull(site.getActionBars());
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchPageTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchPageTest.java
deleted file mode 100644
index cedf4a5..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchPageTest.java
+++ /dev/null
@@ -1,2677 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.NotEnabledException;
-import org.eclipse.core.commands.NotHandledException;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.ILogListener;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.SaveableHelper;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.registry.IActionSetDescriptor;
-import org.eclipse.ui.internal.util.Util;
-import org.eclipse.ui.navigator.resources.ProjectExplorer;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.IPage;
-import org.eclipse.ui.tests.PerspectiveState;
-import org.eclipse.ui.tests.harness.util.CallHistory;
-import org.eclipse.ui.tests.harness.util.EmptyPerspective;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.ui.views.contentoutline.ContentOutline;
-
-public class IWorkbenchPageTest extends UITestCase {
-
-	private IWorkbenchPage fActivePage;
-
-	private IWorkbenchWindow fWin;
-
-	private IProject proj;
-	
-	private int logCount;
-	private IStatus logStatus;
-	String getMessage() {
-		return logStatus==null?"No message":logStatus.getMessage();
-	}
-	ILogListener openAndHideListener = new ILogListener() {
-		public void logging(IStatus status, String plugin) {
-			logStatus = status;
-			logCount++;
-		}
-	};
-	
-	
-	private int partHiddenCount = 0;
-	private IWorkbenchPartReference partHiddenRef = null;
-	private int partVisibleCount = 0;
-	private IWorkbenchPartReference partVisibleRef = null;
-	private int partActiveCount = 0;
-	private IWorkbenchPartReference partActiveRef = null;
-	IPartListener2 partListener2 = new IPartListener2() {
-		public void partActivated(IWorkbenchPartReference partRef) {
-			partActiveCount++;
-			partActiveRef = partRef;
-		}
-
-		public void partBroughtToTop(IWorkbenchPartReference partRef) {
-		}
-
-		public void partClosed(IWorkbenchPartReference partRef) {
-		}
-
-		public void partDeactivated(IWorkbenchPartReference partRef) {
-		}
-
-		public void partHidden(IWorkbenchPartReference partRef) {
-			partHiddenCount++;
-			partHiddenRef = partRef;
-		}
-
-		public void partInputChanged(IWorkbenchPartReference partRef) {
-		}
-
-		public void partOpened(IWorkbenchPartReference partRef) {
-		}
-
-		public void partVisible(IWorkbenchPartReference partRef) {
-			partVisibleCount++;
-			partVisibleRef = partRef;
-		}
-	};
-
-
-
-	public IWorkbenchPageTest(String testName) {
-		super(testName);
-	}
-
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		fWin = openTestWindow();
-		fActivePage = fWin.getActivePage();
-		logStatus = null;
-		logCount = 0;
-		Platform.addLogListener(openAndHideListener);
-	}
-
-	protected void doTearDown() throws Exception {
-		super.doTearDown();
-		if (proj != null) {
-			FileUtil.deleteProject(proj);
-			proj = null;
-		}
-		Platform.removeLogListener(openAndHideListener);
-	}
-
-	/**
-	 * Tests the new working set API.
-	 * 
-	 * @since 3.2
-	 */
-	public void testWorkingSets1() {
-		IWorkbenchPage page = fActivePage;
-		IWorkingSet[] sets = page.getWorkingSets();
-		assertNotNull(sets);
-		assertEquals(0, sets.length);
-
-		IWorkingSetManager manager = page.getWorkbenchWindow().getWorkbench()
-				.getWorkingSetManager();
-
-		IWorkingSet set1 = null, set2 = null;
-		try {
-			set1 = manager.createWorkingSet("w1", new IAdaptable[0]);
-			manager.addWorkingSet(set1);
-			set2 = manager.createWorkingSet("w2", new IAdaptable[0]);
-			manager.addWorkingSet(set2);
-
-			page.setWorkingSets(new IWorkingSet[] { set1 });
-			sets = page.getWorkingSets();
-
-			assertNotNull(sets);
-			assertEquals(1, sets.length);
-			assertEquals(set1, sets[0]);
-
-			page.setWorkingSets(new IWorkingSet[0]);
-			sets = page.getWorkingSets();
-			assertNotNull(sets);
-			assertEquals(0, sets.length);
-
-			page.setWorkingSets(new IWorkingSet[] { set1, set2 });
-			sets = page.getWorkingSets();
-
-			assertNotNull(sets);
-			assertEquals(2, sets.length);
-			Set realSet = new HashSet(Arrays.asList(sets));
-			assertTrue(realSet.contains(set1));
-			assertTrue(realSet.contains(set2));
-
-			page.setWorkingSets(new IWorkingSet[0]);
-			sets = page.getWorkingSets();
-			assertNotNull(sets);
-			assertEquals(0, sets.length);
-		} finally {
-			if (set1 != null)
-				manager.removeWorkingSet(set1);
-			if (set2 != null)
-				manager.removeWorkingSet(set2);
-		}
-	}
-
-	/**
-	 * Tests the new working set API.
-	 * 
-	 * @since 3.2
-	 */
-	public void testWorkingSets2() {
-		fActivePage.setWorkingSets(null);
-		IWorkingSet[] sets = fActivePage.getWorkingSets();
-		assertNotNull(sets);
-		assertEquals(0, sets.length);
-	}
-
-	/**
-	 * Tests the working set listeners.
-	 * 
-	 * @since 3.2
-	 */
-	public void testWorkingSets3() {
-		IWorkingSetManager manager = fActivePage.getWorkbenchWindow()
-				.getWorkbench().getWorkingSetManager();
-
-		IWorkingSet set1 = null;
-		final IWorkingSet[][] sets = new IWorkingSet[1][];
-		sets[0] = new IWorkingSet[0];
-		IPropertyChangeListener listener = new IPropertyChangeListener() {
-
-			public void propertyChange(PropertyChangeEvent event) {
-				IWorkingSet[] oldSets = (IWorkingSet[]) event.getOldValue();
-				assertTrue(Arrays.equals(sets[0], oldSets));
-				sets[0] = (IWorkingSet[]) event.getNewValue();
-			}
-		};
-		try {
-			set1 = manager.createWorkingSet("w1", new IAdaptable[0]);
-			manager.addWorkingSet(set1);
-
-			fActivePage.addPropertyChangeListener(listener);
-
-			fActivePage.setWorkingSets(new IWorkingSet[] { set1 });
-			fActivePage.setWorkingSets(new IWorkingSet[] {});
-			fActivePage.setWorkingSets(new IWorkingSet[] { set1 });
-
-			sets[0] = fActivePage.getWorkingSets();
-
-			assertNotNull(sets[0]);
-			assertEquals(1, sets[0].length);
-			assertEquals(set1, sets[0][0]);
-
-		} finally {
-			fActivePage.removePropertyChangeListener(listener);
-			if (set1 != null)
-				manager.removeWorkingSet(set1);
-		}
-	}
-
-	/**
-	 * Test the VIEW_VISIBLE parameter for showView, opening the view in the
-	 * stack that does not contain the active view. Ensures that the created
-	 * view is not the active part but is the top part in its stack.
-	 */
-	public void testView_VISIBLE2() {
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-		try {
-			page.setPerspective(WorkbenchPlugin.getDefault()
-					.getPerspectiveRegistry().findPerspectiveWithId(
-							"org.eclipse.ui.tests.api.ViewPerspective"));
-
-			// create a part to be active
-			IViewPart activePart = page.showView(MockViewPart.ID3);
-
-			IViewPart createdPart = page.showView(MockViewPart.ID2, null,
-					IWorkbenchPage.VIEW_VISIBLE);
-
-			IViewPart[] stack = page.getViewStack(createdPart);
-			assertEquals(2, stack.length);
-
-			assertEquals(createdPart, stack[0]);
-			assertEquals(page.findView(MockViewPart.ID), stack[1]);
-
-			assertTrue(page.isPartVisible(createdPart));
-
-			assertEquals(activePart, page.getActivePart());
-		} catch (PartInitException e) {
-			fail(e.getMessage());
-		}
-	}
-
-	/**
-	 * openEditor(IEditorInput input, String editorId, boolean activate)
-	 */
-	public void testOpenEditor4() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		final String id = MockEditorPart.ID1;
-		IEditorInput input = new FileEditorInput(FileUtil.createFile(
-				"test.mock1", proj));
-		MockPartListener listener = new MockPartListener();
-		fActivePage.addPartListener(listener);
-		CallHistory callTrace = listener.getCallHistory();
-
-		/*
-		 * javadoc: The editor type is determined by mapping editorId to an
-		 * editor extension registered with the workbench. javadoc: If activate ==
-		 * true the editor will be activated
-		 */
-		// open an editor with activation
-		// Start with a view active in order to verify that the editor gets
-		// activated
-		fActivePage.showView(IPageLayout.ID_PROBLEM_VIEW, null,
-				IWorkbenchPage.VIEW_ACTIVATE);
-		callTrace.clear();
-		IEditorPart editor = IDE.openEditor(fActivePage, input, id, true);
-		assertEquals(editor.getEditorInput(), input);
-		assertEquals(editor.getSite().getId(), id);
-		assertEquals(hasEditor(editor), true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-		assertEquals(callTrace.contains("partActivated"), true);
-
-		// we need another editor so that the editor under test can receive
-		// events.
-		// otherwise, events will be ignored.
-		IEditorPart extra = IDE.openEditor(fActivePage, FileUtil.createFile(
-				"aaaaa", proj));
-
-		// close the first editor after the second has opened; necessary for
-		// test to work with fix to PR 7743
-		fActivePage.closeEditor(editor, false);
-
-		// Start with a view active in order to verify that the editor does not
-		// get activated
-		// (note: regardless of the activate=false flag, the editor would always
-		// be activated
-		// if it is being opened in the same stack as the active editor. Making
-		// a view active
-		// initially tests the function of the activate flag)
-		fActivePage.showView(IPageLayout.ID_PROBLEM_VIEW, null,
-				IWorkbenchPage.VIEW_ACTIVATE);
-		callTrace.clear();
-		// open an editor without activation
-		editor = IDE.openEditor(fActivePage, input, id, false);
-
-		assertEquals(editor.getEditorInput(), input);
-		assertEquals(editor.getSite().getId(), id);
-		assertEquals(hasEditor(editor), true);
-		assertEquals(callTrace.contains("partActivated"), false);
-		assertEquals(callTrace.contains("partBroughtToTop"), true);
-
-		fActivePage.activate(extra);
-
-		/*
-		 * javadoc: If this page already has an editor open on the target object
-		 * that editor is brought to the front
-		 */
-		// open the editor under test second time without activation
-		fActivePage.showView(IPageLayout.ID_PROBLEM_VIEW, null,
-				IWorkbenchPage.VIEW_ACTIVATE);
-		callTrace.clear();
-		assertEquals(IDE.openEditor(fActivePage, input, id, false), editor);
-		assertEquals(callTrace.contains("partBroughtToTop"), true);
-		assertEquals(callTrace.contains("partActivated"), false);
-
-		// activate the other editor
-		fActivePage.activate(extra);
-
-		/*
-		 * javadoc: If activate == true the editor will be activated
-		 */
-		// open the editor under test second time with activation
-		fActivePage.showView(IPageLayout.ID_PROBLEM_VIEW, null,
-				IWorkbenchPage.VIEW_ACTIVATE);
-		callTrace.clear();
-		assertEquals(IDE.openEditor(fActivePage, input, id, true), editor);
-		assertEquals(callTrace.contains("partBroughtToTop"), true);
-		assertEquals(callTrace.contains("partActivated"), true);
-
-		/*
-		 * javadoc: If activate == false but another editor in the same stack
-		 * was active, the new editor will be activated regardless.
-		 */
-		// Close the old editor
-		fActivePage.closeEditor(editor, false);
-		// Ensure another editor in the stack is active
-		fActivePage.activate(extra);
-		callTrace.clear();
-		// Verify that the editor is still activated
-		IDE.openEditor(fActivePage, input, id, false);
-		assertEquals(callTrace.contains("partBroughtToTop"), true);
-		assertEquals(callTrace.contains("partActivated"), true);
-	}
-
-	/**
-	 * tests both of the following: setEditorAreaVisible() isEditorAreaVisible()
-	 */
-	public void testGet_SetEditorAreaVisible() throws Throwable {
-		fActivePage.setEditorAreaVisible(true);
-		assertTrue(fActivePage.isEditorAreaVisible() == true);
-
-		fActivePage.setEditorAreaVisible(false);
-		assertTrue(fActivePage.isEditorAreaVisible() == false);
-	}
-
-	/**
-	 * openEditor(IWorkbenchPage page, IFile input)
-	 */
-	public void testOpenEditor() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-
-		/*
-		 * javadoc: 1. The workbench editor registry is consulted to determine
-		 * if an editor extension has been registered for the file type. If so,
-		 * an instance of the editor extension is opened on the file
-		 */
-		IFile file = FileUtil.createFile("test.mock1", proj);
-		IEditorPart editor = IDE.openEditor(fActivePage, file);
-
-		boolean foundEditor = hasEditor(editor);
-		assertEquals(foundEditor, true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-		assertEquals(editor.getSite().getId(), fWorkbench.getEditorRegistry()
-				.getDefaultEditor(file.getName()).getId());
-
-		/*
-		 * javadoc: 2. Next, the native operating system will be consulted to
-		 * determine if a native editor exists for the file type. If so, a new
-		 * process is started and the native editor is opened on the file.
-		 */
-		// can not be tested
-		/*
-		 * javadoc: 3. If all else fails the file will be opened in a default
-		 * text editor.
-		 */
-
-		file = FileUtil.createFile("a.null and void", proj);
-		editor = IDE.openEditor(fActivePage, file);
-		if (editor != null) {//If it opened an external editor skip it (Vista issue)
-			assertEquals(hasEditor(editor), true);
-			assertEquals(fActivePage.getActiveEditor(), editor);
-			assertEquals(editor.getSite().getId(),
-					"org.eclipse.ui.DefaultTextEditor");
-
-			// open another editor to take the focus away from the first editor
-			IDE
-					.openEditor(fActivePage, FileUtil.createFile("test.mock2",
-							proj));
-
-			/*
-			 * javadoc: If this page already has an editor open on the target
-			 * object that editor is activated
-			 */
-			// open the editor second time.
-			assertEquals(editor, IDE.openEditor(fActivePage, file));
-			assertEquals(editor, fActivePage.getActiveEditor());
-		}
-	}
-
-	/**
-	 * openEditor(IWorkbenchPage page, IFile input, String editorID)
-	 */
-	public void testOpenEditor2() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		final IFile file = FileUtil.createFile("asfasdasdf", proj);
-		final String id = MockEditorPart.ID1;
-
-		/*
-		 * javadoc: The editor type is determined by mapping editorId to an
-		 * editor extension registered with the workbench.
-		 */
-		IEditorPart editor = IDE.openEditor(fActivePage, file, id);
-		assertEquals(editor.getSite().getId(), id);
-		assertEquals(hasEditor(editor), true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-
-		// open another editor to take the focus away from the first editor
-		IDE.openEditor(fActivePage, FileUtil.createFile("test.mock2", proj));
-
-		/*
-		 * javadoc: If this page already has an editor open on the target object
-		 * that editor is activated
-		 */
-		// open the first editor second time.
-		assertEquals(IDE.openEditor(fActivePage, file, id), editor);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-	}
-
-	/**
-	 * openEditor(IEditorInput input,String editorId)
-	 */
-	public void testOpenEditor3() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		final String id = MockEditorPart.ID1;
-		IEditorInput input = new FileEditorInput(FileUtil.createFile(
-				"test.mock1", proj));
-
-		/*
-		 * javadoc: The editor type is determined by mapping editorId to an
-		 * editor extension registered with the workbench
-		 */
-		IEditorPart editor = IDE.openEditor(fActivePage, input, id);
-		assertEquals(editor.getEditorInput(), input);
-		assertEquals(editor.getSite().getId(), id);
-		assertEquals(hasEditor(editor), true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-
-		// open another editor to take the focus away from the first editor
-		IDE.openEditor(fActivePage, FileUtil.createFile("test.mock2", proj));
-
-		/*
-		 * javadoc: If this page already has an editor open on the target object
-		 * that editor is activated
-		 */
-		// open the first editor second time.
-		assertEquals(IDE.openEditor(fActivePage, input, id), editor);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-	}
-
-	/**
-	 * openEditor(IMarker marker)
-	 */
-	public void testOpenEditor5() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		IMarker marker = FileUtil.createFile("aa.mock2", proj).createMarker(
-				IMarker.TASK);
-		CallHistory callTrace;
-
-		/*
-		 * javadoc: the cursor and selection state of the editor is then updated
-		 * from information recorded in the marker.
-		 */
-		// open the registered editor for the marker resource
-		IEditorPart editor = IDE.openEditor(fActivePage, marker);
-		callTrace = ((MockEditorPart) editor).getCallHistory();
-		assertEquals(editor.getSite().getId(), MockEditorPart.ID2);
-		assertEquals(hasEditor(editor), true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-		assertEquals(callTrace.contains("gotoMarker"), true);
-		fActivePage.closeEditor(editor, false);
-
-		/*
-		 * javadoc: If the marker contains an EDITOR_ID_ATTR attribute the
-		 * attribute value will be used to determine the editor type to be
-		 * opened
-		 */
-		marker.setAttribute(IDE.EDITOR_ID_ATTR, MockEditorPart.ID1);
-		editor = IDE.openEditor(fActivePage, marker);
-		callTrace = ((MockEditorPart) editor).getCallHistory();
-		assertEquals(editor.getSite().getId(), MockEditorPart.ID1);
-		assertEquals(hasEditor(editor), true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-		assertEquals(callTrace.contains("gotoMarker"), true);
-		// do not close the editor this time
-
-		/*
-		 * javdoc: If this page already has an editor open on the target object
-		 * that editor is activated
-		 */
-		callTrace.clear();
-		assertEquals(IDE.openEditor(fActivePage, marker), editor);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-		assertEquals(callTrace.contains("gotoMarker"), true);
-		fActivePage.closeEditor(editor, false);
-	}
-
-	/**
-	 * openEditor(IMarker marker, boolean activate)
-	 */
-	public void testOpenEditor6() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		IMarker marker = FileUtil.createFile("aa.mock2", proj).createMarker(
-				IMarker.TASK);
-		MockPartListener listener = new MockPartListener();
-		fActivePage.addPartListener(listener);
-		CallHistory listenerCall = listener.getCallHistory();
-		CallHistory editorCall;
-
-		// we need another editor so that the editor under test can receive
-		// events.
-		// otherwise, events will be ignored.
-		IEditorPart extra = IDE.openEditor(fActivePage, FileUtil.createFile(
-				"aaaaa", proj));
-
-		/*
-		 * javadoc: If activate == true the editor will be activated
-		 */
-		// open the registered editor for the marker resource with activation
-		IEditorPart editor = IDE.openEditor(fActivePage, marker, true);
-		editorCall = ((MockEditorPart) editor).getCallHistory();
-		assertEquals(editor.getSite().getId(), MockEditorPart.ID2);
-		assertEquals(hasEditor(editor), true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-
-		/*
-		 * javadoc: the cursor and selection state of the editor is then updated
-		 * from information recorded in the marker.
-		 */
-		assertEquals(editorCall.contains("gotoMarker"), true);
-		fActivePage.closeEditor(editor, false);
-
-		fActivePage.activate(extra);
-
-		// open the registered editor for the marker resource without activation
-		fActivePage.showView(IPageLayout.ID_PROBLEM_VIEW, null,
-				IWorkbenchPage.VIEW_ACTIVATE);
-		listenerCall.clear();
-		editor = IDE.openEditor(fActivePage, marker, false);
-		editorCall = ((MockEditorPart) editor).getCallHistory();
-		assertEquals(editor.getSite().getId(), MockEditorPart.ID2);
-		assertEquals(hasEditor(editor), true);
-		assertEquals(listenerCall.contains("partBroughtToTop"), true);
-		assertEquals(listenerCall.contains("partActivated"), false);
-		assertEquals(editorCall.contains("gotoMarker"), true);
-		fActivePage.closeEditor(editor, false);
-
-		/*
-		 * javadoc: If the marker contains an EDITOR_ID_ATTR attribute the
-		 * attribute value will be used to determine the editor type to be
-		 * opened
-		 */
-		String id = MockEditorPart.ID1;
-		marker.setAttribute(IDE.EDITOR_ID_ATTR, id);
-
-		// open an editor with activation
-		listenerCall.clear();
-
-		editor = IDE.openEditor(fActivePage, marker, true);
-		editorCall = ((MockEditorPart) editor).getCallHistory();
-		assertEquals(editor.getSite().getId(), id);
-		assertEquals(hasEditor(editor), true);
-		assertEquals(fActivePage.getActiveEditor(), editor);
-		assertEquals(editorCall.contains("gotoMarker"), true);
-		fActivePage.closeEditor(editor, false);
-
-		fActivePage.activate(extra);
-
-		// open an editor without activation
-		fActivePage.showView(IPageLayout.ID_PROBLEM_VIEW, null,
-				IWorkbenchPage.VIEW_ACTIVATE);
-		listenerCall.clear();
-		editor = IDE.openEditor(fActivePage, marker, false);
-		editorCall = ((MockEditorPart) editor).getCallHistory();
-		assertEquals(editor.getSite().getId(), id);
-		assertEquals(hasEditor(editor), true);
-		assertEquals(editorCall.contains("gotoMarker"), true);
-		assertEquals(listenerCall.contains("partActivated"), false);
-		assertEquals(listenerCall.contains("partBroughtToTop"), true);
-		// do not close the editor this time
-
-		fActivePage.activate(extra);
-		/*
-		 * javadoc: If this page already has an editor open on the target object
-		 * that editor is brought to front Note: we need to make a non-editor
-		 * active first or bringing the editor to front would activate it
-		 */
-		// open the editor second time without activation
-		fActivePage.showView(IPageLayout.ID_PROBLEM_VIEW, null,
-				IWorkbenchPage.VIEW_ACTIVATE);
-		listenerCall.clear();
-		assertEquals(IDE.openEditor(fActivePage, marker, false), editor);
-		assertEquals(listenerCall.contains("partBroughtToTop"), true);
-		assertEquals(listenerCall.contains("partActivated"), false);
-
-		fActivePage.activate(extra);
-
-		/*
-		 * javdoc: If activate == true the editor will be activated
-		 */
-		// open the editor second time with activation
-		listenerCall.clear();
-		assertEquals(IDE.openEditor(fActivePage, marker, true), editor);
-		assertEquals(editorCall.contains("gotoMarker"), true);
-		assertEquals(listenerCall.contains("partBroughtToTop"), true);
-		assertEquals(listenerCall.contains("partActivated"), true);
-
-		/*
-		 * javadoc: If activate == false but another editor in the same stack
-		 * was active, the new editor will be activated regardless.
-		 */
-		// Close the old editor
-		fActivePage.closeEditor(editor, false);
-		// Ensure another editor in the stack is active
-		fActivePage.activate(extra);
-		listenerCall.clear();
-		// Verify that the editor is still activated
-		IDE.openEditor(fActivePage, marker, false);
-		assertEquals(listenerCall.contains("partBroughtToTop"), true);
-		assertEquals(listenerCall.contains("partActivated"), true);
-	}
-
-	public void testGetPerspective() throws Throwable {
-		assertNotNull(fActivePage.getPerspective());
-
-		IWorkbenchPage page = fWin.openPage(EmptyPerspective.PERSP_ID,
-				getPageInput());
-		assertEquals(EmptyPerspective.PERSP_ID, page.getPerspective().getId());
-	}
-
-	public void testSetPerspective() throws Throwable {
-		IPerspectiveDescriptor per = PlatformUI.getWorkbench()
-				.getPerspectiveRegistry().findPerspectiveWithId(
-						EmptyPerspective.PERSP_ID);
-		fActivePage.setPerspective(per);
-		assertEquals(per, fActivePage.getPerspective());
-	}
-
-	public void testGetLabel() {
-		assertNotNull(fActivePage.getLabel());
-	}
-
-	public void testGetInput() throws Throwable {
-		IAdaptable input = getPageInput();
-		IWorkbenchPage page = fWin.openPage(input);
-		assertEquals(input, page.getInput());
-	}
-
-	public void testActivate() throws Throwable {
-		MockViewPart part = (MockViewPart) fActivePage
-				.showView(MockViewPart.ID);
-		MockViewPart part2 = (MockViewPart) fActivePage
-				.showView(MockViewPart.ID2);
-
-		MockPartListener listener = new MockPartListener();
-		fActivePage.addPartListener(listener);
-		fActivePage.activate(part);
-
-		CallHistory callTrace;
-
-		callTrace = part2.getCallHistory();
-		callTrace.clear();
-		fActivePage.activate(part2);
-		assertTrue(callTrace.contains("setFocus"));
-		assertTrue(listener.getCallHistory().contains("partActivated"));
-
-		callTrace = part.getCallHistory();
-		callTrace.clear();
-		fActivePage.activate(part);
-		assertTrue(callTrace.contains("setFocus"));
-		assertTrue(listener.getCallHistory().contains("partActivated"));
-	}
-
-	public void testBringToTop() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		IEditorPart part = IDE.openEditor(fActivePage, FileUtil.createFile(
-				"a.mock1", proj));
-		IEditorPart part2 = IDE.openEditor(fActivePage, FileUtil.createFile(
-				"b.mock1", proj));
-
-		MockPartListener listener = new MockPartListener();
-		fActivePage.addPartListener(listener);
-		CallHistory callTrace = listener.getCallHistory();
-
-		// at this point, part2 is active
-		fActivePage.bringToTop(part);
-		assertEquals(callTrace.contains("partBroughtToTop"), true);
-
-		callTrace.clear();
-		fActivePage.bringToTop(part2);
-		assertEquals(callTrace.contains("partBroughtToTop"), true);
-	}
-
-	public void testGetWorkbenchWindow() {
-		/*
-		 * Commented out because until test case can be updated to work with new
-		 * window/page/perspective implementation
-		 * 
-		 * assertEquals(fActivePage.getWorkbenchWindow(), fWin); IWorkbenchPage
-		 * page = openTestPage(fWin); assertEquals(page.getWorkbenchWindow(),
-		 * fWin);
-		 */
-	}
-
-	public void testShowView() throws Throwable {
-		/*
-		 * javadoc: Shows a view in this page and give it focus
-		 */
-		MockViewPart view = (MockViewPart) fActivePage
-				.showView(MockViewPart.ID);
-		assertNotNull(view);
-		assertTrue(view.getCallHistory().verifyOrder(
-				new String[] { "init", "createPartControl", "setFocus" }));
-
-		fActivePage.showView(MockViewPart.ID2);
-
-		/*
-		 * javadoc: If the view is already visible, it is given focus
-		 */
-		CallHistory callTrace = view.getCallHistory();
-		callTrace.clear();
-		assertEquals(fActivePage.showView(MockViewPart.ID), view);
-		assertEquals(callTrace.contains("setFocus"), true);
-	}
-
-	/**
-	 * Tests showing multi-instance views (docked normally).
-	 */
-	public void testShowViewMult() throws Throwable {
-		/*
-		 * javadoc: Shows the view identified by the given view id and secondary
-		 * id in this page and gives it focus. This allows multiple instances of
-		 * a particular view to be created. They are disambiguated using the
-		 * secondary id.
-		 */
-		MockViewPart view = (MockViewPart) fActivePage
-				.showView(MockViewPart.IDMULT);
-		assertNotNull(view);
-		assertTrue(view.getCallHistory().verifyOrder(
-				new String[] { "init", "createPartControl", "setFocus" }));
-		MockViewPart view2 = (MockViewPart) fActivePage.showView(
-				MockViewPart.IDMULT, "2", IWorkbenchPage.VIEW_ACTIVATE);
-		assertNotNull(view2);
-		assertTrue(view2.getCallHistory().verifyOrder(
-				new String[] { "init", "createPartControl", "setFocus" }));
-		assertTrue(!view.equals(view2));
-		MockViewPart view3 = (MockViewPart) fActivePage.showView(
-				MockViewPart.IDMULT, "3", IWorkbenchPage.VIEW_ACTIVATE);
-		assertNotNull(view3);
-		assertTrue(view3.getCallHistory().verifyOrder(
-				new String[] { "init", "createPartControl", "setFocus" }));
-		assertTrue(!view.equals(view3));
-		assertTrue(!view2.equals(view3));
-
-		/*
-		 * javadoc: If there is a view identified by the given view id and
-		 * secondary id already open in this page, it is given focus.
-		 */
-		CallHistory callTrace = view.getCallHistory();
-		callTrace.clear();
-		assertEquals(fActivePage.showView(MockViewPart.IDMULT), view);
-		assertEquals(callTrace.contains("setFocus"), true);
-		CallHistory callTrace2 = view2.getCallHistory();
-		callTrace.clear();
-		callTrace2.clear();
-		assertEquals(fActivePage.showView(MockViewPart.IDMULT, "2",
-				IWorkbenchPage.VIEW_ACTIVATE), view2);
-		assertEquals(callTrace2.contains("setFocus"), true);
-		assertEquals(callTrace.contains("setFocus"), false);
-		CallHistory callTrace3 = view3.getCallHistory();
-		callTrace.clear();
-		callTrace2.clear();
-		callTrace3.clear();
-		assertEquals(fActivePage.showView(MockViewPart.IDMULT, "3",
-				IWorkbenchPage.VIEW_ACTIVATE), view3);
-		assertEquals(callTrace3.contains("setFocus"), true);
-		assertEquals(callTrace.contains("setFocus"), false);
-		assertEquals(callTrace2.contains("setFocus"), false);
-
-		/*
-		 * javadoc: If a secondary id is given, the view must allow multiple
-		 * instances by having specified allowMultiple="true" in its extension.
-		 */
-		boolean exceptionThrown = false;
-		try {
-			fActivePage.showView(MockViewPart.ID, "2",
-					IWorkbenchPage.VIEW_ACTIVATE);
-		} catch (PartInitException e) {
-			assertEquals(e.getMessage().indexOf("mult") != -1, true);
-			exceptionThrown = true;
-		}
-		assertEquals(exceptionThrown, true);
-	}
-
-	/**
-	 * Tests showing multi-instance views (as fast views). This is a regression
-	 * test for bug 76669 - [Perspectives] NullPointerException in
-	 * Perspective.getFastViewWidthRatio()
-	 */
-	public void testShowViewMultFast() throws Throwable {
-		/*
-		 * javadoc: Shows the view identified by the given view id and secondary
-		 * id in this page and gives it focus. This allows multiple instances of
-		 * a particular view to be created. They are disambiguated using the
-		 * secondary id.
-		 */
-		MockViewPart view = (MockViewPart) fActivePage
-				.showView(MockViewPart.IDMULT);
-		assertNotNull(view);
-		assertTrue(view.getCallHistory().verifyOrder(
-				new String[] { "init", "createPartControl", "setFocus" }));
-		MockViewPart view2 = (MockViewPart) fActivePage.showView(
-				MockViewPart.IDMULT, "2", IWorkbenchPage.VIEW_ACTIVATE);
-		assertNotNull(view2);
-		assertTrue(view2.getCallHistory().verifyOrder(
-				new String[] { "init", "createPartControl", "setFocus" }));
-		assertTrue(!view.equals(view2));
-
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-		IViewReference ref = (IViewReference) page.getReference(view);
-		IViewReference ref2 = (IViewReference) page.getReference(view2);
-		page.addFastView(ref);
-		page.addFastView(ref2);
-
-		page.activate(view);
-		assertEquals(view, page.getActivePart());
-
-		page.activate(view2);
-		assertEquals(view2, page.getActivePart());
-	}
-
-	/**
-	 * Tests saving the page state when there is a fast view that is also a
-	 * multi-instance view. This is a regression test for bug 76669 -
-	 * [Perspectives] NullPointerException in
-	 * Perspective.getFastViewWidthRatio()
-	 */
-	public void testBug76669() throws Throwable {
-		MockViewPart view = (MockViewPart) fActivePage
-				.showView(MockViewPart.IDMULT);
-		MockViewPart view2 = (MockViewPart) fActivePage.showView(
-				MockViewPart.IDMULT, "2", IWorkbenchPage.VIEW_ACTIVATE);
-
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-		IViewReference ref = (IViewReference) page.getReference(view);
-		IViewReference ref2 = (IViewReference) page.getReference(view2);
-		page.addFastView(ref);
-		page.addFastView(ref2);
-
-		IMemento memento = XMLMemento.createWriteRoot("page");
-		page.saveState(memento);
-		IMemento persps = memento.getChild("perspectives");
-		IMemento persp = persps.getChildren("perspective")[0];
-		IMemento[] fastViews = persp.getChild("fastViews").getChildren("view");
-		assertEquals(2, fastViews.length);
-	}
-
-	public void testFindView() throws Throwable {
-		String id = MockViewPart.ID3;
-		// id of valid, but not open view
-		assertNull(fActivePage.findView(id));
-
-		IViewPart view = fActivePage.showView(id);
-		assertEquals(fActivePage.findView(id), view);
-
-		// close view
-		fActivePage.hideView(view);
-		assertNull(fActivePage.findView(id));
-	}
-
-	public void testFindViewReference() throws Throwable {
-		fActivePage.getWorkbenchWindow().getWorkbench().showPerspective(
-				SessionPerspective.ID, fActivePage.getWorkbenchWindow());
-		assertNull(fActivePage.findViewReference(MockViewPart.ID4));
-
-		fActivePage.showView(MockViewPart.ID4);
-		assertNotNull(fActivePage.findViewReference(MockViewPart.ID4));
-	}
-
-	public void testGetViews() throws Throwable {
-		int totalBefore = fActivePage.getViewReferences().length;
-
-		IViewPart view = fActivePage.showView(MockViewPart.ID2);
-		assertEquals(hasView(view), true);
-		assertEquals(fActivePage.getViewReferences().length, totalBefore + 1);
-
-		fActivePage.hideView(view);
-		assertEquals(hasView(view), false);
-		assertEquals(fActivePage.getViewReferences().length, totalBefore);
-	}
-
-	public void testHideViewWithPart() throws Throwable {
-		// test that nothing bad happens with a null parameter
-		try {
-			fActivePage.hideView((IViewPart) null);
-		} catch (RuntimeException e) {
-			fail(e.getMessage());
-		}
-
-		IViewPart view = fActivePage.showView(MockViewPart.ID3);
-
-		fActivePage.hideView(view);
-		CallHistory callTrace = ((MockViewPart) view).getCallHistory();
-		assertTrue(callTrace.contains("dispose"));
-	}
-
-	public void testHideViewWithReference() throws Throwable {
-		// test that nothing bad happens with a null parameter
-		try {
-			fActivePage.hideView((IViewReference) null);
-		} catch (RuntimeException e) {
-			fail(e.getMessage());
-		}
-
-		IViewPart view = fActivePage.showView(MockViewPart.ID4);
-		IViewReference ref = fActivePage.findViewReference(MockViewPart.ID4);
-		fActivePage.hideView(ref);
-		CallHistory callTrace = ((MockViewPart) view).getCallHistory();
-		assertTrue(callTrace.contains("dispose"));
-
-	}
-
-	public void testHideSaveableView() throws Throwable {
-		String viewId = SaveableMockViewPart.ID;
-		SaveableMockViewPart view = (SaveableMockViewPart) fActivePage
-				.showView(viewId);
-		fActivePage.hideView(view);
-		CallHistory callTrace = view.getCallHistory();
-		assertTrue(callTrace.contains("isDirty"));
-		assertTrue(callTrace.contains("dispose"));
-		assertEquals(fActivePage.findView(viewId), null);
-
-		try {
-			SaveableHelper.testSetAutomatedResponse(1); // No
-			view = (SaveableMockViewPart) fActivePage.showView(viewId);
-			view.setDirty(true);
-			fActivePage.hideView(view);
-			callTrace = view.getCallHistory();
-			assertTrue(callTrace.contains("isDirty"));
-			assertFalse(callTrace.contains("doSave"));
-			assertTrue(callTrace.contains("dispose"));
-			assertEquals(fActivePage.findView(viewId), null);
-
-			SaveableHelper.testSetAutomatedResponse(2); // Cancel
-			view = (SaveableMockViewPart) fActivePage.showView(viewId);
-			view.setDirty(true);
-			fActivePage.hideView(view);
-			callTrace = view.getCallHistory();
-			assertTrue(callTrace.contains("isDirty"));
-			assertFalse(callTrace.contains("doSave"));
-			assertFalse(callTrace.contains("dispose"));
-			assertEquals(fActivePage.findView(viewId), view);
-
-			SaveableHelper.testSetAutomatedResponse(0); // Yes
-			view = (SaveableMockViewPart) fActivePage.showView(viewId);
-			view.setDirty(true);
-			fActivePage.hideView(view);
-			callTrace = view.getCallHistory();
-			assertTrue(callTrace.contains("isDirty"));
-			assertTrue(callTrace.contains("doSave"));
-			assertTrue(callTrace.contains("dispose"));
-			assertEquals(fActivePage.findView(viewId), null);
-
-			// don't leave the view showing, or the UI will block on window
-			// close
-		} finally {
-			SaveableHelper.testSetAutomatedResponse(-1); // restore default
-			// (prompt)
-		}
-	}
-
-	/**
-	 * Tests that a close will fall back to the default if the view returns
-	 * ISaveable2.DEFAULT.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testCloseWithSaveNeeded() throws Throwable {
-		String viewId = UserSaveableMockViewPart.ID;
-		UserSaveableMockViewPart view = (UserSaveableMockViewPart) fActivePage
-				.showView(viewId);
-		fActivePage.hideView(view);
-
-		UserSaveableMockViewPart view2 = null;
-
-		CallHistory callTrace = view.getCallHistory();
-		assertTrue(callTrace.contains("isDirty"));
-		assertTrue(callTrace.contains("dispose"));
-		assertEquals(fActivePage.findView(UserSaveableMockViewPart.ID), null);
-
-		try {
-			SaveableHelper.testSetAutomatedResponse(3); // DEFAULT
-			view = (UserSaveableMockViewPart) fActivePage.showView(viewId);
-			view.setDirty(true);
-			view2 = (UserSaveableMockViewPart) fActivePage.showView(viewId,
-					"2", IWorkbenchPage.VIEW_ACTIVATE);
-			assertNotNull(view2);
-			view2.setDirty(true);
-
-			WorkbenchPage page = (WorkbenchPage) fActivePage;
-			page.getEditorManager().saveAll(true, false, false);
-
-			assertFalse(view.isDirty());
-			assertFalse(view2.isDirty());
-
-			callTrace = view.getCallHistory();
-			fActivePage.hideView(view);
-			fActivePage.hideView(view2);
-
-			assertTrue(callTrace.contains("isDirty"));
-			assertTrue(callTrace.contains("doSave"));
-			assertEquals(fActivePage.findView(viewId), null);
-
-			// don't leave the view showing, or the UI will block on window
-			// close
-		} finally {
-			SaveableHelper
-					.testSetAutomatedResponse(SaveableHelper.USER_RESPONSE); // restore
-			// default
-			// (prompt)
-		}
-	}
-
-	/**
-	 * Tests that a close will fall back to the default if the view returns
-	 * ISaveable2.DEFAULT.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testSaveEffectsSharedModel() throws Throwable {
-		String viewId = UserSaveableSharedViewPart.ID;
-		UserSaveableSharedViewPart view = null;
-
-		UserSaveableSharedViewPart view2 = null;
-
-		assertEquals(fActivePage.findView(UserSaveableSharedViewPart.ID), null);
-
-		try {
-			SaveableHelper.testSetAutomatedResponse(3); // DEFAULT
-			UserSaveableSharedViewPart.SharedModel model = new UserSaveableSharedViewPart.SharedModel();
-			view = (UserSaveableSharedViewPart) fActivePage.showView(viewId);
-			view.setSharedModel(model);
-
-			view2 = (UserSaveableSharedViewPart) fActivePage.showView(viewId,
-					"2", IWorkbenchPage.VIEW_ACTIVATE);
-			assertNotNull(view2);
-			view2.setSharedModel(model);
-
-			WorkbenchPage page = (WorkbenchPage) fActivePage;
-			page.getEditorManager().saveAll(true, false, false);
-
-			assertFalse(view.isDirty());
-			assertFalse(view2.isDirty());
-
-			CallHistory callTrace = view.getCallHistory();
-			CallHistory call2 = view2.getCallHistory();
-
-			assertTrue(callTrace.contains("isDirty"));
-			assertTrue(call2.contains("isDirty"));
-			assertTrue("At least one should call doSave", callTrace
-					.contains("doSave")
-					|| call2.contains("doSave"));
-			assertFalse("Both should not call doSave", callTrace
-					.contains("doSave")
-					&& call2.contains("doSave"));
-
-			// don't leave the view showing, or the UI will block on window
-			// close
-		} finally {
-			SaveableHelper
-					.testSetAutomatedResponse(SaveableHelper.USER_RESPONSE); // restore
-			// default
-			// (prompt)
-			fActivePage.hideView(view);
-			fActivePage.hideView(view2);
-		}
-	}
-
-	public void testClose() throws Throwable {
-		IWorkbenchPage page = openTestPage(fWin);
-
-		proj = FileUtil.createProject("testOpenEditor");
-		final IFile file = FileUtil.createFile("aaa.mock1", proj);
-		IEditorPart editor = IDE.openEditor(page, file);
-		CallHistory callTrace = ((MockEditorPart) editor).getCallHistory();
-		callTrace.clear();
-
-		/*
-		 * javadoc: If the page has open editors with unsaved content and save
-		 * is true, the user will be given the opportunity to save them
-		 */
-		assertEquals(page.close(), true);
-		assertEquals(callTrace
-				.verifyOrder(new String[] { "isDirty", "dispose" }), true);
-		assertEquals(fWin.getActivePage(), fActivePage);
-	}
-
-	public void testCloseEditor() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		final IFile file = FileUtil.createFile("test.mock1", proj);
-		IEditorPart editor;
-		CallHistory callTrace;
-		MockEditorPart mock;
-
-		/*
-		 * javadoc: Parameters: save - true to save the editor contents if
-		 * required (recommended)
-		 */
-		// create a clean editor that needs to be saved on closing
-		editor = IDE.openEditor(fActivePage, file);
-		mock = (MockEditorPart) editor;
-		mock.setSaveNeeded(true);
-		callTrace = mock.getCallHistory();
-		callTrace.clear();
-		// close the editor with save confirmation
-		assertEquals(fActivePage.closeEditor(editor, true), true);
-		assertEquals(callTrace
-				.verifyOrder(new String[] { "isDirty", "dispose" }), true);
-
-		/*
-		 * javadoc: If the editor has unsaved content and save is true, the user
-		 * will be given the opportunity to save it.
-		 */
-		// can't be tested
-		/*
-		 * javadoc: Parameters: save - false to discard any unsaved changes
-		 */
-		// create a dirty editor
-		editor = IDE.openEditor(fActivePage, file);
-		mock = (MockEditorPart) editor;
-		mock.setDirty(true);
-		mock.setSaveNeeded(true);
-		callTrace = mock.getCallHistory();
-		callTrace.clear();
-		// close the editor and discard changes
-		assertEquals(fActivePage.closeEditor(editor, false), true);
-		assertEquals(callTrace.contains("isSaveOnCloseNeeded"), false);
-		/*
-		 * It is possible that some action may query the isDirty value of the
-		 * editor to update its enabled state. There is nothing wrong in doing
-		 * that, so do not test for no isDirty call here.
-		 * 
-		 * assertEquals(callTrace.contains( "isDirty"), false);
-		 */
-		assertEquals(callTrace.contains("doSave"), false);
-		assertEquals(callTrace.contains("dispose"), true);
-	}
-
-	public void testCloseEditors() throws Throwable {
-		int total = 5;
-		final IFile[] files = new IFile[total];
-		IEditorPart[] editors = new IEditorPart[total];
-		IEditorReference[] editorRefs = new IEditorReference[total];
-		CallHistory[] callTraces = new CallHistory[total];
-		MockEditorPart[] mocks = new MockEditorPart[total];
-
-		proj = FileUtil.createProject("testCloseEditors");
-		for (int i = 0; i < total; i++)
-			files[i] = FileUtil.createFile(i + ".mock2", proj);
-
-		/*
-		 * javadoc: If the page has open editors with unsaved content and save
-		 * is true, the user will be given the opportunity to save them.
-		 */
-		// close all clean editors with confirmation
-		for (int i = 0; i < total; i++) {
-			editors[i] = IDE.openEditor(fActivePage, files[i]);
-			callTraces[i] = ((MockEditorPart) editors[i]).getCallHistory();
-		}
-
-		editorRefs = fActivePage.getEditorReferences();
-		assertEquals(fActivePage.closeEditors(editorRefs, true), true);
-		for (int i = 0; i < total; i++) {
-			assertEquals(callTraces[i].contains("isDirty"), true);
-			assertEquals(callTraces[i].contains("doSave"), false);
-			callTraces[i].clear();
-		}
-
-		// close all dirty editors with confirmation
-		// can't be tested
-
-		// close all dirty editors discarding them
-		for (int i = 0; i < total; i++) {
-			editors[i] = IDE.openEditor(fActivePage, files[i]);
-			mocks[i] = (MockEditorPart) editors[i];
-			mocks[i].setDirty(true);
-			callTraces[i] = mocks[i].getCallHistory();
-		}
-		editorRefs = fActivePage.getEditorReferences();
-		assertEquals(fActivePage.closeEditors(editorRefs, false), true);
-		for (int i = 0; i < total; i++) {
-			assertEquals(callTraces[i].contains("doSave"), false);
-		}
-
-		// close empty array of editors
-		total = 1;
-		for (int i = 0; i < total; i++) {
-			editors[i] = IDE.openEditor(fActivePage, files[i]);
-			mocks[i] = (MockEditorPart) editors[i];
-			mocks[i].setDirty(true);
-			callTraces[i] = mocks[i].getCallHistory();
-		}
-		// empty array test
-		editorRefs = new IEditorReference[0];
-		assertEquals(fActivePage.closeEditors(editorRefs, true), true);
-		for (int i = 0; i < total; i++) {
-			assertEquals(callTraces[i].contains("isDirty"), true);
-			assertEquals(callTraces[i].contains("doSave"), false);
-			callTraces[i].clear();
-		}
-
-		// close the last remaining editor, with save=false
-		editorRefs = fActivePage.getEditorReferences();
-		fActivePage.closeEditors(editorRefs, false);
-	}
-
-	public void testCloseAllEditors() throws Throwable {
-		int total = 5;
-		final IFile[] files = new IFile[total];
-		IEditorPart[] editors = new IEditorPart[total];
-		CallHistory[] callTraces = new CallHistory[total];
-		MockEditorPart[] mocks = new MockEditorPart[total];
-
-		proj = FileUtil.createProject("testOpenEditor");
-		for (int i = 0; i < total; i++)
-			files[i] = FileUtil.createFile(i + ".mock2", proj);
-
-		/*
-		 * javadoc: If the page has open editors with unsaved content and save
-		 * is true, the user will be given the opportunity to save them.
-		 */
-		// close all clean editors with confirmation
-		for (int i = 0; i < total; i++) {
-			editors[i] = IDE.openEditor(fActivePage, files[i]);
-			callTraces[i] = ((MockEditorPart) editors[i]).getCallHistory();
-		}
-		assertEquals(fActivePage.closeAllEditors(true), true);
-		for (int i = 0; i < total; i++) {
-			assertEquals(callTraces[i].contains("isDirty"), true);
-			assertEquals(callTraces[i].contains("doSave"), false);
-			callTraces[i].clear();
-		}
-
-		// close all dirty editors with confirmation
-		// can't be tested
-
-		// close all dirty editors discarding them
-		for (int i = 0; i < total; i++) {
-			editors[i] = IDE.openEditor(fActivePage, files[i]);
-			mocks[i] = (MockEditorPart) editors[i];
-			mocks[i].setDirty(true);
-			callTraces[i] = mocks[i].getCallHistory();
-		}
-		assertEquals(fActivePage.closeAllEditors(false), true);
-		for (int i = 0; i < total; i++) {
-			assertEquals(callTraces[i].contains("doSave"), false);
-		}
-	}
-
-	public void testSaveEditor() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		final IFile file = FileUtil.createFile("test.mock1", proj);
-		IEditorPart editor;
-		CallHistory callTrace;
-		MockEditorPart mock;
-
-		// create a clean editor
-		editor = IDE.openEditor(fActivePage, file);
-		mock = (MockEditorPart) editor;
-		callTrace = mock.getCallHistory();
-		callTrace.clear();
-
-		/*
-		 * javadoc: Saves the contents of the given editor if dirty. If not,
-		 * this method returns without effect
-		 */
-		// save the clean editor with confirmation
-		assertEquals(fActivePage.saveEditor(editor, true), true);
-		assertEquals(callTrace.contains("isDirty"), true);
-		assertEquals(callTrace.contains("doSave"), false);
-
-		/*
-		 * javadoc: If confirm is true the user is prompted to confirm the
-		 * command.
-		 */
-		// can't be tested
-		/*
-		 * javadoc: Otherwise, the save happens without prompt.
-		 */
-		// save the clean editor without confirmation
-		assertEquals(fActivePage.saveEditor(editor, false), true);
-		assertEquals(callTrace.contains("isDirty"), true);
-		assertEquals(callTrace.contains("doSave"), false);
-
-		// save the dirty editor without confirmation
-		mock.setDirty(true);
-		callTrace.clear();
-		assertEquals(fActivePage.saveEditor(editor, false), true);
-		assertEquals(callTrace
-				.verifyOrder(new String[] { "isDirty", "doSave" }), true);
-	}
-
-	public void testIDESaveAllEditors() throws Throwable {
-		int total = 3;
-
-		final IFile[] files = new IFile[total];
-		IEditorPart[] editors = new IEditorPart[total];
-		CallHistory[] callTraces = new CallHistory[total];
-		MockEditorPart[] mocks = new MockEditorPart[total];
-
-		proj = FileUtil.createProject("testOpenEditor");
-		for (int i = 0; i < total; i++) {
-			files[i] = FileUtil.createFile(i + ".mock2", proj);
-			editors[i] = IDE.openEditor(fActivePage, files[i]);
-			mocks[i] = (MockEditorPart) editors[i];
-			callTraces[i] = mocks[i].getCallHistory();
-		}
-
-		/*
-		 * javadoc: If there are no dirty editors this method returns without
-		 * effect. javadoc: If confirm is true the user is prompted to confirm
-		 * the command
-		 */
-		// save all clean editors with confirmation
-		assertEquals(IDE.saveAllEditors(new IResource[] { proj }, true), true);
-		for (int i = 0; i < total; i++) {
-			assertEquals(callTraces[i].contains("isDirty"), true);
-			assertEquals(callTraces[i].contains("doSave"), false);
-			callTraces[i].clear();
-		}
-
-		// save all dirty editors with confirmation can't be tested
-
-		/*
-		 * javadoc: Parameters: confirm - false to save unsaved changes without
-		 * asking
-		 */
-		// save all clean editors without confirmation
-		assertEquals(IDE.saveAllEditors(new IResource[] { proj }, false), true);
-		for (int i = 0; i < total; i++) {
-			assertEquals(callTraces[i].contains("isDirty"), true);
-			assertEquals(callTraces[i].contains("doSave"), false);
-			callTraces[i].clear();
-		}
-
-		// save all dirty editors with resource that IS NOT a parent
-		// of the contents of the dirty editors without confirmation, this
-		// should not
-		// save any as they are not parented by the resource provided
-		for (int i = 0; i < total; i++)
-			mocks[i].setDirty(true);
-
-		IResource emptyProj = FileUtil
-				.createProject("testOpenEditorEmptyProject");
-		assertEquals(IDE.saveAllEditors(new IResource[] { emptyProj }, false),
-				true);
-		for (int i = 0; i < total; i++) {
-			// the editors were not in the empty project hence still dirty
-			assertEquals(mocks[i].isDirty(), true);
-			callTraces[i].clear();
-		}
-
-		// save all dirty editors with resource that IS a parent
-		// of the contents of the editors without confirmation, this should
-		// save them as they are parented by the resource provided
-		assertEquals(IDE.saveAllEditors(new IResource[] { proj }, false), true);
-		for (int i = 0; i < total; i++) {
-			// the editors were not in the empty project hence still dirty
-			assertEquals(mocks[i].isDirty(), false);
-			assertEquals(callTraces[i].contains("isDirty"), true);
-			assertEquals(callTraces[i].contains("doSave"), true);
-			callTraces[i].clear();
-		}
-
-		// save all dirty editors with resource that IS NOT a parent
-		// of the contents of the dirty editors without confirmation, this
-		// should not
-		// save any as they are not parented by the resource provided
-		for (int i = 0; i < total; i++)
-			mocks[i].setDirty(true);
-		assertEquals(IDE.saveAllEditors(new IResource[] {}, false), true);
-		for (int i = 0; i < total; i++) {
-			// the editors were not in the empty project hence still dirty
-			assertEquals(mocks[i].isDirty(), true);
-			callTraces[i].clear();
-		}
-
-		// clear the dirty state so the tearDown does not open a confirm dialog.
-		for (int i = 0; i < total; i++)
-			mocks[i].setDirty(false);
-	}
-
-	public void testSaveAllEditors() throws Throwable {
-		int total = 3;
-
-		final IFile[] files = new IFile[total];
-		IEditorPart[] editors = new IEditorPart[total];
-		CallHistory[] callTraces = new CallHistory[total];
-		MockEditorPart[] mocks = new MockEditorPart[total];
-
-		proj = FileUtil.createProject("testOpenEditor");
-		for (int i = 0; i < total; i++) {
-			files[i] = FileUtil.createFile(i + ".mock2", proj);
-			editors[i] = IDE.openEditor(fActivePage, files[i]);
-			mocks[i] = (MockEditorPart) editors[i];
-			callTraces[i] = mocks[i].getCallHistory();
-		}
-
-		/*
-		 * javadoc: If there are no dirty editors this method returns without
-		 * effect. javadoc: If confirm is true the user is prompted to confirm
-		 * the command
-		 */
-		// save all clean editors with confirmation
-		assertEquals(fActivePage.saveAllEditors(true), true);
-		for (int i = 0; i < total; i++) {
-			assertEquals(callTraces[i].contains("isDirty"), true);
-			assertEquals(callTraces[i].contains("doSave"), false);
-			callTraces[i].clear();
-		}
-
-		// save all dirty editors with confirmation can't be tested
-
-		/*
-		 * javadoc: Parameters: confirm - false to save unsaved changes without
-		 * asking
-		 */
-		// save all clean editors without confirmation
-		assertEquals(fActivePage.saveAllEditors(false), true);
-		for (int i = 0; i < total; i++) {
-			assertEquals(callTraces[i].contains("isDirty"), true);
-			assertEquals(callTraces[i].contains("doSave"), false);
-			callTraces[i].clear();
-		}
-
-		// save all dirty editors without confirmation
-		for (int i = 0; i < total; i++)
-			mocks[i].setDirty(true);
-		assertEquals(fActivePage.saveAllEditors(false), true);
-		for (int i = 0; i < total; i++)
-			assertEquals(callTraces[i].verifyOrder(new String[] { "isDirty",
-					"doSave" }), true);
-	}
-
-	public void testGetEditors() throws Throwable {
-		proj = FileUtil.createProject("testOpenEditor");
-		int totalBefore = fActivePage.getEditorReferences().length;
-		int num = 3;
-		IEditorPart[] editors = new IEditorPart[num];
-
-		for (int i = 0; i < num; i++) {
-			editors[i] = IDE.openEditor(fActivePage, FileUtil.createFile(i
-					+ ".mock2", proj));
-			assertEquals(hasEditor(editors[i]), true);
-		}
-		assertEquals(fActivePage.getEditorReferences().length, totalBefore
-				+ num);
-
-		fActivePage.closeEditor(editors[0], false);
-		assertEquals(hasEditor(editors[0]), false);
-		assertEquals(fActivePage.getEditorReferences().length, totalBefore
-				+ num - 1);
-
-		fActivePage.closeAllEditors(false);
-		assertEquals(fActivePage.getEditorReferences().length, 0);
-	}
-
-	public void testShowActionSet() {
-		String id = MockActionDelegate.ACTION_SET_ID;
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-
-		int totalBefore = page.getActionSets().length;
-		fActivePage.showActionSet(id);
-
-		IActionSetDescriptor[] sets = ((WorkbenchPage) fActivePage)
-				.getActionSets();
-		boolean found = false;
-		for (int i = 0; i < sets.length; i++)
-			if (id.equals(sets[i].getId()))
-				found = true;
-		assertEquals(found, true);
-
-		// check that the method does not add an invalid action set to itself
-		id = IConstants.FakeID;
-		fActivePage.showActionSet(id);
-
-		sets = ((WorkbenchPage) fActivePage).getActionSets();
-		found = false;
-		for (int i = 0; i < sets.length; i++)
-			if (id.equals(sets[i].getId()))
-				found = true;
-		assertEquals(found, false);
-		assertEquals(page.getActionSets().length, totalBefore + 1);
-	}
-
-	public void testHideActionSet() {
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-		int totalBefore = page.getActionSets().length;
-
-		String id = MockWorkbenchWindowActionDelegate.SET_ID;
-		fActivePage.showActionSet(id);
-		assertEquals(page.getActionSets().length, totalBefore + 1);
-
-		fActivePage.hideActionSet(id);
-		assertEquals(page.getActionSets().length, totalBefore);
-
-		IActionSetDescriptor[] sets = page.getActionSets();
-		boolean found = false;
-		for (int i = 0; i < sets.length; i++)
-			if (id.equals(sets[i].getId()))
-				found = true;
-		assertEquals(found, false);
-	}
-
-	/**
-	 * Return whether or not the editor exists in the current page.
-	 * 
-	 * @param editor
-	 * @return boolean
-	 */
-	private boolean hasEditor(IEditorPart editor) {
-		IEditorReference[] references = fActivePage.getEditorReferences();
-		for (int i = 0; i < references.length; i++) {
-			if (references[i].getEditor(false).equals(editor))
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Return whether or not the view exists in the current page.
-	 * 
-	 * @param editor
-	 * @return boolean
-	 */
-	private boolean hasView(IViewPart view) {
-		IViewReference[] references = fActivePage.getViewReferences();
-		for (int i = 0; i < references.length; i++) {
-			if (references[i].getView(false).equals(view))
-				return true;
-		}
-		return false;
-	}
-
-	public void testStackOrder() {
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-		try {
-			IViewPart part1 = page.showView(MockViewPart.ID);
-			IViewPart part2 = page.showView(MockViewPart.ID2);
-			IViewPart part3 = page.showView(MockViewPart.ID3);
-			IViewPart part4 = page.showView(MockViewPart.ID4);
-
-			IViewPart[] stack = page.getViewStack(part1);
-			assertTrue(stack.length == 4);
-			assertTrue(stack[0] == part4);
-			assertTrue(stack[1] == part3);
-			assertTrue(stack[2] == part2);
-			assertTrue(stack[3] == part1);
-
-			page.activate(part2);
-			stack = page.getViewStack(part1);
-			assertTrue(stack.length == 4);
-			assertTrue(stack[0] == part2);
-			assertTrue(stack[1] == part4);
-			assertTrue(stack[2] == part3);
-			assertTrue(stack[3] == part1);
-
-			page.activate(part1);
-			stack = page.getViewStack(part1);
-			assertTrue(stack.length == 4);
-			assertTrue(stack[0] == part1);
-			assertTrue(stack[1] == part2);
-			assertTrue(stack[2] == part4);
-			assertTrue(stack[3] == part3);
-
-			page.activate(part3);
-			stack = page.getViewStack(part1);
-			assertTrue(stack.length == 4);
-			assertTrue(stack[0] == part3);
-			assertTrue(stack[1] == part1);
-			assertTrue(stack[2] == part2);
-			assertTrue(stack[3] == part4);
-		} catch (PartInitException e) {
-			fail(e.getMessage());
-		}
-	}
-
-	/**
-	 * Test the VIEW_CREATE parameter for showView. Ensures that the created
-	 * view is not the active part.
-	 * 
-	 */
-	public void testView_CREATE1() {
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-		try {
-
-			page.setPerspective(WorkbenchPlugin.getDefault()
-					.getPerspectiveRegistry().findPerspectiveWithId(
-							"org.eclipse.ui.tests.api.ViewPerspective"));
-
-			// create a part to be active
-			IViewPart activePart = page.showView(MockViewPart.ID);
-			IViewPart createdPart = page.showView(MockViewPart.ID2, null,
-					IWorkbenchPage.VIEW_CREATE);
-
-			IViewPart[] stack = page.getViewStack(activePart);
-			assertEquals(2, stack.length);
-
-			assertEquals(activePart, stack[0]);
-			assertEquals(createdPart, stack[1]);
-
-			assertFalse(page.isPartVisible(createdPart));
-
-			assertEquals(activePart, page.getActivePart());
-		} catch (PartInitException e) {
-			fail(e.getMessage());
-		}
-	}
-
-	/**
-	 * Test the VIEW_CREATE parameter for showView. Ensures that the created
-	 * view is not the active part and is not visible
-	 */
-	public void testView_CREATE2() {
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-		try {
-
-			page.setPerspective(WorkbenchPlugin.getDefault()
-					.getPerspectiveRegistry().findPerspectiveWithId(
-							"org.eclipse.ui.tests.api.ViewPerspective"));
-
-			// create a part to be active
-			IViewPart activePart = page.showView(MockViewPart.ID3);
-			IViewPart createdPart = page.showView(MockViewPart.ID2, null,
-					IWorkbenchPage.VIEW_CREATE);
-
-			IViewPart[] stack = page.getViewStack(createdPart);
-			assertEquals(2, stack.length);
-
-			assertEquals(page.findView(MockViewPart.ID), stack[0]);
-			assertEquals(createdPart, stack[1]);
-
-			assertFalse(page.isPartVisible(createdPart));
-
-			assertEquals(activePart, page.getActivePart());
-		} catch (PartInitException e) {
-			fail(e.getMessage());
-		}
-	}
-
-	/**
-	 * Test the VIEW_CREATE parameter for showView. Ensures that the created
-	 * view is not the active part and is visible.
-	 */
-	public void testView_CREATE3() {
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-		try {
-
-			page.setPerspective(WorkbenchPlugin.getDefault()
-					.getPerspectiveRegistry().findPerspectiveWithId(
-							"org.eclipse.ui.tests.api.ViewPerspective"));
-
-			// create a part to be active
-			IViewPart activePart = page.showView(MockViewPart.ID3);
-			IViewPart createdPart = page.showView(MockViewPart.ID4, null,
-					IWorkbenchPage.VIEW_CREATE);
-
-			IViewPart[] stack = page.getViewStack(createdPart);
-			assertEquals(1, stack.length);
-
-			assertEquals(createdPart, stack[0]);
-
-			assertTrue(page.isPartVisible(createdPart));
-
-			assertEquals(activePart, page.getActivePart());
-		} catch (PartInitException e) {
-			fail(e.getMessage());
-		}
-	}
-
-	/**
-	 * Test the VIEW_VISIBLE parameter for showView, opening the view in the
-	 * stack containing the active view. Ensures that the created view is not
-	 * the active part and is not visible.
-	 */
-	public void testView_VISIBLE1() {
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-		try {
-			page.setPerspective(WorkbenchPlugin.getDefault()
-					.getPerspectiveRegistry().findPerspectiveWithId(
-							"org.eclipse.ui.tests.api.ViewPerspective"));
-
-			// create a part to be active
-			IViewPart activePart = page.showView(MockViewPart.ID);
-			IViewPart createdPart = page.showView(MockViewPart.ID2, null,
-					IWorkbenchPage.VIEW_VISIBLE);
-			IViewPart[] stack = page.getViewStack(activePart);
-			assertEquals(2, stack.length);
-
-			assertEquals(activePart, stack[0]);
-			assertEquals(createdPart, stack[1]);
-
-			assertFalse(page.isPartVisible(createdPart));
-
-			assertEquals(activePart, page.getActivePart());
-		} catch (PartInitException e) {
-			fail(e.getMessage());
-		}
-	}
-
-	/**
-	 * Test the VIEW_VISIBLE parameter for showView, opening the view in its own
-	 * stack. Ensures that the created view is not active part but is the top
-	 * part in its stack.
-	 */
-	public void testView_VISIBLE3() {
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-		try {
-			page.setPerspective(WorkbenchPlugin.getDefault()
-					.getPerspectiveRegistry().findPerspectiveWithId(
-							"org.eclipse.ui.tests.api.ViewPerspective"));
-
-			// create a part to be active
-			IViewPart activePart = page.showView(MockViewPart.ID3);
-
-			IViewPart createdPart = page.showView(MockViewPart.ID4, null,
-					IWorkbenchPage.VIEW_VISIBLE);
-			IViewPart[] stack = page.getViewStack(createdPart);
-			assertEquals(1, stack.length);
-
-			assertEquals(createdPart, stack[0]);
-
-			assertTrue(page.isPartVisible(createdPart));
-
-			assertEquals(activePart, page.getActivePart());
-		} catch (PartInitException e) {
-			fail(e.getMessage());
-		}
-	}
-
-	/**
-	 * Test opening a perspective with a fast view.
-	 */
-	public void testOpenPerspectiveWithFastView() {
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-
-		try {
-			fWin.getWorkbench().showPerspective(
-					PerspectiveWithFastView.PERSP_ID, fWin);
-		} catch (WorkbenchException e) {
-			fail("Unexpected WorkbenchException: " + e);
-		}
-
-		assertEquals(page.getFastViews().length, 1);
-		assertEquals(page.getFastViews()[0].getId(),
-				"org.eclipse.ui.views.ResourceNavigator");
-		assertEquals(page.getViewReferences().length, 1);
-		assertTrue(page.getViewReferences()[0].isFastView());
-		
-		IPerspectiveDescriptor persp = page.getPerspective();
-		
-		ICommandService commandService = (ICommandService) fWorkbench.getService(ICommandService.class);
-		Command command = commandService.getCommand("org.eclipse.ui.window.closePerspective");
-		
-		HashMap parameters = new HashMap();
-		parameters.put("org.eclipse.ui.window.closePerspective.perspectiveId", persp.getId());
-		
-		ParameterizedCommand pCommand = ParameterizedCommand.generateCommand(command, parameters);
-		
-		IHandlerService handlerService = (IHandlerService) fWorkbench
-				.getService(IHandlerService.class);
-		try {
-			handlerService.executeCommand(pCommand, null);
-		} catch (ExecutionException e1) {
-		} catch (NotDefinedException e1) {
-		} catch (NotEnabledException e1) {
-		} catch (NotHandledException e1) {
-		}
-
-	}
-
-	/**
-	 * Test opening a perspective with placeholders for multi instance views.
-	 * The placeholders are added at top level (not in any folder).
-	 * 
-	 * @since 3.1
-	 */
-	public void testOpenPerspectiveWithMultiViewPlaceholdersAtTopLevel() {
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-
-		try {
-			fWin.getWorkbench().showPerspective(
-					PerspectiveWithMultiViewPlaceholdersAtTopLevel.PERSP_ID,
-					fWin);
-		} catch (WorkbenchException e) {
-			fail("Unexpected WorkbenchException: " + e);
-		}
-
-		PerspectiveState state = new PerspectiveState(page);
-		ArrayList partIds = state.getPartIds(null);
-		assertTrue(partIds.contains("*"));
-		assertTrue(partIds.contains(MockViewPart.IDMULT));
-		assertTrue(partIds.contains(MockViewPart.IDMULT + ":secondaryId"));
-		assertTrue(partIds.contains(MockViewPart.IDMULT + ":*"));
-	}
-
-	/**
-	 * Test opening a perspective with placeholders for multi instance views.
-	 * The placeholders are added in a placeholder folder. This is a regression
-	 * test for bug 72383 [Perspectives] Placeholder folder error with multiple
-	 * instance views
-	 * 
-	 * @since 3.1
-	 */
-	public void testOpenPerspectiveWithMultiViewPlaceholdersInPlaceholderFolder() {
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-
-		try {
-			fWin
-					.getWorkbench()
-					.showPerspective(
-							PerspectiveWithMultiViewPlaceholdersInPlaceholderFolder.PERSP_ID,
-							fWin);
-		} catch (WorkbenchException e) {
-			fail("Unexpected WorkbenchException: " + e);
-		}
-
-		PerspectiveState state = new PerspectiveState(page);
-		ArrayList partIds = state.getPartIds("placeholderFolder");
-		assertTrue(partIds.contains("*"));
-		assertTrue(partIds.contains(MockViewPart.IDMULT));
-		assertTrue(partIds.contains(MockViewPart.IDMULT + ":secondaryId"));
-		assertTrue(partIds.contains(MockViewPart.IDMULT + ":*"));
-	}
-
-	/**
-	 * Test opening a perspective with placeholders for multi instance views.
-	 * The placeholders are added at top level (not in any folder).
-	 * 
-	 * @since 3.1
-	 */
-	public void testOpenPerspectiveWithMultiViewPlaceholdersInFolder() {
-		WorkbenchPage page = (WorkbenchPage) fActivePage;
-
-		try {
-			fWin
-					.getWorkbench()
-					.showPerspective(
-							PerspectiveWithMultiViewPlaceholdersInFolder.PERSP_ID,
-							fWin);
-		} catch (WorkbenchException e) {
-			fail("Unexpected WorkbenchException: " + e);
-		}
-
-		PerspectiveState state = new PerspectiveState(page);
-		ArrayList partIds = state.getPartIds("folder");
-		assertTrue(partIds.contains("*"));
-		assertTrue(partIds.contains(MockViewPart.IDMULT));
-		assertTrue(partIds.contains(MockViewPart.IDMULT + ":secondaryId"));
-		assertTrue(partIds.contains(MockViewPart.IDMULT + ":*"));
-	}
-
-	/**
-	 * Tests the getNewWizardShortcuts() method.
-	 * 
-	 * @since 3.1
-	 */
-	public void testGetNewWizardShortcuts() {
-		String[] shortcuts = fActivePage.getNewWizardShortcuts();
-		assertNotNull(shortcuts);
-		assertEquals(0, shortcuts.length);
-
-		IWorkbenchWindow win = openTestWindow(IDE.RESOURCE_PERSPECTIVE_ID);
-		IWorkbenchPage page = win.getActivePage();
-		shortcuts = page.getNewWizardShortcuts();
-		List shortcutList = Arrays.asList(shortcuts);
-		assertTrue(shortcutList.contains("org.eclipse.ui.wizards.new.folder"));
-		assertTrue(shortcutList.contains("org.eclipse.ui.wizards.new.file"));
-	}
-
-	/**
-	 * Tests the getShowViewShortcuts() method.
-	 * 
-	 * @since 3.1
-	 */
-	public void testGetShowViewShortcuts() {
-		String[] shortcuts = fActivePage.getShowViewShortcuts();
-		assertNotNull(shortcuts);
-		assertEquals(0, shortcuts.length);
-
-		IWorkbenchWindow win = openTestWindow(IDE.RESOURCE_PERSPECTIVE_ID);
-		IWorkbenchPage page = win.getActivePage();
-		shortcuts = page.getShowViewShortcuts();
-		List shortcutList = Arrays.asList(shortcuts);
-		assertTrue(shortcutList.contains(ProjectExplorer.VIEW_ID));
-		assertTrue(shortcutList.contains(IPageLayout.ID_OUTLINE));
-		assertTrue(shortcutList.contains(IPageLayout.ID_PROP_SHEET));
-		assertTrue(shortcutList.contains(IPageLayout.ID_PROBLEM_VIEW));
-	}
-
-	/**
-	 * Tests the getPerspectiveShortcuts() method.
-	 * 
-	 * @since 3.1
-	 */
-	public void testGetPerspectiveShortcuts() {
-		String[] shortcuts = fActivePage.getPerspectiveShortcuts();
-		assertNotNull(shortcuts);
-		assertEquals(0, shortcuts.length);
-		// not much of a test
-	}
-
-	/**
-	 * Tests the getOpenPerspectives() method.
-	 * 
-	 * @since 3.1
-	 */
-	public void testGetOpenPerspectives() {
-		IPerspectiveDescriptor[] openPersps = fActivePage.getOpenPerspectives();
-		assertEquals(1, openPersps.length);
-		assertEquals(EmptyPerspective.PERSP_ID, openPersps[0].getId());
-
-		IPerspectiveRegistry reg = fWorkbench.getPerspectiveRegistry();
-		IPerspectiveDescriptor resourcePersp = reg
-				.findPerspectiveWithId(IDE.RESOURCE_PERSPECTIVE_ID);
-		fActivePage.setPerspective(resourcePersp);
-		openPersps = fActivePage.getOpenPerspectives();
-		assertEquals(2, openPersps.length);
-		assertEquals(EmptyPerspective.PERSP_ID, openPersps[0].getId());
-		assertEquals(IDE.RESOURCE_PERSPECTIVE_ID, openPersps[1].getId());
-
-		IPerspectiveDescriptor emptyPersp = reg
-				.findPerspectiveWithId(EmptyPerspective.PERSP_ID);
-		fActivePage.setPerspective(emptyPersp);
-		openPersps = fActivePage.getOpenPerspectives();
-		assertEquals(2, openPersps.length);
-		assertEquals(EmptyPerspective.PERSP_ID, openPersps[0].getId());
-		assertEquals(IDE.RESOURCE_PERSPECTIVE_ID, openPersps[1].getId());
-
-		fActivePage.closeAllPerspectives(false, false);
-		openPersps = fActivePage.getOpenPerspectives();
-		assertEquals(0, openPersps.length);
-
-		fActivePage.close();
-		openPersps = fActivePage.getOpenPerspectives();
-		assertEquals(0, openPersps.length);
-	}
-
-	/**
-	 * Tests the getSortedPerspectives() method.
-	 * 
-	 * @since 3.1
-	 */
-	public void testGetSortedPerspectives() {
-		IPerspectiveDescriptor[] openPersps = fActivePage
-				.getSortedPerspectives();
-		assertEquals(1, openPersps.length);
-		assertEquals(EmptyPerspective.PERSP_ID, openPersps[0].getId());
-
-		IPerspectiveRegistry reg = fWorkbench.getPerspectiveRegistry();
-		IPerspectiveDescriptor resourcePersp = reg
-				.findPerspectiveWithId(IDE.RESOURCE_PERSPECTIVE_ID);
-		fActivePage.setPerspective(resourcePersp);
-		openPersps = fActivePage.getSortedPerspectives();
-		assertEquals(2, openPersps.length);
-		assertEquals(EmptyPerspective.PERSP_ID, openPersps[0].getId());
-		assertEquals(IDE.RESOURCE_PERSPECTIVE_ID, openPersps[1].getId());
-
-		IPerspectiveDescriptor emptyPersp = reg
-				.findPerspectiveWithId(EmptyPerspective.PERSP_ID);
-		fActivePage.setPerspective(emptyPersp);
-		openPersps = fActivePage.getSortedPerspectives();
-		assertEquals(2, openPersps.length);
-		assertEquals(IDE.RESOURCE_PERSPECTIVE_ID, openPersps[0].getId());
-		assertEquals(EmptyPerspective.PERSP_ID, openPersps[1].getId());
-
-		fActivePage.closeAllPerspectives(false, false);
-		openPersps = fActivePage.getSortedPerspectives();
-		assertEquals(0, openPersps.length);
-
-		fActivePage.close();
-		openPersps = fActivePage.getSortedPerspectives();
-		assertEquals(0, openPersps.length);
-	}
-
-	/**
-	 * Tests the closePerspective method.
-	 * 
-	 * @since 3.1
-	 */
-	public void testClosePerspective() {
-		// TODO: Need to test variants with saveEditors==true
-
-		IPerspectiveRegistry reg = fWorkbench.getPerspectiveRegistry();
-		IPerspectiveDescriptor emptyPersp = reg
-				.findPerspectiveWithId(EmptyPerspective.PERSP_ID);
-		IPerspectiveDescriptor resourcePersp = reg
-				.findPerspectiveWithId(IDE.RESOURCE_PERSPECTIVE_ID);
-
-		fActivePage.setPerspective(resourcePersp);
-		IPerspectiveDescriptor[] openPersps = fActivePage.getOpenPerspectives();
-		assertEquals(2, openPersps.length);
-
-		fActivePage.closePerspective(resourcePersp, false, false);
-		openPersps = fActivePage.getOpenPerspectives();
-		assertEquals(1, openPersps.length);
-		assertEquals(EmptyPerspective.PERSP_ID, openPersps[0].getId());
-
-		fActivePage.closePerspective(emptyPersp, false, false);
-		assertEquals(fActivePage, fWin.getActivePage()); // page not closed
-		openPersps = fActivePage.getOpenPerspectives();
-		assertEquals(0, openPersps.length);
-
-		fActivePage.setPerspective(emptyPersp);
-		openPersps = fActivePage.getOpenPerspectives();
-		assertEquals(1, openPersps.length);
-
-		fActivePage.closePerspective(emptyPersp, false, true);
-		openPersps = fActivePage.getOpenPerspectives();
-		assertEquals(0, openPersps.length);
-		assertNull(fWin.getActivePage()); // page closed
-	}
-
-	/**
-	 * Tests the closeAllPerspectives method.
-	 * 
-	 * @since 3.1
-	 */
-	public void testCloseAllPerspectives() {
-		// TODO: Need to test variants with saveEditors==true
-
-		IPerspectiveRegistry reg = fWorkbench.getPerspectiveRegistry();
-		IPerspectiveDescriptor emptyPersp = reg
-				.findPerspectiveWithId(EmptyPerspective.PERSP_ID);
-		IPerspectiveDescriptor resourcePersp = reg
-				.findPerspectiveWithId(IDE.RESOURCE_PERSPECTIVE_ID);
-
-		fActivePage.setPerspective(resourcePersp);
-		IPerspectiveDescriptor[] openPersps = fActivePage.getOpenPerspectives();
-		assertEquals(2, openPersps.length);
-
-		fActivePage.closeAllPerspectives(false, false);
-		assertEquals(fActivePage, fWin.getActivePage()); // page not closed
-		openPersps = fActivePage.getOpenPerspectives();
-		assertEquals(0, openPersps.length);
-
-		fActivePage.setPerspective(emptyPersp);
-		openPersps = fActivePage.getOpenPerspectives();
-		assertEquals(1, openPersps.length);
-
-		fActivePage.closeAllPerspectives(false, true);
-		openPersps = fActivePage.getOpenPerspectives();
-		assertEquals(0, openPersps.length);
-		assertNull(fWin.getActivePage()); // page closed
-	}
-
-	/**
-	 * Regression test for Bug 76285 [Presentations] Folder tab does not
-	 * indicate current view. Tests that, when switching between perspectives,
-	 * the remembered old part correctly handles multi-view instances.
-	 */
-	public void testBug76285() {
-		IWorkbenchPage page = fActivePage;
-		IPerspectiveDescriptor originalPersp = page.getPerspective();
-		IPerspectiveDescriptor resourcePersp = PlatformUI.getWorkbench()
-				.getPerspectiveRegistry().findPerspectiveWithId(
-						IDE.RESOURCE_PERSPECTIVE_ID);
-		// test requires switching between two different perspectives
-		assertNotSame(originalPersp, resourcePersp);
-
-		int n = 5;
-		IViewPart[] views = new IViewPart[n];
-		for (int i = 0; i < n; ++i) {
-			try {
-				views[i] = page.showView(MockViewPart.IDMULT, Integer
-						.toString(i), IWorkbenchPage.VIEW_CREATE);
-			} catch (PartInitException e) {
-				fail(e.getMessage());
-			}
-		}
-		assertEquals(5, page.getViews().length);
-		for (int i = 0; i < n; ++i) {
-			page.activate(views[i]);
-			page.setPerspective(resourcePersp);
-			assertFalse(page.getActivePart() instanceof MockViewPart);
-			page.setPerspective(originalPersp);
-			assertEquals(views[i], page.getActivePart());
-		}
-	}
-
-	/**
-	 * Tests that IShowEditorInput.showEditorInput is called when a matching
-	 * editor is found during openEditor, and is not called when a new editor is
-	 * opened.
-	 * 
-	 * @since 3.1
-	 */
-	public void testShowEditorInput() throws Exception {
-		IWorkbenchPage page = fActivePage;
-		proj = FileUtil.createProject("testShowEditorInput");
-		IFile file = FileUtil.createFile("a.mock1", proj);
-		MockEditorPart part1 = (MockEditorPart) IDE.openEditor(page, file);
-		assertFalse(part1.getCallHistory().contains("showEditorInput"));
-
-		MockEditorPart part2 = (MockEditorPart) IDE.openEditor(page, file);
-		assertTrue(part1 == part2);
-		assertTrue(part2.getCallHistory().contains("showEditorInput"));
-	}
-
-	/**
-	 * Tests that the openEditor and findEditor variants that accepts match
-	 * flags work as expected.
-	 * 
-	 * @since 3.2
-	 */
-	public void testOpenAndFindEditorWithMatchFlags() throws Exception {
-		IWorkbenchPage page = fActivePage;
-		proj = FileUtil.createProject("testOpenEditorMatchFlags");
-		IFile file1 = FileUtil.createFile("a.mock1", proj);
-		IFile file2 = FileUtil.createFile("a.mock2", proj);
-		FileEditorInput input1 = new FileEditorInput(file1);
-		FileEditorInput input2 = new FileEditorInput(file2);
-		String id1 = MockEditorPart.ID1;
-		String id2 = MockEditorPart.ID2;
-
-		// first editor (no match)
-		MockEditorPart part1 = (MockEditorPart) page.openEditor(input1, id1,
-				true, IWorkbenchPage.MATCH_INPUT);
-		assertNotNull(part1);
-
-		// same input, same id, matching input (should match part1)
-		MockEditorPart part2 = (MockEditorPart) page.openEditor(input1, id1,
-				true, IWorkbenchPage.MATCH_INPUT);
-		assertTrue(part1 == part2);
-
-		// same input, different id, matching input (should match part1)
-		MockEditorPart part3 = (MockEditorPart) page.openEditor(input1, id2,
-				true, IWorkbenchPage.MATCH_INPUT);
-		assertTrue(part1 == part3);
-
-		// same input, different id, matching input and id (no match)
-		MockEditorPart part4 = (MockEditorPart) page.openEditor(input1, id2,
-				true, IWorkbenchPage.MATCH_INPUT | IWorkbenchPage.MATCH_ID);
-		assertNotNull(part4);
-		assertTrue(part4 != part1);
-
-		// same input, same id, matching nothing (no match)
-		MockEditorPart part5 = (MockEditorPart) page.openEditor(input1, id1,
-				true, IWorkbenchPage.MATCH_NONE);
-		assertNotNull(part5);
-		assertTrue(part5 != part1);
-		assertTrue(part5 != part4);
-
-		// different input, same id, matching id (should match part5 instead of
-		// part1, because it was active)
-		MockEditorPart part6 = (MockEditorPart) page.openEditor(input2, id1,
-				true, IWorkbenchPage.MATCH_ID);
-		assertTrue(part6 == part5);
-
-		// different input, different id, matching input and id (no match)
-		MockEditorPart part7 = (MockEditorPart) page.openEditor(input2, id2,
-				true, IWorkbenchPage.MATCH_INPUT | IWorkbenchPage.MATCH_ID);
-		assertNotNull(part7);
-		assertTrue(part7 != part1);
-		assertTrue(part7 != part4);
-		assertTrue(part7 != part5);
-
-		// At this point, there are 4 editors open:
-		// part1 (input1, id1), part4 (input1, id2), part5 (input1, id1), and
-		// part7 (input2, id2).
-		// with part7 active.
-
-		// find with MATCH_NONE is always empty
-		IEditorReference[] refs = page.findEditors(input1, id1,
-				IWorkbenchPage.MATCH_NONE);
-		assertEquals(0, refs.length);
-
-		// find input1 with MATCH_INPUT finds 3 editors: part1, part4 and part5
-		// (in order)
-		refs = page.findEditors(input1, null, IWorkbenchPage.MATCH_INPUT);
-		assertEquals(3, refs.length);
-		assertEquals(part1, refs[0].getPart(true));
-		assertEquals(part4, refs[1].getPart(true));
-		assertEquals(part5, refs[2].getPart(true));
-
-		// find input2 with MATCH_INPUT finds 1 editor: part7
-		refs = page.findEditors(input2, null, IWorkbenchPage.MATCH_INPUT);
-		assertEquals(1, refs.length);
-		assertEquals(part7, refs[0].getPart(true));
-
-		// find id1 with MATCH_ID finds 2 editors: part1 and part5 (in order)
-		refs = page.findEditors(null, id1, IWorkbenchPage.MATCH_ID);
-		assertEquals(2, refs.length);
-		assertEquals(part1, refs[0].getPart(true));
-		assertEquals(part5, refs[1].getPart(true));
-
-		// find id2 with MATCH_ID finds 2 editors: part4 and part7 (with part7
-		// first because it was active)
-		refs = page.findEditors(null, id2, IWorkbenchPage.MATCH_ID);
-		assertEquals(2, refs.length);
-		assertEquals(part7, refs[0].getPart(true));
-		assertEquals(part4, refs[1].getPart(true));
-
-		// find input1 and id1 with MATCH_INPUT and MATCH_ID finds 2 editors:
-		// part1 and part5 (in order)
-		refs = page.findEditors(input1, id1, IWorkbenchPage.MATCH_INPUT
-				| IWorkbenchPage.MATCH_ID);
-		assertEquals(2, refs.length);
-		assertEquals(part1, refs[0].getPart(true));
-		assertEquals(part5, refs[1].getPart(true));
-
-		// find input1 and id2 with MATCH_INPUT and MATCH_ID finds 1 editors:
-		// part4
-		refs = page.findEditors(input1, id2, IWorkbenchPage.MATCH_INPUT
-				| IWorkbenchPage.MATCH_ID);
-		assertEquals(1, refs.length);
-		assertEquals(part4, refs[0].getPart(true));
-	}
-	
-	
-	/**
-	 * Create and hide a single editor, and check it is reflected in the
-	 * editor references.  Check that close still works.
-	 * 
-	 * @throws Exception
-	 */
-	public void testOpenAndHideEditor1() throws Exception {
-		proj = FileUtil.createProject("testOpenAndHideEditor");
-		IFile file1 = FileUtil.createFile("a.mock1", proj);
-		IEditorPart editor = IDE.openEditor(fActivePage, file1);
-		assertTrue(editor instanceof MockEditorPart);
-		IEditorReference editorRef = (IEditorReference) fActivePage
-				.getReference(editor);
-		fActivePage.hideEditor(editorRef);
-		assertEquals(0, fActivePage.getEditorReferences().length);
-		fActivePage.showEditor(editorRef);
-		assertEquals(1, fActivePage.getEditorReferences().length);
-		fActivePage.closeAllEditors(true);
-		assertEquals(0, fActivePage.getEditorReferences().length);
-		assertEquals(getMessage(), 0, logCount);
-	}
-	
-	/**
-	 * Create and remove 2 editors.  Check that the removed editor
-	 * is not returned in the list of references.  Check that
-	 * close still works.
-	 * 
-	 * @throws Exception
-	 */
-	public void testOpenAndHideEditor2() throws Exception {
-		proj = FileUtil.createProject("testOpenAndHideEditor");
-		IFile file1 = FileUtil.createFile("a.mock1", proj);
-		IFile file2 = FileUtil.createFile("a.mock2", proj);
-		IEditorPart editor = IDE.openEditor(fActivePage, file1);
-		assertTrue(editor instanceof MockEditorPart);
-		IEditorReference editorRef = (IEditorReference) fActivePage
-				.getReference(editor);
-		IEditorPart editor2 = IDE.openEditor(fActivePage, file2);
-		assertTrue(editor2 instanceof MockEditorPart);
-		IEditorReference editorRef2 = (IEditorReference) fActivePage.getReference(editor2);
-		
-		fActivePage.hideEditor(editorRef);
-		IEditorReference[] refs = fActivePage.getEditorReferences();
-		assertEquals(1, refs.length);
-		assertEquals(editorRef2, refs[0]);
-		fActivePage.showEditor(editorRef);
-		refs = fActivePage.getEditorReferences();
-		assertEquals(2, refs.length);
-		
-		fActivePage.hideEditor(editorRef2);
-		refs = fActivePage.getEditorReferences();
-		assertEquals(1, refs.length);
-		fActivePage.hideEditor(editorRef);
-		refs = fActivePage.getEditorReferences();
-		assertEquals(0, refs.length);
-		fActivePage.showEditor(editorRef);
-		refs = fActivePage.getEditorReferences();
-		assertEquals(editorRef, refs[0]);
-		fActivePage.showEditor(editorRef2);
-		refs = fActivePage.getEditorReferences();
-		assertEquals(2, refs.length);
-		
-		fActivePage.closeAllEditors(true);
-		refs = fActivePage.getEditorReferences();
-		assertEquals(0, refs.length);
-		assertEquals(getMessage(), 0, logCount);
-	}
-
-	/**
-	 * Create 2 editors and hide one.  When added back and then closed, there
-	 * should only be one editor.  Adding back the closed editor should
-	 * generate a log message and not effect the list of editors.
-	 * 
-	 * @throws Exception
-	 */
-	public void testOpenAndHideEditor3() throws Exception {
-		proj = FileUtil.createProject("testOpenAndHideEditor");
-		IFile file1 = FileUtil.createFile("a.mock1", proj);
-		IFile file2 = FileUtil.createFile("a.mock2", proj);
-		IEditorPart editor = IDE.openEditor(fActivePage, file1);
-		assertTrue(editor instanceof MockEditorPart);
-		IEditorReference editorRef = (IEditorReference) fActivePage
-				.getReference(editor);
-		IEditorPart editor2 = IDE.openEditor(fActivePage, file2);
-		assertTrue(editor2 instanceof MockEditorPart);
-		IEditorReference editorRef2 = (IEditorReference) fActivePage.getReference(editor2);
-		
-		fActivePage.hideEditor(editorRef2);
-		IEditorReference[] refs = fActivePage.getEditorReferences();
-		assertEquals(1, refs.length);
-		assertEquals(editorRef, refs[0]);
-		fActivePage.showEditor(editorRef2);
-		fActivePage.closeEditors(new IEditorReference[] { editorRef2 }, true);
-		refs = fActivePage.getEditorReferences();
-		assertEquals(1, refs.length);
-		fActivePage.showEditor(editorRef2);
-		assertEquals(1, refs.length);
-		assertEquals(getMessage(), 1, logCount);
-		assertNotNull(getMessage());
-		assertTrue(getMessage().startsWith("adding a disposed part"));
-	}
-
-	/**
-	 * Create 2 editors, and remove and show one of them.  Trying to
-	 * add it a second time should not effect the list of editor references.
-	 * 
-	 * @throws Exception
-	 */
-	public void testOpenAndHideEditor4() throws Exception {
-		proj = FileUtil.createProject("testOpenAndHideEditor");
-		IFile file1 = FileUtil.createFile("a.mock1", proj);
-		IFile file2 = FileUtil.createFile("a.mock2", proj);
-		IEditorPart editor = IDE.openEditor(fActivePage, file1);
-		assertTrue(editor instanceof MockEditorPart);
-		IEditorReference editorRef = (IEditorReference) fActivePage
-				.getReference(editor);
-		IEditorPart editor2 = IDE.openEditor(fActivePage, file2);
-		assertTrue(editor2 instanceof MockEditorPart);
-		IEditorReference editorRef2 = (IEditorReference) fActivePage.getReference(editor2);
-		
-		fActivePage.hideEditor(editorRef2);
-		IEditorReference[] refs = fActivePage.getEditorReferences();
-		assertEquals(1, refs.length);
-		assertEquals(editorRef, refs[0]);
-		fActivePage.showEditor(editorRef2);
-		refs = fActivePage.getEditorReferences();
-		assertEquals(2, refs.length);
-		fActivePage.showEditor(editorRef2);
-		refs = fActivePage.getEditorReferences();
-		assertEquals(2, refs.length);
-		assertEquals(getMessage(), 0, logCount);
-	}
-	
-	/**
-	 * Create 2 editors that effect the Content Outline view.  Make
-	 * sure that hiding and showing the active editor effects the 
-	 * outline view.
-	 * 
-	 * @throws Exception
-	 */
-	public void testOpenAndHideEditor5() throws Exception {
-		proj = FileUtil.createProject("testOpenAndHideEditor");
-		IFile file1 = FileUtil.createFile("a1.java", proj);
-		IFile file2 = FileUtil.createFile("a2.java", proj);
-		IEditorPart editor = IDE.openEditor(fActivePage, file1);
-		assertTrue(editor.getClass().getName().endsWith("CompilationUnitEditor"));
-		IEditorReference editorRef = (IEditorReference) fActivePage
-				.getReference(editor);
-		IEditorPart editor2 = IDE.openEditor(fActivePage, file2);
-		assertTrue(editor2.getClass().getName().endsWith("CompilationUnitEditor"));
-		
-		ContentOutline outline = (ContentOutline) fActivePage.showView(IPageLayout.ID_OUTLINE);
-		IPage page2 = outline.getCurrentPage();
-		fActivePage.activate(editor);
-		processEvents();
-		IPage page = outline.getCurrentPage();
-		assertFalse(page2==page);
-		
-		assertEquals(getMessage(), 0, logCount);
-		
-		fActivePage.hideEditor(editorRef);
-		assertEquals(page2, outline.getCurrentPage());
-		assertEquals(getMessage(), 0, logCount);
-		
-		fActivePage.showEditor(editorRef);
-		assertEquals(page2, outline.getCurrentPage());
-		assertEquals(getMessage(), 0, logCount);
-		
-		fActivePage.activate(editor);
-		assertEquals(page, outline.getCurrentPage());
-		assertEquals(getMessage(), 0, logCount);
-	}
-	
-	/**
-	 * Create one editor.  Make sure hiding and showing it effects
-	 * the outline view, and that when hidden the outline view
-	 * reflects the default page.
-	 * 
-	 * @throws Exception
-	 */
-	public void testOpenAndHideEditor6() throws Exception {
-		proj = FileUtil.createProject("testOpenAndHideEditor");
-		IFile file1 = FileUtil.createFile("a1.java", proj);
-		IEditorPart editor = IDE.openEditor(fActivePage, file1);
-		assertTrue(editor.getClass().getName().endsWith("CompilationUnitEditor"));
-		IEditorReference editorRef = (IEditorReference) fActivePage
-				.getReference(editor);
-		
-		ContentOutline outline = (ContentOutline) fActivePage.showView(IPageLayout.ID_OUTLINE);
-		IPage defaultPage = outline.getDefaultPage();
-		assertNotNull(defaultPage);
-		
-		processEvents();
-		IPage page = outline.getCurrentPage();
-		assertFalse(defaultPage==page);
-		
-		assertEquals(getMessage(), 0, logCount);
-		assertEquals(0, partHiddenCount);
-		fActivePage.addPartListener(partListener2);
-		fActivePage.hideEditor(editorRef);
-		processEvents();
-		
-		assertEquals(1, partHiddenCount);
-		assertEquals(editorRef, partHiddenRef);
-		
-		assertEquals(defaultPage, outline.getCurrentPage());
-		//assertEquals(page, outline.getCurrentPage());
-		assertEquals(getMessage(), 0, logCount);
-				
-		assertEquals(0, partVisibleCount);
-		fActivePage.showEditor(editorRef);
-		processEvents();
-		assertEquals(page, outline.getCurrentPage());
-		assertEquals(getMessage(), 0, logCount);
-		assertEquals(1, partVisibleCount);
-		assertEquals(editorRef, partVisibleRef);
-		
-		fActivePage.activate(editor);
-		assertEquals(page, outline.getCurrentPage());
-		assertEquals(getMessage(), 0, logCount);
-	}
-
-	/**
-	 * Create one editor.  Make sure hiding the editor updates
-	 * the window title.
-	 * 
-	 * @throws Exception
-	 */
-	public void testOpenAndHideEditor7() throws Exception {
-		proj = FileUtil.createProject("testOpenAndHideEditor");
-		IFile file1 = FileUtil.createFile("a1.java", proj);
-		IEditorPart editor = IDE.openEditor(fActivePage, file1);
-		assertTrue(editor.getClass().getName().endsWith("CompilationUnitEditor"));
-		IEditorReference editorRef = (IEditorReference) fActivePage
-				.getReference(editor);
-		
-		processEvents();
-		
-		String firstTitle = fWin.getShell().getText();
-		
-		assertEquals(getMessage(), 0, logCount);
-		assertEquals(0, partHiddenCount);
-		fActivePage.addPartListener(partListener2);
-		fActivePage.hideEditor(editorRef);
-		processEvents();
-		
-		assertEquals(1, partHiddenCount);
-		assertEquals(editorRef, partHiddenRef);
-				
-		String nextTitle = fWin.getShell().getText();
-		String tooltip = editor.getTitleToolTip();
-		assertNotNull(tooltip);
-		String[] split = Util.split(nextTitle, '-');
-		assertEquals(2, split.length);
-		String nextTitleRebuilt = split[0] + "- " + tooltip + " -" + split[1];
-		assertEquals(firstTitle, nextTitleRebuilt);
-		
-		assertEquals(0, partVisibleCount);
-		fActivePage.showEditor(editorRef);
-		processEvents();
-		assertEquals(getMessage(), 0, logCount);
-		assertEquals(1, partVisibleCount);
-		assertEquals(editorRef, partVisibleRef);
-		nextTitle = fWin.getShell().getText();
-		assertEquals(firstTitle, nextTitle);
-		
-		fActivePage.activate(editor);
-		assertEquals(getMessage(), 0, logCount);
-	}
-	
-	/**
-	 * Create one editor.  Make sure hiding the editor that is the active part
-	 * causes another part to become active.
-	 * 
-	 * @throws Exception
-	 */
-	public void testOpenAndHideEditor8() throws Exception {
-		proj = FileUtil.createProject("testOpenAndHideEditor");
-		IFile file1 = FileUtil.createFile("a1.java", proj);
-		IEditorPart editor = IDE.openEditor(fActivePage, file1);
-		assertTrue(editor.getClass().getName().endsWith("CompilationUnitEditor"));
-		IEditorReference editorRef = (IEditorReference) fActivePage
-				.getReference(editor);
-		
-		ContentOutline outline = (ContentOutline) fActivePage.showView(IPageLayout.ID_OUTLINE);
-		IPage defaultPage = outline.getDefaultPage();
-		assertNotNull(defaultPage);
-		fActivePage.activate(editor);
-		
-		processEvents();
-		IPage page = outline.getCurrentPage();
-		assertFalse(defaultPage==page);
-		
-		partActiveCount = 0;
-		partActiveRef = null;
-		assertEquals(getMessage(), 0, logCount);
-		assertEquals(0, partHiddenCount);
-		fActivePage.addPartListener(partListener2);
-		fActivePage.hideEditor(editorRef);
-		processEvents();
-		
-		assertEquals(1, partHiddenCount);
-		assertEquals(editorRef, partHiddenRef);
-		assertEquals(1, partActiveCount);
-		assertFalse(partActiveRef == editorRef);
-		
-		fActivePage.showEditor(editorRef);
-		
-		assertEquals(getMessage(), 0, logCount);
-	}
-
-	/**
-	 * Create a java editor.  Make a change.  Validate the enabled state
-	 * of some commands.
-	 * 
-	 * @throws Exception
-	 */
-	public void testOpenAndHideEditor9() throws Exception {
-		proj = FileUtil.createProject("testOpenAndHideEditor");
-		IFile file1 = FileUtil.createFile("a1.java", proj);
-		IEditorPart editor = IDE.openEditor(fActivePage, file1);
-		assertTrue(editor.getClass().getName()
-				.endsWith("CompilationUnitEditor"));
-		IEditorReference editorRef = (IEditorReference) fActivePage
-				.getReference(editor);
-
-		fActivePage.activate(editor);
-
-		processEvents();
-		ICommandService cs = (ICommandService) fActivePage.getWorkbenchWindow()
-				.getService(ICommandService.class);
-		Command undo = cs.getCommand("org.eclipse.ui.edit.undo");
-		assertTrue(undo.isDefined());
-
-		assertFalse(undo.isEnabled());
-
-		ITextEditor textEditor = (ITextEditor) editor;
-		IDocument doc = textEditor.getDocumentProvider().getDocument(
-				textEditor.getEditorInput());
-		doc.replace(0, 1, "  ");
-		fActivePage.saveEditor(editor, false);
-		
-		processEvents();
-		assertTrue(undo.isEnabled());
-		
-		assertEquals(getMessage(), 0, logCount);
-		fActivePage.hideEditor(editorRef);
-		processEvents();
-
-		assertFalse(undo.isEnabled());
-		
-		fActivePage.showEditor(editorRef);
-		
-		assertTrue(undo.isEnabled());
-		
-		assertEquals(getMessage(), 0, logCount);
-	}
-
-	/**
-	 * Create and hide a single editor, and check it is reflected in the
-	 * editor references.  Check that closing the hidden editor still works.
-	 * 
-	 * @throws Exception
-	 */
-	public void testOpenAndHideEditor10() throws Exception {
-		proj = FileUtil.createProject("testOpenAndHideEditor");
-		IFile file1 = FileUtil.createFile("a.mock1", proj);
-		IEditorPart editor = IDE.openEditor(fActivePage, file1);
-		assertTrue(editor instanceof MockEditorPart);
-		IEditorReference editorRef = (IEditorReference) fActivePage
-				.getReference(editor);
-		fActivePage.hideEditor(editorRef);
-		assertEquals(0, fActivePage.getEditorReferences().length);
-		fActivePage.showEditor(editorRef);
-		assertEquals(1, fActivePage.getEditorReferences().length);
-		fActivePage.hideEditor(editorRef);
-		processEvents();
-		fActivePage.closeAllEditors(false);
-		assertEquals(getMessage(), 0, logCount);
-		assertEquals(0, fActivePage.getEditorReferences().length);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchPartSiteTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchPartSiteTest.java
deleted file mode 100644
index 4d8d6b3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchPartSiteTest.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests the site for an IWorkbenchPart.
- */
-public abstract class IWorkbenchPartSiteTest extends UITestCase {
-
-    protected IWorkbenchWindow fWindow;
-
-    protected IWorkbenchPage fPage;
-
-    /**
-     * Constructor for IWorkbenchPartSiteTest
-     */
-    public IWorkbenchPartSiteTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWindow = openTestWindow();
-        fPage = fWindow.getActivePage();
-    }
-
-    public void testGetId() throws Throwable {
-        // From Javadoc: "Returns the part registry extension id for 
-        // this workbench site's part."
-
-        IWorkbenchPart part = createTestPart(fPage);
-        IWorkbenchPartSite site = part.getSite();
-        assertEquals(getTestPartId(), site.getId());
-    }
-
-    public void testGetPage() throws Throwable {
-        // From Javadoc: "Returns the page containing this workbench 
-        // site's part."
-
-        IWorkbenchPart part = createTestPart(fPage);
-        IWorkbenchPartSite site = part.getSite();
-        assertEquals(fPage, site.getPage());
-    }
-
-    public void testGetPluginId() throws Throwable {
-        // From Javadoc: "Returns the unique identifier of the 
-        // plug-in that defines this workbench site's part."
-
-        IWorkbenchPart part = createTestPart(fPage);
-        IWorkbenchPartSite site = part.getSite();
-        assertEquals(getTestPartPluginId(), site.getPluginId());
-    }
-
-    public void testGetRegisteredName() throws Throwable {
-        // From Javadoc: "Returns the registered name for this 
-        // workbench site's part."
-
-        IWorkbenchPart part = createTestPart(fPage);
-        IWorkbenchPartSite site = part.getSite();
-        assertEquals(getTestPartName(), site.getRegisteredName());
-    }
-
-    public void testGetShell() throws Throwable {
-        // From Javadoc: "Returns the shell containing this 
-        // workbench site's part"
-
-        IWorkbenchPart part = createTestPart(fPage);
-        IWorkbenchPartSite site = part.getSite();
-        assertEquals(fWindow.getShell(), site.getShell());
-    }
-
-    public void testGetWorkbenchWindow() throws Throwable {
-        // From Javadoc: "Returns the workbench window 
-        // containing this workbench site's part."
-
-        IWorkbenchPart part = createTestPart(fPage);
-        IWorkbenchPartSite site = part.getSite();
-        assertEquals(fWindow, site.getWorkbenchWindow());
-    }
-
-    public void testGetSelectionProvider() throws Throwable {
-        // From Javadoc: "'Get' returns the selection provider 
-        // for this workbench site's part.  
-
-        IWorkbenchPart part = createTestPart(fPage);
-        IWorkbenchPartSite site = part.getSite();
-        assertTrue(part instanceof MockWorkbenchPart);
-        MockWorkbenchPart mock = (MockWorkbenchPart) part;
-        assertEquals(mock.getSelectionProvider(), site.getSelectionProvider());
-    }
-
-    public void testSetSelectionProvider() throws Throwable {
-        // From Javadoc: 'Set' sets the selection provider.
-
-        // Set selection provider to null.
-        IWorkbenchPart part = createTestPart(fPage);
-        IWorkbenchPartSite site = part.getSite();
-        site.setSelectionProvider(null);
-        assertNull(site.getSelectionProvider());
-
-        // Set selection provider to real.
-        MockSelectionProvider provider = new MockSelectionProvider();
-        site.setSelectionProvider(provider);
-        assertEquals(provider, site.getSelectionProvider());
-    }
-
-    /**
-     * Creates a test part in the page.	
-     */
-    abstract protected IWorkbenchPart createTestPart(IWorkbenchPage page)
-            throws Throwable;
-
-    /**
-     * Returns the expected id for a test part.
-     */
-    abstract protected String getTestPartId() throws Throwable;
-
-    /**
-     * Returns the expected name for a test part.
-     */
-    abstract protected String getTestPartName() throws Throwable;
-
-    /**
-     * Returns the expected id for a test part plugin.  Subclasses may
-     * override this.
-     */
-    protected String getTestPartPluginId() throws Throwable {
-        return "org.eclipse.ui.tests";
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchPartTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchPartTest.java
deleted file mode 100644
index 7a745b4..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchPartTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.CallHistory;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * This is a test for IWorkbenchPart.  Since IWorkbenchPart is an
- * interface this test verifies the IWorkbenchPart lifecycle rather
- * than the implementation.
- */
-public abstract class IWorkbenchPartTest extends UITestCase {
-
-    protected IWorkbenchWindow fWindow;
-
-    protected IWorkbenchPage fPage;
-
-    /**
-     * Constructor for IActionDelegateTest
-     */
-    public IWorkbenchPartTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWindow = openTestWindow();
-        fPage = fWindow.getActivePage();
-    }
-
-    public void testOpenAndClose() throws Throwable {
-        // Open a part.
-        MockPart part = openPart(fPage);
-        assertTrue(part.isSiteInitialized());
-        CallHistory history = part.getCallHistory();
-        assertTrue(history.verifyOrder(new String[] { "setInitializationData", "init",
-                "createPartControl", "setFocus" }));
-
-        // Close the part.
-        closePart(fPage, part);
-        assertTrue(history.verifyOrder(new String[] { "setInitializationData", "init",
-                "createPartControl", "setFocus", "widgetDisposed", "dispose" }));
-    }
-
-    /**
-     * Opens a part.  Subclasses should override
-     */
-    protected abstract MockPart openPart(IWorkbenchPage page) throws Throwable;
-
-    /**
-     * Closes a part.  Subclasses should override
-     */
-    protected abstract void closePart(IWorkbenchPage page, MockPart part)
-            throws Throwable;
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchPartTestableTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchPartTestableTests.java
deleted file mode 100644
index 97e0b93..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchPartTestableTests.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.api;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.intro.IIntroPart;
-import org.eclipse.ui.testing.IWorkbenchPartTestable;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.3
- * 
- */
-public class IWorkbenchPartTestableTests extends UITestCase {
-
-	/**
-	 * @param testName
-	 */
-	public IWorkbenchPartTestableTests(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Iterate over all parts to ensure that they all return a part testable
-	 * that contains a real composite.
-	 */
-	public void testGetComposite() throws CoreException {
-		IWorkbenchPage page = openTestWindow(IDE.RESOURCE_PERSPECTIVE_ID)
-				.getActivePage();
-		assertNotNull(page);
-
-		IProject proj = FileUtil.createProject("testIWorkbenchPartTestable");
-
-		assertNotNull(IDE
-				.openEditor(page, FileUtil.createFile("foo.txt", proj)));
-		assertNotNull(IDE.openEditor(page, FileUtil.createFile(
-				"foo.properties", proj)));
-		assertNotNull(IDE.openEditor(page, FileUtil
-				.createFile("foo.java", proj)));
-		assertNotNull(IDE
-				.openEditor(page, FileUtil.createFile("foo.xml", proj)));
-
-		IEditorPart editors[] = page.getEditors();
-		Set encounteredControls = new HashSet();
-		testParts(editors, encounteredControls);
-
-		IViewPart views[] = page.getViews();
-		testParts(views, encounteredControls);
-
-		IIntroPart intro = page.getWorkbenchWindow().getWorkbench()
-				.getIntroManager().showIntro(page.getWorkbenchWindow(), false);
-		testParts(new IIntroPart [] { intro }, encounteredControls);
-
-		encounteredControls.clear();
-	}
-
-	/**
-	 * @param parts
-	 * @param encounteredControls
-	 */
-	private void testParts(Object[] parts, Set encounteredControls) {
-		for (int i = 0; i < parts.length; i++) {
-			String title = null;
-			IWorkbenchPartTestable testable = null;
-			if (parts instanceof IWorkbenchPart[]) {
-				testable = (IWorkbenchPartTestable) ((IWorkbenchPart) parts[i])
-						.getSite().getAdapter(IWorkbenchPartTestable.class);
-				title = ((IWorkbenchPart) parts[i]).getTitle();
-			} else {
-				testable = (IWorkbenchPartTestable) ((IIntroPart) parts[i])
-						.getIntroSite()
-						.getAdapter(IWorkbenchPartTestable.class);
-				title = ((IIntroPart) parts[i]).getTitle();
-			}
-			assertNotNull(title + " has null testable", testable);
-			assertTrue(title + " has previously encountered control",
-					encounteredControls.add(testable.getControl()));
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchTest.java
deleted file mode 100644
index 31a136b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchTest.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.tests.harness.util.ArrayUtil;
-import org.eclipse.ui.tests.harness.util.EmptyPerspective;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests the IWorkbench interface.
- */
-public class IWorkbenchTest extends UITestCase {
-
-    public IWorkbenchTest(String testName) {
-        super(testName);
-    }
-
-    /**
-     * Tests the activation of two windows.
-     */
-    public void testGetActiveWorkbenchWindow() throws Throwable {
-        IWorkbenchWindow win1, win2;
-
-        // Test initial window.
-        win1 = fWorkbench.getActiveWorkbenchWindow();
-        assertNotNull(win1);
-
-        // Test open window.
-        win1 = openTestWindow();
-        assertEquals(win1, fWorkbench.getActiveWorkbenchWindow());
-
-        // Test open second window.
-        win2 = openTestWindow();
-        assertEquals(win2, fWorkbench.getActiveWorkbenchWindow());
-
-        // Test set focus.
-        win1.getShell().forceFocus();
-        assertEquals(win1, fWorkbench.getActiveWorkbenchWindow());
-
-        // Test set focus.
-        win2.getShell().forceFocus();
-        assertEquals(win2, fWorkbench.getActiveWorkbenchWindow());
-
-        // Cleanup in tearDown.
-    }
-
-    public void testGetEditorRegistry() throws Throwable {
-        IEditorRegistry reg = fWorkbench.getEditorRegistry();
-        assertNotNull(reg);
-    }
-
-    public void testGetPerspectiveRegistry() throws Throwable {
-        IPerspectiveRegistry reg = fWorkbench.getPerspectiveRegistry();
-        assertNotNull(reg);
-    }
-
-    public void testGetPrefereneManager() throws Throwable {
-        PreferenceManager mgr = fWorkbench.getPreferenceManager();
-        assertNotNull(mgr);
-    }
-
-    public void testGetSharedImages() throws Throwable {
-        ISharedImages img = fWorkbench.getSharedImages();
-        assertNotNull(img);
-    }
-
-    public void testGetWorkingSetManager() throws Throwable {
-        IWorkingSetManager workingSetManager = fWorkbench
-                .getWorkingSetManager();
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-        assertNotNull(workingSetManager);
-
-        IWorkingSet workingSet = workingSetManager.createWorkingSet("ws1",
-                new IAdaptable[] { workspace.getRoot() });
-        workingSetManager.addWorkingSet(workingSet);
-        workingSetManager = fWorkbench.getWorkingSetManager();
-        assertEquals(1, workingSetManager.getWorkingSets().length);
-        assertEquals(workingSet, workingSetManager.getWorkingSets()[0]);
-    }
-
-    public void testGetWorkbenchWindows() throws Throwable {
-        IWorkbenchWindow[] wins = fWorkbench.getWorkbenchWindows();
-        assertEquals(ArrayUtil.checkNotNull(wins), true);
-        int oldTotal = wins.length;
-        int num = 3;
-
-        IWorkbenchWindow[] newWins = new IWorkbenchWindow[num];
-        for (int i = 0; i < num; i++)
-            newWins[i] = openTestWindow();
-
-        wins = fWorkbench.getWorkbenchWindows();
-        for (int i = 0; i < num; i++)
-            assertTrue(ArrayUtil.contains(wins, newWins[i]));
-
-        assertEquals(wins.length, oldTotal + num);
-
-        closeAllTestWindows();
-        wins = fWorkbench.getWorkbenchWindows();
-        assertEquals(wins.length, oldTotal);
-    }
-
-    /**
-     * openWorkbenchWindow(String, IAdaptable)
-     */
-    public void testOpenWorkbenchWindow() throws Throwable {
-        // open a window with valid perspective 
-        IWorkbenchWindow win = null;
-        try {
-            win = fWorkbench.openWorkbenchWindow(EmptyPerspective.PERSP_ID, getPageInput());
-            assertNotNull(win);
-            assertEquals(win, fWorkbench.getActiveWorkbenchWindow());
-            assertEquals(EmptyPerspective.PERSP_ID, win.getActivePage()
-                    .getPerspective().getId());
-        } finally {
-            if (win != null)
-                win.close();
-        }
-
-        // open a window with invalid perspective. WorkbenchException is expected.
-        boolean exceptionOccured = false;
-        try {
-            win = fWorkbench.openWorkbenchWindow("afdasfdasf", getPageInput());
-        } catch (WorkbenchException ex) {
-            exceptionOccured = true;
-        }
-
-        assertEquals(exceptionOccured, true);
-    }
-
-    /**
-     * openWorkbenchWindow(IAdaptable)
-     */
-    public void testOpenWorkbenchWindow2() throws Throwable {
-        // open a window with valid perspective 
-        IWorkbenchWindow win = null;
-
-        try {
-            win = fWorkbench
-                    .openWorkbenchWindow(getPageInput());
-            assertNotNull(win);
-			assertEquals(win, fWorkbench.getActiveWorkbenchWindow());
-            String defaultID = fWorkbench.getPerspectiveRegistry()
-                    .getDefaultPerspective();
-            assertEquals(win.getActivePage().getPerspective().getId(),
-                    defaultID);
-
-        } finally {
-            if (win != null)
-                win.close();
-        }
-    }
-
-    public void testOpenPage1() throws Throwable {
-        IWorkbenchWindow win = null;
-        //IWorkbenchPage page1, page2;
-        try {
-            /*
-             * Commented out until test case can be updated to match new
-             * implementation of single page per window
-             * 
-             // Open test window.
-             win = fWorkbench.openWorkbenchWindow(ResourcesPlugin.getWorkspace());
-             assertNotNull(win);
-
-             // Set platform pref for openPage.
-             IPreferenceStore store = WorkbenchPlugin.getDefault().getPreferenceStore();
-             store.setValue(IPreferenceConstants.REUSE_PERSPECTIVES, 
-             true);
-             
-             // Call openPage twice with the same input.
-             // Verify that we get the same page back both times.
-             page1 = fWorkbench.openPage(ResourcesPlugin.getWorkspace());
-             assertNotNull(page1);
-             page2 = fWorkbench.openPage(ResourcesPlugin.getWorkspace());
-             assertNotNull(page2);
-             assertEquals("Pages should be equal", page1, page2);
-
-             // Reset platform pref for openPage.
-             store.setValue(IPreferenceConstants.REUSE_PERSPECTIVES, 
-             false);
-             */
-            // Call openPage twice with the same input.
-            // Verify that we get two different pages back.
-            /*
-             * Commented out until Nick has time to update this
-             * test case to match new implementation of openPage
-             * otherwise this test always fails.
-             *
-             page1 = fWorkbench.openPage(ResourcesPlugin.getWorkspace());
-             assertNotNull(page1);
-             page2 = fWorkbench.openPage(ResourcesPlugin.getWorkspace());
-             assertNotNull(page2);
-             assertTrue("Pages should be not equal", page1 != page2);
-             */
-        } finally {
-            // Close test window.
-            if (win != null)
-                win.close();
-        }
-    }
-
-    public void testOpenPage2() throws Throwable {
-        IWorkbenchWindow win = null;
-        //IWorkbenchPage page1, page2;
-        try {
-            /*
-             * Commented out until test case can be updated to match new
-             * implementation of single page per window
-             * 
-             // Open test window.
-             win = fWorkbench.openWorkbenchWindow(ResourcesPlugin.getWorkspace());
-             assertNotNull(win);
-
-             // Set platform pref for openPage.
-             IPreferenceStore store = WorkbenchPlugin.getDefault().getPreferenceStore();
-             store.setValue(IPreferenceConstants.REUSE_PERSPECTIVES, 
-             true);
-             
-             // Call openPage twice with the same input.
-             // Verify that we get the same page back both times.
-             page1 = fWorkbench.openPage(EmptyPerspective.PERSP_ID,
-             ResourcesPlugin.getWorkspace(), 0);
-             assertNotNull(page1);
-             page2 = fWorkbench.openPage(IWorkbenchConstants.DEFAULT_LAYOUT_ID,
-             ResourcesPlugin.getWorkspace(), 0);
-             assertNotNull(page2);
-             assertEquals("Pages should be equal", page1, page2);
-
-             // Reset platform pref for openPage.
-             store.setValue(IPreferenceConstants.REUSE_PERSPECTIVES, 
-             false);
-             
-             // Call openPage twice with the same input.
-             // Verify that we get two different pages back.
-             page1 = fWorkbench.openPage(EmptyPerspective.PERSP_ID,
-             ResourcesPlugin.getWorkspace(), 0);
-             assertNotNull(page1);
-             page2 = fWorkbench.openPage(IWorkbenchConstants.DEFAULT_LAYOUT_ID,
-             ResourcesPlugin.getWorkspace(), 0);
-             assertTrue("Pages should be not equal", page1 != page2);
-             */
-        } finally {
-            // Close test window.
-            if (win != null)
-                win.close();
-        }
-    }
-
-    /**
-     * close() couldn't be tested because calling close() would lead to early termination 
-     * to entire test suites		
-     */
-    public void testClose() {
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchTestSuite.java
deleted file mode 100644
index 4419380..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchTestSuite.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Test the workbench. This suite was created as a 
- * workaround for problems running the suites from the
- * command line.
- */
-public class IWorkbenchTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite.  This is required to
-     * use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new IWorkbenchTestSuite();
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public IWorkbenchTestSuite() {
-        addTest(new TestSuite(IWorkbenchTest.class));
-        addTest(new TestSuite(IWorkbenchWindowTest.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchWindowActionDelegateTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchWindowActionDelegateTest.java
deleted file mode 100644
index e27ae28..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchWindowActionDelegateTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.tests.harness.util.ActionUtil;
-
-/**
- * Tests the lifecycle for a window action delegate.
- */
-public class IWorkbenchWindowActionDelegateTest extends IActionDelegateTest {
-
-    /**
-     * Constructor for IWorkbenchWindowActionDelegateTest
-     */
-    public IWorkbenchWindowActionDelegateTest(String testName) {
-        super(testName);
-    }
-
-    public void testInit() throws Throwable {
-        // Run the action.
-        testRun();
-
-        // Verify lifecycle.
-        // The init, selectionChanged, and run methods should
-        // be called, in that order.
-        MockActionDelegate delegate = getDelegate();
-        assertNotNull(delegate);
-        assertTrue(delegate.callHistory.verifyOrder(new String[] { "init",
-                "selectionChanged", "run" }));
-    }
-
-    // Bug 48799.  Commented out testDispose to avoid a test failure.  This should be a temporary solution.
-    //	public void testDispose() throws Throwable {
-    //		// Run the action.
-    //		testRun();
-    //		
-    //		// Get the action.
-    //		MockActionDelegate delegate = getDelegate();
-    //		assertNotNull(delegate);
-    //		
-    //		// Dispose action.
-    //		// Verify that the dispose method is called.
-    //		delegate.callHistory.clear();
-    //		removeAction();
-    //		assertTrue(delegate.callHistory.contains("dispose"));
-    //	}
-
-    /**
-     * Regression test for bug 81422.  Tests to ensure that dispose() is only
-     * called once if the delegate implements both IWorkbenchWindowActionDelegate
-     * and IActionDelegate2.
-     */
-    public void testDisposeWorkbenchWindowActionDelegateBug81422() {
-        String id = MockWorkbenchWindowActionDelegate.SET_ID;
-        fPage.showActionSet(id);
-        MockWorkbenchWindowActionDelegate mockWWinActionDelegate = MockWorkbenchWindowActionDelegate.lastDelegate;
-        // hide (from the compiler) the fact that the interfaces are implemented
-        Object mockAsObject = mockWWinActionDelegate; 
-        // asserts that the mock object actually implements both interfaces mentioned in the PR
-        assertTrue(mockAsObject instanceof IActionDelegate2);
-        assertTrue(mockAsObject instanceof IWorkbenchWindowActionDelegate);
-        // we are only interested in the calls from now on
-        mockWWinActionDelegate.callHistory.clear();
-        // this causes the action set to be disposed
-        fPage.close();
-        // assert that dispose was called
-    	assertTrue(mockWWinActionDelegate.callHistory.contains("dispose"));
-    	// assert that dispose was not called twice
-    	assertFalse(mockWWinActionDelegate.callHistory.verifyOrder(new String[] {"dispose", "dispose"}));
-    }
-
-    /**
-     * @see IActionDelegateTest#createActionWidget()
-     */
-    protected Object createActionWidget() throws Throwable {
-        fPage.showActionSet("org.eclipse.ui.tests.api.MockActionSet");
-        return null;
-    }
-
-    /**
-     * @see IActionDelegateTest#runAction()
-     */
-    protected void runAction(Object widget) throws Throwable {
-        ActionUtil.runActionWithLabel(this, fWindow, "Mock Action");
-    }
-
-    /**
-     * @see IActionDelegateTest#fireSelection()
-     */
-    protected void fireSelection(Object widget) throws Throwable {
-        MockViewPart view = (MockViewPart) fPage.showView(MockViewPart.ID);
-        view.fireSelection();
-    }
-
-    /**
-     * Removes the action.
-     */
-    protected void removeAction() {
-        fPage.hideActionSet("org.eclipse.ui.tests.api.MockActionSet");
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchWindowTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchWindowTest.java
deleted file mode 100644
index c87af12..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkbenchWindowTest.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.ArrayUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-public class IWorkbenchWindowTest extends UITestCase {
-
-    private IWorkbenchWindow fWin;
-
-    public IWorkbenchWindowTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWin = openTestWindow();
-    }
-
-    public void testClose() throws Throwable {
-        assertEquals(fWin.close(), true);
-        assertEquals(
-                ArrayUtil.contains(fWorkbench.getWorkbenchWindows(), fWin),
-                false);
-    }
-
-    public void testGetActivePage() throws Throwable {
-        /*
-         * Commented out because until test case can be updated to work
-         * with new window/page/perspective implementation
-         * 
-         IWorkbenchPage page1, page2;
-         page1 = openTestPage(fWin);
-         assertEquals(fWin.getActivePage(), page1);
-
-         page2 = openTestPage(fWin);
-         assertEquals(fWin.getActivePage(), page2);
-
-         fWin.setActivePage(page1);
-         assertEquals(fWin.getActivePage(), page1);
-
-         fWin.setActivePage(page2);
-         assertEquals(fWin.getActivePage(), page2);
-
-         //no pages
-         closeAllPages(fWin);
-         assertNull(fWin.getActivePage());
-         */
-    }
-
-    public void testSetActivePage() throws Throwable {
-        openTestPage(fWin, 5);
-        IWorkbenchPage[] pages = fWin.getPages();
-
-        for (int i = 0; i < pages.length; i++) {
-            fWin.setActivePage(pages[i]);
-            assertEquals(pages[i], fWin.getActivePage());
-        }
-
-        fWin.setActivePage(null);
-        assertNull(fWin.getActivePage());
-    }
-
-    public void testGetPages() throws Throwable {
-        /*
-         * Commented out because until test case can be updated to work
-         * with new window/page/perspective implementation
-         * 
-         int totalBefore;
-         IWorkbenchPage[] pages, domainPages;
-
-         totalBefore = fWin.getPages().length;
-         int num = 5;
-         pages = openTestPage(fWin, num);
-         assertEquals(fWin.getPages().length, totalBefore + num);
-
-         domainPages = fWin.getPages();
-         for (int i = 0; i < pages.length; i++)
-         assertEquals(ArrayUtil.contains(domainPages, pages[i]), true);
-
-         closeAllPages(fWin);
-         assertEquals(fWin.getPages().length, 0);
-         */
-    }
-
-    public void testGetShell() {
-        Shell sh = fWin.getShell();
-        assertNotNull(sh);
-    }
-
-    public void testGetWorkbench() {
-        IWorkbenchWindow win = fWorkbench.getActiveWorkbenchWindow();
-        assertEquals(win.getWorkbench(), fWorkbench);
-    }
-
-    /**
-     * tests openPage(String)
-     */
-    public void testOpenPage() throws Throwable {
-        /*
-         * Commented out because until test case can be updated to work
-         * with new window/page/perspective implementation
-         * 
-         IWorkbenchPage page = null;
-         try {
-         page = fWin.openPage(ResourcesPlugin.getWorkspace());
-         assertNotNull(page);
-         assertEquals(fWin.getActivePage(), page);
-         } finally {
-         if (page != null)
-         page.close();
-         }
-         */
-    }
-
-    /**
-     * tests openPage(String, IAdaptable)
-     */
-    public void testOpenPage2() throws Throwable {
-        /*
-         * Commented out because until test case can be updated to work
-         * with new window/page/perspective implementation
-         * 
-         IWorkbenchPage page = null;
-         try {
-         page = fWin.openPage(EmptyPerspective.PERSP_ID, ResourcesPlugin.getWorkspace());
-         assertNotNull(page);
-         assertEquals(fWin.getActivePage(), page);
-         assertEquals(
-         fWin.getActivePage().getPerspective().getId(),
-         EmptyPerspective.PERSP_ID);
-         } finally {
-         if (page != null)
-         page.close();
-         }
-
-         //test openPage() fails
-         try {
-         page = fWin.openPage("*************", ResourcesPlugin.getWorkspace());
-         fail();
-         } catch (WorkbenchException ex) {
-         }
-
-         page.close();
-         */
-    }
-
-    public void testIsApplicationMenu() {
-        String[] ids = { IWorkbenchActionConstants.M_FILE,
-                IWorkbenchActionConstants.M_WINDOW, };
-
-        for (int i = 0; i < ids.length; i++)
-            assertEquals(fWin.isApplicationMenu(ids[i]), true);
-
-        ids = new String[] { IWorkbenchActionConstants.M_EDIT,
-                IWorkbenchActionConstants.M_HELP,
-                IWorkbenchActionConstants.M_LAUNCH };
-
-        for (int i = 0; i < ids.length; i++)
-            assertEquals(fWin.isApplicationMenu(ids[i]), false);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkingSetManagerTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkingSetManagerTest.java
deleted file mode 100644
index 4a66f85..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkingSetManagerTest.java
+++ /dev/null
@@ -1,444 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
-import org.eclipse.ui.dialogs.WorkingSetConfigurationBlock;
-import org.eclipse.ui.tests.harness.util.ArrayUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-public class IWorkingSetManagerTest extends UITestCase {
-    final static String WORKING_SET_NAME_1 = "ws1";
-
-    final static String WORKING_SET_NAME_2 = "ws2";
-    
-    final static String WORKING_SET_NAME_3 = "ws3";
-
-    IWorkingSetManager fWorkingSetManager;
-
-    IWorkspace fWorkspace;
-
-    IWorkingSet fWorkingSet;
-
-    String fChangeProperty;
-
-    Object fChangeNewValue;
-
-    Object fChangeOldValue;
-
-    class TestPropertyChangeListener implements IPropertyChangeListener {
-        public void propertyChange(PropertyChangeEvent event) {
-            fChangeProperty = event.getProperty();
-            fChangeNewValue = event.getNewValue();
-            fChangeOldValue = event.getOldValue();
-        }
-    }
-
-    public IWorkingSetManagerTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWorkingSetManager = fWorkbench.getWorkingSetManager();
-        fWorkspace = ResourcesPlugin.getWorkspace();
-        fWorkingSet = fWorkingSetManager.createWorkingSet(WORKING_SET_NAME_1,
-                new IAdaptable[] { fWorkspace.getRoot() });
-
-        IWorkingSet[] workingSets = fWorkingSetManager.getWorkingSets();
-        for (int i = 0; i < workingSets.length; i++) {
-            fWorkingSetManager.removeWorkingSet(workingSets[i]);
-        }
-    }
-
-    void resetChangeData() {
-        fChangeProperty = "";
-        fChangeNewValue = null;
-        fChangeOldValue = null;
-    }
-    
-    /**
-     * Tests the utility method found on the WorkingSetConfigurationBlock.
-     */
-    public void testConfigBlockFilter() {
-    	final String [] setIds = new String[] {"5", "2", "4", "1", "3" }; 
-    	
-    	IWorkingSet [] sets = new IWorkingSet[setIds.length * 3];
-    	for (int i = 0; i < setIds.length; i++) {
-			sets[i * 3] = createSet(setIds, i);
-			sets[i * 3 + 1] = createSet(setIds, i);
-			sets[i * 3 + 2] = createSet(setIds, i);
-		}
-    	IWorkingSet [] newSets = WorkingSetConfigurationBlock.filter(sets, setIds);
-    	assertEquals(sets.length, newSets.length);
-    	
-    	for (int j = 0; j < setIds.length; j++) {
-    		newSets = WorkingSetConfigurationBlock.filter(sets, new String [] {setIds[j]});	
-    		assertEquals(3, newSets.length);
-    		assertEquals(setIds[j], newSets[0].getId());
-    		assertEquals(setIds[j], newSets[1].getId());
-    		assertEquals(setIds[j], newSets[2].getId());
-		}
-    	
-    }
-
-    public void testAddPropertyChangeListener() throws Throwable {
-        IPropertyChangeListener listener = new TestPropertyChangeListener();
-        fWorkingSetManager.addPropertyChangeListener(listener);
-
-        resetChangeData();
-        fWorkingSetManager.removeWorkingSet(fWorkingSet);
-        assertEquals("", fChangeProperty);
-
-        resetChangeData();
-        fWorkingSetManager.addWorkingSet(fWorkingSet);
-        assertEquals(IWorkingSetManager.CHANGE_WORKING_SET_ADD, fChangeProperty);
-        assertEquals(null, fChangeOldValue);
-        assertEquals(fWorkingSet, fChangeNewValue);
-
-        resetChangeData();
-        fWorkingSetManager.removeWorkingSet(fWorkingSet);
-        assertEquals(IWorkingSetManager.CHANGE_WORKING_SET_REMOVE,
-                fChangeProperty);
-        assertEquals(fWorkingSet, fChangeOldValue);
-        assertEquals(null, fChangeNewValue);
-
-        resetChangeData();
-		fWorkingSet.setLabel(WORKING_SET_NAME_3); // set the label first to
-													// something other than the
-													// new name. This will allow
-													// us to test for the name
-													// property apart from the
-													// label property
-		assertEquals(IWorkingSetManager.CHANGE_WORKING_SET_LABEL_CHANGE,
-				fChangeProperty);
-		assertEquals(null, fChangeOldValue);
-		assertEquals(fWorkingSet, fChangeNewValue);
-		fWorkingSet.setName(WORKING_SET_NAME_2);
-		assertEquals(IWorkingSetManager.CHANGE_WORKING_SET_NAME_CHANGE,
-				fChangeProperty);
-		assertEquals(null, fChangeOldValue);
-		assertEquals(fWorkingSet, fChangeNewValue);
-
-        resetChangeData();
-        fWorkingSet.setElements(new IAdaptable[] {});
-        assertEquals(IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE,
-                fChangeProperty);
-        assertEquals(null, fChangeOldValue);
-        assertEquals(fWorkingSet, fChangeNewValue);
-    }
-
-    public void testAddRecentWorkingSet() throws Throwable {
-        fWorkingSetManager.addRecentWorkingSet(fWorkingSet);
-        fWorkingSetManager.addWorkingSet(fWorkingSet);
-        assertTrue(ArrayUtil.equals(new IWorkingSet[] { fWorkingSet },
-                fWorkingSetManager.getRecentWorkingSets()));
-
-        IWorkingSet workingSet2 = fWorkingSetManager.createWorkingSet(
-                WORKING_SET_NAME_2, new IAdaptable[] { fWorkspace.getRoot() });
-        fWorkingSetManager.addRecentWorkingSet(workingSet2);
-        fWorkingSetManager.addWorkingSet(workingSet2);
-        assertTrue(ArrayUtil.equals(new IWorkingSet[] { workingSet2,
-                fWorkingSet }, fWorkingSetManager.getRecentWorkingSets()));
-    }
-
-    public void testAddWorkingSet() throws Throwable {
-        fWorkingSetManager.addWorkingSet(fWorkingSet);
-        assertTrue(ArrayUtil.equals(new IWorkingSet[] { fWorkingSet },
-                fWorkingSetManager.getWorkingSets()));
-
-        boolean exceptionThrown = false;
-        try {
-            fWorkingSetManager.addWorkingSet(fWorkingSet);
-        } catch (RuntimeException exception) {
-            exceptionThrown = true;
-        }
-        assertTrue(exceptionThrown);
-        assertTrue(ArrayUtil.equals(new IWorkingSet[] { fWorkingSet },
-                fWorkingSetManager.getWorkingSets()));
-    }
-
-    public void testCreateWorkingSet() throws Throwable {
-        IWorkingSet workingSet2 = fWorkingSetManager.createWorkingSet(
-                WORKING_SET_NAME_2, new IAdaptable[] { fWorkspace.getRoot() });
-        assertEquals(WORKING_SET_NAME_2, workingSet2.getName());
-        assertTrue(ArrayUtil.equals(new IAdaptable[] { fWorkspace.getRoot() },
-                workingSet2.getElements()));
-
-        workingSet2 = fWorkingSetManager.createWorkingSet("",
-                new IAdaptable[] {});
-        assertEquals("", workingSet2.getName());
-        assertTrue(ArrayUtil.equals(new IAdaptable[] {}, workingSet2
-                .getElements()));
-    }
-
-    public void testCreateWorkingSetFromMemento() throws Throwable {
-        IWorkingSet workingSet2 = fWorkingSetManager.createWorkingSet(
-                WORKING_SET_NAME_2, new IAdaptable[] { fWorkspace.getRoot() });
-        IMemento memento = XMLMemento.createWriteRoot("savedState"); //$NON-NLS-1$
-        workingSet2.saveState(memento);
-        IWorkingSet restoredWorkingSet2 = fWorkingSetManager
-                .createWorkingSet(memento);
-        assertEquals(WORKING_SET_NAME_2, restoredWorkingSet2.getName());
-        assertTrue(ArrayUtil.equals(new IAdaptable[] { fWorkspace.getRoot() },
-                restoredWorkingSet2.getElements()));
-    }
-
-    public void testCreateWorkingSetSelectionDialog() throws Throwable {
-        IWorkbenchWindow window = openTestWindow();
-        IWorkingSetSelectionDialog dialog = fWorkingSetManager
-                .createWorkingSetSelectionDialog(window.getShell(), true);
-
-        assertNotNull(dialog);
-    }
-
-    public void testGetRecentWorkingSets() throws Throwable {
-        assertEquals(0, fWorkingSetManager.getRecentWorkingSets().length);
-
-        fWorkingSetManager.addRecentWorkingSet(fWorkingSet);
-        fWorkingSetManager.addWorkingSet(fWorkingSet);
-        assertTrue(ArrayUtil.equals(new IWorkingSet[] { fWorkingSet },
-                fWorkingSetManager.getRecentWorkingSets()));
-
-        IWorkingSet workingSet2 = fWorkingSetManager.createWorkingSet(
-                WORKING_SET_NAME_2, new IAdaptable[] { fWorkspace.getRoot() });
-        fWorkingSetManager.addRecentWorkingSet(workingSet2);
-        fWorkingSetManager.addWorkingSet(workingSet2);
-        assertTrue(ArrayUtil.equals(new IWorkingSet[] { workingSet2,
-                fWorkingSet }, fWorkingSetManager.getRecentWorkingSets()));
-
-        fWorkingSetManager.removeWorkingSet(workingSet2);
-        assertTrue(ArrayUtil.equals(new IWorkingSet[] { fWorkingSet },
-                fWorkingSetManager.getRecentWorkingSets()));
-    }
-
-    public void testGetWorkingSet() throws Throwable {
-        assertNull(fWorkingSetManager.getWorkingSet(WORKING_SET_NAME_1));
-
-        fWorkingSetManager.addWorkingSet(fWorkingSet);
-        assertNotNull(fWorkingSetManager.getWorkingSet(fWorkingSet.getName()));
-
-        assertNull(fWorkingSetManager.getWorkingSet(""));
-
-        assertNull(fWorkingSetManager.getWorkingSet(null));
-    }
-
-    public void testGetWorkingSets() throws Throwable {
-		assertTrue(ArrayUtil.equals(new IWorkingSet[] {}, fWorkingSetManager
-				.getWorkingSets()));
-
-		fWorkingSetManager.addWorkingSet(fWorkingSet);
-		assertTrue(ArrayUtil.equals(new IWorkingSet[] { fWorkingSet },
-				fWorkingSetManager.getWorkingSets()));
-
-		try {
-			fWorkingSetManager.addWorkingSet(fWorkingSet);
-			fail("Added the same set twice");
-		} catch (RuntimeException exception) {
-		}
-		assertTrue(ArrayUtil.equals(new IWorkingSet[] { fWorkingSet },
-				fWorkingSetManager.getWorkingSets()));
-
-		IWorkingSet workingSet2 = fWorkingSetManager.createWorkingSet(
-				WORKING_SET_NAME_2, new IAdaptable[] { fWorkspace.getRoot() });
-		fWorkingSetManager.addWorkingSet(workingSet2);
-		assertTrue(ArrayUtil.contains(fWorkingSetManager.getWorkingSets(),
-				workingSet2));
-		assertTrue(ArrayUtil.contains(fWorkingSetManager.getWorkingSets(),
-				fWorkingSet));
-
-		IWorkingSet workingSet3 = fWorkingSetManager.createWorkingSet(
-				WORKING_SET_NAME_2, new IAdaptable[] { fWorkspace.getRoot() });
-		workingSet3.setName("ws0");
-		workingSet3.setLabel(WORKING_SET_NAME_2); // reset the label - it
-													// would be set to ws0 by
-													// the above call.
-		fWorkingSetManager.addWorkingSet(workingSet3);
-
-		// asserts the order is correct - the name of set three should push it
-		// above set two even though their labels are the same
-		IWorkingSet[] sets = fWorkingSetManager.getWorkingSets();
-		assertEquals(fWorkingSet, sets[0]);
-		assertEquals(workingSet2, sets[2]);
-		assertEquals(workingSet3, sets[1]);
-		
-		IWorkingSet workingSet3a = fWorkingSetManager.createWorkingSet(
-				WORKING_SET_NAME_2 + "\u200b", new IAdaptable[] { fWorkspace.getRoot() });
-		workingSet3.setLabel(WORKING_SET_NAME_2); // reset the label - it
-
-		fWorkingSetManager.addWorkingSet(workingSet3a);
-		assertFalse(workingSet3a.equals(workingSet3));
-		
-		sets = fWorkingSetManager.getWorkingSets();
-		assertEquals(4, sets.length);
-		
-    }
-
-    public void testRemovePropertyChangeListener() throws Throwable {
-        IPropertyChangeListener listener = new TestPropertyChangeListener();
-
-        fWorkingSetManager.removePropertyChangeListener(listener);
-
-        fWorkingSetManager.addPropertyChangeListener(listener);
-        fWorkingSetManager.removePropertyChangeListener(listener);
-
-        resetChangeData();
-        fWorkingSet.setName(WORKING_SET_NAME_1);
-        assertEquals("", fChangeProperty);
-    }
-
-    public void testRemoveWorkingSet() throws Throwable {
-        fWorkingSetManager.removeWorkingSet(fWorkingSet);
-        assertTrue(ArrayUtil.equals(new IWorkingSet[] {}, fWorkingSetManager
-                .getWorkingSets()));
-
-        fWorkingSetManager.addWorkingSet(fWorkingSet);
-        IWorkingSet workingSet2 = fWorkingSetManager.createWorkingSet(
-                WORKING_SET_NAME_2, new IAdaptable[] { fWorkspace.getRoot() });
-        fWorkingSetManager.addWorkingSet(workingSet2);
-        fWorkingSetManager.removeWorkingSet(fWorkingSet);
-        assertTrue(ArrayUtil.equals(new IWorkingSet[] { workingSet2 },
-                fWorkingSetManager.getWorkingSets()));
-    }
-    
-    /**
-     * Tests to ensure that a misbehaving listener does not bring down the manager.
-     * 
-     * @throws Throwable
-     */
-    public void testListenerSafety() throws Throwable {
-		final boolean[] result = new boolean[1];
-		// add a bogus listener that dies unexpectedly
-		IPropertyChangeListener badListener = new IPropertyChangeListener() {
-
-			public void propertyChange(PropertyChangeEvent event) {
-				throw new RuntimeException();
-
-			}
-		};
-		IPropertyChangeListener goodListener = new IPropertyChangeListener() {
-
-			public void propertyChange(PropertyChangeEvent event) {
-				result[0] = true;
-
-			}
-		};
-		fWorkingSetManager.addPropertyChangeListener(badListener);
-		fWorkingSetManager.addPropertyChangeListener(goodListener);
-		try {
-			IWorkingSet set = fWorkingSetManager.createWorkingSet("foo",
-					new IAdaptable[0]);
-			fWorkingSetManager.addWorkingSet(set);
-
-			assertTrue("Good listener wasn't invoked", result[0]);
-		} finally {
-			fWorkingSetManager.removePropertyChangeListener(badListener);
-			fWorkingSetManager.removePropertyChangeListener(goodListener);
-		}
-	}
-
-	/**
-	 * @param setIds
-	 * @param i
-	 * @return
-	 */
-	private IWorkingSet createSet(final String[] setIds, final int i) {
-		return new IWorkingSet() {
-
-			public IAdaptable[] adaptElements(IAdaptable[] objects) {
-				return null;
-			}
-
-			public IAdaptable[] getElements() {
-				return null;
-			}
-
-			public String getId() {
-				return setIds[i] + "";
-			}
-
-			public ImageDescriptor getImage() {
-				return null;
-			}
-
-			public ImageDescriptor getImageDescriptor() {
-				return null;
-			}
-
-			public String getLabel() {
-				return null;
-			}
-
-			public String getName() {
-				return null;
-			}
-
-			public boolean isAggregateWorkingSet() {
-				return false;
-			}
-
-			public boolean isEditable() {
-				return true;
-			}
-
-			public boolean isEmpty() {
-				return false;
-			}
-
-			public boolean isSelfUpdating() {
-				return false;
-			}
-
-			public boolean isVisible() {
-				return true;
-			}
-
-			public void setElements(IAdaptable[] elements) {
-			}
-
-			public void setId(String id) {
-			}
-
-			public void setLabel(String label) {
-			}
-
-			public void setName(String name) {
-			}
-
-			public String getFactoryId() {
-				return null;
-			}
-
-			public void saveState(IMemento memento) {
-			}
-
-			public Object getAdapter(Class adapter) {
-				return null;
-			}
-			
-			public String toString() {
-				return getId();
-			}
-		};
-			
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkingSetTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkingSetTest.java
deleted file mode 100644
index 012679c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/IWorkingSetTest.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.internal.WorkingSet;
-import org.eclipse.ui.tests.harness.util.ArrayUtil;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.tests.menus.ObjectContributionClasses.IA;
-import org.eclipse.ui.tests.menus.ObjectContributionClasses.ICommon;
-import org.eclipse.ui.tests.menus.ObjectContributionClasses.IModelElement;
-
-public class IWorkingSetTest extends UITestCase {
-    final static String WORKING_SET_NAME_1 = "ws1";
-
-    final static String WORKING_SET_NAME_2 = "ws2";
-
-    IWorkspace fWorkspace;
-
-    IWorkingSet fWorkingSet;
-
-    public IWorkingSetTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        IWorkingSetManager workingSetManager = fWorkbench
-                .getWorkingSetManager();
-
-        fWorkspace = ResourcesPlugin.getWorkspace();
-        fWorkingSet = workingSetManager.createWorkingSet(WORKING_SET_NAME_1,
-                new IAdaptable[] { fWorkspace.getRoot() });
-        workingSetManager.removeWorkingSet(fWorkingSet);
-        workingSetManager.addWorkingSet(fWorkingSet);
-    }
-
-    public void testGetElements() throws Throwable {
-        assertEquals(fWorkspace.getRoot(), fWorkingSet.getElements()[0]);
-    }
-
-    public void testGetId() throws Throwable {
-        assertEquals(null, fWorkingSet.getId());
-        fWorkingSet.setId("bogusId");
-        assertEquals("bogusId", fWorkingSet.getId());
-        fWorkingSet.setId(null);
-        assertEquals(null, fWorkingSet.getId());
-    }
-
-    public void testGetName() throws Throwable {
-        assertEquals(WORKING_SET_NAME_1, fWorkingSet.getName());
-    }
-
-    public void testSetElements() throws Throwable {
-        boolean exceptionThrown = false;
-
-        try {
-            fWorkingSet.setElements(null);
-        } catch (RuntimeException exception) {
-            exceptionThrown = true;
-        }
-        assertTrue(exceptionThrown);
-
-        IProject p1 = FileUtil.createProject("TP1");
-        IFile f1 = FileUtil.createFile("f1.txt", p1);
-        IAdaptable[] elements = new IAdaptable[] { f1, p1 };
-        fWorkingSet.setElements(elements);
-        assertTrue(ArrayUtil.equals(elements, fWorkingSet.getElements()));
-
-        fWorkingSet.setElements(new IAdaptable[] { f1 });
-        assertEquals(f1, fWorkingSet.getElements()[0]);
-
-        fWorkingSet.setElements(new IAdaptable[] {});
-        assertEquals(0, fWorkingSet.getElements().length);
-    }
-
-    public void testSetId() throws Throwable {
-        assertEquals(null, fWorkingSet.getId());
-        fWorkingSet.setId("bogusId");
-        assertEquals("bogusId", fWorkingSet.getId());
-        fWorkingSet.setId(null);
-        assertEquals(null, fWorkingSet.getId());
-    }
-
-    public void testSetName() throws Throwable {
-        boolean exceptionThrown = false;
-
-        try {
-            fWorkingSet.setName(null);
-        } catch (RuntimeException exception) {
-            exceptionThrown = true;
-        }
-        assertTrue(exceptionThrown);
-
-        fWorkingSet.setName(WORKING_SET_NAME_2);
-        assertEquals(WORKING_SET_NAME_2, fWorkingSet.getName());
-
-        fWorkingSet.setName("");
-        assertEquals("", fWorkingSet.getName());
-
-        fWorkingSet.setName(" ");
-        assertEquals(" ", fWorkingSet.getName());
-    }
-    
-    public void testIsEmpty() {
-		fWorkingSet.setElements(new IAdaptable[] {});
-		assertTrue(fWorkingSet.isEmpty());
-		fWorkingSet.setElements(new IAdaptable[] { new IAdaptable() {
-			public Object getAdapter(Class adapter) {
-				return null;
-			}
-		} });
-		assertFalse(fWorkingSet.isEmpty());
-	}
-    
-    
-    public void testApplicableTo_ResourceWorkingSet() {
-		fWorkingSet.setId("org.eclipse.ui.resourceWorkingSetPage");
-		assertEquals("org.eclipse.ui.resourceWorkingSetPage", fWorkingSet
-				.getId());
-		IAdaptable[] adapted = fWorkingSet.adaptElements(new IAdaptable[] {ResourcesPlugin.getWorkspace()
-				.getRoot()});
-		assertEquals(1, adapted.length);
-		assertTrue(adapted[0] instanceof IWorkspaceRoot);
-    }
-    
-    public void testApplicableTo_DirectComparison() {
-
-		fWorkingSet.setId("org.eclipse.ui.tests.api.MockWorkingSet");
-		Foo myFoo = new Foo();
-		IAdaptable[] adapted = fWorkingSet.adaptElements(new IAdaptable[] {myFoo});
-		assertEquals(1, adapted.length);
-		assertTrue(adapted[0] instanceof Foo);
-    }
-    
-    public void testApplicableTo_Inheritance() {
-    	fWorkingSet.setId("org.eclipse.ui.tests.api.MockWorkingSet");
-		Bar myBar = new Bar();
-		IAdaptable[] adapted = fWorkingSet.adaptElements(new IAdaptable[] {myBar});
-		assertEquals(1, adapted.length);
-		assertTrue(adapted[0] instanceof Bar);
-	}
-    
-    public void testApplicableTo_Adapter1() {
-    	fWorkingSet.setId("org.eclipse.ui.tests.api.MockWorkingSet");
-    	ToFoo tc = new ToFoo();
-    	IAdaptable[] adapted = fWorkingSet.adaptElements(new IAdaptable[] {tc});
-		assertEquals(1, adapted.length);
-		assertTrue(adapted[0] instanceof Foo);
-    }
-    
-    public void testApplicableTo_AdapterManager1() {
-    	fWorkingSet.setId("org.eclipse.ui.tests.api.MockWorkingSet");
-    	IAImpl ia = new IAImpl();
-    	IAdaptable[] adapted = fWorkingSet.adaptElements(new IAdaptable[] {ia});
-		assertEquals(1, adapted.length);
-		assertTrue(adapted[0] instanceof ICommon);
-    }
-    
-    /**
-     * Tests that adaptable=false is working.  ModelElement has a registered adapter to IResource that should not be used.
-     */
-    public void testApplicableTo_AdapterManager2() {
-    	fWorkingSet.setId("org.eclipse.ui.tests.api.MockWorkingSet");
-    	ModelElement element = new ModelElement();
-    	assertTrue(fWorkingSet.adaptElements(new IAdaptable[] {element}).length == 0);
-    }
-    
-    /**
-	 * Tests to verify that we don't fall down in the event that the factory
-	 * throws an exception while restoring a working set.
-	 */
-	public void testBadFactory_Restore() {
-		fWorkingSet
-				.setElements(new IAdaptable[] { new BadElementFactory.BadElementInstance() });
-		IMemento m = XMLMemento.createWriteRoot("ws");
-		fWorkingSet.saveState(m);
-		BadElementFactory.fail = true;
-		IWorkingSet copy = new WorkingSet(fWorkingSet.getName(), fWorkingSet.getId(), m) {};
-		try {
-			assertFalse(BadElementFactory.failAttempted);
-			IAdaptable [] elements = copy.getElements();
-			assertTrue(BadElementFactory.failAttempted);
-			assertEquals("Element array should be empty", 0, elements.length);
-		}
-		catch (RuntimeException e) {
-			fail("Error getting elements for broken factory", e);
-		}
-	}
-	
-	/**
-	 * Tests to verify that we don't fall down in the event that the persistable
-	 * throws an exception while saving a working set.
-	 */
-	public void testBadFactory_Save() {
-		fWorkingSet
-				.setElements(new IAdaptable[] { new BadElementFactory.BadElementInstance() });
-		IMemento m = XMLMemento.createWriteRoot("ws");
-		BadElementFactory.BadElementInstance.fail = true;
-		assertFalse(BadElementFactory.BadElementInstance.failAttempted);
-		try {
-			fWorkingSet.saveState(m);
-			assertTrue(BadElementFactory.BadElementInstance.failAttempted);
-		} catch (RuntimeException e) {
-			fail("Error saving elements for broken persistable", e);
-		}
-	}
-    
-    public static class Foo implements IAdaptable {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-		 */
-		public Object getAdapter(Class adapter) {
-			// TODO Auto-generated method stub
-			return null;
-		}	
-    }
-    
-    public static class Bar extends Foo {
-    	
-    }
-    
-    public class ToFoo implements IAdaptable {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-		 */
-		public Object getAdapter(Class adapter) {
-			if (adapter == Foo.class) {
-				return new Foo() {};
-			}
-			return null;
-		}
-    	
-    }
-    
-    public static class IAImpl implements IA, IAdaptable {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-		 */
-		public Object getAdapter(Class adapter) {
-			// TODO Auto-generated method stub
-			return null;
-		}	
-    }
-    
-    public static class ModelElement implements IModelElement, IAdaptable {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-		 */
-		public Object getAdapter(Class adapter) {
-			return null;
-		}
-    	
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ListContentProvider.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ListContentProvider.java
deleted file mode 100644
index 896707e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ListContentProvider.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-public class ListContentProvider implements IStructuredContentProvider {
-
-    /**
-     * @see IStructuredContentProvider#getElements(Object)
-     */
-    public Object[] getElements(Object inputElement) {
-        if (inputElement instanceof List) {
-            return ((List) inputElement).toArray();
-        }
-        return new Object[0];
-    }
-
-    /**
-     * @see IContentProvider#dispose()
-     */
-    public void dispose() {
-    }
-
-    /**
-     * @see IContentProvider#inputChanged(Viewer, Object, Object)
-     */
-    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ListElement.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ListElement.java
deleted file mode 100644
index 6a88e28..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ListElement.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.ui.IActionFilter;
-
-public class ListElement implements IAdaptable {
-
-    private String name;
-
-    private boolean flag;
-
-    public ListElement(String name) {
-        this(name, false);
-    }
-
-    public ListElement(String name, boolean flag) {
-        this.name = name;
-        this.flag = flag;
-    }
-
-    public String toString() {
-        return name + ':' + flag;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public boolean getFlag() {
-        return flag;
-    }
-
-    public Object getAdapter(Class adapter) {
-        if (adapter == IActionFilter.class) {
-            return ListElementActionFilter.getSingleton();
-        }
-        return null;
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ListElementActionFilter.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ListElementActionFilter.java
deleted file mode 100644
index 6f6f7de..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ListElementActionFilter.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IActionFilter;
-
-public class ListElementActionFilter implements IActionFilter {
-
-    private boolean called = false;
-
-    public static final String ATTR_NAME = "name";
-
-    public static final String ATTR_FLAG = "flag";
-
-    public static final String VAL_TRUE = "true";
-
-    public static final String VAL_FALSE = "false";
-
-    private static ListElementActionFilter singleton;
-
-    public static ListElementActionFilter getSingleton() {
-        if (singleton == null)
-            singleton = new ListElementActionFilter();
-        return singleton;
-    }
-
-    private ListElementActionFilter() {
-        super();
-    }
-
-    /**
-     * @see IActionFilter#testAttribute(Object, String, String)
-     */
-    public boolean testAttribute(Object target, String name, String value) {
-        called = true;
-        ListElement le = (ListElement) target;
-        if (name.equals(ATTR_NAME)) {
-            return value.equals(le.getName());
-        } else if (name.equals(ATTR_FLAG)) {
-            boolean flag = le.getFlag();
-            if (flag)
-                return value.equals(VAL_TRUE);
-            else
-                return value.equals(VAL_FALSE);
-        }
-        return false;
-    }
-
-    public void clearCalled() {
-        called = false;
-    }
-
-    public boolean getCalled() {
-        return called;
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ListElementPropertyTester.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ListElementPropertyTester.java
deleted file mode 100644
index 7870448..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ListElementPropertyTester.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.expressions.PropertyTester;
-
-public class ListElementPropertyTester extends PropertyTester {
-
-    public static final String ATTR_NAME = "name";
-
-    public boolean test(Object receiver, String property, Object[] args,
-            Object expectedValue) {
-        ListElement le = (ListElement) receiver;
-        if (property.equals(ATTR_NAME)) {
-            return expectedValue.equals(le.getName());
-        }
-        return false;
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ListView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ListView.java
deleted file mode 100644
index f4d6505..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ListView.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import java.util.ArrayList;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-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.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IWorkbenchActionConstants;
-
-/**
- * An ElementViewPart shows a bunch of elements in a list
- * viewer.
- */
-public class ListView extends MockViewPart implements IMenuListener {
-
-    ListViewer viewer;
-
-    ArrayList input;
-
-    MenuManager menuMgr;
-
-    Menu menu;
-
-    Action addAction;
-
-    String ADD_ACTION_ID = "addAction";
-
-    /**
-     * Constructor for ElementViewPart
-     */
-    public ListView() {
-        super();
-        input = new ArrayList();
-    }
-
-    /**
-     * @see IWorkbenchPart#createPartControl(Composite)
-     */
-    public void createPartControl(Composite parent) {
-        callTrace.add("createPartControl");
-
-        // Create viewer.
-        viewer = new ListViewer(parent);
-        viewer.setLabelProvider(new LabelProvider());
-        viewer.setContentProvider(new ListContentProvider());
-        viewer.setInput(input);
-
-        // Create popup menu.
-        createPopupMenu();
-
-        // Register stuff.
-        getSite().setSelectionProvider(viewer);
-    }
-
-    /**
-     * Creates a popup menu.
-     */
-    public void createPopupMenu() {
-        // Create actions.
-        addAction = new Action("Add Standard Items") {
-            public void run() {
-                addStandardItems();
-            }
-        };
-        addAction.setId(ADD_ACTION_ID);
-
-        // Create popup menu.
-        if (useStaticMenu())
-            createStaticPopupMenu();
-        else
-            createDynamicPopupMenu();
-    }
-
-    /**
-     * Creates a dynamic popup menu.
-     */
-    public void createDynamicPopupMenu() {
-        menuMgr = new MenuManager();
-        menuMgr.setRemoveAllWhenShown(true);
-        menuMgr.addMenuListener(this);
-        menu = menuMgr.createContextMenu(viewer.getControl());
-        viewer.getControl().setMenu(menu);
-        getSite().registerContextMenu(menuMgr, viewer);
-    }
-
-    /**
-     * Creates a static popup menu.
-     */
-    public void createStaticPopupMenu() {
-        menuMgr = new MenuManager();
-        menu = menuMgr.createContextMenu(viewer.getControl());
-        viewer.getControl().setMenu(menu);
-        getSite().registerContextMenu(menuMgr, viewer);
-        menuAboutToShow(menuMgr);
-    }
-
-    public void addElement(ListElement el) {
-        input.add(el);
-        viewer.refresh();
-        viewer.getControl().update();
-    }
-
-    public void selectElement(ListElement el) {
-        if (el == null)
-            viewer.setSelection(new StructuredSelection());
-        else
-            viewer.setSelection(new StructuredSelection(el));
-    }
-
-    public MenuManager getMenuManager() {
-        return menuMgr;
-    }
-
-    /**
-     * @see IMenuListener#menuAboutToShow(IMenuManager)
-     */
-    public void menuAboutToShow(IMenuManager menuMgr) {
-        menuMgr.add(addAction);
-        menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-    }
-
-    /**
-     * Tests that the menu mgr contains the expected actions.
-     */
-    public void verifyActions(TestCase test, IMenuManager menuMgr) {
-        Assert.assertNotNull(menuMgr.find(ADD_ACTION_ID));
-    }
-
-    public void addStandardItems() {
-        addElement(new ListElement("red"));
-        addElement(new ListElement("blue"));
-        addElement(new ListElement("green"));
-        addElement(new ListElement("red", true));
-    }
-
-    /**
-     * Returns <code>true</code> to indicate that a static menu should be used,
-     * <code>false</code> to indicate a dynamic menu.
-     */
-    private boolean useStaticMenu() {
-        Object data = getData();
-        if (data instanceof String) {
-            String arg = (String) data;
-            return arg.indexOf("-staticMenu") >= 0; //$NON-NLS-1$
-        }
-        return false;
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockAction.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockAction.java
deleted file mode 100644
index 814231c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockAction.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.tests.TestPlugin;
-
-public class MockAction extends Action {
-
-    private boolean hasRun = false;
-
-    /**
-     * Constructor for MockAction
-     */
-    protected MockAction(String text) {
-        super(text);
-        TestPlugin plugin = TestPlugin.getDefault();
-        setImageDescriptor(plugin.getImageDescriptor("anything.gif"));
-        setToolTipText(text);
-    }
-
-    /**
-     * Constructor for MockAction
-     */
-    protected MockAction(String text, ImageDescriptor image) {
-        super(text, image);
-        setToolTipText(text);
-    }
-
-    public void run() {
-        hasRun = true;
-    }
-
-    public void clearRun() {
-        hasRun = false;
-    }
-
-    public boolean getRun() {
-        return hasRun;
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockActionDelegate.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockActionDelegate.java
deleted file mode 100644
index d94def4..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockActionDelegate.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.tests.harness.util.CallHistory;
-
-public class MockActionDelegate implements IWorkbenchWindowActionDelegate {
-
-    public CallHistory callHistory;
-
-    public static final String ACTION_SET_ID = "org.eclipse.ui.tests.api.MockActionSet";
-
-    public static MockActionDelegate lastDelegate;
-
-    public MockActionDelegate() {
-        callHistory = new CallHistory(this);
-        lastDelegate = this;
-    }
-
-    /*
-     * @see IWorkbenchWindowActionDelegate#init(IWorkbenchWindow)
-     */
-    public void init(IWorkbenchWindow window) {
-    }
-
-    /**
-     * @see IActionDelegate#run(IAction)
-     */
-    public void run(IAction action) {
-        callHistory.add("run");
-    }
-
-    /**
-     * @see IActionDelegate#selectionChanged(IAction, ISelection)
-     */
-    public void selectionChanged(IAction action, ISelection selection) {
-        callHistory.add("selectionChanged");
-    }
-
-    /*
-     * @see IWorkbenchWindowActionDelegate#dispose()
-     */
-    public void dispose() {
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorActionBarContributor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorActionBarContributor.java
deleted file mode 100644
index f26d1c8..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorActionBarContributor.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.part.EditorActionBarContributor;
-import org.eclipse.ui.tests.harness.util.CallHistory;
-
-public class MockEditorActionBarContributor extends EditorActionBarContributor {
-    protected CallHistory callHistory;
-
-    protected IEditorPart target;
-
-    protected int ACTION_COUNT = 5;
-
-    protected MockAction[] actions;
-
-    /**
-     * Constructor for MockEditorActionBarContributor
-     */
-    public MockEditorActionBarContributor() {
-        super();
-        callHistory = new CallHistory(this);
-    }
-
-    public CallHistory getCallHistory() {
-        return callHistory;
-    }
-
-    /**
-     * @see IEditorActionBarContributor#init(IActionBars)
-     */
-    public void init(IActionBars bars) {
-        callHistory.add("init");
-        actions = new MockAction[ACTION_COUNT];
-        for (int nX = 0; nX < ACTION_COUNT; nX++) {
-            actions[nX] = new MockAction(Integer.toString(nX));
-            if (nX % 2 > 0)
-                actions[nX].setEnabled(false);
-        }
-        super.init(bars);
-    }
-
-    /**
-     * @see EditorActionBarContributor#contributeToToolBar(IToolBarManager)
-     */
-    public void contributeToToolBar(IToolBarManager toolBarManager) {
-        for (int i = 0; i < actions.length; ++i) {
-            toolBarManager.add(actions[i]);
-        }
-    }
-
-    /**
-     * @see IEditorActionBarContributor#setActiveEditor(IEditorPart)
-     */
-    public void setActiveEditor(IEditorPart targetEditor) {
-        callHistory.add("setActiveEditor");
-        target = targetEditor;
-    }
-
-    /**
-     * Returns the active editor.
-     */
-    public IEditorPart getActiveEditor() {
-        return target;
-    }
-
-    /**
-     * Returns the actions.
-     */
-    public MockAction[] getActions() {
-        return actions;
-    }
-
-    /**
-     * Set the enablement for all actions.
-     */
-    public void enableActions(boolean b) {
-        for (int nX = 0; nX < ACTION_COUNT; nX++) {
-            actions[nX].setEnabled(b);
-        }
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorActionDelegate.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorActionDelegate.java
deleted file mode 100644
index 9438cf1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorActionDelegate.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ui.IEditorActionDelegate;
-import org.eclipse.ui.IEditorPart;
-
-public class MockEditorActionDelegate extends MockActionDelegate implements
-        IEditorActionDelegate {
-    private IEditorPart target;
-
-    /**
-     * Constructor for MockEditorActionDelegate
-     */
-    public MockEditorActionDelegate() {
-        super();
-    }
-
-    /**
-     * @see IEditorActionDelegate#setActiveEditor(IAction, IEditorPart)
-     */
-    public void setActiveEditor(IAction action, IEditorPart targetEditor) {
-        callHistory.add("setActiveEditor");
-        target = targetEditor;
-    }
-
-    /**
-     * Returns the active editor.
-     */
-    public IEditorPart getActiveEditor() {
-        return target;
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorMatchingStrategy.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorMatchingStrategy.java
deleted file mode 100644
index 71cb032..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorMatchingStrategy.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorMatchingStrategy;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.ResourceUtil;
-
-/**
- * An editor matching strategy to support the IEditorMatchingStrategyTest tests.
- * This models the scenario for PDE manifest editors described in bug 53700.
- * 
- * @since 3.1
- */
-public class MockEditorMatchingStrategy implements IEditorMatchingStrategy {
-
-    public boolean matches(IEditorReference editorRef, IEditorInput input) {
-        IFile inputFile = ResourceUtil.getFile(input);
-        if (inputFile != null && inputFile.getParent() instanceof IProject) {
-            String name = inputFile.getName();
-            if (name.equals("plugin.xml") || name.equals("MANIFEST.MF") || name.equals("build.properties")) {
-                try {
-                    IFile editorFile = ResourceUtil.getFile(editorRef.getEditorInput());
-                    return editorFile != null && inputFile.getProject().equals(editorFile.getProject());
-                } catch (PartInitException e) {
-                    e.printStackTrace();
-                    return false;
-                }
-            }
-        }
-        return false;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorPart.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorPart.java
deleted file mode 100644
index bc1140e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorPart.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-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.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IShowEditorInput;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.IGotoMarker;
-
-public class MockEditorPart extends MockWorkbenchPart implements IEditorPart,
-        IGotoMarker, IShowEditorInput {
-
-    private static final String BASE = "org.eclipse.ui.tests.api.MockEditorPart";
-
-    public static final String ID1 = BASE + "1";
-
-    public static final String ID2 = BASE + "2";
-
-    public static final String NAME = "Mock Editor 1";
-
-    private IEditorInput input;
-
-    private boolean dirty = false;
-
-    private boolean saveNeeded = true;
-
-    private boolean saveAsAllowed = false;
-
-    public MockEditorPart() {
-        super();
-    }
-
-    public void createPartControl(Composite parent) {
-        super.createPartControl(parent);
-
-        final Button dirtyToggle = new Button(parent, SWT.CHECK);
-        dirtyToggle.setText("Dirty");
-        dirtyToggle.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                setDirty(dirtyToggle.getSelection());
-            }
-        });
-        dirtyToggle.setSelection(isDirty());
-
-        final Button saveNeededToggle = new Button(parent, SWT.CHECK);
-        saveNeededToggle.setText("Save on close");
-        saveNeededToggle.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                setSaveNeeded(saveNeededToggle.getSelection());
-            }
-        });
-        saveNeededToggle.setSelection(saveNeeded);
-        
-        final Button saveAsToggle = new Button(parent, SWT.CHECK);
-        saveAsToggle.setText("Save as allowed");
-        saveAsToggle.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                setSaveAsAllowed(saveAsToggle.getSelection());
-            }
-        });
-        saveAsToggle.setSelection(saveAsAllowed);
-    }
-    /**
-     * @see IEditorPart#doSave(IProgressMonitor)
-     */
-    public void doSave(IProgressMonitor monitor) {
-        setDirty(false);
-        callTrace.add("doSave");
-    }
-
-    /**
-     * @see IEditorPart#doSaveAs()
-     */
-    public void doSaveAs() {
-    }
-
-    /**
-     * @see IEditorPart#getEditorInput()
-     */
-    public IEditorInput getEditorInput() {
-        return input;
-    }
-
-    /**
-     * @see IEditorPart#getEditorSite()
-     */
-    public IEditorSite getEditorSite() {
-        return (IEditorSite) getSite();
-    }
-
-    /**
-     * @see org.eclipse.ui.ide.IGotoMarker
-     */
-    public void gotoMarker(IMarker marker) {
-        callTrace.add("gotoMarker");
-    }
-
-    /**
-     * @see IEditorPart#init(IEditorSite, IEditorInput)
-     */
-    public void init(IEditorSite site, IEditorInput input)
-            throws PartInitException {
-        this.input = input;
-        setSite(site);
-        callTrace.add("init");
-        setSiteInitialized();
-    }
-
-    /**
-     * @see IEditorPart#isDirty()
-     */
-    public boolean isDirty() {
-        callTrace.add("isDirty");
-        return dirty;
-    }
-
-    public void setDirty(boolean value) {
-        dirty = value;
-        firePropertyChange(PROP_DIRTY);
-    }
-
-    /**
-     * @see IEditorPart#isSaveAsAllowed()
-     */
-    public boolean isSaveAsAllowed() {
-        callTrace.add("isSaveAsAllowed");
-        return saveAsAllowed;
-    }
-
-    /**
-     * @see IEditorPart#isSaveOnCloseNeeded()
-     */
-    public boolean isSaveOnCloseNeeded() {
-        callTrace.add("isSaveOnCloseNeeded");
-        return saveNeeded;
-    }
-
-    public void setSaveAsAllowed(boolean isSaveAsAllowed) {
-        this.saveAsAllowed = isSaveAsAllowed;
-    }
-    
-    public void setSaveNeeded(boolean value) {
-        saveNeeded = value;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.api.MockWorkbenchPart#getActionBars()
-     */
-    protected IActionBars getActionBars() {
-        return getEditorSite().getActionBars();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IShowEditorInput#showEditorInput(org.eclipse.ui.IEditorInput)
-     */
-    public void showEditorInput(IEditorInput editorInput) {
-        callTrace.add("showEditorInput");
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorWithState.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorWithState.java
deleted file mode 100644
index 84e040b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockEditorWithState.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-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.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IPersistableEditor;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.PartInitException;
-
-public class MockEditorWithState extends MockWorkbenchPart implements
-		IEditorPart, IPersistableEditor {
-
-	public static final String ID = "org.eclipse.ui.tests.api.MockEditorStatePart";
-
-	public static final String NAME = "Mock Editor State 1";
-
-	private IEditorInput input;
-
-	private boolean dirty = false;
-
-	private boolean saveNeeded = true;
-
-	private boolean saveAsAllowed = false;
-
-	public MockEditorWithState() {
-		super();
-	}
-
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-
-		final Button dirtyToggle = new Button(parent, SWT.CHECK);
-		dirtyToggle.setText("Dirty");
-		dirtyToggle.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				setDirty(dirtyToggle.getSelection());
-			}
-		});
-		dirtyToggle.setSelection(isDirty());
-
-		final Button saveNeededToggle = new Button(parent, SWT.CHECK);
-		saveNeededToggle.setText("Save on close");
-		saveNeededToggle.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				setSaveNeeded(saveNeededToggle.getSelection());
-			}
-		});
-		saveNeededToggle.setSelection(saveNeeded);
-
-		final Button saveAsToggle = new Button(parent, SWT.CHECK);
-		saveAsToggle.setText("Save as allowed");
-		saveAsToggle.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				setSaveAsAllowed(saveAsToggle.getSelection());
-			}
-		});
-		saveAsToggle.setSelection(saveAsAllowed);
-	}
-
-	/**
-	 * @see IEditorPart#doSave(IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		setDirty(false);
-		callTrace.add("doSave");
-	}
-
-	/**
-	 * @see IEditorPart#doSaveAs()
-	 */
-	public void doSaveAs() {
-	}
-
-	/**
-	 * @see IEditorPart#getEditorInput()
-	 */
-	public IEditorInput getEditorInput() {
-		return input;
-	}
-
-	/**
-	 * @see IEditorPart#getEditorSite()
-	 */
-	public IEditorSite getEditorSite() {
-		return (IEditorSite) getSite();
-	}
-
-	/**
-	 * @see IEditorPart#init(IEditorSite, IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		this.input = input;
-		setSite(site);
-		callTrace.add("init");
-		setSiteInitialized();
-	}
-
-	/**
-	 * @see IEditorPart#isDirty()
-	 */
-	public boolean isDirty() {
-		callTrace.add("isDirty");
-		return dirty;
-	}
-
-	public void setDirty(boolean value) {
-		dirty = value;
-		firePropertyChange(PROP_DIRTY);
-	}
-
-	/**
-	 * @see IEditorPart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		callTrace.add("isSaveAsAllowed");
-		return saveAsAllowed;
-	}
-
-	/**
-	 * @see IEditorPart#isSaveOnCloseNeeded()
-	 */
-	public boolean isSaveOnCloseNeeded() {
-		callTrace.add("isSaveOnCloseNeeded");
-		return saveNeeded;
-	}
-
-	public void setSaveAsAllowed(boolean isSaveAsAllowed) {
-		this.saveAsAllowed = isSaveAsAllowed;
-	}
-
-	public void setSaveNeeded(boolean value) {
-		saveNeeded = value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.api.MockWorkbenchPart#getActionBars()
-	 */
-	protected IActionBars getActionBars() {
-		return getEditorSite().getActionBars();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IPersistableEditor#restoreState(org.eclipse.ui.IMemento)
-	 */
-	public void restoreState(IMemento memento) {
-		callTrace.add("restoreState");
-		String val = memento.getString("saveNeeded");
-		if (val != null) {
-			saveNeeded = Boolean.valueOf(val).booleanValue();
-		}
-		val = memento.getString("saveAsAllowed");
-		if (val != null) {
-			saveAsAllowed = Boolean.valueOf(val).booleanValue();
-		}
-		val = memento.getString("dirty");
-		if (val != null) {
-			dirty = Boolean.valueOf(val).booleanValue();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IPersistable#saveState(org.eclipse.ui.IMemento)
-	 */
-	public void saveState(IMemento memento) {
-		callTrace.add("saveState");
-		memento.putString("saveNeeded", String.valueOf(saveNeeded));
-		memento.putString("saveAsAllowed", String.valueOf(saveAsAllowed));
-		memento.putString("dirty", String.valueOf(dirty));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockPart.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockPart.java
deleted file mode 100644
index a5b2cfa..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockPart.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.commands.common.EventManager;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.tests.harness.util.CallHistory;
-import org.osgi.framework.Bundle;
-
-/**
- * Base class for mock intro and workbench parts.
- * 
- * @since 3.0
- */
-public class MockPart extends EventManager implements IExecutableExtension {
-
-    /**
-     * 
-     */
-    public MockPart() {
-        callTrace = new CallHistory(this);
-        selectionProvider = new MockSelectionProvider();
-    }
-
-    protected CallHistory callTrace;
-
-    protected MockSelectionProvider selectionProvider;
-
-    private IConfigurationElement config;
-
-    private Object data;
-
-    private Image titleImage;
-
-    private DisposeListener disposeListener = new DisposeListener() {
-    	/* (non-Javadoc)
-    	 * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
-    	 */
-    	public void widgetDisposed(DisposeEvent e) {
-    		MockPart.this.widgetDisposed();
-    	}
-    };
-    
-    public CallHistory getCallHistory() {
-        return callTrace;
-    }
-
-    public ISelectionProvider getSelectionProvider() {
-        return selectionProvider;
-    }
-
-    public void setInitializationData(IConfigurationElement config,
-            String propertyName, Object data) throws CoreException {
-    	
-    	callTrace.add("setInitializationData");
-    	
-        this.config = config;
-        this.data = data;
-
-        // Icon.
-        String strIcon = config.getAttribute("icon");//$NON-NLS-1$
-        if (strIcon != null) {
-            try {
-            	Bundle plugin = Platform.getBundle(config.getNamespace());
-                URL installURL = plugin.getEntry("/"); //$NON-NLS-1$
-                URL fullPathString = new URL(installURL, strIcon);
-                ImageDescriptor imageDesc = ImageDescriptor
-                        .createFromURL(fullPathString);
-                titleImage = imageDesc.createImage();
-            } catch (MalformedURLException e) {
-                // ignore
-            }
-        }
-    }
-
-    protected IConfigurationElement getConfig() {
-        return config;
-    }
-
-    protected Object getData() {
-        return data;
-    }
-
-    // This isn't actually part of the part API, but we call this method from a dispose listener
-    // in order to mark the point in time at which the widgets are disposed
-    public void widgetDisposed() {
-    	callTrace.add("widgetDisposed");
-    }
-    
-    /**
-     * @see IWorkbenchPart#addPropertyListener(IPropertyListener)
-     */
-    public void addPropertyListener(IPropertyListener listener) {
-        addListenerObject(listener);
-    }
-
-    /**
-     * @see IWorkbenchPart#createPartControl(Composite)
-     */
-    public void createPartControl(Composite parent) {
-        callTrace.add("createPartControl");
-        
-        parent.addDisposeListener(disposeListener);
-    }
-
-    /**
-     * @see IWorkbenchPart#dispose()
-     */
-    public void dispose() {
-        callTrace.add("dispose");
-    }
-
-    /**
-     * @see IWorkbenchPart#getTitleImage()
-     */
-    public Image getTitleImage() {
-        return titleImage;
-    }
-
-    /**
-     * @see IWorkbenchPart#removePropertyListener(IPropertyListener)
-     */
-    public void removePropertyListener(IPropertyListener listener) {
-        removeListenerObject(listener);
-    }
-
-    /**
-     * @see IWorkbenchPart#setFocus()
-     */
-    public void setFocus() {
-        callTrace.add("setFocus");
-    }
-
-    /**
-     * @see IAdaptable#getAdapter(Class)
-     */
-    public Object getAdapter(Class arg0) {
-        return null;
-    }
-
-    /**
-     * Fires a selection out.
-     */
-    public void fireSelection() {
-        selectionProvider.fireSelection();
-    }
-
-    /**
-     * Fires a property change event.
-     */
-    protected void firePropertyChange(int propertyId) {
-        Object[] listeners = getListeners();
-        for (int i = 0; i < listeners.length; i++) {
-            IPropertyListener l = (IPropertyListener) listeners[i];
-            l.propertyChanged(this, propertyId);
-        }
-    }
-
-    /**
-     * boolean to declare whether the site was properly initialized in the init method. 
-     */
-    private boolean siteState = false;
-
-    /**
-     * Sets whether the site was properly initialized in the init method.
-     */
-    protected void setSiteInitialized(boolean initialized) {
-        siteState = initialized;
-    }
-
-    /**
-     * Gets whether the site was properly initialized in the init method.
-     */
-    public boolean isSiteInitialized() {
-        return siteState;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockPartListener.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockPartListener.java
deleted file mode 100644
index f7346a2..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockPartListener.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.tests.harness.util.CallHistory;
-
-public class MockPartListener implements IPartListener {
-    private CallHistory callTrace;
-
-    public MockPartListener() {
-        callTrace = new CallHistory(this);
-    }
-
-    public CallHistory getCallHistory() {
-        return callTrace;
-    }
-
-    /**
-     * @see IPartListener#partActivated(IWorkbenchPart)
-     */
-    public void partActivated(IWorkbenchPart part) {
-        callTrace.add("partActivated");
-    }
-
-    /**
-     * @see IPartListener#partBroughtToTop(IWorkbenchPart)
-     */
-    public void partBroughtToTop(IWorkbenchPart part) {
-        callTrace.add("partBroughtToTop");
-    }
-
-    /**
-     * @see IPartListener#partClosed(IWorkbenchPart)
-     */
-    public void partClosed(IWorkbenchPart part) {
-        callTrace.add("partClosed");
-    }
-
-    /**
-     * @see IPartListener#partDeactivated(IWorkbenchPart)
-     */
-    public void partDeactivated(IWorkbenchPart part) {
-        callTrace.add("partDeactivated");
-    }
-
-    /**
-     * @see IPartListener#partOpened(IWorkbenchPart)
-     */
-    public void partOpened(IWorkbenchPart part) {
-        callTrace.add("partOpened");
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockPropertyListener.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockPropertyListener.java
deleted file mode 100644
index 4287f25..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockPropertyListener.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.tests.harness.util.CallHistory;
-
-public class MockPropertyListener implements IPropertyListener {
-    private CallHistory callTrace;
-
-    private Object sourceMask;
-
-    private int sourceId;
-
-    /**
-     * @param source the event source that fires the event to this listener
-     * @param id the property id for the event
-     */
-    public MockPropertyListener(Object source, int id) {
-        sourceMask = source;
-        sourceId = id;
-        callTrace = new CallHistory(this);
-    }
-
-    /**
-     * @see IPropertyListener#propertyChanged(Object, int)
-     */
-    public void propertyChanged(Object source, int propId) {
-        if (source == sourceMask && propId == sourceId)
-            callTrace.add("propertyChanged");
-    }
-
-    public CallHistory getCallHistory() {
-        return callTrace;
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockSelectionProvider.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockSelectionProvider.java
deleted file mode 100644
index bdcb045..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockSelectionProvider.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-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;
-
-public class MockSelectionProvider implements ISelectionProvider {
-
-    private List listeners = new ArrayList(3);
-
-    /**
-     * Fires out a selection to all listeners.
-     */
-    public void fireSelection() {
-        fireSelection(new SelectionChangedEvent(this, StructuredSelection.EMPTY));
-    }
-
-    /**
-     * Fires out a selection to all listeners.
-     */
-    public void fireSelection(SelectionChangedEvent event) {
-        Iterator iter = listeners.iterator();
-        while (iter.hasNext()) {
-            ((ISelectionChangedListener) iter.next()).selectionChanged(event);
-        }
-    }
-
-    /**
-     * @see ISelectionProvider#addSelectionChangedListener(ISelectionChangedListener)
-     */
-    public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        listeners.add(listener);
-    }
-
-    /**
-     * @see ISelectionProvider#getSelection()
-     */
-    public ISelection getSelection() {
-        return StructuredSelection.EMPTY;
-    }
-
-    /**
-     * @see ISelectionProvider#removeSelectionChangedListener(ISelectionChangedListener)
-     */
-    public void removeSelectionChangedListener(
-            ISelectionChangedListener listener) {
-        listeners.remove(listener);
-    }
-
-    /**
-     * @see ISelectionProvider#setSelection(ISelection)
-     */
-    public void setSelection(ISelection selection) {
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockViewActionDelegate.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockViewActionDelegate.java
deleted file mode 100644
index c8d2ac0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockViewActionDelegate.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * This mock is used to test IViewActionDelegate lifecycle.
- */
-public class MockViewActionDelegate extends MockActionDelegate implements
-        IViewActionDelegate {
-    /**
-     * Constructor for MockWorkbenchWindowActionDelegate
-     */
-    public MockViewActionDelegate() {
-        super();
-    }
-
-    /**
-     * @see IViewActionDelegate#init(IViewPart)
-     */
-    public void init(IViewPart view) {
-        callHistory.add("init");
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockViewPart.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockViewPart.java
deleted file mode 100644
index 490f178..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockViewPart.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import junit.framework.Assert;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-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.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.internal.WorkbenchImages;
-
-public class MockViewPart extends MockWorkbenchPart implements IViewPart {
-    public static String ID = "org.eclipse.ui.tests.api.MockViewPart";
-
-    public static String ID2 = ID + "2";
-
-    public static String ID3 = ID + "3";
-
-    public static String ID4 = ID + "4";
-
-    public static String IDMULT = ID + "Mult";
-
-    public static String NAME = "Mock View 1";
-
-    private ContributionItem toolbarItem = new ContributionItem("someId") {
-
-    	private DisposeListener disposeListener = new DisposeListener() {
-    		public void widgetDisposed(DisposeEvent e) {
-    			toolbarContributionItemWidgetDisposed();
-    		}
-
-    	};
-    	
-    	public void fill(ToolBar parent, int index) {
-    		super.fill(parent, index);
-    		
-    		ToolItem item = new ToolItem(parent, index);
-    		
-    		item.addDisposeListener(disposeListener);
-    		item.setImage(WorkbenchImages.getImage(ISharedImages.IMG_DEF_VIEW));
-    	}
-    	
-    	public void dispose() {
-    		toolbarContributionItemDisposed();
-    		super.dispose();
-    	}
-    };
-    
-    private class DummyAction extends Action {
-    	public DummyAction() {
-    		setText("Monkey");
-			setImageDescriptor(getViewSite().getWorkbenchWindow()
-					.getWorkbench().getSharedImages()
-					.getImageDescriptor(
-							ISharedImages.IMG_TOOL_DELETE));
-		}    	
-    }
-    
-    public MockViewPart() {
-        super();
-    }
-
-	/**
-     * @see IViewPart#getViewSite()
-     */
-    public IViewSite getViewSite() {
-        return (IViewSite) getSite();
-    }
-
-    /**
-     * @see IViewPart#init(IViewSite)
-     */
-    public void init(IViewSite site) throws PartInitException {
-        setSite(site);
-        callTrace.add("init");
-        setSiteInitialized();
-        addToolbarContributionItem();
-    }
-
-    /**
-     * @see IViewPart#init(IViewSite, IMemento)
-     */
-    public void init(IViewSite site, IMemento memento) throws PartInitException {
-        setSite(site);
-        callTrace.add("init");
-        setSiteInitialized();
-        addToolbarContributionItem();
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.api.MockWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-     */
-    public void createPartControl(Composite parent) {
-    	super.createPartControl(parent);
-    	
-        Button addAction = new Button(parent, SWT.PUSH);
-        addAction.setText("Add Action to Tool Bar");
-        addAction.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IActionBars bars = getViewSite().getActionBars();
-				bars.getToolBarManager().add(new DummyAction());
-				bars.updateActionBars();
-			}
-		});
-
-        Button removeAction = new Button(parent, SWT.PUSH);
-        removeAction.setText("Remove Action from Tool Bar");
-        removeAction.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IActionBars bars = getViewSite().getActionBars();
-				IToolBarManager tbm = bars.getToolBarManager();
-				IContributionItem[] items = tbm.getItems();
-				if (items.length > 0) {
-					IContributionItem item = items[items.length-1];
-					if (item instanceof ActionContributionItem) {
-						if (((ActionContributionItem) item).getAction() instanceof DummyAction) {
-							tbm.remove(item);
-							bars.updateActionBars();
-						}
-					}
-				}
-			}
-		});
-    }
-    
-    /* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.api.MockPart#dispose()
-	 */
-	public void dispose() {
-		// Test for bug 94457: The contribution items must still be in the toolbar manager at the
-		// time the part is disposed. (Changing this behavior would be a breaking change for some
-		// clients).
-		Assert.assertTrue( 
-				"Contribution items should not be removed from the site until after the part is disposed", 
-				getViewSite().getActionBars().getToolBarManager().find(toolbarItem.getId())
-				== toolbarItem );
-		super.dispose();
-	}
-
-	private void addToolbarContributionItem() {
-    	getViewSite().getActionBars().getToolBarManager().add(toolbarItem);
-    }
-
-	public void toolbarContributionItemWidgetDisposed() {
-		callTrace.add("toolbarContributionItemWidgetDisposed");
-	}
-    
-    public void toolbarContributionItemDisposed() {
-    	callTrace.add("toolbarContributionItemDisposed");
-	}
-	
-    /**
-     * @see IViewPart#saveState(IMemento)
-     */
-    public void saveState(IMemento memento) {
-    	// do nothing
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.api.MockWorkbenchPart#getActionBars()
-     */
-    protected IActionBars getActionBars() {
-        return getViewSite().getActionBars();
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockViewPartMult.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockViewPartMult.java
deleted file mode 100644
index f98816d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockViewPartMult.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-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.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-
-/**
- * The implementation of the multi-instance mock view.
- * Has a button to open another.
- * 
- * @since 3.1
- */
-public class MockViewPartMult extends MockViewPart {
-	static int counter = 1;
-	
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-		
-		Button button = new Button(parent, SWT.NONE);
-		button.setText("Open Another");
-		button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				openAnother();
-			}
-		});
-	}
-
-	public String getTitle() {
-		String title = super.getTitle();
-		String secondaryId = getViewSite().getSecondaryId();
-		if (secondaryId != null) {
-			title += " " + secondaryId;
-		}
-		return title;
-	}
-	
-	
-	private void openAnother() {
-		String secondaryId = String.valueOf(++counter);
-		try {
-			getSite().getPage().showView(MockViewPart.IDMULT, secondaryId, IWorkbenchPage.VIEW_ACTIVATE);
-		} catch (PartInitException e) {
-			e.printStackTrace();
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockWorkbenchPart.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockWorkbenchPart.java
deleted file mode 100644
index 86ccbe0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockWorkbenchPart.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartSite;
-
-public abstract class MockWorkbenchPart extends MockPart implements
-        IWorkbenchPart {
-
-    private IWorkbenchPartSite site;
-
-    private String title;
-
-    public MockWorkbenchPart() {
-        super();
-    }
-
-    public void setSite(IWorkbenchPartSite site) {
-        this.site = site;
-        site.setSelectionProvider(selectionProvider);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.api.MockPart#createPartControl(org.eclipse.swt.widgets.Composite)
-     */
-    public void createPartControl(Composite parent) {
-        super.createPartControl(parent);
-		parent.setLayout(new GridLayout());
-		
-        Label label = new Label(parent, SWT.NONE);
-        label.setText(title);
-    }
-
-    public IWorkbenchPartSite getSite() {
-        return site;
-    }
-
-    /**
-     * @see IWorkbenchPart#getTitle()
-     */
-    public String getTitle() {
-        return title;
-    }
-
-    /**
-     * @see IWorkbenchPart#getTitleToolTip()
-     */
-    public String getTitleToolTip() {
-        return title;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.api.MockPart#setInitializationData(org.eclipse.core.runtime.IConfigurationElement, java.lang.String, java.lang.Object)
-     */
-    public void setInitializationData(IConfigurationElement config,
-            String propertyName, Object data) throws CoreException {
-        // TODO Auto-generated method stub
-        super.setInitializationData(config, propertyName, data);
-        title = config.getAttribute("name");
-    }
-
-    protected void setSiteInitialized() {
-        setSiteInitialized(getSite().getKeyBindingService() != null
-                & getSite().getPage() != null
-                & getSite().getSelectionProvider() != null
-                & getSite().getWorkbenchWindow() != null
-                & testActionBars(getActionBars()));
-    }
-
-    /**
-     * @param actionBars
-     * @return
-     */
-    private boolean testActionBars(IActionBars bars) {
-        return bars != null && bars.getMenuManager() != null
-                && bars.getToolBarManager() != null
-                && bars.getStatusLineManager() != null;
-
-    }
-
-    protected abstract IActionBars getActionBars();
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockWorkbenchWindowActionDelegate.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockWorkbenchWindowActionDelegate.java
deleted file mode 100644
index cdba970..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockWorkbenchWindowActionDelegate.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-public class MockWorkbenchWindowActionDelegate extends MockActionDelegate
-        implements IWorkbenchWindowActionDelegate, IActionDelegate2 {
-    public static MockWorkbenchWindowActionDelegate lastDelegate;
-
-    public static String SET_ID = "org.eclipse.ui.tests.api.MockActionSet";
-
-    public static String ID = "org.eclipse.ui.tests.api.MockWindowAction";
-
-    /**
-     * Constructor for MockWorkbenchWindowActionDelegate
-     */
-    public MockWorkbenchWindowActionDelegate() {
-        super();
-        lastDelegate = this;
-    }
-
-    /**
-     * @see IWorkbenchWindowActionDelegate#init(IWorkbenchWindow)
-     */
-    public void init(IWorkbenchWindow window) {
-        callHistory.add("init");
-    }
-
-    /**
-     * @see IWorkbenchWindowActionDelegate#dispose()
-     */
-    public void dispose() {
-        callHistory.add("dispose");
-    }
-
-	public void init(IAction action) {
-		callHistory.add("init");
-	}
-
-	public void runWithEvent(IAction action, Event event) {
-		callHistory.add("runWithEvent");
-	}
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockWorkingSetPage.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockWorkingSetPage.java
deleted file mode 100644
index 59d26a5..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockWorkingSetPage.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.dialogs.IWorkingSetPage;
-
-/**
- * Tests the org.eclipse.ui.workingSets extension point.
- */
-public class MockWorkingSetPage extends WizardPage implements IWorkingSetPage {
-    private IWorkingSet workingSet;
-
-    /**
-     * Creates a new instance of the receiver.
-     */
-    public MockWorkingSetPage() {
-        super(
-                "MockWorkingSetPage", "Test Working Set", ImageDescriptor.getMissingImageDescriptor()); //$NON-NLS-1$ $NON-NLS-2$
-    }
-
-    /**
-     * Overrides method in WizardPage.
-     * 
-     * @see org.eclipse.jface.wizard.WizardPage#createControl(Composite)
-     */
-    public void createControl(Composite parent) {
-    }
-
-    /**
-     * Implements IWorkingSetPage.
-     * 
-     * @see org.eclipse.ui.dialogs.IWorkingSetPage#getSelection()
-     */
-    public IWorkingSet getSelection() {
-        return workingSet;
-    }
-
-    /**
-     * Implements IWorkingSetPage.
-     * 
-     * @see org.eclipse.ui.dialogs.IWorkingSetPage#setSelection(IWorkingSet)
-     */
-    public void setSelection(IWorkingSet workingSet) {
-    }
-
-    /**
-     * @see org.eclipse.ui.dialogs.IWorkingSetPage#finish()
-     */
-    public void finish() {
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockWorkingSetTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockWorkingSetTest.java
deleted file mode 100644
index 0f57809..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/MockWorkingSetTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.registry.WorkingSetDescriptor;
-import org.eclipse.ui.internal.registry.WorkingSetRegistry;
-
-/**
- * Tests the WorkingSetDescriptor and WorkingSetRegistry.
- */
-public class MockWorkingSetTest extends TestCase {
-    final static String WORKING_SET_ID = "org.eclipse.ui.tests.api.MockWorkingSet";
-
-    final static String WORKING_SET_NAME = "Mock Working Set";
-
-    final static String WORKING_SET_PAGE_CLASS_NAME = "org.eclipse.ui.tests.api.MockWorkingSetPage";
-
-    WorkingSetRegistry fRegistry;
-
-    public MockWorkingSetTest(String name) {
-        super(name);
-    }
-
-    /**
-     * @see junit.framework.TestCase#setUp()
-     */
-    protected void setUp() throws Exception {
-        super.setUp();
-        fRegistry = WorkbenchPlugin.getDefault().getWorkingSetRegistry();
-    }
-
-    public void testWorkingSetDescriptor() throws Throwable {
-        WorkingSetDescriptor workingSetDescriptor = fRegistry
-                .getWorkingSetDescriptor(WORKING_SET_ID);
-
-        assertNotNull(workingSetDescriptor.getIcon());
-        assertEquals(WORKING_SET_ID, workingSetDescriptor.getId());
-        assertEquals(WORKING_SET_NAME, workingSetDescriptor.getName());
-        assertEquals(WORKING_SET_PAGE_CLASS_NAME, workingSetDescriptor
-                .getPageClassName());
-    }
-
-    public void testWorkingSetRegistry() throws Throwable {
-        WorkingSetDescriptor[] workingSetDescriptors = fRegistry
-                .getWorkingSetDescriptors();
-        /*
-         * Should have at least resourceWorkingSetPage and MockWorkingSet
-         */
-        assertTrue(workingSetDescriptors.length >= 2);
-
-        assertEquals(Class.forName(WORKING_SET_PAGE_CLASS_NAME), fRegistry
-                .getWorkingSetPage(WORKING_SET_ID).getClass());
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveViewsBug120934.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveViewsBug120934.java
deleted file mode 100644
index 4bd233f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveViewsBug120934.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- * A layout that can trigger an problem interaction between 
- * {@link org.eclipse.ui.internal.presentations.util.PresentablePartFolder}
- * and {@link org.eclipse.ui.internal.presentations.defaultpresentation.EmptyTabFolder}.
- * 
- * @since 3.2
- */
-public class PerspectiveViewsBug120934 implements IPerspectiveFactory {
-	public static final String PERSP_ID = "org.eclipse.ui.tests.api.PerspectiveViewsBug120934";
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout)
-	 */
-	public void createInitialLayout(IPageLayout layout) {
-		layout.addView(IPageLayout.ID_BOOKMARKS, IPageLayout.RIGHT, 0.25f,
-				IPageLayout.ID_EDITOR_AREA);
-		layout.addStandaloneView(IPageLayout.ID_OUTLINE, false,
-				IPageLayout.TOP, .3f, IPageLayout.ID_BOOKMARKS);
-		layout.setEditorAreaVisible(false);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveViewsBug88345.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveViewsBug88345.java
deleted file mode 100644
index fe96602..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveViewsBug88345.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- * This perspective is used for testing api. It defines an initial layout with
- * placeholders for some views, to be used to test closing fast views. The
- * placeholders are added at top level (not in any folder).
- * 
- * @since 3.1.1
- */
-public class PerspectiveViewsBug88345 implements IPerspectiveFactory {
-
-	public static final String NORMAL_VIEW_ID = "org.eclipse.ui.views.ContentOutline";
-	public static final String PERSP_ID = "org.eclipse.ui.tests.api.PerspectiveViewsBug88345";
-	public static final String MOVE_ID = MockViewPart.IDMULT + ":1";
-	/**
-	 * A view with a toolbar (not a room with a view).
-	 */
-	public static final String PROP_SHEET_ID = "org.eclipse.ui.views.PropertySheet";
-
-	public PerspectiveViewsBug88345() {
-		// do nothing
-	}
-
-	public void createInitialLayout(IPageLayout layout) {
-		layout.addView(MockViewPart.IDMULT, IPageLayout.LEFT, 0.33f,
-				IPageLayout.ID_EDITOR_AREA);
-		layout.addView(NORMAL_VIEW_ID,
-				IPageLayout.RIGHT, 0.25f, IPageLayout.ID_EDITOR_AREA);
-		layout.addView(PROP_SHEET_ID, IPageLayout.RIGHT, 0.75f, NORMAL_VIEW_ID);
-		layout.getViewLayout(MockViewPart.IDMULT).setCloseable(false);
-		
-		// added for the bug 99723 test
-		layout.addFastView(MOVE_ID);
-		layout.getViewLayout(MOVE_ID).setMoveable(false);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveWithFastView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveWithFastView.java
deleted file mode 100644
index 7de6dbf..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveWithFastView.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- * This perspective is used for testing api. It defines an initial layout with a
- * fast view.
- */
-public class PerspectiveWithFastView implements IPerspectiveFactory {
-
-    public static String PERSP_ID = "org.eclipse.ui.tests.fastview_perspective"; //$NON-NLS-1$
-
-    /**
-     * Constructs a new Default layout engine.
-     */
-    public PerspectiveWithFastView() {
-        super();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout)
-     */
-    public void createInitialLayout(IPageLayout layout) {
-        defineLayout(layout);
-    }
-
-    /**
-     * Define the initial layout by adding a fast view.
-     * 
-     * @param layout
-     *            The page layout.
-     */
-    public void defineLayout(IPageLayout layout) {
-        layout.addFastView("org.eclipse.ui.views.ResourceNavigator", .8f); //$NON-NLS-1$
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveWithMultiViewPlaceholdersAtTopLevel.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveWithMultiViewPlaceholdersAtTopLevel.java
deleted file mode 100644
index 2c0c8bd..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveWithMultiViewPlaceholdersAtTopLevel.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- * This perspective is used for testing api. It defines an initial layout with 
- * placeholders for multi-instance views, including wildcards.
- * The placeholders are added at top level (not in any folder).
- * 
- * @since 3.1
- */
-public class PerspectiveWithMultiViewPlaceholdersAtTopLevel implements IPerspectiveFactory {
-
-    public static String PERSP_ID = "org.eclipse.ui.tests.PerspectiveWithMultiViewPlaceholdersAtTopLevel"; //$NON-NLS-1$
-
-    public PerspectiveWithMultiViewPlaceholdersAtTopLevel() {
-        // do nothing
-    }
-
-    public void createInitialLayout(IPageLayout layout) {
-        layout.addPlaceholder("*", IPageLayout.LEFT, 0.5f, IPageLayout.ID_EDITOR_AREA);
-        layout.addPlaceholder(MockViewPart.IDMULT, IPageLayout.LEFT, 0.5f, IPageLayout.ID_EDITOR_AREA);
-        layout.addPlaceholder(MockViewPart.IDMULT + ":secondaryId", IPageLayout.LEFT, 0.5f, IPageLayout.ID_EDITOR_AREA);
-        layout.addPlaceholder(MockViewPart.IDMULT + ":*", IPageLayout.LEFT, 0.5f, IPageLayout.ID_EDITOR_AREA);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveWithMultiViewPlaceholdersInFolder.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveWithMultiViewPlaceholdersInFolder.java
deleted file mode 100644
index 317a50d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveWithMultiViewPlaceholdersInFolder.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-
-/**
- * This perspective is used for testing api. It defines an initial layout with 
- * placeholders for multi-instance views, including wildcards.
- * The placeholders are added in a folder (not a placeholder folder).
- * 
- * @since 3.1
- */
-public class PerspectiveWithMultiViewPlaceholdersInFolder extends PerspectiveWithMultiViewPlaceholdersInPlaceholderFolder {
-
-    public static String PERSP_ID = "org.eclipse.ui.tests.PerspectiveWithMultiViewPlaceholdersInFolder"; //$NON-NLS-1$
-
-    public PerspectiveWithMultiViewPlaceholdersInFolder() {
-        // do nothing
-    }
-
-    public void createInitialLayout(IPageLayout layout) {
-        IFolderLayout folder = layout.createFolder("folder", IPageLayout.LEFT, 0.5f, IPageLayout.ID_EDITOR_AREA);
-        addPlaceholders(folder);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveWithMultiViewPlaceholdersInPlaceholderFolder.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveWithMultiViewPlaceholdersInPlaceholderFolder.java
deleted file mode 100644
index b95a9fa..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PerspectiveWithMultiViewPlaceholdersInPlaceholderFolder.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-import org.eclipse.ui.IPlaceholderFolderLayout;
-
-/**
- * This perspective is used for testing api. It defines an initial layout with 
- * placeholders for multi-instance views, including wildcards.
- * The placeholders are added in a placeholder folder.
- * 
- * @since 3.1
- */
-public class PerspectiveWithMultiViewPlaceholdersInPlaceholderFolder implements IPerspectiveFactory {
-
-    public static String PERSP_ID = "org.eclipse.ui.tests.PerspectiveWithMultiViewPlaceholdersInPlaceholderFolder"; //$NON-NLS-1$
-
-    public PerspectiveWithMultiViewPlaceholdersInPlaceholderFolder() {
-        // do nothing
-    }
-
-    public void createInitialLayout(IPageLayout layout) {
-        IPlaceholderFolderLayout folder = layout.createPlaceholderFolder("placeholderFolder", IPageLayout.LEFT, 0.5f, IPageLayout.ID_EDITOR_AREA);
-        addPlaceholders(folder);
-    }
-    
-    protected void addPlaceholders(IPlaceholderFolderLayout folder) {
-        folder.addPlaceholder("*");
-        folder.addPlaceholder(MockViewPart.IDMULT);
-        folder.addPlaceholder(MockViewPart.IDMULT + ":secondaryId");
-        folder.addPlaceholder(MockViewPart.IDMULT + ":*");
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PlatformUITest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PlatformUITest.java
deleted file mode 100644
index c606c2f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/PlatformUITest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Tests the PlatformUI class.
- */
-public class PlatformUITest extends TestCase {
-
-    public PlatformUITest(String testName) {
-        super(testName);
-    }
-
-    public void testGetWorkbench() throws Throwable {
-        // From Javadoc: "Returns the workbench interface."
-        IWorkbench wb = PlatformUI.getWorkbench();
-        assertNotNull(wb);
-    }
-
-    public void testPLUGIN_ID() {
-        // From Javadoc: "Identifies the workbench plugin."
-        assertNotNull(PlatformUI.PLUGIN_ID);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SaveableMockViewPart.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SaveableMockViewPart.java
deleted file mode 100644
index fd8306f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SaveableMockViewPart.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-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.ui.ISaveablePart;
-
-/**
- * Mock view part that implements ISaveablePart.
- * Used for testing hideView and other view lifecycle on saveable views.
- * 
- * @since 3.0.1
- */
-public class SaveableMockViewPart extends MockViewPart implements
-		ISaveablePart {
-	
-	public static String ID = "org.eclipse.ui.tests.api.SaveableMockViewPart";
-
-	private boolean isDirty = false;
-
-    private boolean saveAsAllowed = false;
-
-    private boolean saveNeeded = true;
-
-    public void createPartControl(Composite parent) {
-        super.createPartControl(parent);
-
-        final Button dirtyToggle = new Button(parent, SWT.CHECK);
-        dirtyToggle.setText("Dirty");
-        dirtyToggle.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                setDirty(dirtyToggle.getSelection());
-            }
-        });
-        dirtyToggle.setSelection(isDirty());
-
-        final Button saveNeededToggle = new Button(parent, SWT.CHECK);
-        saveNeededToggle.setText("Save on close");
-        saveNeededToggle.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                setSaveNeeded(saveNeededToggle.getSelection());
-            }
-        });
-        saveNeededToggle.setSelection(saveNeeded);
-        
-        final Button saveAsToggle = new Button(parent, SWT.CHECK);
-        saveAsToggle.setText("Save as allowed");
-        saveAsToggle.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                setSaveAsAllowed(saveAsToggle.getSelection());
-            }
-        });
-        saveAsToggle.setSelection(saveAsAllowed);
-    }
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		callTrace.add("doSave" );
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-		callTrace.add("doSaveAs" );
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() {
-		callTrace.add("isDirty" );
-		return isDirty;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		callTrace.add("isSaveAsAllowed" );
-		return saveAsAllowed ;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isSaveOnCloseNeeded()
-	 */
-	public boolean isSaveOnCloseNeeded() {
-		callTrace.add("isSaveOnCloseNeeded" );
-		return saveNeeded;
-	}
-
-	public void setDirty(boolean isDirty) {
-		this.isDirty = isDirty;
-        firePropertyChange(PROP_DIRTY);
-	}
-    
-    public void setSaveAsAllowed(boolean isSaveAsAllowed) {
-        this.saveAsAllowed = isSaveAsAllowed;
-    }
-    
-    public void setSaveNeeded(boolean isSaveOnCloseNeeded) {
-        this.saveNeeded = isSaveOnCloseNeeded;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SessionCreateTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SessionCreateTest.java
deleted file mode 100644
index 30d57e1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SessionCreateTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.harness.util.EmptyPerspective;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * SessionCreateTest runs the first half of our session
- * presistance tests.
- * 
- */
-public class SessionCreateTest extends UITestCase {
-
-    private IWorkbenchWindow[] oldWindows;
-
-    public static String TEST_PROJ = "sessionTest";
-
-    public static String TEST_FILE_1 = "one.mock1";
-
-    public static String TEST_FILE_2 = "two.mock1";
-
-    public static String TEST_FILE_3 = "three.mock1";
-
-    /** 
-     * Construct an instance.
-     */
-    public SessionCreateTest(String arg) {
-        super(arg);
-    }
-
-    /**
-     * Generates a session state in the workbench.
-     */
-    public void testSessionCreation() throws Throwable {
-        IWorkbenchWindow window;
-        IWorkbenchPage page;
-
-        // Save the original windows.  We close all of
-        // these at the end, after the test windows have
-        // been created.
-        saveOriginalWindows();
-
-        // Create test window with empty perspective.
-        window = fWorkbench.openWorkbenchWindow(EmptyPerspective.PERSP_ID, getPageInput());
-
-        // Create test window with empty perspective and
-        // session perspective.
-        window = fWorkbench.openWorkbenchWindow(EmptyPerspective.PERSP_ID, getPageInput());
-        page = window.openPage(SessionPerspective.ID, getPageInput());
-
-        // Create test window with two session perspectives.
-        window = fWorkbench.openWorkbenchWindow(SessionPerspective.ID, getPageInput());
-        page = window.openPage(SessionPerspective.ID, getPageInput());
-
-        // Open 3 editors in last page.
-        IProject proj = FileUtil.createProject(TEST_PROJ);
-        IFile file = FileUtil.createFile(TEST_FILE_1, proj);
-        page.openEditor(new FileEditorInput(file), MockEditorPart.ID1);
-        file = FileUtil.createFile(TEST_FILE_2, proj);
-        page.openEditor(new FileEditorInput(file), MockEditorPart.ID1);
-        file = FileUtil.createFile(TEST_FILE_3, proj);
-        page.openEditor(new FileEditorInput(file), MockEditorPart.ID1);
-
-        // Close the original windows.
-        closeOriginalWindows();
-    }
-
-    /**
-     * Saves the original window set.
-     */
-    private void saveOriginalWindows() {
-        oldWindows = fWorkbench.getWorkbenchWindows();
-    }
-
-    /**
-     * Closes the original window set.
-     */
-    private void closeOriginalWindows() {
-        for (int nX = 0; nX < oldWindows.length; nX++) {
-            oldWindows[nX].close();
-        }
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SessionEditorPart.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SessionEditorPart.java
deleted file mode 100644
index ee7bf67..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SessionEditorPart.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.EditorPart;
-
-/**
- * @since 3.1
- * 
- */
-public class SessionEditorPart extends EditorPart {
-
-	public static int instantiatedEditors = 0;
-	
-	private Composite fMainPanel;
-
-	/**
-	 * 
-	 */
-	public SessionEditorPart() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
-	 */
-	public void doSaveAs() {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite,
-	 *      org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		if (!(input instanceof IFileEditorInput))
-			throw new PartInitException(
-					"Invalid Input: Must be IFileEditorInput");
-		setSite(site);
-		setInput(input);
-		++SessionEditorPart.instantiatedEditors;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#isDirty()
-	 */
-	public boolean isDirty() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-	       fMainPanel = new Composite(parent, SWT.NONE);
-	       fMainPanel.setLayout(new RowLayout(SWT.VERTICAL));
-	       
-	       Label l = new Label(fMainPanel, SWT.NONE);
-	       l.setText("Editor Title:");
-	       
-	       l = new Label(fMainPanel, SWT.BORDER);
-	       l.setText(getEditorInput().getName());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		fMainPanel.setFocus();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SessionPerspective.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SessionPerspective.java
deleted file mode 100644
index b37dac8..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SessionPerspective.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- * This class tests the persistance of a perspective.
- */
-public class SessionPerspective implements IPerspectiveFactory {
-
-    public static String ID = "org.eclipse.ui.tests.api.SessionPerspective";
-
-    /**
-     * @see IPerspectiveFactory#createInitialLayout(IPageLayout)
-     */
-    public void createInitialLayout(IPageLayout layout) {
-        String editorArea = layout.getEditorArea();
-        layout
-                .addView(SessionView.VIEW_ID, IPageLayout.LEFT, 0.33f,
-                        editorArea);
-        layout.addPlaceholder(MockViewPart.ID4, IPageLayout.RIGHT, .033f,
-                editorArea);
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SessionRestoreTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SessionRestoreTest.java
deleted file mode 100644
index 104cd91..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SessionRestoreTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.EmptyPerspective;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * SessionRestoreTest runs the second half of our session
- * presistance tests.
- * 
- */
-public class SessionRestoreTest extends UITestCase {
-
-    /** 
-     * Construct an instance.
-     */
-    public SessionRestoreTest(String arg) {
-        super(arg);
-    }
-
-    /**
-     * Generates a session state in the workbench.
-     */
-    public void testRestoreSession() throws Throwable {
-        IWorkbenchWindow[] windows;
-        IWorkbenchPage[] pages;
-
-        // Get windows.
-        windows = fWorkbench.getWorkbenchWindows();
-        assertEquals(windows.length, 3);
-
-        // First window contains empty perspective.
-        pages = windows[0].getPages();
-        assertEquals(pages.length, 1);
-        assertEquals(pages[0].getPerspective().getId(),
-                EmptyPerspective.PERSP_ID);
-
-        // Second window contains empty + session.
-        pages = windows[1].getPages();
-        assertEquals(pages.length, 2);
-        assertEquals(pages[0].getPerspective().getId(),
-                EmptyPerspective.PERSP_ID);
-        assertEquals(pages[1].getPerspective().getId(), SessionPerspective.ID);
-        testSessionView(pages[1]);
-
-        // Third window contains 2 sessions.
-        pages = windows[2].getPages();
-        assertEquals(pages.length, 2);
-        assertEquals(pages[0].getPerspective().getId(), SessionPerspective.ID);
-        assertEquals(pages[1].getPerspective().getId(), SessionPerspective.ID);
-        testSessionView(pages[0]);
-        testSessionView(pages[1]);
-
-        // Last page contains 3 editors.
-        IEditorReference[] editors = pages[1].getEditorReferences();
-        assertEquals(editors.length, 3);
-        testSessionEditor(editors[0].getEditor(true),
-                SessionCreateTest.TEST_FILE_1);
-        testSessionEditor(editors[1].getEditor(true),
-                SessionCreateTest.TEST_FILE_2);
-        testSessionEditor(editors[2].getEditor(true),
-                SessionCreateTest.TEST_FILE_3);
-    }
-
-    /**
-     * Tests the session view within a page.
-     */
-    private void testSessionView(IWorkbenchPage page) {
-        IViewPart view = page.findView(SessionView.VIEW_ID);
-        assertNotNull(view);
-        SessionView sessionView = (SessionView) view;
-        sessionView.testMementoState(this);
-    }
-
-    /**
-     * Tests the state of a session editor.
-     */
-    private void testSessionEditor(IEditorPart part, String fileName) {
-        IEditorSite site = part.getEditorSite();
-        assertEquals(site.getId(), MockEditorPart.ID1);
-        IEditorInput input = part.getEditorInput();
-        assertTrue(input instanceof IFileEditorInput);
-        IFile file = ((IFileEditorInput) input).getFile();
-        assertEquals(fileName, file.getName());
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SessionView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SessionView.java
deleted file mode 100644
index 73fcbb6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/SessionView.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-
-/**
- * This view is used to test the creation and restoration of 
- * view state between sessions.
- */
-public class SessionView extends MockViewPart {
-
-    private IMemento memento;
-
-    public static String VIEW_ID = "org.eclipse.ui.tests.api.SessionView";
-
-    /**
-     * Constructor for SessionView
-     */
-    public SessionView() {
-        super();
-    }
-
-    /**
-     * @see IViewPart#init(IViewSite, IMemento)
-     */
-    public void init(IViewSite site, IMemento memento) throws PartInitException {
-        super.init(site, memento);
-        this.memento = memento;
-    }
-
-    /**
-     * Create an IMemento.
-     */
-    public void saveState(IMemento memento) {
-        createMementoState(memento);
-    }
-
-    /**
-     * Creates an IMemento.
-     */
-    private void createMementoState(IMemento memento) {
-        // Create float, integer and string.
-        memento.putFloat("float", 0.50f);
-        memento.putInteger("integer", 50);
-        memento.putString("string", "50");
-
-        // Create a single child.
-        IMemento child = memento.createChild("single");
-        child.putInteger("id", 1);
-
-        // Create multiple children.
-        int count = 10;
-        for (int nX = 0; nX < count; nX++) {
-            child = memento.createChild("multiple");
-            child.putInteger("id", nX);
-        }
-        memento.putInteger("multiple.count", count);
-    }
-
-    /**
-     * Restore an IMemento.
-     */
-    public void testMementoState(TestCase testCase) {
-        // Verify that the memento was passed to us in
-        // constructor.
-        Assert.assertNotNull(memento);
-
-        // Read float.	
-        Float bigFloat = memento.getFloat("float");
-        Assert.assertNotNull(bigFloat);
-        Assert.assertEquals(bigFloat.floatValue(), 0.50f, 0.0001);
-
-        // Read int.	
-        Integer bigInt = memento.getInteger("integer");
-        Assert.assertEquals(bigInt, new Integer(50));
-
-        // Read string.
-        String str = memento.getString("string");
-        Assert.assertEquals(str, "50");
-
-        // Read single child.
-        IMemento child = memento.getChild("single");
-        Assert.assertNotNull(child);
-        bigInt = child.getInteger("id");
-        Assert.assertEquals(bigInt, new Integer(1));
-
-        // Read multiple children.
-        bigInt = memento.getInteger("multiple.count");
-        Assert.assertNotNull(bigInt);
-        int count = bigInt.intValue();
-        IMemento[] children = memento.getChildren("multiple");
-        Assert.assertEquals(count, children.length);
-        for (int nX = 0; nX < count; nX++) {
-            child = children[nX];
-            Assert.assertNotNull(child);
-            bigInt = child.getInteger("id");
-            Assert.assertEquals(bigInt, new Integer(nX));
-        }
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/StartupClass.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/StartupClass.java
deleted file mode 100644
index 9019a4f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/StartupClass.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import junit.framework.Assert;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IStartup;
-
-public class StartupClass implements IStartup {
-
-    /**
-     * This boolean should only be true if the earlyStartup() method
-     * has been called.
-     */
-    private static boolean earlyStartupCalled = false;
-
-    /**
-     * This boolean should only be true if the earlyStartup() method
-     * has completed.
-     */
-    private static boolean earlyStartupCompleted = false;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IStartup#earlyStartup()
-     */
-    public void earlyStartup() {
-        earlyStartupCalled = true;
-        Assert.assertNull("IStartup should run in non-UI thread", Display.getCurrent());
-        try {
-			Thread.sleep(3000);
-		} catch (InterruptedException e) {
-			// ignore
-		}
-		earlyStartupCompleted = true;
-    }
-
-    public static boolean getEarlyStartupCalled() {
-        return earlyStartupCalled;
-    }
-
-    public static boolean getEarlyStartupCompleted() {
-        return earlyStartupCompleted;
-    }
-
-    /**
-     * Reset the flags.
-     */
-    public static void reset() {
-        earlyStartupCalled = false;
-        earlyStartupCompleted = false;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/StartupTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/StartupTest.java
deleted file mode 100644
index c67a8c1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/StartupTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.tests.TestPlugin;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-public class StartupTest extends UITestCase {
-
-    /** 
-     * Construct an instance.
-     */
-    public StartupTest(String arg) {
-        super(arg);
-    }
-
-    public void testStartup() {
-        assertTrue("Startup - explicit", StartupClass.getEarlyStartupCalled());
-        assertTrue("Startup - implicit", TestPlugin.getEarlyStartupCalled());
-        assertTrue("Startup - completed before tests", StartupClass.getEarlyStartupCompleted());
-    }
-
-    protected void doTearDown() throws Exception {
-        super.doTearDown();
-        // NOTE:  tearDown will run after each test.  Therefore, we
-        // only want one test in this suite (or the values set when
-        // this plugin started up will be lost).
-        StartupClass.reset();
-        TestPlugin.clearEarlyStartup();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/StickyViewTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/StickyViewTest.java
deleted file mode 100644
index 92fd691..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/StickyViewTest.java
+++ /dev/null
@@ -1,470 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.internal.FastViewBar;
-import org.eclipse.ui.internal.FastViewBarContextMenuContribution;
-import org.eclipse.ui.internal.PartSite;
-import org.eclipse.ui.internal.ViewPane;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.internal.util.PrefUtil;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.views.IStickyViewDescriptor;
-
-/**
- * @since 3.0
- */
-public class StickyViewTest extends UITestCase {
-	
-	/**
-	 * Allow tests to run just in this class.
-	 * @return the TestSuite to run.
-	 */
-	public static TestSuite suite() {
-		return new TestSuite(StickyViewTest.class);
-	}
-	
-    private IWorkbenchWindow window;
-
-    private IWorkbenchPage page;
-
-    /**
-     * @param testName
-     */
-    public StickyViewTest(String testName) {
-        super(testName);
-    }
-
-    public void testStackPlacementRight() {
-        testStackPlacement("Right");
-    }
-
-    public void testStackPlacementLeft() {
-        testStackPlacement("Left");
-    }
-
-    public void testStackPlacementTop() {
-        testStackPlacement("Top");
-    }
-
-    public void testStackPlacementBottom() {
-        testStackPlacement("Bottom");
-    }
-
-    /**
-     * Tests to ensure that sticky views are opened in the same stack.
-     */
-    private void testStackPlacement(String location) {
-        try {
-            IViewPart part1 = page
-                    .showView("org.eclipse.ui.tests.api.StickyView" + location
-                            + "1");
-            assertNotNull(part1);
-            IViewPart part2 = page
-                    .showView("org.eclipse.ui.tests.api.StickyView" + location
-                            + "2");
-            assertNotNull(part2);
-            IViewPart[] stack = page.getViewStack(part1);
-
-            assertTrue(ViewUtils.findInStack(stack, part1));
-            assertTrue(ViewUtils.findInStack(stack, part2));
-
-        } catch (PartInitException e) {
-            fail(e.getMessage());
-        }
-
-    }
-
-    /**
-     * Tests to ensure that all views in a stack with a known sticky view are also sticky.
-     */
-    public void testStackContents() {
-        try {
-            IViewPart part1 = page
-                    .showView("org.eclipse.ui.tests.api.StickyViewRight1");
-            assertNotNull(part1);
-
-            IViewPart[] stack = page.getViewStack(part1);
-
-            for (int i = 0; i < stack.length; i++) {
-                assertTrue(stack[i].getTitle(), ViewUtils.isSticky(stack[i]));
-            }
-        } catch (PartInitException e) {
-            fail(e.getMessage());
-        }
-    }
-
-    /**
-     * Tests whether the moveable flag is being picked up and honoured
-     * from the XML.
-     */
-    public void testClosableFlag() {
-        //explicit closeable = true
-        testCloseable("org.eclipse.ui.tests.api.StickyViewRight1", true);
-        //explicit closeable = false
-        testCloseable("org.eclipse.ui.tests.api.StickyViewRight2", false);
-        //implicit closeable = true
-        testCloseable("org.eclipse.ui.tests.api.StickyViewLeft1", true);
-    }
-
-    public void testMoveableFlag() {
-        //explicit closeable = true
-        testMoveable("org.eclipse.ui.tests.api.StickyViewRight1", true);
-        //explicit closeable = false
-        testMoveable("org.eclipse.ui.tests.api.StickyViewRight2", false);
-        //implicit closeable = true
-        testMoveable("org.eclipse.ui.tests.api.StickyViewLeft1", true);
-    }
-
-    /** 
-     * Tests whether a sticky view with the given id is moveable or not.
-     * 
-     * @param id the id
-     * @param expectation the expected moveable state
-     */
-    private void testMoveable(String id, boolean expectation) {
-        try {
-            IViewPart part = page.showView(id);
-            assertNotNull(part);
-            assertTrue(ViewUtils.isSticky(part));
-
-            //tests to ensure that the XML was read correctly            
-            IStickyViewDescriptor[] descs = WorkbenchPlugin.getDefault()
-                    .getViewRegistry().getStickyViews();
-            for (int i = 0; i < descs.length; i++) {
-                if (descs[i].getId().equals(id)) {
-                    assertEquals(expectation, descs[i].isMoveable());
-                }
-            }
-
-            // tests to ensure that the property is being honoured by the perspective
-            assertEquals(expectation, ViewUtils.isMoveable(part));
-        } catch (PartInitException e) {
-            fail(e.getMessage());
-        }
-    }
-
-    /** 
-     * Tests whether a sticky view with the given id is closeable or not.
-     * 
-     * @param id the id
-     * @param expectation the expected closeable state
-     */
-    private void testCloseable(String id, boolean expectation) {
-        try {
-            IViewPart part = page.showView(id);
-            assertNotNull(part);
-            assertTrue(ViewUtils.isSticky(part));
-
-            //tests to ensure that the XML was read correctly            
-            IStickyViewDescriptor[] descs = WorkbenchPlugin.getDefault()
-                    .getViewRegistry().getStickyViews();
-            for (int i = 0; i < descs.length; i++) {
-                if (descs[i].getId().equals(id)) {
-                    assertEquals(expectation, descs[i].isCloseable());
-                }
-            }
-
-            // tests to ensure that the property is being honoured by the perspective
-            assertEquals(expectation, ViewUtils.isCloseable(part));
-        } catch (PartInitException e) {
-            fail(e.getMessage());
-        }
-    }
-
-    /**
-     * Sticky views should remain after perspective reset.
-     */
-    public void testPerspectiveReset() {
-        try {
-            page.showView("org.eclipse.ui.tests.api.StickyViewRight1");
-            page.resetPerspective();
-            assertNotNull(page
-                    .findView("org.eclipse.ui.tests.api.StickyViewRight1"));
-        } catch (PartInitException e) {
-            fail(e.getMessage());
-        }
-    }
-
-    /**
-     * Tests that a sticky view is opened in successive perspectives.
-     */
-    public void testPerspectiveOpen() {
-        try {
-            page.showView("org.eclipse.ui.tests.api.StickyViewRight1");
-            page.setPerspective(WorkbenchPlugin.getDefault()
-                    .getPerspectiveRegistry().findPerspectiveWithId(
-                            "org.eclipse.ui.tests.api.SessionPerspective"));
-            assertNotNull(page
-                    .findView("org.eclipse.ui.tests.api.StickyViewRight1"));
-        } catch (PartInitException e) {
-            fail(e.getMessage());
-        }
-    }
-    
-    /**
-     * Test that closing a stand-alone view remove the editor stack and
-     * doesn't throw an NPE.
-     * 
-     * @throws Throwable on error
-     * @since 3.2
-     */
-    public void testPerspectiveCloseStandaloneView() throws Throwable {
-		page.setPerspective(WorkbenchPlugin.getDefault()
-				.getPerspectiveRegistry().findPerspectiveWithId(
-						PerspectiveViewsBug120934.PERSP_ID));
-
-		try {
-			// find the stand-alone view
-			IViewReference standAloneRef = page
-					.findViewReference(IPageLayout.ID_OUTLINE);
-
-			page.hideView(standAloneRef);
-		} finally {
-			page.closePerspective(page.getPerspective(), false, false);
-		}
-    }
-    
-	/**
-	 * Test that a view marked as non-closable cannot be closed as a fast view.
-	 * 
-	 * @throws Throwable
-	 * @since 3.1.1
-	 */
-	public void testPerspectiveCloseFastView() throws Throwable {
-		page.setPerspective(WorkbenchPlugin.getDefault()
-				.getPerspectiveRegistry().findPerspectiveWithId(
-						PerspectiveViewsBug88345.PERSP_ID));
-
-		try {
-			// the non-closeable view
-			IViewReference stickyRef = page
-					.findViewReference(MockViewPart.IDMULT);
-			IViewPart stickyView = (IViewPart) stickyRef.getPart(true);
-			page.activate(stickyView);
-
-			IViewReference viewRef = page
-					.findViewReference(PerspectiveViewsBug88345.NORMAL_VIEW_ID);
-
-			WorkbenchPage wpage = (WorkbenchPage) page;
-			assertFalse(wpage.isFastView(stickyRef));
-
-			wpage.addFastView(stickyRef);
-			assertTrue(wpage.isFastView(stickyRef));
-
-			wpage.addFastView(viewRef);
-			assertTrue(wpage.isFastView(viewRef));
-
-			FastViewBar fastViewBar = ((WorkbenchWindow) page
-					.getWorkbenchWindow()).getFastViewBar();
-			FastViewBarContextMenuContribution menuContribution = fastViewBar
-					.testContextMenu();
-
-			// set the target of a normal view that is now a fast view
-			// close should be enabled
-			menuContribution.setTarget(viewRef);
-			checkEnabledMenuItem(wpage, menuContribution, "Close", true);
-
-			// set the target of our non-closeable fast view
-			// close should not be enabled
-			menuContribution.setTarget(stickyRef);
-			checkEnabledMenuItem(wpage, menuContribution, "Close", false);
-		} finally {
-			page.closePerspective(page.getPerspective(), false, false);
-		}
-	}
-	
-	/**
-	 * Test that a fast view marked as non-moveable cannot be docked.
-	 * 
-	 * @throws Throwable
-	 * @since 3.1.1
-	 */
-	public void testPerspectiveMoveFastView() throws Throwable {
-		page.setPerspective(WorkbenchPlugin.getDefault()
-				.getPerspectiveRegistry().findPerspectiveWithId(
-						PerspectiveViewsBug88345.PERSP_ID));
-
-		try {
-			// the non-moveable view
-			IViewReference stickyRef = page
-					.findViewReference(MockViewPart.IDMULT, "1");
-
-			IViewReference viewRef = page
-					.findViewReference(PerspectiveViewsBug88345.NORMAL_VIEW_ID);
-
-			WorkbenchPage wpage = (WorkbenchPage) page;
-			assertFalse(wpage.isFastView(viewRef));
-			assertTrue(wpage.isFastView(stickyRef));
-
-			wpage.addFastView(viewRef);
-			assertTrue(wpage.isFastView(viewRef));
-
-			FastViewBar fastViewBar = ((WorkbenchWindow) page
-					.getWorkbenchWindow()).getFastViewBar();
-			FastViewBarContextMenuContribution menuContribution = fastViewBar
-					.testContextMenu();
-
-			// set the target of a normal view that is now a fast view
-			// Fast View should be enabled
-			menuContribution.setTarget(viewRef);
-			checkEnabledMenuItem(wpage, menuContribution, "Fast View", true);
-
-			// set the target of our non-closeable fast view
-			// Fast View should not be enabled
-			menuContribution.setTarget(stickyRef);
-			checkEnabledMenuItem(wpage, menuContribution, "Fast View", false);
-		} finally {
-			page.closePerspective(page.getPerspective(), false, false);
-		}
-	}
-
-	/**
-	 * Find the supplied menu item and make sure it's enabled/disabled.
-	 * 
-	 * @param wpage the workbench page
-	 * @param menuContribution the fast bar menu contribution item
-	 * @param isEnabled should the item be enabled
-	 * @since 3.1.1
-	 */
-	private void checkEnabledMenuItem(WorkbenchPage wpage,
-			FastViewBarContextMenuContribution menuContribution,
-			String itemName,
-			boolean isEnabled) {
-		Menu m = new Menu(wpage.getWorkbenchWindow().getShell());
-		try {
-			menuContribution.fill(m, 0);
-			MenuItem[] items = m.getItems();
-			MenuItem checkItem = null;
-			for (int i = 0; i < items.length; i++) {
-				MenuItem item = items[i];
-				if (item.getText().indexOf(itemName) >= 0) {
-					checkItem = item;
-				}
-			}
-			assertNotNull(checkItem);
-			assertEquals(isEnabled, checkItem.isEnabled());
-		} finally {
-			menuContribution.dispose();
-			m.dispose();
-		}
-	}
-
-	/**
-	 * Test that the view toolbar visibility matches the presentation
-	 * visibility for a view.
-	 * 
-	 * @throws Throwable on an error
-	 * @since 3.2
-	 */
-	public void testPerspectiveViewToolBarVisible() throws Throwable {
-		// These tests are hard-wired to the pre-3.3 zoom behaviour
-		// Run them anyway to ensure that we preserve the 3.0 mechanism
-        IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore();
-        boolean oldMinMaxState = apiStore.getBoolean(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX);
-		apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, false);
-        
-		IPerspectiveDescriptor perspective = WorkbenchPlugin.getDefault()
-				.getPerspectiveRegistry().findPerspectiveWithId(
-						PerspectiveViewsBug88345.PERSP_ID);
-		page.setPerspective(perspective);
-
-		IEditorPart editor = null;
-		IEditorRegistry registry = window.getWorkbench().getEditorRegistry();
-		IPerspectiveDescriptor secondPerspective = WorkbenchPlugin.getDefault()
-				.getPerspectiveRegistry().findPerspectiveWithId(
-						SessionPerspective.ID);
-		try {
-			// a view with it's toolbar on the line below the tab
-			page.showView(PerspectiveViewsBug88345.PROP_SHEET_ID);
-			IViewReference viewRef = page
-					.findViewReference(PerspectiveViewsBug88345.PROP_SHEET_ID);
-
-			IProject proj = FileUtil.createProject("TBTest");
-			IFile test01 = FileUtil.createFile("test01.txt", proj);
-
-			// make sure the view is active
-			assertNotNull("The view must exist", viewRef.getPart(true));
-			page.activate(viewRef.getPart(true));
-			PartSite site = (PartSite) viewRef.getPart(true).getSite();
-			ViewPane pane = (ViewPane) site.getPane();
-
-			assertTrue(pane.isVisible());
-			assertNotNull("This view must have a toolbar", pane.getToolBar());
-			assertTrue(pane.getToolBar().isVisible());
-
-			// open the editor and zoom it.
-			editor = page.openEditor(new FileEditorInput(test01), registry
-					.getDefaultEditor(test01.getName()).getId());
-			assertNotNull("must have my editor", editor);
-
-			IWorkbenchPartReference ref = page.getReference(editor);
-			page.toggleZoom(ref);
-			assertFalse(pane.isVisible());
-			assertFalse(pane.getToolBar().isVisible());
-
-			// switch to another perspective, and then switch back.
-			page.setPerspective(secondPerspective);
-
-			assertFalse(pane.isVisible());
-			assertFalse(pane.getToolBar().isVisible());
-
-			page.setPerspective(perspective);
-			processEvents();
-
-			// both the view and the toolbar must be not visible
-			assertFalse(pane.isVisible());
-			assertFalse(pane.getToolBar().isVisible());
-
-		} finally {
-			if (editor != null) {
-				page.closeEditor(editor, false);
-			}
-			page.closePerspective(perspective, false, false);
-			page.closePerspective(secondPerspective, false, false);
-
-			// Restore the min/max state to it's correct value
-			apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, oldMinMaxState);
-		}
-	}
-
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.util.UITestCase#doSetUp()
-	 */
-    protected void doSetUp() throws Exception {
-        window = openTestWindow();
-        page = window.getActivePage();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/TrimLayoutTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/TrimLayoutTest.java
deleted file mode 100644
index bff6849..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/TrimLayoutTest.java
+++ /dev/null
@@ -1,471 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.internal.IWorkbenchConstants;
-import org.eclipse.ui.internal.WindowTrimProxy;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.internal.layout.ITrimManager;
-import org.eclipse.ui.internal.layout.IWindowTrim;
-import org.eclipse.ui.internal.util.PrefUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test to exercise the trim layout save/restore/modify support.
- * 
- * @since 3.2
- */
-public class TrimLayoutTest extends UITestCase {
-
-	private static final String BUTTON_B_ID = "my.button.b";
-
-	public static final String[] TOP_TRIM_LIST = {
-			"org.eclipse.ui.internal.WorkbenchWindow.topBar",
-			TrimList.TRIM_LIST_ID };
-
-	public static final String[] TOP_BUTTON_TRIM = {
-			"org.eclipse.ui.internal.WorkbenchWindow.topBar", BUTTON_B_ID,
-			TrimList.TRIM_LIST_ID };
-
-	private boolean fHeapStatusPref;
-
-	/**
-	 * @param testName
-	 */
-	public TrimLayoutTest(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Will test that the trim area IDs are returned.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testGetIDs() throws Throwable {
-		WorkbenchWindow window = openWorkbenchWindow();
-		ITrimManager trimManager = window.getTrimManager();
-		int[] ids = trimManager.getAreaIds();
-		assertEquals("number of trim areas", 4, ids.length);
-	}
-
-	/**
-	 * Test the basic trim layout of a workbench window.
-	 * 
-	 * @throws Throwable
-	 *             on error
-	 */
-	public void testTrimInformation() throws Throwable {
-		WorkbenchWindow window = openWorkbenchWindow();
-		ITrimManager trimManager = window.getTrimManager();		
-		validateDefaultBottomLayout(trimManager);
-	}
-
-	/**
-	 * Swap the status line with the ProgressRegion, and check that the control
-	 * order has been updated.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testMoveStatusLine() throws Throwable {
-		WorkbenchWindow window = openWorkbenchWindow();
-		ITrimManager trimManager = window.getTrimManager();		
-		validateDefaultBottomLayout(trimManager);
-		
-		// Capture the ids of the 1st and 3rd elements
-		List trim = trimManager.getAreaTrim(SWT.BOTTOM);		
-		String id1 = ((IWindowTrim) trim.get(1)).getId();
-		String id3 = ((IWindowTrim) trim.get(3)).getId();
-
-		// Swap the first and third trim elements
-		swapPostition(trim, 1, 3);
-		trimManager.updateAreaTrim(ITrimManager.BOTTOM, trim, false);
-		window.getShell().layout(true, true);
-
-		// Check the swap
-		trim = trimManager.getAreaTrim(ITrimManager.BOTTOM);
-		assertTrue("element failed to swap", getIndexOf(trim, id1) == 3);
-		assertTrue("element failed to swap", getIndexOf(trim, id3) == 1);
-	}
-
-	/**
-	 * Swap the fast view bar and the progress region, and then check that the
-	 * controls have been updated.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testMoveFastViewBar() throws Throwable {
-		WorkbenchWindow window = openWorkbenchWindow();
-		ITrimManager trimManager = window.getTrimManager();				
-		validateDefaultBottomLayout(trimManager);
-		
-		// Capture the ids of the 1st and 3rd elements
-		List trim = trimManager.getAreaTrim(SWT.BOTTOM);		
-		String id0 = ((IWindowTrim) trim.get(0)).getId();
-		String id3 = ((IWindowTrim) trim.get(3)).getId();
-
-		// Swap the zero'th and third trim elements
-		swapPostition(trim, 0, 3);
-		trimManager.updateAreaTrim(ITrimManager.BOTTOM, trim, false);
-		window.getShell().layout(true, true);
-
-		// Check the swap
-		trim = trimManager.getAreaTrim(ITrimManager.BOTTOM);
-		assertTrue("element failed to swap", getIndexOf(trim, id0) == 3);
-		assertTrue("element failed to swap", getIndexOf(trim, id3) == 0);
-	}
-
-	/**
-	 * This test isn't really about removing trim, just testing that the if the
-	 * heap status trim is not in the trim list, it's removed from the bottom
-	 * trim area.
-	 * 
-	 * @throws Throwable
-	 *             on error
-	 */
-	public void testRemoveHeapStatus() throws Throwable {
-		WorkbenchWindow window = openWorkbenchWindow();
-		ITrimManager trimManager = window.getTrimManager();		
-		validateDefaultBottomLayout(trimManager);
-
-		// Remove the Heap Status
-		List trim = trimManager.getAreaTrim(ITrimManager.BOTTOM);
-		int hsIndex = getIndexOf(trim, "org.eclipse.ui.internal.HeapStatus");
-		trim.remove(hsIndex);
-		trimManager.updateAreaTrim(ITrimManager.BOTTOM, trim, true);
-		window.getShell().layout(true, true);
-
-		// Make sure that its gone
-		trim = trimManager.getAreaTrim(ITrimManager.BOTTOM);
-		hsIndex = getIndexOf(trim, "org.eclipse.ui.internal.HeapStatus");
-		assertTrue("HeapStatus failed to remove", hsIndex == -1);
-	}
-
-	/**
-	 * Test the public API to add a piece of trim to the end of the trim area.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testAddExtraTrim() throws Throwable {
-		WorkbenchWindow window = openWorkbenchWindow();
-		ITrimManager trimManager = window.getTrimManager();
-		assertTrue(
-				"The window should have it's top banner in place",
-				trimManager
-						.getTrim("org.eclipse.ui.internal.WorkbenchWindow.topBar") != null);
-		
-		TrimList trimList = new TrimList(window.getShell());
-		trimManager.addTrim(ITrimManager.TOP, trimList);
-		window.getShell().layout();
-
-		List trim = trimManager.getAreaTrim(ITrimManager.TOP);
-		validatePositions(TOP_TRIM_LIST, trim);
-	}
-
-	/**
-	 * Test the public API to add a piece of trim before an existing piece of
-	 * trim.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testPlaceExtraTrim() throws Throwable {
-		WorkbenchWindow window = openWorkbenchWindow();
-		ITrimManager trimManager = window.getTrimManager();
-		TrimList trimList = new TrimList(window.getShell());
-		trimManager.addTrim(ITrimManager.TOP, trimList);
-
-		// WindowTrimProxy is an internal "quick and dirty" way
-		// to just provide a control to the trim ... not public API
-		Button b = new Button(window.getShell(), SWT.PUSH);
-		b.setText("B");
-		IWindowTrim buttonTrim = new WindowTrimProxy(b, BUTTON_B_ID,
-				"Button B", SWT.TOP | SWT.BOTTOM, false);
-		
-		// find an existing piece of trim to use as a reference
-		IWindowTrim trim = trimManager.getTrim(TrimList.TRIM_LIST_ID);
-		assertTrue(trimList == trim);
-		trimManager.addTrim(ITrimManager.TOP, buttonTrim, trim);
-		window.getShell().layout();
-
-		List topTrim = trimManager.getAreaTrim(ITrimManager.TOP);
-		validatePositions(TOP_BUTTON_TRIM, topTrim);
-	}
-
-	/**
-	 * Test that the save-state is recording trim layout.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testSaveWorkbenchWindow() throws Throwable {
-		WorkbenchWindow window = openWorkbenchWindow();
-
-		XMLMemento state = XMLMemento
-				.createWriteRoot(IWorkbenchConstants.TAG_WINDOW);
-		IStatus rc = window.saveState(state);
-		assertEquals(IStatus.OK, rc.getSeverity());
-
-		IMemento trim = state.getChild(IWorkbenchConstants.TAG_TRIM);
-		assertNotNull(trim);
-
-		int[] ids = window.getTrimManager().getAreaIds();
-		IMemento[] children = trim
-				.getChildren(IWorkbenchConstants.TAG_TRIM_AREA);
-		assertTrue("Should have <= " + ids.length + " trim areas",
-				children.length <= ids.length);
-		assertEquals("Our trim configuration starts with", 2, children.length);
-	}
-
-	/**
-	 * Test that the workbench window can restore trim state from an
-	 * <code>IMemento</code>.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testRestoreStateWithChange() throws Throwable {
-		WorkbenchWindow window = openWorkbenchWindow();
-		ITrimManager trimManager = window.getTrimManager();
-		validateDefaultBottomLayout(trimManager);
-		
-		int bottomTrimCount = trimManager.getAreaTrim(SWT.BOTTOM).size();
-		
-		// Create a memento and write the state to it...
-		XMLMemento state = XMLMemento
-				.createWriteRoot(IWorkbenchConstants.TAG_WINDOW);
-		IStatus rc = window.saveState(state);
-		
-		// Did the save work?
-		assertEquals(IStatus.OK, rc.getSeverity());
-		
-		// Does it have the right info?
-		IMemento trimMemento = state.getChild(IWorkbenchConstants.TAG_TRIM);
-		assertNotNull(trimMemento);
-
-		// Is the child content the same
-		IMemento[] children = trimMemento
-				.getChildren(IWorkbenchConstants.TAG_TRIM_AREA);
-		int childIdx = 0;
-		IMemento bottomTrim = null;
-		String bottomId = new Integer(SWT.BOTTOM).toString();
-
-		// Find the 'bottom' trim
-		for (; childIdx < children.length; childIdx++) {
-			if (children[childIdx].getID().equals(bottomId)) {
-				bottomTrim = children[childIdx];
-				break;
-			}
-		}
-		assertNotNull(bottomTrim);
-
-		// Make sure we have the right number of entries
-		children = bottomTrim.getChildren(IWorkbenchConstants.TAG_TRIM_ITEM);
-		assertEquals(bottomTrimCount, children.length);
-
-		// 'swap' the 0 and 3 trim using only the stored ids
-		String id0 = children[0].getID();
-		String id3 = children[3].getID();
-		children[0].putString(IMemento.TAG_ID, id3);
-		children[3].putString(IMemento.TAG_ID, id0);
-
-		// Restore the trim from the modified state
-		window.restoreState(state, window.getActivePage().getPerspective());
-		window.getShell().layout(true, true);
-
-		List trim = trimManager.getAreaTrim(ITrimManager.BOTTOM);
-		assertTrue("Restore has wrong layout", getIndexOf(trim, id0) == 3);
-		assertTrue("Restore has wrong layout", getIndexOf(trim, id3) == 0);
-	}
-
-	/**
-	 * Test that the workbench window can restore trim state from an
-	 * <code>IMemento</code> where a trim item has moved sides.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testRestoreStateWithLocationChange() throws Throwable {
-		WorkbenchWindow window = openWorkbenchWindow();
-		ITrimManager trimManager = window.getTrimManager();
-		validateDefaultBottomLayout(trimManager);
-		
-		int bottomTrimCount = trimManager.getAreaTrim(SWT.BOTTOM).size();
-
-		XMLMemento state = XMLMemento
-				.createWriteRoot(IWorkbenchConstants.TAG_WINDOW);
-		IStatus rc = window.saveState(state);
-		assertEquals(IStatus.OK, rc.getSeverity());
-		IMemento trim = state.getChild(IWorkbenchConstants.TAG_TRIM);
-		assertNotNull(trim);
-
-		IMemento[] children = trim
-				.getChildren(IWorkbenchConstants.TAG_TRIM_AREA);
-		int childIdx = 0;
-		IMemento bottomTrim = null;
-		String bottomId = new Integer(SWT.BOTTOM).toString();
-		for (; childIdx < children.length; childIdx++) {
-			if (children[childIdx].getID().equals(bottomId)) {
-				bottomTrim = children[childIdx];
-				break;
-			}
-		}
-		assertNotNull(bottomTrim);
-
-		children = bottomTrim.getChildren(IWorkbenchConstants.TAG_TRIM_ITEM);
-		assertEquals(bottomTrimCount, children.length);
-		
-		// kinda fake to remove the fast view bar from the bottom
-		String id = children[0].getID();
-		children[0].putString(IMemento.TAG_ID, children[3].getID());
-
-		IMemento left = trim.createChild(IWorkbenchConstants.TAG_TRIM_AREA,
-				new Integer(SWT.LEFT).toString());
-		left.createChild(IWorkbenchConstants.TAG_TRIM_ITEM, id);
-		window.restoreState(state, window.getActivePage().getPerspective());
-		window.getShell().layout(true, true);
-
-		List windowTrim = trimManager.getAreaTrim(ITrimManager.BOTTOM);
-		assertEquals(bottomTrimCount-1, windowTrim.size());
-
-		windowTrim = trimManager.getAreaTrim(ITrimManager.LEFT);
-		assertEquals(1, windowTrim.size());
-	}
-
-	/**
-	 * These tests use 'internal' methods from the <code>WorkbenchWindow</code>.
-	 * This method ensures that the tests will fail if the <code>openTestWindow</code>
-	 * ever returns anything else
-	 * 
-	 * @return The type-safe WorkbenchWindow 
-	 */
-	private WorkbenchWindow openWorkbenchWindow() {
-		IWorkbenchWindow iw = openTestWindow();
-		assertTrue("Window must be a WorkbenchWindow", (iw instanceof WorkbenchWindow));
-		
-		return (WorkbenchWindow)iw;
-	}
-	
-	/**
-	 * Swap 2 IDs in the description.
-	 * 
-	 * @param descs
-	 *            the description array
-	 * @param pos1
-	 *            position 1, from 0
-	 * @param pos2
-	 *            position 2, from 0
-	 */
-	private void swapPostition(List trim, int pos1, int pos2) {
-		Object tmp = trim.get(pos1);
-		trim.set(pos1, trim.get(pos2));
-		trim.set(pos2, tmp);
-	}
-
-	/**
-	 * Get the position of the given trim element from the trim
-	 * 
-	 * @param trimIds The list of ids returned by the TrimManager
-	 * @param id The id of the trim to get the index of
-	 * @return The zero-based index or -1 if not found
-	 */
-	private int getIndexOf(List trimIds, String id) {
-		int index = 0;
-		for (Iterator iterator = trimIds.iterator(); iterator.hasNext();) {
-			IWindowTrim trim = (IWindowTrim) iterator.next();
-			if (id.equals(trim.getId()))
-				return index;
-			index++;
-		}
-		
-		return -1;
-	}
-	
-	/**
-	 * Ensure that all the base trim is there and has
-	 * the correct -relative- positions
-	 * 
-	 * @param descs The ordered list of trim descriptors
-	 * for the bottom trim area
-	 */
-	private void validateDefaultBottomLayout(ITrimManager trimManager) {
-		List descs = trimManager.getAreaTrim(SWT.BOTTOM);
-
-		// Must have at least 4 elements
-		assertTrue("Too few trim elements", descs.size() >= 4);
-
-		// Ensure that all the base trim is there and has
-		// the correct -relative- positions
-		int fvbIndex = getIndexOf(descs, "org.eclise.ui.internal.FastViewBar");
-		assertTrue("Fast View Bar not found", fvbIndex != -1);
-		int slIndex = getIndexOf(descs, "org.eclipse.jface.action.StatusLineManager");
-		assertTrue("StatusLine not found", slIndex != -1);
-		int hsIndex = getIndexOf(descs, "org.eclipse.ui.internal.HeapStatus");
-		assertTrue("Heap Status not found", hsIndex != -1);
-		int prIndex = getIndexOf(descs, "org.eclipse.ui.internal.progress.ProgressRegion");
-		assertTrue("Progress Region not found", prIndex != -1);
-		
-		assertTrue("Fast View out of position", fvbIndex < slIndex);
-		assertTrue("Status Line out of position", slIndex < hsIndex);
-		assertTrue("Heap Status out of position", hsIndex < prIndex);
-	}
-	
-	/**
-	 * Match the returned set of IDs exactly with expected IDs.
-	 * 
-	 * @param expectedIDs
-	 *            the string IDs in order.
-	 * @param retrievedIDs
-	 *            the current IDs in order.
-	 */
-	private void validatePositions(String[] expectedIDs, List retrievedIDs) {
-		assertEquals("Number of trim items don't match", expectedIDs.length,
-				retrievedIDs.size());
-
-		for (int i = 0; i < expectedIDs.length; ++i) {
-			assertEquals("Failed for postition " + i, expectedIDs[i],
-					((IWindowTrim) retrievedIDs.get(i)).getId());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.util.UITestCase#doSetUp()
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		
-		// Ensure that the HeapStatus is showing
-		fHeapStatusPref = PrefUtil.getAPIPreferenceStore().getBoolean(
-				IWorkbenchPreferenceConstants.SHOW_MEMORY_MONITOR);
-		PrefUtil.getAPIPreferenceStore().setValue(
-				IWorkbenchPreferenceConstants.SHOW_MEMORY_MONITOR, true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.util.UITestCase#doTearDown()
-	 */
-	protected void doTearDown() throws Exception {
-		PrefUtil.getAPIPreferenceStore().setValue(
-				IWorkbenchPreferenceConstants.SHOW_MEMORY_MONITOR,
-				fHeapStatusPref);
-		super.doTearDown();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/TrimList.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/TrimList.java
deleted file mode 100644
index 0edb331..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/TrimList.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.internal.layout.IWindowTrim;
-
-/**
- * TrimList is a control that we'd like to contribute to the
- * window trim, plus the supporting trim interface.  It generates a
- * static list and doesn't remember anything, but a real trim
- * contribution could be any control+model.
- * @since 3.2
- */
-public class TrimList implements IWindowTrim {
-	/**
-	 * Our trim ID ... must be unique, as if we contributed this
-	 * trim from an extension.
-	 */
-	public static final String TRIM_LIST_ID = "org.eclipse.ui.tests.api.TrimList";
-
-	private static final String[] INIT_LIST = { "Offline", "Online", "Proxied" };
-
-	private Combo fCombo;
-
-	/**
-	 * The trim objects must all have the same parent.  After 3.2M4 
-	 * the IWindowTrim interface will be updated so that the workbench
-	 * window can give each piece of trim the correct parent.
-	 * @param shell the parent of this trim
-	 */
-	public TrimList(Shell shell) {
-		fCombo = new Combo(shell, SWT.DROP_DOWN|SWT.READ_ONLY);
-		for (int i = 0; i < INIT_LIST.length; i++) {
-			String value = INIT_LIST[i];
-			fCombo.add(value);
-		}
-		fCombo.select(0);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWindowTrim#getControl()
-	 */
-	public Control getControl() {
-		return fCombo;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWindowTrim#getValidSides()
-	 */
-	public int getValidSides() {
-		return SWT.TOP | SWT.BOTTOM;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWindowTrim#dock(int)
-	 */
-	public void dock(int dropSide) {
-		// nothing to do, we don't have to re-orient our control
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWindowTrim#getId()
-	 */
-	public String getId() {
-		return TRIM_LIST_ID;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWindowTrim#getDisplayName()
-	 */
-	public String getDisplayName() {
-		// Should be the NLS string name, but I'll cheat for now
-		return "Trim List";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWindowTrim#isCloseable()
-	 */
-	public boolean isCloseable() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWindowTrim#handleClose()
-	 */
-	public void handleClose() {
-		// nothing to do here.
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWindowTrim#getWidthHint()
-	 */
-	public int getWidthHint() {
-		return SWT.DEFAULT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWindowTrim#getHeightHint()
-	 */
-	public int getHeightHint() {
-		return SWT.DEFAULT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWindowTrim#isResizeable()
-	 */
-	public boolean isResizeable() {
-		return false;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/UIJobTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/UIJobTest.java
deleted file mode 100644
index 1665f5d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/UIJobTest.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import junit.framework.Assert;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.progress.UIJob;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.1
- */
-public class UIJobTest extends UITestCase {
-
-    protected IWorkbenchWindow fWindow;
-
-    protected IWorkbenchPage fPage;
-
-    /**
-     * Constructor for IEditorPartTest
-     */
-    public UIJobTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWindow = openTestWindow();
-        fPage = fWindow.getActivePage();
-    }
-
-    private volatile boolean uiJobFinished = false;
-    private volatile boolean backgroundThreadStarted = false;
-    private volatile boolean backgroundThreadInterrupted = false;
-    private volatile boolean backgroundThreadFinishedBeforeUIJob = false;
-    private volatile boolean backgroundThreadFinished = false;
-    private volatile boolean uiJobFinishedBeforeBackgroundThread = false;
-    
-    /**
-     * Test to ensure that calling join() on a UIJob will block the calling
-     * thread until the job has finished. 
-     * 
-     * @throws Exception
-     * @since 3.1
-     */
-    public void testJoin() throws Exception {
-
-        uiJobFinished = false;
-        backgroundThreadStarted = false;
-        backgroundThreadFinished = false;
-        backgroundThreadInterrupted = false;
-        uiJobFinishedBeforeBackgroundThread = false;
-
-        final UIJob testJob = new UIJob("blah blah blah") {
-	        /* (non-Javadoc)
-	         * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
-	         */
-	        public IStatus runInUIThread(IProgressMonitor monitor) {
-	            backgroundThreadFinishedBeforeUIJob = backgroundThreadFinished;
-	            uiJobFinished = true;
-	            
-	            return Status.OK_STATUS;
-	        }
-        };
-        
-        testJob.setPriority(Job.INTERACTIVE);
-        
-        // Background thread that will try to schedule and join a UIJob. If all goes well
-        // it should lock up since we're intentionally blocking the UI thread, preventing
-        // it from running.
-        Thread testThread = new Thread() {
-        /* (non-Javadoc)
-         * @see java.lang.Thread#run()
-         */
-        public void run() {
-            testJob.schedule();
-            
-            backgroundThreadStarted = true;
-            
-            try {
-                testJob.join();
-                uiJobFinishedBeforeBackgroundThread = uiJobFinished;
-                backgroundThreadFinished = true;
-            } catch (InterruptedException e) {
-                backgroundThreadInterrupted = true;
-            }
-        }
-        };
-        
-        // This job does nothing. We use a bogus low-priority job instead of a simple
-        // sleep(xxxx) in order to ensure that we don't wake up before the test job was
-        // scheduled.
-        Job delayJob = new Job("blah") {
-            protected IStatus run(IProgressMonitor monitor) {
-                
-                return Status.OK_STATUS;
-            }
-            
-        };
-        delayJob.setPriority(Job.LONG);
-        
-        try {
-	        // Schedule the test thread
-	        testThread.start();
-	        
-	        // Measure current time
-	        long currentTime = System.currentTimeMillis();
-	                
-	        // We need to create a situation in which the run() method of the UIJob will have
-	        // been called and exited, but the runInUIThread() method will not have been called.
-	        // We then put everything else to sleep, making a high probability that the background
-	        // thread would wake up if there was nothing blocking it. Note: it is possible that the 
-	        // test would still pass if there was a problem and the background thread failed to
-	        // wake up for reasons other than its join()... but it creates a high probability of 
-	        // things failing if something goes wrong.
-	        //
-	        // The point of this join() is to block the UI thread, making it impossible to 
-	        // run *syncExecs. Joining a low priority job means that the UIJob should get
-	        // scheduled first (meaning its run(...) method will be called). The fact that we're 
-	        // in the UI thread right now means that the UIJob's runInUIThread method shouldn't 
-	        // be called.
-	        
-	        // Block the UI thread until the UIJob's run() method is called.
-	        delayJob.schedule(200);
-	        delayJob.join();
-	        
-	        long finalTime = System.currentTimeMillis();
-	        
-	        // Ensure that we slept for at least 200ms
-	        Assert.assertTrue("We tried to sleep the UI thread, but it woke up too early. ",
-	                finalTime - currentTime >= 200);
-	        
-	        Assert.assertTrue("Background thread did not start, so there was no possibility "
-	                + "of testing whether its behavior was correct. This is not a test failure. "
-	                + "It means we were unable to run the test. ",
-	                backgroundThreadStarted);
-	        
-	        Assert.assertFalse("A UI job somehow ran to completion while the UI thread was blocked", uiJobFinished);
-	        Assert.assertFalse("Background job managed to run to completion, even though it joined a UI thread that still hasn't finished",
-	                backgroundThreadFinished);
-	        Assert.assertFalse("Background thread was interrupted", backgroundThreadInterrupted);
-	        
-	        // Now run the event loop. Give the asyncExec a chance to run.
-			//Use the display provided by the shell if possible
-	        Display display = fWindow.getShell().getDisplay();
-	        
-	        // Wait until both threads have run to completion. If we wait for more than 3s, something
-	        // probably deadlocked.
-	        while (!(uiJobFinished && backgroundThreadFinished) ) {    
-	            // If we've waited more than 3s for the test job to run, then something is wrong.
-	            if (finalTime - System.currentTimeMillis() > 3000) {
-	                break;
-	            }
-	            if (!display.readAndDispatch()) {
-	                display.sleep();
-	            }
-	        }
-	        
-	        // Now that the event queue is empty, check that our final state is okay.
-	        Assert.assertTrue("Background thread did not finish (possible deadlock)", backgroundThreadFinished);
-	        Assert.assertTrue("Test job did not finish (possible deadlock)", uiJobFinished);
-	        Assert.assertFalse("Background thread was interrupted ", backgroundThreadInterrupted);
-	        Assert.assertFalse("Background thread finished before the UIJob, even though the background thread was supposed to be waiting for the UIJob", 
-	                backgroundThreadFinishedBeforeUIJob);
-	        
-	        // This is the whole point of the test: ensure that the background job actually waited for the UI job
-	        // to run to completion.
-	        Assert.assertFalse("Background thread finished before the UIJob, even though the background thread was supposed to be waiting for the UIJob", 
-	                backgroundThreadFinishedBeforeUIJob);
-	        
-	        // Paranoia check: this is really the same test as above, but it confirms that both
-	        // threads agreed on the answer.
-	        Assert.assertTrue("Background thread finished before the UIJob, even though the background thread was supposed to be waiting for the UIJob", 
-	                uiJobFinishedBeforeBackgroundThread);
-        } finally {
-            
-        }
-        
-    }
-    
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/UserSaveableMockViewPart.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/UserSaveableMockViewPart.java
deleted file mode 100644
index 4e901bb..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/UserSaveableMockViewPart.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ui.ISaveablePart2;
-
-/**
- * Mock view part that implements ISaveablePart.
- * Used for testing hideView and other view lifecycle on saveable views.
- * 
- * @since 3.0.1
- */
-public class UserSaveableMockViewPart extends MockViewPart implements
-		ISaveablePart2 {
-	
-	public static String ID = "org.eclipse.ui.tests.api.UserSaveableMockViewPart";
-
-	private boolean isDirty = false;
-
-	private boolean saveAsAllowed = false;
-
-	private boolean saveNeeded = true;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		callTrace.add("doSave" );
-		isDirty = false;
-		saveNeeded = false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-		callTrace.add("doSaveAs" );
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() {
-		callTrace.add("isDirty" );
-		return isDirty;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		callTrace.add("isSaveAsAllowed" );
-		return saveAsAllowed ;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isSaveOnCloseNeeded()
-	 */
-	public boolean isSaveOnCloseNeeded() {
-		callTrace.add("isSaveOnCloseNeeded" );
-		return saveNeeded;
-	}
-
-	public void setDirty(boolean d) {
-		this.isDirty = d;
-        firePropertyChange(PROP_DIRTY);
-	}
-    
-    public void setSaveAsAllowed(boolean isSaveAsAllowed) {
-        this.saveAsAllowed = isSaveAsAllowed;
-    }
-    
-    public void setSaveNeeded(boolean isSaveOnCloseNeeded) {
-        this.saveNeeded = isSaveOnCloseNeeded;
-    }
-
-	public int promptToSaveOnClose() {
-		return ISaveablePart2.DEFAULT;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/UserSaveableSharedViewPart.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/UserSaveableSharedViewPart.java
deleted file mode 100644
index e8a0d94..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/UserSaveableSharedViewPart.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ui.ISaveablePart;
-
-/**
- * Mock view part that implements ISaveablePart. Used for testing hideView and
- * other view lifecycle on saveable views.
- * 
- * @since 3.0.1
- */
-public class UserSaveableSharedViewPart extends MockViewPart implements
-		ISaveablePart {
-	/**
-	 * The shared ID.
-	 */
-	public static String ID = "org.eclipse.ui.tests.api.UserSaveableSharedViewPart";
-
-	public static class SharedModel {
-		public boolean isDirty = true;
-	}
-	
-	private SharedModel fSharedModel = new SharedModel();
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		callTrace.add("doSave");
-		fSharedModel.isDirty = false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-		callTrace.add("doSaveAs");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() {
-		callTrace.add("isDirty");
-		return fSharedModel.isDirty;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#isSaveOnCloseNeeded()
-	 */
-	public boolean isSaveOnCloseNeeded() {
-		callTrace.add("isSaveOnCloseNeeded");
-		return fSharedModel.isDirty;
-	}
-	
-	public void setSharedModel(SharedModel s) {
-		fSharedModel = s;
-	}
-	
-	public SharedModel getSharedModel() {
-		return fSharedModel;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ViewPerspective.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ViewPerspective.java
deleted file mode 100644
index 09b7753..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ViewPerspective.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- * Supplies an arrangement of views to test various forms of view activation.
- * 
- * @since 3.0
- */
-public class ViewPerspective implements IPerspectiveFactory {
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout)
-     */
-    public void createInitialLayout(IPageLayout layout) {
-        String editorArea = layout.getEditorArea();
-        IFolderLayout folder1 = layout.createFolder("folder1",
-                IPageLayout.LEFT, .25f, editorArea);
-        folder1.addView(MockViewPart.ID);
-        folder1.addPlaceholder(MockViewPart.ID2);
-        layout.addView(MockViewPart.ID3, IPageLayout.RIGHT, .75f, editorArea);
-        layout.addPlaceholder(MockViewPart.ID4, IPageLayout.BOTTOM, .75f,
-                editorArea);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ViewUtils.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ViewUtils.java
deleted file mode 100644
index 95ffa11..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/ViewUtils.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.internal.ViewSite;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.views.IStickyViewDescriptor;
-
-/**
- * Utility class that will test various view properties.
- * 
- * @since 3.0
- */
-public final class ViewUtils {
-
-    public static boolean findInStack(IViewPart[] stack, IViewPart target) {
-        for (int i = 0; i < stack.length; i++) {
-            if (stack[i] == target)
-                return true;
-        }
-        return false;
-    }
-
-    public static boolean isCloseable(IViewPart part) {
-        ViewSite viewSite = (ViewSite) part.getSite();
-        String id = viewSite.getId();
-        IViewReference ref = viewSite.getPage().findViewReference(id);
-        return ((WorkbenchPage) viewSite.getPage()).getActivePerspective()
-                .isCloseable(ref);
-    }
-
-    public static boolean isMoveable(IViewPart part) {
-        ViewSite viewSite = (ViewSite) part.getSite();
-        String id = viewSite.getId();
-        IViewReference ref = viewSite.getPage().findViewReference(id);
-        return ((WorkbenchPage) viewSite.getPage()).getActivePerspective()
-                .isMoveable(ref);
-    }
-
-    public static boolean isSticky(IViewPart part) {
-        String id = part.getSite().getId();
-        IStickyViewDescriptor[] descs = WorkbenchPlugin.getDefault()
-                .getViewRegistry().getStickyViews();
-        for (int i = 0; i < descs.length; i++) {
-            if (descs[i].getId().equals(id))
-                return true;
-        }
-        return false;
-    }
-
-    /**
-     * 
-     */
-    protected ViewUtils() {
-        //no-op
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/XMLMementoTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/XMLMementoTest.java
deleted file mode 100644
index 264fec4..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/XMLMementoTest.java
+++ /dev/null
@@ -1,549 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.XMLMemento;
-
-/**
- * Testing XMLMemento (see bug 93262). Emphasis is on ensuring that the 3.1
- * version behaves just like the 3.0.1 version.
- * 
- * @since 3.1
- * 
- */
-public class XMLMementoTest extends TestCase {
-
-	private static final String[] TEST_STRINGS = { "value",
-			" value with spaces ", "value.with.many.dots",
-			"value_with_underscores", "value<with<lessthan",
-			"value>with>greaterthan", "value&with&ampersand",
-			"value\"with\"quote", "value#with#hash", "",
-			/*
-			 * the following cases are for bug 93720
-			 */
-			"\nvalue\nwith\nnewlines\n", "\tvalue\twith\ttab\t",
-			"\rvalue\rwith\rreturn\r", };
-
-	/*
-	 * Class under test for XMLMemento createReadRoot(Reader)
-	 */
-	public void testCreateReadRootReaderExceptionCases() {
-		try {
-			XMLMemento.createReadRoot(new StringReader("Invalid format"));
-			fail("should throw WorkbenchException because of invalid format");
-		} catch (WorkbenchException e) {
-			// expected
-		}
-		try {
-			XMLMemento.createReadRoot(new StringReader(
-					"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"));
-			fail("should throw WorkbenchException because there is no element");
-		} catch (WorkbenchException e) {
-			// expected
-		}
-		try {
-			XMLMemento.createReadRoot(new Reader() {
-
-				public void close() throws IOException {
-					throw new IOException();
-				}
-
-				public int read(char[] arg0, int arg1, int arg2)
-						throws IOException {
-					throw new IOException();
-				}
-			});
-			fail("should throw WorkbenchException because of IOException");
-		} catch (WorkbenchException e) {
-			// expected
-		}
-	}
-
-	public void testCreateReadRootReader() throws WorkbenchException {
-		XMLMemento memento = XMLMemento
-				.createReadRoot(new StringReader(
-						"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><simple>some text data</simple>"));
-		assertEquals("some text data", memento.getTextData());
-	}
-
-	/*
-	 * Class under test for XMLMemento createReadRoot(Reader, String)
-	 */
-	public void testCreateReadRootReaderString() {
-		// TODO - I don't know how to test this. The method is not called by
-		// anyone as of 2005/04/05.
-	}
-
-	public void testCreateWriteRoot() {
-		String[] rootTypes = { "type", "type.with.dots",
-				"type_with_underscores" };
-		for (int i = 0; i < rootTypes.length; i++) {
-			String type = rootTypes[i];
-			XMLMemento memento = XMLMemento.createWriteRoot(type);
-			assertNotNull(memento);
-		}
-	}
-
-	public void testSpacesInRootAreIllegal() {
-		try {
-			XMLMemento.createWriteRoot("with space");
-			fail("should fail");
-		} catch (Exception e) {
-			// expected
-		}
-	}
-
-	public void testSpacesInKeysAreIllegal() {
-		XMLMemento memento = XMLMemento.createWriteRoot("foo");
-		try {
-			memento.createChild("with space", "bar");
-			fail("should fail");
-		} catch (Exception e) {
-			// expected
-		}
-		try {
-			memento.putString("with space", "bar");
-			fail("should fail");
-		} catch (Exception e) {
-			// expected
-		}
-	}
-
-	public void testCopyChild() throws WorkbenchException, IOException {
-
-		testPutAndGet(new MementoChecker() {
-
-			public void prepareAndCheckBeforeSerialization(
-					XMLMemento mementoToSerialize) {
-				IMemento child = mementoToSerialize.createChild("c", "i");
-				fillMemento(child);
-				IMemento copiedChild = mementoToSerialize.copyChild(child);
-				assertEquals("i", copiedChild.getID());
-				checkMemento(copiedChild, true);
-			}
-
-			public void checkAfterDeserialization(XMLMemento deserializedMemento) {
-				IMemento child = deserializedMemento.getChild("c");
-				checkMemento(child, true);
-				IMemento[] children = deserializedMemento.getChildren("c");
-				assertEquals(2, children.length);
-				assertEquals("i", children[0].getID());
-				checkMemento(children[0], true);
-				assertEquals("i", children[1].getID());
-				checkMemento(children[1], true);
-			}
-		});
-	}
-
-	/**
-	 * Helper method to fill a memento to be checked later by checkMemento.
-	 * 
-	 * @param memento
-	 */
-	private void fillMemento(IMemento memento) {
-		memento.putFloat("floatKey", 0.4f);
-		memento.putInteger("integerKey", 324765);
-		memento.putString("stringKey", "a string");
-		memento.putTextData("some text data");
-		memento.createChild("child1");
-		memento.createChild("child2", "child2id1");
-		memento.createChild("child2", "child2id2");
-	}
-
-	/**
-	 * Helper method to check if the values set by fillMemento are still there.
-	 * The boolean parameter is needed because in some cases
-	 * (IMememento#putMemento), the text data gets lost.
-	 * 
-	 * @param memento
-	 * @param checkForTextData
-	 */
-	protected void checkMemento(IMemento memento, boolean checkForTextData) {
-		assertEquals(0.4f, memento.getFloat("floatKey").floatValue(), 0.0f);
-		assertEquals(324765, memento.getInteger("integerKey").intValue());
-		assertEquals("a string", memento.getString("stringKey"));
-		if (checkForTextData) {
-			assertEquals("some text data", memento.getTextData());
-		}
-		IMemento child1 = memento.getChild("child1");
-		assertNotNull(child1);
-		IMemento child2 = memento.getChild("child2");
-		assertNotNull(child2);
-		assertEquals("child2id1", child2.getID());
-		IMemento[] children = memento.getChildren("child2");
-		assertNotNull(children);
-		assertEquals(2, children.length);
-		assertEquals("child2id1", children[0].getID());
-		assertEquals("child2id2", children[1].getID());
-	}
-
-	public void testCreateAndGetChild() throws WorkbenchException, IOException {
-		final String type1 = "type1";
-		final String type2 = "type2";
-		final String id = "id";
-
-		testPutAndGet(new MementoChecker() {
-
-			public void prepareAndCheckBeforeSerialization(
-					XMLMemento mementoToSerialize) {
-				// check that nothing is there yet
-				assertEquals(null, mementoToSerialize.getChild(type1));
-				assertEquals(null, mementoToSerialize.getChild(type2));
-
-				// creation without ID
-				IMemento child1 = mementoToSerialize.createChild(type1);
-				assertNotNull(child1);
-				assertNotNull(mementoToSerialize.getChild(type1));
-
-				// creation with ID
-				IMemento child2 = mementoToSerialize.createChild(type2, id);
-				assertNotNull(child2);
-				assertNotNull(mementoToSerialize.getChild(type2));
-				assertEquals(id, child2.getID());
-			}
-
-			public void checkAfterDeserialization(XMLMemento deserializedMemento) {
-				IMemento child1 = deserializedMemento.getChild(type1);
-				assertNotNull(child1);
-				IMemento child2 = deserializedMemento.getChild(type2);
-				assertNotNull(child2);
-				assertEquals(id, child2.getID());
-			}
-		});
-	}
-
-	public void testGetChildren() throws WorkbenchException, IOException {
-		final String type = "type";
-		final String id1 = "id";
-		final String id2 = "id2";
-
-		testPutAndGet(new MementoChecker() {
-
-			public void prepareAndCheckBeforeSerialization(
-					XMLMemento mementoToSerialize) {
-				// check that nothing is there yet
-				assertEquals(null, mementoToSerialize.getChild(type));
-
-				IMemento child1 = mementoToSerialize.createChild(type, id1);
-				assertNotNull(child1);
-				assertNotNull(mementoToSerialize.getChild(type));
-				assertEquals(id1, child1.getID());
-
-				// second child with the same type
-				IMemento child2 = mementoToSerialize.createChild(type, id2);
-				assertNotNull(child2);
-				assertEquals(2, mementoToSerialize.getChildren(type).length);
-				assertEquals(id2, child2.getID());
-			}
-
-			public void checkAfterDeserialization(XMLMemento deserializedMemento) {
-				IMemento[] children = deserializedMemento.getChildren(type);
-				assertNotNull(children);
-				assertEquals(2, children.length);
-
-				// this checks that the order is maintained.
-				// the spec does not promise this, but clients
-				// may rely on the current implementation behaviour.
-				assertEquals(id1, children[0].getID());
-				assertEquals(id2, children[1].getID());
-			}
-		});
-	}
-
-	public void testGetID() throws WorkbenchException, IOException {
-		final String type = "type";
-
-		String[] ids = { "id", "", "id.with.many.dots", "id_with_underscores",
-				"id<with<lessthan", "id>with>greaterthan", "id&with&ampersand",
-				"id\"with\"quote", "id#with#hash" };
-
-		for (int i = 0; i < ids.length; i++) {
-			final String id = ids[i];
-
-			testPutAndGet(new MementoChecker() {
-
-				public void prepareAndCheckBeforeSerialization(
-						XMLMemento mementoToSerialize) {
-					assertEquals(null, mementoToSerialize.getChild(type));
-					IMemento child = mementoToSerialize.createChild(type, id);
-					assertEquals(id, child.getID());
-				}
-
-				public void checkAfterDeserialization(
-						XMLMemento deserializedMemento) {
-					IMemento child = deserializedMemento.getChild(type);
-					assertNotNull(child);
-					assertEquals(id, child.getID());
-				}
-			});
-		}
-	}
-
-	public void testPutAndGetFloat() throws WorkbenchException, IOException {
-		final String key = "key";
-
-		final Float[] values = new Float[] { new Float(-3.1415), new Float(1),
-				new Float(0), new Float(4554.45235),
-				new Float(Float.MAX_VALUE), new Float(Float.MIN_VALUE),
-				new Float(Float.NaN), new Float(Float.POSITIVE_INFINITY),
-				new Float(Float.NEGATIVE_INFINITY) };
-
-		for (int i = 0; i < values.length; i++) {
-			final Float value = values[i];
-			testPutAndGet(new MementoChecker() {
-
-				public void prepareAndCheckBeforeSerialization(
-						XMLMemento mementoToSerialize) {
-					assertEquals(null, mementoToSerialize.getFloat(key));
-					mementoToSerialize.putFloat(key, value.floatValue());
-					assertEquals(value, mementoToSerialize.getFloat(key));
-				}
-
-				public void checkAfterDeserialization(
-						XMLMemento deserializedMemento) {
-					assertEquals(value, deserializedMemento.getFloat(key));
-				}
-			});
-		}
-	}
-
-	public void testPutAndGetInteger() throws WorkbenchException, IOException {
-		final String key = "key";
-
-		Integer[] values = new Integer[] { new Integer(36254), new Integer(0),
-				new Integer(1), new Integer(-36254),
-				new Integer(Integer.MAX_VALUE), new Integer(Integer.MIN_VALUE) };
-
-		for (int i = 0; i < values.length; i++) {
-			final Integer value = values[i];
-
-			testPutAndGet(new MementoChecker() {
-
-				public void prepareAndCheckBeforeSerialization(
-						XMLMemento mementoToSerialize) {
-					assertEquals(null, mementoToSerialize.getInteger(key));
-					mementoToSerialize.putInteger(key, value.intValue());
-					assertEquals(value, mementoToSerialize.getInteger(key));
-				}
-
-				public void checkAfterDeserialization(
-						XMLMemento deserializedMemento) {
-					assertEquals(value, deserializedMemento.getInteger(key));
-				}
-			});
-		}
-
-	}
-
-	public void testPutMemento() throws WorkbenchException, IOException {
-		testPutAndGet(new MementoChecker() {
-
-			public void prepareAndCheckBeforeSerialization(
-					XMLMemento mementoToSerialize) {
-				mementoToSerialize.putTextData("unchanged text data");
-				mementoToSerialize.putString("neverlost", "retained value");
-
-				IMemento aMemento = XMLMemento.createWriteRoot("foo");
-				fillMemento(aMemento);
-
-				// note that this does not copy the text data:
-				mementoToSerialize.putMemento(aMemento);
-
-				// do not check for text data:
-				checkMemento(mementoToSerialize, false);
-
-				assertEquals("unchanged text data", mementoToSerialize
-						.getTextData());
-				assertEquals("retained value", mementoToSerialize
-						.getString("neverlost"));
-			}
-
-			public void checkAfterDeserialization(XMLMemento deserializedMemento) {
-				// do not check for text data:
-				checkMemento(deserializedMemento, false);
-
-				assertEquals("unchanged text data", deserializedMemento
-						.getTextData());
-				assertEquals("retained value", deserializedMemento
-						.getString("neverlost"));
-			}
-		});
-	}
-
-	public void testPutAndGetString() throws IOException, WorkbenchException {
-		final String key = "key";
-
-		// values with newline, tab, or return characters lead to bug 93720.
-		String[] values = TEST_STRINGS;
-
-		for (int i = 0; i < values.length; i++) {
-			final String value = values[i];
-
-			testPutAndGet(new MementoChecker() {
-
-				public void prepareAndCheckBeforeSerialization(
-						XMLMemento mementoToSerialize) {
-					assertEquals(null, mementoToSerialize.getString(key));
-					String helper = value;
-					mementoToSerialize.putString(key, value);
-					assertEquals(value, mementoToSerialize.getString(key));
-					helper.toString();
-				}
-
-				public void checkAfterDeserialization(
-						XMLMemento deserializedMemento) {
-					assertEquals(value, deserializedMemento.getString(key));
-				}
-			});
-		}
-	}
-
-	public void testPutAndGetTextData() throws WorkbenchException, IOException {
-		String[] values = TEST_STRINGS;
-
-		for (int i = 0; i < values.length; i++) {
-			final String data = values[i];
-			testPutAndGet(new MementoChecker() {
-
-				public void prepareAndCheckBeforeSerialization(
-						XMLMemento mementoToSerialize) {
-					assertEquals(null, mementoToSerialize.getTextData());
-					mementoToSerialize.putTextData(data);
-					assertEquals(data, mementoToSerialize.getTextData());
-				}
-
-				public void checkAfterDeserialization(
-						XMLMemento deserializedMemento) {
-					if (data.equals("")) {
-						// this comes back as null...
-						assertEquals(null, deserializedMemento.getTextData());
-					} else {
-						assertEquals(data, deserializedMemento.getTextData());
-					}
-				}
-			});
-		}
-	}
-
-	public void testLegalKeys() throws WorkbenchException, IOException {
-		String[] legalKeys = { "value", "value.with.many.dots",
-				"value_with_underscores" };
-
-		for (int i = 0; i < legalKeys.length; i++) {
-			final String key = legalKeys[i];
-			testPutAndGet(new MementoChecker() {
-
-				public void prepareAndCheckBeforeSerialization(
-						XMLMemento mementoToSerialize) {
-					assertEquals(null, mementoToSerialize.getString(key));
-					try {
-						mementoToSerialize.putString(key, "some string");
-					} catch (RuntimeException ex) {
-						System.out.println("offending key: '" + key + "'");
-						throw ex;
-					}
-					assertEquals("some string", mementoToSerialize
-							.getString(key));
-				}
-
-				public void checkAfterDeserialization(
-						XMLMemento deserializedMemento) {
-					assertEquals("some string", deserializedMemento
-							.getString(key));
-				}
-			});
-		}
-
-	}
-
-	public void testIllegalKeys() {
-		String[] illegalKeys = { "", " ", " key", "key ", "key key", "\t",
-				"\tkey", "key\t", "key\tkey", "\n", "\nkey", "key\n",
-				"key\nkey", "key<with<lessthan", "key>with>greaterthan",
-				"key&with&ampersand", "key#with#hash", "key\"with\"quote", "\"" };
-
-		for (int i = 0; i < illegalKeys.length; i++) {
-			final String key = illegalKeys[i];
-			XMLMemento memento = XMLMemento.createWriteRoot("foo");
-			try {
-				memento.putString(key, "some string");
-				fail("putString with illegal key should fail");
-			} catch (Exception ex) {
-				// expected
-			}
-		}
-	}
-
-	public void testPutTextDataWithChildrenBug93718()
-			throws WorkbenchException, IOException {
-		final String textData = "\n\tThis is\ntext data\n\t\twith newlines and \ttabs\t\n\t ";
-		testPutAndGet(new MementoChecker() {
-
-			public void prepareAndCheckBeforeSerialization(
-					XMLMemento mementoToSerialize) {
-				mementoToSerialize.createChild("type", "id");
-				mementoToSerialize.putTextData(textData);
-				mementoToSerialize.createChild("type", "id");
-				mementoToSerialize.createChild("type", "id");
-				assertEquals(textData, mementoToSerialize.getTextData());
-			}
-
-			public void checkAfterDeserialization(XMLMemento deserializedMemento) {
-				assertEquals(textData, deserializedMemento.getTextData());
-			}
-		});
-	}
-
-	private static interface MementoChecker {
-		void prepareAndCheckBeforeSerialization(XMLMemento mementoToSerialize);
-
-		void checkAfterDeserialization(XMLMemento deserializedMemento);
-	}
-
-	private void testPutAndGet(MementoChecker mementoChecker)
-			throws IOException, WorkbenchException {
-		XMLMemento mementoToSerialize = XMLMemento
-				.createWriteRoot("XMLMementoTest");
-
-		mementoChecker.prepareAndCheckBeforeSerialization(mementoToSerialize);
-
-		StringWriter writer = new StringWriter();
-		mementoToSerialize.save(writer);
-		writer.close();
-
-		StringReader reader = new StringReader(writer.getBuffer().toString());
-		XMLMemento deserializedMemento = XMLMemento.createReadRoot(reader);
-
-		mementoChecker.checkAfterDeserialization(deserializedMemento);
-	}
-	
-	   public void testMementoWithTextContent113659() throws Exception {
-	        IMemento memento = XMLMemento.createWriteRoot("root");
-	        IMemento mementoWithChild = XMLMemento.createWriteRoot("root");
-	        IMemento child = mementoWithChild.createChild("child");
-	        child.putTextData("text");
-	        memento.putMemento(mementoWithChild);
-	        IMemento copiedChild = memento.getChild("child");
-	        assertEquals("text", copiedChild.getTextData());
-	    }
-
-
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ArbitraryPropertyTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ArbitraryPropertyTest.java
deleted file mode 100644
index 21cda8a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ArbitraryPropertyTest.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.0
- */
-public class ArbitraryPropertyTest extends UITestCase {
-	/**
-	 * 
-	 */
-	private static final String EDITOR_ID = "org.eclipse.ui.tests.TitleTestEditor";
-
-	/**
-	 * 
-	 */
-	private static final String USER_PROP = "org.eclipse.ui.test.user";
-
-	final static String VIEW_ID = "org.eclipse.ui.tests.workbenchpart.OverriddenTitleView";
-
-	/**
-	 * @param testName
-	 */
-	public ArbitraryPropertyTest(String testName) {
-		super(testName);
-	}
-
-	WorkbenchWindow window;
-
-	WorkbenchPage page;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doSetUp()
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		window = (WorkbenchWindow) openTestWindow();
-		page = (WorkbenchPage) window.getActivePage();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.util.UITestCase#doTearDown()
-	 */
-	protected void doTearDown() throws Exception {
-		super.doTearDown();
-	}
-
-	static class PropListener implements IPropertyChangeListener {
-		String firedProp = null;
-
-		String firedOV = null;
-
-		String firedNV = null;
-
-		public void propertyChange(PropertyChangeEvent event) {
-			firedProp = event.getProperty();
-			firedOV = (String) event.getOldValue();
-			firedNV = (String) event.getNewValue();
-		}
-	};
-
-	public void testViewProperties() throws Exception {
-		OverriddenTitleView view = (OverriddenTitleView) page.showView(VIEW_ID);
-		IViewReference ref = (IViewReference) page.getReference(view);
-
-		PropListener viewListener = new PropListener();
-		view.addPartPropertyListener(viewListener);
-		PropListener refListener = new PropListener();
-		ref.addPartPropertyListener(refListener);
-
-		view.setPartProperty(USER_PROP, "pwebster");
-
-		try {
-			assertEquals("pwebster", view.getPartProperty(USER_PROP));
-			assertEquals("pwebster", ref.getPartProperty(USER_PROP));
-
-			assertEquals(USER_PROP, viewListener.firedProp);
-			assertNull(viewListener.firedOV);
-			assertEquals("pwebster", viewListener.firedNV);
-			assertEquals(USER_PROP, refListener.firedProp);
-			assertNull(refListener.firedOV);
-			assertEquals("pwebster", refListener.firedNV);
-		} finally {
-			view.removePartPropertyListener(viewListener);
-			ref.removePartPropertyListener(refListener);
-		}
-	}
-
-	public void testEditorProperties() throws Exception {
-		IFileEditorInput input = new IFileEditorInput() {
-			public boolean exists() {
-				return true;
-			}
-
-			public ImageDescriptor getImageDescriptor() {
-				return null;
-			}
-
-			public String getName() {
-				return "MyInputFile";
-			}
-
-			public IPersistableElement getPersistable() {
-				return null;
-			}
-
-			public String getToolTipText() {
-				return "My Input File";
-			}
-
-			public Object getAdapter(Class adapter) {
-				return null;
-			}
-
-			public IFile getFile() {
-				return null;
-			}
-
-			public IStorage getStorage() throws CoreException {
-				if (false) throw new CoreException(null);
-				return null;
-			}
-		};
-		TitleTestEditor editor = (TitleTestEditor) page.openEditor(input,
-				EDITOR_ID);
-		IEditorReference ref = (IEditorReference) page.getReference(editor);
-
-		PropListener editorListener = new PropListener();
-		editor.addPartPropertyListener(editorListener);
-		PropListener refListener = new PropListener();
-		ref.addPartPropertyListener(refListener);
-
-		editor.setPartProperty(USER_PROP, "pwebster");
-
-		try {
-			assertEquals("pwebster", editor.getPartProperty(USER_PROP));
-			assertEquals("pwebster", ref.getPartProperty(USER_PROP));
-
-			assertEquals(USER_PROP, editorListener.firedProp);
-			assertNull(editorListener.firedOV);
-			assertEquals("pwebster", editorListener.firedNV);
-			assertEquals(USER_PROP, refListener.firedProp);
-			assertNull(refListener.firedOV);
-			assertEquals("pwebster", refListener.firedNV);
-		} finally {
-			editor.removePartPropertyListener(editorListener);
-			ref.removePartPropertyListener(refListener);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/CustomTitleView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/CustomTitleView.java
deleted file mode 100644
index 4969b2a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/CustomTitleView.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-/**
- * @since 3.0
- */
-public class CustomTitleView extends EmptyView {
-
-    /**
-     * 
-     */
-    public CustomTitleView() {
-        super();
-
-        setTitle("Custom title");
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/DynamicItem.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/DynamicItem.java
deleted file mode 100644
index 9b03265..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/DynamicItem.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.CompoundContributionItem;
-
-/**
- * Test implementation for dynamic menu item support.
- * 
- * @since 3.3
- * 
- */
-public class DynamicItem extends CompoundContributionItem {
-
-	private Action action1;
-	private Action action2;
-
-	/**
-	 * Default constructor
-	 */
-	public DynamicItem() {
-		makeActions();
-	}
-
-	private void showMessage(String message) {
-		MessageDialog.openInformation(null, "Sample View", message);
-	}
-
-	private void makeActions() {
-		action1 = new Action() {
-			public void run() {
-				showMessage("Dynamic Item 1 executed");
-			}
-		};
-		action1.setText("Dynamic Item 1");
-		action1.setToolTipText("Dynamic Item 1 tooltip");
-		action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
-				.getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
-
-		action2 = new Action() {
-			public void run() {
-				showMessage("Dynamic Item 2 executed");
-			}
-		};
-		action2.setText("Dynamic Item 2");
-		action2.setToolTipText("Dynamic Item 2 tooltip");
-		action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
-				.getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.CompoundContributionItem#getContributionItems()
-	 */
-	protected IContributionItem[] getContributionItems() {
-		IContributionItem[] items = { new ActionContributionItem(action1),
-				new ActionContributionItem(action2) };
-		return items;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EditorWithCreateControlsException.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EditorWithCreateControlsException.java
deleted file mode 100644
index 2ad2695..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EditorWithCreateControlsException.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.EditorPart;
-
-public class EditorWithCreateControlsException extends EditorPart {
-
-    public void doSave(IProgressMonitor monitor) {
-
-    }
-
-    public void doSaveAs() {
-
-    }
-
-    public void init(IEditorSite site, IEditorInput input)
-            throws PartInitException {
-        if (!(input instanceof IFileEditorInput))
-            throw new PartInitException("Invalid Input: Must be IFileEditorInput");
-        setSite(site);
-        setInput(input);
-    }
-
-    public boolean isDirty() {
-        return false;
-    }
-
-    public boolean isSaveAsAllowed() {
-        return false;
-    }
-
-    public void createPartControl(Composite parent) {
-        Label testLabel = new Label(parent, SWT.NONE);
-        
-        testLabel.setText("If you can read this, widgets are not being disposed properly when errors occur in createPartControl");
-        
-        throw new RuntimeException("This exception was thrown intentionally as part of an error handling test");
-
-    }
-
-    public void setFocus() {
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EditorWithDisposeException.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EditorWithDisposeException.java
deleted file mode 100644
index 6cdb8dc..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EditorWithDisposeException.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.EditorPart;
-
-public class EditorWithDisposeException extends EditorPart {
-
-    public void doSave(IProgressMonitor monitor) {
-    }
-
-    public void doSaveAs() {
-    }
-
-    public void init(IEditorSite site, IEditorInput input)
-            throws PartInitException {
-        
-        if (!(input instanceof IFileEditorInput))
-            throw new PartInitException("Invalid Input: Must be IFileEditorInput");
-        setSite(site);
-        setInput(input);
-    }
-
-    public boolean isDirty() {
-        return false;
-    }
-
-    public boolean isSaveAsAllowed() {
-        return false;
-    }
-
-    public void createPartControl(Composite parent) {
-        parent.setLayout(new FillLayout());
-        
-        Label testLabel = new Label(parent, SWT.NONE);
-        
-        testLabel.setText("This editor is supposed to throw an exception when closed");
-    }
-
-    public void setFocus() {
-
-    }
-    
-    public void dispose() {
-        throw new RuntimeException("This exception was thrown intentionally as part of an error handling test");
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EditorWithInitException.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EditorWithInitException.java
deleted file mode 100644
index 5da3aa6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EditorWithInitException.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.EditorPart;
-
-public class EditorWithInitException extends EditorPart {
-
-    public void doSave(IProgressMonitor monitor) {
-
-    }
-
-    public void doSaveAs() {
-
-    }
-
-    public void init(IEditorSite site, IEditorInput input)
-            throws PartInitException {
-        
-        throw new PartInitException("This exception was thrown intentionally as part of an error handling test");
-    }
-
-    public boolean isDirty() {
-        return false;
-    }
-
-    public boolean isSaveAsAllowed() {
-        return false;
-    }
-
-    public void createPartControl(Composite parent) {
-
-        parent.setLayout(new FillLayout());
-        
-        Label message = new Label(parent, SWT.NONE);
-        message.setText("This editor threw an exception on init. You should not be able to read this");
-    }
-
-    public void setFocus() {
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EditorWithInitRuntimeException.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EditorWithInitRuntimeException.java
deleted file mode 100644
index 752585c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EditorWithInitRuntimeException.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.EditorPart;
-
-public class EditorWithInitRuntimeException extends EditorPart {
-
-    public void doSave(IProgressMonitor monitor) {
-
-    }
-
-    public void doSaveAs() {
-
-    }
-
-    public void init(IEditorSite site, IEditorInput input)
-            throws PartInitException {
-        
-        throw new RuntimeException("This exception was thrown intentionally as part of an error handling test");
-    }
-
-    public boolean isDirty() {
-        return false;
-    }
-
-    public boolean isSaveAsAllowed() {
-        return false;
-    }
-
-    public void createPartControl(Composite parent) {
-
-        parent.setLayout(new FillLayout());
-        
-        Label message = new Label(parent, SWT.NONE);
-        message.setText("This editor threw an exception on init. You should not be able to read this");
-    }
-
-    public void setFocus() {
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EditorWithInputException.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EditorWithInputException.java
deleted file mode 100644
index ed2c34b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EditorWithInputException.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.EditorPart;
-
-public class EditorWithInputException extends EditorPart {
-
-    public void doSave(IProgressMonitor monitor) {
-
-    }
-
-    public void doSaveAs() {
-
-    }
-
-    public void init(IEditorSite site, IEditorInput input)
-            throws PartInitException {
-        if (!(input instanceof IFileEditorInput))
-            throw new PartInitException("Invalid Input: Must be IFileEditorInput");
-        setSite(site);
-        setInput(input);
-    }
-
-    public boolean isDirty() {
-        return false;
-    }
-
-    public boolean isSaveAsAllowed() {
-        return false;
-    }
-    
-    public IEditorInput getEditorInput() {
-        IllegalStateException exception = new IllegalStateException("This exception was thrown intentionally as part of an error handling test");
-        throw exception;
-    }
-
-    public void createPartControl(Composite parent) {
-        Label testLabel = new Label(parent, SWT.NONE);
-        
-        testLabel.setText("This throws an exception in getEditorInput");
-    }
-
-    public void setFocus() {
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EmptyView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EmptyView.java
deleted file mode 100644
index 926d968..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/EmptyView.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * @since 3.0
- */
-public class EmptyView extends ViewPart {
-
-    /**
-     * 
-     */
-    public EmptyView() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-     */
-    public void createPartControl(Composite parent) {
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-     */
-    public void setFocus() {
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.part.WorkbenchPart#setContentDescription(java.lang.String)
-     */
-    public void setContentDescription(String description) {
-        super.setContentDescription(description);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.part.WorkbenchPart#setPartName(java.lang.String)
-     */
-    public void setPartName(String partName) {
-        super.setPartName(partName);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.part.WorkbenchPart#setTitle(java.lang.String)
-     */
-    public void setTitle(String title) {
-        super.setTitle(title);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/HeavyResourceView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/HeavyResourceView.java
deleted file mode 100644
index 4408120..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/HeavyResourceView.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Button;
-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.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.tests.TestPlugin;
-
-public class HeavyResourceView extends ViewPart {
-
-    private Button useAllComposites;
-    private Button releaseAllComposites;
-    
-    private Shell tempShell;
-    private Composite control;
-    
-    public void createPartControl(Composite parent) {
-        control = parent;
-        
-        SelectionListener listener = new SelectionAdapter() {
-          public void widgetSelected(SelectionEvent e) {
-                super.widgetSelected(e);
-                
-                if (e.widget == useAllComposites) {
-                    useAll();
-                } else if (e.widget == releaseAllComposites) {
-                    releaseAll();
-                }
-            }  
-        };
-        
-        Label explanation = new Label(parent, SWT.WRAP);
-        explanation.setText("This view allocates all available SWT resources on demand. " 
-                + "This is not supposed to be a recoverable error, and is expected to crash the workbench. "
-                + "This view allows us observe the workbench when it crashes in this manner.");
-        
-        useAllComposites = new Button(parent, SWT.PUSH);
-        useAllComposites.setText("&Allocate all available composites (very slow!)");
-        useAllComposites.addSelectionListener(listener);
-        
-        releaseAllComposites = new Button(parent, SWT.PUSH);
-        releaseAllComposites.setText("&Release all composites");
-        releaseAllComposites.addSelectionListener(listener);
-           
-    }
-
-    public void setFocus() {
-        control.setFocus();
-    }
-    
-    public void useAll() {
-        releaseAll();
-        tempShell = new Shell(Display.getCurrent(), SWT.NONE);
-        int count = 0;
-        try {
-            for(;;) {
-                new Composite(tempShell, SWT.NONE);
-                count++;
-            }
-        } catch (SWTError e) {
-            TestPlugin.getDefault().getLog().log(WorkbenchPlugin.getStatus(e));
-        }
-    }
-    
-    public void releaseAll() {
-        if (tempShell != null) {
-            tempShell.dispose();
-            tempShell = null;
-        }
-    }
-    
-    public void dispose() {
-        releaseAll();
-        super.dispose();
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/LifecycleView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/LifecycleView.java
deleted file mode 100644
index c7a99d8..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/LifecycleView.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.internal.services.IWorkbenchLocationService;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * @since 3.4
- * 
- */
-public class LifecycleView extends ViewPart {
-
-	public static final String ID = "org.eclipse.ui.tests.LifecycleView";
-
-	public boolean callWidgetDispose = false;
-	public boolean callSiteDispose = false;
-	public boolean callPartDispose = false;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite)
-	 */
-	public void init(IViewSite site) throws PartInitException {
-		super.init(site);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-
-		IActionBars actionBars = getViewSite().getActionBars();
-		IToolBarManager toolBarManager = actionBars.getToolBarManager();
-		toolBarManager.add(new Action("Hi") {
-		});
-		actionBars.updateActionBars();
-		((ToolBarManager) toolBarManager).getControl().addDisposeListener(
-				new DisposeListener() {
-
-					public void widgetDisposed(DisposeEvent e) {
-						callWidgetDispose = true;
-					}
-				});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		IWorkbenchLocationService wls = (IWorkbenchLocationService) getSite()
-				.getService(IWorkbenchLocationService.class);
-		if (wls.getPartSite() == null) {
-			callSiteDispose = true;
-		}
-		callPartDispose = true;
-		super.dispose();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/LifecycleViewTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/LifecycleViewTest.java
deleted file mode 100644
index 72c14e1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/LifecycleViewTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.4
- *
- */
-public class LifecycleViewTest extends UITestCase {
-
-	/**
-	 * @param testName
-	 */
-	public LifecycleViewTest(String testName) {
-		super(testName);
-	}
-
-	public void testLifecycle() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		IWorkbenchPage page = window.getActivePage();
-		IViewPart v = page.showView(LifecycleView.ID);
-		assertTrue(v instanceof LifecycleView);
-		LifecycleView view = (LifecycleView) v;
-		processEvents();
-		
-		page.hideView(v);
-		
-		processEvents();
-		
-		assertTrue(view.callPartDispose);
-		assertTrue(view.callWidgetDispose);
-		assertFalse(view.callSiteDispose);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/MenuContributionHarness.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/MenuContributionHarness.java
deleted file mode 100644
index c312d9d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/MenuContributionHarness.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelection;
-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.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.contexts.IContextActivation;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.menus.IMenuService;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * This view acts as a test harness for the new 3.3 menu contribution story. It
- * read the additions and uses the mechanism to construct its various menus and
- * toolbars.
- * 
- * Right now it's under development but will act as a primary testing point for
- * the development.
- * 
- * Currently reads the additions when the control is created and only handles
- * the popup menu contributions...
- */
-
-public class MenuContributionHarness extends ViewPart {
-	public final static String VIEW_ID = "org.eclipse.ui.tests.api.MenuTestHarness";
-	public final static String CONTEXT_TEST1_ID = "org.eclipse.ui.menus.contexts.test1";
-
-	IMenuService menuSvc;
-
-	private TableViewer viewer;
-	private Action action1;
-	private Action action2;
-	private Action doubleClickAction;
-	private Action action3;
-
-	/*
-	 * The content provider class is responsible for providing objects to the
-	 * view. It can wrap existing objects in adapters or simply return objects
-	 * as-is. These objects may be sensitive to the current input of the view,
-	 * or ignore it and always show the same content (like Task List, for
-	 * example).
-	 */
-
-	class ViewContentProvider implements IStructuredContentProvider {
-		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
-		}
-
-		public void dispose() {
-		}
-
-		public Object[] getElements(Object parent) {
-			return new String[] { "One", "Two", "Three" };
-		}
-	}
-
-	class ViewLabelProvider extends LabelProvider implements
-			ITableLabelProvider {
-		public String getColumnText(Object obj, int index) {
-			return getText(obj);
-		}
-
-		public Image getColumnImage(Object obj, int index) {
-			return getImage(obj);
-		}
-
-		public Image getImage(Object obj) {
-			return PlatformUI.getWorkbench().getSharedImages().getImage(
-					ISharedImages.IMG_OBJ_ELEMENT);
-		}
-	}
-
-	class NameSorter extends ViewerSorter {
-	}
-
-	/**
-	 * The constructor.
-	 */
-	public MenuContributionHarness() {
-	}
-
-	/**
-	 * This is a callback that will allow us to create the viewer and initialize
-	 * it.
-	 */
-	public void createPartControl(Composite parent) {
-		// Access the menu service
-		menuSvc = (IMenuService) getSite().getService(IMenuService.class);
-
-		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
-				| SWT.V_SCROLL);
-		viewer.setContentProvider(new ViewContentProvider());
-		viewer.setLabelProvider(new ViewLabelProvider());
-		viewer.setSorter(new NameSorter());
-		viewer.setInput(getViewSite());
-		makeActions();
-		hookContextMenu();
-		hookDoubleClickAction();
-		contributeToActionBars();
-	}
-
-	private void hookContextMenu() {
-		MenuManager menuMgr = new MenuManager("#PopupMenu");
-
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				MenuContributionHarness.this.fillContextMenu(manager);
-			}
-		});
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(menuMgr, viewer);
-	}
-
-	private void contributeToActionBars() {
-		IActionBars bars = getViewSite().getActionBars();
-		fillLocalPullDown(bars.getMenuManager());
-		fillLocalToolBar(bars.getToolBarManager());
-
-	}
-
-	private void fillLocalPullDown(IMenuManager manager) {
-		manager.add(action1);
-		manager.add(new Separator());
-		manager.add(action2);
-	}
-
-	private void fillContextMenu(IMenuManager manager) {
-		// Add some local actions
-		manager.add(action1);
-		manager.add(new Separator());
-		manager.add(action2);
-	}
-
-	private void fillLocalToolBar(IToolBarManager manager) {
-		manager.add(action1);
-		manager.add(action2);
-		manager.add(action3);
-	}
-
-	private void makeActions() {
-		action1 = new Action() {
-			public void run() {
-				showMessage("Action 1 executed");
-			}
-		};
-		action1.setText("Action 1");
-		action1.setToolTipText("Action 1 tooltip");
-		action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
-				.getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
-
-		action2 = new Action() {
-			public void run() {
-				showMessage("Action 2 executed");
-			}
-		};
-		action2.setText("Action 2");
-		action2.setToolTipText("Action 2 tooltip");
-		action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
-				.getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
-
-		final IContextService contextService = (IContextService) getSite()
-				.getService(IContextService.class);
-		action3 = new Action() {
-			IContextActivation currentActivation = null;
-
-			public void run() {
-				if (currentActivation == null) {
-					currentActivation = contextService
-							.activateContext(MenuContributionHarness.CONTEXT_TEST1_ID);
-					setImageDescriptor(PlatformUI.getWorkbench()
-							.getSharedImages().getImageDescriptor(
-									ISharedImages.IMG_TOOL_UNDO));
-				} else {
-					contextService.deactivateContext(currentActivation);
-					currentActivation = null;
-					setImageDescriptor(PlatformUI.getWorkbench()
-							.getSharedImages().getImageDescriptor(
-									ISharedImages.IMG_TOOL_REDO));
-				}
-			}
-		};
-		action3.setText("Toggle test1");
-		action3.setToolTipText("Toggle test1");
-		action3.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
-				.getImageDescriptor(ISharedImages.IMG_TOOL_REDO));
-
-		doubleClickAction = new Action() {
-			public void run() {
-				ISelection selection = viewer.getSelection();
-				Object obj = ((IStructuredSelection) selection)
-						.getFirstElement();
-				showMessage("Double-click detected on " + obj.toString());
-			}
-		};
-	}
-
-	private void hookDoubleClickAction() {
-		viewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				doubleClickAction.run();
-			}
-		});
-	}
-
-	private void showMessage(String message) {
-		MessageDialog.openInformation(viewer.getControl().getShell(),
-				"Sample View", message);
-	}
-
-	/**
-	 * Passing the focus request to the viewer's control.
-	 */
-	public void setFocus() {
-		viewer.getControl().setFocus();
-	}
-	
-	int callCount = 0;
-	
-	public void updateCount() {
-		callCount++;
-	}
-	
-	public int getCount() {
-		return callCount;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/OverriddenTitleTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/OverriddenTitleTest.java
deleted file mode 100644
index 715bd33..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/OverriddenTitleTest.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import junit.framework.Assert;
-
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IWorkbenchPart2;
-import org.eclipse.ui.IWorkbenchPartConstants;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.0
- */
-public class OverriddenTitleTest extends UITestCase {
-    /**
-     * @param testName
-     */
-    public OverriddenTitleTest(String testName) {
-        super(testName);
-    }
-
-    WorkbenchWindow window;
-
-    WorkbenchPage page;
-
-    OverriddenTitleView view;
-
-    boolean titleChangeEvent = false;
-
-    boolean nameChangeEvent = false;
-
-    boolean contentChangeEvent = false;
-
-    private IPropertyListener propertyListener = new IPropertyListener() {
-        /* (non-Javadoc)
-         * @see org.eclipse.ui.IPropertyListener#propertyChanged(java.lang.Object, int)
-         */
-        public void propertyChanged(Object source, int propId) {
-            switch (propId) {
-            case IWorkbenchPartConstants.PROP_TITLE:
-                titleChangeEvent = true;
-                break;
-            case IWorkbenchPartConstants.PROP_PART_NAME:
-                nameChangeEvent = true;
-                break;
-            case IWorkbenchPartConstants.PROP_CONTENT_DESCRIPTION:
-                contentChangeEvent = true;
-                break;
-            }
-        }
-    };
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        window = (WorkbenchWindow) openTestWindow();
-        page = (WorkbenchPage) window.getActivePage();
-        view = (OverriddenTitleView) page
-                .showView("org.eclipse.ui.tests.workbenchpart.OverriddenTitleView");
-        view.addPropertyListener(propertyListener);
-        titleChangeEvent = false;
-        nameChangeEvent = false;
-        contentChangeEvent = false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.util.UITestCase#doTearDown()
-     */
-    protected void doTearDown() throws Exception {
-        view.removePropertyListener(propertyListener);
-        page.hideView(view);
-        super.doTearDown();
-    }
-
-    private static void verifySettings(IWorkbenchPart2 part,
-            String expectedTitle, String expectedPartName,
-            String expectedContentDescription) throws Exception {
-        Assert.assertEquals("Incorrect view title", expectedTitle, part
-                .getTitle());
-        Assert.assertEquals("Incorrect part name", expectedPartName, part
-                .getPartName());
-        Assert.assertEquals("Incorrect content description",
-                expectedContentDescription, part.getContentDescription());
-    }
-
-    private void verifySettings(String expectedTitle, String expectedPartName,
-            String expectedContentDescription) throws Exception {
-        verifySettings(view, expectedTitle, expectedPartName,
-                expectedContentDescription);
-    }
-
-    /**
-     * Ensure that we've received the given property change events since the start of the test
-     * 
-     * @param titleEvent PROP_TITLE
-     * @param nameEvent PROP_PART_NAME
-     * @param descriptionEvent PROP_CONTENT_DESCRIPTION
-     */
-    private void verifyEvents(boolean titleEvent, boolean nameEvent,
-            boolean descriptionEvent) {
-        if (titleEvent) {
-            Assert.assertEquals("Missing title change event", titleEvent,
-                    titleChangeEvent);
-        }
-        if (nameEvent) {
-            Assert.assertEquals("Missing name change event", nameEvent,
-                    nameChangeEvent);
-        }
-        if (descriptionEvent) {
-            Assert.assertEquals("Missing content description event",
-                    descriptionEvent, contentChangeEvent);
-        }
-    }
-
-    public void testDefaults() throws Throwable {
-        verifySettings("OverriddenTitle", "OverriddenTitleView",
-                "OverriddenTitle");
-        verifyEvents(false, false, false);
-    }
-
-    public void testCustomName() throws Throwable {
-        view.setPartName("CustomPartName");
-        verifySettings("OverriddenTitle", "CustomPartName", "OverriddenTitle");
-        verifyEvents(false, true, false);
-    }
-
-    public void testEmptyContentDescription() throws Throwable {
-        view.setContentDescription("");
-        verifySettings("OverriddenTitle", "OverriddenTitleView", "");
-        verifyEvents(false, false, true);
-    }
-
-    public void testCustomTitle() throws Throwable {
-        view.customSetTitle("CustomTitle");
-        verifySettings("CustomTitle", "OverriddenTitleView", "CustomTitle");
-        verifyEvents(true, false, true);
-    }
-
-    public void testCustomContentDescription() throws Throwable {
-        view.setContentDescription("CustomContentDescription");
-        verifySettings("OverriddenTitle", "OverriddenTitleView",
-                "CustomContentDescription");
-        verifyEvents(false, false, true);
-    }
-
-    public void testCustomNameAndContentDescription() throws Throwable {
-        view.setPartName("CustomName");
-        view.setContentDescription("CustomContentDescription");
-        verifySettings("OverriddenTitle", "CustomName",
-                "CustomContentDescription");
-        verifyEvents(false, true, true);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/OverriddenTitleView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/OverriddenTitleView.java
deleted file mode 100644
index 0a57e86..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/OverriddenTitleView.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.ui.IWorkbenchPartConstants;
-import org.eclipse.ui.internal.util.Util;
-
-/**
- * @since 3.0
- */
-public class OverriddenTitleView extends EmptyView {
-
-    String overriddenTitle = "OverriddenTitle";
-
-    /**
-     * 
-     */
-    public OverriddenTitleView() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#getTitle()
-     */
-    public String getTitle() {
-        return overriddenTitle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.part.WorkbenchPart#setTitle(java.lang.String)
-     */
-    public void customSetTitle(String title) {
-        overriddenTitle = Util.safeString(title);
-
-        firePropertyChange(IWorkbenchPartConstants.PROP_TITLE);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/RawIViewPart.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/RawIViewPart.java
deleted file mode 100644
index bf6c1be..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/RawIViewPart.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.core.commands.common.EventManager;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.util.SafeRunnable;
-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.ISharedImages;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPartConstants;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @since 3.0
- */
-public class RawIViewPart extends EventManager implements IViewPart {
-
-    private IViewSite site;
-
-    private String title = "SomeTitle";
-
-    /**
-     * 
-     */
-    public RawIViewPart() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IViewPart#getViewSite()
-     */
-    public IViewSite getViewSite() {
-        return site;
-    }
-
-    public void setTitle(String newTitle) {
-        title = newTitle;
-        firePropertyChange(IWorkbenchPartConstants.PROP_TITLE);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IViewPart#init(org.eclipse.ui.IViewSite)
-     */
-    public void init(IViewSite site) throws PartInitException {
-        this.site = site;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IViewPart#init(org.eclipse.ui.IViewSite, org.eclipse.ui.IMemento)
-     */
-    public void init(IViewSite site, IMemento memento) throws PartInitException {
-        this.site = site;
-    }
-
-    /**
-     * Fires a property changed event.
-     *
-     * @param propertyId the id of the property that changed
-     */
-    protected void firePropertyChange(final int propertyId) {
-        Object[] array = getListeners();
-        for (int nX = 0; nX < array.length; nX++) {
-            final IPropertyListener l = (IPropertyListener) array[nX];
-            Platform.run(new SafeRunnable() {
-                public void run() {
-                    l.propertyChanged(RawIViewPart.this, propertyId);
-                }
-            });
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IViewPart#saveState(org.eclipse.ui.IMemento)
-     */
-    public void saveState(IMemento memento) {
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#addPropertyListener(org.eclipse.ui.IPropertyListener)
-     */
-    public void addPropertyListener(IPropertyListener listener) {
-        addListenerObject(listener);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-     */
-    public void createPartControl(Composite parent) {
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#dispose()
-     */
-    public void dispose() {
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#getSite()
-     */
-    public IWorkbenchPartSite getSite() {
-        return site;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#getTitle()
-     */
-    public String getTitle() {
-        return title;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#getTitleImage()
-     */
-    public Image getTitleImage() {
-        return PlatformUI.getWorkbench().getSharedImages().getImage(
-                ISharedImages.IMG_DEF_VIEW);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#getTitleToolTip()
-     */
-    public String getTitleToolTip() {
-        return "blah";
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#removePropertyListener(org.eclipse.ui.IPropertyListener)
-     */
-    public void removePropertyListener(IPropertyListener l) {
-        removeListenerObject(l);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-     */
-    public void setFocus() {
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-     */
-    public Object getAdapter(Class adapter) {
-        return null;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/RawIViewPartTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/RawIViewPartTest.java
deleted file mode 100644
index b2b000b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/RawIViewPartTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import junit.framework.Assert;
-
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartConstants;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.0
- */
-public class RawIViewPartTest extends UITestCase {
-    /**
-     * @param testName
-     */
-    public RawIViewPartTest(String testName) {
-        super(testName);
-    }
-
-    WorkbenchWindow window;
-
-    WorkbenchPage page;
-
-    RawIViewPart view;
-
-    IWorkbenchPartReference ref;
-
-    boolean titleChangeEvent = false;
-
-    boolean nameChangeEvent = false;
-
-    boolean contentChangeEvent = false;
-
-    private IPropertyListener propertyListener = new IPropertyListener() {
-        /* (non-Javadoc)
-         * @see org.eclipse.ui.IPropertyListener#propertyChanged(java.lang.Object, int)
-         */
-        public void propertyChanged(Object source, int propId) {
-            switch (propId) {
-            case IWorkbenchPartConstants.PROP_TITLE:
-                titleChangeEvent = true;
-                break;
-            case IWorkbenchPartConstants.PROP_PART_NAME:
-                nameChangeEvent = true;
-                break;
-            case IWorkbenchPartConstants.PROP_CONTENT_DESCRIPTION:
-                contentChangeEvent = true;
-                break;
-            }
-        }
-    };
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        window = (WorkbenchWindow) openTestWindow();
-        page = (WorkbenchPage) window.getActivePage();
-        view = (RawIViewPart) page
-                .showView("org.eclipse.ui.tests.workbenchpart.RawIViewPart");
-        ref = page
-                .findViewReference("org.eclipse.ui.tests.workbenchpart.RawIViewPart");
-        ref.addPropertyListener(propertyListener);
-        titleChangeEvent = false;
-        nameChangeEvent = false;
-        contentChangeEvent = false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.util.UITestCase#doTearDown()
-     */
-    protected void doTearDown() throws Exception {
-        view.removePropertyListener(propertyListener);
-        page.hideView(view);
-        super.doTearDown();
-    }
-
-    private void verifySettings(IWorkbenchPart part, String expectedTitle,
-            String expectedPartName, String expectedContentDescription)
-            throws Exception {
-        Assert.assertEquals("Incorrect view title", expectedTitle, part
-                .getTitle());
-
-        Assert.assertEquals("Incorrect title in view reference", expectedTitle,
-                ref.getTitle());
-        Assert.assertEquals("Incorrect part name in view reference",
-                expectedPartName, ref.getPartName());
-        Assert.assertEquals("Incorrect content description in view reference",
-                expectedContentDescription, ref.getContentDescription());
-    }
-
-    private void verifySettings(String expectedTitle, String expectedPartName,
-            String expectedContentDescription) throws Exception {
-        verifySettings(view, expectedTitle, expectedPartName,
-                expectedContentDescription);
-    }
-
-    /**
-     * Ensure that we've received the given property change events since the start of the test
-     * 
-     * @param titleEvent PROP_TITLE
-     * @param nameEvent PROP_PART_NAME
-     * @param descriptionEvent PROP_CONTENT_DESCRIPTION
-     */
-    private void verifyEvents(boolean titleEvent, boolean nameEvent,
-            boolean descriptionEvent) {
-        if (titleEvent) {
-            Assert.assertEquals("Missing title change event", titleEvent,
-                    titleChangeEvent);
-        }
-        if (nameEvent) {
-            Assert.assertEquals("Missing name change event", nameEvent,
-                    nameChangeEvent);
-        }
-        if (descriptionEvent) {
-            Assert.assertEquals("Missing content description event",
-                    descriptionEvent, contentChangeEvent);
-        }
-    }
-
-    public void testDefaults() throws Throwable {
-        verifySettings("SomeTitle", "RawIViewPart", "SomeTitle");
-        verifyEvents(false, false, false);
-    }
-
-    public void testCustomTitle() throws Throwable {
-        view.setTitle("CustomTitle");
-        verifySettings("CustomTitle", "RawIViewPart", "CustomTitle");
-        verifyEvents(true, false, true);
-    }
-
-    /**
-     * Ensures that the content description is empty when the title is the same
-     * as the default part name
-     */
-    public void testEmptyContentDescription() throws Throwable {
-        view.setTitle("RawIViewPart");
-        verifySettings("RawIViewPart", "RawIViewPart", "");
-        verifyEvents(true, false, true);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/TextWidget.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/TextWidget.java
deleted file mode 100644
index 17b431d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/TextWidget.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.api.workbenchpart;
-
-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;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.menus.WorkbenchWindowControlContribution;
-
-/**
- * Basic widget wrapping an SWT Text Control.
- * 
- * @since 3.3
- *
- */
-public class TextWidget extends WorkbenchWindowControlContribution {
-	public TextWidget() {
-		
-	}
-	
-	/**
-	 * @param id
-	 */
-	protected TextWidget(String id) {
-		super(id);
-		// TODO Auto-generated constructor stub
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.ControlContribution#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createControl(Composite parent) {
-		Composite textHolder = new Composite(parent, SWT.NONE);
-		textHolder.setLayout(new Layout() {
-			protected Point computeSize(Composite composite, int wHint,
-					int hHint, boolean flushCache) {
-				Text tw = (Text) composite.getChildren()[0];
-				Point twSize = tw.computeSize(wHint, hHint, flushCache);
-				
-				// Forst it to be at least 100 pixels
-				if (twSize.x < 200)
-					twSize.x = 200;
-				
-				return twSize;
-			}
-
-			protected void layout(Composite composite, boolean flushCache) {
-				Text tw = (Text) composite.getChildren()[0];
-				Point twSize = tw.computeSize(SWT.DEFAULT, SWT.DEFAULT, flushCache);
-				Rectangle bb = composite.getBounds();
-				int yOffset = ((bb.height-twSize.y) / 2) + 1;
-				if (yOffset < 0) yOffset = 0;
-				
-				// Set the tw's size to the composite's width and the default height (centered)
-				tw.setBounds(0, yOffset, bb.width, twSize.y);
-			}
-		});
-		
-		Text tw = new Text(textHolder, SWT.BORDER);
-		tw.setText("Test Text Eric was here...XXXXXX");
-		
-		textHolder.setSize(181, 22);
-		return textHolder;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/TitleTestEditor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/TitleTestEditor.java
deleted file mode 100644
index 3f1aca9..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/TitleTestEditor.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.internal.layout.CellLayout;
-import org.eclipse.ui.internal.layout.Row;
-import org.eclipse.ui.part.EditorPart;
-
-/**
- * @since 3.0
- */
-public class TitleTestEditor extends EditorPart {
-
-    Composite composite;
-
-    Text title;
-
-    Text name;
-
-    Text contentDescription;
-
-    Label titleLabel;
-
-    Label nameLabel;
-
-    Label cdLabel;
-
-    /**
-     * 
-     */
-    public TitleTestEditor() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-     */
-    public void doSave(IProgressMonitor monitor) {
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-     */
-    public void doSaveAs() {
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IEditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-     */
-    public void init(IEditorSite site, IEditorInput input)
-            throws PartInitException {
-
-        if (!(input instanceof IFileEditorInput))
-            throw new PartInitException(
-                    "Invalid Input: Must be IFileEditorInput");
-        setSite(site);
-        setInput(input);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.ISaveablePart#isDirty()
-     */
-    public boolean isDirty() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-     */
-    public boolean isSaveAsAllowed() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-     */
-    public void createPartControl(Composite parent) {
-        composite = new Composite(parent, SWT.NONE);
-        CellLayout layout = new CellLayout(2).setColumn(0, Row.fixed())
-                .setColumn(1, Row.growing());
-        composite.setLayout(layout);
-
-        Label firstLabel = new Label(composite, SWT.NONE);
-        firstLabel.setText("Title");
-        title = new Text(composite, SWT.BORDER);
-        title.setText(getTitle());
-
-        title.addModifyListener(new ModifyListener() {
-            public void modifyText(ModifyEvent e) {
-                setTitle(title.getText());
-            }
-        });
-
-        Label secondLabel = new Label(composite, SWT.NONE);
-        secondLabel.setText("Name");
-        name = new Text(composite, SWT.BORDER);
-        name.setText(getPartName());
-        name.addModifyListener(new ModifyListener() {
-            public void modifyText(ModifyEvent e) {
-                setPartName(name.getText());
-            }
-        });
-
-        Label thirdLabel = new Label(composite, SWT.NONE);
-        thirdLabel.setText("Content");
-        contentDescription = new Text(composite, SWT.BORDER);
-        contentDescription.setText(getContentDescription());
-        contentDescription.addModifyListener(new ModifyListener() {
-            public void modifyText(ModifyEvent e) {
-                setContentDescription(contentDescription.getText());
-            }
-        });
-
-        Label tlLabel = new Label(composite, SWT.NONE);
-        tlLabel.setText("getTitle() = ");
-        titleLabel = new Label(composite, SWT.NONE);
-
-        Label nmLabel = new Label(composite, SWT.NONE);
-        nmLabel.setText("getPartName() = ");
-        nameLabel = new Label(composite, SWT.NONE);
-
-        Label descLabel = new Label(composite, SWT.NONE);
-        descLabel.setText("getContentDescription() = ");
-        cdLabel = new Label(composite, SWT.NONE);
-
-        updateLabels();
-
-        addPropertyListener(new IPropertyListener() {
-            /* (non-Javadoc)
-             * @see org.eclipse.ui.IPropertyListener#propertyChanged(java.lang.Object, int)
-             */
-            public void propertyChanged(Object source, int propId) {
-                updateLabels();
-            }
-        });
-    }
-
-    private void updateLabels() {
-        titleLabel.setText(getTitle());
-        nameLabel.setText(getPartName());
-        cdLabel.setText(getContentDescription());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-     */
-    public void setFocus() {
-        composite.setFocus();
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/TitleTestView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/TitleTestView.java
deleted file mode 100644
index 47cea8f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/TitleTestView.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.internal.layout.CellLayout;
-import org.eclipse.ui.internal.layout.Row;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * @since 3.0
- */
-public class TitleTestView extends ViewPart {
-
-    Composite composite;
-
-    Text title;
-
-    Text name;
-
-    Text contentDescription;
-
-    Label titleLabel;
-
-    Label nameLabel;
-
-    Label cdLabel;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-     */
-    public void createPartControl(Composite parent) {
-        composite = new Composite(parent, SWT.NONE);
-        CellLayout layout = new CellLayout(2).setColumn(0, Row.fixed())
-                .setColumn(1, Row.growing());
-        composite.setLayout(layout);
-
-        Label firstLabel = new Label(composite, SWT.NONE);
-        firstLabel.setText("Title");
-        title = new Text(composite, SWT.BORDER);
-        title.setText(getTitle());
-
-        title.addModifyListener(new ModifyListener() {
-            public void modifyText(ModifyEvent e) {
-                setTitle(title.getText());
-            }
-        });
-
-        Label secondLabel = new Label(composite, SWT.NONE);
-        secondLabel.setText("Name");
-        name = new Text(composite, SWT.BORDER);
-        name.setText(getPartName());
-        name.addModifyListener(new ModifyListener() {
-            public void modifyText(ModifyEvent e) {
-                setPartName(name.getText());
-            }
-        });
-
-        Label thirdLabel = new Label(composite, SWT.NONE);
-        thirdLabel.setText("Content");
-        contentDescription = new Text(composite, SWT.BORDER);
-        contentDescription.setText(getContentDescription());
-        contentDescription.addModifyListener(new ModifyListener() {
-            public void modifyText(ModifyEvent e) {
-                setContentDescription(contentDescription.getText());
-            }
-        });
-
-        Label tlLabel = new Label(composite, SWT.NONE);
-        tlLabel.setText("getTitle() = ");
-        titleLabel = new Label(composite, SWT.NONE);
-
-        Label nmLabel = new Label(composite, SWT.NONE);
-        nmLabel.setText("getPartName() = ");
-        nameLabel = new Label(composite, SWT.NONE);
-
-        Label descLabel = new Label(composite, SWT.NONE);
-        descLabel.setText("getContentDescription() = ");
-        cdLabel = new Label(composite, SWT.NONE);
-
-        updateLabels();
-
-        addPropertyListener(new IPropertyListener() {
-            /* (non-Javadoc)
-             * @see org.eclipse.ui.IPropertyListener#propertyChanged(java.lang.Object, int)
-             */
-            public void propertyChanged(Object source, int propId) {
-                updateLabels();
-            }
-        });
-    }
-
-    private void updateLabels() {
-        titleLabel.setText(getTitle());
-        nameLabel.setText(getPartName());
-        cdLabel.setText(getContentDescription());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-     */
-    public void setFocus() {
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ViewPartTitleTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ViewPartTitleTest.java
deleted file mode 100644
index 23eaf21..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ViewPartTitleTest.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import junit.framework.Assert;
-
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IWorkbenchPart2;
-import org.eclipse.ui.IWorkbenchPartConstants;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests bug 56822 -- NPE thrown when setTitle(null) is called.
- * 
- * @since 3.0
- */
-public class ViewPartTitleTest extends UITestCase {
-
-    /**
-     * @param testName
-     */
-    public ViewPartTitleTest(String testName) {
-        super(testName);
-    }
-
-    WorkbenchWindow window;
-
-    WorkbenchPage page;
-
-    EmptyView view;
-
-    IWorkbenchPartReference ref;
-
-    boolean titleChangeEvent = false;
-
-    boolean nameChangeEvent = false;
-
-    boolean contentChangeEvent = false;
-
-    private IPropertyListener propertyListener = new IPropertyListener() {
-        /* (non-Javadoc)
-         * @see org.eclipse.ui.IPropertyListener#propertyChanged(java.lang.Object, int)
-         */
-        public void propertyChanged(Object source, int propId) {
-            switch (propId) {
-            case IWorkbenchPartConstants.PROP_TITLE:
-                titleChangeEvent = true;
-                break;
-            case IWorkbenchPartConstants.PROP_PART_NAME:
-                nameChangeEvent = true;
-                break;
-            case IWorkbenchPartConstants.PROP_CONTENT_DESCRIPTION:
-                contentChangeEvent = true;
-                break;
-            }
-        }
-    };
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        window = (WorkbenchWindow) openTestWindow();
-        page = (WorkbenchPage) window.getActivePage();
-        String viewId = "org.eclipse.ui.tests.workbenchpart.EmptyView";
-        view = (EmptyView) page.showView(viewId);
-        ref = page.findViewReference(viewId);
-        view.addPropertyListener(propertyListener);
-        titleChangeEvent = false;
-        nameChangeEvent = false;
-        contentChangeEvent = false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.util.UITestCase#doTearDown()
-     */
-    protected void doTearDown() throws Exception {
-        view.removePropertyListener(propertyListener);
-        page.hideView(view);
-        super.doTearDown();
-    }
-
-    private void verifySettings(IWorkbenchPart2 part, String expectedTitle,
-            String expectedPartName, String expectedContentDescription)
-            throws Exception {
-        Assert.assertEquals("Incorrect view title", expectedTitle, part
-                .getTitle());
-        Assert.assertEquals("Incorrect part name", expectedPartName, part
-                .getPartName());
-        Assert.assertEquals("Incorrect content description",
-                expectedContentDescription, part.getContentDescription());
-
-        Assert.assertEquals("Incorrect title in view reference", expectedTitle,
-                ref.getTitle());
-        Assert.assertEquals("Incorrect part name in view reference",
-                expectedPartName, ref.getPartName());
-        Assert.assertEquals("Incorrect content description in view reference",
-                expectedContentDescription, ref.getContentDescription());
-    }
-
-    private void verifySettings(String expectedTitle, String expectedPartName,
-            String expectedContentDescription) throws Exception {
-        verifySettings(view, expectedTitle, expectedPartName,
-                expectedContentDescription);
-    }
-
-    /**
-     * Ensure that we've received the given property change events since the start of the test
-     * 
-     * @param titleEvent PROP_TITLE
-     * @param nameEvent PROP_PART_NAME
-     * @param descriptionEvent PROP_CONTENT_DESCRIPTION
-     */
-    private void verifyEvents(boolean titleEvent, boolean nameEvent,
-            boolean descriptionEvent) {
-        if (titleEvent) {
-            Assert.assertEquals("Missing title change event", titleEvent,
-                    titleChangeEvent);
-        }
-        if (nameEvent) {
-            Assert.assertEquals("Missing name change event", nameEvent,
-                    nameChangeEvent);
-        }
-        if (descriptionEvent) {
-            Assert.assertEquals("Missing content description event",
-                    descriptionEvent, contentChangeEvent);
-        }
-    }
-
-    public void testDefaults() throws Throwable {
-        verifySettings("EmptyView", "EmptyView", "");
-        verifyEvents(false, false, false);
-    }
-
-    /**
-     * Ensures that we can call ViewPart.setTitle(null) without throwing
-     * any exceptions
-     * 
-     * @throws Throwable
-     */
-    public void testNullTitle() throws Throwable {
-        view.setTitle(null);
-
-        verifySettings("", "EmptyView", "");
-        verifyEvents(true, false, false);
-    }
-
-    public void testCustomName() throws Throwable {
-        view.setPartName("CustomPartName");
-        verifySettings("CustomPartName", "CustomPartName", "");
-        verifyEvents(true, true, false);
-    }
-
-    public void testCustomTitle() throws Throwable {
-        view.setTitle("CustomTitle");
-        verifySettings("CustomTitle", "EmptyView", "CustomTitle");
-        verifyEvents(true, false, true);
-    }
-
-    public void testCustomContentDescription() throws Throwable {
-        view.setContentDescription("CustomContentDescription");
-        verifySettings("EmptyView (CustomContentDescription)", "EmptyView",
-                "CustomContentDescription");
-        verifyEvents(true, false, true);
-    }
-
-    public void testCustomNameAndContentDescription() throws Throwable {
-        view.setPartName("CustomName");
-        view.setContentDescription("CustomContentDescription");
-        verifySettings("CustomName (CustomContentDescription)", "CustomName",
-                "CustomContentDescription");
-        verifyEvents(true, true, true);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ViewWithCreateControlsException.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ViewWithCreateControlsException.java
deleted file mode 100644
index 7b6d677..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ViewWithCreateControlsException.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.part.ViewPart;
-
-public class ViewWithCreateControlsException extends ViewPart {
-
-    public void createPartControl(Composite parent) {
-        throw new RuntimeException("This exception was thrown intentionally as part of an error handling test");
-
-    }
-
-    public void setFocus() {
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ViewWithDisposeException.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ViewWithDisposeException.java
deleted file mode 100644
index 840b664..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ViewWithDisposeException.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.part.ViewPart;
-
-public class ViewWithDisposeException extends ViewPart {
-
-    public void createPartControl(Composite parent) {
-        parent.setLayout(new FillLayout());
-        
-        Label testLabel = new Label(parent, SWT.NONE);
-        
-        testLabel.setText("This view is supposed to throw an exception when closed");
-    }
-
-    public void setFocus() {
-
-    }
-
-    public void dispose() {
-        throw new RuntimeException("This exception was thrown intentionally as part of an error handling test");
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ViewWithInitException.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ViewWithInitException.java
deleted file mode 100644
index 6886b50..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ViewWithInitException.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.ViewPart;
-
-public class ViewWithInitException extends ViewPart {
-
-    public void init(IViewSite site) throws PartInitException {
-        throw new PartInitException("This exception was thrown intentionally as part of an error handling test");
-    }
-    
-    public void createPartControl(Composite parent) {
-        parent.setLayout(new FillLayout());
-        
-        Label message = new Label(parent, SWT.NONE);
-        message.setText("This view threw an exception on init. You should not be able to read this");
-    }
-
-    public void setFocus() {
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ViewWithInitRuntimeException.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ViewWithInitRuntimeException.java
deleted file mode 100644
index 2933274..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/api/workbenchpart/ViewWithInitRuntimeException.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.api.workbenchpart;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.ViewPart;
-
-public class ViewWithInitRuntimeException extends ViewPart {
-
-    public void init(IViewSite site) throws PartInitException {
-        throw new RuntimeException("This exception was thrown intentionally as part of an error handling test");
-    }
-    
-    public void createPartControl(Composite parent) {
-        parent.setLayout(new FillLayout());
-        
-        Label message = new Label(parent, SWT.NONE);
-        message.setText("This view threw an exception on init. You should not be able to read this");
-    }
-
-    public void setFocus() {
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/AbstractTestLogger.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/AbstractTestLogger.java
deleted file mode 100644
index 76fa5be..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/AbstractTestLogger.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.autotests;
-
-/**
- * @since 3.1
- */
-public abstract class AbstractTestLogger {
-    public abstract void reportResult(String testName, TestResult result) throws Throwable;
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/AutoTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/AutoTest.java
deleted file mode 100644
index da774f6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/AutoTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.autotests;
-
-/**
- * @since 3.1
- */
-public interface AutoTest {
-    public abstract String getName();
-    public abstract String performTest() throws Throwable;
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/AutoTestLogger.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/AutoTestLogger.java
deleted file mode 100644
index 79d5411..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/AutoTestLogger.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.autotests;
-
-import java.net.URL;
-
-import org.eclipse.ui.WorkbenchException;
-
-/**
- * @since 3.1
- */
-public class AutoTestLogger extends AbstractTestLogger {
-
-    private TestResults errors = new TestResults();
-    private TestResults expectedResults;
-    private TestResults unknownTests = new TestResults();
-    
-    public AutoTestLogger(URL expectedResultsFile) throws WorkbenchException {
-        this(new TestResults(XmlUtil.read(expectedResultsFile)));
-    }
-    
-    public AutoTestLogger(TestResults expectedResults) {
-        this.expectedResults = expectedResults;
-    }
-    
-    public AutoTestLogger() {
-        this(new TestResults());
-    }
-    
-    public void setExpectedResults(TestResults results) {
-        this.expectedResults = results;
-    }
-    
-    public TestResults getErrors() {
-        return errors;
-    }
-    
-    public TestResults getUnknownTests() {
-        return unknownTests;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.result.AutoTestResult#reportResult(java.lang.String, java.lang.String)
-     */
-    public void reportResult(String testName, TestResult result) throws Throwable {
-        TestResultFilter expectedResult = expectedResults.get(testName);
-        
-        if (expectedResult == null) {
-            // If unknown test name
-            unknownTests.put(testName, new TestResultFilter(result));
-        } else {
-            try {
-                // Check if this is the expected result
-                expectedResult.assertResult(result);
-            } catch (Throwable t) {
-                // If not, record the invalid result
-                errors.put(testName, new TestResultFilter(result));
-                throw t;
-            }
-        }
-        
-        // Test passed. Nothing to do.
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/AutoTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/AutoTestSuite.java
deleted file mode 100644
index bd9f594..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/AutoTestSuite.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.autotests;
-
-import java.net.URL;
-
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.tests.TestPlugin;
-
-/**
- * @since 3.1
- */
-public class AutoTestSuite extends TestSuite {
-    private AutoTestLogger logger;
-    
-    public AutoTestSuite(URL expectedResults) {
-        if (expectedResults == null) {
-            logger = new AutoTestLogger();
-        } else {
-            try {
-                logger = new AutoTestLogger(expectedResults);
-            } catch (WorkbenchException e) {
-                logger = new AutoTestLogger();
-                e.printStackTrace();
-            }
-        }
-    }
-    
-    protected AutoTestLogger getLog() {
-        return logger;
-    }
-    
-    public void addWrapper(AutoTest test) {
-        addTest(new AutoTestWrapper(test, logger));
-    }
-    
-    /* (non-Javadoc)
-     * @see junit.framework.TestSuite#run(junit.framework.TestResult)
-     */
-    public void run(TestResult result) {
-        super.run(result);
-
-        IPath statePath = Platform.getStateLocation(TestPlugin.getDefault().getBundle());
-        
-        String testName = this.getName();
-        if (testName == null) {
-            testName = this.getClass().getName();
-        }
-        
-        if (!logger.getErrors().isEmpty()) {
-            IPath errorsPath = statePath.append(testName).append("errors.xml");
-            
-            System.out.println("Errors detected. Results written to " + errorsPath.toString());
-
-            XMLMemento output = XMLMemento.createWriteRoot("errors");
-            logger.getErrors().saveState(output);
-            try {
-                XmlUtil.write(errorsPath.toFile(), output);
-            } catch (WorkbenchException e) {
-                e.printStackTrace();
-            }
-        }
-        
-        if (!logger.getUnknownTests().isEmpty()) {
-
-            IPath unknownPath = statePath.append(testName).append("newtests.xml");
-            
-            System.out.println("New tests detected. Results written to " + unknownPath.toString());
-
-            XMLMemento output = XMLMemento.createWriteRoot("unknown");
-            logger.getUnknownTests().saveState(output);
-            try {
-                XmlUtil.write(unknownPath.toFile(), output);
-            } catch (WorkbenchException e) {
-                e.printStackTrace();
-            }
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/AutoTestWrapper.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/AutoTestWrapper.java
deleted file mode 100644
index fce6c66..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/AutoTestWrapper.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.autotests;
-
-import junit.framework.TestCase;
-
-/**
- * @since 3.1
- */
-public class AutoTestWrapper extends TestCase {
-    private AutoTest test;
-    private AbstractTestLogger log;
-
-    public AutoTestWrapper(AutoTest test, AbstractTestLogger resultLog) {
-        super(test.getName());
-        
-        this.test = test;
-        this.log = resultLog;
-    }
-    
-    /* (non-Javadoc)
-     * @see junit.framework.TestCase#runTest()
-     */
-    protected void runTest() throws Throwable {
-        String testName = test.getName();
-        
-        TestResult result;
-        try {
-            result = new TestResult(test.performTest());
-        } catch (Throwable t) {
-            result = new TestResult(t);
-        }
-        
-        log.reportResult(testName, result);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/TestResult.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/TestResult.java
deleted file mode 100644
index 4809c95..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/TestResult.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.autotests;
-
-
-/**
- * @since 3.1
- */
-public class TestResult {
-    private String result;
-    private Throwable thrownException;
-    
-    public TestResult(String expectedResult) {
-        this.result = expectedResult;
-    }
-    
-    public TestResult(Throwable t) {
-        this.result = null;
-        this.thrownException = t;
-    }
-    
-    /**
-     * Return the expected result or null if the test threw an
-     * exception rather than terminate normally.
-     *
-     * @return the expected result or null if the test threw an
-     * exception rather than terminate normally.
-     */
-    public String getReturnValue() {
-        return result;
-    }
-    
-    public Throwable getException() {
-        return thrownException;
-    }
-    
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/TestResultFilter.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/TestResultFilter.java
deleted file mode 100644
index c3e91cf..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/TestResultFilter.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.autotests;
-
-import junit.framework.Assert;
-
-import org.eclipse.ui.IMemento;
-
-/**
- * @since 3.1
- */
-public class TestResultFilter {
-    private static final String ATT_RESULT = "result";
-    private static final String ATT_EXCEPTION = "exception";
-    private String result;
-    private String expectedException;
-    
-    public TestResultFilter(IMemento toLoad) {
-        this.result = toLoad.getString(ATT_RESULT);
-        this.expectedException = toLoad.getString(ATT_EXCEPTION);
-    }
-    
-    /**
-     * Creates a new filter that accepts the given test result
-     * 
-     * @param toAccept
-     */
-    public TestResultFilter(TestResult toAccept) {
-        if (toAccept.getException() != null) {
-            result = null;
-            expectedException = toAccept.getException().toString();
-        } else {
-            result = toAccept.getReturnValue();
-            expectedException = null;
-        }
-    }
-    
-    public void saveState(IMemento toSave) {
-        if (result != null) {
-            toSave.putString(ATT_RESULT, result);
-        }
-        
-        if (expectedException != null) {
-            toSave.putString(ATT_EXCEPTION, expectedException);
-        }
-    }
-    
-    public void assertResult(TestResult actual) throws Throwable {
-        if (result != null) {
-            if (actual.getException() != null) {
-                throw actual.getException();
-            }
-            
-            Assert.assertEquals(result, actual.getReturnValue());
-        } else {       
-            if (actual.getException() == null) {
-                Assert.assertTrue("Test should have thrown exception " + expectedException + " but returned result " 
-                    + actual.getReturnValue(), false);
-            }
-            Assert.assertEquals("Test threw wrong type of exception", actual.getException().toString(), expectedException);
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/TestResults.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/TestResults.java
deleted file mode 100644
index 66f701d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/TestResults.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.autotests;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.ui.IMemento;
-
-/**
- * @since 3.1
- */
-public class TestResults {
-    private Map results = new HashMap();
-    private final static String ATT_NAME = "name";
-    private final static String ATT_TEST = "test";
-    
-    public TestResults() {
-    }
-    
-    public TestResults(IMemento toLoad) {
-        IMemento[] tests = toLoad.getChildren(ATT_TEST);
-        
-        for (int i = 0; i < tests.length; i++) {
-            IMemento memento = tests[i];
-            
-            String name = memento.getString(ATT_NAME);
-            if (name == null) {
-                continue;
-            }
-            
-            results.put(name, new TestResultFilter(memento));
-        }
-    }
-    
-    public String[] getTestNames() {
-        Collection ids = results.keySet();
-        
-        return (String[])ids.toArray(new String[ids.size()]);
-    }
-    
-    public TestResultFilter get(String testName) {
-        return (TestResultFilter) results.get(testName);
-    }
-
-    public void put(String testName, TestResultFilter filter) {
-        results.put(testName, filter);
-    }
-    
-    public boolean isEmpty() {
-        return results.isEmpty();
-    }
-    
-    public void saveState(IMemento memento) {
-        for (Iterator iter = results.keySet().iterator(); iter.hasNext();) {
-            String testName = (String) iter.next();
-            
-            TestResultFilter next = get(testName);
-            
-            IMemento child = memento.createChild(ATT_TEST);  
-            child.putString(ATT_NAME, testName);
-            next.saveState(child);
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/UITestCaseWithResult.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/UITestCaseWithResult.java
deleted file mode 100644
index 0ef73c0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/UITestCaseWithResult.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.autotests;
-
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.1
- */
-public abstract class UITestCaseWithResult extends UITestCase implements AutoTest {
-    private AbstractTestLogger resultLog;
-    
-    public UITestCaseWithResult(String testName, AbstractTestLogger log) {
-        super(testName);
-        this.resultLog = log;
-    }
-    
-    /* (non-Javadoc)
-     * @see junit.framework.TestCase#runTest()
-     */
-    protected final void runTest() throws Throwable {
-        String testName = getName();
-        
-        TestResult result;
-        try {
-            result = new TestResult(performTest());
-        } catch (Throwable t) {
-            result = new TestResult(t);
-        }
-        
-        resultLog.reportResult(testName, result);
-    }
-    
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/XmlUtil.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/XmlUtil.java
deleted file mode 100644
index 401a44f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/autotests/XmlUtil.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.autotests;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.net.URL;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.tests.TestPlugin;
-
-/**
- * @since 3.1
- */
-public class XmlUtil {
-    public static IMemento read(InputStream toRead) throws WorkbenchException {
-        InputStreamReader reader = new InputStreamReader(toRead);
-
-        return XMLMemento.createReadRoot(reader);
-    }
-    
-    public static IMemento read(URL toRead) throws WorkbenchException {
-        try {
-            return read(toRead.openStream());
-        } catch (IOException e) {
-            throw new WorkbenchException(new Status(IStatus.ERROR, 
-                    TestPlugin.getDefault().getBundle().getSymbolicName(),
-                    IStatus.OK, null, e));
-        }
-    }
-    
-    public static IMemento read(File toRead) throws WorkbenchException {
-        FileInputStream input;
-        try {
-            input = new FileInputStream(toRead);
-            return read(input);
-        } catch (FileNotFoundException e) {
-            throw new WorkbenchException(new Status(IStatus.ERROR, 
-                    TestPlugin.getDefault().getBundle().getSymbolicName(),
-                    IStatus.OK, null, e));
-        }
-    }
-    
-    public static void write(File file, XMLMemento data) throws WorkbenchException {
-
-        FileOutputStream output;
-        try {
-            file.getParentFile().mkdirs();
-            file.delete();
-            file.createNewFile();
-
-            output = new FileOutputStream(file);
-            OutputStreamWriter writer = new OutputStreamWriter(output);
-            data.save(writer);
-            output.close();
-        } catch (FileNotFoundException e) {
-            throw new WorkbenchException(new Status(IStatus.ERROR, 
-                    TestPlugin.getDefault().getBundle().getSymbolicName(),
-                    IStatus.OK, e.toString(), e));
-        } catch (IOException e) {
-            throw new WorkbenchException(new Status(IStatus.ERROR, 
-                    TestPlugin.getDefault().getBundle().getSymbolicName(),
-                    IStatus.OK, e.toString(), e));
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/ActionDelegateProxyTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/ActionDelegateProxyTest.java
deleted file mode 100644
index 0c1e205..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/ActionDelegateProxyTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.commands;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.tests.api.workbenchpart.MenuContributionHarness;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.3
- *
- */
-public class ActionDelegateProxyTest extends UITestCase {
-	/**
-	 * 
-	 */
-	private static final String INC_COMMAND = "org.eclipse.ui.tests.incMenuHarness";
-	private static final String VIEW_ID = "org.eclipse.ui.tests.api.MenuTestHarness";
-
-	/**
-	 * @param testName
-	 */
-	public ActionDelegateProxyTest(String testName) {
-		super(testName);
-	}
-
-	public void testViewDelegate() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		IWorkbenchPage page = window.getActivePage();
-		assertNull(page.findView(VIEW_ID));
-		IViewPart view = page.showView(VIEW_ID);
-		assertNotNull(view);
-		assertTrue(view instanceof MenuContributionHarness);
-		MenuContributionHarness mch = (MenuContributionHarness) view;
-		assertEquals(0, mch.getCount());
-		IHandlerService service = (IHandlerService) window.getService(IHandlerService.class);
-		service.executeCommand(INC_COMMAND, null);
-		assertEquals(1, mch.getCount());
-		service.executeCommand(INC_COMMAND, null);
-		assertEquals(2, mch.getCount());
-		
-		page.hideView(view);
-		IViewPart view2 = page.showView(VIEW_ID);
-		assertFalse(view==view2);
-		view = view2;
-		assertNotNull(view);
-		assertTrue(view instanceof MenuContributionHarness);
-		mch = (MenuContributionHarness) view;
-		assertEquals(0, mch.getCount());
-		service.executeCommand(INC_COMMAND, null);
-		assertEquals(1, mch.getCount());
-		service.executeCommand(INC_COMMAND, null);
-		assertEquals(2, mch.getCount());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/ActiveActionSetExpression.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/ActiveActionSetExpression.java
deleted file mode 100644
index 97a50fa..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/ActiveActionSetExpression.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.commands;
-
-import java.util.Collection;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionInfo;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.ui.ISources;
-
-public class ActiveActionSetExpression extends Expression {
-	private String actionSetId;
-
-	private String[] expressionInfo;
-
-	public ActiveActionSetExpression(String id) {
-		this(id, new String[] { ISources.ACTIVE_ACTION_SETS_NAME });
-	}
-
-	public ActiveActionSetExpression(String id, String[] info) {
-		actionSetId = id;
-		expressionInfo = info;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.expressions.Expression#collectExpressionInfo(org.eclipse.core.expressions.ExpressionInfo)
-	 */
-	public void collectExpressionInfo(ExpressionInfo info) {
-		for (int i = 0; i < expressionInfo.length; i++) {
-			info.addVariableNameAccess(expressionInfo[i]);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.expressions.Expression#evaluate(org.eclipse.core.expressions.IEvaluationContext)
-	 */
-	public EvaluationResult evaluate(IEvaluationContext context) {
-		final Object variable = context
-				.getVariable(ISources.ACTIVE_ACTION_SETS_NAME);
-		if (variable != null) {
-			if (((Collection) variable).contains(actionSetId)) {
-				return EvaluationResult.TRUE;
-			}
-		}
-		return EvaluationResult.FALSE;
-	}
-
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/ActiveContextExpression.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/ActiveContextExpression.java
deleted file mode 100644
index bdcd4ca..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/ActiveContextExpression.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.commands;
-
-import java.util.Collection;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionInfo;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.ui.ISources;
-import org.eclipse.ui.internal.expressions.ActivePartExpression;
-
-public class ActiveContextExpression extends Expression {
-	/**
-	 * The seed for the hash code for all schemes.
-	 */
-	private static final int HASH_INITIAL = ActivePartExpression.class
-			.getName().hashCode();
-
-	private String contextId;
-
-	private String[] expressionInfo;
-
-	public ActiveContextExpression(String id, String[] info) {
-		contextId = id;
-		expressionInfo = info;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.expressions.Expression#collectExpressionInfo(org.eclipse.core.expressions.ExpressionInfo)
-	 */
-	public void collectExpressionInfo(ExpressionInfo info) {
-		for (int i = 0; i < expressionInfo.length; i++) {
-			info.addVariableNameAccess(expressionInfo[i]);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.expressions.Expression#evaluate(org.eclipse.core.expressions.IEvaluationContext)
-	 */
-	public EvaluationResult evaluate(IEvaluationContext context) {
-		final Object variable = context
-				.getVariable(ISources.ACTIVE_CONTEXT_NAME);
-		if (variable != null) {
-			if (((Collection) variable).contains(contextId)) {
-				return EvaluationResult.TRUE;
-			}
-		}
-		return EvaluationResult.FALSE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object o) {
-		if (o instanceof ActiveContextExpression) {
-			ActiveContextExpression ace = (ActiveContextExpression) o;
-			return equals(contextId, ace.contextId);
-		}
-		return false;
-	}
-
-	protected final int computeHashCode() {
-		return HASH_INITIAL * HASH_FACTOR + hashCode(contextId);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug125792Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug125792Test.java
deleted file mode 100644
index 1497a94..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug125792Test.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.commands;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.CommandException;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests a bug found in
- * {@link ParameterizedCommand#generateCombinations(Command)} and its private
- * helper method <code>expandParameters</code>. The bug is causing a
- * <code>StackOverflowError</code> when dealing with commands that have
- * several optional parameters for which there are no
- * <code>IParameterValues</code>.
- * 
- * @since 3.2
- */
-public class Bug125792Test extends UITestCase {
-
-	public Bug125792Test(final String name) {
-		super(name);
-	}
-
-	private static final String COMMAND_ID = "org.eclipse.ui.tests.commands.bug125792";
-
-	public void testParameterizedCommand_generateCombinations()
-			throws CommandException {
-		Command command = getCommandService().getCommand(COMMAND_ID);
-		ParameterizedCommand.generateCombinations(command);
-	}
-
-	private ICommandService getCommandService() {
-		Object serviceObject = getWorkbench().getAdapter(ICommandService.class);
-		if (serviceObject != null) {
-			ICommandService service = (ICommandService) serviceObject;
-			return service;
-		}
-		return null;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug66182Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug66182Test.java
deleted file mode 100644
index e82bd84..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug66182Test.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.commands;
-
-import java.util.Map;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.commands.AbstractHandler;
-import org.eclipse.ui.commands.ExecutionException;
-import org.eclipse.ui.commands.HandlerSubmission;
-import org.eclipse.ui.commands.ICommand;
-import org.eclipse.ui.commands.IHandler;
-import org.eclipse.ui.commands.IWorkbenchCommandSupport;
-import org.eclipse.ui.commands.NotHandledException;
-import org.eclipse.ui.commands.Priority;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests that dialogs will inherit the handlers from the workbench window, if
- * none is defined for the dialog itself. It tests all of the various
- * combinations of this situation.
- * 
- * @since 3.0
- */
-public final class Bug66182Test extends UITestCase {
-
-	/**
-	 * Constructor for Bug66182Test.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public Bug66182Test(final String name) {
-		super(name);
-	}
-
-	/**
-	 * Tests that the dialog handlers will take priority. The set-up is a
-	 * workbench window with a handler registered for the command to test. Then
-	 * there is a dialog opened with a handler for the same command. The test is
-	 * to see that the dialog's handler gets priority.
-	 * 
-	 * @throws ExecutionException
-	 *             This should never happen, and indicates a problem with the
-	 *             test.
-	 * @throws NotHandledException
-	 *             Indicates that no handler was found where one should have
-	 *             been found.
-	 */
-	public final void testDialogHandlers() throws ExecutionException,
-			NotHandledException {
-		// Open a test window.
-//		final IWorkbenchWindow window = openTestWindow();
-//
-//		// Define a handler for some random command identifier.
-//		final Object windowResult = new Object();
-//		final IHandler windowHandler = new AbstractHandler() {
-//
-//			public Object execute(Map parameterValuesByName)
-//					throws ExecutionException {
-//				// Do nothing.
-//				return windowResult;
-//			}
-//		};
-//		final IWorkbenchCommandSupport commandSupport = fWorkbench
-//				.getCommandSupport();
-//		final String commandId = "org.eclipse.ui.tests.Bug66182";
-//		final Shell windowShell = window.getShell();
-//		final HandlerSubmission windowSubmission = new HandlerSubmission(null,
-//				windowShell, null, commandId, windowHandler, Priority.MEDIUM);
-//		commandSupport.addHandlerSubmission(windowSubmission);
-//
-//		// Open a dialog.
-//		final Shell dialogShell = new Shell(windowShell);
-//		dialogShell.pack();
-//		dialogShell.open();
-//		final Display display = dialogShell.getDisplay();
-//		while (display.readAndDispatch())
-//			;
-//
-//		/*
-//		 * Define a handler for the same command identifier, but for this
-//		 * dialog.
-//		 */
-//		final Object dialogResult = new Object();
-//		final IHandler dialogHandler = new AbstractHandler() {
-//
-//			public Object execute(Map parameterValuesByName)
-//					throws ExecutionException {
-//				// Do nothing.
-//				return dialogResult;
-//			}
-//		};
-//		final HandlerSubmission dialogSubmission = new HandlerSubmission(null,
-//				dialogShell, null, commandId, dialogHandler, Priority.MEDIUM);
-//		commandSupport.addHandlerSubmission(dialogSubmission);
-//
-//		// Check to see which handler is the right handler.
-//		final ICommand command = commandSupport.getCommandManager().getCommand(
-//				commandId);
-//		assertSame(
-//				"The active shell must be the dialog.  If you are activating other shells while this test is running, then this test will fail",
-//				dialogShell, display.getActiveShell());
-//		assertSame(
-//				"The active workbench window must be the window created in this test.  If you are activating other workbench windows, then this test will fail",
-//				windowShell, fWorkbench.getActiveWorkbenchWindow().getShell());
-//		final Object result = command.execute(Collections.EMPTY_MAP);
-//		assertSame(
-//				"The dialog handler was not chosen when both a window and dialog handler were defined.",
-//				dialogResult, result);
-//
-//		// Close the dialog and let the event loop spin.
-//		commandSupport.removeHandlerSubmission(windowSubmission);
-//		commandSupport.removeHandlerSubmission(dialogSubmission);
-//		dialogShell.close();
-//		while (display.readAndDispatch())
-//			;
-	}
-
-	/**
-	 * Tests that, in the absence of a dialog handler, that the window handler
-	 * will be given a chance to take over. The set-up is a workbench window
-	 * with a handler registered for the command to test. Then there is a dialog
-	 * opened, but with no handler. The test is to see that the window's handler
-	 * is active.
-	 * 
-	 * @throws ExecutionException
-	 *             This should never happen, and indicates a problem with the
-	 *             test.
-	 * @throws NotHandledException
-	 *             Indicates that no handler was found where one should have
-	 *             been found.
-	 */
-	public final void testFallbackToWindow() throws ExecutionException,
-			NotHandledException {
-		// Open a test window.
-//		final IWorkbenchWindow window = openTestWindow();
-//
-//		// Define a handler for some random command identifier.
-//		final Object windowResult = new Object();
-//		final IHandler windowHandler = new AbstractHandler() {
-//
-//			public Object execute(Map parameterValuesByName)
-//					throws ExecutionException {
-//				// Do nothing.
-//				return windowResult;
-//			}
-//		};
-//		final IWorkbenchCommandSupport commandSupport = fWorkbench
-//				.getCommandSupport();
-//		final String commandId = "org.eclipse.ui.tests.Bug66182";
-//		final Shell windowShell = window.getShell();
-//		final HandlerSubmission windowSubmission = new HandlerSubmission(null,
-//				windowShell, null, commandId, windowHandler, Priority.MEDIUM);
-//		commandSupport.addHandlerSubmission(windowSubmission);
-//
-//		// Open a dialog.
-//		final Shell dialogShell = new Shell(windowShell);
-//		final IWorkbenchContextSupport contextSupport = fWorkbench
-//				.getContextSupport();
-//		contextSupport.registerShell(dialogShell,
-//				IWorkbenchContextSupport.TYPE_WINDOW);
-//		dialogShell.pack();
-//		dialogShell.open();
-//		final Display display = dialogShell.getDisplay();
-//		while (display.readAndDispatch())
-//			;
-//
-//		// Check to see which handler is the right handler.
-//		final ICommand command = commandSupport.getCommandManager().getCommand(
-//				commandId);
-//		assertSame(
-//				"The active shell must be the dialog.  If you are activating other shells while this test is running, then this test will fail",
-//				dialogShell, display.getActiveShell());
-//		assertSame(
-//				"The active workbench window must be the window created in this test.  If you are activating other workbench windows, then this test will fail",
-//				windowShell, fWorkbench.getActiveWorkbenchWindow().getShell());
-//		final Object result = command.execute(new HashMap());
-//		assertSame(
-//				"The window handler was not chosen when both a dialog was open with no handler, but the active workbench window did have a handler.",
-//				windowResult, result);
-//
-//		// Close the dialog and let the event loop spin.
-//		commandSupport.removeHandlerSubmission(windowSubmission);
-//		contextSupport.unregisterShell(dialogShell);
-//		dialogShell.close();
-//		while (display.readAndDispatch())
-//			;
-	}
-
-	/**
-	 * Tests that if a dialog is open, that the application will not fall back
-	 * to the dialog. The set-up is a workbench window with a handler registered
-	 * for the command to test. Then there is a dialog opened, but with no
-	 * handler. The test is to see that no handler is active.
-	 * 
-	 * @throws ExecutionException
-	 *             This should never happen, and indicates a problem with the
-	 *             test.
-	 * @throws NotHandledException
-	 *             Indicates that no handler was found where one should have
-	 *             been found.
-	 */
-	public final void testFallbackToWindowBlockedByDialog()
-			throws ExecutionException, NotHandledException {
-		// Open a test window.
-		final IWorkbenchWindow window = openTestWindow();
-
-		// Define a handler for some random command identifier.
-		final Object windowResult = new Object();
-		final IHandler windowHandler = new AbstractHandler() {
-
-			public Object execute(Map parameterValuesByName)
-					throws ExecutionException {
-				// Do nothing.
-				return windowResult;
-			}
-		};
-		final IWorkbenchCommandSupport commandSupport = fWorkbench
-				.getCommandSupport();
-		final String commandId = "org.eclipse.ui.tests.Bug66182";
-		final Shell windowShell = window.getShell();
-		final HandlerSubmission windowSubmission = new HandlerSubmission(null,
-				windowShell, null, commandId, windowHandler, Priority.MEDIUM);
-		commandSupport.addHandlerSubmission(windowSubmission);
-
-		// Open a dialog.
-		final Shell dialogShell = new Shell(windowShell);
-		dialogShell.pack();
-		dialogShell.open();
-		final Display display = dialogShell.getDisplay();
-		while (display.readAndDispatch())
-			;
-
-		// Check to see which handler is the right handler.
-		final ICommand command = commandSupport.getCommandManager().getCommand(
-				commandId);
-		assertSame(
-				"The active shell must be the dialog.  If you are activating other shells while this test is running, then this test will fail",
-				dialogShell, display.getActiveShell());
-		assertSame(
-				"The active workbench window must be the window created in this test.  If you are activating other workbench windows, then this test will fail",
-				windowShell, fWorkbench.getActiveWorkbenchWindow().getShell());
-		assertTrue(
-				"When a dialog is open, it should not fall back to the active workbench window.",
-				!command.isHandled());
-
-		// Close the dialog and let the event loop spin.
-		commandSupport.removeHandlerSubmission(windowSubmission);
-		dialogShell.close();
-		while (display.readAndDispatch())
-			;
-	}
-
-	/**
-	 * Tests that if the workbench window is the active shell, that its handlers
-	 * will take priority. The scenario has two handlers defined: one for the
-	 * workbench window, and one for a dialog that is not open. The workbench
-	 * window handler should be the active handler.
-	 * 
-	 * @throws ExecutionException
-	 *             This should never happen, and indicates a problem with the
-	 *             test.
-	 * @throws NotHandledException
-	 *             Indicates that no handler was found where one should have
-	 *             been found.
-	 */
-	public final void testWindow() throws ExecutionException,
-			NotHandledException {
-		// Open a test window.
-//		final IWorkbenchWindow window = openTestWindow();
-//
-//		// Define a handler for some random command identifier.
-//		final Object windowResult = new Object();
-//		final IHandler windowHandler = new AbstractHandler() {
-//
-//			public Object execute(Map parameterValuesByName)
-//					throws ExecutionException {
-//				// Do nothing.
-//				return windowResult;
-//			}
-//		};
-//		final IWorkbenchCommandSupport commandSupport = fWorkbench
-//				.getCommandSupport();
-//		final String commandId = "org.eclipse.ui.tests.Bug66182";
-//		final Shell windowShell = window.getShell();
-//		final HandlerSubmission windowSubmission = new HandlerSubmission(null,
-//				windowShell, null, commandId, windowHandler, Priority.MEDIUM);
-//		commandSupport.addHandlerSubmission(windowSubmission);
-//
-//		// Create a dialog.
-//		final Shell dialogShell = new Shell(windowShell);
-//
-//		/*
-//		 * Define a handler for the same command identifier, but for this
-//		 * dialog.
-//		 */
-//		final Object dialogResult = new Object();
-//		final IHandler dialogHandler = new AbstractHandler() {
-//
-//			public Object execute(Map parameterValuesByName)
-//					throws ExecutionException {
-//				// Do nothing.
-//				return dialogResult;
-//			}
-//		};
-//		final HandlerSubmission dialogSubmission = new HandlerSubmission(null,
-//				dialogShell, null, commandId, dialogHandler, Priority.MEDIUM);
-//		commandSupport.addHandlerSubmission(dialogSubmission);
-//
-//		// Check to see which handler is the right handler.
-//		final ICommand command = commandSupport.getCommandManager().getCommand(
-//				commandId);
-//		assertSame(
-//				"The active shell must be the dialog.  If you are activating other shells while this test is running, then this test will fail",
-//				windowShell, fWorkbench.getDisplay().getActiveShell());
-//		assertSame(
-//				"The active workbench window must be the window created in this test.  If you are activating other workbench windows, then this test will fail",
-//				windowShell, fWorkbench.getActiveWorkbenchWindow().getShell());
-//		final Object result = command.execute(new HashMap());
-//		assertSame(
-//				"The window handler was not chosen when both a dialog was open with no handler, but the active workbench window did have a handler.",
-//				windowResult, result);
-//
-//		// Close the dialog and let the event loop spin.
-//		commandSupport.removeHandlerSubmission(windowSubmission);
-//		dialogShell.dispose();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug70503Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug70503Test.java
deleted file mode 100644
index 3a397f9..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug70503Test.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.commands;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ui.actions.RetargetAction;
-import org.eclipse.ui.commands.ActionHandler;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * This test whether an ActionHandler will update its internal cache of
- * properties when a RetargetAction changes only its handler.
- * 
- * @since 3.0.1
- */
-public class Bug70503Test extends UITestCase {
-
-	private class PubliclyRetargettableAction extends RetargetAction {
-		/**
-		 * Constructs a new instance of <code>PubliclyRetargettableAction</code>.
-		 * 
-		 * @param actionID
-		 *            The action identifier to pass to the
-		 *            <code>RetargetAction</code>; should not be
-		 *            <code>null</code>.
-		 * @param text
-		 *            The text to be displayed on the action; may be
-		 *            <code>null</code> if there should be no text.
-		 */
-		public PubliclyRetargettableAction(String actionID, String text) {
-			super(actionID, text);
-		}
-
-		/**
-		 * A public version of the <code>setActionHandler</code> method.
-		 * 
-		 * @param handler
-		 *            The new action handler; may be <code>null</code> if
-		 *            there is no handler currently.
-		 */
-		private final void changeHandler(final IAction handler) {
-			super.setActionHandler(handler);
-		}
-	}
-
-	/**
-	 * Constructor for Bug70503Test.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public Bug70503Test(String name) {
-		super(name);
-	}
-
-	/**
-	 * Tests whether changing only the handler will update an action handler.
-	 * The set up is a <code>RetargetAction</code> wrapped in an
-	 * <code>ActionHandler</code>. The test verifies a switch back and forth
-	 * to make sure that the updates are happening.
-	 *  
-	 */
-	public final void testHandlerChangeCausesUpdate() {
-		final PubliclyRetargettableAction retargetAction = new PubliclyRetargettableAction(
-				"actionID", "text");
-		final ActionHandler actionHandler = new ActionHandler(retargetAction);
-		assertFalse("The retarget action handler should start 'unhandled'",
-				((Boolean) actionHandler.getAttributeValuesByName().get(
-						"handled")).booleanValue());
-		retargetAction.changeHandler(new PubliclyRetargettableAction(
-				"actionID", "text"));
-		assertTrue(
-				"The retarget action handler should recognize the new handler.",
-				((Boolean) actionHandler.getAttributeValuesByName().get(
-						"handled")).booleanValue());
-		retargetAction.changeHandler(null);
-		assertFalse(
-				"The retarget action handler should recognize that the handler is now gone.",
-				((Boolean) actionHandler.getAttributeValuesByName().get(
-						"handled")).booleanValue());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug73756Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug73756Test.java
deleted file mode 100644
index 296ed93..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug73756Test.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.commands;
-
-import java.text.MessageFormat;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.action.ExternalActionManager;
-import org.eclipse.jface.util.Util;
-import org.eclipse.ui.statushandlers.StatusAdapter;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.tests.statushandlers.TestStatusHandler;
-
-/**
- * A tests whether is active will log an exception if the command is not
- * defined.
- * 
- * @since 3.1
- */
-public final class Bug73756Test extends UITestCase {
-
-	private static String CMD_ID = "a command that is not defined";
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(ExternalActionManager.class.getName());
-
-	private static int SEVERITY = IStatus.ERROR;
-
-	private static String MESSAGE = MessageFormat.format(Util.translateString(
-			RESOURCE_BUNDLE, "undefinedCommand.WarningMessage", null), //$NON-NLS-1$
-			new String[] { CMD_ID });
-
-	private static String PLUGIN_ID = "org.eclipse.jface";
-
-	/**
-	 * Constructs a new instance of <code>Bug73756Test</code>.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public Bug73756Test(final String name) {
-		super(name);
-	}
-
-	/**
-	 * Tests that calling <code>isActive()</code> on an undefined command
-	 * causes a log message to be written. This simple calls
-	 * <code>isActive()</code> for a bogus command identifier. A log listener
-	 * flips a boolean flag if a log message is written.
-	 */
-	public final void testUndefinedCommandIsActiveLogged() {
-		// Check if a bogus command is active.
-		ExternalActionManager.getInstance().getCallback().isActive(CMD_ID);
-
-		// Check if a correct status is logged
-		assertEquals(TestStatusHandler.getLastHandledStyle(), StatusManager.LOG);
-		assertStatusAdapter(TestStatusHandler.getLastHandledStatusAdapter());
-	}
-
-	/**
-	 * Checks whether the last handled status is correct
-	 */
-	private void assertStatusAdapter(StatusAdapter statusAdapter) {
-		assertNotNull("A warning should have been logged.", statusAdapter);
-		IStatus status = statusAdapter.getStatus();
-		assertEquals(status.getSeverity(), SEVERITY);
-		assertEquals(status.getPlugin(), PLUGIN_ID);
-		assertEquals(status.getMessage(), MESSAGE);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug74982Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug74982Test.java
deleted file mode 100644
index 376db71..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug74982Test.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.commands;
-
-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.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.commands.ExecutionException;
-import org.eclipse.ui.commands.ICommand;
-import org.eclipse.ui.commands.IWorkbenchCommandSupport;
-import org.eclipse.ui.commands.NotHandledException;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * A test for whether the select all handler will send a selection event.
- * 
- * @since 3.1
- */
-public final class Bug74982Test extends UITestCase {
-
-    /**
-     * Whether the selection event has been fired.
-     */
-    private boolean selectionEventFired = false;
-
-    /**
-     * Constructs a new instance of <code>Bug74982Test</code>.
-     * 
-     * @param name
-     *            The name of the test
-     */
-    public Bug74982Test(final String name) {
-        super(name);
-    }
-
-    /**
-     * Tests that the <code>SelectAllHandler</code> triggers a selection
-     * event. Creates a dialog with a text widget, gives the text widget focus,
-     * and then calls the select all command. This should then call the
-     * <code>SelectAllHandler</code> and trigger a selection event.
-     * 
-     * @throws ExecutionException
-     *             If the <code>SelectAllHandler</code> is broken in some way.
-     * @throws NotHandledException
-     *             If the dialog does not have focus, or if the
-     *             <code>WorkbenchCommandSupport</code> class is broken in
-     *             some way.
-     */
-    public final void testSelectAllHandlerSendsSelectionEvent()
-            throws ExecutionException, NotHandledException {
-        // Create a dialog with a text widget.
-        final Shell dialog = new Shell(fWorkbench.getActiveWorkbenchWindow()
-                .getShell());
-        dialog.setLayout(new GridLayout());
-        final Text text = new Text(dialog, SWT.SINGLE);
-        text.setText("Mooooooooooooooooooooooooooooo");
-        text.setLayoutData(new GridData());
-        text.addSelectionListener(new SelectionAdapter() {
-            public void widgetSelected(SelectionEvent e) {
-                selectionEventFired = true;
-            }
-        });
-
-        // Open the dialog and give the text widget focus.
-        dialog.pack();
-        dialog.open();
-        text.setFocus();
-
-        // Spin the event loop to make sure focus is set-up properly.
-        final Display display = fWorkbench.getDisplay();
-        while (display.readAndDispatch()) {
-        	// Do nothing
-        }
-
-        // Get the select all command and execute it.
-        final IWorkbenchCommandSupport commandSupport = fWorkbench
-                .getCommandSupport();
-        final ICommand selectAllCommand = commandSupport.getCommandManager()
-                .getCommand("org.eclipse.ui.edit.selectAll");
-        selectAllCommand.execute(null);
-
-        // Check to see if the selection event has been fired.
-        assertTrue(
-                "The selection event was not fired when the SelectAllHandler was used.",
-                selectionEventFired);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug74990Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug74990Test.java
deleted file mode 100644
index 45c0579..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug74990Test.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.commands;
-
-import java.util.Map;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.commands.AbstractHandler;
-import org.eclipse.ui.commands.ExecutionException;
-import org.eclipse.ui.commands.HandlerSubmission;
-import org.eclipse.ui.commands.ICommand;
-import org.eclipse.ui.commands.IHandler;
-import org.eclipse.ui.commands.IWorkbenchCommandSupport;
-import org.eclipse.ui.commands.Priority;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * A test for whether part identifiers work properly for HandlerSubmissions.
- * 
- * @since 3.1
- */
-public final class Bug74990Test extends UITestCase {
-
-	/**
-	 * Constructs a new instance of <code>Bug74990Test</code>.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public Bug74990Test(final String name) {
-		super(name);
-	}
-
-	/**
-	 * Tests whether a part-specific handler -- submitted via Java code -- is
-	 * matched properly. This is only using the part id. The test verifies that
-	 * it is active when the part is active, and not active when the part is not
-	 * active.
-	 * 
-	 * @throws PartInitException
-	 *             If something goes wrong creating the part to which this
-	 *             handler is tied.
-	 * 
-	 */
-	public final void testPartIdSubmission() throws PartInitException {
-		// Define a command.
-		final String testCommandId = "org.eclipse.ui.tests.commands.Bug74990";
-		final IWorkbenchCommandSupport commandSupport = fWorkbench
-				.getCommandSupport();
-		final ICommand testCommand = commandSupport.getCommandManager()
-				.getCommand(testCommandId);
-
-		// Create a handler submission.
-		final IHandler handler = new AbstractHandler() {
-			public final Object execute(final Map parameterValuesByName)
-					throws ExecutionException {
-				// Do nothing.
-				return null;
-			}
-		};
-		final HandlerSubmission testSubmission = new HandlerSubmission(
-				"org.eclipse.ui.tests.api.MockViewPart", null, null,
-				testCommandId, handler, Priority.MEDIUM);
-		commandSupport.addHandlerSubmission(testSubmission);
-
-		try {
-			// Test to make sure the command is not currently handled.
-			assertTrue("The MockViewPart command should not be handled",
-					!testCommand.isHandled());
-
-			/*
-			 * Open a window with the MockViewPart, and make sure it is now
-			 * handled.
-			 */
-			final IWorkbenchPage page = openTestWindow().getActivePage();
-			final IViewPart openedView = page
-					.showView("org.eclipse.ui.tests.api.MockViewPart");
-			page.activate(openedView);
-			while (fWorkbench.getDisplay().readAndDispatch()) {
-				// Read the event queue
-			}
-			assertTrue("The MockViewPart command should be handled",
-					testCommand.isHandled());
-
-			// Hide the view, and test that is becomes unhandled again.
-			page.hideView(openedView);
-			while (fWorkbench.getDisplay().readAndDispatch()) {
-				// Read the event queue
-			}
-			assertTrue("The MockViewPart command should not be handled",
-					!testCommand.isHandled());
-
-		} finally {
-			commandSupport.removeHandlerSubmission(testSubmission);
-		}
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug87856Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug87856Test.java
deleted file mode 100644
index 8462a5f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/Bug87856Test.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.commands;
-
-import java.lang.ref.WeakReference;
-import java.util.Map;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.ui.commands.AbstractHandler;
-import org.eclipse.ui.commands.HandlerSubmission;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.commands.IHandler;
-import org.eclipse.ui.commands.IWorkbenchCommandSupport;
-import org.eclipse.ui.commands.Priority;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * This tests whether we are leaking handlers after their submission has been
- * removed.
- * 
- * @since 3.1
- */
-public class Bug87856Test extends UITestCase {
-
-	/**
-	 * Constructs a new instance of <code>Bug87856Test</code>.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public Bug87856Test(final String name) {
-		super(name);
-	}
-
-	/**
-	 * Tests whether the workbench command support (or its dependencies) will
-	 * leak handlers when the process loop is run. Basically, we're checking to
-	 * see that removing a handler submission really works.
-	 */
-	public final void testHandlerLeak() {
-		final IWorkbenchCommandSupport commandSupport = fWorkbench
-				.getCommandSupport();
-		final ICommandService commandService = (ICommandService) fWorkbench
-				.getAdapter(ICommandService.class);
-		final String commandId = Bug87856Test.class.getName();
-		final Command command = commandService.getCommand(commandId);
-
-		// Submit a handler.
-		IHandler handler = new AbstractHandler() {
-
-			public Object execute(Map parameterValuesByName)
-					throws org.eclipse.ui.commands.ExecutionException {
-				// Do nothing
-				return null;
-			}
-
-		};
-		HandlerSubmission submission = new HandlerSubmission(null, null, null,
-				command.getId(), handler, Priority.MEDIUM);
-		commandSupport.addHandlerSubmission(submission);
-
-		/*
-		 * Remove the handler with no replacement, and hold on to the handler
-		 * via a weak reference.
-		 */
-		commandSupport.removeHandlerSubmission(submission);
-		submission = null;
-		final WeakReference reference = new WeakReference(handler);
-		handler = null;
-
-		// Attempt to force garbage collection.
-		System.gc();
-		System.runFinalization();
-		Thread.yield();
-		System.gc();
-		System.runFinalization();
-		Thread.yield();
-		System.gc();
-		System.runFinalization();
-		Thread.yield();
-
-		// Check to see if the reference has been cleared.
-		assertTrue(
-				"We should not hold on to a handler after the submission has been removed.",
-				reference.isEnqueued() || (reference.get() == null));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandActionTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandActionTest.java
deleted file mode 100644
index 127d5af..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandActionTest.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.commands;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.handlers.IHandlerActivation;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.internal.actions.CommandAction;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.3
- * 
- */
-public class CommandActionTest extends UITestCase {
-	// you can find these commands in org.eclipse.ui.tests/plugin.xml
-	private static final String PREFIX = "tests.commands.CCT.";
-	private static final String CMD1_ID = PREFIX + "cmd1";
-	private static final String CMD2_ID = PREFIX + "cmd2";
-
-	private IHandlerService handlerService;
-	private VerifyHandler cmd1Handler;
-	private IHandlerActivation cmd1Activation;
-	private VerifyHandler2 cmd2Handler;
-	private IHandlerActivation cmd2Activation;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doSetUp()
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		handlerService = (IHandlerService) fWorkbench
-				.getService(IHandlerService.class);
-
-		cmd1Handler = new VerifyHandler();
-		cmd1Activation = handlerService.activateHandler(CMD1_ID, cmd1Handler);
-		cmd2Handler = new VerifyHandler2();
-		cmd2Activation = handlerService.activateHandler(CMD2_ID, cmd2Handler);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doTearDown()
-	 */
-	protected void doTearDown() throws Exception {
-		if (cmd1Activation != null) {
-			handlerService.deactivateHandler(cmd1Activation);
-			cmd1Activation = null;
-		}
-		if (cmd2Activation != null) {
-			handlerService.deactivateHandler(cmd2Activation);
-			cmd2Activation = null;
-		}
-		super.doTearDown();
-	}
-
-	private static class VerifyHandler2 extends AbstractHandler {
-		public int count = 0;
-		public String paramValue1 = null;
-		public String paramValue2 = null;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-		 */
-
-		public Object execute(ExecutionEvent event) throws ExecutionException {
-
-			paramValue1 = event.getParameter("protocol");
-			paramValue2 = event.getParameter("host");
-			count++;
-			return null;
-		}
-	}
-
-	private static class VerifyHandler extends AbstractHandler {
-		public int count = 0;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-		 */
-		public Object execute(ExecutionEvent event) throws ExecutionException {
-
-			count++;
-			return null;
-		}
-	}
-
-	/**
-	 * @param testName
-	 */
-	public CommandActionTest(String testName) {
-		super(testName);
-	}
-
-	public void testCommandId() throws Exception {
-
-		// create a command action for CMD1_ID, which takes no parameters.
-		CommandAction action1 = new CommandAction(PlatformUI
-				.getWorkbench(), CMD1_ID);
-		assertEquals(0, cmd1Handler.count);
-		action1.run();
-		assertEquals(1, cmd1Handler.count);
-	}
-
-	public void testParameterizedCommand() throws Exception {
-
-		// create a command action for CMD2_id which takes parameters.
-		// make sure the handler gets called with the correct parameters.
-		assertEquals(0, cmd2Handler.count);
-		assertNull(cmd2Handler.paramValue1);
-		assertNull(cmd2Handler.paramValue2);
-
-		Map map = new HashMap();
-		map.put("protocol", "true"); //$NON-NLS-1$ //$NON-NLS-2$
-		map.put("host", "true");
-
-		CommandAction action2 = new CommandAction(PlatformUI
-				.getWorkbench(), CMD2_ID, map);//$NON-NLS-1$
-		action2.run();
-		assertEquals(1, cmd2Handler.count);
-		assertNotNull(cmd2Handler.paramValue1);
-		assertEquals("true", cmd2Handler.paramValue1);
-		assertNotNull(cmd2Handler.paramValue2);
-		assertEquals("true", cmd2Handler.paramValue2);
-
-		map = new HashMap();
-		map.put("protocol", "false"); //$NON-NLS-1$ //$NON-NLS-2$
-		map.put("host", "false");
-
-		action2 = new CommandAction(PlatformUI.getWorkbench(), CMD2_ID, map);//$NON-NLS-1$
-		action2.run();
-		assertEquals(2, cmd2Handler.count);
-		assertNotNull(cmd2Handler.paramValue1);
-		assertEquals("false", cmd2Handler.paramValue1);
-		assertNotNull(cmd2Handler.paramValue2);
-		assertEquals("false", cmd2Handler.paramValue2);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandCallbackTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandCallbackTest.java
deleted file mode 100644
index 1150966..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandCallbackTest.java
+++ /dev/null
@@ -1,473 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.commands;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.IParameter;
-import org.eclipse.core.commands.Parameterization;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.commands.IElementReference;
-import org.eclipse.ui.commands.IElementUpdater;
-import org.eclipse.ui.handlers.IHandlerActivation;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.menus.UIElement;
-import org.eclipse.ui.services.IServiceLocator;
-import org.eclipse.ui.services.IServiceScopes;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.3
- * 
- */
-public class CommandCallbackTest extends UITestCase {
-
-	/**
-	 * 
-	 */
-	private static final String HOST_PARAM_ID = "host";
-	/**
-	 * 
-	 */
-	private static final String PROT_PARAM_ID = "protocol";
-	/**
-	 * 
-	 */
-	private static final String PREFIX = "tests.commands.CCT.";
-	private static final String CMD1_ID = PREFIX + "cmd1";
-	private static final String CMD2_ID = PREFIX + "cmd2";
-
-	private ICommandService commandService;
-	private Command cmd1;
-	private Command cmd2;
-	private IHandlerService handlerService;
-	private IHandlerActivation cmd1Activation;
-	private IHandlerActivation cmd2Activation;
-	private CallbackHandler cmd1Handler;
-	private CallbackHandler cmd2Handler;
-
-	/**
-	 * @param testName
-	 */
-	public CommandCallbackTest(String testName) {
-		super(testName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doSetUp()
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		commandService = (ICommandService) fWorkbench
-				.getService(ICommandService.class);
-		cmd1 = commandService.getCommand(CMD1_ID);
-		cmd2 = commandService.getCommand(CMD2_ID);
-		handlerService = (IHandlerService) fWorkbench
-				.getService(IHandlerService.class);
-		cmd1Handler = new CallbackHandler();
-		cmd1Activation = handlerService.activateHandler(CMD1_ID, cmd1Handler);
-		cmd2Handler = new CallbackHandler();
-		cmd2Activation = handlerService.activateHandler(CMD2_ID, cmd2Handler);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doTearDown()
-	 */
-	protected void doTearDown() throws Exception {
-		if (cmd1Activation != null) {
-			handlerService.deactivateHandler(cmd1Activation);
-			cmd1Activation = null;
-		}
-		if (cmd2Activation != null) {
-			handlerService.deactivateHandler(cmd2Activation);
-			cmd2Activation = null;
-		}
-		super.doTearDown();
-	}
-
-	private static class CallbackHandler extends AbstractHandler implements
-			IElementUpdater {
-		public int callbacks = 0;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.commands.ICallbackUpdater#updateCallback(org.eclipse.core.runtime.IAdaptable,
-		 *      java.util.Map)
-		 */
-		public void updateElement(UIElement callback, Map parameters) {
-			callbacks++;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-		 */
-		public Object execute(ExecutionEvent event) throws ExecutionException {
-			return null;
-		}
-	}
-
-	private static class MyElement extends UIElement {
-		
-		/**
-		 * 
-		 */
-		public MyElement(IServiceLocator locator) {
-			super(locator);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.menus.UIElement#setChecked(boolean)
-		 */
-		public void setChecked(boolean checked) {
-			// TODO Auto-generated method stub
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.menus.UIElement#setDisabledIcon(org.eclipse.jface.resource.ImageDescriptor)
-		 */
-		public void setDisabledIcon(ImageDescriptor desc) {
-			// TODO Auto-generated method stub
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.menus.UIElement#setHoverIcon(org.eclipse.jface.resource.ImageDescriptor)
-		 */
-		public void setHoverIcon(ImageDescriptor desc) {
-			// TODO Auto-generated method stub
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.menus.UIElement#setIcon(org.eclipse.jface.resource.ImageDescriptor)
-		 */
-		public void setIcon(ImageDescriptor desc) {
-			// TODO Auto-generated method stub
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.menus.UIElement#setText(java.lang.String)
-		 */
-		public void setText(String text) {
-			// TODO Auto-generated method stub
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.menus.UIElement#setTooltip(java.lang.String)
-		 */
-		public void setTooltip(String text) {
-			// TODO Auto-generated method stub
-
-		}
-
-	}
-
-	public void testNoParametersNoCallbacks() throws Exception {
-		ParameterizedCommand pc1 = new ParameterizedCommand(cmd1, null);
-		ParameterizedCommand pc2 = new ParameterizedCommand(cmd1, null);
-		try {
-			commandService.registerElementForCommand(pc1, null);
-			fail("Callback should not register");
-		} catch (NotDefinedException e) {
-		}
-		try {
-			commandService.registerElementForCommand(pc2, null);
-			fail("Callback 2 should not register");
-		} catch (NotDefinedException e) {
-		}
-
-		commandService.refreshElements(CMD1_ID + ".1", null);
-		assertEquals(0, cmd1Handler.callbacks);
-
-		commandService.refreshElements(CMD1_ID, null);
-		assertEquals(0, cmd1Handler.callbacks);
-	}
-
-	public void testNoParametersWithCallbacks() throws Exception {
-		ParameterizedCommand pc1 = new ParameterizedCommand(cmd1, null);
-		ParameterizedCommand pc2 = new ParameterizedCommand(cmd1, null);
-
-		IElementReference cr1 = commandService.registerElementForCommand(pc1,
-				new MyElement(fWorkbench));
-		IElementReference cr2 = commandService.registerElementForCommand(pc2,
-				new MyElement(fWorkbench));
-
-		try {
-			assertEquals(2, cmd1Handler.callbacks);
-			cmd1Handler.callbacks = 0;
-			commandService.refreshElements(CMD1_ID, null);
-			assertEquals(2, cmd1Handler.callbacks);
-		} finally {
-			commandService.unregisterElement(cr1);
-			commandService.unregisterElement(cr2);
-		}
-
-		cmd1Handler.callbacks = 0;
-		commandService.refreshElements(CMD1_ID, null);
-		assertEquals(0, cmd1Handler.callbacks);
-	}
-
-	public void testParametersWithCallbacks() throws Exception {
-		IParameter parmProt = cmd2.getParameter(PROT_PARAM_ID);
-		IParameter parmHost = cmd2.getParameter(HOST_PARAM_ID);
-		ParameterizedCommand pc1 = new ParameterizedCommand(cmd2,
-				new Parameterization[] {
-						new Parameterization(parmProt, "http"),
-						new Parameterization(parmHost, "www.eclipse.org") });
-		ParameterizedCommand pc2 = new ParameterizedCommand(
-				cmd2,
-				new Parameterization[] {
-						new Parameterization(parmProt, "http"),
-						new Parameterization(parmHost, "download.eclipse.org") });
-		IElementReference cr1 = commandService.registerElementForCommand(pc1,
-				new MyElement(fWorkbench));
-		IElementReference cr2 = commandService.registerElementForCommand(pc2,
-				new MyElement(fWorkbench));
-		try {
-
-			assertEquals(2, cmd2Handler.callbacks);
-
-			cmd2Handler.callbacks = 0;
-			Map filter = new HashMap();
-			filter.put(PROT_PARAM_ID, "http");
-			commandService.refreshElements(CMD2_ID, filter);
-			assertEquals(2, cmd2Handler.callbacks);
-
-			cmd2Handler.callbacks = 0;
-			filter.put(HOST_PARAM_ID, "www.eclipse.org");
-			commandService.refreshElements(CMD2_ID, filter);
-			assertEquals(1, cmd2Handler.callbacks);
-
-			cmd2Handler.callbacks = 0;
-			filter.remove(PROT_PARAM_ID);
-			commandService.refreshElements(CMD2_ID, filter);
-			assertEquals(1, cmd2Handler.callbacks);
-
-		} finally {
-			commandService.unregisterElement(cr1);
-			commandService.unregisterElement(cr2);
-		}
-	}
-
-	public void testParmsToSameCommand() throws Exception {
-		IParameter parmProt = cmd2.getParameter(PROT_PARAM_ID);
-		IParameter parmHost = cmd2.getParameter(HOST_PARAM_ID);
-		ParameterizedCommand pc1 = new ParameterizedCommand(cmd2,
-				new Parameterization[] {
-						new Parameterization(parmProt, "http"),
-						new Parameterization(parmHost, "www.eclipse.org") });
-		ParameterizedCommand pc2 = new ParameterizedCommand(
-				cmd2,
-				new Parameterization[] {
-						new Parameterization(parmProt, "http"),
-						new Parameterization(parmHost, "download.eclipse.org") });
-		ParameterizedCommand pc3 = new ParameterizedCommand(
-				cmd2,
-				new Parameterization[] {
-						new Parameterization(parmProt, "http"),
-						new Parameterization(parmHost, "download.eclipse.org") });
-		IElementReference cr1 = commandService.registerElementForCommand(pc1,
-				new MyElement(fWorkbench));
-		IElementReference cr2 = commandService.registerElementForCommand(pc2,
-				new MyElement(fWorkbench));
-		IElementReference cr3 = commandService.registerElementForCommand(pc3,
-				new MyElement(fWorkbench));
-		try {
-
-			assertEquals(3, cmd2Handler.callbacks);
-
-			cmd2Handler.callbacks = 0;
-			Map filter = new HashMap();
-			filter.put(PROT_PARAM_ID, "http");
-			commandService.refreshElements(CMD2_ID, filter);
-			assertEquals(3, cmd2Handler.callbacks);
-
-			cmd2Handler.callbacks = 0;
-			filter.put(HOST_PARAM_ID, "www.eclipse.org");
-			commandService.refreshElements(CMD2_ID, filter);
-			assertEquals(1, cmd2Handler.callbacks);
-
-			cmd2Handler.callbacks = 0;
-			filter.remove(PROT_PARAM_ID);
-			commandService.refreshElements(CMD2_ID, filter);
-			assertEquals(1, cmd2Handler.callbacks);
-
-			cmd2Handler.callbacks = 0;
-			filter.put(HOST_PARAM_ID, "download.eclipse.org");
-			commandService.refreshElements(CMD2_ID, filter);
-			assertEquals(2, cmd2Handler.callbacks);
-		} finally {
-			commandService.unregisterElement(cr1);
-			commandService.unregisterElement(cr2);
-			commandService.unregisterElement(cr3);
-		}
-	}
-
-	public void testParmsToDifferentProtocol() throws Exception {
-		IParameter parmProt = cmd2.getParameter(PROT_PARAM_ID);
-		IParameter parmHost = cmd2.getParameter(HOST_PARAM_ID);
-		ParameterizedCommand pc1 = new ParameterizedCommand(cmd2,
-				new Parameterization[] {
-						new Parameterization(parmProt, "http"),
-						new Parameterization(parmHost, "www.eclipse.org") });
-		ParameterizedCommand pc2 = new ParameterizedCommand(
-				cmd2,
-				new Parameterization[] {
-						new Parameterization(parmProt, "http"),
-						new Parameterization(parmHost, "download.eclipse.org") });
-		ParameterizedCommand pc3 = new ParameterizedCommand(
-				cmd2,
-				new Parameterization[] {
-						new Parameterization(parmProt, "http"),
-						new Parameterization(parmHost, "download.eclipse.org") });
-		ParameterizedCommand pc4 = new ParameterizedCommand(cmd2,
-				new Parameterization[] { new Parameterization(parmProt, "ftp"),
-						new Parameterization(parmHost, "www.eclipse.org") });
-		ParameterizedCommand pc5 = new ParameterizedCommand(
-				cmd2,
-				new Parameterization[] { new Parameterization(parmProt, "ftp"),
-						new Parameterization(parmHost, "download.eclipse.org") });
-		IElementReference cr1 = commandService.registerElementForCommand(pc1,
-				new MyElement(fWorkbench));
-		IElementReference cr2 = commandService.registerElementForCommand(pc2,
-				new MyElement(fWorkbench));
-		IElementReference cr3 = commandService.registerElementForCommand(pc3,
-				new MyElement(fWorkbench));
-		IElementReference cr4 = commandService.registerElementForCommand(pc4,
-				new MyElement(fWorkbench));
-		IElementReference cr5 = commandService.registerElementForCommand(pc5,
-				new MyElement(fWorkbench));
-		try {
-			assertEquals(5, cmd2Handler.callbacks);
-			Map filter = new HashMap();
-
-			cmd2Handler.callbacks = 0;
-			filter.put(PROT_PARAM_ID, "http");
-			commandService.refreshElements(CMD2_ID, filter);
-			assertEquals(3, cmd2Handler.callbacks);
-
-			cmd2Handler.callbacks = 0;
-			filter.put(PROT_PARAM_ID, "ftp");
-			commandService.refreshElements(CMD2_ID, filter);
-			assertEquals(2, cmd2Handler.callbacks);
-
-			cmd2Handler.callbacks = 0;
-			filter.put(HOST_PARAM_ID, "download.eclipse.org");
-			commandService.refreshElements(CMD2_ID, filter);
-			assertEquals(1, cmd2Handler.callbacks);
-
-			cmd2Handler.callbacks = 0;
-			filter.remove(PROT_PARAM_ID);
-			commandService.refreshElements(CMD2_ID, filter);
-			assertEquals(3, cmd2Handler.callbacks);
-
-		} finally {
-			commandService.unregisterElement(cr1);
-			commandService.unregisterElement(cr2);
-			commandService.unregisterElement(cr3);
-			commandService.unregisterElement(cr4);
-			commandService.unregisterElement(cr5);
-		}
-	}
-
-	public void testCommandThroughWindow() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		ICommandService cs = (ICommandService) window
-				.getService(ICommandService.class);
-		IParameter parmProt = cmd2.getParameter(PROT_PARAM_ID);
-		IParameter parmHost = cmd2.getParameter(HOST_PARAM_ID);
-		ParameterizedCommand pc1 = new ParameterizedCommand(cmd2,
-				new Parameterization[] {
-						new Parameterization(parmProt, "http"),
-						new Parameterization(parmHost, "www.eclipse.org") });
-		ParameterizedCommand pc2 = new ParameterizedCommand(
-				cmd2,
-				new Parameterization[] {
-						new Parameterization(parmProt, "http"),
-						new Parameterization(parmHost, "download.eclipse.org") });
-		IElementReference cr1 = commandService.registerElementForCommand(pc1,
-				new MyElement(window));
-		// should be removed when the window goes away
-		cs.registerElementForCommand(pc2, new MyElement(window));
-		try {
-			assertEquals(2, cmd2Handler.callbacks);
-
-			Map filter = new HashMap();
-			cmd2Handler.callbacks = 0;
-			filter.put(PROT_PARAM_ID, "http");
-			commandService.refreshElements(CMD2_ID, filter);
-			assertEquals(2, cmd2Handler.callbacks);
-
-			cmd2Handler.callbacks = 0;
-			filter.put(IServiceScopes.WINDOW_SCOPE, window);
-			commandService.refreshElements(CMD2_ID, filter);
-			assertEquals(1, cmd2Handler.callbacks);
-		} finally {
-			commandService.unregisterElement(cr1);
-		}
-	}
-
-	public void testCallbackCleanup() throws Exception {
-		ParameterizedCommand pc1 = new ParameterizedCommand(cmd1, null);
-		ParameterizedCommand pc2 = new ParameterizedCommand(cmd1, null);
-
-		IWorkbenchWindow window = openTestWindow();
-		ICommandService cs = (ICommandService) window
-				.getService(ICommandService.class);
-
-		IElementReference cr1 = commandService.registerElementForCommand(pc1,
-				new MyElement(window));
-		// should be removed when the window goes away
-		cs.registerElementForCommand(pc2, new MyElement(window));
-
-		try {
-			assertEquals(2, cmd1Handler.callbacks);
-			cmd1Handler.callbacks = 0;
-			closeAllTestWindows();
-			commandService.refreshElements(CMD1_ID, null);
-			assertEquals(1, cmd1Handler.callbacks);
-		} finally {
-			commandService.unregisterElement(cr1);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandEnablementTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandEnablementTest.java
deleted file mode 100644
index 9cbdd9a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandEnablementTest.java
+++ /dev/null
@@ -1,548 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.commands;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.CommandEvent;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.HandlerEvent;
-import org.eclipse.core.commands.ICommandListener;
-import org.eclipse.core.commands.IHandlerListener;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionConverter;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.internal.expressions.CountExpression;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.ISources;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.contexts.IContextActivation;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.handlers.HandlerUtil;
-import org.eclipse.ui.handlers.IHandlerActivation;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.internal.handlers.HandlerProxy;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.eclipse.ui.internal.services.CurrentSelectionSourceProvider;
-import org.eclipse.ui.services.IEvaluationService;
-import org.eclipse.ui.services.ISourceProviderService;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.3
- * 
- */
-public class CommandEnablementTest extends UITestCase {
-
-	private static final String CONTEXT_TEST2 = "org.eclipse.ui.command.contexts.enablement_test2";
-	private static final String CONTEXT_TEST1 = "org.eclipse.ui.command.contexts.enablement_test1";
-	private static final String PREFIX = "tests.commands.CCT.";
-	private static final String CMD1_ID = PREFIX + "cmd1";
-
-	private ICommandService commandService;
-	private IHandlerService handlerService;
-	private IContextService contextService;
-
-	private Command cmd1;
-	private DefaultHandler normalHandler1;
-	private IHandlerActivation activation1;
-	private DefaultHandler normalHandler2;
-	private IHandlerActivation activation2;
-	private DisabledHandler disabledHandler1;
-	private DisabledHandler disabledHandler2;
-	private EnableEventHandler eventHandler1;
-	private EnableEventHandler eventHandler2;
-	private IEvaluationService evalService;
-	private CheckContextHandler contextHandler;
-	private IContextActivation contextActivation1;
-	private IContextActivation contextActivation2;
-
-	/**
-	 * @param testName
-	 */
-	public CommandEnablementTest(String testName) {
-		super(testName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doSetUp()
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		commandService = (ICommandService) fWorkbench
-				.getService(ICommandService.class);
-		handlerService = (IHandlerService) fWorkbench
-				.getService(IHandlerService.class);
-		contextService = (IContextService) fWorkbench
-				.getService(IContextService.class);
-		evalService = (IEvaluationService) fWorkbench
-				.getService(IEvaluationService.class);
-		cmd1 = commandService.getCommand(CMD1_ID);
-		normalHandler1 = new DefaultHandler();
-		normalHandler2 = new DefaultHandler();
-		disabledHandler1 = new DisabledHandler();
-		disabledHandler2 = new DisabledHandler();
-		eventHandler1 = new EnableEventHandler();
-		eventHandler2 = new EnableEventHandler();
-		contextHandler = new CheckContextHandler();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doTearDown()
-	 */
-	protected void doTearDown() throws Exception {
-		if (activation1 != null) {
-			handlerService.deactivateHandler(activation1);
-			activation1 = null;
-		}
-		if (activation2 != null) {
-			handlerService.deactivateHandler(activation2);
-			activation2 = null;
-		}
-		if (contextActivation1 != null) {
-			contextService.deactivateContext(contextActivation1);
-			contextActivation1 = null;
-		}
-		if (contextActivation2 != null) {
-			contextService.deactivateContext(contextActivation2);
-			contextActivation2 = null;
-		}
-		super.doTearDown();
-	}
-
-	private static class DefaultHandler extends AbstractHandler {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-		 */
-		public Object execute(ExecutionEvent event) throws ExecutionException {
-			HandlerUtil.getActiveContextsChecked(event);
-			return null;
-		}
-	}
-
-	private static class DisabledHandler extends AbstractHandler {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-		 */
-		public Object execute(ExecutionEvent event) throws ExecutionException {
-			HandlerUtil.getActiveContextsChecked(event);
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
-		 */
-		public boolean isEnabled() {
-			return false;
-		}
-	}
-
-	private static class EnableEventHandler extends AbstractHandler {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-		 */
-		public Object execute(ExecutionEvent event) throws ExecutionException {
-			HandlerUtil.getActiveContextsChecked(event);
-			return null;
-		}
-
-		private boolean fEnabled = true;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
-		 */
-		public boolean isEnabled() {
-			return fEnabled;
-		}
-
-		public void setEnabled(boolean enabled) {
-			if (fEnabled != enabled) {
-				fEnabled = enabled;
-				fireHandlerChanged(new HandlerEvent(this, true, false));
-			}
-		}
-	}
-
-	private static class CheckContextHandler extends AbstractHandler {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-		 */
-		public Object execute(ExecutionEvent event) throws ExecutionException {
-			HandlerUtil.getActivePartChecked(event);
-			return null;
-		}
-
-		public void setEnabled(Object applicationContext) {
-			Object o = HandlerUtil.getVariable(applicationContext,
-					ISources.ACTIVE_PART_NAME);
-			setBaseEnabled(o instanceof IWorkbenchPart);
-		}
-	}
-
-	private static class EnablementListener implements ICommandListener {
-		public int enabledChanged = 0;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.commands.ICommandListener#commandChanged(org.eclipse.core.commands.CommandEvent)
-		 */
-		public void commandChanged(CommandEvent commandEvent) {
-			if (commandEvent.isEnabledChanged()) {
-				enabledChanged++;
-			}
-		}
-	}
-
-	public void testEnablementForNormalHandlers() throws Exception {
-		activation1 = handlerService.activateHandler(CMD1_ID, normalHandler1,
-				new ActiveContextExpression(CONTEXT_TEST1,
-						new String[] { ISources.ACTIVE_CONTEXT_NAME }));
-		activation2 = handlerService.activateHandler(CMD1_ID, normalHandler2,
-				new ActiveContextExpression(CONTEXT_TEST2,
-						new String[] { ISources.ACTIVE_CONTEXT_NAME }));
-
-		assertFalse(cmd1.isHandled());
-		assertFalse(cmd1.isEnabled());
-
-		contextActivation1 = contextService.activateContext(CONTEXT_TEST1);
-		assertTrue(cmd1.isHandled());
-		assertTrue(cmd1.isEnabled());
-		assertEquals(normalHandler1, cmd1.getHandler());
-		contextService.deactivateContext(contextActivation1);
-		assertFalse(cmd1.isHandled());
-		assertFalse(cmd1.isEnabled());
-
-		contextActivation2 = contextService.activateContext(CONTEXT_TEST2);
-		assertTrue(cmd1.isHandled());
-		assertTrue(cmd1.isEnabled());
-		assertEquals(normalHandler2, cmd1.getHandler());
-		contextService.deactivateContext(contextActivation2);
-		assertFalse(cmd1.isHandled());
-		assertFalse(cmd1.isEnabled());
-	}
-
-	public void testEventsForNormalHandlers() throws Exception {
-		// incremented for every change that should change enablement
-		int enabledChangedCount = 0;
-
-		activation1 = handlerService.activateHandler(CMD1_ID, normalHandler1,
-				new ActiveContextExpression(CONTEXT_TEST1,
-						new String[] { ISources.ACTIVE_CONTEXT_NAME }));
-		activation2 = handlerService.activateHandler(CMD1_ID, normalHandler2,
-				new ActiveContextExpression(CONTEXT_TEST2,
-						new String[] { ISources.ACTIVE_CONTEXT_NAME }));
-
-		assertFalse(cmd1.isHandled());
-		assertFalse(cmd1.isEnabled());
-		EnablementListener listener = new EnablementListener();
-		cmd1.addCommandListener(listener);
-
-		try {
-			contextActivation1 = contextService.activateContext(CONTEXT_TEST1);
-			enabledChangedCount++;
-			assertTrue(cmd1.isHandled());
-			assertTrue(cmd1.isEnabled());
-			assertEquals(normalHandler1, cmd1.getHandler());
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-
-			contextService.deactivateContext(contextActivation1);
-			enabledChangedCount++;
-			assertFalse(cmd1.isHandled());
-			assertFalse(cmd1.isEnabled());
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-
-			contextActivation2 = contextService.activateContext(CONTEXT_TEST2);
-			enabledChangedCount++;
-			assertTrue(cmd1.isHandled());
-			assertTrue(cmd1.isEnabled());
-			assertEquals(normalHandler2, cmd1.getHandler());
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-
-			contextService.deactivateContext(contextActivation2);
-			enabledChangedCount++;
-			assertFalse(cmd1.isHandled());
-			assertFalse(cmd1.isEnabled());
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-		} finally {
-			cmd1.removeCommandListener(listener);
-		}
-	}
-
-	public void testEventsForDisabledHandlers() throws Exception {
-		// incremented for every change that should change enablement
-		int enabledChangedCount = 0;
-
-		activation1 = handlerService.activateHandler(CMD1_ID, disabledHandler1,
-				new ActiveContextExpression(CONTEXT_TEST1,
-						new String[] { ISources.ACTIVE_CONTEXT_NAME }));
-		activation2 = handlerService.activateHandler(CMD1_ID, disabledHandler2,
-				new ActiveContextExpression(CONTEXT_TEST2,
-						new String[] { ISources.ACTIVE_CONTEXT_NAME }));
-
-		assertFalse(cmd1.isHandled());
-		assertFalse(cmd1.isEnabled());
-		EnablementListener listener = new EnablementListener();
-		cmd1.addCommandListener(listener);
-
-		try {
-			contextActivation1 = contextService.activateContext(CONTEXT_TEST1);
-			assertTrue(cmd1.isHandled());
-			assertFalse(cmd1.isEnabled());
-			assertEquals(disabledHandler1, cmd1.getHandler());
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-
-			contextService.deactivateContext(contextActivation1);
-			assertFalse(cmd1.isHandled());
-			assertFalse(cmd1.isEnabled());
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-
-			contextActivation2 = contextService.activateContext(CONTEXT_TEST2);
-			assertTrue(cmd1.isHandled());
-			assertFalse(cmd1.isEnabled());
-			assertEquals(disabledHandler2, cmd1.getHandler());
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-
-			contextService.deactivateContext(contextActivation2);
-			assertFalse(cmd1.isHandled());
-			assertFalse(cmd1.isEnabled());
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-		} finally {
-			cmd1.removeCommandListener(listener);
-		}
-	}
-
-	public void testEventsForEnabledHandlers() throws Exception {
-		// incremented for every change that should change enablement
-		int enabledChangedCount = 0;
-
-		activation1 = handlerService.activateHandler(CMD1_ID, eventHandler1,
-				new ActiveContextExpression(CONTEXT_TEST1,
-						new String[] { ISources.ACTIVE_CONTEXT_NAME }));
-		activation2 = handlerService.activateHandler(CMD1_ID, eventHandler2,
-				new ActiveContextExpression(CONTEXT_TEST2,
-						new String[] { ISources.ACTIVE_CONTEXT_NAME }));
-
-		assertFalse(cmd1.isHandled());
-		assertFalse(cmd1.isEnabled());
-		EnablementListener listener = new EnablementListener();
-		cmd1.addCommandListener(listener);
-
-		try {
-			contextActivation1 = contextService.activateContext(CONTEXT_TEST1);
-			enabledChangedCount++;
-
-			assertTrue(cmd1.isHandled());
-			assertTrue(cmd1.isEnabled());
-			assertEquals(eventHandler1, cmd1.getHandler());
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-
-			eventHandler1.setEnabled(true);
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-			assertTrue(cmd1.isEnabled());
-
-			eventHandler1.setEnabled(false);
-			enabledChangedCount++;
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-			assertFalse(cmd1.isEnabled());
-
-			eventHandler1.setEnabled(false);
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-			assertFalse(cmd1.isEnabled());
-
-			eventHandler1.setEnabled(true);
-			enabledChangedCount++;
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-			assertTrue(cmd1.isEnabled());
-
-			eventHandler1.setEnabled(false);
-			enabledChangedCount++;
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-			assertFalse(cmd1.isEnabled());
-
-			eventHandler2.setEnabled(false);
-			eventHandler2.setEnabled(true);
-			eventHandler2.setEnabled(false);
-			eventHandler2.setEnabled(true);
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-			assertFalse(cmd1.isEnabled());
-
-			contextService.deactivateContext(contextActivation1);
-			assertFalse(cmd1.isHandled());
-			assertFalse(cmd1.isEnabled());
-			assertEquals(enabledChangedCount, listener.enabledChanged);
-		} finally {
-			cmd1.removeCommandListener(listener);
-		}
-	}
-
-	public void testCommandWithHandlerProxy() throws Exception {
-		IConfigurationElement handlerProxyConfig = null;
-		String commandId = null;
-		IExtensionPoint point = Platform.getExtensionRegistry()
-				.getExtensionPoint("org.eclipse.ui.handlers");
-		IExtension[] extensions = point.getExtensions();
-		boolean found = false;
-		for (int i = 0; i < extensions.length && !found; i++) {
-			IConfigurationElement[] configElements = extensions[i]
-					.getConfigurationElements();
-			for (int j = 0; j < configElements.length && !found; j++) {
-				if (configElements[j].getAttribute(
-						IWorkbenchRegistryConstants.ATT_CLASS).equals(
-						"org.eclipse.ui.tests.menus.HelloEHandler")) {
-					handlerProxyConfig = configElements[j];
-					commandId = handlerProxyConfig
-							.getAttribute(IWorkbenchRegistryConstants.ATT_ID);
-					found = true;
-				}
-			}
-		}
-		assertNotNull(handlerProxyConfig);
-		Expression enabledWhen = new ActiveContextExpression(CONTEXT_TEST1,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME });
-		HandlerProxy proxy = new HandlerProxy(commandId, handlerProxyConfig,
-				"class", enabledWhen, evalService);
-		assertFalse(proxy.isEnabled());
-		contextActivation1 = contextService.activateContext(CONTEXT_TEST1);
-		assertTrue(proxy.isEnabled());
-		contextService.deactivateContext(contextActivation1);
-		assertFalse(proxy.isEnabled());
-	}
-
-	private static class Checker implements IHandlerListener {
-		boolean lastChange = false;
-
-		public void handlerChanged(HandlerEvent handlerEvent) {
-			lastChange = handlerEvent.isEnabledChanged();
-		}
-	}
-
-	public void testEnablementWithHandlerProxy() throws Exception {
-		IConfigurationElement handlerProxyConfig = null;
-		String commandId = null;
-		IExtensionPoint point = Platform.getExtensionRegistry()
-				.getExtensionPoint("org.eclipse.ui.handlers");
-		IExtension[] extensions = point.getExtensions();
-		boolean found = false;
-		for (int i = 0; i < extensions.length && !found; i++) {
-			IConfigurationElement[] configElements = extensions[i]
-					.getConfigurationElements();
-			for (int j = 0; j < configElements.length && !found; j++) {
-				if (configElements[j].getAttribute(
-						IWorkbenchRegistryConstants.ATT_COMMAND_ID).equals(
-						"org.eclipse.ui.tests.enabledCount")) {
-					handlerProxyConfig = configElements[j];
-					commandId = handlerProxyConfig
-							.getAttribute(IWorkbenchRegistryConstants.ATT_ID);
-					found = true;
-				}
-			}
-		}
-		assertNotNull(handlerProxyConfig);
-		Expression enabledWhen = ExpressionConverter.getDefault()
-				.perform(
-						handlerProxyConfig.getChildren("enabledWhen")[0]
-								.getChildren()[0]);
-		assertTrue(enabledWhen instanceof CountExpression);
-		HandlerProxy proxy = new HandlerProxy(commandId, handlerProxyConfig, "class",
-				enabledWhen, evalService);
-		Checker listener = new Checker();
-		proxy.addHandlerListener(listener);
-		assertFalse(proxy.isEnabled());
-		ISourceProviderService providers = (ISourceProviderService) fWorkbench
-				.getService(ISourceProviderService.class);
-		CurrentSelectionSourceProvider selectionProvider = (CurrentSelectionSourceProvider) providers
-				.getSourceProvider(ISources.ACTIVE_CURRENT_SELECTION_NAME);
-
-		selectionProvider.selectionChanged(null, StructuredSelection.EMPTY);
-		assertFalse(proxy.isEnabled());
-		assertFalse(listener.lastChange);
-
-		selectionProvider.selectionChanged(null, new StructuredSelection(
-				new Object()));
-		assertFalse(proxy.isEnabled());
-		assertFalse(listener.lastChange);
-
-		selectionProvider.selectionChanged(null, new StructuredSelection(
-				new Object[] { new Object(), new Object() }));
-		assertTrue(proxy.isEnabled());
-		assertTrue(listener.lastChange);
-
-		listener.lastChange = false;
-		selectionProvider.selectionChanged(null, new StructuredSelection(
-				new Object[] { new Object(), new Object(), new Object() }));
-		assertFalse(proxy.isEnabled());
-		assertTrue(listener.lastChange);
-	}
-
-	public void testEnablementForLocalContext() throws Exception {
-		openTestWindow("org.eclipse.ui.resourcePerspective");
-		activation1 = handlerService.activateHandler(CMD1_ID, contextHandler,
-				new ActiveContextExpression(CONTEXT_TEST1,
-						new String[] { ISources.ACTIVE_CONTEXT_NAME }));
-		assertFalse(cmd1.isHandled());
-		assertFalse(cmd1.isEnabled());
-		IEvaluationContext snapshot = handlerService
-				.createContextSnapshot(false);
-		cmd1.setEnabled(snapshot);
-		assertFalse(cmd1.isEnabled());
-
-		contextActivation1 = contextService.activateContext(CONTEXT_TEST1);
-		assertTrue(cmd1.isHandled());
-		cmd1.setEnabled(snapshot);
-		assertTrue(cmd1.isEnabled());
-		assertEquals(contextHandler, cmd1.getHandler());
-
-		snapshot.removeVariable(ISources.ACTIVE_PART_NAME);
-		assertTrue(cmd1.isHandled());
-		cmd1.setEnabled(snapshot);
-		assertFalse(cmd1.isEnabled());
-		cmd1.setEnabled(handlerService.getCurrentState());
-		assertTrue(cmd1.isEnabled());
-		assertEquals(contextHandler, cmd1.getHandler());
-
-		snapshot.addVariable(ISources.ACTIVE_PART_NAME, handlerService
-				.getCurrentState().getVariable(ISources.ACTIVE_PART_NAME));
-		cmd1.setEnabled(snapshot);
-		assertTrue(cmd1.isEnabled());
-		cmd1.setEnabled(handlerService.getCurrentState());
-		assertTrue(cmd1.isEnabled());
-		assertEquals(contextHandler, cmd1.getHandler());
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandManagerTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandManagerTest.java
deleted file mode 100644
index 2e3143d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandManagerTest.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.commands;
-
-import org.eclipse.core.commands.Category;
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.CommandManager;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.IExecutionListener;
-import org.eclipse.core.commands.NotHandledException;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests some of the API on command manager.
- * 
- * @since 3.1
- */
-public final class CommandManagerTest extends UITestCase {
-
-	/**
-	 * An execution listener that can be attached to the command manager. It
-	 * will track which events it last heard.
-	 * 
-	 * @since 3.1
-	 */
-	private final class ExecutionListener implements IExecutionListener {
-
-		/**
-		 * The last command identifier to be not handled, or <code>null</code>
-		 * if none.
-		 */
-		private String notHandledId = null;
-
-		/**
-		 * The last command identifier to be executed, or <code>null</code> if
-		 * none.
-		 */
-		private String preExecuteId = null;
-
-		/**
-		 * The last not handled exception throw, or <code>null</code> if none.
-		 */
-		private NotHandledException notHandledException = null;
-
-		/**
-		 * The last execution event, or <code>null</code> if none.
-		 */
-		private ExecutionEvent preExecuteEvent = null;
-
-		public final void notHandled(final String commandId,
-				final NotHandledException exception) {
-			notHandledId = commandId;
-			notHandledException = exception;
-		}
-
-		public final void postExecuteFailure(final String commandId,
-				final ExecutionException exception) {
-			// Do nothing.
-		}
-
-		public final void postExecuteSuccess(final String commandId,
-				final Object returnValue) {
-			// Do nothing
-		}
-
-		public final void preExecute(final String commandId,
-				final ExecutionEvent event) {
-			preExecuteId = commandId;
-			preExecuteEvent = event;
-		}
-
-	}
-
-	/**
-	 * Constructs a new instance of <code>CommandManagerTest</code>.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public CommandManagerTest(String testName) {
-		super(testName);
-	}
-
-	public final void testExecutionListener() {
-		final String commandId = "myCommand";
-		final CommandManager commandManager = new CommandManager();
-		final Category category = commandManager.getCategory(commandId);
-		category.define("name", null);
-		final Command command = commandManager.getCommand(commandId);
-		command.define("name", null, category, null);
-		final ExecutionListener listener = new ExecutionListener();
-		commandManager.addExecutionListener(listener);
-		Exception exception = null;
-		final ExecutionEvent event = new ExecutionEvent();
-		try {
-			command.execute(event);
-		} catch (final ExecutionException e) {
-			exception = e;
-		} catch (final NotHandledException e) {
-			exception = e;
-		}
-
-		assertSame(
-				"Should have received a pre-execute event for the correct command",
-				commandId, listener.preExecuteId);
-		assertSame(
-				"Should have received a pre-execute event with the correct event",
-				event, listener.preExecuteEvent);
-		assertSame(
-				"Should have received a not-handled event for the correct command",
-				commandId, listener.notHandledId);
-		assertSame(
-				"Should have received a not-handled event with the correct exception",
-				exception, listener.notHandledException);
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandParameterTypeTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandParameterTypeTest.java
deleted file mode 100644
index 5914e47..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandParameterTypeTest.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Benjamin Muskalla - bug 222861 [Commands] ParameterizedCommand#equals broken
- *******************************************************************************/
-package org.eclipse.ui.tests.commands;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.IParameter;
-import org.eclipse.core.commands.ITypedParameter;
-import org.eclipse.core.commands.ParameterType;
-import org.eclipse.core.commands.ParameterValueConversionException;
-import org.eclipse.core.commands.Parameterization;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.CommandException;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-public class CommandParameterTypeTest extends UITestCase {
-
-	static final String SUBTRACT = "org.eclipse.ui.tests.commands.subtractInteger";
-	static final String MINUEND = "minuend";
-	static final String SUBTRAHEND = "subtrahend";
-	
-	static final String TYPE = "org.eclipse.ui.tests.commands.Integer";
-	
-	/**
-	 * Constructs a new instance of <code>CommandParameterTypeTest</code>.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public CommandParameterTypeTest(String testName) {
-		super(testName);
-	}
-	
-	/**
-	 * Tests invoking a command that subtracts one number from another. The
-	 * handler for the subtract command will convert the string parameters to
-	 * integers to perform the operation. This test drives much of the command
-	 * parameter type infrastructure including obtaining parameter types and
-	 * performing stringToObject and objectToString conversions.
-	 */
-	public void testSubtract() throws CommandException {
-		testSubtract(8, 5, 3);
-		testSubtract(-4, 12, -16);
-	}
-	
-	/**
-	 * Test subtract again with invalid parameters and check for failure
-	 * exception.
-	 */
-	public void testSubtractTypeError() {
-		try {
-			// try to pass a Boolean instead of an Integer
-			testSubtract(new Integer(3), Boolean.FALSE, 3);
-			fail("expected ParameterValueConversionException");
-		}
-		catch (ParameterValueConversionException ex) {
-			// passed
-		}
-		catch (Exception ex) {
-			fail("expected ParameterValueConversionException");
-		}
-	}
-	
-	/**
-	 * Test the complete execution flow for the subtract command
-	 */
-	private void testSubtract(int minuend, int subtrahend, int difference) throws CommandException {
-		testSubtract(new Integer(minuend), new Integer(subtrahend), difference);
-	}
-	
-	/**
-	 * Test the complete execution flow for the subtract command
-	 */
-	private void testSubtract(Object minuend, Object subtrahend, int difference) throws CommandException {
-		ICommandService commandService = getCommandService();
-		Command command = commandService.getCommand(SUBTRACT);
-
-		// first convert the object params to strings
-		String minuendStr = command.getParameterType(MINUEND)
-				.getValueConverter().convertToString(minuend);
-		String subtrahendStr = command.getParameterType(SUBTRAHEND)
-				.getValueConverter().convertToString(subtrahend);
-
-		// setup the parameterizations
-		Parameterization minuendParam = new Parameterization(command
-				.getParameter(MINUEND), minuendStr);
-		Parameterization subtrahendParam = new Parameterization(command
-				.getParameter(SUBTRAHEND), subtrahendStr);
-		Parameterization[] parameterizations = new Parameterization[] {
-				minuendParam, subtrahendParam };
-
-		// execute the command and check the result
-		ParameterizedCommand pCommand = new ParameterizedCommand(command,
-				parameterizations);
-		Integer result = (Integer) pCommand.executeWithChecks(null, null);
-		assertEquals(difference, result.intValue());
-	}
-	
-	/**
-	 * Tests AbstractParameterValueConverter.convertToObject for the Integer
-	 * converter used in this test suite.
-	 */
-	public void testConvertStringToInteger() throws CommandException {
-		testConvertStringToInteger("33", 33, false);
-		testConvertStringToInteger("-1", -1, false);
-		testConvertStringToInteger("blah", 33, true);
-		testConvertStringToInteger(null, 33, true);
-	}
-	
-	private void testConvertStringToInteger(String value, int expected,
-			boolean expectFail) throws CommandException {
-		ICommandService commandService = getCommandService();
-		ParameterType type = commandService.getParameterType(TYPE);
-
-		Object converted = null;
-		if (expectFail) {
-			try {
-				converted = type.getValueConverter().convertToObject(value);
-				fail("expected ParameterValueConversionException");
-			} catch (ParameterValueConversionException ex) {
-				// passed
-				return;
-			} catch (Exception ex) {
-				fail("expected ParameterValueConversionException");
-			}
-		} else {
-			converted = type.getValueConverter().convertToObject(value);
-		}
-
-		assertEquals(new Integer(expected), converted);
-	}
-	
-	/**
-	 * Tests AbstractParameterValueConverter.convertToString for the Integer
-	 * converter used in this test suite.
-	 */
-	public void testConvertIntegerToString() throws CommandException {
-		testConvertIntegerToString(new Integer(6), "6", false);
-		testConvertIntegerToString(new Integer(0), "0", false);
-		testConvertIntegerToString(new Integer(-32), "-32", false);
-		testConvertIntegerToString(null, null, true);
-		testConvertIntegerToString(Boolean.TRUE, null, true);
-	}
-	
-	private void testConvertIntegerToString(Object value, String expected,
-			boolean expectFail) throws CommandException {
-		ICommandService commandService = getCommandService();
-		ParameterType type = commandService.getParameterType(TYPE);
-
-		String converted = null;
-		if (expectFail) {
-			try {
-				converted = type.getValueConverter().convertToString(value);
-				fail("expected ParameterValueConversionException");
-			} catch (ParameterValueConversionException ex) {
-				// passed
-				return;
-			} catch (Exception ex) {
-				fail("expected ParameterValueConversionException");
-			}
-		} else {
-			converted = type.getValueConverter().convertToString(value);
-		}
-		assertEquals(expected, converted);
-	}
-	
-	/**
-	 * Tests ParameterType.isCompatible for various values with the Integer
-	 * parameter type used in this test suite.
-	 */
-	public void testIsCompatible() throws CommandException {
-		ICommandService commandService = getCommandService();
-		ParameterType type = commandService.getParameterType(TYPE);
-		
-		assertTrue(type.isCompatible(new Integer(4)));
-		assertTrue(type.isCompatible(new Integer(0)));
-		assertTrue(type.isCompatible(new Integer(-434)));
-		assertFalse(type.isCompatible(null));
-		assertFalse(type.isCompatible("4"));
-	}
-	
-	/**
-	 * Try to find a command that takes integers as parameters. We might find
-	 * multiple commands - just make sure we can at least find the subtract
-	 * command used elsewhere in this test suite.
-	 */
-	public void testFindIntegerParamCommand() throws CommandException {
-		Integer value = new Integer(6);
-		
-		ICommandService commandService = getCommandService();
-		Command[] commands = commandService.getDefinedCommands();
-		
-		boolean foundSubtract = false;
-		
-		for (int i = 0; i < commands.length; i++) {
-			Command command = commands[i];
-			if (!command.isDefined())
-				continue;
-			
-			IParameter[] parameters = command.getParameters();
-			if (parameters == null)
-				continue;
-			
-			if (parameters.length == 0)
-				continue;
-			
-			if (checkParamType1(command, parameters[0], value)
-					&& checkParamType2(parameters[0], value)) {
-				if (SUBTRACT.equals(command.getId())) {
-					foundSubtract = true;
-					break;
-				}
-			}
-		}
-		
-		assertTrue(foundSubtract);
-	}
-	
-	private boolean checkParamType1(Command command, IParameter parameter,
-			Object value) throws CommandException {
-		ParameterType type = command.getParameterType(parameter.getId());
-		if (type == null)
-			return false;
-		return type.isCompatible(value);
-	}
-	
-	private boolean checkParamType2(IParameter parameter, Object value)
-			throws CommandException {
-		if (!(parameter instanceof ITypedParameter))
-			return false;
-		ParameterType type = ((ITypedParameter) parameter).getParameterType();
-		if (type == null)
-			return false;
-		return type.isCompatible(value);
-	}
-	
-	
-	/**
-	 * Test {@link Command#getReturnType()}, making sure we can get the return
-	 * type of the subtract command.
-	 */
-	public void testGetReturnType() throws CommandException {
-		ICommandService commandService = getCommandService();
-		Command command = commandService.getCommand(SUBTRACT);
-		
-		ParameterType returnType = command.getReturnType();
-		assertNotNull(returnType);
-		assertEquals(TYPE, returnType.getId());
-	}
-	
-	private ICommandService getCommandService() {
-		Object serviceObject = getWorkbench().getAdapter(ICommandService.class);
-		if (serviceObject != null) {
-			ICommandService service = (ICommandService) serviceObject;
-			return service;
-		}
-		return null;
-	}
-	
-	/**
-	 * Test {@link ParameterizedCommand}, making sure the order of
-	 * the parameters is not important.
-	 */
-	public void testUnrelevantOrder() throws NotDefinedException {
-		ICommandService commandService = getCommandService();
-		Command command = commandService.getCommand(SUBTRACT);
-		
-		IParameter sub = command.getParameter(SUBTRAHEND);
-		IParameter min = command.getParameter(MINUEND);
-		Parameterization param1 = new Parameterization(sub, "5");
-		Parameterization param2 = new Parameterization(min, "3");
-
-		Parameterization[] params = new Parameterization[2];
-		params[0] = param1;
-		params[1] = param2;
-
-		Parameterization[] params1 = new Parameterization[2];
-		params1[0] = param2;
-		params1[1] = param1;
-		
-		ParameterizedCommand pCommand1 = new ParameterizedCommand(command, params);
-		ParameterizedCommand pCommand2 = new ParameterizedCommand(command, params1);
-		
-		assertTrue(pCommand1.equals(pCommand2));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandSerializationTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandSerializationTest.java
deleted file mode 100644
index 1e16b0c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandSerializationTest.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.commands;
-
-import java.util.Map;
-
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.SerializationException;
-import org.eclipse.core.commands.common.CommandException;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test serialization and deserialization of ParameterizedCommands. See <a
- * href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120523">bug 120523</a>.
- * 
- * @since 3.2
- */
-public class CommandSerializationTest extends UITestCase {
-
-	/**
-	 * Constructs a new instance of <code>CommandSerializationTest</code>.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public CommandSerializationTest(String testName) {
-		super(testName);
-	}
-	
-	private final String showPerspectiveCommandId = "org.eclipse.ui.perspectives.showPerspective";
-	
-	/**
-	 * Test a serialization of the show perspective command with no parameters.
-	 * 
-	 * @throws CommandException
-	 */
-	public void testSerializeShowPerspective() throws CommandException {
-
-		testDeserializeAndSerialize(showPerspectiveCommandId,
-				showPerspectiveCommandId, 0, null, null);
-
-		// test with unnecessary (but valid) trailing "()" characters
-		testDeserializeAndSerialize(showPerspectiveCommandId+"()",
-				showPerspectiveCommandId, 0, null, null);
-	}
-	
-	
-	/**
-	 * Test a serialization of the show perspective command with a parameter.
-	 * 
-	 * @throws CommandException
-	 */
-	public void testSerializeShowResourcePerspective() throws CommandException {
-		
-		final String serializedShowResourcePerspectiveCommand = "org.eclipse.ui.perspectives.showPerspective(org.eclipse.ui.perspectives.showPerspective.perspectiveId=org.eclipse.ui.resourcePerspective)";
-		final String showPerspectiveParameterId = "org.eclipse.ui.perspectives.showPerspective.perspectiveId";
-		final String resourcePerspectiveId = "org.eclipse.ui.resourcePerspective";
-
-		testDeserializeAndSerialize(serializedShowResourcePerspectiveCommand,
-				showPerspectiveCommandId, 1,
-				new String[] { showPerspectiveParameterId },
-				new String[] { resourcePerspectiveId });
-		
-	}
-	
-	/**
-	 * Test serialization of a command with zero parameters.
-	 * 
-	 * @throws CommandException
-	 */
-	public void testZeroParameterCommand() throws CommandException {
-		final String zeroParameterCommandId = "org.eclipse.ui.tests.commands.zeroParameterCommand";
-
-		// basic test
-		testDeserializeAndSerialize(zeroParameterCommandId,
-				zeroParameterCommandId, 0, null, null);
-		
-		// test with a bogus parameter
-		testDeserializeAndSerialize(zeroParameterCommandId
-				+ "(bogus.param=hello)", zeroParameterCommandId, 1, null, null);
-	}
-	
-	/**
-	 * Test serialization of a command with one parameter.
-	 * 
-	 * @throws CommandException
-	 */
-	public void testOneParameterCommand() throws CommandException {
-		final String oneParameterCommandId = "org.eclipse.ui.tests.commands.oneParameterCommand";
-		final String paramId1 = "param1.1";
-
-		// basic test
-		testDeserializeAndSerialize(oneParameterCommandId + "(param1.1=hello)",
-				oneParameterCommandId, 1, new String[] { paramId1 },
-				new String[] { "hello" });
-
-		// try it with null value param
-		testDeserializeAndSerialize(oneParameterCommandId + "(param1.1)",
-				oneParameterCommandId, 1, new String[] { paramId1 },
-				new String[] { null });
-
-		// try it without the param
-		testDeserializeAndSerialize(oneParameterCommandId,
-				oneParameterCommandId, 0, null, null);
-		
-		// test with a bogus parameter
-		testDeserializeAndSerialize(oneParameterCommandId
-				+ "(bogus.param=hello)", oneParameterCommandId, 1, null, null);
-		
-		// test with a bogus parameter and the real one
-		testDeserializeAndSerialize(oneParameterCommandId
-				+ "(bogus.param=hello,param1.1=foo)", oneParameterCommandId, 2,
-				new String[] { paramId1 }, new String[] { "foo" });
-	}
-	
-	/**
-	 * Test serialization of a command with two parameters.
-	 * 
-	 * @throws CommandException
-	 */
-	public void testTwoParameterCommand() throws CommandException {
-		final String twoParameterCommandId = "org.eclipse.ui.tests.commands.twoParameterCommand";
-		final String paramId1 = "param2.1";
-		final String paramId2 = "param2.2";
-
-		// basic test
-		testDeserializeAndSerialize(twoParameterCommandId
-				+ "(param2.1=hello,param2.2=goodbye)", twoParameterCommandId, 2,
-				new String[] { paramId1, paramId2 }, new String[] { "hello",
-						"goodbye" });
-		
-		// re-order parameters
-		testDeserializeAndSerialize(twoParameterCommandId
-				+ "(param2.2=goodbye,param2.1=hello)", twoParameterCommandId, 2,
-				new String[] { paramId1, paramId2 }, new String[] { "hello",
-						"goodbye" });
-		
-		// parameter values that need escaping
-		final String value1Escaped = "hello%(%)%%%=%,";
-		final String value2Escaped = "%%%=%(%)%,world";
-		testDeserializeAndSerialize(twoParameterCommandId + "(param2.1="
-				+ value1Escaped + ",param2.2=" + value2Escaped + ")",
-				twoParameterCommandId, 2, new String[] { paramId1, paramId2 },
-				new String[] { "hello()%=,", "%=(),world" });
-	}
-	
-	/**
-	 * Test serialization of a command with three parameters.
-	 * 
-	 * @throws CommandException
-	 */
-	public void testThreeParameterCommand() throws CommandException {
-		final String threeParameterCommandId = "org.eclipse.ui.tests.commands.threeParameterCommand";
-		final String paramId1 = "param3.1";
-		final String paramId2 = "param3.2";
-		final String paramId3 = "param3.3";
-
-		// basic test
-		testDeserializeAndSerialize(threeParameterCommandId
-				+ "(param3.1=foo,param3.2=bar,param3.3=baz)",
-				threeParameterCommandId, 3, new String[] { paramId1, paramId2,
-						paramId3 }, new String[] { "foo", "bar", "baz" });
-		
-		// test with a null parameter
-		testDeserializeAndSerialize(threeParameterCommandId
-				+ "(param3.1,param3.2=bar,param3.3=baz)",
-				threeParameterCommandId, 3, new String[] { paramId1, paramId2,
-						paramId3 }, new String[] { null, "bar", "baz" });
-		
-		// test with all null parameters
-		testDeserializeAndSerialize(threeParameterCommandId
-				+ "(param3.1,param3.2,param3.3)",
-				threeParameterCommandId, 3, new String[] { paramId1, paramId2,
-						paramId3 }, new String[] { null, null, null });
-		
-		// test with a missing parameter
-		testDeserializeAndSerialize(threeParameterCommandId
-				+ "(param3.1=foo,param3.3=baz)", threeParameterCommandId, 2,
-				new String[] { paramId1, paramId3 }, new String[] { "foo",
-						"baz" });
-	}
-
-	
-	/**
-	 * Test serialization of a command with names that need UTF-8 encoding.
-	 * 
-	 * @throws CommandException
-	 */
-	public void testFunnyNamesCommand() throws CommandException {
-		final String funnyNamesCommandId = "org.eclipse.ui.tests.command.with.f=%)(,unny.name";
-		final String funnyNamesCommandIdEncoded = "org.eclipse.ui.tests.command.with.f%=%%%)%(%,unny.name";
-
-		final String funnyNamesParamId = "param.with.F({'><+|.)=,%.name";
-		final String funnyNamesParamIdEncoded = "param.with.F%({'><+|.%)%=%,%%.name";
-
-		final String funnyValue = "= %,.&\n\t\r?*[](){}";
-		final String funnyValueEncoded = "%= %%%,.&\n\t\r?*[]%(%){}";
-
-		final String serializedFunnyNamesCommand = funnyNamesCommandIdEncoded
-				+ "(" + funnyNamesParamIdEncoded + "=" + funnyValueEncoded + ")";
-
-		// basic test
-		testDeserializeAndSerialize(serializedFunnyNamesCommand,
-				funnyNamesCommandId, 1, new String[] { funnyNamesParamId },
-				new String[] { funnyValue });
-	}
-	
-	public void testMalformedSerializationStrings() {
-		// try a missing closing ')'
-		expectSerializationException(showPerspectiveCommandId + "(");
-		
-		// try a bad escape sequence
-		expectSerializationException("some.command.foo%bar");
-	}
-	
-	public void testUndefinedCommands() {
-		expectNotDefinedException("this.command.ain't.defined(i.hope)");
-	}
-	
-	/**
-	 * Test deserializing a stored command and then serializing it back into a
-	 * string. The <code>serializedParameterizedCommand</code> may contain
-	 * some "bogus" parameters (ones not defined in the command registry for the
-	 * command). The <code>paramIds</code> and <code>paramValues</code>
-	 * arrays represent only the ids and values of the non-bogus serialized
-	 * parameters.
-	 * 
-	 * @param serializedParameterizedCommand
-	 *            a command serialization string
-	 * @param commandId
-	 *            id of the serialized command
-	 * @param serializedParamCount
-	 *            number of parameters in the serialization (some may be bogus)
-	 * @param paramIds
-	 *            parameter ids in the serialization that represent real
-	 *            parameters in the command
-	 * @param paramValues
-	 *            parameter values in the serialization (same number and order
-	 *            as paramIds)
-	 * @throws CommandException
-	 */
-	private void testDeserializeAndSerialize(
-			String serializedParameterizedCommand, String commandId,
-			int serializedParamCount, String[] paramIds, String[] paramValues)
-			throws CommandException {
-		
-		ICommandService commandService = getCommandService();
-		
-		int realParamCount = (paramIds == null) ? 0 : paramIds.length;
-
-		// first convert the serialized string to a ParameterizedCommand and
-		// check the parts
-		ParameterizedCommand pCommand = commandService
-				.deserialize(serializedParameterizedCommand);
-		assertNotNull(pCommand);
-		assertEquals(commandId, pCommand.getId());
-
-		Map paramMap = pCommand.getParameterMap();
-		assertEquals(realParamCount, paramMap.size());
-
-		if (paramIds != null) {
-			for (int i = 0; i < realParamCount; i++) {
-				assertTrue(paramMap.containsKey(paramIds[i]));
-				assertEquals(paramValues[i], paramMap.get(paramIds[i]));
-			}
-		}
-
-		// now convert the ParameterizedCommand back to a serialized string
-		String serialization = pCommand.serialize();
-		
-		if ((realParamCount == serializedParamCount) && (realParamCount < 2)) {
-			if ((realParamCount == 0)
-					&& (serializedParameterizedCommand.endsWith("()"))) {
-				// empty "()" is ok, but the re-serialization won't have it
-				// so add it back for comparison....
-				assertEquals(serializedParameterizedCommand, serialization
-						+ "()");
-			} else {
-				assertEquals(serializedParameterizedCommand, serialization);
-			}
-		} else {
-			// params may have been re-ordered so we can't compare
-		}
-		
-		// deserialize again and use .equals() on the ParameterizedCommands
-		ParameterizedCommand pCommand2 = commandService.deserialize(serialization);
-		assertEquals(pCommand, pCommand2);
-	}
-	
-	private void expectSerializationException(String serializedParameterizedCommand) {
-		ICommandService commandService = getCommandService();
-		
-		try {
-			commandService.deserialize(serializedParameterizedCommand);
-			fail("expected SerializationException");
-		} catch (SerializationException ex) {
-			// passed
-		} catch (NotDefinedException ex) {
-			fail("expected SerializationException");
-		}
-	}
-	
-	private void expectNotDefinedException(String serializedParameterizedCommand) {
-		ICommandService commandService = getCommandService();
-		
-		try {
-			commandService.deserialize(serializedParameterizedCommand);
-			fail("expected NotDefinedException");
-		} catch (SerializationException ex) {
-			fail("expected NotDefinedException");
-		} catch (NotDefinedException ex) {
-			// passed
-		}
-	}
-	
-	private ICommandService getCommandService() {
-		Object serviceObject = getWorkbench().getAdapter(ICommandService.class);
-		if (serviceObject != null) {
-			ICommandService service = (ICommandService) serviceObject;
-			return service;
-		}
-		return null;
-	}
-	
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandsTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandsTestSuite.java
deleted file mode 100644
index fcaa0f0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/CommandsTestSuite.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.commands;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Tests for all areas of command support for the platform.
- */
-public final class CommandsTestSuite extends TestSuite {
-
-	/**
-	 * Returns the suite. This is required to use the JUnit Launcher.
-	 */
-	public static final Test suite() {
-		return new CommandsTestSuite();
-	}
-
-	/**
-	 * Construct the test suite.
-	 */
-	public CommandsTestSuite() {
-		addTest(new TestSuite(Bug66182Test.class));
-		addTest(new TestSuite(Bug70503Test.class));
-		addTest(new TestSuite(Bug73756Test.class));
-		addTest(new TestSuite(Bug74982Test.class));
-		addTest(new TestSuite(Bug74990Test.class));
-		addTest(new TestSuite(Bug87856Test.class));
-		addTest(new TestSuite(Bug125792Test.class));
-		addTest(new TestSuite(CommandManagerTest.class));
-		addTest(new TestSuite(CommandParameterTypeTest.class));
-		addTest(new TestSuite(CommandSerializationTest.class));
-		addTest(new TestSuite(HelpContextIdTest.class));
-		addTest(new TestSuite(StateTest.class));
-		addTest(new TestSuite(HandlerActivationTest.class));
-		addTest(new TestSuite(CommandCallbackTest.class));
-		addTest(new TestSuite(CommandEnablementTest.class));
-		addTest(new TestSuite(CommandActionTest.class));
-		addTest(new TestSuite(ActionDelegateProxyTest.class));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/HandlerActivationTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/HandlerActivationTest.java
deleted file mode 100644
index d383c4f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/HandlerActivationTest.java
+++ /dev/null
@@ -1,446 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.commands;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.Category;
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.IHandler;
-import org.eclipse.core.commands.NotEnabledException;
-import org.eclipse.core.commands.NotHandledException;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.contexts.Context;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.ISources;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.contexts.IContextActivation;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.handlers.HandlerUtil;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.services.IServiceLocator;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.views.contentoutline.ContentOutline;
-
-/**
- * Tests various aspects of command state.
- * 
- * @since 3.2
- */
-public class HandlerActivationTest extends UITestCase {
-	static class ActTestHandler extends AbstractHandler {
-		public String contextId;
-
-		public int executionCount = 0;
-
-		public ActTestHandler(String id) {
-			super();
-			contextId = id;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-		 */
-		public Object execute(ExecutionEvent event) {
-			executionCount++;
-			return null;
-		}
-
-	}
-
-	static class OutlineOnlyHandler extends AbstractHandler {
-		public Object execute(ExecutionEvent event) throws ExecutionException {
-			IWorkbenchPart part = HandlerUtil.getActivePartChecked(event);
-			if (!(part instanceof ContentOutline)) {
-				throw new ExecutionException("bogus part "
-						+ part.getSite().getId());
-			}
-			return null;
-		}
-
-		public void setEnabled(Object evaluationContext) {
-			IWorkbenchPart part = (IWorkbenchPart) HandlerUtil.getVariable(
-					evaluationContext, ISources.ACTIVE_PART_NAME);
-			setBaseEnabled(part instanceof ContentOutline);
-		}
-	}
-
-	public static final String C_PREFIX = "org.eclipse.ui.tests.contexts.";
-
-	public static final String C1_ID = C_PREFIX + ISources.ACTIVE_CONTEXT_NAME;
-
-	public static final String C2_ID = C_PREFIX
-			+ ISources.ACTIVE_ACTION_SETS_NAME;
-
-	public static final String C3_ID = C_PREFIX + ISources.ACTIVE_SHELL_NAME;
-
-	public static final String C4_ID = C_PREFIX
-			+ ISources.ACTIVE_WORKBENCH_WINDOW_SHELL_NAME;
-
-	private static final String CATEGORY_ID = "org.eclipse.ui.category.window";
-
-	public static final String CMD_ID = C_PREFIX + "command.testHandler";
-
-	private static final String[][] CREATE_CONTEXTS = {
-			{ C1_ID, "Active Contexts", null, IContextService.CONTEXT_ID_WINDOW },
-			{ C2_ID, "Active Action Sets", null,
-					IContextService.CONTEXT_ID_WINDOW },
-			{ C3_ID, "Active Shell", null, IContextService.CONTEXT_ID_WINDOW },
-			{ C4_ID, "Active Workbench Window Shell", null,
-					IContextService.CONTEXT_ID_WINDOW },
-			{ (C_PREFIX + ISources.ACTIVE_MENU_NAME),
-					"Active Workbench Window Shell", null,
-					IContextService.CONTEXT_ID_WINDOW }, };
-
-	public static final String H1 = C_PREFIX + "h1";
-
-	public static final String H2 = C_PREFIX + "h2";
-
-	public static final String H3 = C_PREFIX + "h3";
-
-	private ICommandService commandService;
-
-	private IContextService contextService;
-
-	private IHandlerService handlerService;
-
-	private IServiceLocator services;
-
-	private Map testContextActivations = new HashMap();
-
-	private Map testHandlerActivations = new HashMap();
-
-	private Map testHandlers = new HashMap();
-
-	/**
-	 * Constructor for <code>HandlerActivationTest</code>.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public HandlerActivationTest(String name) {
-		super(name);
-		services = PlatformUI.getWorkbench();
-		contextService = (IContextService) services
-				.getService(IContextService.class);
-		commandService = (ICommandService) services
-				.getService(ICommandService.class);
-		handlerService = (IHandlerService) services
-				.getService(IHandlerService.class);
-	}
-
-	private IContextActivation activateContext(String contextId) {
-		IContextActivation c = contextService.activateContext(contextId);
-		testContextActivations.put(contextId, c);
-		return c;
-	}
-
-	/**
-	 * @param cmd
-	 * @param handlerId
-	 * @throws ExecutionException
-	 * @throws NotDefinedException
-	 * @throws NotEnabledException
-	 * @throws NotHandledException
-	 */
-	private void assertHandlerIsExecuted(Command cmd, String handlerId)
-			throws ExecutionException, NotDefinedException,
-			NotEnabledException, NotHandledException {
-		ActTestHandler handler = (ActTestHandler) testHandlers.get(handlerId);
-		int count = handler.executionCount;
-		cmd.executeWithChecks(new ExecutionEvent());
-		assertEquals("The handler count should be incremented", count + 1,
-				handler.executionCount);
-	}
-
-	/**
-	 * @param contextId
-	 * @param handlerId
-	 * @param expressionInfo
-	 */
-	private void createHandlerActivation(String contextId, String handlerId,
-			String[] expressionInfo) {
-		ActiveContextExpression expression;
-		expression = new ActiveContextExpression(contextId, expressionInfo);
-		makeHandler(handlerId, contextId, expression);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doSetUp()
-	 */
-	protected void doSetUp() throws Exception {
-		for (int i = 0; i < CREATE_CONTEXTS.length; i++) {
-			final String[] contextInfo = CREATE_CONTEXTS[i];
-			final Context context = contextService.getContext(contextInfo[0]);
-			if (!context.isDefined()) {
-				context.define(contextInfo[1], contextInfo[2], contextInfo[3]);
-			}
-		}
-
-		Command cmd = commandService.getCommand(CMD_ID);
-		if (!cmd.isDefined()) {
-			Category cat = commandService.getCategory(CATEGORY_ID);
-			cmd.define("Test Handler", "Test handler activation", cat);
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doTearDown()
-	 */
-	protected void doTearDown() throws Exception {
-		handlerService.deactivateHandlers(testHandlerActivations.values());
-		testHandlerActivations.clear();
-		contextService.deactivateContexts(testContextActivations.values());
-		testContextActivations.clear();
-		super.doTearDown();
-	}
-
-	/**
-	 * @throws ExecutionException
-	 * @throws NotDefinedException
-	 * @throws NotEnabledException
-	 * @throws NotHandledException
-	 */
-	private void doTestForBreak() throws ExecutionException,
-			NotDefinedException, NotEnabledException, NotHandledException {
-		Command cmd = commandService.getCommand(CMD_ID);
-		assertTrue("Command should be defined", cmd.isDefined());
-
-		assertFalse("Should not be handled yet", cmd.isHandled());
-
-		IContextActivation c1 = activateContext(C1_ID);
-		IContextActivation c2 = activateContext(C2_ID);
-		IContextActivation c3 = activateContext(C3_ID);
-
-		assertTrue("Should still be handled", cmd.isHandled());
-
-		assertHandlerIsExecuted(cmd, H3);
-
-		contextService.deactivateContext(c3);
-		contextService.deactivateContext(c2);
-		contextService.deactivateContext(c1);
-	}
-
-	/**
-	 * @param currentHandler
-	 * @param expression1
-	 */
-	private void makeHandler(String handler, String context,
-			ActiveContextExpression expression) {
-		IHandler currentHandler = null;
-		if (!testHandlers.containsKey(handler)) {
-			currentHandler = new ActTestHandler(context);
-			testHandlers.put(handler, currentHandler);
-		} else {
-			currentHandler = (IHandler) testHandlers.get(handler);
-		}
-
-		testHandlerActivations.put(handler, handlerService.activateHandler(
-				CMD_ID, currentHandler, expression));
-	}
-
-	public void testBasicHandler() throws Exception {
-
-		createHandlerActivation(C1_ID, H1,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME });
-
-		Command cmd = commandService.getCommand(CMD_ID);
-		assertTrue("Command should be defined", cmd.isDefined());
-
-		assertFalse("Should not be handled yet", cmd.isHandled());
-
-		IContextActivation activationC1 = activateContext(C1_ID);
-		assertTrue("Should definitely be handled", cmd.isHandled());
-
-		ActTestHandler handler1 = (ActTestHandler) testHandlers.get(H1);
-		int count = handler1.executionCount;
-		cmd.executeWithChecks(new ExecutionEvent());
-		assertEquals("The handler count should be correct", count + 1,
-				handler1.executionCount);
-
-		contextService.deactivateContext(activationC1);
-
-		assertFalse("Should not be handled", cmd.isHandled());
-	}
-
-	public void testForBreak123() throws Exception {
-		createHandlerActivation(C1_ID, H1,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME });
-		createHandlerActivation(C2_ID, H2,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME,
-						ISources.ACTIVE_ACTION_SETS_NAME });
-		createHandlerActivation(C3_ID, H3, new String[] {
-				ISources.ACTIVE_CONTEXT_NAME, ISources.ACTIVE_SHELL_NAME });
-
-		doTestForBreak();
-	}
-
-	public void testForBreak132() throws Exception {
-		createHandlerActivation(C1_ID, H1,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME });
-		createHandlerActivation(C3_ID, H3, new String[] {
-				ISources.ACTIVE_CONTEXT_NAME, ISources.ACTIVE_SHELL_NAME });
-		createHandlerActivation(C2_ID, H2,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME,
-						ISources.ACTIVE_ACTION_SETS_NAME });
-
-		doTestForBreak();
-	}
-
-	public void testForBreak213() throws Exception {
-		createHandlerActivation(C2_ID, H2,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME,
-						ISources.ACTIVE_ACTION_SETS_NAME });
-		createHandlerActivation(C1_ID, H1,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME });
-		createHandlerActivation(C3_ID, H3, new String[] {
-				ISources.ACTIVE_CONTEXT_NAME, ISources.ACTIVE_SHELL_NAME });
-
-		doTestForBreak();
-	}
-
-	public void testForBreak231() throws Exception {
-		createHandlerActivation(C2_ID, H2,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME,
-						ISources.ACTIVE_ACTION_SETS_NAME });
-		createHandlerActivation(C3_ID, H3, new String[] {
-				ISources.ACTIVE_CONTEXT_NAME, ISources.ACTIVE_SHELL_NAME });
-		createHandlerActivation(C1_ID, H1,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME });
-
-		doTestForBreak();
-	}
-
-	public void testForBreak312() throws Exception {
-		createHandlerActivation(C3_ID, H3, new String[] {
-				ISources.ACTIVE_CONTEXT_NAME, ISources.ACTIVE_SHELL_NAME });
-		createHandlerActivation(C1_ID, H1,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME });
-		createHandlerActivation(C2_ID, H2,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME,
-						ISources.ACTIVE_ACTION_SETS_NAME });
-
-		doTestForBreak();
-	}
-
-	public void testForBreak321() throws Exception {
-		createHandlerActivation(C3_ID, H3, new String[] {
-				ISources.ACTIVE_CONTEXT_NAME, ISources.ACTIVE_SHELL_NAME });
-		createHandlerActivation(C2_ID, H2,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME,
-						ISources.ACTIVE_ACTION_SETS_NAME });
-		createHandlerActivation(C1_ID, H1,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME });
-
-		doTestForBreak();
-	}
-
-	public void testForNegativeNumber() throws Exception {
-		String c5_id = C_PREFIX + ISources.ACTIVE_MENU_NAME;
-		String h5 = C_PREFIX + "h5";
-		createHandlerActivation(c5_id, h5, new String[] {
-				ISources.ACTIVE_CONTEXT_NAME, ISources.ACTIVE_MENU_NAME });
-		createHandlerActivation(C1_ID, H1,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME });
-
-		Command cmd = commandService.getCommand(CMD_ID);
-
-		activateContext(C1_ID);
-		activateContext(c5_id);
-
-		assertHandlerIsExecuted(cmd, h5);
-	}
-
-	public void testTwoHandlers() throws Exception {
-		createHandlerActivation(C1_ID, H1,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME });
-		createHandlerActivation(C2_ID, H2,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME,
-						ISources.ACTIVE_ACTION_SETS_NAME });
-
-		Command cmd = commandService.getCommand(CMD_ID);
-		assertTrue("Command should be defined", cmd.isDefined());
-
-		assertFalse("Should not be handled yet", cmd.isHandled());
-		IContextActivation activationC1 = activateContext(C1_ID);
-		assertTrue("Should definitely be handled", cmd.isHandled());
-
-		ActTestHandler handler1 = (ActTestHandler) testHandlers.get(H1);
-		int count1 = handler1.executionCount;
-		cmd.executeWithChecks(new ExecutionEvent());
-		assertEquals("The handler count should be incremented", count1 + 1,
-				handler1.executionCount);
-
-		activateContext(C2_ID);
-		assertTrue("Should still be handled", cmd.isHandled());
-
-		ActTestHandler handler2 = (ActTestHandler) testHandlers.get(H2);
-		int count2 = handler2.executionCount;
-		count1 = handler1.executionCount;
-		cmd.executeWithChecks(new ExecutionEvent());
-		assertEquals("The handler1 count should not be incremented", count1,
-				handler1.executionCount);
-		assertEquals("The handler2 count should be incremented", count2 + 1,
-				handler2.executionCount);
-
-		contextService.deactivateContext(activationC1);
-		assertTrue("Will still be handled", cmd.isHandled());
-	}
-
-	public void testLocalContext() throws Exception {
-		IWorkbenchWindow window = openTestWindow("org.eclipse.ui.resourcePerspective");
-		OutlineOnlyHandler handler = new OutlineOnlyHandler();
-		IEvaluationContext oldContext = handlerService
-				.createContextSnapshot(false);
-		testHandlerActivations.put(handler, handlerService.activateHandler(
-				CMD_ID, handler));
-		Command cmd = commandService.getCommand(CMD_ID);
-		ParameterizedCommand pcmd = new ParameterizedCommand(cmd, null);
-		try {
-			handlerService.executeCommand(pcmd, null);
-			fail("this should not be executable");
-		} catch (NotEnabledException e) {
-			// good
-		}
-		assertFalse(cmd.isEnabled());
-		window.getActivePage().showView(IPageLayout.ID_OUTLINE);
-		IEvaluationContext outlineContext = handlerService.createContextSnapshot(false);
-		handlerService.executeCommand(pcmd, null);
-		assertTrue(cmd.isEnabled());
-		
-		try {
-			handlerService.executeCommandInContext(pcmd, null, oldContext);
-			fail("this should not be executable");
-		} catch (NotEnabledException e) {
-			// good
-		}
-		
-		assertTrue(cmd.isEnabled());
-		handlerService.executeCommandInContext(pcmd, null, outlineContext);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/HelpContextIdTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/HelpContextIdTest.java
deleted file mode 100644
index 62aa3ea..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/HelpContextIdTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.commands;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests the new help context identifier support on commands and handlers.
- * 
- * @since 3.2
- */
-public final class HelpContextIdTest extends UITestCase {
-
-	private static final String COMMAND_HELP_ID = "org.eclipse.ui.tests.commandHelp";
-
-	private static final String COMMAND_ID = "org.eclipse.ui.tests.helpContextId";
-
-	private static final String HANDLER_HELP_ID = "org.eclipse.ui.tests.handlerHelp";
-
-	private static final String NEW_HELP_ID = "new_help_id";
-
-	/**
-	 * Constructs a new instance of <code>HelpContextIdTest</code>
-	 * 
-	 * @param testName
-	 *            The name of the test; may be <code>null</code>.
-	 */
-	public HelpContextIdTest(final String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Tests the reading of the help context identifier of the registry, as well
-	 * as programmatic changes. It does not test whether there is notification.
-	 * 
-	 * @throws NotDefinedException
-	 *             If the command defined in the registry is somehow not
-	 *             defined.
-	 */
-	public final void testHelpContextId() throws NotDefinedException {
-		final ICommandService commandService = (ICommandService) fWorkbench
-				.getService(ICommandService.class);
-		final IHandlerService handlerService = (IHandlerService) fWorkbench
-				.getService(IHandlerService.class);
-		String helpContextId = null;
-
-		// At first, the help context id should be the handler.
-		helpContextId = commandService.getHelpContextId(COMMAND_ID);
-		assertEquals(
-				"The initial help context id should be that of the handler",
-				HANDLER_HELP_ID, helpContextId);
-
-		// Retract the handler help context id by creating a handler conflict.
-		handlerService.activateHandler(COMMAND_ID, new AbstractHandler() {
-			public final Object execute(final ExecutionEvent event) {
-				return null;
-			}
-		});
-		helpContextId = commandService.getHelpContextId(COMMAND_ID);
-		assertEquals("The help context id should now be that of the command",
-				COMMAND_HELP_ID, helpContextId);
-
-		// Now undefine the command and check that an exception is thrown.
-		final Command command = commandService.getCommand(COMMAND_ID);
-		command.undefine();
-		try {
-			helpContextId = commandService.getHelpContextId(COMMAND_ID);
-			fail("A NotDefinedException should have been thrown");
-		} catch (final NotDefinedException e) {
-			// success
-		}
-
-		// Now define the command with a different help context id.
-		command.define("New Name", null, commandService.getCategory(null),
-				null, null, NEW_HELP_ID);
-		helpContextId = commandService.getHelpContextId(COMMAND_ID);
-		assertEquals("The help context id should now be the new id",
-				NEW_HELP_ID, helpContextId);
-	}
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/IntegerConverter.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/IntegerConverter.java
deleted file mode 100644
index 9866d48..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/IntegerConverter.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.commands;
-
-import org.eclipse.core.commands.AbstractParameterValueConverter;
-import org.eclipse.core.commands.ParameterValueConversionException;
-
-public class IntegerConverter extends AbstractParameterValueConverter {
-
-	public Object convertToObject(String parameterValue)
-			throws ParameterValueConversionException {
-		try {
-			int val = Integer.parseInt(parameterValue);
-			return new Integer(val);
-		} catch (NumberFormatException ex) {
-			throw new ParameterValueConversionException(
-					"Error parsing value: " + parameterValue, ex);
-		}
-	}
-	
-	public String convertToString(Object parameterValue)
-			throws ParameterValueConversionException {
-		if (!(parameterValue instanceof Integer)) {
-			throw new ParameterValueConversionException("Invalid object type: "
-					+ parameterValue);
-		}
-		Integer val = (Integer) parameterValue;
-		return val.toString();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/StateTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/StateTest.java
deleted file mode 100644
index 3079b38..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/StateTest.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.commands;
-
-import org.eclipse.core.commands.AbstractHandlerWithState;
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.IStateListener;
-import org.eclipse.core.commands.State;
-import org.eclipse.core.commands.common.CommandException;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.handlers.IHandlerActivation;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests various aspects of command state.
- * 
- * @since 3.2
- */
-public class StateTest extends UITestCase {
-
-	private static final class ObjectStateHandler extends
-			AbstractHandlerWithState {
-
-		Object currentValue;
-
-		public final Object execute(final ExecutionEvent event) {
-			getState(OBJECT_STATE_ID).setValue(OBJECT_CHANGED);
-			return OBJECT_CHANGED;
-		}
-
-		public final void handleStateChange(final State state,
-				final Object oldValue) {
-			if (OBJECT_STATE_ID.equals(state.getId())) {
-				currentValue = state.getValue();
-			}
-		}
-	}
-
-	private static final class StateListener implements IStateListener {
-		Object currentValue;
-
-		public final void handleStateChange(final State state,
-				final Object oldValue) {
-
-			if (OBJECT_STATE_ID.equals(state.getId())) {
-				currentValue = state.getValue();
-			}
-		}
-	}
-
-	/**
-	 * The identifier of the command with state that we wish to test.
-	 */
-	private static final String COMMAND_ID = "org.eclipse.ui.tests.commandWithState";
-
-	/**
-	 * The object to which the command is set as a test.
-	 */
-	private static final Object OBJECT_CHANGED = "CHANGED";
-
-	/**
-	 * The object to which the command is set before the test starts.
-	 */
-	private static final Object OBJECT_INITIAL = "INITIAL";
-
-	/**
-	 * The identifier of the state storing a simple object.
-	 */
-	private static final String OBJECT_STATE_ID = "OBJECT";
-
-	/**
-	 * The object state handler.
-	 */
-	private ObjectStateHandler handler;
-
-	/**
-	 * The handler activation for the object state handler.
-	 */
-	private IHandlerActivation handlerActivation;
-
-	/**
-	 * Constructor for <code>StateTest</code>.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public StateTest(String name) {
-		super(name);
-	}
-
-	protected final void doSetUp() {
-		// Reset the object state to the initial object.
-		final ICommandService commandService = (ICommandService) fWorkbench
-				.getService(ICommandService.class);
-		final Command command = commandService.getCommand(COMMAND_ID);
-		command.getState(OBJECT_STATE_ID).setValue(OBJECT_INITIAL);
-
-		// Register the object state handler.
-		handler = new ObjectStateHandler();
-		final IHandlerService handlerService = (IHandlerService) fWorkbench
-				.getService(IHandlerService.class);
-		handlerActivation = handlerService.activateHandler(COMMAND_ID, handler);
-	}
-
-	protected final void doTearDown() {
-		// Unregister the object state handler.
-		final IHandlerService handlerService = (IHandlerService) fWorkbench
-				.getService(IHandlerService.class);
-		handlerService.deactivateHandler(handlerActivation);
-		handlerActivation = null;
-		handler.dispose();
-		handler = null;
-	}
-
-	/**
-	 * Tests that if the handler changes the state, a listener to the state
-	 * retrieved from the command is notified.
-	 * 
-	 * @throws CommandException
-	 *             Never.
-	 */
-	public final void testCommandNotifiedOfStateChange()
-			throws CommandException {
-		// Attach a listener to the state on the command.
-		final ICommandService commandService = (ICommandService) fWorkbench
-				.getService(ICommandService.class);
-		final Command command = commandService.getCommand(COMMAND_ID);
-		final State state = command.getState(OBJECT_STATE_ID);
-		final StateListener listener = new StateListener();
-		listener.currentValue = state.getValue();
-		state.addListener(listener);
-
-		// Check the initial state.
-		assertSame("The initial state was not correct", OBJECT_INITIAL,
-				listener.currentValue);
-
-		// Run the handler.
-		final IHandlerService handlerService = (IHandlerService) fWorkbench
-				.getService(IHandlerService.class);
-		handlerService.executeCommand(COMMAND_ID, null);
-
-		// Check the state.
-		assertSame(
-				"The state on the command after the handler changed was not correct",
-				OBJECT_CHANGED, listener.currentValue);
-
-		// Remove the listener.
-		state.removeListener(listener);
-	}
-
-	/**
-	 * Tests that if the handler changes the state, the command reflects these
-	 * changes.
-	 * 
-	 * @throws CommandException
-	 *             Never.
-	 */
-	public final void testStateChangeReflectedInCommand()
-			throws CommandException {
-		// Get the command.
-		final ICommandService commandService = (ICommandService) fWorkbench
-				.getService(ICommandService.class);
-		final Command command = commandService.getCommand(COMMAND_ID);
-
-		// Check the initial state.
-		assertSame("The initial state was not correct", OBJECT_INITIAL, command
-				.getState(OBJECT_STATE_ID).getValue());
-
-		// Run the handler.
-		final IHandlerService handlerService = (IHandlerService) fWorkbench
-				.getService(IHandlerService.class);
-		handlerService.executeCommand(COMMAND_ID, null);
-
-		// Check the state.
-		assertSame(
-				"The state on the command after the handler changed was not correct",
-				OBJECT_CHANGED, command.getState(OBJECT_STATE_ID).getValue());
-	}
-
-	/**
-	 * Tests that if the command changes the state, the handler reflects these
-	 * changes.
-	 */
-	public final void testStateChangeReflectedInHandler() {
-		// Check the initial state.
-		assertSame("The initial state was not correct", OBJECT_INITIAL,
-				handler.currentValue);
-
-		// Change the state on the command.
-		final ICommandService commandService = (ICommandService) fWorkbench
-				.getService(ICommandService.class);
-		final Command command = commandService.getCommand(COMMAND_ID);
-		command.getState(OBJECT_STATE_ID).setValue(OBJECT_CHANGED);
-
-		// Check the state.
-		assertSame(
-				"The state on the command after the handler changed was not correct",
-				OBJECT_CHANGED, handler.currentValue);
-	}
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/SubtractIntegerHandler.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/SubtractIntegerHandler.java
deleted file mode 100644
index f40b28a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/SubtractIntegerHandler.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.commands;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-
-/**
- * Handler for the <code>org.eclipse.ui.tests.commands.subtractInteger</code>
- * command.
- */
-public class SubtractIntegerHandler extends AbstractHandler {
-
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		Integer minuend = (Integer) event
-				.getObjectParameterForExecution(CommandParameterTypeTest.MINUEND);
-		Integer subtrahend = (Integer) event
-				.getObjectParameterForExecution(CommandParameterTypeTest.SUBTRAHEND);
-		return new Integer(minuend.intValue() - subtrahend.intValue());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/ViewActionDelegate.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/ViewActionDelegate.java
deleted file mode 100644
index 0276559..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/commands/ViewActionDelegate.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.ui.tests.commands;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.tests.api.workbenchpart.MenuContributionHarness;
-
-/**
- * A view delegate for testing.
- * @since 3.3
- */
-public class ViewActionDelegate implements IViewActionDelegate {
-
-	private IViewPart viewPart;
-
-	public void init(IViewPart view) {
-		viewPart = view;
-	}
-
-	public void run(IAction action) {
-		if (viewPart instanceof MenuContributionHarness) {
-			((MenuContributionHarness)viewPart).updateCount();
-		}
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		// don't care
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/compare/UIComparePreferences.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/compare/UIComparePreferences.java
deleted file mode 100644
index f15b2e7..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/compare/UIComparePreferences.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.compare;
-
-import java.util.Iterator;
-
-import junit.framework.TestCase;
-
-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.swt.widgets.Shell;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.tests.dialogs.PreferenceDialogWrapper;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-public class UIComparePreferences extends TestCase {
-
-    public UIComparePreferences(String name) {
-        super(name);
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    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(),
-                    IWorkbenchHelpContextIds.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;
-    }
-
-    public void testCompareViewersPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.compare.internal.ComparePreferencePage");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/compare/UIComparePreferencesAuto.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/compare/UIComparePreferencesAuto.java
deleted file mode 100644
index 70e5632..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/compare/UIComparePreferencesAuto.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.compare;
-
-import java.util.Iterator;
-
-import junit.framework.TestCase;
-
-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.swt.widgets.Shell;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.tests.dialogs.PreferenceDialogWrapper;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-public class UIComparePreferencesAuto extends TestCase {
-
-    public UIComparePreferencesAuto(String name) {
-        super(name);
-    }
-
-    protected Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    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(),
-                    IWorkbenchHelpContextIds.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;
-    }
-
-    public void testCompareViewersPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.compare.internal.ComparePreferencePage");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/ConcurrencyTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/ConcurrencyTestSuite.java
deleted file mode 100644
index 3953091..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/ConcurrencyTestSuite.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.concurrency;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * The suite of tests related to concurrency and deadlock.
- * 
- * @since 3.1
- */
-public final class ConcurrencyTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static final Test suite() {
-        return new ConcurrencyTestSuite();
-    }
-
-    /**
-     * Constructs a new instance of <code>ConcurrencyTestSuite</code> with all of
-     * the relevant test cases.
-     */
-    public ConcurrencyTestSuite() {
-    	addTestSuite(ModalContextCrashTest.class);
-        addTestSuite(NestedSyncExecDeadlockTest.class);
-        addTestSuite(SyncExecWhileUIThreadWaitsForLock.class);
-        addTestSuite(TestBug105491.class);
-        addTestSuite(TestBug108162.class);
-        addTestSuite(TestBug138695.class);
-        addTestSuite(TestBug98621.class);
-        addTestSuite(TransferRuleTest.class);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/ModalContextCrashTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/ModalContextCrashTest.java
deleted file mode 100644
index 2157f1c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/ModalContextCrashTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.concurrency;
-
-import java.lang.reflect.InvocationTargetException;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.operation.IThreadListener;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Makes ModalContext thread crash and hang the IDE
- */
-public class ModalContextCrashTest extends TestCase {
-
-	public void testCrash() throws Exception {
-		IRunnableWithProgress operation = new CrashingRunnable();
-		try{
-			PlatformUI.getWorkbench().getActiveWorkbenchWindow().run(true, false, operation);
-			fail("Should have an invocation target exception");
-		}
-		catch (InvocationTargetException e){
-			//We should get this
-		}
-	}
-
-	private static final class CrashingRunnable implements IRunnableWithProgress, IThreadListener {
-
-		public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		}
-
-		public void threadChange(Thread thread) {
-			// only throw the exception in the finally block 
-			// of ModalContextThread
-			if (Display.findDisplay(thread) != null)
-				throw new RuntimeException("Simulated exception during threadChange");
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/NestedSyncExecDeadlockTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/NestedSyncExecDeadlockTest.java
deleted file mode 100644
index 421c80a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/NestedSyncExecDeadlockTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2004 Jeremiah Lott and others. All rights reserved.   This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   Jeremiah Lott (jeremiah.lott@timesys.com) - Initial implementation
- *   IBM Added comments, removed printlns, and incorporated into platform test suites
- **********************************************************************/
-package org.eclipse.ui.tests.concurrency;
-
-import junit.framework.TestCase;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-/**
- * This is a regression test for a case where a recursive attempt to syncExec
- * from within code that owns a lock would cause deadlock. See bug 76378 for details.
- */
-public class NestedSyncExecDeadlockTest extends TestCase {
-
-	private class ResourceListener implements IResourceChangeListener {
-		public void resourceChanged(IResourceChangeEvent event) {
-			Display.getDefault().syncExec(new Runnable() {
-				public void run() {
-				}
-			});
-		}
-	}
-
-	private IResourceChangeListener listener;
-	private IProject project;
-
-	private IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-	public NestedSyncExecDeadlockTest() {
-		super();
-	}
-
-	public NestedSyncExecDeadlockTest(String name) {
-		super(name);
-	}
-
-	public void doTest(final long timeToSleep) throws Exception {
-		ProgressMonitorDialog dialog = new ProgressMonitorDialog(new Shell());
-		dialog.run(true, false, new WorkspaceModifyOperation() {
-			public void execute(final IProgressMonitor pm) {
-				Display.getDefault().syncExec(new Runnable() {
-					public void run() {
-						try {
-							workspace.run(new IWorkspaceRunnable() {
-								public void run(IProgressMonitor mon) throws CoreException {
-									project.touch(null);
-									try {
-										// wait long enough to be sure to trigger notification
-										Thread.sleep(timeToSleep);
-									} catch (InterruptedException ex) {
-										ex.printStackTrace();
-									}
-								}
-							}, workspace.getRoot(), IResource.NONE, pm);
-							workspace.run(new IWorkspaceRunnable() {
-								public void run(IProgressMonitor mon) {
-								}
-							}, pm);
-
-						} catch (CoreException ex) {
-							ex.printStackTrace();
-						}
-					}
-				});
-			}
-		});
-	}
-
-	protected void setUp() throws Exception {
-		project = workspace.getRoot().getProject("test-deadlock");
-
-		tearDown();
-
-		project.create(null);
-		project.open(null);
-
-		listener = new ResourceListener();
-		workspace.addResourceChangeListener(listener, IResourceChangeEvent.POST_CHANGE);
-	}
-
-	protected void tearDown() throws Exception {
-		if (listener != null) {
-			workspace.removeResourceChangeListener(listener);
-		}
-		project.delete(true, true, null);
-	}
-
-	public void testDeadlock() throws Exception {
-		doTest(1000 * 30); // 30 secs almost always locks
-	}
-
-	public void testOK() throws Exception {
-		doTest(0); // 0 rarely locks		
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/SyncExecWhileUIThreadWaitsForLock.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/SyncExecWhileUIThreadWaitsForLock.java
deleted file mode 100644
index 5c9a081..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/SyncExecWhileUIThreadWaitsForLock.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.concurrency;
-
-import org.eclipse.swt.widgets.Display;
-
-import org.eclipse.core.runtime.jobs.ILock;
-
-import org.eclipse.core.runtime.jobs.Job;
-
-import junit.framework.TestCase;
-
-/**
- * This tests the simple traditional deadlock of a thread holding a lock trying
- * to perform a syncExec, while the UI thread is waiting for that lock.
- * UISynchronizer and UILockListener conspire to prevent deadlock in this case.
- */
-public class SyncExecWhileUIThreadWaitsForLock extends TestCase {
-	public void testDeadlock() {
-		final ILock lock = Job.getJobManager().newLock();
-		final boolean[] blocked = new boolean[] {false};
-		final boolean[] lockAcquired= new boolean[] {false};
-		Thread locking = new Thread("SyncExecWhileUIThreadWaitsForLock") {
-			public void run() {
-				try {
-					//first make sure this background thread owns the lock
-					lock.acquire();
-					//spawn an asyncExec that will cause the UI thread to be blocked
-					Display.getDefault().asyncExec(new Runnable() {
-						public void run() {
-							blocked[0] = true;
-							lock.acquire();
-							lock.release();
-							blocked[0] = false;
-						}
-					});
-					//wait until the UI thread is blocked waiting for the lock
-					while (!blocked[0]) {
-						try {
-							Thread.sleep(100);
-						} catch (InterruptedException e) {
-						}
-					}
-					//now attempt to do a syncExec that also acquires the lock
-					//this should succeed even while the above asyncExec is blocked, thanks to UISynchronizer
-					Display.getDefault().syncExec(new Runnable() {
-						public void run() {
-							try {
-								//use a timeout to avoid deadlock in case of regression
-								if (lock.acquire(60000)) {
-									//this flag is used to verify that we actually acquired the lock
-									lockAcquired[0] = true;
-									lock.release();
-								}
-							} catch (InterruptedException e) {
-							}
-						}
-					});
-				} finally {
-					lock.release();
-				}
-			}
-		};
-		locking.start();
-		//wait until we succeeded to acquire the lock in the UI thread
-		long waitStart = System.currentTimeMillis();
-		Display display = Display.getDefault();
-		while (!lockAcquired[0]) {
-			//spin event loop so that asyncExed above gets run
-			if (!display.readAndDispatch())
-				display.sleep();
-			//if we waited too long, fail the test
-			if (System.currentTimeMillis()-waitStart > 60000)
-				assertTrue("Deadlock occurred", false);
-		}
-		//if we get here, the test succeeded
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/TestBug105491.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/TestBug105491.java
deleted file mode 100644
index 1832ada..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/TestBug105491.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.concurrency;
-
-import java.lang.reflect.InvocationTargetException;
-import junit.framework.*;
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IThreadListener;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-/**
- * Tests the following sequence of events:
- * 1) Workspace operation starts in the UI thread.  Workspace lock is taken, and a modal context thread is forked (call this modal context MC1).
- * 2) Operation transfers the workspace lock to MC1 using IJobManager.transferRule
- * 3) Operation runs in MC1, scheduling an asyncExec.
- * 4) MC1 passes the scheduling rule back to UI thread, and exits
- * 5) After passing the rule back to the UI thread, but before MC1 dies, the asyncExec is run.
- * 6) The asyncExec forks another model context (MC2), and blocks the UI thread in another event loop.
- * 7) MC2 tries to acquire the workspace lock and deadlocks, because at this point it has been transferred to the UI thread
- * 
- * NOTE: This bug has not yet been fixed.  This test illustrates the problem, but must
- * not be added to the parent test suite until the problem has been fixed.
- */
-public class TestBug105491 extends TestCase {
-	class TransferTestOperation extends WorkspaceModifyOperation implements IThreadListener {
-		public void execute(final IProgressMonitor pm) {
-			//clients assume this would not deadlock because it runs in an asyncExec
-			Display.getDefault().asyncExec(new Runnable() {
-				public void run() {
-					ProgressMonitorDialog dialog = new ProgressMonitorDialog(new Shell());
-					try {
-						dialog.run(true, false, new WorkspaceModifyOperation() {
-							protected void execute(IProgressMonitor monitor) {}
-						});
-					} catch (InvocationTargetException e) {
-						e.printStackTrace();
-						fail(e.getMessage());
-					} catch (InterruptedException e) {
-						//ignore
-					}
-				}
-			});
-		}
-
-		public void threadChange(Thread thread) {
-			Platform.getJobManager().transferRule(workspace.getRoot(), thread);
-		}
-	}
-
-	private IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-	public TestBug105491() {
-		super();
-	}
-
-	public TestBug105491(String name) {
-		super(name);
-	}
-
-	/**
-	 * Performs the test
-	 */
-	public void testBug() throws CoreException {
-		workspace.run(new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) {
-				ProgressMonitorDialog dialog = new ProgressMonitorDialog(new Shell());
-				try {
-					dialog.run(true, false, new TransferTestOperation());
-				} catch (InvocationTargetException e) {
-					e.printStackTrace();
-					fail(e.getMessage());
-				} catch (InterruptedException e) {
-					//ignore
-				}
-			}
-		}, workspace.getRoot(), IResource.NONE, null);
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/TestBug108162.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/TestBug108162.java
deleted file mode 100644
index 208d99d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/TestBug108162.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.concurrency;
-
-import java.lang.reflect.InvocationTargetException;
-import junit.framework.TestCase;
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-/**
- * Tests the following sequence of events:
- * 1) acquire a lock in the UI thread
- * 2) execute an operation (e.g. MoveFilesAndFoldersOperation) which spawns a modal context thread
- * 3) modal context tries to acquire lock held by UI thread
- * 
- * This sequence would cause a deadlock, so an exception is thrown by ModalContext.
- * This test asserts that the exception is thrown and that deadlock does not occur.
- */
-public class TestBug108162 extends TestCase {
-	class LockAcquiringOperation extends WorkspaceModifyOperation {
-		public void execute(final IProgressMonitor pm) {
-			//empty operation is sufficient to cause deadlock
-		}
-	}
-
-	private IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-	public TestBug108162() {
-		super();
-	}
-
-	public TestBug108162(String name) {
-		super(name);
-	}
-
-	/**
-	 * Performs the test
-	 */
-	public void testBug() throws CoreException {
-		workspace.run(new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) {
-				ProgressMonitorDialog dialog = new ProgressMonitorDialog(new Shell());
-				try {
-					dialog.run(true, false, new LockAcquiringOperation());
-					//should not succeed
-					assertTrue("Should not get here", false);
-				} catch (InvocationTargetException e) {
-					//this failure is expected because it tried to fork and block while owning a lock.
-				} catch (InterruptedException e) {
-					//ignore
-				} catch (IllegalStateException e) {
-					//this failure is expected because it tried to fork and block while owning a lock.
-				}
-			}
-		}, workspace.getRoot(), IResource.NONE, null);
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/TestBug138695.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/TestBug138695.java
deleted file mode 100644
index 14f22d3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/TestBug138695.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.concurrency;
-
-import junit.framework.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.ui.progress.UIJob;
-
-/**
- * @since 3.2
- *
- */
-public class TestBug138695 extends TestCase {
-	class SampleJob extends UIJob {
-
-		/**
-		 * @param name
-		 */
-		public SampleJob() {
-			super("Sample");
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
-		 */
-		public IStatus runInUIThread(IProgressMonitor monitor) {
-			try {
-				Thread.sleep(100);
-			} catch (InterruptedException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-			}
-			return Status.OK_STATUS;
-		}
-
-	}
-
-	class SerialPerObjectRule implements ISchedulingRule {
-
-		private Object fObject = null;
-
-		public SerialPerObjectRule(Object lock) {
-			fObject = lock;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.jobs.ISchedulingRule#contains(org.eclipse.core.runtime.jobs.ISchedulingRule)
-		 */
-		public boolean contains(ISchedulingRule rule) {
-			return rule == this;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.jobs.ISchedulingRule#isConflicting(org.eclipse.core.runtime.jobs.ISchedulingRule)
-		 */
-		public boolean isConflicting(ISchedulingRule rule) {
-			if (rule instanceof SerialPerObjectRule) {
-				SerialPerObjectRule vup = (SerialPerObjectRule) rule;
-				return fObject == vup.fObject;
-			}
-			return false;
-		}
-
-	}
-
-	public static Test suite() {
-		return new TestSuite(TestBug138695.class);
-	}
-
-	public void testManyThreads() {
-		for (int i = 0; i < 1000; i++) {
-			SampleJob job = new SampleJob();
-			job.setRule(new SerialPerObjectRule(this));
-			job.schedule();
-		}
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/TestBug98621.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/TestBug98621.java
deleted file mode 100644
index fe3ac7f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/TestBug98621.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.concurrency;
-
-import java.lang.reflect.InvocationTargetException;
-import junit.framework.*;
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IThreadListener;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-/**
- * Tests the following sequence of events:
- *  1) Lock is acquired in UI thread
- *  2) Modal context thread is started using IThreadListener
- *  3) Lock is transferred to modal context thread
- *  4) Modal context thread performs an asyncExec
- *  5) The asyncExec tries to acquire the same lock held by the modal context
- *  6) The modal context thread exits, thus transferring the rule back to the UI thread
- *  <p>
- *  Now the rule has been transferred back to the UI thread, but the UI thread
- *  is in a wait loop waiting to obtain the rule. The UI thread should realize that
- *  it now owns the lock it is waiting for, and continue with its execution.
- *  <p>
- *  See bug 98621 for more details.
- *  @since 3.2
- */
-public class TestBug98621 extends TestCase {
-	class TransferTestOperation extends WorkspaceModifyOperation implements IThreadListener {
-		public void execute(final IProgressMonitor pm) {
-			Display.getDefault().asyncExec(new Runnable() {
-				public void run() {
-					try {
-						workspace.run(new IWorkspaceRunnable() {
-							public void run(IProgressMonitor mon) {
-								//
-							}
-						}, workspace.getRoot(), IResource.NONE, null);
-					} catch (CoreException ex) {
-						ex.printStackTrace();
-					}
-				}
-			});
-			//wait until the asyncExec is blocking the UI thread
-			try {
-				Thread.sleep(1000);
-			} catch (InterruptedException e) {
-				//ignore
-			}
-		}
-
-		public void threadChange(Thread thread) {
-			Platform.getJobManager().transferRule(workspace.getRoot(), thread);
-		}
-	}
-
-	private IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-	public TestBug98621() {
-		super();
-	}
-
-	public TestBug98621(String name) {
-		super(name);
-	}
-
-	/**
-	 * Performs the test
-	 */
-	public void testBug() throws CoreException {
-		workspace.run(new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) {
-				ProgressMonitorDialog dialog = new ProgressMonitorDialog(new Shell());
-				try {
-					dialog.run(true, false, new TransferTestOperation());
-				} catch (InvocationTargetException e) {
-					e.printStackTrace();
-					fail(e.getMessage());
-				} catch (InterruptedException e) {
-					//ignore
-				}
-			}
-		}, workspace.getRoot(), IResource.NONE, null);
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/TransferRuleTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/TransferRuleTest.java
deleted file mode 100644
index 30fe0d3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/concurrency/TransferRuleTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.concurrency;
-
-import java.lang.reflect.InvocationTargetException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.operation.IThreadListener;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests IJobManger#transferRule in conjunction with ModalContext.run.
- * This also exercises the IThreadListener API to allow the runnable to transfer
- * and obtain the rule owned by the calling thread.
- */
-public class TransferRuleTest extends UITestCase {
-	class TestRule implements ISchedulingRule {
-		public boolean contains(ISchedulingRule rule) {
-			return rule == this;
-		}
-
-		public boolean isConflicting(ISchedulingRule rule) {
-			return rule == this;
-		}
-	}
-
-	/**
-	 * A simple runnable that uses the IThreadListener interface to transfer
-	 * a scheduling rule.
-	 */
-	class TestRunnable implements IRunnableWithProgress, IThreadListener {
-		Throwable error;
-		private final ISchedulingRule rule;
-
-		public TestRunnable(ISchedulingRule aRule) {
-			this.rule = aRule;
-		}
-
-		public void run(IProgressMonitor monitor) {
-			//if we already have an error don't run the rest of the test
-			if (error != null)
-				return;
-			try {
-				try {
-					//acquire the rule that was transferred (will hang if the rule transfer failed)
-					Platform.getJobManager().beginRule(rule, monitor);
-				} finally {
-					Platform.getJobManager().endRule(rule);
-				}
-			} catch (Throwable t) {
-				//remember any error so we can fail the test
-				error = t;
-			}
-		}
-
-		public void threadChange(Thread thread) {
-			try {
-				Platform.getJobManager().transferRule(rule, thread);
-			} catch (Throwable t) {
-				//remember any error so we can fail the test
-				error = t;
-			}
-		}
-	}
-
-	public TransferRuleTest(String name) {
-		super(name);
-	}
-
-	public void testModalContextTransfer() {
-		ISchedulingRule rule = new TestRule();
-		TestRunnable runnable = new TestRunnable(rule);
-		try {
-			//first get the rule in the test thread
-			Platform.getJobManager().beginRule(rule, null);
-			//now execute the runnable using ModalContext - the rule should transfer correctly
-			new ProgressMonitorDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell()).run(true, true, runnable);
-		} catch (InvocationTargetException e) {
-			e.printStackTrace();
-			fail("1.0");
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-			fail("1.1");
-		} finally {
-			//must release the rule when finished
-			Platform.getJobManager().endRule(rule);
-		}
-		//check the runnable for errors
-		if (runnable.error != null) {
-			runnable.error.printStackTrace();
-			fail("1.2");
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/Bug74990Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/Bug74990Test.java
deleted file mode 100644
index d2d080e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/Bug74990Test.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.contexts;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.contexts.EnabledSubmission;
-import org.eclipse.ui.contexts.IContext;
-import org.eclipse.ui.contexts.IWorkbenchContextSupport;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * A test for whether part identifiers work properly for EnabledSubmissions.
- * 
- * @since 3.1
- */
-public final class Bug74990Test extends UITestCase {
-
-    /**
-     * Constructs a new instance of <code>Bug74990Test</code>.
-     * 
-     * @param name
-     *            The name of the test
-     */
-    public Bug74990Test(final String name) {
-        super(name);
-    }
-
-    /**
-     * Tests whether a part-specific context -- submitted via Java code -- is
-     * matched properly. This is only using the part id. The test verifies that
-     * it is active when the part is active, and not active when the part is not
-     * active.
-     * 
-     * @throws PartInitException
-     *             If something goes wrong creating the part to which this
-     *             handler is tied.
-     *  
-     */
-    public final void testPartIdSubmission() throws PartInitException {
-        // Define a command.
-        final String testContextId = "org.eclipse.ui.tests.contexts.Bug74990";
-        final IWorkbenchContextSupport contextSupport = fWorkbench
-                .getContextSupport();
-        final IContext testContext = contextSupport.getContextManager()
-                .getContext(testContextId);
-
-        // Create an enabled submission.
-        final EnabledSubmission testSubmission = new EnabledSubmission(
-                "org.eclipse.ui.tests.api.MockViewPart", null, null,
-                testContextId);
-        contextSupport.addEnabledSubmission(testSubmission);
-
-        try {
-            // Test to make sure the context is not currently enabled.
-            assertTrue("The MockViewPart context should not be enabled",
-                    !testContext.isEnabled());
-
-            /*
-             * Open a window with the MockViewPart, and make sure it now
-             * enabled.
-             */
-            final IWorkbenchPage page = openTestWindow().getActivePage();
-            final IViewPart openedView = page
-                    .showView("org.eclipse.ui.tests.api.MockViewPart");
-            page.activate(openedView);
-            while (fWorkbench.getDisplay().readAndDispatch())
-                ;
-            assertTrue("The MockViewPart context should be enabled",
-                    testContext.isEnabled());
-
-            // Hide the view, and test that is becomes disabled again.
-            page.hideView(openedView);
-            while (fWorkbench.getDisplay().readAndDispatch())
-                ;
-            assertTrue("The MockViewPart context should not be enabled",
-                    !testContext.isEnabled());
-
-        } finally {
-            contextSupport.removeEnabledSubmission(testSubmission);
-        }
-
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/Bug84763Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/Bug84763Test.java
deleted file mode 100644
index 2920db2..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/Bug84763Test.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.contexts;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.CommandManager;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.contexts.Context;
-import org.eclipse.core.commands.contexts.ContextManager;
-import org.eclipse.core.commands.contexts.ContextManagerEvent;
-import org.eclipse.core.commands.contexts.IContextManagerListener;
-import org.eclipse.jface.bindings.Binding;
-import org.eclipse.jface.bindings.BindingManager;
-import org.eclipse.jface.bindings.Scheme;
-import org.eclipse.jface.bindings.keys.KeyBinding;
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.ParseException;
-import org.eclipse.jface.contexts.IContextIds;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * A test case covering the scenario described in Bug 84763. The problem was
- * that the context manager was exposing its internal data structures, and the
- * binding manager was mangling them. Debug then responded to bad information in
- * the <code>previouslyEnabledContextIds</code> property on the context event.
- * 
- * @since 3.1
- */
-public final class Bug84763Test extends UITestCase {
-
-	/**
-	 * The binding manager to use in each test case. A new binding manager is
-	 * created for each test case, and it is disposed when the test is over.
-	 */
-	private BindingManager bindingManager = null;
-
-	/**
-	 * The context manager to use in each test case. A new context manager is
-	 * created for each test case, and it is disposed when the test is over.
-	 */
-	private ContextManager contextManager = null;
-
-	/**
-	 * The context manager listener to use in each test case. A new context
-	 * manager listener is created for each test case, and it is disposed when
-	 * the test is over.
-	 */
-	private IContextManagerListener contextManagerListener = null;
-
-	/**
-	 * The set of the previous context identifiers returned by the last context
-	 * manager event. This value is set to <code>null</code> at the end of
-	 * each test.
-	 */
-	private Set previousContextIds = null;
-
-	/**
-	 * Constructor for <code>Bug84763Test</code>.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public Bug84763Test(final String name) {
-		super(name);
-	}
-
-	/**
-	 * Creates a new context manager and a binding manager for use in the test
-	 * cases.
-	 */
-	protected void doSetUp() {
-		contextManager = new ContextManager();
-		contextManagerListener = new IContextManagerListener() {
-
-			public void contextManagerChanged(
-					ContextManagerEvent contextManagerEvent) {
-				previousContextIds = contextManagerEvent
-						.getPreviouslyActiveContextIds();
-				if (previousContextIds != null) {
-					previousContextIds = new HashSet(previousContextIds);
-				}
-			}
-
-		};
-		contextManager.addContextManagerListener(contextManagerListener);
-		bindingManager = new BindingManager(contextManager,
-				new CommandManager());
-	}
-
-	/**
-	 * Releases the context manager and binding manager for garbage collection.
-	 */
-	protected void doTearDown() {
-		contextManager = null;
-		contextManagerListener = null;
-		previousContextIds = null;
-		bindingManager = null;
-	}
-
-	/**
-	 * <p>
-	 * Testst whether the binding manager will overwrite information in the
-	 * context manager. In particular, whether the list of previous enabled
-	 * context identifiers will be changed.
-	 * </p>
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 * @throws ParseException
-	 *             If "CTRL+F" cannot be parsed for some reason.
-	 */
-	public void testWindowChildWhenDialog() throws NotDefinedException,
-			ParseException {
-		// Define the contexts to use.
-		final Context dialogAndWindowsContext = contextManager
-				.getContext(IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW);
-		dialogAndWindowsContext.define("In Dialogs and Windows", null, null);
-		final Context dialogContext = contextManager
-				.getContext(IContextIds.CONTEXT_ID_DIALOG);
-		dialogContext.define("In Dialogs", null,
-				IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW);
-		final Context windowContext = contextManager
-				.getContext(IContextIds.CONTEXT_ID_WINDOW);
-		windowContext.define("In Windows", null,
-				IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW);
-		final Context windowChildContext = contextManager.getContext("sibling");
-		windowChildContext.define("Sibling", null,
-				IContextIds.CONTEXT_ID_WINDOW);
-
-		// Force a binding computation.
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", null, null);
-		bindingManager.setActiveScheme(scheme);
-		final CommandManager commandManager = new CommandManager();
-		final Command command = commandManager.getCommand("commandId");
-		final ParameterizedCommand parameterizedCommand = new ParameterizedCommand(
-				command, null);
-		bindingManager.addBinding(new KeyBinding(KeySequence
-				.getInstance("CTRL+F"), parameterizedCommand, scheme.getId(),
-				windowChildContext.getId(), null, null, null, Binding.SYSTEM));
-		bindingManager.getActiveBindingsFor((ParameterizedCommand) null);
-
-		// Activate the dialog context and the sibling.
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add(IContextIds.CONTEXT_ID_DIALOG);
-		activeContextIds.add(IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW);
-		activeContextIds.add(windowChildContext.getId());
-		contextManager.setActiveContextIds(activeContextIds);
-
-		// Force a binding computation.
-		bindingManager.getActiveBindingsFor((ParameterizedCommand) null);
-
-		// Active the window context.
-		activeContextIds.remove(IContextIds.CONTEXT_ID_DIALOG);
-		activeContextIds.add(IContextIds.CONTEXT_ID_WINDOW);
-		contextManager.setActiveContextIds(activeContextIds);
-
-		// Force a binding computation.
-		bindingManager.getActiveBindingsFor((ParameterizedCommand) null);
-
-		/*
-		 * Check to see what the listener got as the list of previously active
-		 * context identifiers.
-		 */
-		assertEquals("There should have been 3 context ids active previously",
-				3, previousContextIds.size());
-		assertTrue("The previous contexts should include the dialog context",
-				previousContextIds.contains(IContextIds.CONTEXT_ID_DIALOG));
-		assertTrue("The previous contexts should include the dialog context",
-				previousContextIds
-						.contains(IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW));
-		assertTrue("The previous contexts should include the dialog context",
-				previousContextIds.contains(windowChildContext.getId()));
-		System.out.println("testSiblingContext");
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/ContextPage.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/ContextPage.java
deleted file mode 100755
index 727ab28..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/ContextPage.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.ui.tests.contexts;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.part.IPageSite;
-import org.eclipse.ui.part.Page;
-
-/**
- * A message page display a message in a pagebook view, and activates a context.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- * </p>
- * 
- * @see PageBookView
- */
-public class ContextPage extends Page {
-	public static final String TEST_CONTEXT_ID = "org.eclipse.ui.tests.contexts.Page";
-
-	private Composite pgComp;
-
-	private Label msgLabel;
-
-	private String message = "";//$NON-NLS-1$
-
-	/**
-	 * Creates a new page. The message is the empty string.
-	 */
-	public ContextPage() {
-		// do nothing
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPage.
-	 */
-	public void createControl(Composite parent) {
-		// Message in default page of Outline should have margins
-		pgComp = new Composite(parent, SWT.NULL);
-		pgComp.setLayout(new FillLayout());
-
-		msgLabel = new Label(pgComp, SWT.LEFT | SWT.TOP | SWT.WRAP);
-		msgLabel.setText(message);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IPage.
-	 */
-	public Control getControl() {
-		return pgComp;
-	}
-
-	/**
-	 * Sets focus to a part in the page.
-	 */
-	public void setFocus() {
-		// important to give focus to the composite rather than the label
-		// as the composite will actually take focus (though hidden),
-		// but setFocus on a Label is a no-op
-		pgComp.setFocus();
-	}
-
-	/**
-	 * Sets the message to the given string.
-	 * 
-	 * @param message
-	 *            the message text
-	 */
-	public void setMessage(String msg) {
-		this.message = msg;
-		if (msgLabel != null)
-			msgLabel.setText(msg);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.Page#init(org.eclipse.ui.part.IPageSite)
-	 */
-	public void init(IPageSite pageSite) {
-		super.init(pageSite);
-		IContextService localService = (IContextService) getSite().getService(
-				IContextService.class);
-		localService.activateContext(TEST_CONTEXT_ID);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/ContextsTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/ContextsTestSuite.java
deleted file mode 100644
index d18c7e4..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/ContextsTestSuite.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.contexts;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * The suite of tests related to the "org.eclipse.ui.contexts" extension point,
- * and the "org.eclise.ui.contexts" Java API. This includes tests dealing with
- * other extension points or elements in other extension points that have been
- * deprecated to be replaced by this one.
- * 
- * @since 3.0
- */
-public final class ContextsTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static final Test suite() {
-        return new ContextsTestSuite();
-    }
-
-    /**
-     * Constructs a new instance of <code>ContextsTestSuite</code> with all of
-     * the relevent test cases.
-     */
-    public ContextsTestSuite() {
-        addTestSuite(Bug74990Test.class);
-        addTestSuite(Bug84763Test.class);
-        addTestSuite(ExtensionTestCase.class);
-        addTestSuite(PartContextTest.class);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/ExtensionTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/ExtensionTestCase.java
deleted file mode 100644
index 4a60dda..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/ExtensionTestCase.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.contexts;
-
-import org.eclipse.ui.contexts.IContext;
-import org.eclipse.ui.contexts.IContextManager;
-import org.eclipse.ui.contexts.IWorkbenchContextSupport;
-import org.eclipse.ui.contexts.NotDefinedException;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * The test case for reading in elements from the extension point. This verifies
- * that contexts defined in this test plug-in's extensions are all properly read
- * in. This includes extensions read from deprecated locations, as well as the
- * currently preferred way of specifying contexts.
- * 
- * @since 3.0
- */
-public class ExtensionTestCase extends UITestCase {
-
-    /**
-     * Constructs a new instance of <code>ExtensionTestCase</code> with the
-     * given name.
-     * 
-     * @param testName
-     *            The name of the test; may be <code>null</code>.
-     */
-    public ExtensionTestCase(final String testName) {
-        super(testName);
-    }
-
-    /**
-     * Tests that the "org.eclipse.ui.acceleratorScopes" extension point can be
-     * read in by Eclipse. This extension point is currently deprecated.
-     * 
-     * @throws NotDefinedException
-     *             This shouldn't really be possible, as the test should fail
-     *             gracefully before this could happen.
-     */
-    public final void testAcceleratorScopes() throws NotDefinedException {
-        final IWorkbenchContextSupport contextSupport = fWorkbench
-                .getContextSupport();
-        final IContextManager contextManager = contextSupport
-                .getContextManager();
-
-        final IContext context1 = contextManager
-                .getContext("org.eclipse.ui.tests.acceleratorScopes.test1");
-        assertTrue(
-                "Context contributed via 'org.eclipse.ui.acceleratorScopes' is not loaded properly.",
-                context1.isDefined());
-        assertEquals(
-                "Context contributed via 'org.eclipse.ui.acceleratorScopes' does not get its name.",
-                "Test Accelerator Scope 1", context1.getName());
-
-        final IContext context2 = contextManager
-                .getContext("org.eclipse.ui.tests.acceleratorScopes.test2");
-        assertTrue(
-                "Context contributed via 'org.eclipse.ui.acceleratorScopes' is not loaded properly.",
-                context2.isDefined());
-        assertEquals(
-                "Context contributed via 'org.eclipse.ui.acceleratorScopes' does not get its name.",
-                "Test Accelerator Scope 2", context2.getName());
-        assertEquals(
-                "Context contributed via 'org.eclipse.ui.acceleratorScopes' does not get its parent.",
-                "org.eclipse.ui.tests.acceleratorScopes.test1", context2
-                        .getParentId());
-    }
-
-    /**
-     * Tests that the "scopes" element in the "org.eclipse.ui.commands"
-     * extension point can be read in as a context by Eclipse. This element is
-     * currently deprecated.
-     * 
-     * @throws NotDefinedException
-     *             This shouldn't really be possible, as the test should fail
-     *             gracefully before this could happen.
-     */
-    public final void testCommandsScopes() throws NotDefinedException {
-        final IWorkbenchContextSupport contextSupport = fWorkbench
-                .getContextSupport();
-        final IContextManager contextManager = contextSupport
-                .getContextManager();
-
-        final IContext context1 = contextManager
-                .getContext("org.eclipse.ui.tests.commands.scope1");
-        assertTrue(
-                "Context contributed via 'org.eclipse.ui.commands' is not loaded properly.",
-                context1.isDefined());
-        assertEquals(
-                "Context contributed via 'org.eclipse.ui.commands' does not get its name.",
-                "Test Scope 1", context1.getName());
-
-        final IContext context2 = contextManager
-                .getContext("org.eclipse.ui.tests.commands.scope2");
-        assertTrue(
-                "Context contributed via 'org.eclipse.ui.commands' is not loaded properly.",
-                context2.isDefined());
-        assertEquals(
-                "Context contributed via 'org.eclipse.ui.commands' does not get its name.",
-                "Test Scope 2", context2.getName());
-        assertEquals(
-                "Context contributed via 'org.eclipse.ui.commands' does not get its parent.",
-                "org.eclipse.ui.tests.commands.scope1", context2.getParentId());
-    }
-
-    /**
-     * Tests that the currently preferred way of specifiying contexts can be
-     * read in properly by Eclipse. This uses all of the non-deprecated
-     * attributes.
-     * 
-     * @throws NotDefinedException
-     *             This shouldn't really be possible, as the test should fail
-     *             gracefully before this could happen.
-     */
-    public final void testContexts() throws NotDefinedException {
-        final IWorkbenchContextSupport contextSupport = fWorkbench
-                .getContextSupport();
-        final IContextManager contextManager = contextSupport
-                .getContextManager();
-
-        final IContext context1 = contextManager
-                .getContext("org.eclipse.ui.tests.contexts.context1");
-        assertTrue(
-                "Context contributed via 'org.eclipse.ui.contexts' is not loaded properly.",
-                context1.isDefined());
-        assertEquals(
-                "Context contributed via 'org.eclipse.ui.contexts' does not get its name.",
-                "Test Context 1", context1.getName());
-
-        final IContext context2 = contextManager
-                .getContext("org.eclipse.ui.tests.contexts.context2");
-        assertTrue(
-                "Context contributed via 'org.eclipse.ui.contexts' is not loaded properly.",
-                context2.isDefined());
-        assertEquals(
-                "Context contributed via 'org.eclipse.ui.contexts' does not get its name.",
-                "Test Context 2", context2.getName());
-        assertEquals(
-                "Context contributed via 'org.eclipse.ui.contexts' does not get its parent.",
-                "org.eclipse.ui.tests.contexts.context1", context2
-                        .getParentId());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/MockPageView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/MockPageView.java
deleted file mode 100644
index 426bcf5..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/MockPageView.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.contexts;
-
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.IPage;
-import org.eclipse.ui.part.MessagePage;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.part.PageBookView;
-
-/**
- * A special view that manages pages. It is based on text editors, and adds a
- * ContextPage for files ending in ".xml", but just a MessagePage otherwise.
- * 
- * @since 3.2
- */
-public class MockPageView extends PageBookView {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.PageBookView#createDefaultPage(org.eclipse.ui.part.PageBook)
-	 */
-	protected IPage createDefaultPage(PageBook book) {
-		MessagePage page = new MessagePage();
-		initPage(page);
-		page.createControl(book);
-		page.setMessage("There is no relevant part active.");
-		return page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.PageBookView#doCreatePage(org.eclipse.ui.IWorkbenchPart)
-	 */
-	protected PageRec doCreatePage(IWorkbenchPart part) {
-		if (part instanceof IEditorPart) {
-			IEditorPart editor = (IEditorPart) part;
-			if (editor.getTitle().endsWith(".xml")) {
-				ContextPage page = new ContextPage();
-				initPage(page);
-				page.createControl(getPageBook());
-				page.setMessage("The XML editor is active: "
-						+ editor.getTitle());
-				return new PageRec(part, page);
-			}
-			MessagePage page = new MessagePage();
-			initPage(page);
-			page.createControl(getPageBook());
-			page.setMessage("The editor is active: " + editor.getTitle());
-			return new PageRec(part, page);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.PageBookView#doDestroyPage(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.ui.part.PageBookView.PageRec)
-	 */
-	protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
-		pageRecord.page.dispose();
-		pageRecord.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.PageBookView#getBootstrapPart()
-	 */
-	protected IWorkbenchPart getBootstrapPart() {
-		return getSite().getPage().getActiveEditor();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.PageBookView#isImportant(org.eclipse.ui.IWorkbenchPart)
-	 */
-	protected boolean isImportant(IWorkbenchPart part) {
-		return part instanceof IEditorPart;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/MockViewPart5.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/MockViewPart5.java
deleted file mode 100644
index bd6dae7..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/MockViewPart5.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.contexts;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.internal.WorkbenchImages;
-import org.eclipse.ui.tests.api.MockWorkbenchPart;
-
-public class MockViewPart5 extends MockWorkbenchPart implements IViewPart {
-	/**
-	 * 
-	 */
-	public static final String PART_CONTEXT_ID = "org.eclipse.ui.tests.contexts.ViewPart";
-
-	public static String ID = "org.eclipse.ui.tests.contexts.MockViewPart5";
-
-	public static String NAME = "Context Mock View 5";
-
-	private ContributionItem toolbarItem = new ContributionItem("someId") {
-
-		private DisposeListener disposeListener = new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				toolbarContributionItemWidgetDisposed();
-			}
-
-		};
-
-		public void fill(ToolBar parent, int index) {
-			super.fill(parent, index);
-
-			ToolItem item = new ToolItem(parent, index);
-
-			item.addDisposeListener(disposeListener);
-			item.setImage(WorkbenchImages.getImage(ISharedImages.IMG_DEF_VIEW));
-		}
-
-		public void dispose() {
-			toolbarContributionItemDisposed();
-			super.dispose();
-		}
-	};
-
-	public MockViewPart5() {
-		super();
-	}
-
-	/**
-	 * @see IViewPart#getViewSite()
-	 */
-	public IViewSite getViewSite() {
-		return (IViewSite) getSite();
-	}
-
-	/**
-	 * @see IViewPart#init(IViewSite)
-	 */
-	public void init(IViewSite site) throws PartInitException {
-		setSite(site);
-		callTrace.add("init");
-		setSiteInitialized();
-		addToolbarContributionItem();
-		addContext();
-	}
-
-	/**
-	 * @see IViewPart#init(IViewSite, IMemento)
-	 */
-	public void init(IViewSite site, IMemento memento) throws PartInitException {
-		setSite(site);
-		callTrace.add("init");
-		setSiteInitialized();
-		addToolbarContributionItem();
-		addContext();
-	}
-
-	private void addContext() throws PartInitException {
-		IContextService contextService = (IContextService) getSite()
-				.getService(IContextService.class);
-		if (!contextService.getContext(PART_CONTEXT_ID).isDefined()) {
-			throw new PartInitException("Failed to find context "
-					+ PART_CONTEXT_ID);
-		}
-		contextService.activateContext(PART_CONTEXT_ID);
-	}
-
-	private void addToolbarContributionItem() {
-		getViewSite().getActionBars().getToolBarManager().add(toolbarItem);
-	}
-
-	public void toolbarContributionItemWidgetDisposed() {
-		callTrace.add("toolbarContributionItemWidgetDisposed");
-	}
-
-	public void toolbarContributionItemDisposed() {
-		callTrace.add("toolbarContributionItemDisposed");
-	}
-
-	/**
-	 * @see IViewPart#saveState(IMemento)
-	 */
-	public void saveState(IMemento memento) {
-		// how's this for a comment, filthy human compiler
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.api.MockWorkbenchPart#getActionBars()
-	 */
-	protected IActionBars getActionBars() {
-		return getViewSite().getActionBars();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/PartContextTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/PartContextTest.java
deleted file mode 100644
index 5a25240..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/contexts/PartContextTest.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.contexts;
-
-import java.util.Collection;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.api.MockViewPart;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test that the contexts activated through their local services are only in
- * play when their local service is active.
- * 
- * @since 3.2
- */
-public class PartContextTest extends UITestCase {
-	/**
-	 * 
-	 */
-	public static final String PAGE_VIEW_ID = "org.eclipse.ui.tests.contexts.MockPageView";
-
-	/**
-	 * 
-	 */
-	private static final String TEXT_EDITOR_ID = "org.eclipse.ui.DefaultTextEditor";
-
-	public static final String WINDOW_CONTEXT_ID = "org.eclipse.ui.tests.contexts.WorkbenchWindow";
-
-	public PartContextTest(String name) {
-		super(name);
-	}
-
-	public void testBasicContextActivation() throws Exception {
-		IContextService globalService = (IContextService) getWorkbench()
-				.getService(IContextService.class);
-
-		checkActiveContext(globalService, MockViewPart5.PART_CONTEXT_ID, false);
-
-		IWorkbenchWindow window = openTestWindow();
-		IWorkbenchPage page = window.getActivePage();
-		IViewPart view = page.showView(MockViewPart5.ID);
-
-		checkActiveContext(globalService, MockViewPart5.PART_CONTEXT_ID, true);
-
-		page.hideView(view);
-		checkActiveContext(globalService, MockViewPart5.PART_CONTEXT_ID, false);
-	}
-
-	public void testContextActivation() throws Exception {
-		IContextService globalService = (IContextService) getWorkbench()
-				.getService(IContextService.class);
-
-		checkActiveContext(globalService, MockViewPart5.PART_CONTEXT_ID, false);
-
-		IWorkbenchWindow window = openTestWindow();
-		IWorkbenchPage page = window.getActivePage();
-		IViewPart view = page.showView(MockViewPart5.ID);
-		IContextService localService = (IContextService) view.getSite()
-				.getService(IContextService.class);
-
-		checkActiveContext(globalService, MockViewPart5.PART_CONTEXT_ID, true);
-		checkActiveContext(localService, MockViewPart5.PART_CONTEXT_ID, true);
-
-		IViewPart mockView = page.showView(MockViewPart.ID);
-		checkActiveContext(globalService, MockViewPart5.PART_CONTEXT_ID, false);
-		checkActiveContext(localService, MockViewPart5.PART_CONTEXT_ID, false);
-
-		page.activate(view);
-		checkActiveContext(globalService, MockViewPart5.PART_CONTEXT_ID, true);
-
-		page.activate(mockView);
-		checkActiveContext(globalService, MockViewPart5.PART_CONTEXT_ID, false);
-
-		page.hideView(mockView);
-		checkActiveContext(globalService, MockViewPart5.PART_CONTEXT_ID, true);
-
-		page.hideView(view);
-		checkActiveContext(globalService, MockViewPart5.PART_CONTEXT_ID, false);
-	}
-
-	public void testWindowContextActivation() throws Exception {
-		IContextService globalService = (IContextService) getWorkbench()
-				.getService(IContextService.class);
-		checkActiveContext(globalService, WINDOW_CONTEXT_ID, false);
-
-		IWorkbenchWindow window = openTestWindow();
-		IContextService localService = (IContextService) window
-				.getService(IContextService.class);
-		localService.activateContext(WINDOW_CONTEXT_ID);
-		checkActiveContext(globalService, WINDOW_CONTEXT_ID, true);
-
-		window.close();
-		checkActiveContext(globalService, WINDOW_CONTEXT_ID, false);
-	}
-
-	/**
-	 * Test context activation while switching through the pages of a pagebook.
-	 * Exercises the NestableContextService.
-	 * 
-	 * @throws Exception
-	 *             on error
-	 */
-	public void testPageBookPageContextActivation() throws Exception {
-		IContextService globalService = (IContextService) getWorkbench()
-				.getService(IContextService.class);
-		checkActiveContext(globalService, ContextPage.TEST_CONTEXT_ID, false);
-
-		IWorkbenchWindow window = openTestWindow();
-		IWorkbenchPage page = window.getActivePage();
-
-		IViewPart pageView = page.showView(PAGE_VIEW_ID);
-		assertNotNull(pageView);
-
-		checkActiveContext(globalService, ContextPage.TEST_CONTEXT_ID, false);
-
-		IProject proj = FileUtil.createProject("ContextTest");
-		IFile test01 = FileUtil.createFile("test01.txt", proj);
-		IEditorPart editor01 = page.openEditor(new FileEditorInput(test01),
-				TEXT_EDITOR_ID);
-		assertNotNull(editor01);
-		page.activate(pageView);
-		checkActiveContext(globalService, ContextPage.TEST_CONTEXT_ID, false);
-
-		IFile test02 = FileUtil.createFile("test02.xml", proj);
-		IEditorPart editor02 = page.openEditor(new FileEditorInput(test02),
-				TEXT_EDITOR_ID);
-		assertNotNull(editor02);
-		page.activate(pageView);
-		checkActiveContext(globalService, ContextPage.TEST_CONTEXT_ID, true);
-
-		page.activate(editor01);
-		checkActiveContext(globalService, ContextPage.TEST_CONTEXT_ID, false);
-		page.activate(pageView);
-		checkActiveContext(globalService, ContextPage.TEST_CONTEXT_ID, false);
-
-		page.activate(editor02);
-		checkActiveContext(globalService, ContextPage.TEST_CONTEXT_ID, false);
-		page.activate(pageView);
-		checkActiveContext(globalService, ContextPage.TEST_CONTEXT_ID, true);
-		page.activate(editor02);
-		checkActiveContext(globalService, ContextPage.TEST_CONTEXT_ID, false);
-		page.activate(pageView);
-		checkActiveContext(globalService, ContextPage.TEST_CONTEXT_ID, true);
-
-		page.activate(editor01);
-		page.activate(pageView);
-		checkActiveContext(globalService, ContextPage.TEST_CONTEXT_ID, false);
-
-		page.activate(editor01);
-		page.closeEditor(editor01, false);
-		page.activate(pageView);
-		checkActiveContext(globalService, ContextPage.TEST_CONTEXT_ID, true);
-	}
-
-	/**
-	 * Assert if the contextId is active in the contextService.
-	 * 
-	 * @param contextService
-	 * @param contextId
-	 * @param isActive
-	 */
-	private void checkActiveContext(IContextService contextService,
-			String contextId, boolean isActive) {
-		Collection activeContexts = contextService.getActiveContextIds();
-		assertEquals(contextId, isActive, activeContexts.contains(contextId));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/DataTransferTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/DataTransferTestSuite.java
deleted file mode 100644
index a6dbbab..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/DataTransferTestSuite.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.datatransfer;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * .
- */
-public class DataTransferTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite.  This is required to
-     * use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new DataTransferTestSuite();
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public DataTransferTestSuite() {
-        addTest(new TestSuite(ImportOperationTest.class));
-        addTest(new TestSuite(ImportArchiveOperationTest.class)); 
-        addTest(new TestSuite(ExportFileSystemOperationTest.class));
-        addTest(new TestSuite(ExportArchiveFileOperationTest.class));
-        addTest(new TestSuite(ImportExistingProjectsWizardTest.class));
-        addTest(new TestSuite(ImportExportWizardsCategoryTests.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ExportArchiveFileOperationTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ExportArchiveFileOperationTest.java
deleted file mode 100644
index 6edf220..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ExportArchiveFileOperationTest.java
+++ /dev/null
@@ -1,483 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.datatransfer;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.tests.harness.FileSystemHelper;
-import org.eclipse.ui.dialogs.IOverwriteQuery;
-import org.eclipse.ui.internal.wizards.datatransfer.ArchiveFileExportOperation;
-import org.eclipse.ui.internal.wizards.datatransfer.TarEntry;
-import org.eclipse.ui.internal.wizards.datatransfer.TarFile;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-public class ExportArchiveFileOperationTest extends UITestCase implements
-		IOverwriteQuery {
-	
-	private static final String FILE_NAME = "test";
-	private static final String ZIP_FILE_EXT = "zip";
-	private static final String TAR_FILE_EXT = "tar";
-    private static final String[] directoryNames = { "dir1", "dir2" };
-    private static final String[] fileNames = { "file1.txt", "file2.txt" };
-    
-    private String localDirectory;
-    
-    private String filePath;
-
-    private IProject project;
-    
-    private boolean flattenPaths = false;
-    private boolean excludeProjectPath = false;
-    
-	public ExportArchiveFileOperationTest(String testName) {
-		super(testName);
-	}
-	
-	public String queryOverwrite(String pathString) {
-		return "";
-	}
-	
-	public void testExportStatus(){
-		List resources = new ArrayList();
-		resources.add(project);
-        ArchiveFileExportOperation operation = 
-        	new ArchiveFileExportOperation(resources, localDirectory);
-
-        assertTrue(operation.getStatus().getCode() == IStatus.OK);		
-	}
-	
-	public void testExportZip() throws Exception {
-		filePath = localDirectory + "/" + FILE_NAME + "." + ZIP_FILE_EXT;
-		List resources = new ArrayList();
-		resources.add(project);
-        ArchiveFileExportOperation operation = 
-        	new ArchiveFileExportOperation(resources, filePath);
-
-        operation.setUseCompression(false);
-        operation.setUseTarFormat(false);
-        openTestWindow().run(true, true, operation);
-        
-        verifyFolders(directoryNames.length, ZIP_FILE_EXT);	
-        
-	}
-	
-	public void testExportZipCompressed() throws Exception {
-		filePath = localDirectory + "/" + FILE_NAME + "." + ZIP_FILE_EXT;
-		List resources = new ArrayList();
-		resources.add(project);
-        ArchiveFileExportOperation operation = 
-        	new ArchiveFileExportOperation(resources, filePath);
-
-        operation.setUseCompression(true);
-        operation.setUseTarFormat(false);
-        openTestWindow().run(true, true, operation);		
-		verifyCompressed(ZIP_FILE_EXT);
-	}
-	
-	public void testExportZipCreateSelectedDirectories() throws Exception {
-		filePath = localDirectory + "/" + FILE_NAME + "." + ZIP_FILE_EXT;
-		List resources = new ArrayList();
-		IResource[] members = project.members();
-		for (int i = 0; i < members.length; i++){
-			if (isDirectory(members[i])){
-				IResource[] folderMembers = ((IFolder)members[i]).members();
-				for (int k = 0; k < folderMembers.length; k++){
-					if (isFile(folderMembers[k])){
-						resources.add(folderMembers[k]);
-					}
-				}
-			}
-		}
-        ArchiveFileExportOperation operation = 
-        	new ArchiveFileExportOperation(resources, filePath);
-
-        operation.setCreateLeadupStructure(false);
-        operation.setUseCompression(false);
-        operation.setUseTarFormat(false);
-        openTestWindow().run(true, true, operation);
-        flattenPaths = true;
-		verifyFolders(directoryNames.length, ZIP_FILE_EXT);		
-	}
-	
-	public void testExportZipCreateSelectedDirectoriesWithFolders() throws Exception {
-		filePath = localDirectory + "/" + FILE_NAME + "." + ZIP_FILE_EXT;
-		List resources = new ArrayList();
-		IResource[] members = project.members();
-		for (int i = 0; i < members.length; i++){
-			if (isDirectory(members[i]))
-				resources.add(members[i]);
-		}
-        ArchiveFileExportOperation operation = 
-        	new ArchiveFileExportOperation(resources, filePath);
-
-        operation.setCreateLeadupStructure(false);
-        operation.setUseCompression(false);
-        operation.setUseTarFormat(false);
-        openTestWindow().run(true, true, operation);
-        excludeProjectPath = true;
-		verifyFolders(directoryNames.length, ZIP_FILE_EXT);				
-	}
-	
-	public void testExportZipCreateSelectedDirectoriesCompressed() throws Exception {
-		filePath = localDirectory + "/" + FILE_NAME + "." + ZIP_FILE_EXT;
-		List resources = new ArrayList();
-		IResource[] members = project.members();
-		for (int i = 0; i < members.length; i++){
-			if (isDirectory(members[i])){
-				IResource[] folderMembers = ((IFolder)members[i]).members();
-				for (int k = 0; k < folderMembers.length; k++){
-					if (isFile(folderMembers[k])){
-						resources.add(folderMembers[k]);
-					}
-				}
-			}
-		}
-        ArchiveFileExportOperation operation = 
-        	new ArchiveFileExportOperation(resources, filePath);
-
-        operation.setCreateLeadupStructure(false);
-        operation.setUseCompression(true);
-        operation.setUseTarFormat(false);
-        openTestWindow().run(true, true, operation);
-        flattenPaths = true;
-		verifyCompressed(ZIP_FILE_EXT);	
-		verifyFolders(directoryNames.length, ZIP_FILE_EXT);
-	}
-	
-	public void testExportTar() throws Exception {
-		filePath = localDirectory + "/" + FILE_NAME + "." + TAR_FILE_EXT;
-		List resources = new ArrayList();
-		resources.add(project);
-        ArchiveFileExportOperation operation = 
-        	new ArchiveFileExportOperation(resources, filePath);
-        operation.setUseTarFormat(true);
-        operation.setUseCompression(false);
-
-        openTestWindow().run(true, true, operation);
-        
-        verifyFolders(directoryNames.length, TAR_FILE_EXT);	
-	}
-	
-	public void testExportTarCompressed() throws Exception {
-		filePath = localDirectory + "/" + FILE_NAME + "." + TAR_FILE_EXT;
-		List resources = new ArrayList();
-		resources.add(project);
-        ArchiveFileExportOperation operation = 
-        	new ArchiveFileExportOperation(resources, filePath);
-
-        operation.setUseTarFormat(true);
-        operation.setUseCompression(true);
-        openTestWindow().run(true, true, operation);		
-		verifyCompressed(TAR_FILE_EXT);		
-	}
-	
-	public void testExportTarCreateSelectedDirectories() throws Exception {
-		filePath = localDirectory + "/" + FILE_NAME + "." + TAR_FILE_EXT;
-		List resources = new ArrayList();
-		IResource[] members = project.members();
-		for (int i = 0; i < members.length; i++){
-			if (isDirectory(members[i])){
-				IResource[] folderMembers = ((IFolder)members[i]).members();
-				for (int k = 0; k < folderMembers.length; k++){
-					if (isFile(folderMembers[k])){
-						resources.add(folderMembers[k]);
-					}
-				}
-			}
-		}
-        ArchiveFileExportOperation operation = 
-        	new ArchiveFileExportOperation(resources, filePath);
-
-        operation.setCreateLeadupStructure(false);
-        operation.setUseCompression(false);
-        operation.setUseTarFormat(true);
-        openTestWindow().run(true, true, operation);
-        flattenPaths = true;
-		verifyFolders(directoryNames.length, TAR_FILE_EXT);			
-	}
-	
-	public void testExportTarCreateSelectedDirectoriesWithFolders() throws Exception {
-		filePath = localDirectory + "/" + FILE_NAME + "." + TAR_FILE_EXT;
-		List resources = new ArrayList();
-		IResource[] members = project.members();
-		for (int i = 0; i < members.length; i++){
-			if (isDirectory(members[i]))
-				resources.add(members[i]);
-		}
-        ArchiveFileExportOperation operation = 
-        	new ArchiveFileExportOperation(resources, filePath);
-
-        operation.setCreateLeadupStructure(false);
-        operation.setUseCompression(false);
-        operation.setUseTarFormat(true);
-        openTestWindow().run(true, true, operation);
-        excludeProjectPath = true;
-		verifyFolders(directoryNames.length, TAR_FILE_EXT);				
-		
-	}
-	
-	public void testExportTarCreateSelectedDirectoriesCompressed() throws Exception {
-		filePath = localDirectory + "/" + FILE_NAME + "." + TAR_FILE_EXT;
-		List resources = new ArrayList();
-		IResource[] members = project.members();
-		for (int i = 0; i < members.length; i++){
-			if (isDirectory(members[i])){
-				IResource[] folderMembers = ((IFolder)members[i]).members();
-				for (int k = 0; k < folderMembers.length; k++){
-					if (isFile(folderMembers[k])){
-						resources.add(folderMembers[k]);
-					}
-				}
-			}
-		}
-        ArchiveFileExportOperation operation = 
-        	new ArchiveFileExportOperation(resources, filePath);
-
-        operation.setCreateLeadupStructure(false);
-        operation.setUseCompression(true);
-        operation.setUseTarFormat(true);
-        openTestWindow().run(true, true, operation);
-        flattenPaths = true;
-		verifyCompressed(TAR_FILE_EXT);	
-		verifyFolders(directoryNames.length, TAR_FILE_EXT);
-		
-	}
-
-    protected void doSetUp() throws Exception {
-		super.doSetUp();
-		project = FileUtil.createProject("Export" + getName());
-		File destination = 
-			new File(FileSystemHelper.getRandomLocation(FileSystemHelper.getTempDir())
-    			.toOSString());
-		localDirectory = destination.getAbsolutePath();
-		if (!destination.mkdirs())
-			fail("Could not set up destination directory for " + getName());
-	    setUpData();
-	    flattenPaths = false;
-	    excludeProjectPath = false;
-	}
-    
-	protected void doTearDown() throws Exception {
-        super.doTearDown();
-        // delete exported data
-        File root = new File(localDirectory);
-        if (root.exists()){
-        	File[] files = root.listFiles();
-        	if (files != null){
-        		for (int i = 0; i < files.length; i++)
-        			if (!files[i].delete())
-        				fail("Could not delete " + files[i].getAbsolutePath());
-        	}
-        	root.delete();
-        }
-        try {
-            project.delete(true, true, null);
-        } catch (CoreException e) {
-            fail(e.toString());
-        }
-        finally{
-        	project = null;
-        	localDirectory = null;
-        	filePath = null;
-        }        
-	}
-	
-    private void setUpData(){
-    	try{
-	    	for(int i = 0; i < directoryNames.length; i++){
-	    		IFolder folder = project.getFolder(directoryNames[i]);
-	    		folder.create(false, true, new NullProgressMonitor());
-	    		for (int k = 0; k < fileNames.length; k++){
-	    			IFile file = folder.getFile(fileNames[k]);
-	    			String contents =
-	    				directoryNames[i] + ", " + fileNames[k];		
-	    			file.create(new ByteArrayInputStream(contents.getBytes()), 
-	    				true, new NullProgressMonitor());
-	    		}
-	    	}
-    	}
-    	catch(Exception e){
-    		fail(e.toString());
-    	}
-    }
-    
-    private void verifyCompressed(String type){
-    	String fileName = "";
-		boolean compressed = false;
-    	try{
-	    	if (ZIP_FILE_EXT.equals(type)){
-				ZipFile zipFile = new ZipFile(filePath);
-				fileName = zipFile.getName();
-	    		Enumeration entries = zipFile.entries();
-	    		while (entries.hasMoreElements()){
-	    			ZipEntry entry = (ZipEntry)entries.nextElement();
-	    			compressed = entry.getMethod() == ZipEntry.DEFLATED;
-	    		}
-	    		zipFile.close();
-	    	}
-	    	else{
-	    		File file = new File(filePath);
-	    		InputStream in = new FileInputStream(file);
-	    		// Check if it's a GZIPInputStream.
-	    		try {
-	    			in = new GZIPInputStream(in);
-	    			compressed = true;
-	    		} catch(IOException e) {
-	    			compressed = false;
-	    		}
-	    		fileName = file.getName();
-	    		in.close();
-	    	}
-    	}
-    	catch (Exception e){
-    		fail(e.getMessage());
-    	}
-    	assertTrue(fileName + " does not appear to be compressed.", compressed);
-    }
-    
-    private void verifyFolders(int folderCount, String type){
-    	try{
-    		List allEntries = new ArrayList();
-	    	if (ZIP_FILE_EXT.equals(type)){
-	    		ZipFile zipFile = new ZipFile(filePath);
-	    		Enumeration entries = zipFile.entries();
-	    		while (entries.hasMoreElements()){
-	    			ZipEntry entry = (ZipEntry)entries.nextElement();
-	    			allEntries.add(entry.getName());
-	    		}
-	    		zipFile.close();
-	    	}
-	    	else{
-	    		TarFile tarFile = new TarFile(filePath);
-	    		Enumeration entries = tarFile.entries();
-	    		while (entries.hasMoreElements()){
-	    			TarEntry entry = (TarEntry)entries.nextElement();
-	    			allEntries.add(entry.getName());
-	    		}
-	    		tarFile.close();
-	    	}
-	    	if (flattenPaths)
-	    		verifyFiles(allEntries);
-	    	else
-	    		verifyArchive(folderCount, allEntries);
-    	}
-    	catch (Exception e){
-    		fail(e.getMessage());
-    	}
-    }
-    
-    private void verifyArchive(int folderCount, List entries){
-    	int count = 0;
-    	Set folderNames = new HashSet();
-    	List files = new ArrayList();
-    	Iterator archiveEntries = entries.iterator();
-    	while (archiveEntries.hasNext()){
-    		String entryName = (String)archiveEntries.next();
-			int idx = entryName.lastIndexOf("/");
-			String folderPath = entryName.substring(0, idx);
-			String fileName = entryName.substring(idx+1, entryName.length());
-			files.add(fileName);
-			int idx2 = folderPath.lastIndexOf("/");
-			if (idx2 != -1){
-    			String folderName = folderPath.substring(idx2 + 1, folderPath.length());
-    			folderNames.add(folderName);
-			}
-			else 
-				folderNames.add(folderPath);
-
-    	}
-    	verifyFolders(folderNames);
-    	verifyFiles(files);
-    	count += folderNames.size();
-    	if (!flattenPaths && !excludeProjectPath)
-    		folderCount++;
-    	assertTrue(
-    			"Number of folders expected and found not equal: expected=" + folderCount + ", actual=" + count, 
-    			folderCount == count);
-
-    }
-    
-    private void verifyFiles(List files){
-    	Iterator iter = files.iterator();
-    	while (iter.hasNext()){
-    		String file = (String)iter.next();
-    		verifyFile(file);
-    	}
-    }
-    
-    private void verifyFile(String entryName){
-    	for (int i = 0; i < fileNames.length; i++){
-    		boolean dotProjectFileShouldBePresent = ".project".equals(entryName) && !flattenPaths && !excludeProjectPath;
-    		if (fileNames[i].equals(entryName) || dotProjectFileShouldBePresent)
-    			return;
-    	}
-    	fail("Could not find file named: " + entryName);
-    }
-    
-    private void verifyFolders(Set folderNames){
-    	Iterator folders = folderNames.iterator();
-    	while (folders.hasNext()){
-    		String folderName = (String)folders.next();
-    		if (!isDirectory(folderName)){
-    			if (flattenPaths)
-    				fail(folderName + " is not an expected folder");
-    			else if (!project.getName().equals(folderName))
-    				fail(folderName + " is not an expected folder");
-    		}
-    	}
-    }
-    
-    private boolean isDirectory(String name){
-    	for (int i = 0; i < directoryNames.length; i++){
-    		if (directoryNames[i].equals(name))
-    			return true;
-    	}
-    	return false;
-    }
-    
-	private boolean isDirectory(IResource resource){
-		for (int i = 0; i < directoryNames.length; i++){
-			if (directoryNames[i].equals(resource.getName()))
-				return true;
-		}
-		return false;
-	}
-	
-	private boolean isFile(IResource resource){
-		for (int i = 0; i < fileNames.length; i++){
-			if (fileNames[i].equals(resource.getName()))
-				return true;
-		}
-		return false;		
-	}
-	
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ExportFileSystemOperationTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ExportFileSystemOperationTest.java
deleted file mode 100644
index f0b86c1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ExportFileSystemOperationTest.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.datatransfer;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.tests.harness.FileSystemHelper;
-import org.eclipse.ui.dialogs.IOverwriteQuery;
-import org.eclipse.ui.internal.wizards.datatransfer.FileSystemExportOperation;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-public class ExportFileSystemOperationTest extends UITestCase implements
-		IOverwriteQuery {
-
-    private static final String[] directoryNames = { "dir1", "dir2" };
-
-    private static final String[] fileNames = { "file1.txt", "file2.txt" };
-
-    private String localDirectory;
-
-    private IProject project;
-    
-	public ExportFileSystemOperationTest(String testName) {
-		super(testName);
-	}
-
-	public String queryOverwrite(String pathString) {
-		return "";
-	}
-		
-    protected void doSetUp() throws Exception {
-		super.doSetUp();
-		project = FileUtil.createProject("Export" + getName());
-		File destination = 
-			new File(FileSystemHelper.getRandomLocation(FileSystemHelper.getTempDir())
-    			.toOSString());
-		localDirectory = destination.getAbsolutePath();
-		if (!destination.mkdirs())
-			fail("Could not set up destination directory for " + getName());
-	    setUpData();		
-	}
-
-    private void setUpData(){
-    	try{
-	    	for(int i = 0; i < directoryNames.length; i++){
-	    		IFolder folder = project.getFolder(directoryNames[i]);
-	    		folder.create(false, true, new NullProgressMonitor());
-	    		for (int k = 0; k < fileNames.length; k++){
-	    			IFile file = folder.getFile(fileNames[k]);
-	    			String contents =
-	    				directoryNames[i] + ", " + fileNames[k];		
-	    			file.create(new ByteArrayInputStream(contents.getBytes()), 
-	    				true, new NullProgressMonitor());
-	    		}
-	    	}
-    	}
-    	catch(Exception e){
-    		fail(e.toString());
-    	}
-    }
-    
-	protected void doTearDown() throws Exception {
-        super.doTearDown();
-        // delete exported data
-        File root = new File(localDirectory);
-        if (root.exists()){
-        	FileSystemHelper.clear(root);
-        }
-        try {
-            project.delete(true, true, null);
-        } catch (CoreException e) {
-            fail(e.toString());
-        }
-        finally{
-        	project = null;
-        	localDirectory = null;
-        }        
-	}
-	
-	public void testGetStatus() throws Exception {
-		List resources = new ArrayList();
-		resources.add(project);
-        FileSystemExportOperation operation = 
-        	new FileSystemExportOperation(
-        			null, resources, localDirectory, this);
-
-        assertTrue(operation.getStatus().getCode() == IStatus.OK);
-    }
-	
-	/* Export a project, with all directories */
-	public void testExportRootResource() throws Exception {
-		List resources = new ArrayList();
-		resources.add(project);
-        FileSystemExportOperation operation = 
-        	new FileSystemExportOperation(
-        			null, resources, localDirectory, this);
-        openTestWindow().run(true, true, operation);
-        
-        verifyFolders(directoryNames.length);		
-	}
-	
-	/* Export a project, create all leadup folders. */
-	public void testExportResources() throws Exception {
-		List resources = new ArrayList();
-		IResource[] members = project.members();
-		for (int i = 0; i < members.length; i++){
-			resources.add(members[i]);
-		}
-        FileSystemExportOperation operation = 
-        	new FileSystemExportOperation(
-        			null, resources, localDirectory, this);
-        openTestWindow().run(true, true, operation);
-        
-        verifyFolders(directoryNames.length);				
-	}
-	
-	/* Export folders, do not create leadup folders. */
-	public void testExportFolderCreateDirectoryStructure() throws Exception {
-		List resources = new ArrayList();
-		IResource[] members = project.members();
-		for (int i = 0; i < members.length; i++){
-			if (isDirectory(members[i]))
-				resources.add(members[i]);
-		}
-        FileSystemExportOperation operation = 
-        	new FileSystemExportOperation(
-        			null, resources, localDirectory, this);
-
-        operation.setCreateContainerDirectories(true);
-        operation.setCreateLeadupStructure(false);
-        openTestWindow().run(true, true, operation);
-        
-        verifyFolders(directoryNames.length, false);		
-	}
-	
-	/* Export files, do not create leadup folders. */
-	public void testExportFilesCreateDirectoryStructure() throws Exception {
-		List resources = new ArrayList();
-		IResource[] members = project.members();
-		for (int i = 0; i < members.length; i++){
-			if (isDirectory(members[i])){
-				IResource[] folderMembers = ((IFolder)members[i]).members();
-				for (int k = 0; k < folderMembers.length; k++){
-					if (isFile(folderMembers[k])){
-						resources.add(folderMembers[k]);
-					}
-				}
-			}
-		}
-		FileSystemExportOperation operation = 
-        	new FileSystemExportOperation(
-        			null, resources, localDirectory, this);
-
-        operation.setCreateContainerDirectories(true);
-        operation.setCreateLeadupStructure(false);
-        openTestWindow().run(true, true, operation);
-        
-        verifyFiles(resources);			
-	}
-	
-	/* Export files, overwrite - do not create container directories or lead up folders. */
-	public void testExportOverwrite() throws Exception {
-		List resources = new ArrayList();
-		resources.add(project);
-        FileSystemExportOperation operation = 
-        	new FileSystemExportOperation(
-        			null, resources, localDirectory, this);
-        openTestWindow().run(true, true, operation);
-        operation.setOverwriteFiles(true);
-        operation.setCreateContainerDirectories(false);
-        operation.setCreateLeadupStructure(false);
-        openTestWindow().run(true, true, operation);
-        
-        verifyFolders(directoryNames.length);		
-	}	
-	
-	private boolean isFile(IResource resource){
-		for (int i = 0; i < fileNames.length; i++){
-			if (fileNames[i].equals(resource.getName()))
-				return true;
-		}
-		return false;		
-	}
-	
-	private void verifyFiles(List resources){
-		for (int i = 0; i < resources.size(); i++){
-			IResource resource = (IResource)resources.get(i);
-			assertTrue(
-				"Export should have exported " + resource.getName(),
-				isFile(resource));
-				
-		}
-	}
-	
-	private void verifyFolders(int folderCount){
-		verifyFolders(folderCount, true);
-	}
-	
-	private void verifyFolders(int folderCount, boolean includeRootFolder){
-		File root; 
-		if (includeRootFolder){
-			root = new File(localDirectory, project.getName());
-			assertTrue("Export failed: " + project.getName() + " folder does not exist", root.exists());
-		}
-		else{
-			root = new File(localDirectory);
-		}
-        File[] files = root.listFiles();
-        List directories = new ArrayList();
-        if (files != null){	        
-	        for (int i = 0; i < files.length; i++){
-	        	if (files[i].isDirectory())
-	        		directories.add(files[i]);
-	        }
-        }
-        assertEquals("Export failed to Export all directories",
-                folderCount, directories.size());
-        
-        for (int i = 0; i < directories.size(); i++) {
-        	File directory = (File)directories.get(i);
-            assertTrue("Export failed to export directory " + directory.getName(), directory.exists());
-            verifyFolder(directory);
-        }
-	}
-	
-	private void verifyFolder(File directory){
-    	File[] files = directory.listFiles();
-    	if (files != null){
-	    	for (int k = 0; k < files.length; k++){
-	    		File file = files[k];
-	    		assertTrue("Export failed to export file: " + file.getName(), file.exists());
-	    	}
-    	}
-	}
-
-	private boolean isDirectory(IResource resource){
-		for (int i = 0; i < directoryNames.length; i++){
-			if (directoryNames[i].equals(resource.getName()))
-				return true;
-		}
-		return false;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ImportArchiveOperationTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ImportArchiveOperationTest.java
deleted file mode 100644
index 912fa13..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ImportArchiveOperationTest.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.datatransfer;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Properties;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-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.Platform;
-import org.eclipse.ui.dialogs.IOverwriteQuery;
-import org.eclipse.ui.internal.wizards.datatransfer.TarFile;
-import org.eclipse.ui.internal.wizards.datatransfer.TarLeveledStructureProvider;
-import org.eclipse.ui.internal.wizards.datatransfer.ZipLeveledStructureProvider;
-import org.eclipse.ui.tests.TestPlugin;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.wizards.datatransfer.ImportOperation;
-
-public class ImportArchiveOperationTest extends UITestCase implements IOverwriteQuery {
-	private static final String DATA_PATH_PREFIX = "data/org.eclipse.datatransferArchives/";
-
-	private static final String ARCHIVE_SOURCE_PROPERTY = "archiveSource";
-	
-	private static final String ARCHIVE_115800_PROPERTY = "bug115800Source";
-
-    private static final String rootResourceName = "test.txt";
-    
-    private static final String[] directoryNames = { "dir1", "dir2" };
-
-    private static final String[] fileNames = { "file1.txt", "file2.txt" };
-
-    private String localDirectory;
-
-    private IProject project;
-    
-    private URL zipFileURL;
-    
-    private URL tarFileURL;
-    
-    public ImportArchiveOperationTest(String testName) {
-        super(testName);
-    }
-
-    /*
-     * @see IOverwriteQuery#queryOverwrite(String)
-     */
-    public String queryOverwrite(String pathString) {
-        //Always return an empty String - we aren't
-        //doing anything interesting
-        return "";
-    }
-
-    /**
-     * Tear down. Delete the project we created and all of the
-     * files on the file system.
-     */
-    protected void doTearDown() throws Exception {
-        super.doTearDown();
-        try {
-            project.delete(true, true, null);
-        } catch (CoreException e) {
-            fail(e.toString());
-        }
-        finally{
-        	localDirectory = null;
-        	project = null;
-        	zipFileURL = null;
-        	tarFileURL = null;
-        }
-    }
-
-    private void setup(String propertyName) throws Exception{
-        Class testClass = Class
-		        .forName("org.eclipse.ui.tests.datatransfer.ImportArchiveOperationTest");
-		InputStream stream = testClass.getResourceAsStream("tests.ini");
-		Properties properties = new Properties();
-		properties.load(stream);
-		String zipFileName = properties.getProperty(propertyName);
-		localDirectory = zipFileName;
-		
-		zipFileURL = Platform.asLocalURL(Platform.find(TestPlugin.getDefault().getBundle(), 
-				new Path(DATA_PATH_PREFIX).append(zipFileName+ ".zip")));
-		tarFileURL = Platform.asLocalURL(Platform.find(TestPlugin.getDefault().getBundle(), 
-				new Path(DATA_PATH_PREFIX).append(zipFileName+ ".tar")));    	
-    }
-    
-    public void testZipGetStatus() throws Exception {
-    	setup(ARCHIVE_SOURCE_PROPERTY);
-        project = FileUtil.createProject("ImportZipGetStatus");
-        ZipFile zipFile = new ZipFile(zipFileURL.getPath());
-        
-        ZipLeveledStructureProvider structureProvider = new ZipLeveledStructureProvider(zipFile);
-        
-        Enumeration zipEntries = zipFile.entries();
-        List entries = new ArrayList();
-        while (zipEntries.hasMoreElements()){
-        	entries.add(zipEntries.nextElement());
-        }
-		ImportOperation operation = new ImportOperation(
-				new Path(zipFileURL.getPath()), structureProvider.getRoot(),
-				structureProvider, this, entries);
-
-		closeZipFile(zipFile);
-        assertTrue(operation.getStatus().getCode() == IStatus.OK);
-    }
-
-    public void testTarGetStatus() throws Exception {
-    	setup(ARCHIVE_SOURCE_PROPERTY);
-        project = FileUtil.createProject("ImportTarGetStatus");
-        TarFile tarFile = new TarFile(tarFileURL.getPath());
-        TarLeveledStructureProvider structureProvider = new TarLeveledStructureProvider(tarFile);
-        
-        Enumeration tarEntries = tarFile.entries();
-        List entries = new ArrayList();
-        while (tarEntries.hasMoreElements()){
-        	entries.add(tarEntries.nextElement());
-        }
-		ImportOperation operation = new ImportOperation(
-				new Path(tarFileURL.getPath()), structureProvider.getRoot(),
-				structureProvider, this, entries);
-
-        assertTrue(operation.getStatus().getCode() == IStatus.OK);
-    }
-    
-    public void testZipImport() throws Exception {
-    	setup(ARCHIVE_SOURCE_PROPERTY);
-        project = FileUtil.createProject("ImportZip");
-        ZipFile zipFile = new ZipFile(zipFileURL.getPath());
-        ZipLeveledStructureProvider structureProvider = new ZipLeveledStructureProvider(zipFile);
-        zipFile = new ZipFile(zipFileURL.getPath());
-	    Enumeration zipEntries = zipFile.entries();
-	    List entries = new ArrayList();
-	    while (zipEntries.hasMoreElements()){
-	    	ZipEntry entry = (ZipEntry)zipEntries.nextElement();
-	    	if (!entry.isDirectory())
-	    		entries.add(entry);
-	    }
-		ImportOperation operation = new ImportOperation(
-				new Path(project.getName()), structureProvider.getRoot(),
-				structureProvider, this, entries);
-		
-        openTestWindow().run(true, true, operation);
-        closeZipFile(zipFile);
-        
-        verifyFiles(directoryNames.length, false);
-    }
-
-    
-    public void testTarImport() throws Exception {
-    	setup(ARCHIVE_SOURCE_PROPERTY);
-        project = FileUtil.createProject("ImportTar");
-        TarFile tarFile = new TarFile(tarFileURL.getPath());
-        TarLeveledStructureProvider structureProvider = new TarLeveledStructureProvider(tarFile);
-    
-	    Enumeration tarEntries = tarFile.entries();
-	    List entries = new ArrayList();
-	    while (tarEntries.hasMoreElements()){
-	    	entries.add(tarEntries.nextElement());
-	    }
-		ImportOperation operation = new ImportOperation(
-				new Path(project.getName()), structureProvider.getRoot(),
-				structureProvider, this, entries);
-        
-        openTestWindow().run(true, true, operation);
-
-        verifyFiles(directoryNames.length, false);
-    }
-
-    public void testTarSetOverwriteResources() throws Exception {
-    	setup(ARCHIVE_SOURCE_PROPERTY);
-        project = FileUtil.createProject("ImportTarSetOverwriteResources");
-        TarFile tarFile = new TarFile(tarFileURL.getPath());
-        TarLeveledStructureProvider structureProvider = new TarLeveledStructureProvider(tarFile);
-    
-	    Enumeration tarEntries = tarFile.entries();
-	    List entries = new ArrayList();
-	    while (tarEntries.hasMoreElements()){
-	    	entries.add(tarEntries.nextElement());
-	    }
-		ImportOperation operation = new ImportOperation(
-				new Path(project.getName()), structureProvider.getRoot(),
-				structureProvider, this, entries);
-        
-        openTestWindow().run(true, true, operation);
-        operation.setOverwriteResources(true);
-        openTestWindow().run(true, true, operation);
-        verifyFiles(directoryNames.length, false);
-    }
-    
-    public void testZipSetOverwriteResources() throws Exception {
-    	setup(ARCHIVE_SOURCE_PROPERTY);
-    	project = FileUtil.createProject("ImporZiprSetOverwriteResources");
-        ZipFile zipFile = new ZipFile(zipFileURL.getPath());
-        ZipLeveledStructureProvider structureProvider = new ZipLeveledStructureProvider(zipFile);
-        zipFile = new ZipFile(zipFileURL.getPath());
-	    Enumeration zipEntries = zipFile.entries();
-	    List entries = new ArrayList();
-	    while (zipEntries.hasMoreElements()){
-	    	ZipEntry entry = (ZipEntry)zipEntries.nextElement();
-	    	if (!entry.isDirectory())
-	    		entries.add(entry);
-	    }
-		ImportOperation operation = new ImportOperation(
-				new Path(project.getName()), structureProvider.getRoot(),
-				structureProvider, this, entries);
-		
-        openTestWindow().run(true, true, operation);
-        operation.setOverwriteResources(true);
-        openTestWindow().run(true, true, operation);
-        closeZipFile(zipFile);  
-        verifyFiles(directoryNames.length, false);
-    }
-    
-    public void testZipWithFileAtRoot() throws Exception {
-    	setup(ARCHIVE_115800_PROPERTY);
-        project = FileUtil.createProject("ImportZipWithFileAtRoot");
-        ZipFile zipFile = new ZipFile(zipFileURL.getPath());
-        ZipLeveledStructureProvider structureProvider = new ZipLeveledStructureProvider(zipFile);
-        zipFile = new ZipFile(zipFileURL.getPath());
-	    Enumeration zipEntries = zipFile.entries();
-	    List entries = new ArrayList();
-	    while (zipEntries.hasMoreElements()){
-	    	ZipEntry entry = (ZipEntry)zipEntries.nextElement();
-	    	if (!entry.isDirectory())
-	    		entries.add(entry);
-	    }
-		ImportOperation operation = new ImportOperation(
-				new Path(project.getName()), structureProvider.getRoot(),
-				structureProvider, this, entries);
-		
-        openTestWindow().run(true, true, operation);
-        closeZipFile(zipFile);
-        
-        verifyFiles(directoryNames.length, true);    	
-    }
-
-    
-    public void testTarWithFileAtRoot() throws Exception {
-    	setup(ARCHIVE_115800_PROPERTY);
-        project = FileUtil.createProject("ImportTarWithFileAtRoot");
-        TarFile tarFile = new TarFile(tarFileURL.getPath());
-        TarLeveledStructureProvider structureProvider = new TarLeveledStructureProvider(tarFile);
-    
-	    Enumeration tarEntries = tarFile.entries();
-	    List entries = new ArrayList();
-	    while (tarEntries.hasMoreElements()){
-	    	entries.add(tarEntries.nextElement());
-	    }
-		ImportOperation operation = new ImportOperation(
-				new Path(project.getName()), structureProvider.getRoot(),
-				structureProvider, this, entries);
-        
-        openTestWindow().run(true, true, operation);
-
-        verifyFiles(directoryNames.length, true);
-    
-    }
-    
-    /**
-     * Verifies that all files were imported.
-     * 
-     * @param folderCount number of folders that were imported
-     */
-    private void verifyFiles(int folderCount, boolean hasRootMembers) {
-        try {
-            IPath path = new Path(localDirectory);
-            IResource targetFolder = project.findMember(path.makeRelative());
-
-            assertTrue("Import failed", targetFolder instanceof IContainer);
-
-            IResource[] resources = ((IContainer) targetFolder).members();
-            if (!hasRootMembers){
-	            assertEquals("Import failed to import all directories",
-	                    folderCount, resources.length);
-	            for (int i = 0; i < resources.length; i++) {
-	                assertTrue("Import failed", resources[i] instanceof IContainer);
-	                verifyFolder((IContainer) resources[i]);
-	            }
-            }
-            else {
-            	for (int i = 0; i < resources.length; i++){
-            		if (resources[i] instanceof IContainer)
-            			verifyFolder((IContainer)resources[i]);
-            		else
-            			assertTrue("Root resource is not present or is not present as a file: " + rootResourceName, 
-            					resources[i] instanceof IFile && rootResourceName.equals(resources[i].getName()));
-            	}
-            }
-
-        } catch (CoreException e) {
-            fail(e.toString());
-        }
-    }
-
-    /**
-     * Verifies that all files were imported into the specified folder.
-     */
-    private void verifyFolder(IContainer folder) {
-        try {
-            IResource[] files = folder.members();
-            assertEquals("Import failed to import all files", fileNames.length,
-                    files.length);
-            for (int j = 0; j < fileNames.length; j++) {
-                String fileName = fileNames[j];
-                int k;
-                for (k = 0; k < files.length; k++) {
-                    if (fileName.equals(files[k].getName()))
-                        break;
-                }
-                assertTrue("Import failed to import file " + fileName,
-                        k < fileNames.length);
-            }
-        } catch (CoreException e) {
-            fail(e.toString());
-        }
-    }
-    
-    private boolean closeZipFile(ZipFile zipFile){
-    	try{
-    		zipFile.close();
-    	}
-    	catch(IOException e){
-    		fail("Could not close zip file " + zipFile.getName(), e);
-    		return false;
-    	}
-    	return true;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ImportExistingProjectsWizardTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ImportExistingProjectsWizardTest.java
deleted file mode 100644
index 7586415..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ImportExistingProjectsWizardTest.java
+++ /dev/null
@@ -1,964 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - Bits of importWizard from DeprecatedUIWizards 
- *     Red Hat, Inc - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.datatransfer;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.core.tests.harness.FileSystemHelper;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.dialogs.ImportExportWizard;
-import org.eclipse.ui.internal.wizards.datatransfer.WizardProjectsImportPage;
-import org.eclipse.ui.internal.wizards.datatransfer.WizardProjectsImportPage.ProjectRecord;
-import org.eclipse.ui.tests.TestPlugin;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-import org.eclipse.ui.tests.harness.util.FileTool;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-public class ImportExistingProjectsWizardTest extends UITestCase {
-	private static final String DATA_PATH_PREFIX = "data/org.eclipse.datatransferArchives/";
-	private static final String WS_DATA_PREFIX = "data/workspaces";
-	private static final String WS_DATA_LOCATION = "importExistingFromDirTest";
-	private static final String ARCHIVE_HELLOWORLD = "helloworld";
-	private static final String ARCHIVE_FILE_WITH_EMPTY_FOLDER = "EmptyFolderInArchive";
-
-	private static final String[] FILE_LIST = new String[] { "test-file-1.txt",
-			"test-file-2.doc", ".project" };
-
-	private static final String[] ARCHIVE_FILE_EMPTY_FOLDER_LIST = new String[] {
-			"empty", "folder" };
-
-	private String dataLocation = null;
-
-	private String zipLocation = null;
-
-	private boolean originalRefreshSetting;
-
-	public ImportExistingProjectsWizardTest(String testName) {
-		super(testName);
-	}
-
-	private Shell getShell() {
-		return DialogCheck.getShell();
-	}
-
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		originalRefreshSetting = ResourcesPlugin.getPlugin()
-				.getPluginPreferences().getBoolean(
-						ResourcesPlugin.PREF_AUTO_REFRESH);
-		ResourcesPlugin.getPlugin().getPluginPreferences().setValue(
-				ResourcesPlugin.PREF_AUTO_REFRESH, true);
-	}
-
-	protected void doTearDown() throws Exception {
-		super.doTearDown();
-		IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
-		IProject[] projects = wsRoot.getProjects();
-		for (int i = 0; i < projects.length; i++) {
-			FileUtil.deleteProject(projects[i]);
-		}
-		// clean up any data directories created
-		if (dataLocation != null) {
-			File root = new File(dataLocation);
-			if (root.exists()) {
-				FileSystemHelper.clear(root);
-			}
-		}
-		dataLocation = null; // reset for next test
-
-		// do same for zip location
-		if (zipLocation != null) {
-			File root = new File(zipLocation);
-			if (root.exists()) {
-				// zipLocation is the zip file, not the temp directory it was
-				// copied to
-				FileSystemHelper.clear(root.getParentFile());
-			}
-		}
-		zipLocation = null; // reset for next test
-
-		ResourcesPlugin.getPlugin().getPluginPreferences().setValue(
-				ResourcesPlugin.PREF_AUTO_REFRESH, originalRefreshSetting);
-	}
-
-	private void waitForRefresh() {
-		try {
-			PlatformUI.getWorkbench().getProgressService().busyCursorWhile(
-					new IRunnableWithProgress() {
-						public void run(IProgressMonitor monitor)
-								throws InterruptedException {
-							Job.getJobManager().join(
-									ResourcesPlugin.FAMILY_AUTO_REFRESH,
-									new NullProgressMonitor());
-						}
-					});
-		} catch (InvocationTargetException e) {
-			fail(e.getLocalizedMessage());
-		} catch (InterruptedException e) {
-			fail(e.getLocalizedMessage());
-		}
-	}
-
-	public void testFindSingleZip() {
-		try {
-			URL archiveFile = Platform.asLocalURL(Platform.find(TestPlugin
-					.getDefault().getBundle(), new Path(DATA_PATH_PREFIX
-					+ ARCHIVE_HELLOWORLD + ".zip")));
-			WizardProjectsImportPage wpip = getNewWizard();
-			HashSet projects = new HashSet();
-			projects.add("HelloWorld");
-
-			wpip.getProjectFromDirectoryRadio().setSelection((false)); // We
-																		// want
-																		// the
-																		// other
-																		// one
-																		// selected
-			wpip.updateProjectsList(archiveFile.getPath());
-
-			ProjectRecord[] selectedProjects = wpip.getValidProjects();
-			ArrayList projectNames = new ArrayList();
-			for (int i = 0; i < selectedProjects.length; i++) {
-				projectNames.add(selectedProjects[i].getProjectName());
-			}
-
-			assertTrue("Not all projects were found correctly in zip",
-					projectNames.containsAll(projects));
-		} catch (IOException e) {
-			fail(e.toString());
-		}
-	}
-
-	public void testFindSingleTar() {
-		try {
-			URL archiveFile = Platform.asLocalURL(Platform.find(TestPlugin
-					.getDefault().getBundle(), new Path(DATA_PATH_PREFIX
-					+ ARCHIVE_HELLOWORLD + ".tar")));
-			WizardProjectsImportPage wpip = getNewWizard();
-			HashSet projects = new HashSet();
-			projects.add("HelloWorld");
-
-			wpip.getProjectFromDirectoryRadio().setSelection((false)); // We
-																		// want
-																		// the
-																		// other
-																		// one
-																		// selected
-			wpip.updateProjectsList(archiveFile.getPath());
-
-			ProjectRecord[] selectedProjects = wpip.getValidProjects();
-			ArrayList projectNames = new ArrayList();
-			for (int i = 0; i < selectedProjects.length; i++) {
-				projectNames.add(selectedProjects[i].getProjectName());
-			}
-
-			assertTrue("Not all projects were found correctly in tar",
-					projectNames.containsAll(projects));
-		} catch (IOException e) {
-			fail(e.toString());
-		}
-	}
-
-	public void testFindSingleDirectory() {
-		try {
-			dataLocation = copyDataLocation();
-			IPath wsPath = new Path(dataLocation).append("HelloWorld");
-			WizardProjectsImportPage wpip = getNewWizard();
-			HashSet projects = new HashSet();
-			projects.add("HelloWorld");
-			// We're importing a directory
-			wpip.getProjectFromDirectoryRadio().setSelection((true));
-			wpip.updateProjectsList(wsPath.toOSString());
-
-			ProjectRecord[] selectedProjects = wpip.getValidProjects();
-			ArrayList projectNames = new ArrayList();
-			for (int i = 0; i < selectedProjects.length; i++) {
-				projectNames.add(selectedProjects[i].getProjectName());
-			}
-
-			assertTrue("Not all projects were found correctly in directory",
-					projectNames.containsAll(projects));
-		} catch (IOException e) {
-			fail(e.toString());
-		}
-	}
-
-	public void testDoNotShowProjectWithSameName() {
-		try {
-			dataLocation = copyDataLocation();
-			IPath wsPath = new Path(dataLocation);
-
-			FileUtil.createProject("HelloWorld");
-
-			WizardProjectsImportPage wpip = getNewWizard();
-			// We're importing a directory
-			wpip.getProjectFromDirectoryRadio().setSelection((true));
-			wpip.updateProjectsList(wsPath.toOSString());
-
-			ProjectRecord[] selectedProjects = wpip.getValidProjects();
-			ArrayList projectNames = new ArrayList();
-			for (int i = 0; i < selectedProjects.length; i++) {
-				projectNames.add(selectedProjects[i].getProjectName());
-			}
-
-			assertEquals("there should only be the WorldHello project left", 1,
-					projectNames.size());
-
-			assertTrue(
-					"HelloWorld project should not be found in project list.",
-					!projectNames.contains("HelloWorld"));
-		} catch (Exception e) {
-			fail(e.toString());
-		}
-	}
-
-	public void testImportSingleZip() {
-		try {
-			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-
-			IProject[] workspaceProjects = root.getProjects();
-			for (int i = 0; i < workspaceProjects.length; i++)
-				FileUtil.deleteProject(workspaceProjects[i]);
-			URL archiveFile = Platform.asLocalURL(Platform.find(TestPlugin
-					.getDefault().getBundle(), new Path(DATA_PATH_PREFIX
-					+ ARCHIVE_HELLOWORLD + ".zip")));
-			WizardProjectsImportPage wpip = getNewWizard();
-			HashSet projects = new HashSet();
-			projects.add("HelloWorld");
-
-			wpip.getProjectFromDirectoryRadio().setSelection((false)); // We
-																		// want
-																		// the
-																		// other
-																		// one
-																		// selected
-			wpip.updateProjectsList(archiveFile.getPath());
-
-			ProjectRecord[] selectedProjects = wpip.getValidProjects();
-			ArrayList projectNames = new ArrayList();
-			for (int i = 0; i < selectedProjects.length; i++) {
-				projectNames.add(selectedProjects[i].getProjectName());
-			}
-
-			assertTrue("Not all projects were found correctly in zip",
-					projectNames.containsAll(projects));
-
-			CheckboxTreeViewer projectsList = wpip.getProjectsList();
-			projectsList.setCheckedElements(selectedProjects);
-			wpip.createProjects(); // Try importing all the projects we found
-			waitForRefresh();
-
-			// "HelloWorld" should be the only project in the workspace
-			workspaceProjects = root.getProjects();
-			if (workspaceProjects.length != 1)
-				fail("Incorrect Number of projects imported");
-			IFolder helloFolder = workspaceProjects[0].getFolder("HelloWorld");
-			if (helloFolder.exists())
-				fail("Project was imported as a folder into itself");
-
-			verifyProjectInWorkspace(true, workspaceProjects[0], FILE_LIST,
-					true);
-
-		} catch (IOException e) {
-			fail(e.toString());
-		} catch (CoreException e) {
-			fail(e.toString());
-		}
-
-	}
-
-	public void testImportZipWithEmptyFolder() {
-		try {
-			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-
-			IProject[] workspaceProjects = root.getProjects();
-			for (int i = 0; i < workspaceProjects.length; i++)
-				FileUtil.deleteProject(workspaceProjects[i]);
-			URL archiveFile = Platform.asLocalURL(Platform.find(TestPlugin
-					.getDefault().getBundle(), new Path(DATA_PATH_PREFIX
-					+ ARCHIVE_FILE_WITH_EMPTY_FOLDER + ".zip")));
-			WizardProjectsImportPage wpip = getNewWizard();
-			HashSet projects = new HashSet();
-			projects.add("A");
-
-			wpip.getProjectFromDirectoryRadio().setSelection((false)); // We
-																		// want
-																		// the
-																		// other
-																		// one
-																		// selected
-			wpip.updateProjectsList(archiveFile.getPath());
-
-			ProjectRecord[] selectedProjects = wpip.getValidProjects();
-			ArrayList projectNames = new ArrayList();
-			for (int i = 0; i < selectedProjects.length; i++) {
-				projectNames.add(selectedProjects[i].getProjectName());
-			}
-
-			assertTrue("Not all projects were found correctly in zip",
-					projectNames.containsAll(projects));
-
-			CheckboxTreeViewer projectsList = wpip.getProjectsList();
-			projectsList.setCheckedElements(selectedProjects);
-			wpip.createProjects(); // Try importing all the projects we found
-			waitForRefresh();
-
-			// "HelloWorld" should be the only project in the workspace
-			workspaceProjects = root.getProjects();
-			if (workspaceProjects.length != 1)
-				fail("Incorrect Number of projects imported");
-			IFolder helloFolder = workspaceProjects[0].getFolder("HelloWorld");
-			if (helloFolder.exists())
-				fail("Project was imported as a folder into itself");
-
-			verifyProjectInWorkspace(true, workspaceProjects[0],
-					ARCHIVE_FILE_EMPTY_FOLDER_LIST, false);
-
-		} catch (IOException e) {
-			fail(e.toString());
-		} catch (CoreException e) {
-			fail(e.toString());
-		}
-	}
-
-	public void testImportSingleTar() {
-		try {
-			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-
-			IProject[] workspaceProjects = root.getProjects();
-			for (int i = 0; i < workspaceProjects.length; i++)
-				FileUtil.deleteProject(workspaceProjects[i]);
-			URL archiveFile = Platform.asLocalURL(Platform.find(TestPlugin
-					.getDefault().getBundle(), new Path(DATA_PATH_PREFIX
-					+ ARCHIVE_HELLOWORLD + ".tar")));
-			WizardProjectsImportPage wpip = getNewWizard();
-			HashSet projects = new HashSet();
-			projects.add("HelloWorld");
-
-			wpip.getProjectFromDirectoryRadio().setSelection((false)); // We
-																		// want
-																		// the
-																		// other
-																		// one
-																		// selected
-			wpip.updateProjectsList(archiveFile.getPath());
-
-			ProjectRecord[] selectedProjects = wpip.getValidProjects();
-			ArrayList projectNames = new ArrayList();
-			for (int i = 0; i < selectedProjects.length; i++) {
-				projectNames.add(selectedProjects[i].getProjectName());
-			}
-
-			assertTrue("Not all projects were found correctly in tar",
-					projectNames.containsAll(projects));
-
-			CheckboxTreeViewer projectsList = wpip.getProjectsList();
-			projectsList.setCheckedElements(selectedProjects);
-			wpip.createProjects(); // Try importing all the projects we found
-			waitForRefresh();
-
-			// "HelloWorld" should be the only project in the workspace
-			workspaceProjects = root.getProjects();
-			if (workspaceProjects.length != 1)
-				fail("Incorrect Number of projects imported");
-			IFolder helloFolder = workspaceProjects[0].getFolder("HelloWorld");
-			if (helloFolder.exists())
-				fail("Project was imported as a folder into itself");
-
-			verifyProjectInWorkspace(true, workspaceProjects[0], FILE_LIST,
-					true);
-
-		} catch (IOException e) {
-			fail(e.toString());
-		} catch (CoreException e) {
-			fail(e.toString());
-		}
-
-	}
-
-	public void testImportTarWithEmptyFolder() {
-		try {
-			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-
-			IProject[] workspaceProjects = root.getProjects();
-			for (int i = 0; i < workspaceProjects.length; i++)
-				FileUtil.deleteProject(workspaceProjects[i]);
-			URL archiveFile = Platform.asLocalURL(Platform.find(TestPlugin
-					.getDefault().getBundle(), new Path(DATA_PATH_PREFIX
-					+ ARCHIVE_FILE_WITH_EMPTY_FOLDER + ".tar")));
-			WizardProjectsImportPage wpip = getNewWizard();
-			HashSet projects = new HashSet();
-			projects.add("A");
-
-			wpip.getProjectFromDirectoryRadio().setSelection((false)); // We
-																		// want
-																		// the
-																		// other
-																		// one
-																		// selected
-			wpip.updateProjectsList(archiveFile.getPath());
-
-			ProjectRecord[] selectedProjects = wpip.getValidProjects();
-			ArrayList projectNames = new ArrayList();
-			for (int i = 0; i < selectedProjects.length; i++) {
-				projectNames.add(selectedProjects[i].getProjectName());
-			}
-
-			assertTrue("Not all projects were found correctly in tar",
-					projectNames.containsAll(projects));
-
-			CheckboxTreeViewer projectsList = wpip.getProjectsList();
-			projectsList.setCheckedElements(selectedProjects);
-			wpip.createProjects(); // Try importing all the projects we found
-			waitForRefresh();
-
-			// "HelloWorld" should be the only project in the workspace
-			workspaceProjects = root.getProjects();
-			if (workspaceProjects.length != 1)
-				fail("Incorrect Number of projects imported: Expected=1, Actual="
-						+ workspaceProjects.length);
-			IFolder helloFolder = workspaceProjects[0].getFolder("A");
-			if (helloFolder.exists())
-				fail("Project was imported as a folder into itself");
-
-			verifyProjectInWorkspace(true, workspaceProjects[0],
-					ARCHIVE_FILE_EMPTY_FOLDER_LIST, false);
-
-		} catch (IOException e) {
-			fail(e.toString());
-		} catch (CoreException e) {
-			fail(e.toString());
-		}
-
-	}
-
-	public void testImportSingleDirectory() {
-		IPath wsPath = null;
-		try {
-			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-
-			IProject[] workspaceProjects = root.getProjects();
-			for (int i = 0; i < workspaceProjects.length; i++)
-				FileUtil.deleteProject(workspaceProjects[i]);
-
-			dataLocation = copyDataLocation();
-			wsPath = new Path(dataLocation).append("HelloWorld");
-			WizardProjectsImportPage wpip = getNewWizard();
-			HashSet projects = new HashSet();
-			projects.add("HelloWorld");
-
-			wpip.getProjectFromDirectoryRadio().setSelection((true));
-			wpip.updateProjectsList(wsPath.toOSString());
-			ProjectRecord[] selectedProjects = wpip.getValidProjects();
-			ArrayList projectNames = new ArrayList();
-			for (int i = 0; i < selectedProjects.length; i++) {
-				projectNames.add(selectedProjects[i].getProjectName());
-			}
-
-			assertTrue("Not all projects were found correctly in directory",
-					projectNames.containsAll(projects));
-
-			CheckboxTreeViewer projectsList = wpip.getProjectsList();
-			projectsList.setCheckedElements(selectedProjects);
-			wpip.createProjects(); // Try importing all the projects we found
-			waitForRefresh();
-
-			// "HelloWorld" should be the only project in the workspace
-			workspaceProjects = root.getProjects();
-			if (workspaceProjects.length != 1)
-				fail("Incorrect Number of projects imported");
-			IFolder helloFolder = workspaceProjects[0].getFolder("HelloWorld");
-			if (helloFolder.exists())
-				fail("Project was imported as a folder into itself");
-
-			verifyProjectInWorkspace(false, workspaceProjects[0], FILE_LIST,
-					true);
-
-		} catch (IOException e) {
-			fail(e.toString());
-		} catch (CoreException e) {
-			fail(e.toString());
-		}
-	}
-
-	public void testImportSingleDirectoryWithCopy() {
-		IPath wsPath = null;
-		try {
-			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-
-			IProject[] workspaceProjects = root.getProjects();
-			for (int i = 0; i < workspaceProjects.length; i++)
-				FileUtil.deleteProject(workspaceProjects[i]);
-
-			dataLocation = copyDataLocation();
-			wsPath = new Path(dataLocation).append("HelloWorld");
-			WizardProjectsImportPage wpip = getNewWizard();
-			HashSet projects = new HashSet();
-			projects.add("HelloWorld");
-
-			wpip.getProjectFromDirectoryRadio().setSelection((true));
-			wpip.getCopyCheckbox().setSelection(true);
-			wpip.saveWidgetValues();
-			wpip.restoreWidgetValues();
-
-			wpip.updateProjectsList(wsPath.toOSString());
-			ProjectRecord[] selectedProjects = wpip.getValidProjects();
-			ArrayList projectNames = new ArrayList();
-			for (int i = 0; i < selectedProjects.length; i++) {
-				projectNames.add(selectedProjects[i].getProjectName());
-			}
-
-			assertTrue("Not all projects were found correctly in zip",
-					projectNames.containsAll(projects));
-
-			CheckboxTreeViewer projectsList = wpip.getProjectsList();
-			projectsList.setCheckedElements(selectedProjects);
-			wpip.createProjects(); // Try importing all the projects we found
-			waitForRefresh();
-
-			// "HelloWorld" should be the only project in the workspace
-			workspaceProjects = root.getProjects();
-			if (workspaceProjects.length != 1)
-				fail("Incorrect Number of projects imported");
-			IFolder helloFolder = workspaceProjects[0].getFolder("HelloWorld");
-			if (helloFolder.exists())
-				fail("Project was imported as a folder into itself");
-
-			verifyProjectInWorkspace(true, workspaceProjects[0], FILE_LIST,
-					true);
-
-		} catch (IOException e) {
-			fail(e.toString());
-		} catch (CoreException e) {
-			fail(e.toString());
-		}
-	}
-
-	public void testImportSingleDirectoryWithCopyDeleteProjectKeepContents() {
-		IPath wsPath = null;
-		try {
-			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-
-			IProject[] workspaceProjects = root.getProjects();
-			for (int i = 0; i < workspaceProjects.length; i++)
-				FileUtil.deleteProject(workspaceProjects[i]);
-
-			dataLocation = copyDataLocation();
-			wsPath = new Path(dataLocation).append("HelloWorld");
-			WizardProjectsImportPage wpip = getNewWizard();
-			HashSet projects = new HashSet();
-			projects.add("HelloWorld");
-
-			wpip.getProjectFromDirectoryRadio().setSelection((true));
-			wpip.getCopyCheckbox().setSelection(true);
-			wpip.saveWidgetValues();
-			wpip.restoreWidgetValues();
-
-			wpip.updateProjectsList(wsPath.toOSString());
-			ProjectRecord[] selectedProjects = wpip.getValidProjects();
-			ArrayList projectNames = new ArrayList();
-			for (int i = 0; i < selectedProjects.length; i++) {
-				projectNames.add(selectedProjects[i].getProjectName());
-			}
-
-			assertTrue("Not all projects were found correctly in zip",
-					projectNames.containsAll(projects));
-
-			CheckboxTreeViewer projectsList = wpip.getProjectsList();
-			projectsList.setCheckedElements(selectedProjects);
-			wpip.createProjects(); // Try importing all the projects we found
-			waitForRefresh();
-
-			// "HelloWorld" should be the only project in the workspace
-			workspaceProjects = root.getProjects();
-			if (workspaceProjects.length != 1)
-				fail("Incorrect Number of projects imported: "
-						+ workspaceProjects.length + " projects in workspace.");
-			IFolder helloFolder = workspaceProjects[0].getFolder("HelloWorld");
-			if (helloFolder.exists())
-				fail("Project was imported as a folder into itself");
-
-			verifyProjectInWorkspace(true, workspaceProjects[0], FILE_LIST,
-					true);
-
-			// delete projects in workspace but not contents
-			for (int i = 0; i < workspaceProjects.length; i++) {
-				workspaceProjects[i].delete(false, true, null);
-			}
-			assertTrue("Test project not deleted successfully.", root
-					.getProjects().length == 0);
-
-			// perform same test again, but this time import from this workspace
-			final WizardProjectsImportPage wpip2 = getNewWizard();
-			HashSet projects2 = new HashSet();
-			projects2.add("HelloWorld");
-
-			wpip2.getProjectFromDirectoryRadio().setSelection((true));
-			wpip2.getCopyCheckbox().setSelection(true);
-			wpip2.saveWidgetValues();
-			wpip2.restoreWidgetValues();
-
-			wpip2.updateProjectsList(wsPath.toOSString());
-			ProjectRecord[] selectedProjects2 = wpip2.getValidProjects();
-			assertTrue("Not all projects were found correctly in zip (2).",
-					selectedProjects2.length == 1);
-
-			ArrayList projectNames2 = new ArrayList();
-			for (int i = 0; i < selectedProjects2.length; i++) {
-				projectNames2.add(selectedProjects2[i].getProjectName());
-			}
-
-			assertTrue("Not all projects were found correctly in zip (2)",
-					projectNames2.containsAll(projects2));
-
-			CheckboxTreeViewer projects2List = wpip2.getProjectsList();
-			projects2List.setCheckedElements(selectedProjects2);
-			wpip2.createProjects(); // Try importing all the projects we found
-			waitForRefresh();
-
-			// "HelloWorld" should be the only project in the workspace
-			workspaceProjects = root.getProjects();
-			if (workspaceProjects.length != 1)
-				fail("Incorrect Number of projects imported");
-			helloFolder = workspaceProjects[0].getFolder("HelloWorld");
-			if (helloFolder.exists())
-				fail("Project was imported as a folder into itself (2)");
-
-			verifyProjectInWorkspace(true, workspaceProjects[0], FILE_LIST,
-					true);
-
-		} catch (IOException e) {
-			fail(e.toString());
-		} catch (CoreException e) {
-			fail(e.toString());
-		}
-	}
-
-	public void testImportZipDeleteContentsImportAgain() {
-		try {
-			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-
-			IProject[] workspaceProjects = root.getProjects();
-			for (int i = 0; i < workspaceProjects.length; i++)
-				FileUtil.deleteProject(workspaceProjects[i]);
-			URL archiveFile = Platform.asLocalURL(Platform.find(TestPlugin
-					.getDefault().getBundle(), new Path(DATA_PATH_PREFIX
-					+ ARCHIVE_HELLOWORLD + ".zip")));
-			WizardProjectsImportPage wpip = getNewWizard();
-			HashSet projects = new HashSet();
-			projects.add("HelloWorld");
-
-			wpip.getProjectFromDirectoryRadio().setSelection((false)); // We
-																		// want
-																		// the
-																		// other
-																		// one
-																		// selected
-			wpip.updateProjectsList(archiveFile.getPath());
-
-			ProjectRecord[] selectedProjects = wpip.getValidProjects();
-			ArrayList projectNames = new ArrayList();
-			for (int i = 0; i < selectedProjects.length; i++) {
-				projectNames.add(selectedProjects[i].getProjectName());
-			}
-
-			assertTrue("Not all projects were found correctly in zip",
-					projectNames.containsAll(projects));
-
-			CheckboxTreeViewer projectsList = wpip.getProjectsList();
-			projectsList.setCheckedElements(selectedProjects);
-			wpip.createProjects(); // Try importing all the projects we found
-			waitForRefresh();
-
-			// "HelloWorld" should be the only project in the workspace
-			workspaceProjects = root.getProjects();
-			if (workspaceProjects.length != 1)
-				fail("Incorrect Number of projects imported");
-			IFolder helloFolder = workspaceProjects[0].getFolder("HelloWorld");
-			if (helloFolder.exists())
-				fail("Project was imported as a folder into itself");
-
-			verifyProjectInWorkspace(true, workspaceProjects[0], FILE_LIST,
-					true);
-
-			// delete projects in workspace but not contents
-			for (int i = 0; i < workspaceProjects.length; i++) {
-				workspaceProjects[i].delete(true, true, null);
-			}
-			assertTrue("Test project not deleted successfully.", root
-					.getProjects().length == 0);
-
-			// import again
-			IProject[] workspaceProjects2 = root.getProjects();
-			for (int i = 0; i < workspaceProjects2.length; i++)
-				FileUtil.deleteProject(workspaceProjects2[i]);
-			URL archiveFile2 = Platform.asLocalURL(Platform.find(TestPlugin
-					.getDefault().getBundle(), new Path(DATA_PATH_PREFIX
-					+ ARCHIVE_HELLOWORLD + ".zip")));
-			WizardProjectsImportPage wpip2 = getNewWizard();
-			HashSet projects2 = new HashSet();
-			projects2.add("HelloWorld");
-
-			wpip2.getProjectFromDirectoryRadio().setSelection((false)); // We
-																		// want
-																		// the
-																		// other
-																		// one
-																		// selected
-			wpip2.updateProjectsList(archiveFile2.getPath());
-
-			ProjectRecord[] selectedProjects2 = wpip2.getValidProjects();
-			ArrayList projectNames2 = new ArrayList();
-			for (int i = 0; i < selectedProjects2.length; i++) {
-				projectNames2.add(selectedProjects2[i].getProjectName());
-			}
-
-			assertTrue("Not all projects were found correctly in zip (2)",
-					projectNames2.containsAll(projects2));
-
-			CheckboxTreeViewer projectsList2 = wpip2.getProjectsList();
-			projectsList2.setCheckedElements(selectedProjects2);
-			wpip2.createProjects(); // Try importing all the projects we found
-			waitForRefresh();
-
-			// "HelloWorld" should be the only project in the workspace
-			workspaceProjects2 = root.getProjects();
-			if (workspaceProjects2.length != 1)
-				fail("Incorrect Number of projects imported (2)");
-			IFolder helloFolder2 = workspaceProjects2[0]
-					.getFolder("HelloWorld");
-			if (helloFolder2.exists())
-				fail("Project was imported as a folder into itself (2)");
-
-			verifyProjectInWorkspace(true, workspaceProjects2[0], FILE_LIST,
-					true);
-
-		} catch (IOException e) {
-			fail(e.toString());
-		} catch (CoreException e) {
-			fail(e.toString());
-		}
-
-	}
-
-	public void testImportArchiveMultiProject() {
-		try {
-			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-			zipLocation = copyZipLocation();
-
-			IProject[] workspaceProjects = root.getProjects();
-			for (int i = 0; i < workspaceProjects.length; i++)
-				FileUtil.deleteProject(workspaceProjects[i]);
-
-			WizardProjectsImportPage wpip = getNewWizard();
-			HashSet projects = new HashSet();
-			projects.add("HelloWorld");
-			projects.add("WorldHello");
-
-			wpip.getProjectFromDirectoryRadio().setSelection((false)); // We
-																		// want
-																		// the
-																		// other
-																		// one
-																		// selected
-			wpip.updateProjectsList(zipLocation);
-
-			ProjectRecord[] selectedProjects = wpip.getValidProjects();
-			ArrayList projectNames = new ArrayList();
-			for (int i = 0; i < selectedProjects.length; i++) {
-				projectNames.add(selectedProjects[i].getProjectName());
-			}
-
-			assertTrue("Not all projects were found correctly in zip",
-					projectNames.containsAll(projects));
-
-			CheckboxTreeViewer projectsList = wpip.getProjectsList();
-			projectsList.setCheckedElements(selectedProjects);
-			wpip.createProjects(); // Try importing all the projects we found
-			waitForRefresh();
-
-			// "HelloWorld" should be the only project in the workspace
-			workspaceProjects = root.getProjects();
-			if (workspaceProjects.length != 2)
-				fail("Incorrect Number of projects imported");
-			IFolder helloFolder = workspaceProjects[0].getFolder("HelloWorld");
-			if (helloFolder.exists())
-				fail("HelloWorld was imported as a folder into itself");
-			IFolder folder2 = workspaceProjects[0].getFolder("WorldHello");
-			if (folder2.exists())
-				fail("WorldHello was imported as a folder into itself");
-
-			for (int i = 0; i < workspaceProjects.length; i++)
-				verifyProjectInWorkspace(true, workspaceProjects[i], FILE_LIST,
-						true);
-
-		} catch (IOException e) {
-			fail(e.toString());
-		} catch (CoreException e) {
-			fail(e.toString());
-		}
-	}
-
-	/**
-	 * Verify whether or not the imported project is in the current workspace
-	 * location (i.e. copy projects was true) or in another workspace location
-	 * (i.e. copy projects was false).
-	 * 
-	 * @param inWorkspace
-	 * @param project
-	 */
-	private void verifyProjectInWorkspace(final boolean inWorkspace,
-			final IProject project, String[] fileList, boolean isListFiles) {
-
-		IPath rootLocation = ResourcesPlugin.getWorkspace().getRoot()
-				.getLocation();
-		IPath projectLocation = project.getLocation();
-		boolean isProjectInWorkspace = rootLocation.isPrefixOf(projectLocation);
-		if (inWorkspace) {
-			if (!isProjectInWorkspace)
-				fail(project.getName()
-						+ " should be in the workspace location: "
-						+ rootLocation.toOSString());
-		} else {
-			if (isProjectInWorkspace)
-				fail(project.getName()
-						+ " should not be in the workspace location: "
-						+ rootLocation.toOSString());
-		}
-		StringBuffer filesNotImported = new StringBuffer();
-		// make sure the files in the project were imported
-		for (int i = 0; i < fileList.length; i++) {
-			IResource res = isListFiles ? (IResource) project
-					.getFile(fileList[i]) : (IResource) project
-					.getFolder(fileList[i]);
-			if (!res.exists())
-				filesNotImported.append(res.getName() + ", ");
-		}
-		assertTrue("Files expected but not in workspace: "
-				+ filesNotImported.toString(), filesNotImported.length() == 0);
-	}
-
-	/**
-	 * Copies the data to a temporary directory and returns the new location.
-	 * 
-	 * @return the location
-	 */
-	private String copyDataLocation() throws IOException {
-		TestPlugin plugin = TestPlugin.getDefault();
-		if (plugin == null)
-			throw new IllegalStateException(
-					"TestPlugin default reference is null");
-
-		URL fullPathString = plugin.getDescriptor().find(
-				new Path(WS_DATA_PREFIX).append(WS_DATA_LOCATION + ".zip"));
-
-		if (fullPathString == null)
-			throw new IllegalArgumentException();
-
-		IPath path = new Path(fullPathString.getPath());
-
-		File origin = path.toFile();
-		if (!origin.exists())
-			throw new IllegalArgumentException();
-
-		ZipFile zFile = new ZipFile(origin);
-
-		File destination = new File(FileSystemHelper.getRandomLocation(
-				FileSystemHelper.getTempDir()).toOSString());
-		FileTool.unzip(zFile, destination);
-		return destination.getAbsolutePath();
-	}
-
-	private String copyZipLocation() throws IOException {
-		TestPlugin plugin = TestPlugin.getDefault();
-		if (plugin == null)
-			throw new IllegalStateException(
-					"TestPlugin default reference is null");
-
-		URL fullPathString = plugin.getDescriptor().find(
-				new Path(WS_DATA_PREFIX).append(WS_DATA_LOCATION + ".zip"));
-
-		if (fullPathString == null)
-			throw new IllegalArgumentException();
-
-		IPath path = new Path(fullPathString.getPath());
-
-		File origin = path.toFile();
-		if (!origin.exists())
-			throw new IllegalArgumentException();
-
-		File destination = new File(FileSystemHelper.getRandomLocation(
-				FileSystemHelper.getTempDir()).toOSString()
-				+ File.separator + ARCHIVE_HELLOWORLD + ".zip");
-		FileTool.copy(origin, destination);
-		return destination.getAbsolutePath();
-	}
-
-	private WizardProjectsImportPage getNewWizard() {
-		ImportExportWizard wizard = new ImportExportWizard(
-				ImportExportWizard.IMPORT);
-		wizard.init(getWorkbench(), null);
-		IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-				.getDialogSettings();
-		IDialogSettings wizardSettings = workbenchSettings
-				.getSection("ImportExportTests");
-		if (wizardSettings == null)
-			wizardSettings = workbenchSettings
-					.addNewSection("ImportExportTests");
-		wizard.setDialogSettings(wizardSettings);
-		wizard.setForcePreviousAndNextButtons(true);
-
-		WizardProjectsImportPage wpip = new WizardProjectsImportPage();
-
-		Shell shell = getShell();
-
-		WizardDialog dialog = new WizardDialog(shell, wizard);
-		dialog.create();
-		dialog.getShell().setSize(Math.max(100, dialog.getShell().getSize().x),
-				100);
-
-		Composite parent = new Composite(shell, SWT.NONE);
-		parent.setLayout(new GridLayout());
-		wpip.setWizard(dialog.getCurrentPage().getWizard());
-		wpip.createControl(parent);
-		return wpip;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ImportExportWizardsCategoryTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ImportExportWizardsCategoryTests.java
deleted file mode 100644
index d871aa2..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ImportExportWizardsCategoryTests.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.datatransfer;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.registry.WizardsRegistryReader;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.wizards.IWizardCategory;
-import org.eclipse.ui.wizards.IWizardDescriptor;
-
-public class ImportExportWizardsCategoryTests extends UITestCase {
-	
-	private static String WIZARD_ID_IMPORT_NO_CATEGORY = "org.eclipse.ui.tests.import.NoCategory";
-	private static String WIZARD_ID_IMPORT_INVALID_CATEGORY = "org.eclipse.ui.tests.import.InvalidCategory";
-	private static String WIZARD_IMPORT_NEW_CATEGORY = "org.eclipse.ui.tests.TestImport";
-	private static String WIZARD_ID_IMPORT_NEW_CATEGORY = "org.eclipse.ui.tests.import.NewCategory";
-	private static String WIZARD_IMPORT_NEW_PARENTED_CATEGORY = "org.eclipse.ui.Basic/org.eclipse.ui.tests.TestImportParented";
-	private static String WIZARD_ID_IMPORT_PARENTED_CATEGORY = "org.eclipse.ui.tests.import.NewParentedCategory";
-	private static String WIZARD_IMPORT_DUPLICATE_CATEGORY = "org.eclipse.ui.tests.TestImportDup";
-	private static String WIZARD_ID_IMPORT_DUPLICATE_CATEGORY = "org.eclipse.ui.tests.import.DuplicateCategory";
-	
-	private static String WIZARD_ID_EXPORT_NO_CATEGORY = "org.eclipse.ui.tests.export.NoCategory";
-	private static String WIZARD_ID_EXPORT_INVALID_CATEGORY = "org.eclipse.ui.tests.export.InvalidCategory";
-	private static String WIZARD_EXPORT_NEW_CATEGORY = "org.eclipse.ui.tests.TestExport";
-	private static String WIZARD_ID_EXPORT_NEW_CATEGORY = "org.eclipse.ui.tests.export.NewCategory";
-	private static String WIZARD_EXPORT_NEW_PARENTED_CATEGORY = "org.eclipse.ui.Basic/org.eclipse.ui.tests.TestExportParented";
-	private static String WIZARD_ID_EXPORT_PARENTED_CATEGORY = "org.eclipse.ui.tests.export.NewParentedCategory";
-	private static String WIZARD_EXPORT_DUPLICATE_CATEGORY = "org.eclipse.ui.tests.TestExportDup";
-	private static String WIZARD_ID_EXPORT_DUPLICATE_CATEGORY = "org.eclipse.ui.tests.export.DuplicateCategory";
-	
-	IWizardCategory exportRoot;	
-	IWizardCategory importRoot;
-	
-	public ImportExportWizardsCategoryTests(String testName){
-		super(testName);
-		exportRoot = WorkbenchPlugin.getDefault()
-			.getExportWizardRegistry().getRootCategory();
-		importRoot = WorkbenchPlugin.getDefault()
-			.getImportWizardRegistry().getRootCategory();
-	}
-
-	/* Import */
-	public void testImportNoCategoryProvided(){
-		IWizardCategory otherCategory = importRoot.findCategory(new Path(
-				WizardsRegistryReader.UNCATEGORIZED_WIZARD_CATEGORY));
-		if (otherCategory != null){
-			IWizardDescriptor wizardDesc = 
-				otherCategory.findWizard(WIZARD_ID_IMPORT_NO_CATEGORY);
-			assertTrue(
-				"Could not find wizard with id" + WIZARD_ID_IMPORT_NO_CATEGORY+ "in Other category.", 
-				wizardDesc != null);
-			return;
-		}
-		assertTrue("Could not find Other category", false);
-	}
-	
-	public void testImportCategoryDoesNotExist(){
-		IWizardCategory otherCategory = importRoot.findCategory(new Path(
-				WizardsRegistryReader.UNCATEGORIZED_WIZARD_CATEGORY));
-		if (otherCategory != null){
-			IWizardDescriptor wizardDesc = 
-				otherCategory.findWizard(WIZARD_ID_IMPORT_INVALID_CATEGORY);
-			assertTrue(
-				"Could not find wizard with id" + WIZARD_ID_IMPORT_INVALID_CATEGORY+ "in Other category.", 
-				wizardDesc != null);
-			return;
-		}
-		assertTrue("Could not find Other category", false);
-	}
-	
-	public void testImportAddToNewCategory(){
-		IWizardCategory newCategory = importRoot.findCategory(
-				new Path(WIZARD_IMPORT_NEW_CATEGORY));
-		if (newCategory != null){
-			IWizardDescriptor wizardDesc = 
-				newCategory.findWizard(WIZARD_ID_IMPORT_NEW_CATEGORY);
-			assertTrue(
-				"Could not find wizard with id" + WIZARD_ID_IMPORT_NEW_CATEGORY+ "in category " + WIZARD_IMPORT_NEW_CATEGORY, 
-				wizardDesc != null);
-			return;
-		}
-		assertTrue("Could not find category named " + WIZARD_IMPORT_NEW_CATEGORY, false);
-	}
-	
-	public void testImportAddToParentedCategory(){
-		IWizardCategory newCategory = importRoot.findCategory(
-				new Path(WIZARD_IMPORT_NEW_PARENTED_CATEGORY));
-		if (newCategory != null){
-			IWizardDescriptor wizardDesc = 
-				newCategory.findWizard(WIZARD_ID_IMPORT_PARENTED_CATEGORY);
-			assertTrue(
-				"Could not find wizard with id" + WIZARD_ID_IMPORT_PARENTED_CATEGORY+ "in category " + WIZARD_IMPORT_NEW_PARENTED_CATEGORY, 
-				wizardDesc != null);
-			return;
-		}
-		assertTrue("Could not find category named " + WIZARD_IMPORT_NEW_PARENTED_CATEGORY, false);
-	}
-	
-	public void testImportDuplicateCategory(){
-		IWizardCategory newCategory = importRoot.findCategory(
-				new Path(WIZARD_IMPORT_DUPLICATE_CATEGORY));
-		if (newCategory != null){
-			IWizardDescriptor wizardDesc = 
-				newCategory.findWizard(WIZARD_ID_IMPORT_DUPLICATE_CATEGORY);
-			assertTrue(
-				"Could not find wizard with id" + WIZARD_ID_IMPORT_DUPLICATE_CATEGORY+ "in category " + WIZARD_IMPORT_DUPLICATE_CATEGORY, 
-				wizardDesc != null);
-			return;
-		}
-		assertTrue("Could not find category named " + WIZARD_IMPORT_DUPLICATE_CATEGORY, false);
-	}
-	
-	public void testImportUsingExportCategory(){
-		IWizardCategory category = importRoot.findCategory(
-				new Path(WIZARD_EXPORT_NEW_CATEGORY));
-		assertTrue(
-				"Import wizards should not have category named " + WIZARD_EXPORT_NEW_CATEGORY, 
-				category == null);
-	}	
-	
-	/* Export */
-	public void testExportNoCategoryProvided(){
-		IWizardCategory otherCategory = exportRoot.findCategory(new Path(
-				WizardsRegistryReader.UNCATEGORIZED_WIZARD_CATEGORY));
-		if (otherCategory != null){
-			IWizardDescriptor wizardDesc = 
-				otherCategory.findWizard(WIZARD_ID_EXPORT_NO_CATEGORY);
-			assertTrue(
-				"Could not find wizard with id" + WIZARD_ID_EXPORT_NO_CATEGORY+ "in Other category.", 
-				wizardDesc != null);
-			return;
-		}
-		assertTrue("Could not find Other category", false);
-	}
-	
-	public void testExportCategoryDoesNotExist(){
-		IWizardCategory otherCategory = exportRoot.findCategory(new Path(
-				WizardsRegistryReader.UNCATEGORIZED_WIZARD_CATEGORY));
-		if (otherCategory != null){
-			IWizardDescriptor wizardDesc = 
-				otherCategory.findWizard(WIZARD_ID_EXPORT_INVALID_CATEGORY);
-			assertTrue(
-				"Could not find wizard with id" + WIZARD_ID_EXPORT_INVALID_CATEGORY+ "in Other category.", 
-				wizardDesc != null);
-			return;
-		}
-		assertTrue("Could not find Other category", false);
-	}
-	
-	public void testExportAddToNewCategory(){
-		IWizardCategory newCategory = exportRoot.findCategory(
-				new Path(WIZARD_EXPORT_NEW_CATEGORY));
-		if (newCategory != null){
-			IWizardDescriptor wizardDesc = 
-				newCategory.findWizard(WIZARD_ID_EXPORT_NEW_CATEGORY);
-			assertTrue(
-				"Could not find wizard with id" + WIZARD_ID_EXPORT_NEW_CATEGORY+ "in category " + WIZARD_EXPORT_NEW_CATEGORY, 
-				wizardDesc != null);
-			return;
-		}
-		assertTrue("Could not find category named " + WIZARD_EXPORT_NEW_CATEGORY, false);
-	}
-	
-	public void testExportAddToParentedCategory(){
-		IWizardCategory newCategory = exportRoot.findCategory(
-				new Path(WIZARD_EXPORT_NEW_PARENTED_CATEGORY));
-		if (newCategory != null){
-			IWizardDescriptor wizardDesc = 
-				newCategory.findWizard(WIZARD_ID_EXPORT_PARENTED_CATEGORY);
-			assertTrue(
-				"Could not find wizard with id" + WIZARD_ID_EXPORT_PARENTED_CATEGORY+ "in category " + WIZARD_EXPORT_NEW_PARENTED_CATEGORY, 
-				wizardDesc != null);
-			return;
-		}
-		assertTrue("Could not find category named " + WIZARD_EXPORT_NEW_PARENTED_CATEGORY, false);
-	}
-	
-	public void testExportDuplicateCategory(){
-		IWizardCategory newCategory = exportRoot.findCategory(
-				new Path(WIZARD_EXPORT_DUPLICATE_CATEGORY));
-		if (newCategory != null){
-			IWizardDescriptor wizardDesc = 
-				newCategory.findWizard(WIZARD_ID_EXPORT_DUPLICATE_CATEGORY);
-			assertTrue(
-				"Could not find wizard with id" + WIZARD_ID_EXPORT_DUPLICATE_CATEGORY+ "in category " + WIZARD_EXPORT_DUPLICATE_CATEGORY, 
-				wizardDesc != null);
-			return;
-		}
-		assertTrue("Could not find category named " + WIZARD_EXPORT_DUPLICATE_CATEGORY, false);
-	}	
-	
-	public void testExportUsingImportCategory(){
-		IWizardCategory category = exportRoot.findCategory(
-				new Path(WIZARD_IMPORT_NEW_CATEGORY));
-		assertTrue(
-				"Export wizards should not have category named " + WIZARD_IMPORT_NEW_CATEGORY, 
-				category == null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doTearDown()
-	 */
-	protected void doTearDown() throws Exception {
-		super.doTearDown();
-		importRoot = null;
-		exportRoot = null;
-	}	
-	
-	
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ImportOperationTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ImportOperationTest.java
deleted file mode 100644
index 7d5eed3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/ImportOperationTest.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.datatransfer;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-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.tests.harness.FileSystemHelper;
-import org.eclipse.ui.dialogs.IOverwriteQuery;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.wizards.datatransfer.FileSystemStructureProvider;
-import org.eclipse.ui.wizards.datatransfer.ImportOperation;
-
-public class ImportOperationTest extends UITestCase implements IOverwriteQuery {
-
-    private static final String[] directoryNames = { "dir1", "dir2" };
-
-    private static final String[] fileNames = { "file1.txt", "file2.txt" };
-    
-    private String localDirectory;
-
-    private IProject project;
-
-    public ImportOperationTest(String testName) {
-        super(testName);
-    }
-
-    private void createSubDirectory(String parentName, String newDirName)
-            throws IOException {
-        String newDirPath = parentName + File.separatorChar + newDirName;
-        File newDir = new File(newDirPath);
-        newDir.mkdir();
-        for (int i = 0; i < directoryNames.length; i++) {
-            createFile(newDirPath, fileNames[i]);
-        }
-    }
-
-    private void createFile(String parentName, String filePath)
-            throws IOException {
-        String newFilePath = parentName + File.separatorChar + filePath;
-        File newFile = new File(newFilePath);
-        newFile.createNewFile();
-    }
-
-    /*
-     * @see IOverwriteQuery#queryOverwrite(String)
-     */
-    public String queryOverwrite(String pathString) {
-        //Always return an empty String - we aren't
-        //doing anything interesting
-        return "";
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        Class testClass = Class
-                .forName("org.eclipse.ui.tests.datatransfer.ImportOperationTest");
-        InputStream stream = testClass.getResourceAsStream("tests.ini");
-        Properties properties = new Properties();
-        properties.load(stream);
-        localDirectory = properties.getProperty("localSource");
-        setUpDirectory();
-    }
-
-    /**
-     * Set up the directories and files used for the test.
-     */
-
-    private void setUpDirectory() throws IOException {
-        File rootDirectory = new File(localDirectory);
-        rootDirectory.mkdir();
-        localDirectory = rootDirectory.getAbsolutePath();
-        for (int i = 0; i < directoryNames.length; i++) {
-            createSubDirectory(localDirectory, directoryNames[i]);
-        }
-    }
-
-    /**
-     * Tear down. Delete the project we created and all of the
-     * files on the file system.
-     */
-    protected void doTearDown() throws Exception {
-        super.doTearDown();
-        try {
-            project.delete(true, true, null);
-            File topDirectory = new File(localDirectory);
-            FileSystemHelper.clear(topDirectory);
-        } catch (CoreException e) {
-            fail(e.toString());
-        }
-        finally{
-        	project = null;
-        	localDirectory = null;
-        }
-    }
-
-    public void testGetStatus() throws Exception {
-        project = FileUtil.createProject("ImportGetStatus");
-        File element = new File(localDirectory);
-        List importElements = new ArrayList();
-        importElements.add(element);
-        ImportOperation operation = new ImportOperation(project.getFullPath(),
-                FileSystemStructureProvider.INSTANCE, this, importElements);
-
-        assertTrue(operation.getStatus().getCode() == IStatus.OK);
-    }
-
-    public void testImportList() throws Exception {
-        project = FileUtil.createProject("ImportList");
-        File element = new File(localDirectory);
-        List importElements = new ArrayList();
-        importElements.add(element);
-        ImportOperation operation = new ImportOperation(project.getFullPath(),
-                FileSystemStructureProvider.INSTANCE, this, importElements);
-        openTestWindow().run(true, true, operation);
-
-        verifyFiles(directoryNames.length);
-    }
-
-    public void testImportSource() throws Exception {
-        project = FileUtil.createProject("ImportSource");
-        ImportOperation operation = new ImportOperation(project.getFullPath(),
-                new File(localDirectory), FileSystemStructureProvider.INSTANCE,
-                this);
-        openTestWindow().run(true, true, operation);
-        verifyFiles(directoryNames.length);
-    }
-
-    public void testImportSourceList() throws Exception {
-        project = FileUtil.createProject("ImportSourceList");
-        File element = new File(localDirectory + File.separator
-                + directoryNames[0]);
-        List importElements = new ArrayList();
-        importElements.add(element);
-        ImportOperation operation = new ImportOperation(project.getFullPath(),
-                new File(localDirectory), FileSystemStructureProvider.INSTANCE,
-                this, importElements);
-        openTestWindow().run(true, true, operation);
-        verifyFiles(importElements.size());
-    }
-
-    public void testSetContext() throws Exception {
-        project = FileUtil.createProject("ImportSetContext");
-        File element = new File(localDirectory);
-        List importElements = new ArrayList();
-        importElements.add(element);
-        ImportOperation operation = new ImportOperation(project.getFullPath(),
-                FileSystemStructureProvider.INSTANCE, this, importElements);
-
-        operation.setContext(null);
-        operation.setContext(openTestWindow().getShell());
-    }
-
-    public void testSetCreateContainerStructure() throws Exception {
-        project = FileUtil.createProject("ImportSetCreateContainerStructure");
-        File element = new File(localDirectory);
-        List importElements = new ArrayList();
-        importElements.add(element);
-        ImportOperation operation = new ImportOperation(project.getFullPath(),
-                FileSystemStructureProvider.INSTANCE, this, importElements);
-
-        operation.setCreateContainerStructure(false);
-        openTestWindow().run(true, true, operation);
-
-        try {
-            IPath path = new Path(localDirectory);
-            IResource targetFolder = project.findMember(path.lastSegment());
-
-            assertTrue("Import failed", targetFolder instanceof IContainer);
-
-            IResource[] resources = ((IContainer) targetFolder).members();
-            assertEquals("Import failed to import all directories",
-                    directoryNames.length, resources.length);
-            for (int i = 0; i < resources.length; i++) {
-                assertTrue("Import failed", resources[i] instanceof IContainer);
-                verifyFolder((IContainer) resources[i]);
-            }
-        } catch (CoreException e) {
-            fail(e.toString());
-        }
-    }
-
-    public void testSetFilesToImport() throws Exception {
-        project = FileUtil.createProject("ImportSetFilesToImport");
-        File element = new File(localDirectory + File.separator
-                + directoryNames[0]);
-        ImportOperation operation = new ImportOperation(project.getFullPath(),
-                new File(localDirectory), FileSystemStructureProvider.INSTANCE,
-                this);
-        List importElements = new ArrayList();
-        importElements.add(element);
-        operation.setFilesToImport(importElements);
-        openTestWindow().run(true, true, operation);
-        verifyFiles(importElements.size());
-    }
-
-    public void testSetOverwriteResources() throws Exception {
-        project = FileUtil.createProject("ImportSetOverwriteResources");
-        File element = new File(localDirectory);
-        List importElements = new ArrayList();
-        importElements.add(element);
-        ImportOperation operation = new ImportOperation(project.getFullPath(),
-                FileSystemStructureProvider.INSTANCE, this, importElements);
-
-        openTestWindow().run(true, true, operation);
-        operation.setOverwriteResources(true);
-        openTestWindow().run(true, true, operation);
-    }
-
-    /**
-     * Verifies that all files were imported.
-     * 
-     * @param folderCount number of folders that were imported
-     */
-    private void verifyFiles(int folderCount) {
-        try {
-            IPath path = new Path(localDirectory);
-            IResource targetFolder = project.findMember(path.makeRelative());
-
-            assertTrue("Import failed", targetFolder instanceof IContainer);
-
-            IResource[] resources = ((IContainer) targetFolder).members();
-            assertEquals("Import failed to import all directories",
-                    folderCount, resources.length);
-            for (int i = 0; i < resources.length; i++) {
-                assertTrue("Import failed", resources[i] instanceof IContainer);
-                verifyFolder((IContainer) resources[i]);
-            }
-        } catch (CoreException e) {
-            fail(e.toString());
-        }
-    }
-
-    /**
-     * Verifies that all files were imported into the specified folder.
-     */
-    private void verifyFolder(IContainer folder) {
-        try {
-            IResource[] files = folder.members();
-            assertEquals("Import failed to import all files", fileNames.length,
-                    files.length);
-            for (int j = 0; j < fileNames.length; j++) {
-                String fileName = fileNames[j];
-                int k;
-                for (k = 0; k < files.length; k++) {
-                    if (fileName.equals(files[k].getName()))
-                        break;
-                }
-                assertTrue("Import failed to import file " + fileName,
-                        k < fileNames.length);
-            }
-        } catch (CoreException e) {
-            fail(e.toString());
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/TestExportWizard.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/TestExportWizard.java
deleted file mode 100644
index 8017e4a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/TestExportWizard.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.datatransfer;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.IExportWizard;
-import org.eclipse.ui.IWorkbench;
-
-public class TestExportWizard extends Wizard implements IExportWizard {
-
-	public TestExportWizard(){
-		super();
-	}
-	public boolean performFinish() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		// TODO Auto-generated method stub
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/TestImportWizard.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/TestImportWizard.java
deleted file mode 100644
index 870eb5e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/TestImportWizard.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.datatransfer;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.IImportWizard;
-import org.eclipse.ui.IWorkbench;
-
-public class TestImportWizard extends Wizard implements IImportWizard {
-
-	public TestImportWizard() {
-		super();
-	}
-
-	public boolean performFinish() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		// TODO Auto-generated method stub
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/tests.ini b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/tests.ini
deleted file mode 100644
index 516795b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/datatransfer/tests.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-localSource=ImportTestSource
-archiveSource=ArchiveTestSource
-bug115800Source=FileAtRootTest
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/BackgroundColorDecorator.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/BackgroundColorDecorator.java
deleted file mode 100644
index 4fc385c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/BackgroundColorDecorator.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The BackgroundColorDecorator is a test for background coloring of the
- * navigator.
- */
-public class BackgroundColorDecorator implements ILightweightLabelDecorator {
-
-	public static final String ID = "org.eclipse.ui.tests.backgroundDecorator";
-
-	public static Color color;
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object,
-	 *      org.eclipse.jface.viewers.IDecoration)
-	 */
-	public void decorate(Object element, IDecoration decoration) {
-
-		if(color == null){
-			PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see java.lang.Runnable#run()
-				 */
-				public void run() {
-					setUpColor();
-
-				}
-			});
-
-		}
-		decoration.setBackgroundColor(color);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener listener) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
-	 *      java.lang.String)
-	 */
-	public boolean isLabelProperty(Object element, String property) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-		// TODO Auto-generated method stub
-
-	}
-	public static void setUpColor(){
-		color = PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_CYAN);
-	}
-
-	
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/BadIndexDecorator.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/BadIndexDecorator.java
deleted file mode 100644
index d41f825..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/BadIndexDecorator.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.ui.tests.TestPlugin;
-
-public class BadIndexDecorator implements ILightweightLabelDecorator {
-
-     private Set listeners = new HashSet();
-
-    private ImageDescriptor descriptor;
-   
-
-    /*
-     * @see IBaseLabelProvider#addListener(ILabelProviderListener)
-     */
-    public void addListener(ILabelProviderListener listener) {
-        listeners.add(listener);
-    }
-
-    /*
-     * @see IBaseLabelProvider#dispose()
-     */
-    public void dispose() {
-        listeners = new HashSet();
-    }
-
-    /*
-     * @see IBaseLabelProvider#isLabelProperty(Object, String)
-     */
-    public boolean isLabelProperty(Object element, String property) {
-        return false;
-    }
-
-    /*
-     * @see IBaseLabelProvider#removeListener(ILabelProviderListener)
-     */
-    public void removeListener(ILabelProviderListener listener) {
-        listeners.remove(listener);
-    }
-
-    /**
-     * Refresh the listeners to update the decorators for 
-     * element.
-     */
-
-    public void refreshListeners(Object element) {
-        Iterator iterator = listeners.iterator();
-        while (iterator.hasNext()) {
-            LabelProviderChangedEvent event = new LabelProviderChangedEvent(
-                    this, element);
-            ((ILabelProviderListener) iterator.next())
-                    .labelProviderChanged(event);
-        }
-    }
-
-    /**
-     * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#getOverlay(java.lang.Object)
-     */
-    public ImageDescriptor getOverlay(Object element) {
-        Assert.isTrue(element instanceof IResource);
-        if (descriptor == null) {
-            URL source = TestPlugin.getDefault().getDescriptor()
-                    .getInstallURL();
-            try {
-                descriptor = ImageDescriptor.createFromURL(new URL(source,
-                        "icons/binary_co.gif"));
-            } catch (MalformedURLException exception) {
-                return null;
-            }
-        }
-        return descriptor;
-
-    }
-
-    /**
-     * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object, org.eclipse.jface.viewers.IDecoration)
-     */
-    public void decorate(Object element, IDecoration decoration) {
-        decoration.addOverlay(getOverlay(element), 17);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/BadIndexDecoratorTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/BadIndexDecoratorTestCase.java
deleted file mode 100644
index 3299b78..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/BadIndexDecoratorTestCase.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.decorators.DecoratorDefinition;
-
-/**
- * @since 3.2
- *
- */
-public class BadIndexDecoratorTestCase extends DecoratorEnablementTestCase {
-	
-	 /**
-	 * @param testName
-	 */
-	public BadIndexDecoratorTestCase(String testName) {
-		super(testName);
-	}
-
-	/**
-     * Sets up the hierarchy.
-     */
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        createTestFile();
-        showNav();
-
-        WorkbenchPlugin.getDefault().getDecoratorManager().addListener(this);
-
-        DecoratorDefinition[] definitions = WorkbenchPlugin.getDefault()
-                .getDecoratorManager().getAllDecoratorDefinitions();
-        for (int i = 0; i < definitions.length; i++) {
-            if (definitions[i].getId().equals(
-                    "org.eclipse.ui.tests.decorators.badIndexDecorator"))
-                definition = definitions[i];
-        }
-    }
-    
-    /**
-     * Turn off an on the bad index decorator without
-     * generating an exception.
-     */
-    public void testNoException() {
-
-        updated = false;
-        getDecoratorManager().clearCaches();
-        definition.setEnabled(true);
-        getDecoratorManager().updateForEnablementChange();
-        definition.setEnabled(false);
-        getDecoratorManager().updateForEnablementChange();
-        updated = false;
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorAdaptableTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorAdaptableTests.java
deleted file mode 100644
index 866a776..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorAdaptableTests.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.decorators.DecorationResult;
-import org.eclipse.ui.internal.decorators.DecoratorManager;
-import org.eclipse.ui.internal.decorators.LightweightDecoratorManager;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.tests.menus.ObjectContributionClasses;
-import org.eclipse.ui.tests.menus.ObjectContributionClasses.ICommon;
-
-public class DecoratorAdaptableTests extends UITestCase {
-
-    public DecoratorAdaptableTests(String testName) {
-        super(testName);
-    }
-
-    private DecoratorManager getDecoratorManager() {
-        return WorkbenchPlugin.getDefault().getDecoratorManager();
-    }
-    
-    private String getDecorationTextFor(Object object) {
-        DecoratorManager dm = getDecoratorManager();
-        LightweightDecoratorManager ldm = dm.getLightweightManager();
-        DecorationResult result = ldm.getDecorationResult(object);
-        return result.decorateWithText("Default label");
-    }
-    
-    private void assertDecorated(String testSubName, String[] expectedSuffixes, Object[] elements, Class adaptedClass, boolean shouldHaveMatches) throws CoreException {
-        for (int i = 0; i < elements.length; i++) {
-            Object object = elements[i];
-            String text = getDecorationTextFor(object);
-            boolean allMatchesFound = true;
-            for (int j = 0; j < expectedSuffixes.length; j++) {
-                String suffix = expectedSuffixes[j];
-                if (text.indexOf(suffix) == -1) {
-                    allMatchesFound = false;
-                }
-            }
-            assertTrue("Adaptable test " + testSubName + " has failed for object " + object.toString(), allMatchesFound == shouldHaveMatches);
-        }
-        
-    }
-
-    protected void doSetUp() throws Exception {
-        PlatformUI.getWorkbench().getDecoratorManager().setEnabled(TestAdaptableDecoratorContributor.ID, true);
-        PlatformUI.getWorkbench().getDecoratorManager().setEnabled(TestUnadaptableDecoratorContributor.ID, true);
-        PlatformUI.getWorkbench().getDecoratorManager().setEnabled(TestResourceDecoratorContributor.ID, true);
-        PlatformUI.getWorkbench().getDecoratorManager().setEnabled(TestResourceMappingDecoratorContributor.ID, true);
-        super.doSetUp();
-    }
-    
-    protected void doTearDown() throws Exception {
-        PlatformUI.getWorkbench().getDecoratorManager().setEnabled(TestAdaptableDecoratorContributor.ID, false);
-        PlatformUI.getWorkbench().getDecoratorManager().setEnabled(TestUnadaptableDecoratorContributor.ID, false);
-        PlatformUI.getWorkbench().getDecoratorManager().setEnabled(TestResourceDecoratorContributor.ID, false);
-        PlatformUI.getWorkbench().getDecoratorManager().setEnabled(TestResourceMappingDecoratorContributor.ID, false);
-        super.doTearDown();
-    }
-    
-    /**
-     * This tests adaptable contributions that are not IResource.
-     * 
-     * @since 3.1
-     */
-    public final void testAdaptables() throws CoreException {
-        // Assert that decorators contributed to ICommon are applied to the given object
-        assertDecorated("1", 
-                new String[] {TestAdaptableDecoratorContributor.SUFFIX}, 
-                new Object[] {
-                        new ObjectContributionClasses.Common(), 
-                        new ObjectContributionClasses.C(), 
-                        new ObjectContributionClasses.B(),
-                        new ObjectContributionClasses.A()
-                },
-                ICommon.class,
-                true
-            );
-        // Assert that decorators contributed to ICommon are not applied to the given object
-        assertDecorated("2", 
-                new String[] {TestAdaptableDecoratorContributor.SUFFIX}, 
-                new Object[] { 
-                        new Object()                
-                },
-                ICommon.class,
-                false
-            );
-    }
-    
-    /**
-     * Test non-adaptable contributions
-     * 
-     * @since 3.1
-     */
-    public final void testNonAdaptableContributions() throws CoreException {
-        assertDecorated("1",
-                new String[] {TestUnadaptableDecoratorContributor.SUFFIX}, 
-                new Object[] {
-                        new ObjectContributionClasses.A(),
-                        new ObjectContributionClasses.B()},
-                ICommon.class,
-                false
-            );
-        assertDecorated("2",
-                new String[] {TestUnadaptableDecoratorContributor.SUFFIX}, 
-                new Object[] {
-                        new ObjectContributionClasses.D(),
-                        new ObjectContributionClasses.C(),
-                        new ObjectContributionClasses.Common()},
-                ICommon.class,
-                true
-            );
-    }
-    
-    /**
-     * This tests backwards compatibility support for adaptable IResource objectContributions. This
-     * allows IResource adaptable contributions without an adapter factory and using
-     * the IContributorResourceAdapter factory. In addition, test the ResourceMapping adaptations.
-     * 
-     * @since 3.1
-     */
-    public final void testContributorResourceAdapter() throws CoreException {
-        
-        final IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        final IProject testProject = workspace.getRoot().getProject(ObjectContributionClasses.PROJECT_NAME);
-        if(! testProject.exists()) {
-            testProject.create(null);
-        }
-        if(! testProject.isOpen()) {
-            testProject.open(null);
-        }
-        
-        assertDecorated("1",
-                new String[] {"IResource.1"}, 
-                new Object[] {
-                    new ObjectContributionClasses.CResource(), 
-                    new ObjectContributionClasses.CFile()},
-                IResource.class,
-                true
-            );
-
-        assertDecorated("2", 
-                new String[] {"ResourceMapping.1"}, 
-                new Object[] {
-                        new ObjectContributionClasses.CFile(), 
-                        new ObjectContributionClasses.CResource()},
-                ResourceMapping.class,
-                true
-            );
-        assertDecorated("3", 
-                new String[] {"ResourceMapping.1", "IResource.1"}, 
-                new Object[] {
-                    new ObjectContributionClasses.ModelElement()},
-                ResourceMapping.class,
-                true
-            );
-        // Ensure that the case where an object uses a contribution adapter that doesn't handle mappings
-        // will still show the menus for resource mappings
-        assertDecorated("4", 
-                new String[] {"ResourceMapping.1", "IResource.1"}, 
-                new Object[] {
-                    new ObjectContributionClasses.CResourceOnly()},
-                ResourceMapping.class,
-                true
-            );
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorCacheTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorCacheTest.java
deleted file mode 100644
index a7603ae..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorCacheTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.DecoratingLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.navigator.AbstractNavigatorTest;
-
-/**
- * @since 3.4
- * 
- */
-public class DecoratorCacheTest extends AbstractNavigatorTest {
-
-	protected DecoratingLabelProvider dlp;
-
-	public DecoratorCacheTest(String name) {
-		super(name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.tests.viewers.ViewerTestCase#createViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	protected StructuredViewer createViewer(Composite parent) {
-		dlp = new DecoratingLabelProvider(new LabelProvider(), PlatformUI
-				.getWorkbench().getDecoratorManager());
-
-		TreeViewer v = new TreeViewer(parent);
-		v.setContentProvider(new TestTreeContentProvider());
-		v.setLabelProvider(dlp);
-		return v;
-
-	}
-
-	public void testDecoratorCacheIsDisposed() {
-
-		Display fDisplay = Display.getCurrent();
-		if (fDisplay == null) {
-			fDisplay = new Display();
-		}
-		Shell fShell = new Shell(fDisplay, SWT.SHELL_TRIM);
-		fShell.setSize(500, 500);
-		fShell.setLayout(new FillLayout());
-		StructuredViewer fViewer = createViewer(fShell);
-		fViewer.setUseHashlookup(true);
-
-		try {
-			createTestFile();
-		} catch (CoreException e) {
-			fail(e.getLocalizedMessage(), e);
-		}
-		fViewer.setInput(testFile);
-		fShell.open();
-
-		dlp.dispose();
-		assertTrue("The resource manager exists", dlp.getDecorationContext()
-				.getProperty("RESOURCE_MANAGER") == null);
-		fShell.close();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorEnablementTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorEnablementTestCase.java
deleted file mode 100644
index 4832c3f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorEnablementTestCase.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.decorators.DecoratorDefinition;
-import org.eclipse.ui.internal.decorators.DecoratorManager;
-import org.eclipse.ui.tests.navigator.AbstractNavigatorTest;
-
-/**
- * @version 	1.0
- */
-public abstract class DecoratorEnablementTestCase extends AbstractNavigatorTest
-        implements ILabelProviderListener {
-
-    protected DecoratorDefinition definition;
-
-    protected boolean updated = false;
-
-    /**
-     * Constructor for DecoratorTestCase.
-     * @param testName
-     */
-    public DecoratorEnablementTestCase(String testName) {
-        super(testName);
-    }
-
-    /**
-     * Sets up the hierarchy.
-     */
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        createTestFile();
-        showNav();
-
-        WorkbenchPlugin.getDefault().getDecoratorManager().addListener(this);
-
-        DecoratorDefinition[] definitions = WorkbenchPlugin.getDefault()
-                .getDecoratorManager().getAllDecoratorDefinitions();
-        for (int i = 0; i < definitions.length; i++) {
-            if (definitions[i].getId().equals(
-                    "org.eclipse.ui.tests.decorators.lightweightdecorator"))
-                definition = definitions[i];
-        }
-    }
-
-    protected DecoratorManager getDecoratorManager() {
-        return WorkbenchPlugin.getDefault().getDecoratorManager();
-    }
-
-    /**
-     * Remove the listener.
-     */
-    protected void doTearDown() throws Exception {
-        super.doTearDown();
-        getDecoratorManager().removeListener(this);
-    }
-
-
-    /**
-     * Test enabling the contributor
-     */
-    public void testEnableDecorator()  {
-        getDecoratorManager().clearCaches();
-        definition.setEnabled(true);
-        getDecoratorManager().updateForEnablementChange();
-
-    }
-
-    /**
-     * Test disabling the contributor
-     */
-    public void testDisableDecorator() {
-        getDecoratorManager().clearCaches();
-        definition.setEnabled(false);
-        getDecoratorManager().updateForEnablementChange();
-    }
-
-    /*
-     * @see ILabelProviderListener#labelProviderChanged(LabelProviderChangedEvent)
-     */
-    public void labelProviderChanged(LabelProviderChangedEvent event) {
-        updated = true;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableTest.java
deleted file mode 100644
index 28fde7e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-
-/**
- * The DecoratorTableTest is the test for decorating tables.
- */
-public class DecoratorTableTest extends DecoratorViewerTest {
-
-	/**
-	 * Create a new instance of the receiver.
-	 * @param testName
-	 */
-	public DecoratorTableTest(String testName) {
-		super(testName);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.decorators.DecoratorViewerTest#backgroundCheck(org.eclipse.ui.part.ViewPart)
-	 */
-	protected void backgroundCheck(IViewPart view) {
-		TableItem first = ((DecoratorTableView) view).viewer.getTable().getItem(0);
-		Assert.isTrue(first.getBackground().getRGB()
-				.equals(BackgroundColorDecorator.color.getRGB()));
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.decorators.DecoratorViewerTest#foregroundCheck(org.eclipse.ui.part.ViewPart)
-	 */
-	protected void foregroundCheck(IViewPart view) {
-		TableItem first = ((DecoratorTableView) view).viewer.getTable().getItem(0);
-		Assert.isTrue(first.getForeground().getRGB()
-				.equals(ForegroundColorDecorator.color.getRGB()));
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.decorators.DecoratorViewerTest#openView(org.eclipse.ui.IWorkbenchPage)
-	 */
-	protected IViewPart openView(IWorkbenchPage page) throws PartInitException {
-		return page.showView("org.eclipse.ui.tests.decorator.TableViewTest");
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.decorators.DecoratorViewerTest#fontCheck(org.eclipse.ui.part.ViewPart)
-	 */
-	protected void fontCheck(IViewPart view) {
-		TableItem first = ((DecoratorTableView) view).viewer.getTable().getItem(0);
-		Assert.isTrue(first.getFont().getFontData()[0].equals(FontDecorator.font.getFontData()[0]));
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableTreeTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableTreeTest.java
deleted file mode 100644
index 0ca4209..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableTreeTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.custom.TableTreeItem;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-
-/**
- * The DecoratorTableTreeTest is the test for table 
- * trees.
- */
-public class DecoratorTableTreeTest extends DecoratorViewerTest {
-
-	/**
-	 * Create a new instance of the receiver.
-	 * @param testName
-	 */
-	public DecoratorTableTreeTest(String testName) {
-		super(testName);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.decorators.DecoratorViewerTest#backgroundCheck(org.eclipse.ui.IViewPart)
-	 */
-	protected void backgroundCheck(IViewPart view) {
-		TableTreeItem first = ((DecoratorTableTreeView) view).viewer.getTableTree().getItems()[0];
-		Assert.isTrue(first.getBackground().getRGB()
-				.equals(BackgroundColorDecorator.color.getRGB()));
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.decorators.DecoratorViewerTest#foregroundCheck(org.eclipse.ui.IViewPart)
-	 */
-	protected void foregroundCheck(IViewPart view) {
-		TableTreeItem first = ((DecoratorTableTreeView) view).viewer.getTableTree().getItems()[0];
-		Assert.isTrue(first.getForeground().getRGB()
-				.equals(ForegroundColorDecorator.color.getRGB()));
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.decorators.DecoratorViewerTest#openView(org.eclipse.ui.IWorkbenchPage)
-	 */
-	protected IViewPart openView(IWorkbenchPage page) throws PartInitException {
-		return page.showView("org.eclipse.ui.tests.decorator.TableTreeTest");
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.decorators.DecoratorViewerTest#fontCheck(org.eclipse.ui.IViewPart)
-	 */
-	protected void fontCheck(IViewPart view) {
-		TableTreeItem first = ((DecoratorTableTreeView) view).viewer.getTableTree().getItems()[0];
-		Assert.isTrue(first.getFont().getFontData()[0]
-				.equals(FontDecorator.font.getFontData()[0]));
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableTreeView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableTreeView.java
deleted file mode 100644
index 05c7897..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableTreeView.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.jface.viewers.TableTreeViewer;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * The DecoratorTableTreeView is the view that tests decorators
- * for table trees.
- */
-public class DecoratorTableTreeView extends DecoratorTestPart {
-	
-	TableTreeViewer viewer;
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public DecoratorTableTreeView() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		viewer = new TableTreeViewer(parent);
-
-		viewer.setLabelProvider(getLabelProvider());
-
-		viewer.setContentProvider(new TestTreeContentProvider());
-		viewer.setInput(this);
-
-		GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL
-				| GridData.FILL_BOTH);
-		
-		viewer.getControl().setLayoutData(data);
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		// XXX Auto-generated method stub
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableView.java
deleted file mode 100644
index 2feafab..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTableView.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * The DecoratorTableView is a view that tests the decorator support for tables.
- */
-public class DecoratorTableView extends DecoratorTestPart {
-
-	TableViewer viewer;
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public DecoratorTableView() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		viewer = new TableViewer(parent);
-
-		viewer.setLabelProvider(getLabelProvider());
-
-		viewer.setContentProvider(new TestTableContentProvider());
-		viewer.setInput(this);
-
-		GridData data = new GridData(GridData.GRAB_HORIZONTAL
-				| GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
-
-		viewer.getControl().setLayoutData(data);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		// XXX Auto-generated method stub
-
-	}
-
-	
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTestCase.java
deleted file mode 100644
index 4e42e9f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTestCase.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.decorators.DecoratorDefinition;
-import org.eclipse.ui.internal.decorators.DecoratorManager;
-import org.eclipse.ui.tests.navigator.AbstractNavigatorTest;
-
-/**
- * @version 1.0
- */
-public class DecoratorTestCase extends AbstractNavigatorTest implements
-		ILabelProviderListener {
-
-	private DecoratorDefinition definition;
-
-	private boolean updated = false;
-
-	/**
-	 * Constructor for DecoratorTestCase.
-	 * 
-	 * @param testName
-	 */
-	public DecoratorTestCase(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Sets up the hierarchy.
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		createTestFile();
-		showNav();
-
-		WorkbenchPlugin.getDefault().getDecoratorManager().addListener(this);
-
-		DecoratorDefinition[] definitions = WorkbenchPlugin.getDefault()
-				.getDecoratorManager().getAllDecoratorDefinitions();
-		for (int i = 0; i < definitions.length; i++) {
-			if (definitions[i].getId().equals(
-					"org.eclipse.ui.tests.adaptable.decorator"))
-				definition = definitions[i];
-		}
-	}
-
-	private DecoratorManager getDecoratorManager() {
-		return WorkbenchPlugin.getDefault().getDecoratorManager();
-	}
-
-	/**
-	 * Remove the listener.
-	 */
-	protected void doTearDown() throws Exception {
-		super.doTearDown();
-		getDecoratorManager().removeListener(this);
-	}
-
-	/**
-	 * Test enabling the contributor
-	 */
-	public void testEnableDecorator() {
-		getDecoratorManager().clearCaches();
-		definition.setEnabled(true);
-		getDecoratorManager().updateForEnablementChange();
-
-	}
-
-	/**
-	 * Test disabling the contributor
-	 */
-	public void testDisableDecorator() {
-		getDecoratorManager().clearCaches();
-		definition.setEnabled(false);
-		getDecoratorManager().updateForEnablementChange();
-	}
-
-	/**
-	 * Refresh the test decorator.
-	 */
-	public void testRefreshContributor() {
-
-		updated = false;
-		getDecoratorManager().clearCaches();
-		definition.setEnabled(true);
-		getDecoratorManager().updateForEnablementChange();
-
-		assertTrue("Got an update", updated);
-		updated = false;
-
-	}
-
-	/*
-	 * @see ILabelProviderListener#labelProviderChanged(LabelProviderChangedEvent)
-	 */
-	public void labelProviderChanged(LabelProviderChangedEvent event) {
-		updated = true;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTestPart.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTestPart.java
deleted file mode 100644
index c1b09d4..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTestPart.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.jface.viewers.DecoratingLabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IDecoratorManager;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * The DecoratorTestPart is the abstract superclass of the ViewParts that are
- * used for decorator tests.
- * 
- */
-public abstract class DecoratorTestPart extends ViewPart {
-
-	private static final int DELAY_TIME = 2000;// Wait 2 seconds
-
-	public boolean waitingForDecoration = true;
-
-	private long endTime;
-
-	private ILabelProviderListener listener;
-
-	public DecoratorTestPart() {
-		super();
-	}
-
-	/**
-	 * Get the label provider for the receiver.
-	 * 
-	 * @return
-	 */
-	protected DecoratingLabelProvider getLabelProvider() {
-
-		IDecoratorManager manager = PlatformUI.getWorkbench()
-				.getDecoratorManager();
-		manager.addListener(getDecoratorManagerListener());
-		return new DecoratingLabelProvider(new TestLabelProvider(), manager);
-
-	}
-
-	/**
-	 * Get the listener for the suite.
-	 * 
-	 * @return
-	 */
-	private ILabelProviderListener getDecoratorManagerListener() {
-		listener = new ILabelProviderListener() {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.ILabelProviderListener#labelProviderChanged(org.eclipse.jface.viewers.LabelProviderChangedEvent)
-			 */
-			public void labelProviderChanged(LabelProviderChangedEvent event) {
-				// Reset the end time each time we get an update
-				endTime = System.currentTimeMillis() + DELAY_TIME;
-
-			}
-		};
-
-		return listener;
-	}
-
-	public void readAndDispatchForUpdates() {
-		while (System.currentTimeMillis() < endTime)
-			Display.getCurrent().readAndDispatch();
-
-	}
-
-	public void setUpForDecorators() {
-		endTime = System.currentTimeMillis() + DELAY_TIME;
-
-	}
-
-	public void dispose() {
-		PlatformUI.getWorkbench().getDecoratorManager()
-				.removeListener(listener);
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTreeTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTreeTest.java
deleted file mode 100644
index 1532b90..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTreeTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-
-/**
- * The DecoratorTreeTest tests the font and color support on 
- * tree viewers.
- */
-public class DecoratorTreeTest extends DecoratorViewerTest {
-
-	/**
-	 * @param testName
-	 */
-	public DecoratorTreeTest(String testName) {
-		super(testName);
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.util.UITestCase#doSetUp()
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		createTestFile();
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.decorators.DecoratorViewerTest#backgroundCheck(org.eclipse.ui.part.ViewPart)
-	 */
-	protected void backgroundCheck(IViewPart view) {
-		TreeItem first = ((DecoratorTreeView) view).viewer.getTree().getItems()[0];
-		assertEquals(BackgroundColorDecorator.color.getRGB(), first.getBackground().getRGB());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.decorators.DecoratorViewerTest#foregroundCheck(org.eclipse.ui.part.ViewPart)
-	 */
-	protected void foregroundCheck(IViewPart view) {
-
-		TreeItem first = ((DecoratorTreeView) view).viewer.getTree().getItems()[0];
-		assertEquals(ForegroundColorDecorator.color.getRGB(), first.getForeground().getRGB());
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.decorators.DecoratorViewerTest#openView(org.eclipse.ui.IWorkbenchPage)
-	 */
-	protected IViewPart openView(IWorkbenchPage page) throws PartInitException {
-
-		return page.showView("org.eclipse.ui.tests.decorators.TreeViewTest");
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.decorators.DecoratorViewerTest#fontCheck(org.eclipse.ui.part.ViewPart)
-	 */
-	protected void fontCheck(IViewPart view) {
-		TreeItem first = ((DecoratorTreeView) view).viewer.getTree().getItems()[0];
-		assertEquals(FontDecorator.font.getFontData()[0], first.getFont().getFontData()[0]);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTreeView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTreeView.java
deleted file mode 100644
index 32cb8fd..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorTreeView.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * The DecoratorTreeView is a TreeView that tests the 
- * font and color decorations.
- */
-public class DecoratorTreeView extends DecoratorTestPart {
-	
-	TreeViewer viewer;
-
-	/**
-	 * 
-	 */
-	public DecoratorTreeView() {
-		super();
-		// XXX Auto-generated constructor stub
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		 viewer = new TreeViewer(parent){
-		 	/* (non-Javadoc)
-			 * @see org.eclipse.jface.viewers.AbstractTreeViewer#labelProviderChanged()
-			 */
-			protected void labelProviderChanged() {
-				super.labelProviderChanged();
-			}
-		 };
-
-		viewer.setLabelProvider(getLabelProvider());
-
-		viewer.setContentProvider(new TestTreeContentProvider());
-		viewer.setInput(this);
-
-		GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL
-				| GridData.FILL_BOTH);
-		
-		viewer.getControl().setLayoutData(data);
-
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		// XXX Auto-generated method stub
-
-	}
-
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorViewerTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorViewerTest.java
deleted file mode 100644
index 560edb4..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorViewerTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ui.IDecoratorManager;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.decorators.DecoratorManager;
-import org.eclipse.ui.tests.navigator.AbstractNavigatorTest;
-
-/**
- * DecoratorViewerTest is the abstract class of the tests for the viewers.
- */
-public abstract class DecoratorViewerTest extends AbstractNavigatorTest {
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param testName
-	 */
-	public DecoratorViewerTest(String testName) {
-		super(testName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.util.UITestCase#doSetUp()
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		createTestFile();
-		ForegroundColorDecorator.setUpColor();
-		BackgroundColorDecorator.setUpColor();
-		FontDecorator.setUpFont();
-	}
-
-	/**
-	 * Test the background on the viewer.
-	 * 
-	 * @throws PartInitException
-	 * @throws CoreException
-	 * @throws InterruptedException
-	 */
-	public void testBackground() throws PartInitException, CoreException,
-			InterruptedException {
-
-		BackgroundColorDecorator.setUpColor();
-
-		IWorkbenchWindow window = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		IWorkbenchPage page = window.getActivePage();
-		Assert.isNotNull(page, "No active page");
-
-		final IViewPart view = openView(page);
-		((DecoratorTestPart) view).setUpForDecorators();
-		
-
-		IDecoratorManager manager = WorkbenchPlugin.getDefault()
-				.getDecoratorManager();
-		manager.setEnabled(BackgroundColorDecorator.ID, true);
-		
-		Platform.getJobManager().join(DecoratorManager.FAMILY_DECORATE, null);
-
-		dispatchDuringUpdates((DecoratorTestPart) view);
-		backgroundCheck(view);
-		manager.setEnabled(BackgroundColorDecorator.ID, false);
-
-	}
-
-	/**
-	 * Check the background colors in the view
-	 * 
-	 * @param view
-	 */
-	protected abstract void backgroundCheck(IViewPart view);
-
-	/**
-	 * Test the foreground on the viewer.
-	 * 
-	 * @throws PartInitException
-	 * @throws CoreException
-	 * @throws InterruptedException
-	 */
-	public void testForeground() throws PartInitException, CoreException,
-			InterruptedException {
-
-		IWorkbenchWindow window = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		IWorkbenchPage page = window.getActivePage();
-		Assert.isNotNull(page, "No active page");
-
-		final IViewPart view = openView(page);
-
-		((DecoratorTestPart) view).setUpForDecorators();
-		
-
-		IDecoratorManager manager = WorkbenchPlugin.getDefault()
-				.getDecoratorManager();
-		manager.setEnabled(ForegroundColorDecorator.ID, true);
-		
-		Platform.getJobManager().join(DecoratorManager.FAMILY_DECORATE, null);
-		dispatchDuringUpdates((DecoratorTestPart) view);
-
-		foregroundCheck(view);
-		manager.setEnabled(ForegroundColorDecorator.ID, false);
-
-	}
-
-	/**
-	 * Read and dispatch while updates are occuring
-	 * 
-	 */
-	private void dispatchDuringUpdates(DecoratorTestPart view) {
-		view.readAndDispatchForUpdates();
-
-	}
-
-	/**
-	 * Check the foreground colors.
-	 * 
-	 * @param view
-	 */
-	protected abstract void foregroundCheck(IViewPart view);
-
-	/**
-	 * @param page
-	 * @return
-	 * @throws PartInitException
-	 */
-	protected abstract IViewPart openView(IWorkbenchPage page)
-			throws PartInitException;
-
-	/**
-	 * Test the font on the viewer.
-	 * 
-	 * @throws PartInitException
-	 * @throws CoreException
-	 * @throws InterruptedException
-	 */
-	public void testFont() throws PartInitException, CoreException,
-			InterruptedException {
-
-		IWorkbenchWindow window = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		IWorkbenchPage page = window.getActivePage();
-		Assert.isNotNull(page, "No active page");
-
-		
-		final IViewPart view = openView(page);
-		((DecoratorTestPart) view).setUpForDecorators();
-		
-
-		IDecoratorManager manager = WorkbenchPlugin.getDefault()
-				.getDecoratorManager();
-		manager.setEnabled(FontDecorator.ID, true);
-		
-		Platform.getJobManager().join(DecoratorManager.FAMILY_DECORATE, null);
-
-		dispatchDuringUpdates((DecoratorTestPart) view);
-		fontCheck(view);
-		
-		manager.setEnabled(FontDecorator.ID, false);
-
-	}
-
-	/**
-	 * Check the fonts in the view
-	 * 
-	 * @param view
-	 */
-	protected abstract void fontCheck(IViewPart view);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.navigator.AbstractNavigatorTest#doTearDown()
-	 */
-	protected void doTearDown() throws Exception {
-
-		super.doTearDown();
-		IDecoratorManager manager = WorkbenchPlugin.getDefault()
-				.getDecoratorManager();
-		manager.setEnabled(ForegroundColorDecorator.ID, false);
-		manager.setEnabled(BackgroundColorDecorator.ID, false);
-		manager.setEnabled(FontDecorator.ID, false);
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorsTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorsTestSuite.java
deleted file mode 100644
index 6a969cc..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/DecoratorsTestSuite.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class DecoratorsTestSuite extends TestSuite {
-
-	/**
-	 * Returns the suite.  This is required to
-	 * use the JUnit Launcher.
-	 */
-	public static Test suite() {
-		return new DecoratorsTestSuite();
-	}
-
-	/**
-	 * Construct the test suite.
-	 */
-	public DecoratorsTestSuite() {
-		addTest(new TestSuite(ExceptionDecoratorTestCase.class));
-		addTest(new TestSuite(DecoratorTestCase.class));
-		addTest(new TestSuite(LightweightDecoratorTestCase.class));
-		addTest(new TestSuite(BadIndexDecoratorTestCase.class));
-//		addTest(new TestSuite(DecoratorTreeTest.class));
-//		addTest(new TestSuite(DecoratorTableTest.class));
-//		addTest(new TestSuite(DecoratorTableTreeTest.class));
-		addTest(new TestSuite(DecoratorAdaptableTests.class));
-		addTest(new TestSuite(DecoratorCacheTest.class));
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/ExceptionDecoratorTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/ExceptionDecoratorTestCase.java
deleted file mode 100644
index 03174d5..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/ExceptionDecoratorTestCase.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.decorators.DecoratorDefinition;
-import org.eclipse.ui.internal.decorators.DecoratorManager;
-
-/**
- * @version 	1.0
- */
-public class ExceptionDecoratorTestCase extends DecoratorEnablementTestCase
-        implements ILabelProviderListener {
-    private Collection problemDecorators = new ArrayList();
-
-    private DecoratorDefinition light;
-
-    /**
-     * Constructor for DecoratorTestCase.
-     * @param testName
-     */
-    public ExceptionDecoratorTestCase(String testName) {
-        super(testName);
-    }
-
-    /**
-     * Sets up the hierarchy.
-     */
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        //reset the static fields so that the decorators will fail
-        HeavyNullImageDecorator.fail = true;
-        HeavyNullTextDecorator.fail = true;
-        NullImageDecorator.fail = true;
-        DecoratorDefinition[] definitions = WorkbenchPlugin.getDefault()
-                .getDecoratorManager().getAllDecoratorDefinitions();
-        for (int i = 0; i < definitions.length; i++) {
-            String id = definitions[i].getId();
-            if (id.equals("org.eclipse.ui.tests.heavyNullImageDecorator")
-                    || id.equals("org.eclipse.ui.tests.heavyNullTextDecorator")) {
-                definitions[i].setEnabled(true);
-                problemDecorators.add(definitions[i]);
-            }
-
-            //Do not cache the light one - the disabling issues
-            //still need to be worked out.
-            if (id.equals("org.eclipse.ui.tests.lightNullImageDecorator")) {
-                definitions[i].setEnabled(true);
-                light = definitions[i];
-            }
-        }
-    } /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.navigator.LightweightDecoratorTestCase#doTearDown()
-     */
-
-    protected void doTearDown() throws Exception {
-        super.doTearDown();
-
-        //Need to wait for decoration to end to allow for all 
-        //errors to occur
-        try {
-            Platform.getJobManager().join(DecoratorManager.FAMILY_DECORATE,
-                    null);
-        } catch (OperationCanceledException e) {
-        } catch (InterruptedException e) {
-        }
-
-        //Be sure that the decorators were all disabled on errors.
-        Iterator problemIterator = problemDecorators.iterator();
-        while (problemIterator.hasNext()) {
-            DecoratorDefinition next = (DecoratorDefinition) problemIterator
-                    .next();
-            assertFalse("Enabled " + next.getName(), next.isEnabled());
-        }
-
-        //Turnoff the lightweight one so as not to clutter the methods.
-        light.setEnabled(false);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/FontDecorator.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/FontDecorator.java
deleted file mode 100644
index 3451324..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/FontDecorator.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The FontDecorator is for testing the font enablement.
- */
-public class FontDecorator implements ILightweightLabelDecorator {
-
-	public static final String ID = "org.eclipse.ui.tests.fontDecorator";
-
-	public static Font font;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object,
-	 *      org.eclipse.jface.viewers.IDecoration)
-	 */
-	public void decorate(Object element, IDecoration decoration) {
-		
-		if(font == null){
-			PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see java.lang.Runnable#run()
-				 */
-				public void run() {
-					setUpFont();
-
-				}
-			});
-
-		}
-		
-		decoration.setFont(font);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener listener) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
-	 *      java.lang.String)
-	 */
-	public boolean isLabelProperty(Object element, String property) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-
-	}
-
-	/**
-	 * Setup the font used by this decorator.
-	 */
-	public static void setUpFont() {
-		font = JFaceResources.getFont(JFaceResources.HEADER_FONT);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/ForegroundColorDecorator.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/ForegroundColorDecorator.java
deleted file mode 100644
index dd656a3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/ForegroundColorDecorator.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The ForegroundColorDecorator is for testing the foreground enablement.
- */
-public class ForegroundColorDecorator implements ILightweightLabelDecorator {
-
-	
-	public static final String ID = "org.eclipse.ui.tests.foregroundDecorator";
-	
-	public static Color color;
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object,
-	 *      org.eclipse.jface.viewers.IDecoration)
-	 */
-	public void decorate(Object element, IDecoration decoration) {
-
-		if(color == null){
-			PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see java.lang.Runnable#run()
-				 */
-				public void run() {
-					setUpColor();
-
-				}
-			});
-
-		}
-		decoration.setForegroundColor(color);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener listener) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
-	 *      java.lang.String)
-	 */
-	public boolean isLabelProperty(Object element, String property) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-		// TODO Auto-generated method stub
-
-	}
-	
-	public static void setUpColor(){
-		color = PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_DARK_YELLOW);
-	}
-
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/HeavyNullImageDecorator.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/HeavyNullImageDecorator.java
deleted file mode 100644
index 78231d0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/HeavyNullImageDecorator.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.tests.internal.ForcedException;
-
-/**
- * @see ILabelDecorator
- */
-public class HeavyNullImageDecorator implements ILabelDecorator {
-
-    /**
-     * Whether we should fail with an exception
-     */
-    public static boolean fail = false;
-
-    /**
-     *
-     */
-    public HeavyNullImageDecorator() {
-    }
-
-    /**
-     * @see ILabelDecorator#addListener
-     */
-    public void addListener(ILabelProviderListener listener) {
-    }
-
-    /**
-     * @see ILabelDecorator#dispose
-     */
-    public void dispose() {
-    }
-
-    /**
-     * @see ILabelDecorator#isLabelProperty
-     */
-    public boolean isLabelProperty(Object element, String property) {
-        return false;
-    }
-
-    /**
-     * @see ILabelDecorator#removeListener
-     */
-    public void removeListener(ILabelProviderListener listener) {
-    }
-
-    /**
-     * @see ILabelDecorator#decorateImage
-     */
-    public Image decorateImage(Image image, Object element) {
-        if (fail) {
-            fail = false;
-            throw new ForcedException("Heavy image decorator boom");
-        }
-        return null;
-    }
-
-    /**
-     * @see ILabelDecorator#decorateText
-     */
-    public String decorateText(String text, Object element) {
-        return text;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/HeavyNullTextDecorator.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/HeavyNullTextDecorator.java
deleted file mode 100644
index 8eabdbc..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/HeavyNullTextDecorator.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.tests.internal.ForcedException;
-
-/**
- * @see ILabelDecorator
- */
-public class HeavyNullTextDecorator implements ILabelDecorator {
-
-    /**
-     * Whether we should fail with an exception
-     */
-    public static boolean fail = false;
-
-    /**
-     *
-     */
-    public HeavyNullTextDecorator() {
-    }
-
-    /**
-     * @see ILabelDecorator#addListener
-     */
-    public void addListener(ILabelProviderListener listener) {
-    }
-
-    /**
-     * @see ILabelDecorator#dispose
-     */
-    public void dispose() {
-    }
-
-    /**
-     * @see ILabelDecorator#isLabelProperty
-     */
-    public boolean isLabelProperty(Object element, String property) {
-        return false;
-    }
-
-    /**
-     * @see ILabelDecorator#removeListener
-     */
-    public void removeListener(ILabelProviderListener listener) {
-    }
-
-    /**
-     * @see ILabelDecorator#decorateImage
-     */
-    public Image decorateImage(Image image, Object element) {
-        return image;
-    }
-
-    /**
-     * @see ILabelDecorator#decorateText
-     */
-    public String decorateText(String text, Object element) {
-        if (fail) {
-            fail = false;
-            throw new ForcedException("Heavy text decorator boom");
-        }
-        return null;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/LightweightDecoratorTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/LightweightDecoratorTestCase.java
deleted file mode 100644
index ecb8d51..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/LightweightDecoratorTestCase.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-
-/**
- * @version 	1.0
- */
-public class LightweightDecoratorTestCase extends DecoratorEnablementTestCase
-        implements ILabelProviderListener {
-
-    /**
-     * Constructor for DecoratorTestCase.
-     * @param testName
-     */
-    public LightweightDecoratorTestCase(String testName) {
-        super(testName);
-    }
-
-    /**
-     * Refresh the test decorator.
-     */
-    public void testRefreshContributor() throws CoreException {
-
-        updated = false;
-        getDecoratorManager().clearCaches();
-        definition.setEnabled(true);
-        getDecoratorManager().updateForEnablementChange();
-
-        assertTrue("Got an update", updated);
-        updated = false;
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/NullImageDecorator.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/NullImageDecorator.java
deleted file mode 100644
index 72aab32..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/NullImageDecorator.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-import org.eclipse.ui.tests.internal.ForcedException;
-
-/**
- * @see ILabelDecorator
- */
-public class NullImageDecorator implements ILightweightLabelDecorator {
-    /**
-     * Whether we should fail with an exception
-     */
-    public static boolean fail = false;
-
-    /**
-     *
-     */
-    public NullImageDecorator() {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-     */
-    public void addListener(ILabelProviderListener listener) {
-        // XXX Auto-generated method stub
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object, org.eclipse.jface.viewers.IDecoration)
-     */
-    public void decorate(Object element, IDecoration decoration) {
-        if (fail) {
-            fail = false;
-            throw new ForcedException("Lighweight decorator boom");
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-     */
-    public void dispose() {
-        // XXX Auto-generated method stub
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-     */
-    public boolean isLabelProperty(Object element, String property) {
-        // XXX Auto-generated method stub
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-     */
-    public void removeListener(ILabelProviderListener listener) {
-        // XXX Auto-generated method stub
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TableElement.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TableElement.java
deleted file mode 100644
index 87629f7..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TableElement.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-/**
- * The TableElement is the content for tables in the decorator
- * testing.
- */
-public class TableElement extends TestElement{
-
-	int index;
-	
-	public TableElement(int newIndex) {
-		super();
-		index = newIndex;
-		name = "Table Item " + String.valueOf(index);
-		
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestAdaptableDecoratorContributor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestAdaptableDecoratorContributor.java
deleted file mode 100644
index 3eb501c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestAdaptableDecoratorContributor.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import junit.framework.Assert;
-
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.ui.tests.menus.ObjectContributionClasses;
-
-/**
- * Decorator for testing adaptability. This class is used to test
- * the adaptable contribution. It can also be subclassed
- * and the expected class and suffix can be customized
- */
-public class TestAdaptableDecoratorContributor extends TestLightweightDecoratorContributor {
-
-    public static final String SUFFIX = "ICommon.1";
-    public static final String ID = "org.eclipse.ui.tests.decorators.generalAdaptabilityOn";
-    
-    private Class clazz;
-    private String suffix;
-
-    public TestAdaptableDecoratorContributor() {
-        setExpectedElementType(ObjectContributionClasses.ICommon.class);
-        setSuffix(SUFFIX);
-    }
-
-    protected void setSuffix(String suffix) {
-        this.suffix = suffix;    
-    }
-
-    protected void setExpectedElementType(Class clazz) {
-        this.clazz = clazz;    
-    }
-    
-    public void decorate(Object element, IDecoration decoration) {
-        Assert.assertTrue(clazz.isInstance(element));
-        decoration.addSuffix(suffix);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestDecoratorContributor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestDecoratorContributor.java
deleted file mode 100644
index 1a31178..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestDecoratorContributor.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.swt.graphics.Image;
-
-public class TestDecoratorContributor implements ILabelDecorator {
-
-    public static TestDecoratorContributor contributor;
-
-    private Set listeners = new HashSet();
-
-    public static String DECORATOR_SUFFIX = "_SUFFIX";
-
-    public TestDecoratorContributor() {
-        contributor = this;
-    }
-
-    /*
-     * @see ILabelDecorator#decorateText(String, Object)
-     */
-    public String decorateText(String text, Object element) {
-        //Check that the element is adapted to IResource
-        Assert.isTrue(element instanceof IResource);
-        return text + DECORATOR_SUFFIX;
-    }
-
-    /*
-     * @see ILabelDecorator#decorateImage(Image, Object)
-     */
-    public Image decorateImage(Image image, Object element) {
-        Assert.isTrue(element instanceof IResource);
-        return image;
-    }
-
-    /*
-     * @see IBaseLabelProvider#addListener(ILabelProviderListener)
-     */
-    public void addListener(ILabelProviderListener listener) {
-        listeners.add(listener);
-    }
-
-    /*
-     * @see IBaseLabelProvider#dispose()
-     */
-    public void dispose() {
-        contributor = null;
-        listeners = new HashSet();
-    }
-
-    /*
-     * @see IBaseLabelProvider#isLabelProperty(Object, String)
-     */
-    public boolean isLabelProperty(Object element, String property) {
-        return false;
-    }
-
-    /*
-     * @see IBaseLabelProvider#removeListener(ILabelProviderListener)
-     */
-    public void removeListener(ILabelProviderListener listener) {
-        listeners.remove(listener);
-    }
-
-    /**
-     * Refresh the listeners to update the decorators for 
-     * element.
-     */
-
-    public void refreshListeners(Object element) {
-        Iterator iterator = listeners.iterator();
-        while (iterator.hasNext()) {
-            LabelProviderChangedEvent event = new LabelProviderChangedEvent(
-                    this, element);
-            ((ILabelProviderListener) iterator.next())
-                    .labelProviderChanged(event);
-        }
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestElement.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestElement.java
deleted file mode 100644
index 26fb4c3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestElement.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-/**
- * The TestElement is the abstract super class for the elements
- * for the table and tree decorator testing.
- */
-public abstract class TestElement {
-	
-	String name;
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestLabelProvider.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestLabelProvider.java
deleted file mode 100644
index e32ab0d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestLabelProvider.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.tests.TestPlugin;
-
-/**
- * TestTreeLabelProvider is the lable provider for the tree 
- * decorator test.
- */
-public class TestLabelProvider implements ILabelProvider, IColorProvider, IFontProvider {
-
-	Image image;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object element) {
-		if (image == null) {
-			TestPlugin plugin = TestPlugin.getDefault();
-			image = plugin.getImageDescriptor("anything.gif").createImage();
-		}
-		return image;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object element) {
-		return ((TestElement) element).name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-	 */
-	public Color getBackground(Object element) {
-		
-		int switchNumber = 0;
-		if(element instanceof TreeElement)
-			switchNumber = ((TreeElement) element).level;
-		else
-			switchNumber = ((TableElement) element).index%4;
-		
-		switch (switchNumber) {
-		case 0:
-			return Display.getDefault().getSystemColor(SWT.COLOR_YELLOW);
-		case 1:
-			return Display.getDefault().getSystemColor(SWT.COLOR_GREEN);
-		case 2:
-			return Display.getDefault().getSystemColor(SWT.COLOR_DARK_GREEN);
-		case 3:
-			return Display.getDefault().getSystemColor(SWT.COLOR_BLACK);
-		default:
-			break;
-		}
-		
-		return null;
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-	 */
-	public Color getForeground(Object element) {
-		
-		int switchNumber = 0;
-		if(element instanceof TreeElement)
-			switchNumber = ((TreeElement) element).level;
-		else
-			switchNumber = ((TableElement) element).index%4;
-		
-		
-		switch (switchNumber) {
-		case 0:
-			return Display.getDefault().getSystemColor(SWT.COLOR_DARK_RED);
-		case 1:
-			return Display.getDefault().getSystemColor(SWT.COLOR_RED);
-		case 2:
-			return Display.getDefault().getSystemColor(SWT.COLOR_CYAN);
-		case 3:
-			return Display.getDefault().getSystemColor(SWT.COLOR_YELLOW);
-		default:
-			break;
-		}
-		
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
-	 */
-	public Font getFont(Object element) {
-		return JFaceResources.getFontRegistry().getItalic(JFaceResources.DEFAULT_FONT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener listener) {
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		if (image != null)
-			image.dispose();
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-	 */
-	public boolean isLabelProperty(Object element, String property) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-		
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestLightweightDecoratorContributor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestLightweightDecoratorContributor.java
deleted file mode 100644
index c0b93c3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestLightweightDecoratorContributor.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.ui.tests.TestPlugin;
-
-public class TestLightweightDecoratorContributor implements
-        ILightweightLabelDecorator {
-
-    public static TestLightweightDecoratorContributor contributor;
-
-    private Set listeners = new HashSet();
-
-    public static String DECORATOR_SUFFIX = "_SUFFIX";
-
-    public static String DECORATOR_PREFIX = "PREFIX_";
-
-    private ImageDescriptor descriptor;
-
-    public TestLightweightDecoratorContributor() {
-        contributor = this;
-    }
-
-    /*
-     * @see IBaseLabelProvider#addListener(ILabelProviderListener)
-     */
-    public void addListener(ILabelProviderListener listener) {
-        listeners.add(listener);
-    }
-
-    /*
-     * @see IBaseLabelProvider#dispose()
-     */
-    public void dispose() {
-        contributor = null;
-        listeners = new HashSet();
-    }
-
-    /*
-     * @see IBaseLabelProvider#isLabelProperty(Object, String)
-     */
-    public boolean isLabelProperty(Object element, String property) {
-        return false;
-    }
-
-    /*
-     * @see IBaseLabelProvider#removeListener(ILabelProviderListener)
-     */
-    public void removeListener(ILabelProviderListener listener) {
-        listeners.remove(listener);
-    }
-
-    /**
-     * Refresh the listeners to update the decorators for 
-     * element.
-     */
-
-    public void refreshListeners(Object element) {
-        Iterator iterator = listeners.iterator();
-        while (iterator.hasNext()) {
-            LabelProviderChangedEvent event = new LabelProviderChangedEvent(
-                    this, element);
-            ((ILabelProviderListener) iterator.next())
-                    .labelProviderChanged(event);
-        }
-    }
-
-    /**
-     * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#getOverlay(java.lang.Object)
-     */
-    public ImageDescriptor getOverlay(Object element) {
-        Assert.isTrue(element instanceof IResource);
-        if (descriptor == null) {
-            URL source = TestPlugin.getDefault().getDescriptor()
-                    .getInstallURL();
-            try {
-                descriptor = ImageDescriptor.createFromURL(new URL(source,
-                        "icons/binary_co.gif"));
-            } catch (MalformedURLException exception) {
-                return null;
-            }
-        }
-        return descriptor;
-
-    }
-
-    /**
-     * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object, org.eclipse.jface.viewers.IDecoration)
-     */
-    public void decorate(Object element, IDecoration decoration) {
-        decoration.addOverlay(getOverlay(element));
-        decoration.addPrefix(DECORATOR_PREFIX);
-        decoration.addSuffix(DECORATOR_SUFFIX);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestLightweightDecoratorMultipleQuadrantContributor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestLightweightDecoratorMultipleQuadrantContributor.java
deleted file mode 100644
index 6c56138..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestLightweightDecoratorMultipleQuadrantContributor.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.ui.tests.TestPlugin;
-
-/**
- * This is a contributor that uses the multi quadrant
- * support.
- */
-
-public class TestLightweightDecoratorMultipleQuadrantContributor implements
-        ILightweightLabelDecorator {
-
-    public static TestLightweightDecoratorMultipleQuadrantContributor contributor;
-
-    private Set listeners = new HashSet();
-
-    private ImageDescriptor descriptor;
-
-    public TestLightweightDecoratorMultipleQuadrantContributor() {
-        contributor = this;
-    }
-
-    /*
-     * @see IBaseLabelProvider#addListener(ILabelProviderListener)
-     */
-    public void addListener(ILabelProviderListener listener) {
-        listeners.add(listener);
-    }
-
-    /*
-     * @see IBaseLabelProvider#dispose()
-     */
-    public void dispose() {
-        contributor = null;
-        listeners = new HashSet();
-    }
-
-    /*
-     * @see IBaseLabelProvider#isLabelProperty(Object, String)
-     */
-    public boolean isLabelProperty(Object element, String property) {
-        return false;
-    }
-
-    /*
-     * @see IBaseLabelProvider#removeListener(ILabelProviderListener)
-     */
-    public void removeListener(ILabelProviderListener listener) {
-        listeners.remove(listener);
-    }
-
-    /**
-     * Refresh the listeners to update the decorators for 
-     * element.
-     */
-
-    public void refreshListeners(Object element) {
-        Iterator iterator = listeners.iterator();
-        while (iterator.hasNext()) {
-            LabelProviderChangedEvent event = new LabelProviderChangedEvent(
-                    this, element);
-            ((ILabelProviderListener) iterator.next())
-                    .labelProviderChanged(event);
-        }
-    }
-
-    /**
-     * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#getOverlay(java.lang.Object)
-     */
-    public ImageDescriptor getOverlay(Object element) {
-        Assert.isTrue(element instanceof IResource);
-        if (descriptor == null) {
-            URL source = TestPlugin.getDefault().getDescriptor()
-                    .getInstallURL();
-            try {
-                descriptor = ImageDescriptor.createFromURL(new URL(source,
-                        "icons/binary_co.gif"));
-            } catch (MalformedURLException exception) {
-                return null;
-            }
-        }
-        return descriptor;
-
-    }
-
-    /**
-     * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object, org.eclipse.jface.viewers.IDecoration)
-     */
-    public void decorate(Object element, IDecoration decoration) {
-        decoration.addOverlay(getOverlay(element), IDecoration.BOTTOM_LEFT);
-        decoration.addOverlay(getOverlay(element), IDecoration.BOTTOM_RIGHT);
-        decoration.addOverlay(getOverlay(element), IDecoration.TOP_LEFT);
-        decoration.addOverlay(getOverlay(element), IDecoration.TOP_RIGHT);
-        decoration.addOverlay(getOverlay(element), IDecoration.UNDERLAY);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestResourceDecoratorContributor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestResourceDecoratorContributor.java
deleted file mode 100644
index 76cc5ca..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestResourceDecoratorContributor.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.core.resources.IResource;
-
-public class TestResourceDecoratorContributor extends TestAdaptableDecoratorContributor {
-    public static final String SUFFIX = "IResource.1";
-    public static final String ID = "org.eclipse.ui.tests.decorators.resourceDescorator";
-    public TestResourceDecoratorContributor() {
-        setExpectedElementType(IResource.class);
-        setSuffix(SUFFIX);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestResourceMappingDecoratorContributor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestResourceMappingDecoratorContributor.java
deleted file mode 100644
index 714a7e5..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestResourceMappingDecoratorContributor.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.core.resources.mapping.ResourceMapping;
-
-public class TestResourceMappingDecoratorContributor extends
-        TestAdaptableDecoratorContributor {
-    public static final String SUFFIX = "ResourceMapping.1";
-    public static final String ID = "org.eclipse.ui.tests.decorators.resourceMappingDescorator";
-    public TestResourceMappingDecoratorContributor() {
-        setExpectedElementType(ResourceMapping.class);
-        setSuffix(SUFFIX);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestTableContentProvider.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestTableContentProvider.java
deleted file mode 100644
index 1a418b2..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestTableContentProvider.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * The TestTableContentProvider is the content provider for the
- * tabel views in the decorator testing.
- */
-public class TestTableContentProvider implements IStructuredContentProvider {	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-		TableElement[] elements = new TableElement[100];
-		
-		for (int i = 0; i < elements.length; i++) {
-			elements[i] = new TableElement(i);			
-		}
-		
-		return elements;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-		// Do nothing by default
-
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		// Do nothing by default
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestTreeContentProvider.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestTreeContentProvider.java
deleted file mode 100644
index 351425d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestTreeContentProvider.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * A content provider with a dummy tree structure.
- */
-public class TestTreeContentProvider implements ITreeContentProvider {
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(Object parentElement) {
-		TreeElement parent = (TreeElement) parentElement;
-		TreeElement[] children = new TreeElement[10];
-		for (int i = 0; i < 10; i++) {
-			children[i] = new TreeElement(parent, i);
-		}
-		return children;
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object element) {
-		return ((TreeElement) element).parent;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object element) {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-		TreeElement root = new TreeElement(null, 0);
-		return new Object[] { root };
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-		//No dispose behavior
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestUnadaptableDecoratorContributor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestUnadaptableDecoratorContributor.java
deleted file mode 100644
index 717d93a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TestUnadaptableDecoratorContributor.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-/**
- * Decorator used to test an unadaptaed contribution
- */
-public class TestUnadaptableDecoratorContributor extends TestAdaptableDecoratorContributor {
-    public static final String SUFFIX = "ICommon.2";
-    public static final String ID = "org.eclipse.ui.tests.decorators.generalAdaptabilityOff";
-    public TestUnadaptableDecoratorContributor() {
-        setSuffix(SUFFIX);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TreeElement.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TreeElement.java
deleted file mode 100644
index bd78771..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/decorators/TreeElement.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.decorators;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-/**
- * The TreeElement is the element displayed in the
- * test tree views.
- */
-public class TreeElement extends TestElement {
-	int level;
-
-	TreeElement parent;
-
-	Collection children = new ArrayList(10);
-
-	TreeElement(TreeElement parent, int index) {
-		if (parent == null) {
-			name = "Root";
-			level = 0;
-		} else {
-			level = parent.level + 1;
-			name = "Level" + String.valueOf(level) + " - " + String.valueOf(index);
-			parent.children.add(this);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DataTransferTestStub.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DataTransferTestStub.java
deleted file mode 100644
index b8351d8..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DataTransferTestStub.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-/**
- * FOR USE BY TESTS ONLY!
- * <p>
- * Stub class that provides access to classes visible to the package
- * <code>org.eclipse.ui.wizards.datatransfer</code>.  For the purpose
- * of testing.
- * </p>
- * @private
- */
-public class DataTransferTestStub {
-    //Prevent instantiation
-    private DataTransferTestStub() {
-    }
-
-    /**
-     * Gives access to an instance of WizardFileSystemResourceExportPage1.
-     * @return IWizardPage an instance of WizardFileSystemResourceExportPage1
-     */
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public packages.
-     * 
-     public static IWizardPage newFileSystemResourceExportPage1(IStructuredSelection selection) {
-     return new WizardFileSystemResourceExportPage1(selection);
-     }
-     */
-    /**
-     * Gives access to an instance of WizardFileSystemResourceImportPage1.
-     * @return IWizardPage an instance of WizardFileSystemResourceImportPage1
-     */
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public packages.
-     * 
-     public static IWizardPage newFileSystemResourceImportPage1(IWorkbench workbench, IStructuredSelection selection) {
-     return new WizardFileSystemResourceImportPage1(workbench, selection);
-     }
-     */
-    /**
-     * Gives access to an instance of WizardZipFileResourceExportPage1.
-     * @return IWizardPage an instance of WizardZipFileResourceExportPage1
-     */
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public packages.
-     * 
-     public static IWizardPage newZipFileResourceExportPage1(IStructuredSelection selection) {
-     return new WizardZipFileResourceExportPage1(selection);
-     }
-     */
-    /**
-     * Gives access to an instance of WizardZipFileResourceImportPage1.
-     * @return IWizardPage an instance of WizardZipFileResourceImportPage1
-     */
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public packages.
-     * 
-     public static IWizardPage newZipFileResourceImportPage1(IStructuredSelection selection) {
-     return new WizardZipFileResourceExportPage1(selection);
-     }
-     */
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIDialogs.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIDialogs.java
deleted file mode 100644
index e7a2bcc..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIDialogs.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import junit.framework.TestCase;
-
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.YesNoCancelListSelectionDialog;
-import org.eclipse.ui.internal.WorkbenchMessages;
-import org.eclipse.ui.model.AdaptableList;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchPartLabelProvider;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-public class DeprecatedUIDialogs extends TestCase {
-
-    public DeprecatedUIDialogs(String name) {
-        super(name);
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    public void testSaveAll() {
-        YesNoCancelListSelectionDialog dialog = new YesNoCancelListSelectionDialog(
-                getShell(), new AdaptableList(),
-                new WorkbenchContentProvider(),
-                new WorkbenchPartLabelProvider(), WorkbenchMessages.EditorManager_saveResourcesMessage);
-        dialog.setTitle(WorkbenchMessages.EditorManager_saveResourcesTitle);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIDialogsAuto.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIDialogsAuto.java
deleted file mode 100644
index 6b50e5b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIDialogsAuto.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import junit.framework.TestCase;
-
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.YesNoCancelListSelectionDialog;
-import org.eclipse.ui.internal.WorkbenchMessages;
-import org.eclipse.ui.model.AdaptableList;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchPartLabelProvider;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-public class DeprecatedUIDialogsAuto extends TestCase {
-
-    public DeprecatedUIDialogsAuto(String name) {
-        super(name);
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    public void testSaveAll() {
-        YesNoCancelListSelectionDialog dialog = new YesNoCancelListSelectionDialog(
-                getShell(), new AdaptableList(),
-                new WorkbenchContentProvider(),
-                new WorkbenchPartLabelProvider(), WorkbenchMessages.EditorManager_saveResourcesMessage);
-        dialog.setTitle(WorkbenchMessages.EditorManager_saveResourcesTitle);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIPreferences.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIPreferences.java
deleted file mode 100644
index 43953fe..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIPreferences.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import java.util.Iterator;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-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.StructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-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.ui.tests.harness.util.DialogCheck;
-
-public class DeprecatedUIPreferences extends TestCase {
-	private IProject _project;
-
-	private static final String PROJECT_NAME = "DummyProject";
-
-	public DeprecatedUIPreferences(String name) {
-		super(name);
-	}
-
-	private Shell getShell() {
-		return DialogCheck.getShell();
-	}
-
-	private IProject getDummyProject() {
-		try {
-			IProject projects[] = ResourcesPlugin.getWorkspace().getRoot()
-					.getProjects();
-			for (int i = 0; i < projects.length; i++) {
-				if (projects[i].getName().equals(PROJECT_NAME)) {
-					projects[i].delete(true, null);
-					break;
-				}
-			}
-			_project = ResourcesPlugin.getWorkspace().getRoot().getProject(
-					PROJECT_NAME);
-			_project.create(null);
-		} catch (CoreException e) {
-			System.out.println(e);
-		}
-		return _project;
-	}
-
-	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(),
-							new Object[] { IWorkbenchHelpContextIds.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) {
-		PropertyDialogWrapper dialog = null;
-
-		PropertyPageManager manager = new PropertyPageManager();
-		String title = "";
-		String name = "";
-
-		IProject element = getDummyProject();
-		if (element == null) {
-			return null;
-		}
-		// 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;
-		}
-		title = NLS.bind(WorkbenchMessages.PropertyDialog_propertyMessage,
-				(new Object[] { name }));
-		dialog = new PropertyDialogWrapper(getShell(), manager,
-				new StructuredSelection(element));
-		dialog.create();
-		dialog.getShell().setText(title);
-		WorkbenchHelp.setHelp(dialog.getShell(),
-				new Object[] { IWorkbenchHelpContextIds.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 testWorkbenchPref() {
-		Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.Workbench");
-		DialogCheck.assertDialog(dialog, this);
-	}
-
-	public void testAppearancePref() {
-		Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.Views");
-		DialogCheck.assertDialog(dialog, this);
-	}
-
-	public void testDefaultTextEditorPref() {
-		Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.TextEditor");
-		DialogCheck.assertDialog(dialog, this);
-	}
-
-	public void testFileEditorsPref() {
-		Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.FileEditors");
-		DialogCheck.assertDialog(dialog, this);
-	}
-
-	public void testLocalHistoryPref() {
-		Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.FileStates");
-		DialogCheck.assertDialog(dialog, this);
-	}
-
-	public void testPerspectivesPref() {
-		Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.Perspectives");
-		DialogCheck.assertDialog(dialog, this);
-	}
-
-	public void testInfoProp() {
-		Dialog dialog = getPropertyDialog("org.eclipse.ui.propertypages.info.file");
-		DialogCheck.assertDialog(dialog, this);
-	}
-
-	public void testProjectReferencesProp() {
-		Dialog dialog = getPropertyDialog("org.eclipse.ui.propertypages.project.reference");
-		DialogCheck.assertDialog(dialog, this);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIPreferencesAuto.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIPreferencesAuto.java
deleted file mode 100644
index f9c52e8..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIPreferencesAuto.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import java.util.Iterator;
-
-import junit.framework.TestCase;
-
-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.swt.widgets.Shell;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-public class DeprecatedUIPreferencesAuto extends TestCase {
-
-    public DeprecatedUIPreferencesAuto(String name) {
-        super(name);
-    }
-
-    protected Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    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(),
-                    new Object[] { IWorkbenchHelpContextIds.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;
-    }
-
-    public void testWorkbenchPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.Workbench");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testAppearancePref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.Views");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testDefaultTextEditorPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.TextEditor");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testFileEditorsPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.FileEditors");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testLocalHistoryPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.FileStates");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testPerspectivesPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.Perspectives");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    //Only really checking if this opens without an exception
-    public void testFontEditorsPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.tests.dialogs.FontFieldEditorTestPreferencePage");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testInfoProp() {
-        /*
-         * Commented out because it generates a failure
-         * of expect and actual width values. Suspect this
-         * is an SWT issue.
-         * 
-         Dialog dialog = getPropertyDialog("org.eclipse.ui.propertypages.info.file");
-         DialogCheck.assertDialogTexts(dialog, this);
-         */
-    }
-
-    public void testProjectReferencesProp() {
-        /*
-         * Commented out because it generates a failure
-         * of expect and actual width values. Suspect this
-         * is an SWT issue.
-         * 
-         Dialog dialog = getPropertyDialog("org.eclipse.ui.propertypages.project.reference");
-         DialogCheck.assertDialogTexts(dialog, this);
-         */
-    }
-
-    /**
-     * Test the editors preference page and toggle the
-     * enable state twice to be sure there are no errors.
-     */
-    public void testFieldEditorEnablePref() {
-
-        PreferenceDialogWrapper dialog = null;
-        PreferenceManager manager = WorkbenchPlugin.getDefault()
-                .getPreferenceManager();
-        if (manager != null) {
-            dialog = new PreferenceDialogWrapper(getShell(), manager);
-            dialog.create();
-
-            for (Iterator iterator = manager.getElements(
-                    PreferenceManager.PRE_ORDER).iterator(); iterator.hasNext();) {
-                IPreferenceNode node = (IPreferenceNode) iterator.next();
-                if (node
-                        .getId()
-                        .equals(
-                                "org.eclipse.ui.tests.dialogs.EnableTestPreferencePage")) {
-                    dialog.showPage(node);
-                    EnableTestPreferencePage page = (EnableTestPreferencePage) dialog
-                            .getPage(node);
-                    page.flipState();
-                    page.flipState();
-                    break;
-                }
-            }
-        }
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIWizards.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIWizards.java
deleted file mode 100644
index 57fa5a4..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIWizards.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.WizardNewProjectReferencePage;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.dialogs.ExportWizard;
-import org.eclipse.ui.internal.dialogs.ImportWizard;
-import org.eclipse.ui.internal.dialogs.NewWizard;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.wizards.newresource.ResourceMessages;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-import org.eclipse.ui.wizards.newresource.BasicNewFileResourceWizard;
-import org.eclipse.ui.wizards.newresource.BasicNewFolderResourceWizard;
-import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
-
-public class DeprecatedUIWizards extends TestCase {
-    private static final int SIZING_WIZARD_WIDTH = 470;
-
-    private static final int SIZING_WIZARD_HEIGHT = 550;
-
-    private static final int SIZING_WIZARD_WIDTH_2 = 500;
-
-    private static final int SIZING_WIZARD_HEIGHT_2 = 500;
-
-    public DeprecatedUIWizards(String name) {
-        super(name);
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    private IWorkbench getWorkbench() {
-        return WorkbenchPlugin.getDefault().getWorkbench();
-    }
-
-    private WizardDialog exportWizard(IWizardPage page) {
-        ExportWizard wizard = new ExportWizard();
-        wizard.init(getWorkbench(), null);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("ExportResourcesAction");
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings
-                    .addNewSection("ExportResourcesAction");
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT);
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IWorkbenchHelpContextIds.EXPORT_WIZARD });
-
-        if (page != null) {
-            page.setWizard(wizard);
-            dialog.showPage(page);
-        }
-        return dialog;
-    }
-
-    private WizardDialog importWizard(IWizardPage page) {
-        ImportWizard wizard = new ImportWizard();
-        wizard.init(getWorkbench(), null);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("ImportResourcesAction");
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings
-                    .addNewSection("ImportResourcesAction");
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT);
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IWorkbenchHelpContextIds.IMPORT_WIZARD });
-
-        if (page != null) {
-            page.setWizard(wizard);
-            dialog.showPage(page);
-        }
-        return dialog;
-    }
-
-    public void testExportResources() {//reference: ExportResourcesAction
-        Dialog dialog = exportWizard(null);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public packages.
-     * 
-     public void testFileSystemExport() {
-     Dialog dialog = exportWizard( DataTransferTestStub.newFileSystemResourceExportPage1(null) );
-     DialogCheck.assertDialog(dialog, this);
-     }
-     public void testZipFileExport() {
-     Dialog dialog = exportWizard( DataTransferTestStub.newZipFileResourceExportPage1(null) );
-     DialogCheck.assertDialog(dialog, this);
-     }
-     */
-    public void testImportResources() {//reference: ImportResourcesAction
-        Dialog dialog = importWizard(null);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public packages.
-     * 
-     public void testFileSystemImport() {
-     Dialog dialog = importWizard( DataTransferTestStub.newFileSystemResourceImportPage1(WorkbenchPlugin.getDefault().getWorkbench(), StructuredSelection.EMPTY) );
-     DialogCheck.assertDialog(dialog, this);
-     }
-     public void testZipFileImport() {
-     Dialog dialog = importWizard( DataTransferTestStub.newZipFileResourceImportPage1(null) );
-     DialogCheck.assertDialog(dialog, this);
-     }
-     */
-    public void testNewFile() {
-        BasicNewFileResourceWizard wizard = new BasicNewFileResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), new StructuredSelection());
-        wizard.setNeedsProgressMonitor(true);
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setText("CreateFileAction_title");
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IIDEHelpContextIds.NEW_FILE_WIZARD });
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testNewFolder() {
-        BasicNewFolderResourceWizard wizard = new BasicNewFolderResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), new StructuredSelection());
-        wizard.setNeedsProgressMonitor(true);
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setText(
-                "CreateFolderAction_title"); 
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IIDEHelpContextIds.NEW_FOLDER_WIZARD });
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testNewProjectPage1() {
-        BasicNewProjectResourceWizard wizard = new BasicNewProjectResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), null);
-        wizard.setNeedsProgressMonitor(true);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        dialog.getShell().setText("CreateFileAction_title"); 
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IIDEHelpContextIds.NEW_PROJECT_WIZARD });
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testNewProjectPage2() {
-        BasicNewProjectResourceWizard wizard = new BasicNewProjectResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), null);
-        wizard.setNeedsProgressMonitor(true);
-
-        WizardNewProjectReferencePage page = new WizardNewProjectReferencePage(
-                "basicReferenceProjectPage");//$NON-NLS-1$
-        page.setTitle(ResourceMessages.NewProject_referenceTitle);
-        page.setDescription(ResourceMessages.NewProject_referenceDescription);
-        page.setWizard(wizard);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        dialog.getShell().setText("CreateFileAction_title"); 
-        dialog.showPage(page);
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IIDEHelpContextIds.NEW_PROJECT_WIZARD });
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testNewProject() {
-        // Create wizard selection wizard.
-        NewWizard wizard = new NewWizard();
-        wizard.setProjectsOnly(true);
-        ISelection selection = getWorkbench().getActiveWorkbenchWindow()
-                .getSelectionService().getSelection();
-        IStructuredSelection selectionToPass = null;
-        if (selection instanceof IStructuredSelection)
-            selectionToPass = (IStructuredSelection) selection;
-        else
-            selectionToPass = StructuredSelection.EMPTY;
-        wizard.init(getWorkbench(), selectionToPass);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("NewWizardAction");//$NON-NLS-1$
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings.addNewSection("NewWizardAction");//$NON-NLS-1$
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-
-        // Create wizard dialog.
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IIDEHelpContextIds.NEW_PROJECT_WIZARD });
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testNewResource() {
-        NewWizard wizard = new NewWizard();
-        ISelection selection = getWorkbench().getActiveWorkbenchWindow()
-                .getSelectionService().getSelection();
-        IStructuredSelection selectionToPass = null;
-        if (selection instanceof IStructuredSelection)
-            selectionToPass = (IStructuredSelection) selection;
-        else
-            selectionToPass = StructuredSelection.EMPTY;
-        wizard.init(getWorkbench(), selectionToPass);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("NewWizardAction");//$NON-NLS-1$
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings.addNewSection("NewWizardAction");//$NON-NLS-1$
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IWorkbenchHelpContextIds.NEW_WIZARD });
-        DialogCheck.assertDialog(dialog, this);
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIWizardsAuto.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIWizardsAuto.java
deleted file mode 100644
index 3707445..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/DeprecatedUIWizardsAuto.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
-import org.eclipse.ui.dialogs.WizardNewProjectReferencePage;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.dialogs.ExportWizard;
-import org.eclipse.ui.internal.dialogs.ImportWizard;
-import org.eclipse.ui.internal.dialogs.NewWizard;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.wizards.newresource.ResourceMessages;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.wizards.newresource.BasicNewFileResourceWizard;
-import org.eclipse.ui.wizards.newresource.BasicNewFolderResourceWizard;
-import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
-
-public class DeprecatedUIWizardsAuto extends TestCase {
-    private static final int SIZING_WIZARD_WIDTH = 470;
-
-    private static final int SIZING_WIZARD_HEIGHT = 550;
-
-    private static final int SIZING_WIZARD_WIDTH_2 = 500;
-
-    private static final int SIZING_WIZARD_HEIGHT_2 = 500;
-
-    private IProject project;
-
-    public DeprecatedUIWizardsAuto(String name) {
-        super(name);
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    private IWorkbench getWorkbench() {
-        return WorkbenchPlugin.getDefault().getWorkbench();
-    }
-
-    private WizardDialog exportWizard(IWizardPage page) {
-        ExportWizard wizard = new ExportWizard();
-        wizard.init(getWorkbench(), null);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("ExportResourcesAction");
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings
-                    .addNewSection("ExportResourcesAction");
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT);
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IWorkbenchHelpContextIds.EXPORT_WIZARD });
-
-        if (page != null) {
-            page.setWizard(wizard);
-            dialog.showPage(page);
-        }
-        return dialog;
-    }
-
-    private WizardDialog importWizard(IWizardPage page) {
-        ImportWizard wizard = new ImportWizard();
-        wizard.init(getWorkbench(), null);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("ImportResourcesAction");
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings
-                    .addNewSection("ImportResourcesAction");
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT);
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IWorkbenchHelpContextIds.IMPORT_WIZARD });
-
-        if (page != null) {
-            page.setWizard(wizard);
-            dialog.showPage(page);
-        }
-        return dialog;
-    }
-
-    /**
-     * @see junit.framework.TestCase#tearDown()
-     */
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        try {
-            if (project != null) {
-                project.delete(true, true, null);
-                project = null;
-            }
-        } catch (CoreException e) {
-            fail(e.toString());
-        }
-    }
-
-    public void testExportResources() {//reference: ExportResourcesAction
-        Dialog dialog = exportWizard(null);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public packages.
-     * 
-     public void testFileSystemExport() {
-     Dialog dialog = exportWizard( DataTransferTestStub.newFileSystemResourceExportPage1(null) );
-     DialogCheck.assertDialogTexts(dialog, this);
-     }
-     public void testZipFileExport() {
-     Dialog dialog = exportWizard( DataTransferTestStub.newZipFileResourceExportPage1(null) );
-     DialogCheck.assertDialogTexts(dialog, this);
-     }
-     */
-    public void testImportResources() {//reference: ImportResourcesAction
-        Dialog dialog = importWizard(null);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public packages.
-     * 
-     public void testFileSystemImport() {
-     Dialog dialog = importWizard( DataTransferTestStub.newFileSystemResourceImportPage1(WorkbenchPlugin.getDefault().getWorkbench(), StructuredSelection.EMPTY) );
-     DialogCheck.assertDialogTexts(dialog, this);
-     }
-     public void testZipFileImport() {
-     Dialog dialog = importWizard( DataTransferTestStub.newZipFileResourceImportPage1(null) );
-     DialogCheck.assertDialogTexts(dialog, this);
-     }
-     */
-    public void testNewFile() {
-        BasicNewFileResourceWizard wizard = new BasicNewFileResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), new StructuredSelection());
-        wizard.setNeedsProgressMonitor(true);
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setText("CreateFileAction_title"); 
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IIDEHelpContextIds.NEW_FILE_WIZARD });
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    /**
-     * Test for bug 30719 [Linked Resources] NullPointerException when setting filename for WizardNewFileCreationPage 
-     */
-    public void testNewFile2() {
-        BasicNewFileResourceWizard wizard = new BasicNewFileResourceWizard() {
-            public void addPages() {
-                super.addPages();
-                IWizardPage page = getPage("newFilePage1");
-                assertTrue("Expected newFilePage1",
-                        page instanceof WizardNewFileCreationPage);
-                WizardNewFileCreationPage fileCreationPage = (WizardNewFileCreationPage) page;
-
-                try {
-                    project = FileUtil.createProject("testNewFile2");
-                } catch (CoreException e) {
-                    fail(e.getMessage());
-                }
-                fileCreationPage.setContainerFullPath(project.getFullPath());
-                fileCreationPage.setFileName("testFileName.test");
-            }
-        };
-
-        wizard.init(PlatformUI.getWorkbench(), new StructuredSelection());
-        wizard.setNeedsProgressMonitor(true);
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setText("CreateFileAction_title"); 
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                IIDEHelpContextIds.NEW_FILE_WIZARD);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testNewFolder() {
-        BasicNewFolderResourceWizard wizard = new BasicNewFolderResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), new StructuredSelection());
-        wizard.setNeedsProgressMonitor(true);
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setText("CreateFolderAction_title"); 
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IIDEHelpContextIds.NEW_FOLDER_WIZARD });
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testNewProjectPage1() {
-        BasicNewProjectResourceWizard wizard = new BasicNewProjectResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), null);
-        wizard.setNeedsProgressMonitor(true);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        dialog.getShell().setText("CreateFileAction_title");
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IIDEHelpContextIds.NEW_PROJECT_WIZARD });
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testNewProjectPage2() {
-        BasicNewProjectResourceWizard wizard = new BasicNewProjectResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), null);
-        wizard.setNeedsProgressMonitor(true);
-
-        WizardNewProjectReferencePage page = new WizardNewProjectReferencePage(
-                "basicReferenceProjectPage");//$NON-NLS-1$
-        page.setTitle(ResourceMessages.NewProject_referenceTitle);
-        page.setDescription(ResourceMessages.NewProject_referenceDescription);
-        page.setWizard(wizard);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        dialog.getShell().setText("CreateFileAction_title"); 		
-        dialog.showPage(page);
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IIDEHelpContextIds.NEW_PROJECT_WIZARD });
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testNewProject() {
-        // Create wizard selection wizard.
-        NewWizard wizard = new NewWizard();
-        wizard.setProjectsOnly(true);
-        ISelection selection = getWorkbench().getActiveWorkbenchWindow()
-                .getSelectionService().getSelection();
-        IStructuredSelection selectionToPass = null;
-        if (selection instanceof IStructuredSelection)
-            selectionToPass = (IStructuredSelection) selection;
-        else
-            selectionToPass = StructuredSelection.EMPTY;
-        wizard.init(getWorkbench(), selectionToPass);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("NewWizardAction");//$NON-NLS-1$
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings.addNewSection("NewWizardAction");//$NON-NLS-1$
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-
-        // Create wizard dialog.
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IIDEHelpContextIds.NEW_PROJECT_WIZARD });
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testNewResource() {
-        NewWizard wizard = new NewWizard();
-        ISelection selection = getWorkbench().getActiveWorkbenchWindow()
-                .getSelectionService().getSelection();
-        IStructuredSelection selectionToPass = null;
-        if (selection instanceof IStructuredSelection)
-            selectionToPass = (IStructuredSelection) selection;
-        else
-            selectionToPass = StructuredSelection.EMPTY;
-        wizard.init(getWorkbench(), selectionToPass);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("NewWizardAction");//$NON-NLS-1$
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings.addNewSection("NewWizardAction");//$NON-NLS-1$
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                new Object[] { IWorkbenchHelpContextIds.NEW_WIZARD });
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/EnableTestPreferencePage.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/EnableTestPreferencePage.java
deleted file mode 100644
index e6a6de9..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/EnableTestPreferencePage.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.ColorFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.FontFieldEditor;
-import org.eclipse.jface.preference.PathEditor;
-import org.eclipse.jface.preference.RadioGroupFieldEditor;
-import org.eclipse.jface.preference.StringFieldEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-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 EnableTestPreferencePage extends FieldEditorPreferencePage
-        implements IWorkbenchPreferencePage {
-
-    private BooleanFieldEditor be;
-
-    private ColorFieldEditor ce;
-
-    private FontFieldEditor fe;
-
-    private PathEditor pe;
-
-    private RadioGroupFieldEditor rg;
-
-    private StringFieldEditor se;
-
-    private Composite beParent;
-
-    private Composite ceParent;
-
-    private Composite feParent;
-
-    private Composite peParent;
-
-    private Composite rgParent;
-
-    private Composite seParent;
-
-    private boolean enabledState = true;
-
-    public EnableTestPreferencePage() {
-        super(GRID);
-    }
-
-    public void flipState() {
-        if (enabledState)
-            enabledState = false;
-        else
-            enabledState = true;
-
-        be.setEnabled(enabledState, beParent);
-        ce.setEnabled(enabledState, ceParent);
-        fe.setEnabled(enabledState, feParent);
-        pe.setEnabled(enabledState, peParent);
-        rg.setEnabled(enabledState, rgParent);
-        se.setEnabled(enabledState, seParent);
-
-    }
-
-    /**
-     * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
-     */
-    protected void createFieldEditors() {
-
-        String[][] labelsAndValues = new String[][] { { "Label 1", "Value 1" },
-                { "Label 2", "Value 2" } };
-
-        beParent = getFieldEditorParent();
-        be = new BooleanFieldEditor("BooleanValue", "BooleanTest", beParent);
-        addField(be);
-
-        ceParent = getFieldEditorParent();
-        ce = new ColorFieldEditor("ColorValue", "Color Test", ceParent);
-        addField(ce);
-
-        feParent = getFieldEditorParent();
-        fe = new FontFieldEditor("FontValue", "Font Test", feParent);
-        addField(fe);
-
-        peParent = getFieldEditorParent();
-        pe = new PathEditor("PathValue", "Path Test", "C:\temp", peParent);
-        addField(pe);
-
-        rgParent = getFieldEditorParent();
-        rg = new RadioGroupFieldEditor("Radio Value", "Radio Test", 2,
-                labelsAndValues, rgParent);
-        addField(rg);
-
-        seParent = getFieldEditorParent();
-        se = new StringFieldEditor("String Value", "String Editor", seParent);
-        addField(se);
-
-    }
-
-    /* (non-Javadoc)
-     * Method declared on PreferencePage.
-     */
-    protected Control createContents(Composite parent) {
-        Composite composite = (Composite) super.createContents(parent);
-        Button enabledButton = new Button(parent, SWT.PUSH);
-        enabledButton.setText("Switch Enabled State");
-
-        enabledButton.addSelectionListener(new SelectionListener() {
-            public void widgetSelected(SelectionEvent e) {
-                flipState();
-            }
-
-            public void widgetDefaultSelected(SelectionEvent e) {
-                flipState();
-            }
-        });
-        return composite;
-    }
-
-    /**
-     * @see org.eclipse.ui.IWorkbenchPreferencePage#init(IWorkbench)
-     */
-    public void init(IWorkbench workbench) {
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/FontFieldEditorTestPreferencePage.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/FontFieldEditorTestPreferencePage.java
deleted file mode 100644
index 42005ec..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/FontFieldEditorTestPreferencePage.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.FontFieldEditor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * The Field Editor Preference page is a test of the font field
- * editors with and without previewers.
- */
-public class FontFieldEditorTestPreferencePage extends
-        FieldEditorPreferencePage implements IWorkbenchPreferencePage {
-
-    /**
-     * Create the preference page.
-     */
-    public FontFieldEditorTestPreferencePage() {
-        super(GRID);
-    }
-
-    /**
-     * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
-     */
-    protected void createFieldEditors() {
-
-        Composite feParent = getFieldEditorParent();
-
-        for (int i = 0; i < 3; i++) {
-            //Create one with a preview
-            addField(new FontFieldEditor("FontValue" + String.valueOf(i),
-                    "Font Test" + String.valueOf(i), "Preview", feParent));
-
-            //Create one without
-            addField(new FontFieldEditor(
-                    "FontValueDefault" + String.valueOf(i), "Font Test Default"
-                            + String.valueOf(i), feParent));
-        }
-
-    }
-
-    /**
-     * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-     */
-    public void init(IWorkbench workbench) {
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/NavigatorTestStub.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/NavigatorTestStub.java
deleted file mode 100644
index 93dcc88..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/NavigatorTestStub.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-/**
- * FOR USE BY TESTS ONLY!
- * <p>
- * Stub class that provides access to classes visible to the package
- * <code>org.eclipse.ui.views.navigator</code>.  For the purpose of
- * testing.
- * </p>
- * @private
- */
-
-public class NavigatorTestStub {
-    //Prevent instantiation
-    private NavigatorTestStub() {
-    }
-
-    /**
-     * Gives access to an instance of GotoResourceDialog.
-     * @return GotoResourceDialog an instance of GotoResourceDialog.
-     */
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public packages.
-     * 
-     public static GotoResourceDialog newGotoResourceDialog(Shell parentShell,IResource[] resources) {
-     return new GotoResourceDialog(parentShell, resources);
-     }
-     */
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/PreferenceDialogWrapper.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/PreferenceDialogWrapper.java
deleted file mode 100644
index 7a7a683..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/PreferenceDialogWrapper.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
-import org.eclipse.ui.preferences.IWorkingCopyManager;
-import org.eclipse.ui.preferences.WorkingCopyManager;
-
-public class PreferenceDialogWrapper extends PreferenceDialog implements IWorkbenchPreferenceContainer{
-
-    public PreferenceDialogWrapper(Shell parentShell, PreferenceManager manager) {
-        super(parentShell, manager);
-    }
-
-    public boolean showPage(IPreferenceNode node) {
-        return super.showPage(node);
-    }
-
-    public IPreferencePage getPage(IPreferenceNode node) {
-        if (node == null)
-            return null;
-
-        // Create the page if nessessary
-        if (node.getPage() == null)
-            node.createPage();
-
-        if (node.getPage() == null)
-            return null;
-
-        return node.getPage();
-    }
-
-	public IWorkingCopyManager getWorkingCopyManager() {
-		return new WorkingCopyManager();
-	}
-
-	public boolean openPage(String preferencePageId, Object data) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.preferences.IWorkbenchPreferenceContainer#registerUpdateJob(org.eclipse.core.runtime.jobs.Job)
-	 */
-	public void registerUpdateJob(Job job) {
-		//Do nothing as we are not testing this.
-	}
-    
-  
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/PropertyDialogWrapper.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/PropertyDialogWrapper.java
deleted file mode 100644
index fc4ac53..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/PropertyDialogWrapper.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.internal.dialogs.PropertyDialog;
-
-public 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);
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/SearchPatternAuto.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/SearchPatternAuto.java
deleted file mode 100644
index 7b464f6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/SearchPatternAuto.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.dialogs;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.regex.Pattern;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ui.dialogs.SearchPattern;
-
-/**
- * Test case for tests SearchPattern match functionality 
- * 
- * @since 3.3
- *
- */
-public class SearchPatternAuto extends TestCase {
-	
-	private static ArrayList resources = new ArrayList();
-	
-	
-	static {
-		
-		generateRescourcesTestCases('A', 'C', 8, "");
-		
-		generateRescourcesTestCases('A', 'C', 4, "");
-		
-	}
-	/**
-	 * @param name
-	 */
-	public SearchPatternAuto(String name) {
-		super(name);
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-	}
-	
-	/**
-	 * Generates strings data for match test cases.
-	 * 
-	 * @param startChar
-	 * @param endChar
-	 * @param lenght
-	 * @param resource
-	 */
-	private static void generateRescourcesTestCases(char startChar, char endChar, int lenght, String resource){
-		for (char ch = startChar; ch <= endChar; ch++) {
-			String res = resource + String.valueOf(ch);
-			if (lenght == res.length()) 
-				resources.add(res);
-			else if ((res.trim().length() % 2) == 0)
-					generateRescourcesTestCases(Character.toUpperCase((char)(startChar + 1)), Character.toUpperCase((char)(endChar + 1)), lenght, res);
-				else 
-					generateRescourcesTestCases(Character.toLowerCase((char)(startChar + 1)), Character.toLowerCase((char)(endChar + 1)), lenght, res);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		super.tearDown();
-	}
-	
-	/**
-	 * Tests exact match functionality. If we camelCase rule is enable, Pattern should starts with lowerCase character.
-	 * Result for "abcd " pattern should be similar to regexp pattern "abcd" with case insensitive.
-	 */
-	public void testExactMatch1() {
-		String patternText = "abcd ";
-		Pattern pattern = Pattern.compile("abcd", Pattern.CASE_INSENSITIVE);
-		SearchPattern patternMatcher = new SearchPattern();
-		patternMatcher.setPattern(patternText);
-		assertEquals(patternMatcher.getMatchRule(), SearchPattern.RULE_EXACT_MATCH);
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			String res = (String) iter.next();
-			assertEquals(patternMatcher.matches(res), pattern.matcher(res).matches());
-		}
-	}
-	
-	/**
-	 * Tests exact match functionality. If we camelCase rule is enable, Pattern should starts with lowerCase character.
-	 * Result for "abcdefgh " pattern should be similar to regexp pattern "abcdefgh" with case insensitive.
-	 */
-	public void testExactMatch2() {
-		String patternText = "abcdefgh<";
-		Pattern pattern = Pattern.compile("abcdefgh", Pattern.CASE_INSENSITIVE);
-		SearchPattern patternMatcher = new SearchPattern();
-		patternMatcher.setPattern(patternText);
-		assertEquals(patternMatcher.getMatchRule(), SearchPattern.RULE_EXACT_MATCH);
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			String res = (String) iter.next();
-			assertEquals(patternMatcher.matches(res), pattern.matcher(res).matches());
-		}
-	}
-	
-	/**
-	 * Tests prefix match functionality. If we camelCase rule is enable, Pattern should starts with lowerCase character.
-	 * Result for "ab" pattern should be similar to regexp pattern "ab.*" with case insensitive.
-	 */
-	public void testPrefixMatch() {
-		String patternText = "ab";
-		Pattern pattern = Pattern.compile("ab.*", Pattern.CASE_INSENSITIVE);
-		SearchPattern patternMatcher = new SearchPattern();
-		patternMatcher.setPattern(patternText);
-		assertEquals(patternMatcher.getMatchRule(), SearchPattern.RULE_PREFIX_MATCH);
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			String res = (String) iter.next();
-			assertEquals(patternMatcher.matches(res), pattern.matcher(res).matches());
-		}
-	}
-	
-	/**
-	 * Tests pattern match functionality. It's similar to regexp patterns.
-	 * Result for "**cDe" pattern should be similar to regexp pattern ".*cde.*" with case insensitive.
-	 */
-	public void testPatternMatch1() {
-		String patternText = "**cDe";
-		Pattern pattern = Pattern.compile(".*cde.*", Pattern.CASE_INSENSITIVE);
-		SearchPattern patternMatcher = new SearchPattern();
-		patternMatcher.setPattern(patternText);
-		assertEquals(patternMatcher.getMatchRule(), SearchPattern.RULE_PATTERN_MATCH);
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			String res = (String) iter.next();
-			assertEquals(patternMatcher.matches(res), pattern.matcher(res).matches());
-		}
-	}
-	
-	/**
-	 * Tests pattern match functionality. It's similar to regexp patterns.
-	 * Result for "**c*e*i" pattern should be similar to regexp pattern ".*c.*e.*i.*" with case insensitive.
-	 */
-	public void testPatternMatch2() {
-		String patternText = "**c*e*i";
-		Pattern pattern = Pattern.compile(".*c.*e.*i.*", Pattern.CASE_INSENSITIVE);
-		SearchPattern patternMatcher = new SearchPattern();
-		patternMatcher.setPattern(patternText);
-		assertEquals(patternMatcher.getMatchRule(), SearchPattern.RULE_PATTERN_MATCH);
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			String res = (String) iter.next();
-			assertEquals(patternMatcher.matches(res), pattern.matcher(res).matches());
-		}
-	}
-	
-	/**
-	 * Tests camelCase match functionality.
-	 * Every string starts with upperCase characters should be recognize as camelCase pattern match rule.
-	 * Result for "CD" SearchPattern should be similar to regexp pattern "C[^A-Z]*D.*" or "CD.*"
-	 * If pattern contains only upperCase characters result contains all prefix match elements.
-	 */
-	public void testCamelCaseMatch1() {
-		String patternText = "CD";
-		Pattern pattern = Pattern.compile("C[^A-Z]*D.*");
-		Pattern pattern2 = Pattern.compile("CD.*", Pattern.CASE_INSENSITIVE);
-		SearchPattern patternMatcher = new SearchPattern();
-		patternMatcher.setPattern(patternText);
-		assertEquals(patternMatcher.getMatchRule(), SearchPattern.RULE_CAMELCASE_MATCH);
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			String res = (String) iter.next();
-			if (patternMatcher.matches(res) != pattern.matcher(res).matches()) {
-				assertEquals(patternMatcher.matches(res), pattern2.matcher(res).matches());
-			}
-		}
-	}
-	
-	/**
-	 * Tests camelCase match functionality.
-	 * Every string starts with upperCase characters should be recognize as camelCase pattern match rule.
-	 * Result for "AbCd " SearchPattern should be similar to regexp pattern "C[^A-Z]*D.*" or "CD.*"
-	 */
-	public void testCamelCaseMatch2() {
-		String patternText = "AbCd ";
-		Pattern pattern = Pattern.compile("Ab[^A-Z]*Cd[^A-Z]*");
-		SearchPattern patternMatcher = new SearchPattern();
-		patternMatcher.setPattern(patternText);
-		assertEquals(patternMatcher.getMatchRule(), SearchPattern.RULE_CAMELCASE_MATCH);
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			String res = (String) iter.next();
-			assertEquals(patternMatcher.matches(res), pattern.matcher(res).matches());
-		}
-	}
-	
-	/**
-	 * Tests camelCase match functionality.
-	 * Every string starts with upperCase characters should be recognize as camelCase pattern match rule.
-	 * Result for "AbCdE<" SearchPattern should be similar to regexp pattern "Ab[^A-Z]*Cd[^A-Z]*E[^A-Z]*"
-	 */
-	public void testCamelCaseMatch3() {
-		String patternText = "AbCdE<";
-		Pattern pattern = Pattern.compile("Ab[^A-Z]*Cd[^A-Z]*E[^A-Z]*");
-		SearchPattern patternMatcher = new SearchPattern();
-		patternMatcher.setPattern(patternText);
-		assertEquals(patternMatcher.getMatchRule(), SearchPattern.RULE_CAMELCASE_MATCH);
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			String res = (String) iter.next();
-			assertEquals(patternMatcher.matches(res), pattern.matcher(res).matches());
-		}
-	}
-	
-	/**
-	 * Tests blank match functionality. 
-	 * Blank string should be recognize as blank pattern match rule.
-	 * It should match with all resources.
-	 * Result for SearchPattern should be similar to regexp pattern ".*"
-	 */
-	public void testBlankMatch() {
-		String patternText = "";
-		Pattern pattern = Pattern.compile(".*", Pattern.CASE_INSENSITIVE);
-		SearchPattern patternMatcher = new SearchPattern();
-		patternMatcher.setPattern(patternText);
-		assertEquals(patternMatcher.getMatchRule(), SearchPattern.RULE_BLANK_MATCH);
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			String res = (String) iter.next();
-			assertEquals(patternMatcher.matches(res), pattern.matcher(res).matches());
-		}
-	}
-	
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/TaskListTestStub.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/TaskListTestStub.java
deleted file mode 100644
index 715c3db..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/TaskListTestStub.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-/**
- * FOR USE BY TESTS ONLY!
- * <p>
- * Stub class that provides access to classes visible to the package
- * <code>org.eclipse.ui.views.tasklist</code>.  For the purpose
- * of testing.
- * </p>
- * @private
- */
-public class TaskListTestStub {
-    //Prevent instantiation
-    private TaskListTestStub() {
-    }
-
-    /**
-     * Gives access to an instance of FiltersDialog.
-     * @return FiltersDialog an instance of FiltersDialog.
-     */
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public packages.
-     * 
-     public static FiltersDialog newFiltersDialog(Shell parentShell) {
-     return new FiltersDialog(parentShell);
-     }
-     */
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/TextEditorTestStub.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/TextEditorTestStub.java
deleted file mode 100644
index ad2f508..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/TextEditorTestStub.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-/**
- * FOR USE BY TESTS ONLY!
- * <p>
- * Stub class that provides access to classes visible to the package
- * <code>org.eclipse.ui.texteditor</code>.  For the purpose of
- * testing.
- * </p>
- * @private
- */
-
-public class TextEditorTestStub {
-    //Prevent instantiation
-    private TextEditorTestStub() {
-    }
-
-    /**
-     * Gives access to an instance of FindReplaceDialog.
-     * @return FindReplaceDialog an instance of FindReplaceDialog.
-     */
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public packages.
-     * 
-     public static FindReplaceDialog newFindReplaceDialog(Shell parentShell) {
-     return new FindReplaceDialog(parentShell);
-     }
-     */
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/TextMessageDialogs.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/TextMessageDialogs.java
deleted file mode 100644
index 754947f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/TextMessageDialogs.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import java.util.ResourceBundle;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-public class TextMessageDialogs extends TestCase {
-
-    public TextMessageDialogs(String name) {
-        super(name);
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    /**
-     * Returns the given string from the Text Editor's resource bundle.
-     * Should call org.eclipse.ui.texteditor.EditorMessages directly,
-     * but it has package visibility.
-     */
-    private String getEditorString(String id) {
-        ResourceBundle bundle = ResourceBundle
-                .getBundle("org.eclipse.ui.texteditor.EditorMessages");
-        assertNotNull("EditorMessages", bundle);
-        String string = bundle.getString(id);
-        assertNotNull(id, string);
-        return string;
-    }
-
-    /*
-     * Convenience method simliar to org.eclipse.jface.dialogs.MessageDialog::openConfirm.
-     * The method will return the dialog instead of opening.
-     * @param title the dialog's title, or <code>null</code> if none.
-     * @param message the message.
-     * @return Dialog the confirm dialog.
-     */
-    private MessageDialog getConfirmDialog(String title, String message) {
-        return new MessageDialog(getShell(), title, null, message,
-                MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.OK_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-    }
-
- 
-
-    /*
-     * Convenience method simliar to org.eclipse.jface.dialogs.MessageDialog::openQuestion.
-     * The method will return the dialog instead of opening.
-     * @param title the dialog's title, or <code>null</code> if none.
-     * @param message the message.
-     * @return MessageDialog the question dialog.
-     */
-    private MessageDialog getQuestionDialog(String title, String message) {
-        return new MessageDialog(getShell(), title, null, message,
-                MessageDialog.QUESTION,
-                new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.NO_LABEL }, 0);
-    }
-
-   public void testCloseFileDeleted() {
-        Dialog dialog = getConfirmDialog(
-                getEditorString("Editor_error_activated_deleted_close_title"),
-                getEditorString("Editor_error_activated_deleted_close_message"));
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testFileChanged() {
-        MessageDialog dialog = getQuestionDialog(
-                getEditorString("Editor_error_activated_outofsync_title"),
-                getEditorString("Editor_error_activated_outofsync_message"));
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-  
-    public void testSaveFileDeleted() {
-        MessageDialog dialog = new MessageDialog(
-                getShell(),
-                getEditorString("Editor_error_activated_deleted_save_title"),
-                null,
-                getEditorString("Editor_error_activated_deleted_save_message"),
-                MessageDialog.QUESTION,
-                new String[] {
-                        getEditorString("Editor_error_activated_deleted_save_button_save"),
-                        getEditorString("Editor_error_activated_deleted_save_button_close") },
-                0);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testUpdateConflict() {
-        MessageDialog dialog = getQuestionDialog(
-                getEditorString("Editor_error_save_outofsync_title"),
-                getEditorString("Editor_error_save_outofsync_message"));
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/TextMessageDialogsAuto.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/TextMessageDialogsAuto.java
deleted file mode 100644
index e5666a6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/TextMessageDialogsAuto.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import java.util.ResourceBundle;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.internal.WorkbenchMessages;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-public class TextMessageDialogsAuto extends TestCase {
-
-    public TextMessageDialogsAuto(String name) {
-        super(name);
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    /*
-     * Convenience method simliar to org.eclipse.jface.dialogs.MessageDialog::openConfirm.
-     * The method will return the dialog instead of opening.
-     * @param title the dialog's title, or <code>null</code> if none.
-     * @param message the message.
-     * @return Dialog the confirm dialog.
-     */
-    private MessageDialog getConfirmDialog(String title, String message) {
-        return new MessageDialog(getShell(), title, null, message,
-                MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.OK_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-    }
-
-    /*
-     * Convenience method simliar to org.eclipse.jface.dialogs.MessageDialog::openQuestion.
-     * The method will return the dialog instead of opening.
-     * @param title the dialog's title, or <code>null</code> if none.
-     * @param message the message.
-     * @return MessageDialog the question dialog.
-     */
-    private MessageDialog getQuestionDialog(String title, String message) {
-        return new MessageDialog(getShell(), title, null, message,
-                MessageDialog.QUESTION,
-                new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.NO_LABEL }, 0);
-    }
-
-    public void testCloseFileDeleted() {
-        Dialog dialog = null;
-        ResourceBundle bundle = ResourceBundle
-                .getBundle("org.eclipse.ui.texteditor.EditorMessages");
-        if (bundle != null) {
-            dialog = getConfirmDialog(
-                    bundle
-                            .getString("Editor_error_activated_deleted_close_title"),
-                    bundle
-                            .getString("Editor_error_activated_deleted_close_message"));
-        }
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
- 
-    public void testErrorClosing() {
-        Dialog dialog = getQuestionDialog(WorkbenchMessages.Error,
-                WorkbenchMessages.ErrorClosingNoArg);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testFileChanged() {
-        MessageDialog dialog = null;
-        ResourceBundle bundle = ResourceBundle
-                .getBundle("org.eclipse.ui.texteditor.EditorMessages");
-        if (bundle != null) {
-            dialog = getQuestionDialog(
-                    bundle.getString("Editor_error_activated_outofsync_title"),
-                    bundle
-                            .getString("Editor_error_activated_outofsync_message"));
-        }
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-    public void testSaveFileDeleted() {
-        MessageDialog dialog = null;
-        ResourceBundle bundle = ResourceBundle
-                .getBundle("org.eclipse.ui.texteditor.EditorMessages");
-        if (bundle != null) {
-            dialog = new MessageDialog(
-                    getShell(),
-                    bundle
-                            .getString("Editor_error_activated_deleted_save_title"),
-                    null,
-                    bundle
-                            .getString("Editor_error_activated_deleted_save_message"),
-                    MessageDialog.QUESTION,
-                    new String[] {
-                            bundle
-                                    .getString("Editor_error_activated_deleted_save_button_save"),
-                            bundle
-                                    .getString("Editor_error_activated_deleted_save_button_close") },
-                    0);
-        }
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testUpdateConflict() {
-        MessageDialog dialog = null;
-        ResourceBundle bundle = ResourceBundle
-                .getBundle("org.eclipse.ui.texteditor.EditorMessages");
-        if (bundle != null) {
-            dialog = getQuestionDialog(bundle
-                    .getString("Editor_error_save_outofsync_title"), bundle
-                    .getString("Editor_error_save_outofsync_message"));
-        }
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIAbstractFilteredResourcesSelectionDialog.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIAbstractFilteredResourcesSelectionDialog.java
deleted file mode 100644
index 86ba845..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIAbstractFilteredResourcesSelectionDialog.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.dialogs;
-
-import java.io.StringWriter;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.model.ResourceFactory;
-
-import junit.framework.TestCase;
-
-/**
- * @since 3.3
- * 
- */
-public class UIAbstractFilteredResourcesSelectionDialog extends TestCase {
-
-	// -----------------------
-	// implementation dependent !
-
-	private static final String HISTORY_SETTINGS = "History";
-
-	private static final String DEFAULT_ROOT_NODE_NAME = "historyRootNode"; //$NON-NLS-1$
-
-	private static final String DEFAULT_INFO_NODE_NAME = "infoNode";
-
-	private static final String DIALOG_SETTINGS = "org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog"; //$NON-NLS-1$
-
-	// -----------------------
-
-	private static final String PROJECT_NAME = "FilteredResourcesTestProject";
-
-	private static final String FOLDER_NAME1 = "testFolder1";
-
-	private static final String FOLDER_NAME2 = "testFolder2";
-
-	private static final String[] HISTORY_FILES = new String[] { "file1H.txt",
-			"file2H.avi", "_FiLe4H.java", "afile4H.txt", "bfile5H.txt",
-			"cfile6H.txt" };
-
-	private static final String[] NONHISTORY_FILES = new String[] {
-			"file1.txt", "file2.avi", "_FiLe4.java", "afile4.txt",
-			"bfile5.txt", "cfile6.txt" };
-
-	// -----------------------
-
-	protected IResource[] historyResources;
-
-	protected IResource[] nonHistoryResources;
-
-	protected IProject project;
-
-	/**
-	 * A hook for subclasses - provides means to change filesystem tree.
-	 * 
-	 * @return
-	 */
-	protected String getProjectName() {
-		return PROJECT_NAME;
-	}
-
-	/**
-	 * A hook for subclasses - provides means to change filesystem tree.
-	 * 
-	 * @return
-	 */
-	protected String getFirstFolderName() {
-		return FOLDER_NAME1;
-	}
-
-	/**
-	 * A hook for subclasses - provides means to change filesystem tree.
-	 * 
-	 * @return
-	 */
-	protected String getSecondFolderName() {
-		return FOLDER_NAME2;
-	}
-
-	/**
-	 * A hook for subclasses - provides means to change filesystem tree.
-	 * 
-	 * @return
-	 */
-	protected String[] getHistoryFiles() {
-		return HISTORY_FILES;
-	}
-
-	/**
-	 * A hook for subclasses - provides means to change filesystem tree.
-	 * 
-	 * @return
-	 */
-	protected String[] getNonHistoryFiles() {
-		return NONHISTORY_FILES;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		initializeProject();
-
-		// ------------------------
-		// IDialogSettings
-
-		IDialogSettings settings = IDEWorkbenchPlugin.getDefault()
-				.getDialogSettings().getSection(DIALOG_SETTINGS);
-
-		if (settings == null) {
-			settings = IDEWorkbenchPlugin.getDefault().getDialogSettings()
-					.addNewSection(DIALOG_SETTINGS);
-		}
-
-		// ------------------------
-		// XMLMemento
-
-		XMLMemento memento = XMLMemento.createWriteRoot(HISTORY_SETTINGS);
-
-		IMemento historyMemento = memento.createChild(DEFAULT_ROOT_NODE_NAME);
-
-		for (int i = 0; i < historyResources.length; i++) {
-			IResource item = historyResources[i];
-			IMemento elementMemento = historyMemento
-					.createChild(DEFAULT_INFO_NODE_NAME);
-			ResourceFactory resourceFactory = new ResourceFactory(item);
-			resourceFactory.saveState(elementMemento);
-		}
-
-		StringWriter writer = new StringWriter();
-
-		memento.save(writer);
-		settings.put(HISTORY_SETTINGS, writer.getBuffer().toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		finalizeProject();
-	}
-
-	private void initializeProject() throws Exception {
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		// ensure only the new project is visible
-		project = root.getProject(getProjectName());
-
-		IProject[] projects = root.getProjects();
-		for (int i = 0; i < projects.length; i++) {
-			projects[i].delete(true, null);
-		}
-
-		project.create(null);
-		project.open(null);
-		IFolder folder1 = project.getFolder(getFirstFolderName());
-		IFolder folder2 = project.getFolder(getSecondFolderName());
-		folder1.create(false, true, null);
-		folder2.create(false, true, null);
-		String[] historyFiles = getHistoryFiles();
-		if (historyFiles == null || historyFiles.length == 0) {
-			historyResources = new IResource[0];
-		} else {
-			historyResources = new IResource[historyFiles.length];
-			for (int i = 0; i < historyFiles.length; i++) {
-				IFile file = project.getFile(folder1.getProjectRelativePath()
-						.append("/" + historyFiles[i]));
-				file.create(null, false, null);
-				historyResources[i] = file;
-			}
-		}
-		String[] files = getNonHistoryFiles();
-		if (files == null || files.length == 0) {
-			nonHistoryResources = new IResource[0];
-		} else {
-			int length = files.length;
-			nonHistoryResources = new IResource[length * 2];
-			for (int i = 0; i < length; i++) {
-				IFile file = project.getFile(folder1.getProjectRelativePath()
-						.append("/" + files[i]));
-				file.create(null, false, null);
-				nonHistoryResources[i] = file;
-			}
-			for (int i = 0; i < length; i++) {
-				IFile file = project.getFile(folder2.getProjectRelativePath()
-						.append("/" + files[i]));
-				file.create(null, false, null);
-				nonHistoryResources[length + i] = file;
-			}
-		}
-	}
-
-	private void finalizeProject() throws CoreException {
-		if (project != null) {
-			project.delete(true, null);
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIAutomatedSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIAutomatedSuite.java
deleted file mode 100644
index 3757ac4..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIAutomatedSuite.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.ui.tests.compare.UIComparePreferencesAuto;
-
-/**
- * Test all areas of the UI.
- */
-public class UIAutomatedSuite extends TestSuite {
-
-    /**
-     * Returns the suite.  This is required to
-     * use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new UIAutomatedSuite();
-    }
-
-	/**
-	 * Construct the test suite.
-	 */
-	public UIAutomatedSuite() {
-		addTest(new TestSuite(UIDialogsAuto.class));
-		addTest(new TestSuite(DeprecatedUIDialogsAuto.class));
-		addTest(new TestSuite(UIWizardsAuto.class));
-		addTest(new TestSuite(DeprecatedUIWizardsAuto.class));
-		addTest(new TestSuite(UIPreferencesAuto.class));
-		addTest(new TestSuite(UIComparePreferencesAuto.class));
-		addTest(new TestSuite(DeprecatedUIPreferencesAuto.class));
-		addTest(new TestSuite(UIMessageDialogsAuto.class));
-		addTest(new TestSuite(UINewWorkingSetWizardAuto.class));
-		addTest(new TestSuite(UIEditWorkingSetWizardAuto.class));
-		addTest(new TestSuite(SearchPatternAuto.class));
-		addTest(new TestSuite(UIFilteredResourcesSelectionDialogAuto.class));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIDialogs.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIDialogs.java
deleted file mode 100644
index 5aa6159..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIDialogs.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.dialogs.ContainerSelectionDialog;
-import org.eclipse.ui.dialogs.EditorSelectionDialog;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-import org.eclipse.ui.dialogs.ProjectLocationSelectionDialog;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.dialogs.TypeFilteringDialog;
-import org.eclipse.ui.internal.Perspective;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.internal.dialogs.AboutDialog;
-import org.eclipse.ui.internal.dialogs.FileExtensionDialog;
-import org.eclipse.ui.internal.dialogs.SavePerspectiveDialog;
-import org.eclipse.ui.internal.dialogs.SelectPerspectiveDialog;
-import org.eclipse.ui.internal.dialogs.ShowViewDialog;
-import org.eclipse.ui.internal.ide.dialogs.SimpleListContentProvider;
-import org.eclipse.ui.internal.registry.PerspectiveDescriptor;
-import org.eclipse.ui.internal.registry.PerspectiveRegistry;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-public class UIDialogs extends TestCase {
-    private static final String PROJECT_SELECTION_MESSAGE = "Select Project";
-
-    private static final String FILTER_SELECTION_MESSAGE = ResourceNavigatorMessages.FilterSelection_message;
-
-    public UIDialogs(String name) {
-        super(name);
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    private IWorkbench getWorkbench() {
-        return PlatformUI.getWorkbench();
-    }
-
-    public void testAbout() {
-        Dialog dialog = null;
-        dialog = new AboutDialog(getShell());
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testAddProjects() {
-        Dialog dialog = new ListSelectionDialog(getShell(), null,
-                new SimpleListContentProvider(), new LabelProvider(),
-                PROJECT_SELECTION_MESSAGE);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testCopyMoveProject() {
-        IProject dummyProject = ResourcesPlugin.getWorkspace().getRoot()
-                .getProject("DummyProject");
-        Dialog dialog = new ProjectLocationSelectionDialog(getShell(),
-                dummyProject);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testCopyMoveResource() {
-        Dialog dialog = new ContainerSelectionDialog(getShell(), null, true,
-                "Select Destination");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testEditActionSetsDialog() {
-        Dialog dialog;
-        Perspective persp = null;
-        //Test perspective: use current perspective of test case
-        try { /*
-         * fixme: should try to get current perspective, or default;
-         * currently only
-         */
-            WorkbenchWindow window = (WorkbenchWindow) getWorkbench().getActiveWorkbenchWindow();
-            persp = new Perspective((PerspectiveDescriptor) getWorkbench()
-                    .getPerspectiveRegistry().getPerspectives()[0],
-                    (WorkbenchPage) window.getActivePage());
-            dialog = window.createCustomizePerspectiveDialog(persp);
-        } catch (WorkbenchException e) {
-            dialog = null;
-        }
-        DialogCheck.assertDialog(dialog, this);
-        if (persp != null) {
-            persp.dispose();
-        }
-    }
-
-    public void testEditorSelection() {
-        Dialog dialog = new EditorSelectionDialog(getShell());
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public
-     * packages. public void testFindReplace() { Dialog dialog =
-     * TextEditorTestStub.newFindReplaceDialog( getShell() );
-     * DialogCheck.assertDialog(dialog, this); } public void testGotoResource() {
-     * Dialog dialog = NavigatorTestStub.newGotoResourceDialog(getShell(), new
-     * IResource[0]); DialogCheck.assertDialog(dialog, this); }
-     */
-    public void testNavigatorFilter() {
-        Dialog dialog = new ListSelectionDialog(getShell(), null,
-                new SimpleListContentProvider(), new LabelProvider(),
-                FILTER_SELECTION_MESSAGE);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testNewFileType() {
-        Dialog dialog = new FileExtensionDialog(getShell());
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testProgressInformation() {
-        ProgressMonitorDialog dialog = new ProgressMonitorDialog(getShell());
-        dialog.setBlockOnOpen(true);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testSaveAs() {
-        Dialog dialog = new SaveAsDialog(getShell());
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testSavePerspective() {
-        PerspectiveRegistry reg = (PerspectiveRegistry) WorkbenchPlugin
-                .getDefault().getPerspectiveRegistry();
-        // Get persp name.
-        SavePerspectiveDialog dialog = new SavePerspectiveDialog(getShell(),
-                reg);
-        IPerspectiveDescriptor description = reg
-                .findPerspectiveWithId(getWorkbench()
-                        .getActiveWorkbenchWindow().getActivePage()
-                        .getPerspective().getId());
-        dialog.setInitialSelection(description);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testSelectPerspective() {
-        Dialog dialog = new SelectPerspectiveDialog(getShell(), PlatformUI
-                .getWorkbench().getPerspectiveRegistry());
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testSelectTypes() {
-        Dialog dialog = new TypeFilteringDialog(getShell(), null);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testShowView() {
-        Dialog dialog = new ShowViewDialog(getWorkbench().getActiveWorkbenchWindow(), WorkbenchPlugin
-                .getDefault().getViewRegistry());
-        DialogCheck.assertDialog(dialog, this);
-    }
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public
-     * packages. public void testTaskFilters() { Dialog dialog =
-     * TaskListTestStub.newFiltersDialog( getShell() );
-     * DialogCheck.assertDialog(dialog, this); }
-     */
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIDialogsAuto.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIDialogsAuto.java
deleted file mode 100644
index efe52ad..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIDialogsAuto.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ContainerSelectionDialog;
-import org.eclipse.ui.dialogs.EditorSelectionDialog;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-import org.eclipse.ui.dialogs.ProjectLocationSelectionDialog;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.dialogs.TypeFilteringDialog;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.dialogs.AboutDialog;
-import org.eclipse.ui.internal.dialogs.FileExtensionDialog;
-import org.eclipse.ui.internal.dialogs.SavePerspectiveDialog;
-import org.eclipse.ui.internal.dialogs.SelectPerspectiveDialog;
-import org.eclipse.ui.internal.dialogs.ShowViewDialog;
-import org.eclipse.ui.internal.ide.dialogs.SimpleListContentProvider;
-import org.eclipse.ui.internal.registry.PerspectiveRegistry;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-public class UIDialogsAuto extends TestCase {
-    private static final String PROJECT_SELECTION_MESSAGE ="Select Other Projects";
-
-    private static final String FILTER_SELECTION_MESSAGE = ResourceNavigatorMessages.FilterSelection_message;
-
-    public UIDialogsAuto(String name) {
-        super(name);
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    private IWorkbench getWorkbench() {
-        return PlatformUI.getWorkbench();
-    }
-
-    public void testAbout() {
-        Dialog dialog = null;
-        dialog = new AboutDialog(getShell());
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testAddProjects() {
-        Dialog dialog = new ListSelectionDialog(getShell(), null,
-                new SimpleListContentProvider(), new LabelProvider(),
-                PROJECT_SELECTION_MESSAGE);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testCopyMoveProject() {
-        IProject dummyProject = ResourcesPlugin.getWorkspace().getRoot()
-                .getProject("DummyProject");
-        Dialog dialog = new ProjectLocationSelectionDialog(getShell(),
-                dummyProject);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testCopyMoveResource() {
-        Dialog dialog = new ContainerSelectionDialog(getShell(), null, true,
-                "Copy Resources");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testEditActionSetsDialog() {
-        // @issue need to uncomment this once customize persp dialog fixed up
-        /*
-         * Dialog dialog; Perspective persp = null; //Test perspective: use
-         * current perspective of test case try {//fixme: should try to get
-         * current perspective, or default; currently only //gets first
-         * perspective in the registry. persp = new
-         * Perspective((PerspectiveDescriptor)getWorkbench().getPerspectiveRegistry().getPerspectives()[0],
-         * (WorkbenchPage)getWorkbench().getActiveWorkbenchWindow().getActivePage() );
-         * dialog = new CustomizePerspectiveDialog(getShell(), persp); } catch
-         * (WorkbenchException e) { dialog = null; }
-         * DialogCheck.assertDialogTexts(dialog, this); if (persp != null) {
-         * persp.dispose(); }
-         */
-    }
-
-    public void testEditorSelection() {
-        Dialog dialog = new EditorSelectionDialog(getShell());
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public
-     * packages. public void testFindReplace() { Dialog dialog =
-     * TextEditorTestStub.newFindReplaceDialog( getShell() );
-     * DialogCheck.assertDialogTexts(dialog, this); } public void
-     * testGotoResource() { Dialog dialog =
-     * NavigatorTestStub.newGotoResourceDialog(getShell(), new IResource[0]);
-     * DialogCheck.assertDialogTexts(dialog, this); }
-     */
-    public void testNavigatorFilter() {
-        Dialog dialog = new ListSelectionDialog(getShell(), null,
-                new SimpleListContentProvider(), new LabelProvider(),
-                FILTER_SELECTION_MESSAGE);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testNewFileType() {
-        Dialog dialog = new FileExtensionDialog(getShell());
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testProgressInformation() {
-        ProgressMonitorDialog dialog = new ProgressMonitorDialog(getShell());
-        dialog.setBlockOnOpen(true);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testSaveAs() {
-        Dialog dialog = new SaveAsDialog(getShell());
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testSavePerspective() {
-        PerspectiveRegistry reg = (PerspectiveRegistry) WorkbenchPlugin
-                .getDefault().getPerspectiveRegistry();
-        // Get persp name.
-        SavePerspectiveDialog dialog = new SavePerspectiveDialog(getShell(),
-                reg);
-        IPerspectiveDescriptor description = reg
-                .findPerspectiveWithId(getWorkbench()
-                        .getActiveWorkbenchWindow().getActivePage()
-                        .getPerspective().getId());
-        dialog.setInitialSelection(description);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testSelectPerspective() {
-        Dialog dialog = new SelectPerspectiveDialog(getShell(), PlatformUI
-                .getWorkbench().getPerspectiveRegistry());
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testSelectTypes() {
-        Dialog dialog = new TypeFilteringDialog(getShell(), null);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testShowView() {
-        Dialog dialog = new ShowViewDialog(getWorkbench().getActiveWorkbenchWindow(), WorkbenchPlugin
-                .getDefault().getViewRegistry());
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public
-     * packages. public void testTaskFilters() { Dialog dialog =
-     * TaskListTestStub.newFiltersDialog( getShell() );
-     * DialogCheck.assertDialogTexts(dialog, this); }
-     */
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIEditWorkingSetWizardAuto.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIEditWorkingSetWizardAuto.java
deleted file mode 100644
index 9dc72ff..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIEditWorkingSetWizardAuto.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.dialogs.IWorkingSetPage;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.dialogs.WorkingSetEditWizard;
-import org.eclipse.ui.internal.registry.WorkingSetRegistry;
-import org.eclipse.ui.tests.harness.util.ArrayUtil;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-/**
- * Tests the WorkingSetEditWizard
- * Tests input validation, presence of correct edit page and 
- * wizard page texts.
- */
-public class UIEditWorkingSetWizardAuto extends UIWorkingSetWizardsAuto {
-    IWorkingSetPage fDefaultEditPage;
-
-    public UIEditWorkingSetWizardAuto(String name) {
-        super(name);
-    }
-
-    protected void doSetUp() throws Exception {
-        WorkingSetRegistry registry = WorkbenchPlugin.getDefault()
-                .getWorkingSetRegistry();
-        fDefaultEditPage = registry.getDefaultWorkingSetPage();
-        fWizard = new WorkingSetEditWizard(fDefaultEditPage);
-        super.doSetUp();
-    }
-
-    public void testEditPage() throws Throwable {
-        IWizardPage page = fWizardDialog.getCurrentPage();
-        assertTrue(page instanceof IWorkingSetPage);
-
-        /*
-         * Verify that correct working set edit page is displayed
-         */
-        assertTrue(page.getClass() == fDefaultEditPage.getClass());
-        /*
-         * Test initial page state
-         */
-        assertTrue(page.canFlipToNextPage() == false);
-        assertTrue(fWizard.canFinish() == false);
-        assertNull(page.getErrorMessage());
-        /*
-         * Test page state with preset page input
-         */
-        IWorkingSetManager workingSetManager = fWorkbench
-                .getWorkingSetManager();
-        IWorkingSet workingSet = workingSetManager.createWorkingSet(
-                WORKING_SET_NAME_1, new IAdaptable[] { p1, f2 });
-        ((WorkingSetEditWizard) fWizard).setSelection(workingSet);
-
-        List widgets = getWidgets((Composite) page.getControl(), Text.class);
-        Text text = (Text) widgets.get(0);
-        assertEquals(WORKING_SET_NAME_1, text.getText());
-        assertTrue(page.canFlipToNextPage() == false);
-        assertTrue(fWizard.canFinish() == false);
-        assertNull(page.getErrorMessage());
-        widgets = getWidgets((Composite) page.getControl(), Tree.class);
-        Tree tree = (Tree) widgets.get(0);
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        assertEquals(workspace.getRoot().getProjects().length, tree
-                .getItemCount());
-        setTextWidgetText(WORKING_SET_NAME_2, page);
-        assertTrue(fWizard.canFinish());
-
-        /*
-         * Test page state with partial page input
-         */
-        setTextWidgetText("", page);
-        assertTrue(page.canFlipToNextPage() == false);
-        assertTrue(fWizard.canFinish() == false);
-        assertNotNull(page.getErrorMessage());
-
-        /*
-         * Test page state with complete page input
-         */
-        setTextWidgetText(WORKING_SET_NAME_2, page);
-        checkTreeItems();
-        assertTrue(page.canFlipToNextPage() == false);
-        assertTrue(fWizard.canFinish());
-        assertNull(page.getErrorMessage());
-
-        fWizard.performFinish();
-        workingSet = ((WorkingSetEditWizard) fWizard).getSelection();
-        IAdaptable[] workingSetItems = workingSet.getElements();
-        assertEquals(WORKING_SET_NAME_2, workingSet.getName());
-        assertTrue(ArrayUtil.contains(workingSetItems, p1));
-        assertTrue(ArrayUtil.contains(workingSetItems, p2));
-
-        DialogCheck.assertDialogTexts(fWizardDialog, this);
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIErrorDialogs.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIErrorDialogs.java
deleted file mode 100644
index 5e3eee8..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIErrorDialogs.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-public class UIErrorDialogs extends TestCase {
-
-    public UIErrorDialogs(String name) {
-        super(name);
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    /*
-     * Get an example ErrorDialog with a status and a couple of 
-     * child statuses.
-     */
-    private ErrorDialog getMultiStatusErrorDialog() {
-
-        IStatus[] childStatuses = new IStatus[2];
-        childStatuses[0] = new Status(IStatus.ERROR, "org.eclipse.ui.tests",
-                IStatus.ERROR, "Error message 1", new Throwable());
-        childStatuses[1] = new Status(IStatus.ERROR, "org.eclipse.ui.tests",
-                IStatus.ERROR, "Error message 2", new Throwable());
-        MultiStatus mainStatus = new MultiStatus("org.eclipse.ui.tests",
-                IStatus.ERROR, childStatuses, "Main error", new Throwable());
-
-        return new ErrorDialog(getShell(), "Error Test", "Error message",
-                mainStatus, IStatus.ERROR);
-    }
-
-    public void testErrorClipboard() {
-        Dialog dialog = getMultiStatusErrorDialog();
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIFilteredResourcesSelectionDialog.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIFilteredResourcesSelectionDialog.java
deleted file mode 100644
index 698eba3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIFilteredResourcesSelectionDialog.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.dialogs;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-public class UIFilteredResourcesSelectionDialog extends
-		UIAbstractFilteredResourcesSelectionDialog {
-
-	/**
-	 * It is possible to verify dialog's appearance on sample data. To test
-	 * different table contents, change the pattern.
-	 */
-	public void testVerifyDialog() {
-		final IContainer input = ResourcesPlugin.getWorkspace().getRoot();
-		final FilteredResourcesSelectionDialog dialog = new FilteredResourcesSelectionDialog(
-				DialogCheck.getShell(), true, input, IResource.FILE);
-		dialog.setInitialPattern("**");
-		DialogCheck.assertDialog(dialog, this);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIFilteredResourcesSelectionDialogAuto.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIFilteredResourcesSelectionDialogAuto.java
deleted file mode 100644
index b2b8c67..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIFilteredResourcesSelectionDialogAuto.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.dialogs;
-
-import java.util.*;
-import org.eclipse.core.resources.*;
-import org.eclipse.swt.events.ShellAdapter;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog;
-
-public class UIFilteredResourcesSelectionDialogAuto extends
-		UIAbstractFilteredResourcesSelectionDialog {
-
-	/**
-	 * Checks if content provider displays expected resources from the history.
-	 * 
-	 * @throws Exception
-	 */
-	public void testReadHistory() throws Exception {
-
-		final MockedFilteredResourcesSelectionDialog dialog = createDialog();
-
-		dialog.open();
-
-		Object[] items = dialog.getHistoryItems();
-
-		assertEquals(historyResources.length, items.length);
-		Set itemsSet = new HashSet(historyResources.length);
-		itemsSet.addAll(Arrays.asList(items));
-		for (int i = 0; i < historyResources.length; i++) {
-			assertEquals(true, itemsSet.contains(historyResources[i]));
-		}
-
-		closeDialog(dialog);
-	}
-	
-	private static MockedFilteredResourcesSelectionDialog createDialog() {
-		final IWorkbenchWindow window = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		final Shell parent = window.getShell();
-		final IContainer input = ResourcesPlugin.getWorkspace().getRoot();
-		final MockedFilteredResourcesSelectionDialog dialog = new MockedFilteredResourcesSelectionDialog(
-				parent, true, input, IResource.FILE);
-
-		if (dialog.getShell() == null) {
-			dialog.create();
-		}
-		Point testDialogSize = dialog.getShell().getSize();
-		dialog.setBlockOnOpen(false);
-		dialog.getShell().setLocation(window.getShell().getSize().x + 1, 0);
-		dialog.getShell().setSize(testDialogSize);
-		dialog.getShell().addShellListener(new ShellAdapter() {
-			public void shellClosed(ShellEvent e) {
-				e.doit = false;
-			}
-		});
-		return dialog;
-	}
-
-	private static void closeDialog(
-			MockedFilteredResourcesSelectionDialog dialog) {
-		if (dialog.getShell() != null) {
-			dialog.getShell().dispose();
-			dialog.close();
-		}
-	}
-
-	private static class MockedFilteredResourcesSelectionDialog extends
-			FilteredResourcesSelectionDialog {
-
-		public MockedFilteredResourcesSelectionDialog(Shell shell,
-				boolean multi, IContainer container, int typesMask) {
-			super(shell, multi, container, typesMask);
-		}
-
-		// override protected modifiers ...
-
-		public Object[] getHistoryItems() {
-			return getSelectionHistory().getHistoryItems();
-		}
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIInteractiveSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIInteractiveSuite.java
deleted file mode 100644
index 79a7d74..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIInteractiveSuite.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.ui.tests.compare.UIComparePreferences;
-
-/**
- * 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(new TestSuite(UIPreferences.class));
-		addTest(new TestSuite(UIComparePreferences.class));
-		addTest(new TestSuite(DeprecatedUIPreferences.class));
-		addTest(new TestSuite(UIWizards.class));
-		addTest(new TestSuite(DeprecatedUIWizards.class));
-		addTest(new TestSuite(UIDialogs.class));
-		addTest(new TestSuite(DeprecatedUIDialogs.class));
-		addTest(new TestSuite(UIMessageDialogs.class));
-		addTest(new TestSuite(UIErrorDialogs.class));
-		addTest(new TestSuite(UIFilteredResourcesSelectionDialog.class));
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIMessageDialogs.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIMessageDialogs.java
deleted file mode 100644
index 604bafb..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIMessageDialogs.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import java.text.MessageFormat;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.internal.WorkbenchMessages;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-public class UIMessageDialogs extends TestCase {
-    private static final String DUMMY_RESOURCE = "Dummy.resource";
-
-    private static final String DUMMY_PROJECT = "DummyProject";
-
-    private static final String DUMMY_ABSOLUTE_PATH = "C:\\Dummypath\\Dummy.resource";
-
-    private static final String DUMMY_RELATIVE_PATH = "\\" + DUMMY_PROJECT
-            + "\\" + DUMMY_RESOURCE;
-
-    public UIMessageDialogs(String name) {
-        super(name);
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    /*
-     * Convenience method simliar to org.eclipse.jface.dialogs.MessageDialog::openInformation.
-     * The method will return the dialog instead of opening.
-     * @param title the dialog's title, or <code>null</code> if none.
-     * @param message the message.
-     * @return MessageDialog the information dialog.
-     */
-    private MessageDialog getInformationDialog(String title, String message) {
-        return new MessageDialog(getShell(), title, null, message,
-                MessageDialog.INFORMATION,
-                new String[] { IDialogConstants.OK_LABEL }, 0);
-    }
-
-    /*
-     * Convenience method simliar to org.eclipse.jface.dialogs.MessageDialog::openQuestion.
-     * The method will return the dialog instead of opening.
-     * @param title the dialog's title, or <code>null</code> if none.
-     * @param message the message.
-     * @return MessageDialog the question dialog.
-     */
-    private MessageDialog getQuestionDialog(String title, String message) {
-        return new MessageDialog(getShell(), title, null, message,
-                MessageDialog.QUESTION,
-                new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.NO_LABEL }, 0);
-    }
-
-    /*
-     * Convenience method simliar to org.eclipse.jface.dialogs.MessageDialog::getWarningDialog.
-     * The method will return the dialog instead of opening.
-     * @param title the dialog's title, or <code>null</code> if none.
-     * @param message the message.
-     * @return MessageDialog the confirm dialog.
-     */
-    private MessageDialog getWarningDialog(String title, String message) {
-        return new MessageDialog(getShell(), title, null, message,
-                MessageDialog.WARNING,
-                new String[] { IDialogConstants.OK_LABEL }, 0);
-    }
-
-    public void testAbortPageFlipping() {
-        Dialog dialog = getWarningDialog(JFaceResources
-                .getString("AbortPageFlippingDialog.title"), JFaceResources
-                .getString("AbortPageFlippingDialog.message"));
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-  
-    public void testCopyOverwrite() {
-        Dialog dialog = getQuestionDialog("Exists","Overwrite?");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testDeleteProject() {
-        String title ="Delete Project";
-        String msg = NLS.bind("Delete", (new Object[] {
-		DUMMY_PROJECT, DUMMY_ABSOLUTE_PATH }));
-        Dialog dialog = new MessageDialog(getShell(), title, null, // accept the default window icon
-                msg, MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testDeleteReadOnlyCheck() {
-        Dialog dialog = new MessageDialog(getShell(),"Delete?", null,
-               "This?",
-                MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.YES_LABEL,
-                        IDialogConstants.YES_TO_ALL_LABEL,
-                        IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testDeleteResource() {
-        Dialog dialog = getQuestionDialog("Delete","Delete?");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testDeleteResources() {
-        Dialog dialog = getQuestionDialog("Delete","OK?");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testDropOverwrite() {
-        Dialog dialog = new MessageDialog(
-                getShell(),
-                ResourceNavigatorMessages.DropAdapter_question,
-                null, MessageFormat.format(ResourceNavigatorMessages.DropAdapter_overwriteQuery, 
-                        new Object[] { DUMMY_RELATIVE_PATH }),
-                MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.YES_LABEL,
-                        IDialogConstants.YES_TO_ALL_LABEL,
-                        IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testErrorClosing() {
-        Dialog dialog = getQuestionDialog(WorkbenchMessages.Error,
-                WorkbenchMessages.ErrorClosingNoArg);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testFileExtensionEmpty() {
-        Dialog dialog = getInformationDialog("","");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testFileNameWrong() {
-        Dialog dialog = getInformationDialog(
-                "Invalid",
-               "Invalid file");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testFileTypeExists() {
-        Dialog dialog = getInformationDialog("Exists",
-                "Already Exists");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testInvalidType_1() {
-        Dialog dialog = getWarningDialog("Invalid?", "Is this invalid?");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testInvalidType_2() {
-        Dialog dialog = getWarningDialog("Invalid",  "Is this invalid?");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testMoveReadOnlyCheck() {
-        Dialog dialog = new MessageDialog(getShell(), "Move", null, "OK to move",
-                MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.YES_LABEL,
-                        IDialogConstants.YES_TO_ALL_LABEL,
-                        IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    /*
-     public void testNoBuilders() {
-     Dialog dialog = getWarningDialog(
-     WorkbenchMessages.getString("BuildAction.warning"),
-     WorkbenchMessages.getString("BuildAction.noBuilders") );
-     DialogCheck.assertDialog(dialog, this);
-     }
-     */
-    /*
-     public void testNoGlobalBuildersDialog() {
-     Dialog dialog = getWarningDialog(
-     WorkbenchMessages.getString("GlobalBuildAction.warning"),
-     WorkbenchMessages.getString("GlobalBuildAction.noBuilders") );
-     DialogCheck.assertDialog(dialog, this);
-     }
-     */
-    public void testNoPropertyPage() {
-        Dialog dialog = getInformationDialog(WorkbenchMessages.PropertyDialog_messageTitle, NLS.bind(WorkbenchMessages.PropertyDialog_noPropertyMessage, (new Object[] { "DummyPropertyPage" })));
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testOperationNotAvailable() {
-        Dialog dialog = getInformationDialog(WorkbenchMessages.Information, "Not available");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testOverwritePerspective() {
-        Dialog dialog = new MessageDialog(getShell(), WorkbenchMessages.SavePerspective_overwriteTitle, null,
-                NLS.bind(WorkbenchMessages.SavePerspective_overwriteQuestion, (new Object[] { "Dummy Perspective" })),
-                MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testRefreshDeleteProject() {
-        Dialog dialog = new MessageDialog(getShell(), "Refresh", null,
-                NLS.bind("deleted location", (new Object[] {
-				DUMMY_PROJECT,
-				"c:\\dummypath\\" + DUMMY_PROJECT })),
-                MessageDialog.QUESTION,
-                new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.NO_LABEL }, 0);
-        DialogCheck.assertDialogTexts(dialog, this);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testRenameOverwrite() {
-        Dialog dialog = getQuestionDialog("Exists","Overwrite");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testResetPerspective() {
-        Dialog dialog = new MessageDialog(getShell(), WorkbenchMessages.ResetPerspective_title, null, NLS.bind(WorkbenchMessages.ResetPerspective_message, (new Object[] { "Dummy Perspective" })),
-                MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.OK_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testSaveAsOverwrite() {
-        Dialog dialog = new MessageDialog(getShell(), "OK?", null, "Overwrite?", MessageDialog.QUESTION,
-                new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testSaveChanges() {
-        Dialog dialog = new MessageDialog(getShell(), WorkbenchMessages.Save_Resource, null, NLS.bind(WorkbenchMessages.EditorManager_saveChangesQuestion, (new Object[] { DUMMY_RESOURCE })), MessageDialog.QUESTION,
-                new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testWizardClosing() {
-        Dialog dialog = new MessageDialog(getShell(), JFaceResources
-                .getString("WizardClosingDialog.title"), null, JFaceResources
-                .getString("WizardClosingDialog.message"),
-                MessageDialog.QUESTION,
-                new String[] { IDialogConstants.OK_LABEL }, 0);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testWizardOverwrite() {
-        Dialog dialog = new MessageDialog(getShell(), "OK?", null, "Exists", MessageDialog.QUESTION,
-                new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.YES_TO_ALL_LABEL,
-                        IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialog(dialog, this);
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIMessageDialogsAuto.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIMessageDialogsAuto.java
deleted file mode 100644
index 284116f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIMessageDialogsAuto.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import java.text.MessageFormat;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.internal.WorkbenchMessages;
-import org.eclipse.ui.internal.views.navigator.ResourceNavigatorMessages;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-public class UIMessageDialogsAuto extends TestCase {
-    private static final String DUMMY_RESOURCE = "Dummy.resource";
-
-    private static final String DUMMY_PROJECT = "DummyProject";
-
-    private static final String DUMMY_RELATIVE_PATH = "\\" + DUMMY_PROJECT
-            + "\\" + DUMMY_RESOURCE;
-
-    public UIMessageDialogsAuto(String name) {
-        super(name);
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-  
-    /*
-     * Convenience method simliar to org.eclipse.jface.dialogs.MessageDialog::openInformation.
-     * The method will return the dialog instead of opening.
-     * @param title the dialog's title, or <code>null</code> if none.
-     * @param message the message.
-     * @return MessageDialog the information dialog.
-     */
-    private MessageDialog getInformationDialog(String title, String message) {
-        return new MessageDialog(getShell(), title, null, message,
-                MessageDialog.INFORMATION,
-                new String[] { IDialogConstants.OK_LABEL }, 0);
-    }
-
-    /*
-     * Convenience method simliar to org.eclipse.jface.dialogs.MessageDialog::openQuestion.
-     * The method will return the dialog instead of opening.
-     * @param title the dialog's title, or <code>null</code> if none.
-     * @param message the message.
-     * @return MessageDialog the question dialog.
-     */
-    private MessageDialog getQuestionDialog(String title, String message) {
-        return new MessageDialog(getShell(), title, null, message,
-                MessageDialog.QUESTION,
-                new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.NO_LABEL }, 0);
-    }
-
-    /*
-     * Convenience method simliar to org.eclipse.jface.dialogs.MessageDialog::getWarningDialog.
-     * The method will return the dialog instead of opening.
-     * @param title the dialog's title, or <code>null</code> if none.
-     * @param message the message.
-     * @return MessageDialog the confirm dialog.
-     */
-    private MessageDialog getWarningDialog(String title, String message) {
-        return new MessageDialog(getShell(), title, null, message,
-                MessageDialog.WARNING,
-                new String[] { IDialogConstants.OK_LABEL }, 0);
-    }
-
-    public void testAbortPageFlipping() {
-        Dialog dialog = getWarningDialog(JFaceResources
-                .getString("AbortPageFlippingDialog.title"), JFaceResources
-                .getString("AbortPageFlippingDialog.message"));
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testCopyOverwrite() {
-        Dialog dialog = getQuestionDialog("Exists","");
-         DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testDeleteProject() {
-        String title = "Project";
-        String msg ="";
-        Dialog dialog = new MessageDialog(getShell(), title, null, // accept the default window icon
-                msg, MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testDeleteReadOnlyCheck() {
-        Dialog dialog = new MessageDialog(getShell(), "Delete", null,
-              "Exists",
-                MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.YES_LABEL,
-                        IDialogConstants.YES_TO_ALL_LABEL,
-                        IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testDeleteResource() {
-        Dialog dialog = getQuestionDialog("Delete","");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testDeleteResources() {
-		  Dialog dialog = getQuestionDialog("Delete","");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testDropOverwrite() {
-        Dialog dialog = new MessageDialog(
-                getShell(),
-                ResourceNavigatorMessages.DropAdapter_question,
-                null, MessageFormat.format(ResourceNavigatorMessages.DropAdapter_overwriteQuery,
-                        new Object[] { DUMMY_RELATIVE_PATH }),
-                MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.YES_LABEL,
-                        IDialogConstants.YES_TO_ALL_LABEL,
-                        IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testErrorClosing() {
-        Dialog dialog = getQuestionDialog(WorkbenchMessages.Error,
-                WorkbenchMessages.ErrorClosingNoArg);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-    public void testFileExtensionEmpty() {
-        Dialog dialog = getInformationDialog(
-                "Empty",
-                "ExtensionEmptyMessage");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testFileNameWrong() {
-        Dialog dialog = getInformationDialog(
-                "InvalidTitle",
-               "InvalidMessage");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testFileTypeExists() {
-        Dialog dialog = getInformationDialog(WorkbenchMessages.FileEditorPreference_existsTitle,
-                WorkbenchMessages.FileEditorPreference_existsMessage);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testInvalidType_1() {
-        Dialog dialog = getWarningDialog("invalidTitle","invalidMessage");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testInvalidType_2() {
-        Dialog dialog = getWarningDialog("invalidType", "invalidTypeMessage");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testMoveReadOnlyCheck() {
-        Dialog dialog = new MessageDialog(getShell(), "Move_title", null, ".MoveResourceAction",
-                MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.YES_LABEL,
-                        IDialogConstants.YES_TO_ALL_LABEL,
-                        IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testNoBuilders() {
-        Dialog dialog = getWarningDialog("BuildAction_warning", "noBuilders");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testNoGlobalBuildersDialog() {
-        Dialog dialog = getWarningDialog("GlobalBuildAction_warning","GlobalBuildAction_noBuilders");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testNoPropertyPage() {
-        Dialog dialog = getInformationDialog(WorkbenchMessages.PropertyDialog_messageTitle, NLS.bind(WorkbenchMessages.PropertyDialog_noPropertyMessage, (new Object[] { "DummyPropertyPage" })));
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-
-    public void testOperationNotAvailable() {
-        Dialog dialog = getInformationDialog(WorkbenchMessages.Information, "operationNotAvailableMessage");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testOverwritePerspective() {
-        Dialog dialog = new MessageDialog(getShell(), WorkbenchMessages.SavePerspective_overwriteTitle, null,
-                NLS.bind(WorkbenchMessages.SavePerspective_overwriteQuestion, (new Object[] { "Dummy Perspective" })),
-                MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testRefreshDeleteProject() {
-        Dialog dialog = new MessageDialog(getShell(), "RefreshAction_dialogTitle", null,
-               "c:\\dummypath\\" + DUMMY_PROJECT,
-                MessageDialog.QUESTION,
-                new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.NO_LABEL }, 0);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testRenameOverwrite() {
-        Dialog dialog = getQuestionDialog(".RenameResourceAction_resourceExist",DUMMY_RELATIVE_PATH);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testResetPerspective() {
-        Dialog dialog = new MessageDialog(getShell(), WorkbenchMessages.ResetPerspective_title, null, NLS.bind(WorkbenchMessages.ResetPerspective_message, (new Object[] { "Dummy Perspective" })),
-                MessageDialog.QUESTION, new String[] {
-                        IDialogConstants.OK_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testSaveAsOverwrite() {
-        Dialog dialog = new MessageDialog(getShell(), "WorkbenchMessages.Question", null,DUMMY_RELATIVE_PATH, MessageDialog.QUESTION,
-                new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testSaveChanges() {
-        Dialog dialog = new MessageDialog(getShell(), WorkbenchMessages.Save_Resource, null, NLS.bind(WorkbenchMessages.EditorManager_saveChangesQuestion, (new Object[] { DUMMY_RESOURCE })), MessageDialog.QUESTION,
-                new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-
-
-    public void testWizardClosing() {
-        Dialog dialog = new MessageDialog(getShell(), JFaceResources
-                .getString("WizardClosingDialog_title"), null, JFaceResources
-                .getString("WizardClosingDialog_message"),
-                MessageDialog.QUESTION,
-                new String[] { IDialogConstants.OK_LABEL }, 0);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testWizardOverwrite() {
-        Dialog dialog = new MessageDialog(getShell(), "WorkbenchMessages.Question", null, "WizardDataTransfer_existsQuestion", MessageDialog.QUESTION,
-                new String[] { IDialogConstants.YES_LABEL,
-                        IDialogConstants.YES_TO_ALL_LABEL,
-                        IDialogConstants.NO_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 0);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UINewWorkingSetWizardAuto.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UINewWorkingSetWizardAuto.java
deleted file mode 100644
index e209a2e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UINewWorkingSetWizardAuto.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.dialogs.IWorkingSetPage;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.dialogs.WorkingSetNewWizard;
-import org.eclipse.ui.internal.dialogs.WorkingSetTypePage;
-import org.eclipse.ui.internal.registry.WorkingSetDescriptor;
-import org.eclipse.ui.internal.registry.WorkingSetRegistry;
-import org.eclipse.ui.tests.harness.util.ArrayUtil;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-/**
- * Tests the WorkingSetNewWizard.
- * Tests input validation, presence of type page and correct edit page
- * and wizard page texts.
- */
-public class UINewWorkingSetWizardAuto extends UIWorkingSetWizardsAuto {
-
-    public UINewWorkingSetWizardAuto(String name) {
-        super(name);
-    }
-
-    protected void doSetUp() throws Exception {
-        fWizard = getWorkbench().getWorkingSetManager().createWorkingSetNewWizard(null);
-        super.doSetUp();
-    }
-
-    public void testTypePage() throws Throwable {
-        IWizardPage page = fWizardDialog.getCurrentPage();
-        WorkingSetDescriptor[] descriptors = getEditableWorkingSetDescriptors();
-        
-        // the first page must be the type selection page iff there is more than one working set type
-        assertEquals(descriptors.length > 1, (page instanceof WorkingSetTypePage));
-
-        /*
-         * Should have at least resourceWorkingSetPage and MockWorkingSet
-         */
-        assertTrue(descriptors.length >= 2);
-        if (page instanceof WorkingSetTypePage) {
-            WorkingSetTypePage typePage = (WorkingSetTypePage) page;
-            List widgets = getWidgets((Composite) page.getControl(),
-                    Table.class);
-            Table table = (Table) widgets.get(0);
-            /*
-             * Test initial page state
-             */
-            assertEquals(descriptors.length, table.getItemCount());
-            assertTrue(typePage.canFlipToNextPage() == false);
-            assertTrue(fWizard.canFinish() == false);
-            /*
-             * Test page state with page complete input
-             */
-            table.setSelection(descriptors.length - 1);
-            table.notifyListeners(SWT.Selection, new Event());
-            assertTrue(typePage.canFlipToNextPage());
-            assertTrue(fWizard.canFinish() == false);
-
-            /*
-             * Check page texts 
-             */
-            DialogCheck.assertDialogTexts(fWizardDialog, this);
-        }
-    }
-
-    public void testEditPage() throws Throwable {
-        WorkingSetRegistry registry = WorkbenchPlugin.getDefault()
-                .getWorkingSetRegistry();
-        IWizardPage page = fWizardDialog.getCurrentPage();
-        IWizardPage defaultEditPage = registry.getDefaultWorkingSetPage();
-        String defaultEditPageClassName = defaultEditPage.getClass().getName();
-        WorkingSetDescriptor[] descriptors = getEditableWorkingSetDescriptors();
-        
-        // the first page must be the type selection page iff there is more than one working set type
-        assertEquals(descriptors.length > 1, (page instanceof WorkingSetTypePage));
-
-        if (page instanceof WorkingSetTypePage) {
-            /*
-             * Select the default (Resource) working set type
-             * and advance to edit page.
-             */
-            List widgets = getWidgets((Composite) page.getControl(),
-                    Table.class);
-            Table table = (Table) widgets.get(0);
-            TableItem[] items = table.getItems();
-            String workingSetName = null;
-            for (int descriptorIndex = 0; descriptorIndex < descriptors.length; descriptorIndex++) {
-                WorkingSetDescriptor descriptor = descriptors[descriptorIndex];
-                if (defaultEditPageClassName.equals(descriptor
-                        .getPageClassName())) {
-                    workingSetName = descriptor.getName();
-                    break;
-                }
-            }
-            assertNotNull(workingSetName);
-            boolean found = false;
-            for (int i = 0; i < items.length; i++) {
-                if (items[i].getText().equals(workingSetName)) {
-                    table.setSelection(i);
-                    found = true;
-                    break;
-                }
-            }
-            assertTrue(found);
-            fWizardDialog.showPage(fWizard.getNextPage(page));
-        }
-        page = fWizardDialog.getCurrentPage();
-        assertTrue(page instanceof IWorkingSetPage);
-
-        /*
-         * Verify that correct working set edit page is displayed
-         */
-        assertTrue(page.getClass() == defaultEditPage.getClass());
-        /*
-         * Test initial page state
-         */
-        assertFalse(page.canFlipToNextPage());
-        assertFalse(fWizard.canFinish());
-        assertNull(page.getErrorMessage());
-        assertNull(page.getMessage());
-        
-        /*
-         * Test page state with partial page input
-         */
-        setTextWidgetText(WORKING_SET_NAME_1, page);
-        assertFalse(page.canFlipToNextPage());
-        assertTrue(fWizard.canFinish());  // allow for empty sets
-        assertNull(page.getErrorMessage());
-        assertNotNull(page.getMessage());
-
-        /*
-         * Test page state with page complete input
-         */
-        checkTreeItems();
-        assertFalse(page.canFlipToNextPage());
-        assertTrue(fWizard.canFinish());
-        assertNull(page.getErrorMessage());
-        assertNull(page.getMessage());
-
-        fWizard.performFinish();
-        IWorkingSet workingSet = ((WorkingSetNewWizard) fWizard).getSelection();
-        IAdaptable[] workingSetItems = workingSet.getElements();
-        assertEquals(WORKING_SET_NAME_1, workingSet.getName());
-
-        List widgets = getWidgets((Composite) page.getControl(), Tree.class);
-        Tree tree = (Tree) widgets.get(0);
-        assertEquals(workingSetItems.length, tree.getItemCount());
-        assertTrue(ArrayUtil.contains(workingSetItems, p1));
-        assertTrue(ArrayUtil.contains(workingSetItems, p2));
-
-        /*
-         * Check page texts 
-         */
-        DialogCheck.assertDialogTexts(fWizardDialog, this);
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIPreferences.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIPreferences.java
deleted file mode 100644
index 22ff614..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIPreferences.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import java.util.Iterator;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-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.StructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-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.ui.tests.harness.util.DialogCheck;
-
-public class UIPreferences extends TestCase {
-    private IProject _project;
-
-    private static final String PROJECT_NAME = "DummyProject";
-
-    public UIPreferences(String name) {
-        super(name);
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    private IProject getDummyProject() {
-        try {
-            IProject projects[] = ResourcesPlugin.getWorkspace().getRoot()
-                    .getProjects();
-            for (int i = 0; i < projects.length; i++) {
-                if (projects[i].getName().equals(PROJECT_NAME)) {
-                    projects[i].delete(true, null);
-                    break;
-                }
-            }
-            _project = ResourcesPlugin.getWorkspace().getRoot().getProject(
-                    PROJECT_NAME);
-            _project.create(null);
-        } catch (CoreException e) {
-            System.out.println(e);
-        }
-        return _project;
-    }
-
-    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(),
-                    IWorkbenchHelpContextIds.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) {
-        PropertyDialogWrapper dialog = null;
-
-        PropertyPageManager manager = new PropertyPageManager();
-        String title = "";
-        String name = "";
-
-        IProject element = getDummyProject();
-        if (element == null) {
-            return null;
-        }
-        // 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;
-        } 
-            title = NLS.bind(WorkbenchMessages.PropertyDialog_propertyMessage, (new Object[] { name }));
-            dialog = new PropertyDialogWrapper(getShell(), manager,
-                    new StructuredSelection(element));
-            dialog.create();
-            dialog.getShell().setText(title);
-            WorkbenchHelp.setHelp(dialog.getShell(),
-                    IWorkbenchHelpContextIds.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 testWorkbenchPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.Workbench");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testAppearancePref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.Views");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testDefaultTextEditorPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.TextEditor");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testFileEditorsPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.FileEditors");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testLocalHistoryPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.FileStates");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testPerspectivesPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.Perspectives");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testInfoProp() {
-        Dialog dialog = getPropertyDialog("org.eclipse.ui.propertypages.info.file");
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testProjectReferencesProp() {
-        Dialog dialog = getPropertyDialog("org.eclipse.ui.propertypages.project.reference");
-        DialogCheck.assertDialog(dialog, this);
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIPreferencesAuto.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIPreferencesAuto.java
deleted file mode 100644
index ad8abfd..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIPreferencesAuto.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import java.util.Iterator;
-
-import junit.framework.TestCase;
-
-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.swt.widgets.Shell;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-public class UIPreferencesAuto extends TestCase {
-
-    public UIPreferencesAuto(String name) {
-        super(name);
-    }
-
-    protected Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    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(),
-                    IWorkbenchHelpContextIds.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;
-    }
-
-
-    public void testWorkbenchPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.Workbench");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testAppearancePref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.Views");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testDefaultTextEditorPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.TextEditor");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testFileEditorsPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.FileEditors");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testLocalHistoryPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.FileStates");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testPerspectivesPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.preferencePages.Perspectives");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    //Only really checking if this opens without an exception
-    public void testFontEditorsPref() {
-        Dialog dialog = getPreferenceDialog("org.eclipse.ui.tests.dialogs.FontFieldEditorTestPreferencePage");
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testInfoProp() {
-        /*
-         * Commented out because it generates a failure
-         * of expect and actual width values. Suspect this
-         * is an SWT issue.
-         * 
-         Dialog dialog = getPropertyDialog("org.eclipse.ui.propertypages.info.file");
-         DialogCheck.assertDialogTexts(dialog, this);
-         */
-    }
-
-    public void testProjectReferencesProp() {
-        /*
-         * Commented out because it generates a failure
-         * of expect and actual width values. Suspect this
-         * is an SWT issue.
-         * 
-         Dialog dialog = getPropertyDialog("org.eclipse.ui.propertypages.project.reference");
-         DialogCheck.assertDialogTexts(dialog, this);
-         */
-    }
-
-    /**
-     * Test the editors preference page and toggle the
-     * enable state twice to be sure there are no errors.
-     */
-    public void testFieldEditorEnablePref() {
-
-        PreferenceDialogWrapper dialog = null;
-        PreferenceManager manager = WorkbenchPlugin.getDefault()
-                .getPreferenceManager();
-        if (manager != null) {
-            dialog = new PreferenceDialogWrapper(getShell(), manager);
-            dialog.create();
-
-            for (Iterator iterator = manager.getElements(
-                    PreferenceManager.PRE_ORDER).iterator(); iterator.hasNext();) {
-                IPreferenceNode node = (IPreferenceNode) iterator.next();
-                if (node
-                        .getId()
-                        .equals(
-                                "org.eclipse.ui.tests.dialogs.EnableTestPreferencePage")) {
-                    dialog.showPage(node);
-                    EnableTestPreferencePage page = (EnableTestPreferencePage) dialog
-                            .getPage(node);
-                    page.flipState();
-                    page.flipState();
-                    break;
-                }
-            }
-        }
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIWizards.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIWizards.java
deleted file mode 100644
index bde28a5..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIWizards.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.WizardNewProjectReferencePage;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.dialogs.ExportWizard;
-import org.eclipse.ui.internal.dialogs.ImportWizard;
-import org.eclipse.ui.internal.dialogs.NewWizard;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.wizards.newresource.ResourceMessages;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-import org.eclipse.ui.wizards.newresource.BasicNewFileResourceWizard;
-import org.eclipse.ui.wizards.newresource.BasicNewFolderResourceWizard;
-import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
-
-public class UIWizards extends TestCase {
-    private static final int SIZING_WIZARD_WIDTH = 470;
-
-    private static final int SIZING_WIZARD_HEIGHT = 550;
-
-    private static final int SIZING_WIZARD_WIDTH_2 = 500;
-
-    private static final int SIZING_WIZARD_HEIGHT_2 = 500;
-
-    public UIWizards(String name) {
-        super(name);
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    private IWorkbench getWorkbench() {
-        return PlatformUI.getWorkbench();
-    }
-
-    private WizardDialog exportWizard(IWizardPage page) {
-        ExportWizard wizard = new ExportWizard();
-        wizard.init(getWorkbench(), null);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("ExportResourcesAction");
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings
-                    .addNewSection("ExportResourcesAction");
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT);
-        WorkbenchHelp.setHelp(dialog.getShell(), IWorkbenchHelpContextIds.EXPORT_WIZARD);
-
-        if (page != null) {
-            page.setWizard(wizard);
-            dialog.showPage(page);
-        }
-        return dialog;
-    }
-
-    private WizardDialog importWizard(IWizardPage page) {
-        ImportWizard wizard = new ImportWizard();
-        wizard.init(getWorkbench(), null);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("ImportResourcesAction");
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings
-                    .addNewSection("ImportResourcesAction");
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT);
-        WorkbenchHelp.setHelp(dialog.getShell(), IWorkbenchHelpContextIds.IMPORT_WIZARD);
-
-        if (page != null) {
-            page.setWizard(wizard);
-            dialog.showPage(page);
-        }
-        return dialog;
-    }
-
-    public void testExportResources() {//reference: ExportResourcesAction
-        Dialog dialog = exportWizard(null);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public packages.
-     * 
-     public void testFileSystemExport() {
-     Dialog dialog = exportWizard( DataTransferTestStub.newFileSystemResourceExportPage1(null) );
-     DialogCheck.assertDialog(dialog, this);
-     }
-     public void testZipFileExport() {
-     Dialog dialog = exportWizard( DataTransferTestStub.newZipFileResourceExportPage1(null) );
-     DialogCheck.assertDialog(dialog, this);
-     }
-     */
-    public void testImportResources() {//reference: ImportResourcesAction
-        Dialog dialog = importWizard(null);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public packages.
-     * 
-     public void testFileSystemImport() {
-     Dialog dialog = importWizard( DataTransferTestStub.newFileSystemResourceImportPage1(WorkbenchPlugin.getDefault().getWorkbench(), StructuredSelection.EMPTY) );
-     DialogCheck.assertDialog(dialog, this);
-     }
-     public void testZipFileImport() {
-     Dialog dialog = importWizard( DataTransferTestStub.newZipFileResourceImportPage1(null) );
-     DialogCheck.assertDialog(dialog, this);
-     }
-     */
-    public void testNewFile() {
-        BasicNewFileResourceWizard wizard = new BasicNewFileResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), new StructuredSelection());
-        wizard.setNeedsProgressMonitor(true);
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setText("CreateFileAction_title"); 
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                IIDEHelpContextIds.NEW_FILE_WIZARD);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testNewFolder() {
-        BasicNewFolderResourceWizard wizard = new BasicNewFolderResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), new StructuredSelection());
-        wizard.setNeedsProgressMonitor(true);
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setText("CreateFolderAction_title"); 
-        WorkbenchHelp.setHelp(dialog.getShell(),
-        		IIDEHelpContextIds.NEW_FOLDER_WIZARD);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testNewProjectPage1() {
-        BasicNewProjectResourceWizard wizard = new BasicNewProjectResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), null);
-        wizard.setNeedsProgressMonitor(true);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        dialog.getShell().setText("CreateFileAction_title"); 
-        WorkbenchHelp.setHelp(dialog.getShell(),
-        		IIDEHelpContextIds.NEW_PROJECT_WIZARD);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testNewProjectPage2() {
-        BasicNewProjectResourceWizard wizard = new BasicNewProjectResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), null);
-        wizard.setNeedsProgressMonitor(true);
-
-        WizardNewProjectReferencePage page = new WizardNewProjectReferencePage(
-                "basicReferenceProjectPage");//$NON-NLS-1$
-        page.setTitle(ResourceMessages.NewProject_referenceTitle);
-        page.setDescription(ResourceMessages.NewProject_referenceDescription);
-        page.setWizard(wizard);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        dialog.getShell().setText("CreateFileAction_title"); 		
-        dialog.showPage(page);
-        WorkbenchHelp.setHelp(dialog.getShell(),
-        		IIDEHelpContextIds.NEW_PROJECT_WIZARD);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testNewProject() {
-        // Create wizard selection wizard.
-        NewWizard wizard = new NewWizard();
-        wizard.setProjectsOnly(true);
-        ISelection selection = getWorkbench().getActiveWorkbenchWindow()
-                .getSelectionService().getSelection();
-        IStructuredSelection selectionToPass = null;
-        if (selection instanceof IStructuredSelection)
-            selectionToPass = (IStructuredSelection) selection;
-        else
-            selectionToPass = StructuredSelection.EMPTY;
-        wizard.init(getWorkbench(), selectionToPass);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("NewWizardAction");//$NON-NLS-1$
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings.addNewSection("NewWizardAction");//$NON-NLS-1$
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-
-        // Create wizard dialog.
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        WorkbenchHelp.setHelp(dialog.getShell(),
-        		IIDEHelpContextIds.NEW_PROJECT_WIZARD);
-        DialogCheck.assertDialog(dialog, this);
-    }
-
-    public void testNewResource() {
-        NewWizard wizard = new NewWizard();
-        ISelection selection = getWorkbench().getActiveWorkbenchWindow()
-                .getSelectionService().getSelection();
-        IStructuredSelection selectionToPass = null;
-        if (selection instanceof IStructuredSelection)
-            selectionToPass = (IStructuredSelection) selection;
-        else
-            selectionToPass = StructuredSelection.EMPTY;
-        wizard.init(getWorkbench(), selectionToPass);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("NewWizardAction");//$NON-NLS-1$
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings.addNewSection("NewWizardAction");//$NON-NLS-1$
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        WorkbenchHelp.setHelp(dialog.getShell(), IWorkbenchHelpContextIds.NEW_WIZARD);
-        DialogCheck.assertDialog(dialog, this);
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIWizardsAuto.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIWizardsAuto.java
deleted file mode 100644
index 937489c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIWizardsAuto.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
-import org.eclipse.ui.dialogs.WizardNewProjectReferencePage;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.dialogs.ExportWizard;
-import org.eclipse.ui.internal.dialogs.ImportWizard;
-import org.eclipse.ui.internal.dialogs.NewWizard;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.wizards.newresource.ResourceMessages;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.wizards.newresource.BasicNewFileResourceWizard;
-import org.eclipse.ui.wizards.newresource.BasicNewFolderResourceWizard;
-import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
-
-public class UIWizardsAuto extends TestCase {
-    private static final int SIZING_WIZARD_WIDTH = 470;
-
-    private static final int SIZING_WIZARD_HEIGHT = 550;
-
-    private static final int SIZING_WIZARD_WIDTH_2 = 500;
-
-    private static final int SIZING_WIZARD_HEIGHT_2 = 500;
-
-    private IProject project;
-
-    public UIWizardsAuto(String name) {
-        super(name);
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    private IWorkbench getWorkbench() {
-        return PlatformUI.getWorkbench();
-    }
-
-    private WizardDialog exportWizard(IWizardPage page) {
-        ExportWizard wizard = new ExportWizard();
-        wizard.init(getWorkbench(), null);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("ExportResourcesAction");
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings
-                    .addNewSection("ExportResourcesAction");
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT);
-        WorkbenchHelp.setHelp(dialog.getShell(), IWorkbenchHelpContextIds.EXPORT_WIZARD);
-
-        if (page != null) {
-            page.setWizard(wizard);
-            dialog.showPage(page);
-        }
-        return dialog;
-    }
-
-    private WizardDialog importWizard(IWizardPage page) {
-        ImportWizard wizard = new ImportWizard();
-        wizard.init(getWorkbench(), null);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("ImportResourcesAction");
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings
-                    .addNewSection("ImportResourcesAction");
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT);
-        WorkbenchHelp.setHelp(dialog.getShell(), IWorkbenchHelpContextIds.IMPORT_WIZARD);
-
-        if (page != null) {
-            page.setWizard(wizard);
-            dialog.showPage(page);
-        }
-        return dialog;
-    }
-
-    /**
-     * @see junit.framework.TestCase#tearDown()
-     */
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        try {
-            if (project != null) {
-                project.delete(true, true, null);
-                project = null;
-            }
-        } catch (CoreException e) {
-            fail(e.toString());
-        }
-    }
-
-    public void testExportResources() {//reference: ExportResourcesAction
-        Dialog dialog = exportWizard(null);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public packages.
-     * 
-     public void testFileSystemExport() {
-     Dialog dialog = exportWizard( DataTransferTestStub.newFileSystemResourceExportPage1(null) );
-     DialogCheck.assertDialogTexts(dialog, this);
-     }
-     public void testZipFileExport() {
-     Dialog dialog = exportWizard( DataTransferTestStub.newZipFileResourceExportPage1(null) );
-     DialogCheck.assertDialogTexts(dialog, this);
-     }
-     */
-    public void testImportResources() {//reference: ImportResourcesAction
-        Dialog dialog = importWizard(null);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    /**
-     * 1GJWD2E: ITPUI:ALL - Test classes should not be released in public packages.
-     * 
-     public void testFileSystemImport() {
-     Dialog dialog = importWizard( DataTransferTestStub.newFileSystemResourceImportPage1(WorkbenchPlugin.getDefault().getWorkbench(), StructuredSelection.EMPTY) );
-     DialogCheck.assertDialogTexts(dialog, this);
-     }
-     public void testZipFileImport() {
-     Dialog dialog = importWizard( DataTransferTestStub.newZipFileResourceImportPage1(null) );
-     DialogCheck.assertDialogTexts(dialog, this);
-     }
-     */
-    public void testNewFile() {
-        BasicNewFileResourceWizard wizard = new BasicNewFileResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), new StructuredSelection());
-        wizard.setNeedsProgressMonitor(true);
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setText("CreateFileAction_title");
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                IIDEHelpContextIds.NEW_FILE_WIZARD);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    /**
-     * Test for bug 30719 [Linked Resources] NullPointerException when setting filename for WizardNewFileCreationPage 
-     */
-    public void testNewFile2() {
-        BasicNewFileResourceWizard wizard = new BasicNewFileResourceWizard() {
-            public void addPages() {
-                super.addPages();
-                IWizardPage page = getPage("newFilePage1");
-                assertTrue("Expected newFilePage1",
-                        page instanceof WizardNewFileCreationPage);
-                WizardNewFileCreationPage fileCreationPage = (WizardNewFileCreationPage) page;
-
-                try {
-                    project = FileUtil.createProject("testNewFile2");
-                } catch (CoreException e) {
-                    fail(e.getMessage());
-                }
-                fileCreationPage.setContainerFullPath(project.getFullPath());
-                fileCreationPage.setFileName("testFileName.test");
-            }
-        };
-
-        wizard.init(PlatformUI.getWorkbench(), new StructuredSelection());
-        wizard.setNeedsProgressMonitor(true);
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setText("CreateFileAction_title"); 
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                IIDEHelpContextIds.NEW_FILE_WIZARD);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testNewFolder() {
-        BasicNewFolderResourceWizard wizard = new BasicNewFolderResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), new StructuredSelection());
-        wizard.setNeedsProgressMonitor(true);
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setText("CreateFolderAction_title"); 
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                IIDEHelpContextIds.NEW_FOLDER_WIZARD);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testNewProjectPage1() {
-        BasicNewProjectResourceWizard wizard = new BasicNewProjectResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), null);
-        wizard.setNeedsProgressMonitor(true);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        dialog.getShell().setText("CreateFileAction_title");
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                IIDEHelpContextIds.NEW_PROJECT_WIZARD);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testNewProjectPage2() {
-        BasicNewProjectResourceWizard wizard = new BasicNewProjectResourceWizard();
-        wizard.init(PlatformUI.getWorkbench(), null);
-        wizard.setNeedsProgressMonitor(true);
-
-        WizardNewProjectReferencePage page = new WizardNewProjectReferencePage(
-                "basicReferenceProjectPage");//$NON-NLS-1$
-        page.setTitle(ResourceMessages.NewProject_referenceTitle);
-        page.setDescription(ResourceMessages.NewProject_referenceDescription);
-        page.setWizard(wizard);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        dialog.getShell().setText("CreateFileAction_title"); 	
-        dialog.showPage(page);
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                IIDEHelpContextIds.NEW_PROJECT_WIZARD);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testNewProject() {
-        // Create wizard selection wizard.
-        NewWizard wizard = new NewWizard();
-        wizard.setProjectsOnly(true);
-        ISelection selection = getWorkbench().getActiveWorkbenchWindow()
-                .getSelectionService().getSelection();
-        IStructuredSelection selectionToPass = null;
-        if (selection instanceof IStructuredSelection)
-            selectionToPass = (IStructuredSelection) selection;
-        else
-            selectionToPass = StructuredSelection.EMPTY;
-        wizard.init(getWorkbench(), selectionToPass);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("NewWizardAction");//$NON-NLS-1$
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings.addNewSection("NewWizardAction");//$NON-NLS-1$
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-
-        // Create wizard dialog.
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        WorkbenchHelp.setHelp(dialog.getShell(),
-                IIDEHelpContextIds.NEW_PROJECT_WIZARD);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-    public void testNewResource() {
-        NewWizard wizard = new NewWizard();
-        ISelection selection = getWorkbench().getActiveWorkbenchWindow()
-                .getSelectionService().getSelection();
-        IStructuredSelection selectionToPass = null;
-        if (selection instanceof IStructuredSelection)
-            selectionToPass = (IStructuredSelection) selection;
-        else
-            selectionToPass = StructuredSelection.EMPTY;
-        wizard.init(getWorkbench(), selectionToPass);
-        IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-                .getDialogSettings();
-        IDialogSettings wizardSettings = workbenchSettings
-                .getSection("NewWizardAction");//$NON-NLS-1$
-        if (wizardSettings == null)
-            wizardSettings = workbenchSettings.addNewSection("NewWizardAction");//$NON-NLS-1$
-        wizard.setDialogSettings(wizardSettings);
-        wizard.setForcePreviousAndNextButtons(true);
-
-        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-        dialog.create();
-        dialog.getShell().setSize(
-                Math.max(SIZING_WIZARD_WIDTH_2, dialog.getShell().getSize().x),
-                SIZING_WIZARD_HEIGHT_2);
-        WorkbenchHelp.setHelp(dialog.getShell(), IWorkbenchHelpContextIds.NEW_WIZARD);
-        DialogCheck.assertDialogTexts(dialog, this);
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIWorkingSetWizardsAuto.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIWorkingSetWizardsAuto.java
deleted file mode 100644
index 6f9d662..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dialogs/UIWorkingSetWizardsAuto.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dialogs;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.registry.WorkingSetDescriptor;
-import org.eclipse.ui.internal.registry.WorkingSetRegistry;
-import org.eclipse.ui.tests.TestPlugin;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Abstract test class for the working set wizard tests.
- */
-public abstract class UIWorkingSetWizardsAuto extends UITestCase {
-    protected static final int SIZING_WIZARD_WIDTH = 470;
-
-    protected static final int SIZING_WIZARD_HEIGHT = 550;
-
-    protected static final int SIZING_WIZARD_WIDTH_2 = 500;
-
-    protected static final int SIZING_WIZARD_HEIGHT_2 = 500;
-
-    protected static final String WORKING_SET_NAME_1 = "ws1";
-
-    protected static final String WORKING_SET_NAME_2 = "ws2";
-
-    protected WizardDialog fWizardDialog;
-
-    protected IWizard fWizard;
-
-    protected IProject p1;
-
-    protected IProject p2;
-
-    protected IFile f1;
-
-    protected IFile f2;
-
-    public UIWorkingSetWizardsAuto(String name) {
-        super(name);
-    }
-
-    protected void checkTreeItems() {
-        List widgets = getWidgets((Composite) fWizardDialog.getCurrentPage()
-                .getControl(), Tree.class);
-        Tree tree = (Tree) widgets.get(0);
-        TreeItem[] treeItems = tree.getItems();
-        for (int i = 0; i < treeItems.length; i++) {
-            treeItems[i].setChecked(true);
-            Event event = new Event();
-            event.detail = SWT.CHECK;
-            event.item = treeItems[i];
-            tree.notifyListeners(SWT.Selection, event);
-        }
-    }
-
-    private void deleteResources() throws CoreException {
-        try {
-            if (p1 != null) {
-                FileUtil.deleteProject(p1);
-            }
-            if (p2 != null) {
-                FileUtil.deleteProject(p2);
-            }
-
-        } catch (CoreException e) {
-            TestPlugin.getDefault().getLog().log(e.getStatus());
-            fail();
-            throw (e);
-
-        }
-
-    }
-
-    private Shell getShell() {
-        return DialogCheck.getShell();
-    }
-
-    protected List getWidgets(Composite composite, Class clazz) {
-        Widget[] children = composite.getChildren();
-        List selectedChildren = new ArrayList();
-
-        for (int i = 0; i < children.length; i++) {
-            Widget child = children[i];
-            if (child.getClass() == clazz) {
-                selectedChildren.add(child);
-            }
-            if (child instanceof Composite) {
-                selectedChildren.addAll(getWidgets((Composite) child, clazz));
-            }
-        }
-        return selectedChildren;
-    }
-
-    /**
-     * <code>fWizard</code> must be initialized by subclasses prior to
-     * calling this.
-     */
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-
-        fWizardDialog = new WizardDialog(getShell(), fWizard);
-        fWizardDialog.create();
-        Shell dialogShell = fWizardDialog.getShell();
-        dialogShell.setSize(Math.max(SIZING_WIZARD_WIDTH_2, dialogShell
-                .getSize().x), SIZING_WIZARD_HEIGHT_2);
-        WorkbenchHelp.setHelp(fWizardDialog.getShell(),
-                IWorkbenchHelpContextIds.WORKING_SET_NEW_WIZARD);
-
-        IWorkingSetManager workingSetManager = fWorkbench
-                .getWorkingSetManager();
-        IWorkingSet[] workingSets = workingSetManager.getWorkingSets();
-        for (int i = 0; i < workingSets.length; i++) {
-            workingSetManager.removeWorkingSet(workingSets[i]);
-        }
-        setupResources();
-    }
-
-    private void setupResources() throws CoreException {
-        p1 = FileUtil.createProject("TP1");
-        p2 = FileUtil.createProject("TP2");
-        f1 = FileUtil.createFile("f1.txt", p1);
-        f2 = FileUtil.createFile("f2.txt", p2);
-    }
-
-    protected void setTextWidgetText(String text, IWizardPage page) {
-        List widgets = getWidgets((Composite) page.getControl(), Text.class);
-        Text textWidget = (Text) widgets.get(0);
-        textWidget.setText(text);
-        textWidget.notifyListeners(SWT.Modify, new Event());
-    }
-
-    protected void doTearDown() throws Exception {
-        deleteResources();
-        super.doTearDown();
-    }
-    
-    protected WorkingSetDescriptor[] getEditableWorkingSetDescriptors() {
-        WorkingSetRegistry registry = WorkbenchPlugin.getDefault().getWorkingSetRegistry();
-        WorkingSetDescriptor[] all = registry.getWorkingSetDescriptors();
-        ArrayList editable = new ArrayList(all.length);
-        for (int i = 0; i < all.length; i++) {
-            WorkingSetDescriptor descriptor = all[i];
-            if (descriptor.isEditable()) {
-                editable.add(descriptor);
-            }
-        }
-        return (WorkingSetDescriptor[]) editable.toArray(new WorkingSetDescriptor[editable.size()]);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/Bug87211Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/Bug87211Test.java
deleted file mode 100644
index 7f435b4..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/Bug87211Test.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.dnd;
-
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-
-public class Bug87211Test extends TestCase {
-	public static TestSuite suite() {
-		return new TestSuite(Bug87211Test.class);
-	}
-
-	private WorkbenchPage fPage;
-
-	private IWorkbenchWindow fWindow;
-
-	protected void setUp() throws Exception {
-		fWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-		fPage = (WorkbenchPage) fWindow.getActivePage();
-	}
-
-	/**
-	 * Tests dragging a standalone view to a new position, then dragging
-	 * another view on top of it.  The views should still be in their
-	 * separate stacks.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testDragStandaloneView() throws Throwable {
-		fPage.setPerspective(WorkbenchPlugin.getDefault()
-				.getPerspectiveRegistry().findPerspectiveWithId(
-						StandaloneViewPerspective.PERSP_ID));
-		try {
-			IViewPart outline = fPage
-					.findView(StandaloneViewPerspective.OUTLINE_ID);
-			ViewDragSource source = new ViewDragSource(
-					StandaloneViewPerspective.OUTLINE_ID, true);
-			ViewDropTarget target = new ViewDropTarget(
-					new ExistingWindowProvider(fWindow),
-					StandaloneViewPerspective.RESOURCE_ID, SWT.CENTER);
-			source.drag(target);
-
-			IViewPart[] refs = fPage.getViewStack(outline);
-			assertEquals(
-					"Cannot drop standalone view onto another standalone view",
-					1, refs.length);
-
-			// the bug resulted in the dropped standalone view losing
-			// it's standalone status, so other views could be dropped
-			// on it.
-			ViewDragSource secondViewSource = new ViewDragSource(
-					StandaloneViewPerspective.TASK_ID, true);
-			ViewDropTarget draggedTarget = new ViewDropTarget(
-					new ExistingWindowProvider(fWindow),
-					StandaloneViewPerspective.OUTLINE_ID, SWT.CENTER);
-			secondViewSource.drag(draggedTarget);
-
-			refs = fPage.getViewStack(outline);
-			assertEquals(
-					"Cannot drop a second view onto the moved standalone view",
-					1, refs.length);
-		} finally {
-			fPage.closePerspective(fPage.getPerspective(), false, false);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DetachedDropTarget.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DetachedDropTarget.java
deleted file mode 100644
index acf75c8..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DetachedDropTarget.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.internal.dnd.TestDropLocation;
-
-public class DetachedDropTarget implements TestDropLocation {
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#toString()
-     */
-    public String toString() {
-        return "out of the window";
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.internal.dnd.TestDropLocation#getLocation()
-     */
-    public Point getLocation() {
-        return new Point(0,0);
-    }
-
-    public Shell[] getShells() {
-        return new Shell[0];
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DetachedWindowDragTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DetachedWindowDragTest.java
deleted file mode 100644
index 7a92e0f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DetachedWindowDragTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.internal.dnd.TestDropLocation;
-import org.eclipse.ui.tests.autotests.AbstractTestLogger;
-
-
-/**
- * This class is used as test entries for 'Detached Window' tests (i.e. where the drop target is
- * in a detached window. It's 'doSetup' augments the base behaviour by 'detaching' a stack containing
- * two 'mock' views and separately detaching an individual view, making them appropriate drop targets
- * for these tests.
- * <p>
- * In some cases the sources and targets may overlap with non-detached tests so in order to avoid
- * name clashes in the tests we add a suffix, "(Detached)", to the test's 'name' when the target is
- * 'Detached'.  
- * <p>
- * @since 3.1
- *
- */
-public class DetachedWindowDragTest	extends DragTest {
-	
-	public DetachedWindowDragTest(TestDragSource dragSource,
-			TestDropLocation dropTarget, AbstractTestLogger log) {
-		super(dragSource, dropTarget, log, " - detached");
-	}
-    
-    public void doSetUp() throws Exception {
-    	super.doSetUp();
-    	
-    	// First, show all the necessary views (note that we show view '2' first, this should
-    	// make view '1' the active view in the folder
-    	page.showView(DragDropPerspectiveFactory.dropViewId2);
-    	page.showView(DragDropPerspectiveFactory.dropViewId1);
-    	page.showView(DragDropPerspectiveFactory.dropViewId3);
-    	
-    	// Since we cannot yet 'detach' a view programmatically we'll have
-    	// to do it the hard way...
-    	
-    	// 'detach' the whole stack containing the Mock view 1
-    	IViewPart viewPart = page.showView(DragDropPerspectiveFactory.dropViewId1); 
-        DragOperations.drag(viewPart, new DetachedDropTarget(), true);
-    	
-    	// Now we'll 'detach' Mock view 3
-    	viewPart = page.showView(DragDropPerspectiveFactory.dropViewId3); 
-        DragOperations.drag(viewPart, new DetachedDropTarget(), false);
-    }
-
-	protected void doTearDown() throws Exception {
-		// hide detached views so they don't scare any following tests
-		
-		IViewReference view = page.findViewReference(DragDropPerspectiveFactory.dropViewId1);
-		page.attachView(view);
-//		page.hideView(view.getView(false));
-		view = page.findViewReference(DragDropPerspectiveFactory.dropViewId2);
-		page.attachView(view);
-//		page.hideView(view.getView(false));
-		view = page.findViewReference(DragDropPerspectiveFactory.dropViewId3);
-		page.attachView(view);
-//		page.hideView(view.getView(false));
-		
-		super.doTearDown();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DragDropPerspectiveFactory.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DragDropPerspectiveFactory.java
deleted file mode 100644
index 6bc7386..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DragDropPerspectiveFactory.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-import org.eclipse.ui.IPlaceholderFolderLayout;
-
-/**
- * @since 3.0
- */
-public class DragDropPerspectiveFactory implements IPerspectiveFactory {
-
-	// Id's needed by the 'Detached Window' Drag / Drop tests
-	public static final String viewFolderId = "oorg.eclipse.ui.test.dnd.detached.MockFolder1";
-	
-	public static final String dropViewId1 = "org.eclipse.ui.tests.api.MockViewPart";
-	public static final String dropViewId2 = "org.eclipse.ui.tests.api.MockViewPart2";
-	public static final String dropViewId3 = "org.eclipse.ui.tests.api.MockViewPart3";
-
-	/* (non-Javadoc)
-     * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout)
-     */
-    public void createInitialLayout(IPageLayout layout) {
-        String folderId = "org.eclipse.ui.test.dnd.mystack";
-
-        IFolderLayout folder = layout.createFolder(folderId,
-                IPageLayout.BOTTOM, 0.5f, IPageLayout.ID_EDITOR_AREA);
-        folder.addView(IPageLayout.ID_OUTLINE);
-        folder.addView(IPageLayout.ID_PROBLEM_VIEW);
-        folder.addView(IPageLayout.ID_PROP_SHEET);
-
-        layout.addView(IPageLayout.ID_RES_NAV, IPageLayout.LEFT, 0.5f,
-                IPageLayout.ID_EDITOR_AREA);
-
-        // Extra stacks and views that will be shown and detached during the 'Detached Window' tests
-        IPlaceholderFolderLayout folder2 = layout.createPlaceholderFolder(viewFolderId,
-                IPageLayout.RIGHT, 0.5f, IPageLayout.ID_EDITOR_AREA);
-        folder2.addPlaceholder(dropViewId1);
-        folder2.addPlaceholder(dropViewId2);
-        
-        layout.addPlaceholder(dropViewId3, IPageLayout.BOTTOM, 0.5f, viewFolderId);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DragOperations.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DragOperations.java
deleted file mode 100644
index 76aa243..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DragOperations.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.internal.EditorSite;
-import org.eclipse.ui.internal.LayoutPart;
-import org.eclipse.ui.internal.PartPane;
-import org.eclipse.ui.internal.PartSite;
-import org.eclipse.ui.internal.PartStack;
-import org.eclipse.ui.internal.ViewSite;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.dnd.DragUtil;
-import org.eclipse.ui.internal.dnd.TestDropLocation;
-
-/**
- * @since 3.0
- */
-public class DragOperations {
-
-    /**
-     * Drags the given view OR editor to the given location (i.e. it only cares that we're given
-     * a 'Part' and doesn't care whether it's a 'View' or an 'Editor'.
-     * <p>
-     * This method should eventually replace the original one once the Workbench has been updated
-     * to handle Views and Editors without distincton. 
-     * 
-     * @param editor
-     * @param target
-     * @param wholeFolder
-     */
-    public static void drag(IWorkbenchPart part, TestDropLocation target,
-            boolean wholeFolder) {
-        DragUtil.forceDropLocation(target);
-
-        PartSite site = (PartSite) part.getSite();
-        PartPane pane = site.getPane();
-        PartStack parent = ((PartStack) (pane.getContainer()));
-
-        parent.paneDragStart(wholeFolder ? null : pane, Display.getDefault().getCursorLocation(), false);
-
-        DragUtil.forceDropLocation(null);
-    }
-
-    /**
-     * Returns the name of the given editor
-     * 
-     * @param editor
-     * @return
-     */
-    public static String getName(IEditorPart editor) {
-        PartPane pane = ((EditorSite) editor.getSite()).getPane();
-        IWorkbenchPartReference ref = pane.getPartReference();
-        return ref.getPartName();
-    }
-
-    public static PartPane getPane(IEditorPart editor) {
-        return ((EditorSite) editor.getSite()).getPane();
-    }
-
-    public static PartPane getPane(IViewPart view) {
-        return ((ViewSite) view.getSite()).getPane();
-    }
-
-    public static Rectangle getDisplayBounds(PartPane pane) {
-        LayoutPart parent = ((LayoutPart) (pane.getContainer()));
-        Rectangle bounds = DragUtil.getDisplayBounds(parent.getControl());
-
-        return bounds;
-    }
-
-    public static Point getLocation(PartPane pane, int side) {
-
-        return DragOperations.getPoint(getDisplayBounds(pane), side);
-    }
-
-    /**
-     * @param page
-     * @param i
-     * @return
-     */
-    public static Point getPointInEditorArea(WorkbenchPage page, int side) {
-        return DragOperations.getPoint(DragUtil.getDisplayBounds(page
-                .getEditorPresentation().getLayoutPart().getControl()), side);
-    }
-
-    public static Point getPoint(Rectangle bounds, int side) {
-        Point centerPoint = Geometry.centerPoint(bounds);
-
-        switch (side) {
-        case SWT.TOP:
-            return new Point(centerPoint.x, bounds.y + 1);
-        case SWT.BOTTOM:
-            return new Point(centerPoint.x, bounds.y + bounds.height - 1);
-        case SWT.LEFT:
-            return new Point(bounds.x + 1, centerPoint.y);
-        case SWT.RIGHT:
-            return new Point(bounds.x + bounds.width - 1, centerPoint.y);
-        }
-
-        return centerPoint;
-    }
-
-    public static String nameForConstant(int swtSideConstant) {
-        switch (swtSideConstant) {
-        case SWT.TOP:
-            return "top";
-        case SWT.BOTTOM:
-            return "bottom";
-        case SWT.LEFT:
-            return "left";
-        case SWT.RIGHT:
-            return "right";
-        }
-
-        return "center";
-    }
-
-    /**
-     * @param targetPart
-     * @return
-     */
-    public static String getName(IViewPart targetPart) {
-        return targetPart.getTitle();
-    }
-
-    /**
-     * 
-     * 
-     * @param page
-     * @return
-     */
-    public static String getLayoutDescription(WorkbenchPage page) {
-        StringBuffer buf = new StringBuffer();
-
-        page.getActivePerspective().describeLayout(buf);
-
-        // Test result -- this will be a value in the resulting map
-        return buf.toString();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DragTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DragTest.java
deleted file mode 100644
index 87c24c6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DragTest.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.internal.dnd.TestDropLocation;
-import org.eclipse.ui.internal.util.PrefUtil;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.api.MockEditorPart;
-import org.eclipse.ui.tests.autotests.AbstractTestLogger;
-import org.eclipse.ui.tests.autotests.UITestCaseWithResult;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-
-/**
- * Tests a single drag-drop scenario, given a dragSource capable of initiating the drag and
- * a dropTarget that can locate the drop location. DragTestSuite will create a large number
- * of DragTests by matching combintations of drag sources with drop targets.  
- *<p></p>
- * <p>
- * <b>TEST NAMES:</b>
- * </p>
- * <p>
- * The name of the test indicates what drag scenario was being attempted. For example, the
- * test "drag Navigator to right of editor area" drags the Navigator view over
- * the editor area, dropping it near the right edge. Drag sources are described as follows:  
- * </p>
- * <p></p>  
- * <p>
- * [maximized] viewname [folder] 
- * </p>
- * <p></p>
- * <p>Drag sources prefixed by "maximized" were maximized at the time the drag started.
- * The word [folder] indicates that folder containing the given editor or view was being dragged.
- * Otherwise, the view itself was being dragged.</p>
- * <p></p>
- * <p>Drop targets are described as follows:</p> 
- * <p></p>  
- * <p>
- * [left|right|top|bottom|center] of targetname 
- * </p>
- * <p></p>
- * <p>Drop targets are always on top of the target. That is, "right of Navigator" means "on top of
- * the navigator view near its right edge" -- NOT "to the right of the Navigator view". When the
- * drop target is on an edge, it is always located 1 pixel away from the middle of that edge.</p>  
- *
- *<p></p>
- * <p>
- * <b>WHAT TO DO IF THIS TEST FAILS:</b>
- * </p>
- * <p>
- * If a drag operation did not have the intended effect, the test will fail with
- * a result like: 
- * </p>
- * <p></p>
- * <p>
- * Expecting 'layout ((((*Navigator)-active (*Problems))|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties))' and found 'layout ((layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties))-active (*Navigator))'
- * </p>
- * <p></p>
- * <p>
- * The expected and actual results are ASCII pictures of the layout. A stack of views or editors
- * is shown as a list enclosed in brackets, with an asterisk indicating the selected pane. The stack
- * may be prefixed by the words "active" or "active_nofocus" if they currently have the active or 
- * active_nofocus appearance. Inactive stacks have no prefix. 
- * </p>
- * <p></p>
- * <p>
- * For example, (Problems, *Console, Properties) indicates a stack containing the Problems, Console, and Properties views, 
- * where the Console view was currently selected. The root layout and editor areas are shown as "layout (...)". A vertical sash is shown as a 
- * bar "|" and a horizontal sash is shown using a dash "-".  All drag tests are done in the Drag Test 
- * Perspective.
- * </p>
- * <p>
- * The initial layout is:
- * </p>
- * <p></p>
- * <p>
- * layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))
- * </p>
- * <p></p>
- * <p>
- * Where editor 0 is "Mock Editor 1", and editors 1 and 2 are shown as "Mock Editor 2".
- * </p>
- * <p></p>
- * <p>
- * If you see a message like "dragtests.xml is out of date", this indicates that new tests
- * were added without describing their intended behavior in dragtests.xml. In that case, ensure that
- * there are currently no failures and regenerate dragtests.xml as described below.
- * </p>
- * <p></p>
- * <p>
- * <b>WHAT TO DO IF THE INTENTED BEHAVIOR CHANGES:</b>
- * </p>
- * <p>
- * If new tests are added or the existing drag/drop behavior is changed, it will
- * be necessary to update dragtests.xml. Do this as follows:</p>
- * <ul>
- * <li>include org.eclipse.ui.tests with your other plugins and launch an inner workspace</li>
- * <li>Go to customize perspective... -> commands -> Drag Test. This will add the "Drag-Drop Snapshot" item to your menubar.</li>
- * <li>Select "Drag-Drop Snapshot"</li>
- * <li>Select a file where the new shapshot will be saved, and click Okay</li>
- * <li>DO NOT use the mouse while generating dragtests.xml. This
- *     can interfere with the tests and cause an incorrect behavior to be recorded as the expected behavior.
- *     In particular, focus changes should be avoided.</li>
- * <li>Wait for several minutes while the test runs</li>
- * <li>When the test is complete, copy the file over the old data/dragtests.xml file</li> 
- * </ul>
- * <p>
- * At this point, the current drag/drop behavior will be considered the correct behavior,
- * and deviations will cause the test suites to fail.
- * </p>
- * 
- * @since 3.0
- */
-public class DragTest extends UITestCaseWithResult {
-    TestDragSource dragSource;
-
-    TestDropLocation dropTarget;
-
-    String intendedResult;
-
-    // 
-    static IProject project;
-
-    static IFile file1, file2;
-
-    IEditorPart editor1, editor2;
-
-    static IFile file3;
-
-    IEditorPart editor3;
-
-    static WorkbenchWindow window;
-
-    static WorkbenchPage page;
-
-    public DragTest(TestDragSource dragSource, TestDropLocation dropTarget, AbstractTestLogger log, String suffix) {
-        super("drag " + dragSource.toString() + " to " + dropTarget.toString() + suffix, log);
-        this.dragSource = dragSource;
-        this.dropTarget = dropTarget;
-    }
-
-    public DragTest(TestDragSource dragSource, TestDropLocation dropTarget, AbstractTestLogger log) {
-    	this(dragSource, dropTarget, log, "");
-    }
-    
-    public void doSetUp() throws Exception {
-        // don't allow UITestCase to manage the deactivation of our window
-        manageWindows(false);
-        //window = (WorkbenchWindow)openTestWindow();
-
-        //initialize the window
-        if (window == null) {
-            window = (WorkbenchWindow) fWorkbench.openWorkbenchWindow(
-            	"org.eclipse.ui.tests.dnd.dragdrop", getPageInput());
-
-            page = (WorkbenchPage) window.getActivePage();
-
-            project = FileUtil.createProject("DragTest"); //$NON-NLS-1$
-            file1 = FileUtil.createFile("DragTest1.txt", project); //$NON-NLS-1$
-            file2 = FileUtil.createFile("DragTest2.txt", project); //$NON-NLS-1$
-            file3 = FileUtil.createFile("DragTest3.txt", project); //$NON-NLS-1$
-
-            // Disable animations since they occur concurrently and can interferre
-            // with locating drop targets
-            IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore();
-            apiStore.setValue(
-                    IWorkbenchPreferenceConstants.ENABLE_ANIMATIONS,
-                    false);
-        }
-        
-        page.resetPerspective();
-        page.closeAllEditors(false);
-        
-        //ensure that contentoutline is the focus part (and at the top of its stack)
-        page.showView("org.eclipse.ui.views.ContentOutline");
-        page.hideView(page.findView("org.eclipse.ui.internal.introview"));
-        editor1 = page.openEditor(new FileEditorInput(file1),
-                MockEditorPart.ID1);
-        editor2 = page.openEditor(new FileEditorInput(file2),
-                MockEditorPart.ID2);
-        editor3 = page.openEditor(new FileEditorInput(file3),
-                MockEditorPart.ID2);
-
-        window.getShell().setActive();
-        DragOperations
-                .drag(editor2, new EditorDropTarget(new ExistingWindowProvider(window), 0, SWT.CENTER), false);
-        DragOperations
-                .drag(editor3, new EditorAreaDropTarget(new ExistingWindowProvider(window), SWT.RIGHT), false);
-    }
-
-    /**
-     * This method is useful in order to 'freeze' the test environment after a particular test in order to 
-     * manipulate the environment to figure out what's going on. It essentially opens a new shell and enters
-     * a modal loop on it, preventing the tests from continuing until the 'stall' shell is closed. Note that
-     * using a dialog would prevent us from manipulating the shell that the drag and drop tests are being performed in
-     */
-    public void stallTest() {
-    	// Add the explicit test names that you want to stall on here...
-    	// (It's probably easiest to cut them directly from the exected results file)
-    	String[] testNames = {
-    	};
-    	
-    	// Does the name match any of the explicit test names??
-    	boolean testNameMatches = false;
-    	for (int i = 0; i < testNames.length; i++) {
-    		if (testNames[i].equals(this.getName())) {
-    			testNameMatches = true;
-    			break;
-    		}
-    	}
-    	
-    	// Stall always if no explicit names are supplied. Otherwise only stall when there's a
-    	// match.
-    	if (testNames.length == 0 || testNameMatches) {
-	    	Display display = Display.getCurrent();
-	    	Shell loopShell = new Shell(display, SWT.SHELL_TRIM);
-	    	loopShell.setBounds(0,0,200,100);
-	    	loopShell.setText("Test Stall Shell");
-	    	loopShell.setVisible(true);
-	    	
-	    	while (loopShell != null && !loopShell.isDisposed()) {
-	    		if (!display.readAndDispatch())
-	    			display.sleep();
-	    	}
-    	}
-    }
-    
-    public String performTest() throws Throwable {
-        // Uncomment the following line to 'stall' the tests here...
-        //stallTest();
-
-    	// KLUDGE!! revert to the old min/max when dragging maximized views
-    	// see bug 180242. This code should disappear before release...
-        IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore();
-        boolean curMinMaxState = apiStore.getBoolean(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX);
-    	if (getName().indexOf("drag maximized") >= 0)
-    		apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, false);
-    		
-    	dragSource.setPage(page);
-
-        dragSource.drag(dropTarget);
-
-        page.testInvariants();
-        
-        // Uncomment the following line to 'stall' the tests here...
-        //stallTest();
-        
-        // KLUDGE!! Restore the min/max pref
-		apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, curMinMaxState);
-        
-        return DragOperations.getLayoutDescription(page);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DragTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DragTestSuite.java
deleted file mode 100644
index b400d7c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/DragTestSuite.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.internal.dnd.TestDropLocation;
-import org.eclipse.ui.tests.TestPlugin;
-import org.eclipse.ui.tests.autotests.AutoTestSuite;
-
-/**
- * @since 3.0
- */
-public class DragTestSuite extends AutoTestSuite {
-
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new DragTestSuite();
-    }
-
-    /**
-     * Whether the platform we're running on supports the detaching of views.  
-     * This is initialized in the following static block.
-     * 
-     * @since 3.2
-     */
-	private static final boolean isDetachingSupported;
-	
-	static {
-		Shell shell = new Shell();
-		Composite c = new Composite(shell, SWT.NONE);
-		isDetachingSupported  = c.isReparentable();
-		shell.dispose();
-	}
-
-    public DragTestSuite() {
-        super(Platform.find(TestPlugin.getDefault().getBundle(), new Path("data/dragtests.xml")));
-        
-        String resNav = IPageLayout.ID_RES_NAV;
-        String probView = IPageLayout.ID_PROBLEM_VIEW;
-
-        // Drag sources for views
-        TestDragSource[] viewDragSources = new TestDragSource[] {
-                new ViewDragSource(resNav, false),
-                new ViewDragSource(resNav, true),
-                new ViewDragSource(probView, false),
-                new ViewDragSource(probView, true) };
-
-        // Drag sources for editors
-        TestDragSource[] editorDragSources = new TestDragSource[] {
-                new EditorDragSource(0, false), new EditorDragSource(0, true),
-                new EditorDragSource(2, false), new EditorDragSource(2, true) };
-
-        // Drop targets that will only be tested for views
-
-        // Drag sources for maximized views
-        TestDragSource[] maximizedViewDragSources = new TestDragSource[] {
-                new ViewDragSource(resNav, false, true),
-                new ViewDragSource(resNav, true, true),
-                new ViewDragSource(probView, false, true),
-                new ViewDragSource(probView, true, true) };
-
-        // Now generate all test cases
-        for (int i = 0; i < maximizedViewDragSources.length; i++) {
-            TestDragSource source = maximizedViewDragSources[i];
-            
-            addAllCombinations(source, getMaximizedViewDropTargets(source));
-        }
-        
-        for (int i = 0; i < viewDragSources.length; i++) {
-            TestDragSource source = viewDragSources[i];
-            
-            addAllCombinations(source, getViewDropTargets(source));
-            addAllCombinations(source, getCommonDropTargets(source));
-            
-            // Test dragging onto a detached window
-            addAllCombinationsDetached(source, getDetachedWindowDropTargets(source));
-        }
-      
-        for (int i = 0; i < editorDragSources.length; i++) {
-            TestDragSource source = editorDragSources[i];
-            
-            addAllCombinations(source, getEditorDropTargets(source));
-            addAllCombinations(source, getCommonDropTargets(source));
-            
-            // Test dragging onto a detached window
-            addAllCombinationsDetached(source, getDetachedWindowDropTargets(source));
-        }
-        addTest(new TestSuite(Bug87211Test.class));
-    }
-
-    /**
-     * Returns drop targets that will only be tested for maximized views. (we only need to ensure
-     * that the view will become un-maximized -- the regular view test cases will excercise
-     * the remainder of the view dragging code). We need to drag each kind of maximized view
-     * to something that couldn't be seen while the view is maximized -- like the editor area).
-     * 
-     * @param dragSource
-     * @return
-     * @since 3.1
-     */
-    private TestDropLocation[] getMaximizedViewDropTargets(IWorkbenchWindowProvider originatingWindow) {
-        return new TestDropLocation[] { 
-                new EditorAreaDropTarget(originatingWindow, SWT.RIGHT) };        
-    }
-    
-    private TestDropLocation[] getCommonDropTargets(IWorkbenchWindowProvider dragSource) {
-        TestDropLocation[] targets = { 
-            // Test dragging to the edges of the workbench window
-            new WindowDropTarget(dragSource, SWT.TOP),
-            new WindowDropTarget(dragSource, SWT.BOTTOM),
-            new WindowDropTarget(dragSource, SWT.LEFT), 
-            new WindowDropTarget(dragSource, SWT.RIGHT) };
-        	
-		return targets;
-    }
-    
-    /**
-     * Return all drop targets that only apply to views, given the window being dragged from.
-     * 
-     * @param provider
-     * @return
-     * @since 3.1
-     */
-    private TestDropLocation[] getViewDropTargets(IWorkbenchWindowProvider dragSource) {
-        
-        String resNav = IPageLayout.ID_RES_NAV;
-        String probView = IPageLayout.ID_PROBLEM_VIEW;
-        
-        TestDropLocation[] targets = new TestDropLocation[] {
-            // Editor area
-            new EditorAreaDropTarget(dragSource, SWT.LEFT),
-            new EditorAreaDropTarget(dragSource, SWT.RIGHT),
-            new EditorAreaDropTarget(dragSource, SWT.TOP),
-            new EditorAreaDropTarget(dragSource, SWT.BOTTOM),
-
-            // Resource navigator (a view that isn't in a stack)
-            new ViewDropTarget(dragSource, resNav, SWT.LEFT),
-            new ViewDropTarget(dragSource, resNav, SWT.RIGHT),
-            new ViewDropTarget(dragSource, resNav, SWT.BOTTOM),
-            new ViewDropTarget(dragSource, resNav, SWT.CENTER),
-            new ViewDropTarget(dragSource, resNav, SWT.TOP),
-
-            // Problems view (a view that is in a stack)
-            // Omit the top from this test, since the meaning of dropping on the top border of 
-            // a stack may change in the near future
-            new ViewDropTarget(dragSource, probView, SWT.LEFT),
-            new ViewDropTarget(dragSource, probView, SWT.RIGHT),
-            new ViewDropTarget(dragSource, probView, SWT.BOTTOM),
-            new ViewDropTarget(dragSource, probView, SWT.CENTER),
-            new ViewDropTarget(dragSource, probView, SWT.TOP),
-
-            // Fast view bar
-            new FastViewBarDropTarget(dragSource),
-
-            // View tabs
-            new ViewTabDropTarget(dragSource, resNav), 
-            new ViewTabDropTarget(dragSource, probView),
-            new ViewTitleDropTarget(dragSource, probView),
-            };
-        	
-		return targets;
-    }
-    
-    /**
-     * Return all drop targets that apply to detached windows, given the window being dragged from.
-     * 
-     * @param provider
-     * @return
-     * @since 3.1
-     */
-    private TestDropLocation[] getDetachedWindowDropTargets(IWorkbenchWindowProvider dragSource) {
-        TestDropLocation[] targets = new TestDropLocation[] {
-            // Editor area
-            new ViewDropTarget(dragSource, DragDropPerspectiveFactory.dropViewId1, SWT.CENTER),
-            new ViewDropTarget(dragSource, DragDropPerspectiveFactory.dropViewId3, SWT.CENTER),
-            new ViewTabDropTarget(dragSource, DragDropPerspectiveFactory.dropViewId1),
-            new DetachedDropTarget()
-        };
-        
-		return targets;
-    }
-
-    private TestDropLocation[] getEditorDropTargets(IWorkbenchWindowProvider originatingWindow) {
-        String resNav = IPageLayout.ID_RES_NAV;
-        // Drop targets that will only be tested for editors
-        return new TestDropLocation[] {
-        // A view
-                new ViewDropTarget(originatingWindow, resNav, SWT.CENTER),
-    
-                // A stand-alone editor
-                new EditorDropTarget(originatingWindow, 2, SWT.LEFT),
-                new EditorDropTarget(originatingWindow, 2, SWT.RIGHT),
-                new EditorDropTarget(originatingWindow, 2, SWT.TOP),
-                new EditorDropTarget(originatingWindow, 2, SWT.BOTTOM),
-                new EditorDropTarget(originatingWindow, 2, SWT.CENTER),
-    
-                // Editors (a stack of editors)
-                new EditorDropTarget(originatingWindow, 0, SWT.LEFT),
-                new EditorDropTarget(originatingWindow, 0, SWT.RIGHT),
-                new EditorDropTarget(originatingWindow, 0, SWT.BOTTOM),
-                new EditorDropTarget(originatingWindow, 0, SWT.CENTER),
-                new EditorTabDropTarget(originatingWindow, 0),
-                new EditorTitleDropTarget(originatingWindow, 0), 
-                };
-    }
-    
-    private void addAllCombinations(TestDragSource dragSource,
-            TestDropLocation[] dropTargets) {
-
-        for (int destId = 0; destId < dropTargets.length; destId++) {
-            DragTest newTest = new DragTest(dragSource, dropTargets[destId], getLog());
-            addTest(newTest);
-        }
-    }
-    
-    private void addAllCombinationsDetached(TestDragSource dragSource,
-            TestDropLocation[] dropTargets) {
-
-    	if (isDetachingSupported) {
-	        for (int destId = 0; destId < dropTargets.length; destId++) {
-	            DragTest newTest = new DetachedWindowDragTest(dragSource, dropTargets[destId], getLog());
-	            addTest(newTest);
-	        }
-    	}
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/EditorAreaDropTarget.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/EditorAreaDropTarget.java
deleted file mode 100644
index fb4631b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/EditorAreaDropTarget.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.swt.graphics.Point;
-
-/**
- * @since 3.0
- */
-public class EditorAreaDropTarget extends WorkbenchWindowDropTarget {
-    int side;
-
-    /**
-     * @param window
-     * @param side
-     */
-    public EditorAreaDropTarget(IWorkbenchWindowProvider provider, int side) {
-        super(provider);
-        this.side = side;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getName()
-     */
-    public String toString() {
-        return DragOperations.nameForConstant(side) + " of editor area";
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getLocation()
-     */
-    public Point getLocation() {
-        return DragOperations.getPointInEditorArea(getPage(), side);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/EditorDragSource.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/EditorDragSource.java
deleted file mode 100644
index 77ab830..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/EditorDragSource.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.internal.dnd.TestDropLocation;
-
-/**
- * @since 3.0
- */
-public class EditorDragSource extends TestDragSource {
-
-    int editorIdx;
-
-    boolean wholeFolder;
-
-    /**
-     * @param editor
-     * @param wholeFolder
-     */
-    public EditorDragSource(int editorIdx, boolean wholeFolder) {
-        super();
-        this.editorIdx = editorIdx;
-        this.wholeFolder = wholeFolder;
-    }
-
-    IEditorPart getPart() {
-        return getPage().getEditors()[editorIdx];
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDragSource#getName()
-     */
-    public String toString() {
-        String title = "editor " + editorIdx;
-
-        if (wholeFolder) {
-            return title + " folder";
-        }
-        return title;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDragSource#drag(org.eclipse.swt.graphics.Point)
-     */
-    public void drag(TestDropLocation target) {
-        DragOperations.drag(getPart(), target, wholeFolder);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/EditorDropTarget.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/EditorDropTarget.java
deleted file mode 100644
index 2a6e2a6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/EditorDropTarget.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * @since 3.0
- */
-public class EditorDropTarget extends WorkbenchWindowDropTarget {
-
-    int editorIdx;
-
-    int side;
-
-    public EditorDropTarget(IWorkbenchWindowProvider provider, int editorIdx, int side) {
-        super(provider);
-        this.editorIdx = editorIdx;
-        this.side = side;
-    }
-
-    IEditorPart getPart() {
-        return getPage().getEditors()[editorIdx];
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getName()
-     */
-    public String toString() {
-        return DragOperations.nameForConstant(side) + " of editor " + editorIdx;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getLocation()
-     */
-    public Point getLocation() {
-        return DragOperations.getLocation(DragOperations.getPane(getPart()),
-                side);
-    }
-    
-    public Shell getShell() {
-    	return getPart().getSite().getShell();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/EditorTabDropTarget.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/EditorTabDropTarget.java
deleted file mode 100644
index dcdf66e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/EditorTabDropTarget.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * @since 3.0
- */
-public class EditorTabDropTarget extends WorkbenchWindowDropTarget {
-
-    int editorIdx;
-
-    public EditorTabDropTarget(IWorkbenchWindowProvider provider, int editorIdx) {
-        super(provider);
-        this.editorIdx = editorIdx;
-    }
-
-    IEditorPart getPart() {
-        return getPage().getEditors()[editorIdx];
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getName()
-     */
-    public String toString() {
-        return "editor " + editorIdx + " tab area";
-    }
-    
-    public Shell getShell() {
-    	return getPart().getSite().getShell();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getLocation()
-     */
-    public Point getLocation() {
-        Rectangle bounds = DragOperations.getDisplayBounds(DragOperations
-                .getPane(getPart()));
-
-        return new Point(bounds.x + 8, bounds.y + 8);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/EditorTitleDropTarget.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/EditorTitleDropTarget.java
deleted file mode 100644
index 45576a6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/EditorTitleDropTarget.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * @since 3.0
- */
-public class EditorTitleDropTarget extends WorkbenchWindowDropTarget {
-
-    int editorIdx;
-
-    public EditorTitleDropTarget(IWorkbenchWindowProvider provider, int editorIdx) {
-        super(provider);
-        this.editorIdx = editorIdx;
-    }
-
-    IEditorPart getPart() {
-        return getPage().getEditors()[editorIdx];
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getName()
-     */
-    public String toString() {
-        return "editor " + editorIdx + " title area";
-    }
-    
-    public Shell getShell() {
-    	return getPart().getSite().getShell();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getLocation()
-     */
-    public Point getLocation() {
-        Rectangle bounds = DragOperations.getDisplayBounds(DragOperations
-                .getPane(getPart()));
-
-        return new Point( (bounds.x + bounds.width) - 4, bounds.y + 4);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/ExistingWindowProvider.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/ExistingWindowProvider.java
deleted file mode 100644
index c45d00a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/ExistingWindowProvider.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.ui.IWorkbenchWindow;
-
-public class ExistingWindowProvider implements IWorkbenchWindowProvider {
-
-    private IWorkbenchWindow window;
-    
-    public ExistingWindowProvider(IWorkbenchWindow window) {
-        this.window = window;
-    }
-    
-    public IWorkbenchWindow getWorkbenchWindow() {
-        return window;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/FastViewBarDropTarget.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/FastViewBarDropTarget.java
deleted file mode 100644
index fb8e582..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/FastViewBarDropTarget.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.internal.dnd.DragUtil;
-
-/**
- * @since 3.0
- */
-public class FastViewBarDropTarget extends WorkbenchWindowDropTarget {
-
-    /**
-     * @param window
-     */
-    public FastViewBarDropTarget(IWorkbenchWindowProvider provider) {
-        super(provider);
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#toString()
-     */
-    public String toString() {
-        return "fast view bar";
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getLocation()
-     */
-    public Point getLocation() {
-        WorkbenchWindow window = (WorkbenchWindow) getPage()
-                .getWorkbenchWindow();
-
-        Control control = window.getFastViewBar().getControl();
-        Rectangle region = DragUtil.getDisplayBounds(control);
-        Point result = Geometry.centerPoint(region);
-
-        return result;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/IWorkbenchWindowProvider.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/IWorkbenchWindowProvider.java
deleted file mode 100644
index 181b3bd..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/IWorkbenchWindowProvider.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.ui.IWorkbenchWindow;
-
-public interface IWorkbenchWindowProvider {
-    public IWorkbenchWindow getWorkbenchWindow();
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/StandaloneViewPerspective.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/StandaloneViewPerspective.java
deleted file mode 100644
index ec79be1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/StandaloneViewPerspective.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- * 
- * @since 3.1.1
- */
-public class StandaloneViewPerspective implements IPerspectiveFactory {
-
-	public static final String OUTLINE_ID = IPageLayout.ID_OUTLINE;
-
-	public static final String RESOURCE_ID = IPageLayout.ID_RES_NAV;
-
-	public static final String TASK_ID = IPageLayout.ID_TASK_LIST;
-
-	public static final String PERSP_ID = "org.eclipse.ui.tests.dnd.StandaloneViewPerspective";
-
-	public StandaloneViewPerspective() {
-		// do nothing
-	}
-
-	public void createInitialLayout(IPageLayout layout) {
-		layout.setEditorAreaVisible(true);
-
-		layout.addStandaloneView(RESOURCE_ID, true, IPageLayout.LEFT, 0.25f,
-				IPageLayout.ID_EDITOR_AREA);
-		layout.addStandaloneView(OUTLINE_ID, true, IPageLayout.RIGHT, 0.25f,
-				IPageLayout.ID_EDITOR_AREA);
-		layout.getViewLayout(OUTLINE_ID).setCloseable(false);
-		layout.addStandaloneView(TASK_ID, true, IPageLayout.BOTTOM, 0.25f,
-				IPageLayout.ID_EDITOR_AREA);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/TestDragSource.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/TestDragSource.java
deleted file mode 100644
index 58ae00b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/TestDragSource.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.internal.dnd.TestDropLocation;
-
-/**
- * @since 3.0
- */
-public abstract class TestDragSource implements IWorkbenchWindowProvider {
-    private WorkbenchPage page;
-
-    public abstract String toString();
-
-    public abstract void drag(TestDropLocation target);
-
-    public void setPage(WorkbenchPage page) {
-        this.page = page;
-    }
-
-    public IWorkbenchWindow getWorkbenchWindow() {
-        return getPage().getWorkbenchWindow();
-    }
-    
-    public WorkbenchPage getPage() {
-        if (page == null) {
-            page = (WorkbenchPage) ((WorkbenchWindow) PlatformUI
-                    .getWorkbench().getActiveWorkbenchWindow()).getActivePage();
-        }
-        return page;
-    }
-    
-    
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/ViewDragSource.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/ViewDragSource.java
deleted file mode 100644
index 5f8d032..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/ViewDragSource.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.internal.PartPane;
-import org.eclipse.ui.internal.ViewSite;
-import org.eclipse.ui.internal.ViewStack;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.dnd.DragUtil;
-import org.eclipse.ui.internal.dnd.TestDropLocation;
-import org.eclipse.ui.views.IViewDescriptor;
-
-/**
- * @since 3.0
- */
-public class ViewDragSource extends TestDragSource {
-
-    String targetPart;
-
-    boolean wholeFolder;
-
-    boolean maximized = false;
-
-    public ViewDragSource(String part, boolean dragWholeFolder) {
-        this(part, dragWholeFolder, false);
-    }
-
-    public ViewDragSource(String part, boolean dragWholeFolder,
-            boolean maximized) {
-        this.maximized = maximized;
-        this.targetPart = part;
-
-        wholeFolder = dragWholeFolder;
-    }
-
-    public IViewPart getPart() {
-        return getPage().findView(targetPart);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDragSource#getName()
-     */
-    public String toString() {
-        IViewDescriptor desc = WorkbenchPlugin.getDefault().getViewRegistry()
-                .find(targetPart);
-        String title = desc.getLabel();
-
-        if (wholeFolder) {
-            title = title + " folder";
-        }
-
-        if (maximized) {
-            title = "maximized " + title;
-        }
-
-        return title;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDragSource#drag(org.eclipse.swt.graphics.Point)
-     */
-    public void drag(TestDropLocation target) {
-        IViewPart part = getPart();
-
-        WorkbenchPage page = getPage();
-        PartPane pane = ((ViewSite) part.getSite()).getPane();
-        if (maximized) {
-            page.toggleZoom(pane.getPartReference());
-        }
-        
-        DragUtil.forceDropLocation(target);
-        ViewStack parent = ((ViewStack) (pane.getContainer()));
-        
-        PartPane presentablePart = wholeFolder ? null : pane;
-        parent.paneDragStart(presentablePart, Display.getDefault()
-                .getCursorLocation(), false);
-
-        DragUtil.forceDropLocation(null);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/ViewDropTarget.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/ViewDropTarget.java
deleted file mode 100644
index a97422a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/ViewDropTarget.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.views.IViewDescriptor;
-
-/**
- * @since 3.0
- */
-public class ViewDropTarget extends WorkbenchWindowDropTarget {
-
-    String targetPart;
-
-    int side;
-
-    public ViewDropTarget(IWorkbenchWindowProvider provider, String part, int side) {
-        super(provider);
-        targetPart = part;
-        this.side = side;
-    }
-
-    IViewPart getPart() {
-        return getPage().findView(targetPart);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getName()
-     */
-    public String toString() {
-        IViewDescriptor desc = WorkbenchPlugin.getDefault().getViewRegistry()
-                .find(targetPart);
-        String title = desc.getLabel();
-
-        return DragOperations.nameForConstant(side) + " of " + title;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getLocation()
-     */
-    public Point getLocation() {
-        return DragOperations.getLocation(DragOperations.getPane(getPart()),
-                side);
-    }
-    
-    public Shell getShell() {
-    	return getPart().getSite().getShell();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/ViewTabDropTarget.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/ViewTabDropTarget.java
deleted file mode 100644
index 36e5a6f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/ViewTabDropTarget.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.views.IViewDescriptor;
-
-/**
- * Note: this drop location is hardcoded to assume a presentation that has
- * a tab drop location at the upper left corner, 8 pixels away from the
- * edge in both dimensions. This drop location should be omitted from the
- * tests in situations where this does not apply (this is not a problem
- * right now since the current tests only use the tabs-on-top drop
- * location).
- * 
- * @since 3.0
- */
-public class ViewTabDropTarget extends WorkbenchWindowDropTarget {
-
-    String targetPart;
-
-    public ViewTabDropTarget(IWorkbenchWindowProvider provider, String part) {
-        super(provider);
-        targetPart = part;
-    }
-
-    IViewPart getPart() {
-        return getPage().findView(targetPart);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getName()
-     */
-    public String toString() {
-        IViewDescriptor desc = WorkbenchPlugin.getDefault().getViewRegistry()
-                .find(targetPart);
-        String title = desc.getLabel();
-
-        return title + " view tab area";
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getLocation()
-     */
-    public Point getLocation() {
-        Rectangle bounds = DragOperations.getDisplayBounds(DragOperations
-                .getPane(getPart()));
-
-        return new Point(bounds.x + 8, bounds.y + 8);
-    }
-    
-    public Shell getShell() {
-    	return getPart().getSite().getShell();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/ViewTitleDropTarget.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/ViewTitleDropTarget.java
deleted file mode 100644
index 871e71e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/ViewTitleDropTarget.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.views.IViewDescriptor;
-
-/**
- * Note: this drop location is hardcoded to assume a presentation that has
- * a tab drop location at the upper left corner, 8 pixels away from the
- * edge in both dimensions. This drop location should be omitted from the
- * tests in situations where this does not apply (this is not a problem
- * right now since the current tests only use the tabs-on-top drop
- * location).
- * 
- * @since 3.0
- */
-public class ViewTitleDropTarget extends WorkbenchWindowDropTarget {
-
-    String targetPart;
-
-    public ViewTitleDropTarget(IWorkbenchWindowProvider provider, String part) {
-        super(provider);
-        targetPart = part;
-    }
-
-    IViewPart getPart() {
-        return getPage().findView(targetPart);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getName()
-     */
-    public String toString() {
-        IViewDescriptor desc = WorkbenchPlugin.getDefault().getViewRegistry()
-                .find(targetPart);
-        String title = desc.getLabel();
-
-        return title + " view title area";
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getLocation()
-     */
-    public Point getLocation() {
-        Rectangle bounds = DragOperations.getDisplayBounds(DragOperations
-                .getPane(getPart()));
-
-        return new Point( (bounds.x + bounds.width) - 8, bounds.y + 8);
-    }
-    
-    public Shell getShell() {
-    	return getPart().getSite().getShell();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/WindowDropTarget.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/WindowDropTarget.java
deleted file mode 100644
index d666b60..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/WindowDropTarget.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @since 3.0
- */
-public class WindowDropTarget extends WorkbenchWindowDropTarget {
-
-    private int side;
-
-    public WindowDropTarget(IWorkbenchWindowProvider provider, int side) {
-        super(provider);
-        this.side = side;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getName()
-     */
-    public String toString() {
-        return DragOperations.nameForConstant(side) + " of window";
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dnd.TestDropTarget#getLocation()
-     */
-    public Point getLocation() {
-        Shell shell = getShell();
-        Rectangle clientArea = shell.getClientArea();
-
-        return DragOperations.getPoint(Geometry.toDisplay(shell, clientArea),
-                side);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/WorkbenchWindowDropTarget.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/WorkbenchWindowDropTarget.java
deleted file mode 100644
index 0c7a6cb..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dnd/WorkbenchWindowDropTarget.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dnd;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.dnd.TestDropLocation;
-
-/**
- * @since 3.0
- */
-public abstract class WorkbenchWindowDropTarget implements TestDropLocation {
-
-    private IWorkbenchWindowProvider window;
-    
-    public abstract String toString();
-
-    public abstract Point getLocation();
-
-    public WorkbenchWindowDropTarget(IWorkbenchWindowProvider window) {
-        this.window = window;
-    }
-    
-    public IWorkbenchWindow getWindow() {
-        return window.getWorkbenchWindow();
-    }
-    
-    public Shell getShell() {
-        return getWindow().getShell();
-    }
-    
-    public WorkbenchPage getPage() {
-        return (WorkbenchPage)getWindow().getActivePage();
-    }
-    
-    public Shell[] getShells() {
-        return new Shell[] {getShell()};
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/AcceleratorConfigurationsExtensionDynamicTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/AcceleratorConfigurationsExtensionDynamicTest.java
deleted file mode 100644
index 8cfd879..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/AcceleratorConfigurationsExtensionDynamicTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.core.commands.common.NamedHandleObject;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.eclipse.ui.keys.IBindingService;
-
-/**
- * Tests whether the "org.eclipse.ui.acceleratorConfigurations" extension point
- * can be added and removed dynamically.
- * 
- * @since 3.1.1
- */
-public final class AcceleratorConfigurationsExtensionDynamicTest extends
-		DynamicTestCase {
-
-	/**
-	 * Constructs a new instance of
-	 * <code>AcceleratorConfigurationsExtensionDynamicTest</code>.
-	 * 
-	 * @param testName
-	 *            The name of the test; may be <code>null</code>.
-	 */
-	public AcceleratorConfigurationsExtensionDynamicTest(final String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Returns the full-qualified identifier of the extension to be tested.
-	 * 
-	 * @return The extension identifier; never <code>null</code>.
-	 */
-	protected final String getExtensionId() {
-		return "acceleratorConfigurationsExtensionDynamicTest.testDynamicAcceleratorConfigurationAddition";
-	}
-
-	/**
-	 * Returns the unqualified identifier of the extension point to be tested.
-	 * 
-	 * @return The extension point identifier; never <code>null</code>.
-	 */
-	protected final String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_ACCELERATOR_CONFIGURATIONS;
-	}
-
-	/**
-	 * Returns the relative location of the folder on disk containing the
-	 * plugin.xml file.
-	 * 
-	 * @return The relative install location; never <code>null</code>.
-	 */
-	protected final String getInstallLocation() {
-		return "data/org.eclipse.acceleratorConfigurationsExtensionDynamicTest";
-	}
-
-	/**
-	 * Tests whether the items defined in the extension point can be added and
-	 * removed dynamically. It tests that the data doesn't exist, and then loads
-	 * the extension. It tests that the data then exists, and unloads the
-	 * extension. It tests that the data then doesn't exist.
-	 */
-	public final void testAcceleratorConfigurations() {
-		final IBindingService service = (IBindingService) getWorkbench()
-				.getAdapter(IBindingService.class);
-		NamedHandleObject namedHandleObject;
-
-		namedHandleObject = service.getScheme("monkey");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-
-		getBundle();
-
-		namedHandleObject = service.getScheme("monkey");
-		try {
-			assertTrue("Monkey".equals(namedHandleObject.getName()));
-		} catch (final NotDefinedException e) {
-			fail();
-		}
-
-		removeBundle();
-
-		namedHandleObject = service.getScheme("monkey");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/AcceleratorScopesExtensionDynamicTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/AcceleratorScopesExtensionDynamicTest.java
deleted file mode 100644
index de49baa..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/AcceleratorScopesExtensionDynamicTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.core.commands.common.NamedHandleObject;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-
-/**
- * Tests whether the "org.eclipse.ui.acceleratorScopes" extension point can be
- * added and removed dynamically.
- * 
- * @since 3.1.1
- */
-public final class AcceleratorScopesExtensionDynamicTest extends
-		DynamicTestCase {
-
-	/**
-	 * Constructs a new instance of
-	 * <code>AcceleratorScopesExtensionDynamicTest</code>.
-	 * 
-	 * @param testName
-	 *            The name of the test; may be <code>null</code>.
-	 */
-	public AcceleratorScopesExtensionDynamicTest(final String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Returns the full-qualified identifier of the extension to be tested.
-	 * 
-	 * @return The extension identifier; never <code>null</code>.
-	 */
-	protected final String getExtensionId() {
-		return "acceleratorScopesExtensionDynamicTest.testDynamicAcceleratorScopeAddition";
-	}
-
-	/**
-	 * Returns the unqualified identifier of the extension point to be tested.
-	 * 
-	 * @return The extension point identifier; never <code>null</code>.
-	 */
-	protected final String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_ACCELERATOR_SCOPES;
-	}
-
-	/**
-	 * Returns the relative location of the folder on disk containing the
-	 * plugin.xml file.
-	 * 
-	 * @return The relative install location; never <code>null</code>.
-	 */
-	protected final String getInstallLocation() {
-		return "data/org.eclipse.acceleratorScopesExtensionDynamicTest";
-	}
-
-	/**
-	 * Tests whether the items defined in the extension point can be added and
-	 * removed dynamically. It tests that the data doesn't exist, and then loads
-	 * the extension. It tests that the data then exists, and unloads the
-	 * extension. It tests that the data then doesn't exist.
-	 */
-	public final void testAcceleratorScopes() {
-		final IContextService service = (IContextService) getWorkbench()
-				.getAdapter(IContextService.class);
-		NamedHandleObject namedHandleObject;
-
-		namedHandleObject = service.getContext("monkey");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-
-		getBundle();
-
-		namedHandleObject = service.getContext("monkey");
-		try {
-			assertTrue("Monkey".equals(namedHandleObject.getName()));
-		} catch (final NotDefinedException e) {
-			fail();
-		}
-
-		removeBundle();
-
-		namedHandleObject = service.getContext("monkey");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ActionDefinitionsExtensionDynamicTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ActionDefinitionsExtensionDynamicTest.java
deleted file mode 100644
index 34a1907..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ActionDefinitionsExtensionDynamicTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.core.commands.common.NamedHandleObject;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-
-/**
- * Tests whether the "org.eclipse.ui.actionDefinitions" extension point can be
- * added and removed dynamically.
- * 
- * @since 3.1.1
- */
-public final class ActionDefinitionsExtensionDynamicTest extends
-		DynamicTestCase {
-
-	/**
-	 * Constructs a new instance of
-	 * <code>ActionDefinitionsExtensionDynamicTest</code>.
-	 * 
-	 * @param testName
-	 *            The name of the test; may be <code>null</code>.
-	 */
-	public ActionDefinitionsExtensionDynamicTest(final String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Returns the full-qualified identifier of the extension to be tested.
-	 * 
-	 * @return The extension identifier; never <code>null</code>.
-	 */
-	protected final String getExtensionId() {
-		return "actionDefinitionsExtensionDynamicTest.testDynamicActionDefinitionAddition";
-	}
-
-	/**
-	 * Returns the unqualified identifier of the extension point to be tested.
-	 * 
-	 * @return The extension point identifier; never <code>null</code>.
-	 */
-	protected final String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_ACTION_DEFINITIONS;
-	}
-
-	/**
-	 * Returns the relative location of the folder on disk containing the
-	 * plugin.xml file.
-	 * 
-	 * @return The relative install location; never <code>null</code>.
-	 */
-	protected final String getInstallLocation() {
-		return "data/org.eclipse.actionDefinitionsExtensionDynamicTest";
-	}
-
-	/**
-	 * Tests whether the items defined in the extension point can be added and
-	 * removed dynamically. It tests that the data doesn't exist, and then loads
-	 * the extension. It tests that the data then exists, and unloads the
-	 * extension. It tests that the data then doesn't exist.
-	 */
-	public final void testActionDefinitions() {
-		final ICommandService service = (ICommandService) getWorkbench()
-				.getAdapter(ICommandService.class);
-		NamedHandleObject namedHandleObject;
-
-		namedHandleObject = service.getCommand("monkey");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-
-		getBundle();
-
-		namedHandleObject = service.getCommand("monkey");
-		try {
-			assertTrue("Monkey".equals(namedHandleObject.getName()));
-		} catch (final NotDefinedException e) {
-			fail();
-		}
-
-		removeBundle();
-
-		namedHandleObject = service.getCommand("monkey");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ActionSetTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ActionSetTests.java
deleted file mode 100644
index 4e171cc..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ActionSetTests.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.WeakReference;
-
-import org.eclipse.core.runtime.IRegistryChangeListener;
-
-import org.eclipse.jface.action.IAction;
-
-import org.eclipse.ui.internal.PluginActionSet;
-import org.eclipse.ui.internal.WWinPluginAction;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.internal.registry.ActionSetRegistry;
-import org.eclipse.ui.internal.registry.IActionSet;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.eclipse.ui.tests.leaks.LeakTests;
-
-/**
- * Tests to ensure the addition of new action sets with dynamic plug-ins.
- */
-
-public class ActionSetTests extends DynamicTestCase implements
-        IRegistryChangeListener {
-
-    /**
-     * 
-     */
-    private static final String ACTION_SET_ID = "org.eclipse.newActionSet1.newActionSet1";
-    private static final String PART_ID = "org.eclipse.ui.tests.part1";
-
-    public ActionSetTests(String testName) {
-        super(testName);
-    }
-
-    public void testActionSets() throws Exception {
-        WorkbenchWindow window = (WorkbenchWindow) openTestWindow();
-        boolean [] found = new boolean[] {false};
-        WWinPluginAction [] action = new WWinPluginAction[1];
-        
-        assertNull(window.getActionBars().getMenuManager().findUsingPath("menu1"));
-        assertNull(getActionSetRegistry().findActionSet(ACTION_SET_ID));
-        findInPresentation(window, action, found);
-        assertFalse("Action set found", found[0]);
-        assertNull("Action found", action[0]);
-        
-        action[0] = null;
-        found[0] = false;
-        getBundle();
-        
-        assertNotNull(window.getActionBars().getMenuManager().findUsingPath("menu1"));
-        assertNotNull(getActionSetRegistry().findActionSet(ACTION_SET_ID));
-        findInPresentation(window, action, found);
-        assertTrue("Action set not found", found[0]);
-        assertNotNull("Action not found", action[0]);
-        
-        ReferenceQueue queue = new ReferenceQueue();
-        WeakReference ref = new WeakReference(action[0], queue);
-        
-        action[0] = null;
-        found[0] = false;
-        removeBundle();
-        
-        assertNull(window.getActionBars().getMenuManager().findUsingPath("menu1"));
-        assertNull(getActionSetRegistry().findActionSet(ACTION_SET_ID));
-        LeakTests.checkRef(queue, ref);
-        findInPresentation(window, action, found);
-        assertFalse("Action set found", found[0]);
-        assertNull("Action found", action[0]);
-        
-    }
-
-    private void findInPresentation(WorkbenchWindow window,
-            WWinPluginAction[] action, boolean[] found) {
-        IActionSet[] sets = window.getActionPresentation().getActionSets();
-
-        for (int i = 0; i < sets.length; i++) {
-            if (((PluginActionSet) sets[i]).getDesc().getId().equals(
-                "org.eclipse.newActionSet1.newActionSet2")) {
-                found[0] = true;
-                IAction[] pluginActions = ((PluginActionSet) sets[i])
-                    .getPluginActions();
-                for (int j = 0; j < pluginActions.length; j++) {
-                    if (pluginActions[j].getId().equals(
-                        "org.eclipse.ui.tests.action1"))
-                        action[0] = (WWinPluginAction) pluginActions[j];
-                }
-                break;
-            }
-        }
-    }
-
-    /**
-     * @return
-     */
-    private ActionSetRegistry getActionSetRegistry() {
-        return WorkbenchPlugin.getDefault().getActionSetRegistry();
-    }
-
-    public void testActionSetPartAssociations() {
-        assertEquals(0, getActionSetRegistry().getActionSetsFor(PART_ID).length);
-        getBundle();
-        assertEquals(1, getActionSetRegistry().getActionSetsFor(PART_ID).length);
-        removeBundle();
-        assertEquals(0, getActionSetRegistry().getActionSetsFor(PART_ID).length);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-     */
-    protected String getExtensionId() {
-        return "newActionSet1.testDynamicActionSetAddition";
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-     */
-    protected String getExtensionPoint() {
-        return IWorkbenchRegistryConstants.PL_ACTION_SETS;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-     */
-    protected String getInstallLocation() {
-        return "data/org.eclipse.newActionSet1";
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ActivitySupportTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ActivitySupportTests.java
deleted file mode 100644
index 5687772..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ActivitySupportTests.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.activities.IActivity;
-import org.eclipse.ui.activities.ICategory;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.eclipse.ui.tests.harness.util.ImageTests;
-
-public class ActivitySupportTests extends DynamicTestCase {
-
-	public ActivitySupportTests(String testName) {
-		super(testName);
-	}
-
-	protected String getExtensionId() {
-		return "newActivitySupport1.testNewActivitySupportAddition";
-	}
-
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_ACTIVITYSUPPORT;
-	}
-
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newActivitySupport1";
-	}
-
-	public void testActivityImages() {
-		IActivity baselineActivity = getWorkbench().getActivitySupport()
-				.getActivityManager().getActivity("someBogusActivityId");
-		assertNotNull(baselineActivity);
-		assertFalse(baselineActivity.isDefined());
-
-		IActivity activityWithIcon = getWorkbench().getActivitySupport()
-				.getActivityManager().getActivity("org.eclipse.activity2");
-		assertNotNull(activityWithIcon);
-		assertTrue(activityWithIcon.isDefined());
-
-		ImageDescriptor baselineDescriptor = getWorkbench()
-				.getActivitySupport().getImageDescriptor(baselineActivity);
-		ImageDescriptor customDescriptor = getWorkbench().getActivitySupport()
-				.getImageDescriptor(activityWithIcon);
-
-		Image baselineImage = null, customImage = null;
-		try {
-			baselineImage = baselineDescriptor.createImage();
-			assertNotNull(baselineImage);
-			customImage = customDescriptor.createImage();
-			assertNotNull(customImage);
-
-			// ensure that the images are the same before loading the plugin
-			ImageTests.assertEquals(baselineImage, customImage);
-		} finally {
-			if (baselineImage != null)
-				baselineImage.dispose();
-			if (customImage != null)
-				customImage.dispose();
-		}
-
-		getBundle();
-
-		baselineDescriptor = getWorkbench().getActivitySupport()
-				.getImageDescriptor(baselineActivity);
-		customDescriptor = getWorkbench().getActivitySupport()
-				.getImageDescriptor(activityWithIcon);
-
-		try {
-			baselineImage = baselineDescriptor.createImage();
-			assertNotNull(baselineImage);
-			customImage = customDescriptor.createImage();
-			assertNotNull(customImage);
-
-			// ensure that the images are differnt after loading the plugin
-			ImageTests.assertNotEquals(baselineImage, customImage);
-		} finally {
-			if (baselineImage != null)
-				baselineImage.dispose();
-			if (customImage != null)
-				customImage.dispose();
-		}
-
-		removeBundle();
-
-		baselineDescriptor = getWorkbench().getActivitySupport()
-				.getImageDescriptor(baselineActivity);
-		customDescriptor = getWorkbench().getActivitySupport()
-				.getImageDescriptor(activityWithIcon);
-
-		try {
-			baselineImage = baselineDescriptor.createImage();
-			assertNotNull(baselineImage);
-			customImage = customDescriptor.createImage();
-			assertNotNull(customImage);
-
-			// ensure that the images are the same after unloading the plugin
-			ImageTests.assertEquals(baselineImage, customImage);
-		} finally {
-			if (baselineImage != null)
-				baselineImage.dispose();
-			if (customImage != null)
-				customImage.dispose();
-		}
-
-	}
-	
-	
-	public void testCategoryImages() {
-		ICategory baselineCategory = getWorkbench().getActivitySupport()
-				.getActivityManager().getCategory("someBogusCategoryId");
-		assertNotNull(baselineCategory);
-		assertFalse(baselineCategory.isDefined());
-
-		ICategory categoryWithIcon = getWorkbench().getActivitySupport()
-				.getActivityManager().getCategory("org.eclipse.category2");
-		assertNotNull(categoryWithIcon);
-		assertTrue(categoryWithIcon.isDefined());
-
-		ImageDescriptor baselineDescriptor = getWorkbench()
-				.getActivitySupport().getImageDescriptor(baselineCategory);
-		ImageDescriptor customDescriptor = getWorkbench().getActivitySupport()
-				.getImageDescriptor(categoryWithIcon);
-
-		Image baselineImage = null, customImage = null;
-		try {
-			baselineImage = baselineDescriptor.createImage();
-			assertNotNull(baselineImage);
-			customImage = customDescriptor.createImage();
-			assertNotNull(customImage);
-
-			// ensure that the images are the same before loading the plugin
-			ImageTests.assertEquals(baselineImage, customImage);
-		} finally {
-			if (baselineImage != null)
-				baselineImage.dispose();
-			if (customImage != null)
-				customImage.dispose();
-		}
-
-		getBundle();
-
-		baselineDescriptor = getWorkbench().getActivitySupport()
-				.getImageDescriptor(baselineCategory);
-		customDescriptor = getWorkbench().getActivitySupport()
-				.getImageDescriptor(categoryWithIcon);
-
-		try {
-			baselineImage = baselineDescriptor.createImage();
-			assertNotNull(baselineImage);
-			customImage = customDescriptor.createImage();
-			assertNotNull(customImage);
-
-			// ensure that the images are differnt after loading the plugin
-			ImageTests.assertNotEquals(baselineImage, customImage);
-		} finally {
-			if (baselineImage != null)
-				baselineImage.dispose();
-			if (customImage != null)
-				customImage.dispose();
-		}
-
-		removeBundle();
-
-		baselineDescriptor = getWorkbench().getActivitySupport()
-				.getImageDescriptor(baselineCategory);
-		customDescriptor = getWorkbench().getActivitySupport()
-				.getImageDescriptor(categoryWithIcon);
-
-		try {
-			baselineImage = baselineDescriptor.createImage();
-			assertNotNull(baselineImage);
-			customImage = customDescriptor.createImage();
-			assertNotNull(customImage);
-
-			// ensure that the images are the same after unloading the plugin
-			ImageTests.assertEquals(baselineImage, customImage);
-		} finally {
-			if (baselineImage != null)
-				baselineImage.dispose();
-			if (customImage != null)
-				customImage.dispose();
-		}
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/BindingsExtensionDynamicTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/BindingsExtensionDynamicTest.java
deleted file mode 100644
index 2317fc1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/BindingsExtensionDynamicTest.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.jface.bindings.Binding;
-import org.eclipse.jface.bindings.Scheme;
-import org.eclipse.jface.bindings.TriggerSequence;
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.ParseException;
-import org.eclipse.jface.contexts.IContextIds;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.eclipse.ui.keys.IBindingService;
-
-/**
- * Tests whether the "org.eclipse.ui.bindings" extension point can be added and
- * removed dynamically.
- * 
- * @since 3.1.1
- */
-public final class BindingsExtensionDynamicTest extends DynamicTestCase {
-
-	/**
-	 * Constructs a new instance of <code>BindingsExtensionDynamicTest</code>.
-	 * 
-	 * @param testName
-	 *            The name of the test; may be <code>null</code>.
-	 */
-	public BindingsExtensionDynamicTest(final String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Returns the full-qualified identifier of the extension to be tested.
-	 * 
-	 * @return The extension identifier; never <code>null</code>.
-	 */
-	protected final String getExtensionId() {
-		return "bindingsExtensionDynamicTest.testDynamicBindingAddition";
-	}
-
-	/**
-	 * Returns the unqualified identifier of the extension point to be tested.
-	 * 
-	 * @return The extension point identifier; never <code>null</code>.
-	 */
-	protected final String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_BINDINGS;
-	}
-
-	/**
-	 * Returns the relative location of the folder on disk containing the
-	 * plugin.xml file.
-	 * 
-	 * @return The relative install location; never <code>null</code>.
-	 */
-	protected final String getInstallLocation() {
-		return "data/org.eclipse.bindingsExtensionDynamicTest";
-	}
-
-	/**
-	 * Tests whether the items defined in the extension point can be added and
-	 * removed dynamically. It tests that the data doesn't exist, and then loads
-	 * the extension. It tests that the data then exists, and unloads the
-	 * extension. It tests that the data then doesn't exist.
-	 * 
-	 * @throws ParseException
-	 *             If "M1+W" can't be parsed by the extension point.
-	 */
-	public void testBindings() throws ParseException {
-		final IBindingService bindingService = (IBindingService) getWorkbench()
-				.getAdapter(IBindingService.class);
-		final TriggerSequence triggerSequence = KeySequence.getInstance("M1+W");
-		Binding[] bindings;
-		Scheme scheme;
-		boolean found;
-
-		found = false;
-		bindings = bindingService.getBindings();
-		if (bindings != null) {
-			for (int i = 0; i < bindings.length; i++) {
-				final Binding binding = bindings[i];
-				if ("monkey".equals(binding.getSchemeId())
-						&& IContextIds.CONTEXT_ID_WINDOW.equals(binding
-								.getContextId())
-						&& "org.eclipse.ui.views.showView".equals(binding
-								.getParameterizedCommand().getId())
-						&& binding.getParameterizedCommand().getParameterMap()
-								.containsKey(
-										"org.eclipse.ui.views.showView.viewId")
-						&& binding.getPlatform() == null
-						&& binding.getLocale() == null
-						&& binding.getType() == Binding.SYSTEM
-						&& triggerSequence.equals(binding.getTriggerSequence())) {
-					found = true;
-
-				}
-			}
-		}
-		assertTrue(!found);
-		scheme = bindingService.getScheme("monkey");
-		try {
-			scheme.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-
-		getBundle();
-
-		found = false;
-		bindings = bindingService.getBindings();
-		if (bindings != null) {
-			for (int i = 0; i < bindings.length; i++) {
-				final Binding binding = bindings[i];
-				if ("monkey".equals(binding.getSchemeId())
-						&& IContextIds.CONTEXT_ID_WINDOW.equals(binding
-								.getContextId())
-						&& "org.eclipse.ui.views.showView".equals(binding
-								.getParameterizedCommand().getId())
-						&& binding.getParameterizedCommand().getParameterMap()
-								.containsKey(
-										"org.eclipse.ui.views.showView.viewId")
-						&& binding.getPlatform() == null
-						&& binding.getLocale() == null
-						&& binding.getType() == Binding.SYSTEM
-						&& triggerSequence.equals(binding.getTriggerSequence())) {
-					found = true;
-
-				}
-			}
-		}
-		assertTrue(found);
-		scheme = bindingService.getScheme("monkey");
-		try {
-			assertTrue("Monkey".equals(scheme.getName()));
-		} catch (final NotDefinedException e) {
-			fail();
-		}
-
-		removeBundle();
-
-		found = false;
-		bindings = bindingService.getBindings();
-		if (bindings != null) {
-			for (int i = 0; i < bindings.length; i++) {
-				final Binding binding = bindings[i];
-				if ("monkey".equals(binding.getSchemeId())
-						&& IContextIds.CONTEXT_ID_WINDOW.equals(binding
-								.getContextId())
-						&& "org.eclipse.ui.views.showView".equals(binding
-								.getParameterizedCommand().getId())
-						&& binding.getParameterizedCommand().getParameterMap()
-								.containsKey(
-										"org.eclipse.ui.views.showView.viewId")
-						&& binding.getPlatform() == null
-						&& binding.getLocale() == null
-						&& binding.getType() == Binding.SYSTEM
-						&& triggerSequence.equals(binding.getTriggerSequence())) {
-					found = true;
-
-				}
-			}
-		}
-		assertTrue(!found);
-		scheme = bindingService.getScheme("monkey");
-		try {
-			scheme.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/BrowserTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/BrowserTests.java
deleted file mode 100644
index 18cb84f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/BrowserTests.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.ui.internal.browser.WorkbenchBrowserSupport;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-
-/**
- * @since 3.1
- */
-public class BrowserTests extends DynamicTestCase {
-
-    /**
-     * @param testName
-     */
-    public BrowserTests(String testName) {
-        super(testName);
-    }
-
-    public void testBrowserSupport() {
-        WorkbenchBrowserSupport support = (WorkbenchBrowserSupport) WorkbenchBrowserSupport.getInstance();
-        try {
-            support.setDesiredBrowserSupportId(getExtensionId());
-            assertFalse(support.hasNonDefaultBrowser());
-            
-            getBundle();
-            support.setDesiredBrowserSupportId(getExtensionId());
-            assertTrue(support.hasNonDefaultBrowser());
-            
-            removeBundle();
-            support.setDesiredBrowserSupportId(getExtensionId());    
-            assertFalse(support.hasNonDefaultBrowser());
-        }
-        finally {
-            support.setDesiredBrowserSupportId(null);    
-        }
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-     */
-    protected String getExtensionId() {
-        return "newBrowser1.testDynamicBrowserAddition";
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-     */
-    protected String getExtensionPoint() {
-        return IWorkbenchRegistryConstants.PL_BROWSER_SUPPORT;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-     */
-    protected String getInstallLocation() {
-        return "data/org.eclipse.newBrowser1";
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getMarkerClass()
-     */
-    protected String getMarkerClass() {
-        return "org.eclipse.ui.dynamic.DynamicBrowserSupport";
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/CommandsExtensionDynamicTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/CommandsExtensionDynamicTest.java
deleted file mode 100644
index 6ef13b8..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/CommandsExtensionDynamicTest.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.NotHandledException;
-import org.eclipse.core.commands.common.NamedHandleObject;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.jface.bindings.Binding;
-import org.eclipse.jface.bindings.TriggerSequence;
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.ParseException;
-import org.eclipse.jface.contexts.IContextIds;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.eclipse.ui.keys.IBindingService;
-
-/**
- * Tests whether the "org.eclipse.ui.commands" extension point can be added and
- * removed dynamically.
- * 
- * @since 3.1.1
- */
-public final class CommandsExtensionDynamicTest extends DynamicTestCase {
-
-	/**
-	 * Constructs a new instance of <code>CommandsExtensionDynamicTest</code>.
-	 * 
-	 * @param testName
-	 *            The name of the test; may be <code>null</code>.
-	 */
-	public CommandsExtensionDynamicTest(final String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Returns the full-qualified identifier of the extension to be tested.
-	 * 
-	 * @return The extension identifier; never <code>null</code>.
-	 */
-	protected final String getExtensionId() {
-		return "commandsExtensionDynamicTest.testDynamicCommandAddition";
-	}
-
-	/**
-	 * Returns the unqualified identifier of the extension point to be tested.
-	 * 
-	 * @return The extension point identifier; never <code>null</code>.
-	 */
-	protected final String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_COMMANDS;
-	}
-
-	/**
-	 * Returns the relative location of the folder on disk containing the
-	 * plugin.xml file.
-	 * 
-	 * @return The relative install location; never <code>null</code>.
-	 */
-	protected final String getInstallLocation() {
-		return "data/org.eclipse.commandsExtensionDynamicTest";
-	}
-
-	/**
-	 * Tests whether the items defined in the extension point can be added and
-	 * removed dynamically. It tests that the data doesn't exist, and then loads
-	 * the extension. It tests that the data then exists, and unloads the
-	 * extension. It tests that the data then doesn't exist.
-	 * 
-	 * @throws ParseException
-	 *             If "M1+W" can't be parsed by the extension point.
-	 */
-	public final void testCommands() throws ParseException {
-		final IBindingService bindingService = (IBindingService) getWorkbench()
-				.getAdapter(IBindingService.class);
-		final ICommandService commandService = (ICommandService) getWorkbench()
-				.getAdapter(ICommandService.class);
-		final IContextService contextService = (IContextService) getWorkbench()
-				.getAdapter(IContextService.class);
-		final TriggerSequence triggerSequence = KeySequence.getInstance("M1+W");
-		NamedHandleObject namedHandleObject;
-		Binding[] bindings;
-		Command command;
-		boolean found;
-
-		assertTrue(!"monkey".equals(bindingService.getActiveScheme().getId()));
-		found = false;
-		bindings = bindingService.getBindings();
-		if (bindings != null) {
-			for (int i = 0; i < bindings.length; i++) {
-				final Binding binding = bindings[i];
-				if ("monkey".equals(binding.getSchemeId())
-						&& IContextIds.CONTEXT_ID_WINDOW.equals(binding
-								.getContextId())
-						&& "monkey".equals(binding.getParameterizedCommand()
-								.getId()) && binding.getPlatform() == null
-						&& binding.getLocale() == null
-						&& binding.getType() == Binding.SYSTEM
-						&& triggerSequence.equals(binding.getTriggerSequence())) {
-					found = true;
-
-				}
-			}
-		}
-		assertTrue(!found);
-		namedHandleObject = bindingService.getScheme("monkey");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-		namedHandleObject = commandService.getCategory("monkey");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-		command = commandService.getCommand("monkey");
-		try {
-			command.execute(new ExecutionEvent());
-			fail();
-		} catch (final ExecutionException e) {
-			fail();
-		} catch (final NotHandledException e) {
-			assertTrue(true);
-		}
-		try {
-			command.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-		namedHandleObject = contextService.getContext("context");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-		namedHandleObject = contextService.getContext("scope");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-
-		getBundle();
-
-		assertTrue("monkey".equals(bindingService.getActiveScheme().getId()));
-		found = false;
-		bindings = bindingService.getBindings();
-		if (bindings != null) {
-			for (int i = 0; i < bindings.length; i++) {
-				final Binding binding = bindings[i];
-				if ("monkey".equals(binding.getSchemeId())
-						&& IContextIds.CONTEXT_ID_WINDOW.equals(binding
-								.getContextId())
-						&& "monkey".equals(binding.getParameterizedCommand()
-								.getId()) && binding.getPlatform() == null
-						&& binding.getLocale() == null
-						&& binding.getType() == Binding.SYSTEM
-						&& triggerSequence.equals(binding.getTriggerSequence())) {
-					found = true;
-
-				}
-			}
-		}
-		assertTrue(found);
-		namedHandleObject = bindingService.getScheme("monkey");
-		try {
-			assertTrue("Monkey".equals(namedHandleObject.getName()));
-		} catch (final NotDefinedException e) {
-			fail();
-		}
-		command = commandService.getCommand("monkey");
-		try {
-			command.execute(new ExecutionEvent());
-		} catch (final ExecutionException e) {
-			fail();
-		} catch (final NotHandledException e) {
-			fail();
-		}
-		try {
-			assertEquals("Monkey", command.getName());
-		} catch (final NotDefinedException e) {
-			fail();
-		}
-		namedHandleObject = commandService.getCommand("monkey");
-		try {
-			assertTrue("Monkey".equals(namedHandleObject.getName()));
-		} catch (final NotDefinedException e) {
-			fail();
-		}
-		namedHandleObject = contextService.getContext("context");
-		try {
-			assertTrue("Monkey".equals(namedHandleObject.getName()));
-		} catch (final NotDefinedException e) {
-			fail();
-		}
-		namedHandleObject = contextService.getContext("scope");
-		try {
-			assertTrue("Monkey".equals(namedHandleObject.getName()));
-		} catch (final NotDefinedException e) {
-			fail();
-		}
-
-		removeBundle();
-
-		assertTrue(!"monkey".equals(bindingService.getActiveScheme().getId()));
-		found = false;
-		bindings = bindingService.getBindings();
-		if (bindings != null) {
-			for (int i = 0; i < bindings.length; i++) {
-				final Binding binding = bindings[i];
-				if ("monkey".equals(binding.getSchemeId())
-						&& IContextIds.CONTEXT_ID_WINDOW.equals(binding
-								.getContextId())
-						&& "monkey".equals(binding.getParameterizedCommand()
-								.getId()) && binding.getPlatform() == null
-						&& binding.getLocale() == null
-						&& binding.getType() == Binding.SYSTEM
-						&& triggerSequence.equals(binding.getTriggerSequence())) {
-					found = true;
-
-				}
-			}
-		}
-		assertTrue(!found);
-		namedHandleObject = bindingService.getScheme("monkey");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-		namedHandleObject = commandService.getCategory("monkey");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-		command = commandService.getCommand("monkey");
-		try {
-			command.execute(new ExecutionEvent());
-			fail();
-		} catch (final ExecutionException e) {
-			fail();
-		} catch (final NotHandledException e) {
-			assertTrue(true);
-		}
-		try {
-			command.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-		namedHandleObject = contextService.getContext("context");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-		namedHandleObject = contextService.getContext("scope");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ContextsExtensionDynamicTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ContextsExtensionDynamicTest.java
deleted file mode 100644
index 7d3f0dd..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ContextsExtensionDynamicTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.core.commands.common.NamedHandleObject;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-
-/**
- * Tests whether the "org.eclipse.ui.contexts" extension point can be added and
- * removed dynamically.
- * 
- * @since 3.1.1
- */
-public final class ContextsExtensionDynamicTest extends DynamicTestCase {
-
-	/**
-	 * Constructs a new instance of <code>ContextsExtensionDynamicTest</code>.
-	 * 
-	 * @param testName
-	 *            The name of the test; may be <code>null</code>.
-	 */
-	public ContextsExtensionDynamicTest(final String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Returns the full-qualified identifier of the extension to be tested.
-	 * 
-	 * @return The extension identifier; never <code>null</code>.
-	 */
-	protected final String getExtensionId() {
-		return "contextsExtensionDynamicTest.testDynamicContextAddition";
-	}
-
-	/**
-	 * Returns the unqualified identifier of the extension point to be tested.
-	 * 
-	 * @return The extension point identifier; never <code>null</code>.
-	 */
-	protected final String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_CONTEXTS;
-	}
-
-	/**
-	 * Returns the relative location of the folder on disk containing the
-	 * plugin.xml file.
-	 * 
-	 * @return The relative install location; never <code>null</code>.
-	 */
-	protected final String getInstallLocation() {
-		return "data/org.eclipse.contextsExtensionDynamicTest";
-	}
-
-	/**
-	 * Tests whether the items defined in the extension point can be added and
-	 * removed dynamically. It tests that the data doesn't exist, and then loads
-	 * the extension. It tests that the data then exists, and unloads the
-	 * extension. It tests that the data then doesn't exist.
-	 */
-	public final void testContexts() {
-		final IContextService service = (IContextService) getWorkbench()
-				.getAdapter(IContextService.class);
-		NamedHandleObject namedHandleObject;
-
-		namedHandleObject = service.getContext("monkey");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-
-		getBundle();
-
-		namedHandleObject = service.getContext("monkey");
-		try {
-			assertTrue("Monkey".equals(namedHandleObject.getName()));
-		} catch (final NotDefinedException e) {
-			fail();
-		}
-
-		removeBundle();
-
-		namedHandleObject = service.getContext("monkey");
-		try {
-			namedHandleObject.getName();
-			fail();
-		} catch (final NotDefinedException e) {
-			assertTrue(true);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DecoratorTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DecoratorTests.java
deleted file mode 100644
index 85d8f7f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DecoratorTests.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.decorators.DecoratorDefinition;
-import org.eclipse.ui.internal.decorators.DecoratorManager;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-
-/**
- * @since 3.1
- */
-public class DecoratorTests extends DynamicTestCase {
-	
-	public static final String FULL1 = "fullDecorator1";
-	public static final String LIGHT1 = "lightDecorator1";
-	public static final String LIGHT2 = "lightDecorator2";
-
-	/**
-	 * @param testName
-	 */
-	public DecoratorTests(String testName) {
-		super(testName);
-	}
-	
-	public void testDecorators() {
-		assertFalse(hasDecorator(FULL1));
-		assertFalse(hasDecorator(LIGHT1));
-		assertFalse(hasDecorator(LIGHT2));
-		getBundle();
-		assertTrue(hasDecorator(FULL1));
-		assertTrue(hasDecorator(LIGHT1));
-		assertTrue(hasDecorator(LIGHT2));
-		removeBundle();
-		assertFalse(hasDecorator(FULL1));
-		assertFalse(hasDecorator(LIGHT1));
-		assertFalse(hasDecorator(LIGHT2));
-	}
-	
-	public boolean hasDecorator(String id) {
-		DecoratorManager manager = WorkbenchPlugin.getDefault().getDecoratorManager();
-		DecoratorDefinition [] definitions = manager.getAllDecoratorDefinitions();
-		for (int i = 0; i < definitions.length; i++) {
-			if (definitions[i].getId().equals(id))
-				return true;
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {
-		return "newDecorator1.testDynamicDecoratorAddition";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_DECORATORS;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newDecorator1";
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getMarkerClass()
-	 */
-	protected String getMarkerClass() {
-		return "org.eclipse.ui.dynamic.DynamicLabelDecorator";
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicContributionTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicContributionTest.java
deleted file mode 100644
index a90ed90..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicContributionTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.eclipse.ui.internal.util.BundleUtility;
-import org.eclipse.ui.menus.IMenuService;
-
-/**
- * @since 3.5
- */
-public class DynamicContributionTest extends DynamicTestCase {
-
-	public DynamicContributionTest(String testName) {
-		super(testName);
-	}
-
-	public void testMenuContribution() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		IMenuService menus = (IMenuService) window
-				.getService(IMenuService.class);
-		MenuManager manager = new MenuManager();
-		try {
-			menus.populateContributionManager(manager,
-					"popup:org.eclipse.newDynamicMenuContribution");
-			assertEquals(0, manager.getSize());
-			getBundle();
-			assertEquals(1, manager.getSize());
-			assertFalse(BundleUtility
-					.isActive("org.eclipse.newDynamicMenuContribution"));
-			manager.createContextMenu(window.getShell());
-			manager.updateAll(true);
-			assertTrue(BundleUtility
-					.isActive("org.eclipse.newDynamicMenuContribution"));
-		} finally {
-			menus.releaseContributions(manager);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {
-		return "menu.dynamic.contribution";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_MENUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newDynamicMenuContribution";
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicPluginsTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicPluginsTestSuite.java
deleted file mode 100644
index 88b20bc..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicPluginsTestSuite.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Test suite for dynamic plug-in support.
- */
-public class DynamicPluginsTestSuite extends TestSuite {
-    /**
-     * Returns the suite.  This is required to
-     * use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new DynamicPluginsTestSuite();
-    }
-
-	/**
-	 * Construct the test suite.
-	 */
-	public DynamicPluginsTestSuite() {
-		addTest(new TestSuite(StatusHandlerTests.class));
-		addTest(new TestSuite(
-				AcceleratorConfigurationsExtensionDynamicTest.class));
-		addTest(new TestSuite(AcceleratorScopesExtensionDynamicTest.class));
-		addTest(new TestSuite(ActionDefinitionsExtensionDynamicTest.class));
-	    addTest(new TestSuite(ActionSetTests.class));
-		addTest(new TestSuite(ActivitySupportTests.class));
-		addTest(new TestSuite(BindingsExtensionDynamicTest.class));
-		addTest(new TestSuite(BrowserTests.class));
-		addTest(new TestSuite(CommandsExtensionDynamicTest.class));
-		addTest(new TestSuite(ContextsExtensionDynamicTest.class));
-		addTest(new TestSuite(HandlersExtensionDynamicTest.class));
-		addTest(new TestSuite(PreferencePageTests.class));
-		addTest(new TestSuite(KeywordTests.class));
-		addTest(new TestSuite(PropertyPageTests.class));
-		addTest(new TestSuite(HelpSupportTests.class));
-		addTest(new TestSuite(EncodingTests.class));
-		addTest(new TestSuite(DecoratorTests.class));
-		addTest(new TestSuite(StartupTests.class));
-		addTest(new TestSuite(EditorTests.class));
-		addTest(new TestSuite(IntroTests.class));
-		addTest(new TestSuite(PerspectiveTests.class));
-		addTest(new TestSuite(ViewTests.class));
-		addTest(new TestSuite(NewWizardTests.class));
-		addTest(new TestSuite(ObjectContributionTests.class));
-		addTest(new TestSuite(WorkingSetTests.class));
-		addTest(new TestSuite(DynamicSupportTests.class));
-		addTest(new TestSuite(DynamicContributionTest.class));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicSupportTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicSupportTests.java
deleted file mode 100644
index 4bde492e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicSupportTests.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.WeakReference;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker;
-import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;
-import org.eclipse.ui.tests.leaks.LeakTests;
-
-/**
- * @since 3.1
- */
-public class DynamicSupportTests extends TestCase {
-
-	private IExtensionTracker tracker;
-	private IExtension e1, e2;
-	private Object o1, o2;
-
-	/**
-	 * @param name
-	 */
-	public DynamicSupportTests(String name) {
-		super(name);
-	}
-	
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-		tracker = new ExtensionTracker();		
-		IExtension [] elements = Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.ui.views").getExtensions();
-		assertNotNull(elements);
-		assertFalse(elements.length < 2);
-		e1 = elements[0];
-		e2 = elements[1];
-		
-		o1 = new Object();
-		o2 = new WeakReference(o1); 
-	}
-	
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		((ExtensionTracker)tracker).close();
-	}
-	
-	public void testConfigurationElementTracker1() {
-		tracker.registerObject(e1, o1, IExtensionTracker.REF_WEAK);
-		Object [] results = tracker.getObjects(e1);
-		assertNotNull(results);
-		assertEquals(1, results.length);
-		assertEquals(o1, results[0]);
-	}
-	
-	public void testConfigurationElementTracker2() throws Exception {
-		tracker.registerObject(e1, o1, IExtensionTracker.REF_WEAK);
-		ReferenceQueue queue = new ReferenceQueue();
-		WeakReference ref = new WeakReference(o1, queue);
-		o1 = null;
-		LeakTests.checkRef(queue, ref);
-		Object [] results = tracker.getObjects(e1);
-		assertNotNull(results);
-		assertEquals(0, results.length);
-	}
-	
-	public void testConfigurationElementTracker3() {
-		tracker.registerObject(e2, o2, IExtensionTracker.REF_WEAK);
-		Object [] results = tracker.getObjects(e2);
-		assertNotNull(results);
-		assertEquals(1, results.length);
-		assertEquals(o2, results[0]);
-	}
-	
-	public void testConfigurationElementTracker4() throws Exception {
-		tracker.registerObject(e1, o1, IExtensionTracker.REF_STRONG);
-		ReferenceQueue queue = new ReferenceQueue();
-		WeakReference ref = new WeakReference(o1, queue);
-		o1 = null;
-		try {
-			LeakTests.checkRef(queue, ref);
-			fail("Shouldn't have enqueued the ref");
-		}
-		catch (Throwable e) {
-			//wont be enqueued
-		}
-		Object [] results = tracker.getObjects(e1);
-		assertNotNull(results);
-		assertEquals(1, results.length);
-		assertEquals(ref.get(), results[0]);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicTestCase.java
deleted file mode 100644
index 0d4edb2..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicTestCase.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.WeakReference;
-
-import org.eclipse.core.runtime.IExtensionDelta;
-import org.eclipse.core.runtime.IRegistryChangeEvent;
-import org.eclipse.core.runtime.IRegistryChangeListener;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.tests.leaks.LeakTests;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleException;
-
-/**
- * Baseclass for all dynamic tests.
- * 
- * @since 3.1
- */
-public abstract class DynamicTestCase extends UITestCase implements
-		IRegistryChangeListener {
-
-	private volatile boolean addedRecieved;
-
-	private Bundle newBundle;
-
-	private volatile boolean removedRecieved;
-	
-	private WeakReference addedDelta;
-	
-	private WeakReference removedDelta;
-	
-	private ReferenceQueue queue;
-
-	/**
-	 * @param testName
-	 */
-	public DynamicTestCase(String testName) {
-		super(testName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.util.UITestCase#doTearDown()
-	 */
-	protected void doTearDown() throws Exception {
-		super.doTearDown();
-		try {
-			removeBundle();
-		}
-		finally {
-			Platform.getExtensionRegistry().removeRegistryChangeListener(this);
-			queue = null;
-		}
-	}
-
-	/**
-	 * Get the bundle for this test.
-	 * 
-	 * @return the bundle for this test
-	 */
-	protected final Bundle getBundle() {
-		if (newBundle == null) {
-			Platform.getExtensionRegistry().addRegistryChangeListener(this);
-			reset();
-			queue = new ReferenceQueue();
-			// Just try to find the new perspective. Don't actually try to
-			// do anything with it as the class it refers to does not exist.
-			try {
-				newBundle = DynamicUtils.installPlugin(getInstallLocation());
-			} catch (Exception e) {
-				fail(e.getMessage());
-			}
-
-			long startTime = System.currentTimeMillis();
-			long potentialEndTime = startTime + 5000;
-			boolean timeToFail = false;
-			while (!hasAddedEventPropagated() && !timeToFail) {
-				processEvents();
-				timeToFail = System.currentTimeMillis() > potentialEndTime;
-     			Thread.yield();
-			}
-			assertTrue("Expected ADDED event did not arrive in time", hasAddedEventPropagated());
-			try {
-				LeakTests.checkRef(queue, addedDelta);
-			} catch (IllegalArgumentException e1) {
-				e1.printStackTrace();
-			} catch (InterruptedException e1) {
-				e1.printStackTrace();
-			}
-			processEvents();
-			Platform.getExtensionRegistry().removeRegistryChangeListener(this);
-		}
-		return newBundle;
-	}
-
-	/**
-	 * Return the namespace of the plugin that defines the extension point being
-	 * tested. Default is "org.eclipse.ui".
-	 * 
-	 * @return the namespace of the declaring plugin
-	 */
-	protected String getDeclaringNamespace() {
-		return WorkbenchPlugin.PI_WORKBENCH;
-	}
-
-	/**
-	 * Return the id of the extension to be tested.
-	 * 
-	 * @return the id of the extension to be tested
-	 */
-	protected abstract String getExtensionId();
-
-	/**
-	 * Return the name of the extension point that is being tested.
-	 * 
-	 * @return the extension point being tested
-	 */
-	protected abstract String getExtensionPoint();
-
-	/**
-	 * Return the install location of the bundle to test.
-	 * 
-	 * @return the install location of the bundle to test
-	 */
-	protected abstract String getInstallLocation();
-	
-	/**
-	 * Return a <code>Class</code> that we know to be in teh bundle to test.
-	 * 
-	 * @return a <code>Class</code> that we know to be in teh bundle to test.  May be <code>null</code>.
-	 * @since 3.1
-	 */
-	protected String getMarkerClass() {
-		return null;
-	}
-	
-	/**
-	 * Tests to ensure that the marker class is released when the bundle is unloaded.
-	 * If <code>getMarkerClass()</code> returns <code>null</code> then this method 
-	 * will always succeed.
-	 * 
-	 * @throws Exception
-	 * @since 3.1
-	 */
-	public void testClass() throws Exception {	
-		String className = getMarkerClass();
-		if (className == null)
-			return;		
-		
-		setName("testClass() for " + getClass().getName());
-		
-		Bundle bundle = getBundle();
-		
-		Class clazz = bundle.loadClass(className);
-		assertNotNull(clazz);
-		ReferenceQueue myQueue = new ReferenceQueue();
-		WeakReference ref = new WeakReference(clazz.getClassLoader(), myQueue);
-		clazz = null; //null our refs
-		bundle = null;
-		removeBundle();
-		LeakTests.checkRef(myQueue, ref);
-	}
-
-	/**
-	 * Return whether the bundle ADDED event has been recieved.
-	 * 
-	 * @return whether the bundle ADDED event has been recieved
-	 */
-	protected final boolean hasAddedEventPropagated() {
-		return addedRecieved;
-	}
-
-	/**
-	 * Return whether the bundle REMOVED event has been recieved.
-	 * 
-	 * @return whether the bundle REMOVED event has been recieved
-	 */
-	protected final boolean hasRemovedEventPropagated() {
-		return removedRecieved;
-	}
-
-	/**
-	 * This method will ensure recording of addition and removal of extensions
-	 * described by a combination of
-	 * {@link DynamicTestCase#getDeclaringNamespace()},
-	 * {@link DynamicTestCase#getExtensionPoint()}, and
-	 * {@link DynamicTestCase#getExtensionId()}.
-	 * 
-	 * Custom implementationss should ensure that addition and removal of the
-	 * target extension are recorded.
-	 * 
-	 * @see DynamicTestCase#setAddedEventPropagated(boolean)
-	 * @see DynamicTestCase#setRemovedEventPropagated(boolean)
-	 */
-	public void registryChanged(IRegistryChangeEvent event) {
-		IExtensionDelta delta = event.getExtensionDelta(
-				getDeclaringNamespace(), getExtensionPoint(), getExtensionId());
-		if (delta != null) {
-			if (delta.getKind() == IExtensionDelta.ADDED) {
-				addedDelta = new WeakReference(delta, queue);
-				setAddedEventPropagated(true);
-			}
-			else if (delta.getKind() == IExtensionDelta.REMOVED) {
-				removedDelta = new WeakReference(delta, queue);
-				setRemovedEventPropagated(true);
-			}
-		}
-	}
-
-	/**
-	 * Unload the bundle, if present.
-	 */
-	protected final void removeBundle() {
-		if (newBundle != null) {
-			Platform.getExtensionRegistry().addRegistryChangeListener(this);
-			queue = new ReferenceQueue();
-			try {
-				DynamicUtils.uninstallPlugin(newBundle);
-				long startTime = System.currentTimeMillis();
-				long potentialEndTime = startTime + 5000;
-				boolean timeToFail = false;
-				while (!hasRemovedEventPropagated() && !timeToFail) {
-					processEvents();
-					timeToFail = System.currentTimeMillis() > potentialEndTime;
-					Thread.yield();
-				}
-				assertTrue("Expected REMOVED event did not arrive in time", hasRemovedEventPropagated());
-				try {
-					LeakTests.checkRef(queue, removedDelta);
-				} catch (IllegalArgumentException e1) {
-					e1.printStackTrace();
-				} catch (InterruptedException e1) {
-					e1.printStackTrace();
-				}
-			} catch (BundleException e) {
-				fail(e.getMessage());
-			} finally {
-				newBundle = null;
-			}
-			processEvents();
-			Platform.getExtensionRegistry().removeRegistryChangeListener(this);
-		}
-	}
-
-	/**
-	 * Reset the added/removed flags.
-	 */
-	private void reset() {
-		addedDelta = null;
-		removedDelta = null;
-		setAddedEventPropagated(false);
-		setRemovedEventPropagated(false);
-	}
-
-	/**
-	 * Set whether the bundle ADDED event has been recieved.
-	 * 
-	 * @param added
-	 *            whether the bundle ADDED event has been recieved
-	 */
-	protected final void setAddedEventPropagated(boolean added) {
-		this.addedRecieved = added;
-	}
-
-	/**
-	 * Set whether the bundle REMOVED event has been recieved.
-	 * 
-	 * @param added
-	 *            whether the bundle REMOVED event has been recieved
-	 */
-	protected final void setRemovedEventPropagated(boolean removed) {
-		this.removedRecieved = removed;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicTestType.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicTestType.java
deleted file mode 100644
index d47fdbc..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicTestType.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.dynamicplugins;
-
-/**
- * DynamicTestType is a type used for contributing property pages in the
- * dynamic tests.
- * @since 3.2
- *
- */
-public class DynamicTestType {
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public DynamicTestType() {
-		super();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicUtils.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicUtils.java
deleted file mode 100644
index 2771c8d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/DynamicUtils.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import java.io.IOException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ui.tests.TestPlugin;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleException;
-
-public class DynamicUtils {
-
-    public static final Bundle installPlugin(String pluginName)
-            throws IOException, BundleException {
-        // Programmatically install a new plugin
-        TestPlugin plugin = TestPlugin.getDefault();
-        if (plugin == null)
-            throw new IllegalStateException(
-                    "TestPlugin default reference is null");
-        String pluginLocation = null;
-        URL dataURL = Platform.resolve(plugin.getBundle().getEntry(pluginName));
-        pluginLocation = "reference:" + dataURL.toExternalForm();
-        return TestInstallUtil.installBundle(pluginLocation);
-    }
-
-    public static void uninstallPlugin(Bundle bundle) throws BundleException {
-        TestInstallUtil.uninstallBundle(bundle);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/EditorTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/EditorTests.java
deleted file mode 100644
index afe9a42..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/EditorTests.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import java.io.ByteArrayInputStream;
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.WeakReference;
-
-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.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.eclipse.ui.tests.leaks.LeakTests;
-
-/**
- * @since 3.1
- */
-public class EditorTests extends DynamicTestCase {
-
-	private static final String EDITOR_ID = "org.eclipse.newEditor1.newEditor1";
-	/**
-	 * @param testName
-	 */
-	public EditorTests(String testName) {
-		super(testName);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {
-		return "newEditor1.testDynamicEditorAddition";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_EDITOR;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newEditor1";
-	}
-	
-	public void testEditorClosure() throws CoreException {
-		IWorkbenchWindow window = openTestWindow(IDE.RESOURCE_PERSPECTIVE_ID);
-		IFile file = getFile();
-		getBundle();
-				
-		ReferenceQueue queue = new ReferenceQueue();
-		IEditorPart part = IDE.openEditor(window.getActivePage(), file, EDITOR_ID);
-		WeakReference ref = new WeakReference(part, queue);
-        assertNotNull(part);
-        part = null; //null the reference
-
-		removeBundle();
-		try {
-			LeakTests.checkRef(queue, ref);
-		} catch (Exception e) {
-			fail(e.getMessage());
-		} 
-		
-        assertEquals(0, window.getActivePage().getEditors().length);		
-	}
-
-	public void testEditorProperties() {
-		IEditorRegistry registry = WorkbenchPlugin.getDefault().getEditorRegistry();
-		
-		assertNull(registry.findEditor(EDITOR_ID));
-		getBundle();
-		IEditorDescriptor desc = registry.findEditor(EDITOR_ID);
-		assertNotNull(desc);
-	    
-		testEditorProperties(desc);
-		removeBundle();	
-		assertNull(registry.findEditor(EDITOR_ID));
-		try {
-			testEditorProperties(desc);
-			fail();		
-		}
-		catch (RuntimeException e) {			
-		}
-	}
-	
-	/**
-	 * @param desc
-	 */
-	private void testEditorProperties(IEditorDescriptor desc) {
-		assertNotNull(desc.getId());
-		assertNotNull(desc.getLabel());
-		assertNotNull(desc.getImageDescriptor());
-	}
-
-	/**
-	 * 
-	 */
-	private IFile getFile() throws CoreException {
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        IProject testProject = workspace.getRoot().getProject(getName());
-        testProject.create(null);
-        testProject.open(null);        
-
-        IFile iFile = testProject.getFile("someFile");
-        iFile.create(new ByteArrayInputStream(new byte[] { '\n' }), true, null);
-        return iFile;
-	}	
-	
-	
-	protected String getMarkerClass() {
-		return "org.eclipse.ui.dynamic.DynamicEditor";
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/EncodingTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/EncodingTests.java
deleted file mode 100644
index b87562b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/EncodingTests.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.ui.WorkbenchEncoding;
-import org.eclipse.ui.ide.IDEEncoding;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-
-/**
- * @since 3.1
- */
-public class EncodingTests extends DynamicTestCase {
-
-	private static final String ENCODING = "Cp1257";
-	/**
-	 * @param testName
-	 */
-	public EncodingTests(String testName) {
-		super(testName);
-		// TODO Auto-generated constructor stub
-	}
-
-	public void testWorkbenchEncodings() {
-		assertFalse(WorkbenchEncoding.getDefinedEncodings().contains(ENCODING));
-		getBundle();
-		assertTrue(WorkbenchEncoding.getDefinedEncodings().contains(ENCODING));
-		removeBundle();
-		assertFalse(WorkbenchEncoding.getDefinedEncodings().contains(ENCODING));
-	}
-	
-	public void testIDEEncodings() {
-		assertFalse(IDEEncoding.getIDEEncodings().contains(ENCODING));
-		getBundle();
-		assertTrue(IDEEncoding.getIDEEncodings().contains(ENCODING));
-		removeBundle();
-		assertFalse(IDEEncoding.getIDEEncodings().contains(ENCODING));
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {
-		return "newEncoding1.testDynamicEncodingAddition";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_ENCODINGS;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newEncoding1";
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/HandlersExtensionDynamicTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/HandlersExtensionDynamicTest.java
deleted file mode 100644
index 4b8ff19..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/HandlersExtensionDynamicTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.NotHandledException;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-
-/**
- * Tests whether the "org.eclipse.ui.handlers" extension point can be added and
- * removed dynamically.
- * 
- * @since 3.1.1
- */
-public final class HandlersExtensionDynamicTest extends DynamicTestCase {
-
-	/**
-	 * Constructs a new instance of <code>HandlersExtensionDynamicTest</code>.
-	 * 
-	 * @param testName
-	 *            The name of the test; may be <code>null</code>.
-	 */
-	public HandlersExtensionDynamicTest(final String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Returns the full-qualified identifier of the extension to be tested.
-	 * 
-	 * @return The extension identifier; never <code>null</code>.
-	 */
-	protected final String getExtensionId() {
-		return "handlersExtensionDynamicTest.testDynamicHandlerAddition";
-	}
-
-	/**
-	 * Returns the unqualified identifier of the extension point to be tested.
-	 * 
-	 * @return The extension point identifier; never <code>null</code>.
-	 */
-	protected final String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_HANDLERS;
-	}
-
-	/**
-	 * Returns the relative location of the folder on disk containing the
-	 * plugin.xml file.
-	 * 
-	 * @return The relative install location; never <code>null</code>.
-	 */
-	protected final String getInstallLocation() {
-		return "data/org.eclipse.handlersExtensionDynamicTest";
-	}
-
-	/**
-	 * Tests whether the items defined in the extension point can be added and
-	 * removed dynamically. It tests that the data doesn't exist, and then loads
-	 * the extension. It tests that the data then exists, and unloads the
-	 * extension. It tests that the data then doesn't exist.
-	 */
-	public final void testHandlers() {
-		final ICommandService commandService = (ICommandService) getWorkbench()
-				.getAdapter(ICommandService.class);
-		Command command;
-
-		command = commandService.getCommand("monkey");
-		try {
-			command.execute(new ExecutionEvent());
-			fail();
-		} catch (final ExecutionException e) {
-			fail();
-		} catch (final NotHandledException e) {
-			assertTrue(true);
-		}
-
-		getBundle();
-
-		command = commandService.getCommand("monkey");
-		try {
-			command.execute(new ExecutionEvent());
-		} catch (final ExecutionException e) {
-			fail();
-		} catch (final NotHandledException e) {
-			fail();
-		}
-
-		removeBundle();
-
-		command = commandService.getCommand("monkey");
-		try {
-			command.execute(new ExecutionEvent());
-			fail();
-		} catch (final ExecutionException e) {
-			fail();
-		} catch (final NotHandledException e) {
-			assertTrue(true);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/HelpSupportTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/HelpSupportTests.java
deleted file mode 100644
index 5ff5d84..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/HelpSupportTests.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.ui.internal.help.WorkbenchHelpSystem;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-
-/**
- * @since 3.1
- */
-public class HelpSupportTests extends DynamicTestCase {
-
-	/**
-	 * @param testName
-	 */
-	public HelpSupportTests(String testName) {
-		super(testName);
-	}
-
-	public void testHelpSupport() {
-		WorkbenchHelpSystem help = WorkbenchHelpSystem.getInstance();
-		help.setDesiredHelpSystemId(getExtensionId());
-		assertFalse(help.hasHelpUI());
-		
-		getBundle();
-		help.dispose();
-		assertTrue(help.hasHelpUI());
-		
-		removeBundle();
-		help.dispose();		
-		assertFalse(help.hasHelpUI());
-		
-		help.setDesiredHelpSystemId(null);		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {
-		return "newHelpSupport1.testDynamicHelpSupportAddition";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_HELPSUPPORT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newHelpSupport1";
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getMarkerClass()
-	 */
-	protected String getMarkerClass() {
-		return "org.eclipse.ui.dynamic.DynamicHelpSupport";
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/IntroTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/IntroTests.java
deleted file mode 100644
index d15cf45..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/IntroTests.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.WeakReference;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.Workbench;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.intro.IIntroDescriptor;
-import org.eclipse.ui.internal.intro.IIntroRegistry;
-import org.eclipse.ui.internal.intro.IntroDescriptor;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.eclipse.ui.intro.IIntroPart;
-import org.eclipse.ui.tests.leaks.LeakTests;
-
-/**
- * @since 3.1
- */
-public class IntroTests extends DynamicTestCase {
-
-	private static final String PRODUCT_ID = "org.eclipse.ui.tests.someProduct";
-	private static final String INTRO_ID = "org.eclipse.newIntro1.newIntro1";
-	private IntroDescriptor oldDesc;
-	private IWorkbenchWindow window;
-	/**
-	 * @param testName
-	 */
-	public IntroTests(String testName) {
-		super(testName);
-	}
-	
-	public void testIntroClosure() {	
-		getBundle();
-		Workbench workbench = Workbench.getInstance();
-        IntroDescriptor testDesc = (IntroDescriptor) WorkbenchPlugin
-        .getDefault().getIntroRegistry().getIntro(
-        		INTRO_ID);
-        workbench.setIntroDescriptor(testDesc);
-
-		ReferenceQueue queue = new ReferenceQueue();
-		IIntroPart intro = workbench.getIntroManager().showIntro(window, false);
-		WeakReference ref = new WeakReference(intro, queue);
-        assertNotNull(intro);
-        intro = null; //null the reference
-        removeBundle();
-        try {
-			LeakTests.checkRef(queue, ref);
-		} catch (Exception e) {
-			fail(e.getMessage());
-		} 
-        assertNull(workbench.getIntroManager().getIntro());
-	}
-	
-	public void testIntroProperties() {
-		IIntroRegistry registry = WorkbenchPlugin.getDefault().getIntroRegistry();
-		assertNull(registry.getIntroForProduct(PRODUCT_ID));
-		assertNull(registry.getIntro(INTRO_ID));
-		getBundle();
-		assertNotNull(registry.getIntroForProduct(PRODUCT_ID));
-		IIntroDescriptor desc = registry.getIntro(INTRO_ID);
-		assertNotNull(desc);
-		try {
-			testIntroProperties(desc);
-		}
-		catch (CoreException e) {
-			fail(e.getMessage());
-		}
-		removeBundle();	
-		assertNull(registry.getIntro(INTRO_ID));
-		assertNull(registry.getIntroForProduct(PRODUCT_ID));
-		try {
-			testIntroProperties(desc);
-			fail();		
-		}
-		catch (CoreException e) {
-			fail(e.getMessage());
-		}
-		catch (RuntimeException e) {			
-		}
-	}
-
-	/**
-	 * @param desc
-	 * @throws CoreException
-	 */
-	private void testIntroProperties(IIntroDescriptor desc) throws CoreException {
-		assertNotNull(desc.getId());
-		try {
-			assertNotNull(desc.createIntro());
-		}
-		catch (CoreException e) {
-			e.printStackTrace();
-			throw e;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {		
-		return "newIntro1.testDynamicIntroAddition";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_INTRO;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newIntro1";
-	}
-	
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.util.UITestCase#doSetUp()
-     */
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        oldDesc = Workbench.getInstance().getIntroDescriptor();
-        window = openTestWindow();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.util.UITestCase#doTearDown()
-     */
-    protected void doTearDown() throws Exception {
-        super.doTearDown();
-        Workbench.getInstance().setIntroDescriptor(oldDesc);
-    }    
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getMarkerClass()
-	 */
-	protected String getMarkerClass() {
-		return "org.eclipse.ui.dynamic.DynamicIntro";
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/KeywordTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/KeywordTests.java
deleted file mode 100644
index 1faeb09..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/KeywordTests.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.eclipse.ui.internal.registry.KeywordRegistry;
-
-/**
- * @since 3.1
- */
-public class KeywordTests extends DynamicTestCase {
-
-	private static final String ID_KEYWORD = "dynamicKeyword1";
-	public KeywordTests(String testName) {
-		super(testName);
-	}
-	
-	public void testKeywords() {
-		KeywordRegistry registry = KeywordRegistry.getInstance();
-		assertNull(registry.getKeywordLabel(ID_KEYWORD));
-		getBundle();
-		String label = registry.getKeywordLabel(ID_KEYWORD);
-		assertNotNull(label);
-		assertEquals(ID_KEYWORD, label);
-		removeBundle();
-		assertNull(registry.getKeywordLabel(ID_KEYWORD));
-	}
-
-	protected String getExtensionId() {
-		return "newKeyword1.testDynamicKeywordAddition";
-	}
-
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_KEYWORDS;
-	}
-
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newKeyword1";
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/MarkerSupportTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/MarkerSupportTests.java
deleted file mode 100644
index 41e3c6b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/MarkerSupportTests.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import java.util.Iterator;
-
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.views.markers.internal.MarkerGroup;
-import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
-import org.eclipse.ui.views.markers.internal.ProblemFilter;
-
-/**
- * Test the loading and unloading of the marker support components.
- * 
- * @since 3.2
- */
-public class MarkerSupportTests extends DynamicTestCase {
-
-	public static final String FILTER1 = "filter1";
-
-	public static final String FILTER2 = "filter2";
-
-	public static final String FILTER3 = "filter3";
-
-	public static final String DYNAMIC_CATEGORY = "dynamicCategory";
-
-	static final String DYNAMIC_PROBLEM_MARKER = "org.eclipse.ui.tests.dynamicTestMarker";
-
-	static final String PROBLEM_MARKER = "org.eclipse.core.resources.problemmarker";
-
-	/**
-	 * @param testName
-	 */
-	public MarkerSupportTests(String testName) {
-		super(testName);
-	}
-
-	public void testFilters() {
-		assertFalse(hasFilter(FILTER1));
-		assertFalse(hasFilter(FILTER2));
-		assertFalse(hasFilter(FILTER3));
-		getBundle();
-		assertTrue(hasFilter(FILTER1));
-		assertTrue(hasFilter(FILTER2));
-		assertTrue(hasFilter(FILTER3));
-		removeBundle();
-		assertFalse(hasFilter(FILTER1));
-		assertFalse(hasFilter(FILTER2));
-		assertFalse(hasFilter(FILTER3));
-	}
-
-	public void testMarkerGroup() {
-		assertFalse(hasMarkerGroup());
-		getBundle();
-		assertTrue(hasMarkerGroup());
-		removeBundle();
-		assertFalse(hasMarkerGroup());
-	}
-
-	public void testCategories() {
-		assertFalse(hasCategory());
-		getBundle();
-		assertTrue(hasCategory());
-		removeBundle();
-		assertFalse(hasCategory());
-	}
-
-	public void testHierarchies() {
-		assertFalse(hasHierarchy());
-		getBundle();
-		assertTrue(hasHierarchy());
-		removeBundle();
-		assertFalse(hasHierarchy());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getMarkerClass()
-	 */
-	protected String getMarkerClass() {
-		return "org.eclipse.ui.dynamic.markerSupport.DynamicTestsSubCategoryProvider";
-	}
-
-	/**
-	 * Return whether or not there is a hierarchy for the dynamic type or if it
-	 * is using the default.
-	 * 
-	 * @return
-	 */
-	private boolean hasHierarchy() {
-		return MarkerSupportRegistry.getInstance().getSorterFor(
-				DYNAMIC_PROBLEM_MARKER) != MarkerSupportRegistry.getInstance()
-				.getSorterFor(PROBLEM_MARKER);
-	}
-
-	private boolean hasMarkerGroup() {
-		Iterator groups = MarkerSupportRegistry.getInstance()
-		.getMarkerGroups().iterator();
-		
-		while (groups.hasNext()) {
-			MarkerGroup element = (MarkerGroup) groups.next();
-			if(element.getField().getDescription().equals("Dynamic Test Grouping"))
-				return true;
-		}
-		
-		return false;
-	}
-
-	/**
-	 * Return whether or not there is a filter for the dynamic category
-	 * 
-	 * @return
-	 */
-	private boolean hasCategory() {
-		return MarkerSupportRegistry.getInstance().getCategory(
-				DYNAMIC_PROBLEM_MARKER) != null;
-	}
-
-	/**
-	 * Return whether or not there is a filter for id.
-	 * 
-	 * @param id
-	 * @return
-	 */
-	private boolean hasFilter(String id) {
-		Iterator filters = MarkerSupportRegistry.getInstance()
-				.getRegisteredFilters().iterator();
-		while (filters.hasNext()) {
-			ProblemFilter filter = (ProblemFilter) filters.next();
-			if (id.equals(filter.getId()))
-				return true;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {
-		return "newProblemFilter.testDynamicFilterAddition";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return MarkerSupportRegistry.MARKER_SUPPORT;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newMarkerSupport";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getDeclaringNamespace()
-	 */
-	protected String getDeclaringNamespace() {
-		return IDEWorkbenchPlugin.IDE_WORKBENCH;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/NewWizardTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/NewWizardTests.java
deleted file mode 100644
index d2c3de1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/NewWizardTests.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.eclipse.ui.wizards.IWizardRegistry;
-import org.eclipse.ui.wizards.IWizardDescriptor;
-
-/**
- * @since 3.1
- */
-public class NewWizardTests extends DynamicTestCase {
-
-	private static final String WIZARD_ID = "org.eclipse.newNewWizard1.newNewWizard1";
-	
-	/**
-	 * 
-	 */
-	public NewWizardTests(String testName) {
-		super(testName);
-	}
-	
-	public void testNewWizardProperties() {
-		IWizardRegistry registry = WorkbenchPlugin.getDefault().getNewWizardRegistry();
-		assertNull(registry.findWizard(WIZARD_ID));
-		getBundle();
-		IWizardDescriptor wizard = registry.findWizard(WIZARD_ID);
-		assertNotNull(wizard);
-		testNewWizardProperties(wizard);
-		removeBundle();
-		assertNull(registry.findWizard(WIZARD_ID));
-		try {
-			testNewWizardProperties(wizard);
-			fail();
-		}
-		catch (RuntimeException e) {
-			//no-op
-		}
-	}
-	
-	/**
-	 * @param wizard
-	 */
-	private void testNewWizardProperties(IWizardDescriptor wizard) {
-		assertNotNull(wizard.getId());
-		assertNotNull(wizard.getDescription());
-		assertNotNull(wizard.getHelpHref());
-		assertNotNull(wizard.getDescriptionImage());
-		assertNotNull(wizard.getImageDescriptor());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {		
-		return "newNewWizard1.testDynamicNewWizardAddition";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_NEW;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newNewWizard1";
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getMarkerClass()
-	 */
-	protected String getMarkerClass() {
-		return "org.eclipse.ui.dynamic.DynamicWizard";
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ObjectContributionTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ObjectContributionTests.java
deleted file mode 100644
index 3891b9e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ObjectContributionTests.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import java.util.Random;
-
-import junit.framework.TestSuite;
-
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-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.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ObjectActionContributorManager;
-import org.eclipse.ui.internal.PopupMenuExtender;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-
-/**
- * @since 3.1
- */
-public class ObjectContributionTests extends DynamicTestCase {
-
-	private static final String GROUP_ID = "#OC";
-	private static final String OBJECT_ACTION_ID = "org.eclipse.newOC1";
-	private static final String VIEWER_ACTION_ID = "org.eclipse.newOC2";
-	
-	public static TestSuite suite() {
-		return new TestSuite(ObjectContributionTests.class);
-	}
-	
-	/**
-	 * @param testName
-	 */
-	public ObjectContributionTests(String testName) {
-		super(testName);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {
-		return "newOC1.testDynamicOCAddition";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_POPUP_MENU;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {		
-		return "data/org.eclipse.newOC1";
-	}
-	
-	public void testViewerContributions() {
-		IWorkbenchWindow window = openTestWindow(IDE.RESOURCE_PERSPECTIVE_ID);
-		IWorkbenchPart part = window.getActivePage().getActivePart();
-		MenuManager menu = new MenuManager();
-		resetViewerMenu(menu);
-		ISelectionProvider provider = new ISelectionProvider() {
-
-			public void addSelectionChangedListener(ISelectionChangedListener listener) {
-				
-			}
-
-			public ISelection getSelection() {
-				return new StructuredSelection(new Random());
-			}
-
-			public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-			}
-
-			public void setSelection(ISelection selection) {
-			}
-			
-		};
-		
-		PopupMenuExtender extender = new PopupMenuExtender(GROUP_ID, menu, provider, part);
-		extender.menuAboutToShow(menu);
-					
-		assertNull(menu.find(VIEWER_ACTION_ID));
-		resetViewerMenu(menu);
-		getBundle();
-		
-		extender.menuAboutToShow(menu);
-		assertNotNull(menu.find(VIEWER_ACTION_ID));
-		resetViewerMenu(menu);
-		removeBundle();
-		
-		extender.menuAboutToShow(menu);		
-		assertNull(menu.find(VIEWER_ACTION_ID));	
-		
-		extender.dispose();
-	}
-	
-	/**
-	 * @param menu
-	 */
-	private void resetViewerMenu(MenuManager menu) {
-		menu.removeAll();
-		menu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-		menu.add(new GroupMarker(GROUP_ID));
-	}
-
-	public void testObjectContribtions() {
-		IWorkbenchWindow window = openTestWindow(IDE.RESOURCE_PERSPECTIVE_ID);
-		IWorkbenchPart part = window.getActivePage().getActivePart();
-		ObjectActionContributorManager manager = ObjectActionContributorManager.getManager();
-		IMenuManager menu = new MenuManager();
-		ISelectionProvider provider = new ISelectionProvider() {
-
-			public void addSelectionChangedListener(ISelectionChangedListener listener) {
-				
-			}
-
-			public ISelection getSelection() {
-				return new StructuredSelection(new Random());
-			}
-
-			public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-			}
-
-			public void setSelection(ISelection selection) {
-			}
-			
-		};
-
-		manager.contributeObjectActions(part, menu, provider);		
-		assertNull(menu.find(OBJECT_ACTION_ID));
-		menu.removeAll();
-		getBundle();
-		
-		manager.contributeObjectActions(part, menu, provider);
-		assertNotNull(menu.find(OBJECT_ACTION_ID));
-		menu.removeAll();
-		removeBundle();
-		
-		manager.contributeObjectActions(part, menu, provider);		
-		assertNull(menu.find(OBJECT_ACTION_ID));
-		menu.removeAll();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getMarkerClass()
-	 */
-	protected String getMarkerClass() {
-		return "org.eclipse.ui.dynamic.MockObjectActionDelegate";
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/PerspectiveTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/PerspectiveTests.java
deleted file mode 100644
index 5c0f90f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/PerspectiveTests.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-
-/**
- * Tests to check the addition of a new perspective once the perspective
- * registry is loaded.
- */
-public class PerspectiveTests extends DynamicTestCase {
-
-	private static final String PERSPECTIVE_ID = "org.eclipse.newPerspective1.newPerspective1";
-
-	public PerspectiveTests(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Tests to ensure that the descriptor is added and removed with bundle
-	 * loading/unloading.
-	 */
-	public void testFindPerspectiveInRegistry() {
-		IPerspectiveRegistry reg = PlatformUI.getWorkbench()
-				.getPerspectiveRegistry();
-
-		assertNull(reg.findPerspectiveWithId(PERSPECTIVE_ID));
-
-		getBundle(); // ensure the bundle is loaded
-		assertNotNull(reg.findPerspectiveWithId(PERSPECTIVE_ID));
-
-		removeBundle(); // unload the bundle
-
-		assertNull(reg.findPerspectiveWithId(PERSPECTIVE_ID));
-	}
-
-	/**
-	 * Tests that the perspective is closed if it is the currently active
-	 * perspective.
-	 */
-	public void testPerspectiveClose1() {
-		IPerspectiveRegistry reg = PlatformUI.getWorkbench()
-				.getPerspectiveRegistry();
-
-		getBundle();
-		IPerspectiveDescriptor desc = reg.findPerspectiveWithId(PERSPECTIVE_ID);
-		assertNotNull(desc);
-
-		IWorkbenchWindow window = openTestWindow(IDE.RESOURCE_PERSPECTIVE_ID);
-		window.getActivePage().setPerspective(desc);
-
-		removeBundle();
-		assertNull(((WorkbenchPage) window.getActivePage())
-				.findPerspective(desc));
-		assertFalse(window.getActivePage().getPerspective().getId().equals(
-				desc.getId()));
-		assertEquals(IDE.RESOURCE_PERSPECTIVE_ID, window.getActivePage()
-				.getPerspective().getId());
-	}
-
-	/**
-	 * Tests that the perspective is closed if it is not the currently active
-	 * perspective.
-	 */
-	public void testPerspectiveClose2() {
-		IPerspectiveRegistry reg = PlatformUI.getWorkbench()
-				.getPerspectiveRegistry();
-
-		getBundle();
-		IPerspectiveDescriptor desc = reg.findPerspectiveWithId(PERSPECTIVE_ID);
-		assertNotNull(desc);
-
-		IWorkbenchWindow window = openTestWindow(PERSPECTIVE_ID);
-		window.getActivePage().setPerspective(
-				reg.findPerspectiveWithId(IDE.RESOURCE_PERSPECTIVE_ID));
-
-		removeBundle();
-		assertNull(((WorkbenchPage) window.getActivePage())
-				.findPerspective(desc));
-
-		assertFalse(window.getActivePage().getPerspective().getId().equals(
-				PERSPECTIVE_ID));
-		assertEquals(IDE.RESOURCE_PERSPECTIVE_ID, window.getActivePage()
-				.getPerspective().getId());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newPerspective1";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_PERSPECTIVES;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {
-		return "newPerspective1.testDynamicPerspectiveAddition";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getMarkerClass()
-	 */
-	protected String getMarkerClass() {
-		return "org.eclipse.ui.dynamic.DynamicPerspective";
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/PreferencePageTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/PreferencePageTests.java
deleted file mode 100644
index 80fdeaa..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/PreferencePageTests.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.dialogs.WorkbenchPreferenceNode;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-
-/**
- * @since 3.1
- */
-public class PreferencePageTests extends DynamicTestCase {
-
-	/**
-	 * @param testName
-	 */
-	public PreferencePageTests(String testName) {
-		super(testName);
-	}
-
-	public void testPreferences() {
-		PreferenceManager preferenceManager = PlatformUI.getWorkbench().getPreferenceManager();
-		assertNull(preferenceManager.find("dynamic.parentPage"));
-		assertNull(preferenceManager.find("dynamic.parentPage/dynamic.childPage"));
-		getBundle();
-		WorkbenchPreferenceNode node = (WorkbenchPreferenceNode) preferenceManager.find("dynamic.parentPage");
-		assertNotNull(node);
-		//make sure we have a page
-		node.createPage();
-		node = (WorkbenchPreferenceNode) preferenceManager.find("dynamic.parentPage/dynamic.childPage");
-		assertNotNull(node);
-		//make sure we have a page
-		node.createPage();
-		removeBundle();
-		assertNull(preferenceManager.find("dynamic.parentPage"));
-		assertNull(preferenceManager.find("dynamic.parentPage/dynamic.childPage"));		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {
-		return "newPreferencePage1.testDynamicPreferencePageAddition";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_PREFERENCES;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newPreferencePage1";
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getMarkerClass()
-	 */
-	protected String getMarkerClass() {
-		return "org.eclipse.ui.dynamic.DynamicPreferencePage";
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/PropertyPageTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/PropertyPageTests.java
deleted file mode 100644
index b121798..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/PropertyPageTests.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.ui.internal.dialogs.PropertyPageContributorManager;
-import org.eclipse.ui.internal.dialogs.PropertyPageManager;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-
-/**
- * @since 3.1
- */
-public class PropertyPageTests extends DynamicTestCase {
-
-	private static final String PROPERTYPAGE = "dynamicPropertyPage1";
-	/**
-	 * @param testName
-	 */
-	public PropertyPageTests(String testName) {
-		super(testName);
-	}
-
-
-	public void testPropertyPageCount() {
-		PropertyPageContributorManager manager = PropertyPageContributorManager.getManager();
-		int size = manager.getContributors().size();
-		getBundle();
-		assertEquals(size + 1, manager.getContributors().size());
-		removeBundle();
-		assertEquals(size, manager.getContributors().size());
-	}
-	
-	public void testPropertyPageContribution() {
-		PropertyPageContributorManager cManager = PropertyPageContributorManager.getManager();
-		PropertyPageManager manager; 
-		DynamicTestType type = new DynamicTestType();
-			
-		cManager.contribute(manager = new PropertyPageManager(), type);
-		assertNull(manager.find(PROPERTYPAGE));
-		getBundle();
-		cManager.contribute(manager = new PropertyPageManager(), type);
-		IPreferenceNode result = manager.find(PROPERTYPAGE);
-		assertNotNull(result);
-		result.createPage(); // muck around and ensure we've created some potential garbage
-		result.disposeResources();
-		removeBundle();
-		cManager.contribute(manager = new PropertyPageManager(), type);
-		assertNull(manager.find(PROPERTYPAGE));
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {
-		return "newPropertyPage1.testDynamicPropertyPageAddition";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_PROPERTY_PAGES;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newPropertyPage1";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getMarkerClass()
-	 */
-	protected String getMarkerClass() {
-		return "org.eclipse.ui.dynamic.DynamicPropertyPage";
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/StartupTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/StartupTests.java
deleted file mode 100644
index bdb8dac..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/StartupTests.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.osgi.framework.Bundle;
-
-/**
- * @since 3.1
- */
-public class StartupTests extends DynamicTestCase {
-	/**
-	 * @param testName
-	 */
-	public StartupTests(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Tests to ensure that the IStartup implementation in the bundle is run
-	 * when the bundle is loaded.
-	 * 
-	 * @throws ClassNotFoundException
-	 * @throws SecurityException
-	 * @throws NoSuchFieldException
-	 * @throws IllegalArgumentException
-	 * @throws IllegalAccessException
-	 */
-	public void testStartupRun() throws ClassNotFoundException,
-			SecurityException, NoSuchFieldException, IllegalArgumentException,
-			IllegalAccessException {
-		Bundle bundle = getBundle();
-		Class clazz = bundle.loadClass(getMarkerClass());
-		assertNotNull(clazz);
-		Field field = clazz.getDeclaredField("history");
-		assertNotNull(field);
-		assertTrue((field.getModifiers() & Modifier.STATIC) != 0);
-		// if the startup code has run then this will not be null - the early
-		// startup method sets this
-		assertNotNull(field.get(null));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {
-		return "newStartup1.testDynamicStartupAddition";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_STARTUP;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newStartup1";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getMarkerClass()
-	 */
-	protected String getMarkerClass() {
-		return "org.eclipse.ui.dynamic.DynamicStartup";
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/StatusHandlerTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/StatusHandlerTests.java
deleted file mode 100644
index f9a23bd..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/StatusHandlerTests.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.WeakReference;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.internal.statushandlers.StatusHandlerDescriptor;
-import org.eclipse.ui.internal.statushandlers.StatusHandlerRegistry;
-import org.eclipse.ui.statushandlers.AbstractStatusHandler;
-import org.eclipse.ui.statushandlers.StatusAdapter;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.tests.leaks.LeakTests;
-
-/**
- * Tests to ensure the addition and removal of new status handlers with dynamic
- * plug-ins.
- */
-public class StatusHandlerTests extends DynamicTestCase {
-
-	private static final String STATUS_HANDLER_ID1 = "org.eclipse.newStatusHandler1.newStatusHandler1";
-
-	private static final String STATUS_HANDLER_ID2 = "org.eclipse.newStatusHandler1.newStatusHandler2";
-
-	private static final String PLUGIN_PREFIX = "";
-
-	private static final String PLUGIN_PREFIX2 = "plugin";
-
-	/**
-	 * @param testName
-	 */
-	public StatusHandlerTests(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Tests to ensure that the status handlers are removed when the plugin is
-	 * unloaded.
-	 */
-	public void testStatusHandlerRemoval() throws CoreException {
-		getBundle();
-
-		StatusHandlerDescriptor statusHandlerDescriptor1 = StatusHandlerRegistry
-				.getDefault().getHandlerDescriptor(STATUS_HANDLER_ID1);
-		assertNotNull(statusHandlerDescriptor1);
-		AbstractStatusHandler statusHandler1 = statusHandlerDescriptor1
-				.getStatusHandler();
-		assertNotNull(statusHandler1);
-
-		statusHandler1.handle(new StatusAdapter(new Status(IStatus.ERROR,
-				PLUGIN_PREFIX2, "")), StatusManager.NONE);
-
-		ReferenceQueue queue = new ReferenceQueue();
-		ReferenceQueue queue2 = new ReferenceQueue();
-
-		WeakReference ref = new WeakReference(statusHandlerDescriptor1, queue);
-		WeakReference ref2 = new WeakReference(statusHandler1, queue2);
-
-		statusHandlerDescriptor1 = null; // null the reference
-		statusHandler1 = null; // null the reference
-
-		removeBundle();
-
-		try {
-			LeakTests.checkRef(queue, ref);
-			LeakTests.checkRef(queue2, ref2);
-		} catch (Exception e) {
-			fail(e.getMessage());
-		}
-
-		assertNull(StatusHandlerRegistry.getDefault().getHandlerDescriptor(
-				STATUS_HANDLER_ID1));
-	}
-
-	/**
-	 * Tests to ensure that the status handlers are removed when the plugin is
-	 * unloaded.
-	 */
-	public void testStatusHandlerRemoval2() throws CoreException {
-		getBundle();
-
-		ReferenceQueue queue = new ReferenceQueue();
-		ReferenceQueue queue2 = new ReferenceQueue();
-
-		List statusHandlerDescriptors = StatusHandlerRegistry.getDefault()
-				.getHandlerDescriptors(PLUGIN_PREFIX);
-
-		assertNotNull(statusHandlerDescriptors);
-
-		StatusHandlerDescriptor statusHandlerDescriptor1 = null;
-		for (Iterator it = statusHandlerDescriptors.iterator(); it.hasNext();) {
-			statusHandlerDescriptor1 = (StatusHandlerDescriptor) it.next();
-			if (statusHandlerDescriptor1.getId().equals(STATUS_HANDLER_ID2)) {
-				break;
-			}
-			statusHandlerDescriptor1 = null;
-		}
-
-		assertNotNull(statusHandlerDescriptor1);
-		AbstractStatusHandler statusHandler1 = statusHandlerDescriptor1
-				.getStatusHandler();
-		assertNotNull(statusHandler1);
-
-		statusHandler1.handle(new StatusAdapter(new Status(IStatus.ERROR,
-				PLUGIN_PREFIX2, "")), StatusManager.NONE);
-
-		WeakReference ref = new WeakReference(statusHandlerDescriptor1, queue);
-		WeakReference ref2 = new WeakReference(statusHandler1, queue2);
-
-		statusHandlerDescriptors = null;
-		statusHandlerDescriptor1 = null; // null the reference
-		statusHandler1 = null;
-
-		removeBundle();
-
-		try {
-			LeakTests.checkRef(queue, ref);
-			LeakTests.checkRef(queue2, ref2);
-		} catch (Exception e) {
-			fail(e.getMessage());
-		}
-
-		assertNull(StatusHandlerRegistry.getDefault().getHandlerDescriptor(
-				STATUS_HANDLER_ID1));
-	}
-
-	/**
-	 * Tests to ensure that the status handlers are removed when the plugin is
-	 * unloaded. Checks if the default product handlers are handled correctly.
-	 */
-	public void testProductBindingRemoval() throws CoreException {
-		getBundle();
-
-		ReferenceQueue queue = new ReferenceQueue();
-		ReferenceQueue queue2 = new ReferenceQueue();
-
-		StatusHandlerDescriptor productStatusHandlerDescriptor = StatusHandlerRegistry
-				.getDefault().getDefaultHandlerDescriptor();
-		assertNotNull(productStatusHandlerDescriptor);
-		AbstractStatusHandler productStatusHandler = productStatusHandlerDescriptor
-				.getStatusHandler();
-		assertNotNull(productStatusHandler);
-
-		productStatusHandler.handle(new StatusAdapter(new Status(IStatus.ERROR,
-				PLUGIN_PREFIX2, "")), StatusManager.NONE);
-
-		WeakReference ref = new WeakReference(productStatusHandlerDescriptor,
-				queue);
-		WeakReference ref2 = new WeakReference(productStatusHandler, queue2);
-
-		productStatusHandlerDescriptor = null; // null the reference
-		productStatusHandler = null;
-
-		removeBundle();
-
-		try {
-			LeakTests.checkRef(queue, ref);
-			LeakTests.checkRef(queue2, ref2);
-		} catch (Exception e) {
-			fail(e.getMessage());
-		}
-
-		assertNull(StatusHandlerRegistry.getDefault().getHandlerDescriptor(
-				STATUS_HANDLER_ID1));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {
-		return "newStatusHandler1.testDynamicStatusHandlerAddition";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return "statusHandlers";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newStatusHandler1";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getMarkerClass()
-	 */
-	protected String getMarkerClass() {
-		return "org.eclipse.ui.dynamic.DynamicStatusHandler";
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/TestInstallUtil.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/TestInstallUtil.java
deleted file mode 100644
index d521d73..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/TestInstallUtil.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import junit.framework.TestCase;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.FrameworkEvent;
-import org.osgi.framework.FrameworkListener;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.packageadmin.PackageAdmin;
-
-public class TestInstallUtil extends TestCase {
-    static BundleContext context;
-
-    public static void setContext(BundleContext newContext) {
-        context = newContext;
-    }
-
-    public static Bundle installBundle(String pluginLocation)
-            throws BundleException, IllegalStateException {
-        Bundle target = context.installBundle(pluginLocation);
-        int state = target.getState();
-        if (state != Bundle.INSTALLED)
-            throw new IllegalStateException("Bundle " + target
-                    + " is in a wrong state: " + state);
-        refreshPackages(new Bundle[] { target });
-        return target;
-    }
-
-    public static void uninstallBundle(Bundle target) throws BundleException {
-        target.uninstall();
-        refreshPackages(null);
-    }
-
-    public static void refreshPackages(Bundle[] bundles) {
-        ServiceReference packageAdminRef = context
-                .getServiceReference(PackageAdmin.class.getName());
-        PackageAdmin packageAdmin = null;
-        if (packageAdminRef != null) {
-            packageAdmin = (PackageAdmin) context.getService(packageAdminRef);
-            if (packageAdmin == null)
-                return;
-        }
-
-        final boolean[] flag = new boolean[] { false };
-        FrameworkListener listener = new FrameworkListener() {
-            public void frameworkEvent(FrameworkEvent event) {
-                if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED)
-                    synchronized (flag) {
-                        flag[0] = true;
-                        flag.notifyAll();
-                    }
-            }
-        };
-        context.addFrameworkListener(listener);
-        packageAdmin.refreshPackages(bundles);
-        synchronized (flag) {
-            while (!flag[0]) {
-                try {
-                    flag.wait();
-                } catch (InterruptedException e) {
-                }
-            }
-        }
-        context.removeFrameworkListener(listener);
-        context.ungetService(packageAdminRef);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ViewTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ViewTests.java
deleted file mode 100644
index 6bd526b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/ViewTests.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.dynamicplugins;
-
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.WeakReference;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.eclipse.ui.internal.registry.ViewRegistry;
-import org.eclipse.ui.tests.leaks.LeakTests;
-import org.eclipse.ui.views.IStickyViewDescriptor;
-import org.eclipse.ui.views.IViewCategory;
-import org.eclipse.ui.views.IViewDescriptor;
-import org.eclipse.ui.views.IViewRegistry;
-
-/**
- * Tests to ensure the addition of new views with dynamic plug-ins.
- */
-public class ViewTests extends DynamicTestCase {
-
-    private static final String VIEW_ID1 = "org.eclipse.newView1.newView1";
-    private static final String VIEW_ID2 = "org.eclipse.newView1.newView2";
-    private static final String CATEGORY_ID = "org.eclipse.newView1.newCategory1";
-    
-	public ViewTests(String testName) {
-        super(testName);
-    }
-    
-	public void testViewClosure() throws CoreException {
-		IWorkbenchWindow window = openTestWindow(IDE.RESOURCE_PERSPECTIVE_ID);
-		getBundle();
-				
-		ReferenceQueue queue = new ReferenceQueue();
-		IViewPart part = window.getActivePage().showView(VIEW_ID1);
-		// we need to ensure that the view is closed in all open perspectives but this is not currently possible.
-		// window.getActivePage().setPerspective(WorkbenchPlugin.getDefault().getPerspectiveRegistry().findPerspectiveWithId(EmptyPerspective.PERSP_ID2));
-		WeakReference ref = new WeakReference(part, queue);
-        assertNotNull(part);
-        part = null; //null the reference
-
-		removeBundle();
-		try {
-			LeakTests.checkRef(queue, ref);
-		} catch (Exception e) {
-			fail(e.getMessage());
-		} 
-		
-        assertNull(window.getActivePage().findView(VIEW_ID1));		
-	}
-    
-    public void testViewWithoutCategory() {
-    		IViewRegistry registry = WorkbenchPlugin.getDefault().getViewRegistry();
-		
-		assertNull(registry.find(VIEW_ID2));
-		getBundle();
-		IViewDescriptor desc = registry.find(VIEW_ID2);
-		assertNotNull(desc);
-	    
-		testViewProperties(desc);
-		removeBundle();	
-		assertNull(registry.find(VIEW_ID2));
-		try {
-			testViewProperties(desc);
-			fail();		
-		}
-		catch (RuntimeException e) {	
-			// no-op
-		}
-    }
-
-	public void testViewWithCategory() {
-		IViewRegistry registry = WorkbenchPlugin.getDefault().getViewRegistry();
-		
-		assertNull(registry.find(VIEW_ID1));
-		getBundle();
-		IViewDescriptor desc = registry.find(VIEW_ID1);
-		assertNotNull(desc);
-	    
-		testViewProperties(desc);
-		removeBundle();	
-		assertNull(registry.find(VIEW_ID1));
-		try {
-			testViewProperties(desc);
-			fail();		
-		}
-		catch (RuntimeException e) {	
-			// no-op
-		}
-	}
-	
-	public void testStickyViewProperties() {
-		ViewRegistry registry = (ViewRegistry)WorkbenchPlugin.getDefault().getViewRegistry();
-		IStickyViewDescriptor [] descs = registry.getStickyViews();
-		for (int i = 0; i < descs.length; i++) {
-			assertFalse(VIEW_ID1.equals(descs[i].getId()));
-		}
-		
-		getBundle();
-		
-		descs = registry.getStickyViews();
-		IStickyViewDescriptor desc = null;
-		for (int i = 0; i < descs.length; i++) {
-			if (VIEW_ID1.equals(descs[i].getId())) {
-				desc = descs[i];
-				break;
-			}					
-		}
-		assertNotNull(desc);
-		testStickyViewProperties(desc);
-		removeBundle();	
-		
-		descs = registry.getStickyViews();
-		for (int i = 0; i < descs.length; i++) {
-			assertFalse(VIEW_ID1.equals(descs[i].getId()));
-		}
-		
-		try {
-			testStickyViewProperties(desc);
-			fail();			
-		}
-		catch (RuntimeException e) {	
-			// no-op
-		}		
-	}
-	
-	private void testStickyViewProperties(IStickyViewDescriptor desc) {
-		assertNotNull(desc.getId());
-		assertFalse(desc.isMoveable());
-		assertFalse(desc.isCloseable());
-		assertEquals(IPageLayout.BOTTOM, desc.getLocation());		
-	}
-
-	public void testCategoryViewContainmentProperties() {
-		ViewRegistry registry = (ViewRegistry)WorkbenchPlugin.getDefault().getViewRegistry();
-		
-		assertNull(registry.find(VIEW_ID1));
-		assertNull(registry.findCategory(CATEGORY_ID));
-
-		getBundle();
-		
-		IViewDescriptor desc = registry.find(VIEW_ID1);
-		assertNotNull(desc);	    
-		IViewCategory category = registry.findCategory(CATEGORY_ID);
-		assertNotNull(category);
-		
-		testCategoryProperties(category);
-		assertTrue(category.getViews()[0] == desc);
-
-		removeBundle();	
-		assertNull(registry.find(VIEW_ID1));
-		assertNull(registry.findCategory(CATEGORY_ID));
-		try {
-			testCategoryProperties(category);
-			fail();
-		}
-		catch (RuntimeException e) {	
-			// no-op
-		}
-	
-	}	
-	
-	/**
-	 * @param category
-	 */
-	private void testCategoryProperties(IViewCategory desc) {
-		assertNotNull(desc.getId());
-		assertNotNull(desc.getLabel());
-		assertEquals(1, desc.getViews().length);
-	}
-
-	/**
-	 * @param desc
-	 */
-	private void testViewProperties(IViewDescriptor desc) {
-		assertNotNull(desc.getId());
-		assertNotNull(desc.getLabel());
-		assertNotNull(desc.getImageDescriptor());
-		assertNotNull(desc.getDescription());
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {
-		return "newView1.testDynamicViewAddition";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_VIEWS;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newView1";
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getMarkerClass()
-	 */
-	protected String getMarkerClass() {
-		return "org.eclipse.ui.dynamic.DynamicView";
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/WorkingSetTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/WorkingSetTests.java
deleted file mode 100644
index 5550c20..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/dynamicplugins/WorkingSetTests.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.dynamicplugins;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.WorkingSet;
-import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
-import org.eclipse.ui.intro.IIntroPart;
-import org.osgi.framework.Bundle;
-
-/**
- * @since 3.3
- */
-public class WorkingSetTests extends DynamicTestCase {
-
-	/**
-	 * @param testName
-	 */
-	public WorkingSetTests(String testName) {
-		super(testName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getMarkerClass()
-	 */
-	protected String getMarkerClass() {
-		return "org.eclipse.ui.dynamic.DynamicWorkingSetElementAdapter";
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#testClass()
-	 */
-	public void testClass() throws Exception {
-		super.testClass();
-		// commented out for now - it's causing grief
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionId()
-	 */
-	protected String getExtensionId() {
-		return "newWorkingSet1.testDynamicWorkingSetAddition1";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getExtensionPoint()
-	 */
-	protected String getExtensionPoint() {
-		return IWorkbenchRegistryConstants.PL_WORKINGSETS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.dynamicplugins.DynamicTestCase#getInstallLocation()
-	 */
-	protected String getInstallLocation() {
-		return "data/org.eclipse.newWorkingSet1";
-	}
-
-	/**
-	 * Tests to ensure that the working set updater is unloaded after the bundle
-	 * is unloaded.
-	 */
-	public void testWorkingSetUpdater() throws ClassNotFoundException {
-		final PropertyChangeEvent[] events = new PropertyChangeEvent[1];
-		IWorkingSetManager workingSetManager = PlatformUI.getWorkbench()
-				.getWorkingSetManager();
-		WorkingSet workingSet = (WorkingSet) workingSetManager
-				.createWorkingSet("dynamicSet3", new IAdaptable[0]);
-		workingSet.setId("org.eclipse.newWorkingSet1.WorkingSet1");
-		workingSetManager.addWorkingSet(workingSet);
-
-		IPropertyChangeListener propertyChangeListener = new IPropertyChangeListener() {
-
-			public void propertyChange(PropertyChangeEvent event) {
-				synchronized (this) {
-					events[0] = event;
-				}
-			}
-		};
-
-		workingSetManager.addPropertyChangeListener(propertyChangeListener);
-		try {
-			getBundle();
-			getBundle().loadClass(getMarkerClass()); // ensure the class is
-														// loaded
-			assertEquals("Bundle not active after classloading", Bundle.ACTIVE,
-					getBundle().getState());
-			PropertyChangeEvent event = events[0];
-			int i = 0;
-			while (event == null && i <= 10) {
-				try {
-					processEvents();
-					Thread.sleep(250);
-					i++;
-				} catch (InterruptedException e) {
-				}
-				synchronized (propertyChangeListener) {
-					event = events[0];
-				}
-			}
-			assertNotNull(event);
-			assertEquals(
-					IWorkingSetManager.CHANGE_WORKING_SET_UPDATER_INSTALLED,
-					event.getProperty());
-			assertEquals(null, event.getOldValue());
-			assertNotNull(event.getNewValue());
-			assertTrue(event.getNewValue().getClass().getName().equals(
-					"org.eclipse.ui.dynamic.DynamicWorkingSetUpdater"));
-			events[0] = null;
-			i = 0;
-			removeBundle();
-			event = events[0];
-			while (event == null && i <= 10) {
-				try {
-					processEvents();
-					Thread.sleep(250);
-					i++;
-				} catch (InterruptedException e) {
-				}
-				synchronized (propertyChangeListener) {
-					event = events[0];
-				}
-			}
-			assertNotNull(event);
-			assertEquals(
-					IWorkingSetManager.CHANGE_WORKING_SET_UPDATER_UNINSTALLED,
-					event.getProperty());
-			assertEquals(null, event.getNewValue());
-			assertNotNull(event.getOldValue());
-			assertTrue(event.getOldValue().getClass().getName().equals(
-					"org.eclipse.ui.dynamic.DynamicWorkingSetUpdater"));
-		} finally {
-			workingSetManager
-					.removePropertyChangeListener(propertyChangeListener);
-		}
-	}
-
-	/**
-	 * Tests to ensure that if you've loaded a working set extension that uses
-	 * the basic element adapter then it will be invoked even before the bundle
-	 * is activated.
-	 */
-	public void testWorkingSetWithBasicElementAdapter() {
-		IWorkingSetManager workingSetManager = PlatformUI.getWorkbench()
-				.getWorkingSetManager();
-		IAdaptable adaptable = new IAdaptable() {
-
-			public Object getAdapter(Class adapter) {
-				if (adapter == IResource.class)
-					return ResourcesPlugin.getWorkspace().getRoot();
-				return null;
-			}
-		};
-		WorkingSet workingSet = (WorkingSet) workingSetManager
-				.createWorkingSet("dynamicSet2", new IAdaptable[0]);
-		workingSet.setId("org.eclipse.newWorkingSet1.WorkingSet2");
-		workingSetManager.addWorkingSet(workingSet);
-		IAdaptable[] elementsToAdapt = new IAdaptable[] { adaptable };
-		IAdaptable[] adaptedElements = workingSet
-				.adaptElements(elementsToAdapt);
-		// make sure the identity is used
-		assertEquals(elementsToAdapt, adaptedElements);
-		getBundle();
-		// ensure that the bundle is not already active
-		assertFalse("Bundle is active too early", Bundle.ACTIVE == getBundle()
-				.getState());
-		adaptedElements = workingSet.adaptElements(elementsToAdapt);
-		assertEquals(1, adaptedElements.length);
-		// ensure that the adapter above has been invoked
-		assertEquals(ResourcesPlugin.getWorkspace().getRoot(),
-				adaptedElements[0]);
-		// ensure that the bundle is still not active
-		assertFalse("Bundle is active after adapt",
-				Bundle.ACTIVE == getBundle().getState());
-
-		removeBundle();
-		adaptedElements = workingSet.adaptElements(elementsToAdapt);
-		// make sure the identity is used again
-		assertEquals(elementsToAdapt, adaptedElements);
-	}
-
-	/**
-	 * Tests to ensure that if you've loaded a working set extension that uses
-	 * the it's own element adapter then it will be not cause bundle activation
-	 * early.
-	 */
-	public void testWorkingSetWithCustomElementAdapter()
-			throws ClassNotFoundException {
-		IWorkingSetManager workingSetManager = PlatformUI.getWorkbench()
-				.getWorkingSetManager();
-		IAdaptable adaptable = new IAdaptable() {
-
-			public Object getAdapter(Class adapter) {
-				if (adapter == IResource.class)
-					return ResourcesPlugin.getWorkspace().getRoot();
-				return null;
-			}
-		};
-		WorkingSet workingSet = (WorkingSet) workingSetManager
-				.createWorkingSet("dynamicSet1", new IAdaptable[0]);
-		workingSet.setId("org.eclipse.newWorkingSet1.WorkingSet1");
-		workingSetManager.addWorkingSet(workingSet);
-		IAdaptable[] elementsToAdapt = new IAdaptable[] { adaptable };
-		IAdaptable[] adaptedElements = workingSet
-				.adaptElements(elementsToAdapt);
-		// make sure the identity is used
-		assertEquals(elementsToAdapt, adaptedElements);
-		getBundle();
-		// ensure that the bundle is not already active
-		assertFalse("Bundle is active too early", Bundle.ACTIVE == getBundle()
-				.getState());
-		adaptedElements = workingSet.adaptElements(elementsToAdapt);
-		// ensure that the identity is still returned, confirming that the
-		// bundle has not been activated
-		assertEquals(elementsToAdapt, adaptedElements);
-		// activate the bundle by touching a class
-		getBundle().loadClass(getMarkerClass());
-		assertEquals("Bundle not active after classloading", Bundle.ACTIVE,
-				getBundle().getState());
-		// try the adapt again. The custom element adapter should be used
-		adaptedElements = workingSet.adaptElements(elementsToAdapt);
-		assertEquals(1, adaptedElements.length);
-		assertTrue(adaptedElements[0] instanceof IIntroPart);
-
-		removeBundle();
-		adaptedElements = workingSet.adaptElements(elementsToAdapt);
-		// make sure the identity is used again
-		assertEquals(elementsToAdapt, adaptedElements);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/encoding/EncodingTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/encoding/EncodingTestCase.java
deleted file mode 100644
index 4dbb0e3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/encoding/EncodingTestCase.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.encoding;
-
-import java.nio.charset.Charset;
-import java.nio.charset.IllegalCharsetNameException;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.ui.WorkbenchEncoding;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * The EncodingTestCase is the suite that tests the 3.1 
- * encoding support.
- */
-public class EncodingTestCase extends UITestCase {
-
-	/**
-	 * Create a new instance of the receiver.
-	 * @param testName
-	 */
-	public EncodingTestCase(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Test that the workbench encodings are all valid. The
-	 * suite includes an invalid one.
-	 *
-	 */
-	public void testWorkbenchEncodings() {
-		List encodings = WorkbenchEncoding.getDefinedEncodings();
-		Iterator iterator = encodings.iterator();
-
-		while (iterator.hasNext()) {
-			String nextEncoding = (String) iterator.next();
-			try {
-				Assert.isTrue(Charset.isSupported(nextEncoding), "Unsupported charset " + nextEncoding);
-				
-			} catch (IllegalCharsetNameException e) {
-				Assert.isTrue(false, "Unsupported charset " + nextEncoding);
-			}
-			
-
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/encoding/EncodingTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/encoding/EncodingTestSuite.java
deleted file mode 100644
index df76d97..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/encoding/EncodingTestSuite.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.encoding;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * The EncodingTestSuite is the suite for encoding tests.
- */
-public class EncodingTestSuite extends TestSuite {
-	
-	/**
-	 * Returns the suite.  This is required to
-	 * use the JUnit Launcher.
-	 * @return Test
-	 */
-	public static Test suite() {
-		return new EncodingTestSuite();
-	}
-
-	/**
-	 * Create the suite.
-	 */
-	public EncodingTestSuite() {
-		super();
-		addTest(new TestSuite(EncodingTestCase.class));
-	}
-
-	
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/fieldassist/FieldAssistAPITest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/fieldassist/FieldAssistAPITest.java
deleted file mode 100644
index 845f833..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/fieldassist/FieldAssistAPITest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.fieldassist;
-
-import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
-import org.eclipse.swt.graphics.Image;
-
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-
-import junit.framework.TestCase;
-
-/**
- * Tests the Operations Framework API.
- * 
- * @since 3.1
- */
-public class FieldAssistAPITest extends TestCase {
-
-	public FieldAssistAPITest() {
-		super();
-	}
-
-	/**
-	 * @param testName
-	 */
-	public FieldAssistAPITest(String name) {
-		super(name);
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-	}
-
-	public void testFieldDecorationRegistry() {
-		int originalMaxHeight = FieldDecorationRegistry.getDefault()
-				.getMaximumDecorationHeight();
-		int originalMaxWidth = FieldDecorationRegistry.getDefault()
-				.getMaximumDecorationWidth();
-		// System.out.println(new Rectangle(0, 0, originalMaxWidth,
-		// originalMaxHeight));
-		Image imageLarge = IDEInternalWorkbenchImages.getImageDescriptor(
-				IDEInternalWorkbenchImages.IMG_WIZBAN_NEWFOLDER_WIZ)
-				.createImage();
-		// System.out.println(imageLarge.getBounds());
-		// This image is known to be larger than the default images
-		// Test that the maximum increases
-		FieldDecorationRegistry.getDefault().registerFieldDecoration("TESTID",
-				"Test image", imageLarge);
-		assertTrue(FieldDecorationRegistry.getDefault()
-				.getMaximumDecorationHeight() == imageLarge.getBounds().height);
-		assertTrue(FieldDecorationRegistry.getDefault()
-				.getMaximumDecorationWidth() == imageLarge.getBounds().width);
-
-		// This image is known to be smaller. Test that the maximum decreases
-		Image imageSmall = IDEInternalWorkbenchImages.getImageDescriptor(
-				IDEInternalWorkbenchImages.IMG_DLCL_QUICK_FIX_DISABLED)
-				.createImage();
-		// System.out.println(imageSmall.getBounds());
-		FieldDecorationRegistry.getDefault().registerFieldDecoration("TESTID",
-				"Test image", imageSmall);
-		int currentMaxHeight = FieldDecorationRegistry.getDefault()
-				.getMaximumDecorationHeight();
-		assertTrue(currentMaxHeight < imageLarge.getBounds().height);
-		int currentMaxWidth = FieldDecorationRegistry.getDefault()
-				.getMaximumDecorationWidth();
-		assertTrue(currentMaxWidth < imageLarge.getBounds().width);
-
-		// Registering another small one shouldn't change things
-		FieldDecorationRegistry.getDefault().registerFieldDecoration("TESTID2",
-				"Test image",
-				"org.eclipse.jface.fieldassist.IMG_DEC_FIELD_CONTENT_PROPOSAL");
-		assertTrue(FieldDecorationRegistry.getDefault().getMaximumDecorationHeight() == currentMaxHeight);
-		assertTrue(FieldDecorationRegistry.getDefault().getMaximumDecorationWidth() == currentMaxWidth);
-
-		// After we unregister the new decoration2, the maximums should be their
-		// original values.
-		FieldDecorationRegistry.getDefault()
-				.unregisterFieldDecoration("TESTID");
-		FieldDecorationRegistry.getDefault().unregisterFieldDecoration(
-				"TESTID2");
-		assertTrue(FieldDecorationRegistry.getDefault()
-				.getMaximumDecorationHeight() == originalMaxHeight);
-		assertTrue(FieldDecorationRegistry.getDefault()
-				.getMaximumDecorationWidth() == originalMaxWidth);
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/fieldassist/FieldAssistTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/fieldassist/FieldAssistTestSuite.java
deleted file mode 100644
index 0b4a3dc..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/fieldassist/FieldAssistTestSuite.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.fieldassist;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Tests for the platform operations support.
- */
-public class FieldAssistTestSuite extends TestSuite {
-	/**
-	 * Returns the suite. This is required to use the JUnit Launcher.
-	 */
-	public static final Test suite() {
-		return new FieldAssistTestSuite();
-	}
-
-	/**
-	 * Construct the test suite.
-	 */
-	public FieldAssistTestSuite() {
-		addTest(new TestSuite(FieldAssistAPITest.class));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/filteredtree/FilteredTreeTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/filteredtree/FilteredTreeTests.java
deleted file mode 100644
index 16238a7..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/filteredtree/FilteredTreeTests.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.filteredtree;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.tests.viewers.TestElement;
-import org.eclipse.jface.tests.viewers.TestModelContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-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.Shell;
-import org.eclipse.ui.dialogs.FilteredTree;
-import org.eclipse.ui.dialogs.PatternFilter;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-public class FilteredTreeTests extends UITestCase {
-	private FilteredTree fTreeViewer;
-	private TestElement fRootElement;
-	// create an 8000-item Tree
-	private static int DEPTH = 3;
-	private static int NUM_ITEMS = 20;
-	
-	private class MyFilteredTree extends FilteredTree{
-		public MyFilteredTree(Composite comp, int style) {
-			super(comp);
-			doSomeStuffBeforeWidgetCreation();
-			init(style, new PatternFilter());
-		}
-		
-		private void doSomeStuffBeforeWidgetCreation(){
-			// do nothing
-		}
-	}
-	
-	private abstract class FilteredTreeDialog extends Dialog {
-		private int style;
-		
-		public FilteredTreeDialog(Shell shell, int treeStyle){
-			super(shell);
-			style = treeStyle;
-		}
-		protected Control createContents(Composite parent) {
-			Composite c = new Composite(parent, SWT.NONE);
-			c.setLayout(new GridLayout());
-
-			c.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-			fTreeViewer = doCreateFilteredTree(c, style);
-			fTreeViewer.getViewer().setUseHashlookup(true);
-			setInput();
-			return parent;
-		}
-
-		protected abstract FilteredTree doCreateFilteredTree(Composite comp, int style); 
-		
-	};	
-	
-	/**
-	 * @param testName
-	 */
-	public FilteredTreeTests(String testName) {
-		super(testName);
-	}
-
-	public void testCreateFilteredTree(){
-		runFilteredTreeTest(SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.BORDER);
-	}
-	
-	public void testCreateCheckboxFilteredTree(){
-		runFilteredTreeTest(SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.BORDER | SWT.CHECK);
-	}
-	/*
-	 * Tests creation of a subclass of filtered tree, using alternate constructor.
-	 */
-	public void testCreateMyFilteredTree(){
-		fRootElement = TestElement.createModel(DEPTH, NUM_ITEMS);	
-		final int treeStyle = SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL |SWT.FLAT;
-		
-		Dialog dialog = new FilteredTreeDialog((Shell)null, treeStyle){
-			protected FilteredTree doCreateFilteredTree(Composite comp, int style) {
-				return createMyFilteredTree(comp, treeStyle);
-			}
-		};
-
-		dialog.create();
-		Assert.isNotNull(fTreeViewer, "Filtered tree is null");
-		int itemCount = fTreeViewer.getViewer().getTree().getItemCount();
-		Assert.isTrue(itemCount == NUM_ITEMS, "tree item count " + itemCount
-				+ " does not match expected: " + NUM_ITEMS);
-		dialog.close();
-	}
-	
-	private void runFilteredTreeTest(final int treeStyle){
-		fRootElement = TestElement.createModel(DEPTH, NUM_ITEMS);	
-		
-		Dialog dialog = new FilteredTreeDialog((Shell)null, treeStyle){
-			protected FilteredTree doCreateFilteredTree(Composite comp, int style) {
-				return createFilteredTree(comp, treeStyle);
-			}
-		};
-
-		dialog.create();
-		Assert.isNotNull(fTreeViewer, "Filtered tree is null");
-		int itemCount = fTreeViewer.getViewer().getTree().getItemCount();
-		Assert.isTrue(itemCount == NUM_ITEMS, "tree item count " + itemCount
-				+ " does not match expected: " + NUM_ITEMS);
-		dialog.close();
-	}
-	
-	private FilteredTree createFilteredTree(Composite parent, int style){
-	      Composite c = new Composite(parent, SWT.NONE);
-	      c.setLayout(new GridLayout());
-	      FilteredTree fTree = new FilteredTree(c, style, new PatternFilter());
-
-	      GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
-		  gd.widthHint = 400;
-		  gd.heightHint = 500;
-		  fTree.setLayoutData(gd);
-		  fTree.getViewer().setContentProvider(new TestModelContentProvider());
-		  fTree.getViewer().setLabelProvider(new LabelProvider());
-
-	      return fTree;	
-	}
-	
-	private FilteredTree createMyFilteredTree(Composite parent, int style){
-		Composite c = new Composite(parent, SWT.NONE);
-	    c.setLayout(new GridLayout());
-	    FilteredTree fTree = new MyFilteredTree(c, style);
-	    GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
-		gd.widthHint = 400;
-		gd.heightHint = 500;
-		fTree.setLayoutData(gd);
-		fTree.getViewer().setContentProvider(new TestModelContentProvider());
-		fTree.getViewer().setLabelProvider(new LabelProvider());
-		return fTree;
-	}
-	
-	private void setInput() {
-		fTreeViewer.getViewer().setInput(fRootElement);
-	}
-
-	protected void doTearDown() throws Exception {
-		super.doTearDown();
-		fTreeViewer = null;
-		fRootElement = null;
-	}	
-	
-	
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/ide/api/FileEditorInputTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/ide/api/FileEditorInputTest.java
deleted file mode 100644
index 0fdf2f0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/ide/api/FileEditorInputTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.ide.api;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests [I]FileEditorInput API.
- * 
- * @since 3.1
- */
-public class FileEditorInputTest extends UITestCase {
-
-    /**
-     * @param testName
-     */
-    public FileEditorInputTest(String testName) {
-        super(testName);
-    }
-    
-    /**
-     * Regression test for bug 72337 - [IDE] FileEditorInput .equals() not implemented against interface
-     */
-    public void testBug72337() {
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        IPath path = new Path("/foo/bar.txt");
-        IFile fileA = workspace.getRoot().getFile(path);
-        FileEditorInput inputA1 = new FileEditorInput(fileA);
-        OtherFileEditorInput inputA2 = new OtherFileEditorInput(fileA);
-        assertTrue(inputA1.equals(inputA2));
-        assertTrue(inputA2.equals(inputA1));
-    }
-    
-    class OtherFileEditorInput implements IFileEditorInput {
-        private IFile file;
-        
-        public OtherFileEditorInput(IFile file) {
-            this.file = file;
-        }
-        
-        public IFile getFile() {
-            return file;
-        }
-
-        /**
-		 * @throws CoreException if this method fails
-		 */
-        public IStorage getStorage() throws CoreException {
-            return file;
-        }
-
-        public boolean exists() {
-            return file.exists();
-        }
-
-        public ImageDescriptor getImageDescriptor() {
-            return null;
-        }
-
-        public String getName() {
-            return file.getName();
-        }
-
-        public IPersistableElement getPersistable() {
-            return null;
-        }
-
-        public String getToolTipText() {
-            return file.getFullPath().toString();
-        }
-
-        public Object getAdapter(Class adapter) {
-            if (adapter == IResource.class)
-                return file;
-            if (adapter == IFile.class)
-                return file;
-            return null;
-        }
-        
-        public boolean equals(Object obj) {
-            if (!(obj instanceof IFileEditorInput))
-                return false;
-            IFileEditorInput other = (IFileEditorInput) obj;
-            return file.equals(other.getFile());
-        }
-        
-        public int hashCode() {
-            return file.hashCode();
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ActionExpressionTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ActionExpressionTest.java
deleted file mode 100644
index 791b5b9..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ActionExpressionTest.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal;
-
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.tests.api.ListElement;
-import org.eclipse.ui.tests.api.ListView;
-import org.eclipse.ui.tests.harness.util.ActionUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * This class contains tests for popup menu enablement
- */
-public abstract class ActionExpressionTest extends UITestCase {
-    protected IWorkbenchWindow fWindow;
-
-    protected IWorkbenchPage fPage;
-
-    protected String VIEW_ID = "org.eclipse.ui.tests.internal.ActionExpressionTest";
-
-    ListElement red = new ListElement("red");
-
-    ListElement blue = new ListElement("blue");
-
-    ListElement redTrue = new ListElement("red", true);
-
-    public ActionExpressionTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWindow = openTestWindow();
-        fPage = fWindow.getActivePage();
-    }
-
-    public void testAllAction() throws Throwable {
-        // Setup.
-        ListView view = showListView();
-        MenuManager mgr = getActionMenuManager(view);
-
-        // Test null selection.
-        selectAndUpdateMenu(view, null, mgr);
-        testAction(mgr, "allAction_v2", false);
-
-        // Test red selection.
-        selectAndUpdateMenu(view, red, mgr);
-        testAction(mgr, "allAction_v2", true);
-
-        // Test blue selection.
-        selectAndUpdateMenu(view, blue, mgr);
-        testAction(mgr, "allAction_v2", true);
-
-        // Test red + true selection.
-        selectAndUpdateMenu(view, redTrue, mgr);
-        testAction(mgr, "allAction_v2", true);
-    }
-
-    public void testRedAction() throws Throwable {
-        // Setup.
-        ListView view = showListView();
-        MenuManager mgr = getActionMenuManager(view);
-
-        // Test null selection.
-        selectAndUpdateMenu(view, null, mgr);
-        testAction(mgr, "redAction_v2", false);
-
-        // Test red selection.
-        selectAndUpdateMenu(view, red, mgr);
-        testAction(mgr, "redAction_v2", true);
-
-        // Test blue selection.
-        selectAndUpdateMenu(view, blue, mgr);
-        testAction(mgr, "redAction_v2", false);
-
-        // Test red + true selection.
-        selectAndUpdateMenu(view, redTrue, mgr);
-        testAction(mgr, "redAction_v2", true);
-    }
-
-    public void testNotRedAction() throws Throwable {
-        // Setup.
-        ListView view = showListView();
-        MenuManager mgr = getActionMenuManager(view);
-
-        // Test null selection.
-        selectAndUpdateMenu(view, null, mgr);
-        testAction(mgr, "notRedAction_v2", false);
-
-        // Test red selection.
-        selectAndUpdateMenu(view, red, mgr);
-        testAction(mgr, "notRedAction_v2", false);
-
-        // Test blue selection.
-        selectAndUpdateMenu(view, blue, mgr);
-        testAction(mgr, "notRedAction_v2", true);
-
-        // Test red + true selection.
-        selectAndUpdateMenu(view, redTrue, mgr);
-        testAction(mgr, "notRedAction_v2", false);
-    }
-
-    public void testTrueAction() throws Throwable {
-        // Setup.
-        ListView view = showListView();
-        MenuManager mgr = getActionMenuManager(view);
-
-        // Test null selection.
-        selectAndUpdateMenu(view, null, mgr);
-        testAction(mgr, "trueAction_v2", false);
-
-        // Test red selection.
-        selectAndUpdateMenu(view, red, mgr);
-        testAction(mgr, "trueAction_v2", false);
-
-        // Test blue selection.
-        selectAndUpdateMenu(view, blue, mgr);
-        testAction(mgr, "trueAction_v2", false);
-
-        // Test red + true selection.
-        selectAndUpdateMenu(view, redTrue, mgr);
-        testAction(mgr, "trueAction_v2", true);
-    }
-
-    public void testRedOrBlueAction() throws Throwable {
-        // Setup.
-        ListView view = showListView();
-        MenuManager mgr = getActionMenuManager(view);
-
-        // Test null selection.
-        selectAndUpdateMenu(view, null, mgr);
-        testAction(mgr, "redOrBlueAction_v2", false);
-
-        // Test red selection.
-        selectAndUpdateMenu(view, red, mgr);
-        testAction(mgr, "redOrBlueAction_v2", true);
-
-        // Test blue selection.
-        selectAndUpdateMenu(view, blue, mgr);
-        testAction(mgr, "redOrBlueAction_v2", true);
-
-        // Test red + true selection.
-        selectAndUpdateMenu(view, redTrue, mgr);
-        testAction(mgr, "redOrBlueAction_v2", true);
-    }
-
-    public void testRedAndTrueAction() throws Throwable {
-        // Setup.
-        ListView view = showListView();
-        MenuManager mgr = getActionMenuManager(view);
-
-        // Test null selection.
-        selectAndUpdateMenu(view, null, mgr);
-        testAction(mgr, "redAndTrueAction_v2", false);
-
-        // Test red selection.
-        selectAndUpdateMenu(view, red, mgr);
-        testAction(mgr, "redAndTrueAction_v2", false);
-
-        // Test blue selection.
-        selectAndUpdateMenu(view, blue, mgr);
-        testAction(mgr, "redAndTrueAction_v2", false);
-
-        // Test red + true selection.
-        selectAndUpdateMenu(view, redTrue, mgr);
-        testAction(mgr, "redAndTrueAction_v2", true);
-    }
-
-    public void testPluginStateActions() throws Throwable {
-        // Setup.
-        ListView view = showListView();
-        MenuManager mgr = getActionMenuManager(view);
-
-        // Open the menu and test actions.
-        selectAndUpdateMenu(view, red, mgr);
-        testAction(mgr, "pluginNotInstalledAction_v2", false);
-        testAction(mgr, "pluginInstalledAction_v2", true);
-        testAction(mgr, "pluginNotActivatedAction_v2", false);
-        testAction(mgr, "pluginActivatedAction_v2", true);
-    }
-
-    public void testSystemPropertyAction() throws Throwable {
-        // Setup.
-        ListView view = showListView();
-        MenuManager mgr = getActionMenuManager(view);
-
-        // Clear the system property, refresh the menu,
-        // and test the action.
-        System.setProperty("ActionExpressionVar", "");
-        selectAndUpdateMenu(view, red, mgr);
-        testAction(mgr, "systemPropertyAction_v2", false);
-
-        // Set the system property, refresh the menu,
-        // and test the action.
-        System.setProperty("ActionExpressionVar", "bubba");
-        selectAndUpdateMenu(view, blue, mgr);
-        testAction(mgr, "systemPropertyAction_v2", true);
-    }
-
-    /**
-     * Creates the list view.
-     */
-    protected ListView showListView() throws Throwable {
-        ListView view = (ListView) (fPage.showView(VIEW_ID));
-        red = new ListElement("red");
-        blue = new ListElement("blue");
-        redTrue = new ListElement("red", true);
-        view.addElement(red);
-        view.addElement(blue);
-        view.addElement(redTrue);
-        return view;
-    }
-
-    /**
-     * Select an object and fire about to show.
-     */
-    protected void selectAndUpdateMenu(ListView view, ListElement element,
-            MenuManager mgr) throws Throwable {
-        view.selectElement(element);
-        ActionUtil.fireAboutToShow(mgr);
-    }
-
-    /**
-     * Returns the menu manager containing the actions.
-     */
-    protected abstract MenuManager getActionMenuManager(ListView view)
-            throws Throwable;
-
-    /**
-     * Tests the enablement / visibility of an action.
-     */
-    protected abstract void testAction(MenuManager mgr, String action,
-            boolean expected) throws Throwable;
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ActionSetExpressionTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ActionSetExpressionTest.java
deleted file mode 100644
index 700e996..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ActionSetExpressionTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal;
-
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.SubContributionItem;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.tests.api.ListView;
-import org.eclipse.ui.tests.harness.util.ActionUtil;
-
-/**
- * This class contains tests for action set enablement
- */
-public class ActionSetExpressionTest extends ActionExpressionTest {
-
-    public ActionSetExpressionTest(String testName) {
-        super(testName);
-    }
-
-    /**
-     * Opens the action set.  Returns the menu manager containing it.
-     */
-    protected MenuManager getActionMenuManager(ListView view) throws Throwable {
-        fPage.showActionSet("org.eclipse.ui.tests.internal.ListElementActions");
-        WorkbenchWindow win = (WorkbenchWindow) fWindow;
-        IContributionItem item = win.getMenuBarManager().find(
-                "org.eclipse.ui.tests.internal.ListElementMenu");
-        while (item instanceof SubContributionItem) {
-            item = ((SubContributionItem) item).getInnerItem();
-            if (item instanceof MenuManager)
-                return (MenuManager) item;
-        }
-        fail("Unable to find menu manager");
-        return null;
-    }
-
-    /**
-     * Tests the enablement of an action.
-     */
-    protected void testAction(MenuManager mgr, String action, boolean expected)
-            throws Throwable {
-        assertEquals(action, expected, ActionUtil.getActionWithLabel(mgr,
-                action).isEnabled());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/AnimationEngineTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/AnimationEngineTest.java
deleted file mode 100644
index df2d35e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/AnimationEngineTest.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.internal;
-
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.internal.AnimationEngine;
-import org.eclipse.ui.internal.AnimationFeedbackBase;
-import org.eclipse.ui.internal.util.PrefUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.5
- *
- */
-public class AnimationEngineTest extends UITestCase {
-	
-	/**
-	 * @param testName
-	 */
-	public AnimationEngineTest(String testName) {
-		super(testName);
-	}
-
-	private class TestFeedback extends AnimationFeedbackBase {
-		/**
-		 * @param parentShell
-		 */
-		public TestFeedback(Shell parentShell) {
-			super(parentShell);
-		}
-
-		public int count = 0;
-		public int initCalled = -1;
-		public int renderCalled = -1;
-		public int disposeCalled = -1;
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.internal.AnimationFeedbackBase#dispose()
-		 */
-		public void dispose() {
-			disposeCalled = count++;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.internal.AnimationFeedbackBase#initialize(org.eclipse.ui.internal.AnimationEngine)
-		 */
-		public void initialize(AnimationEngine animationEngine) {
-			initCalled = count++;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.internal.AnimationFeedbackBase#renderStep(org.eclipse.ui.internal.AnimationEngine)
-		 */
-		public void renderStep(AnimationEngine engine) {
-			if(renderCalled == -1)
-				renderCalled = count++;
-		}
-		
-	};
-	
-	Shell shell;
-	TestFeedback feedback;
-	AnimationEngine engine;
-	
-	protected void doSetUp() {
-		shell = new Shell(Display.getCurrent());
-	}
-
-	protected void doTearDown() {
-		shell.dispose();
-		shell = null;
-	}
-	
-	/**
-	 * Ensure that the protocol expected by the animation implementations works
-	 * as defined:
-	 * <ol>
-	 * <li>The feedback's initialize gets called on creation of the engine</li>
-	 * <li>The feedback's renderStep gets called at least once</li>
-	 * <li>The feedback's dispose gets called at least once (after a render)</li>
-	 * @throws InterruptedException
-	 */
-	public void testAnimationEngine() throws InterruptedException {
-		// Ensure that animations are turned on
-		IPreferenceStore preferenceStore = PrefUtil.getAPIPreferenceStore();
-		preferenceStore.setValue(IWorkbenchPreferenceConstants.ENABLE_ANIMATIONS, true);
-		
-		feedback = new TestFeedback(shell);
-		engine = new AnimationEngine(feedback, 250, 0);
-		
-		// ensure that the init method gets called on construction
-		assertTrue("'initialize' was not called", feedback.initCalled == 0);
-		
-		// Run the animation
-		engine.schedule();
-				
-		// Wait for the animation to finish
-		Display display = shell.getDisplay();
-		while(engine.getState() != Job.NONE) {
-			while (display.readAndDispatch());
-			Thread.sleep(20);
-		}
-
-		// Make sure all methods were called...and in the correct order
-		assertTrue("'render' was not called", feedback.renderCalled >= 0);
-		assertTrue("'dispose' was not called", feedback.disposeCalled >= 0);
-		
-		//...in the correct order
-		assertTrue("'dispose' called before 'render", feedback.renderCalled < feedback.disposeCalled);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/Bug41931Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/Bug41931Test.java
deleted file mode 100644
index 3b968c4..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/Bug41931Test.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.internal;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
-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.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test for Bug 41931.
- * 
- * @since 3.0
- */
-public class Bug41931Test extends UITestCase {
-
-    /**
-     * Constructs a new instance of this test case.
-     * 
-     * @param testName
-     *            The name of the test
-     */
-    public Bug41931Test(String testName) {
-        super(testName);
-    }
-
-    /**
-     * Tests that the <code>bringToTop(IWorkbenchPart)</code> correctly
-     * updates the activation list.
-     * 
-     * @throws CoreException
-     *             If the test project cannot be created or opened.
-     */
-    public void testBringToTop() throws CoreException {
-        // Open a window.
-        IWorkbenchWindow window = openTestWindow();
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-        // Create a test project.
-        IProject testProject = workspace.getRoot().getProject("Bug41931"); //$NON-NLS-1$
-        testProject.create(null);
-        testProject.open(null);
-
-        // Open three test files.
-        InputStream contents = new ByteArrayInputStream(new byte[0]);
-        IFile fileA = testProject.getFile("a.txt"); //$NON-NLS-1$
-        fileA.create(contents, true, null);
-        IFile fileB = testProject.getFile("b.txt"); //$NON-NLS-1$
-        fileB.create(contents, true, null);
-        IFile fileC = testProject.getFile("c.txt"); //$NON-NLS-1$
-        fileC.create(contents, true, null);
-
-        // Open editors on those files.
-        WorkbenchPage page = (WorkbenchPage) window.getActivePage();
-        IEditorPart editorA = IDE.openEditor(page, fileA, true);
-        IEditorPart editorB = IDE.openEditor(page, fileB, true);
-        IEditorPart editorC = IDE.openEditor(page, fileC, true);
-
-        // Test that the editors are open in the order: A, B, C
-        IEditorPart[] expectedResults = { editorA, editorB, editorC };
-        IWorkbenchPartReference[] actualResults = page.getSortedParts();
-        for (int i = 0; i < expectedResults.length; i++) {
-            assertEquals(
-                    "Pre-test order is not correct.", expectedResults[i].getTitle(), actualResults[i].getPart(false).getTitle()); //$NON-NLS-1$
-        }
-
-        // Bring editor B to the top.
-        page.bringToTop(editorB);
-
-        // Test that the editors are open in the order: A, C, B
-        expectedResults = new IEditorPart[] { editorA, editorC, editorB };
-        actualResults = page.getSortedParts();
-        for (int i = 0; i < expectedResults.length; i++) {
-            assertEquals(
-                    "bringToTop() does not change sorted part order.", expectedResults[i].getTitle(), actualResults[i].getPart(false).getTitle()); //$NON-NLS-1$
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/Bug78470Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/Bug78470Test.java
deleted file mode 100644
index d2fb120..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/Bug78470Test.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.internal;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IPerspectiveFactory;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-public class Bug78470Test extends UITestCase {
-
-	public static class MyPerspective implements IPerspectiveFactory {
-		public static String ID = "org.eclipse.ui.tests.internal.Bug78470Test.MyPerspective";
-
-		public void createInitialLayout(IPageLayout layout) {
-			String editorArea = layout.getEditorArea();
-			IFolderLayout folder1 = layout.createFolder("folder1",
-					IPageLayout.LEFT, .75f, editorArea);
-			// the order is important
-			folder1.addPlaceholder(MyViewPart.ID2);
-			folder1.addView(MyViewPart.ID);
-			folder1.addPlaceholder(MyViewPart.ID3);
-		}
-	}
-
-	public static class MyViewPart extends ViewPart {
-		public static String ID = "org.eclipse.ui.tests.internal.Bug78470Test.MyViewPart";
-
-		public static String ID2 = ID + "2";
-		public static String ID3 = ID + "3";
-
-		public void createPartControl(Composite parent) {
-			Label label = new Label(parent, SWT.NONE);
-			label.setText(getSite().getId());
-		}
-
-		public void setFocus() {
-			// nothing to do
-		}
-	}
-
-	public Bug78470Test(String testName) {
-		super(testName);
-	}
-
-	boolean partVisibleExecuted = false;
-
-	public void test78470() throws Exception {
-		IWorkbench workbench = getWorkbench();
-		final IWorkbenchWindow activeWorkbenchWindow = workbench
-				.getActiveWorkbenchWindow();
-		final IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
-		activeWorkbenchWindow.getPartService().addPartListener(
-				new IPartListener2() {
-					public void partActivated(IWorkbenchPartReference partRef) {
-					}
-					public void partBroughtToTop(IWorkbenchPartReference partRef) {
-					}
-					public void partClosed(IWorkbenchPartReference partRef) {
-					}
-					public void partDeactivated(IWorkbenchPartReference partRef) {
-					}
-					public void partOpened(IWorkbenchPartReference partRef) {
-					}
-					public void partHidden(IWorkbenchPartReference partRef) {
-					}
-					public void partVisible(IWorkbenchPartReference partRef) {
-						if (partRef.getId().equals(MyViewPart.ID)) {
-							partVisibleExecuted = true;
-							try {
-								activePage.showView(MyViewPart.ID2);
-								activePage.showView(MyViewPart.ID3);
-							} catch(Exception ex) {
-								ex.printStackTrace();
-							}
-						}
-					}
-					public void partInputChanged(IWorkbenchPartReference partRef) {
-					}
-				});
-		workbench.showPerspective(MyPerspective.ID, activeWorkbenchWindow);
-		processEvents();
-		Thread.sleep(2000);
-		assertTrue("view was not made visible", partVisibleExecuted);
-		assertNotNull(activePage.findView(MyViewPart.ID2));
-		assertNotNull(activePage.findView(MyViewPart.ID3));
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/Bug99858Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/Bug99858Test.java
deleted file mode 100644
index fd6807b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/Bug99858Test.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal;
-
-import java.io.ByteArrayInputStream;
-
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-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.Platform;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.DeleteResourceAction;
-import org.eclipse.ui.actions.TextActionHandler;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.operations.AdvancedValidationUserApprover;
-import org.eclipse.ui.views.navigator.ResourceNavigator;
-
-/**
- * bug 99858 [IDE] Error upon deleting a project. Tests that our delete code no
- * longer throws a CoreException when deleting a closed project.
- * 
- * @since 3.2
- */
-public class Bug99858Test extends TestCase {
-
-	private static final String NAVIGATOR_VIEW = "org.eclipse.ui.views.ResourceNavigator";
-
-	public static TestSuite suite() {
-		return new TestSuite(Bug99858Test.class);
-	}
-
-	public Bug99858Test() {
-		super();
-	}
-
-	public Bug99858Test(String name) {
-		super(name);
-	}
-
-	/**
-	 * Create a project with some files, close it, and delete it. With the
-	 * changes in runtime to throw a CoreException from IContainer#members(),
-	 * the project won't get deleted if ReadOnlyStateChecker is not fixed.
-	 * 
-	 * @throws Throwable
-	 *             if it goes wrong
-	 */
-	public void testDeleteClosedProject() throws Throwable {
-		IWorkbenchPage page = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage();
-
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IProject testProject = workspace.getRoot().getProject(
-				"TestClosedDelete");
-		testProject.create(null);
-		testProject.open(null);
-
-		String contents = "File ready for execution, sir!";
-		createProjectFile(testProject, "a.txt", contents);
-		createProjectFile(testProject, "b.txt", contents);
-
-		ResourceNavigator view = (ResourceNavigator) page
-				.showView(NAVIGATOR_VIEW);
-		view.setFocus();
-
-		// get a testing version of the delete action, and set it up.
-		MyDeleteResourceAction newDel = new MyDeleteResourceAction(view
-				.getViewSite());
-		newDel.setEnabled(true);
-		TextActionHandler tmpHandler = new TextActionHandler(view.getViewSite()
-				.getActionBars());
-		tmpHandler.setDeleteAction(newDel);
-
-		view.getViewSite().getActionBars().updateActionBars();
-
-		chewUpEvents();
-
-		StructuredSelection s = new StructuredSelection(testProject);
-
-		// close the project and update the selection events.
-		testProject.close(null);
-		assertFalse(testProject.isAccessible());
-		view.getViewSite().getSelectionProvider().setSelection(s);
-		newDel.selectionChanged(s);
-		chewUpEvents();
-
-		IAction del = view.getViewSite().getActionBars()
-				.getGlobalActionHandler(ActionFactory.DELETE.getId());
-
-		assertTrue(del.isEnabled());
-
-		// run the delete event.
-		del.runWithEvent(null);
-
-		chewUpEvents();
-
-		// the delete even ran
-		assertTrue(newDel.fRan);
-
-		//Join twice as there are two jobs now
-		boolean joined = false;
-		while (!joined) {
-			try {
-				Platform
-						.getJobManager()
-						.join(
-								IDEWorkbenchMessages.DeleteResourceAction_jobName,
-								null);
-				joined = true;
-			} catch (InterruptedException ex) {
-				// we might be blocking some other thread, spin the event loop
-				// to run syncExecs
-				chewUpEvents();
-				// and now keep trying to join
-			}
-		}
-
-		joined = false;
-		while (!joined) {
-			try {
-				Platform
-						.getJobManager()
-						.join(
-								IDEWorkbenchMessages.DeleteResourceAction_jobName,
-								null);
-				joined = true;
-			} catch (InterruptedException ex) {
-				// we might be blocking some other thread, spin the event loop
-				// to run syncExecs
-				chewUpEvents();
-				// and now keep trying to join
-			}
-		}
-
-		// if our project still exists, the delete failed.
-		assertFalse(testProject.exists());
-	}
-
-	/**
-	 * Subclass the delete action and go into testing mode, which limits user
-	 * dialogs.
-	 * 
-	 * @since 3.2
-	 */
-	private class MyDeleteResourceAction extends DeleteResourceAction {
-
-		public boolean fRan = false;
-
-		public MyDeleteResourceAction(IShellProvider provider) {
-			super(provider);
-			fTestingMode = true;
-		}
-
-		public void run() {
-			super.run();
-			fRan = true;
-		}
-	}
-
-	/**
-	 * Create a quick project file, so the project has some children to delete.
-	 * 
-	 * @param testProject
-	 *            the project
-	 * @param name
-	 *            the filename
-	 * @param contents
-	 *            A small string for contents
-	 * @throws CoreException
-	 *             if IFile#create(...) throws an exception
-	 */
-	private void createProjectFile(IProject testProject, String name,
-			String contents) throws CoreException {
-		IFile textFile = testProject.getFile(name);
-		ByteArrayInputStream inputStream = new ByteArrayInputStream(contents
-				.getBytes());
-		textFile.create(inputStream, true, null);
-	}
-
-	/**
-	 * After an internal action, see if there are any outstanding SWT events.
-	 */
-	private void chewUpEvents() throws InterruptedException {
-		Display display = Display.getCurrent();
-		while (display.readAndDispatch())
-			;
-	}
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-		AdvancedValidationUserApprover.AUTOMATED_MODE = true;
-	}
-	
-	protected void tearDown() throws Exception {
-		AdvancedValidationUserApprover.AUTOMATED_MODE = false;
-		super.tearDown();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/EditorActionBarsTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/EditorActionBarsTest.java
deleted file mode 100644
index 2ea87e3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/EditorActionBarsTest.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.ICoolBarManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.action.ToolBarContributionItem;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.api.MockAction;
-import org.eclipse.ui.tests.api.MockEditorActionBarContributor;
-import org.eclipse.ui.tests.api.MockEditorPart;
-import org.eclipse.ui.tests.api.MockViewPart;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * This class contains tests for the editor action bars
- * implementation.
- */
-public class EditorActionBarsTest extends UITestCase {
-
-    protected IWorkbenchWindow fWindow;
-
-    protected IWorkbenchPage fPage;
-
-    private String EDITOR_ID = "org.eclipse.ui.tests.internal.EditorActionBarsTest";
-
-    /**
-     * Constructor for IEditorPartTest
-     */
-    public EditorActionBarsTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWindow = openTestWindow();
-        fPage = fWindow.getActivePage();
-    }
-
-    /**
-     * Test action enablement / disablement when a
-     * part is active.
-     * <p>
-     * Created for PR 1GJNB52: ToolItems in EditorToolBarManager can get 
-     * out of synch with the state of the IAction
-     * </p>
-     */
-    public void testActionEnablementWhenActive() throws Throwable {
-        // Open an editor.
-        MockEditorPart editor = openEditor(fPage, "1");
-        MockEditorActionBarContributor contributor = (MockEditorActionBarContributor) editor
-                .getEditorSite().getActionBarContributor();
-
-        // Enable all actions.
-        contributor.enableActions(true);
-        verifyToolItemState(contributor, true);
-
-        // Disable all actions.
-        contributor.enableActions(false);
-        verifyToolItemState(contributor, false);
-    }
-
-    /**
-     * Test action enablement / disablement when a
-     * part is inactive.
-     * <p>
-     * Created for PR 1GJNB52: ToolItems in EditorToolBarManager can get 
-     * out of synch with the state of the IAction
-     * </p>
-     */
-    public void testActionEnablementWhenInactive() throws Throwable {
-        // Open an editor.
-        MockEditorPart editor = openEditor(fPage, "2");
-        MockEditorActionBarContributor contributor = (MockEditorActionBarContributor) editor
-                .getEditorSite().getActionBarContributor();
-
-        // Enable all actions.
-        contributor.enableActions(true);
-        verifyToolItemState(contributor, true);
-
-        // Activate some other part.  Disable the actions.
-        // Then activate the editor and test tool item state.
-        fPage.showView(MockViewPart.ID);
-        contributor.enableActions(false);
-        fPage.activate(editor);
-        verifyToolItemState(contributor, false);
-
-        // Activate some other part.  Enable the actions.
-        // Then activate the editor and test tool item state.
-        fPage.showView(MockViewPart.ID);
-        contributor.enableActions(true);
-        fPage.activate(editor);
-        verifyToolItemState(contributor, true);
-    }
-
-    /**
-     * Open a test editor.
-     */
-    protected MockEditorPart openEditor(IWorkbenchPage page, String suffix)
-            throws Throwable {
-        IProject proj = FileUtil.createProject("IEditorActionBarsTest");
-        IFile file = FileUtil.createFile("test" + suffix + ".txt", proj);
-        return (MockEditorPart) page.openEditor(new FileEditorInput(file),
-                EDITOR_ID);
-    }
-
-    /**
-     * Tests whether actions are enabled.
-     */
-    protected void verifyToolItemState(MockEditorActionBarContributor ctr,
-            boolean enabled) {
-        MockAction[] actions = ctr.getActions();
-        for (int nX = 0; nX < actions.length; nX++)
-            verifyToolItemState(actions[nX], enabled);
-    }
-
-    /**
-     * Tests whether an action is enabled.
-     */
-    protected void verifyToolItemState(IAction action, boolean enabled) {
-        String actionText = action.getText();
-        ICoolBarManager tbm = ((WorkbenchWindow) fWindow).getCoolBarManager();
-        IContributionItem[] coolItems = tbm.getItems();
-        for (int i = 0; i < coolItems.length; ++i) {
-            if (coolItems[i] instanceof ToolBarContributionItem) {
-                ToolBarContributionItem coolItem = (ToolBarContributionItem) coolItems[i];
-                IToolBarManager citbm = coolItem.getToolBarManager();
-                ToolBar tb = ((ToolBarManager) citbm).getControl();
-                verifyNullToolbar(tb, actionText, citbm);
-                if (tb != null && !tb.isDisposed()) {
-                    ToolItem[] items = tb.getItems();
-                    for (int j = 0; j < items.length; j++) {
-                        String itemText = items[j].getToolTipText();
-                        if (actionText.equals(itemText)) {
-                            assertEquals(enabled, items[j].getEnabled());
-                            return;
-                        }
-                    }
-                }
-            }
-        }
-        fail("Action for " + actionText + " not found");
-    }
-
-    /**
-     * Confirms that a ToolBar is not null when you're looking a manager that 
-     * is a CoolItemToolBarManager and it has non-separator/non-invisible 
-     * contributions.
-     * This is a consequence of the changes made to 
-     * CoolItemToolBarManager.update() that hides the a bar if it does not
-     * contain anything as per the above mentioned criteria.  Under this 
-     * circumstance, the underlying ToolBar is not created.
-     * 
-     * @param tb the ToolBar to check
-     * @param actionText the action text
-     * @param manager the IToolBarManager containing items
-     * @since 3.0
-     */
-    private void verifyNullToolbar(ToolBar tb, String actionText,
-            IToolBarManager manager) {
-        if (tb == null) { // toolbar should only be null if the given manager is
-            // a CoolBarManager and it contains only separators or invisible 
-            // objects.  
-            IContributionItem[] items = manager.getItems();
-            for (int i = 0; i < items.length; i++) {
-                if (!(items[i] instanceof Separator) && items[i].isVisible()) {
-                    fail("No toolbar for a visible action text \"" + actionText
-                            + "\"");
-                }
-            }
-
-        }
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ExtendedSourceViewer.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ExtendedSourceViewer.java
deleted file mode 100644
index 967a5b4..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ExtendedSourceViewer.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal;
-
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.text.source.IVerticalRuler;
-import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-
-public class ExtendedSourceViewer extends SourceViewer {
-
-    /**
-     * Constructs a new source viewer. The vertical ruler is initially visible.
-     * The viewer has not yet been initialized with a source viewer configuration.
-     *
-     * @param parent the parent of the viewer's control
-     * @param ruler the vertical ruler used by this source viewer
-     * @param styles the SWT style bits
-     */
-    public ExtendedSourceViewer(Composite parent, IVerticalRuler ruler,
-            int styles) {
-        super(parent, ruler, styles);
-    }
-
-    /*
-     * @see Viewer#getSelection()
-     */
-    public ISelection getSelection() {
-        Point p = getSelectedRange();
-        if (p.x == -1 || p.y == -1)
-            return TextSelection.emptySelection();
-
-        return new ExtendedTextSelection(getDocument(), p.x, p.y);
-    }
-
-    /**
-     * Sends out a selection changed event to all registered listeners.
-     *
-     * @param offset the offset of the newly selected range
-     * @param length the length of the newly selected range
-     */
-    protected void selectionChanged(int offset, int length) {
-        ISelection selection = new ExtendedTextSelection(getDocument(), offset,
-                length);
-        SelectionChangedEvent event = new SelectionChangedEvent(this, selection);
-        fireSelectionChanged(event);
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ExtendedTextEditor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ExtendedTextEditor.java
deleted file mode 100644
index 160e6f1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ExtendedTextEditor.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal;
-
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jface.text.source.IVerticalRuler;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.editors.text.TextEditor;
-
-public class ExtendedTextEditor extends TextEditor {
-
-    /**
-     * Constructor for TextSelectionActionFilterEditor.
-     */
-    public ExtendedTextEditor() {
-        super();
-    }
-
-    /**
-     * Creates the source viewer to be used by this editor.
-     * Subclasses may re-implement this method.
-     *
-     * @param parent the parent control
-     * @param ruler the vertical ruler
-     * @param styles style bits
-     * @return the source viewer
-     */
-    protected ISourceViewer createSourceViewer(Composite parent,
-            IVerticalRuler ruler, int styles) {
-        return new ExtendedSourceViewer(parent, ruler, styles);
-    }
-
-    public boolean isDirty() {
-        return false;
-    }
-
-    /**
-     * Set the text in the editor.
-     */
-    public void setText(String text) {
-        ExtendedSourceViewer viewer = (ExtendedSourceViewer) getSourceViewer();
-        StyledText widget = viewer.getTextWidget();
-        widget.setText(text);
-        viewer.setSelectedRange(0, text.length());
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ExtendedTextSelection.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ExtendedTextSelection.java
deleted file mode 100644
index 4b365bf..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ExtendedTextSelection.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.ui.IActionFilter;
-
-public class ExtendedTextSelection extends TextSelection implements IAdaptable {
-    static private ExtendedTextSelectionActionFilter filter = new ExtendedTextSelectionActionFilter();
-
-    /**
-     * Constructor for ExtendedTextSelection.
-     * @param offset
-     * @param length
-     */
-    public ExtendedTextSelection(int offset, int length) {
-        super(offset, length);
-    }
-
-    /**
-     * Constructor for ExtendedTextSelection.
-     * @param document
-     * @param offset
-     * @param length
-     */
-    public ExtendedTextSelection(IDocument document, int offset, int length) {
-        super(document, offset, length);
-    }
-
-    /*
-     * @see IAdaptable#getAdapter(Class)
-     */
-    public Object getAdapter(Class adapter) {
-        if (adapter == IActionFilter.class) {
-            return filter;
-        }
-        return null;
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ExtendedTextSelectionActionFilter.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ExtendedTextSelectionActionFilter.java
deleted file mode 100644
index 8786dc8..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ExtendedTextSelectionActionFilter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal;
-
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.ui.IActionFilter;
-
-public class ExtendedTextSelectionActionFilter implements IActionFilter {
-
-    /**
-     * An attribute indicating the selection length (value <code>"isEmpty"</code>).  
-     * The attribute value in xml must be one of <code>"true" or "false"</code>.
-     */
-    public static final String IS_EMPTY = "isEmpty"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating the selection text (value <code>"text"</code>).  
-     * The attribute value in xml is unconstrained.
-     */
-    public static final String TEXT = "text"; //$NON-NLS-1$
-
-    /**
-     * An attribute indicating the selection text (value <code>"text"</code>).  
-     * The attribute value in xml is unconstrained.
-     */
-    public static final String CASE_INSENSITIVE_TEXT = "caseInsensitiveText"; //$NON-NLS-1$
-
-    /*
-     * @see IActionFilter#testAttribute(Object, String, String)
-     */
-    public boolean testAttribute(Object target, String name, String value) {
-        ITextSelection sel = (ITextSelection) target;
-        if (name.equals(IS_EMPTY)) {
-            return (sel.getLength() == 0);
-        } else if (name.equals(TEXT)) {
-            String text = sel.getText();
-            return (text.indexOf(value) >= 0);
-        } else if (name.equals(CASE_INSENSITIVE_TEXT)) {
-            String text = sel.getText().toLowerCase();
-            value = value.toLowerCase();
-            return (text.indexOf(value) >= 0);
-        }
-        return false;
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ForcedException.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ForcedException.java
deleted file mode 100644
index f54ce5e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ForcedException.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.internal;
-
-import java.io.PrintStream;
-import java.io.PrintWriter;
-
-/**
- * An intentionally thrown exception for use in testing error handling code.
- *
- * @since 3.1
- */
-public class ForcedException extends RuntimeException {
-
-	 private static final long serialVersionUID= 1L;
-
-	 /**
-	  * Creates a <code>ForcedException</code> with the given message.
-	  *  
-	  * @param message the message
-	  */
-	 public ForcedException(String message) {
-		 super(message);
-	 }
-	 
-	 public void printStackTrace(PrintStream s) {
-	 		 s.println("!FORCED BY TEST: this entry is intentional: " + getMessage());
-	 }
-	 		 		 
-	 public void printStackTrace(PrintWriter s) {
-	 		 s.println("!FORCED BY TEST: this entry is intentional:" + getMessage());
-	 }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/InternalTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/InternalTestSuite.java
deleted file mode 100644
index b001fd6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/InternalTestSuite.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.ui.tests.markers.Bug75909Test;
-import org.eclipse.ui.tests.markers.DeclarativeFilterActivityTest;
-import org.eclipse.ui.tests.markers.DeclarativeFilterDeclarationTest;
-import org.eclipse.ui.tests.markers.MarkerSupportRegistryTests;
-import org.eclipse.ui.tests.markers.MarkerTesterTest;
-import org.eclipse.ui.tests.markers.MarkerViewTests;
-import org.eclipse.ui.tests.markers.ResourceMappingMarkersTest;
-
-/**
- * Test all areas of the UI Implementation.
- */
-public class InternalTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite.  This is required to
-     * use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new InternalTestSuite();
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public InternalTestSuite() {
-        addTest(new TestSuite(AnimationEngineTest.class));
-        addTest(new TestSuite(EditorActionBarsTest.class));
-        addTest(new TestSuite(ActionSetExpressionTest.class));
-        addTest(new TestSuite(PopupMenuExpressionTest.class));
-        addTest(new TestSuite(Bug41931Test.class));
-        addTest(Bug75909Test.suite());
-        addTest(new TestSuite(Bug78470Test.class));
-        addTest(new TestSuite(DeclarativeFilterActivityTest.class));
-        addTest(new TestSuite(DeclarativeFilterDeclarationTest.class));
-        addTest(new TestSuite(ResourceMappingMarkersTest.class));
-        addTest(new TestSuite(MarkerSupportRegistryTests.class));
-        addTest(new TestSuite(MarkerViewTests.class));
-        addTest(Bug99858Test.suite());
-        addTest(new TestSuite(WorkbenchWindowSubordinateSourcesTests.class));
-        addTest(new TestSuite(ReopenMenuTest.class));
-        addTest(new TestSuite(UtilTest.class));
-		addTest(new TestSuite(MarkerTesterTest.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/PopupMenuExpressionTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/PopupMenuExpressionTest.java
deleted file mode 100644
index 78c5353..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/PopupMenuExpressionTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal;
-
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.ui.tests.api.ListView;
-import org.eclipse.ui.tests.harness.util.ActionUtil;
-
-/**
- * This class contains tests for popup menu visibility
- */
-public class PopupMenuExpressionTest extends ActionExpressionTest {
-
-    public PopupMenuExpressionTest(String testName) {
-        super(testName);
-    }
-
-    /**
-     * Returns the menu manager containing the actions.
-     */
-    protected MenuManager getActionMenuManager(ListView view) throws Throwable {
-        return view.getMenuManager();
-    }
-
-    /**
-     * Tests the visibility of an action.
-     */
-    protected void testAction(MenuManager mgr, String action, boolean expected)
-            throws Throwable {
-        if (expected)
-            assertNotNull(action, ActionUtil.getActionWithLabel(mgr, action));
-        else
-            assertNull(action, ActionUtil.getActionWithLabel(mgr, action));
-    }
-
-    public void testExpressionEnabledAction() throws Throwable {
-        // Setup.
-        ListView view = showListView();
-        MenuManager mgr = getActionMenuManager(view);
-
-        // Test null selection.
-        selectAndUpdateMenu(view, null, mgr);
-        testAction(mgr, "expressionEnablementAction_v2", false);
-
-        // Test red selection.
-        selectAndUpdateMenu(view, red, mgr);
-        testAction(mgr, "expressionEnablementAction_v2", true);
-
-        // Test blue selection.
-        selectAndUpdateMenu(view, blue, mgr);
-        testAction(mgr, "expressionEnablementAction_v2", false);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ReopenMenuTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ReopenMenuTest.java
deleted file mode 100644
index faf0953..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ReopenMenuTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.internal;
-
-import org.eclipse.osgi.util.TextProcessor;
-import org.eclipse.ui.internal.ReopenEditorMenu;
-
-import junit.framework.TestCase;
-
-/**
- * @since 3.4
- * 
- */
-public class ReopenMenuTest extends TestCase {
-	private static class TextInfo {
-		int index;
-		String filename;
-		String path;
-		String ltrExpected;
-		String rtlExpected;
-
-		public TextInfo(int index, String filename, String path,
-				String ltrExpected, String rtlExpected) {
-			this.index = index;
-			this.filename = filename;
-			this.path = path;
-			this.ltrExpected = ltrExpected;
-			this.rtlExpected = rtlExpected;
-		}
-	}
-
-	private TextInfo[] data = {
-			new TextInfo(
-					1,
-					"ReopenMenuTest.java",
-					"org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/ReopenMenuTest.java",
-					"&2 ReopenMenuTest.java  [org.eclipse.ui...]",
-					"ReopenMenuTest.java  [org.eclipse.ui...] &2"),
-			new TextInfo(2, "A.java", "ex/src/ex/A.java",
-					"&3 A.java  [ex/src/ex]", "A.java  [ex/src/ex] &3"),
-			new TextInfo(
-					3,
-					"AReallyLongNameLazyFoxJumpsSomeStupidRiver.java",
-					"org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/AReallyLongNameLazyFoxJumpsSomeStupidRiver.java",
-					"&4 AReallyLongNameLazyFoxJumpsSomeStupid...",
-					"AReallyLongNameLazyFoxJumpsSomeStupid... &4"), };
-
-	/**
-	 * @param name
-	 */
-	public ReopenMenuTest(String name) {
-		super(name);
-	}
-
-	public void testLtr() {
-		for (int i = 0; i < data.length; i++) {
-			TextInfo info = data[i];
-			String expected = TextProcessor.process(info.ltrExpected,
-					TextProcessor.getDefaultDelimiters() + "[]");
-			String val = ReopenEditorMenu.calcText(info.index, info.filename,
-					info.path, false);
-			assertEquals("testing item " + i, expected, val);
-		}
-	}
-
-	public void testRtl() {
-		for (int i = 0; i < data.length; i++) {
-			TextInfo info = data[i];
-			String expected = TextProcessor.process(info.rtlExpected,
-					TextProcessor.getDefaultDelimiters() + "[]");
-			String val = ReopenEditorMenu.calcText(info.index, info.filename,
-					info.path, true);
-			assertEquals("testing item " + i, expected, val);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/TestMemento.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/TestMemento.java
deleted file mode 100644
index 56bc823..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/TestMemento.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.ui.IMemento;
-
-public class TestMemento implements IMemento {
-	
-	String typeName;
-	String id;
-	HashSet children = new HashSet();
-	Hashtable values = new Hashtable();
-	String textData;
-	
-	public TestMemento(String type, String id){
-		typeName = type;
-		this.id = id;
-	}
-
-	public IMemento createChild(String type) {
-		return createChild(type, null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#createChild(java.lang.String, java.lang.String)
-	 */
-	public IMemento createChild(String type, String id) {
-		IMemento child  = new TestMemento(typeName,id);
-		children.add(child);
-		return child;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#getChild(java.lang.String)
-	 */
-	public IMemento getChild(String type) {
-		Iterator iterator = children.iterator();
-		while(iterator.hasNext()){
-			TestMemento next = (TestMemento) iterator.next();
-			if(next.typeName.equals(type))
-				return next;
-		}
-		return null;
-	}
-
-	public IMemento[] getChildren(String type) {
-		Iterator iterator = children.iterator();
-		Collection matches = new HashSet();
-		while(iterator.hasNext()){
-			TestMemento next = (TestMemento) iterator.next();
-			if(next.typeName.equals(type)){
-				matches.add(next);
-			}
-		}
-		
-		IMemento[] returnValue = new IMemento[matches.size()];
-		matches.toArray(returnValue);
-		return returnValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#getFloat(java.lang.String)
-	 */
-	public Float getFloat(String key) {
-		if(values.containsKey(key))
-			return (Float) values.get(key);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#getID()
-	 */
-	public String getID() {
-		return id;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#getInteger(java.lang.String)
-	 */
-	public Integer getInteger(String key) {
-		if(values.containsKey(key))
-			return (Integer) values.get(key);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#getString(java.lang.String)
-	 */
-	public String getString(String key) {
-		if(values.containsKey(key))
-			return (String) values.get(key);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#getTextData()
-	 */
-	public String getTextData() {
-		return textData;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#putFloat(java.lang.String, float)
-	 */
-	public void putFloat(String key, float value) {
-		values.put(key,new Float(value));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#putInteger(java.lang.String, int)
-	 */
-	public void putInteger(String key, int value) {
-		values.put(key,new Integer(value));
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#putMemento(org.eclipse.ui.IMemento)
-	 */
-	public void putMemento(IMemento memento) {
-		TestMemento newMemento = (TestMemento) memento;
-		typeName = newMemento.typeName;
-		id =  newMemento.id;
-		children =  newMemento.children;
-		values =  newMemento.values;
-		textData =  newMemento.textData;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#putString(java.lang.String, java.lang.String)
-	 */
-	public void putString(String key, String value) {
-		values.put(key,value);
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#putTextData(java.lang.String)
-	 */
-	public void putTextData(String data) {
-		textData = data;
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#getAttributeKeys()
-	 */
-	public String[] getAttributeKeys() {
-		Set keySet = values.keySet();
-		return (String[]) keySet.toArray(new String[keySet.size()]);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#getBoolean(java.lang.String)
-	 */
-	public Boolean getBoolean(String key) {
-		if(values.containsKey(key))
-			return (Boolean) values.get(key);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#getType()
-	 */
-	public String getType() {
-		return typeName;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IMemento#putBoolean(java.lang.String, boolean)
-	 */
-	public void putBoolean(String key, boolean value) {
-		values.put(key, value?Boolean.TRUE:Boolean.FALSE);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/TextSelectionActionExpressionTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/TextSelectionActionExpressionTest.java
deleted file mode 100644
index e28d98b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/TextSelectionActionExpressionTest.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.internal;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.SubContributionItem;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.ActionUtil;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * This class contains tests for text selection action enablement
- */
-public class TextSelectionActionExpressionTest extends UITestCase {
-    protected IWorkbenchWindow fWindow;
-
-    protected IWorkbenchPage fPage;
-
-    public TextSelectionActionExpressionTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWindow = openTestWindow();
-        fPage = fWindow.getActivePage();
-    }
-
-    public void testAnyTextAction() throws Throwable {
-        // Setup.
-        ExtendedTextEditor editor = showTextEditor("anyText.exttxt");
-        MenuManager mgr = getActionMenuManager(editor);
-
-        // Test empty selection.
-        selectAndUpdateMenu(editor, "", mgr);
-        testAction(mgr, "anyText", true);
-
-        // Test full selection.
-        selectAndUpdateMenu(editor, "bob", mgr);
-        testAction(mgr, "anyText", true);
-
-        // Activate another view.
-        fPage.showView(IPageLayout.ID_BOOKMARKS);
-        testAction(mgr, "anyText", false);
-
-        // Activate editor.
-        // Test old selection.
-        fPage.activate(editor);
-        testAction(mgr, "anyText", true);
-
-        // Test empty selection.
-        selectAndUpdateMenu(editor, "", mgr);
-        testAction(mgr, "anyText", true);
-    }
-
-    public void testEmptyTextAction() throws Throwable {
-        // Setup.
-        ExtendedTextEditor editor = showTextEditor("emptyText.exttxt");
-        MenuManager mgr = getActionMenuManager(editor);
-
-        // Test empty selection.
-        selectAndUpdateMenu(editor, "", mgr);
-        testAction(mgr, "emptyText", true);
-
-        // Test full selection.
-        selectAndUpdateMenu(editor, "bob", mgr);
-        testAction(mgr, "emptyText", false);
-
-        // Activate another view.
-        fPage.showView(IPageLayout.ID_BOOKMARKS);
-        testAction(mgr, "emptyText", false);
-
-        // Activate editor.
-        // Test old selection.
-        fPage.activate(editor);
-        testAction(mgr, "emptyText", false);
-
-        // Test empty selection.
-        selectAndUpdateMenu(editor, "", mgr);
-        testAction(mgr, "emptyText", true);
-    }
-
-    public void testHelloTextAction() throws Throwable {
-        // Setup.
-        ExtendedTextEditor editor = showTextEditor("helloText.exttxt");
-        MenuManager mgr = getActionMenuManager(editor);
-
-        // Test empty selection.
-        selectAndUpdateMenu(editor, "", mgr);
-        testAction(mgr, "helloText", false);
-
-        // Test wrong selection.
-        selectAndUpdateMenu(editor, "bob", mgr);
-        testAction(mgr, "helloText", false);
-
-        // Test right selection.
-        selectAndUpdateMenu(editor, "Hello", mgr);
-        testAction(mgr, "helloText", true);
-
-        // Activate another view.
-        fPage.showView(IPageLayout.ID_BOOKMARKS);
-        testAction(mgr, "helloText", false);
-
-        // Activate editor.
-        // Test old selection.
-        fPage.activate(editor);
-        testAction(mgr, "helloText", true);
-
-        // Test wrong selection.
-        selectAndUpdateMenu(editor, "bob", mgr);
-        testAction(mgr, "helloText", false);
-    }
-
-    /**
-     * Creates the list view.
-     */
-    private ExtendedTextEditor showTextEditor(String fileName) throws Throwable {
-        IProject proj = FileUtil
-                .createProject("TextSelectionActionExpressionTest");
-        IFile file = FileUtil.createFile(fileName, proj);
-        return (ExtendedTextEditor) IDE.openEditor(fPage, file, true);
-    }
-
-    /**
-     * Select an object and fire about to show.
-     */
-    private void selectAndUpdateMenu(ExtendedTextEditor editor, String str,
-            MenuManager mgr) throws Throwable {
-        editor.setText(str);
-        fPage.saveEditor(editor, false);
-        ActionUtil.fireAboutToShow(mgr);
-    }
-
-    /**
-     * Returns the menu manager containing the actions.
-     */
-    private MenuManager getActionMenuManager(ExtendedTextEditor editor)
-            throws Throwable {
-        fPage
-                .showActionSet("org.eclipse.ui.tests.internal.TextSelectionActions");
-        WorkbenchWindow win = (WorkbenchWindow) fWindow;
-        IContributionItem item = win.getMenuBarManager().find(
-                "org.eclipse.ui.tests.internal.TextSelectionMenu");
-        while (item instanceof SubContributionItem) {
-            item = ((SubContributionItem) item).getInnerItem();
-            if (item instanceof MenuManager)
-                return (MenuManager) item;
-        }
-        fail("Unable to find menu manager");
-        return null;
-    }
-
-    /**
-     * Tests the enablement / visibility of an action.
-     */
-    private void testAction(MenuManager mgr, String action, boolean expected)
-            throws Throwable {
-        assertEquals(action, expected, ActionUtil.getActionWithLabel(mgr,
-                action).isEnabled());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/UtilTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/UtilTest.java
deleted file mode 100644
index 08fdcc9..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/UtilTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.internal;
-
-import org.eclipse.ui.internal.util.Util;
-
-import junit.framework.TestCase;
-
-/**
- * @since 3.5
- */
-public class UtilTest extends TestCase {
-	public UtilTest(String name) {
-		super(name);
-	}
-	
-	public void testBasicSplit() {
-		final String field = "field1";
-		String[] result = Util.split(field, ',');
-		assertEquals(1, result.length);
-		assertEquals(field, result[0]);
-	}
-	
-	public void testBasic2Split() {
-		final String field = "field1,field2";
-		String[] result = Util.split(field, ',');
-		assertEquals(2, result.length);
-		assertEquals("field1", result[0]);
-		assertEquals("field2", result[1]);
-	}
-	
-	public void testBasic3Split() {
-		final String field = "field1,field3,field2";
-		String[] result = Util.split(field, ',');
-		assertEquals(3, result.length);
-		assertEquals("field1", result[0]);
-		assertEquals("field3", result[1]);
-		assertEquals("field2", result[2]);
-	}
-	
-	public void testNothingSplit() {
-		final String field = "";
-		String[] result = Util.split(field, ',');
-		assertEquals(1, result.length);
-		assertEquals(0, result[0].length());
-	}
-	
-	public void testNothingUsefulSplit() {
-		final String field = ",";
-		String[] result = Util.split(field, ',');
-		assertEquals(0, result.length);
-	}
-	
-	public void testNothingUseful2Split() {
-		final String field = ",,";
-		String[] result = Util.split(field, ',');
-		assertEquals(0, result.length);
-	}
-	
-	public void testNothingUsefulSpaceSplit() {
-		final String field = " ,";
-		String[] result = Util.split(field, ',');
-		assertEquals(1, result.length);
-		assertEquals(" ", result[0]);
-	}
-
-	public void testNothingUsefulSpaceSplit2() {
-		final String field = ", ";
-		String[] result = Util.split(field, ',');
-		assertEquals(2, result.length);
-		assertEquals(0, result[0].length());
-		assertEquals(" ", result[1]);
-	}
-	
-	public void testNothingUsefulSpaceSplit3() {
-		final String field = " , ";
-		String[] result = Util.split(field, ',');
-		assertEquals(2, result.length);
-		assertEquals(" ", result[0]);
-		assertEquals(" ", result[1]);
-	}
-	
-	public void test2Delimiters() {
-		final String field = "field1,,field3,field2";
-		String[] result = Util.split(field, ',');
-		assertEquals(4, result.length);
-		assertEquals("field1", result[0]);
-		assertEquals(0, result[1].length());
-		assertEquals("field3", result[2]);
-		assertEquals("field2", result[3]);
-	}
-
-	public void test3Delimiters() {
-		final String field = "field1,,,field3,field2";
-		String[] result = Util.split(field, ',');
-		assertEquals(5, result.length);
-		assertEquals("field1", result[0]);
-		assertEquals(0, result[1].length());
-		assertEquals(0, result[2].length());
-		assertEquals("field3", result[3]);
-		assertEquals("field2", result[4]);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/WorkbenchWindowSubordinateSourcesTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/WorkbenchWindowSubordinateSourcesTests.java
deleted file mode 100644
index ef32540..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/internal/WorkbenchWindowSubordinateSourcesTests.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.internal;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.internal.expressions.EqualsExpression;
-import org.eclipse.core.internal.expressions.WithExpression;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.ISources;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.services.IEvaluationService;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests various sources keyed off the workbench window.
- * 
- * @since 3.3
- * 
- */
-public class WorkbenchWindowSubordinateSourcesTests extends UITestCase {
-
-	private WorkbenchWindow window;
-
-	/**
-	 * @param testName
-	 */
-	public WorkbenchWindowSubordinateSourcesTests(String testName) {
-		super(testName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doSetUp()
-	 */
-	protected void doSetUp() throws Exception {
-		window = (WorkbenchWindow) openTestWindow();
-		processEvents();
-	}
-
-	public void testIsCoolbarVisible() {
-		IEvaluationService service = (IEvaluationService) window
-				.getService(IEvaluationService.class);
-		IEvaluationContext context = service.getCurrentState();
-
-		WithExpression with = new WithExpression(
-				ISources.ACTIVE_WORKBENCH_WINDOW_IS_COOLBAR_VISIBLE_NAME);
-		boolean current = window.getCoolBarVisible();
-		EqualsExpression test = new EqualsExpression(current ? Boolean.TRUE
-				: Boolean.FALSE);
-		with.add(test);
-
-		try {
-			assertEquals(EvaluationResult.TRUE, with.evaluate(context));
-		} catch (CoreException e) {
-			fail(e.getMessage());
-		}
-
-		window.setCoolBarVisible(current = !current);
-		try {
-			assertEquals(EvaluationResult.FALSE, with.evaluate(context));
-		} catch (CoreException e) {
-			fail(e.getMessage());
-		}
-	}
-
-	public void testIsStatusLineVisible() {
-		IEvaluationService service = (IEvaluationService) window
-				.getService(IEvaluationService.class);
-		IEvaluationContext context = service.getCurrentState();
-
-		WithExpression with = new WithExpression(
-				ISources.ACTIVE_WORKBENCH_WINDOW_NAME + ".isStatusLineVisible");
-		boolean current = window.getStatusLineVisible();
-		EqualsExpression test = new EqualsExpression(current ? Boolean.TRUE
-				: Boolean.FALSE);
-		with.add(test);
-
-		try {
-			assertEquals(EvaluationResult.TRUE, with.evaluate(context));
-		} catch (CoreException e) {
-			fail(e.getMessage());
-		}
-
-		window.setStatusLineVisible(current = !current);
-		try {
-			assertEquals(EvaluationResult.FALSE, with.evaluate(context));
-		} catch (CoreException e) {
-			fail(e.getMessage());
-		}
-	}
-	
-	public void testIsPerspectiveBarVisible() {
-		IEvaluationService service = (IEvaluationService) window
-				.getService(IEvaluationService.class);
-		IEvaluationContext context = service.getCurrentState();
-
-		WithExpression with = new WithExpression(
-				ISources.ACTIVE_WORKBENCH_WINDOW_IS_PERSPECTIVEBAR_VISIBLE_NAME);
-		boolean current = window.getPerspectiveBarVisible();
-		EqualsExpression test = new EqualsExpression(current ? Boolean.TRUE
-				: Boolean.FALSE);
-		with.add(test);
-
-		try {
-			assertEquals(EvaluationResult.TRUE, with.evaluate(context));
-		} catch (CoreException e) {
-			fail(e.getMessage());
-		}
-
-		window.setPerspectiveBarVisible(current = !current);
-		try {
-			assertEquals(EvaluationResult.FALSE, with.evaluate(context));
-		} catch (CoreException e) {
-			fail(e.getMessage());
-		}
-	}
-
-	private static class PerspectiveL implements IPropertyChangeListener {
-		Boolean val = null;
-
-		public void propertyChange(PropertyChangeEvent event) {
-			val = (Boolean) event.getNewValue();
-		}
-	}
-
-	public void testPerspectiveId() throws Exception {
-		IEvaluationService service = (IEvaluationService) window
-				.getService(IEvaluationService.class);
-		WithExpression with = new WithExpression(
-				ISources.ACTIVE_WORKBENCH_WINDOW_ACTIVE_PERSPECTIVE_NAME);
-		IPerspectiveDescriptor currentPerspective = window.getActivePage().getPerspective();
-		String id = currentPerspective.getId();
-		EqualsExpression test = new EqualsExpression(id);
-		with.add(test);
-		PerspectiveL listener = new PerspectiveL();
-		service.addEvaluationListener(with, listener,
-				ISources.ACTIVE_WORKBENCH_WINDOW_ACTIVE_PERSPECTIVE_NAME);
-		assertEquals(Boolean.TRUE, listener.val);
-		listener.val = null;
-
-		final IPerspectiveRegistry registry = WorkbenchPlugin.getDefault()
-				.getPerspectiveRegistry();
-		final IPerspectiveDescriptor perspective1 = registry
-				.findPerspectiveWithId("org.eclipse.ui.tests.api.ViewPerspective");
-		window.getActivePage().setPerspective(perspective1);
-		assertEquals(Boolean.FALSE, listener.val);
-		listener.val = null;
-		window.getActivePage().closePerspective(perspective1, false, false);
-		assertEquals(Boolean.TRUE, listener.val);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/IntroPartTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/IntroPartTest.java
deleted file mode 100644
index 18342b2..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/IntroPartTest.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.intro;
-
-import java.util.Arrays;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.internal.Workbench;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.intro.IntroDescriptor;
-import org.eclipse.ui.intro.IIntroPart;
-import org.eclipse.ui.tests.api.IWorkbenchPartTest;
-import org.eclipse.ui.tests.api.MockPart;
-import org.eclipse.ui.tests.harness.util.CallHistory;
-
-/**
- * @since 3.0
- */
-public class IntroPartTest extends IWorkbenchPartTest {
-
-    private IntroDescriptor oldDesc;
-
-    /**
-     * @param testName
-     */
-    public IntroPartTest(String testName) {
-        super(testName);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.api.IWorkbenchPartTest#openPart(org.eclipse.ui.IWorkbenchPage)
-     */
-    protected MockPart openPart(IWorkbenchPage page) throws Throwable {
-        return (MockIntroPart) page.getWorkbenchWindow().getWorkbench()
-                .getIntroManager().showIntro(page.getWorkbenchWindow(), false);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.api.IWorkbenchPartTest#closePart(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.tests.api.MockWorkbenchPart)
-     */
-    protected void closePart(IWorkbenchPage page, MockPart part)
-            throws Throwable {
-        assertTrue(page.getWorkbenchWindow().getWorkbench().getIntroManager()
-                .closeIntro((IIntroPart) part));
-    }
-
-    public void testOpenAndClose() throws Throwable {
-        // Open a part.
-        MockPart part = openPart(fPage);
-        CallHistory history = part.getCallHistory();
-        assertTrue(history.verifyOrder(new String[] { "init",
-                "createPartControl", "setFocus", "standbyStateChanged" }));
-
-        // Close the part.
-        closePart(fPage, part);
-        assertTrue(history.verifyOrder(new String[] { "init",
-                "createPartControl", "setFocus", "dispose" }));
-    }
-
-    /**
-     * Tests to ensure that the image of the descriptor is the same as the part.
-     * 
-     * @throws Throwable
-     */
-    public void testImage() throws Throwable {
-        MockPart part = openPart(fPage);
-        ImageDescriptor imageDescriptor = getIntroDesc().getImageDescriptor();
-        assertNotNull(imageDescriptor);
-
-        Image descImage = imageDescriptor.createImage(false);
-        assertNotNull(descImage);
-
-        Image partImage = part.getTitleImage();
-        assertNotNull(partImage);
-        assertTrue(Arrays.equals(descImage.getImageData().data, partImage
-                .getImageData().data));
-        if (descImage != null)
-            descImage.dispose();
-        closePart(fPage, part);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.util.UITestCase#doSetUp()
-     */
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        oldDesc = Workbench.getInstance().getIntroDescriptor();
-        IntroDescriptor testDesc = getIntroDesc();
-        Workbench.getInstance().setIntroDescriptor(testDesc);
-    }
-
-    /**
-     * @return
-     */
-    private IntroDescriptor getIntroDesc() {
-        return (IntroDescriptor) WorkbenchPlugin.getDefault()
-                .getIntroRegistry().getIntro("org.eclipse.ui.testintro");
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.util.UITestCase#doTearDown()
-     */
-    protected void doTearDown() throws Exception {
-        super.doTearDown();
-        Workbench.getInstance().setIntroDescriptor(oldDesc);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/IntroTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/IntroTest.java
deleted file mode 100644
index 6cfe1df..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/IntroTest.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.intro;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.Workbench;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.internal.intro.IIntroConstants;
-import org.eclipse.ui.internal.intro.IntroDescriptor;
-import org.eclipse.ui.internal.util.PrefUtil;
-import org.eclipse.ui.intro.IIntroManager;
-import org.eclipse.ui.intro.IIntroPart;
-import org.eclipse.ui.tests.api.PerspectiveWithFastView;
-import org.eclipse.ui.tests.harness.util.EmptyPerspective;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.0
- */
-public class IntroTest extends UITestCase {
-
-    IWorkbenchWindow window = null;
-
-    private IntroDescriptor oldDesc;
-
-    /**
-     * @param testName
-     */
-    public IntroTest(String testName) {
-        super(testName);
-    }
-    
-    public void testCloseInFastViewPerspective() {
-    	testClose(PerspectiveWithFastView.PERSP_ID);
-	}
-
-    public void testCloseInEmptyPerspective() {
-    	testClose(EmptyPerspective.PERSP_ID);
-	}
-
-    public void testCloseInNonEmptyPerspective() {
-    	testClose("org.eclipse.ui.resourcePerspective");
-    }
-
-    private void testClose(String perspectiveId) {
-		IPerspectiveDescriptor descriptor = window.getWorkbench()
-				.getPerspectiveRegistry().findPerspectiveWithId(
-						perspectiveId);
-		window.getActivePage().setPerspective(descriptor);
-
-		IIntroManager introManager = window.getWorkbench().getIntroManager();
-		IIntroPart part = introManager.showIntro(window, false);
-		introManager.closeIntro(part);
-
-		assertTrue(((WorkbenchWindow) window).getCoolBarVisible());
-		assertTrue(((WorkbenchWindow) window).getPerspectiveBarVisible());
-	}
-    
-    public void testShow() {
-        IIntroManager introManager = window.getWorkbench().getIntroManager();
-        IIntroPart part = introManager.showIntro(window, false);
-        assertNotNull(part);
-        assertFalse(introManager.isIntroStandby(part));
-        introManager.closeIntro(part);
-        assertNull(introManager.getIntro());
-
-        part = introManager.showIntro(window, true);
-        assertNotNull(part);
-        assertTrue(introManager.isIntroStandby(part));
-        assertTrue(introManager.closeIntro(part));
-        assertNull(introManager.getIntro());
-    }
-
-    public void testStandby() {
-        IWorkbench workbench = window.getWorkbench();
-        IIntroPart part = workbench.getIntroManager().showIntro(window, false);
-        assertNotNull(part);
-        assertFalse(workbench.getIntroManager().isIntroStandby(part));
-        workbench.getIntroManager().setIntroStandby(part, true);
-        assertTrue(workbench.getIntroManager().isIntroStandby(part));
-        assertTrue(workbench.getIntroManager().closeIntro(part));
-        assertNull(workbench.getIntroManager().getIntro());
-    }
-
-    /**
-     * Open the intro, change perspective, close the intro (ensure it still 
-     * exists), change back to the first perspective, close the intro, ensure 
-     * that it no longer exists.
-     */
-    public void testPerspectiveChange() {
-		// These tests are hard-wired to the pre-3.3 zoom behaviour
-		// Run them anyway to ensure that we preserve the 3.0 mechanism
-        IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore();
-        boolean oldMinMaxState = apiStore.getBoolean(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX);
-		apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, false);
-        
-    	IWorkbench workbench = window.getWorkbench();
-        IIntroPart part = workbench.getIntroManager().showIntro(window, false);
-        assertNotNull(part);
-        IWorkbenchPage activePage = window.getActivePage();
-        IPerspectiveDescriptor oldDesc = activePage.getPerspective();
-        activePage.setPerspective(WorkbenchPlugin.getDefault()
-                .getPerspectiveRegistry().findPerspectiveWithId(
-                        "org.eclipse.ui.tests.api.SessionPerspective"));
-        assertFalse(workbench.getIntroManager().closeIntro(part));
-        assertNotNull(workbench.getIntroManager().getIntro());
-
-        activePage.setPerspective(oldDesc);
-        assertTrue(workbench.getIntroManager().closeIntro(part));
-        assertNull(workbench.getIntroManager().getIntro());
-
-		// Restore the min/max state to it's correct value
-		apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, oldMinMaxState);
-    }
-    
-    /**
-     * Open the intro, change perspective, close the intro 
-     * and ensure that the intro has not been closed in the 
-     * other perspective.
-     * See bug 174213
-     * See IntroTest2.java
-     */
-    public void testPerspectiveChangeWith32StickyBehavior() {
-    	IWorkbench workbench = window.getWorkbench();
-        IIntroPart part = workbench.getIntroManager().showIntro(window, false);
-        assertNotNull(part);
-        IWorkbenchPage activePage = window.getActivePage();
-        IPerspectiveDescriptor oldDesc = activePage.getPerspective();
-        activePage.setPerspective(WorkbenchPlugin.getDefault()
-                .getPerspectiveRegistry().findPerspectiveWithId(
-                        "org.eclipse.ui.tests.api.SessionPerspective"));
-       
-        IViewPart viewPart = window.getActivePage().findView(
-				IIntroConstants.INTRO_VIEW_ID);
-        assertNotNull(viewPart);
-        
-        window.getActivePage().hideView(viewPart);
-        viewPart = window.getActivePage().findView(
-				IIntroConstants.INTRO_VIEW_ID);
-        assertNull(viewPart);
-        
-        activePage.setPerspective(oldDesc);
-        viewPart = window.getActivePage().findView(
-				IIntroConstants.INTRO_VIEW_ID);
-        assertNotNull(viewPart);
-    }
-    
-    public void testPerspectiveReset() {
-        IWorkbench workbench = window.getWorkbench();
-        IIntroPart part = workbench.getIntroManager().showIntro(window, false);
-        assertNotNull(part);
-        window.getActivePage().resetPerspective();
-        part = workbench.getIntroManager().getIntro();
-        assertNotNull(part);
-        assertFalse(workbench.getIntroManager().isIntroStandby(part));
-
-        workbench.getIntroManager().setIntroStandby(part, true);
-        window.getActivePage().resetPerspective();
-        part = workbench.getIntroManager().getIntro();
-        assertNotNull(part);
-        assertTrue(workbench.getIntroManager().isIntroStandby(part));
-        assertTrue(workbench.getIntroManager().closeIntro(part));
-        assertNull(workbench.getIntroManager().getIntro());
-    }
-    
-    /**
-	 * Test to ensure that the part is properly nulled out when the intro is
-	 * closed via the view close mechanism.
-	 */
-	public void testViewClosure() {
-		IWorkbench workbench = window.getWorkbench();
-		IIntroPart part = workbench.getIntroManager().showIntro(window, false);
-		assertNotNull(part);
-		IViewPart viewPart = window.getActivePage().findView(
-				IIntroConstants.INTRO_VIEW_ID);
-		assertNotNull(viewPart);
-		window.getActivePage().hideView(viewPart);
-		assertNull(workbench.getIntroManager().getIntro());
-	}
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.util.UITestCase#doSetUp()
-     */
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        
-        // these tests rely on the 3.2 behavior for sticky views
-    	IPreferenceStore preferenceStore = PrefUtil.getAPIPreferenceStore();
-    	preferenceStore.putValue(IWorkbenchPreferenceConstants.ENABLE_32_STICKY_CLOSE_BEHAVIOR, "true");
-    	
-        oldDesc = Workbench.getInstance().getIntroDescriptor();
-        IntroDescriptor testDesc = (IntroDescriptor) WorkbenchPlugin
-                .getDefault().getIntroRegistry().getIntro(
-                        "org.eclipse.ui.testintro");
-        Workbench.getInstance().setIntroDescriptor(testDesc);
-        window = openTestWindow();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.util.UITestCase#doTearDown()
-     */
-    protected void doTearDown() throws Exception {
-        super.doTearDown();
-        Workbench.getInstance().setIntroDescriptor(oldDesc);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/IntroTest2.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/IntroTest2.java
deleted file mode 100644
index 5158f64..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/IntroTest2.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.intro;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.Workbench;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.intro.IIntroConstants;
-import org.eclipse.ui.internal.intro.IntroDescriptor;
-import org.eclipse.ui.internal.util.PrefUtil;
-import org.eclipse.ui.intro.IIntroPart;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.0
- */
-public class IntroTest2 extends UITestCase {
-
-    IWorkbenchWindow window = null;
-
-    private IntroDescriptor oldDesc;
-
-    /**
-     * @param testName
-     */
-    public IntroTest2(String testName) {
-        super(testName);
-    }
-    
-    /**
-     * Open the intro, change perspective, close the intro 
-     * and ensure that the intro has been closed in the 
-     * other perspective.
-     * See bug 174213
-     */
-    public void testPerspectiveChangeWith33StickyBehavior() {
-    	IWorkbench workbench = window.getWorkbench();
-        IIntroPart part = workbench.getIntroManager().showIntro(window, false);
-        assertNotNull(part);
-        IWorkbenchPage activePage = window.getActivePage();
-        IPerspectiveDescriptor oldDesc = activePage.getPerspective();
-        activePage.setPerspective(WorkbenchPlugin.getDefault()
-                .getPerspectiveRegistry().findPerspectiveWithId(
-                        "org.eclipse.ui.tests.api.SessionPerspective"));
-       
-        IViewPart viewPart = window.getActivePage().findView(
-				IIntroConstants.INTRO_VIEW_ID);
-        assertNotNull(viewPart);
-        
-        window.getActivePage().hideView(viewPart);
-        viewPart = window.getActivePage().findView(
-				IIntroConstants.INTRO_VIEW_ID);
-        assertNull(viewPart);
-        
-        activePage.setPerspective(oldDesc);
-        viewPart = window.getActivePage().findView(
-				IIntroConstants.INTRO_VIEW_ID);
-        assertNull(viewPart);
-        
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.util.UITestCase#doSetUp()
-     */
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        
-        // these tests rely on the 3.3 behavior for sticky views
-    	IPreferenceStore preferenceStore = PrefUtil.getAPIPreferenceStore();
-    	preferenceStore.putValue(IWorkbenchPreferenceConstants.ENABLE_32_STICKY_CLOSE_BEHAVIOR, "false");
-    	
-        oldDesc = Workbench.getInstance().getIntroDescriptor();
-        IntroDescriptor testDesc = (IntroDescriptor) WorkbenchPlugin
-                .getDefault().getIntroRegistry().getIntro(
-                        "org.eclipse.ui.testintro");
-        Workbench.getInstance().setIntroDescriptor(testDesc);
-        window = openTestWindow();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.util.UITestCase#doTearDown()
-     */
-    protected void doTearDown() throws Exception {
-        super.doTearDown();
-        Workbench.getInstance().setIntroDescriptor(oldDesc);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/IntroTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/IntroTestSuite.java
deleted file mode 100644
index fb402fb..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/IntroTestSuite.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.intro;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * @since 3.0
- */
-public class IntroTestSuite extends TestSuite {
-
-    public static Test suite() {
-        return new IntroTestSuite();
-    }
-
-    /**
-     * 
-     */
-    public IntroTestSuite() {
-        addTest(new TestSuite(IntroPartTest.class));
-        addTest(new TestSuite(NoIntroPartTest.class));
-        addTest(new TestSuite(IntroTest.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/MockIntroPart.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/MockIntroPart.java
deleted file mode 100644
index 537ee24..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/MockIntroPart.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.intro;
-
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.intro.IIntroPart;
-import org.eclipse.ui.intro.IIntroSite;
-import org.eclipse.ui.tests.api.MockPart;
-
-/**
- * @since 3.0
- */
-public class MockIntroPart extends MockPart implements IIntroPart {
-
-    private IIntroSite site;
-
-    /**
-     * 
-     */
-    public MockIntroPart() {
-        super();
-    }
-
-    public IIntroSite getIntroSite() {
-        return site;
-    }
-
-    public void init(IIntroSite site, IMemento memento)
-            throws PartInitException {
-        setSite(site);
-        callTrace.add("init");
-    }
-
-    /**
-     * @param site
-     */
-    private void setSite(IIntroSite site) {
-        this.site = site;
-    }
-
-    /**
-     * @see IViewPart#saveState(IMemento)
-     */
-    public void saveState(IMemento memento) {
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.intro.IIntroPart#standbyStateChanged(boolean)
-     */
-    public void standbyStateChanged(boolean standby) {
-        callTrace.add("standbyStateChanged");
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.intro.IIntroPart#getTitle()
-	 */
-	public String getTitle() {
-		return "Mock intro title";
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/NoIntroPartTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/NoIntroPartTest.java
deleted file mode 100644
index 3cc2b2c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/intro/NoIntroPartTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.intro;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.internal.Workbench;
-import org.eclipse.ui.internal.intro.IntroDescriptor;
-import org.eclipse.ui.intro.IIntroPart;
-import org.eclipse.ui.tests.api.IWorkbenchPartTest;
-import org.eclipse.ui.tests.api.MockPart;
-
-/**
- * @since 3.0
- */
-public class NoIntroPartTest extends IWorkbenchPartTest {
-
-    private IntroDescriptor oldDesc;
-
-    /**
-     * @param testName
-     */
-    public NoIntroPartTest(String testName) {
-        super(testName);
-        // TODO Auto-generated constructor stub
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.api.IWorkbenchPartTest#openPart(org.eclipse.ui.IWorkbenchPage)
-     */
-    protected MockPart openPart(IWorkbenchPage page) throws Throwable {
-        return (MockPart) page.getWorkbenchWindow().getWorkbench()
-                .getIntroManager().showIntro(page.getWorkbenchWindow(), false);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.api.IWorkbenchPartTest#closePart(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.tests.api.MockWorkbenchPart)
-     */
-    protected void closePart(IWorkbenchPage page, MockPart part)
-            throws Throwable {
-        assertTrue(page.getWorkbenchWindow().getWorkbench().getIntroManager()
-                .closeIntro((IIntroPart) part));
-    }
-
-    //only test open..shouldn't work.
-    public void testOpenAndClose() throws Throwable {
-        // Open a part.
-        MockPart part = openPart(fPage);
-        assertNull(part);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.util.UITestCase#doSetUp()
-     */
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        oldDesc = Workbench.getInstance().getIntroDescriptor();
-        Workbench.getInstance().setIntroDescriptor(null);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.util.UITestCase#doTearDown()
-     */
-    protected void doTearDown() throws Exception {
-        super.doTearDown();
-        Workbench.getInstance().setIntroDescriptor(oldDesc);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/BindingInteractionsTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/BindingInteractionsTest.java
deleted file mode 100644
index 8f4390b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/BindingInteractionsTest.java
+++ /dev/null
@@ -1,767 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.keys;
-
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Set;
-
-import org.eclipse.core.commands.CommandManager;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.contexts.Context;
-import org.eclipse.core.commands.contexts.ContextManager;
-import org.eclipse.jface.bindings.Binding;
-import org.eclipse.jface.bindings.BindingManager;
-import org.eclipse.jface.bindings.Scheme;
-import org.eclipse.jface.bindings.TriggerSequence;
-import org.eclipse.jface.util.Util;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test cases covering the various interaction between bindings. Bindings that
- * have been removed. Bindings that have been added. Inheritance of various
- * properties.
- * 
- * @since 3.1
- */
-public final class BindingInteractionsTest extends UITestCase {
-
-	/**
-	 * The binding manager to use in each test case. A new binding manager is
-	 * created for each test case, and it is disposed when the test is over.
-	 */
-	private BindingManager bindingManager = null;
-
-	/**
-	 * The context manager to use in each test case. A new context manager is
-	 * created for each test case, and it is disposed when the test is over.
-	 */
-	private ContextManager contextManager = null;
-
-	/**
-	 * Constructor for <code>BindingInteractionsTest</code>.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public BindingInteractionsTest(final String name) {
-		super(name);
-	}
-
-	/**
-	 * Creates a new context manager and a binding manager for use in the test
-	 * cases.
-	 */
-	protected void doSetUp() {
-		contextManager = new ContextManager();
-		bindingManager = new BindingManager(contextManager,
-				new CommandManager());
-	}
-
-	/**
-	 * Releases the context manager and binding manager for garbage collection.
-	 */
-	protected void doTearDown() {
-		contextManager = null;
-		bindingManager = null;
-	}
-
-	/**
-	 * <p>
-	 * Tests whether two identical bindings lead to a conflict.
-	 * </p>
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testConflict() throws NotDefinedException {
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		final Binding binding1 = new TestBinding("conflict1", "na", "na", null,
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding1);
-		final Binding binding2 = new TestBinding("conflict2", "na", "na", null,
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding2);
-
-		TriggerSequence[] activeBindings = bindingManager
-				.getActiveBindingsFor(binding1.getParameterizedCommand());
-		assertFalse(binding1.equals(binding2));
-		assertTrue("Neither binding should be active",
-				activeBindings.length == 0);
-		activeBindings = bindingManager.getActiveBindingsFor(binding2
-				.getParameterizedCommand());
-		assertTrue("Neither binding should be active",
-				activeBindings.length == 0);
-	}
-
-	/**
-	 * <p>
-	 * Tests whether a plug-in developer can override a binding in a child
-	 * context.
-	 * </p>
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testContextOverride() throws NotDefinedException {
-		final Context parentContext = contextManager.getContext("parent");
-		parentContext.define("parent", "parent context", null);
-
-		final Context childContext = contextManager.getContext("child");
-		childContext.define("child", "child context", "parent");
-
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-
-		bindingManager.setActiveScheme(scheme);
-
-		final Binding binding1 = new TestBinding("parent", "na", "parent",
-				null, null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding1);
-		final Binding binding2 = new TestBinding("child", "na", "child", null,
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding2);
-
-		// Only "parent"
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("parent");
-		contextManager.setActiveContextIds(activeContextIds);
-		assertEquals(
-				"When only the parent context is active, only the parent binding is active.",
-				binding1, bindingManager
-						.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-
-		// Only "child"
-		activeContextIds.clear();
-		activeContextIds.add("child");
-		contextManager.setActiveContextIds(activeContextIds);
-		assertEquals(
-				"When only the child context is active, only the child binding is active.",
-				binding2, bindingManager
-						.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-
-		// Both "parent" and "child"
-		activeContextIds.add("parent");
-		contextManager.setActiveContextIds(activeContextIds);
-		assertEquals(
-				"When both contexts are active, only the child binding is active.",
-				binding2, bindingManager
-						.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-	}
-
-	/**
-	 * <p>
-	 * Tests whether a user-defined deletion actually works.
-	 * </p>
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testDeletedBinding() throws NotDefinedException {
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		final Binding binding1 = new TestBinding(null, "na", "na", null, null,
-				Binding.USER, null);
-		bindingManager.addBinding(binding1);
-		final Binding binding2 = new TestBinding("system", "na", "na", null,
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding2);
-		assertEquals("The user should be able to remove bindings", null,
-				bindingManager.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-	}
-
-	/**
-	 * <p>
-	 * Tests whether a user-defined deletion in one context will allow a binding
-	 * in a parent context to match.  Bug 105655.
-	 * </p>
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testDeletedBindingAllowsParent() throws NotDefinedException {
-		final Context parentContext = contextManager.getContext("parent");
-		parentContext.define("name", "description", null);
-		final Context childContext = contextManager.getContext("child");
-		childContext.define("name", "description", "parent");
-
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("parent");
-		activeContextIds.add("child");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		final Binding childBinding = new TestBinding("childCommand", "na",
-				"child", null, null, Binding.SYSTEM, null);
-		bindingManager.addBinding(childBinding);
-		final Binding deletion = new TestBinding(null, "na", "child", null,
-				null, Binding.USER, null);
-		bindingManager.addBinding(deletion);
-		final Binding parentBinding = new TestBinding("parentCommand", "na",
-				"parent", null, null, Binding.SYSTEM, null);
-		bindingManager.addBinding(parentBinding);
-		assertEquals(
-				"The user should be able to remove bindings to allow a parent binding",
-				"parentCommand", bindingManager.getPerfectMatch(
-						TestBinding.TRIGGER_SEQUENCE).getParameterizedCommand()
-						.getId());
-	}
-
-	/**
-	 * <p>
-	 * Tests a common case for binding deletion. The binding is defined on all
-	 * platforms, then deleted on a specific platform, and defined again as
-	 * something else.
-	 * </p>
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testDeletedBindingPlatform() throws NotDefinedException {
-		final String na = "na";
-
-		final Context context = contextManager.getContext(na);
-		context.define("name", "description", null);
-
-		final Scheme scheme = bindingManager.getScheme(na);
-		scheme.define("name", "description", null);
-
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		final Binding allPlatforms = new TestBinding("allPlatforms", na, na,
-				null, null, Binding.SYSTEM, null);
-		bindingManager.addBinding(allPlatforms);
-		final Binding deletion = new TestBinding(null, na, na, null, Util.getWS(),
-				Binding.SYSTEM, null);
-		bindingManager.addBinding(deletion);
-		final Binding platformSpecific = new TestBinding("platformSpecific",
-				na, na, null, Util.getWS(), Binding.SYSTEM, null);
-		bindingManager.addBinding(platformSpecific);
-		assertEquals(
-				"We should be able to change a binding on a particular platform",
-				platformSpecific, bindingManager
-						.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-	}
-
-	/**
-	 * <p>
-	 * Tests whether a system deletion for a different locale or platform
-	 * actually works. It shouldn't. Deletions should only work if they specify
-	 * a matching locale or platform.
-	 * </p>
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testDeletedBindingUnnecessarily() throws NotDefinedException {
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		final Binding binding1 = new TestBinding(null, "na", "na",
-				"not the current locale", null, Binding.SYSTEM, null);
-		final Binding binding2 = new TestBinding("system", "na", "na", null,
-				null, Binding.SYSTEM, null);
-		final Binding binding3 = new TestBinding(null, "na", "na", null,
-				"not the current platform", Binding.SYSTEM, null);
-		final Binding[] bindings = new Binding[3];
-		bindings[0] = binding1;
-		bindings[1] = binding2;
-		bindings[2] = binding3;
-		bindingManager.setBindings(bindings);
-		assertEquals(
-				"A binding should not cause a deletion if its locale or platform doesn't match",
-				binding2, bindingManager
-						.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-	}
-
-	/**
-	 * <p>
-	 * Tests whether a user can add a binding to the same conditions once
-	 * they've deleted the system binding.
-	 * </p>
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testDeletedBindingWithAddition() throws NotDefinedException {
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		final Binding binding1 = new TestBinding(null, "na", "na", null, null,
-				Binding.USER, null);
-		bindingManager.addBinding(binding1);
-		final Binding binding2 = new TestBinding("system", "na", "na", null,
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding2);
-		final Binding binding3 = new TestBinding("user", "na", "na", null,
-				null, Binding.USER, null);
-		bindingManager.addBinding(binding3);
-		assertEquals("The user redefine a particular binding", binding3,
-				bindingManager.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-	}
-
-	/**
-	 * This tests the case where a plug-in developer unbinds a key, and then a
-	 * user tries to bind to that key. The user should be allowed to bind.
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testDeletedBindingWithUserOverride() throws NotDefinedException {
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		final Binding generalBinding = new TestBinding("general", scheme
-				.getId(), context.getId(), null, null, Binding.SYSTEM, null);
-		bindingManager.addBinding(generalBinding);
-		final Binding cancelOnPlatform = new TestBinding(null, scheme.getId(),
-				context.getId(), null, bindingManager.getPlatform(),
-				Binding.SYSTEM, null);
-		bindingManager.addBinding(cancelOnPlatform);
-		final Binding userOverride = new TestBinding("user", scheme.getId(),
-				context.getId(), null, bindingManager.getPlatform(),
-				Binding.USER, null);
-		bindingManager.addBinding(userOverride);
-		assertEquals("The user redefine a binding deleted in the system",
-				userOverride, bindingManager
-						.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-
-	}
-	
-	/**
-	 * Tests that if more than one deletion is defined for the same binding,
-	 * that the deletion will still work.  Bug 106574 points out a case where it
-	 * is possible for a deletion to clobber another deletion.
-	 * 
-	 * @since 3.2
-	 */
-	public void testDoubleDeletedBinding() {
-		final String parent = "parent";
-		final String child = "child";
-
-		// Set-up the contexts
-		final Context parentContext = contextManager.getContext(parent);
-		parentContext.define(parent, parent, null);
-		final Context childContext = contextManager.getContext(child);
-		childContext.define(child, child, parent);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add(parent);
-		activeContextIds.add(child);
-		contextManager.setActiveContextIds(activeContextIds);
-
-		// Set-up the schemes.
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define(parent, parent, null);
-
-		/*
-		 * Set-up a binding, with two deletions. The first deletion matches the
-		 * context, but the second does not.
-		 */
-		final Binding binding = new TestBinding("command", "na", parent, null,
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding);
-		final Binding correctDeletion = new TestBinding(null, "na", parent,
-				null, null, Binding.USER, null);
-		bindingManager.addBinding(correctDeletion);
-		final Binding wrongDeletion = new TestBinding(null, "na", child, null,
-				null, Binding.USER, null);
-		bindingManager.addBinding(wrongDeletion);
-
-		// Test that the deletion worked.
-		assertEquals("The parent should not be active", null, bindingManager
-				.getPerfectMatch(binding.getTriggerSequence()));
-	}
-
-	/**
-	 * This tests a complicated scenario that arises with the Emacs key binding
-	 * set in the Eclipse workbench. The first binding belongs to a parent
-	 * context, but a child scheme. The trigger sequences are not the same.
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testDoubleParent() throws NotDefinedException {
-		final String parent = "parent";
-		final String child = "child";
-
-		// Set-up the contexts
-		final Context parentContext = contextManager.getContext(parent);
-		parentContext.define(parent, parent, null);
-		final Context childContext = contextManager.getContext(child);
-		childContext.define(child, child, parent);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add(parent);
-		activeContextIds.add(child);
-		contextManager.setActiveContextIds(activeContextIds);
-
-		// Set-up the schemes.
-		final Scheme parentScheme = bindingManager.getScheme(parent);
-		parentScheme.define(parent, parent, null);
-		final Scheme childScheme = bindingManager.getScheme(child);
-		childScheme.define(child, child, parent);
-		bindingManager.setActiveScheme(childScheme);
-
-		// Add two bindings.
-		final Binding parentBinding = new TestBinding(parent, parent, parent,
-				null, null, Binding.SYSTEM, null);
-		final Binding childBinding = new TestBinding(child, child, child, null,
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(parentBinding);
-		bindingManager.addBinding(childBinding);
-
-		// Test to see that only the child is active.
-		assertTrue("The parent should not be active",
-				bindingManager.getActiveBindingsFor(parentBinding
-						.getParameterizedCommand()).length == 0);
-		assertTrue("The child should be active",
-				bindingManager.getActiveBindingsFor(childBinding
-						.getParameterizedCommand()).length != 0);
-	}
-
-	/**
-	 * <p>
-	 * Tests whether a plug-in developer can override a binding for a particular
-	 * locale.
-	 * </p>
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testLocaleOverride() throws NotDefinedException {
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		final Binding binding1 = new TestBinding("base", "na", "na", null,
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding1);
-		final Binding binding2 = new TestBinding(null, "na", "na", Locale
-				.getDefault().toString(), null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding2);
-		final Binding binding3 = new TestBinding("locale-specific", "na", "na",
-				Locale.getDefault().toString(), null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding3);
-		assertEquals(
-				"A plug-in developer should be able to change a binding for a locale",
-				binding3, bindingManager
-						.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-	}
-
-	/**
-	 * <p>
-	 * Tests whether a plug-in developer can override a binding for a particular
-	 * platform.
-	 * </p>
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testPlatformOverride() throws NotDefinedException {
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		final Binding binding1 = new TestBinding("base", "na", "na", null,
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding1);
-		final Binding binding2 = new TestBinding(null, "na", "na", null, Util.getWS(),
-				Binding.SYSTEM, null);
-		bindingManager.addBinding(binding2);
-		final Binding binding3 = new TestBinding("platform-specific", "na",
-				"na", null, Util.getWS(), Binding.SYSTEM, null);
-		bindingManager.addBinding(binding3);
-		assertEquals(
-				"A plug-in developer should be able to change a binding for a platform",
-				binding3, bindingManager
-						.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-	}
-
-	/**
-	 * <p>
-	 * Tests whether a binding in a child scheme will override a binding in a
-	 * parent scheme. The test is set-up as follows:
-	 * </p>
-	 * <ul>
-	 * <li>Binding1(commandId="child",schemeId="child",contextId="na",locale=null,platform=null,type=SYSTEM)</li>
-	 * <li>Binding2(commandId="parent",schemeId="parent",contextId="na",locale=null,platform=null,type=SYSTEM)</li>
-	 * </ul>
-	 * <p>
-	 * Binding1 should win.
-	 * </p>
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testSchemeOverride() throws NotDefinedException {
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-
-		final Scheme parentScheme = bindingManager.getScheme("parent");
-		parentScheme.define("parent", "parent scheme", null);
-
-		final Scheme childScheme = bindingManager.getScheme("child");
-		childScheme.define("child", "child scheme", "parent");
-
-		bindingManager.setActiveScheme(childScheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		final Binding binding1 = new TestBinding("child", "child", "na", null,
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding1);
-		final Binding binding2 = new TestBinding("parent", "parent", "na",
-				null, null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding2);
-		assertEquals("The binding from the child scheme should be active",
-				binding1, bindingManager
-						.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-	}
-
-	/**
-	 * This tests a Emacs-style scenario. In this scenario a child scheme
-	 * defines a binding in a parent context. The parent scheme bindings the
-	 * same trigger sequence in a child context. The child scheme definition
-	 * should win.
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testSchemeOverrideDifferentContexts()
-			throws NotDefinedException {
-		final String parent = "parent";
-		final String child = "child";
-
-		final Context parentContext = contextManager.getContext(parent);
-		parentContext.define("parent", "description", null);
-		final Context childContext = contextManager.getContext(child);
-		childContext.define("child", "description", parent);
-
-		final Scheme parentScheme = bindingManager.getScheme(parent);
-		parentScheme.define("parent", "parent scheme", null);
-		final Scheme childScheme = bindingManager.getScheme(child);
-		childScheme.define("child", "child scheme", parent);
-
-		bindingManager.setActiveScheme(childScheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add(parentContext.getId());
-		activeContextIds.add(childContext.getId());
-		contextManager.setActiveContextIds(activeContextIds);
-
-		final Binding binding1 = new TestBinding("parent",
-				parentScheme.getId(), childContext.getId(), null, null,
-				Binding.SYSTEM, null);
-		bindingManager.addBinding(binding1);
-		final Binding binding2 = new TestBinding("child", childScheme.getId(),
-				parentContext.getId(), null, null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding2);
-		assertEquals("The binding from the child scheme should be active",
-				binding2, bindingManager
-						.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-	}
-
-	/**
-	 * <p>
-	 * Tests whether a binding in a child scheme will override a binding in a
-	 * parent scheme -- regardless of their type. The test is set-up as follows:
-	 * </p>
-	 * <ul>
-	 * <li>Binding1(commandId="child",schemeId="child",contextId="na",locale=null,platform=null,type=SYSTEM)</li>
-	 * <li>Binding2(commandId="parent",schemeId="parent",contextId="na",locale=null,platform=null,type=USER)</li>
-	 * </ul>
-	 * <p>
-	 * Binding1 should win.
-	 * </p>
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testSchemeOverrideDifferentTypes() throws NotDefinedException {
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-
-		final Scheme parentScheme = bindingManager.getScheme("parent");
-		parentScheme.define("parent", "parent scheme", null);
-
-		final Scheme childScheme = bindingManager.getScheme("child");
-		childScheme.define("child", "child scheme", "parent");
-
-		bindingManager.setActiveScheme(childScheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		final Binding binding1 = new TestBinding("child", "child", "na", null,
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding1);
-		final Binding binding2 = new TestBinding("parent", "parent", "na",
-				null, null, Binding.USER, null);
-		bindingManager.addBinding(binding2);
-		assertEquals("The binding from the child scheme should be active",
-				binding1, bindingManager
-						.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-	}
-
-	/**
-	 * <p>
-	 * Tests whether two bindings defined for sibling active contexts leads to a
-	 * conflict.
-	 * </p>
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testSiblingContextConflict() throws NotDefinedException {
-		final Context context1 = contextManager.getContext("sibling1");
-		context1.define("sibling1", "first sibling context", null);
-
-		final Context context2 = contextManager.getContext("sibling2");
-		context2.define("sibling2", "second sibling context", null);
-
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-
-		bindingManager.setActiveScheme(scheme);
-
-		final Binding binding1 = new TestBinding("sibling1", "na", "sibling1",
-				null, null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding1);
-		final Binding binding2 = new TestBinding("sibling2", "na", "sibling2",
-				null, null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding2);
-
-		// One sibling active
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("sibling1");
-		contextManager.setActiveContextIds(activeContextIds);
-		assertEquals(
-				"When only the first sibling is active, only the first binding is active",
-				binding1, bindingManager
-						.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-
-		// Other sibling active
-		activeContextIds.clear();
-		activeContextIds.add("sibling2");
-		contextManager.setActiveContextIds(activeContextIds);
-		assertEquals(
-				"When only the second sibling is active, only the second binding is active",
-				binding2, bindingManager
-						.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-
-		// Both siblings are active
-		activeContextIds.add("sibling1");
-		contextManager.setActiveContextIds(activeContextIds);
-		assertEquals("When both contexts are active, a conflict should occur",
-				null, bindingManager
-						.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-	}
-
-	/**
-	 * <p>
-	 * Tests whether a user-defined binding will override the exact same binding
-	 * defined in the system.
-	 * </p>
-	 * <ul>
-	 * <li>Binding1(commandId="user",schemeId="na",contextId="na",locale=null,platform=null,type=USER)</li>
-	 * <li>Binding2(commandId="system",schemeId="na",contextId="na",locale=null,platform=null,type=SYSTEM)</li>
-	 * </ul>
-	 * <p>
-	 * Binding1 should win.
-	 * </p>
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public void testUserOverride() throws NotDefinedException {
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		final Binding binding1 = new TestBinding("user", "na", "na", null,
-				null, Binding.USER, null);
-		bindingManager.addBinding(binding1);
-		final Binding binding2 = new TestBinding("system", "na", "na", null,
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding2);
-		assertEquals("The user-defined binding should be active", binding1,
-				bindingManager.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/BindingManagerTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/BindingManagerTest.java
deleted file mode 100644
index f728212..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/BindingManagerTest.java
+++ /dev/null
@@ -1,1002 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.keys;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.commands.Category;
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.CommandManager;
-import org.eclipse.core.commands.IParameter;
-import org.eclipse.core.commands.IParameterValues;
-import org.eclipse.core.commands.ParameterValuesException;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.contexts.Context;
-import org.eclipse.core.commands.contexts.ContextManager;
-import org.eclipse.jface.bindings.Binding;
-import org.eclipse.jface.bindings.BindingManager;
-import org.eclipse.jface.bindings.BindingManagerEvent;
-import org.eclipse.jface.bindings.IBindingManagerListener;
-import org.eclipse.jface.bindings.Scheme;
-import org.eclipse.jface.bindings.TriggerSequence;
-import org.eclipse.jface.bindings.keys.KeyBinding;
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.ParseException;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * <p>
- * This test case covers the general functionality of the binding manager's API
- * methods. This is not intended to test the interactions between bindings
- * themselves (e.g., solving a binding set). For tests dealing with
- * interactions, please look at <code>BindingInteractionsTest</code>.
- * </p>
- * <p>
- * The listener code is tested throughout the various tests. There is no
- * individual test method for the listener code.
- * </p>
- * 
- * @see org.eclipse.ui.tests.keys.BindingInteractionsTest
- * @since 3.1
- */
-public final class BindingManagerTest extends UITestCase {
-
-	/**
-	 * A test listener that should be attached to the binding manager. The
-	 * listener records the last fired event.
-	 * 
-	 * @since 3.1
-	 */
-	private static final class TestListener implements IBindingManagerListener {
-
-		/**
-		 * The last event that this listener saw. <code>null</code> if none.
-		 */
-		private BindingManagerEvent event = null;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.bindings.IBindingManagerListener#bindingManagerChanged(org.eclipse.jface.bindings.BindingManagerEvent)
-		 */
-		public void bindingManagerChanged(BindingManagerEvent e) {
-			this.event = e;
-		}
-
-		/**
-		 * Returns the last event.
-		 * 
-		 * @return The last event; may be <code>null</code> if none.
-		 */
-		public final BindingManagerEvent getLastEvent() {
-			return event;
-		}
-	}
-
-	/**
-	 * The binding manager to use in each test case. A new binding manager is
-	 * created for each test case, and it is disposed when the test is over.
-	 */
-	private BindingManager bindingManager = null;
-
-	/**
-	 * The command manager for the currently running test. <code>null</code>
-	 * if no test is running.
-	 */
-	private CommandManager commandManager = null;
-
-	/**
-	 * The context manager to use in each test case. A new context manager is
-	 * created for each test case, and it is disposed when the test is over.
-	 */
-	private ContextManager contextManager = null;
-
-	/**
-	 * The listener attached to the binding manager. This listener is attached
-	 * at the beginning of each test case, and it is disposed when the test is
-	 * over.
-	 */
-	private TestListener listener = null;
-
-	/**
-	 * Constructor for <code>BindingInteractionsTest</code>.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public BindingManagerTest(final String name) {
-		super(name);
-	}
-
-	/**
-	 * Creates a new context manager and a binding manager for use in the test
-	 * cases.
-	 */
-	protected final void doSetUp() {
-		commandManager = new CommandManager();
-		contextManager = new ContextManager();
-		bindingManager = new BindingManager(contextManager, commandManager);
-		listener = new TestListener();
-		bindingManager.addBindingManagerListener(listener);
-	}
-
-	/**
-	 * Releases the context manager and binding manager for garbage collection.
-	 */
-	protected final void doTearDown() {
-		bindingManager.removeBindingManagerListener(listener);
-		listener = null;
-		bindingManager = null;
-		contextManager = null;
-		commandManager = null;
-	}
-
-	/**
-	 * Tests that the constructor disallows a null context manager.
-	 */
-	public final void testConstructor() {
-		try {
-			new BindingManager(null, null);
-			fail("A binding manager cannot be constructed with a null context manager");
-		} catch (final NullPointerException e) {
-			// Success
-		}
-	}
-
-	/**
-	 * Tests that it is not possible to add a null binding. Tests that adding a
-	 * binding forces a recomputation.
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public final void testAddBinding() throws NotDefinedException {
-		// Set up a state in which a binding may become active.
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		// Try to add a null binding.
-		try {
-			bindingManager.addBinding(null);
-			fail("It should not be possible to add a null binding");
-		} catch (final NullPointerException e) {
-			// Success.
-		}
-
-		// Try to add a binding that should become active.
-		final Binding binding = new TestBinding("conflict1", "na", "na", null,
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding);
-		assertSame("The binding should be active", binding, bindingManager
-				.getPerfectMatch(TestBinding.TRIGGER_SEQUENCE));
-	}
-
-	/**
-	 * Tests that <code>getActiveBindingsDisregardingContext()</code> never
-	 * returns <code>null</code>. The rest of the functionality is tested in
-	 * <code>BindingInteractionsTest</code>.
-	 * 
-	 * @see BindingInteractionsTest
-	 */
-	public final void testGetActiveBindingsDisregardingContext() {
-		final Map activeBindings = bindingManager
-				.getActiveBindingsDisregardingContext();
-		assertNotNull("The active bindings should never be null",
-				activeBindings);
-		assertTrue("The active bindings should start empty", activeBindings
-				.isEmpty());
-	}
-
-	/**
-	 * Tests that <code>getActiveBindingsDisregardingContextFlat()</code>
-	 * never returns <code>null</code>. The rest of the functionality is
-	 * tested in <code>BindingInteractionsTest</code>.
-	 * 
-	 * @see BindingInteractionsTest
-	 */
-	public final void testGetActiveBindingsDisregardingContextFlat() {
-		final Collection activeBindings = bindingManager
-				.getActiveBindingsDisregardingContextFlat();
-		assertNotNull("The active bindings should never be null",
-				activeBindings);
-		assertTrue("The active bindings should start empty", activeBindings
-				.isEmpty());
-	}
-
-	/**
-	 * Tests whether the method works with a null argument. Tests that it works
-	 * in a simple case.
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public final void testGetActiveBindingsFor() throws NotDefinedException {
-		// Test with a null argument.
-		final TriggerSequence[] activeBindingsForNull = bindingManager
-				.getActiveBindingsFor((ParameterizedCommand) null);
-		assertNotNull("The active bindings for a command should never be null",
-				activeBindingsForNull);
-		assertTrue(
-				"The active binding for a null command should always be empty",
-				activeBindingsForNull.length == 0);
-
-		// Test a simple case.
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		final String commandId = "commandId";
-		final Binding binding = new TestBinding(commandId, "na", "na", null,
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding);
-
-		final TriggerSequence[] bindings = bindingManager
-				.getActiveBindingsFor(binding.getParameterizedCommand());
-		assertEquals("There should be one binding", 1, bindings.length);
-		assertSame("The binding should match", TestBinding.TRIGGER_SEQUENCE,
-				bindings[0]);
-	}
-
-	/**
-	 * Tests that the active scheme starts off <code>null</code>. The rest of
-	 * the active scheme testing happens in <code>testSetActiveScheme()</code>.
-	 * 
-	 * @see BindingManagerTest#testSetActiveScheme()
-	 */
-	public final void testGetActiveScheme() {
-		assertNull("The active scheme should start null", bindingManager
-				.getActiveScheme());
-	}
-
-	/**
-	 * Tests that <code>getBindings</code> first returns <code>null</code>.
-	 * It then verifies that an added binding is return from this method.
-	 */
-	public final void testGetBindings() {
-		// Check the starting condition.
-		assertNull("The bindings should start off null", bindingManager
-				.getBindings());
-
-		// Check that an added binding is included.
-		final Binding binding = new TestBinding(null, "schemeId", "contextId",
-				null, null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding);
-		final Binding[] bindings = bindingManager.getBindings();
-		assertEquals("There should be one binding", 1, bindings.length);
-		assertSame("The binding should be the same", binding, bindings[0]);
-
-		/*
-		 * Check that modifying this set does not modify the internal data
-		 * structures.
-		 */
-		bindings[0] = null;
-		assertNotNull("There should be no change",
-				bindingManager.getBindings()[0]);
-	}
-
-	/**
-	 * Tests that the list of defined schemes stays up-to-date
-	 */
-	public final void testGetDefinedSchemeIds() {
-		// Starting condition.
-		assertTrue("The set of defined schemes should start empty",
-				bindingManager.getDefinedSchemes().length == 0);
-
-		// Retrieving a scheme shouldn't change anything.
-		final Scheme scheme = bindingManager.getScheme("schemeId");
-		assertTrue(
-				"The set of defined schemes should still be empty after a get",
-				bindingManager.getDefinedSchemes().length == 0);
-
-		// Defining the scheme should change things.
-		scheme.define("name", "description", null);
-		Scheme[] definedSchemes = bindingManager.getDefinedSchemes();
-		assertEquals("There should be one defined scheme id", 1,
-				definedSchemes.length);
-		assertSame("The defined scheme id should match", scheme,
-				definedSchemes[0]);
-
-		definedSchemes[0] = null;
-		definedSchemes = bindingManager.getDefinedSchemes();
-		assertSame("The API should not expose internal collections", scheme,
-				definedSchemes[0]);
-
-		// Undefining the scheme should also change things.
-		scheme.undefine();
-		assertTrue(
-				"The set of defined schemes should be empty after an undefine",
-				bindingManager.getDefinedSchemes().length == 0);
-	}
-
-	/**
-	 * Tests that the active locale is never <code>null</code>.
-	 */
-	public final void testGetLocale() {
-		assertNotNull("The locale should never be null", bindingManager
-				.getLocale());
-	}
-
-	/**
-	 * Tests that this method returns the expected list of sequences for a
-	 * couple of scenarios. In the first scenario, there is one perfect match
-	 * bindings and a partial match binding. In the second scenario, there are
-	 * two partial match bindings. In the third scenario, we are checking that
-	 * all bindings match an empty trigger sequence.
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 * @throws ParseException
-	 *             If the hard-coded strings aren't constructed properly.
-	 */
-	public final void testGetPartialMatches() throws NotDefinedException,
-			ParseException {
-		// GENERAL SET-UP
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		// SCENARIO 1
-		final KeySequence perfectMatch = KeySequence.getInstance("CTRL+F");
-		final Command perfectCommand = commandManager.getCommand("perfect");
-		final ParameterizedCommand perfectParameterizedCommand = new ParameterizedCommand(
-				perfectCommand, null);
-		final Binding perfectMatchBinding = new KeyBinding(perfectMatch,
-				perfectParameterizedCommand, "na", "na", null, null, null,
-				Binding.SYSTEM);
-		final KeySequence partialMatch1 = KeySequence
-				.getInstance("CTRL+F CTRL+F");
-		final Command partialCommand1 = commandManager.getCommand("partial1");
-		final ParameterizedCommand partialParameterizedCommand1 = new ParameterizedCommand(
-				partialCommand1, null);
-		final Binding partialMatchBinding1 = new KeyBinding(partialMatch1,
-				partialParameterizedCommand1, "na", "na", null, null, null,
-				Binding.SYSTEM);
-		final Binding[] bindings = new Binding[2];
-		bindings[0] = perfectMatchBinding;
-		bindings[1] = partialMatchBinding1;
-		bindingManager.setBindings(bindings);
-		Map partialMatches = bindingManager.getPartialMatches(perfectMatch);
-		assertTrue("A partial match should override a perfect match",
-				!partialMatches.isEmpty());
-		assertTrue("A partial match should override a perfect match",
-				partialMatches.containsKey(partialMatch1));
-
-		// SCENARIO 2
-		final KeySequence partialMatch2 = KeySequence
-				.getInstance("CTRL+F CTRL+F CTRL+F");
-		final Command partialCommand2 = commandManager.getCommand("partial2");
-		final ParameterizedCommand partialParameterizedCommand2 = new ParameterizedCommand(
-				partialCommand2, null);
-		final Binding partialMatchBinding2 = new KeyBinding(partialMatch2,
-				partialParameterizedCommand2, "na", "na", null, null, null,
-				Binding.SYSTEM);
-		bindings[0] = partialMatchBinding1;
-		bindings[1] = partialMatchBinding2;
-		bindingManager.setBindings(bindings);
-		partialMatches = bindingManager.getPartialMatches(perfectMatch);
-		assertEquals("There should be two partial matches", 2, partialMatches
-				.size());
-		assertSame("The partial match should be the one defined",
-				partialMatchBinding1, partialMatches.get(partialMatch1));
-		assertSame("The partial match should be the one defined",
-				partialMatchBinding2, partialMatches.get(partialMatch2));
-
-		// SCENARIO 3
-		bindingManager.addBinding(perfectMatchBinding);
-		partialMatches = bindingManager.getPartialMatches(KeySequence
-				.getInstance());
-		assertEquals("There should be three partial matches", 3, partialMatches
-				.size());
-		assertSame("The partial match should be the one defined",
-				perfectMatchBinding, partialMatches.get(perfectMatch));
-		assertSame("The partial match should be the one defined",
-				partialMatchBinding1, partialMatches.get(partialMatch1));
-		assertSame("The partial match should be the one defined",
-				partialMatchBinding2, partialMatches.get(partialMatch2));
-	}
-
-	/**
-	 * Tests that this method returns the expected command identifier. In the
-	 * first scenario, there is one perfect match bindings and a partial match
-	 * binding. In the second scenario, there are two partial match bindings. In
-	 * the third scenario, we are checking that nothing matches an empty
-	 * sequence.
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 * @throws ParseException
-	 *             If the hard-coded strings aren't constructed properly.
-	 */
-	public final void testGetPerfectMatch() throws NotDefinedException,
-			ParseException {
-		// GENERAL SET-UP
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		// SCENARIO 1
-		final KeySequence perfectMatch = KeySequence.getInstance("CTRL+F");
-		final Command perfectCommand = commandManager.getCommand("perfect");
-		final ParameterizedCommand perfectParameterizedCommand = new ParameterizedCommand(
-				perfectCommand, null);
-		final Binding perfectMatchBinding = new KeyBinding(perfectMatch,
-				perfectParameterizedCommand, "na", "na", null, null, null,
-				Binding.SYSTEM);
-		final KeySequence partialMatch1 = KeySequence
-				.getInstance("CTRL+F CTRL+F");
-		final Command partialCommand1 = commandManager.getCommand("partial1");
-		final ParameterizedCommand partialParameterizedCommand1 = new ParameterizedCommand(
-				partialCommand1, null);
-		final Binding partialMatchBinding1 = new KeyBinding(partialMatch1,
-				partialParameterizedCommand1, "na", "na", null, null, null,
-				Binding.SYSTEM);
-		final Binding[] bindings = new Binding[2];
-		bindings[0] = perfectMatchBinding;
-		bindings[1] = partialMatchBinding1;
-		bindingManager.setBindings(bindings);
-		Binding actualBinding = bindingManager.getPerfectMatch(perfectMatch);
-		assertSame("This should be a perfect match", perfectMatchBinding,
-				actualBinding);
-
-		// SCENARIO 2
-		final KeySequence partialMatch2 = KeySequence
-				.getInstance("CTRL+F CTRL+F CTRL+F");
-		final Command partialCommand2 = commandManager.getCommand("partial2");
-		final ParameterizedCommand partialParameterizedCommand2 = new ParameterizedCommand(
-				partialCommand2, null);
-		final Binding partialMatchBinding2 = new KeyBinding(partialMatch2,
-				partialParameterizedCommand2, "na", "na", null, null, null,
-				Binding.SYSTEM);
-		bindings[0] = partialMatchBinding1;
-		bindings[1] = partialMatchBinding2;
-		bindingManager.setBindings(bindings);
-		actualBinding = bindingManager.getPerfectMatch(perfectMatch);
-		assertNull("There should be no perfect matches", actualBinding);
-
-		// SCENARIO 3
-		bindingManager.addBinding(perfectMatchBinding);
-		actualBinding = bindingManager.getPerfectMatch(KeySequence
-				.getInstance());
-		assertNull("This should be no perfect matches for an empty sequence",
-				actualBinding);
-	}
-
-	/**
-	 * Tests that the platform is never <code>null</code>.
-	 */
-	public final void testGetPlatform() {
-		assertNotNull("The platform can never be null", bindingManager
-				.getPlatform());
-	}
-
-	/**
-	 * Tests that when a scheme is first retrieved, it is undefined. Tests that
-	 * a second access to a scheme returns the same scheme.
-	 */
-	public final void testGetScheme() {
-		final String schemeId = "schemeId";
-		final Scheme firstScheme = bindingManager.getScheme(schemeId);
-		assertTrue("A scheme should start undefined", !firstScheme.isDefined());
-		final Scheme secondScheme = bindingManager.getScheme(schemeId);
-		assertSame("The two scheme should be the same", firstScheme,
-				secondScheme);
-	}
-
-	/**
-	 * Tests that this method returns <code>true</code> when expected. In the
-	 * first scenario, there is one perfect match bindings and a partial match
-	 * binding. In the second scenario, there are two partial match bindings. In
-	 * the third scenario, we are checking that all bindings match an empty
-	 * trigger sequence.
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 * @throws ParseException
-	 *             If the hard-coded strings aren't constructed properly.
-	 */
-	public final void testIsPartialMatch() throws NotDefinedException,
-			ParseException {
-		// GENERAL SET-UP
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		// SCENARIO 1
-		final KeySequence perfectMatch = KeySequence.getInstance("CTRL+F");
-		final Command perfectCommand = commandManager.getCommand("perfect");
-		final ParameterizedCommand perfectParameterizedCommand = new ParameterizedCommand(
-				perfectCommand, null);
-		final Binding perfectMatchBinding = new KeyBinding(perfectMatch,
-				perfectParameterizedCommand, "na", "na", null, null, null,
-				Binding.SYSTEM);
-		final KeySequence partialMatch1 = KeySequence
-				.getInstance("CTRL+F CTRL+F");
-		final Command partialCommand1 = commandManager.getCommand("partial1");
-		final ParameterizedCommand partialParameterizedCommand1 = new ParameterizedCommand(
-				partialCommand1, null);
-		final Binding partialMatchBinding1 = new KeyBinding(partialMatch1,
-				partialParameterizedCommand1, "na", "na", null, null, null,
-				Binding.SYSTEM);
-		final Binding[] bindings = new Binding[2];
-		bindings[0] = perfectMatchBinding;
-		bindings[1] = partialMatchBinding1;
-		bindingManager.setBindings(bindings);
-		assertTrue("A perfect match should be overridden by a partial",
-				bindingManager.isPartialMatch(perfectMatch));
-
-		// SCENARIO 2
-		final KeySequence partialMatch2 = KeySequence
-				.getInstance("CTRL+F CTRL+F CTRL+F");
-		final Command partialCommand2 = commandManager.getCommand("partial2");
-		final ParameterizedCommand partialParameterizedCommand2 = new ParameterizedCommand(
-				partialCommand2, null);
-		final Binding partialMatchBinding2 = new KeyBinding(partialMatch2,
-				partialParameterizedCommand2, "na", "na", null, null, null,
-				Binding.SYSTEM);
-		bindings[0] = partialMatchBinding1;
-		bindings[1] = partialMatchBinding2;
-		bindingManager.setBindings(bindings);
-		assertTrue("Two partial matches should count as a partial",
-				bindingManager.isPartialMatch(perfectMatch));
-
-		// SCENARIO 3
-		bindingManager.addBinding(perfectMatchBinding);
-		bindingManager.setBindings(bindings);
-		assertTrue("An empty sequence matches everything partially",
-				bindingManager.isPartialMatch(KeySequence.getInstance()));
-	}
-
-	/**
-	 * Tests that this method returns <code>true</code> when expected. In the
-	 * first scenario, there is one perfect match bindings and a partial match
-	 * binding. In the second scenario, there are two partial match bindings. In
-	 * the third scenario, we are checking that nothing matches an empty
-	 * sequence.
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 * @throws ParseException
-	 *             If the hard-coded strings aren't constructed properly.
-	 */
-	public final void testIsPerfectMatch() throws NotDefinedException,
-			ParseException {
-		// GENERAL SET-UP
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		// SCENARIO 1
-		final KeySequence perfectMatch = KeySequence.getInstance("CTRL+F");
-		final Command perfectCommand = commandManager.getCommand("perfect");
-		final ParameterizedCommand perfectParameterizedCommand = new ParameterizedCommand(
-				perfectCommand, null);
-		final Binding perfectMatchBinding = new KeyBinding(perfectMatch,
-				perfectParameterizedCommand, "na", "na", null, null, null,
-				Binding.SYSTEM);
-		final KeySequence partialMatch1 = KeySequence
-				.getInstance("CTRL+F CTRL+F");
-		final Command partialCommand1 = commandManager.getCommand("partial1");
-		final ParameterizedCommand partialParameterizedCommand1 = new ParameterizedCommand(
-				partialCommand1, null);
-		final Binding partialMatchBinding1 = new KeyBinding(partialMatch1,
-				partialParameterizedCommand1, "na", "na", null, null, null,
-				Binding.SYSTEM);
-		final Binding[] bindings = new Binding[2];
-		bindings[0] = perfectMatchBinding;
-		bindings[1] = partialMatchBinding1;
-		bindingManager.setBindings(bindings);
-		assertTrue("This should be a perfect match", bindingManager
-				.isPerfectMatch(perfectMatch));
-
-		// SCENARIO 2
-		final KeySequence partialMatch2 = KeySequence
-				.getInstance("CTRL+F CTRL+F CTRL+F");
-		final Command partialCommand2 = commandManager.getCommand("perfect");
-		final ParameterizedCommand partialParameterizedCommand2 = new ParameterizedCommand(
-				partialCommand2, null);
-		final Binding partialMatchBinding2 = new KeyBinding(partialMatch2,
-				partialParameterizedCommand2, "na", "na", null, null, null,
-				Binding.SYSTEM);
-		bindings[0] = partialMatchBinding1;
-		bindings[1] = partialMatchBinding2;
-		bindingManager.setBindings(bindings);
-		assertTrue("This should be no perfect matches", !bindingManager
-				.isPerfectMatch(perfectMatch));
-
-		// SCENARIO 3
-		bindingManager.addBinding(perfectMatchBinding);
-		assertTrue("This should be no perfect matches", !bindingManager
-				.isPerfectMatch(KeySequence.getInstance()));
-	}
-
-	/**
-	 * Tests that you can remove binding, and that it will change the active
-	 * bindings as well.
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public final void testRemoveBindings() throws NotDefinedException {
-		// GENERAL SET-UP
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		// ADD SOME BINDINGS
-		final Binding binding1 = new TestBinding("command1", "na", "na", null,
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding1);
-		final Binding binding2 = new TestBinding("command2", "na", "na", "zh",
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding2);
-		final Binding binding3 = new TestBinding("command3", "na", "na", null,
-				"gtk", Binding.SYSTEM, null);
-		bindingManager.addBinding(binding3);
-		final Binding binding4 = new TestBinding("command4", "na", "na", null,
-				"gtk", Binding.USER, null);
-		bindingManager.addBinding(binding4);
-		final Binding binding5 = new TestBinding("command5", "na", "na", "zh",
-				"gtk", Binding.USER, null);
-		bindingManager.addBinding(binding5);
-		assertNotNull("There should be three active bindings", bindingManager
-				.getActiveBindingsFor(binding1.getParameterizedCommand()));
-		assertNotNull("There should be three active bindings", bindingManager
-				.getActiveBindingsFor(binding2.getParameterizedCommand()));
-		assertNotNull("There should be three active bindings", bindingManager
-				.getActiveBindingsFor(binding4.getParameterizedCommand()));
-
-		// REMOVE SOME BINDINGS
-		bindingManager.removeBindings(TestBinding.TRIGGER_SEQUENCE, "na", "na",
-				"zh", "gtk", null, Binding.USER);
-		assertEquals("There should be four bindings left", 4, bindingManager
-				.getBindings().length);
-		assertNotNull("There should be four active bindings", bindingManager
-				.getActiveBindingsFor(binding1.getParameterizedCommand()));
-		assertNotNull("There should be four active bindings", bindingManager
-				.getActiveBindingsFor(binding2.getParameterizedCommand()));
-		assertNotNull("There should be four active bindings", bindingManager
-				.getActiveBindingsFor(binding3.getParameterizedCommand()));
-		assertNotNull("There should be four active bindings", bindingManager
-				.getActiveBindingsFor(binding4.getParameterizedCommand()));
-	}
-
-	/**
-	 * Verifies that selecting an undefimned scheme doesn't work. Verifies that
-	 * selecting a scheme works. Verifies that undefining scheme removes it as
-	 * the active scheme.
-	 */
-	public final void testSetActiveScheme() {
-		// SELECT UNDEFINED
-		final String schemeId = "schemeId";
-		final Scheme scheme = bindingManager.getScheme(schemeId);
-		try {
-			bindingManager.setActiveScheme(scheme);
-			fail("Cannot activate an undefined scheme");
-		} catch (final NotDefinedException e) {
-			// Success
-		}
-
-		// SELECT DEFINED
-		scheme.define("name", "description", null);
-		try {
-			bindingManager.setActiveScheme(scheme);
-			assertSame("The schemes should match", scheme, bindingManager
-					.getActiveScheme());
-		} catch (final NotDefinedException e) {
-			fail("Should be able to activate a scheme");
-		}
-
-		// UNDEFINE SELECTED
-		scheme.undefine();
-		assertNull("The scheme should have become unselected", bindingManager
-				.getActiveScheme());
-	}
-
-	public void testGetCurrentConflicts() throws NotDefinedException, ParseException {
-		
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-		bindingManager.setActiveScheme(scheme);
-		contextManager.setActiveContextIds(null);
-
-		Command command1 = commandManager.getCommand("conflictCommand1");
-		ParameterizedCommand parameterizedCommand1 = ParameterizedCommand.generateCommand(command1, null);
-		Command command2 = commandManager.getCommand("conflictCommand2");
-		ParameterizedCommand parameterizedCommand2 = ParameterizedCommand.generateCommand(command2, null);
-		Command command3 = commandManager.getCommand("conflictCommand3");
-		ParameterizedCommand parameterizedCommand3 = ParameterizedCommand.generateCommand(command3, null);
-		KeySequence conflict = KeySequence.getInstance("M1+M2+9");
-		KeySequence noConflict = KeySequence.getInstance("M1+M2+8");
-		Binding binding1 = new KeyBinding(conflict, parameterizedCommand1, "na", "na", null, null, null,
-				Binding.SYSTEM);
-		Binding binding2 = new KeyBinding(conflict, parameterizedCommand2, "na", "na", null, null, null,
-				Binding.SYSTEM);
-		Binding binding3 = new KeyBinding(noConflict, parameterizedCommand3, "na", "na", null, null, null,
-				Binding.SYSTEM);
-		final Binding[] bindings = new Binding[] {binding1, binding2, binding3};
-		bindingManager.setBindings(bindings);
-
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		Map activeBindingsDisregardingContext = bindingManager.getActiveBindingsDisregardingContext();// force a recompute
-		assertNotNull(activeBindingsDisregardingContext);
-		
-		Map currentConflicts = bindingManager.getCurrentConflicts();
-		assertEquals(1, currentConflicts.size()); // we have only one conflict
-		
-		Collection conflictsCollection = bindingManager.getConflictsFor(noConflict);
-		assertNull(conflictsCollection); // no conflict for this keybinding
-		
-		conflictsCollection = bindingManager.getConflictsFor(conflict);
-		assertNotNull(conflictsCollection); // this has one conflict with 2 commands
-		assertEquals(2, conflictsCollection.size());
-
-	}
-	
-	/**
-	 * Verifies that you can set the bindings to null. Verifies that setting the
-	 * bindings clears the cache.
-	 * 
-	 * @throws NotDefinedException
-	 *             If this test doesn't properly define a scheme.
-	 */
-	public final void testSetBindings() throws NotDefinedException {
-		// GENERAL SET-UP
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		// SET NULL
-		bindingManager.setBindings(null);
-		assertTrue("There should be no active bindings", bindingManager
-				.getActiveBindingsFor((ParameterizedCommand) null).length == 0);
-
-		// ADD BINDING
-		final String commandId = "commandId";
-		final Binding binding = new TestBinding(commandId, "na", "na", null,
-				null, Binding.SYSTEM, null);
-		final Binding[] bindings = new Binding[1];
-		bindings[0] = binding;
-		bindingManager.setBindings(bindings);
-		final TriggerSequence[] activeBindings = bindingManager
-				.getActiveBindingsFor(binding.getParameterizedCommand());
-		assertEquals("There should be one active binding", 1,
-				activeBindings.length);
-		assertSame("The binding should be the one we set",
-				TestBinding.TRIGGER_SEQUENCE, activeBindings[0]);
-	}
-
-	/**
-	 * Verifies that it cannot be set to <code>null</code>. Verifies that it
-	 * clears the cache.
-	 * 
-	 * @throws NotDefinedException
-	 *             If this test doesn't properly define a scheme.
-	 */
-	public final void testSetLocale() throws NotDefinedException {
-		// GENERAL SET-UP
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		// SET TO NULL
-		try {
-			bindingManager.setLocale(null);
-			fail("Cannot set the locale to null");
-		} catch (final NullPointerException e) {
-			// Success
-		}
-
-		// SET TO SOMETHING
-		final String commandId = "commandId";
-		final Binding binding = new TestBinding(commandId, "na", "na", "xx",
-				null, Binding.SYSTEM, null);
-		bindingManager.addBinding(binding);
-		assertTrue("The binding shouldn't be active",
-				bindingManager.getActiveBindingsFor(binding
-						.getParameterizedCommand()).length == 0);
-		bindingManager.setLocale("xx_XX");
-		final TriggerSequence[] activeBindings = bindingManager
-				.getActiveBindingsFor(binding.getParameterizedCommand());
-		assertEquals("The binding should become active", 1,
-				activeBindings.length);
-		assertSame("The binding should be the same",
-				TestBinding.TRIGGER_SEQUENCE, activeBindings[0]);
-	}
-
-	/**
-	 * Verifies that it cannot be set to <code>null</code>. Verifies that it
-	 * clears the cache.
-	 * 
-	 * @throws NotDefinedException
-	 *             If this test doesn't properly define a scheme.
-	 */
-	public final void testSetPlatform() throws NotDefinedException {
-		// GENERAL SET-UP
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		// SET TO NULL
-		try {
-			bindingManager.setPlatform(null);
-			fail("Cannot set the platform to null");
-		} catch (final NullPointerException e) {
-			// Success
-		}
-
-		// SET TO SOMETHING
-		final String commandId = "commandId";
-		final Binding binding = new TestBinding(commandId, "na", "na", null,
-				"atari", Binding.SYSTEM, null);
-		bindingManager.addBinding(binding);
-		assertTrue("The binding shouldn't be active",
-				bindingManager.getActiveBindingsFor(binding
-						.getParameterizedCommand()).length == 0);
-		bindingManager.setPlatform("atari");
-		final TriggerSequence[] activeBindings = bindingManager
-				.getActiveBindingsFor(binding.getParameterizedCommand());
-		assertEquals("The binding should become active", 1,
-				activeBindings.length);
-		assertSame("The binding should be the same",
-				TestBinding.TRIGGER_SEQUENCE, activeBindings[0]);
-	}
-
-	/**
-	 * Tests whether the method works with a null argument. Tests that it works
-	 * in a simple case.
-	 * 
-	 * @throws NotDefinedException
-	 *             If the scheme we try to activate is not defined.
-	 */
-	public final void testGetBestActiveBindingFor() throws Exception {
-		// Test with a null argument.
-		final TriggerSequence[] activeBindingsForNull = bindingManager
-				.getActiveBindingsFor((ParameterizedCommand) null);
-		assertNotNull("The active bindings for a command should never be null",
-				activeBindingsForNull);
-		assertTrue(
-				"The active binding for a null command should always be empty",
-				activeBindingsForNull.length == 0);
-
-		// Test a simple case.
-		final Context context = contextManager.getContext("na");
-		context.define("name", "description", null);
-
-		final Scheme scheme = bindingManager.getScheme("na");
-		scheme.define("name", "description", null);
-
-		bindingManager.setActiveScheme(scheme);
-		final Set activeContextIds = new HashSet();
-		activeContextIds.add("na");
-		contextManager.setActiveContextIds(activeContextIds);
-
-		final String commandId = "commandId";
-		final String categoryId = "cat";
-		Category cat = commandManager.getCategory(categoryId);
-		cat.define("cat", "cat");
-		Command cmd = commandManager.getCommand(commandId);
-		IParameter[] parms = new IParameter[1];
-		parms[0] = new IParameter() {
-			public String getId() {
-				return "viewId";
-			}
-
-			public String getName() {
-				return "View Id";
-			}
-
-			public IParameterValues getValues() throws ParameterValuesException {
-				return null;
-			}
-
-			public boolean isOptional() {
-				return false;
-			}
-		};
-		cmd.define("na", "NA", cat, parms);
-		Map map = new HashMap();
-		map.put("viewId", "outline");
-		ParameterizedCommand outline = ParameterizedCommand.generateCommand(
-				cmd, map);
-		map = new HashMap();
-		map.put("viewId", "console");
-		ParameterizedCommand console = ParameterizedCommand.generateCommand(
-				cmd, map);
-		assertFalse(outline.equals(console));
-
-		final Binding b2 = new KeyBinding(KeySequence.getInstance("M1+M2+V"),
-				outline, "na", "na", null, null, null, Binding.SYSTEM);
-		bindingManager.addBinding(b2);
-
-		final Binding binding = new KeyBinding(KeySequence.getInstance("M1+V"),
-				outline, "na", "na", null, null, null, Binding.SYSTEM);
-		bindingManager.addBinding(binding);
-
-		final Binding b3 = new KeyBinding(KeySequence.getInstance("M1+M2+C"),
-				console, "na", "na", null, null, null, Binding.SYSTEM);
-		bindingManager.addBinding(b3);
-
-		// - above is all done as part of startup
-
-		final TriggerSequence[] bindings = bindingManager
-				.getActiveBindingsFor(binding.getParameterizedCommand());
-		assertEquals(2, bindings.length);
-		
-		final TriggerSequence bestBinding = bindingManager.getBestActiveBindingFor(outline);
-		assertEquals(binding.getTriggerSequence(), bestBinding);
-		
-		final TriggerSequence bestBinding2 = bindingManager.getBestActiveBindingFor(console);
-		assertEquals(b3.getTriggerSequence(), bestBinding2);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/BindingPersistenceTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/BindingPersistenceTest.java
deleted file mode 100644
index fb93c08..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/BindingPersistenceTest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.keys;
-
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.jface.bindings.Binding;
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.ParseException;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.Util;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.keys.IBindingService;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test cases covering the various interaction between bindings. Bindings that
- * have been removed. Bindings that have been added. Inheritance of various
- * properties.
- * 
- * @since 3.1
- */
-public final class BindingPersistenceTest extends UITestCase {
-
-	/**
-	 * Constructor for <code>BindingPersistenceTest</code>.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public BindingPersistenceTest(final String name) {
-		super(name);
-	}
-
-	/**
-	 * <p>
-	 * Tests whether the preference store will be read automatically when a
-	 * change to the preference store is made.
-	 * </p>
-	 * 
-	 * @throws ParseException
-	 *             If "ALT+SHIFT+Q A" cannot be parsed by KeySequence.
-	 */
-	public final void testAutoLoad() throws ParseException {
-		// Get the services.
-		ICommandService commandService = (ICommandService) fWorkbench
-				.getAdapter(ICommandService.class);
-		IBindingService bindingService = (IBindingService) fWorkbench
-				.getAdapter(IBindingService.class);
-		bindingService.readRegistryAndPreferences(commandService);
-
-		// Check the pre-conditions.
-		final String emacsSchemeId = "org.eclipse.ui.emacsAcceleratorConfiguration";
-		assertFalse("The active scheme should be Emacs yet", emacsSchemeId
-				.equals(bindingService.getActiveScheme().getId()));
-		final KeySequence formalKeySequence = KeySequence
-				.getInstance("ALT+SHIFT+Q A");
-		final String commandId = "org.eclipse.ui.views.showView";
-		Binding[] bindings = bindingService.getBindings();
-		int i;
-		for (i = 0; i < bindings.length; i++) {
-			final Binding binding = bindings[i];
-			if ((binding.getType() == Binding.USER)
-					&& (formalKeySequence.equals(binding.getTriggerSequence()))) {
-				final ParameterizedCommand command = binding
-						.getParameterizedCommand();
-				final String actualCommandId = (command == null) ? null
-						: command.getCommand().getId();
-				assertFalse("The command should not yet be bound", commandId
-						.equals(actualCommandId));
-				break;
-			}
-		}
-		assertEquals("There shouldn't be a matching command yet",
-				bindings.length, i);
-
-		// Modify the preference store.
-		final IPreferenceStore store = WorkbenchPlugin.getDefault()
-				.getPreferenceStore();
-		store
-				.setValue(
-						"org.eclipse.ui.commands",
-						"<?xml version=\"1.0\" encoding=\"UTF-8\"?><org.eclipse.ui.commands><activeKeyConfiguration keyConfigurationId=\""
-								+ emacsSchemeId
-								+ "\"/><keyBinding commandId=\""
-								+ commandId
-								+ "\" contextId=\"org.eclipse.ui.contexts.window\" keyConfigurationId=\"org.eclipse.ui.defaultAcceleratorConfiguration\" keySequence=\""
-								+ formalKeySequence
-								+ "\"/></org.eclipse.ui.commands>");
-
-		// Check that the values have changed.
-		assertEquals("The active scheme should now be Emacs", emacsSchemeId,
-				bindingService.getActiveScheme().getId());
-		bindings = bindingService.getBindings();
-		for (i = 0; i < bindings.length; i++) {
-			final Binding binding = bindings[i];
-			if ((binding.getType() == Binding.USER)
-					&& (formalKeySequence.equals(binding.getTriggerSequence()))) {
-				final ParameterizedCommand command = binding
-						.getParameterizedCommand();
-				final String actualCommandId = (command == null) ? null
-						: command.getCommand().getId();
-				assertEquals("The command should be bound to 'ALT+SHIFT+Q A'",
-						commandId, actualCommandId);
-				break;
-			}
-		}
-		assertFalse("There should be a matching command now",
-				(bindings.length == i));
-	}
-
-	public final void testSinglePlatform() throws Exception {
-		// Get the services.
-		ICommandService commandService = (ICommandService) fWorkbench
-				.getAdapter(ICommandService.class);
-		IBindingService bindingService = (IBindingService) fWorkbench
-				.getAdapter(IBindingService.class);
-
-		ParameterizedCommand about = new ParameterizedCommand(commandService
-				.getCommand("org.eclipse.ui.help.aboutAction"), null);
-		KeySequence m5A = KeySequence.getInstance("M1+8 A");
-		KeySequence m5B = KeySequence.getInstance("M1+8 B");
-		int numAboutBindings = 0;
-
-		Binding[] bindings = bindingService.getBindings();
-		for (int i = 0; i < bindings.length; i++) {
-			final Binding binding = bindings[i];
-			if (binding.getType() == Binding.SYSTEM) {
-				String platform = binding.getPlatform();
-				int idx = (platform == null ? -1 : platform.indexOf(','));
-				assertEquals(binding.toString(), -1, idx);
-				if (about.equals(binding.getParameterizedCommand())) {
-					if (m5A.equals(binding.getTriggerSequence())) {
-						numAboutBindings++;
-						assertNull("M+8 A", binding.getPlatform());
-					} else if (m5B.equals(binding.getTriggerSequence())) {
-						numAboutBindings++;
-						// assertEquals(Util.WS_CARBON, binding.getPlatform());
-						// temp work around for honouring carbon bindings
-						assertTrue("failure for platform: "
-								+ binding.getPlatform(), Util.WS_CARBON
-								.equals(binding.getPlatform())
-								|| Util.WS_COCOA.equals(binding.getPlatform()));
-					}
-				}
-			}
-		}
-		// assertEquals(2, numAboutBindings);
-		// temp work around for honouring carbon bindings
-		assertEquals(3, numAboutBindings);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug189167Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug189167Test.java
deleted file mode 100644
index 3fc9c96..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug189167Test.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.bindings.Binding;
-
-/**
- * Tests Bug 189167
- * 
- * @since 3.4 
- */
-public class Bug189167Test extends TestCase {
-
-	private Binding createTestBinding() {
-		return new TestBinding("commandId", "schemeId", "contextId", "locale", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-				"platform", 0, null); //$NON-NLS-1$
-	}
-
-	public void testBindingsEqual() {
-		Binding one = createTestBinding();
-		Binding two = createTestBinding();
-		assertEquals(one, two);
-	}
-
-	public void testHashCodeEquals(){
-		Binding one = createTestBinding();
-		Binding two = createTestBinding();
-		Binding b3  = new TestBinding("commandID", "schemeID", "contextID", "locale", "platform", 1, null);
-		assertEquals(one, two);
-		assertEquals(one.hashCode(), two.hashCode());
-		
-		assertFalse(one.equals(b3));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug36420Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug36420Test.java
deleted file mode 100644
index 02a1a5c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug36420Test.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.PluginVersionIdentifier;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.ui.commands.ICommandManager;
-import org.eclipse.ui.internal.IWorkbenchConstants;
-import org.eclipse.ui.keys.KeySequence;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests Bug 36420
- * 
- * @since 3.0
- */
-public class Bug36420Test extends UITestCase {
-
-    /**
-     * Constructor for Bug36420Test.
-     * 
-     * @param name
-     *            The name of the test
-     */
-    public Bug36420Test(String name) {
-        super(name);
-    }
-
-    /**
-     * Tests that importing key preferences actually has an effect.
-     * 
-     * @throws CoreException
-     *             If the preferences can't be imported.
-     * @throws FileNotFoundException
-     *             If the temporary file is removed after it is created, but
-     *             before it is opened. (Wow)
-     * @throws IOException
-     *             If something fails during output of the preferences file.
-     */
-    public void testImportKeyPreferences() throws CoreException,
-            FileNotFoundException, IOException {
-        String commandId = "org.eclipse.ui.window.nextView"; //$NON-NLS-1$
-        String keySequenceText = "F S C K"; //$NON-NLS-1$
-
-        /*
-         * DO NOT USE PreferenceMutator for this section. This test case must
-         * use these exact steps, while PreferenceMutator might use something
-         * else in the future.
-         */
-        // Set up the preferences.
-        Properties preferences = new Properties();
-        String key = "org.eclipse.ui.workbench/org.eclipse.ui.commands"; //$NON-NLS-1$
-        String value = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<org.eclipse.ui.commands><activeKeyConfiguration keyConfigurationId=\"" + IWorkbenchConstants.DEFAULT_ACCELERATOR_CONFIGURATION_ID + "\"></activeKeyConfiguration><keyBinding	keyConfigurationId=\"org.eclipse.ui.defaultAcceleratorConfiguration\" commandId=\"" + commandId + "\" keySequence=\"" + keySequenceText + "\"/></org.eclipse.ui.commands>"; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-        preferences.put(key, value);
-        
-        // This is the first pass way to "walk" through the list
-        // of bundles
-        String[] pluginIds = Platform.getExtensionRegistry().getNamespaces();
-		for (int i = 0; i < pluginIds.length; i++) {
-			preferences.put(pluginIds[i], new PluginVersionIdentifier(
-					(String) Platform.getBundle(pluginIds[i]).getHeaders().get(
-							org.osgi.framework.Constants.BUNDLE_VERSION)));
-		}
-
-        // Export the preferences.
-        File file = File.createTempFile("preferences", ".txt"); //$NON-NLS-1$//$NON-NLS-2$
-        file.deleteOnExit();
-        BufferedOutputStream bos = new BufferedOutputStream(
-                new FileOutputStream(file));
-        preferences.store(bos, null);
-        bos.close();
-
-        // Attempt to import the key binding.
-        Preferences.importPreferences(new Path(file.getAbsolutePath()));
-        /*
-         * END SECTION
-         */
-
-        // Check to see that the key binding for the given command matches.
-        ICommandManager manager = fWorkbench.getCommandSupport()
-                .getCommandManager();
-        List keyBindings = manager.getCommand(commandId)
-                .getKeySequenceBindings();
-        Iterator keyBindingItr = keyBindings.iterator();
-        boolean found = false;
-        while (keyBindingItr.hasNext()) {
-            KeySequence keyBinding = (KeySequence) keyBindingItr.next();
-            String currentText = keyBinding.toString();
-            if (keySequenceText.equals(currentText)) {
-                found = true;
-            }
-        }
-
-        assertTrue("Key binding not imported.", found); //$NON-NLS-1$
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug36537Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug36537Test.java
deleted file mode 100644
index c668035..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug36537Test.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.jface.bindings.Binding;
-import org.eclipse.jface.bindings.TriggerSequence;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.keys.IBindingService;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests Bug 36537
- * 
- * @since 3.0
- */
-public class Bug36537Test extends UITestCase {
-
-	/**
-	 * Constructor for Bug36537Test.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public Bug36537Test(String name) {
-		super(name);
-	}
-
-	/**
-	 * Tests that there are no redundant key bindings defined in the
-	 * application.
-	 */
-	public void testForRedundantKeySequenceBindings() {
-		final IWorkbenchWindow window = openTestWindow();
-		final IWorkbench workbench = window.getWorkbench();
-		final IBindingService bindingService = (IBindingService) workbench
-				.getAdapter(IBindingService.class);
-		final Binding[] bindings = bindingService.getBindings();
-		final int bindingCount = bindings.length;
-		Map keySequenceBindingsByKeySequence = new HashMap();
-
-		for (int i = 0; i < bindingCount; i++) {
-			// Retrieve the key binding.
-			final Binding binding = bindings[i];
-
-			// Find the point the bindings with matching key sequences.
-			TriggerSequence triggerSequence = binding.getTriggerSequence();
-			List matches = (List) keySequenceBindingsByKeySequence
-					.get(triggerSequence);
-			if (matches == null) {
-				matches = new ArrayList();
-				keySequenceBindingsByKeySequence.put(triggerSequence, matches);
-			}
-
-			// Check that we don't have any redundancy or other wackiness.
-			Iterator matchItr = matches.iterator();
-			while (matchItr.hasNext()) {
-				final Binding matchedBinding = (Binding) matchItr.next();
-				ParameterizedCommand commandA = binding
-						.getParameterizedCommand();
-				ParameterizedCommand commandB = matchedBinding
-						.getParameterizedCommand();
-				String contextA = binding.getContextId();
-				String contextB = matchedBinding.getContextId();
-				String keyConfA = binding.getSchemeId();
-				String keyConfB = matchedBinding.getSchemeId();
-				String localeA = binding.getLocale();
-				String localeB = matchedBinding.getLocale();
-				String platformA = binding.getPlatform();
-				String platformB = matchedBinding.getPlatform();
-
-				boolean same = true;
-				int nullMatches = 0;
-				same &= (commandA == null) ? (commandB == null) : (commandA
-						.equals(commandB));
-				same &= (contextA == null) || (contextB == null)
-						|| (contextA.equals(contextB));
-				if (((contextA == null) || (contextB == null))
-						&& (contextA != contextB)) {
-					nullMatches++;
-				}
-				same &= (keyConfA == null) || (keyConfB == null)
-						|| (keyConfA.equals(keyConfB));
-				if (((keyConfA == null) || (keyConfB == null))
-						&& (keyConfA != keyConfB)) {
-					nullMatches++;
-				}
-				same &= (localeA == null) || (localeB == null)
-						|| (localeA.equals(localeB));
-				if (((localeA == null) || (localeB == null))
-						&& (localeA != localeB)) {
-					nullMatches++;
-				}
-				same &= (platformA == null) || (platformB == null)
-						|| (platformA.equals(platformB));
-				if (((platformA == null) || (platformB == null))
-						&& (platformA != platformB)) {
-					nullMatches++;
-				}
-
-				assertFalse(
-						"Redundant key bindings: " + binding + ", " + matchedBinding, same && (nullMatches < 1)); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			// Add the key binding.
-			matches.add(binding);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug40023Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug40023Test.java
deleted file mode 100644
index 89f2462..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug40023Test.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.common.CommandException;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.jface.bindings.keys.ParseException;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.Workbench;
-import org.eclipse.ui.internal.keys.BindingService;
-import org.eclipse.ui.keys.IBindingService;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests Bug 40023
- * 
- * @since 3.0
- */
-public class Bug40023Test extends UITestCase {
-
-    /**
-     * Retrieves a menu item matching or starting with the given name from an
-     * array of menu items.
-     * 
-     * @param menuItems
-     *            The array of menu items to search; must not be <code>null</code>
-     * @param text
-     *            The text to look for; may be <code>null</code>.
-     * @return The menu item, if any is found; <code>null</code> otherwise.
-     */
-    public static MenuItem getMenuItem(MenuItem[] menuItems, String text) {
-        for (int i = 0; i < menuItems.length; i++) {
-            if (menuItems[i].getText().startsWith(text)) {
-                return menuItems[i];
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Constructor for Bug40023Test.
-     * 
-     * @param name
-     *            The name of the test
-     */
-    public Bug40023Test(String name) {
-        super(name);
-    }
-
-    /**
-     * Tests that check box items on the menu are checked when activated from
-     * the keyboard.
-     * 
-     * @throws CommandException
-     *             If execution of the handler fails.
-     * @throws CoreException
-     *             If the exported preferences file is invalid for some reason.
-     * @throws FileNotFoundException
-     *             If the temporary file is removed before it can be read in.
-     *             (Wow)
-     * @throws IOException
-     *             If the creation of or the writing to the temporary file
-     *             fails for some reason.
-     * @throws ParseException
-     *             If the key binding cannot be parsed.
-     */
-    public void testCheckOnCheckbox() throws CoreException, CommandException,
-            FileNotFoundException, IOException, ParseException {
-        // Open a window to run the test.
-        IWorkbenchWindow window = openTestWindow();
-        Workbench workbench = (Workbench) window.getWorkbench();
-
-        // Set up a key binding for "Lock Toolbars".
-        String commandId = "org.eclipse.ui.window.lockToolBar"; //$NON-NLS-1$
-        String keySequenceText = "CTRL+ALT+L"; //$NON-NLS-1$
-        PreferenceMutator.setKeyBinding(commandId, keySequenceText);
-
-        // Press "CTRL+ALT+L" to lock the toolbars.
-        List keyStrokes = new ArrayList();
-        keyStrokes.add(KeyStroke.getInstance(keySequenceText));
-        Event event = new Event();
-		BindingService support = (BindingService) workbench
-				.getAdapter(IBindingService.class);
-        support.getKeyboard().press(keyStrokes, event);
-
-        // Check that the "Lock Toolbars" menu item is now checked.
-        Shell shell = window.getShell();
-        MenuItem windowMenu = getMenuItem(shell.getMenuBar().getItems(),
-                "&Window"); //$NON-NLS-1$
-        MenuItem lockToolBarsMenuItem = getMenuItem(windowMenu.getMenu()
-                .getItems(), "Lock the &Toolbars"); //$NON-NLS-1$
-        assertTrue("Checkbox menu item is not checked.", lockToolBarsMenuItem //$NON-NLS-1$
-                .getSelection());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug42024Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug42024Test.java
deleted file mode 100644
index d335d19..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug42024Test.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.KeySequenceText;
-import org.eclipse.jface.bindings.keys.ParseException;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests Bug 42024
- * 
- * @since 3.0
- */
-public class Bug42024Test extends UITestCase {
-
-    /** The shell on which the <code>KeySequenceText</code> is placed. */
-    private Shell shell = null;
-
-    /** The instance of <code>KeySequenceText</code> we should tinker with. */
-    private KeySequenceText text = null;
-
-    /**
-     * Constructor for Bug42024Test.
-     * 
-     * @param name
-     *            The name of the test
-     */
-    public Bug42024Test(String name) {
-        super(name);
-    }
-
-    /*
-     * @see TestCase#setUp()
-     */
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-
-        // Create a window with a KeySequenceText
-        Display display = Display.getCurrent();
-        shell = new Shell(display);
-        shell.setLayout(new RowLayout());
-        text = new KeySequenceText(new Text(shell, SWT.BORDER));
-
-        // Open it
-        shell.pack();
-        shell.open();
-    }
-
-    protected void doTearDown() throws Exception {
-        super.doTearDown();
-
-        // Close and destroy the window
-        shell.close();
-        shell.dispose();
-
-        // Release the memory.
-        shell = null;
-        text = null;
-    }
-
-    /**
-     * Tests that the limiting facility on KeySequenceText allows an arbitrary
-     * number of key strokes, when the the limit is set to "infinite". In this
-     * case, we will use a six stroke sequence.
-     * 
-     * @throws ParseException
-     *             If the test sequence cannot be parsed.
-     */
-    public void testInfiniteStrokes() throws ParseException {
-        String keySequenceText = "A B C D E F"; //$NON-NLS-1$
-        KeySequence keySequence = KeySequence.getInstance(keySequenceText);
-        text.setKeyStrokeLimit(KeySequenceText.INFINITE);
-        text.setKeySequence(keySequence);
-        assertEquals(
-                "Infinite limit but sequence changed.", keySequence, text.getKeySequence()); //$NON-NLS-1$
-    }
-
-    /**
-     * Tests that inserting a key sequence of matching length causes no change,
-     * but inserted a key sequence of one greater does cause a change --
-     * specifically truncation.
-     * 
-     * @throws ParseException
-     *             If the test sequences cannot be parsed.
-     */
-    public void testTruncation() throws ParseException {
-        final int length = 4;
-        text.setKeyStrokeLimit(length);
-
-        // Test matching length.
-        String matchingKeySequenceText = "1 2 3 4"; //$NON-NLS-1$
-        KeySequence matchingKeySequence = KeySequence
-                .getInstance(matchingKeySequenceText);
-        text.setKeySequence(matchingKeySequence);
-        assertEquals(
-                "Limit of four change four stroke sequence.", matchingKeySequence, text.getKeySequence()); //$NON-NLS-1$
-
-        // Test one greater than length.
-        String longerKeySequenceText = "1 2 3 4 5"; //$NON-NLS-1$
-        KeySequence longerKeySequence = KeySequence
-                .getInstance(longerKeySequenceText);
-        text.setKeySequence(longerKeySequence);
-        assertEquals(
-                "Limit of four did not truncate to four.", length, text.getKeySequence().getKeyStrokes().length); //$NON-NLS-1$
-    }
-
-    /**
-     * Tests that a zero-length stroke can be inserted into the KeySequenceText --
-     * regardless of whether the stroke limit is some positive integer or
-     * infinite.
-     */
-    public void testZeroStroke() {
-        KeySequence zeroStrokeSequence = KeySequence.getInstance();
-
-        // Test with a limit of four.
-        text.setKeyStrokeLimit(4);
-        text.setKeySequence(zeroStrokeSequence);
-        assertEquals(
-                "Limit of four changed zero stroke sequence.", zeroStrokeSequence, text.getKeySequence()); //$NON-NLS-1$
-
-        // Test with an infinite limit.
-        text.setKeyStrokeLimit(KeySequenceText.INFINITE);
-        text.setKeySequence(zeroStrokeSequence);
-        assertEquals(
-                "Infinite limit changed zero stroke sequence.", zeroStrokeSequence, text.getKeySequence()); //$NON-NLS-1$
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug42035Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug42035Test.java
deleted file mode 100644
index 628719c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug42035Test.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.keys.KeyStroke;
-import org.eclipse.ui.keys.ParseException;
-import org.eclipse.ui.keys.SWTKeySupport;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test for Bug 42035.
- * 
- * @since 3.0
- */
-public class Bug42035Test extends UITestCase {
-
-    /**
-     * Tests the given key event to see if generates the three key strokes
-     * represented by the strings.
-     * 
-     * @param keyEvent
-     *            The key event to generate key strokes from; must not be
-     *            <code>null</code>
-     * @param firstMatch
-     *            The text format of the first match; must not be <code>null</code>.
-     * @param secondMatch
-     *            The text format of the second match; must not be <code>null</code>.
-     * @param thirdMatch
-     *            The text format of the third match; must not be <code>null</code>.
-     * @throws ParseException
-     *             If anyone of the text formats provided cannot be parsed.
-     */
-    private static void testKeyEvent(Event keyEvent, String firstMatch,
-            String secondMatch, String thirdMatch) throws ParseException {
-        KeyStroke desiredKeyStroke = null;
-        KeyStroke actualKeyStroke = null;
-
-        // Test the first-level match.
-        desiredKeyStroke = KeyStroke.getInstance(firstMatch); //$NON-NLS-1$
-        actualKeyStroke = SWTKeySupport
-                .convertAcceleratorToKeyStroke(SWTKeySupport
-                        .convertEventToUnmodifiedAccelerator(keyEvent));
-        assertEquals(
-                "Unmodified character with all modifiers doesn't match.", desiredKeyStroke, actualKeyStroke); //$NON-NLS-1$
-
-        // Test the second-level match.
-        desiredKeyStroke = KeyStroke.getInstance(secondMatch); //$NON-NLS-1$
-        actualKeyStroke = SWTKeySupport
-                .convertAcceleratorToKeyStroke(SWTKeySupport
-                        .convertEventToUnshiftedModifiedAccelerator(keyEvent));
-        assertEquals(
-                "Modified character with no shift doesn't match.", desiredKeyStroke, actualKeyStroke); //$NON-NLS-1$
-
-        // Test the third-level match.
-        desiredKeyStroke = KeyStroke.getInstance(thirdMatch); //$NON-NLS-1$
-        actualKeyStroke = SWTKeySupport
-                .convertAcceleratorToKeyStroke(SWTKeySupport
-                        .convertEventToModifiedAccelerator(keyEvent));
-        assertEquals(
-                "Modified character with all modifiers doesn't match.", desiredKeyStroke, actualKeyStroke); //$NON-NLS-1$
-    }
-
-    /**
-     * Constructs a new instance of this test case.
-     * 
-     * @param testName
-     *            The name of the test
-     */
-    public Bug42035Test(String testName) {
-        super(testName);
-    }
-
-    /**
-     * Tests that "Ctrl+" generates "Ctrl+", "Ctrl+" and "Ctrl+".
-     * 
-     * @throws ParseException
-     *             If "CTRL+" cannot be processed.
-     */
-    public void testCtrl() throws ParseException {
-        Event keyEvent = new Event();
-        keyEvent.keyCode = 0x40000;
-        keyEvent.character = 0x00;
-        keyEvent.stateMask = SWT.NONE;
-
-        KeyStroke desiredKeyStroke = KeyStroke.getInstance("CTRL+"); //$NON-NLS-1$
-        KeyStroke actualKeyStroke = SWTKeySupport
-                .convertAcceleratorToKeyStroke(SWTKeySupport
-                        .convertEventToUnmodifiedAccelerator(keyEvent));
-        assertEquals(
-                "Unmodified character with all modifiers doesn't match", desiredKeyStroke, actualKeyStroke); //$NON-NLS-1$
-    }
-
-    /**
-     * Tests that "Ctrl+Enter" generates "Ctrl+Enter", "Ctrl+Enter" and
-     * "Ctrl+Enter".
-     * 
-     * @throws ParseException
-     *             If "CTRL+ENTER" cannot be processed.
-     */
-    public void testCtrlEnter() throws ParseException {
-        Event keyEvent = new Event();
-        keyEvent.keyCode = 0x0D;
-        keyEvent.character = 0x0D;
-        keyEvent.stateMask = SWT.CTRL;
-
-        testKeyEvent(keyEvent, "CTRL+CR", "CTRL+CR", "CTRL+CR"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
-    }
-
-    /**
-     * Tests that "Ctrl+J" generates "Ctrl+M", "Ctrl+M" and "Ctrl+M".
-     * 
-     * @throws ParseException
-     *             If "CTRL+M" cannot be processed.
-     */
-    public void testCtrlM() throws ParseException {
-        Event keyEvent = new Event();
-        keyEvent.keyCode = 0x6D;
-        keyEvent.character = 0x0D;
-        keyEvent.stateMask = SWT.CTRL;
-
-        testKeyEvent(keyEvent, "CTRL+M", "CTRL+M", "CTRL+M"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
-    }
-
-    /**
-     * Tests that "Ctrl+Shift+2" generates "Ctrl+Shift+2", "Ctrl+@" and
-     * "Ctrl+Shift+@". This simulates a U.S. keyboard layout.
-     * 
-     * @throws ParseException
-     *             If "CTRL+SHIFT+2", "CTRL+@" or "CTRL+SHIFT+@" cannot be
-     *             processed.
-     */
-    public void testCtrlShift2() throws ParseException {
-        Event keyEvent = new Event();
-        keyEvent.keyCode = '2';
-        keyEvent.character = 0x00;
-        keyEvent.stateMask = SWT.CTRL | SWT.SHIFT;
-
-        testKeyEvent(keyEvent, "CTRL+SHIFT+2", "CTRL+@", "CTRL+SHIFT+@"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
-    }
-
-    /**
-     * Tests that "Ctrl+Shift+7" generates "Ctrl+Shift+7", "Ctrl+/" and
-     * "Ctrl+Shift+/". This simulates a Swiss-German keyboard layout.
-     * 
-     * @throws ParseException
-     *             If "CTRL+SHIFT+7", "CTRL+/" or "CTRL+SHIFT+/" cannot be
-     *             processed.
-     */
-    public void testCtrlShift7_SwissGerman() throws ParseException {
-        Event keyEvent = new Event();
-        keyEvent.keyCode = '7';
-        keyEvent.character = '/';
-        keyEvent.stateMask = SWT.CTRL | SWT.SHIFT;
-
-        testKeyEvent(keyEvent, "CTRL+SHIFT+7", "CTRL+/", "CTRL+SHIFT+/"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
-    }
-
-    /**
-     * Tests that "Ctrl+Shift+7" generates "Ctrl+Shift+7", "Ctrl+&" and
-     * "Ctrl+Shift+&". This simulates a US keyboard layout.
-     * 
-     * @throws ParseException
-     *             If "CTRL+SHIFT+7", "CTRL+&" or "CTRL+SHIFT+&" cannot be
-     *             processed.
-     */
-    public void testCtrlShift7_US() throws ParseException {
-        Event keyEvent = new Event();
-        keyEvent.keyCode = '7';
-        keyEvent.character = '&';
-        keyEvent.stateMask = SWT.CTRL | SWT.SHIFT;
-
-        testKeyEvent(keyEvent, "CTRL+SHIFT+7", "CTRL+&", "CTRL+SHIFT+&"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug42627Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug42627Test.java
deleted file mode 100644
index 4196065..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug42627Test.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests Bug 42627
- * 
- * @since 3.0
- */
-public class Bug42627Test extends UITestCase {
-
-    // TODO See if this is needed for anything.
-    //	private class DummyView extends ViewPart {
-    //		public void createPartControl(Composite composite) {
-    //			// Do nothing
-    //		}
-    //		
-    //		public void setFocus() {
-    //			// Do nothing
-    //		}
-    //	}
-
-    /**
-     * A dummy implementation of an <code>Action</code>.
-     * 
-     * @since 3.0
-     */
-    //	private class DummyAction extends Action {
-    //		// Nothing to implement
-    //	}
-    //	private boolean logged;
-    /**
-     * Constructor for Bug42627Test.
-     * 
-     * @param name
-     *           The name of the test
-     */
-    public Bug42627Test(String name) {
-        super(name);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        //		logged = false;
-    }
-
-    /**
-     * Tests that actions with no defined command ID are logged.
-     * 
-     * @throws CoreException
-     *            If something fails when trying to open a new project.
-     */
-    public void testLogUndefined() /*throws CoreException*/{
-        // TODO No log is being generated.  What was Chris' fix?
-        //		IWorkbenchWindow window = openTestWindow();
-        //		ResourcesPlugin.getPlugin().getLog().addLogListener(new ILogListener() {
-        //			public void logging(IStatus status, String string) {
-        //				logged = true;
-        //			}
-        //		});
-        //		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        //		IProject testProject = workspace.getRoot().getProject("Bug42627Project"); //$NON-NLS-1$
-        //		testProject.create(null);
-        //		testProject.open(null);
-        //		AbstractTextEditor editor = (AbstractTextEditor) window.getActivePage().openEditor(testProject.getFile(".project")); //$NON-NLS-1$
-        //		editor.selectAndReveal(0, 1);
-        //		EditorSite site = (EditorSite) editor.getSite();
-        //		site.getActionBars().setGlobalActionHandler("Bogus action name that hopefully will not exist", new DummyAction()); //$NON-NLS-1$
-        //		window.getShell().setFocus();
-        //		assertTrue("Nothing has been logged.", logged); //$NON-NLS-1$
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43168Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43168Test.java
deleted file mode 100644
index aa496a2..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43168Test.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.KeySequenceText;
-import org.eclipse.jface.bindings.keys.ParseException;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests Bug 43168
- * 
- * @since 3.0
- */
-public class Bug43168Test extends UITestCase {
-
-    /**
-     * Constructor for Bug43168Test.
-     * 
-     * @param name
-     *            The name of the test
-     */
-    public Bug43168Test(String name) {
-        super(name);
-    }
-
-    /**
-     * Tests that a <code>StackOverflowError</code> does not occur when
-     * trying to set the key sequence in a key sequence entry widget.
-     * 
-     * @throws ParseException
-     *             If "CTRL+" is not recognized as a key sequence.
-     */
-    public void testStackOverflow() throws ParseException {
-        Display display = Display.getCurrent();
-        Shell shell = new Shell(display);
-        shell.setLayout(new RowLayout());
-        Text text = new Text(shell, SWT.BORDER);
-        KeySequenceText keySequenceText = new KeySequenceText(text);
-
-        shell.pack();
-        shell.open();
-        keySequenceText.setKeySequence(KeySequence.getInstance("CTRL+")); //$NON-NLS-1$
-        shell.close();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43321Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43321Test.java
deleted file mode 100644
index 28707a8..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43321Test.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import java.io.ByteArrayInputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.common.CommandException;
-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.jface.action.IAction;
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.jface.bindings.keys.ParseException;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.Workbench;
-import org.eclipse.ui.internal.keys.BindingService;
-import org.eclipse.ui.keys.IBindingService;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.texteditor.AbstractTextEditor;
-
-/**
- * Tests Bug 43321
- * 
- * @since 3.0
- */
-public class Bug43321Test extends UITestCase {
-
-	/**
-	 * Constructor for Bug43321Test.
-	 * 
-	 * @param name
-	 *            The name of the test
-	 */
-	public Bug43321Test(String name) {
-		super(name);
-	}
-
-	/**
-	 * Tests that non-check box items on the menu are not checked when activated
-	 * from the keyboard.
-	 * 
-	 * @throws CommandException
-	 *             If execution of the handler fails.
-	 * @throws CoreException
-	 *             If the test project cannot be created and opened.
-	 * @throws ParseException
-	 *             If "CTRL+C" isn't a valid key stroke.
-	 */
-	public void testNoCheckOnNonCheckbox() throws CommandException,
-			CoreException, ParseException {
-		IWorkbenchWindow window = openTestWindow();
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IProject testProject = workspace.getRoot().getProject("TestProject"); //$NON-NLS-1$
-		testProject.create(null);
-		testProject.open(null);
-		IFile textFile = testProject.getFile("A.txt"); //$NON-NLS-1$
-		String contents = "A blurb"; //$NON-NLS-1$
-		ByteArrayInputStream inputStream = new ByteArrayInputStream(contents
-				.getBytes());
-		textFile.create(inputStream, true, null);
-		AbstractTextEditor editor = (AbstractTextEditor) IDE.openEditor(window
-				.getActivePage(), textFile, true);
-		editor.selectAndReveal(0, 1);
-
-		// Press "Ctrl+C" to perform a copy.
-		List keyStrokes = new ArrayList();
-		keyStrokes.add(KeyStroke.getInstance("CTRL+C")); //$NON-NLS-1$
-		Event event = new Event();
-		Workbench workbench = ((Workbench) window.getWorkbench());
-		BindingService support = (BindingService) workbench
-				.getAdapter(IBindingService.class);
-		support.getKeyboard().press(keyStrokes, event);
-
-		// Get the menu item we've just selected.
-		IAction action = editor.getEditorSite().getActionBars()
-				.getGlobalActionHandler(ActionFactory.COPY.getId());
-		assertTrue("Non-checkbox menu item is checked.", !action.isChecked()); //$NON-NLS-1$
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43538Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43538Test.java
deleted file mode 100644
index 5fec4f6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43538Test.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.tests.harness.util.AutomationUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test for Bug 43538.
- * 
- * @since 3.0
- */
-public class Bug43538Test extends UITestCase {
-
-    /**
-     * Constructs a new instance of this test case.
-     * 
-     * @param testName
-     *            The name of the test
-     */
-    public Bug43538Test(String testName) {
-        super(testName);
-    }
-
-    /**
-     * Tests that if "Ctrl+Space" is pressed only one key down event with the
-     * "CTRL" mask is received.
-     */
-    public void testCtrlSpace() {
-        // Set up a working environment.
-        Display display = Display.getCurrent();
-        Listener listener = new Listener() {
-            int count = 0;
-
-            public void handleEvent(Event event) {
-                if (event.stateMask == SWT.CTRL) {
-                    assertEquals(
-                            "Multiple key down events for 'Ctrl+Space'", 0, count++); //$NON-NLS-1$
-                }
-            }
-        };
-        display.addFilter(SWT.KeyDown, listener);
-
-        AutomationUtil.performKeyCodeEvent(display, SWT.KeyDown, SWT.CONTROL);
-        AutomationUtil.performKeyCodeEvent(display, SWT.KeyDown, Action.findKeyCode("SPACE")); //$NON-NLS-1$
-        AutomationUtil.performKeyCodeEvent(display, SWT.KeyUp, Action.findKeyCode("SPACE")); //$NON-NLS-1$
-        AutomationUtil.performKeyCodeEvent(display, SWT.KeyUp, SWT.CONTROL);
-        
-        while (display.readAndDispatch())
-            ;
-
-        // Clean up the working environment.
-        display.removeFilter(SWT.KeyDown, listener);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43597Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43597Test.java
deleted file mode 100644
index 4017bbe..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43597Test.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-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.swt.widgets.Text;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests Bug 43597
- * 
- * @since 3.0
- */
-public class Bug43597Test extends UITestCase {
-
-    /**
-     * Constructor for Bug43597Test.
-     * 
-     * @param name
-     *            The name of the test
-     */
-    public Bug43597Test(String name) {
-        super(name);
-    }
-
-    /**
-     * Tests that setting the text on a text widget to an empty string does not
-     * reset the font. This was a problem only on carbon.
-     */
-    public void testFontReset() {
-        String metaCharacter = "\u2325X"; //$NON-NLS-1$
-
-        // Set up a working environment.
-        Display display = Display.getCurrent();
-        Shell shell = new Shell(display);
-        GridLayout gridLayout = new GridLayout();
-        shell.setLayout(gridLayout);
-        Text text = new Text(shell, SWT.LEFT);
-        text.setFont(new Font(text.getDisplay(),
-                "Lucida Grande", 13, SWT.NORMAL)); //$NON-NLS-1$
-        text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        shell.pack();
-        shell.open();
-
-        // Set the text once, and get the font.
-        text.setText(metaCharacter); //$NON-NLS-1$
-        Font fontBefore = text.getFont();
-
-        // Set the font again, and get the font afterward.
-        text.setText(""); //$NON-NLS-1$
-        text.setText(metaCharacter);
-        Font fontAfter = text.getFont();
-
-        // Test.
-		assertEquals("Clearing text resets font.", fontBefore, fontAfter); //$NON-NLS-1$
-
-        // Clean up after myself.
-        shell.close();
-        shell.dispose();
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43610Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43610Test.java
deleted file mode 100644
index 50e9989..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43610Test.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.tests.harness.util.AutomationUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test for Bug 43610.
- * 
- * @since 3.0
- */
-public class Bug43610Test extends UITestCase {
-
-    /**
-     * Constructs a new instance of this test case.
-     * 
-     * @param testName
-     *            The name of the test
-     */
-    public Bug43610Test(String testName) {
-        super(testName);
-    }
-
-    /**
-     * Tests that if "Shift+Alt+" is pressed, then the key code should
-     * represent the "Alt+" key press.
-     */
-    public void testShiftAlt() {
-        // Set up a working environment.
-        Display display = Display.getCurrent();
-        Listener listener = new Listener() {
-            public void handleEvent(Event event) {
-                if (event.stateMask == SWT.SHIFT) {
-                    assertEquals(
-                            "Incorrect key code for 'Shift+Alt+'", SWT.ALT, event.keyCode); //$NON-NLS-1$
-                }
-            }
-        };
-        display.addFilter(SWT.KeyDown, listener);
-        
-        AutomationUtil.performKeyCodeEvent(display, SWT.KeyDown, SWT.SHIFT);
-        AutomationUtil.performKeyCodeEvent(display, SWT.KeyDown, SWT.ALT);
-        AutomationUtil.performKeyCodeEvent(display, SWT.KeyUp, SWT.ALT);
-        AutomationUtil.performKeyCodeEvent(display, SWT.KeyUp, SWT.SHIFT);
-        AutomationUtil.performKeyCodeEvent(display, SWT.KeyDown, SWT.ESC);
-        AutomationUtil.performKeyCodeEvent(display, SWT.KeyUp, SWT.ESC);
-	
-        while (display.readAndDispatch())
-            ;
-
-        // Clean up the working environment.
-        display.removeFilter(SWT.KeyDown, listener);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43800Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43800Test.java
deleted file mode 100644
index eca8e8a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug43800Test.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.keys.SWTKeySupport;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test for Bug 43800.
- * 
- * @since 3.0
- */
-public class Bug43800Test extends UITestCase {
-
-    /**
-     * Constructs a new instance of this test case.
-     * 
-     * @param testName
-     *           The name of the test
-     */
-    public Bug43800Test(String testName) {
-        super(testName);
-    }
-
-    /**
-     * Tests that key pressed with key codes greater than 16 bits are correctly
-     * converted into accelerator values.
-     */
-    public void testTruncatingCast() {
-        /*
-         * Make an event representing a key stroke with a key code greater than
-         * 16 bits.
-         */
-        Event event = new Event();
-        event.keyCode = SWT.ARROW_LEFT;
-        event.character = 0x00;
-        event.stateMask = 0x00;
-
-        // Convert the event, and test the resulting accelerator value.
-        int accelerator = SWTKeySupport
-                .convertEventToUnmodifiedAccelerator(event);
-        assertEquals("Arrow_Left key truncated.", SWT.ARROW_LEFT, accelerator); //$NON-NLS-1$
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug44460Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug44460Test.java
deleted file mode 100644
index 978c645..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug44460Test.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import java.io.ByteArrayInputStream;
-import java.util.List;
-
-import org.eclipse.core.commands.common.CommandException;
-import org.eclipse.core.internal.events.BuildCommand;
-import org.eclipse.core.resources.ICommand;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.Workbench;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.keys.BindingService;
-import org.eclipse.ui.internal.keys.WorkbenchKeyboard;
-import org.eclipse.ui.keys.IBindingService;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test for Bug 44460.
- * 
- * @since 3.0
- */
-public class Bug44460Test extends UITestCase {
-
-	/**
-	 * Constructs a new instance of this test case.
-	 * 
-	 * @param testName
-	 *            The name of the test
-	 */
-	public Bug44460Test(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Test that pressing "Ctrl+Shift+T" in the Team Synchronizing perspective
-	 * does not match anything.
-	 * 
-	 * @throws CommandException
-	 *             If execution of the handler fails.
-	 * @throws CoreException
-	 *             If the project cannot be created or opened.
-	 */
-	public void testCtrlShiftT() throws CommandException, CoreException {
-		// Open a new test window.
-		IWorkbenchWindow window = openTestWindow();
-
-		// Open a new Java project, with a new class.
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IProject testProject = workspace.getRoot().getProject(
-				"Bug 44460 Project"); //$NON-NLS-1$
-		testProject.create(null);
-		testProject.open(null);
-		IProjectDescription projectDescription = testProject.getDescription();
-		String[] natureIds = { "org.eclipse.jdt.core.javanature" }; //$NON-NLS-1$
-		projectDescription.setNatureIds(natureIds);
-		ICommand buildCommand = new BuildCommand();
-		buildCommand.setBuilderName("org.eclipse.jdt.core.javabuilder"); //$NON-NLS-1$
-		projectDescription.setBuildSpec(new ICommand[] { buildCommand });
-		testProject.setDescription(projectDescription, null);
-		IFile javaFile = testProject.getFile("A.java"); //$NON-NLS-1$
-		String classContents = "public class Main { public static main(String[] args) { ; } }"; //$NON-NLS-1$
-		ByteArrayInputStream inputStream = new ByteArrayInputStream(
-				classContents.getBytes());
-		javaFile.create(inputStream, true, null);
-		IDE.openEditor(window.getActivePage(), javaFile, true);
-
-		// Switch to the team synchronizing perspective.
-		IPerspectiveRegistry registry = PlatformUI.getWorkbench()
-				.getPerspectiveRegistry();
-		IPerspectiveDescriptor perspectiveDescriptor = registry
-				.findPerspectiveWithId("org.eclipse.team.ui.TeamSynchronizingPerspective"); //$NON-NLS-1$
-		WorkbenchPage page = (WorkbenchPage) window.getActivePage();
-		page.setPerspective(perspectiveDescriptor);
-
-		// Press "Ctrl+Shift+T".
-		Event ctrlShiftT = new Event();
-		ctrlShiftT.stateMask = SWT.SHIFT | SWT.CTRL;
-		ctrlShiftT.character = 'T';
-		ctrlShiftT.keyCode = 't';
-		List keyStrokes = WorkbenchKeyboard
-				.generatePossibleKeyStrokes(ctrlShiftT);
-		Workbench workbench = (Workbench) window.getWorkbench();
-		BindingService support = (BindingService) workbench
-				.getAdapter(IBindingService.class);
-		support.getKeyboard().press(keyStrokes, null);
-
-		// Test that only two child shells are open (default).
-		Shell windowShell = window.getShell();
-		Shell[] childShells = windowShell.getShells();
-		assertTrue(
-				"Type hierarchy dialog opened inappropriately on 'Ctrl+Shift+T'", (childShells.length == 2)); //$NON-NLS-1$
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug53489Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug53489Test.java
deleted file mode 100644
index 5bb94ca..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/Bug53489Test.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.LineNumberReader;
-
-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.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.commands.CommandException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.tests.harness.util.AutomationUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests that pressing delete in a styled text widget does not cause a double
- * delete situation.
- * 
- * @since 3.0
- */
-public class Bug53489Test extends UITestCase {
-
-    /**
-     * Constructor for Bug53489Test.
-     * 
-     * @param name
-     *            The name of the test
-     */
-    public Bug53489Test(String name) {
-        super(name);
-    }
-
-    /**
-     * Tests that pressing delete in a styled text widget (in a running
-     * Eclipse) does not cause a double delete.
-     * 
-     * @throws AWTException
-     *             If the creation of robot
-     * @throws CommandException
-     *             If execution of the handler fails.
-     * @throws CoreException
-     *             If the test project cannot be created and opened.
-     * @throws IOException
-     *             If the file cannot be read.
-     */
-    public void testDoubleDelete() throws CommandException,
-            CoreException, IOException {
-        IWorkbenchWindow window = openTestWindow();
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        IProject testProject = workspace.getRoot().getProject(
-                "DoubleDeleteestProject"); //$NON-NLS-1$
-        testProject.create(null);
-        testProject.open(null);
-        IFile textFile = testProject.getFile("A.txt"); //$NON-NLS-1$
-        String originalContents = "A blurb"; //$NON-NLS-1$
-        ByteArrayInputStream inputStream = new ByteArrayInputStream(
-                originalContents.getBytes());
-        textFile.create(inputStream, true, null);
-        IDE.openEditor(window.getActivePage(), textFile,
-                true);
-
-        // Allow the editor to finish opening.
-        Display display = Display.getCurrent();
-        while (display.readAndDispatch())
-            ;
-
-        AutomationUtil.performKeyCodeEvent(display, SWT.KeyDown, SWT.DEL);
-        AutomationUtil.performKeyCodeEvent(display, SWT.KeyUp, SWT.DEL);
-        AutomationUtil.performKeyCodeEvent(display, SWT.KeyDown, SWT.CTRL);
-        AutomationUtil.performCharacterEvent(display, SWT.KeyDown,'S');
-        AutomationUtil.performCharacterEvent(display, SWT.KeyUp,'S');
-        AutomationUtil.performKeyCodeEvent(display, SWT.KeyUp, SWT.CTRL);
-      
-        // Spin the event loop.
-        while (display.readAndDispatch())
-            ;
-
-        // Test the text is only one character different.
-        LineNumberReader reader = new LineNumberReader(new InputStreamReader(
-                textFile.getContents()));
-        String currentContents = reader.readLine();
-        assertTrue("'DEL' deleted more than one key.", (originalContents //$NON-NLS-1$
-                .length() == (currentContents.length() + 1)));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/KeysCsvTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/KeysCsvTest.java
deleted file mode 100644
index 8ffdbfb..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/KeysCsvTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import org.eclipse.ui.internal.util.Util;
-
-import junit.framework.TestCase;
-
-/**
- * @since 3.3
- *
- */
-public class KeysCsvTest extends TestCase {
-
-	public void testReplace() throws Exception {
-		final String src = "Test the \"replaceAll\"";
-		final String dest = "Test the \"\"replaceAll\"\"";
-		String val = Util.replaceAll(src, "\"", "\"\"");
-		assertEquals(dest, val);
-	}
-	
-	public void testReplaceFirst() throws Exception {
-		final String src = "\"Hello world!";
-		final String dest = "\"\"Hello world!";
-		String val = Util.replaceAll(src, "\"", "\"\"");
-		assertEquals(dest, val);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/KeysPreferenceModelTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/KeysPreferenceModelTest.java
deleted file mode 100644
index a97189f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/KeysPreferenceModelTest.java
+++ /dev/null
@@ -1,948 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.jface.bindings.Binding;
-import org.eclipse.jface.bindings.keys.KeyBinding;
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.internal.keys.model.BindingElement;
-import org.eclipse.ui.internal.keys.model.BindingModel;
-import org.eclipse.ui.internal.keys.model.CommonModel;
-import org.eclipse.ui.internal.keys.model.ConflictModel;
-import org.eclipse.ui.internal.keys.model.ContextElement;
-import org.eclipse.ui.internal.keys.model.ContextModel;
-import org.eclipse.ui.internal.keys.model.KeyController;
-import org.eclipse.ui.internal.keys.model.ModelElement;
-import org.eclipse.ui.internal.keys.model.SchemeElement;
-import org.eclipse.ui.internal.keys.model.SchemeModel;
-import org.eclipse.ui.keys.IBindingService;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.4
- * 
- */
-public class KeysPreferenceModelTest extends UITestCase {
-
-	private static final String ID_QUICK_SWITCH = "org.eclipse.ui.window.openEditorDropDown";
-	private static final String SCHEME_EMACS_ID = "org.eclipse.ui.emacsAcceleratorConfiguration";
-	private static final String ID_QUICK_ACCESS = "org.eclipse.ui.window.quickAccess";
-	private static final String ID_ACTIVATE_EDITOR = "org.eclipse.ui.window.activateEditor";
-	private static final String ID_ABOUT = "org.eclipse.ui.help.aboutAction";
-	private static final String ID_CMD_CONFLICT1 = "org.eclipse.ui.tests.keyModel.conflict1";
-	private static final String ID_CMD_CONFLICT2 = "org.eclipse.ui.tests.keyModel.conflict2";
-	private static final String ID_CMD_CONFLICT3 = "org.eclipse.ui.tests.keyModel.conflict3";
-	private static final String ID_CMD_CONFLICT4 = "org.eclipse.ui.tests.keyModel.conflict4";
-	private static final String ID_CMD_EMACS1 = "org.eclipse.ui.tests.keyModel.emacs1";
-
-	/**
-	 * @param testName
-	 */
-	public KeysPreferenceModelTest(String testName) {
-		super(testName);
-	}
-
-	public void testDefaults() throws Exception {
-		KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		ContextModel cm = controller.getContextModel();
-		boolean foundWindow = false;
-		boolean foundDialog = false;
-		Iterator i = cm.getContexts().iterator();
-		while (i.hasNext()) {
-			ContextElement elem = (ContextElement) i.next();
-			if (elem.getId().equals(IContextService.CONTEXT_ID_WINDOW)) {
-				foundWindow = true;
-			} else if (elem.getId().equals(IContextService.CONTEXT_ID_DIALOG)) {
-				foundDialog = true;
-			}
-		}
-		assertTrue("No window context", foundWindow);
-		assertTrue("No dialog context", foundDialog);
-		assertNull(cm.getSelectedElement());
-		assertNotNull(cm.getContextIdToElement().get(
-				IContextService.CONTEXT_ID_DIALOG_AND_WINDOW));
-
-		SchemeModel sm = controller.getSchemeModel();
-		boolean foundDefault = false;
-		i = sm.getSchemes().iterator();
-		while (i.hasNext()) {
-			SchemeElement e = (SchemeElement) i.next();
-			if (e.getId().equals(
-					IBindingService.DEFAULT_DEFAULT_ACTIVE_SCHEME_ID)) {
-				foundDefault = true;
-			}
-		}
-		assertTrue("No default scheme", foundDefault);
-		assertEquals(IBindingService.DEFAULT_DEFAULT_ACTIVE_SCHEME_ID, sm
-				.getSelectedElement().getId());
-
-		ConflictModel cf = controller.getConflictModel();
-		assertNull("There should not be any conflicts", cf.getConflicts());
-		assertNull(cf.getSelectedElement());
-
-		BindingModel bm = controller.getBindingModel();
-		BindingElement quickAccess = getBindingElement(bm, ID_QUICK_ACCESS);
-		assertNotNull(quickAccess);
-		assertNull(bm.getSelectedElement());
-	}
-
-	public void testContexts() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		ContextModel cm = controller.getContextModel();
-		ContextElement dialog = (ContextElement) cm.getContextIdToElement()
-				.get(IContextService.CONTEXT_ID_DIALOG);
-		assertNull(cm.getSelectedElement());
-		assertNotNull(dialog);
-
-		final ArrayList events = new ArrayList();
-		// test setup vars
-		controller.addPropertyChangeListener(new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				events.add(event);
-			}
-		});
-		cm.setSelectedElement(dialog);
-
-		assertTrue(cm.getSelectedElement() == dialog);
-
-		assertEquals(1, events.size());
-
-		ContextElement window = (ContextElement) cm.getContextIdToElement()
-				.get(IContextService.CONTEXT_ID_WINDOW);
-		assertNotNull(window);
-
-		cm.setSelectedElement(window);
-		assertEquals(2, events.size());
-
-		cm.setSelectedElement(null);
-		assertEquals(3, events.size());
-
-		PropertyChangeEvent[] expected = new PropertyChangeEvent[] {
-				new PropertyChangeEvent(controller.getContextModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, null, dialog),
-				new PropertyChangeEvent(controller.getContextModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, dialog, window),
-				new PropertyChangeEvent(controller.getContextModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, window, null) };
-		assertChanges(expected, events);
-	}
-
-	public void testBindings() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		ContextModel cm = controller.getContextModel();
-		BindingModel bm = controller.getBindingModel();
-		BindingElement activateEditor = getBindingElement(bm,
-				ID_ACTIVATE_EDITOR);
-		assertNotNull(activateEditor);
-		assertNotNull(activateEditor.getContext());
-		assertNull(bm.getSelectedElement());
-
-		// test setup vars
-		final ArrayList events = new ArrayList();
-		controller.addPropertyChangeListener(new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				events.add(event);
-			}
-		});
-
-		bm.setSelectedElement(activateEditor);
-
-		assertTrue(bm.getSelectedElement() == activateEditor);
-		assertNotNull(cm.getSelectedElement());
-		assertTrue(cm.getSelectedElement().getId().equals(
-				activateEditor.getContext().getId()));
-
-		PropertyChangeEvent[] expected = new PropertyChangeEvent[] {
-				new PropertyChangeEvent(controller.getConflictModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, null, activateEditor),
-				new PropertyChangeEvent(controller.getContextModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, null, activateEditor
-								.getContext()),
-				new PropertyChangeEvent(controller.getBindingModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, null, activateEditor), };
-		assertChanges(expected, events);
-
-		events.clear();
-		bm.setSelectedElement(null);
-		assertNull(bm.getSelectedElement());
-		assertNull(cm.getSelectedElement());
-
-		expected = new PropertyChangeEvent[] {
-				new PropertyChangeEvent(controller.getConflictModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, activateEditor, null),
-				new PropertyChangeEvent(controller.getContextModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, activateEditor
-								.getContext(), null),
-				new PropertyChangeEvent(controller.getBindingModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, activateEditor, null) };
-		assertChanges(expected, events);
-	}
-
-	public void testBasicConflicts() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		final ConflictModel cf = controller.getConflictModel();
-		final BindingModel bm = controller.getBindingModel();
-		final BindingElement conflict1 = getBindingElement(bm, ID_CMD_CONFLICT1);
-		assertNotNull(conflict1);
-		assertEquals(Boolean.TRUE, conflict1.getConflict());
-		final BindingElement activateEditor = getBindingElement(bm,
-				ID_ACTIVATE_EDITOR);
-		assertNotNull(activateEditor);
-		assertEquals(Boolean.FALSE, activateEditor.getConflict());
-
-		// test setup vars
-		final ArrayList events = new ArrayList();
-		controller.addPropertyChangeListener(new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				events.add(event);
-			}
-		});
-
-		bm.setSelectedElement(conflict1);
-		assertEquals(conflict1, bm.getSelectedElement());
-		assertEquals(conflict1, cf.getSelectedElement());
-
-		final Collection conflicts = cf.getConflicts();
-		assertEquals(3, conflicts.size());
-
-		PropertyChangeEvent[] expected = new PropertyChangeEvent[] {
-				new PropertyChangeEvent(controller.getConflictModel(),
-						ConflictModel.PROP_CONFLICTS, null, conflicts),
-				new PropertyChangeEvent(controller.getConflictModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, null, conflict1),
-				new PropertyChangeEvent(controller.getContextModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, null, conflict1
-								.getContext()),
-				new PropertyChangeEvent(controller.getBindingModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, null, conflict1) };
-
-		assertChanges(expected, events);
-
-		events.clear();
-		bm.setSelectedElement(activateEditor);
-		assertEquals(activateEditor, bm.getSelectedElement());
-
-		expected = new PropertyChangeEvent[] {
-				new PropertyChangeEvent(controller.getConflictModel(),
-						ConflictModel.PROP_CONFLICTS, conflicts, null),
-				new PropertyChangeEvent(controller.getConflictModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, conflict1,
-						activateEditor),
-				new PropertyChangeEvent(controller.getContextModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, conflict1
-								.getContext(), activateEditor.getContext()),
-				new PropertyChangeEvent(controller.getBindingModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, conflict1,
-						activateEditor) };
-
-		assertChanges(expected, events);
-	}
-
-	public void testConflictSelection() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		final ConflictModel cf = controller.getConflictModel();
-		final BindingModel bm = controller.getBindingModel();
-		final BindingElement conflict1 = getBindingElement(bm, ID_CMD_CONFLICT1);
-		final BindingElement conflict3 = getBindingElement(bm, ID_CMD_CONFLICT3);
-
-		// test setup vars
-		final ArrayList events = new ArrayList();
-		controller.addPropertyChangeListener(new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				events.add(event);
-			}
-		});
-
-		bm.setSelectedElement(conflict1);
-		assertEquals(conflict1, bm.getSelectedElement());
-		assertEquals(conflict1, cf.getSelectedElement());
-
-		assertEquals(4, events.size());
-
-		events.clear();
-
-		cf.setSelectedElement(conflict3);
-		assertEquals(conflict3, bm.getSelectedElement());
-		assertEquals(conflict3, cf.getSelectedElement());
-
-		PropertyChangeEvent[] expected = new PropertyChangeEvent[] {
-				new PropertyChangeEvent(controller.getBindingModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, conflict1, conflict3),
-				new PropertyChangeEvent(controller.getConflictModel(),
-						CommonModel.PROP_SELECTED_ELEMENT, conflict1, conflict3) };
-		assertChanges(expected, events);
-	}
-
-	public void testCreateConflict() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		final ConflictModel cf = controller.getConflictModel();
-		final BindingModel bm = controller.getBindingModel();
-		BindingElement about = getBindingElement(bm, ID_ABOUT);
-		assertNotNull(about);
-		assertNull(about.getTrigger());
-
-		BindingElement active = getBindingElement(bm, ID_ACTIVATE_EDITOR);
-		assertNotNull(active);
-		assertNotNull(active.getTrigger());
-		assertEquals(Boolean.FALSE, active.getConflict());
-
-		bm.setSelectedElement(about);
-
-		about.setTrigger(KeySequence.getInstance("F12"));
-		assertEquals(Boolean.TRUE, about.getConflict());
-		assertEquals(Boolean.TRUE, active.getConflict());
-		assertEquals(about, cf.getSelectedElement());
-
-		about.setTrigger(KeySequence.getInstance("F12 A"));
-		assertEquals(Boolean.FALSE, about.getConflict());
-		assertEquals(Boolean.FALSE, active.getConflict());
-		assertEquals(about, cf.getSelectedElement());
-		assertNull(cf.getConflicts());
-
-		about.setTrigger(null);
-		assertEquals(Boolean.FALSE, about.getConflict());
-		assertEquals(Boolean.FALSE, active.getConflict());
-		assertEquals(about, cf.getSelectedElement());
-		assertNull(cf.getConflicts());
-	}
-
-	public void testConflictRemove() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		final ConflictModel cf = controller.getConflictModel();
-		final BindingModel bm = controller.getBindingModel();
-		BindingElement about = getBindingElement(bm, ID_ABOUT);
-		assertNotNull(about);
-		assertNull(about.getTrigger());
-
-		BindingElement active = getBindingElement(bm, ID_ACTIVATE_EDITOR);
-		assertNotNull(active);
-		assertNotNull(active.getTrigger());
-		assertEquals(Boolean.FALSE, active.getConflict());
-
-		bm.setSelectedElement(about);
-
-		about.setTrigger(KeySequence.getInstance("F12"));
-		assertEquals(Boolean.TRUE, about.getConflict());
-		assertEquals(Boolean.TRUE, active.getConflict());
-		assertEquals(about, cf.getSelectedElement());
-
-		bm.remove();
-		assertEquals(Boolean.FALSE, about.getConflict());
-		assertEquals(Boolean.FALSE, active.getConflict());
-		assertEquals(about, cf.getSelectedElement());
-		assertNull(cf.getConflicts());
-	}
-
-	public void testConflictRestore() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		final ConflictModel cf = controller.getConflictModel();
-		final BindingModel bm = controller.getBindingModel();
-		BindingElement about = getBindingElement(bm, ID_ABOUT);
-		assertNotNull(about);
-		assertNull(about.getTrigger());
-
-		BindingElement active = getBindingElement(bm, ID_ACTIVATE_EDITOR);
-		assertNotNull(active);
-		assertNotNull(active.getTrigger());
-		assertEquals(Boolean.FALSE, active.getConflict());
-
-		bm.setSelectedElement(about);
-
-		about.setTrigger(KeySequence.getInstance("F12"));
-		assertEquals(Boolean.TRUE, about.getConflict());
-		assertEquals(Boolean.TRUE, active.getConflict());
-		assertEquals(about, cf.getSelectedElement());
-
-		bm.restoreBinding(controller.getContextModel());
-
-		active = getBindingElement(bm, ID_ACTIVATE_EDITOR);
-		about = getBindingElement(bm, ID_ABOUT);
-
-		assertEquals(Boolean.FALSE, about.getConflict());
-		assertEquals(Boolean.FALSE, active.getConflict());
-		assertEquals(bm.getSelectedElement(), cf.getSelectedElement());
-		assertNull(cf.getConflicts());
-	}
-
-	public void testUpdateContext() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		final ContextModel cm = controller.getContextModel();
-		final ContextElement dialog = (ContextElement) cm
-				.getContextIdToElement().get(IContextService.CONTEXT_ID_DIALOG);
-		final ContextElement window = (ContextElement) cm
-				.getContextIdToElement().get(IContextService.CONTEXT_ID_WINDOW);
-
-		final BindingModel bm = controller.getBindingModel();
-		final BindingElement conflict2 = getBindingElement(bm, ID_CMD_CONFLICT2);
-		final Binding c2model = (Binding) conflict2.getModelObject();
-		assertEquals(dialog, conflict2.getContext());
-
-		bm.setSelectedElement(conflict2);
-		assertEquals(dialog, cm.getSelectedElement());
-
-		// test setup vars
-		final ArrayList events = new ArrayList();
-		controller.addPropertyChangeListener(new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				events.add(event);
-			}
-		});
-
-		cm.setSelectedElement(window);
-		assertEquals(window, ((BindingElement) bm.getSelectedElement())
-				.getContext());
-		assertNotSame(c2model, conflict2.getModelObject());
-
-		PropertyChangeEvent[] expected = new PropertyChangeEvent[] {
-				new PropertyChangeEvent(conflict2,
-						BindingElement.PROP_CONFLICT, Boolean.TRUE,
-						Boolean.FALSE),
-				new PropertyChangeEvent(conflict2, BindingElement.PROP_CONTEXT,
-						dialog, window),
-				new PropertyChangeEvent(conflict2,
-						BindingElement.PROP_USER_DELTA, new Integer(
-								Binding.SYSTEM), new Integer(Binding.USER)),
-				new PropertyChangeEvent(conflict2,
-						ModelElement.PROP_MODEL_OBJECT, c2model, conflict2
-								.getModelObject()),
-				new PropertyChangeEvent(cm, CommonModel.PROP_SELECTED_ELEMENT,
-						dialog, window), };
-		assertChanges(expected, events);
-	}
-
-	public void testUpdateKeySequence() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		final ContextModel cm = controller.getContextModel();
-		final ContextElement dialog = (ContextElement) cm
-				.getContextIdToElement().get(IContextService.CONTEXT_ID_DIALOG);
-
-		final BindingModel bm = controller.getBindingModel();
-		final BindingElement conflict1 = getBindingElement(bm, ID_CMD_CONFLICT1);
-		final BindingElement conflict2 = getBindingElement(bm, ID_CMD_CONFLICT2);
-		final BindingElement conflict3 = getBindingElement(bm, ID_CMD_CONFLICT3);
-		final Binding c2model = (Binding) conflict2.getModelObject();
-		final Binding c3model = (Binding) conflict3.getModelObject();
-		final ParameterizedCommand c3parameterized = c3model
-				.getParameterizedCommand();
-		assertEquals(dialog, conflict2.getContext());
-		assertTrue(c2model instanceof KeyBinding);
-		bm.setSelectedElement(conflict2);
-		assertEquals(dialog, cm.getSelectedElement());
-
-		// test setup vars
-		final ArrayList events = new ArrayList();
-		controller.addPropertyChangeListener(new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				events.add(event);
-			}
-		});
-
-		KeySequence oldKeySequence = (KeySequence) conflict2.getTrigger();
-		KeySequence ctrl5 = KeySequence.getInstance("CTRL+5 N");
-		Object bindingConflict1 = conflict1.getModelObject();
-		conflict2.setTrigger(ctrl5);
-		ConflictModel conflictModel = controller.getConflictModel();
-		ContextModel contextModel = controller.getContextModel();
-		ArrayList oldValue = new ArrayList();
-		oldValue.add(conflict3);
-
-		assertEquals(dialog, ((BindingElement) bm.getSelectedElement())
-				.getContext());
-		assertTrue(conflict2.getModelObject() instanceof KeyBinding);
-		PropertyChangeEvent[] expected = new PropertyChangeEvent[] {
-				new PropertyChangeEvent(conflict2,
-						BindingElement.PROP_CONFLICT, Boolean.TRUE,
-						Boolean.FALSE),
-				new PropertyChangeEvent(conflict2,
-						BindingElement.PROP_USER_DELTA, new Integer(
-								Binding.SYSTEM), new Integer(Binding.USER)),
-				new PropertyChangeEvent(controller.getConflictModel(),
-						ConflictModel.PROP_CONFLICTS_REMOVE, null, conflict2),
-				new PropertyChangeEvent(conflict2,
-						ModelElement.PROP_MODEL_OBJECT, c2model, conflict2
-								.getModelObject()),
-				new PropertyChangeEvent(conflict1,
-						BindingElement.PROP_CONFLICT, Boolean.TRUE,
-						Boolean.FALSE),
-				new PropertyChangeEvent(
-						conflict1,
-						BindingElement.PROP_CONTEXT,
-						((BindingElement) bm.getSelectedElement()).getContext(),
-						null),
-				new PropertyChangeEvent(conflictModel,
-						ConflictModel.PROP_CONFLICTS_REMOVE, null, conflict1),
-				new PropertyChangeEvent(conflict3,
-						BindingElement.PROP_CONFLICT, Boolean.TRUE,
-						Boolean.FALSE),
-				new PropertyChangeEvent(conflictModel,
-						ConflictModel.PROP_CONFLICTS, oldValue, null),
-				new PropertyChangeEvent(contextModel,
-						CommonModel.PROP_SELECTED_ELEMENT, dialog, null),
-				new PropertyChangeEvent(conflict1,
-						ModelElement.PROP_MODEL_OBJECT, bindingConflict1,
-						conflict1.getModelObject()),
-				new PropertyChangeEvent(conflict1, BindingElement.PROP_TRIGGER,
-						oldKeySequence, null),
-				new PropertyChangeEvent(conflict3, BindingElement.PROP_CONTEXT,
-						dialog, null),
-				new PropertyChangeEvent(conflict3,
-						ModelElement.PROP_MODEL_OBJECT, c3model,
-						c3parameterized),
-				new PropertyChangeEvent(conflict3,
-						BindingElement.PROP_TRIGGER, oldKeySequence, null),
-				new PropertyChangeEvent(bm,
-						BindingModel.PROP_CONFLICT_ELEMENT_MAP, null, conflict3),
-				new PropertyChangeEvent(conflict2, BindingElement.PROP_TRIGGER,
-						oldKeySequence, ctrl5), };
-		assertChanges(expected, events);
-	}
-
-	public void testCreateKeyBinding() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		final ContextModel cm = controller.getContextModel();
-		final ContextElement window = (ContextElement) cm
-				.getContextIdToElement().get(IContextService.CONTEXT_ID_WINDOW);
-
-		final BindingModel bm = controller.getBindingModel();
-		final BindingElement conflict4 = getBindingElement(bm, ID_CMD_CONFLICT4);
-		assertNull(conflict4.getContext());
-		Object c4model = conflict4.getModelObject();
-		assertTrue(c4model instanceof ParameterizedCommand);
-
-		bm.setSelectedElement(conflict4);
-		assertNull(cm.getSelectedElement());
-
-		// test setup vars
-		final ArrayList events = new ArrayList();
-		controller.addPropertyChangeListener(new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				events.add(event);
-			}
-		});
-
-		KeySequence ctrl5 = KeySequence.getInstance("CTRL+5 N");
-		conflict4.setTrigger(ctrl5);
-		assertEquals(window, ((BindingElement) bm.getSelectedElement())
-				.getContext());
-		assertTrue(conflict4.getModelObject() instanceof KeyBinding);
-		assertEquals(cm.getSelectedElement(), conflict4.getContext());
-
-		PropertyChangeEvent[] expected = new PropertyChangeEvent[] {
-				new PropertyChangeEvent(conflict4, BindingElement.PROP_CONTEXT,
-						null, window),
-				new PropertyChangeEvent(conflict4,
-						BindingElement.PROP_USER_DELTA, new Integer(
-								Binding.SYSTEM), new Integer(Binding.USER)),
-				new PropertyChangeEvent(cm, CommonModel.PROP_SELECTED_ELEMENT,
-						null, conflict4.getContext()),
-				new PropertyChangeEvent(conflict4,
-						ModelElement.PROP_MODEL_OBJECT, c4model, conflict4
-								.getModelObject()),
-				new PropertyChangeEvent(conflict4, BindingElement.PROP_TRIGGER,
-						null, ctrl5), };
-		assertChanges(expected, events);
-	}
-
-	public void testChangeSchemes() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		SchemeModel sm = controller.getSchemeModel();
-		SchemeElement emacsScheme = null;
-		Iterator i = sm.getSchemes().iterator();
-		while (i.hasNext()) {
-			SchemeElement e = (SchemeElement) i.next();
-			if (e.getId().equals(SCHEME_EMACS_ID)) {
-				emacsScheme = e;
-			}
-		}
-		assertNotNull(emacsScheme);
-
-		BindingModel bm = controller.getBindingModel();
-		BindingElement quickSwitch = null;
-		int quickCount = 0;
-		i = bm.getBindings().iterator();
-		while (i.hasNext()) {
-			BindingElement e = (BindingElement) i.next();
-			if (e.getId().equals(ID_QUICK_SWITCH)) {
-				quickSwitch = e;
-				quickCount++;
-			}
-		}
-		assertNotNull(quickSwitch);
-		assertEquals(1, quickCount);
-
-		sm.setSelectedElement(emacsScheme);
-
-		i = bm.getBindings().iterator();
-		ArrayList quick2 = new ArrayList();
-		boolean foundOriginal = false;
-		while (i.hasNext()) {
-			BindingElement e = (BindingElement) i.next();
-			if (e.getId().equals(ID_QUICK_SWITCH)) {
-				quick2.add(e);
-				if (e == quickSwitch) {
-					foundOriginal = true;
-				}
-			}
-		}
-		assertEquals(2, quick2.size());
-		assertTrue(foundOriginal);
-	}
-
-	public void testChangeSchemesTwice() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		SchemeModel sm = controller.getSchemeModel();
-		SchemeElement emacsScheme = null;
-		SchemeElement defaultScheme = null;
-		Iterator i = sm.getSchemes().iterator();
-		while (i.hasNext()) {
-			SchemeElement e = (SchemeElement) i.next();
-			if (e.getId().equals(SCHEME_EMACS_ID)) {
-				emacsScheme = e;
-			} else if (e.getId().equals(
-					IBindingService.DEFAULT_DEFAULT_ACTIVE_SCHEME_ID)) {
-				defaultScheme = e;
-			}
-		}
-		assertNotNull(emacsScheme);
-		assertNotNull(defaultScheme);
-
-		BindingModel bm = controller.getBindingModel();
-		BindingElement quickSwitch = null;
-		int quickCount = 0;
-		i = bm.getBindings().iterator();
-		while (i.hasNext()) {
-			BindingElement e = (BindingElement) i.next();
-			if (e.getId().equals(ID_QUICK_SWITCH)) {
-				quickSwitch = e;
-				quickCount++;
-			}
-		}
-		assertNotNull(quickSwitch);
-		assertEquals(1, quickCount);
-
-		sm.setSelectedElement(emacsScheme);
-
-		i = bm.getBindings().iterator();
-		ArrayList quick2 = new ArrayList();
-		boolean foundOriginal = false;
-		while (i.hasNext()) {
-			BindingElement e = (BindingElement) i.next();
-			if (e.getId().equals(ID_QUICK_SWITCH)) {
-				quick2.add(e);
-				if (e == quickSwitch) {
-					foundOriginal = true;
-				}
-			}
-		}
-		assertEquals(2, quick2.size());
-		assertTrue(foundOriginal);
-
-		sm.setSelectedElement(defaultScheme);
-
-		i = bm.getBindings().iterator();
-		quick2.clear();
-		foundOriginal = false;
-		while (i.hasNext()) {
-			BindingElement e = (BindingElement) i.next();
-			if (e.getId().equals(ID_QUICK_SWITCH)) {
-				quick2.add(e);
-				if (e == quickSwitch) {
-					foundOriginal = true;
-				}
-			}
-		}
-		assertEquals(1, quick2.size());
-		assertTrue(foundOriginal);
-	}
-
-	public void testSchemesWithNoDefaultBinding() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		final SchemeModel sm = controller.getSchemeModel();
-		SchemeElement emacsScheme = null;
-		SchemeElement defaultScheme = null;
-		Iterator i = sm.getSchemes().iterator();
-		while (i.hasNext()) {
-			SchemeElement e = (SchemeElement) i.next();
-			if (e.getId().equals(SCHEME_EMACS_ID)) {
-				emacsScheme = e;
-			} else if (e.getId().equals(
-					IBindingService.DEFAULT_DEFAULT_ACTIVE_SCHEME_ID)) {
-				defaultScheme = e;
-			}
-		}
-		assertNotNull(emacsScheme);
-		assertNotNull(defaultScheme);
-
-		final BindingModel bm = controller.getBindingModel();
-		BindingElement emacsElement = getBindingElement(bm, ID_CMD_EMACS1);
-		assertNotNull(emacsElement);
-		assertTrue(emacsElement.getModelObject() instanceof ParameterizedCommand);
-
-		sm.setSelectedElement(emacsScheme);
-
-		emacsElement = getBindingElement(bm, ID_CMD_EMACS1);
-		assertTrue(emacsElement.getModelObject() instanceof KeyBinding);
-
-		sm.setSelectedElement(defaultScheme);
-
-		emacsElement = getBindingElement(bm, ID_CMD_EMACS1);
-		assertTrue(emacsElement.getModelObject() instanceof ParameterizedCommand);
-	}
-
-	public void testCopyBinding() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		BindingModel bm = controller.getBindingModel();
-		BindingElement activateEditor = null;
-		ArrayList activates = new ArrayList();
-		Iterator i = bm.getBindings().iterator();
-		while (i.hasNext()) {
-			BindingElement be = (BindingElement) i.next();
-			if (be.getId().equals(ID_ACTIVATE_EDITOR)) {
-				activates.add(be);
-				if (be.getModelObject() instanceof KeyBinding) {
-					activateEditor = be;
-				}
-			}
-		}
-		assertEquals(1, activates.size());
-		assertNotNull(activateEditor);
-
-		bm.setSelectedElement(activateEditor);
-		bm.copy();
-		activates.clear();
-		i = bm.getBindings().iterator();
-		while (i.hasNext()) {
-			BindingElement be = (BindingElement) i.next();
-			if (be.getId().equals(ID_ACTIVATE_EDITOR)) {
-				activates.add(be);
-			}
-		}
-		assertEquals(2, activates.size());
-	}
-
-	public void testCopyCommand() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		BindingModel bm = controller.getBindingModel();
-		BindingElement conflict4 = null;
-		ArrayList activates = new ArrayList();
-		Iterator i = bm.getBindings().iterator();
-		while (i.hasNext()) {
-			BindingElement be = (BindingElement) i.next();
-			if (be.getId().equals(ID_CMD_CONFLICT4)) {
-				activates.add(be);
-				if (be.getModelObject() instanceof ParameterizedCommand) {
-					conflict4 = be;
-				}
-			}
-		}
-		assertEquals(1, activates.size());
-		assertNotNull(conflict4);
-
-		bm.setSelectedElement(conflict4);
-		bm.copy();
-		activates.clear();
-		i = bm.getBindings().iterator();
-		while (i.hasNext()) {
-			BindingElement be = (BindingElement) i.next();
-			if (be.getId().equals(ID_CMD_CONFLICT4)) {
-				activates.add(be);
-			}
-		}
-		assertEquals(1, activates.size());
-	}
-
-	public void testRemoveActiveEditor() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		BindingModel bm = controller.getBindingModel();
-		BindingElement activateEditor = getBindingElement(bm,
-				ID_ACTIVATE_EDITOR);
-
-		assertNotNull(activateEditor);
-		assertTrue(activateEditor.getModelObject() instanceof KeyBinding);
-
-		bm.setSelectedElement(activateEditor);
-		bm.remove();
-
-		assertTrue(activateEditor.getModelObject() instanceof ParameterizedCommand);
-	}
-
-	public void testRestoreBinding() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		BindingModel bm = controller.getBindingModel();
-		BindingElement activateEditor = getBindingElement(bm,
-				ID_ACTIVATE_EDITOR);
-
-		bm.setSelectedElement(activateEditor);
-
-		KeySequence ctrl5 = KeySequence.getInstance("CTRL+5 N");
-		activateEditor.setTrigger(ctrl5);
-
-		assertEquals(new Integer(Binding.USER), activateEditor.getUserDelta());
-		bm.copy();
-		BindingElement activeTwo = (BindingElement) bm.getSelectedElement();
-		assertFalse(activateEditor == activeTwo);
-
-		activeTwo.setTrigger(KeySequence.getInstance("CTRL+5 M"));
-		assertEquals(new Integer(Binding.USER), activeTwo.getUserDelta());
-
-		ArrayList activates = new ArrayList();
-		Iterator i = bm.getBindings().iterator();
-		while (i.hasNext()) {
-			BindingElement be = (BindingElement) i.next();
-			if (be.getId().equals(ID_ACTIVATE_EDITOR)) {
-				activates.add(be);
-			}
-		}
-		assertEquals(2, activates.size());
-
-		bm.restoreBinding(controller.getContextModel());
-
-		activates = new ArrayList();
-		i = bm.getBindings().iterator();
-		while (i.hasNext()) {
-			BindingElement be = (BindingElement) i.next();
-			if (be.getId().equals(ID_ACTIVATE_EDITOR)) {
-				activates.add(be);
-				activateEditor = be;
-			}
-		}
-		assertEquals(1, activates.size());
-		assertEquals(new Integer(Binding.SYSTEM), activateEditor.getUserDelta());
-	}
-
-	public void testRestoreCommand() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		final ContextModel cm = controller.getContextModel();
-		final ContextElement window = (ContextElement) cm
-				.getContextIdToElement().get(IContextService.CONTEXT_ID_WINDOW);
-
-		final BindingModel bm = controller.getBindingModel();
-		BindingElement conflict4 = getBindingElement(bm, ID_CMD_CONFLICT4);
-		assertNull(conflict4.getContext());
-		Object c4model = conflict4.getModelObject();
-		assertTrue(c4model instanceof ParameterizedCommand);
-
-		bm.setSelectedElement(conflict4);
-		assertNull(cm.getSelectedElement());
-
-		KeySequence ctrl5 = KeySequence.getInstance("CTRL+5 N");
-		conflict4.setTrigger(ctrl5);
-		assertEquals(window, ((BindingElement) bm.getSelectedElement())
-				.getContext());
-		assertTrue(conflict4.getModelObject() instanceof KeyBinding);
-
-		bm.setSelectedElement(conflict4);
-		bm.restoreBinding(cm);
-
-		conflict4 = getBindingElement(bm, ID_CMD_CONFLICT4);
-		assertTrue(conflict4.getModelObject() instanceof ParameterizedCommand);
-	}
-
-	public void testRestoreContext() throws Exception {
-		final KeyController controller = new KeyController();
-		controller.init(getWorkbench());
-
-		final ContextModel cm = controller.getContextModel();
-		final ContextElement dialog = (ContextElement) cm
-				.getContextIdToElement().get(IContextService.CONTEXT_ID_DIALOG);
-
-		final BindingModel bm = controller.getBindingModel();
-		BindingElement activateEditor = getBindingElement(bm,
-				ID_ACTIVATE_EDITOR);
-		activateEditor.setContext(dialog);
-
-		bm.setSelectedElement(activateEditor);
-		bm.restoreBinding(cm);
-
-		activateEditor = getBindingElement(bm, ID_ACTIVATE_EDITOR);
-		assertNotNull(activateEditor);
-	}
-
-	private void assertChangeEvent(int eventNum, PropertyChangeEvent expected,
-			PropertyChangeEvent event) {
-		assertEquals("source: " + eventNum, expected.getSource(), event
-				.getSource());
-		assertEquals("property: " + eventNum, expected.getProperty(), event
-				.getProperty());
-		assertEquals("old: " + eventNum, expected.getOldValue(), event
-				.getOldValue());
-		assertEquals("new: " + eventNum, expected.getNewValue(), event
-				.getNewValue());
-	}
-
-	private void assertChanges(PropertyChangeEvent[] expected, List events) {
-		assertEquals("events length", expected.length, events.size());
-		for (int i = 0; i < expected.length; i++) {
-			assertChangeEvent(i, expected[i], (PropertyChangeEvent) events
-					.get(i));
-		}
-	}
-
-	private BindingElement getBindingElement(BindingModel bm, String bindingId) {
-		BindingElement quickAccess = null;
-		Iterator i = bm.getBindings().iterator();
-		while (i.hasNext()) {
-			BindingElement e = (BindingElement) i.next();
-			if (e.getId().equals(bindingId)) {
-				quickAccess = e;
-			}
-		}
-		return quickAccess;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/KeysTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/KeysTestSuite.java
deleted file mode 100644
index c1ce006..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/KeysTestSuite.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.keys;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Tests for all areas of the key support for the platform.
- */
-public class KeysTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new KeysTestSuite();
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public KeysTestSuite() {
-    	addTest(new TestSuite(BindingInteractionsTest.class));
-    	addTest(new TestSuite(BindingManagerTest.class));
-        addTest(new TestSuite(BindingPersistenceTest.class));
-        // TODO This no longer works due to focus issues related to key bindings
-        //addTest(new TestSuite(Bug36420Test.class));
-        //		TODO This test is broken until JDT fixes Bug 44148
-        //		addTest(new TestSuite(Bug36537Test.class));
-        //		TODO Intermittent failure.  SWT Bug 44344.  XGrabPointer?
-        //		addTest(new TestSuite(Bug40023Test.class));
-        addTest(new TestSuite(Bug42024Test.class));
-        addTest(new TestSuite(Bug42035Test.class));
-        //		TODO Logging piece of fix did not go in M4.
-        //		addTest(new TestSuite(Bug42627Test.class));
-        addTest(new TestSuite(Bug43168Test.class));
-        addTest(new TestSuite(Bug43321Test.class));
-        addTest(new TestSuite(Bug43538Test.class));
-        addTest(new TestSuite(Bug43597Test.class));
-        addTest(new TestSuite(Bug43610Test.class));
-        addTest(new TestSuite(Bug43800Test.class));
-        addTest(new TestSuite(KeysCsvTest.class));
-        //		TODO disabled since it refers to the Java builder and nature,
-        //      which are not available in an RCP build
-        //		addTest(new TestSuite(Bug44460Test.class));
-        /* TODO disabled as it is causing failures in the nightly builds.
-         * focus related?
-         */
-        //addTest(new TestSuite(Bug53489Test.class));
-        addTest(new TestSuite(Bug189167Test.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/PreferenceMutator.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/PreferenceMutator.java
deleted file mode 100644
index 55af66f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/PreferenceMutator.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.keys;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Properties;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.PluginVersionIdentifier;
-import org.eclipse.core.runtime.Preferences;
-
-/**
- * A utility class for setting preferences related to key bindings. This class
- * currently uses the round-about procedure of manually writing a preferences
- * file, and then loading it back into the application. In the future, it might
- * use a direct API.
- * 
- * @since 3.0
- */
-public abstract class PreferenceMutator {
-    /**
-     * Sets a key binding in the currently running Eclipse application. It
-     * accomplishes this by writing out an exported preferences file by hand,
-     * and then importing it back into the application.
-     * 
-     * @param commandId
-     *           The command identifier to which the key binding should be
-     *           associated; should not be <code>null</code>.
-     * @param keySequenceText
-     *           The text of the key sequence for this key binding; must not be
-     *           <code>null</code>.
-     * @throws CoreException
-     *            If the exported preferences file is invalid for some reason.
-     * @throws FileNotFoundException
-     *            If the temporary file is removed before it can be read in.
-     *            (Wow)
-     * @throws IOException
-     *            If the creation of or the writing to the temporary file fails
-     *            for some reason.
-     */
-    static final void setKeyBinding(String commandId, String keySequenceText)
-            throws CoreException, FileNotFoundException, IOException {
-        // Set up the preferences.
-        Properties preferences = new Properties();
-        String key = "org.eclipse.ui.workbench/org.eclipse.ui.commands"; //$NON-NLS-1$
-        String value = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<org.eclipse.ui.commands><activeKeyConfiguration/><keyBinding commandId=\"" + commandId + "\" keySequence=\"" + keySequenceText + "\"/></org.eclipse.ui.commands>"; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-        preferences.put(key, value);
-        
-        String[] pluginIds = Platform.getExtensionRegistry().getNamespaces();
-		for (int i = 0; i < pluginIds.length; i++) {
-			preferences.put(pluginIds[i], new PluginVersionIdentifier(
-					(String) Platform.getBundle(pluginIds[i]).getHeaders().get(
-							org.osgi.framework.Constants.BUNDLE_VERSION)));
-		}
-
-        // Export the preferences.
-        File file = File.createTempFile("preferences", ".txt"); //$NON-NLS-1$//$NON-NLS-2$
-        file.deleteOnExit();
-        BufferedOutputStream bos = new BufferedOutputStream(
-                new FileOutputStream(file));
-        preferences.store(bos, null);
-        bos.close();
-
-        // Attempt to import the key binding.
-        Preferences.importPreferences(new Path(file.getAbsolutePath()));
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/TestBinding.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/TestBinding.java
deleted file mode 100644
index e0ed776..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/keys/TestBinding.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.keys;
-
-import org.eclipse.core.commands.CommandManager;
-import org.eclipse.core.commands.Parameterization;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.jface.bindings.Binding;
-import org.eclipse.jface.bindings.Trigger;
-import org.eclipse.jface.bindings.TriggerSequence;
-import org.eclipse.jface.util.Util;
-
-/**
- * A binding that can be used for testing purposes. This guarantees that the
- * properties tested are inherent to all bindings, and not just a specific type
- * of bindings.
- */
-final class TestBinding extends Binding {
-
-	/**
-	 * A simple trigger sequence for this test.
-	 */
-	static final class TestTriggerSequence extends TriggerSequence {
-
-		/**
-		 * Constructs a new instance of <code>TestTriggerSequence</code>.
-		 * 
-		 * @param myTriggers
-		 *            The triggers to use in constructing this sequence; must
-		 *            not be <code>null</code>.
-		 */
-		public TestTriggerSequence() {
-			super(new Trigger[0]);
-		}
-
-		public final String format() {
-			return toString();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.bindings.TriggerSequence#getPrefixes()
-		 */
-		public TriggerSequence[] getPrefixes() {
-			return new TriggerSequence[0];
-		}
-	}
-
-	/**
-	 * A command manager to use for creating commands.
-	 */
-	private static final CommandManager commandManager = new CommandManager();
-
-	/**
-	 * A trigger sequence to be used by all test bindings. This value is never
-	 * <code>null</code>.
-	 */
-	static final TriggerSequence TRIGGER_SEQUENCE = new TestTriggerSequence();
-
-	/**
-	 * Constructs a new instance of <code>TestBinding</code>
-	 * 
-	 * @param commandId
-	 *            The command id
-	 * @param schemeId
-	 *            The scheme id
-	 * @param contextId
-	 *            The context id
-	 * @param locale
-	 *            The locale
-	 * @param platform
-	 *            The platform
-	 * @param type
-	 *            The type: SYSTEM or USER
-	 * @param paramaterizations
-	 *            The parameters
-	 */
-	TestBinding(final String commandId, final String schemeId,
-			final String contextId, final String locale, final String platform,
-			final int type, final Parameterization[] parameterizations) {
-		super((commandId == null) ? null : new ParameterizedCommand(
-				commandManager.getCommand(commandId), parameterizations),
-				schemeId, contextId, locale, platform, null, type);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.bindings.Binding#getTriggerSequence()
-	 */
-	public final TriggerSequence getTriggerSequence() {
-		return TRIGGER_SEQUENCE;
-	}
-
-	public final String toString() {
-		return Util.ZERO_LENGTH_STRING;
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/layout/constraints/LayoutConstraintsView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/layout/constraints/LayoutConstraintsView.java
deleted file mode 100644
index 855d610..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/layout/constraints/LayoutConstraintsView.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Stefan Xenos, IBM Corporation - initial API and implementation
- *     Chris Torrence, ITT Visual Information Solutions - initial API and implementation (bug 51580)
- *******************************************************************************/
-package org.eclipse.ui.tests.layout.constraints;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.layout.LayoutConstants;
-import org.eclipse.jface.resource.JFaceResources;
-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.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.ISizeProvider;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartConstants;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.ViewPart;
-
-public class LayoutConstraintsView extends ViewPart implements ISizeProvider {
-
-    private Control control;
-
-    private int minWidth = ISizeProvider.INFINITE;
-    private int maxWidth = ISizeProvider.INFINITE;
-    private int minHeight = ISizeProvider.INFINITE;
-    private int maxHeight = ISizeProvider.INFINITE;
-    private int quantizedWidth = ISizeProvider.INFINITE;
-    private int quantizedHeight = ISizeProvider.INFINITE;
-    private int fixedArea = ISizeProvider.INFINITE;
-    private Text minWidthText;
-    private Text maxWidthText;
-    private Text quantizedWidthText;
-    private Text minHeightText;
-    private Text maxHeightText;
-    private Text quantizedHeightText;
-    private Text fixedAreaText;
-    private Text sampleImplementation;
-
-    public void createPartControl(Composite parent) {
-        control = parent;
-
-        Composite buttonBar = new Composite(parent, SWT.NONE);
-        {	
-            GridDataFactory buttonData = GridDataFactory.fillDefaults().grab(true, false);
-
-            Button applyButton = new Button(buttonBar, SWT.PUSH);
-            applyButton.setText("Apply");
-            applyButton.addSelectionListener(new SelectionAdapter() {
-                /* (non-Javadoc)
-                 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-                 */
-                public void widgetSelected(SelectionEvent e) {
-                    applyPressed();
-                }
-            });
-            buttonData.applyTo(applyButton);
-
-            Button clearButton = new Button(buttonBar, SWT.PUSH);
-            clearButton.setText("Reset");
-            clearButton.addSelectionListener(new SelectionAdapter() {
-                /* (non-Javadoc)
-                 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-                 */
-                public void widgetSelected(SelectionEvent e) {
-                    minWidthText.setText("");
-                    maxWidthText.setText("");
-                    quantizedWidthText.setText("");
-                    minHeightText.setText("");
-                    maxHeightText.setText("");
-                    quantizedHeightText.setText("");
-                    fixedAreaText.setText("");
-                    applyPressed();
-                }
-            });
-            buttonData.applyTo(clearButton);
-
-            Button newViewButton = new Button(buttonBar, SWT.PUSH);
-            newViewButton.setText("New View");
-            newViewButton.addSelectionListener(new SelectionAdapter() {
-                /* (non-Javadoc)
-                 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-                 */
-                public void widgetSelected(SelectionEvent e) {
-                    try {
-                        getSite().getPage().showView("org.eclipse.ui.tests.layout.constraints.LayoutConstraintsView", 
-                                "" + System.currentTimeMillis(), IWorkbenchPage.VIEW_ACTIVATE);
-                    } catch (PartInitException e1) {
-                        MessageDialog.openError(getSite().getShell(), "Error opening view", "Unable to open view.");
-                    }
-                }
-            });
-            buttonData.applyTo(newViewButton);
-
-            GridLayoutFactory.fillDefaults().equalWidth(true).numColumns(3).applyTo(buttonBar);
-        }
-        GridDataFactory.fillDefaults().grab(true, false).span(2,1).applyTo(buttonBar);
-
-        new Label(parent, SWT.NONE).setText("Min Width"); 
-        minWidthText = createText(parent);
-
-        new Label(parent, SWT.NONE).setText("Max Width (blank = unbounded)"); 
-        maxWidthText = createText(parent);
-
-        new Label(parent, SWT.NONE).setText("Quantized Width (blank = none)"); 
-        quantizedWidthText = createText(parent);
-
-        new Label(parent, SWT.NONE).setText("Min Height"); 
-        minHeightText = createText(parent);
-
-        new Label(parent, SWT.NONE).setText("Max Height (blank = unbounded)");
-        maxHeightText = createText(parent);
-
-        new Label(parent, SWT.NONE).setText("Quantized Height (blank = none)"); 
-        quantizedHeightText = createText(parent);		
-
-        new Label(parent, SWT.NONE).setText("Fixed Area (blank = none"); 
-        fixedAreaText = createText(parent);
-
-        sampleImplementation = new Text(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
-        sampleImplementation.setFont(JFaceResources.getFont(JFaceResources.TEXT_FONT));
-        sampleImplementation.setTabs(4);
-        GridDataFactory.fillDefaults().grab(true, true).span(2,1).applyTo(sampleImplementation);
-
-        GridLayoutFactory.fillDefaults().numColumns(2).margins(LayoutConstants.getMargins()).generateLayout(parent);
-
-        applyPressed();
-
-    }
-
-    /**
-     * 
-     */
-    protected void applyPressed() {
-        // Copy the values from the text boxes
-        minWidth = getInt(minWidthText);
-        maxWidth = getInt(maxWidthText);
-        quantizedWidth = getInt(quantizedWidthText);
-        minHeight = getInt(minHeightText);
-        maxHeight = getInt(maxHeightText);
-        quantizedHeight = getInt(quantizedHeightText);
-        fixedArea = getInt(fixedAreaText);
-
-        StringBuffer result = new StringBuffer();
-        result.append("// Sample implementation: Make sure your ViewPart adapts to ISizeProvider.\n");
-        result.append("// Then implement the following two methods.\n\n");
-        sampleImplementation.setText(result.toString() +
-                getSizeFlagsString() + computePreferredSizeString());
-
-        // Trigger a workbench layout
-        updateLayout();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.ISizeProvider#getSizeFlags(boolean)
-     */
-    public int getSizeFlags(boolean width) {
-        int flags = 0;
-        if (width) {
-            if (minWidth != ISizeProvider.INFINITE) {
-                flags |= SWT.MIN;
-            }
-            if (maxWidth != ISizeProvider.INFINITE) {
-                flags |= SWT.MAX;
-            }
-            if (quantizedWidth != ISizeProvider.INFINITE || fixedArea != ISizeProvider.INFINITE) {
-                flags |= SWT.FILL;
-            }
-            if (fixedArea != ISizeProvider.INFINITE) {
-                flags |= SWT.WRAP;
-            }
-        } else {
-            if (minHeight != ISizeProvider.INFINITE) {
-                flags |= SWT.MIN;
-            }
-            if (maxHeight != ISizeProvider.INFINITE) {
-                flags |= SWT.MAX;
-            }
-            if (quantizedHeight != ISizeProvider.INFINITE || fixedArea != ISizeProvider.INFINITE) {
-                flags |= SWT.FILL;
-            }
-            if (fixedArea != ISizeProvider.INFINITE) {
-                flags |= SWT.WRAP;
-            }			
-        }
-
-        return flags;
-    }
-
-    public String getSizeFlagsString() {
-        StringBuffer result = new StringBuffer();
-        result.append("/* (non-Javadoc)\n");
-        result.append(" * @see org.eclipse.ui.ISizeProvider#getSizeFlags(boolean)\n");
-        result.append(" */\n");
-        result.append("public int getSizeFlags(boolean width) {\n");
-        result.append("\tint flags = 0;\n");
-        result.append("\tif (width) {\n");
-        if (minWidth != ISizeProvider.INFINITE) {
-            result.append("\t\tflags |= SWT.MIN;\n");
-        }
-        if (maxWidth != ISizeProvider.INFINITE) {
-            result.append("\t\tflags |= SWT.MAX;\n");
-        }
-        if (quantizedWidth != ISizeProvider.INFINITE || fixedArea != ISizeProvider.INFINITE) {
-            result.append("\t\tflags |= SWT.FILL;\n");
-        }
-        if (fixedArea != ISizeProvider.INFINITE) {
-            result.append("\t\tflags |= SWT.WRAP;\n");
-        }
-        result.append("\t} else {\n");
-        if (minHeight != ISizeProvider.INFINITE) {
-            result.append("\t\tflags |= SWT.MIN;\n");
-        }
-        if (maxHeight != ISizeProvider.INFINITE) {
-            result.append("\t\tflags |= SWT.MAX;\n");
-        }
-        if (quantizedHeight != ISizeProvider.INFINITE || fixedArea != ISizeProvider.INFINITE) {
-            result.append("\t\tflags |= SWT.FILL;\n");
-        }
-        if (fixedArea != ISizeProvider.INFINITE) {
-            result.append("\t\tflags |= SWT.WRAP;\n");
-        }     
-        result.append("\t}\n");
-        result.append("\treturn flags;\n");
-        result.append("}\n\n");
-        return result.toString();
-    }
-
-    /**
-     * @param minWidth2
-     * @return
-     */
-    private int getInt(Text text) {
-        if (text.getText().equals("")) {
-            return ISizeProvider.INFINITE;
-        }
-
-        try {
-            return Integer.parseInt(text.getText());
-        } catch (NumberFormatException e) {
-            return ISizeProvider.INFINITE;
-        }
-    }
-
-    /**
-     * 
-     */
-    protected void updateLayout() {
-        firePropertyChange(IWorkbenchPartConstants.PROP_PREFERRED_SIZE);
-    }
-
-    /**
-     * @param parent
-     */
-    private Text createText(Composite parent) {
-        return new Text(parent, SWT.BORDER);		
-    }
-
-    public void setFocus() {
-        control.setFocus();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.ISizeProvider#computePreferredSize(boolean, int, int, int)
-     */
-    public int computePreferredSize(boolean width, int availableParallel,
-            int availablePerpendicular, int preferredResult) {
-
-        int result = preferredResult;
-
-        if (fixedArea != ISizeProvider.INFINITE) {
-            // Try to maintain a fixed area
-            result = (availablePerpendicular != 0) ? fixedArea / availablePerpendicular : 0;
-            if (result < 30) result = 30;
-        }
-
-        if (width) {
-            if (quantizedWidth != ISizeProvider.INFINITE && quantizedWidth != 0) {
-                // Jump to the nearest multiple of the quantized size
-                result = Math.min(result + quantizedWidth/2, availableParallel);
-                result = result - (result % quantizedWidth);
-            }
-            if (minWidth != ISizeProvider.INFINITE) {
-                // Ensure we go no smaller than the minimum size
-                if (result < minWidth) result = minWidth;
-            }
-            if (maxWidth != ISizeProvider.INFINITE) {
-                // Ensure we go no larger than the maximum size
-                if (result > maxWidth) result = maxWidth;
-            }
-        } else {
-            // Jump to the nearest multiple of the quantized size
-            if (quantizedHeight != ISizeProvider.INFINITE && quantizedHeight != 0) {
-                result = Math.min(result + quantizedHeight/2, availableParallel);
-                result = result - (result % quantizedHeight);
-            }
-            if (minHeight != ISizeProvider.INFINITE) {
-                // Ensure we go no smaller than the minimum size
-                if (result < minHeight) result = minHeight;
-            }
-            if (maxHeight != ISizeProvider.INFINITE) {
-                // Ensure we go no larger than the maximum size
-                if (result > maxHeight) result = maxHeight;
-            }
-        }
-
-        // Ensure that we do not use more than the available space
-        if (result > availableParallel) result = availableParallel;
-        if (result < 0) result = 0;
-        return result;
-    }
-
-    private String computePreferredSizeString() {
-        StringBuffer result = new StringBuffer();
-        result.append("/* (non-Javadoc)\n");
-        result.append(" * @see org.eclipse.ui.ISizeProvider#computePreferredSize(boolean, int, int, int)\n");
-        result.append(" */\n");
-        result.append("public int computePreferredSize(boolean width, int availableParallel,\n");
-        result.append("\tint availablePerpendicular, int preferredResult) {\n");
-        result.append("\tint result = preferredResult;\n");
-        if (fixedArea != ISizeProvider.INFINITE) {
-            result.append("\t// Try to maintain a fixed area\n");
-            result.append("\tresult = (availablePerpendicular != 0) ? " + fixedArea + "/availablePerpendicular : 0;\n");
-            result.append("\tif (result < 30) result = 30;\n");
-        }
-        result.append("\tif (width) {\n");
-        if (quantizedWidth != ISizeProvider.INFINITE && quantizedWidth != 0) {
-            result.append("\t\t// Jump to the nearest multiple of the quantized size\n");
-            result.append("\t\tresult = Math.min(result + " + quantizedWidth + "/2, availableParallel);\n");
-            result.append("\t\tresult = result - (result % " + quantizedWidth + ");\n");
-        }
-        if (minWidth != ISizeProvider.INFINITE) {
-            result.append("\t\t// Ensure we go no smaller than the minimum size\n");
-            result.append("\t\tif (result < " + minWidth + ") result = " + minWidth + ";\n");
-        }
-        if (maxWidth != ISizeProvider.INFINITE) {
-            result.append("\t\t// Ensure we go no larger than the maximum size\n");
-            result.append("\t\tif (result > " + maxWidth + ") result = " + maxWidth + ";\n");
-        }
-        result.append("\t} else {\n");
-        if (quantizedHeight != ISizeProvider.INFINITE && quantizedHeight != 0) {
-            result.append("\t\t// Jump to the nearest multiple of the quantized size\n");
-            result.append("\t\tresult = Math.min(result + " + quantizedHeight + "/2, availableParallel);\n");
-            result.append("\t\tresult = result - (result % " + quantizedHeight + ");\n");
-        }
-        if (minHeight != ISizeProvider.INFINITE) {
-            result.append("\t\t// Ensure we go no smaller than the minimum size\n");
-            result.append("\t\tif (result < " + minHeight + ") result = " + minHeight + ";\n");
-        }
-        if (maxHeight != ISizeProvider.INFINITE) {
-            result.append("\t\t// Ensure we go no larger than the maximum size\n");
-            result.append("\t\tif (result > " + maxHeight + ") result = " + maxHeight + ";\n");
-        }
-        result.append("\t}\n");
-        result.append("\t// Ensure that we do not use more than the available space\n");
-        result.append("\tif (result > availableParallel) result = availableParallel;\n");
-        result.append("\tif (result < 0) result = 0;\n");
-        result.append("\treturn result;\n");
-        result.append("}\n");
-        return result.toString();
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/leaks/ContextEditorPart.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/leaks/ContextEditorPart.java
deleted file mode 100644
index 5b3ef33..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/leaks/ContextEditorPart.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.leaks;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.MenuManager;
-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.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.EditorPart;
-
-/**
- * @since 3.4
- *
- */
-public class ContextEditorPart extends EditorPart {
-
-	private Text text;
-	private ISelectionProvider selectionProvider = null;
-	private Menu contextMenu;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor arg0) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
-	 */
-	public void doSaveAs() {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite arg0, IEditorInput arg1)
-			throws PartInitException {
-		setSite(arg0);
-		setInput(arg1);
-		selectionProvider = new ISelectionProvider() {
-			public void addSelectionChangedListener(
-					ISelectionChangedListener listener) {
-			}
-
-			public ISelection getSelection() {
-				return new StructuredSelection("Hi there");
-			}
-
-			public void removeSelectionChangedListener(
-					ISelectionChangedListener listener) {
-			}
-
-			public void setSelection(ISelection selection) {
-			}
-		};
-		getSite().setSelectionProvider(selectionProvider);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#isDirty()
-	 */
-	public boolean isDirty() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		text = new Text(parent, SWT.MULTI|SWT.WRAP);
-		text.setText("Hi there");
-		MenuManager manager = new MenuManager();
-		manager.setRemoveAllWhenShown(true);
-		contextMenu = manager.createContextMenu(text);
-		text.setMenu(contextMenu);
-		
-		getSite().registerContextMenu(manager, selectionProvider);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		text.setFocus();
-	}
-
-	public void showMenu() {
-		contextMenu.notifyListeners(SWT.Show, null);
-	}
-	
-	public void hideMenu() {
-		contextMenu.notifyListeners(SWT.Hide, null);
-	}
-	
-	public Menu getMenu() {
-		return contextMenu;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/leaks/LeakTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/leaks/LeakTests.java
deleted file mode 100644
index fd19c94..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/leaks/LeakTests.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.leaks;
-
-import java.lang.ref.PhantomReference;
-import java.lang.ref.Reference;
-import java.lang.ref.ReferenceQueue;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.part.NullEditorInput;
-import org.eclipse.ui.tests.api.MockViewPart;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Very simple leak tests to determine if any of our heavy objects are not being
- * disposed properly. Note that the results of these tests will in no way
- * actually assist you in tracking down the leak.
- * 
- * @since 3.1
- */
-public class LeakTests extends UITestCase {
-    private IWorkbenchPage fActivePage;
-
-    private IWorkbenchWindow fWin;
-
-    private IProject proj;
-
-    /**
-     * @param testName
-     */
-    public LeakTests(String testName) {
-        super(testName);
-    }
-
-    public static void checkRef(ReferenceQueue queue, Reference ref)
-            throws IllegalArgumentException, InterruptedException {
-        boolean flag = false;
-        for (int i = 0; i < 100; i++) {
-            System.runFinalization();
-            System.gc();
-            Thread.yield();
-            processEvents();
-            Reference checkRef = queue.remove(100);
-            if (checkRef != null && checkRef.equals(ref)) {
-                flag = true;
-                break;
-            }
-        }
-
-        assertTrue("Reference not enqueued", flag);
-    }
-
-    /**
-     * @param queue
-     * @param object
-     * @return
-     */
-    private Reference createReference(ReferenceQueue queue, Object object) {
-        return new PhantomReference(object, queue);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fWin = openTestWindow(IDE.RESOURCE_PERSPECTIVE_ID);
-        fActivePage = fWin.getActivePage();
-    }
-
-    protected void doTearDown() throws Exception {
-        super.doTearDown();
-        fWin = null;
-        fActivePage = null;
-        if (proj != null) {
-            FileUtil.deleteProject(proj);
-            proj = null;
-        }
-    }
-
-    public void testSimpleEditorLeak() throws Exception {
-        proj = FileUtil.createProject("testEditorLeaks");
-
-        IFile file = FileUtil.createFile("test.mock1", proj);
-
-        ReferenceQueue queue = new ReferenceQueue();
-        IEditorPart editor = IDE.openEditor(fActivePage, file);
-        assertNotNull(editor);
-        Reference ref = createReference(queue, editor);
-        try {
-            fActivePage.closeEditor(editor, false);
-            editor = null;
-            checkRef(queue, ref);
-        } finally {
-            ref.clear();
-        }
-    }
-
-    public void testSimpleViewLeak() throws Exception {
-        ReferenceQueue queue = new ReferenceQueue();
-        IViewPart view = fActivePage.showView(MockViewPart.ID);
-        assertNotNull(view);
-        Reference ref = createReference(queue, view);
-
-        try {
-            fActivePage.hideView(view);
-            view = null;
-            checkRef(queue, ref);
-        } finally {
-            ref.clear();
-        }
-    }
-    
-    public void testTextEditorContextMenu() throws Exception {
-    	proj = FileUtil.createProject("testEditorLeaks");
-
-    	IEditorInput input = new NullEditorInput();
-        ReferenceQueue queue = new ReferenceQueue();
-        IEditorPart editor = IDE.openEditor(fActivePage, input, "org.eclipse.ui.tests.leak.contextEditor");
-        assertTrue(editor instanceof ContextEditorPart);
-        Reference ref = createReference(queue, editor);
-        
-        ContextEditorPart contextMenuEditor = (ContextEditorPart) editor;
-        
-        contextMenuEditor.showMenu();
-        processEvents();
-        
-        contextMenuEditor.hideMenu();
-        processEvents();
-        
-        try {
-            contextMenuEditor = null;
-            fActivePage.closeEditor(editor, false);
-            editor = null;
-            checkRef(queue, ref);
-        } finally {
-            ref.clear();
-        }
-    }
-
-      /**
-       * No idea why the following test is failing.  Doug has ran this through a 
-       * profiler and for some reason the window just isn't being GCd despite 
-       * there not being nay incoming references.
-       */
-//    public void testSimpleWindowLeak() throws Exception {
-//        //turn off window management so that we dont have a reference to our
-//        // new
-//        //window in the listener
-//        manageWindows(false);
-//        try {
-//            ReferenceQueue queue = new ReferenceQueue();
-//            IWorkbenchWindow newWindow = openTestWindow();
-//
-//            assertNotNull(newWindow);
-//            Reference ref = createReference(queue, newWindow);
-//            try {
-//                newWindow.close();
-//                newWindow = null;
-//                checkRef(queue, ref);
-//            } finally {
-//                ref.clear();
-//            }
-//        } finally {
-//            manageWindows(true);
-//        }
-//    }
-    
-    /**
-     * Test for leaks if dialog is disposed before it is closed.
-     * This is really testing the framework rather than individual
-     * dialogs, since many dialogs or windows will fail if the shell
-     * is destroyed prior to closing them.
-     * See bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=123296
-     */
-  public void testDestroyedDialogLeaks() throws Exception {
-	  ReferenceQueue queue = new ReferenceQueue();
-	  // Use SaveAs dialog because it's simple to invoke and utilizes
-	  // framework function such as storing dialog bounds.  
-	  // We are really testing the framework itself here.
-	  Dialog newDialog = new SaveAsDialog(fWin.getShell());
-      newDialog.setBlockOnOpen(false);
-      newDialog.open();
-      assertNotNull(newDialog);
-      Reference ref = createReference(queue, newDialog);
-      try {
-      	  // Dispose the window before closing it.  
-       	  newDialog.getShell().dispose();
-       	  newDialog.close();
-       	  newDialog = null;
-          checkRef(queue, ref);
-      } finally {
-    	  ref.clear();
-      }
-  }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/BrokenUpdatePreferencePage.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/BrokenUpdatePreferencePage.java
deleted file mode 100644
index 15281fd..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/BrokenUpdatePreferencePage.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.manual;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.FontData;
-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.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.internal.util.PrefUtil;
-
-/**
- * This is a test preference page designed to
- * generate errors on update
- */
-public class BrokenUpdatePreferencePage extends PreferencePage implements
-        IWorkbenchPreferencePage {
-
-    private IPropertyChangeListener badListener = new IPropertyChangeListener() {
-        public void propertyChange(PropertyChangeEvent event) {
-            //Intentionally generate an error
-            String[] strings = new String[1];
-            System.out.println(strings[2]);
-        }
-    };
-
-    FontData[] data;
-
-    /**
-     * @see org.eclipse.jface.preference.PreferencePage#createContents(Composite)
-     */
-    protected Control createContents(Composite parent) {
-
-        data = parent.getFont().getFontData();
-
-        Composite buttonComposite = new Composite(parent, SWT.NULL);
-        buttonComposite.setLayout(new GridLayout());
-        buttonComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-        Button fontButton = new Button(buttonComposite, SWT.PUSH);
-        fontButton.setText("Update Font");
-        fontButton.addSelectionListener(new SelectionListener() {
-            public void widgetSelected(SelectionEvent e) {
-                changeFont();
-            }
-
-            public void widgetDefaultSelected(SelectionEvent e) {
-                changeFont();
-            }
-        });
-
-        Button preferencePluginButton = new Button(buttonComposite, SWT.PUSH);
-        preferencePluginButton.setText("Update Plugin Preferences");
-        preferencePluginButton.addSelectionListener(new SelectionListener() {
-            public void widgetSelected(SelectionEvent e) {
-                changePluginPreference();
-            }
-
-            public void widgetDefaultSelected(SelectionEvent e) {
-                changePluginPreference();
-            }
-        });
-
-        Button preferenceButton = new Button(buttonComposite, SWT.PUSH);
-        preferenceButton.setText("Update Dialog Preferences");
-        preferenceButton.addSelectionListener(new SelectionListener() {
-            public void widgetSelected(SelectionEvent e) {
-                changePluginPreference();
-            }
-
-            public void widgetDefaultSelected(SelectionEvent e) {
-                changePluginPreference();
-            }
-        });
-
-        return buttonComposite;
-
-    }
-
-    /**
-     * @see org.eclipse.ui.IWorkbenchPreferencePage#init(IWorkbench)
-     */
-    public void init(IWorkbench workbench) {
-
-        JFaceResources.getFontRegistry().addListener(badListener);
-
-        PrefUtil.getInternalPreferenceStore()
-                .addPropertyChangeListener(badListener);
-
-    }
-
-    /**	
-     * see@DialogPage.dispose();
-     */
-    public void dispose() {
-        super.dispose();
-        JFaceResources.getFontRegistry().removeListener(badListener);
-
-        PrefUtil.getInternalPreferenceStore()
-                .removePropertyChangeListener(badListener);
-    }
-
-    public void changeFont() {
-        JFaceResources.getFontRegistry().put("FAKO", data);
-    }
-
-    public void changePluginPreference() {
-        PrefUtil.getInternalPreferenceStore().firePropertyChangeEvent(
-                "FAKO", "Old", "New");
-    }
-
-    public void changePreference() {
-        getPreferenceStore().firePropertyChangeEvent("FAKO", "Old", "New");
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/ExplicitlyBusyView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/ExplicitlyBusyView.java
deleted file mode 100644
index f7a138e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/ExplicitlyBusyView.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.manual;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.layout.GridLayoutFactory;
-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.ui.part.ViewPart;
-import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
-
-/**
- * @since 3.3
- * 
- */
-public class ExplicitlyBusyView extends ViewPart {
-
-	private IWorkbenchSiteProgressService progressService;
-	private Object family = new Object();
-	private int counter;
-
-	class SomeJob extends Job {
-		public SomeJob(String name) {
-			super(name);
-		}
-
-		protected IStatus run(IProgressMonitor monitor) {
-			try {
-				Thread.sleep(5000);
-			} catch (InterruptedException e) {
-				e.printStackTrace();
-			}
-			return Status.OK_STATUS;
-		}
-
-		public boolean belongsTo(Object family) {
-			return family == ExplicitlyBusyView.this.family;
-		}
-	}
-
-	public void createPartControl(Composite parent) {
-		progressService = (IWorkbenchSiteProgressService) getSite().getAdapter(
-				IWorkbenchSiteProgressService.class);
-		progressService.showBusyForFamily(family);
-		{
-			final Button button = new Button(parent, SWT.CHECK);
-			button.setText("Busy");
-			button.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					if (button.getSelection()) {
-						progressService.incrementBusy();
-					} else {
-						progressService.decrementBusy();
-					}
-				}
-			});
-		}
-		{
-			Button button = new Button(parent, SWT.PUSH);
-			button.setText("Increment Busy");
-			button.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					progressService.incrementBusy();
-				}
-			});
-		}
-		{
-			Button button = new Button(parent, SWT.PUSH);
-			button.setText("Decrement Busy");
-			button.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					progressService.decrementBusy();
-				}
-			});
-		}
-		{
-			Button button = new Button(parent, SWT.PUSH);
-			button.setText("Spawn Job");
-			button.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					new SomeJob("Some Job " + counter++).schedule();
-				}
-			});
-		}
-		GridLayoutFactory.swtDefaults().applyTo(parent);
-	}
-
-	public void setFocus() {
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/SaveablesView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/SaveablesView.java
deleted file mode 100644
index 24e0fc8..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/SaveablesView.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.manual;
-
-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.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.resource.LocalResourceManager;
-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.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.ISaveablesLifecycleListener;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.Saveable;
-import org.eclipse.ui.SaveablesLifecycleEvent;
-import org.eclipse.ui.internal.SaveablesList;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * Helper view to see the open Saveable objects and their dirty state.
- */
-
-public class SaveablesView extends ViewPart {
-	private TableViewer viewer;
-
-	private Action printSourcesAction;
-
-	private ISaveablesLifecycleListener saveablesLifecycleListener = new ISaveablesLifecycleListener() {
-		public void handleLifecycleEvent(SaveablesLifecycleEvent event) {
-			if (event.getEventType() == SaveablesLifecycleEvent.DIRTY_CHANGED) {
-				Saveable[] saveables = event.getSaveables();
-				viewer.update(saveables, null);
-			} else {
-				viewer.refresh();
-			}
-		}
-	};
-
-	private LocalResourceManager resourceManager;
-
-	/*
-	 * The content provider class is responsible for providing objects to the
-	 * view. It can wrap existing objects in adapters or simply return objects
-	 * as-is. These objects may be sensitive to the current input of the view,
-	 * or ignore it and always show the same content (like Task List, for
-	 * example).
-	 */
-
-	class ViewContentProvider implements IStructuredContentProvider {
-		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
-		}
-
-		public void dispose() {
-		}
-
-		public Object[] getElements(Object parent) {
-			return ((SaveablesList) getSite().getService(
-					ISaveablesLifecycleListener.class)).getOpenModels();
-		}
-	}
-
-	class ViewLabelProvider extends LabelProvider implements
-			ITableLabelProvider {
-		public String getColumnText(Object obj, int index) {
-			Saveable saveable = (Saveable) obj;
-			return (saveable.isDirty()?"* ":"")+saveable.getName();
-		}
-
-		public Image getColumnImage(Object obj, int index) {
-			return getImage(obj);
-		}
-
-		public Image getImage(Object obj) {
-			if(true)return null;
-			ImageDescriptor descriptor = ((Saveable) obj)
-					.getImageDescriptor();
-			Image image = resourceManager.createImage(descriptor);
-			return image;
-		}
-	}
-
-	class NameSorter extends ViewerSorter {
-		public int compare(Viewer viewer, Object e1, Object e2) {
-			return ((Saveable)e1).getName().compareTo(((Saveable)e2).getName());
-		}
-	}
-
-	/**
-	 * The constructor.
-	 */
-	public SaveablesView() {
-		this.resourceManager = new LocalResourceManager(JFaceResources.getResources());
-	}
-	
-	public void dispose() {
-		resourceManager.dispose();
-		super.dispose();
-	}
-
-	/**
-	 * This is a callback that will allow us to create the viewer and initialize
-	 * it.
-	 */
-	public void createPartControl(Composite parent) {
-		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
-				| SWT.V_SCROLL);
-		viewer.setContentProvider(new ViewContentProvider());
-		viewer.setLabelProvider(new ViewLabelProvider());
-		viewer.setSorter(new NameSorter());
-		viewer.setInput(getViewSite());
-		((SaveablesList) getSite().getService(
-				ISaveablesLifecycleListener.class))
-				.addModelLifecycleListener(saveablesLifecycleListener);
-		makeActions();
-		hookContextMenu();
-	}
-
-	private void hookContextMenu() {
-		MenuManager menuMgr = new MenuManager("#PopupMenu");
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				SaveablesView.this.fillContextMenu(manager);
-			}
-		});
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(menuMgr, viewer);
-	}
-
-	private void fillContextMenu(IMenuManager manager) {
-		manager.add(printSourcesAction);
-		// Other plug-ins can contribute there actions here
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	private void makeActions() {
-		printSourcesAction = new Action() {
-			public void run() {
-				Saveable saveable = (Saveable) ((IStructuredSelection)viewer.getSelection()).getFirstElement();
-				SaveablesList manager = (SaveablesList) getSite().getService(ISaveablesLifecycleListener.class);
-				Object[] sources = manager.testGetSourcesForModel(saveable);
-				for (int i = 0; i < sources.length; i++) {
-					Object source = sources[i];
-					System.out.println(source);
-				}
-			}
-		};
-		printSourcesAction.setText("Print sources to stdout");
-		printSourcesAction.setToolTipText("Action tooltip");
-		printSourcesAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
-				.getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
-	}
-
-	/**
-	 * Passing the focus request to the viewer's control.
-	 */
-	public void setFocus() {
-		viewer.getControl().setFocus();
-	}
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/TestBackgroundSaveEditor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/TestBackgroundSaveEditor.java
deleted file mode 100644
index bf51c96..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/TestBackgroundSaveEditor.java
+++ /dev/null
@@ -1,489 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.manual;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-
-import org.eclipse.core.databinding.DataBindingContext;
-import org.eclipse.core.databinding.beans.BeansObservables;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.runtime.Assert;
-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.runtime.SubMonitor;
-import org.eclipse.jface.databinding.swt.SWTObservables;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.window.IShellProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.ISaveablePart;
-import org.eclipse.ui.ISaveablesSource;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.Saveable;
-import org.eclipse.ui.internal.WorkbenchMessages;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.progress.IJobRunnable;
-
-/**
- * @since 3.3
- * 
- */
-public class TestBackgroundSaveEditor extends EditorPart implements
-		ISaveablesSource {
-
-	public class MySaveable extends Saveable {
-
-		PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
-
-		private boolean dirty;
-
-		public void doSave(IProgressMonitor monitor) throws CoreException {
-			SubMonitor subMonitor = SubMonitor.convert(monitor, 2);
-			IJobRunnable runnable = doSave(subMonitor.newChild(1), getSite());
-			if (runnable!=null) {
-				runnable.run(subMonitor.newChild(1));
-			}
-			monitor.done();
-		}
-
-		public IJobRunnable doSave(IProgressMonitor monitor,
-				IShellProvider shellProvider) throws CoreException {
-			monitor.beginTask("Saving in the foreground",
-					data.foregroundSaveTime);
-			data.setOutput("");
-			for (int i = 0; i < data.foregroundSaveTime; i++) {
-				if (monitor.isCanceled()) {
-					return null;
-				}
-				try {
-					Thread.sleep(1000);
-				} catch (InterruptedException e) {
-					Thread.currentThread().interrupt();
-				}
-				data.setOutput(data.getInput().substring(0,
-						Math.min(i, data.getInput().length())));
-				monitor.worked(1);
-			}
-			if (data.throwExceptionInForeground) {
-				throw new CoreException(new Status(IStatus.ERROR,
-						"org.eclipse.ui.tests",
-						"Saving in the foreground failed"));
-			}
-			monitor.done();
-			if (!data.saveInBackground) {
-				data.setOutput(data.getInput());
-				setDirty(false);
-				return null;
-			}
-			IJobRunnable result = new IJobRunnable() {
-				public IStatus run(IProgressMonitor monitor) {
-					monitor.beginTask("Saving in the background",
-							data.backgroundSaveTime);
-					for (int i = 0; i < data.backgroundSaveTime; i++) {
-						if (monitor.isCanceled()) {
-							return Status.CANCEL_STATUS;
-						}
-						try {
-							Thread.sleep(1000);
-						} catch (InterruptedException e) {
-							Thread.currentThread().interrupt();
-						}
-						data.setOutput(data.getInput().substring(
-								0,
-								Math.min(i + data.foregroundSaveTime, data
-										.getInput().length())));
-						monitor.worked(1);
-					}
-					if (data.throwExceptionInBackground) {
-						return new Status(IStatus.ERROR,
-								"org.eclipse.ui.tests",
-								"Saving in the background failed");
-					}
-					data.setOutput(data.getInput());
-					setDirty(false);
-					monitor.done();
-					return Status.OK_STATUS;
-				}
-			};
-			return result;
-		}
-
-		public boolean equals(Object object) {
-			return this == object;
-		}
-
-		public ImageDescriptor getImageDescriptor() {
-			return input.getImageDescriptor();
-		}
-
-		public String getName() {
-			return input.getName();
-		}
-
-		public String getToolTipText() {
-			return input.getToolTipText();
-		}
-
-		public int hashCode() {
-			return System.identityHashCode(this);
-		}
-
-		public boolean isDirty() {
-			return dirty;
-		}
-
-		public void setDirty(boolean dirty) {
-			firePropertyChange("dirty", new Boolean(this.dirty), new Boolean(
-					this.dirty = dirty));
-			getSite().getShell().getDisplay().syncExec(new Runnable(){
-				public void run() {
-					TestBackgroundSaveEditor.this
-					.firePropertyChange(ISaveablePart.PROP_DIRTY);
-				}});
-		}
-
-		public void addPropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			changeSupport.addPropertyChangeListener(propertyName, listener);
-		}
-
-		void firePropertyChange(String propertyName, Object oldValue,
-				Object newValue) {
-			changeSupport.firePropertyChange(propertyName, oldValue, newValue);
-		}
-
-		public void removePropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			changeSupport.removePropertyChangeListener(propertyName, listener);
-		}
-	}
-
-	private MySaveable mySaveable;
-	private Text inputText;
-	private IEditorInput input;
-
-	public TestBackgroundSaveEditor() {
-		mySaveable = new MySaveable();
-	}
-
-	public void createPartControl(Composite parent) {
-		Realm realm = SWTObservables.getRealm(parent.getDisplay());
-		final DataBindingContext dbc = new DataBindingContext(realm);
-		parent.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				dbc.dispose();
-			}
-		});
-
-		final IObservableValue inputObservable = BeansObservables.observeValue(
-				realm, data, "input");
-		final IObservableValue outputObservable = BeansObservables
-				.observeValue(realm, data, "output");
-
-		createInputGroup(parent, dbc, inputObservable);
-		createOptionsGroup(parent, realm, dbc);
-		createOutputGroup(parent, dbc, outputObservable);
-
-		GridLayoutFactory.swtDefaults().numColumns(3).equalWidth(true)
-				.generateLayout(parent);
-	}
-
-	private void createOutputGroup(Composite parent,
-			final DataBindingContext dbc,
-			final IObservableValue outputObservable) {
-		Group outputGroup = new Group(parent, SWT.NONE);
-		outputGroup.setText("Output");
-		Text outputText = new Text(outputGroup, SWT.BORDER | SWT.READ_ONLY
-				| SWT.MULTI);
-		GridDataFactory.fillDefaults().grab(true, true).applyTo(outputText);
-		dbc.bindValue(SWTObservables.observeText(outputText, SWT.NONE),
-				outputObservable, null, null);
-		GridLayoutFactory.swtDefaults().generateLayout(outputGroup);
-	}
-
-	private void createOptionsGroup(Composite parent, Realm realm,
-			final DataBindingContext dbc) {
-		Group optionsGroup = new Group(parent, SWT.NONE);
-		optionsGroup.setText("Options");
-
-		Button dirtyButton = new Button(optionsGroup, SWT.CHECK);
-		new Label(optionsGroup, SWT.NONE).setText("Editor is dirty");
-		IObservableValue dirtyObservable = BeansObservables.observeValue(realm,
-				mySaveable, "dirty");
-		dbc.bindValue(SWTObservables.observeSelection(dirtyButton),
-				dirtyObservable, null, null);
-		// IObservableValue inputAndOutputDiffer = new ComputedValue(realm) {
-		// protected Object calculate() {
-		// return new Boolean(!Util.equals(inputObservable.getValue(),
-		// outputObservable.getValue()));
-		// }
-		// };
-		// dbc.bindValue(dirtyObservable, inputAndOutputDiffer, null);
-
-		Button saveInBackgroundButton = new Button(optionsGroup, SWT.CHECK);
-		new Label(optionsGroup, SWT.NONE)
-				.setText("Do part of the save in the background");
-		dbc.bindValue(SWTObservables.observeSelection(saveInBackgroundButton),
-				BeansObservables.observeValue(realm, data, "saveInBackground"),
-				null, null);
-
-		Button foregroundExceptionButton = new Button(optionsGroup, SWT.CHECK);
-		new Label(optionsGroup, SWT.NONE)
-				.setText("Throw exception while saving in the foreground");
-		dbc.bindValue(SWTObservables
-				.observeSelection(foregroundExceptionButton), BeansObservables
-				.observeValue(realm, data, "throwExceptionInForeground"), null, null);
-
-		Button backgroundExceptionButton = new Button(optionsGroup, SWT.CHECK);
-		new Label(optionsGroup, SWT.NONE)
-				.setText("Throw exception while saving in the background");
-		dbc.bindValue(SWTObservables
-				.observeSelection(backgroundExceptionButton), BeansObservables
-				.observeValue(realm, data, "throwExceptionInBackground"), null, null);
-
-		new Label(optionsGroup, SWT.NONE).setText("Foreground save time:");
-		Text optionsForegroundTime = new Text(optionsGroup, SWT.BORDER);
-		dbc.bindValue(SWTObservables.observeText(optionsForegroundTime,
-				SWT.Modify), BeansObservables.observeValue(realm, data,
-				"foregroundSaveTime"), null, null);
-
-		new Label(optionsGroup, SWT.NONE).setText("Background save time:");
-		Text optionsBackgroundTime = new Text(optionsGroup, SWT.BORDER);
-		dbc.bindValue(SWTObservables.observeText(optionsBackgroundTime,
-				SWT.Modify), BeansObservables.observeValue(realm, data,
-				"backgroundSaveTime"), null, null);
-
-		GridLayoutFactory.swtDefaults().numColumns(2).generateLayout(
-				optionsGroup);
-	}
-
-	private void createInputGroup(Composite parent,
-			final DataBindingContext dbc, final IObservableValue inputObservable) {
-		Group inputGroup = new Group(parent, SWT.NONE);
-		inputGroup.setText("Input");
-
-		inputText = new Text(inputGroup, SWT.BORDER | SWT.MULTI);
-		dbc.bindValue(SWTObservables.observeText(inputText, SWT.Modify),
-				inputObservable, null, null);
-
-		GridLayoutFactory.swtDefaults().generateLayout(inputGroup);
-	}
-
-	public void doSave(IProgressMonitor monitor) {
-		try {
-			mySaveable.doSave(monitor);
-		} catch (CoreException e) {
-			String title = "Save failed";
-			WorkbenchPlugin.log(title, new Status(IStatus.WARNING,
-					PlatformUI.PLUGIN_ID, 0, title, e));
-			MessageDialog.openError(getSite().getShell(),
-					WorkbenchMessages.Error, title + ':' + e.getMessage());
-		}
-	}
-
-	public void doSaveAs() {
-		Assert.isTrue(false, "Should not be called");
-	}
-
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		if (!(input instanceof IFileEditorInput))
-			throw new PartInitException(
-					"Invalid Input: Must be IFileEditorInput");
-		setSite(site);
-		setInput(input);
-		this.input = input;
-	}
-
-	public boolean isDirty() {
-		return mySaveable.isDirty();
-	}
-
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	public void setFocus() {
-		inputText.setFocus();
-	}
-
-	public static class Data {
-		PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
-		public String input = "";
-		public String output = "";
-		public String buffer;
-		public boolean saveInBackground;
-		public boolean throwExceptionInForeground;
-		public boolean throwExceptionInBackground;
-		public int foregroundSaveTime;
-		public int backgroundSaveTime;
-
-		public String getOutput() {
-			return output;
-		}
-
-		public void setOutput(String output) {
-			firePropertyChange("output", this.output, this.output = output);
-		}
-
-		public void addPropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			changeSupport.addPropertyChangeListener(propertyName, listener);
-		}
-
-		void firePropertyChange(String propertyName, Object oldValue,
-				Object newValue) {
-			changeSupport.firePropertyChange(propertyName, oldValue, newValue);
-		}
-
-		public void removePropertyChangeListener(String propertyName,
-				PropertyChangeListener listener) {
-			changeSupport.removePropertyChangeListener(propertyName, listener);
-		}
-
-		/**
-		 * @return Returns the input.
-		 */
-		public String getInput() {
-			return input;
-		}
-
-		/**
-		 * @param input
-		 *            The input to set.
-		 */
-		public void setInput(String input) {
-			this.input = input;
-		}
-
-		/**
-		 * @return Returns the buffer.
-		 */
-		public String getBuffer() {
-			return buffer;
-		}
-
-		/**
-		 * @param buffer
-		 *            The buffer to set.
-		 */
-		public void setBuffer(String buffer) {
-			this.buffer = buffer;
-		}
-
-		/**
-		 * @return Returns the saveInBackground.
-		 */
-		public boolean isSaveInBackground() {
-			return saveInBackground;
-		}
-
-		/**
-		 * @param saveInBackground
-		 *            The saveInBackground to set.
-		 */
-		public void setSaveInBackground(boolean saveInBackground) {
-			this.saveInBackground = saveInBackground;
-		}
-
-		/**
-		 * @return Returns the throwExceptionInForeground.
-		 */
-		public boolean isThrowExceptionInForeground() {
-			return throwExceptionInForeground;
-		}
-
-		/**
-		 * @param throwExceptionInForeground
-		 *            The throwExceptionInForeground to set.
-		 */
-		public void setThrowExceptionInForeground(
-				boolean throwExceptionInForeground) {
-			this.throwExceptionInForeground = throwExceptionInForeground;
-		}
-
-		/**
-		 * @return Returns the throwExceptionInBackground.
-		 */
-		public boolean isThrowExceptionInBackground() {
-			return throwExceptionInBackground;
-		}
-
-		/**
-		 * @param throwExceptionInBackground
-		 *            The throwExceptionInBackground to set.
-		 */
-		public void setThrowExceptionInBackground(
-				boolean throwExceptionInBackground) {
-			this.throwExceptionInBackground = throwExceptionInBackground;
-		}
-
-		/**
-		 * @return Returns the foregroundSaveTime.
-		 */
-		public int getForegroundSaveTime() {
-			return foregroundSaveTime;
-		}
-
-		/**
-		 * @param foregroundSaveTime
-		 *            The foregroundSaveTime to set.
-		 */
-		public void setForegroundSaveTime(int foregroundSaveTime) {
-			this.foregroundSaveTime = foregroundSaveTime;
-		}
-
-		/**
-		 * @return Returns the backgroundSaveTime.
-		 */
-		public int getBackgroundSaveTime() {
-			return backgroundSaveTime;
-		}
-
-		/**
-		 * @param backgroundSaveTime
-		 *            The backgroundSaveTime to set.
-		 */
-		public void setBackgroundSaveTime(int backgroundSaveTime) {
-			this.backgroundSaveTime = backgroundSaveTime;
-		}
-	}
-
-	private Data data = new Data();
-
-	public Saveable[] getActiveSaveables() {
-		return new Saveable[] { mySaveable };
-	}
-
-	public Saveable[] getSaveables() {
-		return new Saveable[] { mySaveable };
-	}
-	
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/UIPreferencesManual.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/UIPreferencesManual.java
deleted file mode 100644
index b902fa3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/UIPreferencesManual.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.manual;
-
-import java.util.Iterator;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.tests.dialogs.PreferenceDialogWrapper;
-import org.eclipse.ui.tests.dialogs.UIPreferencesAuto;
-
-/**
- * The UIPreferencesManual is a test case that requires
- * the user to click OK on message dialog when it is
- * run
- */
-
-public class UIPreferencesManual extends UIPreferencesAuto {
-
-    public UIPreferencesManual(String name) {
-        super(name);
-    }
-
-    /**
-     * Test the bad update preference page by generating all
-     * of the dialog errors.
-     */
-    public void testBrokenListenerPref() {
-
-        PreferenceDialogWrapper dialog = null;
-        PreferenceManager manager = WorkbenchPlugin.getDefault()
-                .getPreferenceManager();
-        if (manager != null) {
-            dialog = new PreferenceDialogWrapper(getShell(), manager);
-            dialog.create();
-
-            for (Iterator iterator = manager.getElements(
-                    PreferenceManager.PRE_ORDER).iterator(); iterator.hasNext();) {
-                IPreferenceNode node = (IPreferenceNode) iterator.next();
-                if (node
-                        .getId()
-                        .equals(
-                                "org.eclipse.ui.tests.manual.BrokenUpdatePreferencePage")) {
-                    dialog.showPage(node);
-                    BrokenUpdatePreferencePage page = (BrokenUpdatePreferencePage) dialog
-                            .getPage(node);
-                    page.changeFont();
-                    page.changePluginPreference();
-                    break;
-                }
-            }
-        }
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/ViewWithSaveables.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/ViewWithSaveables.java
deleted file mode 100644
index c949345..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/manual/ViewWithSaveables.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.manual;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.databinding.observable.Diffs;
-import org.eclipse.core.databinding.observable.list.WritableList;
-import org.eclipse.core.databinding.observable.map.ComputedObservableMap;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.value.ComputedValue;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.databinding.observable.value.IValueChangeListener;
-import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
-import org.eclipse.core.databinding.observable.value.WritableValue;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
-import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
-import org.eclipse.jface.databinding.viewers.ViewersObservables;
-import org.eclipse.jface.internal.databinding.provisional.swt.ControlUpdater;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.TableViewer;
-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.ui.ISaveablePart;
-import org.eclipse.ui.ISaveablesLifecycleListener;
-import org.eclipse.ui.ISaveablesSource;
-import org.eclipse.ui.Saveable;
-import org.eclipse.ui.SaveablesLifecycleEvent;
-import org.eclipse.ui.part.ViewPart;
-
-public class ViewWithSaveables extends ViewPart implements ISaveablesSource,
-		ISaveablePart {
-
-	WritableList saveables = new WritableList();
-	IObservableValue dirty = new ComputedValue() {
-		protected Object calculate() {
-			for (Iterator it = saveables.iterator(); it.hasNext();) {
-				MySaveable saveable = (MySaveable) it.next();
-				if (saveable.isDirty()) {
-					return Boolean.TRUE;
-				}
-			}
-			return Boolean.FALSE;
-		}
-	};
-	private TableViewer viewer;
-	private IObservableValue selection;
-
-	public ViewWithSaveables() {
-	}
-
-	public void createPartControl(Composite parent) {
-		viewer = new TableViewer(parent, SWT.BORDER);
-		GridDataFactory.fillDefaults().grab(true, true).span(4,1).applyTo(viewer.getControl());
-		ObservableListContentProvider observableListContentProvider = new ObservableListContentProvider();
-		viewer.setContentProvider(observableListContentProvider);
-		viewer.setLabelProvider(new ObservableMapLabelProvider(
-				new DirtyObservableMap(observableListContentProvider
-						.getKnownElements())) {
-			public String getColumnText(Object element, int columnIndex) {
-				return getText(element);
-			}
-
-			public String getText(Object element) {
-				MySaveable saveable = (MySaveable) element;
-				return (saveable.isDirty() ? "*" : "") + saveable.toString();
-			}
-		});
-		viewer.setInput(saveables);
-		{
-			Button button = new Button(parent, SWT.PUSH);
-			button.setText("Add");
-			button.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					addSaveable();
-				}
-			});
-		}
-		selection = ViewersObservables.observeSingleSelection(viewer);
-		{
-			final Button button = new Button(parent, SWT.PUSH);
-			button.setText("Remove");
-			button.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					removeSaveable();
-				}
-			});
-			new ControlUpdater(button) {
-				protected void updateControl() {
-					button.setEnabled(selection.getValue() != null);
-				}
-			};
-		}
-		{
-			final Button button = new Button(parent, SWT.CHECK);
-			button.setText("dirty");
-			button.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					MySaveable saveable = (MySaveable) selection.getValue();
-					saveable.setDirty(button.getSelection());
-				}
-			});
-			new ControlUpdater(button) {
-				protected void updateControl() {
-					MySaveable saveable = (MySaveable) selection.getValue();
-					if (saveable == null) {
-						button.setEnabled(false);
-						button.setSelection(false);
-					} else {
-						button.setEnabled(true);
-						// we know that isDirty is implemented using a
-						// WritableValue,
-						// and thus a dependency on that writable value will
-						// result from
-						// calling isDirty().
-						button.setSelection(saveable.isDirty());
-					}
-				}
-			};
-		}
-		getSite().setSelectionProvider(viewer);
-		dirty.addValueChangeListener(new IValueChangeListener() {
-			public void handleValueChange(ValueChangeEvent event) {
-				firePropertyChange(ISaveablePart.PROP_DIRTY);
-			}
-		});
-		GridLayoutFactory.fillDefaults().numColumns(4).equalWidth(false).generateLayout(parent);
-	}
-
-	void removeSaveable() {
-		Saveable[] toRemove = getActiveSaveables();
-		ISaveablesLifecycleListener lifecycleListener = (ISaveablesLifecycleListener) getSite()
-				.getService(ISaveablesLifecycleListener.class);
-		SaveablesLifecycleEvent event = new SaveablesLifecycleEvent(this,
-				SaveablesLifecycleEvent.PRE_CLOSE, toRemove, false);
-		lifecycleListener.handleLifecycleEvent(event);
-		if (!event.isVeto()) {
-			saveables.removeAll(Arrays.asList(toRemove));
-			lifecycleListener.handleLifecycleEvent(new SaveablesLifecycleEvent(
-					this, SaveablesLifecycleEvent.POST_CLOSE, toRemove, false));
-		}
-	}
-
-	void addSaveable() {
-		MySaveable saveable = new MySaveable();
-		saveables.add(saveable);
-		ISaveablesLifecycleListener lifecycleListener = (ISaveablesLifecycleListener) getSite()
-				.getService(ISaveablesLifecycleListener.class);
-		lifecycleListener.handleLifecycleEvent(new SaveablesLifecycleEvent(
-				this, SaveablesLifecycleEvent.POST_OPEN,
-				new Saveable[] { saveable }, false));
-	}
-
-	public void setFocus() {
-	}
-
-	public Saveable[] getActiveSaveables() {
-		Saveable selectedSaveable = (Saveable) selection.getValue();
-		return selectedSaveable == null ? new Saveable[0]
-				: new Saveable[] { selectedSaveable };
-	}
-
-	public Saveable[] getSaveables() {
-		return (Saveable[]) saveables.toArray(new Saveable[saveables.size()]);
-	}
-
-	public void doSave(IProgressMonitor monitor) {
-		Assert.isTrue(false,
-				"Save operations should happen through the saveables.");
-	}
-
-	public void doSaveAs() {
-	}
-
-	public boolean isDirty() {
-		return ((Boolean) dirty.getValue()).booleanValue();
-	}
-
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	public boolean isSaveOnCloseNeeded() {
-		return true;
-	}
-
-	class MySaveable extends Saveable {
-
-		private IObservableValue myDirty = new WritableValue(Boolean.FALSE,
-				Boolean.TYPE);
-
-		public void doSave(IProgressMonitor monitor) throws CoreException {
-			setDirty(false);
-		}
-
-		public boolean equals(Object object) {
-			return this == object;
-		}
-
-		public ImageDescriptor getImageDescriptor() {
-			return null;
-		}
-
-		public String getName() {
-			return toString();
-		}
-
-		public String getToolTipText() {
-			return toString();
-		}
-
-		public int hashCode() {
-			return System.identityHashCode(this);
-		}
-
-		public boolean isDirty() {
-			return ((Boolean) myDirty.getValue()).booleanValue();
-		}
-
-		IObservableValue getDirty() {
-			return myDirty;
-		}
-
-		void setDirty(boolean dirty) {
-			myDirty.setValue(Boolean.valueOf(dirty));
-		}
-
-	}
-
-	class DirtyObservableMap extends ComputedObservableMap {
-
-		Map writableValueToElement = new HashMap();
-		
-		private IValueChangeListener valueChangeListener = new IValueChangeListener() {
-			public void handleValueChange(ValueChangeEvent event) {
-					fireMapChange(Diffs.createMapDiffSingleChange(writableValueToElement.get(event
-							.getSource()), event.diff.getOldValue(), event.diff
-							.getNewValue()));
-			}
-		};
-
-		public DirtyObservableMap(IObservableSet knownElements) {
-			super(knownElements);
-			init();
-		}
-
-		protected Object doGet(Object key) {
-			MySaveable saveable = (MySaveable) key;
-			return Boolean.valueOf(saveable.isDirty());
-		}
-
-		protected Object doPut(Object key, Object value) {
-				MySaveable saveable = (MySaveable) key;
-				Boolean oldValue = Boolean.valueOf(saveable.isDirty());
-				saveable.setDirty(((Boolean) value).booleanValue());
-				keySet().add(key);
-				return oldValue;
-		}
-
-		protected void hookListener(Object key) {
-			MySaveable saveable = (MySaveable) key;
-			IObservableValue oValue = saveable.getDirty();
-			writableValueToElement.put(oValue, saveable);
-			oValue.addValueChangeListener(valueChangeListener);
-		}
-
-		protected void unhookListener(Object key) {
-			MySaveable saveable = (MySaveable) key;
-			saveable.getDirty().removeValueChangeListener(valueChangeListener);
-			writableValueToElement.remove(saveable.getDirty());
-		}
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/Bug75909Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/Bug75909Test.java
deleted file mode 100644
index be9b0a6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/Bug75909Test.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.markers;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jface.dialogs.DialogSettings;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.tests.internal.TestMemento;
-import org.eclipse.ui.views.markers.internal.MarkerType;
-import org.eclipse.ui.views.markers.internal.ProblemFilter;
-
-/**
- * Testing for https://bugs.eclipse.org/bugs/show_bug.cgi?id=75909 .
- * Only the marker IDs of the selected filters are saved for the Problems view.
- * If a new plugin is deployed with a new MarkerType, when the session 
- * restarts it looks like it was "unselected" from the filter list, and
- * so it doesn't show up.
- * 
- * These tests cover restoring state from old and new settings files.
- * 
- * @since 3.1
- *
- */
-public class Bug75909Test extends TestCase {
-
-	private static final int OLD_SETTINGS_SELECTED = 4;
-
-	private static final String REMOVED_MARKER_ID = "org.eclipse.pde.core.problem";
-
-	private static final String INCLUDED_MARKER_ID = "org.eclipse.core.resources.problemmarker";
-
-	private static final String MISSING_MARKER_ID = "org.eclipse.jdt.core.problem";
-
-	private static final String OLD_DIALOG_SETTINGS_XML = "old_dialog_settings.xml";
-
-	public static TestSuite suite() {
-		return new TestSuite(Bug75909Test.class);
-	}
-
-	/**
-	 * MarkerFilter.resetState() should make all of the available
-	 * MarkerTypes selected.  The just tests that the environment
-	 * has some datafill in it.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testBasicFilter() throws Throwable {
-		ProblemFilter filter = new ProblemFilter("Bug75909Test");
-		filter.resetState();
-
-		List allTypes = new ArrayList();
-		filter.addAllSubTypes(allTypes);
-		int num_types = allTypes.size();
-
-		// there are more than 4 marker types in the default env.
-		assertTrue("There should be more than 4 types in the system",
-				num_types > 4);
-
-		// after a reset, the number of selected types should
-		// equal the total number of types.
-		assertEquals(num_types, filter.getSelectedTypes().size());
-	}
-
-
-	/**
-	 * Settings can be restored (at least once :-) from the old settings
-	 * attribute format.  Any marker type not listed in the attribute
-	 * will appear as not selected.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testRestoreOldState() throws Throwable {
-		IDialogSettings settings = new DialogSettings("Workbench");
-		loadSettings(settings, Bug75909Test.OLD_DIALOG_SETTINGS_XML);
-
-		ProblemFilter filter = new ProblemFilter("Bug75909Test");
-		filter.restoreFilterSettings(getFilterSettings(settings));
-
-		List selected = filter.getSelectedTypes();
-		assertEquals(Bug75909Test.OLD_SETTINGS_SELECTED, selected.size());
-
-		MarkerType marker = getType(filter, Bug75909Test.INCLUDED_MARKER_ID);
-		// this was marked as selected in the old attribute
-		assertTrue(selected.contains(marker));
-
-		MarkerType removed = getType(filter, Bug75909Test.REMOVED_MARKER_ID);
-		// this was missing from the old attribute, so it should not be
-		// selected
-		assertFalse(selected.contains(removed));
-	}
-
-	/**
-	 * When restoring settings from the new attribute, a marker type
-	 * id that is not true or false has just been introduced.  Test that
-	 * the new marker type shows up as selected.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testRestoreNewStateMissingId() throws Throwable {
-		IMemento settings = createMissingMemento();
-
-		ProblemFilter filter = new ProblemFilter("Bug75909Test");
-		filter.restoreState(settings);
-
-		List included = new ArrayList();
-		filter.addAllSubTypes(included);
-		
-		List selected = filter.getSelectedTypes();
-		assertEquals(included.size() - 1, selected.size());
-
-		MarkerType marker = getType(filter, Bug75909Test.INCLUDED_MARKER_ID);
-		// was in the file as true, so it should be selected.
-		assertTrue(selected.contains(marker));
-
-		MarkerType removed = getType(filter, Bug75909Test.REMOVED_MARKER_ID);
-		// was in the file as false, so it won't be selected.
-		assertFalse(selected.contains(removed));
-
-		MarkerType missing = getType(filter, Bug75909Test.MISSING_MARKER_ID);
-		// was missing from the file, so it should be selected.
-		assertTrue(selected.contains(missing));
-	}
-	
-	/**
-	 * Create a missing memento that is missing it's name.
-	 * @return IMemento
-	 */
-	private IMemento createMissingMemento() {
-		TestMemento memento = new TestMemento("filter","Filter Test");
-		memento.putString("selectBySeverity","false");
-		memento.putString("contains","true");
-		memento.putString("enabled","true");
-		memento.putInteger("severity",0);
-		memento.putString("description","");
-		memento.putString("filterOnMarkerLimit","true");
-		memento.putString("selectionStatus" ,"org.eclipse.core.resources.problemmarker:true:org.eclipse.pde.core.problem:false:org.eclipse.jdt.core.buildpath_problem:true:org.eclipse.ant.ui.buildFileProblem:true:");
-		memento.putInteger("onResource",0);
-		return memento;
-	}
-
-	/**
-	 * Get the settings for the filter tag.
-	 * @param settings
-	 * @return IDialogSettings
-	 */
-	private IDialogSettings getFilterSettings(IDialogSettings settings) {
-		return settings.getSection("filter");
-	}
-
-	/**
-	 * MarkerFilter.saveState(IDialogSettings) should now save selected
-	 * types with <b>true</b> and unselected types are now saved to the
-	 * list with <b>false</b>.  This is an "identity transform" test.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testSaveState() throws Throwable {
-		ProblemFilter filter = new ProblemFilter("Bug75909Test");
-		filter.resetState();
-
-		List allTypes = new ArrayList();
-		filter.addAllSubTypes(allTypes);
-
-		MarkerType removed = getType(filter, Bug75909Test.REMOVED_MARKER_ID);
-		
-		filter.getSelectedTypes().remove(removed);
-		// there should be one less select type than all of the types.
-		assertEquals(allTypes.size() - 1, filter.getSelectedTypes().size());
-
-		IMemento settings = new TestMemento("Test","Bug75909Test");
-		filter.saveFilterSettings(settings);
-
-		ProblemFilter f2 = new ProblemFilter("Bug75909Test");
-		f2.restoreState(settings);
-		
-		assertEquals(filter.getSelectedTypes().size(),
-				f2.getSelectedTypes().size());
-		assertFalse(f2.getSelectedTypes().contains(removed));
-	}
-
-
-	private void loadSettings(IDialogSettings settings, String resource)
-			throws UnsupportedEncodingException, IOException {
-		InputStream io = null;
-		try {
-			io = getClass().getResourceAsStream(resource);
-			BufferedReader reader = new BufferedReader(new InputStreamReader(
-					io, "utf-8"));
-			settings.load(reader);
-		} finally {
-			if (io != null) {
-				io.close();
-			}
-		}
-	}
-
-	private MarkerType getType(ProblemFilter filter, String id) {
-		return filter.getMarkerType(id);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/DeclarativeFilterActivityTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/DeclarativeFilterActivityTest.java
deleted file mode 100644
index 59b690c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/DeclarativeFilterActivityTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.markers;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.activities.IActivity;
-import org.eclipse.ui.views.markers.internal.ProblemFilter;
-
-public class DeclarativeFilterActivityTest extends DeclarativeFilterTest {
-
-	static final String PROBLEM_FILTER_TEST_ACTIVITY = "problemFilterTestActivity";
-
-	/**
-	 * The DeclarativeProblemTest is a test of the declarative filters.
-	 * 
-	 * @param testName
-	 */
-	public DeclarativeFilterActivityTest(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Check that the activities are enabling as expected.
-	 */
-	public void testActivityEnablement() {
-		enableFilterActivity();
-		
-		checkFilteredOut(false);
-		
-		disableFilterActivity();
-		checkFilteredOut(true);
-		enableFilterActivity();
-
-	}
-
-	/**
-	 * Check that all of the filters match filteredOut.
-	 * @param filteredOut
-	 */
-	private void checkFilteredOut(boolean filteredOut) {
-		String[] allFilterNames = getAllFilterNames();
-		String failureMessage = filteredOut ? " should be filtered out" : " should not be filtered out";
-		for (int i = 0; i < allFilterNames.length; i++) {
-			ProblemFilter filter = getFilter(allFilterNames[i]);
-			if(filteredOut)
-				assertNull("Should filter out " + allFilterNames[i] ,filter);
-			else{
-			assertNotNull("No filter for " + allFilterNames[i] ,filter);
-			assertTrue(allFilterNames[i] + failureMessage, filter.isFilteredOutByActivity() == filteredOut);
-			}
-		}
-		
-	}
-
-	/**
-	 * Enable the activity for the declarative filters.
-	 */
-	private void enableFilterActivity() {
-		IActivity activity = PlatformUI.getWorkbench().getActivitySupport()
-				.getActivityManager().getActivity(PROBLEM_FILTER_TEST_ACTIVITY);
-		Set enabledActivityIds = new HashSet(PlatformUI.getWorkbench()
-				.getActivitySupport().getActivityManager()
-				.getEnabledActivityIds());
-		
-		if (!enabledActivityIds.contains(activity.getId()))
-			enabledActivityIds.add(activity.getId());
-		
-		PlatformUI.getWorkbench().getActivitySupport().setEnabledActivityIds(
-				enabledActivityIds);
-	}
-	
-	/**
-	 * Disable the activity for the declarative filters.
-	 */
-	private void disableFilterActivity() {
-		IActivity activity = PlatformUI.getWorkbench().getActivitySupport()
-				.getActivityManager().getActivity(PROBLEM_FILTER_TEST_ACTIVITY);
-		Set enabledActivityIds = new HashSet(PlatformUI.getWorkbench()
-				.getActivitySupport().getActivityManager()
-				.getEnabledActivityIds());
-		
-		if (enabledActivityIds.contains(activity.getId()))
-			enabledActivityIds.remove(activity.getId());
-		
-		PlatformUI.getWorkbench().getActivitySupport().setEnabledActivityIds(
-				enabledActivityIds);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/DeclarativeFilterDeclarationTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/DeclarativeFilterDeclarationTest.java
deleted file mode 100644
index 3a2276d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/DeclarativeFilterDeclarationTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.markers;
-import java.util.List;
-
-import org.eclipse.ui.views.markers.internal.MarkerFilter;
-import org.eclipse.ui.views.markers.internal.MarkerType;
-import org.eclipse.ui.views.markers.internal.ProblemFilter;
-
-public class DeclarativeFilterDeclarationTest extends DeclarativeFilterTest {
-
-	/**
-	 * The DeclarativeFilterActivityTest is a test that the
-	 * declarative filters are removed by activities
-	 * 
-	 * @param testName
-	 */
-	public DeclarativeFilterDeclarationTest(String testName) {
-		super(testName);
-	}
-	
-	/**
-	 * Test the filter on any error.
-	 */
-	public void testAnyErrorFilter() {
-		String filterName = PROBLEM_TEST_ON_ANY_ERROR;
-		ProblemFilter filter = getFilter(filterName);
-		assertTrue(filterName + " not found ", filter != null);
-		assertTrue(filterName + " is enabled ", !filter.isEnabled());
-		assertTrue(filterName + "not selecting by severity", filter
-				.getSelectBySeverity());
-		assertTrue(filterName + "should be on error",
-				filter.getSeverity() == ProblemFilter.SEVERITY_ERROR);
-		assertTrue(filterName + "should be on any",
-				filter.getOnResource() == MarkerFilter.ON_ANY);
-	}
-
-	/**
-	 * Test the filter on selected warning.
-	 */
-	public void testSelectedWarning() {
-		String filterName = PROBLEM_TEST_ON_SELECTED_WARNING;
-		ProblemFilter filter = getFilter(filterName);
-		assertTrue(filterName + " not found ", filter != null);
-		assertTrue(filterName + " is enabled ", !filter.isEnabled());
-		assertTrue(filterName + "not selecting by severity", filter
-				.getSelectBySeverity());
-		assertTrue(filterName + "should be on warning",
-				filter.getSeverity() == ProblemFilter.SEVERITY_WARNING);
-		assertTrue(filterName + "should be on selected only", filter
-				.getOnResource() == MarkerFilter.ON_SELECTED_ONLY);
-	}
-
-	/**
-	 * Test the filter on selected and children infos.
-	 */
-	public void testInfoAndChildren() {
-		String filterName = PROBLEM_TEST_INFO_AND_CHILDREN;
-		ProblemFilter filter = getFilter(filterName);
-		assertTrue(filterName + " not found ", filter != null);
-		assertTrue(filterName + " is enabled ", !filter.isEnabled());
-		assertTrue(filterName + "not selecting by severity", filter
-				.getSelectBySeverity());
-		assertTrue(filterName + "should be on info",
-				filter.getSeverity() == ProblemFilter.SEVERITY_INFO);
-		assertTrue(filterName + "should be on selected and children", filter
-				.getOnResource() == MarkerFilter.ON_SELECTED_AND_CHILDREN);
-	}
-
-	/**
-	 * Test the filter on same container.
-	 */
-	public void testSameContainer() {
-		String filterName = PROBLEM_TEST_SAME_CONTAINER_NO_SEVERITY;
-		ProblemFilter filter = getFilter(filterName);
-		assertTrue(filterName + " not found ", filter != null);
-		assertTrue(filterName + " is enabled ", !filter.isEnabled());
-		assertFalse(filterName + "selecting by severity", filter
-				.getSelectBySeverity());
-		assertTrue(filterName + "should be on on any in same container", filter
-				.getOnResource() == MarkerFilter.ON_ANY_IN_SAME_CONTAINER);
-	}
-
-	/**
-	 * Test the filter on description.
-	 */
-	public void testDescription() {
-		String filterName = PROBLEM_TEST_ON_METHOD;
-		ProblemFilter filter = getFilter(filterName);
-		assertTrue(filterName + " not found ", filter != null);
-		assertTrue(filterName + " is enabled ", !filter.isEnabled());
-		assertTrue(filterName + "does not have description", filter
-				.getDescription().length() > 0);
-		assertTrue(filterName + "not checking contains", filter.getContains());
-	}
-
-	/**
-	 * Test the filter not on description.
-	 */
-	public void testNotOnDescription() {
-		String filterName = PROBLEM_TEST_NOT_ON_METHOD;
-		ProblemFilter filter = getFilter(filterName);
-		assertTrue(filterName + " not found ", filter != null);
-		assertTrue(filterName + " is enabled ", !filter.isEnabled());
-		assertTrue(filterName + "does not have description", filter
-				.getDescription().length() > 0);
-		assertFalse(filterName + "checking contains", filter.getContains());
-	}
-
-	/**
-	 * Test the filter on problem types.
-	 */
-	public void testProblemTypes() {
-		String filterName = PROBLEM_TEST_ON_PROBLEM;
-		ProblemFilter filter = getFilter(filterName);
-		assertTrue(filterName + " not found ", filter != null);
-		assertTrue(filterName + " is enabled ", !filter.isEnabled());
-		List types = filter.getSelectedTypes();
-		assertTrue(
-				filterName + "should only have one type has " + types.size(),
-				types.size() == 1);
-		assertTrue(filterName + "should be enabled for category test",
-				((MarkerType) types.get(0)).getId().equals(
-						"org.eclipse.ui.tests.categoryTestMarker"));
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/DeclarativeFilterTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/DeclarativeFilterTest.java
deleted file mode 100644
index 24bcec1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/DeclarativeFilterTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.markers;
-
-import java.util.Iterator;
-
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
-import org.eclipse.ui.views.markers.internal.ProblemFilter;
-
-public abstract class DeclarativeFilterTest extends UITestCase {
-
-	public static final String PROBLEM_TEST_ON_PROBLEM = "problemTest.onProblem";
-
-	public static final String PROBLEM_TEST_NOT_ON_METHOD = "problemTest.notOnMethod";
-
-	public static final String PROBLEM_TEST_ON_METHOD = "problemTest.onMethod";
-
-	public static final String PROBLEM_TEST_SAME_CONTAINER_NO_SEVERITY = "problemTest.sameContainerNoSeverity";
-
-	public static final String PROBLEM_TEST_INFO_AND_CHILDREN = "problemTest.infoAndChildren";
-
-	public static final String PROBLEM_TEST_ON_SELECTED_WARNING = "problemTest.onSelectedWarning";
-
-	protected static final String PROBLEM_TEST_ON_ANY_ERROR = "problemTest.onAnyError";
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param testName
-	 */
-	public DeclarativeFilterTest(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Get the filter with id.
-	 * 
-	 * @param id
-	 * @return ProblemFilter
-	 */
-	protected ProblemFilter getFilter(String id) {
-		Iterator filters = MarkerSupportRegistry.getInstance()
-				.getRegisteredFilters().iterator();
-		while (filters.hasNext()) {
-			ProblemFilter filter = (ProblemFilter) filters.next();
-			if (filter.getId().equals(id))
-				return filter;
-		}
-		return null;
-
-	}
-
-	/**
-	 * Get the names of all of the filters we are testing.
-	 * @return String[]
-	 */
-	String[] getAllFilterNames() {
-		return new String[] { PROBLEM_TEST_ON_PROBLEM,
-				PROBLEM_TEST_NOT_ON_METHOD, PROBLEM_TEST_ON_METHOD,
-				PROBLEM_TEST_SAME_CONTAINER_NO_SEVERITY,
-				PROBLEM_TEST_INFO_AND_CHILDREN,
-				PROBLEM_TEST_ON_SELECTED_WARNING, PROBLEM_TEST_ON_ANY_ERROR };
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/FIXMEParameters.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/FIXMEParameters.java
deleted file mode 100644
index a15ae2a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/FIXMEParameters.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.markers;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.ui.views.markers.FiltersContributionParameters;
-import org.eclipse.ui.views.markers.MarkerSupportConstants;
-
-public class FIXMEParameters extends FiltersContributionParameters {
-	
-	private static Map fixmeMap;
-	static {
-		fixmeMap = new HashMap();
-		fixmeMap.put(MarkerSupportConstants.CONTAINS_KEY, "FIXME"); //$NON-NLS-1$
-	}
-
-	/**
-	 * The parameters for the fixme test.
-	 */
-	public FIXMEParameters() {
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.markers.FiltersContributionParameters#getParameterValues()
-	 */
-	public Map getParameterValues() {
-		return fixmeMap;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkerSupportRegistryTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkerSupportRegistryTests.java
deleted file mode 100644
index bbeb813..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkerSupportRegistryTests.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.markers;
-
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
-
-/**
- * MarkerSupportTests are tests for the markerSupport extension
- * point.
- * @since 3.2
- * 
- */
-public class MarkerSupportRegistryTests extends UITestCase {
-
-	/**
-	 * Create an instance of the receiver.
-	 * 
-	 * @param testName
-	 */
-	public MarkerSupportRegistryTests(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Test that the marker categories expected are found.
-	 *
-	 */
-	public void testMarkerCategories() {
-		doTestCategory("org.eclipse.ui.tests.categoryTestMarker");
-		doTestCategory("org.eclipse.ui.tests.testmarker");
-		doTestCategory("org.eclipse.ui.tests.testmarker2");
-	}
-
-	/**
-	 * Test that the marker type specified is in a category.
-	 * 
-	 * @param string
-	 */
-	private void doTestCategory(String string) {
-		String category = MarkerSupportRegistry.getInstance().getCategory(
-				string);
-		assertFalse("No Category for" + string, category == null);
-		assertTrue("Wrong Category for" + string, category.equals("Test Markers"));
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkerTesterTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkerTesterTest.java
deleted file mode 100644
index a14d745..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkerTesterTest.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.markers;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.internal.expressions.TestExpression;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * 
- * @since 3.5
- * @author Prakash G.R.
- * 
- */
-public class MarkerTesterTest extends UITestCase {
-
-	private static final String MARKER_NAMESPACE = "org.eclipse.ui.ide.marker";
-	private IProject project;
-
-	public MarkerTesterTest(String testName) {
-		super(testName);
-	}
-
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		project = ResourcesPlugin.getWorkspace().getRoot().getProject("tests");
-		if (!project.exists())
-			project.create(null);
-
-		if (!project.isOpen())
-			project.open(null);
-	}
-
-	protected void doTearDown() throws Exception {
-		super.doTearDown();
-		if (project.exists())
-			project.delete(true, null);
-	}
-
-	public void testSeverity() throws Exception {
-
-		IMarker errorMarker = project.createMarker(IMarker.PROBLEM);
-		Map attributes = new HashMap();
-		attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_ERROR));
-		errorMarker.setAttributes(attributes);
-
-		EvaluationContext context = new EvaluationContext(null, errorMarker);
-		TestExpression testExpression = new TestExpression(MARKER_NAMESPACE,
-				"severity", null, new Integer(IMarker.SEVERITY_ERROR));
-		EvaluationResult result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.TRUE, result);
-
-		IMarker warningMarker = project.createMarker(IMarker.PROBLEM);
-		attributes = new HashMap();
-		attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_WARNING));
-		warningMarker.setAttributes(attributes);
-
-		context = new EvaluationContext(null, warningMarker);
-		testExpression = new TestExpression(MARKER_NAMESPACE, "severity", null,
-				new Integer(IMarker.SEVERITY_WARNING));
-		result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.TRUE, result);
-
-	}
-
-	public void testType() throws Exception {
-
-		IMarker problemMarker = project.createMarker(IMarker.PROBLEM);
-
-		EvaluationContext context = new EvaluationContext(null, problemMarker);
-		TestExpression testExpression = new TestExpression(MARKER_NAMESPACE,
-				"type", null, IMarker.PROBLEM);
-		EvaluationResult result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.TRUE, result);
-
-		IMarker bookmarkMarker = project.createMarker(IMarker.BOOKMARK);
-
-		context = new EvaluationContext(null, bookmarkMarker);
-		testExpression = new TestExpression(MARKER_NAMESPACE, "type", null,
-				IMarker.BOOKMARK);
-		result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.TRUE, result);
-	}
-
-	public void testSuperType() throws Exception {
-
-		IMarker problemMarker = project.createMarker(IMarker.PROBLEM);
-
-		EvaluationContext context = new EvaluationContext(null, problemMarker);
-		TestExpression testExpression = new TestExpression(MARKER_NAMESPACE,
-				"superType", null, IMarker.MARKER);
-		EvaluationResult result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.TRUE, result);
-
-		testExpression = new TestExpression(MARKER_NAMESPACE, "superType",
-				null, IMarker.BOOKMARK);
-		result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.FALSE, result);
-	}
-
-	public void testPriority() throws Exception {
-
-		IMarker highPriority = project.createMarker(IMarker.PROBLEM);
-		Map attributes = new HashMap();
-		attributes.put(IMarker.PRIORITY, new Integer(IMarker.PRIORITY_HIGH));
-		highPriority.setAttributes(attributes);
-
-		EvaluationContext context = new EvaluationContext(null, highPriority);
-		TestExpression testExpression = new TestExpression(MARKER_NAMESPACE,
-				"priority", null, new Integer(IMarker.PRIORITY_HIGH));
-		EvaluationResult result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.TRUE, result);
-
-		IMarker lowPriority = project.createMarker(IMarker.PROBLEM);
-		attributes = new HashMap();
-		attributes.put(IMarker.PRIORITY, new Integer(IMarker.PRIORITY_LOW));
-		lowPriority.setAttributes(attributes);
-
-		context = new EvaluationContext(null, lowPriority);
-		testExpression = new TestExpression(MARKER_NAMESPACE, "priority", null,
-				new Integer(IMarker.PRIORITY_LOW));
-		result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.TRUE, result);
-	}
-
-	public void testDone() throws Exception {
-
-		IMarker done = project.createMarker(IMarker.TASK);
-		Map attributes = new HashMap();
-		attributes.put(IMarker.DONE, Boolean.TRUE);
-		done.setAttributes(attributes);
-
-		EvaluationContext context = new EvaluationContext(null, done);
-		TestExpression testExpression = new TestExpression(MARKER_NAMESPACE,
-				"done", null, Boolean.TRUE);
-		EvaluationResult result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.TRUE, result);
-
-		IMarker notDone = project.createMarker(IMarker.TASK);
-		attributes = new HashMap();
-		attributes.put(IMarker.DONE, Boolean.FALSE);
-		notDone.setAttributes(attributes);
-
-		context = new EvaluationContext(null, notDone);
-		testExpression = new TestExpression(MARKER_NAMESPACE, "done", null,
-				Boolean.FALSE);
-		result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.TRUE, result);
-
-		IMarker notSet = project.createMarker(IMarker.TASK);
-
-		context = new EvaluationContext(null, notSet);
-		testExpression = new TestExpression(MARKER_NAMESPACE, "done", null,
-				Boolean.TRUE);
-		result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.FALSE, result);
-	}
-
-	public void testMessage() throws Exception {
-
-		IMarker someTaskMarker = project.createMarker(IMarker.TASK);
-		Map attributes = new HashMap();
-		attributes.put(IMarker.MESSAGE, "Some nice message to test");
-		someTaskMarker.setAttributes(attributes);
-
-		EvaluationContext context = new EvaluationContext(null, someTaskMarker);
-		TestExpression testExpression = new TestExpression(MARKER_NAMESPACE,
-				"message", null, "Some nice message to test");
-		EvaluationResult result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.TRUE, result);
-
-		testExpression = new TestExpression(MARKER_NAMESPACE, "message", null,
-				"Some*");
-		result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.TRUE, result);
-
-		testExpression = new TestExpression(MARKER_NAMESPACE, "message", null,
-				"*test");
-		result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.TRUE, result);
-
-		testExpression = new TestExpression(MARKER_NAMESPACE, "message", null,
-				"*nice*");
-		result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.TRUE, result);
-
-		testExpression = new TestExpression(MARKER_NAMESPACE, "message", null,
-				"*noway*");
-		result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.FALSE, result);
-
-	}
-
-	public void testResourceType() throws Exception {
-
-		IMarker someTaskMarker = project.createMarker(IMarker.TASK);
-		Map attributes = new HashMap();
-		attributes.put(IMarker.MESSAGE, "Some nice message to test");
-		someTaskMarker.setAttributes(attributes);
-
-		EvaluationContext context = new EvaluationContext(null, someTaskMarker);
-		TestExpression testExpression = new TestExpression(MARKER_NAMESPACE,
-				"resourceType", null, new Integer(IResource.PROJECT));
-		EvaluationResult result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.TRUE, result);
-
-		IFolder folder = project.getFolder("forMarker");
-		folder.create(true, true, null);
-
-		IMarker someOtherMarker = folder.createMarker(IMarker.TASK);
-		attributes = new HashMap();
-		attributes.put(IMarker.MESSAGE, "Some nice message to test");
-		someOtherMarker.setAttributes(attributes);
-
-		context = new EvaluationContext(null, someOtherMarker);
-		testExpression = new TestExpression(MARKER_NAMESPACE, "resourceType",
-				null, new Integer(IResource.FOLDER));
-		result = testExpression.evaluate(context);
-		assertEquals(EvaluationResult.TRUE, result);
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkerViewTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkerViewTests.java
deleted file mode 100644
index df71bca..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkerViewTests.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.markers;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * MarkerViewTests are the tests for the marker view.
- * 
- * @since 3.4
- * 
- */
-public class MarkerViewTests extends UITestCase {
-
-	/**
-	 * Create a new instance of the receiver.
-	 * 
-	 * @param testName
-	 */
-	public MarkerViewTests(String testName) {
-		super(testName);
-	}
-
-	public void testOpenView() {
-		IWorkbenchWindow window = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		IWorkbenchPage page = window.getActivePage();
-
-		try {
-			page.showView(IPageLayout.ID_BOOKMARKS);
-			page.showView(IPageLayout.ID_PROBLEM_VIEW);
-			page.showView(IPageLayout.ID_TASK_LIST);
-		} catch (PartInitException e) {
-			assertTrue(e.getLocalizedMessage(), false);
-			return;
-		}
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkersTestMarkersView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkersTestMarkersView.java
deleted file mode 100644
index 6185e79..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkersTestMarkersView.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.markers;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.jobs.IJobChangeListener;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.ui.internal.views.markers.ExtendedMarkersView;
-import org.eclipse.ui.views.markers.MarkerSupportView;
-import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
-
-/**
- * MarkersTestMarkersView is the test suite version of the markers view.
- * 
- * @since 3.4
- * 
- */
-public class MarkersTestMarkersView extends MarkerSupportView {
-
-	private Tree tree;
-
-	/**
-	 * Create a new instance of the receiver.
-	 */
-	public MarkersTestMarkersView() {
-		super(MarkerSupportRegistry.PROBLEMS_GENERATOR);
-	}
-
-	/**
-	 * Get the current markers for the receiver.
-	 * 
-	 * @return
-	 */
-	public IMarker[] getCurrentMarkers() {
-		Method method;
-		try {
-			method = ExtendedMarkersView.class.getDeclaredMethod("getAllMarkers",
-					new Class[0]);
-			method.setAccessible(true);
-		} catch (SecurityException e) {
-			e.printStackTrace();
-			return new IMarker[0];
-		} catch (NoSuchMethodException e) {
-			e.printStackTrace();
-			return new IMarker[0];
-		}
-		try {
-			return (IMarker[]) method.invoke(this, new Object[0]);
-		} catch (IllegalArgumentException e) {
-			e.printStackTrace();
-		} catch (IllegalAccessException e) {
-			e.printStackTrace();
-		} catch (InvocationTargetException e) {
-			e.printStackTrace();
-		}
-		return new IMarker[0];
-	}
-
-	/**
-	 * Add a listener for the end of the update.
-	 * 
-	 * @param listener
-	 */
-	public void addUpdateFinishListener(IJobChangeListener listener) {
-		getUpdateJobForListener().addJobChangeListener(listener);
-
-	}
-
-	/**
-	 * Return the updateJob.
-	 * 
-	 * @return
-	 */
-	private Job getUpdateJobForListener() {
-		Field field;
-		try {
-			field = ExtendedMarkersView.class.getDeclaredField("updateJob");
-			field.setAccessible(true);
-			return (Job) field.get(this);
-		} catch (IllegalAccessException e) {
-			e.printStackTrace();
-		} catch (NoSuchFieldException e) {
-			e.printStackTrace();
-		}
-		
-		return null;
-	}
-
-	/**
-	 * Remove a listener for the end of the update.
-	 * 
-	 * @param listener
-	 */
-	public void removeUpdateFinishListener(IJobChangeListener listener) {
-		getUpdateJobForListener().addJobChangeListener(listener);
-
-	}
-
-	/**
-	 * Set the width of all of the columns.
-	 * @param width
-	 */
-	public void setColumnWidths(int width) {
-		TreeColumn[] treeColumns = tree.getColumns();
-		for (int j = 0; j < treeColumns.length; j++) {
-			treeColumns[j].setWidth(width);
-		}
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.internal.views.markers.ExtendedMarkersView#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-		tree = (Tree) parent.getChildren()[0];
-	}
-
-	/**
-	 * @param size
-	 * @return
-	 */
-	public boolean checkColumnSizes(int size) {
-		TreeColumn[] treeColumns = tree.getColumns();
-		
-		//Do not check the last column as Linux will resize it to fit the whole table
-		for (int j = 0; j < treeColumns.length - 1; j++) {
-			if(treeColumns[j].getWidth() == size)
-				continue;
-			return false;
-		}
-		return true;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkersViewColumnSizeTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkersViewColumnSizeTest.java
deleted file mode 100644
index 2b6e02a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/MarkersViewColumnSizeTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.markers;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.4
- * 
- */
-public class MarkersViewColumnSizeTest extends UITestCase {
-
-	/**
-	 * @param testName
-	 */
-	public MarkersViewColumnSizeTest() {
-		super("MarkersViewColumnSizeTest");
-	}
-
-	public void testColumnCreate() {
-		IWorkbenchWindow window = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (window == null)
-			assertTrue("Could not get a workbench window", false);
-		IWorkbenchPage page = window.getActivePage();
-		if (page == null)
-			assertTrue("Could not get a workbench page", false);
-
-		MarkersTestMarkersView problemView;
-		try {
-			problemView = (MarkersTestMarkersView) page
-					.showView("org.eclipse.ui.tests.markerTests");
-		} catch (PartInitException e) {
-			assertTrue(e.getLocalizedMessage(), false);
-			return;
-		}
-
-		problemView.setColumnWidths(100);
-
-	}
-	
-	public void testColumnRestore() {
-		IWorkbenchWindow window = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (window == null)
-			assertTrue("Could not get a workbench window", false);
-		IWorkbenchPage page = window.getActivePage();
-		if (page == null)
-			assertTrue("Could not get a workbench page", false);
-
-		MarkersTestMarkersView problemView;
-		try {
-			problemView = (MarkersTestMarkersView) page
-					.showView("org.eclipse.ui.tests.markerTests");
-		} catch (PartInitException e) {
-			assertTrue(e.getLocalizedMessage(), false);
-			return;
-		}
-
-		assertTrue("Column sizes not restored", problemView
-				.checkColumnSizes(100));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/ResourceMappingMarkersTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/ResourceMappingMarkersTest.java
deleted file mode 100644
index f2b715c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/ResourceMappingMarkersTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.markers;
-
-import org.eclipse.core.runtime.jobs.IJobChangeEvent;
-import org.eclipse.core.runtime.jobs.IJobChangeListener;
-import org.eclipse.core.runtime.jobs.JobChangeAdapter;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.navigator.AbstractNavigatorTest;
-
-public class ResourceMappingMarkersTest extends AbstractNavigatorTest {
-
-	/**
-	 * Create an instance of the receiver.
-	 * 
-	 * @param testName
-	 */
-	public ResourceMappingMarkersTest(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Set up the receiver.
-	 * 
-	 * @throws Exception
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		createTestFile();
-	}
-
-	public void testResourceMappings() {
-		IWorkbenchWindow window = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		IWorkbenchPage page = window.getActivePage();
-		ResourceMappingTestView view;
-
-		try {
-			view = (ResourceMappingTestView) page
-					.showView("org.eclipse.ui.tests.resourceMappingView");
-		} catch (PartInitException e) {
-			assertTrue(e.getLocalizedMessage(), false);
-			return;
-		}
-		final boolean[] waiting = new boolean[] { true };
-
-		final MarkersTestMarkersView problemView;
-		try {
-			problemView = (MarkersTestMarkersView) page
-					.showView("org.eclipse.ui.tests.markerTests");
-		} catch (PartInitException e) {
-			assertTrue(e.getLocalizedMessage(), false);
-			return;
-		}
-
-		IJobChangeListener doneListener = new JobChangeAdapter() {
-			public void done(IJobChangeEvent event) {
-				if (problemView.getCurrentMarkers().length > 0)
-					waiting[0] = false;
-			}
-		};
-
-		problemView.addUpdateFinishListener(doneListener);
-		view.addMarkerToFirstProject();
-		long timeOut = System.currentTimeMillis() + 2000;
-		waiting[0] = problemView.getCurrentMarkers().length == 0;
-
-		while (waiting[0] && System.currentTimeMillis() < timeOut) {
-			view.getSite().getShell().getDisplay().readAndDispatch();
-		}
-
-		assertTrue("No markers generated",
-				problemView.getCurrentMarkers().length > 0);
-		problemView.removeUpdateFinishListener(doneListener);
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/ResourceMappingTestView.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/ResourceMappingTestView.java
deleted file mode 100644
index 4cc4d9b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/ResourceMappingTestView.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.tests.TestPlugin;
-
-public class ResourceMappingTestView extends ViewPart implements IViewPart {
-
-	private TreeViewer viewer;
-
-	public ResourceMappingTestView() {
-		super();
-	}
-
-	public void createPartControl(Composite parent) {
-		viewer = new TreeViewer(parent);
-		viewer.getTree().setLayoutData(
-				new GridData(SWT.FILL, SWT.FILL, true, true));
-
-		viewer.setLabelProvider(new LabelProvider() {
-			public String getText(Object element) {
-				return ((TestResourceMapping) element).getName();
-			}
-		});
-
-		viewer.setContentProvider(getContentProvider());
-		viewer.setInput(new TestResourceMapping(TestPlugin.getWorkspace()
-				.getRoot()));
-	}
-
-	private IContentProvider getContentProvider() {
-		return new ITreeContentProvider() {
-
-			public Object[] getChildren(Object parentElement) {
-				return ((TestResourceMapping) parentElement).getChildren();
-			}
-
-			public Object getParent(Object element) {
-				return ((TestResourceMapping) element).getParent();
-			}
-
-			public boolean hasChildren(Object element) {
-				return ((TestResourceMapping) element).getChildren().length > 0;
-			}
-
-			public Object[] getElements(Object inputElement) {
-				return ((TestResourceMapping) inputElement).getChildren();
-			}
-
-			public void dispose() {
-
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-
-			}
-
-		};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		viewer.setSelection(new StructuredSelection(new TestResourceMapping(
-				TestPlugin.getWorkspace().getRoot())));
-	}
-
-	public void addMarkerToFirstProject() {
-		
-		TestResourceMapping top = ((TestResourceMapping) viewer.getInput());
-		IResource element = top.getChildren()[0].element;
-		
-		try {
-			IMarker marker = element.createMarker("org.eclipse.core.resources.problemmarker");
-			marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
-		} catch (CoreException e) {
-			return;
-		}
-
-		
-		
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/TestResolutionGenerator.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/TestResolutionGenerator.java
deleted file mode 100644
index a03b559..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/TestResolutionGenerator.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.markers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.IMarkerResolutionGenerator2;
-import org.eclipse.ui.views.markers.MarkerViewUtil;
-import org.eclipse.ui.views.markers.WorkbenchMarkerResolution;
-
-/**
- * TestResolutionGenerator is a marker resolution generator for testing
- * {@link org.eclipse.ui.views.markers.WorkbenchMarkerResolution}
- * 
- * @since 3.2
- * 
- */
-public class TestResolutionGenerator implements IMarkerResolutionGenerator2 {
-
-	private class TestMarkerResolution extends WorkbenchMarkerResolution {
-
-		public IMarker[] findOtherMarkers(IMarker[] markers) {
-			return markers;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.IMarkerResolution2#getDescription()
-		 */
-		public String getDescription() {
-			return "A test of the new style resolution";
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.IMarkerResolution2#getImage()
-		 */
-		public Image getImage() {
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.IMarkerResolution#getLabel()
-		 */
-		public String getLabel() {
-			return "3.2 Multi resolution";
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.IMarkerResolution#run(org.eclipse.core.resources.IMarker)
-		 */
-		public void run(IMarker marker) {
-			try {
-				System.out.println(marker
-						.getAttribute(MarkerViewUtil.NAME_ATTRIBUTE));
-			} catch (CoreException e) {
-				e.printStackTrace();
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.views.markers.WorkbenchMarkerResolution#run(org.eclipse.core.resources.IMarker[],
-		 *      org.eclipse.core.runtime.IProgressMonitor)
-		 */
-		public void run(IMarker[] markers, IProgressMonitor monitor) {
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-
-				try {
-					System.out.println(marker
-							.getAttribute(MarkerViewUtil.NAME_ATTRIBUTE));
-				} catch (CoreException e) {
-					e.printStackTrace();
-				}
-			}
-		}
-
-	}
-
-	private class CompatibilityTestMarkerResolution implements
-			IMarkerResolution {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.IMarkerResolution#getLabel()
-		 */
-		public String getLabel() {
-			return "3.1 Compatibility Resolution";
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.IMarkerResolution#run(org.eclipse.core.resources.IMarker)
-		 */
-		public void run(IMarker marker) {
-			try {
-				System.out.println(marker
-						.getAttribute(MarkerViewUtil.NAME_ATTRIBUTE));
-			} catch (CoreException e) {
-				e.printStackTrace();
-			}
-
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IMarkerResolutionGenerator2#hasResolutions(org.eclipse.core.resources.IMarker)
-	 */
-	public boolean hasResolutions(IMarker marker) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IMarkerResolutionGenerator#getResolutions(org.eclipse.core.resources.IMarker)
-	 */
-	public IMarkerResolution[] getResolutions(IMarker marker) {
-		IMarkerResolution[] resolutions = new IMarkerResolution[2];
-
-		resolutions[0] = new TestMarkerResolution();
-		resolutions[1] = new CompatibilityTestMarkerResolution();
-
-		return resolutions;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/TestResourceMapping.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/TestResourceMapping.java
deleted file mode 100644
index 6e1f24c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/TestResourceMapping.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.markers;
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.resources.mapping.*;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ui.tests.TestPlugin;
-
-public class TestResourceMapping extends ResourceMapping {
-
-	IResource element;
-	private TestResourceMapping parent;
-
-	public TestResourceMapping(IResource resource) {
-		element = resource;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.resources.mapping.ResourceMapping#getModelObject()
-	 */
-	public Object getModelObject() {
-		return element;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.mapping.ResourceMapping#getModelProviderId()
-	 */
-	public String getModelProviderId() {
-		return ModelProvider.RESOURCE_MODEL_PROVIDER_ID;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.resources.mapping.ResourceMapping#getProjects()
-	 */
-	public IProject[] getProjects() {
-		if (element.getType() == IResource.ROOT)
-			return ((IWorkspaceRoot) element).getProjects();
-		return new IProject[] { element.getProject() };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.resources.mapping.ResourceMapping#getTraversals(org.eclipse.core.resources.mapping.ResourceMappingContext,
-	 *      org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public ResourceTraversal[] getTraversals(ResourceMappingContext context,
-			IProgressMonitor monitor) {
-		ResourceTraversal traversal = new ResourceTraversal(
-				new IResource[] { element }, IResource.DEPTH_INFINITE,
-				IResource.NONE);
-		return new ResourceTraversal[] { traversal };
-	}
-
-	public String getName() {
-		return element.getName();
-	}
-
-	/**
-	 * Return the children of the receiver.
-	 * 
-	 * @return TestResourceMapping []
-	 */
-	public TestResourceMapping[] getChildren() {
-		if (element.getType() == IResource.FILE)
-			return new TestResourceMapping[0];
-		IResource[] children;
-		try {
-			children = ((IContainer) element).members();
-		} catch (CoreException e) {
-			TestPlugin.getDefault().getLog().log(e.getStatus());
-			return new TestResourceMapping[0];
-		}
-		TestResourceMapping[] result = new TestResourceMapping[children.length];
-
-		for (int i = 0; i < children.length; i++) {
-			result[i] = new TestResourceMapping(children[i]);
-			result[i].setParent(this);
-		}
-
-		return result;
-
-	}
-
-	public void setParent(TestResourceMapping mapping) {
-		parent = mapping;
-		
-	}
-
-	public TestResourceMapping getParent() {
-		return parent;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/old_dialog_settings.xml b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/old_dialog_settings.xml
deleted file mode 100644
index 6aa9203..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/markers/old_dialog_settings.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<section name="Workbench">
-	<section name="filter">
-		<item key="selectBySeverity" value="false"/>
-		<item key="contains" value="true"/>
-		<item key="enabled" value="true"/>
-		<item key="severity" value="0"/>
-		<item key="description" value=""/>
-		<item key="filterOnMarkerLimit" value="true"/>
-		<item key="markerLimit" value="100"/>
-		<item key="selectedType" value="org.eclipse.core.resources.problemmarker:org.eclipse.jdt.core.buildpath_problem:org.eclipse.ant.ui.buildFileProblem:org.eclipse.jdt.core.problem:"/>
-		<item key="onResource" value="0"/>
-	</section>
-</section>
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/AddMarkersAction.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/AddMarkersAction.java
deleted file mode 100644
index c468b41..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/AddMarkersAction.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.menus;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.texteditor.MarkerUtilities;
-import org.eclipse.ui.views.markers.MarkerViewUtil;
-
-/**
- * @since 3.1
- */
-public class AddMarkersAction implements IWorkbenchWindowActionDelegate {
-
-	static final String CATEGORY_TEST_MARKER = "org.eclipse.ui.tests.categoryTestMarker";
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow workbenchWindow) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-
-		Job addJob = new Job("Add Markers") {
-			protected IStatus run(
-					org.eclipse.core.runtime.IProgressMonitor monitor) {
-				try {
-					IWorkspaceRoot root = ResourcesPlugin.getWorkspace()
-							.getRoot();
-					Map attribs = new HashMap();
-					for (int i = 0; i < 1000; i++) {
-
-						if (i / 2 == 0) {
-							attribs.put(MarkerViewUtil.NAME_ATTRIBUTE,
-									"Test Name " + i);
-							attribs.put(MarkerViewUtil.PATH_ATTRIBUTE,
-									"Test Path " + i);
-						}
-
-						attribs.put(IMarker.SEVERITY, new Integer(
-								IMarker.SEVERITY_ERROR));
-						attribs.put(IMarker.MESSAGE, "this is a test " + i);
-						attribs.put(IMarker.LOCATION, "Location " + i);
-						attribs.put("testAttribute", String.valueOf(i / 2));
-						MarkerUtilities.createMarker(root, attribs,
-								CATEGORY_TEST_MARKER);
-					}
-				} catch (CoreException e) {
-					return e.getStatus();
-				}
-				return Status.OK_STATUS;
-			};
-		};
-
-		addJob.schedule();
-
-	}
-
-
-	/*
-	 * (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) {
-		// TODO Auto-generated method stub
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/BrokenWorkbenchWindowPulldownDelegate.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/BrokenWorkbenchWindowPulldownDelegate.java
deleted file mode 100644
index cdaaabe..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/BrokenWorkbenchWindowPulldownDelegate.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.menus;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowPulldownDelegate2;
-import org.eclipse.ui.tests.internal.ForcedException;
-
-/**
- * This is a broken pulldown delegate that throws exceptions if you try to get
- * the menu. The purpose of this is simply sanity. Eclipse should be able to
- * start in the face of code broken like this.
- * 
- * @since 3.0
- */
-public final class BrokenWorkbenchWindowPulldownDelegate implements
-        IWorkbenchWindowPulldownDelegate2 {
-    //whether we should throw on getMenu(Menu)
-    static boolean throwMenu = true;
-
-    //whether we should throw on getMenu(Control)
-    static boolean throwControl = true;
-
-    //keep references to the menus for disposal
-    Menu menuMenu;
-
-    Menu menuControl;
-
-    /**
-     * @see org.eclipse.ui.IWorkbenchWindowPulldownDelegate2#getMenu(org.eclipse.swt.widgets.Menu)
-     */
-    public Menu getMenu(Menu parent) {
-        if (throwMenu) {
-            throwMenu = false;
-            throw new ForcedException(
-					"The workbench should handle hostile pulldown delegates.");
-        }
-        menuMenu = new Menu(parent);
-        return menuMenu;
-    }
-
-    /**
-     * @see org.eclipse.ui.IWorkbenchWindowPulldownDelegate#getMenu(org.eclipse.swt.widgets.Control)
-     */
-    public Menu getMenu(Control parent) {
-        if (throwControl) {
-            throwControl = false;
-            throw new ForcedException(
-					"The workbench should handle hostile pulldown delegates.");
-        }
-        menuControl = new Menu(parent);
-        return menuControl;
-    }
-
-    /**
-     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-     */
-    public void dispose() {
-        if (menuControl != null)
-            menuControl.dispose();
-
-        if (menuMenu != null)
-            menuMenu.dispose();
-    }
-
-    /**
-     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-     */
-    public void init(IWorkbenchWindow window) {
-        // Do nothing.
-    }
-
-    /**
-     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-     */
-    public void run(IAction action) {
-        // Do nothing.
-    }
-
-    /**
-     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
-     *      org.eclipse.jface.viewers.ISelection)
-     */
-    public void selectionChanged(IAction action, ISelection selection) {
-        // Do nothing.
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/Bug231304Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/Bug231304Test.java
deleted file mode 100644
index 4cb9b18..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/Bug231304Test.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.menus;
-
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.menus.IMenuService;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * 
- * @since 3.5
- * @author Prakash G.R.
- * 
- */
-public class Bug231304Test extends UITestCase {
-
-	public Bug231304Test(String testName) {
-		super(testName);
-	}
-
-	public void testToolTip() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		IMenuService menus = (IMenuService) window
-				.getService(IMenuService.class);
-		ToolBarManager manager = new ToolBarManager();
-		try {
-			// populate contribution
-			menus.populateContributionManager(manager,
-					"toolbar:org.eclipse.ui.tests.tooltipTest");
-			IContributionItem[] items = manager.getItems();
-			assertEquals(1, items.length);
-			ToolBar toolBar = manager.createControl(window.getShell());
-			manager.update(true);
-
-			// now get the tool item and verify the tool tip
-			ToolItem[] toolItems = toolBar.getItems();
-			assertEquals(1, toolItems.length);
-			String keys = KeySequence.getInstance("M2+M3+1").format();
-			assertEquals("Testing Tooltip (" + keys + ")", toolItems[0]
-					.getToolTipText());
-
-		} finally {
-			menus.releaseContributions(manager);
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ChangeEnablementHandler.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ChangeEnablementHandler.java
deleted file mode 100644
index 8e05e12..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ChangeEnablementHandler.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.menus;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.HandlerEvent;
-import org.eclipse.core.commands.contexts.ContextManagerEvent;
-import org.eclipse.core.commands.contexts.IContextManagerListener;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.handlers.HandlerUtil;
-import org.eclipse.ui.services.IServiceLocator;
-
-/**
- * @since 3.3
- * 
- */
-public class ChangeEnablementHandler extends AbstractHandler {
-	private static final String CONTEXT_ID = "org.eclipse.ui.menus.contexts.test2";
-
-	private IContextManagerListener fContextManagerListener;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		IWorkbenchWindow window = HandlerUtil
-				.getActiveWorkbenchWindowChecked(event);
-		init(PlatformUI.getWorkbench());
-
-		MessageDialog.openInformation(window.getShell(), "Hello",
-				"Hello context change command!");
-		return null;
-	}
-
-	private void init(IServiceLocator serviceLocator) {
-		if (fContextManagerListener == null) {
-			IContextService service = (IContextService) serviceLocator
-					.getService(IContextService.class);
-			service.addContextManagerListener(getContextListener());
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	private IContextManagerListener getContextListener() {
-		if (fContextManagerListener == null) {
-			fContextManagerListener = new IContextManagerListener() {
-				public void contextManagerChanged(
-						ContextManagerEvent contextManagerEvent) {
-					if (contextManagerEvent.isActiveContextsChanged()) {
-						setEnabled(contextManagerEvent.getContextManager()
-								.getActiveContextIds().contains(CONTEXT_ID));
-					}
-				}
-			};
-		}
-		return fContextManagerListener;
-	}
-
-	boolean fEnabled = true;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
-	 */
-	public boolean isEnabled() {
-		return fEnabled;
-	}
-
-	private void setEnabled(boolean enabled) {
-		if (fEnabled != enabled) {
-			fEnabled = enabled;
-			fireHandlerChanged(new HandlerEvent(this, true, false));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.AbstractHandler#dispose()
-	 */
-	public void dispose() {
-		if (fContextManagerListener != null) {
-			IContextService service = (IContextService) PlatformUI
-					.getWorkbench().getService(IContextService.class);
-			service.removeContextManagerListener(fContextManagerListener);
-			fContextManagerListener = null;
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ContextIdValues.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ContextIdValues.java
deleted file mode 100644
index d53ac60..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ContextIdValues.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.menus;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.commands.IParameterValues;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.commands.contexts.Context;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.contexts.IContextService;
-
-public class ContextIdValues implements IParameterValues {
-
-	public Map getParameterValues() {
-		Map values = new HashMap();
-
-		IContextService contextService = (IContextService) PlatformUI
-				.getWorkbench().getService(IContextService.class);
-		Context[] definedContexts = contextService.getDefinedContexts();
-		try {
-			for (int i = 0; i < definedContexts.length; i++) {
-				values.put(definedContexts[i].getName(), definedContexts[i]
-						.getId());
-			}
-		} catch (NotDefinedException e) {
-			// This shouldn't happen since we asked for defined contexts,
-			// but you never know.
-			e.printStackTrace();
-		}
-		return values;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/DeclaredProgrammaticFactory.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/DeclaredProgrammaticFactory.java
deleted file mode 100644
index 6ac07fb..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/DeclaredProgrammaticFactory.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.eclipse.ui.tests.menus;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.ui.menus.ExtensionContributionFactory;
-import org.eclipse.ui.menus.IContributionRoot;
-import org.eclipse.ui.services.IServiceLocator;
-
-public class DeclaredProgrammaticFactory extends ExtensionContributionFactory {
-	
-	public DeclaredProgrammaticFactory() {
-		super();
-	}
-	
-	static class MyItem extends ActionContributionItem {
-		/**
-		 * 
-		 */
-		public MyItem() {
-			super(new Action("MyItem") {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jface.action.Action#getId()
-				 */
-				public String getId() {
-					return "myitem";
-				}
-			});
-
-		}
-	}
-
-	public void createContributionItems(IServiceLocator serviceLocator,
-			IContributionRoot additions) {
-		additions.addContributionItem(new MyItem(), null);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/DynamicContributionItemPopup.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/DynamicContributionItemPopup.java
deleted file mode 100644
index 697e730..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/DynamicContributionItemPopup.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.eclipse.ui.tests.menus;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.ui.actions.CompoundContributionItem;
-
-public class DynamicContributionItemPopup extends CompoundContributionItem {
-
-	public DynamicContributionItemPopup() {
-	}
-	
-	public DynamicContributionItemPopup(String id) {
-		super(id);
-	}
-	
-	private int count = 1;
-	
-	protected IContributionItem[] getContributionItems() {
-		// set the labels here, which will be verified in the test case
-		ContributionItem contributionItem1 = new ActionContributionItem(new DoNothingAction("something " + (count++)));
-		ContributionItem contributionItem2 = new ActionContributionItem(new DoNothingAction("something " + (count++)));
-		ContributionItem contributionItem3 = new ActionContributionItem(new DoNothingAction("something " + (count++)));
-		return new IContributionItem[] {contributionItem1, contributionItem2, contributionItem3};
-	}
-	
-	class DoNothingAction extends Action{
-		
-		public DoNothingAction(String text){
-			setText(text);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/DynamicMenuTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/DynamicMenuTest.java
deleted file mode 100644
index ced83fa..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/DynamicMenuTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.menus;
-
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.menus.IMenuService;
-
-/**
- * 
- * @since 3.5
- * @author Prakash G.R.
- * 
- */
-public class DynamicMenuTest extends MenuTestCase {
-
-	public DynamicMenuTest(String testName) {
-		super(testName);
-	}
-
-	public void testDynamicMenu() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		IMenuService menus = (IMenuService) window
-				.getService(IMenuService.class);
-		MenuManager manager = new MenuManager();
-		Menu contextMenu = null;
-		try {
-			menus.populateContributionManager(manager,
-					"popup:org.eclipse.ui.tests.dynamicMenuContribution");
-			IContributionItem[] contributionItems = manager.getItems();
-			assertEquals(1, contributionItems.length);
-
-			contextMenu = manager.createContextMenu(window.getShell());
-			contextMenu.notifyListeners(SWT.Show, null);
-			processEvents();
-
-			int itemCount = contextMenu.getItemCount();
-			assertEquals(3, itemCount); // we created 3 items in the code
-
-			MenuItem[] menuItems = contextMenu.getItems();
-			// check the labels
-			assertEquals("something 1", menuItems[0].getText());
-			assertEquals("something 2", menuItems[1].getText());
-			assertEquals("something 3", menuItems[2].getText());
-
-			contextMenu.notifyListeners(SWT.Hide, null);
-			processEvents();
-
-		} finally {
-			menus.releaseContributions(manager);
-			if (contextMenu != null) {
-				contextMenu.dispose();
-			}
-		}
-
-	}
-
-	public void testDynamicMenuMultiOpen() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		IMenuService menus = (IMenuService) window
-				.getService(IMenuService.class);
-		MenuManager manager = new MenuManager();
-		Menu contextMenu = null;
-		try {
-			menus.populateContributionManager(manager,
-					"popup:org.eclipse.ui.tests.dynamicMenuContribution");
-			IContributionItem[] contributionItems = manager.getItems();
-			assertEquals(1, contributionItems.length);
-	
-			contextMenu = manager.createContextMenu(window.getShell());
-			contextMenu.notifyListeners(SWT.Show, null);
-			processEvents();
-	
-			int itemCount = contextMenu.getItemCount();
-			assertEquals(3, itemCount); // we created 3 items in the code
-	
-			MenuItem[] menuItems = contextMenu.getItems();
-			// check the labels
-			assertEquals("something 1", menuItems[0].getText());
-			assertEquals("something 2", menuItems[1].getText());
-			assertEquals("something 3", menuItems[2].getText());
-	
-			contextMenu.notifyListeners(SWT.Hide, null);
-			processEvents();
-			contextMenu.notifyListeners(SWT.Show, null);
-			processEvents();
-			menuItems = contextMenu.getItems();
-			assertEquals(3, menuItems.length);
-			
-			assertEquals("something 4", menuItems[0].getText());
-			assertEquals("something 5", menuItems[1].getText());
-			assertEquals("something 6", menuItems[2].getText());
-	
-		} finally {
-			menus.releaseContributions(manager);
-			if (contextMenu != null) {
-				contextMenu.dispose();
-			}
-		}
-	
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/HelloDHandler.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/HelloDHandler.java
deleted file mode 100644
index b65e12a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/HelloDHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.menus;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-
-/**
- * @since 3.3
- * 
- */
-public class HelloDHandler extends AbstractHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		throw new ExecutionException("This should never be called");
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.AbstractHandler#isEnabled()
-	 */
-	public boolean isEnabled() {
-		return false;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/HelloEHandler.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/HelloEHandler.java
deleted file mode 100644
index 3784678..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/HelloEHandler.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.menus;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-/**
- * @since 3.3
- * 
- */
-public class HelloEHandler extends AbstractHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		IWorkbenchWindow window = HandlerUtil
-				.getActiveWorkbenchWindowChecked(event);
-
-		MessageDialog.openInformation(window.getShell(), "Hello",
-				"Hello enabled command!");
-		return null;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/HelloUpdateHandler.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/HelloUpdateHandler.java
deleted file mode 100644
index 7663a18..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/HelloUpdateHandler.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.menus;
-
-import java.util.Map;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.commands.IElementUpdater;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.handlers.HandlerUtil;
-import org.eclipse.ui.menus.UIElement;
-
-/**
- * @since 3.3
- * 
- */
-public class HelloUpdateHandler extends AbstractHandler implements
-		IElementUpdater {
-
-	private String myLabelState = null;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		IWorkbenchWindow window = HandlerUtil
-				.getActiveWorkbenchWindowChecked(event);
-
-		MessageDialog.openInformation(window.getShell(), "Hello",
-				"Hello label update command!");
-		myLabelState = "My New Item";
-		ICommandService cs = (ICommandService) window
-				.getService(ICommandService.class);
-		cs.refreshElements(event.getCommand().getId(), null);
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.commands.ICallbackUpdater#updateCallback(org.eclipse.core.runtime.IAdaptable,
-	 *      java.util.Map)
-	 */
-	public void updateElement(UIElement element, Map parameters) {
-		if (myLabelState == null) {
-			return;
-		}
-		element.setText(myLabelState);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuBaseTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuBaseTests.java
deleted file mode 100644
index 27bad84..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuBaseTests.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.menus;
-
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.swt.widgets.Decorations;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.tests.menus.DeclaredProgrammaticFactory.MyItem;
-
-/**
- * Performs a number of basic tests for the org.eclipse.ui.menus
- * extension point:
- * <ul>
- * <li>MenuManagers can populate from declarative extensions</li>
- * <li>'before' and 'after' insertion tags are correctly handled</li>
- * <li>The Menu produced matches the expected structure based on the
- * contributions</li>
- * <li>The MenuManager's update mechanism works</li>
- * </ul>
- * 
- * @since 3.3
- * 
- */
-public class MenuBaseTests extends MenuTestCase {
-	String[] expectedIds = {
-			"MenuTest.BasicCmdItem",
-			"MenuTest.BasicMenu",
-			"MenuTest.BeforeSeparator",
-			"MenuTest.Separator",
-			"MenuTest.AfterSeparator",
-			"MenuTest.ParameterItem",
-			null, // "MenuTest.DynamicItem",
-			"MenuTest.DynamicMenu",
-			"MenuTest.ItemX1",
-			MenuPopulationTest.ID_DEFAULT,
-			MenuPopulationTest.ID_ALL,
-			MenuPopulationTest.ID_TOOLBAR,
-			"myitem"
-		};
-		Class[] expectedClasses = {
-			org.eclipse.ui.menus.CommandContributionItem.class,
-			org.eclipse.jface.action.MenuManager.class,
-			org.eclipse.ui.menus.CommandContributionItem.class,
-			org.eclipse.jface.action.Separator.class,
-			org.eclipse.ui.menus.CommandContributionItem.class,
-			org.eclipse.ui.menus.CommandContributionItem.class,
-			org.eclipse.ui.internal.menus.DynamicMenuContributionItem.class,
-			org.eclipse.jface.action.MenuManager.class,
-			org.eclipse.ui.menus.CommandContributionItem.class,
-			org.eclipse.ui.menus.CommandContributionItem.class,
-			org.eclipse.ui.menus.CommandContributionItem.class,
-			org.eclipse.ui.menus.CommandContributionItem.class,
-			MyItem.class
-		};
-		String[] expectedMenuItemLabels = {
-			"&Basic Cmd",
-			"Basic Menu",
-			"Inserted &Before",
-			"",
-			"Inserted &After",
-			"Dynamic Item 1",
-			"Dynamic Item 2",
-			"Dynamic Menu",
-			"Icons Default",
-			"Icons All",
-			"Icons Toolbar Only",
-			"MyItem"
-		};
-
-	/**
-	 * @param testName
-	 */
-	public MenuBaseTests(String testName) {
-		super(testName);
-	}
-	
-	public void testBasicPopulation() throws Exception {
-		MenuManager manager = new MenuManager(null, TEST_CONTRIBUTIONS_CACHE_ID);
-		menuService.populateContributionManager(manager, "menu:"
-				+ TEST_CONTRIBUTIONS_CACHE_ID);
-		IContributionItem[] items = manager.getItems();
-		
-		// Correct number of items?
-		assertEquals("Bad count", expectedIds.length, items.length);
-
-		int diffIndex = checkContribIds(items, expectedIds);
-		assertTrue("Id mismatch at index " + diffIndex , diffIndex == ALL_OK);
-
-		diffIndex = checkContribClasses(items, expectedClasses);
-		assertTrue("Class mismatch at index " + diffIndex , diffIndex == ALL_OK);
-
-		menuService.releaseContributions(manager);
-		manager.dispose();
-	}
-
-	public void testBasicMenuPopulation() throws Exception {
-		MenuManager manager = new MenuManager("Test Menu", TEST_CONTRIBUTIONS_CACHE_ID);
-		menuService.populateContributionManager(manager, "menu:"
-				+ TEST_CONTRIBUTIONS_CACHE_ID);
-		
-		Shell shell = window.getShell();
-
-		// Test the initial menu creation
-		manager.createMenuBar((Decorations)shell);
-		MenuItem[] menuItems = manager.getMenu().getItems();
-		
-		// NOTE: Uncomment to print the info needed to update the 'expected'
-		// arrays
-//		printIds(items);
-//		printClasses(items);
-//		printMenuItemLabels(menuItems);
-		
-		// Correct number of items?
-		assertEquals("createMenuBar: Bad count", expectedMenuItemLabels.length, menuItems.length);
-
-		int diffIndex = checkMenuItemLabels(menuItems, expectedMenuItemLabels);
-		assertTrue("createMenuBar: Index mismatch at index " + diffIndex , diffIndex == ALL_OK);
-
-		// Test the update mechanism
-		
-		// KLUDGE!! Test commented out until bug 170353 is fixed...
-//		manager.update(true);
-//		menuItems = manager.getMenu().getItems();
-//		
-//		// Correct number of items?
-//		assertTrue("manager.update(true): Bad count", menuItems.length == expectedMenuItemLabels.length);
-//
-//		diffIndex = checkMenuItemLabels(menuItems, expectedMenuItemLabels);
-//		assertTrue("manager.update(true): Index mismatch at index " + diffIndex , diffIndex == ALL_OK);
-		
-		menuService.releaseContributions(manager);
-		manager.dispose();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuBuilder.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuBuilder.java
deleted file mode 100644
index 90f3480..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuBuilder.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.menus;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.menus.AbstractContributionFactory;
-import org.eclipse.ui.menus.CommandContributionItem;
-import org.eclipse.ui.menus.IContributionRoot;
-import org.eclipse.ui.menus.IMenuService;
-import org.eclipse.ui.menus.WorkbenchWindowControlContribution;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.services.IServiceLocator;
-import org.eclipse.ui.tests.TestPlugin;
-import org.eclipse.ui.tests.commands.ActiveActionSetExpression;
-
-/**
- * @since 3.3
- * 
- */
-public class MenuBuilder {
-	private static AbstractContributionFactory viewMenuAddition = null;
-
-	private static AbstractContributionFactory viewToolbarAddition = null;
-
-	public static void addMenuContribution() {
-		if (!PlatformUI.isWorkbenchRunning()) {
-			return;
-		}
-		IMenuService menuService = (IMenuService) PlatformUI.getWorkbench()
-				.getService(IMenuService.class);
-		if (menuService==null) {
-			return;
-		}
-		viewMenuAddition = new AbstractContributionFactory(
-				"menu:org.eclipse.ui.tests.api.MenuTestHarness?after=additions", TestPlugin.PLUGIN_ID) {
-			public void createContributionItems(IServiceLocator serviceLocator,
-					IContributionRoot additions) {
-				CommandContributionItem item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.ui.tests.menus.itemX20",
-						"org.eclipse.ui.tests.menus.enabledWorld", null, null,
-						null, null, "Item X20", null, null,
-						CommandContributionItem.STYLE_PUSH);
-				additions.addContributionItem(item, null);
-
-				MenuManager submenu = new MenuManager("Menu X21",
-						"org.eclipse.ui.tests.menus.menuX21");
-				item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.ui.tests.menus.itemX22",
-						"org.eclipse.ui.tests.menus.updateWorld", null, null,
-						null, null, "Item X22", null, null,
-						CommandContributionItem.STYLE_PUSH);
-				submenu.add(item);
-				item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.ui.tests.menus.itemX23",
-						"org.eclipse.ui.tests.menus.enabledWorld", null, null,
-						null, null, "Item X23", null, null,
-						CommandContributionItem.STYLE_PUSH);
-				submenu.add(item);
-
-				additions.addContributionItem(submenu, null);
-
-				item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.ui.tests.menus.itemX24",
-						"org.eclipse.ui.tests.menus.enabledWorld", null, null,
-						null, null, "Item X24", null, null,
-						CommandContributionItem.STYLE_PUSH);
-				additions.addContributionItem(item, null);
-			}
-		};
-		menuService.addContributionFactory(viewMenuAddition);
-
-		viewToolbarAddition = new AbstractContributionFactory(
-				"toolbar:org.eclipse.ui.tests.api.MenuTestHarness", TestPlugin.PLUGIN_ID) {
-			public void createContributionItems(IServiceLocator serviceLocator,
-					IContributionRoot additions) {
-				CommandContributionItem item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.ui.tests.menus.itemX25",
-						"org.eclipse.ui.tests.menus.updateWorld", null, null,
-						null, null, "Item X25", null, null,
-						CommandContributionItem.STYLE_PUSH);
-				additions.addContributionItem(item, null);
-				WorkbenchWindowControlContribution widget = new WorkbenchWindowControlContribution(
-						"org.eclipse.ui.tests.menus.itemX26") {
-					protected Control createControl(Composite parent) {
-						Text textCtrl = new Text(parent, SWT.BORDER);
-						textCtrl.setText("ABCDEFGHI");
-						return textCtrl;
-					}
-				};
-				additions.addContributionItem(widget, null);
-			}
-		};
-		menuService.addContributionFactory(viewToolbarAddition);
-	}
-
-	public static void removeMenuContribution() {
-		if (!PlatformUI.isWorkbenchRunning()) {
-			return;
-		}
-		IMenuService menuService = (IMenuService) PlatformUI.getWorkbench()
-				.getService(IMenuService.class);
-		if (menuService==null) {
-			return;
-		}
-		menuService.removeContributionFactory(viewMenuAddition);
-		viewMenuAddition = null;
-		menuService.removeContributionFactory(viewToolbarAddition);
-		viewMenuAddition = null;
-	}
-
-	public static void addSearchMenu() {
-		IMenuService menuService = (IMenuService) PlatformUI.getWorkbench()
-				.getService(IMenuService.class);
-
-		AbstractContributionFactory searchContribution = new AbstractContributionFactory(
-				"menu:org.eclipse.ui.main.menu?after=navigate", TestPlugin.PLUGIN_ID) {
-			public void createContributionItems(IServiceLocator menuService,
-					IContributionRoot additions) {
-				MenuManager search = new MenuManager("Se&arch",
-						"org.eclipse.search.menu");
-
-				search.add(new GroupMarker("internalDialogGroup"));
-				search.add(new GroupMarker("dialogGroup"));
-				search.add(new Separator("fileSearchContextMenuActionsGroup"));
-				search.add(new Separator("contextMenuActionsGroup"));
-				search.add(new Separator("occurencesActionsGroup"));
-				search.add(new Separator("extraSearchGroup"));
-
-				additions.addContributionItem(search, null);
-			}
-		};
-
-		menuService.addContributionFactory(searchContribution);
-	}
-
-	public static void addToSearchMenu() {
-		final IMenuService menuService = (IMenuService) PlatformUI
-				.getWorkbench().getService(IMenuService.class);
-		final ActiveActionSetExpression activeSearchActionSet = new ActiveActionSetExpression(
-				"org.eclipse.jdt.ui.SearchActionSet");
-
-		final ImageDescriptor searchIcon = AbstractUIPlugin
-				.imageDescriptorFromPlugin("org.eclise.ui.tests",
-						"icons/full/obj16/jsearch_obj.gif");
-		AbstractContributionFactory factory = new AbstractContributionFactory(
-				"menu:org.eclipse.search.menu?after=dialogGroup", TestPlugin.PLUGIN_ID) {
-			public void createContributionItems(IServiceLocator serviceLocator,
-					IContributionRoot additions) {
-				CommandContributionItem item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.jdt.internal.ui.search.openJavaSearchPage",
-						"org.eclipse.jdt.internal.ui.search.openJavaSearchPage",
-						null, searchIcon, null, null, null, null, null,
-						CommandContributionItem.STYLE_PUSH);
-				additions.addContributionItem(item, activeSearchActionSet);
-			}
-		};
-		menuService.addContributionFactory(factory);
-
-		factory = new AbstractContributionFactory(
-				"menu:org.eclipse.search.menu?after=contextMenuActionsGroup", TestPlugin.PLUGIN_ID) {
-			public void createContributionItems(IServiceLocator serviceLocator
-					,
-					IContributionRoot additions) {
-				MenuManager readMenu = new MenuManager("&Read Access",
-						"readAccessSubMenu");
-				additions.addContributionItem(readMenu, activeSearchActionSet);
-
-				readMenu.add(new GroupMarker("group1"));
-
-				CommandContributionItem item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.jdt.ui.edit.text.java.search.read.access.in.workspace",
-						"org.eclipse.jdt.ui.edit.text.java.search.read.access.in.workspace",
-						null, null, null, null, null, "W", null,
-						CommandContributionItem.STYLE_PUSH);
-				readMenu.add(item);
-				item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.jdt.ui.edit.text.java.search.read.access.in.project",
-						"org.eclipse.jdt.ui.edit.text.java.search.read.access.in.project",
-						null, null, null, null, null, "P", null,
-						CommandContributionItem.STYLE_PUSH);
-				readMenu.add(item);
-				item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.jdt.ui.edit.text.java.search.read.access.in.hierarchy",
-						"org.eclipse.jdt.ui.edit.text.java.search.read.access.in.hierarchy",
-						null, null, null, null, null, "H", null,
-						CommandContributionItem.STYLE_PUSH);
-				readMenu.add(item);
-				item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.jdt.ui.edit.text.java.search.read.access.in.working.set",
-						"org.eclipse.jdt.ui.edit.text.java.search.read.access.in.working.set",
-						null, null, null, null, null, "S", null,
-						CommandContributionItem.STYLE_PUSH);
-				readMenu.add(item);
-
-				MenuManager writeMenu = new MenuManager("&Write Access",
-						"writeAccessSubMenu");
-				additions.addContributionItem(writeMenu, activeSearchActionSet);
-
-				writeMenu.add(new GroupMarker("group1"));
-
-				item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.jdt.ui.edit.text.java.search.write.access.in.workspace",
-						"org.eclipse.jdt.ui.edit.text.java.search.write.access.in.workspace",
-						null, null, null, null, null, "W", null,
-						CommandContributionItem.STYLE_PUSH);
-				writeMenu.add(item);
-				item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.jdt.ui.edit.text.java.search.write.access.in.project",
-						"org.eclipse.jdt.ui.edit.text.java.search.write.access.in.project",
-						null, null, null, null, null, "P", null,
-						CommandContributionItem.STYLE_PUSH);
-				writeMenu.add(item);
-				item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.jdt.ui.edit.text.java.search.write.access.in.hierarchy",
-						"org.eclipse.jdt.ui.edit.text.java.search.write.access.in.hierarchy",
-						null, null, null, null, null, "H", null,
-						CommandContributionItem.STYLE_PUSH);
-				writeMenu.add(item);
-				item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.jdt.ui.edit.text.java.search.write.access.in.working.set",
-						"org.eclipse.jdt.ui.edit.text.java.search.write.access.in.working.set",
-						null, null, null, null, null, "S", null,
-						CommandContributionItem.STYLE_PUSH);
-				writeMenu.add(item);
-			}
-		};
-		menuService.addContributionFactory(factory);
-	}
-
-	private static class ObjectClassExpression extends Expression {
-		public ObjectClassExpression(String c) {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.expressions.Expression#evaluate(org.eclipse.core.expressions.IEvaluationContext)
-		 */
-		public EvaluationResult evaluate(IEvaluationContext context)
-				throws CoreException {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-	}
-
-	public static void addFileContribution() {
-		final IMenuService menuService = (IMenuService) PlatformUI
-				.getWorkbench().getService(IMenuService.class);
-		final ObjectClassExpression ifileExpression = new ObjectClassExpression(
-				"org.eclipse.core.resources.IFile");
-
-		final ImageDescriptor postIcon = AbstractUIPlugin
-				.imageDescriptorFromPlugin("org.eclise.ui.tests",
-						"icons/full/elcl16/post_wiki.gif");
-		final ImageDescriptor loadIcon = AbstractUIPlugin
-				.imageDescriptorFromPlugin("org.eclise.ui.tests",
-						"icons/full/elcl16/load_wiki.gif");
-		AbstractContributionFactory factory = new AbstractContributionFactory(
-				"popup:org.eclipse.ui.menus.popup.any?after=additions", TestPlugin.PLUGIN_ID) {
-			public void createContributionItems(IServiceLocator serviceLocator,
-					IContributionRoot additions) {
-				CommandContributionItem item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.ui.examples.wiki.post",
-						"org.eclipse.ui.examples.wiki.post", null, postIcon,
-						null, null, null, "P", null,
-						CommandContributionItem.STYLE_PUSH);
-				additions.addContributionItem(item, ifileExpression);
-
-				item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.ui.examples.wiki.load",
-						"org.eclipse.ui.examples.wiki.load", null, loadIcon,
-						null, null, null, "L", null,
-						CommandContributionItem.STYLE_PUSH);
-				additions.addContributionItem(item, ifileExpression);
-			}
-		};
-		menuService.addContributionFactory(factory);
-	}
-
-	public static void addTextMenuContribition() {
-		final IMenuService menuService = (IMenuService) PlatformUI
-				.getWorkbench().getService(IMenuService.class);
-
-		final ImageDescriptor scrambleIcon = AbstractUIPlugin
-				.imageDescriptorFromPlugin("org.eclise.ui.tests",
-						"icons/full/eobj16/scramble.gif");
-		AbstractContributionFactory factory = new AbstractContributionFactory(
-				"popup:#TextEditorContext?after=additions", TestPlugin.PLUGIN_ID) {
-			public void createContributionItems(IServiceLocator serviceLocator,
-					IContributionRoot additions) {
-				CommandContributionItem item = new CommandContributionItem(serviceLocator,
-						"org.eclipse.ui.examples.menus.scramble.text",
-						"org.eclipse.ui.examples.menus.scramble.text", null,
-						scrambleIcon, null, null, null, "c", null,
-						CommandContributionItem.STYLE_PUSH);
-				additions.addContributionItem(item, null);
-			}
-		};
-		menuService.addContributionFactory(factory);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuPopulationTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuPopulationTest.java
deleted file mode 100644
index b4491f0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuPopulationTest.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.menus;
-
-import java.lang.reflect.Field;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.menus.AbstractContributionFactory;
-import org.eclipse.ui.menus.CommandContributionItem;
-import org.eclipse.ui.menus.IContributionRoot;
-import org.eclipse.ui.menus.IMenuService;
-import org.eclipse.ui.services.IServiceLocator;
-import org.eclipse.ui.tests.api.workbenchpart.MenuContributionHarness;
-
-/**
- * @since 3.3
- * 
- */
-public class MenuPopulationTest extends MenuTestCase {
-	private static final String ICONS_ANYTHING_GIF = "/anything.gif)";
-	private static final String ICONS_BINARY_GIF = "/binary_co.gif)";
-	private static final String ICONS_MOCK_GIF = "/mockeditorpart1.gif)";
-	private static final String ICONS_VIEW_GIF = "/view.gif)";
-
-	private static final String FIELD_ICON = "icon";
-	public static final String ID_DEFAULT = "org.eclipse.ui.tests.menus.iconsDefault";
-	public static final String ID_ALL = "org.eclipse.ui.tests.menus.iconsAll";
-	public static final String ID_TOOLBAR = "org.eclipse.ui.tests.menus.iconsToolbarOnly";
-
-	/**
-	 * @param testName
-	 */
-	public MenuPopulationTest(String testName) {
-		super(testName);
-	}
-
-	public void testViewPopulation() throws Exception {
-		MenuManager manager = new MenuManager(null, TEST_CONTRIBUTIONS_CACHE_ID);
-		menuService.populateContributionManager(manager, "menu:"
-				+ TEST_CONTRIBUTIONS_CACHE_ID);
-		IContributionItem[] items = manager.getItems();
-		IContributionItem itemX1 = null;
-		for (int i = 0; i < items.length; i++) {
-			IContributionItem item = items[i];
-			if ("MenuTest.ItemX1".equals(item.getId())) {
-				itemX1 = item;
-			}
-		}
-
-		assertFalse(itemX1.isVisible());
-
-		activeContext = contextService
-				.activateContext(MenuContributionHarness.CONTEXT_TEST1_ID);
-
-		assertTrue(itemX1.isVisible());
-
-		contextService.deactivateContext(activeContext);
-
-		assertFalse(itemX1.isVisible());
-
-		activeContext = contextService
-				.activateContext(MenuContributionHarness.CONTEXT_TEST1_ID);
-
-		assertTrue(itemX1.isVisible());
-
-		menuService.releaseContributions(manager);
-		manager.dispose();
-	}
-
-	public void testMenuIcons() throws Exception {
-		Field iconField = CommandContributionItem.class
-				.getDeclaredField(FIELD_ICON);
-		iconField.setAccessible(true);
-
-		MenuManager manager = new MenuManager(null, TEST_CONTRIBUTIONS_CACHE_ID);
-		menuService.populateContributionManager(manager, "menu:"
-				+ TEST_CONTRIBUTIONS_CACHE_ID);
-
-		IContributionItem ici = manager.find(ID_DEFAULT);
-		assertTrue(ici instanceof CommandContributionItem);
-		CommandContributionItem cmd = (CommandContributionItem) ici;
-
-		ImageDescriptor icon = (ImageDescriptor) iconField.get(cmd);
-		assertNotNull(icon);
-		String iconString = icon.toString();
-		assertEquals(ICONS_ANYTHING_GIF, iconString.substring(iconString
-				.lastIndexOf('/')));
-
-		ici = manager.find(ID_ALL);
-		assertTrue(ici instanceof CommandContributionItem);
-		cmd = (CommandContributionItem) ici;
-		icon = (ImageDescriptor) iconField.get(cmd);
-		assertNotNull(icon);
-		iconString = icon.toString();
-		assertEquals(ICONS_BINARY_GIF, iconString.substring(iconString
-				.lastIndexOf('/')));
-
-		ici = manager.find(ID_TOOLBAR);
-		assertTrue(ici instanceof CommandContributionItem);
-		cmd = (CommandContributionItem) ici;
-		icon = (ImageDescriptor) iconField.get(cmd);
-		assertNull(icon);
-
-		manager.dispose();
-	}
-
-	public void testToolBarItems() throws Exception {
-		Field iconField = CommandContributionItem.class
-				.getDeclaredField(FIELD_ICON);
-		iconField.setAccessible(true);
-
-		ToolBarManager manager = new ToolBarManager();
-		menuService.populateContributionManager(manager, "toolbar:"
-				+ TEST_CONTRIBUTIONS_CACHE_ID);
-
-		IContributionItem ici = manager.find(ID_DEFAULT);
-		assertTrue(ici instanceof CommandContributionItem);
-		CommandContributionItem cmd = (CommandContributionItem) ici;
-
-		ImageDescriptor icon = (ImageDescriptor) iconField.get(cmd);
-		assertNotNull(icon);
-		String iconString = icon.toString();
-		assertEquals(ICONS_ANYTHING_GIF, iconString.substring(iconString
-				.lastIndexOf('/')));
-
-		ici = manager.find(ID_ALL);
-		assertTrue(ici instanceof CommandContributionItem);
-		cmd = (CommandContributionItem) ici;
-		icon = (ImageDescriptor) iconField.get(cmd);
-		assertNotNull(icon);
-		iconString = icon.toString();
-		assertEquals(ICONS_MOCK_GIF, iconString.substring(iconString
-				.lastIndexOf('/')));
-
-		ici = manager.find(ID_TOOLBAR);
-		assertTrue(ici instanceof CommandContributionItem);
-		cmd = (CommandContributionItem) ici;
-		icon = (ImageDescriptor) iconField.get(cmd);
-		assertNotNull(icon);
-		iconString = icon.toString();
-		assertEquals(ICONS_VIEW_GIF, iconString.substring(iconString
-				.lastIndexOf('/')));
-
-		manager.dispose();
-	}
-
-	public void testFactoryScopePopulation() throws Exception {
-		AbstractContributionFactory factory = new AbstractContributionFactory(
-				"menu:the.population.menu?after=additions", "org.eclipse.ui.tests") {
-
-			public void createContributionItems(IServiceLocator serviceLocator,
-					IContributionRoot additions) {
-				final MenuManager manager = new MenuManager("menu.id");
-				manager.add(new Action("action.id") {
-				});
-				additions.addContributionItem(manager, null);
-			}
-
-		};
-		MenuManager testManager = new MenuManager();
-		IViewPart view = window.getActivePage()
-				.showView(IPageLayout.ID_OUTLINE);
-		assertNotNull(view);
-		IMenuService service = (IMenuService) view.getSite().getService(
-				IMenuService.class);
-		service.populateContributionManager(testManager, "menu:the.population.menu");
-		assertEquals(0, testManager.getSize());
-		service.addContributionFactory(factory);
-		assertEquals(1, testManager.getSize());
-		window.getActivePage().hideView(view);
-		processEvents();
-		assertEquals(0, testManager.getSize());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuTestCase.java
deleted file mode 100644
index 024d109..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuTestCase.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.menus;
-
-import org.eclipse.core.commands.contexts.Context;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.contexts.IContextActivation;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.menus.IMenuService;
-import org.eclipse.ui.tests.api.workbenchpart.MenuContributionHarness;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Base class for tests concerning the 'org.eclipse.ui.menus'
- * extension point. Gains access to the various services that
- * are useful in writing the tests and defines the id of the 
- * URI that contains a 'known' structure. If the XML describing
- * the structure is changed then the static tables that the
- * tests use to determine 'success' have to be verified and
- * updated if necessary.
- * 
- * @since 3.3
- * 
- */
-public class MenuTestCase extends UITestCase {
-
-	protected static final String TEST_CONTRIBUTIONS_CACHE_ID = "org.eclipse.ui.tests.IfYouChangeMe.FixTheTests";
-
-	/**
-	 * @param testName
-	 */
-	public MenuTestCase(String testName) {
-		super(testName);
-	}
-
-	protected IContextService contextService;
-	protected IMenuService menuService;
-	protected IWorkbenchWindow window;
-	protected IContextActivation activeContext;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doSetUp()
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-
-		window = openTestWindow();
-		contextService = (IContextService) window
-				.getService(IContextService.class);
-		Context context1 = contextService
-				.getContext(MenuContributionHarness.CONTEXT_TEST1_ID);
-		if (!context1.isDefined()) {
-			context1.define("Menu Test 1", "Menu test 1",
-					IContextService.CONTEXT_ID_DIALOG_AND_WINDOW);
-		}
-
-		menuService = (IMenuService) window.getService(IMenuService.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doTearDown()
-	 */
-	protected void doTearDown() throws Exception {
-		if (activeContext != null) {
-			contextService.deactivateContext(activeContext);
-			activeContext = null;
-		}
-		contextService = null;
-		menuService = null;
-		window = null;
-
-		super.doTearDown();
-	}
-	
-	protected static int ALL_OK = -1;
-	protected static int checkContribIds(IContributionItem[] items, String[] ids) {
-		// Test cases should check this independently so they can issue the
-		// correct error (i.e. "Not enough items...wanted 6 got 5") but for
-		// safety's sake...
-		if (items.length != ids.length)
-			return 0;
-		
-		for (int i = 0; i < ids.length; i++) {
-			// HACK!! Some uds are based on intances
-			if (ids[i] == null)
-				continue;
-			
-			if (!ids[i].equals(items[i].getId()))
-				return i;
-		}
-		return ALL_OK;
-	}
-
-	protected static int checkContribClasses(IContributionItem[] items, Class[] classes) {
-		// Test cases should check this independently so they can issue the
-		// correct error (i.e. "Not enough items...wanted 6 got 5") but for
-		// safety's sake...
-		if (items.length != classes.length)
-			return 0;
-		
-		for (int i = 0; i < classes.length; i++) {
-			// HACK!! cant find anonyous classes
-			if (classes[i] == null)
-				continue;
-			
-			// minor upgrade ... if the item is an instanceof the class we're good
-			// this handles the case where the item is a subclass of
-			// CompoundContributionItem
-			if (!classes[i].isInstance(items[i]))
-				return i;
-		}
-		return ALL_OK;
-	}
-
-	protected static int checkMenuItemLabels(MenuItem[] menuItems,
-			String[] expectedLabels) {
-		// Test cases should check this independently so they can issue the
-		// correct error (i.e. "Not enough items...wanted 6 got 5") but for
-		// safety's sake...
-		if (menuItems.length != expectedLabels.length)
-			return 0;
-		
-		for (int i = 0; i < expectedLabels.length; i++) {
-			if (!expectedLabels[i].equals(menuItems[i].getText()))
-				return i;
-		}
-		return ALL_OK;
-	}
-	
-	protected static void printIds(IContributionItem[] items) {
-		System.out.println("String[] expectedIds = {");
-		for (int i = 0; i < items.length; i++) {
-			String comma = (i < (items.length-1)) ? "," : "";
-			System.out.println("\t\"" + items[i].getId() + "\"" + comma);
-		}
-		System.out.println("};");
-	}
-	
-	protected static void printClasses(IContributionItem[] items) {
-		System.out.println("Class[] expectedClasses = {");
-		for (int i = 0; i < items.length; i++) {
-			String comma = (i < (items.length-1)) ? "," : "";
-			System.out.println("\t" + items[i].getClass().getName() + ".class" + comma);
-		}
-		System.out.println("};");
-	}
-	
-	protected static void printMenuItemLabels(MenuItem[] items) {
-		System.out.println("String[] expectedMenuItemLabels = {");
-		for (int i = 0; i < items.length; i++) {
-			String comma = (i < (items.length-1)) ? "," : "";
-			System.out.println("\t\"" + items[i].getText() + "\"" + comma);
-		}
-		System.out.println("};");
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuVisibilityTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuVisibilityTest.java
deleted file mode 100644
index 40c9b02..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenuVisibilityTest.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.menus;
-
-import java.util.Collections;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.contexts.Context;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionConverter;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.ui.ISources;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.contexts.IContextActivation;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.handlers.IHandlerActivation;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.internal.AbstractEnabledHandler;
-import org.eclipse.ui.menus.AbstractContributionFactory;
-import org.eclipse.ui.menus.CommandContributionItem;
-import org.eclipse.ui.menus.CommandContributionItemParameter;
-import org.eclipse.ui.menus.IContributionRoot;
-import org.eclipse.ui.menus.IMenuService;
-import org.eclipse.ui.services.IServiceLocator;
-import org.eclipse.ui.tests.TestPlugin;
-import org.eclipse.ui.tests.api.workbenchpart.MenuContributionHarness;
-import org.eclipse.ui.tests.commands.ActiveContextExpression;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.3
- * 
- */
-public class MenuVisibilityTest extends UITestCase {
-
-	private static final String EXTENSION_ID = "org.eclipse.ui.tests.menusX1";
-	private static final String LOCATION = "menu:foo";
-	private static final String COMMAND_ID = "org.eclipse.ui.tests.commandEnabledVisibility";
-
-	/**
-	 * @param testName
-	 */
-	public MenuVisibilityTest(String testName) {
-		super(testName);
-	}
-
-	private IContextService contextService;
-	private IMenuService menuService;
-	private IWorkbenchWindow window;
-	private IContextActivation activeContext;
-
-	public void testBasicContribution() throws Exception {
-
-		IAction a = new Action() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.action.Action#run()
-			 */
-			public void run() {
-				System.out.println("Hello action");
-			}
-		};
-		final MenuManager manager = new MenuManager();
-		final ActionContributionItem item = new ActionContributionItem(a);
-		final Expression activeContextExpr = new ActiveContextExpression(
-				MenuContributionHarness.CONTEXT_TEST1_ID,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME });
-		AbstractContributionFactory factory = new AbstractContributionFactory(
-				LOCATION, TestPlugin.PLUGIN_ID) {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.menus.AbstractContributionFactory#createContributionItems(org.eclipse.ui.menus.IMenuService,
-			 *      org.eclipse.ui.menus.AbstractContributionFactory.IContributionList)
-			 */
-			public void createContributionItems(IServiceLocator menuService,
-					IContributionRoot additions) {
-				additions.addContributionItem(item, activeContextExpr);
-			}
-		};
-
-		menuService.addContributionFactory(factory);
-		menuService.populateContributionManager(manager, LOCATION);
-		
-		assertFalse("starting state", item.isVisible());
-
-		activeContext = contextService
-				.activateContext(MenuContributionHarness.CONTEXT_TEST1_ID);
-
-		assertTrue("active context", item.isVisible());
-
-		contextService.deactivateContext(activeContext);
-		activeContext = null;
-
-		assertFalse("after deactivation", item.isVisible());
-
-		menuService.releaseContributions(manager);
-		menuService.removeContributionFactory(factory);
-		manager.dispose();
-	}
-
-	public void testExtensionContributionExpression() throws Exception {
-		IAction a = new Action() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.action.Action#run()
-			 */
-			public void run() {
-				System.out.println("Hello action");
-			}
-		};
-		final MenuManager manager = new MenuManager();
-		final ActionContributionItem aci = new ActionContributionItem(a);
-
-		IExtensionRegistry reg = Platform.getExtensionRegistry();
-		IExtensionPoint menusExtension = reg
-				.getExtensionPoint("org.eclipse.ui.menus");
-		IExtension extension = menusExtension.getExtension(EXTENSION_ID);
-
-		IConfigurationElement[] mas = extension.getConfigurationElements();
-		final Expression activeContextExpr[] = new Expression[1];
-		for (int i = 0; i < mas.length; i++) {
-			IConfigurationElement ma = mas[i];
-			IConfigurationElement[] items = ma.getChildren();
-			for (int j = 0; j < items.length; j++) {
-				IConfigurationElement item = items[j];
-				String id = item.getAttribute("id");
-				if (id != null
-						&& id.equals("org.eclipse.ui.tests.menus.itemX1")) {
-					IConfigurationElement visibleWhenElement = item
-							.getChildren("visibleWhen")[0];
-					activeContextExpr[0] = ExpressionConverter.getDefault()
-							.perform(visibleWhenElement.getChildren()[0]);
-				}
-			}
-		}
-		assertNotNull("Failed to find expression", activeContextExpr[0]);
-		AbstractContributionFactory factory = new AbstractContributionFactory(
-				LOCATION, TestPlugin.PLUGIN_ID) {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.ui.menus.AbstractContributionFactory#createContributionItems(org.eclipse.ui.menus.IMenuService,
-			 *      org.eclipse.ui.menus.AbstractContributionFactory.IContributionList)
-			 */
-			public void createContributionItems(IServiceLocator menuService,
-					IContributionRoot additions) {
-				additions.addContributionItem(aci, activeContextExpr[0]);
-			}
-		};
-
-		menuService.addContributionFactory(factory);
-		menuService.populateContributionManager(manager, LOCATION);
-
-		assertFalse("starting state", aci.isVisible());
-
-		activeContext = contextService
-				.activateContext(MenuContributionHarness.CONTEXT_TEST1_ID);
-		assertTrue("active context", aci.isVisible());
-
-		contextService.deactivateContext(activeContext);
-		activeContext = null;
-
-		assertFalse("after deactivation", aci.isVisible());
-
-		menuService.releaseContributions(manager);
-		menuService.removeContributionFactory(factory);
-		manager.dispose();
-	}
-
-	private static class TestEnabled extends AbstractEnabledHandler {
-		public Object execute(ExecutionEvent event) {
-			System.out.println("go");
-			return null;
-		}
-
-		public void setEnabled(boolean isEnabled) {
-			super.setEnabled(isEnabled);
-		}
-	}
-
-	public void testVisibilityTracksEnablement() throws Exception {
-		final MenuManager manager = new MenuManager();
-		final CommandContributionItemParameter parm = new CommandContributionItemParameter(
-				window, null, COMMAND_ID, Collections.EMPTY_MAP, null, null,
-				null, null, null, null, CommandContributionItem.STYLE_PUSH,
-				null, true);
-		final CommandContributionItem item = new CommandContributionItem(parm);
-
-		AbstractContributionFactory factory = new AbstractContributionFactory(
-				LOCATION, TestPlugin.PLUGIN_ID) {
-			public void createContributionItems(IServiceLocator menuService,
-					IContributionRoot additions) {
-				additions.addContributionItem(item, null);
-			}
-		};
-
-		menuService.addContributionFactory(factory);
-		menuService.populateContributionManager(manager, LOCATION);
-
-		assertFalse(item.isEnabled());
-		assertFalse("starting state", item.isVisible());
-
-		IHandlerService handlers = (IHandlerService) window
-				.getService(IHandlerService.class);
-		TestEnabled handler = new TestEnabled();
-		IHandlerActivation activateHandler = handlers.activateHandler(
-				COMMAND_ID, handler);
-
-		assertTrue(handler.isEnabled());
-		assertTrue(item.isEnabled());
-		assertTrue("activated handler", item.isVisible());
-
-		handler.setEnabled(false);
-
-		assertFalse("set enabled == false", item.isVisible());
-
-		handler.setEnabled(true);
-
-		assertTrue("set enabled == true", item.isVisible());
-
-		handlers.deactivateHandler(activateHandler);
-
-		assertFalse("deactivate handler", item.isVisible());
-
-		menuService.releaseContributions(manager);
-		menuService.removeContributionFactory(factory);
-		manager.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doSetUp()
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-
-		window = openTestWindow();
-		menuService = (IMenuService) window.getService(IMenuService.class);
-		contextService = (IContextService) window
-				.getService(IContextService.class);
-		Context context1 = contextService
-				.getContext(MenuContributionHarness.CONTEXT_TEST1_ID);
-		if (!context1.isDefined()) {
-			context1.define("Menu Test 1", "Menu test 1",
-					IContextService.CONTEXT_ID_DIALOG_AND_WINDOW);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doTearDown()
-	 */
-	protected void doTearDown() throws Exception {
-		if (activeContext != null) {
-			contextService.deactivateContext(activeContext);
-			activeContext = null;
-		}
-		menuService = null;
-		contextService = null;
-		window = null;
-
-		super.doTearDown();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenusTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenusTestSuite.java
deleted file mode 100644
index 3e8a1e9..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/MenusTestSuite.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.menus;
-
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-
-/**
- * Tests for all code related to menus. This includes the
- * <code>popupMenus</code> extension point, and others.
- */
-public class MenusTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new MenusTestSuite();
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public MenusTestSuite() {
-        addTest(new TestSuite(ObjectContributionTest.class));
-        addTest(new TestSuite(MenuVisibilityTest.class));
-        addTest(new TestSuite(MenuBaseTests.class));
-        addTest(new TestSuite(MenuPopulationTest.class));
-        addTest(new TestSuite(DynamicMenuTest.class));
-        addTest(new TestSuite(Bug231304Test.class));
-        addTest(new TestSuite(ShowViewMenuTest.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ObjectContributionClasses.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ObjectContributionClasses.java
deleted file mode 100644
index cdbd1de..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ObjectContributionClasses.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.menus;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.mapping.*;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.ui.IContributorResourceAdapter;
-import org.eclipse.ui.ide.IContributorResourceAdapter2;
-
-public class ObjectContributionClasses implements IAdapterFactory {
-	
-	public static final String PROJECT_NAME = "testContributorResourceAdapter";
-	
-	public static interface ICommon extends IAdaptable {
-	}
-	
-	public static class Common implements ICommon {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-		 */
-		public Object getAdapter(Class adapter) {
-			return null;
-		}	
-	}
-	
-	public static interface IA {
-	}
-	
-	public static class A implements IA {	
-	}
-	
-	public static class A1 extends A {
-	}
-	
-	public static class A11 extends A1 {
-	}
-	
-	public static interface IB {
-	}
-	
-	public static class B implements IB {
-	}
-	
-	public static class B2 implements IB {
-	}
-	
-	public static class D extends Common implements IA {
-	}
-	
-	public static class C implements ICommon {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-		 */
-		public Object getAdapter(Class adapter) {
-			return null;
-		}
-	}
-	
-	public static class CResource implements IAdaptable {
-		public Object getAdapter(Class adapter) {
-			if(adapter == IContributorResourceAdapter.class) {
-				return new ResourceAdapter();
-			}			
-			return null;
-		}		
-	}
-	
-	public static class CFile implements IAdaptable {
-		public Object getAdapter(Class adapter) {
-			if(adapter == IContributorResourceAdapter.class) {
-				return new ResourceAdapter();
-			}			
-			return null;
-		}		
-	}
-	
-	// Returns a contribution adapter that doesn't handle ResourceMappings
-	public static class CResourceOnly implements IAdaptable {
-		public Object getAdapter(Class adapter) {
-			if(adapter == IContributorResourceAdapter.class) {
-				return new ResourceOnlyAdapter();
-			}			
-			return null;
-		}		
-	}
-    
-    public interface IModelElement {
-    }
-	
-    public static class ModelElement extends PlatformObject implements IModelElement {
-    }
-    
-	// Default contributor adapter
-	
-	public static class ResourceAdapter implements IContributorResourceAdapter2 {
-		public IResource getAdaptedResource(IAdaptable adaptable) {
-			if(adaptable instanceof CResource) {
-				return ResourcesPlugin.getWorkspace().getRoot();
-			}
-			if(adaptable instanceof CFile) {
-				return ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECT_NAME).getFile("dummy");
-			}
-			return null;
-		}
-        public ResourceMapping getAdaptedResourceMapping(IAdaptable adaptable) {
-            return (ResourceMapping)getAdaptedResource(adaptable).getAdapter(ResourceMapping.class);
-        }	
-	}
-	
-	// Contributor adapter that doesn't handle resource mappings
-	
-	public static class ResourceOnlyAdapter implements IContributorResourceAdapter {
-		public IResource getAdaptedResource(IAdaptable adaptable) {
-			if(adaptable instanceof CResourceOnly) {
-				return ResourcesPlugin.getWorkspace().getRoot();
-			}
-			return null;
-		}
-	}
-	
-	// Adapter methods
-	
-	public Object getAdapter(final Object adaptableObject, Class adapterType) {
-		if(adapterType == IContributorResourceAdapter.class) {
-			return new ResourceAdapter();
-		}
-		if(adaptableObject instanceof IA && adapterType == IA.class) {
-			return new A();
-		}
-		if(adapterType == IResource.class) {
-			return ResourcesPlugin.getWorkspace().getRoot();
-		}
-		if(adapterType == ICommon.class) {
-			return new Common();
-		}
-        if(adapterType == ResourceMapping.class) {
-            return new ResourceMapping() {    
-                public ResourceTraversal[] getTraversals(ResourceMappingContext context, IProgressMonitor monitor) {
-                    return new ResourceTraversal[] {
-                            new ResourceTraversal(new IResource[] {ResourcesPlugin.getWorkspace().getRoot()}, IResource.DEPTH_INFINITE, IResource.NONE)
-                    };
-                }
-                public IProject[] getProjects() {
-                    return ResourcesPlugin.getWorkspace().getRoot().getProjects();
-                }
-                public Object getModelObject() {
-                    return adaptableObject;
-                }
-                public String getModelProviderId() {
-            		return ModelProvider.RESOURCE_MODEL_PROVIDER_ID;
-                }
-            };
-        }
-        
-		return null;
-	}
-
-	public Class[] getAdapterList() {
-		return new Class[] { ICommon.class, IResource.class, IFile.class, IContributorResourceAdapter.class, ResourceMapping.class};
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ObjectContributionTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ObjectContributionTest.java
deleted file mode 100644
index 310eaa6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ObjectContributionTest.java
+++ /dev/null
@@ -1,389 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.menus;
-
-import java.io.ByteArrayInputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.mapping.ResourceMapping;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.SubContributionItem;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.PluginActionContributionItem;
-import org.eclipse.ui.internal.PopupMenuExtender;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.tests.menus.ObjectContributionClasses.ICommon;
-
-/**
- * Tests that object contributions are enabled and shown correctly in pop-up
- * menus depending on the state of the workbench. This test relies on the
- * <code>plugin.xml</code> file containing certain values. Please see the
- * appropriate section in that file for more information about the initial
- * set-up.
- * 
- * @since 3.0
- */
-public final class ObjectContributionTest extends UITestCase {
-
-	/**
-	 * Constructs a new instance of <code>ObjectContributionTest</code> with
-	 * the name of the test.
-	 * 
-	 * @param name
-	 *            The name of the test; may be <code>null</code>.
-	 */
-	public ObjectContributionTest(final String name) {
-		super(name);
-	}
-
-	/**
-	 * Tests whether the content-type object contribution works. This is testing
-	 * a use care familiar to Ant UI. The content-type scans an XML file to see
-	 * if its root element is <code>&lt;project&gt;</code>.
-	 * 
-	 * @throws CoreException
-	 *             If a problem occurs when creating the project or file, or if
-	 *             the project can't be opened.
-	 */
-	public final void testObjectStateContentType() throws CoreException {
-		// Create an XML file with <project> as its root element.
-		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		final IProject testProject = workspace.getRoot().getProject(
-				"ObjectContributionTestProject");
-		testProject.create(null);
-		testProject.open(null);
-		final IFile xmlFile = testProject.getFile("ObjectContributionTest.xml");
-		final String contents = "<testObjectStateContentTypeElement></testObjectStateContentTypeElement>";
-		final ByteArrayInputStream inputStream = new ByteArrayInputStream(
-				contents.getBytes());
-		xmlFile.create(inputStream, true, null);
-		final ISelection selection = new StructuredSelection(xmlFile);
-		assertPopupMenus(
-				"1",
-				new String[] { "org.eclipse.ui.tests.testObjectStateContentType" },
-				selection, null, true);
-	}
-
-	/**
-	 * This tests backwards compatibility support for adaptable IResource
-	 * objectContributions. This allows IResource adaptable contributions
-	 * without an adapter factory and using the IContributorResourceAdapter
-	 * factory. In addition, test the ResourceMapping adaptations.
-	 * 
-	 * @since 3.1
-	 */
-	public final void testContributorResourceAdapter() throws CoreException {
-
-		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		final IProject testProject = workspace.getRoot().getProject(
-				ObjectContributionClasses.PROJECT_NAME);
-		if (!testProject.exists()) {
-			testProject.create(null);
-		}
-		if (!testProject.isOpen()) {
-			testProject.open(null);
-		}
-
-		assertPopupMenus(
-				"1",
-				new String[] { "IResource.1" },
-				new StructuredSelection(
-						new Object[] { new ObjectContributionClasses.CResource() }),
-				IResource.class, true);
-		assertPopupMenus(
-				"2",
-				new String[] { "IProject.1" },
-				new StructuredSelection(
-						new Object[] { new ObjectContributionClasses.CFile() }),
-				null, false);
-		assertPopupMenus(
-				"3",
-				new String[] { "IFile.1" },
-				new StructuredSelection(
-						new Object[] { new ObjectContributionClasses.CFile() }),
-				IFile.class, true);
-		assertPopupMenus("4", new String[] { "IResource.1" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.CFile(),
-						new ObjectContributionClasses.CResource() }),
-				IResource.class, true);
-		assertPopupMenus("5", new String[] { "IFile.1", "IProject.1" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.CFile(),
-						new ObjectContributionClasses.CResource() }),
-				IResource.class, false);
-		assertPopupMenus("6", new String[] { "ResourceMapping.1" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.CFile(),
-						new ObjectContributionClasses.CResource() }),
-				ResourceMapping.class, true);
-		assertPopupMenus(
-				"7",
-				new String[] { "ResourceMapping.1", "IResource.1" },
-				new StructuredSelection(
-						new Object[] { new ObjectContributionClasses.ModelElement() }),
-				ResourceMapping.class, true);
-		// Ensure that the case where an object uses a contribution adapter that
-		// doesn't handle mappings
-		// will still show the menus for resource mappings
-		assertPopupMenus(
-				"8",
-				new String[] { "ResourceMapping.1", "IResource.1" },
-				new StructuredSelection(
-						new Object[] { new ObjectContributionClasses.CResourceOnly() }),
-				ResourceMapping.class, true);
-	}
-
-	/**
-	 * This tests adaptable contributions that are not IResource.
-	 * 
-	 * @since 3.1
-	 */
-	public final void testAdaptables() {
-		assertPopupMenus("1", new String[] { "ICommon.1" },
-				new StructuredSelection(
-						new Object[] { new ObjectContributionClasses.A() }),
-				ICommon.class, true);
-		assertPopupMenus("2", new String[] { "ICommon.1" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.A(),
-						new ObjectContributionClasses.B() }), ICommon.class,
-				true);
-		assertPopupMenus("3", new String[] { "ICommon.1" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.A(),
-						new ObjectContributionClasses.B(),
-						new ObjectContributionClasses.C(),
-						new ObjectContributionClasses.Common() }),
-				ICommon.class, true);
-		assertPopupMenus("4", new String[] { "ICommon.1" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.Common(),
-						new ObjectContributionClasses.C(),
-						new ObjectContributionClasses.B(),
-						new ObjectContributionClasses.A() }), ICommon.class,
-				true);
-		assertPopupMenus("5", new String[] { "ICommon.1" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.Common(),
-						new ObjectContributionClasses.C(),
-						new ObjectContributionClasses.B(),
-						new ObjectContributionClasses.C(),
-						new ObjectContributionClasses.A(),
-						new ObjectContributionClasses.Common() }),
-				ICommon.class, true);
-		assertPopupMenus("6", new String[] { "ICommon.1" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.C(),
-						new ObjectContributionClasses.Common() }),
-				ICommon.class, true);
-		assertPopupMenus("7", new String[] { "ICommon.1" },
-				new StructuredSelection(new Object[] { new Object() }),
-				ICommon.class, false);
-		assertPopupMenus("8", new String[] { "ICommon.1" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.C(), new Object() }),
-				ICommon.class, false);
-		assertPopupMenus("9", new String[] { "ICommon.1" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.C(),
-						new ObjectContributionClasses.A(), new Object() }),
-				ICommon.class, false);
-	}
-
-	/**
-	 * Ensure that there are no duplicate contributions.
-	 * 
-	 * @since 3.1
-	 */
-	public final void testDuplicateAdaptables() {
-		assertPopupMenus("1", new String[] { "ICommon.1" },
-				new StructuredSelection(
-						new Object[] { new ObjectContributionClasses.D() }),
-				ICommon.class, true);
-		// repeat test on purpose to ensure no double call duplicates.
-		assertPopupMenus("1", new String[] { "ICommon.1" },
-				new StructuredSelection(
-						new Object[] { new ObjectContributionClasses.D() }),
-				ICommon.class, true);
-		assertPopupMenus("2", new String[] { "ICommon.1" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.D(),
-						new ObjectContributionClasses.A() }), ICommon.class,
-				true);
-		assertPopupMenus("3", new String[] { "ICommon.1" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.A(),
-						new ObjectContributionClasses.D() }), ICommon.class,
-				true);
-		assertPopupMenus("4", new String[] { "ICommon.1" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.Common(),
-						new ObjectContributionClasses.D() }), ICommon.class,
-				true);
-		assertPopupMenus("5", new String[] { "ICommon.1" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.D(),
-						new ObjectContributionClasses.Common() }),
-				ICommon.class, true);
-	}
-
-	/**
-	 * Test non-adaptable contributions
-	 * 
-	 * @since 3.1
-	 */
-	public final void testNonAdaptableContributions() {
-		assertPopupMenus("1", new String[] { "ICommon.2" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.A(),
-						new ObjectContributionClasses.B() }), ICommon.class,
-				false);
-		assertPopupMenus("2", new String[] { "ICommon.2" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.D(),
-						new ObjectContributionClasses.C(),
-						new ObjectContributionClasses.Common() }),
-				ICommon.class, true);
-		assertPopupMenus("3", new String[] { "Common.2" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.D(),
-						new ObjectContributionClasses.C(),
-						new ObjectContributionClasses.A() }), ICommon.class,
-				false);
-		assertPopupMenus("4", new String[] { "Common.2" },
-				new StructuredSelection(new Object[] {
-						new ObjectContributionClasses.B(),
-						new ObjectContributionClasses.C(),
-						new ObjectContributionClasses.A() }), ICommon.class,
-				false);
-	}
-
-	/**
-	 * Helper class that will create a popup menu based on the given selection
-	 * and then ensure that the provided commandIds are added to the menu.
-	 * 
-	 * @param commandIds
-	 *            the command ids that should appear in the menu
-	 * @param selection
-	 *            the selection on which to contribute object contributions
-	 */
-	public void assertPopupMenus(String name, String[] commandIds,
-			final ISelection selection, Class selectionType, boolean existance) {
-		ISelectionProvider selectionProvider = new ISelectionProvider() {
-			public void addSelectionChangedListener(
-					ISelectionChangedListener listener) {
-			}
-
-			public ISelection getSelection() {
-				return selection;
-			}
-
-			public void removeSelectionChangedListener(
-					ISelectionChangedListener listener) {
-			}
-
-			public void setSelection(ISelection selection) {
-			}
-		};
-
-		// The popup extender needs a part to notify actions of the active part
-		final WorkbenchWindow window = (WorkbenchWindow) PlatformUI
-				.getWorkbench().getActiveWorkbenchWindow();
-		final IWorkbenchPage page = window.getActivePage();
-		IWorkbenchPart part = page.getActivePartReference().getPart(true);
-
-		// Create a fake PopupMenuExtender so we can get some data back.
-		final MenuManager fakeMenuManager = new MenuManager();
-		fakeMenuManager.add(new GroupMarker(
-				org.eclipse.ui.IWorkbenchActionConstants.MB_ADDITIONS));
-		final PopupMenuExtender extender = new PopupMenuExtender(null,
-				fakeMenuManager, selectionProvider, part);
-
-		/*
-		 * Pretend to show the pop-up menu -- looking to motivate the extender
-		 * to fill the menu based on the selection provider.
-		 * 
-		 * TODO This causes a big delay (in the order of a minute or more) while
-		 * trying to fill this menu. It seems to be loading a bunch of plug-ins,
-		 * and doing class loading.
-		 */
-		extender.menuAboutToShow(fakeMenuManager);
-
-		extender.dispose();
-
-		// Check to see if the appropriate object contributions are present.
-		final IContributionItem[] items = fakeMenuManager.getItems();
-		Set seenCommands = new HashSet(Arrays.asList(commandIds));
-		List commands = new ArrayList(Arrays.asList(commandIds));
-		for (int i = 0; i < items.length; i++) {
-			IContributionItem contributionItem = items[i];
-			// Step 1: test the selection
-			if (selectionType != null) {
-				IContributionItem item = contributionItem;
-				if (item instanceof SubContributionItem) {
-					item = ((SubContributionItem) contributionItem)
-							.getInnerItem();
-				}
-				if (item instanceof PluginActionContributionItem) {
-					// Verify that the selection passed to the action has been
-					// converted
-					ISelection s = null;
-					if (s instanceof IStructuredSelection) {
-						for (Iterator it = ((IStructuredSelection) s)
-								.iterator(); it.hasNext();) {
-							Object element = it.next();
-							assertTrue(name + " selection not converted",
-									selectionType.isInstance(element));
-						}
-					}
-				}
-			}
-			// Step 2: remember that we saw this element
-			String id = contributionItem.getId();
-			if (existance) {
-				boolean removed = commands.remove(id);
-				if (seenCommands.contains(id) && !removed) {
-					fail(name + " item duplicated in the context menu: " + id);
-				}
-			} else {
-				assertTrue(name + " item should not be in the context menu",
-						!commands.contains(id));
-			}
-		}
-
-		if (existance && !commands.isEmpty()) {
-			fail(name + " Missing " + commands.toString()
-					+ " from context menu.");
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/RemoveMarkersAction.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/RemoveMarkersAction.java
deleted file mode 100644
index 6e5c010..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/RemoveMarkersAction.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.menus;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.tests.TestPlugin;
-
-/**
- * @since 3.1
- */
-public class RemoveMarkersAction implements IWorkbenchWindowActionDelegate {
-
-    private IWorkbenchWindow window;
-
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-     */
-    public void dispose() {
-        // TODO Auto-generated method stub
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-     */
-    public void init(IWorkbenchWindow window) {
-        this.window = window;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-     */
-    public void run(IAction action) {
-        try {
-	        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-	        
-	        IMarker[] markers = root.findMarkers(AddMarkersAction.CATEGORY_TEST_MARKER, false, IResource.DEPTH_ZERO);
-	        
-	        for (int i = 0; i < markers.length; i++) {
-	            String message = (String) markers[i].getAttribute(IMarker.MESSAGE);
-
-	            if (message != null && message.startsWith("this is a test")) {
-	                markers[i].delete();
-	            }
-	        }
-        } catch (CoreException e) {
-            openError(e);
-        }
-    }
-
-    private void openError(Exception e) {
-        String msg = e.getMessage();
-        if (msg == null) {
-            msg = e.getClass().getName();
-        }
-
-        e.printStackTrace();
-
-        IStatus status = new Status(IStatus.ERROR, TestPlugin.getDefault()
-                .getDescriptor().getUniqueIdentifier(), 0, msg, e);
-
-        TestPlugin.getDefault().getLog().log(status);
-
-        ErrorDialog.openError(window.getShell(), "Error", msg, status);
-    }
-
-    
-    /* (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) {
-        // TODO Auto-generated method stub
-
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ShowViewMenuTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ShowViewMenuTest.java
deleted file mode 100644
index dfa2e6c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ShowViewMenuTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/******************************************************************************
- * Copyright (c) 2008 Versant Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Remy Chi Jian Suen (Versant Corporation) - initial API and implementation
- ******************************************************************************/
-package org.eclipse.ui.tests.menus;
-
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.ShowViewMenu;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.5
- */
-public class ShowViewMenuTest extends UITestCase {
-
-	private IWorkbenchWindow workbenchWindow;
-
-	public ShowViewMenuTest(String testName) {
-		super(testName);
-	}
-
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		// open a workbench window with the empty perspective, since it defines
-		// no show view shortcuts, it is suitable for the two single show view
-		// action tests
-		workbenchWindow = openTestWindow();
-	}
-	
-	/***********************************
-	 * Tests for Bug 56368 starts here *
-	 ***********************************/
-
-	public void testMenuOnlyHasShowViewAction() {
-		Menu swtMenu = new Menu(workbenchWindow.getShell());
-		ShowViewMenu showViewMenu = new ShowViewMenu(workbenchWindow, "id"); //$NON-NLS-1$
-		showViewMenu.fill(swtMenu, 0);
-
-		// as the separator is not shown if there is only the 'Show View...'
-		// action, the item count should simply be one
-		assertEquals("Only the 'Other...' action should be available", 1, swtMenu.getItemCount());
-	}
-
-	public void testFastViewMenuVariantOnlyHasShowViewAction() {
-		Menu swtMenu = new Menu(workbenchWindow.getShell());
-		ShowViewMenu showViewMenu = new ShowViewMenu(workbenchWindow,
-				"id", true); //$NON-NLS-1$
-		showViewMenu.fill(swtMenu, 0);
-
-		// as the separator is not shown if there is only the 'Show View...'
-		// action, the item count should simply be one
-		assertEquals("Only the 'Other...' action should be available", 1, swtMenu.getItemCount());
-	}
-	
-	/*********************************
-	 * Tests for Bug 56368 ends here *
-	 *********************************/
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ToggleContextHandler.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ToggleContextHandler.java
deleted file mode 100644
index 75b4daa..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/menus/ToggleContextHandler.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.menus;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.commands.IElementUpdater;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.contexts.IContextActivation;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.handlers.HandlerUtil;
-import org.eclipse.ui.menus.UIElement;
-
-/**
- * @since 3.3
- * 
- */
-public class ToggleContextHandler extends AbstractHandler implements
-		IElementUpdater {
-	private static final String TOGGLE_ID = "toggleContext.contextId";
-	Map contextActivations = new HashMap();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		String contextId = event.getParameter(TOGGLE_ID);
-		IWorkbenchWindow window = HandlerUtil
-				.getActiveWorkbenchWindowChecked(event);
-
-		IContextService contextService = (IContextService) window
-				.getService(IContextService.class);
-		IContextActivation a = (IContextActivation) contextActivations
-				.get(contextId);
-
-		// toggle the context active or not
-		if (a == null) {
-			contextActivations.put(contextId, contextService
-					.activateContext(contextId));
-		} else {
-			contextService.deactivateContext(a);
-			contextActivations.remove(contextId);
-		}
-
-		// now we should update any menu items/tool items that refer
-		// to toggleContext(contextId) ... this request means
-		// only update the UI that points to this specific context
-		// id ... not the other, non-interesting ones.
-		ICommandService commandService = (ICommandService) window
-				.getService(ICommandService.class);
-		Map filter = new HashMap();
-		filter.put(TOGGLE_ID, contextId);
-		commandService.refreshElements(event.getCommand().getId(), filter);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.commands.IElementUpdater#updateElement(org.eclipse.ui.menus.UIElement, java.util.Map)
-	 */
-	public void updateElement(UIElement element, Map parameters) {
-
-		// the checked state depends on if we have an activation for that
-		// context ID or not
-		String contextId = (String) parameters.get(TOGGLE_ID);
-		element.setChecked(contextActivations.get(contextId) != null);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multieditor/MultiEditorTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multieditor/MultiEditorTest.java
deleted file mode 100644
index 1b935b6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multieditor/MultiEditorTest.java
+++ /dev/null
@@ -1,534 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.multieditor;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-
-import junit.framework.TestSuite;
-
-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.ILog;
-import org.eclipse.core.runtime.ILogListener;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.ToolBarContributionItem;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.ui.IActionBars2;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.IContributedContentsView;
-import org.eclipse.ui.part.MultiEditor;
-import org.eclipse.ui.part.MultiEditorInput;
-import org.eclipse.ui.tests.TestPlugin;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test MultiEditor behaviour to highlight some of the broken functionality.
- * 
- * @since 3.1
- */
-public class MultiEditorTest extends UITestCase {
-	private static final String ACTION_TOOLTIP = "MultiEditorActionThing";
-
-	private static final String PROJECT_NAME = "TiledEditorProject";
-
-	private static final String CONTENT_OUTLINE = "org.eclipse.ui.views.ContentOutline";
-
-	private static final String TESTEDITOR_COOLBAR = "org.eclipse.ui.tests.multieditor.actionSet";
-
-	private static final String TILED_EDITOR_ID = "org.eclipse.ui.tests.multieditor.TiledEditor";
-
-	// tiled editor test files
-	private static final String DATA_FILES_DIR = "/data/org.eclipse.newMultiEditor/";
-
-	private static final String TEST01_TXT = "test01.txt";
-
-	private static final String TEST02_TXT = "test02.txt";
-
-	private static final String TEST03_ETEST = "test03.etest";
-
-	private static final String TEST04_PROPERTIES = "test04.properties";
-
-	private static final String BUILD_XML = "build.xml";
-
-	//
-	// call trace for the editor open - setFocus - close test
-	//
-	private static String[] gEditorOpenTrace = { "setInitializationData",
-			"init", "createPartControl", "createInnerPartControl",
-			"createInnerPartControl", "setFocus", "updateGradient",
-			"updateGradient", };
-
-	private static String[] gEditorFocusTrace = { "setInitializationData",
-			"init", "createPartControl", "createInnerPartControl",
-			"createInnerPartControl", "setFocus", "updateGradient",
-			"updateGradient", "updateGradient", "updateGradient", };
-
-	private static String[] gEditorCloseTrace = { "setInitializationData",
-			"init", "createPartControl", "createInnerPartControl",
-			"createInnerPartControl", "setFocus", "updateGradient",
-			"updateGradient", "updateGradient", "updateGradient",
-			"widgetsDisposed", "dispose" };
-
-	public static TestSuite suite() {
-		return new TestSuite(MultiEditorTest.class);
-	}
-
-	/**
-	 * Can catch a MultiEditor unexpect Exception on init.
-	 */
-	private EditorErrorListener fErrorListener;
-
-	public MultiEditorTest(String tc) {
-		super(tc);
-	}
-
-	/**
-	 * Test that the test tiled editor can be opened with a basic
-	 * MultiEditorInput with the same type of files.
-	 * 
-	 * Test: Select a couple of files from navigator and use the TiledEditor
-	 * menu to open the editor. It should open with the first selected file on
-	 * top.
-	 * 
-	 * @throws Throwable
-	 *             on an error
-	 */
-	public void testOpenBasicEditor() throws Throwable {
-		final String[] simpleFiles = { TEST01_TXT, TEST02_TXT };
-
-		IWorkbenchWindow window = openTestWindow();
-		IWorkbenchPage page = window.getActivePage();
-
-		IProject testProject = findOrCreateProject(PROJECT_NAME);
-
-		MultiEditorInput input = generateEditorInput(simpleFiles, testProject);
-
-		// validate there are no NullPointerExceptions during editor
-		// initialization
-		openAndValidateEditor(page, input);
-	}
-
-	/**
-	 * Test that the public methods in TiledEditor (and MultiEditor) are called
-	 * in the correct order from 3.0 to 3.1.
-	 * 
-	 * Test: this test involves opening the tiled editor on 2 files, changing
-	 * the focus from the first file to the second file, and closing the tiled
-	 * editor.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testOpenTestFile() throws Throwable {
-		final String[] simpleFiles = { TEST01_TXT, TEST03_ETEST };
-
-		IWorkbenchWindow window = openTestWindow();
-		WorkbenchPage page = (WorkbenchPage) window.getActivePage();
-
-		IProject testProject = findOrCreateProject(PROJECT_NAME);
-
-		MultiEditorInput input = generateEditorInput(simpleFiles, testProject);
-
-		// catches the framework NPE
-		IEditorPart editor = openAndValidateEditor(page, input);
-
-		// did we get a multieditor back?
-		assertTrue(editor instanceof MultiEditor);
-		MultiEditor multiEditor = (MultiEditor) editor;
-
-		chewUpEvents();
-
-		// listHistory(((TiledEditor) multiEditor).callHistory);
-
-		// check the public API called for opening the TiledEditor
-		// ((TiledEditor) multiEditor).callHistory.printToConsole();
-		assertTrue("The editor open trace was incorrect",
-				((TiledEditor) multiEditor).callHistory
-						.verifyOrder(gEditorOpenTrace));
-
-		// swap focus to the last editor, which is the test editor
-		// with the test coolbar contribution
-		IEditorPart[] innerEditors = multiEditor.getInnerEditors();
-		innerEditors[innerEditors.length - 1].setFocus();
-
-		chewUpEvents();
-
-		// ((TiledEditor) multiEditor).callHistory.printToConsole();
-		assertTrue("Editor setFocus trace was incorrect",
-				((TiledEditor) multiEditor).callHistory
-						.verifyOrder(gEditorFocusTrace));
-
-		page.closeEditor(multiEditor, false);
-
-		chewUpEvents();
-
-		// ((TiledEditor) multiEditor).callHistory.printToConsole();
-		assertTrue("Editor close trace was incorrect",
-				((TiledEditor) multiEditor).callHistory
-						.verifyOrder(gEditorCloseTrace));
-	}
-
-	/**
-	 * Test that coolbar items in the workbench are updated when focus moves
-	 * through the different inner editors ... this test as written is not 100%
-	 * accurate, as the items are enabled.
-	 * 
-	 * Test: Open two files where the first is a text file and the second is of
-	 * type etest. Change focus to the etest file, and the coolbar should update
-	 * with a new action icon and it should be enabled.
-	 * 
-	 * @throws Throwable
-	 *             on an error
-	 */
-	public void testTrackCoolBar() throws Throwable {
-		final String[] simpleFiles = { TEST01_TXT, TEST02_TXT,
-				TEST04_PROPERTIES, BUILD_XML, TEST03_ETEST };
-
-		IWorkbenchWindow window = openTestWindow();
-		WorkbenchPage page = (WorkbenchPage) window.getActivePage();
-
-		IProject testProject = findOrCreateProject(PROJECT_NAME);
-
-		MultiEditorInput input = generateEditorInput(simpleFiles, testProject);
-
-		// catches the framework NPE
-		IEditorPart editor = openAndValidateEditor(page, input);
-
-		// did we get a multieditor back?
-		assertTrue(editor instanceof MultiEditor);
-		MultiEditor multiEditor = (MultiEditor) editor;
-
-		chewUpEvents();
-
-		// get access to the appropriate coolbar
-		IContributionItem contribution = findMyCoolBar(page);
-
-		// our test editor contribution should not be visible
-		// but it should be enabled
-		validateIconState(contribution, ACTION_TOOLTIP, false);
-
-		// swap focus to the last editor, which is the test editor
-		// with the test coolbar contribution
-		IEditorPart[] innerEditors = multiEditor.getInnerEditors();
-		innerEditors[innerEditors.length - 1].setFocus();
-
-		chewUpEvents();
-
-		contribution = findMyCoolBar(page);
-		assertNotNull("It should be available now", contribution);
-
-		// our test editor contribution should now be visible and
-		// enabled
-		validateIconState(contribution, ACTION_TOOLTIP, true);
-
-	}
-
-	/**
-	 * Test that the outline view is updated when focus moves from an editor to
-	 * the ant editor.
-	 * 
-	 * Test: Open 2 files where the first is a text file and the second is an
-	 * ant file. Set focus on the ant file, and the outline should be updated to
-	 * reflect the buildfile outline.
-	 * 
-	 * @throws Throwable
-	 *             on an error
-	 */
-	public void testTrackOutline() throws Throwable {
-		final String[] simpleFiles = { TEST01_TXT, TEST02_TXT,
-				TEST04_PROPERTIES, BUILD_XML, TEST03_ETEST };
-
-		IWorkbenchWindow window = openTestWindow();
-		WorkbenchPage page = (WorkbenchPage) window.getActivePage();
-
-		IProject testProject = findOrCreateProject(PROJECT_NAME);
-
-		MultiEditorInput input = generateEditorInput(simpleFiles, testProject);
-
-		// catches the framework NPE
-		IEditorPart editor = openAndValidateEditor(page, input);
-
-		// did we get a multieditor back?
-		assertTrue(editor instanceof MultiEditor);
-		MultiEditor multiEditor = (MultiEditor) editor;
-
-		chewUpEvents();
-
-		// Swap to the second last editor, which should be the ant
-		// build editor.
-		IEditorPart[] innerEditors = multiEditor.getInnerEditors();
-		innerEditors[innerEditors.length - 2].setFocus();
-		chewUpEvents();
-
-		// get the outline view part
-		IViewPart outline = window.getActivePage().showView(CONTENT_OUTLINE);
-		assertNotNull(outline);
-
-		// find out who is contributing the outline view.
-		IContributedContentsView view = (IContributedContentsView) outline
-				.getAdapter(IContributedContentsView.class);
-		IWorkbenchPart part = view.getContributingPart();
-		assertNotNull("The Outline view has not been updated by the editor",
-				part);
-		assertTrue("The Outline view is not talking to an editor",
-				part instanceof IEditorPart);
-
-		IEditorPart outlineEditor = (IEditorPart) part;
-
-		// the active inner editor (the ant editor) should also
-		// be the outline editor contributor ... this works in
-		// 3.0, fails in 3.1
-		assertEquals("The Outline view is not talking to the correct editor",
-				multiEditor.getActiveEditor(), outlineEditor);
-
-		page.closeEditor(editor, false);
-		chewUpEvents();
-
-		view = (IContributedContentsView) outline
-				.getAdapter(IContributedContentsView.class);
-		assertNull(view.getContributingPart());
-	}
-
-	/**
-	 * Return the test editor coolbar.
-	 * 
-	 * @param page
-	 *            the workbench page
-	 * @return the IContributionItem for the test editor cool bar.
-	 */
-	private IContributionItem findMyCoolBar(WorkbenchPage page) {
-		// listItems(page);
-		IContributionItem contribution = ((IActionBars2) page.getActionBars())
-				.getCoolBarManager().find(TESTEDITOR_COOLBAR);
-		// assertNotNull(contribution);
-
-		return contribution;
-	}
-
-	/**
-	 * Validate the state of an icon in the toolbar.
-	 * 
-	 * @param contribution
-	 *            the high level contribution from the coolbar to look through
-	 * @param tooltip
-	 *            the string that matches the action's tooltip
-	 * @param state
-	 *            should it be true or false
-	 */
-	private void validateIconState(IContributionItem contribution,
-			String tooltip, boolean state) {
-		assertTrue("We might not have the contribution or expect it",
-				contribution != null || !state);
-		if (contribution == null) {
-			return;
-		}
-
-		ToolBarManager toolBarManager = (ToolBarManager) ((ToolBarContributionItem) contribution)
-				.getToolBarManager();
-		ToolBar bar = toolBarManager.getControl();
-
-		assertTrue("It's OK for bar to be null if we expect state to be false",
-				bar != null || !state);
-		if (bar == null) {
-			return;
-		}
-
-		ToolItem[] items = bar.getItems();
-		for (int i = 0; i < items.length; ++i) {
-			// System.err.println("Item: " + items[i].getToolTipText());
-			if (tooltip.equals(items[i].getToolTipText())) {
-				assertEquals("Invalid icon state for " + tooltip, state,
-						items[i].getEnabled());
-				return;
-			}
-		}
-		assertFalse("We haven't found our item", state);
-	}
-
-	/**
-	 * Create the project to work in. If it already exists, just open it.
-	 * 
-	 * @param projectName
-	 *            the name of the project to create
-	 * @return the newly opened project
-	 * @throws CoreException
-	 */
-	private IProject findOrCreateProject(String projectName)
-			throws CoreException {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IProject testProject = workspace.getRoot().getProject(projectName);
-		if (!testProject.exists()) {
-			testProject.create(null);
-		}
-		testProject.open(null);
-		return testProject;
-	}
-
-	/**
-	 * After an internal action, see if there are any outstanding SWT events.
-	 */
-	private void chewUpEvents() throws InterruptedException {
-		Thread.sleep(500);
-		Display display = Display.getCurrent();
-		while (display.readAndDispatch())
-			;
-	}
-
-	/**
-	 * Open the test editor. It does basic validation that there is no
-	 * NullPointerException during initialization.
-	 * 
-	 * @param page
-	 *            the workbench page
-	 * @param input
-	 *            the editor input with multiple files
-	 * @return the MultiEditor
-	 * @throws PartInitException
-	 */
-	private IEditorPart openAndValidateEditor(IWorkbenchPage page,
-			MultiEditorInput input) throws PartInitException {
-
-		IEditorPart editorPart = null;
-		try {
-			setupErrorListener();
-			editorPart = page
-					.openEditor(input, MultiEditorTest.TILED_EDITOR_ID);
-			assertNotNull(editorPart);
-
-			// 3.1.0 only
-			// assertFalse("The editor never actualized",
-			// editorPart instanceof ErrorEditorPart);
-
-			if (fErrorListener.messages.size() > 0) {
-				String[] msgs = (String[]) fErrorListener.messages
-						.toArray(new String[fErrorListener.messages.size()]);
-				for (int i = 0; i < msgs.length; i++) {
-					if (msgs[i].indexOf("The proxied handler for") == -1
-							&& msgs[i].indexOf("Conflict for \'") == -1
-							&& msgs[i].indexOf("Keybinding conflicts occurred")==-1
-							&& msgs[i].indexOf("A handler conflict occurred")==-1) {
-						fail("Failed with: " + msgs[i]);
-					}
-				}
-			}
-		} finally {
-			removeErrorListener();
-		}
-		return editorPart;
-	}
-
-	/**
-	 * Set up to catch any editor initialization exceptions.
-	 * 
-	 */
-	private void setupErrorListener() {
-		final ILog log = WorkbenchPlugin.getDefault().getLog();
-		fErrorListener = new EditorErrorListener();
-		log.addLogListener(fErrorListener);
-	}
-
-	/**
-	 * Remove the editor error listener.
-	 */
-	private void removeErrorListener() {
-		final ILog log = WorkbenchPlugin.getDefault().getLog();
-		if (fErrorListener != null) {
-			log.removeLogListener(fErrorListener);
-			fErrorListener = null;
-		}
-	}
-
-	/**
-	 * Create the multi editor input in the given project. Creates the files in
-	 * the project from template files in the classpath if they don't already
-	 * exist.
-	 * 
-	 * @param simpleFiles
-	 *            the array of filenames to copy over
-	 * @param testProject
-	 *            the project to create the files in
-	 * @return the editor input used to open the multieditor
-	 * @throws CoreException
-	 * @throws IOException
-	 */
-	private MultiEditorInput generateEditorInput(String[] simpleFiles,
-			IProject testProject) throws CoreException, IOException {
-		String[] ids = new String[simpleFiles.length];
-		IEditorInput[] inputs = new IEditorInput[simpleFiles.length];
-		IEditorRegistry registry = fWorkbench.getEditorRegistry();
-
-		for (int f = 0; f < simpleFiles.length; ++f) {
-			IFile f1 = testProject.getFile(simpleFiles[f]);
-			if (!f1.exists()) {
-				URL file = Platform.asLocalURL(TestPlugin.getDefault()
-						.getBundle().getEntry(DATA_FILES_DIR + simpleFiles[f]));
-				f1.create(file.openStream(), true, null);
-			}
-			ids[f] = registry.getDefaultEditor(f1.getName()).getId();
-			inputs[f] = new FileEditorInput(f1);
-		}
-
-		MultiEditorInput input = new MultiEditorInput(ids, inputs);
-		return input;
-	}
-
-	/**
-	 * Close any editors at the beginner of a test, so the test can be clean.
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		IWorkbenchPage page = fWorkbench.getActiveWorkbenchWindow()
-				.getActivePage();
-		page.closeAllEditors(false);
-
-	}
-
-	/**
-	 * Listens for the standard message that indicates the MultiEditor failed
-	 * ... usually caused by incorrect framework initialization that doesn't set
-	 * the innerChildren.
-	 * 
-	 * @since 3.1
-	 * 
-	 */
-	public static class EditorErrorListener implements ILogListener {
-
-		public ArrayList messages = new ArrayList();
-
-		public void logging(IStatus status, String plugin) {
-			String msg = status.getMessage();
-			Throwable ex = status.getException();
-			if (ex != null) {
-				msg += ": " + ex.getMessage();
-			}
-			messages.add(msg);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multieditor/MultiEditorTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multieditor/MultiEditorTestSuite.java
deleted file mode 100644
index 56bfff0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multieditor/MultiEditorTestSuite.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.multieditor;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class MultiEditorTestSuite extends TestSuite {
-
-	public static Test suite() {
-		return new MultiEditorTestSuite();
-	}
-    /**
-     * Construct the test suite.
-     */
-    public MultiEditorTestSuite() {
-        addTestSuite(MultiEditorTest.class);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multieditor/TestActionBarContributor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multieditor/TestActionBarContributor.java
deleted file mode 100644
index 5f2a0c8..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multieditor/TestActionBarContributor.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.multieditor;
-
-import org.eclipse.jface.action.ICoolBarManager;
-import org.eclipse.ui.part.EditorActionBarContributor;
-
-public class TestActionBarContributor extends EditorActionBarContributor {
-
-	public TestActionBarContributor() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToCoolBar(org.eclipse.jface.action.ICoolBarManager)
-	 */
-	public void contributeToCoolBar(ICoolBarManager coolBarManager) {
-		super.contributeToCoolBar(coolBarManager);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multieditor/TestEditor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multieditor/TestEditor.java
deleted file mode 100644
index a42bd31..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multieditor/TestEditor.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.multieditor;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.EditorPart;
-
-/**
- * A test editor that does pretty-well nothing.  Activating it will
- * update the coolbar, and possibly eventually the outline as well.
- * 
- * @since 3.1
- *
- */
-public class TestEditor extends EditorPart {
-
-	private Composite fMainPanel;
-
-	public TestEditor() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	public void doSave(IProgressMonitor monitor) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void doSaveAs() {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		if (!(input instanceof IFileEditorInput))
-			throw new PartInitException(
-					"Invalid Input: Must be IFileEditorInput");
-		setSite(site);
-		setInput(input);
-
-	}
-
-	public boolean isDirty() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	public boolean isSaveAsAllowed() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	public void createPartControl(Composite parent) {
-		fMainPanel = new Composite(parent, SWT.NONE);
-		fMainPanel.setLayout(new RowLayout(SWT.VERTICAL));
-
-		Label l = new Label(fMainPanel, SWT.NONE);
-		l.setText("Editor Title:");
-
-		l = new Label(fMainPanel, SWT.BORDER);
-		l.setText(getEditorInput().getName());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		fMainPanel.setFocus();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multieditor/TiledEditor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multieditor/TiledEditor.java
deleted file mode 100644
index 0b861a6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multieditor/TiledEditor.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.multieditor;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.custom.ViewForm;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.MultiEditor;
-import org.eclipse.ui.tests.harness.util.CallHistory;
-
-/**
- * Implementation of a TiledEditor. This is the testable version copied from bug
- * 42641.
- */
-public class TiledEditor extends MultiEditor {
-
-	private CLabel innerEditorTitle[];
-
-	public CallHistory callHistory;
-
-	public TiledEditor() {
-		super();
-		callHistory = new CallHistory(this);
-	}
-
-	/**
-	 * technically not part of our framework API, but it will mark when the
-	 * widgets were disposed.
-	 */
-	public void widgetsDisposed() {
-		callHistory.add("widgetsDisposed");
-	}
-
-	/*
-	 * @see IWorkbenchPart#createPartControl(Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		callHistory.add("createPartControl");
-
-		parent.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				widgetsDisposed();
-			}
-		});
-
-		parent = new Composite(parent, SWT.BORDER);
-
-		parent.setLayout(new FillLayout());
-		SashForm sashForm = new SashForm(parent, SWT.HORIZONTAL);
-		IEditorPart innerEditors[] = getInnerEditors();
-
-		for (int i = 0; i < innerEditors.length; i++) {
-			final IEditorPart e = innerEditors[i];
-			ViewForm viewForm = new ViewForm(sashForm, SWT.NONE);
-			viewForm.marginWidth = 0;
-			viewForm.marginHeight = 0;
-
-			createInnerEditorTitle(i, viewForm);
-
-			Composite content = createInnerPartControl(viewForm, e);
-
-			viewForm.setContent(content);
-			updateInnerEditorTitle(e, innerEditorTitle[i]);
-
-			final int index = i;
-			e.addPropertyListener(new IPropertyListener() {
-				public void propertyChanged(Object source, int property) {
-					if (property == IEditorPart.PROP_DIRTY
-							|| property == IWorkbenchPart.PROP_TITLE)
-						if (source instanceof IEditorPart)
-							updateInnerEditorTitle((IEditorPart) source,
-									innerEditorTitle[index]);
-				}
-			});
-		}
-	}
-
-	/**
-	 * Draw the gradient for the specified editor.
-	 */
-	protected void drawGradient(IEditorPart innerEditor, Gradient g) {
-		CLabel label = innerEditorTitle[getIndex(innerEditor)];
-		if ((label == null) || label.isDisposed())
-			return;
-
-		label.setForeground(g.fgColor);
-		label.setBackground(g.bgColors, g.bgPercents);
-	}
-
-	/*
-	 * Create the label for each inner editor.
-	 */
-	protected void createInnerEditorTitle(int index, ViewForm parent) {
-
-		CLabel titleLabel = new CLabel(parent, SWT.SHADOW_NONE);
-		// hookFocus(titleLabel);
-		titleLabel.setAlignment(SWT.LEFT);
-		titleLabel.setBackground(null, null);
-		parent.setTopLeft(titleLabel);
-		if (innerEditorTitle == null)
-			innerEditorTitle = new CLabel[getInnerEditors().length];
-		innerEditorTitle[index] = titleLabel;
-	}
-
-	/*
-	 * Update the tab for an editor. This is typically called by a site when the
-	 * tab title changes.
-	 */
-	public void updateInnerEditorTitle(IEditorPart editor, CLabel label) {
-
-		if ((label == null) || label.isDisposed())
-			return;
-		String title = editor.getTitle();
-		if (editor.isDirty())
-			title = "*" + title; //$NON-NLS-1$
-		label.setText(title);
-		Image image = editor.getTitleImage();
-		if (image != null)
-			if (!image.equals(label.getImage()))
-				label.setImage(image);
-		label.setToolTipText(editor.getTitleToolTip());
-	}
-
-	/*
-	 * 
-	 */
-	protected int getIndex(IEditorPart editor) {
-		IEditorPart innerEditors[] = getInnerEditors();
-		for (int i = 0; i < innerEditors.length; i++) {
-			if (innerEditors[i] == editor)
-				return i;
-		}
-		return -1;
-	}
-
-	//
-	// These are public methods from the parent that are overriden to
-	// add them to the call history.
-	//
-
-	public Composite createInnerPartControl(Composite parent, IEditorPart e) {
-		callHistory.add("createInnerPartControl");
-		return super.createInnerPartControl(parent, e);
-	}
-
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		callHistory.add("init");
-		super.init(site, input);
-	}
-
-	public void setFocus() {
-		callHistory.add("setFocus");
-		super.setFocus();
-	}
-
-	public void updateGradient(IEditorPart editor) {
-		callHistory.add("updateGradient");
-		super.updateGradient(editor);
-	}
-
-	public void setInitializationData(IConfigurationElement cfig,
-			String propertyName, Object data) {
-		callHistory.add("setInitializationData");
-		super.setInitializationData(cfig, propertyName, data);
-	}
-
-	public void dispose() {
-		callHistory.add("dispose");
-		super.dispose();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/ContextTextEditor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/ContextTextEditor.java
deleted file mode 100644
index ea744a5..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/ContextTextEditor.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.multipageeditor;
-
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.editors.text.TextEditor;
-import org.eclipse.ui.services.IServiceLocator;
-
-/**
- * @since 3.2
- * 
- */
-public class ContextTextEditor extends TextEditor {
-	public static final String TEXT_CONTEXT_ID = "org.eclipse.ui.textEditorScope";
-
-	public static final String CONTEXT_ID = "org.eclipse.ui.tests.multipageeditor.contextEditor";
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#init(org.eclipse.ui.IEditorSite,
-	 *      org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		super.init(site, input);
-		IServiceLocator locator = getSite();
-		IContextService contextService = (IContextService) locator
-				.getService(IContextService.class);
-
-		// if this was instantiated as a regular editor, the context would
-		// be governed by part activation ... embedded in an MPEP,
-		// the context should be governed by page activation.
-		contextService.activateContext(CONTEXT_ID);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiEditorInputTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiEditorInputTest.java
deleted file mode 100644
index 9d36624..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiEditorInputTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.multipageeditor;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.MultiEditorInput;
-
-/**
- * Tests the API of <code>MultiPageEditorInput</code>.
- * 
- * @since 3.1
- */
-public class MultiEditorInputTest extends TestCase {
-
-    /**
-     * Constructs a new instance of <code>MultiPageEditorInputTest</code>.
-     * 
-     * @param name
-     *            The name of the test to be run.
-     */
-    public MultiEditorInputTest(String name) {
-        super(name);
-    }
-
-    /**
-     * Tests the equals and hashCode methods.
-     */
-    public void testEqualsAndHash() {
-        String ea = "dummy.editor.id.A";
-        String eb = "dummy.editor.id.B";
-        String ec = "dummy.editor.id.C";
-        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-        IEditorInput ia = new FileEditorInput(root.getFile(new Path("/DummyProject/FileA")));
-        IEditorInput ib = new FileEditorInput(root.getFile(new Path("/DummyProject/FileB")));
-        IEditorInput ic = new FileEditorInput(root.getFile(new Path("/DummyProject/FileC")));
-        MultiEditorInput a = new MultiEditorInput(new String[] { ea }, new IEditorInput[] { ia });
-        MultiEditorInput a2 = new MultiEditorInput(new String[] { ea }, new IEditorInput[] { ia });
-        MultiEditorInput b = new MultiEditorInput(new String[] { eb }, new IEditorInput[] { ib });
-        MultiEditorInput abc = new MultiEditorInput(new String[] { ea, eb, ec }, new IEditorInput[] { ia, ib, ic });
-        MultiEditorInput abc2 = new MultiEditorInput(new String[] { ea, eb, ec }, new IEditorInput[] { ia, ib, ic });
-
-        assertTrue(a.equals(a));
-        assertTrue(abc.equals(abc));
-
-        assertTrue(a.equals(a2));
-        assertTrue(a.hashCode() == a2.hashCode());
-
-        assertFalse(a.equals(b));
-        
-        assertTrue(abc.equals(abc2));
-        assertTrue(abc.hashCode() == abc2.hashCode());
-        
-        // check that differing array lengths are handled properly
-        assertFalse(a.equals(abc));
-        assertFalse(abc.equals(a));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiPageEditorTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiPageEditorTestSuite.java
deleted file mode 100644
index 9e6c55e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiPageEditorTestSuite.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.multipageeditor;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * The suite of tests for multi-page editors.
- * 
- * @since 3.0
- */
-public class MultiPageEditorTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     * @return A new test suite; never <code>null</code>.;
-     */
-    public static Test suite() {
-        return new MultiPageEditorTestSuite();
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public MultiPageEditorTestSuite() {
-        addTestSuite(MultiEditorInputTest.class);
-        addTestSuite(MultiVariablePageTest.class);
-        // Focus issues
-        // addTest(new TestSuite(MultiPageKeyBindingTest.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiPageKeyBindingTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiPageKeyBindingTest.java
deleted file mode 100644
index 550cc5c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiPageKeyBindingTest.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.multipageeditor;
-
-import java.io.ByteArrayInputStream;
-
-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.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.commands.ICommandManager;
-import org.eclipse.ui.commands.IWorkbenchCommandSupport;
-import org.eclipse.ui.keys.KeySequence;
-import org.eclipse.ui.keys.ParseException;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests that key bindings are treated correctly in a multi-page editor. This
- * ensures that key bindings are switched at the granularity of a page in a
- * multi-page editor. See Bug 37612 for references.
- * 
- * @since 3.0
- */
-public class MultiPageKeyBindingTest extends UITestCase {
-
-    /**
-     * Constructs a new instance of <code>MultiPageKeyBindingTest</code>.
-     * 
-     * @param name
-     *            The name of the test to be run.
-     */
-    public MultiPageKeyBindingTest(String name) {
-        super(name);
-    }
-
-    /**
-     * Tests that the key bindings are updated when the page is switched in a
-     * multi-page editor part.
-     * 
-     * @throws CoreException
-     *             If the project or file cannot be created.
-     * @throws ParseException
-     *             The expected key sequence cannot be parsed.
-     */
-    public void testSwitch() throws CoreException, ParseException {
-        final String extension = "multi"; //$NON-NLS-1$
-        final String fileName = "A." + extension; //$NON-NLS-1$
-
-        // Open a new test window.
-        IWorkbenchWindow window = openTestWindow();
-
-        // Create a blurb file.
-        IWorkbenchPage page = window.getActivePage();
-        IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        IProject testProject = workspace.getRoot().getProject(
-                "MultiPageKeyBindingTest Project"); //$NON-NLS-1$
-        testProject.create(null);
-        testProject.open(null);
-        IFile multiFile = testProject.getFile(fileName);
-        multiFile.create(new ByteArrayInputStream(new byte[0]), true, null);
-
-        // Open a blurb file.
-        IEditorInput editorInput = new FileEditorInput(multiFile);
-        IEditorPart editorPart = page.openEditor(editorInput,
-                "org.eclipse.ui.tests.multipageeditor.TestMultiPageEditor"); //$NON-NLS-1$
-        TestMultiPageEditor multiPageEditorPart = (TestMultiPageEditor) editorPart;
-
-        // Switch to the second tab
-        window.getShell().forceActive();
-        Display display = Display.getCurrent();
-        while (display.readAndDispatch())
-            ;
-        multiPageEditorPart.setPage(1);
-
-        // Check that "Ctrl+Shift+5" is the bound key.
-        IWorkbenchCommandSupport commandSupport = window.getWorkbench()
-                .getCommandSupport();
-        ICommandManager commandManager = commandSupport.getCommandManager();
-        KeySequence expectedKeyBinding = KeySequence
-                .getInstance("Ctrl+Shift+5"); //$NON-NLS-1$
-        String commandId = commandManager.getPerfectMatch(expectedKeyBinding);
-        assertEquals("org.eclipse.ui.tests.TestCommandId", commandId); //$NON-NLS-1$
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiVariablePageEditor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiVariablePageEditor.java
deleted file mode 100644
index 1a5594d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiVariablePageEditor.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.multipageeditor;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.FindReplaceDocumentAdapter;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.editors.text.TextEditor;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-
-/**
- * A MultiPageEditorPart with methods that take a peek at things like selection
- * events or selection status or page change events.
- * 
- * @since 3.2
- */
-public class MultiVariablePageEditor extends MultiPageEditorPart {
-
-	private Composite lastPage;
-
-	/**
-	 * Default with 2 pages, although they're on the same editor input and
-	 * they're the TextEditor.
-	 */
-	protected void createPages() {
-		try {
-			TextEditor section1 = new TextEditor();
-			int index = addPage(section1, getEditorInput());
-			setPageText(index, section1.getTitle());
-
-			TextEditor section2 = new TextEditor();
-			index = addPage(section2, getEditorInput());
-			setPageText(index, section2.getTitle());
-
-			ContextTextEditor section3 = new ContextTextEditor();
-			index = addPage(section3, getEditorInput());
-			setPageText(index, section3.getTitle());
-
-		} catch (PartInitException e) {
-			throw new RuntimeException(e);
-		}
-	}
-
-	public void doSave(IProgressMonitor monitor) {
-		// do nothing
-	}
-
-	public void doSaveAs() {
-		throw new UnsupportedOperationException(
-				"doSaveAs should not be called.");
-	}
-
-	/**
-	 * No save as.
-	 * 
-	 * @return false
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#pageChange(int)
-	 */
-	protected void pageChange(int newPageIndex) {
-		super.pageChange(newPageIndex);
-		IEditorPart part = getEditor(newPageIndex);
-		if (part instanceof TextEditor) {
-			TextEditor editor = (TextEditor) part;
-			IDocumentProvider provider = editor.getDocumentProvider();
-			IDocument doc = provider.getDocument(getEditorInput());
-			FindReplaceDocumentAdapter find = new FindReplaceDocumentAdapter(
-					doc);
-			try {
-				IRegion region = find.find(0, "#section0" + (newPageIndex + 1),
-						true, true, false, false);
-				if (region != null) {
-					editor.selectAndReveal(region.getOffset(), region
-							.getLength());
-				}
-			} catch (BadLocationException e) {
-				System.err.println("Failed to find a section");
-			}
-		}
-	}
-
-	/**
-	 * Set the active page in this MPEP. Just delegate back to
-	 * setActivePage(int).
-	 * 
-	 * @param index
-	 *            The page index which must be valid.
-	 */
-	public void setPage(int index) {
-		super.setActivePage(index);
-	}
-
-	/**
-	 * Add a page with a composite for testing.
-	 * 
-	 */
-	public void addLastPage() {
-		lastPage = new Composite(getContainer(), SWT.NONE);
-		Label l = new Label(lastPage, SWT.SHADOW_IN);
-		l.setText(getEditorInput().getName());
-		addPage(lastPage);
-	}
-
-	/**
-	 * remove the last page for testing.
-	 * 
-	 */
-	public void removeLastPage() {
-		if (getPageCount() > 0) {
-			removePage(getPageCount() - 1);
-		}
-		lastPage = null;
-	}
-
-	/**
-	 * Get the last page composite for testing.
-	 * 
-	 * @return the last page.
-	 */
-	public Control getLastPage() {
-		return lastPage;
-	}
-	
-	public IEditorPart getEditor(int pageIndex) {
-		return super.getEditor(pageIndex);
-	}
-
-	/**
-	 * Return the control for testing (like the editor control).
-	 * 
-	 * @param index
-	 *            the page index to get
-	 * @return the control for that page
-	 */
-	public Control getTestControl(int index) {
-		return getControl(index);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiVariablePageTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiVariablePageTest.java
deleted file mode 100644
index 1b888ca..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/MultiVariablePageTest.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.multipageeditor;
-
-import java.io.ByteArrayInputStream;
-import java.util.Collection;
-
-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.jface.dialogs.IPageChangedListener;
-import org.eclipse.jface.dialogs.PageChangedEvent;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-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.swt.widgets.Control;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IPartService;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * <p>
- * Test that the MultiPageEditorPart is acting on events and changes. These
- * tests are for making sure that selection events and page change events are
- * handled.
- * </p>
- * <p>
- * It also checks for changing Contexts.
- * </p>
- * 
- * @since 3.2
- */
-public class MultiVariablePageTest extends UITestCase {
-
-	private static final String FILE_CONTENTS = "#section01\nsection 1\n#section02\nsection 2\nwith info\n#section03\nLast page\n";
-
-	private static final String MTEST01_FILE = "mtest01.multivar";
-
-	private static final String MTEST02_FILE = "mtest02.multivar";
-
-	private static final String MULTI_VARIABLE_PROJ = "MultiVariableTest";
-
-	private int fPostCalled;
-
-	public MultiVariablePageTest(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Make sure that setting the active page programmatically calls
-	 * pageChanged(int) on the way. This method is overridden in a lot of
-	 * editors to provide their functionality on page changes.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testSetActivePage() throws Throwable {
-		// Open a new test window.
-		// Create and open a blurb file.
-		IWorkbenchWindow window = openTestWindow();
-		IEditorPart part = openMultivarFile(window, MTEST01_FILE);
-
-		MultiVariablePageEditor editor = (MultiVariablePageEditor) part;
-
-		editor.setPage(1);
-		ISelection selection = editor.getEditorSite().getSelectionProvider()
-				.getSelection();
-		TextSelection text = (TextSelection) selection;
-		// when we change to the second page, the selection should be
-		// updated.
-		assertEquals("#section02", text.getText());
-
-		editor.setPage(0);
-		selection = editor.getEditorSite().getSelectionProvider()
-				.getSelection();
-		text = (TextSelection) selection;
-		// when we change back to the first page, the selection should be
-		// updated.
-		assertEquals("#section01", text.getText());
-	}
-
-	/**
-	 * Make sure that removing a page that is a Control (instead of an editor)
-	 * disposes of the Control immediately.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testRemovePage() throws Throwable {
-		// Open a new test window.
-		// Create and open a blurb file.
-		IWorkbenchWindow window = openTestWindow();
-		IEditorPart part = openMultivarFile(window, MTEST01_FILE);
-
-		MultiVariablePageEditor editor = (MultiVariablePageEditor) part;
-		editor.addLastPage();
-		Control c = editor.getLastPage();
-		assertFalse(c.isDisposed());
-		editor.removeLastPage();
-		assertTrue(c.isDisposed());
-
-		c = editor.getTestControl(2);
-		assertFalse(c.isDisposed());
-		editor.removeLastPage();
-		assertTrue(c.isDisposed());
-		editor.setPage(0);
-		editor.getSite().getPage().activate(editor);
-	}
-
-	/**
-	 * Now the MPEP site's selection provider should by default support post
-	 * selection listeners. Since the MVPE is based on Text editors, we should
-	 * be getting the post selection events when we change pages.
-	 * 
-	 * @throws Throwable
-	 *             on error cases
-	 */
-	public void testPostSelection() throws Throwable {
-		// Open a new test window.
-		IWorkbenchWindow window = openTestWindow();
-		// Create and open a blurb file.
-		IEditorPart part = openMultivarFile(window, MTEST01_FILE);
-
-		MultiVariablePageEditor editor = (MultiVariablePageEditor) part;
-		ISelectionProvider sp = editor.getEditorSite().getSelectionProvider();
-		assertTrue(sp instanceof IPostSelectionProvider);
-
-		IPostSelectionProvider postProvider = (IPostSelectionProvider) sp;
-
-		fPostCalled = 0;
-		ISelectionChangedListener listener = new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				++fPostCalled;
-			}
-		};
-
-		try {
-			postProvider.addPostSelectionChangedListener(listener);
-			editor.setPage(1);
-			assertEquals(1, fPostCalled);
-			editor.setPage(0);
-			assertEquals(2, fPostCalled);
-		} finally {
-			postProvider.removePostSelectionChangedListener(listener);
-		}
-	}
-
-	private IEditorPart openMultivarFile(IWorkbenchWindow window,
-			String filename) throws CoreException, PartInitException {
-		IWorkbenchPage page = window.getActivePage();
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IProject testProject = workspace.getRoot().getProject(
-				MULTI_VARIABLE_PROJ);
-		if (!testProject.exists()) {
-			testProject.create(null);
-		}
-		testProject.open(null);
-		IFile multiFile = testProject.getFile(filename);
-		if (!multiFile.exists()) {
-			multiFile.create(
-					new ByteArrayInputStream(FILE_CONTENTS.getBytes()), true,
-					null);
-		}
-
-		// I can't be bothered to use the ID, but this editor has an
-		// extention registered against it.
-		IEditorPart part = IDE.openEditor(page, multiFile);
-		assertTrue("Should have opened our multi variable page editor",
-				part instanceof MultiVariablePageEditor);
-		return part;
-	}
-
-	/**
-	 * Make sure that contexts are activated-deactivated by pages changes and
-	 * other editors.
-	 * 
-	 * @throws Throwable
-	 *             on error
-	 */
-	public void testContextActivation() throws Throwable {
-		IContextService globalService = (IContextService) getWorkbench()
-				.getService(IContextService.class);
-
-		// Open a new test window.
-		// Create and open a blurb file.
-		IWorkbenchWindow window = openTestWindow();
-		IEditorPart part = openMultivarFile(window, MTEST01_FILE);
-
-		MultiVariablePageEditor editor = (MultiVariablePageEditor) part;
-		checkActiveContext(globalService, ContextTextEditor.CONTEXT_ID, false);
-		checkActiveContext(globalService, ContextTextEditor.TEXT_CONTEXT_ID,
-				true);
-
-		editor.setPage(1);
-		checkActiveContext(globalService, ContextTextEditor.CONTEXT_ID, false);
-		checkActiveContext(globalService, ContextTextEditor.TEXT_CONTEXT_ID,
-				true);
-
-		editor.setPage(2);
-		checkActiveContext(globalService, ContextTextEditor.CONTEXT_ID, true);
-		checkActiveContext(globalService, ContextTextEditor.TEXT_CONTEXT_ID,
-				true);
-
-		editor.setPage(1);
-		checkActiveContext(globalService, ContextTextEditor.CONTEXT_ID, false);
-		checkActiveContext(globalService, ContextTextEditor.TEXT_CONTEXT_ID,
-				true);
-
-		editor.setPage(2);
-		checkActiveContext(globalService, ContextTextEditor.CONTEXT_ID, true);
-		editor.removeLastPage();
-		checkActiveContext(globalService, ContextTextEditor.CONTEXT_ID, false);
-		checkActiveContext(globalService, ContextTextEditor.TEXT_CONTEXT_ID,
-				true);
-	}
-
-	/**
-	 * Assert if the contextId is active in the contextService.
-	 * 
-	 * @param contextService
-	 * @param contextId
-	 * @param isActive
-	 */
-	private void checkActiveContext(IContextService contextService,
-			String contextId, boolean isActive) {
-		Collection activeContexts = contextService.getActiveContextIds();
-		assertEquals(contextId, isActive, activeContexts.contains(contextId));
-	}
-
-	private static class PageChange implements IPageChangedListener {
-		MultiPageEditorPart editor;
-		Object page;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see
-		 * org.eclipse.jface.dialogs.IPageChangedListener#pageChanged(org.eclipse
-		 * .jface.dialogs.PageChangedEvent)
-		 */
-		public void pageChanged(PageChangedEvent event) {
-			editor = (MultiPageEditorPart) event.getSource();
-			page = event.getSelectedPage();
-		}
-
-	}
-
-	public void testPageChangeListeners() throws Throwable {
-		// Open a new test window.
-		// Create and open a blurb file.
-		IWorkbenchWindow window = openTestWindow();
-		IEditorPart part = openMultivarFile(window, MTEST01_FILE);
-
-		MultiVariablePageEditor editor = (MultiVariablePageEditor) part;
-		PageChange listener = new PageChange();
-		editor.addPageChangedListener(listener);
-
-		editor.setPage(1);
-		processEvents();
-		assertEquals(editor, listener.editor);
-		IEditorPart page = editor.getEditor(1);
-		assertEquals(page, listener.page);
-
-		editor.setPage(0);
-		processEvents();
-		assertEquals(editor, listener.editor);
-		page = editor.getEditor(0);
-		assertEquals(page, listener.page);
-		Control control = editor
-				.getTestControl(listener.editor.getActivePage());
-		assertNotNull(control);
-	}
-
-	private void testOneEditor(IWorkbenchWindow window, IPartService partService)
-			throws CoreException, PartInitException {
-		IEditorPart part = openMultivarFile(window, MTEST01_FILE);
-		assertNotNull(part);
-		MultiVariablePageEditor editor = (MultiVariablePageEditor) part;
-		PartPageListener listener = new PartPageListener();
-		partService.addPartListener(listener);
-
-		editor.setPage(1);
-		processEvents();
-		assertEquals(1, listener.pageChangeCount);
-		assertEquals(editor, listener.currentChangeEvent.getSource());
-		IEditorPart pageEditor = editor.getEditor(1);
-		assertEquals(pageEditor, listener.currentChangeEvent.getSelectedPage());
-
-		editor.setPage(0);
-		processEvents();
-		assertEquals(2, listener.pageChangeCount);
-		assertEquals(editor, listener.currentChangeEvent.getSource());
-		pageEditor = editor.getEditor(0);
-		assertEquals(pageEditor, listener.currentChangeEvent.getSelectedPage());
-		partService.removePartListener(listener);
-
-		editor.setPage(1);
-		processEvents();
-		assertEquals(2, listener.pageChangeCount);
-	}
-
-	private void testTwoEditors(IWorkbenchWindow window,
-			IPartService partService) throws CoreException, PartInitException {
-		IEditorPart part = openMultivarFile(window, MTEST01_FILE);
-		assertNotNull(part);
-		MultiVariablePageEditor editor = (MultiVariablePageEditor) part;
-		IEditorPart part2 = openMultivarFile(window, MTEST02_FILE);
-		assertNotNull(part2);
-		MultiVariablePageEditor editor2 = (MultiVariablePageEditor) part2;
-
-		PartPageListener listener = new PartPageListener();
-		partService.addPartListener(listener);
-
-		editor.setPage(1);
-		processEvents();
-		assertEquals(1, listener.pageChangeCount);
-		assertEquals(editor, listener.currentChangeEvent.getSource());
-		IEditorPart pageEditor = editor.getEditor(1);
-		assertEquals(pageEditor, listener.currentChangeEvent.getSelectedPage());
-
-		editor2.setPage(2);
-		assertEquals(2, listener.pageChangeCount);
-		assertEquals(editor2, listener.currentChangeEvent.getSource());
-
-		editor.setPage(0);
-		processEvents();
-		assertEquals(3, listener.pageChangeCount);
-		assertEquals(editor, listener.currentChangeEvent.getSource());
-		pageEditor = editor.getEditor(0);
-		assertEquals(pageEditor, listener.currentChangeEvent.getSelectedPage());
-
-		editor2.setPage(0);
-		assertEquals(4, listener.pageChangeCount);
-		assertEquals(editor2, listener.currentChangeEvent.getSource());
-
-		partService.removePartListener(listener);
-
-		editor.setPage(1);
-		processEvents();
-		assertEquals(4, listener.pageChangeCount);
-	}
-
-	public void testPagePartListener() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		IWorkbenchPage page = window.getActivePage();
-		testOneEditor(window, page);
-	}
-
-	public void testPagePartListener2() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		IWorkbenchPage page = window.getActivePage();
-		testTwoEditors(window, page);
-	}
-
-	public void testPageWindowListener() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		testOneEditor(window, window.getPartService());
-	}
-
-	public void testPageWindowListener2() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		testTwoEditors(window, window.getPartService());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/PartPageListener.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/PartPageListener.java
deleted file mode 100644
index 7b84a8e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/PartPageListener.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.multipageeditor;
-
-import org.eclipse.jface.dialogs.IPageChangedListener;
-import org.eclipse.jface.dialogs.PageChangedEvent;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IWorkbenchPartReference;
-
-/**
- * @since 3.5
- *
- */
-public class PartPageListener implements IPartListener2, IPageChangedListener {
-
-	public int pageChangeCount;
-	public PageChangedEvent currentChangeEvent;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partActivated(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partActivated(IWorkbenchPartReference partRef) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partBroughtToTop(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partBroughtToTop(IWorkbenchPartReference partRef) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partClosed(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partClosed(IWorkbenchPartReference partRef) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partDeactivated(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partDeactivated(IWorkbenchPartReference partRef) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partHidden(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partHidden(IWorkbenchPartReference partRef) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partInputChanged(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partInputChanged(IWorkbenchPartReference partRef) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partOpened(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partOpened(IWorkbenchPartReference partRef) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener2#partVisible(org.eclipse.ui.IWorkbenchPartReference)
-	 */
-	public void partVisible(IWorkbenchPartReference partRef) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IPageChangedListener#pageChanged(org.eclipse.jface.dialogs.PageChangedEvent)
-	 */
-	public void pageChanged(PageChangedEvent event) {
-		pageChangeCount++;
-		currentChangeEvent = event;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/TestKeyBindingMultiPageEditorPart.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/TestKeyBindingMultiPageEditorPart.java
deleted file mode 100644
index c84956e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/TestKeyBindingMultiPageEditorPart.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.multipageeditor;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IKeyBindingService;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.EditorPart;
-
-/**
- * A multi-page editor for testing key bindings while switching pages. This
- * is one of two pages -- each with a different context. The first context binds
- * "Ctrl+Shift+4" -- the second binds "Ctrl+Shift+5" -- to the command
- * "org.eclipse.ui.tests.TestCommand". Which context to use is determined by a
- * page number, which is passed as a parameter.
- * 
- * @since 3.0
- */
-public final class TestKeyBindingMultiPageEditorPart extends EditorPart {
-
-    /**
-     * The page number for this part.
-     *  
-     */
-    private final int number;
-
-    /**
-     * Constructs a new instance of <code>TestKeyBindingMultiPageEditorPart</code>
-     * with the page number of this page.
-     * 
-     * @param number
-     *            The page number for this part.
-     */
-    public TestKeyBindingMultiPageEditorPart(int number) {
-        super();
-        this.number = number;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-     */
-    public void createPartControl(Composite parent) {
-        Composite composite = new Composite(parent, SWT.NONE);
-        composite.setLayout(new RowLayout());
-        Text text1 = new Text(composite, SWT.NONE);
-        text1.setText("Blue"); //$NON-NLS-1$
-        Text text2 = new Text(composite, SWT.NONE);
-        text2.setText("Red"); //$NON-NLS-1$
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-     */
-    public void doSave(IProgressMonitor monitor) {
-        // Do nothing.
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.part.EditorPart#doSaveAs()
-     */
-    public void doSaveAs() {
-        throw new UnsupportedOperationException("Not implemented in this test."); //$NON-NLS-1$
-
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.part.EditorPart#gotoMarker(org.eclipse.core.resources.IMarker)
-     */
-    public void gotoMarker(IMarker marker) {
-        // Do nothing.
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite,
-     *      org.eclipse.ui.IEditorInput)
-     */
-    public void init(IEditorSite site, IEditorInput input)
-            throws PartInitException {
-        setInput(input);
-        setSite(site);
-        setPartName("Editor"); //$NON-NLS-1$
-        setTitleImage(input.getImageDescriptor().createImage());
-        setTitleToolTip("Moooooo"); //$NON-NLS-1$
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.part.EditorPart#isDirty()
-     */
-    public boolean isDirty() {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
-     */
-    public boolean isSaveAsAllowed() {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-     */
-    public void setFocus() {
-        final boolean odds = (number % 2) > 0;
-        final String scope1 = "org.eclipse.ui.tests.scope1"; //$NON-NLS-1$
-        final String scope2 = "org.eclipse.ui.tests.scope2"; //$NON-NLS-1$
-        IKeyBindingService keyBindingService = getEditorSite()
-                .getKeyBindingService();
-        keyBindingService.setScopes(new String[] { (odds) ? scope1 : scope2 });
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/TestMultiPageEditor.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/TestMultiPageEditor.java
deleted file mode 100644
index 5191bff..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/multipageeditor/TestMultiPageEditor.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.multipageeditor;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.MultiPageEditorPart;
-
-/**
- * A multi-page editor for testing key bindings while switching pages. This
- * creates two pages -- each with a different context. The first context binds
- * "Ctrl+Shift+4" -- the second binds "Ctrl+Shift+5" -- to the command
- * "org.eclipse.ui.tests.TestCommand".
- * 
- * @since 3.0
- */
-public final class TestMultiPageEditor extends MultiPageEditorPart {
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.part.MultiPageEditorPart#createPages()
-     */
-    protected void createPages() {
-        try {
-            IEditorPart part1 = new TestKeyBindingMultiPageEditorPart(0);
-            addPage(part1, getEditorInput());
-
-            IEditorPart part2 = new TestKeyBindingMultiPageEditorPart(1);
-            addPage(part2, getEditorInput());
-        } catch (PartInitException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-     */
-    public void doSave(IProgressMonitor monitor) {
-        // Do nothing.
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.part.EditorPart#doSaveAs()
-     */
-    public void doSaveAs() {
-        throw new UnsupportedOperationException("Not implemented in this test."); //$NON-NLS-1$
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.part.EditorPart#gotoMarker(org.eclipse.core.resources.IMarker)
-     */
-    public void gotoMarker(IMarker marker) {
-        // Do nothing.
-
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
-     */
-    public boolean isSaveAsAllowed() {
-        return false;
-    }
-
-    /**
-     * Sets the active page.
-     * 
-     * @param page
-     *            The page to activate; should be either <code>0</code> or
-     *            <code>1</code>.
-     */
-    public void setPage(int page) {
-        setActivePage(page);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/navigator/AbstractNavigatorTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/navigator/AbstractNavigatorTest.java
deleted file mode 100644
index c386027..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/navigator/AbstractNavigatorTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import java.io.ByteArrayInputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-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.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.views.navigator.ResourceNavigator;
-
-/**
- * The AbstractNavigatorTest is the abstract superclass
- * of tests that use a populated Resource Navigator.
- */
-public abstract class AbstractNavigatorTest extends UITestCase {
-
-    private static final String NAVIGATOR_VIEW_ID = "org.eclipse.ui.views.ResourceNavigator";
-
-    protected IProject testProject;
-
-    protected IFolder testFolder;
-
-    protected IFile testFile;
-
-    protected ResourceNavigator navigator;
-
-    public AbstractNavigatorTest(String testName) {
-        super(testName);
-    }
-
-    protected void createTestProject() throws CoreException {
-        if (testProject == null) {
-            IWorkspace workspace = ResourcesPlugin.getWorkspace();
-            testProject = workspace.getRoot().getProject("TestProject");
-            testProject.create(null);
-            testProject.open(null);
-        }
-    }
-
-    protected void createTestFolder() throws CoreException {
-        if (testFolder == null) {
-            createTestProject();
-            testFolder = testProject.getFolder("TestFolder");
-            testFolder.create(false, false, null);
-        }
-    }
-
-    protected void createTestFile() throws CoreException {
-        if (testFile == null) {
-            createTestFolder();
-            testFile = testFolder.getFile("Foo.txt");
-            testFile.create(
-                    new ByteArrayInputStream("Some content.".getBytes()),
-                    false, null);
-        }
-    }
-
-    /** Shows the Navigator in a new test window. */
-    protected void showNav() throws PartInitException {
-        IWorkbenchWindow window = openTestWindow();
-        navigator = (ResourceNavigator) window.getActivePage().showView(
-                NAVIGATOR_VIEW_ID);
-    }
-
-    protected void doTearDown() throws Exception {
-        if (testProject != null) {
-            try {
-                testProject.delete(true, null);
-            } catch (CoreException e) {
-                fail(e.toString());
-            }
-            testProject = null;
-            testFolder = null;
-            testFile = null;
-        }
-        super.doTearDown();
-        navigator = null;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/navigator/DuplicateMenuItemTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/navigator/DuplicateMenuItemTest.java
deleted file mode 100644
index b32803c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/navigator/DuplicateMenuItemTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import java.util.HashSet;
-
-import junit.framework.Assert;
-
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.internal.WorkbenchWindow;
-
-/**
- * The DuplicateMenuItemTest is a class for testing the popups
- * and window menus for the navigator to check for duplicate menu
- * entries.
- */
-public class DuplicateMenuItemTest extends AbstractNavigatorTest {
-
-    /**
-     * Constructor for DuplicateMenuItemTest.
-     * @param testName
-     */
-    public DuplicateMenuItemTest(String testName) {
-        super(testName);
-    }
-
-    public void testSelection() {
-
-        IStructuredSelection selection = new StructuredSelection(testProject);
-        checkSelection(selection);
-        selection = new StructuredSelection(testFolder);
-        checkSelection(selection);
-        selection = new StructuredSelection(testFile);
-        checkSelection(selection);
-    }
-
-    private void checkMenu(Menu menu, String menuName) {
-
-        MenuItem[] items = menu.getItems();
-        HashSet labels = new HashSet();
-        for (int i = 0; i < items.length; i++) {
-            String label = items[i].getText();
-            System.out.println(label);
-            Assert.assertTrue("Duplicate menu entry in: " + menuName + " "
-                    + label, !labels.contains(label));
-            if (items[i].getMenu() != null)
-                checkMenu(items[i].getMenu(), label);
-        }
-
-    }
-
-    private void checkWorkbenchMenu() {
-
-        MenuManager workbenchManager = ((WorkbenchWindow) navigator
-                .getViewSite().getWorkbenchWindow()).getMenuManager();
-
-        checkMenu(workbenchManager.getMenu(), "Workbench");
-    }
-
-    private void checkSelection(IStructuredSelection selection) {
-        navigator.selectReveal(selection);
-        checkWorkbenchMenu();
-    }
-
-    /**
-     * Sets up the hierarchy.
-     */
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        createTestFile();
-        showNav();
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/navigator/NavigatorTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/navigator/NavigatorTest.java
deleted file mode 100644
index 7ce7da1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/navigator/NavigatorTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.PartInitException;
-
-/**
- * Tests the Resource Navigator view.
- */
-public class NavigatorTest extends AbstractNavigatorTest {
-
-    public NavigatorTest(String testName) {
-        super(testName);
-    }
-
-    /**
-     * Tests that the Navigator is initially populated with
-     * the correct elements from the workspace.
-     */
-    public void testInitialPopulation() throws CoreException, PartInitException {
-        createTestFile();
-        showNav();
-
-        // test its initial content by setting and getting selection on the file
-        ISelectionProvider selProv = navigator.getSite().getSelectionProvider();
-        StructuredSelection sel = new StructuredSelection(testFile);
-        selProv.setSelection(sel);
-        assertEquals(sel.size(), ((IStructuredSelection)selProv.getSelection()).size());
-        assertEquals(sel.getFirstElement(), ((IStructuredSelection)selProv.getSelection()).getFirstElement());
-    }
-
-    /**
-     * Tests that the Navigator updates properly when a file is added to the workbench.
-     */
-    public void testFileAddition() throws CoreException, PartInitException {
-        createTestFolder(); // create the project and folder before the Navigator is shown
-        showNav();
-        createTestFile(); // create the file after the Navigator is shown
-
-        // test its initial content by setting and getting selection on the file
-        ISelectionProvider selProv = navigator.getSite().getSelectionProvider();
-        StructuredSelection sel = new StructuredSelection(testFile);
-        selProv.setSelection(sel);
-        assertEquals(sel.size(), ((IStructuredSelection)selProv.getSelection()).size());
-        assertEquals(sel.getFirstElement(), ((IStructuredSelection)selProv.getSelection()).getFirstElement());
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/navigator/NavigatorTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/navigator/NavigatorTestSuite.java
deleted file mode 100644
index 37c3065..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/navigator/NavigatorTestSuite.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class NavigatorTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite.  This is required to
-     * use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new NavigatorTestSuite();
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public NavigatorTestSuite() {
-        addTest(new TestSuite(ResourceNavigatorTest.class));
-        addTest(new TestSuite(NavigatorTest.class));
-    }
-
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/navigator/ResourceNavigatorTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/navigator/ResourceNavigatorTest.java
deleted file mode 100644
index 39f7881..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/navigator/ResourceNavigatorTest.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.navigator;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.part.ISetSelectionTarget;
-import org.eclipse.ui.tests.harness.util.ActionUtil;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.views.navigator.ResourceNavigator;
-
-public class ResourceNavigatorTest extends UITestCase {
-    private IWorkbenchPage activePage;
-
-    private IWorkbenchWindow workbenchWindow;
-
-    private IViewPart view;
-
-    private IProject p1;
-
-    private IProject p2;
-
-    private IFile f1;
-
-    private IFile f2;
-
-    /**
-     * Constructor for ResourceNavigatorTest.
-     * @param testName
-     */
-    public ResourceNavigatorTest(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        workbenchWindow = openTestWindow();
-        activePage = workbenchWindow.getActivePage();
-    }
-
-    private void setupView() throws Throwable {
-        view = activePage.showView("org.eclipse.ui.views.ResourceNavigator");
-    }
-
-    private void setupResources() throws Throwable {
-        if (p1 == null) {
-            p1 = FileUtil.createProject("TP1");
-            f1 = null;
-        }
-        if (p2 == null) {
-            p2 = FileUtil.createProject("TP2");
-            f2 = null;
-        }
-        if (f1 == null)
-            f1 = FileUtil.createFile("f1.txt", p1);
-        if (f2 == null)
-            f2 = FileUtil.createFile("f2.txt", p2);
-    }
-
-    public void fixTestGlobalBookmarkAction() throws Throwable {
-        setupView();
-        setupResources();
-
-        // Select a file
-        IStructuredSelection sel = new StructuredSelection(f1);
-        ((ResourceNavigator) view).selectReveal(sel);
-
-        // Remember the previous marker count on the file
-        int oldCount = (f1.findMarkers(IMarker.BOOKMARK, true,
-                IResource.DEPTH_INFINITE)).length;
-
-        // Now try the bookmark action
-        ActionUtil.runActionUsingPath(this, workbenchWindow,
-                IWorkbenchActionConstants.M_EDIT + '/'
-                        + IWorkbenchActionConstants.BOOKMARK);
-
-        // Make sure the resource was bookmarked
-        int newCount = (f1.findMarkers(IMarker.BOOKMARK, true,
-                IResource.DEPTH_INFINITE)).length;
-        assertTrue(
-                "Selected file was not bookmarked via Edit->Bookmark action.",
-                oldCount + 1 == newCount);
-    }
-
-    /*	
-     * This test should be moved to an interactive test suite as this
-     * test causes a dialog to popup when the resource is deleted by
-     * the delete action
-     * 
-     public void testGlobalDeleteAction() throws Throwable {
-     setupView();
-     setupResources();
-
-     // Select a file
-     IStructuredSelection sel = new StructuredSelection(f1);
-     ((ResourceNavigator) view).selectReveal(sel);
-     
-     // Now try the delete action
-     ActionUtil.runActionUsingPath(this, workbenchWindow, IWorkbenchActionConstants.M_EDIT + '/' + IWorkbenchActionConstants.DELETE);
-     
-     // Make sure the resource was deleted
-     assertTrue("Selected file was not deleted via Edit->Delete action.", p1.findMember(f1.getName()) == null);
-     f1 = null;
-     }
-     */
-
-    public void testSelectReveal() throws Throwable {
-        setupView();
-        setupResources();
-
-        ISetSelectionTarget part = (ISetSelectionTarget) view;
-        TreeViewer tree = ((ResourceNavigator) view).getViewer();
-
-        // Set the selection in the navigator
-        IStructuredSelection sel1 = new StructuredSelection(f1);
-        part.selectReveal(sel1);
-        // Get the selection the tree has
-        IStructuredSelection treeSel1 = (IStructuredSelection) tree
-                .getSelection();
-        assertTrue("First selection wrong size, should be only one.", treeSel1
-                .size() == 1);
-        IResource resource1 = (IResource) treeSel1.getFirstElement();
-        assertTrue("First selection contains wrong file resource.", resource1
-                .equals(f1));
-
-        // Set the selection in the navigator
-        IStructuredSelection sel2 = new StructuredSelection(p2);
-        part.selectReveal(sel2);
-        // Get the selection the tree has
-        IStructuredSelection treeSel2 = (IStructuredSelection) tree
-                .getSelection();
-        assertTrue("Second selection wrong size, should be only one.", treeSel2
-                .size() == 1);
-        IResource resource2 = (IResource) treeSel2.getFirstElement();
-        assertTrue("Second selection contains wrong project resource.",
-                resource2.equals(p2));
-    }
-
-    public void testWorkingSet() throws Throwable {
-        setupView();
-        setupResources();
-
-        ResourceNavigator navigator = ((ResourceNavigator) view);
-        IWorkingSetManager workingSetManager = fWorkbench
-                .getWorkingSetManager();
-        IWorkingSet workingSet = workingSetManager.createWorkingSet("ws1",
-                new IAdaptable[] { f1 });
-
-        assertNull(navigator.getWorkingSet());
-
-        navigator.setWorkingSet(workingSet);
-        assertEquals(workingSet, navigator.getWorkingSet());
-
-        navigator.setWorkingSet(null);
-        assertNull(navigator.getWorkingSet());
-
-        FileUtil.createFile("f11.txt", p1);
-        navigator.setWorkingSet(workingSet);
-        TreeViewer viewer = navigator.getTreeViewer();
-        viewer.expandAll();
-        TreeItem[] items = viewer.getTree().getItems();
-        assertEquals(p1, items[0].getData());
-        items = items[0].getItems();
-        assertEquals(f1, items[0].getData());
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/AdvancedTestOperation.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/AdvancedTestOperation.java
deleted file mode 100644
index baa9825..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/AdvancedTestOperation.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.operations;
-
-import org.eclipse.core.commands.operations.IAdvancedUndoableOperation;
-import org.eclipse.core.commands.operations.IOperationHistory;
-import org.eclipse.core.commands.operations.OperationHistoryEvent;
-import org.eclipse.core.commands.operations.OperationStatus;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * @since 3.1
- */
-public class AdvancedTestOperation extends TestOperation implements
-		IAdvancedUndoableOperation {
-
-	static final int INFO = 0;
-
-	static final int ERROR = 1;
-
-	static final int WARNING = 2;
-
-	public int status = 0;
-
-	public AdvancedTestOperation() {
-		super("A very long string that exceeds the menu label limit");
-	}
-
-	public void aboutToNotify(OperationHistoryEvent event) {
-		// do nothing
-	}
-
-	public Object[] getAffectedObjects() {
-		return null;
-	}
-
-	public IStatus computeUndoableStatus(IProgressMonitor monitor) {
-		switch (status) {
-		case INFO:
-			return IOperationHistory.NOTHING_TO_UNDO_STATUS;
-		case ERROR:
-			return IOperationHistory.OPERATION_INVALID_STATUS;
-		case WARNING:
-			return new OperationStatus(IStatus.WARNING, "org.eclipse.ui.tests", 0, "Undo warning message", null); //$NON-NLS-1$
-		}
-		return Status.OK_STATUS;
-	}
-
-	public IStatus computeRedoableStatus(IProgressMonitor monitor) {
-		switch (status) {
-		case INFO:
-			return IOperationHistory.NOTHING_TO_REDO_STATUS;
-		case ERROR:
-			return IOperationHistory.OPERATION_INVALID_STATUS;
-		case WARNING:
-			return new OperationStatus(IStatus.WARNING, "org.eclipse.ui.tests", 0, "Redo warning message", null); //$NON-NLS-1$
-		}
-		return Status.OK_STATUS;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/MultiThreadedOperationsTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/MultiThreadedOperationsTests.java
deleted file mode 100644
index 691d7b5..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/MultiThreadedOperationsTests.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.operations;
-
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Runs the operations API tests and workbench operation history tests from
- * background threads
- * 
- * @since 3.1
- */
-public class MultiThreadedOperationsTests extends UITestCase {
-
-	public MultiThreadedOperationsTests(String name) {
-		super(name);
-	}
-
-	public void testOperationsAPIinThreads() {
-		// run the operations API test suite from three different jobs.
-		class OperationsTestJob extends Job {
-			public OperationsTestJob() {
-				super("Operations Test Job");
-			}
-
-			public IStatus run(IProgressMonitor monitor) {
-				// System.out.println("Running OperationsAPITest from background job");
-				new TestSuite(OperationsAPITest.class).run(new TestResult());
-				// System.out.println("Running WorkbenchOperationHistoryTests from background job");
-				new TestSuite(WorkbenchOperationHistoryTests.class).run(new TestResult());
-				return Status.OK_STATUS;
-			}
-		}
-
-		OperationsTestJob job1 = new OperationsTestJob();
-		OperationsTestJob job2 = new OperationsTestJob();
-		OperationsTestJob job3 = new OperationsTestJob();
-
-		job1.schedule();
-		job2.schedule();
-		job3.schedule();
-
-		// don't return from the test method until the jobs are complete.
-		try {
-			job1.join();
-		} catch (InterruptedException e) {
-			System.out.println("Job interrupted in test case");
-		}
-		try {
-			job2.join();
-		} catch (InterruptedException e) {
-			System.out.println("Job interrupted in test case");
-		}
-		try {
-			job3.join();
-		} catch (InterruptedException e) {
-			System.out.println("Job interrupted in test case");
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/OperationsAPITest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/OperationsAPITest.java
deleted file mode 100644
index c5079b0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/OperationsAPITest.java
+++ /dev/null
@@ -1,799 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.operations;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.AbstractOperation;
-import org.eclipse.core.commands.operations.DefaultOperationHistory;
-import org.eclipse.core.commands.operations.ICompositeOperation;
-import org.eclipse.core.commands.operations.IOperationApprover2;
-import org.eclipse.core.commands.operations.IOperationHistoryListener;
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.commands.operations.IOperationApprover;
-import org.eclipse.core.commands.operations.IOperationHistory;
-import org.eclipse.core.commands.operations.LinearUndoEnforcer;
-import org.eclipse.core.commands.operations.ObjectUndoContext;
-import org.eclipse.core.commands.operations.OperationHistoryEvent;
-import org.eclipse.core.commands.operations.OperationHistoryFactory;
-import org.eclipse.core.commands.operations.OperationStatus;
-import org.eclipse.core.commands.operations.TriggeredOperations;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.tests.internal.ForcedException;
-
-/**
- * Tests the Operations Framework API.
- * 
- * @since 3.1
- */
-public class OperationsAPITest extends TestCase {
-	
-	// number of operations to perform a stress test
-	static int STRESS_NUM = 5000;
-
-	ObjectUndoContext contextA, contextB, contextC, contextW;
-	IOperationHistory history;
-
-	IUndoableOperation op1, op2, op3, op4, op5, op6, localA, localB, localC;
-	ICompositeOperation refactor;
-	
-	int preExec, postExec, preUndo, postUndo, preRedo, postRedo, add, remove, notOK, changed = 0;
-	IOperationHistoryListener listener;
-
-	public OperationsAPITest() {
-		super();
-	}
-
-	/**
-	 * @param testName
-	 */
-	public OperationsAPITest(String name) {
-		super(name);
-	}
-
-	protected void setUp() throws Exception {
-		history = new DefaultOperationHistory();
-		contextA = new ObjectUndoContext("A");
-		contextB = new ObjectUndoContext("B");
-		contextC = new ObjectUndoContext("C");
-		op1 = new TestOperation("op1");
-		op1.addContext(contextA);
-		op2 = new TestOperation("op2");
-		op2.addContext(contextB);
-		op2.addContext(contextC);
-		op3 = new TestOperation("op3");
-		op3.addContext(contextC);
-		op4 = new TestOperation("op4");
-		op4.addContext(contextA);
-		op5 = new TestOperation("op5");
-		op5.addContext(contextB);
-		op6 = new TestOperation("op6");
-		op6.addContext(contextC);
-		op6.addContext(contextA);
-		history.execute(op1, null, null);
-		history.execute(op2, null, null);
-		history.execute(op3, null, null);
-		history.execute(op4, null, null);
-		history.execute(op5, null, null);
-		history.execute(op6, null, null);
-		preExec = 0; postExec = 0;
-		preUndo = 0; postUndo = 0; 
-		preRedo = 0; postRedo = 0;
-		add = 0; remove = 0; notOK = 0;
-		listener = new IOperationHistoryListener() {
-			public void historyNotification(OperationHistoryEvent event) {
-				switch (event.getEventType()) {
-				case OperationHistoryEvent.ABOUT_TO_EXECUTE:
-					preExec++;
-					break;
-				case OperationHistoryEvent.ABOUT_TO_UNDO:
-					preUndo++;
-					break;
-				case OperationHistoryEvent.ABOUT_TO_REDO:
-					preRedo++;
-					break;
-				case OperationHistoryEvent.DONE:
-					postExec++;
-					break;
-				case OperationHistoryEvent.UNDONE:
-					postUndo++;
-					break;
-				case OperationHistoryEvent.REDONE:
-					postRedo++;
-					break;
-				case OperationHistoryEvent.OPERATION_ADDED:
-					add++;
-					break;
-				case OperationHistoryEvent.OPERATION_REMOVED:
-					remove++;
-					break;
-				case OperationHistoryEvent.OPERATION_NOT_OK:
-					notOK++;
-					break;
-				case OperationHistoryEvent.OPERATION_CHANGED:
-					changed++;
-					break;
-				}
-			}
-		};
-		history.addOperationHistoryListener(listener);
-
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		history.removeOperationHistoryListener(listener);
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, false);
-	}
-
-	public void testContextDispose() throws ExecutionException {
-		assertSame(history.getUndoOperation(contextA), op6);
-		assertSame(history.getUndoOperation(contextC), op6);
-		history.dispose(contextA, true, true, false);
-		assertSame(history.getUndoOperation(contextC), op6);
-		assertFalse(op6.hasContext(contextA));
-		history.undo(contextC, null, null);
-		history.dispose(contextC, true, false, false);
-		assertFalse(history.canUndo(contextC));
-		assertTrue(history.canRedo(contextC));
-		history.redo(contextC, null, null);
-		IUndoableOperation[] ops = history.getUndoHistory(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertEquals(ops.length, 3);
-		ops = history.getUndoHistory(contextC);
-		assertEquals(ops.length, 1);
-		ops = history.getUndoHistory(contextB);
-		assertEquals(ops.length, 2);
-	}
-
-	public void testContextHistories() throws ExecutionException {
-		assertSame(history.getUndoOperation(contextA), op6);
-		assertSame(history.getUndoOperation(contextB), op5);
-		assertSame(history.getUndoOperation(contextC), op6);
-		IStatus status = history.undo(contextC, null, null);
-		assertTrue("Status should be ok", status.isOK());
-		assertSame(history.getRedoOperation(contextC), op6);
-		assertSame(history.getUndoOperation(contextC), op3);
-		assertTrue("Should be able to redo in c3", history.canRedo(contextC));
-		assertTrue("Should be able to redo in c1", history.canRedo(contextA));
-		history.redo(contextA, null, null);
-		assertSame(history.getUndoOperation(contextC), op6);
-		assertSame(history.getUndoOperation(contextA), op6);
-	}
-
-	public void testHistoryLimit() throws ExecutionException {
-		history.setLimit(contextA, 2);
-		assertTrue(history.getUndoHistory(contextA).length == 2);
-		history.add(op1);
-		assertTrue(history.getUndoHistory(contextA).length == 2);
-		history.setLimit(contextB, 1);
-		assertTrue(history.getUndoHistory(contextB).length == 1);
-		assertFalse(op2.hasContext(contextB));
-		history.undo(contextB, null, null);
-		assertTrue(history.getRedoHistory(contextB).length == 1);
-		assertTrue(history.getUndoHistory(contextB).length == 0);
-		history.redo(contextB, null, null);
-		assertTrue(history.getRedoHistory(contextB).length == 0);
-		assertTrue(history.getUndoHistory(contextB).length == 1);
-	}
-	
-	public void testLocalHistoryLimits() throws ExecutionException {
-		history.setLimit(contextC, 2);
-		assertTrue(history.getUndoHistory(contextC).length == 2);
-		// op2 should have context c3 removed as part of forcing the limit
-		assertFalse(op2.hasContext(contextC));
-		assertTrue(history.getUndoHistory(contextB).length == 2);
-		
-		history.setLimit(contextB, 1);
-		assertTrue(history.getUndoHistory(contextB).length == 1);
-		history.undo(contextB, null, null);
-		op2.addContext(contextC);
-		history.add(op2);
-		assertSame(history.getUndoOperation(contextB), op2);
-		assertTrue(history.getUndoHistory(contextB).length == 1);
-		
-		history.setLimit(contextA, 0);
-		assertTrue(history.getUndoHistory(contextA).length == 0);
-		history.add(op1);
-		assertTrue(history.getUndoHistory(contextA).length == 0);		
-	}
-	
-	public void testOpenOperation() throws ExecutionException {
-		// clear out history which will also reset operation execution counts
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, false);
-		ICompositeOperation batch = new TriggeredOperations(op1, history);
-		history.openOperation(batch, IOperationHistory.EXECUTE);
-		op1.execute(null, null);
-		op2.execute(null, null);
-		history.add(op2);
-		history.execute(op3, null, null);
-		IUndoableOperation op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertTrue("no operations should be in history yet", op == null);
-		history.closeOperation(true, true, IOperationHistory.EXECUTE);
-		op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertTrue("Operation should be batching", op == batch);
-		op.removeContext(contextB);
-		assertFalse("Operation should not have context", op.hasContext(contextB));
-	}
-	
-	public void testExceptionDuringOpenOperation() throws ExecutionException {
-		// clear out history which will also reset operation execution counts
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, false);
-		IUndoableOperation op = new AbstractOperation("Operation with Exception") {
-			public IStatus execute(IProgressMonitor monitor, IAdaptable uiInfo) {
-				return Status.OK_STATUS;
-			}
-			public IStatus undo(IProgressMonitor monitor, IAdaptable uiInfo) {
-				throw new ForcedException("Forced during undo");
-			}
-			public IStatus redo(IProgressMonitor monitor, IAdaptable uiInfo) {
-				throw new ForcedException("Forced during redo");
-			}
-		};
-
-		ICompositeOperation batch = new TriggeredOperations(op, history);
-		history.openOperation(batch, IOperationHistory.EXECUTE);
-		op.execute(null, null);
-		op1.execute(null, null);
-		history.add(op1);
-		history.execute(op2, null, null);
-		history.closeOperation(true, true, IOperationHistory.EXECUTE);
-		// when we undo the batch operation, the triggering op will throw the 
-		// ForcedException.  This is expected. 
-		try {
-			batch.undo(null, null);
-		} catch (ForcedException e) {
-			// expected, no cause for panic.
-		}
-		
-		// See bug #134238.  Before this bug was fixed, we would get an 
-		// IllegalStateException upon trying to open a composite.  If cleanup
-		// after the above exception is done, then we shouldn't get an
-		// IllegalStateException.
-		try {
-			history.openOperation(new TriggeredOperations(op3, history), IOperationHistory.EXECUTE);
-			history.closeOperation(true, true, IOperationHistory.EXECUTE);
-		} catch (IllegalStateException e) {
-			assertTrue("IllegalStateException - trying to open an operation before a close", false);
-		}
-	}
-	
-	public void test94459() throws ExecutionException {
-		// clear out history which will also reset operation execution counts
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, false);
-		op2.execute(null, null);
-		ICompositeOperation batch = new TriggeredOperations(op2, history);
-		history.openOperation(batch, IOperationHistory.EXECUTE);
-		history.setLimit(contextA, 0);
-		op1.execute(null, null);
-		history.add(op1);
-		history.closeOperation(true, true, IOperationHistory.EXECUTE);
-		IUndoableOperation op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertTrue("Operation should be batching", op == batch);
-		assertFalse("Operation should not have context", op.hasContext(contextA));
-	}
-	
-	public void test94459AllContextsEmpty() throws ExecutionException {
-		// clear out history which will also reset operation execution counts
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, false);
-		op2.execute(null, null);
-		ICompositeOperation batch = new TriggeredOperations(op2, history);
-		history.openOperation(batch, IOperationHistory.EXECUTE);
-		history.setLimit(contextA, 0);
-		history.setLimit(contextB, 0);
-		history.setLimit(contextC, 0);
-		op1.execute(null, null);
-		history.add(op1);
-		history.closeOperation(true, true, IOperationHistory.EXECUTE);
-		IUndoableOperation op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertTrue("Operation should not have been added", op == null);
-	}
-
-	/*
-	 * Test updated for 3.2 in light of 
-	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=123316
-	 * The expected behavior has changed.
-	 */
-	public void test94400() throws ExecutionException {
-		UnredoableTestOperation op = new UnredoableTestOperation("troubled op");
-		op.addContext(contextA);
-		history.execute(op, null, null);
-		assertTrue("Operation should be undoable", history.canUndo(contextA));
-		history.undo(contextA, null, null);
-		assertTrue("Operation should still be in redo history", history.getRedoOperation(contextA) == op);
-		assertFalse("Operation should not be disposed", op.disposed);
-	}
-	
-	/*
-	 * Similar to the test above, except that we are going to change the
-	 * operation history limit and check that we disposed the operation properly.
-	 */
-	public void test123316() throws ExecutionException {
-		UnredoableTestOperation op = new UnredoableTestOperation("troubled op");
-		op.addContext(contextA);
-		history.setLimit(contextA, 0);
-		history.execute(op, null, null);
-		assertFalse("Should be nothing to undo", history.canUndo(contextA));
-		assertTrue("Operation should be disposed", op.disposed);
-	}
-	
-	
-	public void testUnsuccessfulOpenOperation() throws ExecutionException {
-		// clear out history which will also reset operation execution counts
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, false);
-		ICompositeOperation batch = new TriggeredOperations(op1, history);
-		history.openOperation(batch, IOperationHistory.EXECUTE);
-		op1.execute(null, null);
-		op2.execute(null, null);
-		history.add(op2);
-		history.execute(op3, null, null);
-		IUndoableOperation op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertTrue("no operations should be in history yet", op == null);
-		history.closeOperation(false, true, IOperationHistory.EXECUTE);
-		op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertNull("Unsuccessful operation should not be added to history", op);
-		assertTrue("NOT_OK notification should have been received", notOK == 1);
-		assertTrue("DONE should not be sent while batching", postExec == 0);
-		assertTrue("ADDED should not have been sent while batching", add == 0);
-	}
-	
-	public void testNotAddedOpenOperation() throws ExecutionException {
-		// clear out history which will also reset operation execution counts
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, false);
-		ICompositeOperation batch = new TriggeredOperations(op1, history);
-		history.openOperation(batch, IOperationHistory.EXECUTE);
-		op1.execute(null, null);
-		op2.execute(null, null);
-		history.add(op2);
-		history.execute(op3, null, null);
-		IUndoableOperation op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertTrue("no operations should be in history yet", op == null);
-		history.closeOperation(true, false, IOperationHistory.EXECUTE);
-		op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertNull("Operation should not be added to history", op);
-		assertTrue("DONE notification should have been received", postExec == 1);
-		assertTrue("ADDED should not have occurred or be sent while batching", add == 0);
-	}
-	
-	public void testMultipleOpenOperation() throws ExecutionException {
-		// clear out history which will also reset operation execution counts
-		boolean failure = false;
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, false);
-		ICompositeOperation comp1 = new TriggeredOperations(op1, history);
-		history.openOperation(comp1, IOperationHistory.EXECUTE);
-		op1.execute(null, null);
-		op2.execute(null, null);
-		history.add(op2);
-		history.execute(op3, null, null);
-		ICompositeOperation comp2 = new TriggeredOperations(op4, history);
-		try {
-			history.openOperation(comp2, IOperationHistory.EXECUTE);
-		} catch (IllegalStateException e) {
-			failure = true;
-		}
-		assertTrue("Exception should have been thrown for second open operation", failure);
-		IUndoableOperation op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertNull("Unexpected nested open should not add original", op);
-		history.closeOperation(true, true, IOperationHistory.EXECUTE);
-		op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertSame("First operation should be closed", op, comp1);
-	}
-	
-	public void testAbortedOpenOperation() throws ExecutionException {
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, false);
-		history.openOperation(new TriggeredOperations(op1, history), IOperationHistory.EXECUTE);
-		op1.execute(null, null);
-		history.execute(op2, null, null);
-		// flush history while operation is open
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, false);
-		// op3 should be added as its own op since we flushed while open
-		history.add(op3);
-		// should really have no effect
-		history.closeOperation(true, true, IOperationHistory.EXECUTE);
-		IUndoableOperation op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertTrue("Open operation should be flushed", op == op3);
-	}
-
-	public void testOperationApproval() throws ExecutionException {
-		history.addOperationApprover(new LinearUndoEnforcer());
-		// the first undo should be fine
-		IStatus status = history.undo(contextB, null, null);
-		assertTrue(status.isOK());
-
-		// the second causes a linear violation on C
-		assertTrue(history.canUndo(contextB));
-		status = history.undo(contextB, null, null);
-		assertFalse(status.isOK());
-
-		// undo the newer C items
-		status = history.undo(contextC, null, null);
-		assertTrue(status.isOK());
-		status = history.undo(contextC, null, null);
-		assertTrue(status.isOK());
-
-		// now we should be okay in B
-		status = history.undo(contextB, null, null);
-		assertTrue(status.isOK());
-
-		history.addOperationApprover(new IOperationApprover() {
-
-			public IStatus proceedRedoing(IUndoableOperation o, IOperationHistory h, IAdaptable a) {
-				return Status.CANCEL_STATUS;
-			}
-			public IStatus proceedUndoing(IUndoableOperation o, IOperationHistory h, IAdaptable a) {
-				return Status.CANCEL_STATUS;
-			}
-		});
-		// everything should fail now
-		assertFalse(history.redo(contextB, null, null).isOK());
-		assertFalse(history.redo(contextC, null, null).isOK());
-		assertFalse(history.undo(contextA, null, null).isOK());
-		assertFalse(history.undo(contextB, null, null).isOK());
-		assertFalse(history.undo(contextC, null, null).isOK());
-	}
-
-	public void testOperationFailure() throws ExecutionException {
-		history.addOperationApprover(new IOperationApprover() {
-
-			public IStatus proceedRedoing(IUndoableOperation o, IOperationHistory h, IAdaptable a) {
-				return Status.OK_STATUS;
-			}
-			public IStatus proceedUndoing(IUndoableOperation o, IOperationHistory h, IAdaptable a) {
-				if (o == op6)
-					return Status.CANCEL_STATUS;
-				if (o == op5)
-					return new OperationStatus(IStatus.ERROR, "org.eclipse.ui.tests", 0, "Error", null);
-				return Status.OK_STATUS;
-			}
-		});
-
-		// should fail but still keep op6 on the stack since it's cancelled
-		IStatus status = history.undo(contextC, null, null);
-		assertFalse(status.isOK());
-		assertSame(history.getUndoOperation(contextC), op6);
-
-		// should fail since it's an error
-		status = history.undo(contextB, null, null);
-		assertFalse(status.isOK());
-
-		// operation remains on stack (see bug#92506)
-		assertSame(history.getUndoOperation(contextB), op5);
-	}
-
-	public void testOperationRedo() throws ExecutionException {
-		history.undo(contextB, null, null);
-		history.undo(contextB, null, null);
-		history.undo(contextC, null, null);
-		history.undo(contextC, null, null);
-		assertSame(history.getRedoOperation(contextB), op2);
-		assertSame(history.getUndoOperation(contextA), op4);
-		assertTrue(history.canUndo(contextA));
-		assertFalse(history.canUndo(contextB));
-		assertFalse(history.canUndo(contextC));
-		assertTrue(preUndo == 4);
-		assertTrue(postUndo == 4);
-		history.redo(contextB, null, null);
-		assertTrue(postRedo == 1);
-		assertTrue(history.canUndo(contextB));
-		assertTrue(history.canUndo(contextC));
-	}
-
-	public void testOperationUndo() throws ExecutionException {
-		history.undo(contextA, null, null);
-		history.undo(contextA, null, null);
-		assertSame(history.getRedoOperation(contextA), op4);
-		assertSame(history.getUndoOperation(contextA), op1);
-		history.undo(contextA, null, null);
-		assertTrue(preUndo == 3);
-		assertTrue(postUndo == 3);
-		assertFalse("Shouldn't be able to undo in c1", history.canUndo(contextA));
-		assertTrue("Should be able to undo in c2", history.canUndo(contextB));
-		assertTrue("Should be able to undo in c3", history.canUndo(contextC));
-	}
-	
-	public void testHistoryFactory() {
-		IOperationHistory anotherHistory = OperationHistoryFactory.getOperationHistory();
-		assertNotNull(anotherHistory);
-	}
-	
-	public void testOperationChanged() {
-		history.operationChanged(op1);
-		history.operationChanged(op2);
-		history.operationChanged(new TestOperation("New op"));
-		assertTrue("should not notify about changes if not in the history", changed == 2);
-	}
-	
-	// the setup for the infamous (local conflict on top of composite and composite gets pruned) case
-	private void setup87675() throws ExecutionException {
-		// clear everything out.  special setup for this test case
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, false);
-		contextA = new ObjectUndoContext("A");
-		contextB = new ObjectUndoContext("B");
-		contextC = new ObjectUndoContext("C");
-		contextW = new ObjectUndoContext("W");
-		history.addOperationApprover(new LinearUndoEnforcer());
-		
-		// local edits on A, B, C are added first
-		IUndoableOperation op = new TestOperation("op1a");
-		op.addContext(contextA);
-		history.execute(op, null, null);
-		op = new TestOperation("op1b");
-		op.addContext(contextB);
-		history.execute(op, null, null);
-		op = new TestOperation("op1c");
-		op.addContext(contextC);
-		history.execute(op, null, null);
-		
-		// now we create the "refactoring op" which touches them all
-		op = new TestOperation("Refactoring");
-		op.addContext(contextW);
-		op.execute(null, null);
-		refactor = new TriggeredOperations(op, history);
-		history.openOperation(refactor, IOperationHistory.EXECUTE);
-		localA = new TestOperation("op2a");
-		localA.addContext(contextA);
-		history.execute(localA, null, null);
-		localB = new TestOperation("op2b");
-		localB.addContext(contextB);
-		history.execute(localB, null, null);
-		localC = new TestOperation("op2c");
-		localC.addContext(contextC);
-		history.execute(localC, null, null);
-		
-		// close off the composite
-		history.closeOperation(true, true, IOperationHistory.EXECUTE);
-		
-		// subsequent local edit to C
-		op = new TestOperation("op3c");
-		op.addContext(contextC);
-		history.execute(op, null, null);
-	}
-	
-	public void test87675_split() throws ExecutionException {
-		setup87675();
-		IUndoableOperation op;
-		
-		// check setup
-		op = history.getUndoOperation(contextA);
-		assertTrue("Refactoring should be next op for context A", op == refactor);
-		op = history.getUndoOperation(contextB);
-		assertTrue("Refactoring should be next op for context B", op == refactor);
-		op = history.getUndoOperation(contextW);
-		assertTrue("Refactoring should be next op for context W", op == refactor);
-		op = history.getUndoOperation(contextC);
-		assertFalse("Refactoring should not be next op for context C", op == refactor);
-
-		// try a bogus undo
-		IStatus status = history.undo(contextW, null, null);
-		assertFalse("Undo should not be permitted due to linear conflict", status.isOK());
-		
-		// prune the history for contextW
-		history.dispose(contextW, true, true, false);
-		
-		// refactoring op should have been broken up into pieces
-		op = history.getUndoOperation(contextA);
-		assertTrue("Local edit A should be atomic", op == localA);
-		op = history.getUndoOperation(contextB);
-		assertTrue("Local edit B should be atomic", op == localB);
-		op = history.getUndoOperation(contextC);
-		assertFalse("Local edit C should not be refactoring edit", op == localC);
-		
-		// now the refactoring C edit should be the next one
-		history.undo(contextC, null, null);
-		op = history.getUndoOperation(contextC);
-		assertTrue("Local edit C should be refactoring edit", op == localC);
-	}
-	
-	public void test87675_undoredo() throws ExecutionException {
-		setup87675();
-		IUndoableOperation op;
-		
-		// undo the local edit to C
-		history.undo(contextC, null, null);
-		
-		// undo the refactoring operation via context C
-		history.undo(contextC, null, null);
-		
-		// check that there are no new operations in the undo list for A, B, C
-		op = history.getUndoOperation(contextC);
-		assertTrue("Local edit C should be original edit", op.getLabel().equals("op1c"));
-
-		op = history.getUndoOperation(contextB);
-		assertTrue("Local edit B should be original edit", op.getLabel().equals("op1b"));
-
-		op = history.getUndoOperation(contextA);
-		assertTrue("Local edit A should be original edit", op.getLabel().equals("op1a"));
-		
-		// test that the redo operation has all contexts
-		op = history.getRedoOperation(contextW);
-		assertTrue("operation should have context A", op.hasContext(contextA));
-		assertTrue("operation should have context B", op.hasContext(contextB));
-		assertTrue("operation should have context C", op.hasContext(contextC));
-		
-		// now redo the operation
-		history.redo(contextA, null, null);
-		
-		// test that the next undo is our refactoring operation
-		op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertTrue("operation should have context W", op.hasContext(contextW));
-		
-		// undo again and check that no side effect ops were left on the undo stack
-		history.undo(contextW, null, null);
-
-		op = history.getUndoOperation(contextC);
-		assertTrue("Local edit C should be original edit", op.getLabel().equals("op1c"));
-
-		op = history.getUndoOperation(contextB);
-		assertTrue("Local edit B should be original edit", op.getLabel().equals("op1b"));
-
-		op = history.getUndoOperation(contextA);
-		assertTrue("Local edit A should be original edit", op.getLabel().equals("op1a"));
-		
-	}
-	
-	public void testOperationApprover2() throws ExecutionException {
-		// clear out the history
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, false);
-
-		history.addOperationApprover(new IOperationApprover2() {
-
-			public IStatus proceedRedoing(IUndoableOperation o, IOperationHistory h, IAdaptable a) {
-				return Status.OK_STATUS;
-			}
-			public IStatus proceedExecuting(IUndoableOperation o, IOperationHistory h, IAdaptable a) {
-				if (o == op6)
-					return Status.CANCEL_STATUS;
-				return Status.OK_STATUS;
-			}
-			public IStatus proceedUndoing(IUndoableOperation o, IOperationHistory h, IAdaptable a) {
-				return Status.OK_STATUS;
-			}
-		});
-		IStatus status = history.execute(op1, null, null);
-		assertTrue(status.isOK());
-		assertTrue(preExec == 1 && postExec == 1);
-		
-		status = history.execute(op6, null, null);
-		assertFalse(status.isOK());
-		// listener counts should not have changed
-		assertTrue(preExec == 1 && postExec == 1);
-	}
-	
-	public void testReplaceContext() throws ExecutionException {
-		// clear out history which will also reset operation execution counts
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, false);
-		TriggeredOperations batch = new TriggeredOperations(op1, history);
-		history.openOperation(batch, IOperationHistory.EXECUTE);
-		op1.execute(null, null);
-		op2.execute(null, null);
-		history.add(op2);
-		history.execute(op3, null, null);
-		IUndoableOperation op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertTrue("no operations should be in history yet", op == null);
-		history.closeOperation(true, true, IOperationHistory.EXECUTE);
-		op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertTrue("Operation should be batching", op == batch);
-		IUndoContext contextD = new ObjectUndoContext("D");
-		batch.replaceContext(contextC, contextD);
-		assertFalse("Operation should not have context", batch.hasContext(contextC));
-		assertFalse("Operation should not have context", op1.hasContext(contextC));
-		assertFalse("Operation should not have context", op2.hasContext(contextC));
-		assertFalse("Operation should not have context", op3.hasContext(contextC));
-		batch.replaceContext(contextD, contextC);
-		assertTrue("Operation should have context", batch.hasContext(contextC));
-		assertFalse("Operation should not have context", op1.hasContext(contextC));
-		assertTrue("Operation should have context", op2.hasContext(contextC));
-		assertTrue("Operation should have context", op3.hasContext(contextC));
-	
-	}
-	
-	// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=128117
-	// Test that context is removed from a triggered operations.
-	public void test128117simple() throws ExecutionException {
-		// clear out history which will also reset operation execution counts
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, false);
-		ICompositeOperation batch = new TriggeredOperations(op1, history);
-		IUndoContext context = new ObjectUndoContext("test");
-		batch.addContext(context);
-		assertTrue("Operation should have newly added context", batch.hasContext(context));
-		history.openOperation(batch, IOperationHistory.EXECUTE);
-		op1.execute(null, null);
-		op2.execute(null, null);
-		history.add(op2);
-		history.execute(op3, null, null);
-		history.closeOperation(true, true, IOperationHistory.EXECUTE);
-		IUndoableOperation op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertTrue("Operation should be the composite", op == batch);
-		assertTrue("Operation should have top level context", op.hasContext(context));
-		op.removeContext(context);
-		assertFalse("Operation should have removed top level context", op.hasContext(context));
-	}
-	
-	// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=128117
-	// Test that context is removed from a triggered operations after recompute of contexts.
-	public void test128117complex() throws ExecutionException {
-		// clear out history which will also reset operation execution counts
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, false);
-		ICompositeOperation batch = new TriggeredOperations(op1, history);
-		IUndoContext context = new ObjectUndoContext("test");
-		batch.addContext(context);
-		assertTrue("Operation should have top level context", batch.hasContext(context));
-		history.openOperation(batch, IOperationHistory.EXECUTE);
-		op1.execute(null, null);
-		op2.execute(null, null);
-		history.add(op2);
-		history.execute(op3, null, null);
-		history.closeOperation(true, true, IOperationHistory.EXECUTE);
-		IUndoableOperation op = history.getUndoOperation(IOperationHistory.GLOBAL_UNDO_CONTEXT);
-		assertTrue("Operation should be the composite", op == batch);
-		op.removeContext(contextB);
-		assertFalse("Operation should have removed child context", op.hasContext(contextB));
-		assertTrue("Operation should have top level context", op.hasContext(context));
-		op.removeContext(context);
-		assertFalse("Operation should have removed top level context", op.hasContext(context));
-	}
-	
-	public void testStressTestAPI() throws ExecutionException {
-		history.setLimit(contextA, STRESS_NUM);
-		for (int i=0; i < STRESS_NUM; i++) {
-			IUndoableOperation op = new TestOperation("test");
-			op.addContext(contextA);
-			if (i%3 == 0) {
-				op.addContext(contextB);
-			}
-			history.execute(op, null, null);
-		}
-		for (int i=0; i < STRESS_NUM; i++) {
-			if (i%2 == 0) {
-				history.undo(contextA, null, null);
-			}
-			if (i%5 == 0) {
-				history.redo(contextA, null, null);
-			}
-		}
-	}
-	
-	public void test159305() throws ExecutionException {
-		final int [] approvalCount = new int[1];
-		IOperationApprover approver;
-		approver = new IOperationApprover() {
-			public IStatus proceedUndoing(IUndoableOperation op, IOperationHistory history, IAdaptable uiInfo) {
-				approvalCount[0]++;
-				return Status.OK_STATUS;
-			}
-			public IStatus proceedRedoing(IUndoableOperation op, IOperationHistory history, IAdaptable uiInfo) {
-				approvalCount[0]--;
-				return Status.OK_STATUS;
-			}
-		};
-		history.addOperationApprover(approver);
-		history.undo(contextB, null, null);
-		// approval should have only run once for linear undo
-		assertTrue("Operation approver should run only once for linear undo", approvalCount[0] == 1);
-		history.redo(contextB, null, null);
-		assertTrue("Operation approver should run only once for linear redo", approvalCount[0] == 0);
-		
-		// approval should have only run once for direct undo
-		history.undoOperation(op5, null, null);
-		assertTrue("Operation approver should run only once for direct undo", approvalCount[0]== 1);
-		history.redoOperation(op5, null, null);
-		assertTrue("Operation approver should run only once for direct redo", approvalCount[0]== 0);
-		
-		// cleanup
-		history.removeOperationApprover(approver);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/OperationsTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/OperationsTestSuite.java
deleted file mode 100644
index 4ef6961..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/OperationsTestSuite.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.operations;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Tests for the platform operations support.
- */
-public class OperationsTestSuite extends TestSuite {
-	/**
-	 * Returns the suite. This is required to use the JUnit Launcher.
-	 */
-	public static final Test suite() {
-		return new OperationsTestSuite();
-	}
-
-	/**
-	 * Construct the test suite.
-	 */
-	public OperationsTestSuite() {
-		addTest(new TestSuite(OperationsAPITest.class));
-		addTest(new TestSuite(WorkbenchOperationHistoryTests.class));
-		addTest(new TestSuite(MultiThreadedOperationsTests.class));
-		addTest(new TestSuite(WorkbenchOperationStressTests.class));
-		addTest(new TestSuite(WorkspaceOperationsTests.class));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/TestOperation.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/TestOperation.java
deleted file mode 100644
index 1c6ec73..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/TestOperation.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.operations;
-
-import org.eclipse.core.commands.operations.AbstractOperation;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * @since 3.1
- */
-public class TestOperation extends AbstractOperation {
-
-	private int fExecutionCount = 0;
-
-	TestOperation(String label) {
-		super(label);
-	}
-
-	public boolean canRedo() {
-		return fExecutionCount == 0;
-	}
-
-	public boolean canUndo() {
-		return fExecutionCount > 0;
-	}
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable uiInfo) {
-		fExecutionCount++;
-		return Status.OK_STATUS;
-	}
-	
-	public IStatus redo(IProgressMonitor monitor, IAdaptable uiInfo) {
-		return execute(monitor, uiInfo);
-	}
-
-	public IStatus undo(IProgressMonitor monitor, IAdaptable uiInfo) {
-		fExecutionCount--;
-		return Status.OK_STATUS;
-	}
-	
-	public void dispose() {
-		fExecutionCount = 0;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/UnredoableTestOperation.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/UnredoableTestOperation.java
deleted file mode 100644
index ad72d3f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/UnredoableTestOperation.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.operations;
-
-
-/**
- * @since 3.1
- */
-public class UnredoableTestOperation extends TestOperation {
-	UnredoableTestOperation(String name) {
-		super(name);
-	}
-
-	boolean disposed = false;
-	
-	public boolean canRedo() {
-		return false;
-	}
-	
-	public void dispose() {
-		disposed = true;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/WorkbenchOperationHistoryTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/WorkbenchOperationHistoryTests.java
deleted file mode 100644
index 494f6c1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/WorkbenchOperationHistoryTests.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.operations;
-
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.commands.operations.IOperationHistory;
-import org.eclipse.core.commands.operations.ObjectUndoContext;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests the Operations Framework API.
- * 
- * @since 3.1
- */
-public class WorkbenchOperationHistoryTests extends UITestCase {
-	IUndoContext context, contextA, contextB;
-
-	IOperationHistory history;
-
-	IUndoableOperation op1, op2, op3, op4, op5, op6;
-
-	/**
-	 * @param testName
-	 */
-	public WorkbenchOperationHistoryTests(String name) {
-		super(name);
-	}
-
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		history = PlatformUI.getWorkbench().getOperationSupport().getOperationHistory();
-		context = PlatformUI.getWorkbench().getOperationSupport().getUndoContext();
-		contextA = new ObjectUndoContext("A");
-		contextB = new ObjectUndoContext("B");
-		op1 = new TestOperation("op1");
-		op1.addContext(context);
-		op2 = new TestOperation("op2");
-		op2.addContext(context);
-		op2.addContext(contextA);
-		op3 = new TestOperation("op3");
-		op3.addContext(contextB);
-		op4 = new TestOperation("op4");
-		op4.addContext(context);
-		op5 = new TestOperation("op5");
-		op5.addContext(contextA);
-		op6 = new TestOperation("op6");
-		op6.addContext(context);
-		op6.addContext(contextB);
-		history.execute(op1, null, null);
-		history.execute(op2, null, null);
-		history.execute(op3, null, null);
-		history.execute(op4, null, null);
-		history.execute(op5, null, null);
-		history.execute(op6, null, null);
-
-	}
-
-	protected void doTearDown() throws Exception {
-		history.dispose(IOperationHistory.GLOBAL_UNDO_CONTEXT, true, true, true);
-		super.doTearDown();
-	}
-	
-	public void testWorkspaceAdapter() {
-		IUndoContext workspaceContext = (IUndoContext)ResourcesPlugin.getWorkspace().getAdapter(IUndoContext.class);
-		assertTrue("Should have context registered on workspace", workspaceContext == context);
-	}
-	
-	public void testMatchingContext() {
-		IUndoContext newContext = new IUndoContext() {
-			public String getLabel() { return "Matching Test Context"; }
-			public boolean matches(IUndoContext otherContext) { return false; }
-		};
-		assertFalse(newContext.matches(context));
-		((ObjectUndoContext)context).addMatch(newContext);
-		assertTrue(history.getUndoHistory(context).length == history.getUndoHistory(newContext).length);
-		assertTrue(op1.hasContext(newContext));
-		assertFalse(op3.hasContext(context));
-		op3.addContext(newContext);
-		assertTrue(op3.hasContext(context));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/WorkbenchOperationStressTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/WorkbenchOperationStressTests.java
deleted file mode 100644
index de7579a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/WorkbenchOperationStressTests.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.operations;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.commands.operations.IUndoableOperation;
-import org.eclipse.core.commands.operations.IOperationHistory;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Stress tests the Operations Framework API to find any interaction problems
- * with the workbench.
- * 
- * @since 3.1
- */
-public class WorkbenchOperationStressTests extends UITestCase {
-
-	static int STRESS_TEST_REPETITIONS = 2000;
-
-	static int OPEN_WINDOW_REPETITIONS = 2;
-
-	/**
-	 * @param testName
-	 */
-	public WorkbenchOperationStressTests(String name) {
-		super(name);
-	}
-
-	/*
-	 * Exercise the operations history just before closing the workbench. This
-	 * can find problems with the action handlers assuming a workbench is open.
-	 * 
-	 * In progress - this still isn't catching the case from the bug, but is a good
-	 * start.
-	 */
-	public void test115761() throws ExecutionException {
-		for (int j = 0; j < OPEN_WINDOW_REPETITIONS; j++) {
-			IWorkbenchWindow secondWorkbenchWindow = null;
-			secondWorkbenchWindow = openTestWindow(IDE.RESOURCE_PERSPECTIVE_ID);
-			Display display = secondWorkbenchWindow.getShell().getDisplay();
-			IOperationHistory workbenchHistory = secondWorkbenchWindow
-					.getWorkbench().getOperationSupport().getOperationHistory();
-			IUndoContext workbenchContext = secondWorkbenchWindow
-					.getWorkbench().getOperationSupport().getUndoContext();
-			workbenchHistory.setLimit(workbenchContext, STRESS_TEST_REPETITIONS);
-
-			for (int i = 0; i < STRESS_TEST_REPETITIONS; i++) {
-				IUndoableOperation op = new TestOperation("test");
-				op.addContext(workbenchContext);
-				workbenchHistory.execute(op, null, null);
-			}
-			for (int i = 0; i < STRESS_TEST_REPETITIONS; i++) {
-				if (i % 2 == 0) {
-					workbenchHistory.undo(workbenchContext, null, null);
-				}
-				if (i % 5 == 0) {
-					workbenchHistory.redo(workbenchContext, null, null);
-				}
-			}
-
-			secondWorkbenchWindow.close();
-			boolean go = true;
-			while (go) {
-				go = display.readAndDispatch();
-				
-			}
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/WorkspaceOperationsTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/WorkspaceOperationsTests.java
deleted file mode 100644
index e724fc3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/operations/WorkspaceOperationsTests.java
+++ /dev/null
@@ -1,2158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.operations;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URI;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.IOperationHistory;
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.filesystem.URIUtil;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.tests.harness.FileSystemHelper;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.undo.AbstractWorkspaceOperation;
-import org.eclipse.ui.ide.undo.CopyProjectOperation;
-import org.eclipse.ui.ide.undo.CopyResourcesOperation;
-import org.eclipse.ui.ide.undo.CreateFileOperation;
-import org.eclipse.ui.ide.undo.CreateFolderOperation;
-import org.eclipse.ui.ide.undo.CreateMarkersOperation;
-import org.eclipse.ui.ide.undo.CreateProjectOperation;
-import org.eclipse.ui.ide.undo.DeleteMarkersOperation;
-import org.eclipse.ui.ide.undo.DeleteResourcesOperation;
-import org.eclipse.ui.ide.undo.MoveProjectOperation;
-import org.eclipse.ui.ide.undo.MoveResourcesOperation;
-import org.eclipse.ui.ide.undo.UpdateMarkersOperation;
-import org.eclipse.ui.internal.operations.AdvancedValidationUserApprover;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Tests the undo of various workspace operations. Uses the following workspace
- * structure to perform the tests
- * 
- * <pre>
- *  TEST_PROJECT_NAME
- *  **TEST_FOLDER_NAME
- *  ****TEST_SUBFOLDER_NAME
- *  ******TEST_FILEINSUBFOLDER_NAME 
- *  ****TEST_EMPTYFILE_NAME
- *  ****TEST_RANDOMFILE_NAME
- *  ****TEST_LINKEDFILE_NAME (linked to random location)
- *  ****TEST_LINKEDFOLDER_NAME (linked to random location)
- *  **TEST_FILEINPROJECT_NAME 
- *  TEST_TARGETPROJECT_NAME
- * </pre>
- * 
- * @since 3.3
- */
-public class WorkspaceOperationsTests extends UITestCase {
-
-	IProject testProject, targetProject;
-
-	IFolder testFolder, testSubFolder, testLinkedFolder;
-
-	IFile emptyTestFile, testFileWithContent, testLinkedFile,
-			testFileInSubFolder, testFileInProject;
-
-	private final Set storesToDelete = new HashSet();
-
-	IOperationHistory history;
-
-	IUndoContext context;
-
-	private static Map initialAttributes = new HashMap();
-	static {
-		initialAttributes.put("Attr1", "Attr1 1.0");
-		initialAttributes.put("Attr2", "Attr2 1.0");
-		initialAttributes.put("Attr3", "Attr3 1.0");
-		initialAttributes.put("Attr4", "Attr4 1.0");
-		initialAttributes.put("Attr5", "Attr5 1.0");
-		initialAttributes.put("Attr6", "Attr6 1.0");
-	};
-
-	private static Map updatedAttributes = new HashMap();
-	static {
-		updatedAttributes.put("Attr1", "Attr1 1.1");
-		updatedAttributes.put("Attr2", "Attr2 1.1");
-		updatedAttributes.put("Attr3", "Attr3 1.1");
-		updatedAttributes.put("Attr4", "Attr4 1.1");
-		updatedAttributes.put("Attr5", "Attr5 1.1");
-		updatedAttributes.put("Attr7", "Attr7 1.0");
-	};
-
-	private static Map mergedUpdatedAttributes = new HashMap();
-	static {
-		mergedUpdatedAttributes.put("Attr1", "Attr1 1.1");
-		mergedUpdatedAttributes.put("Attr2", "Attr2 1.1");
-		mergedUpdatedAttributes.put("Attr3", "Attr3 1.1");
-		mergedUpdatedAttributes.put("Attr4", "Attr4 1.1");
-		mergedUpdatedAttributes.put("Attr5", "Attr5 1.1");
-		mergedUpdatedAttributes.put("Attr6", "Attr6 1.0");
-		mergedUpdatedAttributes.put("Attr7", "Attr7 1.0");
-	};
-
-	private static List fileNameExcludes = new ArrayList();
-	static {
-		fileNameExcludes.add(".project");
-	};
-
-	private static String CUSTOM_TYPE = "TestMarkerType";
-
-	private static String FILE_CONTENTS_EMPTY = "";
-
-	private static String TEST_PROJECT_NAME = "WorkspaceOperationsTests_Project";
-
-	private static String TEST_TARGET_PROJECT_NAME = "WorkspaceOperationsTests_MoveCopyTarget";
-
-	private static String TEST_FOLDER_NAME = "WorkspaceOperationsTests_Folder";
-
-	private static String TEST_SUBFOLDER_NAME = "WorkspaceOperationsTests_SubFolder";
-
-	private static String TEST_LINKEDFOLDER_NAME = "WorkspaceOperationsTests_LinkedFolder";
-
-	private static String TEST_LINKEDFILE_NAME = "WorkspaceOperationTests_LinkedFile";
-
-	private static String TEST_EMPTYFILE_NAME = "WorkspaceOperationsTests_EmptyFile";
-
-	private static String TEST_RANDOMFILE_NAME = "WorkspaceOperationsTests_RandomContentFile.txt";
-
-	private static String TEST_FILEINPROJECT_NAME = "WorkspaceOperationsTests_FileInProject";
-
-	private static String TEST_FILEINSUBFOLDER_NAME = "WorkspaceOperationsTests_FileInSubFolder";
-
-	private static String TEST_NEWPROJECT_NAME = "WorkspaceOperationTests_NewProject";
-
-	private static String TEST_NEWFOLDER_NAME = "WorkspaceOperationTests_NewFolder";
-
-	private static String TEST_NEWFILE_NAME = "WorkspaceOperationTests_NewFile";
-	
-	private static String TEST_NESTEDFOLDER_ROOT_PARENT_NAME = "scooby";
-	
-	private static String TEST_NESTEDFOLDER_PARENT_NAME = "scooby/dooby/doo";
-
-	private static String TEST_NEWNESTEDFOLDER_NAME = "scooby/dooby/doo/WorkspaceOperationTests_NewFolder";
-
-	private static String TEST_NEWNESTEDFILE_NAME = "scooby/dooby/doo/WorkspaceOperationTests_NewFile";
-
-	// Insider knowledge of WorkspaceUndoMonitor's change threshhold
-	private static int NUM_CHANGES = 10;
-
-	class FileSnapshot extends ResourceSnapshot {
-		String content;
-
-		URI location;
-
-		MarkerSnapshot[] markerSnapshots;
-
-		FileSnapshot(IFile file) throws CoreException {
-			content = readContent(file);
-			name = file.getName();
-			if (file.isLinked()) {
-				location = file.getLocationURI();
-			}
-			IMarker[] markers = file.findMarkers(null, true,
-					IResource.DEPTH_INFINITE);
-			markerSnapshots = new MarkerSnapshot[markers.length];
-			for (int i = 0; i < markers.length; i++) {
-				markerSnapshots[i] = new MarkerSnapshot(markers[i]);
-			}
-		}
-
-		boolean isValid(IResource parent) throws CoreException {
-			IResource resource = getWorkspaceRoot().findMember(
-					parent.getFullPath().append(name));
-			if (resource == null || !(resource instanceof IFile)) {
-				return false;
-			}
-			IFile file = (IFile) resource;
-			boolean contentMatch = readContent(file).equals(content);
-			if (file.isLinked()) {
-				contentMatch = contentMatch
-						&& file.getLocationURI().equals(location);
-			}
-			if (!contentMatch) {
-				return false;
-			}
-			for (int i = 0; i < markerSnapshots.length; i++) {
-				if (!markerSnapshots[i].existsOn(resource)) {
-					return false;
-				}
-			}
-			return true;
-		}
-	}
-
-	class FolderSnapshot extends ResourceSnapshot {
-		URI location;
-
-		ResourceSnapshot[] memberSnapshots;
-
-		FolderSnapshot(IFolder folder) throws CoreException {
-			name = folder.getName();
-			if (folder.isLinked()) {
-				location = folder.getLocationURI();
-			}
-			IResource[] members = folder.members();
-			memberSnapshots = new ResourceSnapshot[members.length];
-			for (int i = 0; i < members.length; i++) {
-				memberSnapshots[i] = snapshotFromResource(members[i]);
-			}
-		}
-
-		boolean isValid(IResource parent) throws CoreException {
-			IResource resource = getWorkspaceRoot().findMember(
-					parent.getFullPath().append(name));
-			if (resource == null || !(resource instanceof IFolder)) {
-				return false;
-			}
-			IFolder folder = (IFolder) resource;
-			if (folder.isLinked()) {
-				if (!folder.getLocationURI().equals(location)) {
-					return false;
-				}
-			}
-			for (int i = 0; i < memberSnapshots.length; i++) {
-				if (!fileNameExcludes.contains(memberSnapshots[i].name)) {
-					if (!memberSnapshots[i].isValid(folder)) {
-						return false;
-					}
-				}
-			}
-			return true;
-		}
-	}
-
-	class MarkerSnapshot {
-		String type;
-
-		Map attributes;
-
-		MarkerSnapshot(IMarker marker) throws CoreException {
-			type = marker.getType();
-			attributes = marker.getAttributes();
-		}
-
-		boolean existsOn(IResource resource) throws CoreException {
-			// comparison is based on equality of attributes, since id will
-			// change on create/delete/recreate sequence
-			IMarker[] markers = resource.findMarkers(type, false,
-					IResource.DEPTH_ZERO);
-			for (int i = 0; i < markers.length; i++) {
-				if (markers[i].getAttributes().equals(attributes)) {
-					return true;
-				}
-			}
-			return false;
-		}
-	}
-
-	class ProjectSnapshot extends ResourceSnapshot {
-		ResourceSnapshot[] memberSnapshots;
-
-		ProjectSnapshot(IProject project) throws CoreException {
-			name = project.getName();
-			boolean open = project.isOpen();
-			if (!open) {
-				project.open(null);
-			}
-			IResource[] members = project.members();
-			memberSnapshots = new ResourceSnapshot[members.length];
-			for (int i = 0; i < members.length; i++) {
-				memberSnapshots[i] = snapshotFromResource(members[i]);
-			}
-			if (!open) {
-				project.close(null);
-			}
-
-		}
-
-		boolean isValid(IResource parent) throws CoreException {
-			IResource resource = getWorkspaceRoot().findMember(
-					parent.getFullPath().append(name));
-			if (resource == null || !(resource instanceof IProject)) {
-				return false;
-			}
-			IProject project = (IProject) resource;
-			// Must open it to validate the content
-			boolean open = project.isOpen();
-			if (!open) {
-				project.open(null);
-			}
-
-			for (int i = 0; i < memberSnapshots.length; i++) {
-				if (!fileNameExcludes.contains(memberSnapshots[i].name)) {
-					if (!memberSnapshots[i].isValid(resource)) {
-						return false;
-					}
-				}
-			}
-
-			if (!open) {
-				project.close(null);
-			}
-
-			return true;
-		}
-
-		boolean isValid() throws CoreException {
-			return isValid(getWorkspaceRoot());
-		}
-	}
-
-	abstract class ResourceSnapshot {
-		String name;
-
-		abstract boolean isValid(IResource parent) throws CoreException;
-
-		IWorkspaceRoot getWorkspaceRoot() {
-			return ResourcesPlugin.getWorkspace().getRoot();
-		}
-	}
-
-	/**
-	 * @param testName
-	 */
-	public WorkspaceOperationsTests(String name) {
-		super(name);
-	}
-
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		// Suppress validation UI
-		AdvancedValidationUserApprover.AUTOMATED_MODE = true;
-		// Project
-		testProject = getWorkspace().getRoot().getProject(TEST_PROJECT_NAME);
-		testProject.create(getMonitor());
-		testProject.open(getMonitor());
-		assertTrue(testProject.exists());
-		// Project for move/copy target location
-		targetProject = getWorkspace().getRoot().getProject(
-				TEST_TARGET_PROJECT_NAME);
-		targetProject.create(getMonitor());
-		targetProject.open(getMonitor());
-		assertTrue(targetProject.exists());
-		// Folder in Project
-		testFolder = testProject.getFolder(TEST_FOLDER_NAME);
-		testFolder.create(true, true, getMonitor());
-		assertTrue(testFolder.exists());
-		// File in Project
-		testFileInProject = testProject.getFile(TEST_FILEINPROJECT_NAME);
-		testFileInProject.create(getContents(getRandomString()), true,
-				getMonitor());
-		assertTrue(testFileInProject.exists());
-		// Subfolder in top level folder
-		testSubFolder = testFolder.getFolder(TEST_SUBFOLDER_NAME);
-		testSubFolder.create(true, true, getMonitor());
-		assertTrue(testSubFolder.exists());
-		// Files in top level folder
-		emptyTestFile = testFolder.getFile(TEST_EMPTYFILE_NAME);
-		emptyTestFile.create(getContents(FILE_CONTENTS_EMPTY), true,
-				getMonitor());
-		testFileWithContent = testFolder.getFile(TEST_RANDOMFILE_NAME);
-		testFileWithContent.create(getContents(getRandomString()), true,
-				getMonitor());
-		// File in subfolder
-		testFileInSubFolder = testSubFolder.getFile(TEST_FILEINSUBFOLDER_NAME);
-		testFileInSubFolder.create(getContents(getRandomString()), true,
-				getMonitor());
-		assertTrue(testFileInProject.exists());
-
-		// Create links by first creating the backing content...
-		IFileStore folderStore = getTempStore();
-		IFileStore fileStore = getTempStore();
-		IPath folderLocation = URIUtil.toPath(folderStore.toURI());
-		IPath fileLocation = URIUtil.toPath(fileStore.toURI());
-		folderStore.mkdir(EFS.NONE, getMonitor());
-		fileStore.openOutputStream(EFS.NONE, getMonitor()).close();
-		// Then create the workspace objects
-		testLinkedFolder = testFolder.getFolder(TEST_LINKEDFOLDER_NAME);
-		testLinkedFolder.createLink(folderLocation, IResource.NONE,
-				getMonitor());
-		assertTrue(testLinkedFolder.exists());
-		testLinkedFile = testFolder.getFile(TEST_LINKEDFILE_NAME);
-		testLinkedFile.createLink(fileLocation, IResource.NONE, getMonitor());
-
-		history = PlatformUI.getWorkbench().getOperationSupport()
-				.getOperationHistory();
-		context = PlatformUI.getWorkbench().getOperationSupport()
-				.getUndoContext();
-
-	}
-
-	protected void doTearDown() throws Exception {
-		testProject = (IProject) getWorkspaceRoot().findMember(
-				TEST_PROJECT_NAME);
-		if (testProject != null) {
-			testProject.close(getMonitor());
-			testProject.delete(true, true, getMonitor());
-		}
-		targetProject = (IProject) getWorkspaceRoot().findMember(
-				TEST_TARGET_PROJECT_NAME);
-		if (targetProject != null) {
-			targetProject.close(getMonitor());
-			targetProject.delete(true, true, getMonitor());
-		}
-		IProject newProject = (IProject) getWorkspaceRoot().findMember(
-				TEST_NEWPROJECT_NAME);
-		if (newProject != null) {
-			newProject.close(getMonitor());
-			newProject.delete(true, true, getMonitor());
-		}
-		final IFileStore[] toDelete = (IFileStore[]) storesToDelete
-				.toArray(new IFileStore[storesToDelete.size()]);
-		storesToDelete.clear();
-		for (int i = 0; i < toDelete.length; i++) {
-			clear(toDelete[i]);
-		}
-		AdvancedValidationUserApprover.AUTOMATED_MODE = false;
-
-		testProject = null;
-		targetProject = null;
-		testFolder = null;
-		testSubFolder = null;
-		testLinkedFolder = null;
-		emptyTestFile = null;
-		testFileWithContent = null;
-		testLinkedFile = null;
-		testFileInSubFolder = null;
-		testFileInProject = null;
-
-		super.doTearDown();
-	}
-
-	private IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	private IWorkspaceRoot getWorkspaceRoot() {
-		return ResourcesPlugin.getWorkspace().getRoot();
-	}
-
-	/*
-	 * reads file content and returns string
-	 */
-	private String readContent(IFile file) throws CoreException {
-		InputStream is = file.getContents();
-		String encoding = file.getCharset();
-		if (is == null)
-			return null;
-		BufferedReader reader = null;
-		try {
-			StringBuffer buffer = new StringBuffer();
-			char[] part = new char[2048];
-			int read = 0;
-			reader = new BufferedReader(new InputStreamReader(is, encoding));
-
-			while ((read = reader.read(part)) != -1)
-				buffer.append(part, 0, read);
-
-			return buffer.toString();
-
-		} catch (IOException ex) {
-		} finally {
-			if (reader != null) {
-				try {
-					reader.close();
-				} catch (IOException ex) {
-				}
-			}
-		}
-		return null;
-	}
-
-	private ResourceSnapshot snapshotFromResource(IResource resource)
-			throws CoreException {
-		if (resource instanceof IFile)
-			return new FileSnapshot((IFile) resource);
-		if (resource instanceof IFolder)
-			return new FolderSnapshot((IFolder) resource);
-		if (resource instanceof IProject)
-			return new ProjectSnapshot((IProject) resource);
-		fail("Unknown resource type");
-		// making compiler happy
-		return new FileSnapshot((IFile) resource);
-	}
-
-	private IProgressMonitor getMonitor() {
-		return null;
-	}
-
-	private String getRandomString() {
-		switch ((int) Math.round(Math.random() * 10)) {
-		case 0:
-			return "este e' o meu conteudo (portuguese)";
-		case 1:
-			return "ho ho ho";
-		case 2:
-			return "I'll be back";
-		case 3:
-			return "don't worry, be happy";
-		case 4:
-			return "there is no imagination for more sentences";
-		case 5:
-			return "customize yours";
-		case 6:
-			return "foo";
-		case 7:
-			return "bar";
-		case 8:
-			return "foobar";
-		case 9:
-			return "case 9";
-		default:
-			return "these are my contents";
-		}
-	}
-
-	/**
-	 * Returns a FileStore instance backed by storage in a temporary location.
-	 * The returned store will not exist, but will belong to an existing parent.
-	 * The tearDown method in this class will ensure the location is deleted
-	 * after the test is completed.
-	 */
-	private IFileStore getTempStore() {
-		IFileStore store = EFS.getLocalFileSystem().getStore(
-				FileSystemHelper.getRandomLocation(FileSystemHelper
-						.getTempDir()));
-		storesToDelete.add(store);
-		return store;
-	}
-
-	/**
-	 * Returns the URI for a unique, existent folder backed by storage in a
-	 * temporary location. The tearDown method in this class will ensure the
-	 * location is deleted after the test is completed.
-	 */
-	private URI getTempProjectDir() throws CoreException {
-		IFileStore store = getTempStore();
-		store.mkdir(EFS.NONE, getMonitor());
-		return store.toURI();
-	}
-
-	private void clear(IFileStore store) {
-		try {
-			store.delete(EFS.NONE, null);
-		} catch (CoreException e) {
-		}
-	}
-
-	private InputStream getContents(String text) {
-		return new ByteArrayInputStream(text.getBytes());
-	}
-
-	private Map getInitialMarkerAttributes() {
-		HashMap map = new HashMap();
-		map.putAll(initialAttributes);
-		return map;
-	}
-
-	private Map getUpdatedMarkerAttributes() {
-		HashMap map = new HashMap();
-		map.putAll(updatedAttributes);
-		return map;
-	}
-
-	private IProjectDescription getNewProjectDescription() {
-		return getWorkspace().newProjectDescription(TEST_NEWPROJECT_NAME);
-	}
-
-	private void execute(AbstractWorkspaceOperation operation)
-			throws ExecutionException {
-		operation.setQuietCompute(true);
-		assertTrue("Operation can be executed", operation.canExecute());
-		IStatus status = history.execute(operation, getMonitor(), null);
-		assertTrue("Execution should be OK status", status.isOK());
-	}
-
-	private void executeExpectFail(AbstractWorkspaceOperation operation)
-			throws ExecutionException {
-		operation.setQuietCompute(true);
-		IStatus status = history.execute(operation, getMonitor(), null);
-		assertFalse("Execution should not have OK status", status.isOK());
-	}
-
-	private void undo() throws ExecutionException {
-		assertTrue("Operation can be undone", history.canUndo(context));
-		IStatus status = history.undo(context, getMonitor(), null);
-		assertTrue("Undo should be OK status", status.isOK());
-	}
-
-	private void undoExpectFail(AbstractWorkspaceOperation operation)
-			throws ExecutionException {
-		operation.setQuietCompute(true);
-		IStatus status = history.undo(context, getMonitor(), null);
-		assertFalse("Undo should not have OK status", status.isOK());
-	}
-
-	private void redo() throws ExecutionException {
-		assertTrue("Operation can be redone", history.canRedo(context));
-		IStatus status = history.redo(context, getMonitor(), null);
-		assertTrue("Redo should be OK status", status.isOK());
-	}
-
-	private void validateCreatedMarkers(int expectedCount, IMarker[] markers,
-			Map[] expectedAttributes, String[] expectedTypes)
-			throws CoreException {
-
-		assertTrue(MessageFormat.format("{0} markers should have been created",
-				new Object[] { new Integer(expectedCount) }),
-				markers.length == expectedCount);
-
-		for (int i = 0; i < markers.length; i++) {
-			IMarker createdMarker = markers[i];
-			assertTrue("Marker should exist", createdMarker.exists());
-			assertTrue("Marker should have expected attributes", createdMarker
-					.getAttributes().equals(expectedAttributes[i]));
-			assertTrue("Marker should have expected type", createdMarker
-					.getType().equals(expectedTypes[i]));
-		}
-	}
-
-	public void testCreateSingleMarkerUndoRedo() throws ExecutionException,
-			CoreException {
-		String[] types = new String[] { IMarker.BOOKMARK };
-		Map[] attrs = new Map[] { getInitialMarkerAttributes() };
-		CreateMarkersOperation op = new CreateMarkersOperation(
-				IMarker.BOOKMARK, getInitialMarkerAttributes(), emptyTestFile,
-				"Create Single Marker Test");
-		execute(op);
-		IMarker[] markers = op.getMarkers();
-		validateCreatedMarkers(1, markers, attrs, types);
-		undo();
-		assertFalse("Marker should no longer exist", markers[0].exists());
-		redo();
-		markers = op.getMarkers();
-		validateCreatedMarkers(1, markers, attrs, types);
-	}
-
-	public void testCreateMultipleMarkersSingleTypeUndoRedo()
-			throws ExecutionException, CoreException {
-		String[] types = new String[] { CUSTOM_TYPE, CUSTOM_TYPE, CUSTOM_TYPE };
-		Map[] attrs = new Map[] { getInitialMarkerAttributes(),
-				getUpdatedMarkerAttributes(), getInitialMarkerAttributes() };
-
-		CreateMarkersOperation op = new CreateMarkersOperation(CUSTOM_TYPE,
-				attrs, new IFile[] { emptyTestFile, testFileWithContent,
-						testLinkedFile },
-				"Create Multiple Markers Single Type Test");
-		execute(op);
-		IMarker[] markers = op.getMarkers();
-		validateCreatedMarkers(3, markers, attrs, types);
-		undo();
-		for (int i = 0; i < markers.length; i++) {
-			IMarker createdMarker = markers[i];
-			assertFalse("Marker should no longer exist", createdMarker.exists());
-		}
-		redo();
-		markers = op.getMarkers();
-		validateCreatedMarkers(3, markers, attrs, types);
-	}
-
-	public void testCreateMultipleMarkerTypesUndoRedo()
-			throws ExecutionException, CoreException {
-		String[] types = new String[] { IMarker.BOOKMARK, IMarker.TASK,
-				CUSTOM_TYPE };
-		Map[] attrs = new Map[] { getInitialMarkerAttributes(),
-				getUpdatedMarkerAttributes(), getInitialMarkerAttributes() };
-
-		CreateMarkersOperation op = new CreateMarkersOperation(types, attrs,
-				new IFile[] { emptyTestFile, testFileWithContent,
-						testLinkedFile }, "Create Multiple Marker Types Test");
-		execute(op);
-		IMarker[] markers = op.getMarkers();
-		validateCreatedMarkers(3, markers, attrs, types);
-		undo();
-		for (int i = 0; i < markers.length; i++) {
-			IMarker createdMarker = markers[i];
-			assertFalse("Marker should no longer exist", createdMarker.exists());
-		}
-		redo();
-		markers = op.getMarkers();
-		validateCreatedMarkers(3, markers, attrs, types);
-	}
-
-	public void testUpdateSingleMarkerUndoRedo() throws ExecutionException,
-			CoreException {
-		CreateMarkersOperation op = new CreateMarkersOperation(
-				IMarker.BOOKMARK, getInitialMarkerAttributes(),
-				testFileWithContent, "Create Marker Test");
-		execute(op);
-		UpdateMarkersOperation updateOp = new UpdateMarkersOperation(op
-				.getMarkers()[0], getUpdatedMarkerAttributes(),
-				"Update Single Marker", false);
-		execute(updateOp);
-		validateCreatedMarkers(1, updateOp.getMarkers(),
-				new Map[] { getUpdatedMarkerAttributes() },
-				new String[] { IMarker.BOOKMARK });
-		undo();
-		validateCreatedMarkers(1, updateOp.getMarkers(),
-				new Map[] { getInitialMarkerAttributes() },
-				new String[] { IMarker.BOOKMARK });
-		redo();
-		validateCreatedMarkers(1, updateOp.getMarkers(),
-				new Map[] { getUpdatedMarkerAttributes() },
-				new String[] { IMarker.BOOKMARK });
-
-	}
-
-	public void testUpdateMultipleMarkerUndoRedo() throws ExecutionException,
-			CoreException {
-		String[] types = new String[] { IMarker.BOOKMARK, IMarker.TASK,
-				CUSTOM_TYPE };
-		Map[] attrs = new Map[] { getInitialMarkerAttributes(),
-				getInitialMarkerAttributes(), getInitialMarkerAttributes() };
-		CreateMarkersOperation op = new CreateMarkersOperation(types, attrs,
-				new IFile[] { emptyTestFile, testFileWithContent,
-						testLinkedFile },
-				"Create Multiple Markers Same Type Test");
-		execute(op);
-		UpdateMarkersOperation updateOp = new UpdateMarkersOperation(op
-				.getMarkers(), getUpdatedMarkerAttributes(),
-				"Update Multiple Markers", false);
-		execute(updateOp);
-		validateCreatedMarkers(3, updateOp.getMarkers(), new Map[] {
-				getUpdatedMarkerAttributes(), getUpdatedMarkerAttributes(),
-				getUpdatedMarkerAttributes() }, types);
-		undo();
-		validateCreatedMarkers(3, updateOp.getMarkers(), attrs, types);
-		redo();
-		validateCreatedMarkers(3, updateOp.getMarkers(), new Map[] {
-				getUpdatedMarkerAttributes(), getUpdatedMarkerAttributes(),
-				getUpdatedMarkerAttributes() }, types);
-
-	}
-
-	public void testUpdateAndMergeSingleMarkerUndoRedo()
-			throws ExecutionException, CoreException {
-		CreateMarkersOperation op = new CreateMarkersOperation(
-				IMarker.BOOKMARK, getInitialMarkerAttributes(), testLinkedFile,
-				"Create Marker Test");
-		execute(op);
-		UpdateMarkersOperation updateOp = new UpdateMarkersOperation(op
-				.getMarkers()[0], getUpdatedMarkerAttributes(),
-				"Update And Merge Single Marker", true);
-		execute(updateOp);
-		validateCreatedMarkers(1, updateOp.getMarkers(),
-				new Map[] { mergedUpdatedAttributes },
-				new String[] { IMarker.BOOKMARK });
-		undo();
-		validateCreatedMarkers(1, updateOp.getMarkers(),
-				new Map[] { getInitialMarkerAttributes() },
-				new String[] { IMarker.BOOKMARK });
-		redo();
-		validateCreatedMarkers(1, updateOp.getMarkers(),
-				new Map[] { mergedUpdatedAttributes },
-				new String[] { IMarker.BOOKMARK });
-
-	}
-
-	public void testUpdateAndMergeMultipleMarkerUndoRedo()
-			throws ExecutionException, CoreException {
-		String[] types = new String[] { IMarker.BOOKMARK, IMarker.TASK,
-				CUSTOM_TYPE };
-		Map[] attrs = new Map[] { getInitialMarkerAttributes(),
-				getInitialMarkerAttributes(), getInitialMarkerAttributes() };
-		CreateMarkersOperation op = new CreateMarkersOperation(types, attrs,
-				new IFile[] { emptyTestFile, testFileWithContent,
-						testLinkedFile },
-				"Create Multiple Markers Same Type Test");
-		execute(op);
-		UpdateMarkersOperation updateOp = new UpdateMarkersOperation(op
-				.getMarkers(), getUpdatedMarkerAttributes(),
-				"Update and Merge Multiple Markers", true);
-		execute(updateOp);
-		validateCreatedMarkers(3, updateOp.getMarkers(), new Map[] {
-				mergedUpdatedAttributes, mergedUpdatedAttributes,
-				mergedUpdatedAttributes }, types);
-		undo();
-		validateCreatedMarkers(3, updateOp.getMarkers(), attrs, types);
-		redo();
-		validateCreatedMarkers(3, updateOp.getMarkers(), new Map[] {
-				mergedUpdatedAttributes, mergedUpdatedAttributes,
-				mergedUpdatedAttributes }, types);
-	}
-
-	public void testDeleteMarkersUndoRedo() throws ExecutionException,
-			CoreException {
-		String[] types = new String[] { IMarker.BOOKMARK, IMarker.TASK,
-				CUSTOM_TYPE };
-		Map[] attrs = new Map[] { getInitialMarkerAttributes(),
-				getUpdatedMarkerAttributes(), getInitialMarkerAttributes() };
-		CreateMarkersOperation op = new CreateMarkersOperation(types, attrs,
-				new IFile[] { emptyTestFile, testFileWithContent,
-						testLinkedFile },
-				"Create Multiple Markers Same Type Test");
-		execute(op);
-		IMarker[] markers = op.getMarkers();
-		DeleteMarkersOperation deleteOp = new DeleteMarkersOperation(markers,
-				"Delete Markers Test");
-		execute(deleteOp);
-		for (int i = 0; i < markers.length; i++) {
-			IMarker createdMarker = markers[i];
-			assertFalse("Marker should no longer exist", createdMarker.exists());
-		}
-		undo();
-		markers = deleteOp.getMarkers();
-		validateCreatedMarkers(3, markers, attrs, types);
-		redo();
-		for (int i = 0; i < markers.length; i++) {
-			IMarker createdMarker = markers[i];
-			assertFalse("Marker should no longer exist", createdMarker.exists());
-		}
-	}
-
-	/*
-	 * Test that the undo is invalid because one of the markers was deleted.
-	 */
-	public void testCreateMarkerUndoInvalid() throws ExecutionException,
-			CoreException {
-		String[] types = new String[] { IMarker.BOOKMARK, IMarker.TASK,
-				CUSTOM_TYPE };
-		Map[] attrs = new Map[] { getInitialMarkerAttributes(),
-				getUpdatedMarkerAttributes(), getInitialMarkerAttributes() };
-		CreateMarkersOperation op = new CreateMarkersOperation(types, attrs,
-				new IFile[] { emptyTestFile, testFileWithContent,
-						testLinkedFile },
-				"Create Multiple Markers Same Type Test");
-		execute(op);
-		IMarker[] markers = op.getMarkers();
-		markers[1].delete();
-		// Must compute status first because we don't perform expensive
-		// validations in canUndo(). However we should remember the validity
-		// once we've computed the status.
-		op.computeUndoableStatus(null);
-		assertFalse("Undo should be invalid, marker no longer exists", op
-				.canUndo());
-	}
-
-	/*
-	 * Test that the undo is invalid because one of the resources was deleted.
-	 */
-	public void testCreateMarkerUndoInvalid2() throws ExecutionException,
-			CoreException {
-		String[] types = new String[] { IMarker.BOOKMARK, IMarker.TASK,
-				CUSTOM_TYPE };
-		Map[] attrs = new Map[] { getInitialMarkerAttributes(),
-				getUpdatedMarkerAttributes(), getInitialMarkerAttributes() };
-		CreateMarkersOperation op = new CreateMarkersOperation(types, attrs,
-				new IFile[] { emptyTestFile, testFileWithContent,
-						testLinkedFile },
-				"Create Multiple Markers Same Type Test");
-		execute(op);
-		emptyTestFile.delete(true, getMonitor());
-		// Must compute status first because we don't perform expensive
-		// validations in canUndo(). However we should remember the validity
-		// once we've computed the status.
-		op.computeUndoableStatus(null);
-		assertFalse("Undo should be invalid, resource no longer exists", op
-				.canUndo());
-	}
-
-	public void testUpdateMarkersInvalid() throws ExecutionException,
-			CoreException {
-		String[] types = new String[] { IMarker.BOOKMARK, IMarker.TASK,
-				CUSTOM_TYPE };
-		Map[] attrs = new Map[] { getInitialMarkerAttributes(),
-				getInitialMarkerAttributes(), getInitialMarkerAttributes() };
-		CreateMarkersOperation op = new CreateMarkersOperation(types, attrs,
-				new IFile[] { emptyTestFile, testFileWithContent,
-						testLinkedFile },
-				"Create Multiple Markers Same Type Test");
-		execute(op);
-		UpdateMarkersOperation updateOp = new UpdateMarkersOperation(op
-				.getMarkers(), getUpdatedMarkerAttributes(),
-				"Update and Merge Multiple Markers", true);
-		execute(updateOp);
-		IMarker[] markers = updateOp.getMarkers();
-		markers[0].delete();
-		// Must compute status first because we don't perform expensive
-		// validations in canUndo(). However we should remember the validity
-		// once we've computed the status.
-		updateOp.computeUndoableStatus(null);
-
-		assertFalse("Undo should be invalid, marker no longer exists", updateOp
-				.canUndo());
-	}
-
-	public void testUpdateMarkersInvalid2() throws ExecutionException,
-			CoreException {
-		String[] types = new String[] { IMarker.BOOKMARK, IMarker.TASK,
-				CUSTOM_TYPE };
-		Map[] attrs = new Map[] { getInitialMarkerAttributes(),
-				getInitialMarkerAttributes(), getInitialMarkerAttributes() };
-		CreateMarkersOperation op = new CreateMarkersOperation(types, attrs,
-				new IFile[] { emptyTestFile, testFileWithContent,
-						testLinkedFile },
-				"Create Multiple Markers Same Type Test");
-		execute(op);
-		UpdateMarkersOperation updateOp = new UpdateMarkersOperation(op
-				.getMarkers(), getUpdatedMarkerAttributes(),
-				"Update and Merge Multiple Markers", true);
-		execute(updateOp);
-		testFileWithContent.delete(true, getMonitor());
-		// Must compute status first because we don't perform expensive
-		// validations in canUndo(). However we should remember the validity
-		// once we've computed the status.
-		updateOp.computeUndoableStatus(null);
-
-		assertFalse("Undo should be invalid, marker no longer exists", updateOp
-				.canUndo());
-	}
-
-	public void testProjectCreateUndoRedo() throws ExecutionException,
-			CoreException {
-		CreateProjectOperation op = new CreateProjectOperation(
-				getNewProjectDescription(), "testProjectCreate");
-		execute(op);
-		IProject project = getWorkspaceRoot().getProject(TEST_NEWPROJECT_NAME);
-		assertTrue("Project creation failed", project.exists());
-		ProjectSnapshot snap = new ProjectSnapshot(project);
-		undo();
-		assertFalse("Project deletion failed", project.exists());
-		redo();
-		assertTrue("Project recreation failed", project.exists());
-		assertTrue("Project not restored properly", snap.isValid());
-	}
-
-	public void testProjectMoveUndoRedo() throws ExecutionException,
-			CoreException {
-		URI projectTargetLocation = URIUtil.toURI(URIUtil.toPath(
-				getTempProjectDir()).append(TEST_PROJECT_NAME));
-		MoveProjectOperation op = new MoveProjectOperation(testProject,
-				projectTargetLocation, "testProjectMove");
-		ProjectSnapshot snap = new ProjectSnapshot(testProject);
-		execute(op);
-		assertNotNull("Project move failed", testProject.getDescription()
-				.getLocationURI());
-		assertTrue("Project contents were altered", snap.isValid());
-		undo();
-		assertNull("Project move undo failed", testProject.getDescription()
-				.getLocationURI());
-		assertTrue("Project contents were altered", snap.isValid());
-		redo();
-		assertEquals("Project move redo failed", testProject.getDescription()
-				.getLocationURI(), projectTargetLocation);
-		assertTrue("Project contents were altered", snap.isValid());
-	}
-
-	public void testProjectMoveInvalidLocationUndoRedo()
-			throws ExecutionException {
-		// invalid target - already used by another project
-		MoveProjectOperation op = new MoveProjectOperation(testProject,
-				targetProject.getLocationURI(),
-				"testProjectMoveInvalidLocation");
-		executeExpectFail(op);
-	}
-
-	public void testProjectCopyUndoRedo() throws ExecutionException,
-			CoreException {
-		CopyProjectOperation op = new CopyProjectOperation(testProject,
-				TEST_NEWPROJECT_NAME, null, "testProjectCopy");
-		ProjectSnapshot snap = new ProjectSnapshot(testProject);
-		execute(op);
-		IProject copiedProject = getWorkspaceRoot().getProject(
-				TEST_NEWPROJECT_NAME);
-		assertTrue("Project copy failed", copiedProject.exists());
-		assertTrue("Source project was altered", snap.isValid());
-		snap.name = TEST_NEWPROJECT_NAME;
-		assertTrue("Project copy does not match", snap.isValid());
-		undo();
-		assertFalse("Copy undo failed", copiedProject.exists());
-		redo();
-		assertTrue("Project not restored properly on redo", snap.isValid());
-		snap.name = TEST_PROJECT_NAME;
-		assertTrue("Source project was altered", snap.isValid());
-	}
-
-	public void testProjectClosedCopyUndoRedo() throws ExecutionException,
-			CoreException {
-		testProject.close(getMonitor());
-		testProjectCopyUndoRedo();
-	}
-
-	public void testProjectCopyAndChangeLocationUndoRedo()
-			throws ExecutionException, CoreException {
-		URI projectTargetLocation = URIUtil.toURI(URIUtil.toPath(
-				getTempProjectDir()).append(TEST_PROJECT_NAME));
-		CopyProjectOperation op = new CopyProjectOperation(testProject,
-				TEST_NEWPROJECT_NAME, projectTargetLocation,
-				"testProjectCopyToNewLocation");
-		ProjectSnapshot snap = new ProjectSnapshot(testProject);
-		execute(op);
-		IProject copiedProject = getWorkspaceRoot().getProject(
-				TEST_NEWPROJECT_NAME);
-		assertTrue("Project copy failed", copiedProject.exists());
-		assertEquals("Project location copy failed", copiedProject
-				.getDescription().getLocationURI(), projectTargetLocation);
-		assertTrue("Source project was altered", snap.isValid());
-		snap.name = TEST_NEWPROJECT_NAME;
-		assertTrue("Project copy does not match", snap.isValid());
-		undo();
-		assertFalse("Copy undo failed", copiedProject.exists());
-		redo();
-		assertTrue("Project not restored properly on redo", snap.isValid());
-		assertEquals("Project location not restored properly", copiedProject
-				.getDescription().getLocationURI(), projectTargetLocation);
-		snap.name = TEST_PROJECT_NAME;
-		assertTrue("Source project was altered", snap.isValid());
-	}
-
-	public void testProjectClosedCopyAndChangeLocationUndoRedo()
-			throws ExecutionException, CoreException {
-		testProject.close(getMonitor());
-		testProjectCopyAndChangeLocationUndoRedo();
-	}
-
-	public void testProjectCopyAndChangeToInvalidLocationUndoRedo()
-			throws ExecutionException {
-		// invalid target - already used by another project
-		CopyProjectOperation op = new CopyProjectOperation(testProject,
-				TEST_NEWPROJECT_NAME, targetProject.getLocationURI(),
-				"testProjectCopyInvalidLocation");
-		executeExpectFail(op);
-	}
-
-	public void testProjectRenameUndoRedo() throws ExecutionException,
-			CoreException {
-		MoveResourcesOperation op = new MoveResourcesOperation(testProject,
-				new Path(TEST_NEWPROJECT_NAME), "testProjectRename");
-		ProjectSnapshot snap = new ProjectSnapshot(testProject);
-		execute(op);
-		IProject renamedProject = getWorkspaceRoot().getProject(
-				TEST_NEWPROJECT_NAME);
-		assertTrue("Project rename failed", renamedProject.exists());
-		snap.name = TEST_NEWPROJECT_NAME;
-		assertTrue("Project content was altered on rename", snap.isValid());
-		undo();
-		snap.name = TEST_PROJECT_NAME;
-		assertTrue("Project content was altered on undo rename", snap.isValid());
-		assertFalse("Undo rename failed", renamedProject.exists());
-		redo();
-		snap.name = TEST_NEWPROJECT_NAME;
-		assertTrue("Project content was altered on redo rename", snap.isValid());
-	}
-
-	public void testProjectDeleteUndoRedo() throws ExecutionException, CoreException {
-		ProjectSnapshot snap = new ProjectSnapshot(testProject);
-		
-		DeleteResourcesOperation op = new DeleteResourcesOperation(
-				new IResource[] { testProject }, "testProjectDelete", false);
-		execute(op);
-		assertFalse("Project delete failed", testProject.exists());
-		undo();
-		assertTrue("Project recreation failed", testProject.exists());
-		// force a refresh so that the project is in sync with the file system.  Normally the
-		// project opens in the background, so without this refresh we may or may not have
-		// the contents yet.
-		testProject.refreshLocal(IResource.DEPTH_INFINITE, getMonitor());
-		assertTrue("Project content was altered on undo", snap.isValid());
-		redo();
-		assertFalse("Redo delete failed", testProject.exists());
-		// We undo again so that the project will exist during teardown and
-		// get cleaned up. Otherwise some content is left on disk.
-		undo();
-	}
-	
-	public void test223956() throws ExecutionException, CoreException {
-		// put a marker on a file contained in the test project
-		Map[] attrs = new Map[] { getInitialMarkerAttributes()};
-		CreateMarkersOperation markerCreate = new CreateMarkersOperation(new String[] { IMarker.BOOKMARK }, attrs,
-				new IFile[] { testFileWithContent},
-				"Test bug 223956");
-		execute(markerCreate);
-		DeleteResourcesOperation op = new DeleteResourcesOperation(
-				new IResource[] { testProject }, "testProjectDelete", false);
-		execute(op);
-		assertFalse("Project delete failed", testProject.exists());
-		undo();
-		assertTrue("Project recreation failed", testProject.exists());
-		assertTrue("Marker should not exist at project level", testProject.findMarkers(IMarker.BOOKMARK, false, IResource.DEPTH_ZERO).length == 0);
-		assertTrue("Marker should have been restored in child file", testFileWithContent.findMarkers(IMarker.BOOKMARK, false, IResource.DEPTH_ZERO).length == 1);
-	}
-	
-	public void test201441() throws ExecutionException, CoreException {
-		String utf8 = "UTF-8";
-		// set the charset on the project explicitly
-		testProject.setDefaultCharset(utf8, getMonitor());
-		DeleteResourcesOperation op = new DeleteResourcesOperation(
-				new IResource[] { testProject }, "testProjectDelete", false);
-		execute(op);
-		assertFalse("Project delete failed", testProject.exists());
-		undo();
-		assertTrue("Project recreation failed", testProject.exists());
-		assertEquals("Character set not restored", testProject.getDefaultCharset(), utf8);
-	}
-
-	public void testProjectClosedDeleteUndoRedo() throws ExecutionException,
-			CoreException {
-		testProject.close(getMonitor());
-		testProjectDeleteUndoRedo();
-	}
-
-	public void testProjectDeleteWithContentUndoRedo()
-			throws ExecutionException {
-		DeleteResourcesOperation op = new DeleteResourcesOperation(
-				new IResource[] { testProject }, "testProjectDelete", true);
-		// we don't snapshot since content will be deleted
-		execute(op);
-		assertFalse("Project delete failed", testProject.exists());
-		undo();
-		assertTrue("Project was recreated", testProject.exists());
-		redo();
-		assertFalse("Redo delete failed", testProject.exists());
-	}
-
-	public void testProjectClosedDeleteWithContentUndoRedo()
-			throws ExecutionException, CoreException {
-		testProject.close(getMonitor());
-		testProjectDeleteWithContentUndoRedo();
-	}
-
-	public void testFolderCreateLeafUndoRedo() throws ExecutionException {
-		IFolder folder = getWorkspaceRoot().getFolder(
-				testProject.getFullPath().append(TEST_NEWFOLDER_NAME));
-		CreateFolderOperation op = new CreateFolderOperation(folder, null,
-				"testFolderCreateLeaf");
-		assertFalse("Folder should not exist before test is run", folder
-				.exists());
-		execute(op);
-		assertTrue("Folder creation failed", folder.exists());
-		undo();
-		assertFalse("Folder deletion failed", folder.exists());
-		redo();
-		assertTrue("Folder recreation failed", folder.exists());
-	}
-
-	public void testFolderCreateNestedInProjectUndoRedo()
-			throws ExecutionException {
-		// uses a nested path to force creation of nonexistent parents
-		IFolder folder = getWorkspaceRoot().getFolder(
-				testProject.getFullPath().append(TEST_NEWNESTEDFOLDER_NAME));
-		CreateFolderOperation op = new CreateFolderOperation(folder, null,
-				"testFolderCreateNested");
-		assertFalse("Folder should not exist before test is run", folder
-				.exists());
-		execute(op);
-		assertTrue("Folder creation failed", folder.exists());
-		undo();
-		assertFalse("Folder deletion failed", folder.exists());
-		// Ensure all created parents are gone, too
-		IPath path = new Path(TEST_NEWNESTEDFOLDER_NAME);
-		path.removeLastSegments(path.segmentCount() - 1);
-		IFolder parent = getWorkspaceRoot().getFolder(
-				testProject.getFullPath().append(path));
-		assertFalse("Deletion of created parents failed", parent.exists());
-
-		redo();
-		assertTrue("Folder recreation failed", folder.exists());
-	}
-
-	public void testFolderCreateNestedInFolderUndoRedo()
-			throws ExecutionException {
-		// Uses a nested path to force creation of nonexistent parents.
-		// Parent is a folder, not a project.
-		IFolder folder = getWorkspaceRoot().getFolder(
-				testFolder.getFullPath().append(TEST_NEWNESTEDFOLDER_NAME));
-		CreateFolderOperation op = new CreateFolderOperation(folder, null,
-				"testFolderCreateNestedInFolder");
-		assertFalse("Folder should not exist before test is run", folder
-				.exists());
-		execute(op);
-		assertTrue("Folder creation failed", folder.exists());
-
-		undo();
-		assertFalse("Folder deletion failed", folder.exists());
-		// Ensure all created parents are gone, too
-		IPath path = new Path(TEST_NEWNESTEDFOLDER_NAME);
-		path.removeLastSegments(path.segmentCount() - 1);
-		IFolder parent = getWorkspaceRoot().getFolder(
-				testFolder.getFullPath().append(path));
-		assertFalse("Deletion of created parents failed", parent.exists());
-
-		redo();
-		assertTrue("Folder recreation failed", folder.exists());
-	}
-
-	public void testDeleteNestedResourcesUndoRedo()
-			throws ExecutionException {
-		// Creates nested folders and then tests that mass deletion of these records only the
-		// deepest.
-		IFolder folder = getWorkspaceRoot().getFolder(
-				testFolder.getFullPath().append(TEST_NEWNESTEDFOLDER_NAME));
-		IFolder parent = getWorkspaceRoot().getFolder(testFolder.getFullPath().append(TEST_NESTEDFOLDER_PARENT_NAME));
-		IFolder root = getWorkspaceRoot().getFolder(testFolder.getFullPath().append(TEST_NESTEDFOLDER_ROOT_PARENT_NAME));
-
-		AbstractWorkspaceOperation op = new CreateFolderOperation(folder, null,
-				"testFolderCreateNestedInFolder");
-		execute(op);
-		assertTrue("Folder creation failed", folder.exists());
-		assertTrue("Folder creation failed", parent.exists());
-		assertTrue("Folder creation failed", root.exists());
-
-		op = new DeleteResourcesOperation(new IResource[] {folder, parent, root}, "testDeleteNestedResourcesUndoRedo", true);
-		execute(op);
-		assertFalse("Folder deletion failed", folder.exists());
-		assertFalse("Folder deletion failed", parent.exists());
-		assertFalse("Folder deletion failed", root.exists());
-		
-		undo();
-		assertTrue("Folder creation failed", folder.exists());
-		assertTrue("Folder creation failed", parent.exists());
-		assertTrue("Folder creation failed", root.exists());
-
-	}
-
-	public void testFolderCreateLinkedUndoRedo() throws ExecutionException {
-		IFolder folder = getWorkspaceRoot().getFolder(
-				testProject.getFullPath().append(TEST_NEWFOLDER_NAME));
-		CreateFolderOperation op = new CreateFolderOperation(folder,
-				testSubFolder.getLocationURI(), "testFolderCreateLink");
-		assertFalse("Folder should not exist before test is run", folder
-				.exists());
-		execute(op);
-		assertTrue("Folder creation failed", folder.exists());
-		assertTrue("Folder was not created as a link", folder.isLinked());
-		undo();
-		assertFalse("Folder deletion failed", folder.exists());
-		redo();
-		assertTrue("Folder recreation failed", folder.exists());
-		assertTrue("Folder was not recreated as a link", folder.isLinked());
-	}
-
-	public void testFolderCreateLinkedNestedUndoRedo()
-			throws ExecutionException {
-		// Use nested name with uncreated parents
-		IFolder folder = getWorkspaceRoot().getFolder(
-				testProject.getFullPath().append(TEST_NEWNESTEDFOLDER_NAME));
-		CreateFolderOperation op = new CreateFolderOperation(folder,
-				testSubFolder.getLocationURI(), "testFolderCreateNestedLink");
-		assertFalse("Folder should not exist before test is run", folder
-				.exists());
-		execute(op);
-		assertTrue("Folder creation failed", folder.exists());
-		assertTrue("Folder was not created as a link", folder.isLinked());
-		undo();
-		assertFalse("Folder deletion failed", folder.exists());
-		// Ensure all created parents are gone, too
-		IPath path = new Path(TEST_NEWNESTEDFOLDER_NAME);
-		path.removeLastSegments(path.segmentCount() - 1);
-		IFolder parent = getWorkspaceRoot().getFolder(
-				testProject.getFullPath().append(path));
-		assertFalse("Parents should have been removed", parent.exists());
-		// Redo
-		redo();
-		assertTrue("Folder recreation failed", folder.exists());
-		assertTrue("Folder was not recreated as a link", folder.isLinked());
-	}
-
-	public void testFolderMoveUndoRedo() throws ExecutionException,
-			CoreException {
-		IPath targetPath = targetProject.getFullPath().append(
-				testFolder.getName());
-		MoveResourcesOperation op = new MoveResourcesOperation(testFolder,
-				targetPath, "testFolderMove");
-		FolderSnapshot snap = new FolderSnapshot(testFolder);
-		execute(op);
-		IFolder movedFolder = getWorkspaceRoot().getFolder(targetPath);
-		assertTrue("Folder move failed", movedFolder.exists());
-		assertTrue("Folder content was altered", snap.isValid(targetProject));
-
-		undo();
-		movedFolder = getWorkspaceRoot().getFolder(targetPath);
-		assertFalse("Move undo failed", movedFolder.exists());
-		assertTrue("Folder content was altered on undo", snap
-				.isValid(testProject));
-
-		redo();
-		movedFolder = getWorkspaceRoot().getFolder(targetPath);
-		assertTrue("Folder move failed", movedFolder.exists());
-		assertTrue("Folder content was altered", snap.isValid(targetProject));
-	}
-
-	public void testRedundantSubFolderMoveUndoRedo() throws ExecutionException,
-			CoreException {
-		IPath targetPath = targetProject.getFullPath();
-		IPath targetPathWithName = targetPath.append(testFolder.getName());
-		MoveResourcesOperation op = new MoveResourcesOperation(new IResource[] {
-				testFolder, testSubFolder }, targetPath,
-				"testRedundantSubFolderMove");
-		FolderSnapshot snap = new FolderSnapshot(testFolder);
-		execute(op);
-		IFolder movedFolder = getWorkspaceRoot().getFolder(targetPathWithName);
-		assertTrue("Folder move failed", movedFolder.exists());
-		assertTrue("Folder content was altered", snap.isValid(targetProject));
-
-		undo();
-		movedFolder = getWorkspaceRoot().getFolder(targetPathWithName);
-		assertFalse("Move undo failed", movedFolder.exists());
-		assertTrue("Folder content was altered on undo", snap
-				.isValid(testProject));
-
-		redo();
-		movedFolder = getWorkspaceRoot().getFolder(targetPathWithName);
-		assertTrue("Folder move failed", movedFolder.exists());
-		assertTrue("Folder content was altered", snap.isValid(targetProject));
-	}
-
-	public void testRedundantFolderFileMoveUndoRedo()
-			throws ExecutionException, CoreException {
-		IPath targetPath = targetProject.getFullPath();
-		IPath targetPathWithName = targetPath.append(testFolder.getName());
-		MoveResourcesOperation op = new MoveResourcesOperation(new IResource[] {
-				testFolder, testFileWithContent }, targetPath,
-				"testRedundantFolderFileMove");
-		FolderSnapshot snap = new FolderSnapshot(testFolder);
-		execute(op);
-		IFolder movedFolder = getWorkspaceRoot().getFolder(targetPathWithName);
-		assertTrue("Folder move failed", movedFolder.exists());
-		assertTrue("Folder content was altered", snap.isValid(targetProject));
-
-		undo();
-		movedFolder = getWorkspaceRoot().getFolder(targetPathWithName);
-		assertFalse("Move undo failed", movedFolder.exists());
-		assertTrue("Folder content was altered on undo", snap
-				.isValid(testProject));
-
-		redo();
-		movedFolder = getWorkspaceRoot().getFolder(targetPathWithName);
-		assertTrue("Folder move failed", movedFolder.exists());
-		assertTrue("Folder content was altered", snap.isValid(targetProject));
-	}
-
-	public void testFolderCopyUndoRedo() throws ExecutionException,
-			CoreException {
-		// copying with same name to a new project
-		CopyResourcesOperation op = new CopyResourcesOperation(
-				new IResource[] { testFolder }, targetProject.getFullPath(),
-				"testFolderCopy");
-		FolderSnapshot snap = new FolderSnapshot(testFolder);
-		execute(op);
-		IFolder copiedFolder = targetProject.getFolder(testFolder.getName());
-		assertTrue("Folder copy failed", copiedFolder.exists());
-		assertTrue("Source folder was altered", snap.isValid(testProject));
-		assertTrue("Folder copy does not match", snap.isValid(targetProject));
-
-		undo();
-		assertFalse("Copy undo failed", copiedFolder.exists());
-
-		redo();
-		assertTrue("Folder not restored properly on redo", snap
-				.isValid(targetProject));
-		assertTrue("Source folder was altered", snap.isValid(testProject));
-	}
-
-	public void testFolderCopyLinkUndoRedo() throws ExecutionException,
-			CoreException {
-		// copying with same name to a new project
-		CopyResourcesOperation op = new CopyResourcesOperation(
-				new IResource[] { testLinkedFolder }, targetProject
-						.getFullPath(), "testLinkedFolderCopy");
-		FolderSnapshot snap = new FolderSnapshot(testLinkedFolder);
-		execute(op);
-		IFolder copiedFolder = targetProject.getFolder(testLinkedFolder
-				.getName());
-		assertTrue("Folder copy failed", copiedFolder.exists());
-		assertTrue("Source folder was altered", snap.isValid(testFolder));
-		assertTrue("Folder copy does not match", snap.isValid(targetProject));
-
-		undo();
-		assertFalse("Copy undo failed", copiedFolder.exists());
-
-		redo();
-		assertTrue("Folder not restored properly on redo", snap
-				.isValid(targetProject));
-		assertTrue("Source folder was altered", snap.isValid(testFolder));
-	}
-
-	public void testFolderCopyRenameUndoRedo() throws ExecutionException,
-			CoreException {
-		// copying with a different name to the same project
-		CopyResourcesOperation op = new CopyResourcesOperation(testFolder,
-				testProject.getFullPath().append(TEST_NEWFOLDER_NAME),
-				"testFolderCopyRename");
-		FolderSnapshot snap = new FolderSnapshot(testFolder);
-		execute(op);
-
-		IFolder copiedFolder = testProject.getFolder(TEST_NEWFOLDER_NAME);
-		assertTrue("Folder copy failed", copiedFolder.exists());
-		assertTrue("Source folder was altered", snap.isValid(testProject));
-		snap.name = TEST_NEWFOLDER_NAME;
-		assertTrue("Folder copy does not match", snap.isValid(testProject));
-
-		undo();
-		assertFalse("Copy undo failed", copiedFolder.exists());
-
-		redo();
-		assertTrue("Folder not restored properly on redo", snap
-				.isValid(testProject));
-		snap.name = TEST_FOLDER_NAME;
-		assertTrue("Source folder was altered", snap.isValid(testProject));
-
-	}
-
-	public void testFolderRenameUndoRedo() throws ExecutionException,
-			CoreException {
-		MoveResourcesOperation op = new MoveResourcesOperation(testFolder,
-				testProject.getFullPath().append(TEST_NEWFOLDER_NAME),
-				"testFolderRename");
-		FolderSnapshot snap = new FolderSnapshot(testFolder);
-		execute(op);
-		IFolder renamedFolder = testProject.getFolder(TEST_NEWFOLDER_NAME);
-		assertTrue("Project rename failed", renamedFolder.exists());
-		snap.name = TEST_NEWFOLDER_NAME;
-		assertTrue("Folder content was altered on rename", snap
-				.isValid(testProject));
-
-		undo();
-		snap.name = TEST_FOLDER_NAME;
-		assertTrue("Folder content was altered on undo rename", snap
-				.isValid(testProject));
-		assertFalse("Undo rename failed", renamedFolder.exists());
-
-		redo();
-		snap.name = TEST_NEWFOLDER_NAME;
-		assertTrue("Folder content was altered on redo rename", snap
-				.isValid(testProject));
-	}
-
-	public void testFolderDeleteUndoRedo() throws ExecutionException,
-			CoreException {
-		DeleteResourcesOperation op = new DeleteResourcesOperation(
-				new IResource[] { testSubFolder }, "testFolderDelete", false);
-		FolderSnapshot snap = new FolderSnapshot(testSubFolder);
-		execute(op);
-		assertFalse("Folder delete failed", testSubFolder.exists());
-		undo();
-		assertTrue("Folder recreation failed", testSubFolder.exists());
-		assertTrue("Folder content was altered on undo", snap
-				.isValid(testSubFolder.getParent()));
-		redo();
-		assertFalse("Redo delete failed", testSubFolder.exists());
-	}
-
-	public void testNestedRedundantFolderDeleteUndoRedo()
-			throws ExecutionException, CoreException {
-		DeleteResourcesOperation op = new DeleteResourcesOperation(
-				new IResource[] { testFolder, testSubFolder },
-				"testNestedRedundantFolderDelete", false);
-		FolderSnapshot snap = new FolderSnapshot(testFolder);
-		execute(op);
-		assertFalse("Folder delete failed", testFolder.exists());
-		undo();
-		assertTrue("Folder recreation failed", testFolder.exists());
-		assertTrue("SubFolder recreation failed", testSubFolder.exists());
-		assertTrue("Folder content was altered on undo", snap
-				.isValid(testFolder.getParent()));
-		redo();
-		assertFalse("Redo delete failed", testFolder.exists());
-	}
-
-	public void testNestedRedundantFileDeleteUndoRedo()
-			throws ExecutionException, CoreException {
-		DeleteResourcesOperation op = new DeleteResourcesOperation(
-				new IResource[] { testFolder, testFileWithContent },
-				"testNestedRedundantFileDelete", false);
-		FolderSnapshot snap = new FolderSnapshot(testFolder);
-		execute(op);
-		assertFalse("Folder delete failed", testFolder.exists());
-		undo();
-		assertTrue("Folder recreation failed", testFolder.exists());
-		assertTrue("SubFolder recreation failed", testSubFolder.exists());
-		assertTrue("File recreation failed", testFileWithContent.exists());
-		assertTrue("Folder content was altered on undo", snap
-				.isValid(testFolder.getParent()));
-		redo();
-		assertFalse("Redo delete failed", testFolder.exists());
-	}
-
-	public void testFolderDeleteLinkedUndoRedo() throws ExecutionException,
-			CoreException {
-		DeleteResourcesOperation op = new DeleteResourcesOperation(
-				new IResource[] { testLinkedFolder }, "testFolderDeleteLinked",
-				false);
-		FolderSnapshot snap = new FolderSnapshot(testLinkedFolder);
-		execute(op);
-		assertFalse("Folder delete failed", testLinkedFolder.exists());
-		undo();
-		assertTrue("Folder recreation failed", testLinkedFolder.exists());
-		assertTrue("Folder content was altered on undo", snap
-				.isValid(testLinkedFolder.getParent()));
-		redo();
-		assertFalse("Redo delete failed", testLinkedFolder.exists());
-	}
-
-	public void testFileCreateLeafUndoRedo() throws ExecutionException,
-			CoreException {
-		IFile file = getWorkspaceRoot().getFile(
-				testProject.getFullPath().append(TEST_NEWFILE_NAME));
-		CreateFileOperation op = new CreateFileOperation(file, null,
-				getContents(getRandomString()), "testFileCreateLeaf");
-		assertFalse("File should not exist before test is run", file.exists());
-		execute(op);
-		assertTrue("File creation failed", file.exists());
-		FileSnapshot snapshot = new FileSnapshot(file);
-		undo();
-		assertFalse("File deletion failed", file.exists());
-		redo();
-		assertTrue("File recreation failed", file.exists());
-		assertTrue("File content improperly restored", snapshot.isValid(file
-				.getParent()));
-	}
-
-	public void testFileCreateNestedInProjectUndoRedo()
-			throws ExecutionException, CoreException {
-		// Uses file name with non-existent folder parents
-		IFile file = getWorkspaceRoot().getFile(
-				testProject.getFullPath().append(TEST_NEWNESTEDFILE_NAME));
-		CreateFileOperation op = new CreateFileOperation(file, null,
-				getContents(getRandomString()), "testFileCreateNestedInProject");
-		assertFalse("File should not exist before test is run", file.exists());
-		execute(op);
-		assertTrue("File creation failed", file.exists());
-		FileSnapshot snapshot = new FileSnapshot(file);
-
-		undo();
-		assertFalse("File deletion failed", file.exists());
-		// Ensure all created parents are gone, too
-		IPath path = new Path(TEST_NEWNESTEDFILE_NAME);
-		path.removeLastSegments(path.segmentCount() - 1);
-		IFolder parent = getWorkspaceRoot().getFolder(
-				testProject.getFullPath().append(path));
-		assertFalse("Deletion of created parents failed", parent.exists());
-
-		redo();
-		assertTrue("File recreation failed", file.exists());
-		assertTrue("File content improperly restored", snapshot.isValid(file
-				.getParent()));
-	}
-
-	public void testFileCreateNestedInFolderUndoRedo()
-			throws ExecutionException, CoreException {
-		// Uses file name with non-existent folder parents.
-		// Uses subfolder as a parent
-		IFile file = getWorkspaceRoot().getFile(
-				testSubFolder.getFullPath().append(TEST_NEWNESTEDFILE_NAME));
-		CreateFileOperation op = new CreateFileOperation(file, null,
-				getContents(getRandomString()),
-				"testFileCreateNestedInSubfolder");
-		assertFalse("File should not exist before test is run", file.exists());
-		execute(op);
-		assertTrue("File creation failed", file.exists());
-		FileSnapshot snapshot = new FileSnapshot(file);
-
-		undo();
-		assertFalse("File deletion failed", file.exists());
-		// Ensure all created parents are gone, too
-		IPath path = new Path(TEST_NEWNESTEDFILE_NAME);
-		path.removeLastSegments(path.segmentCount() - 1);
-		IFolder parent = getWorkspaceRoot().getFolder(
-				testSubFolder.getFullPath().append(path));
-		assertFalse("Deletion of created parents failed", parent.exists());
-
-		redo();
-		assertTrue("File recreation failed", file.exists());
-		assertTrue("File content improperly restored", snapshot.isValid(file
-				.getParent()));
-	}
-
-	public void testFileCreateLinkedUndoRedo() throws ExecutionException,
-			CoreException {
-		IFile file = getWorkspaceRoot().getFile(
-				testProject.getFullPath().append(TEST_NEWFILE_NAME));
-		CreateFileOperation op = new CreateFileOperation(file,
-				testFileWithContent.getLocationURI(), null,
-				"testFileCreateLink");
-		assertFalse("File should not exist before test is run", file.exists());
-
-		execute(op);
-		assertTrue("File creation failed", file.exists());
-		assertTrue("File was not created as link", file.isLinked());
-		assertEquals("Linked content not equal", readContent(file),
-				readContent(testFileWithContent));
-
-		undo();
-		assertFalse("File deletion failed", file.exists());
-
-		redo();
-		assertTrue("File was not created as link", file.isLinked());
-		assertEquals("Linked content not equal", readContent(file),
-				readContent(testFileWithContent));
-	}
-
-	public void testFileCreateLinkedNestedUndoRedo() throws ExecutionException,
-			CoreException {
-		IFile file = getWorkspaceRoot().getFile(
-				testProject.getFullPath().append(TEST_NEWNESTEDFILE_NAME));
-		CreateFileOperation op = new CreateFileOperation(file,
-				testFileWithContent.getLocationURI(), null,
-				"testFileCreateLinkNested");
-		assertFalse("File should not exist before test is run", file.exists());
-
-		execute(op);
-		assertTrue("File creation failed", file.exists());
-		assertTrue("File was not created as link", file.isLinked());
-		assertEquals("Linked content not equal", readContent(file),
-				readContent(testFileWithContent));
-
-		undo();
-		assertFalse("File deletion failed", file.exists());
-		// Ensure all created parents are gone, too
-		IPath path = new Path(TEST_NEWNESTEDFILE_NAME);
-		path.removeLastSegments(path.segmentCount() - 1);
-		IFolder parent = getWorkspaceRoot().getFolder(
-				testProject.getFullPath().append(path));
-		assertFalse("Deletion of created parents failed", parent.exists());
-
-		redo();
-		assertTrue("File was not created as link", file.isLinked());
-		assertEquals("Linked content not equal", readContent(file),
-				readContent(testFileWithContent));
-	}
-
-	public void testFileMoveUndoRedo() throws ExecutionException, CoreException {
-		// Moving from a folder in one project to the top level of another
-		// project
-		IPath targetPath = targetProject.getFullPath().append(
-				testFileWithContent.getName());
-		MoveResourcesOperation op = new MoveResourcesOperation(
-				testFileWithContent, targetPath, "testFileMove");
-		FileSnapshot snap = new FileSnapshot(testFileWithContent);
-		execute(op);
-		IFile movedFile = getWorkspaceRoot().getFile(targetPath);
-		assertTrue("File move failed", movedFile.exists());
-		assertTrue("File content was altered", snap.isValid(targetProject));
-
-		undo();
-		movedFile = getWorkspaceRoot().getFile(targetPath);
-		assertFalse("Move undo failed", movedFile.exists());
-		assertTrue("File content was altered on undo", snap.isValid(testFolder));
-
-		redo();
-		movedFile = getWorkspaceRoot().getFile(targetPath);
-		assertTrue("File move failed", movedFile.exists());
-		assertTrue("File content was altered", snap.isValid(targetProject));
-	}
-
-	public void testFileMoveAndOverwriteUndoRedo() throws ExecutionException,
-			CoreException {
-		// Moving a file from a folder inside that the same folder on top of an
-		// existent file
-		IPath sourcePath = emptyTestFile.getFullPath();
-		IPath targetPath = testFileWithContent.getFullPath();
-		MoveResourcesOperation op = new MoveResourcesOperation(emptyTestFile,
-				targetPath, "testFileMoveOverwrite");
-		FileSnapshot source = new FileSnapshot(emptyTestFile);
-		FileSnapshot overwritten = new FileSnapshot(testFileWithContent);
-		execute(op);
-		IFile sourceFile = getWorkspaceRoot().getFile(sourcePath);
-		assertFalse("File move failed", sourceFile.exists());
-		source.name = TEST_RANDOMFILE_NAME;
-		assertTrue("Source content was altered at target", source
-				.isValid(testFolder));
-
-		undo();
-		assertTrue("File restore failed", sourceFile.exists());
-		assertTrue("Overwritten file was not restored", overwritten
-				.isValid(testFolder));
-		source.name = TEST_EMPTYFILE_NAME;
-		assertTrue("Source file content was not restored", source
-				.isValid(testFolder));
-
-		redo();
-		sourceFile = getWorkspaceRoot().getFile(sourcePath);
-		assertFalse("File move failed", sourceFile.exists());
-		source.name = TEST_RANDOMFILE_NAME;
-		assertTrue("Source content was altered at target", source
-				.isValid(testFolder));
-	}
-
-	public void testFileCopyUndoRedo() throws ExecutionException, CoreException {
-		// copying with same name to a new project
-		CopyResourcesOperation op = new CopyResourcesOperation(
-				new IResource[] { testFileWithContent }, targetProject
-						.getFullPath(), "testFileCopy");
-		FileSnapshot snap = new FileSnapshot(testFileWithContent);
-		execute(op);
-		IFile copiedFile = targetProject.getFile(testFileWithContent.getName());
-		assertTrue("File copy failed", copiedFile.exists());
-		assertTrue("Source file was altered", snap.isValid(testFolder));
-		assertTrue("File copy does not match", snap.isValid(targetProject));
-
-		undo();
-		assertFalse("Copy undo failed", copiedFile.exists());
-
-		redo();
-		assertTrue("File not restored properly on redo", snap
-				.isValid(targetProject));
-		assertTrue("Source file was altered", snap.isValid(testFolder));
-	}
-
-	public void testFileCopyLinkUndoRedo() throws ExecutionException,
-			CoreException {
-		// copying with same name to a new project
-		CopyResourcesOperation op = new CopyResourcesOperation(
-				new IResource[] { testLinkedFile },
-				targetProject.getFullPath(), "testFileLinkCopy");
-		FileSnapshot snap = new FileSnapshot(testLinkedFile);
-		execute(op);
-		IFile copiedFile = targetProject.getFile(testLinkedFile.getName());
-		assertTrue("File copy failed", copiedFile.exists());
-		assertTrue("Source file was altered", snap.isValid(testFolder));
-		assertTrue("File copy does not match", snap.isValid(targetProject));
-
-		undo();
-		assertFalse("Copy undo failed", copiedFile.exists());
-
-		redo();
-		assertTrue("File not restored properly on redo", snap
-				.isValid(targetProject));
-		assertTrue("Source file was altered", snap.isValid(testFolder));
-	}
-
-	public void testFileCopyRenameUndoRedo() throws ExecutionException,
-			CoreException {
-		// copying with a different name to the same project
-		CopyResourcesOperation op = new CopyResourcesOperation(
-				testFileWithContent, testProject.getFullPath().append(
-						TEST_NEWFILE_NAME), "testFileCopyRename");
-		FileSnapshot snap = new FileSnapshot(testFileWithContent);
-		execute(op);
-
-		IFile copiedFile = testProject.getFile(TEST_NEWFILE_NAME);
-		assertTrue("File copy failed", copiedFile.exists());
-		assertTrue("Source folder was altered", snap.isValid(testFolder));
-		snap.name = TEST_NEWFILE_NAME;
-		assertTrue("File copy does not match", snap.isValid(testProject));
-
-		undo();
-		assertFalse("Copy undo failed", copiedFile.exists());
-
-		redo();
-		assertTrue("File not restored properly on redo", snap
-				.isValid(testProject));
-		snap.name = TEST_RANDOMFILE_NAME;
-		assertTrue("Source folder was altered", snap.isValid(testFolder));
-	}
-
-	public void testFileCopyAndOverwriteUndoRedo() throws ExecutionException,
-			CoreException {
-		// Copying from a file in a folder to the same folder on top of an
-		// existent file
-		IPath targetPath = testFileWithContent.getFullPath();
-		CopyResourcesOperation op = new CopyResourcesOperation(emptyTestFile,
-				targetPath, "testFileMoveOverwrite");
-		FileSnapshot source = new FileSnapshot(emptyTestFile);
-		FileSnapshot overwritten = new FileSnapshot(testFileWithContent);
-		execute(op);
-		assertTrue("Source content was altered", source.isValid(testFolder));
-		source.name = TEST_RANDOMFILE_NAME;
-		assertTrue("Source content was altered at target", source
-				.isValid(testFolder));
-
-		undo();
-		assertTrue("Overwritten file was not restored", overwritten
-				.isValid(testFolder));
-		source.name = TEST_EMPTYFILE_NAME;
-		assertTrue("Source file content was not restored", source
-				.isValid(testFolder));
-
-		redo();
-		source.name = TEST_RANDOMFILE_NAME;
-		assertTrue("Source content was altered at target", source
-				.isValid(testFolder));
-	}
-
-	public void testFileRenameUndoRedo() throws ExecutionException,
-			CoreException {
-		MoveResourcesOperation op = new MoveResourcesOperation(
-				testFileInProject, testProject.getFullPath().append(
-						TEST_NEWFILE_NAME), "testFileRename");
-		FileSnapshot snap = new FileSnapshot(testFileInProject);
-		execute(op);
-		IFile renamedFile = testProject.getFile(TEST_NEWFILE_NAME);
-		assertTrue("File rename failed", renamedFile.exists());
-		snap.name = TEST_NEWFILE_NAME;
-		assertTrue("File content was altered on rename", snap
-				.isValid(testProject));
-
-		undo();
-		snap.name = TEST_FILEINPROJECT_NAME;
-		assertTrue("File content was altered on undo rename", snap
-				.isValid(testProject));
-		assertFalse("Undo rename failed", renamedFile.exists());
-
-		redo();
-		snap.name = TEST_NEWFILE_NAME;
-		assertTrue("File content was altered on redo rename", snap
-				.isValid(testProject));
-	}
-
-	public void testFileDeleteUndoRedo() throws ExecutionException,
-			CoreException {
-		DeleteResourcesOperation op = new DeleteResourcesOperation(
-				new IResource[] { testFileWithContent }, "testFileDelete",
-				false);
-		FileSnapshot snap = new FileSnapshot(testFileWithContent);
-		execute(op);
-		assertFalse("File delete failed", testFileWithContent.exists());
-		undo();
-		assertTrue("File recreation failed", testFileWithContent.exists());
-		assertTrue("File content was altered on undo", snap
-				.isValid(testFileWithContent.getParent()));
-		redo();
-		assertFalse("Redo delete failed", testFileWithContent.exists());
-	}
-
-	public void testFileLinkedDeleteUndoRedo() throws ExecutionException,
-			CoreException {
-		DeleteResourcesOperation op = new DeleteResourcesOperation(
-				new IResource[] { testLinkedFile }, "testLinkedFileDelete",
-				false);
-		FileSnapshot snap = new FileSnapshot(testLinkedFile);
-		execute(op);
-		assertFalse("File delete failed", testLinkedFile.exists());
-		undo();
-		assertTrue("File recreation failed", testLinkedFile.exists());
-		assertTrue("File content was altered on undo", snap
-				.isValid(testLinkedFile.getParent()));
-		redo();
-		assertFalse("Redo delete failed", testLinkedFile.exists());
-	}
-
-	public void testFileAndFolderMoveSameDests() throws ExecutionException,
-			CoreException {
-		IPath targetPath = targetProject.getFullPath();
-		MoveResourcesOperation op = new MoveResourcesOperation(new IResource[] {
-				testSubFolder, testFileWithContent }, targetPath,
-				"testFileAndFolderMove");
-		FolderSnapshot snapFolder = new FolderSnapshot(testSubFolder);
-		FileSnapshot snapFile = new FileSnapshot(testFileWithContent);
-		execute(op);
-		IFolder movedFolder = getWorkspaceRoot().getFolder(
-				targetPath.append(TEST_SUBFOLDER_NAME));
-		assertTrue("Folder move failed", movedFolder.exists());
-		assertTrue("Folder content was altered", snapFolder
-				.isValid(targetProject));
-		IFile movedFile = getWorkspaceRoot().getFile(
-				targetPath.append(TEST_RANDOMFILE_NAME));
-		assertTrue("File move failed", movedFile.exists());
-		assertTrue("File content was altered", snapFile.isValid(targetProject));
-
-		undo();
-		movedFolder = getWorkspaceRoot().getFolder(
-				targetPath.append(TEST_SUBFOLDER_NAME));
-		assertFalse("Move undo failed", movedFolder.exists());
-		assertTrue("Folder content was altered on undo", snapFolder
-				.isValid(testFolder));
-		movedFile = getWorkspaceRoot().getFile(
-				targetPath.append(TEST_RANDOMFILE_NAME));
-		assertFalse("Move undo failed", movedFolder.exists());
-		assertTrue("File content was altered on undo", snapFile
-				.isValid(testFolder));
-
-		redo();
-		movedFolder = getWorkspaceRoot().getFolder(
-				targetPath.append(TEST_SUBFOLDER_NAME));
-		assertTrue("Folder move failed", movedFolder.exists());
-		assertTrue("Folder content was altered", snapFolder
-				.isValid(targetProject));
-		movedFile = getWorkspaceRoot().getFile(
-				targetPath.append(TEST_RANDOMFILE_NAME));
-		assertTrue("File move failed", movedFile.exists());
-		assertTrue("File content was altered", snapFile.isValid(targetProject));
-	}
-
-	public void testFileAndFolderCopyDifferentDests()
-			throws ExecutionException, CoreException {
-		// copying a file and folder to different destination projects,
-		// assigning new names to a new project
-		// The folder gets a new name, the file retains the old name
-		CopyResourcesOperation op = new CopyResourcesOperation(new IResource[] {
-				testSubFolder, testFileWithContent }, new IPath[] {
-				testProject.getFullPath().append(TEST_NEWFOLDER_NAME),
-				targetProject.getFullPath().append(
-						testFileWithContent.getName()) },
-				"testFileAndFolderDifferentDests");
-		FolderSnapshot snapFolder = new FolderSnapshot(testSubFolder);
-		FileSnapshot snapFile = new FileSnapshot(testFileWithContent);
-		execute(op);
-		IFolder copiedFolder = testProject.getFolder(TEST_NEWFOLDER_NAME);
-		assertTrue("Folder copy failed", copiedFolder.exists());
-		assertTrue("Source folder was altered", snapFolder.isValid(testFolder));
-		snapFolder.name = TEST_NEWFOLDER_NAME;
-		assertTrue("Folder copy does not match", snapFolder
-				.isValid(testProject));
-		IFile copiedFile = targetProject.getFile(testFileWithContent.getName());
-		assertTrue("File copy failed", copiedFile.exists());
-		assertTrue("Source file was altered", snapFile.isValid(testFolder));
-		assertTrue("File copy does not match", snapFile.isValid(targetProject));
-
-		undo();
-		assertFalse("Copy folder undo failed", copiedFolder.exists());
-		assertFalse("Copy file undo failed", copiedFile.exists());
-		snapFolder.name = testSubFolder.getName();
-		assertTrue("Source file was altered during undo", snapFile
-				.isValid(testFolder));
-		assertTrue("Source folder was altered during undo", snapFolder
-				.isValid(testFolder));
-
-		redo();
-		assertTrue("Source folder was altered during redo", snapFolder
-				.isValid(testFolder));
-		snapFolder.name = TEST_NEWFOLDER_NAME;
-		assertTrue("Folder copy does not match on redo", snapFolder
-				.isValid(testProject));
-		assertTrue("Source file was altered during redo", snapFile
-				.isValid(testFolder));
-		assertTrue("File copy does not match on redo", snapFile
-				.isValid(targetProject));
-	}
-
-	public void testFileAndFolderCopyDifferentNames()
-			throws ExecutionException, CoreException {
-		// copying a file and folder to a new project, assigning new names to a
-		// new project
-		CopyResourcesOperation op = new CopyResourcesOperation(new IResource[] {
-				testSubFolder, testFileWithContent }, new IPath[] {
-				targetProject.getFullPath().append(TEST_NEWFOLDER_NAME),
-				targetProject.getFullPath().append(TEST_NEWFILE_NAME) },
-				"testFileAndFolderDifferentNames");
-		FolderSnapshot snapFolder = new FolderSnapshot(testSubFolder);
-		FileSnapshot snapFile = new FileSnapshot(testFileWithContent);
-		execute(op);
-		IFolder copiedFolder = targetProject.getFolder(TEST_NEWFOLDER_NAME);
-		assertTrue("Folder copy failed", copiedFolder.exists());
-		assertTrue("Source folder was altered", snapFolder.isValid(testFolder));
-		snapFolder.name = TEST_NEWFOLDER_NAME;
-		assertTrue("Folder copy does not match", snapFolder
-				.isValid(targetProject));
-		IFile copiedFile = targetProject.getFile(TEST_NEWFILE_NAME);
-		assertTrue("File copy failed", copiedFile.exists());
-		assertTrue("Source file was altered", snapFile.isValid(testFolder));
-		snapFile.name = TEST_NEWFILE_NAME;
-		assertTrue("File copy does not match", snapFile.isValid(targetProject));
-
-		undo();
-		assertFalse("Copy folder undo failed", copiedFolder.exists());
-		assertFalse("Copy file undo failed", copiedFile.exists());
-		snapFolder.name = testSubFolder.getName();
-		assertTrue("Source file was altered during undo", snapFolder
-				.isValid(testFolder));
-		snapFile.name = testFileWithContent.getName();
-		assertTrue("Source folder was altered during undo", snapFile
-				.isValid(testFolder));
-
-		redo();
-		assertTrue("Source folder was altered during redo", snapFolder
-				.isValid(testFolder));
-		snapFolder.name = TEST_NEWFOLDER_NAME;
-		assertTrue("Folder copy does not match on redo", snapFolder
-				.isValid(targetProject));
-		assertTrue("Source file was altered during redo", snapFile
-				.isValid(testFolder));
-		snapFile.name = TEST_NEWFILE_NAME;
-		assertTrue("File copy does not match on redo", snapFile
-				.isValid(targetProject));
-	}
-
-	public void testRedundantFileAndFolderCopy() throws CoreException,
-			ExecutionException {
-		// copying a file which is a child of a folder, keeping same name to a
-		// new project
-		CopyResourcesOperation op = new CopyResourcesOperation(new IResource[] {
-				testFolder, testFileWithContent }, targetProject.getFullPath(),
-				"testRedundantFileAndFolderCopy");
-		FolderSnapshot snapFolder = new FolderSnapshot(testFolder);
-		FileSnapshot snapFile = new FileSnapshot(testFileWithContent);
-		execute(op);
-		IFolder copiedFolder = targetProject.getFolder(testFolder.getName());
-		assertTrue("Folder copy failed", copiedFolder.exists());
-		assertTrue("Source folder was altered", snapFolder.isValid(testProject));
-		assertTrue("Folder copy does not match", snapFolder
-				.isValid(targetProject));
-		IFile copiedFile = targetProject.getFile(testFileWithContent.getName());
-		assertFalse("Nested file should not have been copied to new location",
-				copiedFile.exists());
-		copiedFile = testFolder.getFile(testFileWithContent.getName());
-		assertTrue("Nested file should have been copied to existing parent",
-				copiedFile.exists());
-		assertTrue("Source file was altered", snapFile.isValid(testFolder));
-
-		undo();
-		assertFalse("Copy folder undo failed", copiedFolder.exists());
-		assertTrue("Source file was altered during undo", snapFile
-				.isValid(testFolder));
-		assertTrue("Source folder was altered during undo", snapFolder
-				.isValid(testProject));
-
-		redo();
-		assertTrue("Source folder was altered during redo", snapFolder
-				.isValid(testProject));
-		assertTrue("Folder copy does not match on redo", snapFolder
-				.isValid(targetProject));
-		assertTrue("Source file was altered during redo", snapFile
-				.isValid(testFolder));
-	}
-
-	public void testFileAndFolderCopySameDests() throws ExecutionException,
-			CoreException {
-		// copying a file and folder, keeping same name to a new project
-		CopyResourcesOperation op = new CopyResourcesOperation(new IResource[] {
-				testSubFolder, testFileWithContent }, targetProject
-				.getFullPath(), "testFileAndFolderCopy");
-		FolderSnapshot snapFolder = new FolderSnapshot(testSubFolder);
-		FileSnapshot snapFile = new FileSnapshot(testFileWithContent);
-		execute(op);
-		IFolder copiedFolder = targetProject.getFolder(testSubFolder.getName());
-		assertTrue("Folder copy failed", copiedFolder.exists());
-		assertTrue("Source folder was altered", snapFolder.isValid(testFolder));
-		assertTrue("Folder copy does not match", snapFolder
-				.isValid(targetProject));
-		IFile copiedFile = targetProject.getFile(testFileWithContent.getName());
-		assertTrue("File copy failed", copiedFile.exists());
-		assertTrue("Source file was altered", snapFile.isValid(testFolder));
-		assertTrue("File copy does not match", snapFile.isValid(targetProject));
-
-		undo();
-		assertFalse("Copy folder undo failed", copiedFolder.exists());
-		assertFalse("Copy file undo failed", copiedFile.exists());
-		assertTrue("Source file was altered during undo", snapFile
-				.isValid(testFolder));
-		assertTrue("Source folder was altered during undo", snapFolder
-				.isValid(testFolder));
-
-		redo();
-		assertTrue("Source folder was altered during redo", snapFolder
-				.isValid(testFolder));
-		assertTrue("Folder copy does not match on redo", snapFolder
-				.isValid(targetProject));
-		assertTrue("Source file was altered during redo", snapFile
-				.isValid(testFolder));
-		assertTrue("File copy does not match on redo", snapFile
-				.isValid(targetProject));
-	}
-
-	public void testWorkspaceUndoMonitor() throws ExecutionException,
-			CoreException {
-		// First we copy the project to the target location
-		// This gives us lots of stuff to delete in order to manufacture some
-		// workspace changes
-		CopyProjectOperation op = new CopyProjectOperation(testProject,
-				TEST_NEWPROJECT_NAME, null, "testProjectCopy");
-		execute(op);
-		// Now we are going to create a new file
-		IFile file = getWorkspaceRoot().getFile(
-				testProject.getFullPath().append(TEST_NEWFILE_NAME));
-		CreateFileOperation op2 = new CreateFileOperation(file, null,
-				getContents(getRandomString()), "testFileCreateLeaf");
-		execute(op2);
-		assertTrue("Operation should be valid", op2.canUndo());
-		int changes = 0;
-		// back door delete the new file
-		file.delete(true, getMonitor());
-		changes++;
-		// op still doesn't know it's invalid because undo monitor hasn't
-		// had changes to force checking it.
-		assertTrue("Operation should be valid", op2.canUndo());
-
-		// Now perform a bunch of changes
-		emptyTestFile.delete(true, getMonitor());
-		changes++;
-		testFileInProject.delete(true, getMonitor());
-		changes++;
-		testFileInSubFolder.delete(true, getMonitor());
-		changes++;
-		testFileWithContent.delete(true, getMonitor());
-		changes++;
-		testLinkedFile.delete(true, getMonitor());
-		changes++;
-		testLinkedFolder.delete(true, getMonitor());
-		changes++;
-		testSubFolder.delete(true, getMonitor());
-		changes++;
-		testFolder.delete(true, getMonitor());
-		changes++;
-		testFolder = testProject.getFolder(TEST_FOLDER_NAME);
-		testFolder.create(true, true, getMonitor());
-		changes++;
-		testFileInProject = testProject.getFile(TEST_FILEINPROJECT_NAME);
-		testFileInProject.create(getContents(getRandomString()), true,
-				getMonitor());
-		changes++;
-		testSubFolder = testFolder.getFolder(TEST_SUBFOLDER_NAME);
-		testSubFolder.create(true, true, getMonitor());
-		changes++;
-		emptyTestFile = testFolder.getFile(TEST_EMPTYFILE_NAME);
-		emptyTestFile.create(getContents(FILE_CONTENTS_EMPTY), true,
-				getMonitor());
-		changes++;
-
-		assertTrue("Need to make at least the minimum number of changes",
-				changes >= NUM_CHANGES);
-		assertFalse("Operation should be invalid", op2.canUndo());
-	}
-
-	public void testProjectCopyUndoInvalid() throws ExecutionException,
-			CoreException {
-		// Create a new copy of a project
-		CopyProjectOperation op = new CopyProjectOperation(testProject,
-				TEST_NEWPROJECT_NAME, null, "testProjectCopyUndoInvalid");
-		execute(op);
-		// Now we "back door" delete one of the files in the source project
-		emptyTestFile.delete(true, getMonitor());
-		// The operation should know that undoing is dangerous
-		undoExpectFail(op);
-	}
-
-	public void test162655() throws ExecutionException, CoreException {
-		DeleteResourcesOperation op = new DeleteResourcesOperation(
-				new IResource[] { testProject }, "testProjectDelete", false);
-		execute(op);
-		assertFalse("Project delete failed", testProject.exists());
-
-		// recreate outside the scope of undo
-		testProject = getWorkspace().getRoot().getProject(TEST_PROJECT_NAME);
-		testProject.create(getMonitor());
-		testProject.open(getMonitor());
-		assertTrue("Project creation failed", testProject.exists());
-
-		// Now that project exists again, the undo should fail.
-		undoExpectFail(op);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/DeprecatedFontPreferenceTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/DeprecatedFontPreferenceTestCase.java
deleted file mode 100644
index bebd67c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/DeprecatedFontPreferenceTestCase.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.preferences;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * The FontPreferenceTestCase tests adding fonts to
- * the preference store and what occurs if the values
- * are bogus
- */
-
-public class DeprecatedFontPreferenceTestCase extends UITestCase {
-
-    public String BAD_FONT_DEFINITION = "BadFont-regular-10";
-
-    public String TEST_FONT_ID = "org.eclipse.jface.tests.preference.testfont";
-
-    public String MISSING_FONT_ID = "org.eclipse.jface.tests.preference.missingfont";
-
-    private IPreferenceStore preferenceStore;
-
-    /**
-     * Constructor for FontPreferenceTestCase.
-     * @param testName
-     */
-    public DeprecatedFontPreferenceTestCase(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        AbstractUIPlugin plugin = (AbstractUIPlugin) Platform
-                .getPlugin(PlatformUI.PLUGIN_ID);
-        preferenceStore = plugin.getPreferenceStore();
-
-        //Set up the bogus entry for the bad first test
-        FontData bogusData = new FontData();
-        bogusData.setName("BadData");
-        bogusData.setHeight(11);
-        FontData[] storedValue = new FontData[2];
-
-        //We assume here that the text font is OK
-        storedValue[0] = bogusData;
-        storedValue[1] = (PreferenceConverter.getDefaultFontDataArray(
-                preferenceStore, JFaceResources.TEXT_FONT))[0];
-        PreferenceConverter
-                .setValue(preferenceStore, TEST_FONT_ID, storedValue);
-        PreferenceConverter.setDefault(preferenceStore, TEST_FONT_ID,
-                storedValue);
-    }
-
-    /**
-     * Test for a valid font like the test font. The first good one
-     * we should find should be the first one in the list.
-     */
-
-    public void testGoodFontDefinition() {
-
-        FontRegistry fontRegistry = JFaceResources.getFontRegistry();
-        FontData[] currentTextFonts = PreferenceConverter.getFontDataArray(
-                preferenceStore, JFaceResources.TEXT_FONT);
-        FontData bestFont = fontRegistry.filterData(currentTextFonts, Display
-                .getCurrent())[0];
-
-        //Assert that it is the first font that we get as the
-        //valid one
-        assertEquals(bestFont.getName(), currentTextFonts[0].getName());
-        assertEquals(bestFont.getHeight(), currentTextFonts[0].getHeight());
-    }
-
-    /**
-     * Test that if the first font in the list is bad that the 
-     * second one comes back as valid.
-     */
-
-    public void testBadFirstFontDefinition() {
-
-        FontRegistry fontRegistry = JFaceResources.getFontRegistry();
-        FontData[] currentTestFonts = PreferenceConverter.getFontDataArray(
-                preferenceStore, TEST_FONT_ID);
-        FontData bestFont = fontRegistry.filterData(currentTestFonts, Display
-                .getCurrent())[0];
-
-        //Assert that it is the second font that we get as the
-        //valid one
-        assertEquals(bestFont.getName(), currentTestFonts[1].getName());
-        assertEquals(bestFont.getHeight(), currentTestFonts[1].getHeight());
-    }
-
-    /**
-     * Test that the no valid font is returned when the entry
-     * is missing.
-     */
-
-    public void testNoFontDefinition() {
-
-        FontRegistry fontRegistry = JFaceResources.getFontRegistry();
-        FontData[] currentTestFonts = PreferenceConverter.getFontDataArray(
-                preferenceStore, MISSING_FONT_ID);
-        FontData bestFont = fontRegistry.filterData(currentTestFonts, Display
-                .getCurrent())[0];
-
-        FontData[] systemFontData = Display.getCurrent().getSystemFont()
-                .getFontData();
-
-        //Assert that the first font is the system font
-        assertEquals(bestFont.getName(), systemFontData[0].getName());
-        assertEquals(bestFont.getHeight(), systemFontData[0].getHeight());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/FontPreferenceTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/FontPreferenceTestCase.java
deleted file mode 100644
index 9e5f0d5..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/FontPreferenceTestCase.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.preferences;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * The FontPreferenceTestCase tests adding fonts to
- * the preference store and what occurs if the values
- * are bogus
- */
-
-public class FontPreferenceTestCase extends UITestCase {
-
-    public String BAD_FONT_DEFINITION = "BadFont-regular-10";
-
-    public String TEST_FONT_ID = "org.eclipse.jface.tests.preference.testfont";
-
-    public String MISSING_FONT_ID = "org.eclipse.jface.tests.preference.missingfont";
-
-    private IPreferenceStore preferenceStore;
-
-    /**
-     * Constructor for FontPreferenceTestCase.
-     * @param testName
-     */
-    public FontPreferenceTestCase(String testName) {
-        super(testName);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        AbstractUIPlugin plugin = (AbstractUIPlugin) Platform
-                .getPlugin(PlatformUI.PLUGIN_ID);
-        preferenceStore = plugin.getPreferenceStore();
-
-        //Set up the bogus entry for the bad first test
-        FontData bogusData = new FontData();
-        bogusData.setName("BadData");
-        bogusData.setHeight(11);
-        FontData[] storedValue = new FontData[2];
-
-        //We assume here that the text font is OK
-        storedValue[0] = bogusData;
-        storedValue[1] = (PreferenceConverter.getDefaultFontDataArray(
-                preferenceStore, JFaceResources.TEXT_FONT))[0];
-        PreferenceConverter
-                .setValue(preferenceStore, TEST_FONT_ID, storedValue);
-        PreferenceConverter.setDefault(preferenceStore, TEST_FONT_ID,
-                storedValue);
-
-    }
-
-    /**
-     * Test for a valid font like the test font. The first good one
-     * we should find should be the first one in the list.
-     */
-
-    public void testGoodFontDefinition() {
-
-        FontRegistry fontRegistry = JFaceResources.getFontRegistry();
-        FontData[] currentTextFonts = PreferenceConverter.getFontDataArray(
-                preferenceStore, JFaceResources.TEXT_FONT);
-        FontData[] bestFont = fontRegistry.bestDataArray(currentTextFonts,
-                Display.getCurrent());
-
-        //Assert that it is the first font that we get as the
-        //valid one
-        assertEquals(bestFont[0].getName(), currentTextFonts[0].getName());
-        assertEquals(bestFont[0].getHeight(), currentTextFonts[0].getHeight());
-    }
-
-    /**
-     * Test that if the first font in the list is bad that the 
-     * second one comes back as valid.
-     */
-
-    public void testBadFirstFontDefinition() {
-
-        FontRegistry fontRegistry = JFaceResources.getFontRegistry();
-        FontData[] currentTestFonts = PreferenceConverter.getFontDataArray(
-                preferenceStore, TEST_FONT_ID);
-        FontData[] bestFont = fontRegistry.filterData(currentTestFonts,
-                Display.getCurrent());
-
-        //Assert that it is the second font that we get as the
-        //valid one
-        assertEquals(bestFont[0].getName(), currentTestFonts[1].getName());
-        assertEquals(bestFont[0].getHeight(), currentTestFonts[1].getHeight());
-    }
-
-    /**
-     * Test that the no valid font is returned when the entry
-     * is missing.
-     */
-
-    public void testNoFontDefinition() {
-
-        FontRegistry fontRegistry = JFaceResources.getFontRegistry();
-        FontData[] currentTestFonts = PreferenceConverter.getFontDataArray(
-                preferenceStore, MISSING_FONT_ID);
-        FontData[] bestFont = fontRegistry.filterData(currentTestFonts,
-                Display.getCurrent());
-
-        FontData[] systemFontData = Display.getCurrent().getSystemFont()
-                .getFontData();
-
-        //Assert that the first font is the system font
-        assertEquals(bestFont[0].getName(), systemFontData[0].getName());
-        assertEquals(bestFont[0].getHeight(), systemFontData[0].getHeight());
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/ListenerRemovalTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/ListenerRemovalTestCase.java
deleted file mode 100644
index 38463b2..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/ListenerRemovalTestCase.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.preferences;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.tests.TestPlugin;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.3
- * 
- */
-public class ListenerRemovalTestCase extends UITestCase {
-
-	class TestPropertyListener implements IPropertyChangeListener {
-		boolean listened = false;
-
-		/**
-		 * 
-		 */
-		public TestPropertyListener() {
-			super();
-		}
-
-		public void propertyChange(PropertyChangeEvent event) {
-			listened = true;
-		}
-	}
-
-	/**
-	 * @param testName
-	 */
-	public ListenerRemovalTestCase(String testName) {
-		super(testName);
-	}
-
-	public void testRemoveLastListener() {
-
-		TestPropertyListener testListener = new TestPropertyListener();
-		IPreferenceStore preferenceStore = TestPlugin.getDefault()
-				.getPreferenceStore();
-
-		// Check it is found when added
-		preferenceStore.addPropertyChangeListener(testListener);
-		testListener.listened = false;
-		preferenceStore.setValue(TestPreferenceInitializer.TEST_LISTENER_KEY,
-				TestPreferenceInitializer.TEST_SET_VALUE);
-		assertTrue("Listener not hit on set value", testListener.listened);
-		testListener.listened = false;
-
-		// Check it is found when set to default
-		preferenceStore
-				.setToDefault(TestPreferenceInitializer.TEST_LISTENER_KEY);
-		assertTrue("Listener not hit on default value", testListener.listened);
-		testListener.listened = false;
-
-		// Check that the listener is removed
-		preferenceStore.removePropertyChangeListener(testListener);
-		preferenceStore.setValue(TestPreferenceInitializer.TEST_LISTENER_KEY,
-				TestPreferenceInitializer.TEST_SET_VALUE);
-		assertFalse("Listener hit when removed", testListener.listened);
-		
-//		 Check it is found when set to default
-		preferenceStore
-				.setToDefault(TestPreferenceInitializer.TEST_LISTENER_KEY);
-
-		// Check that you can add it again
-		preferenceStore.addPropertyChangeListener(testListener);
-		testListener.listened = false;
-		preferenceStore.setValue(TestPreferenceInitializer.TEST_LISTENER_KEY,
-				TestPreferenceInitializer.TEST_SET_VALUE);
-		assertTrue("Listener not hit on second set value",
-				testListener.listened);
-		testListener.listened = false;
-
-		preferenceStore.removePropertyChangeListener(testListener);
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/PreferencesTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/PreferencesTestSuite.java
deleted file mode 100644
index c4ee037..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/PreferencesTestSuite.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.preferences;
-
-import org.eclipse.ui.tests.propertyPages.PropertyPageEnablementTest;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Test suite for preferences.
- */
-public class PreferencesTestSuite extends TestSuite {
-
-	/**
-	 * Returns the suite. This is required to use the JUnit Launcher.
-	 */
-	public static Test suite() {
-		return new PreferencesTestSuite();
-	}
-
-	/**
-	 * Construct the test suite.
-	 */
-	public PreferencesTestSuite() {
-		addTest(new TestSuite(FontPreferenceTestCase.class));
-		addTest(new TestSuite(DeprecatedFontPreferenceTestCase.class));
-		addTest(new TestSuite(ScopedPreferenceStoreTestCase.class));
-		addTest(new TestSuite(WorkingCopyPreferencesTestCase.class));
-		addTest(new TestSuite(PropertyPageEnablementTest.class));
-		addTest(new TestSuite(ListenerRemovalTestCase.class));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/ScopedPreferenceStoreTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/ScopedPreferenceStoreTestCase.java
deleted file mode 100644
index ddcb119..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/ScopedPreferenceStoreTestCase.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.preferences;
-
-import java.io.*;
-import org.eclipse.core.runtime.preferences.*;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.preferences.ScopedPreferenceStore;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-public class ScopedPreferenceStoreTestCase extends UITestCase {
-
-	final String DEFAULT_DEFAULT_STRING = "";
-
-	public ScopedPreferenceStoreTestCase(String name) {
-		super(name);
-	}
-
-	public void testNeedsSaving() {
-		IScopeContext context = new InstanceScope();
-		String qualifier = "org.eclipse.ui.tests.preferences";
-		ScopedPreferenceStore store = new ScopedPreferenceStore(context,
-				qualifier);
-		String key = "key1";
-		String value = "value1";
-
-		// nothing there
-		assertFalse("0.1", store.needsSaving());
-		assertFalse("0.2", store.contains(key));
-		assertEquals("0.3", DEFAULT_DEFAULT_STRING, store.getString(key));
-
-		// set the value
-		store.setValue(key, value);
-		assertTrue("1.0", store.needsSaving());
-		assertTrue("1.1", store.contains(key));
-		assertEquals("1.2", value, store.getString(key));
-
-		// flush
-		try {
-			store.save();
-		} catch (IOException e) {
-			fail("2.99", e);
-		}
-
-		// do the test
-		assertFalse("3.0", store.needsSaving());
-
-		// change the node outside of the scoped store
-		String key2 = "key2";
-		String value2 = "value2";
-		IEclipsePreferences node = context.getNode(qualifier);
-		node.put(key2, value2);
-		assertEquals("4.0", value2, node.get(key2, null));
-		assertFalse("4.1", store.needsSaving());
-	}
-	
-	public void testRestoreDefaults() {
-		IScopeContext context = new InstanceScope();
-		String qualifier = "org.eclipse.ui.tests.preferences#testRestoreDefaults";
-		ScopedPreferenceStore store = new ScopedPreferenceStore(context, qualifier);
-		final String key = "key";
-		final String value = "value";
-		
-		// setup and initial assertions
-		assertFalse("0.1", store.contains(key));
-		assertEquals("0.2", DEFAULT_DEFAULT_STRING, store.getString(key));
-
-		// set the value
-		store.setValue(key, value);
-		assertTrue("1.0", store.contains(key));
-		assertEquals("1.1", value, store.getString(key));
-		
-		final boolean[] found = new boolean[1];
-		IPropertyChangeListener listener= new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				if (key.equals(event.getProperty()) && value.equals(event.getOldValue()))
-					found[0] = true;
-			}
-		};
-		store.addPropertyChangeListener(listener);
-		
-		// restore the default
-		store.setToDefault(key);
-		assertFalse("2.0", store.contains(key));
-		assertEquals("2.1", DEFAULT_DEFAULT_STRING, store.getString(key));
-
-		// check it
-		assertTrue("3.0", found[0]);
-}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/TestPreferenceInitializer.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/TestPreferenceInitializer.java
deleted file mode 100644
index f19006c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/TestPreferenceInitializer.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.ui.tests.TestPlugin;
-
-/**
- * @since 3.3
- * 
- */
-public class TestPreferenceInitializer extends AbstractPreferenceInitializer {
-
-	public static String TEST_LISTENER_KEY = "TEST_LISTENER";
-
-	public static String TEST_SET_VALUE = "TEST_SET_VALUE";
-
-	public static String TEST_DEFAULT_VALUE = "TEST_DEFAULT_VALUE";
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-
-		IScopeContext context = new DefaultScope();
-		IEclipsePreferences node = context.getNode(TestPlugin.getDefault()
-				.getBundle().getSymbolicName());
-		node.put(TEST_LISTENER_KEY, TEST_DEFAULT_VALUE);
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/WorkingCopyPreferencesTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/WorkingCopyPreferencesTestCase.java
deleted file mode 100644
index e651ce6..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/preferences/WorkingCopyPreferencesTestCase.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.preferences;
-
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.ui.preferences.WorkingCopyManager;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.osgi.service.prefs.BackingStoreException;
-
-public class WorkingCopyPreferencesTestCase extends UITestCase {
-
-	public WorkingCopyPreferencesTestCase(String name) {
-		super(name);
-	}
-
-	/*
-	 * See bug 94926 - WorkingCopyPreferences.remove(key) not working
-	 */
-	public void testRemoveKey() {
-
-		// set the value in the real node
-		String key = "key";
-		String value = "value";
-		IEclipsePreferences eNode = new InstanceScope().getNode("working.copy.tests.testRemoveKey");
-		eNode.put(key, value);
-		assertEquals("1.0", value, eNode.get(key, null));
-
-		// create a working copy
-		WorkingCopyManager manager = new WorkingCopyManager();
-		IEclipsePreferences prefs = manager.getWorkingCopy(eNode);
-		prefs.remove(key);
-
-		// apply the changes
-		try {
-			manager.applyChanges();
-		} catch (BackingStoreException e) {
-			fail("2.99", e);
-		}
-
-		// see if our change was applied
-		assertNull("3.0", eNode.get(key, null));
-	}
-
-	public void testRemoveNode() {
-		// set the value in the real node
-		String key = "key";
-		String value = "value";
-		IEclipsePreferences eNode = new InstanceScope().getNode("working.copy.tests.testRemoveKey");
-		eNode.put(key, value);
-		assertEquals("1.0", value, eNode.get(key, null));
-
-		// create a working copy
-		WorkingCopyManager manager = new WorkingCopyManager();
-		IEclipsePreferences prefs = manager.getWorkingCopy(eNode);
-		
-		// remove the node
-		try {
-			prefs.removeNode();
-		} catch (BackingStoreException e) {
-			fail("2.99", e);
-		}
-
-		// apply the changes
-		try {
-			manager.applyChanges();
-		} catch (BackingStoreException e) {
-			fail("3.99", e);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/presentations/Bug48589Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/presentations/Bug48589Test.java
deleted file mode 100644
index d70e16f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/presentations/Bug48589Test.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.presentations;
-
-import java.io.ByteArrayInputStream;
-
-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.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.EditorSashContainer;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test for Bug 48589. This verifies that the editor tabs escape the "&"
- * character correctly. This creates a test project, and creates a file within
- * its whose name contains an ampersand. It then retrieves the text of the tab
- * item and checks to see that it is appropriate.
- * 
- * @since 3.1
- */
-public final class Bug48589Test extends UITestCase {
-
-    /**
-     * Constructs a new instance of this test case.
-     * 
-     * @param testName
-     *            The name of the test
-     */
-    public Bug48589Test(final String testName) {
-        super(testName);
-    }
-
-    /**
-     * Test for Bug 48589. This verifies that the editor tabs escape the "&"
-     * character correctly. This creates a test project, and creates a file
-     * within its whose name contains an ampersand. It then retrieves the text
-     * of the tab item and checks to see that it is appropriate.
-     * 
-     * @throws CoreException
-     *             If the project cannot be created or opened.
-     */
-    public void testFileNameWithAmpersand() throws CoreException {
-        // Open a new test window.
-        final IWorkbenchWindow window = openTestWindow();
-
-        // Open a new project, with a text file.
-        final IWorkspace workspace = ResourcesPlugin.getWorkspace();
-        final IProject testProject = workspace.getRoot().getProject(
-                "Bug 48589 Project");
-        testProject.create(null);
-        testProject.open(null);
-        final String fileName = "A&B.txt";
-        final IFile textFile = testProject.getFile(fileName);
-        final ByteArrayInputStream inputStream = new ByteArrayInputStream(
-                fileName.getBytes());
-        textFile.create(inputStream, true, null);
-        IDE.openEditor(window.getActivePage(),
-                textFile, true);
-        
-        // Get the current title of the text editor.
-        final WorkbenchPage page = (WorkbenchPage) window.getActivePage();
-        final EditorSashContainer container = (EditorSashContainer) page.getEditorPresentation().getLayoutPart();
-        final CTabFolder tabFolder = (CTabFolder) container.getActiveWorkbook().getControl();
-        final CTabItem item = tabFolder.getItem(0);
-        final String actualTitle = item.getText();
-        
-        // Verify that the title is escaped, as expected.
-        final String expectedTitle = "A&&B.txt";
-        assertEquals("The title should be equal to the ", expectedTitle,
-                actualTitle);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/presentations/PresentationsTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/presentations/PresentationsTestSuite.java
deleted file mode 100644
index a0b4f44..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/presentations/PresentationsTestSuite.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.presentations;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Tests for all areas of the presentations code for the platform.
- */
-public final class PresentationsTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite. This is required to use the JUnit Launcher.
-     */
-    public static final Test suite() {
-        return new PresentationsTestSuite();
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public PresentationsTestSuite() {
-        addTest(new TestSuite(Bug48589Test.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertyPages/PropertyPageEnablementTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertyPages/PropertyPageEnablementTest.java
deleted file mode 100644
index 01d995f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertyPages/PropertyPageEnablementTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.propertyPages;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.ui.internal.dialogs.PropertyPageContributorManager;
-import org.eclipse.ui.internal.dialogs.RegistryPageContributor;
-import org.eclipse.ui.tests.navigator.AbstractNavigatorTest;
-
-/**
- * @since 3.2
- * 
- */
-public class PropertyPageEnablementTest extends AbstractNavigatorTest {
-
-	/**
-	 * Create an instance of the receiver.
-	 * 
-	 * @param testName
-	 */
-	public PropertyPageEnablementTest(String testName) {
-		super(testName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doSetUp()
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		createTestFile();
-	}
-
-	/**
-	 * Test the AND condition property page which should only work for files.
-	 * 
-	 */
-	public void testAndPage() {
-
-		Collection contributors = PropertyPageContributorManager.getManager()
-				.getApplicableContributors(testFile);
-		assertFalse("Has no file pages", contributors.isEmpty());
-		for (Iterator iter = contributors.iterator(); iter.hasNext();) {
-			RegistryPageContributor element = (RegistryPageContributor) iter
-					.next();
-			if (element.getPageId().equals("org.eclipse.ui.tests.and"))
-				return;
-		}
-		assertTrue("And property page for file not found", false);
-
-		contributors = PropertyPageContributorManager.getManager()
-				.getApplicableContributors(testFolder);
-		for (Iterator iter = contributors.iterator(); iter.hasNext();) {
-			RegistryPageContributor element = (RegistryPageContributor) iter
-					.next();
-			assertFalse("Matching folder for AND", element.getPageId().equals(
-					"org.eclipse.ui.tests.and"));
-
-		}
-
-		contributors = PropertyPageContributorManager.getManager()
-				.getApplicableContributors(testProject);
-		for (Iterator iter = contributors.iterator(); iter.hasNext();) {
-			RegistryPageContributor element = (RegistryPageContributor) iter
-					.next();
-			assertFalse("Matching project for AND", element.getPageId().equals(
-					"org.eclipse.ui.tests.and"));
-
-		}
-
-	}
-
-	/**
-	 * Test the OR condition property page which should only work for files and
-	 * folders.
-	 * 
-	 */
-	public void testOrPage() {
-
-		boolean found = false;
-		Collection contributors = PropertyPageContributorManager.getManager()
-				.getApplicableContributors(testFile);
-		assertFalse("Has no file pages", contributors.isEmpty());
-		for (Iterator iter = contributors.iterator(); iter.hasNext();) {
-			RegistryPageContributor element = (RegistryPageContributor) iter
-					.next();
-			if (element.getPageId().equals("org.eclipse.ui.tests.or"))
-				found = true;
-		}
-		assertTrue("OR property page for file not found", found);
-
-		found = false;
-		contributors = PropertyPageContributorManager.getManager()
-				.getApplicableContributors(testFolder);
-		assertFalse("Has no folder pages", contributors.isEmpty());
-		for (Iterator iter = contributors.iterator(); iter.hasNext();) {
-			RegistryPageContributor element = (RegistryPageContributor) iter
-					.next();
-			if (element.getPageId().equals("org.eclipse.ui.tests.or"))
-				found = true;
-		}
-		assertTrue("OR property page for file not found", found);
-
-		contributors = PropertyPageContributorManager.getManager()
-				.getApplicableContributors(testProject);
-		for (Iterator iter = contributors.iterator(); iter.hasNext();) {
-			RegistryPageContributor element = (RegistryPageContributor) iter
-					.next();
-			assertFalse("Matching project for OR", element.getPageId().equals(
-					"org.eclipse.ui.tests.or"));
-
-		}
-
-	}
-
-	/**
-	 * Test the instance of property page which should only work for projects.
-	 * 
-	 */
-	public void testInstanceOfPage() {
-
-		Collection contributors = PropertyPageContributorManager.getManager()
-				.getApplicableContributors(testFile);
-		for (Iterator iter = contributors.iterator(); iter.hasNext();) {
-			RegistryPageContributor element = (RegistryPageContributor) iter
-					.next();
-			assertFalse("Matching file for instanceof", element.getPageId()
-					.equals("org.eclipse.ui.tests.instanceof"));
-		}
-
-		contributors = PropertyPageContributorManager.getManager()
-				.getApplicableContributors(testFolder);
-		for (Iterator iter = contributors.iterator(); iter.hasNext();) {
-			RegistryPageContributor element = (RegistryPageContributor) iter
-					.next();
-			assertFalse("Matching folder for instanceof", element.getPageId()
-					.equals("org.eclipse.ui.tests.instanceof"));
-
-		}
-
-		boolean found = false;
-		contributors = PropertyPageContributorManager.getManager()
-				.getApplicableContributors(testProject);
-		assertFalse("Has no project pages", contributors.isEmpty());
-		for (Iterator iter = contributors.iterator(); iter.hasNext();) {
-			RegistryPageContributor element = (RegistryPageContributor) iter
-					.next();
-			if (element.getPageId().equals("org.eclipse.ui.tests.instanceof"))
-				found = true;
-		}
-		assertTrue("instanceof property page for project not found", found);
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertyPages/TableResizePropertyPage.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertyPages/TableResizePropertyPage.java
deleted file mode 100644
index b7e86de..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertyPages/TableResizePropertyPage.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.propertyPages;
-
-import org.eclipse.jface.layout.TableColumnLayout;
-import org.eclipse.jface.viewers.ColumnWeightData;
-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.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.dialogs.PropertyPage;
-
-/**
- * The TableResizePropertyPage is an example of a property page with this resize
- * capability
- * 
- * @since 3.3
- * 
- */
-public class TableResizePropertyPage extends PropertyPage {
-
-	/**
-	 * Constructor for TableResizePropertyPage.
-	 */
-	public TableResizePropertyPage() {
-		super();
-	}
-
-	private void addFirstSection(Composite parent) {
-
-		Composite enclosingComposite = new Composite(parent, SWT.NONE);
-		enclosingComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		enclosingComposite.setLayout(layout);
-
-		Table table = new Table(enclosingComposite, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.MULTI | SWT.FULL_SELECTION);
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableColumnLayout tableLayout = new TableColumnLayout();
-		
-		GridData data = new GridData(GridData.FILL_BOTH);
-		table.setLayoutData(data);
-
-		table.setHeaderVisible(true);
-		TableColumn column = new TableColumn(table, SWT.NULL);
-		column.setText("Column 1");
-		tableLayout.setColumnData(column, new ColumnWeightData(50, 100, true));
-
-		column = new TableColumn(table, SWT.NULL);
-		column.setText("Column 2");
-		
-		tableLayout.setColumnData(column,new ColumnWeightData(50, 100, true));
-		enclosingComposite.setLayout(tableLayout);
-
-	}
-
-	/**
-	 * @see PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		composite.setLayout(layout);
-		GridData data = new GridData(GridData.FILL);
-		data.grabExcessHorizontalSpace = true;
-		composite.setLayoutData(data);
-
-		addFirstSection(composite);
-
-		return composite;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	public boolean performOk() {
-		return true;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertyPages/TreeResizePropertyPage.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertyPages/TreeResizePropertyPage.java
deleted file mode 100644
index 05ed8c0..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertyPages/TreeResizePropertyPage.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.propertyPages;
-
-
-import org.eclipse.jface.layout.TreeColumnLayout;
-import org.eclipse.jface.viewers.ColumnWeightData;
-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.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.ui.dialogs.PropertyPage;
-
-/**
- * The TreeResizePropertyPage is an example of a property page with this resize
- * capability
- * 
- * @since 3.3
- * 
- */
-public class TreeResizePropertyPage extends PropertyPage {
-
-	/**
-	 * Constructor for TableResizePropertyPage.
-	 */
-	public TreeResizePropertyPage() {
-		super();
-	}
-
-	private void addFirstSection(Composite parent) {
-
-		Composite enclosingComposite = new Composite(parent, SWT.NONE);
-		enclosingComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		enclosingComposite.setLayout(layout);
-
-		Tree tree = new Tree(enclosingComposite, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.MULTI | SWT.FULL_SELECTION);
-		tree.setHeaderVisible(true);
-		tree.setLinesVisible(true);
-		GridData data = new GridData(GridData.FILL_BOTH);
-		tree.setLayoutData(data);
-		
-		TreeColumnLayout treeLayout = new TreeColumnLayout();
-
-		tree.setHeaderVisible(true);
-		TreeColumn column = new TreeColumn(tree, SWT.NULL);
-		column.setText("Column 1");
-		treeLayout.setColumnData(column, new ColumnWeightData(50, 100, true));
-
-		column = new TreeColumn(tree, SWT.NULL);
-		column.setText("Column 2");
-		treeLayout.setColumnData(column, new ColumnWeightData(50, 100, true));
-
-		enclosingComposite.setLayout(treeLayout);
-
-	}
-
-	/**
-	 * @see PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		composite.setLayout(layout);
-		GridData data = new GridData(GridData.FILL);
-		data.grabExcessHorizontalSpace = true;
-		composite.setLayoutData(data);
-
-		addFirstSection(composite);
-
-		return composite;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	public boolean performOk() {
-		return true;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertysheet/ComboBoxPropertyDescriptorTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertysheet/ComboBoxPropertyDescriptorTest.java
deleted file mode 100644
index a148461..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertysheet/ComboBoxPropertyDescriptorTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.propertysheet;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.ui.views.properties.ComboBoxLabelProvider;
-import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
-
-/**
- * Test for new functionality pertaining to Bug 21013.
- * 
- * @since 3.0
- */
-public class ComboBoxPropertyDescriptorTest extends TestCase {
-
-    private String ID = "ID"; //$NON-NLS-1$
-
-    private String NAME = "NAME"; //$NON-NLS-1$
-
-    private String[] values = { "One", "Two", "Three" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-    private ComboBoxPropertyDescriptor descriptor;
-
-    /* (non-Javadoc)
-     * @see junit.framework.TestCase#setUp()
-     */
-    protected void setUp() throws Exception {
-        super.setUp();
-        descriptor = new ComboBoxPropertyDescriptor(ID, NAME, values);
-    }
-
-    /* (non-Javadoc)
-     * @see junit.framework.TestCase#tearDown()
-     */
-    protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-    /**
-     * Tests the case where the user does not set an ILabelProvider.
-     */
-    public void testGetDefaultLabelProvider() {
-        ILabelProvider provider = descriptor.getLabelProvider();
-        assertEquals("Default label provider is of the wrong type", //$NON-NLS-1$ 
-                ComboBoxLabelProvider.class, provider.getClass());
-
-        for (int i = 0; i < values.length; i++) {
-            String expected = values[i];
-            assertEquals("Wrong label provided", //$NON-NLS-1$
-                    expected, provider.getText(new Integer(i)));
-
-        }
-
-        testWrongLabel(provider, new Object());
-        testWrongLabel(provider, null);
-        testWrongLabel(provider, new Integer(-1));
-        testWrongLabel(provider, new Integer(values.length));
-    }
-
-    /**
-     * Tests that a bad element object (an Integer outside the accepted range, 
-     * null or an other Object) returns the empty String.
-     * @param provider the provider to test against.
-     * @param element the element to test.
-     */
-    public void testWrongLabel(ILabelProvider provider, Object element) {
-        assertEquals("Wrong label provided in bad case", //$NON-NLS-1$
-                "", //$NON-NLS-1$
-                provider.getText(element));
-    }
-
-    /**
-     * Tests the case where the user sets their own ILabelProvider.
-     */
-    public void testSetGetLabelProvider() {
-        ILabelProvider provider = new LabelProvider();
-        descriptor.setLabelProvider(provider);
-        ILabelProvider descProvider = descriptor.getLabelProvider();
-        assertSame("Wrong label provider", //$NON-NLS-1$
-                provider, descProvider);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertysheet/PropertySheetAuto.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertysheet/PropertySheetAuto.java
deleted file mode 100644
index 52d77b1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertysheet/PropertySheetAuto.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.propertysheet;
-
-import java.util.ArrayList;
-import java.util.Random;
-
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.ISaveablePart;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.tests.SelectionProviderView;
-import org.eclipse.ui.tests.api.SaveableMockViewPart;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.views.properties.ColorPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- *  The class implements a test for the workbench's default
- * property sheet page. It does this by firing a sequence of 
- * selection events. The property sheet view receives these events 
- * and displays the properties for the selected objects.
- * We are able to test the property sheet code which displays 
- * properties and handles the transition to another set of 
- * properties.
- */
-
-public class PropertySheetAuto extends UITestCase {
-
-    /**
-     * This car serves as a simple porperty source.
-     * The only interesting behavior it has is that if
-     * one of its properties has a "null" value then
-     * it does not include that property in its list
-     * of property descriptors.
-     */
-    private class Car implements IPropertySource {
-        private int modelYear = 0;
-
-        private RGB color = null;
-
-        private String manufacturer = null;
-
-        private String model = null;
-
-        private double engineSize = 0.0;
-
-        // property ids
-        private final static String prefix = "org.eclipse.ui.tests.standardcomponents.propertysheetauto.";
-
-        private final static String MODEL_YEAR = prefix + "modelyear";
-
-        private final static String COLOR = prefix + "color";
-
-        private final static String MANUFACTURER = prefix + "manufacturer";
-
-        private final static String MODEL = prefix + "model";
-
-        private final static String ENGINE_SIZE = prefix + "enginesize";
-
-        private IPropertyDescriptor[] descriptors;
-
-        public Car(int carModelYear, RGB carColor, String carManufacturer,
-                String carModel, double carEngineSize) {
-            modelYear = carModelYear;
-            color = carColor;
-            manufacturer = carManufacturer;
-            model = carModel;
-            engineSize = carEngineSize;
-
-            createDescriptors();
-        }
-
-        /** 
-         * Creates the property descriptors.
-         * If one of the properties has a "null" value then
-         * that property is not included in the list of
-         * property descriptors.
-         */
-        private void createDescriptors() {
-            ArrayList list = new ArrayList(5);
-            if (modelYear != 0)
-                list.add(new TextPropertyDescriptor(MODEL_YEAR, "model year"));
-            if (color != null)
-                list.add(new ColorPropertyDescriptor(COLOR, "color"));
-            if (manufacturer != null)
-                list.add(new TextPropertyDescriptor(MANUFACTURER, "make"));
-            if (model != null)
-                list.add(new TextPropertyDescriptor(MODEL, "model"));
-            if (engineSize != 0.0)
-                list.add(new TextPropertyDescriptor(ENGINE_SIZE, "engine"));
-            descriptors = (IPropertyDescriptor[]) list
-                    .toArray(new IPropertyDescriptor[list.size()]);
-        }
-
-        public Object getEditableValue() {
-            return this;
-        }
-
-        public IPropertyDescriptor[] getPropertyDescriptors() {
-            return descriptors;
-        }
-
-        public Object getPropertyValue(Object id) {
-            if (id.equals(MODEL_YEAR))
-                return Integer.toString(modelYear);
-            if (id.equals(COLOR))
-                return color;
-            if (id.equals(MANUFACTURER))
-                return manufacturer;
-            if (id.equals(MODEL))
-                return model;
-            if (id.equals(ENGINE_SIZE))
-                return Double.toString(engineSize);
-            return null;
-        }
-
-        public boolean isPropertySet(Object id) {
-            return false;
-        }
-
-        public void resetPropertyValue(Object id) {
-            return;
-        }
-
-        public void setPropertyValue(Object id, Object value) {
-            if (id.equals(MODEL_YEAR))
-                modelYear = new Integer((String) value).intValue();
-            if (id.equals(COLOR))
-                color = (RGB) value;
-            if (id.equals(MANUFACTURER))
-                manufacturer = (String) value;
-            if (id.equals(MODEL))
-                model = (String) value;
-            if (id.equals(ENGINE_SIZE))
-                engineSize = new Double((String) value).doubleValue();
-        }
-
-        public String toString() {
-            StringBuffer s = new StringBuffer();
-            s.append("<");
-            if (modelYear != 0) {
-                s.append(modelYear);
-                s.append(" ");
-            }
-            if (color != null) {
-                s.append(color);
-                s.append(" ");
-            }
-            if (manufacturer != null) {
-                s.append(manufacturer);
-                s.append(" ");
-            }
-            if (model != null) {
-                s.append(model);
-                s.append(" ");
-            }
-            if (engineSize != 0.0) {
-                s.append(engineSize);
-                s.append(" ");
-            }
-            s.append(">");
-            return s.toString();
-        }
-    }
-
-    private IWorkbenchPage activePage;
-
-    private IWorkbenchWindow workbenchWindow;
-
-    private SelectionProviderView selectionProviderView;
-
-    private Car[] cars;
-
-    private Random random = new Random();
-
-    private static final int NUMBER_OF_CARS = 10;
-
-    private static final int NUMBER_OF_SELECTIONS = 100;
-
-    private static final String[] makers = new String[] { "Ford", "GM",
-            "Chrysler", "BMW", "Toyota", "Nissan", "Honda", "Volvo" };
-
-    private static final String[] models = new String[] { "Thunderbird",
-            "Deville", "Viper", "320i", "Camry", "Ultima", "Prelude", "V70" };
-
-    public PropertySheetAuto(String name) {
-        super(name);
-    }
-
-    /** 
-     * Creates a array of car objects
-     */
-    private void createCars() {
-        cars = new Car[NUMBER_OF_CARS];
-        for (int i = 0; i < cars.length; i++) {
-            cars[i] = createCar();
-        }
-    }
-
-    /**
-     * Creates a car initialized with random values
-     */
-    private Car createCar() {
-        int modelYear = 0;
-        RGB color = null;
-        String manufacturer = null;
-        String model = null;
-        double engineSize = 0.0;
-        // only set 25% of the properties
-        int FACTOR = 4;
-        if (random.nextInt(FACTOR) < FACTOR - 1)
-            modelYear = 1990 + random.nextInt(15);
-        if (random.nextInt(FACTOR) < FACTOR - 1)
-            color = new RGB(random.nextInt(256), random.nextInt(256), random
-                    .nextInt(256));
-        if (random.nextInt(FACTOR) < FACTOR - 1)
-            manufacturer = makers[random.nextInt(makers.length)];
-        if (random.nextInt(FACTOR) < FACTOR - 1)
-            model = models[random.nextInt(models.length)];
-        if (random.nextInt(FACTOR) < FACTOR - 1)
-            engineSize = random.nextDouble() * 6;
-        return new Car(modelYear, color, manufacturer, model, engineSize);
-    }
-
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        workbenchWindow = openTestWindow();
-        activePage = workbenchWindow.getActivePage();
-    }
-
-    protected IWorkbenchPart createTestPart(IWorkbenchPage page)
-            throws Throwable {
-        IViewPart view = page.showView("org.eclipse.ui.views.PropertySheet");
-        selectionProviderView = (SelectionProviderView) page
-                .showView(SelectionProviderView.ID);
-        return view;
-
-    }
-
-    /** 
-     * Supply selection events with a random car selection
-     */
-    public void testInput() throws Throwable {
-        createTestPart(activePage);
-        createCars();
-        for (int i = 0; i < NUMBER_OF_SELECTIONS; i++) {
-            // create the selection
-            int numberToSelect = random.nextInt(NUMBER_OF_CARS - 2);
-            ArrayList selection = new ArrayList(numberToSelect);
-            while (selection.size() < numberToSelect) {
-                int j = random.nextInt(NUMBER_OF_CARS);
-                if (!selection.contains(cars[j]))
-                    selection.add(cars[j]);
-            }
-            StructuredSelection structuredSelection = new StructuredSelection(
-                    selection);
-            // fire the selection	
-            selectionProviderView.setSelection(structuredSelection);
-            while (Display.getCurrent().readAndDispatch())
-                ;
-        }
-    }
-    
-    /**
-     * Tests that the Properties view provides the source part for getAdapter(ISaveablePart.class)
-     * if it's saveable.  
-     * See  Bug 125386 [PropertiesView] Properties view should delegate Save back to source part
-     */
-    public void testSaveableRetargeting() throws Throwable {
-    	IWorkbenchPart propView = createTestPart(activePage);
-    	assertNull(propView.getAdapter(ISaveablePart.class));
-    	IViewPart saveableView = activePage.showView(SaveableMockViewPart.ID);
-    	activePage.activate(propView);
-    	assertEquals(saveableView, propView.getAdapter(ISaveablePart.class));
-    }
-}
-
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertysheet/PropertySheetTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertysheet/PropertySheetTestSuite.java
deleted file mode 100644
index 4caf3ec..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/propertysheet/PropertySheetTestSuite.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.propertysheet;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Test areas of the Property Sheet API.
- */
-public class PropertySheetTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite.  This is required to
-     * use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new PropertySheetTestSuite();
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public PropertySheetTestSuite() {
-        addTest(new TestSuite(PropertySheetAuto.class));
-        addTest(new TestSuite(ComboBoxPropertyDescriptorTest.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/quickaccess/CamelUtilTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/quickaccess/CamelUtilTest.java
deleted file mode 100644
index 9c4d555..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/quickaccess/CamelUtilTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.quickaccess;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ui.internal.quickaccess.CamelUtil;
-
-public class CamelUtilTest extends TestCase {
-
-	public void testIsIgnoredForCamelCase() {
-		assertEquals(true, CamelUtil.isSeparatorForCamelCase(' '));
-		assertEquals(true, CamelUtil.isSeparatorForCamelCase('.'));
-		assertEquals(true, CamelUtil.isSeparatorForCamelCase('-'));
-		assertEquals(true, CamelUtil.isSeparatorForCamelCase('/'));
-		assertEquals(true, CamelUtil.isSeparatorForCamelCase('*'));
-		assertEquals(false, CamelUtil.isSeparatorForCamelCase('a'));
-		assertEquals(false, CamelUtil.isSeparatorForCamelCase('A'));
-		assertEquals(false, CamelUtil.isSeparatorForCamelCase('1'));
-	}
-
-	public void testGetCamelCase() {
-		assertEquals("", CamelUtil.getCamelCase(""));
-		assertEquals("a", CamelUtil.getCamelCase("a"));
-		assertEquals("ab", CamelUtil.getCamelCase("a b"));
-		assertEquals("at", CamelUtil.getCamelCase("any thing"));
-		assertEquals("cc", CamelUtil.getCamelCase("CamelCase"));
-		assertEquals("csm", CamelUtil.getCamelCase("call Some Method"));
-		assertEquals("sjree", CamelUtil.getCamelCase("SomeJREExample"));
-		assertEquals("sjree", CamelUtil.getCamelCase("SomeJRE - Example"));
-	}
-
-	public void testGetNextCamelIndex() {
-		assertEquals(-1, CamelUtil.getNextCamelIndex("", 0));
-		assertEquals(1, CamelUtil.getNextCamelIndex("aB", 0));
-		assertEquals(3, CamelUtil.getNextCamelIndex("ab c", 0));
-		assertEquals(2, CamelUtil.getNextCamelIndex("a b ", 0));
-		assertEquals(2, CamelUtil.getNextCamelIndex("a b ", 1));
-	}
-
-	public void testGetCamelCaseIndices() {
-		assertArrayEquals(new int[][] {}, CamelUtil.getCamelCaseIndices("some string", 0, 0));
-		assertArrayEquals(new int[][] {{0,0}}, CamelUtil.getCamelCaseIndices("some string", 0, 1));
-		assertArrayEquals(new int[][] {{0,0},{5,5}}, CamelUtil.getCamelCaseIndices("some string", 0, 2));
-		assertArrayEquals(new int[][] {{5,5}}, CamelUtil.getCamelCaseIndices("some string", 1, 1));
-		assertArrayEquals(new int[][] {{8,8},{12,12},{19,19},{26,26},{31,31}}, CamelUtil.getCamelCaseIndices("Editors ApplAction.java - mail/src", 1, 5));
-	}
-
-	/**
-	 * @param is
-	 * @param camelCaseIndices
-	 */
-	private void assertArrayEquals(int[][] is, int[][] camelCaseIndices) {
-		assertEquals(is.length, camelCaseIndices.length);
-		for (int i = 0; i < is.length; i++) {
-			int[] js = is[i];
-			assertEquals("i=" + i, js.length, camelCaseIndices[i].length);
-			for (int j = 0; j < js.length; j++) {
-				assertEquals("i=" + i + ", j=" + j, js[j],
-						camelCaseIndices[i][j]);
-			}
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/quickaccess/QuickAccessDialogTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/quickaccess/QuickAccessDialogTest.java
deleted file mode 100644
index 9ae3332..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/quickaccess/QuickAccessDialogTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.quickaccess;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.quickaccess.QuickAccessDialog;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.4
- * 
- */
-public class QuickAccessDialogTest extends UITestCase {
-
-	/**
-	 * @since 3.4
-	 * 
-	 */
-	private static class TestQuickAccessDialog extends QuickAccessDialog {
-		private TestQuickAccessDialog(IWorkbenchWindow window,
-				Command invokingCommand) {
-			super(window, invokingCommand);
-		}
-
-		Table getTable() {
-			return table;
-		}
-
-		Text getFilterText() {
-			return filterText;
-		}
-
-		protected void toggleShowAllMatches() {
-			super.toggleShowAllMatches();
-		}
-	}
-
-	/**
-	 * @param testName
-	 */
-	public QuickAccessDialogTest(String testName) {
-		super(testName);
-	}
-
-	public void testOpenQuickAccess() {
-		final TestQuickAccessDialog dialog = new TestQuickAccessDialog(
-				getWorkbench().getActiveWorkbenchWindow(), null);
-		dialog.setBlockOnOpen(false);
-		dialog.open();
-		try {
-			assertTrue("expecting items", processEventsUntil(new Condition() {
-				public boolean compute() {
-					return dialog.getTable().getItemCount() > 0;
-				};
-			}, 200));
-			String oldFirstItemText = dialog.getTable().getItem(0).getText(1);
-			dialog.getFilterText().setText("e");
-			int count1 = dialog.getTable().getItemCount();
-			assertTrue("expecting matching items", count1 > 0);
-			assertNotSame("expecting different item", oldFirstItemText, dialog
-					.getTable().getItem(0).getText(1));
-			dialog.toggleShowAllMatches();
-			int count2 = dialog.getTable().getItemCount();
-			assertTrue("still expecting matching items", count2 > 0);
-			assertTrue("expecting more matching items", count2 > count1);
-		} finally {
-			dialog.close();
-		}
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/quickaccess/QuickAccessTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/quickaccess/QuickAccessTestSuite.java
deleted file mode 100644
index 4c452f3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/quickaccess/QuickAccessTestSuite.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.quickaccess;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Test areas of the Property Sheet API.
- */
-public class QuickAccessTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite.  This is required to
-     * use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new QuickAccessTestSuite();
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public QuickAccessTestSuite() {
-        addTest(new TestSuite(CamelUtilTest.class));
-        addTest(new TestSuite(QuickAccessDialogTest.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/ActiveUserSourceProvider.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/ActiveUserSourceProvider.java
deleted file mode 100644
index 7f06b47..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/ActiveUserSourceProvider.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.services;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.ui.AbstractSourceProvider;
-import org.eclipse.ui.ISources;
-
-/**
- * A registered source provider that can update variables for the
- * IEvaluationService.
- * 
- * @since 3.4
- */
-public class ActiveUserSourceProvider extends AbstractSourceProvider {
-	private static final String[] PROVIDED_SOURCE_NAMES = new String[] { "username" };
-
-	private String username = "guest";
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISourceProvider#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISourceProvider#getCurrentState()
-	 */
-	public Map getCurrentState() {
-		Map map = new HashMap();
-		map.put(PROVIDED_SOURCE_NAMES[0], username);
-		return map;
-	}
-
-	public void setUsername(String name) {
-		username = name;
-		fireSourceChanged(ISources.ACTIVE_CONTEXT << 1,
-				PROVIDED_SOURCE_NAMES[0], name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISourceProvider#getProvidedSourceNames()
-	 */
-	public String[] getProvidedSourceNames() {
-		return PROVIDED_SOURCE_NAMES;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/ContributedServiceTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/ContributedServiceTest.java
deleted file mode 100644
index c9b9835..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/ContributedServiceTest.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.services;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.services.IServiceLocatorCreator;
-import org.eclipse.ui.internal.services.IWorkbenchLocationService;
-import org.eclipse.ui.progress.IProgressService;
-import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
-import org.eclipse.ui.services.AbstractServiceFactory;
-import org.eclipse.ui.services.IDisposable;
-import org.eclipse.ui.services.IServiceLocator;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.4
- * 
- */
-public class ContributedServiceTest extends UITestCase {
-
-	/**
-	 * @param testName
-	 */
-	public ContributedServiceTest(String testName) {
-		super(testName);
-	}
-
-	public void testGlobalService() throws Exception {
-		IWorkbenchLocationService wls = (IWorkbenchLocationService) getWorkbench()
-				.getService(IWorkbenchLocationService.class);
-		assertNotNull(wls.getWorkbench());
-		assertNull(wls.getWorkbenchWindow());
-
-		ILevelService l = (ILevelService) getWorkbench().getService(
-				ILevelService.class);
-		assertNotNull(l);
-		assertEquals(1, l.getLevel());
-
-		l = (ILevelService) getWorkbench().getService(ILevelService.class);
-		assertNotNull(l);
-		assertEquals(1, l.getLevel());
-
-		assertEquals(1, LevelServiceFactory.instancesCreated);
-	}
-
-	public void testWindowService() throws Exception {
-		IServiceLocator locator = getWorkbench().getActiveWorkbenchWindow();
-		IWorkbenchLocationService wls = (IWorkbenchLocationService) locator
-				.getService(IWorkbenchLocationService.class);
-		assertNotNull(wls.getWorkbenchWindow());
-
-		ILevelService l = (ILevelService) locator
-				.getService(ILevelService.class);
-		assertNotNull(l);
-		assertEquals(2, l.getLevel());
-
-		assertEquals(2, LevelServiceFactory.instancesCreated);
-
-		l = (ILevelService) locator.getService(ILevelService.class);
-		assertNotNull(l);
-		assertEquals(2, l.getLevel());
-
-		l = (ILevelService) getWorkbench().getService(ILevelService.class);
-		assertNotNull(l);
-		assertEquals(1, l.getLevel());
-
-		assertEquals(2, LevelServiceFactory.instancesCreated);
-	}
-
-	private static class TempLevelFactory extends AbstractServiceFactory {
-		private int level;
-
-		public TempLevelFactory(int l) {
-			level = l;
-		}
-
-		public Object create(Class serviceInterface,
-				IServiceLocator parentLocator, IServiceLocator locator) {
-			return new ILevelService() {
-
-				public int getLevel() {
-					return level;
-				}
-			};
-		}
-	}
-
-	public void testLocalServiceCreated() throws Exception {
-		IServiceLocator parent = getWorkbench().getActiveWorkbenchWindow();
-		IWorkbenchLocationService wls = (IWorkbenchLocationService) parent
-				.getService(IWorkbenchLocationService.class);
-		assertNotNull(wls.getWorkbenchWindow());
-
-		IServiceLocatorCreator lc = (IServiceLocatorCreator) parent
-				.getService(IServiceLocatorCreator.class);
-		IServiceLocator locator = lc.createServiceLocator(parent, null,
-				new IDisposable() {
-					public void dispose() {
-					}
-				});
-
-		ILevelService l = (ILevelService) locator
-				.getService(ILevelService.class);
-		assertNotNull(l);
-		assertEquals(3, l.getLevel());
-
-		assertEquals(3, LevelServiceFactory.instancesCreated);
-
-		if (locator instanceof IDisposable) {
-			((IDisposable) locator).dispose();
-		}
-
-		locator = lc.createServiceLocator(parent, null, new IDisposable() {
-			public void dispose() {
-			}
-		});
-		l = (ILevelService) locator.getService(ILevelService.class);
-		assertNotNull(l);
-		assertEquals(3, l.getLevel());
-
-		assertEquals(4, LevelServiceFactory.instancesCreated);
-		if (locator instanceof IDisposable) {
-			((IDisposable) locator).dispose();
-		}
-
-		locator = lc.createServiceLocator(parent, new TempLevelFactory(8),
-				new IDisposable() {
-					public void dispose() {
-					}
-				});
-		l = (ILevelService) locator.getService(ILevelService.class);
-		assertNotNull(l);
-		assertEquals(8, l.getLevel());
-
-		assertEquals(4, LevelServiceFactory.instancesCreated);
-		if (locator instanceof IDisposable) {
-			((IDisposable) locator).dispose();
-		}
-	}
-
-	public void testWorkbenchServiceFactory() throws Exception {
-		IWorkbenchWindow window = getWorkbench().getActiveWorkbenchWindow();
-		IProgressService progress = (IProgressService) window
-				.getService(IProgressService.class);
-		assertNotNull(progress);
-
-		assertEquals(getWorkbench().getProgressService(), progress);
-		IViewPart part = null;
-		IViewReference[] refs = window.getActivePage().getViewReferences();
-		for (int i = 0; i < refs.length; i++) {
-			if ((part = refs[i].getView(false)) != null) {
-				break;
-			}
-		}
-
-		assertNotNull(part);
-		progress = (IProgressService) part.getSite().getService(
-				IProgressService.class);
-		assertFalse(progress == getWorkbench().getProgressService());
-		assertEquals(part.getSite().getService(
-				IWorkbenchSiteProgressService.class), progress);
-		assertEquals(part.getSite().getAdapter(
-				IWorkbenchSiteProgressService.class), progress);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/EvaluationServiceTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/EvaluationServiceTest.java
deleted file mode 100644
index 456d868..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/EvaluationServiceTest.java
+++ /dev/null
@@ -1,420 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.services;
-
-import org.eclipse.core.expressions.EvaluationResult;
-import org.eclipse.core.expressions.Expression;
-import org.eclipse.core.expressions.ExpressionConverter;
-import org.eclipse.core.expressions.ExpressionInfo;
-import org.eclipse.core.expressions.IEvaluationContext;
-import org.eclipse.core.internal.expressions.TestExpression;
-import org.eclipse.core.internal.expressions.WithExpression;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.ISources;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.contexts.IContextActivation;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.internal.services.SlaveEvaluationService;
-import org.eclipse.ui.services.IEvaluationReference;
-import org.eclipse.ui.services.IEvaluationService;
-import org.eclipse.ui.services.ISourceProviderService;
-import org.eclipse.ui.tests.commands.ActiveContextExpression;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * @since 3.3
- * 
- */
-public class EvaluationServiceTest extends UITestCase {
-	private static final String CONTEXT_ID1 = "org.eclipse.ui.command.contexts.evaluationService1";
-
-	/**
-	 * @param testName
-	 */
-	public EvaluationServiceTest(String testName) {
-		super(testName);
-	}
-
-	private static class MyEval implements IPropertyChangeListener {
-		public int count = 0;
-		public boolean currentValue;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-		 */
-		public void propertyChange(PropertyChangeEvent event) {
-			count++;
-			if (event.getProperty() == IEvaluationService.RESULT
-					&& event.getNewValue() instanceof Boolean) {
-				currentValue = ((Boolean) event.getNewValue()).booleanValue();
-			}
-		}
-	}
-
-	public void testBasicService() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		IEvaluationService service = (IEvaluationService) window
-				.getService(IEvaluationService.class);
-		assertNotNull(service);
-
-		MyEval listener = new MyEval();
-		IContextActivation context1 = null;
-		IEvaluationReference evalRef = null;
-		IContextService contextService = null;
-		try {
-			evalRef = service.addEvaluationListener(
-					new ActiveContextExpression(CONTEXT_ID1,
-							new String[] { ISources.ACTIVE_CONTEXT_NAME }),
-					listener, IEvaluationService.RESULT);
-			assertEquals(1, listener.count);
-			assertFalse(listener.currentValue);
-
-			contextService = (IContextService) window
-					.getService(IContextService.class);
-			context1 = contextService.activateContext(CONTEXT_ID1);
-			assertEquals(2, listener.count);
-			assertTrue(listener.currentValue);
-
-			contextService.deactivateContext(context1);
-			context1 = null;
-			assertEquals(3, listener.count);
-			assertFalse(listener.currentValue);
-
-			service.removeEvaluationListener(evalRef);
-			evalRef = null;
-			assertEquals(4, listener.count);
-
-			context1 = contextService.activateContext(CONTEXT_ID1);
-			assertEquals(4, listener.count);
-			assertFalse(listener.currentValue);
-			contextService.deactivateContext(context1);
-			context1 = null;
-			assertEquals(4, listener.count);
-			assertFalse(listener.currentValue);
-		} finally {
-			if (context1 != null) {
-				contextService.deactivateContext(context1);
-			}
-			if (evalRef != null) {
-				service.removeEvaluationListener(evalRef);
-			}
-		}
-	}
-
-	public void testTwoEvaluations() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		IEvaluationService service = (IEvaluationService) window
-				.getService(IEvaluationService.class);
-		assertNotNull(service);
-
-		MyEval listener1 = new MyEval();
-		MyEval listener2 = new MyEval();
-		IContextActivation context1 = null;
-		IEvaluationReference evalRef1 = null;
-		IEvaluationReference evalRef2 = null;
-		IContextService contextService = null;
-		try {
-			evalRef1 = service.addEvaluationListener(
-					new ActiveContextExpression(CONTEXT_ID1,
-							new String[] { ISources.ACTIVE_CONTEXT_NAME }),
-					listener1, IEvaluationService.RESULT);
-			assertEquals(1, listener1.count);
-			assertFalse(listener1.currentValue);
-
-			evalRef2 = service.addEvaluationListener(
-					new ActiveContextExpression(CONTEXT_ID1,
-							new String[] { ISources.ACTIVE_CONTEXT_NAME }),
-					listener2, IEvaluationService.RESULT);
-			assertEquals(1, listener2.count);
-			assertFalse(listener2.currentValue);
-			evalRef2.setResult(true);
-
-			contextService = (IContextService) window
-					.getService(IContextService.class);
-			context1 = contextService.activateContext(CONTEXT_ID1);
-			assertEquals(2, listener1.count);
-			assertTrue(listener1.currentValue);
-			// we already set this guy to true, he should skip
-			assertEquals(1, listener2.count);
-			assertFalse(listener2.currentValue);
-
-			evalRef1.setResult(false);
-			contextService.deactivateContext(context1);
-			context1 = null;
-			assertEquals(2, listener2.count);
-			assertFalse(listener2.currentValue);
-
-			// we already set this guy to false, so he should be the old
-			// values
-			assertEquals(2, listener1.count);
-			assertTrue(listener1.currentValue);
-
-		} finally {
-			if (context1 != null) {
-				contextService.deactivateContext(context1);
-			}
-			if (evalRef1 != null) {
-				service.removeEvaluationListener(evalRef1);
-			}
-			if (evalRef2 != null) {
-				service.removeEvaluationListener(evalRef2);
-			}
-		}
-	}
-
-	public void testRestriction() {
-		IWorkbenchWindow window = openTestWindow();
-		IEvaluationService evaluationService = (IEvaluationService) window
-				.getService(IEvaluationService.class);
-		assertNotNull(evaluationService);
-		IContextService contextService = (IContextService) window
-				.getService(IContextService.class);
-		assertNotNull(contextService);
-
-		Expression expression = new ActiveContextExpression(CONTEXT_ID1,
-				new String[] { ISources.ACTIVE_CONTEXT_NAME });
-
-		final boolean[] propertyChanged = new boolean[1];
-		final boolean[] propertyShouldChange = new boolean[1];
-
-		IPropertyChangeListener propertyChangeListener = new IPropertyChangeListener() {
-
-			public void propertyChange(PropertyChangeEvent event) {
-				if (event.getProperty().equals("foo"))
-					propertyChanged[0] = true;
-
-			}
-		};
-		IEvaluationReference ref = evaluationService.addEvaluationListener(
-				expression, propertyChangeListener, "foo");
-		((WorkbenchWindow)window).getMenuRestrictions().add(ref);
-
-		IPropertyChangeListener propertyShouldChangeListener = new IPropertyChangeListener() {
-
-			public void propertyChange(PropertyChangeEvent event) {
-				if (event.getProperty().equals("foo"))
-					propertyShouldChange[0] = true;
-
-			}
-		};
-		evaluationService.addEvaluationListener(expression,
-				propertyShouldChangeListener, "foo");
-
-		propertyChanged[0] = false;
-		propertyShouldChange[0] = false;
-
-		assertFalse(contextService.getActiveContextIds().contains(CONTEXT_ID1));
-		IContextActivation activation = contextService
-				.activateContext(CONTEXT_ID1);
-
-		assertTrue(propertyChanged[0]);
-		assertTrue(propertyShouldChange[0]);
-		propertyChanged[0] = false;
-		propertyShouldChange[0] = false;
-
-		contextService.deactivateContext(activation);
-		assertTrue(propertyChanged[0]);
-		assertTrue(propertyShouldChange[0]);
-		assertFalse(contextService.getActiveContextIds().contains(CONTEXT_ID1));
-		activation = contextService.activateContext(CONTEXT_ID1);
-		propertyChanged[0] = false;
-		propertyShouldChange[0] = false;
-		assertTrue(contextService.getActiveContextIds().contains(CONTEXT_ID1));
-
-		// open second window
-		IWorkbenchWindow window2 = openTestWindow();
-		assertFalse(propertyChanged[0]);
-		assertTrue(propertyShouldChange[0]);
-		assertFalse(contextService.getActiveContextIds().contains(CONTEXT_ID1));
-		propertyChanged[0] = false;
-		propertyShouldChange[0] = false;
-
-		window2.close();
-		processEvents();
-
-		assertTrue(contextService.getActiveContextIds().contains(CONTEXT_ID1));
-		assertFalse(propertyChanged[0]);
-		assertTrue(propertyShouldChange[0]);
-	}
-
-	public void testScopedService() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		IEvaluationService service = (IEvaluationService) window
-				.getService(IEvaluationService.class);
-		assertNotNull(service);
-		assertTrue(service instanceof SlaveEvaluationService);
-
-		MyEval listener = new MyEval();
-		IContextActivation context1 = null;
-		IContextService contextService = null;
-		try {
-			service.addEvaluationListener(
-					new ActiveContextExpression(CONTEXT_ID1,
-							new String[] { ISources.ACTIVE_CONTEXT_NAME }),
-					listener, IEvaluationService.RESULT);
-			assertEquals(1, listener.count);
-			assertFalse(listener.currentValue);
-
-			contextService = (IContextService) window.getWorkbench()
-					.getService(IContextService.class);
-			context1 = contextService.activateContext(CONTEXT_ID1);
-			assertEquals(2, listener.count);
-			assertTrue(listener.currentValue);
-
-			window.close();
-			processEvents();
-			assertEquals(3, listener.count);
-			assertTrue(listener.currentValue);
-
-			contextService.deactivateContext(context1);
-			context1 = null;
-			assertEquals(3, listener.count);
-			assertTrue(listener.currentValue);
-		} finally {
-			if (context1 != null) {
-				contextService.deactivateContext(context1);
-			}
-		}
-	}
-
-	private static class UserExpression extends Expression {
-		public String lookFor;
-
-		public UserExpression(String lookFor) {
-			this.lookFor = lookFor;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.expressions.Expression#collectExpressionInfo(org.eclipse.core.expressions.ExpressionInfo)
-		 */
-		public void collectExpressionInfo(ExpressionInfo info) {
-			info.addVariableNameAccess("username");
-		}
-
-		public EvaluationResult evaluate(IEvaluationContext context)
-				throws CoreException {
-			String variable = (String) context.getVariable("username");
-			return lookFor.equals(variable) ? EvaluationResult.TRUE
-					: EvaluationResult.FALSE;
-		}
-	}
-
-	public void testSourceProvider() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		IEvaluationService service = (IEvaluationService) window
-				.getService(IEvaluationService.class);
-		assertNotNull(service);
-
-		MyEval listener = new MyEval();
-		UserExpression expression = new UserExpression("Paul");
-		IEvaluationReference ref = service.addEvaluationListener(expression,
-				listener, IEvaluationService.RESULT);
-		assertEquals(ISources.ACTIVE_CONTEXT << 1, ref.getSourcePriority());
-		assertFalse(listener.currentValue);
-		assertEquals(1, listener.count);
-
-		ISourceProviderService sps = (ISourceProviderService) window
-				.getService(ISourceProviderService.class);
-		ActiveUserSourceProvider userProvider = (ActiveUserSourceProvider) sps
-				.getSourceProvider("username");
-
-		userProvider.setUsername("John");
-		assertFalse(listener.currentValue);
-		assertEquals(1, listener.count);
-
-		userProvider.setUsername("Paul");
-		assertTrue(listener.currentValue);
-		assertEquals(2, listener.count);
-
-		userProvider.setUsername("guest");
-		assertFalse(listener.currentValue);
-		assertEquals(3, listener.count);
-	}
-
-	public void testPropertyChange() throws Exception {
-		IWorkbenchWindow window = openTestWindow();
-		IEvaluationService service = (IEvaluationService) window
-				.getService(IEvaluationService.class);
-		assertNotNull(service);
-		MyEval listener = new MyEval();
-		IExtensionRegistry registry = Platform.getExtensionRegistry();
-		IConfigurationElement element = null;
-		IConfigurationElement[] elements = registry
-				.getConfigurationElementsFor("org.eclipse.core.expressions.definitions");
-		for (int i = 0; i < elements.length && element == null; i++) {
-			if (elements[i].getAttribute("id").equals(
-					"org.eclipse.ui.tests.defWithPropertyTester")) {
-				element = elements[i];
-			}
-		}
-
-		assertNotNull(element);
-		Expression expr = ExpressionConverter.getDefault().perform(element.getChildren()[0]);
-		service.addEvaluationListener(expr,
-				listener, IEvaluationService.RESULT);
-		assertFalse(listener.currentValue);
-		assertEquals(1, listener.count);
-		
-		StaticVarPropertyTester.result = true;
-		assertFalse(listener.currentValue);
-		assertEquals(1, listener.count);
-		
-		service.requestEvaluation("org.eclipse.ui.tests.class.method");
-		assertTrue(listener.currentValue);
-		assertEquals(2, listener.count);
-
-		service.requestEvaluation("org.eclipse.ui.tests.class.method");
-		assertTrue(listener.currentValue);
-		assertEquals(2, listener.count);
-	}
-	
-	public void testPlatformProperty() throws Exception {
-		IEvaluationService evaluationService = (IEvaluationService) PlatformUI
-				.getWorkbench().getService(IEvaluationService.class);
-		TestExpression test = new TestExpression("org.eclipse.core.runtime",
-				"bundleState",
-				new Object[] { "org.eclipse.core.expressions" }, "ACTIVE", false);
-		WithExpression exp = new WithExpression("org.eclipse.core.runtime.Platform");
-		exp.add(test);
-		EvaluationResult result= exp.evaluate(evaluationService.getCurrentState());
-		assertEquals(EvaluationResult.TRUE, result);
-	}
-	
-	public void XtestSystemProperty() throws Exception {
-		// this is not added, as the ability to test system properties with
-		// no '.' seems unhelpful
-		System.setProperty("isHere", "true");
-		IEvaluationService evaluationService = (IEvaluationService) PlatformUI
-				.getWorkbench().getService(IEvaluationService.class);
-		TestExpression test = new TestExpression("org.eclipse.core.runtime",
-				"isHere",
-				new Object[] { "true" }, null, false);
-		WithExpression exp = new WithExpression(
-				"java.lang.System" );
-		exp.add(test);
-		EvaluationResult result = exp.evaluate(evaluationService
-				.getCurrentState());
-		assertEquals(EvaluationResult.TRUE, result);
-
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/ILevelService.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/ILevelService.java
deleted file mode 100644
index 310fcd2..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/ILevelService.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.services;
-
-/**
- * @since 3.4
- *
- */
-public interface ILevelService {
-	public int getLevel();
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/LevelServiceFactory.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/LevelServiceFactory.java
deleted file mode 100644
index 6f251ca..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/LevelServiceFactory.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.services;
-
-import org.eclipse.ui.services.AbstractServiceFactory;
-import org.eclipse.ui.services.IServiceLocator;
-
-/**
- * @since 3.4
- * 
- */
-public class LevelServiceFactory extends AbstractServiceFactory {
-
-	static int instancesCreated = 0;
-
-	private static class LS implements ILevelService {
-		private int level;
-
-		public LS(int l) {
-			level = l;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.ui.tests.services.ILevelService#getLevel()
-		 */
-		public int getLevel() {
-			return level;
-		}
-
-	};
-
-	public Object create(Class serviceInterface, IServiceLocator parentLocator,
-			IServiceLocator locator) {
-		int level = 1;
-		Object parent = parentLocator.getService(ILevelService.class);
-		if (parent != null) {
-			ILevelService l = (ILevelService) parent;
-			level = l.getLevel() + 1;
-		}
-		instancesCreated++;
-		return new LS(level);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/ServicesTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/ServicesTestSuite.java
deleted file mode 100755
index 0960709..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/ServicesTestSuite.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.services;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Tests general to services.
- * @since 3.3
- */
-public final class ServicesTestSuite extends TestSuite {
-
-	/**
-	 * Returns the suite. This is required to use the JUnit Launcher.
-	 */
-	public static final Test suite() {
-		return new ServicesTestSuite();
-	}
-
-	/**
-	 * Construct the test suite.
-	 */
-	public ServicesTestSuite() {
-		addTest(new TestSuite(EvaluationServiceTest.class));
-		addTest(new TestSuite(ContributedServiceTest.class));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/StaticVarPropertyTester.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/StaticVarPropertyTester.java
deleted file mode 100644
index c76a22f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/services/StaticVarPropertyTester.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.services;
-
-import org.eclipse.core.expressions.PropertyTester;
-
-/**
- * @since 3.4
- *
- */
-public class StaticVarPropertyTester extends PropertyTester {
-	public static boolean result = false;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object)
-	 */
-	public boolean test(Object receiver, String property, Object[] args,
-			Object expectedValue) {
-		return result;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/ArbitraryPropertiesEditorTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/ArbitraryPropertiesEditorTest.java
deleted file mode 100644
index d711e17..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/ArbitraryPropertiesEditorTest.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.session;
-
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart3;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.api.workbenchpart.TitleTestEditor;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-
-/**
- * If a view is not activated during a session, it's part is not instantiated.
- * This tests that case, and the outcome should be the view has it's last
- * session state when it is finally instantiated in the workbench.
- * 
- * @since 3.3
- */
-public class ArbitraryPropertiesEditorTest extends TestCase {
-	/**
-	 * 
-	 */
-	private static final String USER_PROP = "org.eclipse.ui.tests.users";
-
-	private static final String EDITOR_ID = "org.eclipse.ui.tests.TitleTestEditor";
-
-	public static TestSuite suite() {
-		return new TestSuite(ArbitraryPropertiesEditorTest.class);
-	}
-
-	public ArbitraryPropertiesEditorTest(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * This is the first part of a 3 part tests. First instantiate a view and
-	 * set a state.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testOpenEditor() throws Throwable {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		final IWorkbenchPage page = workbench.getActiveWorkbenchWindow()
-				.getActivePage();
-
-		IProject proj = FileUtil.createProject("EditorSessionTest");
-		IFile file = FileUtil.createFile("state.txt", proj);
-
-		TitleTestEditor editor = (TitleTestEditor) page.openEditor(
-				new FileEditorInput(file), EDITOR_ID);
-
-		// this makes the second file active on the first
-		file = FileUtil.createFile("state_active.txt", proj);
-		IDE.openEditor(page, file);
-
-		editor.setPartProperty(USER_PROP, "pwebster");
-	}
-
-	/**
-	 * The second session doesn't activate the view, so it should not be
-	 * instantiated.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testSecondOpening() throws Throwable {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		final IWorkbenchPage page = workbench.getActiveWorkbenchWindow()
-				.getActivePage();
-		IEditorReference[] editors = page.getEditorReferences();
-		for (int i = 0; i < editors.length; i++) {
-			IEditorReference ref = editors[i];
-			if (ref.getEditorInput().getName().equals("state.txt")) {
-				assertNull("The editor should not be instantiated", ref
-						.getPart(false));
-				assertEquals("pwebster", ref.getPartProperty(USER_PROP));
-			}
-		}
-	}
-
-	static class PropListener implements IPropertyChangeListener {
-		public int count = 0;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-		 */
-		public void propertyChange(PropertyChangeEvent event) {
-			count++;
-		}
-	};
-
-	/**
-	 * Activate the view and it's state should re-appear.
-	 * 
-	 * @throws Throwable
-	 */
-	public void testPartInstantiation() throws Throwable {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		final IWorkbenchPage page = workbench.getActiveWorkbenchWindow()
-				.getActivePage();
-
-		IEditorReference ref = null;
-		IEditorReference[] editors = page.getEditorReferences();
-		for (int i = 0; i < editors.length; i++) {
-			if (editors[i].getEditorInput().getName().equals("state.txt")) {
-				ref = editors[i];
-			}
-		}
-
-		assertEquals("pwebster", ref.getPartProperty(USER_PROP));
-		PropListener listener = new PropListener();
-		ref.addPartPropertyListener(listener);
-
-		try {
-
-			IWorkbenchPart3 wp = (IWorkbenchPart3) ref.getPart(true);
-			assertEquals("pwebster", wp.getPartProperty(USER_PROP));
-			assertEquals(0, listener.count);
-		} finally {
-			ref.removePartPropertyListener(listener);
-		}
-
-		IEditorInput input = ref.getEditorInput();
-
-		// the state should not be saved between a close and
-		// an open in the same session
-		page.closeEditor((IEditorPart) ref.getPart(true), false);
-
-		TitleTestEditor editor = (TitleTestEditor) page.openEditor(input,
-				EDITOR_ID);
-		assertNull(editor.getPartProperty(USER_PROP));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/ArbitraryPropertiesViewTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/ArbitraryPropertiesViewTest.java
deleted file mode 100644
index 8ef04d3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/ArbitraryPropertiesViewTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.session;
-
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart3;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * If a view is not activated during a session, it's part is not instantiated.
- * This tests that case, and the outcome should be the view has it's last
- * session state when it is finally instantiated in the workbench.
- * 
- * @since 3.3
- */
-public class ArbitraryPropertiesViewTest extends TestCase {
-	/**
-	 * 
-	 */
-	private static final String USER_PROP = "org.eclipse.ui.tests.users";
-
-	private static final String PROBLEM_VIEW_ID = "org.eclipse.ui.views.ProblemView";
-
-	private static final String VIEW_WITH_STATE_ID = "org.eclipse.ui.tests.session.ViewWithState";
-
-	public static TestSuite suite() {
-		return new TestSuite(ArbitraryPropertiesViewTest.class);
-	}
-
-	public ArbitraryPropertiesViewTest(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * This is the first part of a 3 part tests. First instantiate a view and
-	 * set a state.
-	 * 
-	 * @throws Throwable
-	 */
-	public void test01ActivateView() throws Throwable {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		final IWorkbenchPage page = workbench.getActiveWorkbenchWindow()
-				.getActivePage();
-
-		IViewPart v = page.showView(VIEW_WITH_STATE_ID);
-
-		// put another view in front of our view
-		page.showView(PROBLEM_VIEW_ID);
-
-		IWorkbenchPart3 wp = (IWorkbenchPart3) v;
-		wp.setPartProperty(USER_PROP, "pwebster");
-	}
-
-	/**
-	 * The second session doesn't activate the view, so it should not be
-	 * instantiated.
-	 * 
-	 * @throws Throwable
-	 */
-	public void test02SecondOpening() throws Throwable {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		final IWorkbenchPage page = workbench.getActiveWorkbenchWindow()
-				.getActivePage();
-
-		IViewReference[] views = page.getViewReferences();
-		for (int i = 0; i < views.length; i++) {
-			IViewReference ref = views[i];
-			if (ref.getId().equals(VIEW_WITH_STATE_ID)) {
-				assertNull("The view should not be instantiated", ref
-						.getPart(false));
-				assertEquals("pwebster", ref.getPartProperty(USER_PROP));
-			}
-		}
-	}
-
-	static class PropListener implements IPropertyChangeListener {
-		public int count = 0;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-		 */
-		public void propertyChange(PropertyChangeEvent event) {
-			count++;
-		}
-	};
-
-	/**
-	 * Activate the view and it's state should re-appear.
-	 * 
-	 * @throws Throwable
-	 */
-	public void test03PartInstantiation() throws Throwable {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		final IWorkbenchPage page = workbench.getActiveWorkbenchWindow()
-				.getActivePage();
-		
-		IViewReference ref = page.findViewReference(VIEW_WITH_STATE_ID);
-		assertEquals("pwebster", ref.getPartProperty(USER_PROP));
-		PropListener listener = new PropListener();
-		ref.addPartPropertyListener(listener);
-
-		IViewPart v = null;
-		try {
-			v = page.showView(VIEW_WITH_STATE_ID);
-			IWorkbenchPart3 wp = (IWorkbenchPart3) v;
-			assertEquals("pwebster", wp.getPartProperty(USER_PROP));
-			assertEquals(0, listener.count);
-		} finally {
-			ref.removePartPropertyListener(listener);
-		}
-		// the state should not be saved between a close and
-		// an open in the same session
-		page.hideView(v);
-		v = page.showView(VIEW_WITH_STATE_ID);
-		IWorkbenchPart3 wp = (IWorkbenchPart3) v;
-		assertNull(wp.getPartProperty(USER_PROP));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/Bug108033Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/Bug108033Test.java
deleted file mode 100644
index 78d8555..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/Bug108033Test.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.session;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ViewSite;
-import org.eclipse.ui.internal.ViewStack;
-import org.eclipse.ui.internal.presentations.PresentablePart;
-import org.eclipse.ui.internal.presentations.util.TabbedStackPresentation;
-import org.eclipse.ui.presentations.IPresentablePart;
-
-/**
- * Bug 108033 Need a test to ensure that view tab order is the same on start up
- * as it was in the last session.
- * 
- * These tests more or less depend on being run in order. The workspace exists
- * from method to method.
- * 
- * @since 3.2
- * 
- */
-public class Bug108033Test extends TestCase {
-
-	public static final String PROBLEM_VIEW_ID = "org.eclipse.ui.views.ProblemView";
-
-	public static final String TASK_VIEW_ID = "org.eclipse.ui.views.TaskList";
-
-	public static final String PROGRESS_VIEW_ID = "org.eclipse.ui.views.ProgressView";
-
-	private static String RESOURCE_ID = "org.eclipse.ui.resourcePerspective";
-
-	private IWorkbenchWindow fWin;
-
-	private IWorkbenchPage fActivePage;
-
-	private IWorkbench fWorkbench;
-
-	public Bug108033Test(String testName) {
-		super(testName);
-	}
-
-	protected void setUp() throws Exception {
-		fWorkbench = PlatformUI.getWorkbench();
-
-		fWin = fWorkbench.getActiveWorkbenchWindow();
-
-		fActivePage = fWin.getActivePage();
-	}
-
-	/**
-	 * Make sure the perspective has been reset, and then show the views in the
-	 * expected order. These tests depend on being run in order in the same
-	 * environment, so we can't use the standard openWindow() to protect
-	 * ourselves from side effects.
-	 * 
-	 * @throws Throwable
-	 *             an error
-	 */
-	public void testShowMultipleViews() throws Throwable {
-		IPerspectiveDescriptor desc = fActivePage.getWorkbenchWindow()
-				.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(
-						RESOURCE_ID);
-		fActivePage.setPerspective(desc);
-		fActivePage.resetPerspective();
-		assertNotNull(fActivePage.showView(TASK_VIEW_ID));
-		assertNotNull(fActivePage.showView(PROGRESS_VIEW_ID));
-		assertNotNull(fActivePage.showView(PROBLEM_VIEW_ID));
-	}
-
-	/**
-	 * Check the views are still in the correct order, then move the problems
-	 * view to the first tab.
-	 * 
-	 * @throws Throwable
-	 *             an error
-	 */
-	public void testCheckMultipleViews() throws Throwable {
-		IViewPart problemView = instantiateViews();
-
-		ViewSite site = (ViewSite) problemView.getSite();
-		ViewStack stack = (ViewStack) site.getPane().getContainer();
-
-		TabbedStackPresentation pres = (TabbedStackPresentation) stack
-				.getTestPresentation();
-
-		verifyOrder(pres, new String[] { "Tasks", "Progress", "Problems" });
-		IPresentablePart part = getPresentablePart(site);
-		assertNotNull(part);
-
-		pres.moveTab(part, 0);
-
-		verifyOrder(pres, new String[] { "Problems", "Tasks", "Progress" });
-	}
-
-	/**
-	 * Verify the views are ordered with the problems view first after the
-	 * restart.
-	 * 
-	 * @throws Throwable
-	 *             an error
-	 */
-	public void testMovedMultipleViews() throws Throwable {
-		IViewPart problemView = instantiateViews();
-
-		ViewSite site = (ViewSite) problemView.getSite();
-		ViewStack stack = (ViewStack) site.getPane().getContainer();
-
-		TabbedStackPresentation pres = (TabbedStackPresentation) stack
-				.getTestPresentation();
-
-		verifyOrder(pres, new String[] { "Problems", "Tasks", "Progress" });
-	}
-
-	/**
-	 * Removes any NPEs.
-	 * 
-	 * @return the problem view.
-	 * @throws PartInitException
-	 *             if a view fails to instantiate.
-	 */
-	private IViewPart instantiateViews() throws PartInitException {
-		IViewPart problemView = fActivePage.showView(PROBLEM_VIEW_ID);
-		assertNotNull(problemView);
-
-		// make sure all of the views have been instantiated
-		assertNotNull(fActivePage.showView(PROGRESS_VIEW_ID));
-		assertNotNull(fActivePage.showView(TASK_VIEW_ID));
-		return problemView;
-	}
-
-	/**
-	 * Verify the tabs are in the correct order.
-	 * 
-	 * @param pres
-	 *            the stack presentation
-	 * @param order
-	 *            the expected order
-	 */
-	private void verifyOrder(TabbedStackPresentation pres, String[] order) {
-		IPresentablePart[] tabs = pres.getPartList();
-		assertEquals("Different number of tabs", order.length, tabs.length);
-		for (int i = 0; i < tabs.length; ++i) {
-			assertEquals("Failed on tab " + i, order[i], tabs[i].getName());
-		}
-	}
-
-	/**
-	 * Get the presentable part for the view (view site).
-	 * 
-	 * @param site
-	 *            the site of the view we want
-	 * @return it's presentable part.
-	 */
-	private IPresentablePart getPresentablePart(ViewSite site) {
-		IPresentablePart[] partList = (IPresentablePart[]) ((ViewStack) site
-				.getPane().getContainer()).getPresentableParts().toArray(
-				new IPresentablePart[0]);
-		for (int i = 0; i < partList.length; i++) {
-			IPresentablePart part = partList[i];
-			if (((PresentablePart) part).getPane() == site.getPane()) {
-				return part;
-			}
-		}
-		return null;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/Bug95357Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/Bug95357Test.java
deleted file mode 100644
index efcfd25..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/Bug95357Test.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.session;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.SWT;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.EditorSite;
-import org.eclipse.ui.internal.EditorStack;
-import org.eclipse.ui.tests.api.SessionEditorPart;
-import org.eclipse.ui.tests.dnd.DragOperations;
-import org.eclipse.ui.tests.dnd.EditorDropTarget;
-import org.eclipse.ui.tests.dnd.ExistingWindowProvider;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-
-/**
- * Bug 95357 Need a test to ensure editor activation is not broken on startup.
- * When eclipse starts, there should be tabs for all of the open editor windows
- * but only the <b>active</b> editor window(s) should have been instantiated. A
- * bug that crops up occasionally is that all of the editors have been
- * instantiated, which impacts performance.
- * 
- * These tests more or less depend on being run in order. The workspace exists
- * from method to method.
- * 
- * @since 3.1
- * 
- */
-public class Bug95357Test extends TestCase {
-
-	private static final String BUG95357PROJECT = "Bug95357project";
-
-	private static final int FILE_MAX = 8;
-
-	private IWorkbenchWindow fWin;
-
-	private IWorkbenchPage fActivePage;
-
-	private IProject fProject;
-
-	private IWorkbench fWorkbench;
-
-	private String[] itsFilename;
-
-	public Bug95357Test(String testName) {
-		super(testName);
-		fWorkbench = PlatformUI.getWorkbench();
-		fProject = null;
-
-	}
-
-	/**
-	 * @param ext
-	 */
-	private void setupFilenames(String ext) {
-		itsFilename = new String[Bug95357Test.FILE_MAX];
-		for (int i = 0; i < Bug95357Test.FILE_MAX; ++i) {
-			itsFilename[i] = "test" + i + ext;
-		}
-	}
-
-	protected void setUp() throws Exception {
-		fWin = fWorkbench.getActiveWorkbenchWindow();
-
-		fActivePage = fWin.getActivePage();
-		fProject = FileUtil.createProject(Bug95357Test.BUG95357PROJECT);
-	}
-
-	/**
-	 * Multiple editors open - part 1 of 2. This makes sure that there are
-	 * FILE_MAX editors open, and the files have been created. Then the session
-	 * stops.
-	 * 
-	 * @throws PartInitException
-	 * @throws CoreException
-	 */
-	private void multipleEditors() throws PartInitException, CoreException {
-		fActivePage.closeAllEditors(false);
-		
-		IEditorPart[] part = new IEditorPart[itsFilename.length];
-		for (int i = 0; i < itsFilename.length; i++) {
-			part[i] = IDE.openEditor(fActivePage, FileUtil.createFile(
-					itsFilename[i], fProject), true);
-		}
-
-		assertTrue(fActivePage.isEditorAreaVisible());
-		assertFalse(fActivePage.isPartVisible(part[0]));
-		assertTrue(fActivePage.isPartVisible(part[part.length - 1]));
-	}
-
-	/**
-	 * Multiple editors open - part 2 of 2. We can test the state of eclipse
-	 * after the system has restarted. We expect that the last editor will be
-	 * active and instantiated, but the other editors won't have been
-	 * instantiated.
-	 */
-	private void multipleEditorsOpen() {
-		IEditorReference[] editors = fActivePage.getEditorReferences();
-		assertEquals(Bug95357Test.FILE_MAX, editors.length);
-
-		for (int i = 0; i < editors.length - 1; i++) {
-			assertNull("Editor " + i + " " + editors[i].getName()
-					+ " should not be active", editors[i].getEditor(false));
-		}
-		assertNotNull(editors[editors.length - 1].getEditor(false));
-		assertNotNull(editors[0].getEditor(true));
-	}
-
-	/**
-	 * Multiple editors in 2 stacks - part 1 of 2. Set up eclipse with FILE_MAX
-	 * editors open in 2 stacks.
-	 * 
-	 * @throws PartInitException
-	 * @throws CoreException
-	 */
-	private void multipleStacks() throws PartInitException, CoreException {
-		final String f1 = itsFilename[0];
-		final String f2 = itsFilename[1];
-		final int startAt = 2;
-
-		fActivePage.closeAllEditors(false);
-
-		IEditorPart last = IDE.openEditor(fActivePage, FileUtil.createFile(f1,
-				fProject), true);
-		IEditorPart current = IDE.openEditor(fActivePage, FileUtil.createFile(
-				f2, fProject), true);
-
-		// create the second editor stack using the second editor
-		DragOperations.drag(current, new EditorDropTarget(
-				new ExistingWindowProvider(fWin), 0, SWT.BOTTOM), false);
-
-		EditorStack firstStack = (EditorStack) ((EditorSite) last
-				.getEditorSite()).getPane().getContainer();
-		EditorStack secondStack = (EditorStack) ((EditorSite) current
-				.getEditorSite()).getPane().getContainer();
-
-		for (int i = startAt; i < itsFilename.length; ++i) {
-			fActivePage.activate(last);
-			last = current;
-			current = IDE.openEditor(fActivePage, FileUtil.createFile(
-					itsFilename[i], fProject), true);
-		}
-		assertEquals(Bug95357Test.FILE_MAX / 2, firstStack.getItemCount());
-		assertEquals(Bug95357Test.FILE_MAX / 2, secondStack.getItemCount());
-	}
-
-	/**
-	 * Multiple editors in 2 stacks - part 2 of 2. 2 of the editors should have
-	 * been instantiated. The rest should still be inactive.
-	 * 
-	 */
-	private void multipleStacksOnStartup() {
-		IEditorReference lastFile = null;
-		IEditorReference secondLastFile = null;
-
-		IEditorReference[] editors = fActivePage.getEditorReferences();
-		assertEquals(Bug95357Test.FILE_MAX, editors.length);
-
-		for (int i = 0; i < editors.length; i++) {
-			if (itsFilename[itsFilename.length - 1]
-					.equals(editors[i].getName())) {
-				lastFile = editors[i];
-			} else if (itsFilename[itsFilename.length - 2].equals(editors[i]
-					.getName())) {
-				secondLastFile = editors[i];
-			}
-		}
-
-		assertNotNull(lastFile.getEditor(false));
-		assertNotNull(secondLastFile.getEditor(false));
-		for (int i = 0; i < editors.length; ++i) {
-			if (editors[i] != lastFile && editors[i] != secondLastFile) {
-				assertNull("For file " + i + " " + editors[i].getName(),
-						editors[i].getEditor(false));
-			}
-		}
-	}
-
-	/**
-	 * Test for .txt files and the basic editor. Part 1 of 2
-	 * 
-	 * @throws Throwable
-	 */
-	public void testMultipleEditors() throws Throwable {
-		setupFilenames(".txt");
-		
-		multipleEditors();
-	}
-
-	/**
-	 * Test for .txt files and the basic editor. Part 2 of 2
-	 * 
-	 * @throws Throwable
-	 */
-	public void testMultipleEditorsOpen() throws Throwable {
-		setupFilenames(".txt");
-	
-		multipleEditorsOpen();
-	}
-
-	/**
-	 * Test multiple stacks with .txt editor. Part 1 of 2
-	 * 
-	 * @throws Throwable
-	 */
-	public void testMultipleStacks() throws Throwable {
-		setupFilenames(".txt");
-		multipleStacks();
-	}
-
-	/**
-	 * Test multiple stacks with .txt editor. Part 2 of 2
-	 * 
-	 * @throws Throwable
-	 */
-	public void testMultipleStacksOnStartup() throws Throwable {
-		setupFilenames(".txt");
-		multipleStacksOnStartup();
-		
-	}
-	
-	/**
-	 * Test for .session files and the SessionEditorPart editor. Part 1 of 2
-	 * 
-	 * @throws Throwable
-	 */
-	public void testMultipleEditorsSession() throws Throwable {
-		setupFilenames(".session");
-		multipleEditors();
-		assertEquals(Bug95357Test.FILE_MAX, SessionEditorPart.instantiatedEditors);
-		
-	}
-	
-	/**
-	 * Test for .session files and the SessionEditorPart editor. Part 2 of 2
-	 * 
-	 * @throws Throwable
-	 */
-	public void testMultipleEditorsOpenSession() throws Throwable {
-		setupFilenames(".session");
-		multipleEditorsOpen();
-		assertEquals(2, SessionEditorPart.instantiatedEditors);
-	}
-
-	/**
-	 * Test multiple stacks with .session editor. Part 1 of 2
-	 * 
-	 * @throws Throwable
-	 */
-	public void testMultipleStacksSession() throws Throwable {
-		setupFilenames(".session");
-		SessionEditorPart.instantiatedEditors = 0;
-		multipleStacks();
-		assertEquals(Bug95357Test.FILE_MAX, SessionEditorPart.instantiatedEditors);
-		
-	}
-	
-	/**
-	 * Test multiple stacks with .session editor. Part 2 of 2
-	 * 
-	 * @throws Throwable
-	 */
-	public void testMultipleStacksOnStartupSession() throws Throwable {
-		setupFilenames(".session");
-		multipleStacksOnStartup();
-		assertEquals(2, SessionEditorPart.instantiatedEditors);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/Bug98800Test.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/Bug98800Test.java
deleted file mode 100644
index 31ee6c1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/Bug98800Test.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.session;
-
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * If a view is not activated during a session, it's part is not instantiated.
- * This tests that case, and the outcome should be the view has it's last
- * session state when it is finally instantiated in the workbench.
- * 
- * @since 3.1.1
- */
-public class Bug98800Test extends TestCase {
-	private static final String PROBLEM_VIEW_ID = "org.eclipse.ui.views.ProblemView";
-
-	private static final String VIEW_WITH_STATE_ID = "org.eclipse.ui.tests.session.ViewWithState";
-
-	public static TestSuite suite() {
-		return new TestSuite(Bug98800Test.class);
-	}
-
-	private IWorkbenchPage fPage;
-
-	public Bug98800Test(String testName) {
-		super(testName);
-		fPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-				.getActivePage();
-	}
-
-	/**
-	 * This is the first part of a 3 part tests.  First instantiate a view
-	 * and set a state.
-	 * @throws Throwable
-	 */
-	public void testActivateView() throws Throwable {
-		IViewPart v = fPage.showView(VIEW_WITH_STATE_ID);
-		
-		// put another view in front of our view
-		fPage.showView(PROBLEM_VIEW_ID);
-		
-		// set a state so it can be saved
-		ViewWithState view = (ViewWithState) v;
-		view.fState = 10;
-	}
-
-	/**
-	 * The second session doesn't activate the view, so it should not
-	 * be instantiated.
-	 *  
-	 * @throws Throwable
-	 */
-	public void testSecondOpening() throws Throwable {
-		IViewReference[] views = fPage.getViewReferences();
-		for (int i = 0; i < views.length; i++) {
-			IViewReference ref = views[i];
-			if (ref.getId().equals(VIEW_WITH_STATE_ID)) {
-				assertNull("The view should not be instantiated", ref
-						.getPart(false));
-			}
-		}
-	}
-
-	/**
-	 * Activate the view and it's state should re-appear.
-	 * @throws Throwable
-	 */
-	public void testSavedMemento() throws Throwable {
-		IViewPart v = fPage.showView(VIEW_WITH_STATE_ID);
-		ViewWithState view = (ViewWithState) v;
-		assertEquals(
-				"the view state should have made it through a session without instantiation",
-				10, view.fState);
-
-		// the state should not be saved between a close and
-		// an open in the same session
-		fPage.hideView(v);
-		v = fPage.showView(VIEW_WITH_STATE_ID);
-		view = (ViewWithState) v;
-		assertEquals("The view state should be reset", 0, view.fState);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/EditorWithStateTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/EditorWithStateTest.java
deleted file mode 100644
index 78c6422..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/EditorWithStateTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.session;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.api.MockEditorWithState;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-
-/**
- * A test to verify the persistence of handler state between sessions.
- * 
- * @since 3.2
- */
-public class EditorWithStateTest extends TestCase {
-
-	/**
-	 * Constructs a new instance of <code>EditorWithStateTest</code>.
-	 * 
-	 * @param testName
-	 *            The name of the test; may be <code>null</code>.
-	 */
-	public EditorWithStateTest(final String testName) {
-		super(testName);
-	}
-
-	public void testInitialEditorOpen() throws Exception {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		final IWorkbenchPage page = workbench.getActiveWorkbenchWindow()
-				.getActivePage();
-		IProject proj = FileUtil.createProject("EditorSessionTest");
-		IFile file = FileUtil.createFile("state.txt", proj);
-		MockEditorWithState editor = (MockEditorWithState) page.openEditor(
-				new FileEditorInput(file), MockEditorWithState.ID);
-		assertFalse(editor.getCallHistory().contains("saveState"));
-		assertFalse(editor.getCallHistory().contains("restoreState"));
-		
-		assertTrue(editor.isSaveOnCloseNeeded());
-		editor.setSaveNeeded(false);
-	}
-
-	public void testSecondEditorOpen() throws Exception {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		final IWorkbenchPage page = workbench.getActiveWorkbenchWindow()
-				.getActivePage();
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
-				"EditorSessionTest");
-		IFile file = project.getFile("state.txt");
-		MockEditorWithState editor = (MockEditorWithState) page
-				.findEditor(new FileEditorInput(file));
-		assertNotNull(editor);
-		assertFalse(editor.getCallHistory().contains("saveState"));
-		assertTrue(editor.getCallHistory().contains("restoreState"));
-		assertFalse(editor.isSaveOnCloseNeeded());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/HandlerStateTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/HandlerStateTest.java
deleted file mode 100644
index ba9534d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/HandlerStateTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.session;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.State;
-import org.eclipse.jface.commands.PersistentState;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.commands.ICommandService;
-
-/**
- * A test to verify the persistence of handler state between sessions.
- * 
- * @since 3.2
- */
-public class HandlerStateTest extends TestCase {
-
-	/**
-	 * The identifier of the command with state that we wish to test.
-	 */
-	private static final String COMMAND_ID = "org.eclipse.ui.tests.commandWithState";
-
-	/**
-	 * The identifier of the state with an initial value of <code>false</code>.
-	 */
-	private static final String FALSE_STATE_ID = "FALSE";
-
-	/**
-	 * The text after the handler state has been modified.
-	 */
-	private static final String MODIFIED_TEXT = "Rain rain go away come back again in april or may";
-
-	/**
-	 * The identifier of the text state with an initial value of
-	 * <code>null</code>.
-	 */
-	private static final String TEXT_STATE_ID = "TEXT";
-
-	/**
-	 * The identifier of the state with an initial value of <code>true</code>.
-	 */
-	private static final String TRUE_STATE_ID = "TRUE";
-
-	/**
-	 * Constructs a new instance of <code>HandlerStateTest</code>.
-	 * 
-	 * @param testName
-	 *            The name of the test; may be <code>null</code>.
-	 */
-	public HandlerStateTest(final String testName) {
-		super(testName);
-	}
-
-	/**
-	 * Verifies that the initial handler state is correct. After this, the state
-	 * is changed.
-	 */
-	public final void testInitialHandlerState() {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		final ICommandService service = (ICommandService) workbench
-				.getService(ICommandService.class);
-		final Command command = service.getCommand(COMMAND_ID);
-		State state;
-		boolean actual;
-
-		// Check the state that defaults to true.
-		state = command.getState(TRUE_STATE_ID);
-		actual = ((Boolean) state.getValue()).booleanValue();
-		assertTrue("The initial value should be true", actual);
-		state.setValue(Boolean.FALSE);
-
-		// Check the state that defaults to false.
-		state = command.getState(FALSE_STATE_ID);
-		actual = ((Boolean) state.getValue()).booleanValue();
-		assertTrue("The initial value should be false", !actual);
-		state.setValue(Boolean.TRUE);
-
-		// Check the text state.
-		state = command.getState(TEXT_STATE_ID);
-		final String text = (String) state.getValue();
-		assertNull("The initial value should be null", text);
-		((PersistentState) state).setShouldPersist(true);
-		state.setValue(MODIFIED_TEXT);
-	}
-
-	/**
-	 * Verifies that the handler state is persisted between sessions.
-	 */
-	public final void testModifiedHandlerState() {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		final ICommandService service = (ICommandService) workbench
-				.getService(ICommandService.class);
-		final Command command = service.getCommand(COMMAND_ID);
-		State state;
-		boolean actual;
-
-		// Test the state that defaults to true is now false.
-		state = command.getState(TRUE_STATE_ID);
-		actual = ((Boolean) state.getValue()).booleanValue();
-		assertTrue("The value should now be different", !actual);
-
-		// Test the state that defaults to false is now true.
-		state = command.getState(FALSE_STATE_ID);
-		actual = ((Boolean) state.getValue()).booleanValue();
-		assertTrue("The value should now be different", actual);
-
-		// Test that the text state is now MODIFIED_TEXT.
-		state = command.getState(TEXT_STATE_ID);
-		((PersistentState) state).setShouldPersist(true);
-		final String text = (String) state.getValue();
-		assertEquals("The modified value was not persisted", MODIFIED_TEXT,
-				text);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/IntroSessionTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/IntroSessionTests.java
deleted file mode 100644
index c641550..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/IntroSessionTests.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.session;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Tests intro-related session properties.
- * 
- * @since 3.1
- */
-public class IntroSessionTests extends TestCase {
-	
-	/**
-	 * @param name
-	 */
-	public IntroSessionTests(String name) {
-		super(name);
-	}
-	
-	public void testIntro() {
-		//assert that the intro was not shown
-		assertNull(PlatformUI.getWorkbench().getIntroManager().getIntro());
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/LocaleTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/LocaleTest.java
deleted file mode 100644
index 62d4c4a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/LocaleTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.session;
-
-import java.util.Locale;
-
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.tests.navigator.AbstractNavigatorTest;
-
-/**
- * 
- */
-public class LocaleTest extends AbstractNavigatorTest {
-
-	
-	public LocaleTest(String testName) {
-		super(testName);
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.tests.harness.util.UITestCase#doSetUp()
-	 */
-	protected void doSetUp() throws Exception {
-		super.doSetUp();
-		createTestFile();
-	}
-	
-	
-	public void testLocales() {
-		Locale[] locales = Locale.getAvailableLocales();
-		Locale oldLocale = Locale.getDefault();
-		
-		switchLocale(new Locale("sv"));
-		for (int i = 0; i < locales.length; i++) {
-			Locale locale = locales[i];
-			switchLocale(locale);
-		}
-		
-		Locale.setDefault(oldLocale);
-	}
-
-	/**
-	 * @param locale
-	 */
-	private void switchLocale(Locale locale) {
-		Locale.setDefault(locale);
-		System.out.println(locale.toString());
-		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-		IPerspectiveDescriptor[] perspectives = PlatformUI.getWorkbench()
-				.getPerspectiveRegistry().getPerspectives();
-		for (int j = 0; j < perspectives.length; j++) {
-			page.setPerspective(perspectives[j]);
-		}
-		page.closeAllPerspectives(false, false);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/NonRestorableViewTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/NonRestorableViewTest.java
deleted file mode 100644
index e2ba79f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/NonRestorableViewTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Versant Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Versant Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.session;
-
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * If a view is set to non restorable during a session, it's part is not instantiated.
- * This tests that case, and the outcome should be that the view doesn't get 
- * instanciated in the second session.
- * 
- * @since 3.4
- */
-public class NonRestorableViewTest extends TestCase {
-
-	private static final String NON_RESTORABLE_VIEW_ID = "org.eclipse.ui.tests.session.NonRestorableView";
-
-	public static TestSuite suite() {
-		return new TestSuite(NonRestorableViewTest.class);
-	}
-
-	public NonRestorableViewTest(String testName) {
-		super(testName);
-	}
-
-	/**
-	 * This is the first part  instantiates a non restorable view
-	 * 
-	 * @throws Throwable
-	 */
-	public void test01ActivateView() throws Throwable {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		final IWorkbenchPage page = workbench.getActiveWorkbenchWindow()
-				.getActivePage();
-
-		IViewPart part = page.showView(NON_RESTORABLE_VIEW_ID);
-		assertNotNull(part);
-		assertTrue(part instanceof NonRestorableView);
-	}
-
-	/**
-	 * In the second session the view shouldn't be
-	 * instantiated.
-	 * 
-	 * @throws Throwable
-	 */
-	public void test02SecondOpening() throws Throwable {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		final IWorkbenchPage page = workbench.getActiveWorkbenchWindow()
-				.getActivePage();
-
-		IViewReference[] views = page.getViewReferences();
-		for (int i = 0; i < views.length; i++) {
-			IViewReference ref = views[i];
-			if (ref.getId().equals(NON_RESTORABLE_VIEW_ID)) {
-				fail("Should not find this view");
-			}
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/SessionTests.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/SessionTests.java
deleted file mode 100644
index 488aa05..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/SessionTests.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Markus Alexander Kuppe, Versant Corporation - bug #215797
- *******************************************************************************/
-package org.eclipse.ui.tests.session;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.ui.tests.harness.util.TweakletCheckTest;
-import org.eclipse.ui.tests.markers.MarkersViewColumnSizeTest;
-import org.eclipse.ui.tests.statushandlers.StatusHandlerConfigurationSuite;
-import org.eclipse.ui.tests.statushandlers.StatusHandlingConfigurationTest;
-
-/**
- * @since 3.1
- */
-public class SessionTests extends TestSuite {
-
-	/**
-	 * @return
-	 */
-	public static Test suite() {
-		return new SessionTests();
-	}
-
-	/**
-	 * 
-	 */
-	public SessionTests() {
-		addTweakletCheck();
-		addHandlerStateTests();
-		addIntroTests();
-		addEditorTests();
-		addViewStateTests();
-		addThemeTests();
-		addStatusHandlingTests();
-	}
-
-	/**
-	 * 
-	 */
-	private void addStatusHandlingTests() {
-		//actually we do not care which workspace is used
-		addTest(new StatusHandlerConfigurationSuite("themeSessionTests",
-				StatusHandlingConfigurationTest.class));
-	}
-
-	/**
-	 * 
-	 */
-	private void addTweakletCheck() {
-		addTest(new TweakletCheckTest());
-	}
-
-	/**
-	 * 
-	 */
-	private void addThemeTests() {
-		addTest(new WorkbenchSessionTest("themeSessionTests",
-				ThemeStateTest.class));
-		
-	}
-
-	/**
-	 * Add editor tests that involve starting and stopping sessions.
-	 */
-	private void addEditorTests() {
-		addTest(new WorkbenchSessionTest("editorSessionTests",
-				Bug95357Test.class));
-		addTest(new WorkbenchSessionTest("editorSessionTests",
-				EditorWithStateTest.class));
-		addTest(new WorkbenchSessionTest("editorSessionTests",
-				ArbitraryPropertiesEditorTest.class));
-	}
-
-	/**
-	 * Adds tests related to command and handler state.
-	 * 
-	 * @since 3.2
-	 */
-	private void addHandlerStateTests() {
-		addTest(new WorkbenchSessionTest("editorSessionTests",
-				HandlerStateTest.class));
-	}
-
-	/**
-	 * Adds intro related session tests.
-	 */
-	private void addIntroTests() {
-		addTest(new WorkbenchSessionTest("introSessionTests",
-				IntroSessionTests.class));
-	}
-
-	/**
-	 * Add a view state test that involves state from one session to the other.
-	 * 
-	 * BTW: the <b>editorSessionTests</b> is the zip file to grab the default
-	 * workspace for these particular session tests.
-	 */
-	private void addViewStateTests() {
-		addTest(new WorkbenchSessionTest("editorSessionTests",
-				Bug98800Test.class));
-		addTest(new WorkbenchSessionTest("editorSessionTests",
-				Bug108033Test.class));
-		addTest(new WorkbenchSessionTest("editorSessionTests",
-				ArbitraryPropertiesViewTest.class));
-		addTest(new WorkbenchSessionTest("editorSessionTests", NonRestorableViewTest.class));
-		addTest(new WorkbenchSessionTest("editorSessionTests",
-				MarkersViewColumnSizeTest.class));
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/ThemeStateTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/ThemeStateTest.java
deleted file mode 100644
index 8cf5a2d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/ThemeStateTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.session;
-
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.themes.IThemeManager;
-
-import junit.framework.TestCase;
-
-/**
- * Tests various persistent theme properties.
- * 
- * @since 3.4
- */
-public class ThemeStateTest extends TestCase {
-
-	public ThemeStateTest(final String name) {
-		super(name);
-	}
-
-	/**
-	 * Tests to ensure that the workbench still comes up if there's a bad theme
-	 * ID in the preference store.
-	 */
-	public void testBadPreference() {
-		String themeId = PlatformUI.getWorkbench().getThemeManager()
-				.getCurrentTheme().getId();
-		assertNotNull(themeId);
-		assertEquals(IThemeManager.DEFAULT_THEME, themeId);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/ViewWithState.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/ViewWithState.java
deleted file mode 100644
index 3d59349..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/ViewWithState.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.session;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.ViewPart;
-
-public class ViewWithState extends ViewPart {
-
-	private static final String STATE = "state";
-
-	public int fState = 0;
-
-	public void createPartControl(Composite parent) {
-		Label l = new Label(parent, SWT.NONE);
-		l.setText("This view should have some saved state: " + fState);
-	}
-
-	public void setFocus() {
-		// do nothing
-	}
-
-	public void init(IViewSite site, IMemento memento) throws PartInitException {
-		super.init(site, memento);
-		if (memento != null) {
-			Integer i = memento.getInteger(STATE);
-			if (i != null) {
-				fState = i.intValue();
-			}
-		}
-	}
-
-	public void saveState(IMemento memento) {
-		memento.putInteger(STATE, fState);
-		super.saveState(memento);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/WorkbenchSessionTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/WorkbenchSessionTest.java
deleted file mode 100644
index dc9937f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/WorkbenchSessionTest.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.session;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.tests.harness.FileSystemHelper;
-import org.eclipse.core.tests.session.SessionTestSuite;
-import org.eclipse.core.tests.session.Setup;
-import org.eclipse.core.tests.session.SetupManager;
-import org.eclipse.core.tests.session.SetupManager.SetupException;
-import org.eclipse.ui.tests.TestPlugin;
-import org.eclipse.ui.tests.harness.util.FileTool;
-
-/**
- * Wrapper for workbench session tests.
- * 
- * @since 3.1
- */
-public class WorkbenchSessionTest extends SessionTestSuite {
-
-	private String dataLocation;
-	
-	/**
-	 * Create a new workbench session test.
-	 * 
-	 * @param dataLocation
-	 *            the location of the workspace to test, relative to
-	 *            data/workspaces
-	 * @param clazz
-	 *            the <code>Test</code> class
-	 */
-	public WorkbenchSessionTest(String dataLocation, Class clazz) {
-		super("org.eclipse.ui.tests", clazz);
-		setApplicationId(SessionTestSuite.UI_TEST_APPLICATION);		
-		this.dataLocation = dataLocation;
-	}
-	
-	/**
-	 * Create a new workbench session test.
-	 * 
-	 * @param dataLocation
-	 *            the location of the workspace to test, relative to
-	 *            data/workspaces
-	 * @since 3.4
-	 */
-	public WorkbenchSessionTest(String dataLocation) {
-		super(dataLocation);
-		setApplicationId(SessionTestSuite.UI_TEST_APPLICATION);		
-		this.dataLocation = dataLocation;
-	}
-
-	/**
-	 * Ensures setup uses this suite's instance location.
-	 * 
-	 * @throws SetupException
-	 */
-	protected Setup newSetup() throws SetupException {
-		Setup base = super.newSetup();
-		try {
-			base.setEclipseArgument(Setup.DATA, copyDataLocation());
-		} catch (Exception e) {
-			throw SetupManager.getInstance().new SetupException(e.getMessage(),
-					e);
-		}
-		return base;
-	}
-
-	/**
-	 * Copies the data to a temporary directory and returns the new location.
-	 * 
-	 * @return the location
-	 */
-	private String copyDataLocation() throws IOException {
-        TestPlugin plugin = TestPlugin.getDefault();
-        if (plugin == null)
-            throw new IllegalStateException(
-                    "TestPlugin default reference is null");
-        
-        URL fullPathString = plugin.getDescriptor().find(
-				new Path("data/workspaces/" + dataLocation + ".zip"));
-        
-        if (fullPathString == null) 
-        	throw new IllegalArgumentException();
-        
-        IPath path = new Path(fullPathString.getPath());
-
-        File origin = path.toFile();
-        if (!origin.exists())
-			throw new IllegalArgumentException();
-        
-        ZipFile zFile = new ZipFile(origin);        
-		
-		File destination = new File(FileSystemHelper.getRandomLocation(FileSystemHelper.getTempDir()).toOSString());
-		FileTool.unzip(zFile, destination);
-		return destination.getAbsolutePath();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/FaultyExportWizard.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/FaultyExportWizard.java
deleted file mode 100644
index 9a1dc7c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/FaultyExportWizard.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.tests.statushandlers;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-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.Label;
-import org.eclipse.ui.IExportWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * This wizard with no default constructor. Used during the status handling
- * facility tests.
- */
-public class FaultyExportWizard extends Wizard implements IExportWizard {
-
-	/**
-	 * Intentional constructor that hides default one
-	 * 
-	 * @param name
-	 *            does nothing
-	 */
-	public FaultyExportWizard(String name) {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
-	 *      org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		setWindowTitle("window title");
-	}
-
-	public void addPages() {
-		super.addPages();
-		addPage(new MyWizardPage("wizard"));
-	}
-
-	public class MyWizardPage extends WizardPage {
-		/**
-		 * Creates some wizard page
-		 * 
-		 * @param pageName
-		 */
-		protected MyWizardPage(String pageName) {
-			super(pageName);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-		 */
-		public void createControl(Composite parent) {
-			Composite page = new Composite(parent, SWT.NONE);
-			GridLayout pageLayout = new GridLayout();
-			page.setLayout(pageLayout);
-			page.setLayoutData(new GridData(GridData.FILL_BOTH));
-			Label nameLabel = new Label(page, SWT.NONE);
-			nameLabel.setText("some label");
-			setControl(page);
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/FreeStatusHandler.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/FreeStatusHandler.java
deleted file mode 100644
index 85890d4..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/FreeStatusHandler.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.eclipse.ui.tests.statushandlers;
-
-import org.eclipse.ui.statushandlers.AbstractStatusHandler;
-import org.eclipse.ui.statushandlers.StatusAdapter;
-
-/**
- * This status handler is not bound to any product.
- * @since 3.5
- *
- */
-public class FreeStatusHandler extends AbstractStatusHandler {
-
-	private static AbstractStatusHandler tester;
-
-	public synchronized void handle(StatusAdapter statusAdapter, int style) {
-		if (tester != null) {
-			tester.handle(statusAdapter, style);
-		}
-	}
-
-	public static synchronized void setTester(AbstractStatusHandler tester) {
-		FreeStatusHandler.tester = tester;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusDialogManagerTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusDialogManagerTest.java
deleted file mode 100644
index e3e7a5f..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusDialogManagerTest.java
+++ /dev/null
@@ -1,792 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.statushandlers;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.util.Policy;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-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.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.internal.WorkbenchMessages;
-import org.eclipse.ui.progress.IProgressConstants;
-import org.eclipse.ui.statushandlers.AbstractStatusAreaProvider;
-import org.eclipse.ui.statushandlers.IStatusAdapterConstants;
-import org.eclipse.ui.statushandlers.StatusAdapter;
-import org.eclipse.ui.statushandlers.WorkbenchStatusDialogManager;
-
-public class StatusDialogManagerTest extends TestCase {
-
-	private static final String ACTION_NAME = "actionname";
-	private static final String JOB_NAME = "jobname";
-	private static final String THROWABLE = "throwable";
-	private final static String MESSAGE_1 = "TEST_MESSAGE_1";
-	private final static String MESSAGE_2 = "TEST_MESSAGE_2";
-	private final static String TITLE = "TEST_TITLE";
-	private final static NullPointerException NPE = new NullPointerException();
-	private final static NullPointerException NPE_WITH_MESSAGE = new NullPointerException(
-			THROWABLE);
-	private final static String NPE_NAME = NPE.getClass().getName();
-
-	private boolean automatedMode;
-	WorkbenchStatusDialogManager wsdm;
-	
-	protected void setUp() throws Exception {
-		automatedMode = ErrorDialog.AUTOMATED_MODE;
-		wsdm = new WorkbenchStatusDialogManager(null, null);
-		ErrorDialog.AUTOMATED_MODE = false;
-		super.setUp();
-	}
-
-	public void testBlockingAppearance() {
-		wsdm.addStatusAdapter(createStatusAdapter(MESSAGE_1), true);
-		Shell shell = StatusDialogUtil.getStatusShell();
-		assertNotNull(shell);
-		assertTrue((shell.getStyle() & SWT.APPLICATION_MODAL) == SWT.APPLICATION_MODAL);
-	}
-
-	public void testNonBlockingAppearance() {
-		wsdm.addStatusAdapter(createStatusAdapter(MESSAGE_1), false);
-		Shell shell = StatusDialogUtil.getStatusShell();
-		assertNotNull(shell);
-		assertFalse((shell.getStyle() & SWT.APPLICATION_MODAL) == SWT.APPLICATION_MODAL);
-	}
-
-	public void testModalitySwitch1() {
-		wsdm.addStatusAdapter(createStatusAdapter(MESSAGE_1), false);
-		Shell shell = StatusDialogUtil.getStatusShell();
-		assertNotNull(shell);
-		assertFalse((shell.getStyle() & SWT.APPLICATION_MODAL) == SWT.APPLICATION_MODAL);
-
-		wsdm.addStatusAdapter(createStatusAdapter(MESSAGE_1), true);
-		shell = StatusDialogUtil.getStatusShell();
-		assertNotNull(shell);
-		assertTrue((shell.getStyle() & SWT.APPLICATION_MODAL) == SWT.APPLICATION_MODAL);
-	}
-	
-	public void testCheckingForMessageDuplication1() {
-		IStatus status = new IStatus() {
-
-			public IStatus[] getChildren() {
-				// TODO Auto-generated method stub
-				return new IStatus[0];
-			}
-
-			public int getCode() {
-				return IStatus.ERROR;
-			}
-
-			public Throwable getException() {
-				return new ArrayIndexOutOfBoundsException();
-			}
-
-			public String getMessage() {
-				return null;
-			}
-
-			public String getPlugin() {
-				return "plugin";
-			}
-
-			public int getSeverity() {
-				return IStatus.ERROR;
-			}
-
-			public boolean isMultiStatus() {
-				return false;
-			}
-
-			public boolean isOK() {
-				return false;
-			}
-
-			public boolean matches(int severityMask) {
-				return true;
-			}
-
-		};
-		wsdm.addStatusAdapter(new StatusAdapter(status), false);
-
-		assertEquals(status.getException().getClass().getName(),
-				StatusDialogUtil.getTitleLabel().getText());
-		assertEquals(WorkbenchMessages.WorkbenchStatusDialog_SeeDetails,
-				StatusDialogUtil.getSingleStatusLabel().getText());
-	}
-
-	/**
-	 * Preserving details selection and state
-	 */
-	public void testModalitySwitch2() {
-		final StatusAdapter[] passed = new StatusAdapter[] { null };
-		final Composite[] details = new Composite[] { null };
-		setupDetails(passed, details);
-		StatusAdapter sa = createStatusAdapter(MESSAGE_1);
-		wsdm.addStatusAdapter(sa, false);
-
-		// open details
-		selectWidget(StatusDialogUtil.getDetailsButton());
-		wsdm.addStatusAdapter(createStatusAdapter(MESSAGE_2), true);
-
-		assertNotNull(details[0]);
-		assertFalse(details[0].isDisposed());
-		assertEquals(sa, passed[0]);
-	}
-
-	/**
-	 * Preserving support selection and state
-	 */
-	public void testModalitySwitch3() {
-		final StatusAdapter[] passed = new StatusAdapter[] { null };
-		final Composite[] support = new Composite[] { null };
-		setupSupportArea(passed, support);
-		StatusAdapter sa = createStatusAdapter(MESSAGE_1);
-		wsdm.addStatusAdapter(sa, false);
-
-		// open support
-		selectWidget(StatusDialogUtil.getSupportToolItem());
-		wsdm.addStatusAdapter(createStatusAdapter(MESSAGE_2), true);
-
-		assertNotNull(support[0]);
-		assertFalse(support[0].isDisposed());
-		assertEquals(sa, passed[0]);
-	}
-	
-	/**
-	 * Be sure that label provider is not disposed during modality switch.
-	 */
-	public void testModalitySwitch4() {
-		final boolean[] disposed = new boolean[] { false };
-		ITableLabelProvider provider = new ITableLabelProvider() {
-
-			public Image getColumnImage(Object element, int columnIndex) {
-				return null;
-			}
-
-			public String getColumnText(Object element, int columnIndex) {
-				return "";
-			}
-
-			public void addListener(ILabelProviderListener listener) {
-			}
-
-			public void dispose() {
-				disposed[0] = true;
-			}
-
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-
-			public void removeListener(ILabelProviderListener listener) {
-			}
-
-		};
-		wsdm.setStatusListLabelProvider(provider);
-
-		wsdm.addStatusAdapter(createStatusAdapter(MESSAGE_1), false);
-		wsdm.addStatusAdapter(createStatusAdapter(MESSAGE_1), false);
-		wsdm.addStatusAdapter(createStatusAdapter(MESSAGE_2), true);
-
-		assertFalse(
-				"Label provider should not be disposed during modality switch.",
-				disposed[0]);
-
-		selectWidget(StatusDialogUtil.getOkButton());
-		assertTrue("Label should be disposed when the dialog is closed.",
-				disposed[0]);
-	}
-
-	/**
-	 * Simple status without exception Check primary and secondary message.
-	 * Verify invisible action button.
-	 */
-	public void testWithStatusAdapter1() {
-		wsdm.addStatusAdapter(createStatusAdapter(MESSAGE_1), false);
-		Label titleLabel = StatusDialogUtil.getTitleLabel();
-		assertNotNull(titleLabel);
-		assertEquals(MESSAGE_1, titleLabel.getText());
-
-		Label secondaryLabel = StatusDialogUtil.getSingleStatusLabel();
-		assertNotNull(secondaryLabel);
-		assertEquals(WorkbenchMessages.WorkbenchStatusDialog_SeeDetails,
-				secondaryLabel.getText());
-
-		// check invisible action button
-		Button actionButton = StatusDialogUtil.getActionButton();
-		assertNotNull(actionButton);
-		assertFalse(actionButton.isVisible());
-		Object layoutData = actionButton.getLayoutData();
-		assertTrue(layoutData instanceof GridData);
-		assertTrue(((GridData) layoutData).exclude);
-	}
-
-	public void testWithStatusAdapterAndLabelProvider1(){
-		wsdm.setMessageDecorator(new ILabelDecorator(){
-			
-			public Image decorateImage(Image image, Object element) {
-				// TODO Auto-generated method stub
-				return null;
-			}
-			
-			public String decorateText(String text, Object element) {
-				// TODO Auto-generated method stub
-				return text.replaceAll("[A-Z][A-Z][A-Z][0-9][0-9]", "");
-			}
-			
-			public void addListener(ILabelProviderListener listener) {
-				// TODO Auto-generated method stub
-				
-			}
-			
-			public void dispose() {
-				// TODO Auto-generated method stub
-				
-			}
-			
-			public boolean isLabelProperty(Object element, String property) {
-				// TODO Auto-generated method stub
-				return false;
-			}
-			
-			public void removeListener(ILabelProviderListener listener) {
-				// TODO Auto-generated method stub
-				
-			}
-			
-		});
-		wsdm.addStatusAdapter(createStatusAdapter("XYZ01" + MESSAGE_1), false);
-		Label titleLabel = StatusDialogUtil.getTitleLabel();
-		assertNotNull(titleLabel);
-		assertEquals(MESSAGE_1, titleLabel.getText());
-
-		Label secondaryLabel = StatusDialogUtil.getSingleStatusLabel();
-		assertNotNull(secondaryLabel);
-		assertEquals(WorkbenchMessages.WorkbenchStatusDialog_SeeDetails,
-				secondaryLabel.getText());
-	}
-	
-	
-	/**
-	 * Simple status with title. Check primary and secondary message. Verify
-	 * closing.
-	 */
-	public void testWithStatusAdapter2() {
-		wsdm.addStatusAdapter(createStatusAdapter(MESSAGE_1, TITLE),
-				false);
-		Label titleLabel = StatusDialogUtil.getTitleLabel();
-		assertNotNull(titleLabel);
-		assertEquals(TITLE, titleLabel.getText());
-
-		Label secondaryLabel = StatusDialogUtil.getSingleStatusLabel();
-		assertNotNull(secondaryLabel);
-		assertEquals(MESSAGE_1, secondaryLabel.getText());
-
-		selectWidget(StatusDialogUtil.getOkButton());
-		// dialog closed
-		assertNull(StatusDialogUtil.getStatusShell());
-
-		// list cleared
-		assertEquals(0, wsdm.getStatusAdapters().size());
-	}
-
-	/**
-	 * Simple status with exception with message
-	 */
-	public void testWithStatusAdapter3() {
-		wsdm.addStatusAdapter(createStatusAdapter(MESSAGE_1,
-				NPE_WITH_MESSAGE), false);
-		Label titleLabel = StatusDialogUtil.getTitleLabel();
-		assertNotNull(titleLabel);
-		assertEquals(MESSAGE_1, titleLabel.getText());
-
-		Label secondaryLabel = StatusDialogUtil.getSingleStatusLabel();
-		assertNotNull(secondaryLabel);
-		assertEquals(THROWABLE, secondaryLabel.getText());
-	}
-
-	/**
-	 * Simple status with exception without message
-	 */
-	public void testWithStatusAdapter4() {
-		wsdm.addStatusAdapter(createStatusAdapter(MESSAGE_1, NPE), false);
-
-		Label titleLabel = StatusDialogUtil.getTitleLabel();
-		assertNotNull(titleLabel);
-		assertEquals(MESSAGE_1, titleLabel.getText());
-
-		Label secondaryLabel = StatusDialogUtil.getSingleStatusLabel();
-		assertNotNull(secondaryLabel);
-		assertEquals(NPE_NAME, secondaryLabel.getText());
-	}
-
-	/**
-	 * Simple status from job
-	 */
-	public void testWithStatusAdapter5() {
-		String message = "testmessage";
-		StatusAdapter statusAdapter = new StatusAdapter(new Status(
-				IStatus.ERROR, "testplugin", message));
-		Job job = new Job("job") {
-			protected IStatus run(IProgressMonitor monitor) {
-				return null;
-			}
-		};
-		statusAdapter.addAdapter(Job.class, job);
-		wsdm.addStatusAdapter(statusAdapter, false);
-		Label titleLabel = StatusDialogUtil.getTitleLabel();
-		assertNotNull(titleLabel);
-		assertEquals(titleLabel.getText(), NLS.bind(
-				WorkbenchMessages.WorkbenchStatusDialog_ProblemOccurredInJob,
-				job.getName()));
-		Label secondaryLabel = StatusDialogUtil.getSingleStatusLabel();
-		assertNotNull(secondaryLabel);
-		assertEquals(secondaryLabel.getText(), message);
-	}
-
-	/**
-	 * Simple status from job with action
-	 */
-	public void testWithStatusAdapter6() {
-		wsdm.addStatusAdapter(createStatusAdapter(MESSAGE_1, JOB_NAME,
-				ACTION_NAME), false);
-
-		Label titleLabel = StatusDialogUtil.getTitleLabel();
-		assertNotNull(titleLabel);
-		assertEquals(NLS.bind(
-				WorkbenchMessages.WorkbenchStatusDialog_ProblemOccurredInJob,
-				JOB_NAME), titleLabel.getText());
-
-		Label secondaryLabel = StatusDialogUtil.getSingleStatusLabel();
-		assertNotNull(secondaryLabel);
-		assertEquals(MESSAGE_1, secondaryLabel.getText());
-
-		// check visible action button
-		Button actionButton = StatusDialogUtil.getActionButton();
-		assertNotNull(actionButton);
-		assertTrue(actionButton.isVisible());
-
-		Object layoutData = actionButton.getLayoutData();
-		assertTrue(layoutData instanceof GridData);
-		assertFalse(((GridData) layoutData).exclude);
-		assertEquals(ACTION_NAME, actionButton.getText());
-
-		// be sure that support button is not created
-		ToolItem supportItem = StatusDialogUtil.getSupportToolItem();
-		assertNull(supportItem);
-	}
-
-	/**
-	 * Tests if status dialog passes status adapter to the support provider
-	 * tests if status dialog extends its height & width
-	 */
-	public void testSupport1() {
-		StatusAdapter statusAdapter = createStatusAdapter(MESSAGE_1);
-		final StatusAdapter[] passed = new StatusAdapter[] { null };
-		Composite[] support = new Composite[] { null };
-		setupSupportArea(passed, support);
-		wsdm.addStatusAdapter(statusAdapter, false);
-		openSupportArea(statusAdapter, passed);
-	}
-	
-	/**
-	 * Tests if support area appears by default if appropriate flag is set up.
-	 */
-	public void testSupport2(){
-		StatusAdapter statusAdapter = createStatusAdapter(MESSAGE_1);
-		wsdm.setShowSupport(true);
-		final StatusAdapter[] passed = new StatusAdapter[] { null };
-		Composite[] support = new Composite[] { null };
-		setupSupportArea(passed, support);
-		wsdm.addStatusAdapter(statusAdapter, false);
-		assertEquals(statusAdapter, passed[0]);
-	}
-
-	/**
-	 * Tests if details can be closed and opened 2 times tests if correct status
-	 * adapter is passed to details
-	 */
-	public void testDetails1() {
-		StatusAdapter statusAdapter = createStatusAdapter(MESSAGE_1);
-		final StatusAdapter[] passed = new StatusAdapter[] { null };
-		final Composite[] details = new Composite[] { null };
-		setupDetails(passed, details);
-		wsdm.addStatusAdapter(statusAdapter, false);
-		for (int i = 0; i < 2; i++) {
-			passed[0] = null;
-			Point sizeBefore = StatusDialogUtil.getStatusShell().getSize();
-			Button detailsButton = StatusDialogUtil.getDetailsButton();
-			assertNotNull(detailsButton);
-			assertTrue(detailsButton.isEnabled());
-			assertEquals(IDialogConstants.SHOW_DETAILS_LABEL, detailsButton
-					.getText());
-
-			selectWidget(detailsButton);
-
-			Point sizeAfter = StatusDialogUtil.getStatusShell().getSize();
-			assertEquals(statusAdapter, passed[0]);
-			assertTrue(sizeAfter.y > sizeBefore.y);
-			assertEquals(IDialogConstants.HIDE_DETAILS_LABEL, detailsButton
-					.getText());
-			assertNotNull(details[0]);
-			assertFalse(details[0].isDisposed());
-
-			selectWidget(detailsButton);
-
-			Point sizeAfterAfter = StatusDialogUtil.getStatusShell().getSize();
-			assertTrue(sizeAfterAfter.y < sizeAfter.y);
-			assertEquals(IDialogConstants.SHOW_DETAILS_LABEL, detailsButton
-					.getText());
-			assertTrue(details[0].isDisposed());
-		}
-	}
-	
-	public void testNullLabelProvider(){
-		try {
-			wsdm.setStatusListLabelProvider(null);
-			fail();
-		} catch (IllegalArgumentException iae){
-			assertTrue(true);
-		}
-	}
-	
-	//bug 235254
-	public void testNonNullLabelProvider(){
-		try {
-			final boolean [] called = new boolean[]{false};
-			wsdm.setStatusListLabelProvider(new ITableLabelProvider(){
-
-				public Image getColumnImage(Object element, int columnIndex) {
-					return null;
-				}
-
-				public String getColumnText(Object element, int columnIndex) {
-					called[0] = true;
-					return "";
-				}
-
-				public void addListener(ILabelProviderListener listener) {
-					
-				}
-
-				public void dispose() {
-					
-				}
-
-				public boolean isLabelProperty(Object element, String property) {
-					return false;
-				}
-
-				public void removeListener(ILabelProviderListener listener) {
-					
-				}
-				
-			});
-			wsdm.addStatusAdapter(createStatusAdapter(MESSAGE_1), true);
-			assertTrue(called[0]);
-		} catch (Exception e){
-			fail();
-		}
-	}
-
-	/**
-	 * Verifies that correct status adapter is passed to the support area
-	 */
-	public void testList1() {
-		StatusAdapter statusAdapter1 = createStatusAdapter(MESSAGE_1);
-		StatusAdapter statusAdapter2 = createStatusAdapter(MESSAGE_2);
-
-		StatusAdapter[] passed = new StatusAdapter[] { null };
-		Composite[] support = new Composite[] { null };
-		setupSupportArea(passed, support);
-
-		wsdm.addStatusAdapter(statusAdapter1, false);
-		wsdm.addStatusAdapter(statusAdapter2, false);
-
-		Table table = StatusDialogUtil.getTable();
-		assertNotNull(table);
-		assertEquals(0, table.getSelectionIndex());
-		assertEquals(MESSAGE_1, table.getItem(0).getText());
-		assertEquals(MESSAGE_2, table.getItem(1).getText());
-
-		// this verifies if support is opened for correct statusAdapter
-		openSupportArea(statusAdapter1, passed);
-		selectTable(table, 1);
-		assertEquals(statusAdapter2, passed[0]);
-	}
-
-	/**
-	 * Verifies that correct status adapter is passed to details
-	 */
-	public void testList2() {
-		StatusAdapter statusAdapter1 = createStatusAdapter(MESSAGE_1);
-		StatusAdapter statusAdapter2 = createStatusAdapter(MESSAGE_2);
-
-		Composite[] details = new Composite[] { null };
-		StatusAdapter[] passed = new StatusAdapter[] { null };
-		setupDetails(passed, details);
-
-		wsdm.addStatusAdapter(statusAdapter1, false);
-		wsdm.addStatusAdapter(statusAdapter2, false);
-
-		selectWidget(StatusDialogUtil.getDetailsButton());
-		assertNotNull(details[0]);
-		assertFalse(details[0].isDisposed());
-		assertEquals(statusAdapter1, passed[0]);
-
-		Table table = StatusDialogUtil.getTable();
-		selectTable(table, 1);
-
-		assertNotNull(details[0]);
-		assertFalse(details[0].isDisposed());
-		assertEquals(statusAdapter2, passed[0]);
-	}
-
-	/**
-	 * Tests secondary message and the list element for normal and job status
-	 * adapter
-	 */
-	public void testList3() {
-		StatusAdapter sa1 = createStatusAdapter(MESSAGE_1);
-		StatusAdapter sa2 = createStatusAdapter(MESSAGE_2, JOB_NAME,
-				ACTION_NAME);
-
-		wsdm.addStatusAdapter(sa1, false);
-		wsdm.addStatusAdapter(sa2, false);
-
-		Table table = StatusDialogUtil.getTable();
-		Label titleLabel = StatusDialogUtil.getTitleLabel();
-
-		assertEquals(WorkbenchMessages.WorkbenchStatusDialog_SeeDetails,
-				titleLabel.getText());
-		assertEquals(MESSAGE_1, table.getItem(0).getText());
-
-		selectTable(table, 1);
-
-		assertEquals(MESSAGE_2, titleLabel.getText());
-		assertEquals(JOB_NAME, table.getItem(1).getText());
-	}
-
-	/**
-	 * Delivers custom support area.
-	 * 
-	 * @param passed -
-	 *            status adapter passed to the support will be set as first
-	 *            element of this array.
-	 * @param support -
-	 *            a main support composite will be set as first element of this
-	 *            array.
-	 */
-	private void setupSupportArea(final StatusAdapter[] passed,
-			final Composite[] support) {
-		Policy.setErrorSupportProvider(new AbstractStatusAreaProvider() {
-			public Control createSupportArea(Composite parent,
-					StatusAdapter statusAdapter) {
-				passed[0] = statusAdapter;
-				Composite c = new Composite(parent, SWT.NONE);
-				GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true,
-						true);
-				layoutData.minimumHeight = 400;
-				c.setLayoutData(layoutData);
-				support[0] = c;
-				return c;
-			}
-		});
-	}
-
-	/**
-	 * Opens support area.
-	 * 
-	 * @param statusAdapter -
-	 *            a statusAdapter (for verification that support area uses
-	 *            correct one)
-	 * @param passed -
-	 *            a statusAdapter used by support area will be set as first
-	 *            element of this array.
-	 */
-	private void openSupportArea(StatusAdapter statusAdapter,
-			final StatusAdapter[] passed) {
-		Point sizeBefore = StatusDialogUtil.getStatusShell().getSize();
-		// be sure that support button is enabled
-		ToolItem supportItem = StatusDialogUtil.getSupportToolItem();
-		assertNotNull(supportItem);
-		assertTrue(supportItem.isEnabled());
-
-		selectWidget(supportItem);
-		Point sizeAfter = StatusDialogUtil.getStatusShell().getSize();
-		assertEquals(statusAdapter, passed[0]);
-		assertTrue(sizeAfter.x > sizeBefore.x);
-		assertTrue(sizeAfter.y > sizeBefore.y);
-	}
-
-	/**
-	 * This method creates custom details area.
-	 * 
-	 * @param passed -
-	 *            status adapter passed to the details will be set as first
-	 *            element of this array.
-	 * @param details -
-	 *            a main details composite will be set as first element of this
-	 *            array.
-	 */
-	private void setupDetails(final StatusAdapter[] passed,
-			final Composite[] details) {
-		wsdm.setDetailsAreaProvider(new AbstractStatusAreaProvider() {
-			public Control createSupportArea(Composite parent,
-					StatusAdapter statusAdapter) {
-				passed[0] = statusAdapter;
-				Composite c = new Composite(parent, SWT.NONE);
-				GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true,
-						true);
-				layoutData.minimumHeight = 400;
-				c.setLayoutData(layoutData);
-				details[0] = c;
-				return c;
-			}
-		});
-	}
-
-	/**
-	 * This method simulates mouse selection on Table (selects TableItem).
-	 * 
-	 * @param table
-	 *            a Table to be selected.
-	 * @param i
-	 *            a number of tableItem to be selected.
-	 */
-	private void selectTable(Table table, int i) {
-		table.setSelection(i);
-		Event event = new Event();
-		event.item = table.getItem(i);
-		table.notifyListeners(SWT.Selection, event);
-	}
-
-	/**
-	 * This method simulates mouse selection on particular Control.
-	 * 
-	 * @param control
-	 *            a Control to be selected.
-	 */
-	private void selectWidget(Widget control) {
-		Event event = new Event();
-		event.item = control;
-		control.notifyListeners(SWT.Selection, event);
-	}
-
-	/**
-	 * Creates StatusAdapter from passed parameters.
-	 * 
-	 * @param message
-	 *            a message to be used in StatusAdapter
-	 * @return created StatusAdapter
-	 */
-	private StatusAdapter createStatusAdapter(String message) {
-		return new StatusAdapter(new Status(IStatus.ERROR,
-				"org.eclipse.ui.tests", message));
-	}
-
-	/**
-	 * Creates StatusAdapter from passed parameters.
-	 * 
-	 * @param message
-	 *            a message to be used in StatusAdapter
-	 * @param throwable
-	 *            a Throwable to be used in StatusAdapter
-	 * @return created StatusAdapter
-	 */
-	private StatusAdapter createStatusAdapter(String message,
-			Throwable throwable) {
-		return new StatusAdapter(new Status(IStatus.ERROR,
-				"org.eclipse.ui.tests", message, throwable));
-	}
-
-	/**
-	 * Creates StatusAdapter from passed parameters. StatusAdapter will look
-	 * like it is coming from job.
-	 * 
-	 * @param message
-	 *            a message to be used in StatusAdapter
-	 * @param jobname
-	 *            a String that will be used as job name
-	 * @param actionName
-	 *            a String that will be used as a name of the action available
-	 *            to the user
-	 * @return created StatusAdapter
-	 */
-	private StatusAdapter createStatusAdapter(String message, String jobname,
-			String actionName) {
-		StatusAdapter sa = createStatusAdapter(message);
-		if (jobname == null) {
-			return sa;
-		}
-		Job job = new Job(jobname) {
-			protected IStatus run(IProgressMonitor monitor) {
-				return null;
-			}
-		};
-		sa.addAdapter(Job.class, job);
-		if (actionName == null) {
-			return sa;
-		}
-		Action action = new Action(actionName) {
-		};
-		job.setProperty(IProgressConstants.ACTION_PROPERTY, action);
-		return sa;
-	}
-
-	/**
-	 * Creates StatusAdapter from passed parameters.
-	 * 
-	 * @param message
-	 *            a message to be used in StatusAdapter
-	 * @param title
-	 *            a String to be passed as StatusAdapter title
-	 * @return status adapter with title and message
-	 */
-	private StatusAdapter createStatusAdapter(String message, String title) {
-		StatusAdapter sa = createStatusAdapter(message);
-		sa.setProperty(IStatusAdapterConstants.TITLE_PROPERTY, title);
-		return sa;
-	}
-
-	protected void tearDown() throws Exception {
-		wsdm = null;
-		Shell shell = StatusDialogUtil.getStatusShell();
-		if (shell != null) {
-			shell.dispose();
-		}
-		ErrorDialog.AUTOMATED_MODE = automatedMode;
-		Policy.setErrorSupportProvider(null);
-		super.tearDown();
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusDialogUtil.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusDialogUtil.java
deleted file mode 100644
index 98c47ac..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusDialogUtil.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.statushandlers;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * This class parses the structure of the Shell and finds necessary widgets.
- * 
- * @since 3.4
- * 
- */
-public class StatusDialogUtil {
-
-	public static Label getTitleImageLabel() {
-		Composite c = getTitleAreaComposite();
-		if (c != null & !c.isDisposed()) {
-			return (Label) c.getChildren()[0];
-		}
-		return null;
-	}
-	
-	public static Label getTitleLabel(){
-		Composite c = getTitleAreaComposite();
-		if (c == null || c.isDisposed()) {
-			return null;
-		}
-		return (Label) c.getChildren()[1];
-	}
-	
-	public static Label getSingleStatusLabel(){
-		Composite c = getTitleAreaComposite();
-		if (c == null || c.isDisposed() || c.getChildren().length < 3){
-			return null;
-		}
-		Composite d = (Composite) c.getChildren()[2];
-		return (Label) d.getChildren()[0];
-	}
-	
-	public static Shell getStatusShell(){
-		Shell[] shells = Display.getDefault().getShells();
-		for (int i = 0; i < shells.length; i++) {
-			if (shells[i].getText().equals("Problem Occurred")
-					|| shells[i].getText().equals(
-							"Multiple problems have occurred")) {
-				if (!shells[i].isDisposed()) {
-					return shells[i];
-				}
-			}
-		}
-		return null;
-	}
-
-	private static Composite getTitleAreaComposite(){
-		Shell shell = getStatusShell();
-		if(shell == null || shell.isDisposed()){
-			return null;
-		}
-		Control controls[] = shell.getChildren();
-		return (Composite)((Composite)controls[0]).getChildren()[0];
-	}
-	
-	private static Composite getListAreaComposite(){
-		Shell shell = getStatusShell();
-		if(shell == null || shell.isDisposed()){
-			return null;
-		}
-		Control controls[] = shell.getChildren();
-		return (Composite)((Composite)controls[0]).getChildren()[1];
-	}
-	
-	private static Composite getButtonBar(){
-		Shell shell = getStatusShell();
-		if(shell == null || shell.isDisposed()){
-			return null;
-		}
-		Control controls[] = shell.getChildren();
-		return (Composite)((Composite)controls[0]).getChildren()[2];
-	}
-	
-	public static ToolItem getSupportToolItem(){
-		Composite c = getButtonBar();
-		if(c == null || c.isDisposed()){
-			return null;
-		}
-		ToolBar toolbar = (ToolBar) c.getChildren()[0];
-		if (toolbar.getItemCount() == 0){
-			return null;
-		}
-		return toolbar.getItem(0);
-	}
-	
-	public static Button getActionButton(){
-		Composite c = getButtonBar();
-		if(c == null || c.isDisposed()){
-			return null;
-		}
-		return (Button) c.getChildren()[1];
-	}
-	
-	public static Button getOkButton(){
-		Composite c = getButtonBar();
-		if(c == null || c.isDisposed()){
-			return null;
-		}
-		// Mac renders Ok button as the last one
-		if(Platform.getOS().equals("macosx")){
-			return (Button) c.getChildren()[3];
-		}
-		return (Button) c.getChildren()[2];
-	}
-	
-	public static Button getDetailsButton(){
-		Composite c = getButtonBar();
-		if(c == null || c.isDisposed()){
-			return null;
-		}
-		// Mac renders Ok button as the last one
-		if(Platform.getOS().equals("macosx")){
-			return (Button) c.getChildren()[2];
-		}
-		return (Button) c.getChildren()[3];
-	}
-	
-	public static Table getTable(){
-		Composite c = getListAreaComposite();
-		if(c.getChildren().length == 0){
-			return null;
-		}
-		return (Table) c.getChildren()[0];
-	}
-	
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusHandlerConfigurationSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusHandlerConfigurationSuite.java
deleted file mode 100644
index e5ef0db..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusHandlerConfigurationSuite.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.statushandlers;
-
-import org.eclipse.core.tests.session.Setup;
-import org.eclipse.core.tests.session.SetupManager.SetupException;
-import org.eclipse.ui.tests.session.WorkbenchSessionTest;
-
-/**
- * @since 3.5
- *
- */
-public class StatusHandlerConfigurationSuite extends WorkbenchSessionTest {
-
-	public StatusHandlerConfigurationSuite(String dataLocation) {
-		super(dataLocation);
-		System.out.println("initalization1");
-	}
-	
-	public StatusHandlerConfigurationSuite(String dataLocation, Class clazz){
-		super(dataLocation, clazz);
-		System.out.println("initalization2");
-	}
-
-	protected Setup newSetup() throws SetupException {
-		Setup base = super.newSetup();
-		System.out.println(base);
-		base.setEclipseArgument("statushandler",
-				"org.eclipse.ui.tests.statushandlers.FreeStatusHandler");
-		System.out.println(base);
-		return base;
-	}
-	
-	
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusHandlingConfigurationTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusHandlingConfigurationTest.java
deleted file mode 100644
index 8dc22f3..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusHandlingConfigurationTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.statushandlers;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.statushandlers.AbstractStatusHandler;
-import org.eclipse.ui.statushandlers.StatusAdapter;
-import org.eclipse.ui.statushandlers.StatusManager;
-
-import junit.framework.TestCase;
-
-/**
- * @since 3.5
- *
- */
-public class StatusHandlingConfigurationTest extends TestCase {
-	public void testFreeStatusHandler(){
-		final StatusAdapter adapter = new StatusAdapter(new Status(IStatus.ERROR,"fakeplugin","testmessage"));
-		final boolean[] called = new boolean[]{false};
-		AbstractStatusHandler tester = new AbstractStatusHandler(){
-			public void handle(StatusAdapter statusAdapter, int style) {
-				if(statusAdapter == adapter){
-					called[0] = true;
-				}
-			}
-		};
-		FreeStatusHandler.setTester(tester);
-		StatusManager.getManager().handle(adapter);
-		assertEquals(true, called[0]);
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusHandlingTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusHandlingTestSuite.java
deleted file mode 100644
index 511ca96..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/StatusHandlingTestSuite.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.statushandlers;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Tests the status handling facility
- * 
- * @since 3.3
- */
-public class StatusHandlingTestSuite extends TestSuite {
-
-	public StatusHandlingTestSuite() {
-		addTest(new TestSuite(WizardsStatusHandlingTestCase.class));
-		addTest(new TestSuite(StatusDialogManagerTest.class));
-	}
-
-	public static Test suite() {
-		return new StatusHandlingTestSuite();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/TestStatusHandler.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/TestStatusHandler.java
deleted file mode 100644
index 8b70996..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/TestStatusHandler.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.ui.tests.statushandlers;
-
-import org.eclipse.ui.internal.WorkbenchErrorHandlerProxy;
-import org.eclipse.ui.statushandlers.AbstractStatusHandler;
-import org.eclipse.ui.statushandlers.StatusAdapter;
-
-/**
- * The handler should be used during tests. It allows for checking the status
- * and style used during last handling.
- * 
- * @since 3.3
- */
-public class TestStatusHandler extends AbstractStatusHandler {
-
-	private static StatusAdapter lastHandledStatusAdapter;
-
-	private static int lastHandledStyle;
-
-	private static AbstractStatusHandler workbenchHandler;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.statushandlers.AbstractStatusHandler#handle(org.eclipse.ui.statushandlers.StatusAdapter,
-	 *      int)
-	 */
-	public void handle(StatusAdapter statusAdapter, int style) {
-		lastHandledStatusAdapter = statusAdapter;
-		lastHandledStyle = style;
-
-		if (workbenchHandler == null) {
-			workbenchHandler = new WorkbenchErrorHandlerProxy();
-		}
-
-		// Forward to the workbench handler
-		workbenchHandler.handle(statusAdapter, style);
-	}
-
-	/**
-	 * Returns the status used during last handling
-	 * 
-	 * @return the status
-	 */
-	public static StatusAdapter getLastHandledStatusAdapter() {
-		return lastHandledStatusAdapter;
-	}
-
-	/**
-	 * Returns the style used during last handling
-	 * 
-	 * @return the style
-	 */
-	public static int getLastHandledStyle() {
-		return lastHandledStyle;
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/WizardsStatusHandlingTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/WizardsStatusHandlingTestCase.java
deleted file mode 100644
index a2728d1..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/statushandlers/WizardsStatusHandlingTestCase.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.statushandlers;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.internal.registry.RegistryMessages;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.WorkbenchMessages;
-import org.eclipse.ui.internal.dialogs.ExportWizard;
-import org.eclipse.ui.statushandlers.StatusAdapter;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.tests.harness.util.DialogCheck;
-
-/**
- * Tests whether the errors in wizards are handled properly
- * 
- * @since 3.3
- */
-public class WizardsStatusHandlingTestCase extends TestCase {
-
-	private static int SEVERITY = IStatus.ERROR;
-
-	private static Class EXCEPTION_CLASS = CoreException.class;
-
-	private static String MESSAGE = WorkbenchMessages.WorkbenchWizard_errorMessage;
-
-	private static String EXCEPTION_MESSAGE = NLS
-			.bind(
-					RegistryMessages.plugin_instantiateClassError,
-					new Object[] { "org.eclipse.ui.tests",
-							"org.eclipse.ui.tests.statushandlers.FaultyExportWizard" });
-
-	private static String EXCEPTION_MESSAGE2 = NLS
-			.bind(
-					RegistryMessages.plugin_loadClassError,
-					new Object[] { "org.eclipse.ui.tests",
-							"org.eclipse.ui.tests.statushandlers.FaultyExportWizard" });
-
-	private static String PLUGIN_ID = "org.eclipse.ui.tests";
-
-	private static String FAULTY_WIZARD_NAME = "FaultyExportWizard";
-
-	public WizardsStatusHandlingTestCase(String name) {
-		super(name);
-	}
-
-	private Shell getShell() {
-		return DialogCheck.getShell();
-	}
-
-	private IWorkbench getWorkbench() {
-		return PlatformUI.getWorkbench();
-	}
-
-	class CustomWizardDialog extends WizardDialog {
-		public CustomWizardDialog(Shell shell, IWizard wizard) {
-			super(shell, wizard);
-		}
-
-		public void nextPressed2() {
-			super.nextPressed();
-		}
-	}
-
-	private CustomWizardDialog exportWizard() {
-		ExportWizard wizard = new ExportWizard();
-		wizard.init(getWorkbench(), null);
-		CustomWizardDialog dialog = new CustomWizardDialog(getShell(), wizard);
-		dialog.create();
-		return dialog;
-	}
-
-	public void testWizardWithNoDefaultContructor() {
-		final CustomWizardDialog dialog = exportWizard();
-		dialog.setBlockOnOpen(false);
-		dialog.open();
-
-		// selecting FaultyExportWizard
-		IWizardPage currenPage = dialog.getCurrentPage();
-		Composite control = (Composite) currenPage.getControl();
-		Control[] widgets = control.getChildren();
-
-		Table table = (Table) widgets[1];
-
-		for (int i = 0; i < table.getItemCount(); i++) {
-			if (table.getItem(i).getText().equals(FAULTY_WIZARD_NAME)) {
-				table.select(i);
-				table.notifyListeners(SWT.Selection, new Event());
-				break;
-			}
-		}
-
-		// pressing "Next"
-		dialog.nextPressed2();
-		assertStatusAdapter(TestStatusHandler.getLastHandledStatusAdapter());
-		assertEquals(TestStatusHandler.getLastHandledStyle(),
-				StatusManager.SHOW);
-	}
-
-	/**
-	 * Checks whether the last handled status is correct
-	 */
-	private void assertStatusAdapter(StatusAdapter statusAdapter) {
-		IStatus status = statusAdapter.getStatus();
-		assertEquals(SEVERITY, status.getSeverity());
-		assertEquals(PLUGIN_ID, status.getPlugin());
-		assertEquals(MESSAGE, status.getMessage());
-		assertEquals(EXCEPTION_CLASS, status.getException().getClass());
-		assertTrue(createIncorrectExceptionMessage(status.getException()
-				.getMessage()), EXCEPTION_MESSAGE.equals(status.getException()
-				.getMessage())
-				|| EXCEPTION_MESSAGE2
-						.equals(status.getException().getMessage()));
-	}
-
-	private String createIncorrectExceptionMessage(String exceptionMessage) {
-		return "expected:<" + EXCEPTION_MESSAGE + "> or <" + EXCEPTION_MESSAGE2
-				+ "> but was:<" + exceptionMessage + ">";
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/stress/OpenCloseTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/stress/OpenCloseTest.java
deleted file mode 100644
index 53af6e2..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/stress/OpenCloseTest.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.stress;
-
-import java.util.HashMap;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.NotEnabledException;
-import org.eclipse.core.commands.NotHandledException;
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.intro.IIntroPart;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-/**
- * Test opening and closing of items.
- */
-public class OpenCloseTest extends UITestCase {
-    /**
-	 * 
-	 */
-	private static final String ORG_ECLIPSE_JDT_UI_JAVA_PERSPECTIVE = "org.eclipse.jdt.ui.JavaPerspective";
-
-	private static int index;
-
-    private static final int numIterations = 10;
-
-    private WorkbenchWindow workbenchWindow;
-
-    /**
-     * Constructor.
-     * 
-     * @param testName
-     *            Test's name.
-     */
-    public OpenCloseTest(String testName) {
-        super(testName);
-        workbenchWindow = (WorkbenchWindow) PlatformUI.getWorkbench()
-                .getActiveWorkbenchWindow();
-    }
-
-    /**
-     * Test the opening and closing of a file.
-     *  
-     */
-    public void testOpenCloseFile() {
-        IWorkbenchPage page = workbenchWindow.getActivePage();
-        try {
-            FileUtil.createProject("TestProject");
-            IProject testProject = ResourcesPlugin.getWorkspace().getRoot()
-                    .getProject("TestProject"); //$NON-NLS-1$
-            FileUtil.createFile("tempFile.txt", testProject);
-            testProject.open(null);
-            IEditorInput editorInput = new FileEditorInput(testProject
-                    .getFile("tempFile.txt"));
-            IEditorPart editorPart = null;
-            for (index = 0; index < numIterations; index++) {
-                editorPart = page.openEditor(editorInput,
-                        "org.eclipse.ui.DefaultTextEditor"); //$NON-NLS-1$
-                page.closeEditor(editorPart, false);
-            }
-            FileUtil.deleteProject(testProject);
-        } catch (Exception e) {
-            e.printStackTrace(System.err);
-        }
-    }
-
-    /**
-     * Test opening and closing of workbench window.
-     *  
-     */
-    public void testOpenCloseWorkbenchWindow() {
-        IWorkbenchWindow secondWorkbenchWindow = null;
-        try {
-            for (index = 0; index < numIterations; index++) {
-                secondWorkbenchWindow = PlatformUI.getWorkbench()
-                        .openWorkbenchWindow(getPageInput());
-                secondWorkbenchWindow.close();
-            }
-        } catch (WorkbenchException e) {
-            e.printStackTrace(System.err);
-        }
-    }
-
-    /**
-     * Test open and close of perspective.
-     *  
-     */
-    public void testOpenClosePerspective() {
-		ICommandService commandService = (ICommandService) fWorkbench.getService(ICommandService.class);
-		Command command = commandService.getCommand("org.eclipse.ui.window.closePerspective");
-		
-		HashMap parameters = new HashMap();
-		parameters.put("org.eclipse.ui.window.closePerspective.perspectiveId",
-				ORG_ECLIPSE_JDT_UI_JAVA_PERSPECTIVE);
-		
-		ParameterizedCommand pCommand = ParameterizedCommand.generateCommand(command, parameters);
-		
-		IHandlerService handlerService = (IHandlerService) workbenchWindow
-				.getService(IHandlerService.class);
-                
-        for (index = 0; index < numIterations; index++) {
-            try {
-                PlatformUI.getWorkbench().showPerspective(
-                        ORG_ECLIPSE_JDT_UI_JAVA_PERSPECTIVE, workbenchWindow);
-        		try {
-        			handlerService.executeCommand(pCommand, null);
-        		} catch (ExecutionException e1) {
-        		} catch (NotDefinedException e1) {
-        		} catch (NotEnabledException e1) {
-        		} catch (NotHandledException e1) {
-        		}
-            } catch (WorkbenchException e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    /**
-     * Test open and close of view.
-     *  
-     */
-    public void testOpenCloseView() {
-        IViewPart consoleView = null;
-        try {
-            IWorkbenchPage page = PlatformUI.getWorkbench().showPerspective(
-                    ORG_ECLIPSE_JDT_UI_JAVA_PERSPECTIVE, workbenchWindow);
-            for (index = 0; index < numIterations; index++) {
-                consoleView = page
-                        .showView("org.eclipse.ui.views.ResourceNavigator");
-                page.hideView(consoleView);
-            }
-        } catch (WorkbenchException e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Test open and close intro.
-     *  
-     */
-    public void testOpenCloseIntro() {
-        IIntroPart introPart = null;
-        for (index = 0; index < numIterations; index++) {
-            introPart = PlatformUI.getWorkbench().getIntroManager().showIntro(
-                    workbenchWindow, false);
-            PlatformUI.getWorkbench().getIntroManager().closeIntro(introPart);
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/stress/OpenCloseTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/stress/OpenCloseTestSuite.java
deleted file mode 100644
index bb0848d..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/stress/OpenCloseTestSuite.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.stress;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Test all areas of the UI API.
- */
-public class OpenCloseTestSuite extends TestSuite {
-
-    /**
-     * Returns the suite.  This is required to
-     * use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new OpenCloseTestSuite();
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public OpenCloseTestSuite() {
-        addTest(new TestSuite(OpenCloseTest.class));
-
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/systeminplaceeditor/OpenSystemInPlaceEditorTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/systeminplaceeditor/OpenSystemInPlaceEditorTest.java
deleted file mode 100644
index 6283762..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/systeminplaceeditor/OpenSystemInPlaceEditorTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.ui.tests.systeminplaceeditor;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.InputStream;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.filesystem.EFS;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-
-/**
- * Tests opening the
- * <code>org.eclipse.ui.internal.editorsupport.win32.OleEditor<code>.
- * <p>
- * <strong>Note:</strong> The tests pass on all platforms but
- * only perform for real when a system in-place editor is
- * available for *.doc.
- * </p>
- * 
- * @since 3.4
- */
-public class OpenSystemInPlaceEditorTest extends UITestCase {
-
-	
-	public static Test suite() {
-		return new TestSuite(OpenSystemInPlaceEditorTest.class);
-	}
-
-
-	/**
-	 * Creates the test object.
-	 * 
-	 * @param testName the test name
-	 */
-	public OpenSystemInPlaceEditorTest(String testName) {
-		super(testName);
-	}
-
-	public void testWorkspaceFile() throws Exception {
-		if (!PlatformUI.getWorkbench().getEditorRegistry().isSystemInPlaceEditorAvailable("test.doc"))
-			return;
-
-		// Custom setup
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("test" + System.currentTimeMillis());
-		project.create(null);
-		project.open(null);
-		IFile file = project.getFile("test.doc");
-		InputStream s = new ByteArrayInputStream("some test content".getBytes());
-		file.create(s, false, null);
-
-		IWorkbenchPage page = getWorkbenchPage();
-		IEditorPart editor = IDE.openEditor(page, file);
-
-		assertEquals(IEditorRegistry.SYSTEM_INPLACE_EDITOR_ID, editor.getEditorSite().getId());
-
-		// Custom tear down
-		page.closeEditor(editor, false);
-		file.delete(false, null);
-		project.delete(false, null);
-	}
-
-	public void testExternalFile() throws Exception {
-		if (!PlatformUI.getWorkbench().getEditorRegistry().isSystemInPlaceEditorAvailable("test.doc"))
-			return;
-		
-		// Custom setup
-		File file = File.createTempFile("test", ".doc");
-
-		IWorkbenchPage page = getWorkbenchPage();
-		IEditorPart editor = IDE.openEditorOnFileStore(page, EFS.getStore(file.toURI()));
-
-		assertEquals(IEditorRegistry.SYSTEM_INPLACE_EDITOR_ID, editor.getEditorSite().getId());
-		assertFalse("is not error editor", "org.eclipse.ui.internal.ErrorEditorPart".equals(editor.getClass().getName()));
-
-		// Custom tear down
-		page.closeEditor(editor, false);
-		file.delete();
-	}
-
-	private IWorkbenchPage getWorkbenchPage() {
-		IWorkbenchWindow window;
-		try {
-			if (getWorkbench().getWorkbenchWindowCount() == 0)
-				window = getWorkbench().openWorkbenchWindow(null);
-			else
-				window = getWorkbench().getWorkbenchWindows()[0];
-
-			IWorkbenchPage[] pages = window.getPages();
-			if (pages.length > 0)
-				return pages[0];
-
-			return window.openPage(null);
-		} catch (WorkbenchException ex) {
-			fail();
-			return null;
-		}
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/JFaceThemeTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/JFaceThemeTest.java
deleted file mode 100644
index 770b930..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/JFaceThemeTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.themes;
-
-import java.util.Iterator;
-
-import org.eclipse.jface.resource.ColorDescriptor;
-import org.eclipse.jface.resource.ColorRegistry;
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.ui.themes.ITheme;
-import org.eclipse.ui.themes.IThemeManager;
-
-/**
- * Tests the pushing down of current theme changes into JFace.
- * 
- * @since 3.0
- */
-public class JFaceThemeTest extends ThemeTest {
-
-    public JFaceThemeTest(String testName) {
-        super(testName);
-    }
-
-    private void setAndTest(String themeId, IPropertyChangeListener listener) {
-        JFaceResources.getFontRegistry().addListener(listener);
-        JFaceResources.getColorRegistry().addListener(listener);
-        fManager.setCurrentTheme(themeId);
-        ITheme theme = fManager.getTheme(themeId);
-        assertEquals(theme, fManager.getCurrentTheme());
-        {
-            FontRegistry jfaceFonts = JFaceResources.getFontRegistry();
-            FontRegistry themeFonts = theme.getFontRegistry();
-            // don't test for equality - other tests (or clients) may be pushing 
-            // new items into jface
-            assertTrue(jfaceFonts.getKeySet().containsAll(
-                    themeFonts.getKeySet()));
-            for (Iterator i = themeFonts.getKeySet().iterator(); i.hasNext();) {
-                String key = (String) i.next();
-                assertArrayEquals(themeFonts.getFontData(key), jfaceFonts
-                        .getFontData(key));
-            }
-        }
-        {
-            ColorRegistry jfaceColors = JFaceResources.getColorRegistry();
-            ColorRegistry themeColors = theme.getColorRegistry();
-            assertTrue(jfaceColors.getKeySet().containsAll(
-                    themeColors.getKeySet()));
-            for (Iterator i = themeColors.getKeySet().iterator(); i.hasNext();) {
-                String key = (String) i.next();
-                assertEquals(themeColors.getRGB(key), jfaceColors.getRGB(key));
-            }
-        }
-        JFaceResources.getFontRegistry().removeListener(listener);
-        JFaceResources.getColorRegistry().removeListener(listener);
-    }
-
-    /**
-     * TODO: detailed checking of the events
-     */
-    public void testPushdown() {
-        ThemePropertyListener listener = new ThemePropertyListener();
-        setAndTest(THEME1, listener);
-        // ten changes, not the apparent 6 - remember the changes for the defaulted elements
-        assertEquals(10, listener.getEvents().size());
-        listener.getEvents().clear();
-        setAndTest(IThemeManager.DEFAULT_THEME, listener);
-        assertEquals(10, listener.getEvents().size());
-    }
-    
-    /**
-	 * Tests to ensure correct behavior of getColorDescriptor methods.
-	 */
-	public void testDefaultColorDescriptor() {
-		ColorDescriptor desc = getDefaultTheme().getColorRegistry()
-				.getColorDescriptor("somegarbage");
-		assertNotNull(desc);
-		Color color = desc.createColor(getWorkbench().getDisplay());
-		assertNotNull(color);
-		color.dispose();
-
-		desc = getDefaultTheme().getColorRegistry().getColorDescriptor(
-				"somegarbage", null);
-		assertNull(desc);
-
-		desc = getDefaultTheme().getColorRegistry().getColorDescriptor(
-				"somegarbage", ColorDescriptor.createFrom(new RGB(0, 0, 0)));
-		assertNotNull(desc);
-		color = desc.createColor(getWorkbench().getDisplay());
-		assertNotNull(color);
-		color.dispose();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/TestColorFactory.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/TestColorFactory.java
deleted file mode 100644
index 45048fc..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/TestColorFactory.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.themes;
-
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.ui.themes.IColorFactory;
-
-/**
- * @since 3.0
- */
-public class TestColorFactory implements IColorFactory {
-
-    public static final RGB RGB = new RGB(91, 92, 93);
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.themes.IColorFactory#createColor()
-     */
-    public RGB createColor() {
-        return RGB;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/ThemeAPITest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/ThemeAPITest.java
deleted file mode 100644
index a0ceb68..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/ThemeAPITest.java
+++ /dev/null
@@ -1,716 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.themes;
-
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.ColorRegistry;
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.resource.StringConverter;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.internal.themes.ThemeElementHelper;
-import org.eclipse.ui.internal.util.PrefUtil;
-import org.eclipse.ui.themes.ITheme;
-import org.eclipse.ui.themes.IThemeManager;
-
-/**
- * Tests the theme API.
- * 
- * @since 3.0
- */
-public class ThemeAPITest extends ThemeTest {
-
-    /**
-	 * 
-	 */
-	private static final String EXTENDED_THEME3 = "extendedTheme3";
-	/**
-	 * 
-	 */
-	private static final String EXTENDED_THEME2 = "extendedTheme2";
-	/**
-	 * 
-	 */
-	private static final String EXTENDED_THEME1 = "extendedTheme1";
-	/**
-	 * 
-	 */
-	private static final String PLATFORMFONT = "platformfont";
-	/**
-	 * 
-	 */
-	private static final String PLATFORMCOLOR = "platformcolor";
-	/**
-	 * 
-	 */
-	private static final String NOOVERRIDEFONT = "nooverridefont";
-	/**
-	 * 
-	 */
-	private static final String NOVALFONT = "novalfont";
-	/**
-	 * 
-	 */
-	private static final String DEFAULTEDFONT3 = "defaultedfont3";
-	/**
-	 * 
-	 */
-	private static final String DEFAULTEDFONT2 = "defaultedfont2";
-	/**
-	 * 
-	 */
-	private static final String DEFAULTEDFONT = "defaultedfont";
-	/**
-	 * 
-	 */
-	private static final String VALFONT = "valfont";
-	/**
-	 * 
-	 */
-	private static final String DEFAULTEDCOLOR3 = "defaultedcolor3";
-	/**
-	 * 
-	 */
-	private static final String DEFAULTEDCOLOR2 = "adefaultedcolor2";
-	/**
-	 * 
-	 */
-	private static final String VALUE2 = "value2";
-	/**
-	 * 
-	 */
-	private static final String OVERRIDE1 = "override1";
-	/**
-	 * 
-	 */
-	private static final String NOOVERRIDECOLOR = "nooverridecolor";
-	/**
-	 * 
-	 */
-	private static final String DEFAULTEDCOLOR = "defaultedcolor";
-	/**
-	 * 
-	 */
-	private static final String SWTCOLOR = "swtcolor";
-	/**
-	 * 
-	 */
-	private static final String FACTORYCOLOR = "factorycolor";
-	/**
-	 * 
-	 */
-	private static final String RGBCOLOR = "rgbcolor";
-	/**
-	 * 
-	 */
-	private static final String BOOL1 = "bool1";
-	/**
-	 * 
-	 */
-	private static final String BOGUSKEY = "BOGUSKEY";
-	/**
-	 * 
-	 */
-	private static final String INT1 = "int1";
-	/**
-	 * 
-	 */
-	private static final String DATA2 = "data2";
-	/**
-	 * 
-	 */
-	private static final String DATA1 = "data1";	
-	/**
-	 * 
-	 */
-	private static final String BAD_COLOR1 = "badColor1";
-	/**
-	 * 
-	 */
-	private static final String BAD_COLOR2 = "badColor2";
-	/**
-	 * 
-	 */
-	private static final String BAD_COLOR3 = "badColor3";
-
-	/**
-     * @param testName
-     */
-    public ThemeAPITest(String testName) {
-        super(testName);
-    }
-
-    private void checkEvents(ThemePropertyListener listener, Object source,
-            Object oldObject, Object newObject) {
-        boolean array = oldObject instanceof Object[];
-        List events = listener.getEvents();
-        assertEquals(2, events.size());
-        PropertyChangeEvent event = (PropertyChangeEvent) events.get(0);
-
-        assertEquals(source, event.getSource());
-        if (array) {
-            assertArrayEquals((Object[]) oldObject, (Object[]) event
-                    .getOldValue());
-            assertArrayEquals((Object[]) newObject, (Object[]) event
-                    .getNewValue());
-        } else {
-            assertEquals(oldObject, event.getOldValue());
-            assertEquals(newObject, event.getNewValue());
-        }
-
-        event = (PropertyChangeEvent) events.get(1);
-        assertEquals(source, event.getSource());
-        if (array) {
-            assertArrayEquals((Object[]) oldObject, (Object[]) event
-                    .getNewValue());
-            assertArrayEquals((Object[]) newObject, (Object[]) event
-                    .getOldValue());
-        } else {
-            assertEquals(oldObject, event.getNewValue());
-            assertEquals(newObject, event.getOldValue());
-        }
-    }
-
-    public void testBooleanDataConversion() {
-        ITheme defaultTheme = getDefaultTheme();
-        assertEquals(false, defaultTheme.getBoolean(DATA1));
-        assertEquals(false, defaultTheme.getBoolean(DATA2));
-        assertEquals(false, defaultTheme.getBoolean(INT1));
-        assertEquals(false, defaultTheme.getBoolean(BOGUSKEY));
-        assertEquals(true, defaultTheme.getBoolean(BOOL1));
-    }
-
-    public void testColorCascadeEvents() {
-        ITheme currentTheme = fManager.getCurrentTheme();
-        assertNotNull(currentTheme);
-
-        ThemePropertyListener managerListener = new ThemePropertyListener();
-        ThemePropertyListener themeListener = new ThemePropertyListener();
-        fManager.addPropertyChangeListener(managerListener);
-        currentTheme.addPropertyChangeListener(themeListener);
-
-        ColorRegistry colorRegistry = currentTheme.getColorRegistry();
-        RGB oldColor = colorRegistry.getRGB(RGBCOLOR);
-        RGB newColor = new RGB(121, 9, 121);
-        colorRegistry.put(RGBCOLOR, newColor);
-        colorRegistry.put(RGBCOLOR, oldColor);
-
-        checkEvents(managerListener, colorRegistry, oldColor, newColor);
-        checkEvents(themeListener, colorRegistry, oldColor, newColor);
-
-        fManager.removePropertyChangeListener(managerListener);
-        currentTheme.removePropertyChangeListener(themeListener);
-    }
-
-    public void testColorFactory() {
-        ITheme defaultTheme = getDefaultTheme();
-        assertEquals(TestColorFactory.RGB, defaultTheme.getColorRegistry()
-                .getRGB(FACTORYCOLOR));
-    }
-
-    public void testColorPreferenceListener_def_swtcolor() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme defaultTheme = getDefaultTheme();
-
-        testOverrideColorPreference(defaultTheme, store, SWTCOLOR);
-    }
-
-    public void testColorPreferenceListener_def_rgbcolor() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme defaultTheme = getDefaultTheme();
-
-        testOverrideColorPreference(defaultTheme, store, RGBCOLOR);
-    }
-
-    public void testColorPreferenceListener_def_defaultedcolor() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme defaultTheme = getDefaultTheme();
-
-        testOverrideColorPreference(defaultTheme, store, DEFAULTEDCOLOR);
-    }
-
-    public void testColorPreferenceListener_def_nooverridecolor() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme defaultTheme = getDefaultTheme();
-
-        testOverrideColorPreference(defaultTheme, store, NOOVERRIDECOLOR);
-    }
-
-    public void testColorPreferenceListener_th1_swtcolor() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme theme1 = getTheme1();
-
-        testOverrideColorPreference(theme1, store, SWTCOLOR);
-    }
-
-    public void testColorPreferenceListener_th1_rgbcolor() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme theme1 = getTheme1();
-
-        testOverrideColorPreference(theme1, store, RGBCOLOR);
-    }
-
-    public void testColorPreferenceListener_th1_defaultedcolor() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme theme1 = getTheme1();
-
-        testOverrideColorPreference(theme1, store, DEFAULTEDCOLOR);
-    }
-
-    public void testColorPreferenceListener_th1_nooverridecolor() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme theme1 = getTheme1();
-
-        testOverrideColorPreference(theme1, store, NOOVERRIDECOLOR);
-    }
-
-    public void testDataKeySet_data1() {
-        ITheme defaultTheme = getDefaultTheme();
-        Set themeKeys = defaultTheme.keySet();
-
-        assertTrue(themeKeys.contains(DATA1));
-    }
-
-    public void testDataKeySet_data2() {
-        ITheme defaultTheme = getDefaultTheme();
-        Set themeKeys = defaultTheme.keySet();
-
-        assertTrue(themeKeys.contains(DATA2));
-    }
-
-    public void testDataKeySet_int1() {
-        ITheme defaultTheme = getDefaultTheme();
-        Set themeKeys = defaultTheme.keySet();
-
-        assertTrue(themeKeys.contains(INT1));
-    }
-
-    public void testDataKeySet_bool1() {
-        ITheme defaultTheme = getDefaultTheme();
-        Set themeKeys = defaultTheme.keySet();
-
-        assertTrue(themeKeys.contains(BOOL1));
-    }
-
-    public void testDataKeySet_BOGUSKEY() {
-        ITheme defaultTheme = getDefaultTheme();
-        Set themeKeys = defaultTheme.keySet();
-
-        assertFalse(themeKeys.contains(BOGUSKEY));
-    }
-
-    public void testDataOverride_data1() {
-        ITheme theme1 = getTheme1();
-
-        assertEquals(OVERRIDE1, theme1.getString(DATA1));
-    }
-
-    public void testDataOverride_data2() {
-        ITheme theme1 = getTheme1();
-
-        assertEquals(VALUE2, theme1.getString(DATA2));
-    }
-
-    public void testDefaultedColor_rgbcolor() {
-        ITheme defaultTheme = getDefaultTheme();
-        assertEquals(defaultTheme.getColorRegistry().getRGB(RGBCOLOR),
-                defaultTheme.getColorRegistry().getRGB(DEFAULTEDCOLOR));
-    }
-
-    public void testDefaultedColor_defaultedcolor() {
-        ITheme defaultTheme = getDefaultTheme();
-        assertEquals(defaultTheme.getColorRegistry().getRGB(DEFAULTEDCOLOR),
-                defaultTheme.getColorRegistry().getRGB(DEFAULTEDCOLOR2));
-    }
-
-    public void testDefaultedColor_defaultedcolor2() {
-        ITheme defaultTheme = getDefaultTheme();
-
-        assertEquals(defaultTheme.getColorRegistry().getRGB(DEFAULTEDCOLOR2),
-                defaultTheme.getColorRegistry().getRGB(DEFAULTEDCOLOR3));
-    }
-
-    public void testDefaultedFont_valfont() {
-        ITheme defaultTheme = getDefaultTheme();
-        assertArrayEquals(
-                defaultTheme.getFontRegistry().getFontData(VALFONT),
-                defaultTheme.getFontRegistry().getFontData(DEFAULTEDFONT));
-    }
-
-    public void testDefaultedFont_defaultedfont() {
-        ITheme defaultTheme = getDefaultTheme();
-        assertArrayEquals(defaultTheme.getFontRegistry().getFontData(
-                DEFAULTEDFONT), defaultTheme.getFontRegistry().getFontData(
-                DEFAULTEDFONT2));
-    }
-
-    public void testDefaultedFont_defaultedfont2() {
-        ITheme defaultTheme = getDefaultTheme();
-        assertArrayEquals(defaultTheme.getFontRegistry().getFontData(
-                DEFAULTEDFONT2), defaultTheme.getFontRegistry().getFontData(
-                DEFAULTEDFONT3));
-    }
-
-    public void testDefaultedFontOverride_valfont() {
-        ITheme theme1 = getTheme1();
-        assertArrayEquals(theme1.getFontRegistry().getFontData(VALFONT),
-                theme1.getFontRegistry().getFontData(DEFAULTEDFONT));
-    }
-
-    public void testDefaultedFontOverride_defaultedfont2() {
-        ITheme theme1 = getTheme1();
-
-        assertArrayEquals(new FontData[] { new FontData("Courier", 16,
-                SWT.NORMAL) }, theme1.getFontRegistry().getFontData(
-                DEFAULTEDFONT2));
-    }
-
-    public void testDefaultedFontOverride_defaultedfont3() {
-        ITheme theme1 = getTheme1();
-
-        assertArrayEquals(theme1.getFontRegistry()
-                .getFontData(DEFAULTEDFONT2), theme1.getFontRegistry()
-                .getFontData(DEFAULTEDFONT3));
-    }
-
-    public void testDefaultedOverrideColor_rgbcolor() {
-        ITheme theme1 = getTheme1();
-        assertEquals(theme1.getColorRegistry().getRGB(RGBCOLOR), theme1
-                .getColorRegistry().getRGB(DEFAULTEDCOLOR));
-    }
-
-    public void testDefaultedOverrideColor_defaultedcolor2() {
-        ITheme theme1 = getTheme1();
-        assertEquals(new RGB(9, 9, 9), theme1.getColorRegistry().getRGB(
-                DEFAULTEDCOLOR2));
-
-    }
-
-    public void testDefaultedOverrideColor_defaultedcolor3() {
-        ITheme theme1 = getTheme1();
-        assertEquals(theme1.getColorRegistry().getRGB(DEFAULTEDCOLOR2),
-                theme1.getColorRegistry().getRGB(DEFAULTEDCOLOR3));
-    }
-
-    public void testFontCascadeEvents() {
-        ITheme currentTheme = fManager.getCurrentTheme();
-        assertNotNull(currentTheme);
-
-        ThemePropertyListener managerListener = new ThemePropertyListener();
-        ThemePropertyListener themeListener = new ThemePropertyListener();
-        fManager.addPropertyChangeListener(managerListener);
-        currentTheme.addPropertyChangeListener(themeListener);
-
-        FontRegistry fontRegistry = currentTheme.getFontRegistry();
-        FontData[] oldFont = fontRegistry.getFontData(VALFONT);
-        FontData[] newFont = new FontData[] { new FontData("Courier", 30,
-                SWT.ITALIC) };
-        fontRegistry.put(VALFONT, newFont);
-        fontRegistry.put(VALFONT, oldFont);
-
-        checkEvents(managerListener, fontRegistry, oldFont, newFont);
-        checkEvents(themeListener, fontRegistry, oldFont, newFont);
-
-        fManager.removePropertyChangeListener(managerListener);
-        currentTheme.removePropertyChangeListener(themeListener);
-    }
-
-    public void testFontPreferenceListener_def_novalfont() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme defaultTheme = getDefaultTheme();
-        testOverrideFontPreference(defaultTheme, store, NOVALFONT);
-    }
-
-    public void testFontPreferenceListener_def_valfont() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme defaultTheme = getDefaultTheme();
-
-        testOverrideFontPreference(defaultTheme, store, VALFONT);
-    }
-
-    public void testFontPreferenceListener_def_defaultedfont() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme defaultTheme = getDefaultTheme();
-
-        testOverrideFontPreference(defaultTheme, store, DEFAULTEDFONT);
-    }
-
-    public void testFontPreferenceListener_def_nooverridefont() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme defaultTheme = getDefaultTheme();
-
-        testOverrideFontPreference(defaultTheme, store, NOOVERRIDEFONT);
-    }
-
-    public void testFontPreferenceListener_th1_valfont() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme theme1 = getTheme1();
-
-        testOverrideFontPreference(theme1, store, VALFONT);
-    }
-
-    public void testFontPreferenceListener_th1_novalfont() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme theme1 = getTheme1();
-
-        testOverrideFontPreference(theme1, store, NOVALFONT);
-    }
-
-    public void testFontPreferenceListener_th1_defaultedfont() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme theme1 = getTheme1();
-
-        testOverrideFontPreference(theme1, store, DEFAULTEDFONT);
-    }
-
-    public void testFontPreferenceListener_th1_nooverridefont() {
-        IPreferenceStore store = PrefUtil.getInternalPreferenceStore();
-        ITheme theme1 = getTheme1();
-
-        testOverrideFontPreference(theme1, store, NOOVERRIDEFONT);
-    }
-
-    public void testGetBadTheme() {
-        ITheme badTheme = fManager.getTheme(BOGUSID);
-        assertNull(badTheme);
-    }
-
-    public void testIntDataConversion() {
-        ITheme defaultTheme = getDefaultTheme();
-        assertEquals(0, defaultTheme.getInt(DATA1));
-        assertEquals(0, defaultTheme.getInt(DATA2));
-        assertEquals(0, defaultTheme.getInt(BOOL1));
-        assertEquals(0, defaultTheme.getInt(BOGUSKEY));
-        assertEquals(3133, defaultTheme.getInt(INT1));
-    }
-
-    public void testNoValFont() {
-        ITheme defaultTheme = getDefaultTheme();
-        assertArrayEquals(defaultTheme.getFontRegistry().defaultFont()
-                .getFontData(), defaultTheme.getFontRegistry().getFontData(
-                NOVALFONT));
-    }
-
-    public void testNoValFontOverride() {
-        ITheme theme1 = getTheme1();
-        assertArrayEquals(new FontData[] { new FontData("Courier", 10,
-                SWT.ITALIC) }, theme1.getFontRegistry()
-                .getFontData(NOVALFONT));
-
-    }
-
-    private void testOverrideColorPreference(ITheme theme,
-            IPreferenceStore store, String color) {
-        RGB oldRGB = theme.getColorRegistry().getRGB(color);
-        RGB newRGB = new RGB(75, 21, 68);
-
-        store.setValue(ThemeElementHelper.createPreferenceKey(theme, color),
-                StringConverter.asString(newRGB));
-        assertEquals(newRGB, theme.getColorRegistry().getRGB(color));
-        store
-                .setToDefault(ThemeElementHelper.createPreferenceKey(theme,
-                        color));
-        assertEquals(oldRGB, theme.getColorRegistry().getRGB(color));
-    }
-
-    private void testOverrideFontPreference(ITheme theme,
-            IPreferenceStore store, String font) {
-        FontData[] oldFont = theme.getFontRegistry().getFontData(font);
-        FontData[] newFont = new FontData[] { new FontData("Courier", 30,
-                SWT.ITALIC) };
-        store.setValue(ThemeElementHelper.createPreferenceKey(theme, font),
-                PreferenceConverter.getStoredRepresentation(newFont));
-        assertArrayEquals(newFont, theme.getFontRegistry().getFontData(font));
-        store.setToDefault(ThemeElementHelper.createPreferenceKey(theme, font));
-        assertArrayEquals(oldFont, theme.getFontRegistry().getFontData(font));
-    }
-
-    public void testPlatformColor() {
-        ITheme defaultTheme = getDefaultTheme();
-        RGB rgb = null;
-        // test for two specific platforms and one general
-        if (Platform.getWS().equals("win32")
-                && Platform.getOS().equals("win32"))
-            rgb = new RGB(50, 50, 50);
-        else if (Platform.getWS().equals("gtk")
-                && Platform.getOS().equals("linux"))
-            rgb = new RGB(25, 25, 25);
-        else if (Platform.getOS().equals("linux"))
-            rgb = new RGB(75, 75, 75);
-        else
-            rgb = new RGB(0, 0, 0);
-
-        assertEquals(rgb, defaultTheme.getColorRegistry().getRGB(
-                PLATFORMCOLOR));
-    }
-
-    public void testPlatformFont() {
-        ITheme defaultTheme = getDefaultTheme();
-        FontData[] data = null;
-        if (Platform.getWS().equals("win32")
-                && Platform.getOS().equals("win32"))
-            data = new FontData[] { new FontData("Courier New", 12, SWT.NORMAL) };
-        else
-            data = new FontData[] { new FontData("Sans", 15, SWT.BOLD) };
-
-        assertArrayEquals(data, defaultTheme.getFontRegistry().getFontData(
-                PLATFORMFONT));
-    }
-
-    public void testRGBColor() {
-        ITheme defaultTheme = getDefaultTheme();
-        assertEquals(new RGB(1, 1, 2), defaultTheme.getColorRegistry().getRGB(
-                RGBCOLOR));
-    }
-
-    public void testRGBColorOverride() {
-        ITheme theme1 = getTheme1();
-        assertEquals(new RGB(2, 1, 1), theme1.getColorRegistry().getRGB(
-                RGBCOLOR));
-    }
-
-    public void testSetTheme() {
-        ThemePropertyListener listener = new ThemePropertyListener();
-        fManager.addPropertyChangeListener(listener);
-        ITheme currentTheme = fManager.getCurrentTheme();
-        fManager.setCurrentTheme(BOGUSID);
-        assertEquals(currentTheme, fManager.getCurrentTheme());
-        fManager.setCurrentTheme(THEME1);
-        assertNotSame(currentTheme, fManager.getCurrentTheme());
-        ITheme newCurrentTheme = fManager.getCurrentTheme();
-        ITheme theme1 = getTheme1();
-        assertEquals(theme1, newCurrentTheme);
-        List events = listener.getEvents();
-        assertEquals(1, events.size());
-        PropertyChangeEvent event = ((PropertyChangeEvent) events.get(0));
-        assertEquals(IThemeManager.CHANGE_CURRENT_THEME, event.getProperty());
-        assertEquals(currentTheme, event.getOldValue());
-        assertEquals(newCurrentTheme, event.getNewValue());
-        fManager.removePropertyChangeListener(listener);
-    }
-
-    public void testStringData() {
-        ITheme defaultTheme = getDefaultTheme();
-        assertEquals("value1", defaultTheme.getString(DATA1));
-        assertEquals(VALUE2, defaultTheme.getString(DATA2));
-        assertEquals("3133", defaultTheme.getString(INT1));
-        assertEquals("true", defaultTheme.getString(BOOL1));
-        assertEquals(null, defaultTheme.getString(BOGUSKEY));
-    }
-
-    public void testSWTColor() {
-        ITheme defaultTheme = getDefaultTheme();
-        assertEquals(Display.getDefault().getSystemColor(SWT.COLOR_DARK_BLUE)
-                .getRGB(), defaultTheme.getColorRegistry().getRGB(SWTCOLOR));
-    }
-
-    public void testSWTColorOverride() {
-        ITheme theme1 = getTheme1();
-        assertEquals(Display.getDefault().getSystemColor(SWT.COLOR_DARK_GREEN)
-                .getRGB(), theme1.getColorRegistry().getRGB(SWTCOLOR));
-    }
-
-    public void testThemeDescription_default() {
-        ITheme defaultTheme = getDefaultTheme();
-        assertEquals(IThemeManager.DEFAULT_THEME, defaultTheme.getId());
-        // don't bother testing against the actual value
-        assertNotNull(defaultTheme.getLabel());
-    }
-
-    public void testThemeDescription_theme1() {
-        ITheme theme1 = getTheme1();
-        assertEquals(THEME1, theme1.getId());
-        assertEquals("test theme 1", theme1.getLabel());
-    }
-
-    public void testValFont() {
-        ITheme defaultTheme = getDefaultTheme();
-        assertArrayEquals(
-                new FontData[] { new FontData("Tahoma", 20, SWT.BOLD) },
-                defaultTheme.getFontRegistry().getFontData(VALFONT));
-    }
-    
-    /*
-     * The following tests check to ensure that support for multiple extensions
-     * contributing to the same theeme work. They also check to ensure that the
-     * first value encountered for a given font/colour is the only one used.
-     */
-    
-    public void testThemeExtensionName() {
-        ITheme ext1 = fManager.getTheme(EXTENDED_THEME1);
-        ITheme ext2 = fManager.getTheme(EXTENDED_THEME2);
-        ITheme ext3 = fManager.getTheme(EXTENDED_THEME3);
-        
-        assertEquals("Extended Theme 1", ext1.getLabel());
-        assertEquals("Extended Theme 2", ext2.getLabel());
-        assertEquals("Extended Theme 3", ext3.getLabel());
-    }
-    
-    public void testThemeExtensionData() {
-        ITheme ext1 = fManager.getTheme(EXTENDED_THEME1);
-        assertNotNull(ext1.getString("d1"));
-        assertEquals("d1", ext1.getString("d1"));
-        assertNotNull(ext1.getString("d2"));
-    }
-    
-    public void testThemeExtensionColor() {
-        ITheme ext1 = fManager.getTheme(EXTENDED_THEME1);
-        assertEquals(Display.getDefault().getSystemColor(SWT.COLOR_RED)
-                .getRGB(), ext1.getColorRegistry().getRGB(SWTCOLOR)); 
-
-        assertEquals(Display.getDefault().getSystemColor(SWT.COLOR_RED)
-                .getRGB(), ext1.getColorRegistry().getRGB(RGBCOLOR)); 
-    }
-    
-    public void testThemeExtensionFont() {
-        ITheme ext1 = fManager.getTheme(EXTENDED_THEME1);
-        
-        FontData[] fd = new FontData[] { new FontData("Sans", 10,
-                SWT.NORMAL) };
-        
-        assertArrayEquals(fd, ext1.getFontRegistry()
-                .getFontData(VALFONT));
-
-        assertArrayEquals(fd, ext1.getFontRegistry()
-                .getFontData(NOVALFONT));
-    }
-    
-    /**
-	 * Tests to ensure that a color with a bogus value doesn't take down the
-	 * workbench.
-	 */
-	public void testBadColor1() {
-    	 ITheme defaultTheme = getDefaultTheme();
-    	 assertEquals(new RGB(0,0,0), defaultTheme.getColorRegistry().getRGB(BAD_COLOR1)); // doesn't look like an RGB
-	}
-	
-	/**
-	 * Tests to ensure that a color with extra spaces doesn't take down the workbench.
-	 */
-	public void testBadColor2() {
-    	 assertEquals(new RGB(0,0,1), getDefaultTheme().getColorRegistry().getRGB(BAD_COLOR2)); // rgb with extra spaces
-	}
-	
-	/**
-	 * Tests to ensure that a color with extra spaces doesn't take down the workbench.
-	 */
-	public void testBadColor3() {
-    	 assertEquals(new RGB(0,0,0), getDefaultTheme().getColorRegistry().getRGB(BAD_COLOR3)); // rgb with extra characters
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/ThemePropertyListener.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/ThemePropertyListener.java
deleted file mode 100644
index 7390662..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/ThemePropertyListener.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.themes;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * @since 3.0
- */
-public class ThemePropertyListener implements IPropertyChangeListener {
-
-    private ArrayList events = new ArrayList();
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-     */
-    public void propertyChange(PropertyChangeEvent event) {
-        events.add(event);
-    }
-
-    public List getEvents() {
-        return events;
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/ThemeTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/ThemeTest.java
deleted file mode 100644
index 8f78eff..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/ThemeTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.themes;
-
-import java.util.Arrays;
-
-import org.eclipse.ui.tests.harness.util.UITestCase;
-import org.eclipse.ui.themes.ITheme;
-import org.eclipse.ui.themes.IThemeManager;
-
-/**
- * @since 3.0
- */
-public abstract class ThemeTest extends UITestCase {
-
-    protected static final String BOGUSID = "BOGUSID";
-
-    protected static final String THEME1 = "theme1";
-
-    public static void assertArrayEquals(Object[] datas, Object[] datas2) {
-        if (!Arrays.equals(datas, datas2)) {
-            String expected = formatArray(datas);
-            String actual = formatArray(datas2);
-            fail("expected:<" + expected + "> but was:<" + actual + ">");
-        }
-    }
-
-    protected static String formatArray(Object[] datas) {
-        StringBuffer buffer = new StringBuffer();
-        if (datas == null)
-            buffer.append("null");
-        else {
-            buffer.append('[');
-            for (int i = 0; i < datas.length; i++) {
-                buffer.append(datas[i]);
-                if (i != datas.length - 1)
-                    buffer.append(',');
-            }
-        }
-        return buffer.toString();
-    }
-
-    protected IThemeManager fManager;
-
-    /**
-     * @param testName
-     */
-    public ThemeTest(String testName) {
-        super(testName);
-        // TODO Auto-generated constructor stub
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.ui.tests.util.UITestCase#doSetUp()
-     */
-    protected void doSetUp() throws Exception {
-        super.doSetUp();
-        fManager = fWorkbench.getThemeManager();
-        fManager.setCurrentTheme(IThemeManager.DEFAULT_THEME);
-    }
-
-    /**
-     * @return
-     */
-    protected ITheme getDefaultTheme() {
-        ITheme defaultTheme = fManager.getTheme(IThemeManager.DEFAULT_THEME);
-        assertNotNull(defaultTheme);
-        return defaultTheme;
-    }
-
-    /**
-     * @return
-     */
-    protected ITheme getTheme1() {
-        ITheme theme1 = fManager.getTheme(THEME1);
-        assertNotNull(theme1);
-        return theme1;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/ThemesTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/ThemesTestSuite.java
deleted file mode 100644
index 171baca..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/themes/ThemesTestSuite.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.themes;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * @since 3.0
- */
-public class ThemesTestSuite extends TestSuite {
-
-    public static Test suite() {
-        return new ThemesTestSuite();
-    }
-
-    public ThemesTestSuite() {
-        addTest(new TestSuite(ThemeAPITest.class));
-        addTest(new TestSuite(JFaceThemeTest.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ActivateTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ActivateTest.java
deleted file mode 100644
index 4e24e9a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ActivateTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.zoom;
-
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPart;
-
-public abstract class ActivateTest extends ZoomTestCase {
-    public ActivateTest(String name) {
-        super(name);
-    }
-    
-    public abstract IWorkbenchPart getStackedPart1();
-    public abstract IWorkbenchPart getStackedPart2();
-    public abstract IWorkbenchPart getUnstackedPart();
-    
-    /**
-     * <p>Test: Zoom a part and activate it</p>
-     * <p>Expected result: Part remains zoomed</p>
-     */
-    public void testZoomAndActivate() {
-        IWorkbenchPart stacked1 = getStackedPart1();
-        
-        zoom(stacked1);
-        page.activate(stacked1);
-        
-        assertZoomed(stacked1);
-        assertActive(stacked1);
-    }
-    
-    /** 
-     * <p>Test: Zoom a view then activate another view in the same stack</p>
-     * <p>Expected result: Stack remains zoomed</p> 
-     */
-    public void testActivateSameStack() {
-        IWorkbenchPart stacked1 = getStackedPart1();
-        IWorkbenchPart stacked2 = getStackedPart2();
-        
-        // Ensure that every view in the stack is zoomed
-        zoom(stacked1);
-        
-        // Ensure that activating another zoomed part in the same stack doesn't affect zoom
-        page.activate(stacked2);
-        
-        assertZoomed(stacked2);
-        assertActive(stacked2);        
-    }
-    
-    /** 
-     * <p>Test: Zoom a view than activate a view in a different stack</p>
-     * <p>Expected result: page unzooms</p> 
-     */
-    public void testActivateOtherStack() {
-        IWorkbenchPart stacked1 = getStackedPart1();
-        IWorkbenchPart unstacked = getUnstackedPart();
-        
-        zoom(stacked1);
-        page.activate(unstacked);
-        
-        assertZoomed(null);
-        assertActive(unstacked);
-    }
-    
-    /** 
-     * <p>Test: Zoom a view, activate a fast view, then activate the zoomed view again</p>
-     * <p>Expected result: view remains zoomed</p> 
-     */
-    public void testActivateFastView() {
-        IWorkbenchPart stacked1 = getStackedPart1();
-        zoom(stacked1);
-        page.activate(fastView);
-        
-        assertZoomed(stacked1);
-        assertActive(fastView);
-        
-        page.activate(stacked1);
-        
-        assertZoomed(stacked1);
-        assertActive(stacked1);
-    }
-    
-    /** 
-     * <p>Test: Zoom a pane then create a new fast view with the VIEW_ACTIVATE mode</p>
-     * <p>Expected result: the original pane remains zoomed</p> 
-     */
-    public void testCreateFastView() {
-        IWorkbenchPart zoomedPart = getStackedPart1();
-        
-        close(fastView);
-        zoom(zoomedPart);
-        fastView = showFastView(ZoomPerspectiveFactory.FASTVIEW1);
-        
-        assertZoomed(zoomedPart);
-        assertActive(fastView);
-    }
-
-    /** 
-     * <p>Test: Zoom a pane, then turn the fast view back into a regular view</p>
-     * <p>Expected result: the original pane remains zoomed</p> 
-     */
-    public void testRestoreFastView() {
-        IWorkbenchPart zoomedPart = getStackedPart1();
-        
-        zoom(zoomedPart);
-        
-        // Restore the fast view. Shouldn't have any effect on zoom.
-        page.removeFastView((IViewReference)page.getReference(fastView));
-
-        assertZoomed(zoomedPart);
-        assertActive(zoomedPart);
-    }
-    
-    /**
-     * <p>Test: Zoom a pane, then reset perspective.</p>
-     * <p>Expected result: the page unzooms but the original pane remains active</p>
-     * 
-     * @since 3.1
-     */
-    public void testResetPerspective() {
-        IWorkbenchPart zoomedPart = getStackedPart1();
-        
-        zoom(zoomedPart);
-        
-        page.resetPerspective();
-        
-        assertZoomed(null);
-        assertActive(zoomedPart);
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/CloseTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/CloseTest.java
deleted file mode 100644
index adf3747..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/CloseTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.zoom;
-
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * This class contains tests that apply to both views and editors. Subclasses
- * will overload the abstract methods to determine whether editors or views
- * are being tested, and can define additional tests that only apply to editors
- * or views (or that have different results).
- */
-public abstract class CloseTest extends ZoomTestCase {
-    public CloseTest(String name) {
-        super(name);
-    }
-    
-    public abstract IWorkbenchPart getStackedPart1();
-    public abstract IWorkbenchPart getStackedPart2();
-    public abstract IWorkbenchPart getUnstackedPart();
-    
-    /**
-     * <p>Test: Zoom a part and hide an inactive fast view</p>
-     * <p>Expected result: Part remains zoomed</p>
-     */
-    public void testCloseInactiveFastView() {
-        IWorkbenchPart zoomPart = getStackedPart1();
-        
-        zoom(zoomPart);
-        close(fastView);
-        
-        assertZoomed(zoomPart);
-        assertActive(zoomPart);
-    }
-    
-    /**
-     * <p>Test: Zoom a part, activate a fast view, then hide the fast view</p>
-     * <p>Expected result: Part remains zoomed</p>
-     */
-    public void testCloseActiveFastView() {
-        IWorkbenchPart zoomPart = getStackedPart1();
-        
-        zoom(zoomPart);
-        page.activate(fastView);
-        close(fastView);
-        
-        assertZoomed(zoomPart);
-        assertActive(zoomPart);
-    }
-    
-    /**
-     * <p>Test: Activate an unstacked view, zoom and activate a stacked part, then close the active part.</p>
-     * <p>Expected result: Stack remains zoomed, another part in the zoomed stack is active</p>
-     * <p>Note: This ensures that when the active part is closed, it will try to activate a part that
-     *    doesn't affect the zoom even if something else was activated more recently.</p>
-     */
-    public void testCloseZoomedStackedPartAfterActivatingView() {
-        IWorkbenchPart zoomPart = getStackedPart1();
-        IWorkbenchPart otherStackedPart = getStackedPart2();
-        IWorkbenchPart unstackedPart = unstackedView;
-        
-        page.activate(unstackedPart);
-        zoom(zoomPart);
-        close(zoomPart);
-                
-        assertZoomed(otherStackedPart);
-        assertActive(otherStackedPart);
-    }
-
-    /**
-     * <p>Test: Activate an unstacked editor, zoom and activate a stacked part, then close the active part.</p>
-     * <p>Expected result: Stack remains zoomed, another part in the zoomed stack is active</p>
-     * <p>Note: This ensures that when the active part is closed, it will try to activate a part that
-     *    doesn't affect the zoom even if something else was activated more recently.</p>
-     */
-    public void testCloseZoomedStackedPartAfterActivatingEditor() {
-        IWorkbenchPart zoomPart = getStackedPart1();
-        IWorkbenchPart otherStackedPart = getStackedPart2();
-        IWorkbenchPart unstackedPart = editor3;
-        
-        page.activate(unstackedPart);
-        zoom(zoomPart);
-        close(zoomPart);
-        
-        assertZoomed(otherStackedPart);
-        assertActive(otherStackedPart);
-    }
-
-    /**
-     * <p>Test: Activate an unstacked editor, activate a stacked part, then close the active part.</p>
-     * <p>Expected result: The unstacked part becomes active</p>
-     * <p>Note: This isn't really a zoom test, but it ensures that the behavior tested by 
-     *    testHideZoomedStackedPartAfterActivatingEditor does not affect activation when there is no zoom.</p>
-     */
-    public void testCloseUnzoomedStackedPartAfterActivatingEditor() {
-        IWorkbenchPart activePart = getStackedPart1();
-        IWorkbenchPart unstackedPart = editor3;
-        
-        page.activate(unstackedPart);
-        page.activate(activePart);
-        close(activePart);
-        
-        assertZoomed(null);
-        assertActive(unstackedPart);
-    }
-        
-    /**
-     * <p>Test: Zoom an unstacked part and close it.</p>
-     * <p>Expected result: The page is unzoomed and the previously active part becomes active</p>
-     * <p>Note: This ensures that the activation list is used if there is nothing available
-     *    in the currently zoomed stack.</p>
-     */
-    public void testCloseZoomedUnstackedPartAfterActivatingEditor() {
-        IWorkbenchPart previousActive = editor1;
-        IWorkbenchPart zoomedPart = getUnstackedPart();
-        
-        page.activate(previousActive);
-        zoom(zoomedPart);
-        close(zoomedPart);
-
-        assertZoomed(null);
-        assertActive(previousActive);
-    }
-
-    /**
-     * <p>Test: Zoom a stacked part and close an inactive, unstacked editor.</p>
-     * <p>Expected result: No change in activation or zoom</p>
-     */
-    public void testCloseHiddenUnstackedEditor() {
-        IWorkbenchPart zoomedPart = getStackedPart1();
-        
-        // Activate another editor to ensure that we aren't closing the active editor
-        page.activate(editor1);
-        zoom(zoomedPart);
-        close(editor3);
-
-        assertZoomed(zoomedPart);
-        assertActive(zoomedPart);
-    }
-    
-    /**
-     * <p>Test: Zoom a stacked part and close an inactive, unstacked view.</p>
-     * <p>Expected result: No change in activation or zoom</p>
-     */
-    public void testCloseHiddenUnstackedView() {
-        IWorkbenchPart zoomedPart = getStackedPart1();
-        
-        zoom(zoomedPart);
-        close(unstackedView);
-        
-        assertZoomed(zoomedPart);
-        assertActive(zoomedPart);
-    }
-    
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/OpenEditorTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/OpenEditorTest.java
deleted file mode 100644
index 7c4bfad..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/OpenEditorTest.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.zoom;
-
-import junit.framework.Assert;
-
-
-public class OpenEditorTest extends ZoomTestCase {
-    public OpenEditorTest(String name) {
-        super(name);
-    }
-
-    /** 
-     * <p>Test: Zoom an editor then open an existing editor in the same stack. Do not force activation.</p>
-     * <p>Expected result: the new editor is zoomed and active</p> 
-     */
-    public void testOpenExistingEditorInZoomedStack() {
-        zoom(editor1);
-        openEditor(file2, false);
-        Assert.assertTrue(isZoomed(editor2));
-        Assert.assertTrue(page.getActivePart() == editor2);
-    }
-
-    /** 
-     * <p>Test: Open a new editor while a view is zoomed. Do not force activation.</p>
-     * <p>Expected result: the page remains zoomed, the view is active</p> 
-     * 
-     * <p>Note: the expected result changed intentionally on 05/04/18</p>
-     */
-    public void testOpenNewEditorWhileViewZoomed() {
-        close(editor1);
-        
-        zoom(stackedView1);
-        openEditor(file1, false);
-        
-        assertZoomed(stackedView1);
-        assertActive(stackedView1);
-    }
-    
-    /** 
-     * <p>Test: Zoom an editor then open a new editor in the same stack. Do not force activation.</p>
-     * <p>Expected result: the new editor is zoomed and active</p> 
-     */
-    public void testOpenNewEditorInZoomedStack() {
-        close(editor2);
-        
-        zoom(editor1);
-        openEditor(file2, false);
-        Assert.assertTrue(isZoomed(editor2));
-        Assert.assertTrue(page.getActivePart() == editor2);
-    }
-    
-    /** 
-     * <p>Test: Open an existing editor while a view is zoomed. Do not force activation.</p>
-     * <p>Expected result: the page remains zoomed, the view is active</p> 
-     */
-    public void testOpenExistingEditorWhileViewZoomed() {
-        zoom(stackedView1);
-        openEditor(file1, false);
-        
-        assertZoomed(stackedView1);
-        assertActive(stackedView1);
-    }
-
-    /** 
-     * <p>Test: Open an existing editor while a view is zoomed. Use the activate-on-open mode.</p>
-     * <p>Expected result: the page is unzoomed, the view is active</p> 
-     */
-    public void testOpenAndActivateExistingEditorWhileViewZoomed() {
-        zoom(stackedView1);
-        openEditor(file1, true);
-
-        assertZoomed(null);
-        assertActive(editor1);
-    }
-
-    /** 
-     * <p>Test: Open a new editor while a view is zoomed. Use the activate-on-open mode.</p>
-     * <p>Expected result: the page is unzoomed, the view is active</p> 
-     */
-    public void testOpenAndActivateNewEditorWhileViewZoomed() {
-        close(editor1);
-        
-        zoom(stackedView1);
-        openEditor(file1, true);
-       
-        assertZoomed(null);
-        assertActive(editor1);
-    }
-
-    /** 
-     * <p>Test: Zoom an editor then open an existing in the same stack. Use the activate-on-open mode.</p>
-     * <p>Expected result: the new editor is zoomed and active</p> 
-     */
-    public void testOpenAndActivateExistingEditorInZoomedStack() {
-        zoom(editor1);
-        openEditor(file2, true);
-
-        assertZoomed(editor2);
-        assertActive(editor2);
-    }
-
-    /** 
-     * <p>Test: Zoom an editor then open a new editor in the same stack. Use the activate-on-open mode.</p>
-     * <p>Expected result: the new editor is zoomed and active</p> 
-     */
-    public void testOpenAndActivateNewEditorInZoomedStack() {
-        close(editor2);
-        
-        zoom(editor1);
-        openEditor(file2, true);
-
-        assertZoomed(editor2);
-        assertActive(editor2);
-    }
-    
-    /** 
-     * <p>Test: Zoom an editor then open an existing editor in a different stack. Do not force activation.</p>
-     * <p>Expected result: the page remains zoomed and the original editor is active</p> 
-     */
-    public void testOpenExistingEditorInOtherStack() {
-        zoom(editor3);
-        openEditor(file2, false);
-        
-        assertZoomed(editor3);
-        assertActive(editor3);
-    }
-
-    /** 
-     * <p>Test: Zoom an editor then open an existing editor in a different stack. Use the activate-on-open mode.</p>
-     * <p>Expected result: the page is unzoomed and the new editor and active</p> 
-     */
-    public void testOpenAndActivateExistingEditorInOtherStack() {
-        zoom(editor3);
-        openEditor(file2, true);
-
-        assertZoomed(null);
-        assertActive(editor2);
-    }
-    
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ShowViewTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ShowViewTest.java
deleted file mode 100644
index d32de4b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ShowViewTest.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.zoom;
-
-import junit.framework.Assert;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.internal.PartPane;
-import org.eclipse.ui.internal.PartSite;
-import org.eclipse.ui.internal.PartStack;
-
-public class ShowViewTest extends ZoomTestCase {
-    public ShowViewTest(String name) {
-        super(name);
-    }
-
-// Commented out until the (possible) ambiguity in bug 91775 is resolved
-//    /** 
-//     * <p>Test: Zoom a view, create a new view in the same stack using the 
-//     *    IWorkbenchPage.VIEW_VISIBLE flag</p>
-//     * <p>Expected result: the new view is zoomed and active</p> 
-//     */
-//    public void testCreateViewAndMakeVisibleInZoomedStack() {
-//        zoom(stackedView1);
-//        IViewPart newPart = showRegularView(ZoomPerspectiveFactory.STACK1_PLACEHOLDER1, 
-//                IWorkbenchPage.VIEW_VISIBLE);
-//        
-//        Assert.assertTrue(page.getActivePart() == newPart);
-//        Assert.assertTrue(isZoomed(newPart));
-//    }
-    
-    /** 
-     * <p>Test: Zoom a view, create a new view in the same stack using the 
-     *    IWorkbenchPage.VIEW_CREATE flag, then bring it to top using </p>
-     * <p>Expected result: the new view is zoomed and active</p> 
-     */
-    public void testCreateViewAndBringToTop() {
-        zoom(stackedView1);
-        IViewPart newPart = showRegularView(ZoomPerspectiveFactory.STACK1_PLACEHOLDER1, 
-                IWorkbenchPage.VIEW_CREATE);
-        
-        page.bringToTop(newPart);
-        
-        Assert.assertTrue(page.getActivePart() == newPart);
-        Assert.assertTrue(isZoomed(newPart));
-    }
-
-    /** 
-     * <p>Test: Zoom a view, create a new view in a different stack using the 
-     *    IWorkbenchPage.VIEW_CREATE flag and bring it to front using page.bringToTop</p>
-     * <p>Expected result: no change in zoom or activation. The newly created view is obscured by the zoom, 
-     *    but will be the top view in its (currently invisible) stack.</p> 
-     */
-    public void testCreateViewAndBringToTopInOtherStack() {
-        zoom(unstackedView);
-        IViewPart newPart = showRegularView(ZoomPerspectiveFactory.STACK1_PLACEHOLDER1, IWorkbenchPage.VIEW_CREATE);
-        page.bringToTop(newPart);
-        Assert.assertTrue(page.getActivePart() == unstackedView);
-        
-        // Ensure no change to zoom
-        Assert.assertTrue(isZoomed(unstackedView));
-        
-        // Ensure that the new part was brought to the top of the stack
-        PartPane pane = ((PartSite) newPart.getSite()).getPane();
-        PartStack stack = (PartStack)pane.getContainer();
-        
-        Assert.assertTrue(stack.getSelection() == pane);
-    }
-    
-    /** 
-     * <p>Test: Zoom a view, create a new view in a different stack using the 
-     *    IWorkbenchPage.VIEW_VISIBLE flag</p>
-     * <p>Expected result: no change in zoom or activation. The newly created view is obscured by the zoom, 
-     *    but will be the top view in its (currently invisible) stack.</p> 
-     */
-    public void testCreateViewAndMakeVisibleInOtherStack() {
-        zoom(unstackedView);
-        IViewPart newPart = showRegularView(ZoomPerspectiveFactory.STACK1_PLACEHOLDER1, IWorkbenchPage.VIEW_VISIBLE);
-        Assert.assertTrue(page.getActivePart() == unstackedView);
-        
-        // Ensure no change to zoom
-        Assert.assertTrue(isZoomed(unstackedView));
-        
-        // Ensure that the new part was brought to the top of the stack
-        PartPane pane = ((PartSite) newPart.getSite()).getPane();
-        PartStack stack = (PartStack)pane.getContainer();
-        
-        Assert.assertTrue(stack.getSelection() == pane);
-    }
-    /** 
-     * <p>Test: Zoom an editor, create a new view using the IWorkbenchPage.VIEW_VISIBLE mode</p>
-     * <p>Expected result: No change to zoom or activation. The new view was brought to the top
-     *    of its stack.</p> 
-     */
-    public void testCreateViewAndMakeVisibleWhileEditorZoomed() {
-        zoom(editor1);
-        IViewPart newPart = showRegularView(ZoomPerspectiveFactory.STACK1_PLACEHOLDER1, IWorkbenchPage.VIEW_VISIBLE);
-        Assert.assertTrue(isZoomed());
-        Assert.assertTrue(page.getActivePart() == editor1);
-        
-        // Ensure that the new part was brought to the top of the stack
-        PartPane pane = ((PartSite) newPart.getSite()).getPane();
-        PartStack stack = (PartStack)pane.getContainer();
-        
-        Assert.assertTrue(stack.getSelection() == pane);
-    }
-        
-    /** 
-     * <p>Test: Zoom a view, create a new view in the same stack using the 
-     *    IWorkbenchPage.VIEW_ACTIVATE flag</p>
-     * <p>Expected result: the new view is zoomed and active</p> 
-     */
-    public void testCreateViewAndActivateInZoomedStack() {
-        zoom(stackedView1);
-        IViewPart newPart = showRegularView(ZoomPerspectiveFactory.STACK1_PLACEHOLDER1, IWorkbenchPage.VIEW_ACTIVATE);
-        
-        assertZoomed(newPart);
-        assertActive(newPart);
-    }
-    
-    /** 
-     * <p>Test: Zoom a view, create a new view in the same stack using the 
-     *    IWorkbenchPage.VIEW_CREATE flag</p>
-     * <p>Expected result: no change in activation or zoom</p> 
-     */
-    public void testCreateViewInZoomedStack() {
-        zoom(stackedView1);
-        showRegularView(ZoomPerspectiveFactory.STACK1_PLACEHOLDER1, 
-                IWorkbenchPage.VIEW_CREATE);
-        
-        assertZoomed(stackedView1);
-        assertActive(stackedView1);
-    }
-
-    /** 
-     * <p>Test: Zoom a view, create a new view in a different stack using the 
-     *    IWorkbenchPage.VIEW_ACTIVATE flag</p>
-     * <p>Expected result: the page is unzoomed and the new view is active</p> 
-     */
-    public void testCreateViewAndActivateInOtherStack() {
-        zoom(unstackedView);
-        IViewPart newPart = showRegularView(ZoomPerspectiveFactory.STACK1_PLACEHOLDER1, IWorkbenchPage.VIEW_ACTIVATE);
-        
-        assertZoomed(null);
-        assertActive(newPart);
-    }
-    
-    /** 
-     * <p>Test: Zoom a view, create a new view in a different stack using the 
-     *    IWorkbenchPage.VIEW_CREATE flag</p>
-     * <p>Expected result: No change to zoom or activation. The newly created view is hidden</p> 
-     */
-    public void testCreateViewInOtherStack() {
-        zoom(unstackedView);
-        showRegularView(ZoomPerspectiveFactory.STACK1_PLACEHOLDER1, IWorkbenchPage.VIEW_CREATE);
-
-        assertZoomed(unstackedView);
-        assertActive(unstackedView);
-    }
-    
-    /** 
-     * <p>Test: Zoom an editor, create a new view using the IWorkbenchPage.VIEW_ACTIVATE mode</p>
-     * <p>Expected result: the page is unzoomed and the new view is active</p> 
-     */
-    public void testCreateViewAndActivateWhileEditorZoomed() {
-        zoom(editor1);
-        IViewPart newPart = showRegularView(ZoomPerspectiveFactory.STACK1_PLACEHOLDER1, IWorkbenchPage.VIEW_ACTIVATE);
-        
-        assertZoomed(null);
-        assertActive(newPart);
-    }
-
-    /** 
-     * <p>Test: Zoom an editor, create a new view using the IWorkbenchPage.VIEW_CREATE mode</p>
-     * <p>Expected result: The editor remains zoomed and active.</p> 
-     */
-    public void testCreateViewWhileEditorZoomed() {
-        zoom(editor1);
-        showRegularView(ZoomPerspectiveFactory.STACK1_PLACEHOLDER1, IWorkbenchPage.VIEW_CREATE);
-        
-        assertZoomed(editor1);
-        assertActive(editor1);
-    }
-    
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomPerspectiveFactory.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomPerspectiveFactory.java
deleted file mode 100644
index 1f09c17..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomPerspectiveFactory.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.zoom;
-
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- * @since 3.0
- */
-public class ZoomPerspectiveFactory implements IPerspectiveFactory {
-    public static final String PERSP_ID = "org.eclipse.ui.tests.zoom.ZoomPerspectiveFactory";
-
-    public static final String STACK1_VIEW1 = IPageLayout.ID_OUTLINE;
-    public static final String STACK1_VIEW2 = IPageLayout.ID_PROBLEM_VIEW;
-    public static final String STACK1_PLACEHOLDER1 = IPageLayout.ID_PROP_SHEET;
-    public static final String STACK1_VIEW3 = IPageLayout.ID_TASK_LIST;
-    public static final String UNSTACKED_VIEW1 = IPageLayout.ID_RES_NAV;
-    public static final String FASTVIEW1 = IPageLayout.ID_BOOKMARKS;
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout)
-     */
-    public void createInitialLayout(IPageLayout layout) {
-        String folderId = "org.eclipse.ui.test.zoom.mystack";
-
-        IFolderLayout folder = layout.createFolder(folderId,
-                IPageLayout.LEFT, 0.5f, IPageLayout.ID_EDITOR_AREA);
-        folder.addView(STACK1_VIEW1);
-        folder.addView(STACK1_VIEW2);
-        folder.addPlaceholder(STACK1_PLACEHOLDER1);
-        folder.addView(STACK1_VIEW3);
-        
-        layout.addView(UNSTACKED_VIEW1,  IPageLayout.TOP, 0.5f, IPageLayout.ID_EDITOR_AREA);
-        
-        layout.addFastView(FASTVIEW1);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomTestCase.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomTestCase.java
deleted file mode 100644
index 2b7df24..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomTestCase.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.zoom;
-
-import junit.framework.Assert;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.SWT;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPreferenceConstants;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.IPreferenceConstants;
-import org.eclipse.ui.internal.PartPane;
-import org.eclipse.ui.internal.PartSite;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.WorkbenchWindow;
-import org.eclipse.ui.internal.util.PrefUtil;
-import org.eclipse.ui.internal.util.Util;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.tests.api.MockEditorPart;
-import org.eclipse.ui.tests.dnd.DragOperations;
-import org.eclipse.ui.tests.dnd.EditorAreaDropTarget;
-import org.eclipse.ui.tests.dnd.ExistingWindowProvider;
-import org.eclipse.ui.tests.harness.util.FileUtil;
-import org.eclipse.ui.tests.harness.util.UITestCase;
-
-public class ZoomTestCase extends UITestCase {
-//    protected static final String view1Id = IPageLayout.ID_RES_NAV;
-//
-//    protected static final String view2Id = IPageLayout.ID_OUTLINE;
-
-    protected WorkbenchWindow window;
-
-    protected WorkbenchPage page;
-
-    protected IProject project;
-
-    protected IFile file1, file2;
-    
-    protected IEditorPart editor1, editor2, editor3;
-
-    protected IViewPart stackedView1;
-    protected IViewPart stackedView2;
-    protected IViewPart unstackedView;
-    protected IViewPart fastView;
-
-    private IFile file3;
-
-    // Remember the actual value of the 'useMinMax' state
-    // so that 'tearDown' can restore it
-	private boolean oldMinMaxState;
-    
-    public ZoomTestCase(String name) {
-        super(name);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.util.UITestCase#doTearDown()
-     */
-    protected void doTearDown() throws Exception {
-        page.testInvariants();
-        
-        super.doTearDown();
-
-        IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore();
-        apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, oldMinMaxState);
-    }
-    
-    protected void doSetUp() throws Exception {
-		// These tests are hard-wired to the pre-3.3 zoom behaviour
-		// Run them anyway to ensure that we preserve the 3.0 mechanism
-        IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore();
-        oldMinMaxState = apiStore.getBoolean(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX);
-        
-        super.doSetUp();
-
-        window = (WorkbenchWindow) openTestWindow(ZoomPerspectiveFactory.PERSP_ID);
-        page = (WorkbenchPage) window.getActivePage();
-
-        // Disable animations since they occur concurrently and can interferre
-        // with locating drop targets
-        apiStore.setValue(
-                IWorkbenchPreferenceConstants.ENABLE_ANIMATIONS,
-                false);
-        
-		// These tests are hard-wired to the pre-3.3 zoom behaviour
-		// Run them anyway to ensure that we preserve the 3.0 mechanism
-        oldMinMaxState = apiStore.getBoolean(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX);
-        
-        apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, false);
-		
-        try {
-            project = FileUtil.createProject("IEditorPartTest"); //$NON-NLS-1$
-            file1 = FileUtil.createFile("Test1.txt", project); //$NON-NLS-1$
-            file2 = FileUtil.createFile("Test2.txt", project); //$NON-NLS-1$
-            file3 = FileUtil.createFile("Test3.txt", project); //$NON-NLS-1$
-            editor1 = page.openEditor(new FileEditorInput(file1),
-                    MockEditorPart.ID1);
-            editor2 = page.openEditor(new FileEditorInput(file2),
-                    MockEditorPart.ID2);
-            editor3 = page.openEditor(new FileEditorInput(file3),
-                    MockEditorPart.ID2);
-
-            DragOperations
-        		.drag(editor3, new EditorAreaDropTarget(new ExistingWindowProvider(window), SWT.RIGHT), false);
-        } catch (PartInitException e) {
-        } catch (CoreException e) {
-        }
-        
-        stackedView1 = findView(ZoomPerspectiveFactory.STACK1_VIEW1);
-        stackedView2 = findView(ZoomPerspectiveFactory.STACK1_VIEW2);
-        unstackedView = findView(ZoomPerspectiveFactory.UNSTACKED_VIEW1);
-        fastView = findView(ZoomPerspectiveFactory.FASTVIEW1);
-    }
-
-    // zooms the given part
-    protected void zoom(IWorkbenchPart part) {
-        if (part == null)
-            throw new NullPointerException();
-        page.activate(part);
-        page.toggleZoom(page.getReference(part));
-        Assert.assertTrue(page.isZoomed());
-        Assert.assertTrue(isZoomed(part));
-    }
-
-    // open the given file in an editor
-    protected void openEditor(IFile file, boolean activate) {
-        try {
-            if (file == file1)
-                editor1 = IDE.openEditor(page, file, activate);
-            if (file == file2)
-                editor2 = IDE.openEditor(page, file, activate);
-        } catch (PartInitException e) {
-        }
-    }
-
-    protected IViewPart findView(String id) {
-        IViewPart view = page.findView(id);
-        assertNotNull("View " + id + " not found", view);
-        return view;
-    }
-    
-    // show the given view as a regular view
-    protected IViewPart showRegularView(String id, int mode) {
-        try {
-            IViewPart view = page.showView(id, null, mode);
-            IViewReference ref = (IViewReference) page.getReference(view);
-            if (page.isFastView(ref))
-                page.removeFastView(ref);
-            return view;
-        } catch (PartInitException e) {
-        }
-        return null;
-    }
-
-    // show the given view
-    protected IViewPart showFastView(String id) {
-        try {
-            IPreferenceStore store = WorkbenchPlugin.getDefault().getPreferenceStore();
-        	
-            int oldMode = store.getInt(IPreferenceConstants.OPEN_VIEW_MODE);
-			store.setValue(IPreferenceConstants.OPEN_VIEW_MODE, IPreferenceConstants.OVM_FAST);
-			
-            IViewPart view = page.showView(id);
-            IViewReference ref = (IViewReference) page.getReference(view);
-            page.addFastView(ref);
-            Assert.assertTrue(page.isFastView(ref));
-            store.setValue(IPreferenceConstants.OPEN_VIEW_MODE, oldMode);
-            return view;
-        } catch (PartInitException e) {
-        }
-        return null;
-    }
-
-    // returns whether this part is zoomed
-    protected boolean isZoomed(IWorkbenchPart part) {
-        PartSite site = (PartSite) part.getSite();
-        PartPane pane = site.getPane();
-        
-        return pane.isZoomed();
-    }
-    
-    /**
-     * Asserts that the given part is zoomed. If the part is null, asserts
-     * that no parts are zoomed.
-     * 
-     * @param part
-     * @since 3.1
-     */
-    protected void assertZoomed(IWorkbenchPart part) {
-        if (part == null) {
-            Assert.assertFalse("Page should not be zoomed", isZoomed());
-        } else {
-            // Assert that the part is zoomed
-            Assert.assertTrue("Expecting " + partName(part) + " to be zoomed", isZoomed(part));
-            // Assert that the page is zoomed (paranoia check)
-            Assert.assertTrue("Page should be zoomed", isZoomed());
-        }
-    }
-
-    /**
-     * Asserts that the given part is active.
-     * 
-     * @param part
-     * @since 3.1
-     */
-    protected void assertActive(IWorkbenchPart part) {
-        IWorkbenchPart activePart = page.getActivePart();
-        
-        // Assert that the part is active
-        Assert.assertTrue("Unexpected active part: expected " + partName(part) 
-                + " and found " + partName(activePart), activePart == part);
-        
-        // If the part is an editor, assert that the editor is active
-        if (part instanceof IEditorPart) {
-            assertActiveEditor((IEditorPart)part);
-        }
-    }
-    
-    protected String partName(IWorkbenchPart part) {
-        if (part == null) {
-            return "null";
-        }
-        
-        return Util.safeString(part.getTitle());
-    }
-    
-    protected void assertActiveEditor(IEditorPart part) {
-        IWorkbenchPart activeEditor = page.getActiveEditor();
-        
-        Assert.assertTrue("Unexpected active editor: expected " + partName(part) 
-                + " and found " + partName(activeEditor), activeEditor == part);        
-    }
-    
-    // returns true if the page is not zoomed, false otherwise
-    protected boolean isZoomed() {
-        return page.isZoomed();
-    }
-    
-    public void close(IWorkbenchPart part) {
-        if (part instanceof IViewPart) {
-            page.hideView((IViewPart)part);
-        } else if (part instanceof IEditorPart) {
-            page.closeEditor((IEditorPart)part, false);
-        }
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomTestSuite.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomTestSuite.java
deleted file mode 100644
index 8b0c62b..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomTestSuite.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.zoom;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * A test suite to test the zooming behavior of Eclipse.
- */
-public class ZoomTestSuite extends TestSuite {
-    /**
-     * Returns the suite.  This is required to
-     * use the JUnit Launcher.
-     */
-    public static Test suite() {
-        return new ZoomTestSuite();
-    }
-
-    /**
-     * Construct the test suite.
-     */
-    public ZoomTestSuite() {
-        addTest(new TestSuite(ZoomedEditorActivateTest.class));
-        addTest(new TestSuite(ZoomedViewActivateTest.class));
-        addTest(new TestSuite(ZoomedEditorCloseTest.class));
-        addTest(new TestSuite(ZoomedViewCloseTest.class));
-        addTest(new TestSuite(ShowViewTest.class));
-        addTest(new TestSuite(OpenEditorTest.class));
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomedEditorActivateTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomedEditorActivateTest.java
deleted file mode 100644
index b9d8263..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomedEditorActivateTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.zoom;
-
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * @since 3.1
- */
-public class ZoomedEditorActivateTest extends ActivateTest {
-
-    /**
-     * @param name
-     */
-    public ZoomedEditorActivateTest(String name) {
-        super(name);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.zoom.ActivateTest#getStackedPart1()
-     */
-    public IWorkbenchPart getStackedPart1() {
-        return editor1;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.zoom.ActivateTest#getStackedPart2()
-     */
-    public IWorkbenchPart getStackedPart2() {
-        return editor2;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.zoom.ActivateTest#getUnstackedPart()
-     */
-    public IWorkbenchPart getUnstackedPart() {
-        return editor3;
-    }
-
-    /** 
-     * <p>Test: Zoom an editor then activate a view</p>
-     * <p>Expected result: page unzooms</p> 
-     */
-    public void testActivateView() {
-        zoom(editor1);
-        page.activate(stackedView1);
-        
-        assertZoomed(null);
-        assertActive(stackedView1);
-    }
-
-    
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomedEditorCloseTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomedEditorCloseTest.java
deleted file mode 100644
index 3c74b8a..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomedEditorCloseTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.zoom;
-
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * @since 3.1
- */
-public class ZoomedEditorCloseTest extends CloseTest {
-
-    /**
-     * @param name
-     */
-    public ZoomedEditorCloseTest(String name) {
-        super(name);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.zoom.CloseTest#getStackedPart1()
-     */
-    public IWorkbenchPart getStackedPart1() {
-        return editor1;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.zoom.CloseTest#getStackedPart2()
-     */
-    public IWorkbenchPart getStackedPart2() {
-        return editor2;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.zoom.CloseTest#getUnstackedPart()
-     */
-    public IWorkbenchPart getUnstackedPart() {
-        return editor3;
-    }
-    
-    /**
-     * <p>Test: Activate a view, then zoom an unstacked editor and close it.</p>
-     * <p>Expected result: The previously active Editor becomes active and unzoomed</p>
-     * <p>Note: This ensures that the activation list is used if there is nothing available
-     *    in the currently zoomed stack. It also ensures that activation never moves from
-     *    an editor to a view when an editor is closed.</p>
-     */
-    public void testCloseZoomedUnstackedEditorAfterActivatingView() {
-        IWorkbenchPart previousActive = stackedView1;
-        IWorkbenchPart zoomedPart = editor3;
-        
-        page.activate(editor1);
-        page.activate(previousActive);
-        zoom(zoomedPart);
-        close(zoomedPart);
-
-        assertZoomed(null);
-        assertActive(editor1);
-    }
-    
-    /**
-     * <p>Test: Activate an unstacked editor, activate an unstacked view, activate a stacked editor, 
-     *    then close the active editor.</p>
-     * <p>Expected result: The previously active editor becomes active (even though a view is next
-     *    in the activation list)</p>
-     * <p>Note: This isn't really a zoom test, but it ensures that activation doesn't move from an editor
-     *    to a view when the active editor is closed. Activating an editor in a different stack first 
-     *    ensures that activation WILL move between editor stacks to follow the activation order.</p> 
-     */
-    public void testCloseUnzoomedStackedEditorAfterActivatingView() {
-        page.activate(editor3);
-        page.activate(unstackedView);
-        page.activate(editor1);
-        close(editor1);
-        
-        // Ensure that activation moved to the previously active editor, even though
-        // a view was next in the activation list.
-        assertZoomed(null);
-        assertActive(editor3);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomedViewActivateTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomedViewActivateTest.java
deleted file mode 100644
index a241c0c..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomedViewActivateTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.zoom;
-
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * @since 3.1
- */
-public class ZoomedViewActivateTest extends ActivateTest {
-
-    /**
-     * @param name
-     */
-    public ZoomedViewActivateTest(String name) {
-        super(name);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.zoom.ActivateTest#getStackedPart1()
-     */
-    public IWorkbenchPart getStackedPart1() {
-        return stackedView1;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.zoom.ActivateTest#getStackedPart2()
-     */
-    public IWorkbenchPart getStackedPart2() {
-        return stackedView2;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.zoom.ActivateTest#getUnstackedPart()
-     */
-    public IWorkbenchPart getUnstackedPart() {
-        return unstackedView;
-    }
-
-    /** 
-     * <p>Test: Zoom a view then activate an editor</p>
-     * <p>Expected result: page unzooms</p> 
-     */
-    public void testActivateEditor() {
-        zoom(stackedView1);
-        page.activate(editor1);
-        
-        assertZoomed(null);
-        assertActive(editor1);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomedViewCloseTest.java b/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomedViewCloseTest.java
deleted file mode 100644
index 72b2d7e..0000000
--- a/tests/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/zoom/ZoomedViewCloseTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.tests.zoom;
-
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * @since 3.1
- */
-public class ZoomedViewCloseTest extends CloseTest {
-
-    /**
-     * @param name
-     */
-    public ZoomedViewCloseTest(String name) {
-        super(name);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.zoom.CloseTest#getStackedPart1()
-     */
-    public IWorkbenchPart getStackedPart1() {
-        return stackedView1;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.zoom.CloseTest#getStackedPart2()
-     */
-    public IWorkbenchPart getStackedPart2() {
-        return stackedView2;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.tests.zoom.CloseTest#getUnstackedPart()
-     */
-    public IWorkbenchPart getUnstackedPart() {
-        return unstackedView;
-    }
-
-    /**
-     * <p>Test: Zoom a view, then close the active editor.</p>
-     * <p>Expected result: The view remains zoomed and active. A new editor is selected as the
-     *    active editor.</p>
-     * <p>Note: The behavior of this test changed intentionally on 050416. Closing the active editor
-     *    no longer unzooms if a view is zoomed.</p> 
-     */
-    public void testCloseActiveEditorWhileViewZoomed() {
-        page.activate(editor1);
-        zoom(stackedView1);
-        close(editor1);
-        
-        assertZoomed(stackedView1);
-        assertActive(stackedView1);
-    }
-    
-    /**
-     * <p>Test: Zoom an unstacked view and close it.</p>
-     * <p>Expected result: The previously active part becomes active and unzoomed</p>
-     * <p>Note: This ensures that the activation list is used if there is nothing available
-     *    in the currently zoomed stack.</p>
-     */
-    public void testCloseZoomedUnstackedViewAfterActivatingView() {
-        IWorkbenchPart previousActive = stackedView1;
-        IWorkbenchPart zoomedPart = getUnstackedPart();
-        
-        page.activate(previousActive);
-        zoom(zoomedPart);
-        close(zoomedPart);
-
-        assertZoomed(null);
-        assertActive(previousActive);
-    }
-
-    /**
-     * <p>Test: Activate an unstacked view, activate a stacked part, then close the active part.</p>
-     * <p>Expected result: The unstacked part becomes active</p>
-     * <p>Note: This isn't really a zoom test, but it ensures that activation 
-     *    will move between stacks when there is no zoom.</p>
-     */
-    public void testCloseUnzoomedStackedViewAfterActivatingView() {
-        IWorkbenchPart activePart = getStackedPart1();
-        IWorkbenchPart unstackedPart = unstackedView;
-        
-        page.activate(unstackedPart);
-        page.activate(activePart);
-        close(activePart);
-        
-        // Ensure that the other part in the zoomed stack is now zoomed and active
-        assertZoomed(null);
-        assertActive(unstackedPart);
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/JFace-All Tests.launch b/tests/org.eclipse.ui.tests/JFace-All Tests.launch
deleted file mode 100644
index 2c9f613..0000000
--- a/tests/org.eclipse.ui.tests/JFace-All Tests.launch
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
-<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
-<booleanAttribute key="askclear" value="false"/>
-<booleanAttribute key="automaticAdd" value="true"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="checked" value="[NONE]"/>
-<booleanAttribute key="clearConfig" value="true"/>
-<booleanAttribute key="clearws" value="true"/>
-<booleanAttribute key="clearwslog" value="false"/>
-<booleanAttribute key="com.mountainminds.eclemma.core.INPLACE_INSTRUMENTATION" value="true"/>
-<listAttribute key="com.mountainminds.eclemma.core.INSTRUMENTATION_PATHS">
-<listEntry value="/org.eclipse.jface/bin"/>
-<listEntry value="/org.eclipse.core.commands/bin"/>
-</listAttribute>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
-<booleanAttribute key="default" value="true"/>
-<booleanAttribute key="includeOptional" value="true"/>
-<stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.ui.tests/Eclipse JFace Tests/org/eclipse/jface/tests/AllTests.java"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.jface.tests.AllTests"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.ui.tests"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<stringAttribute key="product" value="org.eclipse.sdk.ide"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="templateConfig" value=""/>
-<booleanAttribute key="tracing" value="false"/>
-<booleanAttribute key="useDefaultConfig" value="true"/>
-<booleanAttribute key="useDefaultConfigArea" value="false"/>
-<booleanAttribute key="useProduct" value="false"/>
-</launchConfiguration>
diff --git a/tests/org.eclipse.ui.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.ui.tests/META-INF/MANIFEST.MF
deleted file mode 100644
index d3ea65c..0000000
--- a/tests/org.eclipse.ui.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,32 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Eclipse UI Tests
-Bundle-SymbolicName: org.eclipse.ui.tests; singleton:=true
-Bundle-Version: 3.3.0.qualifier
-Bundle-ClassPath: uitests.jar
-Bundle-Activator: org.eclipse.core.internal.compatibility.PluginActivator
-Bundle-Vendor: Eclipse.org
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime.compatibility,
- org.eclipse.core.resources,
- org.eclipse.core.expressions,
- org.eclipse.ui,
- org.junit,
- org.eclipse.ui.ide,
- org.eclipse.ui.editors,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.ui.views,
- org.eclipse.text,
- org.eclipse.jface.text,
- org.eclipse.test.performance,
- org.eclipse.core.tests.harness,
- org.eclipse.ui.tests.harness,
- org.eclipse.core.filesystem,
- org.eclipse.core.databinding,
- org.eclipse.core.databinding.beans,
- org.eclipse.jface.databinding,
- org.eclipse.ui.navigator.resources
-Eclipse-AutoStart: true
-Plugin-Class: org.eclipse.ui.tests.TestPlugin
-Export-Package: org.eclipse.ui.tests.api
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/CommonNavigator.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/CommonNavigator.txt
deleted file mode 100644
index f8f6fcd..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/CommonNavigator.txt
+++ /dev/null
@@ -1,64 +0,0 @@
-This is a test list for the Common Navigator view. This list is a trimmed 
-down version of the Resource Navigator view component test plan.
-
-Edit Actions (Not yet supported in Common Navigator test pass [Coming in M5])
-	Verify that enablement of Copy, Delete, Add Bookmark is consistent with that of the Navigator view's context menu, and that 
-		the same behaviour occurs.
-
-Presentation
-	Verify that appropriate strings appear in all menu items and text fields.
-	Verify icons for file, folder and project.
-	Verify that the view shows appropriate scrollbars when its contents extends beyond its client area.
-
-Standard Object Actions (Not yet supported in Common Navigator test pass [Coming in M5])
-	Verify menu items: Copy, Move, Rename, Delete for all resouces.
-	Verify that the DELETE key maps to the Delete action.
-	Verify Delete on a read-only resource.
-	Verify Properties for projects, folders, files, and combinations of the same. 
-	Verify that when the view is active, the status bar shows the full path of the selected resource.
-
-Actions on Multiselected Items (Not yet supported in Common Navigator test pass [Coming in M5])
-	If two or more resources are multiselected, Rename is disabled.
-	If a project and its resource(s) are multiselected, Copy and Move are disabled.
-	If a folder and its child resource(s) are multiselected, Copy and Move are disabled. 
-	Verify Delete on multiselected resources.
-	Verify Copy and Move on multiselected files in the same project.
-
-File Specific Actions 
-	Verify menu content when file selected.	[Should include New> with 'Project' and 'Other', Open, and Open With, in addition to basic object contributions] 	 
-	Verify Add Bookmark only appears on files and the bookmark is created when invoked. (Not yet supported in Common Navigator test pass [Coming in M5])
-
-Folder Specific Actions (Not yet supported in Common Navigator test pass [Coming in M5])
-	Verify the copy to the same folder and the different folder.
-
-Project Specific Actions (Not yet supported in Common Navigator test pass [Coming in M5])
-	Menu includes group with Build, Refresh, Close Project and Open Project
-	Close Project appears only on an open project
-	Open Project appears only on a closed project
-	Both Open Project and Close Project appear when selection includes both an open and a closed project
-	For a closed project, Rename is disabled and Go Into, Build, Refresh, Close Project do not appear
-
-New Object Actions 
-	Invoke File New .. projects, items, other.	
-	Verify that the view's New menu is the same as File | New in the Window. (Not yet supported in Common Navigator test pass [Coming in M5])
-
-View Actions (Not yet supported in Common Navigator test pass [Coming in M5])
-	Invoke Sort | by Name, | by Type in the pulldown menu. Avoid using only a.java and b.txt for a testing case since the result is the same
-		regardless of the sort key.
-	Invoke Filters... with Select All, Deselect All options.
-	
-Navigation Actions (Not yet supported in Common Navigator test pass [Coming in M5])
-	The view keeps track of navigation history. Go Into and Go Up add an item. Back and Forward change the cursor in the history list.
-	Select a project or folder, invoke Go Into, Go to | Back, Go to | Forward, and Go to | Up.
-	Verify enablement of Go xx actions reflect selection and navigation history.
-		- Go Into is enabled when an open, non-empty project or a non-empty folder is selected 		
-		- Go Up is enabled when the input has a parent .  
-		- Go Forward is enabled when there are following items in the list, Go Back enabled when there are previous items.
-	Verify that the view's titlebar displays the simple name of its input, and that its tooltip displays the full path of its input.
-	Verify that the enablement and the actions of the navigation buttons in the local toolbar are consistent with the Navigate main menu.
-	Verify that when a navigation button in the local toolbar is enabled, the fullpath of where the button leads to is appended to the button's tooltip.
-		e.g If the path of the view's input is Project/Folder/MyFolder, the 'Up' button has the tooltip that says 'Up to Project/Folder'
-
-Persistence (Not yet supported in Common Navigator test pass [Coming in M5])
-	Verify that the sort type remains the same after closing and reopening the Navigator view
-	Verify that the input is persistent between sessions.
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/Component Tests.html b/tests/org.eclipse.ui.tests/Manual Component Tests/Component Tests.html
deleted file mode 100644
index da29433..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/Component Tests.html
+++ /dev/null
@@ -1,32 +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">
-   <title>Workbench Manual Component Tests</title>
-</head>
-<body>
-
-<h2>
-<b>Manual Component Tests for the Workbench (org.eclipse.ui)</b></h2>
-Last updated May 9, 2005
-
-<p>
-<br><a href="WorkbenchLayout.txt">Workbench Layout</a>
-<br><a href="WorkbenchAction.txt">Workbench Actions</a>
-<br><a href="WelcomeEditor.txt">Welcome Editor</a>
-<br><a href="Import.txt">Import</a>
-<br><a href="Export.txt">Export</a>
-<br><a href="Navigator.txt">Navigator View</a>
-<br><a href="CommonNavigator.txt">Experimental Navigator View</a>
-<br><a href="Outline.txt">Outline View</a>
-<br><a href="PropertiesView.txt">Properties View</a>
-<br><a href="Tasks.txt">Tasks View</a>
-<br><a href="Preferences.txt">Preferences</a>
-<br><a href="PropertiesDialog.txt">Properties Dialog</a>
-<br><a href="TextEditor.txt">Text Editor</a>
-<br><a href="Undo.txt">Integrated Undo</a>
-
-<br>&nbsp;
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/Export.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/Export.txt
deleted file mode 100644
index 6f33c9c..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/Export.txt
+++ /dev/null
@@ -1,105 +0,0 @@
-This is a test script for the export wizard.
-
-Common Properties for All Pages
-	Verify that all listboxes show appropriate scrollbars when 
-		their contents extends beyond their client area.
-	The Cancel button is enabled all the time.
-	Verify that Cancel discards all changes made to the wizard by 
-		doing the following:
-		- on the Select page, choose any one of items in the list and click Next.
-		- make change to the destination or the option settings or both.
-		- cancel the wizard.
-		- open the wizard again and ensure that the preselection of the Select page( if there was any ), and the values of 
-			the destination and the options remain the same as before the change.
-
-Select Page( first page )
-	The Next button is enabled only if there is selection in the list.
-	Verify that the destination from the most recent export, regardless 	
-		of session, is preselected in the listbox.
-	Verify icons for items in the list.
-
-Common Properties for the File System Page and the Zip File Page( second page )
-* Please run this test separately for each of the pages.
-	[Presentation]
-		The folder tree shows open projects only.
-		Verify icons for files in the file listbox.
-	[Enablement]
-		The Back and Browse button are enabled and the Next button 
-			is disabled all the time.
-		Finish is disabled if the destination folder is empty.
-		If nothing is selected when Finish is pressed a warning dialog 
-			appears.
-		The 'Select Types', 'Select All', and 'Deselect All' buttons 
-			are always enabled.
-	[Selection Action]
-		Verify that 'Select All' and 'Deselect All' work.
-		Selecting a folder resource shows all files it has in the 
-			file listbox.
-		Checking a folder resource checks all of its subfolders and 
-			its files, and always grey-checks its ancestor folders.
-		Unchecking a folder unchecks files and subfolders underneath it. 
-			It unchecks its ancestor folder recursively. 
-			If it is last resource checked. Otherwise, it grey-checks 
-				its ancestor recursively.
-		Checking a file always grey-checks the folder it is in.
-		Unchecking a file unchecks its ancestor folder recursively 
-			if it is last resource selected. 
-			Otherwise, it grey-checks its ancestor recursively.
-	[Select Types Dialog]
-		Verify that the 'Other Extensions' text box shows only those 
-			user-defined file types that are not in the list.
-			e.g. 
-			- type in *.java and click OK
-			- open the dialog again and ensure that the .java check box is checked and the textbox does NOT have .java in it.
-			- in the dialog, type in *.eclipse and click OK
-			- open the dialog again and ensure that the textbox has .eclipse in it.
-		The filter selects files by both checked file types and 
-			specified types from entire resources.
-		Invoking the filter updates appropriate checkboxes of files and 
-			folders.
-	[Destination]
-		The destination combo listbox is preselected with the most 
-			recent destination to which the user exported.
-		The destination combo listbox in the wizard stores the five 
-			most recent destinations to which resources were exported.
-	[Options]
-		The setting for common options are shared by pages.
-		If the Overwrite checkbox is unchecked, exporting a resource 
-			to the same destination twice pops up the Confirm Overwrite 
-			dialog.
-		If the Overwrite checkbox is checked, exporting a resource 
-			to the same destination twice does not invoke confirmation.
-	[Persistence]
-		Verify that the five most recent destinations stored in 
-			the destination listbox are persistent between sessions.
-		Verify that the settings of the options are persistent 
-			between sessions.
-	[Navigator View]
-		If the wizard is invoked while there is a resource(s) selected 
-			in the navigator view, those resource(s) are checked in the folder tree.
-
-File System Page
-	[Export]
-		Verify that all files are exported successfully to the 
-			specified destination.
-		If the 'Create directory structure' checkbox is unchecked, 
-			exporting creates a directory structure that roots from 
-			the root of the folder tree within the destination directory.
-		If the 'Create directory structure' checkbox is checked, 
-			exporting creates the same directory structure as the 
-			workspace within the destination directory.
-	[Browse for Folder Dialog]
-		The destination textbox of the dialog is preselected with 
-			the current destination folder from the dialog.
-		Specifying the destination in the dialog and then clicking OK 
-			updates the destination textbox of the wizard. Otherwise, 
-			the wizard is not updated.
-
-Zip File Page
-	Verify that a .zip file is exported successfully to the 
-		specified destination.	
-	Use an external ZIP program to verify the following:
-		- the ZIP file is extracted successfully by the ZIP program.
-		- the ZIP file made with the 'Create directory structure' 
-			checkbox turned on has the same directory structure 
-			as the workspace.		
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/FieldAssist.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/FieldAssist.txt
deleted file mode 100644
index 986a74b..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/FieldAssist.txt
+++ /dev/null
@@ -1,149 +0,0 @@
-This is a test list for the field assist component.  It is a work
-in progress.  Last updated 9-27-2007.
-
-Tests are conducted using the FieldAssistTestDialog in
-org.eclipse.ui.examples.fieldassist and the platform text 
-search and replace dialog.
-
-Field Assist Test Dialog
-
-The first tests should be conducted on all platforms until otherwise noted.
-Use the example preference page to adjust the parameters as needed
-for the test.
-
-**CONTENT ASSIST KEY**
-- Ctrl+Space invokes without delay
-- * invokes without delay
-- alphanumeric invokes on delay (try different delay settings including 0)
-- t,d invokes on delay (try different delay settings including 0)
-
-**AUTOACTIVATION COMPLETION**
-- turn on auto activation, and also test on the autocomplete fields
-- invoke the auto-popup
-- cursor to make a selection
-- hit the Enter key to confirm selection
-- the text should be inserted/replaced and the popup should remain closed.
-
-**NAVIGATION WHILE POPUP IS OPEN (but without focus)**
-- arrow up/down scroll through proposals
-- left/right move cursor in target control text
-- page up/down, home/end move through proposals
-- enter selects proposal
-- esc closes popup
-
-**NAVIGATION WHILE POPUP HAS FOCUS**
-- same as above except left/right arrow has no effect
-- on Mac, the home/end keys pg/up down, move but don't affect selection
-
-**PROPAGATE KEYSTROKES WHEN POPUP IS OPEN (but without focus)**
-- keystrokes typed while popup is open propagate to control when set to true
-- keystrokes typed while popup is open never propagate to control when false
-(Exception cases)
-- pg up/down, arrow up/down, home/end never propagate back to control
-regardless of setting (ie, combo selection doesn't change, etc.)
-- arrow left/right always propagate to control regardless of setting.  Cursor
-position should change
-
-**SECONDARY POPUP**
-- only shows when option is checked
-- updates on a delay (not with every cursor through the table)
-- if you cursor to an item ("tori") that has no secondary info,
-the popup should close
-
-**CONTENT PROPOSAL ACCEPTANCE**
-- test insert and replace modes with various text selected
-
-**FILTERING STYLE**
-- cumulative filter should be applied and backspace reduces filter by one
-character
-- single character filter is backed out on backspace
-- cursor left shouldn't affect filter in either case above (neither should
-cursor right)
-- if cumulative filter resolves to no choices, popup should remain open
-(note this is different than when filtering for autocomplete)
-- FILTER_NONE should never filter
-- when autoactivation is on, it is expected that the autoactivation key
-would *not* be in the filter.  See bug #141084 comment #5.
-
-**POPUP SIZING**
-- sizing primary popup should size secondary and it should move to fit on
-screen
-
-**POPUP LOCATION**
-- the popup should be butted under the field when in replace mode.
-- the popup should be closer to the cursor position when in insert mode.
-- verify that the y location of the popup is correct in the multi-line text field
-
-**POPUP DEACTIVATION**
-- popup closes when dialog is moved
-- popup closes when another app is activated
-- popup closes when another field in the dialog is clicked
-
-**AUTOCOMPLETE POPUP NOT TRIGGERED BY COMBO SELECTION**
-- Select a user name in the autocomplete combo.  The popup should not
-trigger.
-- Select a user name in the autocomplete combo while the popup is open.
-It should close.  (On Linux it stays open if already open)
-
-**MULTILINE TEXT**
-- popup positioning for insert mode should respect
-vertical position in multiline text.
-
-These tests do not need to be tested on each platform.
-
-**AUTOCOMPLETE INCLUDES EXACT MATCHES IN POPUP
-- Type "Tod" in an autocomplete field.
-- You should see "Todd" and "Tod" as choices.  Type another d and it
-should resolve to the last remaining choice.
-
-**AUTOCOMPLETE POPUP CLOSES WHEN NO MORE AVAILABLE CHOICES**
-- Type "Todde" and the popup should close on the e.
-- Backspace and the popup should reappear.
-- Should be able to backspace to nothing and popup stays open
-
-**AUTOCOMPLETE SHOULDN'T OPEN IF NO CHOICES**
-- Type "X" and you shouldn't see an empty popup.
-- Backspace and you should not get a popup
-
-Search and Replace Dialog (with regular expressions enabled)
-
-**INSERT MODE WITH PROPER CURSOR PLACEMENT
-- Type "abc", set caret to after "a"
-- Use content assist to insert \t
-- Text should be "a\tbc" with cursor after the t
-
-**SELECTION TAKEN INTO ACCOUNT ON INSERT MODE
-- Type the word "Foobar" into the find field
-- Select "oob", type '\' and make a selection for '\n' in the popup.
-- You should see "F\nar"
-
-**DIFFERENT SELECTION STYLES WHEN POPUP EXPLICITLY ACTIVATED**
-- Try the scenarios above with different styles for activating and selecting
-from content assist:
-- Ctrl+Space, doubleclick with mouse to insert proposal
-- Ctrl+Space, use cursor keys and enter key to insert
-- Ctrl+Space, type "\", then use mouse to insert
-- Ctrl+Space, type "\", then use keyboard to insert
-
-**DIFFERENT SELECTION STYLES WHEN AUTOACTIVATED**
-- Try the scenarios above with different styles for activating and selecting
-from content assist:
-- type '\', doubleclick with mouse to insert proposal
-- type '\', use cursor keys and enter key to insert
-
-**CURSOR POSITION SET IN THE MIDDLE OF INSERTED TEXT**
-- type "abc", move cursor between a and b
-- type "(?"
-- proposals starting with "(?" are first
-- choose the proposal insert proposal (?<=)
-- text is "a(?<=)bc", caret is after  "="
-
-**AUTOACTIVATION CANCELS ON KEYSTROKE**
-- Type the '\' character and pause, this will trigger the popup.  Cancel it.
-- Type '\a' quickly and the popup should never launch.
-
-**CURSOR RELATED FILTERING**
-- Using arrow left/right while popup is open can change the popup contents
-(since filtering is specific to cursor position)
-- Using BS when field is empty should never reload popup
-
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/FilteredResourcesSelectionDialog.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/FilteredResourcesSelectionDialog.txt
deleted file mode 100644
index f877a10..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/FilteredResourcesSelectionDialog.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-This is a test list for the Filtered Resources Selection Dialog.
-
-Presentation
-	Verify that appropriate resources appear in dialog. Duplicates should have additional information about container.
-	Verify icons for resources.
-	Verify that icons are appropriate decorated eg by CVS label decorator.
-	Verify that separator appear in properly place between history resources and other.
-	Verify that resources appear in right order: 
-		1) history items in alphabetical order
-		2) separator
-		3) rest of resources in alphabetical order
-	Verify that correct container details are shown for selected resource. 
-		In multiselection details not appear.
-	Verify that different patterns return expected list of resources (partly overlapped by SearchPatternAuto JUnit test, this section will be removed when unit test covers all cases): 
-		Eg: - "XY "	- pattern exact match should found resources named "XY" with case insensitive
-			- "XY<" - pattern exact match should found resources named "XY" with case insensitive
-			- "XY"  - pattern camel case match resource in similar way to regexp pattern "X[^A-Z]*Y.*" or "XY.*"
-			- "X*Y" - pattern match resource name in similar way to regexp "X.*Y"
-			- ""	- blank test should return only history elements if any
-			- other: feel free to type anything
-	
-Actions
-	Verify that all selected elements are added to history after being clicked ("OK" button has been pressed or item has beed double-clicked).
-	Verify that all selected elements are opened in a right editor after being clicked.
-	Verify that you can remove all selected history resources. 
-	verify that you can remove only history elements, you shouldn't be able to remove separator nor non-historical resources. 
-	Verify that multiselection works properly. You should select more than one elements and perform all above actions.
-	Verify that mark/unmark show derived resource action caused appear/disappear derived resources.
-	Verify that mark/unmark show status line action caused appear/disappear show status line.
-	Verify that marking working set makes only resources from selected working set to appear.
-	Verify that after selecting text in an editor opened dialog will have selected text set as initial pattern (with full selection on it).
-	
-	
-Persistance 
-	Verify that all settings of the dialog are persisted between sessions:
-		- window size, 
-		- window position, 
-		- show derived tick, 
-		- show status line tick, 
-		- selected working set,
-		- history of selected resources
-		
-	Verify that all history elements are persisted between session. 
-	Verify the consistency synchronization of history elements with workspace.
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/Import.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/Import.txt
deleted file mode 100644
index cdb51ca..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/Import.txt
+++ /dev/null
@@ -1,79 +0,0 @@
-This is a test list for the import wizard.
-
-Common Properties for All Pages
-	Verify that all listboxes show appropriate scrollbars when 
-		their contents extends beyond their client area.
-	The Cancel button is enabled all the time.
-	Verify that Cancel discards all changes made to the wizard by doing 
-		the following:
-		- on the Select page, choose any one of items in the list and 
-			click Next.
-		- make change to the destination or the option settings or both.
-		- cancel the wizard.
-		- open the wizard again and ensure that the preselection of 
-			the Select page( if there was any ), and the values of 
-			the destination and the options remain the same as before 
-			the change.
-
-Select Page( first page )
-	The Next button is enabled only if there is selection in the list.
-	Verify that the source from the most recent import, regardless 
-		of session, is preselected in the listbox.
-	Verify icons for items in the list.
-
-Common Properties for Import Pages( second page )
-* Please run this test separately for each of the pages
-	[Presentation]
-		The source combo listbox stores the five most recent 
-			sources from which resources were imported.
-		Verify icons for files in the file listbox.
-	[Enablement]
-		The Back button is enabled and the Next button is greyed out all the time.
-		Both of the Browse buttons are enabled.
-		The 'Select Types', 'Select All', and 'Deselect All' buttons are enabled only if there is at least one item in the folder tree.
-		Finish is enabled only if there is one or more resources selected and the destination folder is not empty.
-	[Selection Action]		
-		Verify that 'Select All' and 'Deselect All' work.
-		Selecting a folder resource shows all files it has in the file listbox.
-		Checking a folder resource checks all of its subfolders and its files, and always grey-checks its ancestor folders.
-		Unchecking a folder unchecks files and subfolders underneath it. It unchecks its ancestor folder recursively if 
-			it is last resource checked. Otherwise, it grey-checks its ancestor recursively.
-		Checking a file always grey-checks the folder it is in.
-		Unchecking a file unchecks its ancestor folder recursively if it is last file selected. Otherwise, it grey-checks its ancestor recursively.
-	[Select Types Dialog]
-		Verify that the 'Other Extensions' text box shows only those user-defined file types that are not in the list.
-		e.g. 
-			- type in *.java and click OK
-			- open the dialog again and ensure that the .java check box is checked and the textbox does NOT have .java in it.
-			- in the dialog, type in *.eclipse and click OK
-			- open the dialog again and ensure that the textbox has .eclipse in it.
-		Verify that the filter selects files by both checked file types and specified types among the selected resources only.
-		Verify that invoking the filter updates appropriate checkboxes of files and folders.
-		Verify that invoking the filter by one type and then immediately by a different type leaves all resources unchecked.
-	[Destination Folder Selection Dialog]
-		Go-into is enabled only if the selected folder has a subfolder.
-		If the root of the tree widget is the same as the root of the workspace, Home is enabled and Back is not.
-		If the root of the tree widget is NOT the same as the root of the workspace, Home is disabled and Back is enabled.
-		Verify that Home, Back, and Go-Into work.
-		Selecting a folder shows its complete path in the text box.
-		Clicking on OK in the dialog updates the contents of the Folder textbox in the wizard.
-	[Options]
-		The setting for common options are shared by pages.
-		If the Overwrite checkbox is unchecked, importing a resource to the same destination twice pops up the Confirm Overwrite dialog.
-		If the Overwrite checkbox is checked, you can import a resource to the same destination twice without confirming it.
-	[Navigator View]
-		Verify that the navigator view is updated after importing.
-	[Persistence]
-		Verify that the five most recent sources stored in the source combo listbox are persistent between sessions.
-		Verify that the settings of the options are persistent between sessions.
-
-File System Page
-	Selecting a source directory shows its folder structure using itself as the root in the left tree.
-	Verify that all of the selected resources are imported successfully.	
-	If the 'Complete folder structure' checkbox is unchecked, importing a resource creates a folder structure relative 
-		to the root of the tree widget in the destination folder.
-	If the 'Complete folder structure' checkbox is checked, importing a resource creates a folder structure using the 
-		source's absolute path in the destination folder.
-
-Zip File Page
-	Selecting a source archive shows its folder structure in the left tree AND checks all of resources in it.
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/Navigator.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/Navigator.txt
deleted file mode 100644
index e2db473..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/Navigator.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-This is a test list for the navigator view.
-
-Edit Actions
-	Verify that enablement of Copy, Delete, Add Bookmark is consistent with that of the Navigator view's context menu, and that 
-		the same behaviour occurs.
-
-Presentation
-	Verify that appropriate strings appear in all menu items and text fields.
-	Verify icons for file, folder and project.
-	Verify that the view shows appropriate scrollbars when its contents extends beyond its client area.
-
-Standard Object Actions
-	Verify menu items: Copy, Move, Rename, Delete for all resouces.
-	Verify that the DELETE key maps to the Delete action.
-	Verify Delete on a read-only resource.
-	Verify Properties for projects, folders, files, and combinations of the same. 
-	Verify that when the view is active, the status bar shows the full path of the selected resource.
-
-Actions on Multiselected Items
-	If two or more resources are multiselected, Rename is disabled.
-	If a project and its resource(s) are multiselected, Copy and Move are disabled.
-	If a folder and its child resource(s) are multiselected, Copy and Move are disabled. 
-	Verify Delete on multiselected resources.
-	Verify Copy and Move on multiselected files in the same project.
-
-File Specific Actions
-	Verify menu content when file selected.	 	 
-	Verify Add Bookmark only appears on files and the bookmark is created when invoked.
-
-Folder Specific Actions
-	Verify the copy to the same folder and the different folder.
-
-Project Specific Actions
-	Menu includes group with Build, Refresh, Close Project and Open Project
-	Close Project appears only on an open project
-	Open Project appears only on a closed project
-	Both Open Project and Close Project appear when selection includes both an open and a closed project
-	For a closed project, Rename is disabled and Go Into, Build, Refresh, Close Project do not appear
-
-New Object Actions
-	Invoke File New .. projects, items, other.	
-	Verify that the view's New menu is the same as File | New in the Window.
-
-View Actions
-	Invoke Sort | by Name, | by Type in the pulldown menu. Avoid using only a.java and b.txt for a testing case since the result is the same
-		regardless of the sort key.
-	Invoke Filters... with Select All, Deselect All options.
-	
-Navigation Actions
-	The view keeps track of navigation history. Go Into and Go Up add an item. Back and Forward change the cursor in the history list.
-	Select a project or folder, invoke Go Into, Go to | Back, Go to | Forward, and Go to | Up.
-	Verify enablement of Go xx actions reflect selection and navigation history.
-		- Go Into is enabled when an open, non-empty project or a non-empty folder is selected 		
-		- Go Up is enabled when the input has a parent .  
-		- Go Forward is enabled when there are following items in the list, Go Back enabled when there are previous items.
-	Verify that the view's titlebar displays the simple name of its input, and that its tooltip displays the full path of its input.
-	Verify that the enablement and the actions of the navigation buttons in the local toolbar are consistent with the Navigate main menu.
-	Verify that when a navigation button in the local toolbar is enabled, the fullpath of where the button leads to is appended to the button's tooltip.
-		e.g If the path of the view's input is Project/Folder/MyFolder, the 'Up' button has the tooltip that says 'Up to Project/Folder'
-
-Persistence
-	Verify that the sort type remains the same after closing and reopening the Navigator view
-	Verify that the input is persistent between sessions.
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/Outline.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/Outline.txt
deleted file mode 100644
index 4834d89..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/Outline.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-This is a test list for the outline view. The outine view is a container for pages contributed by open editors. 
-We test the contribution and activation of those pages.
-
-Presentation
-	Verify that the view shows appropriate scrollbars when its contents extends beyond its client area.
-
-Activation
-	If you open a java editor or activate one, its outline contents appears in outline view.	
-	Switch between two or more java editors to verify the view is updated.
-	Switching between java editors updates the outline view's local toolbar and context menu.
-	Close one java editor, activating another, and see page in outline change.
-	Switching from a java editor to a text editor shows blank in the outline view.
-	Close last java editor to see the default blank page in outline.
-
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/Preferences.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/Preferences.txt
deleted file mode 100644
index 03df14f..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/Preferences.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-This is a test list for the preferences dialog.
-
-Presentation
-	Verify that the listbox on the left shows appropriate scrollbars 
-		when its contents extends beyond its client area.
-	Verify that the window grows to fit the content page of the 
-		selected item.
-	Verify that you can traverse all widget groups by pressing TAB.
-
-Actions
-	Clicking on a item in the tree shows the corresponding page on 
-		the right, including the page title.
-	Verify that Defaults sets all fields to the default values for 
-		the current content page ONLY.
-	Verify that OK stores all changes made to fields by doing the following:
-		- make some changes to checkboxes, option buttons, and textboxes.
-		- click OK.
-		- open the dialog again and ensure that all the changes were saved.
-	Verify that Cancel discards all changes made to fields by doing 
-		the following:
-		- make some changes to checkboxes, option buttons, and textboxes.
-		- click Cancel.
-		- open the dialog again and ensure that all the field values 
-			are the same as before the change.
-	Verify that ESC maps to Cancel.
-	Verify that Apply stores all changes made to values by doing the 
-		following:
-		- make some changes to checkboxes, option buttons, and textboxes.
-		- click Apply and then Cancel.
-		- open the dialog again and ensure that all the changes were saved.
-	Verify that Apply immediately updates the workbench settings by 
-		doing the following:
-		- open a text file with the default text editor.
-		- type something in the editor
-		- open the preferences dialog, and click on Workbench | Default 
-			Text Editor
-		- click Change... At the Font dialog, select a different font 
-			and a different font size. Click OK.
-		- at the preferences dialog, Click Apply
-		- without closing the preferences dialog, ensure that the 
-			settings for the text editor are updated.
-
-Persistence
-	Verify that all field values are persistent all the time.
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/PropertiesDialog.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/PropertiesDialog.txt
deleted file mode 100644
index d0b8aea..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/PropertiesDialog.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-This is a test script for the properties dialog.
-
-Presentation
-	Verify that the listbox on the left shows appropriate scrollbars 
-		when its contents extends beyond its client area.
-	Verify that the window grows to fit the content page of the 
-		selected item.
-	Verify that you can traverse all widget groups by pressing TAB.
-	Verify that the title bar shows the name of the resource about 
-		which the dialog shows information.
-
-Actions
-	Clicking on a item that contributes in the tree shows the 
-		corresponding page on the right, including the page title.
-	Clicking on a item that does not contribute in the tree shows 
-		the default page on the right.
-		e.g. In the packages view, open the dialog on a package. The 
-			Team page should show the default page.
-	Verify that OK stores all changes made to fields by doing the following:
-		- make some changes to checkboxes, option buttons, and textboxes.
-		- click OK.
-		- open the dialog again and ensure that all the changes were saved.
-	Verify that Cancel discards all changes made to fields by doing 
-	the following:
-		- make some changes to checkboxes, option buttons, and textboxes.
-		- click Cancel.
-		- open the dialog again and ensure that all the field values 
-			are the same as before the change.
-	Verify that ESC maps to Cancel.
-	Verify that Apply stores all changes made to values by doing 
-	the following:
-		- make some changes to checkboxes, option buttons, and textboxes.
-		- click Apply and then Cancel.
-		- open the dialog again and ensure that all the changes were saved.
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/PropertiesView.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/PropertiesView.txt
deleted file mode 100644
index 4719147..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/PropertiesView.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-This is a test list for the properties view. The properties view is a container for pages contributed by open views and editors.
-We test the contribution and activation of pages in the view.
-
-Presentation
-	Verify that the view shows appropriate scrollbars when its contents extends beyond its client area.
-
-Activation
-	If you open a view with properties, verify that the page, the local toolbar and local menu bar in properties view are updated.
-		e.g. Open the navigator view and see the change in the properties view.
-	If you open another view, its own properties page should appear.
-	Switch between two or more components to see page in view change.
-	Close one part, activating another, to see page in view change.
-	Close last editor to see default blank page in the view.
-	Verify that the view shows the default page when the active view doesn't have source.
-	Make sure Edit menu in the workbench targets the active page in the view.
-	Verify that the enablement and action of the Categories, Filter, and Defaults buttons are consistent with the view's 
-
-		pulldown menu.
-
-Navigator View
-	Verify that toggling the Show/Hide-Categories button shows/hides items in the corresponding category tree.
-	Verify that the properties view shows correct values in the following fields for a selected resource in the navigator view
-		editable, last modified, name, and path
-	Verify that only files have values in the size field.
-
-Perisistence
-	Verify that on start-up of the view, the view displays properties for the active part and selection of the contributing view.
-
-Property Sheet Example
-	Before verifying any of the following tests, do:
-		1. Make sure the workbench example is already installed
-		   i.e., checkout org.eclipse.ui.examples.propertysheet and launch a run-time workbench
-		2. Create a .usr file and open it 
-		3. Show both the outline view and the properties view	
-
-	Verify that the 'Show/Hide Category' toggle button and the 'Restore Default' button work.
-	Verify that selecting an item in the outline view shows all properties in the properties view.
-	Verify that multiselecting items shows only their common properties.
-	Verify that change made to a value for an item is persistent in same session.
-	Verify that modifying a value for multiselected items changes the values for all of the selected items.
-	Verify that changing the Name value for an item updates the page in the outline view.
-	Verify that changing the Name values for multiselected items in the outline view updates the page in the outline view.	
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/StatusHandling.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/StatusHandling.txt
deleted file mode 100644
index 2b17ae5..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/StatusHandling.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-This is a test list for Status Handling (StatusManager, etc.):
-	
-Status Handling:
-	Main Set Up: Launch Eclipse with org.eclipse.ui.examples.statushandlers.testtool, open the 
-	'Status Generator' view (view category: 'Status Handling').	To execute tests use 'Execute tab'
-	button. Use this tool to perform all tests placed below. 
-	
-  Runnables
-	* Set Up: Select 'Jobs And Runnables' tab, set duration to 1 second
-	* Please run this test separately for each of the Exceptions/Errors listed in this tab. 
-	
-	Verify that 'Run In UI thread (does not fork)' radio selection causes a stack trace to be sent 
-		to the standard output
-	Verify that 'Runnable in Window' radio selection causes a stack trace to be sent to the standard 
-		output
-		
-  Jobs
-	* Set Up: Select 'Jobs' radio, set duration to 1 second, set 'Quantity' to 2
-	* Please run this test separately for each of the Exceptions/Errors listed in this view
-	
-	Verify that 'Create jobs' button causes two exceptions/errors (from two jobs) to be displayed
-		in a single dialog and logged into the WorkbenchPlugin log (.metadata/.log)
-
-  Views/Editors
-	* Set Up: Switch the 'Status Generator' view to the 'Views' tab.
-	
-	Verify that every possible configuration causes an empty view to be displayed and thrown 
-		exception to be looged into the WorkbenchPluging log (.metadata/.log)
-		
-  StatusHandling
-	* Set Up: Switch the 'Status Generator' view to the 'Status Handling' tab.	
-	
-	For every show/log combination (none, log, show, show and log) add one status. 
-		(Use 'Add status to the list' button and 'Show status' & 'Log status' checkboxes)
-	
-	Verify that:
-	 	- all of the statuses with 'log' property on to be logged into the WorkbenchPlugin 
-	 		log (.metadata/.log)
-	 	- all of the statuses with 'show' property on to be displayed in a single dialog
-	 	- status dialog icon is adjusted to the status severity
-	 	- "Show support" button appears with an image in the bottom left side of the dialog.
-	 	
-	* Modality test
-	Clear the list. Create status with 'Show status'. Press 'Execute tab' button.
-	Verify that status dialog is not modal. 
-	Now without closing the dialog, add new status with 'Show status' & 'Block' flag. 
-	Verify that status dialog is modal. 
-	
-	* Support test (bugs 227659, 221856)
-	Enable Support in SHMenu. Create status with 'Show status'. Press 'Execute tab' button.
-	Verify that "Support" action is active. Use it. Verify that support tray shows status 
-	message and the "Support" action became inactive. Close tray area. Verify that 
-	"Support" action is active again. 
-	Repeat for more than one status.
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/Tasks.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/Tasks.txt
deleted file mode 100644
index d0af404..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/Tasks.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-This is a test list for the tasks view.
-
-Presentation
-	Verify that appropriate strings appear in all menu items and text fields.
-	Verify icons for task items and problem items.
-	Verify that the title bar shows the correct number of filtered items and total items.
-	Verify that the view shows appropriate scrollbars when its contents extends beyond its client area.
-
-Common Actions
-	Verify that header buttons in the table sort records by their respective column values in ascending/descending order alternatively.
-	Verify that items that belong to files such as compile time errors are displayed only if their projects are open.
-	Verify that Go To File is enabled only on file-bound items.
-	Verify that double-click or Go To File on a file-bound item opens the file, if not alreadly open, and locates the code in the editor.
-
-Task Actions in Tasks View
-	Verify that New Task, Delete, Delete Completed Tasks work.
-	Verify that Delete is enabled only on task items.
-	Verify that invoking Delete on a task item in an open file deletes the task marker from the editor.
-	Verify that the enablement and action of the New Task and Delete buttons are consistent with those in the context menu.
-	Verify that the DELETE button on the keyboard maps to Delete.
-	Verify that the task status( completion ) and priority can be set for task items only.
-
-Problem Actions in Tasks View
-	Verify that selecting a problem item displays its description message in the status bar of the workbench window.
-
-Filter Tasks Dialog
-	Change the values then verify that the Reset button sets those values to default.
-	Verify that tasks are filtered by the corresponding criterion of the On-any-resouce, On-selected-resouce-only, and 
-		On-selected-resouce-and-its-children radio buttons.
-	Verify that tasks are filtered based on query word iff the description text box is not empty.
-	Verify that only those tasks that contain( do not contain ) the query string show in the task view if the description combo-box 
-		has the value "Contains"( Does not contain ).
-	Verify that the Where-problem-severity-is checkbox is enabled iff at least one of Build-path-Problem and Java-Problem in the tree is checked.
-	Verify that the Where-task-priority-is and Where-task-status-is check boxes are enabled iff Task in the tree is checked.
-	Verify that the enablement of the Where~ checkboxes determines the enablement of their option check boxes.
-	Verify that a newly created task by New Task is affected by the current setting of the filter.
-
-Actions in Text Editor
-	Verify that for a line that doesn't have a task, you can add one. It should appear in the vertical ruler and in the view
-		with adequate values set in the Resouce, In Folder, and Location fields.
-	Verify that for a line that has a task. you can remove the task. It disappears from the vertical ruler and from the view.
-	Verify that selecting a task item from the view opens the file, if not already open, and locates the code. 
-
-Persistence
-	Verify that the view retains its items after being closed and reopened.
-	Verify that the view maintains the sort order and filtering between sessions.
-	Verify that the top index and the selection of the view are consistent between sessions, and after inserting or detaching the view.
-	
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/TextEditor.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/TextEditor.txt
deleted file mode 100644
index 9d0075f..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/TextEditor.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-This is a test list for the text editor.
-
-Presentation
-	Verify that appropriate strings appear in all menu items and text fields.
-	Verify that the view shows appropriate scrollbars when its contents extends beyond its client area.
-
-Editor Actions
-	Verify that Cut and Copy are enabled iff there is selected text.
-	Verify that Paste is enabled iff there is text in the clipboard buffer.
-	Verify that Cut, Copy, Paste, Select-All work correctly.
-	Verify that Revert is enabled only if is the file dirty and works correctly.
-
-Edit Menu Actions
-	Verify that the enablement and action of Cut, Copy, Paste, and Select-All in the Edit menu are consistent with those in the editor's context menu.
-
-Persistence	
-	The editor is marked dirty if the text is modified by either the keyboard OR the editor actions.
-	The editor is marked clean after either saving the file or reverting it.
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/Undo test files/A.java b/tests/org.eclipse.ui.tests/Manual Component Tests/Undo test files/A.java
deleted file mode 100644
index 9d15e9d..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/Undo test files/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation 
-******************************************************************************/
-package xxx;
-public class A {
-	public void foo() {
-		
-	}
-
-}
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/Undo test files/B.java b/tests/org.eclipse.ui.tests/Manual Component Tests/Undo test files/B.java
deleted file mode 100644
index a51a68d..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/Undo test files/B.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation 
-******************************************************************************/
-package xxx;
-public class B {
-	void bar() {
-		A a=null;
-		a.foo();
-	}
-}  
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/Undo test files/C.java b/tests/org.eclipse.ui.tests/Manual Component Tests/Undo test files/C.java
deleted file mode 100644
index 553f0bb..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/Undo test files/C.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation 
-******************************************************************************/
-package xxx;
-public class C {
-	void bar() {
-		A a=null;
-		a.foo();
-	}
-}  
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/Undo test files/D.java b/tests/org.eclipse.ui.tests/Manual Component Tests/Undo test files/D.java
deleted file mode 100644
index 2d2559d..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/Undo test files/D.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation 
-******************************************************************************/
-package xxx;
-public class D {
-	void bar() {
-		A a=null;
-		a.foo();
-	}
-}  
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/Undo.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/Undo.txt
deleted file mode 100644
index a6228f6..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/Undo.txt
+++ /dev/null
@@ -1,190 +0,0 @@
-This is a test list for the integrated undo/redo framework
-
-Actions
-	Verify that "Undo Typing" appears in action bar edit menu and editor popup menu once text has been typed.
-	Verify that "Redo Typing" appears in action bar edit menu immediately after an undo has been performed.
-	Move between different editors and verify that the undo/redo state matches the current editor and that the undo performs the expected operation.
-	Verify that "Undo <name of refactoring op>" appears in action bar edit menu and editor popup menu immediately after performing a refactoring from that editor.
-	Verify that "Undo <name of refactoring op>" appears in action bar edit menu of Package Explorer and Navigator after performing a refactoring from anywhere.
-
-Preferences
-	Set different text undo limits (including 0) in the text editor preferences (General>Editors>TextEditors>Undo history size) and verify they work as expected.
-Integrated Scenarios
-  <setup>
-	For the following text-refactoring integrated scenarios, do the following first:
-	a.  Create a Java project "Undo Scenarios".
-	b.  Create a package "xxx".
-	c.  Copy the java files provided in org.eclipse.ui.tests/ManualComponentTests/Undo test files to "xxx".
-  <simple refactoring undo>
-  	a.  Open A.Java and B.java
-  	b.  In A, click in the method name for "bar" and choose Refactor>Rename
-  	c.  Rename "bar" to "bar2"
-  	d.  Verify that "Undo Rename method bar to bar2" appears in Edit>Undo in pulldown menu of editor, editor popup, Package Explorer, and Navigator.
-  	e.  Select "Undo Rename method bar to bar2" from any of these locations
-  	f.  Operation is undone without prompting or warning
-  	g.  Verify that "Redo Rename method bar to bar2" appears in Edit>Undo pulldown menu for the editor, Navigator, and Package Explorer.
-  	h.  Select "Redo Rename method bar to bar2" from any of these locations
-  	i.  Operation is redone without prompting or warning
-  	j.  Undo again to revert files to original state and close editors.
-  <prompt on non-local undo, proceed>
-    a.  Open A.Java and B.java
-  	b.  In A, click in the method name for "foo" and choose Refactor>Rename
-  	c.  Rename "foo" to "foo2"
-  	d.  Verify that "Undo Rename method foo to foo2" appears in Edit>Undo in pulldown menu of editor, editor popup, Package Explorer, and Navigator.
-  	e.  Select "Undo Rename method foo to foo2" from A's edit menu.
-  	f.  Operation prompts as to whether you want to proceed since the refactoring affects other files.
-  	g.  Select "yes" and operation is undone.
-  	h.  Select "Redo Rename method foo to foo2" from package explorer.
-  	i.  Operation prompts as to whether you want to proceed since the refactoring affects other files.
-  	j.  Undo again to revert files to original state and close editors.
-  <prompt on non-local undo, cancel>
-    a.  Open A.Java and B.java
-  	b.  In A, click in the method name for "foo" and choose Refactor>Rename
-  	c.  Rename "foo" to "foo2"
-  	d.  Verify that "Undo Rename method foo to foo2" appears in Edit>Undo in pulldown menu of editor, editor popup, Package Explorer, and Navigator.
-  	e.  Select "Undo Rename method foo to foo2" from A's edit menu.
-  	f.  Operation prompts as to whether you want to proceed since the refactoring affects other files.
-  	g.  Select "cancel" and operation is cancelled.
-  	h.  Verify that "Undo Rename method foo to foo2" is still in the Edit>Undo menu.
-  	i.  Select "Undo Rename method foo to foo2" again, choosing "yes" when prompted.
-  	j.  Close editors
-  <prompt on non-local undo, discard undo>
-    a.  Open A.Java and B.java
-  	b.  In A, click in the method name for "foo" and choose Refactor>Rename
-  	c.  Rename "foo" to "foo2"
-  	d.  Verify that "Undo Rename method foo to foo2" appears in Edit>Undo in pulldown menu of editor, editor popup, Package Explorer, and Navigator.
-  	e.  Select "Undo Rename method foo to foo2" from A's edit menu.
-  	f.  Operation prompts as to whether you want to proceed since the refactoring affects other files.
-  	g.  Select "Discard Undo" and operation is cancelled.
-   	h.  Choose "Undo Typing" from A to revert the text part of the refactoring
-  	i.  Go to B and choose "Undo Typing" to revert the text part of the refactoring change.
-  	j.  Close editors
-  <prompt on non-local undo, do not proceed, with undo/redo in between (bug 97939)
-    a.  Open A.Java and B.java
-  	b.  In A, click in the method name for "foo" and choose Refactor>Rename
-  	c.  Rename "foo" to "foo2"
-  	d.  Verify that "Undo Rename method foo to foo2" appears in Edit>Undo in pulldown menu of editor, editor popup, Package Explorer, and Navigator.
-  	e.  Select "Undo Rename method foo to foo2" from A's edit menu.
-  	f.  Operation prompts as to whether you want to proceed since the refactoring affects other files.
-	g.  Select "yes" and operation is undone.
-  	h.  Select "Redo Rename method foo to foo2" from package explorer.
-  	i.  Operation prompts as to whether you want to proceed since the refactoring affects other files.
-    j.  Select "yes" and operation is redone.
-  	k.  Select "Undo Rename method foo to foo2" from A's edit menu.
-  	l.  Operation prompts as to whether you want to proceed since the refactoring affects other files.
- 	m.  Select "Discard Undo" and operation is cancelled.
-  	n.  Choose "Undo Typing" from A to revert the text part of the refactoring
-  	o.  Go to B and choose "Undo Typing" to revert the text part of the refactoring change.
-  	p.  Close editors
-  <detection of changed file>
-    a.  Open A.Java and B.java
-  	b.  In A, click in the method name for "foo" and choose Refactor>Rename
-  	c.  Rename "foo" to "foo2"
-  	d.  In B, type some text anywhere.
-  	e.  Go back to A and Select "Undo Rename method foo to foo2" from A's edit menu.
-  	f.  Operation informs you that it cannot be completed since B has changed.
-  	g.  Select OK
-  	h.  Choose "Undo Typing" from A to revert the text part of the refactoring
-  	i.  Go to B and choose "Undo Typing" to revert the typed changes followed by the text part of the refactoring change.
-  <detection of changed file with undo/redo in between (bug 97939)>
-    a.  Open A.Java and B.java
-  	b.  In A, click in the method name for "foo" and choose Refactor>Rename
-  	c.  Rename "foo" to "foo2"
-  	d.  Verify that "Undo Rename method foo to foo2" appears in Edit>Undo in pulldown menu of editor, editor popup, Package Explorer, and Navigator.
-  	e.  Select "Undo Rename method foo to foo2" from A's edit menu.
-  	f.  Operation prompts as to whether you want to proceed since the refactoring affects other files.
-	g.  Select "yes" and operation is undone.
-  	h.  Select "Redo Rename method foo to foo2" from package explorer.
-  	i.  Operation prompts as to whether you want to proceed since the refactoring affects other files.
-    j.  Select "yes" and operation is redone.
-  	k.  In B, type some text anywhere.
-  	l.  Go back to A and Select "Undo Rename method foo to foo2" from A's edit menu.
-  	m.  Operation informs you that it cannot be completed since B has changed.
-  	n.  Select OK
-  	o.  Choose "Undo Typing" from A to revert the text part of the refactoring
-  	p.  Go to B and choose "Undo Typing" to revert the typed changes followed by the text part of the refactoring change.
-
-Manual Testing of Examples
-
-An unreleased example app is used to manually test certain user operations and to watch the undo
-history using an OperationsLogView.  To do the testing below, you must have access to the Ottawa
-CVS repository (host: ottcvs1.ott.oti.com, repository path: /home/cvs/desktop).
-Check out the project org.eclipse.ui.operations.examples from HEAD and then run a workbench.  There
-must be at least some *.xml file in the workspace (create a plug-in project if your workspace is empty).
-The scenarios are designed to be run sequentially, as the example operations cycle through three
-statuses - INFO, WARNING, ERROR.
-
-  1 - <correct handling of long label names>
-  	a.  Select a *.xml file in the navigator or package explorer.
-  	b.  Popup the menu and choose Operations>Example Operation. 
-  	c.  A message box appears confirming the execution of the operation.
-  	d.  Check the undo menu for the package explorer and verify that the long name 
-  	has ellipsis (...) in the middle of it
-  	
-  2 - <correct handling of undo and progress monitor>
-    e.  Undo the operation from the package explorer
-    f.  Verify that an hour glass appears
-    g.  After a short wait, a progress monitor should appear
-    h.  A message box appears confirming the undo.
-    
-  3 - <verify anything missed above and add redo>
-    i.  repeat steps (a) through (h) above to double check hour glass, etc.
-    j.  Check that the redo menu for the package explorer shows the operation
-   	k.  Redo the operation
-    l.  A message box appears confirming the redo
-    
-  4 - <proper handling of operation exceptions>
-    m.  repeat steps (a) through (g) above.
-	n.  After the progress dialog disappears, you should get a message informing
-	you of an error/Abnormal Workbench Condition
-	o.  Verify that undo/redo are disabled after this error.
-     
-  5 - <correct handling of INFO, WARNING status from AdvancedValidatingOperationApprover>
-    a.  Select a *.xml file in the navigator or package explorer.
-  	b.  Popup the menu and choose Operations>Advanced Example Operation. 
-  	c.  A message box appears confirming the execution of the operation.
-  	d.  Check the undo menu for the package explorer and verify that the long name 
-  	has ellipsis (...) in the middle of it
-    e.  Undo the operation from the package explorer
-    f.  Select "Undo A very long str...
-    g.  You should immediately see a dialog titled "Undo Information" and be asked whether to proceed.
-    h.  Choose yes.
-    i.  You should see a progress dialog and then a message box when the operation is complete
-    j.  At this point you should see the Redo Action available
-    k.  Repeat steps (a) through (j).  The only difference should be that the
-       dialog in (e) is titled "Undo Warning" with a slightly different message.
-       If you are fast enough, cancel the progress dialog to verify it stops the operation
-       (no prompt at the end).
-  6 - <correct handling of ERROR status from AdvancedValidatingOperationApprover>
-    a.  Select a *.xml file in the navigator or package explorer.
-  	b.  Popup the menu and choose Operations>Advanced Example Operation. 
-  	c.  A message box appears confirming the execution of the operation.
-    d.  Select "Undo A very long str...
-	e.  You should first see a progress dialog while the operation computes validity
-	f.  You should then see a dialog titled "Undo Problem" informing you the operation cannot undo
-	g.  Undo and Redo should no longer be available in the menu.
-	
-  7 - <correct handling of cancel/flush inside LinearUndoViolationUserApprover>
-    a.  Select a *.xml file in the navigator or package explorer.
-  	b.  Popup the menu and choose Operations>Invalid Example Operation. 
-  	c.  A message box appears confirming the execution of the operation.
-  	d.  Select "Undo A very long str...
-  	e.  A message box appears informing you of more recent changes to the package explorer and
-	asks if you wish to undo those local changes first.
-  	f.  Answer no.
-  	g.  Verify that the undo menu item remains the same.
-  	
-  8 - <correct handling of rollback failure inside LinearUndoViolationUserApprover>
-    a.  Select a *.xml file in the navigator or package explorer.
-  	b.  Popup the menu and choose Operations>Invalid Example Operation. 
-  	c.  A message box appears confirming the execution of the operation.
-  	d.  Select "Undo A very long str...
-  	e.  A message box appears informing you of more recent changes to the package explorer and
-	asks if you wish to undo those local changes first.
-  	f.  Answer yes.
-  	g.  Verify that undo is still available (due to failure in the rollback)
-  	h.  Undo the item again, this time it should be successful and redo should be available.
-  	
-	
-  
-	
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/WelcomeEditor.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/WelcomeEditor.txt
deleted file mode 100644
index d7916ac..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/WelcomeEditor.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-This is a test list for the welcome editor.
-
-Presentation
-	Verify that the editor appears when the workbench runs for the first time.
-	Verify that the editor shows appropriate scrollbars when its contents extends beyond its client area.
-	Verify that if the editor is closed when the workbench closes, the editor remains closed in next session.
-	Verify that modifying the editor's entry in the product.ini file updates the workbench by following the steps below.
-		1. Make sure the editor is closed when exiting Eclipse.
-		2. Open product.ini with a text editor and remove the wecome editor's entry from the file, which is:
-			welcomePage = welcome.xml
-		3. Restart Eclipse.
-		4. Verify that Welcome doesn't show under Help in the workbench pulldown menu.
-		5. Exit Eclipse
-		6. Add the entry as in step 2 back to product.ini
-		7. Resart Eclipse
-		8. Verify that Welcome shows again under Help.
-
-Actions
-	Verify that Help->Welcome invokes the editor.
-	Verify that all links invoke their corresponding actions.
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/WorkbenchAction.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/WorkbenchAction.txt
deleted file mode 100644
index d1c0704..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/WorkbenchAction.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-This is a test script for actions in the workbench.
-
-File Actions ..
-	Invoke File New .. projects, items, other.
-	Invoke Toolbar button for File New .. projects, items, other.
-	Verify close and save action enablement with 
-		- no editors open
-		- one editor
-		- one dirty editor
-		- after revert
-		- two editors
-		- two dirty editors
-		- after close all
-	Verify actions when switching between perspectives ( one with dirty 
-		editor, other without ).
-	Verify after all perspectives closed.
-	Open many editors, close all, test MRU list.
-	Open an editor and try to print the contents.
-	
-Edit Actions ..
-	Verify global actions track global part.
-	Verify editor contributions appear in action bars when is opened.
-	Verify editors of same type reuse contributions.
-	Verify editors of different type cause contribution change.
-	Verify editor contributions are removed when editor is closed.
-	Verify edit actions are consistent when switching between perspectives.
-
-Perspective Actions (on the Window menu) ..
-	Open = always enabled
-	Verify other actions only enabled when a perspective is open.
-	Verify "open new window", "open perspective"
-	Verify "Save As" by modifying current persp, save as, close, reopen.
-	Verify "Reset" by modifying current persp, then reset.
-	Test Workbench/Perspectives preference page.
-
-The next two have been removed from the Window menu (bug 63827), but can
-still be tested by assigning a key binding.
-	Hide Editors, Show Editors
-	Hide Editors, Open new editor, verify implicit show editors.
-
-Action Sets (on Window -> Customize Perspective -> Shortcuts) ..
-	Confirm order is consistent.  Add all actions, record order, 
-		then remove and re-add.  Select action sets to verify order.
-	Test Customization of File New, Perspective Open, and Show View.
-	Confirm editor actions have consistent place ..
-		- start with no editors
-		- show x action sets
-		- open editor, verify editor actions after sets
-		- hide x action sets
-		- show x action sets
-	Verify action set order persisted between sessions.
diff --git a/tests/org.eclipse.ui.tests/Manual Component Tests/WorkbenchLayout.txt b/tests/org.eclipse.ui.tests/Manual Component Tests/WorkbenchLayout.txt
deleted file mode 100644
index 56f660e..0000000
--- a/tests/org.eclipse.ui.tests/Manual Component Tests/WorkbenchLayout.txt
+++ /dev/null
@@ -1,94 +0,0 @@
-This is a test script for layout in the workbench.
-
-Folder Creation ..
-	- DnD view over view
-	- DnD view over folder
-	- DnD view over view in floating window
-	- NEG TEST - DnD view over editor area. 
-	- DnD editor over editor
-	- DnD editor over editor folder
-	- NEG TEST - DnD editor over view area.  
-
-Folder Breakdown ..
-	- DnD view out of folder with 2
-	- DnD view out of folder with 3.  Folder should remain.
-	- DnD view out of folder in floating window
-	- DnD editor out of editor folder with 2
-	- DnD editor out of editor folder with 3.  Folder should remain
-
-Relative Drag and Drop ..
-	- DnD view to top, right, bottom, left of another view
-	- DnD view to top, right, bottom, left of folder
-	- DnD view to top, right, bottom, left of editor area. 
-	- DnD editor within editor area
-
-Detached Windows ..
-	- DnD view out of window, open detached window
-	- DnD view back into window, close detached window
-	- DnD second view over floating window 
-	- DnD second view out of floating window to create second 
-		detached window
-	- DnD second view out of floating window onto main.  
-
-Tab Items
-	- reorder items in view folder by dragging tabs
-	- reorder itmes in editor folder by dragging tabs
-
-Fast Views
-	- DnD view over shortcut bar.  It should become fast view
-	- Open fast view.  Unpin.  It should return to last position in 
-		root layout.
-
-Page Switch
-	- Verify layout persistance of main window when switching pages
-	- Verify layout persistance of detached windows when switching pages
-
-Zoom
-	- zoom / unzoom view in root layout
-	- zoom / unzoom view in folder.  Verify folder not visible
-	- zoom / unzoom editor in single folder.  Verify no other 
-		editors visible
-	- zoom / unzoom editor in mult-folder editor area.  Verify no 
-		other editors visible
-	- NEG TEST - zoom / unzoom view in detached window.  Should have 
-		no effect
-
-The following actions should maintain zoom
-	- Show View ( if it is zoomed View )
-	- Show View ( if view is visible in Detached Window )
-	- switch to another page and back
-	- click on any visible view or editor
-	- Show / hide fast view
-
-The following actions should cause unzoom
-	- Open editor
-	- Close editor
-	- Close all editors
-	- Show / Hide editor area
-	- Show view / editor which is not visible
-	- Activate view / editor which is not visible
-	- Reset perspective
-	- Save perspective
-	- Change perspective
-	- DnD zoom view out of main window to detached window
-	- DnD view in detached window onto zoom view
-
-The following actions cause unzoom now, but it would be convenient 
-if they didn't in future
-	- Close detached view.
-	- All DnD
-
-Persistance Between Sessions
-	- ensure layout is persisted between sessions
-	- fast views
-	- view layout
-	- detached windows
-	- open editors
-
-Placeholders
-	- Drag view to new position, close, reopen.
-	- Drag view to folder, close, reopen.
-	- Drag view to detached, close, reopen.
-	- Close all views in folder, reopen one by one.
-	- Make view fast, restore.
-	- Make folder fast, restore views one by one.
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Bookmarks View.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/Bookmarks View.html
deleted file mode 100644
index 239850f..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Bookmarks View.html
+++ /dev/null
@@ -1,82 +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">
-   <title>Test Scenario: Bookmarks View</title>
-</head>
-<body>
-
-<h3>
-Bookmarks View</h3>
-Purpose: To test the Bookmark view in Eclipse.&nbsp; We will open the view,
-add a number of bookmarks to some files, open the source file for each
-bookmark and then delete those bookmarks.
-<p>Setup:
-<ol>
-<li>
-Install Eclipse Platform.</li>
-
-<li>
-Create a java project containing three java files and a text file.</li>
-</ol>
-Method:
-<ol>
-<li>
-Start the workbench.</li>
-
-<li>
-Invoke Perspective > Show View > Bookmarks and verify that the Bookmarks
-view appears.</li>
-
-<li>
-Select a java file in the navigator and invoke Edit > Add Bookmark.&nbsp;
-Verify that a new bookmark appears in the Bookmarks view for the selected
-java file.</li>
-
-<li>
-Double click the bookmark in the bookmarks view and verify that an editor
-opens on the source file.</li>
-
-<li>
-Select the 10th line of text in the editor and invoke Add Bookmark in the
-context menu.&nbsp; A dialog should appear where you can type the bookmark
-label.&nbsp; Enter "Line 10" and press OK.&nbsp; Verify that another bookmark
-appears in the Bookmarks view with the label "Line 10".&nbsp; A bookmark
-icon should also appear in the editor to the left of line 10.</li>
-
-<li>
-Close the editor.</li>
-
-<li>
-Select "Line 10" in the bookmarks view and press the "Go to File" button
-in the toolbar.&nbsp; Verify that an editor opens on the source file and
-that line 10 is selected.</li>
-
-<li>
-Right click on the bookmark icon in the editor and invoke "Remove Bookmark".&nbsp;
-Verify that the bookmark disappears in the editor and the bookmarks view.</li>
-
-<li>
-In the navigator select all three java files, verify that "Add Bookmark"
-is enabled, and then invoke it.&nbsp; Verify that 3 bookmarks are appear
-in the bookmarks view.</li>
-
-<li>
-Select a project, folder, or any combination of project | folder with file.&nbsp;
-Verify that "Add Bookmark is disabled.</li>
-
-<li>
-Go to the bookmarks view and invoke "Select All" from the context menu.&nbsp;
-Verify that everything is selected.</li>
-
-<li>
-Then press "Return" in the bookmarks view and verify that all of the bookmarks
-are opened in editors.</li>
-
-<li>
-Invoke "Delete" in the bookmarks view and verify that all bookmarks are
-deleted.</li>
-</ol>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Common Navigator Resource View.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/Common Navigator Resource View.html
deleted file mode 100644
index e888878..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Common Navigator Resource View.html
+++ /dev/null
@@ -1,192 +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">
-   <title>Test Scenario: Common Navigator Resource View</title>
-</head>
-<body>
-<h3>
-Common Navigator Resource View</h3>
-Purpose: To test the Common Navigator Resource view in Eclipse.&nbsp; We will start out
-with an empty workspace, create some projects and files, open files, open
-some new perspectives, delete some files, test the filtering and sorting
-options, and test the persistance of view state between sessions. The Common
-Navigator Resource view tests are derived from the Navigator View tests. The following
-test plan is a trimmed down version of the current Resource view test plan. 
-<p>Setup:
-<ol>
-<li>
-Install Eclipse Platform.</li>
-
-<li>
-Delete the metadata for org.eclipse.ui.</li>
-</ol>
-Method:
-<ol>
-<li>
-Start the workbench.&nbsp; Confirm that the default perspective (Resource)
-and welcome editor both appear.</li>
-
-
-<li>
-Open the Common Navigator Resource View (Window>Show View>Basic>Experimental Resource Navigator)</li>
-
-<li>
-Create a project using the File > New wizard and verify that it appears
-in the navigator.</li>
-
-<li>
-Create another project by invoking New > Project from the navigator popup
-menu.&nbsp; Verify that it appears in the navigator.</li>
-
-<li>
-Create a .txt file, a .html file, and a .java file by invoking New > File
-from the navigator popup menu.&nbsp; Verify that these files appear in
-the navigator and that an editor is opened on each.&nbsp; Close all of
-these editors.</li>
-<!--  Not yet supported 
-<li>
-In the Navigator you can change the input.&nbsp; To test this create a
-couple of nested folders in a project using the New > Folder action in
-the navigator context menu.&nbsp; Then select the top level folder and
-and invoke Go Into.&nbsp; Verify that the input for the view changes (it
-is shown in the view title) and that only the resources in the input folder
-are visible.&nbsp; If you perform the same operation many times you create
-a history list in the navigator.&nbsp; Try navigating up and down the history
-by using the Back and Forward buttons on the view toolbar.</li>
- -->
-<li>
-If you select a file you can open it from the context menu.&nbsp; Open
-a .txt file and verify that the default text editor opens.&nbsp; Open a
-.java file and verify that the java editor opens.</li>
-
-<li>
-You can also open a file in a specific editor.&nbsp; Select a .java file
-and invoke Open With > Default Text Editor.&nbsp; The default text editor
-should open rather than the java editor.&nbsp; If you select Open With
-> System Editor something like notepad should open.&nbsp; The preferred
-editor for a file is always indicated with a check mark in the Open With
-menu.</li>
-<!--  Not yet supported 
-<li>
-In the navigator you can open new perspectives.&nbsp; Select a project
-or folder in the navigator and invoke Open Perspective > Java from the
-context menu. Verify that a new perspective appears with the Java Perspective
-and that the input for the navigator is the project.&nbsp;&nbsp;&nbsp;
-Close it and go back to the first perspective.</li>
--->
-<!--  Not yet supported 
-<li>
-The contents of the Open Perspective menu are determined by the perspective
-properties.&nbsp; Note the contents of this menu.&nbsp; Then invoke Perspective
-> Customize and change the checked perspectives.&nbsp; Press OK and verify
-that the contents of Open Perspective reflect the new options.</li>
--->
-<!--  Not yet supported 
-<li>
-The Navigator has support for drag and drop.&nbsp; Try dragging a file
-from one project to another.&nbsp; A cursor should appear to indicate the
-drop target.&nbsp; If you release the file it will be moved to the target.</li>
--->
-<!--  Not yet supported 
-<li>
-In the navigator select a project, folder or file and try out Copy, Move
-and Rename in the context menu.</li>
--->
-<!--  Not yet supported 
-<li>
-Select a project, folder or file and invoke Delete in the context menu
-to delete it.&nbsp; Verify that the item disappears from the navigator.&nbsp;
-The delete action is also available in the window Edit menu.&nbsp; Select
-an item, invoke Edit > Delete, and verify that it has the same behavior.</li>
--->
-<!--  Not yet supported 
-<li>
-Select a file in the navigator and invoke Add Bookmark from the context
-menu.&nbsp; Open up the Bookmark view and verify that a bookmark now exists.&nbsp;
-If you double click on the bookmark an editor should open on the bookmark
-source file.&nbsp; Verify that Add Bookmark is not available if a project
-or folder is selected in the navigator.</li>
--->
-<!--  Not yet supported 
-<li>
-Select a project and invoke Close Project from the context menu.&nbsp;
-At this point the icon should change to a closed folder and all of the
-contents will be hidden.&nbsp; Invoke Open Project to reopen it and navigate
-the contents.</li>
--->
-<!--  Not yet supported 
-<li>
-If you select a resource and invoke Properties.. a properties dialog should
-appear.&nbsp; It will contain at least an Info, Project Referenes and Team
-page for projects, and an Info and Team page for folders or files.</li>
--->
-<!--  Not yet supported 
-<li>
-In the navigator you can sort items by name or type.&nbsp; Try out these
-options in the pulldown menu and verify that they have the correct affect.&nbsp;
-All sorting is done in ascending order.&nbsp; You can also filter items
-out.&nbsp; Create a couple of .class and .* files and experiment with the
-filter options.&nbsp; You should be able to hide or show these files as
-desired.</li>
--->
-<!--  Not yet supported 
-<li>
-The selection in the navigator is linked to the active editor.&nbsp; Open
-a couple of files.&nbsp; Then switch between the editors and verify that
-the editor input is selected in the navigator.&nbsp; Now select one of
-the open files in the navigator and verify that the corresponding editor
-is activated.&nbsp; You can disable this option by turning off "Link navigator
-selection to active editor" in the workbench preferences.&nbsp; Then verify
-that no selection occurs in the navigator as you switch between editors.&nbsp;
-Turn it back on and verify that selection works again.</li>
--->
-<!--  Not yet supported 
-<li>
-The state of the navigator (input, expansion) should be stored between
-sessions.&nbsp; To test this open a perspective with the navigator, change
-the input and expansions state, and then close the workbench.&nbsp; Restart
-the workbench and verify that the input and expansion state is restored.</li>
--->
-
-</ol>
-
-<h3>Common Navigator Test Viewer </h3>
-<ol>
-<li>Create a file named 'model.properties' in the root of a project. Add 
-the following entries to the file:
-<pre>
-root=Parent
-Parent=Child1,Child2,Child3
-Child1=Grandchild1,Grandchild2
-Child2=Grandchild3
-</pre>
-</li>
-
-<li>After creating the file, open the 'Test Navigator Viewer' 
-(Show View>Other>Test Navigator View).</li>
-
-<li>Expand the project in test viewer. Verify that in addition to 
-the resources, a logical model matching the structure from the properties
-file is presented. Verify that each item has the correct label ('Parent', 
-'Child1', etc) and the correct icon (each element should have the shared
-'element' icon from the workbench).</li>
-
-<li>Verify that no context menu appears when a logical node is selected.</li>
-
-<li>Deactivatethe 'Test Navigator Extension' by opening the Filters dialog, going
-to the 'Types of Content' tab, and unchecking the 'Test Navigator Extension'
-item. Verify that the logical model elements disappear from the tree.</li>
-
-<li>Reactivatethe 'Test Navigator Extension' by opening the Filters dialog, going
-to the 'Types of Content' tab, and checking the 'Test Navigator Extension'
-item. Verify that the logical model elements reappear from the tree.</li>  
-
-<li>Deactivatethe 'Resources extension'. Verify that the tree becomes empty.</li>
-
-</ol>
-
-
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/File System Export.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/File System Export.html
deleted file mode 100644
index 3f30117..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/File System Export.html
+++ /dev/null
@@ -1,97 +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="OTI Employee">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
-   <title>File System Export</title>
-</head>
-<body>
-
-<center>
-<h1>
-File System Export</h1></center>
-
-<h2>
-Purpose</h2>
-The plan is to export a project with a large number files/folders at a
-time, using the file system wizard. The results should be indentical in
-layout and content as the original project used.
-<h2>
-Setup</h2>
-
-<ul>
-<li>
-Download the JUnit zip file source code from www.junit.org.</li>
-
-<li>
-Start the Eclipse workbench</li>
-
-<li>
-Create a new temporary "simple" project called "JUnit Test"</li>
-
-<li>
-Import the JUnit zip file into the project</li>
-
-<li>
-Select File -> Export, select File System and press Next.</li>
-</ul>
-
-<h2>
-Export from a project to a new directory</h2>
-
-<ol>
-<li>
-Select the "JUnit Test" project and mark it as checked.</li>
-
-<li>
-In the Directory field, type in the directory to export to.</li>
-
-<li>
-Press Finish</li>
-
-<li>
-Verify that the contents on the file system match the same file and folder
-structure as the source project</li>
-
-<li>
-Verify the content of the files.</li>
-</ol>
-
-<h2>
-Export from a project to an existing directory</h2>
-
-<ol>
-<li>
-Select the "JUnit Test" project and mark it as checked.</li>
-
-<li>
-In the Directory field, type in the directory to export to.</li>
-
-<li>
-Check the option "Overwrite existing resources without warning"</li>
-
-<li>
-Press Finish</li>
-
-<li>
-Verify you were not prompted to overwrite files</li>
-
-<li>
-Verify that the contents on the file system match the same file and folder
-structure as the source project.</li>
-
-<li>
-Verify the content of the files.</li>
-</ol>
-
-<h2>
-Cleanup</h2>
-
-<ul>
-<li>
-Delete the temporary project "JUnit Test"</li>
-</ul>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/File System Import.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/File System Import.html
deleted file mode 100644
index 340f174..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/File System Import.html
+++ /dev/null
@@ -1,105 +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="OTI Employee">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
-   <title>File System Import</title>
-</head>
-<body>
-
-<center>
-<h1>
-File System Import</h1></center>
-
-<h2>
-Purpose</h2>
-The plan is to import a large number files/folders at a time, using the
-file system wizard. The results should be indentical in layout and content
-as the original source used.
-<h2>
-Setup</h2>
-
-<ul>
-<li>
-Download the JUnit source code from www.junit.org and extract the contents
-into a folder in the file system.</li>
-
-<li>
-Start the Eclipse workbench</li>
-
-<li>
-Create a new temporary "simple" project called "JUnit Test"</li>
-
-<li>
-Select File -> Import, select File System and press Next.</li>
-</ul>
-
-<h2>
-Import into an empty project</h2>
-
-<ol>
-<li>
-Click the Browse button and select the directory where the source files
-are located.</li>
-
-<li>
-Expand the folders in the tree view and until "junit" folder is visible
-and check mark the box next to it</li>
-
-<li>
-Type in "JUnit Test" in the Folder field</li>
-
-<li>
-Press Finish</li>
-
-<li>
-Verify that the contents of the project match the same file and folder
-structure as the source in the file system.</li>
-
-<li>
-Verify that the content of the files.</li>
-</ol>
-
-<h2>
-Import into a project with same contents (overwrite)</h2>
-
-<ol>
-<li>
-Click on the Directory drop down box and select the directory where the
-source files are located</li>
-
-<li>
-Expand the folders in the tree view and until "junit" folder is visible
-and check mark the box next to it</li>
-
-<li>
-Type in "JUnit Test" in the Folder field</li>
-
-<li>
-Check the option "Overwrite existing resources without warning"</li>
-
-<li>
-Press Finish</li>
-
-<li>
-Verify you were not prompted to overwrite files</li>
-
-<li>
-Verify that the contents of the project match the same file and folder
-structure as the source in the file system.</li>
-
-<li>
-Verify that the content of the files.</li>
-</ol>
-
-<h2>
-Cleanup</h2>
-
-<ul>
-<li>
-Delete the temporary project "JUnit Test"</li>
-</ul>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Navigator View.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/Navigator View.html
deleted file mode 100644
index 180eb68..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Navigator View.html
+++ /dev/null
@@ -1,137 +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">
-   <title>Test Scenario: Navigator View</title>
-</head>
-<body>
-<h3>
-Navigator View</h3>
-Purpose: To test the Navigator view in Eclipse.&nbsp; We will start out
-with an empty workspace, create some projects and files, open files, open
-some new perspectives, delete some files, test the filtering and sorting
-options, and test the persistance of view state between sessions.
-<p>Setup:
-<ol>
-<li>
-Install Eclipse Platform.</li>
-
-<li>
-Delete the metadata for org.eclipse.ui.</li>
-</ol>
-Method:
-<ol>
-<li>
-Start the workbench.&nbsp; Confirm that the default perspective (Resource)
-and welcome editor both appear.</li>
-
-<li>
-Create a project using the File > New wizard and verify that it appears
-in the navigator.</li>
-
-<li>
-Create another project by invoking New > Project from the navigator popup
-menu.&nbsp; Verify that it appears in the navigator.</li>
-
-<li>
-Create a .txt file, a .html file, and a .java file by invoking New > File
-from the navigator popup menu.&nbsp; Verify that these files appear in
-the navigator and that an editor is opened on each.&nbsp; Close all of
-these editors.</li>
-
-<li>
-In the Navigator you can change the input.&nbsp; To test this create a
-couple of nested folders in a project using the New > Folder action in
-the navigator context menu.&nbsp; Then select the top level folder and
-and invoke Go Into.&nbsp; Verify that the input for the view changes (it
-is shown in the view title) and that only the resources in the input folder
-are visible.&nbsp; If you perform the same operation many times you create
-a history list in the navigator.&nbsp; Try navigating up and down the history
-by using the Back and Forward buttons on the view toolbar.</li>
-
-<li>
-If you select a file you can open it from the context menu.&nbsp; Open
-a .txt file and verify that the default text editor opens.&nbsp; Open a
-.java file and verify that the java editor opens.</li>
-
-<li>
-You can also open a file in a specific editor.&nbsp; Select a .java file
-and invoke Open With > Default Text Editor.&nbsp; The default text editor
-should open rather than the java editor.&nbsp; If you select Open With
-> System Editor something like notepad should open.&nbsp; The preferred
-editor for a file is always indicated with a check mark in the Open With
-menu.</li>
-
-<li>
-In the navigator you can open new perspectives.&nbsp; Select a project
-or folder in the navigator and invoke Open Perspective > Java from the
-context menu. Verify that a new perspective appears with the Java Perspective
-and that the input for the navigator is the project.&nbsp;&nbsp;&nbsp;
-Close it and go back to the first perspective.</li>
-
-<li>
-The contents of the Open Perspective menu are determined by the perspective
-properties.&nbsp; Note the contents of this menu.&nbsp; Then invoke Perspective
-> Customize and change the checked perspectives.&nbsp; Press OK and verify
-that the contents of Open Perspective reflect the new options.</li>
-
-<li>
-The Navigator has support for drag and drop.&nbsp; Try dragging a file
-from one project to another.&nbsp; A cursor should appear to indicate the
-drop target.&nbsp; If you release the file it will be moved to the target.</li>
-
-<li>
-In the navigator select a project, folder or file and try out Copy, Move
-and Rename in the context menu.</li>
-
-<li>
-Select a project, folder or file and invoke Delete in the context menu
-to delete it.&nbsp; Verify that the item disappears from the navigator.&nbsp;
-The delete action is also available in the window Edit menu.&nbsp; Select
-an item, invoke Edit > Delete, and verify that it has the same behavior.</li>
-
-<li>
-Select a file in the navigator and invoke Add Bookmark from the context
-menu.&nbsp; Open up the Bookmark view and verify that a bookmark now exists.&nbsp;
-If you double click on the bookmark an editor should open on the bookmark
-source file.&nbsp; Verify that Add Bookmark is not available if a project
-or folder is selected in the navigator.</li>
-
-<li>
-Select a project and invoke Close Project from the context menu.&nbsp;
-At this point the icon should change to a closed folder and all of the
-contents will be hidden.&nbsp; Invoke Open Project to reopen it and navigate
-the contents.</li>
-
-<li>
-If you select a resource and invoke Properties.. a properties dialog should
-appear.&nbsp; It will contain at least an Info, Project Referenes and Team
-page for projects, and an Info and Team page for folders or files.</li>
-
-<li>
-In the navigator you can sort items by name or type.&nbsp; Try out these
-options in the pulldown menu and verify that they have the correct affect.&nbsp;
-All sorting is done in ascending order.&nbsp; You can also filter items
-out.&nbsp; Create a couple of .class and .* files and experiment with the
-filter options.&nbsp; You should be able to hide or show these files as
-desired.</li>
-
-<li>
-The selection in the navigator is linked to the active editor.&nbsp; Open
-a couple of files.&nbsp; Then switch between the editors and verify that
-the editor input is selected in the navigator.&nbsp; Now select one of
-the open files in the navigator and verify that the corresponding editor
-is activated.&nbsp; You can disable this option by turning off "Link navigator
-selection to active editor" in the workbench preferences.&nbsp; Then verify
-that no selection occurs in the navigator as you switch between editors.&nbsp;
-Turn it back on and verify that selection works again.</li>
-
-<li>
-The state of the navigator (input, expansion) should be stored between
-sessions.&nbsp; To test this open a perspective with the navigator, change
-the input and expansions state, and then close the workbench.&nbsp; Restart
-the workbench and verify that the input and expansion state is restored.</li>
-</ol>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/New File Wizard.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/New File Wizard.html
deleted file mode 100644
index fe11840..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/New File Wizard.html
+++ /dev/null
@@ -1,94 +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="OTI Employee">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
-   <title>New File Wizard</title>
-</head>
-<body>
-
-<center>
-<h1>
-New File Wizard</h1></center>
-
-<h2>
-Purpose</h2>
-The plan is to create a single empty file. The end result of this wizard
-should be an empty file opened in the proper editor for its type.
-<h2>
-Setup</h2>
-
-<ul>
-<li>
-Start the Eclipse workbench</li>
-
-<li>
-Create a temporary project called "File Test"</li>
-
-<li>
-Select File->New->File from the resource perspective</li>
-</ul>
-
-<h2>
-Create file at project root</h2>
-
-<ol>
-<li>
-Select the project File Test</li>
-
-<li>
-In the File Name field, type in f1.txt</li>
-
-<li>
-Press the Finish button</li>
-
-<li>
-Verify a new f1.txt file is created under the File Test project (in navigator
-view and in the file system)</li>
-
-<li>
-Verify the default text editor opened on f1.txt</li>
-
-<li>
-Verify the content of f1.txt is empty</li>
-</ol>
-
-<h2>
-Create file in new folder</h2>
-
-<ol>
-<li>
-In the "Enter or select the folder" field, type in File Test/folder</li>
-
-<li>
-In the File Name field, type in f1.txt</li>
-
-<li>
-Press the Finish button</li>
-
-<li>
-Verify that "folder" was created under the File Test project (in navigator
-view and in the file system)</li>
-
-<li>
-Verify a new f1.txt file is created under "folder" (in navigator view and
-in the file system)</li>
-
-<li>
-Verify the default text editor opened on f1.txt</li>
-
-<li>
-Verify the content of f1.txt is empty</li>
-</ol>
-
-<h2>
-Cleanup</h2>
-
-<ul>
-<li>
-Delete the temporary project "File Test"</li>
-</ul>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/New Folder Wizard.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/New Folder Wizard.html
deleted file mode 100644
index ae32603..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/New Folder Wizard.html
+++ /dev/null
@@ -1,60 +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="OTI Employee">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
-   <title>New Folder Wizard</title>
-</head>
-<body>
-
-<center>
-<h1>
-New Folder Wizard</h1></center>
-
-<h2>
-Purpose</h2>
-The plan is to create a single empty folder. The end result of this wizard
-should be an empty folder.
-<h2>
-Setup</h2>
-
-<ul>
-<li>
-Start the Eclipse workbench</li>
-
-<li>
-Create a temporary project called "Folder Test"</li>
-
-<li>
-Select File->New->Folder from the resource perspective</li>
-</ul>
-
-<h2>
-Create folder at project root</h2>
-
-<ol>
-<li>
-Select the project Folder Test</li>
-
-<li>
-In the Folder Name field, type in f1</li>
-
-<li>
-Press the Finish button</li>
-
-<li>
-Verify a new f1 folder is created under the Folder Test project (in navigator
-view and in the file system)</li>
-</ol>
-
-<h2>
-Cleanup</h2>
-
-<ul>
-<li>
-Delete the temporary project "Folder Test"</li>
-</ul>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/New Project Wizard.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/New Project Wizard.html
deleted file mode 100644
index 8346abd..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/New Project Wizard.html
+++ /dev/null
@@ -1,92 +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="OTI Employee">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
-   <title>New Project Wizard</title>
-</head>
-<body>
-
-<center>
-<h1>
-New Project Wizard</h1></center>
-
-<h2>
-Purpose</h2>
-The plan is to create a single empty project. The end result of this wizard
-should be an empty project.
-<h2>
-Setup</h2>
-
-<ul>
-<li>
-Start the Eclipse workbench</li>
-
-<li>
-Extract the junit.jar file into a directory on the file system</li>
-
-<li>
-Select File->New->Project from the resource perspective</li>
-
-<li>
-Select Simple and then Project and Press Next</li>
-</ul>
-
-<h2>
-Create project at default location</h2>
-
-<ol>
-<li>
-In Project Name field, type in Project Test</li>
-
-<li>
-Press Next and select another project as a reference project</li>
-
-<li>
-Press the Finish button</li>
-
-<li>
-Verify a new Project Test project is created (in navigator view and in
-the file system)</li>
-
-<li>
-Verify, in the project's properties dialog, that the Project References
-page includes the project referenced.</li>
-</ol>
-
-<h2>
-Create project at specific location</h2>
-
-<ol>
-<li>
-In Project Name field, type in Project Test2</li>
-
-<li>
-Uncheck the Use Default Location option</li>
-
-<li>
-In the Location field, type in the directory containing the junit source
-code.</li>
-
-<li>
-Press the Finish button</li>
-
-<li>
-Verify a new Project Test2 project is created (in navigator view)</li>
-
-<li>
-Verify the contents of the project match the files/folders for junit on
-the file system</li>
-</ol>
-
-<h2>
-Cleanup</h2>
-
-<ul>
-<li>
-Delete projects Project Test and Project Test2</li>
-</ul>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Outline View.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/Outline View.html
deleted file mode 100644
index a7aa0b4..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Outline View.html
+++ /dev/null
@@ -1,67 +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">
-   <title>Test Scenario: Outline View</title>
-</head>
-<body>
-
-<h3>
-Outline View</h3>
-Purpose: To test the Outline view in Eclipse.&nbsp; The Outline view is
-just a container for the pages contributed by open editors.&nbsp; Therefore,
-this test will focus on the creation, show, and closure of those pages.
-<p>Setup:
-<ol>
-<li>
-Install Eclipse Platform.</li>
-
-<li>
-Create a java project containing three java files and a text file.</li>
-</ol>
-Method:
-<ol>
-<li>
-Start the workbench.</li>
-
-<li>
-If any editor is open close it.</li>
-
-<li>
-Verify that the Outline view is empty and contains the text "An Outline
-is not available".</li>
-
-<li>
-Open an editor on a java file. Verify that a java page appears in the outline
-view.&nbsp; If you select items in this page the scroll and selected text
-within the editor should change.</li>
-
-<li>
-Open a second file in a java editor.&nbsp; Verify that a second java page
-appears in the outline view.</li>
-
-<li>
-If you switch between the two editors the visible page should change.</li>
-
-<li>
-Open a .txt file in a text editor.&nbsp; When this editor is active the
-outline view will be empty and contain the standard empty text as described
-in step 2.</li>
-
-<li>
-If you switch between a text and java editor the visible page should change.&nbsp;
-Verify that the toolbar and menu items in the outline also chnage.&nbsp;
-The java editor has Field and Member toolbar items.</li>
-
-<li>
-Close one editor.&nbsp; If another editor is activated verify that its
-outline page is now visible.&nbsp; If no editor is activated verify that
-the outline is empty.</li>
-
-<li>
-Close the last editor and verify that the default blank page is visible
-in the outline.</li>
-</ol>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Persistence.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/Persistence.html
deleted file mode 100644
index 2d5c2b2..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Persistence.html
+++ /dev/null
@@ -1,55 +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">
-   <title>Test Scenario: Persistence</title>
-</head>
-<body>
-<h3>
-Persistence</h3>
-Purpose: To test persistence in the workbench.
-<p>Setup:
-<ol>
-<li>
-Install Eclipse Platform.</li>
-
-<li>
-Delete the metadata for org.eclipse.ui.</li>
-</ol>
-Method:
-<ol>
-<li>
-Start the workbench.&nbsp; Confirm that the default perspective (Resource)
-and welcome editor both appear.</li>
-
-<li>
-Create a project with 3 files, one.txt, two.txt, and three.txt.&nbsp; Open
-one.txt in the default perspective.</li>
-
-<li>
-In the navigator select the project and invoke Open Perspective > Java
-from the context menu.&nbsp; Verify that a new Java perspective appears
-in the current window.&nbsp; The input for the Packages view and navigator
-should be the project.</li>
-
-<li>
-Open two.txt in the Java perspective.</li>
-
-<li>
-Change the Workbench Preferences for "Open Perspective" to "Open in New
-Window".&nbsp; Then open a Java perspective and verify that a new window
-is created.</li>
-
-<li>
-Now we have two windows.&nbsp; The first window has two perspectives (resource
-and java).&nbsp; In the resource perspective one.txt is open in an editor.&nbsp;
-In the java perspective two.txt is open in an editor.&nbsp; In the second
-window here is one Java perspective with no open editors.</li>
-
-<li>
-Invoke File > Exit.&nbsp; Then restart the workbench and verify that the
-window, perspective and editor state of the workbench is restored.</li>
-</ol>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Preferences.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/Preferences.html
deleted file mode 100644
index ebcf11a..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Preferences.html
+++ /dev/null
@@ -1,92 +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">
-   <title>Test Scenario: Preferences</title>
-</head>
-<body>
-
-<h3>
-Preferences</h3>
-Purpose: To test the Preferences in Eclipse.&nbsp; We will open the Preferences
-dialog, select some pages, change and apply preferences, verify their affect,
-and test persistence between sessions.
-<p>Setup:
-<ol>
-<li>
-Install Eclipse Platform.</li>
-</ol>
-Method:
-<ol>
-<li>
-Start the workbench.</li>
-
-<li>
-Invoke Window > Preferences and verify that the Preferences dialog appears.&nbsp;
-Click on all of the items in the left hand viewer to demonstrate that each
-item has a valid page and no exceptions occur in their creation.&nbsp;
-Now close the dialog.</li>
-
-<li>
-The behavior of the workbench can be customized using the preferences.&nbsp;
-To see this in action we will examine various preferences which ship with
-Eclipse.</li>
-
-<li>
-The selection in the navigator is linked to the active editor.&nbsp; Open
-a couple of files.&nbsp; Then switch between the editors and watch how
-the input for the active editor is selected in the navigator.&nbsp; You
-can disable this option in the Preferences.&nbsp; To do this ..</li>
-
-<ol>
-<li>
-Open the preferences dialog.</li>
-
-<li>
-Turning off "Link navigator selection to active editor" in the workbench
-preferences.</li>
-
-<li>
-Press OK.&nbsp; The dialog should close.</li>
-
-<li>
-Now switch between the editors.&nbsp; Notice that the selection in the
-navigator does not change.</li>
-</ol>
-
-<li>
-The Perspective > Open menu action can also be customized.&nbsp; By default
-this action will open a new perspective in the current window.&nbsp; You
-can change this to "open in new window" or "replace other".&nbsp; To see
-this behavior ..</li>
-
-<ol>
-<li>
-Open the preferences dialog.&nbsp; Change the workbench preferences for
-"Open Perspective" to "Open in New Window".&nbsp; Then press OK</li>
-
-<li>
-Invoke Perspective > Open > Java.&nbsp; Notice how a new window is created
-for the perspective.&nbsp; The list of open windows is shown in the Window
-menu.&nbsp; Select these items to switch between the windows.</li>
-</ol>
-
-<li>
-If you don't like the current preferences you can reset them.&nbsp; Open
-the preferences dialog again.&nbsp; To reset the state of "Link navigator
-.." and "Open Perspective .." press the Restore Defaults button.&nbsp;
-If you press OK the options will be saved.&nbsp; However, let's assume
-that you decide not to change them.&nbsp; Press Cancel.&nbsp; Then verify
-that the deviant options have not been restored to default by switching
-between editors and opening a new perspective.</li>
-
-<li>
-Invoke File > Exit.&nbsp; Then restart the workbench.</li>
-
-<li>
-Open the preferences dialog and confirm tha "Link navigator .. " and "Open
-Perspective .." still reflect the customized values.&nbsp; The workbench
-will automatically save your preferences between sessions.</li>
-</ol>
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Problems View.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/Problems View.html
deleted file mode 100644
index ceb5561..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Problems View.html
+++ /dev/null
@@ -1,105 +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">
-   <title>Test Scenario: Tasks View</title>
-</head>
-<body>
-
-<h3>
-Tasks View</h3>
-Purpose: To test the Tasks view in Eclipse.&nbsp; We will create a java
-project with java classes, introduce errors in those classes, add tasks
-to the files, and then verify them in the tasks list.&nbsp; We also test
-the persistance of task filtering between sessions.
-<p>Setup:
-<ol>
-<li>
-Install Eclipse Platform.</li>
-</ol>
-Method:
-<ol>
-<li>
-Start the workbench.</li>
-
-<li>
-Create a Java Project named TaskProject.&nbsp; Then create a class named
-TaskClass with the following content.</li>
-
-<p><br><tt>public class TaskClass {</tt>
-<br><tt>&nbsp;private int y;</tt>
-<br><tt>&nbsp;public TaskClass() {</tt>
-<br><tt>&nbsp;}</tt>
-<br><tt>&nbsp;public void doThis() {</tt>
-<br><tt>&nbsp;}</tt>
-<br><tt>&nbsp;abstract public void doThat();</tt>
-<br><tt>&nbsp;public int getX() {</tt>
-<br><tt>&nbsp; return x;</tt>
-<br><tt>&nbsp;}</tt>
-<br><tt>}</tt>
-<br>&nbsp;
-<li>
-If you save this file 2 errors will appear in the source.&nbsp; On line
-7 there is an error because abstract methods can only be defined in an
-abstract class.&nbsp; On line 9 there is an error because x is unknown.</li>
-
-<li>
-Open the Tasks view by invoking Perspective > Show View > Tasks.&nbsp;
-Verify that the tasks views appears and that it shows the 2 errors in the
-TaskClass.</li>
-
-<li>
-Select the first line of TaskClass and invoke "Add Task" from the context
-menu.&nbsp; Override the label with "Test Label" and press OK.&nbsp; Verify
-that a new task icon appears on the left edge of the editor and in the
-tasks view.</li>
-
-<li>
-If a problem is resolved or a task removed it should disappear from the
-task view.&nbsp; Open the Task view filter dialog and reset all options
-with the Reset button.&nbsp; Press OK and go back to the editor for TaskClass.java.&nbsp;
-Delete the "doThat" method and save the file.&nbsp; Verify that one of
-the errors on TaskClass.java is deleted.</li>
-
-<li>
-Now select the Tasks view and select the task item labelled "Test Label".&nbsp;
-Invoke Edit > Delete to delete this task and then verify that it disappears
-from the tasks view and from the open editor.</li>
-
-<li>
-Within the Tasks view you can also create new tasks.&nbsp; To test this
-press the "New Task" button on the toolbar.&nbsp; A new task should appear.&nbsp;
-Type in the label for this task and press Return.&nbsp; Verify that a new
-task is created.&nbsp; Do this a couple of times to create more than one
-task.</li>
-
-<li>
-A task is very similar to a bookmark.&nbsp; If you select a task you can
-open an editor on the task source.&nbsp; To test this close all editors.&nbsp;
-Then select one of the java problems for TaskClass.java and invoke Go To
-File in the context menu.&nbsp; Verify that an editor opens on the problem
-and that the problem is indicated by selection in the editor.</li>
-
-<li>
-Now invoke the Filters toolbar action and change the "show entries of type"
-option to "Java Problem" and nothing else.&nbsp; Press OK and verify that
-only Java problems appear in the task list now.</li>
-
-<li>
-Reopen the Filters dialog and select "On Selected Resource Only".&nbsp;
-Press OK.&nbsp; Now select TaskClass.java in the navigator and verify that
-the java problems for this file are visible in the navigator.&nbsp; Select
-the TaskProject and verify that the java problems for TaskClass.java are
-not visible.</li>
-
-<li>
-Now the task list contains a number of errors and tasks.&nbsp; It also
-has a couple of filtering options (java problems only and selected resource
-only).&nbsp; This state is persisted between sessions.&nbsp; To test this
-note the state of the task view.&nbsp; Then close the workbench and restart
-it.&nbsp; Verify that the visible set of tasks and the filtering options
-are restored.</li>
-</ol>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Properties Dialog.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/Properties Dialog.html
deleted file mode 100644
index cd52ea5..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Properties Dialog.html
+++ /dev/null
@@ -1,106 +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="OTI Employee">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
-   <title>Properties Dialog</title>
-</head>
-<body>
-
-<center>
-<h1>
-Properties Dialog</h1></center>
-
-<h2>
-Purpose</h2>
-The plan is to confirm the default property pages for simple file, folder,
-and project resources.
-<h2>
-Setup</h2>
-
-<ul>
-<li>
-Start the Eclipse workbench</li>
-
-<li>
-Create a simple Project, Folder, and File</li>
-</ul>
-
-<h2>
-Project property pages</h2>
-
-<ol>
-<li>
-Select the simple Project, from the context menu select Properties</li>
-
-<li>
-Click on the Project References page</li>
-
-<li>
-Verify that the Project References page includes no project references</li>
-
-<li>
-Click on the Info page</li>
-
-<li>
-Verify the content is correct</li>
-
-<li>
-Check the Read Only option and press OK</li>
-
-<li>
-Verify that creating another simple file in the simple Project is disallowed</li>
-</ol>
-
-<h2>
-Folder property pages</h2>
-
-<ol>
-<li>
-Select the simple Folder, from the context menu select Properties</li>
-
-<li>
-Click on the Info page</li>
-
-<li>
-Verify the content is correct</li>
-
-<li>
-Check the Read Only option and press OK</li>
-
-<li>
-Verify that creating another simple file in the simple Folder is disallowed</li>
-</ol>
-
-<h2>
-File property pages</h2>
-
-<ol>
-<li>
-Select the simple File, from the context menu select Properties</li>
-
-<li>
-Click on the Info page</li>
-
-<li>
-Verify the content is correct</li>
-
-<li>
-Check the Read Only option and press OK</li>
-
-<li>
-Verify that editing the simple File is disallowed (editor is opened but
-cannot type in it)</li>
-</ol>
-
-<h2>
-Cleanup</h2>
-
-<ul>
-<li>
-Delete the simple File, Folder, and Project</li>
-</ul>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Properties View.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/Properties View.html
deleted file mode 100644
index b4c2ade..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Properties View.html
+++ /dev/null
@@ -1,53 +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">
-   <title>Test Scenario: Properties View</title>
-</head>
-<body>
-
-<h3>
-Properties View</h3>
-Purpose: To test the Properties view in Eclipse.&nbsp; The Outline view
-is just a container for the pages contributed by other editors and views
-within the workbench.&nbsp; Therefore, this test will focus on the creation,
-show, and closure of those pages.
-<p>Setup:
-<ol>
-<li>
-Install Eclipse Platform.</li>
-
-<li>
-Create a project containing some files.</li>
-</ol>
-Method:
-<ol>
-<li>
-Start the workbench.</li>
-
-<li>
-Open the Navigator, Packages and Properties views.</li>
-
-<li>
-Select a file in the Navigator.&nbsp; Verify that the properties for this
-file are visible in the Properties view.</li>
-
-<li>
-Select a project in the Packages view.&nbsp; Verify that the properties
-for ths file are onw visible in the properties view.</li>
-
-<li>
-Activate the Navigator, Packages, Navigator, and Packages view by clicking
-in the title area of the view.&nbsp; Verify that the visible propreties
-in the properties view change to reflect the active part.</li>
-
-<li>
-Close the properties view.</li>
-
-<li>
-Open the view and verify that it shows the properties for the last selection
-in the workbench.</li>
-</ol>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Tasks View.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/Tasks View.html
deleted file mode 100644
index 277e878..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Tasks View.html
+++ /dev/null
@@ -1,97 +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">
-   <title>Test Scenario: Tasks View</title>
-</head>
-<body>
-
-<h3>
-Tasks View</h3>
-Purpose: To test the Tasks view in Eclipse.&nbsp; We will create a java
-project with java classes, introduce errors in those classes, add tasks
-to the files, and then verify them in the tasks list.&nbsp; We also test
-the persistance of task filtering between sessions.
-<p>Setup:
-<ol>
-<li>
-Install Eclipse Platform.</li>
-</ol>
-Method:
-<ol>
-<li>
-Start the workbench.</li>
-
-<li>
-Create a Java Project named TaskProject.&nbsp; Then create a class named
-TaskClass with the following content.</li>
-
-<p><br><tt>public class TaskClass {</tt>
-<br><tt>&nbsp;private int y;</tt>
-<br><tt>&nbsp;public TaskClass() {</tt>
-<br><tt>&nbsp;}</tt>
-<br><tt>&nbsp;public void doThis() {</tt>
-<br><tt>&nbsp;}</tt>
-<br><tt>&nbsp;abstract public void doThat();</tt>
-<br><tt>&nbsp;public int getX() {</tt>
-<br><tt>&nbsp; return x;</tt>
-<br><tt>&nbsp;}</tt>
-<br><tt>}</tt>
-<br>&nbsp;
-<li>
-If you save this file 2 errors will appear in the source.&nbsp; On line
-7 there is an error because abstract methods can only be defined in an
-abstract class.&nbsp; On line 9 there is an error because x is unknown.</li>
-
-<li>
-Open the Tasks view by invoking Perspective > Show View > Tasks.&nbsp;
-Verify that the tasks views appears and that it does not show the 2 
-errors in the TaskClass.</li>
-
-<li>
-Select the first line of TaskClass and invoke "Add Task" from the context
-menu.&nbsp; Override the label with "Test Label" and press OK.&nbsp; Verify
-that a new task icon appears on the left edge of the editor and in the
-tasks view.</li>
-
-<li>
-Now select the Tasks view and select the task item labelled "Test Label".&nbsp;
-Invoke Edit > Delete to delete this task and then verify that it disappears
-from the tasks view and from the open editor.</li>
-
-<li>
-Within the Tasks view you can also create new tasks.&nbsp; To test this
-press the "New Task" button on the toolbar.&nbsp; A new task should appear.&nbsp;
-Type in the label for this task and press Return.&nbsp; Verify that a new
-task is created.&nbsp; Do this a couple of times to create more than one
-task.</li>
-
-<li>
-A task is very similar to a bookmark.&nbsp; If you select a task you can
-open an editor on the task source.&nbsp; To test this close all editors.&nbsp;
-Then select one of the java problems for TaskClass.java and invoke Go To
-File in the context menu.&nbsp; Verify that an editor opens on the task
-and that the task is indicated by selection in the editor.</li>
-
-<li>
-Now invoke the Filters toolbar action and change the "Where priority is:"
-option to "High" and nothing else.&nbsp; Press OK and verify that
-only high priority tasks appear in the task list now.</li>
-
-<li>
-Reopen the Filters dialog and select "On Selected Resource Only".&nbsp;
-Press OK.&nbsp; Now select TaskClass.java in the navigator and verify that
-the tasks for this file are visible in the task view.&nbsp; Select
-the TaskProject and verify that the tasks for TaskClass.java are
-not visible in the tasks view.</li>
-
-<li>
-Now the task list contains a number of tasks.&nbsp; It also has a couple 
-of filtering options.&nbsp; This state is persisted between 
-sessions.&nbsp; To test this note the state of the task view.&nbsp; 
-Then close the workbench and restart it.&nbsp; Verify that the visible 
-set of tasks and the filtering options are restored.</li>
-</ol>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Test Scenarios.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/Test Scenarios.html
deleted file mode 100644
index 7d3c66b..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Test Scenarios.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">
-   <title>Workbench Manual Test Scenarios</title>
-</head>
-<body>
-
-<h2>
-<b>Manual Test Scenarios for the Workbench (org.eclipse.ui)</b></h2>
-Last updated June 2, 2002
-
-<p>
-<br><a href="Welcome Editor.html">Welcome Editor</a>
-<br><a href="Window Actions.html">Window Actions</a>
-<br><a href="Window Layout.html">Window Layout</a>
-<br><a href="Persistence.html">Persistence</a>
-<br><a href="Navigator View.html">Navigator View</a>
-<br><a href="Common Navigator Resource View.html">Common Navigator Resource View</a>
-<br><a href="Outline View.html">Outline View</a>
-<br><a href="Properties View.html">Properties View</a>
-<br><a href="Bookmarks View.html">Bookmarks View</a>
-<br><a href="Tasks View.html">Tasks View</a>
-
-<br><a href="New File Wizard.html">New File Wizard</a>
-<br><a href="New Folder Wizard.html">New Folder Wizard</a>
-<br><a href="New Project Wizard.html">New Project Wizard</a>
-<br><a href="File System Export.html">File System Export</a>
-<br><a href="File System Import.html">File System Import</a>
-<br><a href="ZIP Export.html">Zip Export</a>
-<br><a href="ZIP Import.html">Zip Import</a>
-<br><a href="Properties Dialog.html">Properties Dialog</a>
-<br><a href="Preferences.html">Preferences</a>
-<br>&nbsp;
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Text Editor b/tests/org.eclipse.ui.tests/Manual Scenario Tests/Text Editor
deleted file mode 100644
index 2f67424..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Text Editor
+++ /dev/null
@@ -1,98 +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">
-   <title>Test Scenario: Text Editor</title>
-</head>
-<body>
-
-<h3>
-Text Editor</h3>
-Purpose: To test the Text Editor in Eclipse.&nbsp; We will open a text
-file, adding some text, play with the edit actions, verify the save and
-save as, and then test persistance between sessions.
-<p>Setup:
-<ol>
-<li>
-Install Eclipse Platform.</li>
-
-<li>
-Create a project.</li>
-</ol>
-Method:
-<ol>
-<li>
-Start the workbench.</li>
-
-<li>
-Invoke File > New > File.&nbsp; Create a new text file with some name like
-test1.txt.&nbsp; Verify that a new editor opens on the file.</li>
-
-<li>
-Copy and paste the following text into the editor ..</li>
-</ol>
-
-<blockquote>Beware the beast man, for he is the devil's pawn. Alone among
-God's primates,
-<br>he kills for sport, or lust or greed. Yes, he will murder his brother
-to possess his
-<br>brother's land. Let him not breed in great numbers, for he will make
-a desert of
-<br>his home and yours. Shun him. Drive him back into his jungle lair:
-For he is the
-<br>harbinger of death.
-<p>(Planet of the Apes)</blockquote>
-
-<ol>
-<li>
-After paste has been performed the editor state should be dirty.&nbsp;
-Verify that File > Save is enabled and that Save is enabled in the context
-menu.&nbsp; Invoke Save and verify that save is disabled.</li>
-
-<li>
-The Save As menu action is always enabled.&nbsp; Invoke this action to
-create a new file, say test2.txt, and verify that the name of the new file
-name is reflected in the editor tab.</li>
-
-<li>
-Modify the contents of test2.txt and save.&nbsp; Then open test1.txt and
-verify that it still contains the original text.</li>
-
-<li>
-In text1.txt select the first 3 lines and invoke Edit Copy.&nbsp; Activate
-text2.txt, put the cursor at the end of the file, and invoke Edit Paste.&nbsp;
-Verify that the first 3 lines of text1.txt are copied to text2.txt.</li>
-
-<li>
-Invoke Undo and Redo a few times in text2.txt to undo and redo the paste.</li>
-
-<li>
-Select a few lines of text and invoke Shift Right and Shift Left a few
-times.</li>
-
-<li>
-Now close text2.txt.&nbsp; The file has been modified, so a Save dialog
-should appear.&nbsp; Press No to avoid saving.</li>
-
-<li>
-Now we need to test Find / Replace.&nbsp; Select the text1.txt editor.&nbsp;
-This file contains many instances of he and his.&nbsp; Invoke Find / Replace
-and replace all instances of he by "she".&nbsp; You may find that various
-words like "the" are modified to "tshe".&nbsp; Close the find dialog and
-invoke Revert in the context menu.&nbsp; Verify that the file contents
-are now equal to the original text.&nbsp; Then try Find / Replace again
-with "whole word" selected and verify the results.</li>
-
-<li>
-Open up text2.txt.&nbsp; Now there should be one open editor with changs
-and one without.</li>
-
-<li>
-Invoke File > Close All.&nbsp; At this point a "Save Resources" dialog
-should appear where you can save the modified files.&nbsp; Check all modifications
-and then press "Yes".&nbsp; Verify that all editors are closed.&nbsp; Then
-open up any editor which was saved and verify changes.</li>
-</ol>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Welcome Editor.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/Welcome Editor.html
deleted file mode 100644
index 75c3754..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Welcome Editor.html
+++ /dev/null
@@ -1,44 +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">
-   <title>Test Scenario: Welcome Editor</title>
-</head>
-<body>
-<h3>
-Welcome Editor</h3>
-Purpose: To test the Welcome editor in Eclipse.&nbsp; We will start the
-workbench after a fresh install, verify the visibility of the Welcome editor,
-and then test the format and links.
-<p>Setup:
-<ol>
-<li>
-Install Eclipse Platform.</li>
-
-<li>
-Delete the metadata for org.eclipse.ui.&nbsp; This will simulate a fresh
-install.</li>
-</ol>
-Method:
-<ol>
-<li>
-Start the workbench.&nbsp; Confirm that the default perspective (Resource)
-and Welcome editor both appear.</li>
-
-<li>
-Close the editor and exit the workbench.</li>
-
-<li>
-Restart the workbench and verify that the Welcome editor does not appear.&nbsp;
-The editor only appears automatically after a fresh install.</li>
-
-<li>
-Invoke Help > Welcome and verify that the Welcome editor opens.</li>
-
-<li>
-The Welcome editor contains a number of links. Test each of these links
-to ensure that the link invokes an appropriate action.</li>
-</ol>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Window Actions.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/Window Actions.html
deleted file mode 100644
index 2459250..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Window Actions.html
+++ /dev/null
@@ -1,117 +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">
-   <title>Test Scenario: Window Actions</title>
-</head>
-<body>
-<h3>
-Window Actions</h3>
-Purpose: To test the standard menu and toolbar actions in Eclipse.&nbsp;
-We will create a project, open some editors, test the global actions, test
-the persistance of workbench state between sessions.
-<p>Setup:
-<ol>
-<li>
-Install Eclipse Platform.</li>
-
-<li>
-Delete the metadata for org.eclipse.ui.</li>
-</ol>
-Testing the File Menu:
-<ol>
-<li>
-Start the workbench.</li>
-
-<li>
-Invoke File > New > Project.&nbsp; A wizard will appear where you can select
-a project type.&nbsp; Select each item in the left hand viewer to verify
-the basic page operation.&nbsp; Then select Simple > Project and press
-Next.&nbsp; Type "SimpleProject" as the name for the project and press
-Finish.&nbsp; Verify that a new Resource perspective is created and that
-SimpleProject appears in the Navigator view.</li>
-
-<li>
-Create a few folders and files (one.txt, two.txt, three.txt) within SimpleProject.&nbsp;
-For more information on this process refer to Simon's work on the New Wizard.</li>
-
-<li>
-Open one.txt within a text editor.&nbsp; Verify that File > Close and Save
-As are enabled.&nbsp; Verify that Save is disabled.</li>
-
-<li>
-Add the following text to the file..</li>
-
-<p><br>File One
-<br>&nbsp;
-<li>
-Once you modify a file the File > Save action should become enabled and
-a small asterix should appear in the editor tab.&nbsp; Invoke Save and
-verify that the asterix disappears and that the File > Save action is disabled.</li>
-
-<li>
-Open two.txt.&nbsp; Add the following text to the file..</li>
-
-<p><br>File Two
-<br>&nbsp;
-<li>
-Open three.txt and add the following text to the file..</li>
-
-<p><br>File Three
-<br>&nbsp;
-<li>
-If you close an editor which is dirty the workbench should ask if you want
-to save it.&nbsp; With three.txt active invoke File > Close.&nbsp; Verify
-that the Save dialog appears.&nbsp; Press Yes.&nbsp; Then reopen the file
-to verify that the text was saved.</li>
-
-<li>
-Invoke File > Close All.&nbsp; At this point there is 1 dirty editor.&nbsp;
-Verify that the Save Resources dialog appears.&nbsp; Press Yes.&nbsp; The
-dirty editors should be saved and all editors will close.</li>
-
-<li>
-Verify that File > Close, Close All, Save, Save As, and Save All are disabled.</li>
-</ol>
-Testing the Edit Menu:
-<ol>
-<li>
-The edit actions should target the active view or editor.&nbsp; To test
-this ..</li>
-
-<ol>
-<li>
-Select a file in the navigator view.&nbsp; Invoke Edit > Delete and verify
-that the Delete File dialog appears for the current selection in the navigator.&nbsp;&nbsp;
-Close the dialog without completing the delete.</li>
-
-<li>
-Select the file again and invoke Edit > Add Bookmark.&nbsp; Open the Bookmarks
-view and verify that a bookmark exists for the file.&nbsp; Select the bookmark.&nbsp;
-Invoke Edit > Delete and verify that the bookmark is deleted in the bookmarks
-view.</li>
-
-<li>
-Open one.txt in a text editor.&nbsp; Select a piece of text and invoke
-Edit > Cut.&nbsp; Verify that the selection in the text editor is cut.</li>
-</ol>
-
-<li>
-Create a file named X.java.&nbsp; Open it in an editor and then verify
-that the Java editor actions are contributed to the workbench menu and
-toolbar.</li>
-
-<li>
-Open one.txt in an editor.&nbsp; Verify that the java editor actions are
-no longer visible in the workbench.</li>
-
-<li>
-Activate the java editor and verify that its contributions appear once
-again.</li>
-
-<li>
-Close the java editor and verify that the contributions disappear.</li>
-</ol>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Window Layout.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/Window Layout.html
deleted file mode 100644
index f188196..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/Window Layout.html
+++ /dev/null
@@ -1,196 +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">
-   <title>Test Scenario: Window Layout</title>
-</head>
-<body>
-<h3>
-Window Layout</h3>
-Purpose: To test window layout in Eclipse.&nbsp; We will open a perspective,
-test the layout features, open a second perspective, switch between perspectives,
-and then create some windows.
-<p>Setup:
-<ol>
-<li>
-Install Eclipse Platform.</li>
-
-<li>
-Create a project with 3 .txt files.</li>
-
-<li>
-Delete the metadata for org.eclipse.ui.</li>
-</ol>
-Testing a Single Perspective:
-<ol>
-<li>
-Start the workbench.</li>
-
-<li>
-Drag the navigator over the shortcut bar (the vertical toolbar at left).&nbsp; 
-Verify that a stack icon appears.&nbsp; Drop the view on the shortcut bar. 
-It should become a fast view.</li>
-
-<li>
-Click on the navigator fast view button to show the view.&nbsp; Click on
-another view to hide it.&nbsp; You can also hide the view by clicking on
-the "hide" button or the fast view button.</li>
-
-<li>
-Close the Outline view.&nbsp; Then invoke Perspective > Show View > Outline
-to show it again.&nbsp; Verify that it has the same position as before.</li>
-
-<li>
-Select a text file in the navigator and open it.&nbsp; Verify that the
-navigator fast view is hidden and an editor appears in the editor area.</li>
-
-<li>
-Modify the contents of the editor and verify that File > Save becomes enabled.&nbsp;
-Save the file and verify that File > Save is disabled.</li>
-
-<li>
-Modify the contents of the editor again and close the editor.&nbsp; Verify
-that the Save dialog appears and you can answer, yes, no, and cancel.</li>
-
-<li>
-Open 3 text files within 3 editors.&nbsp; The editors appear in a single
-folder.</li>
-
-<li>
-Drag one editor out of the folder.&nbsp; Verify that the relative placement
-icons are shown when you are to the top, right, bottom, or left of the
-existing editor folder.&nbsp; The "no drop" icon should appear if you are
-over a view.&nbsp; Drop the editor below the existing folder.</li>
-
-<li>
-Drag another editor our of the folder onto the single view.&nbsp; Verify
-that the first folder is deconstructed and that a new folder is constructed.</li>
-
-<li>
-Maximize the active editor by clicking on the title area.&nbsp; Minimize
-it by clicking in the area again.&nbsp; Maximize it again and then close
-it.&nbsp; Verify that the perspective layout is restored.</li>
-
-<li>
-Drag a bunch of views out of the window to create detached windows.&nbsp;
-Try dragging these views on top of one another to create detached folders.</li>
-
-<li>
-Invoke Perspective > Reset.&nbsp; Answer yes to the dialog and verify that
-the layout of the perspective is restored to the original.</li>
-
-<li>
-Invoke Perspective > Close to close the page.</li>
-</ol>
-Perspective Save As:
-<ol>
-<li>
-Open the resource perspective.</li>
-
-<li>
-Drag a view onto the left tool bar.&nbsp; Drag another out into a detached
-window.</li>
-
-<li>
-In Eclipse you can customize the actions visible in a perspective.&nbsp;
-Invoke Perspective > Customize and select some new views and actions.&nbsp;
-Press OK and verify that the new actions appear in the menu and toolbar.</li>
-
-<li>
-Invoke Perspective > Save As and select the Resource perspective.&nbsp;
-Press OK and answer yes to the verify dialog.</li>
-
-<li>
-Close the perspective.</li>
-
-<li>
-Open the Resource perspective.&nbsp; Verify that the new page has the same
-layout and visible action sets as you created and saved.</li>
-
-<li>
-Close the perspective.</li>
-
-<li>
-Open up the Preferences dialog and view the Perspectives page.&nbsp; Select
-the Resource one and press Reset.</li>
-
-<li>
-Open the Resource perspective.&nbsp; Verify that the new page has the default
-layout.</li>
-
-<li>
-Drag a view onto the left tool bar.&nbsp; Drag another out into a detached
-window.</li>
-
-<li>
-Invoke Perspective > Save As and type the name of a new perspective (ie
-Bob).&nbsp; Press OK and then verify that the window title changes to reflect
-the new perspective.</li>
-
-<li>
-Close all perspectives</li>
-
-<li>
-Open a new Resource perspective and a Bob perspective.&nbsp; Verify that
-the first has the default layout and that the second has your custom layout.</li>
-</ol>
-Testing Two or More Perspectives:
-<ol>
-<li>
-Close all Perspectives</li>
-
-<li>
-Open a Resource perspective.&nbsp; Verify that a new page appears in the
-window with the Resource perspective.</li>
-
-<li>
-In the Navigator select your project and invoke Open Perspective > Java.&nbsp;
-Verify that a new perspective appears with the Java Perspective and that
-the input for the navigator is the project.&nbsp; Cool: Perspectives support
-scoping !!</li>
-
-<li>
-In the Java perspective open one of the text files in an editor.</li>
-
-<li>
-Drag a couple of views out of the window to create detached windows.</li>
-
-<li>
-Modify the action sets.</li>
-
-<li>
-Switch back and forth between the two pages in the window by clicking in
-the left hand tool bar.&nbsp; The active perspective controls the visible
-action sets, views and editors in the window.&nbsp; If you switch between
-two pages these attributes should change.</li>
-
-<li>
-Try Perspective > Next and Previous.</li>
-
-<li>
-Close the second perspective by invoking Perspective > Close.&nbsp; Verify
-that the first perspective is activated.</li>
-</ol>
-Multiple Windows
-<ol>
-<li>
-Start with one open window which has one perspective.</li>
-
-<li>
-Change the Workbench Preferences for "Open Perspective" to "Open in New
-Window".&nbsp; Then open a Java perspective and verify that a new window
-is created.</li>
-
-<li>
-A list of the open windows should appear in the Window menu.&nbsp; Select
-these items to switch between the windows.</li>
-
-<li>
-Close one window and verify that the other is activated.</li>
-
-<li>
-Close the last window and verify that the workbench shuts down.</li>
-</ol>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/ZIP Export.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/ZIP Export.html
deleted file mode 100644
index 135cc42..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/ZIP Export.html
+++ /dev/null
@@ -1,100 +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="OTI Employee">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
-   <title>ZIP Export</title>
-</head>
-<body>
-
-<center>
-<h1>
-ZIP Export</h1></center>
-
-<h2>
-Purpose</h2>
-The plan is to export a project with a large number files/folders at a
-time, using the zip file wizard. The results should be indentical in layout
-and content as the original project used.
-<h2>
-Setup</h2>
-
-<ul>
-<li>
-Download the JUnit zip file source code from www.junit.org.</li>
-
-<li>
-Start the Eclipse workbench</li>
-
-<li>
-Create a new temporary "simple" project called "JUnit Test"</li>
-
-<li>
-Import the JUnit zip file into the project</li>
-
-<li>
-Select File -> Export, select Zip File and press Next.</li>
-</ul>
-
-<h2>
-Export from a project to a new zip file</h2>
-
-<ol>
-<li>
-Select the "JUnit Test" project and mark it as checked.</li>
-
-<li>
-In the Zip File field, type in the filename for the new zip file.</li>
-
-<li>
-Press Finish</li>
-
-<li>
-Verify that the contents in the zip file match the same file and folder
-structure as the source project</li>
-
-<li>
-Verify the content of the files.</li>
-</ol>
-
-<h2>
-Export from a project to an existing zip file</h2>
-
-<ol>
-<li>
-Select the "JUnit Test" project and mark it as checked.</li>
-
-<li>
-In the Zip File field, type in the filename for the existing zip file.</li>
-
-<li>
-Press Finish</li>
-
-<li>
-Click OK in the dialog that appears confirming the overwrite</li>
-
-<li>
-Verify you were prompted to overwrite files</li>
-
-<li>
-Verify that the contents in the zip file match the same file and folder
-structure as the source project.</li>
-
-<li>
-Verify the content of the files.</li>
-</ol>
-
-<h2>
-Cleanup</h2>
-
-<ul>
-<li>
-Delete the temporary project "JUnit Test"</li>
-
-<li>
-Delete the temporary jar file</li>
-</ul>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/Manual Scenario Tests/ZIP Import.html b/tests/org.eclipse.ui.tests/Manual Scenario Tests/ZIP Import.html
deleted file mode 100644
index 105a2df..0000000
--- a/tests/org.eclipse.ui.tests/Manual Scenario Tests/ZIP Import.html
+++ /dev/null
@@ -1,103 +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="OTI Employee">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
-   <title>ZIP Import</title>
-</head>
-<body>
-
-<center>
-<h1>
-ZIP Import</h1></center>
-
-<h2>
-Purpose</h2>
-The plan is to import a large number files/folders at a time, using the
-ZIP file wizard. The results should be indentical in layout and content
-as the original source used.
-<h2>
-Setup</h2>
-
-<ul>
-<li>
-Download the JUnit zip file source code from www.junit.org.</li>
-
-<li>
-Start the Eclipse workbench</li>
-
-<li>
-Create a new temporary "simple" project called "JUnit Test"</li>
-
-<li>
-Select File -> Import, select Zip File and press Next.</li>
-</ul>
-
-<h2>
-Import into an empty project</h2>
-
-<ol>
-<li>
-Click the Browse button and select the ZIP file.</li>
-
-<li>
-Expand the folders in the tree view and until "junit" folder is visible
-and check mark the box next to it. Deselect the "doc" and "javadoc" folders.</li>
-
-<li>
-Type in "JUnit Test" in the Folder field</li>
-
-<li>
-Press Finish</li>
-
-<li>
-Verify that the contents of the project match the same file and folder
-structure as the source in the file system.</li>
-
-<li>
-Verify that the content of the files.</li>
-</ol>
-
-<h2>
-Import into a project with same contents (overwrite)</h2>
-
-<ol>
-<li>
-Click on the Zip File drop down box and select the zip file</li>
-
-<li>
-Expand the folders in the tree view and until "junit" folder is visible
-and check mark the box next to it.&nbsp; Deselect the "doc" and "javadoc"
-folders.</li>
-
-<li>
-Type in "JUnit Test" in the Folder field</li>
-
-<li>
-Check the option "Overwrite existing resources without warning"</li>
-
-<li>
-Press Finish</li>
-
-<li>
-Verify you were not prompted to overwrite files</li>
-
-<li>
-Verify that the contents of the project match the same file and folder
-structure as the source in the file system.</li>
-
-<li>
-Verify that the content of the files.</li>
-</ol>
-
-<h2>
-Cleanup</h2>
-
-<ul>
-<li>
-Delete the temporary project "JUnit Test"</li>
-</ul>
-
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/UI Test Suite.launch b/tests/org.eclipse.ui.tests/UI Test Suite.launch
deleted file mode 100644
index aabf17b..0000000
--- a/tests/org.eclipse.ui.tests/UI Test Suite.launch
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
-<booleanAttribute key="askclear" value="false"/>
-<booleanAttribute key="automaticAdd" value="true"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="checked" value="[NONE]"/>
-<booleanAttribute key="clearConfig" value="true"/>
-<booleanAttribute key="clearws" value="true"/>
-<booleanAttribute key="clearwslog" value="false"/>
-<booleanAttribute key="com.mountainminds.eclemma.core.INPLACE_INSTRUMENTATION" value="true"/>
-<listAttribute key="com.mountainminds.eclemma.core.INSTRUMENTATION_PATHS">
-<listEntry value="/org.eclipse.ui.win32/bin"/>
-<listEntry value="/org.eclipse.ui.workbench/bin"/>
-<listEntry value="/org.eclipse.ui.workbench.compatibility/bin"/>
-<listEntry value="/org.eclipse.ui/bin"/>
-<listEntry value="/org.eclipse.ui.views/bin"/>
-<listEntry value="/org.eclipse.ui.ide.application/bin"/>
-<listEntry value="/org.eclipse.core.commands/bin"/>
-<listEntry value="/org.eclipse.jface/bin"/>
-<listEntry value="/org.eclipse.ui.ide/bin"/>
-</listAttribute>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
-<booleanAttribute key="default" value="true"/>
-<booleanAttribute key="includeOptional" value="true"/>
-<stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/UiTestSuite.java"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.ui.tests.UiTestSuite"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.ui.tests"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xms40m -Xmx256m"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<stringAttribute key="product" value="org.eclipse.sdk.ide"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="templateConfig" value=""/>
-<booleanAttribute key="tracing" value="false"/>
-<booleanAttribute key="useDefaultConfig" value="true"/>
-<booleanAttribute key="useDefaultConfigArea" value="false"/>
-<booleanAttribute key="useProduct" value="true"/>
-</launchConfiguration>
diff --git a/tests/org.eclipse.ui.tests/UI-Parts References Test Suite.launch b/tests/org.eclipse.ui.tests/UI-Parts References Test Suite.launch
deleted file mode 100644
index 5ea8856..0000000
--- a/tests/org.eclipse.ui.tests/UI-Parts References Test Suite.launch
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
-<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
-<booleanAttribute key="askclear" value="true"/>
-<booleanAttribute key="automaticAdd" value="true"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bootstrap" value=""/>
-<booleanAttribute key="clearConfig" value="true"/>
-<booleanAttribute key="clearws" value="true"/>
-<booleanAttribute key="clearwslog" value="false"/>
-<booleanAttribute key="com.mountainminds.eclemma.core.INPLACE_INSTRUMENTATION" value="true"/>
-<listAttribute key="com.mountainminds.eclemma.core.INSTRUMENTATION_PATHS">
-<listEntry value="/org.eclipse.ui.ide/bin"/>
-<listEntry value="/org.eclipse.ui.workbench/bin"/>
-<listEntry value="/org.eclipse.ui.views/bin"/>
-</listAttribute>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
-<booleanAttribute key="default" value="true"/>
-<booleanAttribute key="includeOptional" value="true"/>
-<stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.ui.tests/Eclipse Part References Test/org/eclipse/ui/parts/tests/PartsReferencesTestSuite.java"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.ui.parts.tests.PartsReferencesTestSuite"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.ui.tests"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<stringAttribute key="product" value="org.eclipse.sdk.ide"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="templateConfig" value=""/>
-<booleanAttribute key="tracing" value="false"/>
-<booleanAttribute key="useDefaultConfig" value="true"/>
-<booleanAttribute key="useDefaultConfigArea" value="false"/>
-<booleanAttribute key="useProduct" value="false"/>
-</launchConfiguration>
diff --git a/tests/org.eclipse.ui.tests/UI-Session Tests.launch b/tests/org.eclipse.ui.tests/UI-Session Tests.launch
deleted file mode 100644
index 4332e77..0000000
--- a/tests/org.eclipse.ui.tests/UI-Session Tests.launch
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
-<booleanAttribute key="askclear" value="false"/>
-<booleanAttribute key="automaticAdd" value="true"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="checked" value="[NONE]"/>
-<booleanAttribute key="clearConfig" value="true"/>
-<booleanAttribute key="clearws" value="true"/>
-<booleanAttribute key="clearwslog" value="false"/>
-<booleanAttribute key="com.mountainminds.eclemma.core.INPLACE_INSTRUMENTATION" value="true"/>
-<listAttribute key="com.mountainminds.eclemma.core.INSTRUMENTATION_PATHS">
-<listEntry value="/org.eclipse.ui.workbench.compatibility/bin"/>
-<listEntry value="/org.eclipse.ui.ide/bin"/>
-<listEntry value="/org.eclipse.ui/bin"/>
-<listEntry value="/org.eclipse.ui.workbench/bin"/>
-<listEntry value="/org.eclipse.jface/bin"/>
-<listEntry value="/org.eclipse.core.commands/bin"/>
-<listEntry value="/org.eclipse.ui.ide.application/bin"/>
-</listAttribute>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
-<booleanAttribute key="default" value="true"/>
-<booleanAttribute key="includeOptional" value="true"/>
-<stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.ui.tests/Eclipse UI Tests/org/eclipse/ui/tests/session/SessionTests.java"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
-<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.ui.tests.session.SessionTests"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.ui.tests"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<stringAttribute key="product" value="org.eclipse.sdk.ide"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="templateConfig" value=""/>
-<booleanAttribute key="tracing" value="false"/>
-<booleanAttribute key="useDefaultConfig" value="true"/>
-<booleanAttribute key="useDefaultConfigArea" value="false"/>
-<booleanAttribute key="useProduct" value="true"/>
-</launchConfiguration>
diff --git a/tests/org.eclipse.ui.tests/about.html b/tests/org.eclipse.ui.tests/about.html
deleted file mode 100644
index 4602330..0000000
--- a/tests/org.eclipse.ui.tests/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation 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
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/build.properties b/tests/org.eclipse.ui.tests/build.properties
deleted file mode 100644
index 5de7653..0000000
--- a/tests/org.eclipse.ui.tests/build.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.uitests.jar = Eclipse JFace Tests/,\
-                     Eclipse UI Tests/,\
-                     Eclipse Part References Test/
-bin.includes = icons/,\
-               doc/,\
-               data/,\
-               plugin.properties,\
-               plugin.xml,\
-               *.html,\
-               *.jar,\
-               .options,\
-               *.xml,\
-               uiSniff,\
-               uiSniff.bat,\
-               META-INF/
-src.includes = about.html
diff --git a/tests/org.eclipse.ui.tests/data/PerspectiveSwitchSourceCode.txt b/tests/org.eclipse.ui.tests/data/PerspectiveSwitchSourceCode.txt
deleted file mode 100644
index f278cf1..0000000
--- a/tests/org.eclipse.ui.tests/data/PerspectiveSwitchSourceCode.txt
+++ /dev/null
@@ -1,422 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.internal.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashPipe;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.SortedSet;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-public final class Util {
-	
-    public final static SortedMap EMPTY_SORTED_MAP = Collections
-            .unmodifiableSortedMap(new TreeMap());
-
-    public final static SortedSet EMPTY_SORTED_SET = Collections
-            .unmodifiableSortedSet(new TreeSet());
-
-    public final static String ZERO_LENGTH_STRING = ""; //$NON-NLS-1$
-
-	/**
-	 * Ensures that a string is not null. Converts null strings into empty
-	 * strings, and leaves any other string unmodified. Use this to help
-	 * wrap calls to methods that return null instead of the empty string.
-	 * Can also help protect against implementation errors in methods that
-	 * are not supposed to return null. 
-	 * 
-	 * @param input input string (may be null)
-	 * @return input if not null, or the empty string if input is null
-	 */
-	public static String safeString(String input) {
-		if (input != null) {
-			return input;
-		}
-		
-		return ZERO_LENGTH_STRING;
-	}
-    
-    public static void assertInstance(Object object, Class c) {
-        assertInstance(object, c, false);
-    }
-
-    public static void assertInstance(Object object, Class c, boolean allowNull) {
-        if (object == null && allowNull) return;
-
-        if (object == null || c == null)
-            throw new NullPointerException();
-        else if (!c.isInstance(object)) throw new IllegalArgumentException();
-    }
-
-    public static int compare(boolean left, boolean right) {
-        return left == false ? (right == true ? -1 : 0) : 1;
-    }
-
-    public static int compare(Comparable left, Comparable right) {
-        if (left == null && right == null)
-            return 0;
-        else if (left == null)
-            return -1;
-        else if (right == null)
-            return 1;
-        else
-            return left.compareTo(right);
-    }
-
-    public static int compare(Comparable[] left, Comparable[] right) {
-        if (left == null && right == null)
-            return 0;
-        else if (left == null)
-            return -1;
-        else if (right == null)
-            return 1;
-        else {
-            int l = left.length;
-            int r = right.length;
-
-            if (l != r)
-                return l - r;
-            else {
-                for (int i = 0; i < l; i++) {
-                    int compareTo = compare(left[i], right[i]);
-
-                    if (compareTo != 0) return compareTo;
-                }
-
-                return 0;
-            }
-        }
-    }
-
-    public static int compare(int left, int right) {
-        return left - right;
-    }
-
-    public static int compare(List left, List right) {
-        if (left == null && right == null)
-            return 0;
-        else if (left == null)
-            return -1;
-        else if (right == null)
-            return 1;
-        else {
-            int l = left.size();
-            int r = right.size();
-
-            if (l != r)
-                return l - r;
-            else {
-                for (int i = 0; i < l; i++) {
-                    int compareTo = compare((Comparable) left.get(i),
-                            (Comparable) right.get(i));
-
-                    if (compareTo != 0) return compareTo;
-                }
-
-                return 0;
-            }
-        }
-    }
-
-    public static int compare(Object left, Object right) {
-        if (left == null && right == null)
-            return 0;
-        else if (left == null)
-            return -1;
-        else if (right == null)
-            return 1;
-        else
-            return left.toString().compareTo(right.toString());
-    }
-
-    public static void diff(Map left, Map right, Set leftOnly, Set different,
-            Set rightOnly) {
-        if (left == null || right == null || leftOnly == null
-                || different == null || rightOnly == null)
-                throw new NullPointerException();
-
-        Iterator iterator = left.keySet().iterator();
-
-        while (iterator.hasNext()) {
-            Object key = iterator.next();
-
-            if (!right.containsKey(key))
-                leftOnly.add(key);
-            else if (!Util.equals(left.get(key), right.get(key)))
-                    different.add(key);
-        }
-
-        iterator = right.keySet().iterator();
-
-        while (iterator.hasNext()) {
-            Object key = iterator.next();
-
-            if (!left.containsKey(key)) rightOnly.add(key);
-        }
-    }
-
-    public static void diff(Set left, Set right, Set leftOnly, Set rightOnly) {
-        if (left == null || right == null || leftOnly == null
-                || rightOnly == null) throw new NullPointerException();
-
-        Iterator iterator = left.iterator();
-
-        while (iterator.hasNext()) {
-            Object object = iterator.next();
-
-            if (!right.contains(object)) leftOnly.add(object);
-        }
-
-        iterator = right.iterator();
-
-        while (iterator.hasNext()) {
-            Object object = iterator.next();
-
-            if (!left.contains(object)) rightOnly.add(object);
-        }
-    }
-
-    public static boolean endsWith(List left, List right, boolean equals) {
-        if (left == null || right == null)
-            return false;
-        else {
-            int l = left.size();
-            int r = right.size();
-
-            if (r > l || !equals && r == l) return false;
-
-            for (int i = 0; i < r; i++)
-                if (!equals(left.get(l - i - 1), right.get(r - i - 1)))
-                        return false;
-
-            return true;
-        }
-    }
-
-    public static boolean endsWith(Object[] left, Object[] right, boolean equals) {
-        if (left == null || right == null)
-            return false;
-        else {
-            int l = left.length;
-            int r = right.length;
-
-            if (r > l || !equals && r == l) return false;
-
-            for (int i = 0; i < r; i++)
-                if (!equals(left[l - i - 1], right[r - i - 1])) return false;
-
-            return true;
-        }
-    }
-
-    public static boolean equals(boolean left, boolean right) {
-        return left == right;
-    }
-
-    public static boolean equals(int left, int right) {
-        return left == right;
-    }
-
-    public static boolean equals(Object left, Object right) {
-        return left == null ? right == null : ((right != null) && left
-                .equals(right));
-    }
-
-    public static int hashCode(boolean b) {
-        return b ? Boolean.TRUE.hashCode() : Boolean.FALSE.hashCode();
-    }
-
-    public static int hashCode(int i) {
-        return i;
-    }
-
-    public static int hashCode(Object object) {
-        return object != null ? object.hashCode() : 0;
-    }
-
-    public static Collection safeCopy(Collection collection, Class c) {
-        return safeCopy(collection, c, false);
-    }
-
-    public static Collection safeCopy(Collection collection, Class c,
-            boolean allowNullElements) {
-        if (collection == null || c == null) throw new NullPointerException();
-
-        collection = Collections.unmodifiableCollection(new ArrayList(collection));
-        Iterator iterator = collection.iterator();
-
-        while (iterator.hasNext())
-            assertInstance(iterator.next(), c, allowNullElements);
-
-        return collection;
-    }
-
-    public static List safeCopy(List list, Class c) {
-        return safeCopy(list, c, false);
-    }
-
-    public static List safeCopy(List list, Class c, boolean allowNullElements) {
-        if (list == null || c == null) throw new NullPointerException();
-
-        list = Collections.unmodifiableList(new ArrayList(list));
-        Iterator iterator = list.iterator();
-
-        while (iterator.hasNext())
-            assertInstance(iterator.next(), c, allowNullElements);
-
-        return list;
-    }
-
-    public static Map safeCopy(Map map, Class keyClass, Class valueClass) {
-        return safeCopy(map, keyClass, valueClass, false, false);
-    }
-
-    public static Map safeCopy(Map map, Class keyClass, Class valueClass,
-            boolean allowNullKeys, boolean allowNullValues) {
-        if (map == null || keyClass == null || valueClass == null)
-                throw new NullPointerException();
-
-        map = Collections.unmodifiableMap(new HashMap(map));
-        Iterator iterator = map.entrySet().iterator();
-
-        while (iterator.hasNext()) {
-            Map.Entry entry = (Map.Entry) iterator.next();
-            assertInstance(entry.getKey(), keyClass, allowNullKeys);
-            assertInstance(entry.getValue(), valueClass, allowNullValues);
-        }
-
-        return map;
-    }
-
-    public static Set safeCopy(Set set, Class c) {
-        return safeCopy(set, c, false);
-    }
-
-    public static Set safeCopy(Set set, Class c, boolean allowNullElements) {
-        if (set == null || c == null) throw new NullPointerException();
-
-        set = Collections.unmodifiableSet(new HashSet(set));
-        Iterator iterator = set.iterator();
-
-        while (iterator.hasNext())
-            assertInstance(iterator.next(), c, allowNullElements);
-
-        return set;
-    }
-
-    public static SortedMap safeCopy(SortedMap sortedMap, Class keyClass,
-            Class valueClass) {
-        return safeCopy(sortedMap, keyClass, valueClass, false, false);
-    }
-
-    public static SortedMap safeCopy(SortedMap sortedMap, Class keyClass,
-            Class valueClass, boolean allowNullKeys, boolean allowNullValues) {
-        if (sortedMap == null || keyClass == null || valueClass == null)
-                throw new NullPointerException();
-
-        sortedMap = Collections.unmodifiableSortedMap(new TreeMap(sortedMap));
-        Iterator iterator = sortedMap.entrySet().iterator();
-
-        while (iterator.hasNext()) {
-            Map.Entry entry = (Map.Entry) iterator.next();
-            assertInstance(entry.getKey(), keyClass, allowNullKeys);
-            assertInstance(entry.getValue(), valueClass, allowNullValues);
-        }
-
-        return sortedMap;
-    }
-
-    public static SortedSet safeCopy(SortedSet sortedSet, Class c) {
-        return safeCopy(sortedSet, c, false);
-    }
-
-    public static SortedSet safeCopy(SortedSet sortedSet, Class c,
-            boolean allowNullElements) {
-        if (sortedSet == null || c == null) throw new NullPointerException();
-
-        sortedSet = Collections.unmodifiableSortedSet(new TreeSet(sortedSet));
-        Iterator iterator = sortedSet.iterator();
-
-        while (iterator.hasNext())
-            assertInstance(iterator.next(), c, allowNullElements);
-
-        return sortedSet;
-    }
-
-    public static boolean startsWith(List left, List right, boolean equals) {
-        if (left == null || right == null)
-            return false;
-        else {
-            int l = left.size();
-            int r = right.size();
-
-            if (r > l || !equals && r == l) return false;
-
-            for (int i = 0; i < r; i++)
-                if (!equals(left.get(i), right.get(i))) return false;
-
-            return true;
-        }
-    }
-
-    public static boolean startsWith(Object[] left, Object[] right,
-            boolean equals) {
-        if (left == null || right == null)
-            return false;
-        else {
-            int l = left.length;
-            int r = right.length;
-
-            if (r > l || !equals && r == l) return false;
-
-            for (int i = 0; i < r; i++)
-                if (!equals(left[i], right[i])) return false;
-
-            return true;
-        }
-    }
-
-    public static String translateString(ResourceBundle resourceBundle,
-            String key) {
-        return Util.translateString(resourceBundle, key, key, true, true);
-    }
-
-    public static String translateString(ResourceBundle resourceBundle,
-            String key, String string, boolean signal, boolean trim) {
-        if (resourceBundle != null && key != null)
-                try {
-                    final String translatedString = resourceBundle
-                            .getString(key);
-
-                    if (translatedString != null)
-                            return trim ? translatedString.trim()
-                                    : translatedString;
-                } catch (MissingResourceException eMissingResource) {
-                    if (signal) System.err.println(eMissingResource);
-                }
-
-        return trim ? string.trim() : string;
-    }
-
-    private Util() {
-    }
-}
diff --git a/tests/org.eclipse.ui.tests/data/dragtests.xml b/tests/org.eclipse.ui.tests/data/dragtests.xml
deleted file mode 100644
index 7c92bb0..0000000
--- a/tests/org.eclipse.ui.tests/data/dragtests.xml
+++ /dev/null
@@ -1,199 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<dragtests>
-<test name="drag Problems folder to center of Problems" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems folder to Problems view tab area" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems folder to right of editor area" result="layout ((*Navigator)|(layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))|active (*Outline, Problems, Properties)))"/>
-<test name="drag Problems folder to right of Problems" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 folder to left of window" result="layout (((*Navigator)|layout (active (*Mock Editor 2)|(Mock Editor 1, *Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to bottom of window" result="layout ((layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties))-active (*Navigator))"/>
-<test name="drag editor 0 to top of window" result="layout (((*Navigator)|layout (active (*Mock Editor 1)-((*Mock Editor 2)|(*Mock Editor 2))))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to bottom of Navigator" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems to left of editor area" result="layout (((*Navigator)|(active (*Problems)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))))-(*Outline, Properties))"/>
-<test name="drag Problems to top of editor area" result="layout (((*Navigator)|(active (*Problems)-layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))))-(*Outline, Properties))"/>
-<test name="drag editor 0 to top of editor 2" result="layout (((*Navigator)|layout ((*Mock Editor 2)|(active (*Mock Editor 1)-(*Mock Editor 2))))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 folder to bottom of editor 2" result="layout (((*Navigator)|layout ((*Mock Editor 2)-active (Mock Editor 1, *Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems folder to left of editor area" result="layout ((*Navigator)|(active (*Outline, Problems, Properties)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))))"/>
-<test name="drag Problems to top of Navigator" result="layout (((active (*Problems)-(*Navigator))|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties))"/>
-<test name="drag editor 2 folder to center of editor 0" result="layout (((*Navigator)|layout active (Mock Editor 1, Mock Editor 2, *Mock Editor 2))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to top of Navigator" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 to bottom of window" result="layout (((*Navigator)|layout (((*Mock Editor 2)|(*Mock Editor 2))-active (*Mock Editor 1)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems folder to bottom of window" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-active (*Outline, Problems, Properties))"/>
-<test name="drag editor 2 folder to left of editor 2" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to top of editor area" result="layout ((active (*Navigator)-layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 folder to bottom of editor 2" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 folder to right of editor 0" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to fast view bar" result="fastviews (Navigator), layout (layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems to right of Navigator" result="layout ((((*Navigator)|active (*Problems))|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties))"/>
-<test name="drag Navigator folder to left of editor area" result="layout ((active (*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to center of Problems" result="layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-active (Outline, Problems, Properties, *Navigator))"/>
-<test name="drag editor 2 folder to center of editor 2" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems folder to bottom of Navigator" result="layout (((*Navigator)-active (*Outline, Problems, Properties))|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))"/>
-<test name="drag editor 0 folder to left of editor 0" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to center of Navigator" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 folder to left of window" result="layout (((*Navigator)|layout (active (Mock Editor 1, *Mock Editor 2)|(*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 to bottom of editor 2" result="layout (((*Navigator)|layout ((*Mock Editor 2)|((*Mock Editor 2)-active (*Mock Editor 1))))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to top of editor area" result="layout ((active (*Navigator)-layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 folder to left of editor 0" result="layout (((*Navigator)|layout (active (*Mock Editor 2)|(Mock Editor 1, *Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 to right of editor 2" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to right of window" result="layout ((layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties))|active (*Navigator))"/>
-<test name="drag editor 0 to center of Navigator" result="layout (((*Navigator)|layout (active (*Mock Editor 1)|((*Mock Editor 2)|(*Mock Editor 2))))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 folder to center of Navigator" result="layout (((*Navigator)|layout (active (Mock Editor 1, *Mock Editor 2)|(*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 to center of editor 2" result="layout (((*Navigator)|layout ((*Mock Editor 2)|active (Mock Editor 2, *Mock Editor 1)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 to left of editor 0" result="layout (((*Navigator)|layout (active (*Mock Editor 2)|(Mock Editor 1, *Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 to right of window" result="layout (((*Navigator)|layout (((*Mock Editor 2)|(*Mock Editor 2))|active (*Mock Editor 1)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to bottom of window" result="layout ((layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties))-active (*Navigator))"/>
-<test name="drag Navigator folder to bottom of Problems" result="layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-((*Outline, Problems, Properties)-active (*Navigator)))"/>
-<test name="drag Problems to bottom of Navigator" result="layout ((((*Navigator)-active (*Problems))|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties))"/>
-<test name="drag Problems folder to center of Navigator" result="layout (active (Navigator, *Outline, Problems, Properties)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))"/>
-<test name="drag maximized Navigator folder to right of editor area" result="layout ((layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))|active (*Navigator))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 to center of editor 2" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 folder to right of editor 0" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 to bottom of editor 0" result="layout (((*Navigator)|layout (((*Mock Editor 2)-active (*Mock Editor 1))|(*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems to bottom of Problems" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-((*Outline, Properties)-active (*Problems)))"/>
-<test name="drag editor 2 to center of editor 0" result="layout (((*Navigator)|layout active (Mock Editor 1, Mock Editor 2, *Mock Editor 2))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 to center of editor 0" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 to right of editor 0" result="layout (((*Navigator)|layout (((*Mock Editor 2)|active (*Mock Editor 1))|(*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to Navigator view tab area" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to right of editor area" result="layout ((layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))|active (*Navigator))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 folder to center of Navigator" result="layout (((*Navigator)|layout (active (*Mock Editor 2)|(Mock Editor 1, *Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 folder to top of editor 2" result="layout (((*Navigator)|layout (active (Mock Editor 1, *Mock Editor 2)-(*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag maximized Problems to right of editor area" result="layout (((*Navigator)|(layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))|active (*Problems)))-(*Outline, Properties))"/>
-<test name="drag Problems to right of Problems" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-((*Outline, Properties)|active (*Problems)))"/>
-<test name="drag editor 2 to right of window" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 folder to right of window" result="layout (((*Navigator)|layout ((*Mock Editor 2)|active (Mock Editor 1, *Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 folder to top of window" result="layout (((*Navigator)|layout (active (*Mock Editor 2)-(Mock Editor 1, *Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems folder to top of editor area" result="layout ((*Navigator)|(active (*Outline, Problems, Properties)-layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))))"/>
-<test name="drag Navigator folder to right of Navigator" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 to left of editor 2" result="layout (((*Navigator)|layout ((*Mock Editor 2)|(active (*Mock Editor 1)|(*Mock Editor 2))))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems folder to Navigator view tab area" result="layout ((active (*Outline, Problems, Properties)|(*Navigator))|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))"/>
-<test name="drag editor 2 to top of window" result="layout (((*Navigator)|layout (active (*Mock Editor 2)-(Mock Editor 1, *Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to left of editor area" result="layout ((active (*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems folder to left of Problems" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems folder to bottom of editor area" result="layout ((*Navigator)|(layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-active (*Outline, Problems, Properties)))"/>
-<test name="drag editor 2 folder to right of editor 2" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 folder to bottom of window" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)-active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 to right of editor 2" result="layout (((*Navigator)|layout ((*Mock Editor 2)|((*Mock Editor 2)|active (*Mock Editor 1))))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to left of Problems" result="layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(active (*Navigator)|(*Outline, Problems, Properties)))"/>
-<test name="drag editor 2 to left of window" result="layout (((*Navigator)|layout (active (*Mock Editor 2)|(Mock Editor 1, *Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to left of Navigator" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to top of Navigator" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to left of window" result="layout (active (*Navigator)|(layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties)))"/>
-<test name="drag Problems to center of Navigator" result="layout ((active (Navigator, *Problems)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties))"/>
-<test name="drag Problems folder to top of window" result="layout (active (*Outline, Problems, Properties)-((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))))"/>
-<test name="drag Problems to left of Problems" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(active (*Problems)|(*Outline, Properties)))"/>
-<test name="drag Navigator to bottom of editor area" result="layout ((layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-active (*Navigator))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to right of window" result="layout ((layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties))|active (*Navigator))"/>
-<test name="drag editor 0 to left of editor 0" result="layout (((*Navigator)|layout ((active (*Mock Editor 1)|(*Mock Editor 2))|(*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems to fast view bar" result="fastviews (Problems), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Properties))"/>
-<test name="drag Problems folder to left of Navigator" result="layout ((active (*Outline, Problems, Properties)|(*Navigator))|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))"/>
-<test name="drag Navigator to top of window" result="layout (active (*Navigator)-(layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties)))"/>
-<test name="drag Problems folder to left of window" result="layout (active (*Outline, Problems, Properties)|((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))))"/>
-<test name="drag editor 0 folder to left of editor 2" result="layout (((*Navigator)|layout (active (Mock Editor 1, *Mock Editor 2)|(*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems to bottom of editor area" result="layout (((*Navigator)|(layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-active (*Problems)))-(*Outline, Properties))"/>
-<test name="drag editor 2 to right of editor 0" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag maximized Navigator to right of editor area" result="layout ((layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))|active (*Navigator))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems folder to fast view bar" result="fastviews (Outline, Problems, Properties), layout ((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))"/>
-<test name="drag Problems folder to top of Navigator" result="layout ((active (*Outline, Problems, Properties)-(*Navigator))|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))"/>
-<test name="drag editor 0 folder to center of editor 2" result="layout (((*Navigator)|layout active (Mock Editor 2, Mock Editor 1, *Mock Editor 2))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems to left of Navigator" result="layout (((active (*Problems)|(*Navigator))|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties))"/>
-<test name="drag Navigator folder to fast view bar" result="fastviews (Navigator), layout (layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to right of Problems" result="layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-((*Outline, Problems, Properties)|active (*Navigator)))"/>
-<test name="drag Navigator to center of Navigator" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to top of window" result="layout (active (*Navigator)-(layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties)))"/>
-<test name="drag Navigator folder to center of Problems" result="layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-active (Outline, Problems, Properties, *Navigator))"/>
-<test name="drag editor 2 to left of editor 2" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to right of Navigator" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 folder to bottom of window" result="layout (((*Navigator)|layout ((*Mock Editor 2)-active (Mock Editor 1, *Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag maximized Problems folder to right of editor area" result="layout ((*Navigator)|(layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))|active (Outline, *Problems, Properties)))"/>
-<test name="drag editor 0 folder to top of window" result="layout (((*Navigator)|layout (active (Mock Editor 1, *Mock Editor 2)-(*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 folder to right of editor 2" result="layout (((*Navigator)|layout ((*Mock Editor 2)|active (Mock Editor 1, *Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 to center of Navigator" result="layout (((*Navigator)|layout (active (*Mock Editor 2)|(Mock Editor 1, *Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 folder to top of editor 2" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems folder to right of window" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))|active (*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to left of Problems" result="layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(active (*Navigator)|(*Outline, Problems, Properties)))"/>
-<test name="drag Problems folder to bottom of Problems" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems folder to right of Navigator" result="layout (((*Navigator)|active (*Outline, Problems, Properties))|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))"/>
-<test name="drag Navigator to left of window" result="layout (active (*Navigator)|(layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties)))"/>
-<test name="drag Navigator to Problems view tab area" result="layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-active (Outline, Problems, Properties, *Navigator))"/>
-<test name="drag editor 2 folder to right of window" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 folder to center of editor 0" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems to top of window" result="layout (active (*Problems)-(((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties)))"/>
-<test name="drag Navigator folder to Problems view tab area" result="layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(active (*Navigator)|(*Outline, Problems, Properties)))"/>
-<test name="drag Problems to left of window" result="layout (active (*Problems)|(((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties)))"/>
-<test name="drag Navigator to right of Problems" result="layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-((*Outline, Problems, Properties)|active (*Navigator)))"/>
-<test name="drag Problems to center of Problems" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 to bottom of editor 0" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)-active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems to right of editor area" result="layout (((*Navigator)|(layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))|active (*Problems)))-(*Outline, Properties))"/>
-<test name="drag editor 0 to left of window" result="layout (((*Navigator)|layout (active (*Mock Editor 1)|((*Mock Editor 2)|(*Mock Editor 2))))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to Navigator view tab area" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 folder to bottom of editor 0" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)-active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to bottom of editor area" result="layout ((layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-active (*Navigator))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to bottom of Navigator" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to bottom of Problems" result="layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-((*Outline, Problems, Properties)-active (*Navigator)))"/>
-<test name="drag Navigator to left of Navigator" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to right of editor area" result="layout ((layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))|active (*Navigator))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 to top of editor 2" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 to bottom of editor 2" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems to Problems view tab area" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems to bottom of window" result="layout ((((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties))-active (*Problems))"/>
-<test name="drag Problems to right of window" result="layout ((((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties))|active (*Problems))"/>
-<test name="drag Problems to Navigator view tab area" result="layout ((active (Navigator, *Problems)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties))"/>
-<test name="drag editor 2 to bottom of window" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)-active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 folder to bottom of editor 0" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems folder to top of Problems" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to top of Problems" result="layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(active (*Navigator)-(*Outline, Problems, Properties)))"/>
-<test name="drag Problems to top of Problems" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(active (*Problems)-(*Outline, Properties)))"/>
-<test name="drag Navigator to top of Problems" result="layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(active (*Navigator)-(*Outline, Problems, Properties)))"/>
-<test name="drag Problems to Problems view title area" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-((*Outline, Properties)|active (*Problems)))"/>
-<test name="drag editor 0 to editor 0 title area" result="layout (((*Navigator)|layout (((*Mock Editor 2)|active (*Mock Editor 1))|(*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to Problems view title area" result="layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-((*Outline, Problems, Properties)|active (*Navigator)))"/>
-<test name="drag editor 0 folder to editor 0 tab area" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems folder to Problems view title area" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 folder to editor 0 tab area" result="layout (((*Navigator)|layout (active (*Mock Editor 2)|(Mock Editor 1, *Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 to editor 0 tab area" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to Problems view title area" result="layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-((*Outline, Problems, Properties)|active (*Navigator)))"/>
-<test name="drag editor 2 folder to editor 0 title area" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 to editor 0 tab area" result="layout (((*Navigator)|layout active (Mock Editor 1, Mock Editor 2, *Mock Editor 2))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 to editor 0 title area" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 folder to editor 0 title area" result="layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-
-<!-- detached tests -->
-<test name="drag Navigator to center of Mock View 3 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3, Navigator)), layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to center of Mock View 1 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2, Navigator)dWindow (Mock View 3)), layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 folder to center of Mock View 3 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 folder to center of Mock View 1 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 to out of the window - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 folder to Mock View 1 view tab area - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems to Mock View 1 view tab area - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2, Problems)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties))"/>
-<test name="drag Problems folder to out of the window - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)dWindow (Outline, Problems, Properties)), layout ((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))"/>
-<test name="drag editor 2 to out of the window - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 to Mock View 1 view tab area - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 to center of Mock View 3 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to out of the window - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)dWindow (Navigator)), layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 folder to center of Mock View 1 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems to out of the window - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)dWindow (Problems)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties))"/>
-<test name="drag editor 2 to center of Mock View 1 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems to center of Mock View 1 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2, Problems)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties))"/>
-<test name="drag editor 0 to center of Mock View 3 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 folder to Mock View 1 view tab area - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 folder to center of Mock View 3 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 to Mock View 1 view tab area - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems to center of Mock View 3 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3, Problems)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties))"/>
-<test name="drag editor 0 folder to out of the window - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to Mock View 1 view tab area - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2, Navigator)dWindow (Mock View 3)), layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator to out of the window - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)dWindow (Navigator)), layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 0 to center of Mock View 1 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<test name="drag editor 2 folder to out of the window - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)), layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Problems, Properties))"/>
-<!-- end of detached tests -->
-
-<!-- The following tests are recorded here but are actually incorrect
-	 due to an existing defect preventing the drop of stacks onto detached views -->
-<test name="drag Problems folder to center of Mock View 1 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)dWindow (Outline, Problems, Properties)), layout ((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))"/>
-<test name="drag Navigator folder to Mock View 1 view tab area - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)dWindow (Navigator)), layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to center of Mock View 3 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)dWindow (Navigator)), layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties))"/>
-<test name="drag Navigator folder to center of Mock View 1 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)dWindow (Navigator)), layout (layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties))"/>
-<test name="drag Problems folder to Mock View 1 view tab area - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)dWindow (Outline, Problems, Properties)), layout ((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))"/>
-<test name="drag Problems folder to center of Mock View 3 - detached" result="detachedWindows (dWindow (Mock View 1, Mock View 2)dWindow (Mock View 3)dWindow (Outline, Problems, Properties)), layout ((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))"/>
-<!-- End of error tests -->
-
-</dragtests>
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes.txt b/tests/org.eclipse.ui.tests/data/dynamic_classes.txt
deleted file mode 100644
index 64109bb..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This zip is not used any more, please check out dynamic_classes as
-org.eclipse.ui.dynamicCode
-
-dyanmic_classes.zip contains a project that can be used to rebuild any of the jars that are contained within the above dynamic plugin directories.
\ No newline at end of file
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes.zip b/tests/org.eclipse.ui.tests/data/dynamic_classes.zip
deleted file mode 100644
index dae48aa..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/.classpath b/tests/org.eclipse.ui.tests/data/dynamic_classes/.classpath
deleted file mode 100644
index 865f64c..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/.classpath
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" output="intro.bin" path="intro"/>
-	<classpathentry kind="src" output="statusHandler.bin" path="statusHandler"/>
-	<classpathentry kind="src" output="browser.bin" path="browser"/>
-	<classpathentry kind="src" output="editor.bin" path="editor"/>
-	<classpathentry kind="src" output="view.bin" path="view"/>
-	<classpathentry kind="src" output="oc.bin" path="oc"/>
-	<classpathentry kind="src" output="newWizard.bin" path="newWizard"/>
-	<classpathentry kind="src" output="perspective.bin" path="perspective"/>
-	<classpathentry kind="src" output="startup.bin" path="startup"/>
-	<classpathentry kind="src" output="decorator.bin" path="decorator"/>
-	<classpathentry kind="src" output="help.bin" path="help"/>
-	<classpathentry kind="src" output="propertyPage.bin" path="propertyPage"/>
-	<classpathentry kind="src" output="workingSet.bin" path="workingSet"/>
-	<classpathentry kind="src" output="preferencePage.bin" path="preferencePage"/>
-	<classpathentry kind="src" output="commands.bin" path="commands"/>
-	<classpathentry kind="src" output="handlers.bin" path="handlers"/>
-	<classpathentry kind="src" output="markerSupport.bin" path="markerSupport"/>
-	<classpathentry kind="src" output="menus.bin" path="menus"/>
-	<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/tests/org.eclipse.ui.tests/data/dynamic_classes/.cvsignore b/tests/org.eclipse.ui.tests/data/dynamic_classes/.cvsignore
deleted file mode 100755
index 3c92d64..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.bin
-jars
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/.externalToolBuilders/Jar Builder.launch b/tests/org.eclipse.ui.tests/data/dynamic_classes/.externalToolBuilders/Jar Builder.launch
deleted file mode 100644
index 8133806..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/.externalToolBuilders/Jar Builder.launch
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
-<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
-<booleanAttribute key="org.eclipse.ant.ui.DEFAULT_VM_INSTALL" value="false"/>
-<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="true"/>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="full,incremental,"/>
-<booleanAttribute key="org.eclipse.ant.ui.ATTR_TARGETS_UPDATED" value="true"/>
-<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${workspace}"/>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.ui.dynamicCode/build.xml"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${workspace_loc:/org.eclipse.ui.dynamicCode/build.xml}"/>
-<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.ant.ui.AntClasspathProvider"/>
-</launchConfiguration>
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/.project b/tests/org.eclipse.ui.tests/data/dynamic_classes/.project
deleted file mode 100644
index f88d6d2..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/.project
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ui.dynamicCode</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
-			<triggers>full,incremental,</triggers>
-			<arguments>
-				<dictionary>
-					<key>LaunchConfigHandle</key>
-					<value>&lt;project&gt;/.externalToolBuilders/Jar Builder.launch</value>
-				</dictionary>
-			</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/tests/org.eclipse.ui.tests/data/dynamic_classes/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.ui.tests/data/dynamic_classes/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 908a91f..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,12 +0,0 @@
-#Wed Jan 03 14:58:34 EST 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.1
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.3
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/META-INF/MANIFEST.MF b/tests/org.eclipse.ui.tests/data/dynamic_classes/META-INF/MANIFEST.MF
deleted file mode 100644
index 409d31c..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,14 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: DynamicCode
-Bundle-SymbolicName: org.eclipse.ui.dynamicCode
-Bundle-Version: 1.0.0
-Require-Bundle: org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.ui.workbench,
- org.eclipse.core.commands,
- org.eclipse.jface,
- org.eclipse.help,
- org.eclipse.ui.ide,
- org.eclipse.ui,
- org.eclipse.ui.views
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/browser/org/eclipse/ui/dynamic/DynamicBrowserSupport.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/browser/org/eclipse/ui/dynamic/DynamicBrowserSupport.java
deleted file mode 100644
index b631989..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/browser/org/eclipse/ui/dynamic/DynamicBrowserSupport.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.browser.AbstractWorkbenchBrowserSupport;
-import org.eclipse.ui.browser.IWebBrowser;
-
-/**
- * @since 3.1
- */
-public class DynamicBrowserSupport extends AbstractWorkbenchBrowserSupport {
-
-    /**
-     * 
-     */
-    public DynamicBrowserSupport() {
-        super();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.browser.IWorkbenchBrowserSupport#createBrowser(int, java.lang.String, java.lang.String, java.lang.String)
-     */
-    public IWebBrowser createBrowser(int style, String browserId, String name,
-            String tooltip) throws PartInitException {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.ui.browser.IWorkbenchBrowserSupport#createBrowser(java.lang.String)
-     */
-    public IWebBrowser createBrowser(String browserId) throws PartInitException {
-        return null;
-    }
-
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/build.properties b/tests/org.eclipse.ui.tests/data/dynamic_classes/build.properties
deleted file mode 100644
index aa96960..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/build.properties
+++ /dev/null
@@ -1,30 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = intro/,\
-           browser/,\
-           editor/,\
-           view/,\
-           oc/,\
-           newWizard/,\
-           perspective/,\
-           startup/,\
-           decorator/,\
-           help/,\
-           propertyPage/,\
-           workingSet/,\
-           preferencePage/,\
-           menus/,\
-           commands/,\
-           handlers/,\
-           markerSupport/,\
-           statusHandler/
-bin.includes = META-INF/,\
-               .
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/build.xml b/tests/org.eclipse.ui.tests/data/dynamic_classes/build.xml
deleted file mode 100644
index 96c6e47..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/build.xml
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0"?>
-<!-- ====================================================================== 
-     Copyright (c) 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
-
-     Dec 1, 2004 12:07:36 PM 
-
-     Dyanmic class builder    
-     Builds the components required by the dynamic test suite
-                                                                                
-     ====================================================================== -->
-<project name="Dyanmic class builder" default="default">
-    <description>
-            Builds the components required by the dynamic test suite
-    </description>
-	
-	<property name="output.dir" value="jars"/>
-
-	
-    <!-- ================================= 
-          target: default              
-         ================================= -->
-    <target name="default" depends="clean, depends, intro, editor, view, menus, oc, newWizard, perspective, startup, decorator, help, propertyPage, preferencePage, workingSet, browser, commands, handlers, statusHandler, markerSupport, self, finish" description="--> Builds the components required by the dynamic test suite">
-    </target>
-
-    <!-- - - - - - - - - - - - - - - - - - 
-          target: depends                      
-         - - - - - - - - - - - - - - - - - -->
-    <target name="depends">
-    	<mkdir dir="${output.dir}"/>
-    </target>
-	
-	<target name="clean">
-		<delete dir="${output.dir}"/>
-	</target>
-	
-	<target name="intro">
-		<jar destfile="${output.dir}\intro.jar" basedir="intro.bin"/>
-	</target>
-	
-	<target name="editor">
-		<jar destfile="${output.dir}\editor.jar" basedir="editor.bin"/>
-	</target>
-	
-	<target name="view">
-		<jar destfile="${output.dir}\view.jar" basedir="view.bin"/>
-	</target>	
-	
-	<target name="oc">
-		<jar destfile="${output.dir}\oc.jar" basedir="oc.bin"/>
-	</target>
-	
-	<target name="menus">
-		<jar destfile="${output.dir}\menus.jar" basedir="menus.bin"/>
-	</target>
-	
-	<target name="newWizard">
-		<jar destfile="${output.dir}\newWizard.jar" basedir="newWizard.bin"/>
-	</target>
-	
-    <target name="perspective">
-		<jar destfile="${output.dir}\perspective.jar" basedir="perspective.bin"/>
-	</target>
-	    
-	<target name="startup">
-		<jar destfile="${output.dir}\startup.jar" basedir="startup.bin"/>
-	</target>
-	
-    <target name="decorator">
-		<jar destfile="${output.dir}\decorator.jar" basedir="decorator.bin"/>
-	</target>
-	
-    <target name="help">
-		<jar destfile="${output.dir}\help.jar" basedir="help.bin"/>
-	</target>
-	
-    <target name="propertyPage">
-		<jar destfile="${output.dir}\propertyPage.jar" basedir="propertyPage.bin"/>
-	</target>
-	
-    <target name="preferencePage">
-		<jar destfile="${output.dir}\preferencePage.jar" basedir="preferencePage.bin"/>
-	</target>
-	
-    <target name="workingSet">
-		<jar destfile="${output.dir}\workingSet.jar" basedir="workingSet.bin"/>
-	</target>
-	
-    <target name="browser">
-		<jar destfile="${output.dir}\browser.jar" basedir="browser.bin"/>
-	</target>
-	
-	<target name="commands">
-		<jar destfile="${output.dir}\commands.jar" basedir="commands.bin"/>
-	</target>
-	
-	<target name="handlers">
-		<jar destfile="${output.dir}\handlers.jar" basedir="handlers.bin"/>
-	</target>
-	
-	<target name="markerSupport">
-			<jar destfile="${output.dir}\markerSupport.jar" basedir="markerSupport.bin"/>
-	</target>
-	
-	<target name="statusHandler">
-		<jar destfile="${output.dir}\statusHandler.jar" basedir="statusHandler.bin"/>
-	</target>
-		
-	<target name="self">
-		<!--<delete file="dynamic_classes.zip"/>
-		<zip destfile="dynamic_classes.zip" basedir="." update="true">
-			<exclude name="**/*.jar" />
-			<exclude name="dynamic_classes.zip" />
-			<exclude name="**/*bin*/**" />
-		</zip>-->
-	</target>
-	
-	<target name="finish">
-		<eclipse.refreshLocal resource="org.eclipse.ui.dynamicCode" depth="infinite"/>
-	</target>
-</project>
-
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/commands/org/eclipse/ui/dynamic/commands/DynamicHandler.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/commands/org/eclipse/ui/dynamic/commands/DynamicHandler.java
deleted file mode 100644
index 170a229..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/commands/org/eclipse/ui/dynamic/commands/DynamicHandler.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/decorator/org/eclipse/ui/dynamic/DynamicLabelDecorator.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/decorator/org/eclipse/ui/dynamic/DynamicLabelDecorator.java
deleted file mode 100644
index c0a1eb2..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/decorator/org/eclipse/ui/dynamic/DynamicLabelDecorator.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @since 3.1
- */
-public class DynamicLabelDecorator implements ILabelDecorator {
-
-	/**
-	 * 
-	 */
-	public DynamicLabelDecorator() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILabelDecorator#decorateImage(org.eclipse.swt.graphics.Image, java.lang.Object)
-	 */
-	public Image decorateImage(Image image, Object element) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILabelDecorator#decorateText(java.lang.String, java.lang.Object)
-	 */
-	public String decorateText(String text, Object element) {
-		return text + " F1 ";
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener listener) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-	 */
-	public boolean isLabelProperty(Object element, String property) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/decorator/org/eclipse/ui/dynamic/DynamicLightweightLabelDecorator.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/decorator/org/eclipse/ui/dynamic/DynamicLightweightLabelDecorator.java
deleted file mode 100644
index 742c254..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/decorator/org/eclipse/ui/dynamic/DynamicLightweightLabelDecorator.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-
-/**
- * @since 3.1
- */
-public class DynamicLightweightLabelDecorator implements
-		ILightweightLabelDecorator {
-
-	/**
-	 * 
-	 */
-	public DynamicLightweightLabelDecorator() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object, org.eclipse.jface.viewers.IDecoration)
-	 */
-	public void decorate(Object element, IDecoration decoration) {
-		decoration.addSuffix("Light");
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener listener) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-	 */
-	public boolean isLabelProperty(Object element, String property) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/editor/org/eclipse/ui/dynamic/DynamicEditor.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/editor/org/eclipse/ui/dynamic/DynamicEditor.java
deleted file mode 100644
index 5ec4c00..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/editor/org/eclipse/ui/dynamic/DynamicEditor.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.EditorPart;
-
-/**
- * @since 3.1
- */
-public class DynamicEditor extends EditorPart {
-
-	/**
-	 * 
-	 */
-	public DynamicEditor() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
-	 */
-	public void doSaveAs() {		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-		setSite(site);
-		setInput(input);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#isDirty()
-	 */
-	public boolean isDirty() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {	
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/handlers/org/eclipse/ui/dynamic/handlers/DynamicHandler.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/handlers/org/eclipse/ui/dynamic/handlers/DynamicHandler.java
deleted file mode 100644
index 0ddfe01..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/handlers/org/eclipse/ui/dynamic/handlers/DynamicHandler.java
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/help/org/eclipse/ui/dynamic/DynamicHelpSupport.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/help/org/eclipse/ui/dynamic/DynamicHelpSupport.java
deleted file mode 100644
index e49b13e..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/help/org/eclipse/ui/dynamic/DynamicHelpSupport.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.help.IContext;
-import org.eclipse.ui.help.AbstractHelpUI;
-
-/**
- * @since 3.1
- */
-public class DynamicHelpSupport extends AbstractHelpUI {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.help.AbstractHelpUI#displayHelp()
-	 */
-	public void displayHelp() {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.help.AbstractHelpUI#displayContext(org.eclipse.help.IContext, int, int)
-	 */
-	public void displayContext(IContext context, int x, int y) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.help.AbstractHelpUI#displayHelpResource(java.lang.String)
-	 */
-	public void displayHelpResource(String href) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.help.AbstractHelpUI#isContextHelpDisplayed()
-	 */
-	public boolean isContextHelpDisplayed() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/intro/org/eclipse/ui/dynamic/DynamicIntro.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/intro/org/eclipse/ui/dynamic/DynamicIntro.java
deleted file mode 100644
index 4fff301..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/intro/org/eclipse/ui/dynamic/DynamicIntro.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.part.IntroPart;
-
-/**
- * @since 3.1
- */
-public class DynamicIntro extends IntroPart {
-
-	/**
-	 * 
-	 */
-	public DynamicIntro() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.intro.IIntroPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.intro.IIntroPart#setFocus()
-	 */
-	public void setFocus() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.intro.IIntroPart#standbyStateChanged(boolean)
-	 */
-	public void standbyStateChanged(boolean standby) {
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/markerSupport/org/eclipse/ui/dynamic/markerSupport/DynamicTestsSubCategoryProvider.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/markerSupport/org/eclipse/ui/dynamic/markerSupport/DynamicTestsSubCategoryProvider.java
deleted file mode 100644
index 6b0b875..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/markerSupport/org/eclipse/ui/dynamic/markerSupport/DynamicTestsSubCategoryProvider.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.eclipse.ui.dynamic.markerSupport;
-
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.ui.views.markers.ISubCategoryProvider;
-
-/**
- * DynamicTestsSubCategoryProvider is test class for the dynamic tests.
- * 
- * @since 3.2
- * 
- */
-public class DynamicTestsSubCategoryProvider implements ISubCategoryProvider {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.markers.ISubCategoryProvider#categoryFor(org.eclipse.core.resources.IMarker)
-	 */
-	public String categoryFor(IMarker marker) {
-		return "Dynamic Test";
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/menus/org/eclipse/ui/dynamic/menus/NonInterestingContributionItem.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/menus/org/eclipse/ui/dynamic/menus/NonInterestingContributionItem.java
deleted file mode 100644
index 9d48321..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/menus/org/eclipse/ui/dynamic/menus/NonInterestingContributionItem.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.eclipse.ui.dynamic.menus;
-
-import org.eclipse.jface.action.ContributionItem;
-
-public class NonInterestingContributionItem extends ContributionItem {
-
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/newWizard/org/eclipse/ui/dynamic/DynamicWizard.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/newWizard/org/eclipse/ui/dynamic/DynamicWizard.java
deleted file mode 100644
index 9db1494..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/newWizard/org/eclipse/ui/dynamic/DynamicWizard.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardContainer;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * @since 3.1
- */
-public class DynamicWizard implements INewWizard {
-
-	/**
-	 * 
-	 */
-	public DynamicWizard() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#addPages()
-	 */
-	public void addPages() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#canFinish()
-	 */
-	public boolean canFinish() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#createPageControls(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#getContainer()
-	 */
-	public IWizardContainer getContainer() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#getDefaultPageImage()
-	 */
-	public Image getDefaultPageImage() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#getDialogSettings()
-	 */
-	public IDialogSettings getDialogSettings() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#getNextPage(org.eclipse.jface.wizard.IWizardPage)
-	 */
-	public IWizardPage getNextPage(IWizardPage page) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#getPage(java.lang.String)
-	 */
-	public IWizardPage getPage(String pageName) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#getPageCount()
-	 */
-	public int getPageCount() {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#getPages()
-	 */
-	public IWizardPage[] getPages() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#getPreviousPage(org.eclipse.jface.wizard.IWizardPage)
-	 */
-	public IWizardPage getPreviousPage(IWizardPage page) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#getStartingPage()
-	 */
-	public IWizardPage getStartingPage() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#getTitleBarColor()
-	 */
-	public RGB getTitleBarColor() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#getWindowTitle()
-	 */
-	public String getWindowTitle() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#isHelpAvailable()
-	 */
-	public boolean isHelpAvailable() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#needsPreviousAndNextButtons()
-	 */
-	public boolean needsPreviousAndNextButtons() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#needsProgressMonitor()
-	 */
-	public boolean needsProgressMonitor() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#performCancel()
-	 */
-	public boolean performCancel() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#setContainer(org.eclipse.jface.wizard.IWizardContainer)
-	 */
-	public void setContainer(IWizardContainer wizardContainer) {
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/oc/org/eclipse/ui/dynamic/MockObjectActionDelegate.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/oc/org/eclipse/ui/dynamic/MockObjectActionDelegate.java
deleted file mode 100644
index bce7a96..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/oc/org/eclipse/ui/dynamic/MockObjectActionDelegate.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IActionDelegate;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * @since 3.1
- */
-public class MockObjectActionDelegate implements IObjectActionDelegate, IActionDelegate {
-	
-	/**
-	 * 
-	 */
-	public MockObjectActionDelegate() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-	}
-
-	/* (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) {
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/oc/org/eclipse/ui/dynamic/MockViewActionDelegate.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/oc/org/eclipse/ui/dynamic/MockViewActionDelegate.java
deleted file mode 100644
index b6393bf..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/oc/org/eclipse/ui/dynamic/MockViewActionDelegate.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * @since 3.1
- */
-public class MockViewActionDelegate implements IViewActionDelegate {
-
-	/**
-	 * 
-	 */
-	public MockViewActionDelegate() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-
-	}
-
-	/* (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) {
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/perspective/org/eclipse/ui/dynamic/DynamicPerspective.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/perspective/org/eclipse/ui/dynamic/DynamicPerspective.java
deleted file mode 100644
index a4d15f21..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/perspective/org/eclipse/ui/dynamic/DynamicPerspective.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-
-/**
- * @since 3.1
- */
-public class DynamicPerspective implements IPerspectiveFactory {
-
-	/**
-	 * 
-	 */
-	public DynamicPerspective() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(org.eclipse.ui.IPageLayout)
-	 */
-	public void createInitialLayout(IPageLayout layout) {
-		layout.addView(IPageLayout.ID_OUTLINE, IPageLayout.LEFT, .25f, IPageLayout.ID_EDITOR_AREA);
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/preferencePage/org/eclipse/ui/dynamic/DynamicPreferencePage.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/preferencePage/org/eclipse/ui/dynamic/DynamicPreferencePage.java
deleted file mode 100644
index 8fac73b..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/preferencePage/org/eclipse/ui/dynamic/DynamicPreferencePage.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.jface.preference.IPreferencePageContainer;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * @since 3.1
- */
-public class DynamicPreferencePage implements IWorkbenchPreferencePage {
-
-	/**
-	 * 
-	 */
-	public DynamicPreferencePage() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public Point computeSize() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public boolean isValid() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	public boolean okToLeave() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	public boolean performCancel() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	public boolean performOk() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	public void setContainer(IPreferencePageContainer preferencePageContainer) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void setSize(Point size) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void createControl(Composite parent) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void dispose() {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public Control getControl() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public String getDescription() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public String getErrorMessage() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public Image getImage() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public String getMessage() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public String getTitle() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public void performHelp() {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void setDescription(String description) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void setImageDescriptor(ImageDescriptor image) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void setTitle(String title) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void setVisible(boolean visible) {
-		// TODO Auto-generated method stub
-		
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/propertyPage/org/eclipse/ui/dynamic/DynamicPropertyPage.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/propertyPage/org/eclipse/ui/dynamic/DynamicPropertyPage.java
deleted file mode 100644
index 680c6c9..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/propertyPage/org/eclipse/ui/dynamic/DynamicPropertyPage.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.dialogs.PropertyPage;
-
-/**
- * @since 3.1
- */
-public class DynamicPropertyPage extends PropertyPage {
-
-	/**
-	 * 
-	 */
-	public DynamicPropertyPage() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {		
-		return parent;
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/startup/org/eclipse/ui/dynamic/DynamicStartup.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/startup/org/eclipse/ui/dynamic/DynamicStartup.java
deleted file mode 100644
index 20d7a8a..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/startup/org/eclipse/ui/dynamic/DynamicStartup.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.ui.IStartup;
-
-/**
- * @since 3.1
- */
-public class DynamicStartup implements IStartup {
-
-	public static Throwable history;
-	
-	/**
-	 * 
-	 */
-	public DynamicStartup() {
-		super();		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IStartup#earlyStartup()
-	 */
-	public void earlyStartup() {
-		history = new Throwable();
-		history.fillInStackTrace();
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/statusHandler/org/eclipse/ui/dynamic/DynamicStatusHandler.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/statusHandler/org/eclipse/ui/dynamic/DynamicStatusHandler.java
deleted file mode 100644
index 4e9d232..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/statusHandler/org/eclipse/ui/dynamic/DynamicStatusHandler.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.ui.statushandlers.AbstractStatusHandler;
-import org.eclipse.ui.statushandlers.StatusAdapter;
-
-/**
- * @since 3.3
- */
-public class DynamicStatusHandler extends AbstractStatusHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.statushandlers.AbstractStatusHandler#handle(org.eclipse.ui.statushandlers.StatusAdapter,
-	 *      int)
-	 */
-	public void handle(StatusAdapter statusAdapter, int style) {
-	}
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/view/org/eclipse/ui/dynamic/DynamicView.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/view/org/eclipse/ui/dynamic/DynamicView.java
deleted file mode 100644
index 783d6bf..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/view/org/eclipse/ui/dynamic/DynamicView.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * @since 3.1
- */
-public class DynamicView extends ViewPart {
-
-	/**
-	 * 
-	 */
-	public DynamicView() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-	 */
-	public void setFocus() {	
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/workingSet/org/eclipse/ui/dynamic/DynamicWorkingSetElementAdapter.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/workingSet/org/eclipse/ui/dynamic/DynamicWorkingSetElementAdapter.java
deleted file mode 100644
index d911706..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/workingSet/org/eclipse/ui/dynamic/DynamicWorkingSetElementAdapter.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.core.runtime.IAdaptable;
-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.IWorkingSet;
-import org.eclipse.ui.IWorkingSetElementAdapter;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.intro.IIntroPart;
-import org.eclipse.ui.intro.IIntroSite;
-
-public class DynamicWorkingSetElementAdapter implements
-		IWorkingSetElementAdapter {
-
-	public IAdaptable[] adaptElements(IWorkingSet ws, IAdaptable[] elements) {
-		return new IAdaptable[] {new IIntroPart() {
-
-			public void addPropertyListener(IPropertyListener listener) {
-			}
-
-			public void createPartControl(Composite parent) {
-				
-			}
-
-			public void dispose() {
-				
-			}
-
-			public IIntroSite getIntroSite() {
-				return null;
-			}
-
-			public String getTitle() {
-				// TODO Auto-generated method stub
-				return null;
-			}
-
-			public Image getTitleImage() {
-
-				return null;
-			}
-
-			public void init(IIntroSite site, IMemento memento)
-					throws PartInitException {
-
-				
-			}
-
-			public void removePropertyListener(IPropertyListener listener) {
-
-				
-			}
-
-			public void saveState(IMemento memento) {
-
-				
-			}
-
-			public void setFocus() {
-
-				
-			}
-
-			public void standbyStateChanged(boolean standby) {
-
-				
-			}
-
-			public Object getAdapter(Class adapter) {
-				return null;
-			}}};
-	}
-
-	public void dispose() {
-		
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/workingSet/org/eclipse/ui/dynamic/DynamicWorkingSetPage.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/workingSet/org/eclipse/ui/dynamic/DynamicWorkingSetPage.java
deleted file mode 100644
index 618508c..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/workingSet/org/eclipse/ui/dynamic/DynamicWorkingSetPage.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.dialogs.IWorkingSetPage;
-
-/**
- * @since 3.1
- */
-public class DynamicWorkingSetPage implements IWorkingSetPage {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.IWorkingSetPage#finish()
-	 */
-	public void finish() {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.IWorkingSetPage#getSelection()
-	 */
-	public IWorkingSet getSelection() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.IWorkingSetPage#setSelection(org.eclipse.ui.IWorkingSet)
-	 */
-	public void setSelection(IWorkingSet workingSet) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizardPage#canFlipToNextPage()
-	 */
-	public boolean canFlipToNextPage() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizardPage#getName()
-	 */
-	public String getName() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizardPage#getPreviousPage()
-	 */
-	public IWizardPage getPreviousPage() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizardPage#getWizard()
-	 */
-	public IWizard getWizard() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizardPage#setPreviousPage(org.eclipse.jface.wizard.IWizardPage)
-	 */
-	public void setPreviousPage(IWizardPage page) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizardPage#setWizard(org.eclipse.jface.wizard.IWizard)
-	 */
-	public void setWizard(IWizard newWizard) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#dispose()
-	 */
-	public void dispose() {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#getControl()
-	 */
-	public Control getControl() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#getDescription()
-	 */
-	public String getDescription() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#getErrorMessage()
-	 */
-	public String getErrorMessage() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#getImage()
-	 */
-	public Image getImage() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#getMessage()
-	 */
-	public String getMessage() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#getTitle()
-	 */
-	public String getTitle() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#performHelp()
-	 */
-	public void performHelp() {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#setDescription(java.lang.String)
-	 */
-	public void setDescription(String description) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#setImageDescriptor(org.eclipse.jface.resource.ImageDescriptor)
-	 */
-	public void setImageDescriptor(ImageDescriptor image) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#setTitle(java.lang.String)
-	 */
-	public void setTitle(String title) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#setVisible(boolean)
-	 */
-	public void setVisible(boolean visible) {
-		// TODO Auto-generated method stub
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/data/dynamic_classes/workingSet/org/eclipse/ui/dynamic/DynamicWorkingSetUpdater.java b/tests/org.eclipse.ui.tests/data/dynamic_classes/workingSet/org/eclipse/ui/dynamic/DynamicWorkingSetUpdater.java
deleted file mode 100644
index b3c3f67..0000000
--- a/tests/org.eclipse.ui.tests/data/dynamic_classes/workingSet/org/eclipse/ui/dynamic/DynamicWorkingSetUpdater.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.dynamic;
-
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetUpdater;
-
-/**
- * @since 3.1
- */
-public class DynamicWorkingSetUpdater implements IWorkingSetUpdater {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkingSetUpdater#add(org.eclipse.ui.IWorkingSet)
-	 */
-	public void add(IWorkingSet workingSet) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkingSetUpdater#remove(org.eclipse.ui.IWorkingSet)
-	 */
-	public boolean remove(IWorkingSet workingSet) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkingSetUpdater#contains(org.eclipse.ui.IWorkingSet)
-	 */
-	public boolean contains(IWorkingSet workingSet) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkingSetUpdater#dispose()
-	 */
-	public void dispose() {
-		// TODO Auto-generated method stub
-
-	}
-
-}
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.acceleratorConfigurationsExtensionDynamicTest/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.acceleratorConfigurationsExtensionDynamicTest/plugin.xml
deleted file mode 100644
index 1ce41dd..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.acceleratorConfigurationsExtensionDynamicTest/plugin.xml
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.acceleratorScopesExtensionDynamicTest/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.acceleratorScopesExtensionDynamicTest/plugin.xml
deleted file mode 100644
index 6a3e564..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.acceleratorScopesExtensionDynamicTest/plugin.xml
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.actionDefinitionsExtensionDynamicTest/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.actionDefinitionsExtensionDynamicTest/plugin.xml
deleted file mode 100644
index abc488e..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.actionDefinitionsExtensionDynamicTest/plugin.xml
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.bindingsExtensionDynamicTest/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.bindingsExtensionDynamicTest/plugin.xml
deleted file mode 100644
index eeb7e63..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.bindingsExtensionDynamicTest/plugin.xml
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.commandsExtensionDynamicTest/commands.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.commandsExtensionDynamicTest/commands.jar
deleted file mode 100644
index 0d20fd2..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.commandsExtensionDynamicTest/commands.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.commandsExtensionDynamicTest/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.commandsExtensionDynamicTest/plugin.xml
deleted file mode 100644
index ec3cee6..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.commandsExtensionDynamicTest/plugin.xml
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.contextsExtensionDynamicTest/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.contextsExtensionDynamicTest/plugin.xml
deleted file mode 100644
index 3f96ce0..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.contextsExtensionDynamicTest/plugin.xml
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/ArchiveTestSource.tar b/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/ArchiveTestSource.tar
deleted file mode 100644
index e8e3538..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/ArchiveTestSource.tar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/ArchiveTestSource.zip b/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/ArchiveTestSource.zip
deleted file mode 100644
index 34282cd..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/ArchiveTestSource.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/EmptyFolderInArchive.tar b/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/EmptyFolderInArchive.tar
deleted file mode 100644
index ebb1ec5..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/EmptyFolderInArchive.tar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/EmptyFolderInArchive.zip b/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/EmptyFolderInArchive.zip
deleted file mode 100644
index 083f47e..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/EmptyFolderInArchive.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/FileAtRootTest.tar b/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/FileAtRootTest.tar
deleted file mode 100644
index 01700cc..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/FileAtRootTest.tar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/FileAtRootTest.zip b/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/FileAtRootTest.zip
deleted file mode 100644
index 319f2d3..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/FileAtRootTest.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/helloworld.tar b/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/helloworld.tar
deleted file mode 100644
index 3bb30dc..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/helloworld.tar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/helloworld.zip b/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/helloworld.zip
deleted file mode 100644
index d0f31ea..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.datatransferArchives/helloworld.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.handlersExtensionDynamicTest/handlers.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.handlersExtensionDynamicTest/handlers.jar
deleted file mode 100644
index 0a955b5..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.handlersExtensionDynamicTest/handlers.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.handlersExtensionDynamicTest/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.handlersExtensionDynamicTest/plugin.xml
deleted file mode 100644
index 7a548b7..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.handlersExtensionDynamicTest/plugin.xml
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newActionSet1/WhatDoesItDo.txt b/tests/org.eclipse.ui.tests/data/org.eclipse.newActionSet1/WhatDoesItDo.txt
deleted file mode 100644
index 0ad1ea9..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newActionSet1/WhatDoesItDo.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-This test should add a new action called "A New Action from ActionSet1"
-to the File menu item.
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newActionSet1/anything.gif b/tests/org.eclipse.ui.tests/data/org.eclipse.newActionSet1/anything.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newActionSet1/anything.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newActionSet1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newActionSet1/plugin.xml
deleted file mode 100644
index dc20636..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newActionSet1/plugin.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newActionSet1"
-   name="newActionSet1 Plug-in"
-   version="1.0.0">
-
-   <runtime>
-      <library name="newActionSet1.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-   <extension
-         point="org.eclipse.ui.actionSets" id="testDynamicActionSetAddition">
-      <actionSet
-            label="A New ActionSet from ActionSet1"
-            description="This is an actionset added by a dynamic plug-in"
-            visible="true"
-            id="org.eclipse.newActionSet1.newActionSet1">
-         <action
-               label="A New Action from ActionSet1"
-               tooltip="This is the tooltip"
-               class="org.eclipse.jdt.internal.ui.actions.OpenTypeInHierarchyAction"
-               menubarPath="file/new.ext"
-               id="newAction1">
-         </action>
-      </actionSet>
-      <actionSet
-            id="org.eclipse.newActionSet1.newActionSet2"
-            label="Another New Action Set From ActionSet 1"
-            visible="true">
-         <action
-               class="some.bogus.class"
-               icon="anything.gif"
-               id="org.eclipse.ui.tests.action1"
-               label="Another New Action From ActionSet1"
-               menubarPath="menu1/sep1"
-               style="push"
-               toolbarPath="newActionSet1"/>
-         <menu
-               id="menu1"
-               label="org.eclipse.ui.tests.menu1">
-            <separator name="sep1"/>
-         </menu>
-      </actionSet>
-   </extension>
-   <extension
-         point="org.eclipse.ui.actionSetPartAssociations">
-      <actionSetPartAssociation targetID="org.eclipse.newActionSet1.newActionSet1">
-         <part id="org.eclipse.ui.tests.part1"/>
-      </actionSetPartAssociation>
-   </extension>
- 
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newActivitySupport1/anything.gif b/tests/org.eclipse.ui.tests/data/org.eclipse.newActivitySupport1/anything.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newActivitySupport1/anything.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newActivitySupport1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newActivitySupport1/plugin.xml
deleted file mode 100644
index cd01e2e..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newActivitySupport1/plugin.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newActivitySupport1"
-   name="newActivitySupport1 Plug-in"
-   version="1.0.0">
-   
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-
-   <extension
-         id="testNewActivitySupportAddition"
-         point="org.eclipse.ui.activitySupport">
-      <categoryImageBinding
-            icon="anything.gif"
-            id="org.eclipse.category2"/>
-      <activityImageBinding
-            icon="anything.gif"
-            id="org.eclipse.activity2"/>
-   </extension>
- 
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newBrowser1/browser.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newBrowser1/browser.jar
deleted file mode 100644
index 6eedc20..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newBrowser1/browser.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newBrowser1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newBrowser1/plugin.xml
deleted file mode 100644
index 83d2d61..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newBrowser1/plugin.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newBrowser1"
-   name="newBrowser1 Plug-in"
-   version="1.0.0">
-
-   <runtime>
-      <library name="browser.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-   <extension
-         id="testDynamicBrowserAddition"
-         point="org.eclipse.ui.browserSupport">
-      <support
-            class="org.eclipse.ui.dynamic.DynamicBrowserSupport"
-            default="true"/>
-   </extension>
- 
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newDecorator1/anything.gif b/tests/org.eclipse.ui.tests/data/org.eclipse.newDecorator1/anything.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newDecorator1/anything.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newDecorator1/decorator.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newDecorator1/decorator.jar
deleted file mode 100644
index 133c230..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newDecorator1/decorator.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newDecorator1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newDecorator1/plugin.xml
deleted file mode 100644
index 8f52af0..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newDecorator1/plugin.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newDecorator1"
-   name="newDecorator1 Plug-in"
-   version="1.0.0">
-
-   <runtime>
-      <library name="decorator.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-   <extension
-         id="testDynamicDecoratorAddition"
-         point="org.eclipse.ui.decorators">
-      <decorator
-            lightweight="false"
-            label="full1"
-            class="org.eclipse.ui.dynamic.DynamicLabelDecorator"
-            state="true"
-            id="fullDecorator1">
-		<enablement>
-			<objectClass name="java.lang.Object"/>
-        </enablement> 
-      </decorator>
-      <decorator
-            lightweight="true"
-            label="light1"
-            icon="anything.gif"
-            state="true"
-            location="TOP_LEFT"
-            id="lightDecorator1">
-         <enablement>
-            <objectClass name="java.lang.Object"/>
-         </enablement>
-      </decorator> 
-      
-      <decorator
-            lightweight="true"
-            label="light2"
-			class="org.eclipse.ui.dynamic.DynamicLightweightLabelDecorator"
-            state="true"
-            location="TOP_LEFT"
-            id="lightDecorator2">
-         <enablement>
-            <objectClass name="java.lang.Object"/>
-         </enablement>
-      </decorator>                 
-   </extension>
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/.classpath b/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/.classpath
deleted file mode 100644
index 6fd978b..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry exported="true" kind="lib" path="menus.jar"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/.project b/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/.project
deleted file mode 100644
index fc93e00..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.newDynamicMenuContribution</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.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 5476823..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Thu Sep 25 13:01:37 EDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/META-INF/MANIFEST.MF b/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/META-INF/MANIFEST.MF
deleted file mode 100644
index f6e5632..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,9 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: NewDynamicMenuContribution Plug-in
-Bundle-SymbolicName: org.eclipse.newDynamicMenuContribution;singleton:=true
-Bundle-Version: 1.0.0
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ClassPath: menus.jar
-Require-Bundle: org.eclipse.ui;bundle-version="3.5.0"
-Bundle-ActivationPolicy: lazy
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/build.properties b/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/build.properties
deleted file mode 100644
index 4d2c34b..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-output.. = bin/
-bin.includes = META-INF/,\
-               menus.jar,\
-               plugin.xml
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/menus.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/menus.jar
deleted file mode 100644
index 42475fe..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/menus.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/plugin.xml
deleted file mode 100644
index 1ad617f..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newDynamicMenuContribution/plugin.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-   <extension
-         id="menu.dynamic.contribution"
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            locationURI="popup:org.eclipse.newDynamicMenuContribution">
-         <dynamic
-               class="org.eclipse.ui.dynamic.menus.NonInterestingContributionItem"
-               id="org.eclipse.newDynamicMenuContribution.dynamic1">
-         </dynamic>
-      </menuContribution>
-   </extension>
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newEditor1/anything.gif b/tests/org.eclipse.ui.tests/data/org.eclipse.newEditor1/anything.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newEditor1/anything.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newEditor1/editor.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newEditor1/editor.jar
deleted file mode 100644
index 77ed345..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newEditor1/editor.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newEditor1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newEditor1/plugin.xml
deleted file mode 100644
index 6792933..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newEditor1/plugin.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newEditor1"
-   name="newEditor1 Plug-in"
-   version="1.0.0">
-
-   <runtime>
-      <library name="editor.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-   <extension
-         id="testDynamicEditorAddition"
-         point="org.eclipse.ui.editors">
-      <editor
-            icon="anything.gif"
-            class="org.eclipse.ui.dynamic.DynamicEditor"
-            default="false"
-            name="org.eclipse.ui.tests.editor1"
-            id="org.eclipse.newEditor1.newEditor1"/>
-   </extension>
- 
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newEncoding1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newEncoding1/plugin.xml
deleted file mode 100644
index 0e35269..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newEncoding1/plugin.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newEncoding1"
-   name="newEncoding1 Plug-in"
-   version="1.0.0">
-
-   <runtime>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-   <extension
-         id="testDynamicEncodingAddition"
-         point="org.eclipse.ui.encodings">
-      <encoding name="Cp1257"/>
-   </extension>
- 
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newHelpSupport1/help.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newHelpSupport1/help.jar
deleted file mode 100644
index 4d8eeb7..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newHelpSupport1/help.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newHelpSupport1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newHelpSupport1/plugin.xml
deleted file mode 100644
index aea8d4b..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newHelpSupport1/plugin.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newHelpSupport1"
-   name="newHelpSupport1 Plug-in"
-   version="1.0.0">
-
-   <runtime>
-      <library name="help.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-   <extension
-         id="testDynamicHelpSupportAddition"
-         point="org.eclipse.ui.helpSupport">
-      <config class="org.eclipse.ui.dynamic.DynamicHelpSupport"/>
-   </extension>
- 
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newIntro1/intro.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newIntro1/intro.jar
deleted file mode 100644
index f090f65..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newIntro1/intro.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newIntro1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newIntro1/plugin.xml
deleted file mode 100644
index be68ebc..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newIntro1/plugin.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newIntro1"
-   name="newIntro1 Plug-in"
-   version="1.0.0">
-
-   <runtime>
-      <library name="intro.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-   <extension
-         id="testDynamicIntroAddition"
-         point="org.eclipse.ui.intro">
-      <intro
-            class="org.eclipse.ui.dynamic.DynamicIntro"
-            id="org.eclipse.newIntro1.newIntro1"/>
-      <introProductBinding
-            introId="org.eclipse.newIntro1.newIntro1"
-            productId="org.eclipse.ui.tests.someProduct"/>
-   </extension>
- 
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newKeyword1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newKeyword1/plugin.xml
deleted file mode 100644
index 27c33b4..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newKeyword1/plugin.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newKeyword1"
-   name="newKeyword1 Plug-in"
-   version="1.0.0">
-
-   <runtime>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-   <extension
-         id="testDynamicKeywordAddition"
-         point="org.eclipse.ui.keywords">
-      <keyword
-            label="dynamicKeyword1"
-            id="dynamicKeyword1"/>
-   </extension>
- 
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newMarkerSupport/markerSupport.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newMarkerSupport/markerSupport.jar
deleted file mode 100644
index f95a6eb..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newMarkerSupport/markerSupport.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newMarkerSupport/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newMarkerSupport/plugin.xml
deleted file mode 100644
index 35a77c3..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newMarkerSupport/plugin.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin
-   id="newMarkerSupport"
-   name="newProblemFilter Plug-in"
-   version="1.0.0">
-   <requires>
-      <import plugin="org.eclipse.ui.ide"/>
-   </requires>
-    <runtime>
-      <library name="markerSupport.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <extension
-         id="dynamicTestMarker"
-         name="Dynamic Test Marker"
-         point="org.eclipse.core.resources.markers">
-      <super type="org.eclipse.core.resources.problemmarker"/>
-   </extension>
-   <extension
-   		 id="testDynamicFilterAddition"
-         point="org.eclipse.ui.ide.markerSupport">
-    <problemFilter
-            enabled="true"
-            id="filter1"
-            name="Filter 1"
-            onDescription="method"/>
-      <problemFilter
-            id="filter2"
-            name="Filter 2"
-            onDescription="!method"/>
-      <problemFilter
-            enabled="true"
-            id="filter3"
-            name="Filter 3">
-         <selectedType markerId="org.eclipse.ui.tests.dynamicTestMarker"/>
-      </problemFilter>
-      <markerCategory name="dynamicCategory">
-         <markerTypeReference id="org.eclipse.ui.tests.dynamicTestMarker"/>
-      </markerCategory>
-      <markerGrouping
-            id="dynamic"
-            name="Dynamic Test Grouping">
-      </markerGrouping>
-  
-   </extension>
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newMultiEditor/build.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newMultiEditor/build.xml
deleted file mode 100644
index 9227962..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newMultiEditor/build.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- ====================================================================== 
-     Jun 27, 2005 10:23:13 AM                                                        
-
-     project    
-     description
-                   
-     pwebster                                                                
-     ====================================================================== -->
-<project name="project" default="default">
-    <description>
-            description
-    </description>
-
-    <!-- ================================= 
-          target: default              
-         ================================= -->
-    <target name="default" depends="depends" description="--> description">
-        
-    </target>
-
-    <!-- - - - - - - - - - - - - - - - - - 
-          target: depends                      
-         - - - - - - - - - - - - - - - - - -->
-    <target name="depends">
-    </target>
-
-</project>
-
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newMultiEditor/test01.txt b/tests/org.eclipse.ui.tests/data/org.eclipse.newMultiEditor/test01.txt
deleted file mode 100644
index d533d7f..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newMultiEditor/test01.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-test file 01
-
-test for MultiEditor
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newMultiEditor/test02.txt b/tests/org.eclipse.ui.tests/data/org.eclipse.newMultiEditor/test02.txt
deleted file mode 100644
index 411a113..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newMultiEditor/test02.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-test file 02
-
-test for MultiEditor
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newMultiEditor/test03.etest b/tests/org.eclipse.ui.tests/data/org.eclipse.newMultiEditor/test03.etest
deleted file mode 100644
index 9f88a6d..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newMultiEditor/test03.etest
+++ /dev/null
@@ -1,3 +0,0 @@
-test file 03
-
-test for MultiEditor
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newMultiEditor/test04.properties b/tests/org.eclipse.ui.tests/data/org.eclipse.newMultiEditor/test04.properties
deleted file mode 100644
index a53b29b..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newMultiEditor/test04.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-org.eclipse.ui.tests.multieditor.good = MultiEditorTest
-org.eclipse.ui.tests.multieditor.bad = TiledEditor
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newNewWizard1/anything.gif b/tests/org.eclipse.ui.tests/data/org.eclipse.newNewWizard1/anything.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newNewWizard1/anything.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newNewWizard1/newWizard.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newNewWizard1/newWizard.jar
deleted file mode 100644
index 915a729..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newNewWizard1/newWizard.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newNewWizard1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newNewWizard1/plugin.xml
deleted file mode 100644
index 1fd5706..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newNewWizard1/plugin.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newNewWizard1"
-   name="newNewWizard1 Plug-in"
-   version="1.0.0">
-
-   <runtime>
-      <library name="newWizard.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-   <extension
-         id="testDynamicNewWizardAddition"
-         point="org.eclipse.ui.newWizards">
-      <category
-            name="Category1"
-            id="org.eclipse.newNewWizard1.category"/>
-      <wizard
-            helpHref="foobar"
-            icon="anything.gif"
-            class="org.eclipse.ui.tests.NewWizard1"
-            category="org.eclipse.newNewWizard1.category"
-            descriptionImage="anything.gif"
-            name="NewWizard1"
-            id="org.eclipse.newNewWizard1.newNewWizard1"/>
-   </extension>
- 
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newOC1/oc.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newOC1/oc.jar
deleted file mode 100644
index ecabc66..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newOC1/oc.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newOC1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newOC1/plugin.xml
deleted file mode 100644
index 7919859..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newOC1/plugin.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newOC1"
-   name="newOC1 Plug-in"
-   version="1.0.0">
-
-   <runtime>
-      <library name="oc.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-   <extension
-         id="testDynamicOCAddition"
-         point="org.eclipse.ui.popupMenus">
-      <objectContribution
-            adaptable="false"
-            objectClass="java.util.Random"
-            id="org.eclipse.newOC1">
-         <action
-               label="org.eclipse.ui.tests.action1"
-               class="org.eclipse.ui.dynamic.MockObjectActionDelegate"
-               id="org.eclipse.newOC1"/>
-      </objectContribution>
-      <viewerContribution
-            targetID="#OC"
-            id="org.eclipse.newOC2">
-         <action
-               label="org.eclipse.ui.tests.action1"
-               class="org.eclipse.ui.dynamici.MockViewActionDelegate"
-               menubarPath="oc"
-               id="org.eclipse.newOC2"/>
-      </viewerContribution>
-   </extension>
- 
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newPerspective1/perspective.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newPerspective1/perspective.jar
deleted file mode 100644
index 59884a6..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newPerspective1/perspective.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newPerspective1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newPerspective1/plugin.xml
deleted file mode 100644
index 860df50..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newPerspective1/plugin.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newPerspective1"
-   name="NewPerspective One Plug-in"
-   version="1.0.0"
-   provider-name="">
-
-   <runtime>
-      <library name="perspective.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-
-
-   <extension
-         point="org.eclipse.ui.perspectives" id="testDynamicPerspectiveAddition">
-      <perspective
-            name="NewPerspective1"
-            class="org.eclipse.ui.dynamic.DynamicPerspective"
-            id="org.eclipse.newPerspective1.newPerspective1">
-      </perspective>
-   </extension>
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newPerspectiveExtension1/anything.gif b/tests/org.eclipse.ui.tests/data/org.eclipse.newPerspectiveExtension1/anything.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newPerspectiveExtension1/anything.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newPerspectiveExtension1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newPerspectiveExtension1/plugin.xml
deleted file mode 100644
index af75663..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newPerspectiveExtension1/plugin.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newPerspectiveExtension1"
-   name="newPerspectiveExtension1 Plug-in"
-   version="1.0.0">
-
-   <runtime>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.ui.tests"/>
-   </requires>
-   <extension
-         point="org.eclipse.ui.perspectiveExtensions">
-      <perspectiveExtension targetID="org.eclipse.ui.resourcePerspective">
-         <actionSet id="org.eclipse.ui.tests.actionSet1"/>
-         <perspectiveShortcut id="org.eclipse.ui.resourcePerspective"/>
-         <newWizardShortcut id="some.new.wizard"/>
-         <view
-               visible="true"
-               ratio=".25"
-               relative="org.eclipse.ui.editorss"
-               relationship="left"
-               id="org.eclipse.ui.tests.api.MockViewPart"/>
-         <showInPart id="org.eclipse.ui.tests.api.MockViewPart"/>
-      </perspectiveExtension>
-   </extension>
-   <extension
-         point="org.eclipse.ui.newWizards">
-      <wizard
-            icon="anything.gif"
-            class="org.eclipse.ui.tests.NewWizard1"
-            name="Some New Wizard"
-            id="some.new.wizard"/>
-   </extension>
- 
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newPreferencePage1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newPreferencePage1/plugin.xml
deleted file mode 100644
index 165f0ae..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newPreferencePage1/plugin.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newPreferencePage1"
-   name="NewPreferencePage One Plug-in"
-   version="1.0.0"
-   provider-name="">
-
-   <runtime>
-      <library name="preferencePage.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-   <extension
-         id="testDynamicPreferencePageAddition"
-         point="org.eclipse.ui.preferencePages">
-      <page
-            class="org.eclipse.ui.dynamic.DynamicPreferencePage"
-            name="dynamic.parentPage"
-            id="dynamic.parentPage"/>
-      <page
-            class="org.eclipse.ui.dynamic.DynamicPreferencePage"
-            category="dynamic.parentPage"
-            name="dynamic.childPage"
-            id="dynamic.childPage"/>
-   </extension>
-
-
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newPreferencePage1/preferencePage.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newPreferencePage1/preferencePage.jar
deleted file mode 100644
index 6673a52..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newPreferencePage1/preferencePage.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newPropertyPage1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newPropertyPage1/plugin.xml
deleted file mode 100644
index 50dc3d3..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newPropertyPage1/plugin.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newPropertyPage1"
-   name="NewPropertyPage One Plug-in"
-   version="1.0.0"
-   provider-name="">
-
-   <runtime>
-      <library name="propertyPage.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-   <extension
-         id="testDynamicPropertyPageAddition"
-         point="org.eclipse.ui.propertyPages">
-      <page
-            objectClass="org.eclipse.ui.tests.dynamicplugins.DynamicTestType"
-            class="org.eclipse.ui.dynamic.DynamicPropertyPage"
-            name="org.eclipse.ui.tests.page1"
-            id="dynamicPropertyPage1"/>
-   </extension>
-
-
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newPropertyPage1/propertyPage.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newPropertyPage1/propertyPage.jar
deleted file mode 100644
index 5104721..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newPropertyPage1/propertyPage.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newStartup1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newStartup1/plugin.xml
deleted file mode 100644
index d801cc8..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newStartup1/plugin.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newStartup1"
-   name="newStartup1 Plug-in"
-   version="1.0.0">
-
-   <runtime>
-      <library name="startup.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-   <extension
-         id="testDynamicStartupAddition"
-         point="org.eclipse.ui.startup">
-      <startup class="org.eclipse.ui.dynamic.DynamicStartup"/>
-   </extension>
- 
-
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newStartup1/startup.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newStartup1/startup.jar
deleted file mode 100644
index 810ebe8..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newStartup1/startup.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newStatusHandler1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newStatusHandler1/plugin.xml
deleted file mode 100644
index 347c7c3..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newStatusHandler1/plugin.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newStatusHandler1"
-   name="New StatusHandler One Plug-In"
-   version="3.0.0"
-   provider-name="">
-
-   <runtime>
-      <library name="statusHandler.jar">
-         <export
-               name="*">
-         </export>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-
-   <extension
-         id="testDynamicStatusHandlerAddition"
-         point="org.eclipse.ui.statusHandlers">
-      <statusHandler
-            class="org.eclipse.ui.dynamic.DynamicStatusHandler"
-            id="org.eclipse.newStatusHandler1.newStatusHandler1">
-      </statusHandler>
-      <statusHandlerProductBinding
-            handlerId="org.eclipse.newStatusHandler1.newStatusHandler1"
-            productId="org.eclipse.sdk.ide">
-      </statusHandlerProductBinding>
-      <statusHandler
-            class="org.eclipse.ui.dynamic.DynamicStatusHandler"
-            id="org.eclipse.newStatusHandler1.newStatusHandler2">
-      </statusHandler>
-   </extension>
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newStatusHandler1/statusHandler.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newStatusHandler1/statusHandler.jar
deleted file mode 100644
index 81910c4..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newStatusHandler1/statusHandler.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newView1/anything.gif b/tests/org.eclipse.ui.tests/data/org.eclipse.newView1/anything.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newView1/anything.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newView1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newView1/plugin.xml
deleted file mode 100644
index 9b52170..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newView1/plugin.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newView1"
-   name="New View One Plug-In"
-   version="3.0.0"
-   provider-name="">
-
-   <runtime>
-      <library name="view.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-   </requires>
-
-   <extension
-         point="org.eclipse.ui.views" id="testDynamicViewAddition">
-      <view
-            class="org.eclipse.ui.dynamic.DynamicView"
-            icon="anything.gif"
-            category="org.eclipse.newView1.newCategory1"
-            name="NewView1"
-            id="org.eclipse.newView1.newView1">
-     </view>
-      <category
-            name="NewCategory1"
-            id="org.eclipse.newView1.newCategory1"/>
-      <stickyView
-            closeable="false"
-            moveable="false"
-            location="BOTTOM"
-            id="org.eclipse.newView1.newView1"/>
-            
-            
-     <view
-            class="org.eclipse.ui.dynamic.DynamicView"
-            icon="anything.gif"
-            name="NewView2"
-            id="org.eclipse.newView1.newView2">
-     </view>
-   </extension>
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newView1/view.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newView1/view.jar
deleted file mode 100644
index d26a999..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newView1/view.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newWorkingSet1/anything.gif b/tests/org.eclipse.ui.tests/data/org.eclipse.newWorkingSet1/anything.gif
deleted file mode 100755
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newWorkingSet1/anything.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newWorkingSet1/plugin.xml b/tests/org.eclipse.ui.tests/data/org.eclipse.newWorkingSet1/plugin.xml
deleted file mode 100755
index bb287e6..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newWorkingSet1/plugin.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="newWorkingSet1"
-   name="New WorkingSet One Plug-In"
-   version="3.0.0"
-   provider-name="">
-
-   <runtime>
-      <library name="workingSet.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.core.runtime"/>
-   </requires>
-
-   <extension
-         point="org.eclipse.ui.workingSets"
-         id="testDynamicWorkingSetAddition1">
-      <workingSet
-            icon="icons/anything.gif"
-            id="org.eclipse.newWorkingSet1.WorkingSet1"
-            name="Dynamic Working Set 1"
-            pageClass="org.eclipse.ui.dynamic.DynamicWorkingSetPage"
-            updaterClass="org.eclipse.ui.dynamic.DynamicWorkingSetUpdater"
-            elementAdapterClass="org.eclipse.ui.dynamic.DynamicWorkingSetElementAdapter"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.workingSets"
-         id="testDynamicWorkingSetAddition2">
-      <workingSet
-            icon="icons/anything.gif"
-            id="org.eclipse.newWorkingSet1.WorkingSet2"
-            name="Dynamic Working Set 2"
-            pageClass="org.eclipse.ui.dynamic.DynamicWorkingSetPage"
-            updaterClass="org.eclipse.ui.dynamic.DynamicWorkingSetUpdater"
-            elementAdapterClass="org.eclipse.ui/org.eclipse.ui.BasicWorkingSetElementAdapter:org.eclipse.core.resources.IResource;adapt=true"/>
-   </extension>
-</plugin>
diff --git a/tests/org.eclipse.ui.tests/data/org.eclipse.newWorkingSet1/workingSet.jar b/tests/org.eclipse.ui.tests/data/org.eclipse.newWorkingSet1/workingSet.jar
deleted file mode 100644
index 425181a..0000000
--- a/tests/org.eclipse.ui.tests/data/org.eclipse.newWorkingSet1/workingSet.jar
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/workspaces/editorSessionTests.zip b/tests/org.eclipse.ui.tests/data/workspaces/editorSessionTests.zip
deleted file mode 100644
index 0523523..0000000
--- a/tests/org.eclipse.ui.tests/data/workspaces/editorSessionTests.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/workspaces/importExistingFromDirTest.zip b/tests/org.eclipse.ui.tests/data/workspaces/importExistingFromDirTest.zip
deleted file mode 100644
index e8b3446..0000000
--- a/tests/org.eclipse.ui.tests/data/workspaces/importExistingFromDirTest.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/workspaces/introSessionTests.zip b/tests/org.eclipse.ui.tests/data/workspaces/introSessionTests.zip
deleted file mode 100644
index 0523523..0000000
--- a/tests/org.eclipse.ui.tests/data/workspaces/introSessionTests.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/data/workspaces/themeSessionTests.zip b/tests/org.eclipse.ui.tests/data/workspaces/themeSessionTests.zip
deleted file mode 100644
index f2e9c6b..0000000
--- a/tests/org.eclipse.ui.tests/data/workspaces/themeSessionTests.zip
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/doc/Introduction.html b/tests/org.eclipse.ui.tests/doc/Introduction.html
deleted file mode 100644
index 0440e61..0000000
--- a/tests/org.eclipse.ui.tests/doc/Introduction.html
+++ /dev/null
@@ -1,133 +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="Build">
-   <meta name="GENERATOR" content="Mozilla/4.5 [en] (WinNT; I) [Netscape]">
-   <title>The Workbench Test Framework</title>
-</head>
-<body>
-
-<h2>
-The Workbench Test Suite</h2>
-Dave Springgay
-<br>September 2001
-<h3>
-In Brief</h3>
-This document describes the UI Test Suite.&nbsp; This test suite is available
-from <tt>org.eclipse.ui.tests</tt> in the desktop repository and consist
-of a series of non-interactive sniff tests which are run after a build,
-plus a set of interactive tests which require human feedback.&nbsp; You
-can run any of these from the JUnit Eclipse Plugin Tests launcher or from
-the command line.
-<p>The <tt>org.eclipse.ui.tests</tt> project is organized in hierarchical
-fashion.&nbsp; The root is <tt>UiTestSuite</tt> in <tt>org.eclipse.ui.tests</tt>.&nbsp;
-This test suite contains a collection of "specialized suites" which test
-specific areas of functionality or components in the workbench.&nbsp; Currently
-there is only one suite, <tt>ApiTestSuite
-</tt>in<tt> org.eclipse.ui.tests.api</tt>,
-which contains a number of test cases which deal specifically with workbench
-API.&nbsp; A <tt>uiTest</tt> extension is declared for each suite so that
-you can run every test in the workbench or a subset of the tests.
-<p>To run the UiTestSuite from within Eclipse just select UiTestSuite.java
-in the navigator and invoke Run > JUnit Eclipse Plugin Tests.&nbsp; The
-results of the test suite will appear in the JUnit view.
-<h3>
-Automated Sniff Tests</h3>
-The following process is used to run the workbench UI sniff tests after
-a build.
-<p>To create the sniff test files ..
-<ol>
-<li>
-Export the 4 test projects into a zip file.&nbsp; The options in the export
-wizard should be set to "Compress the contents of the file" and not "Create
-directory Structure".</li>
-</ol>
-To run the sniff tests in a fresh build of Eclipse ..
-<ol>
-<li>
-Unzip the zip file in the Eclipse plugins directory.</li>
-
-<li>
-On Windows copy uiSniff.bat in the org.eclipse.ui.tests plugin directory
-to the Eclipse home directory.&nbsp; On Linux copy uiSniff instead.</li>
-
-<li>
-Run uiSniff.bat ( or uiSniff ).&nbsp; Redirect the results into a file.</li>
-</ol>
-
-<h3>
-Test Patterns</h3>
-In our own testing we have discovered a number of common test patterns.&nbsp;
-In order to encourage a consistent approach for testing they are published
-below.
-<p><b>Simple Setters, Getters and Commands</b>
-<p>Scenario: You want to test setters, commands and getters on an interface.
-<p>Method: Call the setter or command which affects the object state.&nbsp;
-Call the getter to verify that state.
-<p><b>Top Down Coverage</b>
-<p>Scenario: You want to demonstrate thorough coverage of a component.
-<p>Method: Start at the object root of the instance hierarchy and test
-every class downwards to the leaf classes.&nbsp; Stop when you encounter
-a layer which already has JUnit test cases.&nbsp; For instance, in the
-workbench UI don't test JFace, SWT, or core.&nbsp; They should have their
-own test suites and are assumed to work.
-<p><b>Superclass Subclass</b>
-<p>Scenario: You want to test D, which is a subclass of B.
-<p>Method: Implement a test case for B called BTest.&nbsp; Then create
-a subclass of BTest called DTest which tests D.&nbsp; If B is an abstract
-class use a factory method in BTest to create the test object.
-<p><b>Listener Source</b>
-<p>Scenario: You want to test S, a class which fires events when a particular
-situation occurs.
-<p>Method: Implement a listener for S which records the reception of events.
-Then write a test class for S called STest which does something which should
-cause those events to fire.&nbsp; Verify the reception of events afterwards.
-<p><b>Multiple Session</b>
-<p>Scenario: You want to test the persistance of state from one session
-to the next.
-<p>Method: You need to create two test suites.&nbsp; One test suite will
-set up the state.&nbsp; The other will verify the state.&nbsp; Run them
-sequentially in two separate processes.
-<p><b>Global State</b>
-<p>Scenario: In Eclipse the workbench is a global object.&nbsp; Unfortunately,
-this means that one test case may modify that state and affect the outcome
-of another unrelated test case.&nbsp; How can you avoid this problem?
-<p>Method: If the test case modifies the state of a window or something
-in the window you should create a new window as part of the setUp for the
-test case.&nbsp; Run the test code within that window and then close the
-test window in the tearDown method.&nbsp; The modified state will be discarded
-when the window is closed
-<p><b>Lifecycle</b>
-<p>Scenario: Within the workbench there are various interfaces, such as
-IViewPart, which are defined as API and implemented by plugin code.&nbsp;
-There is no need to test the implementation of the interface, but it is
-good to test the lifecycle as implemented by objects which call the interface.
-<p>Method: Define a class X which implements the interface and records
-the invocation of various methods.&nbsp; Create a scenario where this class
-is loaded and should receive events.&nbsp; Afterwards, test that those
-methods were called.
-<p><b>Piercing the Encapsulation</b>
-<p>Scenario: To test the behavior of commands which modify the state of
-the object when there are no public interfaces to query that state.
-<p>Method: If possible, cast the interface to a concrete class with additional
-public methods.&nbsp; For instance, in the workbench the underlying structure
-for IWorkbench is exposed in Workbench.&nbsp; Given a Workbench object,
-you can get the menu, toolbar, etc, and interact directly with the actions
-to verify their state or invoke them directly.&nbsp; This is also a useful
-way to simulate action invocation from the UI.
-<p><b>Mock Objects</b>
-<p>Scenario: To test the implementation of an interface which instantiates
-an extension.&nbsp; For instance, in the test case for IWorkbenchPage we
-need to open views and editors.
-<p>Method: If we reference views and editors which exist within the Workbench
-UI Standard Components project the test case is vulnerable to change in
-those components.&nbsp; In this case we're not testing the components,
-we're testing IWorkbenchPage, so we implemented some light weight mock
-views and editors which do nothing more than record their own creation
-and lifecycle.
-<br>&nbsp;
-<br>&nbsp;
-<br>&nbsp;
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/doc/JUnitPractices.html b/tests/org.eclipse.ui.tests/doc/JUnitPractices.html
deleted file mode 100644
index 16e0b05..0000000
--- a/tests/org.eclipse.ui.tests/doc/JUnitPractices.html
+++ /dev/null
@@ -1,118 +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="Build">
-   <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
-   <title>The Workbench Test Framework</title>
-</head>
-<body>
-
-<h3>
-Plugin Test Practices</h3>
-In our own testing we have discovered a number of common test patterns.&nbsp;
-In order to encourage a consistent approach for testing they are published
-below.
-<p><b>Setters, Getters and Commands</b>
-<p>Scenario: You want to test setters, getters, and commands in an interface.
-<p>Method: Call the setter or command which affects the object state.&nbsp;
-Call the getter to verify that state.&nbsp; If you can't see this state
-see to "Piercing an Interface".
-<p><b>Subclass Superclass</b>
-<p>Scenario: You want to test D, which is a subclass of B.
-<p>Method: Implement a test case for B called BTest.&nbsp; Then create
-a subclass of BTest called DTest which tests D the additional methods on
-D.&nbsp; Add a factory method to BTest to create any required test objects
-which may be specific to the test case and override it in DTest.&nbsp;
-When this approach is taken you inherit all of the BTest methods within
-the subclass DTest.
-<p><b>Event Notification</b>
-<p>Scenario: You want to test Source, a class which fires events when a
-particular situation occurs.
-<p>Method: Implement a listener for Source which can record the reception
-of events. Then write a test class for Source called SourceTest which does
-something which should cause those events to fire.&nbsp; Verify the reception
-of events afterwards.
-<p>Additional Tips: The CallHistory class in org.eclipse.ui.tests.util can
-be used to record the methods invoked in a target object.&nbsp; If the
-listener can be added then test the removal of the listener also.&nbsp;
-Make sure that events are not received after the listener has been removed.
-<p><b>Avoiding Global State</b>
-<p>Scenario: In Eclipse the workbench is a global object.&nbsp; Unfortunately,
-this means that one test case may modify that state of the workbench and
-affect the outcome of other unrelated test cases.&nbsp; How can you avoid
-this problem?
-<p>Method: If the test case modifies the state of a window or something
-in the window you should create a new window as part of the setUp for the
-test case.&nbsp; Run the test code within that window and then close the
-test window in the tearDown method.&nbsp; The modified state will be discarded
-when the window is closed.
-<p>Additional Tips: The UITestCase class in org.eclipse.ui.tests.util can
-be used as a superclass for your test case.&nbsp; It provides useful methods
-for the creation of new windows, pages, etc, and their disposal.
-<p><b>Piercing the Encapsulation</b>
-<p>Scenario: To test the behavior of commands which modify the state of
-the object when there are no public interfaces to query that state.
-<p>Method: If possible, cast the interface to a concrete class with additional
-public methods.&nbsp; For instance, in the workbench the underlying structure
-for IWorkbench is exposed in Workbench.&nbsp; Given a Workbench object,
-you can get the menu, toolbar, etc, and interact directly with those objects
-to verify their state or invoke them directly.
-<p>Additional Tips: The ActionUtil class in org.eclipse.ui.tests.util can
-be used to invoke actions within a window or menu manager.
-<p><b>Extension Creation</b>
-<p>Scenario: You want to test the creation of an extension.&nbsp; For instance,
-the IWorkbenchPage has a method called openEditor which creates an editor
-extension, and another called showView which creates a view extension.&nbsp;
-How do you test these?
-<p>Method: Obviously we can test these methods by invoking them.&nbsp;
-However, each of them take an editor or view id.&nbsp; Which id's do we
-use?&nbsp; If we reference views and editors which exist within the Workbench
-UI Standard Components project the test case is vulnerable to change in
-those components.&nbsp; But we're not testing those standard components,
-we're actually testing IWorkbenchPage, so it is better to implement some
-light weight mock views and editors which do nothing more than record their
-own creation and lifecycle.
-<p><b>Extension Lifecycle</b>
-<p>Scenario: Within the workbench there are various interfaces, such as
-IViewPart, which are defined as API and implemented by plugin code.&nbsp;
-There is no need to test the implementation of an interface like this if
-you define it and expect others to implement it.&nbsp; However, it is important
-to test the lifecycle of the object as implemented by those objects which
-create and call the interface implementation.
-<p>Method: Define a class X which implements the interface and records
-the invocation of various methods.&nbsp; Create a scenario where this class
-is instantiated and should receive events.&nbsp; Afterwards, test that
-those methods were called.
-<p>Additional Tips: The CallHistory class in org.eclipse.ui.tests.util can
-be used to record the methods invoked in a target object.
-<p><b>Session Persistence</b>
-<p>Scenario: You want to test the persistence of state from one session
-to the next.
-<p>Method: You need to create two test cases.&nbsp; One test case will
-set up the state.&nbsp; The other will verify the state.&nbsp; Run them
-sequentially in two separate processes.
-<p><b>Testing Mixins</b>
-<p>Scenario: Within the workbench there are many classes which implement
-a particular interface.&nbsp; Given the responsability defined by the class
-and the interfaces separately, how do you organize the test cases?
-<p>Method: You may choose to use a one to one rule of thumb.&nbsp; Create
-one test case class for each class or interface in the mixin.&nbsp; This
-hierarchical separation makes it easier to reuse each test case when an
-interface is implemented by more than one class.&nbsp; It also simplifies
-the accounting required to track which test cases have been written.
-<p><b>Where Do I Stop?</b>
-<p>Scenario: The workbench has many layers.&nbsp; If you are a plugin developer
-what are the bounds of the area you should test?
-<p>Method: In general, you should assume that everything you rely upon
-works.&nbsp; If you don't take this approach you will spend endless hours
-testing code written by other people. For instance, in the workbench UI
-we don't test JFace, SWT, or core.&nbsp; They have their own test suites
-and are assumed to work.&nbsp; On the other hand, you should at least write
-tests for every API which you provide to others.&nbsp; In Eclipse we have
-very strong rules for API compatability, and your own test cases allow
-you to change the implementation of API with some confidence.
-<br>&nbsp;
-<br>&nbsp;
-</body>
-</html>
diff --git a/tests/org.eclipse.ui.tests/icons/anything.gif b/tests/org.eclipse.ui.tests/icons/anything.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/icons/anything.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/icons/binary_co.gif b/tests/org.eclipse.ui.tests/icons/binary_co.gif
deleted file mode 100644
index 23a508e..0000000
--- a/tests/org.eclipse.ui.tests/icons/binary_co.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/icons/dynamic.gif b/tests/org.eclipse.ui.tests/icons/dynamic.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/icons/dynamic.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/icons/editor.gif b/tests/org.eclipse.ui.tests/icons/editor.gif
deleted file mode 100644
index 9bd92bf..0000000
--- a/tests/org.eclipse.ui.tests/icons/editor.gif
+++ /dev/null
@@ -1 +0,0 @@
-GIF89a
diff --git a/tests/org.eclipse.ui.tests/icons/imagetests/anything.gif b/tests/org.eclipse.ui.tests/icons/imagetests/anything.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/icons/imagetests/anything.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/icons/imagetests/binary_co.gif b/tests/org.eclipse.ui.tests/icons/imagetests/binary_co.gif
deleted file mode 100644
index 23a508e..0000000
--- a/tests/org.eclipse.ui.tests/icons/imagetests/binary_co.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/icons/imagetests/dynamic.gif b/tests/org.eclipse.ui.tests/icons/imagetests/dynamic.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/icons/imagetests/dynamic.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/icons/imagetests/editor.gif b/tests/org.eclipse.ui.tests/icons/imagetests/editor.gif
deleted file mode 100644
index 9bd92bf..0000000
--- a/tests/org.eclipse.ui.tests/icons/imagetests/editor.gif
+++ /dev/null
@@ -1 +0,0 @@
-GIF89a
diff --git a/tests/org.eclipse.ui.tests/icons/imagetests/mockeditorpart1.gif b/tests/org.eclipse.ui.tests/icons/imagetests/mockeditorpart1.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/icons/imagetests/mockeditorpart1.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/icons/imagetests/mockeditorpart2.gif b/tests/org.eclipse.ui.tests/icons/imagetests/mockeditorpart2.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/icons/imagetests/mockeditorpart2.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/icons/imagetests/view.gif b/tests/org.eclipse.ui.tests/icons/imagetests/view.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/icons/imagetests/view.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/icons/mockeditorpart1.gif b/tests/org.eclipse.ui.tests/icons/mockeditorpart1.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/icons/mockeditorpart1.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/icons/mockeditorpart2.gif b/tests/org.eclipse.ui.tests/icons/mockeditorpart2.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/icons/mockeditorpart2.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/icons/pack_empty_co.gif b/tests/org.eclipse.ui.tests/icons/pack_empty_co.gif
deleted file mode 100644
index 1ec39a3..0000000
--- a/tests/org.eclipse.ui.tests/icons/pack_empty_co.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/icons/view.gif b/tests/org.eclipse.ui.tests/icons/view.gif
deleted file mode 100644
index efc77a7..0000000
--- a/tests/org.eclipse.ui.tests/icons/view.gif
+++ /dev/null
Binary files differ
diff --git a/tests/org.eclipse.ui.tests/plugin.xml b/tests/org.eclipse.ui.tests/plugin.xml
deleted file mode 100644
index bc44a37..0000000
--- a/tests/org.eclipse.ui.tests/plugin.xml
+++ /dev/null
@@ -1,4024 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension-point id="sample" name="sample" schema="schema/sample.exsd"/>  
-   
-<!--Startup testing -->
-   <extension
-         point="org.eclipse.ui.startup">
-      <startup>
-      </startup>
-   </extension>
-   <extension
-         point="org.eclipse.ui.startup">
-      <startup
-            class="org.eclipse.ui.tests.api.StartupClass">
-      </startup>
-   </extension>
-<!-- Utils -->
-   <extension
-         point="org.eclipse.ui.perspectives">
- 
-      <perspective
-            name="UI Test Drag Test Perspective"
-            icon="icons/anything.gif"
-            class="org.eclipse.ui.tests.dnd.DragDropPerspectiveFactory"
-            id="org.eclipse.ui.tests.dnd.dragdrop">
-      </perspective>
-      <perspective
-            name="UI Test Zoom Test Perspective"
-            icon="icons/anything.gif"
-            class="org.eclipse.ui.tests.zoom.ZoomPerspectiveFactory"
-            id="org.eclipse.ui.tests.zoom.ZoomPerspectiveFactory">
-      </perspective>
-      <perspective
-            name="UI Test View Arrangement Perspective"
-            icon="icons/anything.gif"
-            class="org.eclipse.ui.tests.api.ViewPerspective"
-            id="org.eclipse.ui.tests.api.ViewPerspective">
-      </perspective>
-   </extension>
-<!-- Utils End -->
-   <extension
-         point="org.eclipse.ui.perspectives">
-      <perspective
-            name="UI Test Session Perspective"
-            class="org.eclipse.ui.tests.api.SessionPerspective"
-            id="org.eclipse.ui.tests.api.SessionPerspective">
-      </perspective>
-      <perspective
-            class="org.eclipse.ui.tests.api.PerspectiveWithFastView"
-            name="UI Test Perspective with Fast View"
-            id="org.eclipse.ui.tests.fastview_perspective">
-      </perspective>      
-      <perspective
-            class="org.eclipse.ui.tests.api.PerspectiveWithMultiViewPlaceholdersAtTopLevel"
-            name="UI Test Perspective with Multi View Placeholders At Top Level"
-            id="org.eclipse.ui.tests.PerspectiveWithMultiViewPlaceholdersAtTopLevel">
-      </perspective>      
-      <perspective
-            class="org.eclipse.ui.tests.api.PerspectiveWithMultiViewPlaceholdersInPlaceholderFolder"
-            name="UI Test Perspective with Multi View Placeholders In Placeholder Folder"
-            id="org.eclipse.ui.tests.PerspectiveWithMultiViewPlaceholdersInPlaceholderFolder">
-      </perspective>      
-      <perspective
-            class="org.eclipse.ui.tests.api.PerspectiveWithMultiViewPlaceholdersInFolder"
-            name="UI Test Perspective with Multi View Placeholders In Folder"
-            id="org.eclipse.ui.tests.PerspectiveWithMultiViewPlaceholdersInFolder">
-      </perspective>
-      <perspective
-            class="org.eclipse.ui.tests.api.PerspectiveViewsBug88345"
-            id="org.eclipse.ui.tests.api.PerspectiveViewsBug88345"
-            name="UI Test Perspective for closable view"/>  
-       <perspective
-            class="org.eclipse.ui.tests.api.PerspectiveViewsBug120934"
-            id="org.eclipse.ui.tests.api.PerspectiveViewsBug120934"
-            name="UI Test Perspective for presentation NPE"/> 
-      <perspective
-            class="org.eclipse.ui.tests.dnd.StandaloneViewPerspective"
-            id="org.eclipse.ui.tests.dnd.StandaloneViewPerspective"
-            name="Standalone View DnD Perspective"/>         
-      <perspective
-            class="org.eclipse.ui.tests.internal.Bug78470Test$MyPerspective"
-            id="org.eclipse.ui.tests.internal.Bug78470Test.MyPerspective"
-            name="org.eclipse.ui.tests.internal.Bug78470Test.MyPerspective"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views">
-
-      <category
-            name="Error handling"
-            id="org.eclipse.ui.tests.errorhandling"/>
-
-      <view
-       		name="ERROR: View that allocates all available graphics handles"
-       		icon="icons\view.gif"
-      		category="org.eclipse.ui.tests.errorhandling"
-       		class="org.eclipse.ui.tests.api.workbenchpart.HeavyResourceView"
-       		id="org.eclipse.ui.tests.api.workbenchpart.HeavyResourceView">
-      </view>
-      
-      <view
-       		name="ERROR: View that throws PartInitException in init"
-       		icon="icons\view.gif"
-      		category="org.eclipse.ui.tests.errorhandling"
-       		class="org.eclipse.ui.tests.api.workbenchpart.ViewWithInitException"
-       		id="org.eclipse.ui.tests.api.workbenchpart.ViewWithInitException">
-      </view>
-
-      <view
-       		name="ERROR: View that throws RuntimeException in init"
-       		icon="icons\view.gif"
-      		category="org.eclipse.ui.tests.errorhandling"
-       		class="org.eclipse.ui.tests.api.workbenchpart.ViewWithInitRuntimeException"
-       		id="org.eclipse.ui.tests.api.workbenchpart.ViewWithInitRuntimeException">
-      </view>
-      <view
-       		name="ERROR: View pointing to invalid class"
-       		category="org.eclipse.ui.tests.errorhandling"
-       		icon="icons\view.gif"
-       		class="org.eclipse.ui.tests.api.workbenchpart.ViewWithMissingClass"
-       		id="org.eclipse.ui.tests.api.workbenchpart.ViewWithMissingClass">
-      </view>
-      <view
-       		name="ERROR: View that throws exception in dispose"
-       		category="org.eclipse.ui.tests.errorhandling"
-       		icon="icons\view.gif"
-       		class="org.eclipse.ui.tests.api.workbenchpart.ViewWithDisposeException"
-       		id="org.eclipse.ui.tests.api.workbenchpart.ViewWithDisposeException">
-      </view>
-      <view
-       		name="ERROR: View that throws exception in createPartControls"
-      		category="org.eclipse.ui.tests.errorhandling"
-       		icon="icons\view.gif"
-       		class="org.eclipse.ui.tests.api.workbenchpart.ViewWithCreateControlsException"
-       		id="org.eclipse.ui.tests.api.workbenchpart.ViewWithCreateControlsException">
-      </view>
-
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.views">
-
-      <view
-       		name="Title Test View"
-       		icon="icons\view.gif"
-       		class="org.eclipse.ui.tests.api.workbenchpart.TitleTestView"
-       		id="org.eclipse.ui.tests.api.TitleTestView">
-      </view>
-
-      <view
-            name="Mock View 1"
-            icon="icons\view.gif"
-            class="org.eclipse.ui.tests.api.MockViewPart"
-            id="org.eclipse.ui.tests.api.MockViewPart">
-      </view>
-      <view
-            name="Mock View 2"
-            icon="icons\view.gif"
-            class="org.eclipse.ui.tests.api.MockViewPart"
-            id="org.eclipse.ui.tests.api.MockViewPart2">
-      </view>
-      <view
-            name="Mock View 3"
-            icon="icons\view.gif"
-            class="org.eclipse.ui.tests.api.MockViewPart"
-            id="org.eclipse.ui.tests.api.MockViewPart3">
-      </view>
-      <view
-            name="Mock View 4"
-            icon="icons\view.gif"
-            class="org.eclipse.ui.tests.api.MockViewPart"
-            id="org.eclipse.ui.tests.api.MockViewPart4">
-      </view>
-      <view
-            name="Context Mock View 5"
-            icon="icons\view.gif"
-            class="org.eclipse.ui.tests.contexts.MockViewPart5"
-            id="org.eclipse.ui.tests.contexts.MockViewPart5">
-      </view>
-      <view
-            allowMultiple="true"
-            name="Mock View Mult"
-            icon="icons\view.gif"
-            class="org.eclipse.ui.tests.api.MockViewPartMult"
-            id="org.eclipse.ui.tests.api.MockViewPartMult">
-      </view>
-      <view
-            name="Saveable Mock View"
-            icon="icons\view.gif"
-            class="org.eclipse.ui.tests.api.SaveableMockViewPart"
-            id="org.eclipse.ui.tests.api.SaveableMockViewPart">
-      </view>
-      <view
-            allowMultiple="true"
-            class="org.eclipse.ui.tests.api.UserSaveableMockViewPart"
-            icon="icons\view.gif"
-            id="org.eclipse.ui.tests.api.UserSaveableMockViewPart"
-            name="User Saveable Mock View">
-      </view>
-      <view
-            allowMultiple="true"
-            class="org.eclipse.ui.tests.api.UserSaveableSharedViewPart"
-            icon="icons\view.gif"
-            id="org.eclipse.ui.tests.api.UserSaveableSharedViewPart"
-            name="User Shared Mock View">
-      </view>
-      <view
-            name="Session Test View"
-            icon="icons\view.gif"
-            class="org.eclipse.ui.tests.api.SessionView"
-            id="org.eclipse.ui.tests.api.SessionView">
-      </view>
-      <view
-            name="IViewActionDelegateTest View"
-            icon="icons\view.gif"
-            class="org.eclipse.ui.tests.api.MockViewPart"
-            id="org.eclipse.ui.tests.api.IViewActionDelegateTest">
-      </view>
-      <view
-            name="Action Filter Test View 1"
-            icon="icons\view.gif"
-            class="org.eclipse.ui.tests.api.ListView:-staticMenu"
-            id="org.eclipse.ui.tests.api.IActionFilterTest1">
-      </view>
-      <view
-            name="Action Expression Test View"
-            icon="icons\view.gif"
-            class="org.eclipse.ui.tests.api.ListView"
-            id="org.eclipse.ui.tests.internal.ActionExpressionTest">
-      </view>
-      <view
-            name="Action Filter Test View 2"
-            icon="icons\view.gif"
-            class="org.eclipse.ui.tests.api.ListView:-dynamicMenu"
-            id="org.eclipse.ui.tests.api.IActionFilterTest2">
-      </view>
-      <view
-            name="Selection Provider Test View"
-            icon="icons\view.gif"
-            class="org.eclipse.ui.tests.SelectionProviderView"
-            id="org.eclipse.ui.tests.SelectionProviderView">
-      </view>
-      <view
-            name="Selection Provider Test View 2"
-            icon="icons\view.gif"
-            class="org.eclipse.ui.tests.SelectionProviderView"
-            id="org.eclipse.ui.tests.SelectionProviderView2">
-      </view>
-      <view
-            name="Adapted Resource Navigator"
-            icon="icons\view.gif"
-            class="org.eclipse.ui.tests.adaptable.AdaptedResourceNavigator"
-            id="org.eclipse.ui.tests.adaptable.adaptedHierarchy">
-      </view>
-      <view
-            name="EmptyView"
-            icon="icons/view.gif"
-            class="org.eclipse.ui.tests.api.workbenchpart.EmptyView"
-            id="org.eclipse.ui.tests.workbenchpart.EmptyView">
-      </view>
-      <view
-            name="OverriddenTitleView"
-            icon="icons/view.gif"
-            class="org.eclipse.ui.tests.api.workbenchpart.OverriddenTitleView"
-            id="org.eclipse.ui.tests.workbenchpart.OverriddenTitleView">
-      </view>
-      <view
-            name="RawIViewPart"
-            icon="icons/view.gif"
-            class="org.eclipse.ui.tests.api.workbenchpart.RawIViewPart"
-            id="org.eclipse.ui.tests.workbenchpart.RawIViewPart">
-      </view>
-            
-      <view
-            name="StickyViewRight1"
-            icon="icons/view.gif"
-            class="org.eclipse.ui.tests.api.MockViewPart"
-            id="org.eclipse.ui.tests.api.StickyViewRight1">
-      </view>
-      <view
-            name="StickyViewRight2"
-            icon="icons/view.gif"
-            class="org.eclipse.ui.tests.api.MockViewPart"
-            id="org.eclipse.ui.tests.api.StickyViewRight2">
-      </view>
-      <view
-            class="org.eclipse.jface.tests.viewers.interactive.ConcurrentTableTestView"
-            name="Concurrent Table Test View"
-            id="org.eclipse.ui.tests.concurrentTableTest"/>      
-      
-      
-      <stickyView
-            id="org.eclipse.ui.tests.api.StickyViewRight1"
-            location="RIGHT"
-            closeable="true"
-            moveable="true">
-      </stickyView>
-      <stickyView
-            id="org.eclipse.ui.tests.api.StickyViewRight2"
-            location="RIGHT"
-            closeable="false"
-            moveable="false">
-      </stickyView>
-
-      <view
-            name="StickyViewLeft1"
-            icon="icons/view.gif"
-            class="org.eclipse.ui.tests.api.MockViewPart"
-            id="org.eclipse.ui.tests.api.StickyViewLeft1">
-      </view>
-      <view
-            name="StickyViewLeft2"
-            icon="icons/view.gif"
-            class="org.eclipse.ui.tests.api.MockViewPart"
-            id="org.eclipse.ui.tests.api.StickyViewLeft2">
-      </view>
-      <stickyView
-            id="org.eclipse.ui.tests.api.StickyViewLeft1"
-            location="LEFT">
-      </stickyView>
-      <stickyView
-            id="org.eclipse.ui.tests.api.StickyViewLeft2"
-            location="LEFT">
-      </stickyView>
-      
-      <view
-            name="StickyViewTop1"
-            icon="icons/view.gif"
-            class="org.eclipse.ui.tests.api.MockViewPart"
-            id="org.eclipse.ui.tests.api.StickyViewTop1">
-      </view>
-      <view
-            name="StickyViewTop2"
-            icon="icons/view.gif"
-            class="org.eclipse.ui.tests.api.MockViewPart"
-            id="org.eclipse.ui.tests.api.StickyViewTop2">
-      </view>
-      <stickyView
-            id="org.eclipse.ui.tests.api.StickyViewTop1"
-            location="TOP">
-      </stickyView>
-      <stickyView
-            id="org.eclipse.ui.tests.api.StickyViewTop2"
-            location="TOP">
-      </stickyView>      
-      
-      <view
-            name="StickyViewBottom1"
-            icon="icons/view.gif"
-            class="org.eclipse.ui.tests.api.MockViewPart"
-            id="org.eclipse.ui.tests.api.StickyViewBottom1">
-      </view>
-      <view
-            name="StickyViewBottom2"
-            icon="icons/view.gif"
-            class="org.eclipse.ui.tests.api.MockViewPart"
-            id="org.eclipse.ui.tests.api.StickyViewBottom2">
-      </view>
-      <stickyView
-            id="org.eclipse.ui.tests.api.StickyViewBottom1"
-            location="BOTTOM">
-      </stickyView>
-      <stickyView
-            id="org.eclipse.ui.tests.api.StickyViewBottom2"
-            location="BOTTOM">
-      </stickyView>
-      <category
-            name="Decorator Tests"
-            id="org.eclipse.ui.tests.decoratorCategory"/>
-      <view
-            class="org.eclipse.ui.tests.decorators.DecoratorTreeView"
-            category="org.eclipse.ui.tests.decoratorCategory"
-            name="Tree View Test"
-            id="org.eclipse.ui.tests.decorators.TreeViewTest"/>
-      <view
-            class="org.eclipse.ui.tests.decorators.DecoratorTableView"
-            category="org.eclipse.ui.tests.decoratorCategory"
-            name="Table View Test"
-            id="org.eclipse.ui.tests.decorator.TableViewTest"/>
-      <view
-            class="org.eclipse.ui.tests.decorators.DecoratorTableTreeView"
-            category="org.eclipse.ui.tests.decoratorCategory"
-            name="Table Tree Test"
-            id="org.eclipse.ui.tests.decorator.TableTreeTest"/>
-      <view
-            class="org.eclipse.jface.tests.viewers.interactive.VirtualTableView"
-            category="org.eclipse.ui.tests.tableViewerViews"
-            name="Virtual Table View test"
-            id="org.eclipse.ui.tests.view1"/>
-      <view
-            class="org.eclipse.jface.tests.viewers.interactive.LazyVirtualTableView"
-            category="org.eclipse.ui.tests.tableViewerViews"
-            name="Lazy Virtual Table View test"
-            id="org.eclipse.ui.tests.lazyView"/>
-       <view
-            class="org.eclipse.jface.tests.viewers.interactive.LazyDeferredVirtualTableView"
-            category="org.eclipse.ui.tests.tableViewerViews"
-            name="Lazy Virtual Table with Deferred Updates and Ranges"
-            id="org.eclipse.ui.tests.lazyViewDeferred"/>
-      <category
-            name="Table Viewer Tests"
-            id="org.eclipse.ui.tests.tableViewerViews"/>
-      <category
-            name="Component Tests"
-            id="org.eclipse.ui.tests.components"/>
-      <view
-            class="org.eclipse.ui.tests.session.ViewWithState"
-            id="org.eclipse.ui.tests.session.ViewWithState"
-            name="ViewWithState"/>
-      <view
-            class="org.eclipse.ui.tests.internal.Bug78470Test$MyViewPart"
-            id="org.eclipse.ui.tests.internal.Bug78470Test.MyViewPart"
-            name="org.eclipse.ui.tests.internal.Bug78470Test.MyViewPart"/>
-      <view
-            class="org.eclipse.ui.tests.internal.Bug78470Test$MyViewPart"
-            id="org.eclipse.ui.tests.internal.Bug78470Test.MyViewPart2"
-            name="org.eclipse.ui.tests.internal.Bug78470Test.MyViewPart2"/>
-      <view
-            class="org.eclipse.ui.tests.internal.Bug78470Test$MyViewPart"
-            id="org.eclipse.ui.tests.internal.Bug78470Test.MyViewPart3"
-            name="org.eclipse.ui.tests.internal.Bug78470Test.MyViewPart3"/>
-      <view
-            class="org.eclipse.ui.tests.contexts.MockPageView"
-            icon="icons/view.gif"
-            id="org.eclipse.ui.tests.contexts.MockPageView"
-            name="Service PageBookView"/>
-      <view
-            class="org.eclipse.ui.tests.api.workbenchpart.MenuContributionHarness"
-            id="org.eclipse.ui.tests.api.MenuTestHarness"
-            name="Menu Test Harness">
-      </view>
-      <view
-            allowMultiple="false"
-            class="org.eclipse.ui.tests.manual.ExplicitlyBusyView"
-            id="org.eclipse.ui.tests.ExplicitlyBusyView"
-            name="ExplicitlyBusyView"/>
-      <category
-            name="Saveables Testing"
-            id="org.eclipse.ui.tests.saveablesview">
-      </category>
-       <view
-            name="All Saveables"
-            icon="icons/view.gif"
-            category="org.eclipse.ui.tests.saveablesview"
-            class="org.eclipse.ui.tests.manual.SaveablesView"
-            id="org.eclipse.ui.tests.manual.SaveablesView">
-      </view>
-      <view
-            category="org.eclipse.ui.tests.saveablesview"
-            class="org.eclipse.ui.tests.manual.ViewWithSaveables"
-            icon="icons/view.gif"
-            id="org.eclipse.ui.tests.manual.ViewWithSaveables"
-            name="View Owning Saveables">
-      </view>
-      <view
-            allowMultiple="true"
-            class="org.eclipse.ui.tests.layout.constraints.LayoutConstraintsView"
-            id="org.eclipse.ui.tests.layout.constraints.LayoutConstraintsView"
-            name="Layout Constraints Test">
-      </view>
-      <view
-            class="org.eclipse.ui.tests.session.NonRestorableView"
-            id="org.eclipse.ui.tests.session.NonRestorableView"
-            name="NonRestorableView"
-            restorable="false">
-      </view>
-
-   </extension>
-   <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            name="Mock Editor 1"
-            extensions="mock1"
-            icon="icons/mockeditorpart1.gif"
-            class="org.eclipse.ui.tests.api.MockEditorPart"
-            id="org.eclipse.ui.tests.api.MockEditorPart1">
-      </editor>
-      <editor
-            name="Mock Editor 2"
-            extensions="mock2"
-            icon="icons/mockeditorpart2.gif"
-            class="org.eclipse.ui.tests.api.MockEditorPart"
-            id="org.eclipse.ui.tests.api.MockEditorPart2">
-      </editor>
-      <editor
-            name="Mock Editor Save"
-            extensions="mocksave"
-            icon="icons/mockeditorpart1.gif"
-            class="org.eclipse.ui.tests.api.MockEditorWithState"
-            id="org.eclipse.ui.tests.api.MockEditorStatePart">
-      </editor>
-      <editor
-            name="IEditorActionBarContributorTest"
-            extensions="mock3"
-            icon="icons/mockeditorpart2.gif"
-            class="org.eclipse.ui.tests.api.MockEditorPart"
-            contributorClass="org.eclipse.ui.tests.api.MockEditorActionBarContributor"
-            id="org.eclipse.ui.tests.api.IEditorActionBarContributorTest">
-      </editor>
-      <editor
-            name="IEditorActionDelegateTest"
-            extensions="mock3"
-            icon="icons/mockeditorpart2.gif"
-            class="org.eclipse.ui.tests.api.MockEditorPart"
-            contributorClass="org.eclipse.ui.tests.api.MockEditorActionBarContributor"
-            id="org.eclipse.ui.tests.api.IEditorActionDelegateTest">
-      </editor>
-      <editor
-            name="IEditorActionBarsTest"
-            extensions="mock3"
-            icon="icons\mockeditorpart2.gif"
-            class="org.eclipse.ui.tests.api.MockEditorPart"
-            contributorClass="org.eclipse.ui.tests.api.MockEditorActionBarContributor"
-            id="org.eclipse.ui.tests.internal.EditorActionBarsTest">
-      </editor>
-      <editor
-            name="ExtendedTextEditor"
-            extensions="exttxt"
-            icon="icons\mockeditorpart2.gif"
-            class="org.eclipse.ui.tests.internal.ExtendedTextEditor"
-            contributorClass="org.eclipse.ui.texteditor.BasicTextEditorActionContributor"
-            id="org.eclipse.ui.tests.ExtendedTextEditor">
-      </editor>
-      <editor
-            name="Test Multi-Page Editor"
-            extensions="multi"
-            icon="icons\mockeditorpart1.gif"
-            class="org.eclipse.ui.tests.multipageeditor.TestMultiPageEditor"
-            id="org.eclipse.ui.tests.multipageeditor.TestMultiPageEditor">
-      </editor>
-      <editor
-            class="org.eclipse.ui.tests.api.workbenchpart.TitleTestEditor"
-            icon="icons/anything.gif"
-            default="true"
-            name="Title Test Editor"
-            id="org.eclipse.ui.tests.TitleTestEditor"
-            extensions="titletest"/>
-
-      <editor
-            class="org.eclipse.ui.tests.api.workbenchpart.TitleTestEditor"
-            icon="invalidpath/iconThatDoesNotExist.gif"
-            default="true"
-            name="ERROR: Editor with missing icon"
-            id="org.eclipse.ui.tests.EditorWithMissingIcon"
-            extensions="test"/>
-
-      <editor
-            class="org.eclipse.ui.tests.api.workbenchpart.MissingClass"
-            icon="icons/anything.gif"
-            default="true"
-            name="ERROR: Editor with missing class"
-            id="org.eclipse.ui.tests.api.workbenchpart.MissingClass"
-            extensions="test"/>
-      <editor
-            class="org.eclipse.ui.tests.api.workbenchpart.EditorWithInitRuntimeException"
-            icon="icons/anything.gif"
-            default="true"
-            name="ERROR: RuntimeException in init"
-            id="org.eclipse.ui.tests.api.workbenchpart.EditorWithInitRuntimeException"
-            extensions="test"/>
-      <editor
-            class="org.eclipse.ui.tests.api.workbenchpart.EditorWithInputException"
-            icon="icons/anything.gif"
-            default="true"
-            name="ERROR: exception in getEditorInput"
-            id="org.eclipse.ui.tests.api.workbenchpart.EditorWithInputException"
-            extensions="test"/>
-      <editor
-            class="org.eclipse.ui.tests.api.workbenchpart.EditorWithInitException"
-            icon="icons/anything.gif"
-            default="true"
-            name="ERROR: PartInitException in init"
-            id="org.eclipse.ui.tests.api.workbenchpart.EditorWithInitException"
-            extensions="test"/>
-      <editor
-            class="org.eclipse.ui.tests.api.workbenchpart.EditorWithCreateControlsException"
-            icon="icons/anything.gif"
-            default="true"
-            name="ERROR: Exception in createPartControls"
-            id="org.eclipse.ui.tests.api.workbenchpart.EditorWithCreateControlsException"
-            extensions="test"/>
-      <editor
-            class="org.eclipse.ui.tests.api.workbenchpart.EditorWithDisposeException"
-            icon="icons/anything.gif"
-            default="true"
-            name="ERROR: Exception in dispose"
-            id="org.eclipse.ui.tests.api.workbenchpart.EditorWithDisposeException"
-            extensions="test"/>
- 
-	   <editor
-            class="org.eclipse.ui.tests.api.MockEditorPart"
-            icon="platform:/plugin/org.eclipse.ui/icons/full/obj16/font.gif"
-            default="true"
-            name="Plugin Icon Test 1"
-            id="org.eclipse.ui.tests.IconTestEditor1"
-            extensions="icontest1"/>            
-       <editor
-            class="org.eclipse.ui.tests.api.MockEditorPart"
-            icon="platform:/plugin/org.eclipse.jdt.ui/icons/full/obj16/class_obj.gif"
-            default="true"
-            name="Plugin Icon Test 2"
-            id="org.eclipse.ui.tests.IconTestEditor1"
-            extensions="icontest2"/>                      
-       <editor
-            class="org.eclipse.ui.tests.api.MockEditorPart"
-            icon="bad"
-            default="true"
-            name="Plugin Icon Test 3"
-            id="org.eclipse.ui.tests.IconTestEditor3"
-            extensions="icontest3"/>
-       <editor
-             class="org.eclipse.ui.tests.api.MockEditorPart"
-             default="false"
-             icon="icons/anything.gif"
-             id="org.eclipse.ui.tests.contentType1Editor"
-             name="org.eclipse.ui.tests.contentType1Editor">
-          <contentTypeBinding contentTypeId="org.eclipse.ui.tests.content-type1"/>
-       </editor>
-       <editor
-             default="true"
-             extensions="content-type1"
-             filenames="content-type1.blah"
-             icon="icons/anything.gif"
-             id="org.eclipse.ui.tests.contentType1Editor-fallback"
-             name="org.eclipse.ui.tests.contentType1Editor-fallback"/>       
-      <editor
-            name="Mock Matching Editor 1"
-            icon="icons\mockeditorpart1.gif"
-            class="org.eclipse.ui.tests.api.MockEditorPart"
-            id="org.eclipse.ui.tests.api.MockMatchingEditorPart1"
-            matchingStrategy="org.eclipse.ui.tests.api.MockEditorMatchingStrategy"/>
-      <editor
-            class="org.eclipse.ui.tests.api.SessionEditorPart"
-            default="false"
-            extensions="session"
-            icon="icons/binary_co.gif"
-            id="org.eclipse.ui.tests.api.SessionEditorPart"
-            name="SessionEditor"/>
-      <editor
-            class="org.eclipse.ui.tests.api.MockEditorPart"
-            default="false"
-            icon="icons/anything.gif"
-            id="org.eclipse.ui.tests.contentType2Editor"
-            name="org.eclipse.ui.tests.contentType2Editor">
-         <contentTypeBinding contentTypeId="org.eclipse.ui.tests.content-type2"/>
-      </editor>
-      <editor
-            class="org.eclipse.ui.tests.multieditor.TiledEditor"
-            default="false"
-            icon="icons/binary_co.gif"
-            id="org.eclipse.ui.tests.multieditor.TiledEditor"
-            name="%Editors.TiledEditor"/>
-      <editor
-            class="org.eclipse.ui.tests.multieditor.TestEditor"
-            contributorClass="org.eclipse.ui.tests.multieditor.TestActionBarContributor"
-            default="false"
-            extensions="etest"
-            icon="icons/binary_co.gif"
-            id="org.eclipse.ui.tests.multieditor.TestEditor"
-            name="%Editors.TestEditor"/>
-      <!-- the order of the following is very important.  We want to ensure that the 
-      default editor gets pushed to the front of the list. -->
-      <editor
-            class="org.eclipse.ui.tests.api.MockEditorPart"
-            default="false"
-            icon="icons/anything.gif"
-            id="org.eclipse.ui.tests.nondefaultedContentTypeEditor1"
-            name="defaultedContentTypeEditor">
-         <contentTypeBinding contentTypeId="org.eclipse.ui.tests.defaultedContentType"/>
-      </editor>
-      <editor
-            class="org.eclipse.ui.tests.api.MockEditorPart"
-            default="false"
-            icon="icons/anything.gif"
-            id="org.eclipse.ui.tests.nondefaultedContentTypeEditor2"
-            name="defaultedContentTypeEditor">
-         <contentTypeBinding contentTypeId="org.eclipse.ui.tests.defaultedContentType"/>
-      </editor>
-      <editor
-            class="org.eclipse.ui.tests.api.MockEditorPart"
-            default="true"
-            icon="icons/anything.gif"
-            id="org.eclipse.ui.tests.defaultedContentTypeEditor"
-            name="defaultedContentTypeEditor">
-         <contentTypeBinding contentTypeId="org.eclipse.ui.tests.defaultedContentType"/>
-      </editor>
-      <editor
-            class="org.eclipse.ui.tests.api.MockEditorPart"
-            default="false"
-            icon="icons/anything.gif"
-            id="org.eclipse.ui.tests.nondefaultedContentTypeEditor3"
-            name="defaultedContentTypeEditor">
-         <contentTypeBinding contentTypeId="org.eclipse.ui.tests.defaultedContentType"/>
-      </editor>
-      <editor
-            class="org.eclipse.ui.tests.multipageeditor.MultiVariablePageEditor"
-            extensions="multivar"
-            icon="icons/mockeditorpart1.gif"
-            id="org.eclipse.ui.tests.multipageeditor.MultiVariablePageEditor"
-            name="Multi Variable Page Editor"/>
-      <editor
-            class="org.eclipse.ui.tests.manual.TestBackgroundSaveEditor"
-            default="false"
-            extensions="background"
-            icon="icons/binary_co.gif"
-            id="org.eclipse.ui.tests.manual.TestBackgroundSaveEditor"
-            name="TestBackgroundSaveEditor">
-      </editor>
-      <editor
-            name="Context Menu Editor"
-            extensions="cme"
-            icon="icons\mockeditorpart1.gif"
-            class="org.eclipse.ui.tests.leaks.ContextEditorPart"
-            id="org.eclipse.ui.tests.leak.contextEditor">
-      </editor>
-   </extension>
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            label="Mock Action Set"
-            id="org.eclipse.ui.tests.api.MockActionSet">
-         <action
-               label="Mock Action"
-               class="org.eclipse.ui.tests.api.MockWorkbenchWindowActionDelegate"
-               menubarPath="additions"
-               id="org.eclipse.ui.tests.api.MockWindowAction">
-         </action>
-      </actionSet>      
-      <actionSet
-      		label="Hostile Action Set"
-      		id="org.eclipse.ui.tests.actionSets.brokenActionSet"
-      		visible="true">
-      	<action
-      			label="Hostile Action"
-      			style="pulldown"
-      			class="org.eclipse.ui.tests.menus.BrokenWorkbenchWindowPulldownDelegate"
-      			menubarPath="help/helpStart"
-      			id="org.eclipse.ui.tests.actionSets.brokenAction">
-      	</action>
-      </actionSet>
-      <actionSet
-            label="Test Actions"
-            visible="true"
-            id="org.eclipse.ui.tests.markers">
-         <menu id="test"
-            label="&amp;Test">
-            <separator name="additions" />
-         </menu>
-         <action
-               label="Create Test Markers"
-               class="org.eclipse.ui.tests.menus.AddMarkersAction"
-               allowLabelUpdate="false"
-               menubarPath="test/additions"
-               id="org.eclipse.ui.tests.markers.create">
-         </action>
-         <action
-               label="Delete Test Markers"
-               class="org.eclipse.ui.tests.menus.RemoveMarkersAction"
-               allowLabelUpdate="false"
-               menubarPath="test/additions"
-               id="org.eclipse.ui.tests.markers.delete">
-         </action>
-      </actionSet>
-      <actionSet
-            label="TestEditorMulti"
-            visible="false"
-            id="org.eclipse.ui.tests.multieditor.actionSet">
-         <action
-               class="org.eclipse.ui.tests.api.MockEditorActionDelegate"
-               disabledIcon="icons/binary_co.gif"
-               icon="icons/view.gif"
-               id="org.eclipse.ui.tests.multieditor.editorAction.action"
-               label="MockMultiEditorAction"
-               state="false"
-               style="push"
-               toolbarPath="Normal/Presentation"
-               tooltip="MultiEditorActionThing"/>
-      </actionSet>
-      <actionSet
-            id="org.eclipse.ui.tests.actionSet1"
-            label="Test Parameterized Action"
-            visible="false">
-         <action
-               id="org.eclipse.ui.tests.parm.hideEditorArea"
-               label="Hide File Editor Area"
-               menubarPath="file/additions"
-               style="push">
-            <class
-                  class="org.eclipse.ui.tests.api.GenericCommandActionDelegate">
-               <parameter
-                     name="commandId"
-                     value="org.eclipse.ui.window.hideShowEditors">
-               </parameter>
-            </class>
-         </action>
-         <action
-               class="org.eclipse.ui.tests.api.GenericCommandActionDelegate"
-               id="org.eclipse.ui.tests.parm.noClassAttrParm"
-               label="Hide No Class Attr"
-               menubarPath="file/additions"
-               style="push">
-         </action>
-         <action
-               id="org.eclipse.ui.tests.parm.noClassElParm"
-               label="Hide No Class Parm"
-               menubarPath="file/additions"
-               style="push">
-            <class
-                  class="org.eclipse.ui.tests.api.GenericCommandActionDelegate">
-            </class>
-         </action>
-         <action
-               id="org.eclipse.ui.tests.parm.incorrectClassElParm"
-               label="Hide Bad Class Parm"
-               menubarPath="file/additions"
-               style="push">
-            <class
-                  class="org.eclipse.ui.tests.api.GenericCommandActionDelegate">
-               <parameter
-                     name="commandIdWhat"
-                     value="org.eclipse.ui.window.hideShowEditors">
-               </parameter>
-            </class>
-         </action>
-      </actionSet>
-   </extension>
-   <extension
-         point="org.eclipse.ui.viewActions">
-      <viewContribution
-            targetID="org.eclipse.ui.tests.api.IViewActionDelegateTest"
-            id="va1">
-         <action
-               label="Mock Action"
-               class="org.eclipse.ui.tests.api.MockViewActionDelegate"
-               menubarPath="additions"
-               id="a1">
-         </action>
-      </viewContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commands">
-      <category
-            id="org.eclipse.ui.tests.category.keyModel"
-            name="Key Model">
-      </category>
-      <command
-            categoryId="org.eclipse.ui.tests.category.keyModel"
-            id="org.eclipse.ui.tests.keyModel.conflict1"
-            name="Conflict1">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.tests.category.keyModel"
-            id="org.eclipse.ui.tests.keyModel.conflict2"
-            name="Conflict2">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.tests.category.keyModel"
-            id="org.eclipse.ui.tests.keyModel.conflict3"
-            name="Conflict3">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.tests.category.keyModel"
-            id="org.eclipse.ui.tests.keyModel.conflict4"
-            name="ConflictNoKey4">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.tests.category.keyModel"
-            id="org.eclipse.ui.tests.keyModel.conflict5"
-            name="ConflictNoKey5">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.tests.category.keyModel"
-            id="org.eclipse.ui.tests.keyModel.emacs1"
-            name="emacsCommand1">
-      </command>
-   </extension>
-   <extension
-         point="org.eclipse.ui.bindings">
-      <key
-            commandId="org.eclipse.ui.tests.keyModel.conflict1"
-            contextId="org.eclipse.ui.contexts.dialog"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+5 K">
-      </key>
-      <key
-            commandId="org.eclipse.ui.tests.keyModel.conflict2"
-            contextId="org.eclipse.ui.contexts.dialog"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+5 K">
-      </key>
-      <key
-            commandId="org.eclipse.ui.tests.keyModel.conflict3"
-            contextId="org.eclipse.ui.contexts.dialog"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="CTRL+5 K">
-      </key>
-      <key
-            commandId="org.eclipse.ui.tests.keyModel.emacs1"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.emacsAcceleratorConfiguration"
-            sequence="CTRL+5 E">
-      </key>
-   </extension>
-   <extension
-         point="org.eclipse.ui.editorActions">
-      <editorContribution
-            targetID="org.eclipse.ui.tests.api.IEditorActionDelegateTest"
-            id="ea1">
-         <action
-               label="Mock Action"
-               class="org.eclipse.ui.tests.api.MockEditorActionDelegate"
-               menubarPath="additions"
-               id="a1">
-         </action>
-      </editorContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.popupMenus">
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc1">
-         <filter
-               name="name"
-               value="red">
-         </filter>
-         <action
-               label="redAction_v1"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc1">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc2">
-         <filter
-               name="name"
-               value="blue">
-         </filter>
-         <action
-               label="blueAction_v1"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc2">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc3">
-         <filter
-               name="flag"
-               value="true">
-         </filter>
-         <action
-               label="trueAction_v1"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc3">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc4">
-         <filter
-               name="flag"
-               value="false">
-         </filter>
-         <action
-               label="falseAction_v1"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc4">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc5">
-         <filter
-               name="name"
-               value="red">
-         </filter>
-         <filter
-               name="flag"
-               value="true">
-         </filter>
-         <action
-               label="redTrueAction_v1"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc5">
-         </action>
-      </objectContribution>
-<!-- Adaptable test-->
-      <objectContribution
-            adaptable="true"
-            objectClass="org.eclipse.core.resources.IResource"
-            id="org.eclipse.ui.tests.adaptable.ResourceContributions">
-         <action
-               label="Resource Action"
-               class="org.eclipse.ui.tests.adaptable.ResourceAction"
-               menubarPath="org.eclipse.ui.OpenFileAction"
-               id="resource action">
-         </action>
-      </objectContribution>
-         
-      <!-- ObjectContributionTest: This is the content-type-based object contribution -->
-      <objectContribution
-            adaptable="true"
-            objectClass="org.eclipse.core.resources.IFile"
-            nameFilter="*.xml"
-            id="org.eclipse.ui.tests.testObjectStateContentType">
-         <visibility>
-            <objectState
-                  name="contentTypeId"
-                  value="org.eclipse.ui.tests.testObjectStateContentType">
-            </objectState>
-         </visibility>
-         <action
-               label="XML Top Level Element"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               tooltip="This is a contribution for ObjectContributionTest.testObjectStateContentType"
-               menubarPath="additions"
-               enablesFor="1"
-               id="org.eclipse.ui.tests.testObjectStateContentType">
-         </action>
-      </objectContribution>
-      
-   </extension>
-   
-   <extension
-   		point="org.eclipse.core.runtime.contentTypes">
-   		
-      	<!-- ObjectContributionTest: This is the content-type-based object contribution -->
-		<content-type 
-			id="testObjectStateContentType"
-			name="Tests top-level element recognition" 	
-			base-type="org.eclipse.core.runtime.xml"
-			priority="high">
-			<describer class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber">
-				<parameter name="element" value="testObjectStateContentTypeElement" />
-			</describer>
-		</content-type>
-       <content-type
-             file-extensions="content-type1"
-             file-names="content-type1.blah"
-             id="content-type1"
-             name="org.eclipse.ui.tests.content-type1"
-             priority="normal">
-        		<describer class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber">
-				<parameter name="element" value="contentType1" />
-			</describer>
-        </content-type>
-       <content-type
-             file-extensions="content-type2"
-             file-names="content-type2.blah"
-             id="content-type2"
-             name="org.eclipse.ui.tests.content-type2"
-             priority="normal">
-             <describer class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber">
-				<parameter name="element" value="contentType1" />
-			</describer>
-       </content-type>
-       <content-type
-             file-extensions="defaultedContentType"
-             id="defaultedContentType"
-             name="org.eclipse.ui.tests.defaultedContentType"
-             priority="normal"/>
-   </extension>
-   		
-   <extension
-         point="org.eclipse.ui.actionSets">
-<!-- ActionSetExpressionTest -->
-      <actionSet
-            label="List Element"
-            id="org.eclipse.ui.tests.internal.ListElementActions">
-         <menu
-               label="List Element"
-               path="additions"
-               id="org.eclipse.ui.tests.internal.ListElementMenu">
-            <separator
-                  name="group1">
-            </separator>
-         </menu>
-         <action
-               label="allAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               accelerator="ALT+SHIFT+-"
-               menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
-               enablesFor="1"
-               id="org.eclipse.ui.tests.internal.ac1">
-            <enablement>
-               <objectClass
-                     name="org.eclipse.ui.tests.api.ListElement">
-               </objectClass>
-            </enablement>
-         </action>
-         <action
-               label="redAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
-               enablesFor="1"
-               id="org.eclipse.ui.tests.internal.ac2">
-            <enablement>
-               <and>
-                  <objectClass
-                        name="org.eclipse.ui.tests.api.ListElement">
-                  </objectClass>
-                  <objectState
-                        name="name"
-                        value="red">
-                  </objectState>
-               </and>
-            </enablement>
-         </action>
-         <action
-               label="notRedAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
-               enablesFor="1"
-               id="org.eclipse.ui.tests.internal.ac3">
-            <enablement>
-               <and>
-                  <objectClass
-                        name="org.eclipse.ui.tests.api.ListElement">
-                  </objectClass>
-                  <not>
-                     <objectState
-                           name="name"
-                           value="red">
-                     </objectState>
-                  </not>
-               </and>
-            </enablement>
-         </action>
-         <action
-               label="trueAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
-               enablesFor="1"
-               id="org.eclipse.ui.tests.internal.ac4">
-            <enablement>
-               <and>
-                  <objectClass
-                        name="org.eclipse.ui.tests.api.ListElement">
-                  </objectClass>
-                  <objectState
-                        name="flag"
-                        value="true">
-                  </objectState>
-               </and>
-            </enablement>
-         </action>
-         <action
-               label="redOrBlueAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
-               enablesFor="1"
-               id="org.eclipse.ui.tests.internal.ac5">
-            <enablement>
-               <or>
-                  <and>
-                     <objectClass
-                           name="org.eclipse.ui.tests.api.ListElement">
-                     </objectClass>
-                     <objectState
-                           name="name"
-                           value="red">
-                     </objectState>
-                  </and>
-                  <and>
-                     <objectClass
-                           name="org.eclipse.ui.tests.api.ListElement">
-                     </objectClass>
-                     <objectState
-                           name="name"
-                           value="blue">
-                     </objectState>
-                  </and>
-               </or>
-            </enablement>
-         </action>
-         <action
-               label="redAndTrueAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
-               enablesFor="1"
-               id="org.eclipse.ui.tests.internal.ac6">
-            <enablement>
-               <and>
-                  <objectClass
-                        name="org.eclipse.ui.tests.api.ListElement">
-                  </objectClass>
-                  <objectState
-                        name="name"
-                        value="red">
-                  </objectState>
-                  <objectState
-                        name="flag"
-                        value="true">
-                  </objectState>
-               </and>
-            </enablement>
-         </action>
-         <action
-               label="pluginNotInstalledAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
-               id="org.eclipse.ui.tests.internal.ac7">
-            <enablement>
-               <pluginState
-                     value="installed"
-                     id="7777xxf">
-               </pluginState>
-            </enablement>
-         </action>
-         <action
-               label="pluginInstalledAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
-               id="org.eclipse.ui.tests.internal.ac8">
-            <enablement>
-               <pluginState
-                     value="installed"
-                     id="org.eclipse.ui">
-               </pluginState>
-            </enablement>
-         </action>
-         <action
-               label="pluginNotActivatedAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
-               id="org.eclipse.ui.tests.internal.ac9">
-            <enablement>
-               <pluginState
-                     value="activated"
-                     id="org.eclipse.update">
-               </pluginState>
-            </enablement>
-         </action>
-         <action
-               label="pluginActivatedAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
-               id="org.eclipse.ui.tests.internal.ac10">
-            <enablement>
-               <pluginState
-                     value="activated"
-                     id="org.eclipse.ui">
-               </pluginState>
-            </enablement>
-         </action>
-         <action
-               label="systemPropertyAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               menubarPath="org.eclipse.ui.tests.internal.ListElementMenu/group1"
-               id="org.eclipse.ui.tests.internal.ac11">
-            <enablement>
-               <systemProperty
-                     name="ActionExpressionVar"
-                     value="bubba">
-               </systemProperty>
-            </enablement>
-         </action>
-      </actionSet>
-<!-- TextSelectionActionFilterText -->
-      <actionSet
-            label="Text Selection Tests"
-            id="org.eclipse.ui.tests.internal.TextSelectionActions">
-         <menu
-               label="Text Selection Tests"
-               path="additions"
-               id="org.eclipse.ui.tests.internal.TextSelectionMenu">
-            <separator
-                  name="group1">
-            </separator>
-         </menu>
-         <action
-               label="anyText"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               menubarPath="org.eclipse.ui.tests.internal.TextSelectionMenu/group1"
-               enablesFor="1"
-               id="org.eclipse.ui.tests.internal.as_1">
-            <selection
-                  class="org.eclipse.jface.text.ITextSelection">
-            </selection>
-         </action>
-         <action
-               label="emptyText"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               menubarPath="org.eclipse.ui.tests.internal.TextSelectionMenu/group1"
-               id="org.eclipse.ui.tests.internal.ac_2">
-            <enablement>
-               <and>
-                  <objectClass
-                        name="org.eclipse.jface.text.ITextSelection">
-                  </objectClass>
-                  <objectState
-                        name="isEmpty"
-                        value="true">
-                  </objectState>
-               </and>
-            </enablement>
-         </action>
-         <action
-               label="helloText"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               menubarPath="org.eclipse.ui.tests.internal.TextSelectionMenu/group1"
-               id="org.eclipse.ui.tests.internal.ac_3">
-            <enablement>
-               <and>
-                  <objectClass
-                        name="org.eclipse.jface.text.ITextSelection">
-                  </objectClass>
-                  <objectState
-                        name="text"
-                        value="Hello">
-                  </objectState>
-               </and>
-            </enablement>
-         </action>
-      </actionSet>
-   </extension>
-   
-   <!-- Bug 125011.  There's no good way to test this programmatically, so the
-   test is simply to start up Eclipse and check whether the "label" attribute
-   will affect the tooltip text. -->
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            label="Bug 125011"
-            id="org.eclipse.ui.tests.actionSet125011"
-            visible="true">
-         <action
-               label="TestBug125011"
-               toolbarPath="workingSets"
-               icon="icons/anything.gif"
-               id="org.eclipse.ui.tests.action125011"
-               class="org.eclipse.ui.tests.api.MockActionDelegate" />
-      </actionSet>
-   </extension>
-   
-   <!-- Bug 122674.  To verify this bug, simply start Eclipse with this plug-in. 
-   -->
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            label="Bug 122674"
-            id="org.eclipse.ui.tests.actionSet122674" />
-   </extension>
-   <extension
-         point="org.eclipse.ui.popupMenus">
-<!-- PopupMenuExpressionTest -->
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc1">
-         <action
-               label="allAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc1">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc2">
-         <visibility>
-            <objectState
-                  name="name"
-                  value="red">
-            </objectState>
-         </visibility>
-         <action
-               label="redAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc2">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc3">
-         <visibility>
-            <not>
-               <objectState
-                     name="name"
-                     value="red">
-               </objectState>
-            </not>
-         </visibility>
-         <action
-               label="notRedAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc3">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc4">
-         <visibility>
-            <objectState
-                  name="flag"
-                  value="true">
-            </objectState>
-         </visibility>
-         <action
-               label="trueAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc4">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc5">
-         <visibility>
-            <or>
-               <objectState
-                     name="name"
-                     value="red">
-               </objectState>
-               <objectState
-                     name="name"
-                     value="blue">
-               </objectState>
-            </or>
-         </visibility>
-         <action
-               label="redOrBlueAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc4">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc6">
-         <visibility>
-            <and>
-               <objectState
-                     name="name"
-                     value="red">
-               </objectState>
-               <objectState
-                     name="flag"
-                     value="true">
-               </objectState>
-            </and>
-         </visibility>
-         <action
-               label="redAndTrueAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc4">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc7">
-         <visibility>
-            <pluginState
-                  value="installed"
-                  id="7777xxf">
-            </pluginState>
-         </visibility>
-         <action
-               label="pluginNotInstalledAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc4">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc8">
-         <visibility>
-            <pluginState
-                  value="installed"
-                  id="org.eclipse.ui">
-            </pluginState>
-         </visibility>
-         <action
-               label="pluginInstalledAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc4">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc9">
-         <visibility>
-            <pluginState
-                  value="activated"
-                  id="org.eclipse.update">
-            </pluginState>
-         </visibility>
-         <action
-               label="pluginNotActivatedAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc4">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc10">
-         <visibility>
-            <pluginState
-                  value="activated"
-                  id="org.eclipse.ui">
-            </pluginState>
-         </visibility>
-         <action
-               label="pluginActivatedAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc4">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc11">
-         <visibility>
-            <systemProperty
-                  name="ActionExpressionVar"
-                  value="bubba">
-            </systemProperty>
-         </visibility>
-         <action
-               label="systemPropertyAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc4">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.api.ListElement"
-            id="oc12">
-         <enablement>
-            <test property="org.eclipse.ui.tests.api.testing.name" value="red"/>
-         </enablement>
-         <action
-               label="expressionEnablementAction_v2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="oc13">
-         </action>
-      </objectContribution>
-   </extension> 
-   <extension point="org.eclipse.core.expressions.propertyTesters">
-      <propertyTester
-            namespace="org.eclipse.ui.tests.api.testing"
-            properties="name"
-            type="org.eclipse.ui.tests.api.ListElement"
-            class="org.eclipse.ui.tests.api.ListElementPropertyTester"
-            id="org.eclipse.ui.tests.api.propertyTester">
-      </propertyTester>
-   </extension>
-<!-- Decorator tests -->
-   <extension
-         point="org.eclipse.ui.decorators">
-      <decorator
-            objectClass="org.eclipse.core.resources.IResource"
-            label="Test Decorator"
-            class="org.eclipse.ui.tests.decorators.TestDecoratorContributor"
-            state="false"
-            id="org.eclipse.ui.tests.adaptable.decorator">
-         <description>
-            The test decorator
-         </description>
-      </decorator>
-      <decorator
-            adaptable="true"
-            objectClass="org.eclipse.core.resources.IResource"
-            label="Null Decorator"
-            class="org.eclipse.ui.tests.adaptable.NullLabelDecorator"
-            state="false"
-            id="org.eclipse.ui.tests.adaptable.nulldecorator">
-         <description>
-            A null test decorator
-         </description>
-      </decorator>
-      <decorator
-            lightweight="true"
-            adaptable="true"
-            label="Lightweight Test Decorator"
-            class="org.eclipse.ui.tests.decorators.TestLightweightDecoratorContributor"
-            state="false"
-            id="org.eclipse.ui.tests.decorators.lightweightdecorator">
-         <enablement>
-            <objectClass
-                  name="org.eclipse.core.resources.IResource">
-            </objectClass>
-         </enablement>
-         <description>
-            A lightweight test decorator
-         </description>
-      </decorator>
-      <decorator
-            lightweight="true"
-            location="TOP_LEFT"
-            adaptable="true"
-            label="Declarative Test Decorator"
-            icon="icons/binary_co.gif"
-            state="false"
-            id="org.eclipse.ui.tests.decorators.declareddecorator">
-         <enablement>
-            <objectClass
-                  name="org.eclipse.core.resources.IResource">
-            </objectClass>
-         </enablement>
-         <description>
-            A lightweight test decorator
-         </description>
-      </decorator>
-      <decorator
-            lightweight="true"
-            objectClass="org.eclipse.core.resources.IResource"
-            label="Bug 41545 Lightweight"
-            class="org.eclipse.ui.tests.decorators.NullImageDecorator"
-            id="org.eclipse.ui.tests.lightNullImageDecorator">
-      </decorator>
-      <decorator
-            lightweight="false"
-            objectClass="org.eclipse.core.resources.IResource"
-            label="Bug 41545 Heavy Image"
-            class="org.eclipse.ui.tests.decorators.HeavyNullImageDecorator"
-            id="org.eclipse.ui.tests.heavyNullImageDecorator">
-      </decorator>
-      <decorator
-            lightweight="false"
-            objectClass="org.eclipse.core.resources.IResource"
-            label="Bug 41545 Heavy Text"
-            class="org.eclipse.ui.tests.decorators.HeavyNullTextDecorator"
-            id="org.eclipse.ui.tests.heavyNullTextDecorator">
-      </decorator>
-      <decorator
-            lightweight="true"
-            adaptable="true"
-            label="Lightweight Test Decorator Multiple Quadrant"
-            state="false"
-            class="org.eclipse.ui.tests.decorators.TestLightweightDecoratorMultipleQuadrantContributor"
-            id="org.eclipse.ui.tests.decorators.lightweightdecorator2">
-         <enablement>
-            <objectClass
-                  name="org.eclipse.core.resources.IResource">
-            </objectClass>
-         </enablement>
-         <description>
-            A lightweight test decorator for multiple quadrants
-         </description>
-      </decorator>
-      <decorator
-            lightweight="true"
-            adaptable="true"
-            objectClass="java.lang.Object"
-            label="Background Decorator"
-            class="org.eclipse.ui.tests.decorators.BackgroundColorDecorator"
-            id="org.eclipse.ui.tests.backgroundDecorator"/>
-      <decorator
-            lightweight="true"
-            objectClass="java.lang.Object"
-            adaptable="true"
-            label="Foreground Decorator"
-            class="org.eclipse.ui.tests.decorators.ForegroundColorDecorator"
-            id="org.eclipse.ui.tests.foregroundDecorator"/>
-      <decorator
-            lightweight="true"
-            adaptable="true"
-            objectClass="java.lang.Object"
-            label="Font Decorator"
-            class="org.eclipse.ui.tests.decorators.FontDecorator"
-            id="org.eclipse.ui.tests.fontDecorator"/>
-            
-      <decorator
-            lightweight="true"
-            adaptable="true"
-            label="Test Decorator For General Adaptability On"
-            state="false"
-            class="org.eclipse.ui.tests.decorators.TestAdaptableDecoratorContributor"
-            id="org.eclipse.ui.tests.decorators.generalAdaptabilityOn">
-         <enablement>
-            <objectClass
-                  name="org.eclipse.ui.tests.menus.ObjectContributionClasses$ICommon">
-            </objectClass>
-         </enablement>
-         <description>
-            A test decorator for successful general adaptability
-         </description>
-      </decorator>
-      <decorator
-            lightweight="true"
-            adaptable="false"
-            label="Test Decorator For General Adaptability Off"
-            state="false"
-            class="org.eclipse.ui.tests.decorators.TestUnadaptableDecoratorContributor"
-            id="org.eclipse.ui.tests.decorators.generalAdaptabilityOff">
-         <enablement>
-            <objectClass
-                  name="org.eclipse.ui.tests.menus.ObjectContributionClasses$ICommon">
-            </objectClass>
-         </enablement>
-         <description>
-            A test decorator for unsuccessful general adaptability
-         </description>
-      </decorator>
-      <decorator
-            lightweight="true"
-            adaptable="true"
-            label="Test Resource Adaptation"
-            state="false"
-            class="org.eclipse.ui.tests.decorators.TestResourceDecoratorContributor"
-            id="org.eclipse.ui.tests.decorators.resourceDescorator">
-         <enablement>
-            <objectClass
-                  name="org.eclipse.core.resources.IResource">
-            </objectClass>
-         </enablement>
-         <description>
-            A test decorator for resources
-         </description>
-      </decorator>
-      <decorator
-            lightweight="true"
-            adaptable="true"
-            label="Test Resource Mapping Adaptation"
-            state="false"
-            class="org.eclipse.ui.tests.decorators.TestResourceMappingDecoratorContributor"
-            id="org.eclipse.ui.tests.decorators.resourceMappingDescorator">
-         <enablement>
-            <objectClass
-                  name="org.eclipse.core.resources.mapping.ResourceMapping">
-            </objectClass>
-         </enablement>
-         <description>
-            A test decorator for resource mappings
-         </description>
-      </decorator>
-      <decorator
-            adaptable="true"
-            class="org.eclipse.ui.tests.decorators.BadIndexDecorator"
-            id="org.eclipse.ui.tests.decorators.badIndexDecorator"
-            label="Bad Index Decorator"
-            lightweight="true">
-         <enablement>
-            <objectClass
-                  name="org.eclipse.core.resources.IResource">
-            </objectClass>
-         </enablement>
-      </decorator>
-      
-   </extension>
-<!-- Working set tests -->
-   <extension
-         point="org.eclipse.ui.workingSets">
-      <workingSet
-            icon="icons/anything.gif"
-            id="org.eclipse.ui.tests.api.MockWorkingSet"
-            name="Mock Working Set"
-            pageClass="org.eclipse.ui.tests.api.MockWorkingSetPage"
-            elementAdapterClass="org.eclipse.ui.BasicWorkingSetElementAdapter:org.eclipse.ui.tests.api.IWorkingSetTest$Foo;adapt=true,org.eclipse.ui.tests.menus.ObjectContributionClasses$ICommon;adapt=true,org.eclipse.core.resources.IResource;adapt=false"/>
-      <workingSet
-            icon="icons/anything.gif"
-            id="org.eclipse.ui.tests.api.BadWorkingSet"
-            name="Bad Working Set"
-            pageClass="org.eclipse.ui.tests.api.MockWorkingSetPage"
-            elementAdapterClass="org.eclipse.ui.BasicWorkingSetElementAdapter:org.eclipse.ui.tests.api.IWorkingSetTest$Foo;adapt=true,org.eclipse.ui.tests.menus.ObjectContributionClasses$ICommon;adapt=true,org.eclipse.core.resources.IResource;adapt=false"/>
-   </extension>
-<!-- Preference tests -->
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            name="Editors Test"
-            class="org.eclipse.ui.tests.dialogs.EnableTestPreferencePage"
-            id="org.eclipse.ui.tests.dialogs.EnableTestPreferencePage">
-      </page>
-      <page
-            name="Bad Listeners Test"
-            class="org.eclipse.ui.tests.manual.BrokenUpdatePreferencePage"
-            id="org.eclipse.ui.tests.manual.BrokenUpdatePreferencePage">
-      </page>
-      <page
-            name="Font Editors"
-            class="org.eclipse.ui.tests.dialogs.FontFieldEditorTestPreferencePage"
-            id="org.eclipse.ui.tests.dialogs.FontFieldEditorTestPreferencePage">
-      </page>
-   </extension>
-<!-- Multi-page editor tests -->
-   <extension
-         point="org.eclipse.ui.commands">
-      <keyBinding
-            string="Ctrl+Shift+4"
-            scope="org.eclipse.ui.tests.scope1"
-            command="org.eclipse.ui.tests.TestCommandId"
-            configuration="org.eclipse.ui.defaultAcceleratorConfiguration">
-      </keyBinding>
-      <keyBinding
-            string="Ctrl+Shift+5"
-            scope="org.eclipse.ui.tests.scope2"
-            command="org.eclipse.ui.tests.TestCommandId"
-            configuration="org.eclipse.ui.defaultAcceleratorConfiguration">
-      </keyBinding>
-   </extension>
-   <extension
-         point="org.eclipse.ui.contexts">
-      <context
-            name="Scope 1"
-            description="Test Scope #1"
-            id="org.eclipse.ui.tests.scope1">
-      </context>
-      <context
-            name="Scope 2"
-            description="Test Scope #2"
-            id="org.eclipse.ui.tests.scope2">
-      </context>
-      <context
-         	id="org.eclipse.ui.tests.contexts.context1"
-         	name="Test Context 1"
-         	description="A test for the preferred context support" />
-      <context
-         	id="org.eclipse.ui.tests.contexts.context2"
-         	name="Test Context 2"
-         	description="A test for the preferred context support"
-         	parentId="org.eclipse.ui.tests.contexts.context1" />
-      <context
-            id="org.eclipse.ui.tests.contexts.ViewPart"
-            name="View Part Context"
-            parentId="org.eclipse.ui.contexts.window"/>
-      <context
-            id="org.eclipse.ui.tests.contexts.WorkbenchWindow"
-            name="WorkbenchWindow Part Context"
-            parentId="org.eclipse.ui.contexts.window"/>
-      <context
-            id="org.eclipse.ui.tests.contexts.Page"
-            name="Page Context"
-            parentId="org.eclipse.ui.contexts.window"/>
-      <context
-            id="org.eclipse.ui.tests.multipageeditor.contextEditor"
-            name="MPEP Context"
-            parentId="org.eclipse.ui.textEditorScope"/>
-   </extension>
-<!-- Marker Image Provider tests -->
-   <extension
-         id="testmarker"
-         name="Test Marker"
-         point="org.eclipse.core.resources.markers">
-   </extension>
-   <extension
-         point="org.eclipse.ui.ide.markerImageProviders">
-      <imageprovider
-            markertype="org.eclipse.ui.tests.testmarker"
-            icon="icons/anything.gif"
-            id="testmarker.imageProvider">
-      </imageprovider>
-   </extension>
-   <extension
-         id="testmarker2"
-         name="Test Marker 2"
-         point="org.eclipse.core.resources.markers">
-   </extension>
-   <extension
-         point="org.eclipse.ui.ide.markerImageProviders">
-      <imageprovider
-            class="org.eclipse.ui.tests.adaptable.TestMarkerImageProvider"
-            icon="icons\dynamic.gif"
-            id="testmarker.imageProvider2"
-            markertype="org.eclipse.ui.tests.testmarker2">
-      </imageprovider>
-   </extension>
-   <extension
-         point="org.eclipse.ui.intro">
-      <intro
-            icon="icons/anything.gif"
-            class="org.eclipse.ui.tests.intro.MockIntroPart"
-            id="org.eclipse.ui.testintro">
-      </intro>
-   </extension>
-<!-- Activities testing -->
-   <extension
-         point="org.eclipse.ui.activities">
-      <category
-            name="Category 1"
-            description="description"
-            id="org.eclipse.category1">
-      </category>
-      <category
-            name="Category 2"
-            description="description"
-            id="org.eclipse.category2">
-      </category>
-      <category
-            name="Category 3"
-            description="description"
-            id="org.eclipse.category3">
-      </category>
-      <category
-            name="Category 4"
-            description="description"
-            id="org.eclipse.category4">
-      </category>
-      <category
-            name="Category 5"
-            description="description"
-            id="org.eclipse.category5">
-      </category>
-      <category
-            name="Category 6"
-            description="description"
-            id="org.eclipse.category6">
-      </category>
-      <activity
-            name="Activity 1"
-            description="description"
-            id="org.eclipse.activity1">
-      </activity>
-      <activity
-            name="Activity 2"
-            description="description"
-            id="org.eclipse.activity2">
-      </activity>
-      <activity
-            name="Activity 3"
-            description="description"
-            id="org.eclipse.activity3">
-      </activity>
-      <activity
-            name="Activity 4"
-            description="description"
-            id="org.eclipse.activity4">
-      </activity>
-      <activity
-            name="Activity 5"
-            description="description"
-            id="org.eclipse.activity5">
-      </activity>
-      <activity
-            name="Activity 6"
-            description="description"
-            id="org.eclipse.activity6">
-      </activity>
-      <activity
-            name="Activity 7"
-            description="description"
-            id="org.eclipse.activity7">
-      </activity>
-      <activity
-            name="Activity 8"
-            description="description"
-            id="org.eclipse.activity8">
-      </activity>
-      <activity
-            name="Activity 9"
-            description="description"
-            id="org.eclipse.activity9">
-      </activity>
-      <activity
-            name="Activity 10"
-            description="description"
-            id="org.eclipse.activity10">
-      </activity>
-      <activity
-            name="Activity 11"
-            description="description"
-            id="org.eclipse.activity11">
-      </activity>
-      <activity
-            name="Activity 12"
-            description="description"
-            id="org.eclipse.activity12">
-      </activity>
-      <activity
-            name="Activity 13"
-            description="description"
-            id="org.eclipse.activity13">
-      </activity>
-      <activity
-            name="Activity 14"
-            description="description"
-            id="org.eclipse.activity14">
-      </activity>
-      <activity
-            name="Activity 15"
-            description="description"
-            id="org.eclipse.activity15">
-      </activity>
-      <activity
-            name="Activity 16"
-            description="description"
-            id="org.eclipse.activity16">
-      </activity>
-      <activity
-            name="Activity 17"
-            description="description"
-            id="org.eclipse.activity17">
-      </activity>
-      <activity
-            name="Activity 18"
-            description="description"
-            id="org.eclipse.activity18">
-      </activity>
-      <activityPatternBinding
-            activityId="org.eclipse.activity1"
-            pattern="org.eclipse.pattern1">
-      </activityPatternBinding>
-      <activityPatternBinding
-            activityId="org.eclipse.activity2"
-            pattern="org.eclipse.pattern1">
-      </activityPatternBinding>
-      <activity
-            id="org.eclipse.ui.tests.filter1.normal"
-            name="Normal Activity Filter1">
-      </activity>
-      <activity
-            id="org.eclipse.ui.tests.filter1.enabled"
-            name="Enabled Activity Filter1">
-         <enabledWhen>
-            <with
-                  variable="activeContexts">
-               <iterate
-                     operator="or">
-                  <equals
-                        value="org.eclipse.ui.command.contexts.enablement_test1">
-                  </equals>
-               </iterate>
-            </with>
-         </enabledWhen>
-      </activity>
-      <activityPatternBinding
-            activityId="org.eclipse.ui.tests.filter1.normal"
-            pattern="org/donotfilter">
-      </activityPatternBinding>
-      <activityPatternBinding
-            activityId="org.eclipse.ui.tests.filter1.enabled"
-            pattern="org/filter">
-      </activityPatternBinding>
-      
-      <!-- Expression variable controlled activity -->
-      <activity
-            id="org.eclipse.ui.tests.filter2.enabled"
-            name="Enabled Activity Filter2">
-         <enabledWhen>
-            <with
-                  variable="arbitraryVariable">
-               <equals
-                     value="arbitraryValue">
-               </equals>
-            </with>
-         </enabledWhen>
-      </activity>
-      <activityPatternBinding
-            activityId="org.eclipse.ui.tests.filter2.enabled"
-            pattern="org/filter2">
-      </activityPatternBinding>
-      
-      <!-- This enabledWhen activity is always enabled.
-      	   The expression result is obviously always true.
-      	   Without the the "no-update" lock with 
-      	   <code>addingEvaluationListener</code> in MutableActivityManager this
-      	   would leed to an endless loop. Because the change in enablement from
-      	   false to true would leed to an update of the activity which adds
-      	   the activity evaluation listener which itself calls indirect an 
-      	   update of the activity: endless loop build finished.
-      	   
-      	   If this were variable dependent, the first result would've been 
-      	   false, so no update would've been called before the evaluation 
-      	   listener could've been fully installed. And in later updates of 
-      	   the activity the evaluation listener would've been already installed,
-      	   so the entrance to the endless loop would not be entered.
-      	   
-      	   (There is no corresponding test code in the UtilTest Unit Test for
-      	   this.)      	   
-       -->
-      <activity
-            id="org.eclipse.ui.tests.filter3.enabled"
-            name="Always Enabled Activity Filter3">
-         <enabledWhen>
-            <instanceof
-                  value="java.lang.Object">
-            </instanceof>
-         </enabledWhen>
-      </activity>  
-      
-      <activityPatternBinding
-            activityId="org.eclipse.activity3"
-            pattern="org.eclipse.pattern1">
-      </activityPatternBinding>
-      <defaultEnablement
-            id="org.eclipse.activity1">
-      </defaultEnablement>
-      <defaultEnablement
-            id="org.eclipse.activity2">
-      </defaultEnablement>
-      <defaultEnablement
-            id="org.eclipse.activity3">
-      </defaultEnablement>
-      <defaultEnablement
-            id="org.eclipse.activity4">
-      </defaultEnablement>
-      <categoryActivityBinding
-            activityId="org.eclipse.activity1"
-            categoryId="org.eclipse.category1">
-      </categoryActivityBinding>
-      <categoryActivityBinding
-            activityId="org.eclipse.activity2"
-            categoryId="org.eclipse.category1">
-      </categoryActivityBinding>
-      <categoryActivityBinding
-            activityId="org.eclipse.activity3"
-            categoryId="org.eclipse.category1">
-      </categoryActivityBinding>
-      <categoryActivityBinding
-            activityId="org.eclipse.activity4"
-            categoryId="org.eclipse.category1">
-      </categoryActivityBinding>
-      <activityRequirementBinding
-            requiredActivityId="org.eclipse.activity2"
-            activityId="org.eclipse.activity1">
-      </activityRequirementBinding>
-      <activityRequirementBinding
-            requiredActivityId="org.eclipse.activity3"
-            activityId="org.eclipse.activity1">
-      </activityRequirementBinding>
-      <activityRequirementBinding
-            requiredActivityId="org.eclipse.activity4"
-            activityId="org.eclipse.activity1">
-      </activityRequirementBinding>
-      <activityRequirementBinding
-            requiredActivityId="org.eclipse.activity5"
-            activityId="org.eclipse.activity1">
-      </activityRequirementBinding>
-      <activityRequirementBinding
-            requiredActivityId="org.eclipse.activity6"
-            activityId="org.eclipse.activity1">
-      </activityRequirementBinding>
-      <activityRequirementBinding
-            requiredActivityId="org.eclipse.activity7"
-            activityId="org.eclipse.activity1">
-      </activityRequirementBinding>
-      <activity
-            description="Activity for testing the problem filters"
-            id="problemFilterTestActivity"
-            name="ProblemFilterTest"/>
-      <activityPatternBinding
-            activityId="problemFilterTestActivity"
-            pattern="org\.eclipse\.ui\.tests/.*problemTest.*"/>
-      <category
-            description="category for the problem filter tests"
-            id="problemCategory"
-            name="Problem Filter Tests"/>
-      <categoryActivityBinding
-            activityId="problemFilterTestActivity"
-            categoryId="problemCategory"/>
-      <defaultEnablement id="problemFilterTestActivity"/>      
-      <activity
-            description="NonRegular Expression"
-            id="org.eclipse.activityNonRegExp"
-            name="Activity NonRegExp">
-      </activity>
-      <activityPatternBinding
-            activityId="org.eclipse.activityNonRegExp"
-            isEqualityPattern="true"
-            pattern="org.eclipse.ui.tests.activity{No{Reg(Exp[^d]">
-      </activityPatternBinding>
-      
-      <!-- Expression should be never true, so it tests if it is an instance
-      		of java.lang.Double -->
-      <activity
-            id="org.eclipse.ui.tests.filter4.enabled"
-            name="Always Disabled Activity Filter4">
-         <enabledWhen>
-            <instanceof
-                  value="java.lang.Double">
-            </instanceof>
-         </enabledWhen>
-      </activity>
-      <activity
-            description="ActivityDependsOnExpressionActivity"
-            id="org.eclipse.ui.tests.filter5.enabled"
-            name="ActivityDependsOnExpressionActivity">
-      </activity>
-      <activityRequirementBinding
-            activityId="org.eclipse.ui.tests.filter5.enabled"
-            requiredActivityId="org.eclipse.ui.tests.filter4.enabled">
-      </activityRequirementBinding>
-      <activity
-            description="ExpressionActivityDependsOnActivity"
-            id="org.eclipse.ui.tests.filter7.enabled"
-            name="ExpressionActivityDependsOnActivity">
-         <enabledWhen>
-            <instanceof
-                  value="java.lang.Object">
-            </instanceof>
-         </enabledWhen>
-      </activity>
-      <activityRequirementBinding
-            activityId="org.eclipse.ui.tests.filter7.enabled"
-            requiredActivityId="org.eclipse.ui.tests.filter6.enabled">
-      </activityRequirementBinding>
-      <activity
-            description="ConventionalActivityControllingExpressionActivity"
-            id="org.eclipse.ui.tests.filter6.enabled"
-            name="ConventionalActivityControllingExpressionActivity">
-      </activity>         
-   </extension>
-
-  <extension
-         point="org.eclipse.ui.themes">
-      <theme
-      		name="Extended Theme 1"
-            id="extendedTheme1">
-         <data
-               name="d1"
-               value="d1">
-         </data>
-         <colorOverride
-               value="COLOR_DARK_GREEN"
-               id="swtcolor">
-         </colorOverride>
-         <fontOverride
-               value="Sans-regular-10"
-               id="valfont">
-         </fontOverride>
-         
-      </theme>
-   </extension>
-   <extension
-         point="org.eclipse.ui.themes">
-      <theme      		
-            id="extendedTheme1">
-         <data
-               name="d1"
-               value="not honoured">
-         </data>            
-            
-         <data
-               name="d2"
-               value="d2">
-         </data>  
-         
-         <colorOverride
-               value="COLOR_RED"
-               id="swtcolor">
-         </colorOverride>
-
-         <colorOverride
-               value="COLOR_RED"
-               id="rgbcolor">
-         </colorOverride>
-         
-         <fontOverride
-               value="not honoured"
-               id="valfont">
-         </fontOverride>
-         
-         <fontOverride
-               value="Sans-regular-10"
-               id="novalfont">
-         </fontOverride>
-         
-         
-                          
-      </theme>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.themes">
-      <theme      		
-            id="extendedTheme1">
-      </theme>
-   </extension>
-   <extension
-         point="org.eclipse.ui.themes">
-      <theme      		
-      		name="Extended Theme 2"
-            id="extendedTheme2">
-      </theme>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.themes">
-      <theme
-      		name="Extended Theme 3"
-            id="extendedTheme3">
-      </theme>
-   </extension>
-   <extension
-         point="org.eclipse.ui.themes">
-      <theme 
-	        name="not honoured"     		
-            id="extendedTheme3">
-      </theme>
-   </extension>  
-   
-   <extension
-         point="org.eclipse.ui.themes">
-      <theme
-            name="test theme 1"
-            id="theme1">
-         <data
-               name="data1"
-               value="override1">
-         </data>
-         <colorOverride
-               value="2,1,1"
-               id="rgbcolor">
-         </colorOverride>
-         <colorOverride
-               value="COLOR_DARK_GREEN"
-               id="swtcolor">
-         </colorOverride>
-         <colorOverride
-               value="9,9,9"
-               id="adefaultedcolor2">
-         </colorOverride>
-         <fontOverride
-               value="Courier-italic-10"
-               id="novalfont">
-         </fontOverride>
-         <fontOverride
-               value="Courier-regular-16"
-               id="defaultedfont2">
-         </fontOverride>
-         <fontOverride
-               value="Sans-regular-5"
-               id="valfont">
-         </fontOverride>
-      </theme>
-      <data
-            name="data1"
-            value="value1">
-      </data>
-      <data
-            name="data2"
-            value="value2">
-      </data>
-      <data
-            name="int1"
-            value="3133">
-      </data>
-      <data
-            name="bool1"
-            value="true">
-      </data>
-      <colorDefinition
-            label="rgbcolor"
-            value="1,1,2"
-            id="rgbcolor">
-      </colorDefinition>
-      <colorDefinition
-            label="not honoured"
-            value="not honoured"
-            id="rgbcolor">            
-      </colorDefinition>
-      <colorDefinition
-            label="swtcolor"
-            value="COLOR_DARK_BLUE"
-            id="swtcolor">
-      </colorDefinition>
-      <colorDefinition
-            label="zdefaultedcolor"
-            defaultsTo="rgbcolor"
-            id="defaultedcolor">
-      </colorDefinition>
-      <colorDefinition
-            label="adefaultedcolor2"
-            defaultsTo="defaultedcolor"
-            id="adefaultedcolor2">
-      </colorDefinition>
-      <colorDefinition
-            label="defaultedcolor3"
-            defaultsTo="adefaultedcolor2"
-            id="defaultedcolor3">
-      </colorDefinition>
-      <colorDefinition
-            label="platformcolor"
-            value="0,0,0"
-            id="platformcolor">
-         <colorValue
-               ws="win32"
-               value="50,50,50"
-               os="win32">
-         </colorValue>
-         <colorValue
-               ws="gtk"
-               value="25,25,25"
-               os="linux">
-         </colorValue>
-         <colorValue
-               value="75,75,75"
-               os="linux">
-         </colorValue>
-      </colorDefinition>
-      <colorDefinition
-            label="factorycolor"
-            colorFactory="org.eclipse.ui.tests.themes.TestColorFactory"
-            id="factorycolor">
-      </colorDefinition>
-      <colorDefinition
-            label="badColor1"
-            value="I am Emo and I prefer black."
-            id="badColor1">
-      </colorDefinition>
-      <colorDefinition
-            label="badColor2"
-            value="0,0, 1"
-            id="badColor2">
-      </colorDefinition>    
-      <colorDefinition
-            label="badColor3"
-            value="0,0, 1x"
-            id="badColor3">
-      </colorDefinition>  
-      <fontDefinition
-            label="novalfont"
-            id="novalfont">
-      </fontDefinition>
-      <fontDefinition
-            label="valfont"
-            value="Tahoma-bold-20"
-            id="valfont">
-      </fontDefinition>
-      <fontDefinition
-            label="not honoured"
-            value="not honoured"
-            id="valfont">
-      </fontDefinition>      
-      <fontDefinition
-            label="platformfont"
-            value="Sans-bold-15"
-            id="platformfont">
-         <fontValue
-               ws="win32"
-               os="win32"
-               value="Courier New-regular-12">
-         </fontValue>
-      </fontDefinition>
-      <fontDefinition
-            label="defaultedfont"
-            defaultsTo="valfont"
-            id="defaultedfont">
-      </fontDefinition>
-      <fontDefinition
-            label="defaultedfont2"
-            defaultsTo="defaultedfont"
-            id="defaultedfont2">
-      </fontDefinition>
-      <fontDefinition
-            label="defaultedfont3"
-            defaultsTo="defaultedfont2"
-            id="defaultedfont3">
-      </fontDefinition>
-      <fontDefinition
-            label="nooverridefont"
-            id="nooverridefont">
-      </fontDefinition>
-      <colorDefinition
-            label="nooverridecolor"
-            value="99,99,99"
-            id="nooverridecolor">
-      </colorDefinition>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.acceleratorScopes">
-         <acceleratorScope
-         	id="org.eclipse.ui.tests.acceleratorScopes.test1"
-         	name="Test Accelerator Scope 1"
-         	description="A test for the deprecated accelerator scope support" />
-         <acceleratorScope
-         	id="org.eclipse.ui.tests.acceleratorScopes.test2"
-         	name="Test Accelerator Scope 2"
-         	description="A test for the deprecated accelerator scope support"
-         	parentScope="org.eclipse.ui.tests.acceleratorScopes.test1" />
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.commands">
-         <scope
-         	id="org.eclipse.ui.tests.commands.scope1"
-         	name="Test Scope 1"
-         	description="A test for the deprecated command scope support" />
-         <scope
-         	id="org.eclipse.ui.tests.commands.scope2"
-         	name="Test Scope 2"
-         	description="A test for the deprecated command scope support"
-         	parent="org.eclipse.ui.tests.commands.scope1" />
-         <command
-            name="Category-Less Command"
-            description="A command with no category"
-            id="org.eclipse.ui.tests.commands.categoryLessCommand">
-      </command>
-   </extension>
-
-   <!--command parameter types -->
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            defaultHandler="org.eclipse.ui.tests.commands.SubtractIntegerHandler"
-            id="org.eclipse.ui.tests.commands.subtractInteger"
-            name="Subtract 2 Integers"
-            returnTypeId="org.eclipse.ui.tests.commands.Integer">
-         <commandParameter
-               id="minuend"
-               name="Minuend"
-               optional="false"
-               typeId="org.eclipse.ui.tests.commands.Integer"/>
-         <commandParameter
-               id="subtrahend"
-               name="Subtrahend"
-               optional="false"
-               typeId="org.eclipse.ui.tests.commands.Integer"/>
-      </command>
-      <commandParameterType
-            converter="org.eclipse.ui.tests.commands.IntegerConverter"
-            id="org.eclipse.ui.tests.commands.Integer"
-            type="java.lang.Integer"/>
-   </extension>
-
-   <!--parameterized command serialization -->
-   <extension
-         point="org.eclipse.ui.commands">
-         <command
-            name="Zero Parameter Command"
-            id="org.eclipse.ui.tests.commands.zeroParameterCommand">
-      </command>
-         <command
-               id="org.eclipse.ui.tests.commands.oneParameterCommand"
-               name="One Parameter Command">
-            <commandParameter
-                  id="param1.1"
-                  name="Parameter1"
-                  optional="true"/>
-         </command>
-         <command
-               id="org.eclipse.ui.tests.commands.twoParameterCommand"
-               name="Two Parameter Command">
-            <commandParameter
-                  id="param2.1"
-                  name="Parameter1"
-                  optional="true"/>
-            <commandParameter
-                  id="param2.2"
-                  name="Parameter2"
-                  optional="true"/>
-         </command>
-         <command
-               id="org.eclipse.ui.tests.commands.threeParameterCommand"
-               name="Three Parameter Command">
-            <commandParameter
-                  id="param3.1"
-                  name="Parameter1"
-                  optional="true"/>
-            <commandParameter
-                  id="param3.2"
-                  name="Parameter2"
-                  optional="true"/>
-            <commandParameter
-                  id="param3.3"
-                  name="Parameter3"
-                  optional="true"/>
-         </command>
-         <command
-               id="org.eclipse.ui.tests.command.with.f=%)(,unny.name"
-               name="Command with funny name">
-            <commandParameter
-                  id="param.with.F({&apos;&gt;&lt;+|.)=,%.name"
-                  name="Param with funny name"
-                  optional="true"/>
-         </command>
-   </extension>
-   
-   <!-- handler state -->
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            description="A test case for a command with state"
-            id="org.eclipse.ui.tests.commandWithState"
-            name="Command Wtih State">
-         <state
-               class="org.eclipse.core.commands.State"
-               id="OBJECT"/>
-         <state
-               class="org.eclipse.ui.handlers.RegistryToggleState:true"
-               id="TRUE"/>
-         <state
-               class="org.eclipse.ui.handlers.RegistryToggleState"
-               id="FALSE"/>
-         <state
-               class="org.eclipse.jface.menus.TextState"
-               id="TEXT"/>
-      </command>
-   </extension>
-   
-   <!-- for bug 125792 -->
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            id="org.eclipse.ui.tests.commands.bug125792"
-            name="Bug 125792 Test"
-            >
-         <commandParameter
-               id="param1"
-               name="Param1"
-               optional="true"
-               />
-         <commandParameter
-               id="param2"
-               name="Param2"
-               optional="true"
-               />
-         <commandParameter
-               id="param3"
-               name="Param3"
-               optional="true"/>
-      </command>
-   </extension>
-   
-   <!-- bug 102666 -->
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            id="org.eclipse.ui.tests.commands.bug102666"
-            name="Bug 102666 Test" />
-   </extension>
-   <extension
-         point="org.eclipse.ui.handlers">
-   	  <handler
-   	        commandId="org.eclipse.ui.tests.commands.bug102666"
-   	        class="org.eclipse.ui.tests.menus.HelloEHandler">
-   	     <activeWhen>
-               <count value="1" />
-         </activeWhen>
-      </handler>      
-   </extension>
-   	  
-   
-   
-	<!--malformed activity definitions -->
-   <extension
-         name="Actvities for PersistanceTest"
-         point="org.eclipse.ui.activities">
-      <activity
-            id="org.eclipse.ui.PT.A1"/>
-      <activity
-            name="org.eclipse.ui.tests.activity3"
-            id="org.eclipse.ui.PT.A2"/>   
-      <activity
-            name="org.eclipse.ui.PT.A3"/>
-                     
-      <category
-            id="org.eclipse.ui.PT.C1"/>
-      <category
-            name="org.eclipse.ui.tests.category2"
-            id="org.eclipse.ui.PT.C2"/>            
-      <category
-            name="org.eclipse.ui.PT.C3"/>
-            
-      <activityPatternBinding
-            activityId="org.eclipse.ui.PT.A2"/>
-            
-      <activityRequirementBinding
-            activityId="org.eclipse.ui.PT.A2"/> 
-            
-      <categoryActivityBinding
-      		categoryId="org.eclipse.ui.PT.C2" />
-      		           
-   </extension>
-  
-   <!-- part of test for bug 75118 -->
-   <extension
-         point="org.eclipse.ui.newWizards">
-      <primaryWizard id="org.eclipse.ui.wizards.new.project"/>
-      <primaryWizard id="org.eclipse.ui.wizards.new.project"/>
-      <primaryWizard id="org.eclipse.ui.wizards.new.project"/>
-      <primaryWizard id="org.eclipse.ui.wizards.new.project"/>
-      <primaryWizard id="org.eclipse.ui.wizards.new.project"/>
-      <primaryWizard id="org.eclipse.ui.wizards.new.project"/>
-      <primaryWizard id="org.eclipse.ui.wizards.new.project"/>
-      <primaryWizard id="org.eclipse.ui.wizards.new.project"/>
-   </extension>
-   
-   <extension
-   		point="org.eclipse.ui.importWizards">
-      <category
-            name="Test Import Category"
-            id="org.eclipse.ui.tests.TestImport">
-      </category>
-      <category
-            name="Test Import Parented Category"
-            parentCategory="org.eclipse.ui.Basic"
-            id="org.eclipse.ui.tests.TestImportParented">
-      </category>    
-      <category
-            name="Test Import Duplicate Category"
-            id="org.eclipse.ui.tests.TestImportDup">
-      </category>
-      <category
-            name="Test Import Duplicate Category"
-            id="org.eclipse.ui.tests.TestImportDup">
-      </category>
-              
-      <wizard
-            name="Test Import Wizard No Category"
-            class="org.eclipse.ui.tests.datatransfer.TestImportWizard"
-            id="org.eclipse.ui.tests.import.NoCategory">
-      </wizard>  
-      <wizard
-            name="Test Import Category Not Valid"
-            class="org.eclipse.ui.tests.datatransfer.TestImportWizard"
-            category="org.eclipse.ui.InvalidCategory"
-            id="org.eclipse.ui.tests.import.InvalidCategory">
-      </wizard>  
-      <wizard
-            name="Test Import Add To New Category"
-            class="org.eclipse.ui.tests.datatransfer.TestImportWizard"
-            category="org.eclipse.ui.tests.TestImport"
-            id="org.eclipse.ui.tests.import.NewCategory">
-      </wizard> 
-      <wizard
-            name="Test Import Add To Parented Category"
-            class="org.eclipse.ui.tests.datatransfer.TestImportWizard"
-            category="org.eclipse.ui.Basic/org.eclipse.ui.tests.TestImportParented"
-            id="org.eclipse.ui.tests.import.NewParentedCategory">
-      </wizard>       
-      <wizard
-            name="Test Import Duplicate Category"
-            class="org.eclipse.ui.tests.datatransfer.TestImportWizard"
-            category="org.eclipse.ui.tests.TestImportDup"
-            id="org.eclipse.ui.tests.import.DuplicateCategory">
-      </wizard> 
-      <wizard
-            name="Test Import Using Export Category"
-            class="org.eclipse.ui.tests.datatransfer.TestImportWizard"
-            category="org.eclipse.ui.tests.TestExport"
-            id="org.eclipse.ui.tests.import.UsingExportCategory">
-      </wizard>       
-                                
-   	</extension>
-
-   <extension
-   		point="org.eclipse.ui.exportWizards">
-      <category
-            name="Test Export Category"
-            id="org.eclipse.ui.tests.TestExport">
-      </category>
-      <category
-            name="Test Export Parented Category"
-            parentCategory="org.eclipse.ui.Basic"
-            id="org.eclipse.ui.tests.TestExportParented">
-      </category>
-      <category
-            name="Test Export Duplicate Category"
-            id="org.eclipse.ui.tests.TestExportDup">
-      </category>
-      <category
-            name="Test Export Duplicate Category"
-            id="org.eclipse.ui.tests.TestExportDup">
-      </category>      
- 
-      <wizard
-            name="Test Export Wizard No Category"
-            class="org.eclipse.ui.tests.datatransfer.TestExportWizard"
-            id="org.eclipse.ui.tests.export.NoCategory">
-      </wizard>      
-      <wizard
-            name="Test Export Category Not Valid"
-            class="org.eclipse.ui.tests.datatransfer.TestExportWizard"
-            category="org.eclipse.ui.InvalidCategory"
-            id="org.eclipse.ui.tests.export.InvalidCategory">
-      </wizard>   
-      <wizard
-            name="Test Export Add To New Category"
-            class="org.eclipse.ui.tests.datatransfer.TestExportWizard"
-            category="org.eclipse.ui.tests.TestExport"
-            id="org.eclipse.ui.tests.export.NewCategory">
-      </wizard> 
-      <wizard
-            name="Test Export Add To Parented Category"
-            class="org.eclipse.ui.tests.datatransfer.TestExportWizard"
-            category="org.eclipse.ui.Basic/org.eclipse.ui.tests.TestExportParented"
-            id="org.eclipse.ui.tests.export.NewParentedCategory">
-      </wizard>  
-      <wizard
-            name="Test Export Duplicate Category"
-            class="org.eclipse.ui.tests.datatransfer.TestExportWizard"
-            category="org.eclipse.ui.tests.TestExportDup"
-            id="org.eclipse.ui.tests.export.DuplicateCategory">
-      </wizard>        
-      <wizard
-            name="Test Export Using Import Category"
-            class="org.eclipse.ui.tests.datatransfer.TestExportWizard"
-            category="org.eclipse.ui.tests.TestImport"
-            id="org.eclipse.ui.tests.export.UsingImportCategory">
-      </wizard>
-      <wizard
-            class="org.eclipse.ui.tests.statushandlers.FaultyExportWizard"
-            id="org.eclipse.ui.tests.statushandlers.FaultyExportWizard"
-            name="FaultyExportWizard">
-      </wizard>  
-                             
-   	</extension>
-   	   
-    <extension
-         point="org.eclipse.ui.encodings">
-      <encoding name="Blorf"/>
-      <encoding name=""/>
-   </extension>
-   
-    <!-- ObjectContributionTests -->
-    
-    <extension
-          point="org.eclipse.core.runtime.adapters">
-       <factory
-             class="org.eclipse.ui.tests.menus.ObjectContributionClasses"
-             adaptableType="org.eclipse.ui.tests.menus.ObjectContributionClasses$IA">
-          <adapter type="org.eclipse.ui.tests.menus.ObjectContributionClasses$ICommon"/>
-       </factory>
-       <factory
-             class="org.eclipse.ui.tests.menus.ObjectContributionClasses"
-             adaptableType="org.eclipse.ui.tests.menus.ObjectContributionClasses$IB">
-          <adapter type="org.eclipse.ui.tests.menus.ObjectContributionClasses$ICommon"/>
-       </factory>
-       <factory
-             class="org.eclipse.ui.tests.menus.ObjectContributionClasses"
-             adaptableType="org.eclipse.ui.tests.menus.ObjectContributionClasses$IModelElement">
-          <adapter type="org.eclipse.core.resources.IResource"/>
-       </factory>
-       <factory
-             class="org.eclipse.ui.tests.menus.ObjectContributionClasses"
-             adaptableType="org.eclipse.ui.tests.menus.ObjectContributionClasses$IModelElement">
-          <adapter type="org.eclipse.core.resources.mapping.ResourceMapping"/>
-       </factory>
-    </extension>
-    
-    <extension
-         point="org.eclipse.ui.popupMenus">
-         <objectContribution
-            objectClass="org.eclipse.ui.tests.menus.ObjectContributionClasses$ICommon"
-            adaptable="true"
-            id="adatableObjectContributions">
-         <action
-               label="ICommon Item 1"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="ICommon.1">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.menus.ObjectContributionClasses$ICommon"
-            id="adatableObjectContributions">
-         <action
-               label="ICommon Item 2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="ICommon.2">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.menus.ObjectContributionClasses$Common"
-            adaptable="true"
-            id="adatableObjectContributions">
-         <action
-               label="Common Item 1"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="Common.1">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.ui.tests.menus.ObjectContributionClasses$Common"
-            id="adatableObjectContributions">
-         <action
-               label="Common Item 2"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="Common.2">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.core.resources.IResource"
-            adaptable="true"
-            id="adatableObjectContributions">
-         <action
-               label="Resource Item"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="IResource.1">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.core.resources.IProject"
-            adaptable="true"
-            id="adatableObjectContributions">
-         <action
-               label="Project Item"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="IProject.1">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.core.resources.IFile"
-            adaptable="true"
-            id="adatableObjectContributions">
-         <action
-               label="File Item"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="IFile.1">
-         </action>
-      </objectContribution>
-      <objectContribution
-            objectClass="org.eclipse.core.resources.mapping.ResourceMapping"
-            adaptable="true"
-            id="adatableObjectContributions">
-         <action
-               label="Resource Mapping Item"
-               class="org.eclipse.ui.tests.api.MockActionDelegate"
-               id="ResourceMapping.1">
-         </action>
-      </objectContribution>
- 	</extension>
- 	
-  	<extension
-         point="org.eclipse.ui.views">
-        <view
-              category="org.eclipse.ui.tests.resourceTests"
-              class="org.eclipse.ui.tests.markers.ResourceMappingTestView"
-              id="org.eclipse.ui.tests.resourceMappingView"
-              name="Resource Mapping Test"/>
-        <category
-              id="org.eclipse.ui.tests.resourceTests"
-              name="Resource Tests"/>                              
-
-	</extension>    
-
-    <!-- Preference Transfer examples -->
-   <extension
-       point="org.eclipse.ui.preferenceTransfer">
-       <transfer
-            icon="anything.gif"
-            name="Export All Transfer Test"
-            id="org.eclipse.ui.tests.all">
-            <mapping scope="instance">
-            </mapping>
-            <mapping scope="configuration">
-            </mapping>
-            <mapping scope="project">
-            </mapping>
-      <description>
-             Export all tranfer, exports all nodes for specified scopes
-      </description>
-    </transfer>
-   </extension>
-      <extension
-         point="org.eclipse.ui.preferenceTransfer">
-       <transfer
-            name="Bare Bones Transfer Test"
-            id="org.eclipse.ui.tests.bones">
-            <mapping scope="instance">
-            </mapping>
-    </transfer>
-   </extension>
-   <extension
-         point="org.eclipse.ui.preferenceTransfer">
-       <transfer
-            icon="binary_co.gif"
-            name="Export many preferences"
-            id="org.eclipse.ui.tests.many">
-            <mapping scope="instance">
-                <entry node="org.eclipse.ui">
-                 <key name="showIntro"/>
-                 <key name="RUN_IN_BACKGROUND"/>
-                 <key name="bogus name"/>
-                </entry>
-                <entry node="org.eclipse.ui.ide"/>
-            </mapping>
-            <mapping scope="configuration">
-            </mapping>
-      <description>
-             Export many combinations of keys and nodes
-      </description>
-    </transfer>
-   </extension>
-   <extension
-         point="org.eclipse.ui.activities">
-      <category
-            id="org.eclipse.ui.tests.util.1"
-            name="Util Category 1"/>
-      <category
-            id="org.eclipse.ui.tests.util.2"
-            name="Util Category 2"/>
-      <category
-            id="org.eclipse.ui.tests.util.3"
-            name="Util Category 3"/>
-      <category
-            id="org.eclipse.ui.tests.util.4"
-            name="Util Category 4"/>
-      <category
-            id="org.eclipse.ui.tests.util.5"
-            name="Util Category 5"/>
-      <activity
-            id="org.eclipse.ui.tests.util.1"
-            name="Util Activity 1"/>
-      <activity
-            id="org.eclipse.ui.tests.util.2"
-            name="Util Activity 2"/>
-      <activity
-            id="org.eclipse.ui.tests.util.4"
-            name="Util Activity 4"/>
-      <activity
-            id="org.eclipse.ui.tests.util.5"
-            name="Util Activity 5"/>
-      <activityRequirementBinding
-            activityId="org.eclipse.ui.tests.util.2"
-            requiredActivityId="org.eclipse.ui.tests.util.1"/>
-      <categoryActivityBinding
-            activityId="org.eclipse.ui.tests.util.1"
-            categoryId="org.eclipse.ui.tests.util.1"/>
-      <categoryActivityBinding
-            activityId="org.eclipse.ui.tests.util.2"
-            categoryId="org.eclipse.ui.tests.util.2"/>
-      <categoryActivityBinding
-            activityId="org.eclipse.ui.tests.util.1"
-            categoryId="org.eclipse.ui.tests.util.3"/>
-      <categoryActivityBinding
-            activityId="org.eclipse.ui.tests.util.4"
-            categoryId="org.eclipse.ui.tests.util.4"/>
-      <categoryActivityBinding
-            activityId="org.eclipse.ui.tests.util.4"
-            categoryId="org.eclipse.ui.tests.util.5"/>
-      <categoryActivityBinding
-            activityId="org.eclipse.ui.tests.util.5"
-            categoryId="org.eclipse.ui.tests.util.5"/>
-      <activity
-            description="Use for testing the new menu support"
-            id="menuTest1"
-            name="MenuTest 1">
-      </activity>
-      <activityPatternBinding
-            activityId="menuTest1"
-            pattern="org\.eclipse\.ui\.tests/foo">
-      </activityPatternBinding>
-      <activity
-            description="Use for testing the new menu support"
-            id="menuTest2"
-            name="MenuTest 2">
-      </activity>
-      <activityPatternBinding
-            activityId="menuTest2"
-            pattern="org\.eclipse\.ui\.tests/bar">
-      </activityPatternBinding>
-   </extension>
-   <extension
-         point="org.eclipse.ui.activitySupport">
-      <activityImageBinding
-            icon="icons/anything.gif"
-            id="org.eclipse.activity1"/>
-      <categoryImageBinding
-            icon="icons/anything.gif"
-            id="org.eclipse.category1"/>   
-   </extension>
-   <extension
-         id="org.eclipse.ui.tests.multieditor.ASPA"
-         name="ASPA"
-         point="org.eclipse.ui.actionSetPartAssociations">
-      <actionSetPartAssociation targetID="org.eclipse.ui.tests.multieditor.actionSet">
-         <part id="org.eclipse.ui.tests.multieditor.TestEditor"/>
-      </actionSetPartAssociation>
-   </extension>
-
-
-   <extension
-         point="org.eclipse.ui.ide.markerSupport">
-      <problemFilter
-            enabled="false"
-            id="problemTest.onAnyError"
-            name="On Any Error"
-            scope="ON_ANY"
-            severity="ERROR"/>
-      <problemFilter
-            enabled="false"
-            id="problemTest.onSelectedWarning"
-            name="On Selected Warning"
-            scope="ON_SELECTED_ONLY"
-            severity="WARNING"/>
-      <problemFilter
-            enabled="false"
-            id="problemTest.infoAndChildren"
-            name="On Selected Info And Children"
-            scope="ON_SELECTED_AND_CHILDREN"
-            severity="INFO"/>
-      <problemFilter
-            enabled="false"
-            id="problemTest.sameContainerNoSeverity"
-            name="Same Container No Severity"
-            scope="ON_ANY_IN_SAME_CONTAINER"/>
-      <problemFilter
-            enabled="false"
-            id="problemTest.onMethod"
-            name="On Method"
-            onDescription="method"/>
-      <problemFilter
-            enabled="false"
-            id="problemTest.notOnMethod"
-            name="Not On Method"
-            onDescription="!method"/>
-      <problemFilter
-            enabled="false"
-            id="problemTest.onProblem"
-            name="On MarkerType">
-         <selectedType markerId="org.eclipse.ui.tests.categoryTestMarker"/>
-      </problemFilter>
-     
-       <markerTypeCategory name="Test Markers">
-         <markerTypeReference id="org.eclipse.ui.tests.categoryTestMarker"/>
-         <markerTypeReference id="org.eclipse.ui.tests.testmarker"/>
-         <markerTypeReference id="org.eclipse.ui.tests.testmarker2"/>
-      </markerTypeCategory>
-       <markerGrouping
-             id="org.eclipse.ui.tests.test"
-             label="Unbound Test Grouping">
-       </markerGrouping>
-       <markerGroupingEntry
-             id="org.eclipse.ui.tests.test1"
-             label="First category"
-             markerGrouping="org.eclipse.ui.tests.test"
-             priority="2"/>
-       <markerGroupingEntry
-             id="org.eclipse.ui.tests.test2"
-             label="Second category"
-             markerGrouping="org.eclipse.ui.tests.test"
-             priority="1"/>
-        <markerGroupingEntry
-             id="org.eclipse.ui.tests.default"
-             label="Uncategorized"
-             markerGrouping="org.eclipse.ui.tests.test"
-             priority="0"/>
-       <markerAttributeGrouping
-             attribute="testAttribute"
-             defaultGroupingEntry="org.eclipse.ui.tests.default"
-             markerType="org.eclipse.ui.tests.categoryTestMarker">
-          <markerAttributeMapping
-                markerGroupingEntry="org.eclipse.ui.tests.test1"
-                value="0"/>
-          <markerAttributeMapping
-                markerGroupingEntry="org.eclipse.ui.tests.test2"
-                value="1"/>
-       </markerAttributeGrouping>
-       <markerContentGeneratorExtension
-             generatorId="org.eclipse.ui.ide.tasksGenerator"
-             id="org.eclipse.ui.tests.tasksExtension">
-          <markerGrouping
-                id="org.eclipse.ui.tests.taskGrouping"
-                label="Task Grouping">
-          </markerGrouping>
-          <markerFieldConfiguration
-                enabled="false"
-                id="org.eclipse.ui.tests.fixmeTest"
-                name="FIX MEs"
-                scope="ON_SELECTED_AND_CHILDREN"
-                values="org.eclipse.ui.tests.markers.FIXMEParameters">
-          </markerFieldConfiguration>
-       </markerContentGeneratorExtension>
-   </extension>
-   <extension
-         id="categoryTestMarker"
-         name="Category Test Marker"
-         point="org.eclipse.core.resources.markers">
-      <super type="org.eclipse.core.resources.problemmarker"/>
-      <attribute name="category"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.ide.markerResolution">
-      <markerResolutionGenerator
-            class="org.eclipse.ui.tests.markers.TestResolutionGenerator"
-            markerType="org.eclipse.ui.tests.categoryTestMarker"/>
-   </extension>
-
-   <!-- Tests for the new help context identifier work. -->
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            id="org.eclipse.ui.tests.helpContextId"
-            name="Help Context Id Test"
-            helpContextId="org.eclipse.ui.tests.commandHelp" />
-   </extension>
-   <extension
-         point="org.eclipse.ui.handlers">
-      <handler
-            commandId="org.eclipse.ui.tests.helpContextId"
-            class="org.eclipse.ui.tests.menus.HelloEHandler"
-            helpContextId="org.eclipse.ui.tests.handlerHelp" />
-   </extension>
-   <extension
-         point="org.eclipse.ui.propertyPages">
-      <page
-            category="Test Category"
-            class="org.eclipse.ui.tests.propertyPages.TestPropertyPage"
-            id="org.eclipse.ui.tests.and"
-            name="And (Only on File)">
-         <enabledWhen>
-            <and>
-               <adapt type="org.eclipse.core.resources.IResource"/>
-               <adapt type="org.eclipse.core.resources.IFile"/>
-            </and>
-         </enabledWhen>
-      </page>
-      <page
-            category="Test Category"
-            class="org.eclipse.ui.tests.propertyPages.TestPropertyPage"
-            id="org.eclipse.ui.tests.or"
-            name="Or (Files and Folders)">
-         <enabledWhen>
-            <or>
-               <instanceof value="org.eclipse.core.resources.IFile"/>
-               <instanceof value="org.eclipse.core.resources.IFolder"/>
-            </or>
-         </enabledWhen>
-      </page>
-      <page
-            class="org.eclipse.ui.tests.propertyPages.TestPropertyPage"
-            id="org.eclipse.ui.tests.instanceof"
-            name="Instance Of (Projects)">
-         <enabledWhen>
-            <instanceof value="org.eclipse.core.resources.IProject"/>
-         </enabledWhen>
-      </page>
-      <page
-            class="org.eclipse.ui.tests.propertyPages.TableResizePropertyPage"
-            id="org.eclipse.ui.tests.tableResizePage"
-            name="Table Resize Test">
-         <enabledWhen>
-            <adapt
-                  type="org.eclipse.core.resources.IResource">
-            </adapt>
-         </enabledWhen>
-      </page>
-      <page
-            class="org.eclipse.ui.tests.propertyPages.TreeResizePropertyPage"
-            id="org.eclipse.ui.tests.treeResizePage"
-            name="Tree Resize Test">
-         <enabledWhen>
-            <adapt
-                  type="org.eclipse.core.resources.IResource">
-            </adapt>
-         </enabledWhen>
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.eclipse.ui.tests.preferences.TestPreferenceInitializer">
-      </initializer>
-   </extension>
-  
-   <extension
-         id="menusX1"
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            locationURI="popup:org.eclipse.ui.tests.api.MenuTestHarness?before=MenuTest.Advanced">
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               icon="icons/anything.gif"
-               id="MenuTest.popup.BasicCmdItem"
-               label="Inserted Before"
-               mnemonic="B">
-         </command>
-      </menuContribution>
-      <menuContribution
-            locationURI="popup:org.eclipse.ui.tests.api.MenuTestHarness?after=MenuTest.Advanced">
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               icon="icons/anything.gif"
-               id="MenuTest.popup.BasicCmdItem"
-               label="Inserted After"
-               mnemonic="A">
-         </command>
-      </menuContribution>
-      <menuContribution
-            locationURI="popup:org.eclipse.ui.tests.api.MenuTestHarness">
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               icon="icons/anything.gif"
-               id="MenuTest.popup.BasicCmdItem"
-               label="Basic Cmd"
-               mnemonic="B">
-         </command>
-         <menu
-               icon="icons/binary_co.gif"
-               id="MenuTest.popup.BasicMenuItem"
-               label="Basic Menu">
-            <command
-                  commandId="org.eclipse.ui.tests.menus.enabledWorld"
-                  label="Sub Item">
-            </command>
-         </menu>
-         <separator
-               name="MenuTest.Advanced"
-               visible="true">
-         </separator>
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               label="Parameter Cmd"
-               mnemonic="C">
-            <parameter
-                  name="Greeting"
-                  value="Hi There!">
-            </parameter>
-         </command>
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               icon="icons/binary_co.gif"
-               label="Foo Cmd"
-               mnemonic="F">
-            <visibleWhen
-                  checkEnabled="false">
-            </visibleWhen>
-         </command>
-         <menu
-               icon="icons/dynamic.gif"
-               id="MenuTest.popup.dynamicMenu"
-               label="Dynamic Menu">
-            <dynamic
-               class="org.eclipse.ui.tests.api.workbenchpart.DynamicItem"
-               id="MenuText.popup.DynamicItem">
-            </dynamic>
-         </menu>
-      </menuContribution>
-
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.tests.api.MenuTestHarness">
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               icon="icons/anything.gif"
-               id="MenuTest.popup.BasicCmdItem"
-               label="Basic Cmd"
-               mnemonic="B">
-         </command>
-         <menu
-               icon="icons/binary_co.gif"
-               id="MenuTest.popup.BasicMenuItem"
-               label="Basic Menu">
-            <command
-                  commandId="org.eclipse.ui.tests.menus.enabledWorld"
-                  label="Sub Item">
-            </command>
-         </menu>
-         <separator
-               name="MenuTest.Advanced"
-               visible="true">
-         </separator>
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               label="Parameter Cmd"
-               mnemonic="C">
-            <parameter
-                  name="Greeting"
-                  value="Hi There!">
-            </parameter>
-         </command>
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               icon="icons/binary_co.gif"
-               label="Foo Cmd"
-               mnemonic="F">
-            <visibleWhen
-                  checkEnabled="false">
-            </visibleWhen>
-         </command>
-         <dynamic
-            class="org.eclipse.ui.tests.api.workbenchpart.DynamicItem"
-            id="MenuText.popup.DynamicItem">
-         </dynamic>
-         <menu
-               icon="icons/dynamic.gif"
-               id="MenuTest.popup.dynamicMenu"
-               label="Dynamic Menu">
-            <dynamic
-               class="org.eclipse.ui.tests.api.workbenchpart.DynamicItem"
-               id="MenuText.popup.DynamicItem">
-            </dynamic>
-         </menu>
-      </menuContribution>
-      
-      <menuContribution
-            locationURI="menu:MenuTest.toolbar.DropItem">
-            <command
-                  commandId="org.eclipse.ui.tests.menus.enabledWorld"
-                  label="Dropdown Item">
-            </command>
-      </menuContribution>
-      
-      <menuContribution
-            locationURI="toolbar:org.eclipse.ui.tests.api.MenuTestHarness">
-         <command
-               commandId="org.eclipse.ui.tests.menus.toggleContext"
-               icon="icons/binary_co.gif"
-               id="toggle.test.t2"
-               label="Toggle Test2"
-               mnemonic="g"
-               style="toggle"
-               tooltip="Toggle contexts.test2">
-            <parameter
-                  name="toggleContext.contextId"
-                  value="org.eclipse.ui.menus.contexts.test2">
-            </parameter>
-         </command>
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWhenWorld"
-               icon="icons/anything.gif"
-               id="MenuTest.popup.BasicCmdItem"
-               label="Basic Cmd"
-               mnemonic="B">
-         </command>
-         <control
-               class="org.eclipse.ui.tests.api.workbenchpart.TextWidget"
-               id="MenuTest.popup.BasicWidgetItem">
-         </control>
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               icon="icons/anything.gif"
-               id="MenuTest.toolbar.DropItem"
-               label="Toolbar Dropdown"
-               style="pulldown"
-               mnemonic="D">
-         </command>
-         <separator
-               name="MenuTest.Advanced"
-               visible="true">
-         </separator>
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               label="Parameter Cmd"
-               mnemonic="C">
-            <parameter
-                  name="Greeting"
-                  value="Hi There!">
-            </parameter>
-         </command>
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               icon="icons/binary_co.gif"
-               label="Foo Cmd"
-               mnemonic="F">
-            <visibleWhen
-                  checkEnabled="false">
-            </visibleWhen>
-         </command>
-         <dynamic
-            class="org.eclipse.ui.tests.api.workbenchpart.DynamicItem"
-            id="MenuText.toolbar.DynamicItem">
-         </dynamic>
-         <menu
-               icon="icons/dynamic.gif"
-               id="MenuTest.popup.dynamicMenu"
-               label="Dynamic Menu">
-            <dynamic
-               class="org.eclipse.ui.tests.api.workbenchpart.DynamicItem"
-               id="MenuText.popup.DynamicItem">
-            </dynamic>
-         </menu>
-      </menuContribution>
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.tests.api.MenuTestHarness">
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               id="org.eclipse.ui.tests.menus.itemX1"
-               label="Menu Item X1">
-            <visibleWhen
-                  checkEnabled="false">
-               <with
-                     variable="activeContexts">
-                  <iterate
-                        operator="or">
-                     <equals
-                           value="org.eclipse.ui.menus.contexts.test1">
-                     </equals>
-                  </iterate>
-               </with>
-            </visibleWhen>
-         </command>
-      </menuContribution>
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.main.menu?after=additions">
-         <menu
-               id="org.eclipse.ui.tests.mainMenu.MenuX2"
-               label="Menu X2">
-            <command
-                  commandId="org.eclipse.ui.tests.menus.enabledWorld"
-                  id="org.eclipse.ui.tests.menus.itemX3"
-                  label="Menu Item X3">
-            </command>
-            <command
-                  commandId="org.eclipse.ui.tests.menus.enabledWorld"
-                  id="org.eclipse.ui.tests.menus.itemX4"
-                  label="Menu Item X4">
-            <visibleWhen
-                  checkEnabled="false">
-               <with
-                     variable="activeContexts">
-                  <iterate
-                        operator="or">
-                     <equals
-                           value="org.eclipse.ui.menus.contexts.test1">
-                     </equals>
-                  </iterate>
-               </with>
-            </visibleWhen>
-            </command>
-            <command
-                  commandId="org.eclipse.ui.tests.menus.enabledWorld"
-                  id="org.eclipse.ui.tests.menus.itemX5"
-                  label="Menu Item X5">
-            </command>
-            <command
-                  commandId="org.eclipse.ui.tests.menus.enabledWhenExpression"
-                  id="org.eclipse.ui.tests.menus.itemX6"
-                  label="Menu Expression">
-            </command>
-         </menu>
-      </menuContribution>
-      <menuContribution
-            locationURI="popup:org.eclipse.ui.tests.leak.contextEditor?after=additions">
-            <command
-                  commandId="org.eclipse.ui.tests.menus.enabledWorld"
-                  id="org.eclipse.ui.tests.menus.itemX4"
-                  label="Menu Item X4">
-            <visibleWhen
-                  checkEnabled="false">
-               <with
-                     variable="selection">
-               	   <count
-                         value="1">
-               	   </count>
-               </with>
-            </visibleWhen>
-            </command>
-      </menuContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.contexts">
-      <context
-            id="org.eclipse.ui.menus.contexts.test1"
-            name="Text Context X1"
-            parentId="org.eclipse.ui.contexts.window">
-      </context>
-      <context
-            id="org.eclipse.ui.menus.contexts.test2"
-            name="Text Context X2"
-            parentId="org.eclipse.ui.contexts.window">
-      </context>
-      <context
-            id="org.eclipse.ui.command.contexts.enablement_test1"
-            name="Handler Enablement 1"
-            parentId="org.eclipse.ui.contexts.window">
-      </context>
-      <context
-            id="org.eclipse.ui.command.contexts.enablement_test2"
-            name="Handler Enablement 2"
-            parentId="org.eclipse.ui.contexts.window">
-      </context>
-      <context
-            id="org.eclipse.ui.command.contexts.evaluationService1"
-            name="evaluation service 1"
-            parentId="org.eclipse.ui.contexts.window">
-      </context>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            defaultHandler="org.eclipse.ui.tests.menus.HelloEHandler"
-            id="org.eclipse.ui.tests.menus.enabledWorld"
-            name="Hello">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.tests.menus.enabledWhenWorld"
-            name="Howdy">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.tests.menus.enabledWhenExpression"
-            name="Howdy Expression">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            defaultHandler="org.eclipse.ui.tests.menus.HelloDHandler"
-            id="org.eclipse.ui.tests.menus.disabledWorld"
-            name="Hello">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            defaultHandler="org.eclipse.ui.tests.menus.HelloUpdateHandler"
-            id="org.eclipse.ui.tests.menus.updateWorld"
-            name="Hello">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            defaultHandler="org.eclipse.ui.tests.menus.ToggleContextHandler"
-            id="org.eclipse.ui.tests.menus.toggleContext"
-            name="Toggle Context">
-         <commandParameter
-               id="toggleContext.contextId"
-               name="Context Id"
-               optional="false"
-               values="org.eclipse.ui.tests.menus.ContextIdValues">
-         </commandParameter>
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.tests.menus.iconsDefault"
-            name="Icons Default">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.tests.menus.iconsAll"
-            name="Icons All">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            id="org.eclipse.ui.tests.menus.iconsToolbarOnly"
-            name="Icons Toolbar Only">
-      </command>
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            class="org.eclipse.ui.tests.markers.MarkersTestMarkersView"
-            id="org.eclipse.ui.tests.markerTests"
-            name="Marker Tests View">
-      </view>
-      <view
-            class="org.eclipse.ui.tests.api.workbenchpart.LifecycleView"
-            id="org.eclipse.ui.tests.LifecycleView"
-            name="Lifecycle View">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.ui.statusHandlers">
-      <statusHandler
-            class="org.eclipse.ui.tests.statushandlers.TestStatusHandler"
-            id="org.eclipse.ui.tests.statushandlers.TestStatusHandler">
-      </statusHandler>
-      <statusHandlerProductBinding
-            handlerId="org.eclipse.ui.tests.statushandlers.TestStatusHandler"
-            productId="org.eclipse.sdk.ide">
-      </statusHandlerProductBinding>
-      <statusHandler
-            class="org.eclipse.ui.tests.statushandlers.FreeStatusHandler"
-            id="org.eclipse.ui.tests.statushandlers.FreeStatusHandler">
-      </statusHandler>
-   </extension>
-<!-- Sample invalid extension ! (illegal child) --> 
-   <extension
-         point="org.eclipse.ui.tests.sample">
-      	<invalid
-                  name="InvalidElement">
-        </invalid>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            id="tests.commands.CCT.cmd1"
-            name="cmd1">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.category.window"
-            id="tests.commands.CCT.cmd2"
-            name="cmd2">
-         <commandParameter
-               id="protocol"
-               name="Protocol"
-               optional="false">
-         </commandParameter>
-         <commandParameter
-               id="host"
-               name="Server"
-               optional="false">
-         </commandParameter>
-      </command>
-   </extension>
-   <extension
-         point="org.eclipse.ui.handlers">
-      <handler
-            class="org.eclipse.ui.tests.menus.ChangeEnablementHandler"
-            commandId="org.eclipse.ui.tests.menus.enabledWhenWorld">
-            <!--
-         <enabledWhen>
-            <with
-                  variable="activeContexts">
-               <iterate
-                     operator="or">
-                  <equals
-                        value="org.eclipse.ui.menus.contexts.test2">
-                  </equals>
-               </iterate>
-            </with>
-         </enabledWhen>
-         -->
-      </handler>
-      <handler
-            class="org.eclipse.ui.tests.menus.HelloEHandler"
-            commandId="org.eclipse.ui.tests.menus.enabledWhenExpression">
-         <enabledWhen>
-            <with
-                  variable="activeContexts">
-               <iterate
-                     operator="or">
-                  <equals
-                        value="org.eclipse.ui.menus.contexts.test2">
-                  </equals>
-               </iterate>
-            </with>
-         </enabledWhen>
-      </handler>
-   </extension>
-
-
-   <!-- org.eclipse.ui.menus extension point test input
-        do -NOT- change the structure of the contributions
-        without fixing the tests in 'MenusTestSuite' -->
-   <extension
-         id="org.eclipse.ui.menus.test"
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.tests.IfYouChangeMe.FixTheTests?before=MenuTest.Separator">
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               icon="icons/anything.gif"
-               id="MenuTest.BeforeSeparator"
-               label="Inserted Before"
-               mnemonic="B">
-         </command>
-      </menuContribution>
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.tests.IfYouChangeMe.FixTheTests?after=MenuTest.Separator">
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               icon="icons/anything.gif"
-               id="MenuTest.AfterSeparator"
-               label="Inserted After"
-               mnemonic="A">
-         </command>
-      </menuContribution>
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.tests.IfYouChangeMe.FixTheTests">
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               icon="icons/anything.gif"
-               id="MenuTest.BasicCmdItem"
-               label="Basic Cmd"
-               mnemonic="B">
-         </command>
-         <control
-               class="non.existant.NonExistantClass"
-               id="MenuTest.brokenWidget">
-         </control>
-         <menu
-               icon="icons/binary_co.gif"
-               id="MenuTest.BasicMenu"
-               label="Basic Menu">
-            <command
-                  commandId="org.eclipse.ui.tests.menus.enabledWorld"
-                  id="MenuTest.BasicMenu.SubItem"
-                  label="Sub Item">
-            </command>
-         </menu>
-         <separator
-               name="MenuTest.Separator"
-               visible="true">
-         </separator>
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               id="MenuTest.ParameterItem"
-               label="Parameter Cmd"
-               mnemonic="C">
-            <parameter
-                  name="Greeting"
-                  value="Hi There!">
-            </parameter>
-         </command>
-         <dynamic
-            class="org.eclipse.ui.tests.api.workbenchpart.DynamicItem"
-            id="MenuTest.DynamicItem">
-         </dynamic>
-         <menu
-               icon="icons/dynamic.gif"
-               id="MenuTest.DynamicMenu"
-               label="Dynamic Menu">
-            <dynamic
-               class="org.eclipse.ui.tests.api.workbenchpart.DynamicItem"
-               id="MenuTest.DynamicSubItem">
-            </dynamic>
-         </menu>
-      </menuContribution>
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.tests.IfYouChangeMe.FixTheTests">
-         <command
-               commandId="org.eclipse.ui.tests.menus.enabledWorld"
-               id="MenuTest.ItemX1"
-               label="Menu Item X1">
-            <visibleWhen
-                  checkEnabled="false">
-               <with
-                     variable="activeContexts">
-                  <iterate
-                        operator="or">
-                     <equals
-                           value="org.eclipse.ui.menus.contexts.test1">
-                     </equals>
-                  </iterate>
-               </with>
-            </visibleWhen>
-         </command>
-      </menuContribution>
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.tests.IfYouChangeMe.FixTheTests">
-         <command
-               commandId="org.eclipse.ui.tests.menus.iconsDefault"
-               id="org.eclipse.ui.tests.menus.iconsDefault"
-               style="push">
-         </command>
-         <command
-               commandId="org.eclipse.ui.tests.menus.iconsAll"
-               id="org.eclipse.ui.tests.menus.iconsAll"
-               style="push">
-         </command>
-         <command
-               commandId="org.eclipse.ui.tests.menus.iconsToolbarOnly"
-               id="org.eclipse.ui.tests.menus.iconsToolbarOnly"
-               style="push">
-         </command>
-      </menuContribution>
-      <menuContribution
-            class="org.eclipse.ui.tests.menus.DeclaredProgrammaticFactory"
-            locationURI="menu:org.eclipse.ui.tests.IfYouChangeMe.FixTheTests?after=org.eclipse.ui.tests.menus.iconsToolbarOnly">
-      
-      </menuContribution>
-      <menuContribution
-            locationURI="toolbar:org.eclipse.ui.tests.IfYouChangeMe.FixTheTests">
-         <command
-               commandId="org.eclipse.ui.tests.menus.iconsDefault"
-               id="org.eclipse.ui.tests.menus.iconsDefault"
-               style="push">
-         </command>
-         <command
-               commandId="org.eclipse.ui.tests.menus.iconsAll"
-               id="org.eclipse.ui.tests.menus.iconsAll"
-               style="push">
-         </command>
-         <command
-               commandId="org.eclipse.ui.tests.menus.iconsToolbarOnly"
-               id="org.eclipse.ui.tests.menus.iconsToolbarOnly"
-               style="push">
-         </command>
-      </menuContribution>
-   </extension>
-   <!-- END OF org.eclipse.ui.menus extension point test contributions -->
-   
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            categoryId="org.eclipse.ui.tests.category.menuHarness"
-            id="org.eclipse.ui.tests.incMenuHarness"
-            name="Increment Menu Harness">
-      </command>
-      <category
-            id="org.eclipse.ui.tests.category.menuHarness"
-            name="Menu Harness Commands">
-      </category>
-      <command
-            categoryId="org.eclipse.ui.tests.category.menuHarness"
-            id="org.eclipse.ui.tests.commandEnabledVisibility"
-            name="Command Enabled Visibility">
-      </command>
-   </extension>
-   <extension
-         point="org.eclipse.ui.viewActions">
-      <viewContribution 
-            id="org.eclipse.ui.tests.viewContribution.harness"
-            targetID="org.eclipse.ui.tests.api.MenuTestHarness">
-         <action
-               class="org.eclipse.ui.tests.commands.ViewActionDelegate"
-               definitionId="org.eclipse.ui.tests.incMenuHarness"
-               id="org.eclipse.ui.tests.menuHarness.inc"
-               label="MenuInc"
-               menubarPath="additions">
-         </action>
-      </viewContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commandImages">
-      <image
-            commandId="org.eclipse.ui.tests.menus.iconsDefault"
-            icon="icons/anything.gif">
-      </image>
-      <image
-            commandId="org.eclipse.ui.tests.menus.iconsAll"
-            icon="icons/binary_co.gif">
-      </image>
-      <image
-            commandId="org.eclipse.ui.tests.menus.iconsAll"
-            icon="icons/mockeditorpart1.gif"
-            style="toolbar">
-      </image>
-      <image
-            commandId="org.eclipse.ui.tests.menus.iconsToolbarOnly"
-            icon="icons/view.gif"
-            style="toolbar">
-      </image>
-   </extension>
-   <extension
-         point="org.eclipse.ui.services">
-      <serviceFactory
-            factoryClass="org.eclipse.ui.tests.services.LevelServiceFactory">
-         <service
-               serviceClass="org.eclipse.ui.tests.services.ILevelService">
-         </service>
-      </serviceFactory>
-      <sourceProvider
-            provider="org.eclipse.ui.tests.services.ActiveUserSourceProvider">
-         <variable
-               name="username"
-               priorityLevel="activeContexts">
-         </variable>
-      </sourceProvider>
-   </extension>   
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            id="org.eclipse.ui.tests.activity{No{Reg(Exp[^d]"
-            name="NoRegularExpressions Command">
-      </command>
-      <command
-            categoryId="org.eclipse.ui.tests.category.menuHarness"
-            id="org.eclipse.ui.tests.enabledCount"
-            name="Enabled Count">
-      </command>
-   </extension>
-   <extension
-         point="org.eclipse.ui.handlers">
-      <handler
-            class="org.eclipse.ui.tests.menus.HelloEHandler"
-            commandId="org.eclipse.ui.tests.enabledCount">
-         <enabledWhen>
-            <count
-                  value="2">
-            </count>
-         </enabledWhen>
-      </handler>
-   </extension>   
-   <extension
-         point="org.eclipse.ui.elementFactories">
-      <factory
-            class="org.eclipse.ui.tests.api.BadElementFactory"
-            id="org.eclipse.ui.tests.badFactory">
-      </factory>
-   </extension>
-   <extension
-         point="org.eclipse.core.expressions.definitions">
-      <definition
-            id="org.eclipse.ui.tests.defWithPropertyTester">
-         <test
-               args="isEnabled"
-               property="org.eclipse.ui.tests.class.method">
-         </test>
-      </definition>
-   </extension>
-   <extension
-         point="org.eclipse.core.expressions.propertyTesters">
-      <propertyTester
-            class="org.eclipse.ui.tests.services.StaticVarPropertyTester"
-            id="org.eclipse.ui.tests.reflectionTester"
-            namespace="org.eclipse.ui.tests.class"
-            properties="method"
-            type="java.lang.Object">
-      </propertyTester>
-   </extension>
-   
-   <!-- bindings for the platform tests -->
-   <extension
-         point="org.eclipse.ui.bindings">
-      <key
-            commandId="org.eclipse.ui.help.aboutAction"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M1+8 A">
-      </key>
-      <key
-            contextId="org.eclipse.ui.contexts.window"
-            platform="carbon"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M1+8 A">
-      </key>
-      <key
-            commandId="org.eclipse.ui.help.aboutAction"
-            contextId="org.eclipse.ui.contexts.window"
-            platform="carbon"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M1+8 B">
-      </key>
-   </extension>
-   <extension
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            locationURI="toolbar:org.eclipse.ui.tests.tooltipTest">
-         <command
-               commandId="org.eclipse.ui.tests.testToolTipCommand"
-               label="Testing Tooltip"
-               style="push">
-         </command>
-      </menuContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            categoryId="org.eclipse.ui.category.file"
-            id="org.eclipse.ui.tests.testToolTipCommand"
-            name="My Test Tooltip Command">
-      </command>
-   </extension>
-   <extension
-         point="org.eclipse.ui.bindings">
-      <key
-            commandId="org.eclipse.ui.tests.testToolTipCommand"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M2+M3+1">
-      </key>
-   </extension>   
-      <extension
-         id="menu.dynamic.contribution"
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            locationURI="popup:org.eclipse.ui.tests.dynamicMenuContribution">
-         <dynamic
-               class="org.eclipse.ui.tests.menus.DynamicContributionItemPopup"
-               id="popup:org.eclipse.ui.tests.dynamicMenuContribution">
-         </dynamic>
-      </menuContribution>
-   </extension>   
-</plugin>            
diff --git a/tests/org.eclipse.ui.tests/schema/sample.exsd b/tests/org.eclipse.ui.tests/schema/sample.exsd
deleted file mode 100644
index de3f77c..0000000
--- a/tests/org.eclipse.ui.tests/schema/sample.exsd
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.ui.tests">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.ui.tests" id="org.eclipse.ui.tests.sampleext" name="sample"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="requiredElement"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="requiredElement">
-      <complexType>
-         <attribute name="requiredAttr" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/tests/org.eclipse.ui.tests/test.xml b/tests/org.eclipse.ui.tests/test.xml
deleted file mode 100644
index f57cc2e..0000000
--- a/tests/org.eclipse.ui.tests/test.xml
+++ /dev/null
@@ -1,99 +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.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">
-    <!-- Commented out until source of problem found (not reusing same workspace dir)
-    <property name="session-folder" 
-              value="${eclipse-home}/ui_session_sniff_folder"/>
-    <delete dir="${session-folder}" quiet="true"/>
-    <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${session-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname" 
-                value="org.eclipse.ui.tests.api.SessionCreateTest"/>
-  
-    </ant>
-    
-    <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${session-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname"
-                value="org.eclipse.ui.tests.api.SessionRestoreTest"/>
-    </ant>
-    -->
-
-    <property name="sniff-folder"
-              value="${eclipse-home}/ui_sniff_folder"/>
-    <delete dir="${sniff-folder}" quiet="true"/>
-    <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${sniff-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname"
-                value="org.eclipse.ui.tests.UiTestSuite"/>
-
-    </ant>
-    
-    <property name="jface-sniff-folder"
-              value="${eclipse-home}/jface_sniff_folder"/>
-    <delete dir="${jface-sniff-folder}" quiet="true"/>
-    <ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${jface-sniff-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname"
-                value="org.eclipse.jface.tests.AllTests"/>
-    </ant>
-    
-    <ant target="core-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="parts_data_folder"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname"
-                value="org.eclipse.ui.parts.tests.PartsReferencesTestSuite"/>
-    </ant>
-    
-    <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="session_data_folder"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname"
-                value="org.eclipse.ui.tests.session.SessionTests"/>
-    </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/tests/org.eclipse.ui.tests/uiSniff b/tests/org.eclipse.ui.tests/uiSniff
deleted file mode 100644
index a1a24d9..0000000
--- a/tests/org.eclipse.ui.tests/uiSniff
+++ /dev/null
@@ -1,10 +0,0 @@
-echo Running ui.TestSuite
-rm -rf 'ui_sniff_folder'
-./jre/bin/java -cp startup.jar org.eclipse.core.launcher.UIMain -application org.eclipse.ui.junit.runner -dev bin -data %LOCATION% -testPluginName org.eclipse.ui.tests -className org.eclipse.ui.tests.UiTestSuite -console  
-
-echo Running ui.api.SessionCreateTest
-rm -rf ui_session_sniff_folder
-./jre/bin/java -cp startup.jar org.eclipse.core.launcher.UIMain -application org.eclipse.ui.junit.runner -dev bin -data %LOCATION% -testPluginName org.eclipse.ui.tests -className org.eclipse.ui.tests.api.SessionCreateTest -console  
-
-echo Running ui.api.SessionRestoreTest
-./jre/bin/java -cp startup.jar org.eclipse.core.launcher.UIMain -application org.eclipse.ui.junit.runner -dev bin -data %LOCATION% -testPluginName org.eclipse.ui.tests -className org.eclipse.ui.tests.api.SessionRestoreTest -console 
diff --git a/tests/org.eclipse.ui.tests/uiSniff.bat b/tests/org.eclipse.ui.tests/uiSniff.bat
deleted file mode 100644
index d7d3f10..0000000
--- a/tests/org.eclipse.ui.tests/uiSniff.bat
+++ /dev/null
@@ -1,17 +0,0 @@
-@echo off
-rem This is the UI Sniff test batch file.  
-
-set CLASSPATH=startup.jar
-
-set LOCATION=ui_sniff_folder
-del /Q /S %LOCATION%
-echo Running UiTestSuite
-.\jre\bin\java -cp %CLASSPATH% org.eclipse.core.launcher.UIMain -application org.eclipse.ui.junit.runner -dev bin -data %LOCATION% -testPluginName org.eclipse.ui.tests -className org.eclipse.ui.tests.UiTestSuite -console
-
-set LOCATION=ui_session_sniff_folder
-del /Q /S %LOCATION%
-echo Running SessionCreateTest
-.\jre\bin\java -cp %CLASSPATH% org.eclipse.core.launcher.UIMain -application org.eclipse.ui.junit.runner -dev bin -data %LOCATION% -testPluginName org.eclipse.ui.tests -className org.eclipse.ui.tests.api.SessionCreateTest -console
-echo Running SessionRestoreTest
-.\jre\bin\java -cp %CLASSPATH% org.eclipse.core.launcher.UIMain -application org.eclipse.ui.junit.runner -dev bin -data %LOCATION% -testPluginName org.eclipse.ui.tests -className org.eclipse.ui.tests.api.SessionRestoreTest -console
-
